From f7d434c528364ff7ad65aeced231db7e28e1b1fd Mon Sep 17 00:00:00 2001 From: hanwckf Date: Mon, 17 Oct 2022 20:46:13 +0800 Subject: [PATCH] mt-drivers: remove conflict packages --- package/kernel/mt-drivers/mt7615d/Makefile | 219 - package/kernel/mt-drivers/mt7615d/config.in | 1041 - .../mt7615d/src/bin/mt7615/MT7615_cr4.bin | Bin 122644 -> 0 bytes .../src/bin/mt7615/WIFI_RAM_CODE_MT7615.bin | Bin 457992 -> 0 bytes .../src/bin/mt7615/ePAeLNA/MT7615_EEPROM.bin | Bin 1200 -> 0 bytes .../src/bin/mt7615/ePAiLNA/MT7615_EEPROM.bin | Bin 1200 -> 0 bytes .../src/bin/mt7615/iPAeLNA/MT7615_EEPROM.bin | Bin 1024 -> 0 bytes .../src/bin/mt7615/iPAiLNA/MT7615_EEPROM.bin | Bin 1024 -> 0 bytes .../src/bin/mt7615/mt7615_patch_e3_hdr.bin | Bin 11102 -> 0 bytes .../mt7615d/src/bin/mt7622/MT7622_EEPROM.bin | Bin 1024 -> 0 bytes .../bin/mt7622/WIFI_RAM_CODE_MT7622_E2.bin | Bin 300312 -> 0 bytes .../src/bin/mt7622/ePAeLNA/MT7622_EEPROM.bin | Bin 1024 -> 0 bytes .../src/bin/mt7622/iPAeLNA/MT7622_EEPROM.bin | Bin 1024 -> 0 bytes .../src/bin/mt7622/iPAiLNA/MT7622_EEPROM.bin | Bin 1024 -> 0 bytes .../src/bin/mt7622/mt7622_patch_e2_hdr.bin | Bin 82110 -> 0 bytes .../mt7615d/src/mt_wifi/ate/LoopBack.c | 821 - .../mt7615d/src/mt_wifi/ate/ate_agent.c | 6657 --- .../src/mt_wifi/ate/include/LoopBack.h | 96 - .../mt7615d/src/mt_wifi/ate/include/ate.h | 725 - .../src/mt_wifi/ate/include/ate_agent.h | 167 - .../src/mt_wifi/ate/include/meta_agent.h | 94 - .../src/mt_wifi/ate/include/mt_testmode.h | 234 - .../mt_wifi/ate/include/mt_testmode_dmac.h | 26 - .../mt_wifi/ate/include/mt_testmode_smac.h | 23 - .../src/mt_wifi/ate/include/qa_agent.h | 81 - .../src/mt_wifi/ate/include/testmode_common.h | 47 - .../src/mt_wifi/ate/include/testmode_ioctl.h | 531 - .../mt7615d/src/mt_wifi/ate/meta_agent.c | 2467 - .../mt7615d/src/mt_wifi/ate/mt_mac/mt_ate.c | 1499 - .../src/mt_wifi/ate/mt_mac/mt_testmode.c | 8558 ---- .../src/mt_wifi/ate/mt_mac/mt_testmode_dmac.c | 213 - .../src/mt_wifi/ate/mt_mac/mt_testmode_smac.c | 55 - .../mt7615d/src/mt_wifi/ate/qa_agent.c | 1741 - .../mt7615d/src/mt_wifi/ate/testmode_ioctl.c | 7408 --- .../mt7615d/src/mt_wifi/chips/mt7615.c | 3592 -- .../mt7615d/src/mt_wifi/chips/mt7615_dbg.c | 1481 - .../mt7615d/src/mt_wifi/chips/mt7622.c | 2429 - .../mt7615d/src/mt_wifi/chips/mt7622_dbg.c | 1672 - .../mt7615d/src/mt_wifi/chips/rtmp_chip.c | 252 - .../mt7615d/src/mt_wifi/embedded/Kconfig | 543 - .../mt7615d/src/mt_wifi/embedded/Makefile | 603 - .../src/mt_wifi/embedded/Pack_Release.sh | 92 - .../mt7615d/src/mt_wifi/embedded/Release.sh | 134 - .../src/mt_wifi/embedded/Release_Notes.txt | 97 - .../mt7615d/src/mt_wifi/embedded/ap/ap.c | 5362 --- .../src/mt_wifi/embedded/ap/ap_apcli.c | 7179 --- .../src/mt_wifi/embedded/ap/ap_apcli_inf.c | 181 - .../src/mt_wifi/embedded/ap/ap_assoc.c | 3674 -- .../mt7615d/src/mt_wifi/embedded/ap/ap_auth.c | 1611 - .../src/mt_wifi/embedded/ap/ap_autoChSel.c | 4506 -- .../mt_wifi/embedded/ap/ap_band_steering.c | 2999 -- .../mt7615d/src/mt_wifi/embedded/ap/ap_cfg.c | 23474 ---------- .../mt7615d/src/mt_wifi/embedded/ap/ap_data.c | 5371 --- .../mt7615d/src/mt_wifi/embedded/ap/ap_ftkd.c | 1607 - .../mt7615d/src/mt_wifi/embedded/ap/ap_ids.c | 512 - .../mt7615d/src/mt_wifi/embedded/ap/ap_mbss.c | 381 - .../src/mt_wifi/embedded/ap/ap_mbss_inf.c | 181 - .../mt7615d/src/mt_wifi/embedded/ap/ap_mlme.c | 861 - .../src/mt_wifi/embedded/ap/ap_mumimo.c | 4711 -- .../mt7615d/src/mt_wifi/embedded/ap/ap_mura.c | 2298 - .../mt7615d/src/mt_wifi/embedded/ap/ap_nps.c | 277 - .../src/mt_wifi/embedded/ap/ap_qload.c | 997 - .../src/mt_wifi/embedded/ap/ap_repeater.c | 1670 - .../src/mt_wifi/embedded/ap/ap_sanity.c | 29 - .../mt7615d/src/mt_wifi/embedded/ap/ap_sec.c | 953 - .../mt7615d/src/mt_wifi/embedded/ap/ap_sync.c | 3625 -- .../mt7615d/src/mt_wifi/embedded/ap/ap_vow.c | 4985 -- .../mt7615d/src/mt_wifi/embedded/ap/ap_wds.c | 2110 - .../src/mt_wifi/embedded/ap/ap_wds_inf.c | 108 - .../mt7615d/src/mt_wifi/embedded/ap/ap_wpa.c | 229 - .../src/mt_wifi/embedded/ap/apcli_assoc.c | 1897 - .../src/mt_wifi/embedded/ap/apcli_auth.c | 1139 - .../src/mt_wifi/embedded/ap/apcli_ctrl.c | 3071 -- .../mt_wifi/embedded/ap/apcli_link_cover.c | 136 - .../src/mt_wifi/embedded/ap/apcli_sync.c | 2389 - .../src/mt_wifi/embedded/common/a4_conn.c | 768 - .../src/mt_wifi/embedded/common/action.c | 1779 - .../src/mt_wifi/embedded/common/ba_action.c | 2282 - .../mt7615d/src/mt_wifi/embedded/common/bcn.c | 1928 - .../src/mt_wifi/embedded/common/bgnd_scan.c | 1731 - .../src/mt_wifi/embedded/common/client_wds.c | 322 - .../src/mt_wifi/embedded/common/cmm_cfg.c | 9427 ---- .../src/mt_wifi/embedded/common/cmm_cmd.c | 647 - .../src/mt_wifi/embedded/common/cmm_cs.c | 761 - .../src/mt_wifi/embedded/common/cmm_data.c | 9573 ---- .../src/mt_wifi/embedded/common/cmm_info.c | 16709 ------- .../embedded/common/cmm_info_element.c | 585 - .../src/mt_wifi/embedded/common/cmm_mac_pci.c | 2707 -- .../src/mt_wifi/embedded/common/cmm_mat.c | 452 - .../mt_wifi/embedded/common/cmm_mat_iparp.c | 836 - .../mt_wifi/embedded/common/cmm_mat_ipv6.c | 833 - .../mt_wifi/embedded/common/cmm_mat_pppoe.c | 1001 - .../src/mt_wifi/embedded/common/cmm_mumimo.c | 232 - .../src/mt_wifi/embedded/common/cmm_profile.c | 9986 ---- .../src/mt_wifi/embedded/common/cmm_radar.c | 1015 - .../src/mt_wifi/embedded/common/cmm_rdm_mt.c | 6210 --- .../src/mt_wifi/embedded/common/cmm_rf_cal.c | 2779 -- .../src/mt_wifi/embedded/common/cmm_rvr_dbg.c | 862 - .../src/mt_wifi/embedded/common/cmm_sanity.c | 2048 - .../src/mt_wifi/embedded/common/cmm_sync.c | 1392 - .../src/mt_wifi/embedded/common/cmm_tcprack.c | 1436 - .../src/mt_wifi/embedded/common/cmm_txbf.c | 1267 - .../src/mt_wifi/embedded/common/cmm_video.c | 147 - .../src/mt_wifi/embedded/common/cut_through.c | 983 - .../src/mt_wifi/embedded/common/ee_efuse.c | 1363 - .../src/mt_wifi/embedded/common/ee_flash.c | 522 - .../src/mt_wifi/embedded/common/ee_prom.c | 199 - .../src/mt_wifi/embedded/common/eeprom.c | 1719 - .../src/mt_wifi/embedded/common/fp_fair_qm.c | 415 - .../src/mt_wifi/embedded/common/fp_qm.c | 362 - .../src/mt_wifi/embedded/common/fpga.c | 31 - .../src/mt_wifi/embedded/common/fq_qm.c | 1917 - .../mt7615d/src/mt_wifi/embedded/common/ft.c | 3133 -- .../src/mt_wifi/embedded/common/ft_iocl.c | 1154 - .../src/mt_wifi/embedded/common/ft_rc.c | 330 - .../src/mt_wifi/embedded/common/ft_tlv.c | 149 - .../mt7615d/src/mt_wifi/embedded/common/ftm.c | 3708 -- .../mt7615d/src/mt_wifi/embedded/common/gas.c | 1421 - .../src/mt_wifi/embedded/common/hif_pci.c | 3179 -- .../src/mt_wifi/embedded/common/hotspot.c | 1088 - .../src/mt_wifi/embedded/common/icap.c | 97 - .../src/mt_wifi/embedded/common/igmp_snoop.c | 4366 -- .../mt7615d/src/mt_wifi/embedded/common/map.c | 907 - .../mt7615d/src/mt_wifi/embedded/common/mbo.c | 1188 - .../src/mt_wifi/embedded/common/misc_app.c | 174 - .../src/mt_wifi/embedded/common/mlme.c | 5974 --- .../src/mt_wifi/embedded/common/mt_io.c | 210 - .../src/mt_wifi/embedded/common/mt_ps.c | 180 - .../mt_wifi/embedded/common/multi_channel.c | 109 - .../mt_wifi/embedded/common/multi_profile.c | 2519 - .../src/mt_wifi/embedded/common/netif_block.c | 89 - .../mt7615d/src/mt_wifi/embedded/common/nfc.c | 22 - .../mt7615d/src/mt_wifi/embedded/common/oce.c | 1080 - .../src/mt_wifi/embedded/common/oce_fils.c | 878 - .../src/mt_wifi/embedded/common/op_class.c | 2080 - .../mt7615d/src/mt_wifi/embedded/common/ps.c | 235 - .../mt7615d/src/mt_wifi/embedded/common/qm.c | 2046 - .../mt_wifi/embedded/common/ra_ac_q_mgmt.c | 701 - .../src/mt_wifi/embedded/common/ral_ps.c | 226 - .../src/mt_wifi/embedded/common/routing_tab.c | 634 - .../mt7615d/src/mt_wifi/embedded/common/rrm.c | 2689 -- .../src/mt_wifi/embedded/common/rrm_sanity.c | 171 - .../src/mt_wifi/embedded/common/rrm_tlv.c | 1199 - .../src/mt_wifi/embedded/common/rt_channel.c | 2869 -- .../src/mt_wifi/embedded/common/rt_led.c | 585 - .../src/mt_wifi/embedded/common/rt_os_util.c | 265 - .../src/mt_wifi/embedded/common/rtmp_init.c | 2923 -- .../mt_wifi/embedded/common/rtmp_init_inf.c | 1005 - .../src/mt_wifi/embedded/common/rtmp_timer.c | 362 - .../src/mt_wifi/embedded/common/scan.c | 1204 - .../mt7615d/src/mt_wifi/embedded/common/scs.c | 752 - .../src/mt_wifi/embedded/common/smartant.c | 4281 -- .../mt_wifi/embedded/common/sniffer_prism.c | 243 - .../embedded/common/sniffer_radiotap.c | 1263 - .../src/mt_wifi/embedded/common/spectrum.c | 2883 -- .../src/mt_wifi/embedded/common/sys_log.c | 271 - .../src/mt_wifi/embedded/common/txpower.c | 722 - .../mt7615d/src/mt_wifi/embedded/common/txs.c | 631 - .../src/mt_wifi/embedded/common/uapsd.c | 2209 - .../src/mt_wifi/embedded/common/vendor.c | 714 - .../src/mt_wifi/embedded/common/verf.c | 27 - .../mt7615d/src/mt_wifi/embedded/common/vht.c | 1467 - .../src/mt_wifi/embedded/common/wdev.c | 963 - .../mt_wifi/embedded/common/wifi_sys_info.c | 1265 - .../mt_wifi/embedded/common/wifi_sys_notify.c | 113 - .../mt7615d/src/mt_wifi/embedded/common/wnm.c | 3918 -- .../mt7615d/src/mt_wifi/embedded/common/wsc.c | 12251 ----- .../src/mt_wifi/embedded/common/wsc_tlv.c | 4683 -- .../src/mt_wifi/embedded/common/wsc_ufd.c | 581 - .../src/mt_wifi/embedded/common/wsc_v2.c | 393 - .../mt7615d/src/mt_wifi/embedded/doc/Doxyfile | 2331 - .../mt_wifi/embedded/doc/FirmwareHistory.txt | 53 - .../src/mt_wifi/embedded/doc/History.txt | 325 - .../mt_wifi/embedded/doc/History_sta_pci.txt | 255 - .../mt_wifi/embedded/doc/History_sta_usb.txt | 258 - .../mt7615d/src/mt_wifi/embedded/doc/README | 68 - .../src/mt_wifi/embedded/doc/README_STA_pci | 528 - .../src/mt_wifi/embedded/doc/README_STA_usb | 534 - .../mt_wifi/embedded/doc/RT2860card.readme | 84 - .../RT_WIFI_Revision_History_2010_April.xls | Bin 123904 -> 0 bytes .../src/mt_wifi/embedded/doc/VxWorks.README | 4 - .../mt_wifi/embedded/doc/ate_iwpriv_usage.txt | 438 - .../src/mt_wifi/embedded/doc/brftph_usage.txt | 68 - .../embedded/doc/header_translation.txt | 84 - .../src/mt_wifi/embedded/doc/iwpriv_usage.txt | 447 - .../src/mt_wifi/embedded/doc/mainpage.dox | 8 - .../src/mt_wifi/embedded/doc/mbss_phy.readme | 65 - .../embedded/doc/sta_ate_iwpriv_usage.txt | 439 - .../mt_wifi/embedded/doc/wps_iwpriv_usage.txt | 173 - .../embedded/hw_ctrl/hdev/hdev_basic.c | 289 - .../mt_wifi/embedded/hw_ctrl/hdev/omac_ctrl.c | 273 - .../embedded/hw_ctrl/hdev/radio_ctrl.c | 1107 - .../mt_wifi/embedded/hw_ctrl/hdev/wmm_ctrl.c | 322 - .../mt_wifi/embedded/hw_ctrl/hdev/wtbl_ctrl.c | 355 - .../src/mt_wifi/embedded/hw_ctrl/hdev_ctrl.c | 1789 - .../src/mt_wifi/embedded/hw_ctrl/hw_ctrl.c | 1644 - .../mt_wifi/embedded/hw_ctrl/hw_ctrl_basic.c | 661 - .../mt_wifi/embedded/hw_ctrl/hw_ctrl_cmd.c | 840 - .../mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v1.c | 289 - .../mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v2.c | 265 - .../src/mt_wifi/embedded/include/a4_conn.h | 95 - .../src/mt_wifi/embedded/include/action.h | 66 - .../src/mt_wifi/embedded/include/ags.h | 95 - .../mt7615d/src/mt_wifi/embedded/include/ap.h | 419 - .../src/mt_wifi/embedded/include/ap_apcli.h | 282 - .../mt_wifi/embedded/include/ap_autoChSel.h | 146 - .../embedded/include/ap_autoChSel_cmm.h | 177 - .../src/mt_wifi/embedded/include/ap_cfg.h | 304 - .../src/mt_wifi/embedded/include/ap_ids.h | 52 - .../src/mt_wifi/embedded/include/ap_mbss.h | 71 - .../src/mt_wifi/embedded/include/ap_mumimo.h | 809 - .../src/mt_wifi/embedded/include/ap_mura.h | 492 - .../mt_wifi/embedded/include/ap_repeater.h | 126 - .../src/mt_wifi/embedded/include/ap_vow.h | 584 - .../src/mt_wifi/embedded/include/ap_wds.h | 128 - .../mt_wifi/embedded/include/arris_mod_api.h | 75 - .../embedded/include/arris_wps_gpio_handler.h | 45 - .../mt_wifi/embedded/include/band_steering.h | 114 - .../embedded/include/band_steering_def.h | 376 - .../src/mt_wifi/embedded/include/bcn.h | 104 - .../src/mt_wifi/embedded/include/bgnd_scan.h | 62 - .../mt_wifi/embedded/include/bgnd_scan_cmm.h | 204 - .../src/mt_wifi/embedded/include/br_ftph.h | 79 - .../src/mt_wifi/embedded/include/cfg80211.h | 92 - .../mt_wifi/embedded/include/cfg80211_cmm.h | 175 - .../mt_wifi/embedded/include/cfg80211extr.h | 393 - .../src/mt_wifi/embedded/include/chlist.h | 139 - .../src/mt_wifi/embedded/include/client_wds.h | 54 - .../mt_wifi/embedded/include/client_wds_cmm.h | 49 - .../src/mt_wifi/embedded/include/cmm_cmd.h | 173 - .../mt_wifi/embedded/include/cmm_rvr_dbg.h | 76 - .../mt_wifi/embedded/include/cmm_tcprack.h | 204 - .../mt7615d/src/mt_wifi/embedded/include/cs.h | 101 - .../mt_wifi/embedded/include/cut_through.h | 218 - .../src/mt_wifi/embedded/include/dot11_base.h | 161 - .../mt_wifi/embedded/include/dot11ac_vht.h | 660 - .../src/mt_wifi/embedded/include/dot11k_rrm.h | 361 - .../src/mt_wifi/embedded/include/dot11n_ht.h | 347 - .../src/mt_wifi/embedded/include/dot11r_ft.h | 323 - .../embedded/include/dot11u_interworking.h | 114 - .../src/mt_wifi/embedded/include/dot11v_wnm.h | 103 - .../src/mt_wifi/embedded/include/eeprom.h | 839 - .../include/eeprom/mt7615_e2p_ePAeLNA.h | 105 - .../include/eeprom/mt7615_e2p_ePAiLNA.h | 105 - .../include/eeprom/mt7615_e2p_iPAeLNA.h | 91 - .../include/eeprom/mt7615_e2p_iPAiLNA.h | 91 - .../include/eeprom/mt7622_e2p_ePAeLNA.h | 91 - .../include/eeprom/mt7622_e2p_iPAeLNA.h | 91 - .../include/eeprom/mt7622_e2p_iPAiLNA.h | 91 - .../embedded/include/eeprom/mt_dmac_e2p_def.h | 61 - .../embedded/include/eeprom/mt_e2p_def.h | 426 - .../src/mt_wifi/embedded/include/efuse.h | 82 - .../mt_wifi/embedded/include/event_common.h | 169 - .../src/mt_wifi/embedded/include/firmware.h | 688 - .../src/mt_wifi/embedded/include/fp_qm.h | 30 - .../src/mt_wifi/embedded/include/fq_qm.h | 152 - .../src/mt_wifi/embedded/include/frame_hdr.h | 82 - .../src/mt_wifi/embedded/include/frq_cal.h | 71 - .../mt_wifi/embedded/include/fsm/fsm_sync.h | 42 - .../mt7615d/src/mt_wifi/embedded/include/ft.h | 1132 - .../src/mt_wifi/embedded/include/ft_cmm.h | 244 - .../src/mt_wifi/embedded/include/ftm.h | 170 - .../src/mt_wifi/embedded/include/ftm_cmm.h | 558 - .../src/mt_wifi/embedded/include/gas.h | 213 - .../src/mt_wifi/embedded/include/hdev/hdev.h | 107 - .../embedded/include/hdev/hdev_basic.h | 168 - .../src/mt_wifi/embedded/include/hdev_ctrl.h | 196 - .../src/mt_wifi/embedded/include/hotspot.h | 213 - .../src/mt_wifi/embedded/include/hw_ctrl.h | 718 - .../mt_wifi/embedded/include/hw_ctrl_basic.h | 19 - .../src/mt_wifi/embedded/include/icap.h | 288 - .../mt_wifi/embedded/include/iface/iface.h | 12 - .../embedded/include/iface/iface_util.h | 46 - .../mt_wifi/embedded/include/iface/mtk_hif.h | 72 - .../embedded/include/iface/rtmp_inf_pcirbs.h | 133 - .../mt_wifi/embedded/include/iface/rtmp_pci.h | 97 - .../mt_wifi/embedded/include/iface/rtmp_rbs.h | 108 - .../src/mt_wifi/embedded/include/igmp_snoop.h | 211 - .../src/mt_wifi/embedded/include/ipv6.h | 180 - .../src/mt_wifi/embedded/include/l1profile.h | 84 - .../src/mt_wifi/embedded/include/map.h | 219 - .../src/mt_wifi/embedded/include/mat.h | 221 - .../src/mt_wifi/embedded/include/mbo.h | 281 - .../mt_wifi/embedded/include/mcu/andes_core.h | 220 - .../mt_wifi/embedded/include/mcu/andes_mt.h | 270 - .../src/mt_wifi/embedded/include/mcu/btcoex.h | 220 - .../src/mt_wifi/embedded/include/mcu/mcu.h | 69 - .../include/mcu/mt7615_cr4_firmware.h | 10226 ----- .../embedded/include/mcu/mt7615_firmware.h | 38171 ---------------- .../embedded/include/mcu/mt7615_rom_patch.h | 931 - .../embedded/include/mcu/mt7622_firmware_e2.h | 25031 ---------- .../include/mcu/mt7622_rom_patch_e2.h | 6848 --- .../mt_wifi/embedded/include/meminfo_list.h | 284 - .../mt_wifi/embedded/include/mgmt/be_export.h | 304 - .../embedded/include/mgmt/be_internal.h | 98 - .../src/mt_wifi/embedded/include/misc_app.h | 106 - .../src/mt_wifi/embedded/include/mlme.h | 1819 - .../src/mt_wifi/embedded/include/mlme_sys.h | 5 - .../src/mt_wifi/embedded/include/mt_io.h | 25 - .../src/mt_wifi/embedded/include/mt_rdm.h | 815 - .../mt_wifi/embedded/include/netif_block.h | 23 - .../src/mt_wifi/embedded/include/nfc.h | 31 - .../src/mt_wifi/embedded/include/oce.h | 275 - .../src/mt_wifi/embedded/include/oid.h | 2528 - .../src/mt_wifi/embedded/include/oid_struct.h | 161 - .../mt7615d/src/mt_wifi/embedded/include/qm.h | 235 - .../mt_wifi/embedded/include/ra_ac_q_mgmt.h | 182 - .../src/mt_wifi/embedded/include/radar.h | 182 - .../mt_wifi/embedded/include/routing_tab.h | 123 - .../src/mt_wifi/embedded/include/rrm.h | 476 - .../src/mt_wifi/embedded/include/rrm_cmm.h | 198 - .../src/mt_wifi/embedded/include/rt_cal.h | 66 - .../src/mt_wifi/embedded/include/rt_config.h | 380 - .../src/mt_wifi/embedded/include/rt_led.h | 245 - .../src/mt_wifi/embedded/include/rt_os_net.h | 819 - .../src/mt_wifi/embedded/include/rt_os_util.h | 668 - .../src/mt_wifi/embedded/include/rt_txbf.h | 223 - .../src/mt_wifi/embedded/include/rt_udma.h | 24 - .../src/mt_wifi/embedded/include/rtmp.h | 11443 ----- .../src/mt_wifi/embedded/include/rtmp_chip.h | 525 - .../src/mt_wifi/embedded/include/rtmp_cmd.h | 885 - .../src/mt_wifi/embedded/include/rtmp_comm.h | 429 - .../src/mt_wifi/embedded/include/rtmp_def.h | 2491 - .../src/mt_wifi/embedded/include/rtmp_dmacb.h | 35 - .../src/mt_wifi/embedded/include/rtmp_dot11.h | 105 - .../src/mt_wifi/embedded/include/rtmp_iface.h | 59 - .../src/mt_wifi/embedded/include/rtmp_os.h | 143 - .../src/mt_wifi/embedded/include/rtmp_osabl.h | 66 - .../src/mt_wifi/embedded/include/rtmp_timer.h | 260 - .../src/mt_wifi/embedded/include/rtmp_type.h | 214 - .../src/mt_wifi/embedded/include/scs.h | 140 - .../mt_wifi/embedded/include/security/bn.h | 626 - .../embedded/include/security/crypt_aes.h | 124 - .../embedded/include/security/crypt_arc4.h | 58 - .../include/security/crypt_biginteger.h | 307 - .../embedded/include/security/crypt_bignum.h | 139 - .../embedded/include/security/crypt_dh.h | 64 - .../embedded/include/security/crypt_hmac.h | 75 - .../embedded/include/security/crypt_md5.h | 64 - .../embedded/include/security/crypt_sha2.h | 115 - .../embedded/include/security/dh_key.h | 22 - .../embedded/include/security/dot11i_wpa.h | 317 - .../embedded/include/security/dot11w_pmf.h | 104 - .../mt_wifi/embedded/include/security/ecc.h | 123 - .../embedded/include/security/owe_cmm.h | 76 - .../mt_wifi/embedded/include/security/pmf.h | 81 - .../embedded/include/security/pmf_cmm.h | 92 - .../mt_wifi/embedded/include/security/sae.h | 224 - .../embedded/include/security/sae_cmm.h | 711 - .../mt_wifi/embedded/include/security/sec.h | 168 - .../embedded/include/security/sec_cmm.h | 545 - .../mt_wifi/embedded/include/security/wpa.h | 486 - .../embedded/include/security/wpa_cmm.h | 246 - .../src/mt_wifi/embedded/include/smartant.h | 90 - .../embedded/include/sniffer/radiotap.h | 311 - .../embedded/include/sniffer/sniffer.h | 343 - .../src/mt_wifi/embedded/include/spectrum.h | 194 - .../mt_wifi/embedded/include/spectrum_def.h | 242 - .../src/mt_wifi/embedded/include/sta.h | 151 - .../src/mt_wifi/embedded/include/sta_cfg.h | 58 - .../mt7615d/src/mt_wifi/embedded/include/tm.h | 53 - .../mt7615d/src/mt_wifi/embedded/include/tr.h | 143 - .../src/mt_wifi/embedded/include/tx_power.h | 66 - .../src/mt_wifi/embedded/include/uapsd.h | 693 - .../src/mt_wifi/embedded/include/vendor.h | 143 - .../src/mt_wifi/embedded/include/vht.h | 78 - .../src/mt_wifi/embedded/include/video.h | 11 - .../src/mt_wifi/embedded/include/vr_ikans.h | 54 - .../src/mt_wifi/embedded/include/vrut_ubm.h | 41 - .../src/mt_wifi/embedded/include/wapp/wapp.h | 159 - .../embedded/include/wapp/wapp_cmm_type.h | 900 - .../src/mt_wifi/embedded/include/wfa_p2p.h | 168 - .../embedded/include/wifi_sys_notify.h | 38 - .../include/wlan_config/config_export.h | 152 - .../include/wlan_config/config_internal.h | 49 - .../src/mt_wifi/embedded/include/wnm.h | 385 - .../src/mt_wifi/embedded/include/wnm_cmm.h | 26 - .../src/mt_wifi/embedded/include/wsc.h | 924 - .../src/mt_wifi/embedded/include/wsc_tlv.h | 286 - .../src/mt_wifi/embedded/mcu/andes_core.c | 946 - .../src/mt_wifi/embedded/mcu/andes_mt.c | 5102 --- .../mt7615d/src/mt_wifi/embedded/mcu/mcu.c | 150 - .../src/mt_wifi/embedded/mgmt/be_basic.c | 197 - .../mt7615d/src/mt_wifi/embedded/mgmt/be_ht.c | 575 - .../src/mt_wifi/embedded/mgmt/be_phy.c | 499 - .../src/mt_wifi/embedded/mgmt/be_vht.c | 112 - .../src/mt_wifi/embedded/mgmt/bss_ops.c | 1393 - .../src/mt_wifi/embedded/mgmt/mgmt_dev.c | 122 - .../src/mt_wifi/embedded/mgmt/mgmt_entrytb.c | 1961 - .../src/mt_wifi/embedded/mgmt/mgmt_ht.c | 1157 - .../src/mt_wifi/embedded/mgmt/mgmt_hw.c | 27 - .../src/mt_wifi/embedded/mgmt/mgmt_vht.c | 101 - .../src/mt_wifi/embedded/plug_in/Makefile | 15 - .../mt_wifi/embedded/plug_in/whnat/Makefile | 26 - .../src/mt_wifi/embedded/plug_in/whnat/wdma.c | 311 - .../src/mt_wifi/embedded/plug_in/whnat/wdma.h | 224 - .../src/mt_wifi/embedded/plug_in/whnat/wed.c | 1124 - .../src/mt_wifi/embedded/plug_in/whnat/wed.h | 237 - .../mt_wifi/embedded/plug_in/whnat/wed_def.h | 499 - .../src/mt_wifi/embedded/plug_in/whnat/woe.h | 82 - .../embedded/plug_in/whnat/woe_basic.c | 128 - .../embedded/plug_in/whnat/woe_basic.h | 184 - .../mt_wifi/embedded/plug_in/whnat/woe_hif.c | 144 - .../mt_wifi/embedded/plug_in/whnat/woe_hif.h | 91 - .../mt_wifi/embedded/plug_in/whnat/woe_hw.c | 1535 - .../mt_wifi/embedded/plug_in/whnat/woe_hw.h | 77 - .../mt_wifi/embedded/plug_in/whnat/woe_main.c | 900 - .../embedded/plug_in/whnat/woe_mt7615.c | 432 - .../embedded/plug_in/whnat/woe_mt7615.h | 81 - .../mt_wifi/embedded/plug_in/whnat/woe_proc.c | 818 - .../mt_wifi/embedded/plug_in/whnat/woe_ser.c | 337 - .../mt_wifi/embedded/plug_in/whnat/woe_wifi.h | 64 - .../src/mt_wifi/embedded/security/bn_lib.c | 7007 --- .../src/mt_wifi/embedded/security/cmm_aes.c | 975 - .../src/mt_wifi/embedded/security/cmm_sec.c | 2618 -- .../src/mt_wifi/embedded/security/cmm_tkip.c | 812 - .../src/mt_wifi/embedded/security/cmm_wep.c | 309 - .../src/mt_wifi/embedded/security/cmm_wpa.c | 7155 --- .../src/mt_wifi/embedded/security/crypt_aes.c | 1891 - .../mt_wifi/embedded/security/crypt_arc4.c | 125 - .../embedded/security/crypt_biginteger.c | 3496 -- .../mt_wifi/embedded/security/crypt_bignum.c | 467 - .../src/mt_wifi/embedded/security/crypt_dh.c | 235 - .../mt_wifi/embedded/security/crypt_hmac.c | 520 - .../src/mt_wifi/embedded/security/crypt_md5.c | 337 - .../mt_wifi/embedded/security/crypt_sha2.c | 830 - .../src/mt_wifi/embedded/security/dh_key.c | 5047 -- .../src/mt_wifi/embedded/security/ecc.c | 1164 - .../src/mt_wifi/embedded/security/owe.c | 607 - .../src/mt_wifi/embedded/security/pmf.c | 1666 - .../src/mt_wifi/embedded/security/sae.c | 3504 -- .../src/mt_wifi/embedded/tools/Makefile | 4 - .../embedded/tools/auto_build_kernel_4_4.sh | 153 - .../src/mt_wifi/embedded/tools/bin2h.c | 493 - .../embedded/tools/build-check-jedi.sh | 55 - .../embedded/tools/check_build_script.sh | 53 - .../mt7615d/src/mt_wifi/embedded/tools/i.sh | 18 - .../mt_wifi/embedded/tools/mt7662_freq_plan.c | 134 - .../src/mt_wifi/embedded/tools/mt7662e_ap.sh | 4 - .../src/mt_wifi/embedded/tools/mt7662e_sta.sh | 4 - .../mt7615d/src/mt_wifi/embedded/tools/r.sh | 2 - .../mt7615d/src/mt_wifi/embedded/unload | 3 - .../mt7615d/src/mt_wifi/embedded/wapp/wapp.c | 2869 -- .../embedded/wlan_config/config_basic.c | 274 - .../mt_wifi/embedded/wlan_config/config_ht.c | 367 - .../mt_wifi/embedded/wlan_config/config_phy.c | 165 - .../mt_wifi/embedded/wlan_config/config_vht.c | 147 - .../mt7615d/src/mt_wifi/hw_ctrl/cmm_asic.c | 2945 -- .../mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt.c | 6178 --- .../src/mt_wifi/hw_ctrl/cmm_asic_mt_dmac.c | 3901 -- .../src/mt_wifi/hw_ctrl/cmm_asic_mt_fw.c | 1459 - .../mt7615d/src/mt_wifi/hw_ctrl/cmm_chip.c | 329 - .../mt7615d/src/mt_wifi/hw_ctrl/cmm_chip_mt.c | 823 - .../mt7615d/src/mt_wifi/hw_ctrl/coex.c | 25 - .../mt7615d/src/mt_wifi/hw_ctrl/greenap.c | 708 - .../mt7615d/src/mt_wifi/hw_ctrl/hw_init.c | 429 - .../mt7615d/src/mt_wifi/hw_ctrl/mt_gpio.c | 354 - .../src/mt_wifi/include/chip/chip_id.h | 90 - .../mt7615d/src/mt_wifi/include/chip/mt7615.h | 134 - .../src/mt_wifi/include/chip/mt7615_cr.h | 121 - .../mt7615d/src/mt_wifi/include/chip/mt7622.h | 356 - .../src/mt_wifi/include/chip/mt7622_cr.h | 106 - .../src/mt_wifi/include/chip/mt7663_cr.h | 85 - .../mt7615d/src/mt_wifi/include/chip/p18_cr.h | 85 - .../src/mt_wifi/include/common/debug.h | 165 - .../src/mt_wifi/include/common/link_list.h | 177 - .../src/mt_wifi/include/common/module.h | 140 - .../src/mt_wifi/include/common/mt_os_util.h | 91 - .../mt_wifi/include/common/wifi_sys_info.h | 266 - .../src/mt_wifi/include/eeprom/mt_tx_pwr.h | 233 - .../mt7615d/src/mt_wifi/include/hif/hif.h | 56 - .../src/mt_wifi/include/hif/mt_hif_pci.h | 1023 - .../src/mt_wifi/include/hw_ctrl/cmm_asic.h | 689 - .../src/mt_wifi/include/hw_ctrl/cmm_asic_mt.h | 691 - .../mt_wifi/include/hw_ctrl/cmm_asic_mt_fw.h | 124 - .../src/mt_wifi/include/hw_ctrl/cmm_chip.h | 1140 - .../src/mt_wifi/include/hw_ctrl/hw_init.h | 63 - .../src/mt_wifi/include/hwnat/ra_nat.h | 586 - .../mt7615d/src/mt_wifi/include/mac/mac.h | 253 - .../mt_wifi/include/mac/mac_mt/dmac/client.h | 32 - .../mt_wifi/include/mac/mac_mt/dmac/dma_sch.h | 181 - .../mt_wifi/include/mac/mac_mt/dmac/gpio.h | 127 - .../include/mac/mac_mt/dmac/hw_amsdu.h | 72 - .../mt_wifi/include/mac/mac_mt/dmac/mt_dmac.h | 2146 - .../src/mt_wifi/include/mac/mac_mt/dmac/pse.h | 259 - .../mt_wifi/include/mac/mac_mt/dmac/wf_agg.h | 339 - .../mt_wifi/include/mac/mac_mt/dmac/wf_aon.h | 34 - .../mt_wifi/include/mac/mac_mt/dmac/wf_arb.h | 143 - .../mt_wifi/include/mac/mac_mt/dmac/wf_cfg.h | 95 - .../include/mac/mac_mt/dmac/wf_cfgoff.h | 34 - .../mt_wifi/include/mac/mac_mt/dmac/wf_dma.h | 130 - .../mt_wifi/include/mac/mac_mt/dmac/wf_etbf.h | 34 - .../mac/mac_mt/dmac/wf_int_wakeup_top.h | 81 - .../include/mac/mac_mt/dmac/wf_lpon_top.h | 187 - .../mt_wifi/include/mac/mac_mt/dmac/wf_mib.h | 138 - .../mt_wifi/include/mac/mac_mt/dmac/wf_mu.h | 107 - .../mt_wifi/include/mac/mac_mt/dmac/wf_pf.h | 33 - .../mt_wifi/include/mac/mac_mt/dmac/wf_phy.h | 130 - .../mt_wifi/include/mac/mac_mt/dmac/wf_ple.h | 216 - .../mt_wifi/include/mac/mac_mt/dmac/wf_pp.h | 57 - .../mt_wifi/include/mac/mac_mt/dmac/wf_rmac.h | 289 - .../mt_wifi/include/mac/mac_mt/dmac/wf_sec.h | 35 - .../mt_wifi/include/mac/mac_mt/dmac/wf_tmac.h | 276 - .../mt_wifi/include/mac/mac_mt/dmac/wf_trb.h | 48 - .../mt_wifi/include/mac/mac_mt/dmac/wf_wtbl.h | 618 - .../include/mac/mac_mt/dmac/wf_wtbloff.h | 59 - .../include/mac/mac_mt/dmac/wf_wtblon.h | 61 - .../src/mt_wifi/include/mac/mac_mt/mt_mac.h | 99 - .../mt_wifi/include/mac/mac_mt/mt_mac_ctrl.h | 150 - .../mt_wifi/include/mac/mac_mt/mt_mac_pci.h | 103 - .../mt_wifi/include/mac/mac_mt/smac/client.h | 32 - .../mt_wifi/include/mac/mac_mt/smac/dma_sch.h | 447 - .../mt_wifi/include/mac/mac_mt/smac/gpio.h | 127 - .../mt_wifi/include/mac/mac_mt/smac/mt_mac.h | 2017 - .../mt_wifi/include/mac/mac_mt/smac/mt_smac.h | 1966 - .../src/mt_wifi/include/mac/mac_mt/smac/pse.h | 237 - .../mt_wifi/include/mac/mac_mt/smac/wf_agg.h | 258 - .../mt_wifi/include/mac/mac_mt/smac/wf_aon.h | 34 - .../mt_wifi/include/mac/mac_mt/smac/wf_arb.h | 121 - .../include/mac/mac_mt/smac/wf_cfgoff.h | 34 - .../mt_wifi/include/mac/mac_mt/smac/wf_dma.h | 193 - .../mac/mac_mt/smac/wf_int_wakeup_top.h | 79 - .../include/mac/mac_mt/smac/wf_lpon_top.h | 190 - .../mt_wifi/include/mac/mac_mt/smac/wf_mib.h | 70 - .../mt_wifi/include/mac/mac_mt/smac/wf_pf.h | 34 - .../mt_wifi/include/mac/mac_mt/smac/wf_phy.h | 159 - .../mt_wifi/include/mac/mac_mt/smac/wf_rmac.h | 216 - .../mt_wifi/include/mac/mac_mt/smac/wf_sec.h | 35 - .../mt_wifi/include/mac/mac_mt/smac/wf_tmac.h | 237 - .../mt_wifi/include/mac/mac_mt/smac/wf_trb.h | 37 - .../mt_wifi/include/mac/mac_mt/smac/wf_wtbl.h | 556 - .../include/mac/mac_mt/smac/wf_wtbloff.h | 51 - .../include/mac/mac_mt/smac/wf_wtblon.h | 292 - .../src/mt_wifi/include/mac/mac_mt/top.h | 63 - .../mt7615d/src/mt_wifi/include/mcu/fwdl.h | 205 - .../mt7615d/src/mt_wifi/include/mcu/mt_cmd.h | 6618 --- .../mt7615d/src/mt_wifi/include/mcu/mt_fdb.h | 349 - .../mt7615d/src/mt_wifi/include/os/bb_soc.h | 50 - .../mt7615d/src/mt_wifi/include/os/diag.h | 73 - .../mt7615d/src/mt_wifi/include/os/pkt_meta.h | 417 - .../mt7615d/src/mt_wifi/include/os/rt_drv.h | 770 - .../src/mt_wifi/include/os/rt_ecos_type.h | 72 - .../mt7615d/src/mt_wifi/include/os/rt_linux.h | 1883 - .../src/mt_wifi/include/os/rt_linux_cmm.h | 430 - .../mt_wifi/include/os/rt_linux_txrx_hook.h | 50 - .../mt7615d/src/mt_wifi/include/os/rt_os.h | 106 - .../mt7615d/src/mt_wifi/include/os/rt_win.h | 320 - .../mt7615d/src/mt_wifi/include/os/rt_wince.h | 80 - .../mt7615d/src/mt_wifi/include/os/trace.h | 1108 - .../src/mt_wifi/include/os/wbsys_res.h | 76 - .../mt7615d/src/mt_wifi/include/phy/mt_bbp.h | 24 - .../mt7615d/src/mt_wifi/include/phy/mt_phy.h | 1 - .../mt7615d/src/mt_wifi/include/phy/mt_rf.h | 23 - .../mt7615d/src/mt_wifi/include/phy/phy.h | 268 - .../src/mt_wifi/include/phy/rlm_cal_cache.h | 222 - .../src/mt_wifi/include/phy/wf_phy_back.h | 178 - .../src/mt_wifi/include/protocol/protection.h | 75 - .../src/mt_wifi/include/protocol/tmr.h | 55 - .../src/mt_wifi/include/rate_ctrl/ra_ctrl.h | 1387 - .../src/mt_wifi/include/txbf/mt_txbf.h | 933 - .../src/mt_wifi/include/txbf/mt_txbf_cal.h | 351 - .../mt_wifi/include/txpwr/BFBackoffTable_1.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_10.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_11.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_12.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_13.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_14.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_15.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_16.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_17.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_18.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_19.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_2.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_20.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_3.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_4.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_5.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_6.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_7.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_8.h | 75 - .../mt_wifi/include/txpwr/BFBackoffTable_9.h | 75 - .../src/mt_wifi/include/txpwr/SKUTable_1.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_10.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_11.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_12.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_13.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_14.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_15.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_16.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_17.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_18.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_19.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_2.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_20.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_3.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_4.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_5.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_6.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_7.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_8.h | 70 - .../src/mt_wifi/include/txpwr/SKUTable_9.h | 70 - .../src/mt_wifi/include/txpwr/single_sku.h | 291 - .../mt7615d/src/mt_wifi/license/MTK_LICENSE | 42 - .../mt7615d/src/mt_wifi/license/NOTICE | 124 - .../mt7615d/src/mt_wifi/mac/mt_dmac.c | 3641 -- .../mt7615d/src/mt_wifi/mac/mt_mac.c | 2903 -- .../mt7615d/src/mt_wifi/mcu/fw_cmd.c | 3923 -- .../mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl.c | 60 - .../mt7615d/src/mt_wifi/mcu/fwdl_mt.c | 1236 - .../mt7615d/src/mt_wifi/mcu/mt_cmd.c | 12996 ------ .../mt7615d/src/mt_wifi/mcu/mt_fdb.c | 800 - .../src/mt_wifi/os/linux/Kconfig.ap.soc | 161 - .../src/mt_wifi/os/linux/Kconfig.mt_wifi | 543 - .../src/mt_wifi/os/linux/Kconfig.mt_wifi_3_18 | 685 - .../src/mt_wifi/os/linux/Kconfig.mt_wifi_4_4 | 529 - .../src/mt_wifi/os/linux/Kconfig.mt_wifi_ap | 384 - .../src/mt_wifi/os/linux/Kconfig.mt_wifi_sta | 75 - .../src/mt_wifi/os/linux/Kconfig.rlt_wifi | 216 - .../src/mt_wifi/os/linux/Kconfig.rlt_wifi_ap | 84 - .../src/mt_wifi/os/linux/Kconfig.rlt_wifi_sta | 19 - .../src/mt_wifi/os/linux/Kconfig.sta.soc | 91 - .../mt7615d/src/mt_wifi/os/linux/Kconfig.wifi | 416 - .../os/linux/Makefile-3.10.14.mt_wifi_ap | 1380 - .../mt7615d/src/mt_wifi/os/linux/Makefile.4 | 470 - .../src/mt_wifi/os/linux/Makefile.4.netif | 118 - .../src/mt_wifi/os/linux/Makefile.4.util | 96 - .../mt7615d/src/mt_wifi/os/linux/Makefile.6 | 807 - .../src/mt_wifi/os/linux/Makefile.6.netif | 114 - .../src/mt_wifi/os/linux/Makefile.6.util | 108 - .../src/mt_wifi/os/linux/Makefile.ap.soc | 390 - .../src/mt_wifi/os/linux/Makefile.ap.usb | 346 - .../src/mt_wifi/os/linux/Makefile.clean | 90 - .../os/linux/Makefile.libautoprovision.6 | 9 - .../src/mt_wifi/os/linux/Makefile.mt_wifi_ap | 1512 - .../src/mt_wifi/os/linux/Makefile.mt_wifi_sta | 790 - .../src/mt_wifi/os/linux/Makefile.rlt_wifi_ap | 648 - .../os/linux/Makefile.rlt_wifi_ap.7637e | 667 - .../mt_wifi/os/linux/Makefile.rlt_wifi_sta | 510 - .../src/mt_wifi/os/linux/Makefile.sta.soc | 275 - .../src/mt_wifi/os/linux/android_priv_cmd.c | 119 - .../mt7615d/src/mt_wifi/os/linux/ap_ioctl.c | 519 - .../mt7615d/src/mt_wifi/os/linux/bb_soc.c | 200 - .../mt7615d/src/mt_wifi/os/linux/br_ftph.c | 182 - .../src/mt_wifi/os/linux/cfg80211/cfg80211.c | 2875 -- .../mt_wifi/os/linux/cfg80211/cfg80211_ap.c | 2056 - .../os/linux/cfg80211/cfg80211_apcli.c | 571 - .../mt_wifi/os/linux/cfg80211/cfg80211_inf.c | 828 - .../mt_wifi/os/linux/cfg80211/cfg80211_p2p.c | 24 - .../mt_wifi/os/linux/cfg80211/cfg80211_rx.c | 1105 - .../mt_wifi/os/linux/cfg80211/cfg80211_scan.c | 482 - .../mt_wifi/os/linux/cfg80211/cfg80211_tdls.c | 2802 -- .../mt_wifi/os/linux/cfg80211/cfg80211_tx.c | 3305 -- .../mt_wifi/os/linux/cfg80211/cfg80211_util.c | 1414 - .../mt_wifi/os/linux/cfg80211/cfg80211drv.c | 1585 - .../mt7615d/src/mt_wifi/os/linux/config.mk | 1520 - .../src/mt_wifi/os/linux/config.mk.cfg80211 | 2492 - .../mt7615d/src/mt_wifi/os/linux/diag.c | 1580 - .../mt7615d/src/mt_wifi/os/linux/inf_ppa.c | 54 - .../mt7615d/src/mt_wifi/os/linux/mt_fwdump.c | 160 - .../src/mt_wifi/os/linux/mt_wifi_mtd.c | 107 - .../src/mt_wifi/os/linux/multi_main_dev.c | 171 - .../src/mt_wifi/os/linux/pci_main_dev.c | 596 - .../src/mt_wifi/os/linux/rbus_main_dev.c | 218 - .../src/mt_wifi/os/linux/rbus_prop_dev.c | 281 - .../mt7615d/src/mt_wifi/os/linux/rt_linux.c | 4777 -- .../src/mt_wifi/os/linux/rt_linux_symb.c | 299 - .../src/mt_wifi/os/linux/rt_main_dev.c | 1002 - .../src/mt_wifi/os/linux/rt_pci_rbus.c | 58 - .../mt7615d/src/mt_wifi/os/linux/rt_proc.c | 606 - .../mt7615d/src/mt_wifi/os/linux/rt_profile.c | 2159 - .../src/mt_wifi/os/linux/rt_rbus_pci_drv.c | 304 - .../src/mt_wifi/os/linux/rt_rbus_pci_util.c | 471 - .../mt7615d/src/mt_wifi/os/linux/rt_symb.c | 10 - .../src/mt_wifi/os/linux/rt_txrx_hook.c | 89 - .../mt7615d/src/mt_wifi/os/linux/rt_udma.c | 225 - .../mt7615d/src/mt_wifi/os/linux/tm.c | 670 - .../mt7615d/src/mt_wifi/os/linux/trace.c | 254 - .../mt7615d/src/mt_wifi/os/linux/unload | 2 - .../mt7615d/src/mt_wifi/os/linux/vr_bdlt.c | 62 - .../mt7615d/src/mt_wifi/os/linux/vr_ikans.c | 275 - .../src/mt_wifi/os/linux/wbsys_main_dev.c | 339 - .../mt7615d/src/mt_wifi/phy/mt_phy.c | 103 - .../mt7615d/src/mt_wifi/phy/mt_rf.c | 66 - .../mt-drivers/mt7615d/src/mt_wifi/phy/phy.c | 250 - .../mt-drivers/mt7615d/src/mt_wifi/phy/rf.c | 27 - .../mt7615d/src/mt_wifi/phy/rlm_cal_cache.c | 465 - .../mt7615d/src/mt_wifi/protocol/protection.c | 59 - .../mt7615d/src/mt_wifi/protocol/tmr.c | 381 - .../mt7615d/src/mt_wifi/rate_ctrl/ra_cfg.c | 1049 - .../src/mt_wifi/rate_ctrl/ra_ctrl_mt.c | 1565 - .../src/mt_wifi/rate_ctrl/ra_ctrl_mt_drv.c | 676 - .../mt_wifi/rate_ctrl/ra_wrapper_embedded.c | 1010 - .../src/mt_wifi/txbf/cmm_txbf_cal_mt.c | 1249 - .../mt7615d/src/mt_wifi/txbf/cmm_txbf_mt.c | 1633 - .../src/mt_wifi/txbf/txbf_wrapper_embedded.c | 161 - .../mt7615d/src/mt_wifi/txpwr/Makefile | 5 - .../mt7615d/src/mt_wifi/txpwr/data2h.c | 220 - .../mt7615d/src/mt_wifi/txpwr/single_sku.c | 2588 -- .../txpwr/sku_tables/7615_SingleSKU_1.dat | 65 - .../txpwr/sku_tables/7615_SingleSKU_BF_1.dat | 71 - .../sku_tables/7615_SingleSKU_BF_default.dat | 71 - .../sku_tables/7615_SingleSKU_default.dat | 65 - .../mt-drivers/mt7615d/src/mt_wifi_ap/Kconfig | 384 - .../mt7615d/src/mt_wifi_ap/Makefile | 1518 - .../mt7615d/src/mt_wifi_sta/Kconfig | 75 - .../mt7615d/src/mt_wifi_sta/Makefile | 790 - package/kernel/mt-drivers/mt_wifi/Makefile | 69 - package/kernel/mt-drivers/mt_wifi/config.in | 25 - .../mt_wifi/files/7603_7612-l1profile.dat | 10 - .../mt_wifi/files/7603_7615-l1profile.dat | 21 - .../mt_wifi/files/7615.l1profile.dat | 23 - .../mt-drivers/mt_wifi/files/82_load_wifi.sh | 10 - .../mt_wifi/files/dbdc.l1profile.dat | 12 - .../mt-drivers/mt_wifi/files/firmware.sh | 16 - .../mt-drivers/mt_wifi/files/mt7603.dat | 327 - .../mt-drivers/mt_wifi/files/mt7612.dat | 249 - .../mt-drivers/mt_wifi/files/mt7615.1.2G.dat | 384 - .../mt-drivers/mt_wifi/files/mt7615.1.5G.dat | 384 - .../mt-drivers/mt_wifi/files/mt7615.2G.dat | 384 - .../mt-drivers/mt_wifi/files/mt7615.5G.dat | 384 - .../mt-drivers/mt_wifi/files/mt7615.dat | 384 - .../mt-drivers/mt_wifi/files/mt7615.lua | 219 - .../mt_wifi/files/mt7615e-sku-bf.dat | 65 - .../mt-drivers/mt_wifi/files/mt7615e-sku.dat | 65 - .../mt_wifi/files/mt7615e.eeprom.bin | Bin 1024 -> 0 bytes .../mt-drivers/mt_wifi/files/mt7622.1.dat | 406 - .../mt_wifi/files/wifi_services.lua | 98 - 727 files changed, 673654 deletions(-) delete mode 100644 package/kernel/mt-drivers/mt7615d/Makefile delete mode 100644 package/kernel/mt-drivers/mt7615d/config.in delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7615/MT7615_cr4.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7615/WIFI_RAM_CODE_MT7615.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7615/ePAeLNA/MT7615_EEPROM.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7615/ePAiLNA/MT7615_EEPROM.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7615/iPAeLNA/MT7615_EEPROM.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7615/iPAiLNA/MT7615_EEPROM.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7615/mt7615_patch_e3_hdr.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7622/MT7622_EEPROM.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7622/WIFI_RAM_CODE_MT7622_E2.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7622/ePAeLNA/MT7622_EEPROM.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7622/iPAeLNA/MT7622_EEPROM.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7622/iPAiLNA/MT7622_EEPROM.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/bin/mt7622/mt7622_patch_e2_hdr.bin delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/LoopBack.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/ate_agent.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/LoopBack.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/ate.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/ate_agent.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/meta_agent.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode_dmac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode_smac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/qa_agent.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/testmode_common.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/testmode_ioctl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/meta_agent.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_ate.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode_dmac.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode_smac.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/qa_agent.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/testmode_ioctl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7615.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7615_dbg.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7622.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7622_dbg.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/rtmp_chip.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Kconfig delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Makefile delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Pack_Release.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Release.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Release_Notes.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_apcli.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_apcli_inf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_assoc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_auth.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_autoChSel.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_band_steering.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_cfg.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_data.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_ftkd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_ids.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mbss.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mbss_inf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mlme.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mumimo.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mura.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_nps.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_qload.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_repeater.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sanity.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sec.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sync.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_vow.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_wds.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_wds_inf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_wpa.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/apcli_assoc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/apcli_auth.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/apcli_ctrl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/apcli_link_cover.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/apcli_sync.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/a4_conn.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/action.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ba_action.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/bcn.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/bgnd_scan.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/client_wds.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_cfg.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_cmd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_cs.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_data.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_info.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_info_element.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_mac_pci.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_mat.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_mat_iparp.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_mat_ipv6.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_mat_pppoe.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_mumimo.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_profile.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_radar.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_rdm_mt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_rf_cal.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_rvr_dbg.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_sanity.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_sync.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_tcprack.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_txbf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cmm_video.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/cut_through.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ee_efuse.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ee_flash.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ee_prom.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/eeprom.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/fp_fair_qm.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/fp_qm.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/fpga.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/fq_qm.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ft.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ft_iocl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ft_rc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ft_tlv.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ftm.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/gas.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/hif_pci.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/hotspot.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/icap.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/igmp_snoop.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/map.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/mbo.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/misc_app.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/mlme.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/mt_io.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/mt_ps.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/multi_channel.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/multi_profile.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/netif_block.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/nfc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/oce.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/oce_fils.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/op_class.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ps.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/qm.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ra_ac_q_mgmt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/ral_ps.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/routing_tab.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rrm.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rrm_sanity.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rrm_tlv.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rt_channel.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rt_led.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rt_os_util.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rtmp_init.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rtmp_init_inf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/rtmp_timer.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/scan.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/scs.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/smartant.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/sniffer_prism.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/sniffer_radiotap.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/spectrum.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/sys_log.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/txpower.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/txs.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/uapsd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/vendor.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/verf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/vht.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/wdev.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/wifi_sys_info.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/wifi_sys_notify.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/wnm.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/wsc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/wsc_tlv.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/wsc_ufd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/common/wsc_v2.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/Doxyfile delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/FirmwareHistory.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/History.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/History_sta_pci.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/History_sta_usb.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/README delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/README_STA_pci delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/README_STA_usb delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/RT2860card.readme delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/RT_WIFI_Revision_History_2010_April.xls delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/VxWorks.README delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/ate_iwpriv_usage.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/brftph_usage.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/header_translation.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/iwpriv_usage.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/mainpage.dox delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/mbss_phy.readme delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/sta_ate_iwpriv_usage.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/wps_iwpriv_usage.txt delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/hdev_basic.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/omac_ctrl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/radio_ctrl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/wmm_ctrl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/wtbl_ctrl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev_ctrl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_basic.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_cmd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v1.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v2.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/a4_conn.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/action.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ags.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_apcli.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_autoChSel.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_autoChSel_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_cfg.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_ids.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mbss.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mumimo.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mura.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_repeater.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_vow.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_wds.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/arris_mod_api.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/arris_wps_gpio_handler.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/band_steering.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/band_steering_def.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bcn.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bgnd_scan.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bgnd_scan_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/br_ftph.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211extr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/chlist.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/client_wds.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/client_wds_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_cmd.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_rvr_dbg.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_tcprack.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cs.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cut_through.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11_base.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11ac_vht.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11k_rrm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11n_ht.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11r_ft.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11u_interworking.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11v_wnm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_ePAeLNA.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_ePAiLNA.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_iPAeLNA.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_iPAiLNA.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_ePAeLNA.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_iPAeLNA.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_iPAiLNA.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt_dmac_e2p_def.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt_e2p_def.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/efuse.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/event_common.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/firmware.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fp_qm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fq_qm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/frame_hdr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/frq_cal.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fsm/fsm_sync.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ft.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ft_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ftm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ftm_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/gas.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev/hdev.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev/hdev_basic.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev_ctrl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hotspot.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hw_ctrl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hw_ctrl_basic.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/icap.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/iface.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/iface_util.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/mtk_hif.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_inf_pcirbs.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_pci.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_rbs.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/igmp_snoop.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ipv6.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/l1profile.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/map.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mat.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mbo.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/andes_core.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/andes_mt.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/btcoex.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mcu.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_cr4_firmware.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_firmware.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_rom_patch.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7622_firmware_e2.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7622_rom_patch_e2.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/meminfo_list.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mgmt/be_export.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mgmt/be_internal.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/misc_app.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mlme.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mlme_sys.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mt_io.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mt_rdm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/netif_block.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/nfc.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oce.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oid.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oid_struct.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/qm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ra_ac_q_mgmt.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/radar.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/routing_tab.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rrm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rrm_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_cal.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_config.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_led.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_os_net.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_os_util.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_txbf.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_udma.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_chip.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_cmd.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_comm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_def.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_dmacb.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_dot11.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_iface.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_os.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_osabl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_timer.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_type.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/scs.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/bn.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_aes.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_arc4.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_biginteger.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_bignum.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_dh.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_hmac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_md5.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_sha2.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dh_key.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dot11i_wpa.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dot11w_pmf.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/ecc.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/owe_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/pmf.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/pmf_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sae.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sae_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sec.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sec_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/wpa.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/wpa_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/smartant.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sniffer/radiotap.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sniffer/sniffer.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/spectrum.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/spectrum_def.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sta.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sta_cfg.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tx_power.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/uapsd.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vendor.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vht.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/video.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vr_ikans.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vrut_ubm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wapp/wapp.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wapp/wapp_cmm_type.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wfa_p2p.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wifi_sys_notify.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wlan_config/config_export.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wlan_config/config_internal.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wnm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wnm_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wsc.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wsc_tlv.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/andes_core.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/andes_mt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/mcu.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_basic.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_ht.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_phy.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_vht.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/bss_ops.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_dev.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_entrytb.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_ht.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_hw.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_vht.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/Makefile delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/Makefile delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wdma.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wdma.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed_def.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_basic.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_basic.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hif.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hif.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hw.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hw.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_main.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_mt7615.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_mt7615.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_proc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_ser.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_wifi.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/bn_lib.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_aes.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_sec.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_tkip.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_wep.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_wpa.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_aes.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_arc4.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_biginteger.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_bignum.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_dh.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_hmac.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_md5.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_sha2.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/dh_key.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/ecc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/owe.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/pmf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/sae.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/Makefile delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/auto_build_kernel_4_4.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/bin2h.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/build-check-jedi.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/check_build_script.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/i.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662_freq_plan.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662e_ap.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662e_sta.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/r.sh delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/unload delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wapp/wapp.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_basic.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_ht.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_phy.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_vht.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt_dmac.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt_fw.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_chip.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_chip_mt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/coex.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/greenap.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/hw_init.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/mt_gpio.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/chip_id.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7615.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7615_cr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7622.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7622_cr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7663_cr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/p18_cr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/debug.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/link_list.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/module.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/mt_os_util.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/wifi_sys_info.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/eeprom/mt_tx_pwr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hif/hif.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hif/mt_hif_pci.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic_mt.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic_mt_fw.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_chip.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/hw_init.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hwnat/ra_nat.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/client.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/dma_sch.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/gpio.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/hw_amsdu.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/mt_dmac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/pse.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_agg.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_aon.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_arb.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_cfg.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_cfgoff.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_dma.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_etbf.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_int_wakeup_top.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_lpon_top.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_mib.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_mu.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_pf.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_phy.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_ple.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_pp.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_rmac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_sec.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_tmac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_trb.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtbl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtbloff.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtblon.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac_ctrl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac_pci.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/client.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/dma_sch.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/gpio.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/mt_mac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/mt_smac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/pse.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_agg.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_aon.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_arb.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_cfgoff.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_dma.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_int_wakeup_top.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_lpon_top.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_mib.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_pf.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_phy.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_rmac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_sec.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_tmac.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_trb.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtbl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtbloff.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtblon.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/top.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/fwdl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/mt_cmd.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/mt_fdb.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/bb_soc.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/diag.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/pkt_meta.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_drv.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_ecos_type.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux_cmm.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux_txrx_hook.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_os.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_win.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_wince.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/trace.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/wbsys_res.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_bbp.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_phy.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_rf.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/phy.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/rlm_cal_cache.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/wf_phy_back.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/protocol/protection.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/protocol/tmr.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/rate_ctrl/ra_ctrl.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txbf/mt_txbf.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txbf/mt_txbf_cal.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_1.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_10.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_11.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_12.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_13.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_14.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_15.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_16.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_17.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_18.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_19.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_2.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_20.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_3.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_4.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_5.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_6.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_7.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_8.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_9.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_1.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_10.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_11.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_12.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_13.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_14.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_15.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_16.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_17.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_18.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_19.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_2.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_20.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_3.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_4.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_5.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_6.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_7.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_8.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_9.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/single_sku.h delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/license/MTK_LICENSE delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/license/NOTICE delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/mac/mt_dmac.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/mac/mt_mac.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fw_cmd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl_mt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/mt_cmd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/mt_fdb.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.ap.soc delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_3_18 delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_4_4 delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_ap delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_sta delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi_ap delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi_sta delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.sta.soc delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.wifi delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile-3.10.14.mt_wifi_ap delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4 delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4.netif delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4.util delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6 delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6.netif delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6.util delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.ap.soc delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.ap.usb delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.clean delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.libautoprovision.6 delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.mt_wifi_ap delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.mt_wifi_sta delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_ap delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_ap.7637e delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_sta delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.sta.soc delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/android_priv_cmd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/ap_ioctl.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/bb_soc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/br_ftph.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_ap.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_apcli.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_inf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_p2p.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_rx.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_scan.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_tdls.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_tx.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_util.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211drv.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/config.mk delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/config.mk.cfg80211 delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/diag.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/inf_ppa.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/mt_fwdump.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/mt_wifi_mtd.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/multi_main_dev.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/pci_main_dev.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rbus_main_dev.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rbus_prop_dev.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_linux.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_linux_symb.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_main_dev.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_pci_rbus.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_proc.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_profile.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_rbus_pci_drv.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_rbus_pci_util.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_symb.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_txrx_hook.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_udma.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/tm.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/trace.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/unload delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/vr_bdlt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/vr_ikans.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/wbsys_main_dev.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/mt_phy.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/mt_rf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/phy.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/rf.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/rlm_cal_cache.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/protocol/protection.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/protocol/tmr.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_cfg.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_ctrl_mt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_ctrl_mt_drv.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_wrapper_embedded.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/cmm_txbf_cal_mt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/cmm_txbf_mt.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/txbf_wrapper_embedded.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/Makefile delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/data2h.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/single_sku.c delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_1.dat delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_BF_1.dat delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_BF_default.dat delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_default.dat delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi_ap/Kconfig delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi_ap/Makefile delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi_sta/Kconfig delete mode 100644 package/kernel/mt-drivers/mt7615d/src/mt_wifi_sta/Makefile delete mode 100644 package/kernel/mt-drivers/mt_wifi/Makefile delete mode 100644 package/kernel/mt-drivers/mt_wifi/config.in delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/7603_7612-l1profile.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/7603_7615-l1profile.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/7615.l1profile.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/82_load_wifi.sh delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/dbdc.l1profile.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/firmware.sh delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7603.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7612.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615.1.2G.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615.1.5G.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615.2G.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615.5G.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615.lua delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615e-sku-bf.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615e-sku.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7615e.eeprom.bin delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/mt7622.1.dat delete mode 100644 package/kernel/mt-drivers/mt_wifi/files/wifi_services.lua diff --git a/package/kernel/mt-drivers/mt7615d/Makefile b/package/kernel/mt-drivers/mt7615d/Makefile deleted file mode 100644 index e40b062cb0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/Makefile +++ /dev/null @@ -1,219 +0,0 @@ -# All rights reserved. -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. - -include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk - -PKG_NAME:=mt7615d -PKG_VERSION:=5.1.0.0 -P4REV:=8 - -PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME) -PKG_KCONFIG:= \ - SUPPORT_OPENWRT \ - WIFI_DRIVER \ - FIRST_IF_MT7615E \ - FIRST_IF_MT7622 \ - FIRST_IF_MT7626 \ - FIRST_IF_NONE \ - SECOND_IF_NONE \ - SECOND_IF_MT7615E \ - THIRD_IF_NONE \ - THIRD_IF_MT7615E \ - RT_FIRST_CARD \ - RT_SECOND_CARD \ - RT_THIRD_CARD \ - RT_FIRST_IF_RF_OFFSET \ - RT_SECOND_IF_RF_OFFSET \ - RT_THIRD_IF_RF_OFFSET \ - MT_WIFI \ - MT_WIFI_PATH \ - FIRST_IF_EEPROM_FLASH \ - FIRST_IF_EEPROM_PROM \ - FIRST_IF_EEPROM_EFUSE \ - RT_FIRST_CARD_EEPROM \ - SECOND_IF_EEPROM_FLASH \ - SECOND_IF_EEPROM_PROM \ - SECOND_IF_EEPROM_EFUSE \ - RT_SECOND_CARD_EEPROM \ - THIRD_IF_EEPROM_FLASH \ - THIRD_IF_EEPROM_PROM \ - THIRD_IF_EEPROM_EFUSE \ - RT_THIRD_CARD_EEPROM \ - MULTI_INF_SUPPORT \ - WIFI_BASIC_FUNC \ - DOT11_N_SUPPORT \ - DOT11_VHT_AC \ - G_BAND_256QAM_SUPPORT \ - TPC_SUPPORT \ - ICAP_SUPPORT \ - SPECTRUM_SUPPORT \ - BACKGROUND_SCAN_SUPPORT \ - SMART_CARRIER_SENSE_SUPPORT \ - MT_DFS_SUPPORT \ - OFFCHANNEL_SCAN_FEATURE \ - DPP_SUPPORT \ - HDR_TRANS_TX_SUPPORT \ - HDR_TRANS_RX_SUPPORT \ - DBDC_MODE \ - MULTI_PROFILE_SUPPORT \ - DEFAULT_5G_PROFILE \ - WSC_INCLUDED \ - WSC_V2_SUPPORT \ - DOT11W_PMF_SUPPORT \ - TXBF_SUPPORT \ - FAST_NAT_SUPPORT \ - WHNAT_SUPPORT \ - FTM_SUPPORT \ - MBO_SUPPORT \ - IGMP_SNOOP_SUPPORT \ - RTMP_FLASH_SUPPORT \ - PRE_CAL_TRX_SET1_SUPPORT \ - RLM_CAL_CACHE_SUPPORT \ - PRE_CAL_TRX_SET2_SUPPORT \ - RF_LOCKDOWN_SUPPORT \ - LINK_TEST_SUPPORT \ - ATE_SUPPORT \ - PASSPOINT_R2 \ - UAPSD \ - TCP_RACK_SUPPORT \ - RED_SUPPORT \ - FDB_SUPPORT \ - FIRST_IF_IPAILNA \ - FIRST_IF_IPAELNA \ - FIRST_IF_EPAELNA \ - SECOND_IF_IPAILNA \ - SECOND_IF_IPAELNA \ - SECOND_IF_EPAELNA \ - THIRD_IF_EPAELNA \ - THIRD_IF_IPAILNA \ - THIRD_IF_IPAELNA \ - RLT_MAC \ - RLT_BBP \ - RLT_RF \ - RTMP_MAC \ - RTMP_BBP \ - RTMP_RF \ - RTMP_PCI_SUPPORT \ - RTMP_USB_SUPPORT \ - RTMP_RBUS_SUPPORT \ - WIFI_MODE_AP \ - WIFI_MODE_STA \ - WIFI_MODE_BOTH \ - MT_AP_SUPPORT \ - WDS_SUPPORT \ - WIFI_EAP_FEATURE \ - VLAN_SUPPORT \ - MLME_MULTI_QUEUE_SUPPORT \ - TXRX_STAT_SUPPORT \ - SNIFFER_SUPPORT \ - ANTENNA_CONTROL_SUPPORT \ - MGMT_TXPWR_CTRL \ - CHUTIL_SUPPORT \ - NF_SUPPORT \ - RA_PHY_RATE_SUPPORT \ - AMPDU_CONF_SUPPORT \ - ACK_CTS_TIMEOUT_SUPPORT \ - MBSS_SUPPORT \ - APCLI_SUPPORT \ - APCLI_CERT_SUPPORT \ - MAC_REPEATER_SUPPORT \ - MWDS \ - MUMIMO_SUPPORT \ - MU_RA_SUPPORT \ - DOT11R_FT_SUPPORT \ - DOT11K_RRM_SUPPORT \ - INTERWORKING \ - MAP_SUPPORT \ - MAP_R2_VER_SUPPORT \ - OFFCHANNEL_SCAN_FEATURE \ - OCE_SUPPORT \ - DPP_FEATURE \ - ENTERPRISE_AP_SUPPORT \ - DYNAMIC_VLAN_SUPPORT \ - CFG80211_SUPPORT \ - CUSTOMISED_HOSTAPD_SUPPORT \ - APCLI_STA_SUPPORT \ - WDS_STA_SUPPORT \ - MBSS_AS_WDS_AP_SUPPORT \ - DSCP_QOS_MAP_SUPPORT \ - DSCP_PRI_SUPPORT \ - HOSTAPD_MAP_SUPPORT \ - MIN_PHY_RATE_SUPPORT \ - FAST_UP_RATE_SUPPORT \ - RADIUS_MAC_AUTH_SUPPORT \ - CON_WPS_SUPPORT \ - MCAST_RATE_SPECIFIC \ - VOW_SUPPORT \ - FQ_SCH_SUPPORT \ - BAND_STEERING \ - LED_CONTROL_SUPPORT \ - WLAN_HOOK \ - RADIUS_ACCOUNTING_SUPPORT \ - GREENAP_SUPPORT \ - PCIE_ASPM_DYM_CTRL_SUPPORT \ - COEX_SUPPORT \ - EASY_SETUP_SUPPORT \ - EVENT_NOTIFIER_SUPPORT \ - AIR_MONITOR \ - WNM_SUPPORT \ - WIFI_MSI_SUPPORT \ - WPA3_SUPPORT \ - OWE_SUPPORT \ - VENDOR_FEATURE10_SUPPORT \ - VENDOR_FEATURE11_SUPPORT \ - RCSA_SUPPORT \ - ETH_CONVERT_SUPPORT \ - WIFI_MT_MAC \ - RLT_MAC \ - RTMP_MAC \ - MT_MAC \ - CHIP_MT7603E \ - CHIP_MT7615E \ - CHIP_MT7622 \ - CHIP_MT7663E \ - CHIP_MT7626 - -PKG_CONFIG_DEPENDS:=$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_MTK_$c),CONFIG_$(c))) - -include $(INCLUDE_DIR)/package.mk - -TAR_CMD=$(HOST_TAR) -C $(1)/ $(TAR_OPTIONS) - -define KernelPackage/mt7615d - CATEGORY:=Kernel modules - TITLE:=MTK wifi AP driver - DEPENDS:=@TARGET_ramips - KCONFIG:= \ - CONFIG_PCI_MSI=y \ - CONFIG_NET_SCH_FQ=y -ifneq ($(CONFIG_MTK_WHNAT_SUPPORT),) - FILES:=$(PKG_BUILD_DIR)/mt_wifi_ap/mt_wifi.ko \ - $(PKG_BUILD_DIR)/mt_wifi/embedded/plug_in/whnat/mt_whnat.ko -else - FILES:=$(PKG_BUILD_DIR)/mt_wifi_ap/mt_wifi.ko -endif - SUBMENU:=Wireless Drivers - MENU:=1 -endef - -define KernelPackage/mt7615d/config - source "$(SOURCE)/config.in" -endef - -define Build/Compile - $(MAKE) -C "$(LINUX_DIR)" V=1 \ - CROSS_COMPILE="$(TARGET_CROSS)" \ - ARCH="$(LINUX_KARCH)" \ - M="$(PKG_BUILD_DIR)/mt_wifi_ap" \ - $(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_MTK_$c),CONFIG_$(c)=$(CONFIG_MTK_$(c)))) \ - modules -endef - -define KernelPackage/mt7615d/install - $(INSTALL_DIR) $(1)/etc/wireless/mt7615 -endef - -$(eval $(call KernelPackage,mt7615d)) diff --git a/package/kernel/mt-drivers/mt7615d/config.in b/package/kernel/mt-drivers/mt7615d/config.in deleted file mode 100644 index de33b7979c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/config.in +++ /dev/null @@ -1,1041 +0,0 @@ -if PACKAGE_kmod-mt7615d - -config MTK_SUPPORT_OPENWRT - bool - default y - depends on PACKAGE_kmod-mt7615d - -config MTK_WIFI_DRIVER - bool - default y - depends on PACKAGE_kmod-mt7615d - select MTK_WIFI_MT_MAC - select MTK_MT_MAC - select MTK_FIRST_IF_MT7615E - #select MTK_CHIP_MT7622 - #select MTK_CHIP_MT7626 - #select MTK_SECOND_IF_MT7615E - #select MTK_THIRD_IF_MT7615E - #select MTK_CHIP_MT7615E - -if MTK_WIFI_DRIVER - -choice - prompt "Choose First WiFi Interface" - - config MTK_FIRST_IF_MT7615E - bool "MT7615E" - select MTK_WIFI_MT_MAC - select MTK_MT_MAC - select MTK_CHIP_MT7615E - - config MTK_FIRST_IF_MT7622 - bool "MT7622" - select MTK_WIFI_MT_MAC - select MTK_MT_MAC - select MTK_CHIP_MT7622 - - config MTK_FIRST_IF_MT7626 - bool "MT7626" - select MTK_WIFI_MT_MAC - select MTK_MT_MAC - select MTK_CHIP_MT7626 - - config MTK_FIRST_IF_NONE - bool "None" -endchoice - -choice - prompt "Choose Second WiFi Interface" - default MTK_SECOND_IF_NONE if TARGET_ramips_mt7621_DEVICE_phicomm_k2p || PACKAGE_kmod-mt7603e - default MTK_SECOND_IF_MT7615E - -config MTK_SECOND_IF_NONE - bool "None" - -config MTK_SECOND_IF_MT7615E - bool "MT7615E" - select MTK_WIFI_MT_MAC - select MTK_CHIP_MT7615E - select MTK_MULTI_INF_SUPPORT - -endchoice - -choice - prompt "Choose Third WiFi Interface" - config MTK_THIRD_IF_NONE - bool "None" - - config MTK_THIRD_IF_MT7615E - bool "MT7615E" - select MTK_WIFI_MT_MAC - select MTK_CHIP_MT7615E - select MTK_MULTI_INF_SUPPORT - -endchoice - -config MTK_RT_FIRST_CARD - int - depends on ! MTK_FIRST_IF_NONE - default 7615 if MTK_FIRST_IF_MT7615E - default 7622 if MTK_FIRST_IF_MT7622 - default 7626 if MTK_FIRST_IF_MT7626 - -config MTK_RT_SECOND_CARD - int - depends on ! MTK_SECOND_IF_NONE - default 7615 if MTK_SECOND_IF_MT7615E - -config MTK_RT_THIRD_CARD - int - depends on ! MTK_THIRD_IF_NONE - default 7615 if MTK_THIRD_IF_MT7615E - -config MTK_RT_FIRST_IF_RF_OFFSET - hex - depends on ! MTK_FIRST_IF_NONE - default 0xc0000 - -config MTK_RT_SECOND_IF_RF_OFFSET - hex - depends on ! MTK_SECOND_IF_NONE - default 0xc8000 - -config MTK_RT_THIRD_IF_RF_OFFSET - hex - depends on ! MTK_THIRD_IF_NONE - default 0xd0000 - -config MTK_MT_WIFI - tristate "MT WIFI Driver" - select MTK_WIFI_BASIC_FUNC if MTK_MT_WIFI - default y - -config MTK_MT_WIFI_PATH - string - depends on MTK_MT_WIFI - default "mt_wifi" - -if MTK_MT_WIFI -menu "WiFi Generic Feature Options" -choice - prompt "EEPROM Type of 1st Card" - depends on ! MTK_FIRST_IF_NONE - - config MTK_FIRST_IF_EEPROM_FLASH - bool "FLASH" - - config MTK_FIRST_IF_EEPROM_PROM - bool "EEPROM" - - config MTK_FIRST_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config MTK_RT_FIRST_CARD_EEPROM - string - depends on ! MTK_FIRST_IF_NONE - default "prom" if MTK_FIRST_IF_EEPROM_PROM - default "efuse" if MTK_FIRST_IF_EEPROM_EFUSE - default "flash" if MTK_FIRST_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 2nd Card" - depends on ! MTK_SECOND_IF_NONE - - config MTK_SECOND_IF_EEPROM_FLASH - bool "FLASH" - - config MTK_SECOND_IF_EEPROM_PROM - bool "EEPROM" - - config MTK_SECOND_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config MTK_RT_SECOND_CARD_EEPROM - string - depends on ! MTK_SECOND_IF_NONE - default "prom" if MTK_SECOND_IF_EEPROM_PROM - default "efuse" if MTK_SECOND_IF_EEPROM_EFUSE - default "flash" if MTK_SECOND_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 3th Card" - depends on ! MTK_THIRD_IF_NONE - - config MTK_THIRD_IF_EEPROM_FLASH - bool "FLASH" - - config MTK_THIRD_IF_EEPROM_PROM - bool "EEPROM" - - config MTK_THIRD_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config MTK_RT_THIRD_CARD_EEPROM - string - depends on ! MTK_THIRD_IF_NONE - default "prom" if MTK_THIRD_IF_EEPROM_PROM - default "efuse" if MTK_THIRD_IF_EEPROM_EFUSE - default "flash" if MTK_THIRD_IF_EEPROM_FLASH - -config MTK_MULTI_INF_SUPPORT - bool - default y if !MTK_FIRST_IF_NONE && !MTK_SECOND_IF_NONE - -config MTK_WIFI_BASIC_FUNC - bool "Basic Functions" - select MTK_WIRELESS_EXT - select MTK_WEXT_SPY - select MTK_WEXT_PRIV - -config MTK_DOT11_N_SUPPORT - bool "802.11n support" - default y - -config MTK_DOT11_VHT_AC - bool "802.11AC support" - depends on MTK_WIFI_DRIVER - depends on MTK_DOT11_N_SUPPORT - default y - -config MTK_G_BAND_256QAM_SUPPORT - bool "2.4G 256QAM support" - depends on MTK_WIFI_DRIVER - depends on MTK_DOT11_VHT_AC - default y - -config MTK_TPC_SUPPORT - bool "802.11h TPC Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_ICAP_SUPPORT - bool "ICAP Support" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_SPECTRUM_SUPPORT - bool "Wifi Spectrum Support" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_BACKGROUND_SCAN_SUPPORT - bool "Background Scan Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_SMART_CARRIER_SENSE_SUPPORT - bool "Smart Carrier Sense Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_MT_DFS_SUPPORT - bool "Dynamic Frequency Selection Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_OFFCHANNEL_SCAN_FEATURE - bool "Channel Quality Monitor" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_DPP_SUPPORT - bool "DPP Support" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - select DOT11W_PMF_SUPPORT - default n - -#config MTK_WFA_VHT_R2_PF -# bool "WFA VHT R2 Plugfest" -# depends on MTK_DOT11_VHT_AC -# default n - -config MTK_HDR_TRANS_TX_SUPPORT - bool "Tx Header Translation" - depends on MTK_CHIP_MT7615E || MTK_CHIP_MT7622 || MTK_CHIP_MT7626 - default y - -config MTK_HDR_TRANS_RX_SUPPORT - bool "Rx Header Translation" - depends on MTK_CHIP_MT7615E || MTK_CHIP_MT7622 || MTK_CHIP_MT7626 - default y - -config MTK_DBDC_MODE - bool "dbdc mode support" - depends on MTK_CHIP_MT7615E - select MTK_MULTI_PROFILE_SUPPORT -# select MTK_DEFAULT_5G_PROFILE - default y - -config MTK_MULTI_PROFILE_SUPPORT - bool "Multi Profile Support" - depends on MTK_DBDC_MODE - default y if TARGET_ramips_mt7621_DEVICE_phicomm_k2p - default n - -config MTK_DEFAULT_5G_PROFILE - bool "5G default profile for DBDC" - depends on MTK_DBDC_MODE - default y if TARGET_ramips_mt7621_DEVICE_phicomm_k2p - default n - -config MTK_WSC_INCLUDED - bool "WSC (WiFi Simple Config)" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT || MTK_MT_STA_SUPPORT - default y - -config MTK_WSC_V2_SUPPORT - bool "WSC V2(WiFi Simple Config Version 2.0)" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT || MTK_MT_STA_SUPPORT - default y - -config MTK_DOT11W_PMF_SUPPORT - bool "PMF" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT || MTK_MT_STA_SUPPORT - default y - -config MTK_TXBF_SUPPORT - bool "Tx Bean Forming Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_FAST_NAT_SUPPORT - bool "Fast-NAT support" -# depends on MTK_RA_HW_NAT_WIFI - default n - -config MTK_WHNAT_SUPPORT - tristate "Wifi Hardware NAT support" - depends on MTK_CHIP_MT7615E - depends on MTK_WLAN_HOOK - depends on MTK_FAST_NAT_SUPPORT - select PACKAGE_kmod-hw_nat - default n - -#config MTK_LLTD_SUPPORT -# bool "LLTD (Link Layer Topology Discovery Protocol)" -# depends on MTK_WIFI_DRIVER -# depends on MTK_MT_AP_SUPPORT -# default n - -#config MTK_QOS_DLS_SUPPORT -# bool "802.11e DLS ((Direct-Link Setup) Support" -# depends on MTK_WIFI_DRIVER -# depends on MTK_MT_AP_SUPPORT -# default n - -#config MTK_WAPI_SUPPORT -# bool "WAPI Support" -# depends on MTK_WIFI_DRIVER -# default n - -config MTK_FTM_SUPPORT - bool "FTM Support" - depends on MTK_WIFI_DRIVER - select MTK_PASSPOINT_R2 - default n - -config MTK_MBO_SUPPORT - bool "MBO Support" - depends on MTK_WIFI_DRIVER - select MTK_INTERWORKING - select MTK_WNM_SUPPORT - select MTK_DOT11K_RRM_SUPPORT - select MTK_DOT11R_FT_SUPPORT - select MTK_DOT11W_PMF_SUPPORT - default n - -#config MTK_CARRIER_DETECTION_SUPPORT -# bool "Carrier Detect" -# depends on MTK_WIFI_DRIVER -# default n - -config MTK_IGMP_SNOOP_SUPPORT - bool "IGMP snooping" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - default y - -#config MTK_BLOCK_NET_IF -# bool "NETIF Block" -# depends on MTK_WIFI_DRIVER -# depends on MTK_MT_AP_SUPPORT -# default n -# help -# Support Net interface block while Tx-Sw queue full - -#config MTK_RATE_ADAPTION -# bool "New Rate Adaptation support" -# depends on MTK_WIFI_DRIVER -# default y - -#config MTK_NEW_RATE_ADAPT_SUPPORT -# bool "Intelligent Rate Adaption" -# depends on MTK_WIFI_DRIVER && MTK_RATE_ADAPTION -# default y - -#config MTK_AGS_SUPPORT -# bool "Adaptive Group Switching" -# depends on MTK_WIFI_DRIVER && MTK_RATE_ADAPTION -# depends on MTK_MT_AP_SUPPORT || MTK_MT_STA_SUPPORT -# default n - -#config MTK_RATE_ADAPT_AGBS_SUPPORT -# bool "Adaptive AGBS Mode" -# depends on MTK_WIFI_DRIVER && MTK_RATE_ADAPTION -# depends on MTK_MT_AP_SUPPORT || MTK_MT_STA_SUPPORT -# default y - -#config MTK_IDS_SUPPORT -# bool "IDS (Intrusion Detection System) Support" -# depends on MTK_WIFI_DRIVER -# depends on MTK_MT_AP_SUPPORT -# default n - -#config MTK_WIFI_WORK_QUEUE -# bool "Work Queue" -# depends on MTK_WIFI_DRIVER -# default n - -#config MTK_WIFI_SKB_RECYCLE -# bool "SKB Recycle(Linux)" -# depends on MTK_WIFI_DRIVER -# depends on MTK_MT_AP_SUPPORT -# default n - -config MTK_RTMP_FLASH_SUPPORT - bool "Flash Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_PRE_CAL_TRX_SET1_SUPPORT - bool "Calibration To Flash/BinFile Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_RLM_CAL_CACHE_SUPPORT - bool "RlmCalibrationCache Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_PRE_CAL_TRX_SET2_SUPPORT - bool "Pre-calibration to Flash Support" - depends on MTK_WIFI_DRIVER - default y - -config MTK_RF_LOCKDOWN_SUPPORT - bool "RF Lockdown Support" - depends on MTK_WIFI_DRIVER - default n - -config MTK_LINK_TEST_SUPPORT - bool "Link Test Support" - depends on MTK_WIFI_DRIVER - default n - -#config MTK_LED_CONTROL_SUPPORT -# bool "LED Support" -# depends on MTK_WIFI_DRIVER -# depends on MTK_MT_AP_SUPPORT -# default n - -config MTK_ATE_SUPPORT - bool "ATE/QA Support" - depends on MTK_WIFI_DRIVER - default y - -#config MTK_MEMORY_OPTIMIZATION -# bool "Memory Optimization" -# depends on MTK_WIFI_DRIVER -# default n - -config MTK_PASSPOINT_R2 - bool "Passpoint Release-2 Support" - depends on MTK_WIFI_DRIVER - select MTK_DOT11W_PMF_SUPPORT - depends on MTK_MT_AP_SUPPORT - default n - -#config MTK_TRACE_TCP_PKT -# bool "TCP DATA/ACK packets trace log" -# depends on MTK_WIFI_DRIVER -# default n - -config MTK_UAPSD - bool "UAPSD support" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT || MTK_MT_STA_SUPPORT - default y - -config MTK_TCP_RACK_SUPPORT - bool "TCP Reduced ACK support" - depends on MTK_WIFI_DRIVER - default y - -#### PA_LNA_Type choice - -config MTK_RED_SUPPORT - bool "RED(Random Early Drop) support" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT || MTK_MT_STA_SUPPORT - default y - -config MTK_FDB_SUPPORT - bool "FW Debug Port" - depends on MTK_WIFI_DRIVER - default n - -choice - prompt "PA LNA Type of 1st Card" - depends on ! MTK_FIRST_IF_NONE - - config MTK_FIRST_IF_IPAILNA - bool "iPAiLNA" - config MTK_FIRST_IF_IPAELNA - bool "iPAeLNA" - config MTK_FIRST_IF_EPAELNA - bool "ePAeLNA" -# config MTK_FIRST_IF_EPAILNA -# bool "ePAiLNA" -endchoice -choice - prompt "PA LNA Type of 2nd Card" - depends on ! MTK_SECOND_IF_NONE - - config MTK_SECOND_IF_IPAILNA - bool "iPAiLNA" - config MTK_SECOND_IF_IPAELNA - bool "iPAeLNA" - config MTK_SECOND_IF_EPAELNA - bool "ePAeLNA" -# config MTK_SECOND_IF_EPAILNA -# bool "ePAiLNA" -endchoice -choice - prompt "PA LNA Type of 3rd Card" - depends on ! MTK_THIRD_IF_NONE - - config MTK_THIRD_IF_EPAELNA - bool "ePAeLNA" - config MTK_THIRD_IF_IPAILNA - bool "iPAiLNA" - config MTK_THIRD_IF_IPAELNA - bool "iPAeLNA" -# config MTK_THIRD_IF_EPAILNA -# bool "ePAiLNA" -endchoice -#### PA_LNA_Type choice END - -# -# Section for chip architectures -# -# "RLT MAC Support" -config MTK_RLT_MAC - bool - depends on MTK_WIFI_DRIVER - default n - -config MTK_RLT_BBP - bool - -config MTK_RLT_RF - bool - -# "RTMP MAC Support" -config MTK_RTMP_MAC - bool - depends on MTK_WIFI_DRIVER - default n - -config MTK_RTMP_BBP - bool - -config MTK_RTMP_RF - bool - -# -# Section for interfaces -# -config MTK_RTMP_PCI_SUPPORT - bool - -config MTK_RTMP_USB_SUPPORT - bool - -config MTK_RTMP_RBUS_SUPPORT - bool - -endmenu - -menu "WiFi Operation Modes" - -config MTK_WIFI_MODE_AP - tristate "AP" - default y - select MTK_MT_AP_SUPPORT - -config MTK_WIFI_MODE_STA - tristate "STA" - select MTK_MT_STA_SUPPORT - -config MTK_WIFI_MODE_BOTH - tristate "APSTA" - select MTK_MT_AP_SUPPORT - select MTK_MT_STA_SUPPORT - - -config MTK_MT_AP_SUPPORT - tristate "Ralink RT2860 802.11n AP support" -# depends on NET_RADIO - select MTK_WIRELESS_EXT - select MTK_WEXT_SPY - select MTK_WEXT_PRIV - default y - -config MTK_WDS_SUPPORT - bool "WDS" - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_WIFI_EAP_FEATURE - bool "EAP Feature" - depends on MTK_WIFI_DRIVER - default y - -config MTK_VLAN_SUPPORT - bool "VLAN Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_MLME_MULTI_QUEUE_SUPPORT - bool "Mlme Multi Queue Support" - default n - -config MTK_TXRX_STAT_SUPPORT - bool "TxRx Stats Support" - depends on WIFI_DRIVER && WIFI_EAP_FEATURE - default y - -config MTK_SNIFFER_SUPPORT - bool "SNIFFER" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_ANTENNA_CONTROL_SUPPORT - bool "Antenna Control" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_MGMT_TXPWR_CTRL - bool "Mgmt TxPower Control" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_CHUTIL_SUPPORT - bool "Channel Utilization Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_NF_SUPPORT - bool "Noise Floor Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_RA_PHY_RATE_SUPPORT - bool "RA PHY RATE Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_AMPDU_CONF_SUPPORT - bool "AMPDU Config retry & agglimit Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_ACK_CTS_TIMEOUT_SUPPORT - bool "ACK CTS Timeout cck & ofdm Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MTK_MBSS_SUPPORT - bool "MBSSID" - depends on MTK_MT_AP_SUPPORT - default y - -#config MTK_NEW_MBSSID_MODE -# bool "New MBSSID MODE" -# depends on MTK_MT_AP_SUPPORT && MTK_MBSS_SUPPORT -# depends on MTK_RALINK_RT3883 || MTK_RALINK_RT3352 || MTK_RALINK_RT5350 || MTK_RALINK_RT6352 || MTK_RALINK_MT7620 -# default y - -#config MTK_ENHANCE_NEW_MBSSID_MODE -# bool "Enhanced MBSSID mode" -# depends on MTK_NEW_MBSSID_MODE -# default y - -config MTK_APCLI_SUPPORT - bool "AP-Client Support" - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_APCLI_CERT_SUPPORT - bool "AP-Client TGn Cert Support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_APCLI_SUPPORT - default n - -config MTK_MAC_REPEATER_SUPPORT - bool "MAC Repeater Support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_APCLI_SUPPORT - depends on MTK_RALINK_RT6352 || MTK_RALINK_MT7620 || MTK_RALINK_MT7603E || MTK_MT_AP_SUPPORT - default y - -config MTK_MWDS - bool "Mixed WDS(MWDS)" - depends on MTK_MT_AP_SUPPORT - select MTK_APCLI_SUPPORT - default n - -config MTK_MUMIMO_SUPPORT - bool "MU-MIMO Support" - depends on MTK_WIFI_DRIVER - select MTK_MU_RA_SUPPORT - default y - -config MTK_MU_RA_SUPPORT - bool "MU-RGA Support" - depends on MTK_MUMIMO_SUPPORT - -config MTK_DOT11R_FT_SUPPORT - bool "802.11r Fast BSS Transition" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_DOT11K_RRM_SUPPORT - bool "802.11k Radio Resource Management" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_INTERWORKING - bool "802.11u Interworking" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_MAP_SUPPORT - bool "Multi-AP Support" - depends on MTK_MT_AP_SUPPORT - select MTK_MBO_SUPPORT - default n - -config MTK_MAP_R2_VER_SUPPORT - bool "Multi-AP R2 version support" - depends on MTK_MAP_SUPPORT - default n - -config MTK_OCE_SUPPORT - bool "Optimized Connectivity Experience Support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_CHIP_MT7615E - select MTK_WAPP_SUPPORT - default y - -config MTK_ENTERPRISE_AP_SUPPORT - bool "Enterprise AP Support" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_DYNAMIC_VLAN_SUPPORT - bool "Dynamic VLAN Support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_ENTERPRISE_AP_SUPPORT - default n - -config MTK_CFG80211_SUPPORT - bool "CFG80211" - depends on MTK_MT_AP_SUPPORT - default n - -#CUSTOMISED HOSTAPD -config MTK_CUSTOMISED_HOSTAPD_SUPPORT - bool "Customised Hostapd Support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_CFG80211_SUPPORT - default n - -#APCLI STA -config MTK_APCLI_STA_SUPPORT - bool "APCLI STA Support" - depends on MTK_APCLI_SUPPORT - depends on MTK_CFG80211_SUPPORT - default n - -#WDS STA -config MTK_WDS_STA_SUPPORT - bool "WDS STA Support" - depends on MTK_APCLI_SUPPORT - depends on MTK_CFG80211_SUPPORT - default n - -#WDS AP -config MTK_MBSS_AS_WDS_AP_SUPPORT - bool "MBSS AS WDS AP Support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_MBSS_SUPPORT - default n - -config MTK_DSCP_QOS_MAP_SUPPORT - bool "Dscp Qos Mapping Support" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_DSCP_PRI_SUPPORT - bool "Dscp Priority Mapping Support" - depends on MTK_MT_AP_SUPPORT - default n - -#HOSTAPD_MAP_SUPPORT -config MTK_HOSTAPD_MAP_SUPPORT - bool "MAP with Hostapd Support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_CFG80211_SUPPORT - depends on MTK_MAP_SUPPORT - default n - -config MTK_MIN_PHY_RATE_SUPPORT - bool "Minimum PHY rate support" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_FAST_UP_RATE_SUPPORT - bool "Fast UP rate support" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_RADIUS_MAC_AUTH_SUPPORT - bool "RADIUS MAC Auth Support" - depends on MTK_ENTERPRISE_AP_SUPPORT - depends on MTK_CFG80211_SUPPORT - default n - -config MTK_CON_WPS_SUPPORT - bool "Concurrent WPS Support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_APCLI_SUPPORT - depends on MTK_WSC_INCLUDED - depends on MTK_WSC_V2_SUPPORT -# depends on MTK_MULTI_INF_SUPPORT - default n - -#config MTK_LLTD_SUPPORT -# bool "LLTD (Link Layer Topology Discovery Protocol)" -# depends on MTK_MT_AP_SUPPORT - -#config MTK_COC_SUPPORT -# bool "CoC Support" -# depends on MTK_MT_AP_SUPPORT -# default n - -config MTK_MCAST_RATE_SPECIFIC - bool "User specific tx rate of mcast pkt" - depends on MTK_MT_AP_SUPPORT - default y - -#config MTK_EXT_BUILD_CHANNEL_LIST -# bool "Extension Channel List" -# depends on MTK_MT_AP_SUPPORT - -#config MTK_AUTO_CH_SELECT_ENHANCE -# bool "Auto Channel Selection Enhancement" -# depends on MTK_MT_AP_SUPPORT - -config MTK_VOW_SUPPORT - bool "MediaAir(VOW) support" - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_FQ_SCH_SUPPORT - bool "Fair Queueing support" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT && MTK_VOW_SUPPORT - depends on MTK_CHIP_MT7615E || MTK_CHIP_MT7622 - default y - -#config MTK_AIRPLAY_SUPPORT -# bool "AIRPLAY Support" -# depends on MTK_MT_AP_SUPPORT -# default n - -config MTK_BAND_STEERING - bool "Band Steering" - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_LED_CONTROL_SUPPORT - bool "LED Control Support" - default n - -config MTK_WLAN_HOOK - bool "WLAN hook Support" - depends on MTK_WIFI_DRIVER - default n - -config MTK_RADIUS_ACCOUNTING_SUPPORT - bool "Radius Accounting Support" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_GREENAP_SUPPORT - bool "GreenAP Support" - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_PCIE_ASPM_DYM_CTRL_SUPPORT - bool "Pcie Aspm Dynamic Control Support" - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_COEX_SUPPORT - bool "Coex Support" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_EASY_SETUP_SUPPORT - bool "Whole Home Coverage - Easy Setup" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_EVENT_NOTIFIER_SUPPORT - bool "Whole Home Coverage - Event Notifier" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_AIR_MONITOR - bool "Air Monitor" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_WNM_SUPPORT - bool "802.11v WNM Support" - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_WIFI_MSI_SUPPORT - bool "MSI support" - depends on MTK_CHIP_MT7615E - default y - -#config MTK_ROAMING_ENHANCE_SUPPORT -# bool "Roaming Enhance Support" -# depends on MTK_MT_AP_SUPPORT -# depends on MTK_APCLI_SUPPORT -# default n - -#config MTK_WIFI_FWD_SUPPORT -# bool "WiFi Forwarding Support" -# default n - -config MTK_WPA3_SUPPORT - bool "WPA3 support" - depends on MTK_MT_AP_SUPPORT - default y - -config MTK_OWE_SUPPORT - bool "Enhance OPEN(OWE) support" - depends on MTK_MT_AP_SUPPORT - depends on MTK_WPA3_SUPPORT - default y - -config MTK_VENDOR_FEATURE10_SUPPORT - bool "Vendor10 Feature Enable" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_VENDOR_FEATURE11_SUPPORT - bool "Vendor11 Feature Enable" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_RCSA_SUPPORT - bool "Reverse-CSA" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_DFS_SUPPORT - depends on MTK_APCLI_SUPPORT - default n - -config MTK_ETH_CONVERT_SUPPORT - bool "Ethernet Convert Mode Support" - depends on MTK_MT_STA_SUPPORT - default y -endmenu - -endif - -config MTK_WIFI_MT_MAC - bool - default y - depends on MTK_MT_WIFI - -if MTK_WIFI_RLT_MAC - config MTK_RLT_MAC - bool - default y -endif - -if MTK_WIFI_RTMP_MAC - config MTK_RTMP_MAC - bool - default y -endif - -if MTK_WIFI_MT_MAC - config MTK_CHIP_MT7603E - bool - default n - - config MTK_CHIP_MT7615E - bool - default n - - config MTK_CHIP_MT7622 - bool - default n - - config MTK_CHIP_MT7663E - bool - default n - - config MTK_CHIP_MT7626 - bool - default n -endif - -if MTK_CHIP_MT7615E || MTK_CHIP_MT7622 || MTK_CHIP_MT7626 - config MTK_MT_MAC - bool - default y - select MTK_RATE_ADAPTION - select MTK_RATE_ADAPT_AGBS_SUPPORT - select MTK_DOT11_N_SUPPORT - select MTK_DOT11_VHT_AC - select MTK_HDR_TRANS_TX_SUPPORT - select MTK_HDR_TRANS_RX_SUPPORT -endif - -endif #MTK_WIFI_DRIVER# -endif #PACKAGE_kmod-mt7615d# - diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/MT7615_cr4.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/MT7615_cr4.bin deleted file mode 100644 index 741fec2c0b90c35ee51208755f50efd25fb95cf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122644 zcmZ^~W2`Vt&?I_n+qP}nwr$(CZQHhe&U0+rwt3&p?w4$Gv%kB$>PKhNQ`0pP$?Au` zdyCv>#FR#*#rGp$Q*0dWbM8b_*|x0VYY#3Ho|X6PBY5VAs$0iFbu8#!u(FuAALD;0 z$7`1n#jRo}(w+$$vVxIJXL6CVE_gjUF~_Bp;?nb(Y);JYX{TPqf~>5Dv%iKb32xIv zol*OW#33{}#ohR=2F7E$27VN{`qNnlz{3^e2#Cd@AV!VCE*3Cv5bhMbhY?lUnBKB@ zF@JLr8!NZ9=oWeWw_2_mfq-fN*MV;01^Xv#FPVjUp2SGsCc=VF3ipGiJGJMNC4s*= zW^h7`0P*G^+ZIJ0d!!qfKx^>3!n@r*u~02q*kf2togPYF5Ze16hKg^-Kez?2g+HZH zLj!xd4Z?zmsshr+7lRtia|@2=j43){4_=hXK%crgZ=oFxi>gPh`p@8id;#fLjD%%?cd4!zIeM|N2{_!0Qwpc=942BN_ z{PTQcf%AE}pDV&tqIkbah7r(hTegX9r7B)AZ1|@5LXb3W1<&I^m2OG|yi7l%8tL0= zi{8$$%rqUE8~cv~MSza@dy|*B#cV(BfGk?e)-c z@a@s1O1MH=-@bSkK4~*+&{!g0;s{QEHW>a{z*6+>vP0vhlLG6^y()S~R=j%%nPt2b zwMYF7u4BG(*2icO0y;2RTrO!dV}7KbtI5}vc^XymQlN-LD}QWWCmUvOODICq#m0@^ zyy7YIkZDzW z;+W0f2mF_317SZ=7$RJo59RBb=b=f68g$sV`ReZdBKggUCDF5LjRkD`MKlXh#wM0X zE)ajsfxj@Ly*i-)0o6-6GyYr`BAlvKrlW%HzC4RQR(fu{$nHaI~lbO~==UW}< z`8ZZAlx6zj!kN-tev$<@el9%v-m@GeI+9~RUQy5Cl_vk%AZLD)k z?>QDfci7MffJ)Q(yPdW^q{!(zAMK}~R-JLh+JS)leCB*aUbJM#KmqCvS_^)jG^>7+ zcejHI8G0#N5q1z4tb#N!3#(|&TU7jj+{j|q*e!)-(b6{*f$PZt{*?Wi_}+wv|ASxe*eiIq5Ymut`^qA^Aew29#_fWNs+X9J+Z;;!mGdf!Ln z|F8h+923b{7QQJDYP>QNg@f5`@7V+7aIVgYw*CQpM67Vj~{4{x2gP>!=2=aw5*D?JV3A9vFw(%-W}T6lX- zS%V{zyfInwhtHiptFm9B%TlsGMOE7b3f5vD5*GR=%*tWA%n4_&gg~?g1zdTuzD`05 zNpQ&XA4yVwu+J(GN{_v>GZ*jWpso`jQ*|nhhLz0W;&C&~o>ob}sX5mbd zI<~*#QcjW6QW!8-t$YYYC(&|sge@S>#yB~hFQ#l=Qob+N<)^!StI-amc?$ZAo=0h+ zHL{hV2zkxchWpP)&OR%*H0`W^L>^T4y3A}gCj!8u-c-4+&vzAL1ULzXe485DA3k1C zBHASONp6_=)0O1<1NdKr6CQb4-G*~zu|;FWcnqP((ML>Fwz$Iee+uxi>^TzrVR)OH z(MPDgqOJuM=xzHb)f9X4iwHRTT~D|e|D&TM>UXiI|!E6|1m4b$Y(ayh%z+1 zfy#vL$~L<3Caa=B5ICBog`D*_egt`zMw>}2mDI<@ffHeJ+C3iK$l6kKK&y>fO+A-iD~mBVrY zq8So_^L~laV88@jv{dVf#6I@h&BeL|ob(dTd3947r}0 zO~da~eOF#)p#b_1>WK%FwhIwh=gu+xdCpg&sLh|$5(ht05H*xfM z?15WbO4NNkF9_{#g8Kl(R##i|J!+gRgxU`A%Y-%=_|R+~kCl$Nch6e|%}L!DKDPjM?a);vVVf2kqZmWx ztsPtK`l^;H6_}?)ci!{ls&rI!s<|JPOzl1UqUW%xEIUcLNQ?d8AKF#xn{+Johc+rm^?By)a_A@Z}s2T}e z(D!db@q5-9Ulx#;%rcnJre&Lyo4U30;*zKTyeFFYyvNx* zs1C@xrJn{yiENO-cZhO{nMhq{%|`9QMw<-dBS|EoTH8T4(IcQ^h0 z`gc6`80dEfX-YJf*FPBF`fJTmRKf8{3zeOZO%4K#1=paTqt;T^FC)0Hzo(4cnm#S@ zVR!9p57&rd7}DAzlbqmtuaW_p{7Cl66HU-mSQQfu2YT(wuAO@R0&c~UuY%-;LcrAF zzI(e)VuZv}x5XP8_-j3d>}&eu$)>+WRuVNkPgz)@Z2g22?Z?72<2+l`$9}C*QYa?ZG4H|s|6koepH5}`JrJ||xBdRU3$oN?X`Y1T1 zXV(`Nr1upcUi?RDQ#W(`v*e<&fKtO22G?c^u-|Ukt&J>@y#K% zwwf;c}Q&cOqv(ts~cAsk4iVL<}3OI-0R<|dHdfc6tB7ka3Kt$c-_dF`U@ zNSo4_s+JrKr7~na$102^%}7Y}-<813L8Xro{5OxwZ8B=>uZKUX9DABZrwc03=TL_u zVIQw@KE%e!!xPdKPw$L>-vU(c09XlRvA}^1P(o$K>0tRR&vM zbcQi8gDn5K*tVq%qf*hh}#ybP|D#tO>)wBCI(LdHHg+U^)Cji zQU0#b*#k7EIfb{OmOuf*AxAV7ERT8x(%{Z;M^{H-uL}o1LME|`aQV02f88MrO|L8p2R{ag zVOaO1+!UYSD z5Oh~{o+PfMI494%Iirsec2j%#_kQU}1cC|(4hm!NQMs2lc_jBlj*)warJ4X3Dc{;h zP!RWm0(RXlxV?YY%a25bnVlBoeT14F7Ot$-Ql zJ~D=zkzP-*sgKqUW&<~dYi-_*>42D%zm0b`86o~B`*yzUGpKYqOPMG&H`D-E)8~N; zDv{xR4voAirw$RebILXu%YW0B2kt;8LHr>yNx2v3i zsr%OPlEtS(yX;rkwHvttIoZd7e-D4Y2&Q(2Q&5)`Mna73ViAT`7P?zS;a+J*K%CwF zyhgU?VBJrTK#!`#Dy84h`0Nt3Lz$Xy$@X^S3RhSnJTkRZ)19xM2Xxh9J4)>l82Qn( z_i9Zuf+W(RYrec+`Q2{Ywy*z*ETaxK+l~GFp|mG;+mL(xkSF%8#EA+v59lE znK*2(mKY#zaLp06lkFo@B1K;@5lzPWwSU?D4XElb3|_!GRJ^ia87ww~$6h~pECm_7 zb`#cPglOQIq_R9&-SM><#bjePtsX#o!XJg1<47`CgrP@;EP`!ZKe-4EQ~>DZfK>uM zR*V+EHvea{(n>f3p)wdcPM4?pDf<(qER*8Cjtso*BesXjXqJeRHGkH>N2e6zOVKio zhVCVRy(@*RGLaUziZM#n5Z2vKVihetOKCu=)A8uN#96G4^!)| zCJRfUAdbZvUHv7AfGR0N6CVP^ng|i+cg}G0`Ri2_&NfFHNz}j##nG)|6sni@?~cli z$bn(X_q&C4+c(TFsr!QJQ++>kpcajWLF=m_IU#G+I`fm%fcpXNK%3!1=>mLngb-N6 z!5V%5yItfD*%&^dEuzIiUh~E{xhOs80N2I|+75=7B+w0!=(9`TFKs6qARy7Rsj=21 zL$SZzIn7t7iy`0D$-6}@LaeN?dtJ|1#{xtw#nta?jNh#zIAu)HkE}nBIzXt$s3+G8u;<*#l8hT==gHpETYPE!;__-tjnKSR;Kz zBEOv1>3Khn>8&b~CYJHcj)^LTZ?K?3+*yb}QxpW}S0)6>W?$dV2-Z zW0CZ|?&jm3=;HcT>B2HBsBThsI6n=MpJ;&Yx(xo*%O?A~5QnztFcF^?aM?&?2qb_d z0&KOyAbes0F&JB#Z_dnPuZ?l(xo`6#7(RN>Ffj=nF+c32f0E%0Ty7D*Iu5;=7)Uvt zHJ2mRRMwERy%EID?27=3VZS8R1f!aN*$f<*1J?oSoXvTQgD%gjQSnjszK{PHp)ys3 zT{jyImlW8*fw4jT20)UwWdNc9or5`rAKJWo0kAa0_{wI7OQASp8cW;aE} z$o(z-^*xlGu!xejg{(`C*_E3;m1Vk3W7g(H^PZ{-SzGBIO?tN|XTZ$d`sk7lr+Sy@lWXGcH(2UWcn&kk@Pr_(X-&jXGspp;@3YZU>W!HQmwxYz3! z8{|-wT4kSOw3=(H__u3VJndo*r=zs{{7SO2FG}utnZBK31h|S|R|yMv?dOfiu_>Bw z{{XD0{N4*?HAKZ(v_GagEV|Q|s3cnAO2+)E{W5Vkf+~%^@kLCJ>VS%u7IJsJ*=ZV9lO*B98a8VW6B%>oLtP7DeYA6Q*CLz ziM zJk4Fl5c#adh_hq(A@w+&v!?teKQYCWAfcu7pQ$YT;rL~c?(05l4j`g>yNJI zqUJx`61~PlbWm#dmg0}%UR@9{dxamWfgaA|(MjAnYE;xWFMxd~dbB@7mwhDfbbcVO z*X9g@`MMj6_-?+xx9ICBbo3c?O-jP01FxE6w<~8ZF6i6^_`M{QV){e(l>QoggG~9- z2A{(*7X9|`!CQsE51l=il;pp))YK9n!5@=Wr^M|y9WAE#ycHHHXf4O-3ookfa<5MA zF#Lp5wRyKVL5h*-h}_|vf__(avE8=(9UfzPutIaS<4e01>Zr3_eB0#X?m7pdy-LHV zoljLI{HYVrorP-EF=;~?$@9j(CVbHXTMM%=GFWeZ=Z9p^I||bj3}mrfSw{XBm!uzv zxG`iwhM_FkX0ka=x6V__7BT6ocrf6I(vDdn>bezm^3k7U=Ew_jD=I}g7QbpJ0L$~G z6OWx%vO(?W=}nI3EmAQl4?<<7>Zv>G&3JY~l(6CU>#I;4zp&AsMPjv)=V^5J*lNMv zpvYF+t1DjnUmg82Q0~*ir&U?$!vrh&5vqxhF3Al`i%A<@pH+!DAb^A-GF z5FP%@AqI`Y3|d$+Vod~|eJaR^mme+KMzC!{e_R>2IZ9H}Wyv(}8q*BTO7Jgjm6yjcLdzDl_GN-K8UGYR2D(0S;jF6cr3!2x<2t z>e7#V8D~aM;nn2KQ3z3LaVG%=)8$e#oJM_(pk`A1dRRS;`DZzYI?TU?F?B0y0F)R8!Gj9B+S}1<1!4?yF8fT!@ zv*j9R!(k|s)eu(v)@yx`db9k@aN4&3>dfggCHkDjr`^+H{u+rt#4I~V&oU@N1{s52 zPbWFGI6yMOZEeO48Zl&+d=3>lcaLv#jF>H+0+dPe+j=ObWMC|CtWL*_9niFA#PXt- zn&s$YC3`ff6@4mDqL!=N>JrcvaY8F76{M(e5hS;)N&7lPjhK$Sr9S_7BqLfYVA-22 zzS)ANLs|PGbOZMOdNwG^zvuYQZQ8^-HhOYaec@s@>FqW3W8$oUc2Hv&YWxz@GL^ha z3szz|Z$-4WU9qh4CuplbznfSw$a|7GhZKsv3lpZNX9-Ym)kyz0Unl z$eR>Rw$+9*aFSQL3~UdqgCgB@vT7rKl$1d$<>L-(#8J)rH}=k_=_SG zh2PiC83-_q^7C^6W6B@DM~Da>3t`TOmfAhrRpx$DoB9Fy3cl4pRnTkKlr6?&|Naw& zk`PPSaPhbbNLB_|O;k8~saaV0jl3{QJsy#sFkkIbn$>~~@9S^$Cqp>Ej7N5u-T;DK z9t5J^Wu11>l{h0WYM{;S*at)$C=-NtZ*mmr6)VOIKQv9mAr;3&-HE4Y|F;)PlMXKo zOvthhF6flut@tNOEuFU}XmKF#n*Y_n{Od-3`*2>vH2DLGHWR{CGdl4<`6f9ybqy{| zZPcL?^O%9JjkBo(l6sw%eZHM=`?q183dra)x&L?mqB;gGr4qoxHeFBgZk|=k|G{_t zf8je-bUG3E`JYsq8Y!CAaLoN5{NDe;hx?*6Ql@$R2DrQr8&PgM+$e@5BO456#Jzvs zIJqQyig6?(-I7;_-t)}C9GEpEpA$2wDfE|x`$zL5uNbY;@8)1Fqjs!E=C9vw8YNWt<=!@C z(T#a~+c2LmUK%98Vt!2=(jBNrx+lYfu)RRknEvJrKNL&|hqH&iPR}AR3ug1# z!6S`qWk8E_Uqo>ROwdwb6Lh%xfoCG@W0IEe;@uH8`ubUJ3B8xobfvw5#I<8IZ+v)<_1(2D4 ztCS!^v-?x^x}vA6`fM5mq7dBQYT}_#lb}lIbP&IR+$xW9E8E&jSVnX391oE8LNCyf z=^{~vezL`JUE77d_g1%fiAN4*#}v@n9Y14P?Zw+F)K&Ij?43dcwJtO99#wxiSp3q? z1ZfnhXY>ee4iS{3VcZDRy;+^#3}9`>5*ahQAjRimz@Oj+KU6klif_Vcd&d7I=j;>1 zBhxU?Uw`ACn~4V7tbklT3o`u$?osCgOd073!0FPLYzgD@k=Z%jt$rsdv|7K*G+t~@ z2FMPy)fQ=|`}Lxm6A>KxqvZbrzrLg5-E1u}7{Yla@?d%dIt}*6=L!5r1Su z;h_!E8@^1WI%L?UCfWgNSjssxmKF?T=(Gi_n`zgEPEF9HOYB)(&j(ztz5Z-`y@Nbp zW98a*C}E{mp86tHCgk(|rlDU-u-DUNIjolFToDz9(&(M(a08uH%}{l^KqAYWBZda! z({;onb^J$78zAuUHwyk;sba5O;McQzsO>*3uM` ztf=Nt1?FdwmT`tMSct!ZX-(X~vIU!=h?l*qN9@^d+IJ2`=|$J|>KiLZfoNq{yb*9t zfc=Q2RYtG#&;&GSX+!!4*x1jl4TPo(_eyOWMb%JTO)~60VDO|-E&|V}U%>q_W`qbl zVq*?2AIPvT>c!kB5O^ZoF|Cd#?#-68#r&^;0+zQIq)XDvYSJbi<4?Zo(cA2}G9d_O zG|wo~xr;?v=i*q^8$d=w>1d`S?V_0Bzwil|Pi7lcwY0m^W~&M(_JQ}5>*B0Z0LP5=Y*8?p6v{5I}_xdGC zwsl8OTWZiVZ?Z~MCShE2(W|i5Uq4Tw96z&$TN(jC4o#!B!n8wa_3F}u@9V^SXFy~9 z;3^q)a&w&|94MeqeEi7Do>d2pCb z36e-(>(F;2pJF5>yKE6L@z}XrX9nB=+iZZsgQ#(NBR?hV;ETgrxQOk4WIZk6RWaB} zQh&lYoRbpHZ4kj`Or0B=Co9h{{gH2GI?|`ljveQTEf*7g_SpWQ@N4U)cv7Cqn_j8@ zF7XQNNPU$w>GY9vKsu1@4hY{K0C^zxP75Z9hLzA)F#T5Z+S{Iten=$@8i?r8P$8F} zwh)dA0gGO|8L1!-^&a(dIHi|n2Bls!mP|G4zS}(*l>NI=R39?FxyDIo{!XTCw);95 zazLv;z~H7|X!S=waOtg80r1?#ee`|43~5y6S!{XYKQj7;D6wHMQD@3c_Sa zCXxnfSjex8s&uKwvN-LCpW!Bxu16vzB*~0MTr9&J{j4mQDnn{*IDA%Ml?XgDY>9xQykt8n^TCQ|5 zCLJCuGm?An$yck#@U9}wm^bpFCz*2aLkt=T9>VjMxMff*f44DM2;*AW6F^~h0fq0I+)(aI;+x_Lv z16XWPL^=q4Y%rF?MYK{LatT#P&An5gh3Dx$C$sU*fis&~J3U1-{M1Tp5TrOzIpD7% z{~kHS?p}T8_N|pts1al702J$+&zjQLT+<-k_f7nTM(l#Ga?ISQlE1&?Hzj6*MoUaqDeDgE35I;yHQkKJ>SZl} zUeaT3%fVIyzF!fjK-*2 z<(03Q0JJ}^FUh>!rw5gF4$pV5>>$h%(|#b?zl{N}iDM`m{+NjI$p-Jd8Qx_Vs?l0dxn!0-edeE+RHm&% zo@FWs75f%4yOhQ>R|gB6Pc#%ZlHP>ynT(x{MubV{g)?D*RB~ppjmbCdsO$O!342G{ zTuu?r+I^o_CiaHN{23tcuCx2x+RVse11@!uWo={XxJWN;i9E{dhgu5xupNO>{z8KE zg24%HQbz8d;KT8(I9As3)d!-3zdR}w!QOu7L7laK9a%4B+LU9+TjOwjY_|bJPZpfpN$A6>3s-D^2`8L)zQT<=2vKQ+k^c zYW#Ur%^k>QAf1!I>3On}>Aoz6H#IF_ZrN+T4aqhpz8v8BzLmD}XNauN*v|@qk!dp7 zl??_!4So|4>qSQvRy6-htazs&Pq^k2mfsaylYho})C0$-F3VP1Hkox&6K0&zl69PEHzCZ%G3O-Hl!MqK#cVvbn1w)-ZBxEHBD4 zk~}TpPO19&i8h0_eOrdcU-QIa)TRkr#wH~uFi%k`zjaG7)%R*4X+uTFy;(AGtaRYd z^bmqKH9k=bVG*_tSWKmz!)WP%jY_DaF+ZLrA>DY!qqyT=oa+X&dzh(G>m=G# z_B&H5L=o znop_f0K$m~;6!p17PgVT@i|`VqKMy*6vPc5N@+cqzr06s>d>$xze+Q`qZedrzc5T1 z7TD^9wGeS0`+kf*>f!foc*^_7s?6$CI|2h15AVB}49+<<-BE;)#=g37AbD|5k`HGr zwlbhUO2Jl?23}(Re>V&8fP)}oRMvPI18i%;YVG;}1rJ9;Fx;yH$GcmObqA=@d~p5& zG9Q~e_K+l0*&YtHlzuS;mUwsstjG8}6ZBA37zc(C+^;5s3Uxi0B`Sot`aDF3sjfXY z56(&+Yj6wXLjEU+nsckOeZ+fStYMX_vWoXq&-8QPH&#Pr)^k6(s512?UEJ?nv^-X(K}Djv6lE}tc9ARU!h*ccyk zT!mtY%a~qZ4O~N|G0}1!<|4R7J&D-F{AZ&E!!v}_ zvIl!sP0RxN>|p@|(Jl3{bt1gg!PI|k&ad-xPua?B4|J-u^5;%k1|7a_9u|@d>V7$z zdC^+?MHTQsPb0hl?KOeom`2op8m%V(N?xEgUW*fxh$D0`)hyYQRP=S}-VD zf+{}{Fb{2he6KljOyBw^VNW)#V2Ph{JTaJH_55NSmCCiqIE3*ZxZwUV!}$|C%mIUt znSrZHr_f+TeE+$-rC`F6=RD8wNyKQ4z!*lQ#S9g16n3WssouuOFH$jlc*O`P|blcdL7Ok&3f9LXcx*-_w? zoYB0Qr;u>`p%F3?$Y<|=-2c+_MzPFIlFA!{y!TR%Qb+fJ4DEcN#SsI4x{l;NDsLL- z4GB9{8nk4w?P8$F_}xz-Y&#cRwoY+)n7Z6jSkpUl-IVK=t(% zaE}cF@<_9t6Iph&;VP&>vH` zlQvya#958^zS?AUJ}{oiK&Od3EaLWk>%!N?4!v?GoumLdptF*ZfadfYBAhc3z4y<{ zZhnnZwr7h&>`koQ+zOo;RcEMy0L)>R%l3}beJ7IJiK)7BK@6n9fc75m!TFM$2yb%( zT3d2T0aay9w8m57m+|SBg{ChQ!qfUa!&0Qmgx~9E2OV-1gSU6#vUAA@zJfQ>Jj+vEGp}UW~k(_ufL`z z>`_!nw@IQ`i|NvzToYMe=SB?u-%zf}_|KlI>n~NzUn+ou-QKEURPQoq--XkKK++y9 zIr#q4RGGN*aFiJu?P$1`Rz_cWXGhwUZNS{a#YIo7oq*mHP?0RDME0}T4)Lwa*jCm+ zuEP3eku7>M82~z>qYZ}6XI0g#vOwzeNJDj}q zUhNw&Pd>6QQpSBZ6g`)AZlmHte`A~*^n~}HlRliB>n4!;9g0w9pTxq1!IanN$e%D^ z&0@0bCoXSe12JGn6oH+ht#Ie^Qos+VRPe3v=0nbZerH`~l8}r%V4Bv(>b6dr2x_0D;6cE&O*ar;yuMo!Ueucf=YX$rv7}Pz4n5({@`Mq7 zMNO#4Xb5yCnckfcL=Oox6YuFMbbO4ky_GMFm}N7AE3CS2l&z;PO%mH9UI(-=!+ULj zAk~)+!kz8XUBy0!)5Ne5f%bsZ0z1*K%28d0#48~YIXZmH#m3N>* z*@^&Q;BL;7n_DC%#&mwv9TpPkV43*n;{qegBnEZ555G?K;S(w8)L#Z^c{({&_EIy2%$w1VwWIKC5 zINPYN{Zs$Y!|GTE>0^b?%Ih5n$x6Ox8dC5k%43Y}t7rexwD9AXg;>!x5S~6bpWJjy z1SF)F8HH>0_C)hGtH6yJ(S5mpqB~vXqNIAiuJp+02ZOlvlpn7>b1d`^*^HGIv_Gh4 zO5$u6NISEK0-v11@#jLKI1EJG=UpK$>qdWh=L6V~TL->cdj;%H6~ue0+x2DnOU0CP zn0ZG@EqDW257q7^uk+L|M`pQ>TZ!_HZR5#y`2rcy?@;DH)cJv21{yEze&4vmad|ss zjoi=&UHkV#aLa?#aph#Y8OuYhMG;ib{u>Jds;31>*slM44vIo{5@FW3+oWe$pGJ!n zci%Y(_{acBvtcW-HF+|cq9QwDio<*79l$dD?=Z?4*}#rp3yl(5;v-ZLcW;6@jq6`! zHDV+nc*2tVw<-&tb9d1N>bI;?6zVi*F{E)`SY9*5|lz#PV(8q$xk=HC1nn+PqUt*))@1q-eKex-yWffST#4YYnD*+w z*Shi7Za;FrbX|BreFrsVq+j%sk@%uhU})5ky29Z#x!g?xOVRhv2sy9P*isrPyjtRM z*$<+EAEkGao!!~tKK){s+wYQoyy{N^e=(HI@P9Ml>m<43OD3l zu`=#vrfCo=SU+!Wd1Yv06`!1`8XgyPSJq!M!;nQt;jTgd67Y80+E{h2TMh7Y3ynzK znh|v0yz6MT8XMhiRvrq# z20vsA`-U(LA^D&{`)unSz`}mQj`m5Jzc%|qIfJ%FCdk0Z1i_BJLb*56(T^`rQ*u4H zxF@F)xuSLKP6k&clLG_bU`X=;K%)@5VC~Ec3|ty@my9HWQzWG<^e5 zYS##6&ys;Cf+JJRrO8l{7nmN(;qFHs?(ZrYI(j{B+XNK6P7V|5VRUvI0ogpCei@ZN z{;(NQV*YONaaVyhsS9>Sd=~p~cCtS&WFx?S6!B~hgL8tGentr9F=9cgbcy4y3i5I& z$Te;V-q(|7@#ZdOg-%5Ar=@iv7|e=d00TvSr+sX$gyLNb&s2_daI@} zVe8|#F4zJmhA8M$%L;&zQ8maB$t!q>dnGwI#xhsDjwF5Ud4BDLWV6cvk58p9RM_O( zu?tRMORSPw#;}w?YLBn(j;5+6KBWH2=8=$Km^fbP{^>4`G@~3aYkkPZYjZRYgh=+! zb1Kai*-3}IxGNID+3kZS<k+e#2P1d)DJr>-iOm7;wt7&0vwhsXCPK$byaRTi>IN1 zq}10C=-SzZbC1lS_A!(_QRdxtV49fQpM^4+y~>WU`T2JJO_W}+HgC#jR_?Xx=p@rgn**h3;)kDHT) zMmjR!dqkSiQ4G?3R&o7CpLVABXL1dhaql-;(wuhp&%^fOW1KUD`HB5#->eL&>sUHt zxzK`g4x3P zt~z3flM*st0#3)PjmZ^V=0X7|!R)!ca({wNzm7@!5nx474!#TL&5g%kWwErcW;0Vr z`i9F&C&sy6BNH00|1(t`3aMjRN%Q_uiyt5H= zlONV%VE$b#Xzqgp_iWJG5~4l-$2088=k}0#^wGol3&?6E1b|D7F) zOuXT{`C<>(*}4zq%R#{CaJQG9bOKVToc-{KtwS9*QzagaO(^6bBh zaiS`=X;v9Ohdgn;5FUDa{1yQHnSp=0@AMn;Sgzj~H|=KB!g3T()x-{7#8P1^%PS}8 z+3#P1{CTUXiI$CF!xW?&2;+bUPolc9ss9ypOyf>-aHAL(B8REe3_$lzpx0L{@%+2> z%z32)uH8{TQHJjQP!mJCK6{I(8>Y{}S}b+kzUrz(b@?lHN84{L^crgi0SAEmZJY%} zKlDFk`a|tgj>|?1_&HtAZ`hy39nY@3_5$T+3uE9Xno*{d@8+6D0}r1VvA*PQQlB^v z__d44=>ODDZ$NNaIK#c?07vhm=dwYqt;jgJvYz0UJoFG+eo`j_P~FtTI&P)Ypa-J( z(Xl&Bb>TY~r_PpL%wRzpSo!AUa+Pnc%G;#TR|nhPJ5P_^A)9f+rkxcfU61vPc~Xh* zA6v`Ag6;$cbJV#pUmgK~)%YO$`Nw9U3ffFvudIo7ncpE?v+hk&sbw44v+8#otHaNGsR-=yib#%2@NHH>`DN0 zwgI25AJ=v+o^K=Vrjpu_>MfiL1=F7z1wtw1(Pz}+n8w_P57aq&+08IwEt{9#u6W>d z75FS+QtIF->`3&RTJWhMIgo`rqJt(%G?) zRR@TpD=mH+W)zmEwOh>e%t&deE}ea9sU`ro@$&(9z_f+k%{_n-HVezK<{>!X%uvT#dG~BF8tDD z`3;OwH8rlUbV0f$MLGaFdv}*y_7Jf$WOQ;dIqAQ6sLx4Zf>-*jE+)zL3qK*W`wf;O z#G7K@`I@5GkN<*}7H>AKR5qa@z1pUI^-BXlmc0foyc6r1v_UBsEP7IPo9Ab2k7btK z2io3{Y8uQ%ISQOdhtFD2R5?LJ{ob{NTs7vO?E-u;D8V-QZVOHxw<@5V^o!#RzI>A7 zdpj!iMaZ*#4%quD;U-b$HzUEjwmKyPCYK!6ORxwMeXlq@*iFHT_`>`cz>ggNqGVJY zp&cwAT~;u#rKV(%@{?;2y5zF^ubWB)4Xz7MHP6GJEncdxuR{d3#MWL_9=n;Zu-VzM z7v}GyCcbj9ssHzj+lM|D#PIZ`CCtUWH&T{NU1yvdITEkkZGpYcuL7A;z@&JQpNzxW zXpR@GG4LkpQ=gCL`dmy3o&S&HKGrtugUd%K?M;UL+^u9`RDRlu?^GD`xNVJDa`5>WLpvRqfw%N591N4<)RWQ#x=Nbfse)=a94T-*Ve}h~9Y- z9#PBx$JaS6i^2unb=$Uewr$(CZQHhO+qP}nwrwL{{mD%(l6P2DtE=ajqj?}*J!Z!v zlX%5!V06x+pk7m_3ijK31P)g~`_)X4W&OEmvl2YGP;Y5PwKlNyZJ%+jMoR$D&x!VV zlhC;|`Q9gUu&XM!=HW;g`!7L$(d~w}q+MB~NoQ8xs-t^L4g_>}qC%AiocO%F8*vYEZHmXlk-0!3c=*gOTnXhM0 z_RdoG{`!c`I)_nu8V|r9-AOjk0>LUWWWJvG(f9bttOJIfbKpZ3%T*O*a za$;W|`jw{F{RKzUTy^ZxnpMM}E@(n=?MHPok_Zt|IYdkT#+O0RwrBGDwG!dXZR7OL zFzuvL{gJ9Hc+21Kgv@_nd?)@B_q$gcF-z<8>}jKObiyunGndouaR_vJ*8)ukE9WC00`xW@0Xuc#^XMPcC0`Mi$$!y8 zegiElzFH1B8h1fAcqZBieh zaQ9oC?OgVv1RYSYvYK&e?2av4+#Gl0Jw>X|)e@ef!Ogww$-BJ4?>1P`XDdNMy6m#* ztUx@z*FVmHPT~;ykBhMYWOg8%=r~Th0r%Z1e8H$y|Fxu8=5?7AgR(lHfc8kra?56e zy==T|TZf%@%^;{%l<1BVW2lU(OVdCZyLIObCoK~pKQ^DmDVZq4r9A=s`U-EuqONKr z{YR37%rEX?0#Pik(f$MmiGg(UUi^^)tsHr&Uz;1Z0+ASVWy%c=hkbdTFPzsv^?UeH z9<=AF0~Csjlo;$=-kgtUdMC`0y!W-Y0+w)3Ysi!aJZOeXfN; z??9P8t|>JM8cwayEG46qr3Fb3kIVPLSPDSXHi|xgdkl;@8+u-+Vy!UFhx9T;=L=M` zR3I3jBJp@sQZ9x)fCJn3I}r@2dHAWa0CllVpY48o9gL%w2ExE31AQ>S&~;P(;SjP8 zuhKqAS%_Fgz6q)P5I)^rXHVafMZJfMA{6uiC7=z$n#b%ANvfPQy%oF<@SeGa zCrK`PtIdR4+)qP?hh~fq(Ze%UU4CT|Bo>e*_j%3rFn((sk84mN5HqZ zsxg?`y!&gRg{;kNL1^Qybs$k3Izql?Vr&ofm|%frWj6YV;ny7_TUZin&XuJ!)ZIKR zLqIO5P5NB4Ej`qSwx^2Yap|3xaLkIz31Ip>n14N!$G2ZYT1xyTA=JvL-<6C8{9xqg z^W=A-miBOFd~8U0^m`{>x;c3~VmOhXOU_9%AV`^aLOMMWcQlI=tyDBjt#WRX=W`wq zp>Fw7Fm5JWA$!_b2+>>!+{~d)2jWp#jtxoTRn!a`bGg0#B+<32-ozmM^)WUB*TZsRB ziX!IimV9te`FKt6erJ+Kq4Q0F4f(!ucD@&bn#`=SU?kB!Fq040gVy_e z8q0s8Nh zv4KX^-xUXXlKIFQOqdh<-A$lVP9{PbC(s)ka6e7E2l{aodRtfjDiru@4uJJ8imrpl zvq|gBPmTTM=+G3pJ^gpbXs;DvSTGkc3UW$t_-l#75$vj1Ybw46l=U=4$xv2E zB6j1n-7g^{%6Z`E%1ak2716TR2+qbA@-2=TPuvr=1MfGH4FcLdH(KxQ5_-xkbbsg- zIJHrKDUFzE*!J1yWFOjX6_HOt@&;>1i)r|k+(mwcE0589qV|s6;$V&ou7b4nKqAe6 z?fNw(-9ygMr6Zrmx96dJWKlL+X+vmZS~#Y3Tk={Gw~~CzK&S&q*IELv_gL5JSplB} zyLxdE)^7@U55-QH8vq6#DNM2cx+fdyxTq3Wq@DYaEzblY=7tHd#%`~$$WEK}k>gQXSP0Zpo0K&=lGFfak_99H4 zcve&gs~H@DpG|`_?|h~5aa$#T($xC?&8n@^C+>Y)BxExqH-?#kToK}qk|xGqX$t;- ztim!ghrfx##PtP@MU6h{k?>{R`+if{6FrQ?=a&}9N>uT%x0MRD8~a?So!uYC6{_*! zLZ=$D#+{Ij*><5OMTm*4A3_(5`iUo8KT7h&AUF{ZpM0IjHd}ypMYoEDG{@YCGMu*iy7yE}U5u8dUT&t^dt5>ttVbPOUB6TOzrv z>j4Q^EZe0EKK%*!42SnB>i3FiqO|vvKgi;W7u+5weFI#teP-X9B%N2Q!s`ekJ*8ro zKKLriqGA3Viej+&2giYY(5!K<3Nl@2@U5xw4GX5$v+2!Vhb>Iz3+|OU6jfZCC&pI_ zTHkRyFS{Q?W=A>s-AjyI2OX>Im_ao4?g9h-bpg@}$!gb)Iy|Qx(`-1fV_DY1& zb^Ah~?RKhC-8npYypD|w_3>q*|HJFi{J(iU8P2DcN_8VUq6&Cj$!eMXJF13>#4qqm(#JV#c|p(kU9EQxS;pXEgx^S(9pwo4x>) zj>ftxhMNWIyE>OQYK>{YaaXjfrjs%Bv+F{FWVwQ*5!HGZI;QE!2z0<`(v|EAQiBHC zg|05Xx1TmBZ3Ba39%3+4)zD~{m|IclgD~XR_`@58a^{evvY1c^xcd~d`U+Zp-a(&J z*pbF|S2Q36wfpR~4V-oFXNte8oh@Oe^DxPu8y7x2{RnxrYyy}5*)`DxBq3L;?G!vm z!Mk7o;FRz%;L~9Xg~&+jk9-$}z8qmvjYOmR9-CAx706V?x}00~W{(_{6H(|RK;UvPm+B@nKY zmjyXDe@f!hz5K$5Jrk67bc942rahr}r%@bf&-_rgQl2OOQt3nl4PpJBfMhNabXxx~QJt}noTOjO7SBr=XiUejB&1lB#d{FA1zXgJK8p5jI7}fb zGV8wv)KIJDjBS*CfMF4(<=uDs^!~$@A&C=mSMYq60>CoI^*XPB%lSzZa>MKE)+~7) zdLGPT_OJ}x#3r({Rb?QDAW>F?C9|m`0$1E(9kuQf|6AVr#+j%y1vlSE*EG5(=glOK z;|Et#wWo+CV5H`HXhI01{D|n4oZZ5X#7TCLkA38jd21IDcFi5>ET5IK4u1jhn77tA zNeB!%N<2M_}}FsH`9~y+?@ynAP)l4Vx<1Ov$eByEW* zCAY5c+{9^qJx`VSg==aTpz6B2`fonE(VPu9F7t=I`?|)7P6X0rwn>LI8dekDL?dj- zo@@*t+!;|ZE0$kz^FMTyhv-gj=9cM>cEP(z~^9|nzhG;MQmKA$TJr*=S zIGLCfY+2dB<}fd_K5%@+TY$d##9f{K*?a zkFO2|N5GTn6D-y$##yz~XrZHC2(>e#GhAZ8$>zwg2MAyE zy_H87BOK(087$9^49t^ZK-uuQVh873>z|sOOb{${zl|U+UHRa6N4&&kViz4hPP4?v zH$7AE_Q}bcVmCL)E7x?bFSq38;Z_{bt>kE}hzCZ;lWaKPj)76%RnA!^x#)ir8vg}~ zd{JS{ZxiGhEHD5!Ur##g-cYzHp`EmE#!quz^KsWjL@!&vKVtuusBu}!3HM(7LwkcL{8 zBqlS$5-Zya5?|P6J;rI0Sfh5QMSD1gTfJgK=b1TCnQuY>Er1JPjX6j8tMpPY1#QHS z6>mP?OXw2x@HJu)b6>UT{j#EQs6i z%|)7P9A?hgI8)uKc-}}BhR-c&-*h!|2MXr%lyRCB{(wBi%66q%@ET%2I7EW9!@!5s z8^5ZJxdc{6p*l~8Buj^Gc2=oJ3I^iqn#5{U39f523rJ11mML&?gfv-4f_Q;%Pv7?+Hbw?|9fL`QsP5(>UVh~4!YS-+1Vrj&L+ ztN+c}1&p%&MpHAe0qIQ@9QWz9ip%!-DMD8zOxkj-WyRSbS`G#m{yP*9yrQajPJL#W?5C1W!*%i7#21^26ez22{XA0=GhYT?9z zau-sRA#jN~wmcI>fbpxny3X5HuKn3P5G=n5#$l;MA1e#~ zurlG0JCu^-zt#A35~E~zq?uo&v?$3lLX&Z{uNGDmE)7KXPA&Oc2-aa5m(K;O-REB} z-+DVaeweqIMvXRSF2F2=iR_(2)fcrF-(6?|(BAfo%SZ*dLAb-OhN)T<=pw|^(zRA4Go?`R&l>Wge}YB$ur=)(;0!02t2bcf zVYU=vb(QNkM4On7F_qt5EG#?QY#zj-WX`pP?NDsLRV5$R%OHBH%1HOqSWV4ai&jAW=e z;sFW^J=={+o>$!vowuzSyh%p*L@Jf(JJ2(OKk0w%rwD*wRh;_JB}czJfOd}@X@3^A zf^Z!2CU##9Qx6po!hTa638TttiT7h{-Qo-SO~%kxnZ2{DK2)+PZEKiIF;eUgidxJ( zarEN~o$*r(Ef+5{4U-b%`b`m|KEREFclkDWVhgD@;Y|taw@zzw3v${$^|JjtsbPe! z;~Zvm6qC91ZEV2Sve_ZH4~O3JC(U?q35sEN=nQ-m<6%Dx_qEx5bti2kq{4il*dynt zi9r73pe$fZpm7f@n7$4?$@@ke^(Ze{4cnbv-cpRj5tc$FDvJDE@y!peAM(*m1bh=L zm%ubPC9gdyFld;x!@Ba2{^So&JLdsnv@G?!RV3WQlLiWugh9+7SM3+qX8U4;ZBRcU zq>hOZ)iOM4{2J=Zhig1-MeH6R|EI4ry|wqh`#RjB-_!YZ63@A-&~yvdxTeH9_j??2 zj44`~iZ_MvaiGboDf{R9FDs->ieYA9a^V|LH)T;E1?l#YdU-VVHiH!E?b7my3w|kE z6zt48s;;#}KNr{`*x8Z34ME%koFqg`Xq*11&E0~HC!bXZYiHyX;hQF|l6jy8Kt+ka zrt;eTp|3Zeb`P{5B7hvNp+=ZF1j(J_aJuR(4fHLoFW9%oPC*2inrJ4`V45dmt?-8i znzXgpog`0Ez3)I)Jsx{UoNbduKy?*qPoMr9qhYpoP|QL;EST4E@RokkvF*r#926* z<7><^gR+ONRqT$(p8z<@*yP&api>1~`?k5ldL#6*O%#fboq#%+t&(dc zyAu|>Bes<(#jhuMvs#}M+krTsdrU?I(@j1t?WXVic^h%N< zlnRJq=B{AzlI@==H`CO9ZE?Pp(EL?n63v&e4^Q{IRD*SRcyJ^Q2j}y~N&8u`yby9I zbSoagG+<6HXxYuu6~;rG2~!-OANbh_ag@cLF5W)zlwKJ7{?i|Yt7|}!+ClIrd@NohM!)L{p7b>#TEVwWMp9j4W?;l z9rOWoOd2`9BY^QAjFX{F|Mp`9>CKGw%?=9J;eyH?3(osDln_YotLNs&698os+GGuU zKyL%8qhdw@m%9;P%->@7mOVHJuC2%A8zAK7UJ?^gMliztuNQY!X?o8$CyQ`#mA-g;W1zg3 zlJ0~O#vQVCli*DRqp=bX48Y>)*rmm?!<(3|pR#~=1J1;LYV_6=+Fxo~e?WqC0(2j+ zPxzsQ;i$JJVKMzLI6r0akxJ@Qnv4-tp0mg{*EDbZ)HmF&5tzrv7?=`h2W=EI;VxT$ zAK!R0g~#9&-%kmRzfTL2C7dSlXr}XYUUb@iH4;6*RaMX7OKL8B#Tvg`8i?&`()Ig9>!<9fYv$K^VC#RuGOwqTADzPzm(DDU?UpL8Mh;d zF?vv-1r0~%i#ZB;@%MfKP{8HQ0&qVEm)h#AfCkp>04m*OdPVqU1wDxJdB8TiHe4f= z3+^SM)rLgSnq#@Q1@y3{UYM({QSS;)zFRynKM%K%0k=daK#^TccehTTDpvW^BFL8A zykTdh+dh(XbWncAv&$qg;Lo{&a;8$Y+=iZQH7}=ouAM~jR>zrOaO5QJ%jBnoFK2we zpC@0y9t-Of^X1_{ zi0FNxBDW3KUS7JT?0PG_qFiMiDQ;v@rS3%BxAEDYk~K-X-^9LTJ4Ik_5-pJC5?Xxe~yXSQO zTjCh{cmltoVK|MUCnL$4DRt3LbXrejMOdBw{m)zS)Wf+w|8@G)dRIhfQtwNrU4^e3 zBKQr<%xc7u=z06Wf_hnl5+8uenk-clQ*w;GV3^@zkniio>w&S+3!qt7pZ`jf_TtxFOT{IgvPm(520{(jIuu$ z8K4aN{wtx_p`~JL4zVWitq)52wCU8(lW6=J(5+?W9NoE&fL^2gb8m40r&&`=kktfe z>t4*@YP}`8C9&OK%d4YCEPa2Yq|MX=M~*D-T*HUBz?Kw z!ZDG9{5HOGZrxvU0vmc~Y(9p}EUC-cHABOig-d`o9?APOHDQM9Z)xaCk=7~C$S)IO zcb(HxVHgg=G49o54bY;I$8ZN)z@HIx7uaG31AjytJ#43=_PriElr^c{Sp%x!XM%x( z+`scK{*1;+?gH90WwPS>p^}4Pl5W3ml`3#2nAEL14$Qm=(Eigb#ZNmnY`00C{V0-F9FTe2E(%A?GU3%$%N%TP)f?TdqLI}$X}`rL6wxyA*n$=x|7}lBH^qHXHtW0j*VvHJ+Syw0R<{CP;;zP7 zi4kB-1Q+K3Lux_W0aK-ry?hXnzU9dWYz0+XgZom_vk*+^19^@M0%H`Ewv=83);a(` zAX)(I__f)-Gg3;Fsg;ojSQARod^)#evzJ)`|ge_H#97!ca_#7Wh`C-!K*ce^vDV25NVDX}NMI=!@Fi-0ZFs*U6 zlj14V@+sq=G}XB9>7G@#>ZqlbqBv}HXC}HLq*r;01>>;Mcex10A-*UOM4nTO?uQgha$1|^9p${7xdknY z5PY42y8nxXUX#m$QuZGipaKD}A6j{3u_SUDT^q{_2BFyd3t@rX)HB9+ zrK^R*x&xmRBPugaX{8M564=2*A>2DsWyo%Suna=v@VW~n8AJT*4D$mK3Ad}0!?45^ zvo3?LRCsjh8y(Vl6vJRK^TK6D$+ss+scjBT5T&WuzfP#fEN=yf>zW<#IGT*j<4Qh2 z54U-Bqd008_jIXYpcpW3kAq+iGoVI^uUsSVf`6Asr}dcN+N542A%^DJ%D^eUE@56k z?ahbW3&MHg^D88mW}^M!37cJ}DxAYW*LznrTworOE;64-o`K$3_wRJ6voaL^Rpd#y zkhl{3=p#JLoO>%rGZuF==%-ae`o-SA7AhOsZ8e(Y`p@+Hjn#$N_JL7CId!QSiyceq z5}g%N2)Ml*EGoz)DUa;@W@!=i$>i@;6BPNt#tuHW~b-Qf3QV`aHfhkAKx2VfZ?3F%{b2fXq-Ekgn8E ze&!Qz?n}!?0gvKFK+)=A^*ypK2d@uGx3#bTl24XfR!4auN16VsN3!t!M0GUcRpWr_ z4Rnl=N(LmH4z|t%kmSY;V)RqkA~*x^?W?xL)KoEuF%}usL0V{er&JVa{{<^w`%V7G zdU6+Q=B%09p+xv+%Ye(01jCZ7)L@5^ABIH(~nvI4EKGb>HUX-Hpf2s z1U6r)p9Ou$whdIbDXbSv{l$mct)q4>jwFVBPjI~&qm z5oE$+ny1K1ZX^F@h;G+V*aF@&sx*LD4VG1xYBGOmWgs`w{~sZ;HY-Q7Q%?G2&juWb zqU?}Tg6UO9f*P-HReq`O66**2mbe%HM3}b~-T1-341V`6L-FA?p~XzK=MD80kq4jj zr*Z}Hy0-&sN2$=d6Kh>I`8FJ89-XLZ0qUQ|WHNvX-zc=Do2UGL;&dcc}@8t^X4P`|M9 z5$s9G&P1SW(cw3WDV!E> zgzz_t1{FKnSk7UTr~^IQA`eyG6qGCGq(wn2B)F9Hc&VbU#{@O%I9H5I7^GP_oqNlV zxiKaLPf@{LEgw{YS4oYif;`g)ol$-p`VWy`Vfp^ZqW}OGAwE{I=3aoz5l3UJkaS7I zkfCohF+>Q3pvzlT{Y#u7sF`5RC&F6=m)Lt0Fdc>M4y5tlzUPII^1eP3A-U3So z4m8nQw8#iH=Ob#2{ce{5_`zR_#t* zu}xG4k&R^Fq5C=u8kTDfo!g2pUQnnFLHsHIRv)nksH?VETVax|8 ze&iNmlB%ESXc6EwR4l5E!AzLGxh_VVMv7W8-BWUtt-$@fc@?3zJJtljNQeQjNwRA0 zHee3_Wp#{Zo+|*4{qtuNA5^FUX#qV(*Sq$1;SY|O>ajM_2~G=nP%qYI1g7O0Z4lI)nQmuNpz5&@{v6)9l^v|RB%7fDR^gE> zg!)AcsnOa<0k^lWMC&b%jjT%#v+%mpppkBJ3B|pciTK*v;{X{Shkm@7wAb$ttZGi% zeaeEbAs(k#iqd?*SK8*3n#Ed+8r~J#llth-RI4jCgp!1X)~=;xf9O?-33f($qkCQx znq^MRs^6waolz+sfgLD;3VnfChMpme&~&t`uz82?yWGaCCbqaf?yb&V>@88JKpK5& ztHZ=}0f|W^7ePf{?n>6dwoYJzm)4P(5hiV_N06MfvFG?{30hz1(J)Fm=wf6;sB1uk z1TV0@^DTVXi_r(NgTG*~bzPQ)6{apq2rA|5or9w~1W*lfW4a`RST& zy>$Irtd9>!>G*%Vhca9A_YYijJqLS-0-#*2Vmn1j@+kS^sdyNA!%ZPh-NsWLkf3oK zB0y1(1RFkDtD0@Kn{f{A79mqW%oNpOmlEcgX4FkbsZh6@@KIidtP*KO;rH?x%P|sd z6i$bR7U9Uu?#@LiHz+<6y|0V>!=YWT@FIO>f`S**!?Y}rHCb)^Kp(T%6TCe;zCw(f zyuqg%r}zQ?@OwVOXu(CDl}1j_>)Jq-($zjW?c1)84{)FgJ7aXZ`yZWi@i7CXY!}$9 z&9u%OyG5&%;YsahQH|IzY4VlwO_-0yL_O$@s#aFIK?qsE9DI?kP@xPf7tA-5*eR@&9Lu-xkXL=j@lH69Ea0|Iq#Y$9!n~PmM_eR$2i8Lz?%%Td;gl?1 z7b~s|!QuOOu*%~mKyawQ84k%av3l)^Qvd!>L3zuF4zJTb(#Y+#zpZLLlN;n?4H~g} zy-<0zG4Cwxd6s~~A+hc3OUQ_v)M%{xjYCslp2P+hTcVvgUX7)l(Z(6gK~Qts**&E3 z2U+8ml*>m3i3cToV7d<0q*)O2Utzoi!_c%4q_kM@)=E1>4~ONMC{+6Q*<~BI?IKT0 zaJ_f%@B9@woxNC!Czo+oyH?O_xdc27;JQeK2FNf>wH1fuy!&%NSx4!=#=j(M;gA;` z{h5>^BLAFt%#XbPQ{>SYtx!83kU z^N(Y*C#XUsc01C#WNbX?s!VL0Tm9E@px&Dje_5e_4VBOv9UVI*{?8gr7Kn(2jgGnd zDXE#ihQ^MWR91Zgi2agY!ga&0^}@-^ZvmBy#7-eeR;`1`fBsfWQ1U?8V%K%?WJ&Nj zx?9)12MZ!*Qdl0tS3}|l7FeV#& zw*xBm6I45knF)nDM3w)Q-2uAT#M8QjpwO53&zrTT>~!UW)L>n1I6=HXlVBRm2K5jk z#nM zZ02tNDRn5ej#JH@JQhiSMbT1#2Rm7gzca6W14{geRVhfama-MpUYhyV)uz)O&R(I& z_@qMt)@&Ou!mV|2CBUxOuEs-zFFiqAkVc!d;VEpHcWyz$lC)Ac2o>isLL4`N&9HQ> zYu&Bdq%xk&&a-MynoMZrMSPY#{@ms5&zTo^P4CzgKUcq+_>GVH1f{*+H~A*&(;?s( zDi|C{GA=^nK*;W3y)sHwHuI#j+tgS&SV-wvkN=?Xf$(g7>vzcH^Y^9&4*2D-F(bKj zzFXQyTG?FBN5(5z9i80{br`umggi(~5kPBBt&^NFA@{;hEVr}k~ zo;GRE%=4ql@WbDmsg*w8>w=y?^A2r!mdebSi!_Lp;jw zj&i_D$%3r&;OxP;^5Vn8Nf-x8ZHW}vkNfzBq+HNV^<)B?{iC%oAx!ypSVbc1@BD* zCbwX^mMzpWOgSsV9Qh-jzrfBtr2)7f%ZRyt&f*0Ow{dwulH$g9c|b}had)RlY@dK+ zm4rI`Rg5yB5`@e8-#pMpY*j87I=Oo;8eG%w-bm!_6z5JnvCeW`cpFJzBOcy$#|(hc z=%~3RK#4RVw&0{={R%7YX{^Ns>Oba-HDTv-%3XP`QRoeB0@Y!o40{b1U=G(suon&q zFP5kv{Qbf4(}vss`!$2;AqcV{p0S81VSOQ$j5OSSR=hFHySrn7M}58i$y$kbt#v8^ z>1pgjpddm^aZ)2;5JsMhXY$oh1s!*WtADpx*B@RSGhN__$%pu_xk>zL!@?(>nOm>MI`%snkRJ69|j~Mp~Dl# zd7Zq%2J|+1`_*ko06j#)IZ30lNc~D?LhJH)al1)LTl=!$PKP@QI0%DThtzIzl_Jk9 zS9FIX!MZ1ZXC+iFygi`7SyRwTWnLeQz(h0XqqgI20Vh_bIGY^4x>1#th^R`3 zdx03;45}Vu^+xd@Q8oD-N#wrb+`DH8wZ-U)jh6TgPAl_h_*2i=&^Pk8U>J(9Zjb6} z;y2sSk(FMDrM5Z!=i6fzq-x4*GYOTVA~a%^k%MyTGP@c-q<$hKd1tHAznJy%n(y+U zftVY+SpAR^C|M}%F7csG(v}~8%B1Rj_BE^_?d8z2J$#Huw?BOCVbcyxf?5k(NPVqE zY`6GOh_nGu3mtyB8`Q-%-(3sUQca3LDE?r*vO)tD+>PHlDk3F&{*PTA?nAY4oF~oV zK$ZkKoxc8wml+Uo!Kc5~g;LWuS~O$QHW+?Z`=ANav+6p;I70KbM2sNqunvqGK^8{(D4=We` znn>_<&xkxo_yd)Kp2W%6)4UuBV&7N+z8-G5zvqY`3-jnOx}|=7dM$?u2nAU~6UG@w z(e^;|hbkQYVdsg97E!6vH}Va4o(XcYo9k}VfM&(Bmpo?V%_sG!gEk-E^lxmizA#@$ zu{R?DI=X-=>?+oz)_+SDdTa}k%*--1kL9R<*z&QE#)qh$FE0V1LdFQ7RzCx;nIC?5 z{h`(r>o7bGtKJK;+nf zc1Qf(?G&-mOBsLo1sL2?$t1h#10~aom3Uglo=s`2n-;8sNl} z7UJ>T_sS-?eQK=C$drm^aM;YO!LF4$+Q!_=y{75HC$!?r!C2^5*h)GOyt~|=R6|jN zK?8E>BUDS2R~*%s_3;FJUAi7G$K5ps?YBwZ-3ZcSZk7C#r!K!D1DcSuWV?6Pz#->m zz~<^L3ONa|=?<9~N8DttXJM`koWnB%J%c~qjZMS8^aI&Uo)0Vwa5CX#%LaBqn$oHz<>5%PE(67|PJ%<}87UmKwyZ zlK{C0ejY;)G7f(YiGWMBracm<>jtAHOIv%-@egT@EWQ$-k>Wz4m}hgH@#Q+;{8uJ+rd90e?=*|M;<>hk1p*P|1?+T8qo}>*pPx zwm524+3>5>sYhMed(DO~W9$u6l2-+*XNBPJ$dp+XfN>}y*kY}bm2Vz!C&d+N;P9qoLMs3<7b@R}dBvMa;8H@#G?T0_zx^t0c?)V>kb4XsR)+ao z*PZL~X%rxAB)q~x<;m^%Ux2NlzI~-~Hh&{T3~4>cmT^q4NxXZbZBKt`eWI!VMY0v4oiKBtrq=#% zc+;(BsBlkt;i92W{ET9z&d=+@9$nhNpFkA3m;nsePc1~-acwy*Fm&Q~ijso!VJDh* z-q3rM3dvjqW25utb(Ne^mJ$*Z9y|+?RZs4Q#$xeIyl0=WAt>k zW0zsz#;yBiJ?t^$=51~ZkJi5nd)hgxt#;A|Dq`mtaOc8DZoH!t^ zpP0BhLoJ>yhh^rv3K!dqG^my$u6j~-bu(*cB7floG z1>=FTT|&-`5}3S5at{J@&h?`lJ(e-t%n{x!coxba+tl|6Lmj?=Hy4p>y0y z{nUZ>`AO&BfPr2tcsx)hE@+HffJpg-woJve8#%|*9q^D4ga+%JS)Bl|O$&vN(SRCi zsV@;(UfE;@)m+!fb`r7W-Q{q6aFMQ{RR=kS0J8J>W;a@uKwL*6c6eToLG5~rzTV?F z`&J2D?IZ2y*xF!UC(neQlIO;5rq_j}br7olZKosKfELtzT3w zZ96#U*9lC?#+^w01bvgah5WMlX+G?hO?R`;MygS6h+dh63C#T10=tt zLbUyIGhxwhtza6D{KSVCAGmj1DQ02d?oY8M1sxR8Dw{=q3C@KklHQ&6b*Gb5+LMmn z&R#fE4IlV**oZ)PtK_9lFI0DNxj^=xqYP>u&L4LED-~cAvgMhW+N|(ZtjrugxQa=5 zyk#Up{ylQ!!nsGJ#;e59k6LFRa1$o=8l_!@1$QfRQ`THz>^K{!fVU-8gXqx_nvA`M z*EsUxE&Ml|^v#L+pFE_u4$x@iG1Na{`wNe~{S>V2z-1IqAx(#kb-l_w;;At{DtG!oFisc!NF2s_1w1bD)*CMui+h7$wIcm8q#F^v^Cm0LznHvL6eG zxXhECqfaCB0L4eydaW|kVDCDKU%H@DtfeJ-x;Zg;?GFD`*?__&>Qv02JC(@ZKNM7G z?mzTbXu+MRz>@G*qk3cE7O%bb7<)y3CV%d?VD%`bM%?9up2v61s%}E@GV;Y@WWetA z#m#01pY1cCL+O8t^a3wRNEYY@PIUN+nTAcwx>#7c^wZI^OCkZ-6^d2*4y48+X-zMj?7^9C6WapO zO|`=1;dCr=s$kB%q8&&|n1*NIl=r`)cEA9{xDtS5 znUdBut&h4GY#+UlbC>o8QSKVp_72*{nk7LArzaMF2N0#Gfhj>_=n+d6f1v$c34M>I zT!$yK+@pR48#J)Z&f6>GlI47H6BDIFwBbivs|y=5uJiQ;7PbyuSC&T1Eh(RkZ}h~4 zYdmx9QtNgB%Jy0h#JfoXji}PWDP>h74kV-cW&bONg3UB&jAQ1xXRhf2I;=G?uu9ve zE?yp!Ac8^}U>u>-P7{X(GLoQ! zv8=g(mV6xvyZo2@Uv|~~4#VrA2Zd;52?p&MTa!YPO_YtL<(|=vRO|T0$+jiaT_Yin zS%&sz^FOUc+7`p0txFv_1#k(6Gw@;Sa(_)u+5A5ECDa?|@nB8f21NOh=-}X7l}bJ*G2oBK-}4UI7Crf2k%jYTAi{Jkp8yB0$9#eZ3KS-r>j&H6`K?$ z5qn1b`&ca?YXp7%+;q@b&3udJp5*|H5~yRGH}@J1BcvXP!QuDyskt<8TuPLx6`Bu#%rHaCbt_ONO_8A_zQI z9BjJs$-c~L@}*$d<`QV5-NLv1Inke@YI2<+6&HyUka-qOBpj}6hY=AZ?lTR;8}Bo7 z*0Wh}{MPQKbelZsg}9_7?>rTifxbyk#fo6mGA!gAh>8~q{`0p?rZ%L>pRf_l#W~&@ zv+6=dBXYBO)UA9)f)Y_yjU2@k)Lufo`(sU3(!9kPr1#~U+#p~BxB6C;;L=CsJON9c z7pSbogHGqIK5c4tBLbSzcsW^$t5O>z8NbI23+V}%(xkg9Zeh7t5<*K!BQOD@w--Xs zZCC(g1tBLC?7!Y0%d-Sg5eJ4qietLYj}eS(McH!y22W{-H|tAnHWF~S`T;?qIsATG zN}}lJjvs<0=F_;()RnK}uj7E8knm-Z!O@bwWPQ20=rd#F}Lw#Vt;`B z*v4&tC8zX~=u2Mrpy&@4;BV@lzmy1WqDyHRscf`9PPH4<<@Gp!hJzlZ0GSoJftEc2 z14W)Io4nJS4FUv{XHbGx2)oEmTs}3uKczHBt4VArrkr0%roh_GMUlu1O;HYr^UWPM zL!gmi%NZ;Ha6(~%w_N5fkZ}QDcMSD}Dydu02SYL5K%%qMG%s6< zF)7BJB*)Ch?76N1=a+R)Rnj zlKR919DsWNt6jIQPWujjCa?)LO<@G$thg05xvEw7A+}3tI40xe96Q6^lP`XpPt&w% z3cAE_Xq6AzT4Uz`b@b&znqtY~wRYfym*hAr_EX zX_@*$wfO}zl=S-o*|m6{kFh_4aM-rjppAlkM-jGy~!5#eDRO4yTD1~-Ev4_3x@D&q@PvFLgW$CR09MfSEiyZM6! zV{EtZ>fsW15OE`CT0B@F1)T@1EY&Fe6=vvGttPLauH4^f21efJQm_(F45DL63u*P3 z1{fYOpLZ-1pC#Xdm{Z3i%6M_vxLIZi#vVzmRd_-X;d5wLn<*V3Tv6;>cYFO@5Hp92%z*n z`h+k-0NSzVjf+&0m}71RM?-V~Fbc!EqNyi6vN6)+Gr)M4p!nM>+PzW?)j@l_iz@Mm zE|v>YQG#ERQ`!29W&`gO>e&OA;F9E?3o$Z^#Tfi~SOn;MUm) zCa+$eC5g`aBO4QrY7(T&eRS|$SMgS^W8>WhQ|#S^0107-f|2&XW3)D!--c_*I+0?Q*9hBbn^K(Hc9`Zo948^{6Cd zy4%YpX=(;)(QSZkn*4%P1!h_}S~%Jee!8T}SRng=fWlV~i?@;X=@QEPLn3ZU?4a+@ zj;=@JH|DWbG-OR+Z-}?6{PxMa0X3yI^pX{W)Y4Mtt(HZRu}@D|9+HcHx4Gl}cjbDt zy{=V0GVBc#-a#~l$yaV}!?mdl<&p+)K0i)G$q3aUl6XAQa@DPr03%cPMEz1Km1DM+ zd$+9uqB_F@eDZU%7oP$cr4eqk1{r48e#E=OUaLpH(`{uE%;}|w)O|0kal%MDW>!?I zkP#lNe0=7136&a5o6;*vZl|VrY3=0SkAh}1(LV=t7C#pi0+bdUI=28;u>vjO2RmmR zrJF2Q9+xjA%4yIGf+9M3%BVYnm0|53n$V(m8L8TNAWxOm94UtWO!atyKeVuCHT!l6 zDk0b}->3Ng66{vUim(tzA&J%I`DeiP^J6Luif`e&b=eSmDl&zTv$V34E&P|{R<-v# z;~1U2GfQq}bezqMa+${v*q|gRu~l3mm>Zleyp zw`S?!=~H(jArWO05PPl))ZOaI)BISV?dGMbhq$CLw#SxOzqVmjzBv<Es4<(BW-%jJACUZB^)iP~-b0`ak@21ZdOYXSni>lUGH#x=r z81OnLLI@-!gev@P%Ce~p#|hj55#pf?4I*h~OWr~qjPQK&Wg4S4n`vJRsLJ2^3$HO> zR$8;_-Z7Vti#!ZxY)xKB0>R$mG$+!ol6_Foi0gBY_;N6oKDUccsnvHxQ&S{ed1x)?M^CD8GwIfo7Hw=mmk0h zC-1iijun?J6avfQVP5+nmPl|~*C*Cj6Pir4QBq*fiE`gkjxJTXx9;SPwjlK9nS_rQ ziQ5tMRe(tfC{z?iD%%pj(#oA=2e-7lQ8Hl^k79jet&?^j(b71&Yt@`+bkqmmIzRMm zCG>^04uu1MMrkD@93|qR?R^7@zl%;Ayw956jkD7vWnAkZgI-P-oN4^)ug<*qb3q|) zq%E~6t-~TX39&ZonC{l@=5e0QX<1Hd{9are(RB*66wl~wxZ^d0ztxPX4A2xQ$mbm! zv%AcU5Uj-l5h@(7Gp2i!c3JNl{ev)#e%%{m%)&h*OsP+I10fq#QD7HXw~9GOD0uyH zDMva21p=JScT{H>P)=F#)Vf4?ba4-N3iP{bn}n|gwL2?a;<9Qnaq>1@CCK5xl34|a`2Qabk%tmwQWr!W{6-0dxoa<>h0lYD{BbPM@(k6 zJ-~fR_}Y_FsAsBBg-8>$Eys@(d zTNVktGo9=T@jF0c3&0B(*Q;PI105=WEfc0YN#6)hUhk!>&g{0 zGS*FjAR`xADnPv*p?0)JkUIjozOdL%8DB6l&l*TmJ}joemko42Qos?TUBG|@g)K)j zS0|&nP$WlAy*68!tjQ*8+CMEfzE~2*kRjZX8_J7o5IJ_j6h^TMJw!CVKSW4*3`TFrQ*AkKX{J2k>9sqKDOFK%zUv2J5J+yYDR$j1@ zEs3Tz-sS5Sl6cH%V31itc)Wucejk=_2v4DRFp(P{g77><7&8Dw;Jd5w@iP? zXlb*hjgPXHwuQ3$puWr{aqsFEiA#X^|4ND?UG&R70GQT1c-#gj(KW}pk1{T~E`JG} z4L;iNs9moAtf^0~Ybqr&4RkbYTvDlMe(>o)oFMflBs4kg1Y?lOv+DqTO{t@JH%eAj zlU$`&DH*v6!zJLBV&EB4O@!L#i6Jm7(Hrxt!|T3fBbVcep?6dT$e6hD4&0zoUE~SQ z*B<4uTr{vN($E;d^NW32&Z^rtL3QVE4J3rz6ZEiVdqj&Hf$b$iYEdZG8bnU8aoud$ zQ890naC?cry{5U%PZQ5vYtXFOKa8q{iGskpc^)d*44z-4;`}wH$hSqyp|1kKy?`@hUhs1B*Hb% zwsiA~w1+HLJX%$#g6-ppM<%u?d5OJ*S*LQ7T0ip^ET0Ja^;Qc}97TtiHWcJ1+xv4U? zXc2Q#ih`*bQ0r2fQ;HoM$-2MbDO3JH=b>^-CqMS4&i}(y)7&L7qt4L_z}Ztjqai2}9`B$ruSdXX~D{ExAIH zL{WMF-avR}xMb|@boV6skqs}gWKRq|z5Lz@3u7(wbn;kJc$80o`J_>q{kj+9w9si zhhnj{0??2b@hc4y;UYyqv@tgo_61D0rv5!DT*yOuCS>HY0*xS5eyGUwp~e2PmE=l;X2NUI1H?zGyILDJFK#`j_ z?|vJC_fvq)GqDrSeEXl1eu3fX4~yf|49h~w%_?N49Fxd>e}&gE6FAXBhniR%KE=kp z{!aD~C*||(>U595wPYI9epfufaA}NzAl~+0K~Mz4Oi+H8%(b)I`;u_N^1eT zpMZEIl?2!xFQcqXSkTS9pU0zdG#VUO?}QzmH4Lqar7q=3wR#!u`^%G~J`>Q$o3n?d zH$}IboVrmVyc*)k@8WeEgVLua+E)-F_A%M-7{akw8Q*;6E>;GO?g>7WsPtkx99oGj znIz5xqwwlLV1KfK9B{()c@y9+#2ZkMtH02ilC@`d5I3g@SB3Mc zkQ%r;`bcmQ_pq+uD$m@?ifdZO0H}Nry1VXef3ilRRo;H1k~$(;z|Yc1%FLz;r3cIU zX5pJdj;G_&1ns5{DcaBi1=PmEpQFi)fxBaOIq+pYB=a~6x5yHrMdD}>%V5y%#!ig{m3JY5ihK4QP!uV{EORLK$9EZy z-|0lO1w(#<`I)fFxP4XqJts1morkzr^OF}M3JD(^M`R*yUPQ!NN3;O8ME zG`_vKki`o3>FVFm?0kR7(=ZFx;3tm2a5GpV!NeFse|k54fo6m12EE!ty0cIQ1lO;4 z)wXg=+a`;zJe4$pMAX;>iS8LJv8Jwt4csttx~?Z)l(Ktsb7PT#s*l_T44>t{uVvL$hR%taIX>f)H)*-Ljm3Wi|%rXAWxZ9tS(^8FTta~(@@k^c$u0p zZY=jGSZquz-~R49k2-agZ;5AGGKdYQM&uz8@}h4_)2rsD7XNwpfP25GzW|8NuSQV6 zdY8%RMu2s;ZMd9rHl3iW7Vd|6071@ID5)A)WP=IJ<=Bob0e>juvie?z6HHdggg#cI z2iHuI%)^@ZW$8im4dzb;Efe$H!@a}cs(1)Lu7_UL*_tSDTH=jl)^}A^$WVkyN!Q&X z(Al9gt2AAE^K^B`aGt_KXY%DN>Z#?K?)~lSOxF}(1sqzFHf!^@>2j!>M>08V6^E8_C!z62w|EoTg^NIgBe@1Oe9HpV&fqK0vq-HYK%m(;3 zw;Z_wAF$=Y<&in056wyFuLZZUD&KuHBdBJ?Fy+IkCJIdb_~>x+1Vhet%5ZWwP}j%b zK40_pRmceU9p2y9QYERU87>tNX_p@Gdf@9vU?&jA?c2g=x=yAafyn^@b!Wg+LEaBF zHm%?!d8U4vt+Ds*e9E@lu!p1Ate&0=QM!au2LZUu2wS@~z4{0-k|d<~iat5{*>J(g z!_j)MN5jhj^N2(2?K#|0|o5B{XiPn>fzZc3q@_~zW#;Gf`owZ8TF7ZJ^0}jopdJt+c7@{3bk6d zq{qHseldtgq{Jg@5rp0=H0DN<_|e2ET%DT~qBJO~N^;HxsW2V-P;^dr*#@UWWXqz7 zB!5m&$0hErkT5wemnGxaB5cd>jSWNX8AyUyLJ!5Ur2Y9}lNxcy3Eue3<7H1|IGL6! zF+-3ptQH-yu@@miS1hlHB46N?P|5Hjxw}!0n;%Ai^%Gw40GyR@Txs5ZnE1taNh$RrI4Y_UAU4DomOTLfxlnXWzbn2~pc9RD6Q-qS)t*pXZ?*ZjqpY#zIOOzu?6(8x_sgnY zKi5@@-Sm+}61L3tS%vFq>T!(5&5r9`4`Pz7kBn(I?gO*GFXtoWm(fUN7xOSH1bd9C z_^jLmkaQ-HLO?=A64oM{R*b3Uy6BV;bMf;6FmP=<2^duK2>p}nE=O$4Q$4GNS_&?5 z%EL%Wb!6;tlpZ9Nr<0LR3=b`cH^7;pJt~ET)hbGq|Bb|Poa7h0X1(;Mdh{950Zb<9 z;2qPhomxMNO_4`jMAS?tFl^gvvKUDBWBv>$PM+DUJQ8lS>y96xEc~>QIDd!C>@CfW zneaquy!S~=^~6f$FysII;nJ_& zhRT;PL%h`1YL7HY$>NAgWS;aa$JaFUccH0LO47}A%-$rqueyHfZXhyQ=!Ss>wxe2v zvaa`}`&XhSNvL}RRB0Zr6hUWO#9Jv!g=k=r2rB5$J)iZgu%nR|H>jmRiV;Yc(T<}G zhV-S8puR?L$9VUXQw}nmiN^*da*p^KM+Y#}Yk+ke7(}ed-2}HBu*pgK`c+JEL4bn* z3^oy}=N+Tlsjj#YqET7@Mjk{)kav97ouln};9zk#MSrlbUC7>AXs)Y-i#9)GAAez= z81TIm29emdZ}e^@ksG#kN`CkFtG0ZJnreJfuA=dYeby?Q_^K&(K0AXKt^3rT_P5Lc zb79xwLs7XHnE8>;>lST3i)8FQOq)JT4*+z4Y{&)>_m%38up2k&0daJ2HbE~Y;jm1O-OTBM}AWXY%`xOa|Vmh^|s z#p$JJ`nlqolSFWC{l&~Uk*1Ji=PREgO~mJQ{=vV9i6!~FS5GpY`;lm;m|X5Gw}dhC zV5g4bcV-qYH~~3| zKfK=@W-Civmx`HYPX=whgP+u8W|-%Or&ob2ib}!NmN_ghn$NZl5rG@FaUx6X8 zaU1+_$fAc}3jM_k*_kZm@@MI=F1IJu6U-B*IXOQ9U$7NiiB6d7nN_oK*(pBl-bj+V@}c|J+!@p$Ze8#P{H{&V z>&MEhEvMw#=-TE^4A7fWdyU#~km+r0zkR%ZG^lW-5O9#LL%5vnDF@o=IpX&qTAcO~LnMTHar zifvux!3B}YuL8$k(YL$63Gw~Lelntedy3*%t530Cn_3CCCHk~|$yRbSzS7NX zbME^UUcLUj2qDt{^vn|vQqMGAlrpW@t2#@*MjL@jnGKv+i`D$%!k1J9h~ugxxxxEkSu=we8^|=7%WZ1SLfZj<@VuKnor?e_}Ywm z#iXA*nH&4WUnVz>t`&KZA6K}MXHfa?-Yo%l`_P--sww7smA-Qt@MuYo*xnTYP2BiJ zqwmcc7WgbGKUqx=$55Z1*>rS=R+7@c{J_@whT)WkkENq(m-GkR-MHttgYyFm0 zgb~GJh(T%B!H&-VJD%wJ^`xdnw-xkn@A3}Ei>kMuG*>a0#mY`eN!Sm{W-@vfu}GdD z8}YI2&vUhpp&d~|a<~LQH|~lHam#z?$Ors0#RvE+N1s?-?7?ir%%A=}PK4| z&EDW`=$&7>K+b{wERVna(2{H>r*hXD$(aNc^qVes9ph4>!66s@miA^8U&HYQ;TTq_6|Ce>wx<0uzf*WTd20A`7_s^hLQ5cI_CP({4tDN ztpH-_>di7~`XE=6sox@miG)zCQd)!zY(|H3#3|_`yG-O=E}Xsae?b{o)AZ-Mv8-ks zvKsX}7S=!BQ7$+f)7N3r?cj)c^Oc0{70}I(m_9lvbmmsNmtf`p1~L~&3zua%N3VLf zxE7Qi5!B@uM5=*@d2#l_{O|Q5=C7Zn?2KxG%d$me-!P#5TQBCH9_;^KkG*O}b&nAX z7yLmB=ClH%F9E45kT5cVu=$h3gdjfbgr7bJVES8jSlO5H4-LWz3?pm&#)(MhWRu+e zweN5ZQ?Rf6B*VHJA0N7~b`23x*yXkW|3R8zd4aLP5uIdy>lhhvvHC!sWkt$!bc0~% zD8KNcqq<^Nx+_-ce#J^l7D#Q%Zd)GG_TRXl1x{kt=Mr+R-7yVor{jlgB!ixn7Rl}5 zTiy0@vn*Gau-P+K^`{%Ty$wj&eGx;+ua&w#PM+(lAfwZFfc7121DB*xkKbG`o8@+s z?4?MhAnXcN!wr(9%{2$Kd?~l@cT5)$dtTRf`f3fgN;oNS+f?{cI`R{Nd?ti`q#U(!S4q1w0CQZ`! z;Z8PEasWjvs827>(3VrPc}^w)*GGyfwA|RC-LTxG?=?95W z>wk=i#3wy%>0e!tJvL6-dS#3Il3l3+3w1O^!ZSXK4moXNd(|o-iS#_wSuB=VlCBQ{ zw+e5ir|}3-xWWt5h`Z#!rdd7`sb^)(Svb3>HKCpqXuCm|>3p(MK`H|>pe(^xC=b7U zhBl@!LSaiH2|N(j2mI1(9C$)~T?ukHu;JBJW@o%uKM*^vd*>F{@fa^m)h;k+@4MAE z@+n1H`-Pw3RM&FPfhL9@ht2__77VJd_Y+Tk+abX!kNBX`=r$`>Z%Z;U>0Q8kcSu4{k{UNd;< zMAcRj>~w3`Lb)AJLF3h?x5!23i0!-s9Mbog%jv3G8eqFF-M|q^E3K2)zkkjIy0ep; zuhTz6^Gr0%1_GmOs3s3h&B7O6Ln1nhNc@2yq2r8! zdq$@bbVy-dU^K6XrW!xA{O4!sKYkGLNxJA|DAD+OC38W?J&b^0gqsFC&Jv;)$DE>A=YIo#-biyF??t1@W#6h;5jaE0`MQZT^z_sQNC9P7UF9vzFx7n9G5) zl3L@3bk%8P+69Dpu2#V-(8-&J^_^scK(DgzB4Es$!26e5JldjbiDhaQHiNGP@Q%^C za7-sBxmop_8198Rg7MX{BLy+fhf&8@e7mBTdEYOF-9B1!w|TjfcrLZi`cu4-i_`=r z)jJPB$PJvgq*lQy0ETXqwnH8>&DpJl!~X&gLy0(*IIHWMpADBhgJT*B@8R^XZiO@| z*YxU$n5rP11cS%d^c%QRm;q;#X9QpG1O#c1h)iel4r4&&Rh%-MqvO`&?1sWg37>C| zM(2zA!9E)uz^9;wC*HKTnwT_ud+zF}9zw{$vp_!ZTsmCEM(%4x9J=DSFT%sQu`5tK zEUXTT^b;Lzbw(s*cKV#jcVg?jPsJ!eFr~VWgeBW`s0gL(ma>}T-BAqWo7n1y(Ny&m zaP$&Lu*woGn(|Z_SrS74q5{&I?LNJ{iU&mY_4evj>S+TuR(Y?bWFpa=Wb|2f zMm+GM_cRTTX;3n!u}=Z|hkPF`&0gGD-R~K1QG5fY58^N^U5JdO`;C=>0Svm1l~(}R zmy+vtJ1rwQHe)&cLIU?de4o$5O8v>j1Esk{Do7#ALcX0U8OJ?@C;W6pNg+PC^y7(4 ziyFC5-ufp|tflbvJADdM!K(gUcLNiVyxPFI6*QKC@l2(u+>tfM3+RtQ+o4+L_^j+X5UOy6%EP)vzfil>#pOD>DN^!s4s|M zaTw+p4PJ^y?kU0p2`!tct0BUSViOcX$jKPV!82jeNUUQ-5cb(p0w+%9t~U@xRX&hV z!twQ-Yis&ydzC4~dzGRUX@S{T=(z-}G~HBf%DyHskbk)4n(Wk8`tEYzaH{DEokT6< zd{)1^ofR1BJ348-Yh6DpRYklFL_ZjCXt$g8Mcx7pt5tblDw+0Z=eN4D_>8gAi66ct zV-ZX{?~tL#eD3)XP>4cZph7Q~iu&TMp(}a#l?BYe;kmFjx^59gMQj?J{epO;IJ$6h zkBQ!fbMr0E0|Mmr7D`UJ#KE0%FRm@_B75!gohHe)u+9*1vKLvCmeCozYk_k(OF)`l zQ-Zp`Nei559-1QoghZG<00<{0QR%4`?T&qqEJ*xbfpm!`aRa_#`Pl)y>uLIdmtiRn zhipGHD~GJTTekno`-%LwO#>}jSnFeTBkCdxJYtT_@Xl4vW5dPtI2^7C!Snve`TOE? z&tBTbWv*B_b__!u?A5we_%SLcA6yygCH?OjwIb6@qy-8`=f7^LadZ$wMSLbWWbF~! zVX$l7!%wh@zz47D`iBi=sjTs9^1Sc<2h~##@|RI1?`V#2*)y05nhDCA+F#)Dm=T$3 z&wwV6Ya@0|zqRE##ft9;b-T}!1s%-G$Z&QX3+-~ocz^@pbtGG~L?g^=G^p^>QC z{k_Lu#$LiTPqJIwB_QR5)G^NX1Pi?hA#!LfJH2w%{DK!^xo znreUGv+tY|Byorr_UG&0M3jiUgi`iia>99WN|=FaA@$=uqjm%!q?Bgt7+^vO#HkT> zHxVLM0Hm}SC+zt$Rv3H}0#!~bNXmKY3nG4gO+g3L<-1$;+MdE!JNS-!94&zJd6y_2 zpkHf-c>nCk0^r6x9SZd%P-ZQ9;|2qHo?@S#16c$iIC9mX1w`pd!-obetK}f}uURFc z%+`C5jymKxxt||vJO$o%WWKeV~9GgX`Tu)6bo1!W+M}QH$7yj ze!UNR?XNRQU*hmTn=!_a*K-#igD8oAfitd+6C^~a#80GUNuQk1qM%aya@Vs7x~#j0?|B9e$Q z1GNJ$Ybp}(4g#f@jMyB>VZZHo0!Q!Oyg&@AYcKl8uUdsz#Rle0j%O$Q-e&o|s9Usy zV`ig*KIFiCYuj!}oz>zJ-6P;k3TLjJWPQIR6I@J46g&ib?khC6fcLsucNq@aFC$YB zHUN1;CAx)8^?oe1y=)LkO?p{Y0+we#0-vP!US_lb)^!&0%U8BtzWOz?yu0`2UV@A% zOPl1Lhxu;mWqmpFV5`~sEyNU)GdYcka-LF|V}Q!KT*ckA8OO56W)CLWH{QA;uAAQt z1;8jP0}8f@%Zn8OxM@Tmrj-;I1Z6TS4?$&7*L_}HP#mD>-p~;Qkl(+Il?K?#m6bh6 z>Z6|Ww;2K*j>c!ZjzuV3i9HbCi-eQWIW~l_IYaEOL3e6{6auW)$1snG`kiwI-+1jc zci~%3-OS6VwWTvArDoxOyJ!TX>4s+NlV&fMGfp#bR{_*xG60`P z*VUFile8QHE+O9 zeN%+_<+ojGaaw@JRLvc~P|2blw?_s3KAV+7xowtz{Y9%}glgBme{{0aPCiToLU{mR z9tx#A(RI!+*Y78Ge@OW_fOWZIUQP z8O*5e9ubtk7`C~-VHQWGyU~9DebC*>{O($5KK6ixNACO+uLt;3bb7t-b|4=g0ybX4 z5WLX>rjt8fOc_GOi4mJTA-+LD|hn2gC<6;Bqgp-bnIpt8?-BN7|DB z*V)uV{20*I%a0z_g>m2@yxmbvL5;%22!@fS8ww?!@FC*Li~}+Uw+C5HX(z>mr6wA5CIdaUSdEc=`qgOk#YRfD#73|Nq? z!LkL^*72BPo27Ngg|E+ls3rt}Fg1PDN6$!_?aT@-%B`*@fF-oRXVzC@Dbmg8oz0qR zDBtpL;-%&@3k-C&LJ1o4Bg+_>9tdZ@9b0VKX8u>vUBT7Nt(-q2CzaV;O|*)`SsCTH z%tnx~li(-pU9H^vJ89-!Dj<^i!2u=VmHzQCa#~M2t4d#wLA8_|` zi{jY(et2adLzMT}ef49QafP6AMQvRI_>_^tH7Mi+6n}<0@R|Wm4WIu%y>>kx$c+9G zmp@vdtVao<_5=z+;O_FE*wvm*gUKgJZ)L9Qn?3wieUplCY_+8 zn2RBWycM1f&Dp?k1YUf3dPM|XB)E8Dnh=f&6VELp8F~En#8vVVo}{q~+qV;!^tEKK zsQ#qt%;d)1j)P@lbY_X)f%89|I0Nlu-O@_k2YT7ZvX?t47xR?Ax0rbaB`#ka%Rv5> zC|^N=Qy|~k%o*m@t9Tu03LEKiE166GR>4rc<-ua-6fC%G(B`CuyA@8~{+ul%wvSU# zu0@iYRXFvR=?#Qr9&jRj_ox)aHZFm6j+$e(aQsmAL_Kuyw0@bHQS9}z}c-hIrt9|ZM)8Ne- zf=pp4_^urZR7>lJoUqP?VuI*KSuKgVC7G4qxeYTb`P9jZ1x-6!Dar^n?PT=c1vqcOsD zIS5j7Rm0a+FE4-e+e$n^O}KmnmQUVS>|%SyA(N!>ee*TG>m}XTWttH@N;s+OgCewi zEQlnBB};Nb{cH!oUNwj=Z~6F@1`^(Mq^f`wY-q~4;hwOp9*`v|Vk0(V=HO(}ofI_F zaBjDIrD& ze6IyyX8=)ZtF76PQUGhhua1AH_&M$B#?*;fpC@Np!5vBcbnqqx4C|S(ubbY>XAsJG zxt^i9pQgXWy3>@w&3Ese zp1wi%tUI(U`7c&wsy80n@Xb(sIArjVvNZZLb{f5XTo%B8!HKX;%9z)%gSW;oxD@)D zfBXt8BawPV`-#06dt;X-^63POH$CA)AT-O0UN7~Gl_Vz3Q;!$5_%g`6<hkK}`&U5PLbjwX=V&v!b64idLvZb@g`+@r%Dlzoetsw1qvwxN&%!Km+V9S=(` zspB%=U}I)C)p@vFv$1D+pLuqBND%t~t zR3>FVmIh>|XE%LoifAh}yTrsacZA&udFJ}+2}w)6_de`*20p8L{v3wRpUWyC{&9ik zZ6*xv_nMg@# zVkHJ49s%6EE*gEc`UUg^{l~DvHxgMlud!1C-^V`pQuga)KX={kToXv;$rdjj6ra!Z z;8uRvyn`?h!#ClE!P$xi1K`2+$W~q;|4+09uo(Xm^XE(5` z`;2SUfZ|2WvNSWUo878<(KkL;Su|o$WEA{9+48-esBog>ji3N1Ghnic86ZNnDMs5< zRB3EnP`4IJBbzN<>>^_l6%NP?Z#YdtO}}k^J5Gev5%bD|sq=hn9Jm~T+Yi5B7Y?z2 zu@w>9US&G3RcOF8tYS*FlKruH9pehZG^!xw3Pv7q#y=m-M8cXZp?@t(q9Nc(WBks#j+5l{IZK# zE|b3gwiA?-53<&I3}&epH~&G2=IG-{1lG5qXsE{yJ*nxki{;Zz+5*Zrz)AHGXHNZpKu0k?N;yK7o4VSk7jPRu5} zo1S+QNi4B5=fQi)b;Gp*7a1Dd$WTq_77sYHq|Y#AGRAfcR01Di*@<-^??hk@41X zD*6K3S6p`eE>bQBwYL0PgPg6A+#_Ldm14q^MO?gfmN;CQy}wJ7cjB68U~OckX0B@@ z{Vw}1jx$gm=rh}`icp0mkDn3r1&+wWfN-R?%qqWgSJa)bb(M#2fpbK%)94j7$@xQK zJ)o1bGFBy`<|`O1Q+e_T!Kq50);mN59;B0iiHZ|NMzKMf|tFqCU1dghE+=#O2B5qDeRwe5WU&xBM&O-3AT9CVf*f$ZuTt3*}Xe4M9HU|irdp#*Jg1^Bi?b`?!Gguc4Goz~8zY3#tD!oUr=)owr2JmLg@`)D12?5l3FX5(loq-u!iH)z7;7=&qHy8j9#A1TB?Z(g@HNpSq0nB0 zI@YS~im{Np8g^;31HS*Z{|Rg27gB#zkwpeeG+sG`yvUY07gzozGYXKF#mwhC?n!bm z=o@}#c18Z7Ka-X6i=Y)Zsvukvcj4ToVlEA$r1^*-eFUcR;?ch8po*efa4sR9m+;|F zAg|B1B>LLH9q=q9tU9rKy|uL6rq{MQeIen)A=6uc`wqEgd^Xu=CU$OiMHHl4OQ#6g z54QN0^;5x)w?%PJOLh3;tw?mP>2i^AzesA7`LWFOXWE?iXk_GwUsw7Gl%A^&sIlBG zFZUN}fYG83#3)3a(HN-Zw(}(jTT4DyGCgQu& zJUPXjIv_4dR60>aER~Lq)F_e6vD6l1D>i#%_Ed`;BiXrEOkHpUoh)@KU#4y%D$6c5 zYfySNVqco}MAD}+I97L;^333G+4qvuIcT@dnLcJoUKK@pphi0y96rN(k`*jE8jkWl=_&>BE{#_A?PhdqxsCK75kdnx(99ty)OTIGwxgML~Y$o-5KmHy_ z#3L|gtHHPh8Re>|MvcR4Tj|e7CG3%Ntf1loAp=Jih}2Smo8Tgkbx_VA$sOXAHPB9DeU36wcWtqv3rXL{sU6k0Qxxx0?R-e+SM)SPG`Tw#jgKj= zc%vJkmd7?WUWofFlv$zb8+;|kIvy9-TOeRh!fI#RLVfQifQm8^r zv@ay5gorrU*k%C4d}tj=mLO^Y9F|->%J08^a81m=-iY5mwforiYa3MXgAQ_~UI~!Y&A1(J1BIm~f6`1x~fCF9)!f!p#t0+LTzi#ez z6tn6_s|Ss%Ad|Vzg1oD;y2CIun4qI+=i<}SE^Qhxak85uhn@3#%KSHe5+;AL&-_Zx zxY=Zug88Ig#d1I9Z&dlnEf-)7#LfO#VCj0@pk4^eCS@gKHmy8BrgKyvXV8z;D1*sR zxuFF?ea#;uZHc&9{l|YNDJ+d0Ep9%D@uzYB(VS5r()5f1q|yxRmDJYVuVIEvJ65OU zJpej{R|rl7<0p0DWpkGbRCOZPQB=-xgIu6llGl#iLErv47gNBm^5#}xsGcF1*z!kM-?`F zYKChhiL4Vak8ubER9eR!(R3pnV$6%vKfspQMy5V8;L^ZOlyi(kXEC~#np^bYl3w|L z)o-v-WH@k9rC3H@r7I};oZK@ zA6eCwryL#v2EM7 zZJe=f+qTZwwt3(GZtdNBKc_3zovI|A)C1ANGGi45dpRayQY;%B!E+EZ=jN|!_Gk%? z9yI%@_oC%LvH}E2rc(%N$~Y>3G4_7Hu7~Y+&onb~7RG9yle-p!h&xSO_^oryX9l#S zyHa5ZuFB++qLG^bgn$W+C6lmvLyhkaK%!4wp$3ocPDm@W7ZrGSax17HYdSHwHXj1F=2U0BTC$5iJxPJpCbpT9ZIND=j zUAUoz_bK=K4KA-q*@aDdOjWn5Zn#fbrY6z2aVG*@_8)4zT9l*6kPoc5{+(ubJ>G=xG13g>$QTZyvX0axZ3pAvcYs0p}j5XZnA?<57S62Zq1O)xbb&m&P?Xa zl@d)-H2L-l_&AKG_U}1ovo${E-K2Ja$H#wsSoQ52=IBj1ekSkG_uxA~fJSI8;8uY+ z!4eCWCWxBHx|2rVD=`OxSvL9hG?a}@L^4jj1D8ZkBcLb93XL)Xrm4wJZ*?Lfk3|=! zPN$8TPEUm^A9u}?EawcqDufyvCq2chYDi<_5%jO+tE|`6QRUy6huB~EJ4ai|5_v#x z7u#a5Cj7a;QI?VZEZVWWWq|gvaUN$Q3S-f^h^zngqT_cxnfa`XjJ%!F#CJy~INqT>1~mqEp0{W~hd|_I@%g%0G4>51oGG zclMR`!49j&0L$AIYK0;7@-)0lJO+)APuQP<03@s^u_U+hGkYVUQ~VmtkhIwsA{s1t z#SnGKpY!gfiL!ui*Vt4oIooYNzpw4r!Y@3YO5~4SpO1@R_GVW{SqCj|1Qh~aahKJX zV|@kB1qv`Z&Nd%~kKak?)>I1jv}79i`D>_OQzo2cugPbHiZZPCkn8f1rl`;%I!u(E$?^B&O>+yoRGWIod%RD`aF z9JH{Vl11j~Q6?z( z(i66#@9Q#)X}q&)rEOPQDb|BR@*?+y6p%_l-au95d245b3UgK8Wgpxq*xyR-?jpyaqmdS8+8@+3aPu2TL z*>2>?9)|qs<|l+r7d4n}hNT3{^OCqoiC(X4% z1*qHsjrC)knzJ1b4K60{@=77lbI^dU`&nKysBmyiTlkQxN9oEx*-PV$p6cor%WZbk zjH+{Ld1-4VA}^N3yzatYc2Y$qIt;xx6NWdHKO3(3`cU7cYi4z=3*09+PyvzhW*AWt zpz{|bLV$wU6z8NNiGP~A@=V1NduCS4ntpcy5v4Y0k4|L87SDZMavWd_Fs2|-_<;mr zSmvl{E6`~QtiQf>el7J#cALY(pV-A?lQhy#(Bcb`iXO(7?be8gxO1`A<)7QtF(AYw zV-W?4G;3^$tz8hJ2ylo^D3s3r<=@q*B>5C@h2V#ssm#-`O%jrXfchWHHNy-JwnwAh z#g#Rj8M&?fNTTcx6NykKp1Li7smzk{?j_KZdaKjV6N6U`nm$hxLT)GEldnvjh6Ib( zg(Gve7P^$nFfuktgrYLbOn%#MC`Bs6rIi6N=lt0HXY_K_G!h%|k;ht2G{zsdF~Z3r zbs5$XUl{WRCeD?n_k3&mNr^?oA8f59C>>f?*TH!ekEk=Q8Gj(jB}wy+)4mZ^YW@zY zwN0a{_@a986fKXsLHCQUAS=(@XEdGHhVH@3yp#u;#J~1hD0V`?G{(7Z2B0rTxeJr`$|>~}sT~KN zdUJ|EHqi`{Sj>2=y(XB&! z0q#(V7B#=hOsj(U&TVPrJt2p6V#;^`UD)8W7E;2?DErMli%%wLFp{q(_E%gc5$E+F# z)T!ZVh`P|Qfu$yY>m=LgOINT(>j%6XV5R$;_?L|+OWZY@0Ym99H9(Q!e5%Qn8YUg< z04py(`TLDAZJk>IvIP5C`&*O)bL^tYB5Eq=N2XaDs*nLCx>%mJDxksE!ZD)v5$J4B z3}y`GLq}L-cE9e}hynd;*(>**#s@buCo;?0T+{)kuDN}B#&!KjDV*gz5ufhL3lyR@ zL>^Fmrt4=jz8a0x7y!QF=~uVef58R$Xpt)WC%#Y2A^?qmm(DbuUJb`u?0S-WkSsPnolBM%ihx!Q<-#)^E??Hyj~|GQc4tsh7+Ct|_+ zKJ7n`v@eB!K)5nXLOa^#$|!(L#!Qrb1`~^)5OeimM%X z=3$kG24|}PA*G78bH&3(yX1`8E5$I-3Nj(XCD@M1H^|dTe5Nk6aY7*0JOJ6z`;FC2 zorz)EM7|s?1nO;Xh4+swP%+D5iB}p760%008Z73zfz4474v~$ohhpX?G@@W|R&Bht z6mw@dfLUD~$Uto#O@hddYn)}bbBn?L5c(d3oasHmnKTHTHs4m zK)qmwALRlu%Zqwr67Mx^&$bEcRZynn$UP*dGgyh~QQ`8gBZ*4h`MeYO%l&cZz(f@t z3TKKT&;#oE;P#@M`InL5erRCeZ#W#k_D#m* z%h!nU@n`}3+4I4)HxZ-8b0rSyci&xLj?7HtZyHl?Pm7iTSTbqTj=KZFAy-iS=PD%% z8o*_Dy5S3ceHTz<9(9b^7>C+HD+}YM)UWwg?j2*Cm#r>QkCP) zR{9Oxd{(>E z>|zN0d*QDaB0f$Det_djJD zSlGCSAQmdg^CAuegt*avP7s=iE7H{KcY`GDQr>*U21dK5X5Drkc z9^15$H@m@YnDe|gG3dbPY;u@!P3;1g;s4|GzLnL24}}WwT!GhjLVrwuY_!|Y^DTT( zD4po8-PBy_0{Kd&HVO?!!{zUaX`E3X>yjylUnQ}mVY(3S2E~ZbS5{#k=y{{nljXW4 z1bv2)>42we@Z%_3=v*B!Q!*I@y!*7<%oC?CziBQUfpXgzejy|3G@;r;{ef^pD{k?Q zZvz9`Kzt8qgt0px3>a97cSfzQxAsNc--=Yby0((rVpws!9h3%!A`7_BS)TUjSV&3N z&zbBgjjXaCiym1UCnJDIM7c3F=H%oM)Bw6Y(D#~BI=j^|RU^TR5u0R38chh95E>FB zX!4ZQWDHl*N6Y5IJGzEez6}h7L~NBo8zGmwjSC7!Zt?XyAD#nCY~F()zBY1N5Ip09 zaE#Yq>TpilpdG{pRWw~V$HDDBZA&DYuKDp<^&EP9I+3>SHU0re(aUo-mkzVYX@L>L zTxslz-mRX_wO*-*nIavc4n%2>A}q8US>xxIeXx0$M*Zhc_H7&`#b)ByUM}?$f6ruL zS=TF)T_{_@3B#mzh`mN+HX$eEx7IFZOmlNyR94GL@ItSJxqC!MS+Q1Z&hM8hHi&cH zvoI-vNGuFKC)s{%5p}RanX(A(Q4hb1zQni@Pyj*~fhp*5T$l7sxb%t1vQuL?Vh1|Xv&SOvkA#?g5l2z;Zy8^f8-V&T^rm@y|&|$`vZMcq+vXd*fpML)w$2V|UsP#1xE!~zGKSnC0N=#KMxY~7r$i8xUdYug zo8xNiw^~%&zwS8CW2pc*)0p&{gn2`dG?hMws=6PqyZGDn$}mkj$U7&h^shusoj{~q zc`Xv}tTV$3Mwnya#>SC>5gdrD21krv|9mw37sb=e81kHv={}KUCoPt<3+mZ_&W?IL zh{C8*gC2@vf6OHYN3^k^I;uzOaa$~N7g6H5N_1lY&muoYB)nQSF#1&&Rh>~b+B(uf z%HNi;&SAbBD>fA0pLKpwRU==ldp6KbYQ{sM?LJf2R{ImhvR|6ly zWm{aCHHa*M(uj(H8g_LOFc59y^d-0NEL7IJBEU;J_Vp0MtiScI%E6BmaT`(Dx zQEIcwFw73g^7@>vr%N12vvF5|!gGXkLkomfiq0=Mb7Aw+;fq{Gfqbq8hc}xsx?ogg zycDN5XWQB~odF zBFUU@7s_FEsAKSID>NbNGdlFrg3Rf~n!xHt%;lj=( zGN=Pv%&NOyX3`Q?M_af-`rnkSGrW{JzhFS`yr)nA&1dSyq5$K6-zmiXR zd{LHH`Ix#7-6c+>%-D%fUy3ce{Cqix&I#)pT}kx~Ws>^V$@EDoNu)*jBK_RlPOZ*F zgPib@%Ea1y(4Dz1`b+h@)tz{irf7GoA_)r_Qc;U;I4EKKW`nSPMDF#^ZRyS2!2gpk ztPRLbwV_5znRoAultB%U#RJg5ZpeDFXw`D5#1qEL|5x7++y7giU;_ag$U#%Qn&K&R z8p%1KURSRoMH`5?qGc8o1ZagI?dc?QlqW1QFiA+jrqJnouqW z2$GXT2(ud0&IV+%N`D61H}gMaI{%Z=&tv}CyM1hZTf=Hg+_oD#w})kVcpu*`gA{co zgD+d3`qs+j+E_^b!(QlHi9;P3n5mVSV}_Vo_v-})-rWHf2Y?hN_lG;8>E2UicvRzr zqrwhqNimlhZtjgO0;A!KFV#B70KJA-D!_NLk^M7(`Yt0&RL~Bm2Bj*)P`Rm+Bzbfw zEPX2*dUFS2b2e2gh^8%qJuCDe=m>`GtNG3u4faU-z^^-@M-58^>K8@E25Pj~>Ry{w zUru`gqoU;=-fmUJw9nc-rSlu+xsKOb_Af@Vnz1VjF~b_85LhJNuh=uibG{Xa9BB0C z3wFAoQN)%-qlpRzQ~X$zsY<9pWq;@w?@)TOXkR1-VQJ~|F{lRS;uV{*xWTW^w*n{N zl|0*?R2vPbjSEiB48B#gK|*8m-u%L|+akt+0Jm(PY1w)L~6k~^TTE^(F z4Ug4*s^SXhv)&K^*@z$UPjJI#Up*UDaww;Oz?$;3V9YlaEA3zU(ynn~sl#CfysOc3 z`CsO+#KW!g#JGTx+#W~Z0hU|&f77LzqO%GQ_9C^nO0*G|)zZPpO#rXp@IARJ)2W<^ z3tBu#k9C}okW%t&FXqxi1X_d_r*EIb^QMhpiMwze)&DfV>Ci5}x6r?^SM@X;0 zcJtFE{APB+>h&fhQ2dVoTjd(nO;|m1HltaR%uATlzohI&Dg)prX%XK?QY%%y1Cg=Q zQ2HA=_R#c>Fc^datCc6JXMgN7&Msbi5}9=LnTb`Ia-$v3Rux`-DKi#@b2-clC@=V| zu8QZ6*z^I$rj1jvxJt42{xvG$QdseVy-k~(8V$zj#5DfR%OpdUbKF`#7vxh4qlmpF zUg2_Qr*u-r6z^Ss2b}njxw=B29<0Z_C zvPTI&#l+bh9l`qO(ZaGcZN;Alv?uRHgxT-nwQ65DibaagpucCINUB&!2h_e<(ZT>* z%oP1J3A&*-0O{@Ei|Z}2ym(_?;Ke?6yv&EI4|l{%zY7k+J6%w!|Ey2but#eW1*|ER zfywfOY+BP#^qb_viw^DPNVYxW*QqM_3ny)@y3^dr5{Y{87=J^|QBY>9u3Y1G4JHs$SWMN_2lQ zhGHD9x)stm@x_;ya(t@D;<&(y+z&(2Toh_;+Ti1A{%}EF;B&07@bq1~kn`(QodogC zycYgv$sq(UP89pI7BRcc!>joz-^F*Rlykrwf;nu2ReGWZnx#?hyEd z6K$-Kv1|CY2wq)SjRZO%iTmTIOX)*B1H8)~th$f)R>YBmI8~#OI20Y!2MnapWgAIR z_*-p%0ASU{Zwg_mteB9m(|L>HqYVXz5}rRP?z3; z#nUFTP;FjAZfr)LVuNBDN1NdFTsm?^zp8z>;sQs2VPrQjeL(Zrdb!YuJz_ z;b^Z1au%Z0XPwqnc<`i}EY#02RTctKHbF>!h;FoMQ*=_1@=*`9?XmWTG0f5LxN^SF z=Vfvr88?oF`CE_PvN@dmxVsn4kf9G@k{pa3@ z$afJzUTdvZ ztcUE9bTypgA>C$Vpo4vux7bW^4sF*o+Ne7Eft2mr+1Q7;h68mZjJ5l{ zj#bekk+L0z~@+gvIr6_p{CB%5YDg zrsoC6@alt%bmTQlvB+9(hcP=cS9G4$O)A@t`g21PBWC4IXw#l^?A%-Ie&j%D*C)Wy z87ruqDd->14)W?B3ySVXT`$GvuYg9*%Uj~uYE;Kl6#vL?NCkoZr!fiSI@Sn>(4+Mt z=~QR?D;(u4drio;WMhi6%JjF&)8kMy;igwV-O9^M$)@#RA^f?nH7RF09&oYq zW-a(S$o(lJnLO?fGzyUwNVmMVZ&*7#By1PfYVDiz@s@KFlV0QOA%%j}gwxM=(CEWL zH>*TOTq@ISgwv2#T{v~n-o?=iw)gv`MG^&Ua85kh2W#dv{~^A+9&)ThvnDxO!Fmyb zYvuhyg~SNdE`C7-$I3}ir2$=UaclT~4>5j$vW=M_FZZ11 zM>(%rJ-)z2)b7yo`e4fDH2WUA*rhY8;y)fa!Eel)kc92K{9IGT5dOjX@Y}-#ewO)I zZaXTm{WVw+KfpNX`kWBE8r>y$e00-9A1_{b7Sq@lAM9VtggD>ti&&t`*N=?}bmp;| zto%iw5}~~uj5LH@o88h%2$=S`VHgN_G;>tPE;mCvoF~(Hf=xUuSS@AJ26F39cLer1 zk+0G6;wX{xCARzj%um-BTEFG&f&A`s-WD99yXXOZk>R&?R!Wvc@%3TDuX=pADszkv zA-yybItT?@-{EOe32O=S(rfhcy>Ni$>MLbtgpkO4DIOG#_JRD&-_2D=89>~K;^ps< z-Eav{9De^dqwW8k-!)Rw{9WUMgxRwh4qFAiB*KSiYNj)|>niR=yujv&!F051L(XeN z4ePE5LXMi5Iw~!UZL2QVEiIg=Rx&Ns+=K$DB*G>9Ad~3}B}o?hg1gPWFW)wI;=m?Z z3)LXJmjjN>&rON=pC+i3->K_>#@DuqHcspxiCXOWu9Iaoy&|Jr;!D{GtyK&&o>M)k z9QkV>;FSuX0d8*(=M9}soJSAjRs%z3P%>UC<(RZD{t9y7Z3N9f z+*#$43esbKVgGtu)tuJle@6IA$1r^Ltfhc;pH1?#=Yo3i*s!haCDSxle7uag;)Egf zuICF;GiIB^L^#s`k9tq@uf^&x%ObG(1D)$qba2iXH^Oq8b_&Vl1D=TpnJIOOPrs?&kr0 zOb~jZHfxzTkZ$%+avvIQxvVqIF2xBRVNZ6`;zb-?RtxiJ#vI9;)>mLD#smE%iN*xv zCW~Ou(gdlIVkcSV^u*uTDKU?xhh(;IOHl?_yP9OEM$%)YaMeF2DGQgHza&ht2NPxN z;v~*`wYN7E#H4fjHxm2Mm*q9MDyZoErJvkdwfWhi-G<`kp{tMOi~>l2s&(rxI-@X`oQv@>gL5P~ zu5Bw~ya&)#6txnPenHd6#{6#!OPV-}lB61AWBcq=(&`3ps~_)gg= zRm(&lR5HX*@`ajvEVDEO+M|JYnr&ozrMv#Z&m;wkxL7z^ixZu0uU}DT_g6$xJhp!4 zXeg(*Z1ps}LZ%JnbSB}|li!U9&zz+H-|I=(wR}MdjezmXNWMBX?n(B2o#QPvLWGsvuLst2gAk?0Yn2k$BXvzBR|n z3G1OFVG_3x#qx0_WmO z=5i(AqD2CV8mUH%>Mx^=Xz-V=5!RqN#O{OyzVP-++iSM7iGq{Fv${D+N3f{+xd%le z(xj0a>Vy&76t@Ec{F|!Qa>jkpv!+H_y4bRmQ{tJ)>-P(Da~N=9lIOR4C- z!t5btG~WW8!)yjH;-UX$c5@b#V6jy9LINqCa6Kyo2t=0%r&i8QNKAlu#Fsf|(kv#F zTN*L*DKuR*|5Y~WQcE}V;p((97f(T$=mUkFifKr;6XwjkCa_1O|0E`@_ZiSto4IUf zqs2_$21uCPI#GmpAIjo~1^#}uKeEI^|gWnr!vfg1pR7{vVBnW;`=VJ@W z_--O@HJ_3KteaO`5_J^46n$HOHIAh%U{u)0&b3OIik`t;ZM2G$oB|HF0rJe0z>VJMBu0lcJ8F&bp{?5|I>LUoFE?I( z5op28Q`K(&fP_$Rw@DO5(eWOONz(9FzyaNLx zHKzG2xKNBe%>zP$3ECzuJoE!aCslrpE+|+q5=4%xGIIZ*h=^4G0e6FEr_V$CPoRe4 zd`8Xq?1od2$2M^M#SE~7sBZX+(V$aD@&NeU^%nt3?v_HZ5&J+UW1A7L>mqw?QOPg{ z?x9n}^9E>3%GFotK$RLS0&gr?pTx>gn_I#l%v;6h{fZ4Umseraanp|YBtH*LOgwF{5Xe7f&PKaKyk zue&}GbTYedZ=5z71Y3z31(+fxIc$~|2r1N{oU*E+DSzjjitlEinP=Ng2$pl`3%-Az zERLj1ML8#%?0=47A;SU0qejy>~lN8d&f*Q222XoIGR1uHgf|)k`gjmI3>`o z0Ip5!z^E8oc;R0Xu4VYfW{yC7^xmlZyxyovu?F4op)D0OzP%17S1P{ipy^;P5m2}h znCj}Ze~gwClS31GM^IU3m;Vt?`;i*k9zdx?gGAHl-Hsrq0ll)7=Y1A`qSCO;N`%v2 zhm=3jiEgo4aZ2{_?-cfQiPm#wn{`(84&D{#jyvXN>d!dGMSm(V%&2o?QO=|JH(xvP z9#uI04)K`dc5#7I;(`O7pZzavVovQzO*b+(m0d_5{IP~z3=C*;O+j}z;CvbgScjS` zj+d&3)jf#$ZEv^3*DP_$p)F4t|~8l6z|}Uq`Z!=<{S?bI_a2yPgm%0(^WMHa`UGU z2Og7oHyj%eU@m{1biOfDJN4aD!W}xJp$yvvUn-dV=rzz>JrwmNYYcRRq6NVoSi1B! zg?}>tN%E^n*jbAxnM!mfjv-do;2$K(asGjDMXML&{*)cnT)g-T>rGsZ?MJSU`BiMg z5ehH83f%+Hb#K}qzezbPW+n^heRB?p{bOiT$C31XH&7b<+LW*u2XbWT$P;~z`_G%B zJyQ2=J7n6X1@F9UQFwEq57o~Oj!lo1S~Dr_KxNHol{w=SINM!4Ma}JqJ-Fu?@Sn9G zDeYrx)67uEpJYg68JgGab-e~5hPgV*T-orl(5p+O3AwzkUD3w#@Zo))$EV5gQ~c!$ zM6?pUXCoA7K{q#;u-!cP>bxRYWv+$FKuwfiZUF{jmE>7r{_AjS$a^wEd0h&Ix)Nu= z=aTG``?T$}T*&Q+Ku2YLI_$;0CE;MR1^faCqGJXe{qbPwi~8tNJ0YHUKen5-y;m)k ztGc`Gc5Pozqn3jfN+h9^CLKd=+36K87b_Y4O_-38d82or%dGH0RzHh??P4!j6-uBa z|Fd?h&pVp(QpbSa@dLxO0ksQ`2b0d(wtx{(AgwLLBm)j*r@ zkqmRy0@0JIpe;TOhG%W8J)eA&yCAo)odlj@_hLXz5sQU*K3gS$G#Pi z-`+X@fD({bZ|;DHSSr3_Qpd%yQ?sAH>eMj@njz1(;N0yDUsfcQZ(NB69av{ zl_Vd&!9Q0wvlliiunB6pHtZgB_v>{mP)>-1#;kgkt--8XSQXR=ry*b~TvuHCu_{I| zF4jD_Na`ZqS@DD&MBgvmj$ZYIR*$|ybDUi@LMp?H?%4Tj zdUn-*{%e33fddd-ef3J($&teAN+cSj?JqWUZNe!P2YgRxS8%6s^Hs=%Dkem{R5c>& z>I;9(w5_Qr&}%d*w&-T)+y3V7fm&~_hLHzZC2Y2}j`!*1r?zwe*z~_JTvL-{)$cyF zuG58EI#NHQf!vM>g8ABtK6|@><;7pH$7)0Z3^@Q3l)Qf5c)9or;Y4<;?}*XnRDxL= zrK zjmc(<&?1&jbX%~7j~c&c_zqhUQ1#H5pPz;7FQtUp7qvts9ANxjnoSIOR$+DpG$O`V z7cgQY)BK8^Te%47e^h`nLxgk758V9Ji)}I)sb>}2sFq{l0`pA{X*wPToYXo&^izvx zQGWiqwH~RTI9%_(P_fQ;7BD|tYL(3J7F1!!hwM6;4I&o?cr2*bB~hX`WKh4o#FRa| zxT{|B(}xyN#yQKTn-^VXDsI zdby`#dd(ajjJnSNLdwZa2J_|{CI?|xNiR07%I!}Ag?|^ndns4*fP_*&bc>G#(Nedv z(dor21MPtuHOx$TxQI$tYFOpsci$(&KdPx=G*Ulo1mkm6eQ~EEa-)!t=dNRLyECSh zBlRp>c)@H$x^zbU#XR1+G=-+Y(WIxpZj7sYYwf9>YUEpnnZmoz?tqwpm}3^QhEH`A z^2po@)$@AbC%x-E1&jo-upmu!C<}E@DCo(l8Z5GxgwPhZ_@g9=y!TWnAS7P zW;f-jkhmVMe_^`%W8D7^gesZHhUM!^EsarP9I)^FpVicO{FeVNW^!5NVT zJ>ot8WS#`pT(k~PQVR2hTt-CN;*nr$CNrvUVo`iTROVMVZ3569npXAvAv=$%CF=y4 z>JyNy{}a(W@QQ%b&4m}LMW&3bpZ>&i2ei_Xs&%swQ@N)nKxVpXo*R2{EFzoAmAmMF z%%I(l!dR@O{P)~!GvJB1dL?**n9t(kcA!A`2OZlyl0h)aI8Rv!;QQP z9~~1%M)G=R<`oa3~OiXSr9mP@_=>*$r8VmzfGNW8o|dYhge?W`_Pv4TIy0ogwi5OLD`75(Fwrr2iS0QQ7d znYEPA(0sq=R2jcT6T%wBA@Ron{pN()$* zi4<%z!7@pYQ>*A6p2?;JcqP28B51Ag@B36B^gOu|^+gsg@DnoKI+j=h+g@L0xI4i} z!`p2s_=Ozdk+X!a6SNZ2wn1>v&={uhr%nI8EG(1#vB9M5nrV)4(rk06HbB?SF4h?n zodIH??+A*E^4rtYH?N!0ZI=N_mm}fJ93s5ZKkB3p-1VYt?Y^k_M15&QG-6?jlr_VJ zL>@kk%7@Cvk%!+$Nnt~w#db72{Tvv`JGkKwaa@@=Zt>_+!IAo*N8&&1n9g(tFg{j% zL?rXXH=$QviOPG}@F_%quan>>$4P*;YHz}Drc9+x4gr2E)oq`;{j+s|oKZ-cohF6) z#={QWv{P$-rdnrvH6L88Om^~Kc3rVfSTSomYNtv)I3Tl(S;*9M!d?wj?SNHJ0=`C7 z2q6R#)|?8KuEN&gD3>yJ<}^^-_PK3 zer|sk5=9<}AwPBC=ty$Pm}iG|od!$MjtKX4G)X*;-MB&CiPh*887aSWl80Op31LGQ z2BrfB`RBN`m_Km0Ki8fEBvnBJH3#5+^rV-98Ya$$hW(+mlsaqe`?!tazCry0diimM zM@1M;aOg;+JH;`zt|LdULJ6l$XW-*}IqtCpW?Scz?*^YL=9nr^h4 zDZJmUZs?nx#)Cmig_w)nP*Ja$@uA;HWe0R8i|Nttuj|D-+!mrizsFl56%wZZkPj>l zHT$P|{uC8;O`FiMxa-n8rp`*|o=Rpq^{`<1*u4|kRSABCNt?8*Xb;LQXe5beVEWIl zcu@&9shsnxfx}QLe3{^9%f6w;|MfA)!>!?(-yz7#vYN)mbaZ$4y?|86HaAEUZ9@WS z-ohHQPnFp8UUB@@tSajw~W%DXfs^59^!6zYS2a>xVK87Ch9;G^9 zk75+|!5=t~y+sMkCO2P+pu541MBh3AJkT&MJefCr|NOY`Qp}FwvbFj!kL67u`E*!O z|7xa^nk=M>Z4q<;u~}5vE0m)wchqr^ayG&;jamP&f+v7OD2G3Wf%-oJ*UT$tn;%;y zwopjCxq5T`PQev-633eW6RVP-+rdDgX~Irv^YggpeVYW21QAPP&6&u)rU7agnT(kl zJB`Xnu1n|>pDw6DNs-F+@SAa)^~p&+zWgQn+YIEbdC?=O1yQ_6t%L`2(b}~bi*dG; ztwM3^tE$l15-%pk_TP=D%CV;3i9sQ3+`9=1TY-Oo>dD>e;Bqhb!^>vniuUAr&OwJTo@LX*EgvIn_*`kC!A*H~MvRDwB!``Ihxc=4nS)K&q&&Pib zsn4T3c2j!EU$Ge9vmju2>I;>UXa$zH<7s;w23ED>r;v+9x{EaIfOx@xQa4Sg8hB8j zwfJvpoZKQF=<4b&F=y72-?(~ea1Q3ssbn70?qW{6?D{(_Q|tQ~viG8ydSj6Ja7>$3 zj@PM!^zooQ2y@kH^X(=c-*GDz$KeZYl4%~^RoW{5*`;iQutBznI2rb`EFFakXZcm{ z=`7UuuOv>?Y?us*hF6pJgaf`D(}R#VC+QS=Ifynya}|;rfVg9Y03E&RcaWcahWshf zKuhRhM8y6G{MIIhf@zZJo;iO`SRe-rx0(UQdpy2WEi{O!W>W;9xV1YXO686qU6ED^ zhrOo{cKGf+1mv%I&6G0`dh=zZgox6;#W*c>?BytOE&^Neo}HE5u(}}$BFqZp zi()X9;Fjiu;FERv5v7Wh(fwNfA$XpM^bmp<&fJB8@NGksH{=;uftTmU3EFJ9x=6x+ zQ9M?J|lmz3tg1 zBJHS}q^qCB&db4-L2Gbq`Ksg`EG(~IK%!1IBCFmLSC?_PnljjWZx`4p&L2dFplXmW zP`iKqcv|@@+yGjEC!nPWES8ffb@{$m@v_vAxq5CT<9V7YZXUvcIO_XG@H#@Nln z@|rXdA%i7jYQ(d?CnMUc+q)8qE>i}j$=@`%av}XZX9TYU%oZoGYYK zE#)2gxOA_hAwW_h&t@cCV)5BuPTS`ubNUUV>mAunT`h#r!Y*1sISp< z4ELU@rRfTNUAangae$#A^RA)EI$H8cfNRSd|21$&N+ai zK0p7=(JTmfB7eH2#-4$c{r*&q1)(#XEoOxGoNRmCx`kRLP;(MKPwT~$I=$&Uza6gz zj(g86p$YHQ&Mfhgb|Z?4%5P9hh4<5JvTs9aGq+oNyPYKEoLi59uM`o_$r->aqA2+B067WvClx|%|~M50jN znl(E7f)ZcEhxn2)`3!aegnz+m@oSQp&xoy;9TiGFd7Y97-QxLytqPB}dD=N#hGfYO znW=-lL>de74k<`xvL_Ea7}F|Ul!{AFE{Xzj`2)j-lP=YQALaqSw3Ij&x4Es|+> z6G6K&$`;xVF!b}J;NE}*z!&blye>&}Z7&h0yLC|NTCQ`hC4SNI+5A=wsSbSj2P0c; z#$!HSue&y{NQ~V~AMjzrh;ic&8mearIFDe2lWZB`KuByl>J!q0IJ6pPS#G zn;uFK!ilawG?AM;y^Ye5+q znep_-GxfG2pX&%!$qK;!M;6N|j08x{T~U4DR4N8Yadtp+g^rbX`IxpNRTzv8M^o$M zN@m3jR|vs*zwBw&zLnE2C)<6Wq4Q}Q`qO;M(i?ErPAcBwwPCmQ$1`tBrs-O;e$xh3 zy+K)brFOtb@CdsdquuljCD>K7&h16Q)y3$W7882Q-e`)?^mFya=eb-~-p2TsP5tg6 zATNCM8>Oh~r!xB_u(Rp{XfFG0W@cD2Ni3+-MtVR8A9(kUj4%(PJwH(VVEj5^-XvUb zIwmdqSHk^xZc+>p(Mtutm765L&KdBvga3TNvl}YrKcP;`%K=8p)jV&hkPPeh1_?*2 z_8E^S(MmAKKp}u*mdrwP?ZR`X#DKSopKnIXR)(Cz19*`IRY`7L^e{^6`C$gJ>A0Sr8ggXmt;I#k6g6 zvN3DZ>UsGrJZsg@(^*q?b?!{@Ozp#Ap=0DVf`)~lZC*`NI|CjUAhm(-)Q$01N?x&< z-_8)3e%A+d)aoI%r1+%FS!Ap(wHdr~hlNzr#C-Mmw(j_m{-)L}u8MdWId^R?W1!I` z;h*_7QI2d(10bYWy1l6UN%Bo9>k0|m-2U?eFjl)a3(B1hQjfcqHlGt-s1jIIvFaOY zlt2QU5yP1weEgPk=%ru4+53`2kGE|Y6b*1a)XK@!y;uor-B*f=rZAhBQU>FMd*~0b zmd0}PqEGF35$6((f4UdDGPt>%t#Qu&7h~rXBMQ)^+wRl0PTRI^+qP}nwr$(CZQHi( zIse>ybDt)e_nrMvmF!BYzFO-lWPhL=o_~G?{%=i`{5F`;Ph31qyy@>i)tF&9o>MEP z2v=-l<^(W>DF}t+WY%Pf2*$T+Lsk5&@~1KK^YhE}(DhS63zOyf^g;=~;Pt_TFC6(J zB)|Js^}%w`#V8XId+hLU^b>>uB>w=rYqxE=Z4Fl3Jc!;$0Hg#DTqK#bn+x&m6Ae02 z4`3@5t9R`Bab14C=Z8OVzGbd#7q46qL2`91uo_{(S z!TS;P9w}K_9PSPAy3oqU#F)L@c=FW>rD|71^xldCS%YTx9RzxvwVs*z$o0M!h&3P# zSC^z-=jZ3KP-xG#E4u2mN=|F>!+V!f{oi}uOfSoWO)5(8Y;87c4OwL)6`!+QDJ=}V z<-R3utoywhk=N!psQU5B<*vxQTre%4_+CNW$XL7r8plqrsqH%+S;cC|DqHuL_kwxl ze9yg!q)Ab095W8fbr`(Loe=r~v3bY)N~YwM7CYhEGpb>U8&u zDQMO)hN}ZXcrXp*S~UtjF`iriY#jx*FGr#t-{VGmIn4f=KY;KM&<8yH;R;UhmL<>; zDkqJyr01Zt6);Da(jRJELpRvm;1M3*Yyz&Dy+Ucp53XDWXeN=&{N};#`K!3#v6^yV z``hP9{0W)8#tfPP&dxA^|1fCNt=5N{=!Z=up%HFoa{0BU6gh-m9O1G_6`H5r#@7y) zG%BZ23Kbsv*v4xD^{K~R&V>iIO?{x~FSasLtz*pdjT@Fe1R1YSd>}bq9AvG15FF~j z>^iGZ)G0q>J~Y8?qHPN5w3|=t6=6uHY~2*O4TE3mXiZLDvCe<-F0L|%Kjb@7>S4CJ ziMpjN(5m2dup!i*VDcLFRLw|6vD>%;aYvcRtKzL)qY%+_i45Y0LoSqFCRVkIy~Zo6 z3NoGbXZIA`03ZOJXd0fF!CdTW!LHC#DJOv_#jdfYo#Ma9ElrBH-N@QLJ_IU2v08REe-;eJ&+(APb@(5A|gkqSYs^(Ua577}Y$ zfbnhF3nXG@qRjS+@NZKp<3o)cmS)xMkb}&FRXTBQ5Z`oO^1x76cuAWUu*!|p6Lv6F z`CLq<1riF-ysHHF@QMm3KYmttDvCDE-%--WF64pQvRNq|<5Die%ll>kdMqCQ<*nNH zGXV!2aPsPo%B0IoiP&HS?+`t2frg$$QCHAyHE;91?}tDgm~p9-k}!52y%k*`RtdW1 zNp>_3`-5uf{VUq3`aU#xo*Hz+LRw{eFXM#?hvsySu9`O0WC9Q_ zG^m>}l$|`1DB!nUQfhS>Vo&s&Fyfms4yxdieF4p%3UKxtfn+CVfH^9P_u&?n5Y?{T zTYGEr{+aq*h)JQU1_xy+FR<`9%bjtOIU?mkLSs9L^!jft(4ocS-cLQhCu4D5SC5j_ zSwr3^5TDFDdq5?!Hx&aBY>o9NGH%1%|!r-;@nEv zWaf7PtkkX=E;&$iZ=AQ#?CJ#DO=FvrqrlPOy@cV9s>|56$zdK)Oj?i`KwYPYTxww$dB8?xvzx zhR(Bajkm52s>k%lv=x3t#IFPQnD0O-TggGrDg@{Plcn4jiCCc<92O3D{CZa}52 z@ZR5c4{dq8iL1~qJa`;-5Du35uYn7%G|noB8&>wM2YZ^m?In7qE&>WBRKZ^T>9{@|!`j7N^k452VAPKIBG+G--7JJZ zoV=a_S$qh?63PSA4|M_HsxS_M2xo4952W^3uVK+|cSuM&j^eo>C_la+)dnB*Zl*8I zNn@!sAK+mP49#bO#Zl1R)*^>yP4&o{k1U0SAqOR=YYlT@&^XYObWaQ-fC2XV4CYv# zb-`~y!dC<9tmgPcBlVWVy8^V3%w3hgZqD+i}Q4%O7?&x=FH>b0 zW+@B=R+Tp)HLP=2GY;Rex|Jh@h8q7!)gXzoi}!9ow{33%HYjJ!oxd^1TS;RQhJ$AE zWGbAcxJXN@_wY-`G|nurOK?xz^-zqQ)OYnvn<^Zk^L#y|DuuSDU z9V%=tKx!hx3Ye|P4d;#n1w2zf-vAcoF;GBQkg+P5<*ppbc6(*RkPps_rRRbsTLh3~j zUl`pSx{(ZR^Qx#;XUBY1<^+UbuRg1h=tt|M76O}3k3j%w2Te}2BFq6 z=wFxzZjLq(w#P$TRQ7Mx%{2yqX)5vwe^ixpP^WG`%<;U&1#nN7V)*aTNgiF>j4Y_NU@Lid!1#)Dsg&Q>VV{4 z(V8a-l15yK-b^49;H##T$N#x#yfg=2=q~Uv&`tKce=vUYR|vyVP|GB{bzGe}$=!Tt z7PckoUkLf7!plr~KmX4EjH`Cz;MbksiE0+7goTK!icI-7i zWT$7P#v{&gWxr{O)i*A83;A=gy#WV09g26fbX|w_jU8Lxn5F=y67F*Qr4>qo zZ4rjl?{p_|6f0?u9a`i|Rn&049 z(Qi|F$lOnbILmtuQz4XRcDt$h{^H2pcP~SOQyZEzwMnon>~t5$U`%m;j2Rxl$>vqM zH0eK)^dA(eFRGBpun4mV1s4S+|Ka}o)eh$6BNnY*+%mlzZp}g_^VF6BEG+`M4HJNQ+H%V*O$KK{Kb@qf?&F zk^AAloUD*Q9t0-?k{o1mUQt$OEOC~Lj9RW$?h@)r-WnI~e z24uGQpT$IgA#->yO~p&O+0R`FH+PgR`|$GObr`O%`NKCq}(FI`VKwABzK~ex(}nU<8Fd1E5!>k-+(B zb`iR{)OOYb0AB0EuK`V(z7WB77=R~)vgPyn#F(Lr{&lTD&RVV^Y&FRtIvfM%jdKmm zj%;{l@MK@@|xh4)m1VqyXjF5><+PHCM{X5|Xvk zj>t@F8chOKB3T01VX1=*5w|7_K7L~K2`O|*z!3m5#U9`No=5zlmY0|FTCfn7M{mTW zGzGvoA|fcmB?d}^fWC{+%V+^vYblm!=T4y>r8hb#q|VDF=wViA1~9~IR|i9- zaB~m0An@HGBT9(n8eSrJCrxm@2N<}4K~j`2lHyc4Mli~ST%ea$s@^)+iuOejM7m|< zKphOe+y3G8P^Y8(WP*egiUfm`VMM#0QO0yqVV1$zO`qm9$5z>3kRdE@#6b8*r)xLC zWdm@$7^6oFSqMziyyrHn)D1Wm6Lpa%|2e4r=seitEfm&QmPtpax& zh}t1K5++{9Ct)0|{ks{DhOmanz-<7{{wJn%S-ewG z#gsaR3T6spF~Z=;4O%a&WHK*-hblOO4V8B3SoI3SyHM$JrA;2us!meTQmfxYQNKds z+zW$uKZ9YS#|~8~skjf60Nn8m#ec)V)Ag9AL&#PIhM-IYME_s?&;O}kda)s<&KG}b z%#(YtgDBPt3#{(;q|H6x&}^Z@e+vrLIzSQtup+u4A0QMq!dw8YM2ui4#QG}>5sCz=$8)SD$jN`IMk4Q+R@)oMF)u}@uvjX@a& zQ-Z}Jr|wD8UEOw$Q>A52(PMFJ|10ydce-r}L@|~r-m-(Nd47lv)Kdq&W}CjODM8W1 zc4%EDJA&n(LC3k9))9uHzjCB|;Vg#W1r+e?GM~-&I&0#v@-J^}aH+LPY)B7uOD4J- z{FakyP}adlKAyO2qF@ufOMN-7%mv zSG-$K@I=e`mn@JKgMTSBuyyr!8dN6H zbzrGLgtb)g^Z;h{JKa&=K8=I>{|;$@(~;#Nk|A)=*Kxm&Ix(`NRrS+*ZEPGE%yfBnlTfWY#9~NT>Ko~WGX88N&P5w!6VT#2zdNsnp zI)wuQ84P1{zx~5#Uc~rG6KLmSj&oS6A=@QzC8Qy{s*$4Yk$G>gmg{*_Up0A{sg0TW zWnONA-Ypu6)4nxdu+2^Ff?d~Q-cKr_jK67um&Knt+!|tIynWe!WnfeoY_Tr)b%jLo z#w9~3?)8C;Yv}-vI7@nK%Crz+bSF+C5-a{^HiT5^ATH~{#hcheR1j>$i)Qk8Ot{T8 zV4jrGqKW*Se>chYMQ!L0mnDohEuac(Oizmd)4*=_AO!o~E6vI)JU()+Bo2e?g3uJYhP;y-GWbzjSCKMzyjFbr z;1zXGMM69lG%5NR#7*3${EEb16LYN<=2J_%V*R_r`9xp~N8M0t%k{I#ka*hVcT7SX$Gz$5wbv<9^d^|8!DI~yB_ z=qE9r8KPt8Ag39k8F-=-i$*eW(?jFMy*bNSifKBmV^!u# zG$JYFPh9LoV3=L6SvU9%fOi_VSvq|nfOAN1REn9|>{LC%V$M8+I~1mp<U}U@z|!}@K9_o9gD&`|FN|ueF(>&S5@0x zFnQ~{uh7WQ-i4??Qx#4Uz9y%(M8pDjK)ct;T^UZZ7TDs+%4w$!8Dbj>|pLSG&b{dz*men8kyWtQ!m zyyJyNq#vlCd{Z`ef|1Sq;MPN@q2!qMJT_5VB|!O%LN^c!s4j+~;3sIS>QIx)&gqDQ zpu1R!mFV}IhM7l`5-T8EST}3n$=~k*tR~JJt(9EOXxO-bfH3=NW(jlCi*3{~Tl|Xz zx@qOM_T==cr z`?Yu{zTDGuhZYJ7?i&G}RvtgG>beUJhJeD+HgwhbS)Yg?i#edh()e2T3YAlAeeB zt~Uge0xH0xGnGlt?ys9tM92Dw;nfU5<$pCn;KPzojPbWMb)eaTxYs%uEmDyF=u*{~ zgn|rIQsO}-Z7FFC1*RE|n5dJMX;P5K-|xQ9F}?fZrLbTPbj|i#I=Y_(dqDQtVPjBF zxpWSt@CL_hCdZriY=(TgL#-Fd*AZl{0N*N;Amr*~+d1cMcQovIB`Du(i4qRfk*e(o z&;oMknwE(@tHPswLATx%_i4VSfy?X?sMz+w(?iZVzIw@lg{u$rCkt7&2zgY}FF#m~02d<7Sw= z$N3kTuD)%s@>Lt(NOflH8x7jhY{Dt^_Q%HX=t5tEyeU<7)TabIC?NhJyQKshK?4}> z=e|48>xPjz!g>mwvE7#)qb~2ZZK6X&SwTRtYW;V#QJr8a7W?wG_+;iP3-Nvs9#u5) zGv@H**?7nK&sT6dt)D^P$(+DDda`8l(R{q9SuEiUo;%0g;YUF7+0$p$CdGmS4N+`A zd)m24i2HeO3(#M)pFNRwLNYz4hLm0pURuXRXT?PLt7hjoE5+LgXezY(26v@pGw*u) z_o3ZIu#BCj2Eg@F^G*crQxl=a95!;;^i|qGyB(JaQK}jKs9M!?`fE6k>G1&zRl5j3 zda5#n1$;ZcrCdwqyr})VWR68wSch@siw;^wZ56{2 z_$i1NY|GUH2Rh2z%c>}8AC&T@U&O)APd!a?{g+`K|730IemEF81*G&br{AVpede)Y z0gPa_%EJINkP~^1k3yf~LwjHCoX)Ws`?Q9qt0>2YOPmFG4GN=JI}-l4iEVy&xkc-% z5ou8;?{tm%YJ#_S+(ENliat)&=>gF06dg47_VP8_8Ms*7uu{LX=06O#)!GTc@D~*t?1;%r?LNre#y1%5{6Fz8NFtvL?h}YFia5gf)qqej=?h;zekhTw0ozr00|tetJt19`efu z&}2Y3NfkY}aMxU# zT#7&_WPRi$%BShfXrFBw?wsWI`g~7&2cHhS(rx)4C%D`tBA!^=HEZh3*7~nuqFqBi zKTn#NB<$0i*+@zRW=|S+?f;qf9zI?9AL_U0dxeR$pmNCJk8q{EpjR-trXoR-;@S^N z7oa5+gf}biR%%Yp``b_jsaK=22b~wKIcK#j1T;uTG9v9!!+03POdLj)FXV*gx3%pO zWy7;n)kns47ViG~m2pf(HpY!NB3Jb@DBF%Pb7(xgHk!_qC*|8P9rlmuTXuxOi#yI? zEpX5Z6sdY6i^lr ztsTj4TD!@rKSu*gXsnmLHt`!1uXrs*bdzrcNYSs4jI3>xSpxt2q%$&WMH~S5RhdY0 zFeXu~Gr>*9v}N?9)Ci6n2CC^|C!KTxqYxJjCzMMaCh`|U>e5(ApX~L=w1B-zAoFL4 zeO;AGu%h0L3eQ|WM9=1+DP@Fa<{8PGlQ~JTJ-~TpuV58YVeHipWT0RJ9^;`Bdwv1n z5y0SU7+Kt*AmZJOfsd~K4$=}80@*jwoxUM@LvP@Iq7xy_L7IAkVVhwXj~$=|a)lxH zBiQ+AQb>`mCjr;aqi6Ee3=BJ_+yF-C5kw&fXu6k=r&uI2m>4ohl+tR7U!ArA^W}>C zrY>hcJlseF$I#g)&hIzP#)Qicj=3+8J^%=J?rtuG+;tox2{pGc6#6_o$=RbJRwvGF zY@SNDd-y%jZ63gx;ILjvCrmk0FX8Z<6%_!c-v>9kh;?j-m?c8$7s%;FS7#5FB$!9G z?YXUl*LSu1_+!M~T1AB;mY83U5v(AR5*uQ!Nde1=w4*Qtue?VJo%SqgdR! zMw;@)_{{K~VPEKrEJ#zQoB@O`L-0*n+y&1c`!seCgd0`=caGza9rPf)qug8RH!`Ez zS#j#$+!lSSKWH__U>4_7WYtzC&z$rF5>vH^s}&vS17jq0ZsLziZK8LM8k}$V-vAZ? zJn2yrjq(T2(u>6Qj*ib_cS*-}pvCvm@`K{e|A47*Fn3Gn9CjIwJzQ7O>F56PRWRtC zVuR`-E9D`v65AlbZOpcD_~cyO>lC;{`HwYs+9b(0?&p<2@sJK5aN~v7$x507A?+;I zbZjt$G%ZIV6Gh9z?(mxy`AdO8p%3|2v8@1kgygDhZq9GnHwh0Ay*Y@$e{1tyX)aZYBB-j~Qy)fyPJNJoXAUC2GvZ|H%kMdpq$Wdl6 zartok-wLxEi4{f*ey6SO#kX0<7vC?)U4UUIgy zSvOF019CwGqMwg&Cwqr#2yKo$yw_JLa6YYddia!P~1j0&=GnTC8>RP-m{9 z9%a_HS&hJ#Xo%M?{ll(920vyoJ!vA-O|ymC<__k+4cuWs9(uUrw&Q0?>;3n0+Kmu5 z2H3Hj?e03hLQT%c39>H!91^Bk)V^p-}G%f4u-1KBQ^}Eq+ZHSFJO`I;yqD zQcPY_-$!QT^0{s_<0S(n+WBSyVCmb9inc!4_g>y>4eSb;4*s*C594fB9%MB?q4#xRz9Hqf8gXM z;0cbPSBp?0cC4T@Sw1 zXDAHYnAdBI6vbI9GAw;6$+#o)mMDds0~uZ{OJmGCL-McsMw@QeP*9V3OisF#;h7S9 zY+PR?-G`*M0m37%-r=QehzJ}QhB-{utM~A8I3I=VKai#pQ$n_i$8pqA|oTq@He7?$JYL6v~s39ibP1U|3S(O+~Xl)0IJM{o7Q_*lfAYITD>B3;z>Y20$;8RfNQt9g!* z8H;^LsX4CunazfIaitTd55cc(y$eZikK-tfmVo~>9O!#N0>Cp-1{ZE0eo%}%&O}B{ z6(7w19Udu%jE!d`)fOl=<#PVyNbx_4e%bgSrcx;YW;M5*jyYU>y0g}`WBxg9ua#^L zSn@~OGlrSp*m@^FfY5lRGdq*0Km}Y`Qe(^fF3>@7;L2%x*SIz;+newetQub28|zLjg;&?65NEXnPXmTZ09EXW1_P1 z1ORpqd^AUh5PL56q5Fm`StBy#NdT*mLRV2h%MVrB&H+}q>n%x25{!va8VwNxGeEH_ zD|e5`0nnz4)3(b{{umMLfr`o0x29qyzLdth?R+7GK;a9%Oy6zw`xTrs z_&48awU!8yP2#B=j(XcQs3MIMbK7Z^Q|DQB0-3LN{b+-_(YPM1jBMGVR1&3Y#S#pt zTh}&#fvjG=3`PAVc{wpUYLO7wfIU*jn`Dfp3bNG>;dyZT0cY+De`mxI7I5^5=;EfE z^#|5at5)F~837?*CVG79MKt&VUd#w9Xp}IujSCqOi0HsDZj=%cxX`GeZN}MvBopD@ zIU5IMu6?pV+GC3FbTIe8eDe$vjmWSpmkUhVg`(iSi-;ZK99 zy(av{>sNz8KK47aTXffc%|A5+yTULt)^ou+1eU`SI=d9|TZqYgo^N;f$7Qdz%1kdh zWP3d?lQe`#C-v&@s#o$cR8!(|jf-2xAe&*+;t~+&JYg-`aJB8)QK3VcaPy6mhoA(F zefleQ+vHU;2wOy(t|S3|6+&h#sTI z*WNyP3Y76?_}`EkQX+>J#;gKVr&^mP0N}rJb~eUPa^+>+pP2H{lg-t9R^J~^Hj2cjF)fcWDz6ttxB;)rE(y51~xo3A%3r3mkk(zUV5`lGL#0Hc(9-#pjnsBB%4h)@jZLGKVKPnB1*W$eWD>IfKlV z0Gz%bX1S7_=SanSGu6`wk%{0GbL5(+b2{9!<6Y)!!bWxBgVYA~St$D*ge6!P|O z+Z}b28}0t_z7F?M-l!G}a$ELbK!;1?1vz@8{SBpU`EgWR3*mRa0_T|lDeZNgxkoLf zlw{5XzTr>&TPg~c&eBq7pMbZ}fnfS$;U+MGaN?}ze8)%!P;DZYO-?uTEG33rP3PWP zF&vT{JDkMhDmU9sJrQCJq~Y|~BS29&i zF=O9o+A*NK41Z_5=!|De3e*wTx>rAHntmMnB@BhN4x!3@HvxC2rPa$SK>MYx;%&)isZq2>2rq{^q zPtGioaYGg(U5eejQ(#8OWgUoH{j2PXPN~Zg=fL)M>K44aFR~LeY;*l%|8^Iu`M#?E7n66IJi3UJbJ&2xX-b}wWzqAbFo#?>*T_g8-aMNavHDw zaytu&^SSM1NFa%mzH7w5g~aD!wq$T_pe5i126C$ZXBZQVl60+OTlNwb^QG#@>vuM| z`NKP?O-2;cMWzln=!!w(F)!{Wsvs6sBKLZ~MAt8FN6;o06u}>6K$qJ#H4E;Sq{*Dq)jaLl-7!i8(niW0h?3+DaX?}vBfE?n?z!a@xq}=>|y0_XwX=N ztkkbn;=vl1nZe2i?=V0CRcO$Ts?j`=oH!6fUVCd)MnTs}In{bL$(Jb3T-WniJS>B{ zw?sW4yrX%(f2Qk6$QeyaA66`GGnZty0~y&xOjPYV1QpAynA6|gsLwcAj&6-$7b;QR zK1#-c->zq$Ci@g$dv^hh@(006)X(>bS#Tz~JH3+m9u1n$%1Ycg!tR@6`E7FBx#Gt& zD%)H*wV)t|SuWY8O=UZpJsxlhg}oP<1*lEg2kkLzI>~b$3ZVj8aYc+}o486F`)Fxl zB`(i)Q8L*5)owg3KsYVGiw=n~AuM4?igJ?+dU+y$aKa_@#++i6tTm_D$Bh)9s#pru z@&>6{&XGFUX4aae!Y=+X>Xb|nAgLe3UNO(Tj5e)u&Jz}-XrZEs^bXNdT*0iTvx=8A zUoM#a*rsQRMu7!jAWugdDxYpo!Wxv{7AM;{dp$QloyO<;`4e#0KGKq!Aw67$ib66#-79!*bknhV2ODsUSO3TFyJ@j@bX}u zCMk}U6||*tqCb68yR^jg0yj)$Sylkp?M+CbUTq?hB#X;>Kkcye&@0_L>ED{R$^ru? znPh39Y;tkW`)w2c#>z=(n}NZiETs?d(kUVfk9T{6{02D$OO=vUL1n4$s3!U6T+qF6cC{hks;%1Unb6OQuxf4xzR`&+FcvB*XpY2x^7I z?PMX8&r0h5jDc-p=$#W!g327I`ckbn2$G}c{ldWhnqC@eQe6_b~7Ax(gZFmuVoAFEF5(ccI|z#qCMmwQp3tNkH39zLRT+CHe@gfJ|xiU?(!>E_$No ziPQ4;An&zTF&vU-i+?83fVv5SbyQu-uW1RE+q~IDqb$4vyhJ-gWQ6xLOP3Iu=$4p< zHE3TjF@xvOAvWirv|mQJ5AHI1@J@2;oSB~MC^s0X*JX}5&CzBrs@|^CF*TTTe zqrnx^3d!Mo&X&jOrQ4b`IZG?~!E%iK$9B30>Ij7nuv{E**sYY-d~jG6WvPq8+rC!= zF+y4DwH?P9xMCOP8857~CrV?BlP|tDJu|ln!`gIi8^{d|79J6Q#X}AhwA(*D z9q3Fl{zUrW%mcpNuiqS=C(-3}n~9>QS*2_HMo#74X&~Do(?NGRp>S4u zu6ST`v7fXO5Mo>Mjh3WeMk4sT_hUeuHOa!)C63Q1>2;jT#Rqfx(V58~OytVM4@35Q z09U?3a0#BTJyKmDxz`%401nDYXeCwC-L)9I59O~D9z{Q8H>JxX76)V9^lXzJXiW~T?eLVsHIL$PD>e|78~eZz7L?)O*1<+<+BzG7@0;LS zxyl^rWHu`>sych0vv{LTNrNXjQBK+3tqwG5&z%o}W_0A2mY?5Zre)m4Z}rDGy?6k_ ze4{O7i%O6oSa*2l&qWO`vdv*^G6xkuN1` zTa0aHb5Q~i&*qBjVw9zQyJO}A|I4au^&gmN2vNj|14e=ZBpUnc+tu+a?odX(3WP(jIJtMR)e3rsd zd|{f6hh_nAa@@nXw%q6P?YM^!#{A9+QG8OMBl{P~)PmVIfg$uP%yCLKbJs#b8ayrm z=T6E+=0V$*_^+$1r;BU!OrbjcKpYgw9v{8#)1iFFfP{D1*c&QO^>Xw~ikPB@=rfG; zeFKlvW|c|~0o{_Q8XmD)XFEnFM#8*816iyC=%9^??E4`-DJPn-Akf#3qP?8gyC?IT zEB-|N4Kw8Cu7L`IDJM9mvMV~Rw7A4UyX)cT-eUEcqvQV&23;I9NP3O{Y6>pb?Ceo9 z91BrL;=u=#1vZCZA>ioVJPtcxJ4d6^DFI&U-5r-a>@2kRpF5nFJ!IU3s|tp9-Czvv za(NfVD5tzxb$eZ9KTF$mX{#j{qV1rL;chR%54^*0gp>NVmnpL|pj6q%qb8nLx%^(_ z1rL%CTutPUgT1CftUZw}OSiF5_q24;#1`H5GQhPOi*|(6yP;W~&6Pq%P+l9~v5=_L zIi94QVta}znE{ewx2NeNxO7A)10<&c)y_DdeThv8+qOVt0cfrUfN1Ki$Fz9wf%e{J1&I0!n{v^O*S zrRj@%DTE{24|-%CA$?qnEANyZ*2|oLZ@e}Ai?$;pn--Nn{b3>ylHh{Ih!gy_`z+z#{^tu_iDXWoNp7@HqE;Cj+9FT73guG)scC=X8Q1 zLfq92*Hbd`jCEx^kr+NmyFGOYwsE1YCL|^TQjIpO+d}VC$NjUfwutDhOX_y<3pi$V zx&shLz|PBq>iZ^!pD4Y};;!J{?PgsRpkTsJ|K4hVvDi$$Mw0aqTNV_8hZv7Wbh0;Q zuEKNg)Wx#&f$(=f!y1w0i#4m0T%wy4jL;fi?pgr>N)d2euuDaQ%wn?RLuU=mKi@2| zgox=)Es<+R`^Cyyo_QQ^s*Zc;Rm2#0Dx@{KROswNWBV!gq3kM-;4T}H_!Mm8BGircFk!MnJ zFpHV2%#9)i*l&VWN3s05L^1Z#8HGjb+vrQr)z``P>!2{@h@Z|a$8O|smj_C!-gZFZ zN~EqSQuAW<$6r&|N!zxAWohCTysQ_+zP~E}S>3zl(8ak7qgFnggG0A}kADCREJs)u_v8!6-H#)Qyh2>-YMLQpa_~ zVkUacP}n5yK5Z{G)8g=tgrQT&9!$|Gcyw*Ema@%n zV5}g}8ozL5U5hWCE((ly z^=6s(>hz~BQ;QCtbt`Nw5~p>#8s+jf9>3*u8jp?fxGeS|KQ5j6g^3grII~jNX7SUY z(vo6SnPkOxqA}GjUv~f~D3eEuDn1x5ax4?y#&{F79MJA{JYG!3IV3Y!WYTH+nr-Ah zEEhPJ&VA2k;rELkxpdu7Z|?&IuMu(bQC{^(?>t=0Bcf$9~1rr za@6Low4}pwNLA@{Pi%_C&T%UYmiNCxUWXYY4g_bu-D6$`8#y&4>jqv2Abf{SQ za51s}?LR57gy1WuRPKUA+S-F^raYm&7yGxyb_0Jd5A>`Gyi%x#P{4CX3xxr00>Ba2nL~A|QnI$|pLLUhbsEN?^rDkIj<-=eKkE(9|0Rif<|(ixI7zK~9?%nJQ{QWR8o-baRsvi0_K-K=`q$q#>!7J+@T=c$Mng;@$<^NgewIk78%KNz zmTdKwRy|4$wg^{h!&!EjvH+g|j`}zjnDUa?^vY-%K&M=sF)g*M2}tyV6skNmI>XpP zuZoF5(~A@{Ds{a$>6@}eIN^h7&PRh^O zDq_7LXJzp;ha{l0D)l$BM4J7=bA0;bpoVIyfN27wNEnczJ>h^jiow8p2S`0=Q}@7q z^RLIutrTrN;RkXn#{Qn(Jxo+RP$!SaAT>Zc_J3HzPW+RfMbf2m_TD79}o`3R2!wO+ffARtV)l456v@vF^mKNw$4bX+D>^M6<=%(y5R07Tnus|UYsdN7qC#8 zO2`=-$_zgFL2?osQ=ZdGU7gkdc7-WrF0fbbgDPCfOVJ6eQfi^cy6z%C zlK74fo(pu{Mdl)IO4_()Z!^g58UmkCxHuSi!BBR-0($xC)ieJ6ter>=VLVu}jm%5g zp`;G^^B$}gS+{w;MFo8mN9Z7XFt^;A-eHU_*pXl{fiv`9G0&ZfM<*|7E2oN@cYk(xzsFg%c=3&=7#hnt+VS!ftnnctF;k(J1S`x5>)y$;lL1XXs%aHKF+2`ojdB z*io~_=xYJwNt1@WNYhA8cJL%*t?q;&rs;9^4-p3%9)X0*tPKg*VJDq%O~S$c^QACY zdf!qMt*n8AS1UIX7{ng%%>M;)K#jk2J8SJ`P8a@Mg2zWLzApTHc0P=mQ{_>5nGZ0e zgxy^*m`HpuMGKHOyDJR8x@Jpuk8h28J-14M*F1-dBj_&I3kob&%NV518MFbVa^t4s z;c^UAU{Z&b!B?S2ma^I=NZ0Fky$*(O?xhZc`>KPiF6NsumpiP|f0zBr`Fu`^^=4FL z`HcA26eHv1dLSlromKTgyz90N4&~nbxal&Ccry_AiXFh1){utRM-UXhS24{38>#Mj zXpTXZZ+vz7F_Vof5RzL6^~V`BJ1`}oc2#bX>tV9}0s)2LRL|%;8^(8Sjrg(axVao) zcteO>&x5s?^4tcLsTRS$JAER=8OWeEwXjt89`OJzdN>jM8GHP*wqSn9$H-B z0T^g+el?&6jj1)9vnq+aOlhliunz#?E2-#PFP_kzx^0*!19F;ofZ-a1KU*jS~h6kqDukNQ^_ zQ1eBhl^9T zU?wvMTwp^}Zdu&($T)hg_AT#yo3NBxz7=oX;7r$;Qm?9cD3eP`uAGV~M2$|3hcUU@v)?X`Sj6+$p=D+wJqlFtuB739ROEi; zTbg`_p!*(M!6p~u4X9Khf~7ypBi*}&p@vb^Tim3IzEYUxZPu}~aXiYJ@6Ft86r-uN z?~yU&7bhy2i3D8i8BqDmLEtsjlQ)BVxOppd(Of0#?h@ltuH8UCrR>nrn4jzfkjkOA-k^1dl3+>?oz{3-H@PS| z?*IpT)rFH~+sS~mGn*Ve7Z#<7@dcaXqE|Z)O@v|F5$*5hRM5GqX;**+nl_0NW+~f+ zDpvrs-$LP3%VV)Xy3-&xj%ZdiQ==s@%MK_0M+IQy;}W%l#vRvyWKfozB8DdfNMY;9D#dg*~zU(r_aHoXEU|f)O6D5 zEX(fzSuZ{5K@4u?v+3l5B+oF*4Rm}?Cq)HK+`Xx{P~)TY+zUa+>}@dnQ$evHM;b!- zl?)+sjw6efW=ymD4zI*+>h)`i)G>M&Qlk&kBri3Z+Gd&&?wcf+q!Xagq$K2eiNYnF zTym{-Xs8UB?+Z9~DOpzXX1BpC)W_UZCLIHBY`tyCV=d9Nxh*oiZl@D|Dix}HvP?Tg z5YUn-1D57|245_6N}B6bV&wD~h0h%FYSpcM6t2$^g-MXQfVeIRH zBp`NrMWGmu397{@&l7TSNDS?qiCoY0XO6KNYF2nk{+5sA>xDTz2uD!p{wYOT+Hh^; zlNF6|)F2oisaHUKB-uxCXIYG?t$U(z06Cc4w)>oA%w%pbt#eKOaJu;dFJdrUy zs<5a_+c^WMfTSP@c)>+shldasB;X2rS$&yy@>n#NPj?fz4@IWU`=~7f*%ZcBDMYl2 zPR?0|ix23?^oqCP*oVE7e1CB4z2b2AYpqg01TPkrqLlR3hLrGf)ki?GY)0#Gyl6o5 z;#Bed-W%^bMwd4Cf1W$G3bjIYL16#>S~MOZGCaPR_gZv2QNx#>JazjQ53tX?z0rCZ zwzgKftgT%}{SNq|{^!jOv|3Hu?r)pDwmqk-yB3Mu6ru|3x9|3{rlfs}?;)T(ra1Tw zHpE0B(pyi$HpuL~XI|xG4M|h0p@nypc#Y_&gL6REAYZ7;iROIvzgIJGpu**P%Sj?R9GO97VSTg@!st{(Bb{JI0JOIJR50&pp@G5bewHVe7z zj57U}sBdeph@L zFPjdiAhqSfA&r13IKtHwKLw%djR z=2i^-0uzb92FXm@xdn!TL6~*17o&EN3R4ex$HJ^x z;yKANbMWAvF8j6HM4_~T_XzAcee70KFgrYVwxM43|0*|@y;6zddTez(^}DeTCNXCe zr+Vd0>;fKgW6qvNR$gC*X*h*=N%Bju(2JQf*_v2$ZIzd8z9EgHF$@sH)2>3N&}8DA z-B>6LTi6|A%od<3NPzBhI+QDBMnrw0{j6N|>lOTuIWy0v-$T#Pve7#5FIy!Zks02) zqV1Cx_4Qx!=bfzKc7#oGWYtPp;jX0lszS0Od-#Q88eF9`m?2V`>Dc`?3_0tyTgJ0{ zo-)M58hKUHOuaPXVNeJVjVXPaRA-m-L$loM#;Xy~nw!>8$T$5=+i)n>w5@@*a z_2ahZgIya4QOo(<#PNxB)l}Z9S)?4y>RK_gs%P{`Q=x3CxQ&Zk=!7Tiq1Gl`OOUA& zn*n&_MspgS%nAkmJ%2pl*PAC&Z>|pJwX_y+TQ!YIYK+}eRgrx zcx6DuLK~ufi!;I;^xEITaVUeTLs1t9a!K z%Wz*{vTpB$jcg`^a-hx0WV5h!nD)Sp7O6`h^{)MxyyP~aQOpR%wuoctbTSdR6HR+pnn+p_CEcl@~Y=}@TmfWr8PxwWdiTw z(ASz7cm5DG>#yU#W2t7h1%Q3;={=zhaj+;h=T1|(LEXCbfn(kc<*j|U?K_Y_F}}<<;2{MWy7VG7?<_znSMdgx zv0(t&<|ZJp?}<(W1?Lzf7R(@xas}rbF0Ku$NoMz@pm1?sDVh>5wVp&hBK8)Pd({m} zmwKe^Y)759Aab(ed@fE{nKg>*L?g|tew&Ini`K;Y@HZ@bkq#t5l$f>LU1p74F4EMq zVG`onPH8gAhFuKFaBs)IG(uxmE?GF0epyHL)!+1})entttmz4Lpq%JB{!_L%MpS@< z#7^DtqahwT0&;IO64o|CaWLFSg{Sl&0M*?gI+UUBxr-5cIoz$orIbHCR`pL}?||p+ zk6*6SebBMd6V9h0o*RkhKoh21EP3WX8jUTuht&-W?qttppT-0*$oM7$U8MA_T7ES+ z6GTnsx>5xfRlxEw$e&<6_#?$^Ep6V2;?YeUn$$!!FjIbJf(o@dQ|t1f870}UpOyYS z@+O%|c}M-U+X_vP`XlVN4HH_5SJ6UOjE+N^2nJ=iOIXz@wzbrE@7yxyMG+YKKbBq{ zSJlj8CAJz}mxpjtHsXLa|Zy29bB1*j*2gjWEfxD#5TN!S9r$ zgvnUwx638wup$(F3?=w`$$aT1LY97}c21h1$6E<^{pXte_EP2RvU_R`>)r4cTpAfNVV-kt${610jkVs}-aLM<6>7Os)285vf+yxn&fc@SP6SQT_#EHpQY`0h%;Z^u4m#M}wl zm`|nB`Y|PH6H)IGv5HePTNC~E0MZ37-<}+vI3>PCXUaoLHHtGng$w8NjMdIIVJbMc zD2k}1g&`0yp0V-d@bFr)s7g+A2MOy()4+dTslmK@Ub7R~SKxNgy`Md`fLu*O;L9=b zm_N9zH67$YkKV%oPZ*zLBkXzCPz#Lod33|BqCtYpm%iVu98?Vq5L!@lPL9f5`DHJi z8}TysAe#RX-vuYxl{~O?)d%0Q67jI9DV(lz=Ys&C$R^hm@>IBIVtj#+#0sfDjOu z=}q=brz%u@*`I$UF@QgAUmMAMiZ_FTRjchTr>kdy0>1ncDhS;z`vxOCD-3Sa0cZQ6 zZLPM4i1uQ3l1hZD{ro?+5aerFI>Q72qe)~U z*G9*b$r=PuRk>WlMYxD+oIrE};#pl|uDYR@yuj4NmHHN1~UQiOiT%h+13F+EE~7o<2dz~=>MzV<@i(5O0ZSR*$2@_pif9~>O?BfkUE(8+XUyd?^;L1AmX z&+*LNP*>XGe&iP~gnMtPNz%bFz@aqmqEa`y!;dQyN6&8wsqrEqZ+jp{LvL>?_N^R$ z0m}Fif;SEcHr1X2b2e&Zb&Z%g+tt_*5%eH4Q+&Jkkw9XOLMIW??_(tXB${>vzewLG zWlrb71Ka5@9m@>34RU{17?_Q7`$k2CD;l$L5TmfrG?6F1-z12tK^@Xq4`*iV{}j+x za=azhr*;tbTJ?$sZ|z$X2aL`9*^v8=f>tT)MoSPgLVy<1gQ#>Wfm2w0AaQ)UY+`|& zE6al8*vdewCA{FyymwPiD#9gvv`L+9Q3#ulf8>uaC;NHWE)tI+;M0g=axgD(%WQ%6 zG&IjGgK>R`;y~$Ph4_k*-gYgzFhCJB>nY6zCW`VeHiACC8_G4vEh-5rq7R(B>_qwi zr3(yzK0tBEJO2H1j4aWc4ay`Uv2c5v@q)H-E!DqCk7wxSuj6L2o8YCAMQKiC>z0X# zf0Aa5HH@T{k<9K{HU4QBVF$O=MOW>?q&JMp+Veq@T2hZGpmm5UG8_vlfPFeRs0bJ% zb^vlZW34Qwk8^>=^zHl_BuDi><%C`w>~z_=nLOhU8BsJwO9Ptq#wy-6ZoC%=7TLA( z!K~8ZIcTN)B}$YA>;-qY-s(0F?|gf86MC^i=`!OL`DaGbSp^ZSy&U*n=}Bd*re3vP z0GQmNo_pHNF@7{4*-jO7h}ew+`9+}1x}giSDkW-nj;t-Jio_y=f`ipPo5)<%qc2m;}PQlXnzNu-o=-|*!)dYU=-qs;MCjH3_K~d zmB9XiyAZ3k&#J}8YQPbwPTNN;a9pu~^}_eyBSMa*&k6(4^ANMW*J7P~=!ypX85RdV zucrT?plJj1T7EzR4akh15woe&u>U=9q0=*jL6&vNXcf=2&cxherkt`ZdOwm9BjY)} z{sUh`B*e2a{|42K*ofcI6bI6K2FbHFW5`$ISd$?-DAFdzhZTj!JNV{nmjgy1D{o7A zX@C)J=P^j!6K@|dvu&MIwXJX+U(F{A1{G4RIn1ewF!R{@8Nz6v{r-;uY@i-3>z!~f zjdw8OyPZS7)cA1!(HECROA@mpkv5elTrk2mlv&A|k?9F5W$ zEr5k_q1+#7d(sf0BNnd@5)=DVFMi=eHbD7v)Z#%Md#P@uaTvF{|CGCyFlg*r7qOh= zx$%6!se{RDXjt(y?5RT#Vp$bLX#S#~0qw=fWaCxG-MAy*2U)Cza)4SF9q-w_+GDJB zIAOtE3)MvA`>?uZ^s7K2(~ie6?J4WP5>J>WS*oAGL>-0I3`|@UMHxR+jVE){tb_+J zP*>CfW2K_?O)I`@*YzLl=($5k*_A=1BzbLu#|LUrgz7@PvgZ)4udgI{l&CNm`SP8B z^im;RtxXLSuubX)gR|9^BaHXhbsU_zVE;AbHHDB)T@GBIOWWPh-W^bC^X957+#W5y z!z?6sv(JABh8X!GS_)!>rLmC?8X771Ibx%s<8$_cZ0Tax!0iX;^LkOim1w-+hhSzR zi3*FvpNFYt7PQ(HM!GwEc3;LZ(*Bo=t6+o^!5M>@8?jrCX80XCa#AaZ*{ocdd=nU6 zg`C`KfSEeaP79^m?^O%iY2QVCh_^A*e@W!T)7I=TM`OxWvrbI}|3i9a@*(RfQP*18 z7d@@+LW%giu3a67UZX`3$EYQVN0%WTRe??ZsMJ|3PsqMZ`VE4w@O0GDTHXRzA^a&EelA`s^N=9S!Kw(2JeB&Prn9}P13 zQgPOZ5+~F`VZDwKPp-xtT`WF6AYz zLvjU1KhBo3Is!ph>MATCU8V3ol=B$>pr520E+t(XjC@3ryUkycA3Swl&(pZ?fc$R1 zZB}enXytZQpioL17Y)?39IjC}VYwxHkug#7IjrEUlzDOL*S*1XCP>DcGgC#jikn7U z=%iIE1g+{;!m`7T{}fb8OE{?`uKICk*f!Q34my&Qe^(!(I(L&X8ipU20Mads{bl~9 z@g_25S>stIQT-47OzG@3i`XRZeAE6WkcW7z7CuKnA6Kfsbtl?-CDVY9#$3$6TAL9K zzMkfqDMyhkE{>>bY!$)CBh?vCS6|y-(R=3Ged$4eWLc!n&0znStts(F6T3C@O2UDk z3{4>==g{|Flycfpt3H8kaBoHFzeey zb?zQ?LCaHdJ}dRIlx+A=Fl|deg0h@rYgo4ZFlqJ?`Uoq>_FNXhR(ea77N8@b@*BB#AB!IN(@CMz2fe4d^yZNT zt~v5ujVu1}w;9!-t{C)6Ixj?aDb;taUoqpn;3JB=LtDCw^#0K9&)Y3NqRE^|Pn1;i zP9_!}NMYA=;-A~z_r-K(f8PR4nD+ezLH7}c(l-hEsKbD(NsZoaI8_n5EkR;&pHlm<`q|CH-2_nN|1LenGOO}SItO;XJX1c6B9*|9h z5XYhd&|rEr%A?5Leb}W=5q<8;fnpfYR{QCT8!tKw%ROUCy|EYM=1b|Z=j8?Fjxyo; zLi8$&jbbnb-}}<-hMdn0fMm&M5m;dU*s(aOM~H5ffy%!Y`EN`;M9~es?L)&zr6Q+(_<{X4YaOb?aJqGiC@ZV7Vfel_Ym|x zi!YQF`vo>F7A4VG%;!i>BK_|XB3Fkf+2Bf=_Q&GQ^Y+hLmp+R;5i|rwGzm1oG4#c( z^|4vRgzWpR#=gZzR8G#q^!MV<2zroJGDHNQIgU<$3}i*+jr4zvTS$%)Oy)B&tD2nC zU;4_q-Mckm8l-tZlRz19M`?55?y+oS%d64?JoWWe>3;IitifWiFXCrUOSGo_WO1+0 zO9fSM%IjC^*a}flu}iPV8u|P-O{SS)yyX!nK6HJ*&@lAR>g}GfZc_mU?p zb;C+i9^KGDv|_4lUfj)ah`>UAiEncb^{a`{y&f1YJ}!6>M@JW!} z1*he*t+wo*-kdj}^epnbcQ~X&=AA($^UGX?xppgez=Vm*o!J4YWzY-QgAK@qG!ZZ! z-neE*ls|dX5&|2#RQf4&Oy?97Mvhaf@uM~Y+JF0J~^ zeP$*0kBT4^vHB#N0(Ee;HT~*kJHVMeF>~uKVGY3^AJ*!iv`Yw>v!d>?3vJyd%f_lImND6#QR zuV(p)OJy2dBVS{Bvxz-RnpgHB;T_F}(4J`sx8=UL7LV<6+EMp$=f_=+-9Iwodq9SYoH>Yn z9t_@{^z%Q_Fw|EZPAO|ffQMYth`3~mCTn%_dG25KA@e3U);OX1y`HLhIah?VxL9W-lrO|?jJc8I{;y$uCrpc| zSMo}1z!fzm_VRVM%&$d!hSl2MRSM>b-#B|;S!&dU-^a(vQ1$8VMChPFIc)ii#I|}+ zT)D{*s3iI49N49mRilv@0jUU4avbBL=~ZY<)7jte?8~}2fhJF|($Q$6ZAo~6b(i@; zrfERqY$df$h@$Cn8k1NbyMbCS*?F!DCT+pYHvvvMigblM+ zN|oyuI|Os`ZeNm5li)g5SA&C|P$G;uWTrC|PUznsH)bWa=|H`Trb6FTE3pOEZJ%F+ zubg61>OZI5_i`yI1O(9Y-D^xoE)2fyZT9bLV3zE+10VS!Kx6^1M?kO#Wmh_v(o9WF zHs)_#JMX3%?#ENJ(KPh%O*h+r>l6gl(GD9L>24?(?68EpLAX!UzG;{(V}EcfZ{o5L zjbtgMgkt;`rGP)z;}XhpTd=F%3BMtDzuaW|zie{|mbi)B_e0tybz60dAaA@`6eiX@ zu%yL<=&;(iK={CcIxS`Hr1vaih@(e=j`&EG;lPK)ks8y;%EUF8aNWRlf2<1S-TH_n z;Ftpwl0I0OBW#)r3qR&Ma6Yz%9R_p{2E2nrQm-&n_SipzBqbd|$_^rCA)$>Ol(ZD| zz+q8hh~c2ys_l%#o!?aW88NQ4YD1>-EG)A;N(x%dtR2uY70EW&QW~KYma1>HbdGk* zPE1=FII}IA@P`(ZtSZp@-VLYDAES=2+FR&aJp#c8BWz;v4^oSzp0-Ug<7pOEc7-+E zAd~ZQ6H|BCmWu)1-f9(VjHG?XyHr$5g9u1tuP8!5R_NVgHC$>731MhUsMzc*JXG!} zSkY@H;9M|RuudY`fA)F~k<}xftaU48G2xfYG1vZRaH}j=63L^LYVeAHd{oaxq^V>| z@a46g&b2=1vljJ_wfJnf_xXZ_R6R@go|0MLEXhC$(=%DEKAdz!f6gr5v-+1i;-R2u z2M9bIdHjF=`W;8WP;IuzJlcen9n(XFOa)qXo$pxik+&w&s^`M_=3bnULC?H;c$1U| zApgvdP$I9-W zbvK8Dez}AkRB{#AiDTh&OkRdkZP!)~8gBu5n-wnEG^HiX&hYg99PSB!)%Mt%AlQAD z=MFr}dPpDcT|dm4Z@#MAT}4mHA?U z22!!70=`#({!~Leu63&%Ii$)ai17exBUzB$Rj>v*A;^33z`!3Kqz;keK5Les=sN7Z zq>itXFI|4(+IP~{AB)d_28;p4`Dzo4y{T1ERu<9J#?G`>Wuf=Wh=MOLlNrQ3Erpvk z4%wbZ!~d-=o4kFSKtu_Js4Xq8oJrGgxnfehSGOaw@7mhEm%q?}2$AUREvUlRxKD!{#4`9yBzZU)e3}60QE?l>q5~M72?j2*P))EcBn)TSk0%ShI1=&BrJ2Uz1h-6v!gp z$^}i8IVFfD*3BiR+K9m#f4STTD2=(rnsw5eQwD5M`81Qx{NQGssY7!>M7x;k`(Hn0 zO?JiqJawlj?EUGUr7Z&q4`SOtd`&eRG|k$$8c5sA$3$6I~KCO0EeBbWI< znwSm7NBf4J%8X{MbwpL_w_3gQMS9y!nII%HeuD&kjM(AoZ$Qo1T9Nec9}t zsJc_(Iuz=0Y!^+jH!N6dPe#Ww`eDW~keN?WBF7_r=P1U9jdJ9QLPm}NLd|F{_Z4XW>>?yG3f3VA91jQ&oH&@O zZnE+LsuSlB{MzJ@Q! zpSg&C^(>8#;TYAscDu%o|US8J@9FbOOcBX`{sh_&_Pnj;jy z{DR3Nm3Q`Y2^Rzjs+MYyk`;$vinSCFm7%+3mRaudNMRW#_yRs%K!SgYQW}&Xpk5`4?`3Xc1(&(kWzqpL{K+^a%%)iCinxW$?zA_^SkdY;KV z)8{T8R6%PWnGoy3|LTo$d*7r&weD<$(VnVSXWn&s zJ8uZO`vQt>l=oQqj00f4Vp@B;$fZl#LboZ3~K2SSZit5MeC1M(UMjgubst)({ZbH-R~bKbX1oMTeR zXwGKV60z>?m2-9@((I9r4$NS?j0DOqTnlsVi3hVVr{)2)PoyHVp>o{4mIA|c^9(Z1 zoqTgU1sA7vkBQ?;jDgyx{K6()(3OD_8&t^2!yuP;MAXnOSa}+BZoRN-5n543Fm#z8o%j+W`O_7pYE$w;nKTflKyX zQe-pKX6xLfHyU%4MQw&RdB2`(=ohWxbiWSOk0?UnE>9BVgUihO)J8!Pr$KTv?4}i4dP0dg%F6yWnX+AMRL34V z3i?Zp-tb6&ll!<1E`Ho-uu&OU?MeNu%TFK!AmxobZ)?BE{R!HcLq{-DeUm2&GAVUx ze7q}kHA^v3nJIQktVVNWc;YTW8MPWA?OHT!d2-Ao^Los|-76VAO|^&!vSCYi(i#Cy zp4eXmuN)^}$n%+$j>`N%n6q5v_P$EIb&(hv_u#xn()nee>P%V6Fn z<^3qbzXoflk40)mbxyxXfq1ib3SqkO76a}o$n`MWy??T!BVv*S@r_WQ+OJj$11frS zNxQ~_@_4gT@Oy*z-MKxZJz18C7SWj;ER~+?7eb~?gd3uEz1F#~z-E6L#fiE_SZM!e zWEK6oy1PEIpM^C+W}E4raVd<={_ZAiHZx_;N#Hn8x8~bA<7__}uPt=s z4svDvzzeTgq@jrQ9PcRCLJ68EhbdLi zijHO1x6%!&C3MwOWIXH39CqblwWu7~yQUt!x;^fnsN{)xF@JudcJ({4sAoaubXw3|L4fDKiL2rDbuw% z_rsutpZa3~1K#+fEUPZm>nyBqe|K^b>Ljfw!1b${Os@k^@d0&NgsXyR|0r*xje%)S zl}#^RExH*qI5!jpAB?)ZkE60VgAX0QQlRepCFVY5o+?W4--05f7zt18+Hvi9Mhgx` z8c*6esU%ctXRPb%1`Dda$)8Ou=Jw#_vT~SZ!#qXXanL!(CAB%>aTKAAFoecq1#a+z zw4ca**JZ3QCQ|Iwi4mtU^f9hw=}L5^^UfX%HQlXFrk8#Jr-l)nm`JlQ0{Cn<4}&}P z1yx&jkbwGF4XW&*HK0;VJ~mKqu9}2TFk<=dk6pnSLPAKvw)7w>H3bBZYVng?CY(rz z#Y2TSH+b+gh!*K;{_h1dM7jJP9kq-fJ}VQsBg3k|eIml&E^f%e;no2M(@3p}E>A1t zZsaolg_><31{$7d^{ZF&sx2ReQW4bc9w)UTzJZ8*J?JQ*fi$y_FOI*If%`M=(dFe4#?F^EN|9yoU|QWLXxrf;Fv=|5Ga32xJT? z*Wnj44MVe9UEs2xj>VsKN+l2I=jygUzyoQ1>uu%(1`7lsMHteg#qk5h4k2h&&lKwdcVlh`XhbfU;kTj-V0j$U=%b0%NW>cOMHx6)fblUKX1hDY30XxW_djA=Ih1y@XxE`w2_|m z`r9oDQ04kon}ZG#vJON*%8D)E=K%5y-^oD%ESsa_zQ zY>e+$aTXt?FyXUCXLQgvAm^S?C&!l*FRZrud?ba!_)h`85@O3T`lVuTAw`DdRZvbT9peIWw#gMOcD7d(W63V}H=h2fB`_#%c-6tsY+w%NLn+AH5+jGtK`+P$2iFOI(n?FF z!ByS32hcf)x`vTvA`;}igECcK2vG8S^2NmYavL<^8DvP_Jb#|G)CI53cJjyQI>DRk z>vUX^zxmu80T$$O`dTBH!kc9p;I1CLANH&L?H1hefgwuZz@u1*fg%2@A>3pn15#*J zgc!EMOxRVXaAdoEB|b5Z9Effku@5+z~p6m8jUVfyN$sJo(UejM&!G6ID|ii z2RCQ9NK@QE4%2z$&Lt?MoC{K_g@6lC0xbC^AwpS$|AJ1nAO#}_pFu7ulKmWP-)F|1 zVmuKXvBPRpbWI9@Yg#890Z<)eDlm=udgDc6__#vZu(_0?IWe6{?I0Z? zWZVeCJ{{z9`(ZVGd_O$yLy;#Klo%1Uv5?HJ}tIIcL&pD|XIO z=~Z(iu_I|114TzaMA#T79#G-zs8~cg^gip=piAI%xI$oP0;hVH5Ga9X6MV5ulke*2 zdjF+j)4|_bxwiU@4e5T23C;ERQJLJ<5}*=K(i&HZyL zMCA~%rzK1?K*8DtQ`T6Hj7m%k!ylxxNYPv$9D8e`5yHqrfwF#*Ol6Cl2>acNAt^4>$ znTvGzBLWj8J9in>U<0#N4+k3We20sE+e^8(PVkxp%mZp%BrzK1?K*8DtQ`T6IozhP?zbp5$QPPCL}um0Q6ti&_!p9d)G_}nq~ zN8f1PJWNpjN=k^D5FEdge@Tisf5hvLqh(nd?5p3qUNASGQjHTw{pecn^@kM*oW8bW zg@=iLb*!&YXw)sPGQg~6&9{0WdTYHFO4SRBklVbss!XVwZD=n0+~mqK}1HM)&RZ=QK^p41NOPv*=tc(14*2gq@J^ zw;0u+t{L=7Ixa+ZDb#mh&G2%wkqg5ycQ;S-7;+^v^aNuKl5BaL)Xe?#&->Laq7()d zfCHbStUcVNzvEmoSZ{ZD5tkhE_7d3>-5F=Haqaqp88vjq8?Fu8Z>**i6bVVx=5HV; z$cIF_!layH>mlDZ90=PuT&RWkMoXWZf@2nnmd`c5-+23DMev#?c3jg{bxbAz8vQ4~ zl|aSznCve{u>QrrJ?6iXD)gvXTQPRNQ#7C#ZJndUP8g=J3%aNuu(@DfN;cNcy|NI> z7SN%gNPV|TqiO_6&k3Iab}eo~CFI@9XTKDw0zTY>hR71v3jP&+n5Itu1p#(%*4XHL z)VxHE^H4bFE4tP!-pEuKzydT&&~HU^-*SMUYWgcw%?2SVvmDW4_L8fHeWX*EfvIxb zS@?q%rb5JAKt?3zP!gOB8>&Qv!m!+v0EZ4kTyH91CgLww`>?(3>LV8;+vkS*=OOeI zug`j3_ntO#H&3L8pE__|a@8Z4^i%Q2TZ;`LG@Q~Taw!^kn;EhB9tg*&qVeFg)v@YO zqxt}?!q(S>A82zIjo$2UG>+d>I)I37qdbRmSvzP~K`XfeTU&eN`d8QiUhbRVD8y8; zXig8Qlpx}g2Uf~_e*=P+Nnn){t`N~}D>i?<$Ow}!(J}|aMg@=-+%KBc@Q!?j4BYZA zlQ%yMOaSBg4aZwc2I8M%nU95icV(Pv=r8Qkh4(6wmuA_`AiaL7)}R442ZfO4TrW!I zHP%7p^{$UAC-$XFr{Mq2km2uQ;~@3G+I#zB#C1S3Bj@l5++6WbPbpvbN7*Pgc{ci# zAXFmsbyGCgH0j3 z^)a=6P&p=y#=1w&=9?nGNaHQ%Hq zDqQuURsL(Dj^?&-r-(`0y`jl5zS-S^pay}x5fk9bjyLk2Qc;Ak?)dVvQ2rct-*V4s zQw?i|!LV1_s?596Q6`j&cc{m|DM<3m4FO%+!Rzf>5zyh1Q*?5Kk$C&xJAm~ln_J?% z)q750g}J${8$MUeC-mv8KCUfo1J9E`oE`q`aE>;F(_N8&?b3CMij^!t6Gn5+X~kY> zAvUV_A&vP!3o-@Nh7QVLnT4f{z(;R67h6Tn;4C*f>)s#?5y0D%u&%ghC*y7%VPeztkcNrnPlb9Q2 z1g>3{siix}(M zvZAb0W%S8ljDkeR`D&+9uDys2dg_WF6~M@W0bdbIHEH^7WygnxzKB@ z4P3a+?s67xM0v3l_;o*<*8#VwD99~HyNo5X`n^-CGd^(srf>DI@}9EPvnu)bsesu? zaf_iZ=jNhL<&o}Sc(fatdl|)C;eAb`i3skL%W7GAc~jnU8%?<5EZhFr5nm7Wwg+K8 zk9&J@o-z8kWWnp%w)*1wL7CZyNU++uK?p8)+UPgtQ0fmgorRv@ckI~WC~#qYDgpo` zV&|&*A$Z-`MRZoLPEzXChfTNwimKVb)aaf5a=RPUGXxg!sIjrZqspw(VnGgoG3P|x zn+RA*7m$FtK4NYMumHU>Ai=%edno@^iV;o>7nrqJ+4+p|Z4yWU30 zC755pe5$R5B%h>_R;8Evx& z(6?vlCTB`v<=Ll>+K8(;)K+S)_4ttzln5Pj^RW>F%)2oH2!r2I=?_2oC}ep3>-}r% zmU7_+ia4uyin6-|sWBk7h|!7veK21oEK^ZUjz$+{Tqu>)%LP|Z;s zPqpAwpb`j?tSS(F{w!C{?l3l^r@}KPgV6RzNWUc8I|B=E;h9;l?8}GBTUukN}W{r z6pvOLSlZo&{l^#5K?kk_IaEwm-QOr-g(EcFKRuIkVw&h4$xMjH+UqVan0?fUf^enk_?#QMpX>Dqx$fYu>;Ub% zB<>pDgDL1LS2L$rcsq%c!+O*;*lgQ@Vl3c}$aUjRWFCn`N{5)pr08e-eZSQt$qV1- zNdcsQso8pIRcK~dxHX1nm|QGfbdj57cr0vDm)}B3+U6|-emmb@hYuhfx1YY0d0EAc z>oLs;oEN?kWr3d}^7)42?C#N<{O1Bx`5>ZuOmMt_5v+gIib*D(CY#N0;T@o$nEjEo zNWF;-Z)o35a{y7rOBn3d0{@*F=k4p^1)|uqIKW?ZnQ<|)NFi!MG)J4|q*^GONiU}% zF#1;pnf7849RrTGa77@6UosL^kB8YVkQ-_}A`dH*Y6h=j;@d-Y>uS%zdL_?gLJ4=N zK2+z7iBGkg4W?hw_#*LHYiml`uh&uBY?4$s4#p7%tH7My1#_O22pj$$&_zGg7Hpay zESC_Km(Mx0IXW=$U?&3Y_PzZefK1<@X~kZiDshpImg3fTOcL%n?nRdwczCma8OG)#6yYP;!r@Vd zotmN*#)!v7+yzXJrvql!K$W;eMdE>Zg?>`P1pXN_}>JY@hvm~U34P{DA_!l_ExaOL{mOtC>SgAd;nBHtG@y^6f^*HZ0U^H z!SyguB{p(t?ANkkhT+aa^|l+y{j!k7th7&%e_5ivMvKm;^(pj{No$(xGnd+LHW;NPV}UhHXr@KO_aGt3c`Np z{Gv!0*>iMriU?(mTcx~>uvIo;QuwA8E6^_pFQf0rrP;3e=+mRudz^Av8K=u+V)iM@ z5N8Jvuu+13+MkP`_Vp|gfeh6_;K2~8`JWFk55!_-CrW6u1Qi?7cqEpi0-$?M|76S1 zq;fyZ=8q*{FWyDK`QLjrVAW$dTWbn9$e ztpE-Usvy!Q<89_bf&BU}>1Pvm3I0?W^(K4oG36^6*8g#P!Gz8>g9+Rpr&~43WZ+=k z0965^K_n3-)Y@5j^SbNWaCPnOfH+7m+y9ji6O<=q(M5;@$|8#|E5fJc(=#t>ZasUu zV=%^vGaS}e))UH6%S0^0`PyO877kT%(tTd*h)}jeNS+p3rhsnq4U$oCp%K&G2q$mN zT-9ayaFNlbsjR-Ld1VbZDPnfWc+cKf53<|0f_7ZP=BknGLs3rZF=0hTuquw;)UJJk zS(Y(exT{LEa%JvT)s&Uru@a5pl5kzJe>cq-Wz;ddN&K=V=bcTv`Ht3f|bcy$eU zlyXH3@D0cT2Vd@La$6W!8<&^$dhUv*40jlwjOF&EIMzqOZ!$VA+5{nS-wcguVG5Fo zBwk@h*N5@cC#z9VNWETgX>wE6kUH)3>k7p2#VEX?gm$TPVwhz~$oh&{H;f@odMzT= z&&3F=fn*HCX)J6!>{I7JI`5HPm|*AE*Lx{?j=ZFS^68aBFik6%n%7$8T>l*m0(egh z|FLGgf*H2yJo>S&DIVFdH0vuPpu&#KuT)PpD}#0&{(Pnos)+9XY1kPsSQ_bFz2)-@{L{eFxyd^JhipV>pjFQ;rGS669e)0KjFhICeph4H~BFc$3k;S)K`BSR509LltptWDSFeBt|tG^9*-y){1@} zCKK0uK7}XF`{gSaL)ad!Ces@L#n-=eZT~cD^EO95OKV;e0DeQeV~thb{dPx<(#u)q zBj{d%eSW)kZeJm!Ja*?$XZH9Mwa2#=RgC!6GLa&Th^4|J_!3MUF1(m%MzrsYeNs8H zzC@xRAWr$T|RAOF7-y@8Od!W<#~MlP-MtW8^K0Rbp^rG2~yRuINLHtxsniE;&2 zH!3)yVsR^tGd)$?j%vV7Xo}%_ya;@4D^`i3b=GiPTnKlsSue;@p!D;$d$Bkq8PC<)k)8!s~8o=D%fx2k&{wNjD6Ez)?)?VV(8JY z9EhljNC6op@l~IDUR_c2O9E{cn(E7z;oI^l;`i3Cq&*prq~=m`vF?wWf*rkz@{xyl z8Hoj-P@4?oj_;=hQi?`FRsl|^zM%TI{}fweH-+=`Y#?2AlP3MN{QZJ@ZQ4TeL;33F z1+jUn86gMEHGr&ad~iXfi=DEIuF zcA!D1#kP|xhWJB=Kf4X6oDz804ZwhvrXDb9L>G3XpD*(t=&*g%(T>RP@qERBC%tpe z6tJGUHXJwE84HYou)~k8rw+fs#^^3dZfCt9Fdf){68@$%Zf2B^?M6ZQDc*AYYl~-x0D}j4ZnXxMYfFICNtP7Q%ifmBzbmpgA36E-d&Ut-0@L zSatsF@Yn0h$H%Idy}vkslsF!&xa-$(BScO&y@}e4KwK))w&i;Hw_x$aLI&Cs$(Uma z7&3LnI9A?agmZW?#{>1ON%Vxba1^P4CkJI5!caT5m3{VfT3cj^l}Ycf!$R0*Dq_>Y zlma;x_>E>@=8>;=iY|c=LL?NDysa9%heMv&9&Ny=VKvjrF1l|LktO8C^v?rOQKWpf z9afk$^*dLHn%s+s=#i${}p;UXEvqCM%cX5S2(C$#Ahd7E__fvz-Ff9FVf+) zRpzCbq7A;6Vd*_26Lq~@^R7H^zuPaz?XDM9pbq-xoAk|zIf_^%)E=GyWaptV;mt!W zlgnv4JhmjTi)HnQMt2rvY3exE(2%d6*oGF2BmVgHIJN=xq-`h^HObM%rO`1<{6Qn8 z=QE$%@*nWH9s+tS@>c--_6siUEJDg+3OsCVY*z4oAnUrGiF0F`*tM*VI%-=fS(wT5Sg2&X+M7IbY9ecTVj3!sfid=Pawr z0_H-E-U>5m!Y33%`NOK6I`}mO0Qv-ws#Dm`Ps53ZoSSJ{lR3pn0fT2>e&{2HS#f`qV;0+efj5DrI-LZj_`K$o>sF z9~Y?y??A#&xTbyR1~^Vi-BgD7fODd%j6oT0I2(dbw^m<(t^B|0I`J9u5h|M6M}chz z6TAaJK%N+O(WhSOE1}iDI{Da1N{ocU$oY zL!nTFtbbRNXnvxRW)(bSlUG~>XMzzpR!kT@jlYEjjA!vcRefcRm5MU=qAY8eGH>h+ zg-+3x;d`|Z@rN}9=8-Dwr|t0=tq8<)Gg_i7KJ4?B8SCV$J6+7MT`2a>qR zlT;)^jlkohp-q5Xw+0na)o%?RUYH4X4A2PVkz$6yElaQcdJt0Hm{$cPsy`~pRe!!D zWB(YjyM2(%qVS1ua%quQRuj-?HsH^R-s`FtnQ{+hT3FSn)X|*sxV=r(#QBsa`hP*k zl%ij#`|OvQq6x4m#&g$CwTJVwg`ALcCbtuL{&yc>0e&-pg-~`4sa%n8Y{T>kZgTM7}u%MGajp4IsdlakMS}14G$!Q$QJ@nMK=}f(W=UNErQUjrAk0K$fG3W|G6slEXuN$gZy2TK1gt#m zrJVg+kMej!!ujaHu0-SZ;w_#u>YXl8m2GL#`}he(rJ0M54X0e~TdC$SaH)dVr-{G6 z%4@L^|0dCXms+H_D|%&Qi{S9n+34mjq$4G5l4or3E$Zb+aim5SIR1?4vpfw#NaN(<72soO0P=gV-|OdZmAX`m+w25RpLwEh7l7GK{j|dx*qlZkHsd4po>T z$bBXbJB{p#groJJl=g)lC< zWFhMk0>+1ne(MN3!XLL<-nB&_Hy;8)z;RK!wJrs;S{kvV`2|HE=J~YyJxK60@S!5K z$SMOU58djWaGu)(iZmvw?@(L?dfGN6k0<|xlEyKb%T4hw%Ozszjlvf$94!ajdc5s2 z4mru|`eZyhp2#&ko(-*b+^O3hvxyol)h|Wc&GI6o@T+Ka2+%KllsXM~=YRF5@i0GL zE+D<2N?6tH{Wi>cXhugW-}^A78)wB>`i|}%Gj&AxhQB>Q?AJ6}8QKt$1<>M{T>4xe zlj$=`C?|Eau}k!$x}}(8oCZOWfPz5Z3$zJFmigMO`zNNub*=neA;z2)3p?Uj&QX)U zzF9xnK3!+;9R~)Y;llsnNJIVh9I>wHFgCj22Xm6~1TLyce~qpG@olPV5<5RHeKTtw zP-?@o@?3F&JWs8z8&$Egt-N*F>fE54f(1mYeDm(#Y`dtdEsKWgZIF>=5QCSi>mxB*U z%%-U&UgDgm$2-1+-&v%SpWvU zK^;oDC!{AVu}<;4=!PDij)L&Htv3bZJ0>AQodhZ!9|t)6MSPyBHoQi;Dvm#|;{2V{ zZ=S|_I96lbOgca^;9<(3`|p$t{Do@02v70db{^t(KUjM(n&(zBI!r9aBuAhm#B_Di zUz;vN@frWxlTFNB1U_8c1h>>dz;+xa6~TWMqE0}eLI-`ue+pLI<&UyC)~oFGhz`-G zHMtgXp#H`z$dx;__)hve8FcHoIK0B<_FH|NE2nVFje+L9JiU}po}cVYBC7NxkeW89 zR4iYWR+wJttUVqdEt_#sL-cR_HaNO4&!Wf^gC9soa@CKXH`H*g9tgP>Tf-;NVQexb z%T4BCpD;=0z~B0#Sag5?yeQWh1Rg6_!2z0Y|Gar;ghjRgj~QM`?{ILfkT-3V<#QfI zlos?Ft;6HWfb+Iq7pnhPl|3K8mmKe5@)KRqkWlwv@)6&rOr#6CBcXU)z(G(m{bDB3 zTRYxuQKVZ(8@4(&+5=tu0|ms>QhyB<0!z|=Qd5_7gw}*A08Jz=CJA zJx2u2QRhUgvbrCF(hZtA`}?PJTBF;ocM31RRug)*PSikSls9ofdl^g!z>}kPi>>~_ z=qU8#RQK9gfmmTmf>%1r)%cHOyyM2gw2p0^v)e1cJ|XAKEl= zAg|bZSUDBS*U_tUcQ!IJO^McBYV0ix^omfq^d_2VRB)XG$Al3izPJ&xrMK;nPs0VC z*>Ck4>C~>LbPafraDC0kXP`!fCpJ*g#_L*u*H0iF&-^-9(1?s&CcLv1#(@{r=M+rM5Ng+0YBtD&@-iw;w2=gTBW zqu$@9rECkr^)lGf*oN|23r=)`g=47e9kZR>8G>CepuZYoj$`T7T90YlC}-z{`W2^t zh30|0yoXI13S*hp6jDvCK!@3!J_~Y_qtetG2sjzmAPnmT@zlKBBuF9htei}4O)oG2 z{?rKfy2YvquML-uHF@SKxfB4T3O`%+YjC2jtf*<^ahH5vRQIzVxguuWyCeN;XahpK zLjNm8#LYmvdrSii4*fRGqA%%Vx69$PL;U>EMzKNy5%-X=6Ds zx!M;QqW=mfeOYI3laBP(zZwYT!{4^w9?4i1`1y5nmL)n?9;bS}y^%xEHhCD$6W>lg zm3ihV2^K)03O`%+4{)NckGgLse-(%Was!3DIQkp@kypX8&7QbR<{_}yPNV*chOy~O zl|4w0BTfOaOTS>?+K!aey-bq2&^T)uQEnwAihg4c9q>53;50V{*XU@aS0jRn@12-* z@FJ(Seb(3D*HiFI1G^sd>fT6#bV&rWNH{Zy!85;(o&IVq+9s;PXDczgXx}8>QA?91D_@qdv-f@45~l=MgS^}QvKB{>97ir?y2)!6Z`Mz zw-3A_T$iUnK8XLZKev4fr_6!FwA&un5|FyOs^Z^ikspY(!3DD>L1~EwC$&A2{GbA( zEB8IN{7=A4FkjR7d%?s>1V+mD+?5@i&0?5~QYdx*D7SBG;U&3u@{yeA?Sqo*19F?H zwBnxyn*8n8Sx#K#gJH=AKe(Y^=t+)crs&R@*V+xR48e6-v}0(r=5{z&&L4RQBrI(~ z%E7=8D8FfE2>o`XPsKPPJK!@8=4_s;$0?*&K-#Hh&UokKwR?okQH*fJd`%F#h3V)^_*ef^2`)4EfMabT4V2tIK zjNTa9eJIV0eqi#eGg|-u9PUvq5Y^BdbWB2PnmXj+-GAGZ7K?>WTRq;&NqYKxNNu85 z|6CoI1h8D|yTWXpLFH*V>`27d8^a?L^D%mnmj?oBQw3w7tQvgy$iDK86XpNRhnbVf z4|$Rj0kr$tuY}rKH)87MvrY%fh!--d`Y~HMWGnNDY8B5!*0HnZ#SLWI%1DSC;PrxY6l7tV3 zAfT|x_T;_?)V=>&X|X@?UhK=v?+j5;+vx6aB+pvPUwUs~>&DK;7;LH?5@D_s$vsM- zk$Ru>-R%uGVobZ?noig?`)HzKrqpE>ASpT=C<$EYC_LZwu7GUBXV}{wu?VZ;aPJoi&xLhI$+tT$S&qkq*a-J~;{F-`r39#KyBDCA)iw+x(hf|JB!XO?{xQv2v72!zz<&!;L`~L~8AHkrdO{67oG% zpSFf_>9eNgXm}E6b@mC+c%F=Dln&>NzCH4qH~csW4!GZbd`}j$f5VrZMw(+6m!O;U zU#N;FLu5UFg_TGRHWbr&RG1Zeeyo4|b($5KDOT|Q*ndi|0yIh!cL16h%dyDOU0|fk z)8gY+2jE*!#xX@IN)<6f{rHscAV+tiuK1f;KA3BNd69V>sLI!Vn$Ul)iL*_xO#qX) z*$&oknMv}?0k`*1I*Z}`XbgEX47+ZWMX%|BTHxDgi&5^Ar*x+MC&W;HYIi&_=n9;@HgU0&md4pQi4LRpA;q4PalU%V zZQPeQfuDe*s}e)%ILwh!t}M~*a_y0ADglP?x8(CR-{$b(6?;w-n%ABKc{X$fy&B@ z7D;!oiY?T(lv)Wi7B|wyFW(ME7J~Ox59EmgX=;6|FqJx;PM;2O|7c%4_~!wlR$uMQ zVJ49X!27LM=o4@e&Ex{76#_AnZIW(ZqHr_&g}~ppyQu{tV#uPC4GiTIT$o>+E1JZy z96f(!FU)6RBAm$fvX6j8VFUY38hxT6K#RLffFEp-DK@m?DxQ^D>-Vp=$u`Ds1E38@ zui|d7%`PZ>MVS?oFi!Kqd!V#l-&rH+2p9n-;G_+*DyEEB!b-9YyCY2Fbhso1W+YLE zS=?$=Ilzm#{F@)ydWa^dbW4}dE#c2}s9tSpOp@aV=EmH+`6CS)HSvP>Sh)GLlx=k` zf#t+oY@;->K1?<3)G!vWzJh(ag4&cdpz>QXv+dM{0Y0!?buI zliU2PX;&|nP%XC|D z1%#M=wjm#GW5|?Z1p*(JkOJc=70m}aAOW?I0is5XA6X<7^o01JB-jHBaAM}|0Ax+~ zZubbYO(vsrL+kLGR^x?`NgG3*B~wPpNb5At1v$chaEVCN9l2-iXjHd0M?`pi_lLp? zynjgA+`r+7UqJpkk~Qb0p0QlyD%Cg+_>TyoEo~`KEbNCx4ytc_v$Z9iIk0qZfrZsr zL7)mb@d^{0PkSvy|Atu2Kxyo;iARJtN3u3~D3_)L+9V>^Z#CvGVPs*$d6?$(9T-#NGJ#bh8mE^EGy0fd|O*IG{{~rY32>|*IZRt;4wYX%|Nu1BFUWIDH ze9QHikSB|%ODyvXliD}hI0t0xviYsH<9-Y5;oFprgI**!m!bs!vS3Xnt)tc#WG$0f zvUD8#x~eI;pft906|TC|hVAqdaiSid=cH|xos^I2T{`_MPdy-6y;h^E48wg% zagPzXV*`!q6RW?07cg7i;CgPXSbbZ^7c_p`wQyCh@$)?t&+Yv9{zX@~>K1r4V(1K{ z?>T6}Dp(h=A+`7t_mA771Z3le)j#fD<@Jui=}%CzQ#v1Ub&(Flx`E4wcx=MV0#hI^ zCOgA`kF2AeV1l;=$r!9T)Eci6v`Qpc+N6vBn#ISue3*}G`40B>261$j*R$)ux`osV z^H_TvCUD&N+l~8e+0*w9k&#_gjI2NI5q!|1!;vesQvEabK=HC7(zZNV9_@UI)5{BR zt02Fo^if$FPm+27sXQ8~8acZ=5DIE%5qsQvx*d2@fNoyyTsf*yqKUPD+DU*}l4#J1 zX~;swQ0gA@KZxjI5mEEOf9xX+*K*o7JO?R(Ash4FcrXts>9B()&u8NrcLG!$rCmk0^##V_obJAjl1_eX<&F*@5@kU(QE3 zqML*>DFm-p2^N!Z65O@>&cV|WkfJfn0{pz9=fc`Xlxl)$4#H32Px80>yJeyB`Tml~ zB{$S=E_S8_hZfpzh^9UbIV6%BS|m>$<;VSFixeIQ)#!NG7vweR6L<07IaE&^MBpxW1geyVS?7qjSB)wK)3-N!}e5)0{6m0EX-Ex`sHtxA=#ARYM91D?~3N zTSvi@{TSAspeM_duU0;Jh%a$s3vt;`lhvuY#&JNAX>WpVM&FouF1B=h?N{7qnlpV{ z;#H$lco$TNC))9uBBu8pwA|?_UC+2~ZYbk&PK$6S+4FA7q^DVBmO*%z*7-phsJRm_ zBfKFnb|J@w+x8h>Gi2g~dLCCopy;};VcSe+GA(bvBfX-~_8&x~j(14#z?_|!(xHs5 zMv>6}B`=v<^V8yzdQ(`VvWsOPMnSa>03hg2g=L=Ht}g4-{ZbHvZVKps9>kXfsGsuu zsf%BB=={36$$;U&8~8Em^jcqP})svUe`;K$8nctD`#YHCv4=K<;tN>029d%>hfq8 z*e=E+#gR2=(#c&1m$_Mv!4&%OIOr;0XH%c(P5JU&3S=RiY2OF1RvOyr24~7tygYdd ze~k&?>zdv|Kl6w7WTqg>bwkjk7T#z5=~NMe3g%a%ttJ;1IFI?p3pqjC;CWv{jp+9o z#r2Txk`D_2Y#sONvIb0Q4@C0Vu^G3^qm3AFBD5AsPB^o9rBI&tL1mY?9JT3QZMqUu zs`eq!f_=W=&<~tJbat)PL|fP06yH zV&%Hh8n(kSYp?;lTjO>trX4D2SeaLPWd~RjgjR47k zOs7H1NCT4GXd2~Su$(8~|KXd`V(L~=jc{|%lTHpU0#@bUL)pWS3y;MJ*Rxcgl%^oX zB6_{|ubrZ;OCHdA2je27Uq{B1Vy9e)xkEZtkV?sS3=s9zKX1zO>7hFi9#y4=H}8hT z6VzyTTscGTI9+cQfz$yB#K8u&7e0s7N3!Eehc3?fNw%}e4mQ7ZlSryE{3t4*JEejYiPm89y zJ5o+Z>=W+gf=~oK0m|@!#AarADBoKeoHqd73h3etI}TIF$2`qc+k#1III^Q-ruJ2( zNWw9uhTY7W3bFI~@(!vW318ge))085-#Lw$-T z;)KIzQT=7vUvRXO_Ti-+o&hIeIAQm`aNvo+)KT`=vT>o|HVJC%2Q_L+mPxg2dQyuu z8fi#0sh?VCYfoci7wcmE3fyd~db?td*jVTz8>t)#xEnYai03=qQh~lm(P;U{$?+{c z#Up}}!n@U}@S4r=#GvPt<^7mFq}ntjB2C`}GR!MnBzn2Utyme{G56kXVC~Ksa*67& zU8|3oMcXo0HvvnC@-#H#DJt+f=Gw}FCc=gp_y%fqyT~KTh9E?fSa8iAAM&5YXpS&l zu6HCRN?-F1rnGd!X@J`pi@I_pY5q%T$~-*LA9F#N-hieP&1(-HGw?XQ ztrB&Z$t-mb0+O54=JWMM)3^#p1q0wzqjqtEVaO6xHDHgBpvJEe+8$44K!EN=J9qNR z-nWa-siq^OYER5h3WSS|xZfO-A!^P%Fz5QkyU!=k9T0OFK8qutS@sJLM%SQ%`A>rM4!Qwoh z=qXI5ilx$UNA2-b)&+s#_HcfK0_2J0G`+HE-)*-CU^L*Bka%e7!xg4Nll~(uJt)Bt znQJsW%(S>==T^A))3ZrnLtV(ZG(Y|t^VT;f1y_70s%%BlHYnGJiY6{*X7O?E-+Ehf zkzUTJ(q3X-0H4rHb`sgu)xC+fJYO6JH(*=}L8Kgx z;BU||0+M=pcf}52a!(<}oJhSd-uQpIogNh_*26g(4iFEG5w!1_`<3P*gG;}enPVh% zSMVEb23rINCwG-OaDP_I-8)zDbp>IL5wwO@ib=_#zqX+u?MIm&Hqz{u?=Pq=os zi-QlNRf`vP76KPkD4K5?c%l3hkIi=3#$aa(a;D5+;%dDYuA}C47x&gP$PdHPOsc*` zOFPXnUYplARD!5r-mmocDw@u`3;TD$byGUD8 z^1NOu7(5Q$x%C-@)jJh6a+2S35Zj7F`DqryK1an{=UpHAaT7)&ep?SK#;tREUeXc* zLL{6(K{8pXGr3z2_!qwxLrDDAof@#U1m44v%IVMxy_bBy0*SG? zl4eknIXu~P8OF0+mm^qEH(S)*wXaC&^A%jv9;Zs?6zsKeWQ%ltDGv6j z{Pv~X5oYnYI!O#Ole0TL7*&(xux(cPP!9R=IQe4&94`9i8m^u>_%bU)=%)U)8S2Vb zZ=QJrkXV5Buj#1fs@SwdsAJ~kbMV2sh73c{a33kmUD+)Eq5>-}69)RJ)IqXTjx%?P z2^7Kn&7||Gw=Xvlr-i+cfBvA|)R7dbGe_7Fd)=uivO`w?xBWLPG*YF9p`Wgw+E0&5 zhybd4Wvne|)*2GvKQtIoC35aLta z79lKpTopQrNy0^?2|p1@nW{>LkD4T2Tws5jix8t=5Stg`y-^%__C(&Pdp&#AxpW#6 zEY(}YcQ1AzzT-Xul9@B=d=O)i#B&= zVr!dj0^O$(Laisvb6@TciFWV!ZSHse%kBG7X}#8k>aEvfE~mGAb0qi7m}ona0K2o! z?zpSGDc=x>q8$Qzt=C5bK@x4%O@~Ir2mo!YYcB2r2D^^%41a%;8lT=h`>aS;b)n(q zwCGCBRm(0AUaP}F6t%kOzE7?Am=qwe3Pt?qHT(2e7NGU7nXBO{bogv3pRA-0oJ1Pi zuIcqN1~=vvSslb273sGf<_tBYULsj)m$>peuDzgvdRBHTsyF7?GQDofP;CN3tki6n#he$->g?vfK})xP?11qN9%{5u#V_xNOk35))i!Hiyij-4mGm55LvLQ8@4rTa=)SyvvIV!rR9#cR>A&nv{}Wx1!o z;-!|7fiNsGGWmk!ft^KKI42slNx)}q*gheg)6r;K9OsXa`EY_xj`3cShRhG-4-ow> z8%l?S@J5S}wP1E#0AUO1FY$rsW@(PYyxIyxXKhcGI(z@Nyz$2c`8X78t>Nri4KLoMcTg&;i8ekg9S!9d$vct|0}lUMtp$OYY=6Ht}zdIWaS?nwNsl zH92l8w`OOYEuV)F+rWv+N#(?_*i|ZUf}n0XyV;$@aFyOt6SZC=E&eDd%yeF5rL9vC z@#sdoK}#h27g8o?>i4BF^jhXbP`k0^z1DdJEu}_fS(C+>W9Us-vQq9N>zgKHvyF^& zLXQA0w?a`Z^4%un**cddG@ynxTz58##)B%fv?eAg(KOb??k)#VRRadeYj7IIh8nO) zK~M2m^v=Z_1SyN-@8$KNM zVZ7TYw~NdN;fnhmM9ls#@_8{n^?RJGu}L)vklt|wbEaqjA%#z*Gerg?IrP#~ zfn0_Vm@*T@t{U`BloPEjid$c__QOeZ*$xr)1{yiqy#^$Be1fyCX(#fT$jUnML`10l z1|&wy=Zug6ih}gtcS&dfS4{H3(ft4O&9&yZ^?P(abK8beJ2E<51G&F0Ok{26@m2Pc z@!7pzS7uN(oGXyu?fM_^26w1rR>01w(8uk}in{tblY@Nx*gO9~NS*xGL!%bHYN=S3CN+bpPU*o|u0E((?Er3u>Y&kK@A%g)R_TOt10@ltJKQS9&)rIapklzvvsq|F7N_Rb*64;CIQP6EufT;7NaGh9(hmb@*LS(kV&qyLqWD-= zY{&Z06Sx8d0dLG1)*|%k8}_SFiirZk;usdNOA=t6TmE~b-mizn*!goUI{X)Pw8;*J z`l_HY)zq7+L#wTIQL+{~Rz4&~%uw{^#hf{>gou9V$yE)`U-%AyKKAJqvMFZ>0A`od2(YJU@P{r`JQb zzce~T0!&;@d!*r;z7KheGd$oRfABDZhSX`}Lm1?;Rx=`RG|z3b{t1a43!dBrkbMVV zCg1%4wCE|T1EVlnQ_eo*;cJvix5j){AIQ?I73CduLY372K^O2`@k56I=`=qs4%?Gc z_)lRVW+NOT7Dcbo;Uddd!JcqmsNj^asK8h8Vkfn}o&82>gb@E`wa8`(kw}k$__Lq- zia9Vv(mdEf^JZJ}w?rV+$iQpa1#Xnk&4vh6`Mt;(%51N~<5Orw(R{t;wG0Jz&mn6or$?lY0xkTdbWPomB+^#=dr(?482@YZtyCCafyj+j09#A|Uk zd&#rFpF+h&uu(?>hTqIcfa&w8rQdp)_*tf1OoT!!FwRfCF7PBcTn!Kg>6 zRzLiqkvYY@e$dKE{ujd_P(d$ru`U4<*%Xp?wziMF1bqw@FHVO8TacmPL0}PVrFLLn zg|hn4kuTQtD_jFe=&h}zv~bGe*nk+ot~eD{9gkf3O|WVClg$lGlh|ugsoGDxkZcr3`dB z2N6fBG{t}Gq~Ve?bQ7>jefoRH?@9f~mUXu?eKi*Jm5O9?4h@Kc|7rv7f?dP09MQdX zjZg9#;N+jhFBBXrnpp3ti1`@(X7j4PG%l{UG;p>K6l=Tm^z9*mxJT_k>jUsWE%)GQ zw$@+8mOBX=YZ4_~|9awFM5=#$$R3T|!i4m99fFLMTn&I`p>qFqER+=n?g_ArwL z5a5lxhzVO>QDV^!j#|s)%19MB3UxW6DQVpP0i%R#wqHA3 z8M7~vj~e#4NqWuJ!nh!C7e@pJ;st@dY*-G&|D5SQPF?Hf?Oir+i5dWJy!!F|biBgL zNf|%!-|1uk5qS743!VkGdaqJMJvp!4XG{eC>hQ{lx|w~_!N{EO3=(15gw!U;%sqTp zexK3F;{Tky;zV1*B~V5)n395Z;AW-wnU5}GG-_2jvigr|S?jdB@CPip^biCe5t~)$>~KK+uSt#X}YjR{FN#gxm7^txcffbQqf( zfB(wN0VM_QfZ764921O@Y7r6Z*lasF&Iu5{06s~r*a!eZwjWZMigWD6pXF@!?07C7 zhn4|v%5%szh&zP$n|)-9Lhvd){l-RIMgD$kQO)9%_#Of%SU9(jEUYKWY-% z$7az2=?|Fi3j==jeLH2GLz$ut-zGr>#rB^OJ6$bgQUcJFR6j4Bfq@D`eK$O#lk!b` z(K`xE!`{w@4Rx~QhAoJLQR!Xd@si_8Ois&?FJw=pJ96zGI_MeU3;MFU=E9rOX{w@z zTuDU#-LNKS&~(q`?6&X7;~QPu(xmqo8h2hJA>4JbN%KM%x`xR*CM>beB%_E$pVsOb z+(5Zw#coVs)A;WFSK2^7W9{VM5KOC+O`NUg&3u6sv4*4})z>ji;794kyx2fkRt59KJEWk6F#tl&0`9BJTeO(K6cEL|{-K07 z^M~q!LWbY;(9=vrdQKzdY1v+?zzwTl$0^d_98qk0iZBob0;fLwO-8aHk8g`CmSw4X zAjB^>`1Z4Ht!JZfj(}Cg;u_y}`BIMbK+V&b*g+ar-Iw>OBS5!zU8^eN**HzP*0JHC zRxMa^I%}vPlihb0d+_8QmL`#*8)LlMTi~q3X{E<9-i2nC#lJ-K8gcH7m$*UZQ*4yn zsuLBf4;4`h>a=aH_)a3qs4lG< z;2=`iUCka*-d2T(wh0{CjQ+-bM9t68?1gyJqZt{Q?~WB21T4$P+h>7TdU9CrzV-+I zT09s-OS|~9bvTTt;pZ&_)~;_zfO(S};ko$Ww>kr^B>x~PJ6(Nl|g+UH>! zryu+7+VB2a?-P&&w!#=o&S$iv9Bz;HsK2@2l5teWlONvTUoDxQFCK+~MCM2KFxl1n zj>>fZ*P{PtRoU^JCM&?G^p`t{_glVe?GC73Xpn*pHF&VFz(Qm7GmLP#}-$n`y!00yM9M%g@>E$KEDz z{uGK&j0^czGXC-cD7_>MeBp1y4qgEwzYqH1ZCSzAA+#PwsVSGqI2Op%J3A$m-NByl=1ivdWw43yBruvTaf85e$ZekR z@`D6rJ*9ZZ+A!>LT3a6Suj}b$Kmy zMs(b(P_F>dTNMI(VpteO{Hvd!D$?{hV!hjr8-{JXk;lNli*2FikHU}37TBpy?{z*4bklo)$eMQZyjVXm+4VafkjP`}f5Ijk&tngVy+uJm!w5jtw9xll z->{jT~ABAtYu6%9InlO@nZ6k-b8Vr<6=UWWVG`~(4yht!)CSYG3{vh)Jy+0 z8H(qfJR%x;T{fO^n#h1;=D)ZupetVM;vG?C&r(mOywx`06h*fZ78(9kLSwWB+47TJYLnNF0>DL zZ>va6%Xj2ch>XRL&A)e1v&80EfAUmjTF;>9 z+cYpEmkw`b8eDSx=v3}tQ~V`KWU}&%GO@nHlK6;0eh(XHo}!#zW-?|Mkl}G_I$N;r>Yft$tob8`}7xg0Ik1QBeWk9-@UB`Ai+;e|8{+G@EFf)i$2`Ht?U zUVapIIwlKPF|i0tFI^du*5!}N{ND#piQ2hgQmt0lun$40`p8|zVkLXJ!xHbu!74D6(ajO&-Epv-No=aX_fIhs$Gv%-zt!DLfVy=y@yHW{m3N>^D(j zF%slldt>cgzwp58^+k<{7;36D($-E3I&9RaU;BHgabLBTQQ z?j&O?_wtK3Zh&>ln~eOgu^9yIDssf)hBhF`+BX!g^jyS}kd7BW#6LM_ftJ`w8%5B?o+){)A3jA4PY((8BKT53uDgam>Y0NP-G4b9=v7%4~frPGz_aM ze7;1A1c#i~BVHM&OMZH(*c=|n$|y2xFjCSPt?9OmLsXTfH9V+~LLVCFZ}Jy1Fm9(2*-P-BDHw z<-omqZ?^>nxh11aPC6==PG~ZrnGqqC#pE(kaVyXIE=bY7aZN-R&N91U|^2&8o5T-a21lAXRG0Q>r`NJOt(zl}V zteF-cn^A%V&;(6%i>q#xbY4CXLU8g{fY!HLi@{MW@~v<(z0C1n*6DNsF6fF8&koGf zUSb52p0*-;btNHG;XO)%hQ}_n<{+*+J9CFuO^NM(m;CC)2=fEVYMFVz+@=NJMSfk^ zZ4P@K6E)`=J)r=Go_x|O_)bIXQ6_jylw#0s(w6D z!$orNWh?WRh_D4^l#A+b0h5ex+`*k2WEJ3{5Quhu>&_?dT#>-bW zYJopjr{-_foDhkDUYT67#>L20gU9?wv|)jgw7OPuEa{7)?x`0-!4b22wYo18xWm)7 zx5o?$^US@A(%fO#gF@{tS>#~P5OVTx$=Lp|HG(@Q(zxS*hwe#PhLZ<7apRVxln zhuZwMRKCoot{btSwP|ok+!E>$>c3>v?`S)>)s`~*k&~a9p;L$rz*R6hH6=q`mekT< zIkKTG7Pzm^@P7QE24stTc^G$jdS0Vu29_STZL0YmO1!Z6Q`p#!d{Y|ie$g&Iomvrr zWSx8@d@ys6;Z0P3s6GaoRNRjFgiWO+{h0jr3x^!Fp(M4LsUM>|j{v+#av^l&(SGAo zW{6K6Yi`k$my|TZ@kj4EP?rhX_SMso!9N9e9n;MxA*3>#h{AS#L}WIAT9}+`iYM>S z+U505#0_ek+O0mh1UF658Sqnv@NjzS9CWv&EvwDnF0XX9@LtM~%!Dq+KAWCal&LUn zZ{yCWg?q8?x8E?%4v}LYLQ_-}8n$P|AWxf=0NeYm_IVC`GmnA-ljizxStqc-LPggs(>aNa!5 zXxdPUzf39z1HzRD_Zp}F)EY9sDL&DJo&6`1LLMOS=MHb$T zqmsEfDXM^SMm~co)c&VGY|6(7viLk)4~ybeox)ML4U{MPoFp7LOgh^mzq0bhO0CJy zqu6Tt#l>gpuyyTWP8iECmmvh@oqwZ#mPth-y{TiJrniz zoNw>g_02H{G@TXg>Et3rA_#(0ic-MVi~L*CkjtteJ|~g~SBa>m5uk(Ap#6kL@6zFu zZgcHH(Tvvj`hc-pdJuU={xIow{-n(TR>M?Ju z|I1&FUpchz37Upn!On<=w=3;zNoa5uDAQBGy1|B&2famuC-Pv{*59@P^~_tVt3YU? zO0K?@xq1H$6%5E<$*GGqm8<_BfmIA|k$x!vP6!nBvXr5&SIb<&A@or-poe zU#g7z-HE{d5OP*dONIQ-GgG^&Mo5CuA54}bu7c1lf+F!h>xC)Xyn82*vK;z*F+wtz zh^T#iXMmMaNU>2&_N(CzVA7g&y(plL*rs_oQg@ow0TT_oK$q}45Ltim)5D*uU{i9* zzU}i8R~)U0v_rxS5>8Bv{2M_8_7D!0tGSy%2QI@AnS(L$xR$1YZY}fyo^wjij#+@D zxMEu|N`-^B$f$oC%mt)}gK*Rm)B3I350lEZU!=43@8y`!@X3)=a5$-#V}fUT(TvdG zhm~XJAHfw)wGV^RHdA!UiAD-iKSgYhZ&C3Vlk^|EZ0Ix_srtcQvH+jKINQIDUv$KCVnAeJTEpEW zDvc_RX{CE{)sie+r?Bo^uvwnIb{Zj=o#H~yW8lKB=PCP$fQJ;7io%&M!K_|}@kROT zQTnvw>+eu(+T5Z|+dA#W$JG_-*B_g|eov3+{kUM=PX=l!>8qD=B)A6I-1n4oMx4aT zsYEN3E|F2O-I44O#DY#j3|`BzO4QPYFfN+y zsfES$$#^DCPNhrkpLEwf%C|yJvMinIiONKDEd~Z=<|uS}*&Jec`@KlCtc#ybC)%Gv zcyv*Aw2O^0_j_c8PLQ@xkcVnb-CmUe7XEmaX0{3d?_I^AyeD|zcUVU`qpbG}1faAW z7+6Ob$~M49Ety$SMUqq-;M5`~#`Mc!grg8!*4^z#y`4y$bIuF;$N|yuo#eHJ$x=+V zrse)Td&SZ^PKtpYn{JEs=zb!naSyav3rjr@_~x!Qkbh51Wiw+sRx@IC?p!+EkZrIV zWf5n*vHMiI;o7E8RBaeKm5G&n^a8dFj+-rs4&o`zoLc#9rM=7IN0~nHV%+0WKWXw+ z5j$ZVzMBZ4G0C_$>RGO;GO|4q2kksb z*8bQJuMu@lrBst7j941enucaByqZp4il%2(Z?iah0v*rNMcTp=Za*)73dBaj?cmuH z9Z4qp1&q(~rN|$iZ>jPxVo1$|X6285Qs?K8j9TWYxY+aXha6GFO(@=HVqkwML{TZ$<)Vb#`A0CfgPXn z74bI5BJ@%b8YuEaQ@;;#MQeJPLCDT!naeP@drNWL^~~&f z>vcKgj2XW zZeg{W@Nc61OfU)jecqe=u)qtlAB_LAr z&&8c+LsaWh$$+|x`2qykuHbf!{J7*VJUUZJIC0Z={FXSIWLbG1OrMC+ zgjsF}_x*jA#JsE>oGk>9ypxXRQ~cWo4YRp;C|;pn({Af73z!}Da27v(sgoi4M*jYJ zOS7IVZ9T(RCXFHlg&(G37V=BOqP?Wq*mTN3C3JY0&BKZ)FLBH3>-B1lS@Lf~fbG+t zqdVUfgdMk_^R4e13^Tw;!^~o@pcfKr=&$D>LZId~lUCjCu2ZrMQdF@%40+0(iUgOc zEB%O`MqihP>HiBef+!s!5UX)xU4l=c@O;9yTfzTF{d_b|cKNT=8(}CRMwuBNbI}eT z2<2No^GMZl1sBrVC&Z;47GsXlceK9ovhG#KRBHO6FS6YJg&W6-`(EJts2}nuS2W7w z6P=B)CVr{kvciQRDNh12%kTA#;hY#8(Qw#%D|RHv|A~Fs13TLpaYn*d;2)AC!sNT% zY;)VoTaE3<9tP!B*gve<4Kdn-Uh)W(8!WrU9z@Un4el^;4EKJLuI+NDrfEKVrso%m z>m4SS8=gi#v`jg6AkJ&sSsD68Z~3o=mj`#>HiG#r^dLEXg(UCbO1ZiMaa#OVE3Xc=`LsU+3FD@UvGlS>VlLb>P?a3X~1k*#|Hyva-HI+ z#!l(?>K!+tPi6YBj>bZPd#$eJZGe0EkRX^6rW8fEu^Fr(Rl6oze-X{d*l#?&F>=)J z{=%pTGr9c1VEH@HdNSz4i_wu4+&R+b;XT_w&Q(-n3$YI*;Yo=g4zFYkY+ z56>=TjkJeFP_8F-gc3ejWc~T)$l%>g@Ug)Fm!oj<$|f4y?#nwfUtrL{Afca=2HC2- znF|p?VhA;|Eu1Zt3*5(Cqq}~?@l)sBKaFGqB*JGMS#mJ?za?wgtFvnXa$LwHbyUAVbv>q_a{)hdbVuA>P_RS=5o(Lg2 zC58Uw+zLXj1cr>og)0cIy?m$tx}WsF_7*rwL|;CkwJh2!?@5W9FG-zs)N58EvJ54^ z?YfM#koi~sx4-o(hm3R=x=!n|_@Rn=b*!Vxyn&W-$npbBai!?T9}A>-nOYIg!?dSm>O9Ki;CA zB#>+0F@_}k4THBi$9JF6c!iey0xe7@5mzzg~o1aI3M}VJ)Uj*j&7A(wv06xPa Apa1{> diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/WIFI_RAM_CODE_MT7615.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/WIFI_RAM_CODE_MT7615.bin deleted file mode 100644 index 2490ace8b15f9e31055a037b6f819fdcd01e1205..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457992 zcmeEuRal;DvMlcIE&+l|aCZ&Co#0Lg9)ddrcXxMpcXxLS?(Tm6tgNhAlbP9jU!2Ri zHdi6U9O6McD|;je%h&>97-Z08o^6Mh zjxQm>MKY(`Q~;9b3^}45MeB3zEe{p1NQ%+0Ds7>m9ih184!#mEE5F~-eQ;MUhCHzW zJ9}HoCCk2GLayx!^ElMSWqmeL4a^X?%4b=F^{su7;7hN**3(Y52^)(Nf7SAxE{+?u zUX^c}wx-Iak-^2ABa~M@t=YXy@uZ_lq&2Dj`A-;3pD#Piphwzv;z3s$i%j;ME ze6+vA0Yc8EZIk9@jJ_U=|yJ7>w2$rlo2{!sR^Vwk1tm24-=kn;uTuaU6|e&?*(l=?;*%c8tRY7Mp3gsB8jPxGH_Dvs7ST5o&(;nU7M z`6;Wb@25l8A$sLj4XD5NG|X&81$4a&F^fj$M40|w(Nf?iUR!MPEnGh%B)BzodAni2 z^CUE)#9bJps4;<95Z~4%9v26O1H>y&tj*z+-0h8s4aDc&D+U`PUvAUbfz(YD^r+1< z$T@Tykhgx(CAKV~BT;%`cDbzviAw%o;YGSFhxXz`x;SPw8!r zUW9y67;SLAR05LppF!*DLwNmmvTLxas89lOxfh0vGhoug&Skx#T=jw3aLVs1gJ3`9 zI0$4?XNDnV3KrYc)^|VsWVI@OdW@_}1lYUNBA{yI zfSC=I2_{G!Ea$EgQP)+Wsf|eMSKh6ETSa6f%`C4mVY*WphI~oVSN)cDj4O>NeJG%t7X6BmnQKF*uhhZ1(xO_Qq*Ge#l?-~7~ zM~vg0f{{-G*PK!>7a2*%U&82s`_&{STZeEuOI!<@O-&!fAvsmTJ}!$?9i;mKv~)BO zIC}3+o^ACRwG8pqt{_I_`}p~S4I8KhXU;wiSTj3Z+umCf+n6Zi(Hp0&l5*>hu<@qt z;FHc$54e`l^TO9up0!it%5g=^P%lB7|I}Z+mN|2icvxCse&N7HHy~j03IQplD8mNR zSpO5&yRsTHt@#!Em2@3b_IME0_qYZfnt7RUHN9DxZRb!h4I>qp524=#aYOAZG(Jlg z!h+!Ja9MSe#;T|;a=5FItz@-Fq)&?ANnSo=)nF~=7~eg^xM7=0jQFA5(KaVg-sk5q z=^bL_`?sJ670syTV*4cGej@uHf8T^+&@0mEFYixM9*41QGR+_ha&>OgS=z^i#a$m9 zMatiQ&SBgh_>47>Wqas4-Ao0>CW}?pjwV3m^Zpj?jLvx$blB+7L@JULvN{Vi7TBzc zJ9LbgNUy#ZCt)V>2Gt(nowE`-)&sIsLNY<#Om43YPje8GVe$C;3?Qd6tA?RD4M#25ujv)zt5!!^Yz6=f+JaoJ;YL zg9nyjO*XG1TIeYsuZ!_hGP~+|cTEN;$f<+a#8Z!mL#hte2R;yb$X9#n0Z&f~nYo{O z9$LiBJgKzZNl{k{^@P+MTF{)=i&0a*z~^H?DSS8x+1^BF*Y;OR11qQCGYMw6uYDN2aP8*o607P|{wldQIMHMC<6rB5_dL6rtOUuel_D z0oN-RT#Q7dDsVUK7a{doD1(IYi*!W0zypT~G_EqF{XrFhi^TG^Zp4@u+9qEz3$vwTE1 zDMwIdv2{z*UKuM#P9rV`lX=9I=+_$YZxF0++b_|<_n#5(iO}LqU6(z%XEwN9jg394 zs-mW%T^gSuhs-K)SCmd5*(_&QW~>kJ^lLEC+77!w>4`?q&nU)xY|x zT3sFxkO(PPu*QZ#wR}U0FUfP$BdC@nI{yB`04TQ!q`ZSJYMm!1nKR=98`Sf6_k9yt z1xjD#H|5<$tz2B8S32K}D_0^#b3Zh@nJ5!izmCGFX!OM1img=3pQ8@$zt14MNMTxC z;=AD_ft+P=oJ#}_b3pqvVrgHSh4A*sxnAMGy{Cv?^P_iofYzoucwavG3$+O-3{5Po z)qY*NlCRz{{JKtjizS+ZC_*~jTs4-gM;u?1s)5^Hmk-Q3XJ2jbMwTum*5`{c9u5{x zN426h9-jlYNV*zD@gP_lH&j*FDskj2D~T!D@PM=+squsvs!K$<4NKeB7x&B0-#C#T z-`x>>8}4?KRqtwh-&o%4WfFn6bN!X%6N(4=J#-2InexkE&p>T0x6T*AbPz_I5m8>h z52#9G&2vN5ij|QtDTbL~T?imB+h=Z5&X7sIbzH@KdG1Cqgi}J@a$}jhOuMYeq688O z0|H1)F9EhWsmTaIC^4xkd-%Ds0@#i;Cww(^;@hb$fh9fIR(;~8;v~2ydI8}>g;TaZ zJSE;}zRDJZPAcyE$8T}obhJq~_S-TF&fAPSU@(9x5|~1RyCu51YsD75s}MO31o}d& zTUp3N&m-yZN{I2=1;mSMcL#usEluL@4MrQUTWb9$EZ3Jq&0 zDN5=o2G3NTpr~0e*%v{6yQy(k1=qfJDjI=05zC+#!StE5ln%jKNs5ZQo=HRRYU>7?Z$vN=-7q~%^($_x_~@Wn~Zp- zG8KLoLY?i&tYKwMqwJfo+p5M7O^LoaaP7k9-Da4;*G}vy=9V{~KQ<;gAGprZ+Nk(f zs;n<`cdf^0h;Fp(-C2ghyoq1;^@kIk?Ac$iEUs2G_!4k@m)dZE=j+ zWjOxT@RU5E&65Nr&4;^rJB#WA>pH;9?VyvQpe_jrI=|)mI0x4_Gf)S?4U(%b70DI8uK{N3r%&QE;=TT_+96ellO`Vc{( zLN5u zBu;9+y1&7Km0-nUE+8opSer<%U_0OD>{xzlL`i|AbZvrk878UqiVH08d9bj4B7 z2ztiYUR2?f&{3(9n%9)=<>?I0+o7wghKLx(&xe8^FD`(xu8}l|FjBus0QbzcU?Fy& zTegCFRgWzO17D`9+*kHdc&I>fC>$)bp*MQTCavtAxfgSU)WLt*va&)>&=!0kbZkxb z`RL@7aQfa%DP>%SSaXCdd&Y7qP8_thQJ`pGAxl|{{yD9TE~HG(?Os`to+U(wxv4yW ztCTj&4jTl|fS11j@d3oSE|4TWeljwoCdpakO=1FYPklpjD*{-cZQY0^{T4UEBSx>7 z?NHyhM3|ct5#ptDAu>HA7zF<=|KoGC4ewU*T@XxHV5Y{z5APR7NgU`kb=6IWu)Mwd zkr>o-TN76!J=46o$`h<7Y!IW1=gU~(J6UR4ee9G$j|=3iFu50M*5mrQO?yq>pT9Y= z$^8UkW8n^BGqi*IQ}aml1;eN^n`l0@$k((tCK|r z$PyV!T2)T$r2B`Vi%T&u=$wZB9cX3}&mi8j;ryqoIB;G5Pnv3}3sBIjc;wlci&Py$6oD5HZ<@hQH0}nuR-Met?*KOTbG=iq$ z&-8FuBhSWvo7rc3;v%t$rQ(X}kqOdh;1)WVjA?9oiA_%UBnhWqNyo*+hCFAbrDR3o zt0}!Oig;SG)02F!aOJ?4aUQ(gS6-uSg<9Cm$~nWv(`Msoe}Y8SqyhER!MALP zf|)XsZePc=$h%~02KB&Crm(>v?s2gRHRZm@2J_;A+bhvr0AURKhNl>$%@?+}@Whbb z%MXwXRJSZEJ{1%oY}{xNRY!jB4H>I4y1>t;8oHEn00PNAkNeWH8E%Zha!1SrV=ch) zOlI1DOYU@}BaY6s-B$Wiot05i4&-n+*ZN6aPW#rg*Oh?mjTzi_cVcFh^a$wL(STk~ z0$~b7=5d{Uny>3<1R5#x;)DnuFRP&Vbx(cR4ONTf1ycj+mLR_rwOr3tHK|({&EQ#M zbhltYi*jr&k+QNsgLV^fm!ESMoAwJB)0q3-MAJ;r)^R-&>}3^6C=*;Ibyx$C%|ds+ zSGm$D81EEf_oOaxsZMbOr-asQ!QcTw?`hsJa{v*HiVVp6lxvlfnrR}XUY;_U} zxk08mS_VP{<40I|f}O|4?h&XyZTwi<OtNV;OF+Wka3`RZGiY z)SsmKHw4G;@-4V5qRPZk zHJ(OE>_}pec5gEW68pkGa~3#j{#wLx7Nb{rFy;=^Po6I@sTXi>rQ#e>$uD+(WSWt= zr&odfWvCw901fdhU3fGcnZiv*&uFxnhC0YoyCtLsdY`=vnKnYq9ylb#;iAyVF~BEf$KlpA8`_^TIaL(CjOeCN z96r5gvE;=YpsCTRhT@%^wMqPX57hnI;cdBxJv$sMA*K67AIa9ar$h#(iF#u}V^Z>TpqZ5%?f<2thuDxdHwAP9 zT*{mPHXkRm1$R#1P{q+Y-8fvvw_&7gWYLjQse)w7pns5h$jzM1m53aXfb?`AMVR;j zgwDAVOOU6O8{1sU0xCpAAfI*N+EDdz*N;1HB-hydW{j~Utyt3u*bJL{clnby^w{e1 z!CSk>BRgKQ@pxJN4L0s-X4ysUo$8hiIY`P*a@Mj3=DQ24QII)HyiTS%oM970e>Ri@ zWjbD%8eug|gI9Y4hCT~Eb!l->+5WTk^A_UoV9Sx=1ZI#4QH|`vpJhniV|L;-ni6=B zpd)D^Z1XU35veiI8V@oQzFu$_>Qcoey2}-XESgDEyLxBM3E3#7zE-YK6GN!TqEfnXLJ< z9)huTqXqU1kf_VIldkGs#IZufpt$a1Tde!SxA7C6!lB&#g@uG68#I>CQA(C~jZL#8 z!aOeE=y1}V_kC_apN6yU?ihf2UD*d--!0Q9+t!jf z_F;X+ownR3IA5_zL)mfx9qtVotEOKGw={egEVS?a^h_I+mgPc-w=yy4)&}@HV{wup z=>?Vp?2Fa175;jCAUs@_(~n{$D_p<{*^6UHP#skU)vA5J^~R+{sJ42df5rr_J;B?A zwtXyCh+xk+QF{*WJEGM}?5oQvx0;9ywb)L%i zxWK<4j%>(@k+9#SiyAjldV`pk+IhMOV~=T~yj@WHRPVLU$WyWOO?}EUrN=Uto^6(> z4tvW%5hDLMsEIQ)#w3)h2FohS68V+G6h`3Nyg70s3}~$^x*KH<_7Lcsotabqf^@s>(`z zy07Au&+Mo^mtHneDH}7>V3EUyyHubyXRrvFv3XlrCZLi7hs`};-J8Gx!R&J13d-6F0i-vJsZ5dTdFF`kf%HOWC~If@WFJ?|WS{FZJ7-eEz%O9IG)aLu+G8=Ke_ zCuBh{p3=U=`vGs`^INsILB$a3-Z%AqMQZp4LRkBfQTL3f>-uE+s=zY^Lv(pDB8ZP) z%jrTUI)=CrvNQE6a^=a9CKK!JPF6b_YA5%K8_BWuDrIjZqms>cFG}BRd%C2kI|)g8 zc{ukPS$Nb>NKhvjeY?fsS2X6kT)kY60fio! z7Fwb@##it~L6_vHSSv^=l5&_P<*frVVhxDuC>4rx45lpoC+&9|fiSs;_Bg7K@EZs% z47nnME9_ZRAPJB|(f6qD`&_EAC!3AtRMHpcnzZ_YEpm#kPQd2m?Qm^E4iwRv5f`wZ z=EBp~mVTpODIWK!~&s^JitD==N zMz$!LsX=S&8(xOYD~Z%7i-iY26j&jU$$gWz(%AW0ksPhf175HyG7OLYF~PX!^T_lg za-kOqe^aF9^x$5o;ndoH&XTaIEt)&7NhmGQ?=`L+HWf?6@nr{@JK^ zzM7{q!Wy5cOnkEZ=U~V)S=elFiPp;G$1mUr`p@QX*IOwVye#Cub3wl3_=~@I9=Ua# zjn2iNz54=2=l4BAu|!o}fYZS}-Hs5#IaBM9NjXJ?D)~sUsz)@F$}L}*;T$g&J<1Hx zUA5|E^(w}}tFCZU7kMn(-Pdpye#?NjvjWIPftT;Oi5Ln-+8at zjBG=YCY4p`3^Jhuc3f-LEj8*JS)4PfD|*BRW9P^}C7z#VeQbc5^qGZ)wml=#=)6B%1!aG}p!pNR z%m@{#7E!J6%&Y__<(Ktl@1|8g%O1_Nw)P~@s|>d96b`g~_6vCi71Ml5b zJzaZs#;=(D>mKN&>>S5xDaP<3PPf^aiCDrqi6h^u%f}nabBew=YDV{B@LO+WuhVaP`k6 z{fG(aeslxYHErV{EmRxiuzpHfg@R&*Ak=zRjaJMv6^TNT%U5Ac_`-L6Ko%iAY+5tDqRxIju`p{OPm1=QyXFIqS{2UlaxXEl}^YTihlh=kX9EQq*bA z7GDT6#pS%X-{e5P;pSL{uj9A#H+Uvp_P7qUbtwtmRFNZMd&`cNpSLK_@I$}BvPyDt zMvZ5a5bAST5VtMUEmyr$N)F7U_s&*Knj&8cn=*Uh0Cq)M(DHH3n((Rjc$7Zo&%SU2 zdlVOH!w6e$c?)v+97y-`~x;Qjeg8^ko9m)tR9eG+4sy(jL{$ zv)O654J4DzSPK#upgP$K63|h8<(?F#k4z?|gVxJaz%t^!1pLG?Do;$fnfg4UUA>32%^!p_g2cp3)>F50I3(oV3-9^`jYe5T(mss zoydSe5?LIUs8_4`JiOc3snxum;NCpuw-uR;gIZ{C8dH5q3E6U!qLa&;>JafWQZ|H5 zDCwbhD(^UmFzm;6z@db0^7b7Lp*T(T8@$S`>#K`t{H7qzH8dS6y`<1o!wukDWUSvdXeSg!1fP_t7Hm+i)gus+-OlaC{QFV00NuY6f4hx0*if@1efz zWy^?LwE^^K>|9VhkIgXY^Fxnz4@rZvpN0Kh$O`0UQ$nS1P6;}FcGg4*vA8&020nO5 z3Xyup)5hwWlE{vRhmo`Dt~)zi3;5=eOKvyX&NUI`Z1Dy&Q(P?kCw`GMo{fBpk9Q?V z%;33Kn2&Q;!R@rn)_w}nn;yy@&u|CR2?^77ctsm;=SeZ$LDM{@u!BHvFy-7$52Sko z#j92pjwg#Y%g1 zZfieAH5uO0JcE9I_YGVj-c2q&$v2o@G=$HAj9BaPoEP}=F{jyJAU$hkGjs|nD z`erAtQm~AxO6KpIl>Lop+_7Vf-JIZL_YDbDSAAy?+xl6P#PAP(nF06(%`oZr@BCiy z_vL7?kOOxwg9g}^LoF5YGlD>9M1Y_U@0Q^!u>!p{Qbj6)c1+sQ*N-*1J3MSs$ z`cjTMtK~b14$vc~WAr-N(Bcw0tiUc|sh*l}!q@6LKPC|`Kj%kwk_FT1@yn*VS*t4| z6j5p2t8SQ@Wqu_ctZtG*=B~&Nb0>jopZdE`xeMEYK!ujWU!7f@_f!-;(E2ZLYPo@K zF=e5#^9}TJyc@v!PCjaP+LwSBme&CMe&sK}-wI~Ek+NGoY-mP}N!tE2Y^J-gp3)9~ z^^!7nC)LrS+RD*LrdxL1p&xtQijTI@f87sBl+s#hu`8JWjB8>%@>Msx4?E_4AI>S15=+LwJ9mM4(^FFU;Dt7cVg$XxSqr{>-{QqR z)SvzZn2)A_`DhQWu1S2=xR+2O2g>W;kk4Xhnxh2k*nf%=vV+pnfN`dQFAk1pm&gz` zNbNyDnmb9o^^0G_0&Mx_y@(b~(|jg9s%aVR37~)Ym%Gm0zRFcu_v$Bf3a$xctz~Rg zQva}|bk9HeMbg?hC`n;LlaZlYPMW+mb>dTFMXTQyUxDV$-aF3uNttD(g?fBbjzy+b z#;m}T_4>Dc!V@%+(NArtmo7TuAt$LEM|0RhjeY)t)3G_V*8AAkT(X+R7yhYq5{r$d z4B>kO#t(i40Ql7l;1?-?Ur>w^O6fUa8+Qs7z8@{-$dqU$$x^45n$>2pPe#G}c@wPi zH#}CxnXOIX8ElhF8ijO|D&koV=}wuxTj|>?>7Bpu;>d;5Yn|-IQmqzq@BU4XlRy04 zPb*1VP?PrJFm4PzeAQua2a^Wvr{A9f{5~k*cfXGVN| ziHCt-GECk|9MjZ4&&jHUPc|kzCk&~WT7kk$rsliu8m6b$Tv3RU*f8cV%cU`zHRKR@ zC_IdXSvRZyaU*N9<_*OyR?%0>BoYboyctzW+d0TckHt0o68?4YVVUZ0dALcU;8`J} zZxt>I`SM(-3n$A0L7Ii+O&fJuqm9_o{RB8N&}j3DvSyeqINr4qE}@~oWXn(M?a-4; zoH>uAIsEv3D2^?56dy-nKF@Xbq`wO(MI_m4VSH&0L;x9GEfsGeKB^P;iww5?bcjFK z#~`6aD6*?8epr9r(F|J=;L@_gMVS%5ya3<3xqMkRnqE58+?twyNLR5>aF6f3a=08G zOi5jQvmL4ljbqC@%{h*CM5UCDj)B}Uo(hK^I@J@26;~ixTw@kkdVs+nR=TM=JL7L! zZXE;W=>f)?`2Cr6oBa%83YM%N%~4w;##Y`UEI zx#DdjbT>VX8281y z>WrTB}1Am|_ zO72{M>ONXNFC9qF9jg1i-h1<&qtVuv_^UWM0*>;np#Bi+Z>gd%SmF6GmVxizKdOa^ z;Dk|%ReGRZrFHFZ-qL;0*IPH{QeiOc!7~7n+CYHmMPjzsOFsvuUU>U1=d?*-I7r8a zJ6zRo)lx@Gb`4N($#f0z8KB;xoNFET$en}zEAaTvI!CdspdMN=SU=RaXyN3tb`B>- zhM6^eEJq#3!BkvAz6ds=7?;H_Vqbs~)9SLdAYT$bXi_{i+!x&i! zjWfUKP4Cc(`72*wr1+>>oE>^OOHsOu)aVaVTCc4I#ylc#-S-?p>WR36BMk(eUahHZ z)y8%7&7l^P%XcN9n*ansRCra|Hesv;S5!98XEbz<{qZt`5qL70e!C_#NxPej3VcEM zhKYwnt}dJX#79y5Vl{gN!Qx;9C0nf!mlA)Mx~t*y$b7tZcc-zezb@YL2>_+wvL>^X@*y9v~Dvoq>7dV`(-ej$qli$P@%z zu~XBY;tdLo{OUOVBO}23%KYPfQS6DDCZtc>@J!f&f7I)z*Y$9Ctt8D|7_rd&w*Mo84=f&3%{FiSk{-2C(86q|q{TN{nvUKZk0=w@#&yUL(_t|=tq3Q_|85=? z2x&P(NJ$zngg4*H!5z zEx3JYL+_@|oD=q1eYkZtd$#VmrteUvk-WbV>*arX-<2H$kF4lxlb6D2uWKHIYbQB_ zGga$xnYU@JzPRpW#gX9%SU=vk^w0P8hgeYAcb40D3VOOO6YnN zS)&GSNd?qdVTx%H5U?iXM7tXBgU=Am#|ppr?4pP<8o!V9JedfeT1JDURxqNk3d>dV1a`#Jm$fb3MpJ?74}I zLm&|Nn|{$0Ox`AJvS;rNjK`&-``-KmEDCsLHR_<|CogNNRZ~ zy_ra48Up&?>qQV9Og;ZFX6A-KG>tMVT&iD9$3DK)Iay7gL@6(W&xn6lREL1GyVKx} zE!raF2aQBUZu)n>Y84zc25MD|T(9A2A@w18$SfaFcrrEtGlKE;mjDWlt%kzGOG>js$4{^0pZw~d<}bERt7vV!7xoYg_ItL(68f7U!$uLg{zmIozhC=?!y|~g z{C6m9;AskMacU;Kf9xCa?mzYoPj}pGR3mC{4B%*92<=azfca@gS1~~NYhTzitd&EA zLLu{V4y`Xhc1u-$byZsH=K0tsRpn~%h@XbbMP4$QMY8*A-rr)N2Bj#Dr5;N^M4Yhm z$F$$u*T<=>v7~G(L5RotTvFu+4v*lC-p)Q2b?4UfXa7F0L)-H{phSv)aa`T{}bL1{~yZ*_&?-N|Nm>BN&C6a;A57eu-=Y?c)vLJL-Twb zN8-TC5>fDCnh3Tv;YJQbY}NUv_rD;>Rx(t(VP~hX1`p=qSn>tbmj|eCce!Z5-6{DL8Ea>MppGK<|P#8&9DI3s<&i1m5iD^?dw6NB% zr|#*>vj59(f5-dB{!sbx$NoTN^aHQkDy?kiTOJUe-2XcNpN!uwXkf!{J0J52->Hvw z0PsTphWCRnJwSkcwC3kN`lr7G)$RTC_aAtW6prISC?mF|y@WXlo)mpzfpgzVQ_5Gjr1pz(Ecd^6kiFtfgu>K!Pc#kk=ISy^EZvp@CT?mY5S@BiEWsPz_3>qs%zE4L&#kCU@MJqeKn%;s!Tj&T*X zg`F*JyrW-7JJgl=@ISrZKlXzu-yi#d86`$s@O~bDzTaoS{^cO&Ihm)Ql6HAJb&1FDJ=+E- zhDr!Kog1hxAxKOeO2do}qqo%+-zv&`@q;b*O7!n|zwZ<8jG^Ce2OnsdgnAscesT~6 z@KYPW&%f&X-}V8o3VSo_e3UqC9@W>A_#u_w=XoAWXmi)p8!e%eg2%67^t-`T!*4uO z=IvA&jElX&r&#``2k9U6U4G3q#*X>slkwmH6lpwNwJk~DlW>q0f#)fBqHV+C`a|!r zX_NWSC3jo|&jjZjJ@y4cc=oHq4E65y6O~fG>3x$uFq8d%n*X8h4qTHfZkhKNJ+pGB z%@+Td{}*OI=Kqn=rPE2fg3tx241@ar`X^2=egkB>MwnS8bfw6&h71 z=7)Vj0$JP>qhI>_HGhA{`)j|t*W~-LU!CZh-Zv=2put5?mr86u>imxP+rD2~`%TRI z54@9qkN3aL`#>7ObjpW3LvQGf0SmVbTE7`68s^Ex87gP1#eVWRJPm+L5n z-;E~e)~}~gL#LP)010Nem%oy+lSJCY|G0lecF~o4(TAF_CdP4gp!h?W`NN?VU#-%V zU-y3hclWRSs|Ek&c;N^lX|-uv_O3w_^;RKhuE#XLk+&~Cv-x9n1~TYyH9XTM7bTlW zNtYn2>D>-X2*K>@A&tDtHT+kZyOl}{a`*wMZa#ThrFbCoMEp!7n+ge8+ zBrF@gE^aYB(~RFR3_fH9i0P<&L}-p1^paRALaoanJ~L`3eoc0u|j2 z%(OhtY-8B2SZ6{LsLWQHi!$}`_`A2$22sAMpjgC>bm7g6C*}KeX%d#9ia5U zy2JzN;&K%lrQau4l;!#ArKK0(b&N7A6<&DZ8XWffp%llWMX#uvByGlXSBfo97(Bz> zUI%+f&F83_gUg5Ax zjy-lPy%I)wkpo2X;LCgxtm*3(WBbVO@W=g&4A-*D6x^t`J~DQXoq34ODAR8UTRo1c zgJ3HDY|n1Fjy6y-6j7kwj%65A#9s6bJ7=W`Azj`@KFx7LwmvXF4HR=rlK7#wssfi*5JD*a#&w=twJIGKkkL;7Fy5TSafeOOf&E+2%e9kL39{&@y-%i zZA!_5^l3l#+wfgAy1V=OOzc6*aNLM}tGwb`k)(H1n8) z%ED!AH1%xcj-b;QvObSj6QqrPy;3pdf;W!xq7!U|cR|97Pg@W$#4ZKkm!9FEdO@E* z_o>#B+mis)OiWd+(C3#VNRu}*Uo3JoI44_pU1>KGP}S@=dy&~ji-!0RxPhocsD#B( z8AvDVzjz7x2W5QE1`;L{uX(C75J!QlAsIBe$UOR?N3M**l#Wt=yS0_ncRNoFA(b+< zufEXAWp~m|c<;hn`S22jwuQZ{G4qMQd$c-C(mLX^GpH8j$9W*~?L{EbtWiuQ+AUdV z-upOkYrqK+kF~_xHWxHIE;?4(!J+L?t3k+q$&4l-7}bv{w|dmPZwqdJG3vlvchUJM z+(McN5>#QZ`6o;B$C)}>e;y9R509`;OB}a{OyoKA9 zW+Mt!^GCmYSj*qKYaErOaW5pvY_{r1Eo}Qi=|x@PK^D!S0NZqv1$)9D3*|T z%d?GCMTEj+*0wD^^|C?iOJIp*EN8Uc1?6Ehy&vv^X@h$61+i+LIEt!`h;8X?sC5>5 zRUAAZaksUsUs0=Tp95+ci~egq$!DLq6l`!UH7#y0g}R~6zu&)b^g~d0C7+C!wmb^B z(tL<(u*BDr7XvMw3N<0APF0TzhKo5CkoG}BxHn?UmhpZ{kwnB z46_}%p0j|{!b{-QAkXmqonKa4oyevruSijN$j2hM)+em1l2lR)k!L^q6#(d$?7#GD zPoW6Rmik2kk?%;rW=>x}bGuS;;UoUgQ2$!z55F(PRcvKk2A{gs6DD=L`zQnO`)%LP zmH@ve`L}-mu9lglm-a2oYtIr{BrNAa+R$LoZb%m^OWk zqIDz(Po1IQiVr`eYjDFunL8R`RIDPPRluzuJt7r>s0L6MSb1@H?7z^^a>zuy1g z*YExM#jj?mpZt<-(c!=PWC6S%*Jq0r?AGwZzZ5E}j6ZWB-Td$`2G3A{-w*!f_gD0^ zaMe4yy27J%6&a@<&CQH?qWB{|Jyx+7kCkRQQ>`hY)_>i<$j(!O;Nu1Fxp`ko!seet zG|Ak5+`mw`FbXWBhHf~l(Gq{Ze>IxC@4hq;?PG9Mwlxjc1~D_vz#81`S&Twis^vS9 zCLIamo5=^C~V`O9ot z0hY(~7r)>zi)KNPZMy3$WKiJBc?M0+O8)RK|LWTT2x)z(5O#Uj%pe8BKlX`_*lU1& z;tzhYzX+aOK_Tix@5y}m{N<(7n>#y{xuNp;JsJ^6U1g~8MJaXQ;r=V7(p9!k z{MuXyv~NNlm=xJ&GIT`i>(ilO!Bm4jc+jap=PBijl=3#k%8qw`@@pr(NcrY6fv28+5m6TbisHOAIi*m8}_q9quM- z4_TUvKh6_(U~LF(D%IZLQZzim;9wxg@U(ga7`m#@D8ZE$lmZLOEI3jQK!gBWB@eW; z?n(Nx{?)IjKl+6XQEQ~YqlS{je&+j3@b%ryWWC|_pMEd$@BIGver2p?wB7|}fi%7E z|HHqW)%nUf+dj<>Cr_7uOas;YqhAI8_kNW^$i+ile$ihcK+trOwOPAH!)Tg%?xZ!O zH5mT1m(v(YJvoE_EZ0$m%L~Y(GDvna0QV<5!2PKkG4G{OYLGRo5v|c9{KOmRw>-*q zAu#EY9kx*-V;}{2G6)BNH~W02vGoh@S02^yXC8GHROhFf%(iYxu9hRo=!yF)kNSl- zZIv@@PbP>Oht+h9Q#U%!gZV(TS;mbwq&{5IIx2X&!a55Q%5vzS08VZb`8o ZYM?6{bwEVgH#wOzHH)$}w1)qruy z+Qhb5JBf_gxbuUq%>wc$8naQfu|s7;=l$W zJdZw4LserafiO&~_E0^$rusel*Y|1DpZ6$s``nL)XqDZv@^2t`s>qjqeJ}pP`@xrl zApl=EfAWRq=e^;tJn9GDjiHp_S0i=^$vKpN!2|j3gG-JOLyQB1yKi2!D~AU4Y^?v} z+Tq`#k2@o!BfK^X$fIl+f7B=43dk3J@Fm^^z?Yt%eDOol++m$zNocU%3B_aT3hH57 zytH<^7JiSV%~OaaSp%qV`|tJr`W_bg4|&w5VJgLGkd4(JdapgMRbEOOR4}chVVSvX5>N^xxbf`+?W@H@+lNPq0P8OUD)x zyb3-oR9qWvumJTvb%s03eo}ds05e~i2INt;Klzdj=%)-P?dFybsI+K2R|E!FFMop#W> zG+JW61GNaob%AXE0^p}MfS-rI>T7*25~V@JHTmiaZtvLS;P@wB{<=>gMqY5Rhf`8h zF50loFS7^|RFIX&<4)FB+F9s7nf8P84Y!6*KJ5xk*!M>XmpL16-|bF(eW;kdrxJ9R zEdcxeH$6!Is1IKhnPCe#KqbPjFX*fR@&I#0yd(fd;Gx7JVSuB6(KgQX<&fU;6ur7a#sR-e3LvGmnZvXd_(jhs&E^ zUmoiI288=N-fwy@RTz6t{R5Ba-{aXX+G9E!Am(Lpk2w74pMTw-{=@^+w+yHc z=wIslO@9o2rvy1&=M2hDSB_7<^}2|EtMA|Ho#eMXin`kNqkCG9po{5<9)=dx;`=}J zKKhrR{mP>{|IDKtuTe`{B=2J}3me<knEvltL};p<>*Iv!4;4K(;d>IW0%qB=@RT2AnE z0!_I}ZBRq%5Fcwq!46f?p}8EoD9he*l302oxd9zgrz3AJ-CUzy>O4Tb%GW&c>7WjK zIz~cum@qq%3KDuTC0pi)a*)B$lDc)rRm4V#XM%xudOz3vmPbjycA{F9$F3-zYf#A( zYQ-Qs7OW`Zt7j31XlcD3Nl2uXmX=aQ3f(-;pwlY6IEVkpqpARTR0$xDO8qx^6iDoO zW|pu~Z)za|C(^nU#H?{OS*76k>I$jilD|gl!MAaaNssM|4`F>OdrDwCG}TA*9}Jip zT={57>|eS1tN-cmu>pA$Av)66#eC`t=7)@U?b|vPv_=yQe{qA8HO`oh_qG${GmB4^ z>65_9UJ~dB=!4er!hk$#^?%5t8UF{Vm_Uk!O- zM)-0a_G~7R?2oQKf9?yS9v{&qga2-DhtQ(E%{!TKO8> zI02Fjqr(g-yKIv%<9EXG6@Kmxh62E^n1ArgS_Qi(6!7`B zSH~0|fQgW0Lgdso0IqH08^gF=^r5rK=ce>f0;Pd+^Cfl(2{5k84>3G9G+5ca?f zXTN6}N?X9+2k@)Ycsl9oA9^GM zRxlHZ@hn!IYN)Cua67 zt{!nJj;Gvi(ZGi^Dcse|uExy5XNdpD-aG#1xpnK`v5m%TY};1j#x|NXwr$&uZQHhO zyGfJAdD693?|bdF_x|1c{gc07e#Sh7nNW8l~va_D@oyp zFiqPy6ieZCtWKEfFCgq|4iI5=b6G`6?Rlsx4_aC+Ku_{zmalKvvg}QdD*Kxr<;&-E zvkR;3RNGfKn^*eGCzh zH;?6K_uV4!@h?59=}nI+eAA=S-t;IfB1CJYES4jrVhO*FwnCP#F%nr*@%DuYd{D^o$&PP&;62p+b`(dH$95zO^*_| zZ}P{pd0s;=cn+7&TAFggIxJYFWmg&;M#sJMl}DMR*;KPUlGjnes#kx4rSeF~2v&US zFV?sIVteba=$SV?D*H{38vjd=`Y-(@WuXDZpV#ps;K0a}H-5$~&|maH)$0CA@eSLio#Fj+_7;^2@4z4|r3fN$$A z^b*g>f6cEk-p03izxJfd_QW%`N`A2b4QQ#&=T?lcOxj^i&q3hzyiGJVsdc>V`H>XcLjnCMHK*JXZRv+JQ# zP6y!A&0&MaDAxYw*AzHC_<%{;Nw15y^RfHwd<5I4I$PS#ks27r-29I3>t(+D`QQCz zA|fkgs??dd4dd3@s@AUWW&_5|(D1vz5HhTPY<{Dlo-!6O{+yv@087RH$NW0*RGkx$ zfMcbHPhZ+F;>`GiCoo+Q-gx4V{*sl65@Q$yIXmk$`Ct2``Nw`~EM$g8WYT^2qMSQV|zuC|ouad@_9@Y21>QUr=I+lm1EV9r+ zC%gySAHs|Nu17uCD+3s{OO-f&Rg5Og;J&@jwM=g5wY=t#18g|nPYVD|LH)NL^=BU2 zQxNMu5Fzqa5RKAhw&j8_G)k1P6|XMeO)P_4#&fsm?|JN}w>);2N$W5VSM%ya@tRoc zWP<3U3XC@Ztf4k|-$&~uDKo&~Ovr1`)SvF~k{Xp`M{gId{FTR^|0|E(d%dX#aoHhM zBjDs|X|PrZOu+lY!JAh6cAp&)Xr)Xx!s|A&XLy?U$SN3^FFHivR~`)fZ+Yxy(;3xP zgCJS`usz2p$&`=3^VnH$dYIFj9)?|M-sRNXVT!Ib2%qU2eZjfZd~b*jQxYQ0q{^Dv zLOyfFAGQ1)Uk5(8Ilk#>mNzs&l;f>l5;w7SvS0Q7J&%p?Kjg8$t3YIe!Wzqh_7OTP z37J9tvtE`0j}L{4-?OzgJ7!Sk39*obV#^zXQPu8nZe~iEekySww7hiL_i()KBvTB` zd&C;*N=#Ml9mUjMmN5h;*(3eRW8eKPkL}}SU%+$ssx(8Fm*N-FUi>?c{Z?;@)0L0NFna7U) zAl6Ty8#eK?YX>f}Vp_<1FUI70dkvskK2CzfpOw(NyHM`wJ}E9vlbt$r35zI&)I8lcKTb6H0d6~AgaM< z^`mAFkf>nquX*7h?hdG~hUHj6O-&0UV}Itc4c~r0*S!5+pLTaD!}IqGXZ;Bl`77;Ye!6ApCNt<|YS&R?n3BWq+6?v=hDNwU6}&w3opAueS=jA447=kIy! zU(ffSdF*1V%SKhNhg+N5@l9n2K|0v)QN!eZE!%p|Jw2kO3(dcO4>$a!f5lNtX-%KX z3$r8qgi!|TGPRu^g@%vTpW&6W%;Engp)43Q%jYA_ey}v19+4Gz_1sl7U znN*?cc5I%Kqf-Xp5R8boj`Sw`$k?BG?6-QQf7R>kz@3Lb3EwUubd=d_FmhvFvzY7R zo#-T>@xvA74jrgGSHNCZP_D?ZlZOu9T!>Awrufray|=&X{d*qU;{TAxUZ0K>{J|>c zE{(E)}MLoo|$TP#on^q z)i_!z+Wf*o$(CZlU(dJpujl*sJhuK@9@`HiOi8LODNgevOtj2fkakein!2>b(I|a$ z8E{y_i1}AP&ul*f{_bbA^3i*Tt%N&gXI+`kLx4y16zD;6^3wH~6mc`t;_hK@f13ho zl~_fOFYTDe-~+xez*zVAvM-=v1)df3xRv zvbtF6*Yo{d@89#-m~VOPJEkdO8SqQ3=@R-CY{MT`NisSokEYRHg-zY`^ch>cRawfqfNBzb^1XL1+APa=+6Ux-aVyz@jYCaj=OmhibKNz{eZb0c4}NAfz}i*Dwod=f zV`p|rB-@c8ebjNQ^rbq{yMD`K8~$-W$X|Kv@1jU)|1bS(;m1CCz$tvWw}PPfMMWmJ z;O7W?a;cZi7usG~_!f*dw~q{3wQb(TpfDl=#uxOflC8zUAKspC@?X#Q?|E#Vw>&lo zVQwqp5C+AE3RF8c8X223s3NS(Rj``Llclci6ku=(NEkIXnI+80GoECUZ^;-?y)z1u4{#*+6v}S9ht_^`4 z^@CTlF=r+MACEFF6<&WHzlos<(M#=&wBXZ~e`D_UtE3 zqe?1yfZ!uPt0@&{oR)ThRazE!eTgP6txS+G6Ry*ZcQ8 z_WD~M`|xBo8WfvS7H$5M!_wm(@s2$0Z2JJZh7zA_dQut7q1pE+38KHvt0@tYW33#2 z#%w;UsQ|{a=F&#P6u~7=$PX>vz7!W{%ng^$($ZXq#1r3oWb_Lr@+~j(DTU5m_;MY@k#uW<=(L@c7=0D}%^UylzYPD)8-My=xg_eV zY(ca=Me+jx_9-i%Z|A42XX=96Z(fMhLPc;pS3@ItF{IB2V{Y%K?Oz4_F>IpCABZx694a`6MuPb%jXhaMPN%#p;*9~P;jDMcj zzx}Vezx*#r8IjowJV8{FmQlCp@+jor{@3sI{u5tZX}qn6YbyyqMdrGpV)@_J`|W=r z{^fs3YKi3hzt;OT|HpaW=D*RO^Z#EwL-r@nNGuLF-g>oMGg#jgSIWs(r|baAv6Bl_ zmmpF-HFun_{Pw@7|MI`$R9OZDx(#TT{Lb{cZ-LEz`(OW8p7^K#Wh^3_oDYJd96Z`T z8`ChM`@YJ z)0hzBF$1^LQB`VRJ7Ih&vE6U|6nlB-v^{bmhsHRGJ;OPBO_3|BKG`toLqJ}}DeH7eK1)y;n*utUN6EC!U zi&*DuNsWr-_)2ZC2c-E{pTyt!=C}SX^S}6CFlLQ=W!7Khf4%QNRaY(l;eTcQ)BpNU z{P^4dGW*N_GCy+%;{CQr6YWU`FKq`G@!S9Uy`TSle*fl!KmD%}L1Xg98h4w--3{nb zbwi4Op6_||K=>;xzC#7@SNAqDr%jw6yd(Ms&hfxhykFdMk;c2;{I7^N|LfO!v2Xk( zs#ePCcU$lo8}lB{6`w+Cft$m{3_%w*I&%btUHk-jMCfh3T6d?!hYh$mS)VS={0Z!JCZR&rX=Z!B2 zwP^54EAHJZ$0J55T}R(2cn9)!TUsqO{WQdEzYGf20&5 z-bm{NY?8AfRu2FRn9jWRkN5q}|Jr%;zYyR2uca-L)~Z8sSmTLx)77#3ynnp!|Iz;n z-Y4eo6I|8GnD&u6c*G<6_xazW{OkPx<$s;L`Cn^q{#XB-|Mk!FJ8(~`Mj(3F+eK+; zX~ZQ9&~~!^)&J&y{c}Aa@qnL49ZN(-(GmriL*3Q3eVrfp;Ew=Ye+~c;|t49(d=0cOH1>fp;Ew=Ye+~ zc;|t49(d=0cOH1>fp;Ew=Ye+~c;|t49(d=0cOH1>fp;Ew=Ye+~c;|t49(d=0cOH1> zfp;Ew=Ye+~c;|t49(d=0cOH1>fp;Ew=Ye+~c;|t49(d=0cOH1>fp;Ew=Ye+~c;|t4 z9(d=0cOH1>fp;Ew=Ye+~c;|utU-H1HFcfR=2;^{M2E6ys_nRliE;(Effg?y7TiSJl zG-tI@f6CNh201BqzC$UU7?jxD%zzRi79pcVmK9aXU>mQ9(aq-L)~M6qF#^lQn=Uw1 zdRft>isJwAvN!a5SWjhgWUZI=QLG=aKFo-mGm4sh@|6GJLOj20cE(Oh@chK_bRbJXUfBG6T%^UWlI_C0cxW13k7&c>(?IohQMP2~ z4M!>vWE??0(k)M-_I|2qste?o6#S@7fT+)hhid`iHM$QUNuwFYeB1MrwAPfXl$@E0 zF#6b^Qqz4>(GAa=X+G98s`(m&#CJhIfX+gf*k`YQec@zk9v`Tfq96`utZgp4$IGox zW*0{rI4;YUs=e2mw$-@%5Qf9cTiAh!$sE%O;oC!+TjtcyKI2t69SFn0t0rTXuxlzQ zig^rKGC$IWKKnR@xqRlN^_4TbSd=ItYFznCso4BM1TzUqF1s*o*jDX0*i{Va6cED7 z*F4W}UY-N;s8}(}66Cb?4 z`rwG*WkB*XRhGDTOMX&cznf(+cDQc*IXR~Bk!kpL!3fdBK)U!L&G8of%Lm{5O;Mk( z1I|e|1nD7o8o3fk@onbLSTc2FXqW*2$ImuVgx={Exv~%vqRZ-hdN|ea8Ze^l z8r3wCH-MV=6eQP$vg>+THlZpX5NO?JTTp5>vBN}hR(ghlMAbz>2mHZbc2NgagRXu8 zP(P}>&BG#}n*kA^0?@VsW^zik*UwWOU{w5EKgvK=k|IUH_!X-_IF6iTb3bUXv@3&N zC2vl+MGCaVu$@_6%qM-uV1hsP()wz=SCCz7dGerwWZ6$rJv1(#6och5mO)>erPKsJ z0ja~Qnj_z4?nE+uOB}6}iw%xc#$19<&hyf2dER&7QO1l`feQA^N~N4W6zED{CyXYK zV~^0jK3GXT)O}1)16*{>VKe057tI&=ebm!CF3k0bqBWnIkC=59wWS;IO!y?yL++7v zSGMB1ZkM80y4|)uWZ;gQb&njrF}sg*1#9aV{vLrFJk64^JXOcdY{2-E=YtOc5|vCL z%J#EdR3B0W&gJ?}FxWXoGSBf{<8`_U?D)2+w>xR9LB6WY2)H>WKvdL=-k({oKh5dw zR+pU37fen9t8CoyRv#0uQB($NPu_$3+!$YVqlt z@1JAIRxomT`rBKeva|J7VbyP_L+uEq*|>5eQ3@noQS8nc)Xq>$ELcy%un!?U}`usjSoo!HGgh~zNA!QKIYADBL5_++3|vPgGs8EBL{%qg^R z3-Z1Zj~eSG zA8+eWiTD%DJ-ZAhl)c62oTV^=7(Xo|P16u_;-yUf4Hd$@9-v5TwM+8-PNU-0m63JSC0RzN_vxlCE3N z65Fyd%G&Vvs$gkBdfJV~k~OwQq>bx7cI4);%`|Yauv}28nDq&^Zvy4$uT^ za+dJ6H21FLYq-R`_7RxxKF+bqhkeOH(^ymXY%=*zokdzZ1FbeJ&v{y?=w;yHEn10K*>d0md-qm|-ks1*TPLI3J5>al_9|oY z4*&GDhuo_N8IEhkH$jMA-rt_FqsMvsq9(HBpc(CbQ4EntvQxC^>h$Ft0TAZeLXLWO zn?IZZ{iy?Aqha4w@=2XQZf8w>?(#Sle^&z6v(fBH%Uxiy7{7EtqOhyVTDSPw?B;0A zuI0jkJ!>e`7Z)`JA6V$RR~}2X4c|=PU4L9hry!?g@kzK#HAbNm8PBfWxH+4bxL{-W z@r5R{@uZ-B$jeKVHZPV?noUl^$}IBD5tWwKf%i z^?hH!$&dCM$fEMKXS(6Is={j5Zl*NtclHRYY zmOUh;mJFbHtz#2U+zF<(I&)%JS`=Qm>C%({iEG?NuDw5#;@n2n=nwei_i{ zSEIF&ZsVNjjJ3l@@L}vv!Kip>YZ))YkfNwS4%Z%+#VtA_TP7rI4k@HTCiA$IHoPap=^Ghcg5)zWaDew>-2dGJ901Sz7o9G}N# zF(mF>gf{gR`sCp z3Sw2r6=ueb35EQYf+w!NqX#g_z)9VAx!};0H$>AX|XpcuiQ5IAtIHL9_RctpzzWiEnG1{8Ci(@(E z`VpheKGUiQ6A?{Rd3})i2jpNE1);aCqW(_h1^%p?;NWL#-@z7X57Gt~EM_Z|kX!%- zRCE|-lJM$-_v=|X@+D_8kYfpmd-#@9HYFJ!U$br7?Zkt>4PU8@A<0!vgF*Qb zN)X`Uhoj@I#VX@oh{6iq=7@

zNqrSjEqm7_Rq?*Q-g>5cZuu-p@as9)C-^{SfNG1Nj$Znev5_68 zjsb~v{d)(CmG(T-T*b8dQ%uL3{#!!<0vsafc|-s?FtRTIe1HU@)-d$eUa>X|QjC1R z)c>P!8!xLk;qmLfq|ixuf4fm-Toi@Lh{tk0toy#l$FvlDRK^IBBUee=G%fxd^0$1w zRpzS5iPGY^Ru&f|WiLo;l=-rVDr1`3ED*n59->HLeF!-ZFU#q?qy+O-dhk2@UT@q; z95G~lN$NlAwF>oJl3FM?N^nrf$HM>7hZ>jxn z@gFt^^+-lBs+C6}M&+%H!ZOcrt<(dJmwg3h5HVfX%~~D5tL$q@NuijD8jovPaLNYL zMtL3z!8)}I=O&X-GJKW6CBHtXLp^m$oN}a0O&nnEl8Mq)x(qY#4$1U$e-29USNh{U zEp;7>bb(XdB=-lF;&*`q+H(w#b4+qjVaLP3Yptrb7_*_UVeU&{iQcNkC9v6ss5PqQ%F=$8@FvF>cMRWG(^n~Y*r8(b>e+;5?3 zInzfaX{){JBDy!T1X+nVdmbWSUhD_8Ob__Fw$AVM?-SdGy1rCO^zMS{tuZr|&_ zN|B=R{S4=gK-8>C0|k>vj)8sx_A3JiQBt%ScdH{6fM0)nsV_*`C*<@2w;O&6& zH_M;4_4gX3MSRRd?u?CoYQ#;DpNaG?y3po_EVJZDr(gMhc)FMyMJQbg&x^0FQ@A(T z1(O=Zxj;9Su}aDfump_#_KGp;Ptn<~fv)~hg(u4Hb-j<`>t@8vBeVM6_2fkp*nE|c zKuLta4sT%aZ3A?|j(1h6cCk>J?41bRD&(*$$etb@xObOS9Lg+{#*z2Xw0=X$ZQ!Q0 z)#*Z?TRJUu!7sD?U%5yjG=SXEDIsl0lKo*;q?tMZ?Z88jtjOFacr1&KAIAV5hOdCY5x*?3x6z z%MMBs>H&W*-S+-b1~2eQ~d*sQw{vcbMki*p7yY?e`5<{4` z-*H#kzwSCNG{WQYspg<>3vH>nDVpC!`H{w#K@@^nZvv30PIqP2dkL>8T?@ud3;Fey z@Wy)(U(?G0BposfoNNI&QJ|r^2ucv{Q(q;7ex)OKvhBkWEP7r$RuX_5OO{ ziHvM6WFo?}P;x_Acc1ZRssN+c7$DiWSXHhYZ(10g2%#?Qj=!u?<<-+^(tW?X{n>6< zjlNmI6;c;i6s0H_oCEuTMkG5{EbzIG4DvA>3liP2;d9gRFCb}fQSwRbt;ySuAG0PE z>OKG9O;UtOGH1T;+u8|1TVnKQ?LaOt5NleAE%0BVQ5Q?VPoPw#gK`#_{i2%82$PA6 zKaV1}tny6j$DW$DCzAA(Od54xq!}}mD#u6;s>Sqa4=(o;tAfDd=CH~nl9TOsNZmK$ z;O}_t;yzy(i?=P4;T+Ev7~$+ACY#Cx7OG1uHYf+)g(1=ufJ4J7x#WIaF1ijp{l5gN z-rZb0OpNkO`gX25bEA8kT*hI!Ipo6yEE#GX34ug*UpTs{$z|H+8IQe=>?8uN9AQfR z3mlJBoCm;qP_G<(dL3m##`ANLs zIINL=K^XHAjGZj_ll#d&+Q3MOA+l8?+3tlxWgfxkFMl|Ex9`YV((vCgz%r}PAYx*V zJe`?p%I*ZCiAw3B;8{^Qs?b%&YIb84{l9^K>f@?dz&PJ4M5&%J3xE3?wQG^-MPqOy zDV2GmB?ij?Z3!H&$ya72Nq7QidDi`gaVkEgOW7F77s0A+&_}`s$in9^E!9BnMYnqS zz8uYUfi(l-nfy!1F*4&&65b+2KFM48K@?=ghK2WH$bYUO6!(^Q)O<|W0c#W2MF0_Y z%20%p?JhXsR`?<#d3Ud3j>{8k`%K9fK&vIVTj&IWPnh7QoiH79tX1hk_Zh@zg_* zxQuSH`OubXNIMbg=2F%T_31Xo`$L;yuiAoI5-Gb_*J^q0Cv^?F5)^^q^i;;4kz4Vv zK#2(4&Ym1bz6GY};&z6}4ASjuCB40vV!BYoZmK9_7{Tq4$i>S@9p>8-*}_y5Lh*=u zc7LlgoXQZ`-79yukCotniz*#2v$QU(Xx)hqxH?;)9AS@-P8T^>W@ju4COlv5Wnu}k zKPg{|Mn3X{j8>4MWeZI05SvL=n8SyVcR#fLffo5o@!(4|`>f^8ISo-mD_nk50N ziNw5rSH561#+ti$kD9T)!9q>((i9lH)Wq|HL4n@H#exnlR|-}G+A%0)Et912JAsa? zpJiYEtS0_J1p8R(PXFXzujPC_jVw@JJzNuI{c8; zE57mInV~-I9g}z!F8wE4dbfJMy8|`ynh{)Yax$+e0-p~7j4cw}r_K&gkS~@^*scK= z#=>h2ipCYTrTx`h5V~8Ru5>HatDbo5&ntW&`;aJav8LwUDOvD=sa-$dbY2%<)G$Q^ zYq~P8g%ehb+@RqYWk{>tzb}VW@3IgtZ7a;TgikxU=6dH2nZa|}2eJFKYtK7#3uIP; zj$vRy9xC4S&3C-?9zf8Gwz!ubqX>&)l(mao(z>8+rAEPW{=3*%qordG|U zu3AD!qm7~TTm~)i0P}7xS{7oj3|u;Bty7v}uOyoeL}^o=LNN2EG*aQqg=1X|_Ti5N zle6*CY{>~8>)$rHbfP3b*kQmN`TZj59AO4Z-?rBp>{_o$=<-m7>BwIr0TzNPU)!EU zyV|q8+^AfA*QO>=wYOQEk0*bhI-*`X)4W%GrJKzr&r8u8q#x2uo*#0Mifr>QYzF{Y zA(F zWO#Hy%px89V4b%aBJsF4s?I*R7w?Y~fQP`CihHmu!YKT;&wkH%f5Z zrp_NrZo)QxBxZvj3&p$|VYvveg3;duyUxDFN#lhE3-V?_tn&J(li_tC z8G(_ICKk?vOz5+lVQ548M?c!!N0T+m`0 zduaV{vu9BfS`%x4F#kFfC{Sj@8o10972Fu6=y5^C+rIsThtaBf zj}Z~06)UAdiX#1Tn*WMcAUgc35oixChdKxg-$IiZA&Fqw1xf0ZF}vH153zgjJneZkwd%8rR+Bl~pFL{iy0d!!m;1+LN&)T9u{J=MG)XAsY@p z_QePKjvvUQW=;>z%K@aa-@4u8e^C*;-q5(iz%Ku~2XSo~&1`ClXX$VAcA29oo3_=NYHs*@5 zI^s&#;%F=+4qq?Ma1Dv_oyu!IPTocS!heFhc5AcpG#x7Zt-%y56fJV^f=TV2B1l)u zxxMus{h~_vp4NIAdC`wVcE#vduo#fXpK8ap_fhzM^k^y9e`%w#6 zfOMn{ewNKZdma^>toz`{>zG_twIifVJ4a?A41yf~NO2FeEfvsnz0*~d1WjZn7zX)K z5}J?^NC8JBd*>)-BBJxft{r>vqL$Z}OjYyvA zAi6MIq?hMx{sU8hm{OW4y zKVQh0YvBDn=~*LRW$Hx{xx6#sa6Ro z&i$1tjIKxNhb16%S|rmjJO1&vQ@Yh*##c3TPYiD6fmG$C*!lXY38h_ehUoZkad4nB zY!3H>ktNw#Y)A}rd(vw0&DMD!FYzbF_DNyqs|DkSbm+b+IsgH2l7j?3V7-L_oJXwD ze0;@N?~+AJi0ehW)hig?Lm90I0li=~wH;BFGH<(tm7y!)jY& zaR0yBxWN>BK(}woEuf_!?Q7A9UZ&c?pSo35PPEt~l}dp%5{0RClW zr5-m=6$;IHKYSzf3XHfgynQm_G6AUA z5Ba|Jq^QWFWy;Y!mE72R)P1#fze}jOxVKylfmESQ zW*q4g$C$+%NPuC=xGyTXU!6+#qatZyf~dI=i&1^LmHJRaYf}C7g$U7?#EjoSn}ex! z%<<~BB5({h{O)WYwIQ@fT~j;V2HG62V=Z<+r~V9sGY0SnPuUnwS_7TDb3l+V)&>V4 z6J65Jtu40}3amu1sSw3ED|!OT=*i7z_vAxznm?b*v^LFb%^|*jy1u^sSw3E zhPNYKhgJ3$pFGBOaT%767w!9=Dx`c7ROi@X#W(dYFXR1J9n~RCe2R>jfe0ha+cJv6 z_2BB}GGI_L_9Jr|2h|fPl?+6XexnX;OJuuG8>6w6@P5}8t}DO4Jwq{lEn=c)>rW_9 zb5pHLQmm_{sx1Y;6}N9lcmHi=xh)ZI)JpwEpcj`9G4XST@}R`%CpLF_`x3CB?A!8H ze`SE>OfI9G2nmZ6I~#<^4;4zZ;(0a#KXI{_-cwk^vMMRw1s5iiVP_x5 zp>#(~1z%He7ZFm$E>h}}PxLp}_-h+za%2dv7llM2*&N4J0rbU#A|4Gsf8 zoLgVI-bY2}UhhdKN|c-2AqvV^kPYJvZvgfBnhY`QZYh}yN6zOR{xk;TfG5ioL>Izo zo=I};4PD2F>AW-lY1bLG*X=0Wg7IxA4q!T0LTsD7+E)L9pB#pilM|dufi#07fGRc- zV++s5sWq8WmMV(8ay}9sH+R!a4Th#kce6j@OOIrXm@USV=Fd}r2E56tJp(##nQX5` ztRgTJ4jE-Fb!jQ7worg7ds-0HUuiYGLFxbxJVlEeSLi;K!~id|CgP_23dt@tXD7aNf&`UZz9qN`?+VX9wnca+_rVyL&!b zwn=Q~WMPo6NZa_FoAH~5(sps~2tMTxG!e{bDLrQ4O7R!8Z}*>IA@tL8P)KW-L{(s* zee&I~T1Cz{YV74h2I0LvPlc?&#INRF!iikzKL}$1W`qvrP{fudY#3yRmT+COg*FOU zQC<65_7l3D0u?CCE@?5M#qh-Q?C1Gtj}E%9n&xk1TsnxgG!qI&t&uht!*>T&5vAP# zSJ>?715raU5(so)H;$F73d5=J&_5}-hc4J$zKK)_f}?zo{DFk@kfzO!15qtISGqs5 zGX5^Z*S=A8&m8eeQN*ZyD1Jhp{)7$^K+@MT!3Fid2i4*9Z_H?np3kU9x=5IZt)scw zL&8dB#3K)k9j+X4KSG>d1|3G|M%GT!h@1Sc|G6P}WGR?-85n0?qt>G$NBMY|i<}%B z97Y}Y=rRuj{FPsn1ShIj6DF-l@Bp(90lR{R)!OTz&5lr`mZSIiPe6NAzc*w6t((Hj z$%o$?`>>qc;MYnM+SHh6h0mmVGS1-}D79E$cBN{=uDkWL%1QL4YyCY^zfH@7yZH1Y z42)ozqK?D9TmMKamjc5h)|Rpvj63+P?bf)2?75$0)d=7)tMCra%lZ&I5Bm6$5Wn5Q z;j0>@T_x4~73k!SqN1)Dm4J6bvPd4kZrWnE&eZwO?B4sPJ&h_rp5))&te?EIg!OlH zxR%T{p#l7;z1qQiRT;CnnJHL%-7nB7spKosX$CekjkbXWxKCtzlje)ZDl{~ytPz|$ z`BgOTCIG)4#P6`$Sx&j&NEv1jKdqN$9z75=EM_kT6iU~c{}%06*A6AL32It&--;3o z!L%0>f*wR^4ZHG8XJRhy&brHExtmaY52=6%tDFoZL~Zk`H^;=)*JE-YcP925K~YnD zMx9Ya+mkHRg^Q5JWG6HDCJC&u_l2kamd+=m#;&uK z9Ke5`##gSb%GDt`K%f93U*I2hCiADM#p#zQLdX}5obj*!j zKsWKeHJd_eS^@7~{3o_B8p6f@Q&6RcHBpVJ8{OX4?X)>FI~2Ma02|BWslNTQDXMt} zEcSlj=u!9VkUim(9?Ox<%L6fxs)1cZ9MQnBIiT}FQr=U(p#?J=$Tdw`>Kj++^Dt2C zYtaQHcK9&Em~V^Ur{`l`vh+nJ96GhJLpeEKy`(%<##OGm#A_8FdC zVyYSFjJ*-3kwWsGns1rsa0Vi!rbT`QqF9*&Am2Mk`T3I5qP+|#f2B=CNaW53mW>Ne z=#PhO;_NhEKzF&W6F=d$+yT0v1lO3=BFUFV$kAad;ESOKSO%?S6p@|8O&5rJ=UPoz z%E7(v^h_w?BeWG&K28DCySw>jk%-?=T}OHYmBfr4Idolw`brDjf_T=O4VXy+9CLxBlXTH z^qgxQ__$xXN1q3Rye+u~GE0Vu6)Na$%#6afk z(3uA?te;a5GxDz0_+#cUBr^ZeGfROU^XV|-s24rAP<{AXk7wC~Mir9J#84cH% zGsi8SL+UoNZEyr7*v7%t5q~=2V4YrXd&g8*K(qK6wK0&ofkq6toZ*`rA2%oJU*1}K*Qyea z#r1)&uA?P7Wjuh;e1YsBYM>?SEI{MHgZ<<2)>*p|P%=_XIc3|E>x^+RliOls1AwRk z=Z*~K{~pX4MiM#p0BuV|Af!@d|FmQ<(~(u55;gifnp+Nh{v)Y~5$*^IeB6{YaIPFh zCb8{`=Ku*neAg5{Td)WBpM#7VGpI*CnpQ2jjA@=Ygr`Wdp8#cK$L z-zy104wfB7bgujIp)l&ex47F2ls@Q!BT-=sc+C5i5?kDn22ciDG@PTfh}7Z)N(^R4 zG$SG~mF$Uca_cpefO zb|cV2KIDJq37WmVHsE8w!IMkb7@le{K-Au@`nFhRE(pCLJ$Rkl-J!Q5(?~ljGf#E| z{pIu3&w*dhTcf?oTA>?AI!V7Fh=fh-6K4ye5KhJdxr_}reqXVz7JdGUwPa@tjIhSzKSHa*_(n83~i{o0%bw6f$4W>~-G6T2kLoT2>R8l+4CIUE;6;tx2 z0Y+11{ek=I#mUdoJP?s~!C!Ap>m z?8ubT{^UvH4)3OD;1Tz%rlbZk#jZ{#pzMf36?0?vAzmX>V!d_)h!KY*8%6-`!GRMK z01LyDZMS_ww|{9e)K5(ZB(Z?Ooj%YxShTqTD(gWv$WTxq zJoLv;#zO}3sdk*IheBrezx%HrW*OZ)>SJ?>@@95CAQi)&n>YsZ#8S<{Sii*W(@G zSMBE!g4Uo#D>NFWNM(-DLxd4Q5v~1ulo#4U58`NwsR4JaqI1GQ|46Gy{Qz=JfApDx z|9M@DB1Kk|w^A6H^o9itg(UuX(Z)0A_FxDw!m6Nu+Y9mjyGf6?e?=q-B5vrH` zj5)}Di09{`LA{oYsQvS2#U*DK1e?kSSK@V59{vk(KOD_Y~YOoy?=pDCW zr`fI&OQNuj7W#|jwns!+Ewk~PN82N)gv$l&5)r`{`MGQNAL-xL_~DUO1orPd$COsy zEjS5xan?R(U=fyjX*G=0fl7XBPzvj^2-wD9K>n8>`R=S{QkwNVgN*CU#oR!7`s7qi zJ{uxrd}t4Glzr6;-)-zrCyCcE>@YCdOg6btQ9sp|BvvpC^#oIqS#y|DVJXh(>T)R6 zzNc1thDsT5=jW4qx$niIoSg4~Q@+#pVBM9u`y77AaN-=6i}bt> zUn9z1$(T~EgM4xBghgLH;2QKaiu7Cs|8eJ)i31{grwh&TOtYVzD_)b-qFMOQlwt)qDn`gxT;qzA%KF$9hXum0jRVps>pFNaY8i&WPeJ4u?#&1Ni7 z#vn%bfGY`#*=Hj8Mz2Qj$Y{CnA>fH{$wj-KVzu5icQzk|8QBa4?Qn<0Sl6%1?0&vf zJ-88`kF75^7~`@5mQIiOaN`pg#580OJPkjHlL!i~PlZ}u!zcoEwRADQZaclZTuy67 zd@1pdznRIX;A#PN$Qw(Y+n%Hp3VMlx`e|Hw59_z}1Locb82P)m9(Y2g{<0gig)frE zDV*5D)4M~8Fp||N%lcbP5RryJChOV3NJLhZpku8)U$iIi)W-ZSaWl7mG$7C{X380* zyo5W;UFhFhEx(wXE!mKd9WSd!u_?eJGz3!y=F4K1OlT7~WzSVn9bSZY?l*pS1MaSC z(>;ZSp_J?OhBtM8ER+P>SHh??J#@)kNqOSXA_{=Dx5v7NuXSy)`oXpO2+CV$9?9^E z@)4-(1quNS6z^~RhubHPh`bk?D#w8vSP$n~2$^5Aup3rf;m_JRM2iObZ$MNU09#ug zS`;@~pcp1muozE?l@IC0ma;_yrv2U$@nD}ZVo5}))au)y{6Swa zUz?35(CN*3-mxLGp)kQ9hRd0Aqgt^ZolC55UxiwusCgp8~U0O5N=8BIIN7mb`ncd6bxJ%x$J>J|et2Q`p{!xPSw`EsiucVW15*GkfOxN?GBrmCwj$pu1shKv z7I3Ctu_POsvmtyJ!k<3*3WOMyMJYHm3%v6u?rSN{woNri&@R*BoSy=$s@IS$;uCw? z7TkfDr2SI~I+S^xx}HW8y_83OSHHe)hFa4IPhoGNNzt-ApF-*8B~Z^(eG(O95R|}R zGBa}Kz{czx2`P*kX;7Oh(}_-vx~m zCkx>uGi#;)M^fskdTEl@ZxBiMi@vo$&KRicuU)Ukt)7OCN^HkGD0)lBsPQdF^?Ks{ zb>%U~1CtINnaPa+#o*BbH-aiujvzlZ5#{u)wg9a;j{NO(qV_T694HxH_TMeG_j|Fp zr*m)E%|PY#E-ylDrVq?U-bK9-*ry|o(m9z%sj9@eOt?G74P)5WTDbY$P376#npkFe zO}O#%iX5;C`%o)&%#rj~??sCY`^>G|L}^s{c-{IIBI{Z}J@>iG!%B0TV*_lka!oLW zioSHN71ID=Hu)0+A#mmViTf88q=hB`dmUFYI3b^t{`#+p_O2% zo6<2|NT9~nTkdXRZ)jCmK8?7=LA)K>Gs`LxMZ0`7KLH8$eRf60?d~|LzH3$ zgW0S~*q^15uV~b@g?-q=;K$%V+-dh?DPu^&Ef(0={xqYSU zOa8llS)$v?dT0nIx~?|b;g2^gG6x% z=SsPh1|Tf@=#yk;B!NgqvA^#W{C;X>9LOJGw>HREfO>ba`p#zrE`o1FWHUY;04{LS z?2?`Pn+!`W(hYD2*&1Sa4E&=V?iym_<_x+|kfv7P`>F`Y`*-F_JW4e91y# z3fKIAb5CNqzEmZ@Vy%lSxVpMN>B7#M88sj%N|G4d zj`L^%nXYKnbsjL$J)XX$67sBDiM^Kqn;XdX84Uxtsj)on(hoD~3#obn>F`7PGWbzP z^In3!1cYBGfCYUMSYJ-!?U6Tg6y!dOB3m!UC#@=y*?NFpT`JSsRMvJRZ~v?kOGcc_ zf=PI#t%FJyhMex1XAFbdDw&#kl-Y(_pMQy5#3%ie|XbCX-?F7dJ)4fkee6`OY87 z%b?ZJa&H(1K($TDj9bdvK8|UcUTI8%8V^oJBO|6?u${v|$IjoJMSp(zY$@WdI42Cf z>LBn3<>-w2Wb0PTI_orpbJiWf4q-D5T~_`+a(ODQCgxEn#(PrPB)+;TdIvLxi98%F z*`}Xgxs#{WJ#mG&N#v1R@g=veSZfNPyF*BO>cPoM%kGzHX>6*_?Vq+~{G@I5f{;&E z6%^Fju#R;H;j_>hE}*=c0qkEa?+An#(k@n&jTO*|8@v&{ULj;6$OA_5zxqqPJ zUH%Ffk1@L|+!K&d8Y0I2@0JYOOXjgtwU0WR_?zToUgGO*KbQ_)G8$jW&&}GpOXr z#6`UPUd zERQ1qg^BegScCPxe|4a3b(rTgI%508iyVv9kB=SfFsduDA`YgTRB%VXU<;1a&fP7v zFBBaw4@))IrMHvsZv>=35k~l@(TyDnxxI8>+@kUZO?0lL+cZcS>qpzTixdKs4h8Q~ za!j(`RTie!?#xC7EI&Wvl6dSv6Rn^euy7Q$QqBFHCIdeO-kz+_;=cCk@`%dGzszkj zsu<4EMO0Q7filc0wrR98hKuIj?O^04oAzPSv6kWQ@Xzqy_%RH5f5K;KV{S zWE%$Ughln9rVu=JTP%-#@37XaFRawai8M%?rRTq~`^!|YBV54nRjL;&WADdjEv6{& zOJ_?0gw}y4{%=Lqp(T{u$fnEo8%ci8qT``EHn!HG{@UrPB1!nZ)?ChpM_Xb);=h9 zs}s|GV(6{tOIqm2215da&%KB=Uq$Z5utEL^&1diyq|h*q#wYSVV?drx0w9uUfy6=A zsy#F;v4r;s*5VIRq*h9j{yrY&E6%Hq zw@0_F8n4b%VkR#tJWH14H}MtYe#o{&?qc8ocMWc>!;J^^u@Fe=Qk&tXXy3T6q!qL+^=}a z!1i8|Dj8@YS5TKYdaJJUs`U*DBzDksASpI2$A`#j4$&orm7?p;UI5Auqn~7ol$F4^ zcv~)QV8wWfga{{)__@7$(u2(a44s?oMl4Y8e@-COK_)nRtlf<@8N~wPbV-vk=&edY zrV>ZF&E9b@_%@6iPrB|C5Iv?4L-c25!p%m#^QcjiVi|HuXAK)~#M$c8iMuiSwsBpF zbbgSrgu!K(WLv@k5A%!trRy9>HLgpF)PMrU*ZdXlA+FJvkn)Iv@NF%bMALjg89obV z3v~+(M!a+XXf`~ME;S`sRw-cO(K5jnSCDF+qJJA$){lZiKLv;G0Gs$STJcj!^mc6G zPwzhuZ1xjle%sb`K4`}Sz>SYAI~sJFJ{qY>i?1V*o?p|J-c$j6(YdRP<*hzboVN{} zlFR>Oo!M>AtyH*%m04dH+T!q0uZxI>TBFs=mIRPI5S6)ON=l>wCSEUap%pwd9T+93 zBEZ^vaiZY!;M9YWV)(m ze`0`|ZDi7(uu{%%?(c=s29*i9$R}GspIDgN#vpKo`2ihI7HUw+x0#>ij@4AVg?$z6 zNkYI)s^~jaZt88R`}7BF5eM_S11gASCRFj$hQn?8-QfUf4x}4{G`obs0{~z$^PYo~ zEU-duZh6#ZXtYPfbGCvdG1hdZZ!{m~(+RQrPq^jdow)`!mdb3}@U)Ot-QTOb7n@IX zYVTRKzD9}h2m^}PMh1$FQJ;>k+M@Fpg}!hnr~*{S>j1P$WJPV zXa$LK88*5Ht~Ob3m!Y*Ls&@+3NL%R4bjQ|#{!wWQ)jjm+3-p+&N-2cwWqKn1o(Cnh ztp5g0ah{wg-0oi=CH>)d={fU=QA)JP6U^|;L`kBO=wjIc{gkfLC7_;Luoj~8JMuBA z@2hqkrkf6uJ&=*hV3Ga7??C0f3RT07P@o$vURJS-G^+{Wk z)xG5H&Wzyq_Iht^{KsBu??Qvd2KJf$5~i8OgZdQb*XjSFabxNj?xz|(W}u>XQnw2r`V3JFtRiA5yNTR+hIy25MLcTO`o&JMQ47D7y6 zS6E1*OA~2P>DR`Dr%{^unx0yx+oO_+QgowpcQ+!62S%5XFknKD2(SQ5rSwKV&4D}X z!Ws`}u>9@d6~8KD7X$CP}=Z`|pnGrsB zzz658#%?93Z?TzzxzH+EV^=OxDUBg`B@EV%ip-8i2UZj7cwU0glN-WTz^x4u5qx~N z&c<6iMc!eP^0uIcMANe>w69}%FQ$jWDyHcZLu*W--iwIZ+;lEqtiI89S&wiLTEzs? zJONXCKjvealm!im2HkkS(+ljz#M)|G63&Kfn^a^VYarfKxH>|)xK>nk;!qYGWlnAj zP_kmAt6s(SQW!Gg-UN_g%oH&Dcvp|{DFn=K1xf@=5-Kr8(^0$w#7Ij_CBQ~IBCCI% zDdxCxivEOoZHKn$mj%jYTXmNu(=?l+v}o>a{>~9ggGnlNW;(8DTE;yBQfN21 za^};h*1kom&mTRYc-RFDsxN{}5)tru?#klr$VwybMh(=kJR)h+uGAGIZ=>MnQ(v;b z7hl)^z}|k~RJxM*&IuQMp+-t$67C>visMb!Aa~h!urulc=q@4 z)F=9JOH3(|4OMcsdFJbiiE5TBG&Bj4%cr$=73v>r{l}C2N~!u@TIc<%l!WDxE?L8M z*qH1@B3BN~SSRu(_Y~}oKI$#bgl2nS-lX#c0=Ge4fteL!Guu5TxFLh>VWXx6jD`Hv zId3*o@@^r~g?b|QJ6uY#<1a-KEt{+L#j#q}v-J|Bd-r-%#q~V2=`5&hca>d4d)CT; zssB)xRT1Sj>Dk?qY3e*i`v{wyWP{4NfQH=#tx({C*Lu~;wjL1;CkS+7RClNQHj!>6()tP5jiEXtXnB4&ZZUSV&B?JLsXt$hDS2w-Zt zeBSorDjhKx`p`)AJUf*@112VVSxpGDp< z6MoqDiB{FBVF-^2>=s5DOazG7j?=#mSfu%|s*ycfbam_z0skd&uO}lzF;kx83;}3y%UTYkx zOSAV==#Ml14~W(XaRGpuq`QVGTx%GG*Moj?gC*tnOrQV>OdMEk!hdQ7J0mcEPx3L8 zSYdzlAzQ#)MK3^YuqIzb=k?Nz4!U7?>lAkIR9_l<@t2R-B&6zGl@%`A(dhQd_c572 z`={Sc$8pipV6Ies$#L?PM%b@7%l)`5r(M4)6H^vOv^Wg^e39WTHT2E{@E5|vc$`Nwkf8*p78@9*!eDidMeJUPY_)az1;y=UekqHvr^ zn%CZGie$8kzkoE2Yu-zN8{&rp&PT`!dNrlNMGFbJm-5J4;6JfC(m1MoA9Z9Fv9F2( zAGBGI`4nOT?&^KIY_5`{TGu?R&s$3|ag)JDAd=4(_cGJ5<+A-^Z`IuiHzb&|N3#E+e5{Rl>M=q3>B(Exrflc)h&V_BvGo_n;7w5m(ne1d~BV$!6??% z>?&q9?=9dWyC;LBS@7gTz4J;l|80ytI5Ie!Bby13F^i)X7q zoX#cb!!2%q8fz6`ALZxO(`g#NiNOXQ-l>8T#O|$`7tfSx|L3b75hKwebY2lM^&1*~ zz}4`MfL;OkqkCA}SyfHOL^24Yht~f~lKBAvgb!jr{jUg??|d`f>gv|qnX$->jd8x#4l7?&_Ccz*<^fP&fpB4PFQ!Ap z2N)>x(7(&JltfENLp+OlO$z=IiJQ-|bW-X#!KU8mv_$m1EFmr?0^?HV-Wda8{UeQZ zH^8!ndPVi2C_JcSq0*0YwmhKgN`?9skld{&e$@~6s_gooFZpmxAp`1T;(K6Shw4!J zBlgsf2%g2dFRO_&teQ8!wZPV+$KnQny7VQFGwZmeV6MbV)Yr@wNs6cE+k_m!VhvXc z4vB`V5DVp#FZ(?Si%|JDavG6_+|2@Bb$mCn3=8U?OmV>KaiC1#tLh#> z@t`co(}$9Hd#(@#=yx2s_%V{-SNviua?l2JGt4`RyW#A9Yj+*(WO! zktNY*jW{n8xrpln%3EDiUC~5sEE^o52ar|s;_wvIgBIgtOpYP;4$;faz23N zw1{HS1)uGYPUeUsQvYDF&ayQ)!_A<`GxJVhfBtl)uvx);cYnzXgdgpfA^xSxi{uBp z=msz|U6{ZWd+hi;avt$ekwzHHue$60&FKzMAiG+BhqUb^3U)5QW|s)&+Mb`nxeg;BWyH)g`Qj7GUxt!aG|u zDl2vf9G6387s4=;`kEh&Zx(C=&-i3A#*7lN#R>i6ou3fHk`^e2xnZJFNN_*-w$iB|jqk_fah*CGI>nC*rV~K4Xce2<{ z4#H?ZM`f_EU&%v)U|9Jmz!(0GcUXQ=G<6JR4Qxu`fU3eQYTSm0hijucJcPiKr)@W> zx)Sx~?yK z>`OQ;+pU27zUtvq|1pYl;^yi-iBpX7tFxjls(Rehh7r)!_t?q6(A-W?Xa}CG((!4+ zXjUeH%(8~0|9gt@ISH_5<#TKpiJ^u4RhLWs{9$!*uk1lb7WL;fAix^u4;vy6Z`SgA zPDLDIsqhYd?&>+NP;I{0b&&kCQ@0f3(Sr_S*omKa^8ucoN~ke_OXMGa6%pv6ny%PR z1$HvPVkuk^Ji08nBN23sX&H!e$_{t4ph%h7rlqZK8~5}*>F+!^1ubDS`yqw1-=HOo z)KHPlsOsw$&mStQs5$Q$K}k_w9(DydEs7VwvVB#c@m|FlCv~`{vG5Ia?TCBu2T~h* zCba1C*(_NJ zDjO)a!B;UFfpmhBo5RbN*Vdzn9JkxE zrR#IPnz_@xKe{ZL(U?Yq$8IppBn6x80EgIIZbJ=!HD{4iG`9yMX`GpE*d@Ia8zBo1+P-6tRu18*l{nW zrQogSMqGW;46LE4=;=*f^D8O9#bJJ`@DH)r0*6AV8?yy3`({7#4_pN-h8d3)L zI|Z%6iBCjLOn;$Cc_Fk%v>`j;t&1@IyrU$^40~GZPLCKrVfu5BPBq&ZYk`ymv+858 z=3V3WbDhr0oQsCz_fDVnhM7XC8>yevmKt4?im=Yx`j&7=q<(Dd&bLG2{)K#Dw3!@WALLld$Py4PK;jez6BglK8^KmQfCr z7>e|OuUThdX+y?zA+#Y*B6$Pr_^=OG;pNdroJok>`$ZPE-9tZ(8mnM$7jgPd?yR2W z?lu$HVa0dNnLPh^XDLO>qO<=#M1FXO!@mahGR+KaL;i7l&*Bp9f=F!&0aG*!G}ef- z%#*o5oLtIkXcnw2sqYAPaUb+Tauk8?Eo!bm8Uu_ zFNtxiEScNK?!$Qf6cpxH&oGUC^KRX$AGR%Jr_3<(qQp-zDus=+Jo~X%{IA$O=FKRslF0)bNJWf(%dA$Df@K zD6P&#SI&bu3Lk|fO6h!aLzEP#mr*Tk$Bhz&gvSpk^H!--beqw?$8tbe&NU3G^^Yxa zMu2^;go4E(emZI8u5#7TROeLs+-B^l(o~%8L5zlc`(K24e(s zyr>p$Uq-j?N{`9hUzN(CsWr})Aw1<#O|%c`=Z;jjPEpGXdNH_dAv+>4t4S*U^D)mg zDfiC@_ks#g_L!wIg={As$Zh!9)L+=M-P9i(Xu?#5QSVurOY~1eZu{sCdT7zdZ2y<7WzXc7GsrPClyV;7hKa{gb-Q% zB>*9TSMn=%X@AMTh|%dW>NXS3lT2m`43>UMJdP6mN`k-PbI;|iZaa@`ft z1cSmi`r@qk6=2JFZ%6lU@m zPMC24bvKYg5r~q65z7)cnJw=(Ws}=$A1dJH4oP4ll@NXQyQN>Yn%g>A82d5!Cr<9F zE%0&b4>>BYJxLOJwF$%=&kXp+(zZSBal>OUc%fXQjP{CCUt>0F&;b#W|LJnUXn-bS z?1j+Sgizzu+I2XsG_(gTH*WJ*oagdDFfJ7DZvM2mxRqtXfy;BW(@X6luP2PZaNn5w z(*E1^I26Y>p;h(%!gZtzAhdhb1pP!0XfFbsE@6d|dh= z!X5$*EjLf30=ZC-+TZg>6JJbSYZ^-yS&CSJrCgP*TmP@8C`NKf(Px?FNC7u~TG+K( zMZ}^C^M=$r-|W#;8U*+5O{))7jE?mp2e6r+b*^;Dw90ey=FLjp z2oJa942L4>S?T`$M?!( z5%L0ZsC0~g1J0+iApI)VvJlgOi?=}Qww>L(>ahynqt=E`T* zUJA2L6x{|?{V%uL+#-9OaulOBXgxBsLfRE#qc9ObwrEH1V*^y6w|UY)&XAxHH9c?( zILIZnE6S6Ud}5E}d6iT^FlnG#tNdfA?K_S~r2UFm?w#SAL0#@6O8hKPd#|P#jzlct z7Wr(COasscWWjbq;(W7cFNI^UtR}N<$V~L;JTSnIumZ30nWe(5(N~$LXBQAKEr>Ra zNr9~yVzk3lto-uFqccZ;qgt%al?-!*&L?5M!|M~J?7KCP%Ze8;H=$n_nzeeo^d1*= zeG^S%c*>o`A+k6_B6SB@0e)rsD~i@jGkp**r@)yBU54eB=@!}FzgTr=4v`x@pN z$~s`HD5~$fq&m^D)D=1}=kolG-%!e&u!+nLP1DvwNK`MVZ(NXgX8Fcj6mRqL@EaeR zcy~si_db$@G7Casph!ENif1G)$5`3hE({Rt(38d9kY&fxV-9C?^euWm(%-^xeaw>e zLmJ<7Ersu3Si|)jZI@{TaNGU!>xGaloR&e}oQigQ{q0$!aff#@xGNxi*YK1>bEb?p?p%S*t#Yl0Pp+=B;}-@&-KCh1pO)Z@VIHJkXD zO%RMhIE8#6r}8xd*+h#-4-idsOs;@szev1u$%To zvYZILCao2hec-tjLPJFqzs4#wqY5nl@@l%!>EKz&F{swJPQhpyK8kY60fFP7fsKSr zdjGl{^hQt`>-&iBpjj&6y29EF8w$Gt!!)8$mvS0#n$PflI02 ziS+Adigd-cwG9?u(|aZ>EeRX>U-fS!EAaPX9GBWP1<+Dk3AE#V6;6A*)du+4Y9|2d0H>;Tuu4Sug2%uE=}bF%g|Z#P`u59-E+6g<=cZli zUVRlIpptdFy`>=*CJM?873!#gF4Q>#!5=5yE*mWF?hc5DIXFDZGMKoH@g%(s=i{@0 z7j}9H+wtOZk87G1=J7Ps-TqnC;FZ*6-9id6gwUeJ%Y`VwtC)QWJcZqLPhi`W79j=@ zLgiI~nSFfTQGBC9aT6H~fa+TDL~2YND@0XHXz$2Sz_CUCHT%Qz^wh4KFE3^Fu)2H_ zSywHUSl;F=w}CUQE&;HMaj_h(|Mt#wo~+4%H0-rO>HqXlN&PJfQed!a`QCCA;rMsj z#*pI)DTB;iyIDXKg<)nTFW|MLDO@Ux&guPC1kab_ zXE-RSy>bidrlBnf(ZS&+Mq&}LTn8f?c4J0Os|8+U%kxR>VnS65;TJKRC&%E7JN~I+ z-y6ZK3Qn;ym(E-_T*Ti-!9DH;CV_QKwP z+SD3BD1m#d47xE%YT5r<9U^_~L;2PaIigXLB9{Hy`p&8_` z^O%%-eW$o`doWVfOMlupHHDutQB(?E_T|)j-R6w=i-|#{u#q^~vTtwpls;ijfL4z~Q-;AZpNwuc!BFkd=+&qdqrzKn?7*(K^WunJuw zPOe}z73bY@EOIpNzZTE_#FB}!-$lo1hHxDg_F+au$G6v)FNv8DvrK1QD4vq?f1HL0 zn3y{$j&`(@J;-3I2Z$!(MpOGQt4sLGL%K?A@JUFGc%FI@ALC4@Ky?Om z%&=L`BU)ZIM8i64_*BuvSY_vjM?*e+H)k#i$GwkF^OdSttCA~& zL6Vj`bSEfUDG0$F?wR`_7Y-`xf@kI}cT5>>&o$10VjqRUG?{=EX*T}bIY)ZGbEGbm z5#99)<59XVd=1xcTH*t^R2NzGXkMR0=-6nfFmS>lC`7zI9$hIjFN_eNZ@dv%FB=-X zZ7=mIGN(Aln$Y6hdS>Rg;8V{;LXwadu1}a5Tv;!IJCzF%YY%5m_IF0>)h@rl0;tZc z{wxS>N>xTUb%x@Abi!uKvSS5RSXTayPuqY;#_M=+)5uh_G$$)XV}qUNLVE<&$`)eU z-842w+$+}9Olg(#$!`x+AghCR#${%99LE#;9X}4FwJK*4u0~-`tiC38fSzls0u8(# zWh%uZYE?9aQS5S4h0l+P?&_I$Mf{yhd~c0&tjv2WxGS`AET%iCfA zE|UYB07o!2O6BirIUO=U-9o`(^<9X0sH!pa{{K*Jb~o5e$WENW+2{AJkui$CM;oj9x!8iX6`|Bqjo7EeHhspCX!>6G{B6lO?si3izuo8fHV^`L4_@oLMT zrwksMXBp~qdzXL8q7*yp|Md&Q`;T9kP}mgvbf#NO>zSItX~U)FTyq&o;M!BNcD#MC z`-a31`(SfA2E-eN8P@IEZUGi75xAA0wZ?w7isJU!;fNFMtQ-?w`A7nBeTlz|4Y8l{ zjZ#Bxv+`*c#r?J~WX20vI*A99lYO6cEI!b?hY3PmN6MDQd>~%Ts4I)Y_ydef!*n_R zt{p@RyVDhUIgG|3SS1$|FBDThA}pPba*AFbDPOiz#~u|=3IoOz0?R}ANtGzHngu86 zkm-#w>AAz6VWWJ6xWrba$zS`Lc8)zbb3g~zpDAItETeG;qCr|?R=1*;$lz(ocx;!VhQ#DU&f7& zoJm-#ugOh9#9Otu&45@Wj~D;a+ttT3CF9V|5Wd>S0oCbZFq<2G-E@4-fEbhgw4@1_ zlk`c#Dn+m&VQDRp+y=)_|LAc38^$(}K`&{6t;nmE>El`thBrQ+b%?5#OOg&S`vCtZ z5Ojx|Wn2&=9->jRA~G${)OhW37#~0)2tLJlHLyA}$fAoKUsj_&)V7vpM&d*5*vlzn z+GDSwxdArt(R!sLXUdKdlNb}XblE_RIC4?__SRy)67sq$4zrz?RJTtRlaeRbc*B4{ z?7@upz=crfLOT-xOt)h~6#%<#il;-&eyQrZr=+K@P2YM~ zq2`Q%zB>@&cVh>$v#fGVvD(u4m&+#Q-UQ%u8@RqCrRzioW`f=3+fm&sl|g*;!4meC z{G;id=Lp2Jt1{bpB8yPPaO14dl1d;Km69x1b~ENnd){Av-;snf)Fs2pPZN~SIth4YbSpzH@YH?A$g)?Jxp~*LUi!?r9+HiE*W`m`mll)$a zs8Gt7sb-VAuv~J;W)@YI#GeK};Y6<*=~UuwDnP06(v|0d$PKQEZAwTywGfp$ACfE~ zl*C1coArzP4Zm=C!yVdM%(mObddh6!WvmIMJbrbsbAin8CyXDzLGGZKxtJB_oxkW5 z{KP`}{^H^qqzYK4&Euat&pMw@x=?nLy|zyv4IKGtc0b%$OidgimO+My8bVL`&|APT z+puaKV6Ex9@fUj4?-nUz-@hh2apSoIThpTE4z|P$?s-5x6K)q48)HFI zEMt7ObJE5+y8u+Ju3X7(p-IQ(0%G9 zL(LQy9M=CX@V&pG%xsgF(*}rLf#$`qv-YGW;VJX_H|db6r3r86j2m(>O25hmK>5Ayjm?in zg$?#+F5!p(-P?E&{ooz`M7^dg*<>tEp`Q9>rS;UR9+f!ax|-ZH%kk7UDE(3Wd>>PB z&Pmx(;L-ii6xKGz{BxqGbw)J0Bs);)bwcLFD!UY_m~(gg>fmRrDpE+bk>l_tY0>f- ztd3bq7%kgj2xMM1nvUp7EiCx-dnStYSI!4jU8eEXoD_r~S z=9nZ5lZTcmM()Z(O&SJHkQh7KZ(jsIKZ)@*%LmkG^yCg5Ef^!9`{ntU-0T;d7&?kw zlQmeNk6~|XIi8NnH6~lC1sI}QyQL?qHIs!8s*n#Kh1WL&(7&#wQ|5KzgZH5(<2S8(o*COxPKWq7@QOfHQCNbOaG-A z@;jMO8i}1?N03xK7)0u$P(Bda^db(-EmZd1p4V{f5og@qzv{ID(UQiKZ=a z`(beZm1Ai;S*2#?2-@xUeJ;KlXf${nY@1o70xEQ%aS2H9)pd_BAZJsoDD^>Q!h!Xw zko`@^zGMt&@5Me9ZX8C}>^24ljKbCP*O?{(J;9{=U~#EsS_e{h{gMZjrNrfveOTuY zVnQCS-{P<71vK8?i#k!emmd*el_0b(vA<0^f>B7g9Tu!+^$v!TgZIw2E+$A*`a7?8 zrOrA)i+OPk9K|Dlna^OH=pjs%CKkpPj zQ_q!D99*a@mt`LHatv2U8NY`J=bvr12oQ(Unk5e zg8^n;6%@aeWPOyFCyTF5iAQPe8vgt%KYZr3-djAJ%t6)GqhNks7db$HSEr+;Ah0d; z8<*xFdJp`?c%Y^28^$?6Me1B;vZVqCMuBy>N~s+v$A;&@N#o4jt`S@;DhB(-dS=P! z-T1uyf>#DitJO1*dw3}s_}(qD~PCFWt(15fZ5w|X(y&s(sB41Ap%cPSq32Q8YigC z@7XmuP=Dh3mO`;E47?Rng{CC)Z&701OK_JHrw3)Km0!i;a4*Tfw^sSG$hhG2@}S2b zK`fJy-zmjHrUn&*?*@U4Ww(@+Of}Zl7^3&h_nm^i*Lm7V`8BvmW=ku`$+MLFqkqGb z%qg1lk8Urd^gsSt-SO&d+~jy$L^6Pd(w6G-43-6pnT7$uPlNHvX_tJ2etU};rxnVv z$oCrh>zL6vwyJV}L;IFP1PQJXS(gf;`j0TkPuxH!iVVVF4tHtHzH^Lvk$T00xqnHr z_yFLuJt&BFOz7iF4g^3hDJl`q#;r`f#`oQE=fPddIN^rG6=O@^B3O-6e$`?%1hY@ zn6<%>)$V?<5VQZG4>Py!jh_g9M{=FRU|=*|)7TmGpx+o9NS>!W9&?7R8ZZZIGb=8B za@%au?uE&UDGzEi8}{sTt7*Wm+N75bwWToF)~(nx!05}w0VK=N=wu%~Z`**GeF{GU z-U=%7o7~ZF{T8>Corh9AV+xD%0ygYt3Xc}g6pUv9 z8U}fvA4T>xQ)3cZw09jGJVt>-J^s=dw~P)+VB}3t2ulyYsrC?I-kIVYDVH2^gm*== zAKWFqXRQ8;Oy8xd8mZn;=O`QCEGdB$xnpclxan`lc{YV8tunCdTx30rLaUFD0A-gK ziis{ImHABRyi?lvdJ))2#cFs@QP(&bIDnNNM1mTyd}*>gZ34v!RgJ0 z@Ma$k!S89d1}=)@aEaYr9y^@_2g*2l(4l_dWxQdCuMY)kT7d4RN&BFL%7c5H99)ca zlr^vt1oR6+>QapKTb+r5W|OIm@O*XwkFMzEbOlIN9!=i5e{C4=nE=>DeCQ*zPF!9j z02Xd>Sl;dab(*#E*FAk&lB__*f!J-&dw=xCdLmp6DZVVTScl*GHjF19V})0jeK=nD zz-GTER5)YjmWJ;kevPYf+24YGpJGU6moLj^d+kY~4q+JO_)>|n(f)dMJEietjE2s2 zsDTeLS_B`|t5OB^RF1_peBwjHQ$kZ?Ag$Ok_<)x^)m=pR-@q8oW*h?RCc7z}m@nJ{ zV_J5G4@v83nEN$%G^7=6cI+~R(uph&_KgDrtWwV>)GYtqc+o60wBv-V%-j_z_bqiJ zgwxs4xYw=+NP#Hn7!dk`G5-ttf_@UNdb#VC+E9_t=dM7PIp5aHtMXv8!5F^OcA*${ z(xyRf88*_ILVF}iu7K*~_Y{r8G#_2&hH?t5C~lbz8D}zWbJ@85ky5)7ja=MIVZVs; z%#`0r|Gg3dC#c*$07rGhS7%6OXt~7t-465?=Fit-!ssXSG5X10BN#4(h;R_|<; zIC=E6Tl6IN#B}eGJ;97s8{>)Xyo%Oy?p@2+lmfO>nRVKX=R|AwUJYdMA}#_X$xbkcd&#-g z6aPDS9LW~_`NmBUTH{!{u~D|*caJX?$&T?;yp{Y#j1`LYy<(gBs0FMi&+N-5@B;XU zRY~=Qu^CgG%?9t)Jc;8`nCv3m{Y;nn*q1E#2_3>ck^56(%D!iFAB}AA|J47_e7AlJ zd%ULk&~#A3`2!okIFldQ=uHx1`~B5dtr2TE{V|0CiM+Abtu8ql+1xrn1MH5wB-)bg z?_Yb+7yQ%`FY&7KjR0lccKr8jBUKU}JsyV=TkA_o&Q7|e81s-$DdX9XFZCXI;HrBiS zh}gRx&eQCWXufYQ=g2I0jGFF&8DWe9Z=>8mCQ?Qpx|B#@on9R)KbhCiZWQ)uJ42Lc zPX14Po_239#4c9Ae&hK4733{25DXmWlmc!lcU!L5ax&kLmd-o{Q<5Gjv%uJfE84!Z#U6! zLgSmv6wg*JjNRMPQ9t-25~M9J2-wm6vNZinoHY~8WgAWFO+K4&8L5XK@sRNcUdgR= z=bqtc7q3gF?1z@xs=wX7`ELI@ex#;k0c;+3)eOtf>{W|=Gb`Qz8bY-TGd~jasGMF8 z*oy5ywE%vvnVsdifDLA5co5T<5?OqJg{K2AJ|{4xCid+eD=Z-#A zXmImb38$#VgL_<9Dm1(^%)MxDi6P#HE=>(0`>J-M^T8wxf=N9z<&Qs!j*h_nbS-d0 znMSN$0J`xijEFlPgG5{d=`alBWW(M0cVcv;Vv(tE7p!rfs#c%}PdMDXeP~+y?6Whx zMzo+W=iwD+gS`A1MDI)$PupYtAjqUhxm~T~c;;R}@HXj^PmzkJ7uTUAsmUr@_fKM( z?L7fXLY=Pb!M78*1aUN2Ye55QmZSZSrX-Canc0;@FJ`4DwPDX}YCyur7}Qmb#+N)l z(%g5$p?(2=TPS{?rxqxIwTqNG`D`OTqSe%iE`ilXr>;e?RGx z0E=<=AQe+_aY8k`Noay|$@I@kKSC!6ONrp~3$aZc7#i=s&R_1o2aYc=O;pWOM=-zL zawqJW5La-#SXq+MMLyRDR(2epp^Pp{bFePAl?F_UIOs;jy77%^*If*1023umkWpd zCQLRSbr4lF3`t~@rDa}3x-C5fMrzF@$BOs#YkDYSo7c4NGS!`R`?&epO8T8Y*_s|l zLZbp^F`(99p;7F zn%vXlFs@IF(l-=v|AEd4W}-EWX~_zZR`q z(9kTHpYoY6bb#llgh%#qhx6JL>vB^JRtdW#)y}y-l9@##4@MyM^rfQWt5Q9jNQ>HA zmyy2r*lNbI5arkyEITr2qwoUfu;WRWn2hZ>pwBhc0jp`re1im!KuC9=;dzf3QI*P3 z-I67hGjg@#mIxVESRF7H1gAO6{quwWcnw`5vaw0bVc~miM?%=@=-LF}x(BUBN|XMx zAX5lJPcJ7Zv56z-}57eDSz<*h!w9UhF758{EI=R8K=t^ ztLy`Y0;H}Zj+)$Z<%dC3Nl(gcDeiNtYl(ZW=fd~p@la6!#@619IjF*AZD z=C9m!lgME>Wnwd!HdOhF?3bmc6reP7pWp;h1+~r#X>l?||T}vb^ zNao^i9?%&ci431t3VM7hrYA?+NRgi)d<-L`Gpwr#uLwr$(CZQHhO+qOM7zM0v~ zcK$(SElx#boqSRc1cf~AZo9!U9hkzO|G5A04YBAsgMVvU0 z$Q<$w#HHDno`Li}d>k+ix~hjG`;)Va$av~g005uRQX=c_Z7XA(^fEoOUscx&u{a}c z-dxo11y8nG& zEa|zET&oSwlOBqKNP-ZM)=ro}J?z=d=IZ;mGmHoc=wM6~1O~t3*t}o+eNxl{ubf4n zZ*9t)_NOZ|qa{l@u37It;R`l9F>@a>Fwv{_)5v*@CcFvJlS8;M%z+OT(_Z*6E|#L& z>aKWQSPidSonW0jXqZO&zC0)y=|cLWt7QR9zBBMnkxUmPJ!acr91dZvIu@5TIecq! zf@9%K1T|ozU9;9fQA~T69v&NZgSK%F5i_1w3dYQ>um5iFf1&Pg7>r<&KNmPdkN{N3 z8-ts~FA2+qoFJJ<=Cj|bRa!{6Oq_UsuB?P$I95(!6ua(9a^9@^Y$@EgvTI^jDKc7f>_r=nbav6bLK%|ZVO*&>KDk{rcu z)j9Y^AO9d*h)0yq^sJ@`*>Rn&DACvyUto=C%4ugmJ!;?OqXA0ozDw4(hCF}3Y838i zWogk9e?F}4mngp}<^I7=v_V-f6x>n=_8>nBOlj$g>OLM<=1*>fR-j$zWUC^YTs|<4 zkHTAT?9tTT0yr+5m5gu_0HU5q*tN)&?zkt1V<2$+NWxeg8s;z{&(fEWdb#r|v6+uZZbr!I01jyvK zbp@ds(NZ`eRgF&xx21_Z5^zc@%V?Q`6J%IT{*i$G;$J9wZI~B5;CS!1q4}>B7CI}l zru$mE66*ijM|pxnW78mkRH%x|7T$=erE3-T!qu}QVRmw2`Z{31KyWhUXGVmZItLoP z)pT6Q83&oi-pC}{A|p|u$lD{)A-_+s3sfqoV)Y0T{d~lc_ne|W zYza*w<7nOY16bF2=Vv=752QP!#L}&t;V5yaTWdmYm2s8vEg=bNZkCLa79UO&A9SM51od`(yp)L-;)4THk2M z&-)qig6gwktEL&7THEO@RF9v{*}JUA%D~w3YImr+eV=G{`e#m)j|9EwlUVJPEGHT9 zV#7(uVuPOkTB9NV&bJ=c40~fHi$~daW#nA$u+kNV?1&QIGq&bzIbYf&(hHa_3Pb-p zo{NTVp4e+u6jCT%R0gBilSG*7tz)W8AM;(wDqc5p)ui?-$yxkVvz2*=hl5Fo8Ow%_ zXYjq?{eWecok{oJ2;)N086gzK8`-%`91e z5>tm}8(DmJPa0rl^8dOe6hN$62O34veqCoEBOSalhP_<{OA?s}@c$e+dZpJ^s2RMs z%mRQ)qwIc=`Y*9lx)Vjc2l^sFC)A{GQMdZV*?(*hNympo;eT=+Je>h(B0yaj z@o;pgQlOuv@LkW2ef(f+%Iby;W6<^-?l)NxRYSZAh+ghFsaW0qYk zQ3PZIzdWnSk_~xc;U@9>jESKkQvUd}$ASyW^G^V=MLvc?^K01X+9Qw7w5N>gmj@Uh zfiY5N0<2uvn;px(-#t!FZoq-(u#+@BnkoX&Sq$ArioaNUH;?fbhMQyYp~AQfo~CXp zmZ;>L-(wrwoakQ9`kxbN^P%Z#bdX#`O8InI&%5*uft&vo7gww>0tN5UIqvqIB;>3M z4UWD12_3$y#vsGJJ1vPI-HuVdgEz!K=*+mlddXg(-`TzY|Nbs}ycQ9*jgtb2Yg-cC zRy@^nGM4teq4yB6!>Tt%4d8kBZ&9Ua<;A~bxbyG;n=z@vK`H|bDLbHmSaUwjhUwr+ zmVR3S(FZ5JUf=~v3D5Tw*6UgRfU%Qmumcr(%L%yUZT(LeylA|H8v%?So(Pq-ka*h) z>1_b@H|>^$5#0=H%bW4M1(HE9x>Ef?F0t}!;c+t`ew{?1JnIJ_E%ANR`bT4Csxa@l z*ZIShG(@&LkR<`(cS-^bLKy_RLO{kjbc2V5Q(foFt^>xR7e5g~6DoQ)21MM7o79cn z%_;4>KYZ#D0vkTN6pnR4M|4b+(5%*D;Gr6=Mh|q>2F?w{+qPM7H+T|-tK>kxr4_}| z1V|SU?@_LgrI+cU#CCE(t8i3W$@s1SwvCDxgMm@RwuQ>bU{8oFEwbbG<47-rlq2v} zv#`G67A7o{tvS=r>{fThNZ9MjB2UMHCkIXJU4-C{KiJ8MFR3U|B)R5Fp~rD?`el0k z`dJLp>VR%8qCHVf>=DV!pianJ!eD74A^L@BHA`og9L6^3#XyK~_gKW0(R@{qwvhW? zf>)-e67s|y0FiW5fnNR1M^b$NDfy(-sHS4qf3(_KW`1vvilF?IVJqyId1jX?9sr3c z@(gRQ5VqA)2O}qgfihD*5ku+)zz8c#;D4@BjPMwe0>n>dbO3NDR-wl@2hc*YR# z@X77vM3i&VWr#<@Q{2`5rbsS-y23aHWY$v1zN9*&Dg7Tis`PAsTjuMj3!c)&vVs>5 z2mac)ulR)48LdGOYTQ>RK>`g>`sYknz8E__3X1gW*a_Nmw!W5e^Cem}Ghd(t-S4T} zFHkMJuY);(xmSJUB;02(?oF0SJ7<*7SNnRym?8MkIo5L}XUDl%DXdos9h^oBB1e?ii{+lFAh!bV; znCTN*usX~4^hv1hdlsVd8%uqlm!)*7rm zcY^k3%S7aSV1DQqnHNvXtqOs6zYap9HLQ-LPM%s;)~BIj+%JWaP0$BsbSBIJIs)ju zkaGxoplUWM^GK?+|*aEEP3?HTp0NJJRcJ6WKP^NFXn+z1?0<sx3x~V)r9T8qDYA7jXmG@dER3vDQNwY~5{$ zdnElELh>W*3kO~>+TVY0`e7}ZLRnyTL{Ew%D~4V)OLOnAM@K)x_OtUT-=YCEk(Tr{KZ=_wbh{r;?p9o5xTY3__%e#Y1>eT;%#o5(AN_hF$}4KPbkK|jtq1O zn^2Z}EVc0}K9%t4j9zS~zJmhso#HfVq2svoNH+%`9s)&-r`87M>lnUMCCge2e8!UJ z!XbgF{XWZ7)yDyr1=X$~UQ(g8>dY*s%FbCpY%rpa#Ci45cq8t4qnu-c5J}r&vTDAy zJ{OZwUnl>P@8MLOD(J?%>br9kINXSTJ*yc@%{@=Lp(-CY-G5Lw(rsR@YcDGO0Ql8%Qhz1;5AQF#F)`OpjA|sAtUPI>y+)F{=d?{cDI82T%^`z<@xG= znE~l@V~7>VOI2xC#q^uUk}xLXlqe5+z3cIm23a}C1k@q(Q$%p(Sn;*bZE8-#Lx=7c z_~gDQ|Dg*bRA>c@Zi$qwb{2cB4P?Yn7ouw<1B!8M&34WOWh6k2%qmFSniLvYIi03N z41Flw+FQYJ&wFXs2?vqU_6nrabhS-g3%5ZA73a>}d>1%S0nS87P zzLo$7xbZSr5)On6u?=-(;fJ(2XWj)O7xuD1*A1NXX`U)SwN^`Ojph>8~05VUH>lp3@i^?euifT#d$h3Xv$r_J(6XH1F4_U|6F_E zTtZoH(t1J6kw_*7_8W;P?N9}0qmNH8+giYJ>t;(1 zMtC_EPf!PTHZi~ER{?41kld%|T{wQq*4&IT&qCOF8RBeFTVDH0w7q{BHS4~H3H|Ek zt#J*0HK&xBX|^bz5Tt=%3aQqS;zu=B*16jN-pS2Z_M z-%tLFXQFqeQH#Wd-XwaMDsO~fV&CHsK;A}Ukc-2vWI(>^IQP4jPQ^^bXc(683j#S= zbw`LroE-5KSpycH`N?m4YWMm~>6sk1$U#ud{dxC?_L)J^DxI{U)h zT{Q!C5ujIW6AZi7Y@PCJbiO3TD6X|Ny=t9<2xNjfnyl)4Ep$_%~po zQOV)CCH#l&|5F!lQ=rEvSs(7BmYj8?w-jN*b@BjR-ni#giaY?O|-|PQ1ukG2g@9{_L zrM3szWZQgz_r+ScaF;@2O80rJfFFgLW_8mVNz?-_aoD6qa@NgkH%EZa&&SX^Z@?wN z=4|3(pE4w!JWThti-Wg?FOA&c?Dn<}^e!yW6a{<*B+>Q&wHuUhnZ| z>wY8Nk7tr!6J2zOn)ecZ*+}&<*lv2#ywSCjPpP2)L|12KOO?slYS>Z^QI1Qu zL_0~P&&@upZ?wsTt5~ypM#TiLV{drnnX(%_TZMi56(IX|kSd02FuC=M;OT9`LwFl3 zF;lfQNHp<#pv3vly$ryQNL;v2Y#b{Z7J-n`$OGZ5HhM3gIKHei&}~{)ZJ7Q`%Jjcn z_;f&(5xdE@8En1%^hE%is>I-DQCNA<$(>dkPS%C?*}lzPO0m+kt|=S*oKn)Z*}s$J zH68cbo>`?u+*Gq;g9U|msUNO|X=HT5xh~Oo2xw~re6(refkhS8wZnODFC&-5F~h+O z?)Nj@1$AXas+)4!>-fbsXhTHVNut6)P=h+~=&M=mV>FbsxWZWM;Cs&i7p<>`63g7n zp24xgBT38WjV%)GxDw5@S9KquMdZe53st>W%0eXpEy5yC11}{-{RAE5CpKR*nlx!` z_jC*$I|POu&2KP>Cfpkx&u*e`hYBDySP$SSb*jr7V{l(i)zb-kk4S2bkZU5CEg<&- z7eTI-8!wr>0JY6EmWxAlEI_%hO6c~#zx6aN3IF`KrZtvRw5>jn{aSThKIw*&LxXk0 zfk2J=RCq=!<~wAxZ?7!hs;uN0`Kbk2VK}XYl?>mYkWNwT#QG-n@i)@`vO@k12It9e zW-=^fxh+_pVD|dZBO5bOpB*3*L0sLI{L{0Q5@VbZm*q?iox$9+AhL}-ow6s#lK)4L+tCw%UQ-c+6mRT$ zuS&KR-q0H?vw{>gu+nYoPz$FQf*}S}I!2e%NB> zBq#vev0fM_hODyZfhejf^*~U~XVPYqdx6xP@a;f3I1wYK9^l0JQMw{fM{47A3gX|I zTmDG^ZM-KqF}JnflA^lmA5TjAbv(vO8)hE%Z29+tX~_|etuc{7#qy{`?PIv0+{ibz zNFfGya|<(Ap3U&M#(BtVEM--?wtI)DH64ednJTv3Z@;>XFrVW-MKQR;2AP@k^Pme} z!JYiveG)4Ip2&08#jkb|)y~^?Vb+T2;pabBFYJdlln_wag1EPtX4!s>0wbQ8hEHsc zdW~#cam~<@An*JdRR^w%k{pF+P74<=F`zMZwy6u?DWuh?YOH{p-U|tsOb~TVM6Js* zaR`E}1_+WahvGNLkJt52V}7=`mIh;aUn6eoZna0u4RsXmE23CAM1oB|YUS`^l>&*6^UjFj8E^d4o)v=5X& z3Expz*QHVH6Z{-$P=!Asw5)u2ON$-;!s&3N1=;e)uA7k|9@H0L6?G;X{m!(tBp7(R z=H=OTOk)>f0S)xKEdZKN)e*#<$?T4;PNVGCR1%^92i6DInFyC0_(IBqw5 z(wI7L??N5cmCgKECnJmtK=U%Km6jHn$Bo{lh0Gj&mNTjgQ7Ojt-DU>WG|R$f*dI!@ zMTg8%WY027gYb8IjwhvE3?c-f$Qtg^0m; z7feGEA{S+%gk*f8^&)A5M|4($P|8r7<7PbqDC1C&y<>C& z9;EeiI!#I78~;?YTm7*w*pfpl((~E6fDiTSDHjmfq@1@I!S+C?m0x=$9Y~3=6Ew< zb(k!HrVNI_jg$d@H2$O2(uF_NA@NF2YKO0>@lZqA>kL}xwGn1w9Py^rWa2*6r zdfGf+D^{H3r_)Yk$3dyFy%y%v4RzL6)_xWPfK<*=S}*IIHexkhuYM_d_BqZ^xa<-62X#bs;FJ3wN~@YmzoZ|5mb_`lks^pl0fg7?Mgiy&VKDD<8_`MCL zTZ**lWJ6@6ozI04e*cVDstT0_d7t}re|~}nh^^#_w%aZBj?oF@?U%RgL#!^^uk9_% zoprPfl=iMN>3H|UcSykfz6#HfNTAcvC83*?Ap5K}^qo*hft`Obj>DV69S?|W5_EKq7OqWS2^m%FMo=j{c1d9ET4tQ=V$mtKTBG&GEk`T0fUX)^VozdvMY!A}K zRcX2R3qOT+J`Qz>>QlcZ?_slu!)v!OyZ9kU;{@XDb>pzrGfVDQ`xJ0-h*`;8${j{~ zPTW;;4-S~Aiy;h!LAIn6!yEOlYi3$}d*m0jp_^{ZgO5lcToU{Ouenip7G3qH%JIks zhtKMF&e&?}G*&}Hv{ptRi?-#pWo0uhJ%bWt?4mcw;C{V=t0$7)IVbEa9R3)~gE+H| zF6)Jgb6>D~_HC!wRTSN3P#ppbQC4H4+^{&RYsg{rW~f8z(Ua$LfYQ``6|dR{QBPtj zQ|l3lWfXxrzb)tpMLEXL4XsDHB@qJsUSK7lr#FkJpK|%mKr-^|+!*&(a4!7-cz?;4b zyIG*KJzEpc-UV}GC=!ZBzizcjW*uW^S4N?2DE;O;>}0!t&}&_A6=v92OSA?q+Z9TxPI%#E$MxFR`U~@q6(L99=atZ+~>Vt`#JP& z(jrAFx&aJjXjb(i8^Y?sZO!M0TOv%&8rBhwchuwE)mdmQnR|K?d-6`_u5%&>;s(dg z$QkpkNiN@-keec==#tWx{vTyw=wdptfo$rDr%=N4sNiuM*H+fVM`d6C(>9quez!P6 z19=5ci4iIPE2hd2gVZR^XS69`I<*#+XIjA^*bH@bStqcI&{qN`H8_hH;0JElc};$T zDGwCo1QQFb+;k@p+(p@J7z{RD;;UCVm#RjdA|gwApmP3}iH0tO0~itfzfQ(T1LnkM zmAy=I|Gv5bCy~!+5aQheGIgz-y)7=1#^jnYmEWtVY^qbBX6M~Z>?F{m=U%?3@<7}c zd#YtmZZfsC(QvNS5pY~A@(4;lE(FhpvReb>@?7K?rU*%f1Nkut{}kd`-@3^>x#=cM~QZT-871j|)^VAg9HV|I!=6*}xry!jgW zm7E|DNcjTQ#JOi(4-Y{dKeW--ivVV^qcJfj^r%1*=Q#)D;Z|!tsW{qTe=vb^Q1c+xNEQa6y8fNI ze}39rly%&XHb8U+85H#uxb!YiCyfOe8#Hcn;m$EmT0mu^1(dv1lW%I9(Mv6>HMx9J z4|SQT2S-C>BR2mGV_0*4k~zhGL6ZZBd|Q$og{LYTLwYyT2MUSq6rb|S-Vf*c_T@;Q z{$$(^w6~%G0L_MbymBa)ui6FA*fAy$WV{MNpS2dAzu3IOVuH0EvY7$H!UiR~YUrf( zJZb12I?s~2>HdEI!`VK@Wi5*6LS%0M*I=0onCfFeMM)%Tire4G+El)V>%T!Bco7Ay zi$#V~-@W$l%1}Llok@g+L98o+R=;n#UE5^ZS3lzZO?L%B{Zhek+_#AmTy2g?$^qFs zb(A0u!l@g5H={unk$vT?N6@90rCp9W_#WEC%~{w=8J}NG939-8PsAmV*>9kH{#Eo) zo^4=b(EL=G0cMLUR&wQG`F}%-k*dZKTl@-ZJ$4Ei^H>@s=R>^0S2;*J)YJk0OJCCqPRZK;7wUo|>+iB{FYhYY)IR!$v^imR zGC$_A0M-un2M9kI=baWkXm;Vs-)jA{ksH8I9@nrlz67k&Lp#nUub%N~!F%#oc$SQ z^{gA+r2f864v5XW>}xu}RRn^moQp+LXa@LgvG?;7a`t1(>mC5@NsjcA`yu`2;m#5? z`i3G!O_Tg~79k=A+KcV1mo)RuR?Sy`b@b6o(V#p)^yHE+iAiLkPHFXjrOL9+$~HmIcJw%+so!5H@^c|J~3_U|}!a1k)xp3-M zY$%b=e=j_|PcRp*(aqdlrNwDa-VVq2?(1;WgVQ_Smsy^b5rhL_ZW_B3;F+!ATtc|C z@NEuyTl6+@J-yY?e*1|nl8AC9GT*@&`}=1tOnU~A3T;@36Ti&%fta(+;J6z<_uwc? z%{Qsl&8b{|RD9II49|P}Czy^?7w2ik5_4$UQnYY07LL|?YhYbV0KtOub+-R&v(gT3q zX$FajmuVq&Lo{tgY&oq_dbM$ID|VyON{b_q7vt2>k*$t1t43WaeDwD0$guv?^ACJ6 z$CoWapTW+RcA|K(WqCdIC0n{9_Ha%M_%!zj5ZxYg%%I!(ykCI3?hiA}Gy;DWXCy?@ zfW~U{JfK`d7nXbO*IuK8XEX`!GowLS=s^z^a|gEx6&zJ7i*I&9KOak+|6@`=^E9rvr zw<9&wHU5oEJ%5hHKoh?3>#2fPk~X;=b-7x1RRM9kzHk$}25I&A@anZ8I}E8XPXSD> zUmYDku3KZwE2Ca}Z63jG`@;v59TT;h z6mh8O`G}R~&jmik9LOd9Q6{^d?8(>ALv{dx+coIV`Jq_H(HHTelP}(#BQQBwpMt} zUA@aM*-X~|!jeplZOz4>24l6-#Z=R-y@)R>Wkbh)5J`!xB`yuED&5$EE)pNp1p&PC zQW9n!ae#8E=HHd@gdAV#94HG?bIFETp5needNUBSav66I9qf0nqg`{u1>_NkDqgT7 z8efEic|iS#P_3|_ANb?SVu!qmzj$P1AYON5X=mpql%smIt^AKiEbQIOKMbvv_=0>7 zB7+-7%9wUKT}Vj=rnEtC5tGWOFLOkBp}_%Z9KlQE3N3l4%ET}^S~KBU-$~h|4X$(8W_`h2H#BkEBurTb{Cy{@sU!%FUN|=J$j!e z|L81kBG!8$fpl#3;agWzX#%OSGuprcqaKf5#t-fS-cipqyw^(+_XsS-u`zWgx6P?C zom@@#L75WYm^O%$^wV?Fs>u3UMwPiZIJHp?W08dpKZ^9XUP6Erg0agi3sjY)_ZRr9 zKE&RejH9EjSJ2D#P(yyo7}w<#>{~2@^~eWe^{k2`PhXMWoJjtvvRPsRDGd~DGVfC;c{BywF&G}>J;k^Gh>Ekg_tSs^v=wzQ2YKTu%ufkwA(6o1m6 z6hp8i)zir6!3(x6?wFJ4_P6_(y7RE78Sr*>K;03NlN1^XYi$UC47? zftey2YxF85Q!dwFK4#>XK<&Y(iD(%uWPlCCb?{H%n_#?dS*GlFii3GT>AP)-tfFOw z3z_4q^d`dr!7rZ8Gh?jT1&}gpQF*K^**Q zNV2?G;*<3Z?c?`AO_T=+4&tqQILCd1rgPOR_C17o_o(p=aO9!h@rO(B4V>~|PR?9r z$y^b>dfV4lbvQ_A!+ytzt&=OMTE?bQ(rYQ=;?}Mk+EKGm3cv@lo#ojsY@)z9J2^?HfjZ3H<)ghAvOgXEAF47xe}cM*RtAviCU4t$pVv zZFy$a5Jr}azr)oOb&=^TM(2odUlIWH@gLz?VD`U4!P%HmA2NHW=)8bI4Zlqb;$g$k z_O}^60H>lU_>HDpR#i%Z>euZ96^`l!D$ZATL_Uh^^@dwwqbFqZqlK-H)#?mkbMtRh zO}qX{SX9~w@rn$Nt+Vb{(*&o8(s$ctj2GbO`tR+Z1B9)M^7qfUfk_l7ooptr#Vr{jCP4;KVt@c~3^J$Apve7e=m zhJTAc#vDT{0cKI7Pr>lOUF`9Tt8#8Z@Tx{NWo(YwUZG!(xv^FT_$420QL%|HHQtZ6 zfX0~W`A)`=A%y-w=@?xPZ?-PQR)?0(lafx8{E37=%|M`}vlaSx4S8LPEp{1Y0VA>y zhb*2BnZ9$Gsl)g*DM3a1mmZQomU>dsG3I3Kj5dFC)blP5G>!sIV`Ea@7j#QFM64D7 zpVG6b@TX4vXf3H(_!b3T4DvDmB64w2#W-yXIquZxSP;thIV3+C%bUx#Jw4@Idpl@|L*g2IZ(x=1PjLU`LDHtp z!iQ;2e@%^8y>Wro=Xw7OM$!i>`-^^&EYV3hpS`S=3h2~fE}-9?Sp%;rJTYWQJb;aO z31K-(A2>}BOCCM(#YN7w*upUph>+4Hv68RKlR9Vp>p~tWa-^d~_n&iJ=_k&~wW(>4+Ok)QNyK}l! zlBw1^1GyV8m^tnRL5Ocz+^1FxxzIfZ7OT$UXfCTkw2CD^z`6Lke}Owg?s3F@eT^^F z)IC&44l-N+y(eY`_T{1%fjSPlfHn_1*?u6a=TE1__E*QY;3^{+|BO;MrfTZVmp#NX zbvI#onPU4u*#c2j?oV_k?RM1s1CX*C!;sJhx+s?Y9;c&Ce!=ivea7 zpxs+Z0sI2ZYA1~__tqP2a>`ve`&sIW4BBt;j0GIm1B@9WTjV>5`4Yaf`z>TF8n82V zt;7a*WY7G$8Xi*g!NAy2s&?At1#!7M~Awa{;o>+~LBla3~7 zZ{6js?9`G~1_^fIgv7EW6ZuPrjS)4{Hs(QKh5p0|$Uw!k+)KM6uN{Z&FU9zJ+2)YjJdjWEbT<3A zyGNj&3f_G`iyD=;i4))~!^{2&oZ=nQXf9%v-fyIn!^lRNk6u|h_U{}>+NZ?IdiE{v z6l3C45a?+ZgEBN`;FM-q5uQcipIpsMWeJjR;F>|%d-6HgV68mkZH(MVbo z#nyv?bz1E9e6|4$U2>P08=x$9&xrL+k&LvwRX?fs4|3`fY`VE%tK4pztmBQyY;)Ef9^lv(o{gtYv{c$LKOaI70txM$m`x~-clh7)p6|8 z17P|7*EBNAv6QD8l)&U`b&><69!>~5^3Eqa-o+#$wzQVCFYx5FL`FC_y0t_eo zWOS76<+vgb&He~;#$M*}k-~nGl?R6a&>kJ`Ca__6LDNsu5V$=0g&6hJcTrj9gx2iQC*{NGX@`3qFEDyA? zQ0=9FU*-JVzU(f79n0~vF!J#wKF@H4J_N;49Qb|!U>96B&3Y4lc>4HVCO@K1NZCy6 zIo{zbhZ58SPIxxUAA*6-3RFcM#@2sA@sQt`x``h_Iva_)4!Ucpv{2Pq7wot?qoL|u zL0}d!o7>i;pV|DW`iE(w6<0Ix*##mRWKqjp#8R*L%?4Wb^Gw6gqLX-avn!!cIu$MORZ*S)z*rWa`hW%SQRFe)FI;Pz`n5bt#W81ng zecy#gDTK<1z%CQ{6qOlw76}13xmA7Cf=KYYXX@00d1BkJk{zq3R*m8Uv#0w+H*Y`jzj`s$2{Q5d>XzB6>5j;%5CZ#<8=wzMWZY_f4t4M& z-wtHAJ!0tBc|CsM&=6upy%j5%b{yymuL3JZapQN`%9TrJX^Y_IMJ@+8yW{3B{Qi** z=b9ICO$p@RCL@N_VD zS2z>0e1!U6vS~2htt(y|%Oz<@vnrFl;#?1D-w*>Dn9<32`0cy@cLFGJ9m3SrzVME| zJ0!_p`WRDDw*O$IF9hybaAfz5(i>urv{V=1s6?l2jqSZUFWO`9-fc<=jVEPi9=n)a zv)=ZI7OH>5zxO@_gR`L6&&{}{r((zF2~_Vo9YC*D3v@B=8c-o)15Yx>fwG%X^Y8fj zq6UX4R^exr7IviGQ~;oLC}nhlLc(ES9drBa>bXEu;2Tr+MTrybNVTar`3igTg&Qx* zNT;of3VVi~uLSGJ!w;|vb-Hr~oB)276TseOT;fgNYLBRE&km2LhMI~|XZXMO% zk12`VZFsKPBizJGqH-bDSOz4RJY5hUA5|VI5BDZdRlH01d}$cB|M5wiK;r$MNHo55 znhs0Y?o33|zv>;zG=;D^iF)q6tz*zx2=yI8Sx|9uDgQh^G&@(ZrFeS@zfUt-I3WFIzeBYhUfCnH@6N?gAeJ0 zS262}48>TN&hA=nA;m zuFB3%@Qqj0w_O5$EI%|JtDN$P-Nkyp9)1pOwKTzH8Py3G+|ncnRgbt8cs8q)=ID6i z77k&CBZ0bjbu0ljxm?}y*xo>pvHSPDS?@%!hpGBvd4d`RwgwUSo#1Xps5j<-enHq8 z7kE}O8w&08oDBtQVzzgU^GGa1g8h&_C+R4chf_B6hV@Z-tdhul9tZn>44+BHv6ejLNIOC`i8JP_VvJ-g z?E%VX_cZh;|NIp6W`y3~j~nP8QH$hFa$NXu{tIq3oe&U|4~)Gx1osL-Hw%R-2`u7#0q8tLt0x5bZzr$WZ6kK`^+>n9RM3~B}gf2ZQSZi31LgMeWuZO z`N#|VAbrI;snPfl)MmS_#&l8fAN&ni*&lMHcLJ8 z^%&raj-DOKC8g?4zjL?t3iAJUPXz)N%pM1H%N-~)4NSK1jU_b`>5`jAY{Ixk=R8Ps zUU2fEk@>x1_47JerpgR&QtN%B7+2yn84QD~2uTF|D+)HXDp4B7ktH6+nM9JTk5+{` zJdX7mJuGco^SC5JQIHID!`mu?qyvN5&&lFyaJ;A9*&a^*WoztVp|(u|7ek0GRfy=o zOoLeUaz1M{S(Bl6CX6~eu&{|n{DE!!nM7G`56*uGmd2Z|H9c854UG`ER3fTn<>TIF zh@ei}Sguu(;D@%G>yJ0i=~@Qg#6J*|ctonN`4PwpPZh+hY9-B+CPM)l3$7kK!-W>r zEmdW$c5#;CcNKgBj=%En1GEiBaipebJSdmb^%@fm!>eO5`1F1Y6x>AF%4w$(Zmg+u z699#wDU@vcjmdxT($@&qWmHm{b+&UIJ5ANQTgk$vFV{mz?~Lotrmjj7Z9@~g$YuLu zWKdu&bxlmZe`YfqTE-$!e(M8PL>~nq7>|iyLBcVlbygx;X8f+wQk|xWF%=9GnE!is zB1isaSdFNo-?lRj@TaE0gfI0U%WH`cTeDdYRM=$j^&~I(W4T1*DcM`gv_B6jFyV z1ybg}=4An3$~qx8-+U`A(=B8eS4r}vr)C7{MbFvbeBWzzC~cL>+?SKvYrJ5fO##yY z1%vDBfiSUbnQK@k;AwuOfx~KO4a;kSVVq3$g z^t@_1p!UIUIN-*Fve!Z-u2zJM;Jj=?g_4mr?x8Dm~W$Nb7i2T19=WeW5h z-M^99$t^fCO?+}4d6i%fYH{9?k+o{gYRnh|CwLGwH*V}lIO8J`<13-Z33(3xEknMO ze^LzIsvjqlH5{#=ZQC)SR&N1IAFXsOC*IFT z;^sL>`7va@jYN3PRCUsv)ia*r>mF54E>J=mxg|t`HSvffI?dI;AnL!g_Sd5VDSH5rPl-jrI4hw7!`Qzw zqOZd=1ON3owwU`kAyaNmLkd7+jQa1YiAV}@u%b=OozrX3ZeAMLSQ;2gqENjCs`J~l zGcR7y`-0!%MW6eYslpdO2m7fl=eu7jHZcx41@)!A411+YD#R6asn84VwVD)RsbrXz z;<-8~EK8_|h8SSfWX2x5FCxM|-4{kMcyeZ7Mj;CK?mVAAXSMS@a9*|0K;BOer@K)~ zr>Nmt{r8;{BtZ{R28#f5ojA|S5iY(HgLV#~9cvN9!;yLZN45d-bvaAJxS_Fm`%xiK z2O;|Vs9lq>8UG%@Z6T;qTpgZAU%V@nuKXk+UUzn0 zOR$}8`V_8=-}nKKdeRY613K{FM3n`>_ETyF=1eNGVR&!UE&h>!%#Ycym`{Gw!hq); zbp+YQa{8r8fij1as}6+LIg zMRXvzZJ&gUtlJ6_(%OdfD)#u;=F2RjsLwP}=(bsBA{hW);9%?s=|x3Ji4^+xFvy@VQ^Kh~a&BgcRV6 zL@OYiv0THj!nO;^8iGxNZ8yF>_vc97lRM{v=7^If&DgY2ci~+h1BdxcjKtj^=YsW6 zSAQT1LSH)TdSu*wSW$f&d#d0g5I%=2bMxC}XbEc=9Yl*p@&Pa62tuSX+-cgss-}iv zVQWn-Ue8xWK2Rf1tgl-5uu7if!Oh3FX#ly8SymMlB(Aju=45*OgT{OjBWz24$6udShVp%>7;QrpP67Ey&kcpfmT|vIcKqU12a$;H zQRhiYsec3B1SK((h^rmz7*`^(^J&~P=gk0^e88tLkn2*p7{V-L2yn1evjHQ0qkTIw z64?rh3aOZx%OQ_>droC7Sd2sr(uSjTIh^Ffg0xLKlnaE)JzDOVoBmVtv+0=IQ-2b!t zz`Ptb0w#4$jKf%F7Sc_lAw{6pQ~BHY?oPVGIxv}RJBh>7-3e2M%Y?rLe#FhVU_iMl zrvYY(H@Sn%x?_F{GN|hYYpVTuZkTswqpaTO6i4EgbO50IZV4HHJ3s(8-Dw!9cN}Ra zcxS0*<3MTnUPfo-`RIeCfH{MEee6vxMca^ z#5;I90MZ?(|LYLe4rS`f7gIwU%5)Bc7-My<>E9Y3+&liN^))rQ6F(LKM;|JY-rCqVRqyPOWmP8>G+y}`A^69uLC z^QH0|4+i0G6&)qTmAEx2F;5qtGc*cqh?l>Wa|;FHj9Bsi>a5`=b<;d9>JHG|CnL_i z(Jk!1%)zwvSL;kltBpwQzNc$O2CCvd@idFz1eI0M-XT-|hkj2ww!ARiy&yc%1t&8b zRyA!~-p2FdyD<%r+djR$uAXyuN|&#lc>ToqwP%M6)eFDvxLG1yPb(e)9Du-qObvKy zy@=4O!^EEx$=6wmJsdhGjI3H`#^`*5+Tpwx)C9oYCK`N8<5OhwKb@+&dyosNjsp6` zen-fU#g(3tp`;~ZbLV+mj+cGffEhrElU<{nr($4YqV_KtkY=_?5$&5*@n}6WS(fi8 zU;CexICRwTH3gEj#cCKIMJjS{19|LpyErAU@cM3I5hfTF5yGtog>;81L>ERg@sh*NH02Q*;HW)Le)gakE-@~dSTc_x=EGu=I+*&ZlOZXNFR=eJ9Nn;ws}x`#;NSaF4M zu>1(^!_&*i#(jqG!%bcZ|9GxJ48Yz{FelP&rF9ki{YQqv$ zYC@JK`*n@d*E3AyM|a6-=|qM*5hu0XLoBX3`*)Dn@3JZpP3ZO!{$%ZROQAu4APycK zteM@5M@BIwoch6F`8Cs8*=Id79FmKTs@}>S`y0ua6VGW^wtor3Y@sN#b zss7!Hcbv*i%qBJb7+V3gD$T(C{@~WdK1y3Wi(HJt=Y>AB(MU-g^!DXpn%BTzS>0uu zFl`kI*)=Vl9+WLEt(Pe>8m}KYm8C4LFqS$-nO*|9|Fa2X|mQEn1^K~s_S^%IVebPgJlkuvsH1JFD?R!XiAlpoU!j2gep^&Q)Jw!+g zpvA|4O4)meB?^d$jSKEnCzC*3!7U0;jz`zQ;4}cv;Dg+dbF9;|g7GS=j}?bs3zv z4v8m4>djvA{zYkT0*s@t941!+I7dhx<3{kYnVU(LyU+V*q8LK`5Ms{2YvqTUL-B=v zVt3`YO7V(x>WAc9>ij_WDH|L#-NzK7#@e8!v@`BhjlnEncQexH-gs+I9_4SvBver7 z&Y+tE)Hz>%2-7SYX+-#Y6~Mkl%TRm9#+*Wc`# zlMEgVhLHSLW|t8B*6mFHz;=N;w(-1fC{pEe*0|Y*Bdw{s#zp?%pjHP7IeYr!Tt<{U zX+ZccLTw0F7AU{66Ie-ZRW!>dqeF|u(!Sbpx6I^Kj9d?VLi8B*pvu5!i1cMgtstM7 zJX>U8O<3n(9(np_3yKIjWVEmqmh3n*Ydese_i-kWDHZEW_I;Gho!Q z=nh2jK(%t0cS#1yDn*}YV*w%enwfGBU6>Ug$$0QOj z{I6iX=A1d0y@tK2)m^W->iC6LTs&UCzTg$>Nqk+4;r+GfUiy)pT>+#zDSi4_L3g!; z?Cnjs68n)z*Z2)S2Kh-Dg=yX-lAFmDXO7qDo==?nvu61ac?t~`Wp=mEqM6!V=Bv%= zO{H*PYOsHVO|0Fi4P*RReXw<_h63@=6*P_2j#b8zffgURB6W*?(Np)3qD(K8SG5VB ziK`p?1|(AOlC}M3cLDrakh4u+rI7xn?>;BKpi~3gU>^JhWqQ25@seemB5K(*Bom@y zlPdsYFz4a#0K;)NN>n{n8#_=a&}wo4%@^mjyXLvz}j=Hb?#iMFyQ-f5%^@Pj{-q7&eY zk`#u?^P+hZ6{oIEMsq>e{$T_7xI8X9#SFQ2$e1w-84rs!2du`evx6%@gXOU?@3eeJI{K!#VR+e8l?yMZSP?;v@r82 zic-^csj^xGpLXsEE!dgy$`1LcbbJ*T-;!`o<_{W!#o0U>4e~WW4mR?bN1ZHV@zHeQ za=6z)i=;%DHK-&c9Aa=%h;YM2Ak!GkEeBFp$!J!U2^zbtrqJ}|VnZMJ7PosdKl-uC z#a5HXRW#9Ce%4#+-hJ;Q6kPq7q=sO-FezYd^@MNbdTzfiMA7kkjH4IfH2n|+t*7SK z`s%+Mk{We5GVcE(Qi|oQUthvkQXPli=J_j~VH}|gGD-p)TBfyQ z|NF6|htudSd%x&Fi7Nt*Ez`k?IIY27*->9ayw*xs!^zzL=piI;7cV@t9gt0=EA%_* z+?$e&iWGi)UIH%aQY|LJz8e(7PM`R8XSOhq{|<7`LY2muCtah*X@EDnpR4ciq_~jB=FU7F4$#FjTaCWRrFa>P#C~`NH zE~?=1{Wo^c57qidXaz@TUk*_cr3$s3BKN8iW%`s`J^8wnuMC^B;}yP(1%<)s_L zn9rEUztyI@pe$eCORE8Ya-GsMK<5S!p6V0btQXnaFlS%9x(fw>3dY2n4)J+lmne4^gmhCqQzKFd3TiQH~lPl zsmT!$C{Y1vo~`8t_%Iy2*s&d5zxR^@7vbd7@Kbi8(e|KyPd`kgxflfNhbL9fh4V@i z-+q+|e34UY@m;Q|MO}q4KndbXS3Ryy_q|eTcIa0j?2X0(FXPg2@yT7p$=b>PC5~eF zjZs;f-#PcOU3hjj0-{1N6`hV(_h+%wy%7ua4)|;6$qa&}a6u3OhuOVtD!No5()f$u zfm`y8ajIof&Ebuw7~rRcd9Ntav}-N*eQm! z4f4<(ppM13`|V!uuT1UDqGr^RX3;inktL~v#?-$cbtV9eX-_R!zcvvf z0f7HOeYCB5o72H9mE%dULLA1n2$9#@{jHoNOP^5ok4Ou=K;g3qo!o!R=*XS(yfKX7 zA-mY=a|?MBoJZs%&$RLJM+Z8_Yk~{}CGG6#$=)1qgRDf+J^~dJ#Gl=~H#3f*SF6)d zvtg$5SU|)8(e++JH98vXp`>x-DYq}6qwUI<*W;H0L6%m~KO8E$?Z*Vd0ACk=7!4Qv z;0a|82$#t}g#%d>@QHG&=JytH4<)6Kw%9b`5J)(X`Z>=Xg=CxPNN*((n>XC~_41No zmpBd*ufpjinZ|Sa6eS(0en?^SnrMT9@Mj>|!GISX{FO%6*yq;*YA~sn_U9W*;btgg z0N|)|_$0IKr<1bB&!CAK7Ae&bp?csQnGrw#6?b|aW@t~5D{CSg{26Q;?e#`+=r!Sg z93zBojQ0rpd^s&|4Err1o{2`2M|~sif^2M<3HNy!FF*braVPU}Is4p~?p`3!J_^rD z%X-M#8MxcUVC3L{8{CrzGX-Zfw$x+L50F7bEuBIjuCJ1=qGtSMdg*;VX*J^ zXCZ8CLf`%REF`z8!3;s)#z1hV`>u&y*Rno~f4tR|VNXB!zHbh9ydz_u#l((+=h2;( ze%2H93SGtbSDj~-M*XkJw~+#lZRhc)R(?!$j=497KYqSpu??f z7JIBfCmXJ^n?WyAMp(AdNT0mUdAJKnfqeQ%I;|hY)POM4`{SBtpko*zl+ECtj>!ip+J`d;KtR#48pD-2PCMvCmCIZicI|1v>48 zHEC^O?R)yclp%st$SOHqlD4DCrT?}Uiq4(rA$Cni-gw$xp)TPO`|D*V>tCt1uR-q| z$}FQqD}+z*I8XJn7os8M_;0TJKKyIm-h4!KVZHjqP&?Tek{)F_iZP$`G68@Me6Lr1 z$$B@F6-pt?h_ZxaX3B}Cb76&+t}^d+wtEUIqtTXplNI^X0#LK4s^@yDhR8U4DO7ee z(@_dw^qWW^y}jd^pYcQ=BZp3xts{|vP3~$3rIhnMz~ft)*Pk8W>|i`w5Sn8Q+;ak? zawYM-9@sX-Xx&%(GQ>|`4!hpD7e{lvN685?n6L2)lF6le+_4i7V;}IA!!~v&aQz=m zwlKtp!*jvO0};*nYE!)wEvUR%!+CD)9CECm2@3C#U9h46MWYVm2ya66VQp8=kTOsF zakPpLp`YbRHc8@IsJQ2wBc|K*z$&L|7v#T<+9ZMKZgH>DDC|I9F$03Ko{T8KW4iy5ysKstZcbLE2IOHF8i-R_E&_l6A6ebb!!+{ zDX{R`hD}f=?{R}m@EZdCX-af>bFP5L# z9k_Ps6FI~jP|c8S=mM7q|9xRxf91b}a!j`q$`#cNQZ3j$xfZLPj|HTApS78Q*f)`? z5#VFk$nOv@aC(9c8j=@iWP&9c^!Gnjv(`g0s8Q3=dGAkC>PuJySF6JkBAa0k&~#C@ZiYGI6*oRpG*+jta`Y> zx9=mBv0>Iba6DAn44JP9Oz{{8@^s!xeedud0|f2YarSA-F{_r<0uMQ)|N3OA(q3D{W2@ykl76E_(7fID4(h1Po9 zT?KkL>pjp|bV^ENepZc6^TZ9m^Ae!AoUkHWVVy)M7aW~qM6Mr>9yv8iDFXBM);IVm zV7i@+^}q*COLqQrJl%K8Qq8+Vty5&J`#NKVzbZA3+*MToQ|KtO5Qt(p6?I$52TB!8 zl8?{^ngBfZu$afY&9IG}Q0jcCYe5KR1hKX{WwizZZ{?gBNKsA8K*6(p>H~v9hNWB;?2EJbYq>}~-3YZ%f@R?b;F<(?vt{>HnBs0VOtF4FdN11vf zyshk_H*xF5US|LKQJg_6&6ZkYDNeIZp8gr6ih`RDU0mwN^y%V2C~X$HElrem&>^R@ zi9(le+33U-W}g>9zm_)(2o_*d1+PeCN%JE-;VjXZmvFBRvBYGEg(#pgF3v_AV#mR} z3F3XzTcCYzL7ZRzLM!Uvm=Z0@=tj@v>9Wt*r%{pHp%Qs)?3>Rbg5L=?RPt7ro%j5q zji~rG^QT{371mp;6oWRMg~q*+VVSMoqGn-$4K-JhuvH5`Mzf#8+{z`|dxPl9w-`{| z=UAaOW(;0!ep-sjUAeHV4`ZzGv%JwS0#_I85g+ALmgFHjvlKYeM5xfBioctY{lL<+ z7G*{>-Fp3~ zTa`pao|bxsn$()svdT{W>x%hN!eYpRrAx}PVP7$4P4lK#;U?oU^Rn(~2R&^sjh!=) z>0{f%351>E-UUT=K!$=xVPuy~J=A-jajwA`T{S)Ty8^LO`ic9j`e>7adQCaa4>Zxq zKe}y@HaUF1wDF0ro!h_mznEu91CM5JyNcMh3RhTFxGOBSbpVnMMR=d8W_(j1r@j5` z6roKLUP}vZ+XnddKkme%xMzV?=bKg@Gak=}X)jVfRwgOuxjc#*b@iQ8U;Ae;wc~NuWheppTcinQh=_R%! zJVowejweiY)d1BF!B)X{_43PeR%KPDR})mU2$*PpR>xJ2SO?EM1mL2Jq*UxMyU$G& z<*Y(t`S`4JS`a8q_c+V_>N16iwSP7D_o)P+3IcQt;9^p|)#E6iaIm4m7g3*Y?iUYF zl)0`QdW$L~;*2eRz|75_Qqb=n-!WcZvQ~wf`jodfDRp%_bB*+_so_>y%t6CXE)gYx z{PM0=^U38ySR2pF-J%8&%sbP81}nGE?-FeXI%kwKa?_r{xboBOa?NxRA@lpcxyJYd zvMAUjb-6%6cP}$)Y!|{{TeSbz*vF+@Yd;@`q0D28H?WyQPGhq8fws)|5$8Z7Y?jNk&o09(i(p6Ms*Z%%9B6h)`n}jLLXnN@5r~G)P1_CVi5it*}K~-JQy^ zsAp5NL>keUqste29l1`x|yH30;G z>e%ikhW5^=we7ZuU0&A!rrg})*dQ>>@pKAj6e302eYb+Z;TD-^GkvqM;0?w3hazF4d!P zGV9JCOd9c%v!wXUtL^KX{h=pM_E+Y;y5+|qqso(~Z69{c!tYk2+`TSs;HS$@5E;sc zG06P>@&5+zo+7xXGr7OtoB3Nt8AxhfU?YIjcv7-ud8U6D%GM!{VEuFTy+jYkJjBocRQ>Tt6}Ju`E0R zg~+hw*Vo!|bI9tXM}bX%BW8Hl2pNJ#n2I$Brd^h1EM#kH<(IF3c9(wRD~A>Ch;s8i zo@vcVcwd7pP?vG!V3GE+NHgCg<>o$g>B8oO|1^e*g-3bwa4uLoAG_=j+$S_I;N0s*Sx~>#*u0JRm9J;C2 zQgEIvmX@r{ilnc+Y?ob~JilicwyL|F+ z9@vRam2&n@hi7&ifM+Vq2bZLCs&z{?_EvWy3-ru=E@%2@*f-R5JFf^;UoF`uRLcdq zsA-vJ#zeXE@oRePs~#eKQUSQwlpjtx07{2f-o3Z=-Gp)W*)=HT(j~yEJ6(2&!$d$t z8{5|q01GC|psAWb27OgqI6mf{w9|}-p(<Vk zXvL36W;#TygbhPtkA_k2BR?}Wa!~s;urVHnMT!LFf{zWpl)DX3xEz22b!FOWR;aRw z;WMKMW++h@zd3&!^qpPIW&7jgPo@$R|1W?s4#a-;J$X{vHDTH!p&l+;hPR9g zP1Y0>=wA;_W4AdKN`v*lJKlAIwhzWzNW*3KOQdy&2OJ%nUyN=S$arx>4Mh(khqq`4 z3v?4?@{7P|;N4k;n0`SK?=Q{3H|S_x&Q&i5uh&^kjDGaiRbb~R=wRXVeFIF)AniZ^ zVPaZwD`+9+KaiV{9ktrWHTnlzSxs?Yz^dNp@II>OAF)AzBoNYNdEo|zxci`{z30OJ z6EMxjOLrTET=x1gCwiveJO-S#K*j$hpH??PTWG|7V8*Gzqx{ZUURh9@)2`+zMA`g( zzg1@h*}{uhiMtR(CA%TK;LE5#_E^6QP|`FxcGCYd6Ru%drgb*3Yg@Y)rFZaUFSh$D zAIN_9=kJGdS8&UEf6=9tWf!k8i&s4as{IP){4bi!74o?ckX`^pBOS1YDhPgdJ}UC0 zMrNLv3lGSyH1x_#*SkBP%`jyQrsMy@V5n=A>upE5kop?H6A4i>jnjx$?UONzGN)$2 zliGE!0sFATx_Pkl49eZvkDj8zB1$@QfxZY_a|p641>FZ)K9yKEVX0t+i8&Rhzsk$I zpG+JJA#@-aTcld{yb+VHrPnzDa~k^A7)5H@8*}PhSO*bM#G(juw3@>;(bK?+42)>7 zER{3maScAkX#Q7YsFbQQwaH|lWzO0ox@JvCiW`gRmxt9ArXdkRL3CC*r8LPFMtG%> z#J_VMbj^GBfsQ@qBDIAW!hiD@4_G)nV6=5{u{mZ`BhheZp9~yY=c$&9E8g%P6c6r* zVc{kDHEY^A4VGA}SyYK?VI7(4(t%=_TrM%$GuPPV_>X_qEQRBbaCntd3%p8wAKdjZ0a67!#9!@QH(X+@~{A))nFg+S-!7j--6*BJX#E z4(DsABpE=%-Ruu8^p^Ivlx?GfF@$zL`;0NxQx; z0MX+$N8*)9YMn>I^L1RYa4}E)=A+VQ0@b4xY__V2a+SWJFE}N*|EK&($@HaCj`Qn1 zpcSGa0PAYFThDyJUVtSAfb(X3`>md37uGZ?f&Az&$HXp_FfS*v@~fjb==K%jOhyG6 zG^}g=&h&*N0Sx}%+jiqAJ0%IaCJ~&u zx3B8R6zo7Vz}RJSuPIFgGUa+A)P-Vjj^s1JV`Ka!eRnpz1jkw8_6%@FPDwMF!UwLb zf^HSylT$OQ_**ao{)XN#);g3D8#&cZ+ako%@~#qstg&(tq>4Sw1CH&b~;Whq3Vh5+X0xinU*$Y@!i1TZ zXTYC=OfiDtO!aRKZ2#f~unU8~P_V9xG66r`{Zy|8P$>uQcb}Y~7hJqf4lQ5(tQfua zjTy6bXz12u)Pu9on##T05Pui2X?Tob5)Nzi&hXh58L%=^8bGWWw@J#uWQE9B#6g_nNepcbYL$!SJkJ)^_QZK~gcIrq=|W>wVsa zLSgM1--7a8x?l+yIcO?E&XWsy%#>Jc7=s8XY>mXYP12|3a6G5o43@shF4&G;elAh^Qc%>s-QoW~Npa@A9=MlzLATj@qet zGyU9F9cOQ`jYGvrNtx86cXEx0s}=GYH9Y0Tie|ZEp8N#Rm(!-?ut@KP4Py6&JpW6c zPAQ(X^fxS)cAHJyI;&W|F)*ONjswj`BLU1i%uLJHJBDxKU_-< z@+i(OvDjQoRRffqafF+H`rwHLgMaRj7xuCck$nZNp>wBm`^rWzfmV=`$}^*KZ_;0v z2a*A?D;`p5ju{PEw1D>WiXZg~pndI1gS~j_W7XMiHvBdWN$T8tL>U8t+w05@g`84n zREr2w2*E0_B=GGker{XA6Es&3ZAE@uR8UK$6p~8Q>q;Gu?(R|~^!=3yS4lfBhylEPzIw~Lukqt+SMN5^fhRJFxh-m1n&gBIh`#aH&|~b@Q|0iRt$Q`A z)p_43;-;3)lMdsTryh=uY+` z=doUW)bOh-fwo8@$=_~bZuU5M^G3QQSY7lY7s)!&$z3)+<;QX&5@5LU&jJh6;u@^w z$z(lKz3eF&omp=$Muxz5o^xElsK#!~r?m z{@>=a=-xHeULB!>7|f(*+vWoz3_dLh^a$*-NhVsZh-6<$(_^J5`tHx;*V!<=KKk8? zCf{7R<&my18h+dBprf^KWZ?ZDU&uG#pIOMg^-x&SxMe@Apv!iR=61DR>+s_YUEoP# zbE6_P!hK7XT_?@>3y~IvLHWUN2HfbsHFXGIWx5y*n$9Q^52m4h2UTm0h~p5Ki+PnH z_MbE%N^w<*UtC1eRaz3z*EZ+%?@y5uSJHMk3sqp*II0!FsTq`bfs09HrauZt@t1P~ z0sHfF&^Mnv*5G`kWe(%&0T@q3v-QX z{EGJ5=gD?gW}IVO;{@!vMEv9r2&oSu?J>k;qHEe96vV{iGHh7eUqCS|Qs~Pi1)5T+ zS^z8R_g(Tc6&Zs{a(&N?GL%@0O)}J#UlK3AVd(z^kkL0^r^gbM=ozP4;ddWQ1Y7@P zHzD)PYBbo3XAgL_;c6#^tNxd7%x5t=kx&iXV>}UOi~)tvX%WjnJUb7GdTxV>&zr7L zt-^PD5(Fz=J2Nq-D1c5u58FYfCbk)QY5HG##@+6E>dE6<3Ku}?Kuwb|LT}r$nv@mfeT!qY_32aJJbH8lqOLw=)Urr%k)fTQ$ znOxZ88-T<;Zuh_6M=XC~Uw3Mq6WEpgff;U_{hkSXp! zc20tYbS8RE|PQbdN{Wf3aWsygzXd_$}LSG!8yLX$;q#!BN7R zhqcN~n5J`Ca70k?uNM!b*s#`~NJzKyDcN+e=E_@!SUM1pItRjM3n3PH`JJG-VB1I| z7SPeSMUYAdqNFbB6!aiO@ZWmeq#r3^gDV~Cg96LBA*M}qw0`(z)m`AxaIG$%Teq#^ zzs-IeM4JraEeD!fFFxItxuQbutYGXS)`I$#9XmuLLuxpylS^J3Xx*W!G?V^N{3<=b zn5%O2+-TM;rd0^$cNr2E7Xo}?Y#qM1@CVTm=4GS6n5%NoQ!z5x`zqrtl%=HL`xjpn z{q)10bvxrRfvr;{k@_IJJda*E>=E`6-L~kdx?EQ<9b~FLtw(`Y%(IMd`EGuJ!)s}w z4pe6v&>qWW6>dk{P!XBQ>}=OE)mlR%g=&fhPuBx~R5>+9vwR-E{0MEC3E9H>3dXsx zEe$W>Q?|7icS(cFmt#m0vdJgsf&cr2Zpr2PP-B52O%iphgd1-cn5@z*`t4=3o+4T? zG4Y80+@}e zmFya5&Lcuwe+)Kfo&ZsdotC>8GhPoHzIoag{do{69Cq-|;g_`nxWKdjhvBjW8pPhA z3t40j#brRUsGU2yfNBR(Pwij9tk{0xPNFU{yNQ=-?DjM>`IIlnoTA)kF$8nhNN}Gx z=~=pGoN+5eve#mnU$$kt=GoI~*zU4AW#Rqu6IZ;XG%gH~*#vIqX^Z9|kZ^>=>=iM* zMU#Apy(r3x%+LUGHw<^5jFW$Ru!87-?_WV>(@wX^8a+Jvlk+CWgbs+LN#TZBw(Rt*jYWJa_gcC5r)STT(o zYZ&QQd`VYu6CQVUU4c?bETD6t74ECZ<}qggW&CW*_5+mm!D$Uk>gw7V_fEi- zC$+E&vJnRzQB@SLf(EjTXfsGo)Jmg>-eRwqa=;Mh3b@dVtJ&y^ucQ93>>aedE?3kL z&W$e8upz!xr?c?5vg${Qf9n%GEDnNhsME9WbdRmx+0GJ?C-}v8kjr)rzKA^ z3AJOIZsKxcBHyE+@1fZ3uD7D2w)qVOd$=cnWd!Cau6A0WwvI*>7w>&LR}nLsczoU4 z_(#Gj#63jG+_>9&-Mh~(l8*il0FhN*tV*2wOzWERGA>YO6Y0BI7e<%}2c5fMAg{pk`#}5iw$ z#AZR2<-3vbym#q(rIOSf0#Zd_-@2|?qEr?~o&Y=oa##KV{0Kib4%B3rENzjLjFx{6 z{~y5ENmFaQhlng$1L!gi5=#Ye>%A$nDv+SrJ3iM-EyftnpCEi?D%ykMFVO$xzTWe? z-r3#O_{~AJ9B^nkA&{2`z$|u*jJ~H6lpG4-HUv!{%1b#c< z#y6C5X`U{P{U@_3wDA7+Nm|tLux!MHI*3?}F~>$y=oTOFeM=lCI_R^1)`s5BQ6f?y zwO<_aK0ca$ucX8tdc1Ype{Ecy31bkPlb(NRi7NKX@qij9IpX6{yzF?0qH|_y()zmDD;uqYdshR;VRl6W*aKWa;+1c*;SRZ__mC)HK(I(r?Vp zK_D!w*=avMd^L)3;DMs@bqBom+MeF!u`Ed|J(eJgs{Su&{*%-gxAQqwYjTudJ0S%;U9S)V4$67c}#IPT&rf2*(+Fy%)N)-YAkvB#{P z*Chk;?+#xk9-VpwhybeVPO~I|EhQD5$P$zuI2IWzSY(598u&KYIGQ7&(Rx3N;fnDJo|cXR)FBkXfLv1lJ5uzor;2j-^DZbOZPxFcgvIUyvSO=CVDSwixOopfHa2fWqbx?V2L3d71ptq0 zDNAlTLLLbE@yjzi`N%8a7G_@bigG=U9P4=bd@G$o?i0JZclmOh8zDo66fPEmfWn;Y z$#Z8ca^+)s=cYb!J?clnSYJSLgoO!TQdRXfZ#%ToO6i6PqNaPJ{>qsWfXV8)`E~cD zrBW2aopZT~iR5CdkWD(IdpFM^GMlN8OPtCkz-Ga&0M4SQrIXq&?danyvHu!v$BsC` zz1M)f^jkf@cD-;y%9H`@CfomxHl5b3I$Wt22)cVHqr0C`&)f63)k)CY_F(0YxrieW zX|?kC&AQXBTv>CoLkFdr%0k^-)f|fCxg2F8Jc&OeGJ|s3N`A#8phL+r=m352o*(nI zd#A<;cYEc?tND$+**>U8@f9>VR%4c}R;|A$0^{4cpP4-`whft3o;dq=FF`pJExW7 z%;0WF{U;y~$5D#OkV)%*z(*TuWq`okJ?Tyn?^7&c$(%3tmsw|nfwG`=s$b2phZs^# zjZ%|$t#DdkkfxWW>!9Q9vM}8^^U_zo?67{hO=KfeZY4dW-$3=!qy;qcYlVQ}FNHBU zZ8m^zJXtMoH*2839AHOUe1h8FkbyS-Q>SL(#=*?N%%gkN4I1$>XfDK^9TF=DoqKa4>(t=rvyzx>DQthp5u?=8ZI;gh9 z99qgB3YS%l^a(NXoci@7dSzm~hHxt+Hz%R@@$qCcjbkYRtS^Yj`38A7Izp}XFv={G zCwV?^&>Tvibo@*;MD|dev^$6sMxJ=+VZ1B`1cD%9QD1|4O<6%f*>-frW%p1w+#lk> za%xlrha> ze4|43@^$Ge%WKpCPMRnO0pKDw4u`o(OLGp11%2+|r{o2rP2VTWVR{Dg*L5&JcRZ#W z3=K!d;q({*?X8PHB^4Y7*tJfM%f!oCn4l+_`MX2cKOWamSm=RARoumDE<#epI)a3k z3JneCB9r&dS>1s|OmDFVYY(U%od%b8N9Mv+^a+#rJTW)S>$vbL@U8+wn&&$@kVBSw z%@J(6yp<$KWQt!c9IzAieG9yS5n7f0(N&!pREZYM7cETBxv3BXwR*DjhBgO1?PUCS zNu{k`$RS;I1RbH*WGTt2Th8{?3+k~=(2Vjt84{1`mkId3Ymypx2e-=~GRy1kF%iK7 zFFcZSD8=W|%cKqvO~2MJ9Hf$my-0+e-60+kGW(%7NgaY$49dyJ{&}`IoXy$2P*84F zVm?Xk0y_kz%MvVN1-kMnruj?Q0Oy(ek+hgOjJeFqn|_FpWkP&%SxlVcYAUqbBwM37KYx#s-p#u2Mt-eGAQ#2Y1=!VoR9}I4r$xl; zq_{naUKZn2%D|H(F64hzeaZc4(lWo7Zf|!+!C7Di{Mq3$f%>O(cA6dwgp#Mxa4YTS&gT6v#Va_S8aK+eM9%7_RR+vJ zN?0Q5q25o(x$=A@Cp%6pvc%|VWTVcha8as1T}9CauQbLKpgQqn@TRcem)a8dPg$bV zOwhqg9Gy21s6NyHx5B(8q?5}vV1T%!<6||_z}o9jF+~a@$0wX1SO!>*C9<_Uy4&QT zfnrolR~jDa!{(yfPetN}m$2%Y#p~s zt0P!DP6cGit)si3$3?~>+u3kAV1o@?lei}upDnkX=Jq{;u%X`5pRhfk5UBG3y?4yK z(&YTae!tb=oqIOzb7PNo_TOULf1mnFxa=;iS_fF|!&O9uN{D;F2b=&FN*Mc`5rwc| z^{H?1xDCGsMdzYY<%<(wTZ33u#Xg=7d9yzhrtnSaGlQ%aR4JE0&8?9#0@Eu+9m}M0 zt8IDg^S<(zBlgoLr0A5e-5J5n2Zhj8S2|&0n1J8qZ}hTxCnkv5oxRpwQ8)@5jU=bI z1P)HIRtUjwDo9Y=Ymhg|6Azg(*NOMK7HcsxG-@}#HzS(CS$-NqkM;7<^dAG{nt-Vd zq@P+R8b??a5DnOWu)#EyjDzR)0zqc_zPf+m&f2~Y*DJE1qMcizc!XdX!YPayPK*%ra9I}fB)V1k~2=9n}4)uHCQ zbTr^^;#jZLm}(EAiP=BEzw?52c{tEb=bvI$CUnI)mnmE%l)c#0GWy*bD$l}70+vyb ztmRSG0Au-vuqs6LV^fwLUx}kOeQa2gE~?!sD#!;h=whXAA%!a zHHVJ^QUTvm?hq>mdZpIF=*89;gZ zKsZq($+%;Mx_X=;&iRfaj*RRN4!|`!h!8nF#@lP-pX8{R@Xk=wlAJ}J#a;#B28X83 z@I#-&bkrif&30^96DoJV?0PW$lm6O_u5NX5UuBT&n~w9rlqBi;4k7?=;IVv&LN2<^ zVJ-h-ag&N#eBMobH>JRMeLO3hWR7X!;FsfJ!+ee!9jE>f+l*iC%&nA_!`LZ!p?Ka7 zbF?~bl(T}x{rT!x(4aXR1LM9wB6XkabP_6&)X^_R94Cz0<;}|1=JSIcZUO2tc_%^; zc=Awv#?(HLQM42_H3ZznU6u2vH9~{yUBB+X+39<;nK;a&oqZCr*NI!pM5r$_aFtsI z=3GOM682xTJ_Ti=+Ms(Z4_cUTaO&Vp^zWXD`YXsdKC_eFw4+X7GtNi=Q!(TgVL1;FSRoT(Nq{<*{*dEaI>Wivm~c6|GcvjMCD<3TgaGW$8@KFX&(+ zt5AMgD5%QIJd|MOGI-v4rX$p``&vz+wzHvjct){d&0Ji?<@bzYN z+xwpGPHxhje!I#21M8tOX6DMQ`fB7;lySrbd!_U{m#B><=GofW1Y0F^dH}m@&nSWU zcKoL1QJQbFiz0mcHwHut>MoP+1^!So|0QFKY>Q_q;IWqWq*_&0fyB8QWu z8<3qag0}Z7L2>GwuJM(ZvJ)p1fEo65u0030q%BUjseCWh1}8FoTowF0ZzL#6q*twEW;+Xpkaw2DU<61+Qxp z${Wdl@8gJ^d@~Or+u9$M9YejXOX*T9tm9$1i8XrD;Baf*6n=w+v*B23o>D|kYeQsO zE)+!msBMAd=+6SuoAxo?p!|H@jyaON0-`g`oexMz`DUt#7)6gMQFnGnkegeqnZ28(!z;=aWQ&Zgh_wo2gI|#f=Y&)8^sqQvgyFT^Y3Ln(P4P+&8{F3#t;C8Miu)q9opi$e(z;;#t z`csBLFx7c+i;jG3iJ!mEZ2@!vj2v0;8rx_@g_7?}TA%yxp;?#d2;62@ zu~BkhrO9eWf4iQomCZ4Bn8k-+?t32et@OiuPJ}z!mS(3HTY>HV-L}CkSCL-$9BFpw zH#2}Gsf}?3r8IyI2FNY?R&`VL`7fC(N1OfJ^#}?S3*toni6;So;xT5<0&?!hSY#Vr zyGR%?PQ~!-upNzKhIyBOjXowsiO*PvW{2k=c3@JT0NPY2%`X&ICj`Qloh% z=xQ1Ad?`utaTBZi$cmkK2)Y}tP+JKFayRRdK84`1kLo`aQW@_1k)$cnHU4dnef)tG z3rq+?eiw3vUY;h~iKZOuq!zm?w?V2)4_4o!+zIIHEU|h{JHD*ygkMMm0UjHom7R;Z z${g`i!H>a^v0%aGG!6-_lR`?jUNZx$qQX;HJCZD+_3ANz2~&@LO}(vJzh%#Iv^3pfHO22ynG~TFkt}3l8CTz#^V=k$C_K)%bLG%pd ziNY0j;_GOE2_p-2TULGI` zlkp^k{bBS?pfq(feohl2Zd=P>Qz7dKZ=t?9b*B*e6Gm^4uefl8yK!URI!5#rNYF!{ z#l4MY;e!i=Z{#@G2YnFGSE}R)%KfJt=Yd9)h(!nVHWqUkfZbFza!PUu`n2l&sS4#i zE5Nu8er6_$7C+Xb^g{q?&Z>v&F!Fp=hL$rJ$>GyV$F#=lQ}t*+FA~uJ^~E(i`RN0I z)!2RmtKI}+NhpK9twE0Rq*7}aKyYLEYgA#lfzX97*ggcsXHS}{eGpd0OOEH=puq5z zsp|6%RWvL*Ej;ghPX#iRd%2=2KI z5qLN_U8)4{L8SGW?)>J$O_q|GTMT{mkx_*_ArNW$Sg=4O34YzD=K7C4_Mkke4bx=uog9^z& z*69yEh#LFhhID!J4RVlaKX+%tHNN%yKE5y^HOi42Lz075h%)9_{1dqn9TSq&STc*p z58=DpM~ir}8n|o~<4fbbd|TG={WKm4^yIXv>q&>p1kC_S-DAlLx=(8q{bq`fPRGb& zQbGTvTlqD70z>X%wY)9BYuxSJ*{?|KffI4NIt(NCuaz7*VQ~f=L+|`;x(-VVMr_DS z-;~+03@ZnF&ln=&-Y^;U5D!__eXtpxr2G#m^Tk~N1(H8keY40@>Q;<6=|%I>Avs_N z?O@fXwD&ZkgdSaj4GjO(w#t``(er_Nkq&_6_HT))C`L4ND+(t2fpsK3wW=n=5~?be zbSZ&vneJt@S`+*KWIz(+KA$R}zk_y0V^fwl>X?Q3A_}(Rqg`7 z)|Xg>f`$uXA24q(iwQk-Z91{1-NC2@4&&89s4<4MDw zrs!Cr$#-Mm(B!-+62PutQJ?MYzvdp!r<0C9a0+NrRm79&c&>yTeqykAj?I^LT@oz| zwRkdCGIP#rnNmUr7U#&uD1lMV{wR_kKU-@`WMWl$s{(=v#w>`3X`>ZKy%>>buxMX^ z4IHpLG2DRYPL0q?096WO{nHL4<6rGTk<*=o;+^KcLjOjL3HcVU{3eEApZy#OUS{xB zHfl(Z+?Ws3qNvZIVdVA^v4ER7uXXT2Fz8RlNn3L1A(ZUN2Z?Z>tfVwmeV8}4cxUZy z7hIq38sZQrEcEXui|5YcZ!J}<*SX=_FI(RrruNs%k{~(51V+dwa@RuWtey@}Gxanq z0jXK&B<_1kkUD7F%DiaV4x#H0rB9mnC3Jwi4m+4O4#XLU78fD|ciC5H z>9fk(nyL!HyM?AAMqg$XWUu`lSkpM!xu4>X4o4s-uv;kW5E8du8Mk%i{!}d~bKTZ-Xj1+y3Bx_)_8YwtXu8G)uCigiv` zc4+GhkDcY0BeJNjTMb65WfLdIQernha3d+r)^&hRU&azeA79fRqHbA&P0leXmD>IU zTw@Ca?2&lXDN#7rap7tGsICxJ&qfKCOg_6C%hg_;k0~WV%^A~6ydJ$W25wLfFOTc+ z->Da!+U;4mevbX-oYB1=u1ZGfJEij?P<8gu`Lr+#T~+!@DZJIbMG?(7 zF_aIDJxLKlRO&(utL{)Qf96)SKk#9-H?KjbU_PV!)nBHVVrfplWxK%gpfnSthUZV> zYwm1m>uu^L6c4DCd3F$fx9dQ6^^KDJcKOG9S@AQ?pj*E}hWN!7OI?btF^;5zdmVkumItaha-cp>>WcFbcSpoZX?=R zpPq;zyr95X3p9nv>r}irkh=DNsp-~lrOa18i+hSnnsc@5v7~WkMnFf%G$N{d;NK21-=!Q7nQa#^n+kcxhoDs%@T!(iq!sNYD$4jq$Xs zdiDcqEYEG*umU_V@zu|9O@>#8eGHn#d3HG4TW4>yv+PJ8lm$6tNs5v3g~hZnbbarI zaZwYgA3KXUM}Q4kYcbt0Kchc%Kj7HX0SzJr)!a4BUI`9qcN~z>%{SD6BLmldA4U#B zZxDoQ(=~{y<~%f`?T^Td-5z#44j4Y67`S*^sdju_N_zBA@Jx5{l#_#mELWmv#lq>o#8u^J zZn$?s!=(a}*_xquB4wJ0?6iQwS zx3PZ$m${D`McM^t@HR{a1UKjj%k%3x2~8c%!iNIKN_6Y+H=33A9!19bQppRm@DGCW zl&i3hGb*=sp~6D@Y|a%e@BAOjw}d_gq}VQTlQPXjd0C=oFN3N-&kTsEUnu2_hF*va zyFjRkPS80&ARyTm`wM_fGGz2%a=j?coC3f8K<&BU%}`G`6*nZFSxI2IwGMoC1S`Nx zCWfws&qkafJ$M=K}QFMZCPT9?9c+DUk=}i z+1x@9A{|bOY)lPd5C)K&EP zFLsN3={pg|*P+RP2kF+b2jP#CqCaC|ZDaz|e^8C;z=c}jk4|<@K})o!`$cgm08e8L zatsDLZ7K0~_nku&gZ*G1yz{KIv_e1~{R823aNIVX6?#wJ zidS`B3^L7kRDiQjgV`F-9i-J%Yhj0&N2a0U|D^ckv4N;ZsvzNX$Tx^_!-~EBlQXxm z9}%A-GB=!`SL-eZT_`Eu`vROKs8f&d6y`_7ZOQG;SgXt)tV#ygZJJ=S&BePfIcf4Y zFmSuU3{HaWIq?`rB26wGIi-Wet&Cu-5Ht>TE2nl+n?1>;A2rs}sBsO3pYv_#1K%9Z zd+ZXXIBx@KZ#5(}Mi6!SkMjzf5%nVbtz~PD`E;wcpG&V;RqFvEpe1R#W|EIIMJbEC zl?b3mmzhPLD3Rzku35QGD@W}F8Q8^SBM&3M$cDPxaEBl32U29QT0ZC1VLQm$VlJa) z1gX5vyB7Lr|9NN8fnnrdq=^{^_8J1Hq+~42wZ5Q#Y@X{usCsRK5u`)hEbv$kt|c6X1^dXIk~Bm%);ngPzHuU z6Z65a5Se_aslf( zCj4-(x4~K40t+Fk)m7qwyz7P~RsfXb?avQG>5o`i01l|GV2)(4+d$>lc#0yOHkmMOr(}~KlLha{vaQ8y#mKFbGN<3A!pB_7j zF(2f1RHSvgq>ZNZc+nA&GVGOx(}k0wN?_c5_elr3xF!v4HWE`5Y!0e7v}bkJU2eW? zI47T7X};ME@x6$u^CTs*f%)#C-0I#hfdQ2fiS|v0Dgjq40s58FmtKe*>gIY=!>Kk& z9*Y*e=s8sF#Z|1+0Sehyetl{nsLRjO;4qw8OJfM|rIg7QP8ub0{OA=R0PYnshX3nw z33DkcfddwGLyv}>=~HEWFZTF^LVUTGhTet>X^%XU$A=gH2yQQrRB+gkwSOzUOwZ-c zd9G<8vv0MNJaX88)0hHcf%NHC;mry6x2$+UTcEi7Q)h=cr9=xnu#h3`<>GM3of9jl z;WKVZ0T%A;6g2qJbYuGpIC>{8=7k0%4{Fd{R>gQ8bnP=lFz~bmxP6MA>9Mgaz2{UKS zL?1{o4yq4Lk&ALg^B_aVt8G~^&q!fC0Mt`Di5cUTFfQYig zZv;V{b30_FbQW+SMA$ogsws)|E*8on32yc$_)0?7Oy}%}IFfu-ZA)03sUPRuq7qVT zisu7MX!vxZ&z_*lP~F$d$m}ckI^s9b`2|l9;{F^TOgjO=)_JW*duIN!o99`6<*a12 zHZ_f6PFtpCX|F&fScU!fws-P}&mFS9`DzVDg^WGUI0C%c4%b%QDta*qa*M%Dh41YCR_kyfz<*$!V&$EE)yt{K9v2GY7jY6s{Q3t39|h{)Tx~<*O3qFsv20 zq2DDK>|F_a<(0xe><-=hw|Wm(RcQ_o7&1$38)*(E|sQS4qAKR%a!Nn5)kCdP7 zH*V>sLXcs@QtuSR6gFfuUP?i0otFd_{yv>kUf@Z%jXaf8$~q43o$v8PTLz}}FP)bK zh2`14Rr#XE=uojIrb2op74Gdmn)ebb=(u@ffa|ln2Hv7H#>5{cs|L~hry@Y<$05&r z?I=goup3<_NezOQcNJ-9asJ_if}FDbhJ!qqrrEUcSW~WD+eWtK!^846C{c}vx^=%s zc&qh@9BgacyQ>q87OHNp2rG@7q7twNCIDZ!9J0rWuaU^JIa$&m>3y0V7WtA$DQw1! z=Dag&%4p7f@CGmp(kUy{-(-7wc*)0IS9`b!-WEVBg)`lsCh{;t@=+&Fy!Nck2+(J6 z9z7;L8eltmh8lFV7L>7o+(+};Qf-L%^wVm!yvZV^@x~v=e}9H5`o^BAGcR&%x#I~^-0z72i&Ucgc=jDKzff6wnpMz} z9}u9CIC#X@iSfIjrN>E|wI)tm>5cL02$%iAz6%BGP1`n-y(MkPMrbWS8M0%&3S{cJ z?xf<=ID2WQVfaaHJ8g``*V&dsKhHMFybQNX78QhT?ljdL^Pt;r^5PAanUu~c4VU~L zN=)jTD1bnO9@U%DJ)7bnzL#=JLHr^-WM~z6i@*CK^spDr;<*+JRF=>SUwo*p3Eh@H za5aEc7DQ|JMvt1z52)t|94nmLfu|iwHlaV#34Km@U-H6%V^rVJpz|>&qekdPycCb@{N7oTkWJ}=2wU$sl}*cOjJ?( zSN5uDU3iwjY&EgMEfn{Fc4_JIuGk_q#zi8yMuD4;a9$G9PqW6aKq_Vo8@)Dh56(klMfbBhC?8d`D)Xc5*i3OUu zXvxR7;_>4m{QAFDu=qNN5I#KZmWW_GarBMc1tcpoZk!=*RE1|NH*5y|#-R7*5#n5) z!UYFwf&l|ms4F6^!0a3&+Bge2O2A))R6AHVzhbAJ0Jy-9Y<8wxWZj@CB(zv z8bDfr?vDN3qJBz-D)!W+#EGW=s|8OqB(<@9A;N7K+VIqOX*ez9X)LAtE_NqmprCb9 z2`)VW%hs#R*$babSXE`6P#lSXc`Xg?C&$7xTY^6gM@K@w-h^;D)@grFAp&bgJ-!e2 z`zd9DzryZtRvY8^0SI>-bbU?ZVRvHJ8^~G?QSdq4FH3&6o}(w zT|6Sg_>i8ggyWKgj7)XO0k7(eFHsD+NXw7qMD{po;`?j#cgH$lbXpYMjW0_xjXHg$ zXouqB&U?TmBNNa_(ps+{4(QD0m7 ztEqbw@RqBlf|=LnugH@~y42ad*SsroUk=5l zomGrWX7gcHc9?B(Tc2-zk~14~)=oJ$s#VXDk5AycUY^efDie+d?Yx@Z-3K6=z2O9B zUUb~=b_}WF`>!y|D|CnQ;N6Z{GrbXr-c8JI#XVtsSQ_~Tg#?NZxhO-Y2btmb@E~v> zcW(5pGuTdnEVpGOgCC)Krj=P;9BAD$3eNzwzn-@!RxwFvY-zOnvY#z`e(!C!u6+sZ zYTaJ&)rOn3L7?R7aH=bqVeJrcyZe3pg5Rw0UZ!!R;|G+*mE)u>?i&Bk{F}sQ- z?y=~Fx6UkwE0J)bA^0z7ZiL5)_Cgi>p&QB5_0c84sz5ppM1bvxx~tbFq}i&{KAHda ze>a~-h|ID{0_NHS!q*{JR5JA@2zz|&$#WWBYy3UaruyEjet2*q01cM%{J4Ef*os9G zP`jav;o0vg)7G}U-}T=@FK(u=WpBJo_7nsCcFfcbTl0db;XoWd5t=e=%j0-1$h^}M zf;8xmTRxqa|K#B*&W0+f8>WX`Wb#;zZ}`)_!rNg1pT{G1ye#ys(>os!nMP?^Rgqz1<3kaEgYrEx=);%s6PP2(*xX>YB$79 zqDmEt^ks{v8Wb-YmRDX)`)Az{mCb~z3OJkSkC1Y8#v@uSats1c+}>sWl-&leqzc@< zieBj(874K~Evw2sGd#q+wt+i0kkHHxj#*9NSsWYaGX&uM9MzJ%=l8D-=_pU!tzbY2 zUwCZ{U_h+*8z92^7wImHR@@7x>zq032u0zcJlb7Ja)ltX$DWVH)pJ2<1$7y#V6_U4 zq;WH*X7kDjL9NXQ! z(Kjg%_5A}Ru16%mElAbgBg9UDeDt)t5aCwDQ0NEzbP@K>+(WT`gVs|KZO39udcxG; za_6NLbi#xrJz0h2iFj3jfN?JfXiR`6XrP5^PHk#N4t<;#Tj<}=+Kx=XHaRK-oM5wr zGFZv8dlf+%k^>?o!A*sm9z--t4Qwq2gpXhOdc5}sri8I5+mz%eW@h(Y{k2bOq}K&t zC$dHctDufqr!!VFe&v7C^dGQ{>pipp!l(;c&2y)H3le$k6IBHUjDk~nA&WovoWwEz z?faS7T7?spg7DX^#r4{lDhF!Bhpu@p>lPa+BxzVl!oUmkjO z;M=1X)*pk|%!EzoKY6|w!V%$Dt-#J&Z+i6CI>ebocHx#(Z1v1o>g!PXJ>DOb?R`3L zSy6mCn<{c*Qthbdr3BrpluUdU*!x@C*C(8uqHAG#4EdqSCf4T6abdDuY1Hf^hiCiPFUzSyzcL zM+=Pw3zx>P)Grcjnra;I`Ed?VikN-2P(tRvH!VQQn+Rr0Wd{waY_9-4Uxu|DtpA%8!A~1FQNa+y1e4uOFXn z6ii;%C~@{e&=Kx%9<~QN4CW_{7t5Lp#<*9N3E@tV0&hxv55LnVi%XHcu-whD%4OZL z*JGkIKfO%8%<|8(j`8t)1?e}@XteM9o0`bHp4?#aGx?spLlMVQrI7UtwQ z5c|D^m!dv}(usTAZkw_v?bPkU=d0E2P+c|DW*O|1sS(jb7LuL)(4S4#Xbge|&fm)b!iq*PG1cc81FDi5lzaoEq{UTs-!Fg*lJa7K015jSViiw&9Xl3u76Hq zSlDj#aEO?@^K9Wo-wQ7a{@N`z)wF}tkc2x&X8vJ!+>=la@?kr{gI>cuev!5BHp@_{p_tz~_`b zIt&XyxOtUzUsS{1O*aU8m*LCLU|i_k;eQWUxM6fwtHrOlR#ctG5ouH?m-V4`oi)1sF7uFH%(6^z_RwhNYeNR*#%vF5yIfV7;cL3e>z0_IsCG#2 zAv|Yc9=bPQiW+3Nlt)y)*y* zQQ6WveM$OMW>TCVMFo^r?G`}HJY)Ghh}gcDk8HkbDOwLyJ9>rn$a? zbG8Ux|BZsN1jBlf%Jz5Siv#{PPoce8I^Cd!v@0eDv@QFq7H#cSQjW_McfbO2Em8^9 z64VjkzLvh|IpU-qhYFGW3|Gt+wp9lqKHI*`a4M!;%c#7RbmckaKi0mC3dU-2w8b zp{@Y=BYYZdRKy376Va(R+Yhj6cEnBxpU&$N;H|o1}aDcqA0;*=3<54sIyU= zWKdB?x8`|hB9T}kejAZsym*_{`boeKW{eh5 zjAx>aIg8|IB~26*7ZUJN%>O^?p^>O5l-L!hW%%59gBu2sEc~w?O#d(SP*CeLxR}qW-%&$s1jRk22=Fdcvjv*%W3^b$tv#SF#ZFJDmlCbv)fwEpXr`0n;5np3}@az}ilBlK9NHNO#b_Vkjc#C!Xrm_}y{ldT-BIW%9 zoaS3DKngO*M$*YLTN%uLC-rC;h-)6KJflL+5^xw2Df|15F8^}cBV$OgP$Jh4;@1vq z0KXW<@+xQzkIK%6rbgTH8Us_%$l-#I4u~`(r@xB+Az@z?WF&lEBixt@YQtmNCLs)pd zb&iO_IjiLw>~)RM{wpe$VyT{%KGnTrF3*L5dFk^c3vYbe(exI{1WQzC zEtXWUwTZpdhA#Qg-)Q^y*rD$5A-aSHP_4}&?xo9r`44- z-bq~R?g&@%56Uiqbw4hu1W!?aW-y}4tQ*!Bq9NL_1XvEU!5P$dB);p4wZ z(;h}RLDO0;bdG}^oD6rwUkB7Y31EFO#!w43-*eA8un{&779$3Kh`3+hwrl_5bHAd< z0^`S^LeT2yp05NC<1FOyEDXN95Me%zP4Xx z)sUivwmQ&f)3|GDeX@KSDv827kL0d3r%v5{D{PVDX&Yf#s{_S@IK zSd1ga24P#1=G&9sohY9?{H^uw%D?=`X&U9=TPp`L5f|=i@qr{-u~BXGtZYV+jpv zUcs}!cc`}08*!W~AY;uQ+^o`r;4i}3wxkH1j@GD5*tO?R&DV77y& zO%vLB;yi!I4}F;)_$%hMvk{JH+xeaK=EG@&yH1Dyp6c~t z>}~k3n1u^`N+9M`wUI?c91j}@nkP!`br)l0U@_jhp1l|`%;xm?TN*E@!nz*WR(Azr zq(XRieTi_pWkU(tqWfSr-EkE)*&b+~=7Wj3gAJnBaeg05h1+7@ZNsNwX9Ur9wMR>j@?ofZ5%cm{oG*l>LK^;rj( zJ><&7?v~cVz}>_L>w+8^nrPu4Zg_ci)PX9YT7O7hP7r+F=q6q8_kTwhcoM*%w3>KA z#P9Z_?`0(m7rlcMU^VG9`LKr7Fg7wFX<7FQgxGuhP58|-Lvu@$aSj-$0(lDqY71!~^Dw7zA@G6g!{6fc%XQ{_6ix4DTof516;PCbvD{f6S z!u+(WJHm(40F_}U1TZAJP|@rQx!C7P2);xa|KlV%x7g0&8g>|AijR<1WAjI`!la`H z;HTARj6;`LJ~q1{%SNyHr>1+7C=O@Z!VFPQ$tgh}Mb6x`9~eIeBHr;~5|Oj3jY7L= zT}j9!RCPhWMb{^b5K8eXXN5dfuLj_cnN4cIbA2d;1RWsx(n~esvuv2*q)>&xw@3v@ zqBlC*7TwOhv&Rgau(EAW%M9F9xk8Zo9hUQj3sypqB7G7D9eTx)bzx>xe;l5wt}cSS z5ODRYGfmD-W@U;%55CF+5TZG!s<-A|+7@K7dgl6Yeaxy-}H)i$m=X34x_1!S- z8<2w_er|kZ+cV-i{(F*IDa^~*HF|~G$b5JR+rLq}_3Iq21fDmA7`DoNXu6*B#N$he z3)$@s={FLeSG1sp4l|E{XgWwDS=kv`de5U<>%3P%beY{2J?!i`1$p*LBG`33jTI5v9llj|R1mQ-HX4xx%OLZf zduC50dWQYs)*i|&!@FfBp3lagOq=j z#VL-Uyi6w|znEuKNWmJYzKO#5Z)%aT zZHXIsh6Fsj))D}NbM*?)(4wTqZ$d7Nj+So8EswRx`56C`W0c-90~}neLL@iq-mKu9 z(1A_zCWq0g6YCG)vlf@@wv}5;3vD&JvY;HNH12q%*!<&PfUYpZ%xBK|NG7P6RO5P1~6Jg&|5m6L{9#k|?e;PX6W1 z-W)aZqJpabS`}dN?dav%0sl;s%=9N>5OIJxmr7c)j060ret01ANYgmQY4lyK66gzb zN@fb~)^$Vl@tLJvk~NEIxbP}{BMGN)OWsp5CGAp+(^ehf%=1CrC6{s|)J0bBty{jL zt@4MVyW*v~C4t-6{!YZdX0f-t7e+eD>W@EB$3GsJ(!~R|c|` zX%o{di)9^}3cbA1QOk$Cr@Bjyt54?ImpkWPw1$NDgzOau+*4rOLui3`fzn5oc5>Sc z%~%**rKTy5t7{bV_cb&Xth5UQbNADE+{L&KZ$%VkvR~-73fHG_oG4>PAPQPpt^&Qj z#Rv_Qn=-0mV}f(c+Y!W*Li{i?Wk?RC2jRAv!iZ)cLrl~cA;bQV?M13870*PoWiD~w zzH6|qUhrfxlew@WB&Xm=viwNZN)DzkruDvs;57s}x_aI`2iFIyG@X&V>zC-tW!-zl z#5r55Zu8}bgHRZrU?(To_eC8GMF2SHHm>uf_Mr1-?wKrlvf2|V+!It^wZCPYZ!VZO#TPHc^VUSSNWd2#SG@NhSDOV~RM5Aj$_<=~S{|m}e}^Y`HjEVh znH|PCmUzK~4|?c8swi1j4RjHG$#xMKbquTutNKaiXSzO%B#H@?6IJLQFc7G_Z@qkz}>cwUkT3|B#aS!I1X>% zdf^!32mL~J<-2CZ-M98edmXiCb{)}~Ha6J}OqVEo;JcbKr3m(Y zgB#rew!3*{>jm0fLiHn1mSQ_WF+-nIJ;_LM(-;Spa0ebHJbxdN%(%6Y7yRN?gx+-nF-F`>`Sf(SKwEchGh2R%*}1x~^ogf^zGGYnUpEbfgU zq7E!?PI{%RSyTeEnOqsWW9p%dVLKo#q1-9ynMUcw6h??=Ragy|JjP`a1t$kySA{^) zPqT2(cROs#EJAaN3IvWc&Y$KO3O18vD^^)*VlBDd?{k|}2E@MR*y+Q^Z*jUEn|S0J zPCDfj9Qt$7o z*dO%i!$P=ew9ZPIc-c#hMtXOQu!0d114pV>I93B7Rk|h`R>~ zS{GS{el~+G3nk2i;ts$B(>XHDMJzd;uajd=sD>610qS<@pzAbJk1VJ3;rJLe7mlRx+W;E&@!`Rk@wj#>Lt0camA<>kIBTrMr%?x^Lbi)7dBMkwt~ zeoOj4_;ca&n^O)2JE)GROY7;FRr!=N0uov`y7eYbA)?OOtHn46-0hk8+i$%MFVk{`7L)c}A&f+}|gM z|C*=K01@)$69RdE_J(WNx6A7!kEP)9wMkmT1I^%@KeZOWj-~ruq4;=hU+AASb?3&Y zJfmX3rLtD=@SGH{hd5&s528mb`GGy799p~~Su3a2oHE!gT_-vfLvLB^R8~u+Xb3>=5rQv};jXX{wLfe(63ovP3^4 zN54h+*!ErLATsx8{`}F)ND@yMM%1D-pL4S!2ogF<{N5_C4jO5NekZ@#Y=(V394L() zfodAjJ5#NmqB0{jf#qz8AtP3gF4lWmtyeQRu7bnW%SN&j@oCq~K}xY`BWn|_Bp<*^ zoHiM`7gxD}s-5=%wZMZecrEMD;j3M(q;mAc3x0Bh4iE$UmP~BE9t7WIh5o?3Unp9{ zdYAiXg@QTBFoAV3Fhx_vaFYhhWie?zKra631`2CSIG2ud3VSr4wvim1n#bvXgxnG* zjmgZ(Ig6w)CxFaG-jh$f?F}}jBYkDG?|Q$m5`;XC*s8bdP4;#N=sHaQ1#(>XU>^*3 zol)iGIb0(~ndfoL|lx=U;2FqJ)LS)9%J&%X@~k zvSbdm%GZIP+Ot+fIz^F|xE-e7o%IvKPwv}FH=;tP5X5d$bHqs9Q0G3)MrxaB(I(7e z(4ORR;}6y16qa^!^aPQMc>7v@B$nigDzCDVGf6m0$9UT19BN8B5+-u=J~YLEGfOQ zmwj>}TpQ2#dH^BNQyf?=kmX?req)Q)Y3sdO%up~GVL$c~wIf+t^|S9hUGd`AIuDqO zW&Gk5c4kXRY6PSt+6XIs-9|j3QU(9v?x+Cm*L7EkTzn`#)rz1Ct<7kfhtT zZQHgvZQHhO+qS!>ZQHhO+uDiS+q>J_zwja|qFz>Je&}RBio%ed2sYdnOiUsm$607~ zVYUDh0a~)IFh|>$1#>V3@ktlkgPAdCrc6S8I|~!;-c5E9+GLulB<|uR|3cYg>W?V} z2k>v}6jhTyHFc;W8-QWv8B8NiM=lM%{sXQ)uerv=RydXC6wjRBKx1lopf>)S=}K!n z0kxWRAv+gtmKH}3=GQmVk42)%iz6SFrMKjjh&GDM7<~iY)BX&S9s!gLm0Uhd$h)=# zHuxcr+Z-AQ);^`*%XzVnf6v=6<_R6D_xH^2fa$+f0$sN^jCTxR9Qa6`hzPQ$LcWQ( z&5?y>wHE7d{AO<+q47`gFcE+)`E)+Juq=@3oD=|`WRPPo9`QQe$bD?*8EAV`f}N?t z8wAZ0w-Fj9-@4eA&jwW=rxxkGqX~0}T7LOF_$#X%Kx(o!|6bXO^(i^9dqi??bw>ON zv|IY?^yo+{(nCj08q%rc7#FC7t=^G84K1G!q3-0=kJP0nzb<&N07rdN5#lM#CB56qaW11aW(Dy;$+Ffyv3v zcM)s_X2d8D3!!MFY;}ACn<&?g>^WU4u~hUzJ`}9l$jNAA^pEk3L6lNZL$-PA@jX(d zt4gOQw}*jk8k{&AytFt~W6`b883=B<9<)|jtNO1(-mgN@4o2K@4BPI(Lk)eq+uTBZ zBL~VQXH3ObQ^21?y91N>wdd&4z(ScvdQHkLRwbpUr+cp((5QGpP1X~`iuZ(=ve;2U z#bYSqkcqK!D(IMgOR-JU-M$gRf>IG$wCG+pl7hh{8JcQ8)7`I`osJhnJka?N5saDv zK9U~hFTT-ax~51TP~!ybI(abgW>O@`aNf>aeD;A3>m}~y#`8S2d#fPUSO(oJI*4uk zeC-giWC9x|QEjv2ONoaA z?lnD)T8=VGA&EC3;t<4ii%*gftF3=w-Byl8Q<|6F>*8;J4}ug38Q30(1uHVDVGKWeTUkcwWeY<4vKv@zH5R zrE{&m3n>FV)8l)F`xHM8eR`j)vFai#;eDhy_1Fsj3$$}tL`7Zl1)z9F@1E_h)T`oW z^Q!`Cm3>AK-8K1Co_55^Y#K~h-wn4d^Gq6@9TZCPy0Ry@3lx`U=98|7W>uyt!~$A6 zgd!5Pp}sOu6$%dc5>yh$=n8Zw6@5FUg<A^*0*4qLI) zuSuHO&_#H9g`S9W41D=uwY2;~gg^JeYnL(%MM3>_sf5cZm)nIqOwa{l z=AWP7@Y3Qi0iS4?wDLzKO4`mwDlWc`4JAk;gNJKmc zwR6-gVl-5~x3IMd%C=n!--c6wu&)hcA)#u#Wen~9lAJEV-BQ~`^`3zs(12mVo{APR z(m>6hcyef-AolUW9yV}jQoSlt0`t|f`v;A)ySuf?k@l6s!p&=LPC4UdmYt1IrK3W~ z;0{ac?(whPSZG4<414g;mvZ!u_UrW2LJ<*!24n{pli25FssbZ-}7ZtY2 zKL1>CG-A4n7$Q@ki@*O~_;5Sx84zd((2t&EKBzqKnXM2jUO&`rX>8WLE)4J z2$y9H)|OIEV2!oLG7lJ?A*@Gyu)FmB(n15Iuo3rPDn5zUkNq*9BkDC}JTReFAFlaZmQZx$BN2RtQx)kUX1I|sQa0kC@a_ObP3|X? zH0s9S9z|{(4`g`nN5Hli0D*7vRIC_M3@p&rlqL4vHpY0~l0ms+^6B!%#@{QD)3h4U z*QDGxC|MRDKjbj7@tUjiM&9UQCx|Ol>hnWUDn~jxb8R;+A*M`3dpxI&_FiM4%yRAw zQ+jzqD|2Boc{MQtGz(qW4h6RoY%uS>(yT{V4*c;^bgS|m38v<+=gPmBg%YB0;de{hHGHHNdDNMm zp-po7*z9m}S*nqV(I|PEAB#}TUYLPsw$noK?Jv_*>12(K;}3%5ENjV=LoM^zSWz2g z1Lln{f)%H58NnF+eT9ghC>kh#4 zbm2A7QjNnMaDsh(7R%6=0P&wlUo}d{#J0b+FjA!k5z;qz+p(g(aVPfy7Dby1lbRNE z!kCJw73dd^&d*rt9u;~yt`x)|CQeP|b%N=8{k- ztil_uGA!;UL4Wg?hk8<1a|YIBWtk4jjt;zL1DW&7E*zA?53heoFqi{K$ zbwRaF`yz&oXvtpm?bXCW5Gk$AUgpOSW=|HLnWN3NZ5Isw-II}PrrjHRp{tCKy`~Ld zFk|6}59B&d{N;hxCEv>Pc=|V8jZ)EQ1opjU?C1;u!l|!IXN<7FL%$E!RDActEj@?j z!*m6kcb&NWyBP3}VY84>nFlcH)3lZLXCfT3tK`Mb$Wf-LP6lnK!x(r%+@n}wpm#q2 zzrX}6U@{A>33KN*cwJ-$yB0AJ$v9jj2wUA)oDOS4hMA2sB_9V~-|$5|ogt0qw_o(n zTOH^>Jd+)(`EW44*u?wi9XJoa`za~I_PTf`$w{Sa7|&wdWVmxDEzGtv+QV%KLDI3= zdps8KM`@-;im-qxpqf$u5f$tF{`E}Iz(;YZAn=1ra8*{~P2@xYXAXpTr+`He&w1}$ z6vg&e^$i$kII}s4s-aoJMr)F@$h)SRxlVTIEYK8ncMFj4T>GC?hy}AC8_nxmD}~Q? zA$a7=L`ZiRRa$ViVej+iPYgDjVEw%b!@>1tzyam{TINysJY1xi2+t~t$MERovBwK9 zW&5o|iukC5tTBBX>N^`t~JAP?C zl!j-&A(@hI2dO{*+le@wJ)BO{ayW%9J2*6VzaR8fc+~-(@aK2%*a$K8NOqog77w9X zn?A;VrGC=kzEE97W14=h&`5O{yA7EU2A;Ue6XH>N$~95Ln*M-Lr;~Uv*!Ab2K63e$ z4odEYLgX5=egf0(@1Z()!FF?~iuLFi5eIY3}c$5};=fTQ{WPZTfet=Z#c52~J@E zJK~)ds2Zzx0T~qr$bhP4A`S`|OXRSFVmpTc-?;GyXQ{H)FjdTLO%duaVN!Q;UtDXo zJTr?a`R7M`MA~_v#eO6>qoyZPZ?Y`mXT6T7g1A{}9=kkFh6dq3t6KYF1OCBQ${jQv zMT7$O3aK5WDd#CU8mgta&K3>SN0uF`J5Tx!D&vh|r9I)PR&n;y`f}@WT2=zhr#0i; zPK%#XC*cujaEg4(H_kAUc?ICJXS&2>@ZdBJb(*g^S5?yOd`)u$OilRv?#AckJmD=1 z(r~otsv#O}yLOEkOXDZhw?EOF9hC>efh(a4 zWmEm30?~?HftgnRhH{*5git#fU+T+i;3@4LGoLt0)jG`azqC&Dbz?YV{g!^;NwFX- ziQG%{uRooSzYMdf2!+ELs-RKl(6__;5Owr_KvfELIVWXK+W&Tc+;H^sS^3MPorD02(^KM>~P0%+6yCWWi2WN{6)Esm||T2DW4KBN*J|H zFV;{{N`G=h7Kn=f|w@hV@f%P}FjpNY=~fXlk=l8uDVyV50Aztbq$dC-#F ztzm0FC~8Y!w^iNEbnMJtqcx;p8o;A7!H;_oT+h-J-u%aWvQfwwEX-tZ-SBpoRxc^o z?y#fJZ{rfOdIspf-anpwcGfe#AiA&Jz`-s{Y3%=d{~#4{RNkU&5eE~orVk`eu(Gor zWVcuod2Qs)FhFW?<*TF;==I>MVDO*Qa33AHX=*QSd#=tYQO#Le7lvmLGG)tNfjsSH zPN=kC?L;_JcT;u96=296dMZU8fzX9bso9ysqIb4`HjQQ-tvAFjV~?a9FxZn{oEc5e z?%$>pTW0I7`#;W(xXcMYVMRq3%r>%uOSCB;P$RxR1-`m3v6LP@x>s)%BHy^l=&4F3tk$_dhwv>mogmI)3dt zH`58EU5HiPrFucv*Wh)iWS#?A`TN5L_eF{%n&18qzK`B z%_>BMf9$0&3Y&*(UmX5CzDq1@r{0t5&5NYGl3pOb7-2m0T7dZg(1p{_5={$=+`bbc%I_(*q|}ce_*d5-O6wraLV48zL`?!bJ2qZto=WQx7@gbgCcH?@toHky z%>HZFACPS$Hk2t={ZtKIzx@tlF%WxiXflJu3_qH8qv0D1^D+~)Aj7<~{AtpnE3C3i zVC$qYq{#~{(2?Gh7*piBx%O)~2=7fny6*~6169PO%=Nohl`=~P7B&#& zz?xzbZxOpTQ=vuk61V0$Z2BF9fr2Z0%~t=!V3cDbj>0^Co8nYbBIC?O2fzFUPyrXt zUj@ZUTqI;kfpw%BQLi&2QTK+ChMfH5e#d%W*=Wdf2?2K4s_Wqp?+^*tl+sy}uaQ0W zOpN3!Pb;8@dgGRwWee#n64+Efef(BenF3#Jm7^dSJ+#nkAzVUHyVXEazp{lcJKaG` zwaf}mB{N8S$qvYRn`$(8oh`!4yw zpM}T`Ql3DQ&FC!K&{8^q?ktM%;DEUEYAQrg$8Rn&zb~f#Hv(O%4*4My^bPsmd=ke9 zkv}7O*eij(3`_+dIqme6c>HRnD$-1>6Ww!ALglqY=SYYWTD5qV>G zTQ4XvWA1Rs7v^vQTn)Loq>k5EDb!SOU5wlfG*me0WZgmn5z%%9PlD(_=ZPxozvk)j zopajFn6NfUtW3}&(I)E{*@|6+sQf!VP1zK!&H`HPq=#xP4z&`zp9{6_9R$((C_)6` zaHS5Vt-NP@i2tp2Nb**&$RR={%wiNq(C@G;@nNJ88KW9u#PPi$mMD2)CdPP+C`wpV zl;7Ixc-=>a4`jYpon|Fd*hzB*5w&7+^=$eNom8}k%D}f|B(`vze27fmm+elJ(MYpX zh_=cN^pe~{dpcM*bY=(2`~%opW<|$Uk*=L8|9U-zKMt23O3qjL7ezVzTAxUELC0pt zjvDfqn@;(2|E0LK%#`Mm+Mml8?jIg{yyUIe1!<$CDt z6!W9cTEf;Ft0{xA`r=LHb;&}M#>qK=Hb5I*+#SoQrg@1X6aF=(ZE+4Yb}8f3nP?3O zvfE0B4vKBLUQdhmDQD)!f89c(fV!sTkhz=jIIQQLb8g>9(sM`MLX=A#+>k!{Ls)vA zkjYzg+W<_2e<#ex$aVvty|EbC1P87f_PlvgHnWk{kW!GYEPuq-ftNG{t-Xp+XdTBM zBY9Fhf2BxKj*$l(SfYf7{eio8!&kSj)RNu0YuE|=GW-jxY;>0ci~hzCQ#O)m)R$Ia zmvXK1+RGo=-zQqjOxDbRQ4L^|^kS-z*3sC8fI&KR^t}#%K<~4^ZI{dJ95*sTx7f*Y z-uTW`Z!W}SVfgepAHHCikDZ(KcBXZr8!GUg6R`okC^`E>*#1h3S8?4lx-ayoC6Zz} z(d7i+O4|LylXSr&%>22N9kPWU5Xg^@+XWqQzT+BM14iK{O(`x~xA1A&-vX97U)q6B zTjo0QGAtW+iSqc=IpW}(0&1TENp`SCSNNAWCwI0tFt4q`&QnZ;Y~~*v&u6tw|I)`9 zi5!SzQfBdb=Y=M41^xm)i`>Zwh%~65l^c@83I9o|fF|rWjwQRqvRzc6gA1gEXPgEG zzY7@UCMHd05&HJ$!lE+9h-;{591SP|j!B`Zv}Sd~#}_~|!|=hKxB$_X0iPwBej zc;;x#P9;FN{t_yR<`olKYs5|&?00ErSTSjc`!3X=B9KWKqMcn8&+m>x4!Tv8gxs=i z?@9@X#(UGIgL>2{UyF@{9ZJQ4g~$)NEz0;{Q5sNJAE<)p*q>?n(!L5R%woZ+M5Rgr zi)~x7_443u#8VM5R(Orop%5^yiTH`qe06R0f@U1Bu$EF*o{@ayyz<2(@qrJ$2^GLT zdN8uc{Nc7Y+QI&~oyzy+OdAPnzz$0QBlx=72e{uAWc3ABf*FAj>r^=Ozv zw3NKAt$WHO`U6K0QgFbfVEl*y%tm(KFZ{7MHw3Kg_Z6}gtnw()P1Zc1MeWQL5j=@C zG&)jHu?Ohi;|?{=>15%}+O5R|D>-u7m4(_4p{II76aR+@MNgG-63;h^x4dAq8I?>H^3 zVZ|i!RS17E@YN#*S8FU+V38}ONy$IRVCFF8x{c_va~j@L9d>uj-1 z)2=ELQXvW~d zz(ZF9{(49V{-Vj?MZTIF)ZUyU!Bd8Y{BEn_%jTiW+qMTAR=0wr- ztzf#^bj=|-x^pTGwv#eRt!-8BcMR(MkDXmp!6qhz^3a7xq@ zXj7H0um!ntB&<(k?_Xq(P#s()u5wadlJ6$aC!7_r(V$Y2p;RDjuR&5u4KxTMpGs10 zbo2QY(2|{2cvL9Y34n#Btkf@`E**#rKN!7LCX2`b(`+kpgfebLSDHn{z(zG5v!MfI zr5SQ+3hc#9diPpomJ|;LUiMX50Ht0R>OxK-BkJ8_?2`cK*xoa{IK*`BgmeTS>f!5& zZZ8dJO6*n+*`0?vq=`9;4;PB0?JXKvwQQ@62ev7e4mJ9r#dy@fPpQ#SRJfazgr8VD&mURf8?J82>nJv7bOf+B^=QR{Fat{l^oO8p2 z^bs}iE4l$wJcu%;b7nhNT+Nenb@Qvgjl|f!Lc8}{nbzU!ZuXpWl&H}H(GKq#n0ZMe z7u*bytngVtj@aEFX5*TCk2gj#8pb@fb?2lyR1~d9SWs&r@?=aI6h#;_l)UopsI{~| z@Ss+7Mc5=}{6^8@U@m2tK@uSJlQGq`+$+qe;zBO(mKn<|;+SPfL)biHaeGqHj#y?i zh=6XL)XM86;svUG zRLvP)L0Wq;5kLH-EjSWlx2uP_Ara%K^xj`80A73CR>Yxy3FS(kNQSGivpGGNT~^V% zI_i79$&n!xzD7H@YViy>6?!Vx9Z=-&w3o7`qXOXyxUP`l(|;pNsW@bZ3FB%!oY~%g zgL*bR0IM3RU>8o|xosbIxB$ruhAsu(xVx7ser=rumjuAKa@_*jkR>D+o6LG^2Ri+F zX5<^)p%dRi%JR(R!W_~>;eC&U1mQp$eRmGeHqTFaM{$~!LIWZWKAD!I{kkPt2^Hk= z(R3#vFrQS%Rr(ekv08b>0ifNKVl1E1&w+b^yisaa%xYA$XjP?)lO2xt#6zp)dri38 z(`Rt;DQnY+C-YL^C=R$wEJ|7b; z16{rxrl+2zGkJBAc6?ljHh+R&%5e_Xv=|LDsfmxCR2Fnq06V_Tg0g&q&MSYFJ&PWg z7>?8%&VS&k?K88ikseJ|E-mGcXC0%3m`VmTGHb!_aPuXBOO3)@c|!pe$;;ojSLH7% zH!;lE0}hny7#6H@p0n9bN}~(BRyJq54F78uwvyaMN)k5bpNurO*=A~oMtzcL?i|P6 z(AWt-oJ|W^2EeFfD>vZdgz2anKME_jYo)^Zd4`k>@z)*qNGEEB$hlQ*1mx)tQHuwP z+{1V;4^`k+<1%IW4CS6wVpUbK7$e~|J@b7%x7?(0Z!<>3EjwEJVt6!|uDY8wn7QHE z>ET)fbJXa_SSKKjSy{Qgwg-t#Wpwv>{rj9@e`79948?yjT*tBSV>D4tahiiBJUX`j zFM7ia#1?X9%x+LQAB^j5CVH%lCuzU!7Vx#6<^h1?6+>-h4{>(gaWExnnFFy#RgBU2 z2`tZH>>u?0sWZVH^8e~D^O?DE+ogZwM{!bO{Ox_^#mu_8G>=xmGZ-)pC{Zu}2I09` z*dy9JPoSG1z8DIIp#(+{IYI#42s?*xwEczOsO^=fl+w<%rq)GP>QfHLUb1~1T+vjJ z53^%@vJRQOl7fF~(?RvCkkg5x)y~DO+7|?4g52HCvy?8@`f`<}v8~< zYyq=`0c2d61C9S$y=U_`PVOsF2U)L+4Is$V)t|)kf4Exw>#=|rc$PP}_KU;(*s=Z; zns1>AcNXyX)HPbNeF#eRIAcr$P^iR>81`bRSH!)9jMJ|RQQo>dYP~T!lidHZ6`3GdJ&o*% zwW+#%FNs`H4RH}bPB+HSpc<9b0EU=a6(VfBQQF78elB^f)|BP9?-`Xqx%>kvz&oIt z#1skU1ijQ#6O359Q}0*;nw^6_X{dwsh&%+ATd?*qxn&53%;=aA%;xVUV<0kMs*Y2A z;JKd5Qd^0_j;Zo|T>@2JvTc_#-4pD5t<$wj!fT1AaNg+2W|HR}B3+AXIf;kt0NTBN zb)lYr8w=_;E+V#zdMj{g!>V!>Al-ctt$hk~Nnt#W@?coBE%220_$>scY91Zs_n!hC zRO{t1KImHFNzR5gF0^IWk4KHTcPx|Y)xFl?4uwq#uDYY_j74K!kihVWHnIY9jI*A& z7s;6taMiI~xu7Y02x<)e9?!3M2ppg@0U2?98pvB;#d>;a3W&FoE(;aSn9);VkG)Pl zlyR?Hh|+;-B1Cgh7QDmKu@^z`61gYo3?<#(gPbbPrJLQqsi2__Oi%gIdbP%Eiwr|> zRVGH3X#+8~!M>f{2cG#TP56B{Swr~(eGJeG%C6c>ZdFlAt>3)N9Z}4m!IVj@b@*oY z`?=MV^N`#BQ$O&3LLq68%YXq8 zs9hK$Ouem*2oA3w`oLUR{fI+6#S)R#p`DBOs~r$_okSyRxdURdNkj~c6mv`K*YdE| zg0072s`?2aH@{>X)06+eo$QK|Sghkvy?Q1+h zn}6~)e@FFXuvQ#%0AL)b5X6#-P#LDxKv6_D!AAAtYsH=Eb=7s5gA>Gpk_x8Y_;qua z^_9#QC|Y0-X>?irB~)kD>==rxHUAEh8NVEw7z9O)3vs&q!CVsBy9TP>CH5koj@m7j zhmAe|UM0}Mct+`z$+ryPioEedSTBy0oYJ_Wr*@C|XbtMHA>(yR<~Gt@hM*pPfrQLZ z@$PYa)3TF}AWJja8)}g2MKGb9su%bRCrvCjfsN_1JpCqM=E!2j&|*yMDP(I_T&(Ka zmmKV#7m-iCA;efVQ?Pw121Hp=GY`1d95^LI3QwYJOh#S)21s%n=&=wZy~g-}fkSa* zRugJvE*Zr4&CKt)dYGm5a@)3r6*Tu@SWt-$@8s_H{|gjKt@+EfMY(Na@Lx(Ca2*L?jl37fB0jR{20@WK2^Djv`;d?$gjwZ01aAHkK}jp+On zCqEcI5aLMY!>y4Jj~6ACDObxI6LQfB@Jm<;_X)k(sy&DnjwIVxGKt&3!b#XdirgK% zvyvL=WzX&^bM}P*#mOWvXYSUq3<+aC!V;1(SU=W*%EebV-yJhln4dU?$chg4B97bi zguiaKfJ&8xx%PktwGuRQViRq9(=O zMV)_Ay|c5ILWvvz0y1sCc}Ap)Zq~*#5(rUh=J0={Ter9_!s^r8SF=0*02rwJXuVT2 zdPxG}dRzyEt#rG~e)W{mp^Ejp-Z|>^=#NE`XlcZtq(lj&|wu_ zysEC2_4^Dz-+5(6NEpap30G=lws98bauwFjas?Z#R)zP!9~E& zIve4Qm9KFQL`$?{!8NA%bM-sJByQ@)S0z4ZgyDg8h6Ri%;MtZ!oILg%E3rR_LDowb zZzw4rKW6g_)iCa1F$B5Vwu@Cb-!lA}c18A+6lXux6y&f|q3OkLN-DJaS1qU*twdW# zlYE1OimI2l*JJW5OsSPTLXB#P+Zh?EO)jn=M*gv)m-a?DfBXhE21$wewlm?Y83&?Q zt$IO<5m?)JEpsCj7kP`N@vzx2A-znMv+h7$hYxKR{1BfjEJlnGWh*)@ z_6S_ku!{(oUB`!}4gF^rT6sIwc$|rsU!5v?qMJak3euhdc|B|xgs&=+5Z~d1G9exQuic!$VoMLo;!Mjm zAGF#Q_+{^f{*vLX=evr>CHBSe=%gm?XA*A(H!~n6HSN|U7RvDt<>~SBn`sKc_(Q1j|C`SGm7q%F27(ZB z+#jfg^EzHjd{7!4G8FPR>9oO>pWf7!k<&7-Jq8nSf_KR|Zsc%4F9d&;M@@L6E2JW8 z{X6@W*vc;ly=5iqGRRbT#`-R+7X@Q11D8NF+u|+DrW%1HAusPkkm2+42&86mwC}hI z)`FS#f?p=a+f(=Q%^c`Eirml4bla_ganX6L`-a3@I%vKUxd=70=u9vl5~{+Kch+St zow%xI7J6Q7~(KI)Z52|xjoe;0-mX@E; z+AmB|?G9-(+{ySq;ZiKmR#wXtUI$sGV_F0UfQ$4Kj@{STjN%@<8@$U|<5Qee=9emvcC_8ueIYCx+)9IG9cHEW6MrxL1n7#3o^A*)wio4}-4skoEx zIYLTJRTiq2;~TR}*BA`5NIGYZcVS7F;k-iZMm-`78m$)Ot{s*}_CgCX;$(Q03loEwvj?b{|pl8{X&^27tGJmZM8`3zn`Z+B2s)jlA08y)a48paxh^nK}*v zMq(1MM`Vv`Ujb+CX_9(B4^feE@^SP2R9xW9wT!xg`ub{Y$tF;n=h3E}uctg`d9A0d zTFfFoZvxn2iO6i~f=7i##wq#f8Bf;bZseZTo@~WBFE$TlDFl?2Ls}@luuL`xUyWi^uw$v!FLuRVgbPbLDT#YET)pU<{QaSDkj(0@kx_#%u! zh9Y4IDX|-i+oSY!_Tr40XmnIdU*h*5?hIG(fw5jfW8zF0~_Z;zAS&nkV$M#3w_b@I}DJt-QZ|orx z$#EZYw2onK2$$8uW5y5DJEk9}&wF#|V7yfWW~POnR9e~Lo3USjw+0=InqQ7EYBg`L?YgP)X%H2kd7)SFU9ehC;(<@JM{@T`YwO`8b954jop#zQ`(Lzb zAym8m#(I{4X9B9589Lo=-UBqNj!09pzTXaQ635PO_!sF zw1uDgqq|KEO#_sGRzu{o5!jMMMrL91@@EDorw~?z&YK)gwo4;dYw>5t*)Jjh-@qC(4Yg@#Iwx@-}v2 zM~NSX@{!iLE60wKxSAJYgp!w>%K?hrKu@}#SW*C}z?RGxQ>76NcIcT^D1cn}pb;a+ zh$tus!^BkFJ*I}qZH;SPenRjt1;Q`#>`XbmV<^fB)9%cJz0oN!16%t-ut>VG#*nVA zRc3s7A;A+(Vba;Z4!4|xkSs#og}*?+`hJV(2OzW(1D=sE_J!kobZlI4&@MCEfov-} zad+A87ePqM!FTF00cDsS6NeeabH@qFXORO&mN((nuE?J^Q5qHMMnMJuAoabXCP5EE zrA~z^2WjUGC{P+!qX^1qHy3E+@Iyd15|vGGKBsg{#f|s|{F_fO(*O35g7S>@iBq>uy8l(K?AgIJz0%c2+V*-*I?N4ZekrixE z`%JpXqxle0^^Cgj6|lw}^i#I{%5A!t$GH(fWQ2{}8h_-j&ArHicE~!#47mG&(jmef zu%YNm2>H)xtYtw2359JOf)!3VtyIaFBaj?Q|xpCi^m}PW=b19MC z7$GyDr9A5Qj0Mwc1U4OKBYT9jVC$NutHUbk8h!f7L(e_Oo*`3$KwYN7%UA{-XR~H= zZx3dr*MT&ic6M+MiyexYDkPh$>d2(jJDhe8v6wDRnjh3C1kqxdo=8Nnj9F#DCl>+f zf<&KHl;^OWW70-^;De14X#>!vHf5p42-!~FHh9OYwY3n3tsRrapDCQjCwpI*8P~A? zF}V$&Q8M43tgD^>EW6v0E(9e+8rGBcx=o-Wzw{Erv30bMwA||oF26OW!2+7XwFXClwuY8_z;;U~D)BaldHHD>YL~iSPghvI z+XiavqYzK_}Hx z;_rsWd_s~>bO}9-TQ|~9h~qMeNVDaMvn0DX984S)W_kb0LAPA30J>bFvCfu=BQyK& zeh5XkypNF9E~})jJ!+J=Hp|`yS--O|Y>k~+rWi>s3~*UwWb6P4oMceMN*n0L3^G^k*p$S&v(wi~ z+u-m|dB*izTn}!wcUEY+GqQLu?BkL`HlP;jF9|?U$PVI)BhaS`?7QBMGi-fNBaFsK zfL$P-1-DRP45Fe-ufWnIP+3}ab4~WW58E)C0)ceoMTCi@5TW80L zAJ-P#Bw;aa;P(PE z_Q_Nj$8FaQ{-zqGbDUtEd}GDk;#qU)_+C54z&yw8#5BJ0Dc0-M_OM=FPWA! z$DhYh*Z{a{@ZenKKi9pkD7OpZ&VP63g_CBzlJzaDR-}2w4L|M``6T_F<@sWaCKUT! zl_P>f!aZ;}23A!rE^n`TazAqF z>%=BY^baD84+H`wL%$)Dw4vA-q5%i)fqg!~nO*h}U;XhqQE7zosa^gVYpvq7&TG_i zse4|!%1m09!AFV_JID#8t4r+>?{u=Q1sqzXrNdISCLoM0$NrUFR_n28{?%UNPiuQp za|4tWB%-jg=_E2ab(Q`{f`q-?Vzz(>ifzqW($Q7X7yw3^Z43YmcttE*mqM7zVuK8y zi*-HO1d48nLq=rx{;1shsbvArvpLh(F%0iq&_1HNEIlmBy3P_Q+0Oh*T#&;2c}B38 zRL$v;DytPnLxh59O}ui2Pd2zrBeZUY!Wu1umt=~!{nE%>G+J^6GxDZAbTIl#-^o#0 zVtoFk!{+mLH}VWEHfDp)ak7Y-m>Vlm3^H4GOlO%@yBF2vy+59cfQo8bVwKd`P<3@m zBMpYdmw<;{mRI{ROMl7dhH!(PU5f%|cv45Lk;P*)WnwEA5dJ2eoPLb+_#ak_c+(VShnor`WuaypZj-t z0$)aw?t@F5fsa3E&4-TOb5~VaSjZ$lh+*99X2W&jsCAr1nJ!<{2@vd)-n9Q7E(2(+ zA3YK>#DClXM(B*C#4L4#h=`{#ayr`VNu_sh3_y&&)Da0)_3rkFhX-N5{nNqS3GAZV z+dQ1-b`Ub_8Fflh8@p}M6fRVYz~n$TzS+&xSy=HzGeCAuH&_PhGkL0iBBj3y-sXN$ zomEYMfrYq4TA!;6S#jWsgGpif!u@Q<)+!gez*?%FBARd-+SdPBmT88#bHy>&ZTGYb zD&P<$(Dnk^)db&fAFMd4Gc1hrZq=J2Ey!t>Be^pTzt7F_M186xPnmEZua@AkQ+nhQII zX0sBZVOPcnQRd1HbBFvMI!HWR8AE2_MpBuJh%dY2fmI-qrzI-OiwI2gd@vah!u8qVW z`%PGX2Ty)#eMaIp!bO?AkLg8_5fs6f!eo~K9ZwV+B}h-nM%pu+tkCxn^Q=QiFE_c~ z6F*H92RwdBjW>aSPkJ%<6X6X6T4Wc~>O?aW-+zAD{tm0^NhKase)sBb%i$d%2q85#pK6;Ik!vH?NIiF1Yl`}d$VakVz|svY{koNT|MRrho-6_!r_A> zzZUK#+fGgq7{-Ta9DMx$gQ zmnex=ROj{qLJ1r^lPsY&IyeQ_b91m$xj`q>r z-GIy3wHuMeW~K~p8ot5yY?**IwO)F3d_DkGG=@wt!2mYX{>`}FwqY1ZWiCSKwhF7k zfL~%-P3LM^WGcRz1S~Zt@hspYPl(xl2Mm{l^5AGXe2G+gBL8sfd)nLp2znU`&3^hYU^ zd;r=LFPxs^wLjh<*mv~z!`O``;*fAH<20tdB7L+ORVQsCU!FwYHIYF*iQq_BW+rIZ z+T7@?&IGti0JWjG)!!g+l<{EfL^P7!Nu9p+HdmnvV6o;k`UQpuSGog_PN>g?H~)z0 zr;-KZ%->{k1J!v=?4yfVfVLhH5R~#PV>B;Q0z^{z_q#XW%ODmb(c&E5rGDduD^^eO zUq!vX;+roNy1}1FL;Dp*Bnuq`m4`GA3j+x*Rxqk!{yi zd*OJhG=8<*Wqr(oec2o51SaUAramk*lD#f3hUc5gxZj!5I+_j%&|415)X29--B?;0 z4p1=s6u|Z-j{5YrLT=&~W4MVME2$a6a(xn*zzMmi0DRiWJkVVmHm9KlEeS%{0sfZZ zI~+QNcYxr@MzO}ghUbT(fJM^x=||v|kFB};wMWL=)dSaTL_~I4$qwYIsQp;Ut!vEK zg2wqkzUC6v_tzISFEc5DdtxJo5AmI+3v3sW<#>eGQPkJGsESD3a>2whMuFyP6*&Wn zf6KS#v)h+VL)5#mTy20?Aa`xIvSO+;d6$Pv!mFJgl1M>$zR{09JuKz6^nEhF23 zQRPVMd^AYOgS83}&td*w3h6$*HL)AUN ztA7`6VI$mHC5?nN1|Tc_6UwQGvMUiAB}RGW+k@>Hkyi$(rk2qB9Xqt{b`6Y236ym@ z35U_}l5bj@qj}SQ2xnKOL|xy=_M*y2iRxLM$lL0>g%P;rA*_yO(ewk&(y9}f!gOwV z&?Om6N&!g#udPU#Ykfrz!KOq8s2)D+>%`8J<)Gp)?XLj^ZV%y1kvD{^MNdT8nASz= z-IJxGBKMftUqkOS(+RvXW`2|tRj%@q$c(nHDvG=!f8r1_3g`PbK1uDA$4?^=K$200 z2+ipkxD+82Cup)GNUSK}BtN?K8QEW1v@r~T_o?WAwU93Mrpona7 zx5%gWLLpwmLk7n@j|eL>(uz7yKT?9;9~;4EX9S3NelE7~GpNOC7i=uvDzW4~KJU@G za~q3Jud{z4f#CObEErWX3Zw-O`;@$6TMQORAZ&tzLYIQn_eO3+zn!#Yhpo;A%QAhF zv|manjfTn19mb2HA$4Z_TlSmKS; zv$gG5?j#{CC?|+Ed$!E;mp;yZ78ow}0!(Q=pE?Ep_zlu zBy4C9Nj1$7R?0-bVzG-p$(V$+(>7m5OCt+n7j1i0fg`bLiac%JX3VjH=+P}MDZU!- zce0qnerHeHLj`f~_*nqSG)aSDiIfo#|M+!Z7E3#2qM;E9Q2ZNWA9HR1ST83R_9IIJ z!dPxx?aQ9r21NQ_s^^HCgC~(|ezjF|zEp6cFP(E;y=cF0R`F7jpLSNE727qW(FEZ> zjp?~MLfX4(s~#M-%Ei=Rjrx-ytjOX5!oH%Yi$IqR-Kcjdt+O^2% zQ^SEUZf^!6B!Ff|ad|KOuj-j%nkmSe-ziZLswC+Mfcr0Ew%GyYB?Njj#Ha7U^zc)0 zCJf|F=0^7NrB&!59N?|q=TY2XL~{pRdkR{EZkc{$U4I61Qjy=mt@e08V1EmAnS^zC z@ccoNxQiPf&l@*uY=0=kXS^BboIB=iUJGNy$0Nq@?sO76_pPmSXd^(Uk1$$ktAQ7s zAYXieK?8+e{8bH?d;_KU$1FQA=iEPYBA2wy^buJ7F8RS%I}#z=25Ff3oqqgzvXjf! z5L8C!^r<)VAw3#Q|7sIKGhD#d zZ7D!X_Pf}Ai+}5fd|z(xzQgJwKfq!eB7`iK3|E%MS`vXLmye#ZYqZ9YM>@FmF%yQ< z1@zkYbX*#Fiaz^&XTi5Pq6Gl}M%AI+g*pBC+_8uZN$>bSW~@VfF^;Ag;|V7>>4c$8 ztKGHxMf8|W9&$W_Ab4kN2T3?Nbrs|keum%+a*e1H03sLSHsdpdsNaW)b277FD zecL?JZshh{w=JRdA(a6wHb04|6{Wm9N5Bsf61R#?I|!kD`-3x)_kl#DiFQbatBP827S!+M5xvJ9JVn5%($;g zn%JkoV6CZ*^N$I*pWkawt_hj#N;CaY&`@G|ZBJ_NSICBrb$Hd(!F_z*r$hPdUo-ZX zlUU|2hi-s|{~-->_^5N0TFY5RW^f!&KsKe(pP2l)RDk!c;rvDPB-;7oo881;VqI{c6o9R z^4luv4lf?wR^0dRQS3mOdNk~4JBH-Rd#Os|BQbSc!353am!Z6&#$k{CcKXUNJfea< z`|L(T5>sAN&K#XQe-!sm>F1<|MmqQ&l-Y~~3V+G@f*qR&hsT2H3IUj>A!P%dxze<| zZd4W?6x-4(JHjreq&}{4m2t0QZ=yuM0T@$XTABowWNT3t+5~$C*2eaOYEn9BdLv&n zY~$LK?~GMauvkvzD^z!b`8M)wZD~NWLvd6tT2enb1`ytm*1G%~rW;Ypi3f8`v@>R$ zy84d-Bo zKk^n%**uKk5xJ_HF~T?EFm^TaBoyVTiQMr|inOapP^Z;8D3`(k^g*2M7yXd1HrM-vYv-*I&x z*|sJ_ylgqJs#ZB_;UKgQI{aIX|I-Y#wPMWF)YIdTqL3Lwu)1CHDP2YkDebMTtj*8s zqdYA#W#XO!QABmd4tZr%!jtf53+^D$A=anm@D!xR6@kHAeStVfHPQyfP~~dh zn3yZy9yNC&nIVsCiD=bRpil;SWlTSJYS}&YBcNg}QNelG=W4!sn&t`S zj-xC8jEi|Vw_0R1*KjGf)i)w|zl*}eHdFz@#1oo*CM>Q7Y&+Mu5VDwX9~4Ia&PZ50 z864DL5HrcDIGPgLXZ0z5@2{v;8JKhJFR{3-f@!P9JT_Kt1YGFBcz8B+fd3;`&iTJP z;6A#LW7D#MF990_N#TC(t~f*hpeF>$&p{zMuxzBf@h!`$dHKfC(FeMxN~@@gF#Hrt z0-3CI9$nJS7dSH-UzR!u7X$?F`w@kVS$CzKW>@&I&crhNG^DS)*LLvpw}$ElMf=@= z$Uwe0S!V;DKVm|8$(Rfn{GOocy6Z}S^O;RNR_=iW0x4trDo}*;kj!TlKOGjXchUG~ zQ4=*}@2G5bs?=#2wSUm z*U<;J!VM{KMn3@Bbpe-v;>kE-=Dhqb%<#9#;fg?kBVzjCq+Wy!J6oAg!(S!ydx9ZD zjRyaHn<#s?gZTOFF4c^HRxBTaB1~<)__=s3_AswCCdtiJwYnVy%W5mLlP$g70(4Sm z`p>QegjTJW{rtZM|GVJQH}lhS%l%F8Gb_I;9e$=mA?g~b{Ht;TlfZI4DLUithJn~; zr|(S&a$q_Mz-5-jZ;KY-bQe7%VzvSXO7cA2qBv8kuhshZ$elKtD^gQE z45!^+oT3>h4iUFk`Mk|OH4Fc<@lj%yU#V%zQ=3qFZtHd?<`TW*`qFT+T#CGEW#89i zB$ew<+5RyDEgEqt?Vw<`&A)lQ z&DY$H_LXM$Zq!n(%mbY(kc2LAt~OX2;pE~wSGy7#S8wYe^*F@Qm(4@eDa*<(BMY_s z!oe5q9+)Ylac(mqhPljCaa*E~(GGchwl4Wqtg*g`4KZD=N+euM$4gC`l1z?1a`}VP zA76Fc^u02fQNPtf652uFiV4&db|Lb)Avfj0CyPx+{^LaVDEz;R8dLxt?_GG$SwP@b zR&t0YQ2NmTT-fs&_!*4`~s+>;pIgt*^pm`%kg)=dh2OZ3Rq(u6Z@8 zMEwrzZ&jK_T&*Ti|4?+}Ocg3H@)`pS5a>Z*{c!=^{q?X(&^SMRW~y&7Ttc3?3;;{> zvDJr_7>r~Np_ie}U8W~m+kyrk)?Ew}SH2ms9v73+6?=!gTz7=3l0@Om#_j93wA$ZY z0XE2NbZ_lCt#)h{E+3=S^t?>G4B!S2EbmV7WMqx=Rb!CXnupPfH<=8O?>&_b$x3-V z?VUnAPRbN&em3(+m)mi>t%BV9BX0$$nIdt%u|lD#rh!s#$Jc1y^Nwtqp*==$38N7i zK!WyEXqZ~50ZA3gtSDe>&2E$?ueuhfqDTi^)p&+b@(=01h*gv!_qT z-RiaZy($jXm0^*eh&Toi3ZjS!6=R_7;z_1xS{e2`v$VWlj*!(gOGsAHA(S?@mOPBr z&~dQm;bXszE`^_#vP7)e2d6P)F}nsWfS6lOA7+}6f4Yq>2+RY`LojpCXlgGj^1bfX zZ9FnA;6=w6SSqvHT0?wUbcRADKg=`htQ6}-G9DY5(cX$NDzcrwjI zql9jf4}~D!UY8`WfdihxA`TX?dsg}Hl6v6_7xn~Bz@u>!;6de#$@O&<2ts>! zS$I@0T$8@&M4f)3j2yQE+TS#07v*LAZX+Mr4D%s0=MGF3AP(aRZ|J zFI0`re7Pych7oao#C_GM|0Nl!^RV~@CgKR^q<0{<v(semkmfhhb$x^hyAq!JKq^ ziheXaKH7f+#M(A~$!x6U)L0+-l0Y_ejx1<9~s{OMj(|N|#nw7tj5U_~PybyV)Oo&Q-qpE2+xEqzfdxu~;2Nf!Q!kzi^HHs{C zJQZruOL9_nTu-O$`D`G*`$-mHz)0^Uo00j#^;_rO7NbtI4v{cOm<+%YS&)61CM|U5 za&1wqjl(i2ypGy1tN0Eoi=DxmUWGLiB*lCU!c{hv!PME+7c^7Jo_x4xp!bYR!@0bX}s^kG}WY+E`<|kxOd@#oEj^meGzN6t-V{ zU(=g~UD$=jWWoIm?sYNs0r zYdb5Gzba>ewlSv3b*sAh1;nGffc^Z{eY;Lhha_ihsR>n}$>DLdLB-7&Qxx#s4!f~Q zgLt>HWb=h%#~x_u4Yf7#%;G(wF z4wnpwVtbQACE{ZU1;u6EUgM>6A+qlwUolVIqH!~;Zc%lxj#_v3krhC!qFl?4X{Gq| z>xT~H{~A##A<0Bl5r+W%#>cY&(34;;5u?s|Bs;1gZ$03qI5TAXxYIN{^LhKJrqtg7 z^8btRj%Te$SSN!D23G-5GY3cIfXT&-<&55=<4d?zCg2!9y)%fd_D)&Cv`oPA^0Ag< z3d}12uSju~VoIll1BwPa6R=hP=pnrT5vv|PySN3lS{MN^IRSi>&HCoqn1zSb^w$+l^i z@d%(UezPSouILcHNx403qCzM-;Ld@`K^=_HyXR#xTZfcY z0r+tVI`BhoE|h7fFe4-_Q$KOl-9Uq2^H#{sCn0lxHg!_;5@tfdnF$m56dv<$&CMP~ z-~AIn5;}PgLm99Qc%V;na%2iroN{D^14)3LqvTXD9<7D0n$lHW4W1+v2XJxlCxhfM zb5{^8-!lgpLN}y^OZ9Wqd>RW`?wZ4s%2~BVpS&R?smVO3eX)MIgJ^A%a^*DKJ>qY# zV4nso&mEU+6j{7_B@C)Kx!r=jJX51ITwd5Uzn z=m6c_D|zx7FS22Mp;R;#q!U@+WF$0!^%GgyxL}T^s8kVsTdzuOPPq6=2U@qHN5myf_uSZvBl2b^$FsxgRgIO7lfG0zg)jcoij1}8;(083}!Lnh~mb?Ylzt}$?thMUIC54 z!QVEwxm}V%pS@)Ho+vuAAudwlgM}N<*ya>zF_s5Bn%S%3QzH(sGnQ@9W7ugQz6JfJ zg+TEL6Mhop!vm{HjVpCcA2RPMqCYO^t};G|jc|-yc}A4Nx{HfAOkxS>WZwap zG{?T*)n;)Vr;8%D6!e7YRdFq~CR%06!mEbJNL^4wS(aAi-FY z`kdV3Ekq7$;8swVd6Xgl!qs~lePp0kvTxz=*vI1r{+iZXu?P!;U74zW?bid}WnZGG z&2ABq-BQdaxM(hL`^O0gkT{l!8DOoF zW`Z(@U&q$W1^Ei^?8zfvREHolHJqXZvkjjTz#QIU5WBHm59Nyg>~`{`!X3rl&~T?l z1Zw&aSdLl%QrNdP{+&o)gBZ|VYBj(8)_AYTWl)t0jZ}7i@;6;%mpEg(dl$_At5;~zhbr=mS+2bTcSYqLe?wI$|Mv8&r+O#gP8 z6Yqn~_Lt75YZV#im))cB(VUSJ;T@&WaIXI>*#nrXD2WT&aGbX{uvO8RijGzJ0PSk~ z*%g;S6Pmd7Q;TASsHD~pR)XyqvUXSB9D+WfzSGE2QJXQO2t8;Hqry;%sHYU9ZYiJY-EZOmT+cYW^5P)5Ty;+b+RdfSK+v zJkU2!%HwjqQwjpujRP%!V&W|h+3vcAC8^fERpi24`Z$#A4+{u|jps`3q5E08XG&9? zTS(6cY~4y!?LiNjZJyz?;*S~vu#gc0)lgeBjx^p4_A682uaYbI4C~|T2FLeOtLJc1 zgsObM?n2O#li`vdTYP%$ISBYt;mabIqY#XkG+z7%tA1O-$lfc&Cx0zP%YhsU2P=J_ zRJPsOY$kB<^eiybgk@l~wpKCK)TX|KNHv zIZqP+Ql{GGn6IyUjweJ4T;!3APIq930~^Iuo>bTNXT)MYgi!4KWRXg^)O0O=6^yrmCc4{<+e2a-!b zY`~|yHhp1S;hxrVZI z=?RE9h&WpYLOi<7XDsnxP&`N7Lqh`PA|kO7TZE95SZCpIu^Xb%l5LZpeGQq@2}VsQ zOFx`cpow53nX;fbo#W*!r30jeVjV%--QZFc%fypfp;NuuPyxx+c5)(h9?q0NhOqp; zLQc!Z9q#1?Olt?gDVG3G@TQWh(KMH@G50z!Ei>g1j9WF%JGA-X^^Vz|Q~ym02=DUH z_Fk4GUKepmP9AMF$eGTOx4iJ^HyDs1(B}#lL1&{@P~lQO&4q17+9$M0B%7`t&O6l3 z?5*G_OTVZslp|Nk0**zAx~Kw=?96mGcH6;cFtEa-a5x6ZRsBvxSdMT+aPK2ap0%aNNRA1e`-B??Rs#E5U zsx`={ocV1msMLKgk9h)HZr?Mm_ZA=s!9rcV)6YK_IZwwm7bjsx6lwU5-0w!{#O0cp zY+FGoEsxI~_OElW1HCW75QgK?Of#&J=t8C{>fW?m0<~*W)$T`Y|u<=p{@BL)k#+(|DlAXcG zK)c^P%M7EJmkY7*jz#bUYHV*e&s-kc-vE0yuw#^&M++M%AGf=4u)*5cSe@D=VG^_Q zPy!lZ>#P3DL+404-!lobaS>vhSQqNjmc#BP|2SZOSiw{^(z8a@Tj=fh@P=U-)l^N3 z`=AmHXV|g=NUp$d-|_e{e;`6*=0(Y0g)fC3mc8_CDtWXXeAvjLh|9`N+JgL_9>J1p zKxtZm@f6hoqG=(hSW+|nLIkJ8=H*B-%V7-v|Cb>8Cy7JRt4fU)@*1=(EH?qTMd@R+ zU3_-apRqN``M&XaNSS4gj9tgB%!Q>f6j*@f&%Yy~&{_!wGyel?`5cUsox&n58v;HStCc-Q4orq2R6Php3U)`2uNMeQ#5|p$(O9HWWG& zq_l;Zo-mbGXd`U2M}acCfRL5K)q|8XETEnYGO5Fs(V>^A4inPox4W_%xZVkE929|t zGrh5@`N`!5Zjn#q?4=U(j}!~A5cx7q^=+n9a3Z)tmHAzuwF&jL7W4_0cYpVF)W$=u z=JCF&RFE{#w7|%^?6#h3gHyx;e%*-AybyYzOo>aqqpE2+xEuS%76JXh8oKLq4%Lj3 z!D#>pN-oHEe!}A%j)>glrGpZ|xz$b($EQC-iHK?wy>If66USjW7X)*Z0}@<5?4tBn z^}yd9linkc_C8ZGc|w}c$=;}X`w(bUkE;8~)! z7%ftYSK5B_ea}Yy7_dXKI*@vzo_&y#6-Jm$Oc{1>my?*As;_NS?+5}E6w+dqq~Jfj z%}#Vnu_H`jj0^|h{dyo{BVsAmr#$JZ3|`)N_jpqb(EFu-M)G?#$fT*vl#Sf-V-g<1 z@~5U3Lz1L`aJR@BxcM9X*C*HR+$xo8U7exY+q$+fT8Tqf5jXJtu_~kymFR>Kb)ECC zRxC?kz!%3mn}4#WXQ$KiA0J#T8oMX~4R6AJ%Qc!M^c3XKAn2m?QGFc1wfX*!eGf3; z-NyXZ%1XO!2sBTVL^v?K`bPUaz2Z+KRF{2U^D!V>UWtf*`3d;62gh&2gx)B;?h%C) z1NLud4H=4E80dSYdXp;roCwYz3B@!~(B>3+w?Jnv5tIo=uKem?{zNB~ezxJ5FMO8EAvz2RR<9y87JK_@u<9tA0s+EnM9@z5? z-0*#K;8?7(o8Ceh+rXsbJL3m>v0=Kw-KG*zh5+?<8P-!k?E?6gICv1K9VG6SQH4_c zqOyjdVft-=Wf9t^afhy-8vYeEs2A_;p?`{Rop+vH@vcfo37b1 z;Z$A;&NF$!CDb}zYw-i<3yH0}V`YQWCp{M@jEh8T@0Ei>@e{z69g- z%q5xFyklVz8?w6|3AIS^8t>*)Yzf?vW7F@2L45yACl7?O-DU%K*KhH0eF?vFz@9fj7lD0sb%I0NgiSe2(+3#2X*vfc;t>LP zZA7ZGQ~4ZLF4^y$ny{e8%sGcEmGCKB99NASYWxW5;u_-2MQsmCuA2*mrLE^P`;|}} zRMcI{Iu+uCu{5-ZwN7ZuvqHf!KwI}+R^dL7+W?QR9GXXedyZO)uG_ReeF}Ut1rH=v zlFKee%(4x!5AJOBv3i_2t1(Z502;UqB;XfT`>xY94$<+r3T*w%ahJoXZQVd$kp+Y4~FoS{5jc*(WCKb(nk@?YUO4!tZa@>|1+X z-fPW&TTt6PqIWzFXe7}}mE}thr6ydnhl061Q?dtEK>Xs|EfJ>%!Kc|8S`_OBUUZw* z%CqVx{>}3biockmholVtwhv4WFtG)`8M`;VICl1{^EMu-bv`JMTg83E9e6M@9Xuec zUuE%Y;G}LF#%pj|{{BeV)5EKT$Eo^ur*yB=GD$ z4(O>?xH71L6m3DRAB@3XT4*VI%NZ(5d6tOJybyW7Oo&Q-qpE2+xEt``ne$spAO)zv zb?KUd5#_ygg!V&T>5mbtkm~n5pDqDlOkMO@i_i)7bh+<^e`lhw&`njByCRV}+PEVY zzIEPC#>4eddiNS@DC2s!ufgS)B-L2f0jaF59`v>Z4*@wv0Lw)bm{OmUNX7`^SC6J_4I|}}9u|u1DEyQz_%#cmM_%&w zl-f<=ln@t6ZS$ppc_5fqSRyvFn%{GzGhe2&G{P$DfSkEGAwnBjInI8f2X+kBq>X`Q znA)B8FRk}5LT5ErH60C&blM^m1EnqNFpL}u^~T4JQsargn>;A-i!AsUyZBC_52Sz@ zd(~$&S!sk|!M*G47ZFM_Nu>#oI(zjPOhp-<^B)DYrgvqCcs*kS_^BXXPz`m{nI9LQ zsr%{F0{`Zwo9c-u1g+$y6mfti9_O78F0##ny=I|U(U<_op?w4Ip#3+8FrhG68SRnVKGdry~r+ zrYY3Yn<X0h)iy=2GckprnS`|{8 zGtb!|a8iyXGL}QV@ful=vO7WxOdHeBtLk#Lh*m)z(~^ryW}cq$SH@+@D4ZmhxgSc8 zxYeU0wSpFpf<2@T!@C;u8LnOM!$igl<_YuNz{?%L%EW#gXjfC!zfI}!^5!&PpaS?$ zj}(G-;O0ET3Pa1up6P}C7J37<&!xC!)S^Z`@Pk>vOmSj(#W2pyk>v^AWvRgFbg&tw zFm|t*R11Dj|C95OVm5P+a?bB=%h`?s0X<`2EDyw1^QXtdcL>!}_wvyW`Yo&5WQD2$ zr=2wj-+9n(CsbJnEyRGZ+hQ`@Y&P zKa|a*NPa>^#qZE+;gCpPeGsOGnD5ucl5>b*IF;Mk;>$hr4BxCsCN3 z&Ea4qiX#?%P#%TV{E_V~B|@SyC~YRptjdZHbCMCdSr3u|usEz8Z4&~w!X)da)BEga z(uM;GLiqM8s9XYxU{Z5rSo{F}B{Tk1B11c5j7IGKQmKg=#FdIF*lz8mL|)(QA`XZc znGKc+z8ev;>K0r^oLHJS-A!TDndpA&oMSVrcNloZCra+Ik!1eqc`k4$+QzEf)=9XM z6@hCb*SLG%KQ`$b6;u)O#ok22XvOsotxSz_Vf|vGfra^&H$v!IXJ`i|DGE(G*K-{D z7JaYOEY=D;}{l`dp3zrq!-^&hmiDSAT{R)Z!L5Lmrz9xRL@{~y! z8`yg#3Mq(*$Lv*yg$)0ah2yF$MqH5h*EbU+-ag;53aELXoX9Aa;gHJ=JS%UPG(9mz zMA0ef#!e}uCra%zRTzBENDBbv=$9%QR=(Zgj5YRnDIrBG4}tS&Nq3znHM{hpCgC$D z7Fwd%#Cp`bk}7oxx&dEd`HB!ik5;y=1rg*IrYj#)OnB%YDRQNP?GAyoQAV6#3P%&LP)^etQrT( z7ivTjp}2ks_YMnRZ-6HOlfH2op@I(Yr2#<;VniYAQDo8^oeeBu&ya1%JlRo&_f-&L z4}m`s>VhT5mV{x#{vQYkfFHme6LO0!-e>WrI*C$>BDQ39!-`h04?frESogM14K$oy z)pQ-*b53SHw+M2iR#IxSmxD*r;U2ap6-K<3;$iwN@pPJ_LE|P@a%zq5EV+O!w<>31 zKA^Dv#Ckpv$lq&LGD2h%t<3~z66wFiAC@D7sbC8gj$<=E-e(97zBLn7CoDn_1_Z!E zV;I&m4m{#dR=8eW}^Km_4a8r zTXpGn3^0&J79ar}YBCKjK(Z8!%CATf$E^0ZY(6B|SPY!z*}O=!y zpc!vjG|i-DzbA}{dC@q=n3O1e2YDCfpkk{e(7?y>j8D;tZO?jU_^wUc&O2AHlNO6X zSRF0U}$k|Rl zNvJI$gY{~p3r36sG=3)1bJVTF4xY1N=&3?m?1xbyo$`XSFq>nHw4i0uB9vdH2m00z(@|r3?vUfT7nL-&yGPJU_a1#B&U8MT6&3Vs+CvqGjnHmHuky|DJY>~t zm~+@EOxk!hneF7F;licX9Sm3=q+%AikF}M-02N7@;qysPqxCw=SHs0`l%5812=jAs zbe`2NhQcSh{NQJtMR)@7OpFtcjAV@exe3kw)9}y`Bn`RWyN23^?srG^m%GAr#cg{$ zdB)+VeyP=%K(DWsmy-Z`aqQ70`JNmQpo&@FiU$&wvYvS2k8c0%heYJ}=({d?45u_Q zzkE-5k4>8DPcOe+ZhH3OWRs&gbt^N+2vm|;T(fNlnx!ll75F}Vf9B;Z<=8DJig!y* zPgP{>t_fPdGPjEK*Fy+fd764aVs*W*wRt0J3&@zv4*h9ErJycQOU*qj9 zXuJL93nTDp9CbUzOI(8eP2wVx(5QXS80cBEpZe!OpSs9q?H)~UAA=|aCTfT#dq2^z z_qd??H?03d4i#pNb;2Hr5H%d<4L|3js}h#JN?m~UCa<~A1Nv8vth}J)}@t0VePb?IgW}0zfPsv zthR>*id7^Y=!t6|x2PpA47EFZ_Pw}Dv7)Ql^kM^Qy0u9^;yvMK@zN8dvggGApeQm% zfnEe=!+*l&$%&cug za!O%c+cyV_yHxwti4Ws7R!2~4ZKA=n9lUZ@?2a~O_4T^<3_eekK%&ncWiguj^ zBn`9IENw>P0ksNMHe_GSq3xi8f1ZHJ;kB~s=*i;RFAXba?Mw4Rf$2uCK6QIDc^a?3 zD&ZURx^QqysMV?yQRoQmlYz?9;%&u7s?u_oFvN-d9Uj8j!$)FgI;d*By)!UDrOc*I znAvOF7n2x0Amn`FXv;}6e!d=o*R}@PSTxPI96F@;KQ>V|aPO`c9-h&Q-qa@)8rDNU zy+NZ(Q+nYl$o8^{(ib3Cn7>zfT1wFv*w6LRP$JWDkmq?%=p28rdCs7O8okC0DsUy7 zoW~hrr5544%pWB6f}Gilc^0Hynb9;goKAZb5x?A#{?kg?%?ExPRj$yz2Ba7`!Tzz@ z!SY@R>a8Q`n@B_1x?wqwsFZ${R58A%h@+T)+Pd*24I!F~n_xol{1O-HE8#S=|9BTF zx!+&PxE6-fKdyjObP4AVi`tfeCp=O#kMg1+Bp%41KGr{&FreKtdd?3Uo{sQsS|Cj5 zn&Kf*QT9u*av=j}x6R!S=C*{Wq`mhO`b#&iLmC=6HUYJ@NXaQ5`yx6-VL&Nwe~Jn* zEs%8lSE9bwPL(xJ5L;hZQ%KNph0V7xRxj2yS9L{S!X1pM6!=#rL>3g*`!lnJd3B82 zl7ETBb^x8!OzJqaVBS2!OsFji^CqXw3b_pa zP&qoD(G>!CU<&J#oR(J86>TN{fUS?jg+mNXx7IJ?^aO~KL%MW>;vi?I|`7W5Cq%r%NpSm)z z1(bVQK4}4^ruddHim3Ev+lL_UIN$Evrp}R~KP;6nA>U9OHGJ@XT z{r#kHaSVpY8E`76g2i!3=U-~&2rcf70!s+^SNK1u$87sc+oOPc+$>82OLVMfxbArk z7;=_w9TZl|hn6B>nY>-=S_)f|H3N1*-zhd9~U-Nkw9(%?(tk zIM0+dN1J}PEvNbJSX{T7zs=*}4j750#HL@L-W(?-#9KwWF*O0t$#8px)-Gq1wemd% z>hC|ls8Wd6J^01D>Qj>*fxHLHZ>h%1QtI$snANT!sdx za2-DNUl6cF^^`Ivlu*VcnPX$Ok;`=pv`ry6t*t%}I(PlbWLfUKc@f_IQqS9u<+69S zC>&cX|4SQ?80cO-zD;d8?!?0n|KtX)d{xHYlCGd1K4 zOJDNPAitD)Y$Lw%Glzx(>8_DPRm&_L5ZDFFpM(s=guEk)&BjO_dv5E9SG$EAxtXhH z5)nyIoU$7kZe)IAc>D}ukxp{X9N}g+o8Y`z(DFWn`JuB^ktrD7$AR2OUpwea4Osmj zS=hfECRcJ;=bBoWb9Z?-4W4RFdWBTk&CdUIs5JW}Z>kQ&oA6<-pqVnxw%vF;WWc<%H=P(J91!llm z;1I(d20eHh2x?xSP#|#Kot=GCjTBUlpTCL}3V%s6y%bj`L2lxp7ka`imSMcNG}alM zKMn8)Wk^S*>S@zw@mey)C<|q5`m?mbnyuERHb*90(fGCAY8EJEUa=d2wR*UfN_=C8 z92SwT>4l9vqW9X>aYM0k{j2OsQxskm7V-gW*{u1pxEeKwCl9zoQmq9pay}%IizwN; zl5YTpOY~>M&!wz8O&PG7WQ9CvfS!d;N(S+Gak~%KrK`1OaT58&_)H5SV_W_kz|Ubs z#52+sCPXgA9r2^=^L;c>tD=qbeG_K#=VzUPt&)uQ09GUMQ{FhfmE%5t60hXw&1+ss zb7Wg<&!$57l#(^HdgKoV@5(vCB>n!5Y&>Gr{MWB5aF+cedj%jxCANq7P-yBqV6zcg zbQgSsr4bj6r;>Z7mZmkfes1fdz_u%?6`pup14*ENF=a~ zPbqTQlvIq(Uw)a2uToHC8?G-PwavNGPpyE&OVvlAMKKYsl` z9`eZIB;i@W(oEp0tx#3uG2~8$?n`?;C|ME4x^N68NZvg zAFOVwcyAbPnKbJ&11E0nD5P`YA2zW6zHW02j2+2p<3FY4*|zo~Fv&%hKNj@kdPqn9 zROj|per&Y6fbYrxe-cSYtPu^fn<>|E9XrS{6hf8?6085j8!)-)8lTsd4p80ewl<&$r6kjpp?}G z!M==e#M_8A= zLYpV@obd&I)aQ?)_Stb*^#%O0%gl9N~BlV*v)2_@-J{}`EWZhdUoRplK& zrVcl`X43(3^LH4Nf6LWsZ&TLos+EZ;u0*c?w@)KFV}VXz5*%b5Dt zW)LkumnkPO;2%jcN!A32PQ$N)btT0S-=}PTJR82Ue58Hy zuN5)MfCLKN?sk5z4yfa*_?K~?!Eq##p6m=d@>c!r>B#o+;ki7RYLnw22MJmD`b=Wc z0&<_hopo(Y%ht*)&ock5#xg7 zd#x--zpm3Y7Y7|7}~sv1xV4wUuJc?Kg^YC-+e#0#PY7 z?LitjJxJ2UjzXKL5CcgHGQpnDLIZbLpd3tZ%h|p0Nl_CILJt$ND8=+ zIAf6`AH9L)B&0br^7mtXYf9P3zbZ&_3VY?7q7C(yKhW0BOQ z4F#$C2vix?#W1T*g-qI5-R~eFkx)32^;}mH6R+N7ej0m<89fmwhj@I4dLKO-Y^1;^xEj)SRq3pUiye787X+$$!2;-MoK@&f5zG!L){qFS1Wc0kU)14dvVbs==>ka5J# z07DrWS?lT^>Z!k3hD{g*Q|+Lhn|{o*=;7=xi;ZE334xXWra(ycVD~i7oIt6b-qFF0 zW(oqpHH?}LIx7?IC6*5N&S7jPF3bCq^Ph{c2YxGbu?|B3#VpbpaU^O%-)8IW0;E24 zZjjE*J%J4`8ZSTTW_00+WKhO(qDe4W^#;0^`%2pH6tW;SAwn7f6tj}}-R?VK@k8S( z(`eS(Z*RBv zofT;(MGswL^HVH0dfKMLH8Hnv&mF7*=`!A7B}|>n8FhOF{|I*e34I?#!BvKlQ+%~G zpP#IK#^vol>&1%01+er!`YFwrvrJ#}#vzWmCAz!G(x)!jm%#VK48#2NITwx6!5tV# z`GEUbKF}xC8cLA}@{?&wxct!e#eAF!sk{D=n0l_&rUuo%m)rj^1g!9=WOlhWiU0xmS_NVr4D}M~6F%BBb0th-(<Xq@lD)fm$;xV6 z0qKTmgDuz7Jo+Nei#Xxy2$?|PvO>L+h*(;VpkPSZASrme+N1&#p*XX52L7p%Jw5o7 z2BXm}%LDxcs_``3;yyaer^CCmUuNg2@U8GtC#U^E8Kb}?Fq z1llZiJcZ6|ZpgIR=rETLP>xBTC*u?d7g-8iw%1iKrkLq`IAno8qUjAH8C5XH8(O8KZqp5%J5^92{_hfT= zo80^undB}W+vBJ&BZ&=AeU9|ni2R^O^IhDe5s?+?gNXUbC1fJtu&|Otf=O&4CP4P1 zf8FFQzBq(!C8@yLHn1))+C1Yk{Wtti2|-KM5ljOuOextp`KjAFGjj@}aznp{!Iqy< zYtf>$!%C1ZCNz+fzwwH|#+esGE`h3Kr^YW8XE@l>D4$S_;TW3g81y?D z;zrzkO-OiCm>dy{CC=^*dvr7Q6+)@-nYDJyb>+l?#Nmk9YS!A*aXx zU1avKy>ldGR9}`S*IhtoL^Z^}F+SBItqP)5IsZL|H`@l6m#v^*sC7Yw(B_POa;Q(Y z$4fF(K!<%%Yd##ttS6P-0^G@@TdXXpI}+ye=WiMNmmtLUl+&Y9Y?5~ zYSb~_Ks#i#>z)&uuh~S4$FZ}gHya#YgOjsk2q>EL833X>$JHb#xtk4NMrj%k(k^H% zhCMmBCA5TMD^IYlSd0#+gBZ8vP-D$kQ$}c>@2HI3aFO&3^!-b6TlaJ<-$?UF>Y)0)*o<-YU0^Kr8ZMM#+I{$ zCbO3{(LW(ZgBN6`odD-r*Mm+I&VS#_mz(dO!5}b)2)TE#^Ye(}@Cok z@z3FVBusK@VrY4QXdDqRTKC^flNNExmS;I|HPvRX=%J08%5aVE4q^pG+Dpd+$Y~y4 zE!DUb19(tX8Egr$SeQk?;#Smr*iNkJpzzDLA8`SH9~%+OAd(*hnuqBcmw8FW^#Hr31)jIw+9D(EWn5GQe`zXV z2Up{NJDcBQO6uT6PO)g}1lVgqo}cZ=?RI*1D9I*V_21syMbE&Vouu0%N<+z-}Oz< z&$urlYv57??2zGuo}dIZ67n-oC`GCwU8-cpg=P+jaE zGh(gu=;?nw#7F0isii8wh=Ds{o`+JoRbddQ068Ect_-eYBq&HWmwJmyk3ga(G|1@a zTMV9@NWN0wo4&haq)AYiIkE6P7*UOUx|R0uMfbSmO2|)m6Q*M86(hMNJO34&J6@AI z_agBtU?OmlD{f1h8z+G{p2Hp#{qpw22Qo8UQs%YXy1-1T@UI4?XYO@TPm}tRrRus=l9kzOu0D|al4_+YQu7ZbdAqCiw@p(e#;iO8HC@!iIEMy>|BqiTc$ zxnL`A)+J!Sars0QM8|w!^P(EkG&fng>^k)d@3&&+QR0(B(|PJ%GlFeOh?{q`K3{lN z!PYhX^1*X$5-(Z*%wZ{3{_wT6QAG|?GW{Np`OpZxbxN~B*`ySPrM;XIyQ-OrhUAU1 zi9rC*SY?YwZ0cuO>=&q`D>mDpvYceXtjOu=B~MJVL^H4|fyZB*{Vp;4b>13gN8}o`5wdd%WRc(4G7Jt_l zXZ+}b1bRNTdT9->p9k%-EVyCji=2jMH`;}|=QfCn|Jhm0D3B%xJ0Bv3dHFC88fYSZa~j!8AS}GfNELZya75W5A_PTGkZ2^#E()7e}L6ZLg%iD zGHloV)1Q5AV@pfu}IZ0)F=ak|#Rr?w> zJ+^xa^j@bJT>68uDXh_flhR|@SV%wZ)9)z2Ru(F%ZL9Uu# zw{}2UvXCBY5Q(yBt6a^s;gjpVu^QWD)xw=i&Hwj*78fEo@=f2l8)ZSNU;wUCOmJRY4uV8kv`(gRv|7=?9JVrS~_knTSw)q zKb)3_2jtf}{s$sB@=$5baL{E>oG-|H3 zl0y@pqa6lF!?c7{Npp7+w34o#GTY#p1GOqYI>N#zcFXiPgB$F{#8IwkSkn{rG*`_PM;)YQLMnu{x49#W}MON6PHZD=(d; zI#M_=P(_sXsmF4kR<3kzRICqd&8tOzK}25w`;qpl7|9=h!{}*fBvikPPd2ukiQ!!h z=b8WhHi{M>0qB)F0q9@{BM_S^!j~WMcvm${9?mv)%X^sp zUqAdfK3>TX&pL?oHe?q8%RzZ25*x|*l`5W&qgx~h9hNVwfy2qF0T_5TU7 z?&oSt6%fA&v}Lj)W{Q57imQq`VHysU7>-~pO^E<%V$g_ahxvr-6RzMSZPOE|^m4)z zIEjMEkupQxzG^~&v@X=O8^lWtd8kZxasGT) zev9@ZeH)p2@MkBrs^0>7X)zkKTs}O}VL6i1QB8oH8m~pmg)KS*=OVUp(1l0PhsUw| zIDN=1A6L$tr&Swd%PCz;b2nRRKT&REVdbAcc2kD&vY^nYM0J@_(HPduL_Z7i!Stbz zQ51@eeNf_L7uM)VhVAFFwPEt?E=HOwz*L>Kd?>3+c0lq^)Z?wSMBlnJu=3CDV->l7 z+j!SFd053>L9akkNV}4^iolOw@?GseXw}~(H5N|0ehOU4avC?oC_NZeRMgxy7gbY~ z*ooWhS)7_Ic=e`MbX4Kqu@=oo|FYH!Mb6~r7ReKCwImskXzB1{C+^KHRL2|9^;sk! zeB-w(1Xgg2b`hx5pzv3yf#^Y!CIt;z^~Ru5A0s!JXRRh+q`+IBz=!!RrsTdOD=V)Z zb{{0OJFN4D+82iN3Y852ya}|Jat4k+q`QrYpbX6PZNo-LTIfdSY8{Q@M>-DUSHR`l z{Ho`wj%HfMm!jR-LS9NnF^gQkEl=DM&2Wk0^ojQaTkR~JQMN+Zm|>RNN}PPSwB_ze zhx`O$CGL#}CKKiBY+w_#*=p zUVvp-jkA3L$oBn8oj!L4^`JC~@aG=tQ#PR)cpvvVZLfDQ;y6N@4#2*e&on4K(d+dH zlINwr*QiXbe>R2W0nQaXp2T{VgVBWeYg{grESg^rY^?q-e$N!s7)OBy?~Ei$a@acu zAuZYEvU9F}Jw)5dMJSMq(i@v?o1d+pK?)EUs%UTzqG3CRX*w6kg%T*;j%+2TDeeq$ zaB)l;Vi@r*u`#Je3?9~t7?h4~s#%op`7!43xP}5R{^|vH`@Ev}h71DFAtVZ%rH=sq3BQ<>P43 z=zKM5a4NzSv|ggeOf;)pMF06RjS=iM%o^LA#Z-_w#X z&`}=1(Urdz9{UV&z}ho)bi$_)Z0B^!Ii_*LA@V3{11Du6Og7)O~s<=)|GFmM+jOw92_h>J*eSaAobDLPK|{HU|K$WTIDmApq` z_a-fG0dtF}9GF8|;oP4S=?bxeJAgPBklxAAyV8g zrH83%Fv$8gGs|C~uA37zcbjlH=snf) zjNZns@az87Z2k8?1omoaiUXnbd)?__52Olr_f2w2H@ghYHVoz^sfpY-QuY~e! zi9%<`0XSkzcuq+>OB=m1IcL9skdg#ets9?f$M5a03|7*Zk9WP;BE4SQf&OYm-1#?By16#%$VmE_kFiejr@1eY?xo z04A5B>Kd5ZIenJeP*6SlQ0}q*MOB={Mtc(j4sEn*nniZy0419@du3T{I`|fN-5rWE z`sbfE;Y`@~gIf|$-q}1?$fn+f_}E`d1Y3UmjM5}?Zd6wyd;fd++OpM$E#y;2HyRE1mH~9$)%a2wC zuaD^4#(u(fX!GxWN+w0tl~^Z~6dsOC+&O=IpK+M$W^hV z>W#}Y)ojE|=b&S+H+-{`)9Q!Vdn|9)M4NmILba%r^Hd&lI7-I1CoBvP?NHVfm5vmx z&L~C>#F!$vrobjdFVBWr(oxGCTj~HL`d_Z*lqdQ=Bku4<;LQW>$6)PFDUjXe zQ4`DW7C;QOr~2neW*iiQ72UxqDbH$siRRO~j3!SBKDNGyI%nhZ1#kne{${_g+UtuX zxSL9&K}V&iOS9W9)sCCi%{wD^e`#Ub(ncU`?2R=Vd>Cs6U&e+SMF&s zxw*jOFhsz16nMWNUd8(XQyKhPgtg$RkXGcVS1DjOqdmHn$1idq9hyYMQfveEc)j=W zsak%|1+H-sg2(r76k+<201f;~H@jV!{@?BE8a}EilrC(R(}n#(Q&|^x#$2a3&LPkY z17miguZZ^0$I%AQL=k3_uV0Uj1Gaq-lZ(t_jMGu(we%|f9q*(3)@eRyf=@DlDrXCqz(R7|L+nG{Y*Ar3|gd6)?iy~IH=blk_3jtuJUaWl`_!u0zrdJVN#%<6C? z-??^cY!lLB^B^`1AIAAH@(+v-6M%CIj z-#QS$`xyh%tbIr2xX_@ZKcR!-bVWuOiKAr*v8BR_jYjqj+lG=rpd1dhR52vCO~~_| zR!Z~7Tc;hLGx$Y1MPJssSK2FlFDr|8>@(=uO*G22QW1B^cljU?fywlC|DwzIox*${ z&~uS8yVd$T_7h8~)CLY@TgFytZ^X_cb+BUk5{(;}H9`Iif0nUPnl+)pT6qnSEGfxK zAqHnnd71gz5{r4kygAqW7NkKiM!G{Y)1NV&x{UNXffq7Q4ezx|| zuz~N?Ws4rF+7%gj?9n)NM?RPknDzdE7iy#oGA&B!k{|x^pim;22Xc!2f>gr+W!dNJ z;(c6<05wGwv9f;`E8)!s;zlcm;_3GG5%D35n>D$GuYJDY4WkHdP{DCeCqqANtN1ZX zzFm7-uD;?^__*;GU4JwfhiTNua}lNj?f$rYigF1>OzDytW>1pOMoZ(VVzE8}P?g0H71`W~yd zah8mSVR;l``3r~MU?BBx=-Vfd0Wrt?2vA&lFq+*}7*|jq_tH9{5AJ|) z5;H@Kcmuxxlgq1l3x!xbrZg<_{|iLRKtu^;~75t`|2Ai zhb7Ps5&bA*x{||W!6sT7HUc?qkEU2?R7f&CYJwz%&|Y~PyV6km3`bhSY~~~%!+;9K z`|(M;jGc=~c}#o3U`k-Alld007YLAFAmN)^!=#Sw@5;on2yj-XP7RMXS-k)LCYlaT zR{o=VE8h%rRF#EqeEmDl z$XHEiGP#Qc^G%aeQ}cMnS%2p%v=88J-Bp#Sz61NC=G2@xFR;QL2`wzXbA7>sKy^Vr zE~maCWGy*P^3RV>jqV&O(%6S)X?77mF-xi0&H>F+i9nTlU_9R+!Q-=@cKg$zAf$5T zKtI9@>GnrQp_88_LznSUFajuY%r>tBpSWkd&+{G13CSa*bjERP;FO~Ty`c2+DO_+n zGtAwJzMcut)V7#IiZ5>f*V0rH8zZmQz|ON_wDE1=Glt+`#&QOJ%jJJt+CW9J4fTULa1S^ zl3wG{*_bOEZCtloa#SI@G7J6bHGyZ<;j++fSUS^WOBEkq=VYclx2Q(W|Lr`jgvIDG zcdR}ZlJV$46P@dZ*=`2Gl}1*}7fiadB7o}Ggh<}KV^?Ny>F?i!ynnm$73=vEae;)F zG3JQy7sA#a|9Z;pLPNa~TM*e5^@9aUAtmatmm6MhwnU8h73i+ZQ;xu@1eL^Kt=^*T zIg>Ffp|E=&3h-L<%j=3b6)eLE;!s5)JSV;QFFiJAGbv6hK+$Jg4Mtih_N~3v@Q^if zWW;O0Cx};icgJr|1agmWw1WlAx+YjoWV-ZY00SBIkgp4>e&S%E*tawDjO648h2^9OS%#vIFyTyg2xUeR<4{`>(m-NR2$16g|F{By)H1-VCGQjI;#gM$Z zbdsL2vvd(k#S`s)JzOS8PGcPmaXQN|yD0RQ%_X6E4bT37`CN*lq(9$#Fzv4 zmTF|-a)u^7B013O@N0*&`*3i95>(Sqd16qx7+-!lSey9P%%xSZV$!lSScxdK4V9Bj z!--wW;Rl#Uwm%5+;xSgk$#R+17T`=^=$O_9BGVd@-Ec0jILX2;2tEzaKEjBKQH}qn z0|(9$m}$2_d>SGNTXz|fJIGElC;Ud%Zc{{Vylpo!YWZP%h3!={VS3d(CMuHk)=$&Q z)5YJ6p;JRpNdtl1)f#^{Wb->z=Pmv@L@hrvfa%S4NIBd3OJi8R@^N)I_Lyk}D<5f1hpNztyHsbtD!q9#r4IxUNEd@GMyPa=(hPi07 zMc!}$`L$SFCa^B8c_JDy%m+p3S`fPx?dTY||J0aL&*2yx=EqLxwqaVR4UEbybF*|F zJOZf4?`?dtTa|bm%}>Qf(?I!!uMZR~N5J(b!K&dg0(2F$c=+}){eM#sPn$fGR}z`@ zkiB)T@6y0DYeSwNp4R>RDIxTEpdSdaeSH(wCk|!bb1zvh`6gV5qk@)0nA#7fkrXTI z9wk~ZUQHyXiIZF8y)aM`PGaoQYtUltjMlWB`3`P>OVCT%Ow=Q*2TTF;BW;tE8_%)4*;UACy`4>K#hM44Hr~@|%+Ed=S*gZ~hmXmkpX`H{=vRpo~Q^}Qt z7tq}Ty%aW=-7WTrUDdMDX85d@n2{mJ+Ifnga)QSZWsL5Kj{>I?xUnK_ax5@}Jd4Sw zVUQh!>4N5Oyx;7`2f=$7Mnz9+@mS@(d{ng$PpKLULD^?UnoT2%NLXsjfo;mA<7FdG z3sEn{6oi@~7xj0$etzM#hBxguor+mtpd^P!R$|?M%qgOAs;8ykc91`%4Z2I;F7*e`4nI_GIforP{Z@ZD8*0Re&n)MIyp`X;x3DErMu#C z;NPxvT(>lBRPF<$0*Y;f8@$N88jnUR=b8MxmFjjLPl6&Q?AS<1+L}lI#&|?!diJe= zIA@*Y=MUL`{)VWEL?(PZSPklpVh&Oqd>B_plt)>3v3!BWu{+a5S41PHiu`2Rw0oF? zPtTUSi6emvj!{a?mvdZpUwk26@40Th{Znb=eR5}V=v3*pm#w9YFB`9PIk>#DLj}R> zAd{(zGSIz%kLyI2cuET8m)UBnVFP;_0Zii{h3^66T9Gqg^pwX(ff^`hRkM0svs@MB zFoe8FT!~IgV|RNN`O~~D3F;Yq{~*v(s7uA066Q&zn!cA;4YBfsu>RE0js7%|;Ad*I zk0cZYuxT}y;4m7s&01vHec8wX={xZ>vY5^gB>=Sh={zx`k>&zgaZ+g_c)XpH?dWRk zS7UO*dAgK?djHm*Z{xFrcbQKrgnb~vzDT#1+2r6_tyUH>LgL`vj~!kgw0LhmjX+#U z(0B|zkyqf&NzLM^=nIJywnD0knruTc#G&6> zL4VL452k|rt=;;xZB%!?kDO|j{>3N{$UN}NW%0p{#ttxDR9b|M!8(($kYoM&og@kfgZbwL($$Mi;2w#x9_!4%Lo)K?iXxq^V?ia5w;-K z!MABijt|nAk=F4*-lC}jU+@qkP+#!u0 zXI~2lo_WBjy4(Jt@&o7hUnFK)?0XcjCg5M35B2C_ECJ_=S38n=nb5m z?rG5}T&dk=Oac>yHuq+{N`IAXyEBOp*jwAdq>b5m?rG7)fwxMoNUPv#Z_1Lb$ilx4 zg$|I6q(+7=1*?79-U}#9coyC}bT)6ra8fv&y1 zD9(0I30V0hWd3qd8PPAI;hES*!%K<$LT)z}ln~Le(ltNB+GG2I* z&9)SiH@YL7WzKl8CWg9PUs!T$mRcOY72@k%I4MajkN`?QC}{!tikLhhZQB%8)NV09 z2s0V90(FSkQ;{|otEs86ONme8t6b%zpp5MF?SkXPqrPumbrrU=0_#$KoWBZ1u{|!6 zO{8IOJ96PYf)hjol^OXwke}NUsw?F&yyWt@!)OFDDGB!cCEOGN1AIe`V%d*lLuQ;R zuM<8OjYJ^5i95Wa0|Vv8t)%D?ua|&~$0Q`J5Gb|3!$5Ur{IaNSbFU+paF9UERyGG4 zz}zKEN-&$fjLj*9^=QdlmJ_r4;?Xn@c-1x(!eiWB)Dp3Y`v5Z?ivor(LnJfaYpif{ z&kLr^2ud|mySFc8Uypq_>2=mvL6X&W6M#F1$4tuV zH$;WE*MGdphG)TW`~5s6HFRn-`>sGxfM0qyQI1t4M$Ox5G9ANO-tcz~>;&rHsDpfE zBYFwv)rAmo5&$14)02T4VZAR@l@ZXG)?cbP4h0U+Y|K20)J_2NsbaE+i1Quruf^AUn8B#zE$=_!MS-R02gW z|5M+eo;l?BtsfAwUu{7M)w0UeGYkd$X^~?p?9#3q0xOPQs;k_>WbRpSGo5(Ql`!S; zeBRY}wr(A@VuL?|wAoa8kwx2c~rRE4# zJt)0He>wkQ&$xh2A3BO=-ps9rH7)<`SySb z6>|;Zmn6&y&;04(G2b2&Pq92emGcq-;0L_+NAwg_6Nhgc=_>e0t9s~!WP?N=P(NFC z0_KIWe$4#<`_ZOC)A_k>S5kDHjhJSW$8jeF`+`eUj=aYwr4)m2B;JZ2K(BfW&3eU2`U%6xl*B*LIjD0afS8Bk}{wu!V-X`&tza zJpr5OqBt5XHpPF$mnxzTav8dVmi?$Le*slB?B^P)GcJQIXSR85=!Uwu`1IlVt@ALB zHM8_p@W2@%BG7W-u+={gT-ZaH338h<3_BBLyTs!baDKDEOUHC*Rt8ErH?>*ks^ZGwPPC38Y`Ki^`5j)R&}g`W$1 zbV*CwaR6>?gm**@@B%h51vrN>KdH ze==3f@PiO9n;y5`zTbn@P8P57_Du+`Dh<=9J)CBTkRmnT|yvGi=cFnNERjhrF( z`~uy?N4m1|MZ;TPUfVca+3a{j(&@47E~UrD;~DT!>iYVpOOLDk!HS!jAHC62$RJl+ zy1luBEC}sJ2X{jZVH&Fdyqw3Ru3gzId+AQ*fyFv2>0u*q3b1Z+ZVl+@ zu_<;|@!y=@qp^^%DtmEwVv>p8y^)m3wY@-mKL0x%OERH5mFVQ+J;D=Nncpg=GBPhK z=eq|6K+pAjkRnb`xkAe~0?a|XJbl>kzt{;hj+bbf}891in|-TSXGHQlmw5%HEF!EH7P!)ZA_u#srFu2)k^4gE;PoU zax{*hTmdud=YdgbzbA2Dh8!N_b|7Q)kz)MEYPY~4x~ zT%@WCRxy`mVV{QkL~T-eU%OLDB3|lqzn$abcrGu%iyt<^O$qMFh68O5cKoRa10I%} zTb_OB7kj_vLhjkht&X(hdMk$p$1BZJI`4m4xADUX)IiX90OssC@|n7siXX+dN}d!y^31-mF)Hd<55W%w04yoZW#JbXR02b zH|m%^n_vU9Jz9$DKhBIwi+MaTh48h6D@hud>KOf7#nbM+L;;0uDa<)uQ65Y^#%2MK z1tlouR5HG!%9>Md%9|Yd3mv<^mxr{DHEceP2x?TBtS70a^wrxZkz^0PcHI9JI1k|Y z7jT=W5$Ufraj-VXyFO0;1x0@Yd%BI5-*fXkwUWB{jw37|UjO3>e2KNpoSj}F^fSBg z2kl)wbT1%f(i409f$`ygxk|hfLp{Fm4N&@B9`xclDt@4NzLeN#Y19zI8Ez(!)1muJ zON}|@LqOB(-+@z_E=>Q|5aS8DJ9@NuCMv(-MQFbC&b`D}Voq+>)Q*?)vOPgm94IMt z-zZLzjRgjf^X z1kWG(%Jx|KqLhAVlhmOk2g}iZk!gR=S1>~-oXAZY6Ta(jYN)X-75`Bfu>&hQulQ{= zHP~7P)rl1Z3D@pgVSQ?UH6?BAF!5ekJWzqrU4CcQp9NGT(&LGYfHG$d_e6d|aNx>d zWXPth`IcmA(|_M?{r9;8bL)`o{|94(ZlL-wR4MefMB%uYA7?;1AabVGrSohP0)w%B zjNy}`t4PUVAqCGte)>I6%P*YR=rFxZsHl!;zk3{7f$N6NjDn;N)8^q0#42<>#Pa-pbh$(@66%X{VrY{ZHE zW8>fBthVAgg0Wt1C6icV1@JZv*b77KTU|jsKsWxAGH1XTMP=8cN?LT-$o#3|-E#k* zg03|3LX_D%pjvwkK?4)Z$wwCPL<3MZQDH;eE~?@42x4A`;M`Gs;;?H^d%wt;7*5@OlSBP5k zS7-qmCHiol>Q8XqfhZaOOYhtD#5i_ z%(eYbRUgifT9?DsA#E@kZ2g2Cu_$|D1q8)DPU*!XiUKS58ub9KovGX?WLdO6^L_NS z6FDj5B~ELI;UEP31OdS&?;WYOY{Y6ba_^Bk41GobHF0=4uhN&HQZHYi*+%TOUQm}D zm8SFWL(*CF)xI+q1fpXYcBF>m#xg*UrL|pFgb+K=&R-YJ2XGadk~U?A{Dmlfs7&FR zHnOvU^_mDIEHXp!+|vpXzY4RDm|VkT#SLEI_!i0=|D>r7#{#i){y9YGv7^@K!!1m|&8WS=Hi+DO z$@N#=1)0P!Qgt7|0>EB*G}D!Ai&?B-GdR_tmA$$X*v+GEK`(y#fN9^5f=zGtM=)If zGi6z@js0yt#^nD@#nEy7cOH93Tz3(cg?Q~4I~W+}0S^UGpc>5-?w+;$|2uRTBS=OU zsxoORWBCRHJdqMBLTuE+06?jdNGcrdix?q4i3UgYap!y^6tAz5)dm#D4m$x1zVHtt z?ZxKS>JU>LEgLiJ5zBe~!L&8(+|$Mq8>X{h+_~z%vPgkgWtDu|JDOqX_FQ^W<3K9s z_|!C>(^?4+{{sAXpo)Q!UGgymIZPu7D*M$6Z=@<}If*TUQ>tIi#BVFmVp`Ayo8zQ} zY%{a#TJiFDV0fQ#GG<$>qFfiU9+>i=;^RVO*a1F{UJ!D9QC-4yU4#=AcsP>k+V9f{ zzDDH?qyb1$S}^BC2$4H89NCQz6`#qK{LvN|px!*1)HoABnNA=hf&}OEi&)%v^8+Nw zlXsL)&+q#?{q~%-5$UUe$z1B2#*D%W4ruT^gk>&!;$$sIaPyj?C%P^cGc{K*C+n}h z?8T9nCb-yt)PB5>6!r-phbsoLc>=J#5kdD@XuTuq`HYlY^ja3MhCBciBEyc4+Ygpx zRdyb`YH{^6R8`rQfM8k1-=}CyIn{m_Zop*@wCIDkK_3`Wbwq+9dpfA3O?(ei`HY5C z4k^usf*@?W6NlG24|15Fe4#GHW3=N)AJD>MfxLf5Y2~)3`4@@t!<5g38`*HpQflPq z*or|8ljwVMQgmQ=N{s65(T69ng*NJ!HFyI5{V3HWIcIK z0`H~es?K+Xv1u;YS2#7Q3K}>zfYwe5c0A3dIc|RM(t#nrLbEN)_!0niS`IA5j+XB7 z?cp)U1(6x;~|d6x*ugN>WV>y1y9?3+PIB&7PlOZkhR)B8J|w*(8Q@}W5d_G%y{`csOq9U zDj4ri1n?vXuaMjI$=4vO;@I1*nlqoNm}~s~R*p6JHCfANtau%WS4N%Z4Z>|j7ZhjH zxa{scG2TxDM`O9Wd&PoWzihSO5aq7VwEzqZr1gxG`;vx^r3G*7N6}hBvI>rQ*Fc#! zHy3aeSu~zq_Rq_~&;D0^lKgP)9m@qV$!^C~B~G*~NjhG%IfT1J!<2VJ zdL{opuA$wP3kq8j6__fNH<6!csy3C0 z&F`vJhEbRr0Ppcs=>9sCaGLkXPQk&O`G*L6*s9{~R)A4~J&hdwMhC|2Ah+Q(p6HIkBh0QjF>Xmg@<~IqXxtr+)*ec}(kYvQE?qzujW?@Gc8p)78k>7Jm}28n!p*@9 zqWBLrddR?8iHZiuSBLtjke&s4Wym%xXTE^wyQ_uBiUEG{{J2K>NW8)>mvVs;KoN=vUk)&(W9AXL;1q~xCiMm5fPZ+?VC!<2VLE+zjy zuA#}53=F^_yF=R;IaC`=Vc)VmhTMgTnZ7S>o~21i4G|UkQgm4PHjzzym#%VLMhOC^RJ9HS zqtdM3Shit=K-lc1>Ghp-6$D4_w5CsI&LmXrtTP4!A>7lUsrB%ZfG=O9ja0T8Dr zS~-UPf2=pAsiD~bK8P{Wn|o6!{ZtPQ#gDKiF0hCzL7I%%`8Ybma+?6d6b!Sr%ew2B z%|Dc??A0WqF5yMa(b5`Cbekb?i z0@1}>)e!qzU8}r~yWj7^&TA~`Cw53__tTHSOXlTq{ij`)t8YTnU#LNhBO9c?M0MtZ z{{1DjtT)K{qjv}cuuSDYB^BPo(@p~8k&I$ZyaI@Tn%_ut*&45#K{N#KTU5sB_nd|O zr#(oKR%i4Om)s=L?JtX(CbK>jN}^bK8iH{gqS^wLc>dBY`#V_WK^A1|S{6}geV6^4 zT}l7%*1sSe6MeWfm`sbuA%(su2gDOh%Tu9}BVS?y6w7c9X+y&B;bx-ahf$zj5V)47 z=e=E#qgo+G?O3GHbm+zU?1N*^NpaiuwOrSZpliN?gV$@^2rD=k{!^d08+LPc19o(! zC$7KELHM99Cl~sRCOY+=A1~QkOtwswz4~9Hc*eD|_aaraGKeh1{rPCSBQtboj7aGu za3q$mUO|)d(C9$kLE7i`*SZA6$d%|(Z8!}Xi? z)>e0Troe-lXeGY+txh#+PL?}tmbycfodb_(L9}Muwr$(CZQHhO+qP}nylvjLZM)~b zNnSE|lbQJkm7R4eRdv3-R|z{cm1JvXcm{KTF7ia&b3O)3Z{4}twbNYS1n$@#vHwvX z{?{mD&XcY((-*dG?}2T`6{eV^w*$AFNtY->`9mgG{A+J8f9PPu0;hwpA} zVKc}HC;f}^UCFh{dWsYpQaKCl9b=y>y>k2xr)-Fuip-UA$S=+*!+9NGk14Zzuv*!USZq@?j z9x6;uzF4R)aUnu|&adMFLc>mNN{G##&0vxu$-UQPVkbad@WxB?hU(!m@e&`U2^BuD z$(4c|c`MR4?SP8dLK1Fjs`S->Mu=pE0!MQOZaM&m_)F*0B19e%q<4$z>N&oQ@D_Ux zffH74^Lyy|H1A_z^demql!KLdIZNy|YuvG2AZmfzS&;+jLt=j~cbNeC*WQSGBQ8rh zUR3%LPBP;jarUSrwG?6(OVSfEkn|Mf@?-PRaiErA(N5{u*WuV@>XG(zxMkdpin7oI zULHt~RMsJK2J+z2bJY0J67O{~$ZQDf=JRhNX6r}ygnQUsuy;P*vJ>7;?(eolyWr~v zPfvOdVGy!R{v6R%+k-XpobzyHAFE*6z^B(&z1!VRI= zphqBof23QDG2vn~ci*dZpnXU_=b98GLolZ=H1wtcu&g`&5LxB}B9}Qw73%hkUNmZ_ z2qS)|A&dvU#{E&!Z05|pf~?>DcUuQQz0;2gVE|7-2TJ4t+b^YLSR4v=&;rqn>?tHG zC860ItrAq}bntT%$wif)?4J-m<9@UTWBW=bsqp&Ia7_;M49XCLNFA39c};j(L01X| zUi3XQTyoxn2=|Zn2%(RT5yxF3-0AcOZW~NNac44BqerL&_ z$nMiY$>j_{E%$|tDOG3qZb^H;ed#J?JB`6|xtg7J^^#h>BWxR55gZ5lmqsJeGmY%a zP@vDw*4HAmQk&*{)xD$k)A5bxio!iCqF-tWa>7LHxH-*Xa}M&I77~y|6K^{Zc7M+s z{_fv6w^6+vV<$Zoh3J7Aoa1}leoc{G@)r>Ge$LJSX91i#d4(JjPSP*X?b(0tHWeV4 zFZm@EYC~6{+H8MZB0#@{yE=o3eEtI>CSuB|frf?}=BvrDg!QdtEVAlAI&|F8DdL^$ zZ|J}T-#59L|Es}d#1BueMX6e>Ji)?gq4A4Q>5Y6M#rTux07+z@5_jS|iN;5RDqQE- z&48V)Fll?4bfLZT{1$+yW}^Et`zN5gq8&uczNaN{)DUifPlHlhaeqnb#wue@lFnj zImki{m~CG$QpW$3UL6+$YCnS{+)x=tVwvf?jJ6sC1;7IxyLc25Z6*=;!&ZWfz7Z84 zTVOMOGGdy?1|l?d0|2WKkJSmKAbwj(b%8VkMY#OI##pU22!q|JKzbQWH>*y!sYH}U zb4cEC*N$p`CR;h=5a^X)ADwRuMoMn`q;>fVeEV9DwDwnSfB$tlEd8wzAb3Arw@Io0 zD&DDcVunBNySlFrm{ye?5NVf{j4%t<7^khFEM=<#pb0FOUQcT4D&63V9X@ z>7kh{UDuI)%E*i{D;hza53Tlg7Z?D4FtV_`i!=+fF`C=Z_(E@-MCJ%vJb}g$RpPWK zx3&<$%RSF1qDn2oh+Jo0yd>;%I((KPeU0@A3PmV*R@*MN|6v1&L1i+nSPwXP4Sp%R zroJHn<~iW&eeMXBt-F4z0P?eHBCYoq%K*G%^a-j;+hG&cj13ZK1g7zKrRm#B=XwRJ zC&0{zI}$Dvc&sfqmG>W4C~;xM_SggLAV=X4qkjqhP^U~8Xgs>EDiYqZdMvy;KOrOq z{{t+g-LvbzZ(9Ni-aH%gNk{q;}9z7?j?d6M7;V&iX1 zwzgUVW(99r`oveDDgltKUmo^Lq9gIa)=Fq!#x0iZW9gh1|Apzm}5Jm`>b+!F$K|y%mTVY31SYbS8a)xMKmpu+2|* z(HJTFfUl*NXZdZ{PIjTNTLYj_peZ*Sz5Q#X1*A+l0AW?hPujvmpoYy#c$rp8x}*Q? zUcYQ;l7EiD1ElDVC$13_jlExu>vuyeQ3Gl7`-0PSdbcH8=U8%pFJRLqZ$G62Qu5xt zwjkn2_G+?2xgNy@Rz=nbU)v46`e=juJ9fd!a;aY9mh=F7O*h;=5OkR(cW60gG>o=< z+!N3==r4;2l!E^s)QDAq5loI?YKH#&!|aBwZVj`UjGs%lA7H-?HW;dR{D53%_z z!o%rPHIqC#f2db`ul$9*f=K7{Ei4P?o#4H;D8b{MNsGVQdYLks2s@O)`g2BSIgKLQ zX$N|ljn4U?MwpM@uTx;Ily)ABQxTT->;C9BvJmzr zr7sX$@HF}w?vuvl@hd5@D4(ASGQAq@*hY;bms_&$?NM1{t(L%Nq%Ao3;v1tJ2V31X>CiE%iL}WMax!Npgx z+iz&MztQ`LcW`UN=(w5|Hfu*w$c0Xw92L@R1eu)U4_(MQD4vb^C#7$Ik=ps_c!vj5_Xq8T58cDK z_Nag)`~w_k_6AGF1*jUBQITR2YaKblPE+hVk#a*Xd0!+w7PPB)QpgJc#O!bIQ<~DG z4=EBtrcTcT_OV+4R*}D_Q1$IEUL~2NZ}?I&ru5vRM=uKtiq|l26Lare0goj3bC))` zjs)P8?L+c|_$=1`wCeM78Vt68W#L`|)chi0eF0_erww`y1R^9ZC||D6h%&-6j0rax z@>l#0kD0aOwT|mmO5+X-vY7)Pg_auAGS(uBYB~QX>xy904)EV`M(i_B;u4Y!L2<%K zWLjeE%c>FXgs%^%4lk&16wCe47>Lf-7pP&8T@s%|iyQrz-}~!QeY9wUznK*qrIEcK z0NA6lN)R@p53wzf7?{q+&acu^3rV3n;MAb?D}T9dYNPq7>QgnmKARLb;eD7KLfd}F ztV0AWvj=WFF;WZTc+E5QPv?_BuK6NbpqYiel$Iv9KVgUk%x1T_WdRJBNAdpPXnPd< zunV;_dlUSr3V8sp(A_pT%|-ZV|6%=+SJiQv%`F$YlOf=ru$WjA>m|;ZGX^UY427s! z{}cxORSIp@!TloMu50ogv2GS+2shQkh(P}!tCc*T@5TnU0{AZhra8Kck=^XY4_fxH z(e`LuGIF|Y;1amjeorb;$`Ri8P&l5mpX!n=xoNL)2XbwY4|7von^gA(8;9T9_Ytbq zJV@9WPNRW}NWq)@N3`|;CvG=XzQ|xnc}-}J*2ObK*-VRP^vV+78iTR~(2P4*Qs(Pq z#^PFmp=o@|r_f{{@Dh*3l-gsOO$*6mA4*-fKxl~*K?w9&ei(tym8MGjV}Y@G&x}ma zO&g5tQd{pbz)aNQGP347Rpjh5E)uiuEeV#)mqt~2Kd&;0S%jH!(w+!Eq~?WR^7BbH z8E>CK{=xcxGmFNCRj3Oy2=t=*o|9VJa_+7&3@L?w#rd_M>s)mus$zg-0Gu{G>2N~% zE(TOc-#mtAg&$ZaTzSd`Xw*8BUal58iFF++>F1Y@qe>g^=RCrugh&J>S6Hud0v7EW z8xz(V$b2r@y7naR)GyJpM(rx6{q7ztw_Lqt;}5&vM{8;6=P#DZ2>0i(+oQ;Sl2(y< zcA|zwo>^| zwzh|d8(g3pV%*5uZ0-~fcr{IJQP{z8U@YM1LLf3Si&W>cCEZL<2m$nTwwJMZzX9Jb zB=p4EExvUOZxe#_-KhmGB;HYlrGsr;c}pgWA9S?WA;o9NN(d+cFmcFk6sD^G^i$+# zlJU6Nj#Nm%`8j-s4A>+_fzJ2wIOgaCFQ)7M#&1%ZSy##~G>TUnscHfMi)U|3W$)Do zp7omH%U7$0nm|pPt&cgGap|^CEt;4Y)v&emn|?ehSo_JYDVI!-cye5*{(e@+vXfbn z;YcKrx-35KUL?C~EE=C9-~c3UA~5y*7UR&7nHMGk12l*AhNlB-;Dc}XqVitE2QKAc zeRZRQP=!Do8LXY%D@pfMA!z^S*A-Y!rH+gGna=QXP?avSG zr`@bWSCo0CwI+fZTos+W-!$^2Pcc;;H2rxtRH7K|xy;rOq#liqxa##h4DXt0 z-$IHTgXKm$ps=(+F{w>uQTCwH3-!2PlMJn@-sL2EKNpZGCzj-=Yj~^*agu3rEP3Uf z?LB^4J&pU287oQ6K5P-CX&ckoyW5!D{W}4(%Gjo1V1*mvHw7`cXQ&QPLX%?E{j+}L^lJ)E7#DeU4kHx$x+Nt4D zlBVwK6<@JB`p8Zmh_`3}eFfHxJ<6^*9MADHHihW=R=e`kN$$#r_{<1~$@yT^I+$vU z(c%@|BjV*C27HQ2%!o;_h#Zg1WyYl8gl$rDTc85#-S&!_-DHW0b;LTH&|0gAZ&#ne z!S4~6P(xILuwLQ^fQf6DltiVdpNLvMnr)b%CM+{PfZ)z%&S(HGvE*a3!+`_Br@Ih{ z%2Ft%vYj)FkVu}B(%W6HY3D7qZg6KFOt>b7UT2kE<&PzNyO4RSh zf?*%<>LC`G&#~r?0+ZiW5GWouD#9mmZ^7LUgpvoZo;?OgQnitGIXA2RP=oA8P$pp_HQFcOP8=2qV?ppA_&$FFMKbA%TZ{3S|><< zWykE!SHuK428Ks;FHX!;m*tj(muu;j-Css*D8^}jw0Fq=B~!|C zb6)JQA9@YV#pYQwD!~TK@ifEV^pTM`Xw1m=V_fZs^*C^N|A$fHO?Mfd39+QG880*k4NT>GV5Mf zoE{9~CnOv92=)20n-r!9Y|DG8j%z3f5b@~4vJv|p^|LFRJ%efOC*;_S zn-Uq1p|^)z^nPi?YdCFLlqh8#rBp`o!{P;Hzd%?&v(+LK=pQLwk!b{8o#e}D@foQ8#?=50VRID3fh6@GBAWJFNs~c7ef#L}b>VRu zJWDQVO;^?(PpOW>{5pgRZM4oZ=t7X1EGVG1guL-D!3O;&buWr#UPv9ej#)GOPG%%! z4XF4+t$wdpV&^i8!_}g!5eU+n=95`3f{8@jsJOSCs;AngruuQ=-gk!M$vWnZ0~ZJD z(E$61P)dw7+mt??J&I^kwM*R|V|JInP9knt(6y*gIU$l;=P}H1jqcaZIXK4~5Fd zlQZ|0UJe8I{QD zH;i+>e+(S#Lveqz*mU~SSY3vhXR7gsLCp?_f;c_2)|#obyj;k)c(XQR=#3~!U#|2U zeuTp<2so~-0k;}xk|VQ_;KxHrp3T|#6>d@tXgQdBFE_K?gpyJ5<#KcO6kk5ZP zLbGl!%H+=XqlHrtSu{QtJ+fHN0zTg4E*zHyT1~Qlk}T@)6T*ccoayEB1XAzT0eo%1lA_# z8;zwbkZETD_y?vPACEF=-=|Jeq4;kMAw=+rm-SWEGf+y0kCJ1)}(*P z?}PPb5#@1(@RS06;j(jr?L}Thi#nneTqRUYnZnPTT`&znyp9Q{pxgA2L#aidhiq}X zzHc4w!WeArY2Uuekrapu_JYSOrB!Ef{>_BH>h-H(YIYr7&>@XbWQq?pK#VuO=L~h5 zuPJXkK34i5KyDGzS(p76o^bvFs=+Jcaw~EutBrCqo7DA7K_pXuaW9;nv3vBEG|2DQ z8g!0b$2r~uvCC>7`yLcM1=n)lF6zT=<7@hWW>};%xL53o*^poOX?}cB%vDCrWo( z2LR~XVT*cTP0J`fD?1}Ww6@*p9NsuKT311GzW2s(Xc9K)c4_6pdJ;R!;e{DfYNu!3 z5C6=%g0yGZeeFjh=W5$-vvh?O5ok#y=kIL@7K@KnR zrIQ3%_;@03#PL&O5)It}&yp`9d11|LCoG@9n9+uL6?kL?hG$bb?;?iR!rJ9Qg_w8> z_q(XWFXml}4=5DM7;p8W9dzc($Tvfw?hr1UR-B-*-9$2{{u4z1_m;mHmjWfOU*N^9 z-V=$=J&b2<_n*ps3znESugDw%c#MFk@@*qZ0E1>@cUXKt}D0}}N!dQ7uILLN%At)`LRqaxzw5wRoH8dOjV1z!d{zjoDCMi%n!4=Mo3U5aDxdf(LN(SpPZlP(i_{2_<5qShS%7%#R_}+Dm2!#`G?Xi$ zG%|GXQcy0knxJbCPCmbd}SWm3Ro@%|rSQn=Q+wFM~e6%sYN(8BcOBf$>l7C4p}E8&V$T3MIQA{gw{ z41L^~%1!&k{RPM*r!u75MwLP(Zhq7&>uph84OYuT>KJ(6V_yt5UVPD}$y3z`pWQ?l zpVG#m>M~B1B2N4>eMFO>1vj2>JM5~6;(Jar<|UB;Cw()r4#o z&VGCz!wCWdq5XvA?SDER(sm8fsWp@X%76ZiFGA}53$X+_^KZpKuIKJE>z)FMU3lmH1Yrw+9Wvf_y>k9xkM1TcHuOfF{m|$s zp-2O=$@NN-u!scqVdN83YqgVMfQR)8O z*MV`7F9)z9 zoy|aFoT{_|$yfsp=&jB^X*m^!B?H9`_YAl1Fs0PR)i4fL4c;>Ko$X9(1^2$i#~}DG zrhKYrY{>@n(M(C^6t!D*XeMuFQ>_a*Z|$}%3^x?as_IU(q2I5 z3Z2#UPArc~-wuOeDXL|noZSiLXMajWrPyT5Iu2>7+*i@9v$YZYzfx~UmCu1+2*cc96f_4Ej`ZPX{IM+5HK|$)I>cXafb6^*q(XFLb4X`_ z;(%z+N;yq)PMCO+4pL*vckm|vqZi4|=3gwfMX+b@s`_bnZ~v=8G!QcrldKK^2z;Ew zhdeuRwfm#4I?`LfvqHlRBRb?|C_)ZuK^LTXYX9cM8`y%0^}e}VH;@uW_Yu#uNI#~vPYT9L zP87NT*7@e^pg6saiYP3m^qrC`%Qx11{koNg|mdN7x zV!JrLfDrrbq9Y0tH4=z+>okXyqtj?9$)K^4&A#&>1kizL&PhO*%+YB zz>7$l#_>8J^~>W;=LVsR`;PU&HD#ICm0Urn+j`gC4AZ~a6I%7XStwIoZhZ@(jr^>a zJ88M)l}g%9(-72^M_MtYo<9iD%dap{6XjW@O;RAJUBU*ITBjuD(CGPZWB7Lz4=YzX zr`jN|#UP+W0Dug!_FtB_l(~7d%EAAk8d$KS3hjA(84&Qi@h?Osyv+kV zKwm1Bg!&^1D-GMxT${Q>|Ia+(@}`(BaPSivb(|3r{5Q{I=yC zWRE!G`OP>2r@47kXe8{=eJ0A_9t@{~CqOU%czXK(;mPZ&@-YwgtDg^)b$4ryis2tm zh5sW@17V%)DtWSny}ib9}qN zgVz@{n@T=dDa6UAhkXI58SLk|4PT-pF%7TrgYY+Ly0Fvn3F!v`$jZ%f4tzKNU%&5x zfqEE4&*IxK7}f@3`VeB%Y9Lxk3!R>fMS&6H;6B`VsRL3y`8SUGjOr2@!k{*s0AZ}a zrB3L==G5o^;I)|U$`|Eah2No1l?L)PB!b{drmUt(@2;M&Z#wwcdD>dk41mUvc{O_1c%VP~$iz zQWxBFI@Klv-X9L_y7~-W*GE^kzduLShfTJZNuVY$+%f<8x#YRV8&1uuQC&X^f`Xw^ zAdnulfl5zETRaAn9uN?2vO>L55sxIO$SY%m_h*m=H}%q(VVq*TYO_m;D>hqF66B4{ zcDx-)P0>Aak*49gus1t0O}r;K_j8@bE@Q}E)a0%8=xM*Fip3!TP9xfoQ~+61{8wCT z(I26Gb?HULF*B8fTA!c^S*nmT!>;arO74nDG99XN%fF0MOe)?pr&!#Ic8D0OQQnJyX8rr4WL8%49_rVEGA_* z+4KpWz+zbGC9@wG4$+vgqwSw;eR3AMp?Oxv=`;hdib^w^ixNKWd$mp+wHrT-bo1Q|kGKM7(Z2*} zagH%3F$E&UJEZ#fD{jcC>{to1PpZxdFtw5ft)GiO0ub&au|c7Uz-@*kbF|Tz$|0CI zHVqyyL>?J26|||$L^OzP&H223rK+4ASYTeoa+o|Di^1f?t95Zv^&ojrpI9E-I6aHq zh+0P7Y)x!odTDWL67A$pG{Tp~hjNmj%Zs*miKc z#xXdKs{R%Hfzr@DC&Hu9h|M+X8KF}&p?z!u%UFXCb+r8WTC~R=pQYp#_(%a4Zwi?O z%fX!4Y}h;ZGxQ`5WQULa5`us4UzM;3uZ;X=U!w&OXF-skUeg(?=U60{k!3{Dz`(0g zw%&78JEamrsO;keyPt`68MA4uMF0(Cb7uij;2`h3Hb?v9?7z<{u=qmPr_CwbId;Fi z%B{+$8h+K2g?x+cg0E0M!$`>#(bnFie||pyin+s@g{?87rh2A;gkx;U3;k2e+Fb2) z*0|fz$30nwY)Yv8rRsTCmj%9Xnkn+Y6?BU}Vky%JzC>d{Kn6p-(#-mcM^#a$$nAZD z59rXF=qriRJW7nW6W}>m!QL+h>iz(;%cSl}i{5dG~U&p+KyPa_v#r_X( z3mpcf17{d6Y&?x^cw%1ZhM>zs)TyUWOZ{xIz4wUww*?ea`R58~)W#cbtTd$AoD*{h z5Vta-tc3+MB)6LW;4l%b1A0PVm6SoGxEP5+ zX}jk-Vd987I98!!$w#mw2{-70TGTl)W}J;@G@DwmDK#X~Z$5kaD^>u`0HYhs_$K2+ zZ|vCI1;Kyp)@GF7K)nqIG2MQ8s~-G?Mv zvVqe>yQ2b$w;;rO?Kk@gh{XQ*0oC;^a+Ofy2@cO7^+SPQ{nDma^H3|H_asUD4@;cq zk|+?IsDS$c4E>x-Z~$2;*%`1WiW4O9w-^AukIN$!tR#N#hBTZSeZ)P#PH5%VD_0dZ zjud23GZOJYSIc*$)RW?+{d%hn8n?c3h~0Hr#r}jZqu6UYA`epv(TLCkk*PX2@`^O( z2_jQpO(mew;`?MBSt5JA8nWtku6sKQ$!bzrAx%UpkxHa)ia?y}pcCe*YyDM!)wW3Q zMFqt2=pL+^+ke)@?@nB|c$>*akmiKEL;WLS2?FQtq4nMg-hW?kcBc zbx>H+q=~r5-ct!mMAvTUT{2QvPIOXON9HBW$}KjeSinqlk?Eh<^reuaEFQE5$c&AV z^4|P<4U07UXJ1~NreZJt@j!4yZWradXqO+){!zwSS;*1k*D~2(dXRoDN{>YDvmVYc zX+geCwJ6qnHdbH?@!-vwh4uj|ra=KgDwGjx+E{bWUrqa~L$%`rIo=q5$Fs6K_veWq z!ylcge;nuznfXDV&*@|TrBQqRC|;xfdX4R?pPtKP?k5ou7N1Ug5?XNY87-J!pH z^OG3zt4Ty?(;ULyPxo-5RQ|Wi6Z`PS?owM8YiRUMffkULPP(R#0piVjL~yZ!=yQR7 zZ;*jVL`8autV|!#Jn*RpDs1D97&BDaK0g%q3?ih*iebYUrx^kiGk_3+Q(<2ivlcq6 zIM8Sh!}*fQz=*+Cn$a$P+D;RyVShAxJL3tM-IkVF=npWnD<#ksyJD1C;%-t!NniyK zzMx3oaK{ia^*taBGh(GxHjS!6gG(M{NnE1S7vE*eI`T2@H*%onb78*1Wbr)AjwraR zIZd#YFZbN|;t{i5qb|Z8I#QUjBvkYs@UlGE6}R*1Rw@@c4qO(7!Nib6-0Z!AzFvMJ zoyio0cNJ1Dm21xgCSKzXqv7{#ZhQF5cN^8T70n_@wyAhTdB+Ao(eE9YJARt&>`1x| z4!6+8;yj(M6_YVgFY@Fn1_>Y^DRN0Ywl22@H2giJCt1su`KW{j`p8`=GCK z7lyeyu|xL2fHal>=E(Y4za%e%yN{jo>TNE`>bEK*O-&HophfNy)}k;+TsSJqEXp{+{Cm@4{4_i0il+W87gpVKu9CUEaH5RQ0IF` zhqpL`o>M^SpH@i`cVzAoig#V{20k5}+G3EbvS3NP3_9CgMHobM&Q?V0a0)kgQ>jC6 zgE0$kBW|MM4tjIascZX6J93*gH2F|>-DBc|T(B>?ANau|3(b<9DZ=f7yijMn%L~_C zg!UAJ0o^W-%3a08lSz3HXA*Sv;0|)Sp+xRy3NdTeJL;1OvrAZw7}Ql0Gaz@MW!Cg5 zUPm+dUE>L-P4Dy$!^u88D20Ctl%CmiMePEqu@Re}euuIcrnjDSE>j>9YnCc-VTs)XfAI+ndBei=>` z!BK4YwO^pj%voN(*B0WNrzY2zP1U>B-{EI|UFDt##bO%`ogYES&x?sr@zP6-3|;JH zeK_xGrJoO`)EbZtbPD@-nl3qnFXUQT2+0tvC0G4>|l7-!I<7YF?W8)HI$#WdH!J&eD&J26wP8%+8-Va1tt? zuxo?%PX$T2J2OHHq)x!(_@1!lJ$tbf(%u0uBqXs#Vos>n7_Ab1xYkK5%O#N|qf_(9abJ61}#q8=VXNAAINVj@p> z6BEmxXA10m&5OPnDI!9~Epk>X{Q|6OQ#2ZP{N-4qz29ronZG;Tk)EAt$cJK3)gdJ> znVHa*K+ZzOc4kCct6$HNhtN1X$Nlto2|V(Tm1EwT-!)5a=MD15FzopDA!Ro+Z{vuL z@z0vplXGzf3>WK#5u6Y;s5NNPFkt-l35QE@_O)1Lvm1|C{~p>OP+Eeur-7<-%X)v% zy!$3zNaje!$|7;2F$#G#UPZgTj&bDT8X6eM3-fqjM4CHQRA{9A{^d0~!KKL(spWG! z%t}?LhgGBy7e)d?_oT_;=kzLI*eRL-KBYhUcPqdIVqwY+Z3c{x`J7T{{{ z+~Kw2w$P9)79J*}NOfjnVJu;W=P|+$wSoiEnOm`i?CL`OiIuTax*er|!uM6-hY(iy zIp131#!yPfhC6{O>y8W7=;LTKouRd z>W+@^S75hrb!HO%hQJSWTs-Tdz%RHOSnb~NDy@7Ah0s>euL+hI=l&}&A<8bxi9vzqk zl3tyiooR?or+{%SRH1fcYc&X)u05?}R!v)nY)v1~1l3I^$0bko<2T&8)myJ{!M&ey*QF7?sdO?y`N-kLX=GtHrujWbI7 ztVP))Rx5La5-cPP>TnHbiaH_52)s?334V|>e{T(*A$WgYLcD5-Z&TfOZ^*1mrWxcU z@;z)~aZ~*qD5dzf>2!VZpRYJ;JesN{0qG?#6vx2QXdXr8ICs=#>nH1{m!qZ_P4l&A}>^{*}1u{;C!sYL9h-pB5~CD zJHOm<#1JTuLN%(~zvt7`5HHYXogbAfKsk-(>?IdL2hlRBT0j?cky;9I0%(UGeoS|r zy44-7y~D3WGiHtgBE@3_3!x{s*bv5z)!9I+mLvr~lYP4$o6QYfG~xAtAwq zflJY(mD2{dk(@m`I%#q+Y=2&<-igTb9x(2A8E|^8EkSl}ac+G=X4L_$;a&h)JNFa` z@$jC1^N9h~zM1Cpi*^!~M-{8iAa(TEe|`3_=JBr&*i!10}FUcJ3(_9>Q%>2-ID z7i-Tb7u5S5sa<4IW5_5Qi(=L3;nPe$cseUUI--AdIcKm!v4Nw^u&@0tmQvfEiW8}tF>Te=vXSMPh8PLw#0l_QQ z?vxM%Uj1h;k!Mpe-PH0LPB>WNR|`QOAw|YL$bfyi7vW5s9>qiz8I?Bal%E%f z^|Z|P_h%bOuT=^~c^1$Lej!jVCHLmWqeAU>DtPmgnQ`hp`M9lF@H zT}so_(5TC&cGB$iPL-I(DwbaxEwOHfFIKE+R3BUdz1n$ZAe*hNA8AnQQa%3QuMUTe zW&Mxj0SRgw8yD#V>5~sYe>exKm^t#hDrMz5wE?khQ5+1j^TJAW9wL=)CILlI*CFN2 zCZo}0HJN=8HmKY*&pjubX3x0D>fvn00Jx}Y6xwmaGOKg!-kj!QoqHZ#Z z;Xmqk9v(~xpW>OcY(Q3F3MJ*K6>CKrpDW)0O~AyKBCagx<1M7y?XDAF*fS9IeV7va z>Z_yBC0)VW#X!F*y3^Pwp>PhvmFqUvY2fDBBoV1p;xk_@+MSv+T!Dh5Kp<@&4u zHS(E+-uQTtRcf9pIhm4zj=X_fFMs&X0!_+jgH;BIuXkO}VfsJ0SW`Nl!$U-W1T;*; zCEmmM{(2mrS(CAJ7S!nTN@gd(^yC12`_RV?nd)^gfBqc`&neWigx*x+MzYk=+f4Z0;U7#;m*s68hi*gH^5%IhK6 zOnsgIf@oAZ56A6=xPJcEUaBMuqwR9;OqPorYqLO1fDyi5n$e<`%jGK$(NCY#AR6e= ztaVc>B`g8{Syj{LiauHg(D=@qLcI6yt482@qqyxRso4oBF{#=BHeWYAE%ijJC{4c~ zWeQi{r}6nC6bjPCRbm%CPOK2(OOoD!;i;418OTSyeZ)Wz>?6MR_Nw#-h)JamYYsw{ zUS0f?l}*Ci{2U!H`YfRLY>1ua#A+eY2c4GTOWzvk8SqPtfunq5J!S7nv;uE7CY?1V z|M(4wK> z32jvF5Op@Pefe}DyH(o&;(XoK@l1af4zkl~luda_n3 z9T<|tc|<{c`gTBEc0Gn_1lk&V}eDEWXoCLe*wJ^hg$yBg2Et>pxDOLQf%`1{r(o zTUO%WXqPa$tMZGIe+8^>na>T4ch5eO|7nLqscUa^)5H^OPf7mhx%22ZfP{WJPLVwA z!3H0Ahg`r=_5pfr%$>H{5GM}#h=eEGc$a~rBvt-5($1kt7$wTKW!tuG*H^Y}+qP}n zwr$(CZQFfcyy#!h;~eB92PaPMy_PJnI~eN_1dD{zW>!^EG(*h2gXt~Fz-^XyWn%FX zagT%mo46JU^Ub4<`=tKUbIJ|T0|Z2q0vTmfBCmS)bY&zcn5xrN+4pO{m78rC4+;W> zAY$qK`5@G-;UZy#bmj*8G$Xldgesy~&s4uSxM5zLG9J2XTYCPQAyKalz!U-{5QEzc z!g;IpuOV6JhG7s_e8RgS@EpH9e+!v=(s-I2ZoQ`hs`nZB8$9%B5tAHwn-*=AwbZ>+ z*g8yG5$ZsU#9*!aP)A+G2$hn?seuQHKdfID_{)XSwm&*1Fop;8bRMxkC?!XN02`v{ND|R$iCo?Y|Ul9p6)f0igDISHN*w^ zchTfe((poQC5({-fJj?tu1tQ>~)qGo)(wT)UiKwiMOc%_fm^&qk@#i)(% z_hv0rF|S*9^fZ=B7Q#Lmm*al;Yi+hTCzxA+)>5VQo$s^D>JhVxweyOL=^=U`dk8${ zAq59~4dZ;luB+Dp#D!>3vH*(4p|>Vg^y0z<=!eYEiYFlZ`j-A#bKF{8akJCjI$EI% z40#u{ccq|*(2YOW?1mil_1lBa^17D%I!kDgUw2KCjROiS?iLCY^2O$BYm8*7*+zBB z_RC%qjLUyOyO_D<5YU_ssk6j1nMcF)${7x?2`2@rYXwt%lhUXlOkpSqG~hYlv-Sj1 z1=VSCa~eeJK3Kfx;oLkU+6Hyj0w@Jhk^93?jia>~GrV%$v>c7jy44pBJw(7!0h3e|Hco8}ys z=BP=}TN}@_AIg8yxZ8_#DZ2c=lg?%E9K+38qUxlbX@k-M5=_6H5?+mY!+Y!{{?idsjqf%k%VmWkU9rO+MP-r~_Rid+6)Q~= zwIW2WF{0r%V@ZOMB8n{$AGuL5J$ouz%N>4SU;GP^`VsMilS!x#?dOVF!}gDSAu2-l z=aS6&82#?jOaGaB@*e8sMk#e;u3DrPtVCFFBvo&qrSla6|9-*FH7vZf%aL(d-!(Xs z*ADu8JswbbRJO9}mp$qD!Og)X99*gx61)w~rl;t+al_Nq|EkcAv9K~Zq#2ia_7w(# zhL^K7Y4``3XzZeqxw3FDtoPpCa~>$LDFKA+uJ@b}+%Zy+vMxc*eG~i6!jaZ~yqL{b zRRaAUWHc|8n7i!1j*x}EKln%vOJ&=CO>Y^M+MCO&@Rbe1ku;MZL9j-bK*|}!LGO45 zETHXIY0u&eYQ7l>PZlOv!Q?Y?NYyk{7EguW7Ljg7^o7+@jH17rBVqicPKjVgo>4rIfU(7>5r-aSSEvt z#;R67Az|2=@X-J30evMy1o#(WL?+DrBOt-Y3kOg;8$ZjCEWfWgi_M=FXdUNpuF2BH z%Rd~heBc2eFjFVm4)HoGcz_G>dem!s%_dIF=8Y@G0ysa4)Yp#hjsF< zydHN$2?XyDy0rNBw{&7^XP?V-bg5Q$9r-bz(sEEEGdxPV6|T^Idq= zXvnT(NmyGEa9@WvgCH(NKiJ!Ea)@<2RVI&5g1nKQQvNYorRQSp`U3J!;c0~@y zYj|)v#bnAH3dn8W3L43mR0A;XxdCx`$D!cM_T8y7FL9FAs9f`f()i*oQ38C`5;9+`1g-uQPCFan1?D@t0$yKYI8NAPG+tgDp}g(>U|@&K2a zEK^s?F(PBo_oT zMc{bT7gtyBD)pxDC?zZo8@tU^*KA2S_ZdEmB2g+`h7JEfYMH%kL%rY@i7h3Vk5oOg zWXW3adGv9cNFel_I+@GQ(M0ny-Vw;cItZq4s8+HHHU^y+O7R5kYn1<>B#f5bL|NAmf;m|PvfeL)SZj~K-bvrpcjPe%zS|TZXx(GLZAsF{t zC@aT$S0&p^`q!+MjLTL9nY^LW)T&AhS!d5U`m@!_gwv<_gR*21I7kYu5O-8KFbW6% zfEmLBDB~7c^vl6-och7=qFd^X1$H|I(hy<9L1%P#mo9!|LPN_NyVD#)EB|kOcs?%ap$%%mWn^f; zQ;%~v`9X~GNfh_qMb|}|FY29WOIp>*lC#U8I7)noDn~EC>H;er=2_amHNs(`%u6T& zz1v{Q-9=xn(4y{6DT)d2aDT6Xq+nu&oux08F>Sv+$VF3hKD?ugUIFrosXe9hq7*$7 zL6av0$uZoDso`X{=V+ktuYa$qF{R%H``yJuZZb{>0<-B?XRUBKDp7okqI<-R()2x8 za(1u-umfVo1b}EBHkW@hQ&Td@e+n&#P<5TVpob^q_dEQ{vlsLcL1HQ7>?uYCjapcI z%=pXei3x~4B19*zPOd6g1#Ebto_%IhJD1i(Ux(2ANv7E4K|ir_<2AFZG4{pYWFM?% zD@sSHV+eQd3H!*3@ znC2j>2OQ_#8;x~*9h+WKJ&ddd0RK|9CJ@kNr0<*d$KybsXfLB(iGHB!*>s(<#q4t{ zENoGQ=ejDbZ0gVLR*s=~-HE>=`Dj)DCyN~gd{hjic5#-UM<gl0pPnnUtPQfJ47rysZud8@l zz4Leq*Ub*`D-f^ZiHSzK+GU0)Y>@JiN7ro4GIBNG|#eNf^;qgCf+Ns1!kN~oGm@lsi z9<4!mFE7yRZ5s3PLI6a<%g6lG;#GGtMC>${_L<8)vZ!VSVZ&ScnU=NZtyg5B-)^i_ zx^F){>x_J+>UAF0k-VytbGK*aLcj`fWpYwwM`Fy7sllOX##?>8M`ISy-A=-BYl4*f zromZO4*jF{L^{F-p|rnVvhz5^N>6=_-Ss;u4ff*7ycgNvvzCBiG6u5qZ{etshfO1z zEOfRa8rkWbX_}*px|J%3l3b`lXTra=F&X;_zPbO~xj1*nyZ3vpmq4 z^NiC52-6k>nQJ!AhPHW>=<($NdeUa-E*|2?+d7ctQPg|li-?Q1J_}N2o-89DY0+P( zq-u7tWy5Kheplteim z>ln!v4ZT8ZTpxD3gJ^#pimeFZtE>czqQ9@RYb5+Ne%2KE%mC+xUdi$1^qW?zn(eso z*SlhRnp+AQIyr+d087_&%f^2L0w|{XlYlbv#=`k}#>u&3`o^0wWsY_!0lB_rNupbg z6whuE0TpvfFelXOT_Q{=<3FY-T7`kbL&4VirJknxL=

Azp-LZ3@P6{3230vshK9 zcxQMGH@8GVI3=oe_LY@=>8ong9A}500s-5^EGTH5X0?s7B^71;4sZ#U*KIZ3IxD^0&~iB}8*N2RC4T?H&>KWp-cy_-gd) z@wTkUC}y_L?<1}CP){tunI(1G=A1#S8`%Nwk`@FZwv6ol46qB!U)^C!_>Y?}mpm80 zYW$Z4k_144OyFa@Zga-_Dtn>$E*)B5+h*nOMc^-PGfx49fJt~2d`-WCAex6smQCa{ z0GbzeZAQKc}FUWz#r6Me{C=_e5S;9L!TE-E;U{fptoQqJ3a6U>*Yt!?Oi zFy$ayCTcl=n}xzpa++(%j?6Fq3I9E+tTUdXN((rbq$IbY1K#8GaGdP7E()zu;FMd> zADZKrWo22pAw5eI*j${t+*9AhcM#g~sK9A2*?9CBR(s+4;%;DGU?hqCiDRA;qKerY zcckNqHkDSQnD)CH&#pJX(JL|l4i+XSU)nBfZv#QghV-KBvfw%Vtt+pfTfn5mE zg_n8J16DX?n4&wKf%#XT-J5#m{w+L)Y%cuie zsy;4o3GMI>>|*`?bexbB9KRz5gu31EuKE_nyyiXt$f^EGWpX_t_pS*5>M`qYDgNO} zLIp~eQ9}rDhCA%FKjY+Sh_vf$xPNnUFRjEH2jp2Kj5Ob&gf%NdW(_$T6cr87w?yU< z;^GooM@_;cpND#k9v-RbBN|`1B>wN%>gkF zO?0r_Dn+p*0SZS9q5ck#)M~`$7cjt9vjFs_frF}I3yP;TbiwCFrawMNcEO$XgmwMv zMC+_fMNwXj-jMgeTtJGcC})a@u1w*!<_f#7f8C)}XOUJC22NDEyB~j@e7EZG`-VX) zace&u(cs@V_(_&kJ|-u*49p_01sod>5!r$@egBTl#Gt7xg>@wI=~q4ECZO&(PGGKMRJ{!7yaV? zEG?>)(UJ}Xk!C?6gX$ZBAVJN3N>A5ioEsSpL@D8aaJN>87Q1xPx!?;OLsv`1x)t{+T%Tw?$XT$llYXLN7NdZ+>XA5BpSMe^;=#x&wi zaP7oyl^cQ8-u-?>S|)<5Sq^bL;+Slk%cwK7Y<_g}AbI&gGhy{uQ}fR8i)27|q*W+< z9fxpp3BPB#DZ16~)qG^DaU*C>B@SVU)`?U=5{W_Ag1_=*>HAPN@5Kc*OI@hy!eW*e9)< znhpZZkll(}mh@63mOdxw{@DNFY+uB!5co4j@Jq%f*s$2;>_Rz{u@_n?peA@@{1J>O zr12IUKF7ROfz1tnf+_q>*4H>{zIOf2G2UVckI6Wx7Hi)HH{MqK@$eCh@SZfCeyAXu z3RZ78<%Y^O&;d2lKC}6fI;(v?gUn8n(e#!wFMPexkG3w>`)DEjb{^>@l&g{At<7XD zYZAyhZ9wcfsI4bh(p}82MVC98GhmxJQ{-q=#EF)Q(Sf=1sO=?HZvG6cP}>@;ncbiG zk_$*zi%@LKdqaia27YcW(W`KS4J_S8JO&Iyk2s=Ou$;rCHfq%+MW64^>aYF_IMuA7 zlc$-w`3{-kl2BO!$wWGoE7O?eN2#TdNkizD9Y2BNoXUAZ^7Xew<9rEV?wte5^{b^v z`qv#x{j)G(mZ{7lTBV$jac?i9oy~wWuF&6gp)jAuB#rYEmHh5iE-9O=y$V@~i9DhP zJH$V9OW<6ef4c%ahqGt2EpypeAjd7tv&~OTpRM9$*Wr9;UY+$x^*0s;*!1fpaf0J_ zg~I>0`0(aA))+8eA*Kz=+c)4Wa`t^z>o6WUz=d`4Rc(~RD(j|J1|j!d@j&Gr%+ z1nD4e;_}@FNHl-)oe9Zfmi>?|Tis0S+-W0#p85nj80qo9^Ixz3+!@&}Y{4<<|6Kk~ zMOg=g2W-+9$>kEl6`Vv5<9e_ws;~N?u*kECf*_+%NV(z``%GH66!s`eK5%@lvj0=C z3W)z9(m(2=f0Kvk(@Br|MtvBg2arOI4hirgzzvCnwx@Dj2izR_CS>tsBt|UExgE(c zk;ZHAb5&^(q644HSmuFHc&Pj=S(P{JtXH=)8aLJkDtUzFa6%HFTnsjS>qu)7i_+#??zGK@o-0DtB~L>n zHAT~^@Hr9_W|Vp^z+CIZ$IYPe9@>hLi83|YhEN2T^9kuu`bbK8t_ZuNR1t!Pu=^qJ zv3tBBR}KgyqZ5JtgyX<6pWQ!VMP;n@_@CXzT`4~l^eJ~+lwOrn;v)ZWVE)F17xW!( zFe7d*%i?qthrDzPU)}U$Z!iYK-&F)W-kb6dp7zadWx+^i7^FmP`HT*L z_IZKO1T3-hkXtzu#232>rU18)dw2G0Y}Ae)C5IH-)4pBFAp2>qt_atWAWXaIw8~o^ zm?4xr9!7m+U`A)zj$Z^*rgUSrfW5S`TJwM=vT_r9WUDb$$W7GaE?p*mY*x*&gGHWC z0Ikq;zm9b6=q3;B?^t5~&R!YG6u2;fkeQU#W_UJ2w1Eu$WUnw$tN3?Awtmclt=#Te zj!x7~G)Vl7hlM;t|7+wJ78d1KunpH?`o4->j)_(DEZ34mZIcj^Pw8=msp2Ce^GK=B zr@y+AyJGa6N71iIRqGu7&Bmoz?Ae+8tieVyqtYy9BI@Fh#78 zYV41R9MlOn7B-D?C(n4J`uAD5qxpKaD?o1Aq;lfWAYDYdqGn3>xJ~Os(glgiFToEL z!HIq;be1P60P@Gfiij)}&9s<=TuyvxRw2zN;g5wuiI9MInUEH`Jhzn?!@W(7zd+%p zV{&$t*@rh_7cqAV?uuI@6`U0(69=(^b-W-+PQLvf7hMd8I~U<;yN+Sn@xhKPx~wHT z%o7AX+6Fg}x3>n9f7Tsva0+am>Qh5mCK5WOS{Z?Gb+)-KpEdSVwcS9%)_|bS1av>6 zb;cwAbSfDB%P*o;g?@u8PIc;jX=pW46tbbL&kg44*=#Zg0b0>aL>{><4vKC#fcm@B zs0E$*>F4HsKsDdJv%Ou{flMs!j1(xSmp=dd4URfR{BC_@!wX9c(BY(G^h_N z4b?)_kZ9N?^@rW$Pu>PT%|WuUn*rP_GXc6$$*6(xf~ZxwnivWm+2<4m zRVH){K+)>0vQ{PEn{_ApLKO%O1|Qi*J796}cH0{28#sg$^_ z6vh8PWaR00&q;V~9YZCQE=93EZ^d93+DbwHZ(;|&+R>FH6)sv&3rOg{f%F8CMNpX7 zqV58kC5Cb~TtGz_T&>;+(Kp5dE{{Y|Y(o0%2M6Fv?LcS~w3A^8;n5&vl@FNce&XK% zAo<6a-aXTK`Ego+*<4(-5_mUbP3<}>T<&q&6N)}MGN)!w{H~OSB^133ULamv6;~`D z^b+IYWIF=s0YG^7QhFWRT0<03s0ak4#9EX_><)I;8GJ!WY&WY2MII#AreGF8*OT4t z`GwiJs&oW8>@bcpfzKfocQ_-#S2cm{R(H?hh0<`Go(Ra+$DlzJ_FdvWI%b~FHND~U zfzWWd|A?r_z?#SS=gVQ>1^H+xd&Z+N?yY-LJG|#G6wAOmu6o*mi@8FMO=+Sszx*BP zBmPRj_6WCMwoKGDX1nT1F{q0d7?|LTd$CAu(yBTDYax_LE!81xjE*ke8+OEJKoV0ZNAw!VdE zKOq5}_4=;4J78;1Xa`|_pbn-Z?cKg{JDUPS$_&z%bNbKH3HE*mpnw2|A6@z-Q@%y)z z*%HowP{EfVfTt{FI;gpRvxDkj^TqxUWqc~kaa3ZrfCJS2rPBogY*nDW)61hu$b~9~ zP{t1b?6KWUubgF-DGrMY!5D)tHv+(a2-tq&;mk89i`_BjENajo4{2H$%!JY6cit`3 z&HcJ-!Mv`jHF2$p_QN|9b5a^lQ_k{?YhHrAl&I^NK~v! z%U2ly*%HR!QF9e2Qn+7a#b%@9YG3m~1iokBY%7eAJOZkp)w$+9aqi;#^2NJ0+vmt4 zP)?muZ8JL)%nVY}-hCbT$1r(eORNxxjJNkgI`&tPdytvP;gm6&k*-q4@zve}qBGwP zAcb8iDn2ZFc+*pSiN~Xxi`53Ir`vd&OQi--{>!84N|Bx?JofWd}y_I-%@Nt+!)Ta?vJoVGoLsJ!2x(x7^2<-VQOW;#ygki}DU6 zUNm9Kq;U}2-tt9`rTVB?XMNi^l&FDt0_Jqr#30LJ7BZt5ZAco!9$D;?Y^%x;$8vr* zV25?_BlyIC?c!{jPWF$*u@<sm|FU&{`& ziYveAu0o9pLI7B0T#CVZ?Qrs9t7~n-4wh96>KVP0>YieqPfP1LTDT5K9^5Z^n~}~m z@zUs6!7g~1W4u`abBV)nTe2C>B^~7~VMOz5TPuSGJY>kSLM+Rt`eo7>@!}Ar-zvx>6a=kl!1v=Pd=gsO|YgPXd1;f-gNZLgw{ z&{Dk}s$sCeXg1x`l0g-@!6m}=zmX?b@lJ}f^^C0djpQ}86%XuRIg#Vs&Rgk*8}1?c zImZfF=-$69n>%vT|6z65rKJnKu0%o_8;KOrVtjkqUeRAM-Ncv3t%gYgFKpV1k6XEw z8uc>z%&K&Etk0jiYD3Pbk`qx z*jQ`ema4RWLc+o3h5zbXuDcD)-2}^r$8xB9iJODkuS?f>eIcn!G59;}v>R_`Ma#}2 zLCswFY$$E7lE$1?b~=8ytGa0M^ZQs9#{3a_pyI+MG94wCoQ#^rO)UwspV;ec3!3Zs zuLo1tH2rDEtYQas1Ly;{i=-=c1okXeA$)BPkFQ2tDSQGun1`D1^l2M=unFgKN3nVu zCob!TqjfC_g>G$*5Lnl-H$T+{FFf(&PAda&jTzM{zCh(~6eEd6S3;BWqRnml$@0s> zXUrfisEr`81I7Zpc&+CifK$ z3uXt@({0KQTKoWO!Z(Au(V=baVh-UrlfOyp40Q9RMhVHefGcpRPgmki0Z;K}Pv-Uz zSM(!@85As4LYyrV-^Z5R9yF*!fs8Z!Lk%x`xez$El?6Dfs%2-zPZ`AlZ3Xb6()-k) zR+^kHC$y7KbaP!?&fhgZ^WVVNH4+AkGD6=(@x&k@2yGqLR16sw(9!YiND(GeLK_)qHs!X&!zvquXyOI*2$xC zJGgZ;*Mg=w>Qt6`Ei5;Fc3C~09Fo-JzWwIK!`l6#lPdE_)^Ilf?!43~D>=%*;f33Q zQeFF0{oWlU%cYk-cfv?vRs+jT=%LJEoIw|Oh*BRzM!PKdcC*JGkJ88O3L_>EGk$_= zKj{xhgoMT42`2!8Tnv6@hpY_=$dei(-n-8q0*vg=+#bHFT#A|QM%qz5WUobdDW+*$ z6pmcB@725>7T-zgo0?g$wU!L`I+bR|X{L9?)SLf-l7EMg>onR!i?Y~o2t#GrL=!4x6T7lDF0bjgJncIW5+F5lMhRS265nUsB5=iw??N@+`vY?iq^>j#aao@(m z+5#oaDx=;-FPzz-FvWoZI}4vbQDr%WLP&+k1YJ4+cN8k*fEvXToh)t?_M+PD5G)2^ zVW^Opc~_+z$zO2PZig~c&OU?$wR8+~Ar3mETO=Fv@vCUQk$S$QN>1jNa3WTWm6X(2 z+Mk^~(8f(gC_80_Y^4K`aU9Eo{G1d&N}TQ#;X{(cUxpSiLTzp3NzsO0a? zT9Q=Z_4XAyYjpEJ;uZE;!9$h>EZt;(EaNXf*<0-e|-hjs#A}%eGsZqGQC=J*IEzY<<=hE^DroyRQEvK@8&tHIQ{!loGs! zvA9Z282_6#Ou`};&AX>NMqZ~^lBfXk@%sk(_k9vDuLX;em?*?mV65OK)}M~Fqxz&7 z!TBK~e*q>+Ml<2f)x~+mL$m?>6A```B$M21kZs~C)jP`aK~Q6VXv%q6voK{Zp_sWM zqunVG4=stTmT6Gi;rC%z1MyXtgl60+t1Q$WLIoWJmGUks{y zAPheZS_6!2O?sKT3se{&lPbr?llh4o?i;X>fLq4Ou6pp(&KgF-{ieBE%RKpdOFTM- zEHm0nVJ~?MlgujBkP!zJBgzhT)2E*mGUvSMyj(STEp|1~X4BispZU?ZejNH)Z{&O& zi1ZqGQH0{ovW?}xaP6I!ZFW72DVTL;G?ss~)+f6*u%4lFQxlQ?9W6Rl(PyhNt|(v6 z{S5S<%;9O~kbCIchBaQuTOW(2(o%C01-4Ral&(tDvB;Q9_>Ifj6hVHrG-5H;S<2M; zer5vG#X!Z1Y>xFN56`1Rl{#xO$&~}JZH>d-IEctx0*~;78+-i|;0gT>`3SB~0FU?^ zF)>}3M6}NPw2|ImRR$0Acietmq?|d2K^9qp?jPxe&=C~lZcLighy0jKl&E*}M5XaC z%tP>`0*`g3r?DIXeUZIe4BqiwbBIw*<-9Q512zqfA}u0gXtwttDZeB{qLWjWW^YoR%%x({6V;B%8x{{-j(xg6i8^ zyAQ>SdL^4CrmMxyH~Lz(%fQ%{auepV3LY1|wM|?cpWo=d~62LA~w5XsxW; z?fG1vnjG3T&$#$Mcsz({&Zu(T`dOh@AKWFmtLMFnt z4aZKFY|4oQwbs0|#}8&xes>;JCH6^N|3%twQQO3U@vc4V?vWPCnTQTk=SE|q@*e1> zXz_~NK%DNRg{*5>L0)i@r7IVmfeQImECJW#$dx`lVSx;AK3m$Ui6-I(7Z_1QDXl48 z!a6C=H?hu)k~}&_;9TWSvGGBPI`kjg*Bw^1jKbouBM`xGMq(nF^#HX~I|`cY?WMWW zyan62z-2uY*QDgvfq+{9tU)jdIh?}}piwLYMf z5i|xw!w`QBIiCyx-I9^_KOfdb8j+D>em_L(ODFfBMEqP+;M?t)e=wfOvl(SVALIF6@gjl-F3XW*Z zH>t;&7Wv}?b5I1Bi2>6QFMcc0a&TUbkyzq{mJlha1>UvpAIuwRW zj037n60NC_c=JaJEF5woRAf_sisgNf{E8$xUu(^`Mitm7xQ*O-$u*2>AbbEB*eo4( zHN{%Fh!Ox5*dKloPV#$5%cskDGuuv3NCgMkKP>dfu}2uB!)LLTh#-Szlr*PRj51 z>pqV>_0y=|M|j52wO6t01`xS}safRizbz?gbHJr=Nf|9i6a;dlD?p6oL+7t~5BQJW zhXMdjIb7P$AMzp1!5K#b?A+s=wZW>IUQ;)nCj64`zvKw=B22ED(vB>haRbm7(T+59 z&4uBv{S3Dd>Ba1BfQD-mG3J1%W$AvtUZ$pwUd*=Oy-Q?MtxE@#QMNI#s(D7l;7#pZ zF{}yq_mjo*zdmn$D%%*-30)&zMif^i5z^A++g+b;K6nKvrbxW)*QlQ$7 z*$XYKNN;elEk}Tx+RIR2f|_I)Sxq3(-0R3r22qx2C*|GMp#0XufhFQcz`zu__7;gS zGsvI|4|3*n2-Xm3nC{*0M(vlx?b4elNgG|~JlzQ!%gYn}X~UcS-}3#xr6#h9mrFx-9{6Py zx^rbd?_!vV_!KZXZ!!{J#Spk$5F{HFxJvNGr3~UTje)YcYGKBR>__GE>LjN@uwV)| z0$$-QA{7Yov}KI$kr^LOfryOmCrrO^uh{LQ{VrU?o(~su>Jw{!nR$!QVB+xm&7Orw z*S+`tbo}Q*BD2v{&|BoktNs|sWo{l|N#P5V-ks$YDY*M~8sSA7{^fz=5A)z=T?|J}x)JIEM6=Dyf#s{ootXo(e|bT+2>!rMKvnj>sZ zxho=>-Kvw*Ks`0>$!9gCDI$KIPNyip^|2OwxWRiDt?27wQNPer-n5fkhJa=@W?sOW zyP&Ua@xt@37ByxwSS|B2Mcga2JHcFKWMhZ(%cC3NhYzZV&dc>vIi%J1S6rcUoTs~V zf>)}bopU|ap@$AEyhFmMSmtBl|Gk@G6}WHYOW>LprZuWJ+SrcWQsp|3DOdeNjDB#7 z=-*9D@7n~AzGZT3k?|R-;CEce#=f+?}wWz+qJYqG4k^&~6Cge|+MP})43!>lUr$|$C&k$N; z%gT^rqMxB;miWqmuS9Zl*@2ROj8x*rr|E>^AHSk2u$pBtnmsUgY;%6SaQ_M8Q{PCT zn1^dlL5b`2oHK#-cmA(z(@?03lzvbpRB--L-M-O9wc>PWG?0ay9fsMuN+^-3XF`xc zL~78lI!W7gG%L1fy=p>$xsEMT{!g;w{P#lp*QjOyO zi`p&L=pk=DHRqQMs>B+C$rj1vuiC-4wn^Mvp~5AttC97;7jEl@D3mD+SCh_8b5`3` z9=2XK-$FRmA-#C|8!~;^|Ja>G*0W1{#L!WHgb#2j)=A%+J1+`x0K|5XbmVt3VJ{Bf2s6uHWyQYZX7Kw1FbRsFHgXf2I8vA5@8 zW8W=C`d3J~dzAH98E3I2ym9~W>-M`j2DL`peOL@|nNIOilBV62*yk$rGE>L2k!8XR zag4lb84{ka?OgEdG2T5_mw~u!l14yf5;HPJFA83$(=mik$-45_0o)RfQ9!c`pE_KUX@KWq;oZw&J7sBByCnns&h0>t= zpwMcja^9)PJ$SVx;L-;;zco`wcAft48R{N5$V#t#falR9&=L8Aon@5zRdNzNA0h~L zT=@`aY4Eegq4kP|uS+VY+%O+3I0p7Pyx|ggzO1gEQ1TuD(Wa~yS2h5~?`UD! zeW~3$|KLy2f;dx#`Fd4>4s+#oJerhBK1y)L?Phj4M*`6Rn{xi=Fk=t4>_!`g5J`AR*nE@Z#gxP{vCfCVMdYN3NIfG%rvD4?k&fD4MaxKOWoNKilME1J=9ddPqYynAg zr(MIj=)xlQxnw*5(*+=l|+%Nc)!j_upGy?n`+i6XK{Fs=F4jdz&LBo3!BDkQ|W4@tT=(rX_=t zjjnW10Bg76G$}z0ZL!oz?AclMckKX#Xy)XYd)=iAF66+VkNohjF|B49P`e4KYp$;b zoz2)fFh7H>cE{YX#Q>pNzKZllQ&A>#>-|gUp!muQ4$mMy{~{q6?&kuEsD$}z;d+;3 zOsbC>1p@0i#)dk{Uqs_h+5BlveB8Zsk_$p=(k+7)2P0LHcdK1C zEnPh8t&AqJfm!y8aAZV8g7d`NxqIrO^YbyvJ+>ft@4|8S+KMG?C_Bt{$f4AR@Ts{g zY-JRUhKX{^H|--J`fyVW-OPvU#;`=0P1d!bu(8sJ;60#rAca4n$^y+Y2`l!OOcDd3 z+ZEdt)Koc7@PglyOJcZM&sp;Mzguso1F+@kr~#=|T!S2nnV_=WNV)l>7@sgn>25~$hes6;2-S$JX^rWQaNNGMC4s=7qH6NhDjI#>Qs=F7{ch@;?@qje=YwOdVZn*J|g z709}osv^e@_3G0C1iGo_L5wCvp0Kd12)HOe;LUow8(=pqpR3s561nTlXl|iP;*P;2 zQYBM{>{zbbWq(9(C&3#=v)}ku{R!c6qs<&>8N-G%>h9rW_YPUy_BoKzBi3omePcjycMXs6J+OVVy1nlRRWtOnjMAV)A=N4`$&nAjC2fCU?*b2N5PZ#< zW@?w|v5G8ndp^@g0m`rGL<6hp3sV~N06I>@IK0@mxflTA*SJNr__e8mxzdA!BiY4j z{p~BaA*r<}c~bYTMKLBhP_(LZqr<(`_BS1SO;*#@+TeRjCf(&W*m=*1vb=DRZ(_rW zz&BEoO!bc-Ty4uxAxIFCr9hJnrT4>X`55bgtpEU4kH{CGE+j2}OmRQ1?Q(CgUPd2D zYZ%EU)B5Pz@SmSt$f)8NMpb|vN)^p4v~tn>9&e|A zp9a!l=arBST)m8-77Q<)CAZqdj%8b~mpH>Gps?iJlkOl_3r7($R3esx-2Ugw&}X{r zEhw4wm+^L741Uai5XthZO2c{N^xB;>CCyQ=D(1RfHHDaGqs5pmv(=J+gfhS?@37Wd z7j8{yPidxO$5cn#Y4Y;Lcmqt&>`BL9!K$d`9+A{IQ~^lj_6kGbjz|G{>Ugc3%?!FRdV zz~PZ*G(deR9^OIMqrT2L^?#?0^CwMGRH;#(#&(?6ynxtI$&v59bT_pkf=aHZEB6bI z_utN~O{~^&1*uiLh<<}&J2g3v5a3b>?5CZcZNZXuHb#BmrSr*Y06_&A?o#TE8NM-LM+-8wF0ft;|P6%Dq|sZNZ^lOTYg1a~l6qr!R?KTn0~;IkPkj zai!c}s`kw9*70D~W6!8NP{l5UejaQ)<~pEUpdxXtQEO&GJQm2Tvw3}4oS_mrRhVU! zdg~lF;%WB9GHN*eW#w3fZ)Uz~ts8(uj$Kb+u3Zz&F@U%@CpmCwEP$P4xdVXkLbA;~ z0G!c7VP<^>LUE zQ;wV?4Fpi%6Et6vwi*_bV;?vDz(A9YZfsP7GNzaYByE0?!NEWeX`armRlTgB{|DYE3>#V*}-`mbfyZ%QMyzkQr+V6?6-+hG$*#Nvoa)fVtC&mYP6v|U`>meVt0L2vW zZ_4&ogCit`tKVO0cQ}p_$$J6B7|Zo`yBNe($u#VJKl>}~v?tHak&tt2GhJ{&*$3?Uw>hh~zgKseVY}9y*p(t`N&*h|t{R zqsE(Mk61dWFVdB8zWXuaNzowUHF3oHp}+r6(h^0s2Q9};uElpgjU5&#UAAhk<`UyP z_V$0yilh@VI|Gk0$tj)$Ds66esyhim*#rOn!)?grKGC#949dh#U9cZljAs;1m`0_$ z@BaZfK*zs_{DCVIKwfd30%CP-51>L>SET^*)MP%>l-X6rr=X0+iS!`vg0^e%C z`k2Pu1j7}ZlyOmIAua?Pp9TVs6Suqf zA>#LE5sR0yL@eQMnEabR$M-BNp}K)*XW}8chgNL`bFFve+5Z5_F*Ru zm^ul_S9MXka+ls3{~HIJu-T3jtNo z1VW?FX^O^8*kKTAPTahaza%Dmh{pbN<>H_-Q-L}t=?rpt*iLj2vm?(0nHSAh@L{0N z(MjLm(|i0;BO5;>H3Yqia=l77K?+NYNgt>tY>yuC!Ry^y5D9kxw@cym)qCD1o^V@NQ^Eh1|HB#TL>f~}RauA{Gtz2Z*d!o_Fa1mG&_ zwKtr<#ABz%u)u8rYuwDX@z@!p@O{C8>?b({4}v~ACXjjcTgFV-^ehAJj+y6Zz>$o( zY2mf}-c|wF zUf}V`!t*kMg&GiW4bQ4ReqE0%_89y&&|Q{Ovcc$&l-FhDwh<*_RIT(2CQ7=*9LI9C zvC|SUDI$BcvN}THLTG4eXEW@oFSj(O{>6-4=y>}Oog#99YK&IDS#Fuq9Wor{A4A98j-4rq?M#wY;SX#co4hg7OxWODtA;^1qD)X;qx-Ni|H$n6@-BV`iIr>tY zJrOt&c5sqHztlA-S7v%)Q}&%{K&)djABhU_)BaV-RlsIQ314-l{?{*ef5*%F(U*DG zR^4-DO&e`wT*lDF2c6hD-^V@BO2|RAdDvBUiLB6rMSf5hF2~aB`K8Xz_L6#hqI^3J zC)GNHL79n{^LiSB*E6kVgv^ch`b(47&XNNL_gHgnGjcaCu_mTA9G;gfYEFj)pVmXm zy?{CAMS*l%cZZFJb`Bvk0a7V%s>##5amcdW{c{D`DHkB}Lnx3$wO{tsQuec!e9*}R z$SXc4V&c}I&Ez09i#~f?N!8H~S+F(}TWfM=IRgB#u&aS{c3+gLk(swPR()?DYaP!2 z%TfjeEJu$t;t%v|Hr;@Euf>8_qVuST=UQtU$g2O>u%6?D{t^Xi{L$n^lwj!(=^91~mlpN9FH5%H~z4OZOn#f~vL_iX1Fy zneHIIQbTw>RgN2vx7pA2T z24!3R)X&#Bh?<%V_rIIy5RAISlXqP3q8(LLCzZ~zG9(!s`an!DVhJKkEsB*-9B)R% zKlc_xk+RbUYsF9R`VJ&Zbsz!6?1B!t2(A0QYx@`{0iSjiCxGlM4AablQl+KD;&X}r zquz`zC;w4(7rL%^9MxwjT||#M`WVCDcg->zY_#G=C?eG)ZPdFw@Q7bNU@jBov|5!< z^+H&UKjSo8A1rYNS#WEy0;bRfS5jZzG)#AQaeGGU{!k_;L7eGTmvjD{t^;Z?4pE zZl9hWzc?Pvcpa<3Shk=(};*@MMd2{IBcebO&?V*5}`C16p^=Sj? znSDqR{BL(WDo)|Yi`3wzDj1QdLt{DW zeXDR~q-wkmnDSC6#~g-yOAbo6S~f|MRAWW;l-IOTh>gG2jjY7Az+`@P9e~`BK=h(z z+v8PE?UgR4oN?m%I#zN82$~Cm>BMX~x(~rs(g!u?m!~34E#sf9;&U^g6=XV%p!A7j*7O$T0VMr)*vY(pu$4*`FBJ2OlxfOobbK+TIvbU5 zp<0$*-1}m$v&jg@d^vR^`Z8I>js@aTcu+~O_==}=CYXp(7`!JTRCQ**C(xqJ4^)1N z8`rCj8LfS>cd?F!Q+V&K<$M(@kL#**vW=5?5>}x6D9c#q&9|ip+2u-Q9q9~x%?|ed zSyte?K}XbJoJYY~l5J!D_?wYZOz%}wt^4<2q28K<@lG=1`2+j=%sP6)=Bjt&rGyRi zI2H$TOPZ=GkifL^D@n$bu=wU{x$-2-X@qMl>q;*OK**RYD$RyAmlvg1IFLI2TdvhR z{d8~|(yAE-h$+7zyhJPAvwH&+;l3SP0n=$xxPUy!=-K?DQ2$rdT;I&?omMBdnF}1=5^)XT zRKvqz$m$dxkOO|PK>GvYE#LvVfw08hP;kqJ0kt*^tigM^gz`>?7^2(SqraX6o zosT27Dc(72vY_O=XI0hOJ#R7cTM2keQw%RPJdR|HN18QjdVUM1TwBtTf6C`!OuNo%$%cEy+km zayzs`uiUlwYgvj4V%(fCPWYsXbfc9Z+g{iv@=|c`JKxYIE^xB`8~EC9cN%&TPdT`X zqKvZGP%oCdy|Vb@iu-_7$tR$HI}=>(tnaS9jmp>Nw)pq_2X~*O1f2q)NYWp*eevn4LjT-i;3!j*NNov^kz`@goJV;cgFxWBuA1>T`He%*%ums zrrs`?!pXORyO1|4i%6N0)g2cl!;E!mv8Wbs;Zji_ilB5I0APQVncqD@P%T3EPHit& z-_fe8NJpOc%SRC-JXKVOQBpg0i4x2Ro7xqldu3n?Z|Of!~^y5S&~v&9la()<3SzJW)D0 z>YOOk3SGvPjFVi3QjIOqq4G|HS}HQ++7{ul*$i$_or$u@J|3q#9R`wBSbb{<`|&7u z;|ev-X0mPI{>bxAu2iS;We1aO2fKw`kAYyR5TQm7V(MvrjDPxB)Y%E{7wbT2Ou=hb zo$$B_z3m*$6Td~sw?UCRle*rf^m!e*X0vIn)dG8$p5rjeYiik*+ zZn9PWO_5h$yyHJ$Yh^&D-fPx3f2x7tiOT?=Bu7>WB68(hi5`ks@1mBf0ZeAATW!D* zyaB@+*W49T#VaWjhcd+&nzogy!5mgibkgVzCxWxubgTmpx7sH5<-jWS?~T-KIijj6 zjkXpMb$zs}L(khR%OJ%uXdxOkDgheZJ98dRoh!iXUWGQ&FRk^ltav4;@Z$pP$uQi{ zD9B80bdZ#S#odK_lrV$)jAvw_Yc0(oh5F#uS3voRNsN1GV7K8uRrdm6_QlqzQ*`k^ zPAD0QM@&ODZ=)8j#)-NdZswDhLZUJTLOVj5EVuioWXR(jD0b3t1d!YuJq!PvxG;x; z*mn*eLXbuDa7z?^zbtsd8={vJdzaDOSs^)QiWjWX+S+DEp%dD#csy(tQ@a4Oryw%s zNcHie=SQG{JX#ee@JjL zZl9kT^p1DOh~_ND{Y4=X?-cH|^`IX#=<32@+av(3Uw%;VI}FuVTlH$)29#*x3!vfL zyhm{>C}g|n%4ACA+c?H<+z?E?|4bg23vzWLHT}WDQ4;(k**jJR1oH-4h%pvIA(YDb zo9|xi^3XSYz@r3FP$UUfTK`Kn{bDTzatC>BgrzSFam=tF`x9Dh%1qi?+&q{+Xf%9s z1MET?Gq}BRQ~GBwgE*GiWmx`a^esju4loPCqwXU)VM<2SP z^T;o?r5DdZN-Rdl{j`P|o9fD!C(eMYZbaxLs7x#~Y4SQ|i1I)=^+vKcbsl=y-6Y}^Rdu5Y#6PMsrI?E!jK=!JDg7TFMeV@}8 z5$~iQJ6bikzCg#t!%1LyS2^R*$=V#v7t1a zhkhmzkrxO*%{-hHaLHk!gb{P>QZnD0QPT);_ZN44y+2mP%&e+4r_SyLGeMKu3g4ei(J)aIrLP;>$Fu!tsu5#%C_aLXXFKD zTPUpUcm>?v63-Qh`4&*N_;K>PMN6~YP~{{`FpPgA#YF}|%d0bzDTJYIdb$tI6%kpg z&|0=hI1-i|8eC5L1lj-Nl%fCN0e}m_5}FR0&+pghrK80IaqiZ?oQOjl?Y6Ox{^=x5 z&?$9#)&F4HQi27s27Gy*CJJb-T)*}0_jc8+KP2*?ydxo?DWPW~L1`O7#je~e=O#*= zKPlrM(F(_5)*&+9qpu?fnZ;{33H)ojpF{)9?@%C{Q&w5zjWouYBWi9%dwPHuXU#O3 z@2qf6*ydGqsE{Sw<0}{4$3^+6c@@a=c3!y)Vxy$oyGi@k&Ti|{jim{x9$gD6eR1wN z8kGMVy}$m&tszT)o`W!fe>M=)0wU*XTJEuGgmUC$=vw)yFZV0VbBA{L#oX{+V&w_?Fv1#)&3vbb*Yz}< zMtu{b$GT9)Bw)x4WE6z>R{Tn9&b z6h8t4Khl4#mwAm*Jcp?~?pMav!}KyH32uNG5m3w^&qR7A+eZ7fb5Q=QPv;9R%tQfg zfyeEnLrEUeg;QG?+0LA3C!<}WnIu93@hQzf08BnEFC^1VLATx|lYL8*VVYj#jgNGu z8KGDR0es9{{e-1`*dD1U@0K8^!L-T(tYD-`+jElG;0 zFOJIOu;^#XPW?tF5%r56bR!9WU(8*Ol4)@P9q}~J^kdlmMZ6K}jH2pYY(Tm04pw3b z$Q4OdQ;~^+_`N3Zo)3|@&V`JhGVVmf^a>fSOGtpp|KC*pBxuZX^>$y>cu~44SFY{! zS$UMrj6}k5)p4=Ot5|w(lyxXvf8GP-=O{~Z z1G+cnWzayFoQ{C;?`hSJC*N&p8O4kaCt9RqWvtED7WXxnFJxeuHiH7*=^8Y8aa7}j zW09kY>cvE@cDrY6XL1N8$N-f4;@n2Es!?_7SRcyFf2C8!4jFU2sg(14KZt?}EgBX` zbLy2-s9`={n<~!=^N1)9Shq>`TYlh`y2V_t(n!BNn!*-=o;7KhsMX^Wt$S>d9D`AZ z9U#4wRQ#;glk$fyWSpKK1>in1b-=}h^TbGT*$@wI<5Lz8AHiK@5re8>EjvFQtHwpE zqfZJ4awaN*4IZAKnjP(%4ME)gfuHe~U2K#0eY6SV>4}A)g$+$KKuS}So!BQv&{aR> zIJq=%v824=fVmN#~& z3@5K(H0BNkkKlP;hJlg63@SnM$6I7yIbUU4)tq*c+M_sn|Kzc?u;+|rC8 z#8YU2ENI1k6b{27+_AVZ#jFe|48?W|W&B}%pVnljmw+HccdgyBi9LY-5H0?l|CrK; zv!GaieJq!dtDN3tR~S^94T*V~&IACv_>#t#ULIJ2XHgyY3hq9k-W;LvEH+71Lf6)j zo0h6n?C=~kc6)O590!#0_a;C$OeI+d!W_2y@#z5vF|IQA=(pPz=80SHJWkobZ}edD z=KiuVoQ>^fgOR>sW@!ia-L~H#s2KtTWDAD{4QfB;e-QSx@nRKiEeRVmGveTh;!{`1 zue)edqF862GAl4f^((z&I*X8~e;`oO$&ms?3}2!xls0Cjl+z9x+E80SP9Es|PSzhn zWj~(X$eoA-x|;ta$HTJCOisC|8`eX{eX`8ZjP@!#M>o}MTnA3Xx~36#CsQSqt`p4T zf!fGRnT8-)*Jt*&6=!JYZP`8^r*TDCC&krQejw`*&zyvP7_-kRP>7wKyUHIH-WKMa z-jL^Y_9+`KsXH;u(IpvyC=l%X;ly&;G6vRjsJkp1Dxv>^OsLLi+`%grit^e@SmX?s zUs*cD`dk%Q+XNEu=MKP?D4N8#b8jEL}!SKun;*nB1|PK`cznvE2w zARngakn?g$l8CJFY2z}W@L_ZG{)xY%7zs5YPd}LCzxhN9V^Y->|h6N1_WX8h2P^IdPn771ymgWnKn!auaGtdo9bUP6uk^6mRW>F zlML28ThYNUQ@Df+D1IR)s+1h$R_xX=FJo!bv}_o;c@K6O_i@*KH=;Z8VU*H*58XcM zRfvX7*S%&nsW(W%ND-R?8-XEeHZl@(a)d3PR3N2pmtfvX`WEF>CD-i8j!--nAAI+< z0lX!ICTkc@JL9+1YE-X_x$rj2nvyw7a`)%@P$VK?;M>cPe=`R7@ejO}$s^Zo_@nu( znwW@Zk9N-1DEf0EcidDxd1`WmH>1`_wm=M4U3Lw`&!X8FXocGHW%lPz3 z9?R0Dk~Sy^WF$O=e0>SbwOQnrhUM(7)npMz_E&@ldGYXVR*Y09#Y}0VinMh+rcD!x zMhEQg_&^aLoOP*N!d!mdNkn^sRDCtdXwZN($bcVNFt=3YXJmJPkcWgn9+M++YbZGf z#PE#LS!5wM8mDi#VwPSXjv1G3@Bv}NFOqVwaPuPw=G)mcN`W~LWnPz+RpxwLg^I)e z`&o!Q6FMleG^b2XSwfESgQW6Wxlzy&VJcwt0bYIQ5|=-D6P9b}g#XX<(^H3Vj}!N% zu|jMHO5tK`A(kWxOa2Bg)k{Ia9x`DnG>(plVsfTt1CCr}4eA~M*LVWe#bkm}KYrpvb_vI%LY zG}5WECe_tG7i>QKr3)m6ZY16qp0tXBym3zP@c%_L?GYDb>n zgUaW2hZ=U?<6{D2Rmk$u$R?Y0LI0248s(Ih)mW21CZWQ4oMfol5tE9kaj&Od^A_*_ z{c}>%!58_42kyh8;8dv(?v^;du8R8@F;i8kfaCBDkd z?~1n%>?V{_B&(7wfi2Q{%2A6}eEgB#d8Xdp*Nw#2EX1%v8@!-z9^$8A#SHBMElBNF zzB0lH9yy_Zw2@{Y=&DR7s*nvZw0sMtaQ0a#;=*W3`$QoMd??_OAdf}B?Mq2JV^C|r zpAjl|qpJO;@Wp2DWVS$t3A%(v749*g`Ouat!}@Cp--0AFyA>kGVkFLy2EcxlxdWhq z&l4T5iu?lUg*6VEfhrpTB&3426d+T+jbC?X0XQulC2fAivYNqukIC`7QSMw+7y26@ z;Y7);;w5>yV18Ot4DOkhP1C{wrpVr!ICB?+QAu*@#Xe2DZ0 zVMDPRPM0C|BMeh<6%Earw*!SY9VjL4UgkzZ%*;Ff`=f8J<~`XzrHrfMWSOgAtE!`Qy4Zkd zzv{T#Un``NK4p!zbCh z<5-d2qB|Hg>r^C+_#WhvbLL##;h?UFn~C+yDco|w)HO(a{Jbh#){;^_j>%B_`6=*> zUj9rC4nj5DZmjkG5ryMQhOxrwt4Wyq7wA_;cKu+J#;gwCkfp1o{Oy(%yaB{%O4MpT zojXo+F{{$S{0g0uoDY?JFxnIf>K~(EBhjg?ro(|Adh#~J$D~S1Y1$!i9PAZk-N@%Y ztz%vyop7Jq|0Xh0L0sMmJ_B}e408hF46>Np1pAcs$lrA!vQ2*aHl{dEGDkCg77dro?w{Z;3NL0kEj7ztq;QVtcw2Hp$=arbEqpep06txOe7}Zs-^+!@^&lOVl8VE&0$~w&Q&YEc(mq;3 zWvNMXzP;m(z8q>KJ?AF%24C?CMb#-$FW;LV5L9C7-=fOnB%meV<+EagL^W*Xx1Zx- z(FbigAZpfYW6=V2v3%l)L2F~njxym?yn-#NO(E44)CT&kbI}s97hk|)4EBqr>%_(# zezT~K#$(|CrS~U0B+Y(x_Fd{V0d+`iRrDBq9XDGh?mOWumj+aPNq%n1wd)-(Ta}Ch zeOQi^4HsfwRyW$6_osXN5;<(=@N~8AIGo}G5vJOY4X_&@2!at)nKJo!dzmZ)r;juI z#c{S#q)*hb`_5A)G)FYIqI~W>O%XDktDqE_V-#}0pppmIABE*vD**)rtKqk$j#lmTn7Qg5!-jdU}u64ybrb_D<_UT0XsBKG!B^@!+=mpuf!iVd_p zsvx4^n4Fs)%0#F9!;ipCDbhhb`7>u*EoBIXM~O=E*jTd!T8<`deZg{z zQAIau78NR)(9?@#WY2NWzae{qqGpmfT0n_jg}i_TS$kqpcUG@PKQ(qZzx-aDAU;#g zcLb0QsHD8m@3nUfej$#KraI{q?A;ZR#XAeBO8j9fNUsyYvag6hwEq>1GTYY&yzwDJ z&tZ8aa=d71Ilw5OXVQ4hK8Zu|#omx&B;_Ia;#Zc4uv#t&B;oR*Z2QhVLL_iWE(lYd ziSnBreKTT>EL`n|&|u4jf`;S%#YLs%ZK0?}5NA-FOw{e1i6te82RG#Y-qh_7D@I{( zatJVqQ3{~mE^dt1Q&2>aeWHi=YFw2nLYH)zdhpP*>Lffb)(PWysq_c`ApL?$FL%!J z1#EK$5^C4W#4-WF`_u?DS(*_nFI8%ioeHntk(BrErR?iZ z5mLF@c4zT%6e?4m-h28-ZXjwxU39-XQ#(aiZBfxym@vzh%D0HVvBR1F;9j(=*-&h9 z`&(g#6ySGv$rCS}%z_?oZyDUlM3azq#P(vZGK*cr~JCe)f1eDGBLl`N@y zI?>46q7}=diibUAa#<0r^8`fx7fgw9my}Oao}CO}yrMq~mGn&T#742@B)L}zuR8!6 z_f&>RDTQkwz>N~a9r;y=;`iOF-VS4TL<~s#i6JxD`>LaTcU)NbnmTWpuf0{+-3LIO zJX7SAxK10aRkJxQg+d+&Zx9%C#UeMxeOt5-$fSB|#u@NY`v9sq*<1gVD;2H9+Qkic z8OpjJPW>>C(0-Q?vAfg^EZ`cu}csl|@rIkGv7dcMY)AzSA zfSL6Pe629w8XvKBaKw>NNx1$#>Y_#(IpX06VpQm!o$Jnz?d=t1jDSt56wO)(+POF` zI}G00t$0<#{HU76i@-7L#GwxNrEpmD7K z`|px4@PM%EkH0Y?_5sE5@I7hcOL#bK{|;K@JlFCInJJX}dKW^bcqjH9?s# z1y}q_0()0#8OvxY$GHfdru_4+8(i>8RUdNq_)GqWTGTO0cI1y6Y{}@54K*r;orR9% zStOV)!^PMVE;jeG^q8C=YfWaV=*oMG zs(e=$Cm+vE9p#AOtXTX;BIX36C*U?)<~r|+mYZBoi8MZa)O-E2o|zS42lJKvNR5zO6u+N)<}AyZG`G$ zvth_fmj}mv)xI#1f?)kq88NrD)&Kae$(se{9^z%N0Uo|GSwhLDxVahf-9pQ_C+<#^ znqxN~yxM5NmttbsP!ric!P4v;C|BT|qz$F!jjVd5RDrT|H zfT1)-*xSnNEC5NEvx2Jm@( z1y{p5$)xJ=wuxn{Ceo{hh!72LQ>Nl5PdFHI9*^a;B%tg?W+oZ%YW}oamZGX_aW=a; zr<#`kME_{hs5P}A{4kqvD5LF{?T9SoaO z1nWp2n3gp5ye0WsNe>;mlhkxCxE=7nQh(R*Nm00%8HKFEQ!}to*HT7ir|HMftsdHS z*oW?Z)B*U(-2cr?Kf7E)d7&b}etNqzG+p(ja7%5M1ZGV@O3oG*4w_|cT?!!<0gr}3 z0mquOQ-XC-S%lic*89wTuB}ptP@qy9y#-`7X3}-~Y{?Y_0k&yPxF)#WHSbx{*E;Ev zwPcd)(8{k2&i38J4~}@ot|sh0h1_$w>KMrs+jx00^QN>ef0;f&DCcLj*bBa9fzHbd zYZ>@5u9S?D)#j7_4IEsJQn~@Yzp;U#RmbSArc@AnTs`02;J1~uK!+-iqV7LlAxU9U zU}RUTaiYyCi)=STLY*8Of%`IP_)FmMmQ+T$R^$|3DbiOyLay*f9~fVG_0y`4&QM-f z3o{(Ys__3=yXrS^b*y7c#s|pHg>#_VnNA2+|0>OJ%Xmq(Twlo}4H-PK0KsVg#VAWH zdsaFvPu7ft{G#LBoWlg0p^J}#^-12M^)L#+ImHjOa$m0bKpwCcT;xKJAdGE5HvluI z|GEYm2?lZ)zo)(J1WrTqF{d|FopEl&`0FgZ_px>aEgA-{*j@ zRlmps#Iqb9_@VdCJWO_8_G6I4&lE7qEvwQ>nNK!ctfVhdgz~99G4KDU8i(D^|M}DzrEr=I%!)pOU1#;UK(r4JZ+ZPe)I@ zVXy78VU`Lzhfycvd?SVC7R&2?%IaRe1VuFs6H&{t((SD5n=1 ze^YwaWSgAUyU^qoYLz{$B8gXRQdjK4=Frg*;k^F;3;W>-Do2erxZZ5MJpr5huo8jQ z6s6jr%e%w+3BH{iN3d(g#N#V5Hx>m4Zwz^x=5{9_i2bvSO>x@Lh^wZa1PbU~SIB`p zB^iOVc2yJFghkZuF}M%?g&~_m_$&-Xc+s#-hYZV9bS%f}z+a;gxaor4bz`iw_e%gp zLw#U@B_^vaRN;LamrxwoCtR{K-zz?=(rAS20={T)aQByEPhn-8`1D0=Jv!1Coh~(S zAoa-S!S#B5Z0pkil8xQeg6b!%9Ken_K_KS|&j&1K=Hi?&OczJv1?G&o*D^ztv@y;+eAm9F2o}Wg`qJ{4%Tpl zKLY(TtP5!A2mVZG<)|<Mw0;W)9s(@T@=W;=uCY#tktOv-a{u}Yndm(KmRq1 zrj^CHVg&`kpxqr~yb((FV>%vS*2b*KKUJpdtie#nF59+!uS-no<#jw7-uZS>4*4eU zuA8y&tRxq(Qyo?uMU^m6XIr`DW{Ya0)7{(ptOaU)L3vk>TIgf7%Hbx7w_tt-mS))< z^1sd=i(3}iq)h0$t@f3AO4W&hI*6d;0Kk0Y4*5g#H|n%WJ?QKD`fz_^73S5fsLJJr z$C5i=ggm-!e)dvGO^Q)~jef7c%Q_Ik2I9LGjIo{u9&JmAiu8D24s%U?%`$hITmpr0 zo}smjxQ?UN7kbpGwO%Bu1rt44e{PuF9irFUqQIKzw4LN`T zTlV8|)}X{rJxE7?UL{wQ%pl6&Xcdl#L#QO5ImyfE zW*sZ5Nx<2VS4Dne?R1#vcolI{4u4;|_lDOS*46ej3Z1NK2|4tG}FXT{| zII}ft(F2A3)y=keAtU|4|3Z0V(Olp?-V2%W(^L^`u`H%X-;w0Qj{xfZ)@ubXCZAZI zuCua>|CR%1OVICoGTX69{)`G%Gy>c(M$N5D zt3qhwSl199S|aBa3J%dChr?IQ_`C7I9~*>G+L=&BZuh+3r!XTIb_4gfdJB-Qy^mk@ zyzk+Sf0*E$Kbs-9J5)y;3BxocD(%GR45_T;tnnfRY$>(H@BbokU+vf_i9tvW9qndV z>{IN_L{Qwgcx6`(`?Sp^S5dw}pCmR`l@cXjN#VGn@&$|^g$mY-zqtdszC4Ji;gV=i zgRRRCk)tA5%rhdJ&432X9&PfZhqwI7p^)FHheW)d(D{b~wu-OTXeR(_Pv-y+YKu#4 zbz2Xs!cbW`Z~eHoDP%~0U=1klCbftXJtD7VBo2QZiU7GKcZRxn$P+6Syd{yIkw8%w zhI-R4jKq!!z=elGbV*JbgbTj4SLJTQmz=qM((dsoy~5w=Z*~Euz(KgyA;eF(jvXl0 z1}On5A&}*F=FE_*$}vU5bo%vmpxYO1Ib-Fmm!hTGptWI;{#7HZOL1I_Ll)SSQLGHt zPxK7I=Jo97NHpi?T$n))!dLT0 zW2xhGK_&;h1OHL2-eJ4aXRHxTAtyGApU3b&iUG{e$GDxrCE)PEJLB~v{vzwbkOJNg z?+#^X50)GI_pgmta*dG+wSo<5@T_ zK*jXOnPd_bp^}1(F{u3#hh;_V53f!`%XmBTbXgk=z&YYLJzG9v({QzM-feKuYW1cT z(Ot3S$>c@GppZk#*D9PM2j78ay~mPt4ti6(T~HblwxBO?q^p-vZ)8IK@Mza!4Am^` zA=Ogacp&LmBE4mHfG#)Gnma0U3((KV*TuutY_N1C}n#eutxXM)%p+N*6i^1m27 z1*^`dkVz%8G#n_1Y{-uwU~br>yG6`*pU!0yNVy5-Y_3%`@^`~;NoScYresxd@VZzo z6wIzrJD2`*J+R(?QQZLhBSYRam5A1Cg;0WVKB>jiP=#N_KdC3prn78?)OCjYso7_s z(*l6DznHoE6j|Pj{oE(+Un|X^Y+$jo%wReZvEmqljgJEMx*y)37o`;b=61A=saFW+ z8oa4$vw8sy(oG|-JyEo*1)K|>INO7c9c?V0+H`ebKpQN{)c@uY+`Jd?7$o$r{i+l; zT0vM~sIhlUShC_6F~kE1*2G3o&G0e#=)d742OKDkh|@${pB_3@D0HDI-fWwg(AzbRY*FKn z5c&wGnVu3*EqXaHvPxcQ2JAg5BGnGt8yp4}K6Us)*Ao?ou~qIK7nIOl=|RDOn{IrU zK@aFm^<0+Wm9HV29DEd12-V>M01Rc9y~wvXwZa?X{ld^S-8JVJU)RM^f@JAh zum^ikEj$sX=)Y#-uWl8w@HH{ut}SpltA2Sbe5~Xe1lDw4jPf?TiE1r?71M8L92l&E zMEy-K7W8vDfzV`d7}cyE{*hffx3|fMIPDTy>Fs_ASRpQH7f*v=ebd`*;1bfg_>I@% zvyW%O9BwNfR`HlNzs|bdt8@2me9u}zr3r&wBGrS}9mpF#pquun&4sH^o~AbwXRQSg zmRS$LhVbz86oWv92x;9SQD6?nF>YR9vS(rCG*z8;FoOjnD`h>j3Jst&apvh2GB)GS zxQdL})`gYU5K26dm$7)JEUyHN38XE}`c;=5x^-LC8s zgbkv~OAe0Tz{s*{C=v4j(~t%LzS9l(lA!mO(s!1*Q0ny%SI6hlN$khWI)(kerOc6i z1pCN?@q103N*PnU=GlDZ(%~LW%<~BoKH4bygK5UTs$T_eOU6{h6!KM{qg^>0o%5{&fD1A~+@-s#>_G0hAjx-eAy(TvWDb^YtZ^sFFfxW~#Ko669R zAwVYX`q0=WxFmMlGQ3uS8tCJS!~~urNLrxj&JG~P#6U@C^kG^X+%Dp*n@vjAS|v<1 zCG=64dQshZ5wmU_sol@`%L=E){65W*j1sYRYt(w0Za69tSF07DoZZi>tCi&2_8Fyg ziK(SSznip{VWOSL1aStEv@Ou+J_Xp(yukyz9m`rHA5)hU*mKj%tNBKj=*<(>Z-wQm zfpJD}s`ssTq9Emod5+V)JBuzX+<;5ek85AvSR)qmOVi(>ahSmUV`RH-Zsrcc+}}26 zX~Mhj422Ij4%B#ggI><2@lqE*mGYTY$6q(iCeY9l&&~6u8z_rYu^Tr!SIjfOuF0GF zXZASNIt=sd^ZjW5XWV*)*K9RP(DDD^A4Zf4`oW&o`r+*gUCa3D${I5*&(k zR(*oK8#I?xm^Zv?`%~s$x1l1M&FE?HcG;+h6Y)=3=xLUTiY-@`m!j9z5YPvY`&S@N z7T-1vhBNOR4IAq*OXAILICwz?b5HAPS}?-NM+w6(jdWdMzdPrD0=L4E#WJqKZQch7 zP0~x9uEVcMbz2uoue8s`G1$pW(asfHyifeE^{ar|C6Z*@^p3a-Q(#_%r=BB!%1mEr zTD;mPXx=4aZ0byzTgbyZu(2|fWQPp6e!D304e)d(QGY$A*+JooQjw{!6o+Lu{HD`) zm}~E)ggZ0bRZl)j^tlwiRaR+Blda4r-P9?t#Sx^Xy**$f*FatBFw)>3 zBs3?C#w{L&RhpZjOqHMB`kT$v%whwz0#vIKzZ*amr%7BGj3l5D@21q$3s6)SnBE;t z=y@!#WfmAe&ST1A()#Y9i=gaWe|aw=0j=Beu$G&TYb1HGA*7}s09ux+jY zZyG0L_|hWOdw};foUXD+9~1Wtp1uA4nx>(49BfH+KB(k&%ZL_0sL#H;)Uj+@`z=B+h5=X zR*=3}cdWH0#)-b$d8O|sQ>&kOo&h3QUnM--J$gbdY4yZ)y`&Y7iurK(w*ZRd_@w}n zZZQ3=qkv*}V{4O+>yq_kS-MS4dE4f+HqqY>K zH_qP4CWmV}uHOLx_;3ib!RUY>BQde9lzp)ZG)QjeJLJq1Zi1hi#?2hA2-c4z^l@K2 zXUYr8cHlJ%t&#slX%SpJkE!u!Eo|GL-Fm&;Gzp_AzKb$)_fFSp*(alR3B8qui8Pm= z0lr^+G^S9D@efNjf%9K8InjhAOP$pGpz<1&{qDayUAvEhiJN72*o%)-dF6wHa#EYY zC;&NVh|0%F!iE1Xc}e`YNHAs|b;N!q4Qz(kP4Y2AoX6kEAg2i@6oO8yw+Kb4ek9yE z!wh9lIvlzw{EBAPEk3blHGN6lhGpmQ0&&Ng6BVvCKhAx#(z_Zlb6ZJYgdxe=kD;0} z62uOEhH5w6B9E-8@vv^OlU$w4|iQY?g+$HS@`1NRP`j+x5HxF`vxDm<-DWIm&*a z%{PwoQIS)_0ED_H@dQSw?U6jO+wk2`b*B~8OdHr*kQYTdN?6vbvsK6&&FeAppXecPknpig_xEhJ?o9UZj{$e<3xr;3c4q!<{jdqQFAajp2CjHZe0 z%%!px7`NlgqNHq6d1+kYH0js(@7csp`8l1!=>x?XGWi7OHX4~0()2(d|4C?8$c&xN za^vb*-m~+qu>#oVYQZ}@s26vOeABwpJB&saS4_p>4UU?nE$x*ys%o=d7jUne$h~Fk z7u6KD5JpDnPRb2Sw}AhaVe7D3s<}X!Fi7o6R*hp8Sq*|hw;Kpo6E{iLC zR&IU?#d}PoaPcp~Rfn}_p7YVZyaF)TdZ}EDt^+Lj>GS$xMpLeBrtZ(P2~n=h>9X** zG)0KZzcmvNRO~1cf2iGXDn=JI{PrY}7N!edGgMc=L@8*h)|c2R04hytPGWVe1|9pR z({wQI{p6V-L28bPK&&FPz$3^o9}(eXzkS?gtuPPFlZH?Ke=A=!cY$)#edNHqzhW>H zF%Kl35x_VI-$dS2!RnZ(u4Saq;ik_Fay14b*-&ME8e8U(6fR&Gl)E)*o{G7hXEEt; z8#%BM-Fq=s9hBOyjQ80L4mMj5=W18qs(h`m5g>(6uQkqi^5n~%J|~PCx(K|RK5y0t z8x<~&hXbYWn(~Kd!>A0e-Kzy*7BgZ(+-WP>di@%&7SbdnEtShKa!*g*Uly-)>WT99 zg{tcAH&d}{gP+S&7pePA!+J5Q{k@N%)p_b5t{W#PL?$Pi^gC7OJT$~HQNb7 zE{Iy8gZ;UqlJ69$9N2MILn}4~qu8(Id&jD7Bf*o3lDBP?8)^e-p7Vd`u5YuN%wDUf z?kQb0U{_JeWH@>WZkB3R775BlcK$iAeDX5p0`j6Nt*dt!A5=3$Mz;=G{bOi(AdD7S z6r3yQp%G!n9#aGWuK!*0^HqpDuPNp)-)gLx-%Tp1#d*q3zqH;ZKga4P2bP?Y{s()8 zA*y2e(;g2|*WFiPu}HuXg%IPN7G0qrke4P7p&V?+*ie2{CTK1mm-yE^9oDRJ ze3~Ppu!jAeZYJ@qVGLLVe^tveAZRUh#s2L$LCxFramog5n=ZP(0=40c0VLzz3c=>RmM%bXeT`hx76Hi!bAe7Wx5E|^H{9LG{ zquZ4_+TS9x5-Dg8yJb^V5OhN=Tjb|5rH320;*pB%Qf#&X-a|#1IqPROe28T?-B)4p zbR)^t3|UnhF!MuY5XDs9M8^y3m!P_TcL@yrypo#NjT&!qw}CK6VfTXmX$fWk%Hp6N zUw>+|zO_M-;_-bo>sQ1o1>gui;w7XK{{{QreegmG9w0~cgmXuyoY(eqSzc4>!aMOx zdC0c(&77_~rqx_|M>d-hh9LuGIt?C4ma*^3ALTJAF_gB;W`yQ?2HxJc+sx=Ys=PEX zIfuD?`gobT3G8WXuNqr;Zo5 z;PCqA@1DILq)^};af2?GDTJ0#!G=sirO+nck&j8Y)?QbwGHwo$t`U|`72NNoBw}R( z`MOJnKJ&TSc#{L#gCRzrE9hWH9$nZkr4>^`geh+Y0yHTX`JlS84+UuYaArB?(Z281 zH#Z8l2Bl0>xMVBJds2`l-@3Anfr|x$dpTaTh0@i=zKy=BF~^u?hnrg>1F&p%e^UYR z%Po;!P>(7H3wynrUYLRX2vhmGMMC2Fk2B&EZlkwjJ+sT@ThZ^>BX`{C=4mUMx#cF* zCW&Ib+|aH0?8jEcg`zShc<-O9TO=hk-{b9HbAjp=-jPkSo~WV?uTT=%Wa%-qbD$o= z@XI0xi>j?O(RR!*N@^NJ34uQI^NpTjX=!)v5X3)bYx!HC6ie=O)#!PiKHA)ds_E_; zWwu}Ecsa=sE(;W0ey!;2TfOas70<0J(>yj(wJd5>ro!Iq%|YOckJVi;UhxWhGw`TD zU>PI7%ZR5!oxe7rV=?hzuy&Ow(Nxl>XR>|3TmsYG7v9pRQ1)j{N8nP{FSm^Rx87;- zkhJm0Akc8-VQ*toIOPRZZ(wndNSzreJ){h8XG%i+SswsD+?{`Kuv@ZdV9Niqy3tQw zD4YwRf_XRQXsh8wG|HjBIH*Sqys@bxlvLW#wakLVXK*tKyd!*cy}l_dCm9J9zke|I zo!ky@l;(Y~nxrgRs@D~_$TqBq4OZ=!w-(v;d&j=E6Os-rS0yP9iaD|(i)_8UmN_TK zw2VuB?RGl(_9T^uQ=82yrVNGFq1va8yZLy3pT;^3r{SGEQkkPQ4$>F^%5es!zL6|SgZ zM42ga_A0~mQ;b6hx=n{2=AyfBkx5-E6dS02F9Uvl>UtXPe(yikE${h8sfB{lDKUMX z`#Wfiyt7x?&!@}p`$I`5H|1CUND#_dEM_)J_@uL2^`5|+FW@2ez(S5Hrqs7g^>09v zna*Yx!kMT0e$4086j32^Yq%qfVRSz_9N96)sM*?>jc)(gpINA}*2stxBLY{)^wKX8 zmG}Pxj*Ov%8i=H^tw$5VBb-yI!_E)9AA^JycTQY#lk3q}0AXZiO|k@o_ggZ9Tk|`o zh1=1ITjh01oidRpMN@xUBXYOen?GFY7Hvg|k0&mpwfhM(LuTke>KBrTNw=u44#Wi3 zaV0fS8zytdQ7>-q>i`Rp?)Tm8{0DWu)7*oi&(ng@{wIBkZrRmc(Ev!Ms1m|Q^3WH|_VwXqdvZjSI z>~?4B+46kGc~rzU)~qd(CqvK8gh9&T8K$39hGhIDr5%zQGOBY*6?m;4VeCe*kb9~K zGJ#$L{N2XxAYXWt0TSfqjC&5GQI0Oo;Jrgb=`@gUzOr;cmqlCs|}50xEV?rwkF3)A`kCA<>3r>20j)3#j2Cd2$@{SaC+0+eef zsh(SnkJE$Bp5#Li_N!5z8{%JBVw%-wc35v;y8OywHk2dc?q3jGw3M*(kK!#_y^$Z*N|o{@mFHqLsf#VQOfaDIJjSMcgfTF4Eq$%IAMV! zAU_KBR%hk^z3|Xy1bjI2V0Q&36;ng=p0sLF37sM+xg*q@Nbt+JU^9oS_7Hlm3Ad06 z?!<2N2t#&K?DI&KZ>i!Ub8eiepCmf(*8BRjY}-F)%;ys8W!F;ciENGr?|$0+ktowA zj#g!(%(pj!FCP>mSdngc4v&5B+|=ZlE$j5w#vK@O*ovBQ6ZA1N&Yho zKUGbD=BAab!#&uNR-VjW49qU+D@lN)t#=sFc!}gPa;Ro#zI|%&&O=2Y;Y4~19}h@H z^=9LJd-2u}_mTS!p$HB$cDjI&_@!6{U_&KIE^d%`ucZn{&d|nHS!}ammk3<;C4*_n zxH7_;?0j6h^c@IhTzpCcEBV-)N$6U{^$;6{vAMdtLT@1cp2O|&_aV@SRo3; zWOkket%uSHzmup1>2uM%s^9hS5f~nxj;1;|-{d!q=44K_eqD3gKM4ZHcR*wo!3hl4 zJwvVKTI->-S;0>U1gCw$me^aQqsnfPYtZ2ef5!~};qelq;9Bi-rZP5Z6666L#B(Xr z!$<3VB&d=*Ne!Q%seB zP)tF5|L0#y=YOC_o52!A9Eg$B4V0{txlOL{{UG@|$ZPt07b`OgaIWR_YbC8%!ZI3> z$@lTq2kSu^XRQJck^mBFk^9H%qo5|w0C&~EhT=12gFgM^LO%yZw7RNAr-dV?&Cs*q z`nKJHYuq8hr%m$ETh)p8KDoI^K=OES*JXDWu4&S%k*Kyc+lId^e)%bmYZ;7;Y4BeH z91kU}Lax8mMCfB`&0F~_a-znMH&L*wlcZ277>}$TTKomys9z!b^|1sPXB{fj9RjHA zl(1EY@5MVwb=U(+H>J!gw|k&oXws#q^GhTh^F$4*3fxA;oxNuSW!+B?jRzHm`%3v2 zEFvV-6F-d{{m`95_@X=0Nvy$G3gQFSn_v7%7t?-vstjUtzc6h5JQY!>r zy#r)Q_fjd=9YTKQ(#@!_+nkcJ9D|@-o!eatkrbJxKdDNax#95~8|T);(qxXb)Qx4x4JfWKlMw2M4( znM-^U4r+HFxya;k<^o;CVUx*ch6$tR(RHMP8_tH~r)tq@%HpKhgnU68w*+fC6zz59 zts(XpTI@iXv_scS;uVJb2S$LYm1ZbmZXkzUrRU@V=Etns=@q0)XuD}Hd7 zGpB~5OK$PHx-G`HAop&d-uS0xmDv@Ua5cN)e=wb$xcCer)$rtp@WiVUeY%hb(_XBE z+c9lkd_a}V6h9qL)N*(5`-U}|uR;-}=qv;>tTln-~4{2y!<=L#r0IS109 z%wrK=`9Fgyx#8OioHZCj#;KupgyIj}e)E%<#4=p^+?)RVQ+*om zt?F&{NRl@G^(F(2Mo2lf)F*r4-X(^dzdt#Xc zzX9HO9#DW@l5`$hoCDiJdLVE^SEtU`G{sFcHFR8Yz|~B;akG|L|v5vDb{B^ z(2{2@NQ43JX_iwQD0>ym5cc2nL^O$s!ylyFlB8+8kn1g65F)8c^3}{T_TEB!t^>v& zB&EEgwNHFq7)hZpX!25&IJTt*8I6T1{6@i6Rlni+Tvq>euoYluUAJ&=Pa{)ZqMZ<7 zjSrhPb?0eP!3We_tnrCp-$r)cO|R`N4NOPZ|*!$>$g8wNytAb8C$7QA-=}O;*Fs6oO z5#F>~7UoOcOBW#HQ3vDuJo{T~R`Y0=lIK@nV4tQGHYe7LE4iQSSXI^+u>$sNdi@;R zmHr|S*EQ&t)LJ$bmz(vGf4<|=$jq^v7e=t6r0SIbd`Qc67HBH2#QvA``-LRS@J&)T zKsEoB4~+cxD?68sMa_*jhuipak<;A5W*qPKtN^Xl*|1F1I0FRR{;|~+TYX#XqhwnD z7`pZ};!*n+ifqw)m(5&DgR_uClqTHdQC?r3OggWf*8HtQ_5|ijKBSI%@D@`=flqvN z!tMP5;LS6zbgtuqJNl5?^btUe+zgI-az0ifJaFgcc8p}M zVbz`w7U4U*F56+W^^R9p8Y0b+s>}Wc8f7?NK(3IeoUh`sJH-R`5$hQ2>mE>xFQb_^ zt(<6)7GJkVzJffho#~yeVk;SYeW;l$D0~9cqwgq>d1I3MSmqZTRQwQ@l^3F4K ziBW6Ole(logpTCgKF4Ff3t`Pom)>YxF=xZQ>{#XMHd9XMfgs~)8qhfeo{}JR76U^y zTILcjT!Ak!#8C~7xrr?FoOy%62L7FgLHu%IdYM~bO9xP$4v1zb&euvp0N;T25RC*1 zm!8nzzYY3^Cw1x#zL$wi{~gf+H1V;HGn@DTj&U%Fjb({#9;=KIF#4nN`a!BE8UG}B#b}H~FTBWchs1#uf#oax8`Kw}0cJuD5NL08 zkW>Tq(-tL#HmO|ko*Q7CdCWx6e&@n~Gby2giS^!iCZ95ri|p*D12O#?J5t9i;Nb?x z1jKpcTqWW0b7Ysq!=@Yai3fxcp~cnkUuLF1AH^_^0^}79e0G<0+n~n*UH{+h`z|i^ z-lJQs}~7v))0-k~5*swulTCOTStN+77C8TAVQ% z?|Gd=2o@Pa@t^P&HB7@7EBQ&ReP=cKMt|pAW+adBLCsv|$C6_JtKklZK{L>^jAmLZ z4oRdTX`qcD_YSnq!S#JRGtIT41pqQ73@X)r!#G;bNcQyB?dcXLUYPN)d9^zKnghGd z2wACXu-H;~PA)^wlf?f(JDfZJWpJn_KaXgrz(N&Qk5kbicG4MaUm8&iRbGc{Ygleo z=mUlqfA>UkYvZ_;;wEkOddyZ9RjDdbx8t%?&E7 z-POZayeG-^=WTL*MVT;^Tmm*Fbz*7tPJYzNU zfCdCnOYXij^GSS#JTF8ICuf%S{;~+ZInXbH3E{@n$l&i@iM{;9qv*e7^51&RVJdET z2>WU^9nLwj?^4Fwp@5%1{1@C4R3dc7`eV)unG|e)Iw|{$qkONOrZDAl)*r1PDsz_y zn$0idz4mVK`JY+~@0MgXpFyK&9K6J;YD+BM1#wZ?tZ)@1HgF!SH z$eLCPnUHAj-2v~v*-#mJx8W<)5g3HC0{&2ANx$C^RlGsYA`R)<7hKhU zI>m}z;*f4;P7`n!Q<+zg)J-_ZbZt0_Q=lG5o7qJiU=W76s*~+PK>ZFGNU;Krdwf-? zm(s$lVt{}%Ea_?_<(?B$1;E4;XaO!j$hW!gJ9gO)nd(1-F8l|NCEa{y)@y?=R^v(7 zqiWtmdtf8vf1Ve9!rh4fS+(i+6(Yr_=D$EJAE*6Xq;ky2^Fi@~?oQ6zQG^3t7M)OT z8Msn&0SaDyx3gyFu#9j}9R|m- zXK7s540R#sp!gg4M4U>x?|^@~%Df?9asHY`xFkXStct?~WPeQ?uXfleHiPVS?>EvR zl#nerJXh8WF2y4f9#r7rAJAf@SChS|c_B^rY6C)@@@%O<->=Bb4=ozOQDr%j7Sdnu z+4Xi;>RM-9ldbO*9J^|@pH=`J(+{FLe?u^D@`t2?ln-$?G@)j^%aa}&YKI|C7q-Ku z@OHNvFN@63*Zr=t1r7`XwqnAe-$s6L6_2`rG6E7#1$x^csmOgEhYT5$@rhdKST3je z_f7=QbGFgVIUDOYGXPV2q`Rk%2Sr3s*JUFP%h}x1%(k`0IU3YGMS_^t8=ag)sAQkY zWbW(#FKzeye^8=W&(wTPDYkNBCp*fe+Q{Y~lCNLWz474-Zc;k<-)7~ACYg!^fXf!3LSBl(7v&jITAsqt1mkIhN zhmq;&eU3EC=%D`Y0I9Ds{NL3UVKsY980Il1V-ge=Tg^0P^_93>1D9v&#B&tF3I?Xy z)HpC)$+m8&V{+rsKUs<@pUU&62QJLfyCp-lrt$WVphf0K$r0|z*6xgk7~63JIGfZS zPd%#nWAxlR7uM^wvwtln_O$1Rq7o32sFGPI!TP&FPHXwk`%ItEanVZxi=`K^eBC zsW2-aUnKz|+?OlY@_4>@(58=EV_PmlYy0!UKf2;}NeCU%o_3~VbuYzKy%l_=qiFNo z>qM3e^k>BT;T*)|7pR?e#)Q}BzQ z8z;Z@DUV0-rM@h{y0o22e3CBBzK*_+$k7@R5&Rz=_DU9CKO&cct~~B?w+-rU9^$P{ z`+Buo_!*rfO^h=Y*Kp>P{PY@>y0Oayg1HCmMyO(t*23Z84XLh}Glv9A97jL~S%Wg; zQB&OlNjROIPc&uKWWmZ}0U0H;(fCL2PrR*t{^`}TZ|=Lf|ICVhOWr0~esunL#*;MM zy-d{0@N*%bAelH@^1uE--XSmN9|zf4&H9#Xauq{#PP>DWa;eB<8Qn_l3Yw*UaIxWL zT@FnKBN=CNK)5+i$Zh$*%(t#-pnf2kx1g!Q51e8Z5J>k9=T+Co+BO1;I|gc2ct-}W zg$XdXXCR3xGN;=-Y<`q3$KXirv~02pHL`z=4VLa``$s=mh2b>pla}goc+#NuFbt}P zCtVzW*hhs48Q=W`kqOUxQ9L5}NX8uljbly-lv$7)IJnJGOSf3BhFhr77882gecr0a zP#}|llL{k|0jP$Ep?dl_Gh{QnSPVUxqegtjd@6qvjV}!qh6k61XRb2O!rKGQYl5XUwx9KcAYo*mK^Z9q6uLJwpN6^FFGYkjVnHkvyBPMtSCfz%#Y|CE zN-^|gd=k__KO^s3{(rzVc*o9P98^yGY(i*HQM+#Tp7n@fk0AJnR@Se-EPkI{pK&Hg z5g4!MCw!7nm;0&M;finPKY5)&V9|=ELrg9qMljQDixbeDLfa4;Q=(N31B;)-UGy)6 z);rn_4szjou@hP1pdc=oA0QjtLtHyWISa{xAgj**dt0QCv>ztIUPmF>p9Pl6GnfgW7F>1W|g*v({9WW#+vq)AHa#3anEM# zb4Kq=M1c*T0+3k6d~-Z^cV6`ba77mSj?gt6i`HownOgZ9pKT`kBe7PcC-g+p0KFFM zHuqUe|FYQSIc?XU6b-+iZn|bBf-p(I6+C4|yzug2d~+qDJ;@RUNeRsQp!s#;pfD-@ zW>UnprMhcUL{G)JK(($_8eF*$ z{P;zwWY1RDf+Sr-6U8ZYDJG!;BW8o@F37nUD#6FZ&HgK-nHNyxTZb{01<`uHY}K|4 znfbd0-35U$UrREyjTX;l!RF1F8@D=lc!7-!5MbexP zNxXc-v-_JSK}FGMe<2U!F%Ib>iZzo;fs?b#ZRTC(5My5`IFU7w(F7iWn}v{A68L@B z+KJp~A`DCEar_;>UDXF!KDRX_P24gZE8E&f?mnC3{uN7zxDj*Q{lk`jjS$Pi_n^Fl z1u>N=$dy(Y1c1sug-?6@StNl@ujCubBHvQAx;tt#^FxTvM*XGAeT`!QzxD;zN@|Ib z+|+mI?mL74!r#4+>kY6I?pLS-wDMK!0fC*a zw)*o_5T}@$)8yRg@_wcUEpdOU`1*)QBb3q?H8#yjg~E-E3-6hd60J&qQ0{25N&=8? zQ(#c?#^JK&{cX*ipFB{kc(=UC26{VBXReMZPgJScQLjdG|7sHgXMwxKHe@ z@F?y7$Z#^@+JWr1V7Q(V%*3Om!o4Ib$EAP^~23P%aSKK%qH3%+G6;{R5xRVr zPsbq_J`X1npV{2@YP|3p$8u%+TJUCokmmE07o2PqDGO3RzB+8yqVyWD0xeQFuG=Tq zUzAx;S_$wCft(k6pcJNZ-Gm_B0%eF7H18f=?w=tMhHxpAl_~M2cgFQ1w<0mdE_n;U6T!-qFJrlqqk=f!V;U&X*$v6F=R6y8Jc9p#TZn_5qp-@s55f*qD}0Ab-5DZm8Z zho^5t$2@n4j(JS|5<%N+ksQmym<@ze*ca8M0x z-qM)VqpX~AT5{JiIS#tN`BUF8$VvSHmPP-M;GUR<~Nr6jsEt*g?kj(FVZLp0r9mJ{hhJAd^)PS2S}vy)|Hq9P7sP}I_DEy1FnWxvmn`!#A62|d4OPgsmvH`a!I~A&< zQaAkrBcOObe*5rYv3`|0kb#fks>Qzjb$Q0ue}+LzIV8U>Q69x+5pJxWk=Ev z-K|lvO&FVB_=T^{i6m{){@+oBy|If&QG>M~XiBl~4x3($H=^aJ@5ei+Hyo$#mvA;` zus}-=-IM`8qPUY}=B}uDZj%{iqcMKso;bw`4t+PZrzVhgr z%Xs_`)XO1S@eZC4aV90&H~Vmo!|136w_ArHVf&aNksP^Wy8+Ru#YW(%I2K{-$>wZ-L#tttRVKV{7XRD?$DRZq_N&957$ z$e|bn_LWL?ZI9*2hHggKj49PFf{+nIS14NhyB*4GT;Vj`MA zQNo`3rfF;Kdu&V;WNl4;z*&i;Qj4Enj;g#a7j5T{#3Po9UWsn)#oOaYJHjNdJ@kh{ z|Fq^3mDeJ6BEel5V~04I9PMMyVw0iXs&BJyxC!mnwZ4BbKx<2lhh4X^pZxr>1Rk!} ztc2w8l82x0OD=GvG>@ZYJ~$HhMON_CQX|ZVACi^+K5aJs*Mkc?I)xpM+Lp@+5Jer= zzU=$C1!XtY)n2Beeb|{c@)^4ENn){pMX zj7>c<*YaPnGsG$2w+Vvr{R0DWrmGQbU<9EhWPOS^3(HcQSRxTBJO{UavHjC8=aJb^o_A#4=Jvt`St}b>VC`G-LPZw9+C-^1mu?FL7cU8PVCf6<9`|yZ-)L8G#B~zg z!z@gQMjO+vO{3otz!b{JX7xX%bN`x9?p9SWGVw#F#iQe2V2c#L~lX``6c5+;Br z15=KX8>{7Xr>)UdTi zLsglC?+9MZX$vnvbtm>d@tWjKk@GFlY-%ptJ@S#RxbOYm`5m)%k^Ua#vpxp&Kua7>M+(RP!3+wN_gHOVY3aM zq>5$h5eX{C*<4!CJ=nZd>`(F}z1{!&`DJ45svtR`sqpEg2FhxUYYJQ`%ZwFtgwDiS z+~d}B=SQstRlddX;js0Al?e0jAEQ6IG41|qNTwN``SvVpx9S09CLXo-fz)RDy%lfI z&kHr84T7u0Q~?vu7uw9D^15D%y%CdnZ}LAF&;4N|_#XASj3<#{7;CnMb8|3d0 zE}~qE__?QSs3|zJHr<-Ym1_xT}D3I*pRMQ)eIT6IC=+v3+?pWK>gy*zFO zOOTis2A_8h*6`~bM;&OlbIUdxiTH9;%MK>0>OPobn?#UJSJjQf9sW_RciHb)hvELi z{#^EK219W!sfNa?7nZOFo}uJJT$G^mSSySaAkcdPvMKARa-t~RVz&=RgNcL!h!Jy9 zJM5I=!d3vN<$ZT`UeNNyk5Hk&99D-wsMMxU8dOLCre#JKbBMvPxjdbfTR1OYyH<2O z2qAPk7P#TveFfEt`M^x&&7hUB82U4kRYfjaXI&I#4?uFQ9^0;nMxUn9gJaZ=RLJ+Yk@XxtY*yINQHTYB==JLzjb zTfr?l?hqmma$xR?y%$?G+LTinXMPZGT0pyxrDlfR3J)8B{3SmMrLOtmuzwrkp3;EU zCQgRw&Y;M3#2BA`wytJNh1ifAz)-m&cI$uKFh$!fpPO;Aogj(yczz&Hw>cxIcQE*rxDuLpSFiibQ3`DcNsdvG$h1fMzn z_+&a?`tC*6xmEX2Gvn8_kRFs`@o(imBGG{07cL}7k18@sOWCYg^0l=R&*vDiw=#=e z6wR^Vn#rE2;fRp184(mhW!4tatpY(jq0!$}t0^0>@&tMLGW`>Sd!L`MYPB(S%|TVq zM;HTF`S>m3o`DGFF-|c6v|XgaVZ@4TQgPx4@=NO!zI|qP#`?;Nvrq8ZLIozWQhZmayZ7`eb)k^MYM**(w6oMF!oXuJN02ef%n*5 ztT&h;d`OwAO+Sa8bvdL*>1fJaK5AWY5kmndm%f!pU>`tEIn6m#B((>qYBU0YjOP~# zZN6DmgeNY6z%Ut2&fOl!qFj`DYa zDTg+!Mp9|z4K%Zsvs@Q|nZ}|fouW=o+ke2tzU{AUfIt$&OBi>?)1&2qVd+XRem&S5 zo9}4r+g|xKGTz1a-pH={G}3W*SDK&yuwO_2T^JSd2l2F)_(zyf4W?}&vd!~%0padV zjRunJE&TKBPJ3<$JXQ8GqmXmcAp$X5&{tNyr^AimpIu)c)^qSEQ=*g*cNZJkQ(GL3 ziQ835@IsKPYv!T!AVtr zq;nHs-H2q;BduSUCbi+^h4m>N*OUz43zVdi(E8K?x@W^R0gaB=_qgUgw*CV0hB$Kv z?gSAz7=axBYLKMdV@!8_$>_qij@1b4+daPLa&Yg`U!CFZsH`)XYcQ~Gh4}1O=*7xo z-05WM%Z0~$gB!Q>Mgx0rcJfa|)^l9E7^15bE*y zfk92D!hcC$z7brI__yEUb1_wsBQYKJ3t7J*(o5Y{C2DOd`9^R@(v9dnit3KZv+HiQD3ct;~;#+J1iLKWZMeu^2@W0 zunfwoA4iTOT{2qOJ|dSm(C^rkJ*#7gS=Z`!4*FU^cgXkXKr+^5(0`ftK$jTk5K>j4 zLv?1+fje)D_zvL|jvV{-v{fMIsL-mvt^B$pxnN553^|m?`*d5d&ygFML>pf>+k?hL zk(5Oi4JeOorKqm+naITDWW0Wg#h*IX&mMk{nse5l4;{A{4IN%gylY2{(Mig9(94Ny zT!dkC1jAGq^gKmFZaSyj^XJ?r{uJmk~_c|l`s)sS8g*M-LK9s3`v zxLOJifIGrCxoj6r3Y2|-IOoIT)lazEgGV~cP3ZP$-jC>zgml=@t)gZ%I_6}m%-S?A zLYwbqc+R`LNn_4Y3lsQfhh}GZm7i8E)(m@TsI~La}mj zf00Lex>(bv>u7j~J$94Avnmu)=)S(w$gw@FwLop6t z+eKH2&-KpT04 z?FM)(Ay~6|3;cmg2@KPQZ*nY$%RUK|<-j=bPT`0bOA{K3_p<@2^%mw8n9D`j)4Z4A z0e5APuTBU1eYY7+VBqYtG)8(JJ);)M)Kyo#zHDcGM-e(&xJDwFb8z8L`&K~&dsx)>6qi{oD9eNP+;7*vt`)lSmsQ`PWhUU9~ z^^l1IFdvpW5eespu!1PBL}KW;FQHbiiDuT7X(DlBNR zq4uXz)-jQLZ??!&Z5QSrY6a}L=y&xTq^^YAk-sm|?4=@5cz_5(gMUY32p9^6KA#Cr zu3?t44I$L_GZe_80q)^LvAZ%~bZsjHY-O#a`y{o#*{X?-2fYAEK(@d2MxnJzFY9u8 zkvOu!cJ_|#h7)qH323+0gdOI@QTK1XQ-)r_*upkiW`~`W@$vowQnTy&vE#a8Zp%XV zg0X>Yk%qs|k<$Oc99^dp<4Vv=egUzIZgOq>AwS9_Nx=EFK!u>xluy3`QTOk><-!s4 z0Y~QC1b_-{$GTqiX`qW{)biCMn(MOw=yl0>ZBLT4F=2(MUAKNCtuH-`USU!F0y6H4 z@ZL-Wr-QI4ou#E0Vr%>WN}UyjX_Ce&Dh-XU6b}r|qyX3*JPYoN3zc%|=Q$N?h50ZUBH@S*tXyZ7$Wgto6 zvNeK)|9eFu4dJ-2J`l@(`KOy44QyJEBh%dUIt8Ltoi(9^e z@!9t(rDd0;IVw!t%?fmP9B;Ncs{^I`GUC4&$Y_Xwj#pP$S(kn(NzggkN6YDjz#=ZE z$hRN!)YoQr?B?zcbAy;{3AMe=-zBA<6ElEfSwVw3PoZX_?U#@&4RBKfafQs1$6|pI z(C2Nkff6^pzVho}AACZy9iw3xl)a$UjH90jNis9e6b6YdoK3P!0|0Ky6r@YbbVO}d{1({t^3JuzpmSyh5pM@-xNBqI1Rn4BTuI&@%*!8Ubw~;`^swZ_ zsn?@T`DJh1cPa@FMRg^9gvlG_Jh*sWJ{k^ai`ik14B*r% z^{}YY;sb!{clH=l*54zWaJXko3#~xzZ8-1o?t-7U@)s&T4_9DZ>e=*l#ysD9w6ko_ zePR1Sd8z~rH>#zC-WzjJES}u>+KlAhE%hdOq9BVhKVNWo%1$PNpP~>~aUJ7al)^bf zvo&J#(!ajUn^DQ>aUG`NpcF=Gb4KQ1Kj9kjO&L->J;bV+#jNRC#`IItfT0ErkZ5n!j$B${L0b0lnj$WDB1x12z(ZG%?!F*rx zHKAUVd?S6(MSP0BF_Kv5n6oe0 zq^fDOfL74@;P!ilQ8BEz>hqh-_(mp#9CkUH%6~2E9 zr|IR@30K0`_Pau*Z$I*JX$OokgjS2L!B+~!_eYbY!)L>%3V zSvtYX5H+i&3&-r5xVfl`(C_LXT1=}@Pa*G13nAv%AeHZbSMPl(mPtkq2WA_p9Ag^0 zrlTFb7!Vs|T+pQIHYr&FkrhTE{+dC*s2bxam>R@5`!F(5i*sMNd>p55@=Ed;fWmwp z7OjH-5xNdUXDb>+*Jx`WzT{<<#?^1$ing&`{)+tCqi>&!d2r|W|I`aAlLaM@7g1>%Xf_ivjGyZF)uOg~edC4p?*a(x1zIAP#(hs2@A4l8ax z2Sx`q$no$z`18pa{?iny&3-xtv9T<2jf9*eIAL}Og^fjOJ3koO$MwgRo2kR7jYv^K zN`pgB170v-x8t29@+c0cbkLkg1f&72haJ;XvKTnzQy|c6ND^sj%f3Hb1bql6YQ|WRV@fSlln3R0?S$MpR?z>R9_EkZ3pE-;r|7_db=koV# z<(+R;Us=yo4YIUkQS@c@GH{AD_y8n7%NxE00UFHw#}M$5b76Z6ua^vHbxka*k16+W z@DG*v;M5L1TkdM2Rj!E!F#q}&fRp)#ZxMpf&9_IUJNnk_n`1K<`X9+d5>$)UJRtf} zFo|EJM~}L5(x~2v6yyM2-taZZiRoe{n)D6ro50klWE@9E7!l#I+l zYlk9xF3UB~HuDDPL@nVvCcVi%_V(@TJ_9L#v3Klg#>_k%;;QQll-T_vw`TU75M_$Pmen+l1`wkDn;W_ZlJyPS*5(f%m_`S zMQ534r+l*NIQW5d``b@dVT%Ew%AG^B=eJ4tbW=$e6qm ziD`~hW*|3L>0hzhZ?{9|+yQh#{i^68C^>U@mjn}b8*iB0%Z|-ygVp;VDC(He27>v% z)Zk=wHx$`rj#CGt-ko+?wT{1#KIAa#B#?hywmc)#2i}omG5{{}+)I**xHAv=F zuK+3~Z$A-L#BV1?^0-k+8a+86q9cP)TV+cE$xi*o0PQC}B(^1cX8I;tDm?S$b|0XX zhuDl9#EocHoJh&VpWkibQPox9Vl$a$x4#n1ZZ#Svv}pddV!gfxBrN-cnU~qN+fng- z1{7R$A`VI_sFi#!T#%+R9lt0ut{&2;QpvMPZqPt~H`n3kPiL@IN1OB64G&15Ytsep z_SZp%PhWJMuwiRIWMNw!-RjHZLCVV2l>le^5*n>P1Z_UezAfmVPkSJMpnQ79+M^Ka zY_oC14_@`~*<#T^mJe4p_n_V;;ONLdHI_j-<%%>$<&@gFy81-a>~*OX(pvUxVueSl z<1#cQl56GV6=Te3_{M2nXV)u&dg3t04b5daNcNH8In4ipIP&9*8}G*G(B0(Zi{C46 zkfp=!hIW3xJq`)fBk1Hh{_?U|l5LCtw7va)Rz5KM$nfT|^MZejRZiG@KmZC-@s6cG z@5csFKZ@kMv*qlbm%NTmlkDbSdxf*Z43b;JarAf?!buV)Mh!MCm%Xe(ir6=PFatk~ z;8#?~SqU$bARoWpht;lrpPJPSbqtHqArFFEz~ z3=)tu*WjU->#A{4Ts#uNF>jSaO2@Xk^u*>HS5GRPmQA7#!Q{#VIupsP;-{_p(hd&#d*jP%>eLdEOK^U$;9_o&gPHCX7FIj zj%k0`Hdd9=o|1hpWCxp7NXmm2Cz+6bdS0vgU&qQpl7Ih>{*OW5MRxn&xHyC^lHsQ_{b z;l!g+(Dm@TURXYO!j8#j+4J~?alIVErNkskhAUC0_A1jODQhz+mWeY(MSC`yo9}&5 zgL?&rF+6%sG*BP?#Q(Y}`wmEx8!khG##%j70TFIr&8s<|VyJ*p!ztKG=n#W!&wgIo zks>#k%KcDBW7=NyFCsTitir24mYBXfS6|lw&JeTI8Bu=?jH2@lV!f+%Wj^M`yxENQ zWKru8(YUKs7y7931=$FtfWYpS1RVOykI_Bpg*McphW!^zy7=X zi|AlHcyuX^iI3x_zbN|}=}v7WF?{rjcSaKcO*g>q+s?SXTQQUQ!VhReoW0wQt3qi#+qAU_&3mC2iMAY zO393FW@f2!`YL_9poYEvd6wsnVeHf?r(NBh!RH!?O@Z%Kox9O5`3JR!TAOmEnvcJq zPa;9|ZDbtWw+XPS^RDuUc5jD2@kAj5iDgyh3Ug*Uqcc9}WyKaK#@poiafI!onUnr_u0X20QCKKZhI12)pa~9 zx6x}f=WfM(I`dISD+%)*WBXXnyWEPCFO<%Yj+cGslPjbPY9~bZ@K!xqxN?2X_pT9? zVWTEgAd1HWunWC*Kg?B}EM+dWop68Vz!}G}SVXY(ITj5CIj?IsGpMrg$aq1PLD&)o z!cb-hBL_T+UgFf$=y5Vp$*WoWiCoPWaps^~EXA_p9YDKqbdy{_V9fX;@V`0CI~s#B zUtrUQMqR-{cZ>zGkJoSm3G?t~FaC0oK*_d=!uUPpj-aaOfV~pm`Fb_$wRWPmO@S3# zjl7bH1*0da;%lBBPp>P-xvz<9SV9F6hpv1YnPn$oTQwGbki$Oc(-tt!ukygs@KfIf zm$vPvx1>6PZG!Cf(Tpx3?QS#_b9a<6ZF8o3t-{7z064$lnr1xwUd+Jk=TO%$TSrNd zC*xcZjD)K}nNGd6^Ful{_?tns;Iwj~qlcaPxqA_rS%O9cyad+QraB}){XP~C0|NiENl z`TFDept4*}8ZwN@ z*rXegW70|>oj*llOVNn5xSN8!sAEGvY@B2&`!$Vicq!>qU1Hwc>IpU#{@} z4e2se38)g+For({CP+nkWL0Oa&VkS%TIvd)G!D5EBH3He{I9LL2w);8{(2>Yp*h(B zhY-k$lBKLbwzM#7$wzPFxK_O8LN>!@Tw5!+O$%h)*@G!=3E~^qu~j)IFzIj;_%DsX z*~vFInR69Z8VS)6Hj!FBs~EIRx1*naAMU0)R2wF?RQ(nnc#!elQ3erJ z^w;eap6J8sSqtLfD%2e;UI$nGnFNdJh+T6%t#o-8$hg5QI3hkvu~FsFCvrZys>feX zOMEwM{r&7pGGlrS(?V~_EobH9)pJ$3BE5o?Xog{roiV`}Y7*XRfh(Q9Lnm~mCnAvO zj>G^r0;8MqalGQIB}MJh@j4RwuH&9LZPoGmT@W;TGVqdCT#M_f2y3cc9IuUyaY_D} z-`X?<$k^3%R3MOxDmgt-mh6j?tQ>?BumY#<^ulP2#b>mBWz^6_u|W+FT6jiTN-&)Br4pbe_!9% zar6PY?|l~Mxa~sBU!z6QEHfN)OCZNdLE7Jo8u~z49hmE$AJX+i%Vxj7AifVa-a3AM z6}?Woff%?di&reo1myH0`?yrX29|)noC$y2I|s^YxFG6t&Ben_e1{YG>;*3Y)AGU{ z#`P~K0?vgF5}ohx9K*%+2djH~Xb~+K44Gs(Z;;3RG|SaE(h^kdX)=jZecQMcaJIhm zM#U9^!i6|x<-^l2F0B+RXC1wILom@sqwaf&tK_d8ygb~T^+z1{ZvuvTof$|^m(an6 z-mBU)&zosMOkoBC;7;&cv7ztV3h3hOhS`4S;KpqPV zduP7r?R{|iXvLbV{Qq0yktbJ$-G_+GVi_ z+^zb$CsExgE@9gnV1pm%s;0c{@Dd>}+Q6x^r-u%fP5AzUP0uo5%e2C;=_Z(V+nIAwkLMjD89p zoRIy?&;J_+urU2fY>3WEITgtE0t(lurHKij1?u+)K(?}3$)>-&F~@T8kGE=jiW%#P zu6-=(K`zCy2A;y33d2WZE$Ux1KTOUtT9g;iYvfGAOEs0Wq@xFQq8lt^{&G>#9D%6e zF1fLTEi9H5_mVC#FOITNw0;niHI(-^-sv4}WlEhs#1X9PK7lJB#`&mz7XBCt zMAbHFjXZ~z1ML@W1oiWwC+oui>+Gw`gZKtBtZN_Ah zx{{9DPg2YiXy)zmDxJp;k!e32MA@BisdKtGt@6E$Rgh(0zkm+~(hz624=Ko4F-^b3 z`mYD(TPWm{z|{5l!UfLCR#`VqKjZVl!eHZ@Wi#|fFdn7>{xtIn#Djv~aEJ$Bome|hO5Q4_S2*OX zsUJHN{p_x-p7JvyQ31Q)F}uiO84zCqeJybn zT$I*elTl2e7!}nK2uSG{w!P;%k8aA*d`)}cwPv8_u4X$ouNsSFsQ}Fjtia*~OgDNU zx=1KG)rDFE*_=`gp)5&*^0F*^59;(_!gxZY$H;PQ z!&*c#j?G8}?)=v}>xLfJZ>Y$Tl%IlMxFBT&HB)72sQ=NvelEJw89t5A(iLhn*nCe3 zn&^g%?-l;>a}z9%%U7IJYZ~hNd}@O6{k?l7W9x;4$}V3=eUt);-HI+0-*017J$Lqsh#(mjZ5qI;@FtFU`BuL?^CL9JySSxn%lDwVj@ zs?ss^lki^Nz_kr?B9qLLS>NYCyBlKL5x);YA9A9wkU1NAs|4*Ioe0S>2hAq+o`*$F zL%`r$s(Ivc=^BbYf%8qNeeWFp)#=)dXKB|`xxm_@G^G?q*hoS8;yMH~(R|60ao)W) zkar2a)t;w7j#KbPiz$k|wlkM_&b{^9X5%?2`X72?oQEvwUYC-rxR(A7%X{>^)(kV} zX0Bg?`3-W6?LEOrS1W~5E(FK02Oi>W{T3Q0XenhPykL`_QH+Lpm0ifaS~Q!R zR_2`7E-%{uh@Z!)+*uevzsCRcQdwtU9B3LTFLAD&A;N&;9nJ3<7*bghmf*^ znlXC5>L{tLBh~biO$VhGoZ$hU$%j*|*S(GanKvTVrFHn36)@z)8j`K*0`HK?YIgsT z8vQG5uKMC|Agyp_)%OG{j2uhZZL5b8hopMr#AgR?e6##MndsLmj{}`%R|cR@F$}ab$^`;1~-rO zlX7cb%-vqi6{CXFrD2UWIn!Q$C744*yk5qvrLzBSG;QZ-79&X68$^|;L>-fXB#UW> z1WpW5)e00)gK{zM%=NbBYzC_3px(8-9`22C1iCw zPtOl>8%=|g;??CUxM{Tg&&Y6d>>V#p{p0N3D^;nuNftk2ppC;G&gWJm5XvWN4 z%0fl(rX5wLR`S6E_GeO(rG0O{gJX3PjF;QyBvevC`b`A|@)+gg_dz}$$P)X@0Yx7T*O?LZ(h zI`IGFf={=`Tt|)DlL74||9%Ja>?h}bRFxb2vscs%rp?1<46<9zq{a1{E9vF|GDcDA zy5LXx>ijL=J-G6=-WsX&s@v4N`~`3 z41s2Ia2y0+fKs8f_fxt$YQkVcqkE%n6l~cS#6(g%L(jF@fsm$BN+aMll4M?0`f_n# zC^Pu!VYIo4@NYs!G%kOQ&w-{q&>Lru%OV{S%|M__?pdAWbc!xHBfwb?Z2;&!{n@oBEOXoXc~*O(!76N0p3~HcU5;}V z>7KIZ+^9ZrIUHg0($5iN0E!yKPuvEXXJLu;m8RCabIVcfi?EpriPNz=7lVcqiozX5 zKjbb3{yR3sfuGK^6QgW|D?C-BHawb)>H*!3St3ra_3a;8@N`)Z)Vc)3Zum--IF=*U zA;k_nL&^m4w^Gh9MrS#TW{5hj!{C)d*j&XJOfn`b{M6&r4r_RG9JoTuvuTFO)ToxB zj{n=R1B|Q*C#&zJQ334c14=L}@$ltK z*7_(QQ;=hDrhLE0Or`16U=D|;D;=Z@oeWdnOsSK503%$}uFhj9Rhdv~;fcdB0Tv9A zi>nT&Pe|38#}ZLvOh6XK#$z}_Dc(znFg@-@=^H{jKeP%=C0ZtQf;0O0hBK-YOHkN4 zUw3V;w<}Dvkp+13P-RAU=Z;c=B`o6H3STFOWV@#u$Phxw7~S1R4vy9eYwQfd*zQ zV7a96&12zmP1xnvq!xvxul_!bu8Zhx-GOB`d!ZeJCHjIE#uDPa3VpR}^0BQqS$rk< z+5clLp;RaXsf$c6NdA=g@rE7<>Zf=-4{xCY_$;0CLZHxleflFvS`H;Sf5;D*X{7Z) z)+HzAM}D@*<+m+t@o5il{W>bvxO&S1sn@?)O7@ z=9)O$eSz1$_##PZ)K?|rk9Cduy7MtoK5eAP^B8sbTDF@<3(94Ba%26I5o&8v#0gSk z@U1&F_9MR2MO!1)mPc?ZgLG^q*BE}l88sbkuNEY2Z``AbrdJPYz;jBMh21=&oYt?M zw(cUI098fpLlo^}pda?%?XLI0lk&FkYZo$;B9Wl%oWig}7~G}^qK6oYd4gklc*Aq~ zm%)XV6RX{*Sm|4F?df)x5XnggrKwM^>YzzLwJrb&BvrD*B#2OTp%b+k*~X(5Dd*nJ zy_w`#tTuEhatMkUORnt>o>weL*iB@F^v`0(U%9l9KZQ1B;KC;VeNC|ec9_8M-WGsK zD@_bE@!E;na~4U9ZuAdZq+f? z73B$aQGjIQMP|RcujRGE;l_AyUD~RX1HG#|NHEKI;gnWhs834x-Bc^u&xuI^t~}E2 z;K7U>o=m*uK2Fw2U*Ac_xG^f6QM&~pyb?NB#`KgJmFN0jSLM&`o}!~ybu6st7Aq)O z8EjpSZG&58ltBcNRvD`-&TW} z^?B&Bazgr{LaM zSCCjZu1?%v$a9>;`)Pi8QyySl77`FZ9%jI6UubK44TK3ZW|~CojgjPvZzg4;y2@X` z`!x&IW}nEsZ+uK={bz3zkRU7U}(d3G`s9;y?;)0I@&gr`zhGd6TOP z*Z0&`3ZkR13#YKs?;Ry2n2{1J-A@K)Hu9?5uPkSLdGDz&p|mDzKaG4{ z*|6;AD~R}q z*2ExOUo(5{eWu|Dbm9qU6&oA9S^);YldvuPP_qc*HT|^~(eB4j0Swhw{Qk?8s-y_m z7?1twCKBd6p7=pr!54V9V;5QT1*V>=D1z5KgWJ{ zavKY51A^BnitVIPx1}Gfgr`|j;^*2HsU$|8>7)7~h3e1QH!IT8lGw9> z4~SV?peLY9@Qq8M@65m3))A0704NsyTGBxxC>B`5q*x{b;$v6D9J zy)GO_xOzB4%YDb&|B=Q9@s6Rj%ee6B_M(>;4x1PkI!=-OY|2{tib4}PYeWoOdkO{b zy2HY~_=y{J$};8cSyyk8hj>R&{so=)rN4OSFzoEjP3$4s^_FLjPb~zS{@oU5p*Jun ztT}xU6HAHeQ5U(2}9iH;wI z^oCm@m>m82L8JkHD1Aou8A<~j;#lCdG}0Hw^&5_Imp$r_D<|qP1-=29!W>H8ek06~ z_OpvEq7CDOUI|LtpaJI#AT7&NXd*BaIw^1+?xH%=+bJ30Oxh#7k*Icipw@vPGJrQ4 zAzWtCpHhFANq*&g62p>!gfJ>pt7ZY}XELi|VrI&&OeJSRgVb$g3J*a(&#aYcTX|;S zGeH@z1QpVV=jVEUqQCW6dag;VMOx<(CJA5y+D0Lu7zp2ZY~3J+q@3F|n5K8(#s8+s zWXup9@YlImFuKFwm1kv!g5>7Y?|(WL47BRIjY!=oXD3rpf;3hNVlDZ~0!%X`jiZE1 zVfQQr)u))i{9|<}@NFl~QZlq^p)c}Qt8mdYUx_>5&a+Bz=?zHxNp5@dGN>cxb^fTt zRy!R3f)`v*7SDTI9I$4up9>^VsmaXmXB?=B$Aj_-ryDcNkz&JW25bU+Bq^Oeuo-G$ z$=|A+Ehzv#pYGr6k@h@lHIv;ffMW4yD=Wj8#0fdzG;w}`jFI_Y!JQJ-cWC>RkD;QU z$-{}NE^hk|EOUC35)ubSt4xTT&AFArpiq+_(tY+EfK%J1tMm2lz4DHT$Vj7g#qj(X zVZ1$V#dIf~mbEkxk|I%^uXBnfkb+0D$WE%wNG|f3RDxMfE1#lW%gJm7N7YN` zy`x1|Z!1Fo0Yc-^m!RGZK%%9iR^FK?_ElkA4A=L-JViv|jA)ZUFQX2+pc*mpGNV{eEZ+@p!Ds6PR%v8tjfkC~lyR6yDB z{(<)CyW@mc0drg3hfv(_!SMmi!V**J@mod?m;h3Hkn)+)S&y+EI*x240fTiO#k85K zQ#w<62f?Igf)WOnvv8%xraWc@j-Rs|3JpgGUg+Il{T?dux@3b2a1>mU)k??!M-^SY zl=5&v<=9V$ruQIoEfRZTh{xE(T7FKR#Cl)7!6j5+A)_W0g8o>{G)Q0u74Ky87`(BW z!vM!$Z-$agJMcW!Jnf)P zI-OSpQoi;qH;<>V4tvI8UvtGX*5ZDz?Sn4I$!DQcue*Au#(vn;LMkyH=<1E*q@lJX z+^xxm=e*tMt8;ISl~7MdKt@+-F-CLmC3~SCOqqK)2K#Q##A7j6)~l1WnHYe;ewDK@ zD|aJbu85Sv|M||;f{nKd&uD*8WblS}l?0J!QdP%UD`6^wwOASn*XqmFaVBPyHaWCY9?Pki8lqATzFfV8Sf33|y8@BOjb z9tKnl|WE*%CM9`Tt+WQT%+fL;%Dd_%KR95k*+(TFNJv` z*h~e&XxzC07Y2yOV#78&bG#Y%U0ZXiV|c%-XSMm~alDhJeAZhWucU z7k~rGC+jIhyLv6BXv?hz(y)5m?Imd>9L{`dI79c;^?jR-jK@XK!}d^!wmCv{Fc_1i zR}}|uSlk}LLiCWB;z7B@EDSnm`^WA!9>M-@umJs!OL(mnsjZV;iG1Nl%bFS?!R0l$ z2GE2IBT$if_T^0}sB)>YB{R03bW&`e9geK$!z*+$9}hAPQCY2vkRriH9xaK(hlx7F z)bJU#T3)R_{@Q-v8E6@K2^RMOF$-KTEWJ4PesOQs8(#=_sVgDQAj#(IENo`CHp<|43yX+77wY)tMW91+UooLl zrtz{jV+HiF;-F~0teNJoJXD#o; zXhAzSM1xe^Osr>b?^Ifxj&{zbeA;y`aAJ zmPuU86n^}bipjq)+n6bOuI`G_(LVk{4U(y`SDl6eQpD-Y#6s5dAykD`Pf`?rK#^i3 zf?(}mIp$kpNc*}SW8(qjC-8S$SrH(oR%XSYmRn1D9(wLtf@f!tbDaodLTQ;D|D8pn?_bNh5`zaZTWz;xYNGHC!xnW z4b-L0RxL?&>W)#BV@QX+4TQ@z_Km1nnkS$@`#7kmQ}Lk=VO$-QcS#pz-w{1tdE&p+ z$vZjLPH0n<;d8k$rhxX4h2nN$<$^VXG3Q7AXMy7sN+qM^786^O5rHH=`IM`i#iXyD z&|pW2&dQC_5OM-eR3&}fw}%04v3jBn)iMRS8Vcmi?lH?-a;}scL@ao)Z+=D7hWgg9 zjcS;@2%r1$j*$}O$s}weG72YcPYzr5hQm6fwc&bRk1U$Q1OgYe^-oDB3A^<2RX7Du zP>#f^jO0J&l^OZwzq{NW)Xa$EYWA0zzpWv9hI#uhDtP2e?yU1Nqxn}c&9zr&Og z#;6tz09VjjTNTu(yLlJe&TjvD_|ZgQ$uZFSNj$Bvu2u8fzOj*&sK6Dg4_P|JZCDpk zh8ItE3eE3sAYq-<-O$XGCMxiYWt#|XUSyNre2l+g9yLfiGGFJ;O-J*~Y5Sl2@VYz; z+&QiPRLxCJ%2V*yfhOvmB&Q7qF4LU! z;DE7#dj0F#Bd=i;EYsff!O%hvYgyAJR<+O=3#_t`jyVo9ec>U|ZU!8=Q9#>6b1=Ml0(+=*Jf$?H|mX+@=WH%iUEAOAv$5=7y7)5IMo8|r1BM^h&( z-H$gSjI96p>Sijr4%iG1wyv^N-~L<`1pM=&6MbtK!-=IeGLKS?R(>V>z*sFHwq_$* zCRKoY)3Bg(xQ(>Pz#W^rPm8IOefen!xAOUU$>bvgC^1z1rB60->!mXk&r&y_v{n?#DcjTx!A(qJ*owX z7iF>E^WkbK#^zeMxevX7ebhs1`@%P{X8^6Y>U3wy`CV3kyB?MATG4ExkXN=$`3xDK z%ya#@nZd1vZU+!ezynlR9lqq}W2JwFmQktMKIPMnRWsH%{JfczNiSV6>$>kOYO5Rc zjSApVhZt(X-MUwDn)Y@Z_i{U9SVSxxTt%JRxxAuFzb-7fnus*uuj&!?h=8e?z3APcBk33lxy=#yVM6tIxKGGM;g8WU% zW!Q!>!*f!m*+d^Q7{2=xMw-PZ6ULRM_Hx2f=M>e3>SyKiAA(6F?E+%kMOm7+k3wD& zIVzL^4yYatEHnniA|ZnJTab_v)SZU+P7$8Gb1cp)-9fwqa4eL|e1fkl2U@IPyWk>q zULN{5S@K2%UHrcflB%|Vg7k+5Wc zMTPQ)-A!ro5|j!`Y~M_sgLT&(tw`{taVm#i_we^Ulvreuu6G}7Uj?X&R8;Biaywd+ z%)b^5#~|BE94@!1l+VqPJsIE(7^l+E#9R&Ma=wP~h7iryDSLpmm+#K_b?U}%?U=PV zJTaOOpt}(+uTd~KLFJ}1eLu1Un0Mm~ltt5YQj7PLH8Kqw1vDzACu}7gMW@$uBV{Oc+zH@_Ed@wFl?Azem8jU&tABHi(Z1t?BZ^aWsbQ>!f<~W= zG8Yt+%!;SspGX;GDu4G0+Z>nu<;0H(E*7G-@jZY<@JIw6$v0m|RS~S!3p45#W0SZK zwEB+A3HcB=sQ6vps-wta#0$#r)bzH+*mcB&`a!1x(DvBbnTv|wqEN_SITV61fE43{ zRys4;sb=UNZad2y3A`M`SNph^DkxTjBX{JM zCPjAzpqSI{pGh683sXZ5=1UuTOB`O*^>N{S54sx&f|`Y%ESplqM22fJ90Xd-+M-5< zFNTn-SG5p;5Ro+7yE$RuIZ;vx4lNVx-$hME|1jZsFn0s{defj{h2e~3?7JvXJ#1yS zmaFXAYbcc6m7%FJIMb*w$cbF$#rsn_7=;?WhB*vP zH!B}OMl>JJO305wn?(T2qETJw<rFFgxRm1~SS z{(2+sENV-`ZZMc*zr(bM|K~m5b0dBa*1Zfau>ozGg6L}UaW6b%lQmXR1$TbjQ?JD; zGFE&|=VNN;5x|!dN`%}A_baS@KZ&efZ%q5+Rf#kEW<76Q9O~CJGU>sl^kXdM22k!6dy!L1PZt(lfYl$F-=9U++pLb(@pqF`DuFGmI?>FVwQ`0PQgl zA?mT2T&n9r8mCy5jBm_;R-eN{2Y`&TqiOZTXasuI$n)Gidd#(`m~-q)-yZgx0Ytnc z)+hGP8nx_`cJvX{ecck;NQd65t#memdB?_(pBJ5A1a1e5`1CRdprN0Tlb!tOX(7?pJM5vuD^61Ak7y4 zQ;RA5#3S7{X*Jn};xr|isw}%T{_Gt<&DGQxMB+;|F3i2X=b?#ME~VWq!A0tTbFr^<}p+aQ_S1 zTBph}yq*Y4?+0__d<+%1%PibSp>FP|OjzXZxu19dySFH1TU6n73_zi-xH4(-xkesN zSrR9>Bb2@q+R@%(hKJcx3w>8Upw-O=f7{;&%BYkXo8sm{fyais_ajcxc4#6&# znQwtq%f!zuxCwvNSiwY8FCV^sWEPZo0lAl%=Ibwio zA*7fvM9%$#hct@rNow(CP{;2(2vO`2d;7SQWzMt|#)$!(9 zDmIW=;Sd^71CF^#kVS3CQ}-b-1&2J6oH|}@jx?|;*rAHYpq(&bLp4T5D8IHiHgmHIP{OqF zvdl+sxT%%qrppGgz)W35dPK8xDSoDkR@6aGYsNl-=TA5DQMLi1G@uyA-MM*1B{g_M z>q-}+BzC4~e!5hrUnr3%sDH-0!$Z27UgUu#Oo=05GGQ@@n)fWQW9ivou_IiyMILnI zC&>sO^1r2uj|mXBoq2nY@keVbxHdAXDMHB;nLd3L>RQJ7@OVAS&{~xx3tGF-fpSdN z>#)2VC{Ax`Zly(hOdj3;WccjLTBY=Tz9OaHC74xz_;W&9-TTE~W1Sq z_S0}(Ks2Yfgm2U)Zrvy9^V&`0L^Jrf)8^s zP|$U#C2Nd%jR)=QNE2oDhNxqo4B(C`8*?eGgb&$LPA9TH;W&9-TTF6+1Sq=TKRG*& zrWut}N4jygD(bkFsXWVe_370H?fx3=LiHpX`i|uO+0iRMZKI#+!}mQG%BfsAHd~TO zh{WwGLtU8pz=N6iJ6rFBFs9Zd7T`tM`TMcjZk=uV53b}b_l)>h`nltqHMhJS^T>c6 zRx;6aBaYbQPBeFd#2MXZ^t5yqW45eMMA{KTDB=HF-NYx{TnbLp(;iRWxF zlh`_9>$mZV;XYL~Ua4;z1~dNv4}UYBb8$$Y(oqS$S}PO%3fK@J3Ww8%PYe|^2AJtN z0&mXzvS|!0m6~4(up5%3B3TK0#9O;4M}Mp(Cp_>U1||DK0vl9R$9-grDh!sIGmXkT zo+YhXA-NSm(WqZg-4=E`SJiHZ-Oq4l$CP1mOB~he7h8Dg0e7l$LVqAsK8|h#=H1}8 zFXZ6>40XNM0JbnY;;iSht(azsrF#HP;9n1oa=McEfW^seIU8gu9b<9k^t4fWl*xb} z>;J-ceo|WgizwJR&V~siG%D(B=AG*JHNT6A22gXUQB@yG*iYxcx3|+9ED{06|NAB& zz#QX6q~Bw*BCi7jU$F6D51a*BQGcr3yHI^wT?0TLjN-87r>cmeJ`DNG9H61mfWYdj z5%E8v!xkZpf!aAf8OD~0*8uBH3N$QjmkE(_?P4+<8M`_;0%b^dbX>`F56+^W^zKg+ zt0pF-xm(Mq{NoJ*N`2QfEWF7cy}+EOKO-PD^gnb)?R>RZtrMTlQUj5pWZ&uKu{JA^ z1}@^)0LFaTd598eYSU^yF@+Vc>fh@b0W&QIVS?c`{(*bETOk66HXCMJ+)op9XW*&n z9w_rj0xf-VU$}Wc#hotiW-k@wm8s{681+iCEeH-{(4Rw4DDZG+vDR5cEbev^lR~1i zk(9hlOmnX3ZcI}O!WYq;waA`zhbGiBo)mLpTXe-CIS?0jvL!`U9(v1MqP*-}9g%EL zfsR$DYlCO$CK8mip~95E4?g6Ah(m$smdN*`W>9$6a~c3%H3ea40Pvi3#q}ceu65^( zEMdk)RKiP!YDIRP?{^7Nx&F#L{CauHtf800FoVjn0nlb^p8?e>5>A)ZI&e#Q$Got2IRw(dBNRm8E-T&9)JE;_ z27c{*{%)3Q>Y0GNYW{f%ef$+v3ooB=4MjM0Abq8Abd)x$wsk>_Gev1Nrm~=b#W_R_ zdj|`V@@+u!|BbAvNYo}GTQU$#!`H;ABjU*QDH`yJo5Lq?$o4uenoP>atx3*0bnG}3 zeSBhwMrk)n^<_&vIB)L3=klLV=|h`gQLLul4|wzYAp=^7A4Gq@@)gx9M;uAZw&7%; zhb8J0luRDx0V`uZ>-rJr&73*oUmg2=N_mVdRoW;tbU>GYDP%+H?+O#FHHz5`4cIb8 zdJo6A1Jz@53oiJ$*FnT5A0|3W+Bc-jw%xy-v8~bRHN=S>;%J~bTejLmn_vyHd!=J|xWfT0TZx`>=x&co(3h?R27+}V#fL7SBs9L39GX<9Kg z*@6C65!xB;odi^7XN4LMmk>5Jw_uSz;u4sWewRWlwcUWld4c4p4j#vjs?`-MwL%}a z_7ttHrlpP!qxyG&W?p$~()CMwrO+_=Cw7`)t%B;0B2>UNg#kp zfRf2@sPzN>SL0aH#nxRdx5M7ler&=h(?@f5m<0Chy<{OxYT=JfdJpi;g()s~xXx4F zn15c`9Vn<<5!Da(S0dr`fvE}ZCKwZ&4 ze@0NjeKQ11)@J;djvG@;{>Ua6|FlQ|u`gwOBTjfuD*9Wr;_lUM~7a#;fNodRU8 z;7__6t~-MwqJ(T#q`y}erd+t5SL1Qb*UX|=e~+_hA$GH^&d<{D^3i8VO}2$)$e{$S z&aFssu&(SE9o~)N7-8>j8Elg?werA{Og-R_7h0Q~I~~VciGPw4C8xwJ4e%b?b*T#P zsJnv%Un1j^6iI|ldNLQOxkok3MowNJI>*uE5vUVQP1pyfuDDrZrU0+~Y+A#K#Ph(H z9sLo_Q(Q$vhcl}r(FOG{yD=O1$8FllT6mWIw$7(+|Lv{y&U71iKp$c0KZmLgy+uX? zGaNV+IHdC9w&Ur3g0-zVKSz>5CFbz!Pd2@;(zMA8b=2?Aa9>4ED53BHnX#%-S2JK$ z---j^R_ryq2u7Jkxjj8UQi39j^^PQ+5x7DgbzvLfzG~12?E5}MediKYi|(arADK~r ztaJe<4^~4f=CPFy{%gaA^y4oZQwMIi!n&<;sS+Xoj`%ika-+_czXa5IVI0aR_$eeA z4!jKPW+wGVex|hcPN|DY;)DM8o(;?Fb-Av!U9^9Xs}tpHe&%)M0}7$yiEEF{17Xul zCR1|sPq>US-iW6Z5){Aa)y^C0PvgQd(ns*=6fQSe*(Bvhx9(YdrhIrKJ_NV(YieF6 zt63vhqFI!g<1G5aMKQ$5$aQ;j#10(x7s)10UfBxb)_`sZuSToeEK9!T@+~!~%s8rvLcG))8VPGo?&_w0bIdO{J%uUtDFf z(NTt+Wd3mb`_Sph?Et!A<`ks|OuP7lc0;DNAh$-AH07Kna&$r+F_!$ozXmY?H;jir z7ly+66jisvLS6r8CLppTpKZ?;-}k)ZJnYaE4lih$A+Vo$83W<`S+@Jcf61MTe#%4V z+6BgkbUn$L#6D^tTkIM4_?W13}vN>)KrNL23peBCJ0bW z^*V0Ar8k8p;|tcAbykVMF{i6gR5X;@a*K)!v;e@qIGZya*rhzz9wJ-rts`LxcjLms~BAQ_syYK z_9IZl>(lW}L;edJdCQQZ(6F!&|f zt&*HCVTyt9*@WzAh_+8n4`tpm#j+OyridxBDTaC^DJzy=SP$p*-{mQE#b%1Z^H`jD zU=&L2jA_A5$gQB1k1$wBAVJl2BxH6>KlV`)8eNm}&yM2iI3^LP2Lxa54ye@qb?^lD#PqOcXm-7(kO# z08lNQlvC6wuH+JAr9()>$5sp$Rt}E40`3fv{`<7Zt`R}UzU`$2lrUpuUZay7?cQ0Q zz@rnOLZ8szdqHE}2-S@!T~K7@n{O7|poLml>E0{@Ty^}Xr^n){n5wdb#bFDh3XVBs z77_+aeKZ)s>nGy@J11$h;G*$s^2&9$Wc$}(Q-I5z?= zZuBgMBi1O;>Xlz{P(~O?YAVg(t6~Wycp6R15P_Ds;o;+nMka|w^fB@0H+=rZCt?i= zSG_o^8m!Bm>7$^2U{M1!pMhqGhLOC6bxw~VY5YWT*mZB*!n(N0NnFw5U9PW-V?ZcR zp(1qLLb0H4ALF0AIreJ}HR)8J@V4lkqFUMn^49G{*vVxE(2W{i>1~6&K7G83EbVMf z!PS=vQ#F?}|16Rv-@oQ)o&^m9kSXN?mGs1lNqsml7QVWFonpuNDsF$+#OP_9ouQ56 zKIkf)9CR3wZ1#h#)mcavMf}MXQ?wU6#cl;qeR=n*Dt<4-(#n7TOcW}{@VueH+jH*M zigLG0M*58^kMv}dR%-ocqfQ-QlqLa)p@7WLi#;QwpnNSoE%k?D6H3m`Lxj~=B^DJ0=2VOU}#>}l~+OY-BmkTuo574#`Cr2C_c8c=j*wXrP{LT)7tvcSr}a+cGLN6mLr2;XRPR8HyBggLkZF18ow|FvODy zwQr5^VB!rx&@v@Lc*F0iL}{f=sxC?d?i9No0TRb(!EPsR%(lz&6JeqGx6F_dV6XTz z{I`c4kUpkKpv5>%)-AFb_;h^S04@=*1GH8omq2_w+ZV5%;LRfy#TH9r7Zvrd%06HC ziP*vO@kZO(xBzN^$;INUw0R8~hA#JlShIHoMtyII@@EVZ!rSEy;F>?qSk}yWTV;cL z7s4^(*{Yf{ZnqkDR+BC3E#D(9T=Pg??q$85%$;2U7DP$iPzb>RkV)Y3vs14gkkk=I zzXc?n#YQzmjIPb7zeh)8#|wDbfRVnXlQPpK#zZ^5SsyrUAjYXQTX$s9+6DRv_h%Yx z<_7HjTga`VVm*q8-{*V$dJcUc+ZSq$>`6jTccJzxnWT4nUvMc@mNtvI$!!9L26l|; zk?}j_Wf?o{w(hx^$CXQqM{#rdl`Xw<5al|{a*Ywns`5voD0-e}2?~J=Rs(-!?O27n z8m+x@?9@WQH%yvN2BSORb@ZmyH3s_T(OXk-Z!8wi>az~OVucLrWM)A#7SdF|Nn(yl zq4dA$zs!~%$Qu*U#;;&7if~lr8Y}O40yuoRMWVo_dyw3nj=4nt+2ZN~<6f26uAvry zp(Tm7Q>C0RNFghy9p(H->;goJc7{{|I#W3bA_gjLJT!9ZUGn_GU24<=pyljr;1W8k z_&zaO?_sX2o#w346L%Vg8!U_$_4(bA;2OvLIFSgi^oT~mK8Te-$EHA%a`A9U?7drB zv3je)BPV-H1L?2{(t=OwL`ZPpIhiaOTiiP#+bIVj}GN_)Z$ zj&~C(V8Zm>fuM345-Vz6t3V}5jrcz~ovQK|>bNaUz*yRecSf3DYT zhrYvGl9EIPTWJr62b1eaYB8WnS=HdNG1U(9f^;fTtMNJaiST{`iGY&E87aIDFC~ts zuJ0N$wH!W~xIZ^0Ob__8>{E3EaR%YX$z#Lir)r7Gej)k-+9e(TSOOVK!5Eqa zPNt=q?{fM7O=oAD@|RGLT_7z=FQGvJ9`!|5m=>d$fAFv(Clks{SLp>c+-N_c_IgyI z8l6H{Iy#qt*n$E_Eo|&Mns^T|;}c?}2$KqjbHPPtMB=g1bO-^|Gz&%7O8_M`srYtq z9EzG%&$23z2q-M0y}jV*N_~0Qw-;CM2kTgV6%&ZhybyW3Oo>aqqpE2+xEmVZMCY@x zKa~?RrO-s`6~6xr6h!;Uu%Xv5%;SWIGoQnk-AVMeCyP)q^-72>fC!rkC0j>^m6zm*63K7Z`$6ew7b^gc>m(O)eeDEh;r3gt^_U8;*(NoUMUdBs z8WDbfV=wq%1nowWlN~!PK=|pR1o+l{XGd($=C99-7_RlvAvxksZrEm0$*jk})oJo5 zT|sjhSPaJYee}xmfxB=C%?T|xw6shi4#6)g8!mbF76oj?nt$SZO55;VJW6AD6+b+9 zHOf?!pBrLO8}LyQ&H~&So$iITI4Qu@Jo0AW5B{dsKfI7uT1w=b_M+^fzNGn6yx%gf z^2&*_lX(IpK`+vW2qx@G!zb+**W*Y2bM~?2m5)(&VoQ1j|0Fh9a&b>>vdjKk3%*UV zns3>UDIhxHTc9NP#CSQ!_dJj1x0k1fZUHdFyv!{u=1j=Lf>&N6{Tkzg|5@~}y zksJwt7p4<39lZmQUCNR9(-KF=fQ1}?MkctE9RwmVb3^mui}H`!andAh*0Ynke!UY+ zpEzN-qDgK26Q>c79(FJhPEcx&d%UHwc<@eJ?*uGNJhD|Y@*|6V3fH$`EYrtF9^tzD zYsR^ejl!F=h{q~`KjF(ib$v_u{#6g7_6JdMcq1|>PN`o|T1UvfD=W@GTRs9SJ^qsw ztpG9(yA$*~cCE^4R^_Gw_DC-sEAhJBdxYaJi3=W9t+Um7t?9O~?GGouK+Dg6V}81Y@eqF_iylHjm;((Kq6+@?StbAn`6 zo@PKL_KzSwKKXf@Eo&=YdwlFmN@O(*QYQ4JPY z>+ezpgR8ml?1fDCW#jeO+T3UmEZ@MA{|+UJDnJrfCKzoP^UJ~(<#Yp45#b)^>vIH0bwZ{l2xjyGck-{8hDQ7NE0tHUz-<-w8Cw=D7-W%3(C0Ub)vs zGd@f(7_#O9vR4hlzY9u9G&Z26rah7IT~p79m>f=BMJg=A&aMuvyj;hvKQ0z^YVpJ1CCibr86<}uG-E(-fCK#6YIUE z!+g4NAU1VqJ#1H|bj1&5_nI4#QFq6?D`6L^n0A!}e6lqi8|*Hz%&74HyiJRm{3XY_ zPv|?M5~{Fq*n@%m80PfnU2i#A^M^x4BTRST63 zH7e}Y95M%f06#fayR==(44-Htn{?w}2>9P0AJvFn-(<3gPG`$8NMV>Sx0N=lsJ#{@ zrr=_f-dfbTDCFL-$;V2_Pev7l3@I*Aw6-bV(qOH!=hoR$y+af>KOE!u6bhvl5N0f# zva|6d&LU9j7vUgB=;1i4wp!$sacpUlS1W&TNa!L@V#N4*R`0KlzNJS(6Nea`(q!Wy zK88IuL8{u&yZIh;Ke`-Aa0C|;DE>iO)u=ijlYi$=27gIQ**6Q`Jz-36^0u&9Rsurx zv@#!(D599CkA8xa1dZ`A{S*Ln6dM@D9iGd2r+y$esnI!FMJz7HC-Li2I|K@etfo&s z`yY7OS}sj*90Xs0?sQv12X4%sEzw^$`RTmE+qr+w{~P248OegRDK~6LSYTPA-EGfR!tJ zmMufJ-VF*}5ao%&DO^O&2w;wDKZAmoD~+#Al93o}cIQ{C{O4P^ac03m`I@4H>v>s{ z>oGsP>4MVyz&0;5tC)079h5HZvCDLtKQ_u$6?w*fq@-HV^=K^!?8TtCdAf6soo}}_ zs%37s$7x(PfbBi~5sz5|ohWHu%BGm{o=gs6=6bkqsO}J1PVA$V9Sxn$A_$kvTD({T zc$#khNw`VVc*p=?EwM>@lir09lzMjdf}XGp&`x8zBbi`e!M5pZcD2oo4sQKE#Yi^AMn$^p%KKDRZp-()Y9Mw; zW(wS?=qd@~VPj?YxfKrCY`2trV5k`hf120j19X7K%!^S_e!1P_&64(3Ez))l=hcW{ zYeoz@Y{xn^0baQ?cu84d55fl%2gYP=^Su!tanDqoIMY;U2DSU+IB<#+Y32g^t{-`}y~V*^ z*&*6!(O2VekXa$mmzQxSWDTk|F<+NxL^bDyVP1~FIH z7v4OJs>k6gj43kVK}(G41M*2Lw%eE<9mqR|$ZMj4ar4<4LpuA!Aa&(cFPGXI6!G2e?! zUcETjZf2b4FM<{)hI^XM-%;-H$N8}<0gk4!Fro3+OE4o`RTJAyc1M+Xgq48y{G_Xv4TG`UFZ`rWftC4i&%YRm;nxi_7Rr!R*&CRh3$LX|6YLacSS8fLZrsBUv@^dzoqn>s&J% z{6-Qcs}_ap-s}}K_~i|fpFu*%>79gZ0$^9LGzP!}KnEU4DhVD1<;@J6r0AKE z^5L&Mg$;=~5eVG~knTy{n&Y1fE2tt5bg4uf2)|BGA1hTYyZ9)Es5u&Os>5tBT&P!y z3UAN-PU)cS6?*M|%-WVs3WiL5;snih0n%UPv(UA81;)%i3BX zgi%N&-Pi_h=ZY3t_yR7FVS*Bq#J8~IQFdf6{yMhRZr^C)D5AvU7TU2f7DleuawR?i zHV5vQ1(wn0rIF(uj_zZ7&dNiSs%7B~;q^|#3Ebd;Ci;$kw&0(rusx}5R70jvL@Hqx z2;p_`z()&lQpu~RWZ=ted~^x-@yXrrT;nqg7ij|TJ-yLA`aVI!W$_a~nC_T$WQl_QpK2tz+Oe$g-K02~*Y*xacQnaqlhtU? zEv5WK=2$z1BP6zaaD+n#=vd2gZ(Z&p!VTLlUuj7}>qPV_Ds0Hc5Hg9DQp$cJZDOCC zeojk*W?}aP?pg~JtSV5kcR2rtJ?@q$M`D!%_MN>$8mE(8{gyVts&|FqlEmXVJR&73 zz)i68T72F8FwZQoBXwT6&$3VRSY9-ftNNxJKk@lsfWI%uJ?7I$F*e)!Zr6Y_bGITJ zd>zZS==m!!XN|)TXpso_n~c2nl$k5&v0i%7@HhTrnd=L?sXzRS9Ft4=zp*h*{c!3N z&zH=}URUth*HI{Ite!K@cQ~uTpB||L3;TYzIvpbS-|UhPX|!wYP7w{zhWq0iGWz#> zou_D4LvSMqi^?Zd6QsQL5%k!7*W={zc>5qakq{u-kgwxe2nsp+Bn z|LCR(k8NLuDAaGe2-50S$L(9nwDsM2pOT%tTQ(W3AA0`E!zB@MlniM-k+CbL21BE| zh_E`#alw*jY#2(oNso>VTBtVx1`6@|Rm^t2u`H$Q2zoB{<*0R=y|(*TU???zQ1`h) z7|U1pYHdW1hjB`{W*%@omUP6s5Nls35pkunkGz1^2>hx!D={!UyYVS$?H$-Xrbi-G zvsD)nEuHYL-cZxiv3hRHeR6ip2ajGZoPaFB9>ma=w^~(WU6yBrqlx^*$QNAT@~c;m z#iMGqyx~2?M}+k$4@DfqbB9Mps)EPh+sK09jL>DCv$EeK_O;NQ(*iTf*Rp`&Gdqpv z#gJ)a2h2r5?o5L|tmTmLSw`*(TV?o8HVm^l)*-t(i{~%Ge8z#TUr8bVn)eQ9;lCpl zw)37}Pa8M2Iq|m7yDv*pI7w}laN8N&sX{ozkdGLeRI?xlBb#-`jQ#{57hW8bvMNJC z|AF8|?U*M2+66%~mIDXucnkRe$h;#3uW_zohD{`U;hrw=H4|4^KbBY>5DP$4i~e@E zmZWYQq*cQnM?_;d2 z{*K#*39Y#Nnz5h;4Vk103Bn8H~=c+|2E3P-iAqlAUX!Z_ZaF z*m31Ft&GH>FgM&=(cA2uemEF7+l6>M{TW14E-Gsn`+Bv8M@C(xL_d>iHe(VMl!O(? zb7RE(q&Ia|Ex(migt0uarz-&<&a32kCT4_S_fUaZ3UxAQ~cXk0=TYM;JtrOc^Gfp^tLjXg&$eUN!utDLep z9|=f`Oqj6B^p=tqJXw74=gAe9SSzR0#B5@-Mhi$^%V~V$Oud5SvCcO%@j+N=x}BLx z2o`62z>2#HWPnUzj}4v0FQpjO=JG z-{=m3WN{@NizEyWhhoyY0#`O({efL*7$uRRL)+jb*G|4+g#TKgNYwG}ZvfdIm3;T<{uIDbLVFw$i3c=$rThi-5G zMKYs$UI7H6x<{#5frBSa!b!@NFnc3h_zvoOnm04KVY~Cz#x%P3WhG6ynNDe6!jSE-Kg9o;t$fF)KYbM+^D)+}PevCfKnhQQ8!(I3W%Hss96b-Mr@ zya@k-J@pf;6shaNp7cjyt!w`(q^0N1F}ceKXSA;^{xd-}oo07(OXIMx@wSYir#1iv z|19{h)Wstdz>3%-S|r1$LMgB~<3aY@O)K{#;4hlfjVLe{^;xhd4!W*$Q zdJWsSG`|klP4F(J#ir4*aM*HOGjsVfQU1gqctWABd#HQ8BF#(o(I}8`37PWf7u1)$ zr(Yr1kkn0Hl2?luFVeL}h`Sl0t{T+#bFGK17C_fXnsUNXouexB-8ZdXv1MB{@iVX9 z;7^U^?ph0Cw%- zYr}=o0`LW2?KFSB|4tKoZ3NoKB{~N*o2#9j3^??N<^Z(Y^*ugu*BwU#Z-~StsqMGc z?9Ie(U880{tDtffO8gw@uDE}@UGHu#lt=KN&j@gTv#^TP%egl`=W_)WR~O~240&bw zLEY6c;2Ttyx;F8f?ziiQ4a^;Iq0nt5u1Rq|8VB?902Qg>c;=;b;q%>s>cosQTRcjg zZ-DHz@^lM1otf-+j(S|4NKulYkUqxP@1p82TDYYy=UFXQJ`Fh_j~l0f{)s*k1ho># zv~+tsEi^8D&1p_M-`aJPE+8cL_uQD3h~n1FWv znLIIk#R*x9 zo~V>Am!zM-K7UF1j3d^j#qW2TueJstR6dfvP;139Z&CA*Q7l8x)?4}SaOXy{)uU#y5%42g2WFJ-~OF(Uf=l$7jon+`G5 zBjih+6)jQRJ~zp*RF7DHGrP>%Y#tZuTeAmlNT#)li$U{UqYd6q#*A~TVGI@2tO+tN;Lr1QQ@vT zC|9s;d%#omnfH|d!rgu#)d~oR$Kn7uas->J6T|$~?KA<6&WKbSDx+Q{m))n{i%`-me6v2#7!ctux*IGW604?T>pFTc>@g zcW&H?7*SII4C9WxI_?|v+DzbHgC--Uj8{i5ts{6sqRA`OC&Wdt1*5&y@(^}PSHP=* zT<@6H8s8+-j3CxF%QOKyVx2z6c+H4_ZP$uF1w6ZY)39?Je&4`tS!H#dWlt`%K9LBG z@O2_&bi@*2V_+T>LGTH|9x$`lY2$Ad5>-R`e6N#G-L^XnUP(S3&aJ9rWL3c%N* zEXvK;Fg?sSO>W4qy^STCuBC`2P6FA?W{#D{b%HYBh_CBFCfjFg5VAb3OR)d8^RWrgDxRyCHj^d7j8BE;UAm9Z* zpIsb+^k7hcvf(MVi^wP(8d%VSD+GoykP<*@I9FX!LNR3JiayBC(Hm20Nv)p=C_RsA zrzVdzx_KzHNyleu#^X6z+BKij^5qt=H37@eCo@KjKgmf04s2Jz1x)>bU?ZYl525s# zOd6_!wj#$$&JajRkJ{1v^8+w$ep|_<3rA1b!r|{Cv z5QG)*)|WhL<1;B^WIgtzMT8a1V_@R2qaBgm9viD)SC2DXJXJ{1kt0TxyAB0DU5&h6 z(=%EysQhIT4$D@M^U$(TS@u>3z!YHtaE&iiL#xRu6vH?s2`%p zhXv{5sMBrca*2Ht8F>8WCU7kW2HTxCZb*o?CWQDjH8aS zX5Xhm%`ptA49j9P7j_DTJaZz>Q0A9lW#n=Iv4u#kr4mc44iIT*@=;`I6c1L#;rfTi zyxC|hD6k;!I6PkQN1jT;)-!A7XZi#IH{C%R))2YwxoyCPOXL62EjYQ^8wJWd7K+3@ z!(zqVWEB{x!{m+gf0Fm#CgRM{_*+u3@e=F^gtjl_?^TS@lA0DK0YqlpJ(TLSVKDs* zst(leg|5fF%x{y+qIL79GC|tYE;x&x#c1eFH3YKRQ9w`FceQ)MBN%2I?fV=VuDGP6 zc&7=+a2jLA>vt2Anra%JA5#G}r(KF2CC3CWY%A2OSs-6?Dz{-D-*cbLB43&kzS~nb z-{JW%8?)*{o#w2{jlLbxdM`jt(zZ4YtnzF6#TTGLc+T zMtV~=`h#Dvm%b3XG0}7fMn{zt8A7yICqol0m*LhLoa@rJXTiO=2puy%s1EO{y zMU;f5nw;2F=U4tbZs0^*9{pF;(l~$K3-9pa;6+ z=auE+!|CkN;Yp3Qii zjr%mkjU%_ejG5yOW_9!Wd0Z^V#mUOhJneBGBOjHY-tYkv2SJ$B?o3DdyOf1w;f9|! z&(Z|GHY00@h!FCR=yPk9mN8C`n~bE-?Zk~)+&=i{@^rIZxpW>w+P;0^!vMC3Q38-CPH$>KNvA znuF9#AMvjbF?4vYR6R9uZ{X&`^itu(o>J-j0)U{}EMsM8DrW)d~TtS%tHZvMNI3IM5f2=&aKe$@+Dh3!o@Y~xq@NaS32lFbG8Nb3i}X8vF;C$1rJ z$1^XQ?-@k}jLsiw?j?0f9?078B$bOBd-|$LK#y-=(ly97o9*-u113>?fKG_iiBh?Fw=GuGXHMgWDVn*cfj6Nxvw|{R z!MSDU72h}d{|+mBI!5XnZqT~QzO(a)8l67Eg{u?09;3d!9mOWI)AWQEy+uA61*0n6 zL0Sl?-bf6@;IIQFy~h*sh0lSZ4F)<11!-lDVm^WCOx#OjDJq_a6RA}>PRTJr+SYX|U>88Vj`3^k0l3RmFdIbZ^i(q%6SB>Z-R%b;h# z=)@tY?_!37Xj_(joHO@%J=@dn1yR6+uVw<0rW|Ry#`_YplkGyoffvVMMCkf5z9G0R zS7GA2>{=%n`e-t`sH{IA={Z%bSp=NGych6Xk%wgxSqm!3x}jLgYn5f-iIlomAfokI z53z8IUHSvV6nLD7Pkyd|S=q|QQ!)bkxHjdev3?Mh?m6@TgD2l<59~7@=Mp(tvQ~TB zfde<70WFjlWhzfTlINTQ-L^KZTnSIy4*u zS4)b>V{pT@v=D2W&y3E%Dg9l`%`RXRdgm|Sk@C>S*wc*&sy$D^Z%=tzyo#P#fMXd< ziA%S&Q;~@MQ+G_DSuawfuh;elPEwhap#mbf-)@ve2Nk|J=uI(J@2$SSL_8~>5tkQ* zrfF&7*jL(xpb$3zaZC<|zg++%y@0XxS_eb8ZyhOdUeMV$lBEM-4zH=~d8+Svn{Lb` zJuuJvCy#~7_K}l0OKN(oZG!wZz!(2Bx)jp+HsgQwLf6R=)KI0HST}EKc%POlb4)IW zdmOEN%w14day7g6GJK84;m<%lA@$J+pCgVG7)UJlPw3;9vhe(W`U-bOGcGL->VP*G zSsInaKvhQa7)q$Z(+UI>7F4DF~2IxanUT}4(1S#Xy}bcrO`dUMddDb zy<|K|)&=x2CTE_bn?sLI5{)twq52o4KLFA=Km-7A)Pzauh> znZ%iLW!)Nd_CZCkArV#P>oMg3 z=%etb(PPph))I$$j&q;DNL-}+%}U|J`5P~8K&{@aEslFB=mt5XxH{E$#RMl{0`~7~ zA`f>b1bX82V5fpbSP`^$Mt&=b^W#1-8FG;+AN0`;acj&o3hpRM51j#(SeH{Ah~F=B zF0!fm?5TN*5)|-a4e!Sw_O?p3#wVYT2w_XR7)*^Wng;m~96 z4b+^&G$~;zTD2xyRg6zpco7TSkIJBoP7?oV6Pf|Owe&Lz$A2nt#l-biVv1Io=w&`2G4q;1E2{!?+(U1PVCE}u$2qkZ6AV!*N>9T)hP2j=TBQo&F%6;h2)c5S zR>-Np2bW5ET^LdyEsLuLVZ;tL(#FjaeTLi-^;O*V7=QQAr;0^vGD^c2gwA=`I%TC> zrv;(#lSu7?7bSZAk{_VnqIt|-w58rWHEb+e3Gf1SHQpKqoT=Jd7VqT{AUT8|x#uTB=e>2aHVsihl-_^!h; z15MD#uf@i=!S7MwuM#!D4E=ZT3#fRsQRE+C=P06Ul}8pW#Pr-w-x{$@u=x0K*yaso zqa_R$O#I{dgzLg?-y0g;F@?GMw!-k%L;R-IlyvHj|JPfnLLZJ#y?r>)OCy zhP}N;;w*Y4Br3vH%|p-{||vg#9@3wnR1|TH{lH= z*mJ=Y)*da^=uCxEB9*vHkHd`?oTb{B?hpX&#Sx~*r~|ARSp7-Jhqtz2j>x`rL%2;8 zD3vz)R*J89)K|;d%v;?EU#i#M9uMe>Bcns& z0G+FTIT@gzZPvLktl7`wUf`Vd-7dr?eHfftn4%*>&!rxY=qS3gFoMsfHE(>Z7 z75iV!2dmw{aa7FX6LLnS&GNN{)Q5p}}-Lq^n!QP6_DB53+0{KyD z?&t5e*KgkM(MBQ!^hBLjj%9oO`oFDlx#lX6FZ6MRuI?wSdX-xhg{nMi_X+_oO6p#o zICGo;e5$PL5l)ijD%>k10aepl&fQQGX3(59PG9#@Y z+C|j7vHbViyL@c=+}Pu;6*)~h36ca8r;=O0 zq|q1q_xJ1+{}Cx-+B3l6hcK2GlipKyrZlj2dL8J8F(>p6mI3|9RcyqjPI}j0mxo~OnGLVhV=?DZYba?5jCkzJEGfi$D}^E0kp)J0y0Tm*Dq9$ z54bgbXF2Yss%)Lv6zTQSdDuY2aD>safu;5pZALJDz}P*vU6EMWYE9A3KTZAQ(4obO zavBX6pLh{t=YOCFA(B>BdvHz6@c%$n20WHXIUasVF6-@Q9|3e`7pkDM^C2}ghJG<7 ztWUi~$V?a+_AKKe=_A}|T*{P>q zSG6WUregdOConH^T(dSjLZv?3vrT2Gj24raL4JgJG^pVGL0>;^CJ*bRJX!HTw<70M zmEjMiJHT)i?r>A^cwY|FcmXEU@|;D5!`tIuP*Qn#KzELF|D4Au7i&P>L6r|Pb{sc} zLSW&gs*$0gcPt6#L%NqT$6s_y$aAnP-?r&Okz!A}PsRlAA|iO$qw%NdC3s zQC-y>v+SDSzsAfBgwL%iD)4#jqi1rpifyDfL@ir>rJ|5lvNSUYHZQ(OCOLrIMtU?1 zjl=j1(dVvXwdwMpd9B#%wV2|FXOAqsFHN8qeO?x+;f~-Av}HdI0w3%-YymtZn7Er7 z<=-mf7#{cjNiEw(I+4DV5t{%NFizMaGYfMXX~MyDRkT_Z8w0auN@T-rg>SWm_DoU{ z3FB)EVW9Xe>(Pzu1h0M){lnY)M5{v?)8Ym%i68Oi%tCJht>m%O--N|?+pQSg69q{M z)EXM8AkaDmG(cOq`CTUhsJt6X;5~F^wf<& z$YFl|o?{d^JT+Ytg8LSb<_vP^O_v3gQ=;8SdzN{)R+ba8BXz_Y%C9wkPXV(#Gt!i& zU3FSL-~s3YC(xzsR9ht`PuwImlsmtoCsH6>?wmoCT7lt z7PkFeO>LS}q{sOB$)iz|FV4PZ=%JScN1;Cym&c%2r$5~)>ODv~gqOJu6Zl6sY&HQl zYZX`>BZ?7q%%fy0JJf5M5o=otb9^^moyT&Xu zFSfb33720zUqJlu3vM<>sVZ}Vjc6(@;3HTOnjes)W(<3-b-ymYg{l2ND$t8=ljmP? z%yF?Bl`*a>{v=D@-DBslt{dA4LHa&<_?KB<<_zXGzw-;L33w=>0i}m9Pm*tnw>S5O z=-KoONN+p98}pib^RUl3eo$73>l^b_EiBwce<4~y*56O??VzBu07SeGb0fqNc~)z0 zu&Hq7likpeCv{90nN8|-NZw6{Ac9bb<<|bXivq{AxZtw?YW#$qn#rxhJ?)`q;T2Uw zvtZy^&rEM1B=+B(^0Q-8vH2p;G}2@9#deaz#)g<7KNzw6t|DZccC63t$s`a+G!K|! z@dr27PFU_I$pR#OJA2V`xaR7f_nhv@%g*i62hzJ(!j8Ouq#)wU3o{qWFA53Ebk90- zkQ#lYz$euRD76Y!ZABpss05=DN1x+@qGrxa>0PJDIvhyHDbS=d*_BA;Obp)bkU6PH za9$VSg$+MiY<{uGVL%&@QU!#9{TRJ}Ez08>5YR_>_4m1cdtRAE!4?W-9nI-#cbF@e z1!G1H;)>R9xXd{1E(oOI+OrI>--*fsaykqZAbfj`|1j#d4 zln=Hl!`mDbek)=ACzUf%8&jY}2Djlykh4Tq10wL}>V}_&9!^MsRPoWt3UmCzWwFsK z8TMkbTP?7ZtM*}|t$O$L4;#!A7gB9YrTx+ySiszO$Kj-F@OP+~y&Y83h6&~Nn8vbS zp*EfnsSV?H8dfFo_ZN zlw<8L6`ElfbS`h-VErStD_S}3v@Q*GG}-)?O$u7pBhq-s+70&e6pV<(HA=$iG6rhK z>sF8gH*}1c@H?3v1~PQcH5OD9Ef{X7EZhV_F*cFcfhYcLO+_9dU`|QF#Up~zT5-Nx zo8qZk<;)m@j~v9%ckH#Af8;lYn%}~Yd`x3$k$K-m9_C7`ZbZ(MVrvudIl~k>css(R zEpr?8_zXmG_Zv>c0f+puNenG}OL|Ul-UT{bthQ})T}KIE#5t#mmfL7?8@$ZM0Afn^ zz$P{Iw}!EOz2OQ5xyt`n)EgI7mZ~_f#f*lFvD(2ny(cS%H;BbQ6=WDetwANl<)^ay zY;5DZSBl6l8fJ|IY%Kn0Y-!d>TrZXaRHkpZy3o4LXt2l}{?cS`2v(UrtVJ zE}(>}{)VWlBTSPIF=-T%7B3v=8)$?$W?ds+ZnrXX?(;LlJU8OoIQ=K;X~!^O-K#&r8r# zeB~|>dOFH8E_Hr%eomjZ$JO>y(k~H>1oUz`dSXL`(}(F$43B=!h}1qn8}ZUFOVTnw zNgX-&Pi)Q0?cKy?2cl>U(_2~w;EA>eXs?M@G@s|>=BDhe!5cU<%&`@rXgJ_W=-;YW zRoD><`gUy0VH$#LT&;_VvgG)>tk^i$9!{s4S1TlGdGApiZC9I2PxQLgEv`1S{D8Ee zji^PO52L>Gi@8^hebl`?<}4jL$3J8%qm?f5N8}@cz|1G6k20ah$@=Tw{&V_`O+mrg z|2I0Ex|w2kvQkXS z^whu>p1MncA7gdNNxbOL+|$)U;|%HeWlPYKl&MQkZNw#FgEF|ig4nj~1r{#}BT7_c zW9Gs(_mI_z1);dOlkw*~rDbZeo13>2t^kgQr~79Sm@c~W+a~Fkt|b)hByqg}X=42w9dO2db-HM&K0KW~b9=!d zO#a*Fx-)oX!Hg}MBs5F~{}UN;x3M;2BBCJUMcx>7PjYb{`3Rh%YHp<%i=NVZCdU)E z_lmB;yVnDz27?Q>BsiMGmFLK5gk6&}eLr3mLrNJn$*S#-y*KRGipipKWDl(6`OPj@ z^!DtuaF&LGH*VMUG_1d^&n}5Ona)srK7|%JPy$!&VmQX1QrEv({7;lu)wJ~CHr**@ zUKX<+!onDz6eT6O)zgOCC(*r|gh?J|ow4=9#4vh1aN1)CDObi^fm{nAfVY!C(9N>M0Y%kQ4ecM1$TZ(p1d+jC1z^(rLjd5Ti9eFBIKcC>i<;a?Q<1)o zNov$yk`PP5O|0<|E}x?1R(XKuP>QzF-}?p4?GbN6e81`2!ZoO17p{R@BF=o_f_to(-N66pZfKP}h3|VUn(b`m`yG%-w+d?$F%-kk4S6O~boe-} z#Ok2|QG+~`z5kQckCcezJm)4^@PizpKf<7XE?FJ33x9v>Z9;3k-thDxv)+~~xVX%> z$H!7_Lc5q~xf8pzIeh7~(iJszVR3vssRB#o(-Tp3UlWpdv4>av5XCS~cDBaZVMnLD~ zL`hjYFWt&GVRibQnWiD{#^6veAKuL^*#Oby&db(h+^?_)h5r8yF$0aIoDo1uYccz^ zm6@Hlg&*0LROc+tlGJ+H+haU808+l=g9LU2len?0>jV0@aa8JS{~BNBb-U03+G>*- z!54xXxLr1;S1tZ31jckp3(o7xWW+%IEipL%TjAA>=>L@px%s-MC$~CKkv#oKxkpmC za!#e!2%qiaM9XF=#Dlj-?f09%k>^)Fw<$uFMbeFO=YJE7gR$E2eHLeKVsVA99jZXvnP}wzG*vM9Q`tqrrr#)d;!~HX^u+JSpB?=>kr~aofHeG9e#HUb;tj*3_OjSk#s8)eJDRAlO6u16Ltw!WLPl#v)@s3x& zyxvvwybUA7$>2fYR>cRqMIz*7ry~!C?f2hpn6$Y^7+|hH)2QNMTe2W74V{D3dmia} zvvx=~BX`v+j6jBXsNJDTItqs{5AchD2t z5YI9T;*;Q2^EABm!ISQWMb=oxzb9U-x|sa=wGegdke`eDSJ;8*`pq66EtunPDXrTA zh6Jov2@K-e_!nhEntsz}njwmVa_-Hh0Zhl?^j3+e>U1LN#I?QC`jL&70+D~mHQMh9 ze@_C$@R)Yy%H=KgYE;~kGX@>blP-<>l3OE-!mt3?m$xen?FZ}%fBe1J+YiFsZvQ6% z-Ap|veTn?@khXL@-uqk!lKwkKe9SA=nL(#CQ2q^KttGMci1t+En%yeJ&HmswptWdx zD$jIiPivyx@k!@YA)yx>s;hQu=da$>L~JWu_gEwpyC@8&Fm04Tu@iauBdf-3JiN~* zBp#BwxFI<_K?&(FgeEfkXT5%*gZ8PnaG;r^#Lp}gAxT;oq)_)(4b&Y;26TU4o^DU3MGCp8j&_=&<>ZTLAS&wb6{6vpu7^ftpk^qeOMa zYW`AM@UfCSs0?8(Q_lD0~Ei>sSjKIO`$+R-$(!|@gExLY5X}NW zLVuzlzVi?@CyRBa*wkYVP7+lXx&lI(rAHruHb`Ax(pBG4(c<$ zEp}?Kr={kWo)&-c<)`?U_EuV!DP<4G?~NG)O6L9Ck|Jq5jv3~h*IC|NiT!5qa%}8` zOJIy9qYJ5#3$`qH5CS`$%;;vFNuLku!7Z%kpY*>U;(blJ%t4yk&bnNE6kRN$i_H#s z`_B`#Pz&ZheDgehOH>j+M91H{*p17};~G}!(BC1#d(eY6$wf~0E4~eNG1fSrBjh{z zNm7}mps71*cptt~lrn&>&_V7T?7+D=`d0-Tp1(!O+OxqW36Nn;=XranQ>ciOGU~a0 zG!5(BoCzdKVfIEdO3ep%ZYmHWqy@nz)-7PCg5MZb%uVDvuTAwCNT z|M&h*8#s%^CWR10iPK`__`ja15FJ+7UJm<#CM?x)UADYsWiU~U>sQ_F|DdQH`P};=+*yX>Vk}KaqFN3 zXS8CL=>Vb4d0ZY3Qq0rboRri!!hyLwsSc>Y2SUSY<-TX)@}9|5J;um(QD!RfZ((rg z&0CoupET#OfCAk?ZWmr^>dbk4+dq^2wLQGcMok7;jhkV)InqXUd}|&6K8j#_5Ud?5 z#ibcR%v&a4lw#iW%&MyQKMrEU2LZ>3EP;=k*hub5<>J%&xvXJt4<2TB-xuL4EKX29 z<}GMOwO{r|zR6=n`7_j`s9e*?$8d9DO1%W8fD6hYTz`X*fSi|wG!gi>CkcBGVfEDc zzzrfc`=r{SxIyvFp^F8dxX$7#BEOAx6upn2mqsfK4xu=o%XLc(DhHrHnW4%%95*W2 z)oJ)}vW&%MA?BUK#Sj#B=giQf87+CGT0P{tR!4>=Xdn%GqlrV-*dl<>br7Pi=oRt>xhLSw~-@bzgqf=7P3~pEAFNk>fcpA4dZ35jz^?Zs2xQ7~VEfa`o zhZ2}$l+KXwe=QRlE?Tf#=!Ml}VjWbPRN{Q0U8Z?O^Ynr7SLi#Lg+ zbzPM>r14qL4l61jD)<-izk!gYbHK&$RVc-G7(rGeAxe5}w4NzoJM_gAuRb9nxqJ?n`RFK`+$nOyZr~qqEy~PnCl{i2U3)><4jHGz8-6m>db8)gtf} zM`XO|f*@yG^-uPGIOLZNeyo8U{Xy7M$$Lxna?+YBQ9+sjym zvYSwox(z`m9xOWMPn0}EftXc>5$jp&d3MEF=*q6*WQ1yDz#qVod~ zFACmsR62?%_0Z$H!q*~~@{QD4lsEdpaLFNykwnqD{w*9EVbBovZ=w#ez!uXd{o%ma^>X zQsD_PH|e+RO*HPv`eO8tA|dO!G?XhT%%3D`R_DeA7Z_j8ip{U$FfGTLFgfG(`xyp>ltWd(Xo09Vwsn$%TM4!#1uw0O}MsfS|6rpSqh? z6a1C=90=3D{z^zebhw0eAlUF4tJ@%scJ7a|pJCM#mowhsVR+J^{CyF|g_aM|fg0*? zXb=M*J@A!!ITI)tM)5ue)3MKhUH%dc^AW6+Wbll(rej@6RA`OJf*$ zD1h&cgB&kK^^rgz|Gtepi_*fJJk~-MwJ#O#X65{DQ!|qP+M5AW2y|<>?J^0h>F9hv z61O7dWuQt@&yERqQ2m|o7=4QM@sXzBS^nD=Xkrai`kYw&iwg+XwxMLv9nq$%TAU?p z4V3y{-6)$5*_4;D>&D@skAmo*GR586AIae3>W{$l~hx;=2LpvGF6cVIu~g@IC%l9(rv=JNbv^af}z%PKY>!{k(%@BxE_1$S6; zS7YF5$E@(fCEe(Tr~pM^1vXo9e|J+ob44tA>yB6<%1csZxkdGYKl0U>o6^ z=T>s*7(#Vdd@Yh%%^$>|(FDSn%lE7K$vu3;nb7gUa3AS|2oJ^$0NN_d>qzoemlgxt(jhW1qeDCvX2)V7_&N(?BWi2z5diK`ctZV@_DpJ$So#yX zUn}bcTSxjcWYDVl67K{5IJ9*UI%&zlTI=@1w*~AJM3!;A2D#dQAP75eE;1m&OO~%p zUKJz-oN^pK{_zppz3yJZeu}ib($$}Qg7IJ2)m3Vp&}zPc5x=a@Wb1YIL!=jh3-{_o zse&Nj`3V7eqM0Nk$qBYL33Y18PnNfOpOmAM{6rBwV0le2mxrN_WS+Qs@vZM-pZ9pbb^aiWbuZs7t za9D2hpiwR?FQ2x%8a1KoY@tv0^>JlH!{$u<@k7f2xU?%5gq>{=pE9aFkKd#wTonmG zy&hY)2cf5;rzFh|CGds(vn@~2aHrm1`}b9M?^V2pzqeY~9A zpdg3~{xQ+gFi~IIo?(pyK`R%y)W7^DZ&au{zq%tE2B-%>Hz6`tHLMGIxwi((CuV%x zNh|#AYMnMJ-&mUE<_+l*2eZGVkF%Y9K3em0pS%(f*}9#Y?dTi)UoU&W^zVMB3Jo=h z-;i%6OD$#WKQ_6V+deTe!G8@gnqgilofirk;g$}@_dNQn3AA&Qr~FMq?tuO5aj#^O z8QDya|0!A~0EWw#d(!a%qr|qS^uf83i^?u5?Y7+@Ti>{hGc5GV2!yb+8&fn7yC-Cr zo6I1G8$PS!4x=YLKv)yWylTs5S~wo^(edB0P-=G*5VCWky%G|-{(f=K>O!!o-<|re z$8!S)QFhH>%@+T(+SE|kfqRVNKW%ynx5MK4mL%@9O>ugLZ#bPSXbmH@qw{J0^@oBo z9s-RK1*|wq&#~XY{HlYXnjyHKFN2A=I5{*jBjvV{mqoM2H5*Yyb80ntd$|+=Kl62x z6e0A(nP5X<8gzb37LjOZPcGyiREI zI>5c^2dTC0c1#kYFEj;(GljpHQmzPRB3N~pp}ReTM;a=9*D}zZmSUv*nMq5U1hA1X zU_H5^SQR3Pzb$g^DqT7T$swIWs(Mwd$HdPV>cFf#NWim_llPlVeypZO_){QCt`He# z-k$Iw2mo2rrbyEDX?MTz?Jz3cqHkGa5ni>4GBv!G5A;})iCIqbtuX%l+U~&}UTh5+ zUe1K$dFA~b+T}1smvbJe^|M)t4J~&hc5z&T) z*?E8KEtyyYb+ic{OX>N_l$~*XKW4fjAc8V;VeHTPj2#ML5 z&fSB8E4kiAqFYRw+~_V{_*G=qlSg?tN2jild2b- zn>?dB74|J_Vtckt$RthxJE?hvr}TGZdKE2Oh_MgU+xin;jyFs8NTv>M24T_`@DIy> zHI1XpHgl27{PvCXVKuatRg8#?AWG~f368gJ>O#`3M(Yk4Pk!JpT-aC%s#J#QkC~!~ z(d6tsQ8YfK1Fp_UyO`jnXZ6@yzJA50j&1Tq@VP?*K_Iaq_~8^J%#);6F5lwl8qZSa zy4~woTo2KNJHNO@zf%kgm|^?|Lns?l zTnKl~+-3FYl7`&Am`sU}-+6zYyw&<)$ro|k6dEG<71|?7nL_L#L8lG&$f6wFVn)MZ zKQ*PHR{ki{r0PGT56{ge%7!0ODV25PPBSc}^*Kj5)1-472>KW_4>vB)51=54U7zGt z$jBG=@MXN~9VPud0XE|nW|tl#3Z26ag|Cr#PJijF{wp8xyC9>)S415YVJB*GeQjl+ z+1}#Qn60b7U4sRdA9bYm@T~W+9&wWr z(%VJQJmQnLf>HteHPMk~eb3Ro$`1r7O11UuK-B~vE5##ocY)F_xlJ>&5vJWgr;Vr` zAAz|*jLT4c%hvq60^*8PKpyPVV$1JYcepg9G|Xwg#xLYM9fJHP0q}tsv^5##<6Pk; z{?`J2ji1pf@#yV0Ic2AgZ!wV0RAi%^tJ)g+|2hDFeb2YwC979a2KGt>lp~y$97Vc00u_VS1f-GMvZLw=Fab__WXUuqN!NW5EQ( z_eTZ4_H9T=%*56SMM0_wCn#r+ z*v;b^*@g4n!fYBY%|^!29kwcKH)}3x89l64lD8a79DZ^3F6^#5?C&FoZ~yF7D$hA7 zXp$8aTa9Fl=V?NJudSA)mHpv>b0XhYJfAWdE%MfGwz?)H&K_lqnTD+N;6*9x`3y*& z``rJ2N~}Rojo$+Tfb$ys^Mr_O3burHm%+8xwcZ>({!S@C2Lp_lR-;|vgxHRN>C{)$ z1yAG)kb2q)%j&&%yuq`v0N$X53&h=X!jUFyvjI2m8%$}PYl2U;iWS1KV*-W`qu(^b zhW(pQy@YQ;5kQp))g+a1b)LzL(kj%xj-;x9zTTV^-+Nz&q>*mpWP*pjv;*hb+NSy{ zrLK7R*IqA*wVuf+ounszoj0s}ZVEHWn~3_msMw~QV#t&?0%(gm-G7==C?1+@+OFxW!WZ8(U)rw(aaQqyl5IZyeAdfJ}rKEt^7Od^I&o4 zy7jWV?yoES=OK5lc80@D^=$VMfLhRLpxd3w(zKq1ZwzR zWY?&uwJ7yKdptq&udsIesnI*p0;^SSL14C^TTRZ5FRfomw#x;}-f;!{P@_4T%x@Rd zy2u;=WpQp+TGRTIy+h#4CI=0)f>3~Q$+*!rBup`YXm_Fn!MKc1+M}qG;?0nErLlba zBecwzzGL<7U;KuFxMUWe_HGI8i>sQZ2D=_DlDd`H(4jw@ss%4Knds3J##aeiPJDz6 zlLX3*n1BzqR4oOOB{m8}0bSo$mzZtHpy}Uj_-I?a zUlAP5po7?wjxXKCK8Td;xLODoT{)$KGF1(mgg_`UggGtTzd;pj>%PVp47)n(w{ae@ zw{8Aj zi=weK2NA5jNy?pQwJ82x{oF${vBk>S0gV{xg>Qu$%YI{DNI&7A>e0O(%-qg$(*-6r zV2Z{r)!0$xKDcmQp%9P5dt9y_iF@MDb^S9EE{+f%&~VXs)@j1*MKRtP=`snJF|2oo z+W{t!FW%9LQ6Hc$t<2^+lnd{YX4!OqL~7Y=0Ww#)1Q%(p^SXn>;I9)z+gOQX)hNy? zJ*}DS?_fnziR9fI1M2reuL6leLG-+7`vy#Y_5F$#9-p+wik|d>WC=l;yJFH#O$-DW zu!(G@dNDAEoCO*N%5FT+X2Fqm5KbCWQmwh(>)SofCM|q$1A#h*ri3e3(@ims&m3IW z-I5Q%ugV#Q(_54Pzb?*rMGrjTe$);k=wmeM%lX*O0al_7QXxQVW-btm4a{r(Ci`&Q zGxW6Y`ca>I;I{UqU62dgD=@r=qfSL2?EUWcrr#xyYq{F{<~1u-BhkYiDMD9A2OI_J z$Clm6?;)9cKw0~Tkj1Q`rN8%OL~)m<$YsZWEnIlL*xMT$@%n*k5KV5Gh!fHPM!AAx zH@=!%o~`0=oV_I#X|4T!7qH?f$Vpa4s%(D)Ok-Gecogy|tc@rKhlNzp{~Dz{rJGHN z(>fMMMt4xyD9$1xzQ;D5gp3*k;=sfJim{j1`4t0sSU@nh(GO)x+RBIpvPG<%Ex|Fb zUIKI`lS>@OjydgHIrivB*A`?d=qi#Sy^*8O;SP`trk?Aif;;o>!74ta2o-4X(h7$2 zi^I3x*dDmZ3Nr7MP3`S-Ju|ts&16Qhqj!P|Xb&FTPnU#i|0Th5&@(JO+7cK&A~diU z|E!btUf2STsKB2s6E~fhvMXOARs6M^?xsEyuC?h+-bb^mQ7{WqzIgaWUAsGl{jleG zj0bu!Pt1Le{xWT*^l@gKx%0$D9+5{R&!nu4ygOW5X%!1eKkn4Mxf87TLjxWWZ`-T< zHwb|PRb++9GYpMFU3B`)2PY2Pcd;siXz(i=M*pgD&$SAoW|2&<`}y>WnLD*(hbP`t z&Ak$X{q68#B&wlnaBHRLrUW1{%yLl^X*o6l^zFbXe{(nMwAkc%sb(h_(0NX1Ns)m% z><&PxlzAw<$8~M9t9chR*f_^{qDb#5<*xjIE|kwXS-%aY3m+`_Yx=r<&`0bn>llREmplR(p^yUT$X9LV( z$b}myu%Z&*!0Bxi$vc-b*~h-ZZ=cdY)?}h^IbKoN~>b_Wh;O8^AW0 z)K5Wodami#w*|IqgPV$GTAeh7BVs0*7&KwTQ{jtV-7*D2eoOrYifh2h!GI7Q4h549 zVLVqk?@v)w61OgArxMB>X*+ghquG9LUc)qbBv3(%cLGYxkD1?nVv5W;uCkjJ@Ny78 zJH}H5r}a}w_jXSz&};G zWl9F1Dun8*xBv7$!qcfwKF6gK zYXH?UL_J42J$)+EgP*AYLE}M6MUknIEI)%^Y`)yt6k~_foDM8$on{`c64km_#|-y3 zQLLDKGM^ zM{UIIw&zdbB^$bOjDlSmPruSE2uS`-xkcFF>BXHKSpA@WwU$y@q~AlKCe(twLCy>D zGPkV(T3CMVCbKDcpFHa|EGw>A^7BYtP||ygTN$uzsZIH*1cK1f6LqP4{|B+XvH0qo zW2mS9o>a-rB3)cvG?I;TpbRgu=q^be;7odU{`4t2!Zte{=9N8-vxuvWrh7X>TVi!q z3`hG?lp_BNj>RR|73a3HF|+F~)Sze31Y>7>bL9 zVaig>ipT2<%dS~mZKzgVC#qV*^VxN2v!8K?uMOv#@@NR&kZ4XN(|(g|`LCq)Z8Ih@ zv!0D4R5W+($ai9>#pSh?%5E@0JBxzM z{sw3!QslmIKG!>4W}Hg$@Telfa#0LVa#otZa`4GCOr*Gn7RzllxwR@6ro37V$hdYL zn44GUXk+%~UcwDL@`bbUl%qkn5@^&Qji(WIZ`1KRD5#6QO#)73HmdsX5wB`}I43Pp z|3A;S6}hnQj#B738c9$KD*h9uh^*#V`PpSI{w9DAy?@hKD{Bm*cSF5TcuxrKc^5O+ zENeP~-At$eZ2KV&ibGw*Wv->KiYLjU!sczRSG~7((D#-+yDH@n1S-wteE=;NQJ$b@ zY|mhB(eq+2YW<1MyEy8c%#vR`Ka;*G=R_o|t_~hM%ZzUSn#%#o<+JDcOE_>oB3Jac zZ)UqiJ%7FGVrm;aKCx8Pjgy8xquYP?r7eYB^Ewy29X&nnOaA!LSAF`NELxD2O>zP` znY)6ZaU0ZOt`r#T&+Mp1Nvjd$^ZJaeG6%BDHoh|^3Y-W@GG&<8VSTtY${k@ooA5)0 zHF+<=W@46S_4l}}zy1*oD^IpvHK!OTLA5M6ZIvcKNQWQ7N3v!|bKF)pb$XTg_HY-Y zXE#eoY>dgdThcI~1QcjD286`!6l;KRwoEC2M39iMgJ|1fY%D*`v_sQ@#w->EhI8gD zDrgOvRcA#9IF8u2mlz1_I-0*zNxugt8qKLfDPgs=FZzu1pKNmX6oV&Bx=5m>Zg8{9 z5e_Df)l`9sp?9@tHDN7j9iQzO)x3^AXi@I5`C#_CL+iYm&4dJ%+ram)P+D8d zu_Z>n60a6{St+xuF+N9=2?(DF9xWXp5aXo=bRm&9najC3DQ6PvU{zm};6{SB-zWIe zIK@>i!L@&2m0zzkj+sDkQdwwFo^lq0Y02IHXJ|)E+fwgRSjg(QowcI@ zE%o^x9mlXto!AQ?W}lE*!I%{@BI;3eoaN&_)rO_++xa&gbBqzu7(WbBSC}vqz;cAq zOPZ0Lz`j1YQ;v}S_ zXajUu>&$f?pP=Bn_5BS`l^Z3cVu|FN8LZ-|HY^OCd=&Tu2@6xv4I#4ax3}A!rkNr0Hc%mPKZK6|)QJSXYo_^+}TvUWQ~aJX;a0a(SG42gr*D$n?}v1_u;=9Ag`%IIv3{ z*JDR6bAc<_S--4C%LApvdpwr zhDGi8v%FVXm(#G*gjk9jk+CGeg%X(gZOUjv%(wxF=6r3Jy?u6jwMS&-9D1|EG zBjchUTC{krmq%*ZegkQCW;jD8h6NLr7fYxWVq_SelK^hS;&KydGIVhR!j z2tqbUn6vEECdg6ik6(W%iDUFYae0^t<5|M5_ocrDZcYP;QB)j4`7lMx^V_4?W1w6& zC^hO=nma8Lm3HHbsct-;!-e5L!BnwNSftL$;A6u}>~`cNA||!KgO1|_cW7!?!%L06t zEizysNT^hYs&(@Yi6LT77Cr8gNjZn|P$Jvu&*2Pa+h z$*yV=OtjW#Yp0Ux=}Hkf?f=UsL;)%Lw*>f>MMv zMzkLou2918v{>g5VDx&vXS#~_u9ThKc8nNwd5HZ5%G&zY1kRTqO5DHBQ_b{#8@FBObxFu-kRr-Jl6Mjufp8o_e(t~5_!2F(QzPu;Dx=C7LG+agw zv1d$yV`5gxxJ58$skb)!K50Lsk3eHT$mtyru+YM6 zFc1b8G3*Rg-$oe|e&5E0Q#OS0_|C3;m@$S7>U*6XG*fuW zY{w@*G2nrU&@x#S?h4 zszxCi_kd(m{bO+?auLQYuP=EaPjn8`tt??*#1)Z@58LJQfOh=QZ*F=%E{w2PYbARJ zd)o1oJ|ow;P{H`cxYoS9q2^KbgWE$%VQn^G`Q{`}Sf!xK!A;ZJ9d>1hs+WLkmOu~hxjVgLt%VMmY zfSe_3;C*+R0zvI4DQv?-w!- zJLWDEl>~+hy4eq_LX&=y9EWj*_Bl$0aEYbXjv~nXVSI(~wXemDxfl*KBfeTZR86Lw zY;dA#iX8QPS0m+au5f}IbRQI7V;wD0uH9^^ZB&F@z-VoMw%9XvWo`A-eH^8!M|&#x zO3KeP<}Jk|EnM3_<$uQGKduKA-&Xm*unxJSS*3}xNZ`TZt+R)xph$iSA4Ry&k>y*Y zu|e93ycD8}G;W8?)i#x#>qpnk3aK|KlhJ6@Q*+6k3aB_Kk$ExKS1^yNl>Y$SGP##>)umz!Ti6U zPhh9D#;V$JkpI}Lf9%yi_Ua#d^^d*!Ketzg;n=L7>ytn{;Dybp9Q{uJ+D|Rc3IA7~ zuS@u;fpo^2r8>R1wPCPw;JAb{42Q-NTexC01IE{{84I(1TyT11nTx0tP|f4pTP&O- zKdpTsLagg!O^pDO9QLjV_5Gw47|DP&m7H|hjy;H+FpjM3fB-pQ!iql_)bai&t6sY# zr?!pNx`IuUn@A8R9Ea83rCi2*yRotyCU~O;>P+cFRofF){EFVs4XymT{)=AVf=i5` za&z=VRM*B9gM#_LJ+*YkaQDuWafVSx-9sp!W9HiuY#Z@YrljhCkEPZPD02d+fK}0= z?y4nMfR^mcI@*G-ASLtg;0;k&+C#dhy6jP_VvyERN~|yTA@i}$k2ZdfhP+O34`*y# z^jhdb)eTQAA8D@!%%3S6oCl1H;n$cPoBt}jS6ZR16|KA#3SAqMPH&&NOko}oS_+*p zTgD^qEVr?Poa}vXuW5ZLR7@Jul{l9l!e17E*MJ%)*|jfjmH_9%MP@~(tF1!}T56Wz zR!qc;auXeh7FEJi`t~=9yCCWUC=?ne@*LE&k9ZfD&}I{e-NORJCpF^xB7bgxUwpLy za*UJpa+@a{O-eWm4+5GJ3eCwVOOzABs-dHwP}fVp8B4OkP_|vP^&On^O`s)}R$HL` zdf!6L{NCo6TE|XnKrTDj0Z0E60XvBYnp(%RiJwRpw;ShNFL<$ZdUeJ6kxP3cy?y*( zR9FPC7i5*e9<9Bj@e02eUn!)sBgffAQOnPgOD#XF6e+vlI1HGuJu-Xsbco4sBr(mMo3eTw{Y>rvLy&dPoXJBqAK=9e}{D&BYAd%4if~hxLKVK?)}`glrD!N-~JO z&t8l-F-p6BGnw?laglVlgWrQXl3l`zr-&w$FLR;B)E)6c(k<;HuvOOcX<`VK!F%u& zRvr%F*502;g9m?66#J0S&Xj+61aV5u`Wd0HL*v%c;|clu>P!+H@ej|(NQsy!0O3il zshwh1N$jT#CaqT)<3mhLg7%o&S!8~NOqrwYg+>g+wyLV=@UE&@aC!Urd_2T=x0XP_ z=hSELancBCu996?gQgU!H=UOj_y9lh z+%ET}#SoPGycc+{dwr-pA;red02pw<$%KOsWM#s4Qt9_$;WRj~>-(SBo^GL@DL<$g zkndp@4Z~ghLo-1!eFNCZH_%Mn<)>~cT5ot@u^~RM4wbCghrt&2`!2|0#=H?ks3`Ig z8T_vbh{G*TiLf2w#ttUuDi5H+%Q)r8e5I%A8pRT{;XQ(@P6*_(H;Hi;zHu1Z?j9*dzV*1whrs;>@y1|{nybL8W#UY_d zcNO30bdR2lwlsi+CC2dkG6ijJfBW`Hf(WpZQzzbVV~Ja%(F;w`GoXeis>0K=m9fd5 z9CXDO(F+7c{8no&^hZeDoXP$5@GRg7tW60Amw)@&o^x-M+$W45mfVKUO@`ZtD9_0k zxChg!S9B@46wBc|8hAE*Rri&3gwhHtFR@7!Ot;65<}x8)=fbz;KrK`)tSRfvWfoDvZ(SmU5vO@?N*; z(7X}30ab{)l;BIbAKSt+oOqc}fh~l>Sr!wkdRupqC9c!x5^C3|j;8>~U9h2?R>AB% zry{g(E;8U`;m(TR_IN*4vMGo7(xsl$f!$MA)dabKqbS~$*W{geDDvC#y5f$eR6Aky zRWZ<2VUTAjRm32IUd68oTIiR)1!-~kw@p=bb+bdBF#$uG8rp!cd&ezCJ3v|Y{aK#3 zZ%W6%5C9qqhpEubuGf4pzw@d6&_fVPwNPV!nA;ze9CPjAvTSN*!F7>Ezru2L?5uTc zlbZVL*rv6%txLH!YxFkymli5zZOT8(B-G4h!~gP9!GFkDBctLQxf5u%=2IPh2qB)U zYwzu=6EGeTS#+WcIvT~cf9%WGkQHe-E-Y6!E}PZ3 zEfs~RR`!q5*xtyWQWNz7=0A8%TgSTzGY{WPvSTnXRqH&sh}96^1y7v5_6``x161tt z2QQF0X*bBc^9)8VA_IM+2FFJZcwaUd!9||Sg!O3@Yr`1Y>kd7yItRrpG4e5t?m`7M zRU8L890zL(_kgoLeW!!782y-bRj z8R|28z{I%oCD#kGO*cLTev-E+64V~udbk;xf^V-Jq`_JS#Zg9b-`d}tW7uvy8fcP! zVd-~{U^J80bT{>DoO~yW<7IpX#KU-L>!)!6UGE;+0{z|9d9fjB=h=M)%8*VT6wHcj zjRMU+r1=AI+{!GjrjpMm3G=7$Ldne?ZxkXEEf_5f@^2F%$vJDGt-xWI7C~#P2q`@5!81VXxrR3 z)z`21SV_&A7z`--t#=2+$5m}`$H|F1c{pP3v_Ip6&c2RGX>Kq&iFQB#nJyLntf{SA zWe^u2jVg}d!o+eY6adAB)|5`p7=WIx`Pv%P%s!C;fUD^1MDax+zG^q6tr|!S2K@j^ zkd?W?$E%X)ph9PEKw^T`4k%w_QX}$7a9weC(ULJ2IEKfR*Z_;sUg?GoUhAMAEUX@J zvQJ0@lP;2gs&swqa-&3BO-Oc%;k zjBfft`~wZd6jekYX(;pXXC%!D6YgAJ{UW$@$C8Qww0MAk*hte@V8bKW+ix_7kSDw7 zZCv$ca$PXrXeqz@a_8-iebM)RXOnVmNDM-}k}+MqHtPmao2FMDZn3^#;a4$Z z#_oFrF-8JmdUXwsT^?62IP_G1!hEcg5rKU<{MFu-Q7Ubtf`OGs^FhOa>gp$>d#YJ zA9)`5%$s+nY2vlq7X+UaEwsQYRNjbE0^+367eIfEtQaM5jkYa?C*V{24H>0`AZSfw z#l(vArhF6?61tg1n%oV9uPcJp+y~Rf*vW}o(;+xAV&_%0M)3!PMO<(TGbE#@EDgH3$Ayb`nGUDhwnRzb%dF7 z>`~&2v>d$mxL@TQ;`Wz&+&V;hX|ZUg|f}6@Ww91 zf*dvzo_^))AX9I=ZT!N=@F2Ie3%`w^vuP0;U0MGF)vZiSkyUi1+nMT+aBS-w?A>jw z5*$!{OP6XiO%zXkgwud&+I0BP8#)vG+GCak*1TS|e1Vs&7{`fJzR|QOVWdD8$d`Q8 zAS%}-snVG6XHrPr(4zN6aqx!ka@EOPJ!8gJzG+0+;SC)>sh~jG9ZWM%+nN`cgYg(a z2)cZ;D{h{-{k3)-$gre#e5NY*ZANFROK!2A7r1TheAZFwH*~J|@UMLWMDq(^pqqNn zLHe=W0=^&xqQYM=U^lRTz}j&Bl00mVz{W0a-QQGp_!C0rh3Hy11Q;LeXD!5Lz8y1&zSc{xGh#A0P=9z ztr|7OWLL4>rdDhfa08ZNISMu-19DCWQ94QB&%VF}e)8M=tY5oY-h3m>L?pc6OBco4 zj_4*Qg$$U{QMAtdO$gc_*Nw+oq46q6tfS)T`XKqPT9Z`T=1vdWCJZq$avVwt)T8~8 ziGwq|dg4Xk46kVY0##rtl|IN2hql8vK#kYNS)*R;kos z{?IItEtV_8ezt?`#>j>{fzq1u2-S+zUQ)LF+oZsjcY6D~1zC<6T^0*VP;(S&-M+@S|}sKJH34H1exq9J(qQP*6}P`*eIngq=GV_J*8i? zULaExDV`W*B17>F;D=7d_Sa5x6$U`hGlMtlTaLE1)9C=f)aaM}EJS28l}-~R2sxmyz(khfCYT zidk{i@z2i%^b>TGOu^4M()A(_Vrh7hP9{rX==EWz)&D=^Nvz6?30a0C%#y}`5P;Ci(`R zx{9*H`Pcl1K~)>aObkT3nelVXx+_H_z`PGVgR-);GSOKy7rr{j zAl&vORcXDw%XSx+|fs|%6r`=kem^8jf%w{5Lj8?IGP)nR?qg<-zx`n$}0Xs)gbjC!Xth*Ti z#J=f&)HlscakS~wO$J|US5~D6;h#Yx_|1wbV_|aBG?Dio+UtSKG71@NRV@j2wl*w-uu-<&!9|NXzcJvEUsM{GN-k9vl>UmS<8Nhro8cv^Mo@YX%n zRXsqFa|wAGu7vi$|C{#y`}gjn7t&tKUSIAdmJCK%$i-9IZbXFWAPk1@Eq)93|Lb`F zd;6zwa`JGdKo?O0Homo>QCkW3S9vCW8+0!!Er8FJaULtS*ZsU}8Cr-yd7Xs4 zyjM>e)<~)uJ5~8)>}lhU0JbrSzaf#YT)({|$ur4mHc+6JqWWEvnTlVs@t6(&QaDZ% zCVN$f2zpb%+umw95pu8}I_r)Zy36i{n1wy2GgVTtQ+)wuGXzlaH}}wV)vQ!DKCIr0 zen49A_;KDT@*)d|%7-yKo}!_qD&`X#^Wrw4@P-BtL4of_BeGsc4G^>HLupBD1Ujs< zLhjwvBkKG&Y8sJ-#vIl$rw~m3YWcTDvAC-YG&=n;OBq~NO-n_9fTOkY-Lo+?6XP1m>Sl+Df0w1N7u z`gn?bu#pa88`^yF0gSorw(Rt|Ni$H+fqAMK419c&W)y@Ovo%4!tdshWXCc?QG(tvp z6zg!G9~Q24ZC_OS)0A`hez*%m9@!f0f7auE#ujeZ&jnb8RW7_%WRsgUhvX=zpfblT@L2eQdzQt>D8Ke}k*UB}s*>O9ztZ{Z(P` zzTNQ0YFByZlU5E`9ip7kx7DUGQm#Fka$a3aTis6U6{Q$^w&0?h-wlDk+3J<;%SFVH zthC&x804#_X)yHkF8}D66~o&&Yt6m4VvJc#ofN#}CpagZOF84}eQPJ^g8Jhr(VLUe z+WR>ezOheOtX;G|7QSeH`n|>H2sgV!U;`~n&>!hr0FN>^jqGhr4E~_ssOs461Okv= zpJeA$;KjYm>;N41=I}8X*-!uiEGh83Lu{rpz$aL}a)qy$$R*oBC%6ZZcX+;TgOfx@ zjzn;77URfZ{h%Vnm(ipL6JU@ZlePJ8`sPY8agnt^P%R}$Y8TSeo!IS%yTX&zXh2)KA=PsRl`pW%d{gc1X~WCwEnqsBVoU{ll?%;Z-J~2xma_~<0a<)jN}UH0;1-TAv*YQY*IDy zYcw!zb){N6IyawUbBuh`CGLHjE=iI7tV0Y_%m#j}fhl=!Lrr>TO%Hm_ffnc-6ZM2S z4JK-OTt*xh)WMLgS3_&|Oef%;}5`6Ud;;X4gzs~Dw<7(+24 z>k#_dX4MO3;zODq19yKT&M64O(K88iofxBzDC6JdI8Yi^n|TLZbFzbE@Nt%RbK47$ zk9i`~+-vWhR(N4Gr_1*aXtmPIhv6Qqh$X~5O$rN;v1B6C>bmcp5Sd{$3e0rn)|zPI zh>tk?K46X*2vCNxh-y>_JK$@yzUK;91iQBfRZf;_@rUP`Sdr3D_$de)!(r%=X9BD3 zKbg^yc{7H^Zc0UE`uAPx4sr@}2`l4@!Nt5l`FD}A(5U8U31xv^S?oxv1DJc=BAT_> z0Q2IK(?#)xu~DYJ=Dqsr{VO5@XtRMA>50F~9csmW7`O`47f*hKzOHEr>ixZp%v{OB zip;hs6xW()6T|FEJsRiLZ?nd*4EjHcC4`H^tvJ+zlooI~5^h%c zgmk->#$`D1UAo%1o&w(riJx{cCuefy#48V_T5f5CIiaU+%}6ifs?QIveu{W0q7oQm ze#`f1Y7M^MgDeZ>T*nD@?D{oo6`~EWU&#Jk6C8*gCotpQiCVTU9G z|5D@ldNNC|7#>B`unpS?(62wJ*~>B6<;MxY5#^_01J=KQeBY8^5JYg^^^l19)MmH0CO^-wXi>_0Q2QJ=z19}tu55nAe)o78+ zLom5o03v}%>eou=LNh^MNB4C+$-nE56)lqxAi*)bP3|WwwN`$TH_StogSwe--r0-@ zGmMu!Ik|Uj zwHS-UJ6T3ToOAOPjPP&x&HO=4&wto=1f9vy7|l-$z(ZE472oH+6V09cHTXt0=q3Re z$@Q}7x4@1w?_uknpjH?)6+Zzt`s%z+&MYkpQ_%Q+faDQkfY+5~QnSG=i_8*I6k5Z@@#0K+Ts=7o&%MRQ`za1!r>c~AC21=Xp4@n7$A zo)n&&Hp0}_rO^Bp-9iyR3Bp?SqsUx-njkS0^gK17!``JKL@4#Qsmml|P=K%a!Wct{ zFLxL$Dq2>pLLDQz`~%w`H{TXs8==&P5k_?`jw)keFd9V4}dQk#mSm3pFnX{?)`8yHPJ%}NYqe< zb3dF2g`W*FA`WDxeyp)&>;X&_VZTrg5t8Asi`#G+JqfzyG6oL`o78D8^P(if0xzF# zpyyge3{aFtjAj`5owU6(H_Dd)-rTiqt|~X=RnZdLkp9lhOpwkssB`gi_tyco6`ym{ zll4bGb|>$3)02nEIgx5b9iy0h1M8D0wOjt=0-&eh-kt$l#5X-*D}h=zeOKEpqk;ad zB@YUaDNDd$^XyXW{Dg|=8Wb4$imgq`d)UqmWF(F`%P&kZ2V3p5r)%w*o zE!21bKJ+}Pa?0_^L?hMAQ9)n+5Bgb(`BSoAir*>LNg$p+xq!=wfVBviVpHE(w1;MUCxJBIihA$~M_ zCMb&kPzl7HB5J~%3k+B^eg? zeW*4ZWvefS+GeUKpx>Q~6=aRFher-*T+c@B;k__C zW134+Y*s-sRcnE{v)Q;$Ru3Z9Za*3jgZcV~&X%eX0+=$EU(XC*4G$eU6%E=$o3|}A zC9>tb-g$)dQ-2Srk$$zxu}L*?xS-3DHZVPTgi{?g1p!YKWGF20d^TACxMML*9(HN0 z%QJvu&nQ=-Rd}Y_tqJcsy?Kx{Man?C>`kdMXXaPDJID1&kMFODl{WSg&DJLAeu%PA zPa}%-RqO{7Y^n{HxTP(T@u<)f@yHa6AU*ZnWN1xvGgm4uJ$GhQ{Q8eGN=++{!KfJp z?=$c439gh^VC)v1OMY)EP%wYXmWF#0ya}}gtb)j z(N(IyK7R@)B`-p7s$~BZD?&`Ss>?jy-#ThSkioWiKHBvQoh3=gEFiVB zg;lVyaMaSxbaabepKb>ey+&pDxBH>l_^!l@*6Yuk%~g(`Shm&1x90#65R-O}LQ!YN zWZ4iZ+-LYROLnj*e2Trj6q4ewwNr%usY|Wg2)htLjo-B5lcHtUKJoIfY`fVeuFod^ zKCF~LJczQ0!)K@loeXTQO~_d|$MZLBX6-ti^-1I9M+yPJdkDh^)2SUYCsz^(da{Qu zF8Dz4_~ILxnrgc>{>X%WxZm%SF|V!B{Z`fLJ1B;Cma$IPkjH~Fb;=>el1xGz81MFp zNJ$sTv3JybbqTrt!t6p4o?QqxAW0Y^R63i^E36G-9(ci%eR`FvAesY_b;b1>Be}eg z^crh@6t<-<+apdGl-<%>6*JEKu+y%Xj&MHqsckFZ`@^&S2iDzw=v!P_UjpKIk}dj^ z&sbWj43OW*2-5I6f{SsqKg7WYWF!xnL-hqB%D&xer)ilq9lPQ$SNF66$b1!u@P3D` zq&2zk0|_!pZ6cz;S$~JZ`; z>k4|pi1n6U-vHe*+sJ-(AgGl+48;%1Y4A5<=IB-V{0Qgx2UcEq(xA^aFSqi`#0pD8 zML9aZ8F#Q?Zm|j5jr*tI#V?_7q?R=FmU+Re61qYi3;4%Ib7(ME`iNJ^j_<$0^jI}; z006ERI(7!*KkE@j4B?lnT7ASQR2~*aMy=&uQ_m7?m>o$Zd;Wp?D$E}weR z>_F|pn-VRJ4YR2;GkC>KdP|(iH0?gH}OB(0ozI z(N>%f7jEPVaEO!HXJx20GfIk?1ghkLc9*}YWaY+&1e2cA?Auj&lzdyBeRA;kG9$Hx?U+&2A0 zSpE!SyU{3m5S!xCmOf3!`%+BCIxFh|H`<3+<6iHusy)$odV1YJor{qwbK!6j|X|gBk**li2L0eM8l?Y6acSivE&beoxt-mB8uhpjuL?OSB^_i*+ zC|Wun<kn04kGWdms zxp$HV_u!6tv4wg9_$N6uKZ`irU)8 zw|Ny8Mc{#;|4`}%nzL9a>`}i))NRv3J}fjsMb8*-`~KxhhMk?I!Jua4V^i#-T*~Zg z4c0wS!s`UPbHO_VYI5MI!DTd;H*9dG}YB6!Fi18$w zs}rF0d1-s*z9lAR4WW=!LE%WkpFnUjLq`}(@lu#b1%)HsaktQh+z!Rz6O^On(OA%1 zdZ~dxf&8n8DQM$VIE!h{kFG8-aPpaRs7;0!!GQhBNblL09|E)Cm^b%zVZSv79lxZe z=FQZ&^K+bGm~9XecE5(oGc98a!s_fJmr*jKo(NB%uixgu(yv(zOW1+DP&#{H3HYn| zuJwaL1NI%W^1?yf)X@MaJB58bNO`lRH1`e4*=*m|N^{H>e*+4A^O2zULRdNlfO*GW zPyA1ph3f&le!&C+a|PYFqt8a8%8}9vUB{KEOf@~9JxeL)ud3i2mf5-(n}O_AF8{t3 zDV>>@IobCEm+j?Kf!1%M`64OlQ6>k@s9Z7S^GB=pS-|lzwargVxMghHn8!)d(U29y zZ<(Jti53<;XfvtRFA)AN6lTlh2OSrx?-sNO&)N?9NrKbJ>o-gajI~3!Dl`2+T{{K! z8g6TXMq(ifNHS_LvyCyRlP);N7)D+OiQVlqOm6wq_67!7MPf3OE66*1?LQx8D0$x7 z!@YBM!_?t|6qPCL1yukmg-%-#2*eqDA{P<+PMYLzbhk`iS21OULr%byoIx$oc`2SI z--y&Jp>p2kA&H-G4NvEjl4L?-u0hM0ZG?H2w2ggOgD?5#yFDJqgV?I-t#EZ&ss^~? ziXHp7Q&|SF-u7Mx^OKX01<=2xZ>liT_<{CCUv`V%0IcF+E4uT5?5oGc+bPBh*!-4f{gbmPB=0A7 z68I&uC@d}BBQbu3k!kKT%!hhoR`ocNJR1x7Vw)C!3F92jvk`=jNT_`388ClA&p5hn zW2$P$TYw}*JWX&NsZa_ErRhfwv*e{DK?D4G` z1jtik`OaIr-S9}9)D$1)MaHAsLPu>jl< zWNd1+#JYlehxG4g<AgI+fIdg5ujqJq7Hhkicb z2+@knL|jjmna%TeA_V^`oYd@l6-RMDNM6d5{CYsEJsIR03-Y>{2J+P&4$4r71F`>O zPD=r=HK8^lRcF$*#*5dkZ#$Y=?y382sE4-UhdEg3Dn>~p0U+iL31??eJ`yVfsmIUbE*vecn*%i^`voEVH z41Fa&PRpGnWw2ExLFl^Q*d73r#gL^Fa4E189fIRFemy_0VlS2~WzS(Mm;#t~QxHM4 zslwn|1fnW`;e{atsRborm`I0B$aQW3%3zgTSDh=j{4Zf5@CEO&28X6sSU2wbeFj9U zFZ0(#_*vuuwjohr4-g19_UnShH}6?%Mbm$2AkVZw@dm%#PpVW`LR;wKj@;rc!(sOy zjc}&ht%CHJ(~2Y2Algo#|NMlEZ5n?#dVQmng!%X$ekYd(fXKDZtexDsv(sO@8-+pr zCOK@1yv!qKH~r`e9WXdeTTdU@Z)TPGs6zdQfwAlGsArF6;E=j?aiv`Uv%*?JyAT?1 zXBejqw?d!mfx@V}S-V&c!Etp5^&$?=FH$yjF!(vv>GSlv>0LKk4nryxP|QU62pFCv z<1@eaB$X`KAV?Kiex-sREpR{D;Q?^%;aaUh-kKY1XdR=|l_7}rq+f74%qG-xdxvtp};PJd- zs7x;$r#L3lm+q%>Wn?%BC~UBLzR_y!ahT2|TK@4aNsK4)o%C)(4I@WLlzSEc-Q6&p zVv~L)j)7oc_u$kv>mcfKb9(yjFpOd`^3x+VO9p|0zOi4L8KtL1jIX~>suqrBvk)x3 zeFrECH#xqb<1~(fVqbi{$^6A(&J$Da2|GDFx{g$29@^NnKp6$v$Wb%c@p z2K+v)g;DgCw73x$z*etr%{&a=$P{p{Jfe&s1NSYSmu&oY4b2rG&B?zvv77C5KjWn` zJMUhY4&3}L6@YEgTg|Yx3we-a9I6;|!rU3lOO`7O_3MiS#W-F@uWC2{U?N_Q*a>YA z&9@~E2(t7)y9)ksMcH~d=e=>j)Y?3RDA?)+&+g`g(U!znJdoN9@6bFlstF26GfjLi zI|KhE6o^Qx<=t4jYx96(WY2Z_y%JhM`!{(#`fZ4>{I5wVQcQhxVviYm$_6YrG{e1f&+5Z)phm9OJS4s}{)i_?&j z8o1lOs^zdJJmRg*Cn)$Brw@RSX0?4%9!YW$e8JyPIu*JX-XcEl)3Q&{=4R`Q^iG%n zB?J+6$}}!ba+PS{5x92}@*Xz$<)B+1@}@MY8pyLC*&<%ZJyaY0hbkw#7qx1Nfr@ZU;s;Dw0(mL1zw2v>Jtd?L2NOSqaGHg86}0v z?j%xs*4hFi>6D`7nr3CZr>vFTUbo-bmxi&JYGo2DG#XxM; zz*DbiLci@^qRcRPyE3c-BERE1`f*)7UbVpvf2R7h^^+rzRVBaiXkEVwNwCe9Ms6d| z3Olr6t7Tv`L(JItN_91}Fm1q-J+lF&|FFB_d{o=~9O-05Uy&~<#~^iy-OXIqKPjZ$ zMu3UuJAADb;^ol>lQ(%N_{x(tU#(Dn6|^cASe9U{EJYV<4mVOn03ZsbE7^YgLLfUWb z$~^ayVimC4%f+t7R9P)Fa8rN8-X*jm96gayv>6OGL2?KjA-69EpHM2A)Z}U-cRmK~ z0kyg13MN16G7PvL72#fsh(N^x%mEb@AvpDFC0y)ofN#H!DSR_(1j*&#!%*J@eV9>> zY$8PA+j2_zNfrY|G$=^Gr?4bQ-~Jl8&KzQGDiSYTFHF8X4@_?6$Zm%N#Uro}!2KnZ zRG#Dv&Vsr1B)-2{!`~M_nQ&A*SW@H6;b}+2jXqFO`-TyrnZP>eQ2;ZrQ)KYR{`^Tq z>;|jTcI&Dc?AjTZ2+E0EI*_CLzRgc+-aFJW{cS_5pE zbmPbCHK^|$G}TO=r0sW;(~5RUDwY39sB(`(T}*Wz!QF4P&rhyHakSWN{;nk!@vs2G zFP3^?{Xqerrpt7pi+$>dhCP!9&F76IJZmUJHktDRkJD72)eSe~c(a*u9SJ{IGtvpX z5l(meSpcf)-kgzc<{%AwIyEJ^aDdl4JSunkM2WVL0bRt$y*nn0Q8L9*=BUBTN$X ze7iVF%y8WW<1nBcK5D?|e%t-dw_V;^IhfOm=+UORPVw4GmC9Y>W*6-2x9Xwi*>dP9 z>xBwvzfGHtLL-zE5^a&qspHWa>&(F_mvX+^5V~8ziXwP-%$>WN_Am zx?dJJg0$Y1gn@! zJt8aN-L3n=-;KP{SSmy4k6Ed~1t*R>h|Z`0fd7km<;SO)D2;?pd(l-6+@ry+)xG@E z)m#dUaKrEV_0Ij9-3E?CyVKmQR}}%<%aGG0i3*@OEj07KQ-d2SmqNHlpRxM(t*m-A zzzcFQTKE^mX9|kZA6$z_2T>o)RBx3+#s*d1xi;dlMY?xKgmNKfs*UjHNg6DwY+$Y# zf%GaCjs8il1JnJA%?`z936GL|q3;d_IvmA?08VuEiy>4I>_CVU^)b5&=rc+fvPH5^ zK*#RW@{SpUQC?dvta*P@WQBQaRP3rT#Jv}^ zn@;Z8`a5fluS5>rJXwu0@3Dj6dBl21*n|nATrCxA%H$;c|3=(9g=e;Hd%v+!v29gs8x`Aj#kMQ9jf%~RZCA{S zZ9A!aZ`GW0t-0skXRq%(=i*%Ec`w@dHU0ZY8@+e*NIYJ5u)xlFvEn|?`5fgNJf1b- zK1noQd+>n=^GEr-$s*K`bNohW!`r0NWE_}9x-r384qA%462WIGWU^D|10Zvuiu`rN@Xwz!W!s1{liU7ad{O^pliB%4?KOE$Jwn zD>ce8A4L=&5Xb8N)+|1D~@N z$uIpt6~Ojb{Ya85Z2ZzooBzvR+@JPl{s(&(aAwyzz0;u_(ZYfGB&`SD(|jHM>nk6q z&k>+PMhWwwNnzKYd}uUd{oM~!E=CF^YgO}#&Uph6(`Gl|&qhv$Z84mE_?SFT%s-(I zZ1e^w>~NXwd&h-kFNqbLF(hi~Ovx}ZtTQ{jz%t*O6uDOF6V76+b zdf|K4OTwVu+~SkNi0!g4Pyu|RU2~GUB5B#WAha2GGSm^YALdi$fbPVB-=wVBFSZ`Q z`#sy$^)Q7g6%zf+I5_BD(HXxB+k(E{&I+|luldIg7Rmtd0(pk1bT8eJlP?j9hfW2a zeg#@I>cdH^;{>$zm`}|4(?k9ErZ_V1z!$K(d#B6ZN!1!kI1Q>cZXy9;`C8VVAf-~A zRv&V*Nf70Xhh9U*=B4+PW5u$7u_ZOh+#n7;h+im2=uss!Q=0c4y-D z6T12+05P}78ISLzCFkzAPjg$tF=5wGKutNz z0Xh6HUN+!Hnij^-Ox3)-znM7dKQ+9&OHZB92g2sFM37;1E~>AYIO|T zPpxAldtVeK5+VBjJFgu>5VM^JoJisH8R;nM{l?fkXm2HICB!PaTY+fh=;arNRz$z^ z+a0zr{ixe{Ixrb&q@rH7GklXu^EcWQ%s6e9jn(o9SWHUzu{xH~mX|biaIP2@cl{f$ z{e3EYwT0!Cf3V&+sa)wToBq6%_>dFhA1%dFZz$x ze~@)WgM5WPU#7%DY&ZGV#V5)+GYVwl7)s)Bvy+IT*Wd6!6%t+-0Gt4;Ipyrhjzk}|Tu#$m(V({QuB*t9pz>`O zyXpSh^RjNpJoxIN5WYnB;L=D9j9DN*=$+c4* zp2L$p*!*0HSwxtzp{m^#oo03RT+DIWlNEjkbNU zdjb0cYlWAE>(6pxlC1>0AXNo!S39q-X5U}ojX_D^c>4S>1&QtU{6`EDQ;0-uqe)cF zVBS>V$iYxL>)C5Y|0^%{tbdLUe=B|$cPh>3Oq}OIA;IJ^yW1Dq6CQ2$u1guAbTmiO z^&TQTv`NTll$hQ#?9HW|@i z?-XZ?wJClyM@BxYT#hl2@MywONH}(HV!q8#Qu+Zj$^%5AzNEbZ_2SRd`H6|gvskUK z8+-it*&|J`j5*y!sLl7Hyaf_#amza*#E0Ly&<_^L3V7kC43P zNvKn>&heCh`Lukp$OwYWdj*lFq6Si%`^62v&KXeCF$sE^!kwAy;tcC~m=Dx8iEB)hvhIt;tjSg!xy%jJrML+Pn~!Vk?D_ zNu87+v+PZ5l!GuvlXm|K9K|DGq6_WkB&?6uAo4>Xllp4EF&plr+|A=odrs-g)7rgi7pqk z=fD#+sGnr^EDZ4v5KA#YSrsuUbZmp@!XgD4SWfT$`U6WI2fI2$=8w5EUdaZM1*dq3 zdW>eIKe;I4(cki1^O2ME!(-`_jPPnP-(TD0z9_rbrpv;-e%hSuO2h@3A{l_9f8a!0 z!-U&7pX~BR)sm{?Bt=ob;?%<8s_}8Z{i0k_`g61CC8DIu#1lQ?&1NiF#Uen9k}EjLjJ5;m^f+W5AmYX#;A3x-W5WQ0{kUGTKc=c8a$`M&qb0fxbj%|(3L3Hz4Ox6#{_ za#KZLk=~RQcBK375x5SVaXGf9C5}|rH0+n3DUf^1-5yF6kPXnu>(6ZoXT@(_U7A5% z(`M6kkOS|kKdkhWD%W7}6_IBe7BR~-_b&JP3zk*4?3A{vU(q&1Q!i|sr;)FkWk-a! zzz#do(Y6i)J`8#AB(LJHn^VD86Q^AnK zKaYOtW>?3}rn8F`gn|FzFfFxh5<1ai4*>ydOu1+DK9$6K;4Jn98QKQITF@EYTE(29 zInMz-G>vlO*>8O4woRjjJ&aL`*yK#HHmDA5{l>ns^3Bd!D6=n}fRa%37#OjeoLsdA z9iAk4VK;z_SH?pOMz&i$ZkeWMcZqY?Gah~&)$n_j5#DqrPqZC=1wE;l=h+54Et$mZ z9iy3mW>{pEAUq*Na~Xb@c$@3#T<(MuIWGxZlkTFI`)zLDUYB^gXISmi5?h+}9mO3R z3HQ_uBoYfn*<2mb&0oB%#ttu5KhE0Y(1GC}U~v)t#p|&O@{5<@wW_n8-%St!^IDTp z0QlTl?h77(_e|LJ58lorb`IM82`#VTssfhYUXw|BG71zIJ06x0gZ#)1JHoiF7Q;+` z&4IW_(ioP?!uHJo&vXCw9>GtXA+z|fok?YuUcn3BTptuK)a9k=U57tCE@K~#?%GfE8>@zTvRybOBTd@0HOJNFJnXP?H?Wbi8}xhw=}z{{PA2s z4sIR|ISa!zmD43JmY8f!86;uyYG6c@cd5=8(#+kQ{2&ZQ zBQvMu-i6TmGEHOQvw5w(TwW&yQ_cv_YzJnsrF97AwPJ#zc#+Xz@y)H-iK#6L=v|v8 zijxN-@gMP3Ndv_9!ik*qE^p+kOqW9DLI~NB`;-Hlc3%65@ohrCo-8ryAhLgdufB4q zHQU24UaOPT*tL{ic!MF(Xp?`IyUg_cW>^ZXI%xzL$mhxj(SzYy6e#oyjMoMA3FlRTqY_Mn}$bln&S* z#Il{{yLf(qHFcrKO$G>#k~c$4)#!xD)Tm`*hqqU}5a+uLQ(m5`)zM4vhHcC=oSAcz z3g+$QhupQQp(d8*1JWLH@kf}@H8=JUzr7aMl;Y9 zw+;8{DI~i+Cvx0=o$nT^$V;$<^aU+M(2wFZu2tKwk}>fYZ#iP^{{IwTYizM>5?WA) zg-wD968&x@kz$Z6 zA6Z|>a5El&w;90u8NfR^>yIN}?Fu<0a4gQ&4Fz$vj5bfS%>cUFWqES7t-twJ{2q-p zbtV?|ERiJ8wv~ja`x(gUzW5%%Yix@GdDjHseGW1qs`U;H!`T)Q=%+?*gi~dcGWK3r zl-AY=mF+YuLYj!>)h7=IZzsXYPp>-w+W5_D!S({+m9=U~jqP`E9(h|zjLX2n`z%($ zH?nTPWleRTS%S`LSmOMmTf%fYbQVEPrjvo-Es1qg{`5QnUof-aEhJVMi?)s$9J2X7 z^lHu9pd5ijWek|?ot4+(6Jf&U%VAs zW61NssGlgTE-Q;r8QnT(0C$H6wZB_NF9wYCtIp!QzY0sIgw|YqyT}F>x@c~egdQBW zum3*6Bo@zQ#sbs*LGzTzniZ@}8Hz(zst^igc|dv2*28r*pDvT~o37i~ulhA$yL0%} zufkGei8)%6n7`l0RarryxG_{O{@I^3{?a3OKcAxusWv3!G%)M?GN)Rr83U;XOO z`W@eD?p%_8C%Q_e+rg+%a_R_p_Y;=s_?!YQs3@If*38z`{-RVf`hxYzp+W=reg6;M zf5-QWJBXewNL^tA;o~J4y1#w`%HCW0HO0pr5fULJHSQ1quPA`G{-Wa|=@&0;2i2Zy z$4a;i9{X3%Hjfz#@!o_Ruz4%BgvH=g1q#C@m;xW96?x3@y{&LOtKjIdUPI+jbGByy zudEFqpMU95024ruSpLwXcU{7p#Ud*jmJ(mr=)DDTfkI2;7gq8$R5|(=;iKjizb-~U z0PjYrUc&GG{Lg+BWqQ+NDFy5jC_Pwsrtb||ZAa@V(j7hHOwigt1nxln&-I3($459z zv!kLA)y6~TjxpHw5;Tw7e0P(y15)zGoH#@bCX({GVxnDuewG(L3i*_*S|_!SxoFW< zEFy@GPdk<-!+H==JmdfLnCI=Uos0hI=%o<4n1e!0Eq)4#-^cq;z3+FP3fC7R^a)r1 z`*ul$wooh91s8Y;yl>hGns{_-s)xfzT|JXWw*Qx2|I^;T^csHE`IlZlIeDsvF8TxP zNdWBi|2KR8Twm0xb$R}8_I~Nd>Lfrvfd9~s&5!myyAS9GmMJydl3=1&f7-(b*gFQ; z;6oF zFsC)ImA>B10(@>>MC0Lq>BYC22hAWz9c&5mL?>L7{D438;)CZzs_!qoa4Ri1{Oo(3 z-E_s1GAFM^`&-YQhC=_+^RBY?+N%rAPYO#e^xgT{6}V$qGCc1aOB+gH1=uQ;MqA$v-}MXb}B-{eipxYyH8s$V4+D02SK*(%r93v|91c z^+Uhff615iYTnSR)bZDDVk2td5(e$Jo?&anXm6&ozx3gs`fv6aCwqH3!e*3G2{H1m z>9gT?246izo`hjO(;XXn*sIfE?`PA0 zS}#CU%+F~kvDjkw43~-EppgRn3E*S>#V2b6(1U;Wi*XZ}A=pT7$u|5jrR7E-(O-6 zEG`n&G{ZhODL)yzQx+jY5Adg=|KH;G|J5FnF>>6pH-ukg{nvukxTMrvYwmepde%>xn=4tN?ry06ww*v>qtWZ$MV*F)F6-SUMH=g(%+`HV5!A z{Epu*d;iq)KkGgFuX@L88g8~!8YB%7Y;MP(Hen_&WQ4IxOKV2-dBJqV>+&s=_%H7d zbpNT|m0L+8q&eo+?avsevN60a{;YS*zv}%z>Ax@zb*9cdRe3=cHGjxvc~)uZIH8@v z?U~6~sjw16|K?xy_glXKd@O5tcO~yc({cHA>O!Ft+5gt>Kl*hd<=0EIWOPSur{@;V zqWr7h`Wyal{ryM1PyS`kaJ)+7f3im{a-K)4npKY|YiBGUt|IhjzkdI#Uo*AUZHpI7 zzoH2GR_h_Xy#FV?AA}FiReThp-mZpfFcCG52Jk5Z`pfxWeD`m{u!^C#8OH|AoVIX< z9Dmlk{a^L2kEtd~_D!Ry@>>8Zu+~N#!>{)P(SN@mxRq6LXU$>BWmaqQ@+BEY==*Cp z&1YzVGkvaxc!wCE>6rlZGhe2&-|K^x^#54ztb18Q%>+aueym{+@ivT2>qrl)pW+Jk zrUSg46kV2psc1u4(}F(`%c9{mVc|7aDbcq1bL z(|@GkbZ-zTbVV8Ojws8R+&Na>SJ6Bdfm(%FSu@(Yi7PHLumwEc*x=H^T901Y9A_T` zx{M}2phNATibj;Tv~<*T*&wV~WAv<&h$1W-@Wp8JIA;({;6?arPIx08Kl(R@*gjf9 zVVQ28{DVB-YhF~}3YPLdMuWno!t8LbO|$+HrELn>5Eb1rA@MR0dPBQho8SyPHEW_u zzAHW6Y zTjyT#5$CDFW7)1O`CwAJSRYd$Nspa@jw})P4ozN>s1M-?JtlO_nL5f=PnH1&3#{e-MKuNv+H^P zQzAg$NZ#4)tGx>(gea@>uv#;r7y@+Zd?~5*_pgj{`Rs0$XoCmTrMdc@-Yy0P)ptEc z$#8VJ!{Tx9Y z7*9h5gI}yZDTBkt=g|d})o*zo^(yMU2B6lta~griFD!-j(Gm&Ei~{nj0FYnkz7;zh zpaRA51uEgZ>H*I5(|Zt{F=(@{wFKX-*Jsg~7jj+5uA)rW5FLM5sigRkD;WNfU!F}h zMK!N8VsI}1%rE4`GyG3c7*jj_wuR^xiD0~4pNQ~sWJj^*SmzmDSK78j2P*Op5K%xa z#bB?qYb_^EJ)$Z33w;CaAHLT7D5VMzAJCbuCe898mMK;Yu*^YL3&+1N7t6L zFC`Sg(8MuK*RuJBV77dF(d}2G<%P5|%6Jm*0n+(qjMl3Frd@NLnbMiOP65sAoS@o@ zyYIqH$veOufkfXy3T5();%E-FQh}V@xQ^V~S`-D`b9X^<0Ko(Bmova$X6uW{0Drlq zHh2K56>{bBx#4_}wmgHP*wgxCFzN~ChPu0htZn(v{5mvP2HK0b5_p$p;&DpA_>%V{ zuj?_Q7`UX!Qv&upVb zZeTWUE}^`L7I8{NgBzVXUKIB1Dd^e|_uwmH9NRuuaMQ-7_~cq1-$2avZ%?{|YIMBt zRz_J4WumVjRoRnUYNVUM8NG0_#j}l1!3Z}e6T-% zfkUmhS*NYJ9^Awo4{%0moWYbR$+15(M#->ZWu@EL7@SqG<5#Tn{0Y^eF`1qO1s=0p z@nC+SwW1DIv%Srzkkjm#Wwkg2ImjSHdz*s+BnF&Q!;ta~p^z7`V-fUsekI9{;{D36 zcI=mOg_KFMneW()@Hd$KcFooY^B1X!kY#SR=xfUVQ~%OqJdcNvk`OStRjIU#{D|Kc z%Lk95+Hza)q06Li3nhZN#PhO7p$oL}mUBFEbB`l0q7C3LqyI;L#bkSLd&HlC)#&5s zw-KYSFZJOFA`hjVRLHlRk5Y^Ih&&JkhkI@k3lZ}@-tcvs{I18p_4~}JR&H_RnFm)a zi?-OadCR}m<02aKOqo~A2gueR%0bJ(p_&o{N-eD+7vPaxo=v%pHD`c&{BQl0 zsUZPs^8E>vE{PhA6~8cX3n)p(x+?+|$|5nE5=bk|4BlBc5^tBx=O{1WnR|o9b~;Kz>mI@@wj^{HjZFY%gthUw5x}MnK)CQ3q?5l2YwGL0MPNP*^R2Yi&LBNKl6l{e69CAsu)pWmKmEnnWU@m0ZU1t>c>tKE za_U2RR}m}knoF|9eA?5;D6LUIzpt*v&Rb_1GImB>+tImiRhT`}TK!L6gKRyTXwC%CATY z@-;9WHj`bB_e?5!dE}5QO- zy=4s|S03vH6U#J_v{lk5(WHB%fe+%h&QfDUU6UKL0^uI*Ys>oX$*ckWUhePxUZ48% zfA!bAZ2tm@xPXPLcQgEEkl^<}{N?!c+h554@BOuaCZP+tKZ$$iO+_!MpxM6P=Q27Q z+k-iel$8ZpZ(7QwaHboJpv&@@GAiSAakZ4BD>X7b#U=07U>9Xe4C2fZzeWXvbmo{R z;noyZGke%%&Np+oh?L}r)oD0{>cH9Cec`)vZEyto>BP|r$T;rL`Iq9$D+SZ9`BzP% z2KYBz_xGFmQ(ZkijKzq`= zrk`PUg}L-~&YyT%+arfYM|1B%50#>W-bzp?)fH( z^ga9r4vc2BFrChm6?3T7x)_pp(1CSd62v_gJq30ywDW;NMq0#Iztg!5EAXr;k)xY+ zM@f&@Edwy`tNu0r`ipngk@vGpa9qO5fdVuFd(%7u6$~L81CK7GkNmzy5z=yo5B_x!)WY(QO5F!f2A~`e*@r7JxYGo`tM$1|@JE zl=p>*b&JPEReS;s1t$aQr zxA_v`%l4utGC!fBC3JT4rQPbRkHgs4S6gvaM|OGOv0gLzU-Pd&cvEBN z>EtD171Q$C;VWEVzL$iu=m7YvVw1bO~p+-k%g25Ci5)!F1)i}-Sh#o|S%5$=IjW9Exk zDlA5ZSwc9!c!U4UXT{y?334BlN=!??bd;+jY5}_L4-4E)!_XAFb}amuKLPn%0?212 zKt3bL^dpUgL}pA2_M(XxgT;LIZcg=k0iX9QPvw0T*6s2Vd#h!LQ@Prk+{H40QHN_y zfXS5p7w=~tb^tFFhDC~SUANSh-i=qJtfX0UgD&R95MoY3$U>ae2m8=yJmO@PgypBK zXq?q5hmca~{s{mtVEzT*mHovVod-`s2_Yxzv+9KDhlz~esViBK8T}BJE)#{4u3jI? zc(HgCOvtF?2kR>NVYm7y$+2#!`c&5T@T&s2#QC}N-{xPUD$nU||D1nqqs5}W@2#=- zY}o8JMGEn3{pMvA{fif9csXOvtlsGCL>oI@t!(*+i%@6<(3mBTGkfhPDp|ckk*DOm zy->LVi<~GmK>f~!5no6tcAX?xWgvD!*O*ChUWA0o6ftuKfz+Jsu9gIRR8ok z-yiBv_ptW6egX3@kl+0(H5OY0vaNWlFJ!e>vp{rPSn1FD#cX=g)3O&`xaRCc;0@Cn$uOlj zcRwKNXHJ%TdXquH|KR<1eCxGf2v_@-0`YRpz(2XE({8#+m|-9l*kGG;)V{uOA{UCh z0C>aX3Jh|BfAMx^xJ~9U^wG8C9@2F7QegkBe#=Av^}9i^D~qQL?`}ngjG`;14|_ne1LNiZfOf%$)KuyJ+(@k#Y5tyraVUVcY(YPhLl5 zm?ne);LR==JNw?>Y=-b5!Sz$5VkYg~wsIGL;Y zPq$p&tbM-_pgV_r4x6ZeLeg2&;~7sAcjMOu3v{dHSwe#YnK3_i8IOSCBhnC8rX~+@ zlvK5DoVhr81~&?wgnXP(>6G&i_6fgl0d)~^kg5D~T7gGrT=VMlGs0ALOum?>ER8;) z%n=SPUb*C|xvY*~Q-1RK;ntfQ+0e8Z zRSDFzd}|qT?$27KDADkPMezzq1UGDFQh2GQQ{zjf7FZnHqdUdo(?(h88#}`V-?|wDMQ|6`{QG zVM#}Y+<-K*LX$S=hE}^(?V&Pc4?Xi!Am7vnGz^y2LpP?^5qfcu>ND02m7;y5(fSuYQ6qMGCpf(a1-w~S`>|RfqLM^Eh*eB{m zB;(kt{?dHze3HT!}u3e8J+1*XBVb41cUW;cN$b*#5W4U3C(?98rKal$f0_5>S|A(65 z`}@LGs}KuMB;z~(bkcxo4V)De=7n46y4Z!-R|awZ#iPsYNm=>kM#s+u9|=6Kk~`-b zqoeL(ER)k}F_u8Zt3P8R+a0N&MSQ4?9GQ{6sJEt^(9aCV$Cvl-4p9+Q+Dqz+YCBT-PQ3N zx3_i*St-SPU~#4*CScoR^IHNT%L&T|nG~_kWg_t7>(%2(s`k!4<(9T{XL`Dj%1K@& zNy9D>E`14&$A+)?1By(jusj7E(U5w^6y%b%l4qVGRFnjf;tQ^ZLu3PsI~zc+eX+@r zY*rbDJyO=7bY_PwDWk7KhJ(9zD`y%-_wiOsK}hu+D@&r5JWXB#VmdEDrIe>Je6p2e zRpO2Fs3e3NYU?J=7o$=0Fm1=|!7EZGU6O>bO$ zIHOR^HvbfhMw|po$T)%O{cR*8g#d^K@x{4iCT z3zm8DV$oTyxk~-B@quJYwpK@Ew>v6q(j_7~5h-LWYh9qAuyL8JdP{(5LX|`uQM9V{ zG}ceIq1?DHSgDf>n`YyxQy)M|clooahr=ZF<{YVT@=UE7l)~mdG+*~9iu2j3l6!GB z$ZzislD^BKKEA{ncpyaCCXrauxDYGz?76zRc|DX4B>~?}fZcC6!lO;}GtwyWLcf2R zjErQtD-N_bMTxB0lvJ|<4Hw(cSvZ9PTb+>~iT=2fCtz$)c>@vPTnVKVAkdwsa4eYc zQrxBZDXlno2ah{YK9j}2sMR_IBGT=kW?m96;7(C5dHYYJ=-8?R;fYcb`-UhM*E5yScDSM!0nl zBb(fU4|5~Wr}4Z(GiLL{K$<9s{Y<5Dd0I3~M-f{jpU0jj*R`=ZsX0Z%M^Y+3@p&Bn z@~{ws!RNFvW>!$$wq->IBY^BVk{gPF3_-i~@Yy`LR#% zMy|Wf(}D@C5XwGpYcYmnN@I*WX?MUvuOdljVaQ{{B(fRGs%1I{+h9-S1(nuc%4(dI z`b>#FLZKLSzF0WDT6czjz4>^WZP&URR`9;gH8LtOqqmp&fJ;u!s49nTKaZ7zoU2odDNjr$ zr|Ul&*YOI2?tFpKaJdH>+vRF$c*^x5I17vwVKaGwXiT3KI}Jj4*b9VU28vt`=(t-q zBR;hPlft_z#ohBBjZrM=LA?@H0Jp9QUjlm# zq2-;8wqBg%`{>}qLf$@^370B?0fqLS={EAk}))N{L z>Uz*zQKlRhvQbS4^U;(l$as6s;NYN!RhE3yk-^;Q=-Kc-OZZjSBt85|DY(Ixyy-P^ zlp@3Pj;UZt%R_%2s0MXEzg5?2R}#@doJ~v6Wd>Zn7y>A-FO$3qlts~&p4;wafZ*o> z9JnL8ros?auUeU+oyAO^J4U`?)xzov?fCvUwC_Nsj6xWSJEWATFdXzp1@DV>kzP1j z#qYCDd2twWxeD}-BM`#`rn(3eEbzDaZF^j`6>L~YMp3}lhX$f~@;~P|LLGgZBI7v* zYRcQx3@$zgIb|DClo(;72bv85LqkNzACjr9EY0}{@vX0@sWMj(@`tP^YR+7Zj&YJo zZOTF*!nqeAt3Zd;`|-#FdBB2`YP|_v1qQ(#Q0`yVTsw&Yo6WX$RI<1y4>&|N;M29Q z_N*5LVSdivsZ>qA8_vy(F=Aju>}K%yV2zBpc@@&6XxR$$j6LaW#BW;K5IbLYzXgW8 z_#j%W_Wi~yI!1unEb*Mrv#VgwpurFgzhPdAJM7D*XH8CK(E7zUL)FXRo$}?^mTWWI zh2^>nu8onQeS9hm!J>#IJ^fTNn{rguWo%CvWW>yI+C|1ma8m9Yko@YDuJuaw4h60G$!bO1WQ8(C(kxdls;dGC@ zf6kh@*GcCm+b2E1%bsa?s?##xsN@XxWWgML^S{1BAyVs@@|VkspP}zwoFPO@;#OjY z`cjih!Rkm$DR{EO3t{5f{k8ov{ri+t-FvP~r>F~>wO8;q)Ka<~)dT+cbqYeLQ_j?&vBd&1N<6XtR531K| zh`!`}nxCqW-mhx5`NgeW^5p_<;Q4Y0z4kSK3^StzjKc#Z-I5q>hE9w3n|8t2*NuN3 zA)HTM-LHH)FW<(gVXf z;Dzg2CUy|5*=tidT_+Oq=;;>G=1u{*=);x)XiqNXch%-sw=W zT@&bPB-8bm)7SObqS^0m`pB*DR4n+71|mguzWZ+*u3PpvAe&gwS|)`~_?(kU3@uX#QX zMaDT42hSjqj%lq0E@%4AcLOaTX2nZA<5|M0!Jk5pi#2|Hh91Qq;5p#-FSRtkx#{I8 zyd|Os8ufQEw0ki#T(!o?KB~-_@xhmM=5yOw;?)#4UXrw ze~C|scy4b?^6cwU6bYdKgSScKu3N7?jc?Kq#t&HwkrO8J6k-a?$p&qs(b;|U7L-i9 ze@ctE0;Nx9lFz)35lq`ad^)pXcC^?8@_6zvXA=vXJ}7C{>c1at{RwM;H-ZF;2Gb5& z1Gqsgf?BD8FTJ;B!Un8&20PXgb3uqxmKFTj&a+3~pLCNpc`xIQioq9F=hkpP-6;Z0 zo$w{>+?Q2Wyd-YDj)vB4M?RMY*m$jKqRFYfP=GI70&f_lDioG~56HM1lPh7K@{sm8 z%8<;qOO5#WO^`ZhtKd87rKIbjC$<*7 z&V;YPXEH=>3Ls3b*C2eP2qach#%eFIhhD3R6?s;}t*WJ=5h1i!d3&2A!m?xKxX2KU z7OJT$X|DP;LZ7x+TmwVkflJ3JAvbq-N!&CKp*1ob(VeIUZ<3@v3-pJcq%?!uf_{wS@)a z?A@!n%cu_Ct2`iK{Lk(NW3aTc%JRo`Dp^0MDUKG(d( zt#h~Vo1GgsOW>!VGN(j*c;i;Qar95fnJzCDm%b~Iqb~8%12^5cyD|^JU-n7jL|sxQ z&JbE47XhCr7faK7-^FUbReEgo|?1q6VU5b~G8P3N{rPxql9o zuO&ItSZ_I6^d1*NntEZdTnDCwgrL|$_y6v`FPr(V-6tK$>(ymGNK8CGZvs=Y&lira8h+#cG_xeY+xudNnX2!xYf&Lf;>eXQn{lopfGvIanWPt`R#WlD|6 zln#)Jpreu7c`##=bYh8FhJ)LThm%V4F&iS{OPIr*^x(+KGv|~0?pm~lo%G)25Sa1$ zv1A;LQD3Pc)82}^Pji65PEQxZtvFA384}V(hH@D{DaywX%=Zi$<3kfv#DB`D*@P$r z>yN@8d52v&*{a@EvY=2=C9%~{&+~`Qr$&^;?sYnfjmTaJ5$|`1#^K%HKfZZi1GaxL z87tofliBbNy4SJ;{|o(o!st4z<}BVPc}@y_paEbBybJr->-V2fL#^$wFTID130NWFjr=UMzUPnQF^voARpv-R%! zgg4Jy2CgYlzEItZVZ-dKBHQSR3&w%vus<>l2umxOUmf=)j*&e94r^)3%hj}p8B32C z@ORq&77KSXVqTBS61P|1;8iK}F&#DU4z>XzQK)s#!V0Vmm-<6w=WZQygn%GqgT-gr z?$?N6*&MS=*>g0_z_R<)imC4F*c^;6Z&G}U)0^{TL4t7-g@E&YcEveH$nZKI_0-9} z8oVeQ)MH4qvxPpN0_p5;7JS`r=gaR-i1rJ61gD`P1!lNGs|p0A8$0mg2a@mR17^Lx z)<8){6fa~&*s-7qw}X=*Y`x4c@Qr_JO+1*8Wg?GN1y|pFPu5(6c!C*XJS`J7 zMi?~`-rKYO`a3Q* zdgik_>_?TI38!ON#{@8_T{+vTlNU@LVX+Sp+=@83OacBixhnos)b#Zbw6h}KNhgLTQ!L{mITczq9e=NMjz_l zgG&iT3!&i*?WaVBVL@)2R+g2SGcF)XwQ{28s_y_m$#+ES9*OJ! z`8Qj_ORfc*dYVR&ZAHSXmE{$z?T}m|kwlZ}NVH|@;t}GD(kC^sAr3Y<{AB~uxYF#a zeZ!-Gkhtyg7uhDS;O3ogHRm2}XcPT|k??Px28!SLoxvntiK7o2r5>PW;F$*hu2!e>~0KB)rYmraqK7i^EWF8E$_p z&>J-igEt*Wfilfx(`W~5;aTtCPx7sh+0G`>`LF4BiOo|8+FB|iJQ8V9JbOb zW|&H+7hr_7O7XJLUE=2MXb>U8X6S;&cwn{`uWEnmhH-S~A)8Vx;0{B|GU(NYl(HEx$4J97 z>u&{{>k^i#r9wt8lV8r73Abh4kS4%hdUacuvoOMIfc4%L&L#4_bUup)=0|&{Pb89b z+u_typZS(jh^Ek>P;(P2hBAo!ht8LVMqClZL-_qj_}5<7j2bgAe2D|W&wH$fFJR@z zTqS8`e(?KYk+cvq&G4UNi=<&0GHSQ{jBa6&>!af0zP>h0jRC)sOW07j!GJqV(r#uU ztc{6R809O5P!cQ4RXjPB-YJZt#IqL0s_%R%bhb_tBCilwWnPLk3$PnWa`T&9csogD zpLQ3!5;jqe0_HnuE%^CFIyMD07;30bYi2&tRLMGi9iZlQ7MgMsM+lY=Z78DGkMNO2 zso~lPI(K$5C@KoCdJ(IXz5I*On@z>@LmdZ_SQqYRn_jEn_4Gl^wL!lSUlLDY z#MI%YmH_Ek0Or47fbRoR0Q=h>f9+@aPxmAJ|NVO*$Wz$k4+)ZEY}m0KP;w@=-Kd0A zpmyM`bGquUYDl8Uop`Je( zdn=H^`3QSkS(bBTmU)Np)X5$etNgIW3i)35f7<)Xpv<;yJK)2$akmBcP2 zcXxM(#@*c=KD=>h;c4H^YblWg2kApcDHx87M~Y==*<5mb zk-``ugO(HVv8*x~QXrADB%BMCo%NtYHP1&U@`XBhJeySim%&zf&A_Wk|JhCv)*7!W zRM_9(nGK%zDF1@GEf{Z zv5QPnH|RKk1`X4%9X3NV$21P~h1=9wjotps10Ze$n++mo|+Sd@5qo;d&ub1v=Rx0~eJ(_+vUwS~_F;pTR zW8_iP-f`XK@B6J&Q<)|k0+;ZsE}A!NIjn0w#GI?5=H;sh(M6l$7lRV)(Iy7Gh<`eT z_fx|5o-u;�19?gYY1cIkh4*(U>a(zogTfO`(inhe$hg_y#Teb>yIX+|ldzOFVB5!S1tMVXkcqvqUc zzS^jd2+R302cSKjxE>pGXy0grAz64!XjOUv0R#8YH+CaWn|W-nTarmCOqZ*T$#4|A zr<$>G$dn0X;<>>ef8jws@%QTgh5z5F4?Rq`9rsL*;8Wl9dbfyOoP^feL(lPii>rju z=@4hY>F@AjMlzL5A-n7J2AT<*NZZ2m$PfO&1y_n>UUbhyAVT)NHs0inJBwNx)&b52vZ0stM@-S{=yWkuZeXzYk`*NHD=f+Fm2{2s z>tIX2bI~XhLvYIa7!f%Iwl{v{$ZPrU1Q;gXHo)fo4;z+G=?SuK83|^vF6sE- zAo+PZ;7xF&Cu2T@Xlwqcw?0W2tt%($lm@vJqJ6PXK`ep52wlfXeg5+r_?xY9L61oq zOD#FpC2f{u*yRDxxez2J-rzDd;Tl{!d2OtF|qVA z97C3c1yp-_ABw%ndEbvf%rY|@&S?98!T;;?nIvCfJQ)U?@Kj4t;Z>TaZW1w6(Liq{ z%H^nN9O*|hz^MDMPk|9NPzUwK*R2e`!KtHHqt*pcb>-W!J(?E83idA6w@WTqXWJA> z*4lrNsjrJ9C!8;|(|rynE#75_ygh`5(96WbTBFG3kFJjw-w;mPm-Jei_$0RG)^rnR z;i;Tel9(1LtWgd=$E>#|(UsF!<|ImTI9ZCs&Vtf3jP6P|eR;qh=&8Wr!KE&#jJI4{ zZP-Ljn8Bisit-A&qrEBHw}xVLIQL+AdsaaNlDn}Z2$v=__^I}W#?wm_?cSg+^2oU0 zH`{JXTUK-2BTC0699dWnsq&WH?pK<-`$@(YaJ1J8E;^W386Q~ItO3d#Dg*OqG_VG|^zosgC1jAEJ9GLsD<4MKL zT&7PpFsU4GN1Cg#P`gN%MEM1+40&;A`d!WUCcS^)YWM|bYfe%msX}H5gCk|bt&bnbE*?m>Z|Biun`tpRuK{oK@(*u;)pf?Ewi%(r z$Ly7b4!NWmE?Se0H9hOP2tBPVFz|6U&6i+I;`frKROmJTZs2;UXbnc19P2W5jo(;V+T}LbHTn-t{ zkZhFrlWSeLNBI>@vqX`;9b5BSIn7uQctM|92@|?%o}iMNAvdofI26#&)M4|h;YXLa zl_KrSt$HHqS}OMlh3Xxu7klT>xw47e^Y}jfty5}`({pWig9_EgrYMx+=hSY+mTMr? z^fF_;*(($RP`kXn4A>G9~nLMOT|tg_F=GSA2IMESh3L!)4w}Zd;^(MLD?zQ zc#K`>XuSipXJ7jplmJvL$RGXE^nPWeBWWxJYvopI8GiG&^y(jMicchYjv65M4u0`G zULioYGKR|?YXQPtY~ijgxW{PvHMqAbp_Y5oyxK&bK2OU+y9#PRbgR(@78Ra3=kjDg}SCq5b-W46?p!g_4|(vEKG}4wY;prj6zySnlXC z*fmWd1x_D0nNN02>CN4vtdv!A^SP{30HceqYWhZ~upCSPf`YZ@pkIk?VfzBeCBYj0 z_-}F#7k$Au>llE6%tr5**wBfWaT11N!*o4N5Zcx#hXV(DOeBE``vnq{({d=g>-a5d zO^4PQvElhI6X67GmY_bBN0`EV*&nKjpmO(lBrb6{a_En-xhJaSi!W1C%?xt5;8!{# zd9e2pT^uBgXm=Qg3Y+^pNGUZh&>41pNoxMo(Mk6<+a|10A+a6Ly%4%J5hpbz&gG!#oXg=TJEtrIEbP4*&$@__3B_6+!XZ-l@$G-Zf6>#7_Gti<2Y@gPDD9HnS zW4VfZxa?V+LyEdPS-i9?8}}0Nx?HPH08%Cf{OQ7h+@EEQBFAFpPQ=n9<5D-9z~AH< z+ily4uk;qh*Y@$H1!cCk;C|vd{NTK%P7?0lmNfuLEm$R!v`$ooqz1zXy0^4S{aAQm zYdS_b&rPn>`QttN%RcB`CRz#^NuIgYq*etLOLG{sGlqul)i4VPYt*wlCSA^nxcA|l z%!wh@n~%mwop7e{nk2`u<*b9S1@e7fCmb|MGRnoMtIbbXu#C?e&hP8Mft{<5*p z6Rl|!`Evqw>Fl6!GjlqkW`845r1T9V`K0Tu%6Vu}@{d}`$|FW0lWT+!VdtX-TJEz8 z`LG{#lwZ#TA|00@f3rv1#7*J)$3|^zKNg4em_@r`Gx`#d^2&75VR7tk%o;(#zVhNe z;uRBk9A!{+Cf-vh@{GfeYI`GD5-wQ56(}0I{!nTeSClEbFuE8KR|TFba>`6Z+5b$*ZeVX zs=B61zIj?|>!mRCCJx3tx4HX0o+M2KG#_-hlgi2k&qd;wvmMa=)Q!(|nbT%ycO4}; zkoNNf25L`oEGg{tzd@7n6B8VdVYa?fX>>-$qlxnJTGY^@~xWB{3uL3k`zjCEhr4-X_8rikM zDuBbqi7xnO;a~{VE?hjco+hqx*bqDSNs7GcJ~CsoA4U%5cw={mrnogaykoy-+!3Aa zXBq8#(aAQ%Q`Vn9v>&zmmUMuiv>_saytCCVn-M?QLAkV*V4t(a8|yox9tN+8_s zGZhkt1R7{{5`|4Dfrq;Q*ZP_-C@uR?X&bPnW-h zg`pk$Noq21dyR{|R7Fyt3NiY8O*-p_|FB{{e{3zNPZh#2^(a!b&}PVdiu*iSMCioqOJGR0HEwPAaRKT|iV$NP4=Hz%3;mWdGWaFb_mZPG zhty9$Z=^g+SMgdVJ5LY>oxFJ}R;=D#*u+^IakHl1sXbWMLm-lBIY^LW zL_MoF5Aj4TriRIZ?e*v9__o7GBJrmD5JaVhK7D<@eF4NUp*h7J(_`2jJve+Q@=u~} zP2ubt9#pmj7$)=04ZENrZ0O$1epqQvikiSDUlcG8@$jE~g)VglC>He4Om_g&0~6pK z0UQ@76x<;0?TyM4bvr{6n*g!5&lo9|A+8c&I!I`8bhQ8?giYwXS&C(Rvq8rb|0kc? za312(Klyy$5te%fW_jD*4yGa`xFY(n1b^mKpl6q1RUq^$Za*rbZrOD**fgnDD_G(V zSf|4@;_gq8WA%hJE}GgWLkfs}@;MFVA)fz}uTneGT6!Isz3zbyGhh6T@xDofJs3%Z z+Y`dpPTp#Tp}Z`W@LB{9vxNGGF!c~TgK(aTdNzS0rQ?Nv~pe8lGa?oJb$|_g`P#044+nt8j z89!X5k+#ChGd$CvMOcD=&>{8KWpAVR>1XfjFhM2|X`=HuV7)8T^GZ*Yf65g^pKS)7(zD{yi8h)c-u7| z{7I)3xMHFmsu&X+^ipEm>dz?Yit^9T>AlMQ{z0MEhQonD`sOv7qbLeW#Db)O%l$3F z0;>k!B%?{O>IbGOv5?0G&HT25y+pBn-F=Cqn^9F*wV&?Knt)K@LvJ5FvkA4Kk8kzS zMGsB);MgwP5#1Up3jLT3LF#7mh#TZczwKxKP&~q|OG^zUWc|qAaxHi(`o75i)*E4! z7h=KCwL$|?v^E&g{lv~#$j5)r_vx3fG%yQ&f`B6_Uha$kviZ7+)S2YRkB3-J9dMr{ ziEb1f=Hy54zieMTFJ?A#3tz0esD3R>N}*+y@DNYKrrF}mFiDa{+Oq6`#c5mb?JXyJJTI-T(2e%sJmMXlN*!#gh>ni*%iJb0`z+E6L*pi)C|{(KgKZCFBDHE2YQW(J%tUob~#kSt_+9 zKPZ2bzv?6OxB95J`c)F5)Mj^*9iO zW{bfDRw>MW2-xR3U>>Xi>G=%BIJ$&Q=c8SQNtF*%RWB56_VrUhokvpr!t481si0QB$WlU~77CQCjUNExZaPoue@~2Ai{hfra%+Xh;*|# zhB{U#1`?cHr?U(maCC+l8DZGSZ=i2V4NC6(dVxAPB-vjJr7ZuvEAA(*kOW5^3Aw*@ zQ1}Kwq9&bWL4W)3bsJ{RDKQ`$^O%rjLsg%8wpGcJghQxrUrs2$x1`}{;T{q+om6(| zHy)?5p?;bIIT7qOdz-}pYZ-WbWvhh8V`chcc#WnC(8z1@ESzAn9W*@b)`{xanM2!~ z>|zjJ$LlN;lUqs_*|+~=is4$q<0=}JwL9C{hIGq%#X}VsYI+c05H87h=c_6UmUS0S ziFK8blBnV{EwRu3fLOEl^AXXTy-0<)LMMX;z@~v3!vSDoeifA-LnXehD*4d{x!JLy z8kSx#;=gBI*RrZQ$)JX@!Q&D{?OkgKZd60){7PBg;;fa2uxxf>x=49pG|dY}>~2ct zj+#ylbg-!hs0Y_##X^3i^Bk4m>H*?P^oOLSH0rDP`gN5Q8eBhiM`E59JNi$ zDO`x6T=+%$f4oO|x8_gX7cfMdL4gT}8CI+={Ty|=CuM9S7=+H?q$>t_o0GIv{E~ls zcWY^kN6B~g`SGXAZUi2hN$eMR zKC92o589tV%~J|EOQE#Bv8jk5XX~%mxGNG(W+#wDzW|O8;m7Q`Ct@*#L4|CuasA`+3J&FYHPL!vL7NtsUtV_T3V$t;2 z2g1JCH~lcDx5*h5v7~!LCPSL{**^L7ZVQgmYfI-|&zD(wXC(nzr(LvsuKE~)+shuyawt@xah+NgUY+yk zqww|)BqkbO8kjMnR-$P$zvCd89bLb>jJR>zI;-&R^}#NlsNJ<-?25rIA#-o=h|BtLk&K}9~@g8?8A;)}wc6z{2o)R_B5(T2YxLO$9o#M987&fyj$bsdQZ{w39= zzLkgi711E;sp2pFEsI8PLKdC;KhYnA%g}HWZJjh~RR9ZHH7}QM#K`Zx9csXx008XI z{2#j^77E2S5*D<5_)9p`p%usPPEY7z@dc ze!R!Wg$;F^V3hi;tr_5mWr98Rlt@6qbRb*vY_kZTmjzCG-WV5J=YHuSar zerJ_az7ZDh6|!6_&oI2(DqQ z*?Xm{bNHQTgk8an+gs9VmmC%#)TD0hYg5i}Y+Hr*5-Igs-+lp(*wfCC%K`8ThE zyaCLW@95{=JH0N!Ce=^_+18rPhqy_$n6PQWI>~c`WW)$P&1QZan7&cMgU~#-~&HeO#A%mYZo- zdAAFTR>ty3Y{R5eN8V;=XaB^cCLcv{3?KSb;3HJUp@q1_M*%1p^#h~8j0-baFe)76 zPgKm%?qtyoPg=B=KVzYkgmB0{{^HqWXJa-U#~tQul;-f@i6~!IiAZDhTxCo(EZ+@!>B08QxAbxS0d|{I|Ipz%D=I!79h8v)nJ@dzn`LBapZ}Ceu)%L%!1II?q546(IXQBSST)-L0NUKGeSmcsd;4oV z9E90^RWE0)IjlVv)c=wu?LPn!4C2guR~^JRu4VAdZ%v#`mbrgS_9oJrnwwe-0#9$rdz}QF$63e>?A=qB_T6+szp*~1Qw~POzook)mS&5#WjtjQ)w>~xq zwwR}W3n4ASX-8C!Ff(yPO;p=f~d6j4nw!Nxn>!sq0#ab6#e%vrC(qpWtDN)PnGl@sqtF*%`a*;(~xv zyiDm?-AXyaQ|i6zQBokxV$^7zgIU>8ALba!gJ=ga7x^;NCeH=mhulM`Skr3OCY)R< zm80YS*nQly`X_ZA*VbJ71$%-3!Y|eGit#+Uk=Dy}n}WaN_1|2sZIXe%AH~FHc0KzL?_UTn|Bg@c=$4u%)2-hd%GNx# zc;e~m%HL6IS8FO-BrFMG9|T$W#gFHUN29+FIY|3AmyqhYGk zJIwGCIrG=!yO(AU&lT0}Uw$fD9ci#jNl((c`UJR^;`CXPt`|B+A6fvIFgXsRh`@6KKLH}p8 z_y2o;*MGJD4}JZc-~7MULs8EQb}>q8oz{U1V|@>lh(Rz!)uSP)y;cn?Ptqlp!U=aV z;}T;i5a!9-r?v5Uk_Q(3+C!>SZd`~*QF%UVUqkRn*iv$Vbtz{bLx+dg-$tb<1jAxx zH7!>0>teu+QJkrZ1gq_b1a(TU)d6;%SKk+#x`m|2Ktd*ne*002-yfgLsE?-qI zs6}e2!*Nr;T6+VGtfGRfm641C=aM|xs;=${rW^s`Atq%DoqG_39~uN46hzm-*wNU* m#n?!fk)DyBo}Gc2ftBg=hziInA0!CKAPm^Qhw1DD0r_tciBbdr diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/ePAeLNA/MT7615_EEPROM.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/ePAeLNA/MT7615_EEPROM.bin deleted file mode 100644 index 36a56b9c9d2891abd24806613c172c8f2899025c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1200 zcmeHDu};G<5Pc3sLIsp1nUE?A7+^t+olpc_U_eMLUApiQS>uL*kzZg$Vnkw3Y{$^A z;7`ikr4~s21bV}}_ul#J^X26Wuy=K`{g#(DgGpesyxclmE{_KL$#ViT)c6xDCP<(Z zkYOll(APEex6&H##Ro82d@TsQvxLrn5{51SX-7uNZt5L@WoDUqA3b4GXj`r_2y3O6 z4?FRiK+ypKjHpEr34!h+lMpqzoLBKk`4xCt$(Un#E$;$5v>?H?q8R-w#_*60fv{gW zugR+!Tsx2d;OQIgFx=6%#dA0~J{uS6^5$+jtE!6M7@eMvFH|wPzP+E$9@yE$W&{6n F13!TlV3Ys= diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/ePAiLNA/MT7615_EEPROM.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/ePAiLNA/MT7615_EEPROM.bin deleted file mode 100644 index 1cfcf2f9a676966171d4cbda5f1570caf115a60d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1200 zcmeHDF;2rk5FDG(L_u!i3Mo1f3TO~zDr7+#C{QGtG--H*TVG5;$rmV*D3R#xyYoR_ z!B4`@B`2t9$riISv%9Cg&C6$CaCNf(nwMq>ox%+Ba_?xp9`_E?rxd!c@GB^$NRcEo z`$6?c0R{DyD22D;9T=@XSAxzOLF+yQedmF!6C3X7ItU@&%Ufa!q868V8xN9SfXA(jIhOyBH@j%fB^!aje&n(iuO`@b8UMlU v8%}6WY{p_A4v)_!MRIvFn=h)W;zpy>^T|b0Os{Y6=8JneyVzaeUtZuFov&b7 diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/iPAeLNA/MT7615_EEPROM.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7615/iPAeLNA/MT7615_EEPROM.bin deleted file mode 100644 index 0e589fa2178d8c8e6c824dc5ae4e98c0616fd672..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmeHDOAdlC6dVu}<7Zd)L=(@^L=VC#SOZF2dIgv6OOveARroS|xW*@037ZQC>rprPxcC@QT{mSq8JEnr{_vBS}D z1zD7)qJ0HURNQ)3&qiZqihwsr*>jI;_=u+cVK z&*(8FU1F#qgtVe)4A^XH(>}M;Klka_*hahgfws4mG-He<7E^acV^gUlv)`F}2hixY z+ui5c6rVfyJ?}Z+Ip6ut-*>+2d}l$Sb5TKIfzx@Hb756tak+2JSFK;Q0)TaSRrD<$ z0l>z&0F}QqfaMnkIQ@zNTJhcTk^xRW4L~q2I~PE}aw0w!e3-ZmpA3Am@j3aX0S3<) z5dCBRb)<^Wg8la=i}0{T1dmyS(wdr>N zu_5l-Auzq3J9cTHsJ{sJ;I3upn z`p30pEFWvv*bs4CF&5P?-{?yN@e1`F1naKg!K=IBC9jg8NZujXDcl{bEl&$4#qgxy z=emM&n!v9m#L)Gn77;buaoM=^EciW6SQ(Ux-|EWJ`=A_8?z((M2(9nheq@!hEVQ=k z`j3OQ-C+3sY-NM6i|_}xD}RuR2`{A)kQ~Gy6%fw$I5C8xwgZHlc!}_?f9@TM%oq}U z)gZNG6xo*#4$)PwLdIkM^2+E@*OcBNy)Crg#cZ@Pj%I#>_rWmE9chzbg~@&^1slF2 z`?a~#aqJx^svl@pOc6=_fFA5M(j1&0iKNg5eJ*^3WQB@X>}w%3Z|J62TGuh_eMu>p1S6u{;`$uNSiJ%M{+I-n2Tj%bLMKr zPKZ7=$gL!{_R^=wEqa6A^S>?tNXj% z4PGb&+0i6cxWO)4-wkqZVzxqxyqwTW_imngd} z0<0m)6%?Yf!-;80sBky|=lxkG@5e*bGXp?g9Tw%)&0NPxrCN5|1aGr+*6T}Xfm~vi z3);9x4Xh@%>VC@m-FV98l0=3$hLRYl3A{NL6qBCMcL76mfOgLif18JrjjT>n2A{ZWP#O+S4VIE4!D(_`h9Elt z``HDyl_1&zV74uSL|YC?vI#paG~D?ej{|@jgu^>6{bg~KUDS9gnL$H9PXm;!1yp;`rV*x$)$OUI{1Uk5$AIbAu1hjiX z&zGLel?%EA9KFIPLvlf@P*H6ND@0y>SoA)=ClyNz6|46E+F8Ky;aG`KrDt9AK==Df zuq}e)!BrHHN_oCT2vsRLZtIXalry&S*#3g&#v9sP8`^clTx+>;u9?1AHj;Lz``>z8 zvO^Mwc-dhUU;@eUmg0PH;usukh2uQi4Srq(C1755mLHPcve>;_1xhAJ4kgCVqP37N#uT81(hifJ;Lp_nF_3}LHA*rX7gf08?Wo7rt0 zF~7*Wt=E{814~#(L~jSq-nM2*sa`s{C!k;*tZnKt3h}1h#1=Ut|9c|_l+S* zc?0`l4!wbSHszGpeytIEZ4RCCTOW@qC$PpWxmsX7s*Y(t9qX@-X`jtdIcswYLq3M4 zG8F5Pogu%7wPq;vUE^ib)!nkMOO(^XqHhso8!r(-sTOcN<<(Spm-;4xB(JQ*J?OB& zG!Cw1J&;$o3dXYpuJS*kwgM(}# zLb)L+l!N>Bup;C7G>2sN-iB`?39wUiLxb6dZ|1Es|3>q1U31v^gB~+a4XQ*B_Tx?{ zgK9n{xWOf=MtZ29_v2lP*}zYlogp!{Bi^VhFkR7VqkeF#?yFA`ihT(>f}GDz1hOu) z>-i)6U^IYK9hGM*aT@8coxcd{^9w9*lPq1PpxJ}Mz7n>{Ou4ToU1aH zW~DHVK23-B?pO+C5LUk@p!LfJ@u z8g;Pu+_z%C`?S-3FKGT4HI$8b6g>4adadYryh0_)M{s1YMk|!Fb%>s1dD)0JGwus$ za%I=AuNw0YV%$|ltdcP~Io z7{IGeMUUf*H^VCXt-%bXSYD7}l&eJ{bR4mxnF|$T{s}dSl@Ne<oUM|0$NMkL z|G|HH3;k)p0<3lwY?rd_|doPT6)TYXa17+{ja_M2Tuf=2KUvp)^ zdXH7ui|-8{tKkuRSD}T#4+dG0_U5$Rk2{a#x1tv>X|j(gDBDaOMU%V_Q^{q2<003S zzNOTF^^eS$=SuE-EF#4i9vKjGG^t09p%l9};`q{SsM|X_Zbke@9k(IAc+(i-U1|7! zik_YLV!X%f9PK*BMt9CPyfpx9J`sbzn)4rgMIf+4F|`X}3u^LgL{dyR2Mr;UVse9E z4w)(hh=%b_(AOQ2-2AnqFs=fR?WvKM@Llp=tj_INyXMnByg0SlwRp)9*W&0g*S*o` zu>c2LApI~G$PqY}SJ42bwYvzn0(~c6>y8fsdw~xCn2YQKP1Ilmg7>$91~zwMICUUH z0D$FZ!GO{N*2ZIPJl4iz?G#%Pur-0@;T)5(Ciec{X~BIYwBSDyT4&vPT)S&NxSzM4j=BGD$k)A7v~$vuTt`))_L&r07iBD3hu)M@AW| z&Kw(M(sZU*W4em<^njMeXizL}m2i!vg$79T?FzP%8Onx3Kh$zWOC-0vX~#8fKh)xM zV^&sVWrJSMNu@|G+Id4)kUDg(RA+Y59G$7unO!tjXSV4KrFlBjsx!OkG@Uu3Gmp^e zIuq8Juh1Dfb6R82PY~%$of{hE%ygEB4i+7RF#ZnRAl)k*SD0h&VM7oMbI6 z!PcX)!ICLMOBR#Cy0cMEq0l4lJANXe$9%#l$kFS{pU)L{uxVuX1;&%34!OXsH#n$G7ACZIPw z0lm_meyf^H-D*nyx&g~+p316ug%J|520P}KVARXwnm26EpES^VJRRlj^qKw?DivWG z>&3F z+J1-aCShb5Jx1npGc7R2{1<#%mD<=&tpYll~bvgpWn#`@D~C*nn0}AUiN%U=5>L|gmT$jWOo8miMGHfJe4rcR2<0-nJD99b5&ax7{d(u9f?D@Mob#E zTt#fuaKZ@U1P!M?k66@j3R_cV9orBmYFMm9oTQh(hS;KEvxGQV#~Tr+==ccYRK5HU z5Lt$H|6Lo$Y;yZM#AfBY*WI#MY!zsOpZ5mF>Mx3GJQpA&W%<9S1 z@$-~PXW_0hHDEf+Gdr@I5W^HA`-yx${X&ulz+Nta!1mNYdH{1&lk2|WYzl>GUrij_ z2RuHwr|)BHhsff=tUX8iT!`imrW~m6%SUwQpm3nJ|KsYk&f30Nowfa|)LHwU!<(e@ zT+W5rovZrG)VVF+?7I(3mY_^s-+V;(4Vn&owr>WOUaZdO+}wY+Ivb_)F+E?+514>g z7X?fLug(vcL|&a2Fj;tYPQWDb>a2h%k5{J$Ofz{kH(;8>t5U!u^Xim<$-}Fe0aGcj zP70XHdDRv$Rq|?Dz!c!slz?d?uOec6b43yJ7K#aD=S4`VyOrxIr2&Y#eI zPuNIsSH!*X%NR-V!Q7T>XRfk&$8J=5{Bxw}@qsR18`xHz0Fg=3v)(S8iO(j_1iZe5 zr{k|7oU4dFj9o@%V@%P2$QqfgWaB#{G8^+bJk`#rDL*ja`}b-hJ&3#i+o}n_J8*P{ z+(0r(0+}9}t?BSs;bR%>E7O@iwhFbV%U;0IT!I=F_1?2~2$rCoKi7LFBG;g>=h*29 zs;#rOcY0^-=@fN(XI<|^%vs7t?X*cv#2hO=X?XJF1-JmG@@Qu+WWe($8*R<0*U{FT zdJS#Osei(;;nXWQHk^71$A(ic;@EKNh1jf-3k!B~p(=vkr`Vd+_LtM+_qku=9wMj{ zaSut0o!7}l2?G{(2aV+9FB!1V>HkzffXeYxU0dNys|tYBaq|)P*>>3t&Du`OgA;83 zo;Yq?MdkGG}P6;-+*7B*cq8ki;HFq zw6fFGZ*2xVP1%lVjz}~QPg#3e^m;3Uh>faVKu|94^x}lebJ&-287tFtVz*=qvW$n<{%!Bg}EGthZyAgAP zlRZ8wkEvJI4z&t{;(^a1{uZvpno@ut?t7;^jr{Ih?uvKemCjH0e;T+TKp~8^UeOrSYp8Avl}p- z!&vejmgo97j8~!O>76=tDn_Q>!e|(NV=Ehh6dJ~_Uo*74{CvN4=Q);#@zCfH#hgs^ zJ_MD=Uz-9EiLlbvm=yuC(4Q>C_I^7q?ZWhHEX^XIkR@12HhP}P=w;=oiCBwYjo|NE z^>rM-iL5?t?x57$7)9QMD`m34lPv1+%_Bl2_gw=C+ZK>4%vV{yzmdesC z$&=^d?wyNYD8m@>Wime=(*$eIWZKYT^^RMxZj8y@s5O?So=9$KH2RfTD|3f!Ofwc& zjpSTmZREzrvC^zg!Wj8YP_yEaWzi2-sJ3{j$o@8d``nYr();=a8M50?@0(mG?@7e{%F5Oy z&dSVQA?AI@<_eW?PGz$4?B=6Lo_W#KCl$Q&aQKy}8gDgWykScFzEruiES1(&6qhWQ%2s$+N;4a4 zzgQ#H)=BHPH`UD2%3=2E3Q7B0y27KQHD#Y#DoMVj#mglWtysEjby>wHnZUiyZPT_% zlJ+|-AW5;OTC1y~c+K*^)?Ta(EA+Rw%6h>1v>f$g?|Y|JYyaYU+(Mhb$8M|>HFZrj zThK%sYU^s7YSwM4uWyL;ZBtFv7ntd8=BG6-j^#I0HC1n%*SNiLT@0;TUt71XDZd&5 zHS4!NC~d9U(j?W?RjuDt6JYj_mC4V~Pt@|)HEgM0U$d^Mrm>0jZ+$}yuG_G+u9~Gk z?e(}nBdyL~Bdwla7&Cq14ct8+<`y_V%oQy9Ft$+wk|?nqT0&HD9pk*8GB-=(xQW-iE)qnt1uUZd3m5 z+weDcD_+md-HP)Cx9Qi-^l16pv^)RS{EDrcV;fk-_J$gLORHNi6$b)aY8o3Ev8Af+ z!5X$;wQ*n>i@l6Y0FFx%l`;63B bQx{nG(B`If)tea?|1%(XIZKQsqxkz@NmLVC diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7622/MT7622_EEPROM.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7622/MT7622_EEPROM.bin deleted file mode 100644 index 7be6f256f43505f230a46f3a6a6cffba835b583f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmY!?V`5<7aaK!UzyLhX9&3=9e&aRD&p!oULJK!E}S!)AwVhYza(`Hn{r z>Ms2%DRmTMr&=YHe+8!e>hxgC4^I28Q--e2S3dxEUBYk+>u> Q%h^fPFsghs1n3$903LA~bN~PV diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7622/WIFI_RAM_CODE_MT7622_E2.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7622/WIFI_RAM_CODE_MT7622_E2.bin deleted file mode 100644 index 4c78a851eacfb4e640f1e9fd3eccdedc7e29ac92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300312 zcmeFWL$EN=vZZ-!+qP}nwr$(CZQJ(wk8Rtw?Yh;`uSPwpVaFZr$jQo#Z)dKI{FpTd zSjMl{iyHjMM3|v0E0Mu*r^wAT?J_ld+8z}p*oSyF$XcCP5HWKvW-n+@L`G?-7z`yO z8)=+==CH3VmN-!FupY%8VP)1QIq}Uf`<6fE15(z}q_Zq;I`4N)`FeS$<(s?QK=j!pJ>Up!(#?MU`iN83`u8Li(%owr^k=!Hi}}&t<0qQ#1S% z&-^!%WT9-mM70(G(3d0aj$gG?(jk_kqwS=j9)0uPk;5sVPemtx?ak#29ox2qM6sQL z7uSN}N3)1?X+*7(whL zxZAR7A+a+M1NZH(4N^HlXhaQ`SrJMuX$dy&*Bldeh(Gprf(v&lxEc5V(C$v%oHyMsIDGRMS}uQ zExERB`5nM9FBS}?&h#=u3hP+We07>jx`{SzSLnlB#%PGlC9^$=V%r+(iqRP&-}y z9dFec+HMZm89YrMP}8Ide_#=`;s|utWP|i{M>gdO*E+T%)x>gnn^;i&B$P)K#Femu zWR(NbGLsV=8rh}A#p@G}2B?Hr!$)z8-w#tk=#~5LGozQY<;b{QXSh57p^@KHB6Sj; z$qPg6q3l)+u1osVkL+Sk@IsRqg@93+Fo!9Tes!f<^NM*Ji;F&kC>vD79**%|s1JU5 zn;I`!`s;v~a%5x`QX-_J<2A5lco?o^8xj!8e8vd2=Dw=CcN2T}2Fah%DWgPI!AQ${ zz6JcQF`YM+Do^<1`;m+$6~q|a4#73sPd#5By zvB;{rRqNc5|EIp{2;V|;vNuNJ`eFAr=?!Z#rVc-JQAV0wSWSsbbsBtRO8hAe?}Q65 zo4I$5ia8TcD(m*7fq5ih+A4|+QU#N%X)gDw74) zzW!V;PGipfFGs-uiCo^BkM0x7+fD?4MDT8I+zxCR(VB$pm_BZ_k3N0t)fK|nqSUCh zTY|{?X{t55T`P9I&?MHeJ42x>Mrv49m+UI`;HB4y5C$mM&VJ5!<)5s2y;5D8V~kNx zrqRJV0Htz-CW0E(Ko~+QekMG3u;kB+cLhA)OEeorTYSyjG%tAbP4eY+nY8>)3o<$8 zJvqx*0>C&6{OlSx$y5d|!hW-ha1&xH#r>6xJoa1v&%Gg5;#Iwuf{abhuS=g1hN{Lw z=fVXMu?US>KlAnY0;boQ|?@1oyui|}?yQ}q2 zzhEC9EWr^^Uqir?z%sbiylQL|}}DOJZ_z zSg!XdvxU527d~4q%u>(lNE=0em*9S>=dKaeAPG`EZu%A_H+8-sgs$cY@scKPDqn#l z?(F-;{#G811XICn`PTyUpkhW5m+lL;*PJDEmATp+F^2kyI&#dufYrlKr)qqU;d*F_ zI*m&tAn>za!{<6kq8p*ElJ%@?yWTwvUKJLe%LjFu@!iAj3{S^s<3)6$fe$ri!-svOC7uSQKEjm0w2B z%HFY6g^jw?UO0&tuWeYy_FaS8P1#4V5+acqj>VrG+dT&DkqEUkTOe}M$QQf2IXJpC zT|#*UmY?+mnuBM>mwI#iS2kBcBWPqmy^H(M1`UX_a}(DDDBZtsv-Ltwe!XgOfRi?* zE_mo$`{;{Fd>>a63aIM<)2W`pQ#hh7CZWDxJXTD%y5UbC@tP`i3WOqk_Kni1eypI! zfZyfD!d%J&h{0xY*4b>BtY3=ATeRJ`nSiMJ#PD(*2xaWg` zr0}ZMU}i4Zwyi)pTsg|Jk663eIED&2IKhH6^J@LNfUfyqTn?60Yso3Q2|E^1C_usX zjr&CMGe%1|_T$lV+QFEL4J8slSWMV|g;5Rk;KMgA3l+Lvxs`iL&a341@qFnsRyUua zm`XJ=@QhK&WkRD?8iYPp74t|5U=+tP;0q3~ZR>)4)D2D6f$4cG$JcS3m@)Xjhpy2Q z+>zvFcX3GHuAu2VJVY7A7@DQYjH6%Zbfb@5=jK9j3&{LDY&*!Xii{gA7{V_+DQ|Z4 zcXI7x@ZXWjZzqJd70bc;h%K+0YvL1A~fpK7cpZ~_(D9a6O z0gnj}gpRyOdtY~+f2%va38tdDv+i}Qq80ASEhGM6eA0S7&4mN)*WFE=DLzn31y+o6 z5=#x>t~|Cm5fEsa;-{<8UGP?{uE7=6k=UXTEA@E!RY7uYq2AA3t`ZH+24u`z%GBR9 zntZF&_KsZV`Q2D|3I=7@PXMBD_R*15)*ZC`4^zLEw5E)uO2}^-L0G!cNyc-7> zn4m`B>c*M^4p~1tRp1$5_dA(;q3QLj)#};CR!FAh=Lx|6{Dr$KbMDCM5ve|b*AF0xTb@GVgt+B!7L3}1uV;}cLVA|S7kX{i{2-l(YQ9V9WWR7BXL41(Av>)oxXGeQ`+)r6+< z52Xi)4rs76F@280PX%{ezzZ~0R+Ue4ozPh6G4_b%f+$Jqjiul)-!AmgZeFMsVd$Mt zPn@0e5$5Bt7INuqgJ9!An?wGDAox4UW}6H`^}~pp?~enVkEI_*L`hI{Lv^)e z62~`^ru^HO5vSTB?9rJ z8&LvJtPj$H&00@Q)PqO2q?v^K*k^&hZGP-zeJ8K}R+)EKD238b_X-L{2g3+GwL39_ z*x6XN(8RO~h({v+Xn1RAas|@T**Nm@x9bDiVA7O8eDTFTk5!BJMt0ZyfVocla zpLXjTC?6Vlb-3G?c@Wj;+CWWXFY-x#qmH6!hQgVNY@FPp`I~&$f3diXU#<&nnWg-# zD&${fVdPd#%=a~Me!gUlFaf`QnB1s~pD~-d2Q(_zsuM`L6?mhiu<3gfghS3e70UY!l!L*IPm@)j(wj)00#;hD*XBQ1T#$LCM*)qold zayFH?MX9K3s>TKz#meh)$VM?r$~~36@(TWZZlcAfFGoVGge?8LSDHJ@*htLit z$>0OfTNO~_3N%0ac=WQ6%VC;FPDg8|E#31h96^UMF}vOmnY~XuiqBnyOMR20^c4l8GDHO(LC^l^Dq2DENGt~A zWd{V@3~~2=ZXca4t=DJTi#C;?d17OG7E`*8wFd@aJ<1WVh0tI;;B|PUCCr5|cw>BE z+$2XzrLpoTv~kf_1^x_$)=e5lhvj67i$k?cM9!+)jyf4uMek(RG4nUx7ayvdif{U4 zJMuHI+OmxBn8rz?)uIWSmY{L@-hm)LX1$1>Fhgio0L)%%vsm05amw*TCiHAJDeCG= zfugfIgtu&&Ie|Zy_wLP-n^E4w4OoZNd55xnjK%#+HdgeB_L-Iv(Ex+Z2R6C#R)Xt7 zO^?3%gG_lnIu9NW-M;}E<-jIRW+{x|&5jnrSGhF1Q5}OxY?b7%^x-^5XXnh6Si9>0 zV}42#+>Z(9GlekqB_qPQ@VdrpPG8##XADY+$l>g!7?}+_3mdBNzJ%EqCF-QU*n9zo*vJ+3u7c5D}8N*Lt z#~0qA#4JhGM_NG*rY|V=klNO*=Qfw3W6Ic3A`K_<)8~fPzi|0=CY)q&>(lcKs61XW z)RfOv37_FmoE0aq4~JBtGQa)Wxc}8PtVL&LN%3z>DxeS2bGbNhuWtEli!rMtrrVuN zhe3MA?q}s7>{C?6+L<}F-^GV*8L6%ABV}i+jrULPnQ|OYmq4PDC2hDIfXI|zy^#z* zE{s`v@+q#OR{$L8hf@yaTFGgfV~kijkn>4xR@bIOEIt1ic1!G_t53@ZHgB&IBZVxJ zP%V@Bvx84Hb((rN|3bImZ?S2XL98L>cHPLvg$?*H84mz8XV&KZ3Rq4Q5#zJ>Tn6aoSj)xiY|R3s znH~^+7v=k?2F%E|Rvw2#5F+|WC11Kk8-YV8UsoHh>5&n7cj=L1(HDMY#8s7%Z1BJi zf*8UPrwFc;iR9YXAPiCO+?X$Lv*m53Mn`j&l>F14`?{islK=@@-1)AYN~LH7fYJv9 zJ-`9p>G8*Fm_kf#q}X|QYZF=xLvZ9y$>eT#`Gmp!$VGz~KaycrgjnKgcX7IJplNZX zpC1awrK`ZIx8f28FCiey-9wEn&A|7bQI{QI8kB}FRO1@YwI*b8J*xEvC?sRy9;;C| zO2F!!*sL1eyH%S?;{l)c8ep!?UkhQ(7UMc`^vw$K4XN;TY3;x$p$Y*QAg@kKKDo)WYM10@m{YMJ9zTAN(1P>Zb~l!m{tH4La-mY4j6$tdQ&R2FZ*J~N zKAFsLE=|B!YY~*xQ0i!~lqBw5UJc78xQ;6goJ-B3E`| zq`RrE5B%qDWk$(BcqsBZ6*TnmUe5{7)Sipu;#n>i>$Q^))sd&Ii%jNpx{R2Se{a#E zq3Uxvp0(uBD=L3Ras`KM0X3vmGp`a2vT-s3?&BLdXL*&XT?Q@bYJZ3A3-uns!IK69 zVQwG;Jn@l^<{zXU6iO2g&-D)ioFoHgw3kNxD;zw&)9DI~m$3B!x)b?YgZ7Z>Z0O*< zC@|Zz7H7;_)L@xs^0-1GZu3ZyLrRbxPvX%tR%~bDD*$((%ZGx#nfJ^+roW!)8$!;C zUd%EAG=hVK5TewHI0}>^;kaJb!*VzS20L$yvTZ0I*U3d05RL2}VtRS1Usmxp9kysN zW>8xa#%j#(9symq5OqjQt_v~X-1)X|>+-Tza}w=h7YQ%OZRns9tR;} zI(G~MvsKxz!t|489Da95u%alXq|NLZ=mOXL@R9rLaGDS}bBMm#b0DK& zd)$rfyB<#hNYvu;GK)PF20ud~2BS(qKZ;(C$!YA_piVQ?8)?-lS71bu%srp!6iIpn z{kr+A4tZd6Uk?hi*=abnLiT+!l|6PUnr_ZU^Ygj%Qx^r2-WjeyrKKHe+fGG{M(4r3 zT&VZ%51>^&SRz-KQPUe9=3GmiSZdTI-XGvf=bAZcg_R-;-ud?X<|wW~k;G1yqSXJ! zkDwyeM|-2=R;=fmzN|&)Kvz$|0f#v1>k3>3bVQ`vm*3D##O2?Z%}*{?A^oazpCIMa zX#H#gBF64<(3YFKt;!#Nz8mXxhP!+#zov6TjAH9{ey1aJL5J(eeDOuP`d^Q85s>?} z3EFMRSt)uX@gcmSt3jh(I5k8>r(?SYE=bGbZs`b!%V!Z3((O5Q`#QE_F$eDD8??qs zvFK?rBj4}8{fq!J^`PD#CcdyGxVO#g;2~)YbQS8I?7PZWCa@Y6_HO$VlnPXad|ta2wQJ>qF=;0_Aldya2|$)Gj~x5BJfd5cuhk}>(LZ+S%0e})2} zRotq7L>`fJ@GUeYD5ANn*a8<_(BO%Vn;|HG938(o)b%tBw;mDH;DX-{-)kiylICEl z?$p+2t({V0z8fL@(p{Z5#@zZz)HYozI0UNYSf=;6v&c%OX82kDRtG@xNtu_z|B%G_ zu_Vu1`>X$CQy#4Z>H%lHb<#ch4M+ z6~(g9aA}4AZ}|*5ch<;w%nP>{;E|z@>$1i*{p3fT{ddTfF9`(|JC*;X*Ojn4w-!hQ zH?jX-gpQ=flxTXZ*Gm4klzu{qVL8o%b|OCa*8G3?ENSluKYL(|r{Y?N_-+|;vwe3; z)DFk4dENle{Z3HBm;q8GLvp-BPZmX!mm3p`=Y4YfVXE61`M>2iiF`Jm)4es}BAEuS ziO2KLxeS#EHRp;bhcfOX(MM1DkQYeyQV-?iQMla&0Ys*yd9)r|6XDMB1sDFycxlQQ zr)B<9415=<5I&4!T8M-T_Zw|H*0_O{mToY?)I(7+>)!C09=_AuyDI}?E&Xp6>z?Yr z@Bh~0zdZc+Km4~J{I?(ecOLwA9{$%4{MQfs*AM*v#1Eu*5IoCEmoaX6bazP>!i5aY z>ZWZiR#LJ#;-&Z%h&ov)K1KQ%!|_QN4pNS^@{mZ0#&Dp6ccZd>ONMeClTKRbCBSnQ7xCTYIo`=JWESf7})LZ_Mw z8wZ`DYLj>$(nIR=vswt34p&FGEQ)$hocKwBa#Vf0Ubx^(70y*tpw2Z?zOZsz=I!fC z_`YTuzF@&P^_<*(qt73XrJ?>?|5_8TO<)}0k9COw{O8y)$ix-=@FEJXH!f>7KrOIJ zSFG3Z&>M&dnV}kM`BRE6>)kX0lk5!F2$}fN>qZvt)N{@o@MB+3(JUQB0OGxXu*^HT zf&o0$J+h@ppsAcTE2ABTroYlMI)WK%e(ww;`Cy_SEd#TOJP*AhVjH=IUVqL#VDyYbuL_7C;4XfWr+pP}(q88Ay%+8}J7hGtCwLnB$#x4l>pkEC;>IB?G9+>ks zb($#Kc;))b@uW>aEh9OJ-o#K>G}JB!EWspVTUc@t8NidJ@A$7{sPiOH#o$Gr*jK2rZK$M!~S+>e?JWGwU+F)0h&%<~>EH{L4ufRws5y#?Bm zu^Y+q(F1+4o2GWK?6P7^j(e3Dexl~y^CF8n?fm2=?Nmv`Tajk9|ZK$LZZE1yq)B8<}yIJ882&esKzW;+U5WHfXhXG9!4 z&vZ`=3MioSM;@=NoQ=&jEnc}bf0JJl*+H)v-Sbb&Qj+CuYXCm@r)Vb*v0^~Di96IK z$$br0&S3ZbhD-_DH&c-wjqN{YtFpe&+38>0$a;yJyY~oS4LpuvZ@e#EE}AvL+B3*K zM1gdHOf2%-eNoG&oPu{SG7je`g??r+;5Bzie@wmCGTAo1G_W2kz6t1fTwY1U(Ww5U zFsOg&G)V^uQ&h|c(iw8`MWrbEoLldcFpF0$5$EeXgAVqJjb=W78cUy!kd@ieQLdPr z++z8+1h(CATzcqIk;_cP!|dA-E*@w|vSBl8ZR*a>b_PZ5mBmffH~r=F^S~N=@BB@d zq&wBVYTGk;4u?P&e4U4j)DTBh;q&)Rf+xDd+He0h%G!Rf5N{UivQ*Lto5P|HP;xmI zm>}44Ar@wxqMgbe1Sp--C*QgdI}G6emN6XigHOwYNblAlN9a9fTiq*&>u43DyuSH2 z6otO=)_|wFOadwDGLQB4Zr8{#ba-zcseS??MNkLAuQN@Rjb8U*;c2Mc9)Wx&=hr}G zy&~DvY{v-!XP`+dYhc=3LEh8bI!(p**Y8v;$N^YPK~q;&PMa0Q1aRWxT&yR7v3;ZT zmp)0zg(@X z*{cYz0AcN6q4jngg8tc{?h(aqSFwM|6RdCI;M~P(uZvYK7>S7q;2;#w@BMDKcB@L)f*2u zQrTxRI@Nyyk;C|&`JtpG$8=qF_AcsqDB%VNW|+8tzbRiNhV|D-h;sSX4iCZ!U)QL-D+N^J}jCQO()^NlUO5>7M}0w8MqBeY{HTu6)JwE z#9t?X3Ok*q+qr8|BhbR#=zv7Q7nRB^+ea+vdb0=j%JvmzK<&gKGWxKyJDJg1EF?26 zEKY5v7xbeYHi$+u`XzjF&`6x)8eYmf=~Dgy{%Ilzw>`Bkb5+hGeTpN)#j zmFDSl3r!an+VmfL`*(8oL-*%@I%=cOZ{zlNSOxWwpZO0R?JnY9Xt_h5wIngyQ(&O_ z{FATOkPs@;nSpByS4m~6%U6kU*6fTmC>uwOlnDc-ByX_-WvB5nndH;MX1bE>{t!MV z+3L)uD{TB!6KO$z-)N#kf%CXCY?@D-Xk#a0b7KSRrU51LtlOAP-SrY%=@!}JqVx_< zyyQJ`317Dw&2nYTI(u3W>05}4fr@Q)yWK*o${`AB!&~(hY9tD0({`K4osK?6rD3SV z&Nn3^%ao;_lvn3GAolYKREe`M0mhJb#4c0}=F`8YW(n^IhJ6-3b~zeT+wefs)q4eV z?QC4##sEga#GP4(12*}_F8oH@H>I{Mmdt2$d*41uk zX~%sGFN(XeP~eO>tDZq8O+Nqvh8$`3X8~aA$O~%_!5g+nC&hQZZK}ULM;6Kfq{@fdd-qE4)@M_my&IH zX(U@5x*!3XW=(a$$;Q4E_(jZLo^~b~pn3g)>Ve({!9nT^U#Nw(LL9)NJJg4H4+vC7 z;Op{V|8zdnTYX76<39jUi;1E!OXC?t;VJ67bp1$o=Mx`9E=w$>$G-~df5zSYmC3`0 zl_Zkg?_LBF`l&?V)A{O-xiA?YK(j;pv(Fx9q?7fG>YdMvwHqm@w479KZ@S|MPJUZl zX7RO!dkHQEtk8k-teACz-l9{)kKMe>3(dTWaJa>&hzIwS+&7Z&K0pMJ=1>$!Rt_eMmR_G5ur40W%FJ{TWJ+XXKwD5W zvbmk$JyI03OX&mb(!0UsoiO&{8#9b}2ewXr4?6&G0I96u{Nb>ln7oIEuqu{M+jLG` zu_uyi+k1SRKP)_WEl^ck%#piQbH~l<=Gk|sv&u2n!tl|8qHhX}2wb+HT3@c?V$(?M z_I5Lb@!?JJ0Wa?Pq#c_zH6)LwseuGhny;tLYy+-(&h#epfKU-kf4Ic^{t}Y4FTa7K zcIjW- z3F!juC9+^Wa=k;3iMCUb)j7O)_24t8C|b~!zN5{ZejV!i22BrP{f~CIu%Bo>LT!Ng zihyG=ajE6e2%T!urLij8MR&>rQq@-XxOW6|mv#)hz((FjVKOSIUe*_M5CU^|5%0GB zWW=ZIYxm|Hzs{hwtjb7BcYaOJBHE6KMHkYSfmCM{^-xw38CnwTWSoXYbqT~NC!8k8 z2T=Zd9S)P;DE(K>NCH;p_DwB6UP=o8@e#Rbo3-(f*0yfJw&O2DPar5MajCPHkMtr zGX+h%UiQKXM5SF+{0~PICmxAwJC-%gEk>Z3h;_JgFbza$2|8gDacMcDfsyO#bzOCJG6Q>va^`o^1l~hPSlK zm^h-ub)7lt&P2%PcKVT+dt<>6brn-CPmj74)XCIu?rkq*ZSK#AA=fLsk@J5`{alFhA1vH`SMMwA$gKaU53IxHl2n+z^f#kzPL7b zF9nU!XCU4pe5er+4hvrA^cpNuv_51#RVN%wO;-rcAHX|CHp_^%BONNqUsAdJDaqoD zi1$0hIeD*so4Rp5$7>C@ffJK!?IWU^d&2~Lc%!BFQ9Gdrq-SliQ|@8RzyyD9kTPJ5 zguGxy^|5jj!mtjCV&k82sXeeJAX6i`Sv!G_)GI{na32n8X+V>W>~uCu>wCT4KDXOE z&qt~6GY$O>l^PVQ8b#s3`q-l$z|CL@Zo)z%b-ZkO^(RxE)T#Kg!iYX&8oaxewzy40 zZ@0+?)7M0$_aiK6X#*Y1SJ<~ftA0+bnU&H6&^EoOI8$~}{2a`Ubt>~g!F%$=iagN! zag8hE#A6MsL5xh=guWI|hCm%_(2Scq`IWbyb)YJ;iuL&x=EtEU`mn`hY4qp92(zh4 z-`J-GlY252WoX)7LnVq_BD5}{)FUb+gkW#|o$1a7ZcG1EZ%B@-%uCCc#H#~FC1`0& z-~VBn78`BHbpk|%8}W$T&eg*iNa%s-OHyJ1LKyIhgmyO=W_(u!7?I!%e>XzjCL`QE zm#AjZIrFFMOS^%=G_(Ko7~&e^L!(xT)Wh7sh?&M2#1aEhZ=~e%nZETIwDM`fpCEZ2 z#|CRmO?jdO;tCt-(4X69x;Bzc1_iK{BcAd8uPt! zfsWEBS@_X|$ z9*weD?%nJ_-mbtg{%MrB;fhh(CfCSzlCGH_J06y=r~ zm>d=$TvIdQ=t-o9!HOKF?oAcrHUO}jiL^sQ|FfgC)oJfvUC4rnT;2_QHfi=;WZ5YS$H-0EXHH|*c zM$X&=zsc#o#cuM1pmK@%fF}kp{*>XuMYN+OrbVb5p9mshviMV&k%0--z1>oiFmmmP z(5%K24gWb~SCEubc|`+XK&H z1*Ydc1T)@+9tw5rz@zaUwEmpZ5aE?QIS~mqP=Gp0KZXlC@h<2Mxz@&>nwWIpi~lTz zG%{L=ArM9nxf+$~Ya3>R1FgfW=Ln?=m%x}IA5o6=qh%I!Jk(BjHxP&NHMZ`Gp(Dvc zWISi6AGh3R0X0Zz!h_RYkJnP|k^;=_b5_P%QS%AvdRbI^1G}~|?Xs98zs0PRPIAnM z2B)<(`2~9)ZwZf0HJ_&Gv?{Q09wwLs>Se1|p9-2=f=@ZR>k|B<)22tiLPAzyINwoI z8z}QZp9({W>;yhU2mqnK1;*I~?4F)m#w*Bd1=@=;LVNCxm|a3fJgn%B`QbmErwz8@ z83fAwJ;QoA?_;)|^8jcKsVteyarn4u2*5%F`D(l|b|STZenS zdk#;664Am+~(&fkn4c)bOl`# ztGB|zA4jSqnQ)^saHb}8Ss9~`PU0>A5|bV*DNYt!Wcn|zm0sna4*bDKd_C*n9yS;l zB4_T;SnOpN$#zRV|59Y02R^VZpcL7rMo9spO$#Y~4&iVQ>fy=HvA&n_PSoV3v=du! zi6S<%vbU`H+m%m@fC#I8K-$G$@2zk<>@}8EsD33L8w87Jfue*J*jQ~e+9(s`5xgS8 z6Kd-qzSx9TQ5qe#G>f)1AL11|=TbRE-oYva2Z2nkZ6_eK+hO%StdnlfbZK@*mbY)D zjO;8Az~O2sV7QX5q~`gQ4O0NAkGNMcT&>4wd%~d+<#xgaZ_%+QGtL|>a0VlX zewe%52Ro0tjyF)-18KrRZ`x zRQv+6yQhc?iSjk@E~yFaK{QWjI>u0m>Sh@ypyKewAkhs%+733V=Qn83+u+xBZ^KdT za(Eq3y({F|pLgo5g{)2X=fs_-!nHYj-vl~9D}1FpDwamk08t80;@xeLnd!s|+e{qL z17H{HTYrx~)2JR}0+!1f;aVWy@9Z5xp3-P6fu?1G%|0-Z+*H@zo%`5~z_L28iF|+n ztW0?VcHZwKwNxD4ZxGlmnkG#*BcTq76(O1nMsOMc7&V`x4(IU4tt{9Lim6*p4b z8=C~~6`weM)@E18?~wCeL1okDdKxaXn>z?`lPNBcE!a2EwMSY@6?~{dl@|PdpfoXp zptxl4!OZ%kOf4(dj`dtg@SG)`spiDho*~8o#qKt$wC?R?hV?X8Ld*vY?uHQ?=UicA zzC-hfbat3>6WbaPCh&ypSa>&n>0W_@nE>K<${qVU+ONwOZYb z)X)Pk;&Z5%DaufW(_lA(1LVaAmu%W5EeV;Q7N7WFky*bPk!`ksggVCut2hIjarC@} z4(V|A!P!GGay7aB{Bc&PF0Q<>(OT_Q)$@o!rLw@F3z}G{1FH?5lDPDvs_Zc+N~i|N z{=ul4W4?%A7pZej(@RVXb4HBYP5l+FRR=TFPSCKCX3?4Ds~w6c%2Q+?om1lgksCoh z_>afp@72hdDpiSqn5;mbU%vqP{F^qRZ!bgZUPqMM!E%aLuT|e;y=Qi*x zXIXx!F_==EX>&t;UwxlVM)lX%91f>XS*bZoLF>{1fN7Tl{I%Kb<{}b%y9LUF(FtNj znb8h@#xVu>dZ%o7JG+8Dgo{rSAVTVCo0sF|bUpxGFdG+O(724-m^5tV>rwB?x1d(} zs-pOp0i8$oj3}ZB+xk;b+j&)Z9f@VAVE*}ZHvB6fBZ6Vy?1>96zC!_ECVeQ2ug`8u zF{OKLO0|||g(%Oyv-o`A2pW4z?Za4uADN2cR{fX+9|6%0>?GYE;lW_!gq)Lw0V zVX3bfXKS88kL{rcER{{}2j5IQb&*tzq9N57JcJhp_=l0%-xuzaV4R89wU&a)ii2DY z_Ts!btgFdT+BE_hOCR5;A`uU!NMk801|(@$(=b~R&nma@rYYAT;D8AvD$A%mfQFB+ z1hF(h{6WWU-qN`CBBM4u4><=+e=-3FfQ|wa+oh2rPY9R$10kZ66KsR4Rb(CCt$_UJ z(7iMLA%jEhQfo)h7Qw~&{rVw1C$yp{39COm^&^&G>qMBqvqg9z=lZWxds<1WA?gF# z?U#QXyFg2W4I?;gW7a=bCXYfmU35ao3j^?+Nx9udI~!lKfoZ06rCE0BFBRrbcG+!9 zGm(X?C32k%_8fh|+B-Ovu=|A_V<-?BI+3T&zjqavZemBhgeXP*w=~}sKKe3h*R%L8 zl7B4~KwP^}EF(5}?MY!o(B}=B^gR!+#eH_+tZRV~Y@fQ$)3@Irse*98ev5)L4XSP} zG%sv#-)HvnwP)tAX%ZVR2^6-NRVaqUd}b~iVpHPeAx*9+&r*$$-s1q@ib4fPW6DRO zMiOhkH`d#7>9$_w48sxRC`7@xU276N2rWvKlpDJ1goiTt5r^Y&5K6$jmn{SbDpVS-alc%ElPpXp{L_~A7}I%6U-bRpzD7HEpfEAc8d z;ZXAfJ{8Om6l=os4shyp*k&u1dY(HZ&uj5Ah9v7HwsSD?XlU#dE6ZsUuJfwf(7AHf zJ=#2GEb`Otm-r@d3<>t=iDzz0or)Cb8IB%``Jo(>i_b$&EUFA%@b{|k#B#+bd&8wv ze88+Nm)+4RE!sF>IF_ zokpj{)8eb};36ku(eL{pLDcy5pT0M~<>Xp46r*J7#O|}K07?rI|;1JVtyM&r) zDxsnKo$eE#=Dq!Zb~#3+{{omC`v?5Twk!MRN^L&%2b!c#YFWYR z54vqZRhz-$mO-$AVdA*t(D+Q7MXF4<{P61H`+qs6tId4ev;B8;xu;mz`Y7vBgd>%zC>c78h8&$fBT8EoYxEs}`!;Y{w@U|uAN+0#I( zZT?aVcszx!5K2qz39TD`MIUje9C8%(=QO%6>E8J6k4$fOM8~?J zUxtVY#w4tBms|WY{j^{T!jLW@ujgPPdu4-=XNB}R6Q7hN#d^K^STC<=YqvOC^gNPe zk4HUQ%TpgaRDM4oa@$e{cV7cox0Q!H+_>I+Vo2x;;?e#pvbB%3KY25^>g1srB~p?VR853~vXBJPw#dKj z(^7x0eahbOSUF6Ff?`L%X>w0++J0nw`+ofck=>xFfuC2UUqQ|Ib3Q(X57`8%zofF9 zB8#z;8?D^2jr7jspk`^%vq^h=Sr=ri@GPSY`=9)IF#ePO$?cAWK7xU;srsWvZhw$; z+=|JKPg$|)p!Q@^tWvxb6oS*Jx@P$$P4mb29O0_O3gGuFRQaLe6&#vIiQr1s6P>@s zgt^n{TH6m%WIpM-7(g>A6o%z$A7Ok9}$YrG`@jNuzv|z$Y$}u6FfQp zv2-;f-i$|W2ALDjDp4mpNwSgTl%UJ*Fia;ZW&Mx=w3(K4`c-~$P8iH_pfewd9F8C| zf!-LV#&V3j#WPTWK)sTIz#rb}Lrqr)t6W3Z4kYwfSm1JCck3bb@(~B6dikRQgcA%px*&R4T#X=KJ;)#=0!cSP7Dz`AMF%i>_xx1%TY`vcy@q9n`Za z#B&K0^NqOJK)r2wmaYAms(AONpFSIqD(GHNOeUwCW3gjTWJaRK9iyhR<`un{OTQkd zMXvWA^cWhVQ;ZD}4Hl`BIyLR_fHS?RNMRTT+SNa%{C6i;crSPi-54A{Z0|uzv_`&x z-em6r60tSZZ2n7;F)nyBAPF+u2{!#hMnkMw?l0aC`dyT5>gYuqY|J3s>*HshS~@C* za>_1R2`kJ>q+-Av4)=svPlxloqNsRGeUW1Xi}9^bH%2^y4J7{X~Doq_ZhZ@c8?80x2`Rrn+@AUC5p;qFwI@S69tf@S`|ba%{B3nhc1=)VI z2O1N3#U$@ONjI96KKX~)GiI`xv*oH{ze)IXEx%kk2&qs(-E2Me2NNXC=pbgWJy%FP z;xrJcelDvQC5{x2XvVL>Ko?A!t6~o?NTC4^ed_Y6#K@h+Yajtg@wtUm=3==)*mV>@ z4@#(KLb~@atct`81U+D?FC+v==w^#22+|<;8M}Qv|C=g~v0s7JKOv2dv`~)o{0X!w zLJTiDSB&>Y#m&Od*2{FFZ*JO8&~BOqPE>I9{M!sn2g;zL&M=7PNyWAJKS$l-6qeUz z{|3oqLv5@OmkAp`%A;#uCqK=O$OCp>fM#lh$u1ylO#dCVLK71+VQ3Q% zLf$`mzW&@Qf>vdgr(N4f`oXmS~dU@F|x=-PHZeOACB5 z&d2ojM)zb3#)t@$-P>fl)WGoIQkMOks8z zd)Zjw=Pp|hw7va{@JD6Zw80K~dxcO5F^VBPhFd@MvkdGN@5N6ym7Q0a638tkGG9yX z3UTfyJV@cOuHc**>2v;~ zU}^iqa=T3}vT~^gxAdcC%-1Is5B1iK2V6UL2oA~;dMh|~hpCwZN1ktgY6RyKE_UZ2 zGy#Dyz`nk1Z{(g@DNmybT``pHSUbH8l|{l&qUeyay7|^QxQ|Hs8IV>A!Noe+43760 z_N@Kk?CZ+jy#*jII}*<=HXTY%Zk*6lz;pyMyKQU`2a>KFDv-^fCkBohQVE3D{xbEo zj?*SF&ih%Rt6jMyF8rjwxI7Mgg=u*R=idI)!VtZ*a2HbPq#&caYWU)5gHVW3zabZ> zTv`;3mmw}ajD>FXsfkz8Ow>>Jy59xjxIN8hZr6)0tm=nz98 zVitls<|CttQon@it&roCi}fcTR#1z$l!H(Ja&DQVp&ue z)rc}WtTB%7NryiOa&MsT-h24f8)i8-Q|z}V6Px;8G`nWizn7umdNIC4VW-6%yeu8&GY-_;nNSVf9b9iS9GSM+e}l{(MjrW{W^3;RU&?cVX{=70Mv-; zBWl`>P=pc*iAMR9<1P=VzA1Jh;P-HQIv?3Mz#KB`ea;HX39bQuT2LV^p zhJQ(^hz123g0{Z0;NVEPnk=KREJVdX|X@i+^id7=%U0VSi|v-35PPmGV^ z!CK6-t3yHS5-Rb*Q(NB*YHp-Is#oY$wGx(vvDtXqTHA_(LvVW(D)h`xNHm3;?3Rmz zh%;rF4mZFY`N1!9(EQj6arV;(Bst*Ge2Mc6?cr@2~ZuWWYzuXmGqCNT^oYD?&XC z$cjrG*46KR$DkdTk4}(dY6=D_{N&^l#;S7OU>nY@8|GBkoFlvv)nMgI-Gr4>#t^Xr z-)zoj+Mi3s2Y{94$q#@*6L*_DCfyabzDn#?4dJ|Vv1eSi$!C&12$cttYM4x7o1f$@ zJYjaoO;(pkXt|)Ylep@vhnF}l{V~>CKTmWi633asdj&S}p7Zu+KTJ{?lXf%kC7Lon%9e+Y1b~EE;YXo67astb^)iMQN-ZFC>er*Nf&Hg z>SJ@kJ1kOI0yeq!@gR2Cv!$n%V6U!wF7v0@ZDf9N307&448;SlA z4%?mR2wK~!XP{-EMpfou@Oneiu+2eI-D?1;#)dp=I7F-7JzUOUDlWZ^z@cVTH;Zr%aQ87Dhv};#vaw2?b*fyh)!Hc2^7+FLKxr~< zyYO;(o?lkH(nO{F%l0}RLeL~X&NEEg*(a4l-g)oSrZ*&d<0YmsE6gw(L%CS9lpVsA ze|*`PubN3GmLBpP@Ij8@bSB5Ku=70u(BeZo-D8GgMO5#8QiC}mey3N48>DlRmUnK2 z1&$}Z>-F34tA4wF%X;(P3Ip-6^8DZ-x839z*tylDmuYc({u|^u6mIvh8zD;LfEmh( zooXNiNdCRO(MR1coL(5@3}94rI)&oFB}U{&$K*V#W_`$uNH0oR#5d6mv{(^`o>Nxf zwo2#u#n`H>$i%V?U7&mpzO(-WsB6Tk7+Def$B|z1J&DbH`4a^N_$6Tg5G}`w+VT39 z%5?0pFeMe*jejp=^95{WZ`wSROk4?Vw+{0wk6A#s%4wloCp=oBi#djE!vm3NqT!To zne*N|dmSG(C_s|NQRDK6AhKFpavFHiFJ(ESTTm zdg_)FSuuWU)k)M9FSQS_5{)Nlx~iwwqm&sCs2;a&zNOUo?@PUIW3wFXuoVg5G@%d6 z&#{Xv?^BtX!fu`1eA;llVDR8o519UGrMZwI>ZWV%12gOr(qF77xH$ZFomC?c+#ysC zHPongWsS+Qql+9s-RTe&D}G zHUpe z>*}f-GkIGtc7vB_ddp^4FW&4AOahpBeUn`|ysLGP#W6cv_2;a-Vx9CCRkN{kf(ZNuw2bXR^)xHH4IK% zJTKRY7R<339{V2$yfOj%JtAjZf``b6(a%5ddT(Q^Tzi*4+oY7K*<7?#SP;lzI$u>@ zmlF`v%@;eoiLd1n7nEO>`1uDcVA7;VRtX?u!B{- zKIVd*Du`KJqE^a~k70FM(AwT^sEhJ+mwZKbLO@sI9Lm|GIVI3`hX!jF@A9@s+0Eq}!Q z9PxbC0GX%#6;gYn-ntPK;c@_1wyyu0hUm^yGu!3I8$O_NIY({ZuCbe6w)CP zeo=lZIHW4j&NEy~c(VQ;5p*O3SyHo^0UEj|{_b*?Vh$XZ437@*UnI~4-JBV=O4QK z95IaP&3p+!^xJh`QbzhoN@o3Icz+{PVDjPpF88h_(8ukeh6(O ze4K>hOP<`n#t?II?i0BpR9xzRMOtY{f++YxEi<3OHtrttTJOI#c4bZC!=ee3C(2S@ zqCh$smb`L<7c_(Ne__~MGOw0=VBmq^>PJ9L??OL)FUZIZMwUj>AvHTak$ct2{6^#h zfK0Xb-rr#@D6=KI1nd(L!xebd6~pPkn7n@>aB7ac?$9-+((RZm&jO%=eg>$((XB~R zsf(JHy#+z^+*7-LC>NLE{P;PJ7%uLMxCP@fUe8l$BK0a&5k~MDAFt7jU}G{Od-TGH zlh+-FOBUxqkkvmyvRrJ~F3CIwwrZYm+-tRmEt1(RZ|TvSm}KHA_R~Ocu|7eom;EhW z9C)fRec%*9FqL14{j3P|1e?l&;E*ik4?D1|i>@+wI3eX~Pd-)2`DgH#u@Zslo{}OB zg4UC^ZV{Wh$OYz&99SL)G$E^7SLNO@n%S8{>3|ie4bvRMbTudI7=MErACFVF)CbCQ zES?4%2)%rQ6R5SrYF2y}YX(OHYWp-F+Gy7GT$y5uVIep;ZXk!dz`W8rkGH39s3Vh~ z-XHojB~?v1uH>W6Vqg|%F5APPe+rCG=ngY1$w6X?hQ7?Al}2Q?q;f|v8l&0sc`(+r zQkT*j-D)Zi3h3#_#ZSY>wC{nSs@-TU{!}C;V(Fm%k^JSK{#wb3KR3g>f+nr@&c&pW zX*~^1>i3N|77)~}RF74(xx4(E*Xn9h`C!0!#_y8jE`MH!aI_G9x^;e7068}EqI>jn zTX_|91n>`)x&TNoR{+9W^_2K9gAe@040^J2cMeY4wSo!YkXY*8Aymz9tLY~_KG@;O z@ma*!VFJdJCk6B*jRw0JpP-=!=Y3`R+O$&F&msk+p#w>gkA;2*^d!|hswHc9LB<5i ztP5&^okL+5C`B~XrxuW^dXG~RAxiS`(%e@FJp8e$fmrP6%~N1SW>dH;a6K@xANC#F zBi!UWzIC-3Cp-+CSa+|BKPB{`lj#f#($>&v^xO=CXDx^vXeivf>J-oDDOPQLd#m*U zLG-=_u#Z|3!jvo~w8EdZKN>D_6Kyk^!t8p%7^h2l%A@126Iv=dTl^kYH1u&yhu2;I z)cHLRb*Zx09<~$73>g0y?>(DWXu?5!aLiSvaV_gpuwsuAoW>%>n%rBq<}90!68lp{ zt;zQbnqCo&Nx}s<6@Lh2S`pM!tHTS|c%OVc@F`qq)b#j7d8Fg3-@^yGYFLA`&Fl`m*&B7EC~mt<}mv@5Q1O0rcUka|*s zQ`)<@)l9Z{`0d|sdL66^ZdrCb=vPBI{KqCEKSP~ME^JHb!?u=zr_4mVv$9E|{OS{tv{`@fCZmoQZ6%_nI%}3f#Zi zxMzt*FIX>F*~kFNwMNE)4y<4P*G28s>$*`9^d>8h`q2>O0E%W60qeq&ER1$Almz8H zzR}BQg|rd8clkPDURlA~Z~`-AM1xC?yv$b@!r87E(MPKNe@DMO^WvfskJP@so!Ae1 zLs}cY(gxLwM$E91HhP*p(-Dd!hBByU%}D$~e&EpPAYdNv*P|xKHEalKf3YhqxeZu^ zyK8U>cTF_%(5LEw?Nh2SWIlg}ym<$aJ0m_z?uS2df@u{#3ri%an^I`Y!Y<^Xd!bB7 zzph;+$wbahV?nCSg%0Hb9P=$nnNc5!+?V?T-HmZr^kRrCDl#Y`3P;e9)`pEKOX5@l zszCQ1!oh5>XJibo7|Xud0g_-!t^fhq14HX6#>M)39|72c@XmK~H5 zc3W)ecI&C5z$rs%@JIB-Tz<)F-iAu^o*XqcZH^3_Ox%G7+$+lZAJ6JQ*|0u&6Ysq~QIn(&33!dh(M0Mp52 z6M#CgWg|dTcI}JpUJVJTw83@-5ec4fl3F2eB6sW7u(XkmXM*l+OW&S90#EcCz2jpu ze@BdoPevCi(l)rxqeY-t?=tr{o{zr%VSz!C5UmR40w#wsdwkAs7i#7h(IjQ*^-tg7 zMJC{`sru9ElAu8!%Cvrk;{*?&aV0|vz^l??ef&yM0OBy)BxJtLA=!nUs#W?PfAK=a zQ1rFYiHHXsKR!!Cgc!o$8N?K6Shvn{oSi)>e!{H(761rOif8K~u&k#a*c{G9N`_oe z+}!u4v$P0^b%P+?-Bvx+z)0v!oL2O4Xh{C*nIf39>TyS2=I8Th*a4Fo0|dAVKypND zs>bUHn#s|7-9?Oc>VCc z<{06PUR=k-#!xL{nyvL5S4aP=EuI=r9)iB+gn}7bp8<1t;32LAQD}aJjYUy?v{Y? zQ@*|+*V(dY6-c4-hA0jW+k4Y8ptdJHo0#?!p79Y<5Yrbhup`#Ulmg4>5e-$XQ_ZC} zrh+MIVfeO66lCP2nI{tEk(du*MYeI?`hcEp=;pJB6@|1CYGf!^BXP~BWM3a976t#_ zcV7CKj*v)k^pnxR=4lcGAlz(^afK{kCb5MKR8WuQe2p)BDT*ivF>34G+8 z(%weYm^ml7$An)^dlM&mtdzT$U{3aOhz} zX%0E~sBpamU(G_~l;^UeYm9+9w|#NI@?;{L41;QT1fR0Lpi~)0DDycbxj?>DzWY>q zROxfj`9p7c|MFPalB9Nt$O3-0T*G9I2V`75E2Tc%W0(Y}|5JoBpPET@zb}j(XJ|97jH3G@dI*jK_4%n9?*mF~p{1>xi^PI|u+!MPTAT(Z}q3wveZ0U-fRZz-Fa7yx4jlkaKr|A})R(K&Q1XcWC=C%$O}NZOWjoVc5xo|H<+HDPF| zneF0o%@3`XJ-&7?g=7In*_5%}lJ0YG=i+=nFY%*RJoK1r=vXI;`jX&K= zygQyLD$+M&{thQWZn7*@{)t1iQ^T4M@Oz%ktnjuD#@8aA6Kk%%TGXKE-9~8_o7h*G z`GNODF`C;@CDryA#9DZ7?P$nE9-30u}EHAOu;z(B(#}C)5 zTpNX9$5LPc*PHsDvA(S2zlxx7E0V+AYFc1EsPQ}m zO-zn7BURH#i4MFQX4Q>!RDvG08dyxBOoHQen4jyZ^!)yM*r4*h zx9Z29Jz?yL&uVd(FBTERdYbk5JnO@0l`)Yh1_k)gALvK87iAg`$qC|UK+3^w* z(JLPciRwt1fG)}5WBS~@7CFCStfIc3v>+Y+ZktaMleCK1jHllXk#cRO6khQiRv{Mn zLv?&Lz_pb@QCML~_NUJX@?H%tpV;rUd+XUet*dt!NODmhR3|YX!|D!JYwK#eaN8a> zQDJG$2K;*}`XZ1}>-txyCUQ*X>P0v`(d<&&T3#)b=HN8@=cye7!h3*{OnHH53$y=6 z6K4oy#-eBmz^E+k=z9h5(?hec>fvUEZIWe$wx03;3XRw?liA;5y*n*-fbw`^>n^2? zV^2kxQ>#%7jp8aAZ`pgvNe!ExNlB)r(St9z0i|yYZntn;ECCJQO@Ij*PHPy~6CHfx z40dtj;N)P;GVJ`W=iVWgam1b4ER$1_`Q$4)#r;%~zcwpf=;FfsK0k-Y51*~m|K<*& zryHe$D~fUiQD$}BaJi;wsHlPU1#)6lXOx$p6!fNRw*8-9^)ez#wWe{mo2P#HWs7Dc zz^f$_`Ea+sg%6X@gA?*Nd7_nto48NFAkL#%ip%ZPLDu-7ix1CQiAxOpvX>D?_$oB` z&6?3Ng-ZQ>Dko-uZXeE%V=$?TE%2s2Y!5{R0zpIaScS->;W&C5D`50)`D}|~Pqj%Y z6g?-bkPvAJKbP-t;P z^rA7b|HT@>yE=~5F_;hTJg=SxMfgt614!-FmH-Mf74UCjkAM|R^?SI+i4Tcjo+&P{ z)?#Q+aJ8=kTbNW}a)<1_eoeR$DaIMf2n^y33Hd>znG#wpfy2Twb7M+`a(Ix^bgTfq z&5E$Jzn6AYOzCVE?IrhYi>Lu0;@vfaE0mmk3L}_bv zJ+Hw4S2}nlp`DD}n1#-~dmenCZj#(7_5s?3eY9d=(+<)|#E&S})D)vJk1_$i=!%9q zd~lK=mRNkHiIWN5pdOaY z1&Cc9ZX>4Tb7q>jnx+<`ybB&%{%BAHobsG>0QFmpw6aj$tI@Ysr3sZ)V=!c%wjzIM zRTR1rMYAAm+Vd;uG4g$jv&J-l+~MJE*4KCV;Gkk(H_hljstIc{tW$}$BD%IF91Yb{ z>|sgfi%CZ`GJ-anWn7foR(mE+;ce66un=da7wHVjMe77%aZi-(t2^kZa=(*h5Q*D< zXuuF`{?8J{Iyk~B(~=9@yn)*~GG5 zj6I3x!(^a#wMlpprEX0A_*Ylmo&%rhC*R@?fJ<() z!1DEC+2i8keTkXvBc@*}f;l-^$4Ut~cN<5L7HGenGeCmdga67L&#N}8b*QSRt9a;Y z|1PDKY>ug3U{I~+YJuGF@8Vt}N3m^5qgsImcA>S7pbsZ{Up1K+db@rmWXI7flTSr- zG$PkV3Nu^3oYXYMuiHTEmOup4oIGbW*oBwOJFh2w52akvwP%ljUL~SL4$|T#(DbT9 z>CFL^UV*EPTo1k~tO&F4^g|jn;2;-!yB%pT0clVe-xs}qv=VLAaIm3;(o@>dRujM> ztY+d$(168iJ3~O_*^Tn$bilYLkGH2CFq*0t%GR{%SU?J}*s(UzaAnXhjzFnsI=SI- zkreZQk=O|N*W9dW{}e6eYa`CMf-!JsJ`deA@v;AFJ|jLy%WqOAmvmD!Tb=ixyCxbh zgA?I)bWjUo1b`FTEB#QOX5(QiLI=#F3^x;|T#xiQ8lcK9+y5;FId~h;HneM@5Y82f zf*UK>S(ujpa;H5^(NbI|KmBvnynNYErLgAEry;#HmI&DAtgXOdt(CYj4eD%g)gL`B z(7?kz=?=$jQBeO9RW5} zdjUtcFd^z%uOb-3hZ?=B@M{1 zEh+6hIs$Sp2blmrwbeyH1c9an93|Q(oa|+m!P!FK+U5VkoX3gG>+SU8w0-ke;Qhom zc3j=G0H%6dcG2p{_-Y4kbLHOIdNXv<3o{7cLNLM(1M@T5$=|*uy(7cs`5q#i&U$&s zJWJaRr6{ef>AyOYZh%!rase=#a6PE^0{9g9Q+YTt;DW5ry%}q$3W^XsI{S$}Q4JB; zj{q^8z2m1sEglfQ(<+%BdamO-1+yjW_%u=N2ZMpIyFRYN`ZX9ZW+|~gV`k1R2->nb zcrx_#8+x!JaALWrtyx}f1S_x@RKEm3#{Yx7JkmW^_P28$yBPnQvUNJa1V#R$;cytA zyWfcpDG*?vilHDf_OX(b>>Bk0_EoT2ja*{j$|X^H?Jul|JDTMS?Rr&Y9w+&e(5k#( zFy&`w-2LjlY@cIz$KdpoXkiVW%Qmf>O5K3^f|^L71W|-Os1&npJc#<_3P%kfn60Xxd0A6Eg2ETqaM~2FG)oB6znS-Q@|e!#1>~0Gu=QI&vpyBsF6k3<;4Nho^B@8L}FBq=w><8|F&71}cO?}zvdP&EgSGbYs+nxdz>Zx64K@GKv&kaQ zI*?kDUY2{gB}2nM6alhaCWr(ZTz6w+>|`1o>1*d?3r$f_(UtyQAuWHI!k1vtzisKQ z7uLkTT`elG(7h(jS0q_OPmuAR7}A0HTVf~&L1Du0h@L`E55f6q_-Gs_h6$snC+Sy9 z^DjRR;w0^cyRXHDX6Zk`>EZAe)sRWm?96(u`wrqLYxu~e6z#}P@5 z&OM*>+3vm=A09Cv@qqQ^|ny&4_xe zd%=y)3pp1Y@)R5jj}@%rH7JkYlV5U!#pPHK-)ce5(gG48$3 zl7=Z+u&{)trcL>doMZhR4hcki$|Q1pXn7|4-t&QH`d3@a2-*cVMUmqPaj-?A^q1GS zDuk@i;kK`@X%~u0Lp)E+$-~|_2x8{~p6~H5i*)^D>mW*Cve`j8Mc!enNtw1K+KdELO0nLPoB4i~XRHPSl|MEDGLoG4j-Ply+0_K#+c!ybxl$eTAO|Ikqoh z!>QFf&uJ-$P}4M!$t_k`{4AzyHo{60=KGu9NjE-4X@R$gZt5=x8TahnOTn_!_kMSG zKh!gZWlVs;V0{EgQ6ix5uAawO$8`lftQGojVE6ZaCEk#PF~$U<*UL=l>W+87T&rq_ ztv0AZ#vN1?hj-G|QaLPE!&tFdDI07fa%Skb7fM2C9BQPRRQc~N@z+hPhk64%{{vBxnz5DQptf|U))H{%u7^qs%;|Z^H z;GE;qGB}M20_U=!zT1*PG+nv-`g5e`9`|Nu07Ie1{C~YgI%1dQd5H+p{}=vp5~gHC zAjY08v(r0ICQAmi4p!GJq-H;g?Bg7y$EMRbQ6bbRn|y(=_KQB1MKot zZUH<1*{d4BWi3@0?*8h!$Zq_4Sz-VenuaPmNJ8DTU9c7dW6Jt$UzUT%b}BRm@K2?| z_rfygcS%nDgya<6)%d5zV&;@&ZBa_3K?2P~Df>Q@`9BFWWmfoEYLQ)YLM89B zxoR)O^WR{tm%7!kAKc`ie`27}uEyF(G5AfrG~m9b7! zeh|YUTR94PoAA$ci*~>X(X2%01Imb)AQ3^F@3%o6RGNQ?C8WyNx1WnxUSS8p0VJ=* zwQ8Paw{TKOTTbdk0I2TlaW-)K`=Kh+6;pFa2C`FTVtId?nm(lWv zFP@f9Dwdg05Co>$C2*9R+(!Cux_g@GRCA4e(KfKM zvk-7$Z4kR_)khzY%feX%2_GT=)e(o4EI_=*wJ_6qkO)gB&eapj!CdS^3(=&$gB^0| zA}3E!F&!6DxG&q-d&yH9##N(F-X_ot`%f4k&`bdKbVHm`PUkH>37yhr>_5=rQ#T5% z;0O)Qqy<5cwrc-i=iM(3s`p2cup56dgf_pQKm0)f`0$x%In*lg9&h;C2R!5)7Y+~Zs5yNj=e?-!&%u`5=5UH&+Znl0(INRq-zVh* z9;wx7+L?n%fM@WHH1=%6NxA^VZ)lXbqXx?3mM~%&vttqO3*U0I+Ub(;D^6uUF2j#@ zA%(D?6HRnMEMK@*=HegGcx{6x(i$M_PeLO|UDG;|C2#?<;y}^8ia8+7hTlt~j!Yyr zgQm^tLq6(Q6X}-0C$dl(>7TU}B@sOE0|QqbrXFqzFZse(x;S^ctdDtgWoSqiI<-2$ z^=$rd)1ea4alwVe^(IveeE6){qdJ(@$x8z_7|SY9s_)Of4c;c@GaJ z(nJOAO@igRg?z(vfSQerbYV|OS0JvdwW`Zax*4_NqF~Y?FaLPUX-aRw^uj3bUN(Z9 zcKpf{H@YrR!ltsuN<{V~;E&)6%`xp--NScPMmEE(3OYf#h>cgTJF8xSUJ)bUXj<7H zkbn!UwJD@}2|$8#Nyaac2R{0a2A_}x0*_W<)RC$nZL74Yk-)J*uzb+k`N67%QVfRm z7n(MA#`O~0L&?4?5Q|FE)kN!tnHvXYW4dSA*rsInWs{^V9tOjfGfzq;N#BhJJ=o94 z_*o+96(O5rtprnUD>4IqY=;XeV1hXYx!>ShS-FnO(y=nJ08AX?q#C@L;U9AErK&Bs zX5ysD0MBxQN(dOK;i;e9butUu$u(*~X&1vC(gI)r%M z!{xg`SXmIq6L70~H%KXlNi(NKL5sYzx$Vrm(CKb7EW7NazoBL^!(ikzb`r+BMC$tLq zzDBn_{x}Mz+|%!@!?C86h8nE6(4!WQ-CL3-m|{9piYLB=_ zHkd#Fx~%&XuQzr-trLYQa+ErEm^BzQf8_5QF)pA%>B0k`Wy~6lQLRrk|9G(0JM9emXXO4kI)x@H%4h z*I=NE%~jno6x$*|f(PGgC_TBI4Y4YqJN+P@Z>zPLLXl|dRi2N~Rmj|>%RFQO;i;Yx zt{?k&t#8f1zF1$2-O5HJ(0RjxWdb1rmPy4)2ONUR3ga# z&*>hqGvELcG?XJ~Jsgh+6;?zuVYmrY2x!}C$UEO3Q_H|l+s6o4;%LdQky#-0lS`g&tsqBy6BW`USNV!ZYRzk>8F(ibICqljJ1z^Gsg zSEHl{%|EW0PnQltta&#%PMV^e%8oz-Hz2#^Yio{&YSNwzI~(}QB|O?jB815I1m8=K zfwk4QiEX>?3&&Dj{%9ORw^`@BLlR-BQ|uynt~t7mg)AI96_)AZdj#8wtr-W*CeBds z^i7V?@T@o_tROq|9BQsfem5m<=UdHO&Y`YBocrrXCyd`@Tl^;LyfBcVdyqGjr#(l= zj@_p7vklS?m?mK(WhD-6FjuC;F8|`TD|?D5c_SGPg7p=5_zfP{ss_`vFVnEe2Gj@hvc5B=_6RVC%8#c z!X-(m!@BAlS%sGc_UeaMMq_WQNq?G8hl~t3X6D2NZ(D@rEM*w zUeh@|rV61ZozHk)OfRlqMYRXFJYRsh*jEufG(3 z`vCL$1~iJCW29xT#M_=EsFRDu?x(z#afw~dobT*bnXvnNe`hZHr9APa@m`1zdm2q} z=$;?mdq94lO{#(s2EB@UyTLzkLlDpn!~m84yATCJzd|yTg}=Z(ln6=J;WOWxHy%K zh4dq}bQ8a!%#q0e6u$CM1o>IV#Qd%*{4;g+%1hl>D+ciG4qAfxO~1_c?}Lu#zju*W z8Q~S-82t)?^eU6N#-`?|UD!zo9;wpBRN(s6t7DOJJqbkMQlvNOh-fpBcwg^3)8xBW0_O+!KpY3URXHY~-KsdHI2}=lGBvHOYBAezV|bfP zfbdshH3MtM7yq%f(RW}EHgSQW*|)zjGi(P3E!Ys&+ZYaV&4XX-2)>_yjAuILTy~hw zsWmq;@;!#8?h)GaH0;H})>W_RC#($Fm>;ALw!CMcufxKref+hsTQ_f)ID-x4O?a8^>?Bk`JNAGXQx$_bX zo!X&Hp?{c-%++V0q%^qNSl_$chk>xKyGHMq5~-#lw%QG(hJW`OTp_{XC&J-fa{mK> z(>PbECMB;MfF12UL4nvK@wgKg&h+PVK{#u2>%{RklDBQyo$mSO;knf zA!&{j*xNbMGF0G^fM`c0xs?F192?#M%M!`|UtiLLkIRjdat~e>Q@KwqGF{(Kt*Jxq z)z-+oyENHOCfDut`WSe}+H3Lm$#mk^V2Q9HhZ6svTm*m*M*;M;YMorbf_F0unE?JK zEV@t#1hwStW&_IAz9F_lCg18G3!AdBwi zp^@C&9Jb@Bs;b8Qe&h*nP&&^kL@tXkKb}3KNnt+Hyv)|GwF2W_ls3Dar|4Ol?J*i1 zSmAgp)L?G$ZGXF22*0l22ED2-Bzjv#@MJf1&-HxOxeJ5{m&=#H>U zyj@`i{iQ*`72Hw}nV+<%HrO$sD{Cz;e}(Rl1IQ2*PS}g(ANK9i{u5P^A@GAXhrqF) z;a*U;cql>Jq*<|dLp%;9^mH18p;P^9B&R0NtwXo+Hk#w!z*2(P1g8_Bk3WYul&u^( z6>QNPpAIxeu6i-id&FE`BbKPY4yq;fgHSoTddzB-=3C%Knsborbyf{mc$^;1R-lVR zM^D^m2~{@eF$Q;ZkDGLC1hbX(6}Hk;|K6@mt_raXh|d_F@)!nl`v73Lau4OU^6Vrm z!-3k=IK;c1#sR@8)#sI&UCff!O*|{0L9Eiuqb#gvMNtTUG&Jlq z>u6SJ7ElI0bc1h>orK2~7`iuJ3ft>s**7hCCF5Iqy>@xtnBHPVHwJuIKC0}rB~$fV z*PE3t$MfACH%kFa_RZRpM|m}}rjW*or~{m3En3JU?ThXXgAs>H@Vf-kF&M@;v3lV5 zd(*jkEWiAN__GZ04&L=?vY`aX47(6v)^gXC89(wugkdSEAb+~b9N!t<|hLd=N(1zUVoIaGP%k@-f1c#`f{8J%cJJL;JY$3ud92K7n%9j`-l^CTbtGl%u_D})Hj^BO{mQ64KEnQO@dIJV2Ok)d zay<8>8R$2=f~%Ky7p0?1RBEh%tZr2~2@(8Ms=Fnf^U0*7jAxY`BruI9R^Fl1j!=Km zlR2$95RGg=o9Vcve>*FgojWjlAgkN%cn;CF-^=L~nz5eXei*9XLy^+QZm1fU+S z+SIe8t)krX*R;}V%kKY2d(=}+MGx`~B z6H=i%$g#C5)WOm%8jl~>1+tSK)#yFtNv4c``B#`Wq|9QYDzv_V|Ig=73;1Chchq=w zOTid>JVI}MWFK;6uW1NY%y&EP$N+w4hi z1VsDt{b|zZD&E$j@sFS98BT>b#Rcs=%K%|Op1+HHczm4p-67K3UntduPP&+yA@G3h zY0|;-O-x{_GxTjmfrh7+o7deQ^WbM};q7i$13lLQvXf6Ry5vKG{gr(o`&Og)lIqak zm}@g1`JU*>9nAZcu^(QVK88GR`Z<>|DVW)bl;gkBuISPXm#wZm9#Ja)nCt~((afg> zpX22E5<`jjN;+nO&wdJ-8bR-}?JD!JJ-WmLevFZ^m$n;Sk3%|tf+g$kPqL7))A)tm z51zKy)ric7rUk=?qq0N6+E|j6ZMYr@NKFVRwFN8!#@fLc!&FK~iu~e-1c?Wj6YZAF zz9g^iy8FgGf=41Cbs_E?Fis(IBRyMu*ozHoI`P>%8}!;r_m4OZp5y*b#d;Kxkh+bW z=ts`ID}8A1tcWtlllLtpdov^N{F zXR#$~gdbL25_$*hy}9 zbvIQ(z8YakVyB@0uGd7mkIR6+r)u=-8^PTlwCP4~nmxDK-i&Y3N}i#N*)}08dens; zPkw`!+UBIJZ|L3R#w26S409KTq=w)l+^V9A>VW_K&2$`ep=G0n-*qF5f5SZ+K%I9e z&qCFx4IP7~JLe*3m1bN9x{DZ

L1+(+WAHjhWcBe9e5A~U7oR%>jGC|2xiDZ`9HYh6C(!{!w-gd_G>rxwBt5fV@C7r86K z)+oV8SsZX#(k|>FT;qR&nI@PH2U_zOHYHD$XAxN8KZ`{=OPgz)5t$QzpNOq zhY_*X<;C2`x6WKlS5gJt)9@Bh?tswg#1gof%f5b%SBry^nj|S5-R5ulHCZ3dMec{P zJ?b?Y{{iaS(7@L8*IC?w?=Q38G7=$*tTBt-Q34Ud{+-yd^SD+G8HHWvGGTy}Oc)KQ zxY(0CH1Hje_x{{+&#bN_Pf%Go%?^kEVyq_O2`D#AYtjGtTc@@uGPw zHc{lOre(&goEhZy=kFT+nz#yP#1BtzdLp!Yf~jv@ghW&3L53B<77*3G|Nn9ETL1!5 zKS1N~@$aupgXxYfO$z}3eIj{9;AwhFxwZ~`bvU;`^%N>yp5 zU!gy3)1yZ(Xd&>uAcQlLCqDdYUKNr=OdDbma}0;!^b+HEdqdc_E>wcMEYuve_IJ%v zDelJ-(tT5Oj#e7XkG4wie?>|BId=@*VvhuxX{gX;I-Q34hSpi`fY%K2XXOY17DJS`M4nV%nFQ@C@lHM^Ke+Zd9`! zUiG2Vg|?!L*J26X%+1zDrC&dv`O+YIaAYV=Gu5UbU`^ipK$u|q1!JSGGkThnwQ{YY3BEvEQgrwRALAI)`07b#_P#9uI?==M`v z&}$j^!*|#a*A3-%{)CiOMLi>L)d94Z+Kzd;lJheJU=VB_GdtFyy94I;Y7I#VY@{VA z#`P9czpWo*EgeKnCXCPmnis@{^nOJyVm?=vj0-s?c?6HMfrYj#s4eA2t%%F;$k#LQ zT*Xz!a(+SH*~C+Gm)u^0&Z4%*o>>%l$95kRjvCvM|K->V@kIYVIDJmmmk$*1>m<6 zswC?@I3&lboc_QR%V!`b0>GP%cK0lGlnkTVXPhyjB7u_%#Ihin$Bd+5Pso!z;XH{s zO>5(5nkc-q$Fn$AvcMwq%bSsmtE)esZci|u*G4mn7InCdWw=CUNBW0}NEq?DXlF@e zG9&6&=Xr{Pd_OjC)tdY8;6ic@QCvt-S8+Pb1{vaIdeokp4_x>L;v%K{6H_V`&9xF- zNG?m#Tp?M))|=MJ<53*cQ(hI+XVid5Yu~dX!f|1)3h+ue1Nq~zvWXfSel(A=^Dv`4 zc)WcT9m)iH3BYzKZcMgw0xkHvu^0>+KTiPNKWyGTvZL=EXexB@jp z=;&S|VNlYM7kCv@T%DOxbVz+he?WZK(k75*^5pWOI4aUqc!t`A0eBb+xc8{eF4*UD zVGEf#m`;<{LD|zo%()1t*V{e3wlPP8k5!M)yI9NeqC#qa^qvYed7^5NRF4NVJEbk) zm-T#kc~ZHs*@#Wx`t^yKuV~YrdV1^aKt?jPO5kmUl%Ss1ug3~&n7xBo=SC+cf-*q} z67xyh8eyfcTV*PbAg`R0M4{%;b?44->!ShHyVP-VSyZ91vXMu9J6M95NP+XkW}jpl z_wkD+tMQ@e5Ngd3mC08E&96v3r4)1~N!?6XOZ_99NQo4k8s?)oqbZ(50hN)P_2ymg zWZ=Q8g9B!Xmr(w#*_jw0Dd_O7$_zUty{MKWpw=Sam|8F2^INdRI`y>`0yRp$FH5?i zHMS={3+?G62+h2EGkRGvm z4;>RDqIX1Sb-2w~B7t>*C82)X6ryITF1(WrU_Hh(JcKr}98=x8iu?FH7RhjA^bj<& zlysHnA-LU<&}+W~I%yqMsl-A&Yt0x7XUj7bpmc*3G5$OC6*#9%lT(Vk-QL3`K^ay8 zn%j?nqxAryU<;GDBYUtR!X*#r811jqFrTc~p?PrUVG4HB6TJV2pykBh^NRt=6^;vUk_%dx0TBQG4Kd%C4mHAHLy+S%{%}M#2sQ%NVYHnguE4-^{ zCo`QG&t9-+yiu_mt3QXz%nF` zqXfxEV}Nwst}!_oK5VX}&ybm4b7p{T#`~qmFOuH%h^$&nhHHerN0SZl*4@wUq=i@I z+bpqx17aH%El}Q+kOb$dX51tr2Qbh?iTjSb-pa}Y!GZuxgB>0`7KB|fZwInn)sPHg zEhA@f_9{Z>L`7B2l8WUJ!`T|V{`_S_3>c@qTQhXDmb+D#=goBOrC4dzCkt59C0BDw z;Qcs<3)S;8^E;lc&xJ+%0$Pjy=)R1mC_~RiE>{43os)bt9qc%`xx|`NCYk@ubW*2i zouaX=78xG2@n<5sCFQx!wQ>j^Vz=dT4u+wo$lynAPtxq_N2qB={Noik;KbC_V_8mF z-2DV&JKJpPrggVVi=26GYhcCoX8Kk}g*AS+L)yV{h#MOv$zOo|hPYqzN|2dfb7p{T z#{AXCFOp96h^8a(h9ycSU=YS>^|dqR>RPcLmHLtoGzbY5dVJmkicw4R24J2 z==4~ru#?AhL~X~zON^lx2HrIOb*TujuvtC5!gv;_nv{(8=B#`tFF)Q|>%2lS+rmTQa=2_2G{{+7ra2qbUaX6t(hJ zaJKJ{s<>;mBeFw|z|c>V+i`|(5Qxu+{>bU{*wE?*6}c4jbov#o9XaWLJa=*>wLTkn zehW2!*2Pb9=%(tQ``lAxscJyPnMWqZU%6d8+VNgYJcR(11VquTD!0Z0<)-r&4og?4 z$L|p<@SJF4E{{k<=4?Om?FEF(dSW}}M(b=bR$!4dD0qFOSkq6b$Q4P)Omp>2?741; z&>?f<8R3*-h&S72uNyr%oQa{>AS|i(RBVGBRGyQ_CI1{BPo9DMz)%0LDl2k-K|?P1 zxF73EaMSqhbe8^l^qLaz%jf5+p>Ki2lF$zx z`2TH0jS#JCN06aMm2rBwOJ@ygTtjuI>2K%z*#O8HyZm>|My;QYV_W^Pqx}~f6@}Ug z-bbPEh+{2dOX~9g%mo!lH!as16#lFYgU8dkwtQHz|9yf+J_5ZEo*TYSJ!lp@*TG1b zS@!>IY#Um4F=Ffi-{)U2Hrlcrs7JVi{Y`Az1Nyex5*l4IR}dTQ7@$0$u?si3RC^c-T*^1D3X(<0ESrM~l$RR=pP6}Nwj z#Mc=;A{HN0K?c|-$fXum9S>Yikuy{`MYK;V8)n4$S@r1fdO z4gyx{QJJB?uh=n69=}A(X@eD3@|+CsAUJ7{ELZ63@3TaUji=Y_r3$CZdG! zz$Fw*cuOOWp2yb9I_~i8(L(fhH5%Iefh9J;!L>kk92a`atHl6CEo&)8(w--MbT85zMqUxMTfbQP-&#rF9*oWX) zUU^j&gLT2&L9;N~CKpR$1?`;4hjA;O+_~&zL!L4>cU~So&)OeY$XO*D2aPf7s&i3~ z_zqE|HZS^v^h6RF^77ueP=eRUKR+BvkliYo6+p9YYlp#OcOz~9TL;9I#jFDR((uoS zJ>6-T_&=te)?V9`LqOPjKhXyRyB4olmWSGWWP3LUod_{kNn?dZKZXNdA2pAXFXBV& zB_G4cJ{SiscDXlL@_~jGU~YGH5(h8`O1XN1xyYK^Y!P>MVx=sGp8Di~l@3U%}YRyvNbKrYyY2AGW(;E@HvSyc9Kl1=wd;56K4 z1raN?kSn?0r>c6T=HvhkfYwX^1U+Y*;6oow7Oa8ksY_&t9ZoZF#>j^6>nH$F-tj$U-)4p$4)37mI(#`37}olbu^)^e1fD zMizb5k^|zIpj9Md88Mf9 zzmFt?=tY7Nx9afTP%$R>T`)n=19qd&J1?rQG|EGY7F;OvRqP-WIPXNJ)Vk(*oT1R- z-E(Ixt@>N2x)$*j-m#Cf;(EbgWe)s&TvwH%xC)h4FALaD3g@GJQ=o@ZUnw=#dU@}F z>G{CoUNM(^zmFt?=tY7Ny6W)Rm<|tAv4~?YJyq>N4jfoImi?58u4hXl9KMmUEBtxs z20-!(>9Ek>&D947KA~R!Tt~HEA96&7A|2b%7?5&u0otm%flcZ{uR;2!o{ zPsy#(^OWeyTyP3xCEU26bf+mvb!b95G+D8_nyn5}1BKl>4A6~8@&4|l1Hcjw>1iBM_`gLGs|hff5J~X>pay~7 z^?AZsekk~@s6+Taqaw-QDfIw)YO%KDSqdO(d<4MFmQQE=D6y{;Hoac!guHK^f4wwI zyjpoXlZM85hh!N0IxQV1$u-)?0MxKw5wNw6siJm(y{jg6Oj(-P%9}1%yD|nI`?6|4 zoFgeNPMM}Nflf6@pajc4d#-RbGO9%V7f-vKP7+KD1;WT}5aztL4@=~>@~FvPW4;q46Wb6T-Sr9Xt+ z`}+|fawgzSrQWP$r)l#RZJ{z>j+9)@i=os%_xIJwM+1iN`n@Vx1s)wmZf#sY@$BqB2W`#c>O@MU1ku}>j?WjbW*kOE=+xetKSvF>K_j9V55 z#dHC>l%}l%I)?9ho@-gjlB1X3P=UGVF$#(C(5l%TA%;RO)hC#lIPBXk0`^T~+BRjQ z8V3TrNh^JD7^)K$3u20i6LUI1I7kE{AiLdN+CK%CZR#tZ?b2wwBkJivAD zbcA{8jDs1eF+%25v={lP7LWv;qZ5wGc-x^3S1*bY!`VByeIGRO1h>J(<2U#fWl_DU zzeSi1;4pGdV&>L-7N7cm(HK`mzW*T_9YyBsM%C|*;J?B!HW|Zbd(WrZa6TFO9Pyqw znC0f=)~)X`+lr3xm;)3p^c{<=ebv6*Zmy>kaLs!}I4PPS-_a0XQKXS##i$lzhSrH* zbuHV&n3oYd*C^yw*%Oc)a6K6MD9N~)Tu~G`1}ww(w$jEu*SEk=yn4q=4cUu2-EIVA z4xO3kPd$E4mM_R}dXW8nZPa2FOZzK`kEsB}=&d^Sj`1EB5}t9lp0Q_Vx{V$q`P9pL z(Uoyu2YW#$l#*GS+m)h?9w`$X_=SgVC@Nos9o>zZd}GZxn{~u_oxm{uHX^4!hQGtg zY|`b5Yk*p(%I90g*lX10NYMZs#R2Xo>)#|`M0A7&4m`D>*t_1s$Nf{X6cwN+Gz{1~ za!{*R{t?r!u;-chr{NaPO6dfX&?+eRdMQOmk2m<#9!+{O2zWCj|nlb>Qz1CF|Y=og%uVtq`-iu9U*<$zm zs!dpdJaw-(Z-dVv;KW7qp&qy7M^xhi{p&_u1NF@Yh&R9UFi%ni3ttS-Wo<@$TevUh za`I`8(Dhw|(vqj7&QDDPd&Q0)&;NpuJ`~lELN4BIIu@X)G4u9B$P2#H` z26g(V9E*1BrK?!?U35bi3ArP_eQ z*(TFsbhmTdJz7hJs^h+~nV-Ro`2M(zd&fWD6N{pn!t?YD=3Okl+*&A!NSc0(bS~3q z4cr?q`0`3xrG+Jf!QvQQ58dil$f#b6UvNSug0ORl3%ckAJ%uYOr(zlweLn41{X z$>;PCUPq_mk~_k)COkTTi+lQom1!!%gx0H?=+6A!dmro~-uI%HIDTbDH9F}G%zV0@ZS?B0WMir zH+9WjbXb#7ORhS!F%55^^-?sOAV1vID{xNzg&OXm0;#o$t`d0rI)>^MbUGsZG1D5%SfYDUA-%T z#H@io$I89y27L<-*a1~fNUB6cW?&c5kj^<1XcX5Gq%#SgTpi?xMARk2OX!!p6Ls>R zXUAQ&`TzD~or2y-iH^;xo%0BMV1K-b*S(#~L}gmelx>$_-ncIFrYHtk?xUC7Y#gWi zximiz&dpzNSaBA*I^PG#0clmBVW$M>j1VUGIoAhgfCSZXi_ihW0$)JTbVJ$l9%t49 z_j7!KP)nQCg}YVSEHP|WJeq=6nC<<_Vaz&bjJO{I=C&XX-Y(q`1EAsm8Srd=H**dr z7*t3P*d&=joy5t`VzL-kPJ1^{M$dCA8~DzB<}TQUs=H_slk75uC}qz|weE}zh(^0x z1M7CV3^l>dni_L6Ul&Sgio*#?GR@{w^-WrNjFm9+oAxeH7eG@-+;W8ss+3{evg&HPFax< zvg6Yr9MJSbwWg!8FLawodvyRM&yd<1WYT|M;$?GN?B?ue1&crJ>AO-@IWj)p)H0;M zlp^qtKYBzs&$p7t=reJ%>+f>Fj)kMX9pX>O&-72}L@p~VVOjA5JpO68bqDt4eSJ7G z#5=T}#ZzbDyX8}-QqV`beo=I!Luc0%Oo5-bW~^=<;qQD|J@#~q&$vV2oUgI|!#GXD z6|ndWc>w(gWs4c0)vJV08GNu%NRcYuzb;e*A|DB4Sy%!VFh|I)j+S{f$&odFg^h(% zacKX7i^A69jJFTd%UVIH-rL=OY9fCRLyu@9H}m&iGp9e7Py#6~zQ!yP&Y+J>vV8&$fXa4Ip)?yiBs%aI7huq$u72osKj}}t4 zN$yB)`y9M^k}F)Qq4w*BfTr|TO>W#0RhS6tu0uOEo?}9?RxqjWVSpC@5}nA}1Wqj3 z;UB2{qYdObHUoHx3D38;FoFv{i@g051o$POa`qlBzm2(s{kSz_4*gI|LrvMah)kqT z_JDHy$PC>Pp9wAb#cyCIYDJ1xPGJ!lf4KrC*wzLF9VD?>z0`A@J1||sKPKP(6|Iki zzV=Y1hiE{M*JLkMTtFEFR(MjNc%`GHqMsnyq8c8Ip8!72(oR-|1ojV#l+*6-_iA~y zWazZ_!zzU*k=)M{vbT{1oYG^xxayj5!51Grruh{#k#H2vErA$W>6X`rcWQ#2Bj3rx zIEazAB~&0du%A&HZ)vr6z(2`6yE4?$sD*JU^jHHzJCU8@O`jw}XVwy6J5z}Nce*n( zw3V6o69!73@3y>Zj=^l`5W$&9^lE!Q*O(zB3ZcpRkuwdE!3C}>U#+Rk+b(C}p>Fpm z>swcAm`B`6!b!pR>I@p42NhZfK`#ocsDcN3r&78v53@njM`;gU*?K!Ipu}w0Zz+RHJ7>FutRTfLMkJX(2G=5J-ixcQ9yM$dV#V2)6b*b znl+%&&duF|=6-TRG@mtRTkAyc(TY8N;M3q4tFAWwOUUK1(ZE+HbdL2{cYZ5QUufr1>BGGisse za5`lQO&Nr_uWPd-c5__yv&wGXRS(l;L@Etib+K*JvYxEVb5%E{Q5^@b%*;u2cFCw) z{E!-UW}_5qZ=AZEIzOhF(^mVts6ZZz@{_~3{(@jxXBCUu5%+@xjgLb^ei7uN5d?*o z!g|LDv`T8YEI8NGS*nL}3A<8-R3*=KkAJ%iLYrsfy#=~Gvrr@rXyT$sSUZO<7iR99 zEJgiR72oKn?>n}AI{Bjm6cE_&l{PmYMvV9@q0tU2lHEiaMX!H^(7rCsHVNJQcpsnuOu3$~f7c4K z0mV{^A<2gAn-q}`BRA{8b4TI=B{KDron=CA#b}@HTmD^&iqUM2spNpyxasHQ8Wh}m zV+;HOH>dJ~`R#^<3FBF;J*$0V>lIc0<}CkI!a=C#p9g?U_;H^uTsMH>|6pCdZ5uc> z`b{3DzWWcQ`7BH=oah%l3YBqY%A5YzaA6-pgvdyL$!~=?op6Oy*E6iyE{l{W7QmwG zQ?5`?gb!v6HOBXTHPnwYyeLCqlR8fzPqKaqyqID5$IzEdevokrsi?;PWLv|;kub_j zLxaL3PTo|+~puO)KO?_OW zB8GaD-NWY8aV0xHEtF&(nyxyw>-n5^k>P+P-8-^Rd6;73QQ43MQ);vH6}&Q3p(bdA zeFC=qbsW1700&%}pOxQVsh&speE;z#9wAr*&R~1tmcb17(EUU)`D|pI8n3e#h==BW z5;%KL0!5zMM8H{j=pH1}H4a5r#A)LXyYuK!os{;j{DboQJQ5Vwt>;#i!-*~^2 zdRd%g4Qt^C&%H+r@E`I|R8gmNUm!iqyqH12FycN}wb_DmodW-4&eJ$oVM@p10j?!$jjD(Edb2Je3n2RUzCe;09-1kfkC4>BxA_;^1uSQWhjrF z78d4oPLOm);{XRO*<7RV^~ zXV0mj6wEKowjE|xAR{9=G7z+FT<1&MxuTq|Mz5{JBw+tyl)_!)vtaQAa3%;(IqxM$dCA8~yuz<|zP$stkn5W(`^90J4vRm}0|<_i0;D zos+ITd@*I7{x?-4ddN9oo_;)~t#0wykRTY=YBt3weZ!Cw36D!Cm2Nb`*GaC#3LMpe|J`$k(8A{?Pz*;~_e?v7I(oY*J-mJ-va@Mx7J)FrtM zA13oSgdamyi@jf;{cei&*4FPf)dE1;KvrLn#gRtr-8|tN_Gp||kBsWYs+uD54;Mv= zP8*vI%T_#ikQ^_Sycmg~Ch*_zZH4#HNN25a4_Z1J^uiYB_l82v3ZB`@dcPg!bJ^`w z-%YM$w8k^qj^rEoK>zqYUOdd$!Z8|jlO2{MMQ1DHQ6+`qYQn6yFA0q=;s?#s2fnr) zqZJBevmZqH6){tTA{eJz;yBT?lGo>r7t|2X5GKQVwO}-{)Voc;yDZMyTrt}`)2y+S zj}LBVVHGy$4JAu;=HE<=eU6i3Ck&NQYW=29O9(~%m691Pbwx+21eR13is-VXa1zD8 z9f?gs88ezl=!ywo01tXBK17f+|3a;U-;Aq2Go+5Oc81LmGLfZ6-5L4Y@BmxjdW2Y6 zYO=@$hxmU|J}^Q=K_VNp-Hiw+jlT1_30VX&5mAw@0&CNsSMVBTh#2*2l<)cIxQLtXh<-PgV1Foa^fllRY|#t}kE$eAB3 zK{}wnWunh~!h+~l0^OJa!f$)F_$9^R2sDCT%yR9!>UAfXyYFE)OP^kM=fXL6ICv#I zkjY9LUe?E~m-QaZz^S>5>H2hXo<9Mmz=HA~zxiBWz*45Ux`bkOPw-tuc`o64^oj^s zVH4?R8`hVfTkHgU&ThT5vFH|jqJcSL-#h~qNKtxGwYdXIh4*N*P#~4(@MpUO85N!|>cZ55S%Ilty6`mcoqSUS z1LRqtF3TQdtlil%bGP~6AtHhzBxsg}rhcZv)U21df&Qq5d7&cuBj#s*s!o$0eSM%J=kA zCSWGkK+GvHrfMkcB3YlSFenXaYltt&ve4+B4pN+B2fr-c6u76|(XjpF^cGA3(M&mv zsS2Gucr`BiKa7_io)oB$#eN?oWB-{hdh9Lyhp7T{dSRk+Q8-3#DauyaQRnvMvhHAkL21fyyh|HtXQ7 zy0}Y?nbYds<6&ydUlT1z|1`oF0Ea13;9mFYPB%)-Lp+fQCq7qvd(}s)o9}wvrsc<& zbKQ!8HUY+x80lR;qc78s{*6R@ikjRu(v5Hv&hCCjaIWf}#Q73ygAOQXz3ZRajY&g<{&^5xH zl~U%rEt$t?NEy?SmT8czkK3)ktag&qgjPo4wIhZM1uXoyaGfjQa3@`eJ*kDrVChEd z;WESHA0gz1|Iew6_m32rP%&`oG@G|Ezn^p7)eX8gu_#!Eqp2N9FJ#^-YN&6;r$aMF z3iD5>4?=KpfxJ7BoIF?QRcvCO#?i-yMq~}KF3>-)5GwWaHMUQz^+73V4*M`__lLPW zfTH5lYLreXek&FYOXb5KA$kd9PKoGy9qmP)OCAr4T{(87kZpDGeslyrp2p%&BMl=f zd0r`yS2QSftk--h{|9ctl*2_Wwg+gR?kFUOAw&rxEC2ypveI5PTV3OvSs2#l#$NSo zsI@BiJyQ8s@i0xXQjS2x(xa>ImqbFsSrpMn5wjm@tC^!2O~=zn>8>(nHH z$9j@;+PIf$7aUF_?`3@@t<7?KF~>wSzdF~qOBj9MkCYJF>eG;3pHYbtaD`F)i&x^S zqT8T5MMq5zUg1XSSOz1073?y9}oBKeJ@J?|1hCMt*0t*_2W#39I~7 zhM@iMP-}h+q~M=RgYnj|rBkYFi{<^-#PjhbVez+=)EvNS?}i+;zE#YZr+s`)oltH# zdr>oFhP!U3=H_IC1Y0l4^Gr1MR)92H`&|``hH0hlGG8$6o5^zKOA)pTH(&A=xYtwL zj_lj;1#d#2BB=x0V@F%vSC^d8;oDJThSR&sIa2f(n!cN)OHvv2O#S?b70?DgHH(Z# z#a#|zmR?@VPtT-wSjyxVWh#}#Z;Y!9h6;-h^m~i%{G5DLoc8Quk9i}+fRF**AUPs9 zWpcrZ83`y~ZA+22)uB8ky^@h`(p1^=kZGvx@U=MjD7Y^9_;llYmC|M!{ILhD)3c9i z))?s|!mB%ee6AHsVU!=RrFYsdt1XnUVCwg&1okHt*aEW(cxP}u)vW3}{kG}9G9RU_ z1};^FNQNMYTntYa3AB>d%u#}xR#KzcvJBSDh?Bel!4v;9@w?`4!; zn+JjqtB#cR;ASplvJ2h#U9D$_*h1;riCFzMfWv-A6iQ73rGbZcsS3p_LdTTjw<_c| z@rXkLY>I7Jhv{gmR3**tbes;lU;ux_XnNI&XX3B|D)^fLg=ck}{R51}WvssH*Vr~Q zmq6{@e2s^hw$qoo?xog*oG;?|(}(!NsfdLA3k6wh!nByLXn~;n6Ux---Z_0#qX?dD z^7X7|4K9{XIBa=ZGfEY=xRDi`s&ld3$HbqidgX!@Uth*wk{LVL8GvZ`y{O%{nh$9H z{mYUN{+SQImm?G5a3k8fA(vhb(KsN_J_Q;yWpQ&wBa>U|5vTbgPqqq9ZNtfD8AxY7Ve-MvTiu~>p+ zJt+0%s2;@IV#v}&r@f|_95EVA4cI5Em9;}-yf~va$+be;Yo=fR@DAcq7|C7-Sd_#y z`+R^!FpF0DE`wW`;o2>J7sM9XFfn!@ z^e{Uirlj6n#bPRab>A1n$@$>K=bW7FoS*B=$wgWz1Ql0w*S*&&OnZbXj6dBb@TW<_ zTzm8HfNk)%o*P!`k{gW|)d|n*;J9FcVZL1nNz_oP8i-?lcx`aptw)}O!v>7{=7=%S zM5smu_vsdmJ#S6mD8bbh$aC`ftz9ym=j0TC>8By`ILaNLp_Sj!tU%<-!ws>|ntyjr zy1bCVEbb|E3(r_u_6IcRlr>nAZek|Sb7c}DN3OS^K2KY!RJ0PiMI)=(M$wbXp!pFVs9PMMlpc)(RLJgO|7 z8J?^pkOK%L?W?Q0qQww!6q2DBNhXjh(DZ{}Uef!m?|I2t43N>B2vVmpYfNafz zZ%=U-8a{J0OZ8uoC&V;<4e%m}IWS#zcPtE%8^Iw&Yd5D3%6*wGT7dsQxRGzUEZ!+i z^yL>IcmGD9n-)@It@(X*2)_gSH>z`cix#|v0x6u?0fFQP-bh`-F+earQ^tw)gRPbx zGW-=;=4p4`gppgdQ*2s#`kWaxd8hXXi1_PXo0sn=jGK}FA%pZyHMFj+l8~U8@2evU7RBQbmUr$Im_BRQ;jDYahM4*Z^`g3vn;dcFXD$#aQ!%mZ;rUNDuo3N zT}9bjzc6Vmw1Ur5B+OrD)$=#a_MjUkQzSYM^CRv3lQSgJE9EN%!fAXQ5X{+y$H+6N z{j$s2{P9wU3&X(?e*EW34&ZeaXI_`+LD))In0~7u=2itzOEO z>Fn{I(T6>oN~E>lPF^XYj(J%H{4_+Y&z~#)Fh+MO28jOKtY(kBziLtQ_+Ga1BR4aq zwZie{!%3KP3V9R(=3zKcIDz1?D2GbJ>PrpupfQ*U8H0umA%kz@7mYJFmZ+>hA)zdTjoqo z6bM6C+IJ`n-WAH_o>>E*R-OX6j^*O&|4i?KEWeh9aXIpsNi-IcGK}U(JwD-d))GmQ ziM=&%6a)`#v>5SbgX8o65Ay#{L~qYA{gf>Qx=MjEB0lpW3py(;6%J%frLc};i`Ek{ zh{E3LE#;>sl~Vb}%Wq;kE&mjvz@$L<49IH&>_=f+PR-#!;Y)sbm?W2iYucXr80V?G z+rz@{XOXCw^#Pl)+KgJ7*vJKDC%`Y10Ow(QB?0T)1@kthr5gAMt;=Mu<)$5IPw(LA2b=|^! zY+i%?dZAnH3#>3eG%YF~Rw+#=lDNoN(LuO&;*-PD`S;|qbBK6J?vWSxFA&?kQT;vm z+9m`C-P=$sfo~XkKT#C!(!RDc9y(U45dA%<(z)&8q1h@Cj^+f4Rk8%{JA}$&O*81b zX>`-F)1y32w29VPfl+je3Z{}yJ#!Ro$oU_A1HE^}yHrO6OMLi3|U@^?}JQ~Wcw z`V=9$kEZxVco@3Ad;+g%PalCiSTd6yP>(heM80}%V#ei6J7+gjkj-yuiY$DhpN@*-GzShIH~$ zh0G_ry<2}#RQmGQiu(t*dCjMf`qS6)kQiTV4PWOV{G8BtBb8#Nn;Dl%#;6?^$UBC9 zkn+AH3#gvRt?KWuR3g2>1eDrpscIL@N>;zo({O_3OL(J{;ouCPdau5NLRaF}Y@`!= zj{?0BUd-^jD!N|PJCfgnc8wylZF~#0a z&F9uKLo#u?!u{fp4kDYRW5Pw)^ve^!s@uhN3=0!{{|+~PM#nlSmE$Tepjq9|72V*9 zD+3hM8`nv-d!<&vsC=wP-uS+uZa7n-v$pC6>WtaE2Li|L~Sh7y~)M@l&U)M!(qs_p6lX*Nu|z31WXfwLh!` z!#-*~TimS`Jao%3deK+4?>VC;2GKPhbJ~#!Yh%u0=-+rWT!gjB&N`LULKA>BVhF1c zLIY6{@&^{E7lJBbhgxs4v}uQO2sv(KCHcL+xEJd|!71<{B_cz0!TR{6+s9OLdDgA0 zn{V>Mf~wGLzk?*Af)wnP`STT|W$gt7i&a5c@>AFq4#!lMeK(GCk5**r2_@aUe_wRr zA{H*b&6qa-sw%mio~HTjDRzgOUtfywf>ota!n$`V3|*a+z-VIfP8%Kk^VBizf!r`!nR%^96naO;_2g2H$9t+>G;+=f@7FDUK^`MmGsV>8@OeT~@5SOJzw;;4 z41>;({3nrTmNQXS;|zz{n8WA`n-LPcvL?RcMv5&q^b-7=K3=5E|Weo8`0zj7^j?7?7wZY zw?g~8%%fFUJJ5Yk%~Kuk^hrpyL1hMRH4UTwjLBhh@$3%PnKqo@aVb72@)P8PuJ7d0 zhj3Q~%cHH(%QJI?`!S&i9G=upzmWYj1P6m96T{sm0r1BsC~hGv>2N9freiI-B&3*1 z{)P2zBOS3Ei{WOQwUuJeD80|U0@3;ESbN@^Me=rKY0~Nu#BX*+`i6q;{4Q>NfpmEJ zj-^|e^~+TSe(4|}BX5|N@P2#|Cw70!Q+C7zZC%W-CwW!QE^pHQq~RP*Sh3U401R|x zhifDLM=dTh$#F(G@KP|T+5M%`3*}*ML^#cIMvyswIQf%GhPc(){RT7V!#I_a=y^tPRb`pbi2XnYj?J^qHjQJwK;3!Z7!GJTI@n35^k zsA^z7&8PSS@?s{^&?KIh((O>+qg(lb@wsjp%#vU7#gPvN+MVvfes?I90}|z}1K#i) z{8k0YnT@OztJ2&3I4=_@-cELivAT)p0aVC-%Kq4gG^+kgh}E*nZZr+$@rKmxl)@eW zK^0fpK(2IHy#8AWpiIIOKPrGfWR8+=f(5GrpyleD>glZ$vu5fSN@>#K1|F)|uD2gI1R2(ZH`2(H+qcAsg#GAfuoI zo|c@bHwzk|EF&9hWO^?xR$AbvtGVXn4i5(dM_0NXF(#D-x5qVqU_l&b!C>0|{Sili zO(8KivtOBbk*1E25e8`^lUP0QGjHi(Ni$lzo1n&l9NUvZjy!le$tV+hSbm`$HT(^+ zY+t5CAl;|v2$@!gWd36_u7>$3maWE|Sj2|83HeYoy1%z}H~#~+|M#QcNo+)J7Rdgv zho)QvUoE2y-dXcC>uHE7pTm)%u=FRDvE~4~O^F`09s6bx=xD~HELFS09nMO2EZ)l+ zT!rk?`SqZLqoA&k)`3}$F~|gW(r%(ykj_?=rtAss=YeEwh`VTYMzW zkL-KQl2{Ynr;LDI^7Q@tOC3(VA@>6I*_NOQ@lIW@{*VcZ4{~69C>}1tphx~+Znw4z z=i$dBi%tWA%dp_D{JF#f*|A)@LqqJaB)hj7m$zD7(Damr89 zz0{HK&o1|4*WxinOVx}Ucd;shvP;c1E?^G^+MVvfen%*k0}|z}1Kx6lA|e$5fq$iC z7E!d2tcn7poiv?>1fK`&Do|Qeu-Mp#G^+kgh}E*nVl)lq@rKmxl)@eWK^0fpK((adzp9*rHo|Gkn1w4a7JS%v6yh>X^U%LW?0CaH_I=L>_ z3zVtB?LlBsiK`ib;vN59Fmn>#$VrcqWS!w>Qu1F`IQ|B31OMK~pC> zK&W=bbC@BM?UV!Uc?sdS*D@UWPJ}Na87h(FHqw91sNLKI<)>Q=WDJ6DikW1#CFGTB z=~Ub}Q2ZI^$A-BY;-D^@sp)*F6~uv&__!}uWMXj z5O`Z~O5p5b+xMI4l#|%H?q`YX@^m~Wr4-+@5*{&w+f2DRX zv^I%&`dJC(#etDxJaw1qt0@X_<#}=x&AWH*`1Yzi8|>z;OJE#e>wda28qp9NIv*Kp z?v?zx2QfJ<>b_BUZ99d0RHXx7R=}!Outn-4Ih&>QM8kUdAHZ5#DV{jb8jHps9gfce zKvyH@eh^LnaW@Yu;Q4?69DAg!T-VI(jtlv?5PpCAe~9i$L|5!&r=#48i9I)I#bnSH z%AI92xK0xvgLI99r~M>VKHL55z)_55Whl{*_Yoy_zQKGbajqY!+^V-^{bf+Tlz!qM zHFsH`J~}mugB<-S#GUqLIoM?yeJU$Imu&KxOx=s-U!Xz%=a8%ssXYUEq?O95Sx|#5 zE3j-Qqv+O~g&T4TJ>VhhD@V!`L z7JmZv{=;X)Oummy4(XQ2!eosbECtLoqL*?PY6HAm95~8Z38S@L7v_k1IhOXz`WRvH zvUT$yx^-`h3VB`dc=dp0a|5mO@M$VFb*Q21ly7uo^mj;3_CTFq^w$NEGJB?8{@)eJ z2(;yffan!JJYLZVoD0}!7?TZGC~MJcOjGWq z-AY@Nq?kbQTljPr^S7*QRz~L-z;P1t0=Yh(_@KNl&5hWq z%m!TwhIVEcNI8(VwIZAmH!3@CW9X&Zoc9=_YYsd~Q6;GbmS%UGvi>VgH($D&4`w&P zw{`k0C6s&MJ-w9XNpU4$tI@k68E;0(6FK>EsY_$=87uK&EO*Z$-80VNJ9>IOmrRJkhYha4$QBKPQ+3yQM2FwE5!XvWzHyYYax z5O003i?O7JTTuei1#+R6%t87LTqU62F zQrI@c`Dts6&5e%~N=V2%HC)mZ{6bIo3~tXLmXpwP&-sO6!qvQ{H}gsis6170cDha< zraMbB7km8R$DVwktItRAi{3Y;!syf+8f$}aI@f7>i!vkmc3aB!*dE%7$t4gfB!nnP zJL<3TMMhK;g}o|%FG4T|erKb4a;Ex}P$C_7XA2ltAP)hkukzv2#S;I+s=6pjFUxu9 z?ijZO!wRiT#%OA+q80`i1k|M6G11+Y_F8rPvq^4zp?ElfKc8eZ9l+SK-TTTz7I6hm zAj^ywFmWS`Z%mjQrtWBk-xdOXs32Gh?yiITItfiKC^tIDH5_(C1Ap>K5!$sc8@=VI zL1`V{TH5O?U-Ia!e(y4T%Yu^+OG0l!F#k63Wo!WA-g!REDX#HqcY6Q5^h-@R3H`Yf zYUZ2Hd;B&5DH4zek^wHA{m}%aK!-Gh^PvXJ;ZOkXPBb`;0|D86{7_lQ>i9!iqp2vn zuKrxGwo07F)^*zRzcJOT?(|DpUj<3>mIu+hl#1sL!)M0n(U0}rt^)7WNWq2nxTb4OL8HknIRwv>ub z(MT4!W>Gl%UdLQ4qof86C$NJadLO}f*sQJ>)x(dq@s^iU8nXtsZzdx0^dJCgWt z9kOc|TWuC8Fk&6!OPG0!fQb^>@kQlgee%cZ^=;BDouMo~J^!f7zf0~z5g+lMu1uWQ z))1Bz8z}`quh*3bs)THR_*QO^?sbig>{)M1(IC%c9m&;s(u6AD+-0^(TUYLleP!CA zc_a(2W0}7L2tZk{VfV>EL;l%y02bWsVnzmJUF@X!f6~DJr<2;fRHhr?(zpJRGe1|63Dq-b8vC68Tyj8WtTjZZ_G7n~R0c%khsY z@@ZGS!M!_v2<8)}vwU($%BL9Qui)CPX2mp*@e#AJh#(?kGpg5J_UJa+(iGR z&m!nO%b8_;@|#FBp)<;)KAX7{dT@kQXS<^q{D?-i0wN*jtK&^;-(n}D>9Xp;gw7-# z8xDF*7~~~CF~-%|%TL~H=;5)^?hFw6q_?M{N8I9YEEuG7s^1tSm|?kcyNCkkMmAz~ zSMO`}z&xM#a3n!2vZThC+5zwC&AwH*R!?hQGiq+Z$4f_oDPdH7b{%yyC+Dn4-4MRW zs-!L;si)oe^|<3OF`1k#oXw2l@0NrVc!OWW&zt1U7 zkxb|rSD~@d;OjY8dtE>hFsfEqp1R}@N)Dpfm*SC81y9QN*(S^gLi!UbC*5kS@SEQ4 zjR81%k7Lu8rsf#De`bfdLz||;JNE9aROcKOnF~?t-_QUIhJG@Sh{QcwaXS&DemkH- zwn60L4T0;-Aj z+SYRthFL;}1nvcnT~o0t1|?nAxQpC!Cr=xl06+i6xMG6@P82SQ55T$3B~p=(mxBPlEJvVK}R`9 z7>rt&STzJ_WZ)VNHXI@6=NC#ONjZx8WYmxY4i=#IB`nDTbZye1XW%YSwrFK51>h?+ zAr!y+nfQJiG}HDJReMVYjC57!Rhm@23V2wt*6Tk27c*Dn9G@_5Ry6vN5Kd1k8&D_S zjZ{n)BFc#(^~PBm!e0F)`dL0UnU3Z z@v(i+LE!XlhAYitv8xcLxNHOBGrQWz_!%;qFeDegNTnTt$sz}e8fj_zONtzi z+cbA&a;LwHwoXw|(Q()UTy`bWhu_8F78CiuYJ#h^Fdp1tR^rTe0%+wbNj|lTTqu=z z?^SNyjJ$AH2PU1z??8$c&Lhf)pfxS(QBjx}LF#kL>{YT!-mWUh`fSf9DB0FqX$NH- zGgE^~lk+88e*4Ozl<42xE3xsCT^C#Xk+h$s5G=U^e0htz=jc(b@2eT=RCz+CO(u7w z5&5aGYz^!(WA8HHVHnC`ZnPL`;Ko(0l3CrEgs&F7vnNP*XGpmEs9IN-70oxel^jC5 zpK&21@N?J&RBI63Ig%ax-65DHJGqi6w2Dcx!1CJVZc9uvQLik?Ud+>4sneOHn7J2> zR0MA8XY`*zX6R8WFyC9Seu;acR&_!m30)9TdjKNBBRS#OBIh5{B;#LHMMPyR|1x^8 z-^uIL8fVOt7B(|VBuo(1&b_JqaV7@b0lDl_3fP{iXY^&{vQ~JJ<_oS_`Lc+U`U&Yh zX{g{`CA0=!o*nNI^vbz9R%d3i{ii8&sJzNlkZ23+$_OQ_Ad&+!V0X2f`D|DV8W;c{ zX6y~C;}>e<@vt;!BN-1R1bQ)dBsk+)>{P3K)34;dWCq?!c0UX|#VeJx;B#OZ-a8gX z6G{HQ2feY|VT?juUDa2|`Nk}TXoL5loAbyxac{%wz7mZVWH?jI2}2MyB(puLs8zgV z+>X}tmoGl$rU2UP-Xx{%(n}cB5bc=Zhg3oemk7krm!*QMaO`3Ejke-r6><)A>b4fv z!W$JF&xS)zcBSx3EDwp~Oxf_~VXn7#1t)>bnf8~8nm+0=Uj%ruZL*Zbm^!{kK8Ddc zO!M>K492p+dZuFxe!P0eD}UydGduh2%Pg_wTf1Ce@%4`gVN(kmlT$q2cIH9bJK^Cq z)LHh!aEg>(mS{q1lVhZ38~SyQ{%TJg&%B|N$}T1b~jLuSQ|Z=&H?zUdh-I5c!BEhQ0dB5eLL3f96&o-jZk zYD(siFXYs(haj3I-8m1c0}5n{3rg@qO2Taod3ZX|mCCf|t?j4T#@|j|@1eLlow;*b=C10l^^P8~U0@xv$#{TIakoDY(p@$lw&d@=z3_^A>NLNkOf` z)mdr0<+(052PpV+k)aTE#h|<(C$CvLEG>NAnk8NOw9{+Ox(q1&Fyd)UA7f^ZrW*Ea%(g1 z!!j?K&R;Bs*YDwv*unnVwrT9rV*y%}RWD>6A$q``1Jf>(OJ=cut0TI@V@vQ`dR9)csZL0U8BQ{Cj8b_BI_BSsIca9+MIUf zm2D&GuS2I9pdvs=sW-S349wLC2v{m(*H-R6)`VG#;jFvoMQqeew!o)!p;nb|WLkZr z)o$@vtQWC^eDWyOUnhx!F^mR!v`W1d?b~Q*84{5(%l`O1T2vSac01@=I%`m4e9<}rSA+qgzHZi5_EiN z<<=_a`~Wdxi}#@;1hiMQfEig`C8;xTfwAsEvi5!!%RY`nSHCHD6d%Uiz||`Re|JCJ}o)k@-zUVLRWW3vmVbHq88C zhDfi?-}dXq1cscOg7=+mVvEUINw}ohBtcVJ2+l_V`l*K)yoVJ{X_vTI~BN@{^=EY?aAA;zDXVVu*TO5BL^Nnm=ChL=@>j zN?t{s+n^{inY4_-!6Jx^zFu@{=jR`t`Asr?FeMt|43V`WgF-~c&dE-^Z)+C7sxewD z&2GF9jM;9U(-4~6p-!3j*QZ)B@g`Oi)5zyzVwb0lA2L@Zt#1v%?s>@afQLBp{>YuQ z>)JJ@b<8tU6-OiW`GlK@I=wuQiBc}T8$>$c;V9@911|dpJN6BxgW#5&-$5>v<}6k( zR^MHGuzkZk8ucWXW2Amg1yP*BV;$w)eQ0hMxNPrX~0?UKmHB&sO7Di{eF3bJ2J z$o9VJ&*)ts7x-$@+r=LhZ)_jBuqx$uOsDgKI}I9ai(OvnOpCJ0t00~v&=SWXDLRn2+1n-7|BB`uSjazzL{)Ex zAYAeMkSx7=Q(ifc`?j*i9xZOVCrD~fj8=lJEBzV3o&b`i`K3cv>-``S137FP1y5dy z6-M-AaRraX8}>ZNagi@psIPbzJH!il>c_ddFc#e-y;?uFuuSoqc_0^v;7npt>?}-c z&jL~I2I=@2Vx-rA2_ankfK z%nMrDbU+TeP%4qSb&obncKdA2>KOknH;#VJ^ROy$DSAmtTv{{3tzE}V$ z(@AJ?WHMh1q+3N6){WIXZ5TV=<#rJpBos4P9kR!Q7Ybv1z7-_4forZWaxwFQn1xGp z&t}vHb8Mw0dKxsu{!&CE%`$hY*>ha^@e`pdx6n1nZQ7&P*7le0wOez}CB- zs^ic0N;uzCmgq!J2 zRZP_gN>uZ#f+0Xwgwkv1^k(l;l-w-&bzGu0Yh3>7UeW+?UcV|PPqaV`d26>sJ%_z3Wj*im!?u4M4K z8yogSX$A_bJn-|F!0%DDlrgPla*_*0)S+l!(Ha+gNV@$C0)8z8=4Fm@$~xB*`@J}I zR#%8-C4nFr;sN9|<69@Pbz4-_jxD#bV*R88=sS+e0J4qwh={Zu-~vk!s9pfXFVCyA zo25zM=}rl{ECbX{&cyrQ+glqc9l zOjIYgeF>r>A$^&4XxQXxs)LYAZB*N(JiliDq%D`0u&M!UE*Ok+W*%uSE|*1(med(Pe71&X#Bxae_rIF8ul9wDdh5wmfFIEIGue{6{Gng(uND~A&@ zO9Q(q$bxlx`yOvZeeif%G_WWg^}q>0KoOSLyIpaej&}yVw%GnbY`5!F*yAB(;4&`N z^0%DWb>S4VA)VD6oH3rK(4SC1zgqvZ(T&>#XDVF0o_jmCy2WWg-6JSMNOcY3VJ~^* zasd~C{k}4!#h`65sRex{|JK&x0@HqOzlwW9TOr)FKpyoLOx~GEKObSJV4_tj_-Tyh zzhVrKHU4M)Skj2I^Qe|FO@XJf`uz-aq}SqDxc^dXX{Jysk$_5)D#T_Jv2J?1)A;-z z`bqfDg=M*))L94nND0y?KG~Z!SN&*;*?WXvi@IRAn9_qCHTWOL1xKGx2+E^Yvqvkf zjo5m4eieeV8uFT(|5~BSPqKXV)N3rBAZ`GO<8ymZ&AW6im|g$&QF@r z95IZsZS9>{J-S!A2li1Ow$SXc%l!|(nFz8oj2JTmJC9c`&274~IPc+5-LBCnrLIH7 zuohWp-QD{)Vq!&62+0@4EsvJxb`pkX$dDnj2XNeWMVLDu2e@dw8f~?zMzin02vB>}5Rpv6NK9LErTRXul{45L&rOT=oZHJ8q3q=)JB*!PJlPgtAa z_jK5WL+I0>t|O047lmvw+d`eEQorC&`q|skBHNi|!HBSoGjN~!+Rt0g;LHC2Ght{e zDRS87v+CDgW@@_Sqz=L{*CaT6{JF)EtcnwI>3nRH)2R>G6S$IYyJ-^`1Vq*n0e>+G_Ac2#GXKw+00tnA5S zTTLt`q$U=aaGOim5iW_0Un26tRx_S8Oxm8?yAYw8nez}-O!&h>?p|xnT(ZPrrf6{0 zF;_!0&mBT1c4qM1;z3A$tJ<)scK!dTfy0uAW}jaYM36e48G#{k1Ny7Pk0XgiT&zz3`l^y=^1H) z;Ym*7whe2#keGe`F&um@WR!1t+KxMSaF}#4`A0L}Zp&G3RSbF>#N#VIaMOF{ahNyg%s+V2)8Lo_+PZ8h&TaPb7^hEIGD0mBRbktZDB#4c4l zSZ*P)3KtSt_Q{R98dE=r*|+rCjKkqV0Uh3(z}&Eqx7~3^XX!#2l;UHqewVPVzht+niFcFS`epLWyFs=NPU zS^=`DA}=Yxgxo>dGX`XsNXX-wHWJlE2wo~%!*H@ZJJZQyDQE?zy}8wT__ik3XM0Q^ zlN!L?JjTkmRj^r?F}ezlBKO1Qv~<-oRsGsP#5+Q60tcsXAp;AF29F%H9th_m1U}+P zOAw5T+%&)k0uaRb@F&Oh2wRL+ROUyu5vE-do3clle+rVHCS`jJ0_^tV58LY^c ztFg;L_)V(Bu57U`Kw9#@?EgnO4I!ct#-Yh5HYyTxPko+nUyS6w zXURI>a(Q(tjl8_1@K9KD7fzx2JSok=@Gqa5;l)72x-%R<~8L+8ylrF=4||>#>b-oqb|bY7>2( zZiA?DQY3kY6nkiDPnX*Mxhn2mPaT#rlF@J#7S#;Vsa-GH;8wUMgvYo8ivqFhkyX7> zFw2|d|JSIy4!3;;8cm9w(}IgN)TAQyBvZ3Xuduii**+mHeakX|)%BTJVNULO6K5!f z;EhPQ7XEOEre88oM^}_eh@Ye;67y(6ch}saht&S%TK$CCgdNTK!(oxto8U z`9FhyX#k!Zuxja?izsko7{3H-<6#uEwPZ@vmTHf{CPm>SCcr>t zR-DZq&q?#gE<02q#UTNdArwf|>aXOAovray;V4J2F}*K$4qXLk*&4=;%7fzTf#_3E0ot?ht$a8d=>LS=oc)qZU1Tz$(# z$HykW1|K12;FNzwQ{NTRaKfMKM|oqva8^R#YtG0p=%w#Zcob>D^9tN6z_cuhrTf2r z9C(>5I9^!A5a^p|4b&r)C->-@HFoGxax+TyOzXj@V=y0QKM;fdW50X$L3ta+4QD!O z)|8o&w{WkF$0QrC<0`FHHkqDOvgPyTy7=5DLz!)2&(-nQ^Zo@Z1__I^IoD#2&i)`8 zsELvsZRfjY{KiS;h`l&vTCR0}<5ejV50(`Jh!jrflH;sn>v=~<3>~?t+cZle%mL?N zf_G)4_)qXPap{2^+xzS6G5`PrL=W0m=IYB+Vz)V%NVvf9>f*H74*x~kL0jLv_5={ zwwd=(V4GGc{|4&S1@7yJk%$Knh9|2EWRZT4>aV1siEev))i@0ED*voLRm?r0#yFrm zADcp_8zAE$-dfO-^8KIRLOs<4%YiA4wv+lqc?`Z(DlhiEt83ENyBb5!k152q*0(3D z#C@fYaUlj$oei@ghqgUojjt@iSD&Wyr(@dQP<8R7O3)~z7id2RxLK>&+l)Wx2aC8W zur=JI#{bnINNn%BGKQRha1-f?>4{fcF9ccMX?iBdK8U#*4fe8uOJKomNcS(i@OpJd z5(&s^s)IyFkwO_*!b_;a(0PdG)X&T4;-9@20r@heQP51 zP<(>INn~gF>`U$mZUnXQU-ZTtX-0#SG_R@M?D@ScN_kIjGHt}= zg*Yz3$piU14%QSP^AvRVES}L6HzxVy zX~e7fx~w?Hd;lpy?PlW3JQb4!J}hd3lj((hF)E3vksd>cU-C)jeL8}&jpgb7(gs(` zBz5$T3b~AxmfHskz{EY(ADFnvuZ`IWriQ)lW#=cLIC^V`&cTir&~En0$^|hZqt}9f z#>O%#%8J`Y0?rdYh2q;>%phM^IUgr1B@3GKOUKOf8UanoZM**}*V+Awo8xx_S2{AZ z80U|pM<{l!Ll&RdAX6(wpahOk_|-xzPoR$7MThG*z0m>rCP4R92EkMcNFYI~Z?=xZ z0V7|7f>7X@dqE#czQRY*`o_*XMw1$*Z_ijB{sFi~VgshgJ%A_Dl`eD9a6-%8TEmt} z#~Yw+yS5C`XujB_DI;ImG@r2f#`basCbEmCa59a*!eQnxVKsYCf`?Hmjt7}8KR)h{ z)5;G)W1xL*2fc>F~;!tXuV8F2##dU%#mz+rc-n96_%h~C{eto|#Z0A?JVx$Lu;AO3xLfE9RuErvr z`C6S{O?ne(!ad5AOnBrJ_XbqyRIGE$)7OJr9jb|9*~%WW^*q^jbZ)or*lpNmtFa{b zrRhWciRi6Bcp!yqxkAmXs-xG4Sq)e^Qx^e~xa}@9%^VpPY7NSSG{85VFdVXD0!5R8 zX|>H)h**0%(;Ju37#yVnx4G(E)`i11uFYL`yu1$+l*dGWd|ab6L(JtLrtJTA!!qOo(gB6TsriT4NWa2n*>C6k?q*E zEz(x{qz3FZA0EBq1RsqA!*!=r@S01vAiGq;4z!B_4i{7c-Ic5?G7kRQ-Zt47q6Sh} zCDN>mU$j;bj_(7roiKc~)8|(oUejb{TWbrj4c-x{*K$qh%fF1>*6=?(QpP%1-b$&| z#wGNTZ7U~VhdZaGYE|pJGC~pjQM7O})oCbOv4z4@yCwPGIRzI*$K1A3kf`jxxt#*2 z6APeiB~>C7^fxygjQ%6Z{izTyn5WG$R_~|AC2+~mk9uH5s}Y{_^az@&({vf-I9c!C z6Q759d`SYT=k321$&gC1evCB6E{UaImAskA-bdcl+U2^xz%Z(SV$SY9hi9BGQS~V= zrtvNq%OmuQr01%Xj>-8#OXqKY)Bk-XF$OFTT7qO%RJ;d#2pGMfVGbF`enWdeNf(0} z4?U6>tPq-2u;dTzeBgXC{5|`q z|A#ZsK@UDjM?y@aZW=DA%P=}DAp|PvOM%1%d|=EGApE_KpCy+Y`}tD6T}*`Z^^4xx z5P=mK3tKK2H4Dydu`j zj-A9x)<8`t7;HhrnG?d>hyTSHXr->;TQjQJrffA1-! zLHnNb@M?PmA8=f}D}?TleXAa6NfGq#y!}0f%tm?5)00U7i(R7fqg|01r6!3N9}|hK z+0acq2pijE%Mc;6Ec2#?!x@$K^Hx?XEREH=Sl7N?2Cnw*A0qB41bU3&-!uSSiwN^nKtWAS#r|VJ5k6YkG!RLafhfM4?8}nXTs9N*=lHcJmB&^ zn@Rndr0>XN3lC35Qzx+0D+yzs%1CLIQD1GQ293^!g&_lQS&d2-4u2Z*g9RK%)a+KA z@T}K=x0~IQWQ5mhOtHQOa2p&26_&w}{L5emT{$F?BOh2hUk%o>xm5SRD3rTa6b!$b zgetHYG3)|2*E>{mBLSO9UbOfZ>tXr-sKIH=;xPsO6)0*jTQ!74XX)1tzlEVA>`hOM z2`(zad(Di8-J=IL`r<5eMXkb#hRUagny$la#~csHHlgAY&_b#?H`@)Gc^rT)N*Qd1r`sKX#^e*v z+soosJM2F7PP5YCzI_C<-Zx5v_PO(PlaSnYg(G_6KU!P4vL z!pQe4N-moyfye ze>{!jGwrWkbmcUAh)WE%J>YaovwW3yTC(6DDl`t^#*iEw(=81$zJ))N1R57pYoX*K zn%~L&tgO4g2#cp)s%agyI^iraO;1>hY!8DUn_QG6S8so2|hgTIcYis_N^$=fAO zOP|UXASwiXfAL@kT3lbRRBR0!7Eu!YZ+9!lY?DZ#Rp&M87SjT^JufBZL5Eh4+&LOZ zxtX|46jev=7*Yw*Q0#|{pN2IWuT_0)?^hboUqCFwzWTkBxT2-lw92>>K1CK2$|p7j zaXN_UW}@HIl5i@FHT8K+&xcBVw0nl$l_GM|l=V&6&t8cl>4&M2-e^xKS|#C_K>bPS z5GELX1*Es*6e6o#TpjSqlU5eKi`qX%8kouHixN-#e7E=5%)MDW_FlMIH3quqM|o_bC_u z^{y!at|~lyt(;G7^r7v{?!8pM!X<^QmEv?5*D%6ylgP8Z{X-=&gOX5{*n!o<3UQ|4j~ZY@_RZxtSMwR#ebYI=EKEdd>`_%*6CeReKnfaT2EIYM0?3 z_KXYEncgc!Aby9G)Y4(y^hq#+C&|lh-Zz6%P$oTPivH{Teihto3`J7%d5Rx!_dgFF zgM7m#6$PP>LYWMoR~obGra+jg<-Z5Elf!G0+afiJ^jx9Iwyyt~-nrQ0Q~R%d&4ARO zam#H3fIf_yNs#;3+T#Kc;%^wAVvoH&EKf-tDDeGwj&S-e1r{0Wql(OXCpMZ4a-Y0d zusLI@ul}I?%&p#$aE|`Y*PhXK8c=fZ{3&dZiO|*;^>KCqd-Ft*L@SfxAt7wl5Ffy+ z8wzgtdYlZW{A9;|H4^5pw5dDS#k}g>j5>x^r1dP{YCEv>C67KrbEKr{N(0V^K>Wof zFL}xvnPp?oP&;A^1q{jE(c(xov4}T+J|k_Cd%u%`lz(7u4wg44T7)I&7MvoL2^rVu z{oaZDfgGDsOo3O>7*9f@hJUjx{g!uuop`w7|5jZ?J}f%q6%OaNL_7 z3RS`-Z!_W$G5bB2&=vM0_Nw+sz`&#`cOsc*%zHLHTfqdtzunXufWL|LK&sBpWAK&c z%H(PBlO=R7iA#35&61nTGNbSDr%2ooLi187?%gZlZC#5sn`GNbdp))lZ%|7x4T8L&_=+^;dmdPZhryCZ#V1G8n_$s z6USwq6IL&az7@>-fjpO3a>XJfG#~3{#V15I+Prr?Re#iA!RzJ_VRIft1nG`rxZpJ* zc~O7)-vKI+Fxy^e$r4C&HRGdNt50Ic;=Tch)G4Q{URgx7&?X;crJy8K5frUjt7-+{ zg@Dn^zoL{U6SQsb}Pw;n92t>8{Ep>yg`k%$FUFIHKb{l5++3#mtD zPQhhdGETTyyx+~2b0ne28FEdbgGFDp7Vu(=q{Isgh7SE^rZ6kfx2gXR(kcAzd#eue z{`ZhKEw02f{Le*H$xMLMu;;kTx>XMg7NnJfmZXhsM-rGNXH}SMyca@}hzpHak(aIR zSWKD+>+aW`=sE63L1V+Ud)CYr7kb+xy3CG`E=2oow6 zfE+rqC3TEgC~z$9=5ORW_GvuXZAC7pbab`xu(np1iLoiagwx{GnkJ83(EZRkD}JA7 z4`w%oYsw-{72@Bn9xSZfRLi>k${;I zQ#CvNFfh(nGln@N-DYhYoZ>$X@TUb-N7*NFAk0Wiry{3)YqZP#&)1%1aNTl9pRbZv z@+{*A2630)W(4ZYmrto*Zmv{&M@_7CTyn zID_l5M8NLa$r4R8Bi&~3Nx`F%Dt2tBOWA99i+@T_FEjBb1i4-cysXlDsvM7wts#gQ z(ItK&N7SSoc9z$HVAXVggbp1gFfGLooVPueLEL|b{ca>afc9$Ln;o=Kt)Dp-%r?a7 zOVBDu+Dt$3_~D4SwnSRSTe|R6zI;l6F^WiWf@YodEqBcMiYKFUmuR z|2PocyI4$HSx;XD$<-ANkpM&UeASbdcPk#y^squ9L3LBt(+8_ThJbuq#Oy};@sQnq zai~3q@p*9kzEE4krYtzxm zi)~hbWOM^NvJ2%1`V5*Q=7_+)S|Z^Nyw|!&l_bTSKcxSPRy0n0MGWrqsbAvo?i2k`sBH@-ET97|-F6i=kgj`{l zD2B(o2engUqOh?oR>@{r_)z<_COoTj-9$Sup)q3moT>iT1X}GBo8>x zb&)zMJJj++nWkGwy2;eNfSELT^U`r64^4e4ld{oX^bn!wc$NT|j+*9QMrvWBv38-O zQayL?XqxPVt;@8(EXyxJf^9I&-8yEJgj3%KN%U*d0jU3P9JzkvBrq{Av^on@?5*PP zEV`}=q1Q@nueYB0%qQWqq3Fnut#xtVgdc0*{pS+#lRAx_$R@2RT;D))09rt$zhVk^ zP3LBc0_|u>?xW?4BgzlfYw2+;!aX1>XJ}nbs1yf?ZpCu)LRErETW4m_`QX>*3CW!f?1y$2pgJ~eD9 z9CZt-^t?I;j^mP51+o(`vD4I&sQsFS^O2on5nJ5|?ACG}n_JYL&4TPx;dQHF0l{=}v zWKVGYO8PgKL~DSRjw<@#Hwlhm@g58NmAKvwSxeFlN*gc>E8yM>knBYv#JJ4ZyGFrR zzXdQnTWC0YIKNtOg}?8Cg^aKjiZlQM<-TeO=fv#TUV43~>au4_M1L-qeOvOZX=Pzc zrin=AKSJfCs3hG^0+}PdpB=Z9XTN6WtB1A{8v4={Wja1-Sun@stMWqo8>m<1VR#LB zufy19T6wUPY$M+_o^tIwT5&?GIs!Icf~N%vhs)Kz0bwcsZG~5IP*aEh1)}W?44OeU zDODlgEcu$U2g=t!E2|~Tm)}LlKpjM7wq*dUk)9VnvfSW;Mrh_onOD$K@S7@MPbwkq zfz~i`H%_Q`Io^u`BW((@XscKWmYZ48yFLonli<>hEPWm z$~g$vs;l`r8bTRa=>m@~$9}I9>P7Qe_!@PVY?x)0$NZgzVxwMI*ck z!t?CYtq^>3MC>W6aCPL2DEQ3yUmh~`ar@#Nw_CO3bB3nmrPB-A!;f4p<* zz0ZN~4;`%~(ceOo-3|HG#oTgQUHcPrO)El z@v=81UgQ%DUcwv_S(fNrX)WVy0GS_kiW#qZR6Wzeh8d#HgubRzfkRx?4!Shqg)dHo zX*gJswbH7ry3~&?mN{#TWZpbNyu?D0d{BtL7H0P$)~1y{^w?VH)d!S1w;Y7xDPU2Z zwk=o?3!F*4S(Wcz;l@=Fdr>W5Tf*}om3OA$yZ=xA*vF(EAP~2RKjJ!E+l@B1izTO? z;=hIkYQX^+{P#OfZL<=A4tI6I&P)TbQ^OrvDQaL%?pz-5S#`<4R4|*VJRs|pbt^uz zfM6!{#J9d#_W7xkv@mg`ci-6uN*4l~5%Lf(9o{~Vd=K+a1Ye~lusG|bue^jGu)=MnNK@Q;^#sqz6y~%-ZxR_IuPgm(EBV?L5!B|*N zAu<{-j22Hq4GY1(SHAEawPh|UaLpjy7*c)(+lU!PA7_OhQ^k7h^v1bUw0awQaTz>j zU5rWI3)=QzYr9Iq3S3=E>Gbv&wSENU1tjGjNcq)M1#&ZUvp1PQn#r6h?Ysm5quH$URY zDC$XeP;wj;6fWNuF(|Nuc0H-n2!JUGi2+HePm2d(S19KC!CV{aGDn17L)cL=QT8`` z2}wdA_PiaK+(LI1tMj|GTe?$d)(wh1t^pgFzDnD>1-HuDEmx&$ih^BPfH3j1cCBk4 zLYS@rs(p3S1Ky-n>$OEfV){d%$OpF}6ZdeQod(LIk22oaJ737^P{@j0UDTSFu2Jwp zZBNob-swLKl>@9-6OB{(I;LMWUBg8YKH*{Xi}me5{4M^=61%+8n)?fc;79;|Fu4A! z((7Yxl-cdS19}ceKfi1aeMihX#zoDf#OXt(fN&=~kNvz0Wmv+A z5-#Xpwvd4tyM_4AS5w!G=nxHO_k&h26e{ydly05<)< zbyJM)hub8shqgyuAxgKZ80Gr4eA|FCs#g;vWK_a*Ua$#t575VQf@V`{FU()TKXyJgP;b5|Z{7@z7<`A%x)IkPx^RE&B-nS`Z}$^mM#xl|6wfVkG?#C8zg> zm+HOr=%(H-EnOu3alfSZKy2QL&P!umfMDOsN=I@DyVk=ETk!i?b~B#*Ha1n0@#*)S-YN2a{Yl9aVMPCif-w8(j~xKY)inJNn0&!-D^P13%AvdyAG> z1y0WAVBg;`jx!z6HkItas=XJ#Y38E|_5zK(uofC$i8&orvU&ST#{yWkmQ0%;HgaQ& zX_a7+H9k~mDBhI_m!XvklWgXRt=h(hXc~Wzc|*%U1*wz;Ngt>e=Yr2lrAe=?UiN)M z(U~zVRAmX>H-d@uZ`KY|nPqpOZp`pxhLC~QNq}TVKnEtT7Bu>|N|ZONLew+GV^pCQ z5z#Ye%_s59l{Lf9MqoQPfDD$+)(aD*T3rGrQzs=k=%PDLTE4+LufeY>~F$OX2 zwrDdF51_Vx-H(W8Z3dZ7>)L<<45zAn9r<|>ZV4)jlr!)ZKb-H|MN)B2+y-UE@nC!a z$zI(ZLE@H*(^PZlA@+mACe*X6P3q>bHg1ZaRjdkA&tFE~JW#q=P;;!uXSo-vBx9Zt zk{)|6a-s5BbmJ@YD8(k^HFXsF1r3;Y+xEq`u1=fRKo3qaA{-kH5C?`Je{MiCQ5Hk~ z6GPJPiP(8*R3_o3&m%0i7(LPox$0b+d)FARJ2xc3bm{}UD}#8edD`)3#h8X(83^I` zVNcQk0ra8aJEibY1on2vHB<1i@~i+=IsL2tz8t!q*2 z3xzWJhpFrZU}>AdQVndpiJNZYI(~TEiP}T61^?w*9iP2jxH8V!l>zXw8|G!`yoIIs z6GGeUBh>qEQb#!++7P~A#U?jAHr9|rxAw9Ch9e$>8xJicI+_>8z2OP4lwzX~9I)MV zfxdPWxzrq#u7D~`PwXIUcChv=*&9Sx5UUjl*PQ>Z^GAri?Gh*aE9X*i{qR&YbBGzP zcvjhQf#E%XI4_jA7#xfgM|f%6Cbsz2Fu|&*_tr2QpcmRSr09WN zOcJ4x^GdBewjav(&lvh(g7O!Ybh3rn%cR(!5|7ptsP6;M2Uae=tz~B!Q|i2QU(YZ^ zdbivSzFxgUDCpD*A}Dpj-N^y?6dm!uTeAljx?3?uBc83IVZczBlRg-JRXpU)EkgI*AQy5YpJq?)|V0^3hE=5Ed_yq55iTPBQlRV z&@=>hZdpGdygZ}m%H5SBsfS+QB+vkX>EmldvbhWf4o96`8{Bz!pBuYreIQQG^|^=X^;lS<~a} zh1O(&rCD*)Yo2#W<(NG=H8KS)CkY5*JzObu-ng>qXv$5pDVf9gvEBfHaA_sNLWy@d zC_%(hVmnTAQirXp^uAW{f-(cm$}DS7KYhjL$Btix!+&2-&0w7vvE9n9i#Yjdws^5mWq&fE05h0)bO=Ej?PPjVIO`e4K|_pxeN3a z`bK`-b1sa)dGSq{y$e6hP!-WaZy_IAB;Y1=x}^YoQpkVx!J}>D(n>9JZ{_!%{&!Hp z;N0RVbMn-loKSE|KeNwc+~GkeAhtfiITX&ZOU7a#KobyOn|92Lvn^i57sP!s)7n=R zP|3I>1dgA6$ay@XvKq@{Dusjj}dHJ;3?=EYh?r7HShL^|jyO4}}3>QF!6zU-`2x=yyZ61Wc6J zjb`#d8kQSUsdw$R#~%I{tKj-zOT+Z<<_=X!M-k{u_34*m|EyjFYidK{gfXVcqmOeKVYCcjqf328X-X z{s};RQE`PQA`va@+8}v|Jrl;m>i`mgfCil%j4_FE&UpDa-$x{gyp}(pY>q?(3MzNS z5`(@q3(Y5aBjjke!JED+Zr!3G_S_H%a}lFxyMA7_j!s2Yhn7yM?8;b5NWbYn1n$E{VU0V^!z6Sv2Hc?a#}yPy#1E! zk#*24-}ze*W8lQuk{N5kyjv+%CYDjt3AkLHX9}x+zaLW5J#u9rJhk5!nVFyybh71{sl3HLho98h4}&fv<>0(YWc%3LCwm@3oEkXMl}09svXBs)v~6;RX7*xU}{FD9Cj|F^P(l9seQ!S$@aDh~`3(rLBiq+68c-B_o(|+#j!M|V0aY8QZ z(9)9M=E483mR@MU5l&cj*7@+;;v~%7+&tVM$1KS_BAy9kfdnGi`6+^}IK4NlvajPT zM^23zl3M7Dx(;(pSzWCx=ODklbVU|kD*P>svO#+R=d+A(W{2GR1Njz_eBejat@&vC z_%Os6j+E6C(OgN+Un2xLhVTJ)l}XF=seg>zW|ApnMSl2TuSwn1g_15;cvUU)D3u;d zrfXHP-`Jaka!un-0IUWf>DPq?!9jHJzCLekLuAT?qO;-YP$EL=xS8U4 z@FpzZfx*x%%+v2~W)z@gWPDExQ;NDW^1>l!!;fo8QM#sC!RBD$kXZSBSeH@oH7nc5 zlA=?wGsbHK{5*1sUJ{m|{%-wCpUa$E9~ZG5ugNkZ3ZXnL#3H{B|b&QgF;m*!gxth41AN}?sMt11yO;(I&9vot+06@+7 z*^`~B;q)wZY28^`5M7>Hs`c~Y#qZCYX%$SZ_%e~2w#y0%JRh10fNWn(2MSjH;oY)-Z&R<&Qrab5pWhuya8p0f4L*q;u8T2mjB~ zU%wT=jAG$uH1`1HVqz(AqQY)i; zH~zBM6y%(@CS#a?=x5i6al*P zgAQD>HN=71p-VK_xoClixo6+a9K8yQ zU$XtQeR@|?+xq5omKZEiX(@X^-tu5A z^8sP1QVkFT;yvwG>EXzpAGDakYnIa4@{Gcg6>&st>YBr|pzx|Ao=6`NI=ga{7%@@r;bDJX;7T~<+Aay9x`|!ql?kq*MxDp!{OC@rm-cyOM6NWCmGreq)Q4LIe5=(8(7c&WWv|upPHE<53 zQa3SDu?r@#^+hY`>`~Jw_s~U?K4bD=6UEpf{nDEva8}f=k&LpW=nF&AkuvE*G=&w1 zl@c7RP~gW1`ZS+%FsKq3Wh^Fp>5)=8zrGsGtOa{J{q$qbK<#O=4{0K;Z-JU~bAE|8 za3t7{ke%huuiLSij6$uO$Y33Y4>O2<6h=J+`T`J(i4_(9Jyi)vvL(|HlLG?h6Wejb z8Z;KLtYmVrLGD_%?Q11~@rPMOGM&`|i}t_FLr+8^dmzF;mv&eVZ4Mrc48 zj#e<_ui*s>pF+I&m3@r0_Ob>>AXJa6Kpjus-Hw$Enj+6Q78N#4CedATCNzvbk-ZFGq50=63OjYuZ*rT-w zMR^N1V~Szy2E`~Jc_+=|*CN7C!`8Y&Dn+AIof3x2v%mcI1Z($ZLBLgetJY@1HYm_D z2L%*G4L)3I=1{IMaf(_4BZmAU@sTFGaFC5NT-P;cv*vP9h)tISlcPmMdW(F8Dwh=o8<&0{I-fd?_LIg&@ z9W=q=Z1Ur#R{lJDKxr0n!GlaJ5m5blKiA6ZRgQ31n`fRL1PcsfH9c}xTFFoeJRAgB zZcwi}kT#_tl6i^D$fe06MzIR~n3?})aD~ex{r#=AsIPaw=c}DOd{&m$tArrdUCQ-v z>ygd5UcfEVjO1{^t(0J9+Yv!|)Wjl`eyt>RNW8^N$3PEqWhW}WV7DMsA0G*Wg31`W z%ylFxcnZCJ3Q&I*ONVA;LdR2`a2u#!bK1PvWL$FxuXm{i zBY^)j;edk@wPbXIB*#@ic`i=``eBRWsmW;~PADTfqfzQ95KzAjGGm4z;!rv}|MsdJ zyB=bMa<63rZxdw6+{4M6e*9q@nQiz4O-EDRPeFj#Z(4{zcE66jSDFGSD`AGYpnVV)3xEVbm z`51^VO%MrIlBAIEoo{iP$-%={PVqBEsGB;J@UoQ(y(tCAI&X)lVuBF{n(OQoFz7(D zv=805LzXL~n>07oV5lbqUvmNlc#%;n`M3#bD6C;W<3{ScG)@d2r&zpCaD0EY)NNlS zBE-`96=yTW4kj2R>Kg8`pZ=~D8bG-Q#z?FN((&ipEkh5;`wy#dQbrq@NMR?>8Qe$@ zS4_inn8T!`&TK|QLPdd~)pxA7#zPa9t(lwq+P%B>b)h`SiE^MVYy#R8MC*qSVZtYl zXJps1(iZCN&abV5PR9Y$7jGwOrfd=hAdy^w1ytj~*t@Ys?=cjaxZ%Q+o&n;qk>|{O zU-|EMLX$|Hj+q4Gy3_-=C%r>-_!Adb#JEk?)!@%l zN0V>Vg;T9N82i+$b8)OLGE0a3sTJM+8V*}j+dl!lf$lFmxUJ@w#kM($K=wrKV!)g9 zqvSeu9Q~QrkDw>9jIDsW0l3*R$c*QI6K7U-do4M31_=I9&Ci`#mt`WMsh2SrcSwf% zc|_Xl`nM-YUu-+xR>A3X^_qYD^s`aOm`cKPB<}8AW-wIyE6C78rzCTCGBda-{4tUx z{WFzZ{B&1W0G6czzVJNH?m2-E5rHj+(bJT-L(!L6k(1d!v>F7`cV*fyB%A&EH$NTP z8b)E6@4~wJcHa}{$smpG2gNmJUG?eUR4pFubq^6F!q8c(Cpd0MgbnQQ^I`fo`$f0r z75@B%4)#!YhVMVEl_jIN6}^3aYF139=ia%;<7<~7=~SMmTA+hPM082f^S5I?=TUM} z=AB&OS<5Qg^)vkBrf+yU+sjALH&<3;N^QU|o(tW@Z&`6ART~G09`@hCGVFdCkfy~L z1f?!D%vrQQfEK91Ds)6l03&X-?!vxnRFdG9hpw8k>qwe@N&9vZw3(PWIw_aTL}u=N z$G^pw|4&%OkH%N&HAa1-vchOfMAX{zUU>F&=!kzr1$2$8#ZzABwR6&qc1|uUmg%v% zCNM4{-%lJ@iZ^zf#?@cAxJ)8ADq36eo+^4XiQSGC&85Wry!B#5Qu!BBM_=t1jk8uo zy$MZydYYjgal2HvW2 zqqqDj4ciAwL~LyEWy3*Xku>kg zj!uE?=%j5!3cHw}Rbd&# z(8jW-gL!)BSNSn0q z?oCqr~qal z61T;=@PU6!OcJKscEJgBMSy6#+E+!+H7R0DpNO9Ch1F$&Gg(HBgz|Nf2@!zb4R@x| zI-n%R@XBTvi48nxL&xC6E41g&1O98YlPIOb-l9F2{Y~05cR?$G4gq`e^^68T3{ACx zJpBEuAaIEo93TCr|89|n;;O6J-X{Lhc@&fk8;pw9CnN$=M6~Vb%2fswSEh+4FJrsm z#v`TwJC3o!i?m6BHi1(U(BY*lQ#IdE<0^Klw=Z(K$g6E=@7vG4_zhX0OV!+;2zk#< z>jOD4kZG*&E)4W&*R(`}Qjs7pNlwP{fd}PeeWd#OLeJ%oUp$J`5_-d0a*Y5$G$Cb) z9)oyLIGCzg)MFYwbY@5TJDTDYT|PsQYJvV}BE24xYc94=-CO1&GtYQDQhylkIPS}G z`$b3}d7s;25puPSr2<_9Byi5bC%v6wmUN$(Ly`!V)Py|@>B**PxL{$7Th7TT#o%Z; za}2wqhalXc$r2I&Rr!Nvq{-agDo+Mio%CF8q);}c>1PIpWx#)K>!E3w05ap(S_yvu zI;0Y0^dtq0x4ncg8u32&`MU_sLHB#nd-@r#izS@IGAT5~sv6FvDQrB2hI3_-Cqfes zK^@>z7mfy1weh~5RCFiA{~A$Oj%r@L$5%9SB!c#HG7-5g;wJ zGfK3XwG?!Y-WRT}$%L4gl9ff%S;s`7AkxcKzBz@1a-IA*CoMmtGayPA@5+-g_91i> zfeP5J)$jzibig25r8w?dN`5JrjMon6rj+Lj=~+1=;IP7BQh!qO!~isjtliBtHx<|- zG8B327>h#FsuSjok4!T8T#>;pM(ozC(`H@aN#OtE;XDiPW86~(O4xzu*^DAJ4QEdA z!dzG;nk|bkeo)1(?^#Q}6kffasKKO2BN5M0%V$XTN^fkLl2EAJq|QAxyjZ7*+ubm( z2xhEv$+{ojo7Q$3cmyxW!vyqppBGn%sPuXAw;0FS8!z;ekw%1D1wpbbYJIU+VLRb*_JBQBUMJ`mAT{}3 zIc&uX$GWH^tg;A^w{vq`9Mzsa)ewD8gYZp_u(mif)M0Nf3|<{Vt3)R!Qdl$e4Hi! zl-A{vwopM+B?M$X?{3Dn7oyUf%^U&E_;QU(*LT-;=_tPCY5Bzay-(|Qkx$B-G1%L z`3Squ1Z{|9Mp=(FBVxICz$m~Okycxk>wHxb8_~q~S|(;N+aA2JkwR-j-8{uS9rs&p zt(T{zlEB>$Flo{1DRR2UOY@Qf1=S`S#TKI&YR}<8aW!J!ci9n}4K6ad)&8x~OZPLT zk>v5&;skrjXzjC7It&4cMpb+CHoo=O-4rH2U&uc|olm15Wrrx#WN5`Fe3<^{Yg1F6 zwCzFq{%OR+S=ydC;gHjR7h6p0*U(MNy4#CdpAkWNfWJSC@G)%D(H4<@GV+J0F&7G9 za&7w%cRgQ_w%oO%3&k8R(}N~y->AW&A;Sd%|K|E*S?lrcAfcE^ z3&8}aeQHy|XUA>m5%jA_%K8gz{XT>Ew%s(fi`R{}j?I!!K!?^61EAF*wy0PC_+m?F zE*tL5dVy&aJo%`t1Ng%{tUNQEI)5-&dGQ3hY3=%V8DK>mR{Ug(vL9`&vESbKd(L)6 z*bB=)o8$F53bXc&{ZU2SdOyN0wsk7}SBC2RQ_xZXU`r07Wh1q6ZKGBdE~k4#OQkVE zlSugyQlo$-sO+j`)3Ej}DZYK2UUkRm;-tLl#)Iy*wxCmN5hype;pqQ9hDq-A!#Wmo zf#nrg%#%VwQ$v!A{dV$VjKEtfov3bEVUVQm$4utmq|>bT~Hk#~a$`!joo*_Sa=z@4+b1e3c3kGVcv zYdz3sM6WI5#p&F3_Z;;Ly7DYe3d$B`fiRDM_qz&#(OP*owuq5V5`XaZ8$?Hajw#zh zzmFHhc;#N5Kz@dN*z2uZQ=o4X4PD?Wavmn;r|&fY`Wb+6rXgRV5-UGTuQRz1_N<+c zUhg7To9U468a)++BSuA*EVd`wCqk!PS*uL+ylPFSi3V($(@WaKPlpnV^vM z05~UijWqj^*U^u32knGo^S1*v)7A3d^YYOtHlG9|!(kN*OkwPh*U^u32JM7n^S1*v z(ADzP^8Zd~xtX!*_%mdiKGtGLU^BaXa{G9_sGOrg;lYlu0~}f@QLC~Jy;GpJA~f%N zk`?4X92&kj;YrOdgF(Kz8Dvmxf>!|g&&@AC{h(lU1xaR4!q*@Lcjie;Ar-VA6z|hI z`UckBgXraYSQyZl{+geF(UuQW%H|9#rVA4tIVBQi5IJM|wSinSctp!)*V{$3X|3@? zw8-6|R&lBXu`Q@?_E!Ga=*3)wdAs*D7C>2_xoVnPrv3H7W$~qN=1JK&irhrvx4L8c zd3VJa7_d0TQ+CM@+=k&f2+p!vK<7MzDT(ann`;+}b5bMp^%P{fj0G48nS`p`4B(1RWFclNAS-z4s9wFlkY?lP6A-)$Hg@M3Q; zKKJ3~jUCl9IiG91mmG`B!PTBDa?3_lE~4%aq$bHOgUc?B@1?joWLK#g+G6R$fw{{> z@)2<+Wl^9(x74LasoP6PRD6LaV3ZO123(V3A|r?j^y9&<#tBF+va#9C6dq2dXVW!g zwQ(Au*;LVHinO#QHFfFbx#N6e#5YTM^P%}C-3Lp~%Ye_t!b$I3C~69dr*s3!9Tx>v zCUyDAA5pc-y~$IOLSK)daL`7uTeIiG`Y%Di44;Kf(m`I_iRt7;!aD%F9_r5+6Tg`) z^soR@31eehzNiJS@COY}=7Nl`4I*{`8v8M=<8vFfJ`3v&HhSYt*x|W)aD^LUB%CEj z7ttAVHp*C3x00U~e5jmnY0+(kxm5AP!;IBb5fJLpP>2YIR%3fQRA&;Iq^&HAamCb* z(bHXgD3%|zPx+&gyd@7J_5(|9y)(}1_4~{Y5|(+Fq3KS=5XfD;q`0}D=d|2sBb?Mg z^f@5r+-T#P;*S8`AlIrp&g=c!Tp9HyJ3wMjV_iur)TlaP>$2${dG;(~o)2yyj&w{7 z5DFpS62}C7mI1xKbyCSXj1Qz^tc0EAn?f)c*(MMqmnogvZ)wkh!5ssXnl0$0yA1?3 zY1NtX^u=UbOCrT@`&<4nI+ft)^5QIm69f@7ewEASnA|RPLgoL=@FV$x$+9TDG-k%h ztHt3kLp3Xyr9w5^Gd})bHRP-%C{;J%M0tjKG4b4KZ!JT(Q z%5Pgnrqf!5gYw)&g+k&h1|!;i$HkG?Ov3#liGl%B&ZV;i%m$Y%P9>HO9fl~Pyd$f= zW657?d(-aRa{sh%*L!yZbW*1J@KCE)2u22U4;l zo>U;|u#QTR2Dew{Ct}pp;>|*1yixwGdihE+hJnAlZfaW_pxJdNOSp1%G;w$~#cNhl zt^E7Z_X|=M=pCt(-6}q63U>fAmI!6$L`?0h?bKz#do(K=l&;lG9u4$HIoST-GdN*F zm*)I&^o#j}CBc-~P5h*f#W)LX8KET!w-psk!bYwNlDeXy&u}?qonli~Q*`6>n+MnU zYj1|qel%ZXj20|cYDP>$`$kEc(HhYiz)EU0Vw}$n=zZsJCE#z=s|lQ}TjuOvgL3qY zU(cVN2$f`^2mQpTl4PNM(UbQ^o=@wgTr&#ude^w~zmcNdTBV1RRh11SZRoh|sn} zM@4}qn_#vq$DAKekf=5~ zHDiC{M^DLj8AKLj(O!u3*S~DF_Id*Wp(RV{^^PU44N*#?n)JaoeJ2y@#fuw5;V!7f z+ybbvyIvwDBt!gbxs76;ReK0&s#V0!&5uEi;zJ1^_T3v~c^Aa5IPM)$@*z-b&@&l_V?ALFO z*v(ipvjE;7dP`H_;T5ukK*ittU}|zQ1C z=OouzXReBrdko@>LY8aQ&rPAGb*)_2mEDT2jdNgCV9#|$d)oYr0sfpU_P+KtlSZ|n zY)O6oYPY!`2p1nC_Bh7a+R9dw4$0*)I9(_FxFWPCt%{k>8u1cy@=8Z+=Mx_sep}`y zaD>u7ar5%8i*5?n;Cj)O$Df2Vjq#(R4irKvLoTp?1T1!`ZEqHPgxS_S*&~Tu8*sUH@?*^`|*~>y3BvnAA{uXL2kBR!GF=o^>{xMxFI= z?mjgZ8^=EDl*k$bQ6WG>;K?abeN^8Htl$6(HZrlAMsqlmX6#7$NFb1wEoH5R0S=f! z#(G);(lgUqoK;)&Y6OOe82mVo41XF8j6H9k?T@Y5wo_PS^@g4VHaY)zVN_%ZJ|?1W!}!jB4dSAedEZr>ny z8%4H2z+y&%O&Vlq+cylKl)GT77(j}v)K$oW7@U-k1wqvT{5$lue#jgb6$8{fdX>xz zX0YL!1vlgG9V6Ym4}D*YxbnxiVPtCWrBJ_I7aNnXP=^u2Gor7X2YVgt1K|B1AyAT3Bi^7soY{gfj>^eck|>uh zkGbZY8s>{bau_H_VGc-Lr+o3iz_~8KZx7X4KmIpq+Ll@XiFDcD6bBVJ%Qz@@MzT!< zPET7v^h&XoWhp3?kV|{XhDL>#BUHM+NGL1{g}fih1WmatO$FfJ*@Sl(VT{6sewA;E zpWUUjJ={!T09Wv9!cbeUO8nkT6M#&AG-P%Jvb$FdAms0hAHQGK;-s$ zQ7=&cv_;rxPmZtT+#=sddw-sazN|tlU-FcO|M%~-&db(y{G%X7R3PD);Og#ialK$K z<=RS>;9VO_bSFdYt_S2T?${za>Fk%9Bhp^`K^s^glq0X_b$et;3}Hz?)!zJMZkLuU z;VecRYO{hV(j~hgE(YpFVi%xQ_^^@!DSm+FZtmFb!LQBS!1;LojCs9enkpMjleW}v zF?zch39R3VLpPVnZUpz|gv_^?r}k>>@*Tl4dURhni14;{=2JSQ2B>N1u~4~xAEwL6 z#Ut|PQFX;i+7A5=;FO6a#8IhCL$FJtJqBlV-DV7 zWhLNZr*_o?@6^0AHv=K5w_!3u%jv_K2MBglowla1DDyfn-l&NRqQn(VL?_1$dY!G+ zIYk+pN$D=C+CT0cU^an<^5es&*KUJT&D!?4VOOBr9? z@Bjg=LspT2V<)cF*-u*GyIDjaI{$dR8m+c6JUI}ddYav~GM7oXaL89MJ?+BBID(hi zUP=}!#Ywqj#vap7QqJ@o9;o(FYxhS0lgmDmr)E$<#ja>X>^sWOkiwIa(CR(&cFhAn%p#o)^%}> z$Yffq_&5Ncz(oYZS0A(~u~^AP6XwdH6IToQ+W=}Wf?m3SC05F zWj}Xz2`P6L_7KUT6E(72*B+R@_|LWf6qab0bH+sH&S(! zE>eRj0;vmNYE{sMJjkwV+xxWtX3FTS-F$oR-kK0Q9&jC5EUY3upnnDXn;>HfX*^84 z*TtC%%DjF9U%ggfB#&9~fAkzz5F#f)5$mrUT(>OZc$t2lJpHj$_#|6R3-dRn&#!1c zDLv4rji{D}Q}6-rD1BE&A44MV>gffol$di;`jl3=cui4q&!edXU3fvZ)kpiQSR%&N zh+3?L0$#TGyp8lN%s}0tB!1fjR#1vPm{#9S!hnKSPDW@sn=gm4MDPrV?I!w9-NL88 z`w%6EOlBLH332D<>^iwExHyN;{z_WkhND>Gww_yRj|Rl~lx212u{5=9TEPyTA-JZC zoA2CM(Sl$zz66Y006&_`%nbF0rZC%afgb>efkSgmCW1H+i9Kb1mVF6W!V>`S>p-8&f$3S2i5FAx@$zel)BLCcPxzdPa1`72GCpd z=^Rg8I_&3@2*<7a^vvHq?{d+?UDzy8(B2l8KxIW-%hKF50x1B-f;I?x?VZ)plg$P6 z=^p=td;R_f$HCqOsNRHm*$}~6BC~iG8evf`A*WF<#Z)IXh=K!tKin26@MFtZv6dd) z@#p6&5lkpy1&`MjkRtQaG^oFCtbuQe`-5vhJ#@qlkid#8VJ7r+^$?aTCra6ns7BEF zUF|`C%P|4nt)T_xjIM;t!h8?>@=>EBlVK;=;AvOU;nU+s^2>v)Q#*3aNZn(}KMte4 zDXIUWuX$|yvDN;%Q@)o1YEqBbJeY=?-3-d*)j4Zm!iKLO{GUh%gk+6qK>0Yb0kbl{ zZz5xBH%U=vdFbLi9A~3cR&ZcI59^wVIMPkeAR>@6Zwz5h+Yig9#eS7D4mB}XiTIy_ zx@LCwaUwYqtS($Tn~gCDF}j*216=oQt7*eTTjFsX49NGZ`tN_rQ?&8m^bfuaQr1$A zscI0x`MVuNpSZ-9YDPB;+F0rM?)Z^)wb+mAZ4C#n4(8e^{>w_@&*#>V;O%wpVX^R( z8isHUXv7l=mg^6#df^}mxZ3Qf$d6?H7XdojjfEimp@ujdxk!#VsdhYIRyfHvcD(HV zfgNMTc@Cwr@llIeHav)29MKnFk_|Qw(BMzR0C&-$W@qljR`tT zAdS($i_mRqht|WrB~O=cbwInE!z4Cc<=LvY^Pz&4157cQSzdz~q^v=Fs6(0K^4xB4Ss)5DvmNZGrO*`IyT9EhT2uk3-u@PN$kk zwSLCbF>Sg|nz3mFK|tqA)MP_nV|T7jXKgT|5i+&yVM4NuS^$M{>5K8v_`Ugha$10u zugO*g$63mgEeK5XdA?G<#_&vJI9t|U`g#W0EEW-@FwA;w(^mSqQ171{H{3v5Fa1`7 zh3sX7;F|_b5LK47apKnSGXQg6Y z*FC4!dU?x5Ie;g(o*t-2cWOVXP%e~CC3ytcPKeg+EfBF^=CmT^t{@saR?zbN6?u`M z79LIjjuR~4&a0J)7Fn)^KH*zLbO42n$Rzl@F>)zLPOK;~4I>>eMQTh5aSX{YXV*oc z1cp*A%Y%_B*U9KT44M=Q*J*2L_kk4+&~7<`R7mu%4Q1`#$9%m2L_oX0Lix?1`KKem zq#}fF{ueo5)zHVCf44G;<|V8UcG1AGC08VDR!lQDZGy5zg>6pe1N~yn87Aq z*#eycsW+cUFYMt()7TS@(Zc9$9%iF5E7Euk#*D2wMbFaa@{Q_IDpw3fQ`L*RVT5ze zJ9nqv^OYeIyf25nzYP7=&))h0@swx3tQGLNCf=X{qi8c;42*3H&!ZKJMKNm0>pUkdc^lZgAdTA@7G`O(Z=qj2 zhQvo9h{uY4kZe8xJ7wU~N;0|Mr~3FRj4k{;>Dj04w9XKyE3)^pKH+?jLtB~1OwWuQ zR8?m}i$X{pjT%qQ#GXh_<^w@i5KBcA%~%A%B(L<|G(Y-|%DSRXm-;5H&6l2HN@SFc zD*a4Wy}^x}%p|(SINKUuoE8;R&YD(oc&#wFetQ(x$8TaoM+H>%RG(#&Y^q93D3WDj zo`MzVne6BU(qfR}eN)^Ln(i1gYp@a74ihZ@`Jc3c)-q@Mvv}kdB68p&%(lX#npF;? zjdXi*g9u3F%Ss@j3d{qvQ*2i$v>|5`cjv(-u-e(I4*<0ndYc!&dWvs@A`T%UC($r_ zwmk|T!hob8MJn<2Opw9YA9G+VKQa?4?Kq#>OmgP9&oPje!S4T+3E&U_3Cn2mhe+c@ zZ_>gVk%NVym*iVaI%RWp;>w~j^0&lj*gcbJcYGp(l};18HCEPukA_%kWwKh-4|;7& zDT1ExQ5Qch_1KIMc-)KiQ-S2!23Hg@$s@}e{(w2n$M7RWHe>59#Z_&2cUilJD-V89 z!ZOwKkChp%Jfx2Z#4I9Y9@eoq1?X0CD_~Z0P51^coU{mzCE~CICM-R{lvapo3~hz& z@hy76buT^=_#~MZ#vomn>1gHsD^VvWE6DslA4YbW>Ms{!NDhzGhyn8XVy%pE`N`TYVRXR4TPXXYmn#MIqE(nlxw=@h~!^B-L2^J%KJeK*e!GF)Ki+TA+N(atnFkIP@ zqfHz!t+b}9WMco|iQn#%9I@cHbognZr#J!medIQga_i?sV<=u^FW}}`PR2+#L}B8U z79s!WUA1_Pqo7{KVPI?>>2!g<|GHv*)jR6 z_gm(*mxuD5cQA}G5=~+4!$5I1raQ97lV-2FZc+o-h=G*YzMd>|i z8Ji2Rxa(KbUWG1pD$_OI>>~_3dbZA@+*o{T zIJ8~T5piIsiF$T_Nyw72wBGOF(lCP*dC@_;0FbBnIB^e2IGPc|y4f!@b2jN~->H{( zXXu*>`_t3D8ehqPO8;|wgta)+R=@l?+Z>BAe1KdAn)yV)ag}`z*3k*fO=&uktD*Sg zw0$x$Wa`$=T+nRWTF)!Rrb|YZ5PHsgpphB!z|*ceDErwPV-$&dn5;sfPw7R9j-_lI z@@AXqZqdfUjjo%&_rkY_^XJ9=j4)N%B=GOl4L#harE=ArZ8cnZb@CwE$IhpgV4cT4 zp={Y2I)iv>=4H(FVUCMH2YCcb)l_zR*D0V?W_Q(`rtuK9s)E38P$q>@Te{W_hZ+05 z^H9R#I_^u%`sAE{h|A5koI#_TIH9(q&ajMd0Z#K&B;-W9uS10)`36cEluDU6Z(t1Z zxz825({#XM+;vOWQ;f8;?eR#U|4S6A-mWXX6TtTM;`7y+ACvq!CNg-MP>jEge{{-Y z$15cB86s;-^}N$Ml;_=bSu8*OG)%hlWf60XVI-VjK5ePP7>m0V_oWl6RlPX^pplO+ zWcNU8!HB-)g%DCrcLczQ&o+5DRGjCunKhHcXD#`P@2!3%@Z|OyB7Cdt1@;eS9bEq} zfVP#MBu9T^X;Ei|n_*N2gEHtzQ(!8drHXnbnw+eObY}i>&U%G`IRF zwiFcsqQHZSWn9{Ll~u^=px8h$Xc(kl$vZU*Nx)iGKga)jY%#u?!=mUc?lZ!fOd%{3 z^I|`WI)UywI%XcgyMhV6*w|Kl=OasIv?LLUvgi{u0k%8f%ln8L0@mt`L(H z;XEoiH1B|Vh9*u}>=z}o*3>vL^=MhZY3dL?Trs!`kGGXD0@zr`8B-V-6_kIM?-^oa z7DcP*??5UG#o@=H6&==#7{+0l<>k(_$=KIBQ;MeGF%eAhH{vo(IA?x9G1 z#-=>jhEny0BcE*iv$HW$v2et&=b!RfOYK<}RiK?BlJ8EEz}xS_iJvs96OXUM!PKaUQA{hdIUY(XUgYkrS}8aIg~uG6;D#CYy-!Voeph|gy}-}(_3dSWSIBgSsMKblv!pml#mZE#njI>9 zyheQ7^yX8KG#)W3cRzuhQ*i?dlgb#+{SeWI_k@g=T;CPaVO43O6m^&HNH9>CAB1|W znobWFThv5V_y5IWDEBU+{e^gF{h{S8RZcrx1w{VL2x5(5A0p#jA~R@h2gr} zJ4r~PK2j$pe!VqE1n{l^GTkUUa2%>=(nnj-;U9RAJU!^nq7Mgg0{(%e?8*dAbzfAp zN;DBL4|c%?xBDQwkF-f3p={8hzWP#n)E$a^=7C76mUWoWP}VKD`#NVj1^u}N?^!VV zm9{72@8Kw zHBPt}B)R)C{&zk&hNRe`lkE!}#2imP2r6Y(?Y$GO#kEy&{n1E?IWqqx{jzT5EUPny zcKEpR>H(8cv=GCV(4ic7DZbq>9sAm;|aZj#(11rOVh>B3kHJ!fY1iFs%GFbpO4=diUk|? ziiSq8l)_n?v#AwS!H>m~^(m!`(BE>%I~v07gGE$574-G7Cm02PP}pD{>({;HerYqW z3Ij=uf0_&$GDu7PX(OWp)ql%>nSFxf2<-=D^!|7Z8R&n|KDv=lOJK?x-DYA7q`O8m zxY=i?@}M`N8YU6o{_jKNFcTh_?hd_vjzjpo1gcc z8+&m}KV{ZHLLXpFvx*$jl4o*B>6vXVAR4cWS9H$Uan_&~(&7%RjHT_}Lj}L~3SJQY znQG=4v6_Oqf*C0O;@Nk9NMYORdfU>k#a(tlp=ruYS{E7D_ON_a0vf0CStat8`Y~)WtvjpaQVsBQWa={0)M-Pc2|nx3pJWuQJxuChXlQ z$J0R3WVGjYzVdaM46eASL6**WBvYQg_{_=t1v$?y(cz~)Wsf8=vEa><4KpQLC-;zL zAZ1bD3Iw3)Tyo8t1_~UTz;Q`QLTBhfJVzcB((<*le~cA9{c9R)+7 z9V-APl^GPh@@C~gygB@OSnO?8BB%_RGymRzea;$K_g-zfe^-lPm^m#!mO)23C}R^7 z;0mI3mQ#5$jKRsPVHaY$qKt2nob0NtBA+#-BnpuGJj-8g5q%IB1w$a|;H!%{_&O;o zeIU6xpIv3R>Q`FhdFN`G*JD(QZsmf;WwDqD!P<7e9$Ea#a_fJWLJ^R6XxYsDF`!8G<4+dUAGmiu!DCK}sBTD-)c-|JItax|kd55fFYzl5#AOln!@(kb1gb+;+dxD0#J zkx-0D6gi3`@UThTy$CW3;#{V=&?9dsXv}7@0UNu`JxJ)^!LDjktt68Uw90c@)*;=h* z8?M=Uw^x$^1~bQEgA-F26qw#(fX5{AZZy+>Q_B*{5%0OJyILcZ=;e$fT;n#wXlGHhAmBnpnSAHS-Vn|+_^qGfIkkJ5=jZ0m6RsIiQ>X#A7izpq z=il$FdJZkuF*RdzmbL|^P@XH+H`F(k54{tIEzu;Gac?2*VqW5t7aZetOwH7b ztd@+cMb(YO(*rus5F7=4t^N;oX7>x<52ixZ8wdk)30aRrHK%|^Z3Eyk@g^fagOI{W3nz|Ni6q_mA>7ewY;n3@J`ZChg{@lWA%k$KPI@h1fJb9c8 zu1G!WYAG%r>rEgh2;a%hiv?KuW{6){JI7erkJ#T3F9EqeQM-A=DWJXjDkQ5QGn>yZ zTs9R`N$Q*60qGBV+1qh@IWYzkr+Ia5PjJN1EY|U9_;wyEB^C{n1(n`aZB6rOYQ*D4dHhU!?2Y6?`!EBR^=6L`PP>z7i zg0OXljw^Cl#Atg$>MV;JpB37TIcpbh)W(ktBxFk zmwKdz;V9Bf7;qzP36>EgTUpY9SwDp16X!3`+yJ;%A62Pno@2dvq=fhBDOVc_2#qZPe*rEYCzRxN4w$OLVnuVIIF z9rs@0taG|N+RcpPnOOz7q9341$(|mUqgJm>Eyepanvfm^{2=66B$jaf)jYi^!t@^jVBBr2R|wsuAw`oo%t2v4+pYtV@)l8pz4=duFIhO z3bk9w>?W51Mur&u3SU`^wK@qk7NL|#6=w(CL?LAYutZ~XxsiBDKiHpmO+@@XLD5lB zJsMy2Icyd5|E}PuHy|`b4q8bUjBcmXFtf<}R`{uz0sk0N3Yn0Afh$Z6c3qfFx7;_BQUQ zrnZK)G)@KlWX?de*4&^bwY%HeR2fwQuXS==T5Q;x2{1lvUVTO3SM$wa`7a4m0SE(< z>&|8Jt3)s+PvQdY>UqDOelAlji1?~F2rn2rGK9E4r?fp}?IBwht{;7x2H5Rb2^U)t zd^&=?I!up0PXttzeAH7vx7|gCc+kGFFiRbFF3V{8d?j`a1s1`=rk#g6+bthJVGxxW z!BNB?1B8TMpNOW6!tgK(&=rV*uy9C)CEzO92y!mp9m>XU7x>vaJ^Y_b4)s$B#7k}d zXD1+z=0LAj=Sc5QDH4)0wB%IMZ6eB-wPbB|+r6|T;H)hHwpUfcEwU{u#+t{Vn#Zk4 z8H!WiSc#DS&Fg93KM(Y|(XlfSCD%^B*9*XIb~{wn>hE0{LbdIP6;cprL|ETPGQrD2 zCL(bdtb4aB1=m)WPw@X}$XZxLOt;OA6MfR5d`HO`g34>*75B?^4%iuWTsVoO=Tx?X z%)WgHG~92iENp|Q`Cv!}becayBe&v@cq_CE;W+%@BUvipy>B@puO33ToRT27Cye&B z#CM&0)i&-$5M--QcR}M0r*1BLn!xKIu;%Fh$|n8jrE=eI%9yOwx!ft`w^q3|HXRGD zstGm1KlFp5>#r}jg=0x}o2z@DdEI3~Kz6#(C?06Z4#!n1c81u{KnL_hMnSI*vMD_b zOC80ryD1t=xY|c<_$7UrT1)?T^yWHwH3U8e+mO5hnoe*`?MapmY6$T(70@M#=y@!i zr$*!mW3n@}P5}Fjq#(#Cl!^P(cjC6G?KZv7JeQdW(zV&1GmLV!f(f#g$c2W)mzK7wr%X z&%b>alDyh&E8ZT;Oja_lT^VGRy_OYjZkS+V=~wHaFzB2qkeyBcsw^Yo7ANei1iO1W z&Qw+zg67=>E6j=7)4&$gXLVN8FNIS^!O4tF9EYmEUL05%ES$t#3NZVH)>KjqVFCX%QHA_bCzT1?R;mumIa|W0NzU2?UVaF4 zRd~!PrjJyI0?9{GCcsFTEg6YpsO4teYaSU=!o#7E#g-jgYplkSTQPvQM!`?_Ko;H%@*r_Qyq2rE^5{ynHXB6f{dl!@@kw&RyD!kOtYAyZ zswHcT!guOKu?WXwI#5s8WWca-dOsn#oMbNx8Z1R0xqF~@-yfpTlESo20%i}EnT@j% zIJ-N6sf~o{D)WLt<+D+9sA@;o5`8b7o8Wr9z~YJ|m?X8;3=c?bBl|!7_Ao%exWh%_ z+=WM=Mb*fF@wsZK15&%=+lok?@0@O61?O;f32JT)7yNtY{snJq9-+~vxf`H6MU?vH zMqI1AECP4z_16H%i#x^Md@dHBvB9F-ro&FyFZ!NQ%NelNLiDYU1kRBlgeSodZ+tHp zhC^Do{3bb3;I3co9awy^Um)#y+*`Qv`C<|!2ZuT9)}Zo2ljld?3UWPX|NOufr2%th zow9raw)}UH{fb=w#M|Sa&oy&K@72V@vXOa$TJcm|_t{nV9-&PUA|G}~<}woM zSCxjHCf`^Qm=42O*}$DSNOGkQ08#H25O{2Dk4cB5{;=)Mh>=)~o=)DaZR(F9ZkijT zCkOP7@AWfc=}=+Th8qWbkWv8e4=RRb4k*kqiC?G(+UF7pGNag)CPqnVN78g*`CLCXv1gy`l-MHv%jGX!Qm=ZYVmGk}<=OScM%8 zGeJ~i@e=2(zbr^D4j-h|&w=u!NRDO}(VT!6YQFf0Ja#1NkXV&MkII1LCdc{sw{oBx zKgj@{6YEp&2kBlj)G2iHXbF#u!X>%6EoLuNp=zqvV91WG4TAe&%lFxB@50@PX*f8;f?4b}#RBAe%QJyX7>4x}rUgkL#wh>W zfpF=IOte^6DIgK40-M>hckC8{%S+;iIW-d1E_megVvtwHIFo5q?E?`wlw0oV=4R{w zbZV$s6b(3%X5h{U8VP8}l~q5tCQv>nQkmG(XY~Y7pp2OT7#B?)66QEl9W^{{dD9wg z5Xmwt=(tQ%q`7J`$lJW+ z`fDv61Pl|8Ze_t-`ndmqId)Ky82yRrOFPfflNzATQIw&PfvT^=3lpT(V@J0lhGmEfS6qISB2-NEo}Gh7pe^w%LnS9s!_umgYe1sCsk55mYHF{qE!fgQUzgTEb+ zo$qT2h}h9=8PH?FDbB=BObn@Ubc2p3@t5ux)25Mvg4Vm`EpKG*Qi5Mm8sE(qGMA{I zB#oU%yT0W5EvWm+IlImk5`WSW%`3zi-6%=?W;n3+Pd;xHBDoa>VwDfhj^3+Hfp8eU z`1H@6C?_|Lf>c8a0uNZg4t$98uh&W)iQswy1;-D=a=bZSNfu~-J@Wzyu$g zYu%GAAkf_Ac3L7>eTb<*|DwR0Q=i6KAMd1W4t;uoIAm5xP}hC}ye`E5IQ`~MttMrW zBdLDz)9e7b99AQ+O~~bi?OWIv!V3Ic@87GfbRdFTYB?*yJ+D98w6-tME>Y;5wt=@G z)fSvJYej`P()V;A8>-^c2004e#&@{s*27f@iIqWhA2K{D^65EL5(i4d)|l19NS3wW z9W9U@OxW_V4wZ2o4PkogLbZ~U3N>qzEj;a~(ONm0g&$27q&%cpov9p^CL<-VgrQ+v zaAzTNcK!48*-)bE6BRNC`=%y1C*>)i7QoMq4v^VxrC)7z`mHSy4iC`% zhHVtgaOGM5gWQ$uiwtqbMNnDxR*>PICNTBN30gWcEubFMgcIsSGF6bsdPEdz9boUD zE0Ah@{jW;4}bQh=ZYK54PnA>g2Rle){75Pn}BMQ~fZ3!%h2B75VD6}KpN z<4pLCSW+XRWyG)!QT6x+-!J7LJ6y-nG!Wr0MsktlcO1d)z)rUJ5?jARNx%J)_mql4 zUT{r?shk+EsUhC?ByhmC@#}7+jdVD)hHD8B@$>Ey<)6yrVKz%%*d@V26O#aKb+1s1 z7U=5I&1u0w{T*_9E92+?XG0gZCWlw-O~`rZE_FXjy{RzXY%yhz0ksUf;C6+1 zper_T*U%;q89&dPB2xPRYP`DP!zFRmD~abFJO21#$_)S)(M;lnHpFDvfYBysqYO+S zh%-tVa#q@;fVzr@zgb7A4Ek@#eB^FU&0w02xnhn{78kUjqvJASiwbIknDE~vpsHVr zl6oTc7Xs9Gf~$=TOxqLC+O90s3rsVhIHn63cnmN;Dg+O=De(WfE2bvTB6M(lu@^?s zQgS#8;;H_4zc1kg@z=kY@NU7px&DhL5rV2q27Yp>q3X$Jo3WR1ciy*WKg)|T4-YWP zV`*x6Rv4;YiUmf`Cg88>i9|H241^P} zaLg5BGgxB2M}IdFfL^P7G*LH;#Ljy!Y#MZcvl*}{bdRC=!#0MM?;MAFv>dC3@vC(5 z?~l=3iFC&y*I5L}LR*C@dw}n^3RvS)%l-QfOG>O3r721r?8Z%_Fl}3SvP5?Tg}Z~E zY=TFC4eQVKzbRG`*O2%s+_yV)Es!Xv6%*veu$BM7C<^i}oP#dSXInV6t^;9fi0I~c zM{$G~B(z%;?!u8;`+5ZI`|`Ovr->AEquxq_fG}L4*yz+g?0a|(@DpQ=gqgLO1)fp>|-s3`wdS?XQ#xa3C4a}_443nK}y@X?M* z+jX~?CtV^N@KdnPTAU||&)M2b1C{3={cplKvZkH!D5`5AKtM1>jR^tqUN9wM~dXbGcm=X-fzNk zPyu4Z0v%>RpG&Sp86)$nt@y-BG;OvGhuZY!9-9@d=S7GVYhZA?T~ZiCY42=%!;YPI z)zgCZQ-KWfcc-!prv(bKg1Tb`2<*e5MBb5Xn{j$)8i5p%kEVb@+mPE9ntA(I$}N21 z8=R`Q`y7@wpPu2*BOj-C3#?H7`mlX0ARLd)=}gcB7kpuyzhHu; zt$w$GB*i@<4-XD=eOgE8xj7|39^8?D{(P(INU%rh&ec~YSN>ncld)qRa*wex9$02D(d(l>ltK$`mK8>W@0qQBC9)W&U6y(^B^$+xp7!Y zsIZ`h7lPp(a|Fe;!DcXfzVOo~Nm0Kl{qK=o3c(?@-ft@?O+tPl#Vf{70mCTeDyEYf z(wLQj6iwiY^o!zbV8itv#WEq zoKD#qA?a!pP%2WL9+9fSxC?F!jxcjfa*Pkrh+CKOma`y7z+O8;nlF@4W84bmgW59w z?N6Rjz5-0+-83?E1*WOx+^w#Xe*3RJ#ZZxN5dx0a)Sh`*&%HWTjejgjc*VH*4+Ebb z8j@pfAZC|gvB7tA5%I`o%M{3945{D2cgkq;3-x13?$!{ULw&9Y!R4?aA8lKaw6o`S zN4c<16T_7zzCQ{l%7-Rv-G5hI@bCZkq=$bD(*E(Jm?P-OJ5>NY5m!ZxWE;{zx1ds$ z2PJB)cHQ%Gr?pKgvJ~Z5@481dF)nYw=q+_b7}>mu8yK6TX&XOwX$#9_0QGDtU5eVI9-O8l<=iTStFZ-f zkn~_ueUc)f;X6Oh#i=Ava6^7#AwSPB2osj|#(bG;B0?U)=J>xT28q?qAzRwz=K==~ zd>|x>6AfA$#k1hgR;}2JRG(COo6c54=TI9&?Yz?lb|9a%w%YpGP8hK^xQ|w}>Zf3! zbQDF=_|uZ`Y{}2S1nG6phjuYlz?`iXxP4?Tu*-kuu$MSEHv+Gx0oiTLsQ-})(t6Ic z)YIIqtKgC&2dyczZ0J?+MH)SUDSgfB{m>98CJ4^n?i-Y$@63-NisUrYfu%R$-ZeMCt7J06>odvWW%OdkaS$>0 z9pfxB9eN)7ZUs>;O!4vMc!UhA-}?OBqYrQ8@qONM0|Q~=cX9H9tv1Z0-F%%qd@`K7 zi4yyFE40|h)d36mlaZD2@4=?tCqSDl(}$Y;&EOc#kWvX*3pv+ksjW~?9~tRBr`m|( zy&tD3Z-+?AQ}#?ojo-ciXu(oFEQggZkViv#>l7UxPkEa;d^oLEWt|1aBs2iDN(Enr zeJ8v+(%x(H5I2mC%swXlksXZP=M!%pnFZZGI4FMZ#S_C5jr`C5VoDlCl2)RPBESDRRY#^q*ThksN{k90shH4hKsTIs zPG$_@%ruFR=L29$s!x8^*>Hc8X!a~cMGp_AxVt?6&Fng(0VlFonsJK`xHI~fiBQ_% z0#Lr{`(y-4`O8T{PW42dDm9=fFuKf=8=eX{w6P*Ob>5AoUF7==%7CdeSY0`Hc!(jk zZvG z_l(*8Kp(=`FbA7Tg7#s*s)^TNxs(&-36t9H1_~~rT-Yt8j7d3hrMl?NQdz~}0s{`9 z^@8X$zV`6*9wiYtRVyXhg4l-_R*I~Pb7Gi$VBwy#|HsK?fG%zXuCJP$5_iH0I`xou z%;Y2=7vO@ofgZ+~-%)(3fH8pZ*{2&JTJthhhCxWo+(GYX6k6~p2yzG%e^ieySU>oWMr z#@R8>kQ)%M6=>3ieyf%?%!71TZw&nw-)sa#MUc_i3`#fY6M< zf>kMKZji=D*gg)bmh_=pA7XagcK%a}$=S0Op2cgYzK1}mFIt~pO~dNKXm;#?45eEd ziK?vSQ1}{t{g`LGyOn!sPAh{z_BG zK-rfwYhWp@Q33b zP_ABle8Jei=rFqTN#Tw05q#M2;T@!funyS&6MhkohQr2-6+%#|vE^_Ow=7a-FcJ)|X3 zk^R-qtbbK48e0r^bhwo~J@tp+)C}+sKD=wCv44GhqN(LnuogmUV3dgY4s;EVEkjujEs7P{b)$ylWdk9W^JKTwy-bn;Eth5&0+ky7A zKRs4}(~Fza4-hhEe+K)xowWcrH?}A(284)pN5djE1NTko^#R*EXtp>*!T%~-c??Jq zsc)M+6M*>w+r-^1x_-csBrdUL737c*aQr9-2?-`d&-k}VJaFG1x3GS*rj2Y%w9c&+ zuGp|C_&SVH@#ew0g7DlAM?3}2=Je2=g47?_z&XreB+wbJ9%OXAO@h!0Ze0##?f z;<|wDtJQi@P;BSIjoYH%;Q*k=xN}G?!qs)=54oJtrtaxap(Vc>oa~Cq^|DXjn49?F z+qGvdr2tit@9GHj@cBzI%3ew|hH@K;v&UdJmb_mT^+NoUw@w*$5@*1sIyM;Dp<$Zy z-mW%b&lPH@qoveCMpz`^UaKRT#$#9WZ-1sWv`T~h{N zM^wYfRM6WFB8iLj!gf4dTJ!MlDUGd+8DKODroMR5%tNAtXl zxhH?{W~7=(aCe6=GM-=})zAGlHa-nz-adHNfqF6Cw(fC&uFPvchb5D-4pnlBI$es4Fik@4a%_2u~S={+=yVxe!TcGyITnC=Xrd)q^h6 zs!y6PxP+JQn&RXNc>N?io7fz4N%61lc0C^3JA)#=dc6 zi8Pb1j&8tT+uPeWP5}SwmdLX6eLDB}w0dSZ>yFC|3Q*3AJjOq9cqkRqKo!D_Coey+ z%HZ&G*Z%W$08;)vrkEar=`s*e#&fx5mCW|vl!P)c#y*{t4T64%QC;whfoy*>vADZ2 zOhX5O&?JJi-#{Ki2OCYbdXY9$Z%a!6q~IGw(h9GnMq%{ym?k1L{gWbcSU=vnCzQ8k zo;?i8pAX%uUBfOm2$?E!H$WjG+u%hZF!azbSYR`$^fasLM8r|}@@LFp1D_vB*#mqb z&cyM!DClwNf1F|*ABY7eyVaH*`p})nAtNg^Kt@wd{GZFH+NnOw6&0ITt+1vvMmd?# z@cD^%W!O+P$4;&>6ddhwBlm$aC7Isu;~;FB&y9>3QSEG+U4U0`7ZQ72ZZ1W}lU)q2 z638|?<;OvM2y(j`pl#8o)XaTp`en%lM@Lo49d(jPH0STLPO2)f zctgaeaR+dNM@%`C`d@Yp36Ff^O4$*(p>Dq z&CqyxpdF_*MO)mtMFMdMf9b2Fw`@dcN&sjc{mv1+k%?>}gj9^Lbzq|EwqzA|y&JST zP26g27NPZen9M?=N%%9-=ZeYa9Xw#Pb5y9&u2oHNu>|MQG7A<>HlkOEFp3%hX({JY zbQXpcdr?am`UGYN2iaX>F?axMY5MU|MzXAYguidj`Sw$P2*kM_R*kEjTes`*H=Bl8 zfM?!u@J8WsXwd|FG~EZ`%`=FakBGN zWt0Hp)v!s|@mvG}bhj&1R|gIsMjycaqR3(sRSN$`A!Jf%<5G}G^nKRHT(PW(Qb8p_ z&iUXO;@FS^MP;NW?)eECgYP9;9Ja%moug-CkU7OZ%ZEcmMtrgA2r)=QinU=7Ql)pc zYorfdU@F3yV+#ET%sb@`K>{G(II_)BbZpL?iRTXtJWm<3XVC!OYX%Yqba#_!yKrUM z?T3a@ey59VFa$T>Bq3L5dSyndu7biSCx6NGz3F{6jDTIQZSF#b_(?6fRs^mPgFA&Z ze!^m^5o7{w?vzRI>1ldWlnEcwmO~t7R#yu(9V#RoOk29TH=9W=_cV%}$!qJ)1?K#6 z(<>!_8BU78s@6X3Dw%ci2d~Nd^h76T!w#H`q(>X=q`^lLVq;$27`$Xl_Y=wKSBA&w z1P0NXQfdQ)=+B@cslfL_P?YE&1cRwb?Uro-ukyR~}DF(T0FJ1oCwy#$L zl|#KSK;ZlJeK*lYDXh#dR3w1v-x?lGaq=K6)cMhj=g*ofCnPA?^%zo-sx?b`ui*aW zjK9OPG;wASEAwy;Y3<8)GNhL@cTK3TZ2ZTOv~o^p@L}Cm+(ojwO{mRzB4@OgPKi1_ z!>A3jRcLm0a!bJ;?!NU4Ayw7V+vav&JZ2HNuQ%VnQ_Kd1#euR$njtP=`qh*zbyt;+ zc4tVq!Fx%3+Jb{a+E|cuj>7j((ZUZCxE!7<;*-p?_C0$iWxc9cn?IgMITY&U<7E4n zC%Q3%id4#&b@#juj+vy>FJA^1qlpp0c9b@^(tDHL)W|OdKR~^bUSlMzBC*3A(u7ur zQTEUIxI__8mrpF0{_5(hXk4iJJ>qgO+JZu1Jq+ntT9~npl}K`0Z(SrrndrxC>_5~S zEoj#G1We_jL=!@d1Sd4`2z<(R9^^~O0}iQ?K4Ha8{~jvU%)QIN1>Sb$tz_h6H^Lboi% z3?a>-0mO*yGV)goWmDzqK`w7Zy?^{|`dFPeb})CXVZssq53EnH@K{^(owu`eW~9YS z2J~FUEPFOPMv=&2X313#G%FlFq#WR0pq{!@ zLKJQ95Q+$jsS#CH%=`wuck182vQ3-U#vs55i&5YOyKm~xrkaHt+%Wa^YMNu_DQv06 ze0jg$RTRo9*C6;=jcb|;k#1Bub~T#|4dtgXtcaW^hU^TvO*O_|l}s(X_J-5b;Zph% zvKrMvKJWjlElTWkAjD6nWA(onP=p__5SBF@j@!=H`{wj0AvGyW4dG>q`rgpx?|d_$ zdQ-tN;UBZ!A0pM2x*i{+2MWMVsMEw*zxaO?VUZW@5y7`0{Z2y_AMV|%^mc3Z6q@U* z#$M70Bzo~!h0sv^rkono{Tht>z=uSgiq&#ncOo7oM~Z`r(%!XV0>ay@#3PbI8~!n- zY-uT!vZP`+&zYnn^l-e|*WiX%7)>y!dFiyDnPsS?n90LoZPQ~AC+P@?4p7LAfgOz6 zzQC?4i}RqrR!~>ikkMF$&tc#CW_OU&?V}O@hnoh43(KDYD=$1wmnSVP1Bk7~F`+W* zdPTAaJ{dg3|N4V@5EAAzU`Sdr!RzvSVv8Hjbh~&f$E?rbW0Pk!C^2rw=!7@Utc%}$ z85=73C_LHKsJpU4B%3WH3xoZ6m;=8WR?UX=33+qVW4TpIsw3|_%?V}2h^zFyRGsL@ zstD0^I@!%Ydm7*`c-zfc%Naps6w2t{y|I3jqpI1RVyn$m67dYVEX49+y8XT9i$&}H z(^*E)V0Y$xi4d13H=mnrMo5{5o;F@SWdR*6U~sbAk#83uDhdUn5RSsgbd>Q%e4AS< z#S}&8L4Zy$Se{1y{>+E*OBa8(u!DG|7Ic-GR5v@zsT^u@r_SK(8b3ncN8Rq`!=CKx zO6p?5)7TBd#*-!BIdq53OG;E6Q;-OXeu-@KTTno60u*6|3pvD$gn>h@r0QIdh$3W5 zeYN>@g8`56Q>?m=|f(~Rg0C7N$zbeR&7@FZTr;f`2VKu8!CiI63A@MH5+xXU^(!Zdda0uX} z5|GeEQ+*ylFfW(C0=D(d>K$ih236ys@V;~2$p(Uo3jh^y+?Xsozc?6=worU@bFPgQe&LykY67P0S&VBfLkYK z?L<=T1rP5sKIR!HNm&=}O9(o9yxFH6nu2R7O5MJx1w2jnj`}`MZSQpcV^NimesDr< zmk)&1^z&DjH>^z7B{f#inK)a%K!WCMab`Bm@OS%`5d$g67^8`^|KbnAh{>|@%d#cr zOGPQJzywaFAVhX|=82L#CHn_jYNL$`t(bd8o7T;*#MzGw5cy(Fj(v7dlRT5aV$*;w z!GCR1LN1O&DVIifYVPjjj^Fs_iQ=Dr^Hygy-TTrCJp6 z%xhRGW$C{0sVP6=U$BF_4c8u6?Jo0*aJfxGgnuL44q;I)?HHV9j{weKz4NphsGbzi zJCeE=ffjc>QKnE=9umuU^caMjK1ahpr^NdR?<0Gl@smFzU8BME;pnI347kvA{icr1 z>XJ`BD|wT=d3mmiEtj&#!?qHQy5!|ALM)-ttXe#+6-??r22A|6=>`iGl~TNHIsYpz9Ml+gPEy zg^an~-^;S%+g^VK3fpK7)!Rpmn(VCk$&u-=0|)C1-BzNBikrB^&#I8fGdmJ)(UOhE z^z7!M#ngbsc`q4b__bb}>gwS&0v_FCxalamo)1Qo2A&|`*DYsgV!R~T%et(rmagJi zN3CtyrzzvfYc%O_gr%W%V=75m5TKQsdn>ijK4oq#)#yltL3V>A``+Zl{7Tp@cv1lw z7SSToX|`;^`&z4~n2rsiF>RWg4@5HvZMc_-e7>zDySDfoV2{+;(fNZ9E7=(*v(b~n zW>OHj#c#fxyVFgg36wp2Yx~lQPOIIcl)1+XnkFa-#A+JOAy`(n4R~@jiZ07s@06~8f9rS`ksY%`F7z|@f%sHIf0Tq6>#YZE zw?ti2Wwylbuw<~Cvl{Z9Uj)c5R?5`)fe4egjEt7A!D3iZb)1J-gf2gc{(nI~;bJYB z0^?@4uv$%sU2o~=@B^*D0X;I}%2+UmQpd>Ic61sp=M>t|NhJO@73}rFwm5Z{|2}D- ztPXQJ#+1)zdSMxv9KgjD#-^WF98b6v2f#WEf1%eYLm2`(QF{?9grKy0rQyJxN z7{nD~`K5caVS9s;vPu+m>zea_)+Z3pf=JN{goQ8cHs<;c5eZ7=_Ku zL@~C!Xx0ShU&eY&LrDX^y2qy1Ko znn8)+BC}<@5Ivcj#*$9>uUmu!u)_brK~@=wbmhY)578fr%Y1=Wdo0Z3b4O8|Muga3 zfIIXzUfi~F(P27Qhc=<1XE??awc@341X&}Ou_qFFl~PAVOO9StF}@fncP*HR(sDnK z>vEmOts8RTLEI(bzd14=F-lbDcXN{213tjR=|1F)!3jBHHojI;rasw)qQ|cZD=Eo0 z7Gg0)?s1m?^o{B|4J)&rxw`??dt@=zjYzdTqxO2ct>9V1b@mS4NwQQstJ`UuSoDp! zxEfj`8A+a#pPL(MmA~5YYZY;iJ`Tw2WFOKsUgEF7bA?xW(X*BOhQk*3t80vih2MpI z)PXf59zTSmQqcKhZ#GPB$$HatfEAG(iTc_m7S83>wz>GhfNwq(?U3Acr|E$E+Zso9 z1FAv)++M}-j_93FG}#F+wXZXuEB5fo+VO9coi5L{RQtU4$-ZR&K&Esy?gPu;eBiwI zE%e#)t5n1%`Bq!A;DMJOL$E8VT_@!6{Ue-w{}`r0;9SD5z7;g&!?BOERIjpZ2d-AW z1sD&{6`HdF@lOZf$~Yblb0hPT4K}0l4#WzFnNW|pqjhijqkp-I9cnv+PfJ5p1G>E(~Vf`wkTC~bEbfbZW$Ulj(Bo*=?JW61A6pq`ra@xV&XqRu>4}Eum zg*@RKtjWj)8%1IOZ(btwa-XjCjbTz(ti*g`M1{zDq zy*at%@UEatIO?|OZfES7z`~on9t_xsB*zB(_Ev}%3Fl}9zgNStNz?N=9X$WC?paqL zmT1gfp!7vRzae(i-d5pR%-lmcQ3&$g%BlQ0jaGO(Kc30x1)^yNqw2mru6ENP<30j%Sb9b@P;`{t>nCf=;NQ z`&V3jpb?w`DjI$w9kqNrdoCHjfovfOZBXrVI!~)30mg9{sUn!yc3in)<*|W(UtD^O zgXf`|TFt%Pm27r1WeKn&OnD1Mv*R8bINNOL5`)JQWLeTOa6`}U*+U|${hvrGQ=lw3 z!ddLp&I6C$%?JdN#+C|7!lyu9gI7hsRvlGOjAH@USo*{Q6EfSjMFYEj9{3cazR~aA zJmlhOop)zO|KsS_7pmRKYzM-1c%?17(n7y)c9u}-AgFC_+>h=f@1K)VoIAv#e}%hW z0MN}Qiqg&utcQ@-2d-F<=>v|+7o<#~jGS2w*9tJAvhNga*!JuV5)F+it~33)Cy;Y> zoQcr_xpkY6oE#LY939lo7=Mx=1Q?&)mpH&hJ%0ALbR$px1SytRbfOUgXR+B>jDjgZ z6jdnVkV<--rgfCItftiohU0vm<24<5g~gM;1GDCxmDHe|UMG zbxR?~y_bxyggBb$oT5gZmwtTnel>^h**>fG=tJ^xpEL8GhFg1Bx?)k<0=UH8IiDVu zg#|xsS;QIHR;qqrEG(odG?R-O1R*=X8^`S{WC zbcM9wdG=R7LIYMG*I3|Zgv+KsAJ;x;wbnNzlzkJ|{pvy=iE-PtW zryWOLQ?;PDF7b@gkY7AD9-{PO^$IZtTzEj<^G`h)ZOQ-_2~e-gSbcV`ZrvvY#p?8q zi{QRv*I-iAC(Rllv}f~Q9?X&#uNFxc{5T#P3 zT_C!$5W2@YkO$&P78|w&ZS*}G zN43jM-U|gS8@jRHYDU7GeOJjOLC~)P%~5le?kKo(Wnq>K8$lQ z{zaIjmby?140MCx4|BCrWgHF-FVw<9%(P|!;qA@nHj8pZs&fCS1I>(%WiU;R_9{gu z(tnptxZ!4$!ay~@IiN*~Kh4-MX|JM9>`aUy>~j?p3*l7#32eKyDSq1Yd}2liBrwnX zpEb=4H*^@@U{8Z})gZ*F0)T`P9_xBM=BTr?9Fg3zRnZSbDv8)rO@Am}u5JX;bd(tV zbZ&GJJ~PK-smFT)2$7#l%{2JH1 z$wgcRfJ)bwR4Vx~HVjgpx_8?B32eKyDSq1Yd}2liBrwnXpEb=4H*^@@U{8Z})%>pr z(je|9PVmn2Z4q?{R9f}2$h1Gm+m5gUS)gB{mXo1bcoogZJ2Bt0!L9 zUx2SmJSq5YWXGeVItkG%Qi4fu%<>ap<=xfEX@pwN%!Z$pkcfHN>y`1zJu^EfP`=L( zKPKj0apKMaPeBAzJ$k<nIW-}N;jL%3_7Tbk>wO5B%RFQu6 zg5~mKanc{b0y9}!t);B3x)`7n_v0b1E$yY6Ep{yZVFVzW1>^Lu&5EMuc34OKKz`@6 zQuJp6PF_W1Ua6Vq!o4a@i;8Pxf`7x(b}uZ*j^cp49qFR@FhHgP`$*(Dc}(!Oj}{PN zE5Js0Yz1u?f(&?UkSjcURG>Mdr#=RFB8J6yQ_$no=rnerl45H*eV8dV;*6s5Ed;U& zAwgy@J*O=UNSHhqm73L-1D#cIV=*emc<3KZWX$0WI*nfhLC3Kp7t#8jE@PGBplXA3 zD-(S^T+0N+f}H3` zbPsy_splEz7k(B`7$CpK#Jr5UD!*Aqf$5E43PX>ioe_8 z6lqNIa`M7Ho&iuhDoH9EE;Yf1BmD^2D7^F&Ow?a39SwDn!67SymTPe7LEZt|)@o4N zMe3&(1FEb$rI-d^r~1D>LM;pTWq7>MX$u5%XM9SiHLNa@_y`&}V1@=5qbX?v__rE% z#7SO*T?)QzL-Wr{cst>@#hE}8Z0AE?<2s8t*H!%;lRFKU?i4*z<{n_HjYZBD8iAaz zz^0#1jiFTQSA~juAoII-=3lnI_{`%u%rUewVZZev@&oUa1%BecvQF?B|2%;5!1zT| zRg%{EJQRJYBTBrfB+GZwNJQnYHrL2+lXXsMJTmuC4Z&rV?K8|lNqNn~7Wz-$%&ysf z)E<}F${=gImY-&c>b;fTlN}oa%a!!zmW!&oJT=atuDd~j$EO6Fo1sCwQkz=g4~+}M zKc5)o9RAaV^loKsQ#;)i$~~8NWuhkdp{brV6dUMh&YlN^Lh@|jf#d?@D(eB~sNyzu z`QM1Jnfchy03)x_Elmn20o2LVJf~juku9r`9=__Wxb=$;a#4nf#FI6_DXn@L?DRn+ zJ?mEy*>4{Ez75>1+mrC$31bj4zh0DBT;x^xubR}<6TShRl7^7qHRVs zSY1G~J~rkhFCALLKCN)tHGCdMmOS7{(j0d?4Hous4m@XkgJUNwCQeJqBMQn(cs`%5 zA_c97`@lDivmJ*0bYsHeGPBUP(^xD6j~0ztrBbB~N!(YKq-=6*cv~sTp zDGZ_!SB$E9-4#Mn^F5)kIeud29+;42>mFBD?BYbYg^%tTV`BPv8toYoMM&X&s2|5) z&dlc-lhFqDg4$%9AorepbVN2D@3a0R=8Q^m=fvHFLf5P~8J-4q6y<~qk#lDLAzove zeXqldo)Bvlw5eBSENA(t2t!z--V;3w%HfQ`U*B&9jkfKkbV1xVN1<*AFz&kzOT1oI={{tnjw zqG`S;!l6@S)_f#2&M0FP`!seXN{`gx`R_uY-~7rHIkSQ2r4jP+u!!J{l3=6a{mWheQ)8q;qJqmaqXh%1ays?-Nn zVu>Ri?B>*)B&qFxu7NqDR6;J}GGF)!v^-&U+Kh4lKT45n5Trqdht(h2uf`$~;A~i4 zGqkuVk9e>yQ_R!o+0FB|We|n-mDIPWW&v-%rL@kDYp{m$Y3Ny@r0GbboE{5P@#v{B z7cF78MSL>dQAQ!44hY|Q{M{giq@3F|m=|b;Co=6Q z$IIk{`0{0``e)~L%ONHJ`4VUCgm+O9oF~Ix8#y>h9UawaMf12y=QSy#0X1AZ6abB@ z3{y936%hsisejT=T(qSRa*h4IWN$O6?khiDhiGc7+gvM4>nT^bm6N%5LdT!o)(C!> zdS8{1e$gQxX)t-Y<`(>8V4dVRXC9|zD)CEnMQtJs8fGpe)d?w2uA@*#mX@(&iTy_1 zdtVPZ$h5;c34p%k%cE(M#H9M+VI&=dnt4EkuhCcw$n@HxSXz1tBCo)}o{}xGopbI} zZ~!j)R*6s{xKk&W<9P0rz4||7hAaedZK`>ktMu;MVU^Hzbb&Vdzb2l9ci+elKl`bU za@v4*$#*v&z?v2plv@*3BDT6V?mQX^r*wcr!=oaV>i2u>IYRxP`zN^2n~yL6_Y^hi ziGl2ftqPZFl=@UsRgTwGxW=opg$E6m4=cSLww$`jDkg^L#7ueIL2`39qm6z#`jHOx zgIhZ(Lzp(YOt3*rjd>TO6_=g}`uq}JFmB#~Uxmo8J;^SIf3#60M>!O*i-WZ_XI z^4rN6#L4D)TX9rJT?T-=>-E z-yzvuiY@hT^Zo!AGBMj6JcHQ9j5le%s~Eolw;HIl9zMnTm9oah;FpbZ&Cdx=UH`vq z2AKTmdl(H$sQj81xpSi&D7!E(LzePEYVQ4zhjS1wnZHug0(Li)&W!{ProoQ9&eMBN zyx~EKWwixPK^Kf;e{m#^;WDr;0{LRehHL+-Rr63LK3>tX#Fq6R)b@hOuan~#KP%Ee zgWQk@O3ze<)IAkd*B!RYlZ&Ao;1by|$v$zfD#du!fe* z<_W@!(u(!D9J=Ne%fLDc*yRn%UW!$5K{D}z<9h*~}= zR|QcokHZy>#0$>ti0c*?tG6;IxPKRb5Eg&kac5@C99ojBw9|BuBXO2_C7r{{rD3W2 z+Zgq=_BC08e&#D-wr9{OHR}6HK>?J}8Y82ZFG+t(wW_bDz#b`$t0+%@xC$Pz+jO?X zf2lT*oKL|yf@s8LQ{;>UpvxPsKR-~Z+AexBH}9Hw^aR;~B^dFU1ReRKD!rFp z)kL0rOfl8O1e-#KKlwvS;tP2b?7fj_-7=zO=J_ac=u+j+i`K32cmtGk{>}<+~_rQl;Bd-2m6v|ruD2C5b%Sb4k}*^ z()WQ_tC4LUk*Fko6VOwj>p#CtBmr2nAn5b)swH0Uqe>cwrKEu5O-dj!h`MymN{OpQ z6wLlU7S{f{|wnHeAofHrW)@ZCI_6?Ib3VDqnwUxoXgdW3Q!cMLAXtPwoYeiek zfH@(z>MFoa#@+0i_haKwJw{!tCmXIQS|Mep%lzdMfFPvYjm!5~*?eympP0H5EX^F2 zdeD&Kc|V@Lf@xM(14?g8^k%5_ub0|AyVq_ylp!Nd@WOEP{Ef^rm>GcomR{6=?HnmPy#j6Z5hTx=TWj_ZY}h*|C_X7f0*`Wf|$E2wQiW zx)fzPYx0zPKN0S1WlrLBQqa4d>8V(uOSM#V$Jdv|(H-a``Z&}y&+&`MHtQr-P{jg& zjO8)=BGbo4zR0sOG5e+e6I~e;z=QyNMP`ncEGv?w8So%-aL??u==nCS-=f@5=YwTq zPIZS26!&vMu~B^$B~mLk8rU4h3X4T3kF(S3+6&``agTdrP)hI;Un%dcp*NiWl-Ut} z6mvCrb~kC}197_g)esN`Dc;GeDO~U{;dky z*emaR$RNEALlHGY{w`bU9ZY*h3ECM<&Js~p!3raVAfuG0MBKKDcUaCkz3`;Ii%xLlEZ~Z(K=x%>3FpEQ!lLf<$ere?YxNjOe;_!c^86BC(cM$&cimE_b4@A#;DS;SpOSp2 zunaJzpPJe$pNU??$daVbBtD?p^Ms}-KO^r5!keftO`a0Q%s+c6o~|@YAMW&Ch|YP@ zz~M=0Hr=zR6i8{JyXCip@y*lM!7W)-1LgMp+=;`t$EncLSre|Mz1*(`8Gz@PvxMc2 z)O}2#u4-9z8FA&jUeZKe^Ur!^!Q^)F1}sn;-JlC>OLBKQftuP+9vYb=9A^$ywIOq! zM{=1#)SY|WM4vCsV;{dL;GyuLsK;tQQn+X^=PGY8d|t;&IDOgZrmKP6bqzHrf&JBT zG2(OUV~nI`%k&HJe%*sML&yzrZmy?EQQnfHg(aKB?N(l0xhqP9vwA2<{Qqc8d7=a+ zTyMOZp&S8)FT2eUpUYtN0N#eV?V@GpQR+1T1f@{u=SJoVZG^4u+|vkmh#{JLt^%j8 z1T=r-HZ54st~p(U6tsy6N_!X)td(&14x`r$qTb8z*Vl~YB?5W3nWq!z=-+)VelgGq zu*iofD-rG7Gx~C0a2e|8O3~8&*E}_ugt!-D7aPar1xyBHb@uHePno_w-BG01G|RG% zmmBq#nz`3kw<*8H3iw2z7mm7u{!HtndA-gwY3;A?TnlUn-Xi*r_DgQbhlRS%(q6Lq zD`u7T>#wan-~en14OPJY{t}eLOgYYrPaDtM%%a5S!QX%}&=kt5_Anjmxp#j-;fmvfb%s;8z-A*X8A>PpNuyi{NDL z_p{GLoxMeSEWgq7>C^-rVNjUtAeCv+uciYY69?W%co^qidvE{eKN$} z&(%UByasg_*8p$Xf5SZibbOCtmt%Zj%;0kWOvo>=0fAQt){;R>@slACDl9ni=N^mH z3EuD8a-dI0uFRtoCrug1mYmX0OXe9$kGRE%J^V1EJ#&4)9CAzG#wC88QJFxc}{T~ak^vJf^I-@c!&(w zOT)dq)HJSh0icayrM2&(&S<@VYx!;3gyth7{Ujo zI}1gU>@*B{axzM*3YV$4puV3qTz{Mt^uX^nC-{V6QyRgO+^wcD1M+Y!H%yqkBZgjC zDGNC6k;>FZBuHw+kj!rFwp*${N{0nwNImyB+dRHk5xzWRi=?^CB|oh`02v{$VB0FB zr1e$a`=1*B#E^jamy(YR^(-)4kAHT9C!Uea_aCjZ(nwd%R4(t;qAs{GN1$>E3k&AE z7NH!`)PUx)OZFo@JF#hNI zEWx(Q>NVm24*U-)waIt437=)(k*!^!N{B=uYtM41n8(MQ2YS$(k6u{TVA#03 zIiiCW`&&4{(mG=LM?)wgEBE}C$NtviAg&vI)E@=g?7d5vQt&VybINA*{<6RVYGVrd ziHgA8xU`bTD=%-Rye=E$iUNP;-Xg{S;3Z7uuU*flEazjCFvu(mlfbjeh+ zk6mY_i|nrJdhyzuYnqQqlK>~@-a@n0mjYbgY(wzoa_wY@OQAw&;XT!RsJW>I28MYp z8fTL3iy_77nPfp>0xk724%NGd;P5hL(jp)@UQdx(f(C0_j9xiBSAGkd%Sj?h3Z}qH zKrp~CvH#SMG_$_!w8udHqVQx@X~T15~NcDft-;l5f&K&Q8__05_XRx|)6>xiI9 z)H-p~F-)Bn1WR&S#a?7gs$mvRgk)cz;bNqDkK?7U&=fo>(q9@}=0whMgV2Zo zX+Y16nBKMM+hC$0T_pe*b59hr}}5h)L@#Rt$8=m))$*E{z*%!A4(K} z+cZ+W6ug^)o|acK@^JQ8Vvcz@DaRqmKX*sW+x|8pgiVFPwGCVH)WDaLVc*)bAqIXo zvn3O_KZ(&EK*bEm=`J{1oqcfmLs*TgU88s!v^#~8(dVZ@2#*VvpA;%_$oIhu*3&12 z{9;48`gyMHZy8E+MV3Q}mVfNaQ6$F(a+T-?;PhiM?Vo8swvf>)WzEr89U~E zT72Vs8dIqKk71J5Lo|wtOP%3KlLqn)S5~eg1I32?4v!zMVxH&np%7+aOW1j9KL0QL zu|oz6TU$X4@>^*%Wz-M_NE3Yri{A(cG4*3ZFGuE4dn)}W0g^^jnEZ9Ot?uqH^RkTM zHo~2t9a!izgN^_hu+iqNO^=Ahw7D z5LK8$gfN9-SOvpFar9o7CBQA-zQl0dI+#PIHn$30w=#e#3g7h$=#ZEe!r#I<9SM72sze3Krfk^hes@gD$40ohDDX zCqDaj@9oS$@WZK-D8w(V8^xTn8GD>vYx=US;wfOD*GW9T`~{m(;sunC&yTGm$OIqg z&e_E2QIZp!>%-UiCSCgjWQnCgzf5JMQQF*9orzHT!jS3E;$_Hs#cY202$BQOCK(tL zdO(U-oxNO?`ptW5!=5D=@+eqn61Wd4mH8zZTlTEF>8o^8%8d*Y1TB8KtRZiA;Q3%r z(+t`evpiIR7Q^565t?8UyXd^u&gG^!c*nbV|Lc1U5!&_fU5&dlv{-R9F=3%kNNE!t zdpI5W>v~6OVDIdu)#_rxw{TvHTOSn%J%BYIT9xX?sg>D^JocX!XyoeU_qv4OB&|^7 zmpX{}^K_`J}o4b0tZIBlX+` zsa8Y9R#e@}RYAb6l7pVm>`;AtG4|Qsb6_nnV=Yqdrd7?=y^Qg*&==J|XycY{3l-y> z5NiiuseA?KVhqR`0Kf~gC!DEUr%+ms&~r7WI=DF1n(l`NdAjZl1;D?5eo_krV#8!- zXa95B&oB6TK5K;>~PGX)jFOW_E=Xl)gbw?+J8Z?ox=I5Z6 z0G!(KtO(cERsKSkPdJ9Ye5|QX%V*xmGAG;G`GJPw5iHE6AaP3iiC&Q#dP(B|hC^S| zPvfC5CF0r7Xu@-vW(j zlh~r{`aXxfTRZJhIdc`aL4}HeApfoW?#|U`Pt6q=&!F$_h#)Rwjj}1>rUS@Bkm?dR z#ah403CJVSVNrFXNp9xVvB@}rA<5K`py7UE{f`I^oC=TCvOTt2Uu8%xcwCQ`_EYpJ z3P3LLczevmpn08Bf}e>CPJ+X2FdTab@kGa9Kh#1-|2C<`mK77g1|U0b)Qk%HmPc6L|&n%JUR4orrOsH z0hLo>h-`cI~!8!@^BA?Fxc8_vp8fI2jsWIhfSjuAkb+~z&eVNQK zPbv1hjcXq#jE_D(tU2L(f?`$+Z>w{rxaBvwkg&kf#L(~7o|TGYhe_Z{$F z(^uxrYM)}CV3gjn@5%vO;Hd?Ob$Rg39v~MWXSrR18$%&GEm0U8+PT~;)3|v8xnIRb z1f?2M4SxtSlZTE5UTX2Ko5N4NG6FdyplqeHLnu-CwADykof`oO8PU6cCTI<8Q&6D+ zrAZI9@1W7;&WxF~TUfH*?qW#$zB*O`1K!F|x~rh6=NFHe&zGl$blWusLI4Iq63a-h zIaQ*U=A?zK5F_epIUqgL)Che*f0Z@GLw8YaN)lDx!F!^w@`k;=lZ^9WH!-tfuzq%( z+PF=V#r3PSjI5!CV9t7UiD%ye^{t{7!Pu^-6`uv5rQLE6+vu-7D*&kQ?!S&n;5Z3f zCo(|Cmw^eX$qD)KMM*lssv3W;eI~VdDzIyd$d&V{6mm(TAajcT*1YG1Pn)TLPUT2W zWff)D39|3Yz$hiiRcL-|xU&a`R7SCfyx2ZK^Vfij@L5)@ywkR7ag9{T*J+T{SrO#}W_i|)LhYf*}*EfsZU4!Gvm#c{I&n^=G*cY-jDSMf$9Vat_= zq9v(^5=ZOg78s|W6>o@d!}{z?-2JdB4)nQ&9gS11XK8kz*Mro)2@6aD4WgfvAfco3ln z)8ZcI6ILu~$P$#W4ZvV^0+)eZ8mp14<8m3cT}8gg74X%ME0)}r3-v9}54N*=vRtp= zzjg`EyX)56!Jbr*Z+2ATfQIafyI^V|4^oQlwg2@-+Vi$1j8@wl90IcYY zd`0mDndIZK2OAws2r3*z)o0xlZth}D7BX%3y?@d~)N*#wMlp%0itL#y^m2!9;3J%X zOzwy1!$Uh22Fd=!R0umo@4+Yg`@pKlXu)@l%ji;xfK7#7NePqaHP6LEgN}wDK__sHn%zy_>1cX8*=nu&{)<-4)tbl!bNvHE2I1nUoTv2>4A zpVhaep+{yGp0tu*V}d|yN*RzFc;D;^A$E?LYpobF_&5^_j;Gx7M?aE?Nv=IzA#F2m z7Vw0ceA3l)>i>?KdL+<~)?Ra)AnXgOHw{jso`i`hn_g8h`ir@c(1EU4n*4*uKx^$N zMEDg7I|?~5XAEJ>KnhRot{=>kh6h|z8_=oKPNH?15F`GKDmB_>s75OjHTM&GhxbIu z2yO58a#smag}CcYhEn*|AeMYt`(8FX)iVSRB@o;TgjE@U5=gqWzEl)O{~vZ!pI8lA z3MieBb(?H^eMhKjJ|S^1*d?W<`G-UTEbY1a5`us^gzZMu>mse)b>0&+##`$XHNYI- zUiR1g((*||*cO`7)zbVm?l{30^zq#Qppb_$RVS8b@%z#7ZI$fQnPR}`L{Zn;i1T{ADG8^}g zi64)mq-A-hD!A%m#vlWHPfPURN0Dm;&4(@gJz3{z)MP=smMKQWit1q{&uLAteA2ZQ}+sTdkdu>=aCwXJeLm(eFu6=NR#AM`|m2S&Bo zqKNKPecNjjqT*ezFb17z)r*?IA(t;S|Ht*6AW)m2S$%R&hA}hs5B$1-MsXbhZ60fL zVY%|80^5eiazda#H8+19)5tCiUvdwgE)Pelja6+SQjIjd*noxZg-ZR8iB61j z2f-pFk&iBpuK@KbGRX58lJ@`BasYr6PH?FU{%!)k-wQi%rn6@-gUa@2fxwSRTo|s5 zdp3N{`Ztmg;9O>I#p#zr(}G7vFw&& zF$nC#9jh~DSfpfaP|JUD9g}qd=|~)Aam+-aFXveJZXA{Pp(@#@JjAHYVttTjIpD)b_{CBRVH`1M~5D3HtK4u4{4+Z!`?QLF?;+qC7IDm(** zPqLwWWi{n6`yPhg8;??4WCsHWZ~%@nBZ4+dbQ?rEJpLhrqFud(yD-42mB!2z?*GN% zNq1CrI8u?cFA#YWdd8xz!*T?MiaNV)&lPJqlD;+K5zeyNLIqLTD}C=mcT$;tUzpvY z{GiQ3VUYNm3uvQ9h{wY8Xc77dTlM?L6-;~Zd`aJ5NR>JDwvRHe;i0hG7$SxR7WGbb zK`+i6cWV)JL8xf}PLTiQcH(HO#x>TlemKY1fWw5_jDfZB(N zKd(pe&a1rOLgbhZrC`5;nmTQYR5>o|>wA3|vQBZ3>=3zdE_h#f?hUh)ADY0!PZ9}M z8iD_Kt)gk5pG3PO*Yoc-XI8ggcc;R5xF12?dr>Rw;EP0IoCxaoPV$Lv5iHsD44)CW z?Sr4Kv6>@4_Do&WsO|Y*=0p3<>p+5a-XI zZ+EQ|pLF^j=oKQl_PrbGViB>pWC(ZFHcUNPg^Z28mxK}ZdD-KSXJ995TF}V5a$GmF zb!M82!bNXx%L|^sB%9h>V40rv6e_oCv{|JtP|0sPTwYl8jg6$1sl!@}EtkWZ`BEu1 zf%qB4xwKg|hUXcDz*BJli;%l`2#?93OFH$Ar4R;ibvHBB&N*Aj+;BOn#@@_8Q#ED$ z{YKHW&Bst!e8nP%+vYPepn*baFW?2sCbfXh(_64%WnlbGXPz>zdUmVW(**O zU*x6KHNvLvarVG(;1OSqBw$6V7hcYopDGUs-w_BW+7ppg?rUk{NIlbG=p#a0fiO1h zJ*=k|1}#~P2r{~L)JQ`pZPxg~%Yh=OW{FS}OH_Uwi*BjkUOu|!Z6nv$BNy*4SSeOJ z((j(W_zmNWJd_7ul*o+C8!xZRzgonBNBH6y2(vNnVe|%rGxVj48?@6?u)bWK?BfhHnB^V{ZDDNairm|hAP7&oq+1JSLl+4}kGc)))->#??y$aV(tU;;bKBy( zI$?(|cXBYi)V1;$IGZVe zNG-1?5bR;8flHgZT9D~{qdIcqpdA&8QVwuM)R%F@qBB$g5eLaIXoq_M?-Hlem{)_FIgy0AQ0jaA7^dpwa-1x-v4WxgV z@GbTsEc4nW(M&-f27Itg?`V5*sDs+YquSP|X+=w~m#S3Tt_K`SmS)Z{|JkcK6uT4D z5b)hRa<7-M^UJS|6Yt-7A)LMEsy7Rl7OwdxbJ!+7tPCJ%iyU94K%6b(jUcdA-=#8# z2-q%(ziRn(PZ${Hj78$}=)Qz(RB~Wp*Fn>X(G(Ru-e@jXHga?bRXO@e72M}WCy!M` zvZ*3Z<)reoRYB^16%@mY;&HKlKCw-!^{M+mb>~x7)NzG?pa5Xx!n98oIiHwK4hGLr z8lC^IGT5|quNA53IB1eU2kK~Li}$h`c?HC{U7BzpM(?oIeO?7)u6p`JI&L)Ka@^BQ zM8quBS}cnw{kD8p@Y!`JPSqd^)|@l?=*X6C~mK;qUlb8)+YU<;B$XYdOVeO zQx0GnhnH&*F^QRhB`sgoJ%LG+hz1^9jL^jeG1Cp6y-3_|{>+gntsZmgXfvxoJKo7M zKeHTn{^|Ma2b&l1^79tc$sYL<@K=Zw&wTLg0>0ePgILm8ppP4iGcgNPFWzJoc8q zElI)h?rjqP;`i35z#3IK2O;j(GD3x}3iwO@Q71?G(1h9wJRjp$>YKIKuIZS$RMpmI zod5u9OM5p{h2Q;4>y}w{g_P~Yni@=!7I$0kFee@il z-$nkLCVj3?q#`ZiEEeUU=FIQ`nnK7-;Sf1$Gs)~3t7QZ~+m}J_Nyjty)AZffr0BHA z5Ew2m8$L2~54ZZ6qUbk!BNJuz{G@ssr9eRG;mQ9e`%xo^)Xq4>3bL*-MO zZ*z*Hd{qeD*l%1~%XvIC>!4^D*9k#t@iOTxmz?@>opUda~Hz(`6Aly%2DmRWb*_lG( zej<%7 z_Ic67HN-5D+cgP8XaJx1RDL8=et-JaSKn=e5L*MWwxz#gE5kY7(B5$ zo!Rfl+aik?ui0&Ox(P8RZHjI*D2}?dpCRXO^et`AtTrIyow!#Ox@sSFHAK9ZKE-w; z8B`%{xU65Lv&_Rw2U(e=lrwD~8C_?|)kb5=v<`FAWM3=9fm)jF??Mlw?1Ok{u<~7J z0>>-)o*3qRRHd0?^q z{v}+g$Utqx^fli}WBoM;;;FszGA>mPKU+62CvoH#f3n0f{MqEQ)Ee(|2IqcybJv;n9MY1u z1jDBCopdWwW+7N+RzgRCl2LD7D05A=|F$f!vpj8GEe$f-PS3g_oK(!>3Od`c()218 zvyZHhbgqBf=w3RSeUDF3PF0N?VP&5)drFKLI~t3J+_=jFk+wR`7(@66+e0h2!WX5ylJp-! z{1C`@$n#@SouocP6@=Y@r0quRS!abjBAHlZ>$8*5WF)dz$`MzT(bXEkRqw}I_=<`z z-`^2^^#R_99&kcVsEMeEEyS`o2VoKc6a~1XHOCvY1DEU-co;UdLZqOitHO*>R#`d* zFFbq<$OE;RxWA7yVL)L>s9rhQLAy0UrF8_iZ}@CkG~EPsjFG>O^G|xY^C4)TjbC+S z1Qve5)2Wu6>+rT`8gBPm&_a;T?GWucny|^5_f#1xe#qoPTU}G6j%Dr$Dpy9WWZoMf ze3IHEgeR6bPyV@8S!{OAN$* zasbRHHw1e+ehlwNThnF)0ChEpW?YIzBeiNBU03y}eJ@YA>G34Y!ct{JOp`^{_t=dT zTMC>&y}jm)US>rCNeYDi3VOg<6K>B*N8ZWNi6Pf~Y7VX&dJiSZT=O(0y2!$Ewis%W zYH1GoHgfbFItq#)0++uIWI4`m6{1+ zckc;@=;UT%(P@7n9p{pXkr;(gl-wY)ECL|syqDnB1_&I$pP17tb?h~Ass%ttb{_04 zMor{WDmyWj%F+qTT=i-XT0rWT4^R16@+*`kwpV7@U`qUZcp3La3@+7`Yy!#t`z0Cs zX1{Pk#hJO%Thj2mGvK#LEc&svL-}geT;Fb}P4Bq>KJ%!=(U%P%9jR~7#Pnw}m;wc1 zG}wmVO!E6NobVB|HmEL7^ad2sA%?P$L7k*ZoAd2i&ND4pM16&?rR-|od3>c~zgxM- zc8@aYTw^x5JyMj^Z0L#=Y}zn|d799VWUOJq?q69mV@#KhNrMrhn%bw>{A9(QK*i`Y zUh_dkjK`Bo^c^kL<7qVqRC2g#`glYOHTAo8f0AK=!x%xm@7Hgb57&9N9XN z|L~WaUMO8<#z!?B3O4aB|2DsrbgEk~2zg{Kn-JUK)j|(X@n4`Lj&C%;#E+^r*dZ`#Fnc{%M*~CkV_ZiobIx zTnJ3Z#OCDHNYVZ%BI{cS#>P(|HgLLXeD{jeTh-1N3T+;Kxe+V8w%M%$7O>h~yry(FjmrJPZ@mk;(|Lz(bMZ3<>U3QhuA?}=rsQ@I zWzml!>n`JThUsuWjY;IPTV$&&h#U&(E!7TfFT^GHr(*lh$W@+I5(d8nN2?&qef?Gr z>_%&Wx=dX7#7bY4_xNWBXd~bm-zwFhGyr3R?EBL4VCOCHL;R7O@KtGs_}%&}2TaYkQirWZRN(OD^4k=1y`WB8WV zFmRi)$Wje5NvUv|P1Wy9D-u2vb7)jMLsK2Z^|{%-YC)a1mUSgSYa$&>--(oDLw#*n zUI(Qmvg0dE2aCXvEy$^Tko>W7Q7Sg3N#t=10L{P?EFBZ5Rk9gYmXaJCPf zGZ=C}xR2QIrI6b6!9Pt7eo!W^&Gt2a<)e6>4d{~m_o0njzub$N=B#(>OwOmnf^6W# zX~6mCQh2!EbkzD=8+$eCCLJeLQOMYl~82XnVV^7h7e{Jz-ZcC$ZZ zS#)J-ZQsi^*B#?0#vG$KsnADmBF>}*v%^@{$Pr^VajoPBq`D4FY^m0FX&hz-Wu&8% zCgH+A{LOneDW*dtExp=T%c}kf>YvO*`)nS=(y6|?i7{i*HFVBJf8ao<&9w-KS;ysq6JphB&QNW+ z|KlFdUQ!45ZobojIH>je5Ay{(_2nWF+^RMG;NK$}yQ zH{eXUKXJ_7H?@pE!H0|YM=7vZ$^^P#l=%0+z*>oxVP4mS5>L02x#9k`Z0BNXyD^oH z+2*E4S0TASMrG(&7afXvOhi*1(nD%P+y}UGYq$%5aA`^fdHwM^XO01V#&6gXKEFfL z$gIt57Y3u4_5PfW7zgoc>MN3TwEez702W4LLC3xBLMkqf4$Av%!0~=yHk!ut?OGP^ zM|v2eGj5oi^7>DrEcuSr#Wl|GD)NgGVlKbmK#_2g+V(DtlR#DkCYNOh(i8!qk$lX7 zF|}~7-ZgKBhu-}|7ILz8eM(N;vmz00VLAx|zamK(Wgy?VS@hhhIHMewEJDxPEYsVO zk0tW!e10U1pX4tBXntGpeZ+H>t`t1mN|?gi5WM~Y2M)j}uY|lj@mVvX)e6k@!|XfW z!rU82Er1U{vxt;bV9lVg!DB0O#&j*s~yIh_{7RmNXJY3ZxQAZ1q+K9P`lHUkAWvI|s3I9HUoO{|l_=E&I|ANw=Q z=QVC8YmHGR=FGEYpK6d?w#g2Tw!JfHY@y7ep9HMr& zStxi@imuvlf;l;wZI2nrHh{qiMmfiUThMN`Dl_HzU@)(*^9R%JjJM?DDg$t59QRt+ z=PiZA@N0D)nxL{MIU{;?&WuF(v4S8ry1X!s0IYWer#3i!8WbO#c9$HOH2n-A>7_iUfR&DEb26GB(@qY>e~jHW&OI_7CxU|9DO^xk6YLk7as^p)vLgWu#PhL=>56PZ~(% z5%%$Pm22K;50du#wt)~-OCGiUsc~>Z$LDer|H+<&q`Z`~k)PVWTyD2vAL-kn>L(qJ zwBtz5cjR3odE~79N>Yg~9EmntWf{ATpx}{GxDET6MGZY+$dW8sjCnR2&6ouLddS4f zZ97#k+iqY#Rl^hovr@*($r*DNu`Y~Zq@@lTz2Mv4s{~PExZyr#?cHsq`Bg{MB1r7c z-J9-uaxn}4L9p6oj^2L5cpdp9l|N)gte^XvvzH=Nm{40fjUkP9yI^^?(P;m*M zkdWqc%A{b=+yk@t547iBpBvI?m)!4}Q?8=ql64AL_Ok)m9G$)7%;t$Ul@$<|77MrOLlFU?1bQIE&ej;xUAm4GjAuBK zxACbuf=%1t^N7~*jTj@6nr0zc)kC*}?p8@Y%2K;Z0_Knlx3){dQ&l1ebC+ac@r(7EDN<9tik?gK*Y#g10Uy?12J~V+cKxn zy!ar!5I;^<&#ypiw#;m+cV?d7n#PZZ%Cqb_`Il@jN4DvtpRKda<;dwu(PO&I)q@*it*Q6?D(ozZMK4S3GXQdCB1 z@TlwidqOi;l2y+r;u|GpQq^u4B(LTHyHx5L;;shWf1eKgRiYKceKVj_Q$leUKUHQa zIyh@ddnn9LQwGohLW22}nNzu%QmUCV`>KbP$y7rfF)Y;EpDC8QwS+$Q=5yY`fUs{E zCNaTyQllK0I2il46dvNWNMr9J-OiYJHfnID>N#+ojX_0_v{0z(U>yA{k+m)L+*&4Mk7z`#l{n(4`}tXxy)d~5`_e6K>CDMz-T-+k(tZUyB^yi=z4|mil{~ke=b0+ zpK3sBPwD|6hSo1Ku7GvfhWYnR*FIbOv@!c7pd^)nwhFNdp+Mh~I5{-EE^X1t>AjpA zW=>77w^n9UC-rE+MqJgbhA(j-AKG39;t5lLm7QH9a+^)|k0NHNi01ilzVW;;llBqQ zG)Bx#dg1Qy0GM34=+n@0Rt+1b1LA5=gN<^vVYk90)P61TQYO>;{&$0Ru2IX68+{6@ zg}6xc$SB>o>$T`qCtY34i7NWKC-(W_ARdYsG4xngp*oXkzCW6chmAn|(U4FimU~Qm z5-SO|I$%Y=fhafWboVoIEZT6=y~JRmO!zOny@64VVIV4*LP1msKIXZz<1J`;&LnFIL)?7#+nU#A?d{T(oIoEHCH;PAGg(j7QZp}F63Nug3I-iR~|p{mk8Mdj^DOTDx}B7MKQNS8%d@f zc23gjdqZ%YbWI-y>sSGN8cb)bj7 zVfCHKznVZS9tN#B4Br19viD?m5RXm}6KEzj{22W>*TABFs+sVTsCXpi4LsBKet-JAqj!DyuHSS6maOOrY1{cSU08ef zoJna+UeCPKuC09q=EJS1Mu#g30Oj$H1ojoSJw4W4&Mlk$L=t0W4vD9FY=9XmLM*B` zty%s}aSinnobFpgx@Iwbb#_`0}8=iWFh;YD!bmpjD7v7_Z5piq3G};WNuBJ z$!2=gZwAs+W*qEckJBC}wcJhE=NcKwEeP*T0k&g4_a1-hrmob6$cDvCmPonW04T)A zrZqfRkL(MxAUL@wVp)Fsk`|s~TR+?=BIU*o@J&-Yp=ssj&95PAZpV9B0|upA1VwRr z!+zP;y4sK9Dtp+TwXih2T$HI*)R)wmaD^7vgNBlXAs+b|m~XXS_EdfObnA=ZWfPV9 zwY-uH=n76M(SF)bqwEV0^JP?hvm06eu`w=BQxh)RD}fbEszPi^)E{S6_*>>u{9is> zQ1GY~g-A!eBk6%t-w?k-@2d>TY=eESxSw0agc<`8(*Aop)c%V`^p&CkhKWyMhI@t+ zOQ=njJh%>oo%ZxIZu+#}6AZ}^2|KtJXIC&8G+^&JX5RlQUTXx=(K?B_?=#IyBq~Ic zRG{-piZK=LJxnlEi@>Sz_})D_J>4jJZp_=s3-%Z!JnYd9Pa z;{TmZseR&h^e2PqQG>q!saYw-F2uSom4LykL`u>L0GWB{FPbm{8<|7^F9G>k`<5Iw zE95DCoXLpM1S+~E4&}opSTBz}cDe9t)K{uT{@!yznTKn=x6&+iaE<&AG&W}hMfn2T zcT|FSLUTE(?3xg1+dhYIuZCs9_kTw$TJ|$efdo3Q)`+7Bb%r1loH}jk2_p5o2ebcB zw6MK;e{Y6u`;O*PBMi4LFnIA_mj;+1r@-0+)YTP=KRijMz;QB~a1Wp*hLJ(;e_r4g zFmr5-GH^62f8fj2W>EYLAx>c0um41d1o8f}7Vv$fOOx**fY3RIgy^AC#Mn6zGg=qA)PSjoAa`H^Qgi;FcctLX-RaZ{SyEXP8}^y0ADXKoO+rUB<02n zH3ME7hEj7oSY8`MULQKQD^<)1PbbWi&V>yYrsZ&lW4W#qCFqhQ5Sq?~pcJe6T#*9H z%eD#&++xK~mQ%%qfj?7%V~a%q4OO@OOhbCE4KLlWdEh5KG;bv_x%BB>n}g|S<) zIIxbK$vm1tqO2TgM=+XR?|k}u?usKu9-%9EDHVl47(CU`$fgyrBeTVD^f=|VSPH!n z#r;8$j0@xwOa*X@mIGA7Vr$5ckimhk9*qI-#Zv}vH{3q*7_|1kkXXX{|4d(G_X^Rg&b& zJ0$TOV2qWEGW5^LX^D~9@r8!n%%-AcSYwfPF0UU~!u+@D=oCb4pEcE-^5NUA^Aik~ zS(MJG4VV1yOHJwdNS) z^)BkR%YnUMqDd;5I}W){gRUv5aI|y8PL(cgVAVZjoAB=*VsqG~lp!irq zhgHl$Nk8u}aw*X1i{VlF3PnUiBjr|wfg=W^MV3HUpqAGA$sjqwElesrfZDsq-c3M= zz?xg@`yFKFswJP$LMTXp@)Ph{$>!%M2DpFREfvFa=IR^yuZk!$Z=9lTR7K<{12=r{O-*jliKPpfjMtld~S{C&8J0TCqiD z;&>%HuNa-D>lp$u2mlN|d`JkLaK($mY!TPgsa)w^~tqM__ zmsJ~+dcRM9TJz&BM{tQ1@$lb|WU(MLu-l^+>B`GAzZTPcIMbidKCo0r%$5j zmE%X~R9I6L@GG$U!prMC<^(9A@)u7sE}$+G}6QgUrJPg;#5+|4x|-68xfYE?tvTzJ|e z15?@!&F_2DZ4e#q3npIWgw?-AUIy*O4j&=QSzYGt6CO(7gAWxhIY`ym~M_7itFk|>%JgQXvW z61;ya5oHkwSkFRCU3j9H4}P%ub*`toxvi!0e<(ee>F9`Em>yf0y^nY#9FwiOgFirg zS2E&C0WjK^UKBcbPaiKsR5Ph^PFW#?|-M=z|vFDJ_@{+r*|b zys2^Pxtpo$H$RvsJ(*C+HLPi6Q3u4TmttuZ?+l&+|B{c(%+f8wNx!#Ye1AFTDpOsITzgVxb&7oXGhhpdGqu-mnG z?*3Prq}yMI`nKv6?GQ$5jQ>!K<4Y$+o$ns+)~CJA(VW@m;eNAhOewobI`G_C&NI@hRp?(rV>XV zb-#mgzQUCbJ-_RT(lP8FJi?D5B2XdjvCF5;L-5@RA`})Th~Cx@aQkQGM!F}MyQ8I# zpW2c%QI?&o^rR&|z2PO_H@6k}yq7Ua(bh7lm^uWO%lTe&`)+!BuQZ*&F7J9TymuR#zs#o z!H*2k`Ri^t9mQmdK3YNBEqetioM?sWkhgFqhwcMB^%JdllA56h(Ur$`ejZ!w^!`eD zUn_70Hj+_IfVeT{QKEp`%Vc>L7QCE+`H}T6TK+T<3Ly*uI%5<7?AP{?|(jfu+9T9*52N%{ zYx{hmbHbEdIPOP-?tUBo1IEKst-oH#+%jP1l>uZ1YFQqd9K^G`!g%Rs=gke5Fmxtzi$);G9PfWhO8Ms^ymh{aRi$sp97%e?7O3Mq}q%u|% z=i*gn%)PDZypOU&Y5yJS<$5cN;4A>aAeW&(#->jo4m$PtpnA1LU+Qb1{twuDrh?h?n?a9OQ*5}W&E_CiDc$?2meF*7h`)@fW@;>%PL~UG;I){ zx-)2&{_VGSgUs>O?O7b2Sxtzt9<~dldh%ddc7-z!JjUEcqn)3T7(aNM4;C+g13()3 zNJn~J!b_zUfBhFA2eavsCJ+xH%FN311Tag`3dJ~a-h3r3}^DO^7U<3;L6OG#!^ zRI5~2c2HvmRZecjpIW4r0Ua?iNV&2}cb+-!5)zDu$OFLwon_a(C2<8iKxDn#{5V zSt%|~lefZH63$aXC=EUs$1-XH(8MU`RD}(TJX-@F2r1qCTYv#b@QY1MF5rH>xp6r! zv+1&3r2V4Y9h54v==~q8gw3ImC|2=)j>3bM&sAuHOPRsWd$Ijh&)|rXYMutj7Fcka zqZBE8W+u*GPerm%|9<)=xX#H;;SXL%94kQoj)PW7!Twv}I%WJ%%;1Rb%jyM6GNvbn zw_9YySI~zi1VZQ<+m&wU;3q`FpP|g967H+}Bj_q>8e}=YrJLo%c`TDLxQqnlf~}_) z4sIV9l?4-)sJK>)Uez#cAT{g{#ZT7mzURpXB9+GAA-PlKkW&L8ST>!5k9pWWg8`SV zz8B`yw^;D2DTe z#a}a0^J%&@id3)kLPxu^Vs)q|O~qQvdRTSGb4k}bOHx|X0#$C+UN*pv?Iwq&ci~P# z=iqsJ0A{kMc6XocEigE-*dMxHjMQ!)>{n?|R)+8X%_6Mrv&oZa^r4b4s-RK1(z$uC zZC509SWEg`98}t)z zI2|feofsO7_V;FlDJw!b+eRa%J{$YgeLzQ%F_Vt7qDUt4M;{aLKH8si$EI5 zj&E3t%4+^|v6%P2^8Dn3ph5b7&69Mmw8K2xs%osO0!10v%^y*TrvvU|!_d=m0)B_RgxQs$gDb8?IM<6?21&U_O$u zPuQ95_|6-FK5rE0HdG47FFO`PwbvnOk^hvAgQmxU$|Qo`4fUCdayU`--v3N=c;hrz z_blN_G3YsRLiO%dv|4EH)f=EKv9@YeV|gehg%l;i6gqO%=@{$%RF5*WEqV$BeUd@AG@o6N zh$*x6tG^Q)el?gYEDdULMuSONhl@6B88Aj^)O3@khV`FlQ*5}{$4VVo#~9qA*gKRu zoynn^kQ4py{}(-%+X6SZFKPM=y2P&i#$&n*YxDle9=8IDm!&Kkf`?@8G8=czU}pID zFCLh2i65hV!tZBz&JBjwN*z<1!&f zc*=;inLok)<|P*ub(CJ8gm`3*FaI|ErQ?Z>pKQe18e*3@c@Di$T221#zc~exaz-)( z0X%@oAl>w4hsyYO;D;ReM|o$JWAcl4o6Xpa5Pe)>>zW$x@PK5Kci?L$BBBCW&m`BT zuU?sx{$z_+TVS0m3IvZe~d%=i()Cw6n7yqr`{P+05g^j+xH z;ZK9vFtHf;K8EIlx*CHQ0?$wB}uf4uQ33hl~p; zqTrA!OZ_1@U>4_GV_xYJzDVTv;5lk^W~f~;M2-mQo+q!-vZ94)T6dlfUy2@n>AG=U zrjYWW{FeDLgBvg(i|rZGPLh9M_Oh^Y{jn z5)by{f-&z-7wV@Ln^tvk#ryzj;|H{sG9~8Pda{7H7SyQp_B3H$h_Ue8HV8Kxrdx9g|5oSKVuf zv-v29j<_(zCaw66aFZwBoW`ncBe)o^YmFfOqfdOZw5@q! z)8oec&VKIK+x7|FWfs&-e$hRU^{9y=u3Sr{?%6o-^Cb^GA8)Uam3ebdD%l_ab)}D~X+$$a_6D)V*Nq z_^1a6QcLPFd*Gc`BjDhNRgWo=@%%!YN-+v=1nZ4#(i9}c` zjaVYI&LCMt={~>Z`whZ3QQnK>GmDIXc&j4S6#qwXiHb@p|7h*+`nW_|eSzTd!!A2{ z?4-0(IY;JLut*X+m48U2NFkw6L247C|A}qo!vB*m%k)^~B#eYLAdc3F#z6D@E^hl7 zWjL=e{A`MXloKpwew7RNuH4(IGP-B{eX}kSzYT|KbLZ+zb@vAw`bq5W@uopvn<98! z3!vSrM!tte`x|1b8|7B!E69rz(!)mYTTU0XHadKUE9|di*Gx7a5ud zUjot@@FPpyZFwQfG1f3_`;Oo}O&5PnPKtkBiEx0dw6`tCx{X4SNS)muC2j<>=TPj{jVFmu@f)RF+-U-Fwk0xVbJ5)x%s zwnePL>;FOY7PQs0A;kl(_wV)w-u^=sF_vyzvp|)h`o(R}x{-3SYd^4W=F4TZ(cQ@J zFx3L%!==Xfn)CYOh$^kwjq^oPjsni@+ zWTW-#9X9wDty5FNib5G^=9cy6C?;0;xzdY7gRQGwV*i>Lj1gZ-;b;8m;-OY%_PQ~) zfH$r9OF8Y2K@bgV^sOq-!evmjo4d=t)$1;s$xkk3axA38_c|`wm7b#ICC|i>UqKmPXHt77kFez?k z)XVh@X!J&k-RFCRu3CVXEZN3A%uEOV#*}BL8wKeP8tSR!_m~`DU!GYI^hrAAVO`V_ zREx0NQ>en;8%Tujw*t<%{_CX<<)wO`B6^*}zPOMYGux*w)=!-ezR%B=yG7_}@iibp(eG;u6X~L0e?I z?)u}Ye(W<->kGZqnqS<1rhqs2&#zki)&2~aHR(D(^g?$1Vh8TjRKuTIOw8j6G|@Mb zd?*hQDkSwOyA-Ah^H*ICVnr@Jk7Ga;cW`Ih%rcNs@yV6Han zeAKO{clCL}EUvHiP5&SbKM^qeYAoTShf`Qv!)7KAEO^938UvWFg*xNL-2bEZb{;Uc z(V8vKCjfQux}YBIG6>v;w>)PFN+f_@BML?rx4gGg8RTtmsc}zJvaGX{BU*A^(Q!r2 zlvbMji{OHm7jya~|aR@C(sY>R*7IQ(!qeq`|8!RwV8saA*>)SzaMgN&GUmJ8fF&&Y?OZXOw)v z@-{7zB#oHm_j2mw5;_~u-5*T`PxBYEr0NSt$K=j z=?G;Jv~@-In`+t=^I}n~Y&%!Q4Pm)UpzCNV*s*HWx{2KqUvTr8H|YBs59{<;*5tJ# zJ*WExxpt984Yx4>-qQP>c*EaTg{goVjbvSgCx{Q_aRsm(AGI+&I3dvve*&D5`{?n@ z^Id0kpPQ#iNi?4U6qmxL8l_+$wGFi<(H$IYxycfmt+u8I^rpmLqf(bYRqB}Q*G;*M zU2qT|6(gm&%e8Wx=_TB*Urk<~7GLOGy^uw}#L{rxrRWv}GXqC>5RG@?2 zWntml4mu?Wj6ZPu?$D2B@4vDrv9o%Mzqp6etaMVXzuQgQ2zN@5-usgOJVLm=ti_ll zcNj3>Oojh#9{Q2*L9kqBsZ&B8{Lg<~JXs7oC>T^pg7leHs9S$5o3$~>51M21-tPOe zI#nK8lSilja12#8?0KDtg~u6J4YTC879`0j$3p?!u*`)CZnR4%L7IWgzeC)g7d|yR zG)N`d#nHfSd8M21HR%UEy{_2q-n}0WDsrid%pkP2j0NpbWxU=J3{iOzKQ7EQG#(+j z%H6+KKDc!{;)_KR(jW`OE_mj7tGZ*M*oQ~IY&swG-i6DJWVNRLo*J;L6bdLeV%rr- z_QJIHcsgaL;b!tvO@Y3%8G8&&FF;>D4$55GZ+F!-6=Y-ZiGdGcQs;%97ftWG6NCw& znXX$(LZjNP#7mNFt!kZgu~JV><&X7Y^xP|86g~X1&z2Id8Cce|>^g3TY({+4)mH_` z)`zfh|LCLjJdsrga5>(eA)B~C?NaxBtr;C%yrc!fTI+u?eJ-^dJHPmxR8t@SUJ`1# zFnxSl9l{B?>Q@ctYWY-01%5K%Bax-iFXy2^0gI9`LmKToi3p|xxflffeZi(0rf9Z( zHh&cfJk9ecCornK9U!^*@v3Y06>t8f;UBy5Bq3UOB!KYQH!rJ_=z-PX9hu3qO*u)( z?G1C>HCs%N1>0BjKf{L-EGF1>?8wHatw!&;Iu)KOSSaD#uf2}^i5f}1qohF$YJXD^ z4(yEjjXFvvz>urfejXfkqJu9?TFHb+s&iRowIVMxcrb?>3kBxMrE3TQ7xZ}9qA~jH z=6Z0DYOBbgA<8O-p#qanq8o-_mXOeja|-M+bc%On{D%l%N+!7q+$w}b?_LOBPNtHA%^>>QhO z{kAS2+qP}nwv9WsZQHi9W82zsvSV|{ww?69PCutlclC>>tG~f-&AMvTyw;p+j0uMd z`P?CwB!$k_%wRM){>y)i|BpSRlf7o47!bM5`dbvMCC?MySHxVhxIO>VbEY>70 zh~dabQ6wuqSTo_94)^u+&{Xi~=7j|~6={(_7}*b^VIxxTZhBWi=h)3H)@(>WWyT)x z+ETE??yY$WywQ>Yv;r{9o=F_|d7wydsD$C9Rw;*Cr_85{G*jEnL5kJH>Oe9R3BER? z@2}w1eM3=UPK3v-W+$poNcRTgeuSq*=uH3HGFqAc?=SkuQ-4IlSgA-$gfhYR@lrDKo3kY=D?99PT^p{RmW!|WuK zh}i-Jz(oAF_V^N};SjaHo&?+gX=ZK)3m zAtys$7gqG=H#D7leopjF!tV6Z!-r4>L3TVcF{JNZQ3L3IDRj} z!Z=ucZDb6XmJHSeu$r*1Uk_p4O5QhfF7q@M<7o?|>3a9d{5nUNZEQBh^nCeINXbZmw~qXce8aeT+R<(h6b=LGRGTGHcC1wD0D zINg*3?)(tj2nZta=r6cW-$;!n-V6{B$6MZO(bj)T!0De*P4#a2Q))MTmG#hRUk zmH*>clj{UVvhn9_#6op>1J4@5Az<8Uc8}T?%(>3msfDR0@W>mW1>eAbR9|YFMZclCszC~eTRO->t1~VR?oWs6r|*$ zldjYbasDl08v?axT&wk8|D!4NcVUFo;4=m}FTDIv z=_SQ#>`;6%syvYf$MzVR&X}Z(HufciwhkpVsT!YuDY%t3BZWFB6FlNx0%m|8&=9Sl zI?yYU+6I%e#>!t~M%%~EYH?9d&=)R9y9!^;T=@FHkx+_R0XkYany!jkUT9SZNjgus zy@HF2Ao$VDSta9Ur&VH+-zgs z4(ezK#?W>8U&ZgfMQ&nw)&B<73}0RsRnkTIF}tZy7AQNEDtzgRq}Fn>9>8h;nv;x9 z$GFkvO^SUI!|jNa_+w*Pa#GSXJvXUU)MDo4P5eyd2jcMg;XfJXllmsI?SE!6s^b?p zOcQAq8Q0P)7^OF%ng)PfWV|Q;Z@%xl_1hZ3K{E^Vb&vP9S-!g}_CkP7j%rCo7m*4A zTojTvwEt}fLC~E8IPbfB{TfHdi;kKq{KH()ZS;v`FOYQm>1Zu@$!3zE6liZ2|2hz0;ws>hY7A;)k4SmW|~5iVyISO!;j|m{n={IajyIzlr0Pz1Ao;ilGEm=$a`x& zAMnkaPQi^Nq|J?=v&)jp1rHdY;L&e06iGx0O7g&Z0O}aQ9QoYdS<|iD_V}NW=fPQt zHZ6bZHVUi=ppl!{>L}YyhQjCsudlnQ-263t+)h(OaKQ-eL40HBj-^)~_T55rBtYD9 zsljSau1UCWUG1nVt#LkjCrvy&^t(R=t9%jNe#w($$&j?sn z+0MRw|K>I=i!t^Yl1h6jLs~LQ4mK@tKEP^uG2LV=a9qhP^dxazs7xtyE_^8W= zazw{_S|oa|8;EP}pch46Wpv@G-B>&J2$G2T5A$x&P(bz_Stw^6Pq-8Z&zzS||!acQa0f*7EodK4}aCOw5e3tajyUd4a$D*WHPe`iUtJjnK0h!ItvAZGoF zAOpw~hj_UqCsLeGR@EjfrCgSz~OV#CYRd);#2;sqz}Zoc>P8C`;@U;vTnc2~J1 zYiLquD4jt4t7&$>R=AKGZ~yA#XDp(MJQ9uz?u6eZm6XV5#D|YQdH!{y!GS$T_somv zz#QCef@tbIB0DKGA7!Wk-1Kp*F4M#W;xLkxNcs-WUlm#UL?D-mh-u8H&~=vU5KIW{ zwV9JCF_Mp5YUiuxYF4(vf<6X{gt5I|f)?49@34o{D<=9%GIR8_Uq()kGEzF7b}DfD zlrC|86Y?XwddEo<_hh8>b=vuCg}(0b$qR6QNB57%W=pGY!4QTd1n50KFT26cf)Hkr z;_Q=$@Q`yg7iN;QsGq#Ho`2%s>RN7~$?uXZK*a;hN zmQU=Y%KmkVsPlI#EHT5*I~OAeR-5*Zc|^^qeXWipPq%KZ+?S-)cQh^Wc4`>5zjE6- z4L}U*#UO&1wOjP-w@=dhx&VfTIM(+KtxgkvMheV{4?f3L(sj!1%n5Twm9XlVvvEA(r`^@D(oE~cGFQv?n<8&#6XNdwRxRcpn^r1XQ(uMzl;PuIePcu{wArp8xZI zaQ)oNp;txs%7{TbR#j;=)-|0@{+?I9ejp3PtIX zwayDkyo8T>KR5|{C9{#yw#qP!bH?lm7Qo_=^{UPFne5`!!L;XZnoloyOa+5!+uoIw zV;OWkD3q`2X__)ipb%)8oD$OxH!*FSTi_IxrIRf*jJ}O+!XN@64nEueiVH}Ku&1PMVWV-`& zoEodt7>nSTC(Ip5WuLo$9- z#^~`0{r2EN_L|)$&p^pDrYX#EGx5d#K+C9I%CSh+0y4gM)Iceu(Th*gxgiU)_lstF z9^}&FI99{U>!>1qavP4%X;UITNF?!5^8@okH%6Wgc!?D1Qzxle+F@Wk+g@unTJAac z{R|CNQB8?_>Nz?1@a|XrB7(Vw<3*(Mg^O;X&9{L}!W(Hxmv3XrpyxzL= z4=g`|ajUj`y{J%OZ#e0@R-@OUZ7{4TTOthB*E)W)S(FDbc=-q3kBj^INf0TDS#OmG z(Xt7@2bdN{c9BM|q;O|t*Jg2kCcbcH_H`~T;Fs9zL(Uqqe!?f|6W~jLv(C@yqOIkl z`a3bQ7`&H=tn5&@znpBY#6cM6a8Mpc2rPf|hZo&g39_q5EZDw&e`>xk0i*CUg8Yd6 zWXd(&% z9OChb63$YZBfUZ?Zrr;`lYiNBYP4s=57!J8bvt!&pAlV|J^~ci@Vq4Gax|LttL{LM zYn;YBUw|1{1m<<(B|n}{?;-ZA;8EweO8q$~>c|3i4&FGamFB_q>%yxE`_D=y3S`Z> z#H2Vi=SCs@B&yAgnL|vJV`BX}YZSUy8$p(R-at2TT%wpoA~hX*&;6Jz9_aQONJ#>* zyWQb;8~%A~{3v02i3)41;BKAN4Ix15Ed7b??mzhK| zq`cg&06$LoI+QqWeuni9p+oQw;T;dzm@Ww-mt#E=JO*8OS%~N zmXoEsygHXIj&WA_2~F1qT~4;YzU`0vQh2#GwCKA675trr76e<<9)JPh9;iAE#U(tk zFTzaZj3|rhVmwokfp_ASAI|Cbq9UBX<0IkR2wY=1z4%Thea#{qFz&7byG8vv2w-FF zD>8nu&&U9!UZ!5{j{93THP9&tc?IpAe~@d`6!Fyx0e;<5GN`pWX{5S27*_~{%`zpk zHyx`@<#|m?`TX9+-YQ2njscQswN+4HQ~AU*KNTQ$GE zE3tnD`TBl9+;i>W*oPdft0@cu`wr(2VzC!K87q3O!<2h?N+C7~4AKTGNsPp~b5l-e zQ$-3Mlq{wWQjN`%7KXCTPo+)%WHF&F^Xe1 z%p?{AcM4h^i2piIU2MGU-ag@HS^lJ1^0c4efN0&!W0xAPp1^IDPj%KO(I{N7eafJ= ziZ{{!ah@3PARjE@*F3N1|5g8=_`MDTbl9~BpgCRLv|NdKMU&VK)D&L!4XZ{h*H_zr z*Z-~Sf7U-l_Bb{`gUqVd2sjMYdjJ8|d~_5E-6mxO$PS}Yv9ZB=IPL&bW#ak!!DPu0FfdNbm~H*_G5_MGt2UD74?(vX{BuHSVUr3cAFq0;wd~6s3NmEJriO|ek1t&u z{-Y07>V8Y<=cL|pM5#YE&v-46G!8OUmo8|w^pQ4ZVnL58Au45wTj#?fi6~0L(_g@&sEV1v4G#c_imtc$9bq7m9OKxU`ulRf#N@+#G-SN76j3Nr|UC$ z@Pr68E2mLb;Y~Fzt`Xy)GQyxOd~_G%=b=Yew=ev@hWH=i<|_U?+heQ=zjsE`MW@ek zKkL#;PK@*}-w$1i(Far+aRCG*uY)&P+SJ`acL${=uTE!M2!o%J-YiJ^j*=lUgzNbn z51{hKKDc_WW>?~e3f(<#oP&pHRDK#wsAHZc?Tm60jJ1n!!8F`@xq0s_@Y$HVYgzO` zrOQm=xwYo5h;DE9Y0;6F zhy#<9WT=Dgy8RDgIF;ZOs7$}qKGiSqSCC9~9vW@fVu^zOkZw6LD7q)dm&5E~agIg+ zzTXMGqr(1>3Pg7f@hBSIrVvd+fb)2dnk0Vk%a!ii>t$O(AWeg!F5pp#rnz~)U4HTc zXUidfWFf9;3ivDxLjL(wFDN_9QI$YR{5|Wzl~@5azU!GJyM{Fv3A)5M@;+FRv|9O# z7Z!z*?pme|zQ(LOlqo-vJJ(@AjN72kWmw2&aXlDgow%Wcn!6IUe-g<<;O z?Bca4-os~~aY8cnVwKj^ePY>it#LGV0$UzI+Q5JZ51j=+@ zY#$ED-zBJYoy3J*Y}J&1M6~yj36otkz8ph-J-&YQ9@~_sS%|s7B-OeXWS%_wAp#~h z_$zHLw7J)YKXrp@7f|CepGpgXI{fD5N^Q-=161w$id%<_k@^UtvM~;^+#M*5`_|klc)i_JXnSJMDc5bo+L_=PH>W2(MVhxPT zFM?*41OM?sDrvi03kg2zt$&S=#eK_sjLjP-FLb_sk6pq=9%#+7Eie>?#Bgf{==GFc z6E~+10-wdWqNKF251$4cC?z)-ff+H}(B=<+T#M_`AhL^LB1^e^1hC>f<&v2TW4_)K zuDPY7ZKpv5D8B+$tH~v)XBPJ_fslbgGx5p1GcGgCjeXtRUfp;z%wQ_aCi$#1ei8^3A`BMArNBLPdklS zNSryTg!Gv$-&v%EC(D}DZs+Y9?Z+5UJzx01A1T}gwKdUWly`#A+F4P6(_>X1DQu?b z^|NYVh)MbYcKcXY>2|ae<~yc${UHGRJAflSSCRtNx0Nj}R zix0Y-E-b@kWU9Mx{^E#f>w8k%F=+lXcVyV|XKNi@QkxMc1{s>5(gPy~SW4AFv@D!;;-eck*4&wP?UWxswdivG& z`w*eg+pV`sW5%KI<=AeNR~0IQBspt4yVk$w z$p!+9YUkMquAS!#*To*OXZQJp2#w~uQK8J@6T`E<=iWoj-rJ@KwWnNNT7=L5yt;Zl zHJ{3l4{>aVg`pFCf;@}v`iyt5#XK>4CwsSot$*hm@O#X};K5X5zLL1Xeyh#OPuAV zcukHrq9>OcHnA_A)pmhy2~Z4vF_S#3AdukgYj|b@NvTG>Rv3R}rXt6|$QqW>M53;kIpzF_2m^HLoX@D(-+| ztn(*i9FJp;AR)U{3kQygau;Xp&c};pa|DDE27xHu{Pgy*WBipw5-Ndc*NIai{}+84 z;Wj*jE})q7kC3xYke?3vFh9)SsVz0#V}0SU0(U}XPmi$r{W180`hl|XidTcaxbDiI zgq6LPSVC&o24xlquZL)Z(E2s_dMLCoBH}d}^k~%xJG2#s2d(Jj-&!nARAKZ!e(FF$ zN=p=(A+Nka!hIUa4GUdDX|h5yROKJRi|*aZCYK8MKlKuo=(Lv`AM z+*mqN&1uqQ5U%HklvW@5-4b%Vbe1=S1)@O$ZDoY3nIgfQC&wG1^e|r3D zYU$!Zl}@#<8)iaY=rj9Rf(~s~cT0mH<@ov^3*Bc(7!UowKXADZ2J^av9!BM2@J(Ja z{lFRJBF$U#&9AHSiLt2Scvq?wYx`m$ zaVF){w(!6GzwgWeViaXhC3JvJfa0b!hWFc%VJ>}F9sySE&PJM)+V`Z(?xlN)JzE!Y z&%9I_)6aRSMEMBNbYfCsEnX@nmhkV^cOuEw_d0HTQdm4!!6wJfw$_abg6w8Z-!XIt zITLy~g(Z7MB-*b%L}p<@=sL7@^IYh%i%E-xz+Yx!Z6sJ=ftmYdT{t=H)v?JooIZp$ zbouD}c;m^C738%Vwkco6f3v@;k1F#A$>869;=Wmsv*A5v8P@BXDhF$&zadRyh!?YM zTP#Xuqg(=cs*x;AMF!{raM^e1*jq?>a(uU}0pMxJ)$M~?cv7wA|BD$os>qt z!2TEnhcCXw+R84C4vgC*3-^zsqeL=P^kSEa1_$p7Fh2a$`sJmSSX1pZ;^k{sJp+vO zH+piMN0)g-MISq}_4kxqOdb~ehy33*!LDf)Jt16nH}cJ1QV0Kmsp60V%xSiM#f8<6cg* zaEk?i{euj>?WZQu$J7MUHDU4Txq~ntNn^mhyk#75P@}}5&OnWpTblPNTx$?86+}tw z`)izqPyCP`(D=^UCwXSw;w3GNvyAAQ?#WO{Yu>fUV?JT{zI16}`{0bTpv%T8Y+;CF z2nCFJZ>UINyteYeC>eEt4Wz!6^=Q_(R}Qb$Uf(^9}6TPrQX^aEIj^rdt=A zR%cjnkQ1v*?m1)0EAo@BmIxNWU|eCk*h0Ry!QVcLD@07E4K3Pl*o*;UTnS#2DGApH zr`lha@w}jPgU1kVQep}0NDfw2y(Xere%S5Da!6=gY*}3{Jv6rxs)FVmp@}6}W&Sl7 zU@n0UL+gJnh8BSg0j`GU{)eM9XaiP@7j*pdGAMEQB#thd9j@Fk`rIJ96|2<5(taso z=>>3~9R`XR&am}l>$WZ%X)8!JC(KCwA?s07KXgF+IYUVnW0HoA7_C5ri=0cXxxf~bj(L=qpzpb}fr6`Y_{EA!5JJ;B)EZQV{6*Bg2!=X&0*}3U)?(oL z=7y`^!!cJLeDatE`I@^#tPt=)@a!dY3fv+G&-+?(KWx{GcaelQ+R}`DKAUG{yvB~ zQB?Hi9~5MIMt2%+19bwVJRJ zrO;>QbH3gq>VLoRZhv>wd5%66V&5`(Ge-7UYcDG#?@W_lbL?0k|AnXlFY+=;hA(A? z9L>25-e2jK=@Q^)SgZo z`*J_GZbA#Lbsm@t(~hxNnV%9PSL$=hAxYT{mP7w1rlwL{{#E@Pc2xTZ3{8-3bXU6z zmC^DU^!=?tQK7$6p?)PZ;^;u%tD)^rk~dc<#pDhCCHZ+;j;~9ER~nlZQuhJcKUb>0 z{HlT7Pm1Z9L|gy(6S-`prBSN4`d>BoM=WtbADk)9%3QR)JfKF=q1B3L=5J6R> zv}zF0-B!d4KGD&+$P=}`e))v?TyQwiaTBWT8VCX3>si8x~3Mk+O!1ub+`4-8J~mvi|IYaNX(Km644u!jHCyl|Ic@ceP?^c-HxX6-Tr`@zfMMY;wYw65VEWk?aV z3l>%MZZL3$09b~KYUTWfA8XL>3n;2WS zwtF-07ZeI6kKN3lXCoaqgw%27hvPXDDD9^uAO9Ff+DVekuyxy|a`pf+P5%=|DH9iE zjO6dA;qDzj;U&Fw`SA*dso#Eb&t8$b3`eZQ_~Z8sQM#Dz$+K^^J8%px&Qr$5|FM zHIRb?A#yBsf*E1O9nXlSEfFKL1Pn8Pozhgr<|nFuVj`Gl#J2bKiE3f+6!yOgV4i{&P<#0@$)Y?%zJSgN=%b1R-vCes^~x$cF1yDaAjzmrKs zUIY`oV@{kic6Y@qc~92EPe(lwDH)Sgd1ssSRpvbg2$8q~lYL0ItYG--??A#t&gSYm z{Z^|ovk&YA8A~7O!ReU-h1+g7>G2;C-Aiz$Itf%!Z~gpMMB0NHTplpf=3FEPxB`mw z!yM$rj%awY*)^teR#7zX??tvgPBaty9IdCdA+u>Rrnn9VUN-cwRf{+R(95}u$})iB zc{6sfv)Ur8-=i|t?bW-I@%Tl?Hl^`I=TT}QoG|&23eT1C{^&endMQrB5cyD~BqW?w zDP^p;K%HL0$?JSY*sEa?6l0YhlO${cq1F7SKhQ@sY^GtE3ZNP{`TGL|4M^#_A?bv` z#;c$0ZYeOF0V(tkqoYwn?N0d0Znj9KOS!j3>wW9M3hs%jAX=IHv?~hT^XX?SJ#AH_i*Rj+m z)%xvas=2PUDN)%0T>?1{r%)n_{k4ctiM{ywam(a0LL=P|5qQ$O)D&roGm`t`>3hZ!23NUi4u@}5K5>q$ z)9+U$Zjx-vrmuWn>OS_)i*ru?>qYVUq^+zl4B1bwuwW=R5MD%K%8=q|=)h*v!M~}Z zygiv`!W2%XFyXl=gqY}D&6%~|JsxoA)IfsgCvXZ)Q*f=v7`F#yP5gAWtLUmsfIyXZ z(o2kawln+)91lFMVd_@;=c1`ArWePTS-#fGR)+{bj~{)>;*KWFZ!fm|Yot?Q$hkxhhHA%eEI&CO>tHH{2!g}xI9~;Bx-JOx5=d)1 zDqt6Mh_%ls0@`;oJW^*4IXYNCr{(Z;A4-1N(aP89p7Kh$+eJh}p4wqYpxynPcIO0z z->!@e-sqbndJ_wz`n#E?3hpbQ_-!n-K22{)779G{G&gxybb`9An#JCEbST_T>H!G? zj%kx6ix0b&aQlK70wDaiy2kdoooT_+#cm4TQq*@(7Y&l`cX0yc1^EW=Z;@jl>#+#g zL8_zy+zBojK5pC3O*7hPQ14=ct{5K$X)Dsqt}6VR^x50yN8D1~7_N+`I`zH*VKTiV zNiCa`R=(*tw(Ay&uI2**geSt-OUr(tmbJGC1dlKF@UH1gnUU+CS_nE%2 z^!hKOTZI+^U56cXiVX|K}l)&4tVL@v&Q1H;NKJ5bR=xUiKig>Wh|2Rl7bTtKc9evH<)aI z7vtfh>oI9dmHJDI%F%*;pB-)-7^9t~MApK8zb|_$EslM{N@Wo-1dc?qk{xugm0d;i z9heR%r~M+#f>-_*ANj>N$in{{U+7)-P4T{j2E>miw6$kb7?EHeq7tafzDmD)`=)~w z%>TxR@&Ci8YtE#G1+y6Ht)R4!x^g=^f5uFgJF6>*hI1Hm>NMBu<_Tcg;rX2PX{yW1T^#MaOPSqyEKvqW0Hgv!pW;Ldbwi5j|j$5mRNx}jr zD1!02UFsStpF=mf52kpnZs{Up%f0#dsIylMyps^VoNyf#^5`fcHwJrq{Yb(~9b%U* ze-vRGBR5zZ>vo3fh}rZ8qwo!>Ec3I0j6}&x##zQ&@+;X@ymrR~ZWLw&e=|}qgICJn zoFBL9g*HpH51_e~Z4&`h197%C4Y97_XI8r(3WVF`&!r?|S%ha5QZEmr!_ zj?n1DNZtoB?0E@*^cxX6Hus$Gqz*$P25-WJp^=zEBmVt>@?JJu{ulp8o;i`k$u!#C zRl~O&Qgv)|uw!|%!p8tffL$9e9A%J>75g>NR*#Aty69A%$ihpv3lY>xOZJUT1pExm z&Uh-Mh>dPGv$<;&a_pCIxLT$HCXlBE$Ml%DEB|1|;G6zAb6>BfsxK?8EaIDgFEP zi^^BS?<1224dm|0WyGDP`}4H#vJi(>|O4=txl=+O-|9Kt>4Ar{!b5 zr%Nk^B&X-3Rz>?p#2`g89C;4>Mo2%whDZ>%;>fdZ3G0|f*dJFPLb{8^Hvy+OL?p%b zE`2-uG9r^GwvjRrMkj~mOFKcjn6mxIG7ie)0V6%TkjP(@sCWAgg(e#c)(ONLMxYuS zr?rZ^x)0N#6M_HH5Qa8hrH7E(7L`JJaA^r-^;_ZJVi6CxcA|LeEa{p$3RRiNDUW7F zxFM=&wtlhRR<$l`-C2_?FYI2K>-8+}TL?FD`(9S2h9pOz90Q)+Jj*EMW;qj<;V*s7 zRpX5NkHre_jb%>+_3Gk>k7*Fuj|f|!6RARqIYR(^gx zi0@^HRAq+Jp2esm#&ED{ipC zvf8-QfTr{)c^l`ThxLUpZ1DDrErp?aLsu0xpFR|60L*~yv!Ce5RiD#H_zuQqp1xx3 z-6_t=vxpp)v4Shh;sNV*;c;I)=8c%zHqF#)qnP_W*kr5y^eDq#PO*JnjQWimO6Dmi zwl&L?-SvP!rA1b_7J8wyhD2S)^a(pX8Uk}rC%oygKz&_g*)H-M zdmDhN5krjxV0E+5j>IT60lGOi zmu)3lzh-obo^CCX4Adc(LLDra;lhuOWx@B*LDphO@69R4nupHSbJF6EG$Y;`u&OS1 zGyX|t9@Bg+7Zl;96;w`8-QCk zakL4#ariaV?9ZOak8ZEE86hr4Oygb9DEI(f-P^=bKX&WM_vIc>o@4<&x0ldG)NZpP4h)2;sm+to^gZLwV z=N!u=z^vbqwBmJuRMy%#zVoCELa^rat=ap(Ry^y+&6Lt$;?&&z?>Y5NGq_B;d@!ee zsx>$4sTWl@3Qs*P&F&WRbo!*tp%-~N$b5`In1$1VqPq_fdJf)^#)0&kZY}GfmKXC|L1q9g*ffiuw2~jIHCAsL z%l)`#quzu}KWEI8+n{5gWNiPso6k)`-NP@PbFBNJTL;aoriy~yaLjGzY*3%ijE+}- z1G=*QSVzwgLe1`YQjIYVt0-AP)CdkKKw%fWtMi{U#N*+iH#qCL6NzF-^~~8s2zh}0 z;_dx~=a5~E7{ihs?>^M1M=3kvdcn>hGVDHh#L|J`RzZmdAPRU@8cN463g?V0&@n%) zU+QcDnK9DKP3a-Uy|;X5g>bBZC0WipJGjuN%G`2aBvhN*L7lydYrWEO z4Jxq#W$1_xuX1wLb6eR01IyJ`e%F7K7HZ?DBIy)7R-4jHGK;KPNBtUXGq-Spfdo4w zT)8-5uOvlnDz{ZXas<0Gg1M`2evS zFNwiXRx^90%{zh_4}$Y65oNMlS@QF!jRIe=DL8nDTZp2RgW5*d;w7Cv6GlFk(i}%= zE*tz5tdwyK_$U#7V_Z1em`y4O@G)+&vjLdALo~g(JwJ7GjtZWOOh5P~!*41e~uYqC&9$RW95K-BP z458TL3Y_2{-l>a$JlI?_^~C;}y{Tz8`n<5A54wRH}v#0ecUtcRD3cZt#yn#Lh3MF;UwTsWiGtr(%m zqz3m}rfg28ltv5w3>AVxp%M_hm;BdMZ-m42AH*g-ZP8xN@>(*cLelJRE=YZm2Qw8; z``{pb14!7~EtdoH#ba~Q%%y|Rf#c)W)6dRB;6wH&o3+~WYlN?PzvOM?{;14bEB}q7 z*HR(*#MP`80?X^d-Ixz&#=xlviJ)HA1u-S7acBO(d*R6?9TU$ITi1ON#ySGs%+7*9SC4KwrB%O?ihuhe!o`g8b2k(qt2M zY!JT1n-2{VQ$@K5>0MSP4s4zd70g-(v7M*8`(DXLGjrjWvJ| zCdUx*LEq|!u}KXLUXRN^E^M;<2Gkw#dxL3V3+M7iCvp}@x|47=0exXaj!fw__;+eb zdsmdiS2zdypZ4yXA(k#lNjkE&mbDE>b&tHC!|BK+;%=zbnb0?WhQ0Ox@GVFiFCj&a z^DlSy#7etLhKgS6zJe$l&sn6}BqlS`c3;M+X^b};xzb!$K{_}+H_o4G< zt)TC(esA|%FS-xEtUP(?;qM%RPATl-J$~3X_V}9!2U0?^*2a9o-3U1kiGqf2#nO5E z{W(wu@w%`KuXy&W!PGDTR;lpQ3e0Uh^vQK5Xd-aq$`KfjMVn5KT2v2Nst>nGN_c}5 zHfE|%ABsYEqzS7-_2uTjrk^MiqyjjK>+XtVbLU_Dw75WOLm@9-yIKakzW>16|-(9{w}2MTb) zi_z}n^xLN<{J|)ZS!j~yo{4?r^;2|J zKdgx%S#{jVd@>GtC|r)_AtWv{_Ro0irQ%`e?-p%~aNH$NWFu2BjViy=0wg{f0t)?Z z6sV#VZFQChsN^az&})C}8dAZ#e^q4&!)U)^Yon1!W{r$sqlHMlY%eQM`hn(cnU3nX zW0lb$6B)s6ZJhwayyqZ5G=iH`IJkNiKL(Y-NJ5@KCOYXqFe-yAC4+{jf?f)Mm(;E& zG#m9=)5alJP^^~8GBi;KK?dua9~HY`XI3IW+s|#4bNJ9$gWm9w=4>%+% zKeEv!80h`*%S8L44=QG|adS6n<+wg8tOkGR_AmgNP6tgEXwI&n+arAy5p4l}C0r1!+Z^Mt{|Hwyr6Y(X31#y9$ zb~|`)B4fs!kzU5!(zX^3M4*av!9>@NH7UZr^uW~vCr|4=&E-b9zzzuBgcOlMx~~jG zJOAdlO72(M)ELsY986w1?#tQ&0XE*hL7>0T|@H0O`8dTv6SJ7c;}c0 z17MXa=Ki^N0!)rWKz_Rb3vv!r9hHH+x10#M$Ie$i!j9+ens0j#OMOQvP0s31ELv@RM0q3-U zhg(wEto)qANp#x|`cS3P4+w8MaGc)}q*ebU&l+GLcutAJM2o93?x;vHuUPln1z7i; zfY}55FxTjNjkr|~5GtcGxtNfE#-s53)ZfpO9(Z@~I91!wtMfmo?(llXftHGrFx_HMPh&Js4);FAIi zJjLK?Mbl&ko>s>!Hb+~wD2!Mn?j$D3%4lA~chg{U^ne;2KO`&Z-csP{9;DotOh1u& zFti?-LZN|KF0^bV0vy(0bO=_uQ<@LdP%7k-$7XYT2ax}DOrWawuTG$isTerTUN@cx z)USrqEwZgQm3P=f#UFCPTBUS-4U%)UF^M>Z@@#$L@dQa$y=s~sh8Bw9DHM{) zGuaUZl}3*Ya^{N$p)KuL()TvY;s8+=Z433hM%gkup=wkZNK1dDqikD-uljF3*s_4W{2Hp`J=vPs z4^y)E<)UG@5NH1+&R+-W-@=?$-F@nSq(-~OxWT#iRmDxnH_CZmfT-xPfH6ryrZ3TLqa#-pi zzZl{PYz1M3z|KfAG0s3?^8(#QM@!=wIa^FrdviUxZ{OSEls}%C`JOIqGLP(7H1qya zL(CAloT`N}V1Uo#M?Dx0`AL1Kf0FA$atb-VofMr`d6Ntlea={_wPAh{;q#)~QO+F$ zHta*lMRuWoK#~#*oz`ORj)0xIBBKN=QIeoPZQB++nUFyYgR<2V3-Y#CmJ1EMimlym zM!&lJwI~bdkN$$PzjM|58>+nB-&ytCy`_3U;fccC;3^jLnVD#!im@*uR?@JaDH4TI@T6+Z8#z zKOv{`ILLateP}J`LLDh)?n&_q!Lw`h9vOn5)Ed(jOAqmKI*$Yz_*-uoNh*ypBqsBQ ztGC8v!wH)P-7oNY_N)g&d=)kt*B7)Y%2CN6?MTfF9F(h~@A$O;vd_*vQkQ_9Xr@>q zD4DJySy|VD#z#L?`1NJ-v*r*eb3hpfDUP}%?T-e0B>D=(hlkD^Zz@dBz6fx~Hi8V9 zKXcH9;D~MUbNQS>QTS3u1zD3`(kd}tLHJS)P6U4QvdwUmMkpf`N6v<*pLzsEsMTVp z58QL%qd=4Tl>uKqqI!9k2DcwWvt8~mLl&MU?!QDh*sy_iNFoW%M^kZ`)ilqj?p;Mc z;xaLi>cmsuU)(4Z@WS2IdxnU0T>b0z9>e}M8uGT()Iv1Wx@ zW2W#|XX$CO3ki0=47Sa{M=32ll8QeBEn zwVX9f4j^y55Z=$@{){yqR<0W?>@uQYZ@%O5aLS%|^We~%?iCE;zHD&N?;5QDx6Crs z`a(bzIMlXe%6d6xiULSrzZf6N%5oRY^2asDs<$mTqlWGdoO)w zOi^Ktfk0gsDNSFpR5181)g4imsmKN?7haCZO{EPd|N9C*H%0(71fQbPtp|e0Kia@} zy#@vH)f9sV!u0@LBB%YRUfoA(jhguC%q5+7`Y@j>vM4D;^`mISR2KT#x&ucJ_>dMR zZZR0q2hT6Ji6<*9_85?zLI0^Sbc)vb^k%hJO<;hKK*4{=)7uP+t8D8qv1%{N`}Lv> z(qcw&cP5zZCk>XTTKcUXtG9aAe>3A$LQZ$YuCTL{>9$*9a&Krtf;W4=WBsu7{}Vds z!uv240xtm7A{5|e??{Yl4RQ!s&E@mD$x2S@y|HGomAekG1=sUkhaJ8FN zkWKAXQxb;mutt5YQFKUnx=wZoq zzbizcY{%vjVFf5V%c1yj?ak0Jv=%VyBIF)FwMZzhKSle}fq|P+4hgA~?7O1aW@*%` zFW-AJJgi@nOxV9me&Yt++zyiZB}9C!zV4E}P!b(L$i}@JYjMDk>ZiHHYZ_ z(Ne}X&;8pCLJLgf(6vwYYna*dE?~*0BK%Q79tA2+^Vw5o#)+K#ONY}6@ko5Br*&9S z=5Ab+`w0IIw$Tgn^;>lcuqYSEfG1oT{KK z>c{Ai%eBQr?09x2(hZklQ~V#Wa0-*PS2D#==dz(N-ev0pFoT3Dw*^qncEAOz=E18r z(hSdU#7=!>r{I|G=E__EtvA39&u&--_|gSGvb-DrLdg3smS~}+sz#rp6u+qo6Zy~p z68Sfe^<(t~29{0yi5jWcEHdrCHuX*?J|r{rGfX#)fzjrw#hNn~c{NTpD@<{Vmd^Wp8Ge&VF-7 z_KobYd36G%$D*e=+D+WTQ4h~3p_o9ZCZ#OybN%t&2_hNX*BO2R>XDCpy;Cho zoI2HyDeM-!%gG;^pLVevHdXfLI_INl)WlmPEH&JPO)*%>J>A~;|90Z_JrH|H zB}iPLG2>qniL(-w>wQT~wcZ%nNuWVHA~7nA6@mPt{2;$_5`b>5Mi;o)j-E$F8eo=^ zC+LI&E%qX^j?teNk6b|OB>d*Ze&;yqTV1SgU zDtV`0x`*Qy@*Ra8?A*56?YX1hVlw&VjhQv^pd_;~(XHckrd`)*nkIHESfE7pRG6PV z;oN`K8!5N=6Vn+i>G<3*O?`Nk#}|@s`>b3ZNbF{{=H|BxQMTIGp%ku5Bwg)yP4%^h zWdkJbdZrt^$)xrero2eGHTfFLF&x^OW-2{3WQuOx^@(5NQmww_u(rX8mbgnkeSycp4;wyslRk_a!z|Z_A zTTXPrPoi|Tab{?Ohf|IWtBi*$;`n964*^tLEdE`dFZBE*lZJWaoo1rYoArHE^-VUh zcRVyEsmiKPZ04F71Z_DzIW;v{l3XpN8$!3zK{4(aQtP@!RQ*6LBR}ad(F(S-4#{$T z-P%fEoI1BV%QNZ)%sc9#RhnxzCx92ydOj94Y@zN zhT3NCcSrS?yTWwEZF@X<#^I-asnwW3udkMulK^^g?9nCpo*WRMido-^2NIUDo_OMq zZvX9vMCAAAyDoVQr!+FZd{23gO`7UYFTY)GdiLUElO&PLwMq{0NR+i#w=lMB&qkS# zy6B-%GVbLld(H#F7sGocpQJI9;Vz~!2F+~vSe$WIC?IG~Cd1#wAHxQurGrFeA>A#c z3Azv8T6ZT^GSPg7|BleH7)XvO#l`ixzsWR%F%W#lCwxjoV3JwxOJ@?7rw?3M`l3MB z@ZUh5inw4sR8ikwh5Z(i5bz=fwY@C^ANYUIb>tfHtn;moita?PiNV*6B^`6v~0K2ns)Qty=`itsE|&T&TBq(4OWhQ2C4Y4b7 zd3iVTKT*bL7NC9Ym!9g#(xM2<2JOs&I* zOna;4Owo(p)F%`gz(YU1J)=ugdNRbQvN)Kf=7m_;c;#b@_oAWq`_s@-r9#;~eK_x+ z+~W6Pc9yV`;oJRplV>T&A}flV-0vOE>{AmkO>wM@P1*~czb3Yt3A2Pug2=Uu&Rk6#=QwOqAd>wuGyP8TS+VOE<1V8X7q^0kySA z$tfTEB05B2Kq+s3iV86;kaYZ4qQ2Hnl{HTgTVGgHNYHVG&9^XCFV;0zbwyvo9gL|I z_*W)G78KU|GqZ(xb&T7Re~H9)0G-rK>NvDu-ggrf%EU63PN{UmyWSc7f?0!Qq!NCleH_(#wDQr-_*M~OPVW<9~;;WYd%?Sly&FF z)#pjj#f2e;1auKQEWOwZp8>zC6C?a;Tx*qxtuYYa;#X z|Ci7CE|{RCG5eaIx-zf@lzWLNZCj>yC=Igzt^W}Zd}NxhuFq4IcAQ9)3FVJT=|yLu zyG#{OY+;t_bp@+3g5KW!{iJYl42H-Va4M&Q#c@gJUuxwDE$)p1O9=Q^_&=z}Z2L>w zqkwzdEK37RbX?akhl>Nw7(A;{nMh5|L+YI^P#B%1WNh`#rF8K7! zbEE9_yG$ng?h+iAYo3@TrKcOX${b9P;K2|)+SIX-94_rj)NX9($`jw*`H~ULW8&1Ou!O4^-V|MmwfHX;^W5bYK3f6 z5ypJz*#Ik832AvC?s+;zn?ZLU%1{6m@%%T_w6=$C7I)zDA?2`_qKJ3{n4R8C)mk1c z{HpjX>RCG2g+UjYY!0NL$zpbs5$H5mUfD}5po6-MUd2qqN#=t(f-K5yTF<1%j|hyR z?tYA2gSP7PFibtAkiWbtQt^Epvi0M&bvi&(gKVkz`>-uD=PWaYd4>K3s~X`ySar>P z!X>47nqCF}-7j57%@-yeJE|=sr}mX~tbAF$#zX1h6%4q>Kg;A4%%ZXxWiY(#7r0Se zeuU%)9*bFn_`5eGudkEco)rcNwMaZ0pE%=mUbR*8yHCV7Zund#%(>2}GkcEqg)(Fr zhAi2(kbILjx%d3VoxPi^eNXWEQx;nF?UXD0>!d7pkpoq}N68x&5^r1?N_hZK^cBn& zI{YevD9b#HbF;6Dx04yGybhXE%mMhlaMNj4j)o>*-xRs1`66u*P#hC13hP zrqtd~B5d0#HhrC;dygEbV9J-*RJ{!*fDVtj`m}21H+A6~WHlg``N6nrI_nKkYciTlVw7 z_|iu@7B0WSohpbp5W7c3xx6hE4F)BN;Q!#>4MOR)Q4^h0vI~xI@2T1hg+M#{EJ)LQ z5`!>o-%voK^JZPqg<~qK5p(pE9bb?rOG?U^_v&N={B}>iR||1#5t2-vX8Y3@$5qO6 zAXZ+`v;>ZDcRov#J17OHT?*Y8C49`KA#+SCKRdgDVz03lg>NZ;bPFS+8r%@IsBL?_ zm(Oo%;teP%?s3hIL(Hi!>5Wudl^jykuDzd=F&Nak`EV$_=kH;AS6JJmws}w(|SSFlEwe%7oK_E+% z$H>53co?hY+9a?recb#lOtSA|inu`kJ#20HZ-G1~rzdgMZNU>Vy+LsWztD>$7x4xl z{7`}j5jwq23d1t0K!brDgH;}HX=TdHh8aPr<`1Lq=)zA)SiRn*}8-09G{hgQ9f+*NZ z;{7(#-3ky$q&`>i907i+Dp}!$O7xH>#MH*9JSKF+in27(Bse2I7_ra6I}W}5BGf%h zo_!e6*K??RI&2gud|;}x`3U*vCNLWG?ZB<_KE4+#*@vD?6}Aexj2jfzKmL4yHS!*T zZ-G`w^V5}9rqaHJLPen6y%g0a5NMrol@PmlnihJhcvKp$32y=yz`CTrrfu}oT=eTF zAkW9i{P~QKV0?~5SGLhD4@!>7Z7AzoX*j|W;V|^nqt{`(&8c(mF1q7T19Ym=oqV(A zTvwOser9Mv;9*(ONXc03Ri0GKeI$Br0zr487FO~Dgz$3KogOWvW1aHhnHo>`26x3w zZC(2NyU#zm)E_u0eK@U)2v=nMPVbN`;M4N81rRhad;Lprr~QIc#`TY_){Kj$f#W3F^Y@*)Zmi+vx?>BS`w(}&;X zC4a50+Ahqty-xLEuMyt{Eg4o$_y$1fhGT$7KsgFxt&U?3bFl}J?7td#K zXb3ZL{s8z$>`~PI%&WlgNyxbcQ2z=Db4??zBtQm+m46NhQE>NqS8UOXx%5B8goSF8 z@&SN1>dpKcaitv^QTpALgfLFcc_DI6%S?7(7)J!he&`LsMiX$E1^ZqKxikIwNh@7v|ClKcxdEhV?Q>4g!ZxQTiM{adeFhO^?% zOL;NBN%`)qIpuQj7E$8=o|z~YEsjC7E$GHgMCX3nSv;nm=gM4(!m$L@dFrWzV8fI} zZ{ynr?dAU~q7bIg85OQ#ODWDq#=CBc?wqs?JE8zQ{Q~kL`a*)EjFW27(yDj=WW1?5 zk50A86-@y0$P}gH&^R2x(p60nR@Wfkg+U*MX%D(;Ay|CK1v0AdzQu!d0jt7=@LTZ} zJ-r7z6)(&vy~K4EIcGp=Cp(K2Bxy~gnDUGsDspek>pi;6S78YA$M#d{FtdGe2pvW9 zKA`09)>hCte8)>LH+v603u@qo0j$dQ-K}wNRMe?qj(~3t%cDWn=lqOB+A>GgL-J{U zz8IX~rVn(bo3?GQ>Dw3pOU!oI*6Odo$=lE6w{s=YC*vv~@MAk?V>bPN3#9NKU-xX; zGRWFYxR6E@gXcx{6)_e1;RiKbQ;_7iNR`#$vSo^Jka`i2TV{0$bxcU1SZYzQBLb^U z4Bz^~kDzYMkpAh_FgP5qKM>yB)OG|oTLpGL!*SD!R1_C#Y}&RAFpIb(NdtWh%?Yt0 z3|{!Up%SohlJo?s0y@%1DQ5Re%?JDNWj_R{Yc@~}3=E?PCs-!YrlK>teJ?Dl$mosT zh3pFFz{8-1D$0pf2Ij4qN15S9xA)MxU4&`f6&6v05x8ixT-x>t8c#N4+LO8Zps8B6 z+qCw89Wnj=z%lq4pzAhgH^j7 z@_Zh=b{vwU-1xaaxz|#y$V=mBF@KU=*;)q4#315rS{!9lD%qolLMjiKCiI#~ho`F2O8Y<<8BtSMRupn>JjU4Hw2~F<8O^SvM?aWRy%O^%{Ws!D62>q_B?$An0>eTm=->{83-G3sx^Cz ze{dZUktE3NPj^b#9s6HNc-EiNPsNyYt}l;@JgodV=aW@#QTJfaw!|StBD*~tg9D>l zr(e|X!sS3bAn$fvD0PgG3M0-e^xY<~=pw>uh-NwSdeGmDe8L|Yq_-b&0e>GG5zHWx z#6e9=G$Y7#F{M}0syPXXs~{w~B_KhC;aT{L527CyY3rrbxdxif9cK#84A4I`bhPsCiAIv@aLg=kcxYa>8-sg4llR5NzV;3Yt!yny7J1-w%JXK7(xLIQV1nW+Z8Y>sVZ>e+yidv~L6K1NOaF z-@0e%znW7kw6*3yIl74Q6$mv~CIV|jsFxmD)#_4@YM_+_N^pr?DSyI#wEt&*0wY;- znbOMnDQUDHuf@cBq)YZ(p$6iYq18#Dwkm-yl`m$~ie8M}`km={|v6AiGyY9zM>4(KVTXPc_1^pS_+eh$su1 zj-|FL0=%0Ux3gF$&>9yVn8Sx;^Hn;X6?W&%E@*|wLXjQ+J$#pY-z??0uOErb>f9t( z7Rd?az{t?jVLlW4k*IoRnq3hj257MlbaxolEt!DZ+iv-$vEq7dNxab`vnr){1sJKL zUNbCTMyYram-h9pK&jN>@L}f0tA2t7W&QZh*j&X#EDvWK@~m)>)4WLGNDu>tX`u{L z9uK!d%#1+f^lOrUj_>hvm2s?@e$~ix1SWt*yu1$c6pXuXR_XkIF=y0SGEPx>r z{Uh;wS#4JuvAT-sPS+^H8%NPm(f!c0WQ|9I=(dwi(_xnH$s=Jli23MsOyQ_FT1Rz- zf5FSGv1&T{n4_Bm0y#KJDDBL2=EvMz{!yHjLuaz z`@{ZYH7~{%aS4aEEEP!b%iEZ>rbc+egwsc?7u#&RB&y2R*b8?&4WlV0!Kp@GJ;e^5 z%P?`TShYSv?>?IDlDuDu`0RujwM`v{g$};Iz`{qgxM(#CbL&i}AtXt8eIBcXTol5M ztDLkQeBR2!?a^1kTtkH3vFI@5=Tqlo!*VBSv#o8pY~nM;Y;SgOS73!o##Fo ztd?5oe?7!U=Z&eQD!_<=J7J!OQn^)O5Cv6ZQK9+t36YaV32&qi$mK}ed{@-5JYPU!ib-oij)Vdu>3=cQS_5`f!Qb)bi zfd>H|TbAJh_c%Jg9bvsE5|R6o9zOMPol!@xEyd3JzCRN(Caz+F4RGO4LsP2hRBYIz z+AbjqMN}nyADsn-cF(h^-1U)xpqk$uGRxdLME^&>xXP9k!+O=5a}vEihr%K~m&)QYWarnYsyXAi@z4ST2|`KTA9@jloDX@7=GQc0^9tj+AOgNf z_czK7ZV<)zKPGh(v^DZbGov1q_%<{<-)Du`)8PJ&CUH(MggzSO-m4QaeOrwTLkZ??XCag; zZQqpj;z&+e-^b0mT39}pdoSI1%YNj(BO8YVXtS0#tcRCUo$HsosvVBnWg<&+^wHj| z4EzF0@{7oYBdGvG^nSynHB^+!-2*Fmx>a^y2qmBUS*Ojq@!q91KS;5)fS@Zg1)4&G z%zV-X0T)h&)9LFLT-#X?ip&{_E;eY?rYQuo zw3s=0(D5;hRiYG_Y6gUeH*hn~Ak7`FRH1W{oYXasA$Y*`L~R7R(IO`YoZGwmPXEl! zX#e|fYfahgY9Ie?Mi4`I9V+4)=wf!x(+rm^I=PeCXk6QCo-~eo=YAf)7a3BI@wRX*@^gWau<8Yl94493Q*N1h1*@i zoxDEaMSf&y0<4XBCTRdmX~ZJY=Cd8W9}Bp#jigbP%G!5O=MYe%O*vl23dA;0S$r@Q zpR$~UpTJ7;*C5fUQ}xmg_DDyj3rC+s9ws=iv2C=GtJTX9nXYvf;(i%*eQrLR2=qCi zk?*7)+qkCtr2P(wQRXs`!@D6aIEuJ%yD28<`yQ{b_RiV0_Gr*>0@BB)0*N-E2bRt2w*=-bAA!ggr$?|w=q zMb?#ACzKUjZ;}gBLoFHi2~_Nt4zv$7KqFpzv6mz&o|kINwOWG+}=5--BEhzfCq zHFW2fI`%auI=dYaHmk)dh2mr%GlWjdBcHm!xzEEc7mz~f| zTDuMwBmST%)v8Cj7RVEIha3*Se_B0vx`T{_xW|TX*6kmnE3kHY9I!mBw8bk}zr{5Y zUu)Jrh`M*cDmYW=D0-T3ztcR3%eI?i`VFI|jQ0MjZm!|dNO)$?s48U<(^8ig13 zt-E*w(3>4UA|!n6e#|M{{ArbV;9ae#C0B|y8gG)lKPnrU<^_syo|TRCejuB^o^^{; zuWVe?cASn27al)CEdAKLa_{fN;l^B@Qy_fuKSfKpsq|c!K38@&pMuEefCX}u5E{;e zE6V3L6YepuKs2N`oM3}KKej#RS^-!ZeAZm^Ou}-r&nW?&NUxk(lWaUpVi;a53~yn* z!Vbb=1>e*Br-~N+xcgj)N!RYrcwoq5E-#gZ)fPR?qL5?LdZk^6uKx6=X?gC0LsRtS zR#$X$sb54DpR;6@>@j~M3tCC(%0V^lYT0Q&Eig@7(F6S( z;6(;IYh!YPIUdZ@N0?W9-A!(oD1ua1?L;DPG2yOmcA7H03RtDVqiTPkATSE1&>9r5 zXsA)6T_( zuDVrR3f?=G!s_lAP|!rL5~bi-ry`VtSXBOw%xZF?4oydj+C<7FW9SxR&4)Wo4?gSl z?Vv#NfjY|v1Jt>!(WF`E?|8R$|psQ2lqJ&DbADv%v65WPS6 zHw?3&tH=C_-Bc)dBRml|hXy(n1+KXJflZe8FZhi+@=_H^EYV_=ku#zMPw>N?PiO%u zANm;DY1xk^{1tbNq&)iBOEi}!$M1GyI+pNRI_JmzZr%h86h46X;h60~95C*TW2n&X zibT^X!zm_U@pW9onM6PPwql%B)xM~%qtodpmupPGgC*bNtn z)(PN+wpnw#Xb0%mV|?5E4)h zG~RhEZ@Qa(tLu# zAYx96SjYaP|JZ%lx@zLs9Y6zNfM_->8%?x^(KRY&39TZNZ@cken^wfy>&9_7r|wV( z2sS6;k<*&Yy!_DW>9|CDR!rd;5=p;Z8^*+3)i(}t9dk+gi!@lmr0?FV;cHbf7qw}$ z$U4j72@$7vD$yervDFge_Gm_Xu~^t>Rlm5cj2EU84n!HMxd!A(beW*<)W~^J9#Sar zkMPABh{GKVdsXQzc_-R9Vddxprm+-Zw%I2Sdx{TopBv_02V;zn6tZu6xkM9fcVbAC zoiLw)%bijBrDf$C7@Gnl$DMCSM+~VPCRC9Ug@4;b#q<_M7^|6(t-8Jj0Dc9uU(BSR zQbO{(a6;s51d&c^j6#;F25m{jdNjCO5}xfr6nfR*iPTIl<6OXh^%IT-Z3MN4<}>TT zi3ZiiNb+72IWfb7pCVD*(QL;G?`1n^#sBhoq=adEBx>EkR(#J$4iIrh01$=~^V18& z%&9(wU=>ai1C19-HJn~{KHfLPKFcYj&HPH9Rd8l?-zP|@pkzs!ou1@g*l~fK)|XGB zIHRve>|XYl?I4g*K9R`nu#FhyE02+hu5yo=Wt=j`VS>;{obsEI#(9D6{ybCRQ zhK!C8kS1+QVQQ6YXB>|1#@E>WuCpXHd23E@uzJA<{y&zJlxXQ^PQ?#F>*Z})d|g{Y z0-egFG6iCr@=NZwa_F_J_RU{Ogdvt-){CznL`4LUn{>0noLzI_kJ4a*xI?LCOf@`A zAF2%zH1`NG$4s2lK^I=);1GkT8X_`yL{90Y{t zFPe4;A1UB|O!)r#nk;$$t&&VkMPhl?Fq|h8>-PoZnb>1@1ZT&*mZw9w(&Z+Czj>H$ zF>5EM;C;N8eJQh^y1wzx{7S~cQQL8qWhROSkz%lAT#F7%Or%gNj*Aa$FiiR*St;j`d9&pM^L($h8Ih zM@}8K)GXobK7x{gb=>(Q?EL(8{4UBKl-E79dgwRQ7%p>J01X8XMj{_N;vr$u%%gwv zc$>T}K2V`f>T@5r@0<@LaEgHX7TB=9VTuvTOn+ zg9I|f?%dEv+wm1{^}h*>sGjcPK;8_zSs+%23CsB8q4|TJdLpG=h)d~PU_esY_*m14 z458@R9`-P{&3!lz{4VPRf#Jpr?G_n*4bM`R1gK$6bwOW+uY_K2?mp^)_2Z+CvQWI_ zJO9@;dOENHyn1#~xh^5hW7~$|yg{9AGx1m2U|c^%;R4+_b*wp~;YT-P*)Rp@ zqaPXPaFX4ygu|#{YsCB8ennnZfMf=cDbv5Z-W9zgwUf{rN&*M@p(`Ies;RqAxcxO) zRFcg?P=#Epp5P4y7X&t!vn~Ov$j@jU^a2!0b{~Sf>nl$;KN&i*0ZJk1He$DyJm!~? zHn%k2wKEQ9kB^|FnFnEk`{FIbaxlL^mFUtER1R~J$7BXafXGHrg-{nA z(REg}ijaEB7dngOTMX%k@-hYR?OXQfot)S5)7yd}Gyj@8mDyf}Nzwez zU3||OL(NIkpVgec#&Je!QQC*pW>3avNjEWx{ueVINn(^~$3lGDSZ9HX{~7G|5kNLQ z-~Xg#Yl!YAThAFUd9+SPZhx?XyP_A{P<;E*J17P*cGaz zZd{CpbT8<}yThYItxE*U$@p6J^VNkza6&5LONQV|o7r!zcbb}ntc(UO7H-KTGTN(U z&>j8heOU3i#Xt3ahvMZ=Ai&kvC4yPDEaV~etdeC-PWWH%9~8{SR!H7J@}RXBGyh zwv=Ls6CH^lksb(r94y=@k|sB~66X}l>${|*FzwmY*8%M3(b0f<5U-R55a1L|&(8L7 zXh!ATZq4sw#2%c3k>n4|=Hbm62GksS>>hW?N6FG=!$Y0rC7u^TS-~`9WnjU((GU4i z$BQ2l)c{SPa14s{MRoo=Lk@_c3YFm8`o_L&r%UVMx*=00Wsd%?c4bstdc)t zR)HCmtECKvy;2tyB^$SbmGdTFV5xourOUEmyyY_5rKpvP>mLM>8K;a1%P-?fkcB}H z_ez}sf@D7IK3)5r^8>&3I*faBvg&l^Hw^)wn=kU}keptsM=*Mmi(S_@P(=>N48IF= z%e3X~sp-2vtK^h|21Znc_guhJmbBMUy26=kBB(A5>BXZ;&-6ZW(YFy>qME>OeBc(Z z^rWJ&LU>_p2RnmA0m)GPzU5t}to%(cE z(R8+9GqkXvv$pGuyVq%IxNEz~cW_&(qmM+<4t~BJ-ZVIREFxTzMtNBi<;`N3HjHG9 zyiBfm_sqo_;6PD7!&p-h8pKp>^Lm{>G&_bP3rDq3+O+j_mml4o5C=oHOcN$|#8y!z zz>^xb`NBn0)ZcwUf>bOaRlC7qsRMTRa~KGDZoE$<1dq~CV`hyK1jK?& znbOA&0V}AI|Im){Vb1?$ULS)tkO|WOeMGA+2I;je6GkrXapG#?tk+^crC&MDwS?jO zqgZoGYrtrHzq<^5oX(7~V&F%3 z5|~0d8iKs8;704@pOBZsc<3!75&8XN|E1r9eNEPm*T_ZBHO-k`jrIX6! zSH@?;fphiwCW;?VUBSg06X`p~{L0%Zyn}yDynmjkB7VsKyMvTHI3PAlB1<+*TVIr+ zr%L1r>TS{p1*-A`PtmXx_(-K}F%+;u-hOjwjjA~cu=o~-kA1fpbR1UWtBVMhy(n0P zU!7YyZn=UZsL(9=aLkCFs<#rcpl=w*GN&i8&w8wn_wu?F*ARgN5tK{J2jL`~U6<6# zx9Hd90TDEu=a4*%XA@wcKXS2i<#)zCT$z`CBZ>b}`cl2$VNis83Xq z6CS&Yz~v_{75IhVD&M`7E66TVy-dPyXX{4V$D+w3Z!1vdgVuzW6sHP~Y@zoedd2;K z)SceiKCUcy$tE8-pFxZnIyh-P{W{c!xic}8>7K)crPf0&?MvdJm!=iQYm_MH07yUY z5Sh4e3{BT{=72yoA}k3)hMK- zDH@ysN~q+U!i`M7v|{?Mocs0hbx)Mk`OK`-q{A)?N?evG3LPn&2+Pg+VFY}Y@X;@* zCs+?WRIfmGa(-d!F1Yh`bWCx~b2nk zJEIs?ykRxqBr_Rx-3#H>el~1c>AG42!>UkyeA|nPSo_IwwHZdHvl%Y@14mRN^RbS0 z^?vc9UX(ub5s8QE!oGTsqj3o$dh|SEPBc#ev&-3)BjF7VC}k{IJI4}bIouaSTyN~0 zb_zO~K<2VmP_i=qE&KfNbDNH98T305(9y(_SunLZh!P{Gcv#$Zx#cGv@63RC4#KGg zb6?ehs=04)*4!tiw{o&aP(EW(pBFNym-b+EjBc-vX;GpVj!LqZ*6@%;CgMg8K$c6$ zOtSY0R>mbxr%B=Z`K)QXP%ML$AQ2e079$!hp%m?P^DfD)f|GRxEzAnnl(9eTV16rK z6{I--$@IFtnL;Kl#Dj)?4IlRn!k;kpZ^?U?Gu_X}z^V2UE}X{UumTa)@X2dc!?Cnb zN_A%R@`X48Y?b5HRGjL2CxX`ks)F3VO|vk}zcxb9Vrv0pmZXutrbtnh2lKwKqLTEP znH5HReJ)-t)Sy*`#uCs|aH_p-f)~%!cU;4Vvja% z&qdPWS{YV*49&R~ZaV8FsG9dpXrz2S8Y~5k2Jn|``W449Y ztM;uKN>|)rO}>7^&eTg8WAYSpIwitvc1gV8jaF9Iqydr!`nE!riIr?n7gg&`>JhJ7 zE6LAv$Vd^c3t<`;!nN&!IM&ml`MECl-$1IRepdmq)~85QOA&D!``P_Tg*_v|DHqjm zedfJ~@Anvj@Ao?9;$WW3!=*6-c#t#2nylUbNc#s6n>mB7ai&jzarmFeNz0E9@;M@x zj9>#|FI1oG(|^+2-A=jw_(UEd^AnZAJk~(8XHMx^OAGovTYLWdyVHZ`;5d$f0l&7b z8<)A!aE}PQ)P5^Y(gnzVtc7ZL$UEJZK{c;IT)p2tcmNH?O*O4vRD~2QtBp)tQ=@Mi z=rr;w-Zwal8NlaN0`s)43+`nne)s(}#JabA7sXCfv?bWBtj4yKePfd-K#=5k=8bLJ zwr$(CJ@dx4ZQHhO+qUi5w->P+aT{@WaetscR7Q1IS7v1a2n`*^cqtQhgIu-S-5c4P zZY&IEdGq|t!mW;J;<{wD3An^4OFRa@)O5J%T62j%K&^F0|F)ExLAM1@W57M7qGe!$ z3H=g=pVCTwaGvZ$lFy6@oJJEgLfOVTsbK`7E?iY?B1M-TQLZLG`f=-7flWu~O2i<`tVF?5wv?Z#M~@`YB7CpGML>jS%MzS<$qu`$Iq#owD1w+powHImbb)9z~j1;^da;| zP!hcHcn=9BLf>eZfyseX%N?KIbXQcI)=-@L&+n;|<ux&9k*zm}uNbHMHUJaUZU|2S_!KLf)4 zEa6|ez^n~I7Cx&j+@~XwQbY3_^_qMQ=9QB1JYrRRI4|$!h;|MWXa7g^7WmyWt}^EZ zW00SXGOIbE)HQ|k&3@UfgSnWDpB&7=hA8j1(pB^Hn*!umMf=y-s zJG#YBA{6oLWa)VTGR!U-hrFG8c`V#pOd(M|BZvT9S!gS#%_wCD^xf4=SC z)zr!%->w9d57{GrAyKvpNM(=g@EO$;=wLrz5kZI1J~hX%VdlO($zZh!@KYjj5_I9) zH4Kai%uoo& zeg%azV5S#Ew!IaIl2;DssQJh#TU`cf4kNCXAFv+s`olSaD8P0;d0V|*@s=y1Pu6;c zT{t5|cfyUp3E1fYKF?c*=#VXHtr0>^P(%ZCN%^RB_jGS>Ob9v9}(|A<8*QT8nRTD|McezIvkBPAYvp)6^K~X2i0G33--aT>K~m z9jEU!zO^4hd~p?pcU+Hnj(WHt?Aq#E=^Ho7I61hz;D0*CX& zt(jD;96`d3;^eCTL<7Qm*ZVwu_njj^PA{7lum* zdHbTwyw54#8rlHpulME4XE#ksCBJT*VOv-_eN$IW3uP`*_g+FI7Wv!GP&@#e%i~sZAI3(2d#OBR4+dPBmYwXy^93NO$ zSLv5HKEbjc z`7jC;hw+dqOa9o>Kt3(kqB5vVA{_I(%;-Pn+EKqeV!829G}TUQULwXhi&KiwBDPBF z-PbHT&-0Q@q6TPR;ntuJ-zDx8!63~0DAg+#F1Y8rhY0>A@p~NJHRRvZ6H3)crj2_C z^4Um$(_8%G`^vZUdtiC0aBl^-GUDx9?$IO_eHR^*n7o`WX-y-?^?Q>|Sp>oO0&^9f zLF&_W^5y0N7_)l@izM0p?#7!??}u$T^|Lbr$ZWTY&5Yi@&f-hUeD~_i_DQd=jD=Ch z#q!fu@1Y84fx3n-?%{t;aEWC!)I*;yB$ZudXVm%h_@UVINfhh>468}#>Tp;}p6WT* z0V~b`VQJkF^Q4)S)W;J81-DdjcIjlP_bc{oYKIKOhZ_ zsvE=0CU}<-uNYLto{Yqt z!0<4xoQz-m>G*m5t|$2?0~U3J6~WVNdyUf^W5Y0OEPI7#cdfkXr^+G8i1v6N?d-T`d`&zVhoWD1LTFh&EM6!;rEqB&k=b?Qj`2g5mk_2F(^mr10aX7#q1FHz3A zDT6&bF2{>EW<9(~2ilEA*fode&y zg7YzvRVtG#ViFmAML?!zYnePT!CHr^PdU5AkGxV!pZ`Iw`>A7-3WcB9<@a5w_ycRWaj7ubsPyLt4qIU1LvL&43}XCgr~Jd<&)VF zqyr!$wA~ANIXp{54el+I@)G{k+H2%lk2&gm{#_*8T1K-2mz|tFAbGwDXnRQJ&Ej(R z8$yZ#HRly6a3(4QGV(R4G%6+ZsIvnmJ4tgw~3V5$PQ(@o7TFQMs5pn+TP^gDf|^!>zaC*+`jR_jlj^h#hb0cunxel zgwjIuWf)Hq1<1bNE@z+LJiXc@hRLm(^Y&IJMN&Ce;XzPJC&?tvX7OZO`2%uz2}Rt* z`d+=AU0>-dFGLq;IL`y<(?j+)xz9!05f=C=4O+3=gx6Kr079`K`DA+WrQZ=Ou<6XF z8>26vgzesz!fd~pe8v-U_QZ0w%m_u%zq_cfCh@P%Nw7OfvbHOVZlQ%5hW~a`R76Pu z!HnuQcq9*W=F1+Qa7EYXR-@v(UoEYI9J82%<@Cx&iRkhW$<*Xqi9(Tn&SjIk>wap< z_emV8qL8%}KF_{_p*uBBsOHC?jH6RQ2%gZJfa22GKh#;ab2Ni4cJU@8Z+-nTx|%Bx z2ty8$mInD%5y6Uok`@OzXFWp}viS&ECbkUwfflX?TOG;)MK*aeW!5hD zy#J=z9Jdv7)!nnGH`#x6v&{bG-lbhOUS+ZVi*a(sjO!{0(PdAK3 zNd(q$0i||v4q0J$q))nJx+dsVD&ENnnSacEy=@}>@Y=aaLlpKqT#I|xVzk_;`6uXF z_Fpp(zQt5CX1fF>wn;JI#vsQQ{ea1}FG_?&f#PdY+;bi#Z_OL82LNp`p^8lSlgviS zzS&Sw?SNexhT8{-&=3-%C1QN^^x#DFP-wFXsy+vxQLhMKOiR=ZwIk56L<=N#9jh97 z?bSZlnbdE1vkQ6EM)Rqvft?+o9yV6dRbno9|5ywEkqmi6E}G<(B{IIUfa$d7XP?F_ zJ3>H?MGSmqi8~q10V&O5xK80}G|!->*6VvM7TMQl#OvEN_GU+P3w|ijGv=y%+0|O_ z`wwVL0gI@9xV05^w+ioS_TM{;uasPX*~SMVp{)>!NuKw$cNOe>T_l8t9yR14qy7~v zq-T9jeiGkO6pK>c0p$|Uu6GJd!)l%JOdEi@2;m(n=bng8ki1AucA0Cj*afQ3QK9*s zNm7;uNKWU2&csF0m)a%51jYTIZu7F8Ia_vji?3GLNXJ53ruLM*E4FqR$af7!fQ?55Z@ zswpn_86|TcOHVn{cIjCmltmWg?$VIamu5Sj4#24cr^dp-6MI{M)n_32nqPu&<1!rB zf@RLHCC-RbUZkK=Y&@pINg7<;Xn4YQm#*GZti6Oi<#Ch>bhZ^W3-_Ucb5NJMe$N%b zWJw|Ut01(}eEh^qfw~AXrP82v+U+3u$z5lRG$BVs}9b8UKdYUy$1Y& zg_51)xTiKUUy+JRDMV?WFhwRkX&j-?D%)iOn@&25tWLcnNroS*wWOqHKNsMM;!9G5 z><~#xqfe7A2i%HeW4U^07FMWP@OR0|u-mW67TSbGcH+?$2nz(KYmpIAjThm=VfoQh z)Bgrj(XSSR7p;K7THvh0bzX36aIKkafV)y@#bJmvu9AUER-hi zqKST~|B~JBnE?IcsVtECz|c+#`;9F#pSf}}yK0wiwVP z8#@6Zzj+Sdk_%)<3Z;>x?%wk0!=ew(*a~k2eOT=uzUB(bl1 zq^6Od*IZRYlO^*$0dhJTrVjN0bvD+9lfolU|b`?bos)gIq%LsF(X@m4gk zmz>4RxDBDyW6B1AbqS4;1$*Z5z0%Hf53Yag;_eI$f(Rv`Y=hv>qL(Cw%x^&RfT)e# zu@qgo-mPvRStCn#kwL$(>BjO91D|gJ}D(w2nLlUuL zH}MwmO6`T&p20N=4tRc!*~z{Y5h}@-ssb&9d#Mn5)XLs@T`E^DMyVGdxTSm0J1Q|jZ97ep_^##nP(hB87}Oh?=B+kf(+ zZ)knnS9AeyRoW!di9Pmr7LSeeJ{Yug-Y`5-Tu=hl#O@)l#ZVF=0?;X1&mx|kp-v^_ zr|L#(>NE8UNEQu+&IrK6Yf$RZhfd-BnCjE~wQ5lhrWnQ)Sq`_)wKPajpv3vnB~Z5b47oztIjR&Kd<9swvr2~OuTRy9_7bq2JsJVN`fo%sKHcp|X#*OK^1-{`ypygOkH9(Ci72t}=Oi z1QzHz)q0XAe}(Gd><|%u6#`P@qiWkKOG=CaR$iQ<*U6)>L1IDT1wG>2FBvIK9s6^E zL0Vf0<|lVZt2>kB_DgiVMx_eym6=7$*Wj6dEafcmla_%uqe@$XqfT~AlB!g-D|fQ0 zNEZE20^NVDB0Q^dhUBIrSN$$dc>g+!EW#9*eBKn`$WMb!1SjP}WNC(WwwHLYorLpCqk0m* zc9PdeIg%J{cN_%}Fwjgbof!jNeRb9a0oXdF4AuJ{5(OorxT`$M*0$PjH1x{Clc-!d zvr^!32h7iA)oz&4Al7{U^K)=G6KgFdV2Z2rFfwPZOS6hYXLaaj06F>Xo(M^=Rapk(-_-@A z0_0$$*0%X8*pWP>r>b@z%)u~a%|mYl zY330=6lg8opFRcySzB)vXnB}JDW0`e*HQ`v$Oer>9zB@%zT5K&z9c)jvcn`YNpaHH z7$xQ$s7R;%Xs&yu@f#1;L?r4#?sOl+rV(ej8a&&Gy?&y`o3>h0VsyzC&5a$j_HdOO zGFdw{T>0Q=42b8}PFF@=3v#XQy}n4aZb>v2dU<~yp=UG+#;%O&OBdC4KqWIf!iHoZ z{V3erB6duzUp#p(ge>I#V`3Uy7*r!H{YI=xc=Agfv}Pj3Ns)8<-Pb01k4dp;>_^KP zg`4tEZeh3Veb#V8~T`atB>57%NCA0yj zhp&}%)!0DdSk=9;v1EMt3+Dzx9|)DlWH0RlUhZh{?W>YQj+j!*ft4>jgw!jZj1m@x z&9u$P*kw=$6U(9L^^n@lyHx%MFJloXd5wf5I7r`+ennRzxOMN5`e0;BRqBM_>Le@f zJ%hE?Ff8}J?zzgsYIKRRuIq1L7~wrVP|M4|?b{lVoN+iIo4~l=Q%HpqiCpHeNeL@} z7pit8*c}tr$iR`0N_4hYnZ464M_=#{Omytta<%Pc?lFcdm>VW&>G)Hybk7p3>=<7X zMbO>jYIxJ*lUtB~3?(Wh^q)@mL5UCTK^^ub^s4*c@P|ATO@7;S^TKU9+y?+Uw zUI^(~U&`h*vYN^X=Fk z13+$v1=ll3cxG77oXgbR$xw?s*9$-0X3Tne8hxn}%`jFa{l2SB=+|zX`qQ=gl|V~= z`8;1G9^FVZC2pLEReJru zukphcDG~=!bt#Lw(Vzq~6GQgSQvd914VJ=P46$%}2U}s)-_LE+@Ov_r--`8-vQ^c6 ztitjk>+Vq$+uJ=YTskPE_=*fHzZN7s#Y8rgghdqp#f8ismEcfq04_9T4q%+nqA8Vk zNrxbR7)cwiFS+$&65d`T}koyc(xhDqDKpUQT|vrX#4?4 z!%*k;1)w%1rf#e)6gA>XYzzmrZuR?jkf2da>RGS|p(4q@+IcYzb*PF^ATN4iVNJPf zm(gp#!}ORk?}dnY;{E6|)1Q7rek@tnzrud|3N=Hrgl0G?D7vQTZij%m@-S^nd!k2} zf4RBFUYCMYMls_0*0InK#3Sl*4i=l^l=s&t?kH$k_8s^~WF(yS*;4Jb%kPyf-jrcek|Zz4&Ksp;-zD5-I+26 zl-0A#QjW=f;w7|GYtVVEi`Ri~Y@Y}s;3e-RGexQgrak{KNubjlw}8p}Jqj0(*Qc+| z|1Wq=s}As45^~HNa-SR&Pi{QetVhAO8HFT3F|#`sNa-H4OT@xo40a7MBKb{nT+3YU z!3WlA!?ff6D`295I|yxvg+nhh$uR%+pIdz;PB!0rBd)d%A&yN$3rr?|Ui&d2Zta<` zGy{z1(EW^ zOat;+58tY{0CZdyWc(6XNS<*uTVxc;8H9vse^#k-prQ-@Py@WKs&oGf2 z^VI$5C|bE#(M)FhSAcM;A!6!L^+Sj{H>8>3x5x|KP54W|S3GBSgkk??>mFZRo%TX> zIVNL0U9gb&liWY_igcO*p;LIUAsy)2@Lm>iv{)Wg|4RPJHMi>2jhrEqZIJS}oBhZO zgI+)Gksf4<8+>7n77LPp$nNDwBvu6aJBIU@9Qu^eScGy(VsE;nj+5s`j^#ZtN+&lf z>Ao00n|Q%5!F?+cZgjKk6hRamhw^k!sq*KQeWhE6J_J?DUpzLpACJKfnCMQIdX%;O zc9g;JCM0i)H;iAa%4v^20AV#XIc^+K6SVjsiHxu2c`7xX&%OI&h0dKHuav7cDR_-{U7hAX?>V_HgJlN12-H2I z0YQduef*Az*lxgmZPib+_p2faD^p)ZD^0DI+!)E~!&H1$z#<%0 zXw1yF$sX!dYrfNvqrT^>3u`_6)*p_DNpujRzCh9y_BWh<>t%dGJ~j-3`wTJaCpDWE zF{u>P+s3JQkrkC?l|c&e+)oY-QMm=~HZ0PrXWQdsV(N5b;&0x#)2!MZxc3wxJ3?atqM>|cq(rXv~AUo6yC}zd#MjpZUS+g(3(9dKL9B(C>up%{E>q*`dHJ*GKe_GBu^o~JK4qZJ_ACU*I_7~qU*2yVfjrXt${cG>f^AGPoDT#aN z0va^tYU!7t*`@|?JBQF=t46OspltJiL2^Rx{yo5S)ZUEGS4oV7A(a9E<6*D)B7|&` zH{cta(?Ff+6;Ysn`qBbfB%e$^V`q^?%>ibcc%WzShD2#Lg_%s~2;D^>HJ;x(yJ=L8 zqxPA?O|q6bsMo*CoiiYs6J^Em@|n&C<9xbR@ZB(o)Z*jM>pv_|x?C2+YU#`>YQDBQ zsBv&nNjmzZ@l0%T9=U47mGQ&EjZz_eO_(K@kT2r)Oqvj$l>+mVSq1(wAAL*y9plg& z;QK_~QCbhahWx7tiv7qG@J?gM#9327YQhO?J?+nYF-Y_8#k~5e(JC1&;DptCP;3(Di~DblWBwwoAYeDyS@{N!UzZBJ0yb@ zC~4VyA4bWGye$5v(E|eJKTVB;m!iSTRu4YG{E9RGL15e5{%9Y0c3PlX^BF>16|0(! zG{j5;X77Vu0G#(-h~EdA*C*iVJkSe($-_!0HAjmFPzcG9s=C!YP@Ja=c2I2jW)jDd z7#`&#STJ#)$~b6BqbXxX|p9fma0Vf} z0Y$e+0!fnamfjgY&VOT2uc8rJI;b!6ih6-ZQaK&E8Yg+4n*#*pU=BE^1XJtJ5=k^Rc<0nK#Cmd4tKYy%!2CDfnrU zFco&|8_qRMR>(}Xnm11D(=>1h3nc2A&8nHh`g6L{ZtW;3ycDtWUD9ra0d5mD^df}{^v%{+G$mfERHo6gu%Uh>!9QK zngYmX$a=lZFCW4mnvL%zFp!PC5gsJeXUO0V*+|>NV*t6bn{#v>F#T-07HcY*!x8sR ze6$XPuc$2*YaU-e6eWV+dLA$SVf#22KTI*A~grv(Cere>coQVXvlUkRZ# z$wLHt;e(KYjf6c=e2klCHh?ok(~8{3^r2gUV_56t#kxl6yI1+!8v{v)a!dP#KHZAZ@3Th7dpm!Ys5oi&mwDe_DPEz(Tk3Krb zrVSuCR#PRk<=bfE$7?K(p@I-a5`2{AeBu*0T(*K@X4_ zGi|T;S_8KqNpA&fk*E2h;QPjHebW`0&QiKH2O~=%9d)8bN(}I+S_ZqlEu>C`dEFKj zN_xoSjZFTUh6Dc$RQd$qtdD~)PO(@j>RW)nqri9o5jM@;WIRXB6PD1if@nKX7|76! z8;{V`l(4eru-HORD!We!MeT++e;D%p<2!o(ENM~2u38%f8Nf&A3i&ejVpr@PWI0R% zb(|Zu$Svz5K6)<_PL>DNzu_g%RB_ZyAcH~wAOMa|d|_!8jypnj?-`mksxfPxXKj(M zO{?r>uQhn9rjXPqK;RBD*C-u6u256<$Wq88iWq6AtTzTw!0ac~kf7KJ42t9e0_!aj z{@6{2MqI^c-(3mfNnx!Q>u(B*$16a_CdWbKN9GM`A_AryIXpI?i*{XC^pGdHG_@kV zZxB`=KG7DzjAe2%go_}Gn;Qg@m`=8&WW(IJz+{=(;)gbANp4HTmU5>zfn^I8L&>Xi z3ft{{n@@!qc2PEHX)=&`oPVWu4ZM4=-A}zc+-+*=8N6>hq;k(~@nH3+nJ9CbUP(O`a z){l>j^(z4#BO@-PDhrH=!gViOs&LO;Mme_YUz?&5%CnweZSNvvAjkt)2FkFkimn72 z4HKDDvVn0rU9*D_ntExXr}^DsiIOTunJ~&;F)+!2)MCfu_&mlfBZ9XWdul27NNn-j zKWai$fvK(s{_X9}Qt@Jy>1O1w@(*=rn}fHiiJ$IlraIW`ai-NdmB;)whI58So}32e z1s}5WdIW%h1DGiQO7gDXt#u>iK3d8pcI-S^s_tcfJGrFX+t@PwZ+sU2-}pGH6{&26 z8W6mapJ`p}&P|?g-+#E{ZL;&Bp>M4q*@gDyqfqSh!N!EueD%7Q*7f`sKAOD$i4TuO z0pOU^u2MOZ!O0J|&i$vM6B$8(!hwQ?MoZcJxACm%>4DIUq+Y0nwvutG0G!+l-j#gA zg=tqdJnl0tj8~c{d^de7d{%yFrAs#1HrfWzrTv1O8I2p?&fM+Js|~jZy{!{qom?(l zv<(;mU8yYaxztotooKZ5AVT%1S+Xw^-YDRxTTqr)UBlUD3;fq0xDV}bp!;L8xN{q?!@1Ba^nS3a$o7%2Jy+> zaizqa{}Z0M&(B5ARi3b_9`$N^84%>3ht;fTOBF)#fpW|H7nc%zP?AD+y}|SC>pza&BVn-rswYQDuVqcX%pB7 z8VvG|^?m15u(A^w+@n7-N_+R+|biW!X=n0yOs@vju{ZjOGS{WU} zDtMvO1MF%WwPsqnT;-VNNEIRfMw7%j$0BEW_DFXI00grlzT?iV2#fEChn>VugGiZx ztxxw(zUs{GK~Dbb*=>j~R}LKSr1!e4)A;vREq~lpr>QT`F01Elhd#PlPYRlA_@GdudGmF2VsyVf@CsqKhPYbgYGOJ}OsPe3rUe?$kmUm)C zmN*IC!g_^Rck1oZG1-z}VyGfWR7#U{xZ7RtFuKc6)_pZ3DaqebP)H%mI%|l3h(|`= z=Ql^-C7ap_DveMzJKMQP6Mq5JCJy{;YPLLyaT<(nOWqZ+nK}rdlzB}_`~W^t#Gp{5 z8v(rw&scj3o{_P6p06z{U<$7A0~9A!q_;G$>R0#AvR>5^RQ(eFs$iZA3wr+hZ&3BT z`mI7^LQ)SmLL{;te?Bzvfp3l(yqe`*TNd3|Y%v-4or7(4}j!{k@)a1&w-7>}GX(C{`3UQoK^ap8bs*IRzyFeY7OKDU&yVxHB?; z_%o}$1Za7I0{B*DrLY*UKFHVCwOA*B0;_`{Mx3^|w;$)Z{&*^5 zs1eJryzC5{(S#O5^c{WelDa;tTA=(@LwBkZAYWL?>>6%xeSrjk(tHQ5ykPBhE2@h{ zWLekLq^5-a=F)q|fmqYTtw+OlUQ#PS0;>|=dvkJBT6kOFd&Y6ZoRXX>D&!x5Cb>2) zEC@=_#VV}63T~2rp|jf8vr7)fg@O5u$3uEsSYsa~W-P@NN-~%?FjbG>d32?*Iriqx zNL_RJWJ-6YaOOCFS;{mcWgXmWYlxi?2(aWRR(2zZ5BgFcDl=Z9fuVC)w_pg;NUG@c`^-y{;YxoUK%j zp2cN5d|+$8?Vc4$+*=c_RCU+{K5cj7Uwx)k_#>xSjJ zI!`K=0iA}rGsSc%ZnKP``rvcw?L1>of(kXF1J({cvZ#5tiYfP!gE^6>$+-!#U7{28 z&H(F4*2QSB8@>64HCnOAP&tRzuU25b&E>MXzhzliTR2gowou>*+p&g{Mu(*%HCG&CV&ev7WY^;j05=`!<$v>3A zCnOXAekfXKPH{qNB;Y7)wxzpxTqH3OG|NR@`3zYMv0lkueg##b^748 zV)UR-3basL%)mnaoF)4qT1uzg%Ma$nWf;uY-G1DjynP<3izhG^0^!!Wf|C<)I0aCX z)WEgBKwgjSr$PiExe~k+vxLQ;6(zNNM5hg2isXgU#l9O?8OT*(ZSaBvJ#~K@DY14V zuE{I$+3`z%2#6(tWD1S{-89;3=B(#A>6@ryq_-}>ZP<`A1tnl6Trvv1PwZKmwbfmI z_jS*p+R}IW(;wxroRQEy#F7~wdG^~n8bhWfSI(|dj7l@>#9;mzi^3Y{QDlCKg~m0- zSOPU%yjtnRrE4<@jFI!TkI9bgPQkc%x0=)~f2Ozwy^pVXdvEs){io7!2$BAjJZQ_Fkv?2Xoz8CdKk=_Qt+RhWpa1>m0GqF53T#8IzF!Z9jeCk~C9T?-Vjoa^4ha&s2S0RG0Kg zC3MxQ!fD)R9W=%x&0bpR%@iamHFStSZ<7=rX!7N_Up=X5h2 zd@wEE$(@|DK{$Rc#AgK9KMRjD`rcZ7Y>aQ<92XphKk38R$ECsobk7TODM|#M)3^&~ zf1pU+_R5P7MB14og{VAI^{?m|VyU5`j(&={S@eFe1geg=#%>Qt+CA6q5ku0(whSIg zJc1dDyFv5Uq{@mi<*5H3@sInT@#i-{J7R8@O{fYt^)=JY)$CAGi(FaOPf~EWn+(@E zRI+gPOs{O>f0%pB31%461>D)==euvf;0}bTTSIR+VCW<0f_(F2woGCArR3YZbMStsI zs5WP>Pmx{kF7aaMJ8%^2y0+f~`>n%S>m)$m^8)VBIJHpudWX2d9NF}(@s%YY_O^HWpBXrikobdy5Cfoa3ek;0aB=XA#9hU za4YYih0|B}@pgZW%GcHzi#x=<9WLHM&W=fetZr=gu3}Vke8mRq*so*bw1zp^^nNyq zw1bCT#SXOJ4W8c4E|68>kSNN;zx4{NK+?0=ioOlDVF_CY@zVQli$eHgf;T07RmSB= z=QHcZ|G;16smfADQlZMZ}#3u;yXCdvx1KuPb} zw6B*)EAFHeu*L@4I+UqdEHU@`?iZZZl_5E=kyiDYE%PL z5kyWE$RyTu3EZ##az#BOSW6BCEtM5;RUrrm_|&@Q4@9$_T>z_U7lJwZ`_PFrJ(p;Y zcd<8WTkhz)3QkgB;Ng>SQkG>7MOd~qy@H6^eukkEDP&sU444hZmmG4Q;FGL8+0YJr z!i;NjV`3&M^1Gh%a17pm@OiY!^1+E0gLBcU9ZIPu4b${Ac$T7?qJL5ciB~L{lXcC& zwhh;M#VdP-eHro5z6Mkj-uERQtRD9I==@fAMHJX-BYz!J_GKuox|M z&}XroO>3W(oEsPM+2s6BW)VI?pm@jGPR^naxT@i|ad^jpfdbPK*lo<48`5(6i9~K2 zPB*G=Icl_?TJ-bJv1Z(xJbwU~=egsBe=iF#9KPX_2C!H#VIU2A!Fa$`dnwmV;sEFm z66S1o*wMy=za6@*CbGfK37khw>`Wnoc24OV8VQux^7ql7YH{VZ)^o4eM!9@p4O?Ks zB}0$9=L#BqLRDiTgQ8EfuNMZ_){?0@cLZQ0wD{)2s73^<2HP)f2}uHb zmslC#1q>JWAR(HcuCNK+6l_81=*((0!GwXMB_{3o; z%MJ1j+i~{H+D9HVIDzm+`5%@#i$Q?|6UN}QMgmk6i;tnCrAbCM!D5uza!~@7OSH=BGga8 zfW#A-MKO<(bkp|sxulD?hu`SV4^~0cw1#3`*iQMF5n&YMJ%WPChF|sdSI%vM3NAre zN%s2xtqZlt8;gw>Ga%GOF6gX&tn7Ga`4l};Cs?bePY_FO^dmd)2Z`GcA;(kV(^=cp zhdhZ28NA;+xvkUxS*v)X&^1M!L2n3q!owle`J!3(Z$7MO`$_06j+*Dwz!!Cm0MgW{bR=2fh1*K9?Ez00q3 zRb$9{Ah6X~B?RRjE+O*V+El>=1dpPZiem|L<31l3N$@3&LeReiL^@$%qAO_)VGma6 zbZMi@_X`P}v14>wU4X?Zor7k`p(TC{*@662?_!!C>kK*>)RcAwSL#oJSZOAK)Ne+K6`Sv~aiod`XR95?EeM1UVn;9BR|6~bTi7tKZ z0$LXreBUKFZa`@pu#to^2*^iIov8yfXri35m4b$nU~d+`aW3)prLH$&*a-!l0gVrO zpv>#Jf>Cf4F{<|tBeKwgr3UFP<$Lz=h?sad7!(2}(rrL!`nYV^u{MIyJLD#rGk}HKBQ2Vx zpeLd6UWJ>)Kuv=(r|W~gKa)a0PB|g&zgS|vD3IOkACA}9exO|t(in31NT=&d4Dapu zPG8*pB_4=1PCd;44=UhDm_>b+LB|AtE|%Az%ss<0V1Y*IXqoA3ebav6!opCUvwGQv zEE{UK6*cDT&fvX86Etc)<0)Sk`31_8(EK6pPGQjqW!f8F9nV7)Hvu@WuGsaynYoJA zteUH%?1fc5oM7xl^}6_>Nr^i7UGQSp$`%V1uA%k1)d^k$bbeYq9pY#eSDKCDZO+K$7z#CL{ z0?24+jkb#>wpDAn4dq|~q(YUB=n7SJ81i09sgyYTC6aCd(9*#I54Gndevg}b5d}$;r+cQvQ>tK7cOTd>mm5w0UOq3RZ`0+ z2ySysWwDu;~ooRGO-qe1| z>!q$3^~y}L=0J8!;$eQ|XykFy5L=zne1J?h>sU!X;EKd`Kn5ULR%$!~oY>RMdfYb^ zQ^6sVYon5xA?_OiLB35t46)mlqqK;-DY(SG)Cw3q$`W7RD(B|qK+G0vj!(}5MWWG~ z&Q=kL0B@+uu5@v^vg;63H>H~xn93kEfj@$35@AQD<=b3G5ed6_Eh4J5iYC9>btkRP zh6BdKa~T0o=k#))Red8!t(7;*KdMdJaTyOu*~0$0{KEMbq)O{hZyJX|*2dP9%lT_q z5zs1pF`?kmr|Md30g$re)F^8Y4a7h2^AA!p-Q>yTj~h5>UFvwpe!Il!S4^U|#-@=t zyr}wCWb&7WDQT~>zm_W!jntyyV?+SZ`|d!Sw=9|2lFftxH#OSEP{7ZVOW7UbcLrzrhDer(!$E* zKuiGV7gVdBaA*3@8AZ%?e1;^{y&(=`q+x1H^8P0@=h>tzo$2np5~Yg`5z$}#Jl6w3 z>L66{`?q_#d3zah<$<&l(0QfK40I!e!%N8C76ckzPCMAbKk$4$+v=z6WJs$Kd!)LM z&&oZc-Que36*fwAE%Ti>@yny`PB_*4mOhD2&@MU*j%jm^t?S4C0b)R%zx@(K(d@;% zT^eAFx+K%0`oR>Z5>xfSi(YACunk$t6>27RiVS`_DV}K#(NOZ$D832l*M?;i!_Q<2 zv8xeB=+vW$%&6B1s|=av=8UgB2}eh$xM{@J8%Qh-L%bXIbN9YmjDsKoaw|Q}%NR&& z2N*Z!<4Dtn*Zv~dF57Syd#OkJwEZdbijm6ORhPX0x7*PFK#IEj03B`M-iwIRppzZE z<%MBJJ#M!I8Gn`&eX`6I^O+mET1&~mFc+j+@OOEa>Wqa&hBH%cxX;e}^CqLi05ZUD z(czgoVsXX+l3Om10bd_)Alk1OH0$T!Pu&dE)1@jHj4FruY$EVbStBQYa{9j&=ZFiQ ze?mb;Kk3=T*-}1-rvBZm8j4H-kkn>n^aolY#Q|J@(Y>b`gI#`A~?ymm~=}8XO=Rw`sygBa~zoWTk zdK&xI@_ho_8bR0G>=|BpPmv^lOO>Ds7DutH;`ey;aVqh$ zT!Jb+AO>pLRDecIF5PeU&GKo@*FFPAXL%E#3Q_g>A*PH4hup$b}Muog!|$XVq7GnPZM^619z%()oK z%3&@Lkp1&v6T3I@alF|I#7UvwV|CuvcTZ7A!`WTySXghB1iBRQnzJ=nL}&wep!WQ6 z-dqoq5aS!Wsv8iZ1f;P4e1Tf~uLB}yd}Jx=+Rerg4z4lSWIFA0;R-)PFsw4Zp6m;D z&#=#a*N-h8r*}-Udn`(**6X81ksy8h-;s;2iEwhNi?R zWM@Mhn}-~&2~?iVz*74z&zT3|&TcjA=<7@&aRPQeHIt1*iJWYw%LgM{=T60*&y~O9 z3d=Hj`*q5&4mZdi2bT;cPm)5r!;U*KWFVN;mDah>QB}(EE~%C-30hX;yG72tq~fdi z({LE(jSoUDrbxqSgVSH?+4o3|GC}!UIn{XH5h}qaJtiO*&I=YblANY1zS_kt%@Sdk zbCg4y6OX##itSARm)uX42p426Hj)dvu;TUol7VFMCz-=t>U)`TmOWPuW9E5*?p>0A z6gHU{)4#x``$Y%hCVPaA>$zS;8RmN5+aR^{t8{+8Xv=n3{MA=D0XPDUeEBiGTujEw zWh;^mLa(~cjM-Nr}$YxR|Z*#?IxL>FdUo7kfYp(i(={h_XfiuPECm@gEc?s*e$0>xz{Ycp3a{4+{O zxV8XaQ@N&`H;$g+zm-cZ(Zs8I#AuP%tQ7{&g^4ax&QA>!)mH}}I`p^CL729lnw@u7 z3!if=W4JW;C*!X#5V!{^c9H=|Lty~Lrg4B-o>RyD89g}iNe&}OYUT8+CGFD>q`^z9O6ZQpJDJMdwZUXeGwNK#85g=F3Ug;9t#&-W)c?FZRQvnnOMA*tnk;3SERp~w9qf_S zsHej0D??9y^dXCHqj@6pEAhu3x5y1Bg2o19+y%Izd_iBN!9IY*jAcuK zCtN1bZ>_p2-Gq27h%&0V2}sXXD-iw~MzYO6;hX!OB%$>_tabh)!6nHFY$)l+-p8s- z>B!s|P!VfEpyH*r&R#$tLo?8N<9Q|dPZ%_UcZ)eeHSO;)XIuNHKQWdiiKVY3L5v}k zLsepLM0I~Bh4~49SsS$;pVpCb04jrt!}(5pp#r8QWI)TH8GY(GVnt?D{k$y#F-`j&c&!$@~RcW}63Ufzpv#9gm z?NVw_!O`JN^tqe$lm-?ZW9~<}MB@L6f@c((H$M#u_UQw*=Aa1ksmlsAvQOEg**JjYy7}VWAj7ju zciLUj=CpSkvS5*sX;tT!(s5@(BfpZSRyJ&q|vYq{dv?-sYIusxe zKvdVKRnpigUIk4IJ+R=%%wYD@fkyc7q{1`>;rRMVYPN84K=>G{`zQT4W)M!?=g zW`&BXt>)|5k46bu)nJhdDzhnh!t< zJKn6{C|`=ZXet-8&L-pLjR1U)EdEADE8om`t}N$|{RqN7ztnTuR;Is4L#0Ecsw|mj z6MKu~-Q9H*UnAl90fCs7|CYN+iZq&`X|Y-Z9w>+gg6I}vM&UN0OTmToKdXY;;b_H~ z^8Uf@z^DLNBR&ch7>HfhaE^2m7nW@o>Ou%HwoVz^owcU4W2fz~%ITGmV-nGY-3%_S zlM{4+<9d*D`?t(s`%{$x_SRiQz6ryHHgZ$k95V4Q;6TQjTYG$s(@Hv$#BiD{B{3pX_ULw1Yz z2#5@#UtLlztZ#_p{QXu(d=J|bj#ggf(YRJsmq1cZeR-Lh3`d2Vxr+BK(6_}1yoLr0-pZC>rukE>Fv@NMWit5s(}=}0n}%Q84M*}C zTr1C<65xxfmutN%ll6kDh0>-NWPJAn$};S`?i1P$5oQNYF%-%kk0j(E$YK`zj+ws} zs!!wI&aR8e9L-H+OyVK}gIWsjlenQr4cEZq;xzZkucz!<6pmBimY&nKo7rkjz*)%e z%k~)^C|#uCy5!!<`-0XQfpDnUwg~|Z-LRwi+BE{6<l*#;nwsI5mQYWsdG+lYne@4I5DY`H-DcD| zizwk~WV+fEE}4OU-7xF1L2HSWLJ~1qz1<@Q)%gji@huE8bw$O+o8LlGbl4Ezf5a3k5`Q!m`5L zwd--l_Azo}`B0&LGw=(IT|yd4Lyf+wd3={v^Fl$`62;$bA$S-2VDJhQ9TY;@l)YSP zimG-&8p)7JVmv>(JCRz+I4sCpZASqN5~Vy45yDlrG|B^vCQ zxU~H=ZW-`Sn{93+Rt@<-REn)U+*85GIiOZ$7Np;JU;>-(=XJgmdWOa2SOGmL`xC1L z>NL2h0cWt97t95yy;!rIioL@)tMTmd_v!uhks%4(OBR<)kJC*tgJC~-@W&6pkvC;z1dGKO0Cj@khgJCij7`i*oH$Z72M#0GMt z?wEy}9&{DBsrT-&#>)_l^(dzYHcatxYnBC$Db#pw#iAY-$QqiY^dFDxCIn=D!uQ~` z#;DV)FaU+OL;nttB|rCQ+M`I{B(6B4a#MrVS3YOAQ}+k{>NpiMri9 zVFzYYZZe&{EmrOqiVo${qD7&ye7Q~lv*9RmeEr{_ENjc-iTWq@ml-D_G_h6N$6mgJ zggwWhX&qwr_kZwy^egRj1}97Qt;&I*wZ}M=;D)|kpKB?c`Wv?Esf?%ds9yGN1x#_w zz;!hMKfw?6H>2hn;S_Fgqk3tu8c^VnCt!k^imJUOKQlU@XdCF$(~%V0uDF$<6bY$E zH$1a#0OY@eM>k=_qhItyvh^1C8@==YG;OZj=(!aPd)oQZ_H2>89{@tsBJV{ni^$li z`f=ehfcd{0#;!3!v0To))&s0~5i0sWX%2VmG%)(vYxuVD*m}FC$;B=riE+I1kxo;} z!*wUj*XWQ`y5pFr(CAmM>-ZpO6<)^`UJ4IOJM1vF6WmvmSCZR`R8cn(n(G}W@STr1 z`N!Mp^RU;uV~-`bRnGNu8i>N}cPvTmno4~)w>Op4N1iby4Y4!BWs7y53@d9=3T;6Q z+=^SyhJ{!yKJ=it-5z3RcuCgn<9gq~*1MOb+gY68vc9-MC=#VR!qb6RftA{TM|oBK z8i{GO_Ys+U9OaW_9B+c%?`vDmXP-a#@IO zUNv_C(}%HT^tqdZBm~(N5h19CF*OI_=A7=+Iig(V!mELHy+6ms<u~$P0HWLte+mlmTE}TR+HcH$ zOCc>@O!B$9X|wQ*2NXRcFZ+gG>y_|G^mjNn=tJPJSIV~0>r%ybJr)Fo%WPqXPz;Is3FQzE&5pI%Uqlv6 z0mt8=UfA2=A*|vD-J9y%-QqEwRQ#xudozyGNw~8mMCC8)A4w%((&s>9JxP9c0vBaZP^N42DMY*_e^! zYb3w-D{YU)j^w~LEGk}8hT;9#(4EH+S2oYaZx?BHR(Y8Gj}zf#F_yzwh}S#yPuC%l zweXdTWf>S@LCCVvnNa(B%v@9cO!RxW0~TD(SG2;BBV@p5q_(+3#nf=+T_UeQ2?ol- zDgX=<`v;l;%*XS_Sowucc`ef>@+ts9OOGSuYW}(!h)7*0H6G^HoQ**tj` z_F_U~XMwv|(>~W%GtZBum1uNdx$7m0fRrJ^PF5F}r}i;!u9>DPEHW1}8*}}x>4MpD+T^op6Tdpg^#|sUG;cNDbb49aJfDy;S(8^DmGJB*OLgFETK!Pt zQ0dO|Jq>fZE}wC7q{k^RTJ;XgpHL(HX#)TpT8Yk{@kWxh?=0HjUNmxSzm^x(8peuy zSZBp%k!wqM>J^Uo=~oA!)#IY>%}Ne{5}XuTC*DD#T2rjmJk7N}*4ionN3@S5OUm(z z+qYOc{X6q^BQ;)^c}-=iDYuumNgzrrcW1s;(S+Q>&mgH-9denmQnB?HFfBUIO_-NmuWa3E%$ub(N?)%mhW^MENYcr}61` zLqE8D?uDnkr1)tbpSMB2*v++Wya3wk1`;S3lg*hz7?Wkj?r+}+{NgAgnS|s`1rI=e zIS_H%w=r@?VOg(?^tHUk-Ur|EGcuZ>zHa#sN&)$DJis7m`fKJ2z_UPVna!6To45xb z4N1#$J>Yj(joFlp|EY4sSmmtf#X^Fm={N)P|FzvQ{*MD=@_e)6o(~Y8`2CEaSfB)I z?tqn%fBFuJ38;WdH(xa|R%o~o;u%vFJ|NcI1|kY@)wzm}q195`7E%ng17k-J>IW6T zhQhYL*l1oR&NO;LTU=0%NuH;BS&_(~w#%xn6%~Zs6-BRw~ zbr3I|43g*N+Z#5kfdA=B_`G|K0HKX^xOAN?EXwLdKv8o(W3&i+0wnAXq7GL8@z{Uu zes)d^gq4pHd4q|G4ZM=NC*ymf-4Fb{X}3fo_{qvuRcAtk)hh%CKJ{t8q^6D~k^R@l zu#i8kq#ps25f0 zO4eA)bS5sNn*aJd^Vl`xCtv#-kAkUlVvw!w!D=J|Jr?i?vc4!2S|Q-PdP8PUQpQqz zs!yKnc&!fCI6%J3U^EIibkc7Oy>=do*|1a>{9pJ_8L+sBw*uk1_ECnz7CzbFI@n=L zEr@jfK(&)gsl&Pd7VsXAJHQizf2ADuWZ78>2;jWEUYXF{@6&5 z3PeHWolMhfqPh%eJQ@IfaQvwL3d=zo^l_4+ewjnE;L~(@ZW7WLQmX z7BOz;v44jBM$7J1jaDRj&4bVC=%u|v4L(>KZVSVzOVC1~w8ZO#kF#p|oJ)4(u+>T) zvyrnP>>L_(>Bk(pk7&7EYSES*X8riDYct`iGO@g<@)5YBu`V`A_LHvJot3x04y=2SkQ&@(`!zQ~^#hQtGQihVNTUN)5tMR&B7 z&^b6_@I^d%Ntq9-fPaXGUeHUgQ#gd7pJVt3D*KH6Bi!~j1Uj-AZHfgewEGJdGi1b9 zQ;cp#TG^&%(R4%qkrLAG&NJclkruMyegdJcdAh%ylik za69mQqTnD40uXUG*3h4c;k8cia84IB0GbNQl&LM}cr@m*-|Oq+4>L<`l$x%@kz96+ zI6!imlCk6}njR}c_m6Jng@*Sl*2tTKQc{dQEwPX)vWMmYv~V(t98v+WH@DmVu0$sv z;KfX@cMZIQ1JUc{{S8U46b08@4N=OGrO2ZDzS|al?{oWg?O#sl3t_5YW>X!~A?^yS ztu;^pnxO1T?7&m-aLZNOfRL@$0fEnBk;PG&3y_0A?NuJf8$oM2HmqYn>uM;y)K27q z{OzAi*>s(Fho8>|Hh`E0&`3+R%b^LO4f2jC;*ex#6-q5)_pRT$H=YN=1ky*MF@UQh z_8oj07a%3Hc*bU>>_<(gZEy>#!vfB8(+9Bj;Z-GHwdNa!7ZIBxD8ZkI!E{`DAkf_cbv3SV*7C%80lDIoHK)f`s86kKJW+ zKt?v`aryHann!A&DK0Bz4`H|~m`Tp$r{FoyqzyxA2^p%LKou=>BzvIG>JQ8e+8p^& zKrUnXf*OqAGDY7Js&QMRdbIe3^u0&%%H!1|x{A_(TH9u;!(pI&W`DKw3m&Ip@OVnOjvO70FvXG%6O%t|_rZNGEkun#?4NzjMJLR# z6E2c$2XSzacj?J}_>C^=rUhC>4G2Q{gDE<*fj^qaZ&WwS!A?mn?ppYNJlN)o^M9Gs zA?w*pzNWBsh__BZMTbnSkCvK&6Yp4@;4GV1p!Ltl(Lw46ZRo~ZBcZ|&T;S}7pOM8TB=Gb!T*&i9_txB73e zMX1KE{qZTYl-2WGP)54ngl9%cJqS8Z94iNgom2j_O3rl>JxrQ>lU&71Vwo+ZFeUX#(BI!5efhPrvlExi zsHKEias6|gP+Xt1iv3d2~hcVrl;zS zi69j+JVa~M{$sWvC(SiU4c>V^8JHBL_hSj9h zouhuPZLGVlc`SGP%fOW8JRKyRrLST<_Yrjv!OLI8;Bq4GDEAL4yYv-LDYIf~T3C8PyBlsB6x>=FjOf z@sHR@Vd~CQSxSv-R9)B9O3Btr_u#_Yz!WWGxUjQD9CIIx)s z1>)!C<1Ps?@U)&|T+4L*Af>I9mVUVP)(f*GS5X^qBX{e~s9Pqc5EESIZi#*m zSORpaR|){gYcNbjm4k(Gf_SrG-rKHe6GwxpAOjt<1dLrZH0%K<3b_!2sB3i zH5(?UFn)Em2YFh=_aPsYSMiUm>I5oa^|Y?EMp;jNt5_C=*UrVfh;SilTxu^Hi12Zm zuQDSMO`4=~Bi7We2PJ+ua_PC{Jb>Q~JCXo2?e96R1oN!GvK1IVDE_F@pxz5F3 zTwthT*@qx4i&~R4My;f%9j>cf&K$$p_hUrLqK9h?prG8>TIakoDag#9$iNi7@=*Ic z#jj?X5Dn=n2U4PPSXJah4m|b{L3qp7*CC~m=0yN=*8`OOuWP5&>D>f z0y!wiHTdWZ_JZ#W<@i-dkL^Sm6#|O=bcwN@t3wXq6h=^WX6dE{r36b_G5IWpRS-TX zf}`NHG8D0bMOnGCV&wDy7N$BeB9=XVc$v_BYhoDlS_XP?F-3+{goc<0b+=Y66 zt*-4+uH`Lwo|19xwB|m#@~JTY24k<%R$i(0!Wzq?6HPiN$}kgzU6Fikr-Ui|F?ogX zL@?97u`8Z0HjI0u-x65nIaSOJX+-WEQ^wjr|B)x^g-p8-{!AI`W(xGg)Pxl8HS1e> z(h=I0i&9r4D_`&10+U|(sP7=}F+L?V(zVb0BYv&7+C_}(*EU<^y|YnJ?Vc}@UDT+< ztDXT~VJ2?ac2Vp;z{A)1e=b6bqSqV z9D{Y8YPoH+MO_;$mbx+Dw%M6%Sm_Q3yqk>I7hD<|1Ng{Jm2nWCD~0Leqw&uvUCi6m0VXfP2whU^S_D1=vz$lJ5u9; z{jaREx2~Iq0*MDfD@QoH?{At>oMM`_8%BSlB@?kvF1EAhvxfS+E~jO+!=+8m%7`R3 zI2gM_QfDQuA37yE&-)_{A}z&_#zV|Ip<6WZ=9ywuoFDUvO$JJh)Z>oZa=LJH>FcaZ zXkp^xbv&?fQSmn!^@gtv61oXfor~UR58nbxalUH$f0oo3+OfJS0m~}oH7_B});Z=) zKllKCydNQU^Ftrx^Ye5#)|fVTUU@*NsqS){NC+$(b!|m2C$>I|dDEftN@TyLPZ__V zx?J=eJ7ploT{?2Bm8OyG&eh?b&T{aGStTWYpL1P;H)HgC*Nif>@#Ij zO$4&fn6n=p?Hqli00(5%HeED{UpN-zjBp=%E_L*=)+}Z;^v-svx&(^OgUETG>M|P) zY&+w(Hb8jvu+3!FDU3po`V`=$eSw zwa}}0*@vbJdhVf77xPg7#i}lWGRk#*S(WwD{m#rdEZ=@pImlaSZ-L##Ox{NdL7^!~ zD+%2YxSJtKcnjSJZ^(qafj}`jNLfcokf4pLTGpBESk)TrE{1BP9Nz#p5b@p*DK70KO49bli(1s6Z@MQlsK7IjMDKGm)4K`&z%AnysR+28r>wid%L5XV zqGo4z*QDq6xY;5$`@Lj>7f5))7cX+?0Zg6ZA1fT_9U0ZRf~c1@M@E=%t``|#8A}CD zK~lt_ERXiEA!(nY3wfKqMn4TKdtE*x7Gxj33!{pqxGP%x_3vV=Iwg+#QoG#;Zdl~J zfj}`jNLfcokf8mfVAYmZrWem$le#WJs2H0KavzWoOXKoHjh6=YS!XiSHn_uVlJd*! z%GqF5PP7^F=pkTX^W!ly?UCbJgZ4?ueT4hP^AG9G(|zrJT=7x?(R%VDUA^sd8(=@9 zZzGsPYo|>8I@_F$El%7SVIc&sc@%le%^|pybcaN?@e!hgpau%)LXV!Ev8Pt`1D2Ua*7tkLj11);QLh3hutv09$ctKcgb!WU-R3G zOsvz;W`9*+U%reZW5iZ}0d`qJ(jalB9Td`_9|wuO6P^VawbnLaT&@K=V0~&Zzw%~ z&2EDIPn{3wT~|D}1NIO5XdHgeEP^yMH`ENgC4BApC@^Gz1Fc{oy?}$`Wn1!pxnWm3 zd|afDU`V1n;N)0zCccVFH@Pl|H0HnP?>b@u{tLFSvf_gvhjdqkkpwZ9%iOgMh7*Og zoYFQ8vTBf#LEWLxt~?C&;<1xNlq+tWWXwnBk7%wVDC&E-I!7QpiAxp^~lUr430jQz%H<>ntu@?sPw@xc;Us*-ig6HQRe0s{An;By32% z1w>jWgQV^PbCoW-&)OD_5|&)bcxW{c>W~IT6jR?+>$e%{;v;fS4$m+#82Cs|p$7|9 zzHXiFPY;o^yaSeRj*{T7${%#qT56Z4o`EfXTsV;;r3ezD!Lb31 zo9YL|tqv-lO`r5FbgJ4U%9#jjw=D?*FfQ{kR2S+hrsgz%u=@XaL3apEinN?r0Y^gU zx$hREDHueTnEfz^wo7MkR}fP?V?$A}=)SM+q+y)t344!BgCIotpRh=R#_lE!Mn2s`m@%?jkuh zdvJ#z*cWew zk12Z{ejV8v=@^qo|413;Ast6>WVx6gMzf}>7ibXhB9t3OEZLkJ6gJv6K*KlZee_py z`WbFUtgTcnI2MwXxZG8Vzl*UnmtSFaOR5E##8De*x3w@hBY)lTZsNl0q*3h2h11f& za!cWeQ1)vk#Vo%i-v_IHrMW4oSb{!k8<;mh+0kGVtv<_CGpS%wxy9tDvH`lq72JlL zeGXY`b@QbarmPR>s>*52ytZ7&m+f!1N$P#$=b?wN(S;an-T#j$)14Wk3m8=edaw!3 z%Ad0}TM^d<^U{c~0?fH>i;jWkZJ^oFseFD3VmPC7LpX^_cDBpXy_MAqi@=1tYR|{B zf*}Bn+|y9sdJ8_J=tRsVEO-TAvG|<;AN%39O^-%G)mOwx$dp9o?q!CU6{4*t5hAes zte}@pQI`;>H{NQgG94<3+0bey%j2Cw6SAZpa6yLXM>>Z6wGq)`6}H&jVtyWy@j5sR zCjCxiG2cLNQKfmae!_A~iiL)nmtPjm7(H1|Cz=IUpLO(Sn-6SV7pix`#S_DDDLCkg zj$p)61mES5<6!F4g>>k4J{_p9F-I6+;>2d3FkZGvN;N8rNM-#rZVRK+9wnJ13XFVG z0+WfDgzgdH68Q?2>qeB16%Mh?;wVm7;)ZC%Vxa%Vg)5M|o`WI4Xw~wQ%rE(0hEe}c z(Z~~V1Os?kLo!aH*Q*in{bZH?m;7pg3YN)%d*261^duE4h7&jyZmeCK&&RPZ{bTGd^x)(9%b?~HOcm^MmY;byGXe{^rP?yK0WvQb!=L`hgZh5~ z&Kb#0)JxchtS@MnQv%GT82x&^56qy4<%Zqha>u-9ooX0h(Pzsr7UtZ zGC1qXxe*dSl((ku+mij9*wuj9*A{rZG5Q#{Kpn2>rAxllN2IB^TIzF7T=8s4l?D$_2+_OcIKupMQ$ z=OwU^OBB_>$9B#J0g9v$(`8*@C{_uZ+ONp`mN6{2pw-d2%F4ICV0It|#_T{DE!kIl zp?_EHxXCk@h$-0^?yx286Eu-!R7xOJ-9LaZr(fW^o{Va{TkB`lx}m|{=`nwqMSKSp z=8UKgpi^(4vpa#bM5jmb#In1=m>M}o_Gx18aLs#?DQXrn`*|SFAy)sgUT_$_%uc7S z%+(qO>vrFpVxZJzIP(lL3mZCW9ckgJaQqt&f>RFxD}B|5EteD92bu&Fg81fA4@a`W z(@7jMEiHG)D}EXG!&b>#uE5YexW$Zf%$cpbuih_~6pr+q-EsK`WH0SGRZkmt0Q!?x z@M-QRTdstZ5TueS{JwH0Mn8MZLs|9EgM<$XLK_XYp;zUY!rWh_se6gD1l$B*qPVf`5-`3 zVV+}uY`6FWBhe$Y^%30^+syH#BPb0;%^GIKh?$*|vG;bpi14YdpOK|cc|8yUc-9d^ z-vPu7_sVbs>|GLWW?-BL^f^#68ET~C&vf3fnD$jwr0_so&d-G|ryEAtqnz+%g4X_ zb4&eW5>N@>Q$^e8kC1SVTIsgM+Zpmo0}bZBjsO0b_JKFcvCy&cD3$#rr_;JyY86%K zFP=ugNMtjw977>*r7_%(t(tWYEUpYe`@i?ePcH(s;MeCM-Vf6q=Vl|S(F_C*rFc6VPlXn?hu(yuvCuMrFSfI{Z+b&Fw!v-I_57U zI<`1Wz*O>9{!;_t@7<{c!lJB4ezi|$kn1=D*e|)k?`DWzI~1fm%YljQqZ$*vZg>i# zSM(jTW6L8XYL4n%A8I~rL9}>MjPk&UTp!s+V!&1l)0nF>n$bP>CXDp3ukM(UUmD?qr4r9lkdaH{TrqIW zk7x=$4nz)wDiZzb(`-Rf@XY5A4exB65!sP)+|`t#qwx`Hg_>IEJntb*9YNnOnax^9 zrhB%=bsr&Od+EG4`)hTP0e**tETlFujgx=X^^E3tWsp zigu4HBn$HX5j#1xSN%Xj_Ri*|gw@Ab6t_DA>j$mhU+c`J0yyhv?TbooYN%e;=rwRI zkElYDFY!f%GsXKbvNSW4&jHB0TaYXj1dU^z_|C@@S>pYih>y-dht)5+-HnEg7!jH9b{(l(?Y9 z;UwGsSTp6O^^>|OGbO?NO$QVrI-?co9Yv-^42)t-C8qDm@gZJ-i`v)q*OTN_Fx40U z3qt4(ru_6E6DI9!BYpHh`)3h(4>XY>s1?3O5QVhy1P}56j=T)r8#~viAS|1Bujf^! zxO=+)mfIuPo~CR^mtJgWg2HZ14Y(S>M@WYOYw&eS0>l!_irVK7dhLxby!f&00D1Q) z7mmS~kd`?g>TxAxIeur+HFOrHHPVD3g)jO#|5PEW`YgEV>3=&?J z{8UfZ-rOa*@{DB`SX^F_d~EIU+D}`7 zBANh!Doj2f&q@Dem`QgS63tmwwaWJbAAFijrnU1?yqyFeb58P3!w*z)=~s&dD6O!@ zoZd%obmwAUk;r|@3=hv&&**7|Vi@A3P$s|J04m;d0Z4{C#kpdQWB4h)xnl z190J*+{);TYmr1O=FD^WxIH&syB}cNo1u0rN9ejFa;f!kdK0`z24PBp1zG6B8c*Uao@8RkTd zyvYQ4anAdrzGr;k8nLmo;v%R1*{>gp4Dv3>JLu56GLJoPt_jbUKz{;wrvL4IAv=bh zK({%Tma^s6gSltuhcr!?zLfji_a29alqZJ;7ewm&uq`m4z=Co2oe80t0Ky2LBw zl%Wk*7B&gO%PNOV0&7>Fdr-w--AAsv$+a%HR*YtDR4i|E-qu~fOo)$fBu8EgRS$O8b)Jv~i- zm`>j#H5;|A0V09Ck&F&l;oD53H+uNY&cM{RY4U^T;*X0@&pkX znV0raVLm|!vLNf<291L6Ufab1`R}(OlLAyycm*`r8ys(%Qy3)lcZ-6gGd`my4{S2} zU>N&IL%o%VCxn*z5rz%#(KX^hr}C6};jS9U=>V(RijpsHy2$8?-nzzi#vwMnwj0rT zQkMnRenk;IV^E~+X=SgK`J58Ob-8}-%J&xBYPCm2z9kLE=7!bRopW$^8Y;`EaFi*x z=S|RpB$>e-C`)J;(PCZ}U0faR+`faI-3TKR|6lHmaSw(XcNRj6okrDORo+xTDFjG{ zX{tm{XlUp?Y=zm+OIv#_PvHX=0kvg3q5gaS06JyP;&mq)rlABKt)|>z;(izf?x4(Jl5GsWF!FtG-_ih~*0)UBH)<^B`_-VPD;eK+fdd9x!8f2WL00t) zC^504CH@7-?OmQ~{_HG^0_Z}aPBsRDOvEcqug+XF`bBCu-UrBHDElXzx_~q8IJ%9JqgZQxssM`=#a%>3toi1Eb`r3G zm?D2nmfC5gl#1nQtjeJ>GNx9Pq7GO=T7d7Q=F%P${(l&nFAJu-!@J@Y$U{g z1q$d{k`|EfT+_VK?q!W}-UI2VZiEt<^4%uX)etX^HdqcPfoeK>*Poz!%G@i9ob@uy ziE~$z52c53{_9l4)zVfq* z0~!ByIh*3_)wieLAhIY2ub4~|l|v*n`-IVfCEob|5V6Mw<$3)YlshyzyfSfG+@u6A_e7Zw;F6Na^^9?) zv_ZI}6Cy&kc^cBXxy#n70sE6K@k7ZeM^XwGe_sDDGETrghz)nj*e7B{RCAar++0p_ z$57sA=Af@VvtFh5tgM|NOMg#mNk8rojba01Jh7**sBe6mo^WCi-73PZa^EGC>p_P3 z;gDJ6htFDA2w(Xp3cs~k_x2(NyFg=2C5mrP&5RfJ%Q**PutQ^y<+{W>#rHljJ6xE#0ql)jp+Yevj#XY)M(D6od6?x;QvQ8F zOmoA*=nn-PSR|X&x|X5ses4RNFK0NuDYjaAn4&ZAUm7MtSIk1$d#4-)LdS_N2k>2&tpIc6^BEniPEeF8Z?fm#5yrDb2N<|);-yV3Y z`@Rir-GK0bIr0%HC#%Y&K3mMSo%sxm%x!y`Bk9ACsgOadk}Xp3r3ZU)6VW0AudXK~&C|%u{#rN!hOd*2|f1_UuV0sR29oTR-F; z8t7LL@W~i>ZZc#|u%dA7CUTK2{IPwFA8=bZ zuq>Npu0FX0R%kdwN|&~b|B~B(de=v83|I!;$8KVe&%I3FyO4_;yjYxC+4961|KH-rhO7_4JWkSC1D?Q=XZU7{R$gzaCB{qvI z+7h9Yb}r*N<|kU7NbERX|MwmeX09#-i51^Shc9kSa!Uib^G>`72e+2Y&O8IY7a0%2~$D z^8$4DNPSH@ABJ}07FQNgM5Z!ktY#%FiOIqO+LW-yZVYRK#4s~6wRd`vR7_4Ml^1|HJ)GH!~E97&)Tc4&e*)8$=0r_1$&6!suKYJ+GQp z0!0v5` zQEe^`dqX3_djId(ihvy=+7|z+;;9bOcb_*6J!@aI>WsOEzzTXC?dwj)#%J=c0i-WDFLsTh9s4l52$V8qNK`e(1JxU;D2*zNx0lnUb?s`58R=h7Mhydv zif*P@iX)9q3?l=ysr~@n85g+%>-#^C!a*`kDu3}R=J6+uN7Z&1*T@U86BxkpS}xYs z%(mu}f7~e>>%@0cqKkzc+7Sk-zt*uX#aBG*8@){)W$04z(Aw&{ex>;6SitLu-%DL} z0#R@7{(xl4#=!u924;7qnb$YrMg%YE&TGJ0m5~0FuoHFVUT#n?y5=ZDTu4C)G&YRX zC10xDcbxDl%zV!c!_7N9USz`k$%|B7Rm%!=bQS{K{VAngAT`|6iRBld5~BS+IsT#} zi$+VlLVU0yAsuoN>>XMDG1&~z65wJic8|`i(4LoAwauFWZN*iKQ(8OF_{;U~+)O4} zh&iRY?G-iZWK>W=5Sw_xIr6W_1DqN`YMn%Y>vTe*E=zPU2i}AF(TcaGh4)AgW}UWd z~0c6#=+&$yGEQU)%70w!ms`iz}&x3f6fU-|?|57Cu3$wE!I{_6% zIOP{QmY#y>$Z+ufofcpW@qa({?_9C<;r`cWqy8#Ms*zA3Y8I{++iyAr)bY@Hhw2|` zxj@rfkpHY0#J!F{mH9?{#Ga79;x^QeoqmqT>UD7t^ly|q&i*F_nBf=BSMqf|QHw@I z*8)e3yAxd%k{p-#%u}7lJqaln@WH@NE^zr%ts%wGPS59^tG+sT`zxP9E!hbgo7tMc z0Yn_89g)SOF;+W}AZt9mE^K8)8wBPfQ5;zP)7qQEpP1`+BJW~DLWj`jr4-fpL5N&< zkZhE%mMV1edPueM*Qp^0Oz3^}acciWW|~tG!28Q_d0A3D9tWYqZq#6CEEq#leL3x@jQ*NTd{pjV zOE7kyKjVAiUD`ac1`=X%0$iWh#F-|^Nh^lc&3R7-&@w6^?+a(0f9R12?r)8m#`s#3 zEWh$}hwE@l!uIbVP6bbTC;+nrG=vDcrWaIHyfYu6>ETSx0Pi~;h1gL?A`L5QhIPCw z0QOKhT|??u@_rr;wFP6>s~eACq5%B|P7id8>1wdL$QmRjn6Ha@=R(qd(=Q?aV85DE zcoNCX4G&K|q8Y9^3e$m(8@9yF_p1jJ;cKW?l#2{s7llMotF8RS5!* zVI4lgjZ3I8Bp@BCnhyN6aw5x^D@iH}@^S4S*~v?1-NB{fTrA^XO3~+G(KsL|15u9h z_!5L3|Iw-l(*TYB1mUALJOkm1gOlC#4cWv^L2hqpgTI%k|M~b^C)`|Y{%GN@~h8!P{F5y|nXBaBzf*$=1sDgR+jx#ou*cT6Ae1a!zg z8bbw&?_`>BADgMm1x9HLQ?R<0&v((q-P@srKq3$9?=6!yq55Rl6w5`_f5)1=pyt-O zKORnJ|KW{pNDRsmjDhXDS-Z6XP3V)q{2%RRgm?ku{{V?k4p~iFuI5u`Z2H)z&+>Om z=>(09a}(u-Rb)fo|KvqVrVh-wvu&OfD#MZy(!NeZGfB{14Wi?_g8)i5ODSRe$o#zU zk`Ut=G%+w2#2flUz)bk&ZMF}unhn|}Pc@ew%@v9eGs2#Fs1~dU*v$UM1$cc+vt)Uh zjECLMJj(`DYhsc_ZiS9qRxBf|C)7ce%{PZ@;cb1W(>;3m0re}^_Cr*tUg?x%)1m7v z^O(aqtREPkx-H{{{2@-&VN#x#a9+eR!LzHE&mUF8icpq7>FmuHP0_Uh_3SM_Ul%z( zsv$qWCR#FFS&~6dr)I7gzu>_5MCn0xR^7!S_oLeb+p)x2z=s#i?EN}N(Q`An2Z741 z*>7NG$fbjS>^Ew5U+rKiRq**_(zM~#)c5^AHta%->S(rZXbY-yk--Y|15+ei_toTF z>Xy)kBhct3S?m0-W$S9P; zLOgPZesBrJLL|Dh0gmHp4xD$=qLn*i(xj?uS3a#fK?)As`Jl26G=?!OKy&lZ{ZIMR z`1_a+!XDCn1tjyW7anUwr-Yl*Kp&8UO-d+dfDbOVJ9FgkhlF!za@*W;@r%oFD*dxc zEJaoIhe@OcMi4x`26XQIEiIpSd+1b9;Q(OvtYnI$Bevt}6T-a8S|2lv3$M!RW?Z)B zUeUU%fv8bD2<2ir@`_TkvkF|gP8n7r>Pc+?re_{$$l?Q2ZYbTI@2KBs zB14~;-aHOBm3QbiwncHst#Rr-#^jc{=(LRfGhJBMO#VQivFY-@Lc0BnV_zY~=@rg> z|HV=7H-XV}=~cQu)>aUeon%8C$#24q-+Vtgp{hf55cipWh0{?`OC5DAG^mw6yO-7pO29#R*lxaLU$!iFFmfPUR|f<^=MXYQwr4yg_;5 z(IYWl;ex*nnn)n(Ag~sg(;Z*n@Io$}{QxU}i>Z)_ueRHRAc5d$=IGgOJ$phy@_|D< zG3y+)2=@(+FlvSbSZ^|K>Yuty;hY(_2cNUC@TIjSu74`$@XRyIER1rgYSE*N+A^$e zslX9zrCPQfM0o1?VNG@ezxi%qN3u)qL;$l{Ymy)YDn@L(;I=)h@+esR@-%Olz~MnC z9y3A>slo|u6KV#dphvA{oPkUq_TH7cuMOIo;7i>$c&}u>ci5D>AOZOHDZALe>wdN_ zsGl0D77%9 zUF~v{X*S+tLOB>fZA6%5C$Do?$$k18cI~5o)-8TAQQPw+_|58zXD7uMo>T>S=M<_d z3gKv#Nszw7GTnkJk5K&}r`rwA?pNAgaFz#cO5^iO9J7px@ z^+_4I@CX}HZ{*U_AnrsL&sS2idyU?z?Gm@Bpp`>*)SUT~u@7yp#W}c9RUVVJ-ZaSc zijO>$$=#E+aIik=yQ>Tq<_i914x^=WRNhT#?mcjU0R|?2{sgQgcim?YN=nCIXmQ^| zW5|~ng1#F4vlW55jA$bsI_|>}&<8{~aphy4zQnondVYbkSf&p$yI*YYz-&nj(;^JR z=flP#;~{q9!C5+5(u1tnA>*(i5xY<>g6p!Ske!l zVP*Sk4*O7B+5Pe7IPll)Ed( z4m>hTkph<5wG)fPfvJpbw3&mGXw0ps)#&sX)+r;PFx!(5&KYQoFcQQNWJ-6fzFaI> zbbxct&x7lDe;R*ZU!~RIzI1i{p8Hk94i{bWT45CB`a9Ku7{g+g&QGhlsXr| z2f@PtI*#h0!Xp~Rj?KH8+nqFJ`kPEPgyenL24s>k?7C-*G0wmfvn66u-`@!hEj0*U zkOU1%3fo2)+o%^a(=pb$g-~F~`X2a};EQ-a^CF4BQ{2bO@UvmHk9D0(tL-DFhG7&E z0i;ro3TZxZ`34--ocaWWQGnT7vF=z|=D4iX#A*cQ#`WHG%0_uwExge@fhvsw1@SQX zo0(&H&VZ#8Q+fLDcX6Hz{$pG9)%Z`=ZslTwP!oUFV7a!dt2FT3D1F9sNoCw2r9SRpY*y!&=RGwRke_GD#1ar^GmU8&R%1g=_IH zKs3a%nTf3L7LjCdEOavKSz+ME0bXXaG;O89-z>F9G~Q<$GrZpN@;J)?D2pi_LUUG^ z?%WTFyFHenEAXS5x>nwkx8JjQ)J)D1jis);bFQ3zM4`$ly%y`wgPc~}u96Zz57j?i zblJ&mpa2V^=E_NoXC|699{zWh9|>8m#;L3YtTPwCF7E$F60F2CtLAd}NO-9)L8OjM zy>K=1$14d6bK-Er*ha##nBakXku9+|XHUK~59zZ4=P=S{({4-+K7n1fLV|B02R!9J z!kaWtvnSx&_T>Be`4x2R?XeIBtOgCAT1fy@M}@YQ?1XpcZ9&{4k)rTDE` zjZbnGE9j)c0b;`Y+R`V)w!0`AbOy7EOm%->;nqA}0h%ORXzeru>Kg2>f1NBkQTPeg@W|Kl8-2Vk{IX%JYIgUd$(vW;KAt}MuX{AO!TjT3dU{M%V!$A@PddD z;_q!${Vi=+%N2C0O^y}Hn?YL|liwF-;u{-zQ3r$rM@9LuAVROl4auIt@tk%!Zs z(L3~y`xZO`HC~=j2L>`T4?YpS+T7@%O<7&xE%;B_ z4Ldafk*B47KR~OD@4CyTeZti;zw+mp*55k%X+ti)*_~cG(COYY?(zb+wQZ}!@s6BA zwAK^5QdTo^>#n#sT~X)xWUoU!ITBn@r$4@+8sQf&0wkGq;zH)Y{a@nt41>D5#WK`B zZ4_*9qSF$^`l6sPw(0EfuTK;!ygtk)=oQS?EU8)|GlKo~+RSOL_w3(nQ*Ll>a-ZDV zlNg^DPGFA%RJl@&nm&8QR#t#ULIJ2XHgyY3hq9k z-W;LvEH+71Lf6)jo0h6n?C=~kc6)O590!#0_a;Dp@`a^SvDn-WEi$MzK~&3>KQBZc zj_!LMxm)PfTFW_L^x*k0684hv1lC?mL9?ItTejaIs2KtTWDAD{4QfB9*e(b{+L|(7 zx8-;w!Sh&&;!{`1ue)edqds$=GAl4f^((z&I*X8~e;`oO$&ms?3}2!xls0Cjl+z9x z+E80R>%oj5KSySpF~gii8*KFhteXEMMZ>bqOisC|8`eX{eX`8ZjP@!#M>o}MTnA37 zX7?eS1^lPWXM1}kU%MAenT8-)*Jt3i6=&+_ZP`8^r*TDCC&krQejw`*&zyvP7_-kR zP>7wKyUHIH-WKM6y#gTd_ctTA3A>13nY_YWQO7ghPI8%1!^qisMNDxg4uOsLLi z+`%grit^gVid@_#Um}F&Y5MRD^im@5=MKP?D4No@b91;jUSgl`-?pYiS^qr^G6hDa z4r~P*_d~D!o>f@SHy4F*gTa4El8CJFY2z}SI$?A4{)xZuJlijC`4107PW}&-6h+P< zidE$d#kR#5;oQ4L=d*A?5aw_z2D>n$z!|Pyi6RlUsKxQouUL&^A;~nsDx-j3v6ZON z)b!Gj<;5wgr=Ub;yvr|66k1#{5TLAr&@@Gk1ici~0z-LvKDI~tQt`*q{Q;4f=J$E% zq6txKeWqnjjFs?uzpUVEB5=cc98TJEdha=bw9e_z*}6>}(#hwM%IodAJ!Ni&U4K+W zlN%Xzu|aBFM^KzmfrGJ`T(s^3ZXU84zCIWbA^GFG$oMm?^727`d%m+6-`d+zTBO9M z-fxO*6odz8OV39u#_HiP-&LXF3mksiOHCuZqXHxGh2QladPa3$1ymgWnKn!auaGtd zo9bUP6uk^6mRW=oKyQD)?AwMpEug?p(~!7oAHviWaSu6pC6A(Yla5 zOtsG4J!~KnP+98&q^1AaAiUs+&f&Lx)rv^Hh4XU*$RogSgMr z36igzK~IaEnyn>-bGfr46ax!Tv%db;nUe+>xomdM;6m-^d{AiJ1v?`FMiKbEVrD#3 z3+z@-#+gp(sONGir=v)yeTh5nWobK``ySveM$h>H61pt1a3j zwegHz_NASID1>wHz+*lcBW%Y`6OI|x^3d^GQV#w}#V#HhJ=pEk(nDB7U(Sh`)GW#z z*40**999FATUjF}quY{29I40DQi^fjMa>V!YYyXYQ-d=gZxFoo_`ak>xq9bwUq@oX zRO8(|&sc`-I*Y(tb(`)k>?bY3N|n6}8#Y%^1ppA%MNYCL3zug1I;>c%k=YFP38Av3 zDmgDra?@E^J|QT!aNds+XX^G%DmHbM9~S-K{MX2>X?zlMHvN&uShRurE7kT68BGL^ z?ZB>`)@etzh!?rh&zmRS6fjrrx(+|$?ceifCnZr129l~=K}N7);RKluD3-etAk)*8 zKgK=JNJCH*;tz(PN7f=vrz;bto(_l|$+q{7eck-SAN&^kCGtUEY12zoxiA_TjdrW_ z3s+YoO)IwJh9@f9!9{CS}zGN>c$kt9P9D)yPR&j&_gda*lW7)zdnQrGI?Fo z_Gin6lQ`JtfnT+Xy!gv+UZW&JZ{v##T{3g#nPUnuQNN9VK5in9CEL!+=NrG_)m-H6 zU6$*8E@YLZZ#{e3kB>ew;oBN7UPAPQ>@#~fn0dbL<lyimaxd>yhwid`T~xPBUQt1ql4;8cFz9GI)#f^3t3os4zsmZxi@#s-QeiplLovxsjugdo{<;}Z z59=>}Mw?P6FyWbNTCU|@mVjPF5bjd+9j?`mqf7=XHd5>=+tFBx?O2^_q8?o?hQATK zEPQk$e7%dMhsbtLHU|0ciGFp)Wk|UP2ox#TBGc%-0 z&XNIrZqn26-7dm6n-Tk`sqbZ4$2grqSrnWCZ0Q%N&M1 z13xyS1cz!e>q8eYw|`jCfp`g24+43?{P zXhq!!?@n8@U2jT1FUsHK?Q9^uRBo?>sQKA7rl$xJ(GsC4-RM~eeg>Q(uYkr4Vi`jiivda7Bi%pNGI$x+a49R;55r`6+pW4b*&$ti@OLlauc z_HjBEQ>Ar9Cl*78He{0y`d^p@_*1oap)cNP^e?c4*i-d$!$Ynup9Nl_MoWV87dyT| z@fda{!2j|$TSeh<7kQyA%m5+pK{;^M)Z>aujBJmUtkl)q*IMViGbw1yp2;8-zVcAs z`1~L~x#x(Dh*w>|*Ybvy3vGvgY^w(QB(x2{>#LA{=nubua>bXP9WMvG9Jsxd3D!B} zyNv&{T5*|LT7^7^iQeWHF?KKR5yON+}OkxvF3T7 znBPvcXF$*Od}V@vC^Y%`Wi=sg>+~j&oN=@ z8#B`1Mx}6P+Wm~M?+}B_r~dZz#SQY|?;PLW3ln|CdkQhEn2jJmkv%94it&o7QW#sw z@1Xxs!V9~12{!)n^SsjVAw$+pwI_`2q)0o^rSLlA634k1!&+7-RsG1unJZUvBUA9Y zmMQjj1O(7FPZghWGz1;qxTZCx@iFlIfia!byH zLvTDzVB7)>tHZ|Y%(MAC2AwK_@f3F6ga^kYT*f_{OxX<~R2HR%j`|7B5^|uuZKdOv z2-QYpc0Uo$!nJqnpbTDBJ(rS=zG^P(zq^$$(1P-G$J}ke+3A7)0^F3w$BnzW%$}Xy zOR|qI<+D1rTFdb@2e3m~pt}2;2l8QR3XEZW^grvz_O5i08r!LpwD7Ki_{*U7f7}0Q zVn_Yn-&3Ak91#8r>R*%)lh}-i2SV977;=B<(Ri0O9S}quDsRH^xr?qnfyfCCY{9{B0Qu+5na`n=SHTq zlNJgcX+}4Y-lBJ-W8fv;STY6=fC6HW{%ca(8H4=&L2VMw*5) z0$)C`w8~0ylkYAAEhX1g$@DkhR&_MrQ8hJ4F~MT5>Cs!!v%3Cu>78W!m%Mt^VF9L3 zcWbDAvGIT|qoev#7FukV*WXMjslv<>U7F$2*m5dm93IQ>2X&;$E=?HTt;qm!gCv&M z5!9($8CQ6-xuQBX>49Q_0;3wGd=eeV4-|msPWFWs3Q#5$oo~bf6lqm9NVmJvUbP5v+6g4vHZ>Lar$?E zs8LfiMOz{*GA=l)Ppy9EAPYp2MM6^53{GyfxDZG|Y1KL%Hw9)j=3oq5pAg`UiUP*4 zzLIj|<8Zv!sGl97_ndwzbY9y1f=xUAkFo;`@W-n=Y~r?!EP%pji#s=>bg-VFe38j! z3*VbA&1EyXPNCuQ&v^`eNvGJfkGmAWiuCNogb6p6yRowm&!gxkw_xD;tjB~jWN8eW zGoovsR7y-1?VruE?P8-MV2;N^(k@?crrj>~vQ2%fP+D#{jnwaY>8!zRneXc)-x0{G ziskk@012eFa?=ate+bA~W{-P|nX(4<(K)T9y`s&9`od{rp#21fqCK+_j|lT98jCwp za)OkF&YcU=(6Kj6Tfzr#MqZNv!kEp5{K{*(@C5v)U;1Vf5-PCY0@6Lp)G_4A2eCC^ zgD1*(5a9pyepj}mX?Br&LnDAf8Cf^sth6x`pC3%qdz23J=rW0OFe-aKSIky036`qv zweAq*^AdZH(HEcr7t-s7!T>BoDQn#a~mW1QdxktBs$&w( z&<>I#)ve+V({e#3Z9fSDq=6@zAajomyAC6>DwizF6l1t|M(s)_xwBI9P2F$8qjeEC z6sSR{o&4|32bupbwWbcNU?JLbl=_OPjA}X!6mESqhS{wTukT!{Y$4pxPMWwuizUA zfIE0}c4O)?^6*~ihm!C!yF4PzX+?Zw4tD(bZm@6ytz7qIo)-}#gjL$S7&wB%PtM%t zRxL`oLLV}qe_=U^DYF9w8aZ5A(AD%L)0E9{L$zIRI&CBWw^J{zxV}c8&GXGFJFD_ja zGHiK5w(Qz#AXuALS7b@i6?1Jq3_2*L<@jAi*nH8P%TuxHu3Q{@J++)F>ZfM;a>;p5G+W8c6hdLsDN>JTtN z!UCf3!b9GXvT+e~A;{3NRc393mgg?@gTao;cVuV=EbsSxKw~z?owy_MPWBjC(`p+C z?ZWo>_QVlFhza5~hwEZh|4lbEH-BuLP-1872(ErzlaL!ifOR!Bn2Hh#x*a{*bw*CX z%e2?A+|gSb$7M182>EeQljK<2$eH0`#Twf~eXs1L0yVVEkJk2JZEFoCKx_Os?N8pt zT-9_f`(xhsz(=2O#D|+8$+fc;y16h}eKw$OTWiMVej@dgTHOO0iEZISXQ>xVk&F-E z;Tz(!Q%WHzaw%s-+wM(T0NeyGu7-&ikxvrG*lg2sxrLC1Pb zLP|hajgS9oEzsctQl7M5(<_1~oXpG#BzGYsq|0VPcQ1XEi+pCj&DFA<`V@x4mT`&n z?6G)5VhiOWj_MVOsAIahzMf$$;@Lt`KSh~{lm#j&<4iRDgNS6>dRlC1MtFI6f+YL; z_jsdVF}-G8)xtfbsb5F8%g&8G39vY|u@Me5t_!8Y34YpiA?;0|A@}{(&FP0LFbB( z*0Y?sd0$Y-3$`_0n3gAny=UwTaNrLtCkQ(kBMpO-_iP)UT`6vn4%QyV|LHt8$-K{h zccB4qwuq9RJ5#*j)l)U;`Oy%PU=!z4@3R=2BLS~Ck6rsLVY8=+x&+E&_Up&wV_Wdvd=hDcJ&_y< zfET6{G9A4GkzLA>`O^{>zR+Mv&w$T`xeA?O@=P-G;*0et`f<`EYH`z(x_-UaU-#64 zgT4n4nr0sllDPnx&g&V`6|Dd= z4!aZdJ9e$gYF6c@0`^ER9V_v=-Ft-NFNq5tR;{zudadcUu_)*n2=TOs$3 zYufmyIOmaJ8sA_6F@fe^SWG_ZR-R@+ zCH9XXK0f(*n=NZAUVDGo>NabXxjZbOo3=1ix{}U60!=6Ez)=krSnKan z1%s=(@a%<5_hsYt*xKA^5G>!olK&1RiYh=7S0)&381u`*7UgsUQ4!%FanEF*g4Fp&Wo+}jWp=@WBtChy1Pk8PyAK2XBMEdcQypT_}>XM$L6^Tb;@BhpI*7wMl(K4 zFc`At0P!oLejNi;T~rKUZn>T!l#ZRIC$EboQ*sNQN?n-lB3rozm+aUeGO9(=?1 zf>BFlqtcQteU`^!K#?e2l zM>!g3^&QH|Ln8_Ta3PDQjRz0nZ86BVUiZRF>b05?Yeh8Crt|m&_SlP#8bRkR}36 zvbyKcM{yE$WXtZtjtKZb*R>yl`!&p2hbE!Y>+$+f!cR_`AB#3#_4L`pHB}3h4K*t4 z)f_ShegHo?R=c!a$_$@qBb#*NUkLc$A0O3-Uf*Q0h)!qWS%=v+|N4ujnXX82MQ}}) zkDPJhD<;!c@{QDLz|AKvOFZ}(*cKS(l&(Gz%q+0kQoTbIHA7hA_!J7I77%7EoU*g= zB+epG>lfi5N9f@dm*G9aorIJajBiRB2vf9rt-uUgyDT*4Ow#UXCJ-@2%n_ndew#us^ySNpJ)g5-9#bTGgmJACrIQPX>QUOW8LI-aTQan}>7$Vaqla4ifOs zbpL((uzpT@i3fF{5X#*LUFD3!5UA+TtJLSliLA1GF%EAo#wYRXQac0+iqPUuKKmbd z*;+15ZyW?)fbMi#LI-Zlo-NT|H~Hzj!rQrj&;J{8D832(#1_AhT!o%Apj}F=7w|N- zrNRM^TvHb3qsi_R-r40BlazK*Sc%{eJ=CGl2+wENueFW#_*d(P^&iiyK)runzW*Qp z{rflSC6&xq{(s+KCYvIqz4>sl;{LsHTKHscnryVClh)8h`*;Orq4}DkgzI@(lIt-) zyy=3{{J=IZG^?0&P92mk?Xk;rnm;zmRTX*0ex#&Y(Di672<*k6xOuvBj-79}HL7K9 zx5sH*Hh}Ft{Sl8@1Dz;oUdpDJ@t#Z$V&;0dZ>a7NSx)Sul^qS8%_0bw%v!wvgT){I z*9}zmMPR*t-RfUSdXwIT5tMlfih`c74A4#hsi-PAgmQ9&iIW82GfZ5m4nu22#PMx_ zVfY4TH95mxM|G6oFmQ1GT%IXN^v?^R?-C`}oCcH)1Guocl)PJ`p5gpE-yqtEHu9t= zA>>I3;$dTD_qi1g*=)4oxL~M|VW|eYoU(l9?hhe8f{q>CqDz^&mVJyo* zbO}6pAn3g3dDQ`r)hMGhv1hl$kke8^0JMfDN=ZOny>Id~U-+t{J&`WCf#cTidt0)E zB&;-U0$jtcDsX>LF}&eh)V~-$cd@-ikb6Aw{m%?nQ61(_7b_NDF#8krn&&-!+pKF6 zW>fYqn-q+$SCuK?k;m!r&@ozfZ5GN?XucbIjxkwl!id_Um{y~#R z0Bd6UDrC@wLmzt7Ch3|5jt5`>WO84>0aFosf?M+@DcY)OK8|)6F>{}%UIsB&*B9PA zi>k->V?8GO0h{i_+3~Ti;_`qUe1l2sb{K-jN}l_YGC0)h=~*r_aYIx{MJ;;~dBqm0 z&0mK-*r_Y~0PYGxfl<0v8t+21@eJuCr7_ z*6EkYxC;mlhtUlha@NG<=ECX|AD_KF`uaGcx~$+cDpZOkTY> z*luQ==P!a5Cx&~P&fih)@W=VFD*=wCvM{0X*Gn)XTvZd>O?F3>c!ZUK1E<~ki`-ji zy3}Cai^TF^I0*#Ks@i9H9TyMZMZKs1WwD1JFDf%@V`KCpgjtGTJPt=l^fWQ|Iyd1s zrFn({5Bda3T&5T8wGI`(=~c_iql?SvO2O>cFyv-=%hrY;?D`ftAlx5~6^EK92;9w{ z`}aE5sTA40+C}#8uZa#m>c0P0_>Z3jM$MP`)}I-U&+1&EtU{G5bV96kw;Pf_boIlZ zKcb!j`Vn8*sXVp0^;B+M5V8bTa|Jh;U|ANw>G_B4f9Itn-lz_{=eG~j>-$-Rv6?sD zbl0tC_S`f^LFWH1g~@E<_LO=IcdZ^$UDNNPqF)z}YGx+5VlAl3D3obvy<5rOzONBW2R2QX7e7~4d*xlBL{rjadi%tRIY+Wb| zqWtALhndLo($_ouzRlWC+VGpYyx0curvn113(8JNh%2*1?9~Qo22NOk@DfM zJcSL3I1vcl2$1ec-J0W{3oEE14|J(S909gi(XeCqAuFkVP7@gHbfx69gEAcRp! zB;D8sZs&>?S@;4jkYR!nlf<{MW z@W4k4aZ<^vsAS;FYRqv?>)WIJ^DUD!)5UkG-ud{3r)jlXJ$N( z`u1p0= zMCMpKh9e}ldvJt92k2PKa&KMkBEk*ZE?;R$LF+{HDk^Nq#t<@zmQu=oB5h)yoPJJA zf@Wd&1nyc36s#&xv3EHChdu6=C`V$I0`{G~LmH=(UHz6e!K!zK;gZDTIXogID!@&! z^ICk}{V>lgup@O|xzDms^H^RqldJls8$a>+V1U0b$UWxMNHI3s`fk^NGjq2h8+;wh zw&?jQFlUX!4``7H_nVBo_LP|`=&@dU(eO9^W0~sljn_uuT24{5Y(?M@L5(1!ct8#4O$d!46f zRzq+j2#d-mR1>7U^%3;geb?jU@p$_nI*||{+={LVZ1G5%>ILIBU$&!Ke5vW7`~T>s z36E`GhA7l;y9m$pI%Cz;}d7qM+%EKiQag+>cJ(001rUpZ!x`?nk z%W=VyXKWZsxJi$W4O*x-0R{^3`c=$!zOgK&>j-)-_2sB_o4vOCS70bLe^B?iLKw?e z_iAlKkB4zexMm)3J(hIDyAW$%C=qd`vyZ%h)(HHnIV&+RJiGBJY3&`@J*Gz@RkKwW z5iOnYuHI17)3JJP%YAZo%mE zwY=dy#YcqoDGx;)!*hp6Myi6x;M>T8;f&B_p0l#wBlfk>oYMj`%Ga`h;WImp=f#j| zWCzSeLGDb0KCI=C@mWUh3R`9PPBsj)Io2V&I*aEo!hFVotzStY|C;v>XyLyj6}I!9 zUr!r1wK?&&&$};6QaDL%m2le`+^Ir1!;p^{npCqO2P2zx#*F?1AQxU7ld>v9LH~i^ zMeUd-|JnsXGnNAf?05_L0LZ)}1+Q_gVunp5d*Plg@HG=xSwEIo9S{pZQ;Ys~x0a~; z%$s80kcRiXBb~Jx!^tdDGRi^H!ea`}CDhpsj?x_MIZAnimj+dpE9J8#>*3Q~iXI{1 z1=iU_KKwg$yA9#P-&g>AEY=3Zp^h0&-ec5Z+Cr=%me$g2OmRv|!`GQkPOAv%>2SqR z6~GBn)DRBoqjkNINODIJpCC&Q!XlN82fs)hDSzSr9?lIYBpmM6_kV($a7=F z{G>N^RxQ7kRD`iSv8O8mAkM4gc_wCrVE0ggSqgPBXys;3z>MR88r3ulE;nsWOAhb2 zUI-=XhC5B!h;1E{XgW~3@Gm48InCzGc(+H98g9RTa-!)3`pe3T1h{^Y$({>i0HoPE ztQC>PYNRnViKBO2b8ZyA5cWWnPS~wnWCw@UbMk9RL$005USnk&>%)XqcXIe>#>=wL z-w1T@qS^WfEeF=#mP~vJ&B^b0-lZG8U@LYqa+$U~*ZLDD{B= zo=`y+XP(Y;cpGwattG3xO+iDFDglOGv(Ho>Q@d3(&>=)&V5o(*^KOHF5l=5 zfn;$d9E&7QEqX?hfEizCK*H z>ol9gu#ygibeI5GfRcbQ%RFO9)uo%TMouOqJ(4R738Vr9H#lsCWl+c9(H@5_Ws?K~ zriwt<<4D%WKa1_Acc36;WfuEQIL@PWE0sQ;Nz(V8UM_R?yW0HAt$F`;8oxY`Y1DC) z-b6n`e7-9V8kBIXEW9ou$u0) zgP4`k@9Bk{ot6yt2F?xHlUbajvQr1x$vjY>FYgb<*k~=7+jbpvc4}cK9}-ZgxyZ`A zh8@bF{e!&!C5kZUY?=t#^*3PdBg}hpgTB>`gVWVCY(8g#0gH=3ye%({;9^IxVfk@P%jt82rB(gM?w zyI?4VGzDvmCT9?gfBxC6qx8bqZ7y!aPAY>ZW9$BM z7WIBdVkdlePyf5;`@3v_6I`-g%G9l_4Tm3r*xpxQK`#mG4p*A8o%{pGgsZIO2>cm6 zX-`O#iH}u0H=7M>H3y34<}~skj!q6w{K4(nZp{9*M+4`$@IXuoK{^`EK!J4e)~s7l z%KOxKV~owwuCBR?jx3!_12Ny#9W#bXgEcv$QfxS}s50x*)@ZD?eawa_xzOgY+86`U z0Jp{!fF`BxYV}hm;Rle$O%A>Ay9^idq!;SM*LV$uulJj_8r*Ce&h_Ord1D3x^kc7| zi<)bCrHb=q$0#}yiE^D3$tjw-h7N+PGZ=V7h!SgiV3{-`!r6&d=duSGy^$WnY5i59 zxTg548G~Ue;R_?t@TrYD)IShx<0MWJ1xzBLWD>n^6Ct)}v^%M5U}>+9kEYS`QbYJh z&5`fN7$tUi+b1lFJJ&FcUc&^yiGrAqVvNS3B$>|Sd!27?>THPG+SsY&Tk}4|v+p87 zvunOO@K%97@loPaA;*7@uAxZHanB!Yt)oqVRgl?wp^i2E(IWF7A)PfpeRHI^v-9wl$)~%Y> z1cH#cB)9V|jIkE|Tl8mQt}ekE0)mnhRCE=O{S%G@26G$dqH;6Mx5(v3BQJsI%d+#- zt_BntL`yVPrEOa*iqHc3Us}{o#8n#wr2=*3FX$O|+#&n<6C+yH!Rf6ccEd4z%Inxg za+K)y@xtQ3aYK5}7;}Yp*v4q)8m7Y}x8jtVZ4BQv(z<+y08`AVS7ekqoy?z>Dhls|cE`U)#r5dFn!sEVeCIPo9(A22)A`qT|(0An< z8nAIhbe-ZaD)^|E)SC>*W(lk|7){U{T|BUYsvp0oRt47aB``WDs7lTzr7Y*9wgOQ3 zcC9a3!$v=Ei)}&2vIb%oG-o*Y=-HRQ?oucsRXv#+N-vBr34z{ z*9rLHvpER!W}VXh`V_vH1q7~%D9c1P4z@0~d}hjP_hCoKkBs%l?A=q0u0abBjx zZQHiJ+jjSE+qP}nwr$(HZQIuDWM(oab8|A2ndIa@eOXsuzRIdvPvxyz3rXo@$TX+D ze^y~x`>6HR6hHs8T0{U%Tu2>es;Px}smTEWH0rg4)XN-Aj;0X51@5uT*T(cfeb=Dy zFrh1SE@5X;49ML-N?a#^B~(xmBFE4EW3;P7iVKNS6D`!j^&$tvhC&z&D;ZwP=rqyW zB^i*JfZ}LpW>^em&hs)=2%lpNJ{jRbq^@I$DA@o(PSEI5c{D#!??|X=yDvB4!Gte! zTL&&};v73@LbVl2kQbMMDLw zK;~UaOnA;j4roj^r0^F!X#c%_g~5pSYL-1tKj&j>jEmm+OBzI2Aq`5|I!fD{VFbU6bw1X9`rjq1m_;n!~^d(c1z9}etv%MbR3+BolYFN^%&qM=e3-T55>{6~~M-q>z6ovVd%ju)& zf_tD3i*1~9S8PiR?zdKUJjrUQWAdW4%Ho`! zLo0_nvAI}T=)^!OZffGpO&E}`I10!XnC13*Y2cT;tb&s9Vj@9BWa@3~tV3Kr+X5p~ zbum*G38=8mh`UDr@QVM`C)AVC^dHL`vzrm!*s#cGsAOhnJO0RFH9y*_pU9f0qjw8Jwi)C zYGqg|iimzT@o{a&74B2s=j-;EOj3HN;G+}-J5?&{pK{9zgwolv-&rIg-2lz=qHyJk zvSd7L-)-vu9^)}`d^>gS2)&A}AnNaXXI7*;L)x+ogr`VC2o|>_FI$!ZUEVc<4=;zd z5gwd?x)<`QaH)Yco=EUzloW`RGdrR&GXoEOstM>1WFr>BEed@0#^B8k$|C!FN=dk{ zb%WE_rO2JdsN3Bq#0(qwRmz1qMsf9c9ON}vL|xb8$LKK=1Io$!{=zFj%?c*QZzH+sn2-K8DWh|&E}^-c)5Ei3!2}5y~A4tQvC}xuVJxjzvi{2AiP60?yLSn z)wf%~z5Zl3kNwL&zq>0W9@{o;(-ZQhH@F5R$Hj_K>(a^}VVu=BYARNzW|=#rq^WzN z^Z_qLhCd%qVWb2?6LjA_FK(!hP{g|PdsUC3o5{HlEToLh^jxU}Sh-G-f)GnT=_UDV z6~@e(#3)366&vS{GB{dC;xWWDZndBX3N7=HVPMUz28FADLn zOKx=X?~MpEdTK4bL* ztlYo?Jbw)Y-0`US=Tc|+qYB!z#owDuH$fi^RUPR%L)ap;(moCEh0NCn=qlyh$Uq2Q z>$XOE>rUI1Z!WPArW_Kv?k-c-bPKpvEy#*?=Ba61ca42yj_nNKAW?UQQUL?qCBw3k3T2@V1xQ z?Pxrtp3i{FY2sr8@!;;gHZh76S0s7Cty29|5s zCmTV~N5R0Xg{<{-SO82i)y9|G5b*)FpVicQT?ybh=pssfCmGsGdQ&F|L?#hz1DO0V zl#qT8PM)(2S^`+`7KW1yOlS8B&WGo0GFFl49bl7IJNxXJAw&obB<82WlDJHn@xpX^ zl(r5EuQfG28~v!jAB4z<#l!t=)i;C~<{kBg(-jUW5uwJZIujB~J3QCIWbzEepwyfl zjt%@bihLriLyP+NJgvT=v$c`B&GW&1D0HS-Z2f)L-$z%-Sv*D7-f#t*4HyiZU_1VS z`hfbtpb${APCUi&mOoGuQWsG-wyIlC24|SeYhOXUUQr5E!PGXDbkNqgt&^b#FRHUW zLJWI;w%VpQtYa^7BVdAcIh&r=D`Gt_KEf%JkAVU$4MAy#TQq`~>Ol0IU*5dCG8%#JwZ zaAXfmqe4j7nKu+-CfXZj9)L?sOBK{wZ-$Am+D5m8s7w~#YhA&>< z5IKa|dbv5T_Gf7aT2{@X2I$20n#)!FgdbCE>8m|=4|$V3M}Qd|aaC^)shTxZQkve^ zCiVFacGCUEJ>pE+siPY{wieGWw(($8@zcX3qQiW# za=u67yxv0lq`b|`Vxipz^&wIg_0yk1+vB`ZJSelu0IP`l=R@G6w6-4?2nc^=Z}&Nm&aDhU!tS>L6s0^lL#nlS%Qe2xmNK*_9~~&;hyqvl zPL|9)sGi`OV=5qYU;KivZv_w#A9@x5dWq(X79|=`^hEKzfed+y{F_!gDA)~YU;0C`YU z-bCqrI-lO?@x&tK&6vZ0P{`958~%VH*X{M$prRO01-cYHoKR3o@^%6C?-Y6M1j4$mO;f)>M+3 z#t2kC`ii2I7%@nRQyNT!-D9gx{}Nb>_@$QUrcrfWSYMwzAc(V^DVrwPG4uo z-$|BAE*?&>>TII!c!&Z;LLB=cP&mc|c@!l#1;1V-h?rI_M__8zNDfSppdh^z1^%L& zy*rk=DF-WS0jS>Ioj_$3dv$d235%ne*+~8^5i|BAQ)NXbXxI zgBW~{L9Mui109gtE)5c@s6P;jwG{5)X{*Opa3PzI;Sv1j1t5qu5j~<^CYuw&3Xw8q z8{w1RO;|)%7{P4;G=JKI#e_g&eXY4_>gQ>kDj(mhl_I5$_X0(2A$nDUfW!Dp+ymOu z6JFR+cN0zA;#5vWaTz*I3v_v~R(BOV8H|gH386q|>dpdEgG!vxQK0uM2`>YC2Sc-s z!_DNZt|<_D5=9lm%r0lm1UlKx&qNSZK?9La`>5eD_H4DS4F8n|^M}W4FZp7cP&~^i z25sZ_TxhGtY>OHgAI!vooFQlu;d}MMbdI8r6^{bhF!8&c@#esHl;VYGh9^5LP=D?0A(`5FWz zSBQhz0qn9&!!+TCntd=2@@&yz)I+f@`{Puu8K@#mRCykCKy$?OOVl3VTno-LwAMz{ zlySowk^T;_kj3@ip(r3-MJlAo_GMuQ$_GJ2o?Xvce0tuRV3396WtFVGsGlPPDdItT|^^d%D)VAEGDku)plB#f*e-Z)RCH4twk1OS}o>=@4DMJAcW6 zVS~|cHHnUcw}S`@RSf-Gfmz;nfC|$E^4hXIZ-Nn7oSHrv*&6Uivai8KgGj+V~JA1Hozlww3M7 zble5ILGV?me%8ksQG0K5*UZ{xiZS}5WXrFkw!2!$I0E4|2H>tppwr@BNF*b6BED^W zTo!NwV;GFY4Es~X5a3>dJk>sRqpd6x9geQ{;q+@PG*1iU!8RfJH)^bMEBil_}T-faQ8paYs=aNu$NFKCc*(k77eWl_kAwe$Osg$xOMr^HL$2S1NT7aNf|3b$wl;$ z&%z0M)V!Uf_+Jm7w`JtUC!95CxlVV=CHJ5}YgH}N?tVaR<(if!W8(YV)~(@q;+&#K zqG9HBAMSQUVXQmEuMOv7TH9m}=$j}k)P zLZabTC)omzZC7{vjf?toACheBeI`se%bUM*KEjK?Z@*NH6`BNtnk@-FK^IRG*?v1z zr{a3zR5Q#CsKD;kR7gT~?-EBO3=lV23u}Yv5;MWv1O@Uo7FR@InZVH}y+#zON{XNt zmbL4KI1;d%_fir69ze%(&{2Rv%?0*#6q?pDt8ka>esXS%j_+Hc3$?b}3nKQ|lZx#Z z$Em)?zlOAg)v)H;iKSnofc6Wnses)CD=)0S z=KW&kZGUDTQS<0A&Dt7*zGRwF$}mSH+T91ycP+~Awdj_7AyCUfCfo(nxr{i#Z!@x8 zW+D~H0R0{|f(Y}%YZCCZ(Cbmm8S{lx%j$k1(m_b8%!s`BxGGYkN{P=LI`}3UJWcmWo+xz9@tv9PW>M@dbn<~)R zsn<7Re(f{+9_Itcj42qG8yrP`U=)!O#BmCa%9&P%?xlp0`9*rX<=)7>^^9<5Jt^zJy$KIpVe{sb z2x$#^CtaqN!)X}b@!+B!KHm$FsV#Bdb>yC2;P66lQY_TCrO~75HB-wKS=GpL{RnC) zs`E@Jd=Hq2*@ELL6H3VZIehT#BoQl$Bouu{;JuESz3fflqPAwK8*I&47`w=97zAq* zaGXukPll`#tL8-H`J!#&uJ%#bB4@WE3;5zpoKfb^Kn5Dv{mrjPIAr*@(ctWZI zTSTu=7*ICB@J$O0rdqNymqix- zl($^s=kNiIXbA(qGt}e@u?!Eqo}CjR9W8bGRAkh|u{@^BFx;^M1~T@fy>FhxMUE2p+fJM~Moqa+FYsiMU`2+)0{YliYKB;Kolrps~Cq(nb93Fns?P=*>ubx z1P%b<6fiA5AH)_p9Cn|xTPHG(hrlJ(Lm9HwZBv{BGkj~CU zlFjxQO#BW%KpThei3GBp@CA@u%5t|8^U5>LBRAJU9Gq*QUt9UfWk_a+m}+%)i^>lO zoqp3`g+@IiSD-Fn1!F|)m}M_l zkb7CWU#N^;n&6&pxwi*#WLTX3a>Aqc&gK&G{Lg2JLj*^G>r%KIJ9ksRUT)@vW258s&Xy#8>|>_)Z~c%5g*)UX?9B9 zDGKty>iL$^p||ivrlQ;u!k=SP4s zVjdH0!^bxj>Plr^LgBe60$4>rW8h2kmVffZbCY8^0K+qR!TO=DDOi!9Xgu8CW#6bw zF=QU_bmw(OZbTl9fGLOO!bVMegez9K-?!6^#+X-t#Gfn7hyLTz5FH)hKkl>t0PqFf@IDtjp zC%(yzsVx-f$54gRyh_I0Du_s`)UH`r-=+9@8>aNlA)u$pcLIIf=JEm;!q4~dJokrZ88b-Lc8U;Q-^8r;S`GIPrAe(t!(FZQshp%E=xiAP{ele>8b}Je_gY~ z9J!a!`gJkaXzb|pljeQu!;SUXykp(8VKnG)kr-ms#f1rp*scWH>(eGJvwF7+XU^_P zGc6iN!960O+M_OG62x?P@fF4#chf#6gLsY2HH#*Si&~TrumHj*U%aTFHffsW?#;yXZ~~k;*R}Q^x-n=I~c?J&&c1k#Hxaj z__5RVNsF<1S3X1HLN7=sq7sNV233ymN;q=ZJhfERKuHFF;73KdJk;Cy4;x}uRmF@y zZf!U2o5_K9k;oD%b_}ej!NoPjc?|?1!iH%6MT?wV#!Yz~w8?>Nvd&QfFZWmT&CT-L z{pG#{!`3BwpAw%Qwz<&V3&3!GmsNoZry?bVip(vQputuCT&J<$xRWD($=xr#o%6f! z3(vYzwmF!-O`lts;Z-V&tbQX%)p-q;J(3)-sP%S2o(z)djIWOj^XWFht3d4#m>8E{ zGJBJ8V@+TqmjsWYn0^MlB$O4UyzVF%v7!Tc?2o0k*DMHXIU2r2IRv+uiuLaR&;lGH$8sUJ)vjF|^;cv*kKsU%O~l{LHo zcVR$MJ*#6L?Tt};t=s{2LO`#2TS5za8)DrSEl}@YUKgD=NUT25l9(}(jX^Gp8owTy>c5zeRUyp8!bnmyEQA<+osz!Yf{g$HROWH>m_ zVy;v$-Du^>ee0tO!(XK;&bxm>md}GURH{vtp*T_V#I{|+bi<7yN@|K#6H}HFHH7!@ zv?VCikVM0WFtF98Zz^!*?)`~UIWNayLO3n53#LRf+ZUJ_jKRzYSFAfWuPAOxuIXq zgEuUWNsd95Xry8GqHqbPgy@d-X%sqp)ivR+?4sCFxzUV3J_28GdNjhuH9?4Ndd^Fj z{@hIm@Zd*4uvmBv`~Ih+Ed4_GtCj}LJT## zMORfng$I^{p_rdoiK0K?8Q=1LR>Ccd(9b%Q?fr$LgG=hLq#4Z1tDp>s08WDVec>+2 z`%UB)E3H^`15>4JbNiR`loZh+GG6n2M0AY{GaH=IFMkuey45nB`o+3x?qSP!*Gxps zu_X+?hB)ZDBk(sL`8;PXmnD3ylC%7Xyi_@EJG!^;la<5YyP@oE|GuYUATDB*fBq}# zl_H8XJ>0I?lZzCE19&*g7@bb1Y0Rqy9QY>I$~oMd#?#gWX`3N8J=9htp#6FIi$q{! zwuI?eRQ~S)R;-vCQtFl&9Ofu4~BYVX<`PF(-KqG%C=ds*!JvEU~Dn`Q?;{Q(scgJw5< z3bZGH=pnK5%ep`t+-xVZ+T$U++;s(nJvSm#9DwUf>3eR#=~V@TO*velk4F--uZ>iU z0mrCm_P5!nm*HZE_1t}qL{geoi`-5!^1t@n=*&3yWH7t|VOaPA8gRnZVeoE^Ns9b$ zd*>d$hzMnemGl$Be3<#*|88Oe=CG(tqikL$LB>?xQp_e7o-eGV*<8+0bZB)yF{o=) zJ8*)A^&)B}gEHT#z3+?r78~wj5^&uO{9<`pJ>(`e$Y1|eIsFw++}b3%mA5RO&s-Op zct^@PI#Et2@k)j%wey&(dOTg|fXz;_>20xZYL`#Dc?f8CkYyEh-lXUo#=A$z)(wYW zXjJ=VYId$}cjaYP(;;W!*j?5ny#1|Ftq05tUuHq`Yq2ROs7!(G7a}9+*4dbSiyU0D zwYz{V(&Re@dpquoBs@}~+~oSQu$NyhhaJ5mD7?B%$7{<}jE;H!p8Vz_O_)ZMbiN8*FMh~UIy#!6-2iru#7W-*Kb@BQaiQ=rYMy-tzHrdc z;X8HEJ^=7djmO@Jjelp=WHk?V*7#(Z*7AO&ZTDKF4aC)!7*$}%v?sN}u`j!zVkui* zKA{r{eiHrWM&Upm8mJ*ddm7kQOxjdVeXzS== ziC>!e9Uey8CpEH$NdD3a!eLzB7IvwS(-_(W%^h@aqN3yjo07ea_Sssy{PfEhqrE4- zm@ouYprY&J+R)}7bmwmZESWWAh^nLoNAYq)sG_;W-gQU(ATE!h$)^&iw|7WMw8jsdDd1)wcYZ#6K? zixhPc#HCqwhyRoRuLY^)!#e$HQ&ahKFjmxJJI>0KE)ubE8`XnEZ(6Q%!#; zY5L@otq}#X$e_L0f!>m+|C(gj4eok{gkv_Q4PmP$5(_#{5HNE40H=Ek7+eErz{OjI zpnqSWCSVKU1yyWgeY9WnUeZveiAN*T@LAD+Zv6bu>qCY-5@%kh9>1gg-0t*T!_SQQ zKYRVi(%A2smjRDhkj45jfadxVO3!>~vYXo}nASJ00aXKntapvKPTJoJY=Cdx9fW>@ zWpwQ08K=B70ewYJbQqJ8R}RXt3&hfh?7Dh&|vK?O5rpr zo=rivl3oWT*sbBkA9g_t@fkV(n*YS_VZK<_GRKB$<3qfoif%v^vY2_Y#jx;h- z?3W-Q(1_#k|A+mR|F6V7Oq1G&Q3PrOP!WLembv~d;tAe;a9@@=2U(McuX(r7ze7BI_6oAUqo z{ScS`o%mXqVQC9vNztc#Dt7Noq?=SdE4E^)Y2CVVN zMr*5I#~^G0r;NoMAt^ zGNx~5IIzGaQSwlb`STdz&M2uCO#g`t^a}ok-uA{NB{w$=>cOK;eg%Rn!Zi)pwadY(rcvsfjjFt;g4M}P8 zHlEWNij7_{#-*ux9IkXd9(gMPf4A^p>CLakauy9RL)<&^TfmL&L9!__&ttUgm+Zgs zd=^V!K{F=CD1O;^Z5k3c!A4rwI!Easeai~8)W7P)&BZRADJawIo}%VM%vLGrLAU4q ziF7Osaf)|tfY`Da2oA5&N#p>UFr;O|DzGN+L*KmVLDUta zJzbW!VcA@spPaGfIf`L6`1cCuJV6w8R6QG& zpey4>0W#-Sn7h3k8Xt$npxai8UD>QL!RRUqpZD>^UAlSuX~Kd&AqS}=Q*w^zZZzWK zj5-A5p$GjPeFL+jhdemzj`P1szW9<@tHh4%bj3GYz5Nzr8JhN9#WzAT?626`*aG|l zWz<0>nW7c1g##K1EOEhi!SqVV=m@_=8qhK@=;<62!hdL1?~w|{8}ggyb~rdwKno;d zp(|@A$7Hd&J?F%FdIr$NWeJgmZCAesDVuF36EP^8BEV#{^-}?0Z{u65QdPGV#9{5UAp~ z#pBvI6+o=>vc2y2u8RNFA{U$HW`Sqg!9MAdWwQfOjW4OFuN;A`|t zs@xAbBOxPw%gAGDhNV~bus${VWB@0I6Xi|W?`X(CLK4U)sv2X61{T~l$Q>uSOXAmg zr`2W)Fv~SBuYRwVUwh#_DqS;gq*6YH5qW&$6yj1}YQ8Cr1~GrpFu@FPr0<1FBHA7SLV#^NnU9NybtV2b27@PjcbKRx)>@nFb zp-X6Qk`x@a(O=HjZme~VmH0P{>x-!roM@OHrNY8&TtAYPZ4TmF`Ed zU#lT%&XYCdRYXO4F<1vKO?-RO%4{BAMmZ=QOWMiYuVGb44H?fsm;{jVsQt_a94!_g z?83woj=j|;?f$>XsnL0L<+W7qJ@<4_6yjIoHzQauU%%a!G8R+}7BG^kA7{gMZJhY_qkoJsAuzikd=| z+}+#1_!tEACqp>wgKmiQz|Yp@;wearDn#cK?VEcJ{Vj2Q9oT_@0}g;N2l1j;tIbM7 zfbPgg;23-}f)tT<5lHogZ~k}DDvpE|N(fMUTQw!sYBcwB+v>$svr`uldnz|zB|e&N zbBH%I@uF1&0!^Ev$e;0Fm!Lp?a)v+-nvEU-6wCAOVKkTy&hr*K+}akaFP(#|P{01x zXBl^c*H|$yQOqFH-{jzZvM9XF#w(Gs-e#mHR|2s!2BbyF0_5=jz5_<&*D-@5R(45@ zXJrY@kR~es>Zs#XSOVxTT`Q2c2mM!_P}b_}rBMSAud%YoSUP9T#S)p9hhwR&2j*h7 z_xB%`ge*!j^#i85XS#s#gU78+DmoGS`(MjFhFUt@bIV$4It7tgjmWrU<~i7c+gDFI zwBQg8x?()-^lxSHk2s-$oSzontI+~eRHL9Fhp0>1C!Cai!YuJ=#rz7g{^bJ$?Xy7m780R_g+{>k6R~-x^aGpNo%_wj}hl%SLbvRVxp}0GQfN($AaRZ$XRP8i`>cM zXkRtZ$MP-NS2}m}V;Tgzkv18tI?wN(z)>c3^lIYj;{Z?W;Lk{1qi7XKc1K>=LN z^54ycVotff4$YVeqJtZj{zU;nrs~RW6(mEz>Ka?6f`5$ik~U)fd#LORG!#EPEWLj3 zRp0M3$oOAZXXF?XW9&&&?zXut8$N{^5d0Q-4cUH>q>rz@_!ssK&)+dgLes)w(Fa>) z?S?k7b$BaBV#$7l8znwwhk$Vd;vZd``vS^fCE-XMIqT^Oo`((@FcMS@9C3jTA3p*z=?ZAg9h_?jp z(b0dt1Pi6@RdGr5rcBVzQO(~z+K~0 zdZ#As+%CX4A_Gj33DZDRif7TtEY>5ltysUrKgxzElG7F#lhmSQs?zRkaCJ8Euh^(<90}gbhr7qz560hoy!F=T#z<4N<;q!qH8M6>wodu)h zLP=5px1D%{8FoHSwXoma+U<3vu5VS-$iP^%e_q;AM)afrznj4(d5UdT6FGjt1S?*~?u z2)epE>>+p)3k}|zc~NtxjwX`F=>-XJWWa|%38SwV!j!9swfLT1BgB6@L};Q5WvQxp zRAdD77&JNHVvJamI`7e13XzRlUD|t4d;GGRtad18{W+5Djj{KYOcD@ZHl((pVtk)V z4{XT}1VN1vvr7aN1v}Eu7rBZ|^CH84h39BD2bv5#0DBf69D&gXC6_`EF(tIC83Jime&^*ce?tx@WYxgyD>1!})%?dIc3Q5d(*6F0JYWV7A*P5yz%Q9Kz4zVQsCcCA^E0P`&XDRJI@yNvos zEzbH7^&^+@29S4dGMzA?<7sHQ)4}RlxT2*&9A%Z^E8NjI`MoKn$W<-AQq5wr7>S}g zAcsXq;w!&#ykRszZ6rpg#SY*#C2gCMGAImnRfnm;@YZ?~GpuZaWkZ4488?GIu9Fu% z44IfEA;5Y!p!m7An>-SHCvf{*oy_D^1*$oJiwe@saP8N6nWtxw;n&y* zi2wK9;rLOa0Zth9zQK3$^}a|Hd728|xC|X!l1VS4#yZb5idDq+s2eyk?_@>3KKEiY zf#fjy2h8_dA=>jCZ}nKf36+YqJH%+^oyB`Qc;Nt#Dn{{$Vx`=`U%!QAa#$pZ|DuKx>)!mdUXq_JGQ$Ww(>U=Dp&(MT*tU52iCCk?22Jr4FR!(POnlOM%u{2G7H`(C}mF-1BT+V|G@NEeB)XxO|Kx+&&(?Iio8 zaHNh5^g+OFp9_kfT)C(I@U{C|B*&S+O^!?q_ftg4gKXbG6=t!HDx#Wyb3S}74GC~w zR);~ULoTJ(-W)#*CIbdA(_}yRl2X@s zB45qPz9YL=dl|o)4d_`gJ->~0nWwA8GPlXKG@c%;8dl6y#uwAcDvsJ?N+Wt$rdR|s zgN3B$C=8S*-aJ#~%}rMA7qe70Cr}s#`d4A#Ws`k>cSCfO)9etRbiqA9yVmep-4S^X zGwPj1C=dV-204?(_c)Q46%0fzB*3rvJl;d;Qm$7K;0UI}4l}HYeLs?jd1Ft_cy9Ou z_wkvL{ic0ZjHrW$*C(@z>w^9F)Xeb!+YO|*2Bz5zh>fZ4){pFHbHhKFf&kYi8nw=4 z@d_rTVujz;bq2&~mmzO)W`v7NX$7LE9TY_EH@jkS1}`0v^%_ZeTd$2zv(MX?@_HB; zPpSq;W1N{cFXE^6P%6E{Lz486^Ya6BHAv?7oDJd!cJ)a>P1sJ$R1-{#WO=Y`6L`v0 z$D;mbN-eEsFk>sKL8#_dX&ZCh0=`M9M;?P_9@5E@7BWQ*G%5O|2>V%)v_7|GJB^Ku zB;KKn)5J?1ac@qcDN8I{*MsX<`o$ug(X;@qBHWlyi9ic9luEQFu*6FO{3fWexc{%1 z0#r8bF1_5tX#y8EL;C~|rE!d2KVRj#r;xNlvbDVJUUXl%;e%oZgBmUk6J7`H{3B}D87wYu>pj1p2K9cs65m+x?s`B7Pb~F;glZJZUC$wTp=Vij#GZFS% ztWzXgIwyT~jD){7aVZ+mzJhg*cOE&joZ|7V$eVG+oRW0dsJX6I#imIr^+^ zU!2+rANB?jF%U|~^7nVSyZBiUpze@PgHVTVN*JFTmyK$*?sd}Po#@Em^C&!d7Lr}+ z5;;eG2>&vfGtn?3V4vJ2Ayyf4F|fRGc@ZGw|>!Y|!?>EbBu zl3Ni#r4%;o z{j424EQ&#=9YcG6KH+JHlS_%dXZY8YGbb9To1I)Y2(r3+YV#CKjc6H~*uB>ns658* z7>c+?$Fco+OnQ{l_DVKbqEnON5-S+MKp|68*05YMYUIA^JtNH!`t+c5(@lt{Z!VQP zwYFOrM*iDvw@^=xL>8Ak&vi`y60RIVspFxBEMLwoyy3};66&v!DRQP86SXow|LX8l zfk2!<#9L^sDHs1p6VKmIRmbxO7pBlrkYhoRr>rfOH3FpNSh8lnSdM%$bxi+7$0`FSSJUin>71nc*MR^UOl>BSJL+$rRSL-Qld*Xf?37@?V0EN_h1re45u zjEK;lIEABIlxSX-uG+E|HNyNt(1*W{oD16@Kq7HjJk5icwHP;|XV(3g(qnVJu}5dp z(+ErRpB?$Bjm39kDmi>`vCbX-Kr=Y0TAh)<00b#k_l=5ZErNE@ri+bQ!QdgzD+*9s zz%5hGH3T@W#uv$qhGd|5EG;Ergu&4jAI9;{`T5&9h38WZBDV~sMe~0)BMbz<0@&kz zIP-IkBLD#yh7ad=o^dqf&IaI|sE-M)sXGL1zew*hVNk+k=AlpP!vM5@Y6!1L@^Z@eH0BNE108&uiAQ@X#LxI=K7QiiXFdGv2S5Aa zPd@m`hd&f!hJn-Xz9}oO^;Ku_$9{BOVj|YA{ z@Z*6W5BzxG#{)ke`0>Dx2Yx*8f!hJn-Xz9}oO^;Ku_$9{BOVj|YA{@PE?-__T&(;2+HhX622tpow;7#ha)1k3o?F zls<~^A0vNnkjDn;D)Lf@D$;lyGFRGEwv(^WH(u%^d@XIc9$B$Cw^FV#HeVaU{jBUb zAJ{Ot`f)oRR`@1)G7w=%=??3=`*2#H*STkSQ<30FsE_Kp{@=z}w^Wa`aIMDf9chq% zlfPzu;{PZ9|8K_sPkjBv*H3)?oVR|?TR-QmpYztwdF#gmKOXpB@qq2z9mcxgv^B?< zar|RO>EM5lA6>BwsBiO+$^Sn7$uIwB@{0=)1zRRyp+6Gj$=`Ab)1Lq5{Kf#h{ml1I zy|SNrZT}ytSJ!Kdi(s=cp_U`s7AuzC^hx%oLu>*K>0Uu{jIo?_(h`be&0#fnNx>6) zMzjlyNy>YprEkvB+-j|4zRS9N8?97tBj@8x^#mi5JT0*{ZZ%J$aB9pji57xS2yH`2 zF{U!mFH$MZ?ejGSEeTzVX^g}y*jk2HSI__;NGq6yfJ>FjYIBIP)w`b;-8djMy%xWA zop%2m%5XxM$*P&OVzx#%-dYErKdtylI%VE2G=+fYTkh({mZ+(IODH1-{J|eL zSoQisABNXJ*0~BzVc+X9i)}s9K@P?96RzmEHKY_)wS++ZkL;~FWBsO=*KPwmIV_$n zFt^Rja3P@A1n`|;L9-7KFh!oKfS& z(X|HTxHKA@z41Nws7~^|%~9agQ=(U7kxhSA^5ZZ+@V+49^LOY48~rZ^VJE(?gDTY{ zj&j=8JI^MeJ^XtF9nvT6e&w$V2yXX%uKruEqt-=r5^CZ_Lt@xFr)%m`8qry-j~rm| zjy{YfX$Uv!w>SgH;^d`sQ>|9haV_;G_Cv<+l?r7+l6TZh_z=)q7@5XQ!Xs@zYmh?X z2~4zL_#$Zqs#UB>PnuN0%8X914AmSpE8E+EidRL7(Y^1QcMgsNQ{{qhWP5l?ftff^ z;6qwnt`0!sVBwmsT6W@b3}Sjk3z`KXE_c^dx$a<04q@*Jc3I$q?@}@kE7E=~+hAOX zoy=zT*Pb(DR}_a((MmDKXimuk&C;A1M)AR?39egr1&A;MAB1V4J(A23rxAmaC_A50a=igGUCW!LHFN`R1ahqa8w^PhU=H|nw2;NoPvXR3597sGYES)&&6x*qOA+|*T z8@sdMu2DN22=6$`)oH;5&ORIf2c~NxVlMruL`a}WM0NTtss$`h5fOha>09BA)Q&~| z&Ru>V*RI+Q_Ks*A-BQ*D#fPz)HeXA%Ck!tU6?wthg#k;p_w~u5D>0e3SJoqG!@wnR z-8TAPFR{@nOus=ZyoE5q?^q{&pq0)^I_G_H(R9#bx7|ucR|eA3VkhPrprJHX@;b!a zc_?%Ff99q!izz;MNohm4Gjv93>GM{H$z$AY@@eUH#Cm1oC^@7U&$b8yWZ} zYl9C1c&_qZ)x&`*A%C7zyC&2-YpwP)WA15Ynr-$2H;^-f7x#;y?}Z6caIW^rjZMj# z%P+vtwswj+Gh)M=^0$u>H#8xICKGl{xOIJqVP)$@QpC(qpXog&#;q@f-oHAkMkm0J z^5#WC+M}EI*CSJZm{`%hr0&H%b=CztHuKQKCe-x^3IGZQDL= z+qP}nwr$(CyHDFTPj|mFb7$VWdOx$0eED{EcGaq?)XMUl@PJJ8PmWyp9|PYT2M0%H zP{cF{Y&~9mIF&N;1r5_&LX3+K$c}Q^6hO@Q3e6#dPxLQSn+3pWoQ9yFT!H|+lzP+z z>n977=N0txss8)%HeuXgNW}JMvG<=K*C=X&1`CHS+pNsah(@F9hHhVj?A!Ovl|`VchGjlz`bxmx&FAYJJ&Y^UpIvoO@+(~s5!3%>O2?*<^AttRcA!ZU0sj&@a)JR zU$^RNcB<;=(W^}blPZoY9IoWF#*dV|ny#zK#aA~&wglo;hK4WZL%}TX1ydQCWoV}j zIZ2mYS!j8lJ1;z?xjWC3TgPF=0+}OpY_!!B;yGpB(53Yc%tDn#%#rynIj;v%{iwvi zQr0FTAhVg;U+d8ccLOLWTq*{7Zn#sYo4-T|YUV7dh57xL*Q%sX7ox)ceBe;%UGAeCXiV2zgV?TwD6cS5d$K2Mi+llre-;GX4&| z4US@q@#$PyhF?eZSCD5(+RxhA;I+yasE#xlpq;Rprv4FFlF!I<_V=Xv3LzI2JZEY>$Ge-+(Qv(nWlwor(4+z>2c@mpf^4OP+O7u)_9}>i~D|uhET^J ztPnd*dR(AOtk8_0DYEfCoUeW1C`$Ol8wkbfrKd8FP_&LCj_Tjh_htt^RyRGzq>DWU*gp3MB4$sG0M`O>g~BhA9Abk z%c%4PDCW5Z$I;Ow;dqZ|dq3t;`wTu387CKA2UJt=lrnsYu7O;gjjdwBvagIbF=vk>(%@JQtYu~^!vKIx9SLtKN19L=5_Z=UR7Q)HgH3Jhcso;9SSrSgyCAvPETbF535 z?O{{gxrVxz-_ir(!E$Nr?HUpV>X;LCNl)3>IMwZO!!Jo!wbNSd4k<$$UciYU;Py*8 z%-|4@cp<)Mmy)SLo9<&WHSFq~u&A>^ab!QC<7HDjR?g!thY4&xi7OTfyJGacc(~nZ zZdd^FGy~g^t)jUsN`))T=Du~@tspgNvz9ixJZgurUrv>oK_2NhWipqL9X?g2R4{## zq+jIkl&P>U^9Zm}(4XuTEGd9CYrCtNi}6!=uDDGV_Ok%AMsfB2NMr4BJ^R&+QY%6k z^WJ*9r^dc`i$vIgI=gkC*aIZ4h93EcA3e>P*FS&Oqs=DKg{*KELwSmBi)fn_U2EL> zV(ku`DVFQKv6dmF+Yo?Ly3wBfc^L7A?Wpy$*<|rB`eJF(o*78k>_8lbt&~2VR!&hL z^>*$oiAj7*D)!p~7U0MT#LuKK!^tU`WCZ;W6sTBAkKcl1SbGBhd?xBQ75XIf+S4Ce**dSpwW=q8oUaln$kgn-G z?|2i*#p@4^sAPDKKQWP=p@Lx|;=oUPUICIR9&KFals^5qGBj3MRf@+8RA=pitfn=K~l@iTiM zm}MAlv;h8!(y&sCXZ$_#%jmZlT@mK~5sBMSIJ6?=bfdcKKJo~O$n>%($X0QgtYFj1 zge^eTi||IW{1$pR4pEn(fClkp|5_ zavw3=X9KJOhrT;*AFZBe4rz{Ug1WU7|2H~fWt=tgZH(af7NsEPlZk}ZPPl@Om~ihi z`42tr?8-f$8~OTz-11~xF=Z*MnK)jBI}jzs<`AnReO2P6LKHF%>;s< z(=X1n5ieNvj6R6I;mnegoVattA?M0L2kDHn(5wLlRMjL4P_W%JQD>Jt1_O#|wuSpY z2&sO@=^@ls?X@^mxUE)3aEA|P8dHdI!s@TWxIbNoYq9>9&}>YuQfZRT!(6xrE}on#_Uzs!4qu3Za5!iR zt-R(}ge=cf5Pi&wq8+A8zEuR9eB_>WL)@?TTwaWw#-h13MQJWNFolXYZI=PN>u<6N zTzL?Y20jzP$@P<^J-4^E>EEG-tD()J7JRPzqTpssXiU)SX5K-5Vkc+K z4-JRYu|DnIeib|3yaA}#%f#o}`&S;d`DTa7Yl%-PMe5#P{i-9k?j0^XlZ+DN@el8e z^XgNt@-Z_CtDQG^drcul)}&VXY)t+0o7l*EsRM#!CR(4fI6H>+Q4$2|zd!Xm#}1T+ z&*$?c>*)t4xUzHw1Z%?Lt_zOIIxu7gOo0e56&z5;2?$j_)#}a0k7wTCB4%^PD zj{$x60Po9?6=f>m78=Mc>XDKBWZYy2J88URo9n^7ZKCG_7=@G0mc`4UEW6YNjLETaD|0HVWW7 zX#zP;Y1wMS);u=TOv9Tdx%}VOAJ&$OnJ42Jm76CnZMI$?II32|nV#)NMTG>4ET-!M zMR98l{mQyz52cgim)u`2^*NvZ(pLEL3x>lgi#W)6UVSHs1c4qVuB3ezuqIU&m}RN) zwFKL=+7zW(Lk3c5$)`XRa%}7*oEoT4=QA4@cXa*KhtL&4$@Uex$V?`4IGf+NL7&sH z@F*!<&SKivBbZyL@RUQy*kL>}c*Ch_Ma$D*8*4yQ*#cSoc3qdi9^tjb5PsvrK#){~ zc`eK$y!05ra_?025rW0K1x0b$2ilDeov07jwSn;X>N>^z7m8|v`!Fl@7;myw3;D)W zS*uzs!#GJ+9cbY>R`Rk|u7CAfr_h2lvJYr}UO4(qpUYAtiXq_5h zHwWnR;8)CvR(|(XUc9)fhoUm+^sLFls)d$Th)nU*1ZXxFw0F4Wz}qxuZz7A65!zp8 zmp)SFC$&0O)4dYyC+9u^d?menex~#p%I^^**l>o5>EhhqmU4Mt{KPk_xE=cNnU4a@ z6B4wPm0UdR#$&Q7O{S-?ura6)tjJx$E%6*Mkx*M};@;7R5XI9GLPxBx063TDr|3bz zEt5$*^oWRtr&0c{Sq{}+)L;j|`F3w<{K+KQ0d5uVHcn6Pr#VZzXZ|GUMtSmxz@v&p zoL2spnYyV?^)uy`%*T;A8plNofabX>Q_NbQx=vCNJSOdPkdV-1zqMtSUpBnCN8M{EH<4;P(PvxvP3sr)(e9^-r>|En zcKj&s-9%yHv}{`dPH?mwf16RTiuC_F0cA-+R|GPHECsK9kg~;VAkU_w3tNjk1RE@j zCxS(lJe+Ue8&<96Z`RBHJuMYrXrEaZlQp)douPzWqHVdPt%4vs;;^f7nPnps#<1nC zTt>$O&3{scz$#2=kRrk$jj?%F*aFU4dYe94LNgP4>pV8vOVm-}v(h#?%tBye?q)GDK4m0>o6~S#kQjv~Xs-F*alA!33DZl})g+ol- z5tsCjN$8eQZO_X58q}U-v~yqG^Ashb!Q=`$KuNH&nP;ykT}8c}rGo!N3q^?)opB(K z`qU_Iysz#d0-*~>-bQhB4(4s1U)IIPX&*3v^Y#wval)>AyT!U|imb~}zlP*@iJ`0y zej>9$Yab9z_o@bdMGQOIh(L!AtRBr!{{-gwPkJH;3TxU^mj;XNfggaV`H>bQ0Mt)S zDoE(*QxpS*r3rZ;m>d+G$NRW)XF-EYF&@|v|7!}Wq^7>x~s7HqgVi_Ds zgUPP#RJaa{BBc%OCey!2hHS#q$QWvjTS zr5-j?7upK~C{-rgO6}=`PPK5#Lglh?S#|jU$4j$Cw^{G#+3Wy0Sd&t#r4XxLe8Zk_p^xQG@Bfa zn%OAemk(2nU=huPMOe#acZLzv1ADJBj5ea9Rl>t&MS++!?@{LjZ7V9bc${esFjSpJ zckY?ST$eP<4V>IwMzj;>A&I)PGYo*GV6m%F|15E6oUn9d^$jy>D8|-6X-mISqyCf6 zDs|(qq&Uyptx%f2C;Mc=t^^0(`RgU$bEE^R5XR1V&XifXwH_X9j}u%4^wV;Fc5E9v zF5`yXIR!hcQ*xXx^_onJC_NmwTmhYyNA=F#6oXZjJvmg&B#;kJpB=${bf&d5w$wD!|Pds_$a&J}5h z)Li$D(^=}#n57i%Sk~oyOKITKs$}ZAH*MZ{3)Cez_)CRoWHYu{g%JD$M8yWQKXv{< zD*ImM%?N{kBD@p}@((Qc+FMv6S>|G<^hf$K3MHw7zU(%_HrqkVrZ{S2;L zff#pq_V4#ULx#vDzM1d`S1O|fl$NgI=5sey?m*=J$bv8<`BhL&c+CE)jDA?362tH< zV*zc^zu;LdSud+?0uy9Y5|zsaR{(X1?NjSjoUko&Xwv%m38t`(iN>$pT)@I+N~|8b z!T0Ugj;AhXy>be=o7C=v+_4|#qGquLA%$vkFuT4Hy=&mpm0H6&K0dQ8#3MxL5~-q| z6-WCG&C=)&5W_zX^~a-ymOv(UWsJ=vp9p0(yFFAJ_bkZNrSJ%i^Nbw>hpu8kYupaG z#&9y~JpTmMPA6b>dRVz|#bU1)Du5_&PF}F3#q3f<{TMD3*QWSd+Bj}9vjwup=-b*N zm+8(S!u-82e>4M5%#X5mj?UjVE7Cq{+^jMpSnrwmccT=~As?>l7}A0>H#%={zi`j$ z(FgP<=}4G0EPPt~Mq|<+pY{h^sq*4!ygLVU8D%13tVEe+8G@&A`3g=jls1BAgNMh{ z!?ziAks#E#{!EKp#Tg~&s`4Qu|LogwE8XhMrLWezipAOPPr*_MwM z@n_i4K8F_27sba?xGcs;RX1%&K;Q>NhfH}*z?TLO5@}AD(#2t;OV;|`5@WBz!%wfW zKSjwU^SC&rQztLZ_`rt@nOm7w%l~m6Wm)M2_v*Lc&Sbp_&N;r6cISBzdEM7WqECLB z!2ze;4@VR-F6}HfwH2NiW;DNziiCBmz4xiS*X8I~zqS|Kkty=H;Kp>z2O?NDz(B0x zO!}83Vs=XbO|yJpyC{%tx4nuSH{C9U!|kfP39I-91#dVakr-y!RE8T;~uQ zY5LZ&6TD3utc%+XJ;iIlCY>XBYax_s$YCyxd;iccwj5cSS4<7n#r8PFS96zHZt;fF zY%2fm_0G%(TFPP&;u{exIltC$mGQpB`r_1_Is#p+zwZ6aj4)$oWHAK&w%lw0UIlXM zUCfyvXn*>h-jy zH+t(laN$JlFRejaERw5?__~c-3uEFEo4crhZ`jBA$+k|-svq*~rQQY1nCnehwv`%% z^l#=&TjahSSht9g16(Td2VeIyvP0a#Izw&;4c;$GJaZg$Gom6-h>}PLa3OQNyx{XE@rhdXy1s%5W*On<|Qa$?BZv>rnc&d zBJCbVQ;;+12(FDaaMI%ZO6Y;Gdo+TS6bcbwbWRyx0ffBN-p|<=7Z>wj+W7N)w9zVt zki1hYmifxY=t_}Cpn}HKFcgfOpsXy}^Jvgo+|+C5ygr6sI|>nx6fg`noqV)FKH7nd zu(k`~OQZR@%2*VD-MS^%p})4x!Eh zlS)W*sg##U5-OI2Z0i0|h%-eVNuVzn!hiUhI})aK%m%wXkfT6TG30 zSNwa>E$a07J@Ay-g^p6f8u9G447le`}4dw!$QU)h^%-dcjSU;Pv5XL19WtRV7X zUu3CJ3L?YIN|=g;Ht1!y7j#1%jEDjm3T63@q$bK>sL$fOAkG1I2DL;nK-dNZ1TIlC zc3kX`KA(I?s>a}EkzBcQ4^K^Xi$*f90SWasiWMmB1w0A^Ta`NrlDO%A<98+==G9aG z`DgrpuOIwh`N00$pF{VzKg09yJi*n!^96e~NW<7V5B6chX2wbbym9}bC-|#({;OaA zs~0%}{mo?j&dG|cZ|fx$#$NfaeE&Ot|L|x3>ksqSzwCeU*H_)A#;_|y3I7(YcPt)M zH~G7tLjS4<%)k3t-}k3_)dlKGH2LDiH41M4Txf5?L9E>jF(;HTd|A|*M0)`rISCLS z&Oj|tN7ZkvS5{(`j8^CQ=hLSA!1)^$^RAZ~<7xe2zQYVOMIjIXhv1X$A9x~v@!bF7 zq5f+<|GqvX_23a}A!~9|W2oSMC=I5ItEjGx68R@$V@6Fv_3tGfIlgFi0RFJmdKG3C zy&Zx(m8aE!FPzgG<+{6_5EcHpRkfyA;_q@Z-`g{%ZQYOK@aBOPf+pv}X?qIw)Tm)( zvhu#-25F=kZ3x?`fDit>jRNimV=Dm z-q<>yxcd`MAHhb#wBIGi3i;$B(qs6;S|Np;P3fn*09B)yXLXx z;}vubk*gl<$+ghHMZrWhwsC{?shv{y8DF%?@#C#B2_P zwuV;7zIbOzKX=?y19lkyDOn!JUgjeNlY}YiHG?1;{xt~QDm{wIK1yzU0{gC{NZ52%H=$4YP>3?fj!z< zZ%u)wZaIs|f0=dqJ8#xUV`}Y#KqR3JccWRW6qlV_b_|~%ztZpE!!OKunf4+y@T8?! z@*AB09e?^%(epAPraHG8y`S;`7fo5Rq^8(IDsQ{4>6lWnrGeWgIpH565!?7YQ z1{gY8a}BPzt1iG>M+n-fCs3cIM(_F>DO_If%ZK)|B5cO0OrCVO1aD!6AT|O&f*5>H zbFp|9{O9k0CTMN*8{1&!V)k6+*l!X6FfJmEUwJlS$AUs%pn1&0oLCI2dN@Q&{tlM) z)ub0XTmFFv?qbektO0OJI{FLQYZ?VezH=Te831qEmQ!9O#HVd;5mwJ2@$mC^@Uih9 z1@1oqGd*X;M2YRkAe?XBbX+sq{8wteeczc0k2!d(J}QyNN^oFrC9q zMG`gfFx_AN+RG0l;OfgMMS#UiqExTpb&E7xNkDwa4e-5GT+;v?+?OBbBy{7VPU^F& z9V41F6-KlZ2EEv9$;gXuTm(g^2ApcKA!y1#g0K)|mqj>yS{j4;-h3PIi23wQ+=ivZ ze*|&E3;N|~xzh+S-xDyfrVu>u;u~O?dEw+l zyt6kb_g%anvWash_HJSQrx+F#nXlo=;Y`Sb^zS!4g4s3nEm#Ex4!bQ>I1kbfElKR{ zgP`O}MC*Ltdyj>vNDqfMDoD#=or=`fL#z$@R;RLbOiww;RDg6dxyuiQ4?mn)#GnAd zscOXUG{3Eove>G4{BR@!W+$0nqkoKJre6@K$>JHcTkQG-r&4x7XtVC|A)nP#%d%5M z59_&1Q9OiJDNFNbo#FQU`}=)SPn00wVOBYY1E@89R#4kTQS*mt1t|r z{O`)*1()nJc$W#qB=EcqeE)d2l0&VH%4L8t*a%H(x&Zrt#h03EZ!O> z66v|C)2-lka?9nk8hqdTFp|>ZeMV~Y!uBK_#Q}9%`Ig!|@4~iSob3&#=7)pr&5JJG zcH%Hl@w&M&q6?Mxu5qoW5~O&92*$0qFGON&#UVrRN?P*5GTG|oWYNv?&AsR!E>m2` zwm4nR9tGc-C9pF3U&DIGzIkM|Mc`PtBLh0cpYJrmN;8Z5RDPcXzI}#UcP>0%an&s( z!z)?k-t2yAq>;mC6UmjfwGp}rpFHX_=u-@anJ|+?QG1|ZpbGAM>+=l34ftYx20@hV zH2&VhUyRF%u?m5eo#HAY-KyCCQAClEC>a1p;7HM z;GQct`yop-DHkLqOvSwLEh&OGdlh>^MHWk4y;YUjv&Em_-uC?CD#u4Q(JJN4|YY5i!CsGz2{^{`84kG05>Zkas*cziZ+aj-i;@X zmxFfqA-3u7PJ#MwsCm^v()nIXCq%(kn>UUxH!&lM@=CjU|BPLM?|cWn_#Gj#l;f|8 za;xHt{*~^O9fO)TI!z2@+#tn+_9u7>5=GNma?Q%sXcT2x*l2mYS2NFy&t-=l!Ad>5 zqM2~Z{^VKEeoOu77rrGY!HL5k`Smc%UD%+~+@>1Jk3fF1AK6}Zr2&A5;npK_jKPaG z1AfY|%?K@!{DqOiiU=I9Dj#W-Cp~h6%*f@7QV09`-3M?q1UQm$ik;RuASX8UY*ry^ zwd#p?r3}_ZnH!>^kJOqXp%J)_?ISMnP2Z4)&Z(Ix=_b=_{1D-e`!)*vO&%NA)i*px z!~IPoDzu9jE;%RhSDQ5Wz&+BJmYV*=?VtvSoqHH{3YQbrFu>AjG$PhAO6d;CG~0WguN357QJB10_wJ0;K)1QyC_~!-LabcNP5hUx43Vi~nEo zB~;u6B!yW+t)bp6#|<5FkB2&}>{71XC%el<`3#W$N4^j|i4>n?$ejuL50=uM>%UQ@ zSEXEjAo*0uI|NHKCM8a9;cKG>>y+pV3H5oBVL?3*J1?uqv92=ThOeoBi^vG+pWL)6 zJOZFTs0il={xHz*jZPb)6fVurk6K;H@brC4M2@=@5MB<`_ZAY8+%V6oJeM?6IXnhy zmxYw@CP=v1cE;Kgq9@tAoT>{q?U|P>p~Ibis1E3mk2(B4Kr*&5Wdzsfe9Hx(_(ddg zNjTv)dH0n@B1?fh|Jy%-@b=}~GZ$Cyenm)I8(G}gRqYZbvi3^znU#=mA8n`gOt0*V z|406^0Ru*_l?-40})2g`tWmYi5f~%x4QROOg^GChNmt+DIZ~kp6J+JYimC#00H+&uT|9FL{nM>%=Tw z)HbrVZi$=C)j56#oRkf4m;eeuOY@wzuXuAyMPjQICD&||MnJewWQr7>NAkROTam=B)}uf4m@1ZUTE)+|F;i$0Z3M}u&5IxmlsgfArqee{=SM`Y zHtf0MG(i;BUl^$;GCryCS|cwZ1|<}RZc=xTyOR-gfhXMRrf1BY(8Ag5x`M*uL z%kiQVP+@2=rSK<-z(CU4Yt!5P#&hIWxy9in+uFtBMmexse(f0vuI(f$n0-O~LeVOK zBW9F4(K4yQDBME2k6N$a#WBPeLUt&;!w)>aCSfexeo#J)<8^avQGj{*Dl)tWh=|`l z4e?2w=_*Xo2>iIj5VIfq!IwwX@30m0kh|`Ra|CL&WLz)*i13vLS#C;SoQD@~XMl!p zKv(EeTp~B$JvWO9XqfFSq)(jp%^#HLE{o6Aa*c{N%|~s%gJ!#*;z|e!d508#KEvff zUfr}MsAoxs)lzRuhp@pCkTTAd7`Xm3zpzgAAs8{hv`i`R*hG{FuIX0lw#HH_il`&% zxTOxhM$$wBfzC4KPv55neWtU4?iL;)jK-6VZ0*;RJ6jf$XxkuNcMG-4&&jWYPVm?e zL>wRjpt4H@AiRO8(8|al=a_Fg{4~k&gQ&9Jhl6}r)OCoG3Lr!;)2C~DYVM{!APZ{R z9M`-l0gvKu=zvfG*}u*pmy6zdGfSCbvgUzwQD$lFn{pQFT-y7N`} zOAz_+_3_FC?Gk@i3QiY_t~8r9CWO;*6z4k~G4jXM;2HcyAG1ZiZoF=r77VcZANDVg zXQt@A=>N3GR(^OmID5twpj@fK-TS$3KEEQcKLo0=uTafAw7VQ6KB7RNBgYh8 zD;?6Fcnk5~(l^*9|LqtG=O0F3ETCYn1442q*6mT8^~&cT`XcOm@FLY5G@quI$`3kkL`x5?XQpnQL2 z?&lacaK%TxWh~O%&$?`N6+2aEe*OMDMTw+^vplGRrQIBN2p#b3o;~a7c@@7DGhq#8 zS36ac0}F#dD_3hE=t2kQ;$OZT^3w{=`Ra9Yajv~@Ai2Q*m2cty;49gpSs$DD@Lmkt z9!rIalm7qsM*XjRAJ4N^=}YwryYx!YQ9xo-|AVjO|CcWhc4h6TGY9SsuoZ1UQ!PW=y6_v`_9cKzh^Cf5nBM`@;%N|{J&0856WVGFK-v zk=noZYti!V&>oi1xnqo?6!(VIuK|*|JY93ASrM+2%CjJSr*`#x z1cmzh)(#QI*oulW4|5JzG{gkbT3yk+L@jWKSt9HXo7{e^TP};{#QJ-wtyKUcS$(Fc zdax(Ba9gMDLxc43qms_xu>e+rjO8Se_QWXQ)6B%M08-Ga+R38tQtCLx17?%Vc3Z2= zu~7wbxp9$Tx+0!243gG5bapjO3ps+zu*97Ozsf}z|Yc3c&5N#U=p_8=^L+dgjIDskMLFb4y4a% zoHUOX2vB}V%|SqX1-%(8wi3C2mC~8-=ZQJ{NZG`^LF2>rODX8l7z=bQIa?3s4xgfm zGY`n@?6g$y-vRnu^*h?6P)qXvJQqL36QP6z;)IB*Av9P3+z6row(~8pSCzN~yNByM zo`Y7T>l&ZyTg+4zok`IL{D$(NrKfOCz2P+#NwnVr8oG&V5p|XQ+M7k>w>3MI*^{In zUmm=3TMnNlvJa}uUpaRAJeZ((?V4LqyNlGu!MQKsd$uWyfRhPdOFjGe+w1SR9fWw( z*p!oKhrG+~9vAE&kP1y&*M*fg=cBg&Zjl;e$-1M6sws33e9Yzu-I>7#B;m1?sm77T zbhz>pu8*rD5%XbMr+GmDix&PIJ}#NaizjueW%#`^A)qSZ3t z9yS8b$k+T>XFFpuLOun70j1hd0X;_Q@{t%NL40q}B-5(20Rc>hI{@JtQ4FZxHJ1-Q zHqQoPUyG%dQ+-amZHK0zqZL^;Ps9QHa&V_sV&-DgU>O=!+((A~ z*^+OFtZ|zr278YrdL-J7jZOqFrjffv)DMfvF!kOT&}UOCqGHv=VXMZE$HI{Ok~<=BU?|fT_xLtd*1KZ4`2G zB#N@}J9lJ(wqsHUxM~L(PQI}4poco@t9m}L zgpK2FIAOyA+?^W$fAUM%l5oDG9?MU{u!)B$$uRhmlfeW04KqxgfsAoTtj@P;-@GyV zc`OIM{0?^4NzCg^$>R;Y!721FQgcpQhiNX>qirZB@tPZbZ@9hH4qrrl{gN&9=QOXk z?}HP1YVN)@{XJ|R#2-^BS2o5itu1!h7czo(?Kd}fNJFGVq2LRdYkl%h4KdCey`dF6a)tg?$!yU( z?E#iWR(sp-BwkWNm1f|Ko?=eR3lu$)Y+6#IV`d@okzA$pAW`2Qj7aM05BxctZvpMaPz7G?Wc+dA_@*~!3*E2!?y<8*|#A}nYV6C^1n?o z-=%(d0N*^6Va59Il$m@Fc~dH{u#J|?LG|c1dA`E&M&h9^R8OSr!J7fQ?ip&V4$vYu zbVD=A&@@I@$g)xkT}XfbtfB=5BvQVvw^&f+LUfgeKz+L5C1)sP8)6XtgO9N8xInRn zH&a0mi-@qiEm8Vbqq-0Q)+3Vv&M$e_a*`YaCK7Ss9Ljh{0NDdaC}3x4=s9Z1s~2*HjzB5T zno@OQA7$IxGxoXHAB;sUTTl)m@8@TurKLpOLQu#k<6J0@Im>17&bk3SyIU;Ry4*4n zKC{oPQcQEm!4NG2@KXSHSYI6l@HiJ^)_p)@(r)a-)`54Se0NkDsDg$-0}Y;^KL&2! z$2yne6mW4F2D>u^*b1h|C6nZYJy2^_AL3U`TT$nUbopq6ukcVHbYCBD#>;|uaJ5%~ zg)K`5sI%z7l;d*+_T^Wyp*@9%w(skhQfy1m5zZ%B&RuyuQlr#Fj~9Dyde=m&J?Ipq zs=|`+7fg`9Gcm+{%^qKqHUmtC=%!WdZTlwMl!RvOK8-SMrJLzoP{u`UwaTSb`RcjWmd(Zs{zx` z7C#3U?i@dP$2h1WdGPqOb)wNqVr$8t%RC3+>FQ!fl8|YkjTU~m5sUvc$%#2pm<6!M zS8#5Bvjs=y$_RrM*Y=zS$1AZm$qsNDw2Hrl23PoLEk9LdX8|1QnmdpX68wUPIR||( zPB2G@yJ<^^tV(w~J?WZ|Rkp+GF0QlxKq#buYsjV?0UNNRVqPOsXX6me=Qs0b!}l+E zduXFVl^@B;Y1lXE$jKEqZ^<^Ct|CCO2bRao6}IU|O>#qfkK0x!fbfMht91y}oa--| z!;lnOG{qQPj1^7YHhgjhO>)NdtohA^G#%DyRNi;TEMlP-hmux1c{^t(YQugi1R0i%DHN5>j4RU5Avx*YKCUWbG_fiHNT|F z$XG>l76O=$KO%7AZ2h(FudMr5X8S7-{FU!SGmUk7>#|DU;apoz=|KQV6gWjc;H>}} zq^zpuwOLrmlG4JVEOp}cYS$2nJ{tpctZoAL_GkzvD}5O7kPwU5D!?BJG1!PB7c#?? zp4_D?qJCXz6O4HQoNi#X|8#nDj3N1L4F2E#l&iRrbddKH-NEM&M%nSG^dk5+VuR{W zC7{;Rvuc~)vN5C<{CX7|Z;ktWM=L639*{WiS3B)RJl%84uF`MfFeH4!uw#)SErO)? zE4Fe)AOdV=7cj5P%6nZ~UjMRCK(~Mcxi8R_E3Uj$(P8hJ)J1Cc_m6(ladO zfb$0Y8ZGwi^NI1hFo47uu++rHMo^+Py7_pr{J9upee`2Ctjin)Dy>XPG;xMjqs#3t zBZTN{AMP=C5-b6*BfH_caq_$yCt(mFOT9(@tso>>mkhHDs37b5NMB9drPikTM5B z3hda4z45oW&CO>}iG$L-_*X~+^rGFuE;hdedmV@&Tro0%PF6BLV)47iiNYQ&RWY0?X#kChs{;B`< zzFC zO9?-dX^`l#Zym_EK;!_wj1E##bxcmz!vo`F9qoUl=V&UJVHn0KR3;7ga$DCF1snYTNZpH~bz~ zcZ4K{e=>ZpjZ2=uesneaA}B?D>*NQof)fg!|gEqDVL?iTjpQOB_%#5)H zFpb1sj92c(E>)%9Xdt}^A3TU!E?I;-o2|DhHZf>#zn}qwFK39Z!0)gDX6t6 z6Xb~4D)MzYV(T9yp&PSqvZ;8TXW^0VX;i_sf-?gA*eCzOlN^m+sRK?w`}(7ojB&}1 ziQNbD6*zKQ*NMp9T*0>W^n>^`mMB4`(CzfPnA3Ck<52fy+Zb0j&vU{iCZYf47(5vh zQnHCk<3;Gfor2bTwBu3$po{5f!mCP7*W6EcGzQYW^JC1>5x&ul>eW6uFzG`N%Re!D z13XrezbiYx{_Lx&#|9Z!?8Hy}3;U-As|Bum=fm;;Zx8P0YDNl{)&Vic7Oan%($g#9 z{^is#uvd(B2jdra!w7=hHT85lAVsZCG~38j(n2cTn?8MorCp1#n z6|iQ|c~G{`jPS;wL5yA8(0FH)7BnhEFxCyQGnP~@l@va>!ti18{)a}I18=)?KsA7( z0YNwJ$Rb(nsq**_Qb=3?3|?4!Vh-)7c`w_PUxB-YZ6RRTf%cjo!zJ(*r53$@dGf9h z!IU#UPjKr7@x2NUr6`|Flq;>_?bzY(?9&cFkcpwHnu3MCwU1o@#rW`!=UVhd;H49c zG-KKV9<&Yln~{9Cs5Bu=u?BJ%U;b6jLvX8`IC_7X9fM~2gVY-7-FW7_;?%NI9?LnL zT$oKM0i<1ZOU@^e{Q)8A1HP(_AzV(47rlgTHGgJaDBt#%8f-SHmIYin=RnW>azXLJ zV9*j7K*+b3)U$G2NIME$rq!NzM}50}$Q}j(tzLd_O!k0xldguIlz-|8Rmevw|LQH? zHs=!iRgw8;itchi7*vHE)y)-$^NpJC4>n#qq0&l#qR@l)n25qo{y5HIj5iIE%zZ(t zp5-~3d^X}|KcZy~7C-A$;lE9$Sc4%n-yWj{tZvjH0Gwtj%9nIrJpjonB(D_{<;_|M z#;Xs753f+EMA)szP^+gAAd3mCc$Ol5M7~ZsW@bq;tMIUEq7_ZBW|0XY;%!zoDs$n-wyP zz%l>I>wUgYe9S8TDR^<0rgj(+S7r@vIs$ci#PiGXMSQcwi_k1##pW>=quXFyqX3`l zIj69_(>3uQW0{}2cmD;=1Ep8cV!YrU*Wv`6oG{QW50FmEIs{{TMN58h8*aG6o3c(|eT=rZN8&Z% z?ERAkf;7$pnEOop6?N5+&fHjQ&VtDc5+)eoJl>&q(e;y~Jh{t40)_Cn3&ucyVdVqB zE~UzQg=CLjE1KIu7UFfHQ#*Sia{u?PnaFHx&@DGCln*&f9p^VB6 zDJY4ts`-=;+w8MLYJR3DHnkCzIscl(+mpE%`&}dL`O1XQ-(3vZN~^meJ~OwC_@dI% zI-?S9iD%QAIUxR#jCNG1f#+|I#l#?4kGtkg-05pDTkVyDI8B%rLL}Fcv>xUJkF%4Z zrGI<)?Nv$emmfzu^5KrT%r4Ulo8Q}jx95pIk_?Ae&I4eVe}sfkGk`X z_qX<8=!3{+7+0Ard^;1&j%JY+U7P@X<>~fbhWSHUlXr%y=!b@J$*=49Ot90jm>x3~ zG^JwhOfpOJmy>YN*%fFP-L`}%u-xAWXS!fj##CRLH%SJK77E0*>lfc5&V&)+XSm0*9;{$&r;A$V4oELx zNo{Dse4mxv&QTxA$0l>$p9K}*3aOD{84#@E&tv-p7XfKDsQQwPJZsAqe{qU{zWVv3 zH9Q%0d%o3&x?^kbN56Zmy}U;Un-1!Yw&Y!>IX97JMiamE_EJ3$J9CM?e92rnfAW~a zhfi4>o_=*;?=6Su1+^Y^TUk--rZ7?J{~zMsDOi*sTGQON_t~~>+qP}nwr$(CZJlk~ zw(U9HJ-7Szo#=U)hk0D_S7c_biWN~+x$^%KXmuL!*}Rw-10tCKWy?B8_OEr!gF17N z{;q?Pwh|Tr5??uyi(J7|u;r4KBmU3zEWGqDmQU?UlX>zkKXrZUj+oWF^Cm5QrX>p< zz69zuz$BfZdVUqo$;h_*@)`O(qo97=8|a^~k@Hv}KaC`#rm_r1%m4VWmYtk&wz9Qf z0}y9E%8^^m)vELNHJjonv4j=Wc!nN7oLoo$Fz|j;?V5ac1eSFgd0yFl=UB-n+65O}4_;|71>4(XmquSZ{UYky z)bv<;BJCz0efe0yphY3{s8Vg%01x%vB5|AEtyaW?axy!9OnCjhMTh(bdPMm-1UV3` z-*}Z}n3mBjyc0M}D{Rp-Q_>Jok1S_n{d;!qxgrm^zp%k%5E{II|4IS)5)z#szS(op zZ`o&%bA<;Q$4(MxphHIbh=@m$4Tk4bf#{c>MH7VUmk#Mz9}JRx<+$yHe2%Zl^@fe)v5X??p}huwdC{{%U`-fSo?s5NguMn7`4V zI+TCw!xKJ9zVS1akVPm)Vm<2$c9{wt_0}%Uq0Zp)YG%xp>S@aMO#yY@=ygPcwBtbh z7p@G3^Tu;)b}Fgyh>deUTmPrPGTBv~MOuYb9jEbVU7*n)vf>*GJS1xqy)-1!}*NN_|?ePaxBS&s}&veYMEgy&Dg zPQ{<3!ZD?tp!YT*)V*d1=cZ3UwWFBPA+pyN83V0YLjX>p>|6?*(!Gi@R$|XpWmgkT zfZkWTF%Q|HE-4PNz%YeP?sTt$?jF{amc#O>8O-ZDOjRtb5TDKD%v~^cj{D*%hphI- zoH6C%R|Of;KN299ny|PudhER>-s?>KgdJ|KS_w7-r?<@Mjv09!>od%&_kB4*bH>^a z3GQ$KX`|0Yd)8o8R{vVRm&L2Sjocp;vXE%ZguP}b*09;WCpZ4Lb$EJJ}2vnO*uI`s25G}5Fs!eNjl2)S>Bwg!{%(4?Z{{fY?eSnd|J z4+)+q{uw{#J|t;gi!CxnQR*0B`qgvh5C$0Z%6=0?-yt^bVcoehc)y5p_@%=(6xZ4-hSP!ZFv>_(7E}t7d_Vq zA-0^jupk7lC-DM9h<=LA`~FyoEI3f#```7cKc!UZ;xnV|mrQE*47ENrlRe`O$?>cZ zY_TH5q(p$1Oc#1Z)TD~5pxSYI&V4NM3WLr=2PoQu)%G7aRoc%AD=e1^%v>j8oopEZ zx+Onp3daK~2S*OWZ?`#gZrI0F&A)ce$n4va84w`Y{%*Rr7mm6m45AdU6^KTLUc}U; zGJx4o89-ui5@vD)9(FSIjtD%IJ_|j}XQW`do3bwu%}pCjjzg$tgiP7?SR2X%Dk_7y0of)wJs;g_bCxu{x`2Vvcg$ zMuSG{glxh^LqYoY_zdLadVD;vb!>L9O%|Ex!~Oeq%l8<-6bE=sZZYHOh>yxDfPcl6 z^wKM^>X^dB3YWR}4KmuOSbh-vv#U$eza8UEyUVo#-V8NDI0y3e$-t?)wFl4R>`<^6 zrTF`iu#qC?I<)Xzb7ax6!d|b}P{f?}b$0n)$7r$U)QMtJ#aoTSNW{3y)2#|-c&~ z#~)#GuBIn!uPHs$OwsUux-G^y!CJgR4*s-kO?VOo{P3tgMpWsj^7r9(++3q*<4Rxf zjzQI^8OQz#g6@uX8u&O#TMv}R($yEH4w*5DM*halGA-4I1VN`HnphHRwJsy>|Mm?? zZkLp1;Yda<`>9dY2AQA~h5APE)BN)KWfF1zuMDsK69LOgXbW>x*_C(Mm=7dG|>9Fs+#5IY32a%s?W$t^0~gC1sfo zitri-EOb#gpB6V>@uE!H_1;~h8tO){(NCN!2shn77q^XiEddmk8!f>YR-}`-p==2L zC0M4_+oxTL$zXMkn_P6lZ}w!O`ZdJ3k69Mq61}v06Lkpi^4!taEo6XveNPZyyFePahtQytQ^Y^ zNA~rXI-Ia#XQD5)ZQca6Ny}_u7d(qJuTWX@QT26v2<$3kx5b{^ z6|@q70o{m>w-kZjjv^Fv0*dh`z2t$sWxu0cSY@e6Pb}Nfyw(3i{Qg;dAxlC|=yf|F zO_d1jNQ?V^rIsV}Uz4Qu@yxn6Q1_4ZByS@!1kHBLK3v5;tUY?}qDK0+nunoj&tnL; zYZm#eQaTikbkdkmoUgb1qwA6#)zn9FC10yLHm6dT@33NBy;VZR^Ad{R1g?tkI#K;5 zjIozlkV1Ptw&%Q&%x8l);Q1}vQgG-9crj|RmfK?dwp_nz5_&frCRA)70NN>as{Nza zQyr>c11QUnDC}}S1jsFVEK%D~cbHwaj@4|dsFFJdmMyyXb%4jh3|X;79wVODzc-DQ zQ~KbCP0vu)c2Hb`c^eZdKt&^^X@};c#P7LK$WJP>I~e^+J)+FQ4(ehhQI`5H#A>7- zBEx&k4<~~Jqr9Bv!PgAYryhrkOrQ+Vm>I!vu9c5cWQLQr{dW^yuOA!9cBEY0eK_&8PMPsZLs`A*exm(?h zIgds0aV=W3V!gIaHmVHT_JRCM?+vT>>3FWgp(9~#VgDyo>agp})36?Yql=lU3kasv z5iuV?8pmV2$oNNbCV-qD?Rb(v@`>uT^|8>@=GupR5ismzr)s$HSd3D*YzO%~PseT4 ze$P1{DsAEsOH43h-H_V7<>8H7{hO+QlrZE>y%Bk=dB`$W>*|(p@gDDkRJ4sE#n!pd3B{g8xV^8^UNt9LBy-J6=Zf-Sa z4fac~ak9Rdl|kKfbND>ba6!{sR;2A~5;KE-WOF_J1E-PKC@+ZOTk9jC(B@m&H zz0Z6m4O<|9(Sigd+oDf6LV)`cZEl|ubYhxmu= z)$%|_cCJED{RMgcw0epv_3{@bTs4xSIZJ#OF^3aRvNGYuOq+gQ?I|T>91^Dpt-59M zh+XR&vAD=!XL`#+;(bc6_Iu2f1rSpFDx*3N8?ja?F)KQfa1fh;)ATUsJlL(P632cZ z=zP$#T`bK9l%;^NQoCt?lJi<7*f7T|1j`6QKkcLE@nj`4qxG`0CLm8d3~yJAzq?&q1ZE z*YHTb%6BAMfrU8fUgqJVUZcDIf_nW_7x0(Hm@4j$L}8i5uxBT#QM&Xkms&;m*GJRG zCEAW+u|u1Kzru3Dt~%0SP*{~?cZ(wQof5da;+2ya9SFGPcrc<&!^M|{!rIbLt$_Lqk`gVarwxF7u^1Meg!o8+C&E5 z>%_!cmy88Ed&G8@-cLza@cN)rpru}>=Xx5EvQj~8TleC>h^u_}09{hCP8$mHt>K3r zNVNwk*Qkr-RRI^Qr`8ZTK>JJ$myTN= z&4UWXpc8@EQ@$f)eSJ+(&7bIx%wj<#>7DDBL1gw`wvy|Lk&~L`woO=KQLFhJM88_j znhg7_@wo}s-~Z#hu7%C*nmWkA3MN?`w8SpP^AooryNUxasQWAZp;f$cY1I}sJt<*%mOn@7=MvO=kBlBve zV0#~ZIffXFE0?p-&-8X<-7=4AW$%GXGtlOvYYQ_oorqOeU%z?1o|+eTrbdy<;e^Cy z6fc&2>TTiUMJsZKtz(Mv;Vcy;zqh+HO^p4A8Md8WKhD?)shSmH%<2elB)sAyz=k=} zya{a=h}tYTdgCf@phQZhDEa{l#7?+wl=xwQg*-J*-7NsLMaaDsH!U=UsBE{<<}7_K z8ISrsv4xxWrxIK*HnDF>tYQgIe*w53N9e!A{O0oxn;&F31T?kmxAJ&oiVyvoyH#eU zIKELljf-+iZddhV0rG)TyL7(uAbmF*7g_3d*pyESU*vd%UPWA~pxHM59G?}_dpLF1 zJ*RUz{I-MMPm#!mFPu~D3WKIN<_Q)~pD>WN?l~EM?l4&(0LEYE-?oHQ(ftFz@E0ye2 zadK{PE)r`KRDM4h&Af|euCrz)LmD(%8{`vRTrQ;)C!!rt2Mb>C)xyGgyZ6emEA0#(^H0D2&w9wJ_x16U+!dlBIx~vg1@Dhz zE!;)=bx5S!2cNIYS?UHZ)T8)srRTao-WWL1sl7wO$uEM`e&|{%-oc3tjiQb+{k42= zjjj4>llsd)_fqEsf@j&=+8@1aWV^aYO#`P6RYEd+Y{!{wffunsQc>n9`(5FGx@Z8P z#edUfofIlKB8vc$HB}rAggzAhmyY}2_2>b&pi4c8gr1@egm*lvv*rF3f}b!OT|W;* zFgpJM&RsndOC)A#j!|p*T&Q77nHV&qd%R2Aj1u8`3+0jl0};%wDv0YVj#DIuvR zp+J+^F5KY)T7}H8aKn0C}qJ=Eur^iF;{qJt`jU$n$%IAXut@)ACL1mVc8N)pX=m5 zb1J)25__9an%sdIds+Xx!Wf9ZLF?uuN7p&>P7w=O?eDJ6ni$`zDu8T4$0Xk`(_xMXA=tc-5Zz@xWVvvvH)DEig(3mfW<3w;a7w=a z=KDe)zX?pevi*gDxX$J}oY3frH|mJEO$Ll84Qr1VzMo?cXO7is)kNB$xbNcPZfT*9 z6IYxUsYb3_?Jxp)@tzCn+PUCnP+sgThF+O12BDdv{%|WRuTX0NERE7G8aAd_vuN;4 zl|(CsEqSMNkJrH*Z&N`swJn92gA_Ve_Ccokh$Q6JW|ejJx(GQEL^rO4wZtobu>=kn zJl2|0I%8v~I`$Hon4e@qudtPus&aZYi~RTX7yE+m@)tuLA!I-B;zXY~837qPFA4c=(} zXlB}0x61<^9wAKD3|2uPcsfcF@+5zLkc3@C78YZ3w!Sk8VJ!+dh}KLg3Wd>D$-^Ad z5kEisMbwk&Zq5|-b9ia^G>Z7@Yaquwpzyg(OIE&_HPv8cx~Ax=GKKDa=`jH1ZC346 z@3=r4Zd#GD`kR}wiP#*zmG~LhsW?M%qAIHaSF!1zjl_a9F@P>EMbENXm!X~GMQcR0 z6%fD_7}Qcqc)U<0$o3n-zMtID^yoS3{#PZz2<4aQGp(phILuUwV<0^t?9SzGE^Q-) zj1c=>xS%CM+efJmYfu~IMDu->Z3>#8T3DXomjnb(O!$A(ZJ7<#`19%BahSMy3Yn0y z{+FKk-}S>T_h9e)OE$ZgM0l4EH0?wfdWA*Z{<9Q-EL9GZz!`S)=VP$J58;jobVdaD zV4*Lo%!oI%J3O#24ZNi$w@+u6$lRL2bUP7es;a%P{fu2&pL9y?*wDnzpvm5%1y*$t z%_zaIDPo2jDBsLU6C878PauIUnXM)NsvBy3WKw5PNdA{OWt1=daS6W)6CIF{$|L1v zB9P%ZQ<_0J;534fu&o;@xMxC0uI5a3po(6R4qd6}Ydpj1zsI%+-kH3dngkWE`lrPO z9_+*@8!phf+^J-q;VtbVJ5x!HR?Z&PYYnvP;>GzTqYBwIH^fIUQl{f?TFE$Us-8=8 z^TAKX(D;+YVK`%jKL|HX#Axua_AJB_Hb{@-qh+!l7-|Svo&X^IM`p4bp;3Ec<)`qb zAvU=(S2XZBS^%u{`?vQzwhCqPQHe`eAKV&X6OC4VSL{R-2oKPGnebYVRO@ct>aUHBLAek;p@)O%ZJsDGb1*hDX*aw$ zi5=flqHSNrjPyJ%1UZfM4Hp=l(o zeAgMm2C&N4&BJRsfqa{71MqXu6Uo-=V83s8SrCc0wxRmR-8Oz=VjoufW`(MM_jA*P zc@@geUZ@^|xCJ2;m(E#k3Oegp^{9+c`yL?8*F#Bx&#-)Orpe8xNY+JX{HMnofe$Ez zgQIVq_=f<(BG*TN)C#jpfj~NM&G3-(nFrKDBJ9(#U7d{Z6r=$&5E&wzek%QmzfC<} z(>aN%13GoU1H;4JzGxDR&oDBmo;KDD{G|V!f@z!b5Ngfx~qS7VsoM73~u|XJe@0Lc*Rl&pYrY0qmhY@I!Ph z@$V3KjCUkmAzWSjn6mMrmZMJFK>}mJsCLbWQ9<|#8;M(`|*Y&ht4yk z4%wfNgMFq(2O{T*7+vNs=fU?UW7ge_7|16#gLZlk4AtM(b^WCFjc!Zi##+^I9#Xa9 zza}NxvLrg-`5@Z&X@6&Tw%mqdO{vM(ubwd2YT)9G`2pxLh+|%0>sqZ(<|=?>v=Z^7 zEAGgID*{&o#c}{{B<()57W>BWrdlf%R04N|OVh6E(4uSj^l}s5!l=lrO~_(WS#>S~ z@*4b4V;lzgPTQ93H(Ibv=N(WWGUd;`p6H-0 ztJtD8*jBn*ZA9#JOcX1e@u&>2X25;FfQ}=p+gG00zk5!lRZKJNdE^c8NAl-rnBaWc&M`~SqnS$3 z1)#=};Q14c&IbjvCJgx7O!w!3*aB^*#zs-0>_Pq!f8IF-@NFZNqL|?o!~EP{U!Ce0 z!7SCNfSmZtB_JW7+sSHsYM3kjHP&shD=vOcbw#V=m}1taA>{3L1cu#9F;G{)TiM50 zBJy}IiVoSpc9XxI(a9j&9xB;e2yhS1&~20T$UW1Pt(6ec3tN!i0Y&Hl5GyR-X`qX@ z5+ZHJT&ctQk%e)^o#Pd*o!x&3BmeHUS8t@6$<_JTM2Ly__|bi|ARp>;$wP8B#UP>| z6na&Nur%}o(Zaoubu8%VyPb4P|GFF+_IB&3=2(8=OAkZ%_Q)!5S*PoaO-$XcXk%CN zg&kwQAjhDj1d4J&4>*Sxu<omSI?Tg z6q4rBUX6c9--UnBTCmeSY=nzhtS!RXlw^uq?sWNt=W-Uv z#%K}iW7YAWgE!VH-ct7}CE!l7cl42DfJp{yG(P=8W@lt(CqALtwBDkD-B~JKw8XfB6e!EgDSQk(#b++HpT3IhRyz! zyqqv0lVt=2UHRf-zwe&z97qLR@dL9%Ab-$#-M2WZ(N=o~&@DZXBV|1%yG>l86U9tQ zK>9kfnDHqOk#cY^S7`G8%9dtaF^a(ij+9mYB($818bnZqtKfwq)8H9moX{YwC0fE$ zZs0vZT*$}{t84SyknU~I6~GZwODODiN`un+s^HCatBTXZ^dbL=6cF-#1Na3l+R5s0 zp$VfjU)1z1;-%R&l?{FVW{}|P64RSFCUwH^0>p?TQr#b$YhbVZn&-d)Oe+@9mdGRg z+lTXkr?)Z?=wEt3ljwAaKZ{+u#fG1F8|SkuFHnp=%4r#5Ah^v`3CVrE?JUOdhUb9E zj3^&i@H?!S&=btg^SWLfbIyF%+;9N5t8fZYwEvC`8~TU&=6h$@b?3s3AkOas_OL`G##vTX@Cu^L$@)YAEu zn_t2tgnKoO2}O^BOEm=|TYKk4F&;m1>*1xU1ohyOqj+Dwu%ehnfchBbjQ>{;MY}-Q z;{_in@L}LP=y(PC)#Q*pT76sLdv0yo4G1z(cSlq1_+$-@*u(ficq#0QU@ET%hA9Y9knxP&k)HJWdY#Z@+muWd#yIOp z3x_#6wQzfkWN2xQ@Pf;lIyTfq>|)lqAt>1k2L>ome}%#5*)~$_Gc<%vM(%;0@L^A? zF3k8^aoYhLcqdXXH1^+y4iKh{+5J9C@j5JFA->&wzWlv2lZ2N=%{tsNH-vxGz11_; z(9^K@0WBN~S3UEz%Kkun>U`i|j1l4J&`2Pzp|n0Gcbv8+IoVM4VqMwR31xGFpamc< zO*z=3cwXqV^POk4cMyB+@$t}XLfkth3RGbz$OPF3VKemqylCb>VsJ@*IEzt) z^~%1#v8F!W4LjJ+264Co+{Gww!eYlRF*BMOO%4LR$?85rJY)?P3UpA=aCR=RM}Ea@ z#q9SPT<7(3qWppcq>cSBkxOg0L;}7`VPGr|0lpGE;WNI_n!|oIV_X375{yM5 z;DxIV3GOdjUU3Rctt+^=MK#9M@(lXWqEWhu`>QZ1&4tTViNef}SDRun{uXhokTAAkOHX489)hv*eO=MRf?Mh(CR*AGd2&MD5C=BI>zGa8zxR5 zKf*C{;96OjJL*&&>`!vYUg)(IPV!6+{{$e%Y7O^2`|?8izD$DCNLHQ0M(IBWFp)f+ z_=E^!c0ZmyI-e-sq6H7KLFKk&<{mZuR?m)vySPkbX^2n_s!%<$NlG#q)gSE^ivnp-byNeO+X(!{*Le#hwQKs_sxUTa-y;USU@ zW<-!j# zd~P3GFw$@0879lgy%b0Hb|hd1-X{$&4VH}=?<<)$9H{LZbAmf+^9=%jM(Q)NIs+e? z`Ao@?!Blg6p{Q;ud7W%p%HZIcP&&Kk#I{hM*h9=Drji6*AEhMFRSM2IjUl+#93_J@Pw!gL z#eZFNwrwL2xPDIBv2|WjPIBq|9?P<)S$;mYUH^C~D)YWoaqx}K>e`ZcptbRue@S+t z3}*0kV(4!7^SO?;nm7cLHK2dw!Ov2QMDi?He*9Qb(Ef1WVa5)8&f*cE2&%=qR%;A0 z?P02kJ5gwAVD7QdJ5pT;joY}=0=KiR4YcMaS}JV+PGePL!RI0@t^jPaYbXU8U4$G$ z4AyP!kn%LI*LyMAnW$Q{@DSWvR#Kb{_4jWq1cFi}j3LIuG4x*Ic_vg#+$Ffi0uI$; z=q0y;90aCsPHD-d|Q%-4(H2!7t@0&T3 zxL<`u5bt#xMmoG0jB@4db8h5w`PmDDbJ3Eg9xT$7Tup(o2j2{d*~92+g7;YL$lURg6|aLLoCf~rjcboBa>1|+$WMC}L^6=xhq zf$(6)Ybx{R2FtgRy9dlF`LGwZNs3TOL7u`!mw>N00)ymt$n9klh!*}r!bR`eoL&!q zLg7NT5qmAa;`y8_JLyV+$>YogbK=z#wLMvJ3|l;m!u-8V(1VbNVczN9il$QC`)uY)`&P&Lkf*N;$VN|kVnrZKeL$Z`!IHQ#7}fyr}`&r^m{kxNhC1* zj6nPGfe1nuGZG3QHpF$DlD5rv(Z%(jb|uJ(0F&ld5ytuTGf#r+hO1c5B1@NUCO61| z$6jyABcOlC9JJBL+mW)G6nU8&AWH*SJ9%&qyGdCD);;;IBKmKfxqYywr}-{UIdFxV zE+Ah;q0IUS2fbyKQ`RmJ_nLMI2Ou0wrm@ z9fEDE7c^YQFmbH-J4YUPM}E*Tq0{Ri#!Pa%*!R` zf+=t3qW09vq|_j-cyyzLM)!Z)6xA~O>uQQ#AFwyvX6)nnJ-W@ocMUgz?T#@h?GjkbJrsrx2BZN-5O-`0~t$YESQvhmpQW zX%L&LR=8&@X~@+1hr^xc2dp(CCy(EKk_6% z#L9PZK?TZC7Jpmw_rlEJt@OKFlNxz4+as)N@`!QH|<`VD^*M#BFzZ{494jlY}Z?yw~MHAq`n4+^>0^hS+Idn zO7GhQiU96^M=3g&5;%8_>Ena(s;Y6RK{X5qL20t4%Z3UR|jCtPC#MWRnf%;DORETrj;?(s=DQ9p)jYToj(N(n%pX1N)mrf)*1ZRTj)Md` z@v*vmqrqwYvZ$wzQy{$dYIeEQ`_K~8y}Z6Z)~$VAuJ>wzlP0aV?X{EPU`c;be3Oik$ht#*oC9`e<0yEY+SOfuf1hrPqwNCkt9|&-mEDkQ zs0EV)m?h*L-t;ozG_hrazi;)8qzzQ{_Kl0|zqRqYYeg3vC6m%d ziTR~0y&#=Y$v|FRLBU+jf#uGe6Vr>j_1VDWaQ9xHu31%6usWsVbBd`H%c1s~{bSnF z&N!d?x|=J6=x$@5v3tM}ddy-0pF|CxKrD!Y3B$YsExe7PfQ$kC)oKD%1Y3MpctPtp zp}u1D-up-T(u74N+pUU2>(0>wBYBTiJV*7?IU66Eft2jUlwhO|z3x?I(EWnFgyWTx zTmLKO(C2FNmK!?wupht(h@rP>*0KSv6|>hGE_0$p8hCZ-D9vOuVTN)_u2TC9t598G z@(=|c4%UqD+UI`gl^3g>f+(wU_Ze)m$S~h9OAZqw6 z{I=PN<2V8ttHx9l?^%m|iS7RX>s)VG6T9;84g2pGi)&o|zU?GJ6SGQTAqjaG?Z^XcCNIEWpn4H6l-9= zN{+UTch2Em(W{Y~k6NCQPMBu#cMIE#t3l37Q>C3lDWz$U(ssmtth~E`GwVFr^ld<3 zo5j)(2f}5Mh%9H;1I%B!6<-ulDh8~Zc|R(IBZxH?sqvJpTiseZpb^r$v`^)x)bu=6 zygI^8aG6;&RZ7;MJU~n0IDcRm2ck&CCJq4A$bzZ5!}YF3LQL zrBE#N9wm#krbUnjL>`f}os72aGZm0J!`Cl~qpCIAlr&3=GRXA}wds&bu{pWWvx+pO zj+)6q+8l68W8VBZ(!O|u z*e`ObKf%-RqUSsS@ZjVIsTYW zb^Uh`Eew?AT9Zc^)6Q!NjAC?_=4W7ct3(oIyAc85DL_oBn+GWVKl1Zm@&Vyi10o@w z6BVIVm{PaYdqVwyFF)d6`*J+}`GQ~F=@a~^eLs?+%4oa#bHDdDl5mpRuJTJNM+6e{ z2osEdci8Nlx^di*+fXwWv?AzYb`G8rXd?n=9x5V3bFCahZn|Ph+c)*y>_e!ZeY<;m z`{rT!@2?P__Z+(e93}UT9jLrCZuOYHIgAk>yKVtlBBSHT^2@0F?ZjXmW3d>MP|RY3 zW&~T6-Fc-9C+lFi{#Y)xfZCUMQ>p9>8RV{x zm*{80gFFOVo*{X95ts8SOio{xv)RD-5|ZI#%F?W87H2orADBX^fmb{v)T@)Z6Eb`i z8vbYi?)h@C>5wjwoqOmJG%oZznf{N9C=`XiM4UWowKPuQ@4<6r&*yhoEAARP7y9za zo8G!$lX>^XK?PWRd0APd$IMBrHaBSqQ^rA(aODdHxlb}2u*MG=C|iHuZjxA(6KPUH ztVOXrP=p+m^|VY6=0_K6%K zz-&TngP^L%3IYgH9lnTK5}nDKYrgQ0yK&Gcuw_IN{J{5e327Ku!d5Mm(A}(7M)G&vTJ&;70~$?8%bChq#ouRZ z-`W0*9TnG>w8|t|{FlZ= z5mRi*GYTv?a!sH4!<+)m4j1yc2K+XMOYpBk9S=%j#~=jtEU?o5{Oo7{`PpOt-+uN> ziwlox?bzNOLb+%a3W{)6#pq$Ue53*frB#PP^a*Gv`eMb|526okNV%pJv+|ibRf&}6 z=`vr)o^lw=Xwfkff*q=Bui(`h=!@mU2$r{`I>Tsv%bliccR)sV)1s=Yj%9f&T%?4Q zKYvs3HAL2Q*oR-nFA`-QS=OG?tDF6bBzlsSZaZ^u5iSRvZfF#~sM{v~fjjP?5CR(*ZS)2XEc*=2-hZStl+2BR|LR%g}Ro zqUpgRX0PPt01Rz{?Vc68NyC4K2R9hi=EJkb83cc*{#Sng>-86?)=SE6p6EnZ({gfz z-1+P(!AaSEu!(}{)=nF>qgAU;OirjQ_MGl2l zD}*aaT@(CJpe&`35k)qqVCBCJQh4<%s`=;}{BVju5Vp;JP5dqRYlLkiZ6q%hU;<-B z&=ca$({<{!A#zrL%4rkMep7UHm%Op}Vbu?ZHjMO_taRJo7$cx&QZeOD8o0s^HIoZC za*mH$6I%+G?AAOU0g#N5WBO;sx~I)`>516x{Ph;=y000`{v6s* ziRRI9O}Hcj<5(J_O*$qi7g-w2e?TE&(qr9Hqhu0x{4-!fcgWV?v3%O-8347dn*w-o z0zHDv-SIl*Vl`}L>&LN9iL^u&T>?XXa~-rs5t7biJb@V9A|Ub%o!-^iB^U{_&B znVOKRY8)El`Y+#~C{xu*`7-Xx47#LBCm57O1i>HIud9bLS4$WiP$DCQuLZjBasND!o{xP>iPe0L z%LAf8?Lw1&wIeYQZLeuu)sT9R|AUY5pLsc}|M(vbGS5472j*>85lU^57BPbVjjtm3 z|H4=KuY8pM;EnvB#{aML{r??*n-*#e0IjG_6ZU|e>P5%n6Nv3XTpR!VpXy73(@(if zlbYyGVgql@bPS!20a`-GnS`h1Dx5FSY<{h5;wT;dK(2it6NQ{o4*lHLE%5X8MG>R- zz#2u>mbMeDWGp8M>u*N!BTXI_?&L8KR$1)^-zfD&i{i(zN?nSvUc!R#;z@9Qe4RGg zvEjgf)VJ`z`qukb-a*TR$kpTMHeF9J}y3rd9kOdd=8=Qli zDIck1tU5RztEm>PK7 z4K|s*RwgZlAv5v1mxzhz(NX|evH)&jlh;sq=;p!`OVG{GBO)$7+%1puQR~%$T3nvk z$TG9W;UEDxUx*!~qh*#5BB>o`*YecGMeuoE|H`!-iS4ft-sHTaw&LUA0e%r1FQg7u zgM*H?!p#(5Haia#Ora`tVE?0^P&;sI;x_z5bR-N|>IV^>tT%@-EJ`ab1+u`}HG#M% zFIxM8!eu;iCuTR;J0E(@bXFA~NMwY4&H3R7`+JWF2X^5gOg2sw^7g2l>|il<#)&Tx z#Nb+;`wSg33%jHGSUvF(tEv6uF0F}Nqg0XmPfvkTu{fl&cB-@9ZCq7FB<0zxYBT;I zPW2dwP&-b@$gI8AXtX{*LOGe#5`4CBXXY8tpsN6c*KduEIO6m1aE|kXH527085hJh2dmD8PptRM z978wU1xpi1pdGq`U`4Vve6$QL&lm@jvT(YtM zp4uQH?Rp_iy$wHMFC*ws$pudh??^=D^@6D0Lj9#;%Q~kTu0OoKvzDau9gu<;H=~#w zye-FsHqGf=+_*=4m$j48m>PMg=DSVij+l%?eE=b@8;XWEIyXT;_|76n($I7u51Q3~%RGUV7fkN=N3ldmS_S-0VK(|ElbqgF6e> zFdf^rGjZ~ZZQIFAY}>YNPt1vviEZ1qZ6}+%TX*lR-Md?L|Lp4ToO*wMnv+c0mSb;`cHCAtOWLhXxL=zX;O*% z*|T)SMW}=8W7qjoHaTu_8(3bb%8ftjCTKc!g|c_F1ScGWp>$?zx=n(s~q{ zW0k=P>e#9o)sS=rv)!SBMdjpb#f`@aSkZJ1Y#QDG&16q7W`7cSoK}Y|co|*_)AlNw1+Ri13kg^O~O^Y9n&Y2(kTUh5Paq zT~uo|qg*>=I0_)ENjpQkxiiIyZ9iuG1qqdAjq{(lF9jPU$}f_4b_k1+iW1_jWTFjn zQZN-EUxgG4)HY7A)R7dM3!f*~!^yxc0_Iy`C1A8|TZla5)x7*K;$6avD=fiMP- z$UcBg2T|>mhp4<+_Y-R=f7o&hvL?oO$%YG8S;dG=q7;+Er0|P0|6_CMrFPLzes-wU zYj@TQO-~Ah8X!zKAUkEzFIh4&i~Ia#77ar7nxwYLcIWtMD-Zv2A-Tw=LW6F6ee~w^ zL(i~AS;LjiMLz8Ry}tgp>mAaU1G3i|7eF7f2c>V_EP#NV3>x8!pSwe5w1A1|OTJ$^L(A+_s|k%Zvz}%}BnFW>h>!8+^`vG?$41A`mXQ^r zYh}BzS=p2nY7P(^C}4n{{kNB+&fi!%g&=T!`3WA4{MHEsvA=#@JkBR^PxVx+M!WRi zyT55Q+B)Nt>x&;i`Fb{Q@JDDmB#ICBj>s*hG9csR)=J80p}>RnZQ7ucG}f9y6{eJB zT?B-=i-WstE+)$Lr?;(lPrVZU3VmMEgg}p*lq{3-3=gYsWU#FUxsy%p?Qb&vtZ2kt z!DQtfYXma=G19yvsUKDM8ajirZ{@k&@Gm5Boa78+zv_!_}npF@rZGS20lhe&~L~H#TMt! z8!&!G+-m5YJ$OSii-On$sAt2IG8ukZ?WXitz_>&}*}9?kqXH!m*QqQ&F`Qnb=zuYc z*YfCbz=0?kU%H&=}jQi~lceesM zX(F&3=C)!uuyoKct`i2mB`Gb6*k>uYTiboJo{b4zOX+25|A_7`Ac89nMy1gg$P|NN zTf-}!7afy3EMY&OVbsC=sxZiy3_bRE(+3z zeVMPl%yAxI6i)g-VHBOVr4VK~wV%g;Mhvya*@lQzV)NHplVaTIW_B99p+Dx+UkkY7 zM%VJoDsR(O6XKY6g<`RNkk;}!=VURFv_H{MMZ4Ye6mkjX4cd0?A}7osw6OSkecfo( z$vU*BHG@xv<)MM3w-crI#o%UQ7%z=^+t@SI+ek(6JhOy;YjOYw*1|kw{3th{P}*dq zZ2kQ9hT6jl0C>RIj{vUU?ao!42IJ;b{{u2w0bh zU@tsui=T@Ue5iaY0>xxI`4p4!hf0pLN##3~`HXaGM;z<|mR|SF=`>3nIPFzd; z7(`*O?}eJ?U9G)iVaE5zynQ|xeT(vQZOZiYdgly*bk z5Jy#giPh)pKHS2-WaE?b#Gw|5l9f}8jTSVrgF zn!7AgIZD9E#u*Bz&4MtV;!n8{Wd zh6hXdG8zezjImKu>RE<2D-^|F=lZuZTI^X`3TA6&NMt{nTKCvHMO=iN$F6`Iw;{X> z40KmkSmkGSgtwViwm%&CRe}?If1O?0c@?>T+VTm*&WkCir`~MtP;+mku)37{^z0lS zyMSqT=Sf_W-<81^8=M!UhWILi+od6AyQsx&{7jCe%r|aJ#P@=^xHXS3yU~#v=|h{$ z*#Ud9I&BJ+5Q+IEbQHlgfVWtKt9%HsDJc{>ApoD344*ku;K~`IJHDXqY1HGMtmYqQ zk8qQ&(cJb!gYibY89VMwq`^@1&$>$2Od6r#=UOQ3y(Z}sw$J>-6hxTNMd91}dzvxB zyh;QzC#o6S^0H{iK@agaH!&Wv;VOQnd~NJ@XgC-N>h=3()Wh8G-zaZoZy)yabIiP` z=I1FAlbpQBgcdi?H5NG6nTU_w9e#eP7Q?uvrYSQoGOJlb-q%?*eL)G+6g;gdooDge#al9p4L%t_Yth?cen1}9R`q0FfHiDU1Q zrJ)46fwy9c7R~L>P9W#K~->gf#8Y z#CiF;Eb7#Zj$H1GF^@QFMn%!`r9?EkRK4QHHP-nURf!~2WwDz?D} zL9)%BGFY0sXH+X3`ZCJ;^ zSMCtJO@$}ULv6txdOsUw~ryJ~bRf|wt0DCtoU}(Yzo++D_Ok8c3D8|sSh;I79zR-_EFTO0? zKN)GGgI{0VpQk+fPV9OSFN)6QDV?STMD%#Hc_hk6^-Q^{r+ZM}nwLM68_{sXgAwm= z#9Om|W;scRjbhvIBHuSLMx1NwqAI&}Lv5DLJ$hs6YP~U}Z&brQO3YL2b-Ngc?ZGzU zKZfPswzW4mV+=B&rqSP>4Y5+h2$Tsk3ed_Bl1&?U35^uBjsdf2`Lw^msf;Yp*9>It zh-=X{sBW^$UFU8Dlrr&^No4y#bqMaR z#c?R-3+c`kt4qN8;b^-J@e*u`F?L}c5V%6 z=3`LmY4gYATEKiFKd7nMOGxXP6tBbu-LqmJCXwk;6n=Wu(roRH3|0u@Q7Y5GllT}V zoT{vwtToXKu4XqOM{L3qwr0~#WY(t&)@tzDhOpMM_tUOzY!c=u)AD5dM>9<9s6NA^ z25)KA<+Qi_nCN6PaatD#w+CI9X7EpqD1p!fijhJ*2<)-z5{6&HkXZWbNuM>PR&WoL8FPN*nqtz3@=hl9&;h=5|t#*oX0###%wml{1Ag|@F6PoB$W4n zwL0h6p1haaJ>o;_{Gv~_w{b7Tvl$JtQ+`_?r`ngDoPb*Rm=MyL?NX=o)9(K*YCtij zN>S<8#N9hJ$Uf5kwDG_jH>@=Xe}j}dzlH9h_lF|q$wgsHol6OeOTx_V4m#Eu8}&9W zHn)QwL_c#x>y5~zIvu1*yaZS#-h@ll{w#DNmiewy#RK@6X=8ewPSk1gF`Yk9*$M@j z4OlbCw87BhJnKT~q0|n=V3Ze>$3xs|@zfx%Jz6gX>eVO~L@h*HL-{azMsoj)tVs?o zDvBrYHA5;M!x|AWm;B^j`*mF!o$JHPWD}%nUoBz)eT7(Yq#YT6SQSkC1gnsp*j}kH zNbJM5#1E5y>=cpLfWR@UgaBNbdVW-mtKjQKELge?l13l`W!oM3oZ|HXyy2QwO)A-# zv$L`Zgv`TAh)3xSwc(pz%Tu9vO3%j(z%omS^g=t}5b=`#2NZ zV~W-k`T5~Mc{QXF=rM$@nZj8F#Gy>bwJ6wG>P&RRrjx*LO)am{yfs&9D7*a0%bqj+v%lAAD6A6mEpzPjo_s9nPJTj|%yN&3v14dam5mi@I3Pks=|r zDF;RO13sJUW@6mD@q#!F$V`AFPWnv&kbt$2B{G5$^S+$kvSQeYA+&yHyTw!QN4!0&Dv~&V21c;#+T6)&pD(^A42t`mf7t0#g9dho)QW-JaBp7du#fg zoG!LEc2C&^5tcxFslYS?GCLqF^Gq{#cHkuRlPL&H%ddttwdoo3-&%ZLM@#SzBFWr; zizQE#7FJ}6Llr_4PiW3&=+T1#9&5OTe!hzW!qo-EUBMx_zDw@;LNWqVw%=NjD@gEN=Nk3qwOiJrDNkrkm->w# zbhKFvDNIsBshI}8T1IRcd&INyMp*`Za8;w{N@e?`gZR98>YmI3v7A)@PPjEOxU%O| z-4fH_>657*!=D>vH;SZ#y0V2WUAHjiLv6W*vF5h|O`iR8@22R{EU=hfRFN73!fM!_ zTTrk2;ij~cI}C1;S9{@I z5&FQaw1uouvs%;zE6-!?6->6x9aJuEL&<>Ry1lTchV5wus;E_W%L282btTI--k;ni zBQc13`dcZnXEk=3d^$;N=ppUG>74q=x-+-OhJR zMi*an=oF*UgfU6c?%B?82_La}WS8@B<5hw9^4i5XarN?2r`3$~pNqN<#wuaTu${l~8 z);Tc6OQEYzahuPw>MPJM5k9T>jZ#fR8M@)ogI|U6ir#VB(3I;`8|m5=!Bf9Ykm}I`tF+~c8kp2WyLynWGZMSG*EC%heBnv2bUlONvc-W zq#c*T%1oqq1$BMr$V~~Puk-dMgiekwzoJoCTKoCUUBCI0NLNXt^8v1abGh@Y;jYv9 zrhm4pu*cQn@|e4OJy1qKqbIHYcfX6~-0OdcpCp}KxTzH;1Fx7#}nYvY(rN`uF?Kr=A(0AzL#g8u}Cgb(63|=$G8^xX`LC%qHO4nN_%Q>Ksji zvZ0zMUsRI)qunLjY&X`*(}strCQz)&*?uhOHk_eviGb~qScYf5LeBB!@0>2nmiQ~t z7LGv!jU+49egA8zJP3xPfxeT6DTtvZ2?p6Hhd@!~#%x5t{y_s#2HXYxiF~@Q1)M3x z-8pSZh>1f~Q=BBfd2I;k-s!5bP39-Zv$9NDDd7J5I3d|F(GOUsYnbj2f(J=oYWWsq zo8_&~%ePgXsj`@1(jVgw&ev<)B*BFI!*>U`_RoX1?I@}@%<=GKTbbumKx=i=lREl1 zu9%oEk%HCT%bMqH+8uvHJPHh0jKGqV4RlRXWn?MtpwS2#-(BXf*688e4RZ=U<|)P{ z^bQ{!LPmha;6j~E)CjgBq4zCOjYL~?a~^_7w{D_Cb1ch4XFXphP3@7pY(G>|0-4j; z^)Z+24K~U{XJ+LpXrx7dnx#lBVCJ-)`7PalZaH@#kMGCrxk%0V(`$v3o5flOP3e%A zP`CF}Z?av6X)pJQQ!%QO5ed8qymbDUJM85bd5Z2+6#4rJpigxs9mXHb*`pB;z~M@U zuBoif~?saw@X-bjH@ueBXc}UQa)g=ogM(x z*0dTIXy18i4_}7U+tq&d**unv595t7Fu(E+*{SJjq{ObJF$4cO@}p>eo89tJVJ=#U zF$7c@)5PmIDM;&GKH91IDC2q6(=?LGc4Yy?Ypu7nL(u_s3@tg$`w;koc4R|yp|MihkS%z9dS*ko>8p)$t=})&%XtV+|F6l5D zO&2&xAxWANc-qGXnKD`>OzvXO`FdX3`QT-PuhA*GEP$2Zo;iANTU?a`9DQOm{|4@b z&$D*lVpCgnykgRK+Q}M<1$Kkly#A)H{^b7Ep{B{VP9&AV3f3Zy`I*(iAbQ2pdR_^xcn|7!cpCCK@2xTHs5x8))%zPXdLcsH+#~eXL?+C#j zZ``T;oxrt_=T7Vm|Ht$Y76Sw@>7DwxBF#Xr7Ot%}s?yn|?#C;?ir zHE&hZjD?1-0I8sgXXqP_w2mlm(dFbRC%h={R6?^`NXfL076+5pY|E9*CfWg9&*E#kvxs4POZKZyN$;s;LdU-IAA9oqP+)F99bF+$ zch%fDBNUhUI5qQl9LkkWTJVIu|F(HRVkLly^+2^<=T_HtcWMu~_u;8R6e8igWX)C8 zCDGE}_m`qEat>hNidK#FsEQLT=I>?=mX2?>dVIX8GeCN*HeYweb~btCG!jZUqwJY`&ir zBA@#x!%DRwn96+o6(DVBM)qnRF35Gv&kfE9#-b%e)dE^}i68!dG_@xyQ&N9ZHhAd|Whx1QI7w+W6b zsUFt6@*fEV*y|bYzESP(j3@`4k5-)TBz_E`#6E`uMYXV&7qHpvZfqMS)LtXv&?lC> zqEWMeS;V9(?{;X*_U5lgg>v}OiPo@hzW^~X=5HzdpqSGQPC;c3sdON#L!%20NiM2| zU5|A`xlcZWaUsr`75zmB4jsLHJ-r1Fz*9q#1JN}2Dd#9f`aA(UN8xBD%H)gIa9GUi zTSJ#5cSvug-X$os1WK*cyq|csI_6eB-vaGWqVyMXqkxxZ}FIGByMdpuRF{8I5)zMdW4btIgH&Xq3n_Ws$DC)t!%KZc0@ z${Ageq!n26!GM6^Z$O3}*V1+at}*7CDNHnUm>)wsWN98QdssloiZkL3 zGW%^CQiQ)FIB&>z8NS^yb?!ErCyk09MC}+1dx8OfPdRrX4lE%IkDKZKH+NyUZk#4^ zlxL53dtJMST%|T%Lf-Jiv1=n5N1zaYJo(p+Fsxoqrv^>InDl2JP?pPE9F5%ErIc*f zdS&{3wD-fqmLp-;829CmR_xcV7`-By`K?%QjJxFA(x8c@O^02B3f{$Ne&4}u=!8ym zNx;O!<9N3UuV2V3emu>oul{*CESS#>l$Zhgs*VRrav%R_uF^g(M;6zBlJ0I6A3f{F zqh!1;_o@>p88ajPbYWj^PT614Q*m?u9DABN4AnGUS`;Dr(CkRr<@Cx3W~p>##Fx@m zYw^NOWPWG1v&c-y=R^69WW#H>;j+KQZG)mOhM~8u)j1el{fhA$rrmEFBP;pw&lI;2 zsyX7y@h@wX3DgHUa|hBmCE;=7pJJ%U#3c1KC~Cs4-jN%)NzMfWiB|2oklS0fS`Ejo z^a!ApjKO&TV*b=OS1XS|y`;^@V)kU57e{zG$s*8=-{CaR@CoyB>&`E}#|4K59UQ2u z{9o-T8ln~+~{_1J&DutJ)@O7YtjCgRe% zwM+1X>{kZyhhzR&3Kt^Z$X4n!ZJ3ZV9VIv#a$PPCoK2k10t1Ofb_vH|!*1ieqY7Kv5Kcg*Jnra~lZQ=sJE7#lq3TgI(_x-`9f6q}Lsb zGZdR*7}$t&rZ8W+P5EVJ3DcRtq7%J7^VTx|9ov31GA(Cy@)p->PhQgy3W;oqh}y*n zZfwuAYb)hVJ=q@E%C64^Q<0Fv^W+~jm$zT-70uW8xMEMXyqA`~_YxtO1$^ccvX~fc zQr*gH#Cy^ICw)xTtQrzu#`>~cJ8$XcyQ_9%Ud&T+pXewU#@6K2?-$ZY53;nR9R7Qb zq49gjjEB`9)YvqqeEMNW&NsaV^;+P*sfjWk^MHWq=Q@5}1r!F>A~3#iEV@WuQY9rq z^I5S24CE*jEz_J42(01aDjK+QHbvgJopek6UyC)|CEm)arryCJ@2#h27y;&f^q2ZO z3j@2gJzaksTz5{_xjKu1UBU4RpYpD9?kO0k4cNoy9{isbd=PgAEi`(_GB~3a$Jv|- zNj?^GXL#WrBZWu?sVg(XA*-dx*V>*?!=qM%+>|>AiM#|sOWp=sGor8sDK9q_`IWwk zMg=2$aF1D{hd?StYM$;_SBItlw zooE7oTp4chJ$(MB=UWb`8X4T$5{WT04Fx)|TA6~LZA&~Vt*1*)C8K`mp26w%S^FIY7A#i%QZf4=Yv#C-$)bFgRa<~9{4E0T#q1zLzrwDiLr zn>a?Y9(cF@O2@Y$YHuzCq)=AdBj9m{;*-V#KEnfT2|!?!aeypwCCCqDA{}!Qm?M{3 zGWLbctZ7LVE@H0q@dMQk4i69p;&b?0w&zm(Mg5`N3N_ncEP&ZRonD0(Jt)xAW{!VM z^`>AWuLy@E52-(O7oSoYNPIyNN@w#J;Qoj0H@TS8R_ParwY_NZe%ipwLm%M-!_8B4 zooNY2A{0CN{p5d}fAZhPXYE5ZdWE!#yVQCw;Xfxy=#zDzQpnyJIUM!L&e$DSR|H%VWh$?~tW+aBr9V5Kr3Aw)MvT@u zSyUbMp-&+_h;|Wjk*_mt@?7wJC_IFVHLYfC!YQOvIolpj-N!tua%gM0x93`~I1&Wm zr_}$HkL588H(#gQ6#RR<{)fwr{8M9ZzKG`hSr%z$0?d=%&Jk8+U{%QQz3AQ@x^w3r zo8+ObXK{&{J*TWG(PXKCqDKkMkM zyP(+a(>ncyv})Q@M5StO6? o?BHT-q{{?g0suIe7y--xMn-m^_bE^ypmk7?|6j~_KM>IW0P|zg-T(jq diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7622/ePAeLNA/MT7622_EEPROM.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7622/ePAeLNA/MT7622_EEPROM.bin deleted file mode 100644 index fefe17b48d01c609c185bc73123cc84260daf953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmY!?V`5<7aaK!UARf2?wSa&Cg9eavVPFCCAVdNK!)AwVS{FosTum?uVXp$SkrYye zc?<*?7>+RF+}wKbU{h;rYZE?O+JKS^7#P~S@hL)*<7QysMBIDn J5TI)a007);7|s9y diff --git a/package/kernel/mt-drivers/mt7615d/src/bin/mt7622/iPAiLNA/MT7622_EEPROM.bin b/package/kernel/mt-drivers/mt7615d/src/bin/mt7622/iPAiLNA/MT7622_EEPROM.bin deleted file mode 100644 index 783b6867447f062e5b2fe80e9801a67ab0dc58ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmY!?V`5<7aaK!UARf3dFerdj3xFvX1{Nf(K#9!`+YTRA1By8wL68TIg4oms$BrF7 zeCQy1ojWsk_<4aL@dt8;ABv^~{wS((yo}?-7!nq>Xjb^6%{0@}%64l# zBbUOWLd0P#w9#;&GO~@>cHi!M2XzaoEor-jTNqhy#CPt7SevFYpXa#)YQ5i&@8k2w z_XCf)_uTXQ$LqX)pEE6YT5fLsw7lGDGq26dT@qDLRC3Ex(o+&4M5@{r#@|K+U2_N- zc!ei3s(7;hAR&*H8A;U@BI#~7lj6T2rFP-h)x(lOq-)dysZd6nQK; ziu6v4B43P-B4_T8A{}xRshf+k$XB*DimX7oG%+$SADIiwu*?HZXMx?1BFDa=B4{34vLJCnQ7m<)rjYYn1*!PY%5c=|1=ZQg9 zsu87X$#-Y$Q?L8c#T_7uja-5D3Hs|~?U&_IYDGA3&~;Pzqtjk0pXQXj8veBRG}nBv zxjND(^e?71-A8;i?Y~xX$5~v2q!-B~Veu)F(QkB>kc59M(#&{I|5)5s@Q+f>tP*WD zev|M^Qk_K!il7=ai~7kh8U*46EN(u+!-)>`U)ABSmC!$pmqnkM!|~ z<507VePC^qt5>ud+zB$lSCT>mq0JD1Pr%?OB^#+wPfKfPxYSF+)U3)bnPhs-9r~%% zKw?5>YNC^9A-xB%xS%AS3IVS>MJl(-bXs5&p3?&rc+Lo@c+Lz|;(2x82|TX}Jc(z% zfYrAWdhN+65eU9+O<;dLwXeDQ@Ag@fKBT5nO2hSsdot{)lRl!R9vi&@?Pa5_Hxcu9 z7K8W4?2VGx0Y1f7?Q#aB(p<_boH$0|#jytgdnJ^?Ua3rl1AsGbE`5G{LAe|w=_G%=7H@)|Nb27=SB4tkP+^>!m+&R3^l1Tdhh`oXX!Gcp#T1Nu*aox zK_c6oQb@GojgtC4M)}O9ACz+0;v@C@u$N*SLemfSJFfowVG~l$(g~>Ri5zRw*+|{^ zdiPRUbvG^OE?2oCNx43!^xII^HE5Nsn$XGtw&gZXjnY?JYAev+Tw8(XT>68^Wh;}s zLTiC4I&Fm_OLf|c@b;X`nuAo4tvphr04e-%Sv?oNWxb9PZ34z5vt6mfiQFc)%1)`q z(k8zbixeB?5h+fo12OFV0p2;nNlQl*D;FpzlLDlQNoSWCLa)pEp4hW}sA6G&NznL4Tz``d{ljq!{OT45b8FeJ+{ivbh zFZ-cxLLKj@JnA?Mj5=7fRgP&mzf&r^}w>B~J6)I-v8BC4Up<-|C^g(P7);ZE_&O9F7PC=o6t ziEzi>J8^D+PZWsprUT>(!Nqb62-|J+3x6+iAxBCga#fr-$In152LHiCyjfVaHT;8x z**H!a=s1_$%d6!ca%HU}=ENtSa~lH1TgiB=^IDRSGh=r{j~zCGcpQmb1Q0_(*YR#?VYI8sEQcz zy%$$GAp&F1E%u!A{97d_#{oWdI;z9z7xr04|KuYB74!i8>X_k#z@UJu>WreCTLx^} zM8%bB_`T=c)z1h2++?y-KbuD!Xb(yTNIDOnk>d<`Byby@mnB zsffXc6z2w>Z(YV}CR-_K za#&xaX6|dsC4Wav!RrRp;BQY=9x{|IBV5yL{mqj(RMbNvzm*zE1+}+iDVEGCwPz~IiInJjc43uUnonBX}yj)m5Pg19urG$ zB{6Rq-M$9~5SLI^_gq*}GkNqt1uH*?CbE#sLP;#7u#gocRXeLAnT1MO=n59Xtj?jM zSZFZ|rLd6RlhG`s_hbwUq19w^U#pi)r?QjZU~!ViEC&rvqW8;&9ON<4?U&D%)m6!@ z_ukMUpLG@th;5r&A1j$l#P7Y%g7acq!)dPV;2(@_TmI7%-u}lvY*1iW$G7 zMkN6&Py+b6Srxul(SNyQCK;#P+$bnFm5Z#8-o>oX%FQ)`@heJNxj(7aTZz%SoQm!$ z`Rt(J-XNcK=gViUnZ%O(HI1@zG}@gapFM3Tld5vtmUy{VP7RfjY|_T4q6>kgwh#iv|*)b7b7Pa;I2xy%MZqvH`&DK6ocxZ7g>9DlAUAdGfNq`us zN@$yKiO&T+_})iVGU%uzt`gdd@RmW&zVT@2Jzg8%*LeavTpQbW z@I(wKz8$;${QX{F;PdxC>?R!1qNy3N`nUdEg;>QNe>9|WCu1W0ygqy$e6{D?*zan| zNdaHj?RwnzjCVo&-v*F363=MAT2PcgL}dwyQF+i{n-=5FmJ}h6xD^7ZCozJRBW`Ux zsP<7%RRuIRrL{nro?=v%i9%aD!nP{VSEL`(FuN#As9Raa(g|-Zr|t-49PU^6EO`2} zf5z{xstjBe4*$h-E^`TG^e|l|%}=#)&6eh9&$*1hjr6{jMEb85sO7+UKbE9Xb4!Qk zT*Lk3Drzp}2n|gG|Ies(W~=O8JUi@^0IhPVjl_el-;Dj0w?b5;I$lXog*MrB*Fd(-~--{EYYs_!-zds0El2hv(c2{g9*5K=0VM2j9K47vBc`yAa>q zRPIP5H&H{aTEcHUZdCaH`$wJJ;eLft$ku|@-12z7?iBpTz)6QWC9#Gp74(*p<+oC#ud={l;E z3e=!HI8IQO#jsT>cG_a1ovIYAtfPoS?s`QXCo-5+)&&H#$I}VeKjEJ|1bxD83I9~h z_)o|BrXNQ33WI-7_{<9Y*5mhyTOti*(x!d(v`M4Db&q!w&_E)V={)#mmFuyA?_)f0 znNvE$c;GU??U4d-b^SODhO7TFuDA4<7m zQI;v9s}$fMABB{nh_xvt^2SpRaL&FOwkmyh^&3Ni98c=*k?db0|9}Idh49>ZJ8<3jrk#h{()oDQ*-!I_6@T zce49u!Vh zvT+QmNHLyz0{tR`m2PQm`Jn04lSmN;pFoQFR24=g3_j_W_5}vTQ=5?@4pt$>a_Xrv zn?)Sl?3M<42cu3sjg*+dr;rkTsv5nH8GPEEkY^i=IrR)uq`~UJ*oqKZkp`a`n0g(pV6k0hLJrG5g zw*gD5uEE%Wn1vr2tz~taQ_9voGp&cVWBu=p=dJC+HoYR`%opaJ2 zp&zYETS36vyg9I``Kdrf^V0#fxjJBMj%9P_NX>d%C5~B{#4$fJ#$Vw-)aqvsC^v`1V4<=M zcz&5xQ1SwzYZD}ct$_Pda44l@48t2rUW1@G%SBKwXmXS}lAuhh7OV=LXU!!y3LNn` zNlbLdd9(*)(iB?^CW2svt?^lNfRvAs;bK74|G@8rIE~ zcN$bq8`pF|-CciPZ3haUGj6QnY#8GzA>Vy$sNVMvvwtCx!(q^pbj|2*C$@07VJX(4 zovlSgmuHXlSdc%Z+o)zcVqdL;&aAoH#6pn6QktD?-q_Daw#!ZBz8YWQvEBWmzdM-X zFKj6b$_-qL%+ez~f@<@Tx@yO)mjjOZuP_dwZ-f(wq~|2JzUL#@-I8P0E7URn$r35JMla7d_=YVtcAB0pC-j8crCi&f2K95 z>C_Zy?P8C1XeFpI*gs#_6~F7Ae&;5hWV>XN<%~dJZn{ zf63W*;6%)ezpvkSsg6i)EqVuH|8HuD=!zoq#d-mKXW?bDHH$&fs+&jVY-0{ld{H0X{l-#T&#l-oFI-fqi!>OC~H6L@?I*z0~_Ks19Ls>J>2`V=X%_FI+BYj5ycy%`T zj2qamXJ>0c@bLR%d4-JQW%7jj>m9a+T4#F9I*cLFw`H%YOw0| z`0IRI5@k}g_!O0)CH6Vyznz_*9*Z_mzN(>^wHIlNyCu>VcZ+I+m0`7(S^bC4GlE_3 z8-le5lK2ubE@$q_Rz8@@_a**A_puj z-WEm28(c%XS^*rN>GL!k@qg|c4Zcwp)=|D^r@uqVQ%Cu>_!FI+x{l#B(D#$}*o9f8 zn1aws`{S!Qrd?6xfr=6Xy{=>{T|D4jaFE_p@)8wKZPIRSH3KSykh683y0pj^62M`Z zg=E6rhS^&zQLb}l;8AF4IdH>yyn&9TRfz(Hq&5ebLR?4dr2RYuhF`Sr5Ia

k`hZBICp~dB2F{uI~1 zl}O&@1Dj5HOV)Xpm(+QeFZhsKUb2TtCqIRadvTFX35x>V4;t>H_tY#C4Pd7CnAx zzpG0@SvX%!Q9>vhc7-Xx??uYAsVs?DCZL7*Ml1jpmOQs6hlK+^?@#;XdEsK-^#KY(5w zswE}FaIaFHaz%aXI|-~7tcn49nZvw=G|`^AaK4L>1wA%bIZ3n6Uud?^LTffvaLLoS zo=j>Q+4DY6D81cQYx7mB%aq*eYYrr~U(sheA*mA-S-8em_&jU{oxB#;m(_1*;DG;) znx)->(I8dheXdRevnH@HfyU+Q@A$}@m$qim+t-E%tIueKPIB+rR_b3hg5pc)T zh-L!s^F;R<7cl{f?ffTBz!~2m+hcD}=}5~luG-Ww&K_Gn&==pIl4E?~ZyixN#sNDYt}WTuoYtKQ>0)W zA@jNoDro^^U{&@r``yAE`jty!f_qPThoHtlYrF|~`|6IH1Jl$-h8*6~En8A6uf^bDPLU!hITNp2H@fAoFu zKIXE`sBnbWc*-+tW$^7z6H-m!)p(67d5#KHrYo4l7-lp@YMySNddp$#P*YF3W)40Y zd>eH$TTMpmgy0`h18tA?mGT+H-!7EcHr8lSc(!UIaYlUYtC^#*_a`-T{I!W0q?S)2 zTTr6*SOIWtdSVi(Jt;lmyo2xDWOrC)m0Kc-<9Ah>E*iOb}Tp&7gUfo^N1Ma zR2lRTdLGOpw7-mA_UvSE&VK4-ds_L{$T#519(1a&buH=3>9?q_cE$Bg>3>L#g3jn6 zO;lUDlApa^EjU(iVzstZbvd%=OTaDD>{qQm!*mHWfVCR1r>*``yS>2`?5MuqF>_v_ zs%XZhEZ;uKN#lbZj`{Nnx0mkNvYiK(`yp6?Qq6s?6UOQi*d*un7dWQ=;R{!;Ah#_A z-#e|jE7;LQUdZ^S@MW^X|T}Gkz67MZ%{bIaLoy7mLr+I1j>|5 z1KL#2OK$xcno2^9lPQ<9<1Q|PNtv5=_^_By7 zxttmPbxpEVK&GkLN0J)c!Kyx2zsZrc@>sACGCplEquzAHB(MBBNT37Q1j_bEj|?98 z^Bm*KSL^2ak#FTIBb<0GX{^{rNX0KOgkAZbW z$86^rj5t!W*Za6Vg$-<%V+XR7BWD>D0e%V?4FOChIi{kd+;|vp7;dQj+{C`~Iip3p zqQRrSeB^sAQQdt6{t7JDo|1;zZnJt9Yb{?!9zo9onbF5VUQFrWwHOt81dp|Ed}P-H zmdAGsDi0ao%G!nYqAmoSqZy#TC>fD8eT>5Oj_|w@`G?h)Gc~iq$HQ*90rOh{+&HV> z<#@bb-F~D0BgfRc{EpRk1%ln%qncLupKUpez7)P*UX-x$U+Qb!QP7M~%>OY*YUUjT9Q)Kqzf7+M!WLzC^^GgPR+r_VT}6hxX`^G2e|5jh z{|@W7yo3_}yG<#M$L|U_X5HoAKIeru{O`VCd*S!5r!;Wtir1TqxbT0EK#XJ71X71l z`=8HGsIct4dGCUj+gg5wwN9O24vOlo>g>Z<(+M{n`6;rdk$HoK-O>;3TKE`#Cp+Tc z4-wKa=0A44p}u_d9P5APZ}F?Y*v`}mW?zV=vpTy40yy}4a&>me0#bP7M^$c;d}4Ls z2NuUv^yWtYJnY5~Tb|SB=H(-Uss;T)imx!AGb0S`Wh(2n|Eb2>e7OQK3=UC0wCqi& zzoGpLy@ijBz7+Lk=p_ElXx&KNd-eRobr}3yBd95p>znO4*ms!Kuj^`kHJ!`?Y-%lc z=J_pc!x{)Wn;`W2LO z%(|mli`{dE)KQYS9sUixA z>-G#r!M#q8NfR6<^RTUjo0`Aht)wr12;g4%9=>X2jg;=}G5gzKJa zKrNy|tpqidWW#>Z$ZGq_k-GSB<3}Wmm=klU1wYv5kU#IKeQpVF>8Zne#_aJo9%-6K zYABJihy_0}=y6P4-0z6JLw+sswVJ(Muft?cNK1iAhD&ujrruc;>BZBz+d03}Uy1g= zZ<2#GN^Uj*-n$h&O=+nrGHmR}yz6=m=vQF3u&3UhADfI1^r{yJzb@J6F`A>b=li*Q+IcH)W#!owL-PIs~8yAqz1d(YSR(BHn+ODYijkr zBiCr)U2{p-%*6xyxPA$Bm3K`-T}%3fXZIb+)@;@Lx-wiPGC7j2CDolQN}v;g!Qla< zkgn8itB#D)#xb32SE}n)LXJq^TH>JZ* zCj&Gw6Z~!#sOkjl=ZWAGz>j0@VKY>uZqdgn<$huDfQc(UO%8#h^}F+-8DbLY7Aiu( zi0ZNB%*=ekbp@a$Q{_wZ=tic)s@qy>C9uK92#VC9>zB|ua6_wF6H3F*_3`(|z0wt}u1+nh({Yct@@L#VOKiFEU}grQn&U zCF7Z-CE{t-n8!u37K7&%ng!2MnhDPo&~%BUVP(?5f$nh^V*arPpczjHP6O6t!yAIF z;++m~^CU~V0<)0P&B7Bj21Uhsc%l~7m(p+837oxCP?y49_OOq@@?8wlVpqNF!t5NrcJYA3^(V7cJA7qd zLcgf)KCGyXhckdlug8kqcQ|v~%EOsRSGuQbTue&dk?2E=Do`} zIjc7QVhDXdO1dY)7cqwrdR2#*Gj(NcPVCC9{+b&2*T^!J10Hzn#SE7i2P;~NLZI2@ zh@efm6zh_hmlOE-?_DLIl5SnAYma^O6tojE*1zO4a+vW2NvyI?J_Gdh~_8qWQp)X%DZaSW=jpst|S0T%AU*^@4k=~FD zDwocnvrDZct?nqsnxMj(pn$qm35>QVBo~$s><^ytW+Qu&$>8?XTb`?Lcak&FA)`I^ zmTI5SF}m1FPB>zV18hx zrQ%A3_%LL6J=Rt7HFy9y<;!&Fw4N@_B;nF!T-X)=HQDy2W7eAW+uvk(O%Y_v-n_m0 z^co0>-I@X`2$cn$XRNeV5ax+i0W4ez{r$7l2oAFeF`IWR!1_2fOT;$GbTr_7WjYqr zty!l=2GD^V@C8%UWuQru+q1zPOxPK7jOhk4LFZfGv74o(LTh6HRT-_m(lttrhWsi3 zHzWdkQp8WuVt3q&_f*Ytn?g6K7WIB5p=OLCNn;sSud7qk6jAZY4A;dgRzcYN0JAcm z+wGD*CCz#8*Nb+Q^pMX$Ge0Ar32f(lIS$hL(|d9ow!m+ezLr~>$A#@z-STwZ=Z@4h z>#2GBc2D@ieS7m*Jr_Fm=Cb#YsX6Z*8SC^ko3{o}sq78cZS`+eH|{-bPrK!5Em5Cg z%3FxQ(mTg2Hh4;fOwAM7NJsTcb9?DwCYK)lK2<+3Qu_}DD9}UIUYZ*YV)DLJKpHMRCX*Y>nFWvUoy}epRtwJ z(eMEGwS40DtdH-E7YsCuVOi>6IMtrIXc4q|Hg(rg(ayj16~3=Wyr`Kk`>F!owrMFW z20E2TSRQE^btv%EVAcj&$7%uYJcoMHka8nho;TuApvw`kRZLt;zbd69T$vtRyYuQI zt74%ORktTR=WvHXf(3HNA0XZSrl@@5Ap8+0dcvnZ)k}hA>iX;Rj%Ow=_1a1UBn)mj zTkX9eM4nvuA)M8%gp>#ye=15wjgwS&k6q_Z(zFTSWU?EsEh-O*EDzINE6da|^&!A@ z_A}-$zbRT45_H-QeKg5*q)uGC{SA0q!navGglR> zUtxE`?&Fx>Ec=vFnV4%cVB?I*UkbUkMyU|_1`c}Og#228C|=R1*fM!|%kd>%%Drbq zF0ph5#v+lMib(h?2Wq65>O4nm)>^bYWdt`xU=@8^3JaYxMW$wG6Ml2#d`R#N9lQ6E zZaN}^0zbW3A5yqnv36X?RlovoF+TsuWP9o(jo{Lf;Y%F?cH4@z;zQ94&mkm*OfHgV zgirENyY!CLe#ffTPff%6h=V9VJ3pp zkA=4OMm3A+X;m4Dtil$z`Yn7vzfi2LV(qNrL~aAqQv*jtqt3a|N8aeP?vHlzdQWdc z+#b|-BOLVQx^>R=`=g1CyQ$~_@<8Vr`&5+cE6Sj&)Z=)rQ2X(`8|yQs!DCNbHAe5r zjZRXx4th9F;=RShK%`widM@;=4m?66@9Oqxj2q|_1ew$x5Mk$u{b&-Xd@cChEc>jo z|Df3=hK=6<`ZH)Ro1efnUq=7W@o3UzaW*!;_Nirmij?h1SNnjKYcU%V@VZc(&fPT( zA!0GlEmTM^B^s{wldC1%T0oIySZHk^eOZ2CM}ed%M%aF6u)!whr)UT=6mzO=3)48QW2 z%X0KfxeS8Ie_XagF1A8y;ClhwzsJ96mcT z4)kf;rFn$s85>KcmK~haX$;-~49B(HFjAh)i(W@$oiR81%uG~&IXA0DY7G5auP+UA z6Qh*}{y+-28x>)%sNT&is(+x$nAq%W9ZqV&-Ai=I>-u=KxI_-e0Q5Y%$ zNAORd5Gu6C-kqubrP~5t>ah-!XXwK@_V~LqHM=9WVjsk$IY4kuXv$sw-M$+C)^D8s zX2j&bhpk4g4^3*%X64}BH>wUALnRveKVVc(c<{03bL)g!0Wu+CV4=!nf6&Xf1na7Q>7(5k>==7?E^ytjJ~s6jK% zh746$FY#0u`ym>F40sLe!I!^+oo)`W#ngz^EHR$O|5)iv7uE?0B;G#%SN|lix=Cqt zDxEEGgjq>pO_SnjjvCXG3EyP+Y_V}g=q7NJDA-6y-Q~39NB_g3f9H{ovb+$n;@uf7 zPOb$Trf1MvN zwuU=K=Lp~SLvDbl;PrO~`Hq;JyT|u`Xi+)Oxy|!b8#E9CEK0Ccg6m-Xe07c$ryS~F zhyQ9b!=#UUF4*1y{SY83Ym)}A2l~HYtNC6DDcnoz+=1VJ*v%fE*8G} zm&-+-aPd9xSrsKAFxM$nTbk#Nz@4;#m z+q>Q+lbbx@S>WX{=KsPR?7<1Rtjs6D=ay?mgsNc28OJP4z3Vk|lj19H;u`q;f;w@B zL(GA>nXlYT|-Jlz%3(Z&klg>L6jw0DVQ+7@{nnC4XloQ63r>1I@NsS=V4xW>m*1 z6#=H{HmF~h)NBkFO{XT*DwYZ~+^_{!->f1VwfGK~J^=XOM6R<-#VquNW!Df@4eic{&H)R~aLxLf8%go%%k< z_?A)Ki@wAhzL}l8;1;5fI0w-3UQ0(yr{`QnOUD?p1~DAYh#GM6&Wb!`$YY{zq`ue@ zjj@>E?Qz(ZFokJl1v;T89eL(P>Or1oI6-G@VkyHAesFhvr`Vq8?oq1 z8g!RTJBxGutlsjA^^W*K{Exn`Rm*W&LO(r$+T9o1zNur`#kON=4xs-s(r>@m`s@yz z0nl5&_G0V3SkpAtex&tlFSgEfY-FQ87wf12=M-(I%Z0j3^ahM`bVtf?UHN)lOw0d^ zy7D7+P3%dB&Xpg|4Q(*?=!ot51D6&U9;f3(8jzASD!bzH|&cwreKMZ{$@0JBg zKi4F?v*W{ntC9Fjcq>ES*d~wc8Kz%!ufXYBXdYW9I3;Rnn}E@zGHr+o4GOe>*q=A_ zMX;^_4PxsAmB-HDBKdl3r2+~697oTJMsBFPaW><7d)mU^|KGL+>K|TkwsnFRKIW`` zcnF{;;9@WLwK-p3Ro~8N$v`h`+R4naoDWCSW9I&Na8SHZKw{Y~1FC`k+9gZ%o}oWp z4P6&Fn-Qv|QtNACrtRxpCe{VHR^uc)^!n zUSWYO#tRCK)pO)laFLN>oZCG^Zy$(IgUfhaXjq7H1RB^?Z6On+xhX1-{=GM{9uYVK zFZ>p4vQc_2^Tk|$xI{a37}+54j@9rn$i?VJ?fh})^hRY*+0L2U=hxr+S{dud9?Us< z^8B&Ne*U!-0VggSyV0vhsymoJ!qIPZFSg%CMm*9-Usc^Lj`{EuX!qOp9$>ZPJEJ+h z9zV)1yu1(1`|CrXJQOzqY#~X|@brSufE7{CeG8~fm_CUzv(=Zq?xS(K4(P>FD`Fu7 zefK9_<6U2LH;JMacEbI;F02FI;XjYaVocAzs;xdm2-D$z683^CxIG0j5}S1fk=d;r zJ9i1pe)+ehjnii^ctlWTNR)439^VAMhz|*{yTz}1(~;WpK_Ch`xcCDxfv0g^Zu5bB zNC$Di>hmCj->BsUEFtWF#6Uv>EI$vv(#POm%JgBnmW;?pqChnvajpuM+PInn2DI}g zbYE}16U+LHS$B|JIt4R<`M??Tp+D@0?&QDNiZUF|3-En>rF$aY@G%=*0S-F_lu)9N zwQ}y+VN#aIY-lk&ya{Moo(f!rGj{rEH|XkO+|#(>m=ZaBvXy72P_?xGy$07c=YLr` zk6HLweHTkx+OV(7j zZ(41-=Ge&mjQ-idutMa11San?$%dWtuBU$ZHrIE6ixsw)9GwiPy72cws)VvYDJJqu zU~d}wpgbV7D#2TVi3-kVDbOfEUzZ%T!V5AnsDU5-4dGz3vJqJ5Wc);-`t@$3-b)V~ zFDT$ena~ltN%0J2C&6DTw!9WNbXS@5Of_8!%f>Fmzcw;E5gg`NeOx8$$o!9%lo-e& z&(OpliGdUY25O+w991bmGR~<4bS|1IRghVNfh0@oNHM*E-b0_%>#LMdPIK}Gl8tfI zh7zHAb$i19nodK&L(!n*xonU8>v}o?;SAUtCSd*sLoty4ut)yBIs|;dH!`Xr;q6F0 zuBwU}l4LpyoNPEzrrAs{k5i=y_({y?5xu!SqMHXzjzwQ>%qwyP4>B8uQUfc21-0J~ zn?SE)^(6P)5Xp0a9(k3Q zG)g-fClztj*f_a}3)O?Z*Eo`oe{7$3`oC2h=Cl@boq%^?UlKb7tfsr<`rBN&|6T4< zt{hbV;u+$;ft~o(oa8q@2Nd(b3?|$tkroa*rp`MgC6MXRg}i`wG=5|8%b*jP6#PE3 z!bG*l2lkFAf7tAtI3!3@KqC(rB9V21Bp zeW&QC%&d=S*#9ZhkPa8+*guo?5Mbv*vJTm>(ZDnD!zq&rv3s%s zO*b-6eJ>D;*z9&1kMzs3iz48Ah5<6H_Ejg_=GW*+|nWx@{Q@gDd} z%t5{=$IM9zxfyY{PAY(=h4UuZaDpS>viwNUWY;D3*l*y|0x7Cd?JYm=(rOmHLg ziAx|~fkTjRC=b0=(95!5p;}RtsN5R#l0>vEhf0ELf-MouR3&sy!>v%+$6RPT&4ac* z*%*PVZfvAoPxfo=!BrTgj>l>QV89pmI@L|Uh7G~h{;dsL(TioGfu*ava3h4Er2EGx z=_zCP&S{}crk(^3Vf}=9GBlowmY~bESYtoafE4;gaP1;nN$LTu4i9-o;KILO*Kx|w zaZ1F=Y?qxGz%ltDIp^- z0!G>3xI6PPNh0I5>1_9OO#gY^^@VD|KPKt5Pk^oEcmK$^Sm$`X&arx(;6+epGV>42 zd`z!dCi77HG|aXe*lj#(0pYoL$H51u{9-=jLHY*7!?+$vXL%#^WtewA{}FiP5o|sZ z*L~BaIL343%zWXaoU9iY&50w=|X z-r8DfAbcnWoIM}1IB-S)7&)s|VUmMp1vmUMEDp2bIs3IDsYZ4)2y8OEJ?-|{2bj-| zfLn}QIM2TocA8pZMlC|<;yLK!gNy=0HZlMc3Zb#c0Uh+BdwXP@3lT5&yh<(CVi3PF z5>M~Fn6kMi^HL283E4`wDg?DiKP&%~S`LjXXP>%gHM|AlewOw$y%%+`6nOOXq%*2T zK&eU%95mRW)KZlru#Jv^tqXoxY&?QQaCZ=8C&&xn*L^sir5vvVoIc7{k>OmFpL+8`teBn(fcFl^Yve98#Se0<{PFoWC__@7yA*eTv@$K#nQlZ%2I zO7kj+u!O{^1+^=1heTAn0A2Ddc;xNsp4*bIO@NxTvV8c!1Z_EDE!k1|qE@IpvZxt9F4 z4&YvLnNB$OM1$vClA?1pBl^|vp{rAKW>)kwdhsN^Es^lbv%(k(>RgP&Iv5|1wc#;F z$@Qy8LxMu$e(?HwhGCiO$x`ZMvGgSx{(&2g%DtaM-o~}#si=>8_?9VK^i&-(+C--D~aRFGB2r8dm zmF*b{&IyfHN*hU4vz3*uAmix0(0ZHMXwV0bXXwoaScW)I`x@{78?5U{25Zd|eta_O z$fzVN1!tbDz%(jg#jL*enGqwrA6oy&8!HL>EFii+8E3up6vly|+!ok8etyr%g~RjV zEttIOI-IAvp6SFxuyf6L8W;}VYa{qD;zP%L@JSxIKjN8jaGn5*id%{wz)oZye|)F_ ze05`JETCHuI1aLz65U}fHPDz)6ygZ-i@G;1@@nScm?&T!Lx(|a2Pbs^Ef+(}Jal!I z7y9lQML5TnN%^|E+PQUGp2zusduO;Lp5Qi%nA(EYz&4A*;d&1x3D%;571Jno$EA;xZi z4_S%;E?XIqV<68?U7ZSk%SOyT@jWAawP(YIYxjifp9wLX`&f@00?k~tJxJATMe@h# z_&u7%M81PGg5Rrnc9P-t+3pRJU^UP!XnDJmB#T}%R!xA#4V>qqEZ{CcyfA|(ko~v# zjxZSG7>vQvuy6hU(*I=C!ul`mXF68h2hLhf(0_Js9;1K5^35btK_+{`zj1+|l@kqQ zp~_%#veiIxAkV-D=FC@-G7+2z@6Gd{-Z=tGm*RTvABofLHz!L2G<<6a`hh5Vz;oem zX0J@6JmKSSdCAYYmhFY}4}=mxVd9xo^5Z?Q_VC_^_3#qtS0sF`q2uUeSW0fEz3?Dd z!NW@q@8#;t@b!onthBZ>n(4NVzsT};8*#ssh26-cW-xj?KNL!ZjxWaZ(~qB}-$F^c zf%3Gf+t~OYD%qRA_fG?c@4ZO-QYDE78l@T}0XICsM#s%`j00a*6?`AIB!l1J-|9Cs z)cR{^)%>P@WySUQTv53*;hm^SBysry}?RYmT z$*|)Is)Dpmcu@YTT|{}Y-Nt7PS zp4H$jPk+O{1%hu?|9+c&i|pH{e}C0)EKLIaP9il*5^hkLjh1gh%TEo*Ru1Rh$ZF|a zf|jJta*Tnr|4J>?9?r=+-hM#WzO`FP37tZ$o7_j@;fHn|v(f8(B-}PBJW*hU7udaC z!+l1pMC_cU_u-m;qcf=_x-(z@DrH~g(Va8cmv=4uS`pou%f2>EVqf<~cTUm2n)?N3 z(uU~H?Bcu0WIdFjr>5#9M(MRA=ru=|Ch??m40z*t+Bnq(5AHdzg2^NkUhlBr!<$hi zli~F)lk4I2jMHB5dY8#;cyN1Q6TcC-su-&j4{2%V*Gj*kQh~kopt2{%T)dkI^>1j2 zxK$~>udLq$jRCVlb!*1q(3$*lFDGTf8O}hXLnbzQKbI)rkSTu0Lj91yAwl8xujk!~ zNi>>4SmJVGLd!a|p=C;i5!;N8m%j%``f*P33m=tWufjsyfHRTI_myWBM8tRDZ0v_> z@AF*CG{nr%MtLs0zc7>(@h$Acxm3OpSSUIOFUgkm0=$Gm#^AJ_1tGrW!5wFP8>so% zq!Y(c&&O!zqu`7e7IZ^137vx({5ZTt;Zurs$hwWt%2u3)_I2=G+*JU-2jw=LiB=vM zXVR&Pp$wli&4 z#yN$)EescZvSNi`}UR^?1mbi{M@Uyeq z3`qu=0)MJ(G9A!si?OhiQO-QoBH>##Iv!eCXlcvWR;PqSDke$b*x4Vbd$k{gEMz}8n`EE%fl@*6An@#cy(wJymGqRL~syh%|o!S z?6X!=)dtEL!{lL{n57Aah^f`osQMD%?*dO(tb?q|tt)&9su!Lb8_R4_Cn>afr}fQg7Mjl)9rYdWd+a0I8eO0Za=!ps8uwb` zoL}tQ4`4RTYOj{*cxbqdYcICJ^x(Z(Mot#mNj|!8=avQ!+F9tpx89DP6Fpc2&Iqlr z+&OcPE^=dXAvKy@^24wSv`hwmIyvHZ1%4um`E2}U8+2217A1W=^cN$1ecLC&-uTGe;Jp9 zQ_7IF48Ub37xzQ}SmYOaZ^vpH2+mY@9oF|c@Le9HrkNvr9n(*<98C|Ywyvw2PQ$Om z1f1~q*MHEig6|#+|BdCxxvQ5xo1pIgGR8608v{-nHgD|u1d@gjJm}RuUyg#lSggiv zGdMjR8-$OuH^yI6eQWTupfz}F(1)68FzO50FCg?1v)|C&Ki5|y{*RZ&r`vMR*VFnA zoB;1A9wg0u$MM|LcLScg)yAW-j@Y+KfH`jPgr|;$opYZfb=4Xj>UQHswA6)hD#6!% z>Pts)N5aB5@R=-i`OcZ>p#io&l=jyI4<8hE9%(s@lLhk^T0ra9FwMr=ydHQ-zg4pR ztY&-%=XVkMDVUF⁢tlF$?9k2Bi>ghiH*lEkUK-#M;Ig;Jun0EV%gfnl?J6I30JxYn_OxGr7NM^{pL_KN zc)5_;Oz1ELbuMJMJ%^2I@UQ`1Vm$LI319aMIORO&|Ld`z$9c{ld+pNtMPOFHYoMe{ zz&H|cmYezIe5)>jcB_)gz{+=dE=<`tQVYZ0OlOZhclTTHBqvEO!tOP=wH=;6lx%H? z_Hiz$mxrgEp@@czE*id|;lxGwJUC|36O zwc)%JAOxCaFTvTbUJk9rCWHvHne+S_Y7k&^d$yz5qQ&#iQNwcv1xAA7rV~-{{h#Xz zU-@>)@{Q+qTmXM%#C_ru5%YS9O1T?Cx^MpsZ8U3pvrH}Ej77EZ*$(8`S>2EP(Fko< za02S)49K7oc?GwJhMwU{>$otq`)=G*D}H#aHO=$WsqaVRW1Y7;U$S{EyAZiUIHzZreY%Vo!di6jceGH& zIh-?Zh0Jb47_smQ(7hDO)DpvmP>(GnmSX3JF7otD_Kxr_kv$CFZX#yKGR#Ga;Jrjh zpYi!?Dd{_Q0(`}p(INOqPiYB0gl9DLd$<)pcnxscr5>&i(%?hPf^g=6kOh*&hIZ3V z;O>uJ3$P@3OW=Qd?1(`cq1@~v{R9uxJ;P}a{Nn|W{q#V19=JMcNgu3of|V_{<8{e7tYkiprobPOyY2g#ENi13p{4IOpIfK=fZ*q zH8#Gn7wd@`9^Y8Zs0#1MDSREfjmpp;8D(J5Syz*Zo;7~O&JwY^egxJEVhmU}^oPy* zg14{&OsW|-QtuPJ!}UU+Kfer6Cq=lw$hy$4yo3Y*)-^QNGh|4lp^gkFZwl#T*b7#8 zF5LF#4wG)}y0CCBPQrqI>R;jTD4c!WJ^Xc{Yykd}FJ1h~gOv*R3yt_&19qxts682$ z&Syf#5(EE?XK3{8s^TJPiYvKf2K{x!);jt}328VrCG(2_Y0sz`MKbOYo9(%9x2WZ# zmL*PEjXq%XRpUOV3EGvusA7R6m&#OmF9BA-Nf>py=R!*ziA_l;Q+VwgKk=WSCrHG>n*EGiFwKXR`c%U|C?;k639{&k1qxv*+4R?LpJ zQfPKHFwZ1=Yj#Nm$z)c@F}YS|EnP>Zv0kmY+jGG)7ON7aQ{LoN+0+fn8&7}TlL<3iJtHr=Vc@N9K@>|*)f~A}B@vAE76X3>ljnKn_@2qF&R5UbFIjmh6+7Cg z4r^d*T55=dqoECoBX$fe$vUTgwXqwTsg=95B+)vC)hSRbE1CJ8cMpix`Q!ToW?$D{ zd+oK}^cGq5PFw<9GrHEZ-Hd37!i^-RXM{z$b#1FIoPg*?CsScRkOE?l*7 zulAp{7Y`o@%0tqngL9%9-WcXB#WO7pa-m&f`>Bm@f&JzGYF_vJNj^KEP5fWq+F(*c zy~UXAttWtcrLX1+w0_?G%}9sis@K3zD+3Wf#>m%_ye}&?pT`tfOWMz-oQp)hcsS)3 zBa;fpkD9QZ3EX|{XJ#){ zT~}~B?ct|=xm;BY$f~q?hix$-!ZuS8>V_2%f|XZ|867?Yo&I5Y~1;XpD!7 zvtXNy{>yhSu0^!p0u=h~c+(yylDxw@Yi~m9I=vYfli8gmy@2}bHEKe{YM;4jgzr)G zkU(nz*aCK+Nb@e=AU+#Mpo{Xrt zIA%m`{>#%)8v|-%hAogX2tscEMGO58>Wl;p;19;oe1sRyR9f1``%~6ur|oXB$kgg#U{9 zlB;1=RCA9i6kKje4{P_MV3r9~C?!<2i- zYSbc-0jb9ql)j$hRmZ^v35Gpl+GCSNj3iuxcgItQXg&1b8=*tRG|F(?`)2nM&4+>++X3cFUwrId%EV3x7WL?q}V{y81-{=5Wf(iGM6O zLuN%N9&dJDtZasjnX^l-E33;!8_g&LcgO*$%7L8uTx?q!tx_!O3m!EK=4a-!&0;0>+0umx0UWh4$9>w)BAWwr5_)!#UJU> z`9u{@6rmFU&%3t;tt}}gTz{WF8zfMVc_9bwbdNHYu17pJyuw&%q!Oujx;lz9XqJr* zs}$Ba61;}PyUyY%gi-Ezp+D|>5XhL_`Nix-^obYICnW6epplZ*8%%=fPa#4Ia`&N^ zE!c*R8rlo@tZB;Oi_(M&oW_qi+AkSXJh>#lL zF%%zcyy2Q>V8DZIsq+~j&|h^ug=1cuf$P>B48Q7WI*u*gMNdPdku=nfm7!W5qzZ=} z8%gh`+~Dfi`I=tJ?Ex-B_tA{NOQ|wEtyC**1ZpWa4%2I5LO-ie+JL6%8U@I<25ssoUBY_H?$ufdx9Df4=+xrn__#bWj+12;sMJf1MX9V- zFEx%cGqpW>ldKLx8((3ibXXUL9Y}RpmxLX#JFJL%Tn`Pl_y7LFaZ{*G$#ahON87kM z%7;>^1*}A+Z$#rtjiX+4H3Ow0OTf}#EZf`*G~Bb}VX*bm41SGm%2jAB7BNV+%7f^+NL-c7KB7LjX0OCqVf6|d?%1Rx_^~8V$=jz$D7|ncaDQKP~I5r z3Vhn9DY8>y$OlMT$RsW3?O*ni>qtiod>TT0dj+v<55Ag7vEbWN{v&=FqQr5# zsO9yx@#3qox?;MLzWQ=v{|m!hw~p!zl-_y~c*)?kicD8h8}d2Ua`%F)XHy?hq#S*1 zgS7*Lc1`Tlkp3goRP^%efimqqWd$$gTlt(y=(4d-;C($;&MdE#&{oxC5%H}!i-^B9 zR@{thHsSX<{8eA=yLVka6x}^Oy2eb?uYW$)d{tf+>8%_1dqXoLrYv@_2g2Z457&le zEvOsS02GGvy6IE$Z1VNqq0RQ%CAB~8GkH#c@AO&d_L1c?z?b;5l>t!?ofU7nYl?OC zYn^pXfHfMWNp#;n6SQlfnCiy6{4sMV&vh>3Oz>;aSApGe(iQmW2FikTr>H=5uwHpW z_AQ98!e0%a@C=|o;lJQD2aK>Byol@$#QZV~IaW!TV~W<-FW$9Kk?Z%ugVkrqJ6o$= z{-m2|1YXZ!&j$kQy53AR<}ewWqgheZ^Gn?HRnobysZ2;g@jyt9%?Pn)5gQ2|z?;Agg?dSK z87_anWtqL__H8tfPK0%}I_7Of+cs(x@gL~&N1s+2Vav)GUux#)`%SO`(&aGRg>@&Y zhm(KWv%AP3des zZb94qK&yCxdk2VyqIG-+`b{lX7s?|vEL!Dqma$X@o0c8S9KmZUxDVG{!C~W?Z=Gac zgP|620yDKolY|ypui0JxH&rb$YeA`8bKyu&?~=NVMk5zo{*Z5WB0H<}PBlt@3!t-z zJE!zcO}`th7tm564X&(R6dXG~8T~E3G!Ky`*t{n~eDK8jUjXYc9n)n6-Y$T=+~eIk zCCy20o0Hj?8!PlNW2G~XtCP{{`8Ae(CvIIK%mCzFul;8#Boi=f4|xcrsNHts`z zGHiH>V|^mmaLVIde;8S?a&@KmvMfj;9#h2(nI+s*_l6wpS?WknDE54@CFzXVYVeHo z9G_$_x$K#Yj2Bl$;~6mbZ_2N7$wdmdewKdy{7V~NiYelV;x7FfIKm8k&DfY(JQ20J zJyCs=zpP%X*BjEcYEtK{oJ!lU}iGO!aJs)scl@^C zKJjU#rHnh7xXTgCQ(0du&=WOj{^nmjx%&s^#jzV%y!cRKe_|MiWWWez$v$MnMtz3( zb4%tRV6blU+~J#8fv>;*MtE_UZZnXNFZ!zjNkkOOYHk2|RufR_>8A0hcgO2%kxv190KUH!eKralgqW{6`zQpwgl16?B9t9R zM}XIEIB;;i_r8HQ{jq5PPzHxo{O?412$+xI*J=1!g|F$SM);#cH24@VSe30u;c=LE zYg1fi?>XNbKnC@k)+VfwGY@PD^KJl-5jJbBti4b#XM;f5ht1OD|m^5 zSq=p{CV$YB!O(^*&B@Rj!sv`b+|LEr?_@v+N-Xii&%v2~iR?rD`G0|rBJNM6BzKlV zzK%bY()DdW*zxDN_w&cPj|Fj1(5E1ytef2oGZ;`v|EYuq&>Qu-4jR0Xa3DhOHUo}t zftCr2Loh<~n3-=71hn_BO_&qs&Vk+W8}5q02)PcD{36Xa56lII|3_#Ti;<0pIclW{ zl+QP$uOGyGu}jmaoE(=wd5#?Kjce#bl4P9;5&>g+-R!1`1&X*UD{Af%k{NltjpDuw2XO{4JUv8ge8NwzhVHN^7dEAC)JU~b-NR~#AEl%YtsbC58cmwMSj578~G2k z{*!2hmdu#Xr|R5b=ojnmh7KFbGOm>))vL8&E1IvBCsi(BUQTSVyDoo_adkg~U*#fK z(Z3|v>%V|emreEkr8W%L=(HC6{(5{6@I_1;y$Zp;HV&RI|rj$Z}# z!@W`lGH@`asK=mRkOjO9)^NTW@__}`-}H}ZT&KX6epvUZJlJGb`oOQXO_A__D_z-y zoaZTjQBuiYh*Bt1E)2hj*ChXP9DY~y(T;X&Q=V>@2mF)a)9wR5S`9aWcdFy7skq`^ z8ZFd!sjdIMPyZe@CxZRE<4YT?=X`}#yTBfquMNQ4-Am7f{yZJt8!J41HDU&<6~{6k z&qfJ>z*H)y8QEr9EYLEG!7cP_Q}4ORe)Ma6fBrtk2s zu^|VN%KG`eXp5YzLGTLLdx%)=F6`i)wiKZ*zb~WqNz^7m+phUMUrZrs`|$+)_AInB zY5zF*0rL+!5KHxolLa94EFwH#A}~bTsQumzIkThHe8vkj2T9K%yoJ8q7FT5+v4O}2 zr5D)@LOz!}Tki)qyxn@udtUQas_hQ_8vJgrZj&1uC>qP8rE@VbQzXH+iFK@*BbL-%7^KMZL8|@ox zBsrWm>$7~0%fIPVmq)Yd8lRv#@a+C`12D&=BAbCcoxsHq*7z$^Yajh6%|Eu~B!vd^ z9N6|9k2>(>Q@=D>%SsiFc$_A&SlV)R{O397n$BRnSD9s=-9tj&{Fn*1E z3@a|3ZY`kEq%Ff!>=Sxw+iU_49LY$DVG*Piz=EsC zKE-udxtLQ>B+Sl==wCRBr82}lU~Q>jx2m*cMf59Ng`QlnzT{B#tpFT`KziQgma7qg zh>(%UXJ9jSTv9ELSZ^wFv#Ix7uVpeFgSKjd%ikx5u(xZEU`D_^pbZgIN;=L=Yn5W( zF7az&qQpbMI4HMbykp-GlTzaM?c4p!nenY5vSH;f4!bSYVP~nkUe+W>u{ZU_^BBE1 zH=2R8g&ba+hb-;O^ek7$zqbZG5nWt+crRp;3)5hyMU=S_7mmjpMPmNA^ z;es`GNcIAd63HNy!yDW-)aqNsCLE^O=K6Q^Hkb%ma$jSJV{lR`7#QhU*W+1rkde14 zHPft2_#%vSxT%RGDVykg8qRy*ffwPoxHbB1cKIZbT*@Gy%-dby3L2LO@uUIvyb_DM)v!uVk#~b)C9@coIt|?%S zVUe{%&xEv!T2G)+Lp-h)FbM5hti|mbro}*)_y<^TQ|YQ*k6^DPW<3*jrPF-J;;=0O ztr*EtSk#%BtzZ)l|BGW$b*dwUr)p;GEp^zF^skA!M()~Y?ZXH1K<%EGAv~7a;DZq2 z_@VE*W?F^N_LL^A&yL&8Lvi)D7ho4xzBVe|6pEM#e7Nje8V?u;vjl?`Y$_NBXLK74 z<0go)L;Or-9P=X3b=0f>*LM`s5&wEL_#H#j(3AIex5}ZX(9`~kD9GF`p~3bQ7W~il zWtf5QgdCoWZ*-@12=ct`n1AYdfZogHU;VRelPDIDbN(r(tt1{t^?GA`2J5}zdpQ_E z>Kwze@M4v#(7{BSs}IqrN!0Fd;7ZLggHn5Px+v2eaBM1md*UkTox8Aw$UwkPYqGv$ zI^*t?_7j~lj$yS_a36{Xq7FuW5CIL&Dm)B!l7-+i+>5_@{O#7RXR`3{JE39$+k3){ z|Mj0s_`my;D8;Q`XTx>rY>!pOed%mBejg^=A7w4<7%+;~@k>HiIEk|pUam^sad{Z*l zOie&kC69DyhxJ%kV?@DvJPDROt}CN^2^WE^;4sWvqo@p)@x(tX7TLlh2Tb@<^8L&QoR}!?FtfBU~Q3+DPm70!LPbrzH{- zqsxDHlJ`~U9U*W?pwy0E^!D(FUm(O~M;qRI6&(S`_D!yi-;jmKkd+%;Bgw%Qf(wDbh0)N9QorJbZz z5VHBXLzVHk2eU29QXzfy5}vr?0XHbcc;f|nCgA(1kpS z+x#mxpE-H14H+-GSFPY-9xg)&VU2nBIMw*QhMD!%*P!vHG%#Jq=>yI5w=c^w|2j4K zRCI&c-5(l5EX8!K8Sc?Z63=e~PZ`bN=9jb(+J+bI6+-`zA1>&_JTJfxC!RZ|`_GK@ zr4yDCw)PdotUvH}*%Nw7N)LMr|iu|-A`eGQcJK>VdXjOm_c`}Ec`F9^hlC(Q= z?2KXcO!4g-pqtEg$}EG9BRe~mY`QIW=;yO37S*RVNB8-yy4;2Ju?Q52xDqo%&v6XB z7>s9iTy|@zG3kgf#ELT6FLlm+Enxcl4tj1bc$naeCsZVh;a@eU<}gHJ;^#il7>2VC z9-x>Y;;P$x!0SCS_kr&VgVBR7ys_)@#|OG)Pf#|yE`K!r&&NI<+kK3%-9YE1dnIMi zj&^7qG3bH+#kaAjcTit>d7C;B9lW9mtbX;2!Ra<0_KdUh8c7|4zGrR9#Hf5+N%?3L z`iIl8z7`p^^DnQYh(6fVg@UGDTp+*GuICYZCLX}94DM{|-TIk|CagX@|MDuEBw?h3 zrwR2KJ?R5waDk!ZC?DUP(gZZ%?sn1#lt}!)6hyFg;jl<2bVG97m%3r4@)kdH9Fais z=Oq>q<0W*Gk_Hi6NG2vA65~XKWT`iE^~*<#^`}{df&&i?US8IgS0+nttT!Ngy(R@( zQ0+gxe1#2s=YiJT2zn&6CNP&ZX$1W0NTxN5MZR!~w_RCXkE87*sL0-FHRBApkzkLsIg~J;6;rsY5NckDUOPPbP z-kl@=g76Hjcn9Cm)9oVobXN`@@$5U93+7+WeB!<$Cqo~b!Hbm|@1hg2(1CzH?5A#I z&UA5+TpGUA`--AG_jjd5UW|2kMX#{&{UPr@`(`_#aHhHZEB{NY4L|!h=Km0k`%sKs z%5bt2PU2C}PNGK1P*ll@&Y>ry9L9RJo3a~MGjFQ? zR;6xPK|dF+Ym?dyuxci@2@OU0!`OF)b`Ex9_Knw(AH%+O2uI2L(Q-jBH1b|x==*}o zW5=1m?_KS=uoR^82x$P*BA0c`v@rQrq4j*AC+;^h8(Sy_>g>Xg5`#uKe6% z(4RimEpJcPBHAt4hZnL20q;pIJ<2V&38KtaL8=Dc`zN>IZLtm}S_^(9c*pS#sm<8N zt~O(p!8T*%dac%6(`M1ZHuFqHDYfmZ%MS8s?I9AfS&T=(s%L5oG5*M-+E$+z<$Em~ z4rQW;ZT(`197r>@n&ffIgtKK>XQ%9|dt3X;x2IvR)vi4T>Hg{(Q6Ap5L0(*Ll4r)5 zWD)!mVggpVtWK1NCH2~LT+Uv(^zAuq;qvfh>??Nen*t*f@ze;?3yIlFE>C07`6HGy zx2*klnqOFVE}dFI&bRz>9jfoHc17tC!>w^?ZA(1M|*yQ<3dqwWh&o~IEfU5GrBl7GQJ z9v*lR2)|B?qfM0k%mg;lsZdsC>b~1!l;PuML7&@(2a%a+LUgNKPC%5~%7zzs*+|S4 z8SPJ^{20VR;@Dl-u4VZJv)PmaiRHB^S|pCn#!-pgqx8qQX*f5hP01_gw`}~r{B+DC zFc3GjN#)tQIOg0qu`eP>Hg3d9f;QP$y)Fj(bgb&5Gi9wJchWwP&!MY_=gDeMCs3uI z$8T8$4VCH@UO53rBXM-t=b>AkqH8tNH_60whqGY0bopxzw5<|HAl0w$E2heO+E=!W zJ!jamv8ud&4@!+Z9}@RGH#+R|!_Jps%cNxEzo^|prL%CQKWZJK$mh$rOnFpoE41sS z+3?WDv0kDC6mpI$@XlU`b$%Ea3SuBn%fwWixf6QBqPWlA3zcWCeDz&3?q8uGHs4mN zMM4$A`1Dk`{3~`=33nkctgW#1ul1}k#ek;Z8$)6<^4A<;E!K~tf|`BvZM8^JLH#A38hf0 zw}rG@&Wk8JAJHF4%Yj#T9W&~!n@wlhkQMNb+-`i{dEUZ{#@I7`~-RzN7pz$FR6ZcB#~^s{OpFO~g0v4ZAFk-LECkI*B6VrRUANkjdqq zRKEurFIMqI6grgNfid@_7WmM&z#mti{{6tG>db+`YH>@HfoW;1hBA)?=~@y@6z`K2rmTB!f!`G}(AbVhp}uQ)cn;{01OMlVp3Q zrDFR2>!4Bj!}iGrWW>TZQU6mDkOO$~5H+;(x#T;Z&A|d0v^%fPp+MXS{nJ!0tgn00l4ohM9nm%(UXrXBtoPetr>xPY>!mY zee!S~+nk2^8?u0z3IrgR4Xq>are{B}5JH?d5`hoDfikno_Ml^AsaEgm{mAW_^C_|7 z&-oMX9u*J>1li}o^>Ohg?H8K-^074k(ggXyszNQKw^aX!;^7i*-F8FQv7Ixz zkLhy=^l-e@X;;Ut6&O!bp|@5vjiL+_Zdz`Ux0VBG;N+~xovWN4ud?lTA2v7 zVO*Vr5vi#?G4EG2^?=0+FQsp}3cIH{b6T6o&zYewBELI$KZg&R!}9zriMXnXT@SYB zSLeRau)YhPhP=zN(|QTB)iCt%Kwt}%0S3(P7AQ z#V(CGhzn&_b~BJwMQnIO3u0o?g|Xbyi1@XCB)2t9^NsNBtA-U*KjMtsD%L-O97%Y) zJ_|$EcZjkTncqHSe!rk+euw%-00$Eb&yT3x0PW6!HHcosncb%%^)oU0nIxPU0juW_ za5{^$o?9|0Zm8@!6^3izL!sld)@c#A7MPZ`t!K})T5twlB%BF!eBTs1xNpOoR`{%y z0klO{6rF2MLEky7Z`p%>XBy|!o8jlV;CsdQGy3#!Fvy(lwkLP4zxvw}mRZU65*5@q zB@Y|)| z1UA4kDh~gl>n_3Gjr!h=*jvykFYZ^OFsp=Kk&nGRR-Z|WuWlsPE+8sl#X(L!363(W z51j1GhCMUZRx0)N@NMu|5t08mYhtPDc{_8=oR9T-T34pRL!9NwtIgeS_BI?eipeb8 zGod=qdr=wd7`igG`b6ayo|C>Wsg7@(C9Lr3`2dXj12hx1Z`8MM^jN%0z#|tee+w>x zPY}62i~fl`NT4=PXC^l;%ZzD!bnu7?2RA(>+gF-pwvxCsj-eeGF}anh)k3AgBl)m$ zF4`dyHc$e!kp8T^T8qaJY!miI*BLH(a_Q-v=g>l|o}R47bw8zNqYfXVZ;!(7VXeO| zvB*z73Oxu?3FwFTvVm232f!Fu=7hy+A-Ux8Z?-r0hXt_)SB^lLWfyv}X zo-O_WaAtp|K5$eP91h=EN_?LVG)hkWBZzeaE`$7l9r zLlT5S%NCn-7Nj{JdrC8h%=s8OX;v|Z`Vu5vh_|@Wq%f@15X(ZfRE*25uw7}rHsG5& zUIT)BBK+c^KoJ;G8v*D_1CXdz%sZiZvK-+Zj`0<8Hni0|&BpIQ>lFY`0xXg4gB*%| zr^C*RJyFPa9yG0;_iqiU{+zzSsO(75lQ$|lGL%Lo8wnp~krs=7GIGC}+d7ZDtA(O1 znn(%*@z~-2$%-rS{E=cYaxyzQnmGqAy~!D;&za96KI8{l)xgG)1fub&w0MU#Jq7)| zDkxj8jY_IxNjpTGQ{XL7k8*+R$@MKNg2mP>eLuJVv}H_#xL>DeroXF^B%x0`vfDh{69Tb+fiOl&1I-HWz! zoE_gf=7NC!;dBfyFZT8%FF8qeX)=%6a-!r@xgbHuUn5_r{9md==X}8CTuWv#ON~`W<(Fa2|}ii52-+4U_Fc z_L>*CCl22Ix}nhZim3jWcSEyAr&e!I*lgcme=z|lFk9=lT{*X%x@fuU@~g|bby4`& zY$ffyrI7Q$*|9(rr@1<2=3;a_sk}hC#i=xk2G#w@#)6d;8kSpzKIB$R$WZjJ`58~u z+bYtn>QVe@CzNo-RyQ2{8AIzvz!!9fw4GHz3mcCSe5A>xIckQZM+G&tQp$^4bL{N5 zt)pRUB~YY|xCz0IdAn~7);u9Cr$6L=Up^C(|3*DRFM%H*LhI{`Qh`-qnOi7QmZ>uy zrX%VnZ#iMbZ~Yp~J0?hvtVRRogDkHzFIElrj;nJ*a~XFvo13mZ#j?>T>sDZ-;ZeM^ zh2mZ)bu_rh!2KWOpzG%Ba9yr_{pxwA6Ss6BsQ+#{4ZW6ntHcJ%83{&t*6PIn(QAR- z+@-)~9rzqT%N0uPGqr~+N-LkOjW{#AHL3b;4SA?_BMYqHR zFgapJxbH()EQadSnpl0pm+y$i`hj5Id+yCmRU~yQ$ST^PT5vM==hKI+&M;wZnk0&wS#Zz;edbIL;*e8IG9hGU|qBM%@$8 z#`#9V8%I$VO9N>q+)ey}5xy*n>NOC`eyM6aV>#C|kIT`ui)(Men!2%&gki`Td+TVV z_wQIO2Z*SWhng(j%)Es%EJRHL=Y^)&YaTy^S$1c`&I>!=z#2EV<{8wGM)S_SJ73>< zG4o+O+w66s9!tE=oloyng5K3D@qjf83|Qa(Ef~XI9$UDM1unRi7V_`|dHmbQHQW-8 z%((+m%9wZ+4s0(It>w&A=Rkd*B)r$hJ}tD(u=!WIcEhE1ft${pKKFIEe;yck7nlkI zYRr4l4Zfo$@5Q_sJc7Ti{q|nSuEljPla;db0bO64-i4_nzc1NC$mx1w{$=59F{cs8 z7;!y=p1bi7MiMf-xY-dY6=Pob81~FtpJk!9RHFwy@2Majpz8IsW(s=pz$&X)M)%d^ zsfcL@*OWZ2a}b`5I+p@XAWgQX{!NZg5-Rg5QY)ZE$<~_dko{)zh+CimR^`I?i;RkE za}e-cuL43?uCIpEB`Lew6tO`W{*Ii&8Ww1WXE5>sx6L;a>+p5#>W^j~rb<$A$y=HM z|KB|C9{2ve;2eQPndxTm1%x8Q6FHDFN9Gu}^a9^WGDjS(Ia5k0c>`LOwm)3i`mvr{ z>-!rN+l}p~FsP_}6%Q(%HzMmn7!uSBh(vvOc^PvsQJ5SSc#mPr9@E&KsJA{rI;_-f%*UyE=Ys1L8u#{=a~& zSg!Pe2fr_|02ahPp<)Gr$Tu=;Ga~JUoGCND=!;ll?|y|I1K9sX=)`ZLj1SdB-`@yN zQaRC+iynY^{U2>c)YKIS{m3_x>O4x}7M_dRxPwpl0PC<#dB8UkJT+U9&&ZT9K%F2a z>>FA0@_PoXVhuS0o8>iRCB_9k82QP8TX_rS__2i1{824fD2_oxQ~;4K_;QJN*=pd3 zZA?wr@fPVSS%do4juH|WJR>FeMU=JSLzOV8lbgbPcv|R}O}(+=3}jA%6&W=Nh^Qs| z#&n_&in%R_!nyCqtlo5uhdGB(R+L4;wuKYBgwuik#uyt$T&=jqif37Q34Xy*f_<9@ z^4nog2*H-63kwjeJH^4N{&#^JrnBxTc;XPOuluL^I~Yo!`bW%t;cMeL%r=3!cqj10 z>TmI26S#Txx1cwbo1%SVz+05g?DQtcGaO=Ti(Ypy=Au=;z<9j!2E;~n z?HgdWE4lg&y6v8t&E4})mz~@AO!qN(WgvHe5FVI0^O&P*xSBTjk-C-dQ^aHt_(sI{ zqBF%~V-iU-~$3bI^TgT{GYOnbt}OqmFQ$K>Xq|3d=6j1eK`LgIuEuF|5BAu zAax3OVWeurB!5NTEy)gI10&g?+hS_g6Lks@=$o93^$V7^e9EqWz4+ShH_!{hloDt& zW2W{8k8T?Atu!3Yx^LbDC41Lv_$|Yq0?y`<_`8WT<-mq6os-JFCHgET;R9=kZgaoyc-v%=e-AhJ3+_mzwJ8S^)1vf-QS|?SmUDZ zW7HQF8Ioln5YHWH-=dDUNeh`JZ;6}>dn03iB5azoh%ok^^ob(r3{Tj1bzF+)6d(6L z_7UY!1deIxxZ)^Xq1_0pahOtCU?`QLAt1A4-XNBNt7VFj4t@)(JK>0{BZpS+?WlEg z6QMV5%g6*1EU=D1E&qX~zJMa`L5-lR-%&pA{%Ku$W2Y_&T;l)D>^i2~0N?BH#Gwsw zX&bX-jZ0lbab%uG>&seJWIh3G0YeTC`0CytHSWEs3EWZ;FUp9bx2TD@5{T@>AJA14 zj|a+Gd>{QS{3+hjW>{_quZ-yG`0rHB8r;*u*?N{i{uI^Z9mdnJ-mGD{ji0-MAIDqh z-j*ozeHSz6*NQ5qYw^v;Vix*4*i1UMUHWrN(A8idAWbj>T*dDr2TCI3I}uS z9s;fTEgm)o5i>_|wQ^&@5WH;>T3u2agZ*;~Ff+)%830sGHsMLK`lc>&b$ow`^y&$> zxozq&uSoT|^t&1%N!$X9)Ck*FQsHgA@?3B?nxh$JH_D@RcXQ zyZEOky$xjP6?v|-V1&Qj;?sm3 zWn;x0%rj0$j0JgjJkrYCIr?$nO9=_nd2IaZSYWs&ke>_|Qb>cT5GJi^%!+vKJ!Boi z7bLF0ZvthEn1Q*Eps_TrA2dPK#eXFimBzYcML7;yQ4<)Zy9xb78HE8a-EphC zYutL_4@T_)Q2;94=qv&f1n7hy4nD}d3z_>fa>5R2R{edC5f(jl5o&1RX8NkbHd3Ba z>Y}dfgs!ps=5yU+x9ixyuIoOg_xp=g`Dv~~cQ#=TH#Up`>oit&o_xO9 z-e8i!U0cydg-?sch?Cih+VG=>T9;-3jp&PHj>3Q^atOf|Iw3bGjY1B zIho>xZ=D4!a5Nj}>X8SsTpe47NtlIE`%%F!AlyV>hHOP3jRL>EQo*4858z48{`VGQ z?yVa(H>qPBt+610s*c!H0lLC~PEmbk9fwT)`othiA{m3zQtYFKx;6$h9isJ za1bbQ*9c@;0AG9}x7tuQTpPD#6?oVjt=T*qmX#GfWQ3T)o@(gl5pf6M-=EqqIjnoI z;uCu25W-trdH??U`vcWg8;$FF)lLQvMQ_;h8MQHQw^)3 z+bw&mp&!)_vpjr)YDnGief@~xfvjAe;{orjEbtERlBIgwLUr3Ad0t0vwL>`o#$3IQ z+GqXSq_r-qst_v2RrITLVQ#{@lD|yL>RlI2c*pA1)gQtxuf~=2u({SFFBTRuA<&^c z4+Az1JnukL8<*$F1!-d5opPwIFWFG$G-z;)JwzjsNop2GPTgcxKy%4PX(VAa5fumn4s$-f=>p(uMV?%hOW%y1m^BERX|@C`@5yi+n>cvf+^WjF ztkKX=Z>v4vk#xqZD#XNVJc7d-o~l177AsP2pSuC9I4$~qG@g>XCdUykrSjkrk!Fu? zCW7s`Z)cVWdEUlx3+d5IFSwbkSS{;KvSPuQB_GYQ+vFvzmtx0=_AmXltK|qW__IoF z2F*H^OG=T;KlVIn4nbZd$O_dhr~?{-ok9dP1z4EA4QV@?Do#(kz#l(n^o7X9UdzTy z7;%}Wh;gfK#fehCDC$;xXq5lTfaI>{M`FL$W#3r08J64cdSxv>Fzx6;#V!t_AQe~gaezX zh#%b3Ad?pcu^DlH6na>X3y9)gehqeS2;^@)lS*??yKpU!CufbW>%o)2%IqIofRRHC zR|#NTx3Wl{gxvMMkS?(4SQJ~&*~(n$4qC;v4mz$oFZi@tss0l91@bBwDy-KLIl1G5 zwX~v+RBPX*Rf3etB7HKm3wdCs5ajKaaCv*0QQjUdTDNgT&gm|nOy}z5ZutWaSmXuJ zT>AWG;L|fPverU>vlnbDxrpz&vUZ=+f+vjK^(we;I}qcGadn*KI(7;25>e3k4#`qn zTTCb}#7n`32Q*)0?Ou%j*xK`MjGmO!7a5mQ5>OMcKe{O%tueOt0-`3O z=L<#Vh8!Jfw|sU%#y{TC^Upgj-Uj_)v;rRS5}=1By^paJN=Qd&TtjLzz;R#9#vU00 zyD$Ko?$@V62&Gk-2g{%@)rAo9l}0|mBcjc1u7KeztjP1rF#=iauDw{<$MoWP3g{SZE@54oTA(Ta@eZL{-|64o|J_VMZW25+{aqa?J2CTPGGQ55 zD;g5zuz}|w6OCl@2ykBYbFydJiSg>2#zs*CQ)nu%O`nJ2{4g*?nb0SZt?vbPgZHPe zFy&%*-$x%ksozH$O`8gD0BNGB^N=lLB7_o92P-oFI=|&}qoTTV5GC1CmD}zH4-GsY zteg$hA}*RRUkrPG#&M$}v?*?zW~vqn%Y!%q#lD>F8`J(|JCF^)Z;53q-MKnLc6gfr z@4z6GVTTvao@$u3NYCADA-S;SDe&Kk?4)FaUowRqM?8Eev*l;7Prxkl5&0N#^h02; za`MNr1BiFu-41sDhMYosuhT#(y_Gyxh|eF-%8DPwpM^c^eKsZJVY?+3&J59K0Harqy4 z6CAhM`=%q3%=bMH59~~mW3N0&&uJ^Y@}z=;amjdx{QfLTHDW6YTO{!U?RV+%NCVK_ z@PzDljQ()`<#r+aa1uLU$a;3(uzyFQo(206dlF0b_xN{+vJI^r@-bF)5}!aTS`LOI zhp^*~HMH+GVFgl)69VGc+I~t zvk9rnOso-Q$r>>)Lp$#_oj0wq7gl0DgyAbq7x8xTy6{AZ6=R!_F9sxj5^tGG`uwY< zTvnrz8~i4r@^sl+1VmnPTnYZ0MVNB!f^TK`!J$l~3>8RI(?FNo)RqbvT zN$Y)WegrnjC_1}8S?^8vvVqj2KJS%mLyPre@cX#J_tVO`b7@4t3p5M)NxFP}N(*E{IB%p?9pHnB%Cibq#81P36fNQx&whYdY3$ke@jp@vIXeVs zwQmtWy&xoD)EW`1PEfjH_D}K0`3gsIQYzvmXDNaT4^%%`MNu1nhXwPETP7(nVY7<- zdmh;o0fQ)$EFNgNKuQ!5$9c;rZ<(NM{}R3<-3~(DioBi0dN1?-)&B-}bPBD2@{_w0 z%kdPS%U8HQ$kOh~ZGx?E|9|^4CZ>l7wvL3ts zg$T_IbpT!01l?4BUSwv>7j2p17e9dGI=sbp&Q!Zh33DLQ30`JB+K6ms5m&@~@q>r8 z2M{A8KEtdx8Jj_GP4AW?1I1lZ=j@B+WckX41%AH^b+GHgN?SE%~$9 zE5JGKg)j4WpfxU6W2{vPh{GB^tXixRvU)$);yt3&d|~wFV^ygMnuuSaN`UvycqSA) z!&Ts4P?7Bu%0t1Kl7LKz#O4%4K%c@4m0C!g8KKZk!TG~d(bA)<1uOm|zX)b1v?k#s$I7a@0VT-gl#E)x^hAOp3ElS-{(=+y#bFBv8C@s*@rz*6Hr-Z!QsaN~vbnMv( z#3ULwsBibyXW9Zb@Kgdc=#EX7k*^vH8!Nn#=4nW^6Bv__YL;eu1#AP_ZnnorLOj=b zRCn}n+uk3g-+2mmWWvwRZ3%rZZOaJoZ5t(tnVQU+9s2KepI)!* z`ZP&-@zccB|N1mx^-G`jSo_aUY+og$G-2=a!&n_?}WduTBnXNkN|(`Ms8dG3MQTV0DFY zD)?(}9(>>2by*QLUprm=q_q#`ag<|y_;~&*jWvZ1_?bhMw?05pukHqo>5RN>fXkO zm+9xO(+Z&-TU5#ye-Ik-ZCDZV%R=i4OXDQu2e)9H=R?B4j862vv2<{p{ZEEQI@N&6uvFQ6~>1y7=# ziTi0j&VetmMe6~E0SRo)F;wD*Z#6}temP1wW!PqozF`-#Xe7^i#Edd^4;=a}p(b?y zJn5f(H#8MSGm)!}5zvn?pToDcJ`TrG{%9R#IfjEj;jx!cPb;4eIj{$15&vMvhpSWx z{`@~RR!=!*jfZ-hAZ&VG>$!aLQ*D{+46^+v_u*c7tEReVIESqKH9xzOkZ}O%F^Xh*c z9gedltx@=&*9t4~wke}nqSyph=BkBT>Rlc8jL=d@ViHT<}NSQ5Nm()h&yH@`-ZyckSu+ zkyC7BgPIw!%#6G_|E1Ac3tFti9eXqkXi^Ef$~Y}g*>*HssXZ=hnXW+n3r&cY|MHTS z4e!i|)i0kKO>4oyvlRs^KWfrY;pQ_b=ZuqvN@vc@&}F}A(ok{HnUq#D#Z89Jz`c95 z&`EZ~3*^JW_XrIA3y$r~TyQr$twSgBBJkx%PTMf4xgU<-2P^?rT>`r*@T@vZQ2`JT z_RK!ZfYV)OM*ZlnTa=y0QTt!KT~V3fyAHmy;Y~QS1{T;@(lO+?{a%P%`Y0P?$yEpI zuT$(cpq!x3$JY12mQ){Kf2^xrx@39%SAS|hV5j#S`r~yQn*Y~zJ3s!zb^c!kyhU%Y z(b%2Hk8lO{ebjYDS6st&+4s*smgTzq(tUqEw)uwcW5F1koAE|M8el{$ZF~fH?3=iY zFrDiULMD)Oxx;n&$S}nW?P^{FYck=;BpkUxo35l-vFa~;c4+h8f8Vi3!FsT=IS0za z6c*;udMPIC8=dAKhJ*P#Jh=VeA}vaZ2yTCWNefZL&TAe3FNXOCYu(MzZNnSP`Uop> z1&;ia#R)f2eKssCkic-<@!h?24@*@-@ZXNvv4~y&Uef9~{3cc#@c+6kX8ey++)nlz zQ*1dlwsnf#d<;^h7I**0ic&O^{Lr$3deW8k;4UgHGH0=JIgiz`uJ1eJcUL>T%&GO* zH|B!7*}i#b1F%zSB>Ya8dp-_@Qkp}y=mxLDmR4+C$A)1&B*dN1j6K(y6|uKr@RF_1 zb1$T1oKgf2lT*9S*vQ!JZ!@5u!NcZQ7WPh<&?wv_IglB39}770rDAIZ8&-Xyz%I-# z*v5o2_n-SlX;Ee>$nH~e<@KIk@;XnV%U|(3>?^rYielv!^vcM3t758;#u_3qt9#VP zDoOQmsEyI;X2gUDU8d@zE^iarO5hVO53bRNh>%eIGRpfzjc#CSl$A5K+YJpNry5f4 zcdH_h#H@N*&ucLU=liaHzP<74zC<#Cs}f^FFdrI#cY7ptfl_m-m%k8r!8OVj#SW?K_ycu%zL3rZhT!9MV}giWI?{# z2WvY*J7!h|D4q*hZYIL+SqZ!ddkU*ZjKDK{J%jHz|G#x3WW-eR%L2ay%bS0^ZX|r+ zV1GRTE0kqy3{;96FL_7Ov*y3o(68>MDNyA1nY3G|b%7^@_jMGl);2g8!J%k@dfnBr z0&0!g7(G%jqP7B&g4HPLC6qM6!Bo6U=X0y;M$%i5T{WNb!s*Eq>V{(#m;J$a-WbrM z2go|mqX+0m%Mj_fI}hbArYGGCmU%+|3iWLFvW?+AdOM#v6P@@?=XGP{M6+`$rk_?&26+`v|ZJYYgepAz+%upO}(FQc7 z(H6WqkV#IkPGY9_uYU_A6L;Z7(yXBg^rOD9F-MIB2I`tjT+DbCbT8O$=)P^d<%pG{ z2tWTO#UVeMF`E_hu_DkOwnDU29J9wQ!5+Li@HK>VogrR=hW^TSU+xJB$D*`Qw82Qs zY!>jyo9KvQj6(^;!Xab@>kG@cT#f%@or3kjxl%n##qar+;?K|w?35b>jW!xQdS+1J z+*IHV{6;ax%lAV^3w8PD{ixXFa^4G8QIwL008(~M@#n@azHsUTM-2Q)_;kji9y(&7 z*a1&;Zf9)*fq3Ac|Ik96wFv~wDlA0!3b(1KiTAv+>kCA>3K^o+jMzpKSJEoipUnhu$L=GBo-G;gPd=y-j)HcEN%N|}dH=E6Ued81yY$CK#+b$F` zE+JbBG5h9B%}T2es}b-_gf!Egvn}5ZTzJD1 zenoeqITq2mI~lm08YfBMNMsAyKvu*@L3i)likMqO1@-+ir=jm6B0%_B&mD5CVpeMN zN`blFkyol(8xe&{^Nz~y9j(mbUdN>HVnvaMl~;`#+B-zqj_a$p{s5C!So*efdn zSF_&H_qLV1bS@5hzFjlmzYUVgnl<``V_6e-E^`I8{|N63R(K}edI#2|!JB!5eKv?o z%3Lrt^*!R>j#A8!A+*vfOc{gfV9UaqEGUnd>(|jpIy8ZNl2c((xcnc4;;VMDf(i-E z_N%`swBLzW_jii>VQpI=$L7IuJNs2I3sGXKIV+-mwJY$i#dyNk$P=niCk}RQttMX+ zqFhHVx*hfhu-a{14Qdw0-CdpaV&zHrZ=KqJ=1jFeTD#&vD%dFp2Yw?C z!vk0&Uf2bEou#p7!^BAA(o) z$E?wN-$1XlD00Ca{21?tJ|)Bq;o`pO@*;1dyx7|d484mX)zWQYA(i8Cp-U3N=jDzsguadG%CsZmQb)8 za|zb5$%;7D;_^48>)Q)X9p94Aw!;@Ve7UXuZ&*`s8#BJz&$^zCgd7;L`Y`%S4lMcK zXRsZMeT#P7;=5U%q*`RF*CIP)iwsYLug&+G=RuFnbDKv5Ryx5~?1OJqj`NLx56b9k z@I6jf$(3GE4cxGvC}F!I7ye=C?+!G-BZWlNru(6Vrm%&m(ubhAe|n@5g?|ZJph%%y?Wgzf-_|+>g39sA&;kLs}j8R zf;uc~^Qq&kmPRKJvG(CnuFHWh3gUPqp8yXR_WU!|KD1^aLmb05GS9%RyMIh{yXf2Bev z{R(dZ%E7$Za^+y-sY7`Nxjb|0k6%Bd$0#yi`0;B*p`IigT`K3d%azrZ_0Yiwgq#UE zXP}&A^xq?jty;*8T6zSfJ%l{l|Edy4#u$45!(XUh35nN-j;+P_DMm%lBcj!Oxr|^-; z`H5KCrWxoz?3*0d@6%tw{SA225bv!@jx~cPdVn=X|Neb?o%a?e5-41OPi}+GhON3x zn)R?U~-`TFs>~95qEE;U(5wVz}VD#ZUykT>pi*Ukj_x}Y#4{f z>&Jt4c?(J(z4RcB`RWrW{UCYjaJ>BwWB&y_V^)_p^NRezeE4*?k0z=zljfiwTOnfx z!nY>h5*ugZu$XR95XFm$H%ER_MntgtI9omy2BTBM2W$HhzT zIKrI_`9o(#MBn`6>tokLpS2Le0p_@zV7gXDvh~aaj8FwjDTpn( zL>lLc^RRae^*3Q{k8(@cnq-n0&@Z~&IWv|Sw@Lpj=?>+p5!8! zVK64MpFmCG^j4rcr=iY$fXPm;k|2{pP;Ww-`Y+spxa8k`>3LG)eb{;g?=*w-1XxS3 z$`Lmys&*9)<>K2BU@Gj8WHt%7SqqrceB#)W%X!)E39zPSpGiLVJ?_36Pn_=xY`d9e z3^ft$m3~WPxa6K*a63=B#TcH7yw#Rluw0YzFk|uWGRC$sLNPYWMtHey@(sn9CTW+0 zR!PS3_o4f9-iz(#IVdZc+8U)Z)#SSgaxzBdED^qMoA4DEeUI)a^u=cXh}NUoqOW!-%zxWm)#tEntwTBgvYg^ke4>L z4bSKPCnKx8^%lEr)IeuUF{oju9zV~)y>fcnv ztc0%!UJe1dtuOk9`X=C6R=G|yz)QTH)}NF(yIoe2EbD<<=wF8HAOp~m@Gvg@h%)1s zegx^aPH(3>&;~&79hiugFfmYNw@onLji=|A6xwqbXpuUDH~zyCEF`blhao=xx z1me0YGB*b254ijfW8DcYe7TSt@UKOEoIb3hohOz!vA^y6ykPvlORrk<{MCAu=ZzmP z!4rTvF6akN7xpuC?dTdj(-PEcNk*dICxGuBx_!LAe3%XEBsCQ&ijZJ_v6~v z^`7-Q#&4n`TW!cJ&3-qMzKZuJOoZ<s46`-yIR37|8-+CXBY=#38c@3zy(&{`0 z%DsX`vRM7xVYh@G4273iV~meKV?^BkDE1C}N8s&$QEaT7jV}Nf7i{!P*#R!_KHP;f zkhE<9y&qW(|B)gg$6YvbocxLfseBZ4x+;`X+0cS}N7mmA59TfSJ}LFLDueO+V0~u& zvd+5?IhE_DRgZ2?>)ija0RE6Gd&s-z5m)w(U@!X0-a+ieU)ei~y`ES0KEht_D|_!^ z&)&5smSL}N*Pa3VuE-1PdU_M~23^@ZfW4v3)YI;=8u$o8oAaBj>-os#vX-zT#P^hR zZ^yp|$#zJnWQ&B@xg=X#EHYSH*EpNgWFSPSjbv*YD=@NAo>5=9&YceW zV4rTIuZw;J@9)>(sE1v!q^j~-%^-cA%m2__M*1G#dmkw<1b&J`pM>O|tvX2n^xu1K?O@j;6TIXJBss>MV_CSjOO5>$E$@QYLHqLM;Pd zK$I4;+esICHW2hDR{V0UE|k8QJdyvex_6I@s#^cY*IXEe`+%T`7lxa+1VJp(#&H89 zI!Z7q>3BP$qN$*f=*do+8{Ot5R5V0V(9v`pJ%&~jbvk}(EK{sBwRWM2nw4RBKF89` z3YhQv*?R`a>ihY9f4}b^=jTgc?PssO?(134daesY%`w` z!A(6#``*JP^*O1|U?#shNQ|a*LQI{(*8{NP8-*B-@qu|d#m}(mNBj*9!`~yo^W@{} z4CL4+q}5rjIsy4>2vHTFU(^D{GLH|}A@;n4BYAa4{D?8#D{+IL%7cD^t1EFWaW9CM z?(V(K?w>xVJ9b=V(4Q|WpF)u}FLTI|>@u1I+D zSm}z8+Ec7LZc7m|aVq%Yo~VXgj^cQ=9y>_C-%Uj8uF^<@=cK|ZwrJA>-^AYN4GYZ! zWrrL5s}oW7t`6^K0>7LFcg@#ZHkB*!l<)=a6ua&lR+hM6faVE4?eR;z zXUhTDqkHf1!1hNeQa$W~l_EH`8()Q%#Yu`Hy73uA;ps7cYlf~NplvoeqIv(imTmz> zTf7mAwq*|vJ5UA1(=vXStt^2_&6lYgATQfQnmr!jS5b>N+aPsh6j z7`dn`uy}5Z=r~M_+BN@5l&wTKbfJxN>+F>Wo>+YdxYf^s8uzW!&tmIGEr^2&p7kF6hOm-{v{h{YMU+jzeyI)b~ zfpvR|;>KZZyWu}ow&S3c=+y8oS68w#CO$B1jJu&eQ${ggV%T6^xUMhh&pf?_3+FrW z(9?id9rCjriZ;9o?gT8G1hNHfxzz=_iDR*nz@;V&uy(umtUg#XG0Ig~CzwJ1AKT|y zo}-Sd(G`l?+_BG@TmP%K1lNHM(lz^q<1dZzYtYCVtn{vv_Bmc_^ujzkS}tJLBmFCNV*JIu1IESyOn^F(yMju@odW!Amb5KF;_+mbOWXzBX5#-A7Rb`*{p-Cl zInNm29_r9}$Dked++{CJ9v9%@PJ(hmC)S0_SK~~JhW9VRwb0a5LvJ!1YbC4!UiraU z2nH{`6V1K$IJBF-AxSvNGuVI;U2 zYA10lJC|~+nQ{57LB<6+>h$A!A1*jvnWs~;V@W2x9~0sQNUi3df`lcAa7K?efO|S; zaU8Q|C~-oRtAV3BJ4e>_6M`FKfpv8h2hA!#ArLq!N2$~R7J&T+FO^DWVtxu>)dt)N z_+t;De67$&D*pv1&QqqN8sciC8uWdb6}&!hEu|Xj`T?2=`_Tc;k;ob9t*Z!iF~6*c*wR}1ozmF(RI1SRTG^0@2IPm=2BOm)NyREKk9hVCmZjaXej zl-wG4a-BoHocq&s&!fsG6 zNw*bW8yu-YXcxSQ7^a zG#(reY=b13lj6IieC^#M**4($=#(z7woKL85dN7NP~uTlmb zNT~%jPYZ~4frYacduHBX-hei2M;o-Rc$5tpu2gm=O7W-u_LzfIfVVtpC4#Dv%KMwQ zJlA5BMq{W$S&ySEh08=326F^X$RO>Oo~|y?_l@xE&HTzs#DiDsS)X?UJZ11MO{Lky z%CDl7M+F61!f18Pb)$ClP3j}Kaljj4fGEA~k!BV8GE+La2DP7j98n;J&$gMPJZo7#r|= zV?aH{VwQ5B;!l+`RJR_HVtg(hk0?y=PUuTJj;gTC#XqBx%-;hun&>{tbn|#Xr{1CBGfe*A0Sx zS3ucIXJKjOz5qI4x$Mp3N+-i3ND;n)d|Wra`a_IXF45TLmeq*I6{b@}h*|jNHFyB| zZO+qT9Hc)VGCk`J>j1s<7PR9fDdG!hWkClOR=Z^-wquS=HkMChIzI6n`NoMMzOEFH zWqkD+)YnCfuss2rRmp>UeBpsrLND^>b^%)2(CtEh&iNczg)hh|1l-s7aywtW8U9M) z?v|app#hIwU(17ftwUd51uff2uwMX`Vf~h<9C)M)3?#}$BI3?qe(3%Mj+#4)s0TdL??OS(cZdh?IBHz*jeyY_2JgggLlXoV z(t@p&NuJ!*@J;-hdKT!Npu*Rw7t*XiHnQpn#w-(fFr#X08Tmv6Ed*=p8{k)) z16|NdCr#*vc{IYi-_0)JIy-Gb{JAijG8?p>U~dRAJYo(g>o3jP^B8G2dIi67ioe6^ zuD^55>X>X34}ZUxvf*Plyj&~KEsWu%LH6oflb$u?PC@bg z#iWWtLB-FYRe`TYNaF*qy-+3EsgEUWCVvRk!L9!SSgdaM0*@ zP@ymV11(L*+ysy{slovL74#XtS0JbOy)FVg)`03*{$u?Dv@$^0b9Nr}72`8OFsvNLRHc)Zsi%am@C{k)f&;FwxCq1e37HK3vCns-JUq^n<>&2h z*q@dxrN~K@dM+d@$)DyV*ET;=Ut`3i@=Zb4Aad4^abVReQ0#CzJ?ICntcyA{VH_luY0_b zrn&lbTwOO}Y);|u#hxf{d40E}eelY^JA03-3tI(Gt*fBD2e`1s+tO*}bhh?>Ye=wC!F4aJv7DxU$3Pl*D;_yW_ih_-YlV z;U}^Pu^I8}-nD@*`X3 z0YSLIsZondxQddK!EvHoaY>K9GAcWd^TFM29c=f5%%RdZozX4>N!9Q@tlb+p{%U<7 z@o}?KQ&X)et5V^8Db}Q4tc4%gMC%Q{FX@lrzN}*9)N=`+!*dV#pMmOCI15{DJjFpG zMcBkKT-0Rg5CKHD$?aHS7*_b^^?6NQk`ihWb;Dy%7s^U1FEEY=|601=WN0Ny87m>r z+*)u4HGU_MO;)VS3jWJLcy(R~`S3V%>x4I@IS;10nws%mn#RYtulD<`{}MUlg4z#> z2PkR5UnI{+ERb~V>r-thbQ`RX!#SXYts0F@PpSvpcv$Uat4Y!vUsd19*$es(7kIPu zWt`00Zo>iNh`W6z*xdTSO2n3>{IGDbHh~)&!@IC@PkOz|l0FCNz0+6;E?PUZPSE~E z#>6A>OriL6HTVadk1bTFhi6EI;xn{J>3Z50YRYHDj)#9U-}5`Hq1p1RyYx7D`ojy% zOvl5<)rGSms|BAzmu^ev)H*HMHKD$Eu0S1yJ6<=MSLEnLb4ooB)6FfbqFwMK^vWpU zNB99NT36py#GOZ86E5hPd^WfqCll5~N@%Dxr8KmCJ&2ttK1=Nn^17f^A@ToXrCpyv z<)83@kK%~he~GlSUL}kKe>g5gDR(z#o87;zKA8LNTV;Zu}b3s!LI-A(Bg>%4zs-T+~#sTux z`F&5Rpd+M)^c45BoA5(IJGKqC^*EeoNGx>P&M??DvlPBR;koP-7HkW-uDan54j4E- zg?7Qm5kfR~;T+=vjMhW8pVSsmpTI4!o?;T#n9dfJj%bXx{q#YW?XS?Bg=Evju~6GX zAgO~9hit^|hiro|1;M+Q)Ts~5fc#{yE7JJj{Jo$*BH@eaiV`<`tcA!5H9X~F1}0QM z=UL}SsleTS!bZnH(T6BMvbl-%PbsDU^&rl;g@1d20rQYML?$FvNg}vtn zT~B~Fnmy;{AY#-E*thIE2fF>jRMCv_%|qnNM{%#k%s-qXsKs1i&lTvewf-R0GZ-s; z4E$WSPDmoZnBWO39D~VEP~jYLI5@>~fPGbhMjRygi13FXeJQqm86kZc`nxavI((^w zwas8Whq$_korrTkbk^=C1;tq%ef#Kb@NY(NDJ+Uh=DYF8Nw;R)uP$MYU!uCv>S10? zEbAb`J5p;;`0>6>@vPTC3po%JFV0%#J!>JonRJ?N%C-5RHdYGzFLwj3T|>E`>8D0c z|6@hqz`?f;Y)fBkn1eTJ8?-9{^KF=puW`>7r<5JM4DIi4j=`E5dKI7tr%lPk3HX8< zv^{)|j6km=4a3dw6DGndI;GAru?zUGNS$YrmzXY;79p7j-VLYpXVCLRI_fg?5I+Tvyn0eY%4lEbg?+U%8iOV{V+ie)hDQpTFdq)WA`0_l=sDF}peNvt&S=cMHqC{JqSr zm(SjRJF;w$!0+?B1^pDYWd(2GPi7$op>^E4Pk?dsLsfzCSsb1-{N8}&pn9l}mhp2+ zM-5d7@mcxo@77s9gAP>-q;I#Mjd#OzQ_FWTYJhED@e^P=DWdbPZZG;X{st#^Rn5!Ip#OLiMo8}Cj1kS z^r54U)>E&v<8IQk%7Vd-6)JT@Ss+8J4_jyX_eWpTEYtZu(9_b(J@oHR+6MA?_y?lr z3_aH37N9{d^yrlmUvublhQVtJ|Ou)HO~-!hX~2 zu33vy&!f$8z4r|fD;azej_CtwSGXEQ_#y<&`jtG>>$7S8_+9)J^fw&6#EgL9UrZVDal zbaN;-ORGE+fSteP6zy!-PoBTZsTg^c1uaM(i)dZK@6s2g%1U-j#UBHw12*0!9r#lD z>XH-TwiFjx(YoE|U5Nk6`jbT5bKljRgomBFdXy`bW5gI8(rw0|SBgl(eYYZKAX{N!tjI86={DhA9-iRcSND&qxWs2>#8#D5 zZOMCr`CfamNyDWC`kho&zaT2NWJZD~MSC{8llxoy)&09yD|eLGd3!qUZz01^zjE(| z_bs(d!HspW@-NmdtF2ml>2QH7Ev8Fg zZ0)77XP9E`GA_QNuC@yI0aja#wbtX6pK8D%bDsjmo%qVVs)2U$zt;bTG@dP=oY3w} zL2unH9|2F~d>TZN5NV`aPKv(B*GI-EtvLjThJEgh%Q*eU3RhRH0ac`q_=s0v-S@)G z%=Y}9cuRp(MfTK}DrxoSUip`BwX`?o58vg@|BWbX{9pMAb-j-DmFo&L_Bc3|^wfpX z=GH4KaO&iMsu+uR78fETA1tQ#(z_?xdAPECO1Sz{DSt)GhUdfqH9yy@w%tR#pQ|R& zD^#oL*>#IYoLF~OfNYcRCD|tgds@rTTGKJvMj?Ulk1Lie6=0_T3(Uqow_wG<^q_me ziGY5i8qVw)v{5ipcn+=}(w4&)utxw>R}XFMvmr+AH+bUiD<^QzfEReOz~iSQ#>Zid z-)#KQ9dPVa9iNIm=5_23bW3j~E!lAzk$MZ*eu@%xhgMhQWg^M%Y|AXb&M(7j{p2&xegw^wy2#2U>KzDLZV%k0^`0p^itJI^WchCargW(;i*g zhV#AqdkJ_x?fVvXY{xeCEoJ1R8eTUvYN9lX6~)lmhtG|FKgM5$Pq*AA$hOZu@6zIg zazjIugEecQ3o!`pEGX3r_D@5vpKOBW$ET6k-)oA3@0NH`FC6$ZR5o!-#Rgr{+8VpgK(OVUB}C?VS{zbh7eKO8)b+#3TU--BBM{TPBCuk zJ3v>d1sABESELvy9e654&7zIE##qe3s(Re93Q2z28?)#u&*IcuFDP#K3mF)(RnoW# znCadaLtoIOtIRD|;Oh^+r@^}=`2L9W^7f~GXh+M{^*fGib#6I+{p1Z;h?M))KMuT6 zgd5N2@A%r*fnNXI=I>bVfS%!`CYvATCL0trxCHT4uE`bQ=2i=EOW`WJW#{{q4WQW` zx?a!(UxBq2ag1Qcir9U@N9c{Ux=PG6EC9Y_wYn3akFnwcgg8U={N;vWeRoUx6lOlX z5q@+E=eoj;3tlPO{k>%t%hqNxg*KH}fZ8S5N4dFm%6a3oR~jzg5xau=(?FWu;C*LG zUNsf(-|@gNbb#jrUME`-Kq4Mpv;(-f$T<>z%D^qNLUWF!U-Ql2(MRJX)FYB!OjT5! z?=fFX37`GLDqxss+>#`1Ztog|>`0Q8WA#aMSOq!5;X^j89ZQ0%o7w%`dC7N?#>67A z`z%AqcX|A*dbJ5xM^TMiO;iQ;rX|twpt z@&-8R0LdKXQis(|D&_p%|R5E^5k$8p2D-Bkp2DwT*CI(&%kA-Sg= z@Pcdo40;b*a9?2eC%2rmR~e+Tg-+ZfZ4r)DHtDqTEfaAd(1L)~y|Tmk zP1k!jg|5!bj$m=u<8iy&ogH>;0^|}_-1p*O;T3i)SDdlhjQ7_NGs_RwUSa%p!2x(C zcHVo!K|D7Lhw%Kcm}pByABVYAcmrzG9gK4NpSumO%i_#&*P=t_Vv%9cWJ@vfg^Q26sKKn#}Z^C6E{ zlNx9RNVE+UN?8DQ21&4g6o}t^z&6O-n)5w04bi@we*q4?43X1|f znh|Dq_B6a7kCqdM#gnJ)T`oKkAet1;G2N9=+d!0fO_sYk2Af;c3ZVOP6cS^rphd2= zf)9SLE<13go0Rjkkb&E^)QhxSPtMHW)?s#!J|F%fjTEbt+P&2kB(-}p+6}F$`TO9_ z6uzfW?j#xo~>uM(!=AoJ@n zKc0_vtU5+(516v>E@8cn_bqetlU+NWv$$8l?hyVOcoPqry_3EK9vZ3<*~m|#K7O&? z!pYW568%am4`!LIr25pg-c2go=6661yCOiTRN2;({OTh4B}5!!A>FZ#+A2{A)K0x4 z9bS)rv3-GFw~o#S4=1Q^0eQt2h9lKIO&8@)RFv#;b>YTH(}? z-{Cq9=Dk(7kN7L(xra`2vcHsc;Wo1XXsmbV)Q6yxQ5XGvsW40NF4N@+tK879o$;eW z&^Bl=?(hxlpD*bwAQe*KWQN4~#=RW*KqL=|OESDsli*9Khb)DjdPl)-i~?a;XVDWe;PsKz&OP5v9hJa49^F}zW;INOuL z2*mCglcCd=2#A(iI?DdhgcNvE{mAwtcFY*sF|eitymlk-)>g=KcO~uJQ@t*ILuTGS z=7yDF2F5lL+@N6R+h>z*DS%0pr9AY8zam+A%h&koDZvidUxob*I_KMh>TEaaJ#_8A zX5j6SPCw2;!lSdH)qzn?Tv6{YN&b}t+@+ZKjrzt!sdn|A>MBJ|Cgg+TXq*<; zN~4~xtb*Snll@EkOvz3qR8ZT`!atsB@5j(9*@M65Mb*2>LjJyUN{b@+$^+TSu71vF zAvT-2lI$_|eB73`oJFmMw~FQq@zpqW*L=Wp_0bri*^Db415bZpfh9B&`$HyVFvZ~z zj1b@i)#*!f&_)e>JLP3#ZMZSd~*PO8HoRTHDZdGUvKX=|}diVU=i z{GNLH1rF}`Eu8Ksd6w{6(P`=2)+Lhu_rwq`-l^R(?R_nL0gMDi3V#H=zu0|h95}jN zZG*v2Tj1)%sgb9LD+H(Wo8K#FKIn9|zQd0q`v?4O!cOD(Yt9wIiysGha{Jky%us(4 zfd0(3JxN~N-|5?Nh5YgQu;@!iLAzrDbVlKcf$1tMa$?yEkIt|bIQ}WLJQkeNSAp3} zPCmg^IJM6Y17{W9D%;yeEd-76BWWkX15(Scv1r*ISRMM|Zl$pew)xaQB>K_%l6Q}~ zTv;Vb8p}T@gt_W+)z^rU7ioJPeS8a2w^5BT^}fiyf&54ltu`isg9gJ>-_ z_&O0~h326lP1Lldd)_y5;F$8&F4(!jBCGZBP|-(Dm7GPpMjX=uLyc&IoeQ?iR&0-zNAxBlvT0st6C*YRCoscDw}+KYh8k0Tkxsd#+K?D?mhytmx=w zNN!gUPl)7Z$EKj{LFSgX0_szM|Lvd}6OnI1quvES2n+anaOo(H#@v86a=sgF9-mCAQ@M(L-?zI?|;p_jSki0rA@jOZanQFs(!^4P)aLADUV5~!Tsta zJXO<8j<O9f$}ajX}{(=;ttb6pF56)j+pvK{x!pD~*L#h{sL^{-0b9*iE!!4*oWw zg-G%9qq|Qs{QOm_9`Oay zv<~&`JmKSvmh;2IQm%8jRLX$5XvoX{#t#=zD&2FS&kbFgy3XX|)Unpwa$=w-XH;FZ zGkT|D>McaWds6Cqv^1N*RL~ZR!zg&x!uB+h$s4vvE5XmZ5_a6%+Pvi}ZkFK36;u&t z%=H?4#ZCJ9nzqSu1{!&j?zjSs%L@nF)9TfH79<>MV5D zt0>|usEhv2Xxzeghy$du-mcQ1G+22%-SxewEC!Afq<9g~DoCeNa3g-!+?v1uQ;is|Eho;_ra@~gM$nMX(&BU}*S8outez9=y=S=hKEElnoz9S9xS291BIs2z z>~&y|Lg#MtdDS~g$2xe7;ehULv@b|iXZujl>_DFa3BZy=JYpd~J-yasqeLBJU{gxUK!5y`3Hy+D;g! z&<^uKx3$R&T zU$_@BB#ZCW`-pjh<4P7hj51{wZogacGg2JA7cq~DZ%E!DI#8Yxbxo(#Q0%tm1JSOB zXy224?t&qZ0QrikkoJK7fJuz%+#uc;?wI8Gwfg{obkqPv?mR1|^ee+A2c02^yP1vupA7?h^ z!^)Xv|4HbPX<=(yT!SN$hc1*h;IOXtoNhN1`ZqJx;ZF`fn$5EyZnsUl&cwmOjQ0;a z%;VH5-X;c7E-AMsC$EGL&z9nMNS?BW$DI{=a$y3`B98O$F~WZ_^^P{M30y?2Dto1? z71)1u&FJivyrw1x&v(V4_2BC8hv3&8wl8f^WTF!rOFL!i~^#Xg;z7r7v@?fm}I6 zt>UNQs{kRJYDNnTc>f&Vj2z(FzS@Y=agNXp9gtf4-ThD47wu1lPl^X~7BL&y8duGO zzOlva#*Mm~i$N>*RBq0WRGC~-Ag#kBiV z*o#bQPi2VJP0@bsPo7-F?E|F-j~DAq>-04C96VmYrmvfcbGLFJ3tXMK8HmzQx$Wf> zp_Q-Zz}GV;=(Xz<9DIFo;Vd*Kf@!$$NCpqi#P0Dz_oJr53o%ww4+8x!Ko%yxZPVTUX zpHK1gnUle?rrF+|N&)2sui^|ROZj%mzN?fd2cE<85x}2<_No$p9~TmI;XJ&GP#eWi z``>UQX7;D?8(hTw&G@U*6)T{HJ|5A2dFU&_f5kx5k#}aI8hUQz537DWQcA4-T;K~x zIG*Rl(ZDS(@J9ngJ&g%ut9pirAJB4bhHgo=7=*D5wWnQ1R0gwq)89mR?!ey(JV$HV zA<*7})>JRS^_IYQN14sF*G1g67w{$(MhaS8r@~JG)c*1QaT8csce@2wb;;r%b6fO6OjV=f zT-{1OmNY2ME&qh)pgAq@Oa99(0h0Vw@D&G&L%<~*2x)sNC=}?}S|%V3T_bZU@I>_X z^6gs0KyERF%=yKh3ct^RplN*#)8_mPAMEUwfLNR@Z+?b#h5d-9PC|k)e1D@MvF{|D zIr_#}cn&K7eFbbG`turd^TzK)4IeFyYKFjWF7@K__Ho#H);kVuFz5k!VbXoQ3@g{h zRMoH3i0>b3KaRO7I6UGot3Ad6>)V%<#?@vJrm^2$7hn4>;Td~*tuWyDo?TP#tYl59 zHN5CM_Kd=vekR^`A|!C|v*XMAK|`$diI>qn@JttM;;-`E^TJhbP$gNQN{->4Xfs*V zU9(q~22Q=Bj%td4u8aofz*l(kZPM&qmtC5^8teFoDOnwwUCKw*OwL|;Y?;`-`hjeo zEkv#!O+Gu*v-x9-#2k}e-6y+Lp+erw?9yZNQ2NZAMT$bgFdq-bQ^7~LPbg;Dmt2p9 zmyj92XY(*WLDiE%4>a$+2->d?Nj)a4Lat1_EkM-Ya}+P>2I(fGp7q;#0M@O()#tMn zyt-z5LjYzd4lRb?=)M2M4vWKglBe%!b)-Y87)bAEH=-4=w_G_zh=I=s<_d;%g=*Z* z`&v4cI#6fx4|L}z8ANl-FXB|>*HL~tvs}G^?|tCwXEO(@P3gPU%GA+?%61HK{NnhhV>$23W}e1kCeUhs91zUfTa?Q#M-ShnDzPl|y@>pl-KggMiUHU_RjQ z_&}%Ubv!(dy__T-wGSdJP5q%b06ZdWt+bk(e|*Gqrgf6eA6*yPosfWn2FI+gtRUXO zN&yr**2}>Z#0;>4j|gAcx7NUmCf09J07ioY2Q$>7S2*$*uR@!OZtpO+>^3AM~md(xE-UGh#5#Etcop!9}p>3O=S>8_X63#Q}o1Y?_ zhY`=YmVP6`#G0o8>up24VXev19CR+X3_O0YzOajafn9V-O{#Q^Xw`tU+RidgIU8$&qtnU--CsqZ2 zukKZ@>Qrb{5nWYYjdSL8aEjP-^kz44x}TM3*aGBfuKxnh&(yriO0WXru>Pb~z`M8u4hOF9A97>%am7U+6PiBUvT+aZ%oD9;@&^)nwM9M{nPT@ zIf*ylQaFW2R7r_OZ$3gc@GXVUikWt_&<4FVYUztB;kyvjc!hxTbdl>p=yB-SwAvEE z08d%LwTr>&NvT~@n+%UxUFPuB4_S39v9I@xK?J1${J>)Xe5UCE$&jh>LL;zwrZK^} zO_+|~mDMVYfdd?hL~A$f0P;xb9vs!K!QtVh-h^NH3t4)$-x}jTm%MU^>sex+u2c=! zUf8D}!E@3v;)3q6>Yl5>+K5Of4u@7IATNT;kqsW#WTgL&w}D8%Ag9Z$NLN8W=q1=| z_cw%$(;|Jy%7P&+9jBDx>ZM34-5R5sYZzcXEvJLjNVg#E zK%0sU118Ny`bBF@NE+aYa$D95kTrDjq>CMkjgp7HxAxNdpW?^wq1BJK4zv`!s<(~C zV5Q1V}g)RP}FF*#%S&dYP?14)-`7v z6XewTdI3>yKAM52Lnx^keV>DV*{w`<9J^GH^otmWK@QCOdjnC-!NdZ*^|~I zJsRm6ly5_iUO^hYQ`|%PIZyg1(ra*XB0^`yFDUT0O@oy^a$0qD?MC$oMol4K7c}_#sH|$2?tiz-C};5x%gY zB=|#^{E*rG^djJU9bl-b^p3gZOp}QlJ=!pO-|8$2dOL1onPIy1F{BSz$E~h1OrP|K zU^6~C|8H3wzR1wl8*<0@meW4f2aG0;^)!wc;|Ckj{nnJVWrpG7dqE@O2yUq06Q0RH z&Ry1wzy?EZ-`z;>u_Dy0A$JmN#QSy^h6^K+r;jj_WE9v3t!H8-?>A`KI&gW;>_Dlz zP^!Z)+&T&A-PV-n1{sD=Y)1M3Y}A_!!zbk<{SxvR0KbW}!ojO>3PV9^|wABFj|pcVcn-< zbxij>e~9#7NDA(GcHns$zIn;26ABE`2uHH!>?j3HxxQb0_}W zlrc$%zqc^vFIh8GQw_P}R3@NDL#}z?R^%|J3hRv{4lc)NVBSj0R%6V@oq&Z9G}es| z9z18u4xW|?GlaFnzdrCies1B}if_&uXCIu0AL21o zVihkFMw4!gx%G6S+5KLW^@W@U!+3!8nw$=FB7I%{ zMoV~O9@4-Ye%Nu7Xpip07-K(-JLyRaNPj4&*XASrk(^$WhqP!6dIX+XvL_11jl)I@ zLfPSNhqv=_76p%J2@G7R57G8jU!w-hgyINlqfrO;k}%Wva#~Ri_`e0vAS<81sM)aQ zFlLhzk;a-^YsGqc)RQ(Dd*sw(C%h@Q*|(}L9Vy_20Ig#qQu{CtoMSywSQ)Bijtyul zt-^Bb_1hTdg~S;~+^@a@NBEB4gZEfdYwws?G$@gy?_yRDz}9z=A=gSXY_n$glp}pb zP6zXb+{uIGwyf%ocKqPUuScFAk=|>~@W<*H|1i?DI}5Not1;6f=Kmr?0*(T*18E2L zE7s1WzmPUkd5UWyl7;i-H8JR|hOY>qQdd)0}SR|?B@1Nm#n^CI@)P2C>; zOWmH*Wk#PJ7m>RQ58MDxsd^TVF&_j=95coLMmh;~0lNf5qJ>W(jot-ZMZJ@d2F?iT z1GvdF+-5Tj-8Wl)AKV?VI;5$M7>P*}klqRZ2qyHtAJP~Vzi^}TXsECYV>%ZjzY5UZm}RtMatyxShdx-aW6zS_9`Y+T8CF;)8WYSP0k+FpvTiAQf^&G| zUcfJb!sv{1WDoSE7t8QX^@i!=&jQ{>hOe~%j#F;^pl}Nd1UynMdrh+pUw6c?Vp1Y@ z#Tmf&TT3=wmEmi7z~@oaPJ9z8fAcKWjk4Ajq3$GI9E4vav1e*M>z)x~(t-x+4ygj} z$=1tR9DH1)l*9j(PK}oAw~i}2YM4Im8qzrRHeA99_?5|mIh<}CBe!(54lN%bzu%aQ zd20kVxQrTcGL%h4zI%9g&^k`Q={aeOoJs*Q^2UAA%^b{wC7Yg_Pdh z^7*g$7VBoiQJm>-w)@f~njEA4l2z~zH*A`ukkeYsz$7KoHSk!m7SyQ|&ni6c!R#1> zd^`my^=uia+4qG#!fM!ryZ{bKu`XW`rn4wIfsYdb`;l-w2je*e&!KqM>5>&u??6up zTt__z*$QM78c-u2K?>l1aRPbnonJ3=3vho}HZ)|dVd!v&VW|74;bFJ?Xn~R`3&Qp) z3u4tudY4zsG*egcN=P@fmhu&?1zVV^fWaS3j|7vT2xmM)O5*WI>7e)~HDhedRi?n# zYLuozX)2VaLg@l(QKL3By+iFBN}|92-&&#kk7$MJKcW@t|AU)-~St} zV3Li1ad`sg^feakU24m4W`SyjjYq&*#9;MxX4x`5&()r1ljr$}=Xr$Z`MBrV`+bAw zd8Ft4P5D_3s}va$2(3n{0T4eA1fG065PuJ(Pa7n_12MEg0zD8*8zjgBDQJTPdmu~O zAR!(|SsO&>f!Nw0p&p1+hS<_Q&-L=NlkRsIqrgk_tcIM%vZ}P4@9mtk=O3Oow;JQJ z7q7S{<3rhBN&6@}IVar~Q9@9-pl^&rpXb<0g%}U4zX!5Xi1k2B9>^*o&I6h1fe5f3 zl1p0bfvgr1JdiREo2hV+UjG+ zefRqv_fd21U!8kC(NsnWd&|-q?g-Hy|I~MAZ#jFd;yt}OWUT3jr~?tO^eD|TF7MZ$ zKed|K(_F#3pMad=XXmp%?=e<0kN3<-@TEorStXU-D{FvV(!YH0oxol*W>2#c$*2XkqLfB#wSH2=o5%KGhZ!C1t?PsA&q%XoQ?@C_zK!bHfn|eXE(5B-j^BXJKb@dH@ zLyx{a&+8Xib&=0JI2J@^D6bP{)G2E}tPQR`?UgYK$jX89YNF*dA*Sk5ZC34wT9f02_SUr9;oUbb-u~#(AErgzLzJ|NDOk8mz0>T#==`=n zn1^wQ&fPw)`52FA@-u0+RA)O&h5U?+{(g0(kT;FvRsX}cOWVH{^66_{h5HASzxIAB zuSe8799FBaeKkY#iCO_G4Co%2xkml{b5C!7(?+UC1<#f4=9k<1gJ`Y!9H;IAxuB02 z3JVC8-6{rRMf+r=@P2!(Sh;&I_-vV3anTu97u&eAvYhg3<@{mr)1NM>(b@INzZM@bR6TA$2WGK?`ybKR_ z1I$BYc)(huAC}=N@GH#*IjuO0^e|5vTtBnXlm8~t!#(*0q&XQLcnE3Y2B5A$@PW)3 zayn=b(wUz8v`B%t zO*pk6tN?Eifn}K4BCxd3_5SpYy#Gv)_@8?OQoW%~-8MST8IT&-6uj&4b4f@&(4^iq z@4^Hzp=RE>zBThMj1~J7x?k3N-yyqP{@Gsl*-y8k0(lD$tBliCqdb*(x!-K$EW$LklzoDlxb~Ggl=B6ljW6 zu(?cZ!)KtNygNkJ`ytG4%4dCn`F-s}Tt2vy;|Az{rsidgL1Njx%Xhr-nLNDvX5)r_ zk(LS;KK3}%(wD+j*~%8CY-*mldf~Ui73b7K3a4%Cr-sxWDP3bfXLtOKZ0v{kN}Ouf z#Nam+`1>U+^U0e2YmvP8D23i!F&_nej9!iX=NxkuCLnkr3X5QIeHS-#R#a=ZF&qmc1W33c_#aJuFdl+k__#@^Z>dLs~UlTFOdg z-3(qyXKWRG(Gh-W=!oau01i=$@ZHc1eK(xf>EL3lr#mQYy@tiF7kd3Ag=YfiJ=JCV zA8HjOr6C>GBk*h`m%-M`m{!G-S@;KtJ>NF3S7EoM0PfM7e@$$XqS|`S6Ka{SNIim-Zv%XynaA%`K>q_erda>bwMxjR(-iy&hSQWV<}h#r;&IB3ho_Ko?5+^= zSh;=D-WsJZ;!S)kKSO|QkVS$Ur2+W5%V#o zI^}zDc~Xa>I$?nDE`a)CQF#&Tpw6y zVlGflSA5$IdOBgHDH{)5=!zWR>_jW@OxinP{9WW%o>PkO@1QTr>e;g=D4H)o(R9PU z{blew=d1?5Fo_RfZAKlbCzB{dAP*|~|KX{>i#76w?FJ8p_nW;Q^-QcUQvzF?MuuC3M ztN3n03~3QH#@$x%#D(pK_aeQwmhe&@r>_tT*umd?6VD9*=8pTGzUd@=^UwB{pyV8C zjgT&O{sU-+7|;%tT8;dI30ed2q9WCjXdXo^BR$Q=*dM5lIH`_x=ua|oEu!zK&smXD zKVWCXcSjt;bh1tSqc?n(JSQDSYM6NhzQ};y=d}A;lW5MOF+@Fm+uvYhM^Y^kd=O}( zhe^MP^q6idC|7tg>n5goYsYNqoH0b}qLd!gCu%8;s1sH&=3FXC9(CSzOHt=5!ZJf{ zH?)0o#BlEuZV*e;*hW}o=!>c^s5#cXvZ1J7lYqd>3px!p*{s#)aFZzItG0@r=c@<_;)%s${y9nm%*h!s&~XX0d|VGnYK3 zUovCSV*TueGiDaeF3`_gsF(62B_;WLzMHxD_g^v~PW;>arMlU7p6xQ~!rzDHUOqG|>$81>($DTm z&3o_lUgO_65;OUOfApF5;adZ)KB3z3&0p19|9eGH^^K+eJDL|nZ~S$B5Gp_rBo{L597UBp)B@SDhH+xdhnsaX+wrSoRZwROJvsp zNs0X4U{Wqo99txToJZ)6|tXa=KR#bR$$=at%;e3V#D75Mzb+AvMe{gVc=iq31Lbrbh z4~h0;N<|2RJ0=#N&?}*L?_RwUdil4dlcA^+@vt6m|Nr-IN|q^Ontoi;c>TD6Y5L@) z2}}K1N7#_x!%~xf4@-IQ_pnqCsAGA9{s89vv}3-9{vhArKY)3g-0@p)lRLsv{-DiX z&~NhnK^+7C0G68K0k)5oW&Fh7!!m#StqJ378cL(APe{lfLBDcyM*cRBC9@A@=&K)g zAAJ18`(AkJ9+>tg@F9N;Pfh+~c*=u+3{Sle>>aN`e*(Y17;pZE{v`k4KY`!hEpIvZ zcgqV;`ICO#4{pot`;SJ)=-x{P?_ui>X*o zxsNYdtbcsYALeRrf+z3d8H*m9y;wi5M89as!g&iH^X~0-_`=8WdZAuEHcJ-ISd1RX z?O*t~zGTU)x%!et3ui2tJ=D`&`Ca?>Gm6m2f~WqZjGV{y85aG*B@1TGUWDO5FQ%Bx z)AS{?7Zyx^a>3&1vlbAH{x#%k*;mIktT 500) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: 2. SW_SYN0 is not at init. state (SW_SYN0 = %d)\n", - __func__, value)); - ntStatus = STATUS_UNSUCCESSFUL; - } - - /* power on WiFi SYS*/ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: 2. power on WiFi SYS\n", __func__)); - ntStatus = MtCmdPowerOnWiFiSys(pAd); - - if (ntStatus) - ntStatus = STATUS_UNSUCCESSFUL; - - /* poll SW_SYN0 == 1*/ - loop = 0; - - do { - value = MtAsicGetFwSyncValue(pAd); - - if (value == 0x1) - break; - - os_msec_delay(1); - loop++; - } while (loop <= 500); - - if (loop > 500) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: SW_SYN0 is not at init. state (SW_SYN0 = %d)\n", - __func__, value)); - ntStatus = STATUS_UNSUCCESSFUL; - } - - return ntStatus; -} -#endif - -INT32 CheckFWROMWiFiSysOn(IN RTMP_ADAPTER *pAd) -{ - INT32 ntStatus = STATUS_SUCCESS; -#if defined(RTMP_USB_SUPPORT) || defined(RTMP_PCI_SUPPORT) || \ - defined(MTK_UART_SUPPORT) - ntStatus = ATECheckFWROMWiFiSysOn(pAd); -#endif - return ntStatus; -} -INT32 FWSwitchToROM(IN RTMP_ADAPTER *pAd) -{ - INT32 ntStatus = STATUS_SUCCESS; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); -#ifdef COMPOS_TESTMODE_WIN /* Linux ready in FWRAM */ - - if (pAd->FWMode == FWROM) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: FWMode is already ROM\n", __func__)); - else if (pAd->FWMode == FWRAM) -#endif - { - /* Step 1 set firmware to ROM mode */ - /* ntStatus = FirmwareCommnadRestartDownloadFW(pAd); */ - /* if(ntStatus != STATUS_SUCCESS) */ - /* { */ - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR,("%s, RestartDownloadFW cmd failed\n",__FUNCTION__)); */ - /* } */ - NICRestartFirmware(pAd); - ntStatus = CheckFWROMWiFiSysOn(pAd); - - if (ntStatus != STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, CheckFWROMWiFiSysOn failed\n", - __func__)); - } - - return ntStatus; -} -void LoopBack_Start(RTMP_ADAPTER *pAd, struct _LOOPBACK_SETTING *pSetting) -{ - NTSTATUS ntStatus = STATUS_SUCCESS; - /* UINT16 BreakCount = 0; */ -#ifdef COMPOS_TESTMODE_WIN /* TODO::Fix the strcture */ -#endif - /* UINT32 Length = 0; */ - /* UINT32 RepeatIdx = 0; */ - UINT32 RxQ = 1; - /* RtlCopyMemory(&pAd->LoopBackSetting, pSetting,sizeof(struct _LOOPBACK_SETTING)); */ - os_move_mem(&pAd->LbCtrl.LoopBackSetting, pSetting, - sizeof(struct _LOOPBACK_SETTING)); - /* RtlZeroMemory(&pAd->LoopBackTxRaw, LOOPBACK_SIZE); */ - os_zero_mem(&pAd->LbCtrl.LoopBackTxRaw, LOOPBACK_SIZE); - /* RtlZeroMemory(&pAd->LoopBackRxRaw, LOOPBACK_SIZE); */ - os_zero_mem(&pAd->LbCtrl.LoopBackRxRaw, LOOPBACK_SIZE); - /* RtlZeroMemory(&pAd->LoopBackResult, sizeof(struct _LOOPBACK_RESULT)); */ - os_zero_mem(&pAd->LbCtrl.LoopBackResult, - sizeof(struct _LOOPBACK_RESULT)); - - if (pSetting->StartLen < sizeof(TMAC_TXD_L)) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s startLength(0x%x) is shorter than sizeof(TMAC_TXD_L) (0x%lx)\n", - __func__, pSetting->StartLen, - (ULONG)sizeof(TMAC_TXD_L))); - return; - } - - OS_SPIN_LOCK(&pAd->LbCtrl.LoopBackLock); - pAd->LbCtrl.LoopBackWaitRx = FALSE; - OS_SPIN_UNLOCK(&pAd->LbCtrl.LoopBackLock); - pAd->LbCtrl.LoopBackRunning = TRUE; - pAd->LbCtrl.LoopBackResult.Status = RUNNING; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IsDefaultPattern %d\n", pSetting->IsDefaultPattern)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RepeatTimes %u, %u\n", pSetting->RepeatTimes, - pAd->LbCtrl.LoopBackSetting.RepeatTimes)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("StartLen %d\n", pSetting->StartLen)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("StopLen %d\n", pSetting->StopLen)); - pAd->LbCtrl.LoopBackDefaultPattern = - (BOOLEAN)pSetting->IsDefaultPattern; - - if (pAd->LbCtrl.DebugMode) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("In LoopBack Debug Mode\n")); - goto ATE_LPBK_DEBUG; - } - - if (!pAd->LbCtrl.LoopBackUDMA) { - ntStatus = FWSwitchToROM(pAd); - - if (ntStatus != STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, Switch to ROM failed (0x%x)\n", __func__, - ntStatus)); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s FWSwitchToROM\n", __func__)); - } - - if (!pAd->LbCtrl.LoopBackUDMA) - MtCmdHIFLoopBackTest(pAd, 1, (UINT8)RxQ); - -ATE_LPBK_DEBUG: - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("***************************************%s @#@# Rx[%d]***************************************\n", - __func__, RxQ)); - /* pAd->LbCtrl.LoopBackTxThread = NULL; */ - /* - * ntStatus = PsCreateSystemThread(&pAd->LbCtrl.LoopBackTxTask.hThread, - * (ACCESS_MASK) 0L, - * NULL, - * NULL, - * NULL, - * LoopBack_TxThread, - * pAd); - */ - ntStatus = - RtmpOSTaskAttach(&pAd->LbCtrl.LoopBackTxTask, LoopBack_TxThread, - (ULONG)&pAd->LbCtrl.LoopBackTxTask); - - if (ntStatus != STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, thread create fail\n", __func__)); -} -void LoopBack_Stop(RTMP_ADAPTER *pAd) -{ - UINT32 BreakCount = 0; - - while (pAd->LbCtrl.LoopBackWaitRx == TRUE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, @#@#BreakCount = %d\n", __func__, BreakCount)); - - if (BreakCount > 100) - break; - -#ifdef COMPOS_TESTMODE_WIN - RTMPusecDelay(300); -#else - RtmpusecDelay(300); -#endif - BreakCount++; - } - - if (RtmpOSTaskKill(&pAd->LbCtrl.LoopBackTxTask) == NDIS_STATUS_FAILURE) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("kill LoopBackTxTask task failed!\n")); - - if (pAd->LbCtrl.LoopBackResult.Status == RUNNING) { - pAd->LbCtrl.LoopBackResult.Status = PASS; - pAd->LbCtrl.LoopBackResult.FailReason = NO_ERROR; - } - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("***************************************%s @#@#***************************************\n", - __func__)); - pAd->LbCtrl.LoopBackRunning = FALSE; - - if (pAd->LbCtrl.DebugMode) - goto ATE_LB_DEBUG_STOP; - - if (!pAd->LbCtrl.LoopBackUDMA) - MtCmdHIFLoopBackTest(pAd, 0, 0); - -ATE_LB_DEBUG_STOP: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s,\n", __func__)); -} -void LoopBack_Status(RTMP_ADAPTER *pAd, struct _LOOPBACK_RESULT *pResult) -{ - os_move_mem(pResult, &pAd->LbCtrl.LoopBackResult, - sizeof(struct _LOOPBACK_RESULT)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Status: %d\n", __func__, - pAd->LbCtrl.LoopBackResult.Status)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, FailReason: %d\n", __func__, - pAd->LbCtrl.LoopBackResult.FailReason)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, RxByteCount: %d\n", __func__, - pAd->LbCtrl.LoopBackResult.RxByteCount)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, RxPktCount: %d\n", __func__, - pAd->LbCtrl.LoopBackResult.RxPktCount)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, TxByteCount: %d\n", __func__, - pAd->LbCtrl.LoopBackResult.TxByteCount)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, TxPktCount: %d\n", __func__, - pAd->LbCtrl.LoopBackResult.TxPktCount)); -} -void LoopBack_RawData(RTMP_ADAPTER *pAd, UINT32 *pLength, BOOLEAN IsTx, - UCHAR *RawData) -{ - if (*pLength > LOOPBACK_SIZE) { - *pLength = LOOPBACK_SIZE; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, max length is %d\n", __func__, LOOPBACK_SIZE)); - } - - if (IsTx) { - *pLength = pAd->LbCtrl.LoopBackTxRawLen; - /* RtlCopyMemory(RawData, &pAd->LoopBackTxRaw,*pLength); */ - os_move_mem(RawData, &pAd->LbCtrl.LoopBackTxRaw, *pLength); - } else { - *pLength = pAd->LbCtrl.LoopBackRxRawLen; - /* RtlCopyMemory(RawData, &pAd->LoopBackRxRaw,*pLength); */ - os_move_mem(RawData, &pAd->LbCtrl.LoopBackRxRaw, *pLength); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Length = 0x%x\n", __func__, *pLength)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, LoopBackRxRawLen = 0x%x\n", __func__, - pAd->LbCtrl.LoopBackRxRawLen)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, LoopBackTxRawLen = 0x%x\n", __func__, - pAd->LbCtrl.LoopBackTxRawLen)); -} -void LoopBack_ExpectRx(RTMP_ADAPTER *pAd, UINT32 Length, UINT8 *pRawData) -{ - PULONG ptr; - UINT8 i = 0; - - if (Length > LOOPBACK_SIZE) { - Length = LOOPBACK_SIZE; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, max length is %d\n", __func__, LOOPBACK_SIZE)); - } - - /* (&pAd->LbCtrl.LoopBackExpectRx, pRawData, Length); */ - os_move_mem(&pAd->LbCtrl.LoopBackExpectRx, pRawData, Length); - ptr = (PULONG)(&pAd->LbCtrl.LoopBackExpectRx); - /* Length = ptr[0] & 0xffff; */ - pAd->LbCtrl.LoopBackExpectRxLen = Length; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Length = %d\n", __func__, Length)); - - for (i = 0; i < 20; i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("TXD(TXWI) %d 0x%08lX\n", i, *(ptr + i))); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s,\n", __func__)); -} - -void LoopBack_ExpectTx(RTMP_ADAPTER *pAd, UINT32 Length, UINT8 *pRawData) -{ - PULONG ptr; - UINT8 i = 0; - - if (Length > LOOPBACK_SIZE) { - Length = LOOPBACK_SIZE; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, max length is %d\n", __func__, LOOPBACK_SIZE)); - } - - /* RtlCopyMemory(&pAd->LoopBackExpectTx, pRawData, Length); */ - os_move_mem(&pAd->LbCtrl.LoopBackExpectTx, pRawData, Length); - ptr = (PULONG)(&pAd->LbCtrl.LoopBackExpectTx); - /* Length = ptr[0] & 0xffff; */ - pAd->LbCtrl.LoopBackExpectTxLen = Length; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Length = %d\n", __func__, Length)); - - for (i = 0; i < 20; i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("TXD(TXWI) %d 0x%08lX\n", i, *(ptr + i))); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s,\n", __func__)); -} - -void LoopBack_Run(RTMP_ADAPTER *pAd, struct _LOOPBACK_SETTING *pSetting, - UINT32 Length) -{ - if (Length > LOOPBACK_SIZE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, LOOPBACK length too long\n", __func__)); - return; - } - -#ifdef _RTMP_PCI_SUPPORT - PCILoopBack_Run(pAd, pSetting, Length); -#endif -} -void LoopBack_BitTrueCheck(RTMP_ADAPTER *pAd) -{ - if (!pAd->LbCtrl.LoopBackDefaultPattern) { /* Rx compare expect Rx */ - if (pAd->LbCtrl.LoopBackExpectRxLen != - pAd->LbCtrl.LoopBackRxRawLen) { - LoopBack_Fail(pAd, BIT_TRUE_FAIL); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ####################### TX/RX Length not equal ####################\n", - __func__)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ExpectRxLen = %d, RxRawLen = %d\n", - __func__, pAd->LbCtrl.LoopBackExpectRxLen, - pAd->LbCtrl.LoopBackRxRawLen)); - } else if (RTMPEqualMemory((PVOID)&pAd->LbCtrl.LoopBackExpectRx, - (PVOID)&pAd->LbCtrl.LoopBackRxRaw, - pAd->LbCtrl.LoopBackRxRawLen) == 0) { - if (pAd->LbCtrl.DebugMode) { - UINT32 j = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("RxExpect Dump(%u): ", - pAd->LbCtrl.LoopBackRxRawLen)); - - for (j = 0; j < pAd->LbCtrl.LoopBackRxRawLen; - j++) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%02x", - pAd->LbCtrl - .LoopBackExpectRx[j])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("RxBackRaw Dump: ")); - - for (j = 0; j < pAd->LbCtrl.LoopBackRxRawLen; - j++) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%02x", - pAd->LbCtrl.LoopBackRxRaw[j])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\n")); - } - - LoopBack_Fail(pAd, BIT_TRUE_FAIL); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ####################### BIT_TRUE_FAIL ####################\n", - __func__)); - } else - pAd->LbCtrl.LoopBackResult.FailReason = NO_ERROR; - } else { /* Rx compare Tx */ - if (pAd->LbCtrl.LoopBackTxRawLen != - pAd->LbCtrl.LoopBackRxRawLen) { - LoopBack_Fail(pAd, BIT_TRUE_FAIL); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ####################### TX/RX Length not equal ####################\n", - __func__)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, TxRawLen = %d, RxRawLen = %d\n", - __func__, pAd->LbCtrl.LoopBackTxRawLen, - pAd->LbCtrl.LoopBackRxRawLen)); - } else if (RTMPEqualMemory((PVOID)&pAd->LbCtrl.LoopBackTxRaw, - (PVOID)&pAd->LbCtrl.LoopBackRxRaw, - pAd->LbCtrl.LoopBackTxRawLen) == 0) { - if (pAd->LbCtrl.DebugMode) { - UINT32 j = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("TxExpect Dump(%u): ", - pAd->LbCtrl.LoopBackTxRawLen)); - - for (j = 0; j < pAd->LbCtrl.LoopBackRxRawLen; - j++) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%02x", - pAd->LbCtrl.LoopBackTxRaw[j])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("RxBackRaw Dump: ")); - - for (j = 0; j < pAd->LbCtrl.LoopBackRxRawLen; - j++) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%02x", - pAd->LbCtrl.LoopBackRxRaw[j])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("\n")); - } - - LoopBack_Fail(pAd, BIT_TRUE_FAIL); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ####################### BIT_TRUE_FAIL ####################\n", - __func__)); - } else { - pAd->LbCtrl.LoopBackResult.FailReason = NO_ERROR; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ####################### BIT_TRUE OK ####################\n", - __func__)); - } - } -} - -void LoopBack_Fail(RTMP_ADAPTER *pAd, enum _LOOPBACK_FAIL FailNum) -{ - if (pAd->LbCtrl.LoopBackResult.Status == RUNNING) { - pAd->LbCtrl.LoopBackResult.FailReason = FailNum; - pAd->LbCtrl.LoopBackResult.Status = FAIL; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, FailReason = %d\n", __func__, FailNum)); - } -} - -#ifdef COMPOS_TESTMODE_WIN -INT LoopBack_TxThread(IN OUT PVOID Context) -#else -INT LoopBack_TxThread(ULONG Context) -#endif -{ -#ifdef COMPOS_TESTMODE_WIN - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)Context; -#else - RTMP_OS_TASK *pTask = (RTMP_OS_TASK *)Context; - RTMP_ADAPTER *pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask); -#endif - struct _LOOPBACK_SETTING *pSetting = &pAd->LbCtrl.LoopBackSetting; - UINT32 RepeatIdx = 0; - UINT32 Length = 0; - UINT32 BreakCount = 0; - UINT32 DbgCount = 0; - /* KIRQL Irql; */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Repeat:%u\n", __func__, pSetting->RepeatTimes)); - - if (pSetting->RepeatTimes == 0) - pSetting->RepeatTimes = 0xffffffff; - - for (RepeatIdx = 0; RepeatIdx < pSetting->RepeatTimes; RepeatIdx++) { - if (pSetting->RepeatTimes == 0xffffffff) - RepeatIdx = 0; - - for (Length = pSetting->StartLen; Length <= pSetting->StopLen; - Length++) { - while (pAd->LbCtrl.LoopBackWaitRx) { - BreakCount++; -#ifdef COMPOS_TESTMODE_WIN - RTMPusecDelay(50); -#else - RtmpusecDelay(50); -#endif - - if (BreakCount > 2000) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s, no Rx come back Stop1!!!\n", - __func__)); - break; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s, no Rx BreakCount = %d\n", - __func__, BreakCount)); - } - - if (BreakCount > 2000) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s, no Rx come back Stop2!!!\n", - __func__)); - LoopBack_Fail(pAd, RX_TIMEOUT); - break; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, Length = %d\n", __func__, Length)); - BreakCount = 0; - - if (pAd->LbCtrl.LoopBackRunning == FALSE || - pAd->LbCtrl.LoopBackResult.Status != RUNNING) - break; - - if (!pSetting->IsDefaultPattern) - Length = pAd->LbCtrl.LoopBackExpectTxLen; - - if (pAd->LbCtrl.LoopBackResult.Status == RUNNING) { - /* KeAcquireSpinLock(&pAd->LoopBackLock, &Irql); */ - OS_SPIN_LOCK(&pAd->LbCtrl.LoopBackLock); - pAd->LbCtrl.LoopBackWaitRx = TRUE; - /* KeReleaseSpinLock(&pAd->LoopBackLock, Irql); */ - OS_SPIN_UNLOCK(&pAd->LbCtrl.LoopBackLock); - LoopBack_Run(pAd, pSetting, Length); - - if (pAd->LbCtrl.LoopBackRunning == FALSE || - pAd->LbCtrl.LoopBackResult.Status != - RUNNING) - break; - } - -#ifdef COMPOS_TESTMODE_WIN - RTMPusecDelay(200); -#else - RtmpusecDelay(200); -#endif - DbgCount++; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, DbgCount = %d\n", __func__, DbgCount)); - - if (!pSetting->IsDefaultPattern) { - /* use script file does not need to auto increase length */ - break; - } - } - - if (pAd->LbCtrl.LoopBackRunning == FALSE || - pAd->LbCtrl.LoopBackResult.Status != RUNNING) - break; - } - - if (pAd->LbCtrl.LoopBackRunning) - LoopBack_Stop(pAd); - - /* pAd->LbCtrl.LoopBackTxThread = NULL; */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("+ + + + Control Thread Terminated + + + +\n")); - /* DecrementIoCount(pAd); */ - /* PsTerminateSystemThread(STATUS_SUCCESS); */ - RtmpOSTaskNotifyToExit(&pAd->LbCtrl.LoopBackTxTask); - return 0; -} - -VOID LoopBack_Rx(RTMP_ADAPTER *pAd, UINT32 pktlen, UINT8 *pData) -{ - if (!pAd->LbCtrl.LoopBackRunning && !pAd->LbCtrl.LoopBackWaitRx) - return; - - { - UINT32 LPLength = 0; - INT32 TotalLength = (INT32)pktlen; - UINT8 *ptr = pData; - EVENT_RXD EvnRxD; - - /* FwCMDRspTxD_STRUC FwCMDRspTxD; */ - if (pAd->LbCtrl.DebugMode) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Debug Mode, Total Len:%d\n", __func__, - TotalLength)); - LPLength = pktlen; - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Driver Rx LoopBackRunning\n")); - /* os_move_mem(&FwCMDRspTxD,ptr,sizeof(FwCMDRspTxD)); */ - os_move_mem(&EvnRxD, ptr, sizeof(EvnRxD)); - /* LPLength = FwCMDRspTxD.FwEventTxD.u2RxByteCount; */ - LPLength = EvnRxD.fw_rxd_0.field.length; - - if (LPLength > LOOPBACK_SIZE) { - LPLength = LOOPBACK_SIZE; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, max length is %d\n", __func__, - LOOPBACK_SIZE)); - } - } - - { -#ifdef COMPOS_TESTMODE_WIN /* Windows First -4 for padding bits and then add back here,Linux(?) */ - - if (!pAd->LbCtrl.LoopBackSetting.IsDefaultPattern) - LPLength = TotalLength + 4; - -#endif - /* RtlCopyMemory(&FwCMDRspTxD,ptr,sizeof(FwCMDRspTxD)); */ - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Total Length = %d, LPLength is %d, bytecount = %d\n", - __func__, TotalLength, LPLength, - EvnRxD.fw_rxd_0.field.length)); - /* LPLength = FwCMDRspTxD.FwEventTxD.u2RxByteCount; */ - pAd->LbCtrl.LoopBackResult.RxByteCount += LPLength; - pAd->LbCtrl.LoopBackResult.RxPktCount++; - os_move_mem(&pAd->LbCtrl.LoopBackRxRaw, ptr, LPLength); - pAd->LbCtrl.LoopBackRxRawLen = LPLength; - } - - if (pAd->LbCtrl.LoopBackUDMA == FALSE) - LoopBack_BitTrueCheck(pAd); - - /* KeAcquireSpinLock(&pAdapter->LoopBackLock, &Irql); */ - OS_SPIN_LOCK(&pAd->LbCtrl.LoopBackLock); - pAd->LbCtrl.LoopBackWaitRx = FALSE; - /* KeReleaseSpinLock(&pAdapter->LoopBackLock, Irql); */ - OS_SPIN_UNLOCK(&pAd->LbCtrl.LoopBackLock); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, RxPktCount = %d\n", __func__, - pAd->LbCtrl.LoopBackResult.RxPktCount)); - } -} - -/* currently not implement PCIE loopback */ -#ifdef _RTMP_PCI_SUPPORT -void PCILoopBack_Run(RTMP_ADAPTER *pAd, struct _LOOPBACK_SETTING *pSetting, - UINT32 length) -{ - UINT32 count = 0; - TMAC_TXD_L TxD; - PUCHAR ptr; - UINT8 alignment = 0; - /* UINT32 TimeOut1Second = 100; */ - UCHAR *TxDataBuffer = NULL; - UINT32 *TxDataBufferLength; - UINT32 BUF_SIZE = 0; -#ifdef COMPOS_TESTMODE_WIN - TxDataBuffer = pAd->TxDataBuffer; - BUF_SIZE = BUFFER_SIZE; - TxDataBufferLength = &pAd->TxDataBufferLength; -#else - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - - TxDataBuffer = pAd->ATECtrl.pate_pkt; - BUF_SIZE = ATE_TESTPKT_LEN; - TxDataBufferLength = &pAd->ATECtrl.TxLength; -#endif - - /* length = 1024; */ - if (pSetting->IsDefaultPattern) { - os_zero_mem(TxDataBuffer, BUF_SIZE); - os_zero_mem(&TxD, sizeof(TxD)); - ptr = TxDataBuffer + sizeof(TxD); - - for (count = 0; count < length - sizeof(TxD); count++) - ptr[count] = count % 16; - - /* set pkt content */ - TxD.TxD0.TxByteCount = length; -#ifndef MT7615 - TxD.TxD0.PIdx = 1; - TxD.TxD0.QIdx = 0; - TxD.TxD1.TxDFmt = 1; - TxD.TxD1.HdrFmt = 1; -#endif - os_move_mem(TxDataBuffer, &TxD, sizeof(TxD)); - os_move_mem(&pAd->LbCtrl.LoopBackTxRaw, TxDataBuffer, - LOOPBACK_SIZE); - pAd->LbCtrl.LoopBackTxRawLen = length; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, length = %d\n", __func__, length)); - - if (length > 32) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===buffer===\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%x 0x%x 0x%x 0x%x\n", TxDataBuffer[3], - TxDataBuffer[2], TxDataBuffer[1], - TxDataBuffer[0])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%x 0x%x 0x%x 0x%x\n", TxDataBuffer[7], - TxDataBuffer[6], TxDataBuffer[5], - TxDataBuffer[4])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%x 0x%x 0x%x 0x%x\n", TxDataBuffer[11], - TxDataBuffer[10], TxDataBuffer[9], - TxDataBuffer[8])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%x 0x%x 0x%x 0x%x\n", TxDataBuffer[15], - TxDataBuffer[14], TxDataBuffer[13], - TxDataBuffer[12])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%x 0x%x 0x%x 0x%x\n", TxDataBuffer[19], - TxDataBuffer[18], TxDataBuffer[17], - TxDataBuffer[16])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%x 0x%x 0x%x 0x%x\n", TxDataBuffer[23], - TxDataBuffer[22], TxDataBuffer[21], - TxDataBuffer[20])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%x 0x%x 0x%x 0x%x\n", TxDataBuffer[27], - TxDataBuffer[26], TxDataBuffer[25], - TxDataBuffer[24])); - } - - if (length % 4 != 0) - alignment = 4 - (length % 4); - - if (pAd->LbCtrl.DebugMode) { - int j = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Tx Dump: ")); - - for (j = 0; j < length; j++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%02x", TxDataBuffer[j])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n")); - } - - /* pAd->TxDataBufferLength = length + alignment + 4 ; */ - *TxDataBufferLength = length + alignment + 4; - } else { - os_move_mem(TxDataBuffer, &pAd->LbCtrl.LoopBackExpectTx, - pAd->LbCtrl.LoopBackExpectTxLen); - os_zero_mem(TxDataBuffer + length, - pAd->LbCtrl.LoopBackExpectTxLen - length); - os_move_mem(&pAd->LbCtrl.LoopBackTxRaw, TxDataBuffer, length); - pAd->LbCtrl.LoopBackTxRawLen = pAd->LbCtrl.LoopBackExpectTxLen; - /* pAd->LoopBackExpectRxLen = length; */ - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, LP length = %d, alignment = %d\n", __func__, length, - alignment)); - pAd->LbCtrl.LoopBackResult.TxByteCount += length; - pAd->LbCtrl.LoopBackResult.TxPktCount++; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, RxPktCount = %d\n", __func__, - pAd->LbCtrl.LoopBackResult.RxPktCount)); -#ifdef COMPOS_TESTMODE_WIN - StartTx(pAd, 1, 0); -#else - ate_ctrl->TxLength = length; - MT_ATETxPkt(pAd, TESTMODE_BAND0); -#endif - - /* cannot pass UINT32 TimeOut1Second = 100; to wait_event, it will not wait.. workaround use 0 (1second instead of TimeOut1Second) */ - if (!pAd->LbCtrl.DebugMode) - if (RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT( - &pAd->LbCtrl.LoopBackPCITxEvent, 0) != - STATUS_SUCCESS) { - LoopBack_Fail(pAd, TX_TIMEOUT); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ####################### TX_TIMEOUT ####################3\n", - __func__)); - } -} -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/ate_agent.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/ate_agent.c deleted file mode 100644 index 1fceb4aeb3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/ate_agent.c +++ /dev/null @@ -1,6657 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - ate_agent.c -*/ - -#include "rt_config.h" - -#define MCAST_WCID_TO_REMOVE 0 /* Pat: TODO */ - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#define ATE_ANT_USER_SEL 0x80000000 -#endif - -/* CCK Mode */ -static CHAR CCKRateTable[] = { 0, 1, 2, 3, 8, 9, 10, 11, -1 }; - -/* OFDM Mode */ -static CHAR OFDMRateTable[] = { 0, 1, 2, 3, 4, 5, 6, 7, -1 }; - -/* HT Mixed Mode */ -static CHAR HTMIXRateTable[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, -1 }; - -/* VHT Mode */ -static CHAR VHTRateTable[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1 }; - -UINT_8 Addr1[6] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; -UINT_8 Addr2[6] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; -UINT_8 Addr3[6] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; - -#if defined(TXBF_SUPPORT) && defined(MT_MAC) -UCHAR TemplateFrame[32] = { 0x88, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0xAA, 0xBB, 0x12, 0x34, 0x56, - 0x00, 0x11, 0x22, 0xAA, 0xBB, 0xCC, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -extern UINT8 BF_ON_certification; -extern UINT8 g_EBF_certification; -#else -static UCHAR TemplateFrame[32] = { 0x08, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x00, 0xAA, 0xBB, 0x12, - 0x34, 0x56, 0x00, 0x11, 0x22, 0xAA, 0xBB, - 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 }; -#endif /* defined(TXBF_SUPPORT) && defined(MT_MAC) */ - -INT32 SetTxStop(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetRxStop(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -#ifdef DBG -VOID ATE_QA_Statistics(RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI, - RXINFO_STRUC *pRxInfo, PHEADER_802_11 pHeader) -{ -} - -INT32 SetEERead(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetEEWrite(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetBBPRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetBBPWrite(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetRFWrite(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} -#endif /* DBG */ - -VOID EEReadAll(PRTMP_ADAPTER pAd, UINT16 *Data, UINT16 size) -{ - UINT16 Offset = 0; - UINT16 Value; - - for (Offset = 0; Offset < (size >> 1);) { - RT28xx_EEPROM_READ16(pAd, (Offset << 1), Value); - Data[Offset] = Value; - Offset++; - } -} - -INT32 SetATEDaByWtblTlv(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Octet; - RTMP_STRING *Value; - /* Tag = 0, Generic */ - CMD_WTBL_GENERIC_T rWtblGeneric = { 0 }; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Da = %s\n", __func__, Arg)); - - /* Mac address acceptable format 01:02:03:04:05:06 length 17 */ - - if (strlen(Arg) != 17) - return FALSE; - - for (Octet = 0, Value = rstrtok(Arg, ":"); Value; - Value = rstrtok(NULL, ":")) { - /* sanity check */ - if ((strlen(Value) != 2) || (!isxdigit(*Value)) || - (!isxdigit(*(Value + 1)))) - return FALSE; - -#ifdef CONFIG_AP_SUPPORT - AtoH(Value, &ATECtrl->Addr1[Octet++], 1); -#endif /* CONFIG_AP_SUPPORT */ - } - - /* sanity check */ - if (Octet != MAC_ADDR_LEN) - return FALSE; - -#ifdef MT_MAC - /* WIndex = 1, WTBL1: PeerAddress */ - rWtblGeneric.u2Tag = WTBL_GENERIC; - rWtblGeneric.u2Length = sizeof(CMD_WTBL_GENERIC_T); - NdisMoveMemory(rWtblGeneric.aucPeerAddress, ATECtrl->Addr3, - MAC_ADDR_LEN); - CmdExtWtblUpdate(pAd, 1 /**/, SET_WTBL, (PUCHAR)&rWtblGeneric, - sizeof(CMD_WTBL_GENERIC_T)); -#endif -#ifdef CONFIG_AP_SUPPORT - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: (DA = %02x:%02x:%02x:%02x:%02x:%02x)\n", __func__, - ATECtrl->Addr1[0], ATECtrl->Addr1[1], ATECtrl->Addr1[2], - ATECtrl->Addr1[3], ATECtrl->Addr1[4], ATECtrl->Addr1[5])); -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} -INT32 SetATEQid(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - USHORT q_idx; - - q_idx = simple_strtol(Arg, 0, 10); - ATECtrl->QID = q_idx; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: QID:%u\n", __func__, q_idx)); - return TRUE; -} - -INT32 SetATETxSEnable(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UINT32 param = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Parm = %s\n", __func__, Arg)); - - param = simple_strtol(Arg, 0, 10); - ATECtrl->txs_enable = param; - - return TRUE; -} - -INT32 SetATERxFilter(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - enum { param_num = 3 }; - MT_RX_FILTER_CTRL_T rx_filter; - UINT32 input[param_num]; - CHAR *value; - INT i; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Parm = %s\n", __func__, arg)); - - for (i = 0; i < param_num; i++) - input[i] = 0; - - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":")) { - if (i == param_num) - break; - - input[i++] = simple_strtol(value, 0, 16); - } - - os_zero_mem(&rx_filter, sizeof(rx_filter)); - rx_filter.bPromiscuous = input[0]; - rx_filter.bFrameReport = input[1]; - rx_filter.filterMask = input[2]; - rx_filter.u1BandIdx = control_band_idx; - MtATESetRxFilter(pAd, rx_filter); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Promiscuous:%x, FrameReport:%x, filterMask:%x\n", - __func__, rx_filter.bPromiscuous, rx_filter.bFrameReport, - rx_filter.filterMask)); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATERxStream(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 param = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Parm = %s\n", __func__, Arg)); - - param = simple_strtol(Arg, 0, 10); - Ret = MtATESetRxPath(pAd, param, control_band_idx); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxStream(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 param = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Parm = %s\n", __func__, Arg)); - - param = simple_strtol(Arg, 0, 10); - Ret = MtATESetTxStream(pAd, param, control_band_idx); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEMACTRx(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - enum { param_num = 3 }; - UINT32 input[param_num]; - CHAR *value; - INT i; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Parm = %s\n", __func__, arg)); - - for (i = 0; i < param_num; i++) - input[i] = 0; - - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":")) { - if (i == param_num) - break; - - input[i++] = simple_strtol(value, 0, 16); - } - - Ret = MtATESetMacTxRx(pAd, input[0], input[1], control_band_idx); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEMPSStart(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = 0; - UINT enable; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Parm = %s\n", __func__, arg)); - - enable = simple_strtol(arg, 0, 10); - - if (enable) - ret = ATEOp->MPSTxStart(pAd); - else - ret = ATEOp->MPSTxStop(pAd); - - if (!ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEMPSDump(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT ret = 0; - UINT32 band_idx = simple_strtol(arg, 0, 10); - - ret = MT_SetATEMPSDump(pAd, band_idx); - - if (!ret) - return TRUE; - - return FALSE; -} - -static INT32 SetATEMPSParam(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg, - UINT type) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - INT num_items = 0; - CHAR *value; - RTMP_STRING *tmp = arg; - UINT32 *mps_setting = NULL; - INT i; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Parm = %s\n", __func__, arg)); - - value = rstrtok(tmp, ":"); - - if (!value) - goto err0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("value:%s, arg:%s, tmp:%s\n", value, arg, tmp)); - num_items = simple_strtol(value, 0, 10); - - if (!num_items) - goto err0; - - Ret = os_alloc_mem(pAd, (UCHAR **)&mps_setting, - sizeof(UINT32) * (num_items)); - - if (Ret) - goto err1; - - for (i = 0, value = rstrtok(NULL, ":"); value; - value = rstrtok(NULL, ":")) { - if (i == num_items) - break; - - mps_setting[i++] = simple_strtol(value, 0, 10); - } - - if (i != num_items) - goto err2; - - ATEOp->MPSSetParm(pAd, type, num_items, mps_setting); - - if (mps_setting) - os_free_mem(mps_setting); - - return TRUE; -err2: - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Number of items %d is not matched with number of params %d\n", - __func__, num_items, i)); - - if (mps_setting) - os_free_mem(mps_setting); - -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Mem allocate fail\n", __func__)); -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: [%u]Format: num_itmes:param1:param2:...\n", __func__, - type)); - return FALSE; -} - -INT32 SetATEMPSPhyMode(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 ret = 0; - - ret = SetATEMPSParam(pAd, arg, MPS_PHYMODE); - return ret; -} - -INT32 SetATEMPSRate(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 ret = 0; - - ret = SetATEMPSParam(pAd, arg, MPS_RATE); - return ret; -} - -INT32 SetATEMPSPath(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 ret = 0; - - ret = SetATEMPSParam(pAd, arg, MPS_PATH); - return ret; -} - -INT32 SetATEMPSPayloadLen(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 ret = 0; - - ret = SetATEMPSParam(pAd, arg, MPS_PAYLOAD_LEN); - return ret; -} - -INT32 SetATEMPSPktCnt(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 ret = 0; - - ret = SetATEMPSParam(pAd, arg, MPS_TX_COUNT); - return ret; -} - -INT32 SetATEMPSPwr(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 ret = 0; - - ret = SetATEMPSParam(pAd, arg, MPS_PWR_GAIN); - return ret; -} - -INT32 SetATEMPSNss(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 ret = 0; - - ret = SetATEMPSParam(pAd, arg, MPS_NSS); - return ret; -} - -INT32 SetATEMPSPktBw(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 ret = 0; - - ret = SetATEMPSParam(pAd, arg, MPS_PKT_BW); - return ret; -} - -INT32 SetATELOGDump(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_LOG_DUMP_CB *log_cb = &ATECtrl->log_dump[0]; - UINT32 log_type; - - log_type = simple_strtol(Arg, 0, 10); - - if (log_type == 0 || log_type >= ATE_LOG_TYPE_NUM) - return FALSE; - - log_cb = &ATECtrl->log_dump[log_type - 1]; - MT_ATEDumpLog(pAd, log_cb, log_type); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: log_type:%08x, driver:%08x\n", __func__, log_type, - ATECtrl->en_log)); - return TRUE; -} - -INT32 SetATELOGEnable(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 log_type; - INT32 Ret = 0; - - log_type = simple_strtol(Arg, 0, 10); - Ret = ATEOp->LogOnOff(pAd, log_type, TRUE, 2000); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: log_type:%u, driver:%08x\n", __func__, log_type, - ATECtrl->en_log)); - return TRUE; -} - -INT32 SetATELOGDisable(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 log_type; - INT32 Ret = 0; - - log_type = simple_strtol(Arg, 0, 10); - Ret = ATEOp->LogOnOff(pAd, log_type, FALSE, 0); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: log_type:%u, driver:%08x\n", __func__, log_type, - ATECtrl->en_log)); - return TRUE; -} - -INT32 SetATEDeqCnt(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ -#ifdef ATE_TXTHREAD - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT deq_cnt; - - deq_cnt = simple_strtol(Arg, 0, 10); - ATECtrl->deq_cnt = deq_cnt; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: deq_cnt:%d\n", __func__, deq_cnt)); -#endif - return TRUE; -} - -INT32 SetATEDa(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - return SetATEDaByWtblTlv(pAd, Arg); -} - -INT32 SetATESa(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - RTMP_STRING *Value; - INT32 Octet; - struct wifi_dev *wdev = pAd->wdev_list[ATECtrl->wdev_idx]; - UCHAR BandIdx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Sa = %s\n", __func__, Arg)); - - /* Mac address acceptable format 01:02:03:04:05:06 length 17 */ - if (strlen(Arg) != 17) - return FALSE; - - for (Octet = 0, Value = rstrtok(Arg, ":"); Value; - Value = rstrtok(NULL, ":")) { - /* sanity check */ - if ((strlen(Value) != 2) || (!isxdigit(*Value)) || - (!isxdigit(*(Value + 1)))) - return FALSE; - -#ifdef CONFIG_AP_SUPPORT - AtoH(Value, &ATECtrl->Addr3[Octet++], 1); -#endif /* CONFIG_AP_SUPPORT */ - } - - /* sanity check */ - if (Octet != MAC_ADDR_LEN) - return FALSE; - -#ifdef MT_MAC - /* Set the specific MAC to ASIC */ - /* TODO: Hanmin H/W HAL offload, below code is replaced by new code above, right PIC needs further check */ -#ifdef CONFIG_AP_SUPPORT - BandIdx = HcGetBandByWdev(wdev); - AsicDevInfoUpdate(pAd, 0x0, ATECtrl->Addr3, BandIdx, TRUE, - DEVINFO_ACTIVE_FEATURE); -#endif /* CONFIG_AP_SUPPORT */ -#endif -#ifdef CONFIG_AP_SUPPORT - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: (SA = %02x:%02x:%02x:%02x:%02x:%02x)\n", __func__, - ATECtrl->Addr3[0], ATECtrl->Addr3[1], ATECtrl->Addr3[2], - ATECtrl->Addr3[3], ATECtrl->Addr3[4], ATECtrl->Addr3[5])); -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -INT32 SetATEBssid(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - RTMP_STRING *Value; - INT32 Octet; - - /* Mac address acceptable format 01:02:03:04:05:06 length 17 */ - if (strlen(Arg) != 17) - return FALSE; - - for (Octet = 0, Value = rstrtok(Arg, ":"); Value; - Value = rstrtok(NULL, ":")) { - /* sanity check */ - if ((strlen(Value) != 2) || (!isxdigit(*Value)) || - (!isxdigit(*(Value + 1)))) - return FALSE; - -#ifdef CONFIG_AP_SUPPORT - AtoH(Value, &ATECtrl->Addr2[Octet++], 1); -#endif /* CONFIG_AP_SUPPORT */ - } - - /* sanity check */ - if (Octet != MAC_ADDR_LEN) - return FALSE; - -#ifdef CONFIG_AP_SUPPORT - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: (BSSID = %02x:%02x:%02x:%02x:%02x:%02x)\n", __func__, - ATECtrl->Addr2[0], ATECtrl->Addr2[1], ATECtrl->Addr2[2], - ATECtrl->Addr2[3], ATECtrl->Addr2[4], ATECtrl->Addr2[5])); -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -INT32 SetATEInitChan(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetADCDump(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATERFPower(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 RFPower; - UINT32 band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Power0 = %s\n", __FUNCTION__, Arg)); - - RFPower = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RF_Power = %d, band_idx = %d \n", __FUNCTION__, RFPower, - band_idx)); - - TESTMODE_SET_PARAM(ATECtrl, band_idx, RF_Power, RFPower); - - return TRUE; -} - -INT32 SetATEDigitalPower(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Digital_Power = 0; - UINT32 band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Power0 = %s\n", __FUNCTION__, Arg)); - - Digital_Power = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Digital_Power = %d, band_idx = %d \n", __FUNCTION__, - Digital_Power, band_idx)); - - TESTMODE_SET_PARAM(ATECtrl, band_idx, Digital_Power, Digital_Power); - - return TRUE; -} - -INT32 SetATEDCOffset_I(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 DCOffset_I = 0; - UINT32 band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: DCOffset_I = %s\n", __FUNCTION__, Arg)); - - DCOffset_I = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: DCOffset_I = %d, band_idx = %d \n", __FUNCTION__, - DCOffset_I, band_idx)); - - TESTMODE_SET_PARAM(ATECtrl, band_idx, DcOffset_I, DCOffset_I); - - return TRUE; -} - -INT32 SetATEDCOffset_Q(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 DCOffset_Q = 0; - UINT32 band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: DCOffset_Q = %s\n", __FUNCTION__, Arg)); - - DCOffset_Q = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: DCOffset_Q = %d, band_idx = %d \n", __FUNCTION__, - DCOffset_Q, band_idx)); - - TESTMODE_SET_PARAM(ATECtrl, band_idx, DcOffset_Q, DCOffset_Q); - - return TRUE; -} - -INT32 SetATETxPower0(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - ATE_TXPOWER TxPower; - CHAR Power; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Power0 = %s\n", __func__, Arg)); - Power = simple_strtol(Arg, 0, 10); - ATECtrl->TxPower0 = Power; - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Power = Power; - TxPower.Dbdc_idx = ATECtrl->control_band_idx; - Ret = ATEOp->SetTxPower0(pAd, TxPower); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxPower1(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - ATE_TXPOWER TxPower; - CHAR Power; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Power1 = %s\n", __func__, Arg)); - Power = simple_strtol(Arg, 0, 10); - ATECtrl->TxPower1 = Power; - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Power = Power; - TxPower.Dbdc_idx = ATECtrl->control_band_idx; - Ret = ATEOp->SetTxPower1(pAd, TxPower); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxPower2(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - ATE_TXPOWER TxPower; - CHAR Power; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Power2 = %s\n", __func__, Arg)); - Power = simple_strtol(Arg, 0, 10); - ATECtrl->TxPower2 = Power; - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Power = Power; - TxPower.Dbdc_idx = ATECtrl->control_band_idx; - Ret = ATEOp->SetTxPower2(pAd, TxPower); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxPower3(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - ATE_TXPOWER TxPower; - CHAR Power; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Power3 = %s\n", __func__, Arg)); - Power = simple_strtol(Arg, 0, 10); - ATECtrl->TxPower3 = Power; - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Power = Power; - TxPower.Dbdc_idx = ATECtrl->control_band_idx; - Ret = ATEOp->SetTxPower3(pAd, TxPower); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEForceTxPower(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT8 ParamIdx; - CHAR *value = 0; - INT_8 cTxPower = 0; - UINT8 ucPhyMode = 0; - UINT8 ucTxRate = 0; - UINT8 ucBW = 0; - - /* Sanity check for input parameter */ - if (!Arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No Parameters !! \n", __FUNCTION__)); - goto err1; - } - - /* Sanity check for input parameter format */ - if (strlen(Arg) != 11) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong Parameter Format !!\n", __FUNCTION__)); - goto err1; - } - - /* Parsing input parameter */ - for (ParamIdx = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":"), ParamIdx++) { - switch (ParamIdx) { - case 0: - ucPhyMode = - simple_strtol(value, 0, 10); /* 2-bit format */ - break; - case 1: - ucTxRate = - simple_strtol(value, 0, 10); /* 2-bit format */ - break; - case 2: - ucBW = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - case 3: - cTxPower = - simple_strtol(value, 0, 10); /* 2-bit format */ - break; - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set Too Much Parameters !!\n", - __func__)); - goto err1; - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Band(%d), TxMode(%d), MCS(%d), BW(%d), TxPower(%d)\n", - __func__, control_band_idx, ucPhyMode, ucTxRate, ucBW, - cTxPower)); - - /* Command Handler for Force Power Control */ - Ret = ATEOp->SetTxForceTxPower(pAd, cTxPower, ucPhyMode, ucTxRate, - ucBW); - - if (!Ret) - return TRUE; - else - return FALSE; -err1: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN - "Please input parameter via format \"Phymode:TxRate:BW:TxPower\"\n" KNRM)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN "Phymode:\n" KNRM)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN - " (2-digit) 0: CCK, 1: OFDM, 2: HT-MIXED, 3: HT-GREEN, 4: VHT\n" KNRM)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN "TxRate:\n" KNRM)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN - " (2-digit) CCK: 00~03, OFDM: 00~07, HT-MIXED: 00~07, HT-GREEN: 00~07, VHT: 00~09\n" KNRM)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN "BW:\n" KNRM)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN - " (2-digit) 0: BW20, 1: BW40, 2: BW80, 3:BW160\n" KNRM)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN "TxPower:\n" KNRM)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KGRN " (2-digit) absolute Tx power (unit: 0.5dB)\n" KNRM)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KRED - "Ex: iwpriv ra0 set ATEFORCETXPOWER=02:00:00:16\n" KNRM)); - return FALSE; -} - -INT32 SetATETxPowerEvaluation(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxAntenna(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 Ant = 1; - enum { idx_num = 2 }; - UINT32 param[idx_num]; - UINT8 loop_index = 0; - CHAR *value; -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - UINT32 mode = 0; -#endif - - /* Sanity check for input parameter */ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - goto err0; - } - - /* TX path setting */ - if (!strchr(Arg, ':')) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Ant = %scontrol_band_idx = %d\n", __func__, Arg, - control_band_idx)); - Ant = simple_strtol(Arg, 0, 10); - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Mode:Value = %s, control_band_idx = %d\n", - __func__, Arg, control_band_idx)); - - for (loop_index = 0; loop_index < idx_num; loop_index++) - param[loop_index] = 0; - - for (loop_index = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if (loop_index == idx_num) - break; - - param[loop_index] = simple_strtol(value, 0, 10); - loop_index++; - } - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - mode = param[0]; - - if (mode == ANT_MODE_SPE_IDX) - Ant = param[1] | ATE_ANT_USER_SEL; - else - Ant = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, - TxAntennaSel); - -#else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No need to set Spe_idx.\n", __func__)); - goto err0; -#endif /* defined(MT7615) || defined(MT7622) */ - } - - Ret = ATEOp->SetTxAntenna(pAd, Ant); - - if (!Ret) - return TRUE; - -err0: - return FALSE; -} - -INT32 SetATERxAntenna(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - CHAR Ant; - - /* Sanity check for input parameter */ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - goto err0; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Ant = %s\n", __func__, Arg)); - Ant = simple_strtol(Arg, 0, 10); - Ret = ATEOp->SetRxAntenna(pAd, Ant); - - if (!Ret) - return TRUE; - -err0: - return FALSE; -} - -INT32 Default_Set_ATE_TX_FREQ_OFFSET_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxFreqOffset(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - UINT32 FreqOffset; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: FreqOffset = %s\n", __func__, Arg)); - FreqOffset = simple_strtol(Arg, 0, 10); - Ret = ATEOp->SetTxFreqOffset(pAd, FreqOffset); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 Default_Set_ATE_TX_BW_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxLength(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 TxLength; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TxLength = %s, control_band_idx = %d\n", __func__, Arg, - control_band_idx)); - - TxLength = simple_strtol(Arg, 0, 10); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxLength, TxLength); - return TRUE; -} - -INT32 SetATETxCount(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 TxCount = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TxCount = %s, control_band_idx = %d\n", __func__, Arg, - control_band_idx)); - - TxCount = simple_strtol(Arg, 0, 10); - - if (TxCount == 0) - TxCount = 0xFFFFFFFF; - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxCount, TxCount); - return TRUE; -} - -INT32 CheckMCSValid(PRTMP_ADAPTER pAd, UCHAR PhyMode, UCHAR Mcs) -{ - int Index; - PCHAR pRateTab = NULL; - - switch (PhyMode) { - case MODE_CCK: - pRateTab = CCKRateTable; - break; - - case MODE_OFDM: - pRateTab = OFDMRateTable; - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - pRateTab = HTMIXRateTable; - break; - - case MODE_VHT: - pRateTab = VHTRateTable; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unrecognizable Tx Mode %d\n", __func__, - PhyMode)); - return -1; - } - - Index = 0; - - while (pRateTab[Index] != -1) { - if (pRateTab[Index] == Mcs) - return 0; - - Index++; - } - - return -1; -} - -INT32 SetATETxMcs(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR Mcs, PhyMode = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Mcs = %s, control_band_idx = %d\n", __func__, Arg, - control_band_idx)); - - PhyMode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode); - Mcs = simple_strtol(Arg, 0, 10); - Ret = CheckMCSValid(pAd, PhyMode, Mcs); - - if (Ret != -1) - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mcs, Mcs); - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Out of range, refer to rate table.\n", - __func__)); - goto err0; - } - - return TRUE; -err0: - return FALSE; -} - -INT32 SetATEVhtNss(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR Nss = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Nss = %s, control_band_idx = %d\n", __func__, Arg, - control_band_idx)); - - Nss = simple_strtol(Arg, 0, 10); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Nss, Nss); - return TRUE; -} - -INT32 SetATETxLdpc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR Ldpc; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Ldpc = %s, control_band_idx = %d\n", __func__, Arg, - control_band_idx)); - - Ldpc = simple_strtol(Arg, 0, 10); - - if (Ldpc > 1) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Out of range (%d)\n", __func__, Ldpc)); - return FALSE; - } - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Ldpc, Ldpc); - return TRUE; -} - -INT32 SetATETxStbc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR Stbc; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Stbc = %s, control_band_idx = %d\n", __func__, Arg, - control_band_idx)); - - Stbc = simple_strtol(Arg, 0, 10); - - if (Stbc > 1) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Out of range (%d)\n", __func__, Stbc)); - return FALSE; - } - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Stbc, Stbc); - return TRUE; -} - -INT32 SetATETxMode(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR PhyMode; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TxMode = %s, control_band_idx = %d\n", __func__, Arg, - control_band_idx)); - - PhyMode = simple_strtol(Arg, 0, 10); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, PhyMode, PhyMode); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TxMode = %x, control_band_idx:%u\n", __func__, PhyMode, - control_band_idx)); - return TRUE; -} - -INT32 SetATETxGi(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR Sgi; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Sgi = %s, control_band_idx = %d\n", __func__, Arg, - control_band_idx)); - - Sgi = simple_strtol(Arg, 0, 10); - - if (Sgi > 1) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Out of range (%d)\n", __func__, Sgi)); - return FALSE; - } - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Sgi, Sgi); - return TRUE; -} - -INT32 SetATERxFer(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETempSensor(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEReadRF(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - - Ret = ShowAllRF(pAd); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATELoadE2p(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - UINT32 Ret = 0; - RTMP_STRING *Src = EEPROM_BIN_FILE_NAME; - RTMP_OS_FD Srcf; - INT32 Retval; - USHORT *WriteEEPROM = NULL; - INT32 FileLength = 0; - UINT32 Value = (UINT32)simple_strtol(Arg, 0, 10); - RTMP_OS_FS_INFO OsFSInfo; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===> %s (value=%d)\n\n", __func__, Value)); -#ifdef RTMP_RBUS_SUPPORT - - if (IS_RBUS_INF(pAd)) - Src = EEPROM_DEFAULT_FILE_PATH; - -#endif /* RTMP_RBUS_SUPPORT */ - Ret = os_alloc_mem(pAd, (PUCHAR *)&WriteEEPROM, - EEPROM_SIZE); /* TODO verify */ - - if (Ret == NDIS_STATUS_FAILURE) - return Ret; - - if (Value > 0) { - /* zero the e2p buffer */ - NdisZeroMemory((PUCHAR)WriteEEPROM, EEPROM_SIZE); - RtmpOSFSInfoChange(&OsFSInfo, TRUE); - - do { - /* open the bin file */ - Srcf = RtmpOSFileOpen(Src, O_RDONLY, 0); - - if (IS_FILE_OPEN_ERR(Srcf)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: Error opening file %s\n", - __func__, Src)); - break; - } - - /* read the firmware from the file *.bin */ - FileLength = RtmpOSFileRead( - Srcf, (RTMP_STRING *)WriteEEPROM, EEPROM_SIZE); - - if (FileLength != EEPROM_SIZE) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: error file length (=%d) in e2p.bin\n", - __func__, FileLength)); - break; - } - - /* write the content of .bin file to EEPROM */ -#if defined(RTMP_MAC_PCI) && defined(RTMP_PCI_SUPPORT) - - if (IS_PCI_INF(pAd)) { - UINT16 Index = 0; - UINT16 Value = 0; - INT32 E2pSize = - 512; /* == 0x200 for PCI interface */ - UINT16 TempData = 0; - - for (Index = 0; Index < (E2pSize >> 1); - Index++) { - /* "value" is especially for some compilers... */ - TempData = le2cpu16(WriteEEPROM[Index]); - Value = TempData; - RT28xx_EEPROM_WRITE16(pAd, (Index << 1), - Value); - } - } - -#else - /* rt_ee_write_all(pAd, WriteEEPROM); */ -#endif /* defined(RTMP_MAC_PCI) && defined(RTMP_PCI_SUPPORT) */ - Ret = TRUE; - break; - } while (TRUE); - - /* close firmware file */ - if (IS_FILE_OPEN_ERR(Srcf)) - ; - else { - Retval = RtmpOSFileClose(Srcf); - - if (Retval) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("--> Error %d closing %s\n", -Retval, - Src)); - } - } - - /* restore */ - RtmpOSFSInfoChange(&OsFSInfo, FALSE); - } - - os_free_mem(WriteEEPROM); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<=== %s (Ret=%d)\n", __func__, Ret)); - return Ret; -} - -#ifdef RTMP_EFUSE_SUPPORT -INT32 SetATELoadE2pFromBuf(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - BOOLEAN Ret = FALSE; - UINT32 Value = (UINT32)simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===> %s (Value=%d)\n\n", __func__, Value)); - - if (Value > 0) { -#if defined(RTMP_MAC_PCI) && defined(RTMP_PCI_SUPPORT) - - if (IS_PCI_INF(pAd)) { - UINT16 Index = 0; - UINT16 Value = 0; - INT32 E2PSize = 512; /* == 0x200 for PCI interface */ - UINT16 TempData = 0; - - for (Index = 0; Index < (E2PSize >> 1); Index++) { - /* "value" is especially for some compilers... */ - TempData = le2cpu16(pAd->EEPROMImage[Index]); - Value = TempData; - RT28xx_EEPROM_WRITE16(pAd, (Index << 1), Value); - } - } - -#else - /* rt_ee_write_all(pAd, pAd->EEPROMImage); */ -#endif /* defined(RTMP_MAC_PCI) && defined(RTMP_PCI_SUPPORT) */ - Ret = TRUE; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<=== %s (Ret=%d)\n", __func__, Ret)); - return Ret; -} -#endif /* RTMP_EFUSE_SUPPORT */ - -INT32 SetATEReadE2p(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 ret; - UINT16 *Buffer = NULL; - UINT16 size = EEPROM_SIZE; - int i; - -#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - size = get_dev_eeprom_size(pAd); -#endif - - ret = os_alloc_mem(pAd, (PUCHAR *)&Buffer, size); - - if (ret == NDIS_STATUS_FAILURE) - return ret; - - EEReadAll(pAd, (UINT16 *)Buffer, size); - - for (i = 0; i < (size >> 1); i++) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%4.4x ", *Buffer)); - - if (((i + 1) % 16) == 0) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - Buffer++; - } - - os_free_mem(Buffer); - return TRUE; -} - -INT32 SetATEAutoAlc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEIpg(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = 0; - UINT32 ipg = 0; - - /* Sanity check for input parameter */ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - goto err0; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: IPG = %s\n", __func__, Arg)); - - ipg = simple_strtol(Arg, 0, 10); - ret = ATEOp->SetIPG(pAd, ipg); - - if (!ret) - return TRUE; - -err0: - return FALSE; -} - -INT32 SetATEPayload(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - RTMP_STRING *Value; - - Value = Arg; - - /* only one octet acceptable */ - if (strlen(Value) != 2) - return FALSE; - - AtoH(Value, &(ATECtrl->Payload), 1); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_ATE_Payload_Proc (repeated pattern = 0x%2x)\n", - ATECtrl->Payload)); - return TRUE; -} - -INT32 SetATEFixedPayload(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 Value; - - /* only one octet acceptable */ - Value = simple_strtol(Arg, 0, 10); - - if (Value == 0) - ATECtrl->FixedPayload = 2; - else - ATECtrl->FixedPayload = 1; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: (Fixed Payload = %u)\n", __func__, - ATECtrl->FixedPayload)); - return TRUE; -} - -INT32 SetATETtr(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEShow(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; -#ifdef DBDC_MODE - struct _BAND_INFO *Info = NULL; -#endif /* DBDC_MODE */ - RTMP_STRING *Mode_String = NULL; - RTMP_STRING *TxMode_String = NULL; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT8 loop_index; - INT status = TRUE; - CHAR *value = 0; - UCHAR ExtendInfo = 0; - - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Configure Input Parameter */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - - /* sanity check for input parameter*/ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Please use parameter 0 for Summary INFO, 1 for Detail INFO!!\n", - __func__)); - return FALSE; - } - - /* Parsing input parameter */ - for (loop_index = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":"), loop_index++) { - switch (loop_index) { - case 0: - ExtendInfo = simple_strtol(value, 0, 10); - break; - - default: { - status = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set wrong parameters\n", __func__)); - break; - } - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ExtendInfo = %d\n", __func__, ExtendInfo)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx = %d !!!!!\n", __func__, - control_band_idx)); - - /* initialize pointer to structure of parameters of Band1 */ - if (control_band_idx == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ATE Mode = 0x%x !!!!!\n", __func__, - ATECtrl->Mode)); - } -#ifdef DBDC_MODE - else { - Info = &(ATECtrl->band_ext[0]); - - if (Info != NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ATE Mode = 0x%x !!!!!\n", __func__, - Info->Mode)); - } - } - -#endif /* DBDC_MODE */ - - /* check the ATE mode */ - if (control_band_idx == 0) { - switch (ATECtrl->Mode) { - case (fATE_IDLE): - Mode_String = "ATESTART"; - break; - - case (fATE_EXIT): - Mode_String = "ATESTOP"; - break; - - case ((fATE_TX_ENABLE) | (fATE_TXCONT_ENABLE)): - Mode_String = "TXCONT"; - break; - - case ((fATE_TX_ENABLE) | (fATE_TXCARR_ENABLE)): - Mode_String = "TXCARR"; - break; - - case ((fATE_TX_ENABLE) | (fATE_TXCARRSUPP_ENABLE)): - Mode_String = "TXCARS"; - break; - - case (fATE_TX_ENABLE): - Mode_String = "TXFRAME"; - break; - - case (fATE_RX_ENABLE): - Mode_String = "RXFRAME"; - break; - - default: { - Mode_String = "Unknown ATE mode"; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR! Unknown ATE mode!\n")); - break; - } - } - } -#ifdef DBDC_MODE - else { - if (Info != NULL) { - switch (Info->Mode) { - case (fATE_IDLE): - Mode_String = "ATESTART"; - break; - - case (fATE_EXIT): - Mode_String = "ATESTOP"; - break; - - case ((fATE_TX_ENABLE) | (fATE_TXCONT_ENABLE)): - Mode_String = "TXCONT"; - break; - - case ((fATE_TX_ENABLE) | (fATE_TXCARR_ENABLE)): - Mode_String = "TXCARR"; - break; - - case ((fATE_TX_ENABLE) | (fATE_TXCARRSUPP_ENABLE)): - Mode_String = "TXCARS"; - break; - - case (fATE_TX_ENABLE): - Mode_String = "TXFRAME"; - break; - - case (fATE_RX_ENABLE): - Mode_String = "RXFRAME"; - break; - - default: { - Mode_String = "Unknown ATE mode"; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("ERROR! Unknown ATE mode!\n")); - break; - } - } - } - } - -#endif /* DBDC_MODE */ - - if (control_band_idx == 0) { - switch (ATECtrl->PhyMode) { - case MODE_CCK: - TxMode_String = "CCK"; - break; - - case MODE_OFDM: - TxMode_String = "OFDM"; - break; - - case MODE_HTMIX: - TxMode_String = "HT-Mix"; - break; - - case MODE_HTGREENFIELD: - TxMode_String = "HT-GreenField"; - break; - - case MODE_VHT: - TxMode_String = "VHT"; - break; - - default: { - TxMode_String = "Unknown phy mode"; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR! Unknown phy mode!\n")); - break; - } - } - } -#ifdef DBDC_MODE - else { - if (Info != NULL) { - switch (Info->PhyMode) { - case MODE_CCK: - TxMode_String = "CCK"; - break; - - case MODE_OFDM: - TxMode_String = "OFDM"; - break; - - case MODE_HTMIX: - TxMode_String = "HT-Mix"; - break; - - case MODE_HTGREENFIELD: - TxMode_String = "HT-GreenField"; - break; - - case MODE_VHT: - TxMode_String = "VHT"; - break; - - default: { - TxMode_String = "Unknown phy mode"; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("ERROR! Unknown phy mode!\n")); - break; - } - } - } - } - -#endif /* DBDC_MODE */ - /* Generic information */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBand %d Generic INFO\n", control_band_idx)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - - if (control_band_idx == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATE Mode = %s\n", Mode_String)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxAntennaSel = 0x%x\n", ATECtrl->TxAntennaSel)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxAntennaSel = 0x%x\n", ATECtrl->RxAntennaSel)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BBPCurrentBW = %u\n", ATECtrl->BW)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("GI = %u\n", ATECtrl->Sgi)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MCS = %u\n", ATECtrl->Mcs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxMode = %s\n", TxMode_String)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Addr1 = %02x:%02x:%02x:%02x:%02x:%02x\n", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], - ATECtrl->Addr1[2], ATECtrl->Addr1[3], - ATECtrl->Addr1[4], ATECtrl->Addr1[5])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Addr2 = %02x:%02x:%02x:%02x:%02x:%02x\n", - ATECtrl->Addr2[0], ATECtrl->Addr2[1], - ATECtrl->Addr2[2], ATECtrl->Addr2[3], - ATECtrl->Addr2[4], ATECtrl->Addr2[5])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Addr3 = %02x:%02x:%02x:%02x:%02x:%02x\n", - ATECtrl->Addr3[0], ATECtrl->Addr3[1], - ATECtrl->Addr3[2], ATECtrl->Addr3[3], - ATECtrl->Addr3[4], ATECtrl->Addr3[5])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel = %u\n", ATECtrl->Channel)); -#ifdef DOT11_VHT_AC - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel_2nd = %u\n", ATECtrl->Channel_2nd)); -#endif /* DOT11_VHT_AC */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Ch_Band = %d\n", ATECtrl->Ch_Band)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Control Channel = %d\n", ATECtrl->ControlChl)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxLength = %u\n", ATECtrl->TxLength)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxCount = %u\n", ATECtrl->TxCount)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("HW Length = %d\n", ATECtrl->HLen)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Payload Length = %d\n", ATECtrl->pl_len)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IPG = %dus\n", ATECtrl->ipg_param.ipg)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Duty Cycle = %d%%\n", ATECtrl->duty_cycle)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Pkt Tx Time = %dus\n", - ATECtrl->tx_time_param.pkt_tx_time)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Payload Pattern = 0x%02x\n", ATECtrl->Payload)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RFFreqOffset = %u\n", ATECtrl->RFFreqOffset)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SKB Allocate = %d\n", ATECtrl->is_alloc_skb)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxStatus = %d\n", ATECtrl->TxStatus)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wdev_idx = %d\n", ATECtrl->wdev_idx)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("QID = %d\n", ATECtrl->QID)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PriSel = %d\n", ATECtrl->PriSel)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Nss = %d\n", ATECtrl->Nss)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PerPktBW = %d\n", ATECtrl->PerPktBW)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PrimaryBWSel = %d\n", ATECtrl->PrimaryBWSel)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("STBC = %d\n", ATECtrl->Stbc)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LDPC = %d\n", ATECtrl->Ldpc)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Preamble = %d\n", ATECtrl->Preamble)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("FixedPayload = %d\n", ATECtrl->FixedPayload)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Thermal Value = %d\n", ATECtrl->thermal_val)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PrimaryBWSel = %d\n", ATECtrl->PrimaryBWSel)); - } -#ifdef DBDC_MODE - else { - if (Info != NULL) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATE Mode = %s\n", Mode_String)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxAntennaSel = 0x%x\n", Info->TxAntennaSel)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxAntennaSel = 0x%x\n", Info->RxAntennaSel)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BBPCurrentBW = %u\n", Info->BW)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("GI = %u\n", Info->Sgi)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MCS = %u\n", Info->Mcs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxMode = %s\n", TxMode_String)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Addr1 = %02x:%02x:%02x:%02x:%02x:%02x\n", - Info->Addr1[0], Info->Addr1[1], - Info->Addr1[2], Info->Addr1[3], - Info->Addr1[4], Info->Addr1[5])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Addr2 = %02x:%02x:%02x:%02x:%02x:%02x\n", - Info->Addr2[0], Info->Addr2[1], - Info->Addr2[2], Info->Addr2[3], - Info->Addr2[4], Info->Addr2[5])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Addr3 = %02x:%02x:%02x:%02x:%02x:%02x\n", - Info->Addr3[0], Info->Addr3[1], - Info->Addr3[2], Info->Addr3[3], - Info->Addr3[4], Info->Addr3[5])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel = %u\n", Info->Channel)); -#ifdef DOT11_VHT_AC - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel_2nd = %u\n", Info->Channel_2nd)); -#endif /* DOT11_VHT_AC */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Ch_Band = %d\n", Info->Ch_Band)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Control Channel = %d\n", Info->ControlChl)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxLength = %u\n", Info->TxLength)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxCount = %u\n", Info->TxCount)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("HW Length = %d\n", Info->HLen)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Payload Length = %d\n", Info->pl_len)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IPG = %dus\n", Info->ipg_param.ipg)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Duty Cycle = %d%%\n", Info->duty_cycle)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Pkt Tx Time = %dus\n", - Info->tx_time_param.pkt_tx_time)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RFFreqOffset = %u\n", Info->RFFreqOffset)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SKB Allocate = %d\n", Info->is_alloc_skb)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxStatus = %d\n", Info->TxStatus)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wdev_idx = %d\n", Info->wdev_idx)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("QID = %d\n", Info->QID)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PriSel = %d\n", Info->PriSel)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Nss = %d\n", Info->Nss)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PerPktBW = %d\n", Info->PerPktBW)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PrimaryBWSel = %d\n", Info->PrimaryBWSel)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("STBC = %d\n", Info->Stbc)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LDPC = %d\n", Info->Ldpc)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Preamble = %d\n", Info->Preamble)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("FixedPayload = %d\n", Info->FixedPayload)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Thermal Value = %d\n", Info->thermal_val)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PrimaryBWSel = %d\n", Info->PrimaryBWSel)); - } - } -#endif /* DBDC_MODE */ - - if (ExtendInfo) { - if (control_band_idx == 0) { - /* TX information */ - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTX INFO\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Sequence = %d\n", ATECtrl->seq)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxDoneCount = %d\n", ATECtrl->TxDoneCount)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxedCount = %d\n", ATECtrl->TxedCount)); - /* RX information */ - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tRX INFO\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxTotalCnt = %d\n", - ATECtrl->rx_stat.RxTotalCnt[control_band_idx])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxMacMdrdyCount = %d\n", - ATECtrl->rx_stat.RxMacMdrdyCount)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxMacFCSErrCount = %d\n", - ATECtrl->rx_stat.RxMacFCSErrCount)); - } -#ifdef DBDC_MODE - else { - if (Info != NULL) { - /* TX information */ - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\t\tTX INFO\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Sequence = %d\n", Info->seq)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("TxDoneCount = %d\n", - Info->TxDoneCount)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("TxedCount = %d\n", Info->TxedCount)); - /* RX information */ - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\t\tRX INFO\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("RxTotalCnt = %d\n", - ATECtrl->rx_stat - .RxTotalCnt[control_band_idx])); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("RxMacMdrdyCount = %d\n", - ATECtrl->rx_stat - .RxMacMdrdyCount_band1)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("RxMacFCSErrCount = %d\n", - ATECtrl->rx_stat - .RxMacFCSErrCount_band1)); - } - } -#endif /* DBDC_MODE */ - /* TX power information */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTx Power INFO\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxPower0 = %d\n", ATECtrl->TxPower0)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxPower1 = %d\n", ATECtrl->TxPower1)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxPower2 = %d\n", ATECtrl->TxPower2)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxPower3 = %d\n", ATECtrl->TxPower3)); -#ifdef ATE_TXTHREAD - /* TX thread information */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tATE TX Thread INFO\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Current_Init_Thread = %d\n", - ATECtrl->current_init_thread)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dequeue Count = %d\n", ATECtrl->deq_cnt)); -#endif /* ATE_TXTHREAD */ -#ifdef TXBF_SUPPORT - /* BF related information */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBF Band %d INFO\n", control_band_idx)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgEBfEverEnabled = %d\n", - ATECtrl->fgEBfEverEnabled)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TXBF INFO Length = %d\n", ATECtrl->txbf_info_len)); - - if (control_band_idx == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ETXBF = %d\n", ATECtrl->eTxBf)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ITXBF = %d\n", ATECtrl->iTxBf)); - } -#ifdef DBDC_MODE - else { - if (Info != NULL) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("ETXBF = %d\n", Info->eTxBf)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("ITXBF = %d\n", Info->iTxBf)); - } - } - -#endif /* DBDC_MODE */ -#endif /* TXBF_SUPPORT */ - /* MU related information */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tMU INFO\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MU Enable = %d\n", ATECtrl->mu_enable)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MU Users = %d\n", ATECtrl->mu_usrs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wcid_ref = %d\n", ATECtrl->wcid_ref)); - } - - return TRUE; -} - -INT32 set_ate_duty_cycle(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - UINT32 duty_cycle = 0; - - /* Sanity check for input parameter */ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - goto err0; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Duty cycle=%s%%\n", __func__, Arg)); - - duty_cycle = simple_strtol(Arg, 0, 10); - - if ((duty_cycle < 0) || (duty_cycle > 100)) - goto err1; - - Ret = ATEOp->SetDutyCycle(pAd, duty_cycle); - - if (!Ret) - return TRUE; - -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unexpected input!!\n", __func__)); -err0: - return FALSE; -} - -INT32 set_ate_pkt_tx_time(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - UINT32 pkt_tx_time = 0; - - /* Sanity check for input parameter */ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - goto err0; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Pkt Tx time=%sus\n", __func__, Arg)); - - pkt_tx_time = simple_strtol(Arg, 0, 10); - - if (pkt_tx_time < 0) - goto err1; - - Ret = ATEOp->SetPktTxTime(pAd, pkt_tx_time); - - if (!Ret) - return TRUE; - -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unexpected input!!\n", __func__)); -err0: - return FALSE; -} - -INT32 set_ate_control_band_idx(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 ret = 0; - UCHAR control_band_idx; - - /* Sanity check for input parameter */ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - goto err; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Control band_idx=%s\n", __func__, Arg)); - - control_band_idx = simple_strtol(Arg, 0, 10); - ATECtrl->control_band_idx = control_band_idx; - - if (!ret) - return TRUE; - -err: - return FALSE; -} - -#if defined(TXBF_SUPPORT) && defined(MT_MAC) -INT SetATEApplyStaToMacTblEntry(RTMP_ADAPTER *pAd) -{ - P_MANUAL_CONN pManual_cfg = &pAd->AteManualConnInfo; - UCHAR WCID = pManual_cfg->wtbl_idx; - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[WCID]; - - /* Currently, for MU-MIMO, we only care the VHT/HT Cap Info and VHT MCS set */ - os_move_mem(&pEntry->vht_cap_ie.vht_cap, &pManual_cfg->vht_cap_info, - sizeof(pEntry->vht_cap_ie.vht_cap)); - os_move_mem(&pEntry->HTCapability.HtCapInfo, &pManual_cfg->ht_cap_info, - sizeof(pEntry->HTCapability.HtCapInfo)); - os_move_mem(&pEntry->vht_cap_ie.mcs_set, &pManual_cfg->vht_mcs_set, - sizeof(pEntry->vht_cap_ie.mcs_set)); - return TRUE; -} - -INT SetATEApplyStaToAsic(RTMP_ADAPTER *pAd) -{ - P_MANUAL_CONN manual_cfg = &pAd->AteManualConnInfo; - UCHAR WCID = manual_cfg->wtbl_idx; - UCHAR *pAddr = &manual_cfg->peer_mac[0]; - MT_WCID_TABLE_INFO_T WtblInfo; - /* MAC_TABLE_ENTRY *mac_entry = NULL; */ -#ifdef CONFIG_WTBL_TLV_MODE -#else - struct rtmp_mac_ctrl *wtbl_ctrl = &pAd->mac_ctrl; -#endif /*CONFIG_WTBL_TLV_MODE */ -#ifdef CONFIG_WTBL_TLV_MODE -#else - - if (wtbl_ctrl->wtbl_entry_cnt[0] > 0) - WCID = (wtbl_ctrl->wtbl_entry_cnt[0] > WCID ? - WCID : - MCAST_WCID_TO_REMOVE); - else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: PSE not init yet!\n", __func__)); - return FALSE; - } - -#endif /* CONFIG_WTBL_TLV_MODE */ - os_zero_mem(&WtblInfo, sizeof(MT_WCID_TABLE_INFO_T)); - WtblInfo.Wcid = WCID; - os_move_mem(&WtblInfo.Addr[0], &pAddr[0], 6); - /* TODO: shiang-MT7615, risk here!!! */ - /* if (WCID < MAX_LEN_OF_MAC_TABLE) */ - /* mac_entry = &pAd->MacTab.Content[WCID]; */ - - if (WCID == MCAST_WCID_TO_REMOVE || WCID == MAX_LEN_OF_MAC_TABLE) { - WtblInfo.MacAddrIdx = 0xe; - WtblInfo.WcidType = MT_WCID_TYPE_BMCAST; - WtblInfo.CipherSuit = WTBL_CIPHER_NONE; - } else { - /* if (!mac_entry) { */ - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, */ - /* ("%s(): mac_entry is NULL!\n", __FUNCTION__)); */ - /* return; */ - /* } */ - if (pAd->AteManualConnInfo.peer_op_type == OPMODE_AP) - WtblInfo.WcidType = MT_WCID_TYPE_AP; - else - WtblInfo.WcidType = MT_WCID_TYPE_CLI; - - WtblInfo.MacAddrIdx = - manual_cfg->ownmac_idx; /* mac_entry->wdev->OmacIdx; */ - /* WtblInfo.Aid = manual_cfg->wtbl_idx; //mac_entry->Aid; */ - WtblInfo.CipherSuit = WTBL_CIPHER_NONE; - /* if (CLIENT_STATUS_TEST_FLAG(mac_entry, fCLIENT_STATUS_WMM_CAPABLE)) */ - WtblInfo.SupportQoS = TRUE; - - if (WMODE_CAP_N(manual_cfg->peer_phy_mode)) { - WtblInfo.SupportHT = TRUE; - /* if (CLIENT_STATUS_TEST_FLAG(mac_entry, fCLIENT_STATUS_RDG_CAPABLE)) */ - { - WtblInfo.SupportRDG = TRUE; - } - WtblInfo.SmpsMode = 0; /* mac_entry->MmpsMode ; */ - WtblInfo.MpduDensity = 0; /* mac_entry->MpduDensity; */ - WtblInfo.MaxRAmpduFactor = - 3; /* mac_entry->MaxRAmpduFactor; */ -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(manual_cfg->peer_phy_mode)) - WtblInfo.SupportVHT = TRUE; - -#endif /* DOT11_VHT_AC */ - } - } - - WtblInfo.Aid = manual_cfg->aid; - WtblInfo.PfmuId = manual_cfg->pfmuId; - WtblInfo.spe_idx = manual_cfg->spe_idx; - /* - * WtblInfo.rca2 = manual_cfg->rca2; - * WtblInfo.rv = manual_cfg->rv; - */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Update WTBL table, WCID=%d, Addr=%02x:%02x:%02x:%02x:%02x:%02x, WtblInfo.MacAddrIdx=%d\n", - __func__, WCID, PRINT_MAC(pAddr), WtblInfo.MacAddrIdx)); - MtAsicUpdateRxWCIDTable(pAd, WtblInfo); -#ifdef MANUAL_MU - - if (WMODE_CAP_N(manual_cfg->peer_phy_mode)) { - MT_BA_CTRL_T BaCtrl; - INT tid; - - os_zero_mem(&BaCtrl, sizeof(MT_BA_CTRL_T)); - BaCtrl.BaSessionType = BA_SESSION_ORI; - BaCtrl.BaWinSize = 64; - BaCtrl.isAdd = TRUE; - BaCtrl.Sn = 0; - BaCtrl.Wcid = WtblInfo.Wcid; - BaCtrl.band_idx = 0; - os_move_mem(&BaCtrl.PeerAddr[0], &WtblInfo.Addr[0], - MAC_ADDR_LEN); - - for (tid = 0; tid < 4; tid++) { - BaCtrl.Tid = 0; - MtAsicUpdateBASession(pAd, BaCtrl); - } - } - - dump_wtbl_info(pAd, WtblInfo.Wcid); -#endif /* MANUAL_MU */ - return TRUE; -} - -static INT ATEMacStr2Hex(RTMP_STRING *arg, UINT8 *mac) -{ - INT i; - RTMP_STRING *token, sepValue[] = ":"; - - if (arg == NULL) - return FALSE; - - /* Mac address acceptable format 01:02:03:04:05:06 length 17*/ - if (strlen(arg) < 17) - return FALSE; - - for (i = 0, token = rstrtok(arg, &sepValue[0]); token; - token = rstrtok(NULL, &sepValue[0]), i++) { - if (i > 6) - break; - - if ((strlen(token) != 2) || (!isxdigit(*token)) || - (!isxdigit(*(token + 1)))) - return FALSE; - - AtoH(token, (&mac[i]), 1); - } - - if (i != 6) - return FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n%02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5])); - return TRUE; -} - -INT ATEManualParsingParam(RTMP_ADAPTER *pAd, RTMP_STRING *type, - RTMP_STRING *val) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - UINT8 mac[MAC_ADDR_LEN] = { 0 }; - INT op_type = 0; - INT wtbl_idx = 1; - INT own_mac_idx = 0; - INT phy_mode = 0; - INT bw = BW_20; - INT nss = 1; - INT maxrate_mode = MODE_CCK; - INT maxrate_mcs = 0; - INT pfmuId = 0, speIdx = 24; - INT aid = 0; - UINT8 rca2 = 0, rv = 0; - UINT8 fgIsSuBFee = 0; - UINT8 fgIsMuBFee = 0; - UINT8 fgIsSGIFor20 = 0; - UINT8 fgIsSGIFor40 = 0; - UINT8 fgIsSGIFor80 = 0; - UINT8 fgIsSGIFor160 = 0; - UINT8 bFeeNsts = 0; - UINT8 mcsSupport = 0; - - if ((!type) || (!val)) - return FALSE; - - if (!wdev) - return FALSE; - - /* mac:xx:xx:xx:xx:xx:xx */ - if (strcmp("mac", type) == 0) { - if (ATEMacStr2Hex(val, &mac[0]) == FALSE) { - NdisZeroMemory(&mac[0], MAC_ADDR_LEN); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s Invalid MAC address(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid MAC address(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - NdisMoveMemory(&pAd->AteManualConnInfo.peer_mac[0], mac, - MAC_ADDR_LEN); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", __func__, - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5])); - } - - /* type:ap/sta */ - if (strcmp("type", type) == 0) { - if (strcmp(val, "ap") == 0) - op_type = OPMODE_AP; - else if (strcmp(val, "sta") == 0) - op_type = OPMODE_STA; - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid type(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.peer_op_type = op_type; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: TYPE=%d\n", __func__, op_type)); - } - - /* wtbl:1~127 */ - if (strcmp("wtbl", type) == 0) { - if (strlen(val)) { - wtbl_idx = simple_strtol(val, 0, 10); - - if (wtbl_idx <= 0 || wtbl_idx > 127) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid wtbl idx(%s), use default\n", - __func__, (val == NULL ? "" : val))); - wtbl_idx = 1; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid wtbl idx(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.wtbl_idx = wtbl_idx; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: WTBL_IDX=%d\n", __func__, wtbl_idx)); - } - - /* ownmac:0~4, 0x10~0x1f */ - if (strcmp("ownmac", type) == 0) { - if (strlen(val)) { - own_mac_idx = simple_strtol(val, 0, 10); - - if (own_mac_idx < 0 || - (((own_mac_idx - 0) > 4) ? - ((own_mac_idx - 0x10) > 0xf) : - FALSE)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid OwnMac idx(%s), use default\n", - __func__, (val == NULL ? "" : val))); - own_mac_idx = 1; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid wtbl idx(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.ownmac_idx = own_mac_idx; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: OWN_MAC_IDX=%d\n", __func__, own_mac_idx)); - } - - /* pfmuId: */ - if (strcmp("pfmuId", type) == 0) { - if (strlen(val)) { - pfmuId = simple_strtol(val, 0, 10); - - if (!(pfmuId >= 0x00 || pfmuId <= 0x3f)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid PFMU idx(%s), use default\n", - __func__, (val == NULL ? "" : val))); - pfmuId = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid PFMU idx(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.pfmuId = pfmuId; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU_IDX=%d\n", __func__, pfmuId)); - } - - /* aid: */ - if (strcmp("aid", type) == 0) { - if (strlen(val)) { - aid = simple_strtol(val, 0, 10); - - if (!(aid >= 0x00 || aid <= 2007)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid aid(%s), use default\n", - __func__, (val == NULL ? "" : val))); - aid = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid aid(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.aid = aid; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: AID =%d\n", __func__, aid)); - } - - /* spe-idx: */ - if (strcmp("speIdx", type) == 0) { - if (strlen(val)) { - speIdx = simple_strtol(val, 0, 10); - - if (!(speIdx >= 0 || speIdx <= 30)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid SPE idx(%s), use default\n", - __func__, (val == NULL ? "" : val))); - speIdx = 24; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid SPE idx(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.spe_idx = speIdx; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: SPE_IDX=%d\n", __func__, speIdx)); - } - - if (strcmp("mubfee", type) == 0) { - if (strlen(val)) { - fgIsMuBFee = simple_strtol(val, 0, 10); - - if (!(fgIsMuBFee == 0 || fgIsMuBFee == 1)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid mubfee(%s), use default\n", - __func__, (val == NULL ? "" : val))); - fgIsMuBFee = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid mubfee(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - if (fgIsMuBFee) - pAd->AteManualConnInfo.vht_cap_info.bfee_cap_mu = - fgIsMuBFee; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: mubfee =%d\n", __func__, fgIsMuBFee)); - } - - if (strcmp("sgi160", type) == 0) { - if (strlen(val)) { - fgIsSGIFor160 = simple_strtol(val, 0, 10); - - if (!(fgIsSGIFor160 == 0 || fgIsSGIFor160 == 1)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid sgi160(%s), use default\n", - __func__, (val == NULL ? "" : val))); - fgIsSGIFor160 = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid sgi160(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - if (fgIsSGIFor160) - pAd->AteManualConnInfo.vht_cap_info.sgi_160M = - fgIsSGIFor160; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: sgi160 =%d\n", __func__, fgIsSGIFor160)); - } - - if (strcmp("sgi80", type) == 0) { - if (strlen(val)) { - fgIsSGIFor80 = simple_strtol(val, 0, 10); - - if (!(fgIsSGIFor80 == 0 || fgIsSGIFor80 == 1)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid sgi80(%s), use default\n", - __func__, (val == NULL ? "" : val))); - fgIsSGIFor80 = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid sgi80(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - if (fgIsSGIFor80) - pAd->AteManualConnInfo.vht_cap_info.sgi_80M = - fgIsSGIFor80; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: sgi80 =%d\n", __func__, fgIsSGIFor80)); - } - - if (strcmp("sgi40", type) == 0) { - if (strlen(val)) { - fgIsSGIFor40 = simple_strtol(val, 0, 10); - - if (!(fgIsSGIFor40 == 0 || fgIsSGIFor40 == 1)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid sgi40(%s), use default\n", - __func__, (val == NULL ? "" : val))); - fgIsSGIFor40 = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid sgi40(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - if (fgIsSGIFor40) - pAd->AteManualConnInfo.ht_cap_info.ShortGIfor40 = - fgIsSGIFor40; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: sgi40 =%d\n", __func__, fgIsSGIFor40)); - } - - if (strcmp("sgi20", type) == 0) { - if (strlen(val)) { - fgIsSGIFor20 = simple_strtol(val, 0, 10); - - if (!(fgIsSGIFor20 == 0 || fgIsSGIFor20 == 1)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid sgi20(%s), use default\n", - __func__, (val == NULL ? "" : val))); - fgIsSGIFor20 = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid sgi20(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - if (fgIsSGIFor20) - pAd->AteManualConnInfo.ht_cap_info.ShortGIfor20 = - fgIsSGIFor20; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: sgi20 =%d\n", __func__, fgIsSGIFor20)); - } - - if (strcmp("rxmcsnss1", type) == 0) { - if (strlen(val)) { - mcsSupport = simple_strtol(val, 0, 10); - - if (!(mcsSupport >= 0 || mcsSupport <= 3)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid rxmcsnss1(%s), use default\n", - __func__, (val == NULL ? "" : val))); - mcsSupport = 3; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid rxmcsnss1(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.vht_mcs_set.rx_mcs_map.mcs_ss1 = - mcsSupport; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: rxmcsnss1 =%d\n", __func__, mcsSupport)); - } - - if (strcmp("rxmcsnss2", type) == 0) { - if (strlen(val)) { - mcsSupport = simple_strtol(val, 0, 10); - - if (!(mcsSupport >= 0 || mcsSupport <= 3)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid rxmcsnss2(%s), use default\n", - __func__, (val == NULL ? "" : val))); - mcsSupport = 3; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid rxmcsnss2(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.vht_mcs_set.rx_mcs_map.mcs_ss2 = - mcsSupport; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: rxmcsnss2 =%d\n", __func__, mcsSupport)); - } - - if (strcmp("rxmcsnss3", type) == 0) { - if (strlen(val)) { - mcsSupport = simple_strtol(val, 0, 10); - - if (!(mcsSupport >= 0 || mcsSupport <= 3)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid rxmcsnss3(%s), use default\n", - __func__, (val == NULL ? "" : val))); - mcsSupport = 3; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid rxmcsnss3(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.vht_mcs_set.rx_mcs_map.mcs_ss3 = - mcsSupport; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: rxMcsNSS3 =%d\n", __func__, mcsSupport)); - } - - if (strcmp("rxmcsnss4", type) == 0) { - if (strlen(val)) { - mcsSupport = simple_strtol(val, 0, 10); - - if (!(mcsSupport >= 0 || mcsSupport <= 3)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid rxmcsnss4(%s), use default\n", - __func__, (val == NULL ? "" : val))); - mcsSupport = 3; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid rxmcsnss4(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.vht_mcs_set.rx_mcs_map.mcs_ss4 = - mcsSupport; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s rxmcsnss4 =%d\n", __func__, mcsSupport)); - } - - if (strcmp("subfee", type) == 0) { - if (strlen(val)) { - fgIsSuBFee = simple_strtol(val, 0, 10); - - if (!(fgIsSuBFee == 0 || fgIsSuBFee == 1)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid subfee(%s), use default\n", - __func__, (val == NULL ? "" : val))); - fgIsSuBFee = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid subfee(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - if (fgIsSuBFee) - pAd->AteManualConnInfo.vht_cap_info.bfee_cap_su = - fgIsSuBFee; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: subfee =%d\n", __func__, fgIsSuBFee)); - } - - if (strcmp("bfeensts", type) == 0) { - if (strlen(val)) { - bFeeNsts = simple_strtol(val, 0, 10); - - if (!(bFeeNsts >= 0 || bFeeNsts < 4)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid bfeensts(%s), use default\n", - __func__, (val == NULL ? "" : val))); - bFeeNsts = 4; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid bfeensts(%s), use default\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.vht_cap_info.bfee_sts_cap = bFeeNsts; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: bfeensts =%d\n", __func__, bFeeNsts)); - } - - /* mode:a/bg/n/ac */ - if (strcmp("mode", type) == 0) { - RTMP_STRING *tok; - - tok = val; - - while (strlen(tok)) { - if (*tok == 'b') { - phy_mode |= WMODE_B; - tok++; - } else if (*tok == 'g') { - if ((*(tok + 1) == 'n') && (strlen(tok) >= 2)) { - phy_mode |= WMODE_GN; - tok += 2; - } else { - phy_mode |= WMODE_G; - tok += 1; - } - } else if (*tok == 'a') { - if ((*(tok + 1) == 'n') && (strlen(tok) >= 2)) { - phy_mode |= WMODE_AN; - tok += 2; - } else if ((*(tok + 1) == 'c') && - (strlen(tok) >= 2)) { - phy_mode |= WMODE_AC; - tok += 2; - } else { - phy_mode |= WMODE_A; - tok += 1; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid phy_mode %c\n", - __func__, *tok)); - tok++; - } - } - - pAd->AteManualConnInfo.peer_phy_mode = phy_mode; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: phy_mode=%s, convert to PhyMode= 0x%x\n", - __func__, (val == NULL ? "" : val), phy_mode)); - } - - /* bw:20/40/80/160 */ - if (strcmp("bw", type) == 0) { - if (strlen(val)) { - bw = simple_strtol(val, 0, 10); - - switch (bw) { - case 20: - bw = BW_20; - break; - - case 40: - bw = BW_40; - break; - - case 80: - bw = BW_80; - break; - - case 160: - bw = BW_160; - break; - - default: - bw = BW_20; - break; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid BW string(%s), use default!\n", - __func__, (val == NULL ? "" : val))); - } - - pAd->AteManualConnInfo.peer_bw = bw; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: BW=%d\n", __func__, bw)); - } - - if (strcmp("nss", type) == 0) { - if (strlen(val)) { - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - - nss = simple_strtol(val, 0, 10); - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - UINT8 band_idx = HcGetBandByWdev(wdev); - - if (band_idx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif - if (nss > ucTxPath) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid NSS string(%s), use default!\n", - __func__, (val == NULL ? "" : val))); - nss = 1; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid NSS setting, use default!\n", - __func__)); - } - - pAd->AteManualConnInfo.peer_nss = nss; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: NSS=%d\n", __func__, nss)); - } - - /* rca2 = 0/1 */ - if (strcmp("rca2", type) == 0) { - if (strlen(val)) { - rca2 = simple_strtol(val, 0, 10); - - if (rca2 > 1) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid RCA2 string(%s), use default!\n", - __func__, (val == NULL ? "" : val))); - rca2 = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid RCA2 setting, use default!\n", - __func__)); - } - - pAd->AteManualConnInfo.rca2 = rca2; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: RCA2=%d\n", __func__, rca2)); - } - - /* rv = 0/1 */ - if (strcmp("rv", type) == 0) { - if (strlen(val)) { - rv = simple_strtol(val, 0, 10); - - if (rv > 1) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid RV string(%s), use default!\n", - __func__, (val == NULL ? "" : val))); - rv = 0; - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid RV setting, use default!\n", - __func__)); - } - - pAd->AteManualConnInfo.rv = rv; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: RV=%d\n", __func__, rv)); - } - - /* maxrate:cck/ofdm/htmix/htgf/vht/_0~32 */ - if (strcmp("maxrate", type) == 0) { - RTMP_STRING *tok; - - if (strlen(val)) { - tok = rtstrchr(val, '_'); - - if (tok && strlen(tok) > 1) { - *tok = 0; - tok++; - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%s: Invalid maxmcs setting(%s), use default!\n", - __func__, (val == NULL ? "" : val))); - goto maxrate_final; - } - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: Invalid maxrate setting(%s), use default!\n", - __func__, (val == NULL ? "" : val))); - goto maxrate_final; - } - - if (strlen(tok)) { - maxrate_mcs = simple_strtol(tok, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%s: input MCS string(%s) =%d\n", __func__, - tok, maxrate_mcs)); - } - - if (strcmp(val, "cck") == 0) { - maxrate_mode = MODE_CCK; - - if (maxrate_mcs > 4) - maxrate_mcs = 3; - } else if (strcmp(val, "ofdm") == 0) { - maxrate_mode = MODE_OFDM; - - if (maxrate_mcs > 7) - maxrate_mcs = 7; - } else if (strcmp(val, "htmix") == 0) { - maxrate_mode = MODE_HTMIX; - - if (maxrate_mcs > 32) - maxrate_mcs = 32; - } else if (strcmp(val, "htgf") == 0) { - maxrate_mode = MODE_HTGREENFIELD; - - if (maxrate_mcs > 32) - maxrate_mcs = 32; - } else if (strcmp(val, "vht") == 0) { - maxrate_mode = MODE_VHT; - - if (maxrate_mcs > 9) - maxrate_mcs = 9; - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Invalid RateMode string(%s), use default!\n", - __func__, val)); - maxrate_mode = MODE_CCK; - maxrate_mcs = 0; - } - - maxrate_final: - pAd->AteManualConnInfo.peer_maxrate_mode = maxrate_mode; - pAd->AteManualConnInfo.peer_maxrate_mcs = maxrate_mcs; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MAXRATE=>MODE=%d,MCS=%d\n", __func__, - maxrate_mode, maxrate_mcs)); - } - - return TRUE; -} - -/* - * Assoc Parameters: - * mac:xx:xx:xx:xx:xx:xx-type:ap/sta-mode:a/b/g/gn/an/ac-bw:20/40/80/160-nss:1/2/3/4-pfmuId:xx-aid:xx-maxrate: - * - * @jeffrey: For MU-MIMO, we need to configure the HT/VHP cap info to emulate different STAs (# of STA >= 2) which - * supports different Tx and Rx dimension for early algorithm verification - */ -INT SetATEAssocProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - char sep_type = '-', sep_val = ':'; - RTMP_STRING *tok, *param_str, *param_type, *param_val; - INT stat; - char ucNsts; - UINT_32 rate[8]; - RA_PHY_CFG_T TxPhyCfg; - RTMP_STRING rate_str[64]; - - NdisZeroMemory(&pAd->AteManualConnInfo, sizeof(MANUAL_CONN)); - tok = arg; - - while (tok) { - if (strlen(tok)) { - param_str = tok; - tok = rtstrchr(tok, sep_type); - - if (tok) { - *tok = 0; - tok++; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: param_str=%s\n", __func__, param_str)); - - if (strlen(param_str)) { - param_type = param_str; - param_val = rtstrchr(param_str, sep_val); - - if (param_val) { - *param_val = 0; - param_val++; - } - - if (strlen(param_type) && param_val && - strlen(param_val)) { - stat = ATEManualParsingParam( - pAd, param_type, param_val); - - if (stat == FALSE) - goto err_dump_usage; - } - } - } else - break; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:User manual configured peer STA info:\n", __func__)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tMAC=>0x%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pAd->AteManualConnInfo.peer_mac))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tBAND=>%d\n", pAd->AteManualConnInfo.peer_band)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tOwnMacIdx=>%d\n", pAd->AteManualConnInfo.ownmac_idx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tWTBL_Idx=>%d\n", pAd->AteManualConnInfo.wtbl_idx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tOperationType=>%d\n", - pAd->AteManualConnInfo.peer_op_type)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tPhyMode=>%d\n", pAd->AteManualConnInfo.peer_phy_mode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tBandWidth=>%d\n", pAd->AteManualConnInfo.peer_bw)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tNSS=>%d\n", pAd->AteManualConnInfo.peer_nss)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tPfmuId=>%d\n", pAd->AteManualConnInfo.pfmuId)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tAid=>%d\n", pAd->AteManualConnInfo.aid)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tSpe_idx=>%d\n", pAd->AteManualConnInfo.spe_idx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tMaxRate_Mode=>%d\n", - pAd->AteManualConnInfo.peer_maxrate_mode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tMaxRate_MCS=>%d\n", - pAd->AteManualConnInfo.peer_maxrate_mcs)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Now apply it to hardware!\n")); - /* This applied the manual config info into the mac table entry, including the HT/VHT cap, VHT MCS set */ - SetATEApplyStaToMacTblEntry(pAd); - /* Fixed rate configuration */ - NdisZeroMemory(&rate_str[0], sizeof(rate_str)); - sprintf(rate_str, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", - pAd->AteManualConnInfo.wtbl_idx, - pAd->AteManualConnInfo.peer_maxrate_mode, - pAd->AteManualConnInfo.peer_bw, - pAd->AteManualConnInfo.peer_maxrate_mcs, - pAd->AteManualConnInfo.peer_nss, 0, 0, 0, 0, 0); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tSet fixed RateInfo string as %s\n", rate_str)); - /* Set_Fixed_Rate_Proc(pAd, rate_str); */ - ucNsts = get_nsts_by_mcs(pAd->AteManualConnInfo.peer_maxrate_mode, - pAd->AteManualConnInfo.peer_maxrate_mcs, FALSE, - pAd->AteManualConnInfo.peer_nss); - rate[0] = tx_rate_to_tmi_rate(pAd->AteManualConnInfo.peer_maxrate_mode, - pAd->AteManualConnInfo.peer_maxrate_mcs, - ucNsts, FALSE, 0); - rate[0] &= 0xfff; - rate[1] = rate[2] = rate[3] = rate[4] = rate[5] = rate[6] = rate[7] = - rate[0]; - os_zero_mem(&TxPhyCfg, sizeof(TxPhyCfg)); - TxPhyCfg.BW = pAd->AteManualConnInfo.peer_bw; - TxPhyCfg.ShortGI = FALSE; - /* TxPhyCfg.ldpc = HT_LDPC | VHT_LDPC; */ - TxPhyCfg.ldpc = 0; - MtAsicTxCapAndRateTableUpdate(pAd, pAd->AteManualConnInfo.wtbl_idx, - &TxPhyCfg, rate, FALSE); - /* WTBL configuration */ - SetATEApplyStaToAsic(pAd); - /* dump WTBL again */ - /* dump_wtbl_info(pAd, pAd->AteManualConnInfo.wtbl_idx); */ - return TRUE; -err_dump_usage: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Parameter Usage:\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tiwpriv ra0 set assoc=[mac:hh:hh:hh:hh:hh:hh]-[wtbl:dd]-[ownmac:dd]-[type:xx]-[mode:mmm]-[bw:dd]-[nss:ss]-[maxrate:kkk_dd]\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\tmac: peer's mac address in hex format\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> mac:00:0c:43:12:34:56\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\twtbl: the WTBL entry index peer will occupied, in range 1~127\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> wtbl:1\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\townmac: the OwnMAC index we'll used to send frame to this peer, in range 0~4 or 16~31\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> ownmac:0\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\ttype: peer's operation type, is a ap or sta, allow input: \"ap\" or \"sta\"\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> type:ap\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\tmode: peer's phy operation mode, allow input: a/b/g/gn/an/ac\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> mode:aanac to indicate peer can support A/AN/AC mode\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\tbw: Peer's bandwidth capability, in range to 20/40/80/160\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> bw:40 indicate peer can support BW_40\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\tnss: Peer's capability for Spatial stream which can tx/rx, in range of 1~4 with restriction of Software/Hardware cap.\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> nss:2 indicate peer can support 2ss for both tx/rx\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\tmaxrate: Peer's data rate capability for tx/rx, separate as two parts and separate by '_' character\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\t\t kkk: phy modulation mode, allow input:'cck', 'ofdm', 'htmix', 'htgf', 'vht'\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\t\t dd:phy mcs rate, for CCK:0~3, OFDM:0~7, HT:0~32, VHT:0~9\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> maxrate:cck_1 indicate we only can transmit CCK and MCS 1(2Mbps) or lower MCS to peer\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> maxrate:ofdm_3 indicate we only can transmit OFDM and MCS 3(24Mbps) to peer\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\t\tExample=> maxrate:htmix_3 indicate we only can transmit OFDM and MCS 3(24Mbps) to peer\n")); - return FALSE; -} - -INT SetATETxBfDutInitProc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - BOOLEAN fgBw160; - RTMP_STRING cmdStr[24]; - ULONG stTimeChk0, stTimeChk1; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - fgBw160 = simple_strtol(Arg, 0, 10); - ATECtrl->fgBw160 = fgBw160; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx = %d\n", __func__, control_band_idx)); - NdisGetSystemUpTime(&stTimeChk0); - /* Do ATESTART */ - SetATE(pAd, "ATESTART"); - /* set ATEDA=00:11:11:11:11:11 */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr1[0], 0x00); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr1[1], 0x11); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr1[2], 0x11); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr1[3], 0x11); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr1[4], 0x11); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr1[5], 0x11); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr1[0], 0x00); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr1[1], 0x11); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr1[2], 0x11); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr1[3], 0x11); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr1[4], 0x11); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr1[5], 0x11); - snprintf(cmdStr, sizeof(cmdStr), "00:%.2x:%.2x:%.2x:%.2x:%.2x", 0x11, - 0x11, 0x11, 0x11, 0x11); - SetATEDa(pAd, cmdStr); - /* set ATESA=00:22:22:22:22:22 */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr2[0], 0x00); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr2[1], 0x22); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr2[2], 0x22); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr2[3], 0x22); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr2[4], 0x22); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr2[5], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr2[0], 0x00); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr2[1], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr2[2], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr2[3], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr2[4], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr2[5], 0x22); - /* snprintf(cmdStr, sizeof(cmdStr), "00:%.2x:%.2x:%.2x:%.2x:%.2x", */ - /* 0x22, 0x22, 0x22, 0x22, 0x22); */ - /* SetATESa(pAd, cmdStr); */ - if (fgBw160) { - AsicDevInfoUpdate(pAd, 0x0, ATECtrl->Addr2, control_band_idx, - TRUE, DEVINFO_ACTIVE_FEATURE); - } else { - if (control_band_idx == 0) { - AsicDevInfoUpdate(pAd, 0x0, ATECtrl->Addr2, - control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); - } else { - AsicDevInfoUpdate(pAd, 0x11, ATECtrl->Addr2, - control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); - } - } - - /* set ATEBSSID=00:22:22:22:22:22 */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr3[0], 0x00); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr3[1], 0x22); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr3[2], 0x22); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr3[3], 0x22); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr3[4], 0x22); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Addr3[5], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr3[0], 0x00); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr3[1], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr3[2], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr3[3], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr3[4], 0x22); - TESTMODE_SET_PARAM(ATECtrl, 0, Addr3[5], 0x22); - /* snprintf(cmdStr, sizeof(cmdStr), "00:%.2x:%.2x:%.2x:%.2x:%.2x", */ - /* 0x22, 0x22, 0x22, 0x22, 0x22); */ - /* SetATEBssid(pAd, cmdStr); */ - if (fgBw160) { - snprintf(cmdStr, sizeof(cmdStr), - "00:01:00:%.2x:%.2x:%.2x:%.2x:%.2x", 0x22, 0x22, 0x22, - 0x22, 0x22); - } else { - if (control_band_idx == 0) { - snprintf(cmdStr, sizeof(cmdStr), - "00:00:00:%.2x:%.2x:%.2x:%.2x:%.2x", 0x22, - 0x22, 0x22, 0x22, 0x22); - } else { - snprintf(cmdStr, sizeof(cmdStr), - "11:01:00:%.2x:%.2x:%.2x:%.2x:%.2x", 0x22, - 0x22, 0x22, 0x22, 0x22); - } - } - - Set_BssInfoUpdate(pAd, cmdStr); - /* set ATETXMODE=2 */ - SetATETxMode(pAd, "2"); - /* set ATETXMCS=0 */ - SetATETxMcs(pAd, "0"); - /* set ATETXBW=0 */ - SetATETxBw(pAd, "0"); - /* set ATETXGI=0 */ - SetATETxGi(pAd, "0"); - /* Enable i/eBF */ - SetATETXBFProc(pAd, "3"); - - if ((fgBw160) || (control_band_idx == 1)) { - /* set ATETXANT=3 2T */ - SetATETxAntenna(pAd, "3"); - /* set ATERXANT=3 2R*/ - SetATERxAntenna(pAd, "3"); - } else { - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - if (control_band_idx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif - - switch (ucTxPath) { - case TX_PATH_2: - /* set ATETXANT=3 2T */ - SetATETxAntenna(pAd, "3"); - /* set ATERXANT=3 2R*/ - SetATERxAntenna(pAd, "3"); - break; - - case TX_PATH_3: - /* set ATETXANT=7 3T */ - SetATETxAntenna(pAd, "7"); - /* set ATERXANT=7 3R*/ - SetATERxAntenna(pAd, "7"); - break; - - case TX_PATH_4: - default: - /* set ATETXANT=15 4T */ - SetATETxAntenna(pAd, "15"); - /* set ATERXANT=15 4R*/ - SetATERxAntenna(pAd, "15"); - break; - } - } - - /* SetATETxPower0(pAd, "14"); */ - ATECtrl->fgEBfEverEnabled = FALSE; - NdisGetSystemUpTime(&stTimeChk1); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Time consumption : %lu sec\n", __func__, - (stTimeChk1 - stTimeChk0) * 1000 / OS_HZ)); - - /* Init iBF phase calibration */ - if (ops->iBFPhaseCalInit) - ops->iBFPhaseCalInit(pAd); - - return TRUE; -} - -INT SetATETxBfGdInitProc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - BOOLEAN fgBw160; - RTMP_STRING cmdStr[80]; - ULONG stTimeChk0, stTimeChk1; - - fgBw160 = simple_strtol(Arg, 0, 10); - NdisGetSystemUpTime(&stTimeChk0); - /* Do ATESTART */ - SetATE(pAd, "ATESTART"); - /* set ATEDA=00:22:22:22:22:22 */ - ATECtrl->Addr1[0] = 0x00; - ATECtrl->Addr1[1] = 0x22; - ATECtrl->Addr1[2] = 0x22; - ATECtrl->Addr1[3] = 0x22; - ATECtrl->Addr1[4] = 0x22; - ATECtrl->Addr1[5] = 0x22; - snprintf(cmdStr, sizeof(cmdStr), "00:%.2x:%.2x:%.2x:%.2x:%.2x", 0x22, - 0x22, 0x22, 0x22, 0x22); - SetATEDa(pAd, cmdStr); - /* set ATESA=00:11:11:11:11:11 */ - ATECtrl->Addr2[0] = 0x00; - ATECtrl->Addr2[1] = 0x11; - ATECtrl->Addr2[2] = 0x11; - ATECtrl->Addr2[3] = 0x11; - ATECtrl->Addr2[4] = 0x11; - ATECtrl->Addr2[5] = 0x11; - /* snprintf(cmdStr, sizeof(cmdStr), "00:%.2x:%.2x:%.2x:%.2x:%.2x", */ - /* 0x11, 0x11, 0x11, 0x11, 0x11); */ - /* SetATESa(pAd, cmdStr); */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx = %d\n", __func__, control_band_idx)); - - if (fgBw160) { - AsicDevInfoUpdate(pAd, 0x0, ATECtrl->Addr2, control_band_idx, - TRUE, DEVINFO_ACTIVE_FEATURE); - } else { - if (control_band_idx == 0) { - AsicDevInfoUpdate(pAd, 0x0, ATECtrl->Addr2, - control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); - } else { - AsicDevInfoUpdate(pAd, 0x11, ATECtrl->Addr2, - control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); - } - } - - /* set ATEBSSID=00:22:22:22:22:22 */ - ATECtrl->Addr3[0] = 0x00; - ATECtrl->Addr3[1] = 0x22; - ATECtrl->Addr3[2] = 0x22; - ATECtrl->Addr3[3] = 0x22; - ATECtrl->Addr3[4] = 0x22; - ATECtrl->Addr3[5] = 0x22; - /* snprintf(cmdStr, sizeof(cmdStr), "00:%.2x:%.2x:%.2x:%.2x:%.2x", */ - /* 0x22, 0x22, 0x22, 0x22, 0x22); */ - /* SetATEBssid(pAd, cmdStr); */ - if (fgBw160) { - snprintf(cmdStr, sizeof(cmdStr), - "00:01:00:%.2x:%.2x:%.2x:%.2x:%.2x", 0x22, 0x22, 0x22, - 0x22, 0x22); - } else { - if (control_band_idx == 0) { - snprintf(cmdStr, sizeof(cmdStr), - "00:00:00:%.2x:%.2x:%.2x:%.2x:%.2x", 0x22, - 0x22, 0x22, 0x22, 0x22); - } else { - snprintf(cmdStr, sizeof(cmdStr), - "11:01:00:%.2x:%.2x:%.2x:%.2x:%.2x", 0x22, - 0x22, 0x22, 0x22, 0x22); - } - } - - Set_BssInfoUpdate(pAd, cmdStr); - /* set ATETXMODE=2 */ - SetATETxMode(pAd, "2"); - /* set ATETXMCS=0 */ - SetATETxMcs(pAd, "0"); - /* set ATETXBW=0 */ - SetATETxBw(pAd, "0"); - /* set ATETXGI=0 */ - SetATETxGi(pAd, "0"); - /* set ATETXANT=1 1T */ - SetATETxAntenna(pAd, "1"); - /* set ATERXANT=1 1R*/ - SetATERxAntenna(pAd, "1"); - /* Configure WTBL */ - /* iwpriv ra0 set ManualAssoc =mac:222222222222-type:sta-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:1-pfmuId:0 */ - snprintf( - cmdStr, sizeof(cmdStr), - "mac:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x-type:ap-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:1-pfmuId:0\n", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], ATECtrl->Addr1[2], - ATECtrl->Addr1[3], ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", cmdStr)); - SetATEAssocProc(pAd, cmdStr); - NdisGetSystemUpTime(&stTimeChk1); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Time consumption : %lu sec\n", __func__, - (stTimeChk1 - stTimeChk0) * 1000 / OS_HZ)); - return TRUE; -} - -INT32 SetATETxPacketWithBf(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - INT32 i; - UCHAR ucWlanId, ucTxCnt, *value, ucBuf[4], cmdStr[32]; - BOOLEAN fgBf; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx = %d\n", __func__, control_band_idx)); - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 8) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - AtoH(value, &ucBuf[i++], 1); - } - - fgBf = ucBuf[0]; - ucWlanId = ucBuf[1]; - ucTxCnt = ucBuf[2]; - /* Assign Wlan ID for fixed rate TxD */ - ATECtrl->wcid_ref = ucWlanId; - /* Stop Rx before ready to Tx */ - SetATE(pAd, "RXSTOP"); - - /* At TxD, enable/disable BF Tx at DW6 bit28 */ - if (fgBf) { - /* Invalid iBF profile */ - TxBfProfileTagRead(pAd, 2, TRUE); - TxBfProfileTag_InValid(&pAd->rPfmuTag1, FALSE); - TxBfProfileTagWrite(pAd, &pAd->rPfmuTag1, &pAd->rPfmuTag2, 2); - /* ATECtrl->eTxBf = TRUE; */ - /* ATECtrl->iTxBf = TRUE; */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, eTxBf, TRUE); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, iTxBf, TRUE); - ATECtrl->fgEBfEverEnabled = TRUE; - /* Stop Tx when the action of Tx packet is done */ - SetATE(pAd, "TXSTOP"); - /* Set the number of Tx packets */ - snprintf(cmdStr, sizeof(cmdStr), "%d", ucTxCnt); - SetATETxCount(pAd, cmdStr); - /* Start packet Tx */ - SetATE(pAd, "TXFRAME"); - } else { - if (ATECtrl->fgEBfEverEnabled == FALSE) { - /* ATECtrl->eTxBf = FALSE; */ - /* ATECtrl->iTxBf = FALSE; */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, eTxBf, - FALSE); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, iTxBf, - FALSE); - /* Stop Tx when the action of Tx packet is done */ - SetATE(pAd, "TXSTOP"); - /* Set the number of Tx packets */ - snprintf(cmdStr, sizeof(cmdStr), "%d", ucTxCnt); - SetATETxCount(pAd, cmdStr); - /* Start packet Tx */ - SetATE(pAd, "TXFRAME"); - } else { - /* Invalid iBF profile */ - TxBfProfileTagRead(pAd, 2, TRUE); - TxBfProfileTag_InValid(&pAd->rPfmuTag1, TRUE); - TxBfProfileTagWrite(pAd, &pAd->rPfmuTag1, - &pAd->rPfmuTag2, 2); - ATECtrl->fgEBfEverEnabled = FALSE; - } - } - - return TRUE; -} - -INT32 SetATETxBfChanProfileUpdate(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - INT32 i; - UCHAR *value; - RTMP_STRING cmdStr[80]; - CHAR value_T[12]; - UCHAR strLen; - BOOLEAN fgFinalData; - UINT16 u2Buf[11] = { 0 }; - UINT16 u2PfmuId, u2Subcarr; - INT16 i2Phi11, i2Phi21, i2Phi31; - INT16 i2H11, i2AngleH11, i2H21, i2AngleH21, i2H31, i2AngleH31, i2H41, - i2AngleH41; - INT32 Ret = 0; - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 43) - return FALSE; - - if (!wdev) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) > 3) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - strLen = strlen(value); - - if (strLen & 1) { - strcpy(value_T, "0"); - strncat(value_T, value, strLen); - AtoH(value_T, (PCHAR)(&u2Buf[i]), 2); - u2Buf[i] = be2cpu16(u2Buf[i]); - i++; - } - } - - u2PfmuId = u2Buf[0]; - u2Subcarr = u2Buf[1]; - fgFinalData = u2Buf[2]; - i2H11 = (INT16)(u2Buf[3] << 3) >> 3; - i2AngleH11 = (INT16)(u2Buf[4] << 3) >> 3; - i2H21 = (INT16)(u2Buf[5] << 3) >> 3; - i2AngleH21 = (INT16)(u2Buf[6] << 3) >> 3; - i2H31 = (INT16)(u2Buf[7] << 3) >> 3; - i2AngleH31 = (INT16)(u2Buf[8] << 3) >> 3; - i2H41 = (INT16)(u2Buf[9] << 3) >> 3; - i2AngleH41 = (INT16)(u2Buf[10] << 3) >> 3; - i2Phi11 = 0; - i2Phi21 = 0; - i2Phi31 = 0; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - UINT8 band_idx = HcGetBandByWdev(wdev); - - if (band_idx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif - - switch (ucTxPath) { - case TX_PATH_2: - i2Phi11 = i2AngleH21 - i2AngleH11; - i2Phi21 = 0; - i2Phi31 = 0; - break; - - case TX_PATH_3: - i2Phi11 = i2AngleH31 - i2AngleH11; - i2Phi21 = i2AngleH31 - i2AngleH21; - i2Phi31 = 0; - break; - - case TX_PATH_4: - default: -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - i2Phi11 = i2AngleH21 - i2AngleH11; - i2Phi21 = 0; - i2Phi31 = 0; - } else -#endif - { - i2Phi11 = i2AngleH41 - i2AngleH11; - i2Phi21 = i2AngleH41 - i2AngleH21; - i2Phi31 = i2AngleH41 - i2AngleH31; - } - - break; - } - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: i2AngleH11 = 0x%x, i2AngleH21 = 0x%x, i2AngleH31 = 0x%x, i2AngleH41 = 0x%x\n", - __func__, i2AngleH11, i2AngleH21, i2AngleH31, i2AngleH41)); - - /* Update the tag to enable eBF profile */ - if (fgFinalData) { - snprintf(cmdStr, sizeof(cmdStr), "%02x:01", u2PfmuId); - Set_TxBfProfileTagRead(pAd, cmdStr); - pAd->rPfmuTag1.rField.ucInvalidProf = TRUE; - Set_TxBfProfileTagWrite(pAd, cmdStr); - } - - /* Update the profile data per subcarrier */ - switch (ucTxPath) { - case TX_PATH_2: - snprintf( - cmdStr, sizeof(cmdStr), - "%02x:%03x:%03x:00:%03x:00:000:00:000:00:000:00:000:00:00:00:00:00", - u2PfmuId, u2Subcarr, (UINT16)((UINT16)i2Phi11 & 0xFFF), - (UINT16)((UINT16)i2Phi21 & 0xFFF)); - break; - case TX_PATH_3: - snprintf( - cmdStr, sizeof(cmdStr), - "%02x:%03x:%03x:00:%03x:00:000:00:000:00:000:00:000:00:00:00:00:00", - u2PfmuId, u2Subcarr, (UINT16)((UINT16)i2Phi11 & 0xFFF), - (UINT16)((UINT16)i2Phi21 & 0xFFF)); - break; - - case TX_PATH_4: - default: - snprintf( - cmdStr, sizeof(cmdStr), - "%02x:%03x:%03x:00:%03x:00:%03x:00:000:00:000:00:000:00:00:00:00:00", - u2PfmuId, u2Subcarr, (UINT16)((UINT16)i2Phi11 & 0xFFF), - (UINT16)((UINT16)i2Phi21 & 0xFFF), - (UINT16)((UINT16)i2Phi31 & 0xFFF)); - break; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s", __func__)); - Ret = Set_TxBfProfileDataWrite(pAd, cmdStr); - return Ret; -} - -INT32 SetATETxBfProfileRead(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 i; - UCHAR ucPfmuId, *value; - RTMP_STRING cmdStr[32]; - CHAR value_T[12]; - UCHAR strLen; - UINT16 u2Buf[2] = { 0 }; - UINT16 u2SubCarrier; - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 7) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 3) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1))) || (!isxdigit(*(value + 2)))) - return FALSE; /*Invalid*/ - - strLen = strlen(value); - - if (strLen & 1) { - strcpy(value_T, "0"); - strncat(value_T, value, strLen); - AtoH(value_T, (PCHAR)(&u2Buf[i]), 2); - u2Buf[i] = be2cpu16(u2Buf[i]); - i++; - } - } - - ucPfmuId = u2Buf[0]; - u2SubCarrier = u2Buf[1]; - snprintf(cmdStr, 11, "%.2x:01:%.2x:%.2x", ucPfmuId, (u2SubCarrier >> 8), - (u2SubCarrier & 0xFF)); - Set_TxBfProfileDataRead(pAd, cmdStr); - return TRUE; -} - -INT32 SetATETXBFProc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - UCHAR TxBfEn; -#if defined(MT7615) || defined(MT7622) - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); -#endif - TxBfEn = simple_strtol(Arg, 0, 10); -#if defined(MT7615) || defined(MT7622) - switch (TxBfEn) { - case 0: - /* no BF */ - ATECtrl->iTxBf = FALSE; - ATECtrl->eTxBf = FALSE; - break; - - case 1: - /* ETxBF */ - ATECtrl->iTxBf = FALSE; - ATECtrl->eTxBf = TRUE; - break; - - case 2: - /* ITxBF */ - ATECtrl->iTxBf = TRUE; - ATECtrl->eTxBf = FALSE; - break; - - case 3: - /* Enable TXBF support */ - ATECtrl->iTxBf = TRUE; - ATECtrl->eTxBf = TRUE; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_ATE_TXBF_Proc: Invalid parameter %d\n", TxBfEn)); - Ret = TRUE; - break; - } - -#endif - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEIBfGdCal(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 i; - UCHAR ucGroup, ucGroup_L_M_H, *value, ucBuf[4]; - BOOLEAN fgSX2; - UCHAR ucPhaseCal, ucPhaseVerifyLnaGainLevel; - INT32 Ret = 0; - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 11) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - AtoH(value, &ucBuf[i++], 1); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - ucGroup = ucBuf[0]; - ucGroup_L_M_H = ucBuf[1]; - fgSX2 = ucBuf[2]; - ucPhaseCal = ucBuf[3]; - ucPhaseVerifyLnaGainLevel = 0; - Ret = CmdITxBfPhaseCal(pAd, ucGroup, ucGroup_L_M_H, fgSX2, ucPhaseCal, - ucPhaseVerifyLnaGainLevel); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEIBfInstCal(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 i; - UCHAR ucGroup, ucGroup_L_M_H, *value, ucBuf[5]; - BOOLEAN fgSX2; - UCHAR ucPhaseCal, ucPhaseLnaGainLevel; - INT32 Ret = 0; - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 14) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - AtoH(value, &ucBuf[i++], 1); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - ucGroup = ucBuf[0]; - ucGroup_L_M_H = ucBuf[1]; - fgSX2 = ucBuf[2]; - ucPhaseCal = ucBuf[3]; - ucPhaseLnaGainLevel = ucBuf[4]; - Ret = CmdITxBfPhaseCal(pAd, ucGroup, ucGroup_L_M_H, fgSX2, ucPhaseCal, - ucPhaseLnaGainLevel); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxBfLnaGain(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - UCHAR ucLnaGain; - INT32 Ret = 0; - - if (Arg == NULL) - return FALSE; - - ucLnaGain = simple_strtol(Arg, 0, 10); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - Ret = CmdTxBfLnaGain(pAd, ucLnaGain); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEIBfProfileUpdate(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - INT32 i; - UCHAR Nr, Nc, PfmuIdx, NdpNss, *value, ucBuf[3]; - RTMP_STRING cmdStr[80]; - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 8) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - AtoH(value, &ucBuf[i++], 1); - } - - PfmuIdx = ucBuf[0]; - - if ((pAd->CommonCfg.dbdc_mode) || (ATECtrl->fgBw160)) - Nr = 1; - else - Nr = pAd->Antenna.field.TxPath - 1; - - Nc = ucBuf[2]; - /* Configure iBF tag */ - /* PFMU ID */ - snprintf(cmdStr, sizeof(cmdStr), "%d", PfmuIdx); - Set_TxBfProfileTag_PfmuIdx(pAd, cmdStr); - /* ITxBf */ - Set_TxBfProfileTag_BfType(pAd, "0"); - /* BW20 */ - Set_TxBfProfileTag_DBW(pAd, "0"); - /* SU */ - Set_TxBfProfileTag_SuMu(pAd, "0"); - /* PFMU memory allocation */ - snprintf(cmdStr, 24, "00:04:00:05:00:06:00:07"); - Set_TxBfProfileTag_Mem(pAd, cmdStr); - /* Nr:Nc:Ng:LM:CB:HTCE */ - /* snprintf(cmdStr, 18, "%.2x:%.2x:00:01:00:00", Nr, Nc); */ - snprintf(cmdStr, 18, "%.2x:%.2x:00:00:00:00", Nr, Nc); - Set_TxBfProfileTag_Matrix(pAd, cmdStr); - /* SNR */ - snprintf(cmdStr, 12, "00:00:00:00"); - Set_TxBfProfileTag_SNR(pAd, cmdStr); - /* SMART Antenna */ - Set_TxBfProfileTag_SmartAnt(pAd, "0"); - /* SE index */ - Set_TxBfProfileTag_SeIdx(pAd, "0"); - /* Rmsd */ - Set_TxBfProfileTag_RmsdThrd(pAd, "0"); - /* MCS threshold */ - snprintf(cmdStr, 18, "00:00:00:00:00:00"); - Set_TxBfProfileTag_McsThrd(pAd, cmdStr); - /* Time out disable */ - Set_TxBfProfileTag_TimeOut(pAd, "255"); - /* Desired BW20 */ - Set_TxBfProfileTag_DesiredBW(pAd, "0"); - /* Nr */ - snprintf(cmdStr, sizeof(cmdStr), "%d", Nr); - Set_TxBfProfileTag_DesiredNr(pAd, cmdStr); - /* Nc */ - snprintf(cmdStr, sizeof(cmdStr), "%d", Nc); - Set_TxBfProfileTag_DesiredNc(pAd, cmdStr); - /* Invalid the tag */ - Set_TxBfProfileTag_InValid(pAd, "1"); - /* Update PFMU tag */ - snprintf(cmdStr, sizeof(cmdStr), "%d", PfmuIdx); - Set_TxBfProfileTagWrite(pAd, cmdStr); - /* Configure the BF StaRec */ - if (ATECtrl->fgBw160) { - snprintf(cmdStr, sizeof(cmdStr), - "01:01:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], - ATECtrl->Addr1[2], ATECtrl->Addr1[3], - ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - } else { - if (control_band_idx == 0) { - snprintf(cmdStr, sizeof(cmdStr), - "01:00:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], - ATECtrl->Addr1[2], ATECtrl->Addr1[3], - ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - } else { - snprintf(cmdStr, sizeof(cmdStr), - "01:01:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], - ATECtrl->Addr1[2], ATECtrl->Addr1[3], - ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - } - } - Set_StaRecCmmUpdate(pAd, cmdStr); - - switch (Nr) { - case 1: - NdpNss = 8; /* MCS8, 2 streams */ - break; - - case 2: - NdpNss = 16; /* MCS16, 3 streams */ - break; - - case 3: - NdpNss = 24; /* MCS24, 4 streams */ - break; - - default: - NdpNss = 24; - break; - } - - snprintf( - cmdStr, sizeof(cmdStr), - "01:00:%.2x:00:00:00:%.2x:00:02:%.2x:%.2x:00:00:00:00:04:00:05:00:06:00:07:00", - PfmuIdx, NdpNss, Nc, Nr); - /* MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", cmdStr)); */ - Set_StaRecBfUpdate(pAd, cmdStr); - Set_StaRecBfRead(pAd, "1"); - /* Configure WTBL */ - /* iwpriv ra0 set ManualAssoc =mac:222222222222-type:sta-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:2-pfmuId:0 */ - snprintf( - cmdStr, sizeof(cmdStr), - "mac:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x-type:sta-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:%d-pfmuId:%d\n", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], ATECtrl->Addr1[2], - ATECtrl->Addr1[3], ATECtrl->Addr1[4], ATECtrl->Addr1[5], - (Nc + 1), PfmuIdx); - /* MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", cmdStr)); */ - SetATEAssocProc(pAd, cmdStr); - /* Update the information requested by ATE Tx Gen */ - ATECtrl->pfmu_info[0].wcid = 1; - ATECtrl->pfmu_info[0].bss_idx = 0; - NdisMoveMemory(ATECtrl->pfmu_info[0].addr, ATECtrl->Addr1, - MAC_ADDR_LEN); - return TRUE; -} - -INT32 SetATEEBfProfileConfig(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - INT32 i; - UCHAR Nr, Nc, PfmuIdx, NdpNss, *value, ucBuf[3]; - RTMP_STRING cmdStr[80]; - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 8) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - AtoH(value, &ucBuf[i++], 1); - } - - PfmuIdx = ucBuf[0]; - - if ((pAd->CommonCfg.dbdc_mode) || (ATECtrl->fgBw160)) - Nr = 1; - else - Nr = pAd->Antenna.field.TxPath - 1; - - Nc = ucBuf[2]; - /* Configure iBF tag */ - /* PFMU ID */ - snprintf(cmdStr, sizeof(cmdStr), "%d", PfmuIdx); - Set_TxBfProfileTag_PfmuIdx(pAd, cmdStr); - /* ETxBf */ - Set_TxBfProfileTag_BfType(pAd, "1"); - /* BW20 */ - Set_TxBfProfileTag_DBW(pAd, "0"); - /* SU */ - Set_TxBfProfileTag_SuMu(pAd, "0"); - /* PFMU memory allocation */ - snprintf(cmdStr, 24, "00:00:00:01:00:02:00:03"); - Set_TxBfProfileTag_Mem(pAd, cmdStr); - /* Nr:Nc:Ng:LM:CB:HTCE */ - snprintf(cmdStr, 18, "%.2x:%.2x:00:01:00:00", Nr, Nc); - Set_TxBfProfileTag_Matrix(pAd, cmdStr); - /* SNR */ - snprintf(cmdStr, 12, "00:00:00:00"); - Set_TxBfProfileTag_SNR(pAd, "00:00:00:00"); - /* SMART Antenna */ - Set_TxBfProfileTag_SmartAnt(pAd, "0"); - /* SE index */ - Set_TxBfProfileTag_SeIdx(pAd, "0"); - /* Rmsd */ - Set_TxBfProfileTag_RmsdThrd(pAd, "0"); - /* MCS threshold */ - snprintf(cmdStr, 18, "00:00:00:00:00:00"); - Set_TxBfProfileTag_McsThrd(pAd, cmdStr); - /* Invalid the tag */ - Set_TxBfProfileTag_InValid(pAd, "1"); - /* Update PFMU tag */ - snprintf(cmdStr, sizeof(cmdStr), "%d", PfmuIdx); - Set_TxBfProfileTagWrite(pAd, cmdStr); - /* Configure the BF StaRec */ - if (ATECtrl->fgBw160) { - snprintf(cmdStr, sizeof(cmdStr), - "01:01:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], - ATECtrl->Addr1[2], ATECtrl->Addr1[3], - ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - } else { - if (control_band_idx == 0) { - snprintf(cmdStr, sizeof(cmdStr), - "01:00:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], - ATECtrl->Addr1[2], ATECtrl->Addr1[3], - ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - } else { - snprintf(cmdStr, sizeof(cmdStr), - "01:01:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], - ATECtrl->Addr1[2], ATECtrl->Addr1[3], - ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - } - } - Set_StaRecCmmUpdate(pAd, cmdStr); - - switch (Nr) { - case 1: - NdpNss = 8; /* MCS8, 2 streams */ - break; - - case 2: - NdpNss = 16; /* MCS16, 3 streams */ - break; - - case 3: - NdpNss = 24; /* MCS24, 4 streams */ - break; - - default: - NdpNss = 24; - break; - } - - snprintf( - cmdStr, sizeof(cmdStr), - "01:00:%.2x:00:01:00:%.2x:00:02:%.2x:%.2x:00:00:00:00:00:00:01:00:02:00:03:00", - PfmuIdx, NdpNss, Nc, Nr); - /* MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", cmdStr)); */ - Set_StaRecBfUpdate(pAd, cmdStr); - Set_StaRecBfRead(pAd, "1"); - /* Configure WTBL */ - /* iwpriv ra0 set ManualAssoc =mac:222222222222-type:sta-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:2-pfmuId:0 */ - snprintf( - cmdStr, sizeof(cmdStr), - "mac:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x-type:sta-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:%d-pfmuId:%d\n", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], ATECtrl->Addr1[2], - ATECtrl->Addr1[3], ATECtrl->Addr1[4], ATECtrl->Addr1[5], - (Nc + 1), PfmuIdx); - /* MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", cmdStr)); */ - SetATEAssocProc(pAd, cmdStr); - /* Update the information requested by ATE Tx Gen */ - ATECtrl->pfmu_info[0].wcid = 1; - ATECtrl->pfmu_info[0].bss_idx = 0; - NdisMoveMemory(ATECtrl->pfmu_info[0].addr, ATECtrl->Addr1, - MAC_ADDR_LEN); - return TRUE; -} - -INT32 SetATEIBfPhaseComp(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 Ret, i; - UCHAR ucBW, ucGroup, ucBand, ucDbdcBandIdx, *value, ucBuf[5]; - BOOLEAN fgRdFromE2p, fgDisComp; - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 14) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - AtoH(value, &ucBuf[i++], 1); - } - - ucBW = ucBuf[0]; - ucDbdcBandIdx = ucBuf[1]; - ucGroup = ucBuf[2]; - fgRdFromE2p = ucBuf[3]; - fgDisComp = ucBuf[4]; - ucBand = (ucGroup == 1) ? 1 : 0; - Ret = CmdITxBfPhaseComp(pAd, ucBW, ucBand, ucDbdcBandIdx, ucGroup, - fgRdFromE2p, fgDisComp); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEIBfPhaseVerify(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 Ret, i; - UCHAR ucGroup, ucGroup_L_M_H, ucPhaseCalType, ucBand, *value, ucBuf[6]; - BOOLEAN fgSX2, fgRdFromE2p; - UCHAR ucPhaseVerifyLnaGainLevel; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 17) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - AtoH(value, &ucBuf[i++], 1); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - ucGroup = ucBuf[0]; - ucGroup_L_M_H = ucBuf[1]; - fgSX2 = ucBuf[2]; - ucPhaseCalType = ucBuf[3]; - ucPhaseVerifyLnaGainLevel = ucBuf[4]; - fgRdFromE2p = ucBuf[5]; - ucBand = (ucGroup == 1) ? 1 : 0; - Ret = CmdITxBfPhaseComp(pAd, BW_20, ucBand, fgSX2, ucGroup, fgRdFromE2p, - FALSE); - - if (Ret) { - /* Free memory allocated by iBF phase calibration */ - if (ops->iBFPhaseFreeMem) - ops->iBFPhaseFreeMem(pAd); - - return FALSE; - } - - Ret = CmdITxBfPhaseCal(pAd, ucGroup, ucGroup_L_M_H, fgSX2, - ucPhaseCalType, ucPhaseVerifyLnaGainLevel); - - if (Ret) { - /* Free memory allocated by iBF phase calibration */ - if (ops->iBFPhaseFreeMem) - ops->iBFPhaseFreeMem(pAd); - - return FALSE; - } - - return TRUE; -} - -INT32 SetATETxBfPhaseE2pUpdate(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 i; - UCHAR ucGroup, ucUpdateAllType, *value, ucBuf[3]; - BOOLEAN fgSX2; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (Arg == NULL) - return FALSE; - - if (strlen(Arg) != 8) - return FALSE; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid*/ - - AtoH(value, &ucBuf[i++], 1); - } - - ucGroup = ucBuf[0]; - fgSX2 = ucBuf[1]; - ucUpdateAllType = ucBuf[2]; - ops->iBFPhaseCalE2PUpdate(pAd, ucGroup, fgSX2, ucUpdateAllType); - return TRUE; -} - -INT32 SetATETxSoundingProc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - UCHAR SoundingMode; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: SoundingMode = %s\n", __func__, Arg)); - SoundingMode = simple_strtol(Arg, 0, 10); - Ret = ATEOp->SetATETxSoundingProc(pAd, SoundingMode); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEConTxETxBfInitProc(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT8 loop_index; - INT status = TRUE; - CHAR *value = 0; - UINT8 TxMode = 0; - UINT8 MCS = 0; - UINT8 BW = 0; - UINT8 VhtNss = 0; - UINT8 TRxStream = 0; - UINT8 Power = 0; - UINT8 Channel = 0; - UINT8 Channel2 = 0; - UINT8 Channl_band = 0; - UINT16 TxPktLength = 0; - UINT8 Nr = 0; - UINT8 LM = 0; - UCHAR OwnMacIdx = 0; - UCHAR wdev_idx = 0; - UCHAR WlanIdx = 1; - UCHAR BssIdx = 0; - UCHAR PfmuId = WlanIdx - 1; - ULONG stTimeChk0, stTimeChk1; - RTMP_STRING cmdStr[80]; - UCHAR *template; -#ifdef DBDC_MODE - struct _BAND_INFO *Info = &(ATECtrl->band_ext[0]); -#endif /* DBDC_MODE */ - struct wifi_dev *pWdev = NULL; - - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Configure Input Parameter */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - - /* sanity check for input parameter*/ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - return FALSE; - } - - if (strlen(Arg) != 33) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong parameter format!!\n", __func__)); - return FALSE; - } - - /* Parsing input parameter */ - for (loop_index = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":"), loop_index++) { - switch (loop_index) { - case 0: - TxMode = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 1: - MCS = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 2: - BW = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 3: - VhtNss = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 4: - TRxStream = - simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 5: - Power = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 6: - Channel = - simple_strtol(value, 0, 10); /* 3-bit format */ - break; - - case 7: - Channel2 = - simple_strtol(value, 0, 10); /* 3-bit format */ - break; - - case 8: - Channl_band = - simple_strtol(value, 0, 10); /* 1-bit format */ - break; - - case 9: - TxPktLength = - simple_strtol(value, 0, 10); /* 5-bit format */ - break; - - default: { - status = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set wrong parameters\n", __func__)); - break; - } - } - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: TxMode = %d, MCS = %d, BW = %d, VhtNss = %d, TRxStream = %d\n", - __func__, TxMode, MCS, BW, VhtNss, TRxStream)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Power = %d, Channel = %d, Channel2 = %d, Channl_band = %d, TxPktLength = %d\n", - __func__, Power, Channel, Channel2, Channl_band, TxPktLength)); - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Load Preliminary Configuration */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ -#ifdef CONFIG_AP_SUPPORT - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx = %d\n", __func__, control_band_idx)); -#endif /* CONFIG_AP_SUPPORT */ - - /* obtain wireless device index */ - wdev_idx = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, wdev_idx); - pWdev = pAd->wdev_list[wdev_idx]; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wdev_idx = %d\n", __func__, wdev_idx)); - - /* obtain TemplateFrame */ - - if (control_band_idx == 0) - ATECtrl->TemplateFrame = TemplateFrame; - -#ifdef DBDC_MODE - else if (control_band_idx == 1) - NdisMoveMemory(&(Info->TemplateFrame), TemplateFrame, 32); - -#endif /*DBDC_MODE*/ - - /* sanity check for Device list */ - if (!pWdev) - goto err0; - - OwnMacIdx = pWdev->OmacIdx; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: OwnMacIdx = %d\n", __func__, OwnMacIdx)); - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* DUT TxBf Initialization */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - NdisGetSystemUpTime(&stTimeChk0); - /* Start ATE Mode */ - SetATE(pAd, "ATESTART"); - /* Enable ETxBF Capability */ - CmdTxBfHwEnableStatusUpdate(pAd, TRUE, FALSE); - - /* set ATEDA=00:11:11:11:11:11 */ - if (control_band_idx == 0) { - ATECtrl->Addr1[0] = Addr1[0]; - ATECtrl->Addr1[1] = Addr1[1]; - ATECtrl->Addr1[2] = Addr1[2]; - ATECtrl->Addr1[3] = Addr1[3]; - ATECtrl->Addr1[4] = Addr1[4]; - ATECtrl->Addr1[5] = Addr1[5]; - snprintf(cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", ATECtrl->Addr1[0], - ATECtrl->Addr1[1], ATECtrl->Addr1[2], - ATECtrl->Addr1[3], ATECtrl->Addr1[4], - ATECtrl->Addr1[5]); - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - Info->Addr1[0] = Addr1[0]; - Info->Addr1[1] = Addr1[1]; - Info->Addr1[2] = Addr1[2]; - Info->Addr1[3] = Addr1[3]; - Info->Addr1[4] = Addr1[4]; - Info->Addr1[5] = Addr1[5]; - snprintf(cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", Info->Addr1[0], - Info->Addr1[1], Info->Addr1[2], Info->Addr1[3], - Info->Addr1[4], Info->Addr1[5]); - } - -#endif /* DBDC_MODE */ - SetATEDa(pAd, cmdStr); - - /* set ATESA=00:22:22:22:22:22 */ - if (control_band_idx == 0) { - ATECtrl->Addr2[0] = Addr2[0]; - ATECtrl->Addr2[1] = Addr2[1]; - ATECtrl->Addr2[2] = Addr2[2]; - ATECtrl->Addr2[3] = Addr2[3]; - ATECtrl->Addr2[4] = Addr2[4]; - ATECtrl->Addr2[5] = Addr2[5]; - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - Info->Addr2[0] = Addr2[0]; - Info->Addr2[1] = Addr2[1]; - Info->Addr2[2] = Addr2[2]; - Info->Addr2[3] = Addr2[3]; - Info->Addr2[4] = Addr2[4]; - Info->Addr2[5] = Addr2[5]; - } - -#endif /* DBDC_MODE */ - - /* set ATEBSSID=00:22:22:22:22:22 */ - if (control_band_idx == 0) { - ATECtrl->Addr3[0] = Addr3[0]; - ATECtrl->Addr3[1] = Addr3[1]; - ATECtrl->Addr3[2] = Addr3[2]; - ATECtrl->Addr3[3] = Addr3[3]; - ATECtrl->Addr3[4] = Addr3[4]; - ATECtrl->Addr3[5] = Addr3[5]; - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - Info->Addr3[0] = Addr3[0]; - Info->Addr3[1] = Addr3[1]; - Info->Addr3[2] = Addr3[2]; - Info->Addr3[3] = Addr3[3]; - Info->Addr3[4] = Addr3[4]; - Info->Addr3[5] = Addr3[5]; - } - -#endif /* DBDC_MODE */ -#ifdef CONFIG_AP_SUPPORT - - if (control_band_idx == 0) { - AsicDevInfoUpdate(pAd, 0x0, ATECtrl->Addr2, control_band_idx, - TRUE, DEVINFO_ACTIVE_FEATURE); - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - AsicDevInfoUpdate(pAd, 0x0, Info->Addr2, control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); - } - -#endif /* DBDC_MODE */ -#endif /* CONFIG_AP_SUPPORT */ - - /* BSS Info Update */ - if (control_band_idx == 0) { - BssIdx = 0; - /* OwnMacIdx = 0; */ - snprintf(cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", OwnMacIdx, - BssIdx, ATECtrl->Addr3[0], ATECtrl->Addr3[1], - ATECtrl->Addr3[2], ATECtrl->Addr3[3], - ATECtrl->Addr3[4], ATECtrl->Addr3[5]); - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - BssIdx = 1; - /* OwnMacIdx = 17; */ - snprintf(cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", OwnMacIdx, - BssIdx, Info->Addr3[0], Info->Addr3[1], Info->Addr3[2], - Info->Addr3[3], Info->Addr3[4], Info->Addr3[5]); - } - -#endif /* DBDC_MODE */ - Set_BssInfoUpdate(pAd, cmdStr); - /* Set ATE Tx Frame content */ - template = TESTMODE_GET_PARAM( - ATECtrl, control_band_idx, - TemplateFrame); /* structure type of TemplateFrame structure is HEADER_802_11 */ - NdisMoveMemory(template + 4, Addr1, MAC_ADDR_LEN); - NdisMoveMemory(template + 10, Addr2, MAC_ADDR_LEN); - NdisMoveMemory(template + 16, Addr3, MAC_ADDR_LEN); - /* Set Tx mode */ - snprintf(cmdStr, sizeof(cmdStr), "%d", TxMode); - SetATETxMode( - pAd, - cmdStr); /* 0: CCK 1: OFDM 2: HT Mixe dmode 3: HT Green Mode 4: VHT mode */ - /* RtmpOsMsDelay(100); */ - /* Set Tx MCS */ - snprintf(cmdStr, sizeof(cmdStr), "%d", MCS); - SetATETxMcs(pAd, cmdStr); - /* RtmpOsMsDelay(100); */ - /* Set Tx BW */ - snprintf(cmdStr, sizeof(cmdStr), "%d", BW); - SetATETxBw( - pAd, - cmdStr); /* 0: 20MHz 1: 40MHz 2: 80MHz 3: 160MHz(160C) 4: 5M 5: 10M 6: 160MHz (160NC) */ - /* RtmpOsMsDelay(100); */ - - /* Set Tx VhtNss */ - if (TxMode == 4) { - snprintf(cmdStr, sizeof(cmdStr), "%d", VhtNss); - SetATEVhtNss(pAd, cmdStr); - } - - /* set ATETXGI=0 */ - SetATETxGi(pAd, "0"); - - /* Set Tx Ant */ - /* bitwise representration, ex: 0x3 means wifi[0] and wifi[1] ON */ - if (control_band_idx == 0) { - if (TRxStream == 4) - SetATETxAntenna( - pAd, - "15"); /* 15 (0xF: wifi[0], wifi[1], wifi[2], wifi[3] on) */ - else if (TRxStream == 3) - SetATETxAntenna( - pAd, - "7"); /* 7 (0x7: wifi[0], wifi[1], wifi[2] on) */ - else if (TRxStream == 2) - SetATETxAntenna( - pAd, "3"); /* 3 (0x3: wifi[0], wifi[1] on) */ - } else if (control_band_idx == 1) { - SetATETxAntenna( - pAd, - "3"); /* 3 (0x3: wifi[2], wifi[3] on for DBDC mode) */ - TRxStream = 2; /* force TxStream to be 2T for DBDC mode */ - } - - /* Set Rx Ant */ - /* bitwise representration, ex: 0x3 means wifi[0] and wifi[1] ON */ - if (control_band_idx == 0) { - if (TRxStream == 4) - SetATERxAntenna(pAd, "15"); /* 15 (0xF all on) */ - else if (TRxStream == 3) - SetATERxAntenna( - pAd, - "7"); /* 7 (0x7: wifi[0], wifi[1], wifi[2] on) */ - else if (TRxStream == 2) - SetATERxAntenna( - pAd, "3"); /* 3 (0x3: wifi[0], wifi[1] on) */ - } else if (control_band_idx == 1) - SetATERxAntenna( - pAd, - "3"); /* 3 (0x3: wifi[2], wifi[3] on for DBDC mode */ - - /* Set ATE Channel */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Channel, Channel); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Channel_2nd, Channel2); - /* Set ATE Tx Power = 36 (unit is 0.5 dBm) */ - snprintf(cmdStr, sizeof(cmdStr), "%d", Power); - SetATETxPower0(pAd, cmdStr); - NdisGetSystemUpTime(&stTimeChk1); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): DUT Init Time consumption : %lu sec\n", __func__, - (stTimeChk1 - stTimeChk0) * 1000 / OS_HZ)); - - /* Device info Update */ - if (control_band_idx == 0) { - snprintf(cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", OwnMacIdx, - ATECtrl->Addr2[0], ATECtrl->Addr2[1], - ATECtrl->Addr2[2], ATECtrl->Addr2[3], - ATECtrl->Addr2[4], ATECtrl->Addr2[5], - control_band_idx); - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - snprintf(cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", OwnMacIdx, - Info->Addr2[0], Info->Addr2[1], Info->Addr2[2], - Info->Addr2[3], Info->Addr2[4], Info->Addr2[5], - control_band_idx); - } - -#endif /* DBDC_MODE */ - Set_DevInfoUpdate(pAd, cmdStr); - /* STOP AUTO Sounding */ - Set_Stop_Sounding_Proc(pAd, "1"); - /* Enable MAC Rx */ - SetATE(pAd, "RXFRAME"); - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* EBF Profile Cnfiguration */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* set TxBfProfileTag_PFMU ID */ - snprintf(cmdStr, sizeof(cmdStr), "%d", PfmuId); - Set_TxBfProfileTag_PfmuIdx(pAd, cmdStr); - /* set TxBfProfileTag_Bf Type */ - Set_TxBfProfileTag_BfType(pAd, "1"); /* 0: iBF 1: eBF */ - /* set TxBfProfileTag_DBW */ - snprintf(cmdStr, sizeof(cmdStr), "%d", - BW); /* 0: 20MHz 1: 40MHz 2: 80MHz 3: 160MHz(160NC) */ - Set_TxBfProfileTag_DBW(pAd, cmdStr); - /* set TxBfProfileTag_SUMU */ - Set_TxBfProfileTag_SuMu(pAd, "0"); /* 0: SU 1: MU */ - /* PFMU memory allocation */ - snprintf(cmdStr, 24, "00:00:00:01:00:02:00:03"); - Set_TxBfProfileTag_Mem(pAd, cmdStr); - - /* set TxBfProfileTag_Matrix */ - if (TxMode == 4 && ((BW == 3) || (BW == 6))) { - if (TRxStream == 4) - Nr = 1; - else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Invalid Configuration for BW160!! For BW160, TxStream number must be 4!!\n", - __func__)); - } else { - if (TRxStream == 4) - Nr = 3; - else if (TRxStream == 3) - Nr = 2; - else if (TRxStream == 2) - Nr = 1; - } - - if (TxMode == 4) - LM = 2; - else if (TxMode == 2) - LM = 1; - - snprintf(cmdStr, 18, "%.2x:00:00:%.2x:00:00", Nr, - LM); /* Nr:Nc:Ng:LM:CB:HTCE */ - Set_TxBfProfileTag_Matrix(pAd, cmdStr); - /* set TxBfProfileTag_SNR */ - snprintf(cmdStr, 12, "00:00:00:00"); - Set_TxBfProfileTag_SNR(pAd, "00:00:00:00"); - /* set TxBfProfileTag_Smart Antenna */ - Set_TxBfProfileTag_SmartAnt(pAd, "0"); - /* set TxBfProfileTag_SE index */ - Set_TxBfProfileTag_SeIdx(pAd, "0"); - /* set TxBfProfileTag_Rmsd */ - Set_TxBfProfileTag_RmsdThrd(pAd, "0"); - /* set TxBfProfileTag_MCS Threshold */ - snprintf(cmdStr, 18, "00:00:00:00:00:00"); - Set_TxBfProfileTag_McsThrd(pAd, cmdStr); - /* set TxBfProfileTag_Invalid Tag */ - Set_TxBfProfileTag_InValid(pAd, "1"); - /* Update PFMU Tag */ - snprintf(cmdStr, sizeof(cmdStr), "00"); - Set_TxBfProfileTagWrite(pAd, cmdStr); - - /* Station Record Common Info Update */ - if (control_band_idx == 0) { - snprintf(cmdStr, sizeof(cmdStr), - "%.2x:%.2x:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", WlanIdx, - BssIdx, ATECtrl->Addr1[0], ATECtrl->Addr1[1], - ATECtrl->Addr1[2], ATECtrl->Addr1[3], - ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - snprintf(cmdStr, sizeof(cmdStr), - "%.2x:%.2x:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", WlanIdx, - BssIdx, Info->Addr1[0], Info->Addr1[1], Info->Addr1[2], - Info->Addr1[3], Info->Addr1[4], Info->Addr1[5]); - } - -#endif /* DBDC_MODE */ - Set_StaRecCmmUpdate(pAd, cmdStr); - - /* Station Record BF Info Update */ - if (TxMode == 4) - snprintf( - cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:00:01:09:00:09:04:00:%.2x:%.2x:00:00:00:00:00:01:00:02:00:03:00", - WlanIdx, BssIdx, PfmuId, Nr, BW); - else if (TxMode == 2) { - if (TRxStream == 4) - snprintf( - cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:00:01:00:18:00:02:00:%.2x:%.2x:00:00:00:00:00:01:00:02:00:03:00", - WlanIdx, BssIdx, PfmuId, Nr, BW); - else if (TRxStream == 3) - snprintf( - cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:00:01:00:10:00:02:00:%.2x:%.2x:00:00:00:00:00:01:00:02:00:03:00", - WlanIdx, BssIdx, PfmuId, Nr, BW); - else if (TRxStream == 2) - snprintf( - cmdStr, sizeof(cmdStr), - "%.2x:%.2x:%.2x:00:01:00:08:00:02:00:%.2x:%.2x:00:00:00:00:00:01:00:02:00:03:00", - WlanIdx, BssIdx, PfmuId, Nr, BW); - } - - Set_StaRecBfUpdate(pAd, cmdStr); - /* Read Station Record BF Info */ - Set_StaRecBfRead(pAd, "1"); - - /* Configure WTBL and Manual Association */ - /* iwpriv ra0 set ManualAssoc=mac:22:22:22:22:22:22-type:sta-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:2-pfmuId:0 */ - if (control_band_idx == 0) { - snprintf( - cmdStr, sizeof(cmdStr), - "mac:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x-type:sta-wtbl:%.2x-ownmac:%.2x-mode:aanac-bw:20-nss:2-pfmuId:0\n", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], ATECtrl->Addr1[2], - ATECtrl->Addr1[3], ATECtrl->Addr1[4], ATECtrl->Addr1[5], - WlanIdx, OwnMacIdx); - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - snprintf( - cmdStr, sizeof(cmdStr), - "mac:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x-type:sta-wtbl:%.2x-ownmac:%.2x-mode:aanac-bw:20-nss:2-pfmuId:0\n", - Info->Addr1[0], Info->Addr1[1], Info->Addr1[2], - Info->Addr1[3], Info->Addr1[4], Info->Addr1[5], WlanIdx, - OwnMacIdx); - } - -#endif /* DBDC_MODE */ - SetATEAssocProc(pAd, cmdStr); - /* Read Station Record BF Info */ - Set_StaRecBfRead(pAd, "1"); - /* Read PFMU Tag Info */ - Set_TxBfProfileTagRead(pAd, "00:01"); - /* Update the information requested by ATE Tx packet generation */ - ATECtrl->pfmu_info[PfmuId].wcid = WlanIdx; - ATECtrl->pfmu_info[PfmuId].bss_idx = BssIdx; - NdisMoveMemory(ATECtrl->pfmu_info[PfmuId].addr, ATECtrl->Addr1, - MAC_ADDR_LEN); - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* EBF TxBf Apply */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* WTBL Update TxBf Apply */ - Set_TxBfTxApply(pAd, "01:01:00:00:00"); - /* Read Station Bf Record */ - Set_StaRecBfRead(pAd, "1"); - /* Trigger one shot Sounding packet */ - Set_Trigger_Sounding_Proc(pAd, "00:01:00:01:00:00:00"); - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Continuous packet Tx Initializaton */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Set ATE EBF Enable */ - SetATEEBfTx( - pAd, - "1"); /* need to before switch channel for TxStream config since TxStream only can update correct when etxbf is enable for 3T and 2T */ - /* Set ATE Channel */ - snprintf(cmdStr, sizeof(cmdStr), "%d:%d:0:%d", Channel, Channl_band, - Channel2); - SetATEChannel(pAd, cmdStr); - RtmpOsMsDelay(1000); - /* Set ATE Tx packet Length (unit is byte) */ - snprintf(cmdStr, sizeof(cmdStr), "%d", TxPktLength); - SetATETxLength(pAd, cmdStr); - /* Set ATE Tx packet number = 0 (Continuous packet Tx) */ - SetATETxCount(pAd, "0"); - /* Set ATE Tx packet Length = 4 (unit is slot time) */ - SetATEIpg(pAd, "4"); - /* Set Queue Priority = 1 (WMM_BK Queue) */ - SetATEQid(pAd, "1"); - /* Set ATE Tx Dequeue size = 4 (allocate 4 packet after receiving 1 free count) (NOT Use Now!!!)*/ - /* ATE Start Continuos Packet Tx */ - /* SetATE(pAd, "TXFRAMESKB"); */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Periodical Sounding Trigger */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Trigger Periodical Sounding packet */ - Set_Trigger_Sounding_Proc(pAd, "02:01:FF:01:00:00:00"); - return status; -err0: - return FALSE; -} - -INT32 SetATEConTxETxBfGdProc(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT8 loop_index; - INT status = TRUE; - CHAR *value = 0; - UINT32 TxMode = 0; - UINT32 MCS = 0; - UINT32 BW = 0; - UINT32 Channel = 0; - UINT8 Channel2 = 0; - UINT8 Channl_band = 0; - UINT32 CRvalue = 0; - ULONG stTimeChk0, stTimeChk1; - RTMP_STRING cmdStr[80]; - - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Configure Input Parameter */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - - /* sanity check for input parameter*/ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - return FALSE; - } - - if (strlen(Arg) != 18) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong parameter format!!\n", __func__)); - return FALSE; - } - - /* Parsing input parameter */ - for (loop_index = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":"), loop_index++) { - switch (loop_index) { - case 0: - TxMode = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 1: - MCS = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 2: - BW = simple_strtol(value, 0, 10); /* 2-bit format */ - break; - - case 3: - Channel = - simple_strtol(value, 0, 10); /* 3-bit format */ - break; - - case 4: - Channel2 = - simple_strtol(value, 0, 10); /* 3-bit format */ - break; - - case 5: - Channl_band = - simple_strtol(value, 0, 10); /* 1-bit format */ - break; - - default: { - status = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set wrong parameters\n", __func__)); - break; - } - } - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: TxMode = %d, MCS = %d, BW = %d, Channel = %d, Channel2 = %d, Channl_band = %d\n", - __func__, TxMode, MCS, BW, Channel, Channel2, Channl_band)); - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* GOLDEN TxBf Initialization */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - NdisGetSystemUpTime(&stTimeChk0); - /* Start ATE Mode */ - SetATE(pAd, "ATESTART"); - /* set ATEDA=00:22:22:22:22:22 */ - ATECtrl->Addr1[0] = Addr2[0]; - ATECtrl->Addr1[1] = Addr2[1]; - ATECtrl->Addr1[2] = Addr2[2]; - ATECtrl->Addr1[3] = Addr2[3]; - ATECtrl->Addr1[4] = Addr2[4]; - ATECtrl->Addr1[5] = Addr2[5]; - snprintf(cmdStr, sizeof(cmdStr), "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], ATECtrl->Addr1[2], - ATECtrl->Addr1[3], ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - SetATEDa(pAd, cmdStr); - /* set ATESA=00:11:11:11:11:11 */ - ATECtrl->Addr2[0] = Addr1[0]; - ATECtrl->Addr2[1] = Addr1[1]; - ATECtrl->Addr2[2] = Addr1[2]; - ATECtrl->Addr2[3] = Addr1[3]; - ATECtrl->Addr2[4] = Addr1[4]; - ATECtrl->Addr2[5] = Addr1[5]; - /* set ATEBSSID=00:22:22:22:22:22 */ - ATECtrl->Addr3[0] = Addr3[0]; - ATECtrl->Addr3[1] = Addr3[1]; - ATECtrl->Addr3[2] = Addr3[2]; - ATECtrl->Addr3[3] = Addr3[3]; - ATECtrl->Addr3[4] = Addr3[4]; - ATECtrl->Addr3[5] = Addr3[5]; -#ifdef CONFIG_AP_SUPPORT - AsicDevInfoUpdate(pAd, 0x0, ATECtrl->Addr2, control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); -#endif /* CONFIG_AP_SUPPORT */ - - if (control_band_idx == 0) - snprintf(cmdStr, sizeof(cmdStr), - "11:00:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr3[0], ATECtrl->Addr3[1], - ATECtrl->Addr3[2], ATECtrl->Addr3[3], - ATECtrl->Addr3[4], ATECtrl->Addr3[5]); - -#ifdef DBDC_MODE - else if (control_band_idx == 1) - snprintf(cmdStr, sizeof(cmdStr), - "00:01:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", - ATECtrl->Addr3[0], ATECtrl->Addr3[1], - ATECtrl->Addr3[2], ATECtrl->Addr3[3], - ATECtrl->Addr3[4], ATECtrl->Addr3[5]); -#endif /* DBDC_MODE */ - - Set_BssInfoUpdate(pAd, cmdStr); - /* Set Tx mode */ - snprintf(cmdStr, sizeof(cmdStr), "%d", TxMode); - SetATETxMode( - pAd, - cmdStr); /* 0: CCK 1: OFDM 2: HT Mixe dmode 3: HT Green Mode 4: VHT mode */ - /* Set Tx MCS */ - snprintf(cmdStr, sizeof(cmdStr), "%d", MCS); - SetATETxMcs(pAd, cmdStr); - /* Set Tx BW */ - snprintf(cmdStr, sizeof(cmdStr), "%d", BW); - SetATETxBw( - pAd, - cmdStr); /* 0: 20MHz 1: 40MHz 2: 80MHz 3: 160MHz(160C) 4: 5M 5: 10M 6: 160MHz (160NC) */ - /* set ATETXGI=0 */ - SetATETxGi(pAd, "0"); - - /* Set Tx Ant */ - /* bitwise representration, ex: 0x5 means wifi[0] and wifi[2] ON */ - if ((BW == 3) || (BW == 6)) - SetATETxAntenna(pAd, "5"); /* for BW160C, BW160NC */ - else - SetATETxAntenna(pAd, "1"); /* for BW20, BW40, BW80 */ - - /* Set Rx Ant */ - /* bitwise representration, ex: 0x5 means wifi[0] and wifi[2] ON */ - if ((BW == 3) || (BW == 6)) - SetATERxAntenna(pAd, "5"); /* for BW160C, BW160NC */ - else - SetATERxAntenna(pAd, "1"); /* for BW20, BW40, BW80 */ - - /* Configure WTBL */ - /* iwpriv ra0 set ManualAssoc = mac:222222222222-type:sta-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:1-pfmuId:0 */ - snprintf( - cmdStr, sizeof(cmdStr), - "mac:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x-type:ap-wtbl:1-ownmac:0-mode:aanac-bw:20-nss:1-pfmuId:0\n", - ATECtrl->Addr1[0], ATECtrl->Addr1[1], ATECtrl->Addr1[2], - ATECtrl->Addr1[3], ATECtrl->Addr1[4], ATECtrl->Addr1[5]); - SetATEAssocProc(pAd, cmdStr); - NdisGetSystemUpTime(&stTimeChk1); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: SetATETxBfGdInitProc Time consumption : %lu sec\n", - __func__, (stTimeChk1 - stTimeChk0) * 1000 / OS_HZ)); - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Turn On BBP CR for Rx */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* iwpriv ra0 mac 82070280=00008001 */ - PHY_IO_WRITE32(pAd, 0x10280, 0x00008001); - /* check */ - PHY_IO_READ32(pAd, 0x10280, &CRvalue); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: <0x82070280> = 0x%x\n", __func__, CRvalue)); - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Sounding Mechanism TRx configuration */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Set Channel Info to ATE Control structure */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Channel, Channel); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Channel_2nd, Channel2); -#if !defined(CONFIG_AP_SUPPORT) && !defined(DBDC_MODE) - /* Only to prevent build error: unused variable ¡¥BandIdx¡¦*/ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_NOISY, - ("control_band_idx=%d\n", control_band_idx)); -#endif - /* Set ATE Channel */ - snprintf(cmdStr, sizeof(cmdStr), "%d:%d:0:%d", Channel, Channl_band, - Channel2); - SetATEChannel(pAd, cmdStr); - RtmpOsMsDelay(1000); - /* ATE Start Continuos Packet Rx */ - SetATE(pAd, "RXFRAME"); - /* ATE MAC TRx configuration */ - MtATESetMacTxRx( - pAd, 6, 1, - control_band_idx); /* ENUM_ATE_MAC_RX_RXV: MAC to PHY Rx Enable */ - return status; -} - -INT32 SetATESpeIdx(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - UINT8 loop_index; - CHAR *value = 0; - INT status = TRUE; - - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Configure Input Parameter */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - - /* sanity check for input parameter*/ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - return FALSE; - } - - if (strlen(Arg) != 1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong parameter format!!\n", __func__)); - return FALSE; - } - - /* Parsing input parameter */ - for (loop_index = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":"), loop_index++) { - switch (loop_index) { - case 0: - BF_ON_certification = simple_strtol(value, 0, 10); - break; - - default: { - status = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set wrong parameters\n", __func__)); - break; - } - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: BF_ON_certification = %d !!!!!\n", __func__, - BF_ON_certification)); - return status; -} - -INT32 SetATEEBfTx(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT8 loop_index; - CHAR *value = 0; - UINT32 eTxBf = 0; - INT status = TRUE; - UCHAR addr[6] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; - UCHAR *pate_pkt; - UCHAR WlanIdx = 1; - UCHAR PfmuId = WlanIdx - 1; -#ifdef DBDC_MODE - struct _BAND_INFO *Info = &(ATECtrl->band_ext[0]); -#endif /* DBDC_MODE */ - - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Configure Input Parameter */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - - /* sanity check for input parameter*/ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - return FALSE; - } - - if (strlen(Arg) != 1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong parameter format!!\n", __func__)); - return FALSE; - } - - /* Parsing input parameter */ - for (loop_index = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":"), loop_index++) { - switch (loop_index) { - case 0: - eTxBf = simple_strtol(value, 0, 10); - break; - - default: { - status = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set wrong parameters\n", __func__)); - break; - } - } - } - -#ifdef CONFIG_AP_SUPPORT - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: control_band_idx = %d\n", __func__, control_band_idx)); -#endif /* CONFIG_AP_SUPPORT */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* EBF Configuration */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - if (control_band_idx == 0) { - ATECtrl->eTxBf = eTxBf; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: ATECtrl->eTxBf = %d !!!!!\n", __func__, - ATECtrl->eTxBf)); - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - Info->eTxBf = eTxBf; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Info->eTxBf = %d !!!!!\n", __func__, - Info->eTxBf)); - } - -#endif /* DBDC_MODE */ - ATECtrl->wcid_ref = - WlanIdx; /* For Sportan certification, only Golden */ - NdisCopyMemory(ATECtrl->pfmu_info[PfmuId].addr, addr, MAC_ADDR_LEN); - - if (control_band_idx == 0) { - if (ATECtrl->eTxBf) - SetATESpeIdx(pAd, "1"); - else - SetATESpeIdx(pAd, "0"); - } -#ifdef DBDC_MODE - else if (control_band_idx == 1) { - if (Info->eTxBf) - SetATESpeIdx(pAd, "1"); - else - SetATESpeIdx(pAd, "0"); - } - -#endif /* DBDC_MODE */ - pate_pkt = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, pate_pkt); - /* Generate new packet with new contents */ - MT_ATEGenPkt(pAd, pate_pkt, control_band_idx); - return status; -} - -INT32 SetATEEBFCE(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - UINT8 loop_index; - CHAR *value = 0; - INT status = TRUE; - - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - /* Configure Input Parameter */ - /*----------------------------------------------------------------------------------------------------------------------------------------*/ - - /* sanity check for input parameter*/ - if (Arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: No parameters!!\n", __func__)); - return FALSE; - } - - if (strlen(Arg) != 1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong parameter format!!\n", __func__)); - return FALSE; - } - - /* Parsing input parameter */ - for (loop_index = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":"), loop_index++) { - switch (loop_index) { - case 0: - g_EBF_certification = simple_strtol(value, 0, 10); - break; - - default: { - status = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set wrong parameters\n", __func__)); - break; - } - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: g_EBF_certification = %d !!!!!\n", __func__, - g_EBF_certification)); - return status; -} - -INT32 SetATEEBFCEInfo(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - INT status = TRUE; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: g_EBF_certification = %d !!!!!\n", __func__, - g_EBF_certification)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BF_ON_certification = %d !!!!!\n", __func__, - BF_ON_certification)); - return status; -} - -INT32 SetATEEBFCEHelp(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - INT status = TRUE; - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================================================================\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ATE ETxBF Certification Procedure Guide\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================================================================\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("For HT20 mode\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 1) iwpriv ra0 set ATEEBFCE=1\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 2) iwpriv ra0 set ATEConTxETxBfGdProc=02:00:00:036:112:1 (Use in Golden Device)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 3) iwpriv ra0 set ATEConTxETxBfInitProc=02:00:00:01:04:18:036:112:1:04000\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 4) iwpriv ra0 set ATETXEBF=1 (Tx packet apply BF On)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 5) iwpriv ra0 set ATE=TXFRAME\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 6) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if apply then nonzero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 7) check IQxel waveform\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 8) iwpriv ra0 set ATETXEBF=0 (Tx packet apply BF Off)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 9) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if not apply then zero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("10) check Iqxel waveformn")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("For HT40 mode\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 1) iwpriv ra0 set ATEEBFCE=1\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 2) iwpriv ra0 set ATEConTxETxBfGdProc=02:00:01:036:112:1 (Use in Golden Device)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 3) iwpriv ra0 set ATEConTxETxBfInitProc=02:00:01:01:04:18:036:112:1:04000\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 4) iwpriv ra0 set ATETXEBF=1 (Tx packet apply BF On)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 5) iwpriv ra0 set ATE=TXFRAMESKB\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 6) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if apply then nonzero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 7) check IQxel waveform\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 8) iwpriv ra0 set ATETXEBF=0 (Tx packet apply BF Off)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 9) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if not apply then zero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("10) check Iqxel waveform\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("For VHT80 mode\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 1) iwpriv ra0 set ATEEBFCE=1\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 2) iwpriv ra0 set ATEConTxETxBfGdProc=04:00:02:036:112:1 (Use in Golden Device)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 3) iwpriv ra0 set ATEConTxETxBfInitProc=04:00:02:01:04:18:036:112:1:16000\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 4) iwpriv ra0 set ATETXEBF=1 (Tx packet apply BF On)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 5) iwpriv ra0 set ATE=TXFRAMESKB\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 6) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if apply then nonzero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 7) check IQxel waveform\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 8) iwpriv ra0 set ATETXEBF=0 (Tx packet apply BF Off)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 9) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if not apply then zero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("10) check Iqxel waveform\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("For VHT160C mode\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 1) iwpriv ra0 set ATEEBFCE=1\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 2) iwpriv ra0 set ATEConTxETxBfGdProc=04:00:03:036:112:1 (Use in Golden Device)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 3) iwpriv ra0 set ATEConTxETxBfInitProc=04:00:03:01:04:18:036:112:1:16000\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 4) iwpriv ra0 set ATETXEBF=1 (Tx packet apply BF On)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 5) iwpriv ra0 set ATE=TXFRAMESKB\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 6) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if apply then nonzero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 7) check IQxel waveform\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 8) iwpriv ra0 set ATETXEBF=0 (Tx packet apply BF Off)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 9) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if not apply then zero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("10) check Iqxel waveform\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("For VHT160NC mode\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 1) iwpriv ra0 set ATEEBFCE=1\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 2) iwpriv ra0 set ATEConTxETxBfGdProc=04:00:06:036:112:1 (Use in Golden Device)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 3) iwpriv ra0 set ATEConTxETxBfInitProc=04:00:06:01:04:18:036:112:1:16000\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 4) iwpriv ra0 set ATETXEBF=1 (Tx packet apply BF On)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 5) iwpriv ra0 set ATE=TXFRAMESKB\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 6) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if apply then nonzero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 7) check IQxel waveform\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 8) iwpriv ra0 set ATETXEBF=0 (Tx packet apply BF Off)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 9) iwpriv ra0 mac 820fa09c (check [15:0] eBF counter, if not apply then zero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("10) check Iqxel waveform\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("For DBDC Band1 HT20 mode\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 1) configure DBDC mode and Reboot system\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 2) iwpriv ra1 set ATEEBFCE=1\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 3) iwpriv ra1 set ATEConTxETxBfGdProc=02:00:00:36:112:1 (Use in Golden Device)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 4) iwpriv ra1 set ATEConTxETxBfInitProc=02:00:00:01:02:18:36:112:1:04000\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 5) iwpriv ra1 set ATETXEBF=1 (Tx packet apply BF On)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 6) iwpriv ra1 set ATE=TXFRAMESKB\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 7) iwpriv ra1 mac 820fa09c (check [15:0] eBF counter, if apply then nonzero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 8) check IQxel waveform\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 9) iwpriv ra1 set ATETXEBF=0 (Tx packet apply BF Off)\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("10) iwpriv ra1 mac 820fa09c (check [15:0] eBF counter, if not apply then zero)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("11) check Iqxel waveform\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================================================================\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Method for Dynamical Control Tx Power\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================================================================\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 1) Follow ETxBF Certification Procedure to enable TxBf packet at first\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 2) Use command \"iwpriv ra0 set ATE=TXSTOP\" to stop Tx\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 3) Use command \"iwpriv ra0 set ATETXPOW0=XX\" to configure Tx Power DAC value for OFDM 54M\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 4) USe command \"ra0 set ATE=TXFRAMESKB\" to start continuous packet Tx\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================================================================\n")); - return status; -} - -#endif /* TXBF_SUPPORT && MT_MAC */ - -INT32 SetATEHelp(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATE=ATESTART, ATESTOP, TXCONT, TXCARR, TXCARS, TXFRAME, RXFRAME\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("ATEDA\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("ATESA\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("ATEBSSID\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATECHANNEL, range:0~14\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXPOW0, set power level of antenna 1.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXPOW1, set power level of antenna 2.\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXANT, set TX antenna. 0:all, 1:antenna one, 2:antenna two.\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATERXANT, set RX antenna.0:all, 1:antenna one, 2:antenna two, 3:antenna three.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXBW, set BandWidth, 0:20MHz, 1:40MHz\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXLEN, set Frame length, range 24~%d\n", - (MAX_FRAME_SIZE - 34 /* == 2312 */))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXCNT, set how many frame going to transmit.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXMCS, set MCS, reference to rate table.\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXMODE, set Mode 0:CCK, 1:OFDM, 2:HT-Mix, 3:GreenField, 4:VHT, reference to rate table.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATETXGI, set GI interval, 0:Long, 1:Short\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATERXFER, 0:disable Rx Frame error rate. 1:enable Rx Frame error rate.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATERRF, show all RF registers.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATELDE2P, load EEPROM from .bin file.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATERE2P, display all EEPROM content.\n")); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATEAUTOALC, enable ATE auto Tx alc (Tx auto level control).\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATEIPG, set ATE Tx frame IPG.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATEPAYLOAD, set ATE payload pattern for TxFrame.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATESHOW, display all parameters of ATE.\n")); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ATEHELP, online help.\n")); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 ATESampleRssi(PRTMP_ADAPTER pAd, RXWI_STRUC *pRxWI) -{ - INT32 Ret = 0; - - if (!Ret) - return TRUE; - else - return FALSE; -} - -#ifdef RTMP_PCI_SUPPORT -PNDIS_PACKET ATEPayloadInit(RTMP_ADAPTER *pAd, UINT32 TxIdx) -{ - return NULL; -} -#endif /* RTMP_MAC_PCI */ - -#ifdef RTMP_PCI_SUPPORT -INT32 ATEPayloadAlloc(PRTMP_ADAPTER pAd, UINT32 Index) -{ - return NDIS_STATUS_SUCCESS; -} -#endif /* RTMP_MAC_PCI */ - -INT32 ATEInit(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - NdisZeroMemory(ATECtrl, sizeof(*ATECtrl)); -#ifdef DBDC_MODE - NdisZeroMemory(&ATECtrl->band_ext[0], sizeof(struct _BAND_INFO)); -#endif /* DBDC_MODE */ - - ATECtrl->Mode = ATE_STOP; - ATECtrl->TxCount = 0xFFFFFFFF; - ATECtrl->payload[0] = 0xAA; - ATECtrl->FixedPayload = 1; - ATECtrl->TxLength = 1058; /* 1058 : sync with QA */ - ATECtrl->BW = BW_20; - ATECtrl->PhyMode = MODE_OFDM; - ATECtrl->Mcs = 7; - ATECtrl->Sgi = 0; /* LONG GI : 800 ns*/ - if (BOARD_IS_5G_ONLY(pAd)) - ATECtrl->Channel = 36; - else - ATECtrl->Channel = 1; - ATECtrl->TxAntennaSel = 1; - ATECtrl->RxAntennaSel = 0; - ATECtrl->QID = QID_AC_BE; - ATECtrl->Addr1[0] = 0x00; - ATECtrl->Addr1[1] = 0x11; - ATECtrl->Addr1[2] = 0x22; - ATECtrl->Addr1[3] = 0xAA; - ATECtrl->Addr1[4] = 0xBB; - ATECtrl->Addr1[5] = 0xCC; - NdisMoveMemory(ATECtrl->Addr2, ATECtrl->Addr1, MAC_ADDR_LEN); - NdisMoveMemory(ATECtrl->Addr3, ATECtrl->Addr1, MAC_ADDR_LEN); - ATECtrl->bQAEnabled = FALSE; - ATECtrl->bQATxStart = FALSE; - ATECtrl->bQARxStart = FALSE; - ATECtrl->duty_cycle = 0; - ATECtrl->tx_time_param.pkt_tx_time_en = FALSE; - ATECtrl->tx_time_param.pkt_tx_time = 0; - ATECtrl->ipg_param.ipg = 0; - ATECtrl->ipg_param.sig_ext = SIG_EXTENSION; - ATECtrl->ipg_param.slot_time = DEFAULT_SLOT_TIME; - ATECtrl->ipg_param.sifs_time = DEFAULT_SIFS_TIME; - ATECtrl->ipg_param.ac_num = QID_AC_BE; - ATECtrl->ipg_param.aifsn = MIN_AIFSN; - ATECtrl->ipg_param.cw = MIN_CW; - ATECtrl->ipg_param.txop = 0; - ATECtrl->control_band_idx = 0; /* Control band0 as default setting */ - /* Assign wdev_idx */ - ATECtrl->wdev_idx = 0; - ATECtrl->wmm_idx = 0; /* Need to modify after j mode implement done */ -#ifdef DBDC_MODE - ATECtrl->band_ext[0].Mode = ATE_STOP; - ATECtrl->band_ext[0].wdev_idx = 1; - ATECtrl->band_ext[0].wmm_idx = 1; -#endif /* DBDC_MODE */ -#ifdef TXBF_SUPPORT - ATECtrl->eTxBf = FALSE; - ATECtrl->iTxBf = FALSE; -#endif - ATECtrl->TemplateFrame = TemplateFrame; -#ifdef MT_MAC - Ret = MT_ATEInit(pAd); -#endif -#ifdef CONFIG_QA - ATECtrl->TxStatus = 0; -#endif - return Ret; -} - -INT32 ATEExit(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; - -#ifdef MT_MAC - Ret = MT_ATEExit(pAd); -#endif - return Ret; -} - -VOID ATEPeriodicExec(PVOID SystemSpecific1, PVOID FunctionContext, - PVOID SystemSpecific2, PVOID SystemSpecific3) -{ -} - -INT32 SetATE(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 mode = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Arg = %s\n", __func__, Arg)); - - mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); - - if (!strcmp(Arg, "ATESTART") && - (mode != ATE_START)) { /* support restart w/o ATESTOP */ - if (mode & fATE_TXCONT_ENABLE) { - /* TODO Get Correct TxfdMode*/ - UINT32 TxfdMode = 1; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Stop Continuous Tx\n", __func__)); - Ret += ATEOp->StopContinousTx(pAd, TxfdMode); - } - - if (mode & fATE_TXCARRSUPP_ENABLE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Stop Carrier Suppression Test\n", - __func__)); - Ret += ATEOp->StopTxTone(pAd); - } - - /* MT76x6 Test Mode Freqency offset restore*/ - if (ATECtrl->en_man_set_freq) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Manual Set Frequency Restore\n")); - MtTestModeRestoreCr(pAd, FREQ_OFFSET_MANUAL_ENABLE); - MtTestModeRestoreCr(pAd, FREQ_OFFSET_MANUAL_VALUE); - ATECtrl->en_man_set_freq = 0; - } - - if (Ret) - goto err1; - -#if (defined(MT_MAC) && (!defined(MT7636))) -#ifdef TXBF_SUPPORT - /* Before going into ATE mode, stop sounding first */ - mt_Trigger_Sounding_Packet(pAd, FALSE, 0, 0, 0, NULL); -#endif /* TXBF_SUPPORT */ -#endif /* MAC && undefined MT7636 */ - Ret = ATEOp->ATEStart(pAd); - } else if (!strcmp(Arg, "ATESTOP") && (mode & ATE_START)) - Ret = ATEOp->ATEStop(pAd); - else if (!strcmp(Arg, "TRXENABLE") && (mode & ATE_START)) - MtATESetMacTxRx(pAd, ASIC_MAC_TXRX, TRUE, control_band_idx); - else if (!strcmp(Arg, "TRXDISABLE") && (mode & ATE_START)) - MtATESetMacTxRx(pAd, ASIC_MAC_TXRX, FALSE, control_band_idx); - else if (!strcmp(Arg, "TXSTREAM") && (mode & ATE_START)) - MtATESetTxStream(pAd, 3, control_band_idx); - else if (!strcmp(Arg, "RXSTREAM") && (mode & ATE_START)) - MtATESetRxPath(pAd, 1, control_band_idx); - else if (!strcmp(Arg, "APSTOP") && (mode == ATE_STOP)) - Ret = ATEOp->ATEStart(pAd); - else if (!strcmp(Arg, "APSTART") && (mode & ATE_START)) - Ret = ATEOp->ATEStop(pAd); - else if (!strcmp(Arg, "TXFRAME") && (mode & ATE_START)) - Ret = ATEOp->StartTx(pAd); - -#if defined(TXBF_SUPPORT) && defined(MT_MAC) - else if (!strcmp(Arg, "TXFRAMESKB") && (mode & ATE_START)) - Ret = ATEOp->StartTxSKB(pAd); - -#endif /* defined(TXBF_SUPPORT) && defined(MT_MAC) */ - else if (!strcmp(Arg, "RXFRAME") && (mode & ATE_START)) - Ret = ATEOp->StartRx(pAd); - else if (!strcmp(Arg, "TXSTOP") && (mode & ATE_START)) - Ret = ATEOp->StopTx(pAd); - else if (!strcmp(Arg, "RXSTOP") && (mode & ATE_START)) - Ret = ATEOp->StopRx(pAd); - else if (!strcmp(Arg, "TXCONT") && (mode & ATE_START)) { - /* 0: All 1:TX0 2:TX1 */ - /* TODO: Correct band selection */ - UINT32 ant = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, - TxAntennaSel); - /* TODO Get Correct TxfdMode*/ - UINT32 TxfdMode = 3; /* continuous payload OFDM/CCK */ - Ret = ATEOp->StartContinousTx(pAd, ant, TxfdMode); - mode |= ATE_TXCONT; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - } else if (!strcmp(Arg, "TXCONTSTOP") && (mode & ATE_START)) { - if (mode & fATE_TXCONT_ENABLE) { - /* TODO Get Correct TxfdMode*/ - UINT32 TxfdMode = 3; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Stop Continuous Tx\n", __func__)); - ATEOp->StopContinousTx(pAd, TxfdMode); - } - - mode &= ~ATE_TXCONT; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - } else if (!strcmp(Arg, "TXCARRSUPP") && (mode & ATE_START)) { - INT32 pwr1 = 0xf; - INT32 pwr2 = 0; - UINT32 ant = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, - TxAntennaSel); - - /* 0: All 1:TX0 2:TX1 */ - switch (ant) { - case 0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: not support two 2 TXCARR\n", __func__)); - break; - - case 1: - if (ATECtrl->TxPower0 > 30) - pwr2 = (ATECtrl->TxPower0 - 30) << 1; - else { - pwr1 = (ATECtrl->TxPower0 & 0x1e) >> 1; - pwr2 = (ATECtrl->TxPower0 & 0x01) << 1; - } - - ATEOp->StartTxTone(pAd, WF0_TX_TWO_TONE_5M); - break; - - case 2: - if (ATECtrl->TxPower1 > 30) - pwr2 = (ATECtrl->TxPower1 - 30) << 1; - else { - pwr1 = (ATECtrl->TxPower1 & 0x1e) >> 1; - pwr2 = (ATECtrl->TxPower1 & 0x01) << 1; - } - - ATEOp->StartTxTone(pAd, WF1_TX_TWO_TONE_5M); - break; - } - - ATEOp->SetTxTonePower(pAd, pwr1, pwr2); - mode |= ATE_TXCARRSUPP; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - } else if (!strcmp(Arg, "FW_MODE_RFTEST") && (mode & ATE_START)) { - MtCmdRfTestSwitchMode(pAd, OPERATION_RFTEST_MODE, 0, - RF_TEST_DEFAULT_RESP_LEN); - } else if (!strcmp(Arg, "FW_MODE_NORMAL") && (mode & ATE_START)) { - MtCmdRfTestSwitchMode(pAd, OPERATION_NORMAL_MODE, 0, - RF_TEST_DEFAULT_RESP_LEN); - } else if (!strcmp(Arg, "TXCWTONESTART") && (mode & ATE_START)) { - ATEOp->TxCWTone(pAd, 1); - } else if (!strcmp(Arg, "TXCWTONESTOP") && (mode & ATE_START)) { - ATEOp->TxCWTone(pAd, 0); - } else if (!strcmp(Arg, "TXCARR") && (mode & ATE_START)) { - INT32 pwr1 = 0xf; - INT32 pwr2 = 0; - UINT32 ant = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, - TxAntennaSel); - - switch (ant) { - case 0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: not support two 2 TXCARR\n", __func__)); - break; - - case 1: - if (ATECtrl->TxPower0 > 30) - pwr2 = (ATECtrl->TxPower0 - 30) << 1; - else { - pwr1 = (ATECtrl->TxPower0 & 0x1e) >> 1; - pwr2 = (ATECtrl->TxPower0 & 0x01) << 1; - } - - ATEOp->StartTxTone(pAd, WF0_TX_ONE_TONE_DC); - break; - - case 2: - if (ATECtrl->TxPower1 > 30) - pwr2 = (ATECtrl->TxPower1 - 30) << 1; - else { - pwr1 = (ATECtrl->TxPower1 & 0x1e) >> 1; - pwr2 = (ATECtrl->TxPower1 & 0x01) << 1; - } - - ATEOp->StartTxTone(pAd, WF1_TX_ONE_TONE_DC); - break; - } - - ATEOp->SetTxTonePower(pAd, pwr1, pwr2); - mode |= ATE_TXCARR; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - } -#ifdef TXBF_SUPPORT - else if (!strcmp(Arg, "MUENABLE")) { - ATECtrl->mu_enable = TRUE; - ATECtrl->mu_usrs = 4; - TESTMODE_SET_PARAM(ATECtrl, 0, eTxBf, 1); - } else if (!strcmp(Arg, "MUDISABLE")) { - ATECtrl->mu_enable = FALSE; - ATECtrl->mu_usrs = 0; - TESTMODE_SET_PARAM(ATECtrl, 0, eTxBf, 0); - AsicSetMacTxRx(pAd, ASIC_MAC_TX, TRUE); - } else if (!strcmp(Arg, "BFENABLE")) - TESTMODE_SET_PARAM(ATECtrl, 0, eTxBf, 1); - else if (!strcmp(Arg, "BFDISABLE")) - TESTMODE_SET_PARAM(ATECtrl, 0, eTxBf, 0); - -#endif -#ifdef PRE_CAL_MT7622_SUPPORT - else if (!strcmp(Arg, "TXDPD7622") && (mode & ATE_START)) { - if (IS_MT7622(pAd)) { - Ret = ATEOp->TxDPDTest7622(pAd, "0"); - Ret = 0; - } - } -#endif /*PRE_CAL_MT7622_SUPPORT*/ -#ifdef PRE_CAL_TRX_SET1_SUPPORT - else if (!strcmp(Arg, "RX2GSELFTEST") && (mode & ATE_START)) { - Ret = ATEOp->RxSelfTest(pAd, "0"); - Ret = 0; - } else if (!strcmp(Arg, "RX5GSELFTEST") && (mode & ATE_START)) { - Ret = ATEOp->RxSelfTest(pAd, "1"); - Ret = 0; - } else if (!strcmp(Arg, "RXSELFTEST") && (mode & ATE_START)) { - Ret = ATEOp->RxSelfTest(pAd, "2"); - Ret = 0; - } else if (!strcmp(Arg, "TX2GDPD") && (mode & ATE_START)) { - Ret = ATEOp->TxDPDTest(pAd, "0"); - Ret = 0; - } else if (!strcmp(Arg, "TX5GDPD") && (mode & ATE_START)) { - Ret = ATEOp->TxDPDTest(pAd, "1"); - Ret = 0; - } else if (!strcmp(Arg, "TXDPD") && (mode & ATE_START)) { - Ret = ATEOp->TxDPDTest(pAd, "2"); - Ret = 0; - } -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ -#ifdef PRE_CAL_TRX_SET2_SUPPORT - else if ((strcmp(Arg, "PRECAL") > 0) && (mode & ATE_START)) { - UINT32 ChGrpId = 0; - - Ret = sscanf(Arg + strlen("PRECAL") + 1, "%d", &ChGrpId); - if (Ret == 1) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ChGrpId %d\n", __func__, ChGrpId)); - - Ret = ATEOp->PreCalTest(pAd, 0, ChGrpId); - Ret = 0; - } else if ((strcmp(Arg, "PRECALTX") > 0) && (mode & ATE_START)) { - UINT32 ChGrpId = 0; - - Ret = sscanf(Arg + strlen("PRECALTX") + 1, "%d", &ChGrpId); - if (Ret == 1) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ChGrpId %d\n", __func__, ChGrpId)); - Ret = ATEOp->PreCalTest(pAd, 1, ChGrpId); - Ret = 0; - } -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) - else if ((strcmp(Arg, "PATRIM") > 0) && (mode & ATE_START)) { - if (IS_MT7615(pAd)) { - INT32 i; - UINT32 Data[4] = { 0 }; - RTMP_STRING *value = NULL; - - for (i = 0, value = rstrtok(Arg + 7, "-"); value; - value = rstrtok(NULL, "-"), i++) { - Data[i] = simple_strtol(value, 0, 16); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\x1b[32m%s: WF%d = 0x%08x \x1b[m\n", - __func__, i, Data[i])); - } - Ret = ATEOp->PATrim(pAd, &Data[0]); - Ret = 0; - } - } -#endif /* CAL_BIN_FILE_SUPPORT */ - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: do nothing(param = (%s), mode = (%d))\n", - __func__, Arg, ATECtrl->Mode)); - } - - if (!Ret) - return TRUE; - -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:- RF-test stop fail, ret:%d\n", __func__, Ret)); - return FALSE; -} - -INT32 SetATEChannel(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - INT32 Ret = 0; - enum { idx_num = 4 }; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 param[idx_num]; - INT i = 0; - CHAR *value; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx:%x, Channel = %s\n", __func__, - control_band_idx, Arg)); - - for (i = 0; i < idx_num; i++) - param[i] = 0; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if (i == idx_num) - break; - - param[i++] = simple_strtol(value, 0, 10); - } - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Channel, param[0]); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Ch_Band, param[1]); -#ifdef DOT11_VHT_AC - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Channel_2nd, param[3]); -#endif - Ret = ATEOp->SetChannel(pAd, param[0], param[2], 0, param[1]); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -#ifdef MT7615 -INT32 set_ate_channel_ext(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ -#define ATE_SET_CH_EXT_PARAM_CNT 8 - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - struct _HQA_EXT_SET_CH param; - INT32 ret = 0; - UINT32 len = 0; - UINT32 pri_ch = 0; - UINT32 band_idx = 0; - UINT32 bw = 0; - UINT32 per_pkt_bw = 0; - INT i = 0; - CHAR *value; - UINT32 data[ATE_SET_CH_EXT_PARAM_CNT] = { 0 }; - - len = strlen(arg); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Arg = %s\n", __func__, arg)); - - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":")) { - if (i == ATE_SET_CH_EXT_PARAM_CNT) - break; - - data[i] = simple_strtol(value, 0, 10); - i++; - } - - if (i == ATE_SET_CH_EXT_PARAM_CNT) { - param.band_idx = data[0]; - param.central_ch0 = data[1]; - param.central_ch1 = data[2]; - param.sys_bw = data[3]; - param.perpkt_bw = data[4]; - param.pri_sel = data[5]; - param.reason = data[6]; - param.ch_band = data[7]; - } else - return ret; - - if ((param.band_idx == 0) || (param.band_idx >= TESTMODE_BAND_NUM)) { - ret = NDIS_STATUS_INVALID_DATA; - goto err0; - } - - band_idx = param.band_idx; - - switch (param.sys_bw) { - case ATE_BAND_WIDTH_20: - bw = BAND_WIDTH_20; - break; - - case ATE_BAND_WIDTH_40: - bw = BAND_WIDTH_40; - break; - - case ATE_BAND_WIDTH_80: - bw = BAND_WIDTH_80; - break; - - case ATE_BAND_WIDTH_10: - bw = BAND_WIDTH_10; - break; - - case ATE_BAND_WIDTH_5: - bw = BAND_WIDTH_5; - break; - - case ATE_BAND_WIDTH_160: - bw = BAND_WIDTH_160; - break; - - case ATE_BAND_WIDTH_8080: - bw = BAND_WIDTH_8080; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Cannot find BW with param.sys_bw:%x\n", __func__, - param.sys_bw)); - bw = param.sys_bw; - break; - } - - switch (param.perpkt_bw) { - case ATE_BAND_WIDTH_20: - per_pkt_bw = BAND_WIDTH_20; - break; - - case ATE_BAND_WIDTH_40: - per_pkt_bw = BAND_WIDTH_40; - break; - - case ATE_BAND_WIDTH_80: - per_pkt_bw = BAND_WIDTH_80; - break; - - case ATE_BAND_WIDTH_10: - per_pkt_bw = BAND_WIDTH_10; - break; - - case ATE_BAND_WIDTH_5: - per_pkt_bw = BAND_WIDTH_5; - break; - - case ATE_BAND_WIDTH_160: - case ATE_BAND_WIDTH_8080: - per_pkt_bw = BAND_WIDTH_160; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Cannot find BW with param.sys_bw:%x\n", __func__, - param.sys_bw)); - per_pkt_bw = bw; - break; - } - - /* Set Param */ - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Channel, param.central_ch0); -#ifdef DOT11_VHT_AC - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Channel_2nd, param.central_ch1); -#endif - TESTMODE_SET_PARAM(ate_ctrl, band_idx, PerPktBW, per_pkt_bw); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, BW, bw); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, PriSel, param.pri_sel); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Ch_Band, param.ch_band); - ret = ate_ops->SetChannel(pAd, param.central_ch0, param.pri_sel, - param.reason, param.ch_band); - - if (ret == 0) - ret = TRUE; - -err0: - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%x, band_idx:%x, ch0:%u, ch1:%u, sys_bw:%x, bw_conver:%x, ", - __func__, len, param.band_idx, param.central_ch0, - param.central_ch1, param.sys_bw, bw)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("perpkt_bw:%x, pri_sel:%x, pri_ch:%u\n", param.perpkt_bw, - param.pri_sel, pri_ch)); - return ret; -} - -INT32 set_ate_start_tx_ext(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ -#define ATE_START_TX_EXT_PARAM_CNT 14 - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - struct _HQA_EXT_TXV param; - ATE_TXPOWER TxPower; - INT32 ret = 0; - INT32 len = 0; - UINT32 band_idx = 0; - UINT32 Channel = 0, Ch_Band = 0, SysBw = 0, PktBw = 0, ipg = 0; - INT i = 0; - CHAR *value; - UINT32 data[ATE_START_TX_EXT_PARAM_CNT] = { 0 }; - - len = strlen(arg); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Arg = %s\n", __func__, arg)); - - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":")) { - if (i == ATE_START_TX_EXT_PARAM_CNT) - break; - - data[i] = simple_strtol(value, 0, 10); - i++; - } - - if (i == ATE_START_TX_EXT_PARAM_CNT) { - param.band_idx = data[0]; - param.pkt_cnt = data[1]; - param.phymode = data[2]; - param.rate = data[3]; - param.pwr = data[4]; - param.stbc = data[5]; - param.ldpc = data[6]; - param.ibf = data[7]; - param.ebf = data[8]; - param.wlan_id = data[9]; - param.aifs = data[10]; - param.gi = data[11]; - param.tx_path = data[12]; - param.nss = data[13]; - } else - return ret; - - band_idx = param.band_idx; - - if (!param.pkt_cnt) - param.pkt_cnt = 0x8fffffff; - - TESTMODE_SET_PARAM(ate_ctrl, band_idx, TxCount, param.pkt_cnt); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, PhyMode, param.phymode); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Mcs, param.rate); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Stbc, param.stbc); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Ldpc, param.ldpc); -#ifdef TXBF_SUPPORT - TESTMODE_SET_PARAM(ate_ctrl, band_idx, iTxBf, param.ibf); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, eTxBf, param.ebf); -#endif - ate_ctrl->wcid_ref = param.wlan_id; - TESTMODE_SET_PARAM(ate_ctrl, band_idx, ipg_param.ipg, - param.aifs); /* Fix me */ - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Sgi, param.gi); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, TxAntennaSel, param.tx_path); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Nss, param.nss); - Channel = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Channel); - Ch_Band = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Ch_Band); - PktBw = TESTMODE_GET_PARAM(ate_ctrl, band_idx, PerPktBW); - SysBw = TESTMODE_GET_PARAM(ate_ctrl, band_idx, BW); - ipg = TESTMODE_GET_PARAM(ate_ctrl, band_idx, ipg_param.ipg); - - if (param.rate == 32 && PktBw != BAND_WIDTH_40 && - SysBw != BAND_WIDTH_40) { - ret = -1; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Bandwidth must to be 40 at MCS 32\n", __func__)); - goto err0; - } - - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Power = param.pwr; - TxPower.Channel = Channel; - TxPower.Dbdc_idx = band_idx; - TxPower.Band_idx = Ch_Band; - ret = ate_ops->SetTxPower0(pAd, TxPower); - ret = ate_ops->SetIPG(pAd, ipg); - ret = ate_ops->StartTx(pAd); - - if (ret == 0) - ret = TRUE; - -err0: - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: band_idx:%u, pkt_cnt:%u, phy:%u, mcs:%u, stbc:%u, ldpc:%u\n", - __func__, param.band_idx, param.pkt_cnt, param.phymode, - param.rate, param.stbc, param.ldpc)); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ibf:%u, ebf:%u, wlan_id:%u, aifs:%u, gi:%u, tx_path:%x, nss:%x\n", - __func__, param.ibf, param.ebf, param.wlan_id, param.aifs, - param.gi, param.tx_path, param.nss)); - return ret; -} -#endif /* MT7615 */ - -INT32 SetATETxBw(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - UINT16 system_bw, per_pkt_bw; - enum { idx_num = 2 }; - UINT32 param[idx_num]; - INT i = 0; - CHAR *value; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Bw = %s\n", __func__, Arg)); - - /* Initialization */ - for (i = 0; i < idx_num; i++) - param[i] = BAND_WIDTH_NUM; - - for (i = 0, value = rstrtok(Arg, ":"); value; - value = rstrtok(NULL, ":")) { - if (i == idx_num) - break; - - param[i++] = simple_strtol(value, 0, 10); - } - - system_bw = param[0]; - per_pkt_bw = param[1]; - - Ret = ATEOp->SetBW(pAd, system_bw, per_pkt_bw); - - if (!Ret) - return TRUE; - else - return FALSE; -} - -VOID rtmp_ate_init(RTMP_ADAPTER *pAd) -{ - if (ATEInit(pAd) != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: ATE initialization failed !\n", __func__)); - ATEExit(pAd); - return; - } -} - -VOID RTMPCfgTssiGainFromEEPROM(RTMP_ADAPTER *pAd) -{ - USHORT value; - - RT28xx_EEPROM_READ16(pAd, EEPROM_TSSI_GAIN_AND_ATTENUATION, value); - value = (value & 0x00FF); - pAd->TssiGain = - 0x03; /* RT5392 uses 3 as TSSI gain/attenuation default value */ - - if ((value != 0x00) && (value != 0xFF)) - pAd->TssiGain = (UCHAR)(value & 0x000F); - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EEPROM_TSSI_GAIN_AND_ATTENUATION = 0x%X, pAd->TssiGain=0x%x\n", - __func__, value, pAd->TssiGain)); -} - -#ifdef SINGLE_SKU_V2 -INT32 SetATESingleSKUEn(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; -#endif /* CONFIG_HW_HAL_OFFLOAD */ - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - BOOLEAN fgSKUEn = FALSE; -#ifdef DBDC_MODE - struct _BAND_INFO *Info = &(ATECtrl->band_ext[0]); -#endif /* DBDC_MODE */ - fgSKUEn = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgSKUEn: %d, control_band_idx: %d\n", __func__, fgSKUEn, - control_band_idx)); - - /* Update SKU Status in ATECTRL Structure */ - if (BAND0 == control_band_idx) - ATECtrl->fgTxPowerSKUEn = fgSKUEn; -#ifdef DBDC_MODE - else if (BAND1 == control_band_idx) - Info->fgTxPowerSKUEn = fgSKUEn; -#endif /* DBDC_MODE */ - -#ifdef CONFIG_HW_HAL_OFFLOAD - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_SINGLE_SKU, fgSKUEn); -#endif /* CONFIG_HW_HAL_OFFLOAD */ - - if (!Ret) - return TRUE; - else - return FALSE; -} -#endif /* SINGLE_SKU_V2 */ - -INT32 SetATEBFBackoffMode(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ - pAd->ucBFBackOffMode = simple_strtol(Arg, 0, 10); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ucBFBackOffMode: %d\n", __func__, pAd->ucBFBackOffMode)); - return TRUE; -} - -INT32 SetATETempCompEn(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; -#endif /* CONFIG_HW_HAL_OFFLOAD */ - INT32 Ret = 0; - BOOLEAN fgTempCompEn = FALSE; - - fgTempCompEn = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgTempCompEn: %d\n", __func__, fgTempCompEn)); - -#ifdef CONFIG_HW_HAL_OFFLOAD - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_TEMP_COMP, fgTempCompEn); -#endif /* CONFIG_HW_HAL_OFFLOAD */ - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEPowerPercentEn(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; -#endif /* CONFIG_HW_HAL_OFFLOAD */ - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - BOOLEAN fgPowerPercentEn = FALSE; -#ifdef DBDC_MODE - struct _BAND_INFO *Info = &(ATECtrl->band_ext[0]); -#endif /* DBDC_MODE */ - fgPowerPercentEn = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgPowerPercentEn: %d\n", __func__, fgPowerPercentEn)); - - /* Update Percentage Status in ATECTRL Structure */ - if (BAND0 == control_band_idx) - ATECtrl->fgTxPowerPercentageEn = fgPowerPercentEn; -#ifdef DBDC_MODE - else if (BAND1 == control_band_idx) - Info->fgTxPowerPercentageEn = fgPowerPercentEn; -#endif /* DBDC_MODE */ - -#ifdef CONFIG_HW_HAL_OFFLOAD - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_POWER_PERCENTAGE, - fgPowerPercentEn); -#endif /* CONFIG_HW_HAL_OFFLOAD */ - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATEPowerPercentCtrl(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; -#endif /* CONFIG_HW_HAL_OFFLOAD */ - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 PowerPercentLevel = 100; -#ifdef DBDC_MODE - struct _BAND_INFO *Info = &(ATECtrl->band_ext[0]); -#endif /* DBDC_MODE */ - PowerPercentLevel = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: PowerPercentLevel = %d\n", __func__, PowerPercentLevel)); - - /* Sanity check */ - if ((PowerPercentLevel < 0) || (PowerPercentLevel > 100)) - goto err0; - - /* Update TxPower Drop Status in ATECTRL Structure */ - if (BAND0 == control_band_idx) - ATECtrl->PercentageLevel = PowerPercentLevel; -#ifdef DBDC_MODE - else if (BAND1 == control_band_idx) - Info->PercentageLevel = PowerPercentLevel; -#endif /* DBDC_MODE */ - -#ifdef CONFIG_HW_HAL_OFFLOAD - Ret = ATEOp->SetPowerDropLevel(pAd, PowerPercentLevel); -#endif /* CONFIG_HW_HAL_OFFLOAD */ - - if (!Ret) - return TRUE; - -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Please input X which is 0~100\n", __func__)); - return FALSE; -} - -INT32 SetATEBFBackoffEn(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; -#endif /* CONFIG_HW_HAL_OFFLOAD */ - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - BOOLEAN fgBFBackoffEn = 0; -#ifdef DBDC_MODE - struct _BAND_INFO *Info = &(ATECtrl->band_ext[0]); -#endif /* DBDC_MODE */ - fgBFBackoffEn = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgBFBackoffEn: %d\n", __func__, fgBFBackoffEn)); - - /* Update BF Backoff Status in ATECTRL Structure */ - if (BAND0 == control_band_idx) - ATECtrl->fgTxPowerBFBackoffEn = fgBFBackoffEn; -#ifdef DBDC_MODE - else if (BAND1 == control_band_idx) - Info->fgTxPowerBFBackoffEn = fgBFBackoffEn; -#endif /* DBDC_MODE */ - -#ifdef CONFIG_HW_HAL_OFFLOAD - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_BF_BACKOFF, fgBFBackoffEn); -#endif /* CONFIG_HW_HAL_OFFLOAD */ - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETSSIEn(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; -#endif /* CONFIG_HW_HAL_OFFLOAD */ - INT32 Ret = 0; - BOOLEAN fgTSSIEn = 0; - - fgTSSIEn = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgBFBackoffEn: %d\n", __func__, fgTSSIEn)); - -#ifdef CONFIG_HW_HAL_OFFLOAD - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_TSSI, fgTSSIEn); -#endif /* CONFIG_HW_HAL_OFFLOAD */ - - if (!Ret) - return TRUE; - else - return FALSE; -} - -INT32 SetATETxPowerCtrlEn(PRTMP_ADAPTER pAd, RTMP_STRING *Arg) -{ -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; -#endif /* CONFIG_HW_HAL_OFFLOAD */ - INT32 Ret = 0; - BOOLEAN fgTxPowerCtrlEn = 0; - - fgTxPowerCtrlEn = simple_strtol(Arg, 0, 10); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgTxPowerCtrlEn: %d\n", __func__, fgTxPowerCtrlEn)); - -#ifdef CONFIG_HW_HAL_OFFLOAD - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_TXPOWER_CTRL, fgTxPowerCtrlEn); -#endif /* CONFIG_HW_HAL_OFFLOAD */ - - if (!Ret) - return TRUE; - else - return FALSE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/LoopBack.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/LoopBack.h deleted file mode 100644 index 8c28cb0288..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/LoopBack.h +++ /dev/null @@ -1,96 +0,0 @@ - -#ifndef _LOOPBACK_H_ -#define _LOOPBACK_H_ - -#define LOOPBACK_SIZE (10240 * 6) - -enum _LOOPBACK_STATUS { RUNNING = 0, PASS, FAIL }; - -enum _LOOPBACK_FAIL { NO_ERROR = 0, TX_TIMEOUT, RX_TIMEOUT, BIT_TRUE_FAIL }; - -struct _LOOPBACK_SETTING { - UINT32 StartLen; - UINT32 StopLen; - UINT32 RepeatTimes; /* 0 = infinite */ - UINT32 IsDefaultPattern; - /* #ifdef RTMP_USB_SUPPORT */ - UINT32 BulkOutNumber; - UINT32 BulkInNumber; - UINT32 TxAggNumber; - UINT32 RxAggPktLmt; /* pkt numbers */ - UINT32 RxAggLmt; /* pkt size */ - UINT32 RxAggTO; /* timeout (us) */ - UINT32 RxAggEnable; - /* #endif */ -}; -/* TODO:Unify */ -#if !defined(COMPOS_TESTMODE_WIN) -#define MAX_TX_BULK_PIPE_NUM 6 -#define MAX_RX_BULK_PIPE_NUM 2 -#endif -struct _LOOPBACK_RESULT { - UINT32 Status; /* 0 running, 1 pass , 2 fail */ - UINT32 FailReason; /* 0 no error, 1 TX timeout, 2 RX timeout, 3 bit true fail */ - UINT32 TxPktCount; - UINT32 RxPktCount; - UINT32 TxByteCount; /* 0 = infinite */ - UINT32 RxByteCount; - /* #ifdef RTMP_USB_SUPPORT */ - UINT32 LastBulkOut; - /* #endif */ -}; -struct _LOOPBACK_CTRL { - BOOLEAN DebugMode; - BOOLEAN LoopBackRunning; - BOOLEAN LoopBackWaitRx; - struct _LOOPBACK_RESULT LoopBackResult; - struct _LOOPBACK_SETTING LoopBackSetting; - UINT8 LoopBackBulkoutNumber; - UCHAR LoopBackTxRaw[LOOPBACK_SIZE]; - UCHAR LoopBackRxRaw[LOOPBACK_SIZE]; - UINT32 LoopBackTxRawLen; - UINT32 LoopBackRxRawLen; - UINT32 LoopBackExpectTxLen; - UINT32 LoopBackExpectRxLen; - UCHAR LoopBackExpectTx[LOOPBACK_SIZE]; - UCHAR LoopBackExpectRx[LOOPBACK_SIZE]; - NDIS_SPIN_LOCK LoopBackLock; - BOOLEAN LoopBackDefaultPattern; - RTMP_OS_TASK LoopBackTxTask; - RTMP_OS_COMPLETION LoopBackEvent; - BOOLEAN LoopBackUDMA; -#ifdef RTMP_PCI_SUPPORT - RTMP_OS_COMPLETION LoopBackPCITxEvent; -#endif -}; - -INT32 CheckFWROMWiFiSysOn(struct _RTMP_ADAPTER *pAd); - -void LoopBack_Start(struct _RTMP_ADAPTER *pAd, - struct _LOOPBACK_SETTING *pSetting); -void LoopBack_Stop(struct _RTMP_ADAPTER *pAd); -void LoopBack_Status(struct _RTMP_ADAPTER *pAd, - struct _LOOPBACK_RESULT *pResult); -void LoopBack_RawData(struct _RTMP_ADAPTER *pAd, UINT32 *pLength, BOOLEAN IsTx, - UINT8 *pRawData); -void LoopBack_ExpectRx(struct _RTMP_ADAPTER *pAd, UINT32 Length, - UINT8 *pRawData); -void LoopBack_ExpectTx(struct _RTMP_ADAPTER *pAd, UINT32 Length, - UINT8 *pRawData); -void LoopBack_Run(struct _RTMP_ADAPTER *pAd, struct _LOOPBACK_SETTING *pSetting, - UINT32 length); -void LoopBack_BitTrueCheck(struct _RTMP_ADAPTER *pAd); -void LoopBack_Fail(struct _RTMP_ADAPTER *pAd, enum _LOOPBACK_FAIL FailNum); -#ifdef COMPOS_TESTMODE_WIN /* TODO::Unify thread parameter */ -INT LoopBack_TxThread(IN OUT PVOID Context); -#else -INT LoopBack_TxThread(ULONG Context); -#endif -void LoopBack_Rx(struct _RTMP_ADAPTER *pAd, UINT32 pktlen, UINT8 *pData); -#ifdef RTMP_PCI_SUPPORT -void PCILoopBack_Run(struct _RTMP_ADAPTER *pAd, - struct _LOOPBACK_SETTING *pSetting, UINT32 length); -INT32 ATECheckFWROMWiFiSysOn(struct _RTMP_ADAPTER *pAd); -#endif - -#endif /* _LOOPBACK_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/ate.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/ate.h deleted file mode 100644 index 0fcfefe375..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/ate.h +++ /dev/null @@ -1,725 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - ate.h -*/ - -#ifndef __ATE_H__ -#define __ATE_H__ -#include "LoopBack.h" - -#ifdef MT7615 -#define ARBITRARY_CCK_OFDM_TX 1 -#endif -#ifndef COMPOS_TESTMODE_WIN -/* #define LOGDUMP_TO_FILE 1 */ -#define ATE_TXTHREAD 1 -#endif -#define IOCTLBUFF 2048 -#define ATE_ON(_p) ((((_p)->ATECtrl.Mode) & ATE_START) == ATE_START) -INT32 ATEInit(struct _RTMP_ADAPTER *pAd); -INT32 ATEExit(struct _RTMP_ADAPTER *pAd); - -#define FREQ_OFFSET_MANUAL_ENABLE 0x81021238 -#define FREQ_OFFSET_MANUAL_VALUE 0x81021234 - -/* For CA53 GPIO CR remap usage */ -#define CA53_GPIO_REMAP_SIZE 0x10 - -#ifdef ARBITRARY_CCK_OFDM_TX -/* MCU PTA CR */ -#define ANT_SWITCH_CON2 0x810600CC -#define ANT_SWITCH_CON3 0x810600D0 -#define ANT_SWITCH_CON4 0x810600D4 -#define ANT_SWITCH_CON6 0x810600DC -#define ANT_SWITCH_CON7 0x810600E0 -#define ANT_SWITCH_CON8 0x810600E4 -#endif - -/* - * Use bitmap to allow coexist of ATE_TXFRAME - * and ATE_RXFRAME(i.e.,to support LoopBack mode). - */ -#define fATE_IDLE (1 << 0) -#define fATE_TX_ENABLE (1 << 1) -#define fATE_RX_ENABLE (1 << 2) -#define fATE_TXCONT_ENABLE (1 << 3) -#define fATE_TXCARR_ENABLE (1 << 4) -#define fATE_TXCARRSUPP_ENABLE (1 << 5) -#define fATE_MPS (1 << 6) -#define fATE_FFT_ENABLE (1 << 7) -#define fATE_EXIT (1 << 8) -#define fATE_IN_RFTEST (1 << 9) -#define fATE_IN_BF (1 << 10) -#define fATE_IN_ICAPOVERLAP (1 << 11) -/* Stop Transmission */ -#define ATE_TXSTOP \ - ((~(fATE_TX_ENABLE)) & (~(fATE_TXCONT_ENABLE)) & \ - (~(fATE_TXCARR_ENABLE)) & (~(fATE_TXCARRSUPP_ENABLE)) & \ - (~(fATE_MPS))) -/* Stop Receiving Frames */ -#define ATE_RXSTOP (~(fATE_RX_ENABLE)) - -/* Enter/Reset ATE */ -#define ATE_START (fATE_IDLE) -/* Stop/Exit ATE */ -#define ATE_STOP (fATE_EXIT) -/* Continuous Transmit Frames (without time gap) */ -#define ATE_TXCONT ((fATE_TX_ENABLE) | (fATE_TXCONT_ENABLE)) -/* Transmit Carrier */ -#define ATE_TXCARR ((fATE_TX_ENABLE) | (fATE_TXCARR_ENABLE)) -/* Transmit Carrier Suppression (information without carrier) */ -#define ATE_TXCARRSUPP ((fATE_TX_ENABLE) | (fATE_TXCARRSUPP_ENABLE)) -/* Transmit Frames */ -#define ATE_TXFRAME (fATE_TX_ENABLE) -/* Receive Frames */ -#define ATE_RXFRAME (fATE_RX_ENABLE) -/* MPS */ -#define ATE_MPS ((fATE_TX_ENABLE) | (fATE_MPS)) - -#define ATE_FFT ((fATE_FFT_ENABLE) | (fATE_IN_RFTEST)) - -#define BULK_OUT_LOCK(pLock, IrqFlags) RTMP_IRQ_LOCK((pLock), IrqFlags) - -#define BULK_OUT_UNLOCK(pLock, IrqFlags) RTMP_IRQ_UNLOCK((pLock), IrqFlags) - -/* WiFi PHY mode capability */ -#define PHYMODE_CAP_24G (WMODE_B | WMODE_G | WMODE_GN) -#define PHYMODE_CAP_5G (WMODE_A | WMODE_AN | WMODE_AC) -#define PHYMODE_CAP_DUAL_BAND (PHYMODE_CAP_24G | PHYMODE_CAP_5G) - -/* ContiTxTone */ -#define WF0_TX_ONE_TONE_5M 0x0 -#define WF0_TX_TWO_TONE_5M 0x1 -#define WF1_TX_ONE_TONE_5M 0x2 -#define WF1_TX_TWO_TONE_5M 0x3 -#define WF0_TX_ONE_TONE_10M 0x4 -#define WF1_TX_ONE_TONE_10M 0x5 -#define WF0_TX_ONE_TONE_DC 0x6 -#define WF1_TX_ONE_TONE_DC 0x7 - -#define MAX_TEST_PKT_LEN 1496 -#define MIN_TEST_PKT_LEN 25 -#define MAX_TEST_BKCR_NUM 30 - -/* For packet tx time, in unit of byte */ -#define MAX_HT_AMPDU_LEN 65000 -#define MAX_VHT_MPDU_LEN 6700 /* 11454 */ -#define DEFAULT_MPDU_LEN 4096 -#define MAX_MSDU_LEN 2304 -#define MIN_MSDU_LEN 22 -#define DEFAULT_MAC_HDR_LEN 24 -#define QOS_MAC_HDR_LEN 26 - -/* For ipg and duty cycle, in unit of us */ -#define SIG_EXTENSION 6 -#define DEFAULT_SLOT_TIME 9 -#define DEFAULT_SIFS_TIME 10 -#define MAX_SIFS_TIME \ - 127 /* ICR has 7-bit only */ /* For the ATCR/TRCR limitation 8-bit/9-bit only*/ -#define MAX_AIFSN 0xF -#define MIN_AIFSN 0x1 -#define MAX_CW 0x10 -#define MIN_CW 0x0 -#define NORMAL_CLOCK_TIME 50 /* in uint of ns */ -#define BBP_PROCESSING_TIME 1500 /* in uint of ns */ - -/* The expected enqueue packet number in one time RX event trigger */ -#define ATE_ENQUEUE_PACKET_NUM 100 - -#if defined(MT7615) || defined(MT7622) -#define ATE_TESTPKT_LEN 13311 /* Setting max packet length to 13311 on MT7615 */ -#else -#define ATE_TESTPKT_LEN 4095 /* AMPDU delimiter 12 bit, maximum 4095 */ -#endif -#define ATE_MAX_PATTERN_SIZE 128 -#define TESTMODE_BAND0 0 -#define TESTMODE_BAND1 1 -#define ATE_BF_WCID 1 -#define ATE_BFMU_NUM 4 -struct _RTMP_ADAPTER; -struct _RX_BLK; - -#ifdef DBDC_MODE -#define IS_ATE_DBDC(_pAd) _pAd->CommonCfg.dbdc_mode -#define TESTMODE_BAND_NUM 2 -#else -#define IS_ATE_DBDC(_pAd) FALSE -#define TESTMODE_BAND_NUM 1 -#endif - -/* Antenna mode */ -#define ANT_MODE_DEFAULT 0 -#define ANT_MODE_SPE_IDX 1 - -#if !defined(COMPOS_TESTMODE_WIN) -/* Allow Sleep */ -#define TESTMODE_SEM struct semaphore -#define TESTMODE_SEM_INIT(_psem, _val) sema_init(_psem, _val) -#define TESTMODE_SEM_DOWN(_psem) down(_psem) -#define TESTMODE_SEM_DOWN_INTERRUPTIBLE(_psem) down_interruptible(_psem) -#define TESTMODE_SEM_DOWN_TRYLOCK(_psem) down_trylock(_psem) -#define TESTMODE_SEM_UP(_psem) up(_psem) -#endif - -enum _TESTMODE_MODE { HQA_VERIFY, ATE_LOOPBACK, MODE_NUM }; - -enum _MPS_PARAM_TYPE { - MPS_SEQDATA, - MPS_PHYMODE, - MPS_PATH, - MPS_RATE, - MPS_PAYLOAD_LEN, - MPS_TX_COUNT, - MPS_PWR_GAIN, - MPS_PARAM_NUM, - MPS_NSS, - MPS_PKT_BW, -}; - -struct _ATE_OPERATION { - INT32 (*ATEStart)(struct _RTMP_ADAPTER *pAd); - INT32 (*ATEStop)(struct _RTMP_ADAPTER *pAd); - INT32 (*StartTx)(struct _RTMP_ADAPTER *pAd); - INT32 (*StartRx)(struct _RTMP_ADAPTER *pAd); - INT32 (*StopTx)(struct _RTMP_ADAPTER *pAd); - INT32 (*StopRx)(struct _RTMP_ADAPTER *pAd); - INT32 (*SetTxPath)(struct _RTMP_ADAPTER *pAd); - INT32 (*SetRxPath)(struct _RTMP_ADAPTER *pAd); - INT32(*SetTxPower0) - (struct _RTMP_ADAPTER *pAd, struct _ATE_TXPOWER TxPower); - INT32(*SetTxPower1) - (struct _RTMP_ADAPTER *pAd, struct _ATE_TXPOWER TxPower); - INT32(*SetTxPower2) - (struct _RTMP_ADAPTER *pAd, struct _ATE_TXPOWER TxPower); - INT32(*SetTxPower3) - (struct _RTMP_ADAPTER *pAd, struct _ATE_TXPOWER TxPower); - INT32(*SetTxForceTxPower) - (struct _RTMP_ADAPTER *pAd, INT8 cTxPower, UINT8 ucPhyMode, - UINT8 ucTxRate, UINT8 ucBW); - INT32(*SetTxPowerX) - (struct _RTMP_ADAPTER *pAd, struct _ATE_TXPOWER TxPower); - INT32 (*SetTxAntenna)(struct _RTMP_ADAPTER *pAd, UINT32 Ant); - INT32 (*SetRxAntenna)(struct _RTMP_ADAPTER *pAd, UINT32 Ant); - INT32 (*SetTxFreqOffset)(struct _RTMP_ADAPTER *pAd, UINT32 FreqOffset); - INT32 (*GetTxFreqOffset)(struct _RTMP_ADAPTER *pAd, UINT32 *FreqOffset); - INT32(*SetChannel) - (struct _RTMP_ADAPTER *pAd, INT16 Value, UINT32 pri_sel, UINT32 reason, - UINT32 Ch_Band); - INT32(*SetBW) - (struct _RTMP_ADAPTER *pAd, UINT16 system_bw, UINT16 per_pkt_bw); - INT32 (*SetDutyCycle)(struct _RTMP_ADAPTER *pAd, UINT32 value); - INT32 (*SetPktTxTime)(struct _RTMP_ADAPTER *pAd, UINT32 value); - INT32 (*SampleRssi)(struct _RTMP_ADAPTER *pAd, struct _RX_BLK *pRxBlk); - INT32 (*SetIPG)(struct _RTMP_ADAPTER *pAd, UINT32 value); - INT32(*SetSlotTime) - (struct _RTMP_ADAPTER *pAd, UINT32 SlotTime, UINT32 SifsTime); - INT32 (*SetAIFS)(struct _RTMP_ADAPTER *pAd, CHAR Value); - INT32(*SetPowerDropLevel) - (struct _RTMP_ADAPTER *pAd, UINT32 PowerDropLevel); - INT32 (*SetTSSI)(struct _RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting); - INT32 (*LowPower)(struct _RTMP_ADAPTER *pAd, UINT32 Control); - INT32 (*SetDPD)(struct _RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting); - INT32 (*StartTxTone)(struct _RTMP_ADAPTER *pAd, UINT32 Mode); - INT32(*SetTxTonePower) - (struct _RTMP_ADAPTER *pAd, INT32 pwr1, INT pwr2); - INT32(*SetDBDCTxTonePower) - (struct _RTMP_ADAPTER *pAd, INT32 pwr1, INT pwr2, UINT32 AntIdx); - INT32 (*StopTxTone)(struct _RTMP_ADAPTER *pAd); - INT32(*StartContinousTx) - (struct _RTMP_ADAPTER *pAd, CHAR WFSel, UINT32 TxfdMode); - INT32 (*StopContinousTx)(struct _RTMP_ADAPTER *pAd, UINT32 TxfdMode); - INT32(*EfuseGetFreeBlock) - (struct _RTMP_ADAPTER *pAd, UINT32 GetFreeBlock, UINT32 *Value); - INT32(*EfuseAccessCheck) - (struct _RTMP_ADAPTER *pAd, UINT32 offset, PUCHAR pData); - INT32(*RfRegWrite) - (struct _RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, UINT32 Value); - INT32(*RfRegRead) - (struct _RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, UINT32 *Value); - INT32 (*GetFWInfo)(struct _RTMP_ADAPTER *pAd, UCHAR *FWInfo); -#ifdef PRE_CAL_MT7622_SUPPORT - INT32 (*TxDPDTest7622)(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*PRE_CAL_MT7622_SUPPORT*/ -#ifdef PRE_CAL_TRX_SET1_SUPPORT - INT32 (*RxSelfTest)(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - INT32 (*TxDPDTest)(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ -#ifdef PRE_CAL_TRX_SET2_SUPPORT - INT32(*PreCalTest) - (struct _RTMP_ADAPTER *pAd, UINT8 CalId, UINT32 ChGrpId); -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) - INT32 (*PATrim)(struct _RTMP_ADAPTER *pAd, PUINT32 pData); -#endif /* CAL_BIN_FILE_SUPPORT */ -#if defined(TXBF_SUPPORT) && defined(MT_MAC) - INT32(*SetATETxSoundingProc) - (struct _RTMP_ADAPTER *pAd, UCHAR SoundingMode); - INT32 (*StartTxSKB)(struct _RTMP_ADAPTER *pAd); -#endif /* TXBF_SUPPORT && MT_MAC */ - INT32(*MPSSetParm) - (struct _RTMP_ADAPTER *pAd, enum _MPS_PARAM_TYPE data_type, INT32 items, - UINT32 *data); - INT32 (*MPSTxStart)(struct _RTMP_ADAPTER *pAd); - INT32 (*MPSTxStop)(struct _RTMP_ADAPTER *pAd); - INT32 (*SetAutoResp)(struct _RTMP_ADAPTER *pAd, UCHAR *mac, UCHAR mode); - INT32 (*SetFFTMode)(struct _RTMP_ADAPTER *pAd, UINT32 mode); - INT32(*onOffRDD) - (struct _RTMP_ADAPTER *pAd, UINT32 rdd_num, UINT32 rdd_in_sel, - UINT32 is_start); - INT32(*SetCfgOnOff) - (struct _RTMP_ADAPTER *pAd, UINT32 Type, UINT32 Enable); - INT32(*GetCfgOnOff) - (struct _RTMP_ADAPTER *pAd, UINT32 Type, UINT32 *Result); - INT32(*SetRXFilterPktLen) - (struct _RTMP_ADAPTER *pAd, UINT32 Enable, UINT32 RxPktLen); -#ifdef TXPWRMANUAL - INT32(*SetTxPwrManual) - (struct _RTMP_ADAPTER *pAd, BOOLEAN fgPwrManCtrl, - UINT8 u1TxPwrModeManual, UINT8 u1TxPwrBwManual, - UINT8 u1TxPwrRateManual, INT8 i1TxPwrValueManual, UCHAR Band); -#endif - INT32(*DBDCTxTone) - (struct _RTMP_ADAPTER *pAd, UINT32 Control, UINT32 AntIndex, - UINT32 ToneType, UINT32 ToneFreq, INT32 DcOffset_I, INT32 DcOffset_Q, - UINT32 Band); - INT32 (*TxCWTone)(struct _RTMP_ADAPTER *pAd, UINT32 Control); - INT32(*GetTxPower) - (struct _RTMP_ADAPTER *pAd, UINT32 Enable, UINT32 Ch_Band, - UINT32 *EfuseAddr, UINT32 *Power); - INT32(*BssInfoUpdate) - (struct _RTMP_ADAPTER *pAd, UINT32 OwnMacIdx, UINT32 BssIdx, - UCHAR *Bssid); - INT32(*DevInfoUpdate) - (struct _RTMP_ADAPTER *pAd, UINT32 OwnMacIdx, UCHAR *Bssid); - INT32(*LogOnOff) - (struct _RTMP_ADAPTER *pAd, UINT32 type, UINT32 on_off, UINT32 num_log); - INT32(*SetICapStart) - (struct _RTMP_ADAPTER *pAd, BOOLEAN Trigger, BOOLEAN RingCapEn, - UINT32 Event, UINT32 Node, UINT32 Len, UINT32 StopCycle, UINT32 BW, - UINT32 MACTriggerEvent, UINT32 SourceAddrLSB, UINT32 SourceAddrMSB, - UINT32 Band); - INT32 (*GetICapStatus)(struct _RTMP_ADAPTER *pAd); - INT32(*GetICapIQData) - (struct _RTMP_ADAPTER *pAd, PINT32 pData, PINT32 pDataLen, - UINT32 IQ_Type, UINT32 WF_Num); - INT32(*SetAntennaPort) - (struct _RTMP_ADAPTER *pAd, UINT32 RfModeMask, UINT32 RfPortMask, - UINT32 AntPortMask); - INT32 (*ClockSwitchDisable)(struct _RTMP_ADAPTER *pAd, UINT8 isDisable); -}; - -struct _ATE_IF_OPERATION { - INT32 (*init)(struct _RTMP_ADAPTER *pAd); - INT32 (*clean_trx_q)(struct _RTMP_ADAPTER *pAd); - INT32 (*setup_frame)(struct _RTMP_ADAPTER *pAd, UINT32 q_idx); - INT32 (*test_frame_tx)(struct _RTMP_ADAPTER *pAd); - INT32 (*test_frame_rx)(struct _RTMP_ADAPTER *pAd); - INT32 (*ate_leave)(struct _RTMP_ADAPTER *pAd); -}; - -struct _HQA_MPS_SETTING { - UINT32 phy; - UINT32 pkt_len; - UINT32 pkt_cnt; - UINT32 pwr; - UINT32 nss; - UINT32 pkt_bw; -}; - -enum _TEST_BK_CR_TYPE { - TEST_EMPTY_BKCR = 0, - TEST_MAC_BKCR, - TEST_HIF_BKCR, - TEST_PHY_BKCR, - TEST_HW_BKCR, - TEST_MCU_BKCR, - TEST_BKCR_TYPE_NUM, -}; - -struct _TESTMODE_BK_CR { - ULONG offset; - UINT32 val; - enum _TEST_BK_CR_TYPE type; -}; - -struct _ATE_RXV_LOG { - RX_VECTOR1_1ST_CYCLE rxv1_1st; - RX_VECTOR1_2ND_CYCLE rxv1_2nd; - RX_VECTOR1_3TH_CYCLE rxv1_3rd; - RX_VECTOR1_4TH_CYCLE rxv1_4th; - RX_VECTOR1_5TH_CYCLE rxv1_5th; - RX_VECTOR1_6TH_CYCLE rxv1_6th; - RX_VECTOR2_1ST_CYCLE rxv2_1st; - RX_VECTOR2_2ND_CYCLE rxv2_2nd; - RX_VECTOR2_3TH_CYCLE rxv2_3rd; -}; - -#define ATE_RDD_LOG_SIZE 8 /* Pulse size * num of pulse = 8 * 32 for one event*/ -struct _ATE_RDD_LOG { - UINT32 u4Prefix; - UINT32 u4Count; - UINT8 byPass; - UINT8 aucBuffer[ATE_RDD_LOG_SIZE]; -}; - -#define ATE_RECAL_LOG_SIZE (CAL_ALL_LEN >> 3) -struct _ATE_LOG_RECAL { - UINT32 cal_idx; - UINT32 cal_type; - UINT32 cr_addr; - UINT32 cr_val; -}; - -enum { - ATE_LOG_RXV = 1, - ATE_LOG_RDD, - ATE_LOG_RE_CAL, - ATE_LOG_TYPE_NUM, - ATE_LOG_RXINFO, - ATE_LOG_TXDUMP, - ATE_LOG_TEST, -}; - -enum { - ATE_LOG_OFF, - ATE_LOG_ON, - ATE_LOG_DUMP, - ATE_LOG_CTRL_NUM, -}; - -#define fATE_LOG_RXV (1 << ATE_LOG_RXV) -#define fATE_LOG_RDD (1 << ATE_LOG_RDD) -#define fATE_LOG_RE_CAL (1 << ATE_LOG_RE_CAL) -#define fATE_LOG_RXINFO (1 << ATE_LOG_RXINFO) -#define fATE_LOG_TXDUMP (1 << ATE_LOG_TXDUMP) -#define fATE_LOG_TEST (1 << ATE_LOG_TEST) - -struct _ATE_LOG_DUMP_ENTRY { - UINT32 log_type; - UINT8 un_dumped; - union { - struct _ATE_RXV_LOG rxv; - struct _ATE_RDD_LOG rdd; - struct _ATE_LOG_RECAL re_cal; - } log; -}; - -struct _ATE_LOG_DUMP_CB { - NDIS_SPIN_LOCK lock; - UINT8 overwritable; - UINT8 is_dumping; - UINT8 is_overwritten; - INT32 idx; - INT32 len; - UINT32 recal_curr_type; -#ifdef LOGDUMP_TO_FILE - INT32 file_idx; - RTMP_OS_FD_EXT fd; -#endif - struct _ATE_LOG_DUMP_ENTRY *entry; -}; - -#define ATE_MPS_ITEM_RUNNING (1 << 0) -struct _HQA_MPS_CB { - NDIS_SPIN_LOCK lock; - UINT32 mps_cnt; - UINT32 band_idx; - UINT32 stat; - BOOLEAN setting_inuse; - UINT32 ref_idx; - struct _HQA_MPS_SETTING *mps_setting; -}; - -struct _ATE_PFMU_INFO { - UCHAR wcid; - UCHAR bss_idx; - UCHAR up; - UCHAR addr[MAC_ADDR_LEN]; -}; - -#define ATE_RXV_SIZE 9 -#define ATE_ANT_NUM 4 - -struct _ATE_RX_STATISTIC { - INT32 FreqOffsetFromRx; - UINT32 RxTotalCnt[TESTMODE_BAND_NUM]; - UINT32 NumOfAvgRssiSample; - UINT32 RxMacFCSErrCount; - UINT32 RxMacMdrdyCount; - UINT32 RxMacFCSErrCount_band1; - UINT32 RxMacMdrdyCount_band1; - CHAR LastSNR[ATE_ANT_NUM]; /* last received SNR */ - CHAR LastRssi[ATE_ANT_NUM]; /* last received RSSI */ - CHAR AvgRssi[ATE_ANT_NUM]; /* last 8 frames' average RSSI */ - CHAR MaxRssi[ATE_ANT_NUM]; - CHAR MinRssi[ATE_ANT_NUM]; - SHORT AvgRssiX8[ATE_ANT_NUM]; /* sum of last 8 frames' RSSI */ - UINT32 RSSI[ATE_ANT_NUM]; - UINT32 SNR[ATE_ANT_NUM]; - UINT32 RCPI[ATE_ANT_NUM]; - UINT32 FAGC_RSSI_IB[ATE_ANT_NUM]; - UINT32 FAGC_RSSI_WB[ATE_ANT_NUM]; -#ifdef CFG_SUPPORT_MU_MIMO - UINT32 RxMacMuPktCount; -#endif - UINT32 SIG_MCS; - UINT32 SINR; - UINT32 RXVRSSI; -}; - -struct _ATE_TX_TIME_PARAM { - BOOLEAN pkt_tx_time_en; /* The packet transmission time feature enable or disable */ - UINT32 pkt_tx_time; /* The target packet transmission time */ - UINT32 pkt_tx_len; - UINT32 pkt_msdu_len; - UINT32 pkt_hdr_len; - UINT32 pkt_ampdu_cnt; - UINT8 pkt_need_qos; - UINT8 pkt_need_amsdu; - UINT8 pkt_need_ampdu; -}; - -struct _ATE_IPG_PARAM { - UINT32 ipg; /* The target idle time */ - UINT8 sig_ext; /* Only OFDM/HT/VHT need to consider sig_ext */ - UINT16 slot_time; - UINT16 sifs_time; - UINT8 ac_num; /* 0: AC_BK, 1: AC_BE, 2: AC_VI, 3: AC_VO */ - UINT8 aifsn; - UINT16 cw; - UINT16 txop; -}; - -#ifdef DBDC_MODE -struct _BAND_INFO { - UCHAR *pate_pkt; /* Buffer for TestPkt */ - PNDIS_PACKET pkt_skb; - UINT32 is_alloc_skb; - RTMP_OS_COMPLETION tx_wait; - UCHAR TxStatus; /* TxStatus : 0 --> task is idle, 1 --> task is running */ - UINT32 Mode; - UINT32 TxAntennaSel; - UINT32 RxAntennaSel; - UCHAR backup_channel; - UCHAR backup_phymode; - UCHAR wdev_idx; - UCHAR wmm_idx; - USHORT QID; - UCHAR Channel; - UCHAR Ch_Band; - UCHAR ControlChl; - UCHAR PriSel; - UINT32 OutBandFreq; - UCHAR Nss; - UCHAR BW; - UCHAR PerPktBW; - UCHAR PrimaryBWSel; - UCHAR PhyMode; - UCHAR Stbc; - UCHAR Ldpc; /* 0:BCC 1:LDPC */ - UCHAR Sgi; - UCHAR Mcs; - UCHAR Preamble; - UINT32 FixedPayload; /* Normal:0,Repeat:1,Random:2 */ - UINT32 TxLength; - UINT32 TxCount; - UINT32 TxDoneCount; /* Tx DMA Done */ - UINT32 TxedCount; - UINT32 RFFreqOffset; - UINT32 thermal_val; - UINT32 duty_cycle; - struct _ATE_TX_TIME_PARAM tx_time_param; - struct _ATE_IPG_PARAM ipg_param; -#ifdef TXBF_SUPPORT - UCHAR eTxBf; - UCHAR iTxBf; -#endif -#ifdef DOT11_VHT_AC - UCHAR Channel_2nd; -#endif - UCHAR FAGC_Path; - /* Tx frame */ - UCHAR TemplateFrame[32]; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - UCHAR Addr3[MAC_ADDR_LEN]; - UCHAR payload[ATE_MAX_PATTERN_SIZE]; - UINT32 pl_len; - USHORT HLen; /* Header Length */ - USHORT seq; - struct _HQA_MPS_CB mps_cb; - BOOLEAN fgTxPowerSKUEn; /* SKU On/Off status */ - BOOLEAN fgTxPowerPercentageEn; /* Power Percentage On/Off status */ - BOOLEAN fgTxPowerBFBackoffEn; /* BF Backoff On/Off status */ - UINT32 PercentageLevel; /* TxPower Percentage Level */ - INT32 RF_Power; - INT32 Digital_Power; - INT32 DcOffset_I; - INT32 DcOffset_Q; -}; -#endif - -#ifdef ATE_TXTHREAD -#define ATE_THREAD_NUM 1 -struct _ATE_TXTHREAD_CB { - BOOLEAN is_init; - RTMP_OS_TASK task; - NDIS_SPIN_LOCK lock; - UINT32 tx_cnt; - UINT32 txed_cnt; - UCHAR service_stat; -}; -#endif - -struct _ATE_CTRL { - struct _ATE_OPERATION *ATEOp; - struct _ATE_IF_OPERATION *ATEIfOps; - enum _TESTMODE_MODE verify_mode; - struct _HQA_MPS_CB mps_cb; - UINT32 en_log; -#ifdef ATE_TXTHREAD - struct _ATE_TXTHREAD_CB tx_thread[1]; - UINT32 current_init_thread; - INT32 deq_cnt; -#endif -#ifdef DBDC_MODE - struct _BAND_INFO band_ext[1]; -#endif - UCHAR *pate_pkt; /* Buffer for TestPkt */ - PNDIS_PACKET pkt_skb; - UINT32 is_alloc_skb; - UINT32 Mode; - CHAR TxPower0; - CHAR TxPower1; - CHAR TxPower2; - CHAR TxPower3; - UINT32 TxAntennaSel; /* band0 => TX0/TX1 , band1 => TX2/TX3 */ - UINT32 RxAntennaSel; - UCHAR backup_channel; /* Backup normal driver's channel for recovering */ - UCHAR backup_phymode; /* Backup normal driver's phymode for recovering */ - UCHAR wdev_idx; - UCHAR wmm_idx; - USHORT QID; - UCHAR Channel; - UCHAR Ch_Band; - UCHAR ControlChl; - UCHAR PriSel; - UINT32 OutBandFreq; - UCHAR Nss; - UCHAR BW; - UCHAR PerPktBW; - UCHAR PrimaryBWSel; - UCHAR PhyMode; - UCHAR Stbc; - UCHAR Ldpc; /* 0:BCC 1:LDPC */ - UCHAR Sgi; - UCHAR Mcs; - UCHAR Preamble; - UCHAR Payload; /* Payload pattern */ - UINT32 FixedPayload; - UINT32 TxLength; - UINT32 TxCount; - UINT32 TxDoneCount; /* Tx DMA Done */ - UINT32 TxedCount; - UINT32 RFFreqOffset; - UINT32 thermal_val; - UINT32 duty_cycle; - struct _ATE_TX_TIME_PARAM tx_time_param; - struct _ATE_IPG_PARAM ipg_param; -#ifdef TXBF_SUPPORT - BOOLEAN fgEBfEverEnabled; - BOOLEAN fgBw160; - UCHAR eTxBf; - UCHAR iTxBf; - UCHAR *txbf_info; - UINT32 txbf_info_len; - UCHAR iBFCalStatus; -#endif -#ifdef INTERNAL_CAPTURE_SUPPORT - EXT_EVENT_RBIST_ADDR_T icap_info; -#endif /* INTERNAL_CAPTURE_SUPPORT */ -#ifdef DOT11_VHT_AC - UCHAR Channel_2nd; -#endif - /* Common part */ - UCHAR control_band_idx; /* The band_idx which user wants to control currently */ - /* Tx frame */ - UCHAR *TemplateFrame; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - UCHAR Addr3[MAC_ADDR_LEN]; - UCHAR payload[ATE_MAX_PATTERN_SIZE]; - UINT32 pl_len; - USHORT HLen; /* Header Length */ - USHORT seq; - /* MU Related */ - BOOLEAN mu_enable; - UINT32 mu_usrs; - UINT8 wcid_ref; - struct _ATE_PFMU_INFO pfmu_info[ATE_BFMU_NUM]; - /* counters */ - UINT32 num_rxv; - UINT32 num_rxdata; - UINT32 num_rxv_fcs; - UINT32 num_rxdata_fcs; - struct _ATE_RX_STATISTIC rx_stat; - struct _ATE_LOG_DUMP_CB log_dump[ATE_LOG_TYPE_NUM]; - UCHAR FAGC_Path; - /* Flag */ - BOOLEAN txs_enable; - BOOLEAN bQAEnabled; /* QA is used. */ - BOOLEAN bQATxStart; /* Have compiled QA in and use it to ATE tx. */ - BOOLEAN bQARxStart; /* Have compiled QA in and use it to ATE rx. */ - BOOLEAN need_set_pwr; /* For MPS switch power in right context */ - UCHAR TxStatus; /* TxStatus : 0 --> task is idle, 1 --> task is running */ - UCHAR did_tx; - UCHAR did_rx; - UCHAR en_man_set_freq; - /* Restore CR */ - struct _TESTMODE_BK_CR bk_cr[MAX_TEST_BKCR_NUM]; - /* OS related */ - RTMP_OS_COMPLETION tx_wait; - RTMP_OS_COMPLETION cmd_done; - ULONG cmd_expire; -#if !defined(COMPOS_TESTMODE_WIN) - RALINK_TIMER_STRUCT PeriodicTimer; - ULONG OneSecPeriodicRound; - ULONG PeriodicRound; - OS_NDIS_SPIN_LOCK TssiSemLock; -#endif - BOOLEAN fgTxPowerSKUEn; /* SKU On/Off status */ - BOOLEAN fgTxPowerPercentageEn; /* Power Percentage On/Off status */ - BOOLEAN fgTxPowerBFBackoffEn; /* BF Backoff On/Off status */ - UINT32 PercentageLevel; /* TxPower Percentage Level */ - INT32 RF_Power; - INT32 Digital_Power; - INT32 DcOffset_I; - INT32 DcOffset_Q; -}; - -#if !defined(COMPOS_TESTMODE_WIN) -VOID RtmpDmaEnable(RTMP_ADAPTER *pAd, INT Enable); - -VOID ATE_RTUSBBulkOutDataPacket(IN PRTMP_ADAPTER pAd, IN UCHAR BulkOutPipeId); - -VOID ATE_RTUSBCancelPendingBulkInIRP(IN PRTMP_ADAPTER pAd); -#endif -INT MtATESetMacTxRx(struct _RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN Enable, - UCHAR BandIdx); -#if defined(TXBF_SUPPORT) && defined(MT_MAC) -INT SetATEApplyStaToMacTblEntry(RTMP_ADAPTER *pAd); -INT SetATEApplyStaToAsic(RTMP_ADAPTER *pAd); -#endif - -#endif /* __ATE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/ate_agent.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/ate_agent.h deleted file mode 100644 index 82cdec436d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/ate_agent.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - ate_agent.h -*/ - -#ifndef __ATE_AGENT_H__ -#define __ATE_AGENT_H__ - -struct _RTMP_ADAPTER; - -INT32 SetTxStop(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetRxStop(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -#ifdef DBG -VOID ATE_QA_Statistics(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI, - RXINFO_STRUC *pRxInfo, PHEADER_802_11 pHeader); -#ifdef CONFIG_QA -INT32 RtmpDoAte(struct _RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - RTMP_STRING *wrq_name); -#endif -#ifdef WCX_SUPPORT -INT32 do_meta_cmd(int ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, RTMP_STRING *wrq_name); -#endif -INT32 SetEERead(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetEEWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetBBPRead(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetBBPWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetRFWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -#endif /* DBG */ -VOID rt_ee_read_all(struct _RTMP_ADAPTER *pAd, UINT16 *Data); -VOID rt_ee_write_all(struct _RTMP_ADAPTER pAd, UINT16 *Data); -VOID rt_ee_write_bulk(struct _RTMP_ADAPTER pAd, UINT16 *Data, UINT16 offset, - UINT16 length); -INT32 SetATEQid(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEDeqCnt(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEMPSDump(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSPhyMode(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSRate(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSPath(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSPayloadLen(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSPktCnt(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSPwr(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSNss(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSPktBw(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATEMPSStart(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 SetATELOGEnable(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATELOGDump(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxSEnable(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATERxFilter(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATERxStream(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxStream(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEMACTRx(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATELOGDisable(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEDa(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATESa(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEBssid(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEInitChan(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetADCDump(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxPower0(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxPower1(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxPower2(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxPower3(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEForceTxPower(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxPowerEvaluation(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxAntenna(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATERxAntenna(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATERFPower(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEDigitalPower(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEDCOffset_I(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEDCOffset_Q(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 Default_Set_ATE_TX_FREQ_OFFSET_Proc(struct _RTMP_ADAPTER *pAd, - RTMP_STRING *Arg); -INT32 SetATETxFreqOffset(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 Default_Set_ATE_TX_BW_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxLength(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxCount(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxMcs(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEVhtNss(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxLdpc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxStbc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxMode(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxGi(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATERxFer(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEReadRF(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATELoadE2p(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -#ifdef RTMP_EFUSE_SUPPORT -INT32 SetATELoadE2pFromBuf(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -#endif /* RTMP_EFUSE_SUPPORT */ -INT32 SetATEReadE2p(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEAutoAlc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxGi(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETempSensor(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEIpg(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEPayload(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEFixedPayload(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEAssocProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#if defined(TXBF_SUPPORT) && defined(MT_MAC) -INT32 SetATETxBfDutInitProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxBfGdInitProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxPacketWithBf(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxBfChanProfileUpdate(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxBfProfileRead(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETXBFProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxSoundingProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEIBfGdCal(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEIBfInstCal(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEIBfProfileUpdate(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEEBfProfileConfig(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEIBfPhaseComp(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEIBfPhaseVerify(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxBfLnaGain(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxBfPhaseE2pUpdate(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEConTxETxBfGdProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEConTxETxBfInitProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATESpeIdx(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEEBfTx(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEEBFCE(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEEBFCEInfo(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEEBFCEHelp(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 MT_ATEGenPkt(struct _RTMP_ADAPTER *pAd, UCHAR *buf, UINT32 band_idx); -#endif /* TXBF_SUPPORT && MT_MAC */ -INT32 SetATETtr(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEShow(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEHelp(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 ATESampleRssi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI); -VOID ATEPeriodicExec(PVOID SystemSpecific1, PVOID FunctionContext, - PVOID SystemSpecific2, PVOID SystemSpecific3); -INT32 SetATE(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEChannel(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 set_ate_duty_cycle(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 set_ate_pkt_tx_time(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 set_ate_control_band_idx(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -#ifdef MT7615 -INT32 set_ate_channel_ext(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 set_ate_start_tx_ext(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* MT7615 */ -INT32 SetATETxBw(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 MT_ATEInit(struct _RTMP_ADAPTER *pAd); -INT32 MT_ATEExit(struct _RTMP_ADAPTER *pAd); -PNDIS_PACKET ATEPayloadInit(struct _RTMP_ADAPTER *pAd, UINT32 TxIdx); -INT32 ATEPayloadAlloc(struct _RTMP_ADAPTER *pAd, UINT32 Index); -VOID EEReadAll(struct _RTMP_ADAPTER *pAd, UINT16 *Data, UINT16 size); -VOID rtmp_ate_init(struct _RTMP_ADAPTER *pAd); -VOID RTMPCfgTssiGainFromEEPROM(struct _RTMP_ADAPTER *pAd); -#ifdef SINGLE_SKU_V2 -INT32 SetATESingleSKUEn(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -#endif /* SINGLE_SKU_V2 */ -INT32 SetATEBFBackoffMode(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETempCompEn(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEPowerPercentEn(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEPowerPercentCtrl(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATEBFBackoffEn(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETSSIEn(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 SetATETxPowerCtrlEn(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/meta_agent.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/meta_agent.h deleted file mode 100644 index 0693cf02a4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/meta_agent.h +++ /dev/null @@ -1,94 +0,0 @@ - -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - qa_agent.h -*/ - -#ifndef __META_AGENT_H__ -#define __META_AGENT_H__ - -extern CH_FREQ_MAP CH_HZ_ID_MAP[]; -extern int CH_HZ_ID_MAP_NUM; -/* - * struct for command formats - */ -struct GNU_PACKED _META_CMD_HDR { - UINT32 oid; - UINT32 len_in; /* For set */ - UINT32 len_out; /* For query */ - UCHAR data[2048]; -}; - -struct GNU_PACKED _PARAM_MTK_WIFI_TEST { - UINT32 idx; - UINT32 data; -}; - -struct GNU_PACKED _PARAM_CUSTOM_EFUSE_RW { - UINT32 offset; - UINT32 data; -}; - -struct GNU_PACKED _PARAM_CUSTOM_EEPROM_RW { - UINT8 method; - UINT8 idx; - UINT8 reserved; - UINT16 data; -}; - -struct GNU_PACKED _PARAM_CUSTOM_MCR_RW { - UINT32 offset; - UINT32 data; -}; - -typedef INT32 (*META_CMD_HANDLER)(int ioctl_cmd, struct _RTMP_ADAPTER *pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - META_CMD_HDR *cmd_hdr); - -INT Set_Sdio_Bist_Write(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Sdio_Bist_Read(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* - * define for command oid - */ -#define MT_META_WIFI_TEST_TABLE_VER 0x01180000 - -#define OID_CUSTOM_IF_VER 0xFFA0C000 -#define OID_CUSTOM_MCR_RW 0xFFA0C801 -#define OID_CUSTOM_EEPROM_RW 0xFFA0C803 -#define OID_CUSTOM_EFUSE_RW 0xFFA0C805 -#define OID_CUSTOM_TEST_MODE 0xFFA0C901 -#define OID_CUSTOM_ABORT_TEST_MODE 0xFFA0C906 -#define OID_CUSTOM_MTK_WIFI_TEST 0xFFA0C911 -/* NVRAM */ -#define OID_CUSTOM_MTK_NVRAM_RW 0xFFA0C941 -#define OID_CUSTOM_CFG_SRC_TYPE 0xFFA0C942 -#define OID_CUSTOM_EEPROM_TYPE 0xFFA0C943 - -#define MT_META_WIFI_TEST_CMD_MASK 0x0000001F /* 32 cmd for 1 set, 0x1F=31*/ -#define MT_META_WIFI_TEST_SET_MASK 0x0EFFFFFF /* 32 bits width, rest 27 bits*/ - -#define SLOT_TIME_SHORT 9 -#define PARAM_EEPROM_READ_METHOD_READ 1 -#define PARAM_EEPROM_READ_METHOD_GETSIZE 0 - -/* - * MACRO - */ -#define FUNC_IDX_GET_IDX(__idx, __func_idx) (__func_idx = __idx & 0x000000FF) -#define FUNC_IDX_GET_SUBFIELD(__idx, __sub) \ - (__sub = ((__idx & 0xff000000) >> 24) & 0x000000ff) -/* TODO: Need to put into include/rt_os.h when merge the file */ -#define MTPRIV_IOCTL_META_SET (SIOCIWFIRSTPRIV + 0x08) -#define MTPRIV_IOCTL_META_QUERY (SIOCIWFIRSTPRIV + 0x09) -#endif /* __META_AGENT_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode.h deleted file mode 100644 index dd9500b85c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode.h +++ /dev/null @@ -1,234 +0,0 @@ - -#ifndef _MT_TESTMODE_H -#define _MT_TESTMODE_H - -#include "mt_testmode_dmac.h" - -#define TESTMODE_WCID_BAND0 2 -#define TESTMODE_WCID_BAND1 3 - -#define ATE_SINGLE_BAND 1 -#define ATE_DUAL_BAND 2 -#define ATE_GBAND_TYPE 1 -#define ATE_ABAND_TYPE 2 - -#define ATE_BAND_WIDTH_20 0 -#define ATE_BAND_WIDTH_40 1 -#define ATE_BAND_WIDTH_80 2 -#define ATE_BAND_WIDTH_10 3 -#define ATE_BAND_WIDTH_5 4 -#define ATE_BAND_WIDTH_160 5 -#define ATE_BAND_WIDTH_8080 6 - -enum { - ATE_USER_PAYLOAD, - ATE_FIXED_PAYLOAD, - ATE_RANDOM_PAYLOAD, -}; - -struct _ATE_DATA_RATE_MAP { - UCHAR mcs; /* MCS index */ - UINT32 tx_data_rate; /* Data rate in K Bit */ -}; - -struct _ATE_ANT_MAP { - UINT32 ant_sel; - UINT32 spe_idx; -}; - -struct _ATE_TXPWR_GROUP_MAP { - UINT32 start; - UINT32 end; - UINT32 group[4]; -}; - -struct _ATE_CH_KHZ_MAP { - UINT32 Channel; - UINT32 Freq; -}; - -#if defined(COMPOS_TESTMODE_WIN) /* for MT_testmode.c */ - -#define INC_RING_INDEX(_idx, _RingSize) \ - do { \ - (_idx)++; \ - if ((_idx) >= (_RingSize)) \ - _idx = 0; \ - } while (0) - -#define BAND_WIDTH_20 0 -#define BAND_WIDTH_40 1 -#define BAND_WIDTH_80 2 -#define BAND_WIDTH_160 3 -#define BAND_WIDTH_10 \ - 4 /* 802.11j has 10MHz. This definition is for internal usage. doesn't fill in the IE or other field. */ -#define BAND_WIDTH_BOTH 5 /* BW20 + BW40 */ -#define BAND_WIDTH_5 6 -#define BAND_WIDTH_8080 7 - -#define TX1_G_BAND_TARGET_PWR 0x5E -#define TX0_G_BAND_TARGET_PWR 0x58 -enum { - PDMA_TX, - PDMA_RX, - PDMA_TX_RX, -}; -#define TESTMODE_GET_PADDR(_pstruct, _band, _member) (&_pstruct->_member) -#define TESTMODE_GET_PARAM(_pstruct, _band, _member) (_pstruct->_member) -#define TESTMODE_SET_PARAM(_pstruct, _band, _member, _val) \ - (_pstruct->_member = _val) -#ifndef COMPOS_TESTMODE_WIN /* NDIS only */ -#define MAC_ADDR_LEN 6 -/* 2-byte Frame control field */ -struct _QAFRAME_CONTROL { - UINT16 Ver : 2; - UINT16 Type : 2; - UINT16 SubType : 4; - UINT16 ToDs : 1; - UINT16 FrDs : 1; - UINT16 MoreFrag : 1; - UINT16 Retry : 1; - UINT16 PwrMgmt : 1; - UINT16 MoreData : 1; - UINT16 Wep : 1; - UINT16 Order : 1; -}; - -struct _QAHEADER_802_11 { - struct _QAFRAME_CONTROL FC; - UINT16 Duration; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - UCHAR Addr3[MAC_ADDR_LEN]; - UINT16 Frag : 4; - UINT16 Sequence : 12; -}; -#endif /* NOT COMPOS_TESTMODE_WIN */ -#else -#ifdef DBDC_MODE -#define TESTMODE_GET_PARAM(_pstruct, _band, _member) \ - ((_band) ? _pstruct->band_ext[_band - 1]._member : _pstruct->_member) -#define TESTMODE_GET_PADDR(_pstruct, _band, _member) \ - ((_band) ? &_pstruct->band_ext[_band - 1]._member : &_pstruct->_member) -#define TESTMODE_SET_PARAM(_pstruct, _band, _member, _val) \ - ({ \ - UINT32 _ret = _val; \ - if (_band) { \ - struct _BAND_INFO *_info = \ - &(_pstruct->band_ext[_band - 1]); \ - _info->_member = _val; \ - } else \ - _pstruct->_member = _val; \ - _ret; \ - }) -#else -#define TESTMODE_GET_PADDR(_pstruct, _band, _member) (&_pstruct->_member) -#define TESTMODE_GET_PARAM(_pstruct, _band, _member) (_pstruct->_member) -#define TESTMODE_SET_PARAM(_pstruct, _band, _member, _val) \ - ({ \ - UINT32 _ret = _val; \ - _pstruct->_member = _val; \ - _ret; \ - }) -#endif /* DBDC_MODE */ -#endif /* defined(COMPOS_TESTMODE_WIN) */ - -enum _TESTMODE_STAT_TYPE { - TESTMODE_RXV, - TESTMODE_PER_PKT, - TESTMODE_RESET_CNT, - TESTMODE_COUNTER_802_11, - TESTMODE_STAT_TYPE_NUM, -}; - -struct _RATE_TO_BE_FIX { - UINT32 TXRate : 6; - UINT32 TXMode : 3; - UINT32 Nsts : 2; - UINT32 STBC : 1; - UINT32 Reserved : 20; -}; - -struct rssi_offset_eeprom { - UINT32 **rssi_eeprom_band_offset; - UINT32 *n_band_offset; - UINT32 n_band; -}; - -INT32 MT_ATERFTestCB(struct _RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length); -INT32 MT_SetATEMPSDump(struct _RTMP_ADAPTER *pAd, UINT32 band_idx); -INT32 MtTestModeInit(struct _RTMP_ADAPTER *pAd); -INT32 MtTestModeExit(struct _RTMP_ADAPTER *pAd); -INT MtTestModeBkCr(struct _RTMP_ADAPTER *pAd, ULONG offset, - enum _TEST_BK_CR_TYPE type); -INT MtTestModeRestoreCr(struct _RTMP_ADAPTER *pAd, ULONG offset); -INT32 MT_ATETxControl(struct _RTMP_ADAPTER *pAd, UINT32 band_idx, - PNDIS_PACKET pkt); -VOID MT_ATEUpdateRxStatistic(struct _RTMP_ADAPTER *pAd, - enum _TESTMODE_STAT_TYPE type, VOID *data); -INT Mt_TestModeInsertPeer(struct _RTMP_ADAPTER *pAd, UINT32 band_ext, CHAR *da, - CHAR *sa, CHAR *bss); -INT32 MT_ATETxPkt(struct _RTMP_ADAPTER *pAd, - UINT32 band_idx); /* Export for Loopback */ -INT MtATESetMacTxRx(struct _RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN Enable, - UCHAR BandIdx); -INT MtATESetTxStream(struct _RTMP_ADAPTER *pAd, UINT32 StreamNums, - UCHAR BandIdx); -INT MtATESetRxPath(struct _RTMP_ADAPTER *pAd, UINT32 RxPathSel, UCHAR BandIdx); -INT MtATESetRxFilter(struct _RTMP_ADAPTER *pAd, MT_RX_FILTER_CTRL_T filter); -INT MtATESetCleanPerStaTxQueue(struct _RTMP_ADAPTER *pAd, - BOOLEAN sta_pause_enable); -INT32 MT_ATEDumpLog(struct _RTMP_ADAPTER *pAd, struct _ATE_LOG_DUMP_CB *log_cb, - UINT32 log_type); -VOID MtCmdATETestResp(struct cmd_msg *msg, char *data, UINT16 len); -INT32 MtATECh2Freq(UINT32 Channel, UINT32 band_idx); -INT32 MtATEGetTxPwrGroup(UINT32 Channel, UINT32 band_idx, UINT32 Ant_idx); -INT32 MT_ATEInsertLog(struct _RTMP_ADAPTER *pAd, UCHAR *log, UINT32 log_type, - UINT32 len); -#if !defined(COMPOS_TESTMODE_WIN) /* for MT_testmode.c */ -INT MT_ATERxDoneHandle(struct _RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); -#endif -INT32 MtATERSSIOffset(struct _RTMP_ADAPTER *pAd, INT32 RSSI_org, - UINT32 RSSI_idx, INT32 Ch_Band); -INT32 MtATETssiTrainingProc(struct _RTMP_ADAPTER *pAd, UCHAR ucBW, - UCHAR ucBandIdx); -#ifdef PRE_CAL_MT7622_SUPPORT -INT MtATE_DPD_Cal_Store_Proc_7622(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*PRE_CAL_MT7622_SUPPORT*/ -#ifdef PRE_CAL_TRX_SET1_SUPPORT -INT MtATE_DPD_Cal_Store_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT MtATE_DCOC_Cal_Store_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#ifdef PRE_CAL_TRX_SET2_SUPPORT -INT MtATE_Pre_Cal_Proc(RTMP_ADAPTER *pAd, UINT8 CalId, UINT32 ChGrpId); -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ - -INT32 mt_ate_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); -INT TxPowerManualCtrl(PRTMP_ADAPTER pAd, BOOLEAN fgPwrManCtrl, - UINT8 u1TxPwrModeManual, UINT8 u1TxPwrBwManual, - UINT8 u1TxPwrRateManual, INT8 i1TxPwrValueManual, - UCHAR ucBandIdx); - -#if defined(COMPOS_TESTMODE_WIN) -#endif - -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -INT MtATE_PA_Trim_Proc(RTMP_ADAPTER *pAd, PUINT32 pData); -#endif /* CAL_BIN_FILE_SUPPORT */ - -#define MT_ATEInit(_pAd) \ - ({ \ - UINT32 _ret; \ - _ret = MtTestModeInit(_pAd); \ - _ret; \ - }) - -#define MT_ATEExit(_pAd) \ - ({ \ - UINT32 _ret; \ - _ret = MtTestModeExit(_pAd); \ - _ret; \ - }) -#endif /* _MT_TESTMODE_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode_dmac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode_dmac.h deleted file mode 100644 index 3f9cb8692a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode_dmac.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_testmode_dmac.h -*/ - -#ifndef __MT_TESTMODE_DMAC_H__ -#define __MT_TESTMODE_DMAC_H__ - -INT mt_ate_mac_cr_restore(struct _RTMP_ADAPTER *pAd); -INT mt_ate_mac_cr_backup_and_set(struct _RTMP_ADAPTER *pAd); -INT mt_ate_ampdu_ba_limit(struct _RTMP_ADAPTER *pAd, UINT32 band_idx, - UINT8 agg_limit); -INT mt_ate_set_sta_pause_cr(struct _RTMP_ADAPTER *pAd, UINT32 band_idx); - -#endif /* __MT_TESTMODE_DMAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode_smac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode_smac.h deleted file mode 100644 index 21baaede30..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/mt_testmode_smac.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_testmode_smac.h -*/ - -#ifndef __MT_TESTMODE_SMAC_H__ -#define __MT_TESTMODE_SMAC_H__ - -INT mt_ate_mac_cr_restore(struct _RTMP_ADAPTER *pAd); -INT mt_ate_mac_cr_backup_and_set(struct _RTMP_ADAPTER *pAd); - -#endif /* __MT_TESTMODE_SMAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/qa_agent.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/qa_agent.h deleted file mode 100644 index b03279a1ce..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/qa_agent.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - qa_agent.h -*/ - -#ifndef __QA_AGENT_H__ -#define __QA_AGENT_H__ - -#define HQA_CMD_MAGIC_NO 0x18142880 - -/* RX STAT */ -#define HQA_RX_STAT_MACFCSERRCNT 0x1 -#define HQA_RX_STAT_MAC_MDRDYCNT 0x2 -#define HQA_RX_STAT_PHY_MDRDYCNT 0x3 -#define HQA_RX_STAT_PHY_FCSERRCNT 0x4 -#define HQA_RX_STAT_PD 0x5 -#define HQA_RX_STAT_CCK_SIG_SFD 0x6 -#define HQA_RX_STAT_OFDM_SIG_TAG 0x7 -#define HQA_RX_STAT_RSSI 0x8 -#define HQA_RX_RESET_PHY_COUNT 0x9 -#define HQA_RX_RESET_MAC_COUNT 0xa - -/* FW Event Callback */ -VOID HQA_GetThermalValue_CB(struct cmd_msg *msg, char *Data, UINT16 Len); - -struct GNU_PACKED _HQA_CMD_FRAME { - UINT32 MagicNo; - UINT16 Type; - UINT16 Id; - UINT16 Length; - UINT16 Sequence; - UCHAR Data[2048]; -}; - -typedef INT32 (*HQA_CMD_HANDLER)(struct _RTMP_ADAPTER *pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - struct GNU_PACKED _HQA_CMD_FRAME *HqaCmdFrame); - -struct _HQA_CMD_TABLE { - HQA_CMD_HANDLER *CmdSet; - UINT32 CmdSetSize; - UINT32 CmdOffset; -}; - -struct GNU_PACKED _HQA_RX_STAT { - UINT32 mac_rx_fcs_err_cnt; - UINT32 mac_rx_mdrdy_cnt; - UINT32 phy_rx_fcs_err_cnt_cck; - UINT32 phy_rx_fcs_err_cnt_ofdm; - UINT32 phy_rx_pd_cck; - UINT32 phy_rx_pd_ofdm; - UINT32 phy_rx_sig_err_cck; - UINT32 phy_rx_sfd_err_cck; - UINT32 phy_rx_sig_err_ofdm; - UINT32 phy_rx_tag_err_ofdm; - UINT32 WB_RSSSI0; - UINT32 IB_RSSSI0; - UINT32 WB_RSSSI1; - UINT32 IB_RSSSI1; - UINT32 phy_rx_mdrdy_cnt_cck; - UINT32 phy_rx_mdrdy_cnt_ofdm; - UINT32 DriverRxCount; - UINT32 RCPI0; - UINT32 RCPI1; - UINT32 FreqOffsetFromRX; - UINT32 RSSI0; - UINT32 RSSI1; -}; - -#endif /* __QA_AGENT_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/testmode_common.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/testmode_common.h deleted file mode 100644 index 61d3050219..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/testmode_common.h +++ /dev/null @@ -1,47 +0,0 @@ - -#ifndef _TESTMODE_COMMON_H -#define _TESTMODE_COMMON_H - -#ifndef COMPOS_TESTMODE_WIN -enum _EPQID { - EP4QID = 0, - EP5QID, - EP6QID, - EP7QID, - EP8QID = 8, - EP9QID, - EPALLQID -}; -#endif -/*test mode common*/ -/* */ -/* Scheduler Register 4 (offset: 0x0594, default: 0x0000_0000) */ -/* Note: */ -/* 1. DW : double word */ -/* */ -union _SCHEDULER_REGISTER4 { - struct { - /* DW0 */ - ULONG ForceQid : 4; - ULONG ForceMode : 1; - ULONG BypassMode : 1; - ULONG HybridMode : 1; - ULONG RgPredictNoMask : 1; - ULONG RgResetScheduler : 1; - ULONG RgDoneClearHeader : 1; - ULONG SwMode : 1; - ULONG Reserves0 : 5; - ULONG RgRateMap : 14; - ULONG Reserves1 : 2; - } Default; - ULONG word; -}; - -/* MT7637 for Band display */ -#define MT7367_RO_AGC_DEBUG_2 (WF_PHY_BASE + 0x0584) -#define CR_ACI_HIT (WF_PHY_BASE + 0x0594) -/* MT7637 for Band display end */ - -/*~test mode common*/ - -#endif /* _TESTMODE_COMMON_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/testmode_ioctl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/testmode_ioctl.h deleted file mode 100644 index b8d3befbbf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/include/testmode_ioctl.h +++ /dev/null @@ -1,531 +0,0 @@ - -#ifndef _TESTMODE_IOCTL_H -#define _TESTMODE_IOCTL_H - -#define TM_STATUS_NOTSUPPORT 0x01 - -#if defined(COMPOS_TESTMODE_WIN) -#define PKTL_TRAN_TO_NET(_Val) _Val -#define PKTL_TRAN_TO_HOST(_Val) _Val -#define PKTS_TRAN_TO_NET(_Val) _Val -#define PKTS_TRAN_TO_HOST(_Val) _Val -#define PKTLA_TRAN_TO_HOST(_len, _byte_array) _byte_array -#define PKTLA_TRAN_TO_NET(_len, _byte_array) _byte_array -#define PKTLA_DUMP(_lvl, _len, _byte_arrary) _byte_array -#define PKTUC_DUMP(_lvl, _len, _byte_arrary) _byte_array -#else -#define PKTL_TRAN_TO_NET(_Val) OS_HTONL(_Val) -#define PKTL_TRAN_TO_HOST(_Val) OS_NTOHL(_Val) -#define PKTS_TRAN_TO_NET(_Val) OS_HTONS(_Val) -#define PKTS_TRAN_TO_HOST(_Val) OS_NTOHS(_Val) -#define PKTLA_TRAN_TO_HOST(_len, _byte_array) \ - ({ \ - INT _cnt = 0; \ - UINT32 *_arr = (UINT32 *)_byte_array; \ - for (_cnt = 0; _cnt < _len; _cnt++) \ - _arr[_cnt] = OS_NTOHL(_arr[_cnt]); \ - _byte_array; \ - }); -#define PKTLA_TRAN_TO_NET(_len, _byte_array) \ - ({ \ - INT _cnt = 0; \ - UINT32 *_arr = (UINT32 *)_byte_array; \ - for (_cnt = 0; _cnt < _len; _cnt++) \ - _arr[_cnt] = OS_HTONL(_arr[_cnt]); \ - _byte_array; \ - }); -#define PKTLA_DUMP(_lvl, _len, _byte_array) \ - ({ \ - INT _cnt = 0; \ - UINT32 *_arr = (UINT32 *)_byte_array; \ - for (_cnt = 0; _cnt < _len; _cnt++) \ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, _lvl, \ - ("DWORD%d:%08x\n", _cnt, _arr[_cnt])); \ - _len; \ - }); -#define PKTUC_DUMP(_lvl, _len, _byte_array) \ - ({ \ - INT _cnt = 0; \ - UCHAR *_arr = (UCHAR *)_byte_array; \ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, _lvl, \ - ("PKTUC_DUMP(%x): ", _len)); \ - for (_cnt = 0; _cnt < _len; _cnt++) \ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, _lvl, \ - ("%02x", _arr[_cnt])); \ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, _lvl, ("\n")); \ - _len; \ - }); -#endif - -#if defined(COMPOS_TESTMODE_WIN) -/*********************************************************************************** - * IOCTL related definitions and data structures. - **********************************************************************************/ -typedef struct __RTMP_IOCTL_INPUT_STRUCT { - UINT32 InBufLen; - PVOID InBuf; - UINT32 OutBufLen; - PVOID OutBuf; - UINT32 *BytesRet; -} RTMP_IOCTL_INPUT_STRUCT; - -BOOLEAN mt_mac_cr_range_mapping(struct _RTMP_ADAPTER *pAd, UINT32 *mac_addr); -UINT32 mt_physical_addr_map(UINT32 addr); - -#define RTMP_IO_EFAULT 30002 -#define EFAULT (-RTMP_IO_EFAULT) -#endif /* TODO: Add lack of structure for Linux temporarily, fix during merge */ -VOID HQA_GetThermalValue_CB(struct cmd_msg *msg, char *Data, UINT16 Len); -#ifdef TXBF_SUPPORT -VOID HQA_BF_INFO_CB(RTMP_ADAPTER *pAd, unsigned char *data, UINT32 len); -#endif -/* - * #if defined(COMPOS_TESTMODE_WIN) - * #define OS_ENDIANSWAP(_Val) _Val; - * #else - * //#define OS_ENDIANSWAP(_Val) PKTL_TRAN_TO_HOST(_Val); - * #endif - */ -/* Common Part, TODO: Only common part after merge */ -/* Structure for TxBF*/ -#define HQA_BF_STR_SIZE 512 -#pragma pack(1) -struct GNU_PACKED _HQA_HIFTestParam { - UINT32 start_len; - UINT32 stop_len; - UINT32 repeat_time; - UINT32 is_def_pattern; - UINT32 bulkout_num; - UINT32 bulkin_num; - UINT32 txagg_num; - UINT32 rxagg_limit; - UINT32 rxagg_lm; - UINT32 rxagg_to; - UINT32 enable_rxagg; -}; - -#ifdef TXBF_SUPPORT -struct GNU_PACKED _HQA_BF_TAG_ALLOC { - UINT32 col_idx0; - UINT32 row_idx0; - UINT32 col_idx1; - UINT32 row_idx1; - UINT32 col_idx2; - UINT32 row_idx2; - UINT32 col_idx3; - UINT32 row_idx3; -}; - -struct GNU_PACKED _HQA_BF_TAG_MATRIX { - UINT32 nrow; - UINT32 ncol; - UINT32 ngroup; - UINT32 LM; - UINT32 code_book; - UINT32 htc_exist; -}; - -struct GNU_PACKED _HQA_BF_TAG_SNR { - UINT32 snr_sts0; - UINT32 snr_sts1; - UINT32 snr_sts2; - UINT32 snr_sts3; -}; - -struct GNU_PACKED _HQA_BF_TAG_MCS_THRD { - UINT32 mcs_lss0; - UINT32 mcs_sss0; - UINT32 mcs_lss1; - UINT32 mcs_sss1; - UINT32 mcs_lss2; - UINT32 mcs_sss2; -}; - -struct GNU_PACKED _HQA_BF_TAG_INFO { - /* Tag 1 */ - UINT32 profile; /* [6:0] : 0 ~ 63 */ - UINT32 tx_bf; /* [7] : 0: iBF, 1: eBF */ - UINT32 dbw; /* [9:8] : 0/1/2/3: DW20/40/80/160NC */ - UINT32 su_mu; /* [10] : 0:SU, 1: MU */ - UINT32 invalid; /* [11] : 0:default, 1: This profile number is invalid by SW */ - UINT32 rmsd; /* [14:12] : RMSD value from CE */ - UINT32 addr1_col_idx; /* [17 : 15] : column index : 0 ~ 5 */ - UINT32 addr1_row_idx; /* [23 : 18] : row index : 0 ~ 63 */ - UINT32 addr2_col_idx; /* [26 : 24] : column index : 0 ~ 5 */ - UINT32 addr2_row_idx; /* [31 : 27] : row index : 0 ~ 63, [32]: MSB of row index */ - UINT32 addr3_col_idx; /* [35 : 33] : column index : 0 ~ 5 */ - UINT32 addr3_row_idx; /* [41 : 36] : row index : 0 ~ 63 */ - UINT32 addr4_col_idx; /* [44 : 42] : column index : 0 ~ 5 */ - UINT32 addr4_row_idx; /* [50 : 45] : row index : 0 ~ 63 */ - UINT32 reserved1; /* [51] : Reserved */ - UINT32 nrow; /* [53 : 52] : Nrow */ - UINT32 ncol; /* [55 : 54] : Ncol */ - UINT32 ngroup; /* [57 : 56] : Ngroup */ - UINT32 LM; /* [59 : 58] : 0/1/2 */ - UINT32 code_book; /* [61:60] : Code book */ - UINT32 htc_exist; /* [62] : HtcExist */ - UINT32 reserved2; /* [63] : Reserved */ - UINT32 snr_sts0; /* [71:64] : SNR_STS0 */ - UINT32 snr_sts1; /* [79:72] : SNR_STS1 */ - UINT32 snr_sts2; /* [87:80] : SNR_STS2 */ - UINT32 snr_sts3; /* [95:88] : SNR_STS3 */ - UINT32 ibf_lanidx; /* [103:96] : iBF LNA index */ - /* Tag 2 */ - UINT32 smt_ant; /* [11:0] : Smart Ant config */ - UINT32 reserved3; /* [14:12] : Reserved */ - UINT32 se_idx; /* [19:15] : SE index */ - UINT32 rmsd_thrd; /* [22:20] : RMSD Threshold */ - UINT32 reserved4; /* [23] : Reserved */ - UINT32 mcs_thrd_l1ss; /* [27:24] : MCS TH long 1SS */ - UINT32 mcs_thrd_s1ss; /* [31:28] : MCS TH short 1SS */ - UINT32 mcs_thrd_l2ss; /* [35:32] : MCS TH long 2SS */ - UINT32 mcs_thrd_s2ss; /* [39:36] : MCS TH short 2SS */ - UINT32 mcs_thrd_l3ss; /* [43:40] : MCS TH long 3SS */ - UINT32 mcs_thrd_s3ss; /* [47:44] : MCS TH short 3SS */ - UINT32 bf_tout; /* [55:48] : iBF timeout limit */ - UINT32 reserved5; /* [63:56] : Reserved */ - UINT32 reserved6; /* [71:64] : Reserved */ - UINT32 reserved7; /* [79:72] : Reserved */ - UINT32 ibf_dbw; /* [81:80] : iBF desired DBW 0/1/2/3 : BW20/40/80/160NC */ - UINT32 ibf_ncol; /* [83:82] : iBF desired Ncol = 1 ~ 3 */ - UINT32 ibf_nrow; /* [85:84] : iBF desired Nrow = 1 ~ 4 */ - UINT32 reserved8; /* [95:86] : Reserved */ -}; - -struct GNU_PACKED _HQA_BF_STA_CMM_REC { - UINT32 wlan_idx; - UINT32 bss_idx; - UINT32 aid; - UCHAR mac[MAC_ADDR_LEN]; -}; - -enum _HQA_BF_CMD_ID { - ATE_TXBF_INIT = 1, - ATE_CHANNEL, - ATE_TX_MCS, - ATE_TX_POW0, - ATE_TX_ANT, - ATE_RX_FRAME, - ATE_RX_ANT, - ATE_TXBF_LNA_GAIN, - ATE_IBF_PHASE_COMP, - ATE_IBF_TX, - ATE_IBF_PROF_UPDATE, - ATE_EBF_PROF_UPDATE, - ATE_IBF_INST_CAL, - ATE_IBF_INST_VERIFY, - ATE_TXBF_GD_INIT, - ATE_IBF_PHASE_E2P_UPDATE -}; - -struct GNU_PACKED _HQA_BF_STA_REC { - UINT32 wlan_idx; - UINT32 bss_idx; - UINT32 PfmuId; - UINT32 su_mu; - UINT32 etxbf_cap; - UINT32 ndpa_rate; - UINT32 ndp_rate; - UINT32 report_poll_rate; - UINT32 tx_mode; - UINT32 nc; - UINT32 nr; - UINT32 cbw; - UINT32 spe_idx; - UINT32 tot_mem_req; - UINT32 mem_req_20m; - UINT32 mem_row0; - UINT32 mem_col0; - UINT32 mem_row1; - UINT32 mem_col1; - UINT32 mem_row2; - UINT32 mem_col2; - UINT32 mem_row3; - UINT32 mem_col3; -}; - -struct GNU_PACKED _HQA_BF_STA_PROFILE { - UINT32 pfmuid; - UINT32 subcarrier; - UINT32 phi11; - UINT32 psi21; - UINT32 phi21; - UINT32 psi31; - UINT32 phi31; - UINT32 psi41; - UINT32 phi22; - UINT32 psi32; - UINT32 phi32; - UINT32 psi42; - UINT32 phi33; - UINT32 psi43; - UINT32 snr00; - UINT32 snr01; - UINT32 snr02; - UINT32 snr03; -}; - -struct GNU_PACKED _HQA_BF_SOUNDING { - UINT32 su_mu; - UINT32 mu_num; - UINT32 snd_interval; - UINT32 wlan_id0; - UINT32 wlan_id1; - UINT32 wlan_id2; - UINT32 wlan_id3; - UINT32 band_idx; -}; - -struct GNU_PACKED _HQA_BF_MANUAL_CONN { - UCHAR mac[MAC_ADDR_LEN]; - UINT32 type; - UINT32 wtbl_idx; - UINT32 ownmac_idx; - UINT32 phymode; - UINT32 bw; - UINT32 pfmuid; - UINT32 marate_mode; - UINT32 marate_mcs; - UINT32 nss; - UINT32 spe_idx; - UINT32 rca2; - UINT32 rv; - UINT32 aid; -}; - -struct GNU_PACKED _HQA_PWR_MANUAL { - UINT32 u4PwrManCtrl; - UINT32 u4TxPwrModeManual; - UINT32 u4TxPwrBwManual; - UINT32 u4TxPwrRateManual; - UINT32 i4TxPwrValueManual; - UINT32 u4Band; -}; - -#ifdef CFG_SUPPORT_MU_MIMO -/* Structure for MU-MIMO */ -struct _HQA_MU_STA_PARAM { - UINT32 gid[2]; - UINT32 up[4]; -}; - -struct _HQA_MU_TBL { - UINT32 su_mu; - UCHAR tbl[0]; -}; - -struct GNU_PACKED _HQA_MU_USR_INIT_MCS { - UINT32 user0; - UINT32 user1; - UINT32 user2; - UINT32 user3; -}; - -struct GNU_PACKED _HQA_MU_USR_LQ { - UINT32 usr0_bpsk; - UINT32 usr0_qpsk; - UINT32 usr0_16qam; - UINT32 usr0_64qam; - UINT32 usr0_256qam; - UINT32 usr1_bpsk; - UINT32 usr1_qpsk; - UINT32 usr1_16qam; - UINT32 usr1_64qam; - UINT32 usr1_256qam; - UINT32 usr2_bpsk; - UINT32 usr2_qpsk; - UINT32 usr2_16qam; - UINT32 usr2_64qam; - UINT32 usr2_256qam; - UINT32 usr3_bpsk; - UINT32 usr3_qpsk; - UINT32 usr3_16qam; - UINT32 usr3_64qam; - UINT32 usr3_256qam; -}; - -struct GNU_PACKED _HQA_MU_GRP_INFO { - UINT32 grp_idx; - UINT32 num_usr; - UINT32 usr0_ldpc; - UINT32 usr1_ldpc; - UINT32 usr2_ldpc; - UINT32 usr3_ldpc; - UINT32 usr0_nss; - UINT32 usr1_nss; - UINT32 usr2_nss; - UINT32 usr3_nss; - UINT32 gid; - UINT32 usr0_up; - UINT32 usr1_up; - UINT32 usr2_up; - UINT32 usr3_up; - UINT32 usr0_pfmu_id; - UINT32 usr1_pfmu_id; - UINT32 usr2_pfmu_id; - UINT32 usr3_pfmu_id; - UINT32 initMCS0; - UINT32 initMCS1; - UINT32 initMCS2; - UINT32 initMCS3; - UCHAR usr0_mac[MAC_ADDR_LEN]; - UCHAR usr1_mac[MAC_ADDR_LEN]; - UCHAR usr2_mac[MAC_ADDR_LEN]; - UCHAR usr3_mac[MAC_ADDR_LEN]; -}; -#endif /* CFG_SUPPORT_MU_MIMO */ -#endif /* TXBF_SUPPORT */ -#pragma pack() - -/* DBDC Tx Ext */ -#pragma pack(1) -struct GNU_PACKED _HQA_EXT_SET_CH { - UINT32 ext_id; - UINT32 num_param; - UINT32 band_idx; - UINT32 central_ch0; - UINT32 central_ch1; - UINT32 sys_bw; - UINT32 perpkt_bw; - UINT32 pri_sel; - UINT32 reason; - UINT32 ch_band; - UINT32 out_band_freq; -}; - -struct GNU_PACKED _HQA_EXT_TX_CONTENT { - UINT32 ext_id; - UINT32 num_param; - UINT32 band_idx; - UINT32 FC; - UINT32 dur; - UINT32 seq; - UINT32 gen_payload_rule; /* Normal:0,Repeat:1,Random:2 */ - UINT32 txlen; - UINT32 payload_len; - UCHAR addr1[MAC_ADDR_LEN]; - UCHAR addr2[MAC_ADDR_LEN]; - UCHAR addr3[MAC_ADDR_LEN]; - UCHAR payload[0]; -}; - -struct GNU_PACKED _HQA_EXT_TXV { - UINT32 ext_id; - UINT32 num_param; - UINT32 band_idx; - UINT32 pkt_cnt; - UINT32 phymode; - UINT32 rate; - UINT32 pwr; - UINT32 stbc; - UINT32 ldpc; - UINT32 ibf; - UINT32 ebf; - UINT32 wlan_id; - UINT32 aifs; - UINT32 gi; - UINT32 tx_path; - UINT32 nss; -}; - -struct GNU_PACKED _HQA_CMD_FRAME { - UINT32 MagicNo; - UINT16 Type; - UINT16 Id; - UINT16 Length; - UINT16 Sequence; - UINT8 Data[IOCTLBUFF]; -}; -#pragma pack() - -typedef INT32 (*HQA_CMD_HANDLER)(struct _RTMP_ADAPTER *pAd, - struct __RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *HqaCmdFrame); - -struct _HQA_CMD_TABLE { - HQA_CMD_HANDLER *CmdSet; - UINT32 CmdSetSize; - UINT32 CmdOffset; -}; - -struct GNU_PACKED _HQA_RX_STAT { - UINT32 mac_rx_fcs_err_cnt; - UINT32 mac_rx_mdrdy_cnt; - UINT32 phy_rx_fcs_err_cnt_cck; - UINT32 phy_rx_fcs_err_cnt_ofdm; - UINT32 phy_rx_pd_cck; - UINT32 phy_rx_pd_ofdm; - UINT32 phy_rx_sig_err_cck; - UINT32 phy_rx_sfd_err_cck; - UINT32 phy_rx_sig_err_ofdm; - UINT32 phy_rx_tag_err_ofdm; - UINT32 WB_RSSSI0; - UINT32 IB_RSSSI0; - UINT32 WB_RSSSI1; - UINT32 IB_RSSSI1; - UINT32 phy_rx_mdrdy_cnt_cck; - UINT32 phy_rx_mdrdy_cnt_ofdm; - UINT32 DriverRxCount; - UINT32 RCPI0; - UINT32 RCPI1; - INT32 FreqOffsetFromRX; - UINT32 RSSI0; - UINT32 RSSI1; - UINT32 rx_fifo_full; - /* #ifdef MT7615 */ - UINT32 mac_rx_len_mismatch; - UINT32 mac_rx_fcs_err_cnt_band1; - UINT32 mac_rx_mdrdy_cnt_band1; - UINT32 FAGC_IB_RSSSI[4]; - UINT32 FAGC_WB_RSSSI[4]; - UINT32 Inst_IB_RSSSI[4]; - UINT32 Inst_WB_RSSSI[4]; - UINT32 ACIHitLow; - UINT32 ACIHitHigh; - UINT32 DriverRxCount1; - UINT32 RCPI2; - UINT32 RCPI3; - UINT32 RSSI2; - UINT32 RSSI3; - UINT32 SNR0; - UINT32 SNR1; - UINT32 SNR2; - UINT32 SNR3; - UINT32 rx_fifo_full_band1; - UINT32 mac_rx_len_mismatch_band1; - UINT32 phy_rx_pd_cck_band1; - UINT32 phy_rx_pd_ofdm_band1; - UINT32 phy_rx_sig_err_cck_band1; - UINT32 phy_rx_sfd_err_cck_band1; - UINT32 phy_rx_sig_err_ofdm_band1; - UINT32 phy_rx_tag_err_ofdm_band1; - UINT32 phy_rx_mdrdy_cnt_cck_band1; - UINT32 phy_rx_mdrdy_cnt_ofdm_band1; - UINT32 phy_rx_fcs_err_cnt_cck_band1; - UINT32 phy_rx_fcs_err_cnt_ofdm_band1; - UINT32 MuPktCount; - UINT32 SIG_MCS; - UINT32 SINR; - UINT32 RXVRSSI; - /* #endif */ - UINT32 mac_rx_fcs_ok_cnt; /* MT7622 only */ -}; - -UINT32 HQA_CMDHandler(struct _RTMP_ADAPTER *pAd, - struct __RTMP_IOCTL_INPUT_STRUCT *Wrq, - struct _HQA_CMD_FRAME *HqaCmdFrame); - -#define TM_CMDREQ 0x0008 -#define TM_CMDRSP 0x8008 -#define HQA_CMD_MAGIC_NO 0x18142880 - -#define HQA_CMD_REQ 0x0005 -#define HQA_CMD_RSP 0x8005 -#define TMR_HW_VER_100 100 -#define TMR_HW_VER_150 150 -#define TMR_HW_VER_200 200 - -#define HQA_CMD_MAGIC_NO 0x18142880 -#define EFUSE_ADDR_FREQUENCY_OFFSET_MT7637 0xF4 /* MT7637 */ - -#endif /* _TESTMODE_IOCTL_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/meta_agent.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/meta_agent.c deleted file mode 100644 index e4aeb2635a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/meta_agent.c +++ /dev/null @@ -1,2467 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - meta_agent.c -*/ -#include "rt_config.h" - -enum _WIFI_SUB_TEST_STATE { - WIFI_SUB_TEST_STANDBY, - WIFI_SUB_TEST_RESET, - WIFI_SUB_TEST_TX, - WIFI_SUB_TEST_RX, - WIFI_SUB_TEST_OUTPUT_PWR, - WIFI_SUB_TEST_LOCAL_FREQ, - WIFI_SUB_TEST_CARR_SUPPRESSION, - WIFI_SUB_TEST_CONTI_WAVE, - NUM_STATE -}; -#define _DUMP_HEX_ 1 -static enum _WIFI_SUB_TEST_STATE g_SUB_TEST_STATE = WIFI_SUB_TEST_STANDBY; -static UINT32 g_MT_META_ATCMD_TBL_VERSION = MT_META_WIFI_TEST_TABLE_VER; - -static BOOLEAN valid_ch(UCHAR Ch) -{ - int chIdx; - - for (chIdx = 0; chIdx < CH_HZ_ID_MAP_NUM; chIdx++) { - if ((Ch) == CH_HZ_ID_MAP[chIdx].channel) - return true; - } - - return false; -} - -static INT32 resp_to_meta(INT32 ioctl_cmd, struct _META_CMD_HDR *rsp, - RTMP_IOCTL_INPUT_STRUCT *wrq, INT32 len, INT32 status) -{ - if (ioctl_cmd == MTPRIV_IOCTL_META_SET) - rsp->len_in = len; - else if (ioctl_cmd == MTPRIV_IOCTL_META_QUERY) - rsp->len_out = len; - - wrq->u.data.length = sizeof(rsp->oid) + sizeof(rsp->len_in) + - sizeof(rsp->len_out) + len; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WRQ->u.data.length = %u, oid: %lu, rsp: %lu, rsp->len: 0x%x\n", - wrq->u.data.length, sizeof(rsp->oid), sizeof(rsp->len_in), - len)); - - if (copy_to_user(wrq->u.data.pointer, (UCHAR *)(rsp), - wrq->u.data.length)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("copy_to_user() fail in %s\n", __func__)); - return -EFAULT; - } - -#ifdef _DUMP_HEX_ - { - UCHAR *pSrcBufVA = wrq->u.data.pointer; - UINT32 SrcBufLen = wrq->u.data.length; - unsigned char *pt; - INT32 x; - - pt = pSrcBufVA; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: %p, len = %d\n", "META_IOCTL Ret Content", - pSrcBufVA, SrcBufLen)); - - for (x = 0; x < SrcBufLen; x++) { - if (x % 16 == 0) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("0x%04x : ", x)); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%02x ", ((unsigned char)pt[x]))); - - if (x % 16 == 15) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\n", __func__)); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s\n", __func__)); - } -#endif - return 0; -} - -static INT32 wifi_sub_test_stop(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = 0; - INT32 val = 0; - UINT32 Mode; - - memcpy((PUCHAR)&val, ¶m->data, 4); - - switch (g_SUB_TEST_STATE) { - case WIFI_SUB_TEST_STANDBY: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, WIFI_SUB_TEST_STANDBY\n", __func__)); - break; - - case WIFI_SUB_TEST_RESET: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, WIFI_SUB_TEST_RESET\n", __func__)); - break; - - case WIFI_SUB_TEST_TX: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, WIFI_SUB_TEST_TX STOP\n", __func__)); - Mode = ATECtrl->Mode; - ATECtrl->Mode &= ATE_TXSTOP; - ATECtrl->bQATxStart = FALSE; - ret = ATEOp->StopTx(pAd, Mode); - ATECtrl->TxStatus = 0; - break; - - case WIFI_SUB_TEST_RX: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, WIFI_SUB_TEST_RX STOP\n", __func__)); - ATECtrl->Mode &= ATE_RXSTOP; - ATECtrl->bQARxStart = FALSE; - ret = ATEOp->StopRx(pAd); - break; - - case WIFI_SUB_TEST_OUTPUT_PWR: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Conti. Tx stop\n", __func__)); - ret = ATEOp->StopContinousTx(pAd, TESTMODE_BAND0); - break; - - case WIFI_SUB_TEST_LOCAL_FREQ: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Tx Tone DC stop\n", __func__)); - ret = ATEOp->StopTxTone(pAd); - break; - - case WIFI_SUB_TEST_CARR_SUPPRESSION: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Tx Carrier Suppression stop\n", __func__)); - ret = ATEOp->StopTxTone(pAd); - break; - - case WIFI_SUB_TEST_CONTI_WAVE: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Conti. Tx stop\n", __func__)); - ret = ATEOp->StopContinousTx(pAd, TESTMODE_BAND0); - break; - - default: - break; - } - - g_SUB_TEST_STATE = WIFI_SUB_TEST_STANDBY; - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_start_tx(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - ret = ATEOp->StartTx(pAd); - g_SUB_TEST_STATE = WIFI_SUB_TEST_TX; - - if (ATECtrl->bQATxStart == TRUE) - ATECtrl->TxStatus = 1; - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_start_rx(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - g_SUB_TEST_STATE = WIFI_SUB_TEST_RX; - ret = ATEOp->StartRx(pAd); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_reset(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - - if (ioctl_cmd == MTPRIV_IOCTL_META_SET) { - /* 1. Table Version */ - g_MT_META_ATCMD_TBL_VERSION = 0x01000002; - /* 3. Rate */ - ATECtrl->PhyMode = MODE_CCK; - ATECtrl->Mcs = 1; - /* 4. Preamble, follow PhyMode, and always using long preamble currently, in mac/mt_mac.c line. 754 */ - /* 6. Packet Length */ - ATECtrl->TxLength = 1024; - /* 7. Packet Count */ - ATECtrl->TxCount = 1000; - /* 15. BW */ - ATECtrl->BW = BW_20; - /* 16. GI */ - ATECtrl->Sgi = 0; - /* 18. CH FREQ */ - ATEOp->SetTxFreqOffset(pAd, 0); - /* 23. TODO: Slow Clk Mode (?)*/ - /* 29. TODO: TSSI */ - /* 31. Tx Power mode - always dBm */ - /* 65. TODO: CW Mode (?) */ - /* 71. CH BW */ - ATECtrl->BW = BW_20; - /* 72. Data BW */ - /* ATECtrl->PerPktBW = BW_20; */ - /* 73. Primary setting */ - ATECtrl->ControlChl = 1; - ATECtrl->Channel = 1; - /* 74. J mode Setting (tone) */ - g_SUB_TEST_STATE = WIFI_SUB_TEST_STANDBY; - } else { - if (g_SUB_TEST_STATE != WIFI_SUB_TEST_STANDBY) - ret = NDIS_STATUS_FAILURE; - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - } - - return ret; -} - -static INT32 wifi_sub_test_output_pwr(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - /* TODO: Correct band selection */ - ret = ATEOp->StartContinousTx(pAd, ATECtrl->TxAntennaSel, - TESTMODE_BAND0); - g_SUB_TEST_STATE = WIFI_SUB_TEST_OUTPUT_PWR; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, val:0x%x\n", __func__, val)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_local_freq(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_FAILURE; - INT32 val = 0; - INT32 mode = 8; - INT32 pwr1 = 0xf; - INT32 pwr2 = 0; - CHAR txpwr = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - - /* TxAntennaSel, 0: All 1:TX0 2:TX1 */ - if (ATECtrl->TxAntennaSel == 1) { - mode = WF0_TX_ONE_TONE_DC; - txpwr = ATECtrl->TxPower0; - } else if (ATECtrl->TxAntennaSel == 2) { - mode = WF1_TX_ONE_TONE_DC; - txpwr = ATECtrl->TxPower1; - } else - goto meta_tx_suppress_done; - - if (txpwr > 30) - pwr2 = (txpwr - 30) << 1; - else { - pwr1 = (txpwr & 0x1e) >> 1; - pwr2 = (txpwr & 0x01) << 1; - } - - ret = ATEOp->StartTxTone(pAd, mode); - ret = ATEOp->SetTxTonePower(pAd, pwr1, pwr2); - g_SUB_TEST_STATE = WIFI_SUB_TEST_LOCAL_FREQ; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: TX Tone DC, TxPower:0x%x, pwr1:0x%x, pwr2:0x%x\n", - __func__, txpwr, pwr1, pwr2)); -meta_tx_suppress_done: - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_rf_suppression(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_FAILURE; - INT32 val = 0; - INT32 mode = 8; - INT32 pwr1 = 0xf; - INT32 pwr2 = 0; - CHAR txpwr = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - - /* TxAntennaSel, 0: All 1:TX0 2:TX1 */ - if (ATECtrl->TxAntennaSel == 1) { - mode = WF0_TX_TWO_TONE_5M; - txpwr = ATECtrl->TxPower0; - } else if (ATECtrl->TxAntennaSel == 2) { - mode = WF1_TX_TWO_TONE_5M; - txpwr = ATECtrl->TxPower1; - } else - goto meta_tx_suppress_done; - - if (txpwr > 30) - pwr2 = (txpwr - 30) << 1; - else { - pwr1 = (txpwr & 0x1e) >> 1; - pwr2 = (txpwr & 0x01) << 1; - } - - ret = ATEOp->StartTxTone(pAd, mode); - ret = ATEOp->SetTxTonePower(pAd, pwr1, pwr2); - g_SUB_TEST_STATE = WIFI_SUB_TEST_CARR_SUPPRESSION; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: TXCARR, TxPower:0x%x, pwr1:0x%x, pwr2:0x%x\n", __func__, - txpwr, pwr1, pwr2)); -meta_tx_suppress_done: - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_trx_iq_cali(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - /* UINT8 Action = 0, Mode = 0, CalItem = 0; */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - /* - * Enter RF test mode - * TODO: Don't know when to go back to normal mode, Mode = OPERATION_NORMAL_MODE; - */ - /* CmdRfTest(pAd, ACTION_SWITCH_TO_RFTEST, OPERATION_RFTEST_MODE, 0); */ - MtCmdRfTestSwitchMode(pAd, OPERATION_RFTEST_MODE, 0); - /* Sec, operation - * 6: Tx IQ Cal - * 10: Rx FIIIQ Cal - * 11: Rx FDIQ Cal - */ - /* CmdRfTest(pAd, ACTION_IN_RFTEST, OPERATION_RFTEST_MODE, 6); */ - /* CmdRfTest(pAd, ACTION_IN_RFTEST, OPERATION_RFTEST_MODE, 10); */ - /* CmdRfTest(pAd, ACTION_IN_RFTEST, OPERATION_RFTEST_MODE, 11); */ - MtCmdDoCalibration(pAd, 6); - MtCmdDoCalibration(pAd, 10); - MtCmdDoCalibration(pAd, 11); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_tssi_cali(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - /* - * Enter RF test mode - * TODO: Don't know when to go back to normal mode, Mode = OPERATION_NORMAL_MODE; - */ - /* CmdRfTest(pAd, ACTION_SWITCH_TO_RFTEST, OPERATION_RFTEST_MODE, 0); */ - MtCmdRfTestSwitchMode(pAd, OPERATION_RFTEST_MODE, 0); - /* Sec, operation - * 6: Tx IQ Cal - */ - /* CmdRfTest(pAd, ACTION_IN_RFTEST, OPERATION_RFTEST_MODE, 7); */ - MtCmdDoCalibration(pAd, 7); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_dpd_cali(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - /* - * Enter RF test mode - * TODO: Don't know when to go back to normal mode, Mode = OPERATION_NORMAL_MODE; - */ - /* CmdRfTest(pAd, ACTION_SWITCH_TO_RFTEST, OPERATION_RFTEST_MODE, 0); */ - MtCmdRfTestSwitchMode(pAd, OPERATION_RFTEST_MODE, 0); - /* Sec, operation - * 6: Tx IQ Cal - */ - /* CmdRfTest(pAd, ACTION_IN_RFTEST, OPERATION_RFTEST_MODE, 9); */ - MtCmdDoCalibration(pAd, 9); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_conti_waveform(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - /* TODO: Correct band selection */ - ret = ATEOp->StartContinousTx(pAd, ATECtrl->TxAntennaSel, - TESTMODE_BAND0); - g_SUB_TEST_STATE = WIFI_SUB_TEST_CONTI_WAVE; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, val:0x%x\n", __func__, val)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_sub_test_start_icap(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static META_CMD_HANDLER WIFI_TEST_CMD_SUBTEST[] = { - wifi_sub_test_stop, wifi_sub_test_start_tx, - wifi_sub_test_start_rx, wifi_sub_test_reset, - wifi_sub_test_output_pwr, wifi_sub_test_local_freq, - wifi_sub_test_rf_suppression, wifi_sub_test_trx_iq_cali, - wifi_sub_test_tssi_cali, wifi_sub_test_dpd_cali, - wifi_sub_test_conti_waveform, wifi_sub_test_start_icap, -}; - -static INT32 wifi_test_version(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - INT32 status = NDIS_STATUS_SUCCESS; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n%s: version:%04x !\n", __func__, - g_MT_META_ATCMD_TBL_VERSION)); - memcpy(¶m->data, &g_MT_META_ATCMD_TBL_VERSION, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, - sizeof(struct _PARAM_MTK_WIFI_TEST), status); - return status; -} - -static INT32 wifi_test_cmd(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - INT32 ret = NDIS_STATUS_SUCCESS; - UINT32 op = param->data; - - if (op > (sizeof(WIFI_TEST_CMD_SUBTEST) / sizeof(META_CMD_HANDLER))) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:op_idx: %04x, size of handle tbl: %lu\n", - __func__, op, - sizeof(WIFI_TEST_CMD_SUBTEST) / - sizeof(META_CMD_HANDLER))); - return NDIS_STATUS_INVALID_DATA; - } - - ret = (*WIFI_TEST_CMD_SUBTEST[op])(ioctl_cmd, pAd, WRQ, cmd_hdr); - return ret; -} - -static INT32 wifi_test_pwr_cfg(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, sizeof(val)); - /* val = OS_NTOHS(val); */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val:0x%x\n", __func__, val)); - /* TODO Add in the setting of another Tx Power, txpwr1*/ - pAd->ATECtrl.TxPower0 = val; - ret = ATEOp->SetTxPower0(pAd, val, 0); - /* ret = ATEOp->SetTxPower1(pAd, val); */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_rate_cfg(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, sizeof(val)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val:0x%x\n", __func__, val)); - - if ((val >> 31) & 0x00000001) { - /* b31(msb) set(1) - 11n MCS:0~15, 32 */ - val &= 0x7FFFFFF; - - if (((val > 15) && (val < 32)) || (val > 32)) - return -1; - - if (val == 32) - val = 17; /* for corresponding to idx of OFDMRateTable */ - - /* case MODE_HTMIX / case MODE_HTGREENFIELD */ - ATECtrl->PhyMode = MODE_HTMIX; - } else { - /* b31(msb) set(0) - CCK:0~3, OFDM:4~11 */ - val &= 0x7FFFFFF; - - if ((val < 0) || (val > 11)) - return -1; - else if ((val < 4) && (val >= 0)) { - /*KOKO: Not sure why there are 8 entries in CCKRateTable */ - ATECtrl->PhyMode = MODE_CCK; - } else { - ATECtrl->PhyMode = MODE_OFDM; - val -= 4; - } - } - - ATECtrl->Mcs = (UCHAR)val; - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_preamble_cfg(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Val: %x\n", __func__, val)); - - switch (val) { - case 0: /* Normal: don't know what is for normal, anyway choose OFDM */ - val = MODE_OFDM; - break; - - case 1: /* Have to check if its short preamble by default in CCK */ - val = MODE_CCK; - break; - - case 2: - val = MODE_HTMIX; - break; - - case 3: - val = MODE_HTGREENFIELD; - break; - - case 4: - val = MODE_VHT; - break; - - default: - break; - } - - ATECtrl->PhyMode = (UCHAR)val; - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_antenna_cfg(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Val: %x\n", __func__, val)); - ret = ATEOp->SetTxAntenna(pAd, (CHAR)val); - ret = ATEOp->SetRxAntenna(pAd, (CHAR)val); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_pkt_len_cfg(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - - if ((val < 24) || (val > (MAX_FRAME_SIZE - 34 /* == 2312 */))) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Out of range (%d), it should be in range of 24~%d.\n", - __func__, val, (MAX_FRAME_SIZE - 34 /* == 2312 */))); - return -1; - } - - ATECtrl->TxLength = val; - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TxLength = %x\n", __func__, ATECtrl->TxLength)); - return ret; -} - -static INT32 wifi_test_set_pkt_cnt(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - UINT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val: %u\n", __func__, val)); - - if (val == 0) - ATECtrl->TxCount = 0xFFFFFFFF; - else - ATECtrl->TxCount = val; - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} -/* - * Since different chip has different wifi Tx off time duration, meta tool do not set it - */ -static INT32 wifi_test_set_pkt_interval(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - UINT32 val = 0; - UINT32 slot_t = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - /* TODO: "Val will be round-up to (19+9n)us", quoted from doc. Ref. 6630 FW */ - slot_t = (val - 19 + SLOT_TIME_SHORT - 1) / SLOT_TIME_SHORT; - ATEOp->SetAIFS(pAd, (UINT32)slot_t); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_tmp_comp(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - return ret; -} - -static INT32 wifi_test_txop_en(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - return ret; -} - -static INT32 wifi_test_set_ack(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - return ret; -} - -static INT32 wifi_test_set_pkt_content(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - return ret; -} - -static INT32 wifi_test_set_retry_cnt(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - return ret; -} - -static INT32 wifi_test_set_qos_q(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - - if (val > 4) - return NDIS_STATUS_INVALID_DATA; - - /* ATECtrl->q_idx = (UCHAR)val; */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_bw(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val: 0x%x\n", __func__, val)); - - if (val > 3) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, Invalid Parameter(%x)\n", __func__, val)); - ret = -1; - goto _meta_set_bw_err; - } - - if (val == 0) { - ATECtrl->BW = BW_20; - ATECtrl->ControlChl = ATECtrl->Channel; - } else { - ATECtrl->BW = BW_40; - ATECtrl->ControlChl = ATECtrl->Channel; - - switch (val) { - case 1: - case 2: /* Upper 20MHz of a 40MHz Ch, ex. Ch6 upper, then control ch will be Ch4 */ - ATECtrl->ControlChl -= 2; - - if (!valid_ch(ATECtrl->ControlChl)) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s-case1/2, Invalid ControlChl(%x)\n", - __func__, ATECtrl->ControlChl)); - ATECtrl->ControlChl = ATECtrl->Channel; - ATECtrl->Channel += 2; - } - - break; - - case 3: /* Lower 20MHz of a 40MHz Ch, ex. Ch6 lower, then control ch will be Ch8 */ - ATECtrl->Channel += 2; - - if (!valid_ch(ATECtrl->Channel)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s-case3, Invalid ControlChl(%x)\n", - __func__, ATECtrl->ControlChl)); - ATECtrl->Channel = ATECtrl->ControlChl; - ATECtrl->ControlChl -= 2; - } - - break; - - default: - break; - } - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Channel = %d, Control ch: 0x%x, BW = %d\n", __func__, - ATECtrl->Channel, ATECtrl->ControlChl, ATECtrl->BW)); - ret = ATEOp->SetBW(pAd, ATECtrl->BW); -_meta_set_bw_err: - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -/* - * param: - * 0: normal GI - * 1: short GI - */ -static INT32 wifi_test_set_gi(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val:0x%x\n", __func__, val)); - - if (val > 1 || val < 0) - return -1; - - ATECtrl->Sgi = (UCHAR)val; - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_stbc(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - ATECtrl->Stbc = (UCHAR)val; - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_ch_freq(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - INT32 ch = 1; - - memcpy((PUCHAR)&val, ¶m->data, 4); - /* TODO: Need to check the value passed from host */ - RTMP_MapKHZ2ChannelID(val / 1000, &ch); - ATECtrl->Channel = ch; - ATECtrl->ControlChl = ATECtrl->Channel; - - /* Set Control channel according to BW */ - switch (ATECtrl->BW) { - case BW_20: - break; - - case BW_40: - case BW_80: - default: - - /* Lower 20MHz of a 40MHz Ch, ex. Ch6 lower, then control ch will be Ch8 */ - if (ATECtrl->ControlChl > 2) - ATECtrl->ControlChl -= 2; - else - ATECtrl->ControlChl += 2; - - break; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val:%d, ch: 0x%x, Control ch: 0x%x\n", __func__, val, - ATECtrl->Channel, ATECtrl->ControlChl)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_rifs(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_tr_switch(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_rf_sx_en(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_pll_en(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_slow_clk_en(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_adc_clk_mode(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_measure_mode(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_vlt_comp(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_dpd_tx_gain(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_dpd_en(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_tssi_en(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - INT32 wf_sel = 0; - - /* TODO: Plan to use upper 16 bits for antenna selection, lower 16 bits for on/off */ - memcpy((PUCHAR)&val, ¶m->data, 4); - val = val & 0x0000ffff; - memcpy((PUCHAR)&wf_sel, ¶m->data, 4); - wf_sel = ((wf_sel & 0xffff0000) >> 16) & 0x0000ffff; - ATEOp->SetTSSI(pAd, (CHAR)wf_sel, (CHAR)val); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_tx_gain_code(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_tx_pwr_mode(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static META_CMD_HANDLER WIFI_TEST_CMD_SET1[] = { - wifi_test_version, wifi_test_cmd, - wifi_test_pwr_cfg, wifi_test_rate_cfg, - wifi_test_preamble_cfg, wifi_test_antenna_cfg, - wifi_test_pkt_len_cfg, wifi_test_set_pkt_cnt, - wifi_test_set_pkt_interval, wifi_test_tmp_comp, - wifi_test_txop_en, wifi_test_set_ack, - wifi_test_set_pkt_content, wifi_test_set_retry_cnt, - wifi_test_set_qos_q, wifi_test_set_bw, - wifi_test_set_gi, wifi_test_set_stbc, - wifi_test_set_ch_freq, wifi_test_set_rifs, - wifi_test_tr_switch, wifi_test_rf_sx_en, - wifi_test_pll_en, wifi_test_slow_clk_en, - wifi_test_adc_clk_mode, wifi_test_measure_mode, - wifi_test_vlt_comp, wifi_test_get_dpd_tx_gain, - wifi_test_dpd_en, wifi_test_tssi_en, - wifi_test_get_tx_gain_code, wifi_test_tx_pwr_mode, -}; - -static INT32 wifi_test_get_tx_cnt(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - - memcpy(¶m->data, &ATECtrl->TxDoneCount, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_get_tx_ok_cnt(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_rx_ok_cnt(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)(&cmd_hdr->data); - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - UINT32 mcs_err = 0; - UINT32 mac_mdrdy = 0; - UINT32 value = 0; - - /* Get latest FCSErr. sync iwpriv & HQA same FCSErr result */ - NICUpdateRawCounters(pAd); - mcs_err = ATECtrl->RxMacFCSErrCount; - RTMP_IO_READ32(pAd, MIB_MSDR10, &value); - ATECtrl->RxMacMdrdyCount += value; - mac_mdrdy = ATECtrl->RxMacMdrdyCount; - value = mac_mdrdy - mcs_err; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, rx_ok: %u, err: %u\n", __func__, value, - ATECtrl->RxMacFCSErrCount)); - memcpy(¶m->data, &value, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_rx_err_cnt(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)(&cmd_hdr->data); - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - UINT32 mcs_err = 0; - - /* Get latest FCSErr. sync iwpriv & HQA same FCSErr result */ - NICUpdateRawCounters(pAd); - mcs_err = ATECtrl->RxMacFCSErrCount; - memcpy(¶m->data, &mcs_err, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, mcs_err: %u\n", __func__, mcs_err)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_get_result_len(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_trx_iq_cal(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_tssi_cal(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_dpd_cal(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_rxv_dump(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_rx_stat(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_rpi_ipi(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_tmp_sensor(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_get_vlt_sensor(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_read_efuse(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_get_rx_rssi(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - UINT32 value = 0; - - /* HqaRxStat.DriverRxCount = OS_NTOHL(ATECtrl->RxTotalCnt); */ - /* HqaRxStat.RCPI0 = OS_NTOHL(ATECtrl->RCPI0); */ - /* HqaRxStat.RCPI1 = OS_NTOHL(ATECtrl->RCPI1); */ - /* HqaRxStat.FreqOffsetFromRX = OS_NTOHL(ATECtrl->FreqOffsetFromRx); */ - value |= (0x000000ff & ATECtrl->LastRssi0); - value = value << 8; - value |= (0x000000ff & ATECtrl->MaxRssi0); - value = value << 8; - value |= (0x000000ff & ATECtrl->MinRssi0); - value = value << 8; - value |= (0x000000ff & ATECtrl->AvgRssi0); - memcpy(¶m->data, &value, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, value:0x%x, last:0x%x,max:0x%x, min:0x%x, avg:0x%x\n", - __func__, value, ATECtrl->LastRssi0, ATECtrl->MaxRssi0, - ATECtrl->MinRssi0, ATECtrl->AvgRssi0)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_get_fw_info(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0x0001; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(¶m->data, &val, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_get_dri_info(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0x7636; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(¶m->data, &val, 4); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_get_pwr_detector(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_get_phy_rssi(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - INT32 ret = NDIS_STATUS_SUCCESS; - UINT32 IBRssi0, IBRssi1, WBRssi0, WBRssi1; - UINT32 value; - - RTMP_IO_READ32(pAd, RO_AGC_DEBUG_2, &value); - IBRssi0 = (value & 0xFF000000) >> 24; - - if (IBRssi0 > 128) - IBRssi0 -= 256; - - WBRssi0 = (value & 0x00FF0000) >> 16; - - if (WBRssi0 > 128) - WBRssi0 -= 256; - - /* Rx1 Rssi */ - IBRssi1 = (value & 0x0000FF00) >> 8; - - if (IBRssi1 > 128) - IBRssi1 -= 256; - - WBRssi1 = (value & 0x000000FF); - - if (WBRssi1 > 128) - WBRssi1 -= 256; - - value = 0; - value |= (0x000000ff & WBRssi0); - value <<= 16; - value |= (0x000000ff & IBRssi0); - memcpy(¶m->data, &value, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, Return: 0x%x, WBRssi:0x%x, IBRssi:0x%x\n", __func__, - value, WBRssi0, IBRssi0)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_get_rx_rssi1(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - UINT32 value = 0; - - /* HqaRxStat.DriverRxCount = OS_NTOHL(ATECtrl->RxTotalCnt); */ - /* HqaRxStat.RCPI0 = OS_NTOHL(ATECtrl->RCPI0); */ - /* HqaRxStat.RCPI1 = OS_NTOHL(ATECtrl->RCPI1); */ - /* HqaRxStat.FreqOffsetFromRX = OS_NTOHL(ATECtrl->FreqOffsetFromRx); */ - value |= (0x000000ff & ATECtrl->LastRssi1); - value = value << 8; - value |= (0x000000ff & ATECtrl->MaxRssi1); - value = value << 8; - value |= (0x000000ff & ATECtrl->MinRssi1); - value = value << 8; - value |= (0x000000ff & ATECtrl->AvgRssi1); - memcpy(¶m->data, &value, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, value:0x%x, last:0x%x,max:0x%x, min:0x%x, avg:0x%x\n", - __func__, value, ATECtrl->LastRssi1, ATECtrl->MaxRssi1, - ATECtrl->MinRssi1, ATECtrl->AvgRssi1)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*param), ret); - return ret; -} - -static INT32 wifi_test_pwr_cfg_tx1(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - UINT32 value = 0; - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, sizeof(val)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val:0x%x\n", __func__, val)); - pAd->ATECtrl.TxPower1 = val; - /* TODO Add in the setting of another Tx Power, txpwr1*/ - ret = ATEOp->SetTxPower0(pAd, val, 0); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return value; -} - -static INT32 wifi_test_tx_path_sel(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Val: %x\n", __func__, val)); - ret = ATEOp->SetTxAntenna(pAd, (CHAR)val); - return ret; -} - -static INT32 wifi_test_rx_path_sel(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Val: %x\n", __func__, val)); - ret = ATEOp->SetRxAntenna(pAd, (CHAR)val); - return ret; -} - -static META_CMD_HANDLER WIFI_TEST_CMD_SET2[] = { - wifi_test_get_tx_cnt, /* 32 */ - wifi_test_get_tx_ok_cnt, - wifi_test_rx_ok_cnt, - wifi_test_rx_err_cnt, - wifi_test_get_result_len, /* For next 6 command */ - wifi_test_get_trx_iq_cal, - wifi_test_get_tssi_cal, - wifi_test_get_dpd_cal, - wifi_test_rxv_dump, - wifi_test_get_rx_stat, - wifi_test_get_rpi_ipi, - wifi_test_get_tmp_sensor, - wifi_test_get_vlt_sensor, - wifi_test_read_efuse, - wifi_test_get_rx_rssi, - wifi_test_get_fw_info, - wifi_test_get_dri_info, - wifi_test_get_pwr_detector, - wifi_test_get_phy_rssi, /* 50 */ - wifi_test_pwr_cfg_tx1, - wifi_test_tx_path_sel, - wifi_test_rx_path_sel, - wifi_test_get_rx_rssi1, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -static INT32 wifi_test_set_dpd(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_cw_mode(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, val: %d, Ant: 0x%x\n", __func__, val, - ATECtrl->TxAntennaSel)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_jp_ch_flt_en(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_write_efuse(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - UINT32 offset = 0; - - FUNC_IDX_GET_SUBFIELD(param->idx, offset); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_ra(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_ta(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_rx_match_rule(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_ch_bw(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - - switch (val) { - case 0: - ATECtrl->BW = BW_20; - break; - - case 1: - ATECtrl->BW = BW_40; - break; - - case 2: - ATECtrl->BW = BW_80; - break; - - case 3: - default: - /* Not support yet */ - return -1; - } - - ATECtrl->ControlChl = ATECtrl->Channel; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Channel = %d, ContrlChl: 0x%x, BW = %d\n", __func__, - ATECtrl->Channel, ATECtrl->ControlChl, ATECtrl->BW)); - ret = ATEOp->SetBW(pAd, ATECtrl->BW); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_data_bw(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - /* struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val:0x%x\n", __func__, val)); - - switch (val) { - case 0: - /* ATECtrl->PerPktBW = BW_20; */ - break; - - case 1: - /* ATECtrl->PerPktBW = BW_40; */ - break; - - case 2: - /* ATECtrl->PerPktBW = BW_80; */ - break; - - case 3: - default: - /* Not support yet */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, Invalid Paramter(%x)\n", __func__, val)); - ret = -1; - break; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Channel = %d, BW = %d\n", __func__, ATECtrl->Channel, - ATECtrl->BW)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_primary(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - /* struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - ATECtrl->ControlChl = val; - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_encode_mode(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - INT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy((PUCHAR)&val, ¶m->data, 4); - /* ATECtrl->Ldpc = val; */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_jmode(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _PARAM_MTK_WIFI_TEST *param = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = NDIS_STATUS_FAILURE; - INT32 val = 0; - INT32 mode = 8; - INT32 pwr1 = 0xf; - INT32 pwr2 = 0; - CHAR txpwr = 0; - - memcpy((PUCHAR)&val, ¶m->data, 4); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, val: %d, Ant: 0x%x\n", __func__, val, - ATECtrl->TxAntennaSel)); - - /* TxAntennaSel, 0: All 1:TX0 2:TX1 */ - /* val, 0: disable, 1.5M single tone, 2.10M single tone */ - switch (val) { - case 1: - if (ATECtrl->TxAntennaSel == 1) { - mode = WF0_TX_ONE_TONE_5M; - txpwr = ATECtrl->TxPower0; - } else if (ATECtrl->TxAntennaSel == 2) { - mode = WF1_TX_ONE_TONE_5M; - txpwr = ATECtrl->TxPower1; - } else - goto meta_jmode_done; - - ret = ATEOp->StartTxTone(pAd, mode); - break; - - case 2: - if (ATECtrl->TxAntennaSel == 1) { - mode = WF0_TX_ONE_TONE_10M; - txpwr = ATECtrl->TxPower0; - } else if (ATECtrl->TxAntennaSel == 2) { - mode = WF1_TX_ONE_TONE_10M; - txpwr = ATECtrl->TxPower1; - } else - goto meta_jmode_done; - - ret = ATEOp->StartTxTone(pAd, mode); - break; - - default: - ret = ATEOp->StopTxTone(pAd); - goto meta_jmode_done; - } - - if (txpwr > 30) - pwr2 = (txpwr - 30) << 1; - else { - pwr1 = (txpwr & 0x1e) >> 1; - pwr2 = (txpwr & 0x01) << 1; - } - - ret = ATEOp->SetTxTonePower(pAd, pwr1, pwr2); -meta_jmode_done: - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_inter_cap_cont(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_inter_cap_trig(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_inter_cap_size(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - /* INT32 val = 0; */ - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static INT32 wifi_test_set_inter_cap_trig_offset(INT32 ioctl_cmd, - PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static META_CMD_HANDLER WIFI_TEST_CMD_SET3[] = { - wifi_test_set_dpd, /* 64 */ - wifi_test_set_cw_mode, - wifi_test_jp_ch_flt_en, - wifi_test_write_efuse, - wifi_test_set_ra, - wifi_test_set_ta, - wifi_test_set_rx_match_rule, - wifi_test_set_ch_bw, - wifi_test_set_data_bw, - wifi_test_set_primary, - wifi_test_set_encode_mode, - wifi_test_set_jmode, - wifi_test_set_inter_cap_cont, - wifi_test_set_inter_cap_trig, - wifi_test_set_inter_cap_size, - wifi_test_set_inter_cap_trig_offset, /* 84 */ - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, /* 95 */ -}; - -static INT32 wifi_test_set_mod_patch(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - /* struct _PARAM_MTK_WIFI_TEST* param = (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; */ - /* struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); */ - INT32 ret = NDIS_STATUS_SUCCESS; - - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, ret); - return ret; -} - -static META_CMD_HANDLER WIFI_TEST_CMD_SET5[] = { - wifi_test_set_mod_patch, /* 128 */ - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/* - * Command Set for OID_CUSTOM_MTK_WIFI_TEST - */ -static META_CMD_HANDLER *WIFI_TEST_CMD_SETS[] = { - WIFI_TEST_CMD_SET1, /* 0~31 */ - WIFI_TEST_CMD_SET2, /* 32~63 */ - WIFI_TEST_CMD_SET3, /* 64~95 */ - NULL, /* 96~127 */ - WIFI_TEST_CMD_SET5, /* 128~149 */ -}; -/* - * Buffer Length: 4 - * Return value: Chip Number, ex:0x00006620 - */ -static INT32 oid_if_version(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _META_CMD_HDR *cmd = cmd_hdr; - INT32 status = NDIS_STATUS_SUCCESS; - UINT32 value = 0x00006620; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: oid = 0x%04x, len:0x%x!\n", __func__, cmd_hdr->oid, - cmd_hdr->len_in)); - memcpy(&cmd->data, &value, 4); - status = resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 4, status); - return status; -} - -/* - * Both SET/QUERY, using struct _PARAM_CUSTOM_MCR_RW for payload - */ -static INT32 oid_mcr_rw(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - PARAM_CUSTOM_MCR_RW *cmd = (PARAM_CUSTOM_MCR_RW *)cmd_hdr->data; - INT32 status = NDIS_STATUS_SUCCESS; - UINT32 value = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MCR Access Offset = 0x%x\n", __func__, cmd->offset)); - - /* Check if access F/W Domain MCR (due to WiFiSYS is placed from 0x6000-0000*/ - if (ioctl_cmd == MTPRIV_IOCTL_META_SET) { - if (cmd->offset & 0xFFFF0000) { - RTMP_IO_WRITE32(pAd, cmd->offset, cmd->data); - RTMP_IO_READ32(pAd, cmd->offset, &value); - } else { - } - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MCR Set Offset 0x%x, write in data: 0x%x, read after write: 0x%x\n", - __func__, cmd->offset, cmd->data, value)); - } else if (ioctl_cmd == MTPRIV_IOCTL_META_QUERY) { - if (cmd->offset & 0xFFFF0000) - RTMP_IO_READ32(pAd, cmd->offset, &value); - else { - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MCR Query Offset = 0x%02x, Val: 0x%x\n", - __func__, cmd->offset, value)); - } else { - status = NDIS_STATUS_INVALID_DATA; - goto _mcr_rw_err; - } - - memcpy(&cmd->data, &value, 4); -_mcr_rw_err: - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*cmd), status); - return status; -} - -/* - * Both SET/QUERY, using struct _PARAM_CUSTOM_EEPROM_RW for payload - */ -static INT32 oid_eeprom_rw(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - PARAM_CUSTOM_EEPROM_RW *cmd = (PARAM_CUSTOM_EEPROM_RW *)cmd_hdr->data; - INT32 status = NDIS_STATUS_SUCCESS; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n%s: EEPROM Write Data = 0x%02x !\n", __func__, cmd->data)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*cmd), status); - return status; -} - -/* - * QUERY, using struct _PARAM_CUSTOM_EFUSE_RW for payload - */ -static INT32 oid_efuse_rw(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - PARAM_CUSTOM_EFUSE_RW *cmd = (PARAM_CUSTOM_EFUSE_RW *)cmd_hdr->data; - INT32 status = NDIS_STATUS_SUCCESS; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n%s: EFUSE Write Data = 0x%02x !\n", __func__, cmd->data)); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*cmd), status); - return status; -} - -/* - * Like ATEStart (?) - */ -static INT32 oid_test_mode(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - INT32 status = NDIS_STATUS_SUCCESS; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: oid = 0x%04x, len:0x%x\n", __func__, cmd_hdr->oid, - cmd_hdr->len_in)); - ATECtrl->bQAEnabled = TRUE; - /* Prepare feedback as soon as we can to avoid QA timeout. */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, status); - /* Initialization */ - g_SUB_TEST_STATE = WIFI_SUB_TEST_STANDBY; - ATECtrl->Channel = 1; - ATECtrl->ControlChl = 1; - status = ATEOp->ATEStart(pAd); - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, status); - return status; -} - -/* - * Like ATEStop (?) - */ -static INT32 oid_abort_test_mode(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - INT32 status = NDIS_STATUS_SUCCESS; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: oid = 0x%04x, len:0x%x!\n", __func__, cmd_hdr->oid, - cmd_hdr->len_in)); - ATECtrl->bQAEnabled = FALSE; - /* Prepare feedback as soon as we can to avoid QA timeout. */ - resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 0, status); - status = ATEOp->ATEStop(pAd); - return status; -} - -/* - * Bunch of further commands - */ -static INT32 oid_mt_wifi_test(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - INT32 status = NDIS_STATUS_SUCCESS; - struct _PARAM_MTK_WIFI_TEST *cmd = - (struct _PARAM_MTK_WIFI_TEST *)cmd_hdr->data; - INT32 idx = 0; - INT32 set_idx = 0; - INT32 handle_idx = 0; - - FUNC_IDX_GET_IDX(cmd->idx, idx); - set_idx = ((idx & ~MT_META_WIFI_TEST_CMD_MASK) >> 5) & - MT_META_WIFI_TEST_SET_MASK; - handle_idx = idx & MT_META_WIFI_TEST_CMD_MASK; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: cmd->idx:0x%x ,set_idx:0x%04x, handle_idx:0x%04x\n", - __func__, cmd->idx, set_idx, handle_idx)); - - if (!WIFI_TEST_CMD_SETS[set_idx]) - goto err_handle; - - if (!(*WIFI_TEST_CMD_SETS[set_idx][handle_idx])) - goto err_handle; - - (*WIFI_TEST_CMD_SETS[set_idx][handle_idx])(ioctl_cmd, pAd, WRQ, - cmd_hdr); - return status; -err_handle: - return NDIS_STATUS_INVALID_DATA; -} - -static INT32 oid_cfg_src_type(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _META_CMD_HDR *cmd = cmd_hdr; - INT32 status = NDIS_STATUS_SUCCESS; - UINT32 value = 1; /* 1 For NVRAM */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:0x%x!\n", __func__, cmd->len_in)); - memcpy(&cmd->data, &value, 4); - status = resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 4, status); - return status; -} - -static INT32 oid_eeprom_type(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - struct _META_CMD_HDR *cmd = cmd_hdr; - INT32 status = NDIS_STATUS_SUCCESS; - UINT32 value = 0; /* 0 For EEPROM Not Present */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:0x%x!\n", __func__, cmd_hdr->len_in)); - memcpy(&cmd->data, &value, 4); - status = resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, 4, status); - return status; -} - -static INT32 oid_nvram_rw(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _META_CMD_HDR *cmd_hdr) -{ - PARAM_CUSTOM_NVRAM_RW *cmd = (PARAM_CUSTOM_NVRAM_RW *)cmd_hdr->data; - INT32 status = NDIS_STATUS_SUCCESS; - UINT16 value = 0; - UINT8 idx = cmd->idx << 1; - - if (ioctl_cmd == MTPRIV_IOCTL_META_SET) { - memcpy((PUCHAR)&value, &cmd->data, 4); - pAd->EEPROMImage[idx] = (0xff00 & value) >> 8; - pAd->EEPROMImage[idx + 1] = (0x00ff & value); - rtmp_ee_write_to_bin(pAd); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s-SET, method:0x%x ,offset:0x%x, valu:0x%x, EEPROMImage:0x%x\n", - __func__, cmd->method, idx, value, - pAd->EEPROMImage[idx])); - } else if (ioctl_cmd == MTPRIV_IOCTL_META_QUERY) { - if (cmd->method == PARAM_EEPROM_READ_METHOD_READ) { - value |= pAd->EEPROMImage[idx]; - value <<= 8; - value |= pAd->EEPROMImage[idx + 1]; - } else if (cmd->method == PARAM_EEPROM_READ_METHOD_GETSIZE) - value = EEPROM_SIZE; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s-QUREY, method:0x%x ,offset:0x%x, valu:0x%x\n", - __func__, cmd->method, idx, value)); - } else { - } - - memcpy(&cmd->data, &value, 4); - status = resp_to_meta(ioctl_cmd, cmd_hdr, WRQ, sizeof(*cmd), status); - return status; -} - -/* - * Handler for Each OID - */ -static META_CMD_HANDLER OID_HANDLE[] = { - oid_if_version, oid_mcr_rw, oid_eeprom_rw, - oid_efuse_rw, oid_test_mode, oid_abort_test_mode, - oid_mt_wifi_test, oid_cfg_src_type, oid_eeprom_type, - oid_nvram_rw, -}; - -INT32 do_meta_cmd(INT32 ioctl_cmd, PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, RTMP_STRING *wrq_name) -{ - INT32 Status = NDIS_STATUS_SUCCESS; - struct _META_CMD_HDR *cmd_hdr; - UINT32 oid = 0; - INT32 ret = 0; - - os_alloc_mem_suspend(pAd, (UCHAR **)&cmd_hdr, sizeof(*cmd_hdr)); - - if (!cmd_hdr) { - Status = -ENOMEM; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, cmd_hdr NULL\n", __func__)); - goto ERROR0; - } - - if (!WRQ) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s. wrq is null\n", __func__)); - goto ERROR0; - } - - os_zero_mem(cmd_hdr, sizeof(*cmd_hdr)); - Status = copy_from_user((PUCHAR)cmd_hdr, WRQ->u.data.pointer, - WRQ->u.data.length); -#ifdef _DUMP_HEX_ - { - UCHAR *pSrcBufVA = WRQ->u.data.pointer; - UINT32 SrcBufLen = WRQ->u.data.length; - unsigned char *pt; - INT32 x; - - pt = pSrcBufVA; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: %p, len = %d\n", "META_IOCTL Content", pSrcBufVA, - SrcBufLen)); - - for (x = 0; x < SrcBufLen; x++) { - if (x % 16 == 0) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("0x%04x : ", x)); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%02x ", (unsigned char)pt[x])); - - if (x % 16 == 15) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\n")); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - } -#endif - - if (Status) { - Status = -EFAULT; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, copy_from_user error\n", __func__)); - goto ERROR1; - } - - oid = cmd_hdr->oid; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() ==>,OID:0x%x, len:0x%x\n", __func__, oid, - WRQ->u.data.length)); - - switch (oid) { - case OID_CUSTOM_IF_VER: - ret = (*OID_HANDLE[0])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_MCR_RW: - ret = (*OID_HANDLE[1])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_EEPROM_RW: - ret = (*OID_HANDLE[2])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_EFUSE_RW: - ret = (*OID_HANDLE[3])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_TEST_MODE: - ret = (*OID_HANDLE[4])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_ABORT_TEST_MODE: - ret = (*OID_HANDLE[5])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_MTK_WIFI_TEST: - ret = (*OID_HANDLE[6])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_CFG_SRC_TYPE: - ret = (*OID_HANDLE[7])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_EEPROM_TYPE: - ret = (*OID_HANDLE[8])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - case OID_CUSTOM_MTK_NVRAM_RW: - ret = (*OID_HANDLE[9])(ioctl_cmd, pAd, WRQ, cmd_hdr); - break; - - default: - Status = NDIS_STATUS_FAILURE; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Unknown oid number of AT command = %x\n", oid)); - goto ERROR1; - } - -ERROR1: - os_free_mem(cmd_hdr); -ERROR0: - return Status; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_ate.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_ate.c deleted file mode 100644 index 8771335e6d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_ate.c +++ /dev/null @@ -1,1499 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_ate.c -*/ -#include "rt_config.h" -static VOID MtATEWTBL2Update(RTMP_ADAPTER *pAd, UCHAR wcid) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - union WTBL_2_DW9 wtbl_2_d9 = { .word = 0 }; - UINT32 rate[8]; /* reg_val; */ - UCHAR stbc, bw, nss, preamble; /* , wait_cnt = 0; */ - - bw = 2; - wtbl_2_d9.field.fcap = bw; - wtbl_2_d9.field.ccbw_sel = bw; - wtbl_2_d9.field.cbrn = - 7; /* change bw as (fcap/2) if rate_idx > 7, temporary code */ - - if (ATECtrl->Sgi) { - wtbl_2_d9.field.g2 = 1; - wtbl_2_d9.field.g4 = 1; - wtbl_2_d9.field.g8 = 1; - wtbl_2_d9.field.g16 = 1; - } else { - wtbl_2_d9.field.g2 = 0; - wtbl_2_d9.field.g4 = 0; - wtbl_2_d9.field.g8 = 0; - wtbl_2_d9.field.g16 = 0; - } - - wtbl_2_d9.field.rate_idx = 0; - - if (ATECtrl->PhyMode == MODE_CCK) - preamble = SHORT_PREAMBLE; - else - preamble = LONG_PREAMBLE; - - stbc = ATECtrl->Stbc; - nss = 1; - rate[0] = tx_rate_to_tmi_rate(ATECtrl->PhyMode, ATECtrl->Mcs, nss, stbc, - preamble); - rate[0] &= 0xfff; - rate[1] = rate[2] = rate[3] = rate[4] = rate[5] = rate[6] = rate[7] = - rate[0]; - /* Wtbl2RateTableUpdate(pAd, wcid, wtbl_2_d9.word, rate); */ -} -static INT32 MT_ATERestoreInit(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Rx receive for 10000us workaround\n", __func__)); - /* Workaround CR Restore */ - /* Tx/Rx Antenna Setting Restore */ - MtAsicSetRxPath(pAd, 0); - /* TxRx switch workaround */ - AsicSetMacTxRx(pAd, ASIC_MAC_RX, TRUE); - RtmpusecDelay(10000); - AsicSetMacTxRx(pAd, ASIC_MAC_RX, FALSE); - /* Flag Resotre */ - ATECtrl->did_tx = 0; - ATECtrl->did_rx = 0; - - return Ret; -} - -static INT32 MT_ATESetTxPower0(RTMP_ADAPTER *pAd, CHAR Value) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->TxPower0 = Value; - ATECtrl->TxPower1 = - Value; /* pAd->EEPROMImage[TX1_G_BAND_TARGET_PWR]; */ - CmdSetTxPowerCtrl(pAd, ATECtrl->Channel); - return Ret; -} - -static INT32 MT_ATESetTxPower1(RTMP_ADAPTER *pAd, CHAR Value) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - - ATECtrl->TxPower1 = Value; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - /* Same as Power0 */ - if (ATECtrl->TxPower0 != ATECtrl->TxPower1) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: power1 do not same as power0\n", __func__)); - Ret = -1; - } - - return Ret; -} - -static INT32 MT_ATEStart(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - BOOLEAN bCalFree = 0; -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; -#endif - INT32 i; - - i = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* Stop send TX packets */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); - /* Reset ATE TX/RX Counter */ - ATECtrl->TxDoneCount = 0; - ATECtrl->RxTotalCnt = 0; - ATECtrl->TxLength = 1024; - ATECtrl->LastRssi0 = 0; - ATECtrl->AvgRssi0X8 = 0; - ATECtrl->AvgRssi0 = 0; - ATECtrl->MaxRssi0 = 0xff; - ATECtrl->MinRssi0 = 0; - ATECtrl->LastRssi1 = 0; - ATECtrl->AvgRssi1X8 = 0; - ATECtrl->AvgRssi1 = 0; - ATECtrl->MaxRssi1 = 0xff; - ATECtrl->MinRssi1 = 0; - ATECtrl->LastRssi2 = 0; - ATECtrl->AvgRssi2X8 = 0; - ATECtrl->AvgRssi2 = 0; - ATECtrl->MaxRssi2 = 0xff; - ATECtrl->MinRssi2 = 0; - ATECtrl->QID = QID_AC_BE; - ATECtrl->tx_coherent = 0; - ATECtrl->cmd_expire = RTMPMsecsToJiffies(3000); - RTMP_OS_INIT_COMPLETION(&ATECtrl->cmd_done); - ATECtrl->TxPower0 = pAd->EEPROMImage[TX0_G_BAND_TARGET_PWR]; - ATECtrl->TxPower1 = pAd->EEPROMImage[TX1_G_BAND_TARGET_PWR]; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Init Txpower, Tx0:%x, Tx1:%x\n", __func__, - ATECtrl->TxPower0, ATECtrl->TxPower1)); -#ifdef CONFIG_QA - MtAsicGetRxStat(pAd, HQA_RX_RESET_PHY_COUNT); - ATECtrl->RxMacMdrdyCount = 0; - ATECtrl->RxMacFCSErrCount = 0; -#endif /* CONFIG_QA */ -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_STOP_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - AsicSetMacTxRx(pAd, ASIC_MAC_RX, FALSE); - /* Disable TX PDMA */ - AsicSetWPDMA(pAd, PDMA_TX, 0); -#ifdef CONFIG_AP_SUPPORT - APStop(pAd, pMbss, AP_BSS_OPER_ALL); -#endif /* CONFIG_AP_SUPPORT */ -#ifdef RTMP_MAC_PCI - if_ops->init(pAd); - if_ops->clean_trx_q(pAd); -#endif /* RTMP_MAC_PCI */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 1); - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); - - /* MT7636 Test Mode Freqency offset restore*/ - if (ATECtrl->en_man_set_freq == 1) { - if (IS_MT76x6(pAd) || IS_MT7637(pAd)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Manual Set Frequency Restore\n")); - RTMP_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_ENABLE, - ATECtrl->en_man_freq_restore); - RTMP_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_VALUE, - ATECtrl->normal_freq_restore); - } - - ATECtrl->normal_freq_restore = 0; - ATECtrl->en_man_freq_restore = 0; - ATECtrl->en_man_set_freq = 0; - } - - if (ATECtrl->Mode & fATE_TXCONT_ENABLE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s ,Stop Continuous Tx\n", __func__)); - ATEOp->StopContinousTx(pAd); - } - - if (ATECtrl->Mode & fATE_TXCARRSUPP_ENABLE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s ,Stop Carrier Suppression Test\n", __func__)); - ATEOp->StopTxTone(pAd); - } - - ATECtrl->Mode = ATE_START; - ATECtrl->Mode &= ATE_RXSTOP; - ATECtrl->en_man_set_freq = 0; - ATECtrl->normal_freq_restore = 0; - ATECtrl->en_man_freq_restore = 0; - ATECtrl->TxDoneCount = 0; - ATECtrl->RxTotalCnt = 0; -#ifdef CONFIG_QA - MtAsicGetRxStat(pAd, HQA_RX_RESET_PHY_COUNT); - MtAsicGetRxStat(pAd, HQA_RX_RESET_MAC_COUNT); - ATECtrl->RxMacFCSErrCount = 0; - ATECtrl->RxMacMdrdyCount = 0; -#endif - MtATEWTBL2Update(pAd, 0); - return Ret; -} - -static INT32 MT_ATEStop(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0; -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; -#endif - UCHAR Channel = HcGetRadioChannel(pAd); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - AsicSetMacTxRx(pAd, ASIC_MAC_RXV, FALSE); - NICInitializeAdapter(pAd); -#ifdef RTMP_MAC_PCI - - if (if_ops->clean_test_rx_frame) - if_ops->clean_test_rx_frame(pAd); - -#endif /* RTMP_MAC_PCI */ - /* if usb call this two function , FW will hang~~ */ - - if (if_ops->clean_trx_q) - if_ops->clean_trx_q(pAd); - - if (if_ops->ate_leave) - if_ops->ate_leave(pAd); - - AsicSetRxFilter(pAd); - RTMPEnableRxTx(pAd); - hc_reset_radio(pAd); -#ifdef CONFIG_AP_SUPPORT - APStartUp(pAd, pMbss, AP_BSS_OPER_ALL); -#endif /* CONFIG_AP_SUPPROT */ - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_START_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - - /* MT7636 Test Mode Freqency offset restore*/ - if (ATECtrl->en_man_set_freq == 1) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Manual Set Frequency Restore\n")); - RTMP_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_ENABLE, - ATECtrl->en_man_freq_restore); - RTMP_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_VALUE, - ATECtrl->normal_freq_restore); - ATECtrl->normal_freq_restore = 0; - ATECtrl->en_man_freq_restore = 0; - ATECtrl->en_man_set_freq = 0; - } - - RTMP_OS_EXIT_COMPLETION(&ATECtrl->cmd_done); - ATECtrl->Mode = ATE_STOP; - - if ((MTK_REV_GTE(pAd, MT7603, MT7603E1)) || - (MTK_REV_GTE(pAd, MT7628, MT7628E1))) { - UINT32 Value; - - RTMP_IO_READ32(pAd, CR_RFINTF_00, &Value); - Value &= ~CR_RFINTF_CAL_NSS_MASK; - Value |= CR_RFINTF_CAL_NSS(0x0); - RTMP_IO_WRITE32(pAd, CR_RFINTF_00, Value); - } - - return Ret; -} - -#ifdef RTMP_PCI_SUPPORT -static INT32 MT_ATESetupFrame(RTMP_ADAPTER *pAd, UINT32 TxIdx) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - RTMP_TX_RING *pTxRing = &pAd->PciHif.TxRing[QID_AC_BE]; - PUCHAR pDMAHeaderBufVA = (PUCHAR)pTxRing->Cell[TxIdx].DmaBuf.AllocVa; - TXD_STRUC *pTxD; - MAC_TX_INFO Info; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 TXWISize = cap->TXWISize; - PNDIS_PACKET pPacket = NULL; - HTTRANSMIT_SETTING Transmit; - TX_BLK TxBlk; - INT32 Ret = 0; -#ifdef RT_BIG_ENDIAN - TXD_STRUC *pDestTxD; - UCHAR TxHwInfo[TXD_SIZE]; -#endif /* RT_BIG_ENDIAN */ - - ATECtrl->HLen = LENGTH_802_11; - NdisZeroMemory(&Transmit, sizeof(Transmit)); - NdisZeroMemory(&TxBlk, sizeof(TxBlk)); - /* Fill Mac Tx info */ - NdisZeroMemory(&Info, sizeof(Info)); - /* LMAC queue index (AC0) */ - Info.q_idx = 0; - Info.WCID = 0; - Info.hdr_len = ATECtrl->HLen; - Info.hdr_pad = 0; - Info.BM = IS_BM_MAC_ADDR(ATECtrl->Addr1); - /* no ack */ - Info.Ack = 0; - Info.bss_idx = 0; - /* no frag */ - Info.FRAG = 0; - /* no protection */ - Info.prot = 0; - Info.Length = ATECtrl->TxLength; - /* TX Path setting */ - Info.AntPri = 0; - Info.SpeEn = 0; - - switch (ATECtrl->TxAntennaSel) { - case 0: /* Both */ - Info.AntPri = 0; - Info.SpeEn = 1; - break; - - case 1: /* TX0 */ - Info.AntPri = 0; - Info.SpeEn = 0; - break; - - case 2: /* TX1 */ - Info.AntPri = 2; /* b'010 */ - Info.SpeEn = 0; - break; - } - - /* Fill Transmit setting */ - Transmit.field.MCS = ATECtrl->Mcs; - Transmit.field.BW = ATECtrl->BW; - Transmit.field.ShortGI = ATECtrl->Sgi; - Transmit.field.STBC = ATECtrl->Stbc; - Transmit.field.MODE = ATECtrl->PhyMode; - - if (ATECtrl->PhyMode == MODE_CCK) { - Info.Preamble = LONG_PREAMBLE; - - if (ATECtrl->Mcs == 9) { - Transmit.field.MCS = 0; - Info.Preamble = SHORT_PREAMBLE; - } else if (ATECtrl->Mcs == 10) { - Transmit.field.MCS = 1; - Info.Preamble = SHORT_PREAMBLE; - } else if (ATECtrl->Mcs == 11) { - Transmit.field.MCS = 2; - Info.Preamble = SHORT_PREAMBLE; - } - } - - Info.IsAutoRate = FALSE; - pAd->archOps.write_tmac_info_fixed_rate(pAd, pDMAHeaderBufVA, &Info, - &Transmit); - NdisMoveMemory(pDMAHeaderBufVA + TXWISize, ATECtrl->TemplateFrame, - ATECtrl->HLen); - NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 4, ATECtrl->Addr1, - MAC_ADDR_LEN); - NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 10, ATECtrl->Addr2, - MAC_ADDR_LEN); - NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 16, ATECtrl->Addr3, - MAC_ADDR_LEN); -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (((PUCHAR)pDMAHeaderBufVA) + TXWISize), - DIR_READ, FALSE); -#endif /* RT_BIG_ENDIAN */ - pPacket = ATEPayloadInit(pAd, TxIdx); - - if (pPacket == NULL) { - ATECtrl->TxCount = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: fail to init frame payload.\n", __func__)); - return -1; - } - - pTxRing->Cell[TxIdx].pNdisPacket = pPacket; - pTxD = (TXD_STRUC *)pTxRing->Cell[TxIdx].AllocVa; -#ifndef RT_BIG_ENDIAN - pTxD = (TXD_STRUC *)pTxRing->Cell[TxIdx].AllocVa; -#else - pDestTxD = (TXD_STRUC *)pTxRing->Cell[TxIdx].AllocVa; - NdisMoveMemory(&TxHwInfo[0], (UCHAR *)pDestTxD, TXD_SIZE); - pTxD = (TXD_STRUC *)&TxHwInfo[0]; -#endif - TxBlk.SrcBufLen = GET_OS_PKT_LEN(ATECtrl->pAtePacket[TxIdx]); - TxBlk.pSrcBufData = (PUCHAR)ATECtrl->AteAllocVa[TxIdx]; - NdisZeroMemory(pTxD, TXD_SIZE); - /* build Tx descriptor */ - pTxD->SDPtr0 = - RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa); - pTxD->SDLen0 = TXWISize + ATECtrl->HLen; - pTxD->LastSec0 = 0; - pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, &TxBlk, 0, 1, RTMP_PCI_DMA_TODEVICE); - pTxD->SDLen1 = GET_OS_PKT_LEN(ATECtrl->pAtePacket[TxIdx]); - pTxD->LastSec1 = 1; - pTxD->DMADONE = 0; -#ifdef RT_BIG_ENDIAN - MTMacInfoEndianChange(pAd, pDMAHeaderBufVA, TYPE_TMACINFO, - sizeof(TMAC_TXD_L)); - RTMPFrameEndianChange(pAd, (((PUCHAR)pDMAHeaderBufVA) + TXWISize), - DIR_WRITE, FALSE); - RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); - WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); -#endif - return Ret; -} -#endif - -static INT32 MT_ATEStartTx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - UINT32 Value = 0; - INT32 Ret = 0; -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; -#endif - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - /* TxRx switch workaround */ - if (ATECtrl->did_rx == 1) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: DID Rx Before\n", __func__)); - MT_ATERestoreInit(pAd); - } - - MtCmdChannelSwitch(pAd, ATECtrl->ControlChl, ATECtrl->Channel, - ATECtrl->BW, pAd->Antenna.field.TxPath, - pAd->Antenna.field.RxPath, FALSE); - AsicSetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE); - /* Stop send TX packets */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_STOP_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - /* Disable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX, 0); - /* Polling TX/RX path until packets empty */ - - if (if_ops->clean_trx_q) - if_ops->clean_trx_q(pAd); - - /* Turn on RX again if set before */ - if (ATECtrl->Mode & ATE_RXFRAME) - AsicSetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE); - - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_START_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - - if (if_ops->setup_frame) - if_ops->setup_frame(pAd, QID_AC_BE); - - if (if_ops->test_frame_tx) { - if_ops->test_frame_tx(pAd); - - if (ATECtrl->TxCount != 0xFFFFFFFF) - ATECtrl->TxCount += ATECtrl->TxDoneCount; - - ATECtrl->Mode |= ATE_TXFRAME; - } else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: no tx test frame callback function\n", - __func__)); - - /* Low temperature high rate EVM degrade Patch v2 */ - if ((MTK_REV_GTE(pAd, MT7603, MT7603E1)) || - (MTK_REV_GTE(pAd, MT7628, MT7628E1))) { - if (ATECtrl->TxAntennaSel == 0) { - RTMP_IO_READ32(pAd, CR_RFINTF_00, &Value); - Value &= ~CR_RFINTF_CAL_NSS_MASK; - Value |= CR_RFINTF_CAL_NSS(0x0); - RTMP_IO_WRITE32(pAd, CR_RFINTF_00, Value); - } else if (ATECtrl->TxAntennaSel == 1) { - RTMP_IO_READ32(pAd, CR_RFINTF_00, &Value); - Value &= ~CR_RFINTF_CAL_NSS_MASK; - Value |= CR_RFINTF_CAL_NSS(0x0); - RTMP_IO_WRITE32(pAd, CR_RFINTF_00, Value); - } else if (ATECtrl->TxAntennaSel == 2) { - RTMP_IO_READ32(pAd, CR_RFINTF_00, &Value); - Value &= ~CR_RFINTF_CAL_NSS_MASK; - Value |= CR_RFINTF_CAL_NSS(0x1); - RTMP_IO_WRITE32(pAd, CR_RFINTF_00, Value); - } - } - - ATECtrl->did_tx = 1; - return Ret; -} - -static INT32 MT_ATEStartRx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0, Value; - UINT32 reg; -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; -#endif - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - RTMP_IO_READ32(pAd, ARB_SCR, ®); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ARB_SCR:%x\n", __func__, reg)); - reg &= ~MT_ARB_SCR_RXDIS; - RTMP_IO_WRITE32(pAd, ARB_SCR, reg); - AsicSetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE); - /* Stop send TX packets */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_STOP_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - AsicSetWPDMA(pAd, PDMA_TX, 0); - - if (if_ops->clean_trx_q) - if_ops->clean_trx_q(pAd); - - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_START_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - - /* Turn on TX again if set before */ - if (ATECtrl->Mode & ATE_TXFRAME) - AsicSetMacTxRx(pAd, ASIC_MAC_TX, TRUE); - - /* reset counter when iwpriv only */ - if (ATECtrl->bQAEnabled != TRUE) - ATECtrl->RxTotalCnt = 0; - - pAd->WlanCounters[0].FCSErrorCount.u.LowPart = 0; - RTMP_IO_READ32(pAd, RMAC_RFCR, &Value); - Value |= RM_FRAME_REPORT_EN; - RTMP_IO_WRITE32(pAd, RMAC_RFCR, Value); - AsicSetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE); - /* Enable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 1); - ATECtrl->Mode |= ATE_RXFRAME; - ATECtrl->did_rx = 1; - return Ret; -} - -static INT32 MT_ATEStopTx(RTMP_ADAPTER *pAd, UINT32 Mode) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if ((Mode & ATE_TXFRAME) || (Mode == ATE_STOP)) { - /* Disable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 0); - - if (if_ops->clean_trx_q) - if_ops->clean_trx_q(pAd); - - ATECtrl->Mode &= ~ATE_TXFRAME; - /* Enable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 1); - } - - return Ret; -} - -static INT32 MT_ATEStopRx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - INT32 i; - UINT32 reg; - - i = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Ret = AsicSetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE); - RTMP_IO_READ32(pAd, ARB_SCR, ®); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ARB_SCR:%x\n", __func__, reg)); - reg |= MT_ARB_SCR_RXDIS; - RTMP_IO_WRITE32(pAd, ARB_SCR, reg); - ATECtrl->Mode &= ~ATE_RXFRAME; - return Ret; -} - -static INT32 MT_ATESetTxAntenna(RTMP_ADAPTER *pAd, CHAR Ant) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UINT32 Value; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* 0: All 1:TX0 2:TX1 */ - ATECtrl->TxAntennaSel = Ant; - - if ((MTK_REV_GTE(pAd, MT7603, MT7603E1)) || - (MTK_REV_GTE(pAd, MT7628, MT7628E1))) { - UCHAR ePA; -#ifdef RTMP_EFUSE_SUPPORT - - if (pAd->E2pAccessMode == E2P_NONE) { - UINT16 v_efuse = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: E2P_NONE\n", __func__)); - rtmp_ee_efuse_read16(pAd, 0x35, &v_efuse); - - if (v_efuse == 0) - ePA = pAd->EEPROMImage[0x35]; - else - ePA = (v_efuse >> 8) & 0x00FF; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("E2P_NONE, EFUSE Value == 0x%x, ePA:0x%x\n", - v_efuse, ePA)); - } else if (pAd->E2pAccessMode == E2P_EFUSE_MODE) { - UINT16 v_efuse = 0; - - rtmp_ee_efuse_read16(pAd, 0x35, &v_efuse); - ePA = (v_efuse >> 8) & 0x00FF; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("EFUSE_MODE, EFUSE Value == 0x%x, ePA:0x%x\n", - v_efuse, ePA)); - } else -#endif /* RTMP_EFUSE_SUPPORT */ - { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: BIN/FLASH/EEPROM_MODE(0x%x), get value in buffer\n", - __func__, pAd->E2pAccessMode)); - ePA = pAd->EEPROMImage[0x35]; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ePA:0x%x, E2pAccessMode:0x%x\n", __func__, ePA, - pAd->E2pAccessMode)); - - if (ATECtrl->TxAntennaSel == 0) { - RTMP_IO_READ32(pAd, CR_RFINTF_00, &Value); - Value &= ~CR_RFINTF_CAL_NSS_MASK; - Value |= CR_RFINTF_CAL_NSS(0x0); - RTMP_IO_WRITE32(pAd, CR_RFINTF_00, Value); - - /* ePA Tx1 patch, bit[1]: 2.4G ePA Enable, same as Tx0 */ - if (ePA & 0x02) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - UINT32 value; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &RestoreValue); - RemapBase = GET_REMAP_2_BASE(0x81060008) << 19; - RemapOffset = GET_REMAP_2_OFFSET(0x81060008); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - RemapBase); - - if ((MTK_REV_GTE(pAd, MT7603, MT7603E1)) || - (MTK_REV_GTE(pAd, MT7603, MT7603E2))) { - value = 0x04852390; - RTMP_IO_WRITE32(pAd, - 0x80000 + RemapOffset, - value); - } else if (MTK_REV_GTE(pAd, MT7628, MT7628E1)) { - value = 0x00489523; - RTMP_IO_WRITE32(pAd, - 0x80000 + RemapOffset, - value); - } - - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - RestoreValue); - } - } else if (ATECtrl->TxAntennaSel == 1) { - RTMP_IO_READ32(pAd, CR_RFINTF_00, &Value); - Value &= ~CR_RFINTF_CAL_NSS_MASK; - Value |= CR_RFINTF_CAL_NSS(0x0); - RTMP_IO_WRITE32(pAd, CR_RFINTF_00, Value); - - /* ePA Tx1 patch, bit[1]: 2.4G ePA Enable */ - if (ePA & 0x02) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - UINT32 value; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &RestoreValue); - RemapBase = GET_REMAP_2_BASE(0x81060008) << 19; - RemapOffset = GET_REMAP_2_OFFSET(0x81060008); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - RemapBase); - - if ((MTK_REV_GTE(pAd, MT7603, MT7603E1)) || - (MTK_REV_GTE(pAd, MT7603, MT7603E2))) { - value = 0x04852390; - RTMP_IO_WRITE32(pAd, - 0x80000 + RemapOffset, - value); - } else if (MTK_REV_GTE(pAd, MT7628, MT7628E1)) { - value = 0x00489523; - RTMP_IO_WRITE32(pAd, - 0x80000 + RemapOffset, - value); - } - - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - RestoreValue); - } - } else if (ATECtrl->TxAntennaSel == 2) { - RTMP_IO_READ32(pAd, CR_RFINTF_00, &Value); - Value &= ~CR_RFINTF_CAL_NSS_MASK; - Value |= CR_RFINTF_CAL_NSS(0x1); - RTMP_IO_WRITE32(pAd, CR_RFINTF_00, Value); - - /* ePA Tx1 patch, bit[1]: 2.4G ePA Enable */ - if (ePA & 0x02) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - UINT32 value; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &RestoreValue); - RemapBase = GET_REMAP_2_BASE(0x81060008) << 19; - RemapOffset = GET_REMAP_2_OFFSET(0x81060008); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - RemapBase); - - if ((MTK_REV_GTE(pAd, MT7603, MT7603E1)) || - (MTK_REV_GTE(pAd, MT7603, MT7603E2))) { - value = 0x04856790; - RTMP_IO_WRITE32(pAd, - 0x80000 + RemapOffset, - value); - } else if (MTK_REV_GTE(pAd, MT7628, MT7628E1)) { - value = 0x00489567; - RTMP_IO_WRITE32(pAd, - 0x80000 + RemapOffset, - value); - } - - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - RestoreValue); - } - } - } - - return Ret; -} - -static INT32 MT_ATESetRxAntenna(RTMP_ADAPTER *pAd, CHAR Ant) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->RxAntennaSel = Ant; - /* set RX path */ - MtAsicSetRxPath(pAd, (UINT32)ATECtrl->RxAntennaSel, 0); - return Ret; -} - -static INT32 MT_ATESetTxFreqOffset(RTMP_ADAPTER *pAd, UINT32 FreqOffset) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UINT32 reg = 0; - - ATECtrl->RFFreqOffset = FreqOffset; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if (IS_MT76x6(pAd) || IS_MT7637(pAd)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Manual Set Frequency\n")); - RTMP_IO_READ32(pAd, FREQ_OFFSET_MANUAL_ENABLE, ®); - - if (ATECtrl->en_man_freq_restore == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Normal Set Frequency BK\n")); - ATECtrl->en_man_freq_restore = reg; - } - - reg = (reg & 0xFFFF80FF) | (0x7F << 8); - RTMP_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_ENABLE, reg); - ATECtrl->en_man_set_freq = 1; - } - - if (ATECtrl->en_man_set_freq == 1) { - RTMP_IO_READ32(pAd, FREQ_OFFSET_MANUAL_VALUE, ®); - - if (ATECtrl->normal_freq_restore == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Normal Frequency BK\n")); - ATECtrl->normal_freq_restore = reg; - } - - reg = (reg & 0xFFFF80FF) | (ATECtrl->RFFreqOffset << 8); - RTMP_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_VALUE, reg); - } else - MtAsicSetRfFreqOffset(pAd, ATECtrl->RFFreqOffset); - - return Ret; -} - -static INT32 MT_ATESetChannel(RTMP_ADAPTER *pAd, INT16 Value) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MtCmdChannelSwitch(pAd, ATECtrl->ControlChl, ATECtrl->Channel, - ATECtrl->BW, pAd->Antenna.field.TxPath, - pAd->Antenna.field.RxPath, FALSE); - return Ret; -} - -static INT32 MT_ATESetBW(RTMP_ADAPTER *pAd, INT16 Value) -{ - INT32 Ret = 0; - UINT32 val = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - RTMP_IO_READ32(pAd, AGG_BWCR, &val); - val &= (~0x0c); - - switch (Value) { - case BW_20: - val |= (0); - break; - - case BW_40: - val |= (0x1 << 2); - break; - - case BW_80: - val |= (0x2 << 2); - break; - } - - RTMP_IO_WRITE32(pAd, AGG_BWCR, val); - /* TODO: check CMD_CH_PRIV_ACTION_BW_REQ */ - /* CmdChPrivilege(pAd, CMD_CH_PRIV_ACTION_BW_REQ, ATECtrl->ControlChl, ATECtrl->Channel, */ - /* ATECtrl->BW, pAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath); */ - return Ret; -} - -static INT32 MT_ATESampleRssi(RTMP_ADAPTER *pAd, RX_BLK *RxBlk) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - - if (RxBlk->rx_signal.raw_rssi[0] != 0) { - ATECtrl->LastRssi0 = ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&RxBlk->rx_signal.raw_rssi[0]), - RSSI_IDX_0); - - if (ATECtrl->MaxRssi0 < ATECtrl->LastRssi0) - ATECtrl->MaxRssi0 = ATECtrl->LastRssi0; - - if (ATECtrl->MinRssi0 > ATECtrl->LastRssi0) - ATECtrl->MinRssi0 = ATECtrl->LastRssi0; - - ATECtrl->AvgRssi0X8 = - (ATECtrl->AvgRssi0X8 - ATECtrl->AvgRssi0) + - ATECtrl->LastRssi0; - ATECtrl->AvgRssi0 = ATECtrl->AvgRssi0X8 >> 3; - } - - if (RxBlk->rx_signal.raw_rssi[1] != 0) { - ATECtrl->LastRssi1 = ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&RxBlk->rx_signal.raw_rssi[0]), - RSSI_IDX_1); - - if (ATECtrl->MaxRssi1 < ATECtrl->LastRssi1) - ATECtrl->MaxRssi1 = ATECtrl->LastRssi1; - - if (ATECtrl->MinRssi1 > ATECtrl->LastRssi1) - ATECtrl->MinRssi1 = ATECtrl->LastRssi1; - - ATECtrl->AvgRssi1X8 = - (ATECtrl->AvgRssi1X8 - ATECtrl->AvgRssi1) + - ATECtrl->LastRssi1; - ATECtrl->AvgRssi1 = ATECtrl->AvgRssi1X8 >> 3; - } - - ATECtrl->LastSNR0 = RxBlk->rx_signal.raw_snr[0]; - ATECtrl->LastSNR1 = RxBlk->rx_signal.raw_snr[1]; - ATECtrl->NumOfAvgRssiSample++; - return Ret; -} - -static INT32 MT_ATESetAIFS(RTMP_ADAPTER *pAd, CHAR Value) -{ - INT32 Ret = 0; - UINT val = Value & 0x000000ff; - - /* Test mode use AC0 for TX */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Value:%x\n", __func__, val)); - AsicSetWmmParam(pAd, 0, WMM_PARAM_AC_0, WMM_PARAM_AIFSN, val); - return Ret; -} - -static INT32 MT_ATESetTSSI(RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting) -{ - INT32 Ret = 0; - - Ret = MtAsicSetTSSI(pAd, Setting, WFSel); - return Ret; -} - -static INT32 MT_ATESetDPD(RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting) -{ - /* !!TEST MODE ONLY!! Normal Mode control by FW and Never disable */ - /* WF0 = 0, WF1 = 1, WF ALL = 2 */ - INT32 Ret = 0; - - Ret = MtAsicSetDPD(pAd, Setting, WFSel); - return Ret; -} - -static INT32 MT_ATEStartTxTone(RTMP_ADAPTER *pAd, UINT32 Mode) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MtAsicSetTxToneTest(pAd, 1, Mode); - return Ret; -} - -static INT32 MT_ATESetTxTonePower(RTMP_ADAPTER *pAd, INT32 pwr1, INT32 pwr2) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: pwr1:%d, pwr2:%d\n", __func__, pwr1, pwr2)); - MtAsicSetTxTonePower(pAd, pwr1, pwr2); - return Ret; -} - -static INT32 MT_ATEStopTxTone(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MtAsicSetTxToneTest(pAd, 0, 0); - return Ret; -} - -static INT32 MT_ATEStartContinousTx(RTMP_ADAPTER *pAd, CHAR WFSel) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - CmdTxContinous(pAd, ATECtrl->PhyMode, ATECtrl->BW, ATECtrl->ControlChl, - ATECtrl->Mcs, ATECtrl->TxAntennaSel, 1); - return Ret; -} - -static INT32 MT_ATEStopContinousTx(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - - CmdTxContinous(pAd, ATECtrl->PhyMode, ATECtrl->BW, ATECtrl->ControlChl, - ATECtrl->Mcs, ATECtrl->TxAntennaSel, 0); - return Ret; -} - -static INT32 MT_RfRegWrite(RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, - UINT32 Value) -{ - INT32 Ret = 0; - - Ret = MtCmdRFRegAccessWrite(pAd, WFSel, Offset, Value); - return Ret; -} - -static INT32 MT_RfRegRead(RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, - UINT32 *Value) -{ - INT32 Ret = 0; - - Ret = MtCmdRFRegAccessRead(pAd, WFSel, Offset, Value); - return Ret; -} - -static INT32 MT_GetFWInfo(RTMP_ADAPTER *pAd, UCHAR *FWInfo) -{ - struct fwdl_ctrl *ctrl = &pAd->MCUCtrl.fwdl_ctrl; - - memcpy(FWInfo, - ctrl->fw_profile[WM_CPU].source.img_ptr + - ctrl->fw_profile[WM_CPU].source.img_len - 36, - 36); - return 0; -} - -#ifdef TXBF_SUPPORT -/* - *========================================================================== - * Description: - * Set ATE Tx Beamforming mode - * - * Return: - * TRUE if all parameters are OK, FALSE otherwise - *========================================================================== -*/ -INT MT_SetATETxBfProc(RTMP_ADAPTER *pAd, UCHAR TxBfEnFlg) -{ - /* PATE_INFO pATEInfo = &(pAd->ate); */ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - - switch (TxBfEnFlg) { - case 0: - /* no BF */ - ATECtrl->iTxBf = FALSE; - ATECtrl->eTxBf = FALSE; - break; - - case 1: - /* ETxBF */ - ATECtrl->iTxBf = FALSE; - ATECtrl->eTxBf = TRUE; - break; - - case 2: - /* ITxBF */ - ATECtrl->iTxBf = TRUE; - ATECtrl->eTxBf = FALSE; - break; - - case 3: - /* Enable TXBF support */ - ATECtrl->iTxBf = TRUE; - ATECtrl->eTxBf = TRUE; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_ATE_TXBF_Proc: Invalid parameter %d\n", - TxBfEnFlg)); - break; - } - -#ifdef MT_MAC - - if (ATECtrl->eTxBf == TRUE) { - /* Enable sounding trigger in FW */ - AsicBfSoundingPeriodicTriggerCtrl(pAd, BSSID_WCID, TRUE); - } else { - /* Disable sounding trigger in FW */ - AsicBfSoundingPeriodicTriggerCtrl(pAd, BSSID_WCID, FALSE); - } - -#endif - return TRUE; -} - -#ifdef MT_MAC -/* - *========================================================================== - *Description: - * Enable sounding trigger - * - * Return: - * TRUE if all parameters are OK, FALSE otherwise - *========================================================================== -*/ -INT MT_SetATESoundingProc(RTMP_ADAPTER *pAd, UCHAR SDEnFlg) -{ - /* Enable sounding trigger in FW */ - return AsicBfSoundingPeriodicTriggerCtrl(pAd, BSSID_WCID, SDEnFlg); -} -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - -#ifdef RTMP_MAC_PCI -static INT32 pci_ate_init(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 Index; - RTMP_TX_RING *pTxRing = &pAd->PciHif.TxRing[QID_AC_BE]; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - HIF_IO_READ32(pAd, pTxRing->hw_didx_addr, &pTxRing->TxDmaIdx); - pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx; - pTxRing->TxCpuIdx = pTxRing->TxDmaIdx; - HIF_IO_WRITE32(pAd, pTxRing->hw_cidx_addr, pTxRing->TxCpuIdx); - - for (Index = 0; Index < TX_RING_SIZE; Index++) { - if (ATEPayloadAlloc(pAd, Index) != (NDIS_STATUS_SUCCESS)) { - ATECtrl->allocated = 0; - goto pci_ate_init_err; - } - } - - ATECtrl->allocated = 1; - RTMP_ASIC_INTERRUPT_ENABLE(pAd); - return NDIS_STATUS_SUCCESS; -pci_ate_init_err: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate test packet fail at pakcet%d\n", __func__, - Index)); - return NDIS_STATUS_FAILURE; -} - -static INT32 pci_clean_q(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 Index; - TXD_STRUC *pTxD = NULL; - RTMP_TX_RING *pTxRing = &pAd->PciHif.TxRing[QID_AC_BE]; -#ifdef RT_BIG_ENDIAN - TXD_STRUC *pDestTxD = NULL; - UCHAR TxHwInfo[TXD_SIZE]; -#endif - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s -->\n", __func__)); - - /* Polling TX/RX path until packets empty */ - if (ATECtrl->tx_coherent == 0) - MTPciPollTxRxEmpty(pAd); - - for (Index = 0; Index < TX_RING_SIZE; Index++) { - PNDIS_PACKET pPacket; - - pPacket = pTxRing->Cell[Index].pNextNdisPacket; - - if (pPacket) - PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, - RTMP_PCI_DMA_TODEVICE); - -#ifdef RT_BIG_ENDIAN - RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); - WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, - TYPE_TXD); -#endif - } - - return NDIS_STATUS_SUCCESS; -} - -static INT32 pci_setup_frame(RTMP_ADAPTER *pAd, UINT32 q_idx) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 Index; - UINT32 TxIdx = 0; - RTMP_TX_RING *pTxRing = &pAd->PciHif.TxRing[QID_AC_BE]; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s -->,\n", __func__)); - - if (ATECtrl->allocated == 0) - goto pci_setup_frame_err; - - HIF_IO_READ32(pAd, pTxRing->hw_didx_addr, &pTxRing->TxDmaIdx); - pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx; - pTxRing->TxCpuIdx = pTxRing->TxDmaIdx; - HIF_IO_WRITE32(pAd, pTxRing->hw_cidx_addr, pTxRing->TxCpuIdx); - - if (ATECtrl->bQAEnabled != TRUE) /* reset in start tx when iwpriv */ - ATECtrl->TxDoneCount = 0; - - for (Index = 0; Index < TX_RING_SIZE; Index++) - pTxRing->Cell[Index].pNdisPacket = ATECtrl->pAtePacket[Index]; - - for (Index = 0; (Index < TX_RING_SIZE) && (Index < ATECtrl->TxCount); - Index++) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Index = %d, ATECtrl->TxCount = %u\n", Index, - ATECtrl->TxCount)); - TxIdx = pTxRing->TxCpuIdx; - - if (MT_ATESetupFrame(pAd, TxIdx) != 0) - return NDIS_STATUS_FAILURE; - - if (((Index + 1) < TX_RING_SIZE) && (Index < ATECtrl->TxCount)) - INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: TxCpuIdx: %u, TxDmaIdx: %u\n", __func__, - pTxRing->TxCpuIdx, pTxRing->TxDmaIdx)); - return NDIS_STATUS_SUCCESS; -pci_setup_frame_err: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Setup frame fail\n", __func__)); - return NDIS_STATUS_FAILURE; -} - -static INT32 pci_test_frame_tx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - RTMP_TX_RING *pTxRing = &pAd->PciHif.TxRing[QID_AC_BE]; - - if (ATECtrl->allocated == 0) - goto pci_tx_frame_err; - - /* Enable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 1); - ATECtrl->Mode |= ATE_TXFRAME; - HIF_IO_WRITE32(pAd, pTxRing->hw_cidx_addr, pTxRing->TxCpuIdx); - return NDIS_STATUS_SUCCESS; -pci_tx_frame_err: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: tx frame fail\n", __func__)); - return NDIS_STATUS_FAILURE; -} - -static INT32 pci_clean_test_rx_frame(RTMP_ADAPTER *pAd) -{ - UINT32 Index, RingNum; - RXD_STRUC *pRxD = NULL; -#ifdef RT_BIG_ENDIAN - RXD_STRUC *pDestRxD; - UCHAR RxHwInfo[RXD_SIZE]; -#endif - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - for (RingNum = 0; RingNum < GET_NUM_OF_RX_RING(cap); RingNum++) { - for (Index = 0; Index < RX_RING_SIZE; Index++) { -#ifdef RT_BIG_ENDIAN - pDestRxD = (RXD_STRUC *)pAd->PciHif.RxRing[0] - .Cell[Index] - .AllocVa; - NdisMoveMemory(&RxHwInfo[0], pDestRxD, RXD_SIZE); - pRxD = (RXD_STRUC *)&RxHwInfo[0]; - RTMPDescriptorEndianChange((PUCHAR)pRxD, TYPE_RXD); -#else - /* Point to Rx indexed rx ring descriptor */ - pRxD = (RXD_STRUC *)pAd->PciHif.RxRing[0] - .Cell[Index] - .AllocVa; -#endif - pRxD->DDONE = 0; -#ifdef RT_BIG_ENDIAN - RTMPDescriptorEndianChange((PUCHAR)pRxD, TYPE_RXD); - WriteBackToDescriptor((PUCHAR)pDestRxD, (PUCHAR)pRxD, - FALSE, TYPE_RXD); -#endif - } - } - - return NDIS_STATUS_SUCCESS; -} - -static INT32 pci_ate_leave(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 Index; - TXD_STRUC *pTxD = NULL; - RTMP_TX_RING *pTxRing = &pAd->PciHif.TxRing[QID_AC_BE]; -#ifdef RT_BIG_ENDIAN - TXD_STRUC *pDestTxD = NULL; - UCHAR tx_hw_info[TXD_SIZE]; -#endif /* RT_BIG_ENDIAN */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s -->,\n", __func__)); - NICReadEEPROMParameters(pAd, NULL); - NICInitAsicFromEEPROM(pAd); - - if (ATECtrl->allocated == 1) { - /* Disable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 0); - - for (Index = 0; Index < TX_RING_SIZE; Index++) { - PNDIS_PACKET pPacket; -#ifndef RT_BIG_ENDIAN - pTxD = (TXD_STRUC *)pAd->PciHif.TxRing[QID_AC_BE] - .Cell[Index] - .AllocVa; -#else - pDestTxD = (TXD_STRUC *)pAd->TxRing[QID_AC_BE] - .Cell[Index] - .AllocVa; - NdisMoveMemory(&tx_hw_info[0], (UCHAR *)pDestTxD, - TXD_SIZE); - pTxD = (TXD_STRUC *)&tx_hw_info[0]; - RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); -#endif /* !RT_BIG_ENDIAN */ - pTxD->DMADONE = 0; - pPacket = pTxRing->Cell[Index].pNdisPacket; - - if (pPacket) { - PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, - pTxD->SDLen0, - RTMP_PCI_DMA_TODEVICE); - RELEASE_NDIS_PACKET(pAd, pPacket, - NDIS_STATUS_SUCCESS); - } - - /* Always assign pNdisPacket as NULL after clear */ - pTxRing->Cell[Index].pNdisPacket = NULL; - pPacket = pTxRing->Cell[Index].pNextNdisPacket; - - if (pPacket) { - PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, - pTxD->SDLen1, - RTMP_PCI_DMA_TODEVICE); - RELEASE_NDIS_PACKET(pAd, pPacket, - NDIS_STATUS_SUCCESS); - } - - /* Always assign pNextNdisPacket as NULL after clear */ - pTxRing->Cell[Index].pNextNdisPacket = NULL; -#ifdef RT_BIG_ENDIAN - RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); - WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, - FALSE, TYPE_TXD); -#endif /* RT_BIG_ENDIAN */ - } - - ATECtrl->allocated = 0; - } - - return NDIS_STATUS_SUCCESS; -} -#endif -static struct _ATE_OPERATION MT_ATEOp = { - .ATEStart = MT_ATEStart, - .ATEStop = MT_ATEStop, - .StartTx = MT_ATEStartTx, - .StartRx = MT_ATEStartRx, - .StopTx = MT_ATEStopTx, - .StopRx = MT_ATEStopRx, - .SetTxPower0 = MT_ATESetTxPower0, - .SetTxPower1 = MT_ATESetTxPower1, - .SetTxAntenna = MT_ATESetTxAntenna, - .SetRxAntenna = MT_ATESetRxAntenna, - .SetTxFreqOffset = MT_ATESetTxFreqOffset, - .SetChannel = MT_ATESetChannel, - .SetBW = MT_ATESetBW, -#if !defined(COMPOS_TESTMODE_WIN) /* 1 todo RX_BLK */ - .SampleRssi = MT_ATESampleRssi, -#endif - .SetAIFS = MT_ATESetAIFS, - .SetTSSI = MT_ATESetTSSI, - .SetDPD = MT_ATESetDPD, - .StartTxTone = MT_ATEStartTxTone, - .SetTxTonePower = MT_ATESetTxTonePower, - .StopTxTone = MT_ATEStopTxTone, - .StartContinousTx = MT_ATEStartContinousTx, - .StopContinousTx = MT_ATEStopContinousTx, - .RfRegWrite = MT_RfRegWrite, - .RfRegRead = MT_RfRegRead, - .GetFWInfo = MT_GetFWInfo, -#if defined(TXBF_SUPPORT) && defined(MT_MAC) - .SetATETxBfProc = MT_SetATETxBfProc, - .SetATETxSoundingProc = MT_SetATESoundingProc, -#endif /* MT_MAC */ -}; - -#ifdef RTMP_MAC_PCI -static struct _ATE_IF_OPERATION ate_if_ops = { - .init = pci_ate_init, - .clean_trx_q = pci_clean_q, - .clean_test_rx_frame = pci_clean_test_rx_frame, - .setup_frame = pci_setup_frame, - .test_frame_tx = pci_test_frame_tx, - .ate_leave = pci_ate_leave, -}; -#else -static struct _ATE_IF_OPERATION ate_if_ops = { - .init = NULL, - .clean_trx_q = NULL, - .setup_frame = NULL, - .test_frame_tx = NULL, - .ate_leave = NULL, -}; -#endif /* RTMP_MAC_PCI */ - -INT32 MT_ATEInit(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - - ATECtrl->ATEOp = &MT_ATEOp; - ATECtrl->ATEIfOps = &ate_if_ops; - return 0; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode.c deleted file mode 100644 index efd96477de..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode.c +++ /dev/null @@ -1,8558 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - Module Name: - mt_testmode.c - -*/ - -#ifdef COMPOS_TESTMODE_WIN -#include "config.h" -#else -#include "rt_config.h" -#endif - -#define MCAST_WCID_TO_REMOVE 0 /* Pat: TODO */ - -struct _ATE_DATA_RATE_MAP cck_mode_mcs_to_data_rate_map[] = { - { 0, 1000 }, { 1, 2000 }, { 2, 5500 }, { 3, 11000 }, - { 9, 2000 }, { 10, 5500 }, { 11, 11000 }, -}; - -struct _ATE_DATA_RATE_MAP ofdm_mode_mcs_to_data_rate_map[] = { - { 0, 6000 }, { 1, 9000 }, { 2, 12000 }, { 3, 18000 }, - { 4, 24000 }, { 5, 36000 }, { 6, 48500 }, { 7, 54000 }, -}; - -struct _ATE_DATA_RATE_MAP n_mode_mcs_to_data_rate_map[] = { - { 0, 6500 }, { 1, 13000 }, { 2, 19500 }, { 3, 26000 }, { 4, 39000 }, - { 5, 52000 }, { 6, 58500 }, { 7, 65000 }, { 32, 6000 }, /* MCS32 */ -}; - -struct _ATE_DATA_RATE_MAP ac_mode_mcs_to_data_rate_map_bw20[] = { - { 0, 65 }, /* in unit of 100k */ - { 1, 130 }, { 2, 195 }, { 3, 260 }, { 4, 390 }, - { 5, 520 }, { 6, 585 }, { 7, 650 }, { 8, 780 }, -}; - -struct _ATE_DATA_RATE_MAP ac_mode_mcs_to_data_rate_map_bw40[] = { - { 0, 135 }, /* in unit of 100k */ - { 1, 270 }, { 2, 405 }, { 3, 540 }, { 4, 810 }, { 5, 1080 }, - { 6, 1215 }, { 7, 1350 }, { 8, 1620 }, { 9, 1800 }, -}; - -struct _ATE_DATA_RATE_MAP ac_mode_mcs_to_data_rate_map_bw80[] = { - { 0, 293 }, /* in unit of 100k */ - { 1, 585 }, { 2, 878 }, { 3, 1170 }, { 4, 1755 }, { 5, 2340 }, - { 6, 2633 }, { 7, 2925 }, { 8, 3510 }, { 9, 3900 }, -}; - -struct _ATE_DATA_RATE_MAP ac_mode_mcs_to_data_rate_map_bw160[] = { - { 0, 585 }, /* in unit of 100k */ - { 1, 1170 }, { 2, 1755 }, { 3, 2340 }, { 4, 3510 }, { 5, 4680 }, - { 6, 5265 }, { 7, 5850 }, { 8, 7020 }, { 9, 7800 }, -}; - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#define ATE_ANT_USER_SEL 0x80000000 -/* BIT[0]:all, BIT[X==1]:ant(X-1) sel */ -struct _ATE_ANT_MAP ant_to_spe_idx_map[] = { - /* All */ - { 0x0, 0 }, - { 0xf, 0 }, - /* 1 Ant */ - { 0x1, 0 }, /* Tx0 */ - { 0x2, 1 }, /* Tx1 */ - { 0x4, 3 }, /* Tx2 */ - { 0x8, 9 }, /* Tx3 */ - /* 2 Ant */ - { 0x3, 0 }, - { 0x5, 2 }, - { 0x9, 8 }, - { 0x6, 4 }, - { 0xa, 6 }, - { 0xc, 16 }, - /* 3 Ant */ - { 0x7, 0 }, /* 0_1_2 */ - { 0xb, 10 }, /* 0_1_3 */ - { 0xd, 12 }, /* 0_2_3 */ - { 0xe, 18 }, /* 1_2_3 */ -}; - -struct _ATE_TXPWR_GROUP_MAP txpwr_group_map[] = { - { 2407, - 2484, - { DMAC_TX0_G_BAND_TARGET_PWR, DMAC_TX1_G_BAND_TARGET_PWR, - DMAC_TX2_G_BAND_TARGET_PWR, DMAC_TX3_G_BAND_TARGET_PWR } }, - { 4910, - 5140, - { DMAC_GRP0_TX0_A_BAND_TARGET_PWR, DMAC_GRP0_TX1_A_BAND_TARGET_PWR, - DMAC_GRP0_TX2_A_BAND_TARGET_PWR, - DMAC_GRP0_TX3_A_BAND_TARGET_PWR } }, - { 5140, - 5250, - { DMAC_GRP1_TX0_A_BAND_TARGET_PWR, DMAC_GRP1_TX1_A_BAND_TARGET_PWR, - DMAC_GRP1_TX2_A_BAND_TARGET_PWR, - DMAC_GRP1_TX3_A_BAND_TARGET_PWR } }, - { 5250, - 5360, - { DMAC_GRP2_TX0_A_BAND_TARGET_PWR, DMAC_GRP2_TX1_A_BAND_TARGET_PWR, - DMAC_GRP2_TX2_A_BAND_TARGET_PWR, - DMAC_GRP2_TX3_A_BAND_TARGET_PWR } }, - { 5360, - 5470, - { DMAC_GRP3_TX0_A_BAND_TARGET_PWR, DMAC_GRP3_TX1_A_BAND_TARGET_PWR, - DMAC_GRP3_TX2_A_BAND_TARGET_PWR, - DMAC_GRP3_TX3_A_BAND_TARGET_PWR } }, - { 5470, - 5580, - { DMAC_GRP4_TX0_A_BAND_TARGET_PWR, DMAC_GRP4_TX1_A_BAND_TARGET_PWR, - DMAC_GRP4_TX2_A_BAND_TARGET_PWR, - DMAC_GRP4_TX3_A_BAND_TARGET_PWR } }, - { 5580, - 5690, - { DMAC_GRP5_TX0_A_BAND_TARGET_PWR, DMAC_GRP5_TX1_A_BAND_TARGET_PWR, - DMAC_GRP5_TX2_A_BAND_TARGET_PWR, - DMAC_GRP5_TX3_A_BAND_TARGET_PWR } }, - { 5690, - 5800, - { DMAC_GRP6_TX0_A_BAND_TARGET_PWR, DMAC_GRP6_TX1_A_BAND_TARGET_PWR, - DMAC_GRP6_TX2_A_BAND_TARGET_PWR, - DMAC_GRP6_TX3_A_BAND_TARGET_PWR } }, - { 5800, - 5925, - { DMAC_GRP7_TX0_A_BAND_TARGET_PWR, DMAC_GRP7_TX1_A_BAND_TARGET_PWR, - DMAC_GRP7_TX2_A_BAND_TARGET_PWR, DMAC_GRP7_TX3_A_BAND_TARGET_PWR } } -}; - -#elif defined(MT7637) -/* todo: efuse structure need unify, MT7636 will fail in this flow */ -#define EFUSE_ADDR_TX0POWER_54M_2_4G 0x58 /* MT7637 */ -#define EFUSE_ADDR_TX0POWER_54M_4920_5140 0x64 /* MT7637 */ -#define EFUSE_ADDR_TX0POWER_54M_5150_5250 0x69 /* MT7637 */ -#define EFUSE_ADDR_TX0POWER_54M_5250_5360 0x6E /* MT7637 */ -#define EFUSE_ADDR_TX0POWER_54M_5360_5470 0x73 /* MT7637 */ -#define EFUSE_ADDR_TX0POWER_54M_5470_5580 0x78 /* MT7637 */ -#define EFUSE_ADDR_TX0POWER_54M_5580_5690 0x7D /* MT7637 */ -#define EFUSE_ADDR_TX0POWER_54M_5690_5800 0x82 /* MT7637 */ -#define EFUSE_ADDR_TX0POWER_54M_5810_5925 0x87 /* MT7637 */ - -struct _ATE_TXPWR_GROUP_MAP txpwr_group_map[] = { - { 2407, 2484, { EFUSE_ADDR_TX0POWER_54M_2_4G } }, - { 4910, 5140, { EFUSE_ADDR_TX0POWER_54M_4920_5140 } }, - { 5140, 5250, { EFUSE_ADDR_TX0POWER_54M_5150_5250 } }, - { 5250, 5360, { EFUSE_ADDR_TX0POWER_54M_5250_5360 } }, - { 5360, 5470, { EFUSE_ADDR_TX0POWER_54M_5360_5470 } }, - { 5470, 5580, { EFUSE_ADDR_TX0POWER_54M_5470_5580 } }, - { 5580, 5690, { EFUSE_ADDR_TX0POWER_54M_5580_5690 } }, - { 5690, 5800, { EFUSE_ADDR_TX0POWER_54M_5690_5800 } }, - { 5800, 5925, { EFUSE_ADDR_TX0POWER_54M_5810_5925 } }, -}; -#else -/* todo: efuse structure need unify, MT7636 will fail in this flow */ -struct _ATE_TXPWR_GROUP_MAP txpwr_group_map[] = { - { 0 }, -}; -#endif - -#ifdef MT7615 -#define RSSIOFFSET_24G_WF0 0x130 -#define RSSIOFFSET_24G_WF1 (RSSIOFFSET_24G_WF0 + 0x1) -#define RSSIOFFSET_24G_WF2 (RSSIOFFSET_24G_WF0 + 0x2) -#define RSSIOFFSET_24G_WF3 (RSSIOFFSET_24G_WF0 + 0x3) -#define RSSIOFFSET_5G_WF0 0x134 -#define RSSIOFFSET_5G_WF1 (RSSIOFFSET_5G_WF0 + 0x1) -#define RSSIOFFSET_5G_WF2 (RSSIOFFSET_5G_WF0 + 0x2) -#define RSSIOFFSET_5G_WF3 (RSSIOFFSET_5G_WF0 + 0x3) - -static UINT32 rssi_eeprom_band_24G_offset[] = { RSSIOFFSET_24G_WF0, - RSSIOFFSET_24G_WF1, - RSSIOFFSET_24G_WF2, - RSSIOFFSET_24G_WF3 }; - -static UINT32 rssi_eeprom_band_5G_offset[] = { RSSIOFFSET_5G_WF0, - RSSIOFFSET_5G_WF1, - RSSIOFFSET_5G_WF2, - RSSIOFFSET_5G_WF3 }; - -static UINT32 *_rssi_eeprom_band_offset[] = { rssi_eeprom_band_24G_offset, - rssi_eeprom_band_5G_offset }; - -static UINT32 _n_band_offset[] = { ARRAY_SIZE(rssi_eeprom_band_24G_offset), - ARRAY_SIZE(rssi_eeprom_band_5G_offset) }; -#else -static UINT32 *_rssi_eeprom_band_offset[] = { NULL }; -static UINT32 _n_band_offset[] = { 0 }; -#endif - -#ifdef PRE_CAL_TRX_SET2_SUPPORT -static UINT16 PreCalGroupList[] = { - 0x00ED, /* 0 - Ch group 0,2,3,5,6,7 */ - 0x01FF, /*All group 0 ~ 8*/ -}; -static UINT8 PreCalItemList[] = { - 0x1F, /* 0 - Pre-cal Bit[0]:TXLPF, Bit[1]:TXIQ, Bit[2]:TXDC, Bit[3]:RXFI, Bit[4]:RXFD */ -}; -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ - -struct rssi_offset_eeprom eeprom_rssi_offset = { -#ifndef COMPOS_TESTMODE_WIN - .rssi_eeprom_band_offset = _rssi_eeprom_band_offset, - .n_band_offset = _n_band_offset, - .n_band = ARRAY_SIZE(_rssi_eeprom_band_offset), -#else - _rssi_eeprom_band_offset, - _n_band_offset, - sizeof(_rssi_eeprom_band_offset) / sizeof(_rssi_eeprom_band_offset[0]), -#endif -}; - -#if defined(TXBF_SUPPORT) && defined(MT_MAC) -UINT8 g_EBF_certification; -UINT8 BF_ON_certification; -extern UCHAR TemplateFrame[32]; -#endif /* TXBF_SUPPORT && MT_MAC */ - -VOID MtATEDummyFunc(VOID) -{ -} -/* Private Function Prototype */ -static INT32 MT_ATEMPSRelease(RTMP_ADAPTER *pAd); -static INT32 MT_ATEMPSInit(RTMP_ADAPTER *pAd); -static INT32 MT_ATEMPSLoadSetting(RTMP_ADAPTER *pAd, UINT32 band_idx); -#ifdef ATE_TXTHREAD -static INT32 MT_ATEMPSRunStatCheck(RTMP_ADAPTER *pAd, UINT32 band_idx); -#endif -#ifdef LOGDUMP_TO_FILE -static INT32 MT_ATERDDParseResult(struct _ATE_LOG_DUMP_ENTRY entry, INT idx, - RTMP_OS_FD_EXT fd); -static INT MT_ATEWriteFd(RTMP_STRING *log, RTMP_OS_FD_EXT srcf); -#else -static INT32 MT_ATERDDParseResult(struct _ATE_LOG_DUMP_ENTRY entry, INT idx); -#endif -static INT32 MT_MPSTxStop(RTMP_ADAPTER *pAd); -static INT32 MT_ATELogOnOff(struct _RTMP_ADAPTER *pAd, UINT32 type, - UINT32 on_off, UINT32 size); -static INT32 MT_ATESetICapStart(RTMP_ADAPTER *pAd, BOOLEAN Trigger, - BOOLEAN RingCapEn, UINT32 Event, UINT32 Node, - UINT32 Len, UINT32 StopCycle, UINT32 BW, - UINT32 MACTriggerEvent, UINT32 SourceAddrLSB, - UINT32 SourceAddrMSB, UINT32 Band); -static INT32 MT_ATEGetICapStatus(RTMP_ADAPTER *pAd); -static INT32 MT_ATEGetICapIQData(RTMP_ADAPTER *pAd, PINT32 pData, - PINT32 pDataLen, UINT32 IQ_Type, - UINT32 WF_Num); -/* static INT32 MT_ATEInsertLog(RTMP_ADAPTER *pAd, UCHAR *log, UINT32 log_type, UINT32 len); */ - -/* #if CFG_eBF_Sportan_Certification */ -INT32 MT_ATEGenPkt(RTMP_ADAPTER *pAd, UCHAR *buf, UINT32 band_idx); -/* #else */ -/* static INT32 MT_ATEGenPkt(RTMP_ADAPTER *pAd, UCHAR *buf, UINT32 band_idx); */ -/* #endif */ - -INT MtATESetMacTxRx(RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN Enable, - UCHAR BandIdx) -{ - INT ret = 0; -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _EXT_CMD_ATE_TEST_MODE_T param; - UINT8 testmode_en = 1; - - os_zero_mem(¶m, sizeof(param)); - param.ucAteTestModeEn = testmode_en; - param.ucAteIdx = EXT_ATE_SET_TRX; - param.Data.rAteSetTrx.ucType = TxRx; - param.Data.rAteSetTrx.ucEnable = Enable; - param.Data.rAteSetTrx.ucBand = - BandIdx; /* TODO::Fix it after 7615 merge */ - /* Make sure FW command configuration completed for store TX packet in PLE first - * Use aucReserved[1] for uxATEIdx extension feasibility - */ - param.aucReserved[1] = INIT_CMD_SET_AND_WAIT_RETRY_RSP; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TxRx:%x, Enable:%x, BandIdx:%x\n", __func__, - param.Data.rAteSetTrx.ucType, param.Data.rAteSetTrx.ucEnable, - param.Data.rAteSetTrx.ucBand)); - ret = MtCmdATETest(pAd, ¶m); -#else - ret = MtAsicSetMacTxRx(pAd, TxRx, Enable, BandIdx); -#endif - return ret; -} - -INT MtATESetTxStream(RTMP_ADAPTER *pAd, UINT32 StreamNums, UCHAR BandIdx) -{ - INT ret = 0; -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _EXT_CMD_ATE_TEST_MODE_T param; - UINT8 testmode_en = 1; - - os_zero_mem(¶m, sizeof(param)); - param.ucAteTestModeEn = testmode_en; - param.ucAteIdx = EXT_ATE_SET_TX_STREAM; - param.Data.rAteSetTxStream.ucStreamNum = StreamNums; - param.Data.rAteSetTxStream.ucBand = BandIdx; - ret = MtCmdATETest(pAd, ¶m); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: StreamNum:%x BandIdx:%x\n", __func__, StreamNums, - BandIdx)); -#else - ret = MtAsicSetTxStream(pAd, StreamNums, BandIdx); -#endif - return ret; -} - -INT MtATESetRxPath(RTMP_ADAPTER *pAd, UINT32 RxPathSel, UCHAR u1BandIdx) -{ - INT ret = 0; -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _EXT_CMD_ATE_TEST_MODE_T param; - UINT8 testmode_en = 1; - - os_zero_mem(¶m, sizeof(param)); - param.ucAteTestModeEn = testmode_en; - param.ucAteIdx = EXT_ATE_SET_RX_PATH; - - /* Set Rx Ant 2/3 for Band 1 */ - if (u1BandIdx) - RxPathSel = RxPathSel << 2; - - param.Data.rAteSetRxPath.ucType = RxPathSel; - param.Data.rAteSetRxPath.ucBand = u1BandIdx; - ret = MtCmdATETest(pAd, ¶m); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RxPathSel:%x BandIdx:%x\n", __func__, RxPathSel, - u1BandIdx)); -#else - ret = MtAsicSetRxPath(pAd, RxPathSel, u1BandIdx); -#endif - return ret; -} - -INT MtATESetRxFilter(RTMP_ADAPTER *pAd, MT_RX_FILTER_CTRL_T filter) -{ - INT ret = 0; -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _EXT_CMD_ATE_TEST_MODE_T param; - UINT8 testmode_en = 1; - - os_zero_mem(¶m, sizeof(param)); - param.ucAteTestModeEn = testmode_en; - param.ucAteIdx = EXT_ATE_SET_RX_FILTER; - param.Data.rAteSetRxFilter.ucBand = - filter.u1BandIdx; /* TODO::Fix it after 7615 merge */ - - if (filter.bPromiscuous) - param.Data.rAteSetRxFilter.ucPromiscuousMode = 1; - else { - param.Data.rAteSetRxFilter.ucReportEn = - (UCHAR)filter.bFrameReport; - param.Data.rAteSetRxFilter.u4FilterMask = - cpu2le32(filter.filterMask); - } - - ret = MtCmdATETest(pAd, ¶m); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BandIdx:%x\n", __func__, filter.u1BandIdx)); -#else - ret = MtAsicSetRxFilter(pAd, filter); -#endif - return ret; -} - -INT MtATESetCleanPerStaTxQueue(RTMP_ADAPTER *pAd, BOOLEAN sta_pause_enable) -{ - INT ret = 0; -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _EXT_CMD_ATE_TEST_MODE_T param; - UINT8 testmode_en = 1; - - os_zero_mem(¶m, sizeof(param)); - param.ucAteTestModeEn = testmode_en; - param.ucAteIdx = EXT_ATE_SET_CLEAN_PERSTA_TXQUEUE; - param.Data.rAteSetCleanPerStaTxQueue.fgStaPauseEnable = - sta_pause_enable; - /* Give a same STA ID */ - param.Data.rAteSetCleanPerStaTxQueue.ucStaID = 0; - - ret = MtCmdATETest(pAd, ¶m); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: sta_pause_enable:%x\n", __func__, sta_pause_enable)); -#else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Function do not support yet.\n", __func__)); -#endif - return ret; -} - -#ifdef ARBITRARY_CCK_OFDM_TX -VOID MtATEInitCCK_OFDM_Path(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 i = 0; - UINT32 value = 0; - UINT32 MAC_RDVLE, MAC_ADDR, MAC_WRMASK, MAC_WRVALUE; - - if (IS_ATE_DBDC(pAd)) { - UINT32 idx = 0; - - /* PTA mux */ - if (BandIdx == 0) { - /* 0x810600D0[4:0] = 0x8; */ - MAC_ADDR = ANT_SWITCH_CON3; - MAC_WRMASK = 0xFFFFFFE0; - MAC_WRVALUE = 0x8 << 0; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* 0x810600D4[20:16] = 0xE; */ - MAC_ADDR = ANT_SWITCH_CON4; - MAC_WRMASK = 0xFFE0FFFF; - MAC_WRVALUE = 0xE << 16; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } else { - /* 0x810600E0[11:8] = 0x5; */ - MAC_ADDR = ANT_SWITCH_CON7; - MAC_WRMASK = 0xFFFFF0FF; - MAC_WRVALUE = 0x5 << 8; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* 0x810600E4[27:24] = 0xB; */ - MAC_ADDR = ANT_SWITCH_CON8; - MAC_WRMASK = 0xF0FFFFFF; - MAC_WRVALUE = 0xB << 24; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - /* iPA */ - for (i = 0; i < 2; i++) { - idx = BandIdx * 2 + i; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Reset WF_%d\n", __func__, idx)); - ATEOp->RfRegRead(pAd, idx, 0x48, &value); - value &= ~(0x3FF << 20); /* bit[29:20] */ - value |= (3 << 20); - ATEOp->RfRegWrite(pAd, idx, 0x48, value); - } - } else { - /* PTA mux */ - /* Gband */ - /* 0x810600D0[4:0] = 0x8; */ - MAC_ADDR = ANT_SWITCH_CON3; - MAC_WRMASK = 0xFFFFFFE0; - MAC_WRVALUE = 0x8 << 0; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* 0x810600D4[20:16] = 0xE; */ - MAC_ADDR = ANT_SWITCH_CON4; - MAC_WRMASK = 0xFFE0FFFF; - MAC_WRVALUE = 0xE << 16; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* 0x810600DC[3:0] = 0x0; */ - MAC_ADDR = ANT_SWITCH_CON6; - MAC_WRMASK = 0xFFFFFFF0; - MAC_WRVALUE = 0x0 << 0; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* 0x810600E0[19:16] = 0x6; */ - MAC_ADDR = ANT_SWITCH_CON7; - MAC_WRMASK = 0xFFF0FFFF; - MAC_WRVALUE = 0x6 << 16; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* Aband */ - /* 0x810600D4[12:8] = 0xD; */ - MAC_ADDR = ANT_SWITCH_CON4; - MAC_WRMASK = 0xFFFFE0FF; - MAC_WRVALUE = 0xD << 8; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* 0x810600CC[28:24] = 0x13; */ - MAC_ADDR = ANT_SWITCH_CON2; - MAC_WRMASK = 0xE0FFFFFF; - MAC_WRVALUE = 0x13 << 24; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* 0x810600E0[11:8] = 0x5; */ - MAC_ADDR = ANT_SWITCH_CON7; - MAC_WRMASK = 0xFFFFF0FF; - MAC_WRVALUE = 0x5 << 8; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - /* 0x810600E4[27:24] = 0xB; */ - MAC_ADDR = ANT_SWITCH_CON8; - MAC_WRMASK = 0xF0FFFFFF; - MAC_WRVALUE = 0xB << 24; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - - for (i = 0; i < 4; i++) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Reset WF_%d\n", __func__, i)); - ATEOp->RfRegRead(pAd, i, 0x48, &value); - value &= ~(0x3FF << 20); /* bit[29:20] */ - value |= (3 << 20); - ATEOp->RfRegWrite(pAd, i, 0x48, value); - } - } -} - -VOID MtATESetCCK_OFDM_Path(RTMP_ADAPTER *pAd, UINT32 TxPathSel, UCHAR BandIdx) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 i = 0; - UINT32 value = 0; - UINT32 MAC_RDVLE, MAC_ADDR, MAC_WRMASK, MAC_WRVALUE; - - if (IS_ATE_DBDC(pAd)) { - UINT32 idx = 0; - - /* PTA mux */ - if (BandIdx == 0) { - if ((TxPathSel & (1 << 0)) == 0) { - /* 0x810600D0[4:0] = 0x1B; */ - MAC_ADDR = ANT_SWITCH_CON3; - MAC_WRMASK = 0xFFFFFFE0; - MAC_WRVALUE = 0x1B << 0; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = - (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - if ((TxPathSel & (1 << 1)) == 0) { - /* 0x810600D4[20:16] = 0x1B; */ - MAC_ADDR = ANT_SWITCH_CON4; - MAC_WRMASK = 0xFFE0FFFF; - MAC_WRVALUE = 0x1B << 16; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = - (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - } else { - if ((TxPathSel & (1 << 0)) == 0) { - /* 0x810600E0[11:8] = 0xF; */ - MAC_ADDR = ANT_SWITCH_CON7; - MAC_WRMASK = 0xFFFFF0FF; - MAC_WRVALUE = 0xF << 8; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = - (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - if ((TxPathSel & (1 << 1)) == 0) { - /* 0x810600E4[27:24] = 0xF; */ - MAC_ADDR = ANT_SWITCH_CON8; - MAC_WRMASK = 0xF0FFFFFF; - MAC_WRVALUE = 0xF << 24; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = - (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - } - - for (i = 0; i < 2; i++) { - if ((TxPathSel & (1 << i)) == 0) { - idx = BandIdx * 2 + i; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: Disable WF_%d, TxSel=%x\n", - __func__, idx, TxPathSel)); - ATEOp->RfRegRead(pAd, idx, 0x48, &value); - value &= ~(0x3FF << 20); /* bit[29:20] */ - value = value | (2 << 28) | (2 << 26) | - (8 << 20); - ATEOp->RfRegWrite(pAd, idx, 0x48, value); - } - } - } else { - /* PTA mux */ - /* Gband */ - if ((TxPathSel & (1 << 0)) == 0) { - /* 0x810600D0[4:0] = 0x1B; */ - MAC_ADDR = ANT_SWITCH_CON3; - MAC_WRMASK = 0xFFFFFFE0; - MAC_WRVALUE = 0x1B << 0; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - if ((TxPathSel & (1 << 1)) == 0) { - /* 0x810600D4[20:16] = 0x1B; */ - MAC_ADDR = ANT_SWITCH_CON4; - MAC_WRMASK = 0xFFE0FFFF; - MAC_WRVALUE = 0x1B << 16; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - if ((TxPathSel & (1 << 2)) == 0) { - /* 0x810600DC[3:0] = 0xF; */ - MAC_ADDR = ANT_SWITCH_CON6; - MAC_WRMASK = 0xFFFFFFF0; - MAC_WRVALUE = 0xF << 0; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - if ((TxPathSel & (1 << 3)) == 0) { - /* 0x810600E0[19:16] = 0xF; */ - MAC_ADDR = ANT_SWITCH_CON7; - MAC_WRMASK = 0xFFF0FFFF; - MAC_WRVALUE = 0xF << 16; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - /* Aband */ - if ((TxPathSel & (1 << 0)) == 0) { - /* 0x810600D4[12:8] = 0x1B; */ - MAC_ADDR = ANT_SWITCH_CON4; - MAC_WRMASK = 0xFFFFE0FF; - MAC_WRVALUE = 0x1B << 8; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - if ((TxPathSel & (1 << 1)) == 0) { - /* 0x810600CC[28:24] = 0x1B; */ - MAC_ADDR = ANT_SWITCH_CON2; - MAC_WRMASK = 0xE0FFFFFF; - MAC_WRVALUE = 0x1B << 24; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - if ((TxPathSel & (1 << 2)) == 0) { - /* 0x810600E0[11:8] = 0xF; */ - MAC_ADDR = ANT_SWITCH_CON7; - MAC_WRMASK = 0xFFFFF0FF; - MAC_WRVALUE = 0xF << 8; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - if ((TxPathSel & (1 << 3)) == 0) { - /* 0x810600E4[27:24] = 0xF; */ - MAC_ADDR = ANT_SWITCH_CON8; - MAC_WRMASK = 0xF0FFFFFF; - MAC_WRVALUE = 0xF << 24; - MCU_IO_READ32(pAd, MAC_ADDR, &MAC_RDVLE); - MAC_RDVLE = (MAC_RDVLE & MAC_WRMASK) | MAC_WRVALUE; - MCU_IO_WRITE32(pAd, MAC_ADDR, MAC_RDVLE); - } - - for (i = 0; i < 4; i++) { - if ((TxPathSel & (1 << i)) == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: Disable WF_%d, TxSel=%x\n", - __func__, i, TxPathSel)); - ATEOp->RfRegRead(pAd, i, 0x48, &value); - value &= ~(0x3FF << 20); /* bit[29:20] */ - value = value | (2 << 28) | (2 << 26) | - (8 << 20); - ATEOp->RfRegWrite(pAd, i, 0x48, value); - } - } - } -} -#endif - -#ifdef ATE_TXTHREAD -static INT TestMode_TxThread(ULONG Context); -static INT32 TESTMODE_TXTHREAD_INIT(RTMP_ADAPTER *pAd, INT thread_idx); -static INT32 TESTMODE_TXTHREAD_RELEASE(RTMP_ADAPTER *pAd, INT thread_idx); -static VOID TESTMODEThreadProceedTx(RTMP_ADAPTER *pAd, UINT32 band_idx); -static VOID TESTMODEThreadStopTx(RTMP_ADAPTER *pAd, INT thread_idx); - -static INT MT_ATETxHandler(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ate_ctrl = &pAd->ATECtrl; - UINT32 mode = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Mode); - USHORT q_idx = TESTMODE_GET_PARAM(ate_ctrl, band_idx, QID); - INT32 dequeue_size = ate_ctrl->deq_cnt; - INT32 multi_users = 0; - UINT32 txed_cnt = 0; - UINT32 tx_cnt = 0; - UCHAR hwq_idx = q_idx; - RTMP_ARCH_OP *arch_ops = &pAd->archOps; -#if defined(MT7615) || defined(MT7622) - struct _ATE_IPG_PARAM *ipg_param = - TESTMODE_GET_PADDR(ate_ctrl, band_idx, ipg_param); - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ate_ctrl, band_idx, tx_time_param); - UINT32 pkt_tx_time = tx_time_param->pkt_tx_time; - UINT8 need_ampdu = tx_time_param->pkt_need_ampdu; - UINT32 ipg = ipg_param->ipg; -#endif /* defined(MT7615) || defined(MT7622) */ - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - if (IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd) || IS_MT7663(pAd)) { - UCHAR wdev_idx = - TESTMODE_GET_PARAM(ate_ctrl, band_idx, wdev_idx); - struct wifi_dev *wdev = pAd->wdev_list[wdev_idx]; - - hwq_idx = arch_ops->get_resource_idx(pAd, wdev, TX_MGMT, q_idx); - } -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - txed_cnt = TESTMODE_GET_PARAM(ate_ctrl, band_idx, TxedCount); - tx_cnt = TESTMODE_GET_PARAM(ate_ctrl, band_idx, TxCount); - - do { - ULONG free_num; - ate_thread_dequeue: -#ifdef COMPOS_TESTMODE_WIN - free_num = 1; -#else - free_num = 0; - - if ((q_idx & MGMT_USE_QUEUE_FLAG) == MGMT_USE_QUEUE_FLAG) - free_num = GET_TXRING_FREENO(pAd, hwq_idx); - else - free_num = GET_MGMTRING_FREENO(pAd, hwq_idx); - -#endif /* COMPOS_TESTMODE_WIN */ - - mode = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Mode); - - if (mode & ATE_STOP) - break; - - if (!(mode & ATE_TXFRAME)) - break; - - if (!free_num) - break; - -#if defined(MT7615) || defined(MT7622) - round_tx: - - if (((pkt_tx_time > 0) || (ipg > 0)) && - (pAd->mgmt_que.Number >= MGMT_QUE_MAX_NUMS)) - break; - -#endif /* defined(MT7615) || defined(MT7622) */ - - /* For ATE TX thread TX packet counter control */ - if (tx_cnt <= txed_cnt) - break; - - ret = MT_ATETxPkt(pAd, band_idx); - - if (ret) - break; - - txed_cnt++; -#if defined(MT7615) || defined(MT7622) - if (((pkt_tx_time > 0) && need_ampdu) || (ipg > 0)) { - PKT_TOKEN_CB *pktTokenCb = - (PKT_TOKEN_CB *)pAd->PktTokenCb; - UINT32 free_token_cnt = - pktTokenCb->tx_id_list.list->FreeTokenCnt; - UINT32 pkt_tx_token_id_max = - pktTokenCb->pkt_tx_tkid_max; - - free_num = GET_TXRING_FREENO(pAd, hwq_idx); - - if ((free_token_cnt > - (pkt_tx_token_id_max - ATE_ENQUEUE_PACKET_NUM)) && - (free_num > 0)) { - if (pAd->mgmt_que.Number < MGMT_QUE_MAX_NUMS) - goto round_tx; - } - } -#endif /* defined(MT7615) || defined(MT7622) */ - dequeue_size--; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:: band_idx:%u, tx_cnt:%u, txed_cnt:%u, deque:%d, multi_user:%u, free:%lu\n", - __func__, band_idx, tx_cnt, txed_cnt, dequeue_size, - multi_users, free_num)); - - if (!dequeue_size) { - multi_users--; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:: Dequeue %d finish, multi_user:%d\n", - __func__, dequeue_size, multi_users)); - } else - goto ate_thread_dequeue; - } while (multi_users > 0); - - TESTMODE_SET_PARAM(ate_ctrl, band_idx, TxedCount, txed_cnt); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, TxCount, tx_cnt); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:: band_idx:%u, tx_cnt:%u, txed_cnt:%u, deque:%d\n", - __func__, band_idx, tx_cnt, txed_cnt, dequeue_size)); - return ret; -} - -static INT32 Mt_ATEThreadGetBandIdx(RTMP_ADAPTER *pAd, UINT8 *stat) -{ - UINT8 mask = 0; - - mask = 1 << TESTMODE_BAND0; - - if (*stat & mask) { - *stat &= ~mask; - return TESTMODE_BAND0; - } - - mask = 1 << TESTMODE_BAND1; - - if (IS_ATE_DBDC(pAd) && (*stat & mask)) { - *stat &= ~mask; - return TESTMODE_BAND1; - } - - return -1; -} - -static INT TestMode_TxThread(ULONG Context) -{ - int status; - INT32 ret = 0; - RTMP_OS_TASK *pTask = (RTMP_OS_TASK *)Context; - RTMP_ADAPTER *pAd = NULL; - struct _ATE_CTRL *ate_ctrl = NULL; - struct _ATE_TXTHREAD_CB *cb = NULL; - INT32 band_idx = 0; - UINT8 service_stat = 0; - UINT32 mode = 0; - - if (!pTask) - goto err1; - - pAd = (RTMP_ADAPTER *)RTMP_OS_TASK_DATA_GET(pTask); - ate_ctrl = &pAd->ATECtrl; - cb = &ate_ctrl->tx_thread[0]; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Init thread %u for band %u\n", __func__, - ate_ctrl->current_init_thread, band_idx)); - RTMP_OS_COMPLETE(&ate_ctrl->cmd_done); - - while (!RTMP_OS_TASK_IS_KILLED(pTask)) { - if (RtmpOSTaskWait(pAd, pTask, &status) == FALSE) { - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); - break; - } - - service_stat = 0; - RTMP_SEM_LOCK(&cb->lock); - service_stat = cb->service_stat; - - /* AsicSetWPDMA(pAd, PDMA_TX_RX, 0); */ - do { - if (!service_stat) - break; - - band_idx = Mt_ATEThreadGetBandIdx(pAd, &service_stat); - - if (band_idx == -1) - break; - - ret = MT_ATETxHandler(pAd, band_idx); - } while (1); - - cb->service_stat = service_stat; - /* AsicSetWPDMA(pAd, PDMA_TX_RX, 1); */ - RTMP_SEM_UNLOCK(&cb->lock); - - if (band_idx == -1) - goto err1; - - mode = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Mode); - - if (mode & fATE_MPS) { - MT_ATEMPSRunStatCheck(pAd, band_idx); - MT_ATEMPSLoadSetting(pAd, band_idx); - } - - schedule(); - - if (ret) - break; - } - -err1: - if (pTask) - RtmpOSTaskNotifyToExit(pTask); - if (pAd) - MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, band_idx); - if (cb) - cb->is_init = FALSE; - - if (ret) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: abnormal leave err %d\n", __func__, ret)); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: leave\n", __func__)); - if (pAd) - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); - - return ret; -} - -static INT32 TESTMODE_TXTHREAD_INIT(RTMP_ADAPTER *pAd, INT thread_idx) -{ - INT32 Ret = 0; - CHAR thread_name[64] = "ATE_Thread"; - struct _ATE_CTRL *ate_ctrl = &pAd->ATECtrl; - struct _ATE_TXTHREAD_CB *tx_cb = &pAd->ATECtrl.tx_thread[thread_idx]; - - ate_ctrl->deq_cnt = 1; - - if (!ate_ctrl->tx_thread[thread_idx].is_init) { - NdisZeroMemory(tx_cb, sizeof(*tx_cb)); - /* sprintf(thread_name, "ATE_Thread%d", thread_idx); */ - RTMP_OS_TASK_INIT(&tx_cb->task, thread_name, pAd); - ate_ctrl->current_init_thread = thread_idx; - NdisAllocateSpinLock(pAd, &tx_cb->lock); - Ret = RtmpOSTaskAttach(&tx_cb->task, TestMode_TxThread, - (ULONG)&tx_cb->task); - - if (!RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&ate_ctrl->cmd_done, - ate_ctrl->cmd_expire)) - goto err0; - - if (Ret != STATUS_SUCCESS) - goto err0; - - tx_cb->is_init = TRUE; - } else { - tx_cb->txed_cnt = 0; - tx_cb->tx_cnt = 0; - } - - tx_cb->service_stat = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Initialize thread_idx=%d\n", __func__, thread_idx)); - return Ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: tx thread create fail\n", __func__)); - return Ret; -} - -static INT32 TESTMODE_TXTHREAD_RELEASE(RTMP_ADAPTER *pAd, INT thread_idx) -{ - INT32 Ret = 0; - struct _ATE_TXTHREAD_CB *tx_cb = &pAd->ATECtrl.tx_thread[thread_idx]; - - if (&tx_cb->task) - Ret = RtmpOSTaskKill(&tx_cb->task); - - if (Ret == NDIS_STATUS_FAILURE) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("kill ATE Tx task failed!\n")); - else - tx_cb->is_init = FALSE; - - NdisFreeSpinLock(&tx_cb->lock); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Release thread_idx=%d\n", __func__, thread_idx)); - return Ret; -} - -static INT MT_ATEThreadSetService(RTMP_ADAPTER *pAd, UINT32 band_idx, - UINT8 *stat) -{ - UINT8 mask = 0; - - if (IS_ATE_DBDC(pAd) && (band_idx == TESTMODE_BAND1)) - mask = 1 << TESTMODE_BAND1; - else - mask = 1 << TESTMODE_BAND0; - - *stat |= mask; - return 0; -} - -static VOID TESTMODEThreadProceedTx(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - struct _ATE_TXTHREAD_CB *tx_cb = NULL; - tx_cb = &pAd->ATECtrl.tx_thread[0]; - RTMP_SEM_LOCK(&tx_cb->lock); - MT_ATEThreadSetService(pAd, band_idx, &tx_cb->service_stat); - RTMP_SEM_UNLOCK(&tx_cb->lock); - RtmpOsTaskWakeUp(&tx_cb->task); -} - -static VOID TESTMODEThreadStopTx(RTMP_ADAPTER *pAd, INT thread_idx) -{ - struct _ATE_TXTHREAD_CB *tx_cb = &pAd->ATECtrl.tx_thread[thread_idx]; - tx_cb->txed_cnt = 0; - tx_cb->tx_cnt = 0; -} -#endif /* ATE_TXTHREAD */ - -VOID MT_ATEUpdateRxStatistic(RTMP_ADAPTER *pAd, enum _TESTMODE_STAT_TYPE type, - VOID *data) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_RX_STATISTIC *rx_stat = &ATECtrl->rx_stat; - UCHAR *uData = (UCHAR *)data; - - RX_VECTOR1_1ST_CYCLE *RXV1_1ST_CYCLE = - (RX_VECTOR1_1ST_CYCLE *)(uData + 8); - RX_VECTOR1_3TH_CYCLE *RXV1_3TH_CYCLE = - (RX_VECTOR1_3TH_CYCLE *)(uData + 16); - RX_VECTOR1_5TH_CYCLE *RXV1_5TH_CYCLE = - (RX_VECTOR1_5TH_CYCLE *)(uData + 24); -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - RX_VECTOR1_2ND_CYCLE *RXV1_2ND_CYCLE = - (RX_VECTOR1_2ND_CYCLE *)(uData + 12); - RX_VECTOR1_4TH_CYCLE *RXV1_4TH_CYCLE = - (RX_VECTOR1_4TH_CYCLE *)(uData + 20); - - /* RX_VECTOR2_1ST_CYCLE *RXV2_1ST_CYCLE = (RX_VECTOR2_1ST_CYCLE *)(uData + 32); */ - RX_VECTOR2_3TH_CYCLE *RXV2_3TH_CYCLE = - (RX_VECTOR2_3TH_CYCLE *)(uData + 40); -#else - RX_VECTOR2_2ND_CYCLE *RXV2_2ND_CYCLE = - (RX_VECTOR2_2ND_CYCLE *)(uData + 36); - RX_VECTOR1_6TH_CYCLE *RXV1_6TH_CYCLE = - (RX_VECTOR1_6TH_CYCLE *)(uData + 28); -#endif /* defined(MT7615) || defined(MT7622) */ - - if (type == TESTMODE_RXV) { -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - INT16 foe = 0; - UINT32 i = 0; - - if (RXV1_1ST_CYCLE->TxMode == MODE_CCK) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("\t%s: MODE_CCK RX\n", __func__)); - foe = (RXV1_5TH_CYCLE->MISC1 & 0x7ff); - foe = (foe * 1000) >> 11; - } else { - UINT8 cbw = RXV1_1ST_CYCLE->FrMode; - UINT32 foe_const = ((1 << (cbw + 1)) & 0xf) * 10000; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("\t%s: MODE_OFDM RX\n", __func__)); - foe = (RXV1_5TH_CYCLE->MISC1 & 0xfff); - - if (foe >= 2048) - foe = foe - 4096; - - foe = (foe * foe_const) >> 15; - } - - rx_stat->FreqOffsetFromRx = foe; - rx_stat->RCPI[0] = RXV1_4TH_CYCLE->RCPI0; - rx_stat->RCPI[1] = RXV1_4TH_CYCLE->RCPI1; - rx_stat->RCPI[2] = RXV1_4TH_CYCLE->RCPI2; - rx_stat->RCPI[3] = RXV1_4TH_CYCLE->RCPI3; - rx_stat->RSSI[0] = (RXV1_4TH_CYCLE->RCPI0 >> 1) - 110; - rx_stat->RSSI[1] = (RXV1_4TH_CYCLE->RCPI1 >> 1) - 110; - rx_stat->RSSI[2] = (RXV1_4TH_CYCLE->RCPI2 >> 1) - 110; - rx_stat->RSSI[3] = (RXV1_4TH_CYCLE->RCPI3 >> 1) - 110; - rx_stat->FAGC_RSSI_IB[0] = RXV1_3TH_CYCLE->IBRssiRx; - rx_stat->FAGC_RSSI_WB[0] = RXV1_3TH_CYCLE->WBRssiRx; - rx_stat->FAGC_RSSI_IB[1] = RXV1_3TH_CYCLE->IBRssiRx; - rx_stat->FAGC_RSSI_WB[1] = RXV1_3TH_CYCLE->WBRssiRx; - rx_stat->FAGC_RSSI_IB[2] = RXV1_3TH_CYCLE->IBRssiRx; - rx_stat->FAGC_RSSI_WB[2] = RXV1_3TH_CYCLE->WBRssiRx; - rx_stat->FAGC_RSSI_IB[3] = RXV1_3TH_CYCLE->IBRssiRx; - rx_stat->FAGC_RSSI_WB[3] = RXV1_3TH_CYCLE->WBRssiRx; - rx_stat->SNR[0] = (RXV1_5TH_CYCLE->MISC1 >> 19) - 16; - - for (i = 0; i < 4; i++) { - if (rx_stat->FAGC_RSSI_IB[i] >= 128) - rx_stat->FAGC_RSSI_IB[i] -= 256; - - if (rx_stat->FAGC_RSSI_WB[i] >= 128) - rx_stat->FAGC_RSSI_WB[i] -= 256; - } - -#ifdef CFG_SUPPORT_MU_MIMO - - if (RXV1_2ND_CYCLE->RxValidIndicator && - ((RXV1_2ND_CYCLE->GroupId != 0) && - (RXV1_2ND_CYCLE->GroupId != 63))) { - rx_stat->RxMacMuPktCount++; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: get MU packet #%d\n", __func__, - rx_stat->RxMacMuPktCount)); - } - -#endif - rx_stat->SIG_MCS = RXV1_1ST_CYCLE->TxRate; - rx_stat->SINR = (*(UINT32 *)RXV2_3TH_CYCLE) & - 0x00FFFFFF; /* bit[23:0] */ - rx_stat->RXVRSSI = RXV1_3TH_CYCLE->IBRssiRx; -#else - rx_stat->FreqOffsetFromRx = RXV1_5TH_CYCLE->FoE; - rx_stat->RCPI[0] = RXV1_3TH_CYCLE->Rcpi0; - rx_stat->RCPI[1] = RXV1_3TH_CYCLE->Rcpi1; - rx_stat->SNR[0] = RXV1_5TH_CYCLE->LTF_SNR0; - rx_stat->SNR[1] = RXV2_2ND_CYCLE->OfdmLtfSNR1; - rx_stat->RSSI[0] = RXV1_3TH_CYCLE->Rcpi0 / 2 - 110; - rx_stat->RSSI[1] = RXV1_3TH_CYCLE->Rcpi1 / 2 - 110; -#endif /* defined(MT7615) || defined(MT7622) */ - - if (pAd->ATECtrl.en_log & fATE_LOG_RXV) - MT_ATEInsertLog(pAd, data, fATE_LOG_RXV, - sizeof(struct _ATE_RXV_LOG)); - - if (pAd->ATECtrl.en_log & fATE_LOG_RXINFO) { - UINT32 nsts = 0; -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - nsts = RXV1_2ND_CYCLE->NstsField; -#else - nsts = RXV1_6TH_CYCLE->NsTsField; -#endif -#if !defined(COMPOS_TESTMODE_WIN) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPhyMode=%d(%s)\n", - RXV1_1ST_CYCLE->TxMode, - get_phymode_str(RXV1_1ST_CYCLE->TxMode))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tMCS=%d\n", RXV1_1ST_CYCLE->TxRate)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBW=%d\n", RXV1_1ST_CYCLE->FrMode)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSGI=%d\n", RXV1_1ST_CYCLE->HtShortGi)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSTBC=%d\n", RXV1_1ST_CYCLE->HtStbc)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tLDPC=%d\n", RXV1_1ST_CYCLE->HtAdCode)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNsts=%d\n", nsts)); -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - } else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EN_LOG:%x\n", __func__, - pAd->ATECtrl.en_log)); - } else if (type == TESTMODE_RESET_CNT) { - NdisZeroMemory(rx_stat, sizeof(*rx_stat)); - rx_stat->MaxRssi[0] = 0xff; - rx_stat->MaxRssi[1] = 0xff; -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - rx_stat->MaxRssi[2] = 0xff; - rx_stat->MaxRssi[3] = 0xff; -#endif - } else if (type == TESTMODE_COUNTER_802_11) { - COUNTER_802_11 *wlanCounter = (COUNTER_802_11 *)data; - rx_stat->RxMacFCSErrCount = - wlanCounter->FCSErrorCount.u.LowPart; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - rx_stat->RxMacFCSErrCount_band1 = - (wlanCounter + 1)->FCSErrorCount.u.LowPart; - } -#endif - } -} - -INT MtTestModeBkCr(PRTMP_ADAPTER pAd, ULONG offset, enum _TEST_BK_CR_TYPE type) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _TESTMODE_BK_CR *bks = ATECtrl->bk_cr; - struct _TESTMODE_BK_CR *entry = NULL; - INT32 i; - - if ((type >= TEST_BKCR_TYPE_NUM) || (type == TEST_EMPTY_BKCR)) - return NDIS_STATUS_INVALID_DATA; - - for (i = 0; i < MAX_TEST_BKCR_NUM; i++) { - struct _TESTMODE_BK_CR *tmp = &bks[i]; - - if ((tmp->type == TEST_EMPTY_BKCR) && (entry == NULL)) { - entry = tmp; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: find emptyp bk entry %d\n", __func__, - i)); - } else if ((tmp->type == type) && (tmp->offset == offset)) { - entry = tmp; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: update bk entry %d\n", __func__, i)); - break; - } - } - - if (!entry) - return NDIS_STATUS_RESOURCES; - - entry->type = type; - entry->offset = offset; - - switch (type) { - case TEST_MAC_BKCR: - MAC_IO_READ32(pAd, offset, &entry->val); - break; - - case TEST_HIF_BKCR: - HIF_IO_READ32(pAd, offset, &entry->val); - break; - - case TEST_PHY_BKCR: - PHY_IO_READ32(pAd, offset, &entry->val); - break; - - case TEST_HW_BKCR: - HW_IO_READ32(pAd, offset, &entry->val); - break; - - case TEST_MCU_BKCR: - MCU_IO_READ32(pAd, offset, &entry->val); - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: bk-type not supported\n", __func__)); - entry->type = TEST_EMPTY_BKCR; - entry->offset = 0; - break; - } - - return NDIS_STATUS_SUCCESS; -} - -INT MtTestModeRestoreCr(PRTMP_ADAPTER pAd, ULONG offset) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _TESTMODE_BK_CR *bks = ATECtrl->bk_cr; - struct _TESTMODE_BK_CR *entry = NULL; - INT32 i; - - for (i = 0; i < MAX_TEST_BKCR_NUM; i++) { - struct _TESTMODE_BK_CR *tmp = &bks[i]; - - if (tmp->offset == offset) { - entry = tmp; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: find entry %d\n", __func__, i)); - break; - } - } - - if (!entry) - return NDIS_STATUS_INVALID_DATA; - - switch (entry->type) { - case TEST_MAC_BKCR: - MAC_IO_WRITE32(pAd, offset, entry->val); - break; - - case TEST_HIF_BKCR: - HIF_IO_WRITE32(pAd, offset, entry->val); - break; - - case TEST_PHY_BKCR: - PHY_IO_WRITE32(pAd, offset, entry->val); - break; - - case TEST_HW_BKCR: - HW_IO_WRITE32(pAd, offset, entry->val); - break; - - case TEST_MCU_BKCR: - MCU_IO_WRITE32(pAd, offset, entry->val); - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: bk-type not supported\n", __func__)); - entry->type = TEST_EMPTY_BKCR; - entry->offset = 0; - break; - } - - entry->type = TEST_EMPTY_BKCR; - entry->offset = 0; - entry->val = 0; - return NDIS_STATUS_SUCCESS; -} - -static INT32 MtATEPayloadInit(RTMP_ADAPTER *pAd, UCHAR *pPacket, UINT32 len, - UINT32 band_idx) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 policy = TESTMODE_GET_PARAM(ATECtrl, band_idx, FixedPayload); - UCHAR *payload = TESTMODE_GET_PARAM(ATECtrl, band_idx, payload); - UINT32 pl_len = TESTMODE_GET_PARAM(ATECtrl, band_idx, pl_len); - UINT32 pos = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%d, band_idx:%u, len:%u, pl_len:%u, policy:%x\n", - __func__, len, band_idx, len, pl_len, policy)); - - if (policy == ATE_RANDOM_PAYLOAD) { - for (pos = 0; pos < len; pos++) - pPacket[pos] = RandomByte(pAd); - - return 0; - } - - if (!payload) - return NDIS_STATUS_FAILURE; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: payload:%x\n", __func__, payload[0])); - - if (pl_len == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Payload length can't be 0!!\n", __func__)); - return NDIS_STATUS_FAILURE; - } - - if (policy == ATE_USER_PAYLOAD) { - NdisZeroMemory(pPacket, len); - NdisMoveMemory(pPacket, payload, pl_len); - } else if (policy == ATE_FIXED_PAYLOAD) { - for (pos = 0; pos < len; pos += pl_len) - NdisMoveMemory(&pPacket[pos], payload, pl_len); - } - - return 0; -} - -static INT32 MT_ATESetTxPowerX(RTMP_ADAPTER *pAd, ATE_TXPOWER TxPower) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UINT32 Channel = TESTMODE_GET_PARAM(ATECtrl, TxPower.Dbdc_idx, Channel); - UINT32 Ch_Band = TESTMODE_GET_PARAM(ATECtrl, TxPower.Dbdc_idx, Ch_Band); - - if (TxPower.Channel == 0) - TxPower.Channel = Channel; - - TxPower.Band_idx = Ch_Band ? Ch_Band : TxPower.Band_idx; - - if (TxPower.Channel > 14) - TxPower.Band_idx = 1; /* 5G band */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Channel:%d Power:%x Ch_Band:%d Ant:%d\n", __func__, - TxPower.Channel, TxPower.Power, TxPower.Band_idx, - TxPower.Ant_idx)); - - if (TxPower.Power <= 0) - return Ret; - - /* Tx Power value upper bound protection */ - if (TxPower.Power > 50 && TxPower.Power <= 63) - TxPower.Power = 50; - - /* Tx Power value lower bound protection */ - if (TxPower.Power > 63 && TxPower.Power < 78) - TxPower.Power = 78; - - switch (TxPower.Ant_idx) { - case 0: - ATECtrl->TxPower0 = TxPower.Power; - break; - - case 1: - ATECtrl->TxPower1 = TxPower.Power; - break; - - case 2: - ATECtrl->TxPower2 = TxPower.Power; - break; - - case 3: - ATECtrl->TxPower3 = TxPower.Power; - break; - - default: - break; - } - - Ret = MtCmdSetTxPowerCtrl(pAd, TxPower); - return Ret; -} - -static INT32 MT_ATESetTxPower0(RTMP_ADAPTER *pAd, ATE_TXPOWER TxPower) -{ - INT32 Ret = 0; - TxPower.Ant_idx = 0; - Ret = MT_ATESetTxPowerX(pAd, TxPower); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 MT_ATESetTxPower1(RTMP_ADAPTER *pAd, ATE_TXPOWER TxPower) -{ - INT32 Ret = 0; - TxPower.Ant_idx = 1; - Ret = MT_ATESetTxPowerX(pAd, TxPower); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 MT_ATESetTxPower2(RTMP_ADAPTER *pAd, ATE_TXPOWER TxPower) -{ - INT32 Ret = 0; - TxPower.Ant_idx = 2; - Ret = MT_ATESetTxPowerX(pAd, TxPower); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 MT_ATESetTxPower3(RTMP_ADAPTER *pAd, ATE_TXPOWER TxPower) -{ - INT32 Ret = 0; - TxPower.Ant_idx = 3; - Ret = MT_ATESetTxPowerX(pAd, TxPower); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 MT_ATESetForceTxPower(RTMP_ADAPTER *pAd, INT8 cTxPower, - UINT8 ucPhyMode, UINT8 ucTxRate, UINT8 ucBW) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - /* update related Tx parameters */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, PhyMode, ucPhyMode); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mcs, ucTxRate); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, BW, ucBW); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Band(%d), TxMode(%d), MCS(%d), BW(%d), TxPower(%d)\n", - __FUNCTION__, control_band_idx, ucPhyMode, ucTxRate, ucBW, - cTxPower)); - - /* firmware command for Force Tx Power Conrtrol */ - MtCmdSetForceTxPowerCtrl(pAd, control_band_idx, cTxPower, ucPhyMode, - ucTxRate, ucBW); - - return Ret; -} - -#ifdef LOGDUMP_TO_FILE -static INT32 MT_ATEDumpReCal(struct _ATE_LOG_DUMP_ENTRY entry, INT idx, - RTMP_OS_FD_EXT srcf) -#else -static INT32 MT_ATEDumpReCal(struct _ATE_LOG_DUMP_ENTRY entry, INT idx) -#endif -{ - struct _ATE_LOG_RECAL re_cal = entry.log.re_cal; - INT32 ret = 0; -#ifdef LOGDUMP_TO_FILE - INT len = 7 + 2 * 3 + 8 * 3 + 1; - CHAR msg[len]; - os_zero_mem(msg, len); -#endif - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, */ - /* ("CalType:%x ", re_cal.cal_type)); */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[Recal][%08x][%08x]%08x\n", re_cal.cal_type, re_cal.cr_addr, - re_cal.cr_val)); - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, */ - /* ("%08x\n", re_cal.cr_val)); */ -#ifdef LOGDUMP_TO_FILE - sprintf(msg, "[Recal][%08x][%08x]%08x\n", re_cal.cal_type, - re_cal.cr_addr, re_cal.cr_val); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Length:%d %s\n", strlen(msg), msg)); - MT_ATEWriteFd(msg, srcf); -#endif - return ret; -} - -static INT32 MT_ATEInsertReCal(struct _ATE_LOG_DUMP_ENTRY *entry, UCHAR *data, - UINT32 len) -{ - struct _ATE_LOG_RECAL *re_cal = NULL; - INT32 ret = 0; - - if (!entry) - goto err0; - - if (!data) - goto err0; - - os_zero_mem(entry, sizeof(*entry)); - entry->log_type = fATE_LOG_RE_CAL; - entry->un_dumped = TRUE; - re_cal = &entry->log.re_cal; - NdisMoveMemory((UINT8 *)re_cal, data, sizeof(*re_cal)); - return ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: NULL entry %p, data %p\n", __func__, entry, data)); - return NDIS_STATUS_FAILURE; -} - -static INT32 MT_ATEInsertRDD(struct _ATE_LOG_DUMP_ENTRY *entry, UCHAR *data, - UINT32 len) -{ - INT ret = 0; - - if (!entry) - goto err0; - - if (!data) - goto err0; - - os_zero_mem(entry, sizeof(*entry)); - entry->log_type = fATE_LOG_RDD; - entry->un_dumped = TRUE; - - if (len > sizeof(entry->log.rdd)) - len = sizeof(entry->log.rdd); - - NdisMoveMemory((UCHAR *)&entry->log.rdd, data, len); - return ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: NULL entry %p, data %p\n", __func__, entry, data)); - return -1; -} - -static INT32 MT_ATEInsertRXV(struct _ATE_LOG_DUMP_ENTRY *entry, UCHAR *data, - UINT32 len) -{ - RX_VECTOR1_1ST_CYCLE *RXV1_1ST_CYCLE = - (RX_VECTOR1_1ST_CYCLE *)(data + 8); - RX_VECTOR1_2ND_CYCLE *RXV1_2ND_CYCLE = - (RX_VECTOR1_2ND_CYCLE *)(data + 12); - RX_VECTOR1_3TH_CYCLE *RXV1_3TH_CYCLE = - (RX_VECTOR1_3TH_CYCLE *)(data + 16); - RX_VECTOR1_4TH_CYCLE *RXV1_4TH_CYCLE = - (RX_VECTOR1_4TH_CYCLE *)(data + 20); - RX_VECTOR1_5TH_CYCLE *RXV1_5TH_CYCLE = - (RX_VECTOR1_5TH_CYCLE *)(data + 24); - RX_VECTOR1_6TH_CYCLE *RXV1_6TH_CYCLE = - (RX_VECTOR1_6TH_CYCLE *)(data + 28); - RX_VECTOR2_1ST_CYCLE *RXV2_1ST_CYCLE = - (RX_VECTOR2_1ST_CYCLE *)(data + 32); - RX_VECTOR2_2ND_CYCLE *RXV2_2ND_CYCLE = - (RX_VECTOR2_2ND_CYCLE *)(data + 36); - RX_VECTOR2_3TH_CYCLE *RXV2_3TH_CYCLE = - (RX_VECTOR2_3TH_CYCLE *)(data + 40); - - if (!entry) - goto err0; - - if (!data) - goto err0; - - os_zero_mem(entry, sizeof(*entry)); - entry->log_type = fATE_LOG_RXV; - entry->un_dumped = TRUE; - - if (RXV1_1ST_CYCLE) - entry->log.rxv.rxv1_1st = *RXV1_1ST_CYCLE; - - if (RXV1_2ND_CYCLE) - entry->log.rxv.rxv1_2nd = *RXV1_2ND_CYCLE; - - if (RXV1_3TH_CYCLE) - entry->log.rxv.rxv1_3rd = *RXV1_3TH_CYCLE; - - if (RXV1_4TH_CYCLE) - entry->log.rxv.rxv1_4th = *RXV1_4TH_CYCLE; - - if (RXV1_5TH_CYCLE) - entry->log.rxv.rxv1_5th = *RXV1_5TH_CYCLE; - - if (RXV1_6TH_CYCLE) - entry->log.rxv.rxv1_6th = *RXV1_6TH_CYCLE; - - if (RXV2_1ST_CYCLE) - entry->log.rxv.rxv2_1st = *RXV2_1ST_CYCLE; - - if (RXV2_2ND_CYCLE) - entry->log.rxv.rxv2_2nd = *RXV2_2ND_CYCLE; - - if (RXV2_3TH_CYCLE) - entry->log.rxv.rxv2_3rd = *RXV2_3TH_CYCLE; - - return 0; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: NULL entry %p, data %p\n", __func__, entry, data)); - return -1; -} - -#ifdef LOGDUMP_TO_FILE -static INT32 MT_ATEDumpRXV(struct _ATE_LOG_DUMP_ENTRY entry, INT idx, - RTMP_OS_FD_EXT srcf) -#else -static INT32 MT_ATEDumpRXV(struct _ATE_LOG_DUMP_ENTRY entry, INT idx) -#endif -{ - INT32 ret = 0; - struct _ATE_RXV_LOG log = entry.log.rxv; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%%[RXV DUMP START][%d]\n", idx)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD1]%08x\n", *((UINT32 *)&log.rxv1_1st))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD2]%08x\n", *((UINT32 *)&log.rxv1_2nd))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD3]%08x\n", *((UINT32 *)&log.rxv1_3rd))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD4]%08x\n", *((UINT32 *)&log.rxv1_4th))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD5]%08x\n", *((UINT32 *)&log.rxv1_5th))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD6]%08x\n", *((UINT32 *)&log.rxv1_6th))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD7]%08x\n", *((UINT32 *)&log.rxv2_1st))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD8]%08x\n", *((UINT32 *)&log.rxv2_2nd))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXVD9]%08x\n", *((UINT32 *)&log.rxv2_3rd))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RXV DUMP END]\n")); - return ret; -} - -#ifdef LOGDUMP_TO_FILE -static INT MT_ATEWriteFd(RTMP_STRING *log, RTMP_OS_FD_EXT srcf) -{ - INT ret = 0; - INT len = strlen(log); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Write len %d\n", __func__, len)); - ret = os_file_write(srcf, log, len); - return ret; -} - -static RTMP_OS_FD_EXT MT_ATEGetFileFd(UINT32 log_type, INT idx) -{ - RTMP_STRING src[64]; - RTMP_OS_FD_EXT srcf; - - switch (log_type) { - case ATE_LOG_RXV: - sprintf(src, "RXVDump_v%d.txt", idx); - break; - - case ATE_LOG_RDD: - sprintf(src, "RDDDump_v%d.txt", idx); - break; - - case ATE_LOG_RE_CAL: - sprintf(src, "RECALDump_v%08x.txt", (UINT32)idx); - break; - - default: - srcf.Status = NDIS_STATUS_FAILURE; - goto err0; - } - - /* srcf = os_file_open(src, O_WRONLY|O_CREAT|O_TRUNC, 0); */ - srcf = os_file_open(src, O_WRONLY | O_CREAT | O_APPEND, 0); - return srcf; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown log type %08x\n", __func__, log_type)); - return srcf; -} - -static INT32 MT_ATEReleaseLogFd(RTMP_OS_FD_EXT *srcf) -{ - UCHAR ret = 0; - - if (os_file_close(*srcf) != 0) - goto err0; - - return ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Error closing file\n", __func__)); - return NDIS_STATUS_FAILURE; -} -#endif - -#if defined(COMPOS_TESTMODE_WIN) -static INT32 MT_ATEDumpRXVToFile(RTMP_ADAPTER *pAd, - struct _ATE_LOG_DUMP_CB *log_cb, UINT32 idx) -{ - /* todo: check this function work properly under all the case. */ - UINT32 copyIndex = 0; - KIRQL oldIrql; - UCHAR tempBuffer[512]; - struct _ATE_RXV_LOG log; - struct _ATE_LOG_DUMP_ENTRY *entry; - UCHAR *writeBuffer = - (UCHAR *)WINAllocateMemory(CALIBRATION_BUFFER_SIZE); - RTMPMoveMemory(writeBuffer, "[LOG DUMP START]\n", - strlen("[LOG DUMP START]\n")); - copyIndex += strlen("[LOG DUMP START]\n"); - - do { - if (log_cb->entry[idx].un_dumped) { - entry = &log_cb->entry[idx]; - log = entry->log.rxv; - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[%d]", idx); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RTMPMoveMemory(&writeBuffer[copyIndex], - "[RXV DUMP START]\r\n", - strlen("[RXV DUMP START]\r\n")); - copyIndex += strlen("[RXV DUMP START]\r\n"); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD1]%08x\r\n", - *((UINT32 *)&log.rxv1_1st)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD2]%08x\r\n", - *((UINT32 *)&log.rxv1_2nd)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD3]%08x\r\n", - *((UINT32 *)&log.rxv1_3rd)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD4]%08x\r\n", - *((UINT32 *)&log.rxv1_4th)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD5]%08x\r\n", - *((UINT32 *)&log.rxv1_5th)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD6]%08x\r\n", - *((UINT32 *)&log.rxv1_6th)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD7]%08x\r\n", - *((UINT32 *)&log.rxv2_1st)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD8]%08x\r\n", - *((UINT32 *)&log.rxv2_2nd)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RtlStringCbPrintfA(tempBuffer, sizeof(tempBuffer), - "[RXVD9]%08x\r\n", - *((UINT32 *)&log.rxv2_3rd)); - RTMPMoveMemory(&writeBuffer[copyIndex], tempBuffer, - strlen(tempBuffer)); - copyIndex += strlen(tempBuffer); - RTMPMoveMemory(&writeBuffer[copyIndex], - "[RXV DUMP END]\r\n", - strlen("[RXV DUMP END]\r\n")); - copyIndex += strlen("[RXV DUMP END]\r\n"); - log_cb->entry[idx].un_dumped = FALSE; - } - - INC_RING_INDEX(idx, log_cb->len); - } while (idx != log_cb->idx); - - RTMPMoveMemory(&writeBuffer[copyIndex], "[LOG DUMP END]\r\n", - strlen("[LOG DUMP END]\r\n")); - copyIndex += strlen("[LOG DUMP END]\r\n"); - - if (pAd->ReCalibrationSize + copyIndex < CALIBRATION_BUFFER_SIZE) { - KeAcquireSpinLock(&pAd->RxVectorDumpLock, &oldIrql); - RTMPMoveMemory(&pAd->RxVectorDumpBuffer[pAd->RxVectorDumpSize], - writeBuffer, copyIndex); - pAd->RxVectorDumpSize += copyIndex; - KeReleaseSpinLock(&pAd->RxVectorDumpLock, oldIrql); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RxVectorDumpSize = 0x%x, Dump size = 0x%x\n", - pAd->RxVectorDumpSize, copyIndex)); - - if (copyIndex > 0 && pAd->bIsCalDumpThreadRunning) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", pAd->ReCalibrationBuffer)); - KeSetEvent(&pAd->WriteEvent, 0, FALSE); - } else - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Calibration buffer 0x%x + dump size 0x%x over Limit 0x%x\n", - pAd->RxVectorDumpSize, copyIndex, - CALIBRATION_BUFFER_SIZE)); - } - - WINFreeMemory(writeBuffer); - writeBuffer = NULL; -} - -#endif /*#if defined(COMPOS_TESTMODE_WIN)*/ - -INT32 MT_ATEInsertLog(RTMP_ADAPTER *pAd, UCHAR *log, UINT32 log_type, - UINT32 len) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_LOG_DUMP_CB *log_cb = NULL; - INT idx = 0; - INT logcb_idx = 0; - UINT32 is_dumping = 0; - INT32(*insert_func) - (struct _ATE_LOG_DUMP_ENTRY * entry, UCHAR * data, UINT32 len) = NULL; - - switch (log_type) { - case fATE_LOG_RXV: - insert_func = MT_ATEInsertRXV; - logcb_idx = ATE_LOG_RXV - 1; - break; - - case fATE_LOG_RDD: - insert_func = MT_ATEInsertRDD; - logcb_idx = ATE_LOG_RDD - 1; - break; - - case fATE_LOG_RE_CAL: - insert_func = MT_ATEInsertReCal; - logcb_idx = ATE_LOG_RE_CAL - 1; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown log type %08x\n", __func__, log_type)); - break; - } - - if (!insert_func) - goto err1; - - log_cb = &ATECtrl->log_dump[logcb_idx]; - idx = log_cb->idx; - OS_SPIN_LOCK(&log_cb->lock); - is_dumping = log_cb->is_dumping; - OS_SPIN_UNLOCK(&log_cb->lock); - - if (is_dumping) - goto err1; - - if ((log_cb->idx + 1) == log_cb->len) { - if (!log_cb->overwritable) - goto err0; - else - log_cb->is_overwritten = TRUE; - } - - OS_SPIN_LOCK(&log_cb->lock); - - if (log_cb->entry == NULL) { - OS_SPIN_UNLOCK(&log_cb->lock); - goto err0; - } - - ret = insert_func(&log_cb->entry[idx], log, len); - OS_SPIN_UNLOCK(&log_cb->lock); - - if (ret) - goto err0; - - INC_RING_INDEX(log_cb->idx, log_cb->len); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_LOUD, - ("%s: idx:%d, log_cb->idx:%d, log_type:%08x\n", __func__, idx, - log_cb->idx, log_type)); - return ret; -err0: - if (log_cb) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("[WARN]%s: idx:%x, overwritable:%x, log_type:%08x\n", - __func__, idx, log_cb->overwritable, log_type)); -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Log dumping\n", __func__)); - return -NDIS_STATUS_RESOURCES; -} - -INT32 MT_ATEDumpLog(RTMP_ADAPTER *pAd, struct _ATE_LOG_DUMP_CB *log_cb, - UINT32 log_type) -{ - INT32 ret = 0; - INT idx = 0; - UINT32 u4BufferCounter = 0; -#ifdef LOGDUMP_TO_FILE - INT32(*dump_func) - (struct _ATE_LOG_DUMP_ENTRY, INT idx, RTMP_OS_FD_EXT fd) = NULL; -#else - INT32 (*dump_func)(struct _ATE_LOG_DUMP_ENTRY, INT idx) = NULL; -#endif - INT debug_lvl = DebugLevel; - CHAR Log_type[64]; -#ifdef LOGDUMP_TO_FILE - INT len = 5 + 2 * 3 + 5 + 1; - CHAR msg[len]; - os_zero_mem(msg, len); -#endif - - if (!log_cb->entry) - goto err0; - - /* For QAtool log buffer limitation. We should record the current index for next function called. */ - if (pAd->fgQAtoolBatchDumpSupport) - idx = pAd->u2LogEntryIdx; - - if (log_cb->is_overwritten) - idx = log_cb->idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: idx:%d, log_type:%08x, log_cb->idx:%d\n", __func__, idx, - log_type, log_cb->idx)); - - switch (log_type) { - case ATE_LOG_RXV: - dump_func = MT_ATEDumpRXV; - strcpy(Log_type, "LOG"); - break; - - case ATE_LOG_RDD: - dump_func = MT_ATERDDParseResult; - strcpy(Log_type, "RDD"); - break; - - case ATE_LOG_RE_CAL: - dump_func = MT_ATEDumpReCal; - strcpy(Log_type, "RECAL"); - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown log type %08x\n", __func__, log_type)); - break; - } - - if (!dump_func) - goto err0; - -#ifdef LOGDUMP_TO_FILE - - if (log_type == ATE_LOG_RE_CAL) - log_cb->fd = MT_ATEGetFileFd(log_type, log_cb->recal_curr_type); - else - log_cb->fd = MT_ATEGetFileFd(log_type, log_cb->file_idx); - - if (log_cb->fd.Status) - goto err1; - - if (log_type == ATE_LOG_RE_CAL) { - sprintf(msg, "[Recal][%08x][START]\n", log_cb->recal_curr_type); - MT_ATEWriteFd(msg, log_cb->fd); - } - -#endif - DebugLevel = DBG_LVL_OFF; - OS_SPIN_LOCK(&log_cb->lock); - log_cb->is_dumping = TRUE; - OS_SPIN_UNLOCK(&log_cb->lock); -#if defined(COMPOS_TESTMODE_WIN) - /* dump RX vector to file */ - CreateThread(pAd); - MT_ATEDumpRXVToFile(pAd, log_cb, idx); -#else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s DUMP START]\n", Log_type)); - pAd->fgDumpStart = 1; - - do { - if (log_cb->entry[idx].un_dumped) { - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("[%d]", idx)); */ -#ifdef LOGDUMP_TO_FILE - dump_func(log_cb->entry[idx], idx, log_cb->fd); -#else - dump_func(log_cb->entry[idx], idx); -#endif - log_cb->entry[idx].un_dumped = FALSE; - u4BufferCounter++; - } - - /* The size of per entry is 38 bytes and for QAtool log buffer limitation. */ - if ((pAd->fgQAtoolBatchDumpSupport) && - (u4BufferCounter >= - (1 << (CONFIG_LOG_BUF_SHIFT - 1)) / 38)) { - pAd->u2LogEntryIdx = idx; - break; - } - - INC_RING_INDEX(idx, log_cb->len); - } while (idx != log_cb->idx); - -#ifdef LOGDUMP_TO_FILE - - if (log_type == ATE_LOG_RE_CAL) { - sprintf(msg, "[Recal][%08x][END]\n", log_cb->recal_curr_type); - MT_ATEWriteFd(msg, log_cb->fd); - } - -#endif - - if ((idx == log_cb->idx) && (pAd->fgDumpStart)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s DUMP END]\n", Log_type)); - pAd->fgDumpStart = 0; - } - -#endif - OS_SPIN_LOCK(&log_cb->lock); - log_cb->is_dumping = FALSE; - OS_SPIN_UNLOCK(&log_cb->lock); - DebugLevel = debug_lvl; -#ifdef LOGDUMP_TO_FILE - MT_ATEReleaseLogFd(&log_cb->fd); - log_cb->file_idx++; -#endif - return ret; -#ifdef LOGDUMP_TO_FILE -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Error opening log file\n", __func__)); -#endif -err0: - return -1; -} - -static INT32 MT_ATEInitLogCB(RTMP_ADAPTER *pAd, struct _ATE_LOG_DUMP_CB *log_cb, - UINT32 size, UCHAR overwrite) -{ - INT32 ret = 0; - - if (!log_cb->entry) { - NdisZeroMemory(log_cb, sizeof(*log_cb)); - ret = os_alloc_mem(pAd, (PUCHAR *)&log_cb->entry, - size * sizeof(struct _ATE_LOG_DUMP_ENTRY)); - - if (ret) - goto err0; - - os_zero_mem(log_cb->entry, - size * sizeof(struct _ATE_LOG_DUMP_ENTRY)); - log_cb->len = size; - NdisAllocateSpinLock(pAd, &log_cb->lock); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s-v4, init log cb size %u, log_cb->len:%u\n", - __func__, size, log_cb->len)); - } - - log_cb->overwritable = overwrite; - log_cb->is_overwritten = FALSE; - log_cb->idx = 0; -#ifdef LOGDUMP_TO_FILE - log_cb->file_idx = 0; -#endif - return ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Alcated memory fail! size %u\n", __func__, size)); - return ret; -} - -static INT32 MT_ATEReleaseLogDump(RTMP_ADAPTER *pAd) -{ - INT32 ret = 0; - struct _ATE_CTRL *ate_ctrl = &pAd->ATECtrl; - struct _ATE_LOG_DUMP_CB *log_cb = NULL; - INT i = 0; - ate_ctrl->en_log = 0; - - for (i = 0; i < (ATE_LOG_TYPE_NUM - 1); i++) { - log_cb = &ate_ctrl->log_dump[i]; - - if (log_cb->entry) { - os_free_mem(log_cb->entry); - NdisFreeSpinLock(&log_cb->lock); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: release log cb type %d\n", __func__, - i + 1)); - } - } - - return ret; -} - -static VOID MT_ATEAirTimeOnOff(struct _RTMP_ADAPTER *pAd, BOOLEAN Enable) -{ - UINT32 Value; - - if (!Enable) { - MAC_IO_READ32(pAd, RMAC_AIRTIME0, &Value); - Value = Value & (~RX_AIRTIME_EN); - MAC_IO_WRITE32(pAd, RMAC_AIRTIME0, Value); - } -} - -static INT32 MT_ATELogOnOff(struct _RTMP_ADAPTER *pAd, UINT32 type, - UINT32 on_off, UINT32 size) -{ - INT ret = 0; - UINT32 mask = 0; - UCHAR overwrite = TRUE; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_LOG_DUMP_CB *log_cb = NULL; - - switch (type) { - case ATE_LOG_RXV: - mask = fATE_LOG_RXV; - /* Disable RX airtime function to avoid affecting RXV2 Cycle3 */ - /* HW design of RXV2 Cycle3 will be shared for RXV debug function and RX airtime funciotn. */ - MT_ATEAirTimeOnOff(pAd, 0); - break; - - case ATE_LOG_RDD: - overwrite = FALSE; - mask = fATE_LOG_RDD; - break; - - case ATE_LOG_RE_CAL: - /* size = ATE_RECAL_LOG_SIZE; */ - mask = fATE_LOG_RE_CAL; - break; - - case ATE_LOG_RXINFO: - mask = fATE_LOG_RXINFO; - break; - - case ATE_LOG_TXDUMP: - mask = fATE_LOG_TXDUMP; - break; - - case ATE_LOG_TEST: - mask = fATE_LOG_TEST; - break; - - default: - goto err0; - } - - if (type < ATE_LOG_TYPE_NUM) - log_cb = &ATECtrl->log_dump[type - 1]; - - if (on_off == ATE_LOG_ON) { - if (log_cb) - ret = MT_ATEInitLogCB(pAd, log_cb, size, overwrite); - - if (ret) - goto err1; - - ATECtrl->en_log |= mask; - - if (pAd->fgQAtoolBatchDumpSupport) - pAd->u2LogEntryIdx = 0; - } else if (on_off == ATE_LOG_OFF) { - ATECtrl->en_log &= ~mask; - - if (pAd->fgQAtoolBatchDumpSupport) - pAd->u2LogEntryIdx = 0; - } else if (on_off == ATE_LOG_DUMP) { - if (log_cb) - ret = MT_ATEDumpLog(pAd, log_cb, type); - - if (ret) - goto err1; - } else - goto err2; - - return ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s log type %d not supported\n", __func__, type)); -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s log type %d init logCB fail\n", __func__, type)); -err2: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s log ctrl %d not supported\n", __func__, on_off)); - return -1; -} - -static INT32 MT_ATESetICapStart(RTMP_ADAPTER *pAd, BOOLEAN Trigger, - BOOLEAN RingCapEn, UINT32 Event, UINT32 Node, - UINT32 Len, UINT32 StopCycle, UINT32 BW, - UINT32 MACTriggerEvent, UINT32 SourceAddrLSB, - UINT32 SourceAddrMSB, UINT32 Band) -{ - INT32 Ret = 0; -#ifdef INTERNAL_CAPTURE_SUPPORT - INT32 retval = 0; - RBIST_CAP_START_T *prICapInfo = NULL; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); -#endif /* INTERNAL_CAPTURE_SUPPORT */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - -#ifdef INTERNAL_CAPTURE_SUPPORT - retval = os_alloc_mem(pAd, (UCHAR **)&prICapInfo, - sizeof(RBIST_CAP_START_T)); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - os_zero_mem(prICapInfo, sizeof(RBIST_CAP_START_T)); - - prICapInfo->fgTrigger = Trigger; - prICapInfo->fgRingCapEn = RingCapEn; - prICapInfo->u4TriggerEvent = Event; - prICapInfo->u4CaptureNode = Node; - prICapInfo->u4CaptureLen = Len; - prICapInfo->u4CapStopCycle = StopCycle; - prICapInfo->u4BW = BW; - prICapInfo->u4MACTriggerEvent = MACTriggerEvent; - prICapInfo->u4SourceAddressLSB = SourceAddrLSB; - prICapInfo->u4SourceAddressMSB = SourceAddrMSB; - prICapInfo->u4BandIdx = Band; - - if (ops->ICapStart != NULL) - Ret = ops->ICapStart(pAd, (UINT8 *)prICapInfo); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The function is not hooked !!\n", __func__)); - } - -error: - if (prICapInfo != NULL) - os_free_mem(prICapInfo); -#endif /* INTERNAL_CAPTURE_SUPPORT */ - - return Ret; -} - -static INT32 MT_ATEGetICapStatus(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; -#ifdef INTERNAL_CAPTURE_SUPPORT - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if (ops->ICapStatus != NULL) { - Ret = ops->ICapStatus(pAd); - - if (IS_MT7615(pAd)) { - UINT32 StartAddr1, StartAddr2, StartAddr3, EndAddr; - UINT32 StopAddr, Wrap; - - RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT( - &ate_ctrl->cmd_done, ate_ctrl->cmd_expire); - StartAddr1 = ate_ctrl->icap_info.u4StartAddr1; - StartAddr2 = ate_ctrl->icap_info.u4StartAddr2; - StartAddr3 = ate_ctrl->icap_info.u4StartAddr3; - EndAddr = ate_ctrl->icap_info.u4EndAddr; - StopAddr = ate_ctrl->icap_info.u4StopAddr; - Wrap = ate_ctrl->icap_info.u4Wrap; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, StartAddr1:%02x StartAddr2:%02x StartAddr3:%02x EndAddr:%02x StopAddr:%02x Wrap:%02x\n", - __func__, StartAddr1, StartAddr2, StartAddr3, - EndAddr, StopAddr, Wrap)); - } - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The function is not hooked !!\n", __func__)); - } -#endif /* INTERNAL_CAPTURE_SUPPORT */ - - return Ret; -} - -static INT32 MT_ATEGetICapIQData(RTMP_ADAPTER *pAd, PINT32 pData, - PINT32 pDataLen, UINT32 IQ_Type, UINT32 WF_Num) -{ - INT32 Ret = 0; -#ifdef INTERNAL_CAPTURE_SUPPORT - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if (ops->ICapGetIQData != NULL) - Ret = ops->ICapGetIQData(pAd, pData, pDataLen, IQ_Type, WF_Num); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The function is not hooked !!\n", __func__)); - } -#endif /* INTERNAL_CAPTURE_SUPPORT */ - - return Ret; -} - -#if !defined(COMPOS_TESTMODE_WIN) /* 1todo too many OS private function */ -INT MT_ATERxDoneHandle(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - INC_COUNTER64(pAd->WlanCounters[0].ReceivedFragmentCount); - - { - UINT32 chfreq0 = 0, chfreq1 = 0; - union _RMAC_RXD_0_UNION *rxd_0; - UINT32 pkt_type; - RXD_BASE_STRUCT *rxd_base = - (RXD_BASE_STRUCT *)pRxBlk->rmac_info; - - rxd_0 = (union _RMAC_RXD_0_UNION *)pRxBlk->rmac_info; - pkt_type = RMAC_RX_PKT_TYPE(rxd_0->word); - - switch (pkt_type) { - case RMAC_RX_PKT_TYPE_RX_NORMAL: - MAC_IO_READ32(pAd, RMAC_CHFREQ0, &chfreq0); -#ifdef MT7615 - MAC_IO_READ32(pAd, RMAC_CHFREQ1, &chfreq1); -#endif /* MT7615 */ - break; - - default: - break; - } - - ATEOp->SampleRssi(pAd, pRxBlk); - - /* RX packet counter calculate by chfreq of RXD */ - if (rxd_base->RxD1.ChFreq == chfreq0) { - ATECtrl->rx_stat.RxTotalCnt[TESTMODE_BAND0]++; - } -#if defined(MT7615) -#ifdef DBDC_MODE - else if (rxd_base->RxD1.ChFreq == chfreq1) { - ATECtrl->rx_stat.RxTotalCnt[TESTMODE_BAND1]++; - } -#endif -#endif /* MT7615 */ - else - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong chfreq!!\n" - "\tRXD.ch_freq: %x, chfreq0: %x, chfreq0: %x\n", - __func__, rxd_base->RxD1.ChFreq, chfreq0, - chfreq1)); - } - /* LoopBack_Rx(pAd, pRxBlk->MPDUtotalByteCnt, pRxBlk->pRxPacket); */ - return TRUE; -} - -INT8 mt_ate_release_wdev(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct wifi_dev *pWdev = NULL; - UCHAR wdev_idx; - - wdev_idx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wdev_idx); - - /* To close wdev */ - pWdev = pAd->wdev_list[wdev_idx]; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: wdev_idx=%d\n", __func__, ATECtrl->wdev_idx)); - - if (!pWdev) - goto err; - - if (wdev_do_close(pWdev) != TRUE) - ret = -1; - - /* Restore normal driver setting when release wdev */ - pWdev->channel = TESTMODE_GET_PARAM(ATECtrl, band_idx, backup_channel); - pWdev->PhyMode = TESTMODE_GET_PARAM(ATECtrl, band_idx, backup_phymode); - - return ret; - -err: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Cannot get wdev by idx:%d\n", __func__, wdev_idx)); - - return -1; -} - -INT8 mt_ate_init_wdev(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct wifi_dev *pWdev = NULL; - UCHAR wdev_idx; - UCHAR channel; - - wdev_idx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wdev_idx); - channel = TESTMODE_GET_PARAM(ATECtrl, band_idx, Channel); - - /* To open wdev */ - pWdev = pAd->wdev_list[wdev_idx]; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wdev_idx=%d, channel=%d\n", __func__, wdev_idx, - channel)); - - if (!pWdev) - goto err; - - /* Backup normal driver setting when init wdev */ - TESTMODE_SET_PARAM(ATECtrl, band_idx, backup_channel, pWdev->channel); - TESTMODE_SET_PARAM(ATECtrl, band_idx, backup_phymode, pWdev->PhyMode); - - pWdev->channel = channel; - - if (band_idx == TESTMODE_BAND0) - pWdev->PhyMode = PHYMODE_CAP_24G; - else if (band_idx == TESTMODE_BAND1) - pWdev->PhyMode = PHYMODE_CAP_5G; - else - pWdev->PhyMode = PHYMODE_CAP_24G; - - if (wdev_do_open(pWdev) != TRUE) - ret = -1; - if (wdev_edca_acquire(pAd, pWdev) != TRUE) - ret = -1; - - HcSetEdca(pWdev); - - return ret; - -err: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Cannot get wdev by idx:%d\n", __func__, wdev_idx)); - - return -1; -} - -static INT32 MT_ATEReleaseBandInfo(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; -#ifdef DBDC_MODE - INT32 idx = band_idx - 1; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - - if (ATECtrl->band_ext[idx].pate_pkt) { - os_free_mem(ATECtrl->band_ext[idx].pate_pkt); - ATECtrl->band_ext[idx].pate_pkt = NULL; - } -#endif - return ret; -} - -static INT32 MT_ATEInitBandInfo(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; -#ifdef DBDC_MODE - INT32 idx = band_idx - 1; - UCHAR *payload = NULL; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - RTMP_OS_COMPLETION *tx_wait = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_wait); - CHAR addr[MAC_ADDR_LEN] = { 0x00, 0x11, 0x22, 0xBA, 0x2D, 0x11 }; - - if (ATECtrl->band_ext[idx].pate_pkt) - os_free_mem(ATECtrl->band_ext[idx].pate_pkt); - - ret = os_alloc_mem(pAd, (PUCHAR *)&ATECtrl->band_ext[idx].pate_pkt, - ATE_TESTPKT_LEN); - if (pAd->CommonCfg.eDBDC_mode == ENUM_DBDC_5G5G) { - TESTMODE_SET_PARAM(ATECtrl, band_idx, Channel, 100); - TESTMODE_SET_PARAM(ATECtrl, band_idx, ControlChl, 100); - } else { - TESTMODE_SET_PARAM(ATECtrl, band_idx, Channel, 36); - TESTMODE_SET_PARAM(ATECtrl, band_idx, ControlChl, 36); - } - TESTMODE_SET_PARAM(ATECtrl, band_idx, BW, 0); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxDoneCount, 0); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxedCount, 0); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxLength, 1024); - TESTMODE_SET_PARAM(ATECtrl, band_idx, pl_len, 1); - TESTMODE_SET_PARAM(ATECtrl, band_idx, QID, QID_AC_BE); - - payload = TESTMODE_GET_PARAM(ATECtrl, band_idx, payload); - payload[0] = 0xAA; - TESTMODE_SET_PARAM(ATECtrl, band_idx, HLen, LENGTH_802_11); - TESTMODE_SET_PARAM(ATECtrl, band_idx, FixedPayload, 1); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxCount, 0xFFFFFFFF); - ATECtrl->band_ext[idx].pkt_skb = NULL; - NdisMoveMemory(ATECtrl->band_ext[idx].TemplateFrame, - ATECtrl->TemplateFrame, 32); - NdisMoveMemory(ATECtrl->band_ext[idx].Addr1, addr, MAC_ADDR_LEN); - NdisMoveMemory(ATECtrl->band_ext[idx].Addr2, addr, MAC_ADDR_LEN); - NdisMoveMemory(ATECtrl->band_ext[idx].Addr3, addr, MAC_ADDR_LEN); - RTMP_OS_INIT_COMPLETION(tx_wait); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: idx:%u, pkt:%p\n", __func__, idx, - ATECtrl->band_ext[idx].pate_pkt)); -#endif - return ret; -} - -static INT32 MT_ATEStart(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; -#if defined(MT7615) || defined(MT7622) - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; -#else -#endif /* defined(MT7615) || defined(MT7622) */ - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0; - BOOLEAN Cancelled; - MT_RX_FILTER_CTRL_T rx_filter; -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; -#endif -#ifdef DBDC_MODE - struct _BAND_INFO *Info = &(ATECtrl->band_ext[0]); -#endif /* DBDC_MODE */ - -#if defined(DBDC_MODE) && defined(DEFAULT_5G_PROFILE) - /* Remap wdev_idx for MP 3.3 Driver */ - ATECtrl->wdev_idx = 1; - Info->wdev_idx = 0; -#endif /* DBDC_MODE */ - - /* Remind FW that Enable ATE mode */ - MtCmdATEModeCtrl(pAd, 1); - -#if (defined(MT_MAC) && (!defined(MT7636))) -#ifdef TXBF_SUPPORT - /* Before going into ATE mode, stop sounding first */ - mt_Trigger_Sounding_Packet(pAd, FALSE, 0, 0, 0, NULL); -#endif /* TXBF_SUPPORT */ -#endif /* MAC && undefined MT7636 */ - - /* Make sure ATEInit successfully when interface up */ - if (ATECtrl->Mode & ATE_START) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ATE has already started, wdev_idx:%u\n", - __func__, ATECtrl->wdev_idx)); -#ifdef DBDC_MODE - if (IS_ATE_DBDC(pAd)) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ATE has already started, wdev_idx:%u\n", - __func__, Info->wdev_idx)); -#endif /* DBDC_MODE */ - - return Ret; - } - - /* Allocate ATE TX packet buffer */ - if (!ATECtrl->pate_pkt) - Ret = os_alloc_mem(pAd, (PUCHAR *)&ATECtrl->pate_pkt, - ATE_TESTPKT_LEN); - - if (Ret) - goto err2; - - /* ATE data structure initialization */ - ATECtrl->Channel = 1; - ATECtrl->ControlChl = 1; - ATECtrl->BW = 0; - ATECtrl->en_man_set_freq = 0; - ATECtrl->TxDoneCount = 0; - ATECtrl->TxedCount = 0; - ATECtrl->TxLength = 1024; - ATECtrl->pl_len = 1; - ATECtrl->payload[0] = 0xAA; - ATECtrl->QID = QID_AC_BE; - ATECtrl->HLen = LENGTH_802_11; - RTMP_OS_INIT_COMPLETION(&ATECtrl->tx_wait); - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - mt_asic_pcie_aspm_dym_ctrl(pAd, DBDC_BAND0, FALSE, FALSE); - if (pAd->CommonCfg.dbdc_mode) - mt_asic_pcie_aspm_dym_ctrl(pAd, DBDC_BAND1, FALSE, FALSE); - set_pcie_aspm_dym_ctrl_cap(pAd, FALSE); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - - MT_ATEUpdateRxStatistic(pAd, TESTMODE_RESET_CNT, NULL); - /* - * Backup original CRs and change to ATE mode specific CR setting, - * restore it back when back to normal mode - */ - mt_ate_mac_cr_backup_and_set(pAd); - - /* Common Part */ - /* ATECtrl->en_log = fATE_LOG_TXDUMP; */ - ATECtrl->en_log = 0; - ATECtrl->verify_mode = HQA_VERIFY; - ATECtrl->cmd_expire = RTMPMsecsToJiffies(3000); - RTMP_OS_INIT_COMPLETION(&ATECtrl->cmd_done); - ATECtrl->TxPower0 = pAd->EEPROMImage[TX0_G_BAND_TARGET_PWR]; - ATECtrl->TxPower1 = pAd->EEPROMImage[TX1_G_BAND_TARGET_PWR]; - NdisZeroMemory(ATECtrl->log_dump, - sizeof(ATECtrl->log_dump[0]) * ATE_LOG_TYPE_NUM); - MT_ATEMPSInit(pAd); - NdisZeroMemory(ATECtrl->pfmu_info, - sizeof(ATECtrl->pfmu_info[0]) * ATE_BFMU_NUM); -#ifdef CONFIG_QA - MtAsicGetRxStat(pAd, HQA_RX_RESET_PHY_COUNT); - MtAsicGetRxStat(pAd, HQA_RX_RESET_MAC_COUNT); -#endif -#ifdef ATE_TXTHREAD - Ret = TESTMODE_TXTHREAD_INIT(pAd, 0); - - if (Ret) - goto err3; -#endif /* ATE_TXTHREAD */ - - MtATESetMacTxRx(pAd, ASIC_MAC_RX, FALSE, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) - MtATESetMacTxRx(pAd, ASIC_MAC_RX, FALSE, TESTMODE_BAND1); - - /* Rx filter */ - os_zero_mem(&rx_filter, sizeof(rx_filter)); - rx_filter.bPromiscuous = FALSE; - rx_filter.bFrameReport = TRUE; - rx_filter.filterMask = - RX_NDPA | RX_NOT_OWN_BTIM | RX_NOT_OWN_UCAST | RX_RTS | RX_CTS | - RX_CTRL_RSV | RX_BC_MC_DIFF_BSSID_A2 | RX_BC_MC_DIFF_BSSID_A3 | - RX_BC_MC_OWN_MAC_A3 | RX_PROTOCOL_VERSION | RX_FCS_ERROR; - rx_filter.u1BandIdx = TESTMODE_BAND0; - Ret = MtATESetRxFilter(pAd, rx_filter); - - if (IS_ATE_DBDC(pAd)) { - rx_filter.u1BandIdx = TESTMODE_BAND1; - Ret = MtATESetRxFilter(pAd, rx_filter); - } - - /* Stop send TX packets */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_STOP_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - /* Disable TX PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, FALSE); - Ret = if_ops->init(pAd); - Ret += if_ops->clean_trx_q(pAd); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) { - /* WifiSysApLinkUp(pAd, &pAd->ApCfg.MBSSID[IdBss].wdev); */ - pAd->ApCfg.MBSSID[IdBss].wdev.protection = 0; - } - } - } -#endif - AsicSetWPDMA(pAd, PDMA_TX_RX, TRUE); -#ifdef CONFIG_AP_SUPPORT - APStop(pAd, pMbss, AP_BSS_OPER_ALL); -#endif /* CONFIG_AP_SUPPORT */ - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); - - if (Ret) - goto err0; - - /* MtTestModeWTBL2Update(pAd, 0); */ - RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled); - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY); - - /* call wdev_do_open must behind ATE status be set */ - ATECtrl->Mode = ATE_START; - if (IS_ATE_DBDC(pAd)) - TESTMODE_SET_PARAM(ATECtrl, TESTMODE_BAND1, Mode, ATE_START); - - Ret = mt_ate_init_wdev(pAd, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) { - Ret = MT_ATEInitBandInfo(pAd, TESTMODE_BAND1); - Ret += mt_ate_init_wdev(pAd, TESTMODE_BAND1); - } - -#if defined(MT7615) || defined(MT7622) - /* Tx Power related Status Initialization - Disable TX power related behavior when enter test mode */ - ATECtrl->fgTxPowerSKUEn = FALSE; - ATECtrl->fgTxPowerPercentageEn = FALSE; - ATECtrl->fgTxPowerBFBackoffEn = FALSE; - ATECtrl->PercentageLevel = 100; -#ifdef DBDC_MODE - if (IS_ATE_DBDC(pAd)) { - Info->fgTxPowerSKUEn = FALSE; - Info->fgTxPowerPercentageEn = FALSE; - Info->fgTxPowerBFBackoffEn = FALSE; - Info->PercentageLevel = 100; - } -#endif /* DBDC_MODE */ - - /* Disable Tx Power related feature for ATE mode */ -#ifdef CONFIG_HW_HAL_OFFLOAD - /* SKU */ - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_SINGLE_SKU, FALSE); - /* Power Percentage */ - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_POWER_PERCENTAGE, FALSE); - /* Power Drop */ - ATEOp->SetPowerDropLevel(pAd, 100); - /* BF Backoff */ - ATEOp->SetCfgOnOff(pAd, EXT_CFG_ONOFF_BF_BACKOFF, FALSE); -#endif /* CONFIG_HW_HAL_OFFLOAD */ -#else -#endif /* defined(MT7615) || defined(MT7622) */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wdev_idx:%u\n", __func__, ATECtrl->wdev_idx)); -#ifdef DBDC_MODE - if (IS_ATE_DBDC(pAd)) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wdev_idx:%u\n", __func__, Info->wdev_idx)); -#endif /* DBDC_MODE */ - - return Ret; - -#ifdef ATE_TXTHREAD -err3: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: initial value fail, ret:%d\n", __func__, Ret)); - ATECtrl->Mode = ATE_STOP; - MT_ATEReleaseLogDump(pAd); -#endif /* ATE_TXTHREAD */ -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): if init fail, ret:%d\n", __func__, Ret)); -err2: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate test packet fail at pakcet\n", __func__)); - - return Ret; -} - -static INT32 MT_ATEStop(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0; - MT_RX_FILTER_CTRL_T rx_filter; -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss; - INT32 MaxNumBss = - pAd->ApCfg - .BssidNum; /* TODO: Delete after merge MT_ATEStop with Windows Test Mode */ - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; -#endif - PNDIS_PACKET *pkt_skb = NULL; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if ((ATECtrl->Mode & ATE_STOP) || !(ATECtrl->Mode & ATE_START)) - goto err2; - - mt_ate_mac_cr_restore(pAd); - - if (ATECtrl->Mode & ATE_FFT) { - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - Ret = ATEOp->SetFFTMode(pAd, 0); - Ret += MtCmdRfTestSwitchMode(pAd, OPERATION_NORMAL_MODE, 0, - RF_TEST_DEFAULT_RESP_LEN); - /* For FW to switch back to normal mode stable time */ - mdelay(2000); - - if (Ret) - goto err0; - - ATECtrl->Mode &= ~ATE_FFT; - } - - if (ATECtrl->Mode & fATE_IN_RFTEST) { - Ret += MtCmdRfTestSwitchMode(pAd, OPERATION_NORMAL_MODE, 0, - RF_TEST_DEFAULT_RESP_LEN); - /* For FW to switch back to normal mode stable time */ - mdelay(2000); - - if (Ret) - goto err0; - } - - /* MT76x6 Test Mode Freqency offset restore*/ - if (ATECtrl->en_man_set_freq) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Manual Set Frequency Restore\n")); - MtTestModeRestoreCr(pAd, FREQ_OFFSET_MANUAL_ENABLE); - MtTestModeRestoreCr(pAd, FREQ_OFFSET_MANUAL_VALUE); - ATECtrl->en_man_set_freq = 0; - } - - os_zero_mem(&rx_filter, sizeof(rx_filter)); - rx_filter.bPromiscuous = FALSE; - rx_filter.bFrameReport = FALSE; - rx_filter.filterMask = - RX_NDPA | RX_NOT_OWN_BTIM | RX_NOT_OWN_UCAST | RX_RTS | RX_CTS | - RX_CTRL_RSV | RX_BC_MC_DIFF_BSSID_A2 | RX_BC_MC_DIFF_BSSID_A3 | - RX_BC_MC_OWN_MAC_A3 | RX_PROTOCOL_VERSION | RX_FCS_ERROR; - rx_filter.u1BandIdx = 0; - Ret = MtATESetRxFilter(pAd, rx_filter); - - if (IS_ATE_DBDC(pAd)) { - rx_filter.u1BandIdx = 1; - Ret = MtATESetRxFilter(pAd, rx_filter); - } - - MT_ATEReleaseLogDump(pAd); - MT_ATEMPSRelease(pAd); - - /* Release skb */ - pkt_skb = &ATECtrl->pkt_skb; - - if (*pkt_skb) { - RELEASE_NDIS_PACKET(pAd, *pkt_skb, NDIS_STATUS_SUCCESS); - *pkt_skb = NULL; - } - -#ifdef DBDC_MODE - if (IS_ATE_DBDC(pAd)) { - pkt_skb = &ATECtrl->band_ext[TESTMODE_BAND1 - 1].pkt_skb; - - if (*pkt_skb) { - RELEASE_NDIS_PACKET(pAd, *pkt_skb, NDIS_STATUS_SUCCESS); - *pkt_skb = NULL; - } - } -#endif /*DBDC_MODE */ -#ifdef ATE_TXTHREAD - Ret = TESTMODE_TXTHREAD_RELEASE(pAd, 0); - msleep(2); -#endif /* ATE_TXTHREAD */ - - if (if_ops->clean_trx_q) - Ret = if_ops->clean_trx_q(pAd); - - if (if_ops->ate_leave) - Ret += if_ops->ate_leave(pAd); - - if (Ret) - goto err1; - - Ret = mt_ate_release_wdev(pAd, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) { - Ret = mt_ate_release_wdev(pAd, TESTMODE_BAND1); - Ret += MT_ATEReleaseBandInfo(pAd, TESTMODE_BAND1); - } - - NICInitializeAdapter(pAd); - - /* RTMPEnableRxTx(pAd); */ - if (pAd->CommonCfg.bTXRX_RXV_ON) { - MtATESetMacTxRx(pAd, ASIC_MAC_TXRX_RXV, TRUE, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) - MtATESetMacTxRx(pAd, ASIC_MAC_TXRX_RXV, TRUE, - TESTMODE_BAND1); - } else { - /* Normal mode enabled RXV and interface down up will crash if disalbe it */ - MtATESetMacTxRx(pAd, ASIC_MAC_TXRX_RXV, TRUE, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) - MtATESetMacTxRx(pAd, ASIC_MAC_TXRX_RXV, TRUE, - TESTMODE_BAND1); - } - -#ifdef ARBITRARY_CCK_OFDM_TX - if (IS_MT7615(pAd)) { - MtATEInitCCK_OFDM_Path(pAd, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) - MtATEInitCCK_OFDM_Path(pAd, TESTMODE_BAND1); - } -#endif - RTMP_OS_EXIT_COMPLETION(&ATECtrl->cmd_done); - ATECtrl->Mode = ATE_STOP; - TESTMODE_SET_PARAM(ATECtrl, TESTMODE_BAND1, Mode, ATE_STOP); - MtCmdATEModeCtrl(pAd, 0); /* Remind FW that Disable ATE mode */ - RTMPSetTimer(&pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV); - -#ifdef CONFIG_AP_SUPPORT - APStartUp(pAd, pMbss, AP_BSS_OPER_ALL); -#endif /* CONFIG_AP_SUPPROT */ - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_START_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - - if (Ret) - goto err1; - - return Ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: RF-test stop fail, ret:%d\n", __func__, Ret)); -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: if stop fail, ret:%d\n", __func__, Ret)); -err2: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ATE has already stopped ret:%d\n", __func__, Ret)); - - ATECtrl->Mode = ATE_STOP; - return Ret; -} -#else -static INT32 MT_ATEStart(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; -#ifdef CAL_FREE_IC_SUPPORT - BOOLEAN bCalFree = 0; -#endif /* CAL_FREE_IC_SUPPORT */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: 2\n", __func__)); -#ifdef CAL_FREE_IC_SUPPORT - RTMP_CAL_FREE_IC_CHECK(pAd, bCalFree); - - if (bCalFree) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Cal Free IC!!\n")); - RTMP_CAL_FREE_DATA_GET(pAd); - } else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Non Cal Free IC!!\n")); - -#endif /* CAL_FREE_IC_SUPPORT */ - - /* MT7636 Test Mode Freqency offset restore*/ - if (ATECtrl->en_man_set_freq) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Manual Set Frequency Restore\n")); - MtTestModeRestoreCr(pAd, FREQ_OFFSET_MANUAL_ENABLE); - MtTestModeRestoreCr(pAd, FREQ_OFFSET_MANUAL_VALUE); - ATECtrl->en_man_set_freq = 0; - } - - if (ATECtrl->Mode & fATE_TXCONT_ENABLE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Stop Continuous Tx\n", __func__)); - ATEOp->StopContinousTx(pAd, 0); - } - - if (ATECtrl->Mode & fATE_TXCARRSUPP_ENABLE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Stop Carrier Suppression Test\n", __func__)); - ATEOp->StopTxTone(pAd); - } - - /* Reset ATE TX/RX Counter */ - ATECtrl->TxLength = 1024; - ATECtrl->QID = QID_AC_BE; - ATECtrl->TxPower0 = 0x10; - ATECtrl->TxPower1 = 0x10; - ATECtrl->en_man_set_freq = 0; - ATECtrl->TxDoneCount = 0; - ATECtrl->Mode = ATE_START; - MtAsicGetRxStat(pAd, HQA_RX_RESET_PHY_COUNT); - MtAsicGetRxStat(pAd, HQA_RX_RESET_MAC_COUNT); - /* MtTestModeWTBL2Update(pAd, 0); */ - return Ret; -} - -static INT32 MT_ATEStop(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MtATESetMacTxRx(pAd, ASIC_MAC_RXV, FALSE, TESTMODE_BAND0); - - /* RTMPEnableRxTx(pAd); */ - - /* MT7636 Test Mode Freqency offset restore*/ - if (ATECtrl->en_man_set_freq) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Manual Set Frequency Restore\n")); - MtTestModeRestoreCr(pAd, FREQ_OFFSET_MANUAL_ENABLE); - MtTestModeRestoreCr(pAd, FREQ_OFFSET_MANUAL_VALUE); - ATECtrl->en_man_set_freq = 0; - } - - ATECtrl->Mode = ATE_STOP; - return Ret; -} -#endif - -INT mt_ate_set_tmac_info(RTMP_ADAPTER *pAd, TMAC_INFO *tmac_info, - UINT32 band_idx) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - UCHAR *addr1 = NULL; - UCHAR phy_mode = 0; - UCHAR mcs = 0; - UCHAR vht_nss = 1; - UINT32 ant_sel = 0; - INT wdev_idx = 0; - UINT32 pkt_tx_time = tx_time_param->pkt_tx_time; - UINT8 need_qos = tx_time_param->pkt_need_qos; - UINT8 need_amsdu = tx_time_param->pkt_need_amsdu; - UINT8 need_ampdu = tx_time_param->pkt_need_ampdu; -#if !defined(COMPOS_TESTMODE_WIN) - struct wifi_dev *pWdev = NULL; -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - UCHAR WmmIdx; -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - BOOLEAN fgSPE; - - wdev_idx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wdev_idx); - pWdev = pAd->wdev_list[wdev_idx]; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: wdev_idx=%d\n", __func__, wdev_idx)); - - if (!pWdev) - goto err0; - -#endif - TESTMODE_SET_PARAM(ATECtrl, band_idx, HLen, LENGTH_802_11); - addr1 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr1); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:: addr1: %02x:%02x:%02x:%02x:%02x:%02x\n", __func__, - PRINT_MAC(addr1))); - ant_sel = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxAntennaSel); - phy_mode = TESTMODE_GET_PARAM(ATECtrl, band_idx, PhyMode); - mcs = TESTMODE_GET_PARAM(ATECtrl, band_idx, Mcs); - vht_nss = TESTMODE_GET_PARAM(ATECtrl, band_idx, Nss); - /* Fill TMAC_INFO */ - NdisZeroMemory(tmac_info, sizeof(*tmac_info)); - tmac_info->LongFmt = TRUE; - - if (pkt_tx_time > 0) { - tmac_info->WifiHdrLen = (UINT8)tx_time_param->pkt_hdr_len; - tmac_info->PktLen = (UINT16)tx_time_param->pkt_msdu_len; - tmac_info->NeedTrans = FALSE; - - if (need_qos | need_amsdu | need_ampdu) { - tmac_info->HdrPad = 2; - tmac_info->BmcPkt = FALSE; - tmac_info->UserPriority = 0; - } else { - tmac_info->HdrPad = 0; - tmac_info->BmcPkt = IS_BM_MAC_ADDR(addr1); - tmac_info->UserPriority = 0; - } - } else { - tmac_info->WifiHdrLen = - (UINT8)TESTMODE_GET_PARAM(ATECtrl, band_idx, HLen); - tmac_info->HdrPad = 0; - tmac_info->PktLen = - (UINT16)TESTMODE_GET_PARAM(ATECtrl, band_idx, TxLength); - tmac_info->BmcPkt = IS_BM_MAC_ADDR(addr1); - } - - /* no ack */ - if ((pkt_tx_time > 0) && (need_ampdu)) - tmac_info->bAckRequired = 1; - else - tmac_info->bAckRequired = 0; - -#if !defined(COMPOS_TESTMODE_WIN) - tmac_info->FrmType = FC_TYPE_DATA; - tmac_info->SubType = SUBTYPE_QDATA; - tmac_info->OwnMacIdx = pWdev->OmacIdx; -#else - tmac_info->OwnMacIdx = 0; -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: tmac_info->OwnMacIdx=%d\n", __func__, - tmac_info->OwnMacIdx)); - /* no frag */ - tmac_info->FragIdx = 0; - /* no protection */ - tmac_info->CipherAlg = 0; - /* TX Path setting */ - tmac_info->VhtNss = vht_nss ? vht_nss : 1; - tmac_info->AntPri = 0; - tmac_info->SpeEn = 0; - - /* Timing Measure setting */ - if ((pAd->pTmrCtrlStruct != NULL) && - (pAd->pTmrCtrlStruct->TmrEnable == TMR_INITIATOR)) - tmac_info->TimingMeasure = 1; - - /* band_idx for TX ring choose */ - tmac_info->band_idx = band_idx; - - switch (ant_sel) { - case 0: /* Both */ - tmac_info->AntPri = 0; - tmac_info->SpeEn = 1; - break; - - case 1: /* TX0 */ - tmac_info->AntPri = 0; - tmac_info->SpeEn = 0; - break; - - case 2: /* TX1 */ - tmac_info->AntPri = 2; /* b'010 */ - tmac_info->SpeEn = 0; - break; - } - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - /* Need to modify the way of wmm_idx getting */ - WmmIdx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wmm_idx); - tmac_info->WmmSet = WmmIdx; - - if (IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd) || IS_MT7663(pAd)) { - if (ant_sel & ATE_ANT_USER_SEL) { - ant_sel &= ~ATE_ANT_USER_SEL; - tmac_info->AntPri = ant_sel; - } else { - INT map_idx = 0; - - for (map_idx = 0; - map_idx < ARRAY_SIZE(ant_to_spe_idx_map); - map_idx++) { - if (ant_sel == - ant_to_spe_idx_map[map_idx].ant_sel) - break; - } - - if (map_idx == ARRAY_SIZE(ant_to_spe_idx_map)) - tmac_info->AntPri = 0; - else - tmac_info->AntPri = - ant_to_spe_idx_map[map_idx].spe_idx; - } - -#if defined(TXBF_SUPPORT) && defined(MT_MAC) - - if (g_EBF_certification) { - if (BF_ON_certification) { - tmac_info->AntPri = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("tmac_info->AntPri = 0\n")); - } else { - tmac_info->AntPri = 24; /* 24 */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("tmac_info->AntPri = 24\n")); - } - } - -#endif /* defined(TXBF_SUPPORT) && defined(MT_MAC) */ - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:: ant_sel:%x, ant_pri:%u, vht_nss:%x, TxD.VhtNss:%x\n", - __func__, ant_sel, tmac_info->AntPri, vht_nss, - tmac_info->VhtNss)); - } - -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - /* Fill transmit setting */ - tmac_info->TxRadioSet.RateCode = mcs; - tmac_info->TxRadioSet.CurrentPerPktBW = - TESTMODE_GET_PARAM(ATECtrl, band_idx, PerPktBW); - tmac_info->TxRadioSet.ShortGI = - TESTMODE_GET_PARAM(ATECtrl, band_idx, Sgi); - tmac_info->TxRadioSet.Stbc = - TESTMODE_GET_PARAM(ATECtrl, band_idx, Stbc); - tmac_info->TxRadioSet.PhyMode = phy_mode; - tmac_info->TxRadioSet.Ldpc = - TESTMODE_GET_PARAM(ATECtrl, band_idx, Ldpc); - - tmac_info->QueIdx = - dmac_wmm_swq_2_hw_ac_que[tmac_info->WmmSet][TESTMODE_GET_PARAM( - ATECtrl, band_idx, QID)]; - - if ((pkt_tx_time > 0) && (need_ampdu)) { - tmac_info->Wcid = ATECtrl->wcid_ref; - tmac_info->FixRate = 0; - tmac_info->BaDisable = FALSE; - tmac_info->RemainTxCnt = 1; - } else { - tmac_info->Wcid = 0; - tmac_info->FixRate = 1; - tmac_info->BaDisable = TRUE; - tmac_info->RemainTxCnt = 15; - } - - if (ATECtrl->txs_enable) { - tmac_info->TxS2Host = TRUE; - tmac_info->TxS2Mcu = FALSE; - tmac_info->TxSFmt = 1; - } - - if (phy_mode == MODE_CCK) { - tmac_info->TxRadioSet.Premable = LONG_PREAMBLE; - - if (mcs == MCS_9) { - tmac_info->TxRadioSet.RateCode = 0; - tmac_info->TxRadioSet.Premable = SHORT_PREAMBLE; - } else if (mcs == MCS_10) { - tmac_info->TxRadioSet.RateCode = 1; - tmac_info->TxRadioSet.Premable = SHORT_PREAMBLE; - } else if (mcs == MCS_11) { - tmac_info->TxRadioSet.RateCode = 2; - tmac_info->TxRadioSet.Premable = SHORT_PREAMBLE; - } - } -#ifdef TXBF_SUPPORT - else { - UCHAR iTxBf = TESTMODE_GET_PARAM(ATECtrl, band_idx, iTxBf); - UCHAR eTxBf = TESTMODE_GET_PARAM(ATECtrl, band_idx, eTxBf); - - if (iTxBf || eTxBf) { - tmac_info->TxRadioSet.ItxBFEnable = iTxBf; - tmac_info->TxRadioSet.EtxBFEnable = eTxBf; - } - } - -#endif /* TXBF_SUPPORT */ - tmac_info->Wcid = ATECtrl->wcid_ref; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: tmac_info->TxRadioSet.EtxBFEnable=%d, tmac_info->Wcid=%d\n", - __func__, tmac_info->TxRadioSet.EtxBFEnable, tmac_info->Wcid)); - - if (tmac_info->AntPri >= 24) - fgSPE = TRUE; - else - fgSPE = FALSE; - -#ifdef SINGLE_SKU_V2 - /* Update Power offset according to Band, Phymode, MCS, BW, Nss, SPE */ - tmac_info->PowerOffset = SKUTxPwrOffsetGet( - pAd, band_idx, TESTMODE_GET_PARAM(ATECtrl, band_idx, PerPktBW), - TESTMODE_GET_PARAM(ATECtrl, band_idx, PhyMode), - TESTMODE_GET_PARAM(ATECtrl, band_idx, Mcs), - TESTMODE_GET_PARAM(ATECtrl, band_idx, Nss), fgSPE); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: tmac_info->PowerOffset = 0x%x (%d)\n", __func__, - tmac_info->PowerOffset, tmac_info->PowerOffset)); - - if (tmac_info->PowerOffset < -16) - tmac_info->PowerOffset = -16; - else if (tmac_info->PowerOffset > 15) - tmac_info->PowerOffset = 15; -#endif /* SINGLE_SKU_V2 */ - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - if ((pkt_tx_time > 0) && (need_ampdu)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: tmac_info->Wcid/Wmmset/QueIdx=%d/%d/%d\n", - __func__, tmac_info->Wcid, tmac_info->WmmSet, - tmac_info->QueIdx)); - } -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - return Ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: Cannot get Wdev by idx:%d\n", __func__, wdev_idx)); - return -1; -} - -UINT32 mt_ate_get_txlen_by_pkt_tx_time(struct _ATE_CTRL *ATECtrl, - UINT32 band_idx) -{ - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - UINT32 txlen = 0; - UINT32 hlen = 0; - UINT32 tx_data_rate = 0; - UINT32 pkt_tx_time = 0; - UCHAR phy_mode = 0; - UCHAR mcs = 0, mcs_1ss, nss = 1; - UCHAR bw = 0, bw_fact = 1; - UCHAR sgi = 0; - - /* - * 1. Get the tx data rate - * 2. Get the packet tx time - * 3. Calculate the packet length by tx_data_rate and packet_tx_time - * 4. Return txlen - */ - pkt_tx_time = tx_time_param->pkt_tx_time; - hlen = TESTMODE_GET_PARAM(ATECtrl, band_idx, HLen); - phy_mode = TESTMODE_GET_PARAM(ATECtrl, band_idx, PhyMode); - mcs = TESTMODE_GET_PARAM(ATECtrl, band_idx, Mcs); - bw = TESTMODE_GET_PARAM(ATECtrl, band_idx, BW); - sgi = TESTMODE_GET_PARAM(ATECtrl, band_idx, Sgi); - mcs_1ss = mcs; - - if (phy_mode == MODE_CCK) { /* Legacy CCK mode */ - UINT8 cck_map_idx = 0; - - for (cck_map_idx = 0; - cck_map_idx < ARRAY_SIZE(cck_mode_mcs_to_data_rate_map); - cck_map_idx++) { - if (mcs_1ss == - cck_mode_mcs_to_data_rate_map[cck_map_idx].mcs) - break; - } - - if (cck_map_idx == ARRAY_SIZE(cck_mode_mcs_to_data_rate_map)) { - tx_data_rate = - cck_mode_mcs_to_data_rate_map[0].tx_data_rate; - mcs = mcs_1ss = cck_mode_mcs_to_data_rate_map[0].mcs; - TESTMODE_SET_PARAM(ATECtrl, band_idx, Mcs, mcs); - } else - tx_data_rate = - cck_mode_mcs_to_data_rate_map[cck_map_idx] - .tx_data_rate; - - /* Transfer from bit to byte with expected tx time */ - txlen = pkt_tx_time * tx_data_rate / 1000 / 8; - } else if (phy_mode == MODE_OFDM) { /* Legacy OFDM mode */ - UINT8 ofdm_map_idx = 0; - - for (ofdm_map_idx = 0; - ofdm_map_idx < ARRAY_SIZE(ofdm_mode_mcs_to_data_rate_map); - ofdm_map_idx++) { - if (mcs_1ss == - ofdm_mode_mcs_to_data_rate_map[ofdm_map_idx].mcs) - break; - } - - if (ofdm_map_idx == - ARRAY_SIZE(ofdm_mode_mcs_to_data_rate_map)) { - tx_data_rate = - ofdm_mode_mcs_to_data_rate_map[0].tx_data_rate; - mcs = mcs_1ss = ofdm_mode_mcs_to_data_rate_map[0].mcs; - TESTMODE_SET_PARAM(ATECtrl, band_idx, Mcs, mcs); - } else - tx_data_rate = - ofdm_mode_mcs_to_data_rate_map[ofdm_map_idx] - .tx_data_rate; - - /* Transfer from bit to byte with expected tx time */ - txlen = pkt_tx_time * tx_data_rate / 1000 / 8; - } else if (phy_mode == MODE_HTMIX || - phy_mode == MODE_HTGREENFIELD) { /* HT mode */ - UINT8 n_map_idx = 0; - - if (mcs != MCS_32) { - mcs_1ss = mcs % 8; - nss = (mcs / 8) + 1; - bw_fact = (bw == BW_40) ? 2 : 1; - } else { - bw_fact = 1; - nss = 1; - } - - for (n_map_idx = 0; - n_map_idx < ARRAY_SIZE(n_mode_mcs_to_data_rate_map); - n_map_idx++) { - if (mcs_1ss == - n_mode_mcs_to_data_rate_map[n_map_idx].mcs) - break; - } - - if (n_map_idx == ARRAY_SIZE(n_mode_mcs_to_data_rate_map)) { - tx_data_rate = - n_mode_mcs_to_data_rate_map[0].tx_data_rate; - mcs = mcs_1ss = n_mode_mcs_to_data_rate_map[0].mcs; - TESTMODE_SET_PARAM(ATECtrl, band_idx, Mcs, mcs); - } else - tx_data_rate = n_mode_mcs_to_data_rate_map[n_map_idx] - .tx_data_rate; - - tx_data_rate = tx_data_rate * nss * bw_fact; - - if (sgi == 1) - tx_data_rate = (tx_data_rate / 9) * 10; - - /* Transfer from bit to byte with expected tx time */ - txlen = pkt_tx_time * tx_data_rate / 1000 / 8; - } else if (phy_mode == MODE_VHT) { /* VHT mode */ - UINT8 ac_map_idx = 0; - struct _ATE_DATA_RATE_MAP *vht_rate_map; - UINT32 array_cnt = 0; - - if (bw == BW_20) { - vht_rate_map = ac_mode_mcs_to_data_rate_map_bw20; - array_cnt = - ARRAY_SIZE(ac_mode_mcs_to_data_rate_map_bw20); - } else if (bw == BW_40) { - vht_rate_map = ac_mode_mcs_to_data_rate_map_bw40; - array_cnt = - ARRAY_SIZE(ac_mode_mcs_to_data_rate_map_bw40); - } else if (bw == BW_80) { - vht_rate_map = ac_mode_mcs_to_data_rate_map_bw80; - array_cnt = - ARRAY_SIZE(ac_mode_mcs_to_data_rate_map_bw80); - } else if (bw == BW_160) { - vht_rate_map = ac_mode_mcs_to_data_rate_map_bw160; - array_cnt = - ARRAY_SIZE(ac_mode_mcs_to_data_rate_map_bw160); - } else { - vht_rate_map = ac_mode_mcs_to_data_rate_map_bw20; - array_cnt = - ARRAY_SIZE(ac_mode_mcs_to_data_rate_map_bw20); - } - - for (ac_map_idx = 0; ac_map_idx < array_cnt; ac_map_idx++) { - if (mcs == vht_rate_map[ac_map_idx].mcs) - break; - } - - if (ac_map_idx == array_cnt) { - tx_data_rate = vht_rate_map[0].tx_data_rate; - mcs = mcs_1ss = vht_rate_map[0].mcs; - TESTMODE_SET_PARAM(ATECtrl, band_idx, Mcs, mcs); - } else - tx_data_rate = vht_rate_map[ac_map_idx].tx_data_rate; - - /* TODO: Need to check for SGI equation! */ - if (sgi == 1) - tx_data_rate = (tx_data_rate / 9) * 10; - - /* Transfer from bit to byte with expected tx time */ - txlen = pkt_tx_time * tx_data_rate / 10 / 8; - } - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: phy_mode=%d, mcs/mcs_1ss=%d/%d, nss=%d, bw/bw_fact=%d/%d, sgi=%d\n", - __func__, phy_mode, mcs, mcs_1ss, nss, bw, bw_fact, sgi)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: txlen=%d, pkt_tx_time=%d, tx_data_rate=%d\n", __func__, - txlen, pkt_tx_time, tx_data_rate)); - - if (phy_mode == MODE_VHT) { - if (txlen >= (MAX_VHT_MPDU_LEN * 64)) { - txlen = (MAX_VHT_MPDU_LEN * 64); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Expected txlen > VHT mode PPDU max length, reduce the txlen=%d\n", - __func__, txlen)); - } - } else if (phy_mode == MODE_HTMIX || phy_mode == MODE_HTGREENFIELD) { - if (txlen >= MAX_HT_AMPDU_LEN) { - txlen = MAX_HT_AMPDU_LEN; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Expected txlen > HT mode PPDU max length, reduce the txlen=%d\n", - __func__, txlen)); - } - } else if (phy_mode == MODE_OFDM) { - if (txlen >= MAX_MSDU_LEN) { - txlen = MAX_MSDU_LEN; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Expected txlen > OFDM mode PPDU max length, reduce the txlen=%d\n", - __func__, txlen)); - } - } else if (phy_mode == MODE_CCK) { - if (txlen >= MAX_MSDU_LEN) { - txlen = MAX_MSDU_LEN; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Expected txlen > CCK mode PPDU max length, reduce the txlen=%d\n", - __func__, txlen)); - } - } - - return txlen; -} - -UINT32 mt_ate_get_hlen_by_pkt_tx_time(struct _ATE_CTRL *ATECtrl, - UINT32 band_idx, UINT32 txlen, - BOOLEAN *need_qos, BOOLEAN *need_amsdu, - BOOLEAN *need_ampdu) -{ - UINT32 pkt_len = 0; - UINT32 hlen = 0; - UCHAR phy_mode = 0; - UCHAR use_data_frame = 1; - /* - * 1. Get the tx data rate - * 2. Check if need to send packet with AMPDU format - * 3. Check if need to send packet with AMSDU-in-AMPDU format - * 4. Return the expected packet header length by tx packet type - * if need to has QoS field and HTC field. - */ - phy_mode = TESTMODE_GET_PARAM(ATECtrl, band_idx, PhyMode); - pkt_len = txlen; - - if (pkt_len <= MIN_MSDU_LEN) { - use_data_frame = 0; - /* Here we need to go mgmt/ctrl frame mode */ - } else if (pkt_len <= MAX_MSDU_LEN) { - if (phy_mode == MODE_VHT) - *need_qos = 1; - } else if (pkt_len <= DEFAULT_MPDU_LEN) { - if (phy_mode == MODE_HTMIX || phy_mode == MODE_HTGREENFIELD) { - *need_amsdu = 1; - *need_qos = 1; - } else if (phy_mode == MODE_VHT) - *need_qos = 1; - else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Can't generate frame with such length for CCK/OFDM mode!!\n", - __func__)); - } - } else if (pkt_len <= MAX_VHT_MPDU_LEN) { - if (phy_mode == MODE_VHT) - *need_qos = 1; - else if (phy_mode == MODE_HTMIX || - phy_mode == MODE_HTGREENFIELD) { - *need_ampdu = 1; - *need_amsdu = 1; - *need_qos = 1; - } else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Can't generate frame with such length for CCK/OFDM mode!!\n", - __func__)); - } - } else { - if ((phy_mode == MODE_VHT) || - (phy_mode == MODE_HTMIX || phy_mode == MODE_HTGREENFIELD)) { - *need_ampdu = 1; - *need_amsdu = 1; - *need_qos = 1; - } else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Can't generate frame with such length for CCK/OFDM mode!!\n", - __func__)); - } - } - - hlen = TESTMODE_GET_PARAM(ATECtrl, band_idx, HLen); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: original header len=%d\n", __func__, hlen)); - - if (use_data_frame) { - hlen = DEFAULT_MAC_HDR_LEN; - - if (*need_qos) - hlen = QOS_MAC_HDR_LEN; - } - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: pkt_len=%d, need_qos/amsdu/ampdu/dataframe/hlen=%d/%d/%d/%d/%d\n", - __func__, pkt_len, *need_qos, *need_amsdu, *need_ampdu, - use_data_frame, hlen)); - return hlen; -} - -INT mt_ate_wtbl_cfg(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT ret; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - UINT8 need_qos, need_amsdu, need_ampdu; - UCHAR phy_mode, mcs, nss, bw, sgi, stbc; - struct cmd_wtbl_dw_mask_set dw_set[7]; - UINT32 wtbl_rate = 0, ant_sel = 0; - need_qos = tx_time_param->pkt_need_qos; - need_amsdu = tx_time_param->pkt_need_amsdu; - need_ampdu = tx_time_param->pkt_need_ampdu; - phy_mode = TESTMODE_GET_PARAM(ATECtrl, band_idx, PhyMode); - mcs = TESTMODE_GET_PARAM(ATECtrl, band_idx, Mcs); - nss = TESTMODE_GET_PARAM(ATECtrl, band_idx, Nss); - bw = TESTMODE_GET_PARAM(ATECtrl, band_idx, BW); - sgi = TESTMODE_GET_PARAM(ATECtrl, band_idx, Sgi); - stbc = TESTMODE_GET_PARAM(ATECtrl, band_idx, Stbc); - ant_sel = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxAntennaSel); - NdisZeroMemory((UCHAR *)&dw_set[0], sizeof(dw_set)); - /* Decide TxCap, HT/VHT/LPDC (DW2) */ - dw_set[0].ucWhichDW = 2; - dw_set[0].u4DwMask = 0x9FFFFFFF; - - switch (phy_mode) { - case MODE_HTMIX: - case MODE_HTGREENFIELD: - dw_set[0].u4DwValue = (0x1 << 29); - break; - - case MODE_VHT: - dw_set[0].u4DwValue = (0x3 << 29); - break; - - default: - dw_set[0].u4DwValue = 0; - break; - }; - - /* Decide AF/I_PSM (DW3) */ - dw_set[1].ucWhichDW = 3; - - dw_set[1].u4DwMask = 0xD8E0F000; - - if (need_ampdu) { -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - - if (IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd) || - IS_MT7663(pAd)) { - if (ant_sel & ATE_ANT_USER_SEL) - ant_sel &= ~ATE_ANT_USER_SEL; - else { - INT map_idx = 0; - - for (map_idx = 0; - map_idx < ARRAY_SIZE(ant_to_spe_idx_map); - map_idx++) { - if (ant_sel == - ant_to_spe_idx_map[map_idx].ant_sel) - break; - } - - if (map_idx == ARRAY_SIZE(ant_to_spe_idx_map)) - ant_sel = 0; - else - ant_sel = ant_to_spe_idx_map[map_idx] - .spe_idx; - } - } - -#endif /* defined(MT7615) || defined(MT7622) */ - dw_set[1].u4DwValue = - (0x1 << 29) | (0x7 << 24) | ((ant_sel & 0x1F) << 16) | - ((ant_sel & 0x7) << 9) | ((ant_sel & 0x7) << 6) | - ((ant_sel & 0x7) << 3) | ((ant_sel & 0x7) << 0); - } else - dw_set[1].u4DwValue = 0; - - /* Decide BA-enable/BA-winsize/BA-bitmap (DW4) */ - dw_set[2].ucWhichDW = 4; - dw_set[2].u4DwMask = 0x0; - - if (need_ampdu) - dw_set[2].u4DwValue = 0xFFFFFFFF; - else - dw_set[2].u4DwValue = 0x0; - - /* Decide FCAP/G2/G4/G8/G16/QoS-enable (DW5 )*/ - dw_set[3].ucWhichDW = 5; - dw_set[3].u4DwMask = 0xFFF7C0FF; - - switch (bw) { - case BW_20: - dw_set[3].u4DwValue = (bw << 12) | (sgi << 8); - break; - - case BW_40: - dw_set[3].u4DwValue = (bw << 12) | (sgi << 9); - break; - - case BW_80: - dw_set[3].u4DwValue = (bw << 12) | (sgi << 10); - break; - - case BW_160: - dw_set[3].u4DwValue = (bw << 12) | (sgi << 11); - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Can't find such bw, use default\n", __func__)); - dw_set[3].u4DwValue = (BW_20 << 12) | (sgi << 8); - break; - } - - if (phy_mode == MODE_HTMIX || phy_mode == MODE_HTGREENFIELD || - phy_mode == MODE_VHT) { - /* QoS enable by phymode */ - dw_set[3].u4DwValue |= (1 << 19); - } - - /* Use phymode/mcs/nss/STBC decide RateInfo (DW6~8) */ - /* step 1. depends on ATE command tx rate, convert to 12-bits WTBL-rate value */ - /* wtbl_rate = ((STBC & 0x1) << 11) | ((Nss & 0x3)<< 9) | ((phy_mode & 0x3) << 6) | ((mcs & 0x3f) << 0) */ - if (phy_mode == MODE_CCK) - wtbl_rate = - tx_rate_to_tmi_rate(phy_mode, mcs, (nss + 1), stbc, 1); - else - wtbl_rate = - tx_rate_to_tmi_rate(phy_mode, mcs, (nss + 1), stbc, 0); - - /* step 2. set WTBL RAW DW 6: ((rate3 & 0xff)<< 24) | ((rate2 & 0xfff) << 12) | ((rate1 & 0xfff) << 0) */ - dw_set[4].ucWhichDW = 6; - dw_set[4].u4DwMask = 0x0; - dw_set[4].u4DwValue = ((wtbl_rate & 0xFF) << 24) | - ((wtbl_rate & 0xFFF) << 12) | - ((wtbl_rate & 0xFFF) << 0); - dw_set[5].ucWhichDW = 7; - dw_set[5].u4DwMask = 0x0; - dw_set[5].u4DwValue = - ((wtbl_rate & 0xF) << 28) | ((wtbl_rate & 0xFFF) << 16) | - ((wtbl_rate & 0xFFF) << 4) | (((wtbl_rate & 0xF00) >> 8) << 0); - dw_set[6].ucWhichDW = 8; - dw_set[6].u4DwMask = 0x0; - dw_set[6].u4DwValue = ((wtbl_rate & 0xFFF) << 20) | - ((wtbl_rate & 0xFFF) << 8) | - (((wtbl_rate & 0xFF0) >> 4) << 0); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: phy_mode=%d, mcs=%d, nss=%d, stbc=%d, wtbl_rate=0x%x\n", - __func__, phy_mode, mcs, nss, stbc, wtbl_rate)); - ret = WtblResetAndDWsSet( - pAd, ATECtrl->wcid_ref, 1, - sizeof(dw_set) / sizeof(struct cmd_wtbl_dw_mask_set), dw_set); - return ret; -} - -INT32 mt_ate_ampdu_frame(RTMP_ADAPTER *pAd, UCHAR *buf, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - UCHAR *addr1, *addr2, *addr3; - UCHAR phy_mode; - UCHAR *tmac_info, *pheader, *payload, *frm_template; - UINT32 txlen, hlen; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->TXWISize; - UINT32 new_txlen, new_hlen; - UINT8 need_qos, need_amsdu, need_ampdu; - UINT32 per_mpdu_len = 0; - UINT8 ampdu_agg_cnt = 0; - phy_mode = TESTMODE_GET_PARAM(ATECtrl, band_idx, PhyMode); - new_txlen = tx_time_param->pkt_tx_len; - new_hlen = tx_time_param->pkt_hdr_len; - need_qos = tx_time_param->pkt_need_qos; - need_amsdu = tx_time_param->pkt_need_amsdu; - need_ampdu = tx_time_param->pkt_need_ampdu; - - if (phy_mode == MODE_VHT) - per_mpdu_len = (MAX_VHT_MPDU_LEN - - 100); /* include mac header length */ - else - per_mpdu_len = (DEFAULT_MPDU_LEN - - 100); /* include mac header length */ - - tx_time_param->pkt_msdu_len = per_mpdu_len; - ampdu_agg_cnt = new_txlen / per_mpdu_len; - - if (new_txlen % per_mpdu_len) - ampdu_agg_cnt++; - - tx_time_param->pkt_ampdu_cnt = ampdu_agg_cnt; - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - ret = mt_ate_ampdu_ba_limit(pAd, band_idx, ampdu_agg_cnt); - ret = mt_ate_set_sta_pause_cr(pAd, band_idx); -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - addr1 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr1); - addr2 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr2); - addr3 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr3); - txlen = tx_time_param->pkt_msdu_len; - hlen = tx_time_param->pkt_hdr_len; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(wcid:%d, txlen/hlen/buf=%d/%d/%p, pkt_tx_len/pkt_msdu_len/pkt_ampdu_cnt=%d/%d/%d)\n" - "\tDA: %02x:%02x:%02x:%02x:%02x:%02x\n" - "\tSA: %02x:%02x:%02x:%02x:%02x:%02x\n" - "\tBSSID: %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, ATECtrl->wcid_ref, txlen, hlen, buf, - tx_time_param->pkt_tx_len, tx_time_param->pkt_msdu_len, - tx_time_param->pkt_ampdu_cnt, PRINT_MAC(addr1), - PRINT_MAC(addr2), PRINT_MAC(addr3))); - tmac_info = buf; - pheader = (buf + tx_hw_hdr_len); - payload = (pheader + hlen); - NdisZeroMemory(buf, ATE_TESTPKT_LEN); -#ifdef TXBF_SUPPORT - { - UCHAR iTxBf = TESTMODE_GET_PARAM(ATECtrl, band_idx, iTxBf); - UCHAR eTxBf = TESTMODE_GET_PARAM(ATECtrl, band_idx, eTxBf); - - /* Use wcid 1~4 */ - if (iTxBf || eTxBf) { - if ((ATECtrl->wcid_ref > ATE_BFMU_NUM) || - (ATECtrl->wcid_ref < 1)) - ATECtrl->wcid_ref = ATE_BF_WCID; - - addr1 = ATECtrl->pfmu_info[ATECtrl->wcid_ref - 1].addr; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: DA: %02x:%02x:%02x:%02x:%02x:%02x, wcid=%u\n", - __func__, PRINT_MAC(addr1), ATECtrl->wcid_ref)); - } -#endif - frm_template = TESTMODE_GET_PARAM(ATECtrl, band_idx, TemplateFrame); - NdisMoveMemory(pheader, frm_template, hlen); - NdisMoveMemory(pheader + 4, addr1, MAC_ADDR_LEN); - NdisMoveMemory(pheader + 10, addr2, MAC_ADDR_LEN); - NdisMoveMemory(pheader + 16, addr3, MAC_ADDR_LEN); - ret = MtATEPayloadInit(pAd, payload, txlen - hlen, band_idx); -#if !defined(COMPOS_TESTMODE_WIN) - - if (ATECtrl->en_log & fATE_LOG_TXDUMP) { - INT i = 0; - PHEADER_802_11 hdr = (HEADER_802_11 *)pheader; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[TXCONTENT DUMP START]\n")); - dump_tmac_info(pAd, tmac_info); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[TXD RAW]: ")); - - for (i = 0; i < tx_hw_hdr_len; i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%04x", tmac_info[i])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nADDR1: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr1))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ADDR2: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr2))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ADDR3: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr3))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("FC: %04x\n", *(UINT16 *)(&hdr->FC))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFrom DS: %x\n", hdr->FC.FrDs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTo DS: %x\n", hdr->FC.ToDs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[CONTENT RAW]: ")); - - for (i = 0; i < (txlen - hlen); i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%02x", payload[i])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n[TXCONTENT DUMP END]\n")); - } - -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - TESTMODE_SET_PARAM(ATECtrl, band_idx, is_alloc_skb, 0); -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pheader, DIR_WRITE, FALSE); -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - MTMacInfoEndianChange(pAd, tmac_info, TYPE_TMACINFO, - sizeof(TMAC_TXD_L)); - -#endif -#endif - return ret; -} - -INT32 mt_ate_non_ampdu_frame(RTMP_ADAPTER *pAd, UCHAR *buf, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - UCHAR *tmac_info, *pheader, *payload, *addr1, *addr2, *addr3, - *frm_template; - UINT32 txlen, hlen; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->TXWISize; - addr1 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr1); - addr2 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr2); - addr3 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr3); - txlen = tx_time_param->pkt_msdu_len; - hlen = tx_time_param->pkt_hdr_len; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(wcid:%d, txlen/hlen/buf=%d/%d/%p, pkt_tx_len/pkt_msdu_len=%d/%d)\n" - "\tDA: %02x:%02x:%02x:%02x:%02x:%02x\n" - "\tSA: %02x:%02x:%02x:%02x:%02x:%02x\n" - "\tBSSID: %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, ATECtrl->wcid_ref, txlen, hlen, buf, - tx_time_param->pkt_tx_len, tx_time_param->pkt_msdu_len, - PRINT_MAC(addr1), PRINT_MAC(addr2), PRINT_MAC(addr3))); - tmac_info = buf; - pheader = (buf + tx_hw_hdr_len); - payload = (pheader + hlen); - NdisZeroMemory(buf, ATE_TESTPKT_LEN); -#ifdef TXBF_SUPPORT - { - UCHAR iTxBf = TESTMODE_GET_PARAM(ATECtrl, band_idx, iTxBf); - UCHAR eTxBf = TESTMODE_GET_PARAM(ATECtrl, band_idx, eTxBf); - - /* Use wcid 1~4 */ - if (iTxBf || eTxBf) { - if ((ATECtrl->wcid_ref > ATE_BFMU_NUM) || - (ATECtrl->wcid_ref < 1)) - ATECtrl->wcid_ref = ATE_BF_WCID; - - addr1 = ATECtrl->pfmu_info[ATECtrl->wcid_ref - 1].addr; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: DA: %02x:%02x:%02x:%02x:%02x:%02x, wcid=%u\n", - __func__, PRINT_MAC(addr1), ATECtrl->wcid_ref)); - } -#endif - frm_template = TESTMODE_GET_PARAM(ATECtrl, band_idx, TemplateFrame); - NdisMoveMemory(pheader, frm_template, hlen); - NdisMoveMemory(pheader + 4, addr1, MAC_ADDR_LEN); - NdisMoveMemory(pheader + 10, addr2, MAC_ADDR_LEN); - NdisMoveMemory(pheader + 16, addr3, MAC_ADDR_LEN); - ret = MtATEPayloadInit(pAd, payload, txlen - hlen, band_idx); -#if !defined(COMPOS_TESTMODE_WIN) - - if (ATECtrl->en_log & fATE_LOG_TXDUMP) { - INT i = 0; - PHEADER_802_11 hdr = (HEADER_802_11 *)pheader; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[TXCONTENT DUMP START]\n")); - dump_tmac_info(pAd, tmac_info); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[TXD RAW]: ")); - - for (i = 0; i < tx_hw_hdr_len; i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%04x", tmac_info[i])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nADDR1: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr1))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ADDR2: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr2))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ADDR3: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr3))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("FC: %04x\n", *(UINT16 *)(&hdr->FC))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFrom DS: %x\n", hdr->FC.FrDs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTo DS: %x\n", hdr->FC.ToDs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[CONTENT RAW]: ")); - - for (i = 0; i < (txlen - hlen); i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%02x", payload[i])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n[TXCONTENT DUMP END]\n")); - } - -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - TESTMODE_SET_PARAM(ATECtrl, band_idx, is_alloc_skb, 0); -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pheader, DIR_WRITE, FALSE); -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - MTMacInfoEndianChange(pAd, tmac_info, TYPE_TMACINFO, - sizeof(TMAC_TXD_L)); - -#endif -#endif - return ret; -} - -INT32 MT_ATEGenBurstPkt(RTMP_ADAPTER *pAd, UCHAR *buf, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - UINT32 new_txlen, new_hlen; - UINT8 need_qos, need_amsdu, need_ampdu; - new_txlen = tx_time_param->pkt_tx_len; - new_hlen = tx_time_param->pkt_hdr_len; - need_qos = tx_time_param->pkt_need_qos; - need_amsdu = tx_time_param->pkt_need_amsdu; - need_ampdu = tx_time_param->pkt_need_ampdu; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: new_txlen/new_hlen=%d/%d, qos/amsdu/ampdu=%d/%d/%d\n", - __func__, new_txlen, new_hlen, need_qos, need_amsdu, - need_ampdu)); - - /* Update WTBL if necessary */ - if (need_ampdu) - mt_ate_wtbl_cfg(pAd, band_idx); - - /* Generate tx packet */ - if (need_ampdu) - ret = mt_ate_ampdu_frame(pAd, buf, band_idx); - else { - /* No aggregation, directly go with specific length and through ALTX queue */ - tx_time_param->pkt_ampdu_cnt = 1; - tx_time_param->pkt_msdu_len = new_txlen; - ret = mt_ate_non_ampdu_frame(pAd, buf, band_idx); - } - - return ret; -} - -INT32 MT_ATEGenPkt(RTMP_ADAPTER *pAd, UCHAR *buf, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - UCHAR *tmac_info, *pheader, *payload, *addr1, *addr2, *addr3, *template; - UINT32 txlen, hlen, pkt_tx_time; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->TXWISize; - - if (!buf) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: NULL buf, band_idx:%u\n", __func__, band_idx)); - return NDIS_STATUS_FAILURE; - } - - /* For long packet implemetation */ - tx_time_param->pkt_tx_len = 0; - tx_time_param->pkt_hdr_len = 0; - tx_time_param->pkt_need_qos = 0; - tx_time_param->pkt_need_amsdu = 0; - tx_time_param->pkt_need_ampdu = 0; - tx_time_param->pkt_ampdu_cnt = 0; - pkt_tx_time = tx_time_param->pkt_tx_time; - - if (pkt_tx_time > 0) { - UINT8 need_qos = 0, need_amsdu = 0, need_ampdu = 0; - UINT32 new_txlen = - mt_ate_get_txlen_by_pkt_tx_time(ATECtrl, band_idx); - UINT32 new_hlen; - txlen = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxLength); - hlen = TESTMODE_GET_PARAM(ATECtrl, band_idx, HLen); - - if (new_txlen > 0) - txlen = new_txlen; - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Can't get txlen by pkt tx time\n", - __func__)); - } - - new_hlen = - mt_ate_get_hlen_by_pkt_tx_time(ATECtrl, band_idx, txlen, - &need_qos, &need_amsdu, - &need_ampdu); - - if (new_hlen > 0) - hlen = new_hlen; - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Can't get hdrlen by pkt tx time\n", - __func__)); - } - - tx_time_param->pkt_tx_len = new_txlen; - tx_time_param->pkt_hdr_len = hlen; - tx_time_param->pkt_need_qos = need_qos; - tx_time_param->pkt_need_amsdu = need_amsdu; - tx_time_param->pkt_need_ampdu = need_ampdu; - /* New packet generation function */ - ret = MT_ATEGenBurstPkt(pAd, buf, band_idx); - return ret; - } - - addr1 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr1); - addr2 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr2); - addr3 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Addr3); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(wcid:%d)::\tDA: %02x:%02x:%02x:%02x:%02x:%02x\n\tSA: %02x:%02x:%02x:%02x:%02x:%02x\n\tBSSID: %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, ATECtrl->wcid_ref, PRINT_MAC(addr1), - PRINT_MAC(addr2), PRINT_MAC(addr3))); - template = TESTMODE_GET_PARAM(ATECtrl, band_idx, TemplateFrame); - txlen = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxLength); - hlen = TESTMODE_GET_PARAM(ATECtrl, band_idx, HLen); - - /* Error check for txlen */ - if (txlen == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: TX length can't be 0!!\n", __func__)); - return NDIS_STATUS_FAILURE; - } - - tmac_info = buf; - pheader = (buf + tx_hw_hdr_len); - payload = (pheader + hlen); - NdisZeroMemory(buf, ATE_TESTPKT_LEN); -#ifdef TXBF_SUPPORT - { - UCHAR iTxBf = TESTMODE_GET_PARAM(ATECtrl, band_idx, iTxBf); - UCHAR eTxBf = TESTMODE_GET_PARAM(ATECtrl, band_idx, eTxBf); - - /* Use wcid 1~4 */ - if (iTxBf || eTxBf) { - if ((ATECtrl->wcid_ref > ATE_BFMU_NUM) || - (ATECtrl->wcid_ref < 1)) - ATECtrl->wcid_ref = ATE_BF_WCID; - - addr1 = ATECtrl->pfmu_info[ATECtrl->wcid_ref - 1].addr; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: DA: %02x:%02x:%02x:%02x:%02x:%02x, wcid=%u\n", - __func__, PRINT_MAC(addr1), ATECtrl->wcid_ref)); - } -#endif - NdisMoveMemory(pheader, template, hlen); - NdisMoveMemory(pheader + 4, addr1, MAC_ADDR_LEN); - NdisMoveMemory(pheader + 10, addr2, MAC_ADDR_LEN); - NdisMoveMemory(pheader + 16, addr3, MAC_ADDR_LEN); - ret = MtATEPayloadInit(pAd, payload, txlen - hlen, band_idx); -#if !defined(COMPOS_TESTMODE_WIN) - - if (ATECtrl->en_log & fATE_LOG_TXDUMP) { - INT i = 0; - PHEADER_802_11 hdr = (HEADER_802_11 *)pheader; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[TXCONTENT DUMP START]\n")); - dump_tmac_info(pAd, tmac_info); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[TXD RAW]: ")); - - for (i = 0; i < tx_hw_hdr_len; i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%04x", tmac_info[i])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nADDR1: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr1))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ADDR2: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr2))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ADDR3: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(hdr->Addr3))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("FC: %04x\n", *(UINT16 *)(&hdr->FC))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFrom DS: %x\n", hdr->FC.FrDs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTo DS: %x\n", hdr->FC.ToDs)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[CONTENT RAW]: ")); - - for (i = 0; i < (txlen - hlen); i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%02x", payload[i])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n[TXCONTENT DUMP END]\n")); - } - -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - TESTMODE_SET_PARAM(ATECtrl, band_idx, is_alloc_skb, 0); -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pheader, DIR_WRITE, FALSE); -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - MTMacInfoEndianChange(pAd, tmac_info, TYPE_TMACINFO, - sizeof(TMAC_TXD_L)); - -#endif -#endif - return ret; -} - -UINT32 mt_ate_mcs32_handle(RTMP_ADAPTER *pAd, UINT8 wcid_ref, UINT8 bw) -{ - INT32 ret = 0; - UINT32 DwMask = 0; -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - - if (IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd) || IS_MT7663(pAd)) { - union WTBL_DW5 wtbl_txcap; - DwMask = ~(3 << 12); /* only update fcap bit[13:12] */ - wtbl_txcap.field.fcap = bw; - /* WTBLDW5 */ - WtblDwSet(pAd, wcid_ref, 1, 5, DwMask, wtbl_txcap.word); - return ret; - } - -#else - { - union WTBL_2_DW9 wtbl_txcap; - DwMask = ~(3 << 14); /* only update fcap bit[15:14] */ - wtbl_txcap.field.fcap = bw; - /* WTBL2DW9 */ - WtblDwSet(pAd, wcid_ref, 2, 9, DwMask, wtbl_txcap.word); - } -#endif - return ret; -} - -#if !defined(COMPOS_TESTMODE_WIN) /* 1todo too many OS private functio */ -INT32 MT_ATETxPkt(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - PNDIS_PACKET pkt; - INT32 ret = 0; - PACKET_INFO PacketInfo; - UCHAR *pSrcBufVA; - UINT SrcBufLen; - PNDIS_PACKET *pkt_skb = NULL; - UCHAR *pate_pkt = TESTMODE_GET_PARAM(ATECtrl, band_idx, pate_pkt); - UINT32 txlen = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxLength); - UINT32 tx_cnt = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxCount); - UINT32 txdone_cnt = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxDoneCount); - USHORT qid = TESTMODE_GET_PARAM(ATECtrl, band_idx, QID); - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->TXWISize; - UCHAR wdev_idx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wdev_idx); - struct wifi_dev *wdev = wdev_search_by_idx(pAd, wdev_idx); - UINT32 pkt_tx_time = tx_time_param->pkt_tx_time; - UINT8 need_ampdu = tx_time_param->pkt_need_ampdu; - struct sk_buff *skb = NULL; - struct sk_buff *skb2 = NULL; - int alloced; - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: band_idx:%u, tx_cnt:%u, txdone_cnt:%u, pate_pkt:%p, ring Idx:%u\n", - __func__, band_idx, tx_cnt, txdone_cnt, pate_pkt, qid)); - - if (!pate_pkt) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: invalid pate_pkt(%p)\n", __func__, pate_pkt)); - goto done; - } - - if (band_idx == 0) - pkt_skb = &ATECtrl->pkt_skb; - -#ifdef DBDC_MODE - else if (IS_ATE_DBDC(pAd) && band_idx == 1) - pkt_skb = &ATECtrl->band_ext[band_idx - 1].pkt_skb; -#endif /* DBDC_MODE */ - alloced = TESTMODE_GET_PARAM(ATECtrl, band_idx, is_alloc_skb); - - if (!pkt_skb) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: invalid pkt_skb\n", __func__)); - return NDIS_STATUS_FAILURE; - } - - if (!alloced) { - if (*pkt_skb) - RELEASE_NDIS_PACKET(pAd, *pkt_skb, NDIS_STATUS_SUCCESS); - - if (pkt_tx_time > 0) - txlen = tx_time_param->pkt_msdu_len; - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Alloc pkt, txlen=%d, tx_hw_hdr_len=%d, total=%d\n", - __func__, txlen, tx_hw_hdr_len, - txlen + tx_hw_hdr_len)); - ret = RTMPAllocateNdisPacket(pAd, pkt_skb, NULL, 0, pate_pkt, - txlen + tx_hw_hdr_len); - - if (ret != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: AllocateNdisPacket fail\n", __func__)); - goto done; - } - - TESTMODE_SET_PARAM(ATECtrl, band_idx, is_alloc_skb, 1); - } - - if (*pkt_skb) { - skb = (struct sk_buff *)(*pkt_skb); - OS_PKT_CLONE(pAd, skb, skb2, GFP_ATOMIC); - } - - if (skb2 == NULL) { - if (*pkt_skb) - RELEASE_NDIS_PACKET(pAd, *pkt_skb, NDIS_STATUS_SUCCESS); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: clone pakcet fail\n", __func__)); - goto done; - } - - pkt = (PNDIS_PACKET)skb2; - RTMP_SET_PACKET_WDEV(pkt, wdev_idx); - - if (pkt_tx_time > 0) { - UINT8 wcid = ATECtrl->wcid_ref; - RTMP_SET_PACKET_WCID(pkt, wcid); - } - - RTMP_QueryPacketInfo(pkt, &PacketInfo, &pSrcBufVA, &SrcBufLen); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:: allocate pkt, wdev_idx=%d, q_idx:%x, pkt_va:%p, VA:%p, Len:%u\n", - __func__, wdev_idx, qid, pkt, pSrcBufVA, SrcBufLen)); - /* Set the packet type to ATE frame before enqueue packet */ - RTMP_SET_PACKET_TXTYPE(pkt, TX_ATE_FRAME); - - if ((pkt_tx_time > 0) && (need_ampdu)) { - RTMP_SET_PACKET_TYPE(pkt, TX_DATA); - RTMP_SET_PACKET_QUEIDX(pkt, QID_AC_BE); - } else { - RTMP_SET_PACKET_TYPE(pkt, TX_MGMT); - RTMP_SET_PACKET_QUEIDX(pkt, 0); - } - - ret = send_mlme_pkt(pAd, pkt, wdev, qid, FALSE); -done: - return ret; -} - -static UINT32 MT_ATEGetBandIdx(RTMP_ADAPTER *pAd, PNDIS_PACKET pkt) -{ - UINT32 band_idx = 0; - UCHAR wdev_idx = 0; - struct wifi_dev *wdev = NULL; - - wdev_idx = RTMP_GET_PACKET_WDEV(pkt); - - if (wdev_idx >= WDEV_NUM_MAX) - goto err0; - - wdev = pAd->wdev_list[wdev_idx]; - - if (!wdev) - goto err0; - - band_idx = HcGetBandByChannel(pAd, wdev->channel); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: wdev_idx:%x\n", __func__, wdev_idx)); - return band_idx; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: cannot find wdev by idx:%x\n", __func__, wdev_idx)); - return -1; -} - -INT32 MT_ATETxControl(RTMP_ADAPTER *pAd, UINT32 band_idx, PNDIS_PACKET pkt) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 txdone_cnt = 0, tx_cnt = 0, mode = 0; - - if (ATECtrl->verify_mode == ATE_LOOPBACK) { - if (pAd->LbCtrl.LoopBackWaitRx) { -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) - RTMP_OS_COMPLETE( - &pAd->LbCtrl.LoopBackPCITxEvent); - else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Not supported in this interface yet\n")); - } - -#else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Not supported in this interface yet\n")); -#endif - } - } else if (ATECtrl->verify_mode == HQA_VERIFY) { - /* Need to get band_idx first if free token done */ - if (pkt) - band_idx = MT_ATEGetBandIdx(pAd, pkt); - - if (band_idx == -1) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong band_idx %u\n", __func__, - band_idx)); - goto done; - } - - txdone_cnt = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxDoneCount); - tx_cnt = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxCount); - mode = TESTMODE_GET_PARAM(ATECtrl, band_idx, Mode); - - /* Do not count in packet number when TX is not in start stage */ - if (!(mode & ATE_TXFRAME)) - return ret; - - /* Triggered when RX tasklet free token */ - if (pkt) { - pAd->RalinkCounters.KickTxCount++; - txdone_cnt++; - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxDoneCount, - txdone_cnt); - } - -#ifdef ATE_TXTHREAD - TESTMODEThreadProceedTx(pAd, band_idx); -#else - - if ((mode & ATE_TXFRAME) && (txdone_cnt < tx_cnt)) - ret = MT_ATETxPkt(pAd, band_idx); - else if ((mode & ATE_TXFRAME) && (txdone_cnt == tx_cnt)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("All Tx is done\n")); - - if (mode & fATE_MPS) { - RTMP_OS_COMPLETION *tx_wait = - TESTMODE_GET_PADDR(ATECtrl, band_idx, - tx_wait); - RTMP_OS_COMPLETE(tx_wait); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Finish one MPS Item\n")); - } - - /* Tx status enters idle mode */ - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxStatus, 0); - } else if (!(mode & ATE_TXFRAME)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Stop TX bottom is pressed\n")); - - if (mode & fATE_MPS) { - RTMP_OS_COMPLETION *tx_wait = - TESTMODE_GET_PADDR(ATECtrl, band_idx, - tx_wait); - mode &= ~fATE_MPS; - TESTMODE_SET_PARAM(ATECtrl, band_idx, Mode, - mode); - RTMP_OS_COMPLETE(tx_wait); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("MPS STOP\n")); - } - } else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("ATE:: DO NOT match any condition, Mode:0x%x, TxCnt:%u, TxDone:%u\n", - mode, tx_cnt, txdone_cnt)); - } - - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxDoneCount, txdone_cnt); -#endif - } - -done: - return ret; -} - -static INT32 mt_ate_calculate_duty_cycle(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - struct _ATE_IPG_PARAM *ipg_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, ipg_param); - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, tx_time_param); - UINT32 ipg, pkt_tx_time, duty_cycle; - ipg = ipg_param->ipg; - pkt_tx_time = tx_time_param->pkt_tx_time; - duty_cycle = TESTMODE_GET_PARAM(ATECtrl, band_idx, duty_cycle); - - /* Calculate needed ipg/pkt_tx_time and duty_cycle */ - if ((duty_cycle > 0) && (pkt_tx_time == 0) && (ipg == 0)) { - /* TODO: need to consider this case in the future */ - duty_cycle = 0; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: There are no pkt_tx_time/ipg!!\n" - "%s: Use default transmission setting and set duty_cycle=%d\n", - __func__, __func__, duty_cycle)); - } else if ((duty_cycle > 0) && (pkt_tx_time > 0) && (ipg == 0)) { - ipg = ((pkt_tx_time * 100) / duty_cycle) - pkt_tx_time; - ipg_param->ipg = ipg; - /* If IPG value is not make sense, there's error handle when get ipg parameter */ - ret = ATEOp->SetIPG(pAd, ipg); - } else if ((duty_cycle > 0) && (pkt_tx_time == 0) && (ipg > 0)) { - /* If pkt_tx_time is not make sense, there's error handle when start TX */ - pkt_tx_time = (duty_cycle * ipg) / (100 - duty_cycle); - } else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Already existed pkt_tx_time/ipg, can't set duty_cycle!!\n" - "%s: Expected duty_cycle=%d%%\n", - __func__, __func__, duty_cycle)); - duty_cycle = (pkt_tx_time * 100) / (pkt_tx_time + ipg); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Real duty_cycle=%d%%\n", __func__, duty_cycle)); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: duty_cycle=%d%%, ipg=%dus, pkt_tx_time=%dus\n", __func__, - duty_cycle, ipg, pkt_tx_time)); - tx_time_param->pkt_tx_time = pkt_tx_time; - TESTMODE_SET_PARAM(ATECtrl, band_idx, duty_cycle, duty_cycle); - return ret; -} - -static UINT16 mt_ate_set_ifs_cr(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IPG_PARAM *ipg_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, ipg_param); - UINT16 slot_time, sifs_time; - UINT32 txv_time = 0, i2t_chk_time = 0, tr2t_chk_time = 0; - UINT32 value = 0; - slot_time = ipg_param->slot_time; - sifs_time = ipg_param->sifs_time; - /* in uint of ns */ - MAC_IO_READ32(pAd, TMAC_ATCR, &txv_time); - txv_time *= NORMAL_CLOCK_TIME; - i2t_chk_time = - (UINT32)(slot_time * 1000) - txv_time - BBP_PROCESSING_TIME; - tr2t_chk_time = - (UINT32)(sifs_time * 1000) - txv_time - BBP_PROCESSING_TIME; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: txv_time=%dns, i2t_chk_time=%dns, tr2t_chk_time=%dns\n", - __func__, txv_time, i2t_chk_time, tr2t_chk_time)); - i2t_chk_time /= NORMAL_CLOCK_TIME; - tr2t_chk_time /= NORMAL_CLOCK_TIME; - - if (band_idx == TESTMODE_BAND0) { - MAC_IO_READ32(pAd, TMAC_TRCR0, &value); - value = (value & 0xFE00FE00) | ((i2t_chk_time & 0x1FF) << 16) | - ((tr2t_chk_time & 0x1FF) << 0); - MAC_IO_WRITE32(pAd, TMAC_TRCR0, value); - } else if (band_idx == TESTMODE_BAND1) { - MAC_IO_READ32(pAd, TMAC_TRCR1, &value); - value = (value & 0xFE00FE00) | ((i2t_chk_time & 0x1FF) << 16) | - ((tr2t_chk_time & 0x1FF) << 0); - MAC_IO_WRITE32(pAd, TMAC_TRCR1, value); - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid band_idx!!\n", __func__)); - return FALSE; - } - - return ret; -} - -static INT32 mt_ate_set_wmm_param_by_qid(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IPG_PARAM *ipg_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, ipg_param); - INT wdev_idx = 0; - UCHAR WmmIdx = 0xFF; - USHORT qid; - UINT16 slot_time, sifs_time, cw; - UINT8 ac_num, aifsn; -#if !defined(COMPOS_TESTMODE_WIN) - struct wifi_dev *pWdev = NULL; - wdev_idx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wdev_idx); - pWdev = pAd->wdev_list[wdev_idx]; - - if (pWdev) { - WmmIdx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wmm_idx); - - if (WmmIdx > 3) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: wdev_idx=%d, invalid WmmIdx=%d, reset to 0!\n", - __func__, wdev_idx, WmmIdx)); - WmmIdx = 0xFF; - } - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid WDEV, reset WmmIdx to 0!\n", __func__)); - WmmIdx = 0xFF; - } - -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: wdev_idx=%d, WmmIdx=%d\n", __func__, wdev_idx, WmmIdx)); - qid = TESTMODE_GET_PARAM(ATECtrl, band_idx, QID); - - if ((qid != QID_AC_BE) && (qid != TxQ_IDX_ALTX0) && - (qid != TxQ_IDX_ALTX1)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Impossible!\n", __func__)); - return FALSE; - } - - slot_time = ipg_param->slot_time; - sifs_time = ipg_param->sifs_time; - ac_num = qid; - aifsn = ipg_param->aifsn; - cw = ipg_param->cw; - ret = MtAsicSetWmmParam(pAd, WmmIdx, (UINT32)ac_num, WMM_PARAM_AIFSN, - (UINT32)aifsn); - ret = MtAsicSetWmmParam(pAd, WmmIdx, (UINT32)ac_num, WMM_PARAM_CWMIN, - (UINT32)cw); - ret = MtAsicSetWmmParam(pAd, WmmIdx, (UINT32)ac_num, WMM_PARAM_CWMAX, - (UINT32)cw); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: qid=%d, slot_time=%d, sifs_time=%d, ac_num=%d, aifsn=%d, cw=%d\n", - __func__, qid, slot_time, sifs_time, ac_num, aifsn, cw)); - return ret; -} - -static INT32 mt_ate_apply_ipg_param(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IPG_PARAM *ipg_param = - TESTMODE_GET_PADDR(ATECtrl, band_idx, ipg_param); - UINT32 ipg; - UINT16 slot_time, sifs_time, cw; - UINT8 aifsn; - ipg = ipg_param->ipg; - - if (ipg > 0) { - /* Get packet qIdx and decide which CR set need to be changed */ - slot_time = ipg_param->slot_time; - sifs_time = ipg_param->sifs_time; - aifsn = ipg_param->aifsn; - cw = ipg_param->cw; - } else { - /* Write default value back to HW */ - slot_time = DEFAULT_SLOT_TIME; - sifs_time = DEFAULT_SIFS_TIME; - aifsn = MIN_AIFSN; - cw = 0; - } - - ipg_param->slot_time = slot_time; - ipg_param->sifs_time = sifs_time; - ipg_param->aifsn = aifsn; - ipg_param->cw = cw; - ret = mt_ate_set_ifs_cr(pAd, band_idx); -#ifdef CONFIG_HW_HAL_OFFLOAD - ret = MtCmdATESetSlotTime(pAd, (UINT8)slot_time, (UINT8)sifs_time, - RIFS_TIME, EIFS_TIME, (UINT8)band_idx); -#endif - ret = mt_ate_set_wmm_param_by_qid(pAd, band_idx); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ipg=%d, slot_time=%d, sifs_time=%d, aifsn=%d, cw=%d\n", - __func__, ipg, slot_time, sifs_time, aifsn, cw)); - return ret; -} - -BOOLEAN mt_ate_fill_offload_tx_blk(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk) -{ - PACKET_INFO PacketInfo; - PNDIS_PACKET pPacket; - - pPacket = pTxBlk->pPacket; - pTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket); - RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, - &pTxBlk->SrcBufLen); - - if (RTMP_GET_PACKET_MGMT_PKT(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_CT_WithTxD); - - if (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame); - - if (IS_ASIC_CAP(pAd, fASIC_CAP_TX_HDR_TRANS)) { - if ((pTxBlk->TxFrameType == TX_LEGACY_FRAME) || - (pTxBlk->TxFrameType == TX_AMSDU_FRAME) || - (pTxBlk->TxFrameType == TX_MCAST_FRAME)) - TX_BLK_SET_FLAG(pTxBlk, fTX_HDR_TRANS); - } - - pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader; - return TRUE; -} - -INT32 mt_ate_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *tx_blk) -{ - INT32 ret = 0; - UINT32 band_idx = HcGetBandByWdev(wdev); - TMAC_INFO tmac_info; - PQUEUE_ENTRY q_entry; - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - - q_entry = RemoveHeadQueue(&tx_blk->TxPacketList); - tx_blk->pPacket = QUEUE_ENTRY_TO_PACKET(q_entry); - RTMP_SET_PACKET_WCID(tx_blk->pPacket, 0); - - /* Fill TX blk for ATE mode */ - ret = mt_ate_fill_offload_tx_blk(pAd, wdev, tx_blk); - - /* TMAC_INFO setup for ATE mode */ - ret = mt_ate_set_tmac_info(pAd, &tmac_info, band_idx); - - if (ret) - return ret; - - return arch_ops->ate_hw_tx(pAd, &tmac_info, tx_blk); -} - -#endif - -#if !defined(COMPOS_TESTMODE_WIN) /* 1todo too many OS private function */ -static INT32 MT_ATEStartTx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR *pate_pkt = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, pate_pkt); - UCHAR cntl_ch = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, ControlChl); - UCHAR ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Channel); - UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); - UINT32 tx_cnt = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxCount); - UCHAR bw = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, BW); - INT8 wdev_idx = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, wdev_idx); - UINT32 Rate = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mcs); - UINT32 duty_cycle = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, duty_cycle); -#ifdef ARBITRARY_CCK_OFDM_TX - UINT32 tx_sel = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxAntennaSel); - UINT8 phymode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode); -#endif -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; -#endif - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx:%u, ch:%x, cntl_ch:%x, wdev_idx:%x\n", - __func__, control_band_idx, ch, cntl_ch, wdev_idx)); - - if (!pate_pkt) - goto err0; - - /* TxRx swtich Recover */ - - if (mode & ATE_TXFRAME) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: already in TXFRAME mode now, tx is on-going!\n", - __func__)); - goto err1; - } - - MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, control_band_idx); -#ifdef ARBITRARY_CCK_OFDM_TX - if (IS_MT7615(pAd)) { - MtATEInitCCK_OFDM_Path(pAd, control_band_idx); - - if (phymode == MODE_CCK || phymode == MODE_OFDM) - MtATESetCCK_OFDM_Path(pAd, tx_sel, control_band_idx); - } -#endif - - if (Rate == 32) - mt_ate_mcs32_handle(pAd, ATECtrl->wcid_ref, bw); - - MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, control_band_idx); - msleep(30); - /* Stop send TX packets from upper layer */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* The first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_STOP_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - /* Disable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX, 0); - - /* Polling TX/RX path until packets empty */ - if (if_ops->clean_trx_q) - if_ops->clean_trx_q(pAd); - - if (mode & ATE_RXFRAME) - MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE, control_band_idx); - - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_START_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - /* Enable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 1); - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - - /* Calculate duty_cycle related parameter first */ - if (duty_cycle > 0) - Ret = mt_ate_calculate_duty_cycle(pAd, control_band_idx); - - /* Prepare Tx packet */ - if (if_ops->setup_frame) - Ret = if_ops->setup_frame(pAd, QID_AC_BE); - else - Ret = MT_ATEGenPkt(pAd, pate_pkt, control_band_idx); - - if (Ret) - goto err0; - - /* Apply IPG setting to HW */ - Ret = mt_ate_apply_ipg_param(pAd, control_band_idx); - - if (tx_cnt != 0xFFFFFFFF) { -#ifndef ATE_TXTHREAD - tx_cnt += TESTMODE_GET_PARAM(ATECtrl, control_band_idx, - TxDoneCount); -#endif - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxCount, tx_cnt); - } - - /* Tx Frame */ - mode |= ATE_TXFRAME; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - - if (if_ops->test_frame_tx) - Ret = if_ops->test_frame_tx(pAd); - else { - struct _ATE_IPG_PARAM *ipg_param = TESTMODE_GET_PADDR( - ATECtrl, control_band_idx, ipg_param); - struct _ATE_TX_TIME_PARAM *tx_time_param = TESTMODE_GET_PADDR( - ATECtrl, control_band_idx, tx_time_param); - UINT32 ipg = ipg_param->ipg; - UINT32 pkt_tx_time = tx_time_param->pkt_tx_time; - - if ((pkt_tx_time > 0) || (ipg > 0)) { - PKT_TOKEN_CB *pktTokenCb = - (PKT_TOKEN_CB *)pAd->PktTokenCb; - UINT32 pkt_cnt, input_cnt; - UINT32 ate_tx_cnt = TESTMODE_GET_PARAM( - ATECtrl, control_band_idx, TxCount); - UINT32 txed_cnt = TESTMODE_GET_PARAM( - ATECtrl, control_band_idx, TxedCount); - UINT32 pkt_ampdu_cnt = tx_time_param->pkt_ampdu_cnt; - UINT32 pkt_enqueue_cnt = - pktTokenCb->pkt_tx_tkid_max / 2; - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ate_tx_cnt=0x%x, pkt_ampdu_cnt=%d, pkt_enqueue_cnt=%d, pkt_tx_time=%d, ipg=%d\n", - __func__, ate_tx_cnt, pkt_ampdu_cnt, - pkt_enqueue_cnt, pkt_tx_time, ipg)); - MtATESetMacTxRx(pAd, ASIC_MAC_TX, FALSE, - control_band_idx); - - if (ate_tx_cnt > pkt_ampdu_cnt) - input_cnt = ate_tx_cnt; - else - input_cnt = pkt_ampdu_cnt; - - input_cnt = input_cnt > pkt_enqueue_cnt ? - pkt_enqueue_cnt : - input_cnt; - - /* Enqueue packet in HW queue in advance */ - for (pkt_cnt = 0; pkt_cnt < input_cnt; pkt_cnt++) { - MT_ATETxPkt(pAd, control_band_idx); - txed_cnt++; - } - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxedCount, - txed_cnt); - Ret = MT_ATETxControl(pAd, control_band_idx, NULL); - MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, - control_band_idx); - } else - Ret = MT_ATETxControl(pAd, control_band_idx, NULL); - } - - if (Ret) - goto err0; - - ATECtrl->did_tx = 1; -err1: - return Ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Err %d, wdev_idx:%x\n", __func__, Ret, wdev_idx)); - return Ret; -} - -static INT32 MT_ATEStartRx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; -#endif - - if (mode & ATE_RXFRAME) - goto err0; - - /* Firmware offloading CR need to msleep(30) Currently for the second NETDEV_STOP_QUEUE */ - MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, control_band_idx); - msleep(30); - /* Stop send TX packets */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_STOP_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - AsicSetWPDMA(pAd, PDMA_TX, 0); - - if (if_ops->clean_trx_q) - if_ops->clean_trx_q(pAd); - - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_START_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - - /* Turn on TX again if set before */ - if (mode & ATE_TXFRAME) - MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, control_band_idx); - - /* reset counter when iwpriv only */ - if (ATECtrl->bQAEnabled != TRUE) { - ATECtrl->rx_stat.RxTotalCnt[0] = 0; - - if (IS_ATE_DBDC(pAd)) - ATECtrl->rx_stat.RxTotalCnt[1] = 0; - } - - pAd->WlanCounters[0].FCSErrorCount.u.LowPart = 0; - /* Enable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 1); - MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE, control_band_idx); -#ifdef CONFIG_HW_HAL_OFFLOAD - MtCmdSetPhyCounter(pAd, 0, TESTMODE_BAND0); - MtCmdSetPhyCounter(pAd, 1, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) { - MtCmdSetPhyCounter(pAd, 0, TESTMODE_BAND1); - MtCmdSetPhyCounter(pAd, 1, TESTMODE_BAND1); - } - -#endif /* CONFIG_HW_HAL_OFFLOAD */ - msleep(30); - mode |= ATE_RXFRAME; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - - if (if_ops->test_frame_rx) - if_ops->test_frame_rx(pAd); - - ATECtrl->did_rx = 1; -err0: - return Ret; -} - -static INT32 MT_ATEStopTx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; -#ifdef ATE_TXTHREAD - INT32 thread_idx = 0; -#endif - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 Mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); - struct qm_ops *ops = pAd->qm_ops; - struct _ATE_IPG_PARAM *ipg_param = - TESTMODE_GET_PADDR(ATECtrl, control_band_idx, ipg_param); - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, control_band_idx, tx_time_param); - UINT32 ipg = ipg_param->ipg; - UINT32 pkt_tx_time = tx_time_param->pkt_tx_time; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: control_band_idx=%u\n", __func__, control_band_idx)); - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxedCount, 0); -#ifdef ATE_TXTHREAD - TESTMODEThreadStopTx(pAd, thread_idx); -#endif - - if ((Mode & ATE_TXFRAME) || (Mode == ATE_STOP)) { - Mode &= ~ATE_TXFRAME; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, Mode); - - if ((pkt_tx_time > 0) || (ipg > 0)) { - /* Flush SW queue */ - if (ops->sta_clean_queue) - ops->sta_clean_queue(pAd, WCID_ALL); - - /* Clean per sta TX queue and disable STA pause CRs for transmitting packet */ - MtATESetCleanPerStaTxQueue(pAd, FALSE); - } -#ifdef ARBITRARY_CCK_OFDM_TX - if (IS_MT7615(pAd)) { - MtATEInitCCK_OFDM_Path(pAd, control_band_idx); - } -#endif - } - - return Ret; -} - -static INT32 MT_ATEStopRx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 Mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); - - Ret = MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, control_band_idx); - Mode &= ~ATE_RXFRAME; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, Mode); - - if (if_ops->clean_trx_q) - if_ops->clean_trx_q(pAd); - - return Ret; -} -#else -static INT32 MT_ATEStartTx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; -#ifdef COMPOS_TESTMODE_WIN - Ret = StartTx(pAd, 0, 0); -#endif - ATECtrl->did_tx = 1; - return Ret; -} - -static INT32 MT_ATEStartRx(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; -#ifdef COMPOS_TESTMODE_WIN - Ret = StartRx0(pAd); - Ret = StartRx1(pAd); -#endif - ATECtrl->did_rx = 1; - return Ret; -} - -static INT32 MT_ATEStopTx(RTMP_ADAPTER *pAd, UINT32 Mode) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; -#ifdef COMPOS_TESTMODE_WIN - Ret = StopTx(pAd); -#endif - ATECtrl->Mode &= ~ATE_TXFRAME; - return Ret; -} - -static INT32 MT_ATEStopRx(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; -#ifdef COMPOS_TESTMODE_WIN - Ret = StopRx0(pAd); - Ret = StopRx1(pAd); -#endif - return Ret; -} -#endif - -static INT32 MT_ATESetTxAntenna(RTMP_ADAPTER *pAd, UINT32 Ant) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0, ant_loop = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx, ant_mask = 0; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - for (ant_loop = 0; ant_loop < cap->max_nss; ant_loop++) - ant_mask |= (0x1 << ant_loop); - - if ((Ant & ATE_ANT_USER_SEL) != ATE_ANT_USER_SEL) - Ant &= ant_mask; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Ant = 0x%x, control_band_idx = %d\n", __func__, Ant, - control_band_idx)); - - /* For TXD setting, change to stream number when ATE set channel (MtCmdSetTxRxPath) */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxAntennaSel, Ant); - -#if !defined(COMPOS_TESTMODE_WIN) /* 1 todo only 7603/7628 E1? */ -#endif - return Ret; -} - -static INT32 MT_ATESetRxAntenna(RTMP_ADAPTER *pAd, UINT32 Ant) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0, ant_loop = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx, ant_mask = 0; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - for (ant_loop = 0; ant_loop < cap->max_nss; ant_loop++) - ant_mask |= (0x1 << ant_loop); - - Ant &= ant_mask; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Ant = 0x%x, control_band_idx = %d\n", __func__, Ant, - control_band_idx)); - - /* After mt7615 its 4 bit mask for Rx0,1,2,3 */ - /* Send to FW and take effect when ATE set channel (MtCmdSetTxRxPath) */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, RxAntennaSel, Ant); - - return Ret; -} - -static INT32 MT_ATESetTxFreqOffset(RTMP_ADAPTER *pAd, UINT32 FreqOffset) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - ATECtrl->RFFreqOffset = FreqOffset; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); -#ifdef CONFIG_HW_HAL_OFFLOAD - Ret = MtCmdSetFreqOffset(pAd, FreqOffset); -#else - - if ((IS_MT76x6(pAd)) && !(ATECtrl->en_man_set_freq)) { - UINT32 reg = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MT76x6 Manual Set Freq bk ori val\n")); - MtTestModeBkCr(pAd, FREQ_OFFSET_MANUAL_ENABLE, TEST_HW_BKCR); - MtTestModeBkCr(pAd, FREQ_OFFSET_MANUAL_VALUE, TEST_HW_BKCR); - reg = (reg & 0xFFFF80FF) | (0x7F << 8); - HW_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_ENABLE, reg); - ATECtrl->en_man_set_freq = 1; - } - - if (ATECtrl->en_man_set_freq) { - UINT32 reg = 0; - HW_IO_READ32(pAd, FREQ_OFFSET_MANUAL_VALUE, ®); - reg = (reg & 0xFFFF80FF) | (ATECtrl->RFFreqOffset << 8); - HW_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_VALUE, reg); - } else - MtAsicSetRfFreqOffset(pAd, ATECtrl->RFFreqOffset); - -#endif - return Ret; -} - -static INT32 MT_ATEGetTxFreqOffset(RTMP_ADAPTER *pAd, UINT32 *FreqOffset) -{ - INT32 Ret = 0; -#if defined(COMPOS_TESTMODE_WIN) - EXT_EVENT_ID_ATE_TEST_MODE_T *pResult = - (EXT_EVENT_ID_ATE_TEST_MODE_T *)((UINT8 *)pAd->FWRspContent + - sizeof(EVENT_RXD)); -#endif -#ifdef CONFIG_HW_HAL_OFFLOAD - Ret = MtCmdGetFreqOffset(pAd, FreqOffset); - os_msec_delay(30); -#if defined(COMPOS_TESTMODE_WIN) - *FreqOffset = OS_NTOHL(pResult->aucAteResult); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: FreqOffset:%X pResult->aucAteResult = %X\n", __func__, - *FreqOffset, pResult->aucAteResult)); -#endif -#endif - return Ret; -} - -static INT32 MT_ATESetChannel(RTMP_ADAPTER *pAd, INT16 Value, UINT32 pri_sel, - UINT32 reason, UINT32 Ch_Band) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR ctrl_ch = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Channel); - UCHAR bw = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, BW); - UCHAR wdev_idx = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, wdev_idx); - UINT8 phymode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode); - UINT32 tx_sel = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxAntennaSel); - UINT32 rx_sel = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, RxAntennaSel); - UINT32 out_band_freq = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, OutBandFreq); - - /* Backup several parameters before TSSI calibration */ - UCHAR ucPerPktBW_backup; - UCHAR ucPhyMode_backup; - UCHAR ucMcs_backup; - UCHAR ucNss_backup; - UINT32 u4TxLength_backup; - -#ifdef TXBF_SUPPORT - UINT32 iTxBf = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, iTxBf); - UINT32 eTxBf = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, eTxBf); -#endif - INT i = 0; - UINT32 tx_stream_num = 0; - UINT32 max_stream_num = 0; - MT_SWITCH_CHANNEL_CFG ch_cfg; - INT32 ch_offset = 0; - const INT bw40_sel[] = { -2, 2 }; -#ifdef DOT11_VHT_AC - const INT bw80_sel[] = { -6, -2, 2, 6 }; - const INT bw160_sel[] = { -14, -10, -6, -2, 2, 6, 10, 14 }; - UCHAR ch2 = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Channel_2nd); -#endif - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); -#if !defined(COMPOS_TESTMODE_WIN) - struct wifi_dev *pWdev = NULL; - - /* To update wdev setting according to ch_band */ - pWdev = pAd->wdev_list[wdev_idx]; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wdev_idx=%d, ch=%d\n", __func__, wdev_idx, ch)); - - if (!pWdev) - goto err; - - pWdev->channel = ch; - - if (Ch_Band == 0) - pWdev->PhyMode = PHYMODE_CAP_24G; - else if (Ch_Band == 1) - pWdev->PhyMode = PHYMODE_CAP_5G; - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Error ch_band=%d!!\n", __func__, Ch_Band)); - return -1; - } - - Ret = wdev_attr_update(pAd, pWdev); -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - - if (IS_ATE_DBDC(pAd)) - max_stream_num = cap->max_nss / 2 ? cap->max_nss / 2 : 1; - else - max_stream_num = cap->max_nss; - - /* 0: 20M; 1: 40M; 2: 80M; 3: 160M; 4: 10M; 5: 5M; 6: 80+80MHz */ - switch (bw) { - case BW_40: - if (pri_sel >= 2) - goto err0; - - ctrl_ch = ch + bw40_sel[pri_sel]; - ch_offset = bw40_sel[pri_sel]; - - if ((INT32)(ch + ch_offset) <= 0 || - (INT32)(ch - ch_offset) <= 0) - goto err1; - - break; -#ifdef DOT11_VHT_AC - - case BW_8080: - if (pri_sel >= 8) - goto err0; - - if ((ch2 < ch) && ch2) { - UCHAR tmp = ch; - ch = ch2; - ch2 = tmp; - } - - if (pri_sel < 4) { - ctrl_ch = ch + bw80_sel[pri_sel]; - ch_offset = bw80_sel[pri_sel]; - - if ((INT32)(ch + ch_offset) <= 0 || - (INT32)(ch - ch_offset) <= 0) - goto err1; - } else { - ctrl_ch = ch2 + bw80_sel[pri_sel - 4]; - ch_offset = bw80_sel[pri_sel - 4]; - - if ((INT32)(ch2 + ch_offset) <= 0 || - (INT32)(ch2 - ch_offset) <= 0) - goto err1; - } - - break; - - case BW_80: - if (pri_sel >= 4) - goto err0; - - ctrl_ch = ch + bw80_sel[pri_sel]; - ch_offset = bw80_sel[pri_sel]; - - if ((INT32)(ch + ch_offset) <= 0 || - (INT32)(ch - ch_offset) <= 0) - goto err1; - - break; - - case BW_160: - if (pri_sel >= 8) - goto err0; - - ctrl_ch = ch + bw160_sel[pri_sel]; - ch_offset = bw160_sel[pri_sel]; - - if ((INT32)(ch + ch_offset) <= 0 || - (INT32)(ch - ch_offset) <= 0) - goto err1; - - break; -#endif - - case BW_20: - default: - ctrl_ch = ch; - break; - } - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, ControlChl, ctrl_ch); - NdisZeroMemory(&ch_cfg, sizeof(ch_cfg)); - ch_cfg.ControlChannel = ctrl_ch; - ch_cfg.CentralChannel = ch; - ch_cfg.Bw = bw; -#ifdef DOT11_VHT_AC - if (ch_cfg.Bw == BW_8080) - ch_cfg.ControlChannel2 = ch2; - -#endif - - switch (phymode) { - case MODE_CCK: - case MODE_OFDM: -#ifdef ARBITRARY_CCK_OFDM_TX - if (IS_MT7615(pAd)) { - tx_stream_num = max_stream_num; - } else -#endif - { - /* To get TX max stream number from TX antenna bit mask - tx_sel=2 -> tx_stream_num=2 - tx_sel=4 -> tx_stream_num=3 - tx_sel=8 -> tx_stream_num=4 - */ - for (i = max_stream_num; i > 0; i--) { - if (tx_sel & BIT(i - 1)) { - tx_stream_num = i; - break; - } - } - } - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - case MODE_VHT: -#ifdef TXBF_SUPPORT - if (iTxBf || eTxBf) { - for (i = 0; i < 4; i++) { - if (tx_sel & (1 << i)) - tx_stream_num++; - else - break; - } - } else { - tx_stream_num = max_stream_num; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():max_nss:%d, max_stream_num:%d\n", - __func__, cap->max_nss, max_stream_num)); - } - -#else - tx_stream_num = max_stream_num; -#endif - break; - - default: - tx_stream_num = max_stream_num; - } - - /* Set Rx ant 2/3 for band1 */ - if (control_band_idx) - rx_sel = rx_sel << 2; - - tx_stream_num = tx_stream_num ? tx_stream_num : 1; - tx_stream_num = tx_stream_num <= max_stream_num ? tx_stream_num : - max_stream_num; - - /* What FW needs is Tx stream num and Rx antenna path */ - ch_cfg.TxStream = tx_stream_num; - ch_cfg.RxStream = rx_sel; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: T/Rx_sel:%x/%x, Tx Stream:%x, phymode:%x\n", __func__, - tx_sel, rx_sel, tx_stream_num, phymode)); - -#if defined(COMPOS_TESTMODE_WIN) - switch (reason) { - case CH_SWITCH_SCAN: - ch_cfg.bScan = TRUE; - ch_cfg.isMCC = FALSE; - break; - - case CH_SWITCH_INTERNAL_USED_BY_FW_3: - /* MCC */ - ch_cfg.bScan = FALSE; - ch_cfg.isMCC = TRUE; - break; - - case CH_SWITCH_BY_NORMAL_TX_RX: - deafult: - ch_cfg.bScan = FALSE; - ch_cfg.isMCC = FALSE; - break; - } /* switch(reason) */ - -#else - ch_cfg.bScan = FALSE; -#endif - ch_cfg.BandIdx = control_band_idx; - ch_cfg.Channel_Band = Ch_Band; - ch_cfg.OutBandFreq = out_band_freq; - -#ifdef MT7615 -#ifdef PRE_CAL_TRX_SET1_SUPPORT - mt7615_apply_cal_data(pAd, ch_cfg); -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ -#endif - - /* Align normal mode set channel flow */ - MtCmdChannelSwitch(pAd, ch_cfg); - /* MtCmdSetTxRxPath will configure TX/RX CR setting by FW */ - MtCmdSetTxRxPath(pAd, ch_cfg); - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx:%u, bw:%x, ch:%u, ctrl_ch:%u, cntl_ch2:%u, pri_sel:%x\n", - __func__, control_band_idx, bw, ch, ctrl_ch, - ch_cfg.ControlChannel2, pri_sel)); - - ucPerPktBW_backup = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PerPktBW); - ucPhyMode_backup = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode); - ucMcs_backup = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mcs); - ucNss_backup = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Nss); - u4TxLength_backup = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxLength); - - /* 160C/160NC TSSI workaround */ - Ret = MtATETssiTrainingProc(pAd, ch_cfg.Bw, control_band_idx); - - /* Recovery several parameter after TSSI calibration */ - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, PerPktBW, - ucPerPktBW_backup); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, PhyMode, - ucPhyMode_backup); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mcs, ucMcs_backup); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Nss, ucNss_backup); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxLength, - u4TxLength_backup); - -#ifdef SINGLE_SKU_V2 -#ifdef TXBF_SUPPORT -#ifdef MT_MAC -#if defined(MT7615) || defined(MT7622) - TxPowerBfBackoffParaCtrl(pAd, ch_cfg.Channel_Band, - ch_cfg.ControlChannel, ch_cfg.BandIdx); -#else -#endif /* defined(MT7615) || defined(MT7622) */ -#endif /*MT_MAC*/ -#endif /*TXBF_SUPPORT*/ -#endif /*SINGLE_SKU_V2*/ - return Ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid pri_sel:%x, Set Channel Fail\n", __func__, - pri_sel)); -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid Control Channel:%u|%u, Set Channel Fail\n", - __func__, ctrl_ch, ch - ch_offset)); -#if !defined(COMPOS_TESTMODE_WIN) -err: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Cannot get Wdev by idx:%d\n", __func__, wdev_idx)); -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - return -1; -} - -static INT32 MT_ATESetBW(RTMP_ADAPTER *pAd, UINT16 system_bw, UINT16 per_pkt_bw) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - if (per_pkt_bw == BW_NUM) { - if (system_bw == BW_8080) - per_pkt_bw = BW_160; - else - per_pkt_bw = system_bw; - } else { - if (per_pkt_bw > system_bw) - per_pkt_bw = system_bw; - } - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, BW, system_bw); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, PerPktBW, per_pkt_bw); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: System BW=%d, Per Packet BW=%d, control_band_idx=%d\n", - __func__, system_bw, per_pkt_bw, control_band_idx)); - return Ret; -} - -static INT32 mt_ate_set_duty_cycle(RTMP_ADAPTER *pAd, UINT32 value) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 duty_cycle = value; - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, duty_cycle, duty_cycle); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Duty cycle=%d%%, control_band_idx=%d\n", __func__, - duty_cycle, control_band_idx)); - return ret; -} - -static INT32 mt_ate_set_pkt_tx_time(RTMP_ADAPTER *pAd, UINT32 value) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - struct _ATE_TX_TIME_PARAM *tx_time_param = - TESTMODE_GET_PADDR(ATECtrl, control_band_idx, tx_time_param); - - tx_time_param->pkt_tx_time = value; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Pkt Tx time=%dus, control_band_idx=%d\n", __func__, - tx_time_param->pkt_tx_time, control_band_idx)); - return ret; -} - -#if !defined(COMPOS_TESTMODE_WIN) /* 1 todo RX_BLK */ -static INT32 MT_ATESampleRssi(RTMP_ADAPTER *pAd, RX_BLK *RxBlk) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_RX_STATISTIC *rx_stat = &ATECtrl->rx_stat; - INT32 Ret = 0; - INT i = 0; - UINT32 ANT_NUM = pAd->Antenna.field.TxPath; - - for (i = 0; i < ANT_NUM; i++) { - if (RxBlk->rx_signal.raw_rssi[i] != 0) { - rx_stat->LastRssi[i] = ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&RxBlk->rx_signal - .raw_rssi[i]), - i); - - if (rx_stat->MaxRssi[i] < rx_stat->LastRssi[i]) - rx_stat->MaxRssi[i] = rx_stat->LastRssi[i]; - - if (rx_stat->MinRssi[i] > rx_stat->LastRssi[i]) - rx_stat->MinRssi[i] = rx_stat->LastRssi[i]; - - rx_stat->AvgRssiX8[i] = - (rx_stat->AvgRssiX8[i] - rx_stat->AvgRssi[i]) + - rx_stat->LastRssi[i]; - rx_stat->AvgRssi[i] = rx_stat->AvgRssiX8[i] >> 3; - } - - rx_stat->LastSNR[i] = RxBlk->rx_signal.raw_snr[i]; - } - - rx_stat->NumOfAvgRssiSample++; - return Ret; -} -#endif - -static UINT8 sigext_time_list[] = { - 0, /* CCK */ - 6, /* OFDM */ - 6, /* HTMIX */ - 6, /* HTGREENFIELD */ - 6, /* VHT */ -}; -static UINT8 mt_ate_get_sigext_time_by_phymode(UCHAR phy_mode) -{ - UINT8 sigext_time = 0; - - switch (phy_mode) { - case MODE_CCK: - sigext_time = sigext_time_list[MODE_CCK]; - break; - - case MODE_OFDM: - sigext_time = sigext_time_list[MODE_OFDM]; - break; - - case MODE_HTMIX: - sigext_time = sigext_time_list[MODE_HTMIX]; - break; - - case MODE_HTGREENFIELD: - sigext_time = sigext_time_list[MODE_HTGREENFIELD]; - break; - - case MODE_VHT: - sigext_time = sigext_time_list[MODE_VHT]; - break; - - default: - sigext_time = sigext_time_list[MODE_OFDM]; - break; - } - - return sigext_time; -} - -static UINT16 slot_time_list[] = { - 9, /* CCK */ - 9, /* OFDM */ - 9, /* HTMIX */ - 9, /* HTGREENFIELD */ - 9, /* VHT */ -}; -static UINT16 mt_ate_get_slot_time_by_phymode(UCHAR phy_mode) -{ - UINT16 slot_time = 0; - - switch (phy_mode) { - case MODE_CCK: - slot_time = slot_time_list[MODE_CCK]; - break; - - case MODE_OFDM: - slot_time = slot_time_list[MODE_OFDM]; - break; - - case MODE_HTMIX: - slot_time = slot_time_list[MODE_HTMIX]; - break; - - case MODE_HTGREENFIELD: - slot_time = slot_time_list[MODE_HTGREENFIELD]; - break; - - case MODE_VHT: - slot_time = slot_time_list[MODE_VHT]; - break; - - default: - slot_time = slot_time_list[MODE_OFDM]; - break; - } - - return slot_time; -} - -static UINT16 mt_ate_get_cw(UINT32 ipg, UINT16 slot_time) -{ - INT cnt = 0, val; - val = (ipg + slot_time) / slot_time; - - while (val >>= 1) - cnt++; - - if (cnt >= MAX_CW) - cnt = MAX_CW; - - return cnt; -} - -static INT32 mt_ate_get_ipg_param(RTMP_ADAPTER *pAd) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UCHAR control_band_idx = ATECtrl->control_band_idx; - struct _ATE_IPG_PARAM *ipg_param = - TESTMODE_GET_PADDR(ATECtrl, control_band_idx, ipg_param); - UCHAR phy_mode; - UINT32 ipg, real_ipg; - UINT8 sig_ext, aifsn; - UINT16 slot_time, sifs_time, cw; - - phy_mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode); - ipg = ipg_param->ipg; - sig_ext = mt_ate_get_sigext_time_by_phymode(phy_mode); - slot_time = mt_ate_get_slot_time_by_phymode(phy_mode); - sifs_time = DEFAULT_SIFS_TIME; - /* - * 1. ipg = sig_ext + sifs_time + slot_time - * 2. ipg = sig_ext + sifs_time + aifsn * slot_time + ((1 << cw) - 1) * slot_time - * If it's CCK mode, there's no need to consider sig_ext - * And it's no need to count in backoff time in older ATE driver design, configure SIFS/SLOT only - * Consider which ac queue will be used each case - */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Expected ipg=%d, control_band_idx=%d\n", __func__, ipg, - control_band_idx)); - - if (ipg < (sig_ext + sifs_time + slot_time)) { - UINT32 duty_cycle = TESTMODE_GET_PARAM( - ATECtrl, control_band_idx, duty_cycle); - - ipg_param->ipg = 0; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid IPG!! sig_ext=%d, slot_time=%d, sifs_time=%d\n" - "%s: Set ipg=%d\n", - __func__, sig_ext, slot_time, sifs_time, __func__, - ipg)); - - if (duty_cycle > 0) { - duty_cycle = 0; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, - duty_cycle, duty_cycle); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid IPG with such duty_cycle and pkt_tx_time!!\n" - "%s: Set duty_cycle=%d\n", - __func__, __func__, duty_cycle)); - } - - return ret; - } - - ipg -= sig_ext; - - if (ipg <= (MAX_SIFS_TIME + slot_time)) { - sifs_time = ipg - slot_time; - aifsn = MIN_AIFSN; - cw = 0; - } else { - cw = mt_ate_get_cw(ipg, slot_time); - ipg -= ((1 << cw) - 1) * slot_time; - aifsn = ipg / slot_time; - - if (aifsn >= MAX_AIFSN) - aifsn = MAX_AIFSN; - - ipg -= aifsn * slot_time; - - if (ipg <= DEFAULT_SIFS_TIME) - sifs_time = DEFAULT_SIFS_TIME; - else if ((ipg > DEFAULT_SIFS_TIME) && (ipg <= MAX_SIFS_TIME)) - sifs_time = ipg; - else - sifs_time = MAX_SIFS_TIME; - } - - real_ipg = sig_ext + sifs_time + aifsn * slot_time + - ((1 << cw) - 1) * slot_time; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: sig_ext=%d, slot_time=%d, sifs_time=%d, aifsn=%d, cw=%d\n", - __func__, sig_ext, slot_time, sifs_time, aifsn, cw)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Real ipg=%d\n", __func__, real_ipg)); - ipg_param->sig_ext = sig_ext; - ipg_param->slot_time = slot_time; - ipg_param->sifs_time = sifs_time; - ipg_param->aifsn = aifsn; - ipg_param->cw = cw; - ipg_param->txop = 0; - return ret; -} - -static INT32 mt_ate_set_ipg(RTMP_ADAPTER *pAd, UINT32 value) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 ipg = value; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: IPG=%dus, control_band_idx=%d\n", __func__, ipg, - control_band_idx)); - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, ipg_param.ipg, ipg); - ret = mt_ate_get_ipg_param(pAd); - - return ret; -} - -static INT32 mt_ate_set_slot_time(RTMP_ADAPTER *pAd, UINT32 SlotTime, - UINT32 SifsTime) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: SlotTime:%d, SifsTime:%d, control_band_idx:%d\n", - __func__, SlotTime, SifsTime, control_band_idx)); -#ifdef CONFIG_HW_HAL_OFFLOAD - Ret = MtCmdATESetSlotTime(pAd, (UINT8)SlotTime, (UINT8)SifsTime, - RIFS_TIME, EIFS_TIME, control_band_idx); -#endif - return Ret; -} - -static INT32 MT_ATESetAIFS(RTMP_ADAPTER *pAd, CHAR Value) -{ - INT32 Ret = 0; - UINT val = Value & 0x000000ff; - /* Test mode use AC0 for TX */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Value:%x\n", __func__, val)); - MtAsicSetWmmParam(pAd, 0, WMM_PARAM_AC_0, WMM_PARAM_AIFSN, val); - return Ret; -} - -static INT32 MT_ATESetPowerDropLevel(RTMP_ADAPTER *pAd, UINT32 PowerDropLevel) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: PowerDropLevel:%d, control_band_idx:%d\n", __func__, - PowerDropLevel, control_band_idx)); -#ifdef CONFIG_HW_HAL_OFFLOAD - Ret = MtCmdATESetPowerDropLevel(pAd, (UINT8)PowerDropLevel, - control_band_idx); -#endif /* CONFIG_HW_HAL_OFFLOAD */ - return Ret; -} - -static INT32 MT_ATESetTSSI(RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting) -{ - INT32 Ret = 0; - Ret = MtAsicSetTSSI(pAd, Setting, WFSel); - return Ret; -} - -static INT32 MT_ATELowPower(RTMP_ADAPTER *pAd, UINT32 Control) -{ - INT32 Ret = 0; -#if !defined(COMPOS_TESTMODE_WIN) - - if (Control) - MlmeLpEnter(pAd); - else - MlmeLpExit(pAd); - -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - return Ret; -} - -static INT32 MT_ATESetDPD(RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting) -{ - /* !!TEST MODE ONLY!! Normal Mode control by FW and Never disable */ - /* WF0 = 0, WF1 = 1, WF ALL = 2 */ - INT32 Ret = 0; - Ret = MtAsicSetDPD(pAd, Setting, WFSel); - return Ret; -} - -static INT32 MT_ATEStartTxTone(RTMP_ADAPTER *pAd, UINT32 Mode) -{ - INT32 Ret = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 MT_ATEDBDCTxTone(RTMP_ADAPTER *pAd, UINT32 Control, - UINT32 AntIndex, UINT32 ToneType, UINT32 ToneFreq, - INT32 DcOffset_I, INT32 DcOffset_Q, UINT32 Band) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MtCmdTxTone(pAd, control_band_idx, Control, AntIndex, ToneType, - ToneFreq, DcOffset_I, DcOffset_Q, Band); - return Ret; -} - -static INT32 MT_ATETxCWTone(RTMP_ADAPTER *pAd, UINT32 Control) -{ - INT32 Ret = 0; - UINT32 Channel = 0; - UINT32 AntMask = 0; - UINT32 AntIdx = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT8 band_idx = ATECtrl->control_band_idx; - UINT32 Band = 0; - INT32 pwr1 = 0, pwr2 = 0; - INT32 DcOffset_I = 0, DcOffset_Q = 0; - - AntMask = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxAntennaSel); - Channel = TESTMODE_GET_PARAM(ATECtrl, band_idx, Channel); - pwr1 = TESTMODE_GET_PARAM(ATECtrl, band_idx, RF_Power); - pwr2 = TESTMODE_GET_PARAM(ATECtrl, band_idx, Digital_Power); - DcOffset_I = TESTMODE_GET_PARAM(ATECtrl, band_idx, DcOffset_I); - DcOffset_Q = TESTMODE_GET_PARAM(ATECtrl, band_idx, DcOffset_Q); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Control = %d Channel=%d AntMask=0x%x\n", __FUNCTION__, - Control, Channel, AntMask)); - - if (Channel <= 14) - Band = 2407000; - else - Band = 5000000; - - /* Set RF and Digital Gain */ - for (AntIdx = 0; AntIdx <= 3; AntIdx++) { - if (Control == 0) { - MtCmdTxTonePower(pAd, RF_AT_EXT_FUNCID_TX_TONE_RF_GAIN, - 0, AntIdx, band_idx); - MtCmdTxTonePower(pAd, - RF_AT_EXT_FUNCID_TX_TONE_DIGITAL_GAIN, - 0, AntIdx, band_idx); - } else { - if (AntMask & BIT(AntIdx)) { - MtCmdTxTonePower( - pAd, RF_AT_EXT_FUNCID_TX_TONE_RF_GAIN, - pwr1, AntIdx, band_idx); - MtCmdTxTonePower( - pAd, - RF_AT_EXT_FUNCID_TX_TONE_DIGITAL_GAIN, - pwr2, AntIdx, band_idx); - } - } - } - /* Send Command to firmware */ - MtCmdTxTone(pAd, band_idx, Control, AntMask, 0, 0, - (Control == 1) ? DcOffset_I : 0, - (Control == 1) ? DcOffset_Q : 0, Band); - - /* Firmware currently ignores AntMask when starting Tx Tone, - * and starts TX Tone on all the antennas. Take care of the - * same in driver for now */ - if (Control == 1) { - for (AntIdx = 0; AntIdx <= 3; AntIdx++) { - if (!(AntMask & BIT(AntIdx))) { - UINT32 CRvalue = 0; - PHY_IO_READ32(pAd, 0x10610, &CRvalue); - PHY_IO_WRITE32(pAd, 0x10610, - CRvalue & ~BIT(16 + AntIdx) & - ~BIT(24 + AntIdx)); - } - } - } - - return Ret; -} - -static INT32 MT_ATESetTxTonePower(RTMP_ADAPTER *pAd, INT32 pwr1, INT32 pwr2) -{ - INT32 Ret = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: pwr1:%d, pwr2:%d\n", __func__, pwr1, pwr2)); - return Ret; -} - -static INT32 MT_ATESetDBDCTxTonePower(RTMP_ADAPTER *pAd, INT32 pwr1, INT32 pwr2, - UINT32 AntIdx) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: pwr1:%d, pwr2:%d, AntIdx:%d, control_band_idx:%d\n", - __func__, pwr1, pwr2, AntIdx, control_band_idx)); - MtCmdTxTonePower(pAd, RF_AT_EXT_FUNCID_TX_TONE_RF_GAIN, pwr1, AntIdx, - (UINT8)control_band_idx); - MtCmdTxTonePower(pAd, RF_AT_EXT_FUNCID_TX_TONE_DIGITAL_GAIN, pwr2, - AntIdx, (UINT8)control_band_idx); - return Ret; -} - -static INT32 MT_ATEStopTxTone(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 MT_ATEStartContinousTx(RTMP_ADAPTER *pAd, CHAR WFSel, - UINT32 TxfdMode) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 Phymode = 0, BW = 0, Pri_Ch = 0, Rate = 0, Central_Ch = 0, - ant_sel = 0; - - Phymode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode); - BW = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, BW); - Pri_Ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, ControlChl); - Central_Ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Channel); - Rate = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mcs); - ant_sel = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxAntennaSel); - - if (BW == ATE_BAND_WIDTH_8080) - BW = 3; - - if (BW == ATE_BAND_WIDTH_160) - BW = 4; - - { - UINT32 Control = 1; - MtCmdTxContinous(pAd, Phymode, BW, Pri_Ch, Central_Ch, Rate, - ant_sel, TxfdMode, control_band_idx, Control); - } - return Ret; -} - -static INT32 MT_ATEStopContinousTx(RTMP_ADAPTER *pAd, UINT32 TxfdMode) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 Phymode = 0, BW = 0, Pri_Ch = 0, Rate = 0, Central_Ch = 0, - ant_sel; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Phymode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode); - BW = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, BW); - Pri_Ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, ControlChl); - Central_Ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Channel); - Rate = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mcs); - ant_sel = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxAntennaSel); - { - UINT32 Control = 0; - Ret = MtCmdTxContinous(pAd, Phymode, BW, Pri_Ch, Central_Ch, - Rate, ant_sel, TxfdMode, - control_band_idx, Control); - } - return Ret; -} - -static INT32 MT_OnOffRDD(struct _RTMP_ADAPTER *pAd, UINT32 rdd_idx, - UINT32 rdd_in_sel, UINT32 is_start) -{ - INT32 Ret = 0; - BOOLEAN arb_rx_on = FALSE; - arb_rx_on = is_start ? TRUE : FALSE; - MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, arb_rx_on, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) - MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, arb_rx_on, - TESTMODE_BAND1); - - Ret = MtCmdSetRDDTestExt(pAd, rdd_idx, rdd_in_sel, is_start); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s ARB Rx On:%x\n", __func__, arb_rx_on)); - return Ret; -} - -#ifdef TXPWRMANUAL -static INT32 MT_ATESetTxPwrManual(RTMP_ADAPTER *pAd, BOOLEAN fgPwrManCtrl, - UINT8 u1TxPwrModeManual, - UINT8 u1TxPwrBwManual, - UINT8 u1TxPwrRateManual, - INT8 i1TxPwrValueManual, UCHAR Band) -{ - INT Ret = 0; - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("-----------------------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set wrong parameters\n", __func__)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" CCK (0) only supports rate setting: 0 ~ 3 and no supports different BW\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" OFDM (1) only supports rate setting: 0 ~ 7 and no supports different BW\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" HT20 (2) only supports rate setting: MCS 0 ~ 7 \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" HT40 (2) only supports rate setting: MCS 0 ~ 8 \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" VHT20 (3) only supports rate setting: 0 ~ 9\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" VHT40 (3) only supports rate setting: 0\n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("-----------------------------------------------------------------------------\n")); - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: fgPwrManCtrl:%d, u1TxPwrModeManual:%d, u1TxPwrBwManual:%d, u1TxPwrRateManual:%d, i1TxPwrValueManual:%d, Band:%d\n", - __func__, fgPwrManCtrl, u1TxPwrModeManual, u1TxPwrBwManual, - u1TxPwrRateManual, i1TxPwrValueManual, Band)); - - /*BW : 0:BW20, 1: BW40, 2: BW80, 3: BW160*/ - if (u1TxPwrBwManual == 0) - u1TxPwrBwManual = 20; - else if (u1TxPwrBwManual == 1) - u1TxPwrBwManual = 40; - else if (u1TxPwrBwManual == 2) - u1TxPwrBwManual = 80; - else - u1TxPwrBwManual = 160; - - /*QA tool: 0:CCK, 1:OFDM, 2:HT-MIXED, 3: HT-GREEN,4: VHT */ - /*FW: 0:CCK, 1:OFDM, 2:HT, 3:VHT*/ - if (u1TxPwrModeManual == 2 || u1TxPwrModeManual == 3) - u1TxPwrModeManual = 2; - else if (u1TxPwrModeManual == 4) - u1TxPwrModeManual = 3; - - /* sanity check for Other input parameter */ - switch (u1TxPwrModeManual) { - case 0: - if (u1TxPwrRateManual > 3 || u1TxPwrBwManual > 0) - Ret = NDIS_STATUS_FAILURE; - break; - case 1: - if (u1TxPwrRateManual > 7 || u1TxPwrBwManual > 0) - Ret = NDIS_STATUS_FAILURE; - break; - case 2: - if (u1TxPwrBwManual == 20) { - if (u1TxPwrRateManual > 7) - Ret = NDIS_STATUS_FAILURE; - } else if (u1TxPwrBwManual == 40) { - if (u1TxPwrRateManual > 8) - Ret = NDIS_STATUS_FAILURE; - } else - Ret = NDIS_STATUS_FAILURE; - break; - case 3: - if (u1TxPwrBwManual == 20) { - if (u1TxPwrRateManual > 9) - Ret = NDIS_STATUS_FAILURE; - } else if (u1TxPwrBwManual == 40) { - if (u1TxPwrRateManual > 0) - Ret = NDIS_STATUS_FAILURE; - } else - Ret = NDIS_STATUS_FAILURE; - break; - default: - Ret = TxPowerManualCtrl(pAd, fgPwrManCtrl, u1TxPwrModeManual, - u1TxPwrBwManual, u1TxPwrRateManual, - i1TxPwrValueManual, Band); - } - return Ret; -} -#endif - -static INT32 MT_ATESetCfgOnOff(RTMP_ADAPTER *pAd, UINT32 Type, UINT32 Enable) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Type:%d, Enable:%d, control_band_idx:%d\n", __func__, - Type, Enable, control_band_idx)); -#ifdef CONFIG_HW_HAL_OFFLOAD - Ret = MtCmdCfgOnOff(pAd, Type, Enable, control_band_idx); -#endif - return Ret; -} - -static INT32 MT_ATEGetCfgOnOff(RTMP_ADAPTER *pAd, UINT32 Type, UINT32 *Result) -{ - INT32 Ret = 0; -#if defined(COMPOS_TESTMODE_WIN) - UINT32 Value = 0; - GET_TSSI_STATUS_T *pResult = - (GET_TSSI_STATUS_T *)((UINT8 *)pAd->FWRspContent + - sizeof(EVENT_RXD) + - sizeof(EXT_EVENT_ATE_TEST_MODE_T)); -#endif -#ifdef CONFIG_HW_HAL_OFFLOAD - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - Ret = MtCmdGetCfgOnOff(pAd, Type, control_band_idx, Result); - os_msec_delay(30); -#endif -#if defined(COMPOS_TESTMODE_WIN) - *Result = OS_NTOHL(pResult->ucEnable); -#endif - return Ret; -} - -static INT32 MT_ATESetAntennaPort(RTMP_ADAPTER *pAd, UINT32 RfModeMask, - UINT32 RfPortMask, UINT32 AntPortMask) -{ - INT32 Ret = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: RfModeMask:%d RfPortMask:%d AntPortMask:%d\n", __func__, - (UINT8)RfModeMask, (UINT8)RfPortMask, (UINT8)AntPortMask)); -#ifdef CONFIG_HW_HAL_OFFLOAD - Ret = MtCmdSetAntennaPort(pAd, (UINT8)RfModeMask, (UINT8)RfPortMask, - (UINT8)AntPortMask); -#endif - return Ret; -} - -static INT32 MT_ATEFWPacketCMDClockSwitchDisable(RTMP_ADAPTER *pAd, - UINT8 isDisable) -{ - INT32 Ret = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: isDsiable=%d\n", __func__, (UINT8)isDisable)); - Ret = MtCmdClockSwitchDisable(pAd, isDisable); - return Ret; -} - -static INT32 MT_ATESetRXFilterPktLen(RTMP_ADAPTER *pAd, UINT32 Enable, - UINT32 RxPktLen) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Enable:%d, control_band_idx:%d, RxPktLen:%d\n", __func__, - Enable, control_band_idx, RxPktLen)); -#ifdef CONFIG_HW_HAL_OFFLOAD - Ret = MtCmdRxFilterPktLen(pAd, Enable, control_band_idx, RxPktLen); -#endif - return Ret; -} - -static INT32 MT_ATEGetTxPower(RTMP_ADAPTER *pAd, UINT32 Channel, UINT32 Ch_Band, - UINT32 *EfuseAddr, UINT32 *Power) -{ - INT32 Ret = 0; -#if defined(COMPOS_TESTMODE_WIN) - EXT_EVENT_ID_GET_TX_POWER_T *pResult = - (EXT_EVENT_ID_GET_TX_POWER_T *)((UINT8 *)pAd->FWRspContent + - sizeof(EVENT_RXD)); -#endif - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - EXT_EVENT_ID_GET_TX_POWER_T TxPowerResult; - INT32 Type = 1; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Channel:%d, control_band_idx:%d, Ch_Band:%d\n", __func__, - Channel, control_band_idx, Ch_Band)); - Ret = MtCmdGetTxPower(pAd, Type, Channel, control_band_idx, Ch_Band, - &TxPowerResult); - os_msec_delay(30); -#if defined(MT7615) || defined(MT7622) - *EfuseAddr = TxPowerResult.ucEfuseAddr; - *Power = TxPowerResult.ucEfuseContent; -#else -#endif /* defined(MT7615) || defined(MT7622) */ -#if defined(COMPOS_TESTMODE_WIN) - *EfuseAddr = OS_NTOHL(pResult->ucEfuseAddr); - *Power = OS_NTOHL(pResult->ucEfuseContent); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EfuseAddr:%d Power:%d\n", __func__, *EfuseAddr, *Power)); - return Ret; -} - -static INT32 MT_ATEBssInfoUpdate(RTMP_ADAPTER *pAd, UINT32 OwnMacIdx, - UINT32 BssIdx, UCHAR *Bssid) -{ - INT32 Ret = 0; -#if !defined(COMPOS_TESTMODE_WIN) /* TODO::UNIYSW */ - BSS_INFO_ARGUMENT_T bss_info_argument; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: OwnMacIdx:%d BssIdx:%d Bssid:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, OwnMacIdx, BssIdx, PRINT_MAC(Bssid))); - NdisZeroMemory(&bss_info_argument, sizeof(BSS_INFO_ARGUMENT_T)); - bss_info_argument.OwnMacIdx = OwnMacIdx; - bss_info_argument.ucBssIndex = BssIdx; - os_move_mem(bss_info_argument.Bssid, Bssid, MAC_ADDR_LEN); - bss_info_argument.ucBcMcWlanIdx = MCAST_WCID_TO_REMOVE; - bss_info_argument.NetworkType = NETWORK_INFRA; - bss_info_argument.u4ConnectionType = CONNECTION_INFRA_AP; - bss_info_argument.CipherSuit = Ndis802_11WEPDisabled; - bss_info_argument.bss_state = BSS_ACTIVE; - bss_info_argument.u4BssInfoFeature = BSS_INFO_BASIC_FEATURE; - Ret = AsicBssInfoUpdate(pAd, bss_info_argument); -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - return Ret; -} - -static INT32 MT_ATEDevInfoUpdate(RTMP_ADAPTER *pAd, UINT32 OwnMacIdx, - UCHAR *Bssid) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: control_band_idx:%d OwnMacIdx:%d Bssid:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, control_band_idx, OwnMacIdx, PRINT_MAC(Bssid))); -#if !defined(COMPOS_TESTMODE_WIN) /* TODO::UNIYSW */ - Ret = AsicDevInfoUpdate(pAd, OwnMacIdx, Bssid, control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - return Ret; -} - -static INT32 MT_SetFFTMode(struct _RTMP_ADAPTER *pAd, UINT32 mode) -{ - INT32 Ret = 0; - return Ret; -} - -#ifdef LOGDUMP_TO_FILE -static INT32 MT_ATERDDParseResult(struct _ATE_LOG_DUMP_ENTRY entry, INT idx, - RTMP_OS_FD_EXT fd) -#else -static INT32 MT_ATERDDParseResult(struct _ATE_LOG_DUMP_ENTRY entry, INT idx) -#endif -{ - struct _ATE_RDD_LOG *result = &entry.log.rdd; - UINT32 *pulse = (UINT32 *)result->aucBuffer; - - if (!result->byPass) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RDD]0x%08x %08x\n", result->u4Prefix, - result->u4Count)); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[RDD]0x%08x %08x\n", pulse[0], pulse[1])); - return 0; -} - -INT32 MT_ATERFTestCB(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - INT32 ret = 0; - EXT_EVENT_RF_TEST_RESULT_T *result = (EXT_EVENT_RF_TEST_RESULT_T *)Data; - EXT_EVENT_RF_TEST_DATA_T *data = - (EXT_EVENT_RF_TEST_DATA_T *)result->aucEvent; - static INT total; - static INT EventType; - static UINT32 recal_type; - BOOLEAN test_done = FALSE; - - /* Length of Event ACK */ - if (Length == sizeof(struct _EVENT_EXT_CMD_RESULT_T)) - test_done = TRUE; - - if (test_done) - goto done; -#ifdef PRE_CAL_MT7622_SUPPORT - if ((!pAd->bPreCalMode) && (!(pAd->ATECtrl.Mode & fATE_IN_RFTEST))) -#else - if (!(pAd->ATECtrl.Mode & fATE_IN_RFTEST)) -#endif /* PRE_CAL_MT7622_SUPPORT */ - return ret; - result->u4FuncIndex = le2cpu32(result->u4FuncIndex); - EventType = result->u4FuncIndex; - - switch (EventType) { - case RDD_TEST_MODE: - if (pAd->ATECtrl.en_log & fATE_LOG_RDD) { - struct _ATE_RDD_LOG unit; - struct _EVENT_WIFI_RDD_TEST_T *log = - (struct _EVENT_WIFI_RDD_TEST_T *)Data; - UINT64 *data = (UINT64 *)log->aucBuffer; - INT i = 0; - UINT len = 0; - - log->u4FuncLength = le2cpu32(log->u4FuncLength); - log->u4Prefix = le2cpu32(log->u4Prefix); - log->u4Count = le2cpu32(log->u4Count); - - len = (log->u4FuncLength - - sizeof(struct _EVENT_WIFI_RDD_TEST_T) + - sizeof(log->u4FuncIndex) + - sizeof(log->u4FuncIndex)) >> - 3; - - if (pAd->ATECtrl.en_log & fATE_LOG_TEST) { - const UINT dbg_len = - (log->u4FuncLength - - sizeof(struct _EVENT_WIFI_RDD_TEST_T) + - sizeof(log->u4FuncIndex) + - sizeof(log->u4FuncIndex)) >> - 2; - UINT32 *tmp = (UINT32 *)log->aucBuffer; - - for (i = 0; i < dbg_len; i++) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("RDD RAW DWORD%d:%08x\n", i, - tmp[i])); - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RDD FuncLen:%u, len:%u, prefix:%08x, cnt:%u\n", - __func__, log->u4FuncLength, len, - log->u4Prefix, log->u4Count)); - } - - os_zero_mem(&unit, sizeof(unit)); - unit.u4Prefix = log->u4Prefix; - unit.u4Count = log->u4Count; - - for (i = 0; i < len; i++) { - NdisMoveMemory(unit.aucBuffer, data++, - ATE_RDD_LOG_SIZE); - MT_ATEInsertLog(pAd, (UCHAR *)&unit, - fATE_LOG_RDD, sizeof(unit)); - /* byPass is used @ logDump, if the same event, don't dump same message */ - unit.byPass = TRUE; - } - } - - break; - -#ifdef INTERNAL_CAPTURE_SUPPORT - case GET_ICAP_CAPTURE_STATUS: - if (IS_MT7615(pAd)) - ExtEventICapStatusHandler(pAd, Data, Length); - break; - - case GET_ICAP_RAW_DATA: - RTEnqueueInternalCmd(pAd, CMDTHRED_ICAP_DUMP_RAW_DATA, - (VOID *)Data, Length); - break; -#endif /* INTERNAL_CAPTURE_SUPPORT */ - - case RE_CALIBRATION: - if (data) { - struct _ATE_LOG_RECAL re_cal; - INT i = 0; - UINT32 cal_idx = 0; - UINT32 cal_type = 0; - UINT32 len = 0; - UINT32 *dump_tmp = (UINT32 *)data->aucData; - struct _ATE_LOG_DUMP_CB *log_cb = NULL; -#ifdef PRE_CAL_MT7622_SUPPORT - UINT32 *cal_log = NULL; - if (IS_MT7622(pAd)) { - if (pAd->bPreCalMode) - os_alloc_mem(pAd, (UCHAR **)&cal_log, - CAL_LOG_SIZE); - } -#endif /* PRE_CAL_MT7622_SUPPORT */ - data->u4CalIndex = le2cpu32(data->u4CalIndex); - data->u4CalType = le2cpu32(data->u4CalType); - result->u4PayloadLength = - le2cpu32(result->u4PayloadLength); - cal_idx = data->u4CalIndex; - cal_type = data->u4CalType; - len = result->u4PayloadLength; - len = (len - sizeof(EXT_EVENT_RF_TEST_DATA_T)) >> 2; - log_cb = &pAd->ATECtrl.log_dump[ATE_LOG_RE_CAL - 1]; - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, */ - /* ("CalType:%x\n", cal_type)); */ - re_cal.cal_idx = cal_idx; - re_cal.cal_type = cal_type; - - if (total == 0) { - recal_type = cal_type; - log_cb->recal_curr_type = recal_type; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("[Recal][%08x][START]\n", - recal_type)); - } - - total += result->u4PayloadLength; - - if ((cal_type == CAL_ALL) && (total == CAL_ALL_LEN)) - test_done = TRUE; - - for (i = 0; i < len; i++) { - dump_tmp[i] = le2cpu32(dump_tmp[i]); - if (i & 0x1) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%08x\n", dump_tmp[i])); - re_cal.cr_val = dump_tmp[i]; -#ifdef PRE_CAL_MT7622_SUPPORT - if (IS_MT7622(pAd)) { - cal_log[(i - 1) / 2] = - dump_tmp[i]; - } -#endif /* PRE_CAL_MT7622_SUPPORT */ - if (pAd->ATECtrl.en_log & - fATE_LOG_RE_CAL) - MT_ATEInsertLog( - pAd, (UCHAR *)&re_cal, - fATE_LOG_RE_CAL, - sizeof(re_cal)); - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("[Recal][%08x][%08x]", - cal_type, dump_tmp[i])); - re_cal.cr_addr = dump_tmp[i]; - } - } -#ifdef PRE_CAL_MT7622_SUPPORT - if (IS_MT7622(pAd)) { - if (pAd->bPreCalMode) { - if (cal_type == TX_LPFG) { - MTWF_LOG( - DBG_CAT_TEST, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[cal_type][TX_LPFG]len=%d\n", - len)); - RTMPZeroMemory( - pAd->CalTXLPFGImage, - CAL_TXLPFG_SIZE); - memcpy(pAd->CalTXLPFGImage, - cal_log, - CAL_TXLPFG_SIZE); - } else if (cal_type == TX_DCIQC) { - MTWF_LOG( - DBG_CAT_TEST, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[cal_type][TX_DCIQC]len=%d\n", - len)); - RTMPZeroMemory( - pAd->CalTXDCIQImage, - CAL_TXDCIQ_SIZE); - memcpy(pAd->CalTXDCIQImage, - cal_log, - CAL_TXDCIQ_SIZE); - } else if (cal_type == TX_DPD_LINK) { - UINT16 tmp_len = (len / 2) * - sizeof(UINT32); - - MTWF_LOG( - DBG_CAT_TEST, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[cal_type][TX_DPD], ofset=%x, len =%d\n", - pAd->TxDpdCalOfst, - tmp_len)); - memcpy(pAd->CalTXDPDImage + - pAd->TxDpdCalOfst, - cal_log, tmp_len); - pAd->TxDpdCalOfst += tmp_len; - } - os_free_mem(cal_log); - } - } -#endif /* PRE_CAL_MT7622_SUPPORT */ - } - break; - - case CALIBRATION_BYPASS: - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: No RF Test Event %x Dump\n", __func__, - result->u4FuncIndex)); - break; - } - -done: - - if (test_done) { - if (EventType == RE_CALIBRATION) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[Recal][%08x][END]\n", recal_type)); - } - - total = 0; - EventType = 0; - recal_type = 0; - } - - return ret; -} - -#ifdef ATE_TXTHREAD -static INT32 MT_ATEMPSRunStatCheck(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _HQA_MPS_CB *mps_cb = - TESTMODE_GET_PADDR(ATECtrl, band_idx, mps_cb); - struct _HQA_MPS_SETTING *mps_setting = NULL; - UINT32 txed_cnt = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxedCount); - UINT32 tx_cnt = TESTMODE_GET_PARAM(ATECtrl, band_idx, TxCount); - UINT32 idx = 0; - INT32 ret = 0; - - if (!mps_cb) - goto err0; - - mps_setting = mps_cb->mps_setting; - - if (!mps_setting) - goto err0; - - idx = mps_cb->ref_idx; - - if ((mps_cb->stat & ATE_MPS_ITEM_RUNNING) && (txed_cnt >= tx_cnt)) { - /* UCHAR mode = TESTMODE_GET_PARAM(ATECtrl, band_idx, Mode); */ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: MPS Item Finished idx:%d mps_cnt:%d\n", __func__, - idx, mps_cb->mps_cnt)); - OS_SPIN_LOCK(&mps_cb->lock); - mps_cb->stat = 0; - OS_SPIN_UNLOCK(&mps_cb->lock); - - if (idx > mps_cb->mps_cnt) { - UINT32 mode = - TESTMODE_GET_PARAM(ATECtrl, band_idx, Mode); - mode &= ~fATE_MPS; - mps_cb->setting_inuse = FALSE; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: MPS All Finished idx:%d mps_cnt:%d\n", - __func__, idx, mps_cb->mps_cnt)); - TESTMODE_SET_PARAM(ATECtrl, band_idx, Mode, mode); - ret = MT_MPSTxStop(pAd); - } - } - - return ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: mps_cb/mps_setting NULL %p %p\n", __func__, mps_cb, - mps_setting)); - return -1; -} -#endif - -static INT32 MT_ATEMPSLoadSetting(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_op = ATECtrl->ATEOp; - struct _HQA_MPS_CB *mps_cb = - TESTMODE_GET_PADDR(ATECtrl, band_idx, mps_cb); - struct _HQA_MPS_SETTING *mps_setting = NULL; - UCHAR *pate_pkt = TESTMODE_GET_PARAM(ATECtrl, band_idx, pate_pkt); - INT idx = 0; - UCHAR phymode = 0; - CHAR ant_sel = 0; - UCHAR mcs = 0; - INT32 ret = 0; - UINT32 pwr = 0; - UINT32 pkt_len = 0; - UINT32 pkt_cnt = 0; - UINT32 nss = 0; - UINT32 pkt_bw = 0; - UINT32 Channel = TESTMODE_GET_PARAM(ATECtrl, band_idx, Channel); - UINT32 Ch_Band = TESTMODE_GET_PARAM(ATECtrl, band_idx, Ch_Band); - ATE_TXPOWER TxPower; - os_zero_mem(&TxPower, sizeof(TxPower)); - - if (!mps_cb) - goto err0; - - mps_setting = mps_cb->mps_setting; - - if (!mps_setting) - goto err0; - - OS_SPIN_LOCK(&mps_cb->lock); - - if (mps_cb->stat & ATE_MPS_ITEM_RUNNING) - goto err1; - - mps_cb->stat |= ATE_MPS_ITEM_RUNNING; - idx = mps_cb->ref_idx; - - if (idx > mps_cb->mps_cnt) - goto err2; - - phymode = (mps_setting[idx].phy & 0x0f000000) >> 24; - ant_sel = (mps_setting[idx].phy & 0x00ffff00) >> 8; - mcs = (mps_setting[idx].phy & 0x000000ff); - pwr = mps_setting[idx].pwr; - pkt_len = mps_setting[idx].pkt_len; - pkt_cnt = mps_setting[idx].pkt_cnt; - nss = mps_setting[idx].nss; - pkt_bw = mps_setting[idx].pkt_bw; - TESTMODE_SET_PARAM(ATECtrl, band_idx, PhyMode, phymode); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxAntennaSel, ant_sel); - TESTMODE_SET_PARAM(ATECtrl, band_idx, Mcs, mcs); - TESTMODE_SET_PARAM(ATECtrl, band_idx, Nss, nss); - TESTMODE_SET_PARAM(ATECtrl, band_idx, PerPktBW, pkt_bw); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxLength, pkt_len); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxCount, pkt_cnt); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxDoneCount, 0); - TESTMODE_SET_PARAM(ATECtrl, band_idx, TxedCount, 0); - ATECtrl->TxPower0 = pwr; - TxPower.Power = pwr; - TxPower.Channel = Channel; - TxPower.Dbdc_idx = band_idx; - TxPower.Band_idx = Ch_Band; - OS_SPIN_UNLOCK(&mps_cb->lock); - ret = ate_op->SetTxPower0(pAd, TxPower); - ATECtrl->need_set_pwr = TRUE; - - if (mps_cb->ref_idx != 1) - ret = MT_ATEGenPkt(pAd, pate_pkt, band_idx); - - mps_cb->ref_idx++; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Item[%d], PhyMode:%x, TxPath:%x, Rate:%x, PktLen:%u, PktCount:%u, Pwr:%x\n", - idx, phymode, ant_sel, mcs, pkt_len, pkt_cnt, pwr)); - return ret; -err2: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: mps_cb->ref_idx %d mps_cnt %d\n", __func__, - mps_cb->ref_idx, mps_cb->mps_cnt)); -err1: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: item[%d] is running\n", __func__, mps_cb->ref_idx - 1)); - OS_SPIN_UNLOCK(&mps_cb->lock); - return ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: mps_cb/mps_setting NULL %p %p\n", __func__, mps_cb, - mps_setting)); - return -1; -} - -static INT32 MT_ATEMPSInit(RTMP_ADAPTER *pAd) -{ - INT ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _HQA_MPS_CB *mps_cb = &ATECtrl->mps_cb; - - if (mps_cb->mps_setting) - os_free_mem(mps_cb->mps_setting); - - NdisZeroMemory(mps_cb, sizeof(*mps_cb)); - mps_cb->setting_inuse = FALSE; - mps_cb->mps_cnt = 0; - mps_cb->band_idx = 0; - mps_cb->stat = 0; - mps_cb->ref_idx = 1; - mps_cb->mps_setting = NULL; - NdisAllocateSpinLock(pAd, &mps_cb->lock); - return ret; -} - -static INT32 MT_ATEMPSRelease(RTMP_ADAPTER *pAd) -{ - INT ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _HQA_MPS_CB *mps_cb = &ATECtrl->mps_cb; - - if (mps_cb->mps_setting) - os_free_mem(mps_cb->mps_setting); - - mps_cb->mps_setting = NULL; - mps_cb->setting_inuse = FALSE; - mps_cb->mps_cnt = 0; - mps_cb->stat = 0; - mps_cb->band_idx = 0; - mps_cb->ref_idx = 1; - NdisFreeSpinLock(&mps_cb->lock); - return ret; -} - -INT32 MT_SetATEMPSDump(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _HQA_MPS_CB *mps_cb = &ATECtrl->mps_cb; - struct _HQA_MPS_SETTING *mps_setting = mps_cb->mps_setting; - UINT32 i = 0; - mps_cb = TESTMODE_GET_PADDR(ATECtrl, band_idx, mps_cb); - mps_setting = mps_cb->mps_setting; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s-band[%u]::\n", __func__, band_idx)); - - if (!mps_setting) - return -1; - - for (i = 1; i <= mps_cb->mps_cnt; i++) { - UINT32 phy = (mps_setting[i].phy & ~0xf0ffffff) >> 24; - UINT32 path = (mps_setting[i].phy & ~0xff0000ff) >> 8; - UINT32 rate = (mps_setting[i].phy & ~0xffffff00); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Item[%d], PhyMode:%x, TxPath:%x, Rate:%x, PktLen:%u, PktCount:%u, Pwr:%x Nss:%u, Bw:%u\n", - i, phy, path, rate, mps_setting[i].pkt_len, - mps_setting[i].pkt_cnt, mps_setting[i].pwr, - mps_setting[i].nss, mps_setting[i].pkt_bw)); - } - - return 0; -} - -static INT32 MT_MPSSetParm(RTMP_ADAPTER *pAd, enum _MPS_PARAM_TYPE type, - INT32 items, UINT32 *data) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - INT32 i = 0; - UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); - struct _HQA_MPS_CB *mps_cb = - TESTMODE_GET_PADDR(ATECtrl, control_band_idx, mps_cb); - struct _HQA_MPS_SETTING *mps_setting; - - if ((items > 1024) || (items == 0)) - goto MT_MPSSetParm_RET_FAIL; - - if (mode & fATE_MPS) - goto MT_MPSSetParm_RET_FAIL; - - if (!mps_cb->mps_setting && !mps_cb->mps_cnt) { - mps_cb->mps_cnt = items; - mps_cb->band_idx = control_band_idx; - ret = os_alloc_mem(pAd, (UCHAR **)&mps_cb->mps_setting, - sizeof(struct _HQA_MPS_SETTING) * - (items + 1)); - - if (ret == NDIS_STATUS_FAILURE) - goto MT_MPSSetParm_RET_FAIL; - - NdisZeroMemory(mps_cb->mps_setting, - sizeof(struct _HQA_MPS_SETTING) * (items + 1)); - } - - mps_setting = mps_cb->mps_setting; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: control_band_idx:%u, items:%d, Mode:%x, mps_cb:%p, mps_set:%p\n", - __func__, control_band_idx, items, mode, mps_cb, mps_setting)); - - switch (type) { - case MPS_SEQDATA: - mps_setting[0].phy = 1; - - for (i = 0; i < items; i++) - mps_setting[i + 1].phy = data[i]; - - break; - - case MPS_PHYMODE: - mps_setting[0].phy = 1; - - for (i = 0; i < items; i++) { - mps_setting[i + 1].phy &= 0xf0ffffff; - mps_setting[i + 1].phy |= (data[i] << 24) & 0x0f000000; - } - - break; - - case MPS_PATH: - mps_setting[0].phy = 1; - - for (i = 0; i < items; i++) { - mps_setting[i + 1].phy &= 0xff0000ff; - mps_setting[i + 1].phy |= (data[i] << 8) & 0x00ffff00; - } - - break; - - case MPS_RATE: - mps_setting[0].phy = 1; - - for (i = 0; i < items; i++) { - mps_setting[i + 1].phy &= 0xffffff00; - mps_setting[i + 1].phy |= (0x000000ff & data[i]); - } - - break; - - case MPS_PAYLOAD_LEN: - mps_setting[0].pkt_len = 1; - - for (i = 0; i < items; i++) { - if (data[i] > MAX_TEST_PKT_LEN) - data[i] = MAX_TEST_PKT_LEN; - else if (data[i] < MIN_TEST_PKT_LEN) - data[i] = MIN_TEST_PKT_LEN; - - mps_setting[i + 1].pkt_len = data[i]; - } - - break; - - case MPS_TX_COUNT: - mps_setting[0].pkt_cnt = 1; - - for (i = 0; i < items; i++) - mps_setting[i + 1].pkt_cnt = data[i]; - - break; - - case MPS_PWR_GAIN: - mps_setting[0].pwr = 1; - - for (i = 0; i < items; i++) - mps_setting[i + 1].pwr = data[i]; - - break; - - case MPS_NSS: - mps_setting[0].nss = 1; - - for (i = 0; i < items; i++) - mps_setting[i + 1].nss = data[i]; - - break; - - case MPS_PKT_BW: - mps_setting[0].pkt_bw = 1; - - for (i = 0; i < items; i++) - mps_setting[i + 1].pkt_bw = data[i]; - - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: unknown setting type\n", __func__)); - break; - } - - return ret; -MT_MPSSetParm_RET_FAIL: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s-fail, control_band_idx:%u, items:%d, Mode:%x\n", __func__, - control_band_idx, items, mode)); - return NDIS_STATUS_FAILURE; -} - -static INT32 MT_MPSTxStart(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - struct _HQA_MPS_CB *mps_cb = - TESTMODE_GET_PADDR(ATECtrl, control_band_idx, mps_cb); - struct _HQA_MPS_SETTING *mps_setting = mps_cb->mps_setting; - UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); - UINT32 mps_cnt = mps_cb->mps_cnt; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx:%u, items:%u\n", __func__, - control_band_idx, mps_cnt)); - - if (!mps_setting || !mps_cnt || (mode & ATE_MPS)) - goto MPS_START_ERR; - - if (mps_cb->setting_inuse) - goto MPS_START_ERR; - - mode |= fATE_MPS; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - mps_cb->ref_idx = 1; - mps_cb->setting_inuse = TRUE; - ret = MT_SetATEMPSDump(pAd, control_band_idx); - ret = MT_ATEMPSLoadSetting(pAd, control_band_idx); - ret = ATEOp->StartTx(pAd); - return ret; -MPS_START_ERR: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s error, mode:0x%x, mps_cnt:%x, MPS_SETTING: %p\n", - __func__, mode, mps_cnt, mps_setting)); - return ret; -} - -static INT32 MT_MPSTxStop(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); - struct _HQA_MPS_CB *mps_cb = - TESTMODE_GET_PADDR(ATECtrl, control_band_idx, mps_cb); - struct _HQA_MPS_SETTING *mps_setting = mps_cb->mps_setting; - - mode &= ~ATE_TXFRAME; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: control_band_idx:%u, Mode:%x, inuse:%x, setting_addr:%p\n", - __func__, control_band_idx, mode, mps_cb->setting_inuse, - mps_setting)); - - if (!(mode & ATE_MPS) && mps_setting && !mps_cb->setting_inuse) { - struct _HQA_MPS_SETTING **setting_addr = &(mps_cb->mps_setting); - mps_cb->mps_cnt = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: bf free mem %p\n", __func__, mps_setting)); - os_free_mem(*setting_addr); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: af free mem %p\n", __func__, mps_setting)); - *setting_addr = NULL; - } - - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - return ret; -} - -static INT32 MT_ATESetAutoResp(RTMP_ADAPTER *pAd, UCHAR *mac, UCHAR mode) -{ - INT32 ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR *sa = NULL; -#ifdef CONFIG_AP_SUPPORT - sa = ATECtrl->Addr3; -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); -#if !defined(COMPOS_TESTMODE_WIN) - - if (mode) { - if (sa) - NdisMoveMemory(sa, mac, MAC_ADDR_LEN); - - AsicDevInfoUpdate(pAd, 0x0, mac, control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); - } else { - AsicDevInfoUpdate(pAd, 0x0, pAd->CurrentAddress, - control_band_idx, TRUE, - DEVINFO_ACTIVE_FEATURE); - } - -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - return ret; -} - -static INT32 MT_EfuseGetFreeBlock(RTMP_ADAPTER *pAd, UINT32 GetFreeBlock, - UINT32 *Value) -{ - INT32 Ret = 0; -#if defined(COMPOS_TESTMODE_WIN) - EXT_EVENT_EFUSE_FREE_BLOCK_T *pResult = - (EXT_EVENT_EFUSE_FREE_BLOCK_T *)((UINT8 *)pAd->FWRspContent + - sizeof(EVENT_RXD)); -#endif - Ret = MtCmdEfuseFreeBlockCount(pAd, GetFreeBlock, Value); -#if defined(COMPOS_TESTMODE_WIN) - /* workaround for MtCmdEfuseFreeBlockCount not waiting event back when repoen QA second times */ - RTMPusecDelay(30000); - *Value = OS_NTOHL(pResult->ucFreeBlockNum); -#endif - return Ret; -} - -static INT32 MT_RfRegWrite(RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, - UINT32 Value) -{ - INT32 Ret = 0; - Ret = MtCmdRFRegAccessWrite(pAd, WFSel, Offset, Value); - return Ret; -} - -static INT32 MT_RfRegRead(RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, - UINT32 *Value) -{ - INT32 Ret = 0; -#if defined(COMPOS_TESTMODE_WIN) - EXT_CMD_RF_REG_ACCESS_T *pResult = - (EXT_CMD_RF_REG_ACCESS_T *)((UINT8 *)pAd->FWRspContent + - sizeof(EVENT_RXD)); -#endif - Ret = MtCmdRFRegAccessRead(pAd, WFSel, Offset, Value); -#if defined(COMPOS_TESTMODE_WIN) - *Value = OS_NTOHL(pResult->u4Data); -#endif - return Ret; -} - -static INT32 MT_GetFWInfo(RTMP_ADAPTER *pAd, UCHAR *FWInfo) -{ - struct fwdl_ctrl *ctrl = &pAd->MCUCtrl.fwdl_ctrl; - UCHAR op_mode; - UINT32 loop; - UCHAR date[8] = { '\0' }; - UCHAR time[6] = { '\0' }; - UCHAR *kernel_info = NULL; - UINT8 month = 0; - UCHAR *month_array[12] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", - }; - - /* Get information from kernel */ - for (loop = 0; loop < 12; loop++) { - kernel_info = strstr(utsname()->version, month_array[loop]); - - if (kernel_info) - break; - } - - op_mode = (UCHAR)pAd->OpMode; /* 0: STA, 1: AP, 2: ADHOC, 3: APSTA */ - /* Driver build time */ - os_move_mem(&time[0], kernel_info + 7, 2); - os_move_mem(&time[2], kernel_info + 10, 2); - os_move_mem(&time[4], kernel_info + 13, 2); - /* Driver build date */ - os_move_mem(&date[0], kernel_info + 20, 4); - os_move_mem(&date[6], kernel_info + 4, 2); - - for (loop = 0; loop < 12; loop++) { - if (os_cmp_mem(month_array[loop], kernel_info, 3) == 0) { - month = loop + 1; - break; - } - } - - date[4] = month / 10 % 10 + '0'; - date[5] = month % 10 + '0'; - /* Command combination */ - os_move_mem(FWInfo, &op_mode, sizeof(op_mode)); - os_move_mem((FWInfo + sizeof(op_mode)), &date, sizeof(date)); - os_move_mem((FWInfo + sizeof(op_mode) + sizeof(date)), &time, - sizeof(time)); - os_move_mem((FWInfo + sizeof(op_mode) + sizeof(date) + sizeof(time)), - ctrl->fw_profile[WM_CPU].source.img_ptr + - ctrl->fw_profile[WM_CPU].source.img_len - 19, - 15); - return 0; -} - -#ifdef TXBF_SUPPORT -/* ========================================================================== - * Description: - * Set ATE Tx Beamforming mode - * - * Return: - * TRUE if all parameters are OK, FALSE otherwise - * ========================================================================== - */ - -#ifdef MT_MAC -/* - *========================================================================== - * Description: - * Enable sounding trigger - * - * Return: - * TRUE if all parameters are OK, FALSE otherwise - *========================================================================== -*/ -INT MT_SetATESoundingProc(RTMP_ADAPTER *pAd, UCHAR SDEnFlg) -{ - /* struct _ATE_CTRL *AteCtrl = &pAd->ATECtrl; */ - /* Enable sounding trigger in FW */ - /* return CmdETxBfSoundingPeriodicTriggerCtrl(pAd, BSSID_WCID, SDEnFlg); */ - /* return MtCmdETxBfSoundingPeriodicTriggerCtrl(pAd, BSSID_WCID, SDEnFlg, AteCtrl->BW); */ - return -1; -} - -static INT32 MT_ATEStartTxSKB(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *if_ops = ATECtrl->ATEIfOps; - INT32 Ret = 0; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UCHAR *pate_pkt = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, pate_pkt); - UCHAR cntl_ch = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, ControlChl); - UCHAR ch = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Channel); - UINT32 mode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mode); - UINT32 tx_cnt = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxCount); - UCHAR bw = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, BW); - /* MT_SWITCH_CHANNEL_CFG ch_cfg; */ - INT8 wdev_idx = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, wdev_idx); -#ifdef ARBITRARY_CCK_OFDM_TX - UINT32 tx_sel = - TESTMODE_GET_PARAM(ATECtrl, control_band_idx, TxAntennaSel); - UINT8 phymode = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, PhyMode); -#endif - UINT32 Rate = TESTMODE_GET_PARAM(ATECtrl, control_band_idx, Mcs); -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; -#endif -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - union WTBL_DW5 wtbl_txcap; -#else - union WTBL_2_DW9 wtbl_txcap; -#endif - UINT32 DwMask = 0; - UINT32 Ring = 0; - CMD_WTBL_RAW_DATA_RW_T rWtblRawDataRw = { 0 }; - rWtblRawDataRw.u2Tag = WTBL_RAW_DATA_RW; - rWtblRawDataRw.u2Length = sizeof(CMD_WTBL_RAW_DATA_RW_T); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: control_band_idx:%u, ch:%x, cntl_ch:%x, wdev_idx:%x\n", - __func__, control_band_idx, ch, cntl_ch, wdev_idx)); - - if (!pate_pkt) - goto err0; - - /* TxRx swtich Recover */ - - if (mode & ATE_TXFRAME) - goto err1; - - MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, control_band_idx); -#ifdef ARBITRARY_CCK_OFDM_TX - if (IS_MT7615(pAd)) { - MtATEInitCCK_OFDM_Path(pAd, control_band_idx); - - if (phymode == MODE_CCK || phymode == MODE_OFDM) - MtATESetCCK_OFDM_Path(pAd, tx_sel, control_band_idx); - } -#endif - - if (Rate == 32) { -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - DwMask = ~(3 << 12); /* only update fcap bit[13:12] */ - wtbl_txcap.field.fcap = bw; - /* WTBLDW5 */ - WtblDwSet(pAd, ATECtrl->wcid_ref, 1, 5, DwMask, - wtbl_txcap.word); -#else - DwMask = ~(3 << 14); /* only update fcap bit[15:14] */ - wtbl_txcap.field.fcap = bw; - /* WTBL2DW9 */ - WtblDwSet(pAd, ATECtrl->wcid_ref, 2, 9, DwMask, - wtbl_txcap.word); -#endif - } - - MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE, control_band_idx); - msleep(30); - /* Stop send TX packets */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_STOP_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - - if (mode & ATE_RXFRAME) - MtATESetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE, control_band_idx); - - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_START_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - - /* Prepare Tx packet */ - if (if_ops->setup_frame) - Ret = if_ops->setup_frame(pAd, QID_AC_BE); - else - Ret = MT_ATEGenPkt(pAd, pate_pkt, control_band_idx); - - if (Ret) - goto err0; - - if (tx_cnt != 0xFFFFFFFF) { -#ifndef ATE_TXTHREAD - tx_cnt += TESTMODE_GET_PARAM(ATECtrl, control_band_idx, - TxDoneCount); -#endif - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, TxCount, tx_cnt); - } - - /* Tx Frame */ - mode |= ATE_TXFRAME; - TESTMODE_SET_PARAM(ATECtrl, control_band_idx, Mode, mode); - - if (if_ops->test_frame_tx) - Ret = if_ops->test_frame_tx(pAd); - else { - MtATESetMacTxRx(pAd, ASIC_MAC_TX, FALSE, control_band_idx); - - for (Ring = 0; Ring < 2000; Ring++) - MT_ATETxPkt(pAd, control_band_idx); - - Ret = MT_ATETxControl(pAd, control_band_idx, NULL); - MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, control_band_idx); - } - - if (Ret) - goto err0; - - ATECtrl->did_tx = 1; -err1: - return Ret; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Err %d, wdev_idx:%x\n", __func__, Ret, wdev_idx)); - return Ret; -} -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - -#ifdef RTMP_MAC_PCI -static INT32 pci_ate_init(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT ret = 0; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if (!ATECtrl->pate_pkt) - ret = os_alloc_mem(pAd, (PUCHAR *)&ATECtrl->pate_pkt, - ATE_TESTPKT_LEN); - - if (ret) - goto err0; - - RTMP_ASIC_INTERRUPT_ENABLE(pAd); - return NDIS_STATUS_SUCCESS; -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate test packet fail at pakcet\n", __func__)); - return NDIS_STATUS_FAILURE; -} - -static INT32 pci_clean_q(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return NDIS_STATUS_SUCCESS; -} - -static INT32 pci_ate_leave(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - RtmpChipOpsEepromHook(pAd, pAd->infType, E2P_NONE); - NICReadEEPROMParameters(pAd, NULL); - NICInitAsicFromEEPROM(pAd); - - if (ATECtrl->pate_pkt) { - os_free_mem(ATECtrl->pate_pkt); - ATECtrl->pate_pkt = NULL; - } - - return NDIS_STATUS_SUCCESS; -} -#endif - -#ifdef RTMP_MAC_PCI -static UINT32 MT_TestModeIfOpInit_PCI(struct _ATE_IF_OPERATION *ATEIfOps) -{ - UINT32 Status = 0; - ATEIfOps->init = pci_ate_init; - ATEIfOps->clean_trx_q = pci_clean_q; - ATEIfOps->setup_frame = NULL; - ATEIfOps->test_frame_tx = NULL; - ATEIfOps->test_frame_rx = NULL; - ATEIfOps->ate_leave = pci_ate_leave; - return Status; -} - -#elif defined(RTMP_MAC_USB) -static UINT32 MT_TestModeIfOpInit_USB(struct _ATE_IF_OPERATION *ATEIfOps) -{ - UINT32 Status = 0; - ATEIfOps->init = usb_ate_init; - ATEIfOps->clean_trx_q = usb_clean_q; - ATEIfOps->setup_frame = usb_setup_frame; - ATEIfOps->test_frame_tx = usb_test_frame_tx; - ATEIfOps->test_frame_rx = usb_test_frame_rx; - ATEIfOps->ate_leave = usb_ate_leave; - return Status; -} -#elif defined(RTMP_MAC_SDIO) -static UINT32 MT_TestModeIfOpInit_SDIO(struct _ATE_IF_OPERATION *ATEIfOps) -{ - UINT32 Status = 0; - ATEIfOps->init = sdio_ate_init; - ATEIfOps->clean_trx_q = sdio_clean_q; - ATEIfOps->setup_frame = sdio_setup_frame; - ATEIfOps->test_frame_tx = sdio_test_frame_tx; - ATEIfOps->test_frame_rx = NULL; - ATEIfOps->ate_leave = sdio_test_leave; - return Status; -} -#else -static UINT32 MT_TestModeIfOpInit_NotSupport(struct _ATE_IF_OPERATION *ATEIfOps) -{ - UINT32 Status = 0; - ATEIfOps->init = NULL; - ATEIfOps->clean_trx_q = NULL; - ATEIfOps->setup_frame = NULL; - ATEIfOps->test_frame_tx = NULL; - ATEIfOps->test_frame_rx = NULL; - ATEIfOps->ate_leave = NULL; - return Status; -} -#endif - -static UINT32 MT_TestModeIfOpInit(RTMP_ADAPTER *pAd) -{ - UINT32 Status = 0; - struct _ATE_CTRL *AteCtrl = &pAd->ATECtrl; - struct _ATE_IF_OPERATION *ATEIfOps = NULL; - os_alloc_mem(pAd, (PUCHAR *)&ATEIfOps, sizeof(*ATEIfOps)); -#if defined(RTMP_MAC_PCI) - MT_TestModeIfOpInit_PCI(ATEIfOps); -#elif defined(RTMP_MAC_SDIO) - MT_TestModeIfOpInit_SDIO(ATEIfOps); -#elif defined(RTMP_MAC_USB) - MT_TestModeIfOpInit_USB(ATEIfOps); -#else - MT_TestModeIfOpInit_NotSupport(ATEIfOps); -#endif - AteCtrl->ATEIfOps = ATEIfOps; - return Status; -} - -static UINT32 MT_TestModeOpInit(RTMP_ADAPTER *pAd) -{ - UINT32 Status = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *AteOp = NULL; - os_alloc_mem(pAd, (PUCHAR *)&AteOp, sizeof(*AteOp)); - AteOp->ATEStart = MT_ATEStart; - AteOp->ATEStop = MT_ATEStop; - AteOp->StartTx = MT_ATEStartTx; - AteOp->StartRx = MT_ATEStartRx; - AteOp->StopTx = MT_ATEStopTx; - AteOp->StopRx = MT_ATEStopRx; - AteOp->SetTxPower0 = MT_ATESetTxPower0; - AteOp->SetTxPower1 = MT_ATESetTxPower1; - AteOp->SetTxPower2 = MT_ATESetTxPower2; - AteOp->SetTxPower3 = MT_ATESetTxPower3; - AteOp->SetTxForceTxPower = MT_ATESetForceTxPower; - AteOp->SetTxPowerX = MT_ATESetTxPowerX; - AteOp->SetTxAntenna = MT_ATESetTxAntenna; - AteOp->SetRxAntenna = MT_ATESetRxAntenna; - AteOp->SetTxFreqOffset = MT_ATESetTxFreqOffset; - AteOp->GetTxFreqOffset = MT_ATEGetTxFreqOffset; - AteOp->SetChannel = MT_ATESetChannel; - AteOp->SetBW = MT_ATESetBW; - AteOp->SetDutyCycle = mt_ate_set_duty_cycle; - AteOp->SetPktTxTime = mt_ate_set_pkt_tx_time; -#ifdef PRE_CAL_MT7622_SUPPORT - if (IS_MT7622(pAd)) { - AteOp->TxDPDTest7622 = MtATE_DPD_Cal_Store_Proc_7622; - } -#endif /*PRE_CAL_MT7622_SUPPORT*/ -#ifdef PRE_CAL_TRX_SET1_SUPPORT - AteOp->RxSelfTest = MtATE_DCOC_Cal_Store_Proc; - AteOp->TxDPDTest = MtATE_DPD_Cal_Store_Proc; -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ -#ifdef PRE_CAL_TRX_SET2_SUPPORT - AteOp->PreCalTest = MtATE_Pre_Cal_Proc; -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) - AteOp->PATrim = MtATE_PA_Trim_Proc; -#endif /* CAL_BIN_FILE_SUPPORT */ -#if !defined(COMPOS_TESTMODE_WIN) /* 1 todo RX_BLK */ - AteOp->SampleRssi = MT_ATESampleRssi; -#endif - AteOp->SetIPG = mt_ate_set_ipg; - AteOp->SetSlotTime = mt_ate_set_slot_time; - AteOp->SetAIFS = MT_ATESetAIFS; - AteOp->SetPowerDropLevel = MT_ATESetPowerDropLevel; - AteOp->SetTSSI = MT_ATESetTSSI; - AteOp->LowPower = MT_ATELowPower; - AteOp->SetDPD = MT_ATESetDPD; - AteOp->StartTxTone = MT_ATEStartTxTone; - AteOp->DBDCTxTone = MT_ATEDBDCTxTone; -#ifdef TXPWRMANUAL - AteOp->SetTxPwrManual = MT_ATESetTxPwrManual; -#endif - AteOp->SetDBDCTxTonePower = MT_ATESetDBDCTxTonePower; - AteOp->SetTxTonePower = MT_ATESetTxTonePower; - AteOp->TxCWTone = MT_ATETxCWTone; - AteOp->StopTxTone = MT_ATEStopTxTone; - AteOp->StartContinousTx = MT_ATEStartContinousTx; - AteOp->StopContinousTx = MT_ATEStopContinousTx; - AteOp->RfRegWrite = MT_RfRegWrite; - AteOp->RfRegRead = MT_RfRegRead; - AteOp->EfuseGetFreeBlock = MT_EfuseGetFreeBlock; - AteOp->GetFWInfo = MT_GetFWInfo; -#if defined(TXBF_SUPPORT) && defined(MT_MAC) - AteOp->SetATETxSoundingProc = MT_SetATESoundingProc; - AteOp->StartTxSKB = MT_ATEStartTxSKB; -#endif /* MT_MAC */ - AteOp->SetICapStart = MT_ATESetICapStart; - AteOp->GetICapStatus = MT_ATEGetICapStatus; - AteOp->GetICapIQData = MT_ATEGetICapIQData; - AteOp->MPSSetParm = MT_MPSSetParm, AteOp->MPSTxStart = MT_MPSTxStart, - AteOp->MPSTxStop = MT_MPSTxStop, AteOp->SetAutoResp = MT_ATESetAutoResp, - AteOp->SetFFTMode = MT_SetFFTMode, AteOp->onOffRDD = MT_OnOffRDD, - AteOp->SetCfgOnOff = MT_ATESetCfgOnOff, - AteOp->GetCfgOnOff = MT_ATEGetCfgOnOff, - AteOp->SetRXFilterPktLen = MT_ATESetRXFilterPktLen, - AteOp->GetTxPower = MT_ATEGetTxPower, - AteOp->BssInfoUpdate = MT_ATEBssInfoUpdate, - AteOp->DevInfoUpdate = MT_ATEDevInfoUpdate, - AteOp->LogOnOff = MT_ATELogOnOff, - AteOp->SetAntennaPort = MT_ATESetAntennaPort, - AteOp->ClockSwitchDisable = MT_ATEFWPacketCMDClockSwitchDisable, - ATECtrl->ATEOp = AteOp; - return Status; -} - -INT32 MtTestModeInit(RTMP_ADAPTER *pAd) -{ - INT32 Status = 0; - Status = MT_TestModeOpInit(pAd); - Status = MT_TestModeIfOpInit(pAd); - pAd->ATECtrl.pate_pkt = NULL; - RTMP_OS_TASK_INIT(&pAd->LbCtrl.LoopBackTxTask, "ATE_LoopBackTask", pAd); - /*Unify*/ -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) - RTMP_OS_INIT_COMPLETION(&pAd->LbCtrl.LoopBackPCITxEvent); - -#endif - RTMP_OS_INIT_COMPLETION(&pAd->LbCtrl.LoopBackEvent); - os_zero_mem(&pAd->LbCtrl.LoopBackResult, - sizeof(struct _LOOPBACK_RESULT)); - pAd->LbCtrl.DebugMode = FALSE; - pAd->LbCtrl.LoopBackRunning = FALSE; - pAd->LbCtrl.LoopBackWaitRx = FALSE; - pAd->LbCtrl.LoopBackUDMA = FALSE; - NdisAllocateSpinLock(pAd, &pAd->LbCtrl.LoopBackLock); -#ifdef ATE_TXTHREAD - pAd->ATECtrl.tx_thread[0].is_init = FALSE; -#endif - pAd->ATECtrl.pkt_skb = NULL; - return Status; -} - -INT32 MtTestModeExit(RTMP_ADAPTER *pAd) -{ - UINT32 Status = 0; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *AteOp = NULL; - struct _ATE_IF_OPERATION *ATEIfOps = NULL; - AteOp = ATECtrl->ATEOp; - ATEIfOps = ATECtrl->ATEIfOps; - os_free_mem(ATEIfOps); - os_free_mem(AteOp); - -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) - RTMP_OS_EXIT_COMPLETION(&pAd->LbCtrl.LoopBackPCITxEvent); - -#endif - RTMP_OS_EXIT_COMPLETION(&pAd->LbCtrl.LoopBackEvent); - NdisFreeSpinLock(&pAd->LbCtrl.LoopBackLock); - return Status; -} - -INT32 MtATECh2Freq(UINT32 Channel, UINT32 band_idx) -{ - UINT32 Freq = 0; - - switch (band_idx) { - case 0: - if (Channel >= 1 && Channel <= 13) - Freq = 2407 + Channel * 5; - else if (Channel == 14) - Freq = 2484; - - break; - - case 1: - if (Channel >= 7 && Channel <= 181) - Freq = 5000 + Channel * 5; - else if (Channel >= 184 && Channel <= 196) - Freq = 4000 + Channel * 5; - else if (Channel == 6) - Freq = 5032; - else if (Channel == 182) - Freq = 4912; - else if (Channel == 183) - Freq = 4917; - - break; - - default: - break; - } - - return Freq; -} - -INT32 MtATEGetTxPwrGroup(UINT32 Channel, UINT32 band_idx, UINT32 Ant_idx) -{ - UINT32 Group = 0; - UINT32 Freq = MtATECh2Freq(Channel, band_idx); - UINT32 i; - UINT32 NumOfMap = - (sizeof(txpwr_group_map) / sizeof(struct _ATE_TXPWR_GROUP_MAP)); - - for (i = 0; i < NumOfMap; ++i) { - if (Freq > txpwr_group_map[i].start && - Freq <= txpwr_group_map[i].end) { - Group = txpwr_group_map[i].group[Ant_idx]; - break; - } - } - - return Group; -} - -INT32 MtATERSSIOffset(PRTMP_ADAPTER pAd, INT32 rssi_orig, UINT32 ant_idx, - INT32 ch_band) -{ - UCHAR rssi_offset = 0; - UINT32 *band_offset = NULL; - UINT32 offset = 0; - - if (ch_band > eeprom_rssi_offset.n_band - 1) - return rssi_orig; - - if (eeprom_rssi_offset.rssi_eeprom_band_offset[ch_band]) - band_offset = - eeprom_rssi_offset.rssi_eeprom_band_offset[ch_band]; - else - return rssi_orig; - - if ((ant_idx > eeprom_rssi_offset.n_band_offset[ch_band] - 1)) - return rssi_orig; - else if (band_offset[ant_idx] == 0) - return rssi_orig; - - offset = band_offset[ant_idx]; - rssi_offset = pAd->EEPROMImage[offset]; - - if (rssi_offset & (1 << 7) && rssi_offset != 0xFF) { - if (rssi_offset & (1 << 6)) - return rssi_orig + (rssi_offset & 0x3f); - else - return rssi_orig - (rssi_offset & 0x3f); - } - - return rssi_orig; -} -#ifdef PRE_CAL_MT7622_SUPPORT -INT MtATE_DPD_Cal_Store_Proc_7622(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 u4CalId; - UINT8 i = 0; - USHORT doCal1 = 0; - MT_SWITCH_CHANNEL_CFG ch_cfg; - - if (IS_MT7622(pAd)) { - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Currently not in FLASH or BIN MODE,return.\n", - __func__)); - return FALSE; - } - /* set channel command , per group calibration - set to channel 7, BW20 */ - ch_cfg.Bw = BW_20; - ch_cfg.CentralChannel = 7; - ch_cfg.TxStream = 4; - ch_cfg.RxStream = 4; - ch_cfg.ControlChannel = 7; - ch_cfg.ControlChannel2 = 0; - ch_cfg.BandIdx = 0; - ch_cfg.bScan = 0; - MtCmdChannelSwitch(pAd, ch_cfg); - - pAd->bPreCalMode = TRUE; - /* Retest Recal - TXLPFG */ - u4CalId = TX_LPFG; - MtCmdRfTestRecal(pAd, u4CalId, TX_LPFG_RESP_LEN); - - /* Retest Recal - TXDCIQ */ - u4CalId = TX_DCIQC; - MtCmdRfTestRecal(pAd, u4CalId, TX_DCIQ_RESP_LEN); - - pAd->TxDpdCalOfst = 0; - RTMPZeroMemory(pAd->CalTXDPDImage, CAL_TXDPD_SIZE); - - /* Retest Recal - TXDPD */ - for (i = 1; i <= 14; i++) { - ch_cfg.CentralChannel = i; - ch_cfg.ControlChannel = i; - MtCmdChannelSwitch(pAd, ch_cfg); - u4CalId = TX_DPD_LINK; - MtCmdRfTestRecal(pAd, u4CalId, TX_DPD_LINK_RESP_LEN); - } - - /* raise DoCalibrate bits */ - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_ee_bin_read16(pAd, 0x52, &doCal1); - -#ifdef RTMP_FLASH_SUPPORT - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - rtmp_ee_flash_read(pAd, 0x52, &doCal1); -#endif - /* raise bit3 */ - doCal1 |= (1 << 3); - if (pAd->E2pAccessMode == E2P_BIN_MODE) { - rtmp_ee_bin_write16(pAd, 0x52, doCal1); - rtmp_ee_write_to_bin( - pAd); /* writeback to eeprom file */ - } -#ifdef RTMP_FLASH_SUPPORT - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - rtmp_ee_flash_write(pAd, 0x52, doCal1); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("raised E2P 0x52 = %x\n", doCal1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("====================\n")); - pAd->bPreCalMode = FALSE; - } - return TRUE; -} -#endif /* PRE_CAL_MT7622_SUPPORT */ - -#ifdef PRE_CAL_TRX_SET1_SUPPORT -INT MtATE_DPD_Cal_Store_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - ULONG x = simple_strtol(arg, 0, 10); - TXDPD_RESULT_T TxDpdResult; - BOOLEAN toCR = FALSE; /* CR to Flash/Bin file */ - UINT16 CentralFreq = 0; - UINT8 BW = 0; - UINT8 i = 0; - UINT8 j = 0; - ULONG CalOffset = 0; - USHORT doCal1 = 0; - UINT8 RetryTimes = 5; - BOOLEAN DPDPassOrFail = TRUE; - BOOLEAN kABand = TRUE; - BOOLEAN kGBand = TRUE; - - if (x == 0) { /* 2G */ - kABand = FALSE; - kGBand = TRUE; - } else if (x == 1) { /* 5G */ - kABand = TRUE; - kGBand = FALSE; - } else { /* all K */ - kABand = TRUE; - kGBand = TRUE; - } - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Currently not in FLASH or BIN MODE,return.\n", - __func__)); - return FALSE; - } - /* Stop TX RX MAC */ - SetATE(pAd, "TXSTOP"); - SetATE(pAd, "RXSTOP"); - - /* TXDPD ABand */ - if (kABand) { - RTMPZeroMemory(pAd->CalDPDAPart1Image, TXDPD_IMAGE1_SIZE); - - /* TXDPD A20 */ - for (i = 0; i < DPD_A20_SIZE; i++) { - BW = BW_20; - CentralFreq = DPD_A20Freq[i]; - CalOffset = i * TXDPD_SIZE; - - for (j = 0; j < RetryTimes; j++) { - RTMPZeroMemory(&TxDpdResult, - sizeof(TXDPD_RESULT_T)); - MtCmdGetTXDPDCalResult(pAd, toCR, CentralFreq, - BW, ABAND, FALSE, FALSE, - &TxDpdResult); - RtmpusecDelay(10); - - if (TxDpdResult.ResultSuccess) - break; - } - - if (TxDpdResult.ResultSuccess) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("==========TX A20 P1 freq %d save to flash offset %lx ========\n", - CentralFreq, - DPDPART1_OFFSET + CalOffset)); - ShowDPDData(pAd, TxDpdResult); - memcpy(pAd->CalDPDAPart1Image + CalOffset, - &TxDpdResult.u4DPDG0_WF0_Prim, - TXDPD_SIZE); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("!!!!!! A20 freq %d TX still failed after %d retries !!!!!!!!\n", - CentralFreq, RetryTimes)); - DPDPassOrFail = FALSE; - goto exit; - } - } - -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - RtmpFlashWrite(pAd->hdev_ctrl, pAd->CalDPDAPart1Image, - get_dev_eeprom_offset(pAd) + - DPDPART1_OFFSET, - TXDPD_PART1_LIMIT * TXDPD_SIZE); - -#endif - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_cal_write_to_bin(pAd, pAd->CalDPDAPart1Image, - DPDPART1_OFFSET, - TXDPD_PART1_LIMIT * TXDPD_SIZE); - - RtmpusecDelay(20000); - } - /* TXDPD G20 */ - if (kGBand) { - RTMPZeroMemory(pAd->CalDPDAPart2Image, TXDPD_IMAGE2_SIZE); - - for (i = 0; i < DPD_G20_SIZE; i++) { - BW = BW_20; - CentralFreq = DPD_G20Freq[i]; - CalOffset = i * TXDPD_SIZE; - - for (j = 0; j < RetryTimes; j++) { - RTMPZeroMemory(&TxDpdResult, - sizeof(TXDPD_RESULT_T)); - MtCmdGetTXDPDCalResult(pAd, toCR, CentralFreq, - BW, GBAND, FALSE, FALSE, - &TxDpdResult); - RtmpusecDelay(10); - - if (TxDpdResult.ResultSuccess) - break; - } - - if (TxDpdResult.ResultSuccess) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("==========TX G20 freq %d save to flash offset %lx ========\n", - CentralFreq, - DPDPART1_OFFSET + - DPD_A20_SIZE * TXDPD_SIZE + - CalOffset)); - ShowDPDData(pAd, TxDpdResult); - memcpy(pAd->CalDPDAPart2Image + CalOffset, - &TxDpdResult.u4DPDG0_WF0_Prim, - TXDPD_SIZE); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("!!!!!! G20 freq %d TX still failed after %d retries !!!!!!!!\n", - CentralFreq, RetryTimes)); - DPDPassOrFail = FALSE; - goto exit; - } - } - -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - RtmpFlashWrite(pAd->hdev_ctrl, pAd->CalDPDAPart2Image, - get_dev_eeprom_offset(pAd) + - DPDPART2_OFFSET, - (DPD_G20_SIZE * TXDPD_SIZE)); - -#endif - - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_cal_write_to_bin(pAd, pAd->CalDPDAPart2Image, - DPDPART2_OFFSET, - (DPD_G20_SIZE * TXDPD_SIZE)); - } - - /* raise DoCalibrate bits */ - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_ee_bin_read16(pAd, 0x52, &doCal1); - -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - rtmp_ee_flash_read(pAd, 0x52, &doCal1); - -#endif - doCal1 |= (1 << 0); - /* raise bit 4 to denote 16 entry TXDPD */ - doCal1 |= (1 << 4); - - if (pAd->E2pAccessMode == E2P_BIN_MODE) { - rtmp_ee_bin_write16(pAd, 0x52, doCal1); - rtmp_ee_write_to_bin(pAd); /* writeback to eeprom file */ - } - -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - rtmp_ee_flash_write(pAd, 0x52, doCal1); - -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("raised E2P 0x52 = %x\n", doCal1)); - - /* reload test -- for debug only */ - if (pAd->KtoFlashDebug) { - ULONG CalOffset = 0; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n######################### reload caldata for debug ####################################\n")); - RtmpusecDelay(20000); - -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) { - RtmpFlashRead(pAd->hdev_ctrl, pAd->CalDPDAPart1Image, - get_dev_eeprom_offset(pAd) + - DPDPART1_OFFSET, - TXDPD_IMAGE1_SIZE); - RtmpFlashRead(pAd->hdev_ctrl, pAd->CalDPDAPart2Image, - get_dev_eeprom_offset(pAd) + - DPDPART2_OFFSET, - TXDPD_IMAGE2_SIZE); - } -#endif - - if (pAd->E2pAccessMode == E2P_BIN_MODE) { - rtmp_cal_load_from_bin(pAd, pAd->CalDPDAPart1Image, - DPDPART1_OFFSET, - TXDPD_IMAGE1_SIZE); - rtmp_cal_load_from_bin(pAd, pAd->CalDPDAPart2Image, - DPDPART2_OFFSET, - TXDPD_IMAGE2_SIZE); - } - - /* Find flash offset base on CentralFreq */ - for (i = 0; i < DPD_ALL_SIZE; i++) { - CalOffset = i * TXDPD_SIZE; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: reload flash offset [%lx] freq [%d]=================\n", - __func__, CalOffset + DPDPART1_OFFSET, - DPD_AllFreq[i])); - - if (i < DPD_A20_SIZE) - memcpy(&TxDpdResult.u4DPDG0_WF0_Prim, - pAd->CalDPDAPart1Image + CalOffset, - TXDPD_SIZE); - else { - CalOffset = (i - DPD_A20_SIZE) * TXDPD_SIZE; - memcpy(&TxDpdResult.u4DPDG0_WF0_Prim, - pAd->CalDPDAPart2Image + CalOffset, - TXDPD_SIZE); - } - - ShowDPDData(pAd, TxDpdResult); - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("raised E2P 0x52 = %x\n", doCal1)); -exit: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("====================\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TX_SELF_TEST : [%s]\n", - (DPDPassOrFail == TRUE) ? "PASS" : "FAIL")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("====================\n")); - return TRUE; -} - -INT MtATE_DCOC_Cal_Store_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - ULONG x = simple_strtol(arg, 0, 10); - RXDCOC_RESULT_T RxDcocResult; - BOOLEAN toCR = FALSE; - UINT16 CentralFreq = 0; - UINT8 BW = 0; - UINT8 i = 0; - UINT8 j = 0; - ULONG CalOffset = 0; - USHORT doCal1 = 0; - UINT8 RetryTimes = 5; - BOOLEAN DCOCPassOrFail = TRUE; - BOOLEAN kABand = TRUE; - BOOLEAN kGBand = TRUE; - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Currently not in FLASH or BIN MODE,return.\n", - __func__)); - return FALSE; - } - - RTMPZeroMemory(pAd->CalDCOCImage, DCOC_IMAGE_SIZE); - - if (x == 0) { /* 2G */ - kABand = FALSE; - kGBand = TRUE; - } else if (x == 1) { /* 5G */ - kABand = TRUE; - kGBand = FALSE; - } else { /* all K */ - kABand = TRUE; - kGBand = TRUE; - } - /* Disable RMAC */ - MtATESetMacTxRx(pAd, ASIC_MAC_RX, FALSE, TESTMODE_BAND0); - if (IS_ATE_DBDC(pAd)) - MtATESetMacTxRx(pAd, ASIC_MAC_RX, FALSE, TESTMODE_BAND1); - - /* RXDCOC ABand */ - if (kABand) { - for (i = 0; i < K_A20_SIZE; i++) { - BW = BW_20; - CentralFreq = K_A20Freq[i]; - CalOffset = i * RXDCOC_SIZE; - - for (j = 0; j < RetryTimes; j++) { - RTMPZeroMemory(&RxDcocResult, - sizeof(RXDCOC_RESULT_T)); - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, - BW, ABAND, FALSE, FALSE, - &RxDcocResult); - RtmpusecDelay(10); - - if (RxDcocResult.ResultSuccess) - break; - } - - if (RxDcocResult.ResultSuccess) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("========== A20 freq %d save to offset %lx ========\n", - CentralFreq, DCOC_OFFSET + CalOffset)); - ShowDCOCData(pAd, RxDcocResult); - memcpy(pAd->CalDCOCImage + CalOffset, - &RxDcocResult.ucDCOCTBL_I_WF0_SX0_LNA[0], - RXDCOC_SIZE); - } else { - ShowDCOCData(pAd, RxDcocResult); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("!!!!!! A20 freq %d RX still failed after %d retries !!!!!!!!\n", - CentralFreq, RetryTimes)); - DCOCPassOrFail = FALSE; - goto exit; - } - } - - for (i = 0; i < K_A40_SIZE; i++) { - BW = BW_40; - CentralFreq = K_A40Freq[i]; - CalOffset = (K_A20_SIZE + i) * RXDCOC_SIZE; - - for (j = 0; j < RetryTimes; j++) { - RTMPZeroMemory(&RxDcocResult, - sizeof(RXDCOC_RESULT_T)); - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, - BW, ABAND, FALSE, FALSE, - &RxDcocResult); - RtmpusecDelay(10); - - if (RxDcocResult.ResultSuccess) - break; - } - - if (RxDcocResult.ResultSuccess) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("========== A40 freq %d save to offset %lx ========\n", - CentralFreq, DCOC_OFFSET + CalOffset)); - ShowDCOCData(pAd, RxDcocResult); - memcpy(pAd->CalDCOCImage + CalOffset, - &RxDcocResult.ucDCOCTBL_I_WF0_SX0_LNA[0], - RXDCOC_SIZE); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("!!!!!! A40 freq %d RX still failed after %d retries !!!!!!!!\n", - CentralFreq, RetryTimes)); - DCOCPassOrFail = FALSE; - goto exit; - } - } - - for (i = 0; i < K_A80_SIZE; i++) { - BW = BW_80; - CentralFreq = K_A80Freq[i]; - CalOffset = (K_A20_SIZE + K_A40_SIZE + i) * RXDCOC_SIZE; - - for (j = 0; j < RetryTimes; j++) { - RTMPZeroMemory(&RxDcocResult, - sizeof(RXDCOC_RESULT_T)); - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, - BW, ABAND, FALSE, FALSE, - &RxDcocResult); - RtmpusecDelay(10); - - if (RxDcocResult.ResultSuccess) - break; - } - - if (RxDcocResult.ResultSuccess) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("========== A80 freq %d save to offset %lx ========\n", - CentralFreq, DCOC_OFFSET + CalOffset)); - ShowDCOCData(pAd, RxDcocResult); - memcpy(pAd->CalDCOCImage + CalOffset, - &RxDcocResult.ucDCOCTBL_I_WF0_SX0_LNA[0], - RXDCOC_SIZE); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("!!!!!! A80 freq %d RX still failed after %d retries !!!!!!!!\n", - CentralFreq, RetryTimes)); - DCOCPassOrFail = FALSE; - goto exit; - } - } - } - - /* RXDCOC GBand */ - if (kGBand) { - for (i = 0; i < K_G20_SIZE; i++) { - BW = BW_20; - CentralFreq = K_G20Freq[i]; - CalOffset = (K_A20_SIZE + K_A40_SIZE + K_A80_SIZE + i) * - RXDCOC_SIZE; - - for (j = 0; j < RetryTimes; j++) { - RTMPZeroMemory(&RxDcocResult, - sizeof(RXDCOC_RESULT_T)); - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, - BW, GBAND, FALSE, FALSE, - &RxDcocResult); - RtmpusecDelay(10); - - if (RxDcocResult.ResultSuccess) - break; - } - - if (RxDcocResult.ResultSuccess) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("========== G20 freq %d save to offset %lx ========\n", - CentralFreq, DCOC_OFFSET + CalOffset)); - ShowDCOCData(pAd, RxDcocResult); - memcpy(pAd->CalDCOCImage + CalOffset, - &RxDcocResult.ucDCOCTBL_I_WF0_SX0_LNA[0], - RXDCOC_SIZE); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("!!!!!! G20 freq %d RX still failed after %d retries !!!!!!!!\n", - CentralFreq, RetryTimes)); - DCOCPassOrFail = FALSE; - goto exit; - } - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("========== save to offset %x size %d========\n", -#ifdef RTMP_FLASH_SUPPORT - get_dev_eeprom_offset(pAd) + -#endif - DCOC_OFFSET, - (K_ALL_SIZE * RXDCOC_SIZE))); -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - RtmpFlashWrite(pAd->hdev_ctrl, pAd->CalDCOCImage, - get_dev_eeprom_offset(pAd) + DCOC_OFFSET, - (K_ALL_SIZE * RXDCOC_SIZE)); - -#endif - - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_cal_write_to_bin(pAd, pAd->CalDCOCImage, DCOC_OFFSET, - (K_ALL_SIZE * RXDCOC_SIZE)); - - /* raise DoCalibrate bits */ -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - rtmp_ee_flash_read(pAd, 0x52, &doCal1); - -#endif - - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_ee_bin_read16(pAd, 0x52, &doCal1); - - doCal1 |= (1 << 1); -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - rtmp_ee_flash_write(pAd, 0x52, doCal1); - -#endif - - if (pAd->E2pAccessMode == E2P_BIN_MODE) { - rtmp_ee_bin_write16(pAd, 0x52, doCal1); - rtmp_ee_write_to_bin( - pAd); /* XXX: remember to writeback modified eeprom to file */ - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("raised E2P 0x52 = %x\n", doCal1)); - - if (pAd->KtoFlashDebug) { - ULONG CalOffset = 0; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("######################### reload caldata for debug ####################################\n")); - RtmpusecDelay(20000); -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - RtmpFlashRead(pAd->hdev_ctrl, pAd->CalDCOCImage, - get_dev_eeprom_offset(pAd) + DCOC_OFFSET, - (K_ALL_SIZE * RXDCOC_SIZE)); - -#endif - - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_cal_load_from_bin(pAd, pAd->CalDCOCImage, - DCOC_OFFSET, - (K_ALL_SIZE * RXDCOC_SIZE)); - - /* Find offset base on CentralFreq */ - for (i = 0; i < K_ALL_SIZE; i++) { - CalOffset = i * RXDCOC_SIZE; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: reload from offset [%lx] freq [%d]=================\n", - __func__, CalOffset + DCOC_OFFSET, - K_AllFreq[i])); - memcpy(&RxDcocResult.ucDCOCTBL_I_WF0_SX0_LNA[0], - pAd->CalDCOCImage + CalOffset, RXDCOC_SIZE); - ShowDCOCData(pAd, RxDcocResult); - } - } - -exit: - /* Enable RMAC */ - MtATESetMacTxRx(pAd, ASIC_MAC_RX, TRUE, TESTMODE_BAND0); - if (IS_ATE_DBDC(pAd)) - MtATESetMacTxRx(pAd, ASIC_MAC_RX, TRUE, TESTMODE_BAND1); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("====================\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RX_SELF_TEST : [%s]\n", - (DCOCPassOrFail == TRUE) ? "PASS" : "FAIL")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("====================\n")); - return TRUE; -} -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#ifdef PRE_CAL_TRX_SET2_SUPPORT -INT MtATE_Pre_Cal_Proc(RTMP_ADAPTER *pAd, UINT8 CalId, UINT32 ChGrpId) -{ - INT32 ret = NDIS_STATUS_SUCCESS; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Cal Id = %d, ChGrpId = %d\n", __func__, CalId, ChGrpId)); - /* Initialization */ - pAd->PreCalWriteOffSet = 0; - pAd->ChGrpMap = PreCalGroupList[ChGrpId]; - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) { - pAd->PreCalStoreBuffer = pAd->EEPROMImage + PRECALPART_OFFSET; - } else { - ret = os_alloc_mem(pAd, &pAd->PreCalStoreBuffer, - PRE_CAL_SIZE_ONE_CARD); - - if (ret != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[42m %s : Not enough memory for pre-cal stored buffer!!\x1b[m\n", - __func__)); - } - } - - if (ret == NDIS_STATUS_SUCCESS) - MtCmdGetPreCalResult(pAd, PreCalItemList[CalId], - PreCalGroupList[ChGrpId]); - - return TRUE; -} -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ - -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -INT MtATE_PA_Trim_Proc(RTMP_ADAPTER *pAd, PUINT32 pData) -{ - UINT16 DoPATrim; - UINT16 WriteAddr; - UINT8 idx; - USHORT *pStoreData = (USHORT *)pData; - USHORT value; - - if (IS_MT7615(pAd)) { - WriteAddr = PA_TRIM_START_ADDR1; - for (idx = 0; idx < PA_TRIM_BLOCK_SIZE; idx++) { - value = *pStoreData; - RT28xx_EEPROM_WRITE16(pAd, WriteAddr, value); - WriteAddr += 2; - pStoreData++; - } - - WriteAddr = PA_TRIM_START_ADDR2; - for (idx = 0; idx < PA_TRIM_BLOCK_SIZE; idx++) { - value = *pStoreData; - RT28xx_EEPROM_WRITE16(pAd, WriteAddr, value); - WriteAddr += 2; - pStoreData++; - } - - /* Raise DoPATrim bits */ - RT28xx_EEPROM_READ16(pAd, 0x52, DoPATrim); - DoPATrim |= (1 << 3); - RT28xx_EEPROM_WRITE16(pAd, 0x52, DoPATrim); - } - return TRUE; -} -#endif /* CAL_BIN_FILE_SUPPORT */ - -INT32 MtATETssiTrainingProc(RTMP_ADAPTER *pAd, UCHAR ucBW, UCHAR ucBandIdx) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 ret = 0; - - /* only applu TSSI Training for MT7615 */ - if (IS_MT7615(pAd)) { - if (ucBW == BW_8080 || ucBW == BW_160) { - /* Check iPA or ePA status */ - MtEPAcheck(pAd); - - /* TSSI Training only for IPA case */ - if (!pAd->fgEPA) { - UCHAR PerPktBW, PhyMode, Mcs, Nss; - UINT32 TxLength; - - /* Backup parameters for Phymode, BW, Rate, VHTNss, TxLength */ - PerPktBW = TESTMODE_GET_PARAM( - ATECtrl, ucBandIdx, PerPktBW); - PhyMode = TESTMODE_GET_PARAM(ATECtrl, ucBandIdx, - PhyMode); - Mcs = TESTMODE_GET_PARAM(ATECtrl, ucBandIdx, - Mcs); - Nss = TESTMODE_GET_PARAM(ATECtrl, ucBandIdx, - Nss); - TxLength = TESTMODE_GET_PARAM( - ATECtrl, ucBandIdx, TxLength); - - /* Config TSSI Tracking enable */ - MtATETSSITracking(pAd, TRUE); - /* Config FCBW ON */ - MtATEFCBWCfg(pAd, TRUE); - /* Config DBW 80MHz */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, PerPktBW, - BW_80); - /* Config VHT mode */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, PhyMode, - MODE_VHT); - /* Config MCS rate */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, Mcs, - MCS_9); - /* Config 4 Nss */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, Nss, 4); - /* Config Tx packet length */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, TxLength, - 100); - /* Start Tx for 25ms */ - ATEOp->StartTx(pAd); - RtmpOsMsDelay(25); - /* Stop Tx */ - ATEOp->StopTx(pAd); - /* Save compensation value to Global variable (FCBW on case) */ - MtTSSICompBackup(pAd, TRUE); - /* Config FCBW OFF */ - MtATEFCBWCfg(pAd, FALSE); - /* Config DBW 160MHz */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, PerPktBW, - BW_160); - /* Config VHT mode */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, PhyMode, - MODE_VHT); - /* Config MCS rate */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, Mcs, - MCS_9); - /* Config 2 Nss */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, Nss, 2); - /* Config Tx packet length */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, TxLength, - 100); - /* Start Tx for 25ms */ - ATEOp->StartTx(pAd); - RtmpOsMsDelay(25); - /* Stop Tx */ - ATEOp->StopTx(pAd); - /* Save compensation value to Global variable (FCBW off case) */ - MtTSSICompBackup(pAd, FALSE); - /* Config Compensation CR */ - MtTSSICompCfg(pAd); - /* Config TSSI Tracking disable */ - MtATETSSITracking(pAd, FALSE); - /* Config FCBW ON */ - MtATEFCBWCfg(pAd, TRUE); - - /* Resotre paratemters for Phymode, BW, Rate, VHTNss, TxLength */ - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, PerPktBW, - PerPktBW); - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, PhyMode, - PhyMode); - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, Mcs, - Mcs); - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, Nss, - Nss); - TESTMODE_SET_PARAM(ATECtrl, ucBandIdx, TxLength, - TxLength); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s: TSSI Training Done!!\n", - __func__)); - } - } - } - - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode_dmac.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode_dmac.c deleted file mode 100644 index 1f4a185ef1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode_dmac.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - Module Name: - mt_testmode_dmac.c - -*/ - -#ifdef COMPOS_TESTMODE_WIN -#include "config.h" -#else -#include "rt_config.h" -#endif - -INT mt_ate_mac_cr_restore(RTMP_ADAPTER *pAd) -{ -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - /* Data frame protection CR recover */ - MtTestModeRestoreCr(pAd, AGG_PCR); - /* RTS threshold CR recover */ - MtTestModeRestoreCr(pAd, AGG_PCR1); -#ifdef DBDC_MODE - if (IS_ATE_DBDC(pAd)) { - MtTestModeRestoreCr(pAd, AGG_PCR2); - } -#endif /* DBDC_MODE */ - /* BA related CR recover */ - MtTestModeRestoreCr(pAd, AGG_AALCR0); - MtTestModeRestoreCr(pAd, AGG_AALCR1); - MtTestModeRestoreCr(pAd, AGG_AALCR2); - MtTestModeRestoreCr(pAd, AGG_AALCR3); - MtTestModeRestoreCr(pAd, AGG_AWSCR0); - MtTestModeRestoreCr(pAd, AGG_AWSCR1); - /* Station pause CR recover */ - MtTestModeRestoreCr(pAd, STATION_PAUSE0); - MtTestModeRestoreCr(pAd, STATION_PAUSE1); - MtTestModeRestoreCr(pAd, STATION_PAUSE2); - MtTestModeRestoreCr(pAd, STATION_PAUSE3); - /* Enable HW BAR feature */ - MtTestModeRestoreCr(pAd, AGG_MRCR); - /* IPG related CR recover */ - MtTestModeRestoreCr(pAd, TMAC_TRCR0); - MtTestModeRestoreCr(pAd, TMAC_ICR_BAND_0); - MtTestModeRestoreCr(pAd, ARB_DRNGR0); - MtTestModeRestoreCr(pAd, ARB_DRNGR1); - MtTestModeRestoreCr(pAd, ARB_WMMAC01); - MtTestModeRestoreCr(pAd, ARB_WMMAC11); - MtTestModeRestoreCr(pAd, ARB_WMMAC21); - MtTestModeRestoreCr(pAd, ARB_WMMAC31); - MtTestModeRestoreCr(pAd, ARB_WMMALTX0); -#ifdef DBDC_MODE - if (IS_ATE_DBDC(pAd)) { - MtTestModeRestoreCr(pAd, TMAC_TRCR1); - MtTestModeRestoreCr(pAd, TMAC_ICR_BAND_1); - MtTestModeRestoreCr(pAd, ARB_WMMALTX1); - } -#endif /* DBDC_MODE */ - } -#endif /* defined(MT7615) || defined(MT7622) */ - - return 0; -} - -INT mt_ate_mac_cr_backup_and_set(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - - NdisZeroMemory(&ATECtrl->bk_cr, - sizeof(struct _TESTMODE_BK_CR) * MAX_TEST_BKCR_NUM); -#if defined(MT7615) || defined(MT7622) - /* TODO: check if following operation also need to do for other chips */ - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - UINT32 val = 0; - /* Enable data frame protection for test mode */ - MtTestModeBkCr(pAd, AGG_PCR, TEST_MAC_BKCR); - MAC_IO_READ32(pAd, AGG_PCR, &val); - val = 0x80008; - MAC_IO_WRITE32(pAd, AGG_PCR, val); - /* RTS threshold need to change to 1 for test mode */ - MtTestModeBkCr(pAd, AGG_PCR1, TEST_MAC_BKCR); - MAC_IO_READ32(pAd, AGG_PCR1, &val); - /* val &= 0x0FFFFFFF; */ - /* val |= 0x10000000; */ - /* Setting RTS threshold to max value to aviod send RTS in test mode */ - val = 0xFE0FFFFF; - MAC_IO_WRITE32(pAd, AGG_PCR1, val); -#ifdef DBDC_MODE - /* RTS threshold disable for band1 */ - if (IS_ATE_DBDC(pAd)) { - MtTestModeBkCr(pAd, AGG_PCR2, TEST_MAC_BKCR); - MAC_IO_READ32(pAd, AGG_PCR2, &val); - val = 0xFE0FFFFF; - MAC_IO_WRITE32(pAd, AGG_PCR2, val); - } -#endif /* DBDC_MODE */ - /* BA related CR backup */ - MtTestModeBkCr(pAd, AGG_AALCR0, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, AGG_AALCR1, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, AGG_AALCR2, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, AGG_AALCR3, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, AGG_AWSCR0, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, AGG_AWSCR1, TEST_MAC_BKCR); - /* Station pause CR backup for TX after reset WTBL */ - MtTestModeBkCr(pAd, STATION_PAUSE0, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, STATION_PAUSE1, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, STATION_PAUSE2, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, STATION_PAUSE3, TEST_MAC_BKCR); - /* HW BAR feature */ - MtTestModeBkCr(pAd, AGG_MRCR, TEST_MAC_BKCR); - MAC_IO_READ32(pAd, AGG_MRCR, &val); - val &= ~BAR_TX_CNT_LIMIT_MASK; - val |= BAR_TX_CNT_LIMIT(0); - MAC_IO_WRITE32(pAd, AGG_MRCR, val); - /* IPG related CR back up */ - MtTestModeBkCr(pAd, TMAC_TRCR0, TEST_MAC_BKCR); - MtTestModeBkCr( - pAd, TMAC_ICR_BAND_0, - TEST_MAC_BKCR); /* IFS CR, for SIFS/SLOT time control */ - MtTestModeBkCr( - pAd, ARB_DRNGR0, - TEST_MAC_BKCR); /* For fixing backoff random number */ - MtTestModeBkCr(pAd, ARB_DRNGR1, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, ARB_WMMAC01, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, ARB_WMMAC11, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, ARB_WMMAC21, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, ARB_WMMAC31, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, ARB_WMMALTX0, TEST_MAC_BKCR); -#ifdef DBDC_MODE - if (IS_ATE_DBDC(pAd)) { - MtTestModeBkCr(pAd, TMAC_TRCR1, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, TMAC_ICR_BAND_1, TEST_MAC_BKCR); - MtTestModeBkCr(pAd, ARB_WMMALTX1, TEST_MAC_BKCR); - } -#endif /* DBDC_MODE */ - } -#endif /* defined(MT7615) || defined(MT7622) */ - return 0; -} - -UINT32 agg_cnt_array[] = { AGG_AALCR0, AGG_AALCR1, AGG_AALCR2, AGG_AALCR3 }; -INT mt_ate_ampdu_ba_limit(RTMP_ADAPTER *pAd, UINT32 band_idx, UINT8 agg_limit) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 value; - INT wdev_idx = 0; - UCHAR WmmIdx = 0xFF; -#if !defined(COMPOS_TESTMODE_WIN) - struct wifi_dev *pWdev = NULL; - - wdev_idx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wdev_idx); - pWdev = pAd->wdev_list[wdev_idx]; - - if (pWdev) { - WmmIdx = TESTMODE_GET_PARAM(ATECtrl, band_idx, wmm_idx); - - if (WmmIdx > 3) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: wdev_idx=%d, invalid WmmIdx=%d, reset to 0!\n", - __func__, wdev_idx, WmmIdx)); - WmmIdx = 0xFF; - } - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: invalid WDEV, reset WmmIdx to 0!\n", __func__)); - WmmIdx = 0xFF; - } - -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: wdev_idx=%d, WmmIdx=%d\n", __func__, wdev_idx, WmmIdx)); - value = ((agg_limit & 0x3F) << 24) | ((agg_limit & 0x3F) << 16) | - ((agg_limit & 0x3F) << 8) | ((agg_limit & 0x3F) << 0); - - if (WmmIdx <= 3) - MAC_IO_WRITE32(pAd, agg_cnt_array[WmmIdx], value); - else { - MAC_IO_WRITE32(pAd, AGG_AALCR0, value); - MAC_IO_WRITE32(pAd, AGG_AALCR1, value); - MAC_IO_WRITE32(pAd, AGG_AALCR2, value); - MAC_IO_WRITE32(pAd, AGG_AALCR3, value); - } - - value = 0x0; - MAC_IO_WRITE32(pAd, AGG_AWSCR0, value); - - return 0; -} - -INT mt_ate_set_sta_pause_cr(RTMP_ADAPTER *pAd, UINT32 band_idx) -{ - INT32 ret = 0; - UINT32 value; - - /* Set station pause CRs to 0 for TX after reset WTBL */ - /* The CR meaning in normal mode is that stop to TX packet when STA disconnect */ - value = 0x0; - MAC_IO_WRITE32(pAd, STATION_PAUSE0, value); - MAC_IO_WRITE32(pAd, STATION_PAUSE1, value); - MAC_IO_WRITE32(pAd, STATION_PAUSE2, value); - MAC_IO_WRITE32(pAd, STATION_PAUSE3, value); - - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode_smac.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode_smac.c deleted file mode 100644 index 30f71bad8e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/mt_mac/mt_testmode_smac.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - Module Name: - mt_testmode_smac.c - -*/ - -#ifdef COMPOS_TESTMODE_WIN -#include "config.h" -#else -#include "rt_config.h" -#endif - -INT mt_ate_mac_cr_restore(RTMP_ADAPTER *pAd) -{ - /* Data frame protection CR recover */ - MtTestModeRestoreCr(pAd, AGG_PCR); - /* RTS threshold CR recover */ - MtTestModeRestoreCr(pAd, AGG_PCR1); - - return 0; -} - -INT mt_ate_mac_cr_backup_and_set(RTMP_ADAPTER *pAd) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 val = 0; - - NdisZeroMemory(&ATECtrl->bk_cr, - sizeof(struct _TESTMODE_BK_CR) * MAX_TEST_BKCR_NUM); - /* Enable data frame protection for test mode */ - MtTestModeBkCr(pAd, AGG_PCR, TEST_MAC_BKCR); - MAC_IO_READ32(pAd, AGG_PCR, &val); - val = 0x80008; - MAC_IO_WRITE32(pAd, AGG_PCR, val); - /* RTS threshold need to change to 1 for test mode */ - MtTestModeBkCr(pAd, AGG_PCR1, TEST_MAC_BKCR); - MAC_IO_READ32(pAd, AGG_PCR1, &val); - /* val &= 0x0FFFFFFF; */ - /* val |= 0x10000000; */ - /* Setting RTS threshold to max value to aviod send RTS in test mode */ - val = 0xFE0FFFFF; - MAC_IO_WRITE32(pAd, AGG_PCR1, val); - - return 0; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/qa_agent.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/qa_agent.c deleted file mode 100644 index 03146de697..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/qa_agent.c +++ /dev/null @@ -1,1741 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - qa_agent.c -*/ - -#include "rt_config.h" - -static INT ResponseToQA(struct _HQA_CMD_FRAME *HqaCmdFrame, - RTMP_IOCTL_INPUT_STRUCT *WRQ, INT32 Length, - INT32 Status) -{ - HqaCmdFrame->Length = OS_HTONS((Length)); - Status = OS_HTONS((Status)); - memcpy(HqaCmdFrame->Data, &Status, 2); - WRQ->u.data.length = - sizeof((HqaCmdFrame)->MagicNo) + sizeof((HqaCmdFrame)->Type) + - sizeof((HqaCmdFrame)->Id) + sizeof((HqaCmdFrame)->Length) + - sizeof((HqaCmdFrame)->Sequence) + - OS_NTOHS((HqaCmdFrame)->Length); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WRQ->u.data.length = %d\n", WRQ->u.data.length)); - - if (copy_to_user(WRQ->u.data.pointer, (UCHAR *)(HqaCmdFrame), - WRQ->u.data.length)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("copy_to_user() fail in %s\n", __func__)); - return -EFAULT; - } - - return 0; -} - -static INT32 HQA_OpenAdapter(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->bQAEnabled = TRUE; - /* Prepare feedback as soon as we can to avoid QA timeout. */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - Ret = ATEOp->ATEStart(pAd); - return Ret; -} - -static INT32 HQA_CloseAdapter(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->bQAEnabled = FALSE; - /* Prepare feedback as soon as we can to avoid QA timeout. */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - Ret = ATEOp->ATEStop(pAd); - return Ret; -} - -static INT32 HQA_StartTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 TxCount; - UINT16 TxLength; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&TxCount, HqaCmdFrame->Data, 4); - TxCount = OS_NTOHL(TxCount); - memcpy(&TxLength, HqaCmdFrame->Data + 4, 2); - TxLength = OS_NTOHS(TxLength); - - if (TxCount == 0) - ATECtrl->TxCount = 0xFFFFFFFF; - else - ATECtrl->TxCount = TxCount; - - ATECtrl->TxLength = TxLength; - ATECtrl->bQATxStart = TRUE; - Ret = ATEOp->StartTx(pAd); - - if (ATECtrl->bQATxStart == TRUE) - ATECtrl->TxStatus = 1; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StartTxExt(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 HQA_StartTxContiTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StartTxCarrier(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StartRx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->bQARxStart = TRUE; - Ret = ATEOp->StartRx(pAd); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 Mode; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Mode = ATECtrl->Mode; - ATECtrl->Mode &= ATE_TXSTOP; - ATECtrl->bQATxStart = FALSE; - Ret = ATEOp->StopTx(pAd, Mode); - ATECtrl->TxStatus = 0; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopContiTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - { - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - CmdTxContinous(pAd, ATECtrl->PhyMode, ATECtrl->BW, - ATECtrl->ControlChl, ATECtrl->Mcs, - ATECtrl->TxAntennaSel, 0); - } - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopTxCarrier(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopRx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->Mode &= ATE_RXSTOP; - ATECtrl->bQARxStart = FALSE; - Ret = ATEOp->StopRx(pAd); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTxPath(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT16 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 2); - Value = OS_NTOHS(Value); - Ret = ATEOp->SetTxAntenna(pAd, (CHAR)Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetRxPath(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT16 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 2); - Value = OS_NTOHS(Value); - Ret = ATEOp->SetRxAntenna(pAd, (CHAR)Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTxIPG(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - - if (Value > 15) - Value = 15; - else if (Value == 0) - Value = 1; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s, val:%d,0x%04x\n", __func__, Value, Value)); - ATEOp->SetAIFS(pAd, (UINT32)Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTxPower0(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT16 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 2); - Value = OS_NTOHS(Value); - Ret = ATEOp->SetTxPower0(pAd, Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HAQ_SetTxPower1(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT16 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 2); - Value = OS_NTOHS(Value); - Ret = ATEOp->SetTxPower1(pAd, Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET0[] = { - /* cmd id start from 0x1000 */ - HQA_OpenAdapter, /* 0x1000 */ - HQA_CloseAdapter, /* 0x1001 */ - HQA_StartTx, /* 0x1002 */ - HQA_StartTxExt, /* 0x1003 */ - HQA_StartTxContiTx, /* 0x1004 */ - HQA_StartTxCarrier, /* 0x1005 */ - HQA_StartRx, /* 0x1006 */ - HQA_StopTx, /* 0x1007 */ - HQA_StopContiTx, /* 0x1008 */ - HQA_StopTxCarrier, /* 0x1009 */ - HQA_StopRx, /* 0x100A */ - HQA_SetTxPath, /* 0x100B */ - HQA_SetRxPath, /* 0x100C */ - HQA_SetTxIPG, /* 0x100D */ - HQA_SetTxPower0, /* 0x100E */ - HAQ_SetTxPower1, /* 0x100F */ -}; - -static INT32 HQA_SetChannel(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATECtrl->Channel = Value; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Channel = %d, BW = %d\n", __func__, ATECtrl->Channel, - ATECtrl->BW)); - - if (ATECtrl->BW == BW_20) - ATECtrl->ControlChl = ATECtrl->Channel; - else if (ATECtrl->BW == BW_40) - ATECtrl->ControlChl = ATECtrl->Channel - 2; - - Ret = ATEOp->SetChannel(pAd, Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetPreamble(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATECtrl->PhyMode = (UCHAR)Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetRate(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATECtrl->Mcs = (UCHAR)Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetNss(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetSystemBW(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATECtrl->BW = Value; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Channel = %d, BW = %d\n", __func__, ATECtrl->Channel, - ATECtrl->BW)); - - if (ATECtrl->BW == BW_20) - ATECtrl->ControlChl = ATECtrl->Channel; - else if (ATECtrl->BW == BW_40) - ATECtrl->ControlChl = ATECtrl->Channel - 2; - - Ret = ATEOp->SetBW(pAd, Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetPerPktBW(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetPrimaryBW(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetFreqOffset(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATEOp->SetTxFreqOffset(pAd, (UINT32)Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetAutoResponder(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTssiOnOff(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0, WFSel; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ON/OFF:4 WF Sel:4 */ - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - memcpy((PUCHAR)&WFSel, HqaCmdFrame->Data + 4, 4); - WFSel = OS_NTOHL(WFSel); - ATEOp->SetTSSI(pAd, (CHAR)WFSel, (CHAR)Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 -HQA_SetRxHighLowTemperatureCompensation(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET1[] = { - /* cmd id start from 0x1100 */ - HQA_SetChannel, /* 0x1100 */ - HQA_SetPreamble, /* 0x1101 */ - HQA_SetRate, /* 0x1102 */ - HQA_SetNss, /* 0x1103 */ - HQA_SetSystemBW, /* 0x1104 */ - HQA_SetPerPktBW, /* 0x1105 */ - HQA_SetPrimaryBW, /* 0x1106 */ - HQA_SetFreqOffset, /* 0x1107 */ - HQA_SetAutoResponder, /* 0x1108 */ - HQA_SetTssiOnOff, /* 0x1109 */ - HQA_SetRxHighLowTemperatureCompensation, /* 0x110A */ -}; - -static INT32 HQA_ResetTxRxCounter(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MtAsicGetRxStat(pAd, HQA_RX_RESET_PHY_COUNT); - MtAsicGetRxStat(pAd, HQA_RX_RESET_MAC_COUNT); - ATECtrl->RxTotalCnt = 0; - ATECtrl->TxDoneCount = 0; - ATECtrl->RxMacFCSErrCount = 0; - ATECtrl->RxMacMdrdyCount = 0; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetStatistics(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetRxOKData(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetRxOKOther(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetRxAllPktCount(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetTxTransmitted(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - Value = ATECtrl->TxDoneCount; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: TxDoneCount = %d\n", __func__, ATECtrl->TxDoneCount)); - Value = OS_HTONL(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -static INT32 HQA_GetHwCounter(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_CalibrationOperation(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET2[] = { - /* cmd id start from 0x1200 */ - HQA_ResetTxRxCounter, /* 0x1200 */ - HQA_GetStatistics, /* 0x1201 */ - HQA_GetRxOKData, /* 0x1202 */ - HQA_GetRxOKOther, /* 0x1203 */ - HQA_GetRxAllPktCount, /* 0x1204 */ - HQA_GetTxTransmitted, /* 0x1205 */ - HQA_GetHwCounter, /* 0x1206 */ - HQA_CalibrationOperation, /* 0x1207 */ -}; - -static VOID memcpy_exs(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len) -{ - ULONG i; - USHORT *pDst, *pSrc; - - pDst = (USHORT *)dst; - pSrc = (USHORT *)src; - - for (i = 0; i < (len >> 1); i++) { - *pDst = OS_NTOHS(*pSrc); - pDst++; - pSrc++; - } - - if ((len % 2) != 0) { - memcpy(pDst, pSrc, (len % 2)); - *pDst = OS_NTOHS(*pDst); - } -} - -static INT32 HQA_MacBbpRegRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Offset, Value; - BOOLEAN IsFound; - - memcpy(&Offset, HqaCmdFrame->Data, 4); - Offset = OS_NTOHL(Offset); - IsFound = mt_mac_cr_range_mapping(pAd, &Offset); - - if (!IsFound) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(Offset) << 19; - RemapOffset = GET_REMAP_2_OFFSET(Offset); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - } else - RTMP_IO_READ32(pAd, Offset, &Value); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Value = %x\n", __func__, Offset, Value)); - Value = OS_HTONL(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -static INT32 HQA_MacBbpRegWrite(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Offset, Value; - BOOLEAN IsFound; - - memcpy(&Offset, HqaCmdFrame->Data, 4); - memcpy(&Value, HqaCmdFrame->Data + 4, 4); - Offset = OS_NTOHL(Offset); - Value = OS_NTOHL(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Value = %x\n", __func__, Offset, Value)); - IsFound = mt_mac_cr_range_mapping(pAd, &Offset); - - if (!IsFound) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(Offset) << 19; - RemapOffset = GET_REMAP_2_OFFSET(Offset); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - } else - RTMP_IO_WRITE32(pAd, Offset, Value); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *Dst, UINT32 Offset, UINT32 Len) -{ - UINT32 Index, Value = 0; - UCHAR *pDst; - BOOLEAN IsFound; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("\n\n")); - - for (Index = 0; Index < (Len >> 2); Index++) { - pDst = (Dst + (Index << 2)); - IsFound = mt_mac_cr_range_mapping(pAd, &Offset); - - if (!IsFound) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(Offset) << 19; - RemapOffset = GET_REMAP_2_OFFSET(Offset); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - } else - RTMP_IO_READ32(pAd, Offset, &Value); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Value = %x\n", __func__, Offset, - Value)); - Value = OS_HTONL(Value); - memmove(pDst, &Value, 4); - Offset += 4; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("\n\n")); -} - -static INT32 HQA_MACBbpRegBulkRead(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Offset; - UINT16 Len, Tmp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&Offset, HqaCmdFrame->Data, 4); - Offset = OS_NTOHL(Offset); - memcpy(&Len, HqaCmdFrame->Data + 4, 2); - Len = OS_NTOHS(Len); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Len(unit: 4bytes) = %d\n", __func__, Offset, - Len)); - - if (Len > 371) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : length requested is too large, make it smaller\n", - __func__)); - HqaCmdFrame->Length = OS_HTONS(2); - Tmp = OS_HTONS(1); - memcpy(HqaCmdFrame->Data, &Tmp, 2); - return -EFAULT; - } - - RTMP_IO_READ_BULK(pAd, HqaCmdFrame->Data + 2, Offset, - (Len << 2)); /* unit in four bytes*/ - ResponseToQA(HqaCmdFrame, WRQ, 2 + (Len << 2), Ret); - return Ret; -} - -static INT32 HQA_RfRegBulkRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0, Index; - UINT32 WfSel, Offset, Length, Value; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy(&WfSel, HqaCmdFrame->Data, 4); - WfSel = OS_NTOHL(WfSel); - memcpy(&Offset, HqaCmdFrame->Data + 4, 4); - Offset = OS_NTOHL(Offset); - memcpy(&Length, HqaCmdFrame->Data + 8, 4); - Length = OS_NTOHL(Length); - - for (Index = 0; Index < Length; Index++) { - Ret = ATEOp->RfRegRead(pAd, WfSel, Offset + Index * 4, &Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Wfsel = %d, Offset = %x, Value = %x\n", __func__, - WfSel, Offset + Index * 4, Value)); - - if (Ret) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Wfsel = %d, Offset = %x, Value = %x fail\n", - WfSel, Offset + Index * 4, Value)); - break; - } - - Value = OS_HTONL(Value); - memcpy(HqaCmdFrame->Data + 2 + (Index * 4), &Value, 4); - } - - ResponseToQA(HqaCmdFrame, WRQ, 2 + (Length * 4), Ret); - return Ret; -} - -static INT32 HQA_RfRegBulkWrite(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0, Index; - UINT32 WfSel, Offset, Length, Value; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&WfSel, HqaCmdFrame->Data, 4); - WfSel = OS_NTOHL(WfSel); - memcpy(&Offset, HqaCmdFrame->Data + 4, 4); - Offset = OS_NTOHL(Offset); - memcpy(&Length, HqaCmdFrame->Data + 8, 4); - Length = OS_NTOHL(Length); - - for (Index = 0; Index < Length; Index++) { - memcpy(&Value, HqaCmdFrame->Data + 12 + (Index * 4), 4); - Value = OS_NTOHL(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Wfsel = %d, Offset = %x, Value = %x\n", __func__, - WfSel, Offset + Index * 4, Value)); - Ret = ATEOp->RfRegWrite(pAd, WfSel, Offset + Index * 4, Value); - - if (Ret) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Wfsel = %d, Offset = %x, Value = %x fail\n", - WfSel, Offset + Index * 4, Value)); - break; - } - } - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_ReadEEPROM(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 Offset = 0, Value = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&Offset, HqaCmdFrame->Data, 2); - Offset = OS_NTOHS(Offset); - RT28xx_EEPROM_READ16(pAd, Offset, Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p r %02Xh = 0x%02X\n", (Offset & 0x00FF), - (Value & 0x00FF))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p r %02Xh = 0x%02X\n", (Offset & 0x00FF) + 1, - (Value & 0xFF00) >> 8)); - Value = OS_HTONS(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 2); - ResponseToQA(HqaCmdFrame, WRQ, 4, Ret); - return Ret; -} - -static INT32 HQA_WriteEEPROM(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 Offset = 0, Value = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&Offset, HqaCmdFrame->Data, 2); - Offset = OS_NTOHS(Offset); - memcpy(&Value, HqaCmdFrame->Data + 2, 2); - Value = OS_NTOHS(Value); - RT28xx_EEPROM_WRITE16(pAd, Offset, Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p w 0x%04X = 0x%04X\n", Offset, Value)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p w %02Xh = 0x%02X\n", (Offset & 0x00FF), - (Value & 0x00FF))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p w %02Xh = 0x%02X\n", (Offset & 0x00FF) + 1, - (Value & 0xFF00) >> 8)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_ReadBulkEEPROM(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 Offset; - UINT16 Len; - UINT16 Buffer[EEPROM_SIZE >> - 1]; /* TODO Build warning frame size > 1024 for stack */ - - memcpy(&Offset, HqaCmdFrame->Data, 2); - Offset = OS_NTOHS(Offset); - memcpy(&Len, HqaCmdFrame->Data + 2, 2); - Len = OS_NTOHS(Len); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Length = %x\n", __func__, Offset, Len)); - EEReadAll(pAd, (UINT16 *)Buffer); - - if (Offset + Len <= EEPROM_SIZE) - memcpy_exs(pAd, HqaCmdFrame->Data + 2, (UCHAR *)Buffer + Offset, - Len); - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : exceed EEPROM size\n", __func__)); - Len = 0; - Ret = -1; - } - - ResponseToQA(HqaCmdFrame, WRQ, 2 + Len, Ret); - return Ret; -} - -static VOID EEWriteBulk(PRTMP_ADAPTER pAd, UINT16 *Data, UINT16 Offset, - UINT16 Length) -{ - UINT16 Pos; - UINT16 Value; - UINT16 Len = Length; - - for (Pos = 0; Pos < (Len >> 1);) { - Value = Data[Pos]; - RT28xx_EEPROM_WRITE16(pAd, Offset + (Pos * 2), Value); - Pos++; - } -} - -static INT32 HQA_WriteBulkEEPROM(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - USHORT Offset; - USHORT Len; - USHORT Buffer[EEPROM_SIZE >> - 1]; /* TODO Build warning frame size > 1024 for stack */ - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&Offset, HqaCmdFrame->Data, 2); - Offset = OS_NTOHS(Offset); - memcpy(&Len, HqaCmdFrame->Data + 2, 2); - Len = OS_NTOHS(Len); - memcpy_exs(pAd, (UCHAR *)Buffer + Offset, - (UCHAR *)HqaCmdFrame->Data + 4, Len); -#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) - - if (Len == 16) - memcpy(pAd->EEPROMImage + Offset, (UCHAR *)Buffer + Offset, - Len); - - if (Offset == 0x1f0) - rtmp_ee_flash_write_all(pAd); - - if (Len != 16) -#endif - { - if ((Offset + Len) <= EEPROM_SIZE) - EEWriteBulk(pAd, (UINT16 *)(((UCHAR *)Buffer) + Offset), - Offset, Len); - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: exceed EEPROM size(%d)\n", __func__, - EEPROM_SIZE)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Offset = %u\n", Offset)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Length = %u\n", Len)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Offset + Length=%u\n", (Offset + Len))); - } - } - - ResponseToQA(HqaCmdFrame, WRQ, 2 + Len, Ret); - return Ret; -} - -#ifdef RTMP_EFUSE_SUPPORT -static INT32 HQA_CheckEfuseMode(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Value; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if (pAd->bUseEfuse) - Value = 1; - else - Value = 0; - - Value = OS_HTONL(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -static INT32 HQA_GetFreeEfuseBlock(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Value; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - eFuseGetFreeBlockCount(pAd, &Value); - Value = OS_HTONL(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -static INT32 HQA_GetEfuseBlockNr(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_WriteEFuseFromBuffer(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} -#endif /* RTMP_EFUSE_SUPPORT */ - -static HQA_CMD_HANDLER HQA_CMD_SET3[] = { - /* cmd id start from 0x1300 */ - HQA_MacBbpRegRead, /* 0x1300 */ - HQA_MacBbpRegWrite, /* 0x1301 */ - HQA_MACBbpRegBulkRead, /* 0x1302 */ - HQA_RfRegBulkRead, /* 0x1303 */ - HQA_RfRegBulkWrite, /* 0x1304 */ - HQA_ReadEEPROM, /* 0x1305 */ - HQA_WriteEEPROM, /* 0x1306 */ - HQA_ReadBulkEEPROM, /* 0x1307 */ - HQA_WriteBulkEEPROM, /* 0x1308 */ -#ifdef RTMP_EFUSE_SUPPORT - HQA_CheckEfuseMode, /* 0x1309 */ - HQA_GetFreeEfuseBlock, /* 0x130A */ - HQA_GetEfuseBlockNr, /* 0x130B */ - HQA_WriteEFuseFromBuffer, /* 0x130C */ -#endif /* RTMP_EFUSE_SUPPORT */ -}; - -static INT32 HQA_ReadTempReferenceValue(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -VOID HQA_GetThermalValue_CB(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EXT_EVENT_GET_SENSOR_RESULT_T *EventExtCmdResult = - (struct _EXT_EVENT_GET_SENSOR_RESULT_T *)Data; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - EventExtCmdResult->u4SensorResult = - le2cpu32(EventExtCmdResult->u4SensorResult); - ATECtrl->thermal_val = EventExtCmdResult->u4SensorResult; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, value: 0x%x\n", __func__, - EventExtCmdResult->u4SensorResult)); - RTMP_OS_COMPLETE(&ATECtrl->cmd_done); -} - -static INT32 HQA_GetThermalValue(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UINT32 SensorResult = 0; - - MtCmdGetThermalSensorResult(pAd, 0, &SensorResult); - Ret = RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&ATECtrl->cmd_done, - ATECtrl->cmd_expire); - ATECtrl->thermal_val = OS_HTONL(ATECtrl->thermal_val); - NdisMoveMemory(HqaCmdFrame->Data + 2, &ATECtrl->thermal_val, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 HQA_SetSideBandOption(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET4[] = { - /* cmd id start from 0x1400 */ - HQA_ReadTempReferenceValue, /* 0x1400 */ - HQA_GetThermalValue, /* 0x1401 */ - HQA_SetSideBandOption, /* 0x1402 */ -}; - -static INT32 HQA_GetFWInfo(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Ret = ATEOp->GetFWInfo(pAd, HqaCmdFrame->Data + 2); - ResponseToQA(HqaCmdFrame, WRQ, 38, Ret); - return Ret; -} - -static INT32 HQA_GetRxStatisticsAll(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 value = 0; - UINT32 IBRssi0, IBRssi1, WBRssi0, WBRssi1; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _HQA_RX_STAT HqaRxStat; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memset(&HqaRxStat, 0, sizeof(struct _HQA_RX_STAT)); - /* Get latest FCSErr. sync iwpriv & HQA same FCSErr result */ - NICUpdateRawCountersNew(pAd); - HqaRxStat.mac_rx_fcs_err_cnt = OS_NTOHL(ATECtrl->RxMacFCSErrCount); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_MAC_MDRDYCNT); - ATECtrl->RxMacMdrdyCount += value; - HqaRxStat.mac_rx_mdrdy_cnt = OS_NTOHL(ATECtrl->RxMacMdrdyCount); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_PHY_FCSERRCNT); - HqaRxStat.phy_rx_fcs_err_cnt_ofdm = OS_NTOHL(value >> 16); - HqaRxStat.phy_rx_fcs_err_cnt_cck = OS_NTOHL(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_PD); - HqaRxStat.phy_rx_pd_ofdm = OS_NTOHL(value >> 16); - HqaRxStat.phy_rx_pd_cck = OS_NTOHL(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_CCK_SIG_SFD); - HqaRxStat.phy_rx_sig_err_cck = OS_NTOHL(value >> 16); - HqaRxStat.phy_rx_sfd_err_cck = OS_NTOHL(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_OFDM_SIG_TAG); - HqaRxStat.phy_rx_sig_err_ofdm = OS_NTOHL(value >> 16); - HqaRxStat.phy_rx_tag_err_ofdm = OS_NTOHL(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_RSSI); - IBRssi0 = (value & 0xFF000000) >> 24; - - if (IBRssi0 > 128) - IBRssi0 -= 256; - - WBRssi0 = (value & 0x00FF0000) >> 16; - - if (WBRssi0 > 128) - WBRssi0 -= 256; - - IBRssi1 = (value & 0x0000FF00) >> 8; - - if (IBRssi1 > 128) - IBRssi1 -= 256; - - WBRssi1 = (value & 0x000000FF); - - if (WBRssi1 > 128) - WBRssi1 -= 256; - - HqaRxStat.IB_RSSSI0 = OS_NTOHL(IBRssi0); - HqaRxStat.WB_RSSSI0 = OS_NTOHL(WBRssi0); - HqaRxStat.IB_RSSSI1 = OS_NTOHL(IBRssi1); - HqaRxStat.WB_RSSSI1 = OS_NTOHL(WBRssi1); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_PHY_MDRDYCNT); - HqaRxStat.phy_rx_mdrdy_cnt_ofdm = OS_NTOHL(value >> 16); - HqaRxStat.phy_rx_mdrdy_cnt_cck = OS_NTOHL(value & 0xFFFF); - HqaRxStat.DriverRxCount = OS_NTOHL(ATECtrl->RxTotalCnt); - HqaRxStat.RCPI0 = OS_NTOHL(ATECtrl->RCPI0); - HqaRxStat.RCPI1 = OS_NTOHL(ATECtrl->RCPI1); - HqaRxStat.FreqOffsetFromRX = OS_NTOHL(ATECtrl->FreqOffsetFromRx); - HqaRxStat.RSSI0 = OS_NTOHL(ATECtrl->RSSI0); - HqaRxStat.RSSI1 = OS_NTOHL(ATECtrl->RSSI1); - memcpy(HqaCmdFrame->Data + 2, &(HqaRxStat), - sizeof(struct _HQA_RX_STAT)); - ResponseToQA(HqaCmdFrame, WRQ, (2 + sizeof(struct _HQA_RX_STAT)), Ret); - return Ret; -} - -static INT32 HQA_StartContinousTx(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0, WFSel = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* Modulation:4 BW:4 PRI_CH:4 RATE:4 WFSel:4 */ - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATECtrl->PhyMode = (UCHAR)Value; - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - Value = OS_NTOHL(Value); - ATECtrl->BW = (UCHAR)Value; - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 8, 4); - Value = OS_NTOHL(Value); - /* ATECtrl->ControlChl = (UCHAR)Value; //TODO QA Tool send this parameter with 0, which leads to error in channel switch, mask temperarily */ - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 12, 4); - Value = OS_NTOHL(Value); - ATECtrl->Mcs = (UCHAR)Value; - memcpy((PUCHAR)&WFSel, (PUCHAR)&HqaCmdFrame->Data + 16, 4); - WFSel = OS_NTOHL(WFSel); - /* ATECtrl->TxAntennaSel = WFSel; */ - ATEOp->StartContinousTx(pAd, (CHAR)WFSel); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetSTBC(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATECtrl->Stbc = (UCHAR)Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetShortGI(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATECtrl->Sgi = (UCHAR)Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetDPD(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0, WFSel; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ON/OFF:4 WF Sel:4 */ - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - memcpy((PUCHAR)&WFSel, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - WFSel = OS_NTOHL(WFSel); - ATEOp->SetDPD(pAd, (CHAR)WFSel, (CHAR)Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StartContiTxTone(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - ATEOp->StartTxTone(pAd, Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopContiTxTone(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATEOp->StopTxTone(pAd); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_CalibrationTestMode(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 ICapLen = 0; - INT32 Ret = 0; - UINT8 Mode = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - memcpy((PUCHAR)&ICapLen, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - ICapLen = OS_NTOHL(ICapLen); - - if (Value == 0) - Mode = OPERATION_NORMAL_MODE; - else if (Value == 1) - Mode = OPERATION_RFTEST_MODE; - else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s Mode = %d error!!!\n", __func__, Value)); - - /* CmdRfTest(pAd, ACTION_SWITCH_TO_RFTEST, Mode, 0); */ - MtCmdRfTestSwitchMode(pAd, Mode, ICapLen, 0); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_DoCalibrationTestItem(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Value = 0; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - /* CmdRfTest(pAd, ACTION_IN_RFTEST, 0, Value); */ - MtCmdDoCalibration(pAd, Value); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_eFusePhysicalWrite(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_eFusePhysicalRead(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_eFuseLogicalRead(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_eFuseLogicalWrite(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TMRSetting(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetRxSNR(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0, Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Value = OS_NTOHL(ATECtrl->SNR0); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - Value = OS_NTOHL(ATECtrl->SNR1); - memcpy(HqaCmdFrame->Data + 6, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 10, Ret); - return Ret; -} - -static INT32 HQA_WriteBufferDone(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - - switch (Value) { - case E2P_EFUSE_MODE: - Set_EepromBufferWriteBack_Proc(pAd, "1"); - break; - - case E2P_FLASH_MODE: - Set_EepromBufferWriteBack_Proc(pAd, "2"); - break; - - case E2P_EEPROM_MODE: - Set_EepromBufferWriteBack_Proc(pAd, "3"); - break; - - case E2P_BIN_MODE: - Set_EepromBufferWriteBack_Proc(pAd, "4"); - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Unknow write back mode(%d)\n", __func__, Value)); - } - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_FFT(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - INT32 Ret = 0; - static UINT32 RFCR, OMA0R0, OMA0R1, OMA1R0, OMA1R1, OMA2R0, OMA2R1, - OMA3R0, OMA3R1, OMA4R0, OMA4R1; - - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = OS_NTOHL(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: %d\n", __func__, Value)); - - if (Value == 0) { - RTMP_IO_WRITE32(pAd, RMAC_RFCR, RFCR); - RTMP_IO_WRITE32(pAd, RMAC_OMA0R0, OMA0R0); - RTMP_IO_WRITE32(pAd, RMAC_OMA0R1, OMA0R1); - RTMP_IO_WRITE32(pAd, RMAC_OMA1R0, OMA1R0); - RTMP_IO_WRITE32(pAd, RMAC_OMA1R1, OMA1R1); - RTMP_IO_WRITE32(pAd, RMAC_OMA2R0, OMA2R0); - RTMP_IO_WRITE32(pAd, RMAC_OMA2R1, OMA2R1); - RTMP_IO_WRITE32(pAd, RMAC_OMA3R0, OMA3R0); - RTMP_IO_WRITE32(pAd, RMAC_OMA3R1, OMA3R1); - RTMP_IO_WRITE32(pAd, RMAC_OMA4R0, OMA4R0); - RTMP_IO_WRITE32(pAd, RMAC_OMA4R1, OMA4R1); - AsicSetWPDMA(pAd, PDMA_TX_RX, 1); - /* CmdRfTest(pAd, ACTION_SWITCH_TO_RFTEST, OPERATION_NORMAL_MODE, 0); */ - MtCmdRfTestSwitchMode(pAd, OPERATION_NORMAL_MODE, 120); - AsicSetMacTxRx(pAd, ASIC_MAC_RX_RXV, FALSE); - } else { - /* backup CR value */ - RTMP_IO_READ32(pAd, RMAC_RFCR, &RFCR); - RTMP_IO_READ32(pAd, RMAC_OMA0R0, &OMA0R0); - RTMP_IO_READ32(pAd, RMAC_OMA0R1, &OMA0R1); - RTMP_IO_READ32(pAd, RMAC_OMA1R0, &OMA1R0); - RTMP_IO_READ32(pAd, RMAC_OMA1R1, &OMA1R1); - RTMP_IO_READ32(pAd, RMAC_OMA2R0, &OMA2R0); - RTMP_IO_READ32(pAd, RMAC_OMA2R1, &OMA2R1); - RTMP_IO_READ32(pAd, RMAC_OMA3R0, &OMA3R0); - RTMP_IO_READ32(pAd, RMAC_OMA3R1, &OMA3R1); - RTMP_IO_READ32(pAd, RMAC_OMA4R0, &OMA4R0); - RTMP_IO_READ32(pAd, RMAC_OMA4R1, &OMA4R1); - RTMP_IO_READ32(pAd, RMAC_RFCR, &Value); - Value |= RM_FRAME_REPORT_EN; - RTMP_IO_WRITE32(pAd, RMAC_RFCR, Value); - /* set RMAC don't let packet go up */ - RTMP_IO_WRITE32(pAd, RMAC_RFCR, 0x001FEFFB); - RTMP_IO_WRITE32(pAd, RMAC_OMA0R0, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA0R1, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA1R0, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA1R1, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA2R0, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA2R1, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA3R0, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA3R1, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA4R0, 0x00000000); - RTMP_IO_WRITE32(pAd, RMAC_OMA4R1, 0x00000000); - AsicSetWPDMA(pAd, PDMA_TX_RX, 0); - AsicSetMacTxRx(pAd, ASIC_MAC_RX_RXV, TRUE); - } - - return Ret; -} -static INT32 HQA_SetTxTonePower(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - INT32 Ret = 0; - INT32 pwr1 = 0; - INT32 pwr2 = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - pwr1 = OS_NTOHL(Value); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - pwr2 = OS_NTOHL(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, pwr1:%d, pwr2:%d\n", __func__, pwr1, pwr2)); - ATEOp->SetTxTonePower(pAd, pwr1, pwr2); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET5[] = { - /* cmd id start from 0x1500 */ - HQA_GetFWInfo, /* 0x1500 */ - HQA_StartContinousTx, /* 0x1501 */ - HQA_SetSTBC, /* 0x1502 */ - HQA_SetShortGI, /* 0x1503 */ - HQA_SetDPD, /* 0x1504 */ - HQA_SetTssiOnOff, /* 0x1505 */ - HQA_GetRxStatisticsAll, /* 0x1506 */ - HQA_StartContiTxTone, /* 0x1507 */ - HQA_StopContiTxTone, /* 0x1508 */ - HQA_CalibrationTestMode, /* 0x1509 */ - HQA_DoCalibrationTestItem, /* 0x150A */ - HQA_eFusePhysicalWrite, /* 0x150B */ - HQA_eFusePhysicalRead, /* 0x150C */ - HQA_eFuseLogicalRead, /* 0x150D */ - HQA_eFuseLogicalWrite, /* 0x150E */ - HQA_TMRSetting, /* 0x150F */ - HQA_GetRxSNR, /* 0x1510 */ - HQA_WriteBufferDone, /* 0x1511 */ - HQA_FFT, /* 0x1512 */ - HQA_SetTxTonePower, /* 0x1513 */ -}; - -static struct _HQA_CMD_TABLE HQA_CMD_TABLES[] = { - { - HQA_CMD_SET0, - sizeof(HQA_CMD_SET0) / sizeof(HQA_CMD_HANDLER), - 0x1000, - }, - { - HQA_CMD_SET1, - sizeof(HQA_CMD_SET1) / sizeof(HQA_CMD_HANDLER), - 0x1100, - }, - { - HQA_CMD_SET2, - sizeof(HQA_CMD_SET2) / sizeof(HQA_CMD_HANDLER), - 0x1200, - }, - { - HQA_CMD_SET3, - sizeof(HQA_CMD_SET3) / sizeof(HQA_CMD_HANDLER), - 0x1300, - }, - { - HQA_CMD_SET4, - sizeof(HQA_CMD_SET4) / sizeof(HQA_CMD_HANDLER), - 0x1400, - }, - { - HQA_CMD_SET5, - sizeof(HQA_CMD_SET5) / sizeof(HQA_CMD_HANDLER), - 0x1500, - }, -}; - -static INT32 HQA_CMDHandler(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Status = NDIS_STATUS_SUCCESS; - USHORT CmdId; - UINT32 TableIndex = 0; - - CmdId = OS_NTOHS(HqaCmdFrame->Id); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n%s: Command_Id = 0x%04x !\n", __func__, CmdId)); - - while (TableIndex < - (sizeof(HQA_CMD_TABLES) / sizeof(struct _HQA_CMD_TABLE))) { - int CmdIndex = 0; - - CmdIndex = CmdId - HQA_CMD_TABLES[TableIndex].CmdOffset; - - if ((CmdIndex >= 0) && - (CmdIndex < HQA_CMD_TABLES[TableIndex].CmdSetSize)) { - HQA_CMD_HANDLER *pCmdSet; - - pCmdSet = HQA_CMD_TABLES[TableIndex].CmdSet; - - if (pCmdSet[CmdIndex] != NULL) - Status = (*pCmdSet[CmdIndex])(pAd, WRQ, - HqaCmdFrame); - - break; - } - - TableIndex++; - } - - return Status; -} - -INT32 RtmpDoAte(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - RTMP_STRING *wrq_name) -{ - INT32 Status = NDIS_STATUS_SUCCESS; - struct _HQA_CMD_FRAME *HqaCmdFrame; - UINT32 ATEMagicNum; - - os_alloc_mem_suspend(pAd, (UCHAR **)&HqaCmdFrame, sizeof(*HqaCmdFrame)); - - if (!HqaCmdFrame) { - Status = -ENOMEM; - goto ERROR0; - } - - os_zero_mem(HqaCmdFrame, sizeof(*HqaCmdFrame)); - Status = copy_from_user((PUCHAR)HqaCmdFrame, WRQ->u.data.pointer, - WRQ->u.data.length); - - if (Status) { - Status = -EFAULT; - goto ERROR1; - } - - ATEMagicNum = OS_NTOHL(HqaCmdFrame->MagicNo); - - switch (ATEMagicNum) { - case HQA_CMD_MAGIC_NO: - Status = HQA_CMDHandler(pAd, WRQ, HqaCmdFrame); - break; - - default: - Status = NDIS_STATUS_FAILURE; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Unknown magic number of HQA command = %x\n", - ATEMagicNum)); - break; - } - -ERROR1: - os_free_mem(HqaCmdFrame); -ERROR0: - return Status; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/testmode_ioctl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/testmode_ioctl.c deleted file mode 100644 index 35b048cfa9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/ate/testmode_ioctl.c +++ /dev/null @@ -1,7408 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - testmode_ioctl.c -*/ - -#if defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#include "hdev/hdev.h" -#endif - -static INT EthGetParamAndShiftBuff(BOOLEAN convert, UINT size, UCHAR **buf, - IN UCHAR *out) -{ - if (!(*buf)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("*buf NULL pointer with size:%u\n", size)); - return -1; - } - - if (!out) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("out NULL pointer with size:%u\n", size)); - return -1; - } - - NdisMoveMemory(out, *buf, size); - *buf = *buf + size; - - if (!convert) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::size %u, ", __func__, size)); - return 0; - } - - if (size == sizeof(UINT32)) { - UINT32 *tmp = (UINT32 *)out; - *tmp = PKTL_TRAN_TO_HOST(*tmp); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::size %u, val: %u\n", __func__, size, *tmp)); - } else if (size == sizeof(UINT16)) { - UINT16 *tmp = (UINT16 *)out; - *tmp = PKTS_TRAN_TO_HOST(*tmp); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::size %u, val: %u\n", __func__, size, *tmp)); - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s::size %u not supported\n", __func__, size)); - return -1; - } - - return 0; -} - -/* 1to do removed later */ -/* to seperate Windows ndis/WDM and Linux */ -#if defined(COMPOS_TESTMODE_WIN) -UINT32 mt_dft_mac_cr_range[] = { - 0x50022000, 0x50022000, 0xc84, /* USB Controller */ - 0x50029000, 0x50029000, 0x210, /* USB DMA */ - 0x800c006c, 0x800c006c, 0x100, /* PSE Client */ - 0x60000000, 0x20000, 0x200, /* WF_CFG */ - 0x60100000, 0x21000, 0x200, /* WF_TRB */ - 0x60110000, 0x21200, 0x200, /* WF_AGG */ - 0x60120000, 0x21400, 0x200, /* WF_ARB */ - 0x60130000, 0x21600, 0x200, /* WF_TMAC */ - 0x60140000, 0x21800, 0x200, /* WF_RMAC */ - 0x60150000, 0x21A00, 0x200, /* WF_SEC */ - 0x60160000, 0x21C00, 0x200, /* WF_DMA */ - 0x60170000, 0x21E00, 0x200, /* WF_CFGOFF */ - 0x60180000, 0x22000, 0x1000, /* WF_PF */ - 0x60190000, 0x23000, 0x200, /* WF_WTBLOFF */ - 0x601A0000, 0x23200, 0x200, /* WF_ETBF */ - - 0x60300000, 0x24000, 0x400, /* WF_LPON */ - 0x60310000, 0x24400, 0x200, /* WF_INT */ - 0x60320000, 0x28000, 0x4000, /* WF_WTBLON */ - 0x60330000, 0x2C000, 0x200, /* WF_MIB */ - 0x60400000, 0x2D000, 0x200, /* WF_AON */ - - 0x80020000, 0x00000, 0x2000, /* TOP_CFG */ - 0x80000000, 0x02000, 0x2000, /* MCU_CFG */ - 0x50000000, 0x04000, 0x4000, /* PDMA_CFG */ - 0xA0000000, 0x08000, 0x8000, /* PSE_CFG */ - 0x60200000, 0x10000, 0x10000, /* WF_PHY */ - - 0x0, 0x0, 0x0, -}; -BOOLEAN mt_mac_cr_range_mapping(RTMP_ADAPTER *pAd, UINT32 *mac_addr) -{ - UINT32 mac_addr_hif = *mac_addr; - INT idx = 0; - BOOLEAN IsFound = 0; - UINT32 *mac_cr_range = NULL; - - if (IS_MT7603(pAd) || IS_MT7628(pAd) || IS_MT76x6(pAd) || - IS_MT7637(pAd)) - mac_cr_range = &mt_dft_mac_cr_range[0]; - - if (!mac_cr_range) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: NotSupported Chip for this function!\n", - __func__)); - return IsFound; - } - - if (mac_addr_hif >= 0x40000) { - do { - if (mac_addr_hif >= mac_cr_range[idx] && - mac_addr_hif < (mac_cr_range[idx] + - mac_cr_range[idx + 2])) { - mac_addr_hif -= mac_cr_range[idx]; - mac_addr_hif += mac_cr_range[idx + 1]; - IsFound = 1; - break; - } - - idx += 3; - } while (mac_cr_range[idx] != 0); - } else - IsFound = 1; - - *mac_addr = mac_addr_hif; - return IsFound; -} - -UINT32 mt_physical_addr_map(UINT32 addr) -{ - UINT32 global_addr = 0x0, idx = 1; - extern UINT32 mt_mac_cr_range[]; - - if (addr < 0x2000) - global_addr = 0x80020000 + addr; - else if ((addr >= 0x2000) && (addr < 0x4000)) - global_addr = 0x80000000 + addr - 0x2000; - else if ((addr >= 0x4000) && (addr < 0x8000)) - global_addr = 0x50000000 + addr - 0x4000; - else if ((addr >= 0x8000) && (addr < 0x10000)) - global_addr = 0xa0000000 + addr - 0x8000; - else if ((addr >= 0x10000) && (addr < 0x20000)) - global_addr = 0x60200000 + addr - 0x10000; - else if ((addr >= 0x20000) && (addr < 0x40000)) { - do { - if ((addr >= mt_mac_cr_range[idx]) && - (addr < (mt_mac_cr_range[idx] + - mt_mac_cr_range[idx + 1]))) { - global_addr = mt_mac_cr_range[idx - 1] + - (addr - mt_mac_cr_range[idx]); - break; - } - - idx += 3; - } while (mt_mac_cr_range[idx] != 0); - - if (mt_mac_cr_range[idx] == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Unknow addr range = %x !!!\n", __func__, - addr)); - } - } else - global_addr = addr; - - return global_addr; -} - -static INT32 ResponseToQA(struct _HQA_CMD_FRAME *HqaCmdFrame, - RTMP_IOCTL_INPUT_STRUCT *WRQ, UINT32 Length, - INT32 Status) -{ - NdisMoveMemory(HqaCmdFrame->Data, &Status, 2); - HqaCmdFrame->Length = (UINT16)Length; - *WRQ->BytesRet = - sizeof((HqaCmdFrame)->MagicNo) + sizeof((HqaCmdFrame)->Type) + - sizeof((HqaCmdFrame)->Id) + sizeof((HqaCmdFrame)->Length) + - sizeof((HqaCmdFrame)->Sequence) + Length; - - if (*WRQ->BytesRet > WRQ->OutBufLen) - *WRQ->BytesRet = WRQ->OutBufLen; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: OutBufLen = 0x%x\n", __func__, WRQ->OutBufLen)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: BytesRet = 0x%x\n", __func__, *WRQ->BytesRet)); - RTMPMoveMemory(WRQ->OutBuf, WRQ->InBuf, *WRQ->BytesRet); - return Status; -} - -#else /* defined(COMPOS_TESTMODE_WIN) */ -static INT ResponseToQA(struct _HQA_CMD_FRAME *HqaCmdFrame, - RTMP_IOCTL_INPUT_STRUCT *WRQ, INT32 Length, - INT32 Status) -{ - HqaCmdFrame->Length = PKTS_TRAN_TO_NET((Length)); - Status = PKTS_TRAN_TO_NET((Status)); - NdisCopyMemory(HqaCmdFrame->Data, &Status, 2); - WRQ->u.data.length = - sizeof((HqaCmdFrame)->MagicNo) + sizeof((HqaCmdFrame)->Type) + - sizeof((HqaCmdFrame)->Id) + sizeof((HqaCmdFrame)->Length) + - sizeof((HqaCmdFrame)->Sequence) + - PKTS_TRAN_TO_HOST((HqaCmdFrame)->Length); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WRQ->u.data.length = %d, usr_addr:%p, hqa_addr:%p\n", - WRQ->u.data.length, WRQ->u.data.pointer, HqaCmdFrame)); - - if (copy_to_user(WRQ->u.data.pointer, (UCHAR *)(HqaCmdFrame), - WRQ->u.data.length)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("copy_to_user() fail in %s\n", __func__)); - return -EFAULT; - } - - return 0; -} -#endif /* TODO: Add lack of functions temporarily, and delete after merge */ - -static INT32 HQA_OpenAdapter(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->bQAEnabled = TRUE; - /* Prepare feedback as soon as we can to avoid QA timeout. */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - - if (ATEOp->ATEStart) - Ret = ATEOp->ATEStart(pAd); - else - Ret = TM_STATUS_NOTSUPPORT; - - return Ret; -} - -static INT32 HQA_CloseAdapter(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->bQAEnabled = FALSE; - /* Prepare feedback as soon as we can to avoid QA timeout. */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - - if (ATEOp->ATEStop) - Ret = ATEOp->ATEStop(pAd); - else - Ret = TM_STATUS_NOTSUPPORT; - - return Ret; -} - -static INT32 HQA_StartTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 TxCount; - UINT16 TxLength; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&TxCount, HqaCmdFrame->Data, 4); - memcpy(&TxLength, HqaCmdFrame->Data + 4, 2); - TxCount = PKTL_TRAN_TO_HOST(TxCount); - TxLength = PKTS_TRAN_TO_HOST(TxLength); - TESTMODE_SET_PARAM(ATECtrl, TESTMODE_BAND0, TxCount, TxCount); - TESTMODE_SET_PARAM(ATECtrl, TESTMODE_BAND0, TxLength, TxLength); - ATECtrl->bQATxStart = TRUE; - - if (ATEOp->StartTx) - Ret = ATEOp->StartTx(pAd); - else - Ret = TM_STATUS_NOTSUPPORT; - - if (ATECtrl->bQATxStart == TRUE) - ATECtrl->TxStatus = 1; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_StartTxExt(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_StartTxContiTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_StartTxCarrier(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StartRx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ATECtrl->bQARxStart = TRUE; - - if (ATEOp->StartRx) - Ret = ATEOp->StartRx(pAd); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 Mode; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Mode = TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, Mode); - Mode &= ATE_TXSTOP; - TESTMODE_SET_PARAM(ATECtrl, TESTMODE_BAND0, Mode, Mode); - ATECtrl->bQATxStart = FALSE; - - if (ATEOp->StopTx) - Ret = ATEOp->StopTx(pAd); - else - Ret = TM_STATUS_NOTSUPPORT; - - ATECtrl->TxStatus = 0; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopContiTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - /* TODO Get Correct TxfdMode*/ - UINT32 TxfdMode = 1; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - { - if (ATEOp->StopContinousTx) - ATEOp->StopContinousTx(pAd, TxfdMode); - else - Ret = TM_STATUS_NOTSUPPORT; - } - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_StopTxCarrier(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopRx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 Mode; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Mode = TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, Mode); - Mode &= ATE_RXSTOP; - TESTMODE_SET_PARAM(ATECtrl, TESTMODE_BAND0, Mode, Mode); - ATECtrl->bQARxStart = FALSE; - - if (ATEOp->StopRx) - Ret = ATEOp->StopRx(pAd); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTxPath(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT16 Value = 0; - INT32 ant_sel = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 2); - ant_sel = PKTS_TRAN_TO_HOST(Value); - - if (ant_sel & 0x8000) { - ant_sel &= 0x7FFF; - ant_sel |= 0x80000000; - } - - if (ATEOp->SetTxAntenna) - Ret = ATEOp->SetTxAntenna(pAd, ant_sel); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetRxPath(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT16 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 2); - Value = PKTS_TRAN_TO_HOST(Value); - - if (ATEOp->SetRxAntenna) - Ret = ATEOp->SetRxAntenna(pAd, (CHAR)Value); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTxIPG(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): val:%d,0x%04x\n", __func__, Value, Value)); - - if (ATEOp->SetAIFS) - ATEOp->SetAIFS(pAd, (UINT32)Value); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTxPower0(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT16 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - ATE_TXPOWER TxPower; - UINT8 band_idx = TESTMODE_BAND0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 2); - Value = PKTS_TRAN_TO_HOST(Value); - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Power = Value; - TxPower.Dbdc_idx = band_idx; - - if (ATEOp->SetTxPower0) - Ret = ATEOp->SetTxPower0(pAd, TxPower); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HAQ_SetTxPower1(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT16 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - ATE_TXPOWER TxPower; - UINT8 band_idx = TESTMODE_BAND0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 2); - Value = PKTS_TRAN_TO_HOST(Value); - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Power = Value; - TxPower.Dbdc_idx = band_idx; - - if (ATEOp->SetTxPower1) - Ret = ATEOp->SetTxPower1(pAd, TxPower); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTxPowerExt(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - ATE_TXPOWER TxPower; - UINT32 power = 0; - UINT32 Channel = 0; - UINT32 dbdc_idx = 0; - UINT32 band_idx = 0; - UINT32 ant_idx = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&power); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&dbdc_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&Channel); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&band_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ant_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Ant_idx = ant_idx; - TxPower.Power = power; - TxPower.Channel = Channel; - TxPower.Dbdc_idx = dbdc_idx; - TxPower.Band_idx = band_idx; - - if (ATEOp->SetTxPowerX) - Ret = ATEOp->SetTxPowerX(pAd, TxPower); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -#ifdef TXPWRMANUAL -static INT32 HQA_SetTxPwrManual(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT16 Ret = 0; - struct _HQA_PWR_MANUAL manual_pwr; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - - /* Setting parameters */ - BOOLEAN fgPwrManCtrl = FALSE; - UINT8 u1TxPwrModeManual = 0; - UINT8 u1TxPwrBwManual = 0; - UINT8 u1TxPwrRateManual = 0; - INT8 i1TxPwrValueManual = 0; - UCHAR Band = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_pwr.u4PwrManCtrl); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_pwr.u4Band); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_pwr.i4TxPwrValueManual); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_pwr.u4TxPwrModeManual); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_pwr.u4TxPwrRateManual); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_pwr.u4TxPwrBwManual); - - fgPwrManCtrl = manual_pwr.u4PwrManCtrl; - u1TxPwrModeManual = manual_pwr.u4TxPwrModeManual; - u1TxPwrBwManual = manual_pwr.u4TxPwrBwManual; - u1TxPwrRateManual = manual_pwr.u4TxPwrRateManual; - i1TxPwrValueManual = manual_pwr.i4TxPwrValueManual; - Band = manual_pwr.u4Band; - - if (ATEOp->SetTxPwrManual) - ATEOp->SetTxPwrManual(pAd, fgPwrManCtrl, u1TxPwrModeManual, - u1TxPwrBwManual, u1TxPwrRateManual, - i1TxPwrValueManual, Band); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} -#endif - -static INT32 HQA_AntennaSel(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - /* todo wait FW confirm */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetOnOFF(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __FUNCTION__)); */ - return Ret; -} - -static INT32 -HQA_FWPacketCMD_ClockSwitchDisable(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 isDisable = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - EthGetParamAndShiftBuff(TRUE, sizeof(isDisable), &data, - (UCHAR *)&isDisable); - ATEOp->ClockSwitchDisable(pAd, isDisable); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTxPowerEval(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __FUNCTION__)); */ - return Ret; -} - -static INT32 HQA_AntennaSelExt(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 RfModeMask = 0; - UINT32 RfPortMask = 0; - UINT32 AntPortMask = 0; - UINT32 BandIdx = 0; - UCHAR *data = HqaCmdFrame->Data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - NdisMoveMemory((PUCHAR)&BandIdx, data, sizeof(BandIdx)); - data += sizeof(BandIdx); - BandIdx = PKTL_TRAN_TO_HOST(BandIdx); - NdisMoveMemory((PUCHAR)&RfModeMask, data, sizeof(RfModeMask)); - data += sizeof(RfModeMask); - RfModeMask = PKTL_TRAN_TO_HOST(RfModeMask); - NdisMoveMemory((PUCHAR)&RfPortMask, data, sizeof(RfPortMask)); - data += sizeof(RfPortMask); - RfPortMask = PKTL_TRAN_TO_HOST(RfPortMask); - NdisMoveMemory((PUCHAR)&AntPortMask, data, sizeof(AntPortMask)); - data += sizeof(AntPortMask); - AntPortMask = PKTL_TRAN_TO_HOST(AntPortMask); -#if defined(COMPOS_TESTMODE_WIN) - pAd->AntennaMainAux = AntPortMask; -#endif - ATECtrl->control_band_idx = (UCHAR)BandIdx; - - Ret = ATEOp->SetAntennaPort(pAd, RfModeMask, RfPortMask, AntPortMask); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BandIdx:%x, RfModeMask:%x, RfPortMask:%x, AntPortMask:%x\n", - __func__, BandIdx, RfModeMask, RfPortMask, AntPortMask)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET0[] = { - /* cmd id start from 0x1000 */ - HQA_OpenAdapter, /* 0x1000 */ - HQA_CloseAdapter, /* 0x1001 */ - HQA_StartTx, /* 0x1002 */ - HQA_StartTxExt, /* 0x1003 */ - HQA_StartTxContiTx, /* 0x1004 */ - HQA_StartTxCarrier, /* 0x1005 */ - HQA_StartRx, /* 0x1006 */ - HQA_StopTx, /* 0x1007 */ - HQA_StopContiTx, /* 0x1008 */ - HQA_StopTxCarrier, /* 0x1009 */ - HQA_StopRx, /* 0x100A */ - HQA_SetTxPath, /* 0x100B */ - HQA_SetRxPath, /* 0x100C */ - HQA_SetTxIPG, /* 0x100D */ - HQA_SetTxPower0, /* 0x100E */ - HAQ_SetTxPower1, /* 0x100F */ - HQA_SetTxPowerEval, /* 0x1010 */ - HQA_SetTxPowerExt, /* 0x1011 */ - HQA_SetOnOFF, /* 0x1012 */ - HQA_AntennaSel, /* 0x1013 */ - HQA_FWPacketCMD_ClockSwitchDisable, /* 0x1014 */ - HQA_AntennaSelExt, /* 0x1015 */ - NULL, /* 0x1016 */ - NULL, /* 0x1017 */ -#ifdef TXPWRMANUAL - HQA_SetTxPwrManual, /* 0x1018 */ -#endif -}; - -static INT32 HQA_SetChannel(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Ret = 0; - UINT32 Value; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((UINT8 *)&Value, HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Channel = %d, BW = %d\n", __func__, ATECtrl->Channel, - ATECtrl->BW)); - ATECtrl->Channel = (UINT8)Value; - - if (ATEOp->SetChannel) - Ret = ATEOp->SetChannel(pAd, (UINT16)Value, 0, 0, 0); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetPreamble(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - /* 000: Legacy CCK - * 001: Legacy OFDM - * 010: HT Mixed mode - * 011: HT Green field mode - * 100: VHT mode - */ - ATECtrl->PhyMode = (UCHAR)Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetRate(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - ATECtrl->Mcs = (UCHAR)Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetNss(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetSystemBW(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Value; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - /* 0: BW_20, 1:BW_40, 2:BW_80, 3:BW_160*/ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: BW = %d\n", __func__, Value)); - - ATECtrl->BW = Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetPerPktBW(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Value; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: %u\n", __func__, Value)); - - if (Value > ATECtrl->BW) - Value = ATECtrl->BW; - - ATECtrl->PerPktBW = Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetPrimaryBW(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetFreqOffset(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - - if (ATEOp->SetTxFreqOffset) - ATEOp->SetTxFreqOffset(pAd, (UINT32)Value); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetAutoResponder(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetTssiOnOff(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0, WFSel; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ON/OFF:4 WF Sel:4 */ - memcpy((PUCHAR)&Value, HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - memcpy((PUCHAR)&WFSel, HqaCmdFrame->Data + 4, 4); - WFSel = PKTL_TRAN_TO_HOST(WFSel); - - if (ATEOp->SetTSSI) - ATEOp->SetTSSI(pAd, (CHAR)WFSel, (CHAR)Value); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 -HQA_SetRxHighLowTemperatureCompensation(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_LowPower(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Control = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - - EthGetParamAndShiftBuff(TRUE, sizeof(Control), &data, - (UCHAR *)&Control); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s Control:%d\n", __func__, Control)); - - if (ATEOp->LowPower) - ATEOp->LowPower(pAd, Control); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET1[] = { - /* cmd id start from 0x1100 */ - HQA_SetChannel, /* 0x1100 */ - HQA_SetPreamble, /* 0x1101 */ - HQA_SetRate, /* 0x1102 */ - HQA_SetNss, /* 0x1103 */ - HQA_SetSystemBW, /* 0x1104 */ - HQA_SetPerPktBW, /* 0x1105 */ - HQA_SetPrimaryBW, /* 0x1106 */ - HQA_SetFreqOffset, /* 0x1107 */ - HQA_SetAutoResponder, /* 0x1108 */ - HQA_SetTssiOnOff, /* 0x1109 */ - HQA_SetRxHighLowTemperatureCompensation, /* 0x110A */ - HQA_LowPower, /* 0x110B */ -}; - -static INT32 HQA_ResetTxRxCounter(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - MtAsicGetRxStat(pAd, HQA_RX_RESET_PHY_COUNT); - MtAsicGetRxStat(pAd, HQA_RX_RESET_MAC_COUNT); -#ifdef CONFIG_HW_HAL_OFFLOAD - MtCmdSetPhyCounter(pAd, 0, TESTMODE_BAND0); - MtCmdSetPhyCounter(pAd, 1, TESTMODE_BAND0); - - if (IS_ATE_DBDC(pAd)) { - MtCmdSetPhyCounter(pAd, 0, TESTMODE_BAND1); - MtCmdSetPhyCounter(pAd, 1, TESTMODE_BAND1); - } - -#endif - MT_ATEUpdateRxStatistic(pAd, TESTMODE_RESET_CNT, NULL); - ATECtrl->TxDoneCount = 0; - - if (IS_ATE_DBDC(pAd)) - TESTMODE_SET_PARAM(ATECtrl, TESTMODE_BAND1, TxDoneCount, 0); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetChipID(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 ChipId; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - RTMP_IO_READ32(pAd, TOP_HCR, &ChipId); - ChipId = OS_NTOHL(ChipId); - memcpy(HqaCmdFrame->Data + 2, &ChipId, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -static INT32 HQA_GetFWVersion(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct fw_info *fw_info = NULL; - UINT i = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - fw_info = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[WM_CPU].fw_info; - if (fw_info != NULL) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Built date: ")); - for (i = 0; i < 12; i++) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%c", fw_info->ram_built_date[i])); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - - memcpy(HqaCmdFrame->Data + 2, &fw_info->ram_built_date[0], 12); - } - - ResponseToQA(HqaCmdFrame, WRQ, 2 + 12, Ret); - return Ret; -} - -static INT32 HQA_GetStatistics(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} -/* 1 todo not support yet */ -static INT32 HQA_GetRxOKData(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_GetRxOKOther(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_GetRxAllPktCount(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetTxTransmitted(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - Value = ATECtrl->TxDoneCount; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): TxDoneCount = %d\n", __func__, ATECtrl->TxDoneCount)); - Value = PKTL_TRAN_TO_NET(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_GetHwCounter(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_CalibrationOperation(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_CalibrationBypassExt(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UINT32 item = 0; - UINT32 band_idx = 0; - UCHAR *data = HqaCmdFrame->Data; - - NdisMoveMemory((UCHAR *)&item, data, sizeof(item)); - data += sizeof(item); - item = PKTL_TRAN_TO_HOST(item); - NdisMoveMemory((UCHAR *)&band_idx, data, sizeof(band_idx)); - data += sizeof(band_idx); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - MtCmdDoCalibration(pAd, CALIBRATION_BYPASS, item, band_idx); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: item:%x, band_idx:%x\n", __func__, item, band_idx)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetRXVectorIdx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UINT32 band_idx = 0; - UINT32 Group_1 = 0, Group_2 = 0; - UCHAR *data = HqaCmdFrame->Data; - - NdisMoveMemory((UCHAR *)&band_idx, data, sizeof(band_idx)); - data += sizeof(band_idx); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - NdisMoveMemory((UCHAR *)&Group_1, data, sizeof(Group_1)); - data += sizeof(Group_1); - Group_1 = PKTL_TRAN_TO_HOST(Group_1); - NdisMoveMemory((UCHAR *)&Group_2, data, sizeof(Group_2)); - data += sizeof(Group_2); - Group_2 = PKTL_TRAN_TO_HOST(Group_2); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - -#ifdef CONFIG_HW_HAL_OFFLOAD - MtCmdSetRxvIndex(pAd, Group_1, Group_2, band_idx); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: band_idx:%d, G1:%d, G2:%d\n", __func__, band_idx, - Group_1, Group_2)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetFAGCRssiPath(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ate_ctrl = &pAd->ATECtrl; - INT32 Ret = 0; - UINT32 band_idx = 0; - UINT32 FAGC_Path = 0; - UCHAR *data = HqaCmdFrame->Data; - - NdisMoveMemory((UCHAR *)&band_idx, data, sizeof(band_idx)); - data += sizeof(band_idx); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - NdisMoveMemory((UCHAR *)&FAGC_Path, data, sizeof(FAGC_Path)); - data += sizeof(FAGC_Path); - FAGC_Path = PKTL_TRAN_TO_HOST(FAGC_Path); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, FAGC_Path, FAGC_Path); - - ate_ctrl->control_band_idx = (UCHAR)band_idx; - -#ifdef CONFIG_HW_HAL_OFFLOAD - MtCmdSetFAGCPath(pAd, FAGC_Path, band_idx); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: band_idx:%d, FAGC_Path%d\n", __func__, band_idx, - FAGC_Path)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET2[] = { - /* cmd id start from 0x1200 */ - HQA_ResetTxRxCounter, /* 0x1200 */ - HQA_GetStatistics, /* 0x1201 */ - HQA_GetRxOKData, /* 0x1202 */ - HQA_GetRxOKOther, /* 0x1203 */ - HQA_GetRxAllPktCount, /* 0x1204 */ - HQA_GetTxTransmitted, /* 0x1205 */ - HQA_GetHwCounter, /* 0x1206 */ - HQA_CalibrationOperation, /* 0x1207 */ - HQA_CalibrationBypassExt, /* 0x1208 */ - HQA_SetRXVectorIdx, /* 0x1209 */ - HQA_SetFAGCRssiPath, /* 0x120A */ -}; - -#if !defined(COMPOS_TESTMODE_WIN) -static VOID memcpy_exs(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len) -{ - ULONG i; - USHORT *pDst, *pSrc; - - pDst = (USHORT *)dst; - pSrc = (USHORT *)src; - - for (i = 0; i < (len >> 1); i++) { - *pDst = PKTS_TRAN_TO_HOST(*pSrc); - pDst++; - pSrc++; - } - - if ((len % 2) != 0) { - memcpy(pDst, pSrc, (len % 2)); - *pDst = PKTS_TRAN_TO_HOST(*pDst); - } -} -#endif - -static INT32 HQA_MacBbpRegRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Offset, Value; - BOOLEAN IsFound; - - memcpy(&Offset, HqaCmdFrame->Data, 4); - Offset = PKTL_TRAN_TO_HOST(Offset); - IsFound = mt_mac_cr_range_mapping(pAd, &Offset); -#if defined(COMPOS_TESTMODE_WIN) - Offset = mt_physical_addr_map(Offset); - IsFound = TRUE; -#endif - - if (!IsFound) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(Offset) << 19; - RemapOffset = GET_REMAP_2_OFFSET(Offset); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - } else - HW_IO_READ32(pAd, Offset, &Value); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Value = %x\n", __func__, Offset, Value)); - Value = PKTL_TRAN_TO_NET(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -static INT32 HQA_MacBbpRegWrite(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Offset, Value; - BOOLEAN IsFound; - - memcpy(&Offset, HqaCmdFrame->Data, 4); - memcpy(&Value, HqaCmdFrame->Data + 4, 4); - Offset = PKTL_TRAN_TO_HOST(Offset); - Value = PKTL_TRAN_TO_HOST(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Value = %x\n", __func__, Offset, Value)); - IsFound = mt_mac_cr_range_mapping(pAd, &Offset); -#if defined(COMPOS_TESTMODE_WIN) - Offset = mt_physical_addr_map(Offset); - IsFound = TRUE; -#endif - - if (!IsFound) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(Offset) << 19; - RemapOffset = GET_REMAP_2_OFFSET(Offset); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - } else - HW_IO_WRITE32(pAd, Offset, Value); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -#if !defined(COMPOS_TESTMODE_WIN) -#define REG_SIZE 128 -RTMP_REG_PAIR RegPair[REG_SIZE]; - -VOID RTMP_IO_MCU_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *Dst, UINT32 Offset, - UINT32 Len) -{ - UINT32 Index, Value = 0; - UCHAR *pDst; - UINT32 NumOfReg = (Len >> 2); - UINT32 Reg_idx = 0; /* Rate is 0 to REG_SIZE-1 */ - UINT32 i; - UCHAR OffsetByte = 0x4; - UINT32 Ret_idx = 0; - - for (Index = 0; Index < NumOfReg; Index++) { - RegPair[Reg_idx].Register = Offset + OffsetByte * Index; - - /* Read CR per REG_SIZE or lastest CR */ - if (Reg_idx == REG_SIZE - 1 || Index == NumOfReg - 1) { - MtCmdMultipleMacRegAccessRead(pAd, RegPair, - Reg_idx + 1); - - for (i = 0; i <= Reg_idx; i++) { - pDst = (Dst + ((Ret_idx) << 2)); - Value = RegPair[i].Value; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s: Offset = %x, Value = %x\n", - __func__, RegPair[i].Register, - Value)); - Value = PKTL_TRAN_TO_NET(Value); - memmove(pDst, &Value, 4); - Ret_idx++; - } - - Reg_idx = 0; - } else - Reg_idx++; - } -} -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - -VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *Dst, UINT32 Offset, UINT32 Len) -{ - UINT32 Index, Value = 0; - UCHAR *pDst; - UINT32 NumOfReg = (Len >> 2); - BOOLEAN IsFound; - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UINT32 OffsetTmp = Offset; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("\n\n")); -#if !defined(COMPOS_TESTMODE_WIN) - IsFound = mt_mac_cr_range_mapping(pAd, &Offset); - - if (!IsFound && NumOfReg > 1 && Offset && - !(ATECtrl->Mode & fATE_IN_ICAPOVERLAP)) { - RTMP_IO_MCU_READ_BULK(pAd, Dst, Offset, Len); - return; - } - -#endif /* !defined(COMPOS_TESTMODE_WIN) */ - Offset = OffsetTmp; - - for (Index = 0; Index < NumOfReg; Index++) { - pDst = (Dst + (Index << 2)); - IsFound = mt_mac_cr_range_mapping(pAd, &Offset); -#if defined(COMPOS_TESTMODE_WIN) - Offset = mt_physical_addr_map(Offset); - IsFound = TRUE; -#endif - - if (!IsFound) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(Offset) << 19; - RemapOffset = GET_REMAP_2_OFFSET(Offset); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - } else - HW_IO_READ32(pAd, Offset, &Value); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Value = %x\n", __func__, Offset, - Value)); - Value = PKTL_TRAN_TO_NET(Value); - memmove(pDst, &Value, 4); - Offset += 4; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("\n\n")); -} - -static INT32 HQA_MACBbpRegBulkRead(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Offset; - UINT16 Len, Tmp; - INT debug_lvl = DebugLevel; - - DebugLevel = DBG_LVL_OFF; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&Offset, HqaCmdFrame->Data, 4); - Offset = PKTL_TRAN_TO_HOST(Offset); - memcpy(&Len, HqaCmdFrame->Data + 4, 2); - Len = PKTS_TRAN_TO_HOST(Len); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Len(unit: 4bytes) = %d\n", __func__, Offset, - Len)); - - if (Len > 371) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: length requested is too large, make it smaller\n", - __func__)); - HqaCmdFrame->Length = PKTS_TRAN_TO_NET(2); - Tmp = PKTS_TRAN_TO_NET(1); - memcpy(HqaCmdFrame->Data, &Tmp, 2); - return -EFAULT; - } - - RTMP_IO_READ_BULK(pAd, HqaCmdFrame->Data + 2, Offset, - (Len << 2)); /* unit in four bytes*/ - ResponseToQA(HqaCmdFrame, WRQ, 2 + (Len << 2), Ret); - DebugLevel = debug_lvl; - return Ret; -} - -static INT32 HQA_RfRegBulkRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Index, WfSel, Offset, Length, Value; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy(&WfSel, HqaCmdFrame->Data, 4); - WfSel = PKTL_TRAN_TO_HOST(WfSel); - memcpy(&Offset, HqaCmdFrame->Data + 4, 4); - Offset = PKTL_TRAN_TO_HOST(Offset); - memcpy(&Length, HqaCmdFrame->Data + 8, 4); - Length = PKTL_TRAN_TO_HOST(Length); - - if (ATEOp->RfRegRead) { - for (Index = 0; Index < Length; Index++) { - Ret = ATEOp->RfRegRead(pAd, WfSel, Offset + Index * 4, - &Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Wfsel = %d, Offset = %x, Value = %x\n", - __func__, WfSel, Offset + Index * 4, Value)); - - if (Ret) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Wfsel = %d, Offset = %x, Value = %x fail\n", - WfSel, Offset + Index * 4, Value)); - break; - } - - Value = PKTL_TRAN_TO_NET(Value); - memcpy(HqaCmdFrame->Data + 2 + (Index * 4), &Value, 4); - } - } else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2 + (Length * 4), Ret); - return Ret; -} - -static INT32 HQA_RfRegBulkWrite(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Index, WfSel, Offset, Length, Value; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&WfSel, HqaCmdFrame->Data, 4); - WfSel = PKTL_TRAN_TO_HOST(WfSel); - memcpy(&Offset, HqaCmdFrame->Data + 4, 4); - Offset = PKTL_TRAN_TO_HOST(Offset); - memcpy(&Length, HqaCmdFrame->Data + 8, 4); - Length = PKTL_TRAN_TO_HOST(Length); - - if (ATEOp->RfRegWrite) { - for (Index = 0; Index < Length; Index++) { - memcpy(&Value, HqaCmdFrame->Data + 12 + (Index * 4), 4); - Value = PKTL_TRAN_TO_HOST(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Wfsel = %d, Offset = %x, Value = %x\n", - __func__, WfSel, Offset + Index * 4, Value)); - Ret = ATEOp->RfRegWrite(pAd, WfSel, Offset + Index * 4, - Value); - - if (Ret) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Wfsel = %d, Offset = %x, Value = %x fail\n", - WfSel, Offset + Index * 4, Value)); - break; - } - } - } else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_ReadEEPROM(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; -#if !defined(COMPOS_TESTMODE_WIN) /* 1Todo RT28xx_EEPROM_READ16 */ - UINT16 Offset = 0, Value = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&Offset, HqaCmdFrame->Data, 2); - Offset = PKTS_TRAN_TO_HOST(Offset); - RT28xx_EEPROM_READ16(pAd, Offset, Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p r %02Xh = 0x%02X\n", (Offset & 0x00FF), - (Value & 0x00FF))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p r %02Xh = 0x%02X\n", (Offset & 0x00FF) + 1, - (Value & 0xFF00) >> 8)); - Value = PKTS_TRAN_TO_NET(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 2); -#endif - ResponseToQA(HqaCmdFrame, WRQ, 4, Ret); - return Ret; -} - -static INT32 HQA_WriteEEPROM(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 Offset = 0, Value = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy(&Offset, HqaCmdFrame->Data, 2); - Offset = PKTS_TRAN_TO_HOST(Offset); - memcpy(&Value, HqaCmdFrame->Data + 2, 2); - Value = PKTS_TRAN_TO_HOST(Value); -#if defined(COMPOS_TESTMODE_WIN) - NdisMoveMemory(&(pAd->EEPROMImage[Offset]), &Value, 2); -#else - RT28xx_EEPROM_WRITE16(pAd, Offset, Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p w 0x%04X = 0x%04X\n", Offset, Value)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p w %02Xh = 0x%02X\n", (Offset & 0x00FF), - (Value & 0x00FF))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("e2p w %02Xh = 0x%02X\n", (Offset & 0x00FF) + 1, - (Value & 0xFF00) >> 8)); -#endif - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_ReadBulkEEPROM(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 Offset; - UINT16 Len; - UINT16 size = EEPROM_SIZE; - UINT16 *Buffer = NULL; - struct _RTMP_CHIP_CAP *cap; - - cap = hc_get_chip_cap(pAd->hdev_ctrl); - memcpy(&Offset, HqaCmdFrame->Data, 2); - Offset = PKTS_TRAN_TO_HOST(Offset); - memcpy(&Len, HqaCmdFrame->Data + 2, 2); - Len = PKTS_TRAN_TO_HOST(Len); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Offset = %x, Length = %x\n", __func__, Offset, Len)); -#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - size = get_dev_eeprom_size(pAd); -#endif - -#if !defined(COMPOS_TESTMODE_WIN) /* 1Todo EEReadAll */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); - Ret = os_alloc_mem(pAd, (PUCHAR *)&Buffer, size); /* TODO verify */ - - if (Ret == NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: allocate memory for read EEPROM fail\n", - __func__)); - Len = 0; - goto HQA_ReadBulkEEPROM_RET; - } - - EEReadAll(pAd, (UINT16 *)Buffer, size); - - if (Offset + Len <= size) - memcpy_exs(pAd, HqaCmdFrame->Data + 2, (UCHAR *)Buffer + Offset, - Len); - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: exceed EEPROM size\n", __func__)); - Len = 0; - Ret = -1; - } - - os_free_mem(Buffer); - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#else - - if (Offset + Len <= cap->EFUSE_BUFFER_CONTENT_SIZE) - os_move_mem(HqaCmdFrame->Data + 2, - (UCHAR *)pAd->EEPROMImage + Offset, Len); - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: exceed EEPROM size\n", __func__)); - Len = 0; - Ret = -1; - } - -#endif -HQA_ReadBulkEEPROM_RET: - ResponseToQA(HqaCmdFrame, WRQ, 2 + Len, Ret); - return Ret; -} - -static VOID EEWriteBulk(PRTMP_ADAPTER pAd, UINT16 *Data, UINT16 Offset, - UINT16 Length) -{ -#if !defined( \ - COMPOS_TESTMODE_WIN) /* 1Todo struct _ATE_CTRL RT28xx_EEPROM_WRITE16 */ - UINT16 Pos; - UINT16 Value; - UINT16 Len = Length; - - for (Pos = 0; Pos < (Len >> 1);) { - Value = Data[Pos]; - RT28xx_EEPROM_WRITE16(pAd, Offset + (Pos * 2), Value); - Pos++; - } - -#endif -} - -static INT32 HQA_WriteBulkEEPROM(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; -#if !defined(COMPOS_TESTMODE_WIN) /* 1Todo RT28xx_EEPROM_WRITE16 */ - USHORT Offset; - USHORT Len; - UINT16 *Buffer = NULL; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - memcpy(&Offset, HqaCmdFrame->Data, 2); - Offset = PKTS_TRAN_TO_HOST(Offset); - memcpy(&Len, HqaCmdFrame->Data + 2, 2); - Len = PKTS_TRAN_TO_HOST(Len); - Ret = os_alloc_mem(pAd, (PUCHAR *)&Buffer, - EEPROM_SIZE); /* TODO verify */ - - if (Ret == NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: allocate memory for read EEPROM fail\n", - __func__)); - goto HQA_WriteBulkEEPROM_RET; - } - - memcpy_exs(pAd, (UCHAR *)Buffer + Offset, - (UCHAR *)HqaCmdFrame->Data + 4, Len); -#if defined(RTMP_FLASH_SUPPORT) - - if (Len == 16) - memcpy(pAd->EEPROMImage + Offset, (UCHAR *)Buffer + Offset, - Len); - - if ((Offset + Len) == EEPROM_SIZE) - rtmp_ee_flash_write_all(pAd); - - if (Len != 16) -#endif /* RTMP_FLASH_SUPPORT */ - { - if ((Offset + Len) <= EEPROM_SIZE) - EEWriteBulk(pAd, (UINT16 *)(((UCHAR *)Buffer) + Offset), - Offset, Len); - else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: exceed EEPROM size(%d)\n", __func__, - EEPROM_SIZE)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Offset = %u\n", Offset)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Length = %u\n", Len)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Offset + Length=%u\n", (Offset + Len))); - } - } - -HQA_WriteBulkEEPROM_RET: - ResponseToQA(HqaCmdFrame, WRQ, 2 + Len, Ret); - if (Buffer) - os_free_mem(Buffer); -#endif - return Ret; -} - -#ifdef RTMP_EFUSE_SUPPORT -static INT32 HQA_CheckEfuseMode(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; -#if !defined(COMPOS_TESTMODE_WIN) /* 1Todo eFuseGetFreeBlockCount */ - UINT32 Value; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if (pAd->bUseEfuse) - Value = 1; - else - Value = 0; - - Value = PKTL_TRAN_TO_NET(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); -#endif - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -static INT32 HQA_GetFreeEfuseBlock(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; -#if !defined(COMPOS_TESTMODE_WIN) /* 1Todo eFuseGetFreeBlockCount */ - /* remove this block when command RSP function ready */ - UINT32 Value; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - eFuseGetFreeBlockCount(pAd, &Value); - Value = PKTL_TRAN_TO_NET(Value); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); -#else - INT32 GetFreeBlock = 0; - UINT32 Result = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: GetFreeBlock:%d\n", __func__, GetFreeBlock)); - - if (ATEOp->EfuseGetFreeBlock) { - ATEOp->EfuseGetFreeBlock(pAd, GetFreeBlock, &Result); - Result = PKTL_TRAN_TO_HOST(Result); - memcpy(HqaCmdFrame->Data + 2, &Result, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - } else { - Ret = TM_STATUS_NOTSUPPORT; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - } - -#endif - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_GetEfuseBlockNr(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_WriteEFuseFromBuffer(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} -#endif /* RTMP_EFUSE_SUPPORT */ - -static INT32 HQA_GetTxPower(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Channel = 0, Band = 0, Ch_Band = 0, EfuseAddr = 0, Power = 0; - INT32 offset = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Channel, (PUCHAR)&HqaCmdFrame->Data, sizeof(Channel)); - Channel = PKTL_TRAN_TO_HOST(Channel); - offset += sizeof(Channel); - memcpy((PUCHAR)&Band, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Band)); - Band = PKTL_TRAN_TO_HOST(Band); - offset += sizeof(Band); - memcpy((PUCHAR)&Ch_Band, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Ch_Band)); - Ch_Band = PKTL_TRAN_TO_HOST(Ch_Band); - offset += sizeof(Ch_Band); - - ATECtrl->control_band_idx = (UCHAR)Band; - - if (ATEOp->GetTxPower) { - ATEOp->GetTxPower(pAd, Channel, Ch_Band, &EfuseAddr, &Power); - os_msec_delay(30); -#if defined(MT7615) || defined(MT7622) - EfuseAddr = PKTL_TRAN_TO_HOST(EfuseAddr); - Power = PKTL_TRAN_TO_HOST(Power); - memcpy(HqaCmdFrame->Data + 2, &EfuseAddr, 4); - memcpy(HqaCmdFrame->Data + 2 + 4, &Power, 4); -#else -#endif /* defined(MT7615) || defined(MT7622) */ - } else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 10, Ret); - return Ret; -} - -static INT32 HQA_SetCfgOnOff(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Type, Enable, Band; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Type, HqaCmdFrame->Data, 4); - Type = PKTL_TRAN_TO_HOST(Type); - memcpy((PUCHAR)&Enable, HqaCmdFrame->Data + 4, 4); - Enable = PKTL_TRAN_TO_HOST(Enable); - memcpy((PUCHAR)&Band, HqaCmdFrame->Data + 8, 4); - Band = PKTL_TRAN_TO_HOST(Band); - - ATECtrl->control_band_idx = (UCHAR)Band; - - if (ATEOp->SetCfgOnOff) - ATEOp->SetCfgOnOff(pAd, Type, Enable); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetFreqOffset(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 FreqOffset = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if (ATEOp->GetTxFreqOffset) { - ATEOp->GetTxFreqOffset(pAd, &FreqOffset); - FreqOffset = PKTL_TRAN_TO_HOST(FreqOffset); - memcpy(HqaCmdFrame->Data + 2, &FreqOffset, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - } else { - Ret = TM_STATUS_NOTSUPPORT; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - } - - return Ret; -} - -static INT32 HQA_DBDCTXTone(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 BandIdx = 0, Control = 0, AntIndex = 0, ToneType = 0, - ToneFreq = 0, DcOffset_I = 0, DcOffset_Q = 0, Band = 0; - INT32 RF_Power = 0, Digital_Power = 0; - INT32 offset = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* BandIdx:4 Control:4 AntIndex:4 ToneType:4 ToneFreq:4 DcOffset_I:4 DcOffset_Q:4 Band:4 */ - memcpy((PUCHAR)&BandIdx, (PUCHAR)&HqaCmdFrame->Data, sizeof(BandIdx)); - BandIdx = PKTL_TRAN_TO_HOST(BandIdx); - offset += sizeof(BandIdx); - memcpy((PUCHAR)&Control, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Control)); - Control = PKTL_TRAN_TO_HOST(Control); - offset += sizeof(Control); - memcpy((PUCHAR)&AntIndex, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(AntIndex)); - AntIndex = PKTL_TRAN_TO_HOST(AntIndex); - offset += sizeof(AntIndex); - memcpy((PUCHAR)&ToneType, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(ToneType)); - ToneType = PKTL_TRAN_TO_HOST(ToneType); - offset += sizeof(ToneType); - memcpy((PUCHAR)&ToneFreq, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(ToneFreq)); - ToneFreq = PKTL_TRAN_TO_HOST(ToneFreq); - offset += sizeof(ToneFreq); - memcpy((PUCHAR)&DcOffset_I, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(DcOffset_I)); - DcOffset_I = PKTL_TRAN_TO_HOST(DcOffset_I); - offset += sizeof(DcOffset_I); - memcpy((PUCHAR)&DcOffset_Q, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(DcOffset_Q)); - DcOffset_Q = PKTL_TRAN_TO_HOST(DcOffset_Q); - offset += sizeof(DcOffset_Q); - memcpy((PUCHAR)&Band, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Band)); - Band = PKTL_TRAN_TO_HOST(Band); - offset += sizeof(Band); - memcpy((PUCHAR)&RF_Power, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(RF_Power)); - RF_Power = PKTL_TRAN_TO_HOST(RF_Power); - offset += sizeof(RF_Power); - memcpy((PUCHAR)&Digital_Power, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Digital_Power)); - Digital_Power = PKTL_TRAN_TO_HOST(Digital_Power); - offset += sizeof(Digital_Power); - - ATECtrl->control_band_idx = (UCHAR)BandIdx; - - if (ATEOp->SetDBDCTxTonePower) - ATEOp->SetDBDCTxTonePower(pAd, RF_Power, Digital_Power, - AntIndex); - else - Ret = TM_STATUS_NOTSUPPORT; - - if (ATEOp->DBDCTxTone) - ATEOp->DBDCTxTone(pAd, Control, AntIndex, ToneType, ToneFreq, - DcOffset_I, DcOffset_Q, Band); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_DBDCContinuousTX(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Band = 0, Control = 0, AntMask = 0, Phymode = 0, BW = 0; - INT32 Pri_Ch = 0, Rate = 0, Central_Ch = 0, TxfdMode; - INT32 offset = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* Band:4 Control:4 AntIndex:4 Modulation:4 BW:4 Pri_Ch:4 Rate:4 */ - memcpy((PUCHAR)&Band, (PUCHAR)&HqaCmdFrame->Data, sizeof(Band)); - Band = PKTL_TRAN_TO_HOST(Band); - offset += sizeof(Band); - memcpy((PUCHAR)&Control, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Control)); - Control = PKTL_TRAN_TO_HOST(Control); - offset += sizeof(Control); - memcpy((PUCHAR)&AntMask, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(AntMask)); - AntMask = PKTL_TRAN_TO_HOST(AntMask); - offset += sizeof(AntMask); - memcpy((PUCHAR)&Phymode, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Phymode)); - Phymode = PKTL_TRAN_TO_HOST(Phymode); - offset += sizeof(Phymode); - memcpy((PUCHAR)&BW, (PUCHAR)&HqaCmdFrame->Data + offset, sizeof(BW)); - BW = PKTL_TRAN_TO_HOST(BW); - offset += sizeof(BW); - memcpy((PUCHAR)&Pri_Ch, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Pri_Ch)); - Pri_Ch = PKTL_TRAN_TO_HOST(Pri_Ch); - offset += sizeof(Pri_Ch); - memcpy((PUCHAR)&Rate, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Rate)); - Rate = PKTL_TRAN_TO_HOST(Rate); - offset += sizeof(Rate); - memcpy((PUCHAR)&Central_Ch, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Central_Ch)); - Central_Ch = PKTL_TRAN_TO_HOST(Central_Ch); - offset += sizeof(Central_Ch); - memcpy((PUCHAR)&TxfdMode, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(TxfdMode)); - TxfdMode = PKTL_TRAN_TO_HOST(TxfdMode); - offset += sizeof(TxfdMode); - - ATECtrl->control_band_idx = (UCHAR)Band; - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Band = %d, Control = %d, AntIndex = %d, Phymode = %d, BW = %d, CH = %d, Rate = %d, Central_Ch = %d, TxfdMode = %d\n", - __func__, Band, Control, AntMask, Phymode, BW, Pri_Ch, Rate, - Central_Ch, TxfdMode)); - - if (Control) { - if (ATEOp->StartContinousTx) { - TESTMODE_SET_PARAM(ATECtrl, Band, PhyMode, Phymode); - TESTMODE_SET_PARAM(ATECtrl, Band, BW, BW); - TESTMODE_SET_PARAM(ATECtrl, Band, ControlChl, Pri_Ch); - TESTMODE_SET_PARAM(ATECtrl, Band, Channel, Central_Ch); - TESTMODE_SET_PARAM(ATECtrl, Band, Mcs, Rate); - TESTMODE_SET_PARAM(ATECtrl, Band, TxAntennaSel, - AntMask); - ATEOp->StartContinousTx(pAd, AntMask, TxfdMode); - } else - Ret = TM_STATUS_NOTSUPPORT; - } else { - if (ATEOp->StopContinousTx) - ATEOp->StopContinousTx(pAd, TxfdMode); - else - Ret = TM_STATUS_NOTSUPPORT; - } - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetRXFilterPktLen(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Band = 0, Control = 0, RxPktlen = 0; - INT32 offset = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Band, (PUCHAR)&HqaCmdFrame->Data, sizeof(Band)); - Band = PKTL_TRAN_TO_HOST(Band); - offset += sizeof(Band); - memcpy((PUCHAR)&Control, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Control)); - Control = PKTL_TRAN_TO_HOST(Control); - offset += sizeof(Control); - memcpy((PUCHAR)&RxPktlen, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(RxPktlen)); - RxPktlen = PKTL_TRAN_TO_HOST(RxPktlen); - offset += sizeof(RxPktlen); - - ATECtrl->control_band_idx = (UCHAR)Band; - - if (ATEOp->SetRXFilterPktLen) - ATEOp->SetRXFilterPktLen(pAd, Control, RxPktlen); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetTXInfo(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - UINT32 txed_band0 = 0; - UINT32 txed_band1 = 0; - UCHAR *data = HqaCmdFrame->Data + 2; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - txed_band0 = TESTMODE_GET_PARAM(ate_ctrl, 0, TxDoneCount); - txed_band1 = TESTMODE_GET_PARAM(ate_ctrl, 1, TxDoneCount); - txed_band0 = PKTL_TRAN_TO_NET(txed_band0); - txed_band1 = PKTL_TRAN_TO_NET(txed_band1); - NdisMoveMemory(data, (UCHAR *)&txed_band0, sizeof(txed_band0)); - data += sizeof(txed_band0); - NdisMoveMemory(data, (UCHAR *)&txed_band1, sizeof(txed_band1)); - ResponseToQA(HqaCmdFrame, WRQ, - 2 + sizeof(txed_band0) + sizeof(txed_band1), Ret); - return Ret; -} - -static INT32 HQA_GetCfgOnOff(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Type = 0, Band = 0; - UINT32 Result = 0; - INT32 offset = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((PUCHAR)&Type, (PUCHAR)&HqaCmdFrame->Data, sizeof(Type)); - Type = PKTL_TRAN_TO_HOST(Type); - offset += sizeof(Type); - memcpy((PUCHAR)&Band, (PUCHAR)&HqaCmdFrame->Data + offset, - sizeof(Band)); - Band = PKTL_TRAN_TO_HOST(Band); - offset += sizeof(Band); - - ATECtrl->control_band_idx = (UCHAR)Band; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Type:%d Band:%d\n", __func__, Type, Band)); - - if (ATEOp->GetCfgOnOff) { -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - - /*FW not support Get Rate power (Type=2)*/ - if ((IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd) || - IS_MT7663(pAd)) && - Type != 2) -#endif - { - ATEOp->GetCfgOnOff(pAd, Type, &Result); - } - - Result = PKTL_TRAN_TO_HOST(Result); - memcpy(HqaCmdFrame->Data + 2, &Result, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - } else { - Ret = TM_STATUS_NOTSUPPORT; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - } - - return Ret; -} - -static INT32 HQA_SetBufferBin(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; -#if defined(COMPOS_TESTMODE_WIN) - UINT32 buffer_mode_merge = 0; - UCHAR *data = HqaCmdFrame->Data; - - EthGetParamAndShiftBuff(TRUE, sizeof(buffer_mode_merge), &data, - (UCHAR *)&buffer_mode_merge); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("buffer_mode_merge = %d\n", buffer_mode_merge)); - - if (buffer_mode_merge == 0) - pAd->CalFreeMerge = FALSE; - else - pAd->CalFreeMerge = TRUE; - -#else - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s not support this commmand, to disable cal-free merge use DisableCalFree in profile setting\n", - __func__)); -#endif - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_CA53RegRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 ret = 0; - unsigned long offset; - UINT32 value; - - NdisMoveMemory((PUCHAR)&offset, (PUCHAR)&HqaCmdFrame->Data, - sizeof(unsigned long)); - - offset = PKTL_TRAN_TO_HOST(offset); - offset = (unsigned long)ioremap(offset, CA53_GPIO_REMAP_SIZE); - RTMP_SYS_IO_READ32(offset, &value); - iounmap((void *)offset); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: offset = %lx, value = %x\n", __func__, offset, value)); - - value = PKTL_TRAN_TO_NET(value); - NdisMoveMemory(HqaCmdFrame->Data + 2, (UCHAR *)&value, sizeof(value)); - - ResponseToQA(HqaCmdFrame, WRQ, 6, ret); - return ret; -} - -static INT32 HQA_CA53RegWrite(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 ret = 0; - unsigned long offset; - UINT32 value; - - NdisMoveMemory((PUCHAR)&offset, (PUCHAR)&HqaCmdFrame->Data, - sizeof(unsigned long)); - /* Shift 4 bytes only because dll cmd format */ - NdisMoveMemory((PUCHAR)&value, (PUCHAR)&HqaCmdFrame->Data + 4, - sizeof(UINT32)); - - offset = PKTL_TRAN_TO_HOST(offset); - value = PKTL_TRAN_TO_HOST(value); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: offset = %lx, value = %x\n", __func__, offset, value)); - - offset = (unsigned long)ioremap(offset, CA53_GPIO_REMAP_SIZE); - RTMP_SYS_IO_WRITE32(offset, value); - iounmap((void *)offset); - - ResponseToQA(HqaCmdFrame, WRQ, 2, ret); - return ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET3[] = { - /* cmd id start from 0x1300 */ - HQA_MacBbpRegRead, /* 0x1300 */ - HQA_MacBbpRegWrite, /* 0x1301 */ - HQA_MACBbpRegBulkRead, /* 0x1302 */ - HQA_RfRegBulkRead, /* 0x1303 */ - HQA_RfRegBulkWrite, /* 0x1304 */ - HQA_ReadEEPROM, /* 0x1305 */ - HQA_WriteEEPROM, /* 0x1306 */ - HQA_ReadBulkEEPROM, /* 0x1307 */ - HQA_WriteBulkEEPROM, /* 0x1308 */ -#ifdef RTMP_EFUSE_SUPPORT - HQA_CheckEfuseMode, /* 0x1309 */ - HQA_GetFreeEfuseBlock, /* 0x130A */ - HQA_GetEfuseBlockNr, /* 0x130B */ - HQA_WriteEFuseFromBuffer, /* 0x130C */ -#endif /* RTMP_EFUSE_SUPPORT */ - HQA_GetTxPower, /* 0x130D */ - HQA_SetCfgOnOff, /* 0x130E */ - HQA_GetFreqOffset, /* 0x130F */ - HQA_DBDCTXTone, /* 0x1310 */ - HQA_DBDCContinuousTX, /* 0x1311 */ - HQA_SetRXFilterPktLen, /* 0x1312 */ - HQA_GetTXInfo, /* 0x1313 */ - HQA_GetCfgOnOff, /* 0x1314 */ - NULL, - HQA_SetBufferBin, /* 0x1316 */ - HQA_GetFWVersion, /* 0x1317 */ - HQA_CA53RegRead, /* 0x1318 */ - HQA_CA53RegWrite, /* 0x1319 */ -}; - -/* 1 todo not support yet */ -static INT32 HQA_ReadTempReferenceValue(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -VOID HQA_GetThermalValue_CB(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EXT_EVENT_GET_SENSOR_RESULT_T *EventExtCmdResult = - (struct _EXT_EVENT_GET_SENSOR_RESULT_T *)Data; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - EventExtCmdResult->u4SensorResult = - le2cpu32(EventExtCmdResult->u4SensorResult); - ATECtrl->thermal_val = EventExtCmdResult->u4SensorResult; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): value: 0x%x\n", __func__, - EventExtCmdResult->u4SensorResult)); -#if !defined(COMPOS_TESTMODE_WIN) /* 1 todo windows no need RTMP_OS_COMPLETE */ - RTMP_OS_COMPLETE(&ATECtrl->cmd_done); -#endif -} - -static INT32 HQA_GetThermalValue(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* CmdGetThemalSensorResult(pAd, 0); 0: get temperature; 1: get adc */ - MtCmdGetThermalSensorResult( - pAd, 0, - &ATECtrl->thermal_val); /* 0: get temperature; 1: get adc */ - Value = PKTL_TRAN_TO_HOST(ATECtrl->thermal_val); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 6, Ret); - return Ret; -} - -/* 1 todo not support yet */ -static INT32 HQA_SetSideBandOption(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET4[] = { - /* cmd id start from 0x1400 */ - HQA_ReadTempReferenceValue, /* 0x1400 */ - HQA_GetThermalValue, /* 0x1401 */ - HQA_SetSideBandOption, /* 0x1402 */ -}; - -static INT32 hqa_get_fw_info(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - if (ATEOp->GetFWInfo) - Ret = ATEOp->GetFWInfo(pAd, HqaCmdFrame->Data + 2); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, (2 + 1 + 8 + 6 + 15), Ret); - return Ret; -} - -static INT32 HQA_StartContinousTx(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0, WFSel = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - /* TODO Get Correct TxfdMode*/ - UINT32 TxfdMode = 1; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* Modulation:4 BW:4 PRI_CH:4 RATE:4 WFSel:4 */ - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - ATECtrl->PhyMode = (UCHAR)Value; - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - Value = PKTL_TRAN_TO_HOST(Value); - ATECtrl->BW = (UCHAR)Value; - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 8, 4); - Value = PKTL_TRAN_TO_HOST(Value); - ATECtrl->ControlChl = (UCHAR)Value; - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 12, 4); - Value = PKTL_TRAN_TO_HOST(Value); - ATECtrl->Mcs = (UCHAR)Value; - memcpy((PUCHAR)&WFSel, (PUCHAR)&HqaCmdFrame->Data + 16, 4); - WFSel = PKTL_TRAN_TO_HOST(WFSel); - - if (ATEOp->StartContinousTx) - ATEOp->StartContinousTx(pAd, (CHAR)WFSel, TxfdMode); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetSTBC(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((UINT8 *)&Value, (UINT8 *)&HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - ATECtrl->Stbc = (UINT8)Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetShortGI(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - ATECtrl->Sgi = (UCHAR)Value; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetDPD(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0, WFSel; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ON/OFF:4 WF Sel:4 */ - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - memcpy((PUCHAR)&WFSel, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - WFSel = PKTL_TRAN_TO_HOST(WFSel); - - if (ATEOp->SetDPD) - ATEOp->SetDPD(pAd, (CHAR)WFSel, (CHAR)Value); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - - return Ret; -} - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -static VOID HQA_ParseRxRssiCR(PRTMP_ADAPTER pAd, struct _HQA_RX_STAT *HqaRxStat, - INT type, UINT32 value, UINT32 Ch_Band) -{ - UINT32 IBRssi0 = 0, IBRssi1 = 0, WBRssi0 = 0, WBRssi1 = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Value : %02x\n", __func__, value)); - if (IS_MT7615(pAd)) { - IBRssi0 = (value & 0xFF000000) >> 24; - if (IBRssi0 >= 128) - IBRssi0 -= 256; - WBRssi0 = (value & 0x00FF0000) >> 16; - if (WBRssi0 >= 128) - WBRssi0 -= 256; - IBRssi1 = (value & 0x0000FF00) >> 8; - if (IBRssi1 >= 128) - IBRssi1 -= 256; - WBRssi1 = (value & 0x000000FF); - if (WBRssi1 >= 128) - WBRssi1 -= 256; - } else if (IS_MT7622(pAd)) { - IBRssi1 = (value & 0xFF000000) >> 24; - if (IBRssi1 >= 128) - IBRssi1 -= 256; - WBRssi1 = (value & 0x00FF0000) >> 16; - if (WBRssi1 >= 128) - WBRssi1 -= 256; - IBRssi0 = (value & 0x0000FF00) >> 8; - if (IBRssi0 >= 128) - IBRssi0 -= 256; - WBRssi0 = (value & 0x000000FF); - if (WBRssi0 >= 128) - WBRssi0 -= 256; - } - - if (type == HQA_RX_STAT_RSSI) { - IBRssi0 = MtATERSSIOffset(pAd, IBRssi0, 0, Ch_Band); - IBRssi1 = MtATERSSIOffset(pAd, IBRssi1, 1, Ch_Band); - WBRssi0 = MtATERSSIOffset(pAd, WBRssi0, 0, Ch_Band); - WBRssi1 = MtATERSSIOffset(pAd, WBRssi1, 1, Ch_Band); - HqaRxStat->IB_RSSSI0 = PKTL_TRAN_TO_HOST(IBRssi0); - HqaRxStat->WB_RSSSI0 = PKTL_TRAN_TO_HOST(WBRssi0); - HqaRxStat->IB_RSSSI1 = PKTL_TRAN_TO_HOST(IBRssi1); - HqaRxStat->WB_RSSSI1 = PKTL_TRAN_TO_HOST(WBRssi1); - HqaRxStat->Inst_IB_RSSSI[0] = PKTL_TRAN_TO_HOST(IBRssi0); - HqaRxStat->Inst_WB_RSSSI[0] = PKTL_TRAN_TO_HOST(WBRssi0); - HqaRxStat->Inst_IB_RSSSI[1] = PKTL_TRAN_TO_HOST(IBRssi1); - HqaRxStat->Inst_WB_RSSSI[1] = PKTL_TRAN_TO_HOST(WBRssi1); - } else { - IBRssi0 = MtATERSSIOffset(pAd, IBRssi0, 2, Ch_Band); - IBRssi1 = MtATERSSIOffset(pAd, IBRssi1, 3, Ch_Band); - WBRssi0 = MtATERSSIOffset(pAd, WBRssi0, 2, Ch_Band); - WBRssi1 = MtATERSSIOffset(pAd, WBRssi1, 3, Ch_Band); - HqaRxStat->Inst_IB_RSSSI[2] = PKTL_TRAN_TO_HOST(IBRssi0); - HqaRxStat->Inst_WB_RSSSI[2] = PKTL_TRAN_TO_HOST(WBRssi0); - HqaRxStat->Inst_IB_RSSSI[3] = PKTL_TRAN_TO_HOST(IBRssi1); - HqaRxStat->Inst_WB_RSSSI[3] = PKTL_TRAN_TO_HOST(WBRssi1); - } -} -#else -static VOID HQA_ParseRxRssiCR(PRTMP_ADAPTER pAd, struct _HQA_RX_STAT *HqaRxStat, - INT type, UINT32 value, UINT32 Ch_Band) -{ - UINT32 IBRssi0, IBRssi1, WBRssi0, WBRssi1; - - /*[31:24]IBRSSI0 [23:16]WBRSSI0 [15:8]IBRSSI1 [7:0]WBRSSI1*/ - IBRssi0 = (value & 0xFF000000) >> 24; - - if (IBRssi0 > 128) - IBRssi0 -= 256; - - WBRssi0 = (value & 0x00FF0000) >> 16; - - if (WBRssi0 > 128) - WBRssi0 -= 256; - - IBRssi1 = (value & 0x0000FF00) >> 8; - - if (IBRssi1 > 128) - IBRssi1 -= 256; - - WBRssi1 = (value & 0x000000FF); - - if (WBRssi1 > 128) - WBRssi1 -= 256; - - HqaRxStat->IB_RSSSI0 = PKTL_TRAN_TO_HOST(IBRssi0); - HqaRxStat->WB_RSSSI0 = PKTL_TRAN_TO_HOST(WBRssi0); - HqaRxStat->IB_RSSSI1 = PKTL_TRAN_TO_HOST(IBRssi1); - HqaRxStat->WB_RSSSI1 = PKTL_TRAN_TO_HOST(WBRssi1); -} -#endif - -static INT32 HQA_GetRxStatisticsAll(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _HQA_RX_STAT HqaRxStat; - UINT32 rx_driver_cnt = 0; - INT i = 0; - UINT32 Ch_Band_0 = TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, Ch_Band); - UINT32 Ch_Band_1 = TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, Ch_Band); - UCHAR FAGC_Path_0 = - TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, FAGC_Path); - UCHAR FAGC_Path_1 = - TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, FAGC_Path); - - if (IS_ATE_DBDC(pAd)) { - Ch_Band_1 = - TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND1, Ch_Band); - FAGC_Path_1 = - TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND1, FAGC_Path); - } - - memset(&HqaRxStat, 0, sizeof(struct _HQA_RX_STAT)); - - /* MAC COUNT */ -#if defined(MT7615) || defined(MT7637) || defined(MT7622) || defined(P18) || \ - defined(MT7663) - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_MACFCSERRCNT); - ATECtrl->rx_stat.RxMacFCSErrCount = value; - HqaRxStat.mac_rx_fcs_err_cnt = - PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RxMacFCSErrCount); -#else - /* Get latest FCSErr. sync iwpriv & HQA same FCSErr result */ - NICUpdateRawCounters(pAd); - HqaRxStat.mac_rx_fcs_err_cnt = - PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RxMacFCSErrCount); -#endif - value = MtAsicGetRxStat(pAd, HQA_RX_FIFO_FULL_COUNT); - HqaRxStat.rx_fifo_full = PKTL_TRAN_TO_HOST(value); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_MAC_MDRDYCNT); - ATECtrl->rx_stat.RxMacMdrdyCount = value; - HqaRxStat.mac_rx_mdrdy_cnt = - PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RxMacMdrdyCount); -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_MAC_RXLENMISMATCH); - HqaRxStat.mac_rx_len_mismatch = PKTL_TRAN_TO_HOST(value); - - if (IS_ATE_DBDC(pAd)) { - value = MtAsicGetRxStat(pAd, HQA_RX_FIFO_FULL_COUNT_BAND1); - HqaRxStat.rx_fifo_full_band1 = PKTL_TRAN_TO_HOST(value); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_MACFCSERRCNT_BAND1); - ATECtrl->rx_stat.RxMacFCSErrCount_band1 = value; - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_MAC_MDRDYCNT_BAND1); - ATECtrl->rx_stat.RxMacMdrdyCount_band1 = value; - value = MtAsicGetRxStat(pAd, - HQA_RX_STAT_MAC_RXLENMISMATCH_BAND1); - HqaRxStat.mac_rx_len_mismatch_band1 = PKTL_TRAN_TO_HOST(value); - HqaRxStat.mac_rx_fcs_err_cnt_band1 = PKTL_TRAN_TO_HOST( - ATECtrl->rx_stat.RxMacFCSErrCount_band1); - HqaRxStat.mac_rx_mdrdy_cnt_band1 = PKTL_TRAN_TO_HOST( - ATECtrl->rx_stat.RxMacMdrdyCount_band1); - } -#endif -#ifdef MT7622 - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_MAC_FCS_OK_COUNT); - HqaRxStat.mac_rx_fcs_ok_cnt = PKTL_TRAN_TO_HOST(value); -#endif /* MT7622 */ - - /* PHY COUNT */ - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_PHY_FCSERRCNT); - HqaRxStat.phy_rx_fcs_err_cnt_ofdm = PKTL_TRAN_TO_HOST(value >> 16); - HqaRxStat.phy_rx_fcs_err_cnt_cck = PKTL_TRAN_TO_HOST(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_PD); - HqaRxStat.phy_rx_pd_ofdm = PKTL_TRAN_TO_HOST(value >> 16); - HqaRxStat.phy_rx_pd_cck = PKTL_TRAN_TO_HOST(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_CCK_SIG_SFD); - HqaRxStat.phy_rx_sig_err_cck = PKTL_TRAN_TO_HOST(value >> 16); - HqaRxStat.phy_rx_sfd_err_cck = PKTL_TRAN_TO_HOST(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_OFDM_SIG_TAG); - HqaRxStat.phy_rx_sig_err_ofdm = PKTL_TRAN_TO_HOST(value >> 16); - HqaRxStat.phy_rx_tag_err_ofdm = PKTL_TRAN_TO_HOST(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_RSSI); - HQA_ParseRxRssiCR(pAd, &HqaRxStat, HQA_RX_STAT_RSSI, value, Ch_Band_0); -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_RSSI_RX23); - HQA_ParseRxRssiCR(pAd, &HqaRxStat, HQA_RX_STAT_RSSI_RX23, value, - Ch_Band_1); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_ACI_HITL); - HqaRxStat.ACIHitLow = PKTL_TRAN_TO_HOST((value >> 18) & 0x1); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_ACI_HITH); - HqaRxStat.ACIHitHigh = PKTL_TRAN_TO_HOST((value >> 18) & 0x1); -#endif - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_PHY_MDRDYCNT); - HqaRxStat.phy_rx_mdrdy_cnt_ofdm = PKTL_TRAN_TO_HOST(value >> 16); - if (IS_MT7615(pAd)) - HqaRxStat.phy_rx_mdrdy_cnt_cck = - PKTL_TRAN_TO_HOST(value & 0xFFFF); - else if (IS_MT7622(pAd)) { - /* HW issue and SW workaround */ - HqaRxStat.phy_rx_mdrdy_cnt_cck = - PKTL_TRAN_TO_HOST((value & 0xFFFF) / 2); - } - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_PHY_MDRDYCNT_BAND1); - HqaRxStat.phy_rx_mdrdy_cnt_ofdm_band1 = PKTL_TRAN_TO_HOST(value >> 16); - HqaRxStat.phy_rx_mdrdy_cnt_cck_band1 = - PKTL_TRAN_TO_HOST(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_PD_BAND1); - HqaRxStat.phy_rx_pd_ofdm_band1 = PKTL_TRAN_TO_HOST(value >> 16); - HqaRxStat.phy_rx_pd_cck_band1 = PKTL_TRAN_TO_HOST(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_CCK_SIG_SFD_BAND1); - HqaRxStat.phy_rx_sig_err_cck_band1 = PKTL_TRAN_TO_HOST(value >> 16); - HqaRxStat.phy_rx_sfd_err_cck_band1 = PKTL_TRAN_TO_HOST(value & 0xFFFF); - value = MtAsicGetRxStat(pAd, HQA_RX_STAT_OFDM_SIG_TAG_BAND1); - HqaRxStat.phy_rx_sig_err_ofdm_band1 = PKTL_TRAN_TO_HOST(value >> 16); - HqaRxStat.phy_rx_tag_err_ofdm_band1 = PKTL_TRAN_TO_HOST(value & 0xFFFF); - - /* DRIVER COUNT */ - rx_driver_cnt = ATECtrl->rx_stat.RxTotalCnt[0]; - HqaRxStat.DriverRxCount = PKTL_TRAN_TO_HOST(rx_driver_cnt); -#ifdef MT7615 -#ifdef CFG_SUPPORT_MU_MIMO - HqaRxStat.MuPktCount = - PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RxMacMuPktCount); -#endif -#endif -#ifdef MT7615 - rx_driver_cnt = 0; - - if (IS_ATE_DBDC(pAd)) - rx_driver_cnt = ATECtrl->rx_stat.RxTotalCnt[1]; - - HqaRxStat.DriverRxCount1 = PKTL_TRAN_TO_HOST(rx_driver_cnt); -#endif - - /* RXV COUNT */ - for (i = 0; i < 4; i++) { - if (i < 2) - ATECtrl->rx_stat.FAGC_RSSI_IB[i] = MtATERSSIOffset( - pAd, ATECtrl->rx_stat.FAGC_RSSI_IB[i], - FAGC_Path_0, Ch_Band_0); - else - ATECtrl->rx_stat.FAGC_RSSI_IB[i] = MtATERSSIOffset( - pAd, ATECtrl->rx_stat.FAGC_RSSI_IB[i], - FAGC_Path_1, Ch_Band_1); - - HqaRxStat.FAGC_IB_RSSSI[i] = - PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.FAGC_RSSI_IB[i]); - } - - for (i = 0; i < 4; i++) { - if (i < 2) - ATECtrl->rx_stat.FAGC_RSSI_WB[i] = MtATERSSIOffset( - pAd, ATECtrl->rx_stat.FAGC_RSSI_WB[i], - FAGC_Path_0, Ch_Band_0); - else - ATECtrl->rx_stat.FAGC_RSSI_WB[i] = MtATERSSIOffset( - pAd, ATECtrl->rx_stat.FAGC_RSSI_WB[i], - FAGC_Path_1, Ch_Band_1); - - HqaRxStat.FAGC_WB_RSSSI[i] = - PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.FAGC_RSSI_WB[i]); - } - - HqaRxStat.RCPI0 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RCPI[0]); - HqaRxStat.RCPI1 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RCPI[1]); - HqaRxStat.FreqOffsetFromRX = - PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.FreqOffsetFromRx); - HqaRxStat.RSSI0 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RSSI[0]); - HqaRxStat.RSSI1 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RSSI[1]); -#if defined(MT7615) || defined(MT7622) - HqaRxStat.RCPI2 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RCPI[2]); - HqaRxStat.RCPI3 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RCPI[3]); - HqaRxStat.RSSI2 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RSSI[2]); - HqaRxStat.RSSI3 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RSSI[3]); - HqaRxStat.SNR0 = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.SNR[0]); - HqaRxStat.SIG_MCS = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.SIG_MCS); - HqaRxStat.SINR = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.SINR); - HqaRxStat.RXVRSSI = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.RXVRSSI); -#endif /* defined(MT7615) || defined(MT7622) */ - { - for (i = 0; i < 4; i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Report[0]: RCPI[%d]:%x\n", i, - ATECtrl->rx_stat.RCPI[i])); - - for (i = 0; i < 4; i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Report[1]: FAGC_RSSI_IB[%d]:%x\n", i, - ATECtrl->rx_stat.FAGC_RSSI_IB[i])); - - for (i = 0; i < 4; i++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Report[2]: FAGC_RSSI_WB[%d]:%x\n", i, - ATECtrl->rx_stat.FAGC_RSSI_WB[i])); - } - memcpy(HqaCmdFrame->Data + 2, &(HqaRxStat), - sizeof(struct _HQA_RX_STAT)); - ResponseToQA(HqaCmdFrame, WRQ, (2 + sizeof(struct _HQA_RX_STAT)), Ret); - return Ret; -} - -static INT32 HQA_StartContiTxTone(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - - if (ATEOp->StartTxTone) - ATEOp->StartTxTone(pAd, Value); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_StopContiTxTone(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - - /* MtAsicSetTxToneTest(pAd, 0, 0); */ - if (ATEOp->StopTxTone) - ATEOp->StopTxTone(pAd); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_CalibrationTestMode(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Value = 0; - INT32 Ret = 0; - UINT8 Mode = 0; - INT32 ICaplen = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - NdisMoveMemory((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - NdisMoveMemory((PUCHAR)&ICaplen, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - ICaplen = PKTL_TRAN_TO_HOST(ICaplen); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: mode = %X ICapLen= %X\n", __func__, Value, ICaplen)); - - if (Value == 0) { - if (ATECtrl->Mode & ATE_FFT) - ATECtrl->Mode &= ~ATE_FFT; - - ATECtrl->Mode &= ~fATE_IN_RFTEST; - Mode = OPERATION_NORMAL_MODE; - } else if (Value == 1) { - ATECtrl->Mode |= fATE_IN_RFTEST; - Mode = OPERATION_RFTEST_MODE; - } else if (Value == 2) { - ATECtrl->Mode |= fATE_IN_RFTEST; - Mode = OPERATION_ICAP_MODE; - } else if (Value == 3) { - ATECtrl->Mode |= fATE_IN_RFTEST; - ATECtrl->Mode |= fATE_IN_ICAPOVERLAP; - Mode = OPERATION_ICAP_OVERLAP; - } else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Mode = %d error!!!\n", __func__, Value)); - - MtCmdRfTestSwitchMode(pAd, Mode, ICaplen, RF_TEST_DEFAULT_RESP_LEN); -#if !defined(COMPOS_TESTMODE_WIN) - msleep(100); - RcUpdateBandCtrl((struct hdev_ctrl *)pAd->hdev_ctrl); -#endif - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_DoCalibrationTestItem(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - INT32 Ret = 0; - UINT32 item = 0; - UINT32 band_idx = 0; - UCHAR *data = HqaCmdFrame->Data; - - NdisMoveMemory((UCHAR *)&item, data, sizeof(item)); - data += sizeof(item); - item = PKTL_TRAN_TO_HOST(item); - NdisMoveMemory((UCHAR *)&band_idx, data, sizeof(band_idx)); - data += sizeof(band_idx); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - -#if defined(COMPOS_TESTMODE_WIN) - CreateThread(pAd); - pAd->ReCalID = item; - OpenFile(&pAd->hReCalibrationFile, RE_CALIBRATION_FILE, FILE_OPEN_IF, - FILE_APPEND_DATA); - WriteFile("[RECAL DUMP START]\r\n", strlen("[RECAL DUMP START]\r\n"), - pAd->hReCalibrationFile); -#endif - MtCmdDoCalibration(pAd, RE_CALIBRATION, item, band_idx); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, item:%x, band_idx:%x\n", __func__, item, band_idx)); -#if defined(COMPOS_TESTMODE_WIN) - os_msec_delay(1000); - WriteFile("[RECAL DUMP END]\r\n", strlen("[RECAL DUMP END]\r\n"), - pAd->hReCalibrationFile); - CloseFile(pAd->hReCalibrationFile); - /* create log dump finish file */ - OpenFile(&pAd->hReCalibrationFile, RE_CALIBRATION_FINISH_FILE, - FILE_OPEN_IF, FILE_APPEND_DATA); - CloseFile(pAd->hReCalibrationFile); -#endif - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_eFusePhysicalWrite(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_eFusePhysicalRead(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_eFuseLogicalRead(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_eFuseLogicalWrite(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - /* ToDo */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TMRSetting(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; -#if !defined(COMPOS_TESTMODE_WIN) - UCHAR *data = HqaCmdFrame->Data; - UINT32 value = 0, version = 0; - CHAR TMR_Value[8]; - CHAR TMR_HW_Version[8]; - - EthGetParamAndShiftBuff(TRUE, sizeof(value), &data, (UCHAR *)&value); - EthGetParamAndShiftBuff(TRUE, sizeof(version), &data, - (UCHAR *)&version); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TMR setting: %u, TMR version: %u\n", __func__, value, - version)); - - if (version == TMR_HW_VER_100) - version = TMR_VER_1_0; - else if (version == TMR_HW_VER_150) - version = TMR_VER_1_5; - else if (version == TMR_HW_VER_200) - version = TMR_VER_2_0; - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Wrong version %d!!\n", __func__, version)); - return FALSE; - } - - sprintf(TMR_Value, "%d", value); - sprintf(TMR_HW_Version, "%d", version); - setTmrVerProc(pAd, TMR_HW_Version); - setTmrEnableProc(pAd, TMR_Value); -#endif - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetRxSNR(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Value = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Value = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.SNR[0]); - memcpy(HqaCmdFrame->Data + 2, &Value, 4); - Value = PKTL_TRAN_TO_HOST(ATECtrl->rx_stat.SNR[1]); - memcpy(HqaCmdFrame->Data + 6, &Value, 4); - ResponseToQA(HqaCmdFrame, WRQ, 10, Ret); - return Ret; -} - -static INT32 HQA_WriteBufferDone(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); -#if !defined(COMPOS_TESTMODE_WIN) /* 1Todo Set_EepromBufferWriteBack_Proc */ - - switch (Value) { - case E2P_EFUSE_MODE: -#ifdef RF_LOCKDOWN - /* update status of Effuse write back */ - pAd->fgQAEffuseWriteBack = TRUE; -#endif /* RF_LOCKDOWN */ - Set_EepromBufferWriteBack_Proc(pAd, "1"); - break; - - case E2P_FLASH_MODE: - Set_EepromBufferWriteBack_Proc(pAd, "2"); - break; - - case E2P_EEPROM_MODE: - Set_EepromBufferWriteBack_Proc(pAd, "3"); - break; - - case E2P_BIN_MODE: - Set_EepromBufferWriteBack_Proc(pAd, "4"); - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Unknow write back mode(%d)\n", __func__, Value)); - } - -#endif -#ifdef RF_LOCKDOWN - /* update status of Effuse write back */ - pAd->fgQAEffuseWriteBack = FALSE; -#endif /* RF_LOCKDOWN */ - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_FFT(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 Value = 0; - INT32 Ret = 0; - - NdisMoveMemory((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - Value = PKTL_TRAN_TO_HOST(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: %d\n", __func__, Value)); - Ret = ATEOp->SetFFTMode(pAd, Value); - return Ret; -} - -static INT32 HQA_SetTxTonePower(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Value = 0; - INT32 pwr1 = 0; - INT32 pwr2 = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - pwr1 = PKTL_TRAN_TO_HOST(Value); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - pwr2 = PKTL_TRAN_TO_HOST(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: pwr1:%d, pwr2:%d\n", __func__, pwr1, pwr2)); - - if (ATEOp->SetTxTonePower) - ATEOp->SetTxTonePower(pAd, pwr1, pwr2); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetAIFS(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Value = 0; - UINT32 SlotTime = 0; - UINT32 SifsTime = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data, 4); - SlotTime = PKTL_TRAN_TO_HOST(Value); - memcpy((PUCHAR)&Value, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - SifsTime = PKTL_TRAN_TO_HOST(Value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: SlotTime:%d, SifsTime:%d\n", __func__, SlotTime, - SifsTime)); - - if (ATEOp->SetSlotTime) - ATEOp->SetSlotTime(pAd, SlotTime, SifsTime); - else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MPSSetSeqData(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - UINT32 len = 0; - INT32 Ret = 0; - UINT32 i = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 *mps_setting = NULL; - UINT32 band_idx = 0; - UINT32 offset = 0; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length) / sizeof(UINT32) - 1; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u\n", __func__, len)); - - if ((len > 512) || (len == 0)) - goto MPS_SEQ_DATA_RET; - - Ret = os_alloc_mem(pAd, (UCHAR **)&mps_setting, sizeof(UINT32) * (len)); - - if (Ret == NDIS_STATUS_FAILURE) - goto MPS_SEQ_DATA_RET; - - NdisMoveMemory((PUCHAR)&band_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - band_idx = OS_NTOHL(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - for (i = 0; i < len; i++) { - offset = 4 + 4 * i; - - if (offset + 4 > - sizeof(HqaCmdFrame - ->Data)) /* Reserved at least 4 byte availbale data */ - break; - - NdisMoveMemory((PUCHAR)&Value, - (PUCHAR)&HqaCmdFrame->Data + offset, 4); - mps_setting[i] = PKTL_TRAN_TO_HOST(Value); - } - - ATEOp->MPSSetParm(pAd, MPS_SEQDATA, len, mps_setting); - os_free_mem(mps_setting); -MPS_SEQ_DATA_RET: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u, MPS_CNT:%u\n", __func__, len, - ATECtrl->mps_cb.mps_cnt)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MPSSetPayloadLength(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - UINT32 len = 0; - INT32 Ret = 0; - UINT32 i = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 *mps_setting = NULL; - UINT32 band_idx = 0; - UINT32 offset = 0; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length) / 4 - 1; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u\n", __func__, len)); - - if ((len > 1024) || (len == 0)) - goto MPS_PKT_LEN_RET; - - Ret = os_alloc_mem(pAd, (UCHAR **)&mps_setting, sizeof(UINT32) * (len)); - - if (Ret == NDIS_STATUS_FAILURE) - goto MPS_PKT_LEN_RET; - - NdisMoveMemory((PUCHAR)&band_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - for (i = 0; i < len; i++) { - offset = 4 + 4 * i; - - if (offset + 4 > - sizeof(HqaCmdFrame - ->Data)) /* Reserved at least 4 byte availbale data */ - break; - - NdisMoveMemory((PUCHAR)&Value, - (PUCHAR)&HqaCmdFrame->Data + offset, 4); - mps_setting[i] = PKTL_TRAN_TO_HOST(Value); - } - - ATEOp->MPSSetParm(pAd, MPS_PAYLOAD_LEN, len, mps_setting); - os_free_mem(mps_setting); -MPS_PKT_LEN_RET: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u, MPS_CNT:%u\n", __func__, len, - ATECtrl->mps_cb.mps_cnt)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MPSSetPacketCount(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - UINT32 len = 0; - INT32 Ret = 0; - UINT32 i = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 *mps_setting = NULL; - UINT32 band_idx = 0; - UINT32 offset = 0; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length) / 4 - 1; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u\n", __func__, len)); - - if ((len > 1024) || (len == 0)) - goto MPS_PKT_CNT_RET; - - Ret = os_alloc_mem(pAd, (UCHAR **)&mps_setting, sizeof(UINT32) * (len)); - - if (Ret == NDIS_STATUS_FAILURE) - goto MPS_PKT_CNT_RET; - - NdisMoveMemory((PUCHAR)&band_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - for (i = 0; i < len; i++) { - offset = 4 + 4 * i; - - if (offset + 4 > - sizeof(HqaCmdFrame - ->Data)) /* Reserved at least 4 byte availbale data */ - break; - - NdisMoveMemory((PUCHAR)&Value, - (PUCHAR)&HqaCmdFrame->Data + offset, 4); - mps_setting[i] = PKTL_TRAN_TO_HOST(Value); - } - - ATEOp->MPSSetParm(pAd, MPS_TX_COUNT, len, mps_setting); - os_free_mem(mps_setting); -MPS_PKT_CNT_RET: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u, MPS_CNT:%u\n", __func__, len, - ATECtrl->mps_cb.mps_cnt)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MPSSetPowerGain(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - UINT32 len = 0; - INT32 Ret = 0; - UINT32 i = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 *mps_setting = NULL; - UINT32 band_idx = 0; - UINT32 offset = 0; - - len = PKTS_TRAN_TO_NET(HqaCmdFrame->Length) / 4 - 1; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u\n", __func__, len)); - - if ((len > 1024) || (len == 0)) - goto MPS_SET_PWR_RET; - - Ret = os_alloc_mem(pAd, (UCHAR **)&mps_setting, sizeof(UINT32) * (len)); - - if (Ret == NDIS_STATUS_FAILURE) - goto MPS_SET_PWR_RET; - - NdisMoveMemory((PUCHAR)&band_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - for (i = 0; i < len; i++) { - offset = 4 + 4 * i; - - if (offset + 4 > - sizeof(HqaCmdFrame - ->Data)) /* Reserved at least 4 byte availbale data */ - break; - - NdisMoveMemory((PUCHAR)&Value, - (PUCHAR)&HqaCmdFrame->Data + offset, 4); - mps_setting[i] = PKTL_TRAN_TO_HOST(Value); - } - - ATEOp->MPSSetParm(pAd, MPS_PWR_GAIN, len, mps_setting); - os_free_mem(mps_setting); -MPS_SET_PWR_RET: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u, MPS_CNT:%u\n", __func__, len, - ATECtrl->mps_cb.mps_cnt)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MPSStart(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - INT32 Ret = 0; - UINT32 band_idx = 0; - - NdisMoveMemory((PUCHAR)&band_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - Ret = ATEOp->MPSTxStart(pAd); - - if (WRQ) - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - - return Ret; -} - -static INT32 HQA_MPSStop(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 band_idx = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - NdisMoveMemory((PUCHAR)&band_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - Ret = ATEOp->MPSTxStop(pAd); - - if (WRQ) - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - - return Ret; -} - -static INT32 HQA_MPSSetNss(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - UINT32 len = 0; - INT32 Ret = 0; - UINT32 i = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 *mps_setting = NULL; - UINT32 band_idx = 0; - UINT32 offset = 0; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length) / sizeof(UINT32) - 1; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u\n", __func__, len)); - - if ((len > 512) || (len == 0)) - goto out; - - Ret = os_alloc_mem(pAd, (UCHAR **)&mps_setting, sizeof(UINT32) * (len)); - - if (Ret == NDIS_STATUS_FAILURE) - goto out; - - NdisMoveMemory((PUCHAR)&band_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - band_idx = OS_NTOHL(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - for (i = 0; i < len; i++) { - offset = 4 + 4 * i; - - if (offset + 4 > - sizeof(HqaCmdFrame - ->Data)) /* Reserved at least 4 byte availbale data */ - break; - - NdisMoveMemory((PUCHAR)&Value, - (PUCHAR)&HqaCmdFrame->Data + offset, 4); - mps_setting[i] = PKTL_TRAN_TO_HOST(Value); - } - - ATEOp->MPSSetParm(pAd, MPS_NSS, len, mps_setting); - os_free_mem(mps_setting); -out: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u, MPS_CNT:%u\n", __func__, len, - ATECtrl->mps_cb.mps_cnt)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MPSSetPerpacketBW(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Value = 0; - UINT32 len = 0; - INT32 Ret = 0; - UINT32 i = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 *mps_setting = NULL; - UINT32 band_idx = 0; - UINT32 per_pkt_bw = 0; - UINT32 offset = 0; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length) / sizeof(UINT32) - 1; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u\n", __func__, len)); - - if ((len > 512) || (len == 0)) - goto out; - - Ret = os_alloc_mem(pAd, (UCHAR **)&mps_setting, sizeof(UINT32) * (len)); - - if (Ret == NDIS_STATUS_FAILURE) - goto out; - - NdisMoveMemory((PUCHAR)&band_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - band_idx = OS_NTOHL(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - for (i = 0; i < len; i++) { - offset = 4 + 4 * i; - - if (offset + 4 > - sizeof(HqaCmdFrame - ->Data)) /* Reserved at least 4 byte availbale data */ - break; - - NdisMoveMemory((PUCHAR)&Value, - (PUCHAR)&HqaCmdFrame->Data + offset, 4); - per_pkt_bw = PKTL_TRAN_TO_HOST(Value); - - switch (per_pkt_bw) { - case ATE_BAND_WIDTH_20: - per_pkt_bw = BAND_WIDTH_20; - break; - - case ATE_BAND_WIDTH_40: - per_pkt_bw = BAND_WIDTH_40; - break; - - case ATE_BAND_WIDTH_80: - per_pkt_bw = BAND_WIDTH_80; - break; - - case ATE_BAND_WIDTH_10: - per_pkt_bw = BAND_WIDTH_10; - break; - - case ATE_BAND_WIDTH_5: - per_pkt_bw = BAND_WIDTH_5; - break; - - case ATE_BAND_WIDTH_160: - case ATE_BAND_WIDTH_8080: - per_pkt_bw = BAND_WIDTH_160; - break; - - default: - per_pkt_bw = BAND_WIDTH_20; - break; - } - - mps_setting[i] = per_pkt_bw; - } - - ATEOp->MPSSetParm(pAd, MPS_PKT_BW, len, mps_setting); - os_free_mem(mps_setting); -out: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: len:%u, MPS_CNT:%u\n", __func__, len, - ATECtrl->mps_cb.mps_cnt)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_CheckEfuseModeType(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 val = 0; - INT32 Ret = 0; - -#if !defined(COMPOS_TESTMODE_WIN) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: %x\n", __func__, pAd->E2pCtrl.e2pCurMode)); - val = PKTL_TRAN_TO_NET(pAd->E2pCtrl.e2pCurMode); /* Fix me::pAd unify */ -#endif - NdisMoveMemory(HqaCmdFrame->Data + 2, &(val), sizeof(val)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + sizeof(val), Ret); - return Ret; -} - -static INT32 HQA_CheckEfuseNativeModeType(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 val = 0; - INT32 Ret = 0; - -#if !defined(COMPOS_TESTMODE_WIN) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: %x\n", __func__, pAd->E2pAccessMode)); - val = PKTL_TRAN_TO_NET(pAd->E2pAccessMode); /* Fix me::pAd unify */ -#endif - NdisMoveMemory(HqaCmdFrame->Data + 2, &(val), sizeof(val)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + sizeof(val), Ret); - return Ret; -} - -static INT32 HQA_SetBandMode(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UCHAR *data = HqaCmdFrame->Data; - UINT32 band_mode = 0; - UINT32 band_type = 0; - - NdisMoveMemory((UCHAR *)&band_mode, data, sizeof(band_mode)); - data += sizeof(band_mode); - band_mode = PKTL_TRAN_TO_HOST(band_mode); - NdisMoveMemory((UCHAR *)&band_type, data, sizeof(band_type)); - data += sizeof(band_type); - band_type = PKTL_TRAN_TO_HOST(band_type); -#ifndef COMPOS_TESTMODE_WIN - - /* todo: windows do not have Set_WirelessMode_Proc function */ - if (band_mode == ATE_SINGLE_BAND) { - if (band_type == ATE_ABAND_TYPE) - Set_WirelessMode_Proc(pAd, "14"); - else if (band_type == ATE_GBAND_TYPE) - Set_WirelessMode_Proc(pAd, "9"); - else - Ret = -1; - } - -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: band_mode:%x, band_type:%x\n", __func__, band_mode, - band_type)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_GetBandMode(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 band_mode = 0; - UCHAR *data = HqaCmdFrame->Data; - UINT32 band_idx = 0; - UINT32 is_dbdc = IS_ATE_DBDC(pAd); - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&band_idx); - - /* - DLL will query two times per band0/band1 if DBDC chip set. - 0: no this band - 1: 2.4G - 2: 5G - 3. 2.4G+5G - */ - if (is_dbdc) { - band_mode = (band_idx == TESTMODE_BAND0) ? 1 : 2; - } else { - band_mode = 3; /* Always report 2.4+5G*/ - - /* If is_dbdc=0, band_idx should not be 1 so return band_mode=0 */ - if (band_idx == TESTMODE_BAND1) - band_mode = 0; - } - - band_mode = PKTL_TRAN_TO_HOST(band_mode); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: is_dbdc:%x, band_mode:%x, band_idx:%x\n", __func__, - is_dbdc, band_mode, band_idx)); - NdisMoveMemory(HqaCmdFrame->Data + 2, &(band_mode), sizeof(band_mode)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + sizeof(band_mode), Ret); - return Ret; -} - -static INT32 HQA_RDDStartExt(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 rdd_num = 0; - UINT32 rdd_in_sel = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - - NdisMoveMemory((PUCHAR)&rdd_num, data, sizeof(rdd_num)); - rdd_num = PKTL_TRAN_TO_HOST(rdd_num); - data += sizeof(rdd_num); - NdisMoveMemory((PUCHAR)&rdd_in_sel, data, sizeof(rdd_in_sel)); - rdd_in_sel = PKTL_TRAN_TO_HOST(rdd_in_sel); - Ret = ate_ops->onOffRDD(pAd, rdd_num, rdd_in_sel, 1); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: %x\n", __func__, rdd_num)); - return Ret; -} - -static INT32 HQA_RDDStopExt(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 rdd_num = 0; - UINT32 rdd_in_sel = 0; - INT32 Ret = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - - NdisMoveMemory((PUCHAR)&rdd_num, data, sizeof(rdd_num)); - rdd_num = PKTL_TRAN_TO_HOST(rdd_num); - data += sizeof(rdd_num); - NdisMoveMemory((PUCHAR)&rdd_in_sel, data, sizeof(rdd_in_sel)); - rdd_in_sel = PKTL_TRAN_TO_HOST(rdd_in_sel); - Ret = ate_ops->onOffRDD(pAd, rdd_num, rdd_in_sel, 0); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: %x\n", __func__, rdd_num)); - return Ret; -} - -static INT32 HQA_BssInfoUpdate(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 OwnMacIdx = 0, BssIdx = 0; - UCHAR Bssid[MAC_ADDR_LEN]; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - - EthGetParamAndShiftBuff(TRUE, sizeof(OwnMacIdx), &data, - (UCHAR *)&OwnMacIdx); - EthGetParamAndShiftBuff(TRUE, sizeof(BssIdx), &data, (UCHAR *)&BssIdx); - EthGetParamAndShiftBuff(FALSE, sizeof(Bssid), &data, Bssid); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: BssIdx:%d Bssid:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, BssIdx, PRINT_MAC(Bssid))); - Ret = ATEOp->BssInfoUpdate(pAd, OwnMacIdx, BssIdx, Bssid); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_DevInfoUpdate(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Band = 0, OwnMacIdx = 0; - UCHAR Bssid[MAC_ADDR_LEN]; - INT32 Ret = 0; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - - EthGetParamAndShiftBuff(TRUE, sizeof(Band), &data, (UCHAR *)&Band); - EthGetParamAndShiftBuff(TRUE, sizeof(OwnMacIdx), &data, - (UCHAR *)&OwnMacIdx); - EthGetParamAndShiftBuff(FALSE, sizeof(Bssid), &data, Bssid); - ATECtrl->control_band_idx = (UCHAR)Band; - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Band:%d OwnMacIdx:%d Bssid:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, Band, OwnMacIdx, PRINT_MAC(Bssid))); - Ret = ATEOp->DevInfoUpdate(pAd, OwnMacIdx, Bssid); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_LogOnOff(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 band_idx = 0; - UINT32 log_type = 0; - UINT32 log_ctrl = 0; - UINT32 log_size = 200; - UCHAR *data = HqaCmdFrame->Data; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - - NdisMoveMemory((PUCHAR)&band_idx, data, sizeof(band_idx)); - data += sizeof(band_idx); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - NdisMoveMemory((PUCHAR)&log_type, data, sizeof(log_type)); - data += sizeof(log_type); - log_type = PKTL_TRAN_TO_HOST(log_type); - NdisMoveMemory((PUCHAR)&log_ctrl, data, sizeof(log_ctrl)); - data += sizeof(log_ctrl); - log_ctrl = PKTL_TRAN_TO_HOST(log_ctrl); - NdisMoveMemory((PUCHAR)&log_size, data, sizeof(log_size)); - data += sizeof(log_size); - log_size = PKTL_TRAN_TO_HOST(log_size); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - Ret = ATEOp->LogOnOff(pAd, log_type, log_ctrl, log_size); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: band_idx:%x, log_type:%x, log_ctrl:%x, en_log:%x, log_size:%u\n", - __func__, band_idx, log_type, log_ctrl, ATECtrl->en_log, - log_size)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_SetPowerToBufferBin(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 Ret = 0; - UINT32 band_idx = 0; - UINT32 power = 0; - UINT32 channel = 0; - UINT32 antenna_idx = 0; - UINT32 efuse_offset = 0; - UCHAR *data = HqaCmdFrame->Data; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - NdisMoveMemory((PUCHAR)&power, data, sizeof(power)); - data += sizeof(power); - power = PKTL_TRAN_TO_HOST(power); - NdisMoveMemory((PUCHAR)&channel, data, sizeof(channel)); - data += sizeof(channel); - channel = PKTL_TRAN_TO_HOST(channel); - NdisMoveMemory((PUCHAR)&band_idx, data, sizeof(band_idx)); - data += sizeof(band_idx); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ATECtrl->control_band_idx = (UCHAR)band_idx; - - /* for MT7615 */ - efuse_offset = MtATEGetTxPwrGroup(channel, band_idx, antenna_idx); - - if (efuse_offset >= cap->EFUSE_BUFFER_CONTENT_SIZE) - Ret = -1; - else { - pAd->EEPROMImage[efuse_offset] = power; - Ret = 0; - } - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: power:%x, channel:%x, band_idx:%x, offset:%x, antenna_idx:%x\n", - __func__, power, channel, band_idx, efuse_offset, - antenna_idx)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 -HQA_SetFrequencyOffsetToBufferBin(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Not support\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_HIFTestSetStartLoopback(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 len = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _HQA_HIFTestParam tmp, *param; - struct _LOOPBACK_SETTING set; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - NdisMoveMemory((UCHAR *)&tmp, HqaCmdFrame->Data, sizeof(tmp)); - param = PKTLA_TRAN_TO_HOST(len / 4, &tmp); - set.StartLen = param->start_len; - set.StopLen = param->stop_len; - set.RepeatTimes = param->repeat_time; - set.IsDefaultPattern = param->is_def_pattern; - set.BulkOutNumber = param->bulkout_num; - set.BulkInNumber = param->bulkin_num; - set.TxAggNumber = param->txagg_num; - set.RxAggPktLmt = param->rxagg_limit; - set.RxAggLmt = param->rxagg_lm; - set.RxAggTO = param->rxagg_to; - set.RxAggEnable = param->enable_rxagg; - ate_ctrl->verify_mode = ATE_LOOPBACK; - - if (!pAd->LbCtrl.LoopBackRunning) - LoopBack_Start(pAd, &set); - else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: LB is running\n", __func__)); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: start_len:%u, stop_len:%u, repeat:%u, is_default:%u, bulkout_num:%u, bulkin_num:%u, txagg_num:%u, rxagg_limit:%u, rxagg_lm:%u, rxagg_to:%u, enable_rxagg:%u\n", - __func__, param->start_len, param->stop_len, - param->repeat_time, param->is_def_pattern, param->bulkout_num, - param->bulkin_num, param->txagg_num, param->rxagg_limit, - param->rxagg_lm, param->rxagg_to, param->enable_rxagg)); - return Ret; -} - -static INT32 HQA_HIFTestSetStopLoopback(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - - if (pAd->LbCtrl.LoopBackRunning) - LoopBack_Stop(pAd); - - pAd->LbCtrl.DebugMode = FALSE; - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_HIFTestGetStatus(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _LOOPBACK_RESULT tmp, *resp; - - LoopBack_Status(pAd, &tmp); - resp = PKTLA_TRAN_TO_NET(sizeof(tmp) / 4, &tmp); - NdisMoveMemory(HqaCmdFrame->Data + 2, (UCHAR *)resp, sizeof(tmp)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + sizeof(tmp), Ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - return Ret; -} - -static INT32 HQA_HIFTestSetTxData(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 len = 0; - UINT32 tx_len = 0; - UCHAR *raw = NULL; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - NdisMoveMemory(&tx_len, HqaCmdFrame->Data, sizeof(tx_len)); - tx_len = PKTL_TRAN_TO_HOST(tx_len); - raw = HqaCmdFrame->Data + sizeof(UINT32); - - if (pAd->LbCtrl.DebugMode) { - UINT32 j = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: TxExpect Dump(%u): ", __func__, tx_len)); - - for (j = 0; j < tx_len; j++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02x", raw[j])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - - LoopBack_ExpectTx(pAd, tx_len, raw); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%u, tx_len:%u\n", __func__, len, tx_len)); - return Ret; -} - -static INT32 HQA_HIFTestSetRxData(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - UINT32 rx_len = 0; - UCHAR *raw = NULL; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - NdisMoveMemory(&rx_len, HqaCmdFrame->Data, sizeof(rx_len)); - rx_len = PKTL_TRAN_TO_HOST(rx_len); - raw = HqaCmdFrame->Data + sizeof(UINT32); - - if (pAd->LbCtrl.DebugMode) { - UINT32 j = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: RxExpect Dump(%u): ", __func__, rx_len)); - - for (j = 0; j < rx_len; j++) - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02x", raw[j])); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - - LoopBack_ExpectRx(pAd, rx_len, raw); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%u, rx_len:%u\n", __func__, len, rx_len)); - return Ret; -} - -static INT32 HQA_HIFTestGetTxRxData(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UCHAR *out = HqaCmdFrame->Data + 2; - /* TODO:: Need check ated allocate size */ - UINT32 tlen = 0; - UINT32 out_len = 0; - UINT32 tmp = 0; - - /* Tx Data */ - LoopBack_RawData(pAd, &out_len, TRUE, out + sizeof(UINT32)); - tmp = PKTL_TRAN_TO_NET(out_len); - NdisMoveMemory(out, &tmp, sizeof(UINT32)); - tlen += out_len; - out += out_len + sizeof(UINT32); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: tx_out_len:%u\n", __func__, out_len)); - /* Rx Data */ - LoopBack_RawData(pAd, &out_len, FALSE, out + sizeof(UINT32)); - tmp = PKTL_TRAN_TO_NET(out_len); - NdisMoveMemory(out, &tmp, sizeof(UINT32)); - tlen += out_len; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: rx_out_len:%u, total_len:%u\n", __func__, out_len, - tlen)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + tlen + sizeof(UINT32) * 2, Ret); - return Ret; -} - -static INT32 HQA_UDMAAction(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 val = 0; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - NdisMoveMemory(HqaCmdFrame->Data + 2, &(val), sizeof(val)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_WIFIPowerOff(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 val = 0; - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - NdisMoveMemory(HqaCmdFrame->Data + 2, &(val), sizeof(val)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 ToDoFunction(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET5[] = { - /* cmd id start from 0x1500 */ - hqa_get_fw_info, /* 0x1500 */ - HQA_StartContinousTx, /* 0x1501 */ - HQA_SetSTBC, /* 0x1502 */ - HQA_SetShortGI, /* 0x1503 */ - HQA_SetDPD, /* 0x1504 */ - HQA_SetTssiOnOff, /* 0x1505 */ - HQA_GetRxStatisticsAll, /* 0x1506 */ - HQA_StartContiTxTone, /* 0x1507 */ - HQA_StopContiTxTone, /* 0x1508 */ - HQA_CalibrationTestMode, /* 0x1509 */ - HQA_DoCalibrationTestItem, /* 0x150A */ - HQA_eFusePhysicalWrite, /* 0x150B */ - HQA_eFusePhysicalRead, /* 0x150C */ - HQA_eFuseLogicalRead, /* 0x150D */ - HQA_eFuseLogicalWrite, /* 0x150E */ - HQA_TMRSetting, /* 0x150F */ - HQA_GetRxSNR, /* 0x1510 */ - HQA_WriteBufferDone, /* 0x1511 */ - HQA_FFT, /* 0x1512 */ - HQA_SetTxTonePower, /* 0x1513 */ - HQA_GetChipID, /* 0x1514 */ - HQA_MPSSetSeqData, /* 0x1515 */ - HQA_MPSSetPayloadLength, /* 0x1516 */ - HQA_MPSSetPacketCount, /* 0x1517 */ - HQA_MPSSetPowerGain, /* 0x1518 */ - HQA_MPSStart, /* 0x1519 */ - HQA_MPSStop, /* 0x151A */ - ToDoFunction, /* 0x151B */ - ToDoFunction, /* 0x151C */ - ToDoFunction, /* 0x151D */ - ToDoFunction, /* 0x151E */ - ToDoFunction, /* 0x151F */ - ToDoFunction, /* 0x1520 */ - HQA_SetAIFS, /* 0x1521 */ - HQA_CheckEfuseModeType, /* 0x1522 */ - HQA_CheckEfuseNativeModeType, /* 0x1523 */ - HQA_HIFTestSetStartLoopback, /* 0x1524 */ - HQA_HIFTestSetStopLoopback, /* 0x1525 */ - HQA_HIFTestGetStatus, /* 0x1526 */ - HQA_HIFTestSetTxData, /* 0x1527 */ - HQA_HIFTestSetRxData, /* 0x1528 */ - HQA_HIFTestGetTxRxData, /* 0x1529 */ - HQA_UDMAAction, /* 0x152A */ - HQA_WIFIPowerOff, /* 0x152B */ - HQA_SetBandMode, /* 0x152C */ - HQA_GetBandMode, /* 0x152D */ - HQA_RDDStartExt, /* 0x152E */ - HQA_RDDStopExt, /* 0x152F */ - ToDoFunction, /* 0x1530 */ - HQA_BssInfoUpdate, /* 0x1531 */ - HQA_DevInfoUpdate, /* 0x1532 */ - HQA_LogOnOff, /* 0x1533 */ - HQA_SetPowerToBufferBin, /* 0x1534 */ - HQA_SetFrequencyOffsetToBufferBin, /* 0x1535 */ - HQA_MPSSetNss, /* 0x1536 */ - HQA_MPSSetPerpacketBW, /* 0x1537 */ -}; - -#ifdef TXBF_SUPPORT -#if defined(MT7615) || defined(MT7637) || defined(MT7622) -VOID HQA_BF_INFO_CB(RTMP_ADAPTER *pAd, unsigned char *data, UINT32 len) -{ - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _EXT_EVENT_BF_STATUS_T *bf_info = - (struct _EXT_EVENT_BF_STATUS_T *)data; - struct _EXT_EVENT_IBF_STATUS_T *ibf_info = - (struct _EXT_EVENT_IBF_STATUS_T *)data; - UINT32 status = 0; - UINT32 data_len = 0; - UCHAR *bf_data = bf_info->aucBuffer; - - if (!(ate_ctrl->Mode & fATE_IN_BF)) - return; - - ate_ctrl->txbf_info_len = 0; - os_alloc_mem(pAd, (UCHAR **)&ate_ctrl->txbf_info, sizeof(UCHAR) * len); - - if (!ate_ctrl->txbf_info) { - status = NDIS_STATUS_RESOURCES; - goto err0; - } - - os_zero_mem(ate_ctrl->txbf_info, sizeof(UCHAR) * len); - ate_ctrl->txbf_info_len = len; - - switch (bf_info->ucBfDataFormatID) { - case BF_PFMU_TAG: - if (bf_info->fgBFer) - data_len = sizeof(PFMU_PROFILE_TAG1) + - sizeof(PFMU_PROFILE_TAG2); - else - data_len = sizeof(PFMU_PROFILE_TAG1); - - NdisMoveMemory(ate_ctrl->txbf_info, bf_data, data_len); - ate_ctrl->txbf_info_len = data_len; - break; - - case BF_PFMU_DATA: - NdisMoveMemory(ate_ctrl->txbf_info, bf_data, sizeof(PFMU_DATA)); - data_len = sizeof(PFMU_DATA); - ate_ctrl->txbf_info_len = data_len; - break; - - case BF_CAL_PHASE: - ate_ctrl->iBFCalStatus = ibf_info->ucStatus; - break; - - case BF_QD_DATA: - NdisMoveMemory(ate_ctrl->txbf_info, bf_data, sizeof(BF_QD)); - data_len = sizeof(BF_QD); - ate_ctrl->txbf_info_len = data_len; - break; - - default: - break; - } - -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(%x)\n", __func__, status)); - RTMP_OS_COMPLETE(&ate_ctrl->cmd_done); -} -#else -VOID HQA_BF_INFO_CB(RTMP_ADAPTER *pAd, unsigned char *data, UINT32 len) -{ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s not supported yet\n", __func__)); -} -#endif /* MT7615 */ - -static INT32 HQA_TxBfProfileTagInValid(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 invalid = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto BF_PROFILE_TAG_INVALID_FAIL; - } - - NdisMoveMemory((PUCHAR)&invalid, (PUCHAR)&HqaCmdFrame->Data, - sizeof(invalid)); - invalid = PKTL_TRAN_TO_HOST(invalid); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%u", invalid); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_InValid(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%u, str:%s\n", __func__, invalid, cmd)); - os_free_mem(cmd); -BF_PROFILE_TAG_INVALID_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagPfmuIdx(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 pfmuidx = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto BF_PROFILE_TAG_PFMU_FAIL; - } - - NdisMoveMemory((PUCHAR)&pfmuidx, (PUCHAR)&HqaCmdFrame->Data, - sizeof(pfmuidx)); - pfmuidx = PKTL_TRAN_TO_HOST(pfmuidx); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%u", pfmuidx); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_PfmuIdx(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%u, str:%s\n", __func__, pfmuidx, cmd)); - os_free_mem(cmd); -BF_PROFILE_TAG_PFMU_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagBfType(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 bftype = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto BF_PROFILE_TAG_BFTYPE_FAIL; - } - - NdisMoveMemory((PUCHAR)&bftype, (PUCHAR)&HqaCmdFrame->Data, 4); - bftype = PKTL_TRAN_TO_HOST(bftype); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%u", bftype); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_BfType(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%u, str:%s\n", __func__, bftype, cmd)); - os_free_mem(cmd); -BF_PROFILE_TAG_BFTYPE_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagBw(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 tag_bw = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto BF_PROFILE_TAG_BW_FAIL; - } - - NdisMoveMemory((PUCHAR)&tag_bw, (PUCHAR)&HqaCmdFrame->Data, 4); - tag_bw = PKTL_TRAN_TO_HOST(tag_bw); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%u", tag_bw); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_DBW(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%u, str:%s\n", __func__, tag_bw, cmd)); - os_free_mem(cmd); -BF_PROFILE_TAG_BW_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagSuMu(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 su_mu = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto BF_PROFILE_TAG_SUMU_FAIL; - } - - NdisMoveMemory((PUCHAR)&su_mu, (PUCHAR)&HqaCmdFrame->Data, 4); - su_mu = PKTL_TRAN_TO_HOST(su_mu); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%u", su_mu); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_SuMu(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%u, str:%s\n", __func__, su_mu, cmd)); - os_free_mem(cmd); -BF_PROFILE_TAG_SUMU_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagMemAlloc(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - struct _HQA_BF_TAG_ALLOC tmp, *layout = NULL; - RTMP_STRING *cmd = NULL; - - if (!HqaCmdFrame) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: HqaCmdFrame is NULL\n", __func__)); - Ret = NDIS_STATUS_INVALID_DATA; - return Ret; - } - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_MEMALLOC_FAIL; - } - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - - if (len > sizeof(tmp)) { - Ret = NDIS_STATUS_INVALID_DATA; - goto HQA_TAG_MEMALLOC_FAIL; - } - - NdisMoveMemory((PUCHAR)&tmp, (PUCHAR)&HqaCmdFrame->Data, len); - layout = PKTLA_TRAN_TO_HOST(len / 4, &tmp); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", - layout->col_idx0, layout->row_idx0, layout->col_idx1, - layout->row_idx1, layout->col_idx2, layout->row_idx2, - layout->col_idx3, layout->row_idx3); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_Mem(pAd, cmd); -#endif -HQA_TAG_MEMALLOC_FAIL: - - if (cmd) - os_free_mem(cmd); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - if (layout) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: col0/row0:%x/%x, col1/row1:%x/%x, col2/row2:%x/%x, col3/row3:%x/%x\n", - __func__, layout->col_idx0, layout->row_idx0, - layout->col_idx1, layout->row_idx1, layout->col_idx2, - layout->row_idx2, layout->col_idx3, layout->row_idx3)); - return Ret; -} - -static INT32 HQA_TxBfProfileTagMatrix(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - struct _HQA_BF_TAG_MATRIX tmp, *matrix = NULL; - RTMP_STRING *cmd; - - if (!HqaCmdFrame) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: HqaCmdFrame is NULL\n", __func__)); - Ret = NDIS_STATUS_INVALID_DATA; - return Ret; - } - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_MATRIX_FAIL; - } - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - NdisMoveMemory((PUCHAR)&tmp, (PUCHAR)&HqaCmdFrame->Data, len); - matrix = PKTLA_TRAN_TO_HOST(len / 4, &tmp); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x:%02x", matrix->nrow, - matrix->ncol, matrix->ngroup, matrix->LM, matrix->code_book, - matrix->htc_exist); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_Matrix(pAd, cmd); -#endif - os_free_mem(cmd); -HQA_TAG_MATRIX_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - if (matrix) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: nrow:%x, ncol:%x, ngroup:%x, LM:%x, code_book:%x, htc:%x\n", - __func__, matrix->nrow, matrix->ncol, matrix->ngroup, - matrix->LM, matrix->code_book, matrix->htc_exist)); - return Ret; -} - -static INT32 HQA_TxBfProfileTagSnr(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - struct _HQA_BF_TAG_SNR tmp, *snr = NULL; - RTMP_STRING *cmd; - - if (!HqaCmdFrame) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: HqaCmdFrame is NULL\n", __func__)); - Ret = NDIS_STATUS_INVALID_DATA; - return Ret; - } - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_SNR_FAIL; - } - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - NdisMoveMemory((PUCHAR)&tmp, (PUCHAR)&HqaCmdFrame->Data, len); - snr = PKTLA_TRAN_TO_HOST(len / 4, &tmp); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%02x:%02x:%02x:%02x", snr->snr_sts0, snr->snr_sts1, - snr->snr_sts2, snr->snr_sts3); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_SNR(pAd, cmd); -#endif - os_free_mem(cmd); -HQA_TAG_SNR_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - if (snr) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: snr_sts0:%x, snr_sts1:%x, snr_sts2:%x, snr_sts3:%x,\n", - __func__, snr->snr_sts0, snr->snr_sts1, snr->snr_sts2, - snr->snr_sts3)); - return Ret; -} - -static INT32 HQA_TxBfProfileTagSmtAnt(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 smt_ant = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_SMTANT_FAIL; - } - - NdisMoveMemory((PUCHAR)&smt_ant, (PUCHAR)&HqaCmdFrame->Data, 4); - /* - * DBDC mode: - * If Use Band 0, set [11:6]=0x0, set [5:0] as Ant cfg. - * If Use Band 1, set [11:6] as Ant cfg, set [5:0] = 0x0. - * Non-DBDC mode: - * Set [11:0] as Ant cfg. - */ - smt_ant = PKTL_TRAN_TO_HOST(smt_ant); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", smt_ant); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_SmartAnt(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x, str:%s\n", __func__, smt_ant, cmd)); - os_free_mem(cmd); -HQA_TAG_SMTANT_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagSeIdx(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 se_idx = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_SEIDX_FAIL; - } - - NdisMoveMemory((PUCHAR)&se_idx, (PUCHAR)&HqaCmdFrame->Data, 4); - se_idx = PKTL_TRAN_TO_HOST(se_idx); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", se_idx); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_SeIdx(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x, str:%s\n", __func__, se_idx, cmd)); - os_free_mem(cmd); -HQA_TAG_SEIDX_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagRmsdThrd(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 rmsd_thrd = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_RMSDTHRD_FAIL; - } - - NdisMoveMemory((PUCHAR)&rmsd_thrd, (PUCHAR)&HqaCmdFrame->Data, 4); - rmsd_thrd = PKTL_TRAN_TO_HOST(rmsd_thrd); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", rmsd_thrd); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_RmsdThrd(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x, cmd:%s\n", __func__, rmsd_thrd, cmd)); - os_free_mem(cmd); -HQA_TAG_RMSDTHRD_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagMcsThrd(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - struct _HQA_BF_TAG_MCS_THRD tmp, *mcs_thrd = NULL; - RTMP_STRING *cmd; - - if (!HqaCmdFrame) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: HqaCmdFrame is NULL\n", __func__)); - Ret = NDIS_STATUS_INVALID_DATA; - return Ret; - } - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_MCSTHRD_FAIL; - } - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - NdisMoveMemory((PUCHAR)&tmp, (PUCHAR)&HqaCmdFrame->Data, len); - mcs_thrd = PKTLA_TRAN_TO_HOST(len / 4, &tmp); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x:%02x", mcs_thrd->mcs_lss0, - mcs_thrd->mcs_sss0, mcs_thrd->mcs_lss1, mcs_thrd->mcs_sss1, - mcs_thrd->mcs_lss2, mcs_thrd->mcs_sss2); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_McsThrd(pAd, cmd); -#endif - os_free_mem(cmd); -HQA_TAG_MCSTHRD_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - if (mcs_thrd) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%x, mcs_lss0:%x, mcs_sss0:%x, mcs_lss1:%x, mcs_sss1:%x, mcs_lss2:%x, mcs_sss2:%x\n", - __func__, len, mcs_thrd->mcs_lss0, mcs_thrd->mcs_sss0, - mcs_thrd->mcs_lss1, mcs_thrd->mcs_sss1, - mcs_thrd->mcs_lss2, mcs_thrd->mcs_sss2)); - return Ret; -} - -static INT32 HQA_TxBfProfileTagTimeOut(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 bf_tout = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_TOUT_FAIL; - } - - NdisMoveMemory((PUCHAR)&bf_tout, (PUCHAR)&HqaCmdFrame->Data, 4); - bf_tout = PKTL_TRAN_TO_HOST(bf_tout); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", bf_tout); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_TimeOut(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x, str:%s\n", __func__, bf_tout, cmd)); - os_free_mem(cmd); -HQA_TAG_TOUT_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagDesiredBw(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 desire_bw = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_DBW_FAIL; - } - - NdisMoveMemory((PUCHAR)&desire_bw, (PUCHAR)&HqaCmdFrame->Data, 4); - desire_bw = PKTL_TRAN_TO_HOST(desire_bw); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", desire_bw); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_DesiredBW(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x, str:%s\n", __func__, desire_bw, cmd)); - os_free_mem(cmd); -HQA_TAG_DBW_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagDesiredNc(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 desire_nc = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_DNC_FAIL; - } - - NdisMoveMemory((PUCHAR)&desire_nc, (PUCHAR)&HqaCmdFrame->Data, 4); - desire_nc = PKTL_TRAN_TO_HOST(desire_nc); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", desire_nc); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_DesiredNc(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x, str:%s\n", __func__, desire_nc, cmd)); - os_free_mem(cmd); -HQA_TAG_DNC_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagDesiredNr(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 desire_nr = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_DNR_FAIL; - } - - NdisMoveMemory((PUCHAR)&desire_nr, (PUCHAR)&HqaCmdFrame->Data, 4); - desire_nr = PKTL_TRAN_TO_HOST(desire_nr); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", desire_nr); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTag_DesiredNr(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x, str:%s\n", __func__, desire_nr, cmd)); - os_free_mem(cmd); -HQA_TAG_DNR_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagWrite(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 idx = 0; /* WLAN_IDX */ - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_WRITE_FAIL; - } - - NdisMoveMemory((PUCHAR)&idx, (PUCHAR)&HqaCmdFrame->Data, 4); - idx = PKTL_TRAN_TO_HOST(idx); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", idx); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileTagWrite(pAd, cmd); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x, str:%s\n", __func__, idx, cmd)); - os_free_mem(cmd); -HQA_TAG_WRITE_FAIL: - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TxBfProfileTagRead(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 idx = 0, isBFer = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - UCHAR *out = NULL; - RTMP_STRING *cmd; - - ate_ctrl->txbf_info = NULL; - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_READ_FAIL; - } - - ate_ctrl->Mode |= fATE_IN_BF; - NdisMoveMemory((PUCHAR)&idx, (PUCHAR)&HqaCmdFrame->Data, 4); - idx = PKTL_TRAN_TO_HOST(idx); - NdisMoveMemory((PUCHAR)&isBFer, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - isBFer = PKTL_TRAN_TO_HOST(isBFer); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%02x:%02x", idx, isBFer); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x %x, str:%s\n", __func__, idx, isBFer, cmd)); - /* #ifdef MT7615 */ -#if defined(MT7615) || defined(MT7637) || defined(MT7622) - Set_TxBfProfileTagRead(pAd, cmd); - RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&ate_ctrl->cmd_done, - ate_ctrl->cmd_expire); -#endif - - if (!ate_ctrl->txbf_info) - goto HQA_TAG_READ_FAIL; - - out = PKTLA_TRAN_TO_NET(ate_ctrl->txbf_info_len / 4, - ate_ctrl->txbf_info); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: val:%x %x, str:%s\n", __func__, idx, isBFer, cmd)); - NdisMoveMemory((PUCHAR)&HqaCmdFrame->Data + 2, (PUCHAR)out, - ate_ctrl->txbf_info_len); - ate_ctrl->Mode &= ~fATE_IN_BF; - os_free_mem(ate_ctrl->txbf_info); - ate_ctrl->txbf_info = NULL; -HQA_TAG_READ_FAIL: - - if (cmd) - os_free_mem(cmd); - - ResponseToQA(HqaCmdFrame, WRQ, 2 + ate_ctrl->txbf_info_len, Ret); - return Ret; -} - -static INT32 HQA_StaRecCmmUpdate(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - struct _HQA_BF_STA_CMM_REC tmp, *rec = NULL; - RTMP_STRING *cmd; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_PFMU_INFO *pfmu_info = NULL; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto err0; - } - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - - if (len > sizeof(tmp)) { - Ret = NDIS_STATUS_INVALID_DATA; - goto err0; - } - - NdisMoveMemory((PUCHAR)&tmp, (PUCHAR)&HqaCmdFrame->Data, len); - rec = PKTLA_TRAN_TO_HOST((len - MAC_ADDR_LEN) / 4, &tmp); - - if (rec->wlan_idx > ATE_BFMU_NUM) { - Ret = NDIS_STATUS_INVALID_DATA; - goto err0; - } - - pfmu_info = &ate_ctrl->pfmu_info[rec->wlan_idx - 1]; - pfmu_info->wcid = rec->wlan_idx; - pfmu_info->bss_idx = rec->bss_idx; - NdisMoveMemory(pfmu_info->addr, rec->mac, MAC_ADDR_LEN); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", - rec->wlan_idx, rec->bss_idx, rec->aid, PRINT_MAC(rec->mac)); -#if defined(MT7615) || defined(MT7622) - Set_StaRecCmmUpdate(pAd, cmd); -#endif -err0: - - if (cmd) - os_free_mem(cmd); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - if (rec) - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wlan_idx:%x, bss_idx:%x, aid:%x, mac:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, rec->wlan_idx, rec->bss_idx, rec->aid, - PRINT_MAC(rec->mac))); - - return Ret; -} - -static INT32 HQA_StaRecBfUpdate(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - struct _HQA_BF_STA_REC tmp, *rec = NULL; - RTMP_STRING *cmd; - - if (!HqaCmdFrame) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: HqaCmdFrame is NULL\n", __func__)); - Ret = NDIS_STATUS_INVALID_DATA; - return Ret; - } - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_STAREC_BF_UPDATE_FAIL; - } - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - - if (len > sizeof(tmp)) { - Ret = NDIS_STATUS_INVALID_DATA; - goto HQA_STAREC_BF_UPDATE_FAIL; - } - - NdisMoveMemory((PUCHAR)&tmp, (PUCHAR)&HqaCmdFrame->Data, len); - rec = PKTLA_TRAN_TO_HOST((len) / 4, &tmp); - PKTLA_DUMP(DBG_LVL_OFF, sizeof(*rec) / 4, rec); /* Del after debug */ - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, - "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", - rec->wlan_idx, rec->bss_idx, rec->PfmuId, rec->su_mu, - rec->etxbf_cap, rec->ndpa_rate, rec->ndp_rate, - rec->report_poll_rate, rec->tx_mode, rec->nc, rec->nr, rec->cbw, - rec->spe_idx, rec->tot_mem_req, rec->mem_req_20m, rec->mem_row0, - rec->mem_col0, rec->mem_row1, rec->mem_col1, rec->mem_row2, - rec->mem_col2, rec->mem_row3, rec->mem_col3); -#if defined(MT7615) || defined(MT7622) - Set_StaRecBfUpdate(pAd, cmd); -#endif -HQA_STAREC_BF_UPDATE_FAIL: - - if (cmd) - os_free_mem(cmd); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - if (rec) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, rec->wlan_idx, rec->bss_idx, rec->PfmuId, - rec->su_mu, rec->etxbf_cap, rec->ndpa_rate, - rec->ndp_rate, rec->report_poll_rate, rec->tx_mode, - rec->nc, rec->nr, rec->cbw, rec->tot_mem_req, - rec->mem_req_20m, rec->mem_row0, rec->mem_col0, - rec->mem_row1, rec->mem_col1, rec->mem_row2, - rec->mem_col2, rec->mem_row3, rec->mem_col3)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wlan_idx:%x, bss_idx:%x\n", __func__, - rec->wlan_idx, rec->bss_idx)); - } - return Ret; -} - -static INT32 HQA_BFProfileDataRead(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 idx = 0, fgBFer = 0, subcarrIdx = 0, subcarr_start = 0, - subcarr_end = 0; - UINT32 offset = 0; - UINT32 NumOfsub = 0; - UCHAR *SubIdx = NULL; - UCHAR *out = NULL; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - RTMP_STRING *cmd; - INT debug_lvl = DebugLevel; - - ate_ctrl->txbf_info = NULL; - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto BF_PROFILE_DATA_READ_FAIL; - } - - ate_ctrl->Mode |= fATE_IN_BF; - NdisMoveMemory((PUCHAR)&idx, (PUCHAR)&HqaCmdFrame->Data, 4); - idx = PKTL_TRAN_TO_HOST(idx); - NdisMoveMemory((PUCHAR)&fgBFer, (PUCHAR)&HqaCmdFrame->Data + 4, 4); - fgBFer = PKTL_TRAN_TO_HOST(fgBFer); - NdisMoveMemory((PUCHAR)&subcarr_start, - (PUCHAR)&HqaCmdFrame->Data + 4 + 4, 4); - subcarr_start = PKTL_TRAN_TO_HOST(subcarr_start); - NdisMoveMemory((PUCHAR)&subcarr_end, - (PUCHAR)&HqaCmdFrame->Data + 4 + 4 + 4, 4); - subcarr_end = PKTL_TRAN_TO_HOST(subcarr_end); - NumOfsub = subcarr_end - subcarr_start + 1; - NumOfsub = PKTL_TRAN_TO_HOST(NumOfsub); - NdisMoveMemory((PUCHAR)&HqaCmdFrame->Data + 2, (PUCHAR)&NumOfsub, - sizeof(NumOfsub)); - offset += sizeof(NumOfsub); - DebugLevel = DBG_LVL_OFF; - - for (subcarrIdx = subcarr_start; subcarrIdx <= subcarr_end; - subcarrIdx++) { - ate_ctrl->txbf_info = NULL; - SubIdx = (UCHAR *)&subcarrIdx; - memset(cmd, 0x00, HQA_BF_STR_SIZE); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: idx:%02x fgBFer:%02x Sub_H:%02x Sub_L:%02x subidx:%d\n", - __func__, idx, fgBFer, SubIdx[1], SubIdx[0], - subcarrIdx)); - sprintf(cmd, "%02x:%02x:%02x:%02x", idx, fgBFer, SubIdx[1], - SubIdx[0]); - /* #ifdef MT7615 */ -#if defined(MT7615) || defined(MT7637) || defined(MT7622) - Set_TxBfProfileDataRead(pAd, cmd); - RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&ate_ctrl->cmd_done, - ate_ctrl->cmd_expire); -#endif - - if (!ate_ctrl->txbf_info) - goto BF_PROFILE_DATA_READ_FAIL; - - out = PKTLA_TRAN_TO_NET(ate_ctrl->txbf_info_len / 4, - ate_ctrl->txbf_info); - NdisMoveMemory((PUCHAR)&HqaCmdFrame->Data + 2 + offset, - (PUCHAR)out, ate_ctrl->txbf_info_len); - offset += ate_ctrl->txbf_info_len; - os_free_mem(ate_ctrl->txbf_info); - ate_ctrl->txbf_info = NULL; - } - - ate_ctrl->Mode &= ~fATE_IN_BF; -BF_PROFILE_DATA_READ_FAIL: - - if (cmd) - os_free_mem(cmd); - - ResponseToQA(HqaCmdFrame, WRQ, 2 + offset, Ret); - DebugLevel = debug_lvl; - return Ret; -} - -static INT32 HQA_BFProfileDataWrite(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - INT debug_lvl = DebugLevel; - struct _HQA_BF_STA_PROFILE tmp, *profile; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto BF_PROFILE_DATA_WRITE_FAIL; - } - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - if (len > sizeof(struct _HQA_BF_STA_PROFILE)) { - len = sizeof(struct _HQA_BF_STA_PROFILE); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: command length is wrong\n", __func__)); - } - NdisMoveMemory((PUCHAR)&tmp, (PUCHAR)&HqaCmdFrame->Data, len); - profile = PKTLA_TRAN_TO_HOST((len) / sizeof(UINT32), &tmp); - DebugLevel = DBG_LVL_OFF; - PKTLA_DUMP(DBG_LVL_INFO, sizeof(tmp) / sizeof(UINT32), - &tmp); /* Del after debug */ - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%02x:", profile->pfmuid); - sprintf(cmd + strlen(cmd), "%03x:", profile->subcarrier); - sprintf(cmd + strlen(cmd), "%03x:", profile->phi11); - sprintf(cmd + strlen(cmd), "%02x:", profile->psi21); - sprintf(cmd + strlen(cmd), "%03x:", profile->phi21); - sprintf(cmd + strlen(cmd), "%02x:", profile->psi31); - sprintf(cmd + strlen(cmd), "%03x:", profile->phi31); - sprintf(cmd + strlen(cmd), "%02x:", profile->psi41); - sprintf(cmd + strlen(cmd), "%03x:", profile->phi22); - sprintf(cmd + strlen(cmd), "%02x:", profile->psi32); - sprintf(cmd + strlen(cmd), "%03x:", profile->phi32); - sprintf(cmd + strlen(cmd), "%02x:", profile->psi42); - sprintf(cmd + strlen(cmd), "%03x:", profile->phi33); - sprintf(cmd + strlen(cmd), "%02x:", profile->psi43); - sprintf(cmd + strlen(cmd), "%02x:", profile->snr00); - sprintf(cmd + strlen(cmd), "%02x:", profile->snr01); - sprintf(cmd + strlen(cmd), "%02x:", profile->snr02); - sprintf(cmd + strlen(cmd), "%02x", profile->snr03); -#if defined(MT7615) || defined(MT7622) - Set_TxBfProfileDataWrite(pAd, cmd); -#endif - os_free_mem(cmd); -BF_PROFILE_DATA_WRITE_FAIL: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - DebugLevel = debug_lvl; - return Ret; -} - -static INT32 HQA_BFQdRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - UCHAR *out = NULL; - RTMP_STRING *cmd; - INT32 subcarrier_idx = 0; - - ate_ctrl->txbf_info = NULL; - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_BF_QD_READ_FAIL; - } - - ate_ctrl->Mode |= fATE_IN_BF; - - NdisMoveMemory((PUCHAR)&subcarrier_idx, HqaCmdFrame->Data, - sizeof(subcarrier_idx)); - subcarrier_idx = PKTL_TRAN_TO_HOST(subcarrier_idx); - - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", subcarrier_idx); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val:%u, str:%s\n", __func__, subcarrier_idx, cmd)); -#if defined(MT7615) || defined(MT7622) - Set_TxBfQdRead(pAd, cmd); - RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&ate_ctrl->cmd_done, - ate_ctrl->cmd_expire); -#endif - if (!ate_ctrl->txbf_info) - goto HQA_BF_QD_READ_FAIL; - - out = (PUCHAR)ate_ctrl->txbf_info; - - PKTLA_DUMP(DBG_LVL_INFO, 14, out); - NdisMoveMemory((PUCHAR)&HqaCmdFrame->Data + 2, (PUCHAR)out, - ate_ctrl->txbf_info_len); - ate_ctrl->Mode &= ~fATE_IN_BF; - os_free_mem(ate_ctrl->txbf_info); - ate_ctrl->txbf_info = NULL; -HQA_BF_QD_READ_FAIL: - if (cmd) - os_free_mem(cmd); - - ResponseToQA(HqaCmdFrame, WRQ, 2 + ate_ctrl->txbf_info_len, Ret); - return Ret; -} - -static INT32 HQA_BFSounding(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - struct _HQA_BF_SOUNDING tmp, *param; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto HQA_BFSOUNDING_FAIL; - } - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - - if (len > sizeof(tmp)) { - Ret = NDIS_STATUS_INVALID_DATA; - goto HQA_BFSOUNDING_FAIL; - } - - NdisMoveMemory((PUCHAR)&tmp, (PUCHAR)&HqaCmdFrame->Data, len); - param = PKTLA_TRAN_TO_HOST((len) / sizeof(UINT32), &tmp); - PKTLA_DUMP(DBG_LVL_OFF, sizeof(*param) / sizeof(UINT32), - param); /* Del after debug */ - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x:%02x:%02x", param->su_mu, - param->mu_num, param->snd_interval, param->wlan_id0, - param->wlan_id1, param->wlan_id2, param->wlan_id3); -#if defined(MT7615) || defined(MT7622) - MtATESetMacTxRx(pAd, ASIC_MAC_TX, TRUE, param->band_idx); - Set_Trigger_Sounding_Proc(pAd, cmd); -#endif -HQA_BFSOUNDING_FAIL: - - if (cmd) - os_free_mem(cmd); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TXBFSoundingStop(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - -#if defined(MT7615) || defined(MT7622) - Set_Stop_Sounding_Proc(pAd, NULL); -#endif - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_TXBFProfileDataWriteAllExt(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 bw = 0; - UINT32 profile_idx = 0; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto err0; - } - - NdisMoveMemory((PUCHAR)&bw, (PUCHAR)&HqaCmdFrame->Data, sizeof(bw)); - NdisMoveMemory((PUCHAR)&profile_idx, - (PUCHAR)&HqaCmdFrame->Data + sizeof(bw), - sizeof(profile_idx)); - bw = PKTL_TRAN_TO_HOST(bw); - profile_idx = PKTL_TRAN_TO_HOST(profile_idx); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%x:%x", profile_idx, bw); -err0: - - if (cmd) - os_free_mem(cmd); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: bw:%x, profile_idx:%x\n", __func__, bw, profile_idx)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -#ifdef MT_MAC -static INT32 HQA_TxBfTxApply(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 eBF_enable = 0; - UINT32 iBF_enable = 0; - UINT32 wlan_id = 0; - UINT32 MuTx_enable = 0; - UINT32 iBFPhaseCali = 1; - RTMP_STRING *cmd; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - UCHAR *data = HqaCmdFrame->Data; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - Ret = NDIS_STATUS_RESOURCES; - goto err0; - } - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&eBF_enable); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&iBF_enable); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&wlan_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&MuTx_enable); - TESTMODE_SET_PARAM(ate_ctrl, wlan_id, eTxBf, eBF_enable); - TESTMODE_SET_PARAM(ate_ctrl, wlan_id, iTxBf, iBF_enable); - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x", wlan_id, eBF_enable, - iBF_enable, MuTx_enable, iBFPhaseCali); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wlan_id:%x, eBF enable:%x, iBF enable:%x, MuTx:%x\n", - __func__, wlan_id, eBF_enable, iBF_enable, MuTx_enable)); - Set_TxBfTxApply(pAd, cmd); -err0: - - if (cmd) - os_free_mem(cmd); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_ManualAssoc(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - P_MANUAL_CONN manual_cfg = &pAd->AteManualConnInfo; - struct _HQA_BF_MANUAL_CONN manual_conn; - RTMP_STRING rate_str[64]; - char ucNsts; - UINT_32 rate[8]; - RA_PHY_CFG_T TxPhyCfg; - UCHAR *data = HqaCmdFrame->Data; - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.type); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.wtbl_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.ownmac_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.phymode); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.bw); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.pfmuid); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.marate_mode); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.marate_mcs); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.spe_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&manual_conn.aid); - EthGetParamAndShiftBuff(FALSE, MAC_ADDR_LEN, &data, - (UCHAR *)manual_conn.mac); - manual_cfg->peer_op_type = manual_conn.type; - manual_cfg->wtbl_idx = manual_conn.wtbl_idx; - manual_cfg->ownmac_idx = manual_conn.ownmac_idx; - - switch (manual_conn.phymode) { - /* abggnanac */ - case 0: - manual_cfg->peer_phy_mode = WMODE_B | WMODE_G | WMODE_GN | - WMODE_A | WMODE_AN | WMODE_AC; - break; - - /* bggnan */ - case 1: - manual_cfg->peer_phy_mode = - WMODE_B | WMODE_GN | WMODE_G | WMODE_AN; - break; - - /* aanac */ - case 2: - manual_cfg->peer_phy_mode = WMODE_A | WMODE_AN | WMODE_AC; - break; - - default: - manual_cfg->peer_phy_mode = WMODE_B | WMODE_G | WMODE_GN | - WMODE_A | WMODE_AN | WMODE_AC; - break; - } - - switch (manual_conn.bw) { - case ATE_BAND_WIDTH_20: - manual_cfg->peer_bw = BAND_WIDTH_20; - break; - - case ATE_BAND_WIDTH_40: - manual_cfg->peer_bw = BAND_WIDTH_40; - break; - - case ATE_BAND_WIDTH_80: - manual_cfg->peer_bw = BAND_WIDTH_80; - break; - - case ATE_BAND_WIDTH_10: - manual_cfg->peer_bw = BAND_WIDTH_10; - break; - - case ATE_BAND_WIDTH_5: - manual_cfg->peer_bw = BAND_WIDTH_5; - break; - - case ATE_BAND_WIDTH_160: - manual_cfg->peer_bw = BAND_WIDTH_160; - break; - - case ATE_BAND_WIDTH_8080: - manual_cfg->peer_bw = BAND_WIDTH_8080; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Cannot find BW with manual_conn.bw:%x\n", - __func__, manual_conn.bw)); - manual_cfg->peer_bw = manual_conn.bw; - break; - } - - manual_cfg->pfmuId = manual_conn.pfmuid; - manual_cfg->peer_maxrate_mode = manual_conn.marate_mode; - manual_cfg->peer_maxrate_mcs = manual_conn.marate_mcs; - manual_cfg->spe_idx = manual_conn.spe_idx; - manual_cfg->aid = manual_conn.aid; - manual_cfg->peer_nss = 1; /* MU */ - NdisMoveMemory(manual_cfg->peer_mac, manual_conn.mac, MAC_ADDR_LEN); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:User manual configured peer STA info:\n", __func__)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMAC=>0x%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pAd->AteManualConnInfo.peer_mac))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBAND=>%d\n", pAd->AteManualConnInfo.peer_band)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tOwnMacIdx=>%d\n", pAd->AteManualConnInfo.ownmac_idx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tWTBL_Idx=>%d\n", pAd->AteManualConnInfo.wtbl_idx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tOperationType=>%d\n", - pAd->AteManualConnInfo.peer_op_type)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPhyMode=>%d\n", pAd->AteManualConnInfo.peer_phy_mode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBandWidth=>%d\n", pAd->AteManualConnInfo.peer_bw)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tNSS=>%d\n", pAd->AteManualConnInfo.peer_nss)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPfmuId=>%d\n", pAd->AteManualConnInfo.pfmuId)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAid=>%d\n", pAd->AteManualConnInfo.aid)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSpe_idx=>%d\n", pAd->AteManualConnInfo.spe_idx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMaxRate_Mode=>%d\n", - pAd->AteManualConnInfo.peer_maxrate_mode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMaxRate_MCS=>%d\n", - pAd->AteManualConnInfo.peer_maxrate_mcs)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Now apply it to hardware!\n")); - /* This applied the manual config info into the mac table entry, including the HT/VHT cap, VHT MCS set */ - SetATEApplyStaToMacTblEntry(pAd); - /* Fixed rate configuration */ - NdisZeroMemory(&rate_str[0], sizeof(rate_str)); - sprintf(rate_str, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", - pAd->AteManualConnInfo.wtbl_idx, - pAd->AteManualConnInfo.peer_maxrate_mode, - pAd->AteManualConnInfo.peer_bw, - pAd->AteManualConnInfo.peer_maxrate_mcs, - pAd->AteManualConnInfo.peer_nss, 0, 0, 0, 0, 0); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSet fixed RateInfo string as %s\n", rate_str)); - /* Set_Fixed_Rate_Proc(pAd, rate_str); */ - ucNsts = get_nsts_by_mcs(pAd->AteManualConnInfo.peer_maxrate_mode, - pAd->AteManualConnInfo.peer_maxrate_mcs, FALSE, - pAd->AteManualConnInfo.peer_nss); - rate[0] = tx_rate_to_tmi_rate(pAd->AteManualConnInfo.peer_maxrate_mode, - pAd->AteManualConnInfo.peer_maxrate_mcs, - ucNsts, FALSE, 0); - rate[0] &= 0xfff; - rate[1] = rate[2] = rate[3] = rate[4] = rate[5] = rate[6] = rate[7] = - rate[0]; - os_zero_mem(&TxPhyCfg, sizeof(TxPhyCfg)); - TxPhyCfg.BW = pAd->AteManualConnInfo.peer_bw; - TxPhyCfg.ShortGI = FALSE; - /* TxPhyCfg.ldpc = HT_LDPC | VHT_LDPC; */ - TxPhyCfg.ldpc = 0; - MtAsicTxCapAndRateTableUpdate(pAd, pAd->AteManualConnInfo.wtbl_idx, - &TxPhyCfg, rate, FALSE); - /* WTBL configuration */ - SetATEApplyStaToAsic(pAd); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} -#else -static INT32 HQA_eBFEnable(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 enable = 0; - UINT32 band_idx = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - - NdisMoveMemory((PUCHAR)&enable, (PUCHAR)&HqaCmdFrame->Data, - sizeof(enable)); - NdisMoveMemory((PUCHAR)&band_idx, - (PUCHAR)&HqaCmdFrame->Data + sizeof(enable), - sizeof(band_idx)); - enable = PKTL_TRAN_TO_HOST(enable); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - TESTMODE_SET_PARAM(ate_ctrl, band_idx, eTxBf, enable); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: enable:%x, band_idx:%x\n", __func__, enable, band_idx)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_iBFEnable(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 enable = 0; - UINT32 band_idx = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - - NdisMoveMemory((PUCHAR)&enable, (PUCHAR)&HqaCmdFrame->Data, - sizeof(enable)); - NdisMoveMemory((PUCHAR)&band_idx, - (PUCHAR)&HqaCmdFrame->Data + sizeof(enable), - sizeof(band_idx)); - enable = PKTL_TRAN_TO_HOST(enable); - band_idx = PKTL_TRAN_TO_HOST(band_idx); - - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - TESTMODE_SET_PARAM(ate_ctrl, band_idx, iTxBf, enable); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: enable:%x, band_idx:%x\n", __func__, enable, band_idx)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} -#endif - -static HQA_CMD_HANDLER HQA_TXBF_CMDS[] = { - HQA_TxBfProfileTagInValid, /* 0x1540 */ - HQA_TxBfProfileTagPfmuIdx, /* 0x1541 */ - HQA_TxBfProfileTagBfType, /* 0x1542 */ - HQA_TxBfProfileTagBw, /* 0x1543 */ - HQA_TxBfProfileTagSuMu, /* 0x1544 */ - HQA_TxBfProfileTagMemAlloc, /* 0x1545 */ - HQA_TxBfProfileTagMatrix, /* 0x1546 */ - HQA_TxBfProfileTagSnr, /* 0x1547 */ - HQA_TxBfProfileTagSmtAnt, /* 0x1548 */ - HQA_TxBfProfileTagSeIdx, /* 0x1549 */ - HQA_TxBfProfileTagRmsdThrd, /* 0x154A */ - HQA_TxBfProfileTagMcsThrd, /* 0x154B */ - HQA_TxBfProfileTagTimeOut, /* 0x154C */ - HQA_TxBfProfileTagDesiredBw, /* 0x154D */ - HQA_TxBfProfileTagDesiredNc, /* 0x154E */ - HQA_TxBfProfileTagDesiredNr, /* 0x154F */ - HQA_TxBfProfileTagWrite, /* 0x1550 */ - HQA_TxBfProfileTagRead, /* 0x1551 */ - HQA_StaRecCmmUpdate, /* 0x1552 */ - HQA_StaRecBfUpdate, /* 0x1553 */ - HQA_BFProfileDataRead, /* 0x1554 */ - HQA_BFProfileDataWrite, /* 0x1555 */ - HQA_BFSounding, /* 0x1556 */ - HQA_TXBFSoundingStop, /* 0x1557 */ - HQA_TXBFProfileDataWriteAllExt, /* 0x1558 */ -#ifdef MT_MAC - HQA_TxBfTxApply, /* 0x1559 */ - HQA_ManualAssoc, /* 0x155A */ -#else - HQA_eBFEnable, /* 0x1559 */ - HQA_iBFEnable, /* 0x155A */ -#endif - HQA_BFQdRead /* 0x155B */ -}; - -#ifdef CFG_SUPPORT_MU_MIMO -static INT32 HQA_MUGetInitMCS(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 gid = 0; - MU_STRUCT_MU_GROUP_INIT_MCS init_mcs; - struct _HQA_MU_USR_INIT_MCS out; - - NdisMoveMemory((UCHAR *)&gid, HqaCmdFrame->Data, sizeof(gid)); - gid = PKTS_TRAN_TO_HOST(gid); - os_zero_mem(&init_mcs, sizeof(init_mcs)); - os_zero_mem(&out, sizeof(out)); - Ret = hqa_wifi_test_mu_get_init_mcs(pAd, gid, &init_mcs); - out.user0 = init_mcs.user0InitMCS; - out.user1 = init_mcs.user1InitMCS; - out.user2 = init_mcs.user2InitMCS; - out.user3 = init_mcs.user3InitMCS; - NdisMoveMemory(HqaCmdFrame->Data + 2, (UCHAR *)&out, sizeof(out)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: gid:%u\n", __func__, gid)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + sizeof(init_mcs), Ret); - return Ret; -} - -static INT32 HQA_MUCalInitMCS(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - /* INT32 gid = 0; */ - MU_STRUCT_SET_CALC_INIT_MCS param; - UCHAR *data = HqaCmdFrame->Data; - - os_zero_mem(¶m, sizeof(param)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.num_of_user); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.bandwidth); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.nss_of_user0); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.nss_of_user1); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.nss_of_user2); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.nss_of_user3); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.pf_mu_id_of_user0); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.pf_mu_id_of_user1); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.pf_mu_id_of_user2); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.pf_mu_id_of_user3); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.num_of_txer); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.spe_index); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.group_index); - Ret = hqa_wifi_test_mu_cal_init_mcs(pAd, ¶m); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: spe_idx:%d\n", __func__, param.spe_index)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MUCalLQ(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 Type = 0; - INT32 gid = 0; - UINT32 txer = 0; - UCHAR *data = HqaCmdFrame->Data; - MU_STRUCT_SET_SU_CALC_LQ param_su; - MU_STRUCT_SET_CALC_LQ param_mu; - - os_zero_mem(¶m_su, sizeof(param_su)); - os_zero_mem(¶m_mu, sizeof(param_mu)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&Type); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.num_of_user); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.bandwidth); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.nss_of_user0); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.nss_of_user1); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.nss_of_user2); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.nss_of_user3); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.pf_mu_id_of_user0); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.pf_mu_id_of_user1); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.pf_mu_id_of_user2); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.pf_mu_id_of_user3); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.num_of_txer); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.spe_index); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_mu.group_index); - param_su.num_of_user = param_mu.num_of_user; - param_su.bandwidth = param_mu.bandwidth; - param_su.nss_of_user0 = param_mu.nss_of_user0; - param_su.pf_mu_id_of_user0 = param_mu.pf_mu_id_of_user0; - param_su.num_of_txer = param_mu.num_of_txer; - param_su.spe_index = param_mu.spe_index; - param_su.group_index = param_mu.group_index; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: gid:%u, txer:%u spe_idx:%d\n", __func__, gid, txer, - param_mu.spe_index)); - - if (Type == 0) - Ret = hqa_wifi_test_su_cal_lq(pAd, ¶m_su); - else - Ret = hqa_wifi_test_mu_cal_lq(pAd, ¶m_mu); - - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - - return Ret; -} - -static INT32 HQA_MUGetLQ(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT32 Type = 0; - UCHAR *data = HqaCmdFrame->Data; - SU_STRUCT_LQ_REPORT lq_su; - MU_STRUCT_LQ_REPORT lq_mu; - - os_zero_mem(&lq_su, sizeof(lq_su)); - os_zero_mem(&lq_mu, sizeof(lq_mu)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&Type); - - /* TODO:: Check if structure changed*/ - if (Type == 0) { - Ret = hqa_wifi_test_su_get_lq(pAd, &lq_su); - PKTLA_DUMP(DBG_LVL_OFF, sizeof(lq_su) / sizeof(int), &lq_su); - NdisMoveMemory(HqaCmdFrame->Data + 2, (UCHAR *)&lq_su, - sizeof(lq_su)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + sizeof(lq_su), Ret); - } else { - Ret = hqa_wifi_test_mu_get_lq(pAd, &lq_mu); - PKTLA_DUMP(DBG_LVL_OFF, sizeof(lq_mu) / sizeof(int), &lq_mu); - NdisMoveMemory(HqaCmdFrame->Data + 2, (UCHAR *)&lq_mu, - sizeof(lq_mu)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + sizeof(lq_mu), Ret); - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - return Ret; -} - -static INT32 HQA_MUSetSNROffset(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 offset = 0; - - NdisMoveMemory((UCHAR *)&offset, HqaCmdFrame->Data, sizeof(offset)); - offset = PKTL_TRAN_TO_HOST(offset); - Ret = hqa_wifi_test_snr_offset_set(pAd, offset); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: offset:%x\n", __func__, offset)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MUSetZeroNss(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 zero_nss = 0; - - NdisMoveMemory((UCHAR *)&zero_nss, HqaCmdFrame->Data, sizeof(zero_nss)); - zero_nss = PKTL_TRAN_TO_HOST(zero_nss); - Ret = hqa_wifi_test_mu_set_zero_nss(pAd, (UCHAR)zero_nss); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: zero_nss:%x\n", __func__, zero_nss)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MUSetSpeedUpLQ(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 spdup_lq = 0; - - NdisMoveMemory((UCHAR *)&spdup_lq, HqaCmdFrame->Data, sizeof(spdup_lq)); - spdup_lq = PKTL_TRAN_TO_HOST(spdup_lq); - Ret = hqa_wifi_test_mu_speed_up_lq(pAd, spdup_lq); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: spdup_lq:%x\n", __func__, spdup_lq)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MUSetMUTable(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - UCHAR *tbl = NULL; - UINT32 su_mu = 0; - MU_STRUCT_MU_TABLE info; - - os_zero_mem(&info, sizeof(info)); - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length) - sizeof(su_mu); - NdisMoveMemory((UCHAR *)&su_mu, HqaCmdFrame->Data, sizeof(su_mu)); - su_mu = PKTL_TRAN_TO_HOST(su_mu); - Ret = os_alloc_mem(pAd, (UCHAR **)&tbl, sizeof(UCHAR) * len); - - if (Ret) - goto err0; - - os_zero_mem(tbl, len); - NdisMoveMemory((UCHAR *)tbl, HqaCmdFrame->Data + sizeof(su_mu), len); - info.type = su_mu; - info.length = len; - info.prTable = tbl; - Ret = hqa_wifi_test_mu_table_set(pAd, &info); -err0: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%u, su_mu:%u\n", __func__, len, su_mu)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MUSetGroup(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - UINT32 val32; - UCHAR *data = HqaCmdFrame->Data; - MU_STRUCT_MU_GROUP grp; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.groupIndex = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.numOfUser = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user0Ldpc = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user1Ldpc = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user2Ldpc = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user3Ldpc = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.shortGI = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.bw = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user0Nss = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user1Nss = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user2Nss = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user3Nss = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.groupId = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user0UP = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user1UP = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user2UP = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user3UP = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user0MuPfId = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user1MuPfId = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user2MuPfId = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user3MuPfId = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user0InitMCS = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user1InitMCS = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user2InitMCS = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - grp.user3InitMCS = val32; - NdisMoveMemory(grp.aucUser0MacAddr, data, MAC_ADDR_LEN); - data += MAC_ADDR_LEN; - NdisMoveMemory(grp.aucUser1MacAddr, data, MAC_ADDR_LEN); - data += MAC_ADDR_LEN; - NdisMoveMemory(grp.aucUser2MacAddr, data, MAC_ADDR_LEN); - data += MAC_ADDR_LEN; - NdisMoveMemory(grp.aucUser3MacAddr, data, MAC_ADDR_LEN); - Ret = hqa_wifi_test_mu_group_set(pAd, &grp); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%x\n", __func__, len)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(grp.aucUser0MacAddr))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("1:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(grp.aucUser1MacAddr))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("2:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(grp.aucUser2MacAddr))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("3:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(grp.aucUser3MacAddr))); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MUGetQD(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - INT debug_lvl = DebugLevel; - INT32 subcarrier_idx = 0; - MU_STRUCT_MU_QD qd; - - NdisMoveMemory((PUCHAR)&subcarrier_idx, HqaCmdFrame->Data, - sizeof(subcarrier_idx)); - NdisZeroMemory(&qd, sizeof(qd)); - subcarrier_idx = PKTL_TRAN_TO_HOST(subcarrier_idx); - DebugLevel = DBG_LVL_OFF; - Ret = hqa_wifi_test_mu_get_qd(pAd, subcarrier_idx, &qd); - PKTLA_DUMP(DBG_LVL_INFO, sizeof(qd) / sizeof(int), &qd); - NdisMoveMemory(HqaCmdFrame->Data + 2, (UCHAR *)&qd, sizeof(qd)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: sub:%u, qd.length:%zu, pqd:%p, HqaCmd->Data:%p\n", - __func__, subcarrier_idx, sizeof(qd), &qd, - HqaCmdFrame->Data)); - ResponseToQA(HqaCmdFrame, WRQ, 2 + sizeof(qd), Ret); - DebugLevel = debug_lvl; - return Ret; -} - -static INT32 HQA_MUSetEnable(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT32 is_enable = 0; - /* struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); */ - NdisMoveMemory((PUCHAR)&is_enable, HqaCmdFrame->Data, - sizeof(is_enable)); - is_enable = PKTL_TRAN_TO_HOST(is_enable); - Ret = hqa_wifi_test_mu_set_enable(pAd, is_enable); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: MU is_enable:%x\n", __func__, is_enable)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MUSetGID_UP(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - UINT16 len = 0; - UCHAR *data = HqaCmdFrame->Data; - UINT32 val32 = 0; - INT i = 0; - MU_STRUCT_MU_STA_PARAM param; - - os_zero_mem(¶m, sizeof(param)); - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - - for (i = 0; i < 2; i++) { - NdisMoveMemory(&val32, data, sizeof(val32)); - val32 = PKTL_TRAN_TO_HOST(val32); - param.gid[i] = val32; - data += sizeof(val32); - } - - for (i = 0; i < 4; i++) { - NdisMoveMemory(&val32, data, sizeof(val32)); - val32 = PKTL_TRAN_TO_HOST(val32); - param.up[i] = val32; - data += sizeof(val32); - } - - /* Del after debug */ - PKTLA_DUMP(DBG_LVL_OFF, sizeof(param) / sizeof(UINT32), ¶m); - Ret = hqa_wifi_test_mu_set_sta_gid_and_up(pAd, ¶m); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static INT32 HQA_MUTriggerTx(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - struct _ATE_CTRL *ate_ctrl = &pAd->ATECtrl; - INT32 Ret = 0; - UINT16 len = 0; - UINT32 val32; - UINT32 band_idx = 0; - UCHAR *data = HqaCmdFrame->Data; - MU_STRUCT_TRIGGER_MU_TX_FRAME_PARAM mu_tx_param; - - len = PKTS_TRAN_TO_HOST(HqaCmdFrame->Length); - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - band_idx = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - mu_tx_param.fgIsRandomPattern = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - mu_tx_param.msduPayloadLength0 = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - mu_tx_param.msduPayloadLength1 = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - mu_tx_param.msduPayloadLength2 = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - mu_tx_param.msduPayloadLength3 = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - mu_tx_param.u4MuPacketCount = val32; - Ret = EthGetParamAndShiftBuff(TRUE, sizeof(val32), &data, - (UCHAR *)&val32); - mu_tx_param.u4NumOfSTAs = val32; - NdisMoveMemory(mu_tx_param.macAddrs[0], data, MAC_ADDR_LEN); - data += MAC_ADDR_LEN; - NdisMoveMemory(mu_tx_param.macAddrs[1], data, MAC_ADDR_LEN); - data += MAC_ADDR_LEN; - NdisMoveMemory(mu_tx_param.macAddrs[2], data, MAC_ADDR_LEN); - data += MAC_ADDR_LEN; - NdisMoveMemory(mu_tx_param.macAddrs[3], data, MAC_ADDR_LEN); - - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - Ret = hqa_wifi_test_mu_trigger_mu_tx(pAd, &mu_tx_param); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%x\n", __func__, len)); - ResponseToQA(HqaCmdFrame, WRQ, 2, Ret); - return Ret; -} - -static HQA_CMD_HANDLER HQA_TXMU_CMDS[] = { - HQA_MUGetInitMCS, /* 0x1560 */ - HQA_MUCalInitMCS, /* 0x1561 */ - HQA_MUCalLQ, /* 0x1562 */ - HQA_MUGetLQ, /* 0x1563 */ - HQA_MUSetSNROffset, /* 0x1564 */ - HQA_MUSetZeroNss, /* 0x1565 */ - HQA_MUSetSpeedUpLQ, /* 0x1566 */ - HQA_MUSetMUTable, /* 0x1567 */ - HQA_MUSetGroup, /* 0x1568 */ - HQA_MUGetQD, /* 0x1569 */ - HQA_MUSetEnable, /* 0x156A */ - HQA_MUSetGID_UP, /* 0x156B */ - HQA_MUTriggerTx, /* 0x156C */ -}; -#endif /* CFG_SUPPORT_MU_MIMO */ -#endif /* TXBF_SUPPORT */ - -static INT32 HQA_CapWiFiSpectrum(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; -#ifdef INTERNAL_CAPTURE_SUPPORT - /* Set Param*/ - UINT32 Control, Trigger, RingCapEn, Event, Node, Len, StopCycle, BW, - MACTriggerEvent, Band; - UINT32 SourceAddrLSB = 0; - UINT32 SourceAddrMSB = 0; - UCHAR SourceAddress[MAC_ADDR_LEN]; - /* Get Param*/ - UINT32 Value, i; - UINT32 RespLen = 2; - UINT32 WF_Num, IQ_Type; - PINT32 pData = NULL; - PINT32 pDataLen = NULL; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UCHAR *data = HqaCmdFrame->Data; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:", __func__)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&Control); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Control:%d\n", Control)); - - if (Control == 1) { - if (ATEOp->SetICapStart) { - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&Trigger); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Trigger:%d\n", Trigger)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&RingCapEn); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RingCapEn:%d\n", RingCapEn)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&Event); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Event:%d\n", Event)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&Node); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Node:%d\n", Node)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&Len); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Len:%d\n", Len)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&StopCycle); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("StopCycle:%d\n", StopCycle)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&BW); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("BW:%d\n", BW)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&MACTriggerEvent); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MACTriggerEvent:%d\n", MACTriggerEvent)); - EthGetParamAndShiftBuff(FALSE, MAC_ADDR_LEN, &data, - (UCHAR *)SourceAddress); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SourceAddress:%02x:%02x:%02x:%02x:%02x:%02x\n ", - PRINT_MAC(SourceAddress))); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&Band); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Band:%d\n", Band)); - - ATECtrl->control_band_idx = (UCHAR)Band; - - SourceAddrLSB = - ((SourceAddress[0]) | (SourceAddress[1] << 8) | - (SourceAddress[2]) << 16 | - (SourceAddress[3]) << 24); - SourceAddrMSB = ((SourceAddress[4]) | - (SourceAddress[5] << 8) | (0x1 << 16)); - ATEOp->SetICapStart(pAd, Trigger, RingCapEn, Event, - Node, Len, StopCycle, BW, - MACTriggerEvent, SourceAddrLSB, - SourceAddrMSB, Band); - } else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, RespLen, Ret); - } else if (Control == 2) { - if (ATEOp->GetICapStatus) { - Ret = ATEOp->GetICapStatus(pAd); - - if (IS_MT7615(pAd)) { - EXT_EVENT_RBIST_ADDR_T *icap_info = - &(pAd->ATECtrl.icap_info); - - Value = PKTL_TRAN_TO_HOST( - icap_info->u4StartAddr1); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - Value = PKTL_TRAN_TO_HOST( - icap_info->u4StartAddr2); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - Value = PKTL_TRAN_TO_HOST( - icap_info->u4StartAddr3); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - Value = PKTL_TRAN_TO_HOST(icap_info->u4EndAddr); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - Value = PKTL_TRAN_TO_HOST( - icap_info->u4StopAddr); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - Value = PKTL_TRAN_TO_HOST(icap_info->u4Wrap); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, StartAddr1:%02x StartAddr2:%02x StartAddr3:%02x EndAddr:%02x StopAddr:%02x Wrap:%02x\n", - __func__, icap_info->u4StartAddr1, - icap_info->u4StartAddr2, - icap_info->u4StartAddr3, - icap_info->u4EndAddr, - icap_info->u4StopAddr, - icap_info->u4Wrap)); - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s : Status = %d", __func__, Ret)); - } - } else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, RespLen, Ret); - } else if (Control == 3) { - if (ATEOp->GetICapIQData) { - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&WF_Num); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WF_Num:%d\n", WF_Num)); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&IQ_Type); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IQ_Type:%d\n", IQ_Type)); - { - UINT32 Len; - INT32 retval; - UCHAR *data = HqaCmdFrame->Data; - - /* Dynamic allocate memory for data length */ - retval = os_alloc_mem(pAd, (UCHAR **)&pDataLen, - sizeof(INT32)); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - - /* Dynamic allocate memory for 1KByte data buffer */ - Len = ICAP_EVENT_DATA_SAMPLE * sizeof(INT32); - retval = os_alloc_mem(pAd, (UCHAR **)&pData, - Len); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - - ATEOp->GetICapIQData(pAd, pData, pDataLen, - IQ_Type, WF_Num); - Value = PKTL_TRAN_TO_HOST(Control); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - Value = PKTL_TRAN_TO_HOST(WF_Num); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - Value = PKTL_TRAN_TO_HOST(IQ_Type); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - Value = PKTL_TRAN_TO_HOST(*pDataLen); - NdisMoveMemory(data + RespLen, (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - - for (i = 0; i < *pDataLen; i++) { - INT32 Value; - Value = PKTL_TRAN_TO_HOST(pData[i]); - NdisMoveMemory(data + RespLen, - (UCHAR *)&Value, - sizeof(Value)); - RespLen += sizeof(Value); - } - - error: - if (pDataLen != NULL) - os_free_mem(pDataLen); - if (pData != NULL) - os_free_mem(pData); - } - } else - Ret = TM_STATUS_NOTSUPPORT; - - ResponseToQA(HqaCmdFrame, WRQ, RespLen, Ret); - } - - /* else */ - /* ResponseToQA(HqaCmdFrame, WRQ, RespLen, Ret); */ -#endif /* INTERNAL_CAPTURE_SUPPORT */ - - return Ret; -} - -static HQA_CMD_HANDLER HQA_ICAP_CMDS[] = { - HQA_CapWiFiSpectrum, /* 0x1580 */ -}; - -static INT32 hqa_set_channel_ext(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UINT32 len = 0; - struct _HQA_EXT_SET_CH param; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - UCHAR *data = cmd_frame->Data; - UINT32 pri_ch = 0; - UINT32 band_idx = 0; - UINT32 bw = 0; - UINT32 per_pkt_bw = 0; - - len = PKTS_TRAN_TO_HOST(cmd_frame->Length); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.num_param); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.band_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.central_ch0); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.central_ch1); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.sys_bw); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.perpkt_bw); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.pri_sel); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.reason); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.ch_band); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.out_band_freq); - - if (param.band_idx > TESTMODE_BAND_NUM - 1) { - ret = NDIS_STATUS_INVALID_DATA; - goto err0; - } - - band_idx = param.band_idx; - - switch (param.sys_bw) { - case ATE_BAND_WIDTH_20: - bw = BAND_WIDTH_20; - break; - - case ATE_BAND_WIDTH_40: - bw = BAND_WIDTH_40; - break; - - case ATE_BAND_WIDTH_80: - bw = BAND_WIDTH_80; - break; - - case ATE_BAND_WIDTH_10: - bw = BAND_WIDTH_10; - break; - - case ATE_BAND_WIDTH_5: - bw = BAND_WIDTH_5; - break; - - case ATE_BAND_WIDTH_160: - bw = BAND_WIDTH_160; - break; - - case ATE_BAND_WIDTH_8080: - bw = BAND_WIDTH_8080; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Cannot find BW with param.sys_bw:%x\n", __func__, - param.sys_bw)); - bw = param.sys_bw; - break; - } - - switch (param.perpkt_bw) { - case ATE_BAND_WIDTH_20: - per_pkt_bw = BAND_WIDTH_20; - break; - - case ATE_BAND_WIDTH_40: - per_pkt_bw = BAND_WIDTH_40; - break; - - case ATE_BAND_WIDTH_80: - per_pkt_bw = BAND_WIDTH_80; - break; - - case ATE_BAND_WIDTH_10: - per_pkt_bw = BAND_WIDTH_10; - break; - - case ATE_BAND_WIDTH_5: - per_pkt_bw = BAND_WIDTH_5; - break; - - case ATE_BAND_WIDTH_160: - case ATE_BAND_WIDTH_8080: - per_pkt_bw = BAND_WIDTH_160; - break; - - default: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Cannot find BW with param.sys_bw:%x\n", __func__, - param.sys_bw)); - per_pkt_bw = bw; - break; - } - - /* Set Param */ - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Channel, param.central_ch0); -#ifdef DOT11_VHT_AC - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Channel_2nd, param.central_ch1); -#endif - TESTMODE_SET_PARAM(ate_ctrl, band_idx, PerPktBW, per_pkt_bw); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, BW, bw); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, PriSel, param.pri_sel); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Ch_Band, param.ch_band); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, OutBandFreq, - param.out_band_freq); - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - ate_ops->SetChannel(pAd, param.central_ch0, param.pri_sel, param.reason, - param.ch_band); -err0: - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)¶m.ext_id, 4); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: len:%x, num_param:%x, band_idx:%x, ch0:%u, ch1:%u, sys_bw:%x, bw_conver:%x, ", - __func__, len, param.num_param, param.band_idx, - param.central_ch0, param.central_ch1, param.sys_bw, bw)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("perpkt_bw:%x, pri_sel:%x, pri_ch:%u\n", param.perpkt_bw, - param.pri_sel, pri_ch)); - ResponseToQA(cmd_frame, wrq, 6, ret); - return ret; -} - -static INT32 hqa_set_txcontent_ext(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UINT32 len = 0, pl_len = 0; - struct _HQA_EXT_TX_CONTENT param; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_TX_TIME_PARAM *tx_time_param = NULL; - UCHAR *data = cmd_frame->Data; - HEADER_802_11 *phdr = NULL; - UCHAR *addr1, *addr2, *addr3, *payload; - UINT32 band_idx = 0; - - len = PKTS_TRAN_TO_HOST(cmd_frame->Length); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.num_param); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.band_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.FC); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.dur); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.seq); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.gen_payload_rule); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.txlen); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.payload_len); - EthGetParamAndShiftBuff(FALSE, MAC_ADDR_LEN, &data, param.addr1); - EthGetParamAndShiftBuff(FALSE, MAC_ADDR_LEN, &data, param.addr2); - EthGetParamAndShiftBuff(FALSE, MAC_ADDR_LEN, &data, param.addr3); - - /* 52 for the size before payload */ - if (param.payload_len > ATE_MAX_PATTERN_SIZE) - param.payload_len = ATE_MAX_PATTERN_SIZE; - - /* Set Param */ - band_idx = param.band_idx; - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - addr1 = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Addr1); - addr2 = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Addr2); - addr3 = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Addr3); - NdisMoveMemory(addr1, param.addr1, MAC_ADDR_LEN); - NdisMoveMemory(addr2, param.addr2, MAC_ADDR_LEN); - NdisMoveMemory(addr3, param.addr3, MAC_ADDR_LEN); - phdr = (HEADER_802_11 *)TESTMODE_GET_PARAM(ate_ctrl, band_idx, - TemplateFrame); - pl_len = TESTMODE_GET_PARAM(ate_ctrl, band_idx, pl_len); - /* pl_addr = TESTMODE_GET_PADDR(ate_ctrl, band_idx, payload); */ - payload = TESTMODE_GET_PARAM(ate_ctrl, band_idx, payload); - NdisMoveMemory(&phdr->FC, ¶m.FC, sizeof(phdr->FC)); - phdr->Duration = (UINT16)param.dur; - phdr->Sequence = (UINT16)param.seq; - TESTMODE_SET_PARAM(ate_ctrl, band_idx, FixedPayload, - param.gen_payload_rule); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, TxLength, param.txlen); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, pl_len, param.payload_len); - /* payload = *pl_addr; */ - - /* Error check for txlen and payload_len */ - if ((param.txlen == 0) || (param.payload_len == 0)) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: txlen/payload_len=%d/%d can't be 0!!\n", - __func__, param.txlen, param.payload_len)); - return NDIS_STATUS_FAILURE; - } - - /* Packet TX time feature implementation */ - tx_time_param = TESTMODE_GET_PADDR(ate_ctrl, band_idx, tx_time_param); - if (tx_time_param->pkt_tx_time_en == TRUE) { - tx_time_param->pkt_tx_time = param.txlen; - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: FC:%04x, dur:%u, seq:%u, plen:%u, pkt_tx_time:%u, GENPKT:%u\n", - __func__, param.FC, param.dur, param.seq, - param.payload_len, tx_time_param->pkt_tx_time, - param.gen_payload_rule)); - - } else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: FC:%04x, dur:%u, seq:%u, plen:%u, txlen:%u, GENPKT:%u\n", - __func__, param.FC, param.dur, param.seq, - param.payload_len, param.txlen, - param.gen_payload_rule)); - } - - EthGetParamAndShiftBuff(FALSE, param.payload_len, &data, payload); - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)¶m.ext_id, - sizeof(param.ext_id)); - ResponseToQA(cmd_frame, wrq, 2 + sizeof(param.ext_id), ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: addr1:%02x:%02x:%02x:%02x:%02x:%02x\n", __func__, - PRINT_MAC(addr1))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: addr2:%02x:%02x:%02x:%02x:%02x:%02x\n", __func__, - PRINT_MAC(addr2))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: addr3:%02x:%02x:%02x:%02x:%02x:%02x\n", __func__, - PRINT_MAC(addr3))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ret:%u, len:%u, param_len:%u\n", __func__, ret, - param.payload_len, pl_len)); - - return ret; -} - -static INT32 hqa_start_tx_ext(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - INT32 len = 0; - UINT32 band_idx = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - UCHAR *data = cmd_frame->Data; - struct _HQA_EXT_TXV param; - ATE_TXPOWER TxPower; - UINT32 Channel = 0, Ch_Band = 0, SysBw = 0, PktBw = 0, ipg = 0; - - len = PKTS_TRAN_TO_HOST(cmd_frame->Length); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.num_param); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.band_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.pkt_cnt); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.phymode); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.rate); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.pwr); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.stbc); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.ldpc); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.ibf); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.ebf); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.wlan_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.aifs); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.gi); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.tx_path); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m.nss); - band_idx = param.band_idx; - - if (!param.pkt_cnt) - param.pkt_cnt = 0x8fffffff; - - TESTMODE_SET_PARAM(ate_ctrl, band_idx, TxCount, param.pkt_cnt); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, PhyMode, param.phymode); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Mcs, param.rate); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Stbc, param.stbc); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Ldpc, param.ldpc); -#ifdef TXBF_SUPPORT - TESTMODE_SET_PARAM(ate_ctrl, band_idx, iTxBf, param.ibf); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, eTxBf, param.ebf); -#endif - ate_ctrl->wcid_ref = param.wlan_id; - /* TODO: Need to modify */ - TESTMODE_SET_PARAM(ate_ctrl, band_idx, ipg_param.ipg, - param.aifs); /* Fix me */ - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Sgi, param.gi); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, TxAntennaSel, param.tx_path); - TESTMODE_SET_PARAM(ate_ctrl, band_idx, Nss, param.nss); - Channel = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Channel); - Ch_Band = TESTMODE_GET_PARAM(ate_ctrl, band_idx, Ch_Band); - PktBw = TESTMODE_GET_PARAM(ate_ctrl, band_idx, PerPktBW); - SysBw = TESTMODE_GET_PARAM(ate_ctrl, band_idx, BW); - ipg = TESTMODE_GET_PARAM(ate_ctrl, band_idx, ipg_param.ipg); - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - if (param.rate == 32 && PktBw != BAND_WIDTH_40 && - SysBw != BAND_WIDTH_40) { - ret = -1; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Bandwidth must to be 40 at MCS 32\n", __func__)); - goto err0; - } - - os_zero_mem(&TxPower, sizeof(TxPower)); - TxPower.Power = param.pwr; - TxPower.Channel = Channel; - TxPower.Dbdc_idx = band_idx; - TxPower.Band_idx = Ch_Band; - ret = ate_ops->SetTxPower0(pAd, TxPower); - ret = ate_ops->SetIPG(pAd, ipg); - ret = ate_ops->StartTx(pAd); -err0: - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)¶m.ext_id, - sizeof(param.ext_id)); - ResponseToQA(cmd_frame, wrq, 2 + sizeof(param.ext_id), ret); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: band_idx:%u, pkt_cnt:%u, phy:%u, mcs:%u, stbc:%u, ldpc:%u\n", - __func__, param.band_idx, param.pkt_cnt, param.phymode, - param.rate, param.stbc, param.ldpc)); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ibf:%u, ebf:%u, wlan_id:%u, aifs:%u, gi:%u, tx_path:%x, nss:%x\n", - __func__, param.ibf, param.ebf, param.wlan_id, param.aifs, - param.gi, param.tx_path, param.nss)); - return ret; -} - -static INT32 hqa_start_rx_ext(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - UCHAR *data = cmd_frame->Data; - UINT32 ext_id = 0; - UINT32 param_num = 0; - UINT32 band_idx = 0; - UINT32 rx_path = 0; - UCHAR own_mac[MAC_ADDR_LEN]; - - NdisZeroMemory(own_mac, MAC_ADDR_LEN); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_num); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&band_idx); - EthGetParamAndShiftBuff(FALSE, MAC_ADDR_LEN, &data, (UCHAR *)&own_mac); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&rx_path); - - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - ret = ate_ops->SetRxAntenna(pAd, rx_path); - ret = ate_ops->SetAutoResp(pAd, own_mac, 1); - ret = ate_ops->StartRx(pAd); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: param num:%u, band_sel:%u, rx_path:%x, mac:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, param_num, band_idx, rx_path, PRINT_MAC(own_mac))); - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); - ResponseToQA(cmd_frame, wrq, 2 + sizeof(ext_id), ret); - return ret; -} - -static INT32 hqa_stop_tx_ext(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UCHAR *data = cmd_frame->Data; - UINT32 ext_id = 0; - UINT32 param_num = 0; - UINT32 band_idx = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_num); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&band_idx); - - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - ret = ate_ops->StopTx(pAd); - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); - ResponseToQA(cmd_frame, wrq, 2 + sizeof(ext_id), ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: band_idx:%u\n", __func__, band_idx)); - return ret; -} - -static INT32 hqa_stop_rx_ext(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UCHAR *data = cmd_frame->Data; - UINT32 ext_id = 0; - UINT32 param_num = 0; - UINT32 band_idx = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ate_ops = ate_ctrl->ATEOp; - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)¶m_num); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&band_idx); - - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - ret = ate_ops->StopRx(pAd); - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); - ResponseToQA(cmd_frame, wrq, 2 + sizeof(ext_id), ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: band_idx:%u\n", __func__, band_idx)); - return ret; -} - -static INT32 hqa_set_tx_time(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UCHAR *data = cmd_frame->Data; - UINT32 ext_id = 0; - UINT32 band_idx = 0; - UINT32 is_tx_time = 0; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - struct _ATE_TX_TIME_PARAM *tx_time_param = NULL; - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&band_idx); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&is_tx_time); - tx_time_param = TESTMODE_GET_PADDR(ate_ctrl, band_idx, tx_time_param); - - ate_ctrl->control_band_idx = (UCHAR)band_idx; - - /* 0: use tx length, 1: use tx time */ - if (is_tx_time == 1) { - tx_time_param->pkt_tx_time_en = TRUE; - } else { - tx_time_param->pkt_tx_time_en = FALSE; - tx_time_param->pkt_tx_time = - 0; /* Reset to 0 when start TX everytime */ - } - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); - ResponseToQA(cmd_frame, wrq, 2 + sizeof(ext_id), ret); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: band_idx:%u, is_tx_time:%d\n", __func__, band_idx, - is_tx_time)); - return ret; -} - -#ifdef TXBF_SUPPORT -static INT32 hqa_iBFGetStatus_ext(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UCHAR *data = cmd_frame->Data; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - UINT32 ext_id = 0; - UINT32 u4Status = 0; - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - - if (!ate_ctrl->txbf_info) - goto HQA_TAG_DNC_FAIL; - - u4Status = ate_ctrl->iBFCalStatus; - ate_ctrl->Mode &= ~fATE_IN_BF; - os_free_mem(ate_ctrl->txbf_info); - ate_ctrl->txbf_info = NULL; - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,("%s, val:%x\n", __FUNCTION__, u4Status)); */ - ext_id = PKTL_TRAN_TO_HOST(ext_id); - u4Status = PKTL_TRAN_TO_HOST(u4Status); - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); - NdisMoveMemory(cmd_frame->Data + 6, (UCHAR *)&u4Status, 4); -HQA_TAG_DNC_FAIL: - ResponseToQA(cmd_frame, wrq, 10, ret); - return ret; -} - -static INT32 hqa_iBFSetValue_ext(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UCHAR *data = cmd_frame->Data; - struct _ATE_CTRL *ate_ctrl = &(pAd->ATECtrl); - UINT32 ext_id = 0; - UINT32 u4Action = 0; - UINT32 u4InArg[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - RTMP_STRING *cmd; - - ate_ctrl->txbf_info = NULL; - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - ret = NDIS_STATUS_RESOURCES; - goto HQA_IBF_CMD_FAIL; - } - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4Action); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4InArg[0]); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4InArg[1]); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4InArg[2]); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4InArg[3]); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4InArg[4]); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4InArg[5]); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4InArg[6]); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4InArg[7]); - - switch (u4Action) { - case ATE_TXBF_INIT: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", (UCHAR)u4InArg[0]); - SetATETxBfDutInitProc(pAd, cmd); - break; - - case ATE_CHANNEL: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - - if (u4InArg[1] == 1) - sprintf(cmd, "%d:1", (UCHAR)u4InArg[0]); - else - sprintf(cmd, "%d", (UCHAR)u4InArg[0]); - - SetATEChannel(pAd, cmd); - break; - - case ATE_TX_MCS: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", (UCHAR)u4InArg[0]); - SetATETxMcs(pAd, cmd); - break; - - case ATE_TX_POW0: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", (UCHAR)u4InArg[0]); - SetATETxPower0(pAd, cmd); - break; - - case ATE_TX_ANT: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", (UCHAR)u4InArg[0]); - SetATETxAntenna(pAd, cmd); - break; - - case ATE_RX_FRAME: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "RXFRAME"); - SetATE(pAd, cmd); - break; - - case ATE_RX_ANT: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", (UCHAR)u4InArg[0]); - SetATERxAntenna(pAd, cmd); - break; - - case ATE_TXBF_LNA_GAIN: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%d", (UCHAR)u4InArg[0]); - SetATETxBfLnaGain(pAd, cmd); - break; - - case ATE_IBF_PHASE_COMP: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - /* BW:DBDC idx:Group:Read from E2P:Dis compensation */ - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x", u4InArg[0], u4InArg[1], - u4InArg[2], u4InArg[3], u4InArg[4]); - - if (SetATEIBfPhaseComp(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" ATE_IBF_PHASE_COMP is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_IBF_CMD_FAIL; - } - - break; - - case ATE_IBF_TX: - u4InArg[2] = 0; /* for test purpose */ - memset(cmd, 0x00, HQA_BF_STR_SIZE); - /* fgBf:WLAN idx:Txcnt */ - sprintf(cmd, "%02x:%02x:%02x", u4InArg[0], u4InArg[1], - u4InArg[2]); - - if (SetATETxPacketWithBf(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" ATE_IBF_TX is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_IBF_CMD_FAIL; - } - - break; - - case ATE_IBF_PROF_UPDATE: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - /* Pfmu idx:Nr:Nc */ - sprintf(cmd, "%02x:%02x:%02x", u4InArg[0], u4InArg[1], - u4InArg[2]); - - if (SetATEIBfProfileUpdate(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" ATE_IBF_PROF_UPDATE is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_IBF_CMD_FAIL; - } - - memset(cmd, 0x00, HQA_BF_STR_SIZE); - /* Wlan Id:EBf:IBf:Mu:PhaseCalFlg */ - sprintf(cmd, "01:00:01:00:01"); - - if (Set_TxBfTxApply(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" IBF flag setting in WTBL is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_IBF_CMD_FAIL; - } - - break; - - case ATE_EBF_PROF_UPDATE: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - /* Pfmu idx:Nr:Nc */ - sprintf(cmd, "%02x:%02x:%02x", u4InArg[0], u4InArg[1], - u4InArg[2]); - - if (SetATEEBfProfileConfig(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" ATE_EBF_PROF_UPDATE is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_IBF_CMD_FAIL; - } - - break; - - case ATE_IBF_INST_CAL: - ate_ctrl->Mode |= fATE_IN_BF; - memset(cmd, 0x00, HQA_BF_STR_SIZE); - /* Group idx:Group_L_M_H:fgSX2:Calibration type:Lna level */ - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x", u4InArg[0], u4InArg[1], - u4InArg[2], u4InArg[3], u4InArg[4]); - - if (SetATEIBfInstCal(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" ATE_IBF_GD_CAL is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_IBF_CMD_FAIL; - } - - break; - - case ATE_IBF_INST_VERIFY: - ate_ctrl->Mode |= fATE_IN_BF; - u4InArg[3] = 4; /* iBF phase verification with instrument */ - u4InArg[4] = 1; /* Force LNA gain is middle gain */ - memset(cmd, 0x00, HQA_BF_STR_SIZE); - /* Group idx:Group_L_M_H:fgSX2:Calibration type:Lna level */ - sprintf(cmd, "%02x:%02x:%02x:%02x:%02x", u4InArg[0], u4InArg[1], - u4InArg[2], u4InArg[3], u4InArg[4]); - - if (SetATEIBfInstCal(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" ATE_IBF_INST_VERIFY is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_IBF_CMD_FAIL; - } - - break; - - case ATE_TXBF_GD_INIT: - break; - - case ATE_IBF_PHASE_E2P_UPDATE: - memset(cmd, 0x00, HQA_BF_STR_SIZE); - /* Group idx:fgSX2:E2P update type */ - sprintf(cmd, "%02x:%02x:%02x", u4InArg[0], u4InArg[1], - u4InArg[2]); - pAd->fgCalibrationFail = - FALSE; /* Enable EEPROM write of calibrated phase */ - - if (SetATETxBfPhaseE2pUpdate(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" ATE_IBF_PHASE_E2P_UPDATE is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_IBF_CMD_FAIL; - } - - break; - - default: - break; - } - - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,("%s, Action ID : %d, str:%s\n", __FUNCTION__, u4Action, cmd)); */ - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); -HQA_IBF_CMD_FAIL: - if (cmd) - os_free_mem(cmd); - ResponseToQA(cmd_frame, wrq, 6, ret); - return ret; -} - -static INT32 hqa_iBFChanProfUpdate_ext(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UCHAR *data = cmd_frame->Data; - UINT32 ext_id = 0; - UINT32 u4PfmuId, u4Subcarr, fgFinalData; - UINT32 i2H11, i2AngleH11, i2H21, i2AngleH21, i2H31, i2AngleH31, i2H41, - i2AngleH41; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - ret = NDIS_STATUS_RESOURCES; - goto HQA_PROFILE_UPDATE_FAIL; - } - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4PfmuId); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4Subcarr); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&fgFinalData); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&i2H11); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&i2AngleH11); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&i2H21); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&i2AngleH21); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&i2H31); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&i2AngleH31); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&i2H41); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&i2AngleH41); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%03x:%03x:%03x:%03x:%03x:%03x:%03x:%03x:%03x:%03x:%03x", - u4PfmuId, u4Subcarr, fgFinalData, i2H11, i2AngleH11, i2H21, - i2AngleH21, i2H31, i2AngleH31, i2H41, i2AngleH41); - - if (SetATETxBfChanProfileUpdate(pAd, cmd) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" SetATETxBfChanProfileUpdate is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_PROFILE_UPDATE_FAIL; - } - - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF,("%s, str:%s\n", __FUNCTION__, cmd)); */ - os_free_mem(cmd); - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); -HQA_PROFILE_UPDATE_FAIL: - ResponseToQA(cmd_frame, wrq, 6, ret); - return ret; -} - -static INT32 hqa_iBFChanProfUpdateAll_ext(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UCHAR *data = cmd_frame->Data; - UINT32 ext_id = 0; - UINT32 u4PfmuId, u4Temp; - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4PfmuId); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&u4Temp); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&u4Temp); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&u4Temp); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&u4Temp); - - if (TxBfProfileDataWrite20MAll(pAd, u4PfmuId, data) == FALSE) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" SetATETxBfChanProfileUpdate is failed!!\n")); - ret = NDIS_STATUS_FAILURE; - goto HQA_PROFILE_UPDATE_FAIL; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: str:%d\n", __func__, u4PfmuId)); - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); -HQA_PROFILE_UPDATE_FAIL: - ResponseToQA(cmd_frame, wrq, 6, ret); - return ret; -} - -static INT32 hqa_iBFProfileRead_ext(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - UCHAR *data = cmd_frame->Data; - UINT32 ext_id = 0; - UINT32 u4PfmuId, u4Subcarr; - RTMP_STRING *cmd; - - os_alloc_mem(pAd, (UCHAR **)&cmd, sizeof(CHAR) * (HQA_BF_STR_SIZE)); - - if (!cmd) { - ret = NDIS_STATUS_RESOURCES; - goto HQA_TAG_DNC_FAIL; - } - - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, (UCHAR *)&ext_id); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4PfmuId); - EthGetParamAndShiftBuff(TRUE, sizeof(UINT32), &data, - (UCHAR *)&u4Subcarr); - memset(cmd, 0x00, HQA_BF_STR_SIZE); - sprintf(cmd, "%03x:%03x", (UCHAR)u4PfmuId, (UCHAR)u4Subcarr); - SetATETxBfProfileRead(pAd, cmd); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: str:%s\n", __func__, cmd)); - os_free_mem(cmd); - NdisMoveMemory(cmd_frame->Data + 2, (UCHAR *)&ext_id, sizeof(ext_id)); - NdisMoveMemory(cmd_frame->Data + 6, (UCHAR *)&pAd->prof, - sizeof(PFMU_DATA)); -HQA_TAG_DNC_FAIL: - ResponseToQA(cmd_frame, wrq, (6 + sizeof(PFMU_DATA)), ret); - return ret; -} -#endif /* TXBF_SUPPORT */ - -static HQA_CMD_HANDLER hqa_ext_cmd_set[] = { - NULL, - hqa_set_channel_ext, /* 0x00000001 */ - hqa_set_txcontent_ext, /* 0x00000002 */ - hqa_start_tx_ext, /* 0x00000003 */ - hqa_start_rx_ext, /* 0x00000004 */ - hqa_stop_tx_ext, /* 0x00000005 */ - hqa_stop_rx_ext, /* 0x00000006 */ - NULL, /* 0x00000007 */ -#ifdef TXBF_SUPPORT - hqa_iBFSetValue_ext, /* 0x00000008 */ - hqa_iBFGetStatus_ext, /* 0x00000009 */ - hqa_iBFChanProfUpdate_ext, /* 0x0000000A */ - hqa_iBFProfileRead_ext, /* 0x0000000B */ - hqa_iBFChanProfUpdateAll_ext, /* 0x0000000C */ -#endif /* TXBF_SUPPORT */ - NULL, /* 0x0000000D */ - NULL, /* 0x0000000E */ - NULL, /* 0x0000000F */ - NULL, /* 0x00000010 */ - NULL, /* 0x00000011 */ - NULL, /* 0x00000012 */ - NULL, /* 0x00000013 */ - NULL, /* 0x00000014 */ - NULL, /* 0x00000015 */ - NULL, /* 0x00000016 */ - NULL, /* 0x00000017 */ - NULL, /* 0x00000018 */ - NULL, /* 0x00000019 */ - NULL, /* 0x0000001A */ - NULL, /* 0x0000001B */ - NULL, /* 0x0000001C */ - NULL, /* 0x0000001D */ - NULL, /* 0x0000001E */ - NULL, /* 0x0000001F */ - NULL, /* 0x00000020 */ - NULL, /* 0x00000021 */ - NULL, /* 0x00000022 */ - NULL, /* 0x00000023 */ - NULL, /* 0x00000024 */ - NULL, /* 0x00000025 */ - hqa_set_tx_time, /* 0x00000026 */ -}; - -static INT32 hqa_ext_cmds(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - struct _HQA_CMD_FRAME *cmd_frame) -{ - INT32 ret = 0; - INT32 idx = 0; - - NdisMoveMemory((PUCHAR)&idx, (PUCHAR)&cmd_frame->Data, 4); - idx = PKTL_TRAN_TO_HOST(idx); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: 0x%x\n", __FUNCTION__, idx)); - - if (idx >= (sizeof(hqa_ext_cmd_set) / sizeof(HQA_CMD_HANDLER))) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: cmd idx 0x%x is over bounded\n", __FUNCTION__, - idx)); - return ret; - } - - if (hqa_ext_cmd_set[idx] != NULL) - ret = (*hqa_ext_cmd_set[idx])(pAd, wrq, cmd_frame); - else - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: cmd idx 0x%x is not supported\n", __FUNCTION__, - idx)); - - return ret; -} - -static HQA_CMD_HANDLER HQA_CMD_SET6[] = { - /* cmd id start from 0x1600 */ - hqa_ext_cmds, /* 0x1600 */ -}; - -static INT32 HQA_MCU_RegRead(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 HQA_MCU_RegWrite(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - return Ret; -} - -static INT32 HQA_MCUTest(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *WRQ, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT16 ntStatus = 0x00; - return ntStatus; -} - -static HQA_CMD_HANDLER HQA_CMD_SET7[] = { - /* cmd id start from 0x2100 */ - HQA_MCU_RegRead, /* 0x2100 */ - HQA_MCU_RegWrite, /* 0x2101 */ - HQA_MCUTest, /* 0x2102 */ -}; - -static struct _HQA_CMD_TABLE HQA_CMD_TABLES[] = { - { - HQA_CMD_SET0, - sizeof(HQA_CMD_SET0) / sizeof(HQA_CMD_HANDLER), - 0x1000, - }, - { - HQA_CMD_SET1, - sizeof(HQA_CMD_SET1) / sizeof(HQA_CMD_HANDLER), - 0x1100, - }, - { - HQA_CMD_SET2, - sizeof(HQA_CMD_SET2) / sizeof(HQA_CMD_HANDLER), - 0x1200, - }, - { - HQA_CMD_SET3, - sizeof(HQA_CMD_SET3) / sizeof(HQA_CMD_HANDLER), - 0x1300, - }, - { - HQA_CMD_SET4, - sizeof(HQA_CMD_SET4) / sizeof(HQA_CMD_HANDLER), - 0x1400, - }, - { - HQA_CMD_SET5, - sizeof(HQA_CMD_SET5) / sizeof(HQA_CMD_HANDLER), - 0x1500, - }, -#ifdef TXBF_SUPPORT - { - HQA_TXBF_CMDS, - sizeof(HQA_TXBF_CMDS) / sizeof(HQA_CMD_HANDLER), - 0x1540, - }, -#ifdef CFG_SUPPORT_MU_MIMO - { - HQA_TXMU_CMDS, - sizeof(HQA_TXMU_CMDS) / sizeof(HQA_CMD_HANDLER), - 0x1560, - }, -#endif -#endif - { - HQA_ICAP_CMDS, - sizeof(HQA_ICAP_CMDS) / sizeof(HQA_CMD_HANDLER), - 0x1580, - }, - { - HQA_CMD_SET6, - sizeof(HQA_CMD_SET6) / sizeof(HQA_CMD_HANDLER), - 0x1600, - }, - { - HQA_CMD_SET7, - sizeof(HQA_CMD_SET7) / sizeof(HQA_CMD_HANDLER), - 0x2100, - }, -}; - -UINT32 HQA_CMDHandler(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *Wrq, - struct _HQA_CMD_FRAME *HqaCmdFrame) -{ - UINT32 Status = NDIS_STATUS_SUCCESS; - UINT16 CmdId; - UINT32 TableIndex = 0; - UINT32 ATEMagicNum = 0; - - ATEMagicNum = PKTL_TRAN_TO_HOST(HqaCmdFrame->MagicNo); - - if (ATEMagicNum != HQA_CMD_MAGIC_NO) - return TM_STATUS_NOTSUPPORT; - - CmdId = PKTS_TRAN_TO_HOST(HqaCmdFrame->Id); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Command_Id = 0x%04x, testmode_ioctl\n", __func__, - CmdId)); - - while (TableIndex < - (sizeof(HQA_CMD_TABLES) / sizeof(struct _HQA_CMD_TABLE))) { - UINT32 CmdIndex = 0; - - CmdIndex = CmdId - HQA_CMD_TABLES[TableIndex].CmdOffset; - - if (CmdIndex < HQA_CMD_TABLES[TableIndex].CmdSetSize) { - HQA_CMD_HANDLER *pCmdSet; - - pCmdSet = HQA_CMD_TABLES[TableIndex].CmdSet; - - if (pCmdSet[CmdIndex] != NULL) - Status = (*pCmdSet[CmdIndex])(pAd, Wrq, - HqaCmdFrame); - - break; - } - - TableIndex++; - } - - if (CmdId == HQA_CMD_REQ) { - HqaCmdFrame->Type = HQA_CMD_RSP; - /* HqaCmdFrame->Type = 0x8005; */ - } else - HqaCmdFrame->Type = TM_CMDRSP; - - return Status; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7615.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7615.c deleted file mode 100644 index 2fa03195c6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7615.c +++ /dev/null @@ -1,3592 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt7615.c -*/ - -#include "rt_config.h" -#include "chip/mt7615_cr.h" -#include "mcu/mt7615_firmware.h" -#include "mcu/mt7615_cr4_firmware.h" -#ifdef NEED_ROM_PATCH -#include "mcu/mt7615_rom_patch.h" -#endif /* NEED_ROM_PATCH */ - -#include "hdev/hdev_basic.h" - -/* ePAeLNA shall always be included as default */ -#include "eeprom/mt7615_e2p_ePAeLNA.h" - -#if defined(CONFIG_FIRST_IF_IPAILNA) || defined(CONFIG_SECOND_IF_IPAILNA) || \ - defined(CONFIG_THIRD_IF_IPAILNA) -#include "eeprom/mt7615_e2p_iPAiLNA.h" -#endif -#if defined(CONFIG_FIRST_IF_IPAELNA) || defined(CONFIG_SECOND_IF_IPAELNA) || \ - defined(CONFIG_THIRD_IF_IPAELNA) -#include "eeprom/mt7615_e2p_iPAeLNA.h" -#endif -#if defined(CONFIG_FIRST_IF_EPAILNA) || defined(CONFIG_SECOND_IF_EPAILNA) || \ - defined(CONFIG_THIRD_IF_EPAILNA) -#include "eeprom/mt7615_e2p_ePAiLNA.h" -#endif - -#ifdef CONFIG_AP_SUPPORT -#ifdef INTELP6_SUPPORT -#define DEFAULT_BIN_FILE "/nvram/MT7615_EEPROM_2G.bin" -#else -#define DEFAULT_BIN_FILE "/etc_ro/wlan/MT7615E_EEPROM1.bin" -#endif -#else -#define DEFAULT_BIN_FILE "/etc/MT7615E_EEPROM1.bin" -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef CONFIG_RT_SECOND_CARD -#ifdef INTELP6_SUPPORT -#define SECOND_BIN_FILE "/nvram/MT7615_EEPROM_5G.bin" -#else -#define SECOND_BIN_FILE "/etc_ro/wlan/MT7615E_EEPROM2.bin" -#endif -#endif /* CONFIG_RT_SECOND_CARD */ -#ifdef CONFIG_RT_THIRD_CARD -#define THIRD_BIN_FILE "/etc_ro/wlan/MT7615E_EEPROM3.bin" -#endif /* CONFIG_RT_THIRD_CARD */ - -#ifdef WIFI_SPECTRUM_SUPPORT -extern RBIST_DESC_T MT7615_SPECTRUM_DESC[]; -extern UINT8 MT7615_SpectrumBankNum; -#endif /* WIFI_SPECTRUM_SUPPORT */ - -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT -INT RecoveryCount[MAX_NUM_OF_INF] = { 0 }; -#endif -#endif - -UCHAR mt7615_ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 }; - -static VOID mt7615_bbp_adjust(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - /*do nothing, change to use radio_resource control*/ - /*here should do bbp setting only, bbp is full-offload to fw*/ -} - -#if defined(PRE_CAL_TRX_SET1_SUPPORT) || defined(RLM_CAL_CACHE_SUPPORT) || \ - defined(PRE_CAL_TRX_SET2_SUPPORT) -/* RXDCOC */ -UINT16 K_A20Freq[] = { 4980, 5805, 5905 }; -UINT16 K_A40Freq[] = { - 5190, 5230, 5270, 5310, 5350, 5390, 5430, 5470, 5510, - 5550, 5590, 5630, 5670, 5710, 5755, 5795, 5835, 5875 -}; /* delta should <=10 */ -UINT16 K_A80Freq[] = { 5210, 5290, 5370, 5450, 5530, 5610, 5690, 5775, 5855 }; -UINT16 K_G20Freq[] = { 2417, 2432, 2447, 2467 }; /* delta should <=5 */ -UINT16 K_AllFreq[] = { 4980, 5805, 5905, 5190, 5230, 5270, 5310, 5350, 5390, - 5430, 5470, 5510, 5550, 5590, 5630, 5670, 5710, 5755, - 5795, 5835, 5875, 5210, 5290, 5370, 5450, 5530, 5610, - 5690, 5775, 5855, 2417, 2432, 2447, 2467 }; - -UINT16 K_A20_SIZE = (sizeof(K_A20Freq) / sizeof(UINT16)); -UINT16 K_A40_SIZE = (sizeof(K_A40Freq) / sizeof(UINT16)); -UINT16 K_A80_SIZE = (sizeof(K_A80Freq) / sizeof(UINT16)); -UINT16 K_G20_SIZE = (sizeof(K_G20Freq) / sizeof(UINT16)); -UINT16 K_ALL_SIZE = (sizeof(K_AllFreq) / sizeof(UINT16)); - -/* TXDPD */ -UINT16 DPD_A20Freq[] = { 4920, 4940, 4960, 4980, 5040, 5060, 5080, 5180, 5200, - 5220, 5240, 5260, 5280, 5300, 5320, 5340, 5360, 5380, - 5400, 5420, 5440, 5460, 5480, 5500, 5520, 5540, 5560, - 5580, 5600, 5620, 5640, 5660, 5680, 5700, 5720, 5745, - 5765, 5785, 5805, 5825, 5845, 5865, 5885, 5905 }; -UINT16 DPD_G20Freq[] = { 2422, 2442, 2462 }; -UINT16 DPD_AllFreq[] = { 4920, 4940, 4960, 4980, 5040, 5060, 5080, 5180, - 5200, 5220, 5240, 5260, 5280, 5300, 5320, 5340, - 5360, 5380, 5400, 5420, 5440, 5460, 5480, 5500, - 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, - 5680, 5700, 5720, 5745, 5765, 5785, 5805, 5825, - 5845, 5865, 5885, 5905, 2422, 2442, 2462 }; - -UINT16 DPD_A20_SIZE = (sizeof(DPD_A20Freq) / sizeof(UINT16)); -UINT16 DPD_G20_SIZE = (sizeof(DPD_G20Freq) / sizeof(UINT16)); -UINT16 DPD_ALL_SIZE = (sizeof(DPD_AllFreq) / sizeof(UINT16)); -#endif - -#ifdef PRE_CAL_TRX_SET1_SUPPORT -void ShowDPDData(RTMP_ADAPTER *pAd, TXDPD_RESULT_T TxDPDResult) -{ - /* UINT i=0; */ - UINT j = 0; - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Currently not in FLASH or BIN MODE,return.\n", - __func__)); - return; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF0]: u4DPDG0_WF0_Prim = 0x%x\n", - TxDPDResult.u4DPDG0_WF0_Prim)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF1]: u4DPDG0_WF1_Prim = 0x%x\n", - TxDPDResult.u4DPDG0_WF1_Prim)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF2]: u4DPDG0_WF2_Prim = 0x%x\n", - TxDPDResult.u4DPDG0_WF2_Prim)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF2]: u4DPDG0_WF2_Sec = 0x%x\n", - TxDPDResult.u4DPDG0_WF2_Sec)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF3]: u4DPDG0_WF3_Prim = 0x%x\n", - TxDPDResult.u4DPDG0_WF3_Prim)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF3]: u4DPDG0_WF3_Sec = 0x%x\n", - TxDPDResult.u4DPDG0_WF3_Sec)); - - for (j = 0; j < 16; j++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF0]: ucDPDLUTEntry_WF0_B0_6[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF0_B0_6[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF0]: ucDPDLUTEntry_WF0_B16_23[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF0_B16_23[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF1]: ucDPDLUTEntry_WF1_B0_6[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF1_B0_6[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF1]: ucDPDLUTEntry_WF1_B16_23[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF1_B16_23[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF2]: ucDPDLUTEntry_WF2_B0_6[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF2_B0_6[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF2]: ucDPDLUTEntry_WF2_B16_23[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF2_B16_23[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF2]: ucDPDLUTEntry_WF2_B8_14[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF2_B8_14[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF2]: ucDPDLUTEntry_WF2_B24_31[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF2_B24_31[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF3]: ucDPDLUTEntry_WF3_B0_6[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF3_B0_6[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF3]: ucDPDLUTEntry_WF3_B16_23[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF3_B16_23[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF3]: ucDPDLUTEntry_WF3_B8_14[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF3_B8_14[j])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF3]: ucDPDLUTEntry_WF3_B24_31[%d] = 0x%x\n", j, - TxDPDResult.ucDPDLUTEntry_WF3_B24_31[j])); - } -} - -void ShowDCOCData(RTMP_ADAPTER *pAd, RXDCOC_RESULT_T RxDcocResult) -{ - UINT i = 0; - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Currently not in FLASH or BIN MODE,return.\n", - __func__)); - return; - } - - for (i = 0; i < 4; i++) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF0 SX0]: ucDCOCTBL_I_WF0_SX0_LNA[%d] = 0x%x \tucDCOCTBL_Q_WF0_SX0_LNA[%d] = 0x%x\n", - i, RxDcocResult.ucDCOCTBL_I_WF0_SX0_LNA[i], i, - RxDcocResult.ucDCOCTBL_Q_WF0_SX0_LNA[i])); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF0 SX2]: ucDCOCTBL_I_WF0_SX2_LNA[%d] = 0x%x \tucDCOCTBL_Q_WF0_SX2_LNA[%d] = 0x%x\n", - i, RxDcocResult.ucDCOCTBL_I_WF0_SX2_LNA[i], i, - RxDcocResult.ucDCOCTBL_Q_WF0_SX2_LNA[i])); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF1 SX0]: ucDCOCTBL_I_WF1_SX0_LNA[%d] = 0x%x \tucDCOCTBL_Q_WF1_SX0_LNA[%d] = 0x%x\n", - i, RxDcocResult.ucDCOCTBL_I_WF1_SX0_LNA[i], i, - RxDcocResult.ucDCOCTBL_Q_WF1_SX0_LNA[i])); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF1 SX2]: ucDCOCTBL_I_WF1_SX2_LNA[%d] = 0x%x \tucDCOCTBL_Q_WF1_SX2_LNA[%d] = 0x%x\n", - i, RxDcocResult.ucDCOCTBL_I_WF1_SX2_LNA[i], i, - RxDcocResult.ucDCOCTBL_Q_WF1_SX2_LNA[i])); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF2 SX0]: ucDCOCTBL_I_WF2_SX0_LNA[%d] = 0x%x \tucDCOCTBL_Q_WF2_SX0_LNA[%d] = 0x%x\n", - i, RxDcocResult.ucDCOCTBL_I_WF2_SX0_LNA[i], i, - RxDcocResult.ucDCOCTBL_Q_WF2_SX0_LNA[i])); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF2 SX2]: ucDCOCTBL_I_WF2_SX2_LNA[%d] = 0x%x \tucDCOCTBL_Q_WF2_SX2_LNA[%d] = 0x%x\n", - i, RxDcocResult.ucDCOCTBL_I_WF2_SX2_LNA[i], i, - RxDcocResult.ucDCOCTBL_Q_WF2_SX2_LNA[i])); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF3 SX0]: ucDCOCTBL_I_WF3_SX0_LNA[%d] = 0x%x \tucDCOCTBL_Q_WF3_SX0_LNA[%d] = 0x%x\n", - i, RxDcocResult.ucDCOCTBL_I_WF3_SX0_LNA[i], i, - RxDcocResult.ucDCOCTBL_Q_WF3_SX0_LNA[i])); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[WF3 SX2]: ucDCOCTBL_I_WF3_SX2_LNA[%d] = 0x%x \tucDCOCTBL_Q_WF3_SX2_LNA[%d] = 0x%x\n", - i, RxDcocResult.ucDCOCTBL_I_WF3_SX2_LNA[i], i, - RxDcocResult.ucDCOCTBL_Q_WF3_SX2_LNA[i])); - } -} - -BOOLEAN mt7615_dpd_check_illegal(RTMP_ADAPTER *pAd, - MT_SWITCH_CHANNEL_CFG SwChCfg, - UINT16 BW160Central) -{ - UINT16 CentralFreq = 0; - UINT8 i = 0; - BOOLEAN ChannelIsIllegal = FALSE; - - if (SwChCfg.Bw == BW_8080 || SwChCfg.Bw == BW_160) - CentralFreq = BW160Central * 5 + 5000; - else - CentralFreq = SwChCfg.CentralChannel * 5 + 5000; - - if (SwChCfg.Bw == BW_20) { - for (i = 0; i < DPD_ALL_SIZE; i++) { - if (CentralFreq == DPD_AllFreq[i]) - break; - } - - if (i == DPD_ALL_SIZE) - ChannelIsIllegal = TRUE; - } else if (SwChCfg.Bw == BW_40) { - for (i = 0; i < K_A40_SIZE; i++) { - if (CentralFreq == K_A40Freq[i]) - break; - } - - if (i == K_A40_SIZE) - ChannelIsIllegal = TRUE; - } else if (SwChCfg.Bw == BW_80 || SwChCfg.Bw == BW_8080) { - for (i = 0; i < K_A80_SIZE; i++) { - if (CentralFreq == K_A80Freq[i]) - break; - } - - if (i == K_A80_SIZE) - ChannelIsIllegal = TRUE; - } else if (SwChCfg.Bw == BW_160) { - if (BW160Central == 199) - ChannelIsIllegal = TRUE; - } - - if (ChannelIsIllegal) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : non-IEEE CH, ONLINE CAL, FREQ[%d] CANT FIND LEGAL CHANNEL TO APPLY, PLEASE CHECK!!\n", - __func__, CentralFreq)); - } - - return ChannelIsIllegal; -} - -void mt7615_apply_dpd(RTMP_ADAPTER *pAd, MT_SWITCH_CHANNEL_CFG SwChCfg, - UINT16 BW160Central, BOOLEAN bSecBW80) -{ - UINT8 i = 0; - UINT8 Band = 0; - UINT16 CentralFreq = 0; - ULONG Offset = 0; - TXDPD_RESULT_T TxDPDResult; - BOOLEAN toCR = TRUE; - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Currently not in FLASH or BIN MODE,return.\n", - __func__)); - return; - } - - if (SwChCfg.CentralChannel == 14) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() : CH 14 don't need DPD , return!!!\n", - __func__)); - return; - } else if (SwChCfg.CentralChannel < 14) { /* 2G */ - Band = GBAND; - - if (SwChCfg.CentralChannel >= 1 && SwChCfg.CentralChannel <= 4) - CentralFreq = 2422; - else if (SwChCfg.CentralChannel >= 5 && - SwChCfg.CentralChannel <= 9) - CentralFreq = 2442; - else if (SwChCfg.CentralChannel >= 10 && - SwChCfg.CentralChannel <= 13) - CentralFreq = 2462; - else - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() : can't find cent freq for CH %d , should not happen!!!\n", - __func__, SwChCfg.CentralChannel)); - } else { /* 5G */ - Band = ABAND; - - /* - * by the rule DE suggests, - * 1. BW20 directly apply , illegal channel online cal. - * 2. BW40/80/160 add center frequency by 10 MHz to find a nearest calibrated BW20 CH - * 3. if center freq + 10MHz = different group , then use center freq -10 MHz to apply - */ - - if (mt7615_dpd_check_illegal(pAd, SwChCfg, BW160Central) == - TRUE) { - MtCmdGetTXDPDCalResult(pAd, toCR, CentralFreq, - SwChCfg.Bw, Band, bSecBW80, TRUE, - &TxDPDResult); - return; - } - - if (SwChCfg.Bw == BW_20) - CentralFreq = SwChCfg.CentralChannel * 5 + 5000; - else if (SwChCfg.Bw == BW_160 || SwChCfg.Bw == BW_8080) { - UINT32 Central = BW160Central * 5 + 5000; - UINT32 CentralAdd10M = (BW160Central + 2) * 5 + 5000; - - if (ChannelFreqToGroup(Central) != - ChannelFreqToGroup(CentralAdd10M)) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("==== Different Group Central %d @ group %d Central+10 @ group %d !!\n", - Central, ChannelFreqToGroup(Central), - ChannelFreqToGroup(CentralAdd10M))); - CentralFreq = (BW160Central - 2) * 5 + 5000; - } else - CentralFreq = (BW160Central + 2) * 5 + 5000; - } else { - UINT32 Central = SwChCfg.CentralChannel * 5 + 5000; - UINT32 CentralAdd10M = - (SwChCfg.CentralChannel + 2) * 5 + 5000; - - if (ChannelFreqToGroup(Central) != - ChannelFreqToGroup(CentralAdd10M)) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("==== Different Group Central %d @ group %d Central+10 @ group %d !!\n", - Central, ChannelFreqToGroup(Central), - ChannelFreqToGroup(CentralAdd10M))); - CentralFreq = - (SwChCfg.CentralChannel - 2) * 5 + 5000; - } else - CentralFreq = - (SwChCfg.CentralChannel + 2) * 5 + 5000; - } - } - - /* Find offset base on CentralFreq */ - for (i = 0; i < DPD_ALL_SIZE; i++) { - if (DPD_AllFreq[i] == CentralFreq) - break; - } - - if (i == DPD_ALL_SIZE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : UNEXPECTED ONLINE CAL, FREQ[%d] CANT FIND LEGAL CHANNEL TO APPLY, PLEASE CHECK!!\n", - __func__, CentralFreq)); - /* send command to tell FW do online K */ - MtCmdGetTXDPDCalResult(pAd, toCR, CentralFreq, SwChCfg.Bw, Band, - bSecBW80, TRUE, &TxDPDResult); - return; - } - - if (i < TXDPD_PART1_LIMIT) { - Offset = i * TXDPD_SIZE; - memcpy(&TxDPDResult.u4DPDG0_WF0_Prim, - pAd->CalDPDAPart1Image + Offset, TXDPD_SIZE); - } else { - Offset = (i - TXDPD_PART1_LIMIT) * TXDPD_SIZE; - memcpy(&TxDPDResult.u4DPDG0_WF0_Prim, - pAd->CalDPDAPart2Image + Offset, TXDPD_SIZE); - } - - if (SwChCfg.Bw == BW_160 || SwChCfg.Bw == BW_8080) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() : reload 160 Central CH [%d] BW [%d] from cetral freq [%d] i[%d] offset [%x]\n", - __func__, BW160Central, SwChCfg.Bw, CentralFreq, i, - DPDPART1_OFFSET + i * TXDPD_SIZE)); - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() : reload Central CH [%d] BW [%d] from cetral freq [%d] i[%d] offset [%x]\n", - __func__, SwChCfg.CentralChannel, SwChCfg.Bw, - CentralFreq, i, DPDPART1_OFFSET + i * TXDPD_SIZE)); - } - - ShowDPDData(pAd, TxDPDResult); - MtCmdGetTXDPDCalResult(pAd, toCR, CentralFreq, SwChCfg.Bw, Band, - bSecBW80, FALSE, &TxDPDResult); -} - -void mt7615_apply_dcoc(RTMP_ADAPTER *pAd, MT_SWITCH_CHANNEL_CFG SwChCfg, - UINT16 BW160Central, BOOLEAN bSecBW80) -{ - UINT8 i = 0; - UINT8 Band = 0; - UINT16 CentralFreq = 0; - ULONG Offset = 0; - RXDCOC_RESULT_T RxDcocResult; - BOOLEAN toCR = TRUE; - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Currently not in FLASH or BIN MODE,return.\n", - __func__)); - return; - } - - /* - * 11j TODO - - * currently SwChCfg.Channel_Band is always 0 , can't judge 11j channels - * should add code below to convert to correct frequency if SwChCfg.Channel_Band is corrected. - */ - if (SwChCfg.CentralChannel <= 14) { /* 2G */ - Band = GBAND; - - if (SwChCfg.CentralChannel >= 1 && SwChCfg.CentralChannel <= 3) - CentralFreq = 2417; - else if (SwChCfg.CentralChannel >= 4 && - SwChCfg.CentralChannel <= 6) - CentralFreq = 2432; - else if (SwChCfg.CentralChannel >= 7 && - SwChCfg.CentralChannel <= 9) - CentralFreq = 2447; - else if (SwChCfg.CentralChannel >= 10 && - SwChCfg.CentralChannel <= 14) - CentralFreq = 2467; - else - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() : can't find cent freq for CH %d , should not happen!!!\n", - __func__, SwChCfg.CentralChannel)); - } else { /* 5G */ - Band = ABAND; - CentralFreq = SwChCfg.CentralChannel * 5 + 5000; - - if (SwChCfg.Bw == BW_160 || SwChCfg.Bw == BW_8080) - CentralFreq = BW160Central * 5 + 5000; - else if (SwChCfg.Bw == BW_20 && SwChCfg.CentralChannel == 161) - CentralFreq = 5805; - else if (SwChCfg.Bw == BW_20) { - /* find nearest BW40 central to apply */ - for (i = 0; i < K_A40_SIZE; i++) { - UINT delta = - (CentralFreq >= K_A40Freq[i]) ? - (CentralFreq - K_A40Freq[i]) : - (K_A40Freq[i] - CentralFreq); - - if (delta <= 10) { - CentralFreq = K_A40Freq[i]; - break; - } - } - - if (i == K_A40_SIZE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : UNEXPECTED. FREQ[%d] CANT FIND LEGAL CHANNEL TO APPLY, PLEASE CHECK!!\n", - __func__, CentralFreq)); - /* send command to tell FW do online K */ - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, - SwChCfg.Bw, Band, - bSecBW80, TRUE, - &RxDcocResult); - return; - } - } else if (SwChCfg.Bw == BW_40) { - /* prevent illegal channel */ - for (i = 0; i < K_A40_SIZE; i++) { - if (CentralFreq == K_A40Freq[i]) - break; - } - - if (i == K_A40_SIZE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : UNEXPECTED. FREQ[%d] @BW[%d] CANT FIND LEGAL CHANNEL TO APPLY, PLEASE CHECK!!\n", - __func__, CentralFreq, BW_40)); - /* send command to tell FW do online K */ - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, - SwChCfg.Bw, Band, - bSecBW80, TRUE, - &RxDcocResult); - return; - } - } else if (SwChCfg.Bw == BW_80) { - /* prevent illegal channel */ - for (i = 0; i < K_A80_SIZE; i++) { - if (CentralFreq == K_A80Freq[i]) - break; - } - - if (i == K_A80_SIZE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : UNEXPECTED. FREQ[%d] @BW[%d] CANT FIND LEGAL CHANNEL TO APPLY, PLEASE CHECK!!\n", - __func__, CentralFreq, BW_80)); - /* send command to tell FW do online K */ - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, - SwChCfg.Bw, Band, - bSecBW80, TRUE, - &RxDcocResult); - return; - } - } - } - - /* Find offset base on CentralFreq */ - for (i = 0; i < K_ALL_SIZE; i++) { - if (K_AllFreq[i] == CentralFreq) - break; - } - - if (i == K_ALL_SIZE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : UNEXPECTED. FREQ[%d] CANT FIND LEGAL CHANNEL TO APPLY, PLEASE CHECK!!\n", - __func__, CentralFreq)); - /* send command to tell FW do online K */ - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, SwChCfg.Bw, - Band, bSecBW80, TRUE, &RxDcocResult); - return; - } - - Offset = i * RXDCOC_SIZE; - - if (SwChCfg.Bw == BW_160 || SwChCfg.Bw == BW_8080) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() : reload 160 Central CH [%d] BW [%d] from cetral freq [%d] offset [%lx]\n", - __func__, BW160Central, SwChCfg.Bw, CentralFreq, - DCOC_FLASH_OFFSET + Offset)); - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() : reload Central CH [%d] BW [%d] from cetral freq [%d] offset [%lx]\n", - __func__, SwChCfg.CentralChannel, SwChCfg.Bw, - CentralFreq, DCOC_FLASH_OFFSET + Offset)); - } - - memcpy(&RxDcocResult.ucDCOCTBL_I_WF0_SX0_LNA[0], - pAd->CalDCOCImage + Offset, RXDCOC_SIZE); - ShowDCOCData(pAd, RxDcocResult); - MtCmdGetRXDCOCCalResult(pAd, toCR, CentralFreq, SwChCfg.Bw, Band, - bSecBW80, FALSE, &RxDcocResult); -} - -static BOOLEAN find_both_central_for_bw160(MT_SWITCH_CHANNEL_CFG SwChCfg, - UCHAR *CentPrim80, UCHAR *CentSec80) -{ - BOOLEAN found = FALSE; - - switch (SwChCfg.CentralChannel) { - case 50: - case 82: - case 114: - case 163: - if (SwChCfg.ControlChannel < SwChCfg.CentralChannel) { - *CentPrim80 = SwChCfg.CentralChannel - 8; - *CentSec80 = SwChCfg.CentralChannel + 8; - } else { - *CentPrim80 = SwChCfg.CentralChannel + 8; - *CentSec80 = SwChCfg.CentralChannel - 8; - } - - found = TRUE; - break; - - default: - *CentPrim80 = 199; - *CentSec80 = 199; - found = FALSE; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() : ERROR!!!! unknown bw160 central %d !!!! shall do online K\n", - __func__, SwChCfg.CentralChannel)); - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() : ControlChannel [%d], CentralChannel [%d] => PrimCentral [%d] , SecCentral [%d]\n", - __func__, SwChCfg.ControlChannel, SwChCfg.CentralChannel, - *CentPrim80, *CentSec80)); - return found; -} -void mt7615_apply_cal_data(RTMP_ADAPTER *pAd, MT_SWITCH_CHANNEL_CFG SwChCfg) -{ - USHORT doCal1 = 0; - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Currently not in FLASH or BIN MODE,return.\n", - __func__)); - return; - } - -#ifdef RTMP_FLASH_SUPPORT - - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - rtmp_ee_flash_read(pAd, 0x52, &doCal1); - -#endif - - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_ee_bin_read16(pAd, 0x52, &doCal1); - - if (/* pAd->bDCOCReloaded && */ (doCal1 & (1 << 1)) != - 0) { /* 0x52 bit 1 for Reload RXDCOC on/off */ - UCHAR CentPrim80 = 0, CentSec80 = 0; - - if (SwChCfg.Bw == BW_160) { - find_both_central_for_bw160(SwChCfg, &CentPrim80, - &CentSec80); - mt7615_apply_dcoc(pAd, SwChCfg, CentPrim80, FALSE); - mt7615_apply_dcoc(pAd, SwChCfg, CentSec80, TRUE); - } else if (SwChCfg.Bw == BW_8080) { - UINT abs_cent1 = ABS(SwChCfg.ControlChannel, - SwChCfg.CentralChannel); - UINT abs_cent2 = ABS(SwChCfg.ControlChannel, - SwChCfg.ControlChannel2); - - if (abs_cent1 < abs_cent2) { - /* prim 80 is CentralChannel */ - CentPrim80 = SwChCfg.CentralChannel; - CentSec80 = SwChCfg.ControlChannel2; - } else { - /* prim 80 is ControlChannel2 */ - CentPrim80 = SwChCfg.ControlChannel2; - CentSec80 = SwChCfg.CentralChannel; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("###### BW_8080 ControlCH %d ControlChannel2 %d CentralChannel %d [ABS %d , %d] => prim80 [%d] sec80 [%d] ############\n", - SwChCfg.ControlChannel, - SwChCfg.ControlChannel2, - SwChCfg.CentralChannel, abs_cent1, abs_cent2, - CentPrim80, CentSec80)); - mt7615_apply_dcoc(pAd, SwChCfg, CentPrim80, FALSE); - mt7615_apply_dcoc(pAd, SwChCfg, CentSec80, TRUE); - } else - mt7615_apply_dcoc(pAd, SwChCfg, 0, FALSE); - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() : eeprom 0x52 bit 1 is 0, do runtime cal , skip RX reload\n", - __func__)); - } - - if (/* pAd->bDPDReloaded && */ (doCal1 & (0x1)) != - 0) { /* 0x52 bit 0 for Reload TXDPD on/off */ - UCHAR CentPrim80 = 0, CentSec80 = 0; - - if (SwChCfg.Bw == BW_160) { - find_both_central_for_bw160(SwChCfg, &CentPrim80, - &CentSec80); - mt7615_apply_dpd(pAd, SwChCfg, CentPrim80, FALSE); - mt7615_apply_dpd(pAd, SwChCfg, CentSec80, TRUE); - } else if (SwChCfg.Bw == BW_8080) { - UINT abs_cent1 = ABS(SwChCfg.ControlChannel, - SwChCfg.CentralChannel); - UINT abs_cent2 = ABS(SwChCfg.ControlChannel, - SwChCfg.ControlChannel2); - - if (abs_cent1 < abs_cent2) { - /* prim 80 is CentralChannel */ - CentPrim80 = SwChCfg.CentralChannel; - CentSec80 = SwChCfg.ControlChannel2; - } else { - /* prim 80 is ControlChannel2 */ - CentPrim80 = SwChCfg.ControlChannel2; - CentSec80 = SwChCfg.CentralChannel; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("###### BW_8080 ControlCH %d ControlChannel2 %d CentralChannel %d [ABS %d , %d] => prim80 [%d] sec80 [%d] ############\n", - SwChCfg.ControlChannel, - SwChCfg.ControlChannel2, - SwChCfg.CentralChannel, abs_cent1, abs_cent2, - CentPrim80, CentSec80)); - mt7615_apply_dpd(pAd, SwChCfg, CentPrim80, FALSE); - mt7615_apply_dpd(pAd, SwChCfg, CentSec80, TRUE); - } else - mt7615_apply_dpd(pAd, SwChCfg, 0, FALSE); - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() : eeprom 0x52 bit 0 is 0, do runtime cal , skip TX reload\n", - __func__)); - } -} -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -static void mt7615_switch_channel(RTMP_ADAPTER *pAd, - MT_SWITCH_CHANNEL_CFG SwChCfg) -{ -#ifdef PRE_CAL_TRX_SET1_SUPPORT - mt7615_apply_cal_data(pAd, SwChCfg); -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - /*In Case of BW8080 Continous/NonContinous Channels of 80+80 is allowed by ACS*/ - - MtCmdChannelSwitch(pAd, SwChCfg); - - if (!SwChCfg.bScan) - MtCmdSetTxRxPath(pAd, SwChCfg); - - pAd->LatchRfRegs.Channel = SwChCfg.CentralChannel; - -#ifdef SINGLE_SKU_V2 -#ifdef TXBF_SUPPORT -#ifdef MT_MAC -#ifdef CONFIG_ATE -#if defined(MT7615) || defined(MT7622) - TxPowerBfBackoffParaCtrl(pAd, SwChCfg.Channel_Band, - SwChCfg.ControlChannel, SwChCfg.BandIdx); -#endif /* defined(MT7615) || defined(MT7622) */ -#endif /* CONFIG_ATE */ -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ -#endif /* SINGLE_SKU_V2 */ -} - -#ifdef NEW_SET_RX_STREAM -static INT mt7615_set_RxStream(RTMP_ADAPTER *pAd, UINT32 StreamNums, - UCHAR BandIdx) -{ - UINT32 path = 0; - UINT i; -#ifdef DBDC_MODE - - if (pAd->CommonCfg.dbdc_mode == TRUE) { - if (StreamNums > 2) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():illegal StreamNums(%d) for BandIdx(%d)!DBDC max can allow 2SS\n", - __func__, StreamNums, BandIdx)); - StreamNums = 2; - } - - for (i = 0; i < StreamNums; i++) - path |= 1 << i; - - if (BandIdx == 1) - path = path << 2; - } else -#endif /* DBDC_MODE */ - { - if (StreamNums > 4) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():illegal StreamNums(%d)\n", __func__, - StreamNums)); - StreamNums = 4; - } - - for (i = 0; i < StreamNums; i++) - path |= 1 << i; - } - - return MtCmdSetRxPath(pAd, path, BandIdx); -} -#endif - -static inline VOID bufferModeFieldSet(RTMP_ADAPTER *pAd, - EXT_CMD_EFUSE_BUFFER_MODE_T *pCmd, - UINT16 addr) -{ - UINT32 i = pCmd->ucCount; - pCmd->BinContent[i] = pAd->EEPROMImage[addr]; - pCmd->ucCount++; -} - -static VOID mt7615_bufferModeEfuseFill(RTMP_ADAPTER *pAd, - EXT_CMD_EFUSE_BUFFER_MODE_T *pCmd) -{ - UINT16 i = 0; - pCmd->ucCount = 0; - - for (i = EFUSE_CONTENT_START; i <= EFUSE_CONTENT_END; i++) - bufferModeFieldSet(pAd, pCmd, i); - - /*must minus last add*/ - pCmd->ucCount--; -} - -#ifdef CAL_FREE_IC_SUPPORT -static UINT32 ICAL[] = { 0x53, 0x54, 0x55, 0x56, 0x57, 0x5c, 0x5d, 0x62, - 0x63, 0x68, 0x69, 0x6e, 0x6f, 0x73, 0x74, 0x78, - 0x79, 0x82, 0x83, 0x87, 0x88, 0x8c, 0x8d, 0x91, - 0x92, 0x96, 0x97, 0x9b, 0x9c, 0xa0, 0xa1, 0xaa, - 0xab, 0xaf, 0xb0, 0xb4, 0xb5, 0xb9, 0xba, 0xf4, - 0xf7, 0xff, 0x140, 0x141, 0x145, 0x146, 0x14a, 0x14b, - 0x154, 0x155, 0x159, 0x15a, 0x15e, 0x15f, 0x163, 0x164, - 0x168, 0x169, 0x16d, 0x16e, 0x172, 0x173, 0x17c, 0x17d, - 0x181, 0x182, 0x186, 0x187, 0x18b, 0x18c }; -static UINT32 ICAL_NUM = (sizeof(ICAL) / sizeof(UINT32)); -static UINT32 ICAL_JUST_MERGE[] = { 0x110, 0x111, 0x112, 0x113, 0x114, - 0x115, 0x116, 0x117, 0x118, 0x1b5, - 0x1b6, 0x1b7, 0x3ac, 0x3ad, 0x3ae, - 0x3af, 0x3b0, 0x3b1, 0x3b2 }; -static UINT32 ICAL_JUST_MERGE_NUM = (sizeof(ICAL_JUST_MERGE) / sizeof(UINT32)); - -static inline BOOLEAN check_valid(RTMP_ADAPTER *pAd, UINT16 Offset) -{ - UINT16 Value = 0; - BOOLEAN NotValid; - - if ((Offset % 2) != 0) { - NotValid = rtmp_ee_efuse_read16(pAd, Offset - 1, &Value); - - if (NotValid) - return FALSE; - - if (((Value >> 8) & 0xff) == 0x00) - return FALSE; - } else { - NotValid = rtmp_ee_efuse_read16(pAd, Offset, &Value); - - if (NotValid) - return FALSE; - - if ((Value & 0xff) == 0x00) - return FALSE; - } - - return TRUE; -} - -static BOOLEAN mt7615_is_cal_free_ic(RTMP_ADAPTER *pAd) -{ - UINT32 i; - - for (i = 0; i < ICAL_NUM; i++) - if (check_valid(pAd, ICAL[i]) == FALSE) - return FALSE; - - return TRUE; -} - -static inline VOID cal_free_data_get_from_addr(RTMP_ADAPTER *ad, UINT16 Offset) -{ - UINT16 value; - - if ((Offset % 2) != 0) { - rtmp_ee_efuse_read16(ad, Offset - 1, &value); - ad->EEPROMImage[Offset] = (value >> 8) & 0xFF; - } else { - rtmp_ee_efuse_read16(ad, Offset, &value); - ad->EEPROMImage[Offset] = value & 0xFF; - } -} - -static VOID mt7615_cal_free_data_get(RTMP_ADAPTER *ad) -{ - UINT32 i; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__)); - - for (i = 0; i < ICAL_NUM; i++) - cal_free_data_get_from_addr(ad, ICAL[i]); - - for (i = 0; i < ICAL_JUST_MERGE_NUM; i++) - cal_free_data_get_from_addr(ad, ICAL_JUST_MERGE[i]); -} - -static BOOLEAN mt7615_check_is_cal_free_merge(RTMP_ADAPTER *pAd) -{ - UINT32 i; - UINT16 Offset; - UINT16 value; - - for (i = 0; i < ICAL_NUM; i++) { - Offset = ICAL[i]; - - if (Offset >= MAX_EEPROM_BUFFER_SIZE) - return FALSE; - - if ((Offset % 2) != 0) { - rtmp_ee_efuse_read16(pAd, Offset - 1, &value); - value = (value >> 8) & 0xFF; - } else { - rtmp_ee_efuse_read16(pAd, Offset, &value); - value = value & 0xFF; - } - - if (pAd->EEPROMImage[Offset] != value) - return FALSE; - } - - for (i = 0; i < ICAL_JUST_MERGE_NUM; i++) { - Offset = ICAL_JUST_MERGE[i]; - - if (Offset >= MAX_EEPROM_BUFFER_SIZE) - return FALSE; - - if ((Offset % 2) != 0) { - rtmp_ee_efuse_read16(pAd, Offset - 1, &value); - value = (value >> 8) & 0xFF; - } else { - rtmp_ee_efuse_read16(pAd, Offset, &value); - value = value & 0xFF; - } - - if (pAd->EEPROMImage[Offset] != value) - return FALSE; - } - - return TRUE; -} - -#endif /* CAL_FREE_IC_SUPPORT */ - -#ifdef RF_LOCKDOWN - -static UINT32 RFLOCK[] = { - 0x03F, 0x040, 0x041, 0x056, 0x057, 0x058, 0x059, 0x05A, 0x05B, 0x05C, - 0x05D, 0x05E, 0x05F, 0x060, 0x061, 0x062, 0x063, 0x064, 0x065, 0x066, - 0x067, 0x068, 0x069, 0x06A, 0x06B, 0x06C, 0x06D, 0x06E, 0x06F, 0x070, - 0x071, 0x072, 0x073, 0x074, 0x075, 0x076, 0x077, 0x078, 0x079, 0x07A, - 0x07B, 0x07C, 0x07D, 0x07E, 0x07F, 0x080, 0x081, 0x082, 0x083, 0x084, - 0x085, 0x086, 0x087, 0x088, 0x089, 0x08A, 0x08B, 0x08C, 0x08D, 0x08E, - 0x08F, 0x090, 0x091, 0x092, 0x093, 0x094, 0x095, 0x096, 0x097, 0x098, - 0x099, 0x09A, 0x09B, 0x09C, 0x09D, 0x09E, 0x09F, 0x0A0, 0x0A1, 0x0A2, - 0x0A3, 0x0A4, 0x0A5, 0x0A6, 0x0A7, 0x0A8, 0x0A9, 0x0AA, 0x0AB, 0x0AC, - 0x0AD, 0x0AE, 0x0AF, 0x0B0, 0x0B1, 0x0B2, 0x0B3, 0x0B4, 0x0B5, 0x0B6, - 0x0B7, 0x0B8, 0x0B9, 0x0BA, 0x0BB, 0x0BC, 0x0BD, 0x0BE, 0x0BF, 0x0C0, - 0x0C1, 0x0C2, 0x0C3, 0x0C4, 0x0C5, 0x0C6, 0x0C7, 0x0C8, 0x0C9, 0x0CA, - 0x0CB, 0x0CC, 0x0CD, 0x0CE, 0x0CF, 0x0D0, 0x0D1, 0x0D2, 0x0D3, 0x0D4, - 0x0D5, 0x0D6, 0x0D7, 0x0D8, 0x0D9, 0x0DA, 0x0DB, 0x0DC, 0x0DD, 0x0DE, - 0x0DF, 0x0E0, 0x0E1, 0x0E2, 0x0E3, 0x0E4, 0x0E5, 0x0E6, 0x0E7, 0x0E8, - 0x0E9, 0x0EA, 0x0EB, 0x0EC, 0x0ED, 0x0EE, 0x0EF, 0x0F0, 0x0F2, 0x0F3, - 0x118, 0x11C, 0x11D, 0x11E, 0x11F, 0x12C, 0x12D, 0x140, 0x141, 0x142, - 0x143, 0x144, 0x145, 0x146, 0x147, 0x148, 0x149, 0x14A, 0x14B, 0x14C, - 0x14D, 0x14E, 0x14F, 0x150, 0x151, 0x152, 0x153, 0x154, 0x155, 0x156, - 0x157, 0x158, 0x159, 0x15A, 0x15B, 0x15C, 0x15D, 0x15E, 0x15F, 0x160, - 0x161, 0x162, 0x163, 0x164, 0x165, 0x166, 0x167, 0x168, 0x169, 0x16A, - 0x16B, 0x16C, 0x16D, 0x16E, 0x16F, 0x170, 0x171, 0x172, 0x173, 0x174, - 0x175, 0x176, 0x177, 0x178, 0x179, 0x17A, 0x17B, 0x17C, 0x17D, 0x17E, - 0x17F, 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x187, 0x188, - 0x189, 0x18A, 0x18B, 0x18C, 0x18D, 0x18E, 0x18F, 0x190, 0x191, 0x192, - 0x193, 0x194, 0x195, 0x196, 0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, - 0x19D, 0x19E, 0x19F, 0x1A0, 0x1A2, 0x1A3, 0x1A4, 0x1A5, 0x1A6, 0x1A7, - 0x1A8, 0x1A9, 0x1AA, 0x1AB, 0x1AC, 0x1AD, 0x1AE, 0x1AF, 0x1B0, 0x1B1, - 0x1B2, 0x3AC, 0x3AD, 0x3AE, 0x3AF -}; - -static UINT32 RFLOCK_NUM = (sizeof(RFLOCK) / sizeof(UINT32)); - -static BOOLEAN mt7615_check_RF_lock_down(RTMP_ADAPTER *pAd) -{ - UCHAR block[EFUSE_BLOCK_SIZE] = ""; - USHORT offset = 0; - UINT isVaild = 0; - BOOL RFlockDown; - /* RF lock down column (0x12C) */ - offset = RF_LOCKDOWN_EEPROME_BLOCK_OFFSET; - MtCmdEfuseAccessRead(pAd, offset, &block[0], &isVaild); - - if (((block[RF_LOCKDOWN_EEPROME_COLUMN_OFFSET] & - RF_LOCKDOWN_EEPROME_BIT) >> - RF_LOCKDOWN_EEPROME_BIT_OFFSET)) - RFlockDown = TRUE; - else - RFlockDown = FALSE; - - return RFlockDown; -} - -static BOOLEAN mt7615_write_RF_lock_parameter(RTMP_ADAPTER *pAd, USHORT offset) -{ - BOOLEAN RFParaWrite; - BOOLEAN fgRFlock = FALSE; - UINT16 RFlock_index = 0; -#ifdef CAL_FREE_IC_SUPPORT - BOOLEAN fgCalFree = FALSE; - UINT16 CalFree_index = 0; -#endif /* CAL_FREE_IC_SUPPORT */ - - /* Priority rule 1: RF lock paramter or not? */ - /* Priority rule 2: Apply cal free or not? */ - /* Priority rule 3: Cal free parameter or not? */ - - /* Check whether the offset exist in RF Lock Table or not */ - for (RFlock_index = pAd->RFlockTempIdx; RFlock_index < RFLOCK_NUM; - RFlock_index++) { - if (RFLOCK[RFlock_index] == offset) { - fgRFlock = TRUE; - pAd->RFlockTempIdx = RFlock_index; - break; - } - } - -#ifdef CAL_FREE_IC_SUPPORT - - /* Check whether the offset exist in Cal Free Table or not */ - for (CalFree_index = pAd->CalFreeTempIdx; CalFree_index < ICAL_NUM; - CalFree_index++) { - if (ICAL[CalFree_index] == offset) { - fgCalFree = TRUE; - pAd->CalFreeTempIdx = CalFree_index; - break; - } - } - - /* Check whether the offset exist in Cal Free (Merge but not check) Table or not */ - for (CalFree_index = 0; CalFree_index < ICAL_JUST_MERGE_NUM; - CalFree_index++) { - if (ICAL_JUST_MERGE[CalFree_index] == offset) { - fgCalFree = TRUE; - break; - } - } - -#endif /* CAL_FREE_IC_SUPPORT */ - - /* Determine whether this offset needs to be written or not when RF lockdown */ - if (fgRFlock) { -#ifdef CAL_FREE_IC_SUPPORT - - if (pAd->fgCalFreeApply) { - if (fgCalFree) - RFParaWrite = FALSE; - else - RFParaWrite = TRUE; - } else - RFParaWrite = TRUE; - -#else - RFParaWrite = TRUE; -#endif - } else - RFParaWrite = FALSE; - - return RFParaWrite; -} - -static BOOLEAN mt7615_merge_RF_lock_parameter(RTMP_ADAPTER *pAd) -{ - UCHAR block[EFUSE_BLOCK_SIZE] = ""; - struct _RTMP_CHIP_CAP *chip_cap = hc_get_chip_cap(pAd->hdev_ctrl); - USHORT length = chip_cap->EEPROM_DEFAULT_BIN_SIZE; - UCHAR *ptr = pAd->EEPROMImage; - UCHAR index; - USHORT offset = 0; - UINT isVaild = 0; - BOOL WriteStatus; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - /* Merge RF parameters in Effuse to E2p buffer */ - if (chip_check_rf_lock_down(pAd)) { - /* Check Effuse Content block by block */ - for (offset = 0; offset < length; offset += EFUSE_BLOCK_SIZE) { - MtCmdEfuseAccessRead(pAd, offset, &block[0], &isVaild); - - /* Check the Needed contents are different and update the E2p content by Effuse */ - for (index = 0; index < EFUSE_BLOCK_SIZE; index++) { - /* Obtain the status of this E2p column need to write or not */ - WriteStatus = ops->write_RF_lock_parameter( - pAd, offset + index); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("Effuse[0x%04x]: Write(%d)\n", - offset + index, WriteStatus)); - - if ((block[index] != ptr[index]) && - (WriteStatus)) - ptr[index] = block[index]; - else - continue; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("index 0x%04x: ", offset + index)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("orignal E2p value=0x%04x, write value=0x%04x\n", - ptr[index], block[index])); - } - - ptr += EFUSE_BLOCK_SIZE; - } - } - - return TRUE; -} - -static UCHAR mt7615_Read_Effuse_parameter(RTMP_ADAPTER *pAd, USHORT offset) -{ - UCHAR block[EFUSE_BLOCK_SIZE] = ""; - UINT isVaild = 0; - UINT16 BlockOffset, IndexOffset; - UCHAR RFUnlock = 0xFF; - /* Obtain corresponding BlockOffset and IndexOffset for Effuse contents access */ - IndexOffset = offset % EFUSE_BLOCK_SIZE; - BlockOffset = offset - IndexOffset; - - /* Merge RF parameters in Effuse to E2p buffer */ - if (chip_check_rf_lock_down(pAd)) { - /* Check Effuse Content block by block */ - MtCmdEfuseAccessRead(pAd, BlockOffset, &block[0], &isVaild); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Read Effuse[0x%x]: 0x%x ", offset, - block[IndexOffset])); - return block[IndexOffset]; - } - - return RFUnlock; -} - -static BOOLEAN mt7615_Config_Effuse_Country(RTMP_ADAPTER *pAd) -{ - UCHAR Buffer0, Buffer1; - UCHAR CountryCode[2]; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - /* Read Effuse Content */ - if (ops->Read_Effuse_parameter != NULL) { - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - /* Country Region 2G */ - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - Buffer0 = ops->Read_Effuse_parameter( - pAd, COUNTRY_REGION_2G_EEPROME_OFFSET); - - /* Check the RF lock status */ - if (Buffer0 != 0xFF) { - /* Check Validation bit for content */ - if (((Buffer0) & (COUNTRY_REGION_VALIDATION_MASK)) >> - (COUNTRY_REGION_VALIDATION_OFFSET)) - pAd->CommonCfg.CountryRegion = - ((Buffer0) & - (COUNTRY_REGION_CONTENT_MASK)); - } - - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - /* Country Region 5G */ - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - Buffer1 = ops->Read_Effuse_parameter( - pAd, COUNTRY_REGION_5G_EEPROME_OFFSET); - - /* Check the RF lock status */ - if (Buffer1 != 0xFF) { - /* Check Validation bit for content */ - if (((Buffer1) & (COUNTRY_REGION_VALIDATION_MASK)) >> - (COUNTRY_REGION_VALIDATION_OFFSET)) - pAd->CommonCfg.CountryRegionForABand = - ((Buffer1) & - (COUNTRY_REGION_CONTENT_MASK)); - } - - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - /* Country Code */ - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - CountryCode[0] = ops->Read_Effuse_parameter( - pAd, COUNTRY_CODE_BYTE0_EEPROME_OFFSET); - CountryCode[1] = ops->Read_Effuse_parameter( - pAd, COUNTRY_CODE_BYTE1_EEPROME_OFFSET); - - /* Check the RF lock status */ - if ((CountryCode[0] != 0xFF) && (CountryCode[1] != 0xFF)) { - /* Check Validation for content */ - if ((CountryCode[0] != 0x00) && - (CountryCode[1] != 0x00)) { - pAd->CommonCfg.CountryCode[0] = CountryCode[0]; - pAd->CommonCfg.CountryCode[1] = CountryCode[1]; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("pAd->CommonCfg.CountryCode[0]: 0x%x, %c ", - pAd->CommonCfg.CountryCode[0], - pAd->CommonCfg.CountryCode[0])); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("pAd->CommonCfg.CountryCode[1]: 0x%x, %c ", - pAd->CommonCfg.CountryCode[1], - pAd->CommonCfg.CountryCode[1])); - } - } - } - - return TRUE; -} -#endif /* RF_LOCKDOWN */ - -#ifdef CFG_SUPPORT_MU_MIMO -#ifdef MANUAL_MU -INT mu_update_profile_tb(RTMP_ADAPTER *pAd, INT profile_id, UCHAR wlan_id) -{ -} - -INT mu_update_grp_table(RTMP_ADAPTER *pAd, INT grp_id) -{ - return TRUE; -} - -INT mu_update_cluster_tb(RTMP_ADAPTER *pAd, UCHAR c_id, UINT32 *m_ship, - UINT32 *u_pos) -{ - UINT32 entry_base, mac_val, offset; - ASSERT(c_id <= 31); - MAC_IO_READ32(pAd, MU_MUCR1, &mac_val); - - if (c_id < 16) - mac_val &= (~MUCR1_CLUSTER_TAB_REMAP_CTRL_MASK); - else - mac_val |= MUCR1_CLUSTER_TAB_REMAP_CTRL_MASK; - - MAC_IO_WRITE32(pAd, MU_MUCR1, mac_val); - entry_base = MU_CLUSTER_TABLE_BASE + (c_id & (~0x10)) * 24; - /* update membership */ - MAC_IO_WRITE32(pAd, entry_base + 0x0, m_ship[0]); - MAC_IO_WRITE32(pAd, entry_base + 0x4, m_ship[1]); - /* Update user position */ - MAC_IO_WRITE32(pAd, entry_base + 0x8, u_pos[0]); - MAC_IO_WRITE32(pAd, entry_base + 0xc, u_pos[1]); - MAC_IO_WRITE32(pAd, entry_base + 0x10, u_pos[2]); - MAC_IO_WRITE32(pAd, entry_base + 0x14, u_pos[3]); - return TRUE; -} - -INT mu_get_wlanId_ac_len(RTMP_ADAPTER *pAd, UINT32 wlan_id, UINT ac) -{ - return TRUE; -} - -INT mu_get_mu_tx_retry_cnt(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT mu_get_pfid_tx_stat(RTMP_ADAPTER *pAd) -{ -} - -INT mu_get_gpid_rate_per_stat(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT mt7615_mu_init(RTMP_ADAPTER *pAd) -{ - UINT32 mac_val; - /**************************************************************************** - MU Part - ****************************************************************************/ - /* After power on initial setting, AC legnth clear */ - MAC_IO_READ32(pAd, MU_MUCR4, &mac_val); - mac_val = 0x1; - MAC_IO_WRITE32(pAd, MU_MUCR4, mac_val); /* 820fe010= 0x0000_0001 */ - /* PFID table */ - MAC_IO_WRITE32(pAd, MU_PROFILE_TABLE_BASE + 0x0, - 0x1e000); /* 820fe780= 0x0001_e000 */ - MAC_IO_WRITE32(pAd, MU_PROFILE_TABLE_BASE + 0x4, - 0x1e103); /* 820fe784= 0x0001_e103 */ - MAC_IO_WRITE32(pAd, MU_PROFILE_TABLE_BASE + 0x8, - 0x1e205); /* 820fe788= 0x0001_e205 */ - MAC_IO_WRITE32(pAd, MU_PROFILE_TABLE_BASE + 0xc, - 0x1e306); /* 820fe78c= 0x0001_e306 */ - /* Cluster table */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x0, - 0x0); /* 820fe400= 0x0000_0000 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x8, - 0x0); /* 820fe408= 0x0000_0000 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x20, - 0x2); /* 820fe420= 0x0000_0002 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x28, - 0x0); /* 820fe428= 0x0000_0000 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x40, - 0x2); /* 820fe440= 0x0000_0002 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x48, - 0x4); /* 820fe448= 0x0000_0004 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x60, - 0x0); /* 820fe460= 0x0000_0000 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x68, - 0x0); /* 820fe468= 0x0000_0000 */ - /* Group rate table */ - MAC_IO_WRITE32(pAd, MU_GRP_TABLE_RATE_MAP + 0x0, - 0x4109); /* 820ff000= 0x0000_4109 */ - MAC_IO_WRITE32(pAd, MU_GRP_TABLE_RATE_MAP + 0x4, - 0x99); /* 820ff004= 0x0000_0099 */ - MAC_IO_WRITE32(pAd, MU_GRP_TABLE_RATE_MAP + 0x8, - 0x800000f0); /* 820ff008= 0x8000_00f0 */ - MAC_IO_WRITE32(pAd, MU_GRP_TABLE_RATE_MAP + 0xc, - 0x99); /* 820ff00c= 0x0000_0099 */ - /* SU Tx minimum setting */ - MAC_IO_WRITE32(pAd, MU_MUCR2, 0x10000001); /* 820fe008= 0x1000_0001 */ - /* MU max group search entry = 1 group entry */ - MAC_IO_WRITE32(pAd, MU_MUCR1, 0x0); /* 820fe004= 0x0000_0000 */ - /* MU enable */ - MAC_IO_READ32(pAd, MU_MUCR0, &mac_val); - mac_val |= 1; - MAC_IO_WRITE32(pAd, MU_MUCR0, 0x1); /* 820fe000= 0x1000_0001 */ - /**************************************************************************** - M2M Part - ****************************************************************************/ - /* Enable M2M MU temp mode */ - MAC_IO_READ32(pAd, RMAC_M2M_BAND_CTRL, &mac_val); - mac_val |= (1 << 16); - MAC_IO_WRITE32(pAd, RMAC_M2M_BAND_CTRL, mac_val); - /**************************************************************************** - AGG Part - ****************************************************************************/ - /* 820f20e0[15] = 1 or 0 all need to be verified, because - a). if primary is the fake peer, and peer will not ACK to us, cannot setup the TxOP - b). Or can use CTS2Self to setup the TxOP - */ - MAC_IO_READ32(pAd, AGG_MUCR, &mac_val); - mac_val &= (~MUCR_PRIM_BAR_MASK); - /* mac_val |= (1 << MUCR_PRIM_BAR_BIT); */ - MAC_IO_WRITE32(pAd, AGG_MUCR, mac_val); /* 820fe000= 0x1000_0001 */ - return TRUE; -} -#endif /* MANUAL_MU */ -#endif /* CFG_SUPPORT_MU_MIMO */ - -#ifndef MAC_INIT_OFFLOAD -#endif /* MAC_INIT_OFFLOAD */ - -#ifdef CONFIG_RALINK_MT7621 -static VOID mt7615_hif_set_pcie_read_params(RTMP_ADAPTER *pAd) -{ - UINT32 reg_val; - - HIF_IO_READ32(pAd, PCI_CFG_DEVICE_CONTROL, ®_val); - reg_val &= PCI_CFG_MAX_PAYLOAD_SIZE_UMASK; - reg_val &= PCI_CFG_MAX_READ_REQ_UMASK; - reg_val |= (PCI_CFG_MAX_PAYLOAD_SIZE_4K | PCI_CFG_MAX_READ_REQ_4K); - - HIF_IO_WRITE32(pAd, PCI_CFG_DEVICE_CONTROL, reg_val); - - HIF_IO_READ32(pAd, PCI_K_CNT2, ®_val); - reg_val &= K_CNT_MAX_PAYLOAD_SIZE_UMASK; - reg_val |= (K_CNT_MAX_PAYLOAD_SIZE_4K); - HIF_IO_WRITE32(pAd, PCI_K_CNT2, reg_val); - - HIF_IO_READ32(pAd, PCI_K_CONF_FUNC0_4, ®_val); - reg_val &= K_CONF_MAX_PAYLOAD_SIZE_UMASK; - reg_val |= (K_CONF_MAX_PAYLOAD_SIZE_4K); - HIF_IO_WRITE32(pAd, PCI_K_CONF_FUNC0_4, reg_val); - - HIF_IO_READ32(pAd, MT_WPDMA_PAUSE_RX_Q_TH10, ®_val); - reg_val &= TX_PRE_ADDR_ALIGN_MODE_UMASK; - HIF_IO_WRITE32(pAd, MT_WPDMA_PAUSE_RX_Q_TH10, reg_val); -} -#endif - -static VOID mt7615_init_mac_cr(RTMP_ADAPTER *pAd) -{ - UINT32 mac_val; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s()-->\n", __func__)); - -#ifdef CONFIG_RALINK_MT7621 - mt7615_hif_set_pcie_read_params(pAd); -#endif - -#ifndef MAC_INIT_OFFLOAD - /* Set TxFreeEvent packet only go through CR4 */ - HW_IO_READ32(pAd, PLE_HIF_REPORT, &mac_val); - mac_val |= 0x1; - HW_IO_WRITE32(pAd, PLE_HIF_REPORT, mac_val); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Set TxRxEventPkt path 0x%0x = 0x%08x\n", __func__, - PLE_HIF_REPORT, mac_val)); - /* Set PP Flow control */ - HW_IO_READ32(pAd, PP_PAGECTL_0, &mac_val); - mac_val &= ~(PAGECTL_0_PSE_PG_CNT_MASK); - mac_val |= 0x30; - HW_IO_WRITE32(pAd, PP_PAGECTL_0, mac_val); - HW_IO_READ32(pAd, PP_PAGECTL_1, &mac_val); - mac_val &= ~(PAGECTL_1_PLE_PG_CNT_MASK); - mac_val |= 0x10; - HW_IO_WRITE32(pAd, PP_PAGECTL_1, mac_val); - HW_IO_READ32(pAd, PP_PAGECTL_2, &mac_val); - mac_val &= ~(PAGECTL_2_CUT_PG_CNT_MASK); - mac_val |= 0x30; - HW_IO_WRITE32(pAd, PP_PAGECTL_2, mac_val); - /* Check PP CT setting */ - HW_IO_READ32(pAd, PP_RXCUTDISP, &mac_val); - /* mac_val |= 0x2; */ - /* RTMP_IO_WRITE32(pAd, mac_reg, mac_val); */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Get CutThroughPathController CR 0x%0x = 0x%08x\n", - __func__, PP_RXCUTDISP, mac_val)); -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else - /* TxS Setting */ - InitTxSTypeTable(pAd); -#endif - MtAsicSetTxSClassifyFilter(pAd, TXS2HOST, TXS2H_QID1, TXS2HOST_AGGNUMS, - 0x00, 0); -#ifdef DBDC_MODE - MtAsicSetTxSClassifyFilter(pAd, TXS2HOST, TXS2H_QID1, TXS2HOST_AGGNUMS, - 0x00, 1); -#endif /*DBDC_MODE*/ -#endif /*MAC_INIT_OFFLOAD*/ - /* MAC D0 2x / MAC D0 1x clock enable */ - MAC_IO_READ32(pAd, CFG_CCR, &mac_val); - mac_val |= (BIT31 | BIT25); - MAC_IO_WRITE32(pAd, CFG_CCR, mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MAC D0 2x 1x initial(val=%x)\n", __func__, mac_val)); -#ifdef DBDC_MODE - MAC_IO_READ32(pAd, CFG_CCR, &mac_val); - mac_val |= (BIT30 | BIT24); - MAC_IO_WRITE32(pAd, CFG_CCR, mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MAC D1 2x 1x initial(val=%x)\n", __func__, mac_val)); -#endif /* DBDC_MODE */ - /* Disable RX Header Translation */ - MAC_IO_READ32(pAd, DMA_DCR0, &mac_val); - mac_val &= - ~(DMA_DCR0_RX_HDR_TRANS_EN_BIT | - DMA_DCR0_RX_HDR_TRANS_MODE_BIT | DMA_DCR0_RX_RM_VLAN_BIT | - DMA_DCR0_RX_INS_VLAN_BIT | DMA_DCR0_RX_HDR_TRANS_CHK_BSSID); -#ifdef HDR_TRANS_RX_SUPPORT - if (IS_ASIC_CAP(pAd, fASIC_CAP_RX_HDR_TRANS)) { - UINT32 mac_val2; - mac_val |= DMA_DCR0_RX_HDR_TRANS_EN_BIT; - /* TODO: UnifiedSW, take care about Windows for translation mode! */ - /* mac_val |= DMA_DCR0_RX_HDR_TRANS_MODE_BIT; */ - mac_val |= DMA_DCR0_RX_HDR_TRANS_CHK_BSSID | - DMA_DCR0_RX_RM_VLAN_BIT; - MAC_IO_READ32(pAd, DMA_DCR1, &mac_val2); - mac_val2 |= RHTR_AMS_VLAN_EN; - MAC_IO_WRITE32(pAd, DMA_DCR1, mac_val2); - } - -#endif /* HDR_TRANS_RX_SUPPORT */ - MAC_IO_WRITE32(pAd, DMA_DCR0, mac_val); - /* CCA Setting */ - MAC_IO_READ32(pAd, TMAC_TRCR0, &mac_val); - mac_val &= ~CCA_SRC_SEL_MASK; - mac_val |= CCA_SRC_SEL(0x2); - mac_val &= ~CCA_SEC_SRC_SEL_MASK; - mac_val |= CCA_SEC_SRC_SEL(0x0); - MAC_IO_WRITE32(pAd, TMAC_TRCR0, mac_val); - MAC_IO_READ32(pAd, TMAC_TRCR0, &mac_val); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): TMAC_TRCR0=0x%x\n", __func__, mac_val)); -#ifdef DBDC_MODE - MAC_IO_WRITE32(pAd, TMAC_TRCR1, mac_val); - MAC_IO_READ32(pAd, TMAC_TRCR1, &mac_val); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): TMAC_TRCR1=0x%x\n", __func__, mac_val)); -#endif /*DBDC_MODE*/ - /* ---Add by shiang for MT7615 RFB ED issue */ - /* Set BAR rate as 0FDM 6M default, remove after fw set */ - MAC_IO_WRITE32(pAd, AGG_ACR0, 0x04b00496); - MAC_IO_WRITE32(pAd, AGG_ACR1, 0x04b00496); - /*Add by Star for zero delimiter*/ - MAC_IO_READ32(pAd, TMAC_CTCR0, &mac_val); - mac_val &= ~INS_DDLMT_REFTIME_MASK; - mac_val |= INS_DDLMT_REFTIME(0x3f); - mac_val |= DUMMY_DELIMIT_INSERTION; - mac_val |= INS_DDLMT_DENSITY(3); - MAC_IO_WRITE32(pAd, TMAC_CTCR0, mac_val); - MAC_IO_READ32(pAd, DMA_BN0TCFR0, &mac_val); - mac_val &= ~TXS_BAF; - MAC_IO_WRITE32(pAd, DMA_BN0TCFR0, mac_val); - - /* Temporary setting for RTS */ - /*if no protect should enable for CTS-2-Self, WHQA_00025629*/ - if (MTK_REV_GTE(pAd, MT7615, MT7615E1) && - MTK_REV_LT(pAd, MT7615, MT7615E3) && pAd->CommonCfg.dbdc_mode) - MAC_IO_WRITE32(pAd, AGG_PCR1, 0xfe0fffff); - else { - MAC_IO_WRITE32(pAd, AGG_PCR1, - 0x0400092b); /* sync MT7615 MP2.1 */ - MAC_IO_READ32(pAd, AGG_SCR, &mac_val); - mac_val |= NLNAV_MID_PTEC_DIS; - MAC_IO_WRITE32(pAd, AGG_SCR, mac_val); - } - - /*Default disable rf low power beacon mode*/ -#define WIFI_SYS_PHY 0x10000 -#define RF_LOW_BEACON_BAND0 (WIFI_SYS_PHY + 0x1900) -#define RF_LOW_BEACON_BAND1 (WIFI_SYS_PHY + 0x1d00) - PHY_IO_READ32(pAd, RF_LOW_BEACON_BAND0, &mac_val); - mac_val &= ~(0x3 << 8); - mac_val |= (0x2 << 8); - PHY_IO_WRITE32(pAd, RF_LOW_BEACON_BAND0, mac_val); - PHY_IO_READ32(pAd, RF_LOW_BEACON_BAND1, &mac_val); - mac_val &= ~(0x3 << 8); - mac_val |= (0x2 << 8); - PHY_IO_WRITE32(pAd, RF_LOW_BEACON_BAND1, mac_val); -} - -static VOID MT7615BBPInit(RTMP_ADAPTER *pAd) -{ - BOOLEAN isDBDC = FALSE, band_vld[2]; - INT idx, cbw[2] = { 0 }; - INT cent_ch[2] = { 0 }, prim_ch[2] = { 0 }, prim_ch_idx[2] = { 0 }; - INT band[2] = { 0 }; - INT txStream[2] = { 0 }; - UCHAR use_bands; - band_vld[0] = TRUE; - cbw[0] = RF_BW_20; - cent_ch[0] = 1; - prim_ch[0] = 1; - band[0] = BAND_24G; - txStream[0] = 2; -#ifdef DOT11_VHT_AC - prim_ch_idx[0] = vht_prim_ch_idx(cent_ch[0], prim_ch[0], cbw[0]); -#endif /* DOT11_VHT_AC */ - - /* Disable PHY shaping filter for Japan Region */ - if (pAd->CommonCfg.RDDurRegion == JAP) - MtCmdPhyShapingFilterDisable(pAd); - - band_vld[1] = FALSE; - use_bands = 1; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():BBP Initialization.....\n", __func__)); - - for (idx = 0; idx < 2; idx++) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBand %d: valid=%d, isDBDC=%d, Band=%d, CBW=%d, CentCh/PrimCh=%d/%d, prim_ch_idx=%d, txStream=%d\n", - idx, band_vld[idx], isDBDC, band[idx], cbw[idx], - cent_ch[idx], prim_ch[idx], prim_ch_idx[idx], - txStream[idx])); - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() todo\n", __func__)); -} - -static void mt7615_init_rf_cr(RTMP_ADAPTER *ad) -{ -} - -/* Read power per rate */ -void mt7615_get_tx_pwr_per_rate(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() todo\n", __func__)); -} - -void mt7615_get_tx_pwr_info(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() todo\n", __func__)); -} - -static void mt7615_antenna_default_reset(struct _RTMP_ADAPTER *pAd, - EEPROM_ANTENNA_STRUC *pAntenna) -{ - USHORT value; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 max_nss = cap->max_nss; - POS_COOKIE pObj; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - if (pObj->DeviceID == NIC7611_PCIe_DEVICE_ID) - pAd->RfIcType = RFIC_7611; - - pAntenna->word = 0; - pAd->RfIcType = RFIC_7615; - pAntenna->field.TxPath = - (pAd->EEPROMDefaultValue[EEPROM_NIC_CFG1_OFFSET] >> 4) & 0x0F; - pAntenna->field.RxPath = - pAd->EEPROMDefaultValue[EEPROM_NIC_CFG1_OFFSET] & 0x0F; - - if (pAntenna->field.TxPath > max_nss) - pAntenna->field.TxPath = max_nss; - - if (pAntenna->field.RxPath > max_nss) - pAntenna->field.RxPath = max_nss; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): TxPath = %d, RxPath = %d\n", __func__, - pAntenna->field.TxPath, pAntenna->field.RxPath)); - -#ifdef DBDC_MODE - if (max_nss == 4) { - RT28xx_EEPROM_READ16(pAd, EEPROM_DBDC_ANTENNA_CFG_OFFSET, - value); - value &= 0xFF; - pAd->dbdc_band0_rx_path = - (value & DBDC_BAND0_RX_MASK) >> DBDC_BAND0_RX_OFFSET; - pAd->dbdc_band0_tx_path = - (value & DBDC_BAND0_TX_MASK) >> DBDC_BAND0_TX_OFFSET; - pAd->dbdc_band1_rx_path = - (value & DBDC_BAND1_RX_MASK) >> DBDC_BAND1_RX_OFFSET; - pAd->dbdc_band1_tx_path = - (value & DBDC_BAND1_TX_MASK) >> DBDC_BAND1_TX_OFFSET; - - if ((pAd->dbdc_band0_rx_path == 0) || - (pAd->dbdc_band0_rx_path > 2)) - pAd->dbdc_band0_rx_path = 2; - - if ((pAd->dbdc_band0_tx_path == 0) || - (pAd->dbdc_band0_tx_path > 2)) - pAd->dbdc_band0_tx_path = 2; - - if ((pAd->dbdc_band1_rx_path == 0) || - (pAd->dbdc_band1_rx_path > 2)) - pAd->dbdc_band1_rx_path = 2; - - if ((pAd->dbdc_band1_tx_path == 0) || - (pAd->dbdc_band1_tx_path > 2)) - pAd->dbdc_band1_tx_path = 2; - - } else { - pAd->dbdc_band0_rx_path = 1; - pAd->dbdc_band0_tx_path = 1; - pAd->dbdc_band1_rx_path = 1; - pAd->dbdc_band1_tx_path = 1; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): DBDC BAND0 TxPath = %d, RxPath = %d\n", __func__, - pAd->dbdc_band0_tx_path, pAd->dbdc_band0_rx_path)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): DBDC BAND1 TxPath = %d, RxPath = %d\n", __func__, - pAd->dbdc_band1_tx_path, pAd->dbdc_band1_rx_path)); -#endif -} - -static VOID mt7615_fw_prepare(RTMP_ADAPTER *pAd) -{ - struct fwdl_ctrl *ctrl = &pAd->MCUCtrl.fwdl_ctrl; - -#ifdef NEED_ROM_PATCH - ctrl->patch_profile[WM_CPU].source.header_ptr = mt7615_rom_patch; - ctrl->patch_profile[WM_CPU].source.header_len = - sizeof(mt7615_rom_patch); - ctrl->patch_profile[WM_CPU].source.bin_name = - MT7615_ROM_PATCH_BIN_FILE_NAME; -#endif - - ctrl->fw_profile[WM_CPU].source.header_ptr = MT7615_FirmwareImage; - ctrl->fw_profile[WM_CPU].source.header_len = - sizeof(MT7615_FirmwareImage); - ctrl->fw_profile[WM_CPU].source.bin_name = MT7615_BIN_FILE_NAME; - - ctrl->fw_profile[WA_CPU].source.header_ptr = MT7615_CR4_FirmwareImage; - ctrl->fw_profile[WA_CPU].source.header_len = - sizeof(MT7615_CR4_FirmwareImage); - ctrl->fw_profile[WA_CPU].source.bin_name = ""; -} -static VOID mt7615_fwdl_datapath_setup(RTMP_ADAPTER *pAd, BOOLEAN init) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (init == TRUE) - ops->pci_kick_out_cmd_msg = AndesMTPciKickOutCmdMsgFwDlRing; - else - ops->pci_kick_out_cmd_msg = AndesMTPciKickOutCmdMsg; - -#ifdef CONFIG_RALINK_MT7621 - /* - * Need to limit PDMA Tx burst size to 128 byte for MT7621 FW DL - * and restore to 256 byte afterward. - */ - if (init == TRUE) { - WPDMA_GLO_CFG_STRUC GloCfg; - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); - GloCfg.MT7615_E3_field.tx_bt_size_bit0 = 1; - GloCfg.MT7615_E3_field.tx_bt_size_bit21 = 1; - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, GloCfg.word); - } else { - WPDMA_GLO_CFG_STRUC GloCfg; - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); - GloCfg.MT7615_E3_field.tx_bt_size_bit0 = 0; - GloCfg.MT7615_E3_field.tx_bt_size_bit21 = 2; - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, GloCfg.word); - } -#endif -} - -#ifdef DBDC_MODE -static UCHAR MT7615BandGetByIdx(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - switch (BandIdx) { - case 0: - return RFIC_DUAL_BAND; - break; - - case 1: - return RFIC_5GHZ; - break; - - default: - return RFIC_DUAL_BAND; - } -} -#endif - -void mt7615_heart_beat_check(RTMP_ADAPTER *pAd) -{ -#define HEART_BEAT_CHECK_PERIOD 30 -#define N9_HEART_BEAT_ADDR 0xc2ec /* 0x820682ec, PSE dummy CR */ -#define CR4_HEART_BEAT_ADDR 0x80200 - UINT32 mac_val; - UINT8 cr4_detect = FALSE; - UINT8 n9_detect = FALSE; - RTMP_STRING *str = NULL; - UINT32 RestoreValue; -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - UINT idx = multi_inf_get_idx(pAd); -#endif -#endif - if (((pAd->Mlme.PeriodicRound % HEART_BEAT_CHECK_PERIOD) == 0) -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - || (pAd->ErrRecoveryCheck != RecoveryCount[idx]) -#endif -#endif - - ) { -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - if (pAd->ErrRecoveryCheck != RecoveryCount[idx]) { - RecoveryCount[idx] = pAd->ErrRecoveryCheck; - goto recoverycheck; - } -#endif -#endif - if (pAd->heart_beat_stop == TRUE) - return; - - MAC_IO_READ32(pAd, N9_HEART_BEAT_ADDR, &mac_val); - - if (mac_val == pAd->pre_n9_heart_beat_cnt) - pAd->pre_n9_heart_beat_cnt = ~mac_val; - else if (~mac_val == pAd->pre_n9_heart_beat_cnt) - n9_detect = TRUE; - else - pAd->pre_n9_heart_beat_cnt = mac_val; - - /*Wrong : MAC_IO_READ32(pAd, CR4_HEART_BEAT_ADDR, &mac_val); - CR4 Heart Beat cannot read directly, need remap HW. */ - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, 0x82000000); - RTMP_IO_READ32(pAd, CR4_HEART_BEAT_ADDR, &mac_val); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - - if (mac_val == pAd->pre_cr4_heart_beat_cnt) - pAd->pre_cr4_heart_beat_cnt = ~mac_val; - else if (~mac_val == pAd->pre_cr4_heart_beat_cnt) - cr4_detect = TRUE; - else - pAd->pre_cr4_heart_beat_cnt = mac_val; - - if (n9_detect && cr4_detect) - str = "N9 and CR4 heart beat stop!!\n"; - else if (n9_detect) - str = "N9 heart beat stop!!\n"; - else if (cr4_detect) - str = "CR4 heart beat stop!!\n"; -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - recoverycheck: - if (pAd->ErrRecoveryCheck > 5) - str = "IntelP6 PCI stop!!\n"; -#endif -#endif - - if (str != NULL) { - pAd->heart_beat_stop = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s]:%s", RtmpOsGetNetDevName(pAd->net_dev), - str)); -#ifdef MT_FDB - show_fdb_n9_log(pAd, NULL); - show_fdb_cr4_log(pAd, NULL); -#endif /* MT_FDB */ -#ifdef ERR_RECOVERY - ser_sys_reset(str); -#endif - } - } -} - -#ifdef TXBF_SUPPORT -void mt7615_setETxBFCap(IN RTMP_ADAPTER *pAd, IN TXBF_STATUS_INFO *pTxBfInfo) -{ - HT_BF_CAP *pTxBFCap = pTxBfInfo->pHtTxBFCap; - - if (pTxBfInfo->cmmCfgETxBfEnCond > 0) { - switch (pTxBfInfo->cmmCfgETxBfEnCond) { - case SUBF_ALL: - default: - pTxBFCap->RxNDPCapable = TRUE; - pTxBFCap->TxNDPCapable = - (pTxBfInfo->ucRxPathNum > 1) ? TRUE : FALSE; - pTxBFCap->ExpNoComSteerCapable = FALSE; - pTxBFCap->ExpComSteerCapable = - TRUE; /* !pTxBfInfo->cmmCfgETxBfNoncompress; */ - pTxBFCap->ExpNoComBF = - 0; /* HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->ExpComBF = - HT_ExBF_FB_CAP_IMMEDIATE; /* pTxBfInfo->cmmCfgETxBfNoncompress? HT_ExBF_FB_CAP_NONE: HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->MinGrouping = 3; - pTxBFCap->NoComSteerBFAntSup = 0; - pTxBFCap->ComSteerBFAntSup = 3; - pTxBFCap->TxSoundCapable = - FALSE; /* Support staggered sounding frames */ - pTxBFCap->ChanEstimation = pTxBfInfo->ucRxPathNum - 1; - break; - - case SUBF_BFER: - pTxBFCap->RxNDPCapable = FALSE; - pTxBFCap->TxNDPCapable = - (pTxBfInfo->ucRxPathNum > 1) ? TRUE : FALSE; - pTxBFCap->ExpNoComSteerCapable = FALSE; - pTxBFCap->ExpComSteerCapable = - TRUE; /* !pTxBfInfo->cmmCfgETxBfNoncompress; */ - pTxBFCap->ExpNoComBF = - 0; /* HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->ExpComBF = - HT_ExBF_FB_CAP_IMMEDIATE; /* pTxBfInfo->cmmCfgETxBfNoncompress? HT_ExBF_FB_CAP_NONE: HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->MinGrouping = 3; - pTxBFCap->NoComSteerBFAntSup = 0; - pTxBFCap->ComSteerBFAntSup = 3; - pTxBFCap->TxSoundCapable = - FALSE; /* Support staggered sounding frames */ - pTxBFCap->ChanEstimation = pTxBfInfo->ucRxPathNum - 1; - break; - - case SUBF_BFEE: - pTxBFCap->RxNDPCapable = TRUE; - pTxBFCap->TxNDPCapable = FALSE; - pTxBFCap->ExpNoComSteerCapable = FALSE; - pTxBFCap->ExpComSteerCapable = - TRUE; /* !pTxBfInfo->cmmCfgETxBfNoncompress; */ - pTxBFCap->ExpNoComBF = - 0; /* HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->ExpComBF = - HT_ExBF_FB_CAP_IMMEDIATE; /* pTxBfInfo->cmmCfgETxBfNoncompress? HT_ExBF_FB_CAP_NONE: HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->MinGrouping = 3; - pTxBFCap->NoComSteerBFAntSup = 0; - pTxBFCap->ComSteerBFAntSup = 3; - pTxBFCap->TxSoundCapable = - FALSE; /* Support staggered sounding frames */ - pTxBFCap->ChanEstimation = pTxBfInfo->ucRxPathNum - 1; - break; - } - } else - memset(pTxBFCap, 0, sizeof(*pTxBFCap)); -} - -#ifdef VHT_TXBF_SUPPORT -void mt7615_setVHTETxBFCap(IN RTMP_ADAPTER *pAd, IN TXBF_STATUS_INFO *pTxBfInfo) -{ - VHT_CAP_INFO *pTxBFCap = pTxBfInfo->pVhtTxBFCap; - - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: cmmCfgETxBfEnCond = %d\n", __FUNCTION__, (UCHAR)pTxBfInfo->cmmCfgETxBfEnCond)); */ - - if (pTxBfInfo->cmmCfgETxBfEnCond > 0) { - switch (pTxBfInfo->cmmCfgETxBfEnCond) { - case SUBF_ALL: - default: - pTxBFCap->bfee_cap_su = 1; - pTxBFCap->bfer_cap_su = - (pTxBfInfo->ucTxPathNum > 1) ? 1 : 0; -#ifdef CFG_SUPPORT_MU_MIMO - - switch (pAd->CommonCfg.MUTxRxEnable) { - case MUBF_OFF: - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = 0; - break; - - case MUBF_BFER: - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = - (pTxBfInfo->ucTxPathNum > 1) ? 1 : 0; - break; - - case MUBF_BFEE: - pTxBFCap->bfee_cap_mu = 1; - pTxBFCap->bfer_cap_mu = 0; - break; - - case MUBF_ALL: - pTxBFCap->bfee_cap_mu = 1; - pTxBFCap->bfer_cap_mu = - (pTxBfInfo->ucTxPathNum > 1) ? 1 : 0; - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set wrong parameters\n", - __func__)); - break; - } - -#else - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = 0; -#endif /* CFG_SUPPORT_MU_MIMO */ - pTxBFCap->bfee_sts_cap = 3; - pTxBFCap->num_snd_dimension = - pTxBfInfo->ucTxPathNum - 1; - break; - - case SUBF_BFER: - pTxBFCap->bfee_cap_su = 0; - pTxBFCap->bfer_cap_su = - (pTxBfInfo->ucTxPathNum > 1) ? 1 : 0; -#ifdef CFG_SUPPORT_MU_MIMO - - switch (pAd->CommonCfg.MUTxRxEnable) { - case MUBF_OFF: - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = 0; - break; - - case MUBF_BFER: - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = - (pTxBfInfo->ucTxPathNum > 1) ? 1 : 0; - break; - - case MUBF_BFEE: - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = 0; - break; - - case MUBF_ALL: - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = - (pTxBfInfo->ucTxPathNum > 1) ? 1 : 0; - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set wrong parameters\n", - __func__)); - break; - } - -#else - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = 0; -#endif /* CFG_SUPPORT_MU_MIMO */ - pTxBFCap->bfee_sts_cap = 0; - pTxBFCap->num_snd_dimension = - pTxBfInfo->ucTxPathNum - 1; - break; - - case SUBF_BFEE: - pTxBFCap->bfee_cap_su = 1; - pTxBFCap->bfer_cap_su = 0; -#ifdef CFG_SUPPORT_MU_MIMO - - switch (pAd->CommonCfg.MUTxRxEnable) { - case MUBF_OFF: - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = 0; - break; - - case MUBF_BFER: - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = 0; - break; - - case MUBF_BFEE: - pTxBFCap->bfee_cap_mu = 1; - pTxBFCap->bfer_cap_mu = 0; - break; - - case MUBF_ALL: - pTxBFCap->bfee_cap_mu = 1; - pTxBFCap->bfer_cap_mu = 0; - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set wrong parameters\n", - __func__)); - break; - } - -#else - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfer_cap_mu = 0; -#endif /* CFG_SUPPORT_MU_MIMO */ - pTxBFCap->bfee_sts_cap = 3; - pTxBFCap->num_snd_dimension = - pTxBfInfo->ucTxPathNum - 1; - break; - } - } else { - pTxBFCap->num_snd_dimension = 0; - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfee_cap_su = 0; - pTxBFCap->bfer_cap_mu = 0; - pTxBFCap->bfer_cap_su = 0; - pTxBFCap->bfee_sts_cap = 0; - } -} -#endif /* VHT_TXBF_SUPPORT */ -#endif /* TXBF_SUPPORT */ - -#ifdef SMART_CARRIER_SENSE_SUPPORT -VOID mt7615_SmartCarrierSense(IN RTMP_ADAPTER *pAd) -{ - PSMART_CARRIER_SENSE_CTRL pSCSCtrl; - BOOL RxOnly = FALSE; - UINT32 TotalTP = 0, CrValue = 0; - INT32 CckPdBlkBundry = 0, OfdmPdBlkBundry = 0; - UCHAR i; - UCHAR idx; - UINT32 MaxRtsRtyCount = 0; - UINT32 MaxRtsCount = 0; - UINT32 TempValue = 0; - BOOL WriteCr = FALSE; - UINT32 PdCount = 0, MdrdyCount = 0; - pSCSCtrl = &pAd->SCSCtrl; - - /* 2. Tx/Rx */ - /* MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, */ - /* ("%s Band0:Tx/Rx=%d/%d MinRSSI=%d, Band1:Tx/Rx=%d/%d, MinRSSI=%d\n", */ - /* __FUNCTION__, pAd->SCSCtrl.OneSecTxByteCount[0], pAd->SCSCtrl.OneSecRxByteCount[0], pAd->SCSCtrl.SCSMinRssi[0], */ - /* pAd->SCSCtrl.OneSecTxByteCount[1], pAd->SCSCtrl.OneSecRxByteCount[1], pAd->SCSCtrl.SCSMinRssi[1])); */ - - /* 3. based on minRssi to adjust PD_BLOCK_TH */ - for (i = 0; i < 1; i++) { /* NO DBDC support. */ - for (idx = 0; idx < 4; idx++) { - HW_IO_READ32(pAd, - MIB_MB0SDR0 + (idx * BssOffset) + - (i * BandOffset), - &CrValue); - TempValue = - (CrValue >> RtsRtyCountOffset) & RtsCountMask; - - if (TempValue > MaxRtsRtyCount) { - MaxRtsRtyCount = TempValue; - MaxRtsCount = CrValue & RtsCountMask; - } - } - - pSCSCtrl->RtsCount[i] = MaxRtsCount; - pSCSCtrl->RtsRtyCount[i] = MaxRtsRtyCount; - PdCount = pAd->MsMibBucket.PdCount[i][pAd->MsMibBucket.CurIdx]; - MdrdyCount = - pAd->MsMibBucket.MdrdyCount[i][pAd->MsMibBucket.CurIdx]; - /* printk("PD_count=%x, MDRSY_count=%x\n", CrValue, CrValue2); */ - pSCSCtrl->CckFalseCcaCount[i] = - (PdCount & 0xffff) - (MdrdyCount & 0xffff); - pSCSCtrl->OfdmFalseCcaCount[i] = - ((PdCount & 0xffff0000) >> 16) - - ((MdrdyCount & 0xffff0000) >> 16); - - if (pSCSCtrl->SCSEnable[i] == SCS_ENABLE) { - TotalTP = (pSCSCtrl->OneSecTxByteCount[i] + - pSCSCtrl->OneSecRxByteCount[i]); - - if ((pSCSCtrl->OneSecTxByteCount[i]) * 9 < - pSCSCtrl->OneSecRxByteCount[i]) - RxOnly = TRUE; - - /* if (1 TotalTP > pSCSCtrl->SCSTrafficThreshold[i]) {*/ /* default 2M */ - if ((pSCSCtrl->RtsCount[i] > 0 || - pSCSCtrl->RtsRtyCount[i] > 0) && - RxOnly == FALSE) { - /* Set PD_BLOCKING_BOUNDARY */ - CckPdBlkBundry = min( - ((pSCSCtrl->SCSMinRssi[i] - - pSCSCtrl->SCSMinRssiTolerance[i]) + - 256), - pSCSCtrl->CckFixedRssiBond[i]); - - /* CCK part */ - if ((pSCSCtrl->CckFalseCcaCount[i] > - pSCSCtrl->CckFalseCcaUpBond - [i])) { /* Decrease coverage */ - if (MaxRtsCount > - (MaxRtsRtyCount + - (MaxRtsRtyCount >> - 1))) { /* RTS PER < 40% */ - if (pAd->SCSCtrl.CckPdBlkTh[i] == - PdBlkCckThDefault && - CckPdBlkBundry > - FastInitTh) { - pAd->SCSCtrl - .CckPdBlkTh[i] = - FastInitTh; - WriteCr = TRUE; - } - /* pSCSCtrl->CckPdBlkTh[i] += 2; //One step is 2dB. */ - else if ((pSCSCtrl->CckPdBlkTh[i] + - OneStep) <= - CckPdBlkBundry) { - pSCSCtrl->CckPdBlkTh[i] += - OneStep; - /* Write to CR */ - WriteCr = TRUE; - } else if (pSCSCtrl->CckPdBlkTh - [i] > - CckPdBlkBundry) { - pSCSCtrl->CckPdBlkTh[i] = - CckPdBlkBundry; - /* Write to CR */ - WriteCr = TRUE; - } - } - } else if (pSCSCtrl->CckFalseCcaCount[i] < - pSCSCtrl->CckFalseCcaLowBond - [i] || - (MaxRtsCount + (MaxRtsCount >> 1)) < - MaxRtsRtyCount) { /* Increase coverage */ - if (pSCSCtrl->CckPdBlkTh[i] - OneStep >= - PdBlkCckThDefault) { - pSCSCtrl->CckPdBlkTh[i] -= - OneStep; - - if (pSCSCtrl->CckPdBlkTh[i] > - CckPdBlkBundry) /* Tracking mini RSSI to prevent out of service rage. */ - pSCSCtrl->CckPdBlkTh[i] = - CckPdBlkBundry; - - /* Write to CR */ - WriteCr = TRUE; - } - } else { /* Stable stat */ - if (pSCSCtrl->CckPdBlkTh[i] > - CckPdBlkBundry) { /* Tracking mini RSSI to prevent out of service rage. */ - pSCSCtrl->CckPdBlkTh[i] = - CckPdBlkBundry; - WriteCr = TRUE; - } - } - - if (WriteCr) { /* Write for CCK PD blocking */ - HW_IO_READ32(pAd, PHY_RXTD_CCKPD_7, - &CrValue); - CrValue &= ~( - PdBlkCckThMask - << PdBlkCckThOffset); /* Bit[8:1] */ - CrValue |= (pSCSCtrl->CckPdBlkTh[i] - << PdBlkCckThOffset); - HW_IO_WRITE32(pAd, PHY_RXTD_CCKPD_7, - CrValue); - HW_IO_READ32(pAd, PHY_RXTD_CCKPD_8, - &CrValue); - CrValue &= ~( - PdBlkCckThMask - << PdBlkCck1RThOffset); /* Bit[31:24] */ - CrValue |= (pSCSCtrl->CckPdBlkTh[i] - << PdBlkCck1RThOffset); - HW_IO_WRITE32(pAd, PHY_RXTD_CCKPD_8, - CrValue); - } - - WriteCr = FALSE; /* Clear */ - /* OFDM part */ - /* Set PD_BLOCKING_BOUNDARY */ - OfdmPdBlkBundry = min( - ((pSCSCtrl->SCSMinRssi[i] - - pSCSCtrl->SCSMinRssiTolerance[i]) * - 2 + - 512), - pSCSCtrl->OfdmFixedRssiBond[i]); - - if (pSCSCtrl->OfdmFalseCcaCount[i] > - pSCSCtrl->OfdmFalseCcaUpBond - [i]) { /* Decrease coverage */ - if (MaxRtsCount > - (MaxRtsRtyCount + - (MaxRtsRtyCount >> - 1))) { /* RTS PER < 40% */ - if (pAd->SCSCtrl.OfdmPdBlkTh[i] == - PdBlkOfmdThDefault && - OfdmPdBlkBundry > - FastInitThOfdm) { - pAd->SCSCtrl - .OfdmPdBlkTh[i] = - FastInitThOfdm; - WriteCr = TRUE; - } - - if ((pSCSCtrl->OfdmPdBlkTh[i] + - OneStep) <= - OfdmPdBlkBundry) { - pSCSCtrl->OfdmPdBlkTh[i] += - OneStep; - /* Write to CR */ - WriteCr = TRUE; - } else if (pSCSCtrl->OfdmPdBlkTh - [i] > - OfdmPdBlkBundry) { - pSCSCtrl->OfdmPdBlkTh[i] = - OfdmPdBlkBundry; - /* Write to CR */ - WriteCr = TRUE; - } - } - } else if (pSCSCtrl->OfdmFalseCcaCount[i] < - pSCSCtrl->OfdmFalseCcaLowBond - [i] || - (MaxRtsCount + (MaxRtsCount >> 1)) < - MaxRtsRtyCount) { /* Increase coverage */ - if (pSCSCtrl->OfdmPdBlkTh[i] - - OneStep >= - PdBlkOfmdThDefault) { - pSCSCtrl->OfdmPdBlkTh[i] -= - OneStep; - - if (pSCSCtrl->OfdmPdBlkTh[i] > - OfdmPdBlkBundry) /* Tracking mini RSSI to prevent out of service rage. */ - pSCSCtrl->OfdmPdBlkTh[i] = - OfdmPdBlkBundry; - - /* Write to CR */ - WriteCr = TRUE; - } - } else { /* Stable stat */ - if (pSCSCtrl->OfdmPdBlkTh[i] > - OfdmPdBlkBundry) { /* Tracking mini RSSI to prevent out of service rage. */ - pSCSCtrl->OfdmPdBlkTh[i] = - OfdmPdBlkBundry; - WriteCr = TRUE; - } - } - - if (WriteCr) { /* Write for OFDM PD blocking */ - if (i == 0) { - HW_IO_READ32(pAd, - PHY_MIN_PRI_PWR, - &CrValue); - CrValue &= ~( - PdBlkOfmdThMask - << PdBlkOfmdThOffset); /* OFDM PD BLOCKING TH */ - CrValue |= - (pSCSCtrl->OfdmPdBlkTh[i] - << PdBlkOfmdThOffset); - HW_IO_WRITE32(pAd, - PHY_MIN_PRI_PWR, - CrValue); - } else if (i == 1) { /* DBDC */ - HW_IO_READ32( - pAd, - BAND1_PHY_MIN_PRI_PWR, - &CrValue); - CrValue &= ~( - PdBlkOfmdThMask - << PdBlkOfmdThOffsetB1); /* OFDM PD BLOCKING TH */ - CrValue |= - (pSCSCtrl->OfdmPdBlkTh[i] - << PdBlkOfmdThOffsetB1); - HW_IO_WRITE32( - pAd, - BAND1_PHY_MIN_PRI_PWR, - CrValue); - } - } - } else { /* Disable SCS No traffic */ - if (pSCSCtrl->CckPdBlkTh[i] != - PdBlkCckThDefault) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("Disable SCS due to RtsCount=%d RxOnly=%d\n", - pSCSCtrl->RtsCount[i], - RxOnly)); - pSCSCtrl->CckPdBlkTh[i] = - PdBlkCckThDefault; - HW_IO_READ32(pAd, PHY_RXTD_CCKPD_7, - &CrValue); - CrValue &= ~( - PdBlkCckThMask - << PdBlkCckThOffset); /* Bit[8:1] */ - CrValue |= - (PdBlkCckThDefault - << PdBlkCckThOffset); /* 0x92 is default value -110dBm */ - HW_IO_WRITE32(pAd, PHY_RXTD_CCKPD_7, - CrValue); - HW_IO_READ32(pAd, PHY_RXTD_CCKPD_8, - &CrValue); - CrValue &= ~( - PdBlkCckThMask - << PdBlkCck1RThOffset); /* Bit[31:24] */ - CrValue |= - (PdBlkCckThDefault - << PdBlkCck1RThOffset); /* 0x92 is default value -110dBm */ - HW_IO_WRITE32(pAd, PHY_RXTD_CCKPD_8, - CrValue); - } - - if (pSCSCtrl->OfdmPdBlkTh[i] != - PdBlkOfmdThDefault) { - if (i == 0) { - pSCSCtrl->OfdmPdBlkTh[i] = - PdBlkOfmdThDefault; - HW_IO_READ32(pAd, - PHY_MIN_PRI_PWR, - &CrValue); - CrValue &= ~( - PdBlkOfmdThMask - << PdBlkOfmdThOffset); /* OFDM PD BLOCKING TH */ - CrValue |= - (PdBlkOfmdThDefault - << PdBlkOfmdThOffset); - HW_IO_WRITE32(pAd, - PHY_MIN_PRI_PWR, - CrValue); - } else if (i == 1) { - pSCSCtrl->OfdmPdBlkTh[i] = - PdBlkOfmdThDefault; - HW_IO_READ32( - pAd, - BAND1_PHY_MIN_PRI_PWR, - &CrValue); - CrValue &= ~( - PdBlkOfmdThMask - << PdBlkOfmdThOffsetB1); /* OFDM PD BLOCKING TH */ - CrValue |= - (PdBlkOfmdThDefault - << PdBlkOfmdThOffsetB1); - HW_IO_WRITE32( - pAd, - BAND1_PHY_MIN_PRI_PWR, - CrValue); - } - } - } - } else if (pSCSCtrl->SCSEnable[i] == SCS_DISABLE) { - if (pSCSCtrl->CckPdBlkTh[i] != PdBlkCckThDefault) { - pSCSCtrl->CckPdBlkTh[i] = PdBlkCckThDefault; - HW_IO_READ32(pAd, PHY_RXTD_CCKPD_7, &CrValue); - CrValue &= - ~(PdBlkCckThMask - << PdBlkCckThOffset); /* Bit[8:1] */ - CrValue |= - (PdBlkCckThDefault - << PdBlkCckThOffset); /* 0x92 is default value -110dBm */ - HW_IO_WRITE32(pAd, PHY_RXTD_CCKPD_7, CrValue); - HW_IO_READ32(pAd, PHY_RXTD_CCKPD_8, &CrValue); - CrValue &= ~( - PdBlkCckThMask - << PdBlkCck1RThOffset); /* Bit[31:24] */ - CrValue |= - (PdBlkCckThDefault - << PdBlkCck1RThOffset); /* 0x92 is default value -110dBm */ - HW_IO_WRITE32(pAd, PHY_RXTD_CCKPD_8, CrValue); - } - - if (pSCSCtrl->OfdmPdBlkTh[i] != PdBlkOfmdThDefault) { - if (i == 0) { - pSCSCtrl->OfdmPdBlkTh[i] = - PdBlkOfmdThDefault; - HW_IO_READ32(pAd, PHY_MIN_PRI_PWR, - &CrValue); - CrValue &= ~( - PdBlkOfmdThMask - << PdBlkOfmdThOffset); /* OFDM PD BLOCKING TH */ - CrValue |= (PdBlkOfmdThDefault - << PdBlkOfmdThOffset); - HW_IO_WRITE32(pAd, PHY_MIN_PRI_PWR, - CrValue); - } else if (i == 1) { - pSCSCtrl->OfdmPdBlkTh[i] = - PdBlkOfmdThDefault; - HW_IO_READ32(pAd, BAND1_PHY_MIN_PRI_PWR, - &CrValue); - CrValue &= ~( - PdBlkOfmdThMask - << PdBlkOfmdThOffsetB1); /* OFDM PD BLOCKING TH */ - CrValue |= (PdBlkOfmdThDefault - << PdBlkOfmdThOffsetB1); - HW_IO_WRITE32(pAd, - BAND1_PHY_MIN_PRI_PWR, - CrValue); - } - } - } - } -} - -VOID mt7615_SetSCS(IN RTMP_ADAPTER *pAd, IN UCHAR BandIdx, IN UINT32 value) -{ - UINT32 CrValue; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): BandIdx=%d, SCSEnable=%d\n", __func__, BandIdx, - value)); - - if (value > 500) /* traffic threshold.*/ - pAd->SCSCtrl.SCSTrafficThreshold[BandIdx] = value; - else if (value == SCS_DISABLE) { - pAd->SCSCtrl.SCSEnable[BandIdx] = SCS_DISABLE; - pAd->SCSCtrl.SCSStatus[BandIdx] = PD_BLOCKING_OFF; - /* Disable PD blocking and reset related CR */ - HW_IO_READ32(pAd, PHY_MIN_PRI_PWR, &CrValue); - /* CrValue &= ~(0x1 << PdBlkEnabeOffset); Bit[19] */ - CrValue &= ~(PdBlkOfmdThMask - << PdBlkOfmdThOffset); /* OFDM PD BLOCKING TH */ - CrValue |= (PdBlkOfmdThDefault << PdBlkOfmdThOffset); - HW_IO_WRITE32(pAd, PHY_MIN_PRI_PWR, CrValue); - HW_IO_READ32(pAd, PHY_RXTD_CCKPD_7, &CrValue); - CrValue &= ~(PdBlkCckThMask << PdBlkCckThOffset); /* Bit[8:1] */ - CrValue |= - (PdBlkCckThDefault - << PdBlkCckThOffset); /* 0x92 is default value -110dBm */ - HW_IO_WRITE32(pAd, PHY_RXTD_CCKPD_7, CrValue); - HW_IO_READ32(pAd, PHY_RXTD_CCKPD_8, &CrValue); - CrValue &= ~(PdBlkCckThMask - << PdBlkCck1RThOffset); /* Bit[31:24] */ - CrValue |= - (PdBlkCckThDefault - << PdBlkCck1RThOffset); /* 0x92 is default value -110dBm */ - HW_IO_WRITE32(pAd, PHY_RXTD_CCKPD_8, CrValue); - } else if (value == SCS_ENABLE) - pAd->SCSCtrl.SCSEnable[BandIdx] = SCS_ENABLE; -} -#endif /* SMART_CARRIER_SENSE_SUPPORT */ - -UCHAR *mt7615_get_default_bin_image(RTMP_ADAPTER *pAd) -{ -#ifdef MULTI_INF_SUPPORT - - if (multi_inf_get_idx(pAd) == 0) { -#if defined(CONFIG_FIRST_IF_IPAILNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 1st iPAiLNA default bin.\n")); - return MT7615_E2PImage1_iPAiLNA; -#elif defined(CONFIG_FIRST_IF_IPAELNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 1st iPAeLNA default bin.\n")); - return MT7615_E2PImage1_iPAeLNA; -#elif defined(CONFIG_FIRST_IF_EPAILNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 1st ePAiLNA default bin.\n")); - return MT7615_E2PImage1_ePAiLNA; -#else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 1st ePAeLNA default bin.\n")); - return MT7615_E2PImage1_ePAeLNA; -#endif - } -#if defined(CONFIG_RT_SECOND_CARD) - else if (multi_inf_get_idx(pAd) == 1) { -#if defined(CONFIG_SECOND_IF_IPAILNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 2nd iPAiLNA default bin.\n")); - return MT7615_E2PImage2_iPAiLNA; -#elif defined(CONFIG_SECOND_IF_IPAELNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 2nd iPAeLNA default bin.\n")); - return MT7615_E2PImage2_iPAeLNA; -#elif defined(CONFIG_SECOND_IF_EPAILNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 2nd ePAiLNA default bin.\n")); - return MT7615_E2PImage2_ePAiLNA; -#else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 2nd ePAeLNA default bin.\n")); - return MT7615_E2PImage2_ePAeLNA; -#endif - } -#endif /* CONFIG_RT_SECOND_CARD */ -#if defined(CONFIG_RT_THIRD_CARD) - else if (multi_inf_get_idx(pAd) == 2) { -#if defined(CONFIG_THIRD_IF_IPAILNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 3rd iPAiLNA default bin.\n")); - return MT7615_E2PImage3_iPAiLNA; -#elif defined(CONFIG_THIRD_IF_IPAELNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 3rd iPAeLNA default bin.\n")); - return MT7615_E2PImage3_iPAeLNA; -#elif defined(CONFIG_THIRD_IF_EPAILNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 3rd ePAiLNA default bin.\n")); - return MT7615_E2PImage3_ePAiLNA; -#else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 3rd ePAeLNA default bin.\n")); - return MT7615_E2PImage3_ePAeLNA; -#endif - } -#endif /* CONFIG_RT_THIRD_CARD */ - else -#endif /* MULTI_INF_SUPPORT */ - { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use the default ePAeLNA bin image!\n")); - return MT7615_E2PImage1_ePAeLNA; - } - - return NULL; -} - -UCHAR *mt7615_get_default_bin_image_file(RTMP_ADAPTER *pAd) -{ -#ifdef MULTI_INF_SUPPORT - if (multi_inf_get_idx(pAd) == 0) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use %dst %s default bin.\n", multi_inf_get_idx(pAd), - DEFAULT_BIN_FILE)); - return DEFAULT_BIN_FILE; - } -#if defined(CONFIG_RT_SECOND_CARD) - else if (multi_inf_get_idx(pAd) == 1) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use %dst %s default bin.\n", multi_inf_get_idx(pAd), - SECOND_BIN_FILE)); - return SECOND_BIN_FILE; - } -#endif /* CONFIG_RT_SECOND_CARD */ -#if defined(CONFIG_RT_THIRD_CARD) - else if (multi_inf_get_idx(pAd) == 2) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use %dst %s default bin.\n", multi_inf_get_idx(pAd), - THIRD_BIN_FILE)); - return THIRD_BIN_FILE; - } -#endif /* CONFIG_RT_THIRD_CARD */ - else -#endif /* MULTI_INF_SUPPORT */ - { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use the default %s bin image!\n", DEFAULT_BIN_FILE)); - - return DEFAULT_BIN_FILE; - } - - return NULL; -} - -static INT hif_set_WPDMA(RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN enable, - UINT8 WPDMABurstSIZE) -{ - WPDMA_GLO_CFG_STRUC GloCfg; - UINT32 Value1; - UINT32 Value2; -#ifdef CONFIG_DELAY_INT - UINT32 Value; -#endif - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); - HW_IO_READ32(pAd, 0x7158, &Value1); - HW_IO_READ32(pAd, 0x7000, &Value2); -#ifdef CONFIG_DELAY_INT - HIF_IO_READ32(pAd, MT_DELAY_INT_CFG, &Value); -#endif - - switch (TxRx) { - case PDMA_TX: - if (enable == TRUE) { - GloCfg.MT7615_field.EnableTxDMA = 1; - GloCfg.MT7615_field.EnTXWriteBackDDONE = 1; - GloCfg.MT7615_field.WPDMABurstSIZE = WPDMABurstSIZE; - GloCfg.MT7615_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2_PREFETCH; - Value1 |= (1 << 16); -#ifdef CONFIG_DELAY_INT - Value |= TX_DLY_INT_EN; - Value &= ~TX_MAX_PINT_MASK; - Value |= TX_MAX_PINT(TX_PENDING_INT_NUMS); - Value &= ~TX_MAX_PTIME_MASK; - Value |= TX_MAX_PTIME(TX_PENDING_INT_TIME); -#endif - } else { - GloCfg.MT7615_field.EnableTxDMA = 0; - /* disable pdma pre-fetch */ - GloCfg.MT7615_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2; -#ifdef CONFIG_DELAY_INT - Value &= ~TX_DLY_INT_EN; - Value &= ~TX_MAX_PINT_MASK; - Value &= ~TX_MAX_PTIME_MASK; -#endif - } - - Value2 &= ~BIT23; - break; - - case PDMA_RX: - if (enable == TRUE) { - GloCfg.MT7615_field.EnableRxDMA = 1; - GloCfg.MT7615_field.WPDMABurstSIZE = WPDMABurstSIZE; - GloCfg.MT7615_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2_PREFETCH; - Value1 |= (1 << 16); -#ifdef CONFIG_DELAY_INT - Value |= RX_DLY_INT_EN; - Value &= ~RX_MAX_PINT_MASK; - Value |= RX_MAX_PINT(RX_PENDING_INT_NUMS); - Value &= ~RX_MAX_PTIME_MASK; - Value |= RX_MAX_PTIME(RX_PENDING_INT_TIME); -#endif - } else { - GloCfg.MT7615_field.EnableRxDMA = 0; - /* disable pdma pre-fetch */ - GloCfg.MT7615_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2; -#ifdef CONFIG_DELAY_INT - Value &= ~RX_DLY_INT_EN; - Value &= ~RX_MAX_PINT_MASK; - Value &= ~RX_MAX_PTIME_MASK; -#endif - } - - Value2 &= ~BIT23; - break; - - case PDMA_TX_RX: - if (enable == TRUE) { - GloCfg.MT7615_field.EnableTxDMA = 1; - GloCfg.MT7615_field.EnableRxDMA = 1; - GloCfg.MT7615_field.EnTXWriteBackDDONE = 1; - GloCfg.MT7615_field.WPDMABurstSIZE = WPDMABurstSIZE; - GloCfg.MT7615_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2_PREFETCH; - - if (MTK_REV_GTE(pAd, MT7615, MT7615E3)) { -#ifdef CONFIG_RALINK_MT7621 - /* - * Tx Burst Size: three bits are used to specify - * 32DW, bit0:0, bit21:10 - */ - GloCfg.MT7615_E3_field.tx_bt_size_bit0 = 0; - GloCfg.MT7615_E3_field.tx_bt_size_bit21 = 2; -#else - - /* - * Tx Burst Size: three bits are used to specify - * 32DW, bit0:1, bit21:1 - */ - GloCfg.MT7615_E3_field.tx_bt_size_bit0 = 1; - GloCfg.MT7615_E3_field.tx_bt_size_bit21 = 1; -#endif - GloCfg.MT7615_E3_field.first_token_only = 1; - } - - Value1 |= (1 << 16); -#ifdef CONFIG_DELAY_INT - Value |= TX_DLY_INT_EN; - Value &= ~TX_MAX_PINT_MASK; - Value |= TX_MAX_PINT(TX_PENDING_INT_NUMS); - Value &= ~TX_MAX_PTIME_MASK; - Value |= TX_MAX_PTIME(TX_PENDING_INT_TIME); - Value |= RX_DLY_INT_EN; - Value &= ~RX_MAX_PINT_MASK; - Value |= RX_MAX_PINT(RX_PENDING_INT_NUMS); - Value &= ~RX_MAX_PTIME_MASK; - Value |= RX_MAX_PTIME(RX_PENDING_INT_TIME); -#endif - } else { - GloCfg.MT7615_field.EnableRxDMA = 0; - GloCfg.MT7615_field.EnableTxDMA = 0; - /* disable pdma pre-fetch */ - GloCfg.MT7615_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2; -#ifdef CONFIG_DELAY_INT - Value &= ~TX_DLY_INT_EN; - Value &= ~TX_MAX_PINT_MASK; - Value &= ~TX_MAX_PTIME_MASK; - Value &= ~RX_DLY_INT_EN; - Value &= ~RX_MAX_PINT_MASK; - Value &= ~RX_MAX_PTIME_MASK; -#endif - } - - Value2 &= ~BIT23; - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown path (%d\n", __func__, TxRx)); - break; - } - - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, GloCfg.word); - HW_IO_WRITE32(pAd, 0x7158, Value1); - HW_IO_WRITE32(pAd, 0x7000, Value2); -#ifdef CONFIG_DELAY_INT - HIF_IO_WRITE32(pAd, MT_DELAY_INT_CFG, Value); -#endif -#define WPDMA_DISABLE -1 - - if (!enable) - TxRx = WPDMA_DISABLE; - - WLAN_HOOK_CALL(WLAN_HOOK_DMA_SET, pAd, &TxRx); - return TRUE; -} - -static BOOLEAN hif_wait_WPDMA_idle(struct _RTMP_ADAPTER *pAd, INT round, - INT wait_us) -{ - INT i = 0; - - WPDMA_GLO_CFG_STRUC GloCfg; - /* TODO: shiang-MT7615 */ - do { - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); - - if ((GloCfg.MT7615_field.TxDMABusy == 0) && - (GloCfg.MT7615_field.RxDMABusy == 0)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> DMAIdle, GloCfg=0x%x\n", GloCfg.word)); - return TRUE; - } - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) - return FALSE; - - RtmpusecDelay(wait_us); - } while ((i++) < round); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> DMABusy\n")); - return FALSE; -} - -static BOOLEAN hif_reset_WPDMA(RTMP_ADAPTER *pAd) -{ - UINT32 value = 0; - - /* pdma0 hw reset (w/o dma scheduler) - activate: write 1 clear - scope: PDMA - PDMA: - logic reset: Y - register reset: N (but DMA_IDX will be reset to 0) - */ - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &value); - value |= SW_RST; - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, value); - - return TRUE; -} - -static INT32 get_fw_sync_value(RTMP_ADAPTER *pAd) -{ - UINT32 value; - - MAC_IO_READ32(pAd, TOP_MISC2, &value); - value = value & 0x00000007; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: current sync CR = 0x%x\n", __func__, value)); - return value; -} - -static VOID fw_own(RTMP_ADAPTER *pAd) -{ - if (MTK_REV_GTE(pAd, MT7615, MT7615E1) && - MTK_REV_LT(pAd, MT7615, MT7615E3)) { - /* Write any value to HIF_FUN_CAP to set FW own */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Write any value to HIF_FUN_CAP to set FW own\n", - __func__)); - HIF_IO_WRITE32(pAd, HIF_FUN_CAP, 1); - pAd->bDrvOwn = FALSE; - } else { - if (pAd->bDrvOwn == FALSE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s()::Return since already in Fw Own...\n", - __func__)); - return; - } - - HIF_IO_WRITE32(pAd, MT_CFG_LPCR_HOST, MT_HOST_SET_OWN); - pAd->bDrvOwn = FALSE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s()::Set Fw Own\n", __func__)); - } -} - -static VOID n9_wdt_reset(RTMP_ADAPTER *pAd) -{ -#define WDT_SWRST_CR_PA 0x81080044 -#define MCU_POWER_ON 0x01 -#define HOST_TRIGGER_WDT_SWRST 0x1209 - UINT32 top_clock_gen0_value = 0; - UINT32 top_clock_gen1_value = 0; - UINT32 top_misc_value = 0; - UINT32 origonal_remap_cr_value = 0; - UINT32 remap_cr_record_base_address = 0; - UINT32 offset_between_target_and_remap_cr_base = 0; - /* switch hclk to XTAL source, 0x80021100[1:0] = 2'b00 */ - HW_IO_READ32(pAd, TOP_CKGEN0, &top_clock_gen0_value); - top_clock_gen0_value &= ~(BIT0 | BIT1); - HW_IO_WRITE32(pAd, TOP_CKGEN0, top_clock_gen0_value); - /* Set HCLK divider to 1:1, 0x80021104[1:0] = 2'b00 */ - HW_IO_READ32(pAd, TOP_CKGEN1, &top_clock_gen1_value); - top_clock_gen1_value &= ~(BIT0 | BIT1); - HW_IO_WRITE32(pAd, TOP_CKGEN1, top_clock_gen1_value); - /* disable HIF can be reset by WDT 0x80021130[30]=1'b0 */ - HW_IO_READ32(pAd, TOP_MISC, &top_misc_value); - top_misc_value &= ~(BIT30); - HW_IO_WRITE32(pAd, TOP_MISC, top_misc_value); - /* enable WDT reset mode and trigger WDT reset 0x81080044 = 0x1209 */ - /* keep the origonal remap cr1 value for restore */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_1, &origonal_remap_cr_value); - /* do PCI-E remap for CR4 PDMA physical base address to 0x40000 */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_1, WDT_SWRST_CR_PA); - HW_IO_READ32(pAd, MCU_PCIE_REMAP_1, &remap_cr_record_base_address); - - if ((WDT_SWRST_CR_PA - remap_cr_record_base_address) > - REMAP_1_OFFSET_MASK) { - /* restore the origonal remap cr1 value */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_1, origonal_remap_cr_value); - } - - offset_between_target_and_remap_cr_base = - ((WDT_SWRST_CR_PA - remap_cr_record_base_address) & - REMAP_1_OFFSET_MASK); - RTMP_IO_WRITE32(pAd, - MT_PCI_REMAP_ADDR_1 + - offset_between_target_and_remap_cr_base, - HOST_TRIGGER_WDT_SWRST); - /* restore the origonal remap cr1 value */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_1, origonal_remap_cr_value); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s()::N9 WDT reset down\n", __func__)); -} - -static INT32 driver_own(RTMP_ADAPTER *pAd) -{ - INT32 Ret = NDIS_STATUS_SUCCESS; - UINT32 retrycnt = 0; -#define MAX_RETRY_CNT 4 - - if (MTK_REV_GTE(pAd, MT7615, MT7615E1) && - MTK_REV_LT(pAd, MT7615, MT7615E3)) { - UINT32 Counter = 0; - /* Write any value to HIF_SYS_REV clear FW own */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Write any value to HIF_SYS_REV to clear FW own\n", - __func__)); - HIF_IO_WRITE32(pAd, HIF_SYS_REV, 1); - - /* Poll driver own status */ - while (Counter < FW_OWN_POLLING_COUNTER) { - RtmpusecDelay(1000); - - if (pAd->bDrvOwn == TRUE) - break; - - Counter++; - }; - - if (pAd->bDrvOwn) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Successed to clear FW own\n", - __func__)); - else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Fail to clear FW own (%d)\n", __func__, - Counter)); - Ret = NDIS_STATUS_FAILURE; - } - } else { - UINT32 counter = 0; - UINT32 Value; - - do { - retrycnt++; - - if (pAd->bDrvOwn == TRUE) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s()::Return since already in Driver Own...\n", - __func__)); - return Ret; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s()::Try to Clear FW Own...\n", __func__)); - /* Write CR to get driver own */ - HIF_IO_WRITE32(pAd, MT_CFG_LPCR_HOST, MT_HOST_CLR_OWN); - /* Poll driver own status */ - counter = 0; - - while (counter < FW_OWN_POLLING_COUNTER) { - RtmpusecDelay(1000); - - if (pAd->bDrvOwn == TRUE) - break; - - counter++; - }; - - if (counter == FW_OWN_POLLING_COUNTER) { - HIF_IO_READ32(pAd, MT_CFG_LPCR_HOST, &Value); - - if (!(Value & MT_HOST_SET_OWN)) - pAd->bDrvOwn = TRUE; - } - - if (pAd->bDrvOwn) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s()::Success to clear FW Own\n", - __func__)); - else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s()::Fail to clear FW Own (%d)\n", - __func__, counter)); - - if (retrycnt >= MAX_RETRY_CNT) - Ret = NDIS_STATUS_FAILURE; - else - n9_wdt_reset(pAd); - } - } while (pAd->bDrvOwn == FALSE && retrycnt < MAX_RETRY_CNT); - } - - return Ret; -} - -static struct dly_ctl_cfg mt7615_rx_dly_ctl_ul_tbl[] = { - { 0, 0x811c }, - { 300, 0xa01c }, - { 550, 0xc01f }, -}; - -static struct dly_ctl_cfg mt7615_rx_dly_ctl_dl_tbl[] = { - { 0, 0x811c }, -}; - -static RTMP_CHIP_OP MT7615_ChipOp = { 0 }; -static RTMP_CHIP_CAP MT7615_ChipCap = { 0 }; - -static VOID mt7615_chipCap_init(RTMP_ADAPTER *pAd, BOOLEAN b11nOnly, - BOOLEAN bThreeAnt) -{ - if (bThreeAnt) - MT7615_ChipCap.max_nss = 3; - else - MT7615_ChipCap.max_nss = 4; - -#ifdef DOT11_VHT_AC - MT7615_ChipCap.max_vht_mcs = VHT_MCS_CAP_9; -#ifdef G_BAND_256QAM - if (BOARD_IS_NO_256QAM(pAd)) - MT7615_ChipCap.g_band_256_qam = FALSE; - else - MT7615_ChipCap.g_band_256_qam = TRUE; - -#endif -#endif /* DOT11_VHT_AC */ - MT7615_ChipCap.TXWISize = sizeof(TMAC_TXD_L); /* 32 */ - MT7615_ChipCap.RXWISize = 28; - MT7615_ChipCap.num_of_tx_ring = 2; - MT7615_ChipCap.num_of_rx_ring = 2; - -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - MT7615_ChipCap.max_v2_bcn_num = 16; -#endif - - MT7615_ChipCap.tx_ring_size = 1024; - MT7615_ChipCap.rx0_ring_size = 1024; - MT7615_ChipCap.rx1_ring_size = 512; - - MT7615_ChipCap.WtblHwNum = MT7615_MT_WTBL_SIZE; -#ifdef RTMP_MAC_PCI - MT7615_ChipCap.WPDMABurstSIZE = 3; -#endif - MT7615_ChipCap.ProbeRspTimes = 2; - MT7615_ChipCap.SnrFormula = SNR_FORMULA4; - MT7615_ChipCap.FlgIsHwWapiSup = TRUE; - MT7615_ChipCap.FlgIsHwAntennaDiversitySup = FALSE; -#ifdef STREAM_MODE_SUPPORT - MT7615_ChipCap.FlgHwStreamMode = FALSE; -#endif -#ifdef TXBF_SUPPORT - MT7615_ChipCap.FlgHwTxBfCap = (TXBF_HW_CAP | TXBF_AID_HW_LIMIT); -#endif - MT7615_ChipCap.asic_caps = (fASIC_CAP_PMF_ENC | fASIC_CAP_MCS_LUT); - MT7615_ChipCap.asic_caps |= fASIC_CAP_HW_DAMSDU; -#ifdef HDR_TRANS_TX_SUPPORT - MT7615_ChipCap.asic_caps |= fASIC_CAP_TX_HDR_TRANS; -#endif /* HDR_TRANS_TX_SUPPORT */ -#ifdef HDR_TRANS_RX_SUPPORT - MT7615_ChipCap.asic_caps |= fASIC_CAP_RX_HDR_TRANS; -#endif /* HDR_TRANS_RX_SUPPORT */ - MT7615_ChipCap.asic_caps |= (fASIC_CAP_CT | fASIC_CAP_MCU_OFFLOAD); - MT7615_ChipCap.asic_caps |= fASIC_CAP_WMM_PKTDETECT_OFFLOAD; -#ifdef RX_SCATTER - - if (MTK_REV_GTE(pAd, MT7615, MT7615E3)) - MT7615_ChipCap.asic_caps |= fASIC_CAP_RX_DMA_SCATTER; - -#endif -#ifdef DBDC_MODE - MT7615_ChipCap.asic_caps |= fASIC_CAP_DBDC; -#endif /* DBDC_MODE */ - -#ifdef WHNAT_SUPPORT - MT7615_ChipCap.asic_caps |= fASIC_CAP_WHNAT; -#endif - - MT7615_ChipCap.asic_caps |= fASIC_CAP_RX_DLY; - -#if defined(WHNAT_SUPPORT) - MT7615_ChipCap.asic_caps &= ~fASIC_CAP_RX_DLY; -#endif - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - MT7615_ChipCap.asic_caps |= fASIC_CAP_PCIE_ASPM_DYM_CTRL; -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - - MT7615_ChipCap.asic_caps |= fASIC_CAP_ADV_SECURITY; - - if (b11nOnly) { - MT7615_ChipCap.phy_caps = - (fPHY_CAP_24G | fPHY_CAP_5G | fPHY_CAP_HT | - fPHY_CAP_TXBF | fPHY_CAP_LDPC | fPHY_CAP_BW40); - } else { - MT7615_ChipCap.phy_caps = - (fPHY_CAP_24G | fPHY_CAP_5G | fPHY_CAP_HT | - fPHY_CAP_VHT | fPHY_CAP_TXBF | fPHY_CAP_LDPC | - fPHY_CAP_MUMIMO | fPHY_CAP_BW40 | fPHY_CAP_BW80 | - fPHY_CAP_BW160C | fPHY_CAP_BW160NC); - } - - MT7615_ChipCap.MaxNumOfRfId = MAX_RF_ID; - MT7615_ChipCap.pRFRegTable = NULL; - MT7615_ChipCap.MaxNumOfBbpId = 200; - MT7615_ChipCap.pBBPRegTable = NULL; - MT7615_ChipCap.bbpRegTbSize = 0; -#ifdef NEW_MBSSID_MODE -#ifdef ENHANCE_NEW_MBSSID_MODE - MT7615_ChipCap.MBSSIDMode = MBSSID_MODE4; -#else - MT7615_ChipCap.MBSSIDMode = MBSSID_MODE1; -#endif /* ENHANCE_NEW_MBSSID_MODE */ -#else - MT7615_ChipCap.MBSSIDMode = MBSSID_MODE0; -#endif /* NEW_MBSSID_MODE */ -#ifdef RTMP_EFUSE_SUPPORT - MT7615_ChipCap.EFUSE_USAGE_MAP_START = 0x3c0; - MT7615_ChipCap.EFUSE_USAGE_MAP_END = 0x3fb; - MT7615_ChipCap.EFUSE_USAGE_MAP_SIZE = 60; - MT7615_ChipCap.EFUSE_RESERVED_SIZE = 59; /* Cal-Free is 22 free block */ -#endif - MT7615_ChipCap.EEPROM_DEFAULT_BIN = mt7615_get_default_bin_image(pAd); - MT7615_ChipCap.EEPROM_DEFAULT_BIN_FILE = - mt7615_get_default_bin_image_file(pAd); - MT7615_ChipCap.EEPROM_DEFAULT_BIN_SIZE = - sizeof(MT7615_E2PImage1_ePAeLNA); - MT7615_ChipCap.EFUSE_BUFFER_CONTENT_SIZE = EFUSE_CONTENT_SIZE; -#ifdef CONFIG_ANDES_SUPPORT -#ifdef NEED_ROM_PATCH - MT7615_ChipCap.need_load_patch = BIT(WM_CPU); -#else - MT7615_ChipCap.need_load_patch = 0; -#endif /* NEED_ROM_PATCH */ - MT7615_ChipCap.need_load_fw = BIT(WM_CPU) | BIT(WA_CPU); - MT7615_ChipCap.load_patch_flow = PATCH_FLOW_V1; - MT7615_ChipCap.load_fw_flow = FW_FLOW_V1; - MT7615_ChipCap.load_patch_method = BIT(HEADER_METHOD); - MT7615_ChipCap.load_fw_method = BIT(HEADER_METHOD); - MT7615_ChipCap.patch_format = PATCH_FORMAT_V1; - MT7615_ChipCap.fw_format = FW_FORMAT_V2; - MT7615_ChipCap.rom_patch_offset = MT7615_ROM_PATCH_START_ADDRESS; -#endif - MT7615_ChipCap.MCUType = ANDES | CR4; - /* TODO: shiang-MT7615, fix me for this */ -#ifdef UNIFY_FW_CMD - MT7615_ChipCap.cmd_header_len = sizeof(FW_TXD) + sizeof(TMAC_TXD_L); -#else - MT7615_ChipCap.cmd_header_len = 12; /* sizeof(FW_TXD),*/ -#endif /* UNIFY_FW_CMD */ - MT7615_ChipCap.cmd_padding_len = 0; -#ifdef CARRIER_DETECTION_SUPPORT - MT7615_ChipCap.carrier_func = TONE_RADAR_V2; -#endif - MT7615_ChipCap.hw_ops_ver = HWCTRL_OP_TYPE_V1; - MT7615_ChipCap.hif_type = HIF_MT; - MT7615_ChipCap.mac_type = MAC_MT; - MT7615_ChipCap.rf_type = RF_MT; - MT7615_ChipCap.TxAggLimit = 64; - MT7615_ChipCap.RxBAWinSize = 64; - MT7615_ChipCap.max_amsdu_len = MPDU_7991_OCTETS; - MT7615_ChipCap.ht_max_ampdu_len_exp = 3; -#ifdef DOT11_VHT_AC - MT7615_ChipCap.max_mpdu_len = MPDU_7991_OCTETS; - MT7615_ChipCap.vht_max_ampdu_len_exp = 7; -#endif /* DOT11_VHT_AC */ - MT7615_ChipCap.default_txop = 0x60; - MT7615_ChipCap.CurrentTxOP = 0x0; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - MT7615_ChipCap.fgRateAdaptFWOffload = TRUE; -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - /*for multi-wmm*/ - MT7615_ChipCap.WmmHwNum = MT7615_MT_WMM_SIZE; - MT7615_ChipCap.PDA_PORT = MT7615_PDA_PORT; - MT7615_ChipCap.SupportAMSDU = TRUE; - MT7615_ChipCap.APPSMode = APPS_MODE2; -#ifdef MT_WOW_SUPPORT - MT7615_ChipCap.nWakeupInterface = WOW_WAKEUP_BY_PCIE; -#endif /* MT_WOW_SUPPORT */ - MT7615_ChipCap.CtParseLen = MT7615_CT_PARSE_LEN; - MT7615_ChipCap.qm = FAST_PATH_QM; - MT7615_ChipCap.qm_tm = TASKLET_METHOD; - MT7615_ChipCap.hif_tm = TASKLET_METHOD; - MT7615_ChipCap.wmm_detect_method = WMM_DETECT_METHOD1; - /* for interrupt enable mask */ - - MT7615_ChipCap.int_enable_mask = MT_CoherentInt | MT_MacInt | - MT_INT_RX_DLY | MT_INT_T2_DONE | - MT_INT_T3_DONE | MT_FW_CLR_OWN_INT; - -#if defined(WHNAT_SUPPORT) - MT7615_ChipCap.int_enable_mask = - MT_CoherentInt | MT_MacInt | MT_INT_R0_DONE | MT_INT_R1_DONE | - MT_INT_T2_DONE | MT_INT_T3_DONE | MT_FW_CLR_OWN_INT; -#endif - - MT7615_ChipCap.hif_pkt_type[HIF_TX_IDX0] = TX_DATA; - MT7615_ChipCap.hif_pkt_type[HIF_TX_IDX1] = TX_DATA; - MT7615_ChipCap.hif_pkt_type[HIF_TX_IDX2] = TX_CMD; - MT7615_ChipCap.hif_pkt_type[HIF_TX_IDX3] = TX_FW_DL; -#if defined(ERR_RECOVERY) || defined(CONFIG_FWOWN_SUPPORT) - MT7615_ChipCap.int_enable_mask |= MT_McuCommand; -#endif /* ERR_RECOVERY || CONFIG_FWOWN_SUPPORT */ - -#ifdef WIFI_SPECTRUM_SUPPORT - MT7615_ChipCap.pSpectrumDesc = MT7615_SPECTRUM_DESC; - MT7615_ChipCap.SpectrumBankNum = MT7615_SpectrumBankNum; - MT7615_ChipCap.SpectrumWF0ADC = MT7615_CAP_WF0_ADC; - MT7615_ChipCap.SpectrumWF1ADC = MT7615_CAP_WF1_ADC; - MT7615_ChipCap.SpectrumWF2ADC = MT7615_CAP_WF2_ADC; - MT7615_ChipCap.SpectrumWF3ADC = MT7615_CAP_WF3_ADC; - MT7615_ChipCap.SpectrumWF0FIIQ = MT7615_CAP_WF0_FIIQ; - MT7615_ChipCap.SpectrumWF1FIIQ = MT7615_CAP_WF1_FIIQ; - MT7615_ChipCap.SpectrumWF2FIIQ = MT7615_CAP_WF2_FIIQ; - MT7615_ChipCap.SpectrumWF3FIIQ = MT7615_CAP_WF3_FIIQ; - MT7615_ChipCap.SpectrumWF0FDIQ = MT7615_CAP_WF0_FDIQ; - MT7615_ChipCap.SpectrumWF1FDIQ = MT7615_CAP_WF1_FDIQ; - MT7615_ChipCap.SpectrumWF2FDIQ = MT7615_CAP_WF2_FDIQ; - MT7615_ChipCap.SpectrumWF3FDIQ = MT7615_CAP_WF3_FDIQ; -#endif /* WIFI_SPECTRUM_SUPPORT */ - MT7615_ChipCap.band_cnt = 2; - MT7615_ChipCap.txd_type = TXD_V1; - MT7615_ChipCap.ba_range = mt7615_ba_range; - MT7615_ChipCap.tx_delay_support = FALSE; -#ifdef OCE_SUPPORT - MT7615_ChipCap.FdFrameFwOffloadEnabled = TRUE; -#endif /* OCE_SUPPORT */ -} - -static VOID mt7615_chipOp_init(void) -{ - MT7615_ChipOp.ChipBBPAdjust = mt7615_bbp_adjust; - MT7615_ChipOp.ChipSwitchChannel = mt7615_switch_channel; -#ifdef NEW_SET_RX_STREAM - MT7615_ChipOp.ChipSetRxStream = mt7615_set_RxStream; -#endif - MT7615_ChipOp.AsicMacInit = mt7615_init_mac_cr; - MT7615_ChipOp.AsicBbpInit = MT7615BBPInit; - MT7615_ChipOp.AsicRfInit = mt7615_init_rf_cr; - MT7615_ChipOp.AsicAntennaDefaultReset = mt7615_antenna_default_reset; - MT7615_ChipOp.AsicHaltAction = NULL; - MT7615_ChipOp.AsicReverseRfFromSleepMode = NULL; -#ifdef CARRIER_DETECTION_SUPPORT - MT7615_ChipOp.ToneRadarProgram = ToneRadarProgram_v2; -#endif - MT7615_ChipOp.DisableTxRx = NULL; -#ifdef RTMP_PCI_SUPPORT - /* MT7615_ChipOp.AsicRadioOn = RT28xxPciAsicRadioOn; */ - /* MT7615_ChipOp.AsicRadioOff = RT28xxPciAsicRadioOff; */ -#endif - MT7615_ChipOp.show_pwr_info = NULL; -#ifdef CAL_FREE_IC_SUPPORT - MT7615_ChipOp.is_cal_free_ic = mt7615_is_cal_free_ic; - MT7615_ChipOp.cal_free_data_get = mt7615_cal_free_data_get; - MT7615_ChipOp.check_is_cal_free_merge = mt7615_check_is_cal_free_merge; -#endif /* CAL_FREE_IC_SUPPORT */ -#ifdef RF_LOCKDOWN - MT7615_ChipOp.check_RF_lock_down = mt7615_check_RF_lock_down; - MT7615_ChipOp.write_RF_lock_parameter = mt7615_write_RF_lock_parameter; - MT7615_ChipOp.merge_RF_lock_parameter = mt7615_merge_RF_lock_parameter; - MT7615_ChipOp.Read_Effuse_parameter = mt7615_Read_Effuse_parameter; - MT7615_ChipOp.Config_Effuse_Country = mt7615_Config_Effuse_Country; -#endif /* RF_LOCKDOWN */ -#ifdef MT_WOW_SUPPORT - MT7615_ChipOp.AsicWOWEnable = MT76xxAndesWOWEnable; - MT7615_ChipOp.AsicWOWDisable = MT76xxAndesWOWDisable; - /* MT7615_ChipOp.AsicWOWInit = MT76xxAndesWOWInit, */ -#endif /* MT_WOW_SUPPORT */ - MT7615_ChipOp.MtCmdTx = MtCmdSendMsg; - MT7615_ChipOp.prepare_fwdl_img = mt7615_fw_prepare; - MT7615_ChipOp.fwdl_datapath_setup = mt7615_fwdl_datapath_setup; -#ifdef DBDC_MODE - MT7615_ChipOp.BandGetByIdx = MT7615BandGetByIdx; -#endif -#ifdef TXBF_SUPPORT - MT7615_ChipOp.ClientSupportsETxBF = mt_WrapClientSupportsETxBF; - MT7615_ChipOp.iBFPhaseComp = mt7615_iBFPhaseComp; - MT7615_ChipOp.iBFPhaseCalInit = mt7615_iBFPhaseCalInit; - MT7615_ChipOp.iBFPhaseFreeMem = mt7615_iBFPhaseFreeMem; - MT7615_ChipOp.iBFPhaseCalE2PUpdate = mt7615_iBFPhaseCalE2PUpdate; - MT7615_ChipOp.iBFPhaseCalReport = mt7615_iBFPhaseCalReport; -#ifdef VHT_TXBF_SUPPORT - MT7615_ChipOp.ClientSupportsVhtETxBF = mt_WrapClientSupportsVhtETxBF; -#endif - MT7615_ChipOp.TxBFInit = mt_WrapTxBFInit; - MT7615_ChipOp.setETxBFCap = mt7615_setETxBFCap; - MT7615_ChipOp.BfStaRecUpdate = mt_AsicBfStaRecUpdate; - MT7615_ChipOp.BfStaRecRelease = mt_AsicBfStaRecRelease; - MT7615_ChipOp.BfPfmuMemAlloc = CmdPfmuMemAlloc; - MT7615_ChipOp.TxBfTxApplyCtrl = CmdTxBfTxApplyCtrl; - MT7615_ChipOp.BfApClientCluster = CmdTxBfApClientCluster; - MT7615_ChipOp.BfReptClonedStaToNormalSta = - CmdTxBfReptClonedStaToNormalSta; - MT7615_ChipOp.BfPfmuMemRelease = CmdPfmuMemRelease; - MT7615_ChipOp.BfHwEnStatusUpdate = CmdTxBfHwEnableStatusUpdate; - MT7615_ChipOp.BfModuleEnCtrl = CmdTxBfModuleEnCtrl; - MT7615_ChipOp.BfeeHwCtrl = CmdTxBfeeHwCtrl; -#ifdef VHT_TXBF_SUPPORT - MT7615_ChipOp.ClientSupportsVhtETxBF = mt_WrapClientSupportsVhtETxBF; - MT7615_ChipOp.setVHTETxBFCap = mt7615_setVHTETxBFCap; -#endif /* VHT_TXBF_SUPPORT */ -#endif /* TXBF_SUPPORT */ - MT7615_ChipOp.bufferModeEfuseFill = mt7615_bufferModeEfuseFill; -#ifdef SMART_CARRIER_SENSE_SUPPORT - MT7615_ChipOp.SmartCarrierSense = mt7615_SmartCarrierSense; - MT7615_ChipOp.ChipSetSCS = mt7615_SetSCS; -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -#ifdef GREENAP_SUPPORT - MT7615_ChipOp.EnableAPMIMOPS = enable_greenap; - MT7615_ChipOp.DisableAPMIMOPS = disable_greenap; -#endif /* GREENAP_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - MT7615_ChipOp.pcie_aspm_dym_ctrl = rtmp_pcie_aspm_dym_ctrl; -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - MT7615_ChipOp.heart_beat_check = mt7615_heart_beat_check; -#ifdef INTERNAL_CAPTURE_SUPPORT - MT7615_ChipOp.ICapStart = MtCmdRfTestICapStart; - MT7615_ChipOp.ICapStatus = MtCmdRfTestGen1ICapStatus; -#endif /* INTERNAL_CAPTURE_SUPPORT */ -#ifdef WIFI_SPECTRUM_SUPPORT - MT7615_ChipOp.SpectrumStart = MtCmdWifiSpectrumStart; - MT7615_ChipOp.SpectrumStatus = MtCmdWifiSpectrumGen1Status; - MT7615_ChipOp.SpectrumCmdRawDataProc = MtCmdWifiSpectrumRawDataProc; - MT7615_ChipOp.SpectrumEventRawDataHandler = - ExtEventWifiSpectrumRawDataHandler; -#endif /* WIFI_SPECTRUM_SUPPORT */ - -#ifdef CONFIG_RALINK_MT7621 - MT7615_ChipOp.hif_set_pcie_read_params = - mt7615_hif_set_pcie_read_params; -#endif /* CONFIG_RALINK_MT7621*/ - MT7615_ChipOp.hif_set_dma = hif_set_WPDMA; - MT7615_ChipOp.hif_wait_dma_idle = hif_wait_WPDMA_idle; - MT7615_ChipOp.hif_reset_dma = hif_reset_WPDMA; - MT7615_ChipOp.get_fw_sync_value = get_fw_sync_value; - MT7615_ChipOp.read_chl_pwr = NULL; - MT7615_ChipOp.parse_RXV_packet = parse_RXV_packet_v2; - MT7615_ChipOp.txs_handler = txs_handler_v2; - MT7615_ChipOp.driver_own = driver_own; - MT7615_ChipOp.fw_own = fw_own; -} - -VOID mt7615_init(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - struct _RTMP_CHIP_DBG *chip_dbg = hc_get_chip_dbg(pAd->hdev_ctrl); - struct tr_delay_control *tr_delay_ctl = &pAd->tr_ctl.tr_delay_ctl; - UINT32 Value; - BOOLEAN b11nOnly = FALSE, bThreeAnt = FALSE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s()-->\n", __func__)); - RTMP_IO_READ32(pAd, STRAP_STA, &Value); - - if (GET_THREE_ANT(Value)) { - bThreeAnt = TRUE; - - if (GET_11N_ONLY(Value)) - b11nOnly = TRUE; - } - - mt7615_chipCap_init(pAd, b11nOnly, bThreeAnt); - mt7615_chipOp_init(); - NdisMoveMemory(pChipCap, &MT7615_ChipCap, sizeof(RTMP_CHIP_CAP)); - hc_register_chip_ops(pAd->hdev_ctrl, &MT7615_ChipOp); - pChipCap->hif_type = HIF_MT; -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else - Mt7615AsicArchOpsInit(pAd); -#endif - mt7615_chip_dbg_init(chip_dbg); - mt_phy_probe(pAd); - /* TODO: shiang-MT7615, debug for firmware download!! */ - pChipCap->tx_hw_hdr_len = pChipCap->TXWISize; - pChipCap->rx_hw_hdr_len = pChipCap->RXWISize; - - RTMP_DRS_ALG_INIT(pAd, RATE_ALG_AGBS); - /* - Following function configure beacon related parameters - in pChipCap - FlgIsSupSpecBcnBuf / BcnMaxHwNum / - WcidHwRsvNum / BcnMaxHwSize / BcnBase[] - */ - mt_chip_bcn_parameter_init(pAd); - pChipCap->OmacNums = 5; - pChipCap->ExtMbssOmacStartIdx = 0x10; - pChipCap->RepeaterStartIdx = 0x20; -#ifdef AIR_MONITOR - pChipCap->MaxRepeaterNum = 16; -#else - pChipCap->MaxRepeaterNum = 32; -#endif /* AIR_MONITOR */ -#ifdef BCN_OFFLOAD_SUPPORT - pChipCap->fgBcnOffloadSupport = TRUE; - pChipCap->fgIsNeedPretbttIntEvent = FALSE; -#endif - - if (MTK_REV_GTE(pAd, MT7615, MT7615E3)) - pChipCap->TmrHwVer = TMR_VER_1_5; - else - pChipCap->TmrHwVer = TMR_VER_1_0; - -#ifdef DOT11W_PMF_SUPPORT - pChipCap->FlgPMFEncrtptMode = PMF_ENCRYPT_MODE_2; -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef CUSTOMER_RSG_FEATURE - pAd->EnableChannelStatsCheck = FALSE; - NdisZeroMemory(&pAd->RadioStatsCounter, sizeof(RADIO_STATS_COUNTER)); -#endif -#ifdef CUSTOMER_DCC_FEATURE - pAd->ApEnableBeaconTable = FALSE; - pAd->CommonCfg.channelSwitch.CHSWMode = NORMAL_MODE; - pAd->CommonCfg.channelSwitch.CHSWCount = 0; - pAd->CommonCfg.channelSwitch.CHSWPeriod = 5; -#endif - /* For calibration log buffer size limitation issue */ - pAd->fgQAtoolBatchDumpSupport = TRUE; -#ifdef RED_SUPPORT - pAd->red_have_cr4 = TRUE; -#endif /* RED_SUPPORT */ - pAd->cp_have_cr4 = TRUE; -#ifdef CONFIG_AP_SUPPORT - /*VOW CR Address offset - Gen_1*/ - pAd->vow_gen.VOW_GEN = VOW_GEN_1; -#endif /* CONFIG_AP_SUPPORT */ - - if (IS_ASIC_CAP(pAd, fASIC_CAP_RX_DLY)) { - tr_delay_ctl->ul_rx_dly_ctl_tbl = mt7615_rx_dly_ctl_ul_tbl; - tr_delay_ctl->ul_rx_dly_ctl_tbl_size = - (sizeof(mt7615_rx_dly_ctl_ul_tbl) / - sizeof(mt7615_rx_dly_ctl_ul_tbl[0])); - tr_delay_ctl->dl_rx_dly_ctl_tbl = mt7615_rx_dly_ctl_dl_tbl; - tr_delay_ctl->dl_rx_dly_ctl_tbl_size = - (sizeof(mt7615_rx_dly_ctl_dl_tbl) / - sizeof(mt7615_rx_dly_ctl_dl_tbl[0])); - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<--%s()\n", __func__)); -} - -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else -INT Mt7615AsicArchOpsInit(RTMP_ADAPTER *pAd) -{ - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - arch_ops->archGetCrcErrCnt = MtAsicGetCrcErrCnt; - arch_ops->archGetCCACnt = MtAsicGetCCACnt; - arch_ops->archGetChBusyCnt = MtAsicGetChBusyCnt; - arch_ops->archSetAutoFallBack = MtAsicSetAutoFallBack; - arch_ops->archAutoFallbackInit = MtAsicAutoFallbackInit; - arch_ops->archUpdateProtect = MtAsicUpdateProtectByFw; - arch_ops->archUpdateRtsThld = MtAsicUpdateRtsThldByFw; - arch_ops->archSwitchChannel = MtAsicSwitchChannel; - arch_ops->asic_rts_on_off = mt_asic_rts_on_off; - arch_ops->asic_ampdu_efficiency_on_off = MtAsicAMPDUEfficiencyAdjust; - arch_ops->archResetBBPAgent = MtAsicResetBBPAgent; - arch_ops->archSetDevMac = MtAsicSetDevMacByFw; - arch_ops->archSetBssid = MtAsicSetBssidByFw; - arch_ops->archSetStaRec = MtAsicSetStaRecByFw; - arch_ops->archUpdateStaRecBa = MtAsicUpdateStaRecBaByFw; -#ifdef CONFIG_AP_SUPPORT - arch_ops->archSetMbssMode = MtAsicSetMbssMode; -#endif /* CONFIG_AP_SUPPORT */ - arch_ops->archDelWcidTab = MtAsicDelWcidTabByFw; -#ifdef HTC_DECRYPT_IOT - arch_ops->archSetWcidAAD_OM = MtAsicSetWcidAAD_OMByFw; -#endif /* HTC_DECRYPT_IOT */ -#ifdef MBSS_AS_WDS_AP_SUPPORT - arch_ops->archSetWcid4Addr_HdrTrans = MtAsicSetWcid4Addr_HdrTransByFw; -#endif - - arch_ops->archAddRemoveKeyTab = MtAsicAddRemoveKeyTabByFw; -#ifdef BCN_OFFLOAD_SUPPORT - arch_ops->archEnableBeacon = NULL; - arch_ops->archDisableBeacon = NULL; - arch_ops->archUpdateBeacon = MtUpdateBcnAndTimToMcu; -#else - arch_ops->archEnableBeacon = MtDmacAsicEnableBeacon; - arch_ops->archDisableBeacon = MtDmacAsicDisableBeacon; - arch_ops->archUpdateBeacon = MtUpdateBeaconToAsic; -#endif -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - arch_ops->archSetReptFuncEnable = MtAsicSetReptFuncEnableByFw; - arch_ops->archInsertRepeaterEntry = MtAsicInsertRepeaterEntryByFw; - arch_ops->archRemoveRepeaterEntry = MtAsicRemoveRepeaterEntryByFw; - arch_ops->archInsertRepeaterRootEntry = - MtAsicInsertRepeaterRootEntryByFw; -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#ifdef DOT11_N_SUPPORT - arch_ops->archSetRDG = NULL; -#endif /* DOT11_N_SUPPORT */ - arch_ops->archSetPiggyBack = MtAsicSetPiggyBack; - arch_ops->archSetPreTbtt = NULL; /* offload to BssInfoUpdateByFw */ - arch_ops->archSetGPTimer = MtAsicSetGPTimer; - arch_ops->archSetChBusyStat = MtAsicSetChBusyStat; - arch_ops->archGetTsfTime = MtAsicGetTsfTimeByFirmware; - arch_ops->archDisableSync = NULL; /* MtAsicDisableSyncByDriver; */ - arch_ops->archSetSyncModeAndEnable = - NULL; /* MtAsicEnableBssSyncByDriver; */ - arch_ops->archSetWmmParam = MtAsicSetWmmParam; - arch_ops->archGetWmmParam = MtAsicGetWmmParam; - arch_ops->archSetEdcaParm = MtAsicSetEdcaParm; - arch_ops->archSetRetryLimit = MtAsicSetRetryLimit; - arch_ops->archGetRetryLimit = MtAsicGetRetryLimit; - arch_ops->archSetSlotTime = MtAsicSetSlotTime; - arch_ops->archGetTxTsc = MtAsicGetTxTscByDriver; - arch_ops->archAddSharedKeyEntry = MtAsicAddSharedKeyEntry; - arch_ops->archRemoveSharedKeyEntry = MtAsicRemoveSharedKeyEntry; - arch_ops->archAddPairwiseKeyEntry = MtAsicAddPairwiseKeyEntry; - arch_ops->archSetBW = MtAsicSetBW; - arch_ops->archSetCtrlCh = mt_mac_set_ctrlch; - arch_ops->archWaitMacTxRxIdle = MtAsicWaitMacTxRxIdle; -#ifdef MAC_INIT_OFFLOAD - arch_ops->archSetMacTxRx = MtAsicSetMacTxRxByFw; - arch_ops->archSetRxvFilter = MtAsicSetRxvFilter; -#else - arch_ops->archSetMacTxRx = MtAsicSetMacTxRx; -#endif /*MAC_INIT_OFFLOAD*/ - arch_ops->archSetMacWD = MtAsicSetMacWD; -#ifdef MAC_APCLI_SUPPORT - arch_ops->archSetApCliBssid = MtAsicSetApCliBssid; -#endif /* MAC_APCLI_SUPPORT */ - arch_ops->archTOPInit = MtAsicTOPInit; - arch_ops->archSetTmrCR = MtSetTmrCRByFw; -#ifdef CONFIG_AP_SUPPORT - /* TODO: Fix me */ - arch_ops->archSetMbssWdevIfAddr = MtAsicSetMbssWdevIfAddrGen2; - arch_ops->archSetMbssHwCRSetting = MtDmacSetMbssHwCRSetting; - arch_ops->archSetExtTTTTHwCRSetting = MtDmacSetExtTTTTHwCRSetting; - arch_ops->archSetExtMbssEnableCR = MtDmacSetExtMbssEnableCR; -#endif /* CONFIG_AP_SUPPORT */ -#ifdef DBDC_MODE - arch_ops->archSetDbdcCtrl = MtAsicSetDbdcCtrlByFw; - arch_ops->archGetDbdcCtrl = MtAsicGetDbdcCtrlByFw; -#endif /*DBDC_MODE*/ - arch_ops->archUpdateRxWCIDTable = MtAsicUpdateRxWCIDTableByFw; -#ifdef TXBF_SUPPORT - arch_ops->archUpdateClientBfCap = mt_AsicClientBfCap; -#endif /* TXBF_SUPPORT */ - arch_ops->archUpdateBASession = MtAsicUpdateBASessionByFw; - arch_ops->archGetTidSn = MtAsicGetTidSnByDriver; - arch_ops->archSetSMPS = MtAsicSetSMPSByFw; - arch_ops->archRxHeaderTransCtl = MtAsicRxHeaderTransCtl; - arch_ops->archRxHeaderTaranBLCtl = MtAsicRxHeaderTaranBLCtl; - arch_ops->rx_pkt_process = mt_rx_pkt_process; -#ifdef MAC_INIT_OFFLOAD - arch_ops->archSetMacMaxLen = NULL; -#else - arch_ops->archSetMacMaxLen = MtAsicSetMacMaxLen; -#endif -#ifdef MAC_INIT_OFFLOAD - arch_ops->archSetTxStream = NULL; -#else - arch_ops->archSetTxStream = MtAsicSetTxStream; -#endif - arch_ops->archSetRxStream = NULL; /* MtAsicSetRxStream; */ -#ifdef MAC_INIT_OFFLOAD - arch_ops->archSetRxFilter = NULL; /* MtAsicSetRxFilter; */ -#else - arch_ops->archSetRxFilter = MtAsicSetRxFilter; -#endif -#ifdef DOT11_VHT_AC - arch_ops->archSetRtsSignalTA = MtAsicSetRtsSignalTA; -#endif /* DOT11_VHT_AC */ -#ifdef IGMP_SNOOP_SUPPORT - arch_ops->archMcastEntryInsert = CmdMcastEntryInsert; - arch_ops->archMcastEntryDelete = CmdMcastEntryDelete; -#ifdef IGMP_TVM_SUPPORT - arch_ops->archMcastConfigAgeout = CmdSetMcastEntryAgeOut; - arch_ops->archMcastGetMcastTable = CmdGetMcastEntryTable; -#endif /* IGMP_TVM_SUPPORT */ -#endif - arch_ops->write_txp_info = mtd_write_txp_info_by_cr4; - arch_ops->write_tmac_info_fixed_rate = mtd_write_tmac_info_fixed_rate; - arch_ops->write_tmac_info = mtd_write_tmac_info; - arch_ops->write_tx_resource = mtd_pci_write_tx_resource; - arch_ops->write_frag_tx_resource = mt_pci_write_frag_tx_resource; - arch_ops->kickout_data_tx = pci_kickout_data_tx; - - arch_ops->get_pkt_from_rx_resource = mtd_pci_get_pkt_from_rx_resource; - - if (IS_ASIC_CAP(pAd, fASIC_CAP_WHNAT)) - arch_ops->get_pkt_from_rx1_resource = - mtd_pci_get_pkt_from_rx_resource_io; - else - arch_ops->get_pkt_from_rx1_resource = - mtd_pci_get_pkt_from_rx_resource; - - arch_ops->get_resource_idx = HcGetTxRingIdx; - arch_ops->get_tx_resource_free_num = pci_get_tx_resource_free_num; - arch_ops->check_hw_resource = mtd_check_hw_resource; - arch_ops->inc_resource_full_cnt = pci_inc_resource_full_cnt; - arch_ops->get_resource_state = pci_get_resource_state; - arch_ops->set_resource_state = pci_set_resource_state; - arch_ops->check_resource_state = pci_check_resource_state; - arch_ops->get_hif_buf = mt_pci_get_hif_buf; - arch_ops->hw_tx = mtd_hw_tx; - arch_ops->mlme_hw_tx = mtd_mlme_hw_tx; -#ifdef CONFIG_ATE - arch_ops->ate_hw_tx = mtd_ate_hw_tx; -#endif - arch_ops->rx_done_handle = mtd_rx_done_handle; - arch_ops->tx_dma_done_handle = mtd_tx_dma_done_handle; - arch_ops->cmd_dma_done_handle = mt_cmd_dma_done_handle; - arch_ops->fwdl_dma_done_handle = mt_fwdl_dma_done_handle; - - if (IS_ASIC_CAP(pAd, fASIC_CAP_RX_DLY)) - arch_ops->hw_isr = mtd_isr; - else - arch_ops->hw_isr = mtd_non_rx_delay_isr; - - return TRUE; -} -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7615_dbg.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7615_dbg.c deleted file mode 100644 index 4d60cec30f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7615_dbg.c +++ /dev/null @@ -1,1481 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** -*/ - -#include "rt_config.h" -#include "chip/mt7615_cr.h" -#include "hdev/hdev.h" - -static INT pse_pg_cnt[] = { 256, 512, 512, 1024, 768, 1536, 1024, 2048, - 1280, 2560, 1536, 3072, 1792, 3584, 0, 0 }; -static INT ple_pg_cnt[] = { 512, 1024, 1024, 2048, 1536, 3072, 2048, 4095, 0 }; -static EMPTY_QUEUE_INFO_T Queue_Empty_info[] = { - { "CPU Q0", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_0 }, - { "CPU Q1", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_1 }, - { "CPU Q2", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_2 }, - { "CPU Q3", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_3 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, /* 4~15 not defined */ - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { "ALTX Q0", ENUM_UMAC_LMAC_PORT_2, - ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_0 }, /* Q16 */ - { "BMC Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BMC_0 }, - { "BCN Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BNC_0 }, - { "PSMP Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_0 }, - { "ALTX Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_1 }, - { "BMC Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BMC_1 }, - { "BCN Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BNC_1 }, - { "PSMP Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_1 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, /* 24~29 not defined */ - { "RLS Q", ENUM_PLE_CTRL_PSE_PORT_3, ENUM_UMAC_PLE_CTRL_P3_Q_0X1E }, - { "RLS2 Q", ENUM_PLE_CTRL_PSE_PORT_3, ENUM_UMAC_PLE_CTRL_P3_Q_0X1F } -}; -static PCHAR sta_ctrl_reg[] = { "ENABLE", "DISABLE", "PAUSE" }; - -static INT32 chip_dump_ps_table(struct hdev_ctrl *ctrl, UINT32 ent_type, - BOOLEAN bReptCli) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - int i; - UINT32 ps_stat[4] = { 0 }; - UINT32 regValue = 0; - UINT8 bmc_cnt[4] = { 0 }; - UINT8 ext_bmc_cnt[15] = { 0 }; - - HW_IO_READ32(pAd, PLE_STATION_PAUSE0, &ps_stat[0]); - HW_IO_READ32(pAd, PLE_STATION_PAUSE1, &ps_stat[1]); - HW_IO_READ32(pAd, PLE_STATION_PAUSE2, &ps_stat[2]); - HW_IO_READ32(pAd, PLE_STATION_PAUSE3, &ps_stat[3]); - HW_IO_READ32(pAd, ARB_BMCCR0, ®Value); - bmc_cnt[0] = regValue & 0xff; - bmc_cnt[1] = (regValue & 0xff00) >> 8; - bmc_cnt[2] = (regValue & 0xff0000) >> 16; - bmc_cnt[3] = (regValue & 0xff000000) >> 24; - HW_IO_READ32(pAd, ARB_BMCCR1, ®Value); - ext_bmc_cnt[0] = regValue & 0xff; - ext_bmc_cnt[1] = (regValue & 0xff00) >> 8; - ext_bmc_cnt[2] = (regValue & 0xff0000) >> 16; - ext_bmc_cnt[3] = (regValue & 0xff000000) >> 24; - HW_IO_READ32(pAd, ARB_BMCCR2, ®Value); - ext_bmc_cnt[4] = regValue & 0xff; - ext_bmc_cnt[5] = (regValue & 0xff00) >> 8; - ext_bmc_cnt[6] = (regValue & 0xff0000) >> 16; - ext_bmc_cnt[7] = (regValue & 0xff000000) >> 24; - HW_IO_READ32(pAd, ARB_BMCCR3, ®Value); - ext_bmc_cnt[8] = regValue & 0xff; - ext_bmc_cnt[9] = (regValue & 0xff00) >> 8; - ext_bmc_cnt[10] = (regValue & 0xff0000) >> 16; - ext_bmc_cnt[11] = (regValue & 0xff000000) >> 24; - HW_IO_READ32(pAd, ARB_BMCCR4, ®Value); - ext_bmc_cnt[12] = regValue & 0xff; - ext_bmc_cnt[13] = (regValue & 0xff00) >> 8; - ext_bmc_cnt[14] = (regValue & 0xff0000) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("PAUSE_info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%08x %08x %08x %08x\n", ps_stat[0], ps_stat[1], ps_stat[2], - ps_stat[3])); - - for (i = 0; i < 4; i++) { - if (bmc_cnt[i]) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BMC(%x)%d ", i, bmc_cnt[i])); - } - - for (i = 0; i < 15; i++) { - if (ext_bmc_cnt[i]) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BMC(%x)%d ", i + 0x11, ext_bmc_cnt[i])); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n\n")); - /* Dump PS info from FW */ - CmdExtGeneralTestAPPWS(pAd, APPWS_ACTION_DUMP_INFO); - return TRUE; -} - -static INT32 chip_show_tmac_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - UINT32 Value; - RTMP_ADAPTER *pAd = ctrl->priv; - - RTMP_IO_READ32(pAd, TMAC_TCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TX Stream = %d\n", GET_TMAC_TCR_TX_STREAM_NUM(Value) + 1)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TX RIFS Enable = %d\n", GET_TX_RIFS_EN(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RX RIFS Mode = %d\n", GET_RX_RIFS_MODE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TXOP TBTT Control = %d\n", GET_TXOP_TBTT_CONTROL(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TXOP TBTT Stop Control = %d\n", - GET_TBTT_TX_STOP_CONTROL(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TXOP Burst Stop = %d\n", GET_TXOP_BURST_STOP(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RDG Mode = %d\n", GET_RDG_RA_MODE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RDG Responser Enable = %d\n", GET_RDG_RESP_EN(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Smoothing = %d\n", GET_SMOOTHING(Value))); - RTMP_IO_READ32(pAd, TMAC_PSCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP Power Save RXPE Off Time(unit 2us) = %d\n", - GET_APS_OFF_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP Power Save RXPE On Time(unit 2us) = %d\n", - APS_ON_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP Power Save Halt Time (unit 32us) = %d\n", - GET_APS_HALT_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP Power Enable = %d\n", GET_APS_EN(Value))); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC0 TXOP = 0x%x (unit: 32us)\n", GET_AC0LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC1 TXOP = 0x%x (unit: 32us)\n", GET_AC1LIMIT(Value))); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC2 TXOP = 0x%x (unit: 32us)\n", GET_AC2LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC3 TXOP = 0x%x (unit: 32us)\n", GET_AC3LIMIT(Value))); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR3, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC10 TXOP = 0x%x (unit: 32us)\n", GET_AC10LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC11 TXOP = 0x%x (unit: 32us)\n", GET_AC11LIMIT(Value))); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR2, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC12 TXOP = 0x%x (unit: 32us)\n", GET_AC12LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC13 TXOP = 0x%x (unit: 32us)\n", GET_AC13LIMIT(Value))); - RTMP_IO_READ32(pAd, TMAC_ICR_BAND_0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("EIFS Time, Band0 (unit: 1us) = %d\n", - GET_ICR_EIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RIFS Time, Band0 (unit: 1us) = %d\n", - GET_ICR_RIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SIFS Time, Band0 (unit: 1us) = %d\n", - GET_ICR_SIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SLOT Time, Band0 (unit: 1us) = %d\n", - GET_ICR_SLOT_TIME(Value))); - RTMP_IO_READ32(pAd, TMAC_ICR_BAND_1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("EIFS Time, Band1 (unit: 1us) = %d\n", - GET_ICR_EIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RIFS Time, Band1 (unit: 1us) = %d\n", - GET_ICR_RIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SIFS Time, Band1 (unit: 1us) = %d\n", - GET_ICR_SIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SLOT Time, Band1 (unit: 1us) = %d\n", - GET_ICR_SLOT_TIME(Value))); - RTMP_IO_READ32(pAd, TMAC_ATCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Aggregation Timeout (unit: 50ns) = 0x%x\n", - GET_AGG_TOUT(Value))); - return 0; -} - -static INT32 chip_show_agg_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - UINT32 Value; - RTMP_ADAPTER *pAd = ctrl->priv; - - RTMP_IO_READ32(pAd, AGG_PCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MM Protection = %d\n", GET_MM_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("GF Protection = %d\n", GET_GF_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Protection Mode = %d\n", GET_PROTECTION_MODE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BW40 Protection = %d\n", GET_BW40_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RIFS Protection = %d\n", GET_RIFS_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BW80 Protection = %d\n", GET_BW80_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BW160 Protection = %d\n", GET_BW160_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ERP Protection = 0x%x\n", GET_ERP_PROTECTION(Value))); - RTMP_IO_READ32(pAd, AGG_PCR1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RTS Threshold(packet length) = 0x%x\n", - GET_RTS_THRESHOLD(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RTS PKT Nums Threshold = %d\n", - GET_RTS_PKT_NUM_THRESHOLD(Value))); - RTMP_IO_READ32(pAd, AGG_MRCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RTS Retry Count Limit = %d\n", - GET_RTS_RTY_CNT_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR Frame Tx Count Limit = %d\n", - GET_BAR_TX_CNT_LIMIT(Value))); - RTMP_IO_READ32(pAd, AGG_ACR0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AMPDU No BA Rule = %d\n", GET_AMPDU_NO_BA_RULE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AMPDU No BA AR Rule = %d\n", - GET_AGG_ACR_AMPDU_NO_BA_AR_RULE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR Tx Rate = 0x%x\n", GET_BAR_RATE_TX_RATE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR Tx Mode = 0x%x\n", GET_BAR_RATE_TX_MODE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR Nsts = %d\n", GET_BAR_RATE_NSTS(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR STBC = %d\n", GET_BAR_RATE_STBC(Value))); - RTMP_IO_READ32(pAd, AGG_AALCR0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC0 Agg limit = %d\n", GET_AC0_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC1 Agg limit = %d\n", GET_AC1_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC2 Agg limit = %d\n", GET_AC2_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC3 Agg limit = %d\n", GET_AC3_AGG_LIMIT(Value))); - RTMP_IO_READ32(pAd, AGG_AALCR1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC10 Agg limit = %d\n", GET_AC10_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC11 Agg limit = %d\n", GET_AC11_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC12 Agg limit = %d\n", GET_AC12_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC13 Agg limit = %d\n", GET_AC13_AGG_LIMIT(Value))); - RTMP_IO_READ32(pAd, AGG_AWSCR0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize0 limit = %d\n", GET_WINSIZE0(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize1 limit = %d\n", GET_WINSIZE1(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize2 limit = %d\n", GET_WINSIZE2(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize3 limit = %d\n", GET_WINSIZE3(Value))); - RTMP_IO_READ32(pAd, AGG_AWSCR1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize4 limit = %d\n", GET_WINSIZE4(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize5 limit = %d\n", GET_WINSIZE5(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize6 limit = %d\n", GET_WINSIZE6(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize7 limit = %d\n", GET_WINSIZE7(Value))); - return 0; -} - -static INT32 chip_dump_mib_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); -#if defined(MT7615) || defined(MT7622) - enum { bss_nums = 4 }; -#endif /* defined(MT7615) || defined(MT7622) */ - UINT32 mac_val, mac_val1, idx, band_idx = 0, band_offset = 0, - ampdu_cnt[7]; - UINT32 msdr6, msdr7, msdr8, msdr9, msdr10, msdr16, msdr17, msdr18, - msdr19, msdr20, msdr21; - UINT32 mbxsdr[bss_nums][4]; - UINT32 mbtcr[16], mbtbcr[16], mbrcr[16], mbrbcr[16]; - UINT32 btcr[bss_nums], btbcr[bss_nums], brcr[bss_nums], brbcr[bss_nums], - btdcr[bss_nums], brdcr[bss_nums]; - UINT32 mu_cnt[5]; - - for (band_idx = 0; band_idx < pChipCap->band_cnt; band_idx++) { - if (arg != NULL && band_idx != simple_strtoul(arg, 0, 10)) - continue; - - band_offset = 0x200 * band_idx; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Band %d MIB Status\n", band_idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===============================\n")); - RTMP_IO_READ32(pAd, MIB_M0SCR0 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MIB Status Control=0x%x\n", mac_val)); - RTMP_IO_READ32(pAd, MIB_M0PBSCR + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MIB Per-BSS Status Control=0x%x\n", mac_val)); - - RTMP_IO_READ32(pAd, MIB_M0SDR6 + band_offset, &msdr6); - RTMP_IO_READ32(pAd, MIB_M0SDR7 + band_offset, &msdr7); - RTMP_IO_READ32(pAd, MIB_M0SDR8 + band_offset, &msdr8); - RTMP_IO_READ32(pAd, MIB_M0SDR9 + band_offset, &msdr9); - RTMP_IO_READ32(pAd, MIB_M0SDR10 + band_offset, &msdr10); - RTMP_IO_READ32(pAd, MIB_M0SDR16 + band_offset, &msdr16); - RTMP_IO_READ32(pAd, MIB_M0SDR17 + band_offset, &msdr17); - RTMP_IO_READ32(pAd, MIB_M0SDR18 + band_offset, &msdr18); - RTMP_IO_READ32(pAd, MIB_M0SDR19 + band_offset, &msdr19); - RTMP_IO_READ32(pAd, MIB_M0SDR20 + band_offset, &msdr20); - RTMP_IO_READ32(pAd, MIB_M0SDR21 + band_offset, &msdr21); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Phy/Timing Related Counters===\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tChannelIdleCnt=0x%x\n", msdr6 & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCCA_NAV_Tx_Time=0x%x\n", msdr9 & 0xffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRx_MDRDY_CNT=0x%x\n", msdr10 & 0x3ffffff)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCCK_MDRDY_TIME=0x%x, OFDM_MDRDY_TIME=0x%x, OFDM_GREEN_MDRDY_TIME=0x%x\n", - msdr19 & 0x3ffffff, msdr20 & 0x3ffffff, - msdr21 & 0x3ffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPrim CCA Time=0x%x\n", msdr16 & 0xffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSec CCA Time=0x%x\n", msdr17 & 0xffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPrim ED Time=0x%x\n", msdr18 & 0xffffff)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Tx Related Counters(Generic)===\n")); - RTMP_IO_READ32(pAd, MIB_M0SDR0 + band_offset, &mac_val); -#ifdef CUSTOMER_RSG_FEATURE - pAd->RadioStatsCounter.TotalBeaconSentCount += - (mac_val & 0xffff); - pAd->RadioStatsCounter.TotalTxCount += (mac_val & 0xffff); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBeaconTxCnt=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0DR0 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx 20MHz Cnt=0x%x\n", mac_val & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx 40MHz Cnt=0x%x\n", (mac_val >> 16) & 0xffff)); - RTMP_IO_READ32(pAd, MIB_M0DR1 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx 80MHz Cnt=0x%x\n", mac_val & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx 160MHz Cnt=0x%x\n", (mac_val >> 16) & 0xffff)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===AMPDU Related Counters===\n")); - RTMP_IO_READ32(pAd, MIB_M0SDR12 + band_offset, &du_cnt[0]); - RTMP_IO_READ32(pAd, MIB_M0SDR14 + band_offset, &du_cnt[1]); - RTMP_IO_READ32(pAd, MIB_M0SDR15 + band_offset, &du_cnt[2]); - RTMP_IO_READ32(pAd, MIB_M0DR2 + band_offset, &du_cnt[3]); - RTMP_IO_READ32(pAd, MIB_M0DR3 + band_offset, &du_cnt[4]); - RTMP_IO_READ32(pAd, MIB_M0DR4 + band_offset, &du_cnt[5]); - RTMP_IO_READ32(pAd, MIB_M0DR5 + band_offset, &du_cnt[6]); - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tRx BA_Cnt=0x%x\n", ampdu_cnt[0] & 0xffff)); */ - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tTx AMPDU_Burst_Cnt=0x%x\n", (ampdu_cnt[0] >> 16 ) & 0xffff)); */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx AMPDU_Pkt_Cnt=0x%x\n", ampdu_cnt[0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx AMPDU_MPDU_Pkt_Cnt=0x%x\n", - ampdu_cnt[1] & 0xffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAMPDU SuccessCnt=0x%x\n", - ampdu_cnt[2] & 0xffffff)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx Agg Range: \t1 \t2~5 \t6~15 \t16~22 \t23~33 \t34~49 \t50~57 \t58~64\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", - (ampdu_cnt[3]) & 0xffff, (ampdu_cnt[3] >> 16) & 0xffff, - (ampdu_cnt[4]) & 0xffff, (ampdu_cnt[4] >> 16) & 0xffff, - (ampdu_cnt[5]) & 0xffff, (ampdu_cnt[5] >> 16) & 0xffff, - (ampdu_cnt[6]) & 0xffff, - (ampdu_cnt[6] >> 16) & 0xffff)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===MU Related Counters===\n")); - MAC_IO_READ32(pAd, MIB_M0SDR34, &mu_cnt[0]); - MAC_IO_READ32(pAd, MIB_M0DR8, &mu_cnt[1]); - MAC_IO_READ32(pAd, MIB_M0DR9, &mu_cnt[2]); - MAC_IO_READ32(pAd, MIB_M0DR10, &mu_cnt[3]); - MAC_IO_READ32(pAd, MIB_M0DR11, &mu_cnt[4]); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMUBF_TX_COUNT=0x%x\n", mu_cnt[0] & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMU_TX_MPDU_COUNT(Ok+Fail)=0x%x\n", mu_cnt[1])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[2])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMU_TO_SU_PPDU_COUNT=0x%x\n", mu_cnt[3] & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[4])); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Rx Related Counters(Generic)===\n")); - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tVector Overflow Drop Cnt=0x%x\n", (msdr6 >> 16 ) & 0xffff)); */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tVector Mismacth Cnt=0x%x\n", msdr7 & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDelimiter Fail Cnt=0x%x\n", msdr8 & 0xffff)); - RTMP_IO_READ32(pAd, MIB_M0SDR3 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxFCSErrCnt=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0SDR4 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxFifoFullCnt=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0SDR11 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxLenMismatch=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0SDR5 + band_offset, &mac_val); -#ifdef CUSTOMER_RSG_FEATURE - pAd->RadioStatsCounter.TotalRxCount += (mac_val & 0xffff); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxMPDUCnt=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0SDR29 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPFDropCnt=0x%x\n", (mac_val & 0x00ff))); - RTMP_IO_READ32(pAd, MIB_M0SDR22 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRx AMPDU Cnt=0x%x\n", mac_val)); - /* TODO: shiang-MT7615, is MIB_M0SDR23 used for Rx total byte count for all or just AMPDU only??? */ - RTMP_IO_READ32(pAd, MIB_M0SDR23 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRx Total ByteCnt=0x%x\n", mac_val)); - } - - for (idx = 0; idx < bss_nums; idx++) { - RTMP_IO_READ32(pAd, WTBL_BTCRn + idx * 4, &btcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BTBCRn + idx * 4, &btbcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BRCRn + idx * 4, &brcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BRBCRn + idx * 4, &brbcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BTDCRn + idx * 4, &btdcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BRDCRn + idx * 4, &brdcr[idx]); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Per-BSS Related Tx/Rx Counters===\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BSS Idx TxCnt/DataCnt TxByteCnt RxCnt/DataCnt RxByteCnt\n")); - - for (idx = 0; idx < bss_nums; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%d\t 0x%x/0x%x\t 0x%x \t 0x%x/0x%x \t 0x%x\n", idx, - btcr[idx], btdcr[idx], btbcr[idx], brcr[idx], - brdcr[idx], brbcr[idx])); - } - - for (idx = 0; idx < bss_nums; idx++) { - RTMP_IO_READ32(pAd, MIB_MB0SDR0 + idx * 0x10, &mbxsdr[idx][0]); - RTMP_IO_READ32(pAd, MIB_MB0SDR1 + idx * 0x10, &mbxsdr[idx][1]); - RTMP_IO_READ32(pAd, MIB_MB0SDR2 + idx * 0x10, &mbxsdr[idx][2]); - RTMP_IO_READ32(pAd, MIB_MB0SDR3 + idx * 0x10, &mbxsdr[idx][3]); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Per-MBSS Related MIB Counters===\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BSS Idx RTSTx/RetryCnt BAMissCnt AckFailCnt FrmRetry1/2/3Cnt\n")); - - for (idx = 0; idx < bss_nums; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%d:\t0x%x/0x%x 0x%x \t 0x%x \t 0x%x/0x%x/0x%x\n", - idx, mbxsdr[idx][0], (mbxsdr[idx][0] >> 16) & 0xffff, - mbxsdr[idx][1], (mbxsdr[idx][1] >> 16) & 0xffff, - mbxsdr[idx][2], (mbxsdr[idx][2] >> 16) & 0xffff, - mbxsdr[idx][3] & 0xffff)); - } - - for (idx = 0; idx < 16; idx++) { - RTMP_IO_READ32(pAd, WTBL_MBTCRn + idx * 4, &mbtcr[idx]); - RTMP_IO_READ32(pAd, WTBL_MBTBCRn + idx * 4, &mbtbcr[idx]); - RTMP_IO_READ32(pAd, WTBL_MBRCRn + idx * 4, &mbrcr[idx]); - RTMP_IO_READ32(pAd, WTBL_MBRBCRn + idx * 4, &mbrbcr[idx]); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Per-MBSS Related Tx/Rx Counters===\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MBSSIdx TxCnt TxByteCnt RxCnt RxByteCnt\n")); - - for (idx = 0; idx < 16; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%d\t 0x%x\t 0x%x \t 0x%x \t 0x%x\n", idx, mbtcr[idx], - mbtbcr[idx], mbrcr[idx], mbrbcr[idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Dummy delimiter insertion result===\n")); - RTMP_IO_READ32(pAd, MIB_M0DR6, &mac_val); - RTMP_IO_READ32(pAd, MIB_M0DR7, &mac_val1); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Range1 = %d\t Range2 = %d\t Range3 = %d\t Range4 = %d\n", - GET_TX_DDLMT_RNG1_CNT(mac_val), - GET_TX_DDLMT_RNG2_CNT(mac_val), - GET_TX_DDLMT_RNG3_CNT(mac_val1), - GET_TX_DDLMT_RNG4_CNT(mac_val1))); -#ifdef TRACELOG_TCP_PKT - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TCP RxAck = %d\t TxData = %d", pAd->u4TcpRxAckCnt, - pAd->u4TcpTxDataCnt)); - pAd->u4TcpRxAckCnt = 0; - pAd->u4TcpTxDataCnt = 0; -#endif /* TRACELOG_TCP_PKT */ - return TRUE; -} - -static INT32 chip_show_pse_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - UINT32 pse_buf_ctrl, pg_sz, pg_num; - UINT32 pse_stat, pg_flow_ctrl[16] = { 0 }; - UINT32 fpg_cnt, ffa_cnt, fpg_head, fpg_tail; - UINT32 max_q, min_q, rsv_pg, used_pg; - INT32 i; - - HW_IO_READ32(pAd, PSE_PBUF_CTRL, &pse_buf_ctrl); - HW_IO_READ32(pAd, PSE_QUEUE_EMPTY, &pse_stat); - HW_IO_READ32(pAd, PSE_FREEPG_CNT, &pg_flow_ctrl[0]); - HW_IO_READ32(pAd, PSE_FREEPG_HEAD_TAIL, &pg_flow_ctrl[1]); - HW_IO_READ32(pAd, PSE_PG_HIF0_GROUP, &pg_flow_ctrl[2]); - HW_IO_READ32(pAd, PSE_HIF0_PG_INFO, &pg_flow_ctrl[3]); - HW_IO_READ32(pAd, PSE_PG_HIF1_GROUP, &pg_flow_ctrl[4]); - HW_IO_READ32(pAd, PSE_HIF1_PG_INFO, &pg_flow_ctrl[5]); - HW_IO_READ32(pAd, PSE_PG_CPU_GROUP, &pg_flow_ctrl[6]); - HW_IO_READ32(pAd, PSE_CPU_PG_INFO, &pg_flow_ctrl[7]); - HW_IO_READ32(pAd, PSE_PG_LMAC0_GROUP, &pg_flow_ctrl[8]); - HW_IO_READ32(pAd, PSE_LMAC0_PG_INFO, &pg_flow_ctrl[9]); - HW_IO_READ32(pAd, PSE_PG_LMAC1_GROUP, &pg_flow_ctrl[10]); - HW_IO_READ32(pAd, PSE_LMAC1_PG_INFO, &pg_flow_ctrl[11]); - HW_IO_READ32(pAd, PSE_PG_LMAC2_GROUP, &pg_flow_ctrl[12]); - HW_IO_READ32(pAd, PSE_LMAC2_PG_INFO, &pg_flow_ctrl[13]); - HW_IO_READ32(pAd, PSE_PG_PLE_GROUP, &pg_flow_ctrl[14]); - HW_IO_READ32(pAd, PSE_PLE_PG_INFO, &pg_flow_ctrl[15]); - /* Configuration Info */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PSE Configuration Info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPacket Buffer Control(0x82068014): 0x%08x\n", - pse_buf_ctrl)); - pg_sz = (pse_buf_ctrl & (0x1 << 31)) >> 31; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPage Size=%d(%d bytes per page)\n", pg_sz, - (pg_sz == 1 ? 256 : 128))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPage Offset=%d(in unit of 64KB)\n", - GET_PSE_PBUF_OFFSET(pse_buf_ctrl))); - pg_num = PSE_GET_TOTAL_PAGE_CFG(pse_buf_ctrl); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tConfigured Total Page=%d(%d pages)\n", pg_num, - (pg_num < 14 ? pse_pg_cnt[pg_num] : 0))); - pg_num = (pse_buf_ctrl & PSE_TOTAL_PAGE_NUM_MASK); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tAvailable Total Page=%d pages\n", pg_num)); - /* Page Flow Control */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PSE Page Flow Control:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFree page counter(0x82068100): 0x%08x\n", - pg_flow_ctrl[0])); - fpg_cnt = pg_flow_ctrl[0] & 0xfff; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe toal page number of free=0x%03x\n", fpg_cnt)); - ffa_cnt = (pg_flow_ctrl[0] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe free page numbers of free for all=0x%03x\n", - ffa_cnt)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFree page head and tail(0x82068104): 0x%08x\n", - pg_flow_ctrl[1])); - fpg_head = pg_flow_ctrl[1] & 0xfff; - fpg_tail = (pg_flow_ctrl[1] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe tail/head page of free page list=0x%03x/0x%03x\n", - fpg_tail, fpg_head)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of HIF0 group(0x82068110): 0x%08x\n", - pg_flow_ctrl[2])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHIF0 group page status(0x82068114): 0x%08x\n", - pg_flow_ctrl[3])); - min_q = pg_flow_ctrl[2] & 0xfff; - max_q = (pg_flow_ctrl[2] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of HIF0 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[3] & 0xfff; - used_pg = (pg_flow_ctrl[3] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of HIF0 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of HIF1 group(0x82068118): 0x%08x\n", - pg_flow_ctrl[4])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHIF1 group page status(0x8206811c): 0x%08x\n", - pg_flow_ctrl[5])); - min_q = pg_flow_ctrl[4] & 0xfff; - max_q = (pg_flow_ctrl[4] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of HIF1 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[5] & 0xfff; - used_pg = (pg_flow_ctrl[5] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of HIF1 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of CPU group(0x82068150): 0x%08x\n", - pg_flow_ctrl[6])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCPU group page status(0x82068154): 0x%08x\n", - pg_flow_ctrl[7])); - min_q = pg_flow_ctrl[6] & 0xfff; - max_q = (pg_flow_ctrl[6] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of CPU group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[7] & 0xfff; - used_pg = (pg_flow_ctrl[7] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of CPU group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of LMAC0 group(0x82068170): 0x%08x\n", - pg_flow_ctrl[8])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tLMAC0 group page status(0x82068174): 0x%08x\n", - pg_flow_ctrl[9])); - min_q = pg_flow_ctrl[8] & 0xfff; - max_q = (pg_flow_ctrl[8] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of LMAC0 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[9] & 0xfff; - used_pg = (pg_flow_ctrl[9] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of LMAC0 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of LMAC1 group(0x82068178): 0x%08x\n", - pg_flow_ctrl[10])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tLMAC1 group page status(0x8206817c): 0x%08x\n", - pg_flow_ctrl[11])); - min_q = pg_flow_ctrl[10] & 0xfff; - max_q = (pg_flow_ctrl[10] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of LMAC1 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[11] & 0xfff; - used_pg = (pg_flow_ctrl[11] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of LMAC1 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of LMAC2 group(0x82068180): 0x%08x\n", - pg_flow_ctrl[11])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tLMAC2 group page status(0x82068184): 0x%08x\n", - pg_flow_ctrl[12])); - min_q = pg_flow_ctrl[12] & 0xfff; - max_q = (pg_flow_ctrl[12] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of LMAC2 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[13] & 0xfff; - used_pg = (pg_flow_ctrl[13] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of LMAC2 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of PLE group(0x82068190): 0x%08x\n", - pg_flow_ctrl[14])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPLE group page status(0x82068194): 0x%08x\n", - pg_flow_ctrl[15])); - min_q = pg_flow_ctrl[14] & 0xfff; - max_q = (pg_flow_ctrl[14] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of PLE group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[15] & 0xfff; - used_pg = (pg_flow_ctrl[15] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of PLE group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - /* Queue Empty Status */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PSE Queue Empty Status:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tQUEUE_EMPTY(0x820680b0): 0x%08x\n", pse_stat)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tCPU Q0/1/2/3 empty=%d/%d/%d/%d\n", pse_stat & 0x1, - ((pse_stat & 0x2) >> 1), ((pse_stat & 0x4) >> 2), - ((pse_stat & 0x8) >> 3))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHIF Q0/1 empty=%d/%d\n", - ((pse_stat & (0x1 << 16)) >> 16), - ((pse_stat & (0x1 << 17)) >> 17))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tLMAC TX Q empty=%d\n", - ((pse_stat & (0x1 << 24)) >> 24))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tRLS_Q empty=%d\n", ((pse_stat & (0x1 << 31)) >> 31))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Nonempty Q info:\n")); - - for (i = 0; i < 31; i++) { - if (((pse_stat & (0x1 << i)) >> i) == 0) { - UINT32 hfid, tfid, pktcnt, fl_que_ctrl[3] = { 0 }; - - if (i < 4) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tCPU Q%d: ", i)); - fl_que_ctrl[0] |= (0x1 << 14); - fl_que_ctrl[0] |= (i << 8); - } else if (i == 16) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tHIF Q0: ")); - fl_que_ctrl[0] |= (0x0 << 14); - fl_que_ctrl[0] |= (0x0 << 8); - } else if (i == 17) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tHIF Q1: ")); - fl_que_ctrl[0] |= (0x0 << 14); - fl_que_ctrl[0] |= (0x1 << 8); - } else if (i == 24) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tLMAC TX Q: ")); - fl_que_ctrl[0] |= (0x2 << 14); - fl_que_ctrl[0] |= (0x0 << 8); - } else if (i == 31) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tRLS Q: ")); - fl_que_ctrl[0] |= (0x3 << 14); - fl_que_ctrl[0] |= (i << 8); - } else - continue; - - fl_que_ctrl[0] |= (0x1 << 31); - HW_IO_WRITE32(pAd, PSE_FL_QUE_CTRL_0, fl_que_ctrl[0]); - HW_IO_READ32(pAd, PSE_FL_QUE_CTRL_2, &fl_que_ctrl[1]); - HW_IO_READ32(pAd, PSE_FL_QUE_CTRL_3, &fl_que_ctrl[2]); - hfid = fl_que_ctrl[1] & 0xfff; - tfid = (fl_que_ctrl[1] & 0xfff << 16) >> 16; - pktcnt = fl_que_ctrl[2] & 0xfff; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("tail/head fid = 0x%03x/0x%03x, pkt cnt = %x\n", - tfid, hfid, pktcnt)); - } - } - - return TRUE; -} - -static INT32 chip_show_protect_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - UINT32 val; - RTMP_ADAPTER *pAd = ctrl->priv; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, (" -Proetction\n")); - RTMP_IO_READ32(pAd, AGG_PCR, &val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" > AGG_PCR 0x%08x\n", val)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" -RTS Threshold\n")); - RTMP_IO_READ32(pAd, AGG_PCR1, &val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" > AGG_PCR1 0x%08x\n", val)); - return TRUE; -} - -static INT32 chip_show_cca_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - UINT32 val; - RTMP_ADAPTER *pAd = ctrl->priv; - - MAC_IO_READ32(pAd, RMAC_DEBUG_CR, &val); - val |= (1 << 31); /* For Band0 */ - MAC_IO_WRITE32(pAd, RMAC_DEBUG_CR, val); - /* Debug CR */ - MAC_IO_WRITE32(pAd, (WF_CFG_OFF_BASE + 0x2c), 0xf); - MAC_IO_WRITE32(pAd, (WF_CFG_BASE + 0x14), 0x1f); - MAC_IO_WRITE32(pAd, (WF_CFG_BASE + 0x18), 0x06060606); - MAC_IO_WRITE32(pAd, (WF_CFG_BASE + 0x4c), 0x1c1c1d1d); - MAC_IO_READ32(pAd, (WF_CFG_BASE + 0x24), &val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CCA for BAND0 info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-- CCA Prim: %d, SE20: %d, SEC40: %d\n", - ((val & (1 << 14)) >> 14), ((val & (1 << 6)) >> 6), - ((val & (1 << 5)) >> 5))); - MAC_IO_READ32(pAd, RMAC_DEBUG_CR, &val); - val &= ~(1 << 31); /* For Band1 */ - MAC_IO_WRITE32(pAd, RMAC_DEBUG_CR, val); - MAC_IO_READ32(pAd, (WF_CFG_BASE + 0x24), &val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CCA for BAND1 info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-- CCA Prim: %d, SE20: %d, SEC40: %d\n", - ((val & (1 << 14)) >> 14), ((val & (1 << 6)) >> 6), - ((val & (1 << 5)) >> 5))); - return 0; -} - -static INT32 chip_set_cca_en(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - BOOLEAN enable; - UINT32 val; - RTMP_ADAPTER *pAd = ctrl->priv; - - enable = os_str_tol(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Enable CCA on Band0 SEC40: %s\n", (enable) ? "ON" : "OFF")); - /* RF CR for BAND0 CCA */ - PHY_IO_READ32(pAd, PHY_BAND0_PHY_CCA, &val); - val |= ((1 << 18) | (1 << 2)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-- Force Mode: %d, Force CCA SEC40: %d [0x%08x]\n", - ((val & (1 << 18)) >> 18), ((val & (1 << 2)) >> 2), val)); - PHY_IO_WRITE32(pAd, PHY_BAND0_PHY_CCA, val); - /* TMAC_TCR for the normal Tx BW */ - MAC_IO_READ32(pAd, TMAC_TCR, &val); - val &= ~(PRE_RTS_IDLE_DET_DIS); - val |= DCH_DET_DIS; - MAC_IO_WRITE32(pAd, TMAC_TCR, val); - return TRUE; -} - -static VOID dump_arb_debug_info(RTMP_ADAPTER *pAd, UCHAR bandidx) -{ - UINT32 mac_val; - UINT32 idx; - - MAC_IO_WRITE32(pAd, CFG_DBG_EN, 0x1f); - MAC_IO_WRITE32(pAd, CFG_DBG_L1_MOD_SEL, 0x04040404); - - if (bandidx == DBDC_BAND0) - MAC_IO_WRITE32(pAd, ARB_DCR, 0x12121212); /* BCN0 */ - else - MAC_IO_WRITE32(pAd, ARB_DCR, 0x16161616); /* BCN1 */ - -#define CFG_DBG_L1_SEL_N_GET(_A, _S, _pV) \ - { \ - MAC_IO_WRITE32(_A, CFG_DBG_L1_SEL, _S); \ - MAC_IO_READ32(_A, CFG_DBG0, _pV); \ - } - - CFG_DBG_L1_SEL_N_GET(pAd, 0x04040404, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BCN ARB Debug Flag04=0x%08x\n", mac_val)); - CFG_DBG_L1_SEL_N_GET(pAd, 0x06060606, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BCN ARB Debug Flag06=0x%08x\n", mac_val)); - CFG_DBG_L1_SEL_N_GET(pAd, 0x08080808, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BCN ARB Debug Flag08=0x%08x\n", mac_val)); - - for (idx = 0; idx <= 18; idx++) { - /* ARB CR DCR = 0x A A A A, A = 2 Hex digits, A=0~18. 0~3: BSSID[0~3]; 4~18:BSSID[0_1~0_15] */ - UINT32 BSSID_SEL = idx << 24 | idx << 16 | idx << 8 | idx; - - MAC_IO_WRITE32(pAd, ARB_DCR, BSSID_SEL); - - if (idx <= 3) { - CFG_DBG_L1_SEL_N_GET(pAd, 0x0a0a0a0a, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BCN(BSSID%d) FSM Debug Flag0a=0x%08x\n", idx, - mac_val)); - CFG_DBG_L1_SEL_N_GET(pAd, 0x0b0b0b0b, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BCN(BSSID%d) FSM Debug Flag0b=0x%08x\n", idx, - mac_val)); - } else { - CFG_DBG_L1_SEL_N_GET(pAd, 0x0a0a0a0a, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BCN(BSSID0_%d) FSM Debug Flag0a=0x%08x\n", - (idx - 3), mac_val)); - CFG_DBG_L1_SEL_N_GET(pAd, 0x0b0b0b0b, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BCN(BSSID0_%d) FSM Debug Flag0b=0x%08x\n", - (idx - 3), mac_val)); - } - } -} - -static VOID chip_show_bcn_info(struct hdev_ctrl *ctrl, UCHAR bandidx) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - UINT32 mac_val; - UINT32 addr; - UINT32 idx; - UINT32 band_offset = 0x200 * bandidx; - struct _RTMP_CHIP_DBG *chip_dbg = hc_get_chip_dbg(ctrl); - - if (chip_dbg->dump_mib_info) { - if (bandidx == DBDC_BAND0) - chip_dbg->dump_mib_info(pAd->hdev_ctrl, "0"); - else - chip_dbg->dump_mib_info(pAd->hdev_ctrl, "1"); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - show_trinfo_proc(pAd, ""); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - ShowPLEInfo(pAd, NULL); -#ifdef ERR_RECOVERY - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - ShowSerProc2(pAd, ""); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - show_swqinfo(pAd, ""); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - if (chip_dbg->show_pse_info) - chip_dbg->show_pse_info(pAd->hdev_ctrl, NULL); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - show_tpinfo_proc(pAd, NULL); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - Show_MibBucket_Proc(pAd, ""); - MAC_IO_READ32(pAd, ARB_BFCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ARB_BFCR(0x820f3190)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, ARB_SCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ARB_SCR(0x820f3080)=0x%08x\n", mac_val)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("dump 0x820f3100~0x820f3154:\n")); - - for (addr = ARB_TQSW0; addr <= ARB_TQPM1; addr = addr + 4) { - if ((addr & 0xf) == 0 && (addr != ARB_TQSW0)) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - MAC_IO_READ32(pAd, addr, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr 0x%05x=0x%08x ", addr, mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MAC_IO_READ32(pAd, ARB_BFCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ARB_BFCR(0x820f3190)=0x%08x\n", mac_val)); - /* (WF_LP) Debug CRs */ - MAC_IO_READ32(pAd, LPON_T0STR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LPON_T0STR(0x820fb028)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, LPON_PISR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LPON_PISR(0x820fb030)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, LPON_T0TPCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LPON_T0TPCR(0x820fb34)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, LPON_MPTCR0, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LPON_MPTCR0(0x820fb05c)=0x%08x\n", mac_val)); - /* (WF_INT_WAKEUP) Interrupt CRs */ - MAC_IO_READ32(pAd, WISR0, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WISR0(0x820fc000)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, WIER0, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WIER0(0x820fc008)=0x%08x\n", mac_val)); - /* (UMAC) CR used to record SER status */ - MAC_IO_READ32(pAd, PSE_SPARE_DUMMY_CR1, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SER PSE Error INT status(0x820681e4)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, PSE_SPARE_DUMMY_CR2, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SER PLE Error INT status(0x820681e8)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, PSE_SPARE_DUMMY_CR3, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SER LMAC WDT status(0x820682e8)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, PP_SPARE_DUMMY_CR5, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CritialErrorRecord0(0x8206c064)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, PP_SPARE_DUMMY_CR6, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CritialErrorRecord1(0x8206c068)=0x%08x\n", mac_val)); - - dump_arb_debug_info(pAd, bandidx); - -#define CR4_HEART_BEAT_STS 0x80200 - MAC_IO_READ32(pAd, CR4_HEART_BEAT_STS, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CR4 heart beat status (0x80200)=0x%08x\n", mac_val)); - MtCmdFwLog2Host(pAd, 1, 0); - MAC_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RO_BAND0_PHYCTRL_STS(0x%08x)= 0x%08x\n", - 0x82070230 + band_offset, mac_val)); - /* 0x82070618~0x8207065c */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("dump 0x%08x~0x%08x:\n", 0x82070618 + band_offset, - 0x8207065c + band_offset)); - - for (addr = PHY_BAND0_PHYMUX_6; addr <= PHY_BAND0_PHYMUX_23; - addr = addr + 4) { - if ((addr & 0xf) == 8 && (addr != PHY_BAND0_PHYMUX_6)) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - MAC_IO_READ32(pAd, addr + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr 0x%05x=0x%08x ", addr, mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - /* 0x8207227c~0x82072294 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("dump 0x%08x~0x%08x:\n", 0x8207227c + band_offset, - 0x82072294 + band_offset)); - - for (addr = RO_BAND0_RXTD_DEBUG0; addr <= RO_BAND0_RXTD_DEBUG6; - addr = addr + 4) { - if (addr == RO_BAND0_RXTD_DEBUG4) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - MAC_IO_READ32(pAd, addr + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr 0x%05x=0x%08x ", addr, mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - /* 0x820721a0~0x820721b8 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("dump 0x%08x~0x%08x:\n", 0x820721a0 + band_offset, - 0x820721b8 + band_offset)); - - for (addr = RO_BAND0_AGC_DEBUG_0; addr <= RO_BAND0_AGC_DEBUG_6; - addr = addr + 4) { - if (addr == RO_BAND0_AGC_DEBUG_4) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - MAC_IO_READ32(pAd, addr + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr 0x%05x=0x%08x ", addr, mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - /* - - Write 0x82070614[22:20]=0 - Write 0x82070614[22:20]=5 - - // read the following registers by 10 times - 0X8207_020C - 0x8207_0210 - 0x8207_0214 - 0x8207_021C - 0x8207_0220 - // End of Loop - - */ - MAC_IO_READ32(pAd, PHY_BAND0_PHYMUX_5 + band_offset, &mac_val); - mac_val &= ~(BITS(20, 22)); - MAC_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5 + band_offset, mac_val); - MAC_IO_READ32(pAd, PHY_BAND0_PHYMUX_5 + band_offset, &mac_val); - mac_val &= ~(BITS(20, 22)); - mac_val |= (BIT(20) | BIT(22)); - MAC_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5 + band_offset, mac_val); - - for (idx = 0; idx < 10; idx++) { - if (IS_MT7615(pAd)) { - MAC_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS0 + band_offset, - &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("loop %d addr(0x%8x)=0x%08x ", idx, - 0x8207020c + band_offset, mac_val)); - MAC_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS1 + band_offset, - &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr(0x%08x)=0x%08x ", - 0x82070210 + band_offset, mac_val)); - MAC_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS2 + band_offset, - &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr(0x%08x)=0x%08x ", - 0x82070214 + band_offset, mac_val)); - MAC_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS4 + band_offset, - &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr(0x%08x)=0x%08x ", - 0x8207021c + band_offset, mac_val)); - MAC_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS5 + band_offset, - &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr(0x%08x)=0x%08x\n", - 0x82070220 + band_offset, mac_val)); - } - MAC_IO_READ32(pAd, ARB_BFCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("loop %d ARB_BFCR(0x820f3190)=0x%08x\n", idx, - mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); -} - -static INT32 chip_show_ple_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - UINT32 ple_buf_ctrl[3] = { 0 }, pg_sz, pg_num, bit_field_1, bit_field_2; - UINT32 ple_stat[17] = { 0 }, pg_flow_ctrl[6] = { 0 }; - UINT32 sta_pause[4] = { 0 }, dis_sta_map[4] = { 0 }; - UINT32 fpg_cnt, ffa_cnt, fpg_head, fpg_tail, hif_max_q, hif_min_q; - UINT32 rpg_hif, upg_hif, cpu_max_q, cpu_min_q, rpg_cpu, upg_cpu; - INT32 i, j; - UINT32 dumptxd = 0; - - if (arg != NULL) - dumptxd = os_str_toul(arg, 0, 16); - - HW_IO_READ32(pAd, PLE_PBUF_CTRL, &ple_buf_ctrl[0]); - HW_IO_READ32(pAd, PLE_RELEASE_CTRL, &ple_buf_ctrl[1]); - HW_IO_READ32(pAd, PLE_HIF_REPORT, &ple_buf_ctrl[2]); - HW_IO_READ32(pAd, PLE_QUEUE_EMPTY, &ple_stat[0]); - HW_IO_READ32(pAd, PLE_AC0_QUEUE_EMPTY_0, &ple_stat[1]); - HW_IO_READ32(pAd, PLE_AC0_QUEUE_EMPTY_1, &ple_stat[2]); - HW_IO_READ32(pAd, PLE_AC0_QUEUE_EMPTY_2, &ple_stat[3]); - HW_IO_READ32(pAd, PLE_AC0_QUEUE_EMPTY_3, &ple_stat[4]); - HW_IO_READ32(pAd, PLE_AC1_QUEUE_EMPTY_0, &ple_stat[5]); - HW_IO_READ32(pAd, PLE_AC1_QUEUE_EMPTY_1, &ple_stat[6]); - HW_IO_READ32(pAd, PLE_AC1_QUEUE_EMPTY_2, &ple_stat[7]); - HW_IO_READ32(pAd, PLE_AC1_QUEUE_EMPTY_3, &ple_stat[8]); - HW_IO_READ32(pAd, PLE_AC2_QUEUE_EMPTY_0, &ple_stat[9]); - HW_IO_READ32(pAd, PLE_AC2_QUEUE_EMPTY_1, &ple_stat[10]); - HW_IO_READ32(pAd, PLE_AC2_QUEUE_EMPTY_2, &ple_stat[11]); - HW_IO_READ32(pAd, PLE_AC2_QUEUE_EMPTY_3, &ple_stat[12]); - HW_IO_READ32(pAd, PLE_AC3_QUEUE_EMPTY_0, &ple_stat[13]); - HW_IO_READ32(pAd, PLE_AC3_QUEUE_EMPTY_1, &ple_stat[14]); - HW_IO_READ32(pAd, PLE_AC3_QUEUE_EMPTY_2, &ple_stat[15]); - HW_IO_READ32(pAd, PLE_AC3_QUEUE_EMPTY_3, &ple_stat[16]); - HW_IO_READ32(pAd, PLE_FREEPG_CNT, &pg_flow_ctrl[0]); - HW_IO_READ32(pAd, PLE_FREEPG_HEAD_TAIL, &pg_flow_ctrl[1]); - HW_IO_READ32(pAd, PLE_PG_HIF_GROUP, &pg_flow_ctrl[2]); - HW_IO_READ32(pAd, PLE_HIF_PG_INFO, &pg_flow_ctrl[3]); - HW_IO_READ32(pAd, PLE_PG_CPU_GROUP, &pg_flow_ctrl[4]); - HW_IO_READ32(pAd, PLE_CPU_PG_INFO, &pg_flow_ctrl[5]); - HW_IO_READ32(pAd, DIS_STA_MAP0, &dis_sta_map[0]); - HW_IO_READ32(pAd, DIS_STA_MAP1, &dis_sta_map[1]); - HW_IO_READ32(pAd, DIS_STA_MAP2, &dis_sta_map[2]); - HW_IO_READ32(pAd, DIS_STA_MAP3, &dis_sta_map[3]); - HW_IO_READ32(pAd, STATION_PAUSE0, &sta_pause[0]); - HW_IO_READ32(pAd, STATION_PAUSE1, &sta_pause[1]); - HW_IO_READ32(pAd, STATION_PAUSE2, &sta_pause[2]); - HW_IO_READ32(pAd, STATION_PAUSE3, &sta_pause[3]); - /* Configuration Info */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PLE Configuration Info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPacket Buffer Control(0x82060014): 0x%08x\n", - ple_buf_ctrl[0])); - pg_sz = (ple_buf_ctrl[0] & (0x1 << 31)) >> 31; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPage Size=%d(%d bytes per page)\n", pg_sz, - (pg_sz == 1 ? 128 : 64))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPage Offset=%d(in unit of 64KB)\n", - (ple_buf_ctrl[0] & (0xf << 20)) >> 20)); - pg_num = (ple_buf_ctrl[0] & (0xf << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tConfigured Total Page=%d(%d pages)\n", pg_num, - (pg_num < 8 ? ple_pg_cnt[pg_num] : 0))); - pg_num = (ple_buf_ctrl[0] & 0xfff); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tAvailable Total Page=%d pages\n", - (ple_buf_ctrl[0] & 0xfff))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRelease Control(0x82060030): 0x%08x\n", ple_buf_ctrl[1])); - bit_field_1 = (ple_buf_ctrl[1] & 0x1f); - bit_field_2 = ((ple_buf_ctrl[1] & (0x3 << 6)) >> 6); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNormalTx Release Pid/Qid=%d/%d\n", bit_field_2, - bit_field_1)); - bit_field_1 = ((ple_buf_ctrl[1] & (0x1f << 8)) >> 8); - bit_field_2 = ((ple_buf_ctrl[1] & (0x3 << 14)) >> 14); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tDropTx Release Pid/Qid=%d/%d\n", bit_field_2, - bit_field_1)); - bit_field_1 = ((ple_buf_ctrl[1] & (0x1f << 16)) >> 16); - bit_field_2 = ((ple_buf_ctrl[1] & (0x3 << 22)) >> 22); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBCN0 Release Pid/Qid=%d/%d\n", bit_field_2, - bit_field_1)); - bit_field_1 = ((ple_buf_ctrl[1] & (0x1f << 24)) >> 24); - bit_field_2 = ((ple_buf_ctrl[1] & (0x3 << 30)) >> 30); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBCN1 Release Pid/Qid=%d/%d\n", bit_field_2, - bit_field_1)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHIF Report Control(0x82060034): 0x%08x\n", - ple_buf_ctrl[2])); - bit_field_1 = ((ple_buf_ctrl[2] & (0x1 << 1)) >> 1); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHostReportQSel/HostReportDisable=%d/%d\n", - (ple_buf_ctrl[2] & 0x1), bit_field_1)); - /* Page Flow Control */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PLE Page Flow Control:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFree page counter(0x82060100): 0x%08x\n", - pg_flow_ctrl[0])); - fpg_cnt = pg_flow_ctrl[0] & 0xfff; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe toal page number of free=0x%03x\n", fpg_cnt)); - ffa_cnt = (pg_flow_ctrl[0] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe free page numbers of free for all=0x%03x\n", - ffa_cnt)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFree page head and tail(0x82060104): 0x%08x\n", - pg_flow_ctrl[1])); - fpg_head = pg_flow_ctrl[1] & 0xfff; - fpg_tail = (pg_flow_ctrl[1] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe tail/head page of free page list=0x%03x/0x%03x\n", - fpg_tail, fpg_head)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of HIF group(0x82060110): 0x%08x\n", - pg_flow_ctrl[2])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHIF group page status(0x82060114): 0x%08x\n", - pg_flow_ctrl[3])); - hif_min_q = pg_flow_ctrl[2] & 0xfff; - hif_max_q = (pg_flow_ctrl[2] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of HIF group=0x%03x/0x%03x\n", - hif_max_q, hif_min_q)); - rpg_hif = pg_flow_ctrl[3] & 0xfff; - upg_hif = (pg_flow_ctrl[3] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of HIF group=0x%03x/0x%03x\n", - upg_hif, rpg_hif)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of CPU group(0x82060150): 0x%08x\n", - pg_flow_ctrl[4])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCPU group page status(0x82060154): 0x%08x\n", - pg_flow_ctrl[5])); - cpu_min_q = pg_flow_ctrl[4] & 0xfff; - cpu_max_q = (pg_flow_ctrl[4] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of CPU group=0x%03x/0x%03x\n", - cpu_max_q, cpu_min_q)); - rpg_cpu = pg_flow_ctrl[5] & 0xfff; - upg_cpu = (pg_flow_ctrl[5] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of CPU group=0x%03x/0x%03x\n", - upg_cpu, rpg_cpu)); - - if (((ple_stat[0] & (0x1 << 24)) >> 24) == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC0_QUEUE_EMPTY0(0x82060300): 0x%08x\n", - ple_stat[1])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC0_QUEUE_EMPTY1(0x82060304): 0x%08x\n", - ple_stat[2])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC0_QUEUE_EMPTY2(0x82060308): 0x%08x\n", - ple_stat[3])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC0_QUEUE_EMPTY3(0x8206030c): 0x%08x\n", - ple_stat[4])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC1_QUEUE_EMPTY0(0x82060310): 0x%08x\n", - ple_stat[5])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC1_QUEUE_EMPTY1(0x82060314): 0x%08x\n", - ple_stat[6])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC1_QUEUE_EMPTY2(0x82060318): 0x%08x\n", - ple_stat[7])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC1_QUEUE_EMPTY3(0x8206031c): 0x%08x\n", - ple_stat[8])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC2_QUEUE_EMPTY0(0x82060320): 0x%08x\n", - ple_stat[9])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC2_QUEUE_EMPTY1(0x82060324): 0x%08x\n", - ple_stat[10])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC2_QUEUE_EMPTY2(0x82060328): 0x%08x\n", - ple_stat[11])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC2_QUEUE_EMPTY3(0x8206032c): 0x%08x\n", - ple_stat[12])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC3_QUEUE_EMPTY0(0x82060330): 0x%08x\n", - ple_stat[13])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC3_QUEUE_EMPTY1(0x82060334): 0x%08x\n", - ple_stat[14])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC3_QUEUE_EMPTY2(0x82060338): 0x%08x\n", - ple_stat[15])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC3_QUEUE_EMPTY3(0x8206033c): 0x%08x\n", - ple_stat[16])); - - for (j = 0; j < 16; j++) { - if (j % 4 == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\n\tNonempty AC%d Q of STA#: ", - j / 4)); - } - - for (i = 0; i < 32; i++) { - if (((ple_stat[j + 1] & (0x1 << i)) >> i) == - 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%d ", i + (j % 4) * 32)); - } - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Nonempty Q info:\n")); - - for (i = 0; i < 31; i++) { - if (((ple_stat[0] & (0x1 << i)) >> i) == 0) { - UINT32 hfid, tfid, pktcnt, fl_que_ctrl[3] = { 0 }; - - if (Queue_Empty_info[i].QueueName != NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\t%s: ", - Queue_Empty_info[i].QueueName)); - fl_que_ctrl[0] |= (0x1 << 31); - fl_que_ctrl[0] |= - (Queue_Empty_info[i].Portid << 14); - fl_que_ctrl[0] |= - (Queue_Empty_info[i].Queueid << 8); - } else - continue; - - HW_IO_WRITE32(pAd, PLE_FL_QUE_CTRL_0, fl_que_ctrl[0]); - HW_IO_READ32(pAd, PLE_FL_QUE_CTRL_2, &fl_que_ctrl[1]); - HW_IO_READ32(pAd, PLE_FL_QUE_CTRL_3, &fl_que_ctrl[2]); - hfid = fl_que_ctrl[1] & 0xfff; - tfid = (fl_que_ctrl[1] & 0xfff << 16) >> 16; - pktcnt = fl_que_ctrl[2] & 0xfff; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("tail/head fid = 0x%03x/0x%03x, pkt cnt = %x\n", - tfid, hfid, pktcnt)); - - if (pktcnt > 0 && dumptxd > 0) - ShowTXDInfo(pAd, hfid); - } - } - - for (j = 0; j < 16; j++) { /* show AC Q info */ - for (i = 0; i < 32; i++) { - if (((ple_stat[j + 1] & (0x1 << i)) >> i) == 0) { - UINT32 hfid, tfid, pktcnt, ac_num = j / 4, - ctrlvalue = 0; - UINT32 sta_num = i + (j % 4) * 32, - fl_que_ctrl[3] = { 0 }; - struct wifi_dev *wdev = - wdev_search_by_wcid(pAd, sta_num); - UINT32 wmmidx = 0; - - if (wdev) - wmmidx = HcGetWmmIdx(pAd, wdev); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\tSTA%d AC%d: ", sta_num, ac_num)); - fl_que_ctrl[0] |= (0x1 << 31); - fl_que_ctrl[0] |= (0x2 << 14); - fl_que_ctrl[0] |= (ac_num << 8); - fl_que_ctrl[0] |= sta_num; - HW_IO_WRITE32(pAd, PLE_FL_QUE_CTRL_0, - fl_que_ctrl[0]); - HW_IO_READ32(pAd, PLE_FL_QUE_CTRL_2, - &fl_que_ctrl[1]); - HW_IO_READ32(pAd, PLE_FL_QUE_CTRL_3, - &fl_que_ctrl[2]); - hfid = fl_que_ctrl[1] & 0xfff; - tfid = (fl_que_ctrl[1] & 0xfff << 16) >> 16; - pktcnt = fl_que_ctrl[2] & 0xfff; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("tail/head fid = 0x%03x/0x%03x, pkt cnt = %x", - tfid, hfid, pktcnt)); - - if (((sta_pause[j % 4] & 0x1 << i) >> i) == 1) - ctrlvalue = 2; - - if (((dis_sta_map[j % 4] & 0x1 << i) >> i) == 1) - ctrlvalue = 1; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" ctrl = %s", - sta_ctrl_reg[ctrlvalue])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" (wmmidx=%d)\n", wmmidx)); - - if (pktcnt > 0 && dumptxd > 0) - ShowTXDInfo(pAd, hfid); - } - } - } - - return TRUE; -} - -VOID mt7615_chip_dbg_init(struct _RTMP_CHIP_DBG *dbg_ops) -{ - dbg_ops->dump_ps_table = chip_dump_ps_table; - dbg_ops->dump_mib_info = chip_dump_mib_info; - dbg_ops->show_tmac_info = chip_show_tmac_info; - dbg_ops->show_agg_info = chip_show_agg_info; - dbg_ops->show_dmasch_info = NULL; /* mt7615 has no dmasch */ - dbg_ops->show_pse_info = chip_show_pse_info; - dbg_ops->show_pse_data = - NULL; /* read PSE data from host is not supported */ - dbg_ops->show_protect_info = chip_show_protect_info; - dbg_ops->show_cca_info = chip_show_cca_info; - dbg_ops->set_cca_en = chip_set_cca_en; - dbg_ops->show_txv_info = NULL; - dbg_ops->show_bcn_info = chip_show_bcn_info; - dbg_ops->show_ple_info = chip_show_ple_info; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7622.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7622.c deleted file mode 100644 index d00f537430..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7622.c +++ /dev/null @@ -1,2429 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt7622.c -*/ - -#include "rt_config.h" -#include "chip/mt7622_cr.h" -#include "mcu/mt7622_firmware_e2.h" -#ifdef NEED_ROM_PATCH -#include "mcu/mt7622_rom_patch_e2.h" -#endif /* NEED_ROM_PATCH */ - -/* ePAeLNA shall always be included as default */ -#include "eeprom/mt7622_e2p_ePAeLNA.h" - -#if defined(CONFIG_FIRST_IF_IPAILNA) -#include "eeprom/mt7622_e2p_iPAiLNA.h" -#endif -#if defined(CONFIG_FIRST_IF_IPAELNA) -#include "eeprom/mt7622_e2p_iPAeLNA.h" -#endif - -#ifdef CONFIG_AP_SUPPORT -#define DEFAULT_BIN_FILE "/etc_ro/wlan/MT7622_EEPROM.bin" -#else -#define DEFAULT_BIN_FILE "/etc/MT7622_EEPROM.bin" -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef INTERNAL_CAPTURE_SUPPORT -extern RBIST_DESC_T MT7622_ICAP_DESC[]; -extern UINT8 MT7622_ICapBankNum; -#endif /* INTERNAL_CAPTURE_SUPPORT */ - -#ifdef WIFI_SPECTRUM_SUPPORT -extern RBIST_DESC_T MT7622_SPECTRUM_DESC[]; -extern UINT8 MT7622_SpectrumBankNum; -#endif /* WIFI_SPECTRUM_SUPPORT */ - -UCHAR mt7622_ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 }; - -static UINT32 UNMASK[] = { - 0x30, 0x31, 0x32, 0x33, 0x38, 0x39, 0x3d, 0x3e, 0x48, 0x49, - 0x53, 0x54, 0x55, 0x56, 0x57, 0x5c, 0x5d, 0x62, 0x63, 0x68, - 0x69, 0xf4, 0xf7, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, - 0x107, 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 0x110, - 0x111, 0x112, 0x113, 0x114, 0x115, 0x116, 0x117, 0x118, 0x119, 0x11a, - 0x11b, 0x140, 0x141, 0x142, 0x143, 0x144, 0x145, 0x146, 0x147, 0x155, - 0x156, 0x157, 0x158, 0x159, 0x15a, 0x15b, 0x15c, 0x15d, 0x1d0, 0x1d1, - 0x1d2, 0x1d3, 0x1d4, 0x1d5, 0x1d6, 0x1d7, 0x1d8, 0x1d9, 0x1da, 0x1db, - 0x1dc, 0x1dd, 0x1de, 0x1df, 0x1e0, 0x1e1, 0x1e2, 0x1e3, 0x1e4, 0x1e5, - 0x1e6, 0x1e7, 0x1e8, 0x1e9, 0x1ea, 0x1eb, 0x1ec, 0x1ed, 0x1ee, 0x1ef, - 0x1f0, 0x1f1, 0x1f2, 0x1f3, 0x1f4, 0x1f5, 0x1f6, 0x1f7, 0x358, 0x359, - 0x35a, 0x35b, 0x35c, 0x35d, 0x35e, 0x35f, 0x360, 0x361, 0x362, 0x363, - 0x364, 0x365, 0x366, 0x367, 0x368, 0x369, 0x36a, 0x36b, 0x36c, 0x36d, - 0x36e, 0x36f, 0x370, 0x371, 0x372, 0x373, 0x374, 0x375, 0x376, 0x377, - 0x378, 0x379, 0x37a, 0x37b, 0x37c, 0x37d, 0x37e, 0x37f, 0x380, 0x381, - 0x382, 0x383, 0x384, 0x385, 0x386, 0x387, 0x388, 0x389, 0x38a, 0x38b, - 0x38c, 0x38d, 0x38e, 0x38f, 0x390, 0x391, 0x392, 0x393, 0x394, 0x395, - 0x396, 0x397, 0x398, 0x399, 0x39a, 0x39b, 0x39c, 0x39d, 0x39e, 0x39f, - 0x3a0, 0x3a1, 0x3a2, 0x3a3, 0x3a4, 0x3a5, 0x3a6, 0x3a7, 0x3a8, 0x3a9, - 0x3aa, 0x3ab, 0x3ac, 0x3ad, 0x3ae, 0x3af, 0x3b0, 0x3b1, 0x3b2, 0x3b3, - 0x3b4, 0x3b5, 0x3b6, 0x3b7, 0x3b8, 0x3b9, 0x3ba, 0x3bb, 0x3bc, 0x3bd, - 0x3be, 0x3bf, 0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4, 0x3c5, 0x3c6, 0x3c7, - 0x3c8, 0x3c9, 0x3ca, 0x3cb, 0x3cc, 0x3cd, 0x3ce, 0x3cf, 0x3d0, 0x3d1, - 0x3d2, 0x3d3, 0x3d4, 0x3d5, 0x3d6, 0x3d7, 0x3d8, 0x3d9, 0x3da, 0x3db -}; /* keep efuse field only */ - -#ifdef MT7622_FPGA -REG_CHK_PAIR hif_dft_cr[] = { - { HIF_BASE + 0x00, 0xffffffff, 0x76030001 }, - { HIF_BASE + 0x04, 0xffffffff, 0x1b }, - { HIF_BASE + 0x10, 0xffffffff, 0x3f01 }, - { HIF_BASE + 0x20, 0xffffffff, 0xe01001e0 }, - { HIF_BASE + 0x24, 0xffffffff, 0x1e00000f }, - - { HIF_BASE + 0x200, 0xffffffff, 0x0 }, - { HIF_BASE + 0x204, 0xffffffff, 0x0 }, - { HIF_BASE + 0x208, 0xffffffff, 0x10001870 }, - { HIF_BASE + 0x20c, 0xffffffff, 0x0 }, - { HIF_BASE + 0x210, 0xffffffff, 0x0 }, - { HIF_BASE + 0x214, 0xffffffff, 0x0 }, - { HIF_BASE + 0x218, 0xffffffff, 0x0 }, - { HIF_BASE + 0x21c, 0xffffffff, 0x0 }, - { HIF_BASE + 0x220, 0xffffffff, 0x0 }, - { HIF_BASE + 0x224, 0xffffffff, 0x0 }, - { HIF_BASE + 0x234, 0xffffffff, 0x0 }, - { HIF_BASE + 0x244, 0xffffffff, 0x0 }, - { HIF_BASE + 0x300, 0xffffffff, 0x0 }, - { HIF_BASE + 0x304, 0xffffffff, 0x0 }, - { HIF_BASE + 0x308, 0xffffffff, 0x0 }, - { HIF_BASE + 0x30c, 0xffffffff, 0x0 }, - { HIF_BASE + 0x310, 0xffffffff, 0x0 }, - { HIF_BASE + 0x314, 0xffffffff, 0x0 }, - { HIF_BASE + 0x318, 0xffffffff, 0x0 }, - { HIF_BASE + 0x31c, 0xffffffff, 0x0 }, - { HIF_BASE + 0x320, 0xffffffff, 0x0 }, - { HIF_BASE + 0x324, 0xffffffff, 0x0 }, - { HIF_BASE + 0x328, 0xffffffff, 0x0 }, - { HIF_BASE + 0x32c, 0xffffffff, 0x0 }, - { HIF_BASE + 0x330, 0xffffffff, 0x0 }, - { HIF_BASE + 0x334, 0xffffffff, 0x0 }, - { HIF_BASE + 0x338, 0xffffffff, 0x0 }, - { HIF_BASE + 0x33c, 0xffffffff, 0x0 }, - - { HIF_BASE + 0x400, 0xffffffff, 0x0 }, - { HIF_BASE + 0x404, 0xffffffff, 0x0 }, - { HIF_BASE + 0x408, 0xffffffff, 0x0 }, - { HIF_BASE + 0x40c, 0xffffffff, 0x0 }, - { HIF_BASE + 0x410, 0xffffffff, 0x0 }, - { HIF_BASE + 0x414, 0xffffffff, 0x0 }, - { HIF_BASE + 0x418, 0xffffffff, 0x0 }, - { HIF_BASE + 0x41c, 0xffffffff, 0x0 }, -}; - -INT mt7622_chk_hif_default_cr_setting(RTMP_ADAPTER *pAd) -{ - UINT32 val; - INT i; - BOOLEAN match = TRUE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Default CR Setting Checking for HIF!\n", __func__)); - - for (i = 0; i < sizeof(hif_dft_cr) / sizeof(REG_CHK_PAIR); i++) { - RTMP_IO_READ32(pAd, hif_dft_cr[i].Register, &val); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t Reg(%x): Current=0x%x(0x%x), Default=0x%x, Mask=0x%x, Match=%s\n", - hif_dft_cr[i].Register, val, - (val & hif_dft_cr[i].Mask), hif_dft_cr[i].Value, - hif_dft_cr[i].Mask, - ((val & hif_dft_cr[i].Mask) != hif_dft_cr[i].Value) ? - "No" : - "Yes")); - - if ((val & hif_dft_cr[i].Mask) != hif_dft_cr[i].Value) - match = FALSE; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Checking Done, Result=> %s match!\n", __func__, - match == TRUE ? "All" : "No")); - return match; -} - -REG_CHK_PAIR top_dft_cr[] = { - { TOP_CFG_BASE + 0x1000, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1004, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1008, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1010, 0xffffffff, 0x0 }, - - { TOP_CFG_BASE + 0x1100, 0xffffffff, 0x26110310 }, - { TOP_CFG_BASE + 0x1108, 0x0000ff00, 0x1400 }, - { TOP_CFG_BASE + 0x110c, 0x00000000, 0x0 }, - { TOP_CFG_BASE + 0x1110, 0x0f0f00ff, 0x02090040 }, - { TOP_CFG_BASE + 0x1124, 0xf000f00f, 0x00000008 }, - { TOP_CFG_BASE + 0x1130, 0x000f0000, 0x0 }, - { TOP_CFG_BASE + 0x1134, 0x00000000, 0x0 }, - { TOP_CFG_BASE + 0x1140, 0x00ff00ff, 0x0 }, - - { TOP_CFG_BASE + 0x1200, 0x00000000, 0x0 }, - { TOP_CFG_BASE + 0x1204, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x1208, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x120c, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x1210, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x1214, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x1218, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x121c, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x1220, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x1224, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x1228, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x122c, 0x000fffff, 0x0 }, - { TOP_CFG_BASE + 0x1234, 0x00ffffff, 0x0 }, - { TOP_CFG_BASE + 0x1238, 0x00ffffff, 0x0 }, - { TOP_CFG_BASE + 0x123c, 0xffffffff, 0x5c1fee80 }, - { TOP_CFG_BASE + 0x1240, 0xffffffff, 0x6874ae05 }, - { TOP_CFG_BASE + 0x1244, 0xffffffff, 0x00fb89f1 }, - - { TOP_CFG_BASE + 0x1300, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1304, 0xffffffff, 0x8f020006 }, - { TOP_CFG_BASE + 0x1308, 0xffffffff, 0x18010000 }, - { TOP_CFG_BASE + 0x130c, 0xffffffff, 0x0130484f }, - { TOP_CFG_BASE + 0x1310, 0xffffffff, 0xff000004 }, - { TOP_CFG_BASE + 0x1314, 0xffffffff, 0xf0000084 }, - { TOP_CFG_BASE + 0x1318, 0x00000000, 0x0 }, - { TOP_CFG_BASE + 0x131c, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1320, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1324, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1328, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x132c, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1330, 0xffffffff, 0x00007800 }, - { TOP_CFG_BASE + 0x1334, 0x00000000, 0x0 }, - { TOP_CFG_BASE + 0x1338, 0xffffffff, 0x0000000a }, - { TOP_CFG_BASE + 0x1400, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1404, 0xffffffff, 0x00005180 }, - { TOP_CFG_BASE + 0x1408, 0xffffffff, 0x00001f00 }, - { TOP_CFG_BASE + 0x140c, 0xffffffff, 0x00000020 }, - { TOP_CFG_BASE + 0x1410, 0xffffffff, 0x0000003a }, - { TOP_CFG_BASE + 0x141c, 0xffffffff, 0x0 }, - - { TOP_CFG_BASE + 0x1500, 0xffffffff, 0x0 }, - { TOP_CFG_BASE + 0x1504, 0xffffffff, 0x0 }, -}; - -INT mt7622_chk_top_default_cr_setting(RTMP_ADAPTER *pAd) -{ - UINT32 val; - INT i; - BOOLEAN match = TRUE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Default CR Setting Checking for TOP!\n", __func__)); - - for (i = 0; i < sizeof(top_dft_cr) / sizeof(REG_CHK_PAIR); i++) { - RTMP_IO_READ32(pAd, top_dft_cr[i].Register, &val); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t Reg(%x): Current=0x%x(0x%x), Default=0x%x, Mask=0x%x, Match=%s\n", - top_dft_cr[i].Register, val, - (val & top_dft_cr[i].Mask), top_dft_cr[i].Value, - top_dft_cr[i].Mask, - ((val & top_dft_cr[i].Mask) != top_dft_cr[i].Value) ? - "No" : - "Yes")); - - if ((val & top_dft_cr[i].Mask) != top_dft_cr[i].Value) - match = FALSE; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Checking Done, Result=> %s match!\n", __func__, - match == TRUE ? "All" : "No")); - return match; -} -#endif /* MT7622_FPGA */ - -static VOID mt7622_bbp_adjust(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - /*do nothing, change to use radio_resource control*/ - /*here should do bbp setting only, bbp is full-offload to fw*/ -} - -/* TODO: Star */ -static void mt7622_switch_channel(RTMP_ADAPTER *pAd, - MT_SWITCH_CHANNEL_CFG SwChCfg) -{ - MtCmdChannelSwitch(pAd, SwChCfg); - MtCmdSetTxRxPath(pAd, SwChCfg); - pAd->LatchRfRegs.Channel = SwChCfg.CentralChannel; -#ifdef SINGLE_SKU_V2 -#ifdef TXBF_SUPPORT -#ifdef MT_MAC -#if defined(MT7615) || defined(MT7622) - TxPowerBfBackoffParaCtrl(pAd, SwChCfg.Channel_Band, - SwChCfg.ControlChannel, SwChCfg.BandIdx); -#endif /* defined(MT7615) || defined(MT7622) */ -#endif /*MT_MAC*/ -#endif /*TXBF_SUPPORT*/ -#endif /*SINGLE_SKU_V2*/ -} - -#ifdef NEW_SET_RX_STREAM -static INT mt7622_set_RxStream(RTMP_ADAPTER *pAd, UINT32 StreamNums, - UCHAR BandIdx) -{ - UINT32 path = 0; - UINT i; - - if (StreamNums > 4) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():illegal StreamNums(%d)\n", __func__, - StreamNums)); - StreamNums = 4; - } - - for (i = 0; i < StreamNums; i++) - path |= 1 << i; - - return MtCmdSetRxPath(pAd, path, BandIdx); -} -#endif - -static inline VOID bufferModeFieldSet(RTMP_ADAPTER *pAd, - EXT_CMD_EFUSE_BUFFER_MODE_T *pCmd, - UINT16 addr) -{ - UINT32 i = pCmd->ucCount; - pCmd->BinContent[i] = pAd->EEPROMImage[addr]; - pCmd->ucCount++; -} - -static VOID mt7622_bufferModeEfuseFill(RTMP_ADAPTER *pAd, - EXT_CMD_EFUSE_BUFFER_MODE_T *pCmd) -{ - UINT16 i = 0; - pCmd->ucCount = 0; - - for (i = 0x34; i <= 0x3DB; i++) - bufferModeFieldSet(pAd, pCmd, i); - - /*must minus last add*/ - pCmd->ucCount--; -} - -static VOID mt7622_keep_efuse_field_only(RTMP_ADAPTER *pAd, UCHAR *buffer) -{ - UINT16 i = 0; - UINT16 offset = 0; - - for (i = 0; i < (sizeof(UNMASK) / sizeof(UINT32)); i++) { - offset = UNMASK[i]; - buffer[offset] = pAd->EEPROMImage[offset]; - } -} - -#ifdef CAL_FREE_IC_SUPPORT -static UINT32 ICAL[] = { 0x53, 0x54, 0x55, 0xf4, 0xf7, 0x144, 0x156, 0x15b }; -static UINT32 ICAL_NUM = (sizeof(ICAL) / sizeof(UINT32)); -static inline BOOLEAN check_valid(RTMP_ADAPTER *pAd, UINT16 Offset) -{ - UINT16 Value = 0; - BOOLEAN NotValid; - - if ((Offset % 2) != 0) { - NotValid = rtmp_ee_efuse_read16(pAd, Offset - 1, &Value); - - if (NotValid == FALSE) - return TRUE; - } else { - NotValid = rtmp_ee_efuse_read16(pAd, Offset, &Value); - - if (NotValid == FALSE) - return TRUE; - } - - return FALSE; -} -static BOOLEAN mt7622_is_cal_free_ic(RTMP_ADAPTER *pAd) -{ - UINT32 i; - - for (i = 0; i < ICAL_NUM; i++) - if (check_valid(pAd, ICAL[i]) == TRUE) - return TRUE; - - return FALSE; -} - -static inline VOID cal_free_data_get_from_addr(RTMP_ADAPTER *ad, UINT16 Offset) -{ - UINT16 value; - BOOLEAN NotValid; - - if ((Offset % 2) != 0) { - NotValid = rtmp_ee_efuse_read16(ad, Offset - 1, &value); - - if (NotValid == FALSE && ((value & 0xff00) != 0)) - ad->EEPROMImage[Offset] = (value >> 8) & 0xFF; - } else { - NotValid = rtmp_ee_efuse_read16(ad, Offset, &value); - - if (NotValid == FALSE && ((value & 0xff) != 0)) - ad->EEPROMImage[Offset] = value & 0xFF; - } -} - -static VOID mt7622_cal_free_data_get(RTMP_ADAPTER *ad) - -{ - UINT32 i; - - for (i = 0; i < ICAL_NUM; i++) - cal_free_data_get_from_addr(ad, ICAL[i]); -} -#endif /* CAL_FREE_IC_SUPPORT */ - -static INT32 mt7622_dma_shdl_init(RTMP_ADAPTER *pAd) -{ - UINT32 value; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - HIF_DMASHDL_IO_READ32(pAd, MT_HIF_DMASHDL_PKT_MAX_SIZE, &value); - value &= ~(PLE_PKT_MAX_SIZE_MASK | PSE_PKT_MAX_SIZE_MASK); - value |= PLE_PKT_MAX_SIZE_NUM(0x1); - value |= PSE_PKT_MAX_SIZE_NUM(0x8); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_PKT_MAX_SIZE, value); - - /* only enable group 0, 1, 2, 4, 5 */ - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_REFILL_CTRL, 0xffc80000); - value = DMASHDL_MIN_QUOTA_NUM(0x10); - value |= DMASHDL_MAX_QUOTA_NUM(0x800); - - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_GROUP0_CTRL, value); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_GROUP1_CTRL, value); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_GROUP2_CTRL, value); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_GROUP4_CTRL, value); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_GROUP5_CTRL, value); - - if ((cap->qm == GENERIC_QM) || (cap->qm == GENERIC_FAIR_QM)) { - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_Q_MAP0, 0x42104210); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_Q_MAP1, 0x42104210); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_Q_MAP2, 0x00000005); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_Q_MAP3, 0x0); - - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_SHDL_SET0, - 0x6012345f); - HIF_DMASHDL_IO_WRITE32(pAd, MT_HIF_DMASHDL_SHDL_SET1, - 0xedcba987); - } - - return TRUE; -} - -#ifdef CFG_SUPPORT_MU_MIMO -#ifdef MANUAL_MU -INT mu_update_profile_tb(RTMP_ADAPTER *pAd, INT profile_id, UCHAR wlan_id) -{ -} - -INT mu_update_grp_table(RTMP_ADAPTER *pAd, INT grp_id) -{ - return TRUE; -} - -INT mu_update_cluster_tb(RTMP_ADAPTER *pAd, UCHAR c_id, UINT32 *m_ship, - UINT32 *u_pos) -{ - UINT32 entry_base, mac_val, offset; - ASSERT(c_id <= 31); - MAC_IO_READ32(pAd, MU_MUCR1, &mac_val); - - if (c_id < 16) - mac_val &= (~MUCR1_CLUSTER_TAB_REMAP_CTRL_MASK); - else - mac_val |= MUCR1_CLUSTER_TAB_REMAP_CTRL_MASK; - - MAC_IO_WRITE32(pAd, MU_MUCR1, mac_val); - entry_base = MU_CLUSTER_TABLE_BASE + (c_id & (~0x10)) * 24; - /* update membership */ - MAC_IO_WRITE32(pAd, entry_base + 0x0, m_ship[0]); - MAC_IO_WRITE32(pAd, entry_base + 0x4, m_ship[1]); - /* Update user position */ - MAC_IO_WRITE32(pAd, entry_base + 0x8, u_pos[0]); - MAC_IO_WRITE32(pAd, entry_base + 0xc, u_pos[1]); - MAC_IO_WRITE32(pAd, entry_base + 0x10, u_pos[2]); - MAC_IO_WRITE32(pAd, entry_base + 0x14, u_pos[3]); - return TRUE; -} - -INT mu_get_wlanId_ac_len(RTMP_ADAPTER *pAd, UINT32 wlan_id, UINT ac) -{ - return TRUE; -} - -INT mu_get_mu_tx_retry_cnt(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT mu_get_pfid_tx_stat(RTMP_ADAPTER *pAd) -{ -} - -INT mu_get_gpid_rate_per_stat(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT mt7622_mu_init(RTMP_ADAPTER *pAd) -{ - UINT32 mac_val; - /**************************************************************************** - MU Part - ****************************************************************************/ - /* After power on initial setting, AC legnth clear */ - MAC_IO_READ32(pAd, MU_MUCR4, &mac_val); - mac_val = 0x1; - MAC_IO_WRITE32(pAd, MU_MUCR4, mac_val); /* 820fe010= 0x0000_0001 */ - /* PFID table */ - MAC_IO_WRITE32(pAd, MU_PROFILE_TABLE_BASE + 0x0, - 0x1e000); /* 820fe780= 0x0001_e000 */ - MAC_IO_WRITE32(pAd, MU_PROFILE_TABLE_BASE + 0x4, - 0x1e103); /* 820fe784= 0x0001_e103 */ - MAC_IO_WRITE32(pAd, MU_PROFILE_TABLE_BASE + 0x8, - 0x1e205); /* 820fe788= 0x0001_e205 */ - MAC_IO_WRITE32(pAd, MU_PROFILE_TABLE_BASE + 0xc, - 0x1e306); /* 820fe78c= 0x0001_e306 */ - /* Cluster table */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x0, - 0x0); /* 820fe400= 0x0000_0000 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x8, - 0x0); /* 820fe408= 0x0000_0000 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x20, - 0x2); /* 820fe420= 0x0000_0002 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x28, - 0x0); /* 820fe428= 0x0000_0000 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x40, - 0x2); /* 820fe440= 0x0000_0002 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x48, - 0x4); /* 820fe448= 0x0000_0004 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x60, - 0x0); /* 820fe460= 0x0000_0000 */ - MAC_IO_WRITE32(pAd, MU_CLUSTER_TABLE_BASE + 0x68, - 0x0); /* 820fe468= 0x0000_0000 */ - /* Group rate table */ - MAC_IO_WRITE32(pAd, MU_GRP_TABLE_RATE_MAP + 0x0, - 0x4109); /* 820ff000= 0x0000_4109 */ - MAC_IO_WRITE32(pAd, MU_GRP_TABLE_RATE_MAP + 0x4, - 0x99); /* 820ff004= 0x0000_0099 */ - MAC_IO_WRITE32(pAd, MU_GRP_TABLE_RATE_MAP + 0x8, - 0x800000f0); /* 820ff008= 0x8000_00f0 */ - MAC_IO_WRITE32(pAd, MU_GRP_TABLE_RATE_MAP + 0xc, - 0x99); /* 820ff00c= 0x0000_0099 */ - /* SU Tx minimum setting */ - MAC_IO_WRITE32(pAd, MU_MUCR2, 0x10000001); /* 820fe008= 0x1000_0001 */ - /* MU max group search entry = 1 group entry */ - MAC_IO_WRITE32(pAd, MU_MUCR1, 0x0); /* 820fe004= 0x0000_0000 */ - /* MU enable */ - MAC_IO_READ32(pAd, MU_MUCR0, &mac_val); - mac_val |= 1; - MAC_IO_WRITE32(pAd, MU_MUCR0, 0x1); /* 820fe000= 0x1000_0001 */ - /**************************************************************************** - M2M Part - ****************************************************************************/ - /* Enable M2M MU temp mode */ - MAC_IO_READ32(pAd, RMAC_M2M_BAND_CTRL, &mac_val); - mac_val |= (1 << 16); - MAC_IO_WRITE32(pAd, RMAC_M2M_BAND_CTRL, mac_val); - /**************************************************************************** - AGG Part - ****************************************************************************/ - /* 820f20e0[15] = 1 or 0 all need to be verified, because - a). if primary is the fake peer, and peer will not ACK to us, cannot setup the TxOP - b). Or can use CTS2Self to setup the TxOP - */ - MAC_IO_READ32(pAd, AGG_MUCR, &mac_val); - mac_val &= (~MUCR_PRIM_BAR_MASK); - /* mac_val |= (1 << MUCR_PRIM_BAR_BIT); */ - MAC_IO_WRITE32(pAd, AGG_MUCR, mac_val); /* 820fe000= 0x1000_0001 */ - return TRUE; -} -#endif /* MANUAL_MU */ -#endif /* CFG_SUPPORT_MU_MIMO */ - -#ifndef MAC_INIT_OFFLOAD -#endif /* MAC_INIT_OFFLOAD */ - -/* need to confirm with DE, wilsonl */ -static VOID mt7622_init_mac_cr(RTMP_ADAPTER *pAd) -{ - UINT32 mac_val; - -#ifndef MAC_INIT_OFFLOAD - /* need to confirm with DE, wilsonl */ - /* done, confirmed by Austin */ - /* Set TxFreeEvent packet only go through CR4 */ - HW_IO_READ32(pAd, PLE_HIF_REPORT, &mac_val); - mac_val |= 0x1; - HW_IO_WRITE32(pAd, PLE_HIF_REPORT, mac_val); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Set TxRxEventPkt path 0x%0x = 0x%08x\n", __func__, - PLE_HIF_REPORT, mac_val)); - - HW_IO_READ32(pAd, PP_PAGECTL_2, &mac_val); - mac_val &= ~(PAGECTL_2_CUT_PG_CNT_MASK); - mac_val |= 0x30; - HW_IO_WRITE32(pAd, PP_PAGECTL_2, mac_val); - -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else - /* TxS Setting */ - InitTxSTypeTable(pAd); -#endif - MtAsicSetTxSClassifyFilter(pAd, TXS2HOST, TXS2H_QID1, TXS2HOST_AGGNUMS, - 0x00, 0); -#endif /*MAC_INIT_OFFLOAD*/ - /* MAC D0 2x / MAC D0 1x clock enable */ - MAC_IO_READ32(pAd, CFG_CCR, &mac_val); - mac_val |= (BIT31 | BIT25); - MAC_IO_WRITE32(pAd, CFG_CCR, mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MAC D0 2x 1x initial(val=%x)\n", __func__, mac_val)); - /* Disable RX Header Translation */ - MAC_IO_READ32(pAd, DMA_DCR0, &mac_val); - mac_val &= - ~(DMA_DCR0_RX_HDR_TRANS_EN_BIT | - DMA_DCR0_RX_HDR_TRANS_MODE_BIT | DMA_DCR0_RX_RM_VLAN_BIT | - DMA_DCR0_RX_INS_VLAN_BIT | DMA_DCR0_RX_HDR_TRANS_CHK_BSSID); -#ifdef HDR_TRANS_RX_SUPPORT - - if (IS_ASIC_CAP(pAd, fASIC_CAP_RX_HDR_TRANS)) { - UINT32 mac_val2; - mac_val |= DMA_DCR0_RX_HDR_TRANS_EN_BIT | - DMA_DCR0_RX_RM_VLAN_BIT | - DMA_DCR0_RX_HDR_TRANS_CHK_BSSID; - /* TODO: UnifiedSW, take care about Windows for translation mode! */ - /* mac_val |= DMA_DCR0_RX_HDR_TRANS_MODE_BIT; */ - MAC_IO_READ32(pAd, DMA_DCR1, &mac_val2); - mac_val2 |= RHTR_AMS_VLAN_EN; - MAC_IO_WRITE32(pAd, DMA_DCR1, mac_val2); - } - -#endif /* HDR_TRANS_RX_SUPPORT */ - MAC_IO_WRITE32(pAd, DMA_DCR0, mac_val); - /* CCA Setting */ - MAC_IO_READ32(pAd, TMAC_TRCR0, &mac_val); - mac_val &= ~CCA_SRC_SEL_MASK; - mac_val |= CCA_SRC_SEL(0x2); - mac_val &= ~CCA_SEC_SRC_SEL_MASK; - mac_val |= CCA_SEC_SRC_SEL(0x0); - MAC_IO_WRITE32(pAd, TMAC_TRCR0, mac_val); - MAC_IO_READ32(pAd, TMAC_TRCR0, &mac_val); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): TMAC_TRCR0=0x%x\n", __func__, mac_val)); - /* ---Add by shiang for MT7615 RFB ED issue */ - /* Set BAR rate as 0FDM 6M default, remove after fw set */ - MAC_IO_WRITE32(pAd, AGG_ACR0, 0x04b10496); - /*Add by Star for zero delimiter*/ - MAC_IO_READ32(pAd, TMAC_CTCR0, &mac_val); - mac_val &= ~INS_DDLMT_REFTIME_MASK; - mac_val |= INS_DDLMT_REFTIME(0x3f); - mac_val |= DUMMY_DELIMIT_INSERTION; - mac_val |= INS_DDLMT_DENSITY(3); - MAC_IO_WRITE32(pAd, TMAC_CTCR0, mac_val); - - /* Temporary setting for RTS */ - /*if no protect should enable for CTS-2-Self, WHQA_00025629*/ - MAC_IO_WRITE32(pAd, AGG_PCR1, 0x0400092b); /* sync MT7615 MP2.1 */ - MAC_IO_READ32(pAd, AGG_SCR, &mac_val); - mac_val |= NLNAV_MID_PTEC_DIS; - MAC_IO_WRITE32(pAd, AGG_SCR, mac_val); - - /*Default disable rf low power beacon mode*/ -#define WIFI_SYS_PHY 0x10000 -#define RF_LOW_BEACON_BAND0 (WIFI_SYS_PHY + 0x1900) -#define RF_LOW_BEACON_BAND1 (WIFI_SYS_PHY + 0x1d00) - PHY_IO_READ32(pAd, RF_LOW_BEACON_BAND0, &mac_val); - mac_val &= ~(0x3 << 8); - mac_val |= (0x2 << 8); - PHY_IO_WRITE32(pAd, RF_LOW_BEACON_BAND0, mac_val); - PHY_IO_READ32(pAd, RF_LOW_BEACON_BAND1, &mac_val); - mac_val &= ~(0x3 << 8); - mac_val |= (0x2 << 8); - PHY_IO_WRITE32(pAd, RF_LOW_BEACON_BAND1, mac_val); -} - -static VOID MT7622BBPInit(RTMP_ADAPTER *pAd) -{ - /* Disable PHY shaping filter for Japan Region */ - if (pAd->CommonCfg.RDDurRegion == JAP) - MtCmdPhyShapingFilterDisable(pAd); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() todo\n", __func__)); -} - -static void mt7622_init_rf_cr(RTMP_ADAPTER *ad) -{ -} - -/* Read power per rate */ -void mt7622_get_tx_pwr_per_rate(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() todo\n", __func__)); -} - -void mt7622_get_tx_pwr_info(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() todo\n", __func__)); -} - -static UCHAR get_subid(void) -{ - UCHAR subid = 0; - ULONG sysEfuseAddr = 0; - UINT32 sysEfuseVal = 0; - - sysEfuseAddr = (ULONG)ioremap(0x1020682c, 4); - sysEfuseVal = (UINT32)ioread32((void *)sysEfuseAddr); - iounmap((void *)sysEfuseAddr); - - if (((sysEfuseVal & 0xf000) >> 12) != 0) - subid = (sysEfuseVal & 0xf000) >> 12; - else if (((sysEfuseVal & 0xf00) >> 8) != 0) - subid = (sysEfuseVal & 0xf00) >> 8; - else if (((sysEfuseVal & 0xf0) >> 4) != 0) - subid = (sysEfuseVal & 0xf0) >> 4; - else - subid = 2; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("read sub id = %x\n", subid)); - return subid; -} - -static void mt7622_antenna_default_reset(struct _RTMP_ADAPTER *pAd, - EEPROM_ANTENNA_STRUC *pAntenna) -{ - pAntenna->word = 0; - pAd->RfIcType = RFIC_7622; -#ifndef TXBF_SUPPORT - pAntenna->field.TxPath = 4; - pAntenna->field.RxPath = 4; -#else - pAntenna->field.TxPath = - (pAd->EEPROMDefaultValue[EEPROM_NIC_CFG1_OFFSET] >> 4) & 0x0F; - pAntenna->field.RxPath = - pAd->EEPROMDefaultValue[EEPROM_NIC_CFG1_OFFSET] & 0x0F; -#endif /* TXBF_SUPPORT */ - - if (get_subid() == 0x4) { - pAntenna->field.TxPath = 2; - pAntenna->field.RxPath = 2; - } -} - -static VOID mt7622_fw_prepare(RTMP_ADAPTER *pAd) -{ - struct fwdl_ctrl *ctrl = &pAd->MCUCtrl.fwdl_ctrl; - -#ifdef NEED_ROM_PATCH - /* Use E2 rom patch as default */ - ctrl->patch_profile[WM_CPU].source.header_ptr = mt7622_rom_patch_e2; - ctrl->patch_profile[WM_CPU].source.header_len = - sizeof(mt7622_rom_patch_e2); - ctrl->patch_profile[WM_CPU].source.bin_name = - MT7622_ROM_PATCH_BIN_FILE_NAME_E2; -#endif /* NEED_ROM_PATCH */ - - ctrl->fw_profile[WM_CPU].source.header_ptr = MT7622_FirmwareImage_E2; - ctrl->fw_profile[WM_CPU].source.header_len = - sizeof(MT7622_FirmwareImage_E2); - ctrl->fw_profile[WM_CPU].source.bin_name = MT7622_RAM_BIN_FILE_NAME_E2; -} - -static VOID mt7622_fwdl_datapath_setup(RTMP_ADAPTER *pAd, BOOLEAN init) -{ - WPDMA_GLO_CFG_STRUC GloCfg; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (init == TRUE) { - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); - GloCfg.MT7622_field.fw_ring_bp_tx_sch = 1; - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, GloCfg.word); - - ops->pci_kick_out_cmd_msg = AndesMTPciKickOutCmdMsgFwDlRing; - } else { - ops->pci_kick_out_cmd_msg = AndesMTPciKickOutCmdMsg; - - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); - GloCfg.MT7622_field.fw_ring_bp_tx_sch = 0; - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, GloCfg.word); - } -} - -#ifdef TXBF_SUPPORT -void mt7622_setETxBFCap(IN RTMP_ADAPTER *pAd, IN TXBF_STATUS_INFO *pTxBfInfo) -{ - HT_BF_CAP *pTxBFCap = pTxBfInfo->pHtTxBFCap; - - if (pTxBfInfo->cmmCfgETxBfEnCond > 0) { - switch (pTxBfInfo->cmmCfgETxBfEnCond) { - case SUBF_ALL: - default: - pTxBFCap->RxNDPCapable = TRUE; - pTxBFCap->TxNDPCapable = - (pTxBfInfo->ucRxPathNum > 1) ? TRUE : FALSE; - pTxBFCap->ExpNoComSteerCapable = FALSE; - pTxBFCap->ExpComSteerCapable = - TRUE; /* !pTxBfInfo->cmmCfgETxBfNoncompress; */ - pTxBFCap->ExpNoComBF = - 0; /* HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->ExpComBF = - HT_ExBF_FB_CAP_IMMEDIATE; /* pTxBfInfo->cmmCfgETxBfNoncompress? HT_ExBF_FB_CAP_NONE: HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->MinGrouping = 3; - pTxBFCap->NoComSteerBFAntSup = 0; - pTxBFCap->ComSteerBFAntSup = 3; - pTxBFCap->TxSoundCapable = - FALSE; /* Support staggered sounding frames */ - pTxBFCap->ChanEstimation = pTxBfInfo->ucRxPathNum - 1; - break; - - case SUBF_BFER: - pTxBFCap->RxNDPCapable = FALSE; - pTxBFCap->TxNDPCapable = - (pTxBfInfo->ucRxPathNum > 1) ? TRUE : FALSE; - pTxBFCap->ExpNoComSteerCapable = FALSE; - pTxBFCap->ExpComSteerCapable = - TRUE; /* !pTxBfInfo->cmmCfgETxBfNoncompress; */ - pTxBFCap->ExpNoComBF = - 0; /* HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->ExpComBF = - HT_ExBF_FB_CAP_IMMEDIATE; /* pTxBfInfo->cmmCfgETxBfNoncompress? HT_ExBF_FB_CAP_NONE: HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->MinGrouping = 3; - pTxBFCap->NoComSteerBFAntSup = 0; - pTxBFCap->ComSteerBFAntSup = 3; - pTxBFCap->TxSoundCapable = - FALSE; /* Support staggered sounding frames */ - pTxBFCap->ChanEstimation = pTxBfInfo->ucRxPathNum - 1; - break; - - case SUBF_BFEE: - pTxBFCap->RxNDPCapable = TRUE; - pTxBFCap->TxNDPCapable = FALSE; - pTxBFCap->ExpNoComSteerCapable = FALSE; - pTxBFCap->ExpComSteerCapable = - TRUE; /* !pTxBfInfo->cmmCfgETxBfNoncompress; */ - pTxBFCap->ExpNoComBF = - 0; /* HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->ExpComBF = - HT_ExBF_FB_CAP_IMMEDIATE; /* pTxBfInfo->cmmCfgETxBfNoncompress? HT_ExBF_FB_CAP_NONE: HT_ExBF_FB_CAP_IMMEDIATE; */ - pTxBFCap->MinGrouping = 3; - pTxBFCap->NoComSteerBFAntSup = 0; - pTxBFCap->ComSteerBFAntSup = 3; - pTxBFCap->TxSoundCapable = - FALSE; /* Support staggered sounding frames */ - pTxBFCap->ChanEstimation = pTxBfInfo->ucRxPathNum - 1; - break; - } - } else - memset(pTxBFCap, 0, sizeof(*pTxBFCap)); -} - -#ifdef VHT_TXBF_SUPPORT -void mt7622_setVHTETxBFCap(IN RTMP_ADAPTER *pAd, IN TXBF_STATUS_INFO *pTxBfInfo) -{ - VHT_CAP_INFO *pTxBFCap = pTxBfInfo->pVhtTxBFCap; - - if (pTxBfInfo->cmmCfgETxBfIncapable) { - pTxBFCap->num_snd_dimension = 0; - pTxBFCap->bfee_cap_mu = 0; - pTxBFCap->bfee_cap_su = 0; - pTxBFCap->bfer_cap_mu = 0; - pTxBFCap->bfer_cap_su = 0; - pTxBFCap->bfee_sts_cap = 0; - } else { - pTxBFCap->bfee_cap_su = 1; - pTxBFCap->bfer_cap_su = (pTxBfInfo->ucTxPathNum > 1) ? 1 : 0; - pTxBFCap->bfee_cap_mu = 1; - pTxBFCap->bfer_cap_mu = (pTxBfInfo->ucTxPathNum > 1) ? 1 : 0; - pTxBFCap->bfee_sts_cap = 3; - pTxBFCap->num_snd_dimension = pTxBfInfo->ucTxPathNum - 1; - } -} -#endif /* VHT_TXBF_SUPPORT */ -#endif /* TXBF_SUPPORT */ - -#ifdef HOST_RESUME_DONE_ACK_SUPPORT -static void mt7622_host_resume_done_ack(struct _RTMP_ADAPTER *pAd) -{ - mt_cmd_host_resume_done_ack(pAd); -} -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ - -#ifdef RF_LOCKDOWN -static UINT32 ICAL_JUST_MERGE[] = { - 0x118, 0x1b5, 0x1b6, 0x1b7, 0x3ac, 0x3ad, - 0x3ae, 0x3af, 0x3b0, 0x3b1, 0x3b2 -}; /* merge but nott check */ -static UINT32 ICAL_JUST_MERGE_NUM = (sizeof(ICAL_JUST_MERGE) / sizeof(UINT32)); - -static UINT32 RFLOCK[] = { - 0x03F, 0x040, 0x041, 0x056, 0x057, 0x058, 0x059, 0x05A, 0x05B, 0x05C, - 0x05D, 0x05E, 0x05F, 0x060, 0x061, 0x062, 0x063, 0x064, 0x065, 0x066, - 0x067, 0x068, 0x069, 0x06A, 0x06B, 0x06C, 0x06D, 0x06E, 0x06F, 0x070, - 0x071, 0x072, 0x073, 0x074, 0x075, 0x076, 0x077, 0x078, 0x079, 0x07A, - 0x07B, 0x07C, 0x07D, 0x07E, 0x07F, 0x080, 0x081, 0x082, 0x083, 0x084, - 0x085, 0x086, 0x087, 0x088, 0x089, 0x08A, 0x08B, 0x08C, 0x08D, 0x08E, - 0x08F, 0x090, 0x091, 0x092, 0x093, 0x094, 0x095, 0x096, 0x097, 0x098, - 0x099, 0x09A, 0x09B, 0x09C, 0x09D, 0x09E, 0x09F, 0x0A0, 0x0A1, 0x0A2, - 0x0A3, 0x0A4, 0x0A5, 0x0A6, 0x0A7, 0x0A8, 0x0A9, 0x0AA, 0x0AB, 0x0AC, - 0x0AD, 0x0AE, 0x0AF, 0x0B0, 0x0B1, 0x0B2, 0x0B3, 0x0B4, 0x0B5, 0x0B6, - 0x0B7, 0x0B8, 0x0B9, 0x0BA, 0x0BB, 0x0BC, 0x0BD, 0x0BE, 0x0BF, 0x0C0, - 0x0C1, 0x0C2, 0x0C3, 0x0C4, 0x0C5, 0x0C6, 0x0C7, 0x0C8, 0x0C9, 0x0CA, - 0x0CB, 0x0CC, 0x0CD, 0x0CE, 0x0CF, 0x0D0, 0x0D1, 0x0D2, 0x0D3, 0x0D4, - 0x0D5, 0x0D6, 0x0D7, 0x0D8, 0x0D9, 0x0DA, 0x0DB, 0x0DC, 0x0DD, 0x0DE, - 0x0DF, 0x0E0, 0x0E1, 0x0E2, 0x0E3, 0x0E4, 0x0E5, 0x0E6, 0x0E7, 0x0E8, - 0x0E9, 0x0EA, 0x0EB, 0x0EC, 0x0ED, 0x0EE, 0x0EF, 0x0F0, 0x0F2, 0x0F3, - 0x118, 0x11C, 0x11D, 0x11E, 0x11F, 0x12C, 0x12D, 0x140, 0x141, 0x142, - 0x143, 0x144, 0x145, 0x146, 0x147, 0x148, 0x149, 0x14A, 0x14B, 0x14C, - 0x14D, 0x14E, 0x14F, 0x150, 0x151, 0x152, 0x153, 0x154, 0x155, 0x156, - 0x157, 0x158, 0x159, 0x15A, 0x15B, 0x15C, 0x15D, 0x15E, 0x15F, 0x160, - 0x161, 0x162, 0x163, 0x164, 0x165, 0x166, 0x167, 0x168, 0x169, 0x16A, - 0x16B, 0x16C, 0x16D, 0x16E, 0x16F, 0x170, 0x171, 0x172, 0x173, 0x174, - 0x175, 0x176, 0x177, 0x178, 0x179, 0x17A, 0x17B, 0x17C, 0x17D, 0x17E, - 0x17F, 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x187, 0x188, - 0x189, 0x18A, 0x18B, 0x18C, 0x18D, 0x18E, 0x18F, 0x190, 0x191, 0x192, - 0x193, 0x194, 0x195, 0x196, 0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, - 0x19D, 0x19E, 0x19F, 0x1A0, 0x1A2, 0x1A3, 0x1A4, 0x1A5, 0x1A6, 0x1A7, - 0x1A8, 0x1A9, 0x1AA, 0x1AB, 0x1AC, 0x1AD, 0x1AE, 0x1AF, 0x1B0, 0x1B1, - 0x1B2, 0x3AC, 0x3AD, 0x3AE, 0x3AF -}; - -static UINT32 RFLOCK_NUM = (sizeof(RFLOCK) / sizeof(UINT32)); - -static BOOLEAN mt7622_check_RF_lock_down(RTMP_ADAPTER *pAd) -{ - BOOL RFlockDown; - if (pAd->EEPROMImage[MT7622_RF_LOCKDOWN_EEPROME_BLOCK_OFFSET + - MT7622_RF_LOCKDOWN_EEPROME_COLUMN_OFFSET] & - RF_LOCKDOWN_EEPROME_BIT) - RFlockDown = TRUE; - else - RFlockDown = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: \033[32m RFlockDown %s \033[0m \n", __func__, - (RFlockDown) ? "Enable" : "Disable")); - return RFlockDown; -} - -static BOOLEAN mt7622_write_RF_lock_parameter(RTMP_ADAPTER *pAd, USHORT offset) -{ - BOOLEAN RFParaWrite; - BOOLEAN fgRFlock = FALSE; - UINT16 RFlock_index = 0; -#ifdef CAL_FREE_IC_SUPPORT - BOOLEAN fgCalFree = FALSE; - UINT16 CalFree_index = 0; -#endif /* CAL_FREE_IC_SUPPORT */ - - /* Priority rule 1: RF lock paramter or not? */ - /* Priority rule 2: Apply cal free or not? */ - /* Priority rule 3: Cal free parameter or not? */ - - /* Check whether the offset exist in RF Lock Table or not */ - for (RFlock_index = pAd->RFlockTempIdx; RFlock_index < RFLOCK_NUM; - RFlock_index++) { - if (RFLOCK[RFlock_index] == offset) { - fgRFlock = TRUE; - pAd->RFlockTempIdx = RFlock_index; - break; - } - } - -#ifdef CAL_FREE_IC_SUPPORT - - /* Check whether the offset exist in Cal Free Table or not */ - for (CalFree_index = pAd->CalFreeTempIdx; CalFree_index < ICAL_NUM; - CalFree_index++) { - if (ICAL[CalFree_index] == offset) { - fgCalFree = TRUE; - pAd->CalFreeTempIdx = CalFree_index; - break; - } - } - - /* Check whether the offset exist in Cal Free (Merge but not check) Table or not */ - for (CalFree_index = 0; CalFree_index < ICAL_JUST_MERGE_NUM; - CalFree_index++) { - if (ICAL_JUST_MERGE[CalFree_index] == offset) { - fgCalFree = TRUE; - break; - } - } - -#endif /* CAL_FREE_IC_SUPPORT */ - - /* Determine whether this offset needs to be written or not when RF lockdown */ - if (fgRFlock) { -#ifdef CAL_FREE_IC_SUPPORT - - if (pAd->fgCalFreeApply) { - if (fgCalFree) - RFParaWrite = FALSE; - else - RFParaWrite = TRUE; - } else - RFParaWrite = TRUE; - -#else - RFParaWrite = TRUE; -#endif - } else - RFParaWrite = FALSE; - - return RFParaWrite; -} - -static BOOLEAN mt7622_merge_RF_lock_parameter(RTMP_ADAPTER *pAd) -{ - UCHAR block[EFUSE_BLOCK_SIZE] = ""; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - USHORT length = cap->EEPROM_DEFAULT_BIN_SIZE; - UCHAR *ptr = pAd->EEPROMImage; - UCHAR index; - USHORT offset = 0; - UINT isVaild = 0; - BOOL WriteStatus; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - /* Merge RF parameters in Effuse to E2p buffer */ - if (chip_check_rf_lock_down(pAd)) { - /* Check Effuse Content block by block */ - for (offset = 0; offset < length; offset += EFUSE_BLOCK_SIZE) { - MtCmdEfuseAccessRead(pAd, offset, &block[0], &isVaild); - - /* Check the Needed contents are different and update the E2p content by Effuse */ - for (index = 0; index < EFUSE_BLOCK_SIZE; index++) { - /* Obtain the status of this E2p column need to write or not */ - WriteStatus = ops->write_RF_lock_parameter( - pAd, offset + index); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("Effuse[0x%04x]: Write(%d)\n", - offset + index, WriteStatus)); - - if ((block[index] != ptr[index]) && - (WriteStatus)) - ptr[index] = block[index]; - else - continue; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("index 0x%04x: ", offset + index)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("orignal E2p value=0x%04x, write value=0x%04x\n", - ptr[index], block[index])); - } - - ptr += EFUSE_BLOCK_SIZE; - } - } - - return TRUE; -} - -static UCHAR mt7622_Read_Effuse_parameter(RTMP_ADAPTER *pAd, USHORT offset) -{ - UCHAR block[EFUSE_BLOCK_SIZE] = ""; - UINT isVaild = 0; - UINT16 BlockOffset, IndexOffset; - UCHAR RFUnlock = 0xFF; - /* Obtain corresponding BlockOffset and IndexOffset for Effuse contents access */ - IndexOffset = offset % EFUSE_BLOCK_SIZE; - BlockOffset = offset - IndexOffset; - - /* Merge RF parameters in Effuse to E2p buffer */ - if (chip_check_rf_lock_down(pAd)) { - /* Check Effuse Content block by block */ - MtCmdEfuseAccessRead(pAd, BlockOffset, &block[0], &isVaild); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Read Effuse[0x%x]: 0x%x ", offset, - block[IndexOffset])); - return block[IndexOffset]; - } - - return RFUnlock; -} - -static BOOLEAN mt7622_Config_Effuse_Country(RTMP_ADAPTER *pAd) -{ - UCHAR Buffer0, Buffer1; - UCHAR CountryCode[2]; - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - /* Country Region 2G */ - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - Buffer0 = pAd->EEPROMImage[MT7622_COUNTRY_REGION_2G_EEPROME_OFFSET]; - /* Check the RF lock status */ - if (Buffer0 != 0xFF) { - /* Check Validation bit for content */ - if (((Buffer0) & (COUNTRY_REGION_VALIDATION_MASK)) >> - (COUNTRY_REGION_VALIDATION_OFFSET)) - pAd->CommonCfg.CountryRegion = - ((Buffer0) & (COUNTRY_REGION_CONTENT_MASK)); - } - - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - /* Country Region 5G */ - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - Buffer1 = pAd->EEPROMImage[MT7622_COUNTRY_REGION_5G_EEPROME_OFFSET]; - - /* Check the RF lock status */ - if (Buffer1 != 0xFF) { - /* Check Validation bit for content */ - if (((Buffer1) & (COUNTRY_REGION_VALIDATION_MASK)) >> - (COUNTRY_REGION_VALIDATION_OFFSET)) - pAd->CommonCfg.CountryRegionForABand = - ((Buffer1) & (COUNTRY_REGION_CONTENT_MASK)); - } - - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - /* Country Code */ - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - CountryCode[0] = pAd->EEPROMImage[COUNTRY_CODE_BYTE0_EEPROME_OFFSET]; - CountryCode[1] = pAd->EEPROMImage[COUNTRY_CODE_BYTE1_EEPROME_OFFSET]; - - /* Check the RF lock status */ - if ((CountryCode[0] != 0xFF) && (CountryCode[1] != 0xFF)) { - /* Check Validation for content */ - if ((CountryCode[0] != 0x00) && (CountryCode[1] != 0x00)) { - pAd->CommonCfg.CountryCode[0] = CountryCode[0]; - pAd->CommonCfg.CountryCode[1] = CountryCode[1]; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("pAd->CommonCfg.CountryCode[0]: 0x%x, %c ", - pAd->CommonCfg.CountryCode[0], - pAd->CommonCfg.CountryCode[0])); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("pAd->CommonCfg.CountryCode[1]: 0x%x, %c ", - pAd->CommonCfg.CountryCode[1], - pAd->CommonCfg.CountryCode[1])); - } - } - - return TRUE; -} -#endif /* RF_LOCKDOWN */ - -UCHAR *mt7622_get_default_bin_image(VOID) -{ -#if defined(CONFIG_FIRST_IF_IPAILNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 1st iPAiLNA default bin.\n")); - return MT7622_E2PImage_iPAiLNA; -#elif defined(CONFIG_FIRST_IF_IPAELNA) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 1st iPAeLNA default bin.\n")); - return MT7622_E2PImage_iPAeLNA; -#else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 1st ePAeLNA default bin.\n")); - return MT7622_E2PImage_ePAeLNA; -#endif - - return NULL; -} - -UCHAR *mt7622_get_default_bin_image_file(VOID) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Use 1st %s default bin.\n", DEFAULT_BIN_FILE)); - return DEFAULT_BIN_FILE; -} - -static INT hif_set_WPDMA(RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN enable, - UINT8 WPDMABurstSIZE) -{ - WPDMA_GLO_CFG_STRUC GloCfg; -#ifdef CONFIG_DELAY_INT - UINT32 Value; -#endif - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); -#ifdef CONFIG_DELAY_INT - HIF_IO_READ32(pAd, MT_DELAY_INT_CFG, &Value); -#endif - - switch (TxRx) { - case PDMA_TX: - if (enable == TRUE) { - GloCfg.MT7622_field.EnableTxDMA = 1; - GloCfg.MT7622_field.EnTXWriteBackDDONE = 1; - GloCfg.MT7622_field.WPDMABurstSIZE = WPDMABurstSIZE; - GloCfg.MT7622_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2_PREFETCH; -#ifdef CONFIG_DELAY_INT - Value |= TX_DLY_INT_EN; - Value &= ~TX_MAX_PINT_MASK; - Value |= TX_MAX_PINT(TX_PENDING_INT_NUMS); - Value &= ~TX_MAX_PTIME_MASK; - Value |= TX_MAX_PTIME(TX_PENDING_INT_TIME); -#endif - } else { - GloCfg.MT7622_field.EnableTxDMA = 0; -#ifdef CONFIG_DELAY_INT - Value &= ~TX_DLY_INT_EN; - Value &= ~TX_MAX_PINT_MASK; - Value &= ~TX_MAX_PTIME_MASK; -#endif - } - - break; - - case PDMA_RX: - if (enable == TRUE) { - GloCfg.MT7622_field.EnableRxDMA = 1; - GloCfg.MT7622_field.WPDMABurstSIZE = WPDMABurstSIZE; - GloCfg.MT7622_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2_PREFETCH; -#ifdef CONFIG_DELAY_INT - Value |= RX_DLY_INT_EN; - Value &= ~RX_MAX_PINT_MASK; - Value |= RX_MAX_PINT(RX_PENDING_INT_NUMS); - Value &= ~RX_MAX_PTIME_MASK; - Value |= RX_MAX_PTIME(RX_PENDING_INT_TIME); -#endif - } else { - GloCfg.MT7622_field.EnableRxDMA = 0; -#ifdef CONFIG_DELAY_INT - Value &= ~RX_DLY_INT_EN; - Value &= ~RX_MAX_PINT_MASK; - Value &= ~RX_MAX_PTIME_MASK; -#endif - } - - break; - - case PDMA_TX_RX: - if (enable == TRUE) { - GloCfg.MT7622_field.EnableTxDMA = 1; - GloCfg.MT7622_field.EnableRxDMA = 1; - GloCfg.MT7622_field.EnTXWriteBackDDONE = 1; - GloCfg.MT7622_field.WPDMABurstSIZE = WPDMABurstSIZE; - GloCfg.MT7622_field.multi_dma_en = - MULTI_DMA_EN_FEATURE_2_PREFETCH; - -#ifdef CONFIG_DELAY_INT - Value |= TX_DLY_INT_EN; - Value &= ~TX_MAX_PINT_MASK; - Value |= TX_MAX_PINT(TX_PENDING_INT_NUMS); - Value &= ~TX_MAX_PTIME_MASK; - Value |= TX_MAX_PTIME(TX_PENDING_INT_TIME); - Value |= RX_DLY_INT_EN; - Value &= ~RX_MAX_PINT_MASK; - Value |= RX_MAX_PINT(RX_PENDING_INT_NUMS); - Value &= ~RX_MAX_PTIME_MASK; - Value |= RX_MAX_PTIME(RX_PENDING_INT_TIME); -#endif - } else { - GloCfg.MT7622_field.EnableRxDMA = 0; - GloCfg.MT7622_field.EnableTxDMA = 0; -#ifdef CONFIG_DELAY_INT - Value &= ~TX_DLY_INT_EN; - Value &= ~TX_MAX_PINT_MASK; - Value &= ~TX_MAX_PTIME_MASK; - Value &= ~RX_DLY_INT_EN; - Value &= ~RX_MAX_PINT_MASK; - Value &= ~RX_MAX_PTIME_MASK; -#endif - } - - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown path (%d\n", __func__, TxRx)); - break; - } - - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, GloCfg.word); -#ifdef CONFIG_DELAY_INT - HIF_IO_WRITE32(pAd, MT_DELAY_INT_CFG, Value); -#endif - -#define WPDMA_DISABLE -1 - - if (!enable) - TxRx = WPDMA_DISABLE; - - WLAN_HOOK_CALL(WLAN_HOOK_DMA_SET, pAd, &TxRx); - return TRUE; -} - -static BOOLEAN hif_wait_WPDMA_idle(struct _RTMP_ADAPTER *pAd, INT round, - INT wait_us) -{ - INT i = 0; - - WPDMA_GLO_CFG_STRUC GloCfg; - /* TODO: shiang-MT7615 */ - do { - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); - - if ((GloCfg.MT7622_field.TxDMABusy == 0) && - (GloCfg.MT7622_field.RxDMABusy == 0)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> DMAIdle, GloCfg=0x%x\n", GloCfg.word)); - return TRUE; - } - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) - return FALSE; - - RtmpusecDelay(wait_us); - } while ((i++) < round); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> DMABusy\n")); - return FALSE; -} - -static BOOLEAN hif_reset_WPDMA(RTMP_ADAPTER *pAd) -{ - UINT32 value = 0; - - /* pdma0 hw reset (w/ dma scheduler) - activate: toggle (active low) - scope: PDMA + DMASCH + Tx/Rx FIFO - PDMA: - logic reset: Y - register reset: N (but DMA_IDX will be reset to 0) - DMASCH: - logic reset: Y - register reset: Y - */ - HIF_PDMA_IO_READ32(pAd, MT_HIF_SYS_SW_RST, &value); - value &= ~(HIF_DATA_PATH_RESET_N); - HIF_PDMA_IO_WRITE32(pAd, MT_HIF_SYS_SW_RST, value); - HIF_PDMA_IO_READ32(pAd, MT_HIF_SYS_SW_RST, &value); - value |= (HIF_DATA_PATH_RESET_N); - HIF_PDMA_IO_WRITE32(pAd, MT_HIF_SYS_SW_RST, value); - - return TRUE; -} - -static INT32 get_fw_sync_value(RTMP_ADAPTER *pAd) -{ - UINT32 value; - - RTMP_IO_READ32(pAd, TOP_OFF_RSV, &value); - value = (value & 0x00070000) >> 16; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: current sync CR = 0x%x\n", __func__, value)); - return value; -} - -VOID mt7622_trigger_intr_to_mcu(BOOLEAN enable) -{ - unsigned long addr; - unsigned int value; - - addr = (unsigned long)ioremap(HIF_INTR_BASE, HIF_REMAP_SIZE); - RTMP_SYS_IO_READ32(addr, &value); - - /* write 0 to assert interrupt */ - if (enable == TRUE) - value &= ~HIF_INTR_VALUE; - else - value |= HIF_INTR_VALUE; - - RTMP_SYS_IO_WRITE32(addr, value); - iounmap((void *)addr); -} - -static VOID fw_own(RTMP_ADAPTER *pAd) -{ - UINT32 counter, value; - - if (pAd->bDrvOwn == FALSE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s()::Return since already in Fw Own...\n", - __func__)); - return; - } - - /* trigger hif interrupt to MCU */ - mt7622_trigger_intr_to_mcu(TRUE); - - /* Write any value to HIF_FUN_CAP to set FW own */ - HIF_IO_WRITE32(pAd, MT_CFG_LPCR_HOST, MT_HOST_SET_OWN); - - /* Poll driver own status */ - counter = 0; - - while (counter < FW_OWN_POLLING_COUNTER) { - RtmpusecDelay(1000); - HIF_IO_READ32(pAd, MT_CFG_LPCR_HOST, &value); - - if (value & MT_HOST_SET_OWN) { - pAd->bDrvOwn = FALSE; - break; - } - - counter++; - } - - mt7622_trigger_intr_to_mcu(FALSE); - - if (!pAd->bDrvOwn) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s()::Success to set FW Own\n", __func__)); - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s()::Fail to set FW Own (%d)\n", __func__, - counter)); -} - -static INT32 driver_own(RTMP_ADAPTER *pAd) -{ - INT32 Ret = NDIS_STATUS_SUCCESS; - UINT32 counter, value; - - if (pAd->bDrvOwn == TRUE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s()::Return since already in Driver Own...\n", - __func__)); - return Ret; - } - - /* trigger hif interrupt to MCU */ - mt7622_trigger_intr_to_mcu(TRUE); - - /* Write CR to get driver own */ - HIF_IO_WRITE32(pAd, MT_CFG_LPCR_HOST, MT_HOST_CLR_OWN); - - /* Poll driver own status */ - counter = 0; - - while (counter < FW_OWN_POLLING_COUNTER) { - RtmpusecDelay(1000); - - /* polling case */ - HIF_IO_READ32(pAd, MT_CFG_LPCR_HOST, &value); - if (!(value & MT_HOST_SET_OWN)) { - pAd->bDrvOwn = TRUE; - break; - } - - /* interrupt case */ - if (pAd->bDrvOwn) - break; - - counter++; - } - - mt7622_trigger_intr_to_mcu(FALSE); - - if (pAd->bDrvOwn) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s()::Success to clear Fw Own\n", __func__)); - else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s()::Fail to clear Fw Own (%d)\n", __func__, - counter)); - Ret = NDIS_STATUS_FAILURE; - } - - return Ret; -} - -void mt7622_heart_beat_check(RTMP_ADAPTER *pAd) -{ -#define HEART_BEAT_CHECK_PERIOD 30 -#define N9_HEART_BEAT_ADDR \ - 0x2300 /* TOP_CONFIG_DUMMY_SER_RECOVER_RECORD, dummy CR, defined in N9 FW */ - UINT32 mac_val; - UINT8 n9_detect = FALSE; - RTMP_STRING *str = NULL; - - if ((pAd->Mlme.PeriodicRound % HEART_BEAT_CHECK_PERIOD) == 0) { - if (pAd->heart_beat_stop == TRUE) - return; - - MAC_IO_READ32(pAd, N9_HEART_BEAT_ADDR, &mac_val); - - if (mac_val == pAd->pre_n9_heart_beat_cnt) - pAd->pre_n9_heart_beat_cnt = ~mac_val; - else if (~mac_val == pAd->pre_n9_heart_beat_cnt) - n9_detect = TRUE; - else - pAd->pre_n9_heart_beat_cnt = mac_val; - - if (n9_detect) - str = "N9 heart beat stop!!\n"; - - if (str != NULL) { - pAd->heart_beat_stop = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s]:%s", RtmpOsGetNetDevName(pAd->net_dev), - str)); -#ifdef MT_FDB - show_fdb_n9_log(pAd, NULL); -#endif /* MT_FDB */ -#ifdef ERR_RECOVERY - ser_sys_reset(str); -#endif - } - } -} - -#ifdef CONFIG_PROPRIETARY_DRIVER -#define EFUSE_NIC_CONFIG_1 0x36 -#define EFUSE_TSSI_MASK 0x20 -#define EFUSE_WIFI_CONFIG 0x3E -#define EFUSE_PA_LNA_MASK 0xC -#define EFUSE_PA_MASK 0x8 -#define EFUSE_PA_LNA_SHIFT 2 -#define EFUSE_PA_SHIFT 3 - -static INT32 mt7622_tssi_set(struct _RTMP_ADAPTER *ad, UCHAR *efuse) -{ - UCHAR *nic_cfg1 = &efuse[EFUSE_NIC_CONFIG_1 + 1]; - UCHAR mode = (*nic_cfg1 & EFUSE_TSSI_MASK) ? 1 : 0; - UCHAR *wifi_cfg = &efuse[EFUSE_WIFI_CONFIG]; - UCHAR pa_mode = (*wifi_cfg & EFUSE_PA_MASK) >> EFUSE_PA_SHIFT; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): nic_cfg1=%x, mode=%d\n", __func__, *nic_cfg1, mode)); - if (pa_mode && mode) - return rbus_tssi_set(ad, mode); - else - return 0; -} - -static INT32 mt7622_pa_lna_set(struct _RTMP_ADAPTER *ad, UCHAR *efuse) -{ - UINT8 antCtrl = 0; - UINT8 polCtrl = 0; - UINT8 wifiConfig1, wifiConfig2, coexType, wifiPolarity1, wifiPolarity2; - UCHAR wifiStreams; - UINT32 efuse_settings = 0; - - wifiConfig1 = efuse[EFUSE_ANTENNA_CONFIG_POS1]; - wifiConfig2 = efuse[EFUSE_ANTENNA_CONFIG_POS2]; - coexType = efuse[EFUSE_ANTENNA_COEX_TYPE_POS]; - wifiPolarity1 = efuse[EFUSE_ANTENNA_POLARITY_POS1]; - wifiPolarity2 = efuse[EFUSE_ANTENNA_POLARITY_POS2]; - wifiStreams = efuse[EFUSE_ANTENNA_STREAMS_POS]; - - antCtrl |= GetGbandPaLna(wifiConfig1); - antCtrl |= ((GetFEMPowerSave(wifiConfig2)) << FEM_PWR_SAV_OFFSET); - antCtrl |= (GetStreams(wifiConfig2) << 2); - antCtrl |= ((GetCoex(coexType)) << COEX_TYPE_OFFSET); - antCtrl |= ((GetSmartAntMode(wifiConfig1)) << SMART_ANT_OFFSET); - antCtrl |= ((GetPIP(wifiConfig2)) << BT_PIP_OFFSET); - polCtrl |= (GetPolTRSWN(wifiPolarity1)); - polCtrl |= ((GetPolTRSWP(wifiPolarity1)) << POLARITY_TRSW_P_OFFSET); - polCtrl |= ((GetPolLNA(wifiPolarity1)) << POLARITY_LNA_OFFSET); - polCtrl |= ((GetPolPA(wifiPolarity1)) << POLARITY_PA_OFFSET); - polCtrl |= ((GetSAntpol(wifiPolarity2)) << SMART_ANT_POLARITY_OFFSET); - polCtrl |= ((GetPIPPol(wifiPolarity2)) << BT_PIP_POLARITY_OFFSET); - polCtrl |= ((GetVLINPol(wifiPolarity2)) << VLIN_LINEARITY_OFFSET); - polCtrl |= ((GetSharedPin(wifiPolarity2)) << SHARED_PIN_OFFSET); - efuse_settings |= (antCtrl | (polCtrl << 8) | (wifiStreams << 16)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): read antCtrl = %d, polCtrl = %d, wifiStreams = %02x\n", - __func__, antCtrl, polCtrl, wifiStreams)); - return rbus_pa_lna_set(ad, efuse_settings); -} - -#endif /*CONFIG_PROPRIETARY_DRIVER*/ - -static struct dly_ctl_cfg mt7622_rx_dly_ctl_ul_tbl[] = { - { 0, 0x811c }, - { 300, 0xa01c }, - { 500, 0xc01f }, -}; - -static struct dly_ctl_cfg mt7622_rx_dly_ctl_dl_tbl[] = { - { 0, 0x811c }, -}; - -static RTMP_CHIP_OP MT7622_ChipOp = { 0 }; -static RTMP_CHIP_CAP MT7622_ChipCap = { 0 }; - -static VOID mt7622_chipCap_init(void) -{ -#ifdef DOT11_VHT_AC - MT7622_ChipCap.max_vht_mcs = VHT_MCS_CAP_9; - MT7622_ChipCap.max_mpdu_len = MPDU_3895_OCTETS; - MT7622_ChipCap.vht_max_ampdu_len_exp = 7; -#ifdef G_BAND_256QAM - MT7622_ChipCap.g_band_256_qam = TRUE; -#endif -#endif /* DOT11_VHT_AC */ -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - MT7622_ChipCap.max_v2_bcn_num = 16; -#endif - MT7622_ChipCap.TXWISize = sizeof(TMAC_TXD_L); - MT7622_ChipCap.RXWISize = 28; - MT7622_ChipCap.tx_hw_hdr_len = MT7622_ChipCap.TXWISize; - MT7622_ChipCap.rx_hw_hdr_len = MT7622_ChipCap.RXWISize; - MT7622_ChipCap.num_of_tx_ring = 6; - MT7622_ChipCap.num_of_rx_ring = 2; - MT7622_ChipCap.tx_ring_size = 512; - MT7622_ChipCap.rx0_ring_size = 512; - MT7622_ChipCap.rx1_ring_size = 512; - MT7622_ChipCap.asic_caps = (fASIC_CAP_PMF_ENC | fASIC_CAP_MCS_LUT | - fASIC_CAP_CT | fASIC_CAP_HW_DAMSDU); -#ifdef RX_CUT_THROUGH - MT7622_ChipCap.asic_caps |= fASIC_CAP_BA_OFFLOAD; -#endif -#ifdef HDR_TRANS_TX_SUPPORT - MT7622_ChipCap.asic_caps |= fASIC_CAP_TX_HDR_TRANS; -#endif -#ifdef HDR_TRANS_RX_SUPPORT - MT7622_ChipCap.asic_caps |= fASIC_CAP_RX_HDR_TRANS; -#endif -#ifdef CONFIG_CSO_SUPPORT - MT7622_ChipCap.asic_caps |= fASIC_CAP_CSO; -#endif -#ifdef RX_SCATTER - MT7622_ChipCap.asic_caps |= fASIC_CAP_RX_DMA_SCATTER; -#endif - - MT7622_ChipCap.asic_caps |= fASIC_CAP_RX_DLY; - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - MT7622_ChipCap.asic_caps &= ~fASIC_CAP_PCIE_ASPM_DYM_CTRL; -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - - MT7622_ChipCap.phy_caps = (fPHY_CAP_24G | fPHY_CAP_HT | fPHY_CAP_TXBF | - fPHY_CAP_LDPC | fPHY_CAP_BW40); - MT7622_ChipCap.hw_ops_ver = HWCTRL_OP_TYPE_V2; - MT7622_ChipCap.hif_type = HIF_MT; - MT7622_ChipCap.mac_type = MAC_MT; - MT7622_ChipCap.MCUType = ANDES; - MT7622_ChipCap.rf_type = RF_MT; - MT7622_ChipCap.pRFRegTable = NULL; - MT7622_ChipCap.pBBPRegTable = NULL; - MT7622_ChipCap.bbpRegTbSize = 0; - MT7622_ChipCap.MaxNumOfRfId = MAX_RF_ID; - MT7622_ChipCap.MaxNumOfBbpId = 200; - MT7622_ChipCap.WtblHwNum = MT7622_MT_WTBL_SIZE; - MT7622_ChipCap.FlgIsHwWapiSup = TRUE; - MT7622_ChipCap.FlgIsHwAntennaDiversitySup = FALSE; -#ifdef STREAM_MODE_SUPPORT - MT7622_ChipCap.FlgHwStreamMode = FALSE; -#endif -#ifdef TXBF_SUPPORT - MT7622_ChipCap.FlgHwTxBfCap = TXBF_HW_CAP; -#endif - MT7622_ChipCap.SnrFormula = SNR_FORMULA4; - if (get_subid() == 0x4) { - MT7622_ChipCap.max_nss = 2; - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("7622D found!\n")); - } else { - MT7622_ChipCap.max_nss = 4; - } - /* todo Ellis */ -#ifdef RTMP_EFUSE_SUPPORT - MT7622_ChipCap.EFUSE_USAGE_MAP_START = 0x3c0; - MT7622_ChipCap.EFUSE_USAGE_MAP_END = 0x3fb; - MT7622_ChipCap.EFUSE_USAGE_MAP_SIZE = 60; - MT7622_ChipCap.EFUSE_RESERVED_SIZE = 59; /* Cal-Free is 22 free block */ -#endif - MT7622_ChipCap.EEPROM_DEFAULT_BIN = mt7622_get_default_bin_image(); - MT7622_ChipCap.EEPROM_DEFAULT_BIN_FILE = - mt7622_get_default_bin_image_file(); - MT7622_ChipCap.EEPROM_DEFAULT_BIN_SIZE = - sizeof(MT7622_E2PImage_ePAeLNA); - MT7622_ChipCap.EFUSE_BUFFER_CONTENT_SIZE = EFUSE_CONTENT_SIZE; -#ifdef CARRIER_DETECTION_SUPPORT - MT7622_ChipCap.carrier_func = TONE_RADAR_V2; -#endif -#ifdef RTMP_MAC_PCI - MT7622_ChipCap.WPDMABurstSIZE = 3; -#endif - MT7622_ChipCap.ProbeRspTimes = 2; -#ifdef NEW_MBSSID_MODE -#ifdef ENHANCE_NEW_MBSSID_MODE - MT7622_ChipCap.MBSSIDMode = MBSSID_MODE4; -#else - MT7622_ChipCap.MBSSIDMode = MBSSID_MODE1; -#endif /* ENHANCE_NEW_MBSSID_MODE */ -#else - MT7622_ChipCap.MBSSIDMode = MBSSID_MODE0; -#endif /* NEW_MBSSID_MODE */ -#ifdef DOT11W_PMF_SUPPORT - /* sync with Ellis, wilsonl */ - MT7622_ChipCap.FlgPMFEncrtptMode = PMF_ENCRYPT_MODE_2; -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef CONFIG_ANDES_SUPPORT -#ifdef NEED_ROM_PATCH - MT7622_ChipCap.need_load_patch = BIT(WM_CPU); -#else - MT7622_ChipCap.need_load_patch = 0; -#endif - MT7622_ChipCap.need_load_fw = BIT(WM_CPU); - MT7622_ChipCap.load_patch_flow = PATCH_FLOW_V1; - MT7622_ChipCap.load_fw_flow = FW_FLOW_V1; - MT7622_ChipCap.patch_format = PATCH_FORMAT_V1; - MT7622_ChipCap.fw_format = FW_FORMAT_V2; - MT7622_ChipCap.load_fw_method = BIT(HEADER_METHOD); - MT7622_ChipCap.load_patch_method = BIT(BIN_METHOD) | BIT(HEADER_METHOD); - MT7622_ChipCap.rom_patch_offset = MT7622_ROM_PATCH_START_ADDRESS; -#endif -#ifdef UNIFY_FW_CMD /* todo wilsonl */ - MT7622_ChipCap.cmd_header_len = sizeof(FW_TXD) + sizeof(TMAC_TXD_L); -#else - MT7622_ChipCap.cmd_header_len = 12; /* sizeof(FW_TXD) */ -#endif - MT7622_ChipCap.cmd_padding_len = 0; - MT7622_ChipCap.TxAggLimit = 64; - MT7622_ChipCap.RxBAWinSize = 64; - MT7622_ChipCap.ht_max_ampdu_len_exp = 3; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - /* enabled later, wilsonl */ - MT7622_ChipCap.fgRateAdaptFWOffload = TRUE; -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - MT7622_ChipCap.WmmHwNum = MT7622_MT_WMM_SIZE; /* for multi-wmm */ - MT7622_ChipCap.PDA_PORT = MT7622_PDA_PORT; - MT7622_ChipCap.SupportAMSDU = TRUE; - /* sync with Pat, wilsonl */ - MT7622_ChipCap.APPSMode = APPS_MODE2; - MT7622_ChipCap.CtParseLen = MT7622_CT_PARSE_LEN; - MT7622_ChipCap.qm = GENERIC_QM; - MT7622_ChipCap.qm_tm = TASKLET_METHOD; - MT7622_ChipCap.hif_tm = TASKLET_METHOD; - MT7622_ChipCap.wmm_detect_method = WMM_DETECT_METHOD1; - - /* for interrupt enable mask */ - MT7622_ChipCap.int_enable_mask = MT_CoherentInt | MT_MacInt | - MT_INT_RX_DLY | MT_INT_T3_DONE | - MT_INT_T15_DONE | MT_FW_CLR_OWN_INT; - - MT7622_ChipCap.hif_pkt_type[HIF_TX_IDX0] = TX_DATA; - MT7622_ChipCap.hif_pkt_type[HIF_TX_IDX1] = TX_DATA; - MT7622_ChipCap.hif_pkt_type[HIF_TX_IDX2] = TX_DATA; - MT7622_ChipCap.hif_pkt_type[HIF_TX_IDX3] = TX_FW_DL; - MT7622_ChipCap.hif_pkt_type[HIF_TX_IDX4] = TX_DATA; - MT7622_ChipCap.hif_pkt_type[HIF_TX_IDX5] = TX_ALTX; - MT7622_ChipCap.hif_pkt_type[HIF_TX_IDX15] = TX_CMD; -#if defined(ERR_RECOVERY) || defined(CONFIG_FWOWN_SUPPORT) - MT7622_ChipCap.int_enable_mask |= MT_McuCommand; -#endif /* ERR_RECOVERY || CONFIG_FWOWN_SUPPORT */ -#ifdef INTERNAL_CAPTURE_SUPPORT - MT7622_ChipCap.pICapDesc = MT7622_ICAP_DESC; - MT7622_ChipCap.ICapBankNum = MT7622_ICapBankNum; - MT7622_ChipCap.ICapADCIQCnt = MT7622_ICAP_FOUR_WAY_ADC_IQ_DATA_CNT; - MT7622_ChipCap.ICapIQCIQCnt = MT7622_ICAP_FOUR_WAY_IQC_IQ_DATA_CNT; - MT7622_ChipCap.ICapBankSmplCnt = MT7622_ICAP_BANK_SAMPLE_CNT; - MT7622_ChipCap.ICapFourWayADC = MT7622_CAP_FOUR_WAY_ADC; - MT7622_ChipCap.ICapFourWayFIIQ = MT7622_CAP_FOUR_WAY_FIIQ; - MT7622_ChipCap.ICapFourWayFDIQ = MT7622_CAP_FOUR_WAY_FDIQ; -#endif /* INTERNAL_CAPTURE_SUPPORT */ -#ifdef WIFI_SPECTRUM_SUPPORT - MT7622_ChipCap.pSpectrumDesc = MT7622_SPECTRUM_DESC; - MT7622_ChipCap.SpectrumBankNum = MT7622_SpectrumBankNum; - MT7622_ChipCap.SpectrumWF0ADC = MT7622_CAP_WF0_ADC; - MT7622_ChipCap.SpectrumWF1ADC = MT7622_CAP_WF1_ADC; - MT7622_ChipCap.SpectrumWF2ADC = MT7622_CAP_WF2_ADC; - MT7622_ChipCap.SpectrumWF3ADC = MT7622_CAP_WF3_ADC; - MT7622_ChipCap.SpectrumWF0FIIQ = MT7622_CAP_WF0_FIIQ; - MT7622_ChipCap.SpectrumWF1FIIQ = MT7622_CAP_WF1_FIIQ; - MT7622_ChipCap.SpectrumWF2FIIQ = MT7622_CAP_WF2_FIIQ; - MT7622_ChipCap.SpectrumWF3FIIQ = MT7622_CAP_WF3_FIIQ; - MT7622_ChipCap.SpectrumWF0FDIQ = MT7622_CAP_WF0_FDIQ; - MT7622_ChipCap.SpectrumWF1FDIQ = MT7622_CAP_WF1_FDIQ; - MT7622_ChipCap.SpectrumWF2FDIQ = MT7622_CAP_WF2_FDIQ; - MT7622_ChipCap.SpectrumWF3FDIQ = MT7622_CAP_WF3_FDIQ; -#endif /* WIFI_SPECTRUM_SUPPORT */ - MT7622_ChipCap.band_cnt = 1; -#ifdef COEX_SUPPORT - MT7622_ChipCap.TxBAWinSize = 64; -#endif /* COEX_SUPPORT*/ - MT7622_ChipCap.ba_range = mt7622_ba_range; - MT7622_ChipCap.txd_type = TXD_V1; - MT7622_ChipCap.tx_delay_support = TRUE; - - MT7622_ChipCap.asic_caps |= fASIC_CAP_ADV_SECURITY; -#ifdef OCE_SUPPORT - MT7622_ChipCap.FdFrameFwOffloadEnabled = TRUE; -#endif /* OCE_SUPPORT */ -} - -static VOID mt7622_chipOp_init(void) -{ - MT7622_ChipOp.AsicRfInit = mt7622_init_rf_cr; - MT7622_ChipOp.AsicBbpInit = MT7622BBPInit; - MT7622_ChipOp.AsicMacInit = mt7622_init_mac_cr; - MT7622_ChipOp.AsicReverseRfFromSleepMode = NULL; - MT7622_ChipOp.AsicHaltAction = NULL; - /* BBP adjust */ - MT7622_ChipOp.ChipBBPAdjust = mt7622_bbp_adjust; - /* AGC */ - MT7622_ChipOp.ChipSwitchChannel = mt7622_switch_channel; -#ifdef NEW_SET_RX_STREAM - MT7622_ChipOp.ChipSetRxStream = mt7622_set_RxStream; -#endif - MT7622_ChipOp.AsicAntennaDefaultReset = mt7622_antenna_default_reset; -#ifdef CAL_FREE_IC_SUPPORT - /* do not need, turn off compile flag, wilsonl */ - MT7622_ChipOp.is_cal_free_ic = mt7622_is_cal_free_ic; - MT7622_ChipOp.cal_free_data_get = mt7622_cal_free_data_get; -#endif /* CAL_FREE_IC_SUPPORT */ -#ifdef CARRIER_DETECTION_SUPPORT - MT7622_ChipOp.ToneRadarProgram = ToneRadarProgram_v2; -#endif - MT7622_ChipOp.DisableTxRx = NULL; /* 302 */ -#ifdef RTMP_PCI_SUPPORT - /* sync with Pat, Hammin, wilsonl */ - /* MT7622_ChipOp.AsicRadioOn = RT28xxPciAsicRadioOn; */ - /* MT7622_ChipOp.AsicRadioOff = RT28xxPciAsicRadioOff; */ -#endif -#ifdef RF_LOCKDOWN - MT7622_ChipOp.check_RF_lock_down = mt7622_check_RF_lock_down; - MT7622_ChipOp.write_RF_lock_parameter = mt7622_write_RF_lock_parameter; - MT7622_ChipOp.merge_RF_lock_parameter = mt7622_merge_RF_lock_parameter; - MT7622_ChipOp.Read_Effuse_parameter = mt7622_Read_Effuse_parameter; - MT7622_ChipOp.Config_Effuse_Country = mt7622_Config_Effuse_Country; -#endif /* RF_LOCKDOWN */ -#ifdef MT_WOW_SUPPORT - /* do not need, turn off compile flag, wilsonl */ - MT7622_ChipOp.AsicWOWEnable = MT76xxAndesWOWEnable; - MT7622_ChipOp.AsicWOWDisable = MT76xxAndesWOWDisable; - /* MT7622_ChipOp.AsicWOWInit = MT76xxAndesWOWInit, */ -#endif /* MT_WOW_SUPPORT */ - MT7622_ChipOp.show_pwr_info = NULL; - MT7622_ChipOp.bufferModeEfuseFill = mt7622_bufferModeEfuseFill; - /* For MT7622 keep efuse field only */ - MT7622_ChipOp.keep_efuse_field_only = mt7622_keep_efuse_field_only; - MT7622_ChipOp.MtCmdTx = MtCmdSendMsg; - MT7622_ChipOp.prepare_fwdl_img = mt7622_fw_prepare; - MT7622_ChipOp.fwdl_datapath_setup = mt7622_fwdl_datapath_setup; -#ifdef TXBF_SUPPORT - MT7622_ChipOp.TxBFInit = mt_WrapTxBFInit; - MT7622_ChipOp.ClientSupportsETxBF = mt_WrapClientSupportsETxBF; - MT7622_ChipOp.iBFPhaseComp = mt7622_iBFPhaseComp; - MT7622_ChipOp.iBFPhaseCalInit = mt7622_iBFPhaseCalInit; - MT7622_ChipOp.iBFPhaseFreeMem = mt7622_iBFPhaseFreeMem; - MT7622_ChipOp.iBFPhaseCalE2PUpdate = mt7622_iBFPhaseCalE2PUpdate; - MT7622_ChipOp.iBFPhaseCalReport = mt7622_iBFPhaseCalReport; - MT7622_ChipOp.setETxBFCap = mt7622_setETxBFCap; - MT7622_ChipOp.BfStaRecUpdate = mt_AsicBfStaRecUpdate; - MT7622_ChipOp.BfStaRecRelease = mt_AsicBfStaRecRelease; - MT7622_ChipOp.BfPfmuMemAlloc = CmdPfmuMemAlloc; - MT7622_ChipOp.BfPfmuMemRelease = CmdPfmuMemRelease; - MT7622_ChipOp.TxBfTxApplyCtrl = CmdTxBfTxApplyCtrl; - MT7622_ChipOp.BfApClientCluster = CmdTxBfApClientCluster; - MT7622_ChipOp.BfHwEnStatusUpdate = CmdTxBfHwEnableStatusUpdate; - MT7622_ChipOp.BfeeHwCtrl = CmdTxBfeeHwCtrl; - MT7622_ChipOp.BfModuleEnCtrl = NULL; -#endif /* TXBF_SUPPORT */ -#ifdef GREENAP_SUPPORT - MT7622_ChipOp.EnableAPMIMOPS = enable_greenap; - MT7622_ChipOp.DisableAPMIMOPS = disable_greenap; -#endif /* GREENAP_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - MT7622_ChipOp.pcie_aspm_dym_ctrl = NULL; -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ -#ifdef INTERNAL_CAPTURE_SUPPORT - MT7622_ChipOp.ICapStart = MtCmdRfTestICapStart; - MT7622_ChipOp.ICapStatus = MtCmdRfTestGen2ICapStatus; - MT7622_ChipOp.ICapCmdRawDataProc = MtCmdRfTestICapRawDataProc; - MT7622_ChipOp.ICapGetIQData = Get_RBIST_IQ_Data; - MT7622_ChipOp.ICapEventRawDataHandler = ExtEventICap96BitRawDataHandler; -#endif /* INTERNAL_CAPTURE_SUPPORT */ -#ifdef WIFI_SPECTRUM_SUPPORT - MT7622_ChipOp.SpectrumStart = MtCmdWifiSpectrumStart; - MT7622_ChipOp.SpectrumStatus = MtCmdWifiSpectrumGen2Status; - MT7622_ChipOp.SpectrumCmdRawDataProc = MtCmdWifiSpectrumRawDataProc; - MT7622_ChipOp.SpectrumEventRawDataHandler = - ExtEventWifiSpectrumRawDataHandler; -#endif /* WIFI_SPECTRUM_SUPPORT */ - MT7622_ChipOp.dma_shdl_init = mt7622_dma_shdl_init; -#ifdef SMART_CARRIER_SENSE_SUPPORT - MT7622_ChipOp.SmartCarrierSense = SmartCarrierSense_Gen3; - MT7622_ChipOp.ChipSetSCS = SetSCS; -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -#ifdef MT7622_FPGA - MT7622_ChipOp.chk_hif_default_cr_setting = - mt7622_chk_hif_default_cr_setting; - MT7622_ChipOp.chk_top_default_cr_setting = - mt7622_chk_top_default_cr_setting -#endif -#ifdef HOST_RESUME_DONE_ACK_SUPPORT - MT7622_ChipOp.HostResumeDoneAck = - mt7622_host_resume_done_ack; -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ - MT7622_ChipOp.hif_set_dma = hif_set_WPDMA; - MT7622_ChipOp.hif_wait_dma_idle = hif_wait_WPDMA_idle; - MT7622_ChipOp.hif_reset_dma = hif_reset_WPDMA; - MT7622_ChipOp.get_fw_sync_value = get_fw_sync_value; - MT7622_ChipOp.read_chl_pwr = NULL; - MT7622_ChipOp.parse_RXV_packet = parse_RXV_packet_v2; - MT7622_ChipOp.txs_handler = txs_handler_v2; - MT7622_ChipOp.driver_own = driver_own; - MT7622_ChipOp.fw_own = fw_own; -#ifdef CONFIG_PROPRIETARY_DRIVER - MT7622_ChipOp.tssi_set = mt7622_tssi_set; - MT7622_ChipOp.pa_lna_set = mt7622_pa_lna_set; -#endif /*CONFIG_PROPRIETARY_DRIVER*/ - MT7622_ChipOp.heart_beat_check = mt7622_heart_beat_check; -} - -VOID mt7622_init(RTMP_ADAPTER *pAd) -{ - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - struct _RTMP_CHIP_DBG *chip_dbg = hc_get_chip_dbg(pAd->hdev_ctrl); - struct tr_delay_control *tr_delay_ctl = &pAd->tr_ctl.tr_delay_ctl; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s()-->\n", __func__)); - mt7622_chipCap_init(); - mt7622_chipOp_init(); - NdisMoveMemory(pChipCap, &MT7622_ChipCap, sizeof(RTMP_CHIP_CAP)); - hc_register_chip_ops(pAd->hdev_ctrl, &MT7622_ChipOp); -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else - Mt7622AsicArchOpsInit(pAd); -#endif - mt7622_chip_dbg_init(chip_dbg); - mt_phy_probe(pAd); - RTMP_DRS_ALG_INIT(pAd, RATE_ALG_AGBS); - /* Following function configure beacon related parameters in pChipCap - * FlgIsSupSpecBcnBuf / BcnMaxHwNum / WcidHwRsvNum / BcnMaxHwSize / BcnBase[] - */ - /* sync with Cater, wilsonl */ - mt_chip_bcn_parameter_init(pAd); - /* sync with Cater, wilsonl */ - pChipCap->OmacNums = 5; - pChipCap->ExtMbssOmacStartIdx = 0x10; - pChipCap->RepeaterStartIdx = 0x20; -#ifdef AIR_MONITOR - pChipCap->MaxRepeaterNum = 16; -#else - pChipCap->MaxRepeaterNum = 32; -#endif /* AIR_MONITOR */ -#ifdef BCN_OFFLOAD_SUPPORT - pChipCap->fgBcnOffloadSupport = TRUE; - pChipCap->fgIsNeedPretbttIntEvent = FALSE; -#endif - /* TMR HW version */ - pChipCap->TmrHwVer = TMR_VER_2_0; - - /* For calibration log buffer size limitation issue */ - pAd->fgQAtoolBatchDumpSupport = TRUE; -#ifdef RED_SUPPORT - pAd->red_have_cr4 = FALSE; -#endif /* RED_SUPPORT */ - pAd->cp_have_cr4 = FALSE; -#ifdef CONFIG_AP_SUPPORT - /*VOW CR Address offset - Gen_2*/ - pAd->vow_gen.VOW_GEN = VOW_GEN_2; -#endif /* #ifdef CONFIG_AP_SUPPORT */ - tr_delay_ctl->ul_rx_dly_ctl_tbl = mt7622_rx_dly_ctl_ul_tbl; - tr_delay_ctl->ul_rx_dly_ctl_tbl_size = - (sizeof(mt7622_rx_dly_ctl_ul_tbl) / - sizeof(mt7622_rx_dly_ctl_ul_tbl[0])); - tr_delay_ctl->dl_rx_dly_ctl_tbl = mt7622_rx_dly_ctl_dl_tbl; - tr_delay_ctl->dl_rx_dly_ctl_tbl_size = - (sizeof(mt7622_rx_dly_ctl_dl_tbl) / - sizeof(mt7622_rx_dly_ctl_dl_tbl[0])); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<--%s()\n", __func__)); -} - -#ifdef COEX_SUPPORT -void mt7622_antenna_sel_cfg(RTMP_ADAPTER *pAd) -{ - UINT8 antCtrl = 0; - UINT8 polCtrl = 0; - UINT8 wifiConfig1, wifiConfig2, coexType, wifiPolarity1, wifiPolarity2; - UINT16 value = 0; - UCHAR wifiStreams; - - if (pAd->eeprom_type == EEPROM_EFUSE) { - /* WiFi_Config/Polarity Setting read for Antenna Selection Configuraiton*/ - rtmp_ee_efuse_read16(pAd, EFUSE_ANTENNA_CONFIG_POS1, &value); - wifiConfig1 = (UCHAR)(value & 0x00FF); - - rtmp_ee_efuse_read16(pAd, (EFUSE_ANTENNA_CONFIG_POS2 - 1), - &value); - wifiConfig2 = (UCHAR)((value >> 8) & 0x00FF); - - rtmp_ee_efuse_read16(pAd, EFUSE_ANTENNA_COEX_TYPE_POS, &value); - coexType = (UCHAR)(value & 0x00FF); - - rtmp_ee_efuse_read16(pAd, EFUSE_ANTENNA_POLARITY_POS1, &value); - wifiPolarity1 = (UCHAR)(value & 0x00FF); - wifiPolarity2 = - (UCHAR)((value >> 8) & - 0x00FF); /* EFUSE_ANTENNA_POLARITY_POS2 */ - - rtmp_ee_efuse_read16(pAd, EFUSE_ANTENNA_STREAMS_POS, &value); - wifiStreams = (UCHAR)(value & 0x00FF); - } else if (pAd->eeprom_type == EEPROM_FLASH) { - wifiConfig1 = (pAd->EEPROMImage[EFUSE_ANTENNA_CONFIG_POS1]); - wifiConfig2 = (pAd->EEPROMImage[EFUSE_ANTENNA_CONFIG_POS2]); - coexType = (pAd->EEPROMImage[EFUSE_ANTENNA_COEX_TYPE_POS]); - wifiPolarity1 = (pAd->EEPROMImage[EFUSE_ANTENNA_POLARITY_POS1]); - wifiPolarity2 = (pAd->EEPROMImage[EFUSE_ANTENNA_POLARITY_POS2]); - wifiStreams = (pAd->EEPROMImage[EFUSE_ANTENNA_STREAMS_POS]); - } - - antCtrl |= GetStreams(wifiConfig2); - antCtrl |= ((GetFEMPowerSave(wifiConfig2)) << FEM_PWR_SAV_OFFSET); - antCtrl |= ((GetGbandPaLna(wifiConfig1)) << PA_LNA_CFG_OFFSET); - antCtrl |= ((GetCoex(coexType)) << COEX_TYPE_OFFSET); - antCtrl |= ((GetSmartAntMode(wifiConfig1)) << SMART_ANT_OFFSET); - antCtrl |= ((GetPIP(wifiConfig2)) << BT_PIP_OFFSET); - polCtrl |= (GetPolTRSWN(wifiPolarity1)); - polCtrl |= ((GetPolTRSWP(wifiPolarity1)) << POLARITY_TRSW_P_OFFSET); - polCtrl |= ((GetPolLNA(wifiPolarity1)) << POLARITY_LNA_OFFSET); - polCtrl |= ((GetPolPA(wifiPolarity1)) << POLARITY_PA_OFFSET); - polCtrl |= ((GetSAntpol(wifiPolarity2)) << SMART_ANT_POLARITY_OFFSET); - polCtrl |= ((GetPIPPol(wifiPolarity2)) << BT_PIP_POLARITY_OFFSET); - polCtrl |= ((GetVLINPol(wifiPolarity2)) << VLIN_LINEARITY_OFFSET); - polCtrl |= ((GetSharedPin(wifiPolarity2)) << SHARED_PIN_OFFSET); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("read antCtrl = %d, polCtrl = %d \n", antCtrl, polCtrl)); - mt7622_pin_mux_control_setup(pAd, antCtrl, polCtrl, wifiStreams); -} - -/**************************************************************************************************************** - * Function: _mt7668_pin_mux_control_setup - * Purpose: - * 1. This function select pin mux for specified properties and used antenna pins. - ****************************************************************************************************************/ -void mt7622_pin_mux_control_setup(RTMP_ADAPTER *pAd, UCHAR antCtrl, - UCHAR polCtrl, UCHAR wifiStreams) -{ - UINT32 usedPins; - UINT32 regAonVal; - /* Get used pin. */ - usedPins = - mt7622_antsel_get_used_pin(pAd, antCtrl, polCtrl, wifiStreams); - - /* Set pin mux for ANTSEL_0, ANTSEL_1, ANTSEL_2 , ANT_SEL_3, ANT_SEL_7, ANT_SEL_8, ANT_SEL_9, ANT_SEL_10 */ - - regAonVal = mt7622_gpio_get(GPIO_GPIO_MODE9); - - if (usedPins & BIT(ANT_SEL_0)) { - regAonVal &= ~GPIO91_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO91_MODE_OFFSET) & - GPIO91_MODE); - } - if (usedPins & BIT(ANT_SEL_1)) { - regAonVal &= ~GPIO92_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO92_MODE_OFFSET) & - GPIO92_MODE); - } - if (usedPins & BIT(ANT_SEL_2)) { - regAonVal &= ~GPIO93_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO93_MODE_OFFSET) & - GPIO93_MODE); - } - if (usedPins & BIT(ANT_SEL_3)) { - regAonVal &= ~GPIO94_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO94_MODE_OFFSET) & - GPIO94_MODE); - } - - if (usedPins & BIT(ANT_SEL_7)) { - regAonVal &= ~GPIO98_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO98_MODE_OFFSET) & - GPIO98_MODE); - } - if (usedPins & BIT(ANT_SEL_8)) { - regAonVal &= ~GPIO99_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO99_MODE_OFFSET) & - GPIO99_MODE); - } - if (usedPins & BIT(ANT_SEL_9)) { - regAonVal &= ~GPIO100_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO100_MODE_OFFSET) & - GPIO100_MODE); - } - if (usedPins & BIT(ANT_SEL_10)) { - regAonVal &= ~GPIO101_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO101_MODE_OFFSET) & - GPIO101_MODE); - } - - mt7622_gpio_set(GPIO_GPIO_MODE9, regAonVal); - - /* Set pin mux for ANTSEL_4, ANTSEL_5, ANTSEL_6 */ - - regAonVal = mt7622_gpio_get(GPIO_GPIO_MODE8); - if (usedPins & BIT(ANT_SEL_4)) { - regAonVal &= ~GPIO95_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO95_MODE_OFFSET) & - GPIO95_MODE); - } - if (usedPins & BIT(ANT_SEL_5)) { - regAonVal &= ~GPIO96_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO96_MODE_OFFSET) & - GPIO96_MODE); - } - if (usedPins & BIT(ANT_SEL_6)) { - regAonVal &= ~GPIO97_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO97_MODE_OFFSET) & - GPIO97_MODE); - } - - mt7622_gpio_set(GPIO_GPIO_MODE8, regAonVal); - - /* Set pin mux for ANTSEL_12, ANTSEL_13, ANTSEL_14, ANTSEL_15, ANTSEL_26, ANTSEL_27, ANTSEL_28, ANTSEL_29 */ - - regAonVal = mt7622_gpio_get(GPIO_GPIO_MODE1); - - if (usedPins & BIT(ANT_SEL_12)) { - regAonVal &= ~GPIO73_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO73_MODE_OFFSET) & - GPIO73_MODE); - } - if (usedPins & BIT(ANT_SEL_13)) { - regAonVal &= ~GPIO74_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO74_MODE_OFFSET) & - GPIO74_MODE); - } - if (usedPins & BIT(ANT_SEL_14)) { - regAonVal &= ~GPIO75_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO75_MODE_OFFSET) & - GPIO75_MODE); - } - if (usedPins & BIT(ANT_SEL_15)) { - regAonVal &= ~GPIO76_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO76_MODE_OFFSET) & - GPIO76_MODE); - } - if (usedPins & BIT(ANT_SEL_26)) { - regAonVal &= ~GPIO18_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO18_MODE_OFFSET) & - GPIO18_MODE); - } - if (usedPins & BIT(ANT_SEL_27)) { - regAonVal &= ~GPIO19_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO19_MODE_OFFSET) & - GPIO19_MODE); - } - if (usedPins & BIT(ANT_SEL_28)) { - regAonVal &= ~GPIO20_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO20_MODE_OFFSET) & - GPIO20_MODE); - } - if (usedPins & BIT(ANT_SEL_29)) { - regAonVal &= ~GPIO21_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO21_MODE_OFFSET) & - GPIO21_MODE); - } - - mt7622_gpio_set(GPIO_GPIO_MODE1, regAonVal); - - /* Set pin mux for ANTSEL_22, ANTSEL_23, ANTSEL_17, ANTSEL_24, ANTSEL_25, ANTSEL_16 */ - regAonVal = mt7622_gpio_get(GPIO_GPIO_MODE2); - if (usedPins & BIT(ANT_SEL_22)) { - regAonVal &= ~GPIO34_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO34_MODE_OFFSET) & - GPIO34_MODE); - } - if (usedPins & BIT(ANT_SEL_23)) { - regAonVal &= ~GPIO35_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO35_MODE_OFFSET) & - GPIO35_MODE); - } - if (usedPins & BIT(ANT_SEL_17)) { - regAonVal &= ~GPIO78_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO78_MODE_OFFSET) & - GPIO78_MODE); - } - if (usedPins & BIT(ANT_SEL_24)) { - regAonVal &= ~GPIO36_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO36_MODE_OFFSET) & - GPIO36_MODE); - } - if (usedPins & BIT(ANT_SEL_25)) { - regAonVal &= ~GPIO37_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO37_MODE_OFFSET) & - GPIO37_MODE); - } - if (usedPins & BIT(ANT_SEL_16)) { - regAonVal &= ~GPIO77_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO77_MODE_OFFSET) & - GPIO77_MODE); - } - mt7622_gpio_set(GPIO_GPIO_MODE2, regAonVal); - - /* Set pin mux for ANTSEL_18, ANTSEL_19, ANTSEL_20, ANTSEL_21 */ - - regAonVal = mt7622_gpio_get(GPIO_GPIO_MODE10); - if (usedPins & BIT(ANT_SEL_18)) { - regAonVal &= ~GPIO79_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO79_MODE_OFFSET) & - GPIO79_MODE); - } - if (usedPins & BIT(ANT_SEL_19)) { - regAonVal &= ~GPIO80_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO80_MODE_OFFSET) & - GPIO80_MODE); - } - if (usedPins & BIT(ANT_SEL_20)) { - regAonVal &= ~GPIO81_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO81_MODE_OFFSET) & - GPIO81_MODE); - } - if (usedPins & BIT(ANT_SEL_21)) { - regAonVal &= ~GPIO82_MODE; - regAonVal |= ((PINMUX_FUCTION_ANTSEL << GPIO82_MODE_OFFSET) & - GPIO82_MODE); - } - - mt7622_gpio_set(GPIO_GPIO_MODE10, regAonVal); -} - -UINT32 mt7622_antsel_get_used_pin(RTMP_ADAPTER *pAd, UCHAR antCtrl, - UCHAR polCtrl, UCHAR wifiStreams) -{ - UCHAR G_bandPaLna = GetGbandPaLna(antCtrl); - UINT32 usedPins = 0; - UCHAR sharePin = GetSharePinSupport(polCtrl); - - if (G_bandPaLna) /* ePA or eLNA Enable Case */ { - switch (wifiStreams) { - case CONFIG_4x4: - /* Check 2.4G LNA. */ - if (G_bandPaLna == CONFIG_EPA_ELNA) /* ePAeLNA */ - usedPins |= USED_PIN_EPA_ELNA_4x4; - else if (G_bandPaLna == CONFIG_EPA_ILNA) /* ePAiLNA */ - usedPins |= USED_PIN_EPA_ILNA_4x4; - else if (G_bandPaLna == CONFIG_IPA_ELNA) /* iPAeLNA */ - usedPins |= USED_PIN_IPA_ELNA_4x4; - - if (!sharePin) - usedPins |= (USED_PIN_WF3_TRSW_P | - USED_PIN_WF3_TRSW_N); - - case CONFIG_3x3: - /* Check 2.4G LNA. */ - if (G_bandPaLna == CONFIG_EPA_ELNA) /* ePAeLNA */ - usedPins |= USED_PIN_EPA_ELNA_3x3; - else if (G_bandPaLna == CONFIG_EPA_ILNA) /* ePAiLNA */ - usedPins |= USED_PIN_EPA_ILNA_3x3; - else if (G_bandPaLna == CONFIG_IPA_ELNA) /* iPAeLNA */ - usedPins |= USED_PIN_IPA_ELNA_3x3; - - if (!sharePin) - usedPins |= (USED_PIN_WF2_TRSW_P | - USED_PIN_WF2_TRSW_N); - - case CONFIG_2x2: - /* Check 2.4G LNA. */ - if (G_bandPaLna == CONFIG_EPA_ELNA) /* ePAeLNA */ - usedPins |= USED_PIN_EPA_ELNA_2x2; - else if (G_bandPaLna == CONFIG_EPA_ILNA) /* ePAiLNA */ - usedPins |= USED_PIN_EPA_ILNA_2x2; - else if (G_bandPaLna == CONFIG_IPA_ELNA) /* iPAeLNA */ - usedPins |= USED_PIN_IPA_ELNA_2x2; - - if (!sharePin) - usedPins |= (USED_PIN_WF1_TRSW_P | - USED_PIN_WF1_TRSW_N); - - case CONFIG_1x1: - /* Check 2.4G LNA. */ - if (G_bandPaLna == CONFIG_EPA_ELNA) /* ePAeLNA */ - usedPins |= USED_PIN_EPA_ELNA_1x1; - else if (G_bandPaLna == CONFIG_EPA_ILNA) /* ePAiLNA */ - usedPins |= USED_PIN_EPA_ILNA_1x1; - else if (G_bandPaLna == CONFIG_IPA_ELNA) /* iPAeLNA */ - usedPins |= USED_PIN_IPA_ELNA_1x1; - - usedPins |= (USED_PIN_WF0_TRSW_P | USED_PIN_WF0_TRSW_N); - - default: - break; - } - } - return usedPins; -} - -UINT32 mt7622_gpio_get(UINT32 offset) -{ - UINT32 gpioVal; - ULONG gpioVirt; - - gpioVirt = (ULONG)ioremap(GPIO_BASE_ADDR + offset, 0x20); - gpioVal = (UINT32)ioread32((void *)gpioVirt); - iounmap((void *)gpioVirt); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("read gpioVal = %x\n", gpioVal)); - return gpioVal; -} - -void mt7622_gpio_set(UINT32 offset, UINT32 gpioVal) -{ - ULONG gpioVirt; - - gpioVirt = (ULONG)ioremap(GPIO_BASE_ADDR + offset, 0x20); - iowrite32(gpioVal, (void *)gpioVirt); - iounmap((void *)gpioVirt); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Write gpioVal = %x\n", gpioVal)); -} -#endif - -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else -INT Mt7622AsicArchOpsInit(RTMP_ADAPTER *pAd) -{ - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - arch_ops->archGetCrcErrCnt = MtAsicGetCrcErrCnt; - arch_ops->archGetCCACnt = MtAsicGetCCACnt; - arch_ops->archGetChBusyCnt = MtAsicGetChBusyCnt; - arch_ops->archSetAutoFallBack = MtAsicSetAutoFallBack; - arch_ops->archAutoFallbackInit = MtAsicAutoFallbackInit; - arch_ops->archUpdateProtect = MtAsicUpdateProtectByFw; - arch_ops->archUpdateRtsThld = MtAsicUpdateRtsThldByFw; - arch_ops->archSwitchChannel = MtAsicSwitchChannel; - arch_ops->archSetRDG = NULL; - arch_ops->archResetBBPAgent = MtAsicResetBBPAgent; - arch_ops->archSetDevMac = MtAsicSetDevMacByFw; - arch_ops->archSetBssid = MtAsicSetBssidByFw; - arch_ops->archSetStaRec = MtAsicSetStaRecByFw; - arch_ops->archUpdateStaRecBa = MtAsicUpdateStaRecBaByFw; - arch_ops->asic_rts_on_off = NULL; /* mt_asic_rts_on_off; */ -#ifdef CONFIG_AP_SUPPORT - arch_ops->archSetMbssMode = MtAsicSetMbssMode; - arch_ops->archSetMbssWdevIfAddr = MtAsicSetMbssWdevIfAddrGen2; - arch_ops->archSetMbssHwCRSetting = MtDmacSetMbssHwCRSetting; - arch_ops->archSetExtTTTTHwCRSetting = MtDmacSetExtTTTTHwCRSetting; - arch_ops->archSetExtMbssEnableCR = MtDmacSetExtMbssEnableCR; -#endif /* CONFIG_AP_SUPPORT */ - arch_ops->archDelWcidTab = MtAsicDelWcidTabByFw; -#ifdef HTC_DECRYPT_IOT - arch_ops->archSetWcidAAD_OM = MtAsicSetWcidAAD_OMByFw; -#endif /* HTC_DECRYPT_IOT */ -#ifdef MBSS_AS_WDS_AP_SUPPORT - arch_ops->archSetWcid4Addr_HdrTrans = MtAsicSetWcid4Addr_HdrTransByFw; -#endif - - arch_ops->archAddRemoveKeyTab = MtAsicAddRemoveKeyTabByFw; -#ifdef BCN_OFFLOAD_SUPPORT - /* sync with Carter, wilsonl */ - arch_ops->archEnableBeacon = NULL; - arch_ops->archDisableBeacon = NULL; - arch_ops->archUpdateBeacon = MtUpdateBcnAndTimToMcu; -#else - arch_ops->archEnableBeacon = MtDmacAsicEnableBeacon; - arch_ops->archDisableBeacon = MtDmacAsicDisableBeacon; - arch_ops->archUpdateBeacon = MtUpdateBeaconToAsic; -#endif -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - arch_ops->archSetReptFuncEnable = MtAsicSetReptFuncEnableByFw; - arch_ops->archInsertRepeaterEntry = MtAsicInsertRepeaterEntryByFw; - arch_ops->archRemoveRepeaterEntry = MtAsicRemoveRepeaterEntryByFw; - arch_ops->archInsertRepeaterRootEntry = - MtAsicInsertRepeaterRootEntryByFw; -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ - arch_ops->archSetPiggyBack = MtAsicSetPiggyBack; - arch_ops->archSetPreTbtt = NULL; /* offload to BssInfoUpdateByFw */ - arch_ops->archSetGPTimer = MtAsicSetGPTimer; - arch_ops->archSetChBusyStat = MtAsicSetChBusyStat; - arch_ops->archGetTsfTime = MtAsicGetTsfTimeByFirmware; - arch_ops->archDisableSync = NULL; /* MtAsicDisableSyncByDriver; */ - arch_ops->archSetSyncModeAndEnable = - NULL; /* MtAsicEnableBssSyncByDriver; */ - arch_ops->archSetWmmParam = MtAsicSetWmmParam; - arch_ops->archGetWmmParam = MtAsicGetWmmParam; - arch_ops->archSetEdcaParm = MtAsicSetEdcaParm; - arch_ops->archSetRetryLimit = MtAsicSetRetryLimit; - arch_ops->archGetRetryLimit = MtAsicGetRetryLimit; - arch_ops->archSetSlotTime = MtAsicSetSlotTime; - arch_ops->archGetTxTsc = MtAsicGetTxTscByDriver; - arch_ops->archAddSharedKeyEntry = MtAsicAddSharedKeyEntry; - arch_ops->archRemoveSharedKeyEntry = MtAsicRemoveSharedKeyEntry; - arch_ops->archAddPairwiseKeyEntry = MtAsicAddPairwiseKeyEntry; - arch_ops->archSetBW = MtAsicSetBW; - arch_ops->archSetCtrlCh = mt_mac_set_ctrlch; - arch_ops->archWaitMacTxRxIdle = MtAsicWaitMacTxRxIdle; -#ifdef MAC_INIT_OFFLOAD - arch_ops->archSetMacTxRx = MtAsicSetMacTxRxByFw; - arch_ops->archSetRxvFilter = MtAsicSetRxvFilter; - arch_ops->archSetMacMaxLen = NULL; - arch_ops->archSetTxStream = NULL; - arch_ops->archSetRxFilter = NULL; /* MtAsicSetRxFilter; */ -#else - arch_ops->archSetMacTxRx = MtAsicSetMacTxRx; - arch_ops->archSetMacMaxLen = MtAsicSetMacMaxLen; - arch_ops->archSetTxStream = MtAsicSetTxStream; - arch_ops->archSetRxFilter = MtAsicSetRxFilter; -#endif /*MAC_INIT_OFFLOAD*/ - arch_ops->archSetMacWD = MtAsicSetMacWD; -#ifdef MAC_APCLI_SUPPORT - arch_ops->archSetApCliBssid = MtAsicSetApCliBssid; -#endif /* MAC_APCLI_SUPPORT */ - arch_ops->archTOPInit = MtAsicTOPInit; - arch_ops->archSetTmrCR = MtSetTmrCRByFw; - arch_ops->archUpdateRxWCIDTable = MtAsicUpdateRxWCIDTableByFw; -#ifdef TXBF_SUPPORT - arch_ops->archUpdateClientBfCap = mt_AsicClientBfCap; -#endif /* TXBF_SUPPORT */ - arch_ops->archUpdateBASession = MtAsicUpdateBASessionByFw; - arch_ops->archGetTidSn = MtAsicGetTidSnByDriver; - arch_ops->archSetSMPS = MtAsicSetSMPSByDriver; - arch_ops->archRxHeaderTransCtl = MtAsicRxHeaderTransCtl; - arch_ops->archRxHeaderTaranBLCtl = MtAsicRxHeaderTaranBLCtl; - arch_ops->rx_pkt_process = mt_rx_pkt_process; - arch_ops->archSetRxStream = NULL; /* MtAsicSetRxStream; */ -#ifdef IGMP_SNOOP_SUPPORT - arch_ops->archMcastEntryInsert = MulticastFilterTableInsertEntry; - arch_ops->archMcastEntryDelete = MulticastFilterTableDeleteEntry; -#ifdef IGMP_TVM_SUPPORT - arch_ops->archMcastConfigAgeout = MulticastFilterConfigAgeOut; - arch_ops->archMcastGetMcastTable = MulticastFilterGetMcastTable; -#endif /* IGMP_TVM_SUPPORT */ -#endif - arch_ops->write_txp_info = mtd_write_txp_info_by_host; - arch_ops->write_tmac_info_fixed_rate = mtd_write_tmac_info_fixed_rate; - arch_ops->write_tmac_info = mtd_write_tmac_info_by_host; - arch_ops->write_tx_resource = mtd_pci_write_tx_resource; - arch_ops->write_frag_tx_resource = mt_pci_write_frag_tx_resource; - arch_ops->kickout_data_tx = pci_kickout_data_tx; - arch_ops->get_pkt_from_rx_resource = mtd_pci_get_pkt_from_rx_resource; - arch_ops->get_pkt_from_rx1_resource = mtd_pci_get_pkt_from_rx_resource; - arch_ops->get_resource_idx = mtd_pci_get_resource_idx; - arch_ops->get_tx_resource_free_num = pci_get_tx_resource_free_num; - arch_ops->check_hw_resource = mtd_check_hw_resource; - arch_ops->inc_resource_full_cnt = pci_inc_resource_full_cnt; - arch_ops->get_resource_state = pci_get_resource_state; - arch_ops->set_resource_state = pci_set_resource_state; - arch_ops->check_resource_state = pci_check_resource_state; - arch_ops->get_hif_buf = mt_pci_get_hif_buf; - arch_ops->hw_tx = mtd_hw_tx; - arch_ops->mlme_hw_tx = mtd_mlme_hw_tx; -#ifdef CONFIG_ATE - arch_ops->ate_hw_tx = mtd_ate_hw_tx; -#endif - arch_ops->rx_done_handle = mtd_rx_done_handle; - arch_ops->tx_dma_done_handle = mtd_tx_dma_done_handle; - arch_ops->cmd_dma_done_handle = mt_cmd_dma_done_handle; - arch_ops->fwdl_dma_done_handle = mt_fwdl_dma_done_handle; - arch_ops->hw_isr = mtd_isr; -#ifdef RED_SUPPORT - arch_ops->archRedMarkPktDrop = RedMarkPktDrop; - arch_ops->archRedRecordCP = RedRecordCP; - arch_ops->archRedEnqueueFail = RedEnqueueFail; -#endif - return TRUE; -} -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7622_dbg.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7622_dbg.c deleted file mode 100644 index 5f2ded05d1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/mt7622_dbg.c +++ /dev/null @@ -1,1672 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** -*/ - -#include "rt_config.h" -#include "chip/mt7622_cr.h" -#include "hdev/hdev.h" - -static INT pse_pg_cnt[] = { 256, 512, 512, 1024, 768, 1536, 1024, 2048, - 1280, 2560, 1536, 3072, 1792, 3584, 0, 0 }; -static EMPTY_QUEUE_INFO_T Queue_Empty_info[] = { - { "CPU Q0", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_0 }, - { "CPU Q1", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_1 }, - { "CPU Q2", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_2 }, - { "CPU Q3", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_3 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, /* 4~7 not defined */ - { "ALTX Q0", ENUM_UMAC_LMAC_PORT_2, - ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_0 }, /* Q16 */ - { "BMC Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BMC_0 }, - { "BCN Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BNC_0 }, - { "PSMP Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_0 }, - { "ALTX Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_1 }, - { "BMC Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BMC_1 }, - { "BCN Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BNC_1 }, - { "PSMP Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_1 }, - { "NAF Q", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_NAF }, - { "NBCN Q", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_NBCN }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, - { NULL, 0, 0 }, /* 18~29 not defined */ - { "RLS Q", ENUM_PLE_CTRL_PSE_PORT_3, ENUM_UMAC_PLE_CTRL_P3_Q_0X1E }, - { "RLS2 Q", ENUM_PLE_CTRL_PSE_PORT_3, ENUM_UMAC_PLE_CTRL_P3_Q_0X1F } -}; -static PCHAR sta_ctrl_reg[] = { "ENABLE", "DISABLE", "PAUSE" }; - -static INT32 chip_dump_ps_table(struct hdev_ctrl *ctrl, UINT32 ent_type, - BOOLEAN bReptCli) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - int i; - UINT32 ps_stat[4] = { 0 }; - UINT32 regValue = 0; - UINT8 bmc_cnt[4] = { 0 }; - UINT8 ext_bmc_cnt[15] = { 0 }; - - HW_IO_READ32(pAd, PLE_STATION_PAUSE0, &ps_stat[0]); - HW_IO_READ32(pAd, PLE_STATION_PAUSE1, &ps_stat[1]); - HW_IO_READ32(pAd, PLE_STATION_PAUSE2, &ps_stat[2]); - HW_IO_READ32(pAd, PLE_STATION_PAUSE3, &ps_stat[3]); - HW_IO_READ32(pAd, ARB_BMCCR0, ®Value); - bmc_cnt[0] = regValue & 0xff; - bmc_cnt[1] = (regValue & 0xff00) >> 8; - bmc_cnt[2] = (regValue & 0xff0000) >> 16; - bmc_cnt[3] = (regValue & 0xff000000) >> 24; - HW_IO_READ32(pAd, ARB_BMCCR1, ®Value); - ext_bmc_cnt[0] = regValue & 0xff; - ext_bmc_cnt[1] = (regValue & 0xff00) >> 8; - ext_bmc_cnt[2] = (regValue & 0xff0000) >> 16; - ext_bmc_cnt[3] = (regValue & 0xff000000) >> 24; - HW_IO_READ32(pAd, ARB_BMCCR2, ®Value); - ext_bmc_cnt[4] = regValue & 0xff; - ext_bmc_cnt[5] = (regValue & 0xff00) >> 8; - ext_bmc_cnt[6] = (regValue & 0xff0000) >> 16; - ext_bmc_cnt[7] = (regValue & 0xff000000) >> 24; - HW_IO_READ32(pAd, ARB_BMCCR3, ®Value); - ext_bmc_cnt[8] = regValue & 0xff; - ext_bmc_cnt[9] = (regValue & 0xff00) >> 8; - ext_bmc_cnt[10] = (regValue & 0xff0000) >> 16; - ext_bmc_cnt[11] = (regValue & 0xff000000) >> 24; - HW_IO_READ32(pAd, ARB_BMCCR4, ®Value); - ext_bmc_cnt[12] = regValue & 0xff; - ext_bmc_cnt[13] = (regValue & 0xff00) >> 8; - ext_bmc_cnt[14] = (regValue & 0xff0000) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("PS_info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%08x %08x %08x %08x\n", ps_stat[0], ps_stat[1], ps_stat[2], - ps_stat[3])); - - for (i = 0; i < 4; i++) { - if (bmc_cnt[i]) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BMC(%x)%d ", i, bmc_cnt[i])); - } - - for (i = 0; i < 15; i++) { - if (ext_bmc_cnt[i]) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BMC(%x)%d ", i + 0x11, ext_bmc_cnt[i])); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n\n")); - /* Dump PS info from FW */ - CmdExtGeneralTestAPPWS(pAd, APPWS_ACTION_DUMP_INFO); - return TRUE; -} - -static INT32 chip_show_tmac_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - UINT32 Value; - RTMP_ADAPTER *pAd = ctrl->priv; - - RTMP_IO_READ32(pAd, TMAC_TCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TX Stream = %d\n", GET_TMAC_TCR_TX_STREAM_NUM(Value) + 1)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TX RIFS Enable = %d\n", GET_TX_RIFS_EN(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RX RIFS Mode = %d\n", GET_RX_RIFS_MODE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TXOP TBTT Control = %d\n", GET_TXOP_TBTT_CONTROL(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TXOP TBTT Stop Control = %d\n", - GET_TBTT_TX_STOP_CONTROL(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TXOP Burst Stop = %d\n", GET_TXOP_BURST_STOP(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RDG Mode = %d\n", GET_RDG_RA_MODE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RDG Responser Enable = %d\n", GET_RDG_RESP_EN(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Smoothing = %d\n", GET_SMOOTHING(Value))); - RTMP_IO_READ32(pAd, TMAC_PSCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP Power Save RXPE Off Time(unit 2us) = %d\n", - GET_APS_OFF_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP Power Save RXPE On Time(unit 2us) = %d\n", - APS_ON_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP Power Save Halt Time (unit 32us) = %d\n", - GET_APS_HALT_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP Power Enable = %d\n", GET_APS_EN(Value))); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC0 TXOP = 0x%x (unit: 32us)\n", GET_AC0LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC1 TXOP = 0x%x (unit: 32us)\n", GET_AC1LIMIT(Value))); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC2 TXOP = 0x%x (unit: 32us)\n", GET_AC2LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC3 TXOP = 0x%x (unit: 32us)\n", GET_AC3LIMIT(Value))); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR3, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC10 TXOP = 0x%x (unit: 32us)\n", GET_AC10LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC11 TXOP = 0x%x (unit: 32us)\n", GET_AC11LIMIT(Value))); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR2, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC12 TXOP = 0x%x (unit: 32us)\n", GET_AC12LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC13 TXOP = 0x%x (unit: 32us)\n", GET_AC13LIMIT(Value))); - RTMP_IO_READ32(pAd, TMAC_ICR_BAND_0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("EIFS Time, Band0 (unit: 1us) = %d\n", - GET_ICR_EIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RIFS Time, Band0 (unit: 1us) = %d\n", - GET_ICR_RIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SIFS Time, Band0 (unit: 1us) = %d\n", - GET_ICR_SIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SLOT Time, Band0 (unit: 1us) = %d\n", - GET_ICR_SLOT_TIME(Value))); - RTMP_IO_READ32(pAd, TMAC_ICR_BAND_1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("EIFS Time, Band1 (unit: 1us) = %d\n", - GET_ICR_EIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RIFS Time, Band1 (unit: 1us) = %d\n", - GET_ICR_RIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SIFS Time, Band1 (unit: 1us) = %d\n", - GET_ICR_SIFS_TIME(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SLOT Time, Band1 (unit: 1us) = %d\n", - GET_ICR_SLOT_TIME(Value))); - RTMP_IO_READ32(pAd, TMAC_ATCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Aggregation Timeout (unit: 50ns) = 0x%x\n", - GET_AGG_TOUT(Value))); - return 0; -} - -static INT32 chip_show_agg_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - UINT32 Value; - RTMP_ADAPTER *pAd = ctrl->priv; - - RTMP_IO_READ32(pAd, AGG_PCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MM Protection = %d\n", GET_MM_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("GF Protection = %d\n", GET_GF_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Protection Mode = %d\n", GET_PROTECTION_MODE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BW40 Protection = %d\n", GET_BW40_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RIFS Protection = %d\n", GET_RIFS_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BW80 Protection = %d\n", GET_BW80_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BW160 Protection = %d\n", GET_BW160_PROTECTION(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ERP Protection = 0x%x\n", GET_ERP_PROTECTION(Value))); - RTMP_IO_READ32(pAd, AGG_PCR1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RTS Threshold(packet length) = 0x%x\n", - GET_RTS_THRESHOLD(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RTS PKT Nums Threshold = %d\n", - GET_RTS_PKT_NUM_THRESHOLD(Value))); - RTMP_IO_READ32(pAd, AGG_MRCR, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RTS Retry Count Limit = %d\n", - GET_RTS_RTY_CNT_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR Frame Tx Count Limit = %d\n", - GET_BAR_TX_CNT_LIMIT(Value))); - RTMP_IO_READ32(pAd, AGG_ACR0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AMPDU No BA Rule = %d\n", GET_AMPDU_NO_BA_RULE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AMPDU No BA AR Rule = %d\n", - GET_AGG_ACR_AMPDU_NO_BA_AR_RULE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR Tx Rate = 0x%x\n", GET_BAR_RATE_TX_RATE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR Tx Mode = 0x%x\n", GET_BAR_RATE_TX_MODE(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR Nsts = %d\n", GET_BAR_RATE_NSTS(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BAR STBC = %d\n", GET_BAR_RATE_STBC(Value))); - RTMP_IO_READ32(pAd, AGG_AALCR0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC0 Agg limit = %d\n", GET_AC0_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC1 Agg limit = %d\n", GET_AC1_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC2 Agg limit = %d\n", GET_AC2_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC3 Agg limit = %d\n", GET_AC3_AGG_LIMIT(Value))); - RTMP_IO_READ32(pAd, AGG_AALCR1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC10 Agg limit = %d\n", GET_AC10_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC11 Agg limit = %d\n", GET_AC11_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC12 Agg limit = %d\n", GET_AC12_AGG_LIMIT(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AC13 Agg limit = %d\n", GET_AC13_AGG_LIMIT(Value))); - RTMP_IO_READ32(pAd, AGG_AWSCR0, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize0 limit = %d\n", GET_WINSIZE0(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize1 limit = %d\n", GET_WINSIZE1(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize2 limit = %d\n", GET_WINSIZE2(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize3 limit = %d\n", GET_WINSIZE3(Value))); - RTMP_IO_READ32(pAd, AGG_AWSCR1, &Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize4 limit = %d\n", GET_WINSIZE4(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize5 limit = %d\n", GET_WINSIZE5(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize6 limit = %d\n", GET_WINSIZE6(Value))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Winsize7 limit = %d\n", GET_WINSIZE7(Value))); - return 0; -} - -static INT32 chip_dump_mib_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); -#if defined(MT7615) || defined(MT7622) - enum { bss_nums = 4 }; -#endif /* defined(MT7615) || defined(MT7622) */ - UINT32 mac_val, mac_val1, idx, band_idx = 0, band_offset = 0, - ampdu_cnt[7]; - UINT32 msdr6, msdr7, msdr8, msdr9, msdr10, msdr16, msdr17, msdr18, - msdr19, msdr20, msdr21; - UINT32 mbxsdr[bss_nums][4]; - UINT32 mbtcr[16], mbtbcr[16], mbrcr[16], mbrbcr[16]; - UINT32 btcr[bss_nums], btbcr[bss_nums], brcr[bss_nums], brbcr[bss_nums], - btdcr[bss_nums], brdcr[bss_nums]; - UINT32 mu_cnt[5]; - - for (band_idx = 0; band_idx < pChipCap->band_cnt; band_idx++) { - if (arg != NULL && band_idx != simple_strtoul(arg, 0, 10)) - continue; - - band_offset = 0x200 * band_idx; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Band %d MIB Status\n", band_idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===============================\n")); - RTMP_IO_READ32(pAd, MIB_M0SCR0 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MIB Status Control=0x%x\n", mac_val)); - RTMP_IO_READ32(pAd, MIB_M0PBSCR + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MIB Per-BSS Status Control=0x%x\n", mac_val)); - - RTMP_IO_READ32(pAd, MIB_M0SDR6 + band_offset, &msdr6); - RTMP_IO_READ32(pAd, MIB_M0SDR7 + band_offset, &msdr7); - RTMP_IO_READ32(pAd, MIB_M0SDR8 + band_offset, &msdr8); - RTMP_IO_READ32(pAd, MIB_M0SDR9 + band_offset, &msdr9); - RTMP_IO_READ32(pAd, MIB_M0SDR10 + band_offset, &msdr10); - RTMP_IO_READ32(pAd, MIB_M0SDR16 + band_offset, &msdr16); - RTMP_IO_READ32(pAd, MIB_M0SDR17 + band_offset, &msdr17); - RTMP_IO_READ32(pAd, MIB_M0SDR18 + band_offset, &msdr18); - RTMP_IO_READ32(pAd, MIB_M0SDR19 + band_offset, &msdr19); - RTMP_IO_READ32(pAd, MIB_M0SDR20 + band_offset, &msdr20); - RTMP_IO_READ32(pAd, MIB_M0SDR21 + band_offset, &msdr21); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Phy/Timing Related Counters===\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tChannelIdleCnt=0x%x\n", msdr6 & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCCA_NAV_Tx_Time=0x%x\n", msdr9 & 0xffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRx_MDRDY_CNT=0x%x\n", msdr10 & 0x3ffffff)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCCK_MDRDY_TIME=0x%x, OFDM_MDRDY_TIME=0x%x, OFDM_GREEN_MDRDY_TIME=0x%x\n", - msdr19 & 0x3ffffff, msdr20 & 0x3ffffff, - msdr21 & 0x3ffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPrim CCA Time=0x%x\n", msdr16 & 0xffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSec CCA Time=0x%x\n", msdr17 & 0xffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPrim ED Time=0x%x\n", msdr18 & 0xffffff)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Tx Related Counters(Generic)===\n")); - RTMP_IO_READ32(pAd, MIB_M0SDR0 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBeaconTxCnt=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0DR0 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx 20MHz Cnt=0x%x\n", mac_val & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx 40MHz Cnt=0x%x\n", (mac_val >> 16) & 0xffff)); - RTMP_IO_READ32(pAd, MIB_M0DR1 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx 80MHz Cnt=0x%x\n", mac_val & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx 160MHz Cnt=0x%x\n", (mac_val >> 16) & 0xffff)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===AMPDU Related Counters===\n")); - RTMP_IO_READ32(pAd, MIB_M0SDR12 + band_offset, &du_cnt[0]); - RTMP_IO_READ32(pAd, MIB_M0SDR14 + band_offset, &du_cnt[1]); - RTMP_IO_READ32(pAd, MIB_M0SDR15 + band_offset, &du_cnt[2]); - RTMP_IO_READ32(pAd, MIB_M0DR2 + band_offset, &du_cnt[3]); - RTMP_IO_READ32(pAd, MIB_M0DR3 + band_offset, &du_cnt[4]); - RTMP_IO_READ32(pAd, MIB_M0DR4 + band_offset, &du_cnt[5]); - RTMP_IO_READ32(pAd, MIB_M0DR5 + band_offset, &du_cnt[6]); - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tRx BA_Cnt=0x%x\n", ampdu_cnt[0] & 0xffff)); */ - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tTx AMPDU_Burst_Cnt=0x%x\n", (ampdu_cnt[0] >> 16 ) & 0xffff)); */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx AMPDU_Pkt_Cnt=0x%x\n", ampdu_cnt[0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx AMPDU_MPDU_Pkt_Cnt=0x%x\n", - ampdu_cnt[1] & 0xffffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAMPDU SuccessCnt=0x%x\n", - ampdu_cnt[2] & 0xffffff)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx Agg Range: \t1 \t2~5 \t6~15 \t16~22 \t23~33 \t34~49 \t50~57 \t58~64\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", - (ampdu_cnt[3]) & 0xffff, (ampdu_cnt[3] >> 16) & 0xffff, - (ampdu_cnt[4]) & 0xffff, (ampdu_cnt[4] >> 16) & 0xffff, - (ampdu_cnt[5]) & 0xffff, (ampdu_cnt[5] >> 16) & 0xffff, - (ampdu_cnt[6]) & 0xffff, - (ampdu_cnt[6] >> 16) & 0xffff)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===MU Related Counters===\n")); - MAC_IO_READ32(pAd, MIB_M0SDR34, &mu_cnt[0]); - MAC_IO_READ32(pAd, MIB_M0DR8, &mu_cnt[1]); - MAC_IO_READ32(pAd, MIB_M0DR9, &mu_cnt[2]); - MAC_IO_READ32(pAd, MIB_M0DR10, &mu_cnt[3]); - MAC_IO_READ32(pAd, MIB_M0DR11, &mu_cnt[4]); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMUBF_TX_COUNT=0x%x\n", mu_cnt[0] & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMU_TX_MPDU_COUNT(Ok+Fail)=0x%x\n", mu_cnt[1])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[2])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMU_TO_SU_PPDU_COUNT=0x%x\n", mu_cnt[3] & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[4])); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Rx Related Counters(Generic)===\n")); - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tVector Overflow Drop Cnt=0x%x\n", (msdr6 >> 16 ) & 0xffff)); */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tVector Mismacth Cnt=0x%x\n", msdr7 & 0xffff)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDelimiter Fail Cnt=0x%x\n", msdr8 & 0xffff)); - RTMP_IO_READ32(pAd, MIB_M0SDR3 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxFCSErrCnt=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0SDR4 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxFifoFullCnt=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0SDR11 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxLenMismatch=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0SDR5 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxMPDUCnt=0x%x\n", (mac_val & 0xffff))); - RTMP_IO_READ32(pAd, MIB_M0SDR29 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPFDropCnt=0x%x\n", (mac_val & 0x00ff))); - RTMP_IO_READ32(pAd, MIB_M0SDR22 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRx AMPDU Cnt=0x%x\n", mac_val)); - /* TODO: shiang-MT7615, is MIB_M0SDR23 used for Rx total byte count for all or just AMPDU only??? */ - RTMP_IO_READ32(pAd, MIB_M0SDR23 + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRx Total ByteCnt=0x%x\n", mac_val)); - } - - for (idx = 0; idx < bss_nums; idx++) { - RTMP_IO_READ32(pAd, WTBL_BTCRn + idx * 4, &btcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BTBCRn + idx * 4, &btbcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BRCRn + idx * 4, &brcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BRBCRn + idx * 4, &brbcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BTDCRn + idx * 4, &btdcr[idx]); - RTMP_IO_READ32(pAd, WTBL_BRDCRn + idx * 4, &brdcr[idx]); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Per-BSS Related Tx/Rx Counters===\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BSS Idx TxCnt/DataCnt TxByteCnt RxCnt/DataCnt RxByteCnt\n")); - - for (idx = 0; idx < bss_nums; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%d\t 0x%x/0x%x\t 0x%x \t 0x%x/0x%x \t 0x%x\n", idx, - btcr[idx], btdcr[idx], btbcr[idx], brcr[idx], - brdcr[idx], brbcr[idx])); - } - - for (idx = 0; idx < bss_nums; idx++) { - RTMP_IO_READ32(pAd, MIB_MB0SDR0 + idx * 0x10, &mbxsdr[idx][0]); - RTMP_IO_READ32(pAd, MIB_MB0SDR1 + idx * 0x10, &mbxsdr[idx][1]); - RTMP_IO_READ32(pAd, MIB_MB0SDR2 + idx * 0x10, &mbxsdr[idx][2]); - RTMP_IO_READ32(pAd, MIB_MB0SDR3 + idx * 0x10, &mbxsdr[idx][3]); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Per-MBSS Related MIB Counters===\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BSS Idx RTSTx/RetryCnt BAMissCnt AckFailCnt FrmRetry1/2/3Cnt\n")); - - for (idx = 0; idx < bss_nums; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%d:\t0x%x/0x%x 0x%x \t 0x%x \t 0x%x/0x%x/0x%x\n", - idx, mbxsdr[idx][0], (mbxsdr[idx][0] >> 16) & 0xffff, - mbxsdr[idx][1], (mbxsdr[idx][1] >> 16) & 0xffff, - mbxsdr[idx][2], (mbxsdr[idx][2] >> 16) & 0xffff, - mbxsdr[idx][3] & 0xffff)); - } - - for (idx = 0; idx < 16; idx++) { - RTMP_IO_READ32(pAd, WTBL_MBTCRn + idx * 4, &mbtcr[idx]); - RTMP_IO_READ32(pAd, WTBL_MBTBCRn + idx * 4, &mbtbcr[idx]); - RTMP_IO_READ32(pAd, WTBL_MBRCRn + idx * 4, &mbrcr[idx]); - RTMP_IO_READ32(pAd, WTBL_MBRBCRn + idx * 4, &mbrbcr[idx]); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Per-MBSS Related Tx/Rx Counters===\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MBSSIdx TxCnt TxByteCnt RxCnt RxByteCnt\n")); - - for (idx = 0; idx < 16; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%d\t 0x%x\t 0x%x \t 0x%x \t 0x%x\n", idx, mbtcr[idx], - mbtbcr[idx], mbrcr[idx], mbrbcr[idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===Dummy delimiter insertion result===\n")); - RTMP_IO_READ32(pAd, MIB_M0DR6, &mac_val); - RTMP_IO_READ32(pAd, MIB_M0DR7, &mac_val1); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Range1 = %d\t Range2 = %d\t Range3 = %d\t Range4 = %d\n", - GET_TX_DDLMT_RNG1_CNT(mac_val), - GET_TX_DDLMT_RNG2_CNT(mac_val), - GET_TX_DDLMT_RNG3_CNT(mac_val1), - GET_TX_DDLMT_RNG4_CNT(mac_val1))); -#ifdef TRACELOG_TCP_PKT - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TCP RxAck = %d\t TxData = %d", pAd->u4TcpRxAckCnt, - pAd->u4TcpTxDataCnt)); - pAd->u4TcpRxAckCnt = 0; - pAd->u4TcpTxDataCnt = 0; -#endif /* TRACELOG_TCP_PKT */ - return TRUE; -} - -static INT32 chip_show_pse_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - UINT32 pse_buf_ctrl, pg_sz, pg_num; - UINT32 pse_stat, pg_flow_ctrl[16] = { 0 }; - UINT32 fpg_cnt, ffa_cnt, fpg_head, fpg_tail; - UINT32 max_q, min_q, rsv_pg, used_pg; - INT32 i; - - HW_IO_READ32(pAd, PSE_PBUF_CTRL, &pse_buf_ctrl); - HW_IO_READ32(pAd, PSE_QUEUE_EMPTY, &pse_stat); - HW_IO_READ32(pAd, PSE_FREEPG_CNT, &pg_flow_ctrl[0]); - HW_IO_READ32(pAd, PSE_FREEPG_HEAD_TAIL, &pg_flow_ctrl[1]); - HW_IO_READ32(pAd, PSE_PG_HIF0_GROUP, &pg_flow_ctrl[2]); - HW_IO_READ32(pAd, PSE_HIF0_PG_INFO, &pg_flow_ctrl[3]); - HW_IO_READ32(pAd, PSE_PG_HIF1_GROUP, &pg_flow_ctrl[4]); - HW_IO_READ32(pAd, PSE_HIF1_PG_INFO, &pg_flow_ctrl[5]); - HW_IO_READ32(pAd, PSE_PG_CPU_GROUP, &pg_flow_ctrl[6]); - HW_IO_READ32(pAd, PSE_CPU_PG_INFO, &pg_flow_ctrl[7]); - HW_IO_READ32(pAd, PSE_PG_LMAC0_GROUP, &pg_flow_ctrl[8]); - HW_IO_READ32(pAd, PSE_LMAC0_PG_INFO, &pg_flow_ctrl[9]); - HW_IO_READ32(pAd, PSE_PG_LMAC1_GROUP, &pg_flow_ctrl[10]); - HW_IO_READ32(pAd, PSE_LMAC1_PG_INFO, &pg_flow_ctrl[11]); - HW_IO_READ32(pAd, PSE_PG_LMAC2_GROUP, &pg_flow_ctrl[12]); - HW_IO_READ32(pAd, PSE_LMAC2_PG_INFO, &pg_flow_ctrl[13]); - HW_IO_READ32(pAd, PSE_PG_PLE_GROUP, &pg_flow_ctrl[14]); - HW_IO_READ32(pAd, PSE_PLE_PG_INFO, &pg_flow_ctrl[15]); - /* Configuration Info */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PSE Configuration Info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPacket Buffer Control(0x82068014): 0x%08x\n", - pse_buf_ctrl)); - pg_sz = (pse_buf_ctrl & (0x1 << 31)) >> 31; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPage Size=%d(%d bytes per page)\n", pg_sz, - (pg_sz == 1 ? 256 : 128))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPage Offset=%d(in unit of 64KB)\n", - GET_PSE_PBUF_OFFSET(pse_buf_ctrl))); - pg_num = PSE_GET_TOTAL_PAGE_CFG(pse_buf_ctrl); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tConfigured Total Page=%d(%d pages)\n", pg_num, - (pg_num < 14 ? pse_pg_cnt[pg_num] : 0))); - pg_num = (pse_buf_ctrl & PSE_TOTAL_PAGE_NUM_MASK); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tAvailable Total Page=%d pages\n", pg_num)); - /* Page Flow Control */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PSE Page Flow Control:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFree page counter(0x82068100): 0x%08x\n", - pg_flow_ctrl[0])); - fpg_cnt = pg_flow_ctrl[0] & 0xfff; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe toal page number of free=0x%03x\n", fpg_cnt)); - ffa_cnt = (pg_flow_ctrl[0] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe free page numbers of free for all=0x%03x\n", - ffa_cnt)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFree page head and tail(0x82068104): 0x%08x\n", - pg_flow_ctrl[1])); - fpg_head = pg_flow_ctrl[1] & 0xfff; - fpg_tail = (pg_flow_ctrl[1] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe tail/head page of free page list=0x%03x/0x%03x\n", - fpg_tail, fpg_head)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of HIF0 group(0x82068110): 0x%08x\n", - pg_flow_ctrl[2])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHIF0 group page status(0x82068114): 0x%08x\n", - pg_flow_ctrl[3])); - min_q = pg_flow_ctrl[2] & 0xfff; - max_q = (pg_flow_ctrl[2] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of HIF0 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[3] & 0xfff; - used_pg = (pg_flow_ctrl[3] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of HIF0 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of HIF1 group(0x82068118): 0x%08x\n", - pg_flow_ctrl[4])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHIF1 group page status(0x8206811c): 0x%08x\n", - pg_flow_ctrl[5])); - min_q = pg_flow_ctrl[4] & 0xfff; - max_q = (pg_flow_ctrl[4] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of HIF1 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[5] & 0xfff; - used_pg = (pg_flow_ctrl[5] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of HIF1 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of CPU group(0x82068150): 0x%08x\n", - pg_flow_ctrl[6])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCPU group page status(0x82068154): 0x%08x\n", - pg_flow_ctrl[7])); - min_q = pg_flow_ctrl[6] & 0xfff; - max_q = (pg_flow_ctrl[6] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of CPU group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[7] & 0xfff; - used_pg = (pg_flow_ctrl[7] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of CPU group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of LMAC0 group(0x82068170): 0x%08x\n", - pg_flow_ctrl[8])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tLMAC0 group page status(0x82068174): 0x%08x\n", - pg_flow_ctrl[9])); - min_q = pg_flow_ctrl[8] & 0xfff; - max_q = (pg_flow_ctrl[8] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of LMAC0 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[9] & 0xfff; - used_pg = (pg_flow_ctrl[9] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of LMAC0 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of LMAC1 group(0x82068178): 0x%08x\n", - pg_flow_ctrl[10])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tLMAC1 group page status(0x8206817c): 0x%08x\n", - pg_flow_ctrl[11])); - min_q = pg_flow_ctrl[10] & 0xfff; - max_q = (pg_flow_ctrl[10] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of LMAC1 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[11] & 0xfff; - used_pg = (pg_flow_ctrl[11] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of LMAC1 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of LMAC2 group(0x82068180): 0x%08x\n", - pg_flow_ctrl[11])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tLMAC2 group page status(0x82068184): 0x%08x\n", - pg_flow_ctrl[12])); - min_q = pg_flow_ctrl[12] & 0xfff; - max_q = (pg_flow_ctrl[12] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of LMAC2 group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[13] & 0xfff; - used_pg = (pg_flow_ctrl[13] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of LMAC2 group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of PLE group(0x82068190): 0x%08x\n", - pg_flow_ctrl[14])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPLE group page status(0x82068194): 0x%08x\n", - pg_flow_ctrl[15])); - min_q = pg_flow_ctrl[14] & 0xfff; - max_q = (pg_flow_ctrl[14] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of PLE group=0x%03x/0x%03x\n", - max_q, min_q)); - rsv_pg = pg_flow_ctrl[15] & 0xfff; - used_pg = (pg_flow_ctrl[15] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of PLE group=0x%03x/0x%03x\n", - used_pg, rsv_pg)); - /* Queue Empty Status */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PSE Queue Empty Status:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tQUEUE_EMPTY(0x820680b0): 0x%08x\n", pse_stat)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tCPU Q0/1/2/3 empty=%d/%d/%d/%d\n", pse_stat & 0x1, - ((pse_stat & 0x2) >> 1), ((pse_stat & 0x4) >> 2), - ((pse_stat & 0x8) >> 3))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHIF Q0/1 empty=%d/%d\n", - ((pse_stat & (0x1 << 16)) >> 16), - ((pse_stat & (0x1 << 17)) >> 17))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tLMAC TX Q empty=%d\n", - ((pse_stat & (0x1 << 24)) >> 24))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tRLS_Q empty=%d\n", ((pse_stat & (0x1 << 31)) >> 31))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Nonempty Q info:\n")); - - for (i = 0; i < 31; i++) { - if (((pse_stat & (0x1 << i)) >> i) == 0) { - UINT32 hfid, tfid, pktcnt, fl_que_ctrl[3] = { 0 }; - - if (i < 4) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tCPU Q%d: ", i)); - fl_que_ctrl[0] |= (0x1 << 14); - fl_que_ctrl[0] |= (i << 8); - } else if (i == 16) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tHIF Q0: ")); - fl_que_ctrl[0] |= (0x0 << 14); - fl_que_ctrl[0] |= (0x0 << 8); - } else if (i == 17) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tHIF Q1: ")); - fl_que_ctrl[0] |= (0x0 << 14); - fl_que_ctrl[0] |= (0x1 << 8); - } else if (i == 24) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tLMAC TX Q: ")); - fl_que_ctrl[0] |= (0x2 << 14); - fl_que_ctrl[0] |= (0x0 << 8); - } else if (i == 31) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("\tRLS Q: ")); - fl_que_ctrl[0] |= (0x3 << 14); - fl_que_ctrl[0] |= (i << 8); - } else - continue; - - fl_que_ctrl[0] |= (0x1 << 31); - HW_IO_WRITE32(pAd, PSE_FL_QUE_CTRL_0, fl_que_ctrl[0]); - HW_IO_READ32(pAd, PSE_FL_QUE_CTRL_2, &fl_que_ctrl[1]); - HW_IO_READ32(pAd, PSE_FL_QUE_CTRL_3, &fl_que_ctrl[2]); - hfid = fl_que_ctrl[1] & 0xfff; - tfid = (fl_que_ctrl[1] & 0xfff << 16) >> 16; - pktcnt = fl_que_ctrl[2] & 0xfff; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("tail/head fid = 0x%03x/0x%03x, pkt cnt = %x\n", - tfid, hfid, pktcnt)); - } - } - - return TRUE; -} - -static INT32 chip_show_protect_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - UINT32 val; - RTMP_ADAPTER *pAd = ctrl->priv; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, (" -Proetction\n")); - RTMP_IO_READ32(pAd, AGG_PCR, &val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" > AGG_PCR 0x%08x\n", val)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" -RTS Threshold\n")); - RTMP_IO_READ32(pAd, AGG_PCR1, &val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" > AGG_PCR1 0x%08x\n", val)); - return TRUE; -} - -static INT32 chip_show_cca_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - UINT32 val; - RTMP_ADAPTER *pAd = ctrl->priv; - - MAC_IO_READ32(pAd, RMAC_DEBUG_CR, &val); - val |= (1 << 31); /* For Band0 */ - MAC_IO_WRITE32(pAd, RMAC_DEBUG_CR, val); - /* Debug CR */ - MAC_IO_WRITE32(pAd, (WF_CFG_OFF_BASE + 0x2c), 0xf); - MAC_IO_WRITE32(pAd, (WF_CFG_BASE + 0x14), 0x1f); - MAC_IO_WRITE32(pAd, (WF_CFG_BASE + 0x18), 0x06060606); - MAC_IO_WRITE32(pAd, (WF_CFG_BASE + 0x4c), 0x1c1c1d1d); - MAC_IO_READ32(pAd, (WF_CFG_BASE + 0x24), &val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CCA for BAND0 info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-- CCA Prim: %d, SE20: %d, SEC40: %d\n", - ((val & (1 << 14)) >> 14), ((val & (1 << 6)) >> 6), - ((val & (1 << 5)) >> 5))); - MAC_IO_READ32(pAd, RMAC_DEBUG_CR, &val); - val &= ~(1 << 31); /* For Band1 */ - MAC_IO_WRITE32(pAd, RMAC_DEBUG_CR, val); - MAC_IO_READ32(pAd, (WF_CFG_BASE + 0x24), &val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CCA for BAND1 info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-- CCA Prim: %d, SE20: %d, SEC40: %d\n", - ((val & (1 << 14)) >> 14), ((val & (1 << 6)) >> 6), - ((val & (1 << 5)) >> 5))); - return 0; -} - -static INT32 chip_set_cca_en(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - BOOLEAN enable; - UINT32 val; - RTMP_ADAPTER *pAd = ctrl->priv; - - enable = os_str_tol(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Enable CCA on Band0 SEC40: %s\n", (enable) ? "ON" : "OFF")); - /* RF CR for BAND0 CCA */ - PHY_IO_READ32(pAd, PHY_BAND0_PHY_CCA, &val); - val |= ((1 << 18) | (1 << 2)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-- Force Mode: %d, Force CCA SEC40: %d [0x%08x]\n", - ((val & (1 << 18)) >> 18), ((val & (1 << 2)) >> 2), val)); - PHY_IO_WRITE32(pAd, PHY_BAND0_PHY_CCA, val); - /* TMAC_TCR for the normal Tx BW */ - MAC_IO_READ32(pAd, TMAC_TCR, &val); - val &= ~(PRE_RTS_IDLE_DET_DIS); - val |= DCH_DET_DIS; - MAC_IO_WRITE32(pAd, TMAC_TCR, val); - return TRUE; -} - -static INT32 chip_show_dmasch_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - UINT32 value; - UINT32 ple_pkt_max_sz; - UINT32 pse_pkt_max_sz; - UINT32 max_quota; - UINT32 min_quota; - UINT32 rsv_cnt; - UINT32 src_cnt; - UINT32 pse_rsv_cnt = 0; - UINT32 pse_src_cnt = 0; - UINT32 odd_group_pktin_cnt = 0; - UINT32 odd_group_ask_cnt = 0; - UINT32 pktin_cnt; - UINT32 ask_cnt; - UINT32 total_src_cnt = 0; - UINT32 total_rsv_cnt = 0; - UINT32 ffa_cnt; - UINT32 free_pg_cnt; - UINT32 Group_Mapping_Q[16] = { 0 }; - UINT32 qmapping_addr = MT_HIF_DMASHDL_Q_MAP0; - UINT32 status_addr = MT_HIF_DMASHDL_STATUS_RD_GP0; - UINT32 quota_addr = MT_HIF_DMASHDL_GROUP0_CTRL; - UINT32 pkt_cnt_addr = MT_HIF_DMASHDLRD_GP_PKT_CNT_0; - UINT32 mapping_mask = 0xf; - UINT32 mapping_offset = 0; - UINT32 mapping_qidx; - UINT32 groupidx = 0; - UINT8 idx = 0; - BOOLEAN pktin_int_refill_ena; - BOOLEAN pdma_add_int_refill_ena; - BOOLEAN ple_add_int_refill_ena; - BOOLEAN ple_sub_ena; - BOOLEAN hif_ask_sub_ena; - BOOLEAN ple_txd_gt_max_size_flag_clr; - UINT32 ple_rpg_hif; - UINT32 ple_upg_hif; - UINT32 pse_rpg_hif = 0; - UINT32 pse_upg_hif = 0; - UCHAR is_mismatch = FALSE; - - for (mapping_qidx = 0; mapping_qidx < 32; mapping_qidx++) { - UINT32 mapping_group; - - idx = 0; - - if (mapping_qidx == 0) { - qmapping_addr = MT_HIF_DMASHDL_Q_MAP0; - mapping_mask = 0xf; - mapping_offset = 0; - } else if ((mapping_qidx % 8) == 0) { - qmapping_addr += 0x4; - mapping_mask = 0xf; - mapping_offset = 0; - } else { - mapping_offset += 4; - mapping_mask = 0xf << mapping_offset; - } - - HIF_DMASHDL_IO_READ32(pAd, qmapping_addr, &value); - mapping_group = (value & mapping_mask) >> mapping_offset; - Group_Mapping_Q[mapping_group] |= 1 << mapping_qidx; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dma scheduler info:\n")); - HIF_DMASHDL_IO_READ32(pAd, MT_HIF_DMASHDL_CTRL_SIGNAL, &value); - pktin_int_refill_ena = - (value & DMASHDL_PKTIN_INT_REFILL_ENA) ? TRUE : FALSE; - pdma_add_int_refill_ena = - (value & DMASHDL_PDMA_ADD_INT_REFILL_ENA) ? TRUE : FALSE; - ple_add_int_refill_ena = - (value & DMASHDL_PLE_ADD_INT_REFILL_ENA) ? TRUE : FALSE; - ple_sub_ena = (value & DMASHDL_PLE_SUB_ENA) ? TRUE : FALSE; - hif_ask_sub_ena = (value & DMASHDL_HIF_ASK_SUB_ENA) ? TRUE : FALSE; - ple_txd_gt_max_size_flag_clr = - (value & DMASHDL_PLE_TXD_GT_MAX_SIZE_FLAG_CLR) ? TRUE : FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("DMASHDL Ctrl Signal(0x5000A018): 0x%08x\n", value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tple_txd_gt_max_size_flag_clr(BIT0) = %d\n", - ple_txd_gt_max_size_flag_clr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\thif_ask_sub_ena(BIT16) = %d\n", hif_ask_sub_ena)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tple_sub_ena(BIT17) = %d\n", ple_sub_ena)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tple_add_int_refill_ena(BIT29) = %d\n", - ple_add_int_refill_ena)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpdma_add_int_refill_ena(BIT30) = %d\n", - pdma_add_int_refill_ena)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpktin_int_refill(BIT31)_ena = %d\n", - pktin_int_refill_ena)); - HIF_DMASHDL_IO_READ32(pAd, MT_HIF_DMASHDL_PKT_MAX_SIZE, &value); - ple_pkt_max_sz = GET_PLE_PKT_MAX_SIZE_NUM(value); - pse_pkt_max_sz = GET_PSE_PKT_MAX_SIZE_NUM(value); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("DMASHDL Packet_max_size(0x5000A01c): 0x%08x\n", value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PLE/PSE packet max size=0x%03x/0x%03x\n", ple_pkt_max_sz, - pse_pkt_max_sz)); - HIF_DMASHDL_IO_READ32(pAd, MT_HIF_DMASHDL_ERROR_FLAG_CTRL, &value); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("DMASHDL ERR FLAG CTRL(0x5000A09c): 0x%08x\n", value)); - HIF_DMASHDL_IO_READ32(pAd, MT_HIF_DMASHDL_STATUS_RD, &value); - ffa_cnt = (value & DMASHDL_FFA_CNT_MASK) >> DMASHDL_FFA_CNT_OFFSET; - free_pg_cnt = (value & DMASHDL_FREE_PG_CNT_MASK) >> - DMASHDL_FREE_PG_CNT_OFFSET; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("DMASHDL Status_RD(0x5000A100): 0x%08x\n", value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("free page cnt = 0x%03x, ffa cnt = 0x%03x\n", free_pg_cnt, - ffa_cnt)); - - for (groupidx = 0; groupidx < 16; groupidx++) { - idx = 0; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Group %d info:", groupidx)); - HIF_DMASHDL_IO_READ32(pAd, status_addr, &value); - rsv_cnt = (value & DMASHDL_RSV_CNT_MASK) >> - DMASHDL_RSV_CNT_OFFSET; - src_cnt = (value & DMASHDL_SRC_CNT_MASK) >> - DMASHDL_SRC_CNT_OFFSET; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tDMASHDL Status_RD_GP%d(0x%08x): 0x%08x\n", - groupidx, status_addr, value)); - HIF_DMASHDL_IO_READ32(pAd, quota_addr, &value); - max_quota = (value & DMASHDL_MAX_QUOTA_MASK) >> - DMASHDL_MAX_QUOTA_OFFSET; - min_quota = (value & DMASHDL_MIN_QUOTA_MASK) >> - DMASHDL_MIN_QUOTA_OFFSET; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tDMASHDL Group%d control(0x%08x): 0x%08x\n", - groupidx, quota_addr, value)); - - if ((groupidx & 0x1) == 0) { - HIF_DMASHDL_IO_READ32(pAd, pkt_cnt_addr, &value); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tDMASHDL RD_group_pkt_cnt_%d(0x%08x): 0x%08x\n", - groupidx / 2, pkt_cnt_addr, value)); - odd_group_pktin_cnt = GET_ODD_GROUP_PKT_IN_CNT(value); - odd_group_ask_cnt = GET_ODD_GROUP_ASK_CNT(value); - pktin_cnt = GET_EVEN_GROUP_PKT_IN_CNT(value); - ask_cnt = GET_EVEN_GROUP_ASK_CNT(value); - } else { - pktin_cnt = odd_group_pktin_cnt; - ask_cnt = odd_group_ask_cnt; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\trsv_cnt = 0x%03x, src_cnt = 0x%03x\n", rsv_cnt, - src_cnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tmax/min quota = 0x%03x/ 0x%03x\n", max_quota, - min_quota)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpktin_cnt = 0x%02x, ask_cnt = 0x%02x", pktin_cnt, - ask_cnt)); - - if (hif_ask_sub_ena && pktin_cnt != ask_cnt) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", mismatch!")); - is_mismatch = TRUE; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - - if (groupidx == 15 && - Group_Mapping_Q[groupidx] == 0) { /* Group15 is for PSE */ - pse_src_cnt = src_cnt; - pse_rsv_cnt = rsv_cnt; - break; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMapping Qidx:")); - - while (Group_Mapping_Q[groupidx] != 0) { - if (Group_Mapping_Q[groupidx] & 0x1) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("Q%d ", idx)); - - Group_Mapping_Q[groupidx] >>= 1; - idx++; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - total_src_cnt += src_cnt; - total_rsv_cnt += rsv_cnt; - status_addr = status_addr + 4; - quota_addr = quota_addr + 4; - - if (groupidx & 0x1) - pkt_cnt_addr = pkt_cnt_addr + 4; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nCounter Check:\n")); - MAC_IO_READ32(pAd, PLE_HIF_PG_INFO, &value); - ple_rpg_hif = value & 0xfff; - ple_upg_hif = (value & (0xfff << 16)) >> 16; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PLE:\n\tThe used/reserved pages of PLE HIF group=0x%03x/0x%03x\n", - ple_upg_hif, ple_rpg_hif)); - MAC_IO_READ32(pAd, PSE_HIF1_PG_INFO, &value); - pse_rpg_hif = value & 0xfff; - pse_upg_hif = (value & (0xfff << 16)) >> 16; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PSE:\n\tThe used/reserved pages of PSE HIF group=0x%03x/0x%03x\n", - pse_upg_hif, pse_rpg_hif)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("DMASHDL:\n\tThe total used pages of group0~14=0x%03x", - total_src_cnt)); - - if (ple_upg_hif != total_src_cnt) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", mismatch!")); - is_mismatch = TRUE; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tThe total reserved pages of group0~14=0x%03x\n", - total_rsv_cnt)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tThe total ffa pages of group0~14=0x%03x\n", ffa_cnt)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tThe total free pages of group0~14=0x%03x", free_pg_cnt)); - - if (free_pg_cnt != total_rsv_cnt + ffa_cnt) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", mismatch(total_rsv_cnt + ffa_cnt in DMASHDL)")); - is_mismatch = TRUE; - } - - if (free_pg_cnt != ple_rpg_hif) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", mismatch(reserved pages in PLE)")); - is_mismatch = TRUE; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tThe used pages of group15=0x%03x", pse_src_cnt)); - - if (pse_upg_hif != pse_src_cnt) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", mismatch!")); - is_mismatch = TRUE; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tThe reserved pages of group15=0x%03x", pse_rsv_cnt)); - - if (pse_rpg_hif != pse_rsv_cnt) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", mismatch!")); - is_mismatch = TRUE; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - - if (!is_mismatch) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("DMASHDL: no counter mismatch\n")); - - return TRUE; -} - -static VOID chip_show_bcn_info(struct hdev_ctrl *ctrl, UCHAR bandidx) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - UINT32 mac_val; - UINT32 addr; - UINT32 idx; - UINT32 band_offset = 0x200 * bandidx; - struct _RTMP_CHIP_DBG *chip_dbg = hc_get_chip_dbg(ctrl); - - if (chip_dbg->dump_mib_info) { - if (bandidx == DBDC_BAND0) - chip_dbg->dump_mib_info(pAd->hdev_ctrl, "0"); - else - chip_dbg->dump_mib_info(pAd->hdev_ctrl, "1"); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - show_trinfo_proc(pAd, ""); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - ShowPLEInfo(pAd, NULL); -#ifdef ERR_RECOVERY - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - ShowSerProc2(pAd, ""); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - show_swqinfo(pAd, ""); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - if (chip_dbg->show_pse_info) - chip_dbg->show_pse_info(pAd->hdev_ctrl, NULL); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - show_tpinfo_proc(pAd, NULL); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - Show_MibBucket_Proc(pAd, ""); - MAC_IO_READ32(pAd, ARB_BFCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ARB_BFCR(0x820f3190)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, ARB_SCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ARB_SCR(0x820f3080)=0x%08x\n", mac_val)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("dump 0x820f3100~0x820f3154:\n")); - - for (addr = ARB_TQSW0; addr <= ARB_TQPM1; addr = addr + 4) { - if ((addr & 0xf) == 0 && (addr != ARB_TQSW0)) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - MAC_IO_READ32(pAd, addr, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr 0x%05x=0x%08x ", addr, mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MAC_IO_READ32(pAd, ARB_BFCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ARB_BFCR(0x820f3190)=0x%08x\n", mac_val)); - /* (WF_LP) Debug CRs */ - MAC_IO_READ32(pAd, LPON_T0STR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LPON_T0STR(0x820fb028)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, LPON_PISR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LPON_PISR(0x820fb030)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, LPON_T0TPCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LPON_T0TPCR(0x820fb34)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, LPON_MPTCR0, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LPON_MPTCR0(0x820fb05c)=0x%08x\n", mac_val)); - /* (WF_INT_WAKEUP) Interrupt CRs */ - MAC_IO_READ32(pAd, WISR0, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WISR0(0x820fc000)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, WIER0, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WIER0(0x820fc008)=0x%08x\n", mac_val)); - /* (UMAC) CR used to record SER status */ - MAC_IO_READ32(pAd, PSE_SPARE_DUMMY_CR1, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SER PSE Error INT status(0x820681e4)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, PSE_SPARE_DUMMY_CR2, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SER PLE Error INT status(0x820681e8)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, PSE_SPARE_DUMMY_CR3, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("SER LMAC WDT status(0x820682e8)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, PP_SPARE_DUMMY_CR5, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CritialErrorRecord0(0x8206c064)=0x%08x\n", mac_val)); - MAC_IO_READ32(pAd, PP_SPARE_DUMMY_CR6, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CritialErrorRecord1(0x8206c068)=0x%08x\n", mac_val)); - -#define CR4_HEART_BEAT_STS 0x80200 - MAC_IO_READ32(pAd, CR4_HEART_BEAT_STS, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CR4 heart beat status (0x80200)=0x%08x\n", mac_val)); - MtCmdFwLog2Host(pAd, 1, 0); - MAC_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RO_BAND0_PHYCTRL_STS(0x%08x)= 0x%08x\n", - 0x82070230 + band_offset, mac_val)); - /* 0x82070618~0x8207065c */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("dump 0x%08x~0x%08x:\n", 0x82070618 + band_offset, - 0x8207065c + band_offset)); - - for (addr = PHY_BAND0_PHYMUX_6; addr <= PHY_BAND0_PHYMUX_23; - addr = addr + 4) { - if ((addr & 0xf) == 8 && (addr != PHY_BAND0_PHYMUX_6)) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - MAC_IO_READ32(pAd, addr + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr 0x%05x=0x%08x ", addr, mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - /* 0x8207227c~0x82072294 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("dump 0x%08x~0x%08x:\n", 0x8207227c + band_offset, - 0x82072294 + band_offset)); - - for (addr = RO_BAND0_RXTD_DEBUG0; addr <= RO_BAND0_RXTD_DEBUG6; - addr = addr + 4) { - if (addr == RO_BAND0_RXTD_DEBUG4) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - MAC_IO_READ32(pAd, addr + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr 0x%05x=0x%08x ", addr, mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - /* 0x820721a0~0x820721b8 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("dump 0x%08x~0x%08x:\n", 0x820721a0 + band_offset, - 0x820721b8 + band_offset)); - - for (addr = RO_BAND0_AGC_DEBUG_0; addr <= RO_BAND0_AGC_DEBUG_6; - addr = addr + 4) { - if (addr == RO_BAND0_AGC_DEBUG_4) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - - MAC_IO_READ32(pAd, addr + band_offset, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("addr 0x%05x=0x%08x ", addr, mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - /* - - Write 0x82070614[22:20]=0 - Write 0x82070614[22:20]=5 - - // read the following registers by 10 times - 0X8207_020C - 0x8207_0210 - 0x8207_0214 - 0x8207_021C - 0x8207_0220 - // End of Loop - - */ - MAC_IO_READ32(pAd, PHY_BAND0_PHYMUX_5 + band_offset, &mac_val); - mac_val &= ~(BITS(20, 22)); - MAC_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5 + band_offset, mac_val); - MAC_IO_READ32(pAd, PHY_BAND0_PHYMUX_5 + band_offset, &mac_val); - mac_val &= ~(BITS(20, 22)); - mac_val |= (BIT(20) | BIT(22)); - MAC_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5 + band_offset, mac_val); - - for (idx = 0; idx < 10; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("loop %d:\n", idx)); - - MAC_IO_READ32(pAd, ARB_BFCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tARB_BFCR(0x820f3190)=0x%08x\n", mac_val)); - - MAC_IO_READ32(pAd, AGG_SCR, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAGG_SCR(0x820F20FC)=0x%08x\n", mac_val)); - - /* DMA debug register */ - MAC_IO_READ32(pAd, DMA_DBG_00, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDMA_DBG_00(0x820F70D0)=0x%08x\n", mac_val)); - - MAC_IO_READ32(pAd, DMA_DBG_01, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDMA_DBG_01(0x820F70D4)=0x%08x\n", mac_val)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); -} - -static INT32 chip_show_ple_info(struct hdev_ctrl *ctrl, RTMP_STRING *arg) -{ - RTMP_ADAPTER *pAd = ctrl->priv; - UINT32 ple_buf_ctrl[3] = { 0 }, pg_sz, pg_num, bit_field_1, bit_field_2; - UINT32 ple_stat[17] = { 0 }, pg_flow_ctrl[6] = { 0 }; - UINT32 sta_pause[4] = { 0 }, dis_sta_map[4] = { 0 }; - UINT32 fpg_cnt, ffa_cnt, fpg_head, fpg_tail, hif_max_q, hif_min_q; - UINT32 rpg_hif, upg_hif, cpu_max_q, cpu_min_q, rpg_cpu, upg_cpu; - INT32 i, j; - UINT32 dumptxd = 0; - - if (arg != NULL) - dumptxd = os_str_toul(arg, 0, 16); - - HW_IO_READ32(pAd, PLE_PBUF_CTRL, &ple_buf_ctrl[0]); - HW_IO_READ32(pAd, PLE_RELEASE_CTRL, &ple_buf_ctrl[1]); - HW_IO_READ32(pAd, PLE_HIF_REPORT, &ple_buf_ctrl[2]); - HW_IO_READ32(pAd, PLE_QUEUE_EMPTY, &ple_stat[0]); - HW_IO_READ32(pAd, PLE_AC0_QUEUE_EMPTY_0, &ple_stat[1]); - HW_IO_READ32(pAd, PLE_AC0_QUEUE_EMPTY_1, &ple_stat[2]); - HW_IO_READ32(pAd, PLE_AC0_QUEUE_EMPTY_2, &ple_stat[3]); - HW_IO_READ32(pAd, PLE_AC0_QUEUE_EMPTY_3, &ple_stat[4]); - HW_IO_READ32(pAd, PLE_AC1_QUEUE_EMPTY_0, &ple_stat[5]); - HW_IO_READ32(pAd, PLE_AC1_QUEUE_EMPTY_1, &ple_stat[6]); - HW_IO_READ32(pAd, PLE_AC1_QUEUE_EMPTY_2, &ple_stat[7]); - HW_IO_READ32(pAd, PLE_AC1_QUEUE_EMPTY_3, &ple_stat[8]); - HW_IO_READ32(pAd, PLE_AC2_QUEUE_EMPTY_0, &ple_stat[9]); - HW_IO_READ32(pAd, PLE_AC2_QUEUE_EMPTY_1, &ple_stat[10]); - HW_IO_READ32(pAd, PLE_AC2_QUEUE_EMPTY_2, &ple_stat[11]); - HW_IO_READ32(pAd, PLE_AC2_QUEUE_EMPTY_3, &ple_stat[12]); - HW_IO_READ32(pAd, PLE_AC3_QUEUE_EMPTY_0, &ple_stat[13]); - HW_IO_READ32(pAd, PLE_AC3_QUEUE_EMPTY_1, &ple_stat[14]); - HW_IO_READ32(pAd, PLE_AC3_QUEUE_EMPTY_2, &ple_stat[15]); - HW_IO_READ32(pAd, PLE_AC3_QUEUE_EMPTY_3, &ple_stat[16]); - HW_IO_READ32(pAd, PLE_FREEPG_CNT, &pg_flow_ctrl[0]); - HW_IO_READ32(pAd, PLE_FREEPG_HEAD_TAIL, &pg_flow_ctrl[1]); - HW_IO_READ32(pAd, PLE_PG_HIF_GROUP, &pg_flow_ctrl[2]); - HW_IO_READ32(pAd, PLE_HIF_PG_INFO, &pg_flow_ctrl[3]); - HW_IO_READ32(pAd, PLE_PG_CPU_GROUP, &pg_flow_ctrl[4]); - HW_IO_READ32(pAd, PLE_CPU_PG_INFO, &pg_flow_ctrl[5]); - HW_IO_READ32(pAd, DIS_STA_MAP0, &dis_sta_map[0]); - HW_IO_READ32(pAd, DIS_STA_MAP1, &dis_sta_map[1]); - HW_IO_READ32(pAd, DIS_STA_MAP2, &dis_sta_map[2]); - HW_IO_READ32(pAd, DIS_STA_MAP3, &dis_sta_map[3]); - HW_IO_READ32(pAd, STATION_PAUSE0, &sta_pause[0]); - HW_IO_READ32(pAd, STATION_PAUSE1, &sta_pause[1]); - HW_IO_READ32(pAd, STATION_PAUSE2, &sta_pause[2]); - HW_IO_READ32(pAd, STATION_PAUSE3, &sta_pause[3]); - /* Configuration Info */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PLE Configuration Info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPacket Buffer Control(0x82060014): 0x%08x\n", - ple_buf_ctrl[0])); - pg_sz = (ple_buf_ctrl[0] & (0x1 << 31)) >> 31; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPage Size=%d(%d bytes per page)\n", pg_sz, - (pg_sz == 1 ? 128 : 64))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPage Offset=%d(in unit of 16KB)\n", - (ple_buf_ctrl[0] & (0xf << 20)) >> 20)); - pg_num = (ple_buf_ctrl[0] & 0xfff); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTotal Page=%d pages\n", (ple_buf_ctrl[0] & 0xfff))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRelease Control(0x82060030): 0x%08x\n", ple_buf_ctrl[1])); - bit_field_1 = (ple_buf_ctrl[1] & 0x1f); - bit_field_2 = ((ple_buf_ctrl[1] & (0x3 << 6)) >> 6); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNormalTx Release Pid/Qid=%d/%d\n", bit_field_2, - bit_field_1)); - bit_field_1 = ((ple_buf_ctrl[1] & (0x1f << 8)) >> 8); - bit_field_2 = ((ple_buf_ctrl[1] & (0x3 << 14)) >> 14); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tDropTx Release Pid/Qid=%d/%d\n", bit_field_2, - bit_field_1)); - bit_field_1 = ((ple_buf_ctrl[1] & (0x1f << 16)) >> 16); - bit_field_2 = ((ple_buf_ctrl[1] & (0x3 << 22)) >> 22); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBCN0 Release Pid/Qid=%d/%d\n", bit_field_2, - bit_field_1)); - bit_field_1 = ((ple_buf_ctrl[1] & (0x1f << 24)) >> 24); - bit_field_2 = ((ple_buf_ctrl[1] & (0x3 << 30)) >> 30); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBCN1 Release Pid/Qid=%d/%d\n", bit_field_2, - bit_field_1)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHIF Report Control(0x82060034): 0x%08x\n", - ple_buf_ctrl[2])); - bit_field_1 = ((ple_buf_ctrl[2] & (0x1 << 1)) >> 1); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHostReportQSel/HostReportDisable=%d/%d\n", - (ple_buf_ctrl[2] & 0x1), bit_field_1)); - /* Page Flow Control */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PLE Page Flow Control:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFree page counter(0x82060100): 0x%08x\n", - pg_flow_ctrl[0])); - fpg_cnt = pg_flow_ctrl[0] & 0xfff; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe toal page number of free=0x%03x\n", fpg_cnt)); - ffa_cnt = (pg_flow_ctrl[0] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe free page numbers of free for all=0x%03x\n", - ffa_cnt)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFree page head and tail(0x82060104): 0x%08x\n", - pg_flow_ctrl[1])); - fpg_head = pg_flow_ctrl[1] & 0xfff; - fpg_tail = (pg_flow_ctrl[1] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe tail/head page of free page list=0x%03x/0x%03x\n", - fpg_tail, fpg_head)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of HIF group(0x82060110): 0x%08x\n", - pg_flow_ctrl[2])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHIF group page status(0x82060114): 0x%08x\n", - pg_flow_ctrl[3])); - hif_min_q = pg_flow_ctrl[2] & 0xfff; - hif_max_q = (pg_flow_ctrl[2] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of HIF group=0x%03x/0x%03x\n", - hif_max_q, hif_min_q)); - rpg_hif = pg_flow_ctrl[3] & 0xfff; - upg_hif = (pg_flow_ctrl[3] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of HIF group=0x%03x/0x%03x\n", - upg_hif, rpg_hif)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tReserved page counter of CPU group(0x82060150): 0x%08x\n", - pg_flow_ctrl[4])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCPU group page status(0x82060154): 0x%08x\n", - pg_flow_ctrl[5])); - cpu_min_q = pg_flow_ctrl[4] & 0xfff; - cpu_max_q = (pg_flow_ctrl[4] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe max/min quota pages of CPU group=0x%03x/0x%03x\n", - cpu_max_q, cpu_min_q)); - rpg_cpu = pg_flow_ctrl[5] & 0xfff; - upg_cpu = (pg_flow_ctrl[5] & (0xfff << 16)) >> 16; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tThe used/reserved pages of CPU group=0x%03x/0x%03x\n", - upg_cpu, rpg_cpu)); - - if (((ple_stat[0] & (0x1 << 24)) >> 24) == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC0_QUEUE_EMPTY0(0x82060300): 0x%08x\n", - ple_stat[1])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC0_QUEUE_EMPTY1(0x82060304): 0x%08x\n", - ple_stat[2])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC0_QUEUE_EMPTY2(0x82060308): 0x%08x\n", - ple_stat[3])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC0_QUEUE_EMPTY3(0x8206030c): 0x%08x\n", - ple_stat[4])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC1_QUEUE_EMPTY0(0x82060310): 0x%08x\n", - ple_stat[5])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC1_QUEUE_EMPTY1(0x82060314): 0x%08x\n", - ple_stat[6])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC1_QUEUE_EMPTY2(0x82060318): 0x%08x\n", - ple_stat[7])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC1_QUEUE_EMPTY3(0x8206031c): 0x%08x\n", - ple_stat[8])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC2_QUEUE_EMPTY0(0x82060320): 0x%08x\n", - ple_stat[9])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC2_QUEUE_EMPTY1(0x82060324): 0x%08x\n", - ple_stat[10])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC2_QUEUE_EMPTY2(0x82060328): 0x%08x\n", - ple_stat[11])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC2_QUEUE_EMPTY3(0x8206032c): 0x%08x\n", - ple_stat[12])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC3_QUEUE_EMPTY0(0x82060330): 0x%08x\n", - ple_stat[13])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC3_QUEUE_EMPTY1(0x82060334): 0x%08x\n", - ple_stat[14])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC3_QUEUE_EMPTY2(0x82060338): 0x%08x\n", - ple_stat[15])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAC3_QUEUE_EMPTY3(0x8206033c): 0x%08x\n", - ple_stat[16])); - - for (j = 0; j < 16; j++) { - if (j % 4 == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\n\tNonempty AC%d Q of STA#: ", - j / 4)); - } - - for (i = 0; i < 32; i++) { - if (((ple_stat[j + 1] & (0x1 << i)) >> i) == - 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%d ", i + (j % 4) * 32)); - } - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Nonempty Q info:\n")); - - for (i = 0; i < 31; i++) { - if (((ple_stat[0] & (0x1 << i)) >> i) == 0) { - UINT32 hfid, tfid, pktcnt, fl_que_ctrl[3] = { 0 }; - - if (Queue_Empty_info[i].QueueName != NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\t%s: ", - Queue_Empty_info[i].QueueName)); - fl_que_ctrl[0] |= (0x1 << 31); - fl_que_ctrl[0] |= - (Queue_Empty_info[i].Portid << 14); - fl_que_ctrl[0] |= - (Queue_Empty_info[i].Queueid << 8); - } else - continue; - - HW_IO_WRITE32(pAd, PLE_FL_QUE_CTRL_0, fl_que_ctrl[0]); - HW_IO_READ32(pAd, PLE_FL_QUE_CTRL_2, &fl_que_ctrl[1]); - HW_IO_READ32(pAd, PLE_FL_QUE_CTRL_3, &fl_que_ctrl[2]); - hfid = fl_que_ctrl[1] & 0xfff; - tfid = (fl_que_ctrl[1] & 0xfff << 16) >> 16; - pktcnt = fl_que_ctrl[2] & 0xfff; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("tail/head fid = 0x%03x/0x%03x, pkt cnt = %x\n", - tfid, hfid, pktcnt)); - - if (pktcnt > 0 && dumptxd > 0) - ShowTXDInfo(pAd, hfid); - } - } - - for (j = 0; j < 16; j++) { /* show AC Q info */ - for (i = 0; i < 32; i++) { - if (((ple_stat[j + 1] & (0x1 << i)) >> i) == 0) { - UINT32 hfid, tfid, pktcnt, ac_num = j / 4, - ctrlvalue = 0; - UINT32 sta_num = i + (j % 4) * 32, - fl_que_ctrl[3] = { 0 }; - struct wifi_dev *wdev = - wdev_search_by_wcid(pAd, sta_num); - UINT32 wmmidx = 0; - - if (wdev) - wmmidx = HcGetWmmIdx(pAd, wdev); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\tSTA%d AC%d: ", sta_num, ac_num)); - fl_que_ctrl[0] |= (0x1 << 31); - fl_que_ctrl[0] |= (0x2 << 14); - fl_que_ctrl[0] |= (ac_num << 8); - fl_que_ctrl[0] |= sta_num; - HW_IO_WRITE32(pAd, PLE_FL_QUE_CTRL_0, - fl_que_ctrl[0]); - HW_IO_READ32(pAd, PLE_FL_QUE_CTRL_2, - &fl_que_ctrl[1]); - HW_IO_READ32(pAd, PLE_FL_QUE_CTRL_3, - &fl_que_ctrl[2]); - hfid = fl_que_ctrl[1] & 0xfff; - tfid = (fl_que_ctrl[1] & 0xfff << 16) >> 16; - pktcnt = fl_que_ctrl[2] & 0xfff; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("tail/head fid = 0x%03x/0x%03x, pkt cnt = %x", - tfid, hfid, pktcnt)); - - if (((sta_pause[j % 4] & 0x1 << i) >> i) == 1) - ctrlvalue = 2; - - if (((dis_sta_map[j % 4] & 0x1 << i) >> i) == 1) - ctrlvalue = 1; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" ctrl = %s", - sta_ctrl_reg[ctrlvalue])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" (wmmidx=%d)\n", wmmidx)); - - if (pktcnt > 0 && dumptxd > 0) - ShowTXDInfo(pAd, hfid); - } - } - } - - return TRUE; -} - -VOID mt7622_chip_dbg_init(struct _RTMP_CHIP_DBG *dbg_ops) -{ - dbg_ops->dump_ps_table = chip_dump_ps_table; - dbg_ops->dump_mib_info = chip_dump_mib_info; - dbg_ops->show_tmac_info = chip_show_tmac_info; - dbg_ops->show_agg_info = chip_show_agg_info; - dbg_ops->show_dmasch_info = chip_show_dmasch_info; - dbg_ops->show_pse_info = chip_show_pse_info; - dbg_ops->show_pse_data = - NULL; /* read PSE data from host is not supported */ - dbg_ops->show_protect_info = chip_show_protect_info; - dbg_ops->show_cca_info = chip_show_cca_info; - dbg_ops->set_cca_en = chip_set_cca_en; - dbg_ops->show_txv_info = NULL; - dbg_ops->show_bcn_info = chip_show_bcn_info; - dbg_ops->show_ple_info = chip_show_ple_info; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/rtmp_chip.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/rtmp_chip.c deleted file mode 100644 index 69d3d5a695..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/chips/rtmp_chip.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rt_chip.c - - Abstract: - Ralink Wireless driver CHIP related functions - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" - -/* -======================================================================== -Routine Description: - write high memory. - if firmware do not support auto high/low memory switching, we should switch to high memory by ourself. - -Arguments: - pAd - WLAN control block pointer - Offset - Memory offsets - Value - Written value - Unit - Unit in "Byte" - -Return Value: - None - -Note: -======================================================================== -*/ -VOID RtmpChipWriteHighMemory(IN RTMP_ADAPTER *pAd, IN USHORT Offset, - IN UINT32 Value, IN UINT8 Unit) -{ -} - -/* -======================================================================== -Routine Description: - write memory - -Arguments: - pAd - WLAN control block pointer - Offset - Memory offsets - Value - Written value - Unit - Unit in "Byte" -Return Value: - None - -Note: -======================================================================== -*/ -VOID RtmpChipWriteMemory(IN RTMP_ADAPTER *pAd, IN USHORT Offset, - IN UINT32 Value, IN UINT8 Unit) -{ - switch (Unit) { - case 1: - RTMP_IO_WRITE8(pAd, Offset, Value); - break; - - case 2: - RTMP_IO_WRITE16(pAd, Offset, Value); - break; - - case 4: - RTMP_IO_WRITE32(pAd, Offset, Value); - - default: - break; - } -} - -/* -======================================================================== -Routine Description: - Initialize normal beacon frame architecture. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID RtmpChipBcnInit(IN RTMP_ADAPTER *pAd) -{ - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - pChipCap->FlgIsSupSpecBcnBuf = FALSE; - pChipCap->BcnMaxHwNum = 8; - pChipCap->BcnMaxNum = - (pChipCap->BcnMaxHwNum - MAX_MESH_NUM - MAX_APCLI_NUM); - pChipCap->BcnMaxHwSize = 0x1000; - pChipCap->BcnBase[0] = 0x7800; - pChipCap->BcnBase[1] = 0x7A00; - pChipCap->BcnBase[2] = 0x7C00; - pChipCap->BcnBase[3] = 0x7E00; - pChipCap->BcnBase[4] = 0x7200; - pChipCap->BcnBase[5] = 0x7400; - pChipCap->BcnBase[6] = 0x5DC0; - pChipCap->BcnBase[7] = 0x5BC0; - - /* - If the MAX_MBSSID_NUM is larger than 6, - it shall reserve some WCID space(wcid 222~253) for beacon frames. - - these wcid 238~253 are reserved for beacon#6(ra6). - - these wcid 222~237 are reserved for beacon#7(ra7). - */ - if (pChipCap->BcnMaxNum == 8) - pChipCap->WcidHwRsvNum = 222; - else if (pChipCap->BcnMaxNum == 7) - pChipCap->WcidHwRsvNum = 238; - else - pChipCap->WcidHwRsvNum = 255; - - ops->BeaconUpdate = RtmpChipWriteMemory; -} - -UINT8 NICGetBandSupported(RTMP_ADAPTER *pAd) -{ - if (BOARD_IS_5G_ONLY(pAd)) - return RFIC_5GHZ; - else if (BOARD_IS_2G_ONLY(pAd)) - return RFIC_24GHZ; - else if (RFIC_IS_5G_BAND(pAd)) - return RFIC_DUAL_BAND; - else - return RFIC_24GHZ; -} - -INT WaitForAsicReady(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT AsicGetMacVersion(RTMP_ADAPTER *pAd) -{ - UINT32 reg = 0; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - /* TODO: shiang-7603 */ - if (cap->hif_type == HIF_MT) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, - __LINE__)); - return FALSE; - } - - if (WaitForAsicReady(pAd) == TRUE) { - RTMP_IO_READ32(pAd, reg, &pAd->MACVersion); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MACVersion[Ver:Rev]=0x%08x : 0x%08x\n", - pAd->MACVersion, pAd->ChipID)); - return TRUE; - } else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() failed!\n", __func__)); - return FALSE; - } -} - -/* -======================================================================== -Routine Description: - Initialize chip related information. - -Arguments: - pCB - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -int RtmpChipOpsHook(VOID *pCB) -{ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pCB; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - int ret = 0; - -#ifdef MT_DFS_SUPPORT - /* Initial new DFS channel list */ - DfsSetNewChInit(pAd); -#endif - - /* sanity check */ - if (WaitForAsicReady(pAd) == FALSE) - return -1; - - /* TODO: shiang-7603 */ - if (IS_MT7603(pAd) || IS_MT7628(pAd) || IS_MT76x6(pAd) || - IS_MT7637(pAd) || IS_MT7615(pAd)) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet! MACVersion=0x%x\n", - __func__, __LINE__, pAd->MACVersion)); - } - - if (pAd->MACVersion == 0xffffffff) - return -1; - - /* default init */ - RTMP_DRS_ALG_INIT(pAd, RATE_ALG_LEGACY); -#ifdef RTMP_RBUS_SUPPORT - - if (pAd->infType == RTMP_DEV_INF_RBUS) { - /* wilsonl, need DE provide info */ -#ifndef MT7622 - RTMP_SYS_IO_READ32(0xb000000c, &pAd->CommonCfg.CID); - RTMP_SYS_IO_READ32(0xb0000000, &pAd->CommonCfg.CN); -#endif - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CN: %lx\tCID = %lx\n", pAd->CommonCfg.CN, - pAd->CommonCfg.CID)); - } - -#endif /* RTMP_RBUS_SUPPORT */ - /*initial chip hook function*/ - WfSysPreInit(pAd); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Chip specific bbpRegTbSize=%d!\n", pChipCap->bbpRegTbSize)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Chip VCO calibration mode = %d!\n", - pChipCap->FlgIsVcoReCalMode)); -#ifdef DOT11W_PMF_SUPPORT - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[PMF] Encryption mode = %d\n", pChipCap->FlgPMFEncrtptMode)); -#endif /* DOT11W_PMF_SUPPORT */ - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Kconfig b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Kconfig deleted file mode 100644 index 27394e2e41..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Kconfig +++ /dev/null @@ -1,543 +0,0 @@ -config MT_WIFI - tristate "MT WIFI Driver" - select WIFI_BASIC_FUNC if MT_WIFI - -config MT_WIFI_PATH - string - depends on MT_WIFI - default "mt_wifi" - -if MT_WIFI -menu "WiFi Generic Feature Options" -choice - prompt "EEPROM Type of 1st Card" - depends on ! FIRST_IF_NONE - - config FIRST_IF_EEPROM_FLASH - bool "FLASH" - - config FIRST_IF_EEPROM_EFUSE - bool "EFUSE" -endchoice - -config RT_FIRST_CARD_EEPROM - string - depends on ! FIRST_IF_NONE - default "flash" if FIRST_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 2nd Card" - depends on ! SECOND_IF_NONE - - config SECOND_IF_EEPROM_FLASH - bool "FLASH" - - config SECOND_IF_EEPROM_PROM - bool "EEPROM" - - config SECOND_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config RT_SECOND_CARD_EEPROM - string - depends on ! SECOND_IF_NONE - default "prom" if SECOND_IF_EEPROM_PROM - default "efuse" if SECOND_IF_EEPROM_EFUSE - default "flash" if SECOND_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 3th Card" - depends on ! THIRD_IF_NONE - - config THIRD_IF_EEPROM_FLASH - bool "FLASH" - - config THIRD_IF_EEPROM_PROM - bool "EEPROM" - - config THIRD_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config RT_THIRD_CARD_EEPROM - string - depends on ! THIRD_IF_NONE - default "prom" if THIRD_IF_EEPROM_PROM - default "efuse" if THIRD_IF_EEPROM_EFUSE - default "flash" if THIRD_IF_EEPROM_FLASH - -config MULTI_INF_SUPPORT - bool - default y if !FIRST_IF_NONE && !SECOND_IF_NONE - -config WIFI_BASIC_FUNC - bool "Basic Functions" - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config DOT11_N_SUPPORT - bool "802.11n support" - default y - -config DOT11_VHT_AC - bool "802.11AC support" - depends on WIFI_DRIVER - depends on DOT11_N_SUPPORT - default y - -config G_BAND_256QAM_SUPPORT - bool "2.4G 256QAM support" - depends on WIFI_DRIVER - depends on DOT11_VHT_AC - default y - -config TPC_SUPPORT - bool "802.11h TPC Support" - depends on WIFI_DRIVER - default y - -config ICAP_SUPPORT - bool "ICAP Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config SPECTRUM_SUPPORT - bool "Wifi Spectrum Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config BACKGROUND_SCAN_SUPPORT - bool "Background Scan Support" - depends on WIFI_DRIVER - default y - -config SMART_CARRIER_SENSE_SUPPORT - bool "Smart Carrier Sense Support" - depends on WIFI_DRIVER - default y - -config MT_DFS_SUPPORT - bool "Dynamic Frequency Selection Support" - depends on WIFI_DRIVER - default y -config MTK_OFFCHANNEL_SCAN_FEATURE - bool "Channel Quality Monitor" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_DPP_SUPPORT - bool "DPP Support" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - select DOT11W_PMF_SUPPORT - default n -#config WFA_VHT_R2_PF -# bool "WFA VHT R2 Plugfest" -# depends on DOT11_VHT_AC -# default n - -config HDR_TRANS_TX_SUPPORT - bool "Tx Header Translation" - depends on CHIP_MT7615E || CHIP_MT7622 || CHIP_MT7663E - default y - -config HDR_TRANS_RX_SUPPORT - bool "Rx Header Translation" - depends on CHIP_MT7615E || CHIP_MT7622 || CHIP_MT7663E - default y - -config DBDC_MODE - bool "dbdc mode support" - depends on CHIP_MT7615E - select MULTI_PROFILE_SUPPORT -# select DEFAULT_5G_PROFILE - default y - -config MULTI_PROFILE_SUPPORT - bool "Multi Profile Support" - depends on DBDC_MODE - default y - -config DEFAULT_5G_PROFILE - bool "5G default profile for DBDC" - depends on DBDC_MODE - default n - -config WSC_INCLUDED - bool "WSC (WiFi Simple Config)" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config WSC_V2_SUPPORT - bool "WSC V2(WiFi Simple Config Version 2.0)" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config DOT11W_PMF_SUPPORT - bool "PMF" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config TXBF_SUPPORT - bool "Tx Bean Forming Support" - depends on WIFI_DRIVER - default y - -config FAST_NAT_SUPPORT - bool "Fast-NAT support" - depends on RA_HW_NAT_WIFI - default n - -config WHNAT_SUPPORT - tristate "Wifi Hardware NAT support" - depends on CHIP_MT7615E - depends on WLAN_HOOK - depends on FAST_NAT_SUPPORT - default n - -#config LLTD_SUPPORT -# bool "LLTD (Link Layer Topology Discovery Protocol)" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config QOS_DLS_SUPPORT -# bool "802.11e DLS ((Direct-Link Setup) Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config WAPI_SUPPORT -# bool "WAPI Support" -# depends on WIFI_DRIVER -# default n - -config FTM_SUPPORT - bool "FTM Support" - depends on WIFI_DRIVER - select PASSPOINT_R2 - default n - -config MBO_SUPPORT - bool "MBO Support" - depends on WIFI_DRIVER - select INTERWORKING - select WNM_SUPPORT - select DOT11K_RRM_SUPPORT - select DOT11R_FT_SUPPORT - select DOT11W_PMF_SUPPORT - default n - -#config CARRIER_DETECTION_SUPPORT -# bool "Carrier Detect" -# depends on WIFI_DRIVER -# default n - -config IGMP_SNOOP_SUPPORT - bool "IGMP snooping" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -#config BLOCK_NET_IF -# bool "NETIF Block" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n -# help -# Support Net interface block while Tx-Sw queue full - -#config RATE_ADAPTION -# bool "New Rate Adaptation support" -# depends on WIFI_DRIVER -# default y - -#config NEW_RATE_ADAPT_SUPPORT -# bool "Intelligent Rate Adaption" -# depends on WIFI_DRIVER && RATE_ADAPTION -# default y - -#config AGS_SUPPORT -# bool "Adaptive Group Switching" -# depends on WIFI_DRIVER && RATE_ADAPTION -# depends on MT_AP_SUPPORT || MT_STA_SUPPORT -# default n - -#config RATE_ADAPT_AGBS_SUPPORT -# bool "Adaptive AGBS Mode" -# depends on WIFI_DRIVER && RATE_ADAPTION -# depends on MT_AP_SUPPORT || MT_STA_SUPPORT -# default y - -#config IDS_SUPPORT -# bool "IDS (Intrusion Detection System) Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config WIFI_WORK_QUEUE -# bool "Work Queue" -# depends on WIFI_DRIVER -# default n - -#config WIFI_SKB_RECYCLE -# bool "SKB Recycle(Linux)" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -config RTMP_FLASH_SUPPORT - bool "Flash Support" - depends on WIFI_DRIVER - default y - -config PRE_CAL_TRX_SET1_SUPPORT - bool "Calibration To Flash/BinFile Support" - depends on WIFI_DRIVER - default y - -config RLM_CAL_CACHE_SUPPORT - bool "RlmCalibrationCache Support" - depends on WIFI_DRIVER - default y - -config PRE_CAL_TRX_SET2_SUPPORT - bool "Pre-calibration to Flash Support" - depends on WIFI_DRIVER - default y - -config CAL_BIN_FILE_SUPPORT - bool "Calibration to BinFile Support" - depends on WIFI_DRIVER - default y - -config RF_LOCKDOWN_SUPPORT - bool "RF Lockdown Support" - depends on WIFI_DRIVER - default n - -config LINK_TEST_SUPPORT - bool "Link Test Support" - depends on WIFI_DRIVER - default y - -#config LED_CONTROL_SUPPORT -# bool "LED Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -config ATE_SUPPORT - bool "ATE/QA Support" - depends on WIFI_DRIVER - default y - -#config MEMORY_OPTIMIZATION -# bool "Memory Optimization" -# depends on WIFI_DRIVER -# default n - -config PASSPOINT_R2 - bool "Passpoint Release-2 Support" - depends on WIFI_DRIVER - select DOT11W_PMF_SUPPORT - depends on MT_AP_SUPPORT - default n - -#config TRACE_TCP_PKT -# bool "TCP DATA/ACK packets trace log" -# depends on WIFI_DRIVER -# default n - -config UAPSD - bool "UAPSD support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config TCP_RACK_SUPPORT - bool "TCP Reduced ACK support" - depends on WIFI_DRIVER - default n - -#### PA_LNA_Type choice - -config RED_SUPPORT - bool "RED(Random Early Drop) support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config FDB_SUPPORT - bool "FW Debug Port" - depends on WIFI_DRIVER - default n - -choice - prompt "PA LNA Type of 1st Card" - depends on ! FIRST_IF_NONE - - config FIRST_IF_EPAELNA - bool "ePAeLNA" - config FIRST_IF_IPAILNA - bool "iPAiLNA" - config FIRST_IF_IPAELNA - bool "iPAeLNA" -# config FIRST_IF_EPAILNA -# bool "ePAiLNA" -endchoice -choice - prompt "PA LNA Type of 2nd Card" - depends on ! SECOND_IF_NONE - - config SECOND_IF_EPAELNA - bool "ePAeLNA" - config SECOND_IF_IPAILNA - bool "iPAiLNA" - config SECOND_IF_IPAELNA - bool "iPAeLNA" -# config SECOND_IF_EPAILNA -# bool "ePAiLNA" -endchoice -choice - prompt "PA LNA Type of 3rd Card" - depends on ! THIRD_IF_NONE - - config THIRD_IF_EPAELNA - bool "ePAeLNA" - config THIRD_IF_IPAILNA - bool "iPAiLNA" - config THIRD_IF_IPAELNA - bool "iPAeLNA" -# config THIRD_IF_EPAILNA -# bool "ePAiLNA" -endchoice -#### PA_LNA_Type choice END - -# -# Section for chip architectures -# -# "RLT MAC Support" -config RLT_MAC - bool - depends on WIFI_DRIVER - default n - -config RLT_BBP - bool - -config RLT_RF - bool - -# "RTMP MAC Support" -config RTMP_MAC - bool - depends on WIFI_DRIVER - default n - -config RTMP_BBP - bool - -config RTMP_RF - bool - -# -# Section for interfaces -# -config RTMP_PCI_SUPPORT - bool - -config RTMP_USB_SUPPORT - bool - -config RTMP_RBUS_SUPPORT - bool - -endmenu - -menu "WiFi Operation Modes" - choice - prompt "Main Mode" - default WIFI_MODE_AP - - config WIFI_MODE_AP - tristate "AP" - select MT_AP_SUPPORT - - config WIFI_MODE_STA - tristate "STA" - select MT_STA_SUPPORT - - config WIFI_MODE_BOTH - tristate "APSTA" - select MT_AP_SUPPORT - select MT_STA_SUPPORT - endchoice - - if WIFI_MODE_AP || WIFI_MODE_BOTH - source "drivers/net/wireless/mtk/mt7615e/mt_wifi_ap/Kconfig" - endif - - if WIFI_MODE_STA || WIFI_MODE_BOTH - source "drivers/net/wireless/mtk/mt7615e/mt_wifi_sta/Kconfig" - endif -endmenu - -endif - -if WIFI_RLT_MAC - config RLT_MAC - bool - default y -endif - -if WIFI_RTMP_MAC - config RTMP_MAC - bool - default y -endif - -if WIFI_MT_MAC - config MT_MAC - bool - default y - - config CHIP_MT7603E - bool - default n - - config CHIP_MT7615E - bool - default n - - config CHIP_MT7622 - bool - default n - - config CHIP_MT7663E - bool - default n -endif - -if CHIP_MT7615E - config MT_MAC - bool - default y - select RATE_ADAPTION - select RATE_ADAPT_AGBS_SUPPORT - select DOT11_N_SUPPORT - select DOT11_VHT_AC - select HDR_TRANS_TX_SUPPORT - select HDR_TRANS_RX_SUPPORT -endif - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Makefile b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Makefile deleted file mode 100644 index 3666be3294..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Makefile +++ /dev/null @@ -1,603 +0,0 @@ -ifeq ($(WIFI_MODE),) -RT28xx_MODE = AP -else -RT28xx_MODE = $(WIFI_MODE) -endif - -ifeq ($(TARGET),) -TARGET = LINUX -endif - -# CHIPSET -ifeq ($(CHIPSET),) -CHIPSET = mt7622 mt7615 -endif - -MODULE = $(word 1, $(CHIPSET)) - -#OS ABL - YES or NO -OSABL = NO - -ifneq ($(TARGET),THREADX) -#RT28xx_DIR = home directory of RT28xx source code -RT28xx_EMBEDDED_DIR = $(shell pwd) -RT28xx_DIR = $(shell cd ..;pwd) -#RT28xx_BIN_DIR = parent directory of bin folder, used by bin2h -RT28xx_BIN_DIR = $(shell cd ../..;pwd) -RT28xx_OS_DIR = $(RT28xx_DIR)/os -endif - -include $(RT28xx_OS_DIR)/linux/config.mk - -RTMP_SRC_DIR = $(RT28xx_DIR)/RT$(MODULE) - -ifeq ($(PLATFORM),) -#PLATFORM: Target platform -PLATFORM = PC -#PLATFORM = BB_SOC -#PLATFORM = IKANOS_V160 -#PLATFORM = IKANOS_V180 -#PLATFORM = SIGMA -#PLATFORM = SIGMA_8622 -#PLATFORM = INIC -#PLATFORM = STAR -#PLATFORM = IXP -#PLATFORM = INF_TWINPASS -#PLATFORM = INF_DANUBE -#PLATFORM = INF_AR9 -#PLATFORM = INF_VR9 -#PLATFORM = BRCM_6358 -#PLATFORM = INF_AMAZON_SE -#PLATFORM = CAVM_OCTEON -#PLATFORM = CMPC -#PLATFORM = SMDK -#PLATFORM = RMI -#PLATFORM = RMI_64 -#PLATFORM = KODAK_DC -#PLATFORM = DM6446 -#PLATFORM = FREESCALE8377 -#PLATFORM = BL2348 -#PLATFORM = BL23570 -#PLATFORM = BLUBB -#PLATFORM = BLPMP -#PLATFORM = MT85XX -#PLATFORM = MT53XX -#PLATFORM = NXP_TV550 -#PLATFORM = MVL5 -#PLATFORM = UBICOM_IPX8 -#PLATFORM = INTELP6 -#PLATFORM = MT7620 -#PLATFORM = MT7621 -#PLATFORM = MT7622 -endif - -ifeq ($(PLATFORM),INTELP6) -ifndef TARG_ARCH - export TARG_ARCH=intel_gen3-linux -endif -ifndef BUILD_ROOT - export BUILD_ROOT=$(PWD)/../../.. -endif -ifndef BUILD_DEST - export BUILD_DEST=$(BUILD_ROOT)/$(BUILD_DIR)/ -endif -ifndef HOST_CC - export HOST_CC=gcc -endif - -ifeq ($(TARG_ARCH),intel_gen3-linux) - BUILD_DIR=build_i686/staging_dir - HOST=LINUX - TARGET=LINUX - BUILD=LINUX - CROSS_COMPILE=$(BUILD_DEST)/bin/i686-cm-linux- -endif -export HOST -export TARGET -export BUILD -export CROSS_COMPILE -ifdef TARGETCC - export CC=$(TARGETCC) - export LD=$(TARGETLD) - export AR=$(TARGETAR) - export AR_RC=$(TARGETAR) rc - export STRIP=$(TARGETSTRIP) - export CXX=$(TARGETCXX) - export RANLIB=$(TARGETRANLIB) - export STRINGS=$(TARGETSTRINGS) - export M4=$(TARGETM4) - export BISON=$(TARGETBISON) - export YACC=$(TARGETYACC) -else - export CC=$(CROSS_COMPILE)gcc - export LD=$(CROSS_COMPILE)ld - export AR=$(CROSS_COMPILE)ar - export AR_RC=$(CROSS_COMPILE)ar rc - export STRIP=$(CROSS_COMPILE)strip - export CXX=$(CROSS_COMPILE)g++ - export RANLIB=$(CROSS_COMPILE)ranlib - export STRINGS=$(CROSS_COMPILE)strings - export M4=$(CROSS_COMPILE)m4 - export BISON=$(CROSS_COMPILE)bison - export YACC=$(CROSS_COMPILE)yacc -endif -ifndef TARGETDEST - export TARGETDEST = $(BUILD_ROOT)/project_build_i686/IntelCE/ -endif -ifndef FSROOT - export FSROOT = $(TARGETDEST)/root/ -endif -ifndef KERNEL_VER - export KERNEL_VER=linux-2.6.28 -endif -ifndef KERNEL_DIR - export KERNEL_DIR=$(BUILD_DEST)/kernel/$(KERNEL_VER) -endif -endif - -#APSOC -ifeq ($(CHIPSET),mt7628) -PLATFORM = MT7628 -endif - -#RELEASE Package -RELEASE = FormalRelease - -ifeq ($(TARGET),LINUX) -MAKE = make -endif - -ifeq ($(TARGET), UCOS) -MAKE = make -endif -ifeq ($(TARGET),THREADX) -MAKE = gmake -endif - -ifeq ($(TARGET), ECOS) -MAKE = make -MODULE = $(shell pwd | sed "s/.*\///" ).o -export MODULE -endif - -ifeq ($(PLATFORM),BB_SOC) -LINUX_SRC = $(KERNEL_DIR) -#CROSS_COMPILE = /opt/trendchip/mips-linux-uclibc/usr/bin/mips-linux-uclibc- -endif - -ifeq ($(PLATFORM),UBICOM_IPX8) -LINUX_SRC = /home/sample/Customers/UBICOM/ubicom-linux-dist-2.1.1/linux-2.6.x -CROSS_COMPILE = ubicom32-elf- -endif - -ifeq ($(PLATFORM),IKANOS_V160) -LINUX_SRC = /home/sample/projects/LX_2618_RG_5_3_00r4_SRC/linux-2.6.18 -CROSS_COMPILE = mips-linux- -endif - -ifeq ($(PLATFORM),IKANOS_V180) -LINUX_SRC = /home/sample/projects/LX_BSP_VX180_5_4_0r1_ALPHA_26DEC07/linux-2.6.18 -CROSS_COMPILE = mips-linux- -endif - -ifeq ($(PLATFORM),SIGMA) -LINUX_SRC = /root/sigma/smp86xx_kernel_source_2.7.172.0/linux-2.6.15 -CROSS_COMPILE = /root/sigma/smp86xx_toolchain_2.7.172.0/build_mipsel_nofpu/staging_dir/bin/mipsel-linux- -endif - -ifeq ($(PLATFORM),SIGMA_8622) -LINUX_SRC = /home/snowpin/armutils_2.5.120.1/build_arm/linux-2.4.22-em86xx -CROSS_COMPILE = /home/snowpin/armutils_2.5.120.1/toolchain/bin/arm-elf- -CROSS_COMPILE_INCLUDE = /home/snowpin/armutils_2.5.120.1/toolchain/lib/gcc-lib/arm-elf/2.95.3 -endif - -ifeq ($(PLATFORM),INIC) -UCOS_SRC = /opt/uCOS/iNIC_rt2880 -CROSS_COMPILE = /usr/bin/mipsel-linux- -endif - -ifeq ($(PLATFORM),STAR) -LINUX_SRC = /opt/star/kernel/linux-2.4.27-star -CROSS_COMPILE = /opt/star/tools/arm-linux/bin/arm-linux- -endif - -ifeq ($(PLATFORM),RMI) -LINUX_SRC = /opt/rmi/1.7.0/linux/src/ -CROSS_COMPILE = /opt/rmi/1.7.0/mipscross/nptl/bin/mips64-unknown-linux-gnu- -endif - -ifeq ($(PLATFORM),RMI_64) -LINUX_SRC = /opt/rmi/1.7.0/linux_64/src/ -CROSS_COMPILE = /opt/rmi/1.7.0/mipscross/nptl/bin/mips64-unknown-linux-gnu- -endif - -ifeq ($(PLATFORM),FREESCALE8377) -LINUX_SRC = /opt/ltib-mpc8377_rds-20090309/rpm/BUILD/linux-2.6.25 -CROSS_COMPILE = /opt/freescale/usr/local/gcc-4.2.187-eglibc-2.5.187/powerpc-linux-gnu/bin/powerpc-linux-gnu- -endif - -ifeq ($(PLATFORM),BL2348) -LINUX_SRC = /home/sample/Customers/BroadLight/bl234x-linux-2.6.21-small-v29 -CROSS_COMPILE = mips-wrs-linux-gnu- -endif - -ifeq ($(PLATFORM),BL23570) -LINUX_SRC = /home/FIBERHOME/linux-2.6.34.8 -CROSS_COMPILE = mips-wrs-linux-gnu-mips_74k_softfp-glibc_small- -ARCH:=mips -export $ARCH -endif - - -ifeq ($(PLATFORM),BLUBB) -LINUX_SRC = /home/sample/Customers/BroadLight/UBB/gmp20/linux-2.6.21-small -CROSS_COMPILE = mips-wrs-linux-gnu- -endif - -ifeq ($(PLATFORM),BLPMP) -LINUX_SRC = /home/sample/Customers/BroadLight/UBB/pmp16/bl234x-linux-2.6.21-small-v30.2 -CROSS_COMPILE = mips-wrs-linux-gnu- -endif - -ifeq ($(PLATFORM),PC) -# Linux 2.6 -#LINUX_SRC = /lib/modules/$(shell uname -r)/build -# Linux 2.4 Change to your local setting -#LINUX_SRC = /usr/src/linux-2.4 -#LINUX_SRC_MODULE = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/ -LINUX_SRC = /lib/modules/3.16.0-30-generic/build -LINUX_SRC_MODULE = /lib/modules/3.16.0-30-generic/kernel/drivers/net/wireless/ -CROSS_COMPILE = -endif - -ifeq ($(PLATFORM),INTELP6) -LINUX_SRC = $(KERNEL_DIR) -CROSS_COMPILE = -endif - -ifeq ($(PLATFORM),IXP) -LINUX_SRC = /project/stable/Gmtek/snapgear-uclibc/linux-2.6.x -CROSS_COMPILE = arm-linux- -endif - -ifeq ($(PLATFORM),INF_TWINPASS) -# Linux 2.6 -#LINUX_SRC = /lib/modules/$(shell uname -r)/build -# Linux 2.4 Change to your local setting -LINUX_SRC = /project/stable/twinpass/release/2.0.1/source/kernel/opensource/linux-2.4.31/ -CROSS_COMPILE = mips-linux- -endif - -ifeq ($(PLATFORM),INF_DANUBE) -LINUX_SRC = /opt/danube/sdk/linux-2.6.16.x -CROSS_COMPILE = mips-linux- -ROOTDIR = /opt/danube/sdk -export ROOTDIR -endif - -ifeq ($(PLATFORM),INF_AR9) -LINUX_SRC = /root/ar9/xR9_BSP1.2.2.0/source/kernel/opensource/linux-2.6.20/ -CROSS_COMPILE = /root/ar9/ifx-lxdb26-1.0.2/gcc-3.4.4/toolchain-mips/bin/ -endif - -ifeq ($(PLATFORM),INF_VR9) -LINUX_SRC = /home/public/lantiq/VR9/UGW-4.2/build_dir/linux-ifxcpe_platform_vr9/linux-2.6.20.19 -CROSS_COMPILE = /home/public/lantiq/VR9/UGW-4.2/staging_dir/toolchain-mips_gcc-3.4.6_uClibc-0.9.29/bin/mips-linux- -endif - -ifeq ($(PLATFORM),BRCM_6358) -LINUX_SRC = -CROSS_COMPILE = -endif - -ifeq ($(PLATFORM),INF_AMAZON_SE) -# Linux 2.6 -#LINUX_SRC = /lib/modules/$(shell uname -r)/build -# Linux 2.4 Change to your local setting -LINUX_SRC = /backup/ifx/3.6.2.2/source/kernel/opensource/linux-2.4.31 -#CROSS_COMPILE = mips-linux- -#LINUX_SRC = /project/Infineon/3.6.2.2/source/kernel/opensource/linux-2.4.31 -CROSS_COMPILE = /opt/uclibc-toolchain/ifx-lxdb-1-2-3-external/gcc-3.3.6/toolchain-mips/R0208V35/mips-linux-uclibc/bin/ -endif - -ifeq ($(PLATFORM),ST) -LINUX_SRC = /opt/STM/STLinux-2.2/devkit/sources/kernel/linux0039 -CROSS_COMPILE = /opt/STM/STLinux-2.2/devkit/sh4/bin/sh4-linux- -ARCH := sh -export ARCH -endif - -ifeq ($(PLATFORM),CAVM_OCTEON) -OCTEON_ROOT = /usr/local/Cavium_Networks/OCTEON-SDK -LINUX_SRC = $(OCTEON_ROOT)/linux/kernel_2.6/linux -CROSS_COMPILE = mips64-octeon-linux-gnu- -endif - -ifeq ($(PLATFORM),CMPC) -LINUX_SRC = /opt/fvt_11N_SDK_0807/fvt131x_SDK_11n/linux-2.6.17 -CROSS_COMPILE = -endif - -ifeq ($(PLATFORM),SMDK) -LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung -CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- -endif - -ifeq ($(PLATFORM),KODAK_DC) -SKD_SRC = C:/SigmaTel/DC1250_SDK_v1-9/sdk -CROSS_COMPILE = $(cc) -endif - -ifeq ($(PLATFORM),DM6446) -LINUX_SRC = /home/fonchi/work/soc/ti-davinci -endif - -ifeq ($(PLATFORM),MT85XX) -LINUX_SRC = /home/john/MTK/BDP_Linux/linux-2.6.27 -CROSS_COMPILE = armv6z-mediatek-linux-gnueabi- -endif - -ifeq ($(PLATFORM),MT53XX) -TARGET = LINUX -#****** For system auto build ****** -#LINUX_SRC=$(KERNEL_OBJ_ROOT)/$(KERNEL_VER)/$(KERNEL_CONFIG)_modules -#****** For local build ****** -# uncomment the following lines -VM_LINUX_ROOT ?= $(word 1, $(subst /vm_linux/,/vm_linux /, $(shell pwd))) -LINUX_ROOT ?= $(VM_LINUX_ROOT) -LINUX_SRC=$(VM_LINUX_ROOT)/output/Sony_android/Fiji_EU_JB/rel/obj/kernel/chiling/kernel/linux-3.4/_android_smp_mod_defconfig_modules -OBJ_ROOT ?= $(VM_LINUX_ROOT)/output/Sony_android/Fiji_EU_JB/rel/obj -export KERNEL_OBJ_ROOT=$(LINUX_SRC)/../.. -ifeq ($(CROSS_COMPILE),) -CROSS_COMPILE=/mtkoss/gnuarm/vfp_4.5.1_2.6.27_cortex-a9-rhel4/i686/bin/armv7a-mediatek451_001_vfp-linux-gnueabi- -endif -ifeq "$(CC)" "gcc" -CC ?= $(CROSS_COMPILE)gcc -endif -$(warning =============================================) -$(warning CC=$(CC) for wifi driver LINUX_SRC=$(LINUX_SRC)) -$(warning TARGET=$(TARGET)) -$(warning =============================================) -endif - -ifeq ($(PLATFORM),NXP_TV550) -LINUX_SRC = /data/tv550/kernel/linux-2.6.28.9 -LINUX_SRC_MODULE = /data/tv550/kernel/linux-2.6.28.9/drivers/net/wireless -CROSS_COMPILE = /opt/embeddedalley/nxp_tv550/bin/mipsel-linux- -endif - -ifeq ($(PLATFORM),MVL5) -LINUX_SRC = /home2/charlestu/AP-VT3426/linux-2.6.18 -CROSS_COMPILE = /opt/montavista/pro/devkit/arm/v5t_le_mvl5/bin/arm_v5t_le- -endif - -ifeq ($(PLATFORM),MT7620) -LINUX_SRC = /home/share/src/MT7601/AP/RT288x_SDK/source/linux-2.6.36.x -CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux- -endif - -ifeq ($(PLATFORM),MT7621) -LINUX_SRC = /mtkoss/linux_headers/linux-headers-3.10.14-mips -CROSS_COMPILE = /opt/buildroot-gcc463/usr/bin/mipsel-linux- -ARCH = mips -export $ARCH -endif - -ifeq ($(PLATFORM),MT7628) -LINUX_SRC = /root/Working/MT7628_SDK_2013_0912/RT288x_SDK/source/linux-2.6.36.x -CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux- -endif - -ifeq ($(PLATFORM),MT7622) -LINUX_SRC = /mtkoss/linux_headers/linux-headers-4.4.24-arm64/ -CROSS_COMPILE = /opt/buildroot-gcc492_arm64/usr/bin/aarch64-linux- -ARCH = arm64 -export $ARCH -endif - -export OSABL RT28xx_DIR RT28xx_BIN_DIR RT28xx_OS_DIR RT28xx_EMBEDDED_DIR RT28xx_MODE LINUX_SRC CROSS_COMPILE CROSS_COMPILE_INCLUDE PLATFORM RELEASE CHIPSET MODULE RTMP_SRC_DIR LINUX_SRC_MODULE TARGET HAS_WOW_SUPPORT HAS_FPGA_MODE HAS_RX_CUT_THROUGH - -# The targets that may be used. -PHONY += all build_tools test UCOS THREADX LINUX release prerelease clean uninstall install libwapi osabl sdk_build_tools - -ifeq ($(TARGET),LINUX) -all: build_tools $(TARGET) plug_in -else -all: $(TARGET) -endif - -build_sku_tables: - $(MAKE) -C $(RT28xx_DIR)/txpwr - $(RT28xx_DIR)/txpwr/data2h - -build_power_limit_tables: - $(MAKE) -C $(RT28xx_DIR)/txpwr - $(RT28xx_DIR)/txpwr/data2h - -build_tools: - $(MAKE) -C tools - $(RT28xx_EMBEDDED_DIR)/tools/bin2h - -sdk_build_tools: - if [ -f $(RT28xx_DIR)/eeprom_log ]; then \ - rm -f $(RT28xx_DIR)/eeprom_log - fi - echo $(EE_TYPE) >> eeprom_log - echo $(CHIPSET) >> eeprom_log - if [ -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin ]; then \ - echo 'find SA/MT7603E_EEPROM.bin' >> eeprom_log ; \ - cp -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin $(RT28xx_DIR)/eeprom/MT7603E_EEPROM.bin ; \ - else \ - cp -f $(RT28xx_DIR)/eeprom/$(EE_TYPE)/MT7603E_EEPROM.bin $(RT28xx_DIR)/eeprom/MT7603E_EEPROM.bin ; \ - fi - $(MAKE) -C tools - $(RT28xx_EMBEDDED_DIR)/tools/bin2h -# rm -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin - -test: - $(MAKE) -C tools test - -UCOS: - $(MAKE) -C os/ucos/ MODE=$(RT28xx_MODE) - echo $(RT28xx_MODE) - -ECOS: - $(MAKE) -C os/ecos/ MODE=$(RT28xx_MODE) - cp -f os/ecos/$(MODULE) $(MODULE) - -THREADX: - $(MAKE) -C $(RT28xx_OS_DIR)/Threadx -f $(RT28xx_OS_DIR)/ThreadX/Makefile - -LINUX: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) - -ifeq ($(OSABL),YES) - cp -f $(RT28xx_OS_DIR)/linux/Makefile.4.util $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(RT28xx_OS_DIR)/linux/ -endif - - cp -f $(RT28xx_OS_DIR)/linux/Makefile.4 $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(RT28xx_OS_DIR)/linux/ - -ifeq ($(OSABL),YES) - cp -f $(RT28xx_OS_DIR)/linux/Makefile.4.netif $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(RT28xx_OS_DIR)/linux/ -endif - -else - -ifeq ($(OSABL),YES) - cp -f $(RT28xx_OS_DIR)/linux/Makefile.6.util $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules -endif - - cp -f $(RT28xx_OS_DIR)/linux/Makefile.6 $(RT28xx_OS_DIR)/linux/Makefile -ifeq ($(PLATFORM),DM6446) - $(MAKE) ARCH=arm CROSS_COMPILE=arm_v5t_le- -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules -else ifeq ($(PLATFORM),FREESCALE8377) - $(MAKE) ARCH=powerpc CROSS_COMPILE=$(CROSS_COMPILE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules -else ifeq ($(PLATFORM), $(filter $(PLATFORM), MT7622 MT7621)) - $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules -else - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules -endif - -ifeq ($(OSABL),YES) - cp -f $(RT28xx_OS_DIR)/linux/Makefile.6.netif $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules -endif - -endif - -check_build: - $(RT28xx_EMBEDDED_DIR)/tools/check_build_script.sh - -plug_in: - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_EMBEDDED_DIR)/tools/plug_in MODULE_FLAGS="$(WFLAGS)" - -release: build_tools - $(MAKE) -C $(RT28xx_EMBEDDED_DIR)/striptool -f Makefile.release clean - $(MAKE) -C $(RT28xx_EMBEDDED_DIR)/striptool -f Makefile.release - striptool/striptool.out -ifeq ($(RELEASE), DPO) - gcc -o embedded/striptool/banner striptool/banner.c - ./embedded/striptool/banner -b embedded/striptool/copyright.gpl -s DPO/ -d DPO_GPL -R - ./embedded/striptool/banner -b embedded/striptool/copyright.frm -s DPO_GPL/include/firmware.h -endif - -prerelease: -ifeq ($(MODULE), 2880) - $(MAKE) -C $(RT28xx_OS_DIR)/linux -f Makefile.release.2880 prerelease -else - $(MAKE) -C $(RT28xx_OS_DIR)/linux -f Makefile.release prerelease -endif - cp $(RT28xx_OS_DIR)/linux/Makefile.DPB $(RTMP_SRC_DIR)/os/linux/. - cp $(RT28xx_OS_DIR)/linux/Makefile.DPA $(RTMP_SRC_DIR)/os/linux/. - cp $(RT28xx_OS_DIR)/linux/Makefile.DPC $(RTMP_SRC_DIR)/os/linux/. -ifeq ($(RT28xx_MODE),STA) - cp $(RT28xx_OS_DIR)/linux/Makefile.DPD $(RTMP_SRC_DIR)/os/linux/. - cp $(RT28xx_OS_DIR)/linux/Makefile.DPO $(RTMP_SRC_DIR)/os/linux/. -endif - -clean: -ifeq ($(TARGET), LINUX) - cp -f $(RT28xx_OS_DIR)/linux/Makefile.clean $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(RT28xx_OS_DIR)/linux clean - rm -rf $(RT28xx_OS_DIR)/linux/Makefile -ifeq ($(PLATFORM),INTELP6) - rm -rf $(BUILD_DEST)/etc/Wireless/7615AP/ - rm -rf $(FSROOT)/etc/Wireless/7615AP/ - rm -rf $(BUILD_DEST)/lib/modules/wifi/mt7615e_ap.ko - rm -rf $(FSROOT)/lib/modules/wifi/mt7615e_ap.ko -endif -endif -ifeq ($(TARGET), UCOS) - $(MAKE) -C $(RT28xx_OS_DIR)/ucos clean MODE=$(RT28xx_MODE) -endif -ifeq ($(TARGET), ECOS) - $(MAKE) -C $(RT28xx_OS_DIR)/ecos clean MODE=$(RT28xx_MODE) -endif - -uninstall: -ifeq ($(TARGET), LINUX) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) - $(MAKE) -C $(RT28xx_OS_DIR)/linux -f Makefile.4 uninstall -else - $(MAKE) -C $(RT28xx_OS_DIR)/linux -f Makefile.6 uninstall -endif -endif - -install: -ifeq ($(TARGET), LINUX) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) - $(MAKE) -C $(RT28xx_OS_DIR)/linux -f Makefile.4 install -else - $(MAKE) -C $(RT28xx_OS_DIR)/linux -f Makefile.6 install -endif -endif - -libwapi: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) - cp -f embedded/os/linux/Makefile.libwapi.4 $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(RT28xx_OS_DIR)/linux/ -else - cp -f embedded/os/linux/Makefile.libwapi.6 $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules -endif - -osutil: -ifeq ($(OSABL),YES) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) - cp -f os/linux/Makefile.4.util $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(RT28xx_DIR)/os/linux/ -else - cp -f os/linux/Makefile.6.util $(RT28xx_OS_DIR)/linux/Makefile - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules -endif -endif - -osnet: -ifeq ($(OSABL),YES) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) - cp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile - $(MAKE) -C $(RT28xx_DIR)/os/linux/ -else - cp -f os/linux/Makefile.6.netif $(RT28xx_DIR)/os/linux/Makefile - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules -endif -endif - -osdrv: -ifneq (,$(findstring 2.4,$(LINUX_SRC))) - cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile - $(MAKE) -C $(RT28xx_DIR)/os/linux/ -else - cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules -endif - -# Declare the contents of the .PHONY variable as phony. We keep that information in a variable -.PHONY: $(PHONY) - - - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Pack_Release.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Pack_Release.sh deleted file mode 100644 index 4c88add808..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Pack_Release.sh +++ /dev/null @@ -1,92 +0,0 @@ -EmbeddedDir=`pwd` -BaseCodeDir=`dirname $EmbeddedDir` -HomeDir=`dirname $BaseCodeDir` -dir_main=mt_wifi -dir_ap=mt_wifi_ap -dir_sta=mt_wifi_sta -release_profile=$BaseCodeDir/Release.log -#module_name=`basename $BaseCodeDir` -module_name=`cat $release_profile | line` -release_version=`sed -e '1d' $release_profile | line` -release_date=`sed -e '1,2d' $release_profile | line` -package_name=$module_name\_$release_version\_$release_date -############################ - - cd $HomeDir - - ### Creat dir_main ### - if [ -d $dir_main ]; then - rm -rf $dir_main - fi - - if [ -d $dir_ap ]; then - rm -rf $dir_ap - fi - - #if [ -d $dir_sta ]; then - # rm -rf $dir_sta - #fi - - if [ -d $HomeDir/../temp_release ]; then - rm -rf $HomeDir/../temp_release - fi - - mv $BaseCodeDir $HomeDir/../temp_release - rm -rf * - mv $HomeDir/../temp_release $dir_main - #cp Kconfig $dir_main/ - rm $dir_main/embedded/Pack_Release.sh $dir_main/Release.log - - mkdir $dir_ap - cp $dir_main/os/linux/Kconfig.mt_wifi_ap $dir_ap/Kconfig - cp $dir_main/os/linux/Makefile.mt_wifi_ap $dir_ap/Makefile - cp $dir_main/os/linux/Kconfig.mt_wifi $dir_main/embedded/Kconfig - #mv $dir_main/embedded/$dir_sta ./ - - ### Creat dir_ap ### - #if [ -d $dir_ap ]; then - # rm -rf $dir_ap - #fi - #mkdir $dir_ap - #if [ ! -d $dir_ap ]; then - # echo "Error! Cannot creat folder [$dir_ap]" - # exit 1 - #fi - # - # - #cp $BaseCodeDir/os/linux/Makefile.rlt_wifi_ap $dir_ap/Makefile - #cp $BaseCodeDir/os/linux/Kconfig.rlt_wifi_ap $dir_ap/Kconfig - - if [ ! -d $dir_ap ]; then - echo "Error! [$dir_ap] doesn't exist." - exit 1 - fi - - #if [ ! -d $dir_sta ]; then - # echo "Error! [$dir_sta] doesn't exist." - # exit 1 - #fi - - if [ "$1" == "auto_build" ]; then - if [ -d ../$dir_main\_auto_build ]; then - rm -rf ../$dir_main\_auto_build - fi - if [ -d ../$dir_ap\_auto_build ]; then - rm -rf ../$dir_ap\_auto_build - fi - #if [ -d ../$dir_sta\_auto_build ]; then - # rm -rf ../$dir_sta\_auto_build - #fi - mv $dir_main ../$dir_main\_auto_build - mv $dir_ap ../$dir_ap\_auto_build - #mv $dir_sta ../$dir_sta\_auto_build - cd ../../ - #rm -rf release - else - rm $dir_main/embedded/*auto_build* - tar -jcvf $package_name\.tar.bz2 $dir_main $dir_ap - #tar -jcvf $package_name\.tar.bz2 $dir_main $dir_ap $dir_sta - #rm -rf $dir_main $dir_ap $dir_sta - fi - -############################ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Release.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Release.sh deleted file mode 100644 index ec7f0d06b2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Release.sh +++ /dev/null @@ -1,134 +0,0 @@ -OSABL=NO -EmbeddedDir=`pwd` -BaseCodeDir=`dirname $EmbeddedDir` -ChipName="mt7615" -WiFiMode=AP -DriverVersion="V4.4.0.2" -Release="DPA" -Note=$1 -Description="Formal release." -release_profile=Release.log -###### Fixed Settings ###### -Day=`date +%d` -Month=`date +%m` -Year=`date +%Y` -Date=$Year$Month$Day -Hour=`date +%H` -Minute=`date +%M` -HomeDir=`dirname $BaseCodeDir` -#ModuleName=mt$ChipName\_wifi_$DriverVersion -ModulePrefix=MT7615_LinuxAP -ModuleName=$ModulePrefix\_$DriverVersion -WorkDir=$HomeDir/release -TargetDir=$WorkDir/$ModuleName\_$Date\_$Hour$Minute -############################ - - -if [ ! -d $WorkDir ]; then - mkdir $WorkDir -fi - -BaseCodeDir=`readlink -f $BaseCodeDir` #get full path -if [ ! -d $BaseCodeDir ] ; then - echo "Error: BaseCodeDir ($BaseCodeDir) does not exist." - exit 1; -fi - -cp -a $BaseCodeDir $TargetDir -if [ ! -d $TargetDir ] ; then - echo "Error: TargetDir ($TargetDir) does not exist." - exit 1; -fi - -cd $TargetDir - -if [ -f /home/haipin/script/chmod_644.sh ]; then - /home/haipin/script/chmod_644.sh -fi - -if [ -f /home/haipin/script/clean.sh ]; then - /home/haipin/script/clean.sh -fi - -for i in $Release; do - cd $TargetDir/embedded - ####### Remove unwanted files that do not processed by strip tool ####### // TODO - rm os/linux/Makefile.libautoprovision.6 common/rt2860.bin common/rt2870_sw_ch_offload.bin common/RT85592.bin - rm tools/mt7662e_ap.sh tools/mt7662e_sta.sh tools/i.sh tools/trace.sh - rm ../eeprom/MT7601*.bin ../eeprom/MT7603*.bin ../eeprom/MT7628*.bin ../eeprom/MT7637*.bin ../eeprom/MT7662*.bin - rm ../eeprom/MT7636*.bin - rm ../mcu/bin/*_FPGA*.bin ../mcu/bin/*_plain*.bin ../mcu/bin/*_test*.bin - rm ../mcu/bin/*7601* ../mcu/bin/*7603* ../mcu/bin/*7612* ../mcu/bin/*7636* ../mcu/bin/*7637* - rm ../mcu/bin/*7610* ../mcu/bin/*7650* ../mcu/bin/*7662* ../mcu/bin/*7628* - rm ../os/linux/Kconfig.ap* ../os/linux/Kconfig.sta* ../os/linux/Kconfig.rlt* ../os/linux/Kconfig.wifi - rm ../os/linux/Makefile.ap* ../os/linux/Makefile.sta* ../os/linux/Makefile.2880* ../os/linux/Makefile.rlt* - ######################################################################### - - ## Regenerate Firmware ## - #rm -rf include/mcu/mt7628_firmware.h - #rm -rf include/mcu/mt7628_e2_firmware.h - make build_tools CHIPSET=$ChipName - ## Regenerate SKU tables ## - make build_sku_tables CHIPSET=$ChipName - -if [ "$1" != "auto_build" ]; then - make release WIFI_MODE=$WiFiMode CHIPSET=$ChipName RELEASE=$i -else - make release WIFI_MODE=$WiFiMode CHIPSET=$ChipName RELEASE=$i AUTO_BUILD=y -fi - - if [ -d $i ]; then - lower=`echo $i | tr A-Z a-z` #transfer "DPA DPB DPC DPD" to lower case - #ReleaseDir=$ModuleName\_$lower\_$Date - ReleaseDir=$ModuleName\_$i\_$Date - #ReleaseDir=$ModuleName\_$Date - #ReleaseDir=$ModulePrefix - mv $i $TargetDir/$ReleaseDir - ReleaseDir=$TargetDir/$ReleaseDir - - #if [ "$i" == "DPA" ]; then - cd $ReleaseDir/embedded - - find . -name "*Card.dat" -exec rm -rf {} \; #// TODO - find . -name "*2870*.dat" -exec rm -rf {} \; - rm -rf doc/*History*.txt doc/*README* doc/RT_WIFI_Revision_History_2010_April.xls doc/RT2860card.readme - rm -rf Makefile.OSABL threadX.MakeFile vxworks.makefile History.txt RT2860AP.dat - rm -rf os/linux/Makefile.2880.* - rm -rf Release.sh load.4 load.6 load unload - #rm -rf Makefile - cd $TargetDir/embedded - #fi - - ### Generate profile for release ### - echo $ModulePrefix > $ReleaseDir/$release_profile - echo $DriverVersion >> $ReleaseDir/$release_profile - echo $Date >> $ReleaseDir/$release_profile - cp Pack_Release.sh $ReleaseDir/embedded - ##Copy sku_tables .dat to release package## - cp -R $TargetDir/txpwr/sku_tables $ReleaseDir/txpwr/ - cd $ReleaseDir/embedded - sh Pack_Release.sh $1 - - #tar -jcvf $ReleaseDir.tar.bz2 $ReleaseDir - else - echo "Error: ReleaseDir ($i) does not exist" - exit 1 - fi - -done - -#####Log File##### -#if [ "$1" != "auto_build" ]; then -# cd $TargetDir/embedded -# echo "OSABL = $OSABL" > Release.log -# echo "BaseCodeDir = $BaseCodeDir" >> Release.log -# echo "ChipName = $ChipName" >> Release.log -# echo "DriverVersion = $DriverVersion" >> Release.log - #echo "BuildDir = $BuildDir" >> Release.log -# echo "Release = $Release" >> Release.log -# if [ "$Description" != "" ]; then -# echo "Description = $Description" >> Release.log -# fi -# echo "Note: $Note" >> Release.log -#fi -################## diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Release_Notes.txt b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Release_Notes.txt deleted file mode 100644 index d42fd76293..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/Release_Notes.txt +++ /dev/null @@ -1,97 +0,0 @@ -[ V4.4.0.2 ] - Support function: - 1. MU-MIMO support. - 2. BW160 for IEEE 802.11 new standard modification. - 3. Multiple default bin file support. - 4. Single SKU for TxBF. - 5. Repeater - WiFi Forwarding Module support - - Issue Fixed: - 1. Endurance and robustness enhancement. - 2. DFS - Fix "channel closing time too long" issue. - 3. 802.11R - Fixed AP would delete STA if STA send disassoc - frame which BSSID is AP's BSSID but DA is another AP. - 4. Fix Auto Channel Selection trigger by iwpriv command. - 5. Fix BA session overflow issue. - -[ V4.4.0.1 ] - Support function: - 1. 802.11R/802.11K I-phone compliant. - 2. Single SKU table now can also take TxBF for reference. - Issue Fixed: - 1. Fix throughput degrade after radio off/on. - 2. Fix CCK TX Power unstable issue. - 3. Reduce bootup calibration time. - 4. Fix firmware download failed after s/w reboot. - 5. Fix RX AMSDU reordering issue. - 6. Fix Counter Measure failed to recover connection access. - 7. Fix DFS NOP and CAC issue. - -[ V4.4.0.0 ] -Formal Release: - Support function: - 1. Tx Beamforming Support - 2. Calibration Data Save in Flash Support - - Issue Fixed: - 1. Fixed a kernel panic issues in repeater mode under heavy traffic loading - 2. Improve stability when playing video streaming and under heavy traffic loading - -[ V4.4.0.0 ] -Beta release 2: - Support function: - 1. DFS master mode and client mode - 2. IGMP snooping - 3. Single SKU - 4. Tx Power Percentage - 5. ApCli Connection Trial - 6. LED - - Issue Fixed: - 1. Site survey cannot find APs in other channels - 2. Correct data rate displayed in iwconfig - 3. Support DFS master/slave mode - 4. Support LED - 5. Fix kernel panic issue during interface down/up - 6. Fix scan list cannot correctly show AP with 11ac capability issue. - 7. 2.4G repeater performance improvement - 8. Support DFS master/slave mode - -[ V4.4.0.0 ] -Beta release 1: - Support function: - 1. 802.11n certification of (AP mode) - 2. Band Steering - 3. Thermal Protection - 4. Concurrent WPS - - Issue Fixed: - 1. Reduce the total time of Wifi interface up - 2. IOT: Fix Iphone-6/S6 set to only BW20 when connected. - 3. Reduce total number of tx/rx packet token to avoid run out of system memory under heavy loading. - 4. Performance improvement of multi-client/repeater/RvR(Waterfall) . - 5. Fix system crash issue during interface down/up - 6. Fix connection stability issue and looping issue of repeater mode. - 7. Fix jitter and packet loss issues in Verivave tests. - 8. Fix potential memory leackage issues. - - Known issues: - 1. 5G Peek Tx/Rx performance on MT7621. (around 850~940Mbps) - 2. Peek throughput drop about 20~30Mbps (happens ramdonly with about 15% chances) - 3. CPU loading increased about 3~5% while running peek throughput. - - -[ V4.4.0.0 ] -Alpha release 1: - support function: - 1. 80211.ac - 2. WPS - 3. Apcli / MAC Repeater - 4. PMF - - Known issues: - 1. VHT MCS8/9 not stable. - 2. Repeater connection stability - 3. DBDC performance - 4. When peer is Ralink device, RDG+Security shows ICV Error - 5. Occasionally Tx/Rx Stop (E3 fix) diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap.c deleted file mode 100644 index ab78f225fe..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap.c +++ /dev/null @@ -1,5362 +0,0 @@ -/**************************************************************************** -* Ralink Tech Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* (c) Copyright 2002, Ralink Technology, Inc. -* -* All rights reserved. Ralink's source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of Ralink Tech. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of Ralink Technology, Inc. is obtained. -**************************************************************************** - - Module Name: - soft_ap.c - - Abstract: - Access Point specific routines and MAC table maintenance routines - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - John Chang 08-04-2003 created for 11g soft-AP - -*/ - -#include "rt_config.h" -#ifdef ONDEMAND_DFS -#include "wlan_config/config_internal.h" -#endif -#define VLAN_HDR_LEN 4 -#ifdef VENDOR_FEATURE7_SUPPORT -#include "arris_wps_gpio_handler.h" -#endif -#ifdef TR181_SUPPORT -#include "hdev/hdev_basic.h" -#endif - -#define MCAST_WCID_TO_REMOVE 0 /* Pat: TODO */ -#ifdef SPECIAL_11B_OBW_FEATURE -#define MAX_TXTD_CCK_CR 20 -#endif /* SPECIAL_11B_OBW_FEATURE */ -#if defined(VOW_SUPPORT) && defined(CONFIG_AP_SUPPORT) -extern VOID vow_avg_pkt_len_reset(struct _RTMP_ADAPTER *ad); -extern VOID vow_avg_pkt_len_calculate(struct _MAC_TABLE_ENTRY *entry); -#endif -#ifdef IAPP_SUPPORT -BOOLEAN IAPP_L2_Update_Frame_Send(RTMP_ADAPTER *pAd, UINT8 *mac, INT wdev_idx); -#endif /*IAPP_SUPPORT*/ -static VOID dynamic_ampdu_efficiency_adjust_all(struct _RTMP_ADAPTER *ad); -char const *pEventText[EVENT_MAX_EVENT_TYPE] = { - "restart access point", "successfully associated", - "has disassociated", "has been aged-out and disassociated", - "active countermeasures", "has disassociated with invalid PSK password" -}; -UCHAR get_apidx_by_addr(RTMP_ADAPTER *pAd, UCHAR *addr) -{ - UCHAR apidx; - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - if (RTMPEqualMemory(addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid, - MAC_ADDR_LEN)) - break; - } - - return apidx; -} - -static INT ap_mlme_set_capability(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss) -{ - struct wifi_dev *wdev = &pMbss->wdev; - BOOLEAN SpectrumMgmt = FALSE; - -#ifdef A_BAND_SUPPORT - - /* Decide the Capability information field */ - /* In IEEE Std 802.1h-2003, the spectrum management bit is enabled in the 5 GHz band */ - if ((wdev->channel > 14) && pAd->CommonCfg.bIEEE80211H == TRUE) - SpectrumMgmt = TRUE; - -#endif /* A_BAND_SUPPORT */ - - pMbss->CapabilityInfo = CAP_GENERATE( - 1, 0, IS_SECURITY_Entry(wdev), - (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1), - wdev->bUseShortSlotTime, SpectrumMgmt); -#ifdef DOT11K_RRM_SUPPORT - - if (IS_RRM_ENABLE(wdev)) - pMbss->CapabilityInfo |= RRM_CAP_BIT; - -#endif /* DOT11K_RRM_SUPPORT */ - - if (pMbss->wdev.bWmmCapable == TRUE) { - /* - In WMM spec v1.1, A WMM-only AP or STA does not set the "QoS" - bit in the capability field of association, beacon and probe - management frames. - */ - /* pMbss->CapabilityInfo |= 0x0200; */ - } - -#ifdef UAPSD_SUPPORT - - if (pMbss->wdev.UapsdInfo.bAPSDCapable == TRUE) { - /* - QAPs set the APSD subfield to 1 within the Capability - Information field when the MIB attribute - dot11APSDOptionImplemented is true and set it to 0 otherwise. - STAs always set this subfield to 0. - */ - pMbss->CapabilityInfo |= 0x0800; - } - -#endif /* UAPSD_SUPPORT */ - return TRUE; -} - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -BOOLEAN ApAutoChannelSkipListBuild(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - UCHAR chGrp = 0; - BOOLEAN status = FALSE; - UCHAR BandIdx = HcGetBandByWdev(wdev); - UCHAR size = 0; - - SET_V10_OFF_CHNL_TIME(pAd, V10_NORMAL_SCAN_TIME); - - if (pAd->ApCfg.bAutoChannelAtBootup[BandIdx]) { - /* ACS Enable */ - if (wdev->channel != 0) { - /* Non-Zero Channel in ACS */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] Non-Zero Chnl in ACS\n", __func__)); - return status; - } else { - AutoChannelSkipListClear(pAd); - if (wlan_config_get_vht_bw(wdev) == VHT_BW_80) { - if (pAd->CommonCfg.bCh144Enabled == FALSE) { - AutoChannelSkipChannels( - pAd, V10_W56_VHT20_SIZE, - GROUP5_LOWER); - AutoChannelSkipChannels(pAd, 1, 144); - } - AutoChannelSkipChannels(pAd, V10_LAST_SIZE, - GROUP6_LOWER); - status = TRUE; - } else if (wlan_config_get_vht_bw(wdev) == - VHT_BW_2040) { - if (pAd->CommonCfg.bCh144Enabled == FALSE) - AutoChannelSkipChannels(pAd, 1, 144); - AutoChannelSkipChannels(pAd, V10_LAST_SIZE, - GROUP6_LOWER); - status = TRUE; - } else - return FALSE; - } - } else { - /* ACS Disable */ - if (wdev->channel == 0) { - /* No Channel in Non-ACS */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] Zero Channel in Non ACS %d\n", __func__, - wdev->channel)); - return status; - } else { - /* Background ACS Algorithm = 3 */ - pAd->ApCfg.AutoChannelAlg[BandIdx] = ChannelAlgBusyTime; - - if (IS_V10_W56_GRP_VALID(pAd)) - chGrp = W56_UA; - else if (IS_V10_W56_VHT80_SWITCHED(pAd) && - (pAd->CommonCfg.bCh144Enabled == FALSE)) - chGrp = W56_UC; - else - chGrp = DfsV10CheckChnlGrp(pAd, wdev->channel); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s] CHgrp %d Channel %d\n", __func__, chGrp, - wdev->channel)); - - /* Clean Skip List */ - AutoChannelSkipListClear(pAd); - - if (chGrp == NA_GRP) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("[%s] Illegal Group Number \n", - __func__)); - return status; - } else if (chGrp == W52) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("[%s] W52\n", __func__)); - AutoChannelSkipChannels(pAd, V10_W53_SIZE, - GROUP2_LOWER); - AutoChannelSkipChannels(pAd, V10_W56_SIZE, - GROUP3_LOWER); - AutoChannelSkipChannels(pAd, V10_LAST_SIZE, - GROUP6_LOWER); - status = TRUE; - } else if (chGrp == W53) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("[%s] W53\n", __func__)); - - if (DfsV10CheckGrpChnlLeft(pAd, W53, - V10_W53_SIZE)) - AutoChannelSkipChannels(pAd, - V10_W52_SIZE, - GROUP1_LOWER); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("[%s] W53 Channel Finish \n", - __func__)); - AutoChannelSkipChannels(pAd, - V10_W53_SIZE, - GROUP2_LOWER); - } - - AutoChannelSkipChannels(pAd, V10_W56_SIZE, - GROUP3_LOWER); - AutoChannelSkipChannels(pAd, V10_LAST_SIZE, - GROUP6_LOWER); - - status = TRUE; - } else if (chGrp == W56_UA || chGrp == W56_UB || - chGrp == W56_UC) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("[%s] W56\n", __func__)); - SET_V10_W56_GRP_VALID(pAd, FALSE); - - if (wlan_config_get_vht_bw(wdev) == - VHT_BW_2040) { - if (pAd->CommonCfg.bCh144Enabled) - size = V10_W56_VHT80_SIZE; - else - size = V10_W56_VHT80_SIZE - - V10_W56_VHT80_C_SIZE; - - if (IS_V10_W56_VHT80_SWITCHED(pAd) && - chGrp == W56_UC) - AutoChannelSkipChannels( - pAd, size, - GROUP3_LOWER); - - AutoChannelSkipChannels(pAd, - V10_W52_SIZE, - GROUP1_LOWER); - AutoChannelSkipChannels(pAd, - V10_W53_SIZE, - GROUP2_LOWER); - if (pAd->CommonCfg.bCh144Enabled == - FALSE) - AutoChannelSkipChannels(pAd, 1, - 144); - AutoChannelSkipChannels(pAd, - V10_LAST_SIZE, - GROUP6_LOWER); - status = TRUE; - } else if (wlan_config_get_vht_bw(wdev) == - VHT_BW_80) { - if (chGrp == W56_UC && - (pAd->CommonCfg.bCh144Enabled == - FALSE)) { - MTWF_LOG( - DBG_CAT_ALL, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("[%s]Incorrect Channel W56 C\n", - __func__)); - return status; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] W56_80\n", __func__)); - AutoChannelSkipChannels(pAd, - V10_W52_SIZE, - GROUP1_LOWER); - AutoChannelSkipChannels(pAd, - V10_W53_SIZE, - GROUP2_LOWER); - if (pAd->CommonCfg.bCh144Enabled == - FALSE) { - AutoChannelSkipChannels( - pAd, V10_W56_VHT20_SIZE, - GROUP5_LOWER); - AutoChannelSkipChannels(pAd, 1, - 144); - } - AutoChannelSkipChannels(pAd, - V10_LAST_SIZE, - GROUP6_LOWER); - status = TRUE; - } - } - } - } - - return status; -} -#endif - -UCHAR ApAutoChannelAtBootUp(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ -#define SINGLE_BAND 0 -#define DUAL_BAND 1 - - UCHAR NewChannel; - BOOLEAN IsAband; - UCHAR BandIdx = BAND0; - AUTO_CH_CTRL *pAutoChCtrl = NULL; -#ifdef TR181_SUPPORT - struct hdev_obj *hdev = (struct hdev_obj *)wdev->pHObj; -#endif - UCHAR vht_bw = wlan_config_get_vht_bw(wdev); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s----------------->\n", __func__)); - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[41m %s(): wdev is NULL !!\x1b[m\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s<-----------------\n", __func__)); - return FALSE; - } - - BandIdx = HcGetBandByWdev(wdev); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: AutoChannelBootup[%d] = %d\n", __func__, BandIdx, - pAd->ApCfg.bAutoChannelAtBootup[BandIdx])); - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - if (IS_SUPPORT_V10_DFS(pAd) && (IS_V10_BOOTACS_INVALID(pAd) == FALSE) && - (IS_V10_APINTF_DOWN(pAd) == FALSE)) { - if (ApAutoChannelSkipListBuild(pAd, wdev) == FALSE) { - return FALSE; - } - } else if (!pAd->ApCfg.bAutoChannelAtBootup[BandIdx]) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s<-----------------\n", __func__)); - return FALSE; - } -#else - if (!pAd->ApCfg.bAutoChannelAtBootup[BandIdx]) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s<-----------------\n", __func__)); - return FALSE; - } -#endif - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[41m %s(): wdev is NULL !!\x1b[m\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s<-----------------\n", __func__)); - return FALSE; - } - - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - /* Now Enable RxTx*/ - RTMPEnableRxTx(pAd); - - if ((wdev->channel == 0) -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - || - (IS_SUPPORT_V10_DFS(pAd) && (IS_V10_BOOTACS_INVALID(pAd) == FALSE)) -#endif -#ifdef ONDEMAND_DFS - || (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd) && - (RadarChannelCheck(pAd, wdev->channel))) - /*Invoke ACS IF ONDEMAND DFS & USER Selected DFS CHANNEL*/ -#endif - ) { -#ifdef ONDEMAND_DFS - RetriggerACS: -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PhyMode: %d\n", __func__, wdev->PhyMode)); - - if (WMODE_CAP_5G(wdev->PhyMode)) - IsAband = TRUE; - else - IsAband = FALSE; - - /* Now we can receive the beacon and do ACS */ - if (pAutoChCtrl->AutoChSelCtrl.ACSChStat != - ACS_CH_STATE_SELECTED) { -#ifdef ONDEMAND_DFS - if (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd) && - RadarChannelCheck(pAd, wdev->channel)) { - /* Pre-Selected Channel/ACS Channel is DFS: Skip DFS ACS next time */ - pAd->BgndScanCtrl.SkipDfsChannel = TRUE; - /* Store Current DFS Channel as Outband Channel */ - pAd->CommonCfg.DfsParameter.OutBandCh = - wdev->channel; - } -#endif - /* Disable MibBucket during doing ACS */ - pAd->MsMibBucket.Enabled = FALSE; - pAd->OneSecMibBucket.Enabled[BandIdx] = FALSE; - - NewChannel = APAutoSelectChannel( - pAd, wdev, pAd->ApCfg.AutoChannelAlg[BandIdx], - IsAband); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s : Auto channel selection: Selected channel = %d, IsAband = %d\n", - __func__, NewChannel, IsAband)); - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - if (IS_SUPPORT_V10_DFS(pAd) && NewChannel) { - SET_V10_BOOTACS_INVALID(pAd, TRUE); - DfsV10ACSMarkChnlConsumed(pAd, NewChannel); - } -#endif - } else { -#ifdef ONDEMAND_DFS - /* Pick InBand Channel for OnDemand DFS */ - if (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd)) - NewChannel = - pAd->CommonCfg.DfsParameter.Band0Ch; - else -#endif - NewChannel = pAutoChCtrl->AutoChSelCtrl.SelCh; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[ApAutoChannelAtBootUp] ACS of BandIdx = %d is already DONE, Channel = %d\n", - BandIdx, NewChannel)); - } - -#ifdef ONDEMAND_DFS - if ((IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd)) && - (RadarChannelCheck(pAd, NewChannel)) && - (!GET_BGND_STATE(pAd, BGND_ONDMND_CNLSWITCH_ON))) { - /* ACS returned DFS Channel as Output */ - struct wlan_config *cfg = NULL; - UCHAR phy_bw = 0; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg == NULL) - return FALSE; - - if (cfg->ht_conf.ht_bw == HT_BW_20) - phy_bw = BW_20; - else if (cfg->ht_conf.ht_bw == HT_BW_40) { - if (cfg->vht_conf.vht_bw == VHT_BW_2040) - phy_bw = BW_40; - else if (cfg->vht_conf.vht_bw == VHT_BW_80) - phy_bw = BW_80; - else if (cfg->vht_conf.vht_bw == VHT_BW_160) - phy_bw = BW_160; - else if (cfg->vht_conf.vht_bw == VHT_BW_8080) - phy_bw = BW_8080; - } - - /* Record Original DFS Channel as Outband Channel */ - pAd->CommonCfg.DfsParameter.OutBandCh = NewChannel; - pAd->CommonCfg.DfsParameter.OutBandBw = phy_bw; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s : Outband channel = %d,BW = %d\n", - __func__, NewChannel, phy_bw)); - /* Retrigger ACS as DFS Channel is selected at Bootup */ - pAutoChCtrl->AutoChSelCtrl.ACSChStat = - ACS_CH_STATE_NONE; - pAd->BgndScanCtrl.SkipDfsChannel = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Retrigger ACS\n", __func__)); - /* Retrigger ACS to find Non-DFS Channel */ - goto RetriggerACS; - } - - /* Clear Non-DFS Channel Selection Flag */ - if ((IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd)) && - (pAd->BgndScanCtrl.SkipDfsChannel)) { - pAd->BgndScanCtrl.SkipDfsChannel = FALSE; - } -#endif - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] Chnl Restore Enbl %d\n", __func__, - IS_V10_OLD_CHNL_VALID(wdev))); - if (!IS_V10_OLD_CHNL_VALID(wdev)) -#endif - /* Update channel of wdev as new channel */ - AutoChSelUpdateChannel(pAd, NewChannel, IsAband, wdev); - -#ifdef MT_DFS_SUPPORT - /* Check new channel is DFS channel or not */ - RadarStateCheck(pAd, wdev); -#endif - if ((pAd->ApCfg.bAutoChannelAtBootup[BandIdx] == TRUE) && - (vht_bw == VHT_BW_8080)) { - wlan_config_set_cen_ch_2(wdev, - wdev->auto_channel_cen_ch_2); - wlan_operate_set_cen_ch_2(wdev, - wdev->auto_channel_cen_ch_2); - } - - /* Update primay channel */ - wlan_operate_set_prim_ch(wdev, wdev->channel); -#ifdef TR181_SUPPORT - pAd->ApBootACSChannelChangePerBandCount[BandIdx]++; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:Boot:%d Total:%d\n", __func__, - pAd->ApBootACSChannelChangePerBandCount[BandIdx], - (hdev->rdev->pRadioCtrl->TotalChannelChangeCount + - pAd->ApBootACSChannelChangePerBandCount[BandIdx]))); -#endif - - /* Enable MibBucket after ACS done */ - pAd->MsMibBucket.Enabled = TRUE; - pAd->OneSecMibBucket.Enabled[BandIdx] = TRUE; -#ifdef MT_DFS_SUPPORT - DfsBuildChannelList(pAd, wdev); -#endif - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s<-----------------\n", __func__)); - return TRUE; -} - -/* - ========================================================================== - Description: - Check to see the exist of long preamble STA in associated list - ========================================================================== - */ -static BOOLEAN ApCheckLongPreambleSTA(RTMP_ADAPTER *pAd) -{ - UCHAR i; - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if (!IS_ENTRY_CLIENT(pEntry) || (pEntry->Sst != SST_ASSOC)) - continue; - - if (!CAP_IS_SHORT_PREAMBLE_ON(pEntry->CapabilityInfo)) { - return TRUE; - } - } - - return FALSE; -} - -/* - ========================================================================== - Description: - Initialize AP specific data especially the NDIS packet pool that's - used for wireless client bridging. - ========================================================================== - */ - -static VOID ap_run_at_boot(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ -#ifdef CONFIG_INIT_RADIO_ONOFF - if (pAd->ApCfg.bRadioOn) -#endif - if (ApAutoChannelAtBootUp(pAd, wdev) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[41m %s() : ACS is disable !!\x1b[m\n", - __func__)); - } -#ifdef ONDEMAND_DFS - else { - if ((IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd)) && - (RadarChannelCheck( - pAd, - pAd->CommonCfg.DfsParameter.OutBandCh)) && - (!RadarChannelCheck( - pAd, - pAd->CommonCfg.DfsParameter.Band0Ch))) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[41m %s() : OutBand Chnl %d Bw %d\x1b[m\n", - __func__, - pAd->CommonCfg.DfsParameter.OutBandCh, - pAd->CommonCfg.DfsParameter.OutBandBw)); - /* Restore to Default Bgnd State */ - pAd->BgndScanCtrl.BgndScanStatMachine.CurrState = - BGND_SCAN_IDLE; - /* Initiate OnDemand DFS Zero-Wait State Machine */ - DfsDedicatedOutBandSetChannel( - pAd, - pAd->CommonCfg.DfsParameter.OutBandCh, - pAd->CommonCfg.DfsParameter.Bw); - } - } -#endif - -#ifdef BACKGROUND_SCAN_SUPPORT - { -#ifdef DOT11_VHT_AC - UCHAR vht_bw = wlan_operate_get_vht_bw(wdev); -#endif - - if (pAd->CommonCfg.dbdc_mode == TRUE) { - pAd->BgndScanCtrl.BgndScanSupport = 0; - pAd->BgndScanCtrl.DfsZeroWaitSupport = 0; - } -#ifdef DOT11_VHT_AC - else if (vht_bw == VHT_BW_160 || vht_bw == VHT_BW_8080) { - pAd->BgndScanCtrl.BgndScanSupport = 0; - pAd->BgndScanCtrl.DfsZeroWaitSupport = 0; - } - -#endif /* DOT11_VHT_AC */ - else - pAd->BgndScanCtrl.BgndScanSupport = 1; - -#ifdef MT_DFS_SUPPORT - /* Update bInitMbssZeroWait for MBSS Zero Wait */ - UPDATE_MT_INIT_ZEROWAIT_MBSS(pAd, FALSE); -#endif /* MT_DFS_SUPPORT */ - } -#endif /* BACKGROUND_SCAN_SUPPORT */ -} - -NDIS_STATUS APOneShotSettingInitialize(RTMP_ADAPTER *pAd) -{ - NDIS_STATUS Status = NDIS_STATUS_SUCCESS; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("---> APOneShotSettingInitialize\n")); - RTMPInitTimer(pAd, &pAd->ApCfg.CounterMeasureTimer, - GET_TIMER_FUNCTION(CMTimerExec), pAd, FALSE); -#ifdef IDS_SUPPORT - /* Init intrusion detection timer */ - RTMPInitTimer(pAd, &pAd->ApCfg.IDSTimer, - GET_TIMER_FUNCTION(RTMPIdsPeriodicExec), pAd, FALSE); - pAd->ApCfg.IDSTimerRunning = FALSE; -#endif /* IDS_SUPPORT */ -#ifdef IGMP_SNOOP_SUPPORT - MulticastFilterTableInit(pAd, &pAd->pMulticastFilterTable); - MulticastWLTableInit(pAd, &pAd->pMcastWLTable); -#endif /* IGMP_SNOOP_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - RRM_CfgInit(pAd); -#endif /* DOT11K_RRM_SUPPORT */ - /* Init BssTab & ChannelInfo tabbles for auto channel select.*/ - AutoChBssTableInit(pAd); - ChannelInfoInit(pAd); -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - RTMP_11N_D3_TimerInit(pAd); -#endif /* DOT11N_DRAFT3 */ -#endif /*DOT11_N_SUPPORT*/ - - /* beacon init for USB/SDIO */ - asic_bss_beacon_init(pAd); - -#ifdef AP_QLOAD_SUPPORT - QBSS_LoadInit(pAd); -#endif /* AP_QLOAD_SUPPORT */ - /* - Some modules init must be called before APStartUp(). - Or APStartUp() will make up beacon content and call - other modules API to get some information to fill. - */ -#ifdef RTMP_RBUS_SUPPORT - - if (pAd->infType == RTMP_DEV_INF_RBUS) { -#ifdef VIDEO_TURBINE_SUPPORT - VideoTurbineDynamicTune(pAd); -#endif /* VIDEO_TURBINE_SUPPORT */ - } - -#endif /* RTMP_RBUS_SUPPORT */ -#ifdef MAT_SUPPORT - MATEngineInit(pAd); -#endif /* MAT_SUPPORT */ -#ifdef CLIENT_WDS - CliWds_ProxyTabInit(pAd); -#endif /* CLIENT_WDS */ - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--- APOneShotSettingInitialize\n")); - return Status; -} - -/* - ========================================================================== - Description: - Shutdown AP and free AP specific resources - ========================================================================== - */ -VOID APShutdown(RTMP_ADAPTER *pAd) -{ - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("---> APShutdown\n")); -#ifdef MT_MAC - /* Disable RX */ - /* MtAsicSetMacTxRx(pAd, ASIC_MAC_RX, FALSE,0); */ -#ifdef RTMP_MAC_PCI - APStop(pAd, pMbss, AP_BSS_OPER_ALL); -#endif /* RTMP_MAC_PCI */ - /* MlmeRadioOff(pAd); */ -#else - MlmeRadioOff(pAd); -#ifdef RTMP_MAC_PCI - APStop(pAd, pMbss, AP_BSS_OPER_ALL); -#endif /* RTMP_MAC_PCI */ -#endif -#ifdef INTELP6_SUPPORT - pAd->pre_n9_heart_beat_cnt = 0; - pAd->pre_cr4_heart_beat_cnt = 0; -#endif - /*remove sw related timer and table*/ - rtmp_ap_exit(pAd); -#ifdef FTM_SUPPORT - FtmMgmtExit(pAd); -#endif /* FTM_SUPPORT */ - NdisFreeSpinLock(&pAd->MacTabLock); -#ifdef WDS_SUPPORT - NdisFreeSpinLock(&pAd->WdsTab.WdsTabLock); -#endif /* WDS_SUPPORT */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--- APShutdown\n")); -} - -/* - ========================================================================== - Description: - Update ERP IE and CapabilityInfo based on STA association status. - The result will be auto updated into the next outgoing BEACON in next - TBTT interrupt service routine - ========================================================================== - */ - -VOID ApUpdateCapabilityAndErpIe(RTMP_ADAPTER *pAd, struct _BSS_STRUCT *mbss) -{ - UCHAR i, ErpIeContent = 0; - BOOLEAN ShortSlotCapable = 0; - BOOLEAN bUseBGProtection; - BOOLEAN LegacyBssExist; - MAC_TABLE_ENTRY *pEntry = NULL; - USHORT *pCapInfo = NULL; - struct wifi_dev *wdev = &mbss->wdev; - ADD_HT_INFO_IE *addht = wlan_operate_get_addht(wdev); - UCHAR Channel = wdev->channel; - UCHAR PhyMode = wdev->PhyMode; - - if (WMODE_EQUAL(PhyMode, WMODE_B)) - return; - - ShortSlotCapable = wdev->bUseShortSlotTime; - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (!IS_ENTRY_CLIENT(pEntry) || (pEntry->Sst != SST_ASSOC)) - continue; - - if (wdev != pEntry->wdev) - continue; - - /* at least one 11b client associated, turn on ERP.NonERPPresent bit */ - /* almost all 11b client won't support "Short Slot" time, turn off for maximum compatibility */ - if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) { - ShortSlotCapable = FALSE; - ErpIeContent |= 0x01; - } - - /* at least one client can't support short slot */ - if ((pEntry->CapabilityInfo & 0x0400) == 0) - ShortSlotCapable = FALSE; - } - - /* legacy BSS exist within 5 sec */ - if ((pAd->ApCfg.LastOLBCDetectTime + (5 * OS_HZ)) > pAd->Mlme.Now32) - LegacyBssExist = TRUE; - else - LegacyBssExist = FALSE; - - /* decide ErpIR.UseProtection bit, depending on pAd->CommonCfg.UseBGProtection - AUTO (0): UseProtection = 1 if any 11b STA associated - ON (1): always USE protection - OFF (2): always NOT USE protection - */ - if (pAd->CommonCfg.UseBGProtection == 0) { - ErpIeContent = (ErpIeContent) ? 0x03 : 0x00; - - /*if ((pAd->ApCfg.LastOLBCDetectTime + (5 * OS_HZ)) > pAd->Mlme.Now32) // legacy BSS exist within 5 sec */ - if (LegacyBssExist) { - ErpIeContent |= 0x02; /* set Use_Protection bit */ - } - } else if (pAd->CommonCfg.UseBGProtection == 1) - ErpIeContent |= 0x02; - - bUseBGProtection = - (pAd->CommonCfg.UseBGProtection == 1) || /* always use */ - ((pAd->CommonCfg.UseBGProtection == 0) && - ERP_IS_USE_PROTECTION(ErpIeContent)); -#ifdef A_BAND_SUPPORT - - /* always no BG protection in A-band. falsely happened when switching A/G band to a dual-band AP */ - if (Channel > 14) - bUseBGProtection = FALSE; - -#endif /* A_BAND_SUPPORT */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("-- bUseBGProtection: %s, BG_PROTECT_INUSED: %s, ERP IE Content: 0x%x\n", - (bUseBGProtection) ? "Yes" : "No", - (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED)) ? - "Yes" : - "No", - ErpIeContent)); - - if (bUseBGProtection != - OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED)) { - USHORT OperationMode = 0; - BOOLEAN bNonGFExist = 0; -#ifdef DOT11_N_SUPPORT - OperationMode = addht->AddHtInfo2.OperaionMode; - bNonGFExist = pAd->MacTab.fAnyStationNonGF; -#endif /* DOT11_N_SUPPORT */ - - if (bUseBGProtection) - OPSTATUS_SET_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); - else - OPSTATUS_CLEAR_FLAG(pAd, - fOP_STATUS_BG_PROTECTION_INUSED); - } - - /* Decide Barker Preamble bit of ERP IE */ - if ((pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong) || - (ApCheckLongPreambleSTA(pAd) == TRUE)) - mbss->ErpIeContent = (ErpIeContent | 0x04); - else - mbss->ErpIeContent = ErpIeContent; - -#ifdef A_BAND_SUPPORT - - /* Force to use ShortSlotTime at A-band */ - if (Channel > 14) - ShortSlotCapable = TRUE; - -#endif /* A_BAND_SUPPORT */ - pCapInfo = &(mbss->CapabilityInfo); - - /* In A-band, the ShortSlotTime bit should be ignored. */ - if (ShortSlotCapable -#ifdef A_BAND_SUPPORT - && (Channel <= 14) -#endif /* A_BAND_SUPPORT */ - ) - (*pCapInfo) |= 0x0400; - else - (*pCapInfo) &= 0xfbff; - - if (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong) - (*pCapInfo) &= (~0x020); - else - (*pCapInfo) |= 0x020; - - /*update slot time only when value is difference*/ - if (wdev->bUseShortSlotTime != ShortSlotCapable) { - HW_SET_SLOTTIME(pAd, ShortSlotCapable, Channel, wdev); - wdev->bUseShortSlotTime = ShortSlotCapable; - } -} - -static INT ap_hw_tb_init(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():Reset WCID Table\n", __func__)); - HW_SET_DEL_ASIC_WCID(pAd, WCID_ALL); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():Reset Sec Table\n", __func__)); - return TRUE; -} - -/* - ========================================================================== - Description: - Start AP service. If any vital AP parameter is changed, a STOP-START - sequence is required to disassociate all STAs. - - IRQL = DISPATCH_LEVEL.(from SetInformationHandler) - IRQL = PASSIVE_LEVEL. (from InitializeHandler) - - Note: - Can't call NdisMIndicateStatus on this routine. - - RT61 is a serialized driver on Win2KXP and is a deserialized on Win9X - Serialized callers of NdisMIndicateStatus must run at IRQL = DISPATCH_LEVEL. - - ========================================================================== - */ - -VOID APStartUpForMbss(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss) -{ - struct wifi_dev *wdev = &pMbss->wdev; - BOOLEAN bWmmCapable = FALSE; - EDCA_PARM *pEdca = NULL, *pBssEdca = NULL; - UCHAR phy_mode = pAd->CommonCfg.cfg_wmode; - UCHAR ucBandIdx = 0; -#ifdef SPECIAL_11B_OBW_FEATURE - UINT32 phy_val_read = 0; - UINT32 phy_val_write = 0; - UINT32 reg_addr = 0; - UCHAR i = 0; - /* specific values to be set for OBW 15.75 MHZ on ch 1-14 */ - UINT32 phy_reg_value_table[MAX_TXTD_CCK_CR] = { - 0x3FEFF7FD, 0x3FDFF3FC, 0x3FBFEBFA, 0x3F9FE3F8, 0x3F7FDBF6, - 0x3F5FD7F5, 0x3F5FD7F6, 0x3F6FE3F9, 0x3FBFF801, 0x0050240E, - 0x0130641F, 0x0260B836, 0x03F12051, 0x05B1946F, 0x07A2108F, - 0x09928CAD, 0x0B62FCC8, 0x0D035CDE, 0x0E33A0EC, 0x0EF3C4F2 - }; -#endif /* SPECIAL_11B_OBW_FEATURE */ -#ifdef GREENAP_SUPPORT - struct greenap_ctrl *greenap = &pAd->ApCfg.greenap; - UCHAR amount_of_band = HcGetAmountOfBand(pAd); -#endif /* GREENAP_SUPPORT */ -#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) - BOOLEAN bZeroWaitStop; -#endif /* defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) */ - struct wifi_dev *wdev_active = NULL; - unsigned char j = 0; - -#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) - bZeroWaitStop = MbssZeroWaitStopValidate(pAd, pMbss->wdev.channel, - pMbss->mbss_idx); -#endif /* defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s(), CfgMode:%d\n", __func__, phy_mode)); - - /* If any of the interface is down and channel is changed for that radio*/ - /*we need to sync the channel of the wdev with active wdev*/ - for (j = 0; j < WDEV_NUM_MAX; j++) { - wdev_active = pAd->wdev_list[j]; - if (wdev_active && HcIsRadioAcq(wdev_active) && - (HcGetBandByWdev(wdev) == HcGetBandByWdev(wdev_active))) { - wdev->channel = wdev_active->channel; - break; - } - } - - /*Ssid length sanity check.*/ - if ((pMbss->SsidLen <= 0) || (pMbss->SsidLen > MAX_LEN_OF_SSID)) { - NdisMoveMemory(pMbss->Ssid, "HT_AP", 5); - pMbss->Ssid[5] = '0' + pMbss->mbss_idx; - pMbss->SsidLen = 6; - } - - if (wdev->func_idx == 0) - MgmtTableSetMcastEntry(pAd, MCAST_WCID_TO_REMOVE); - - APSecInit(pAd, wdev); - -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - if (IS_MAP_ENABLE(pAd)) - map_a4_init(pAd, pMbss->mbss_idx, TRUE); -#endif -#if defined(A4_CONN) && defined(IGMP_SNOOP_SUPPORT) - /* Deduce IPv6 Link local address for this MBSS & IPv6 format checksum for use in MLD query message*/ - calc_mldv2_gen_query_chksum(pAd, pMbss); -#endif - -#if defined(WAPP_SUPPORT) - wapp_init(pAd, pMbss); -#endif - - ap_mlme_set_capability(pAd, pMbss); -#ifdef WSC_V2_SUPPORT - - if (wdev->WscControl.WscV2Info.bEnableWpsV2) { - /* - WPS V2 doesn't support Chiper WEP and TKIP. - */ - struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig; - - if (IS_CIPHER_WEP_TKIP_ONLY(pSecConfig->PairwiseCipher) || - (pMbss->bHideSsid)) - WscOnOff(pAd, wdev->func_idx, TRUE); - else - WscOnOff(pAd, wdev->func_idx, FALSE); - } - -#endif /* WSC_V2_SUPPORT */ - - /* If any BSS is WMM Capable, we need to config HW CRs */ - if (wdev->bWmmCapable) - bWmmCapable = TRUE; - - if (WMODE_CAP_N(wdev->PhyMode) || bWmmCapable) { - pEdca = &pAd->CommonCfg.APEdcaParm[wdev->EdcaIdx]; - - /* EDCA parameters used for AP's own transmission */ - if (pEdca->bValid == FALSE) - set_default_ap_edca_param(pEdca); - - pBssEdca = wlan_config_get_ht_edca(wdev); - - if (pBssEdca) { - /* EDCA parameters to be annouced in outgoing BEACON, used by WMM STA */ - if (pBssEdca->bValid == FALSE) - set_default_sta_edca_param(pBssEdca); - } - } - -#ifdef DOT11_N_SUPPORT -#ifdef EXT_BUILD_CHANNEL_LIST - BuildChannelListEx(pAd, wdev); -#else - BuildChannelList(pAd, wdev); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[APStartUpForMbss] BuildChannelList, #711\n")); - RTMPSetPhyMode(pAd, wdev, wdev->PhyMode); - /*update rate info for wdev*/ - RTMPUpdateRateInfo(wdev->PhyMode, &wdev->rate); - - if (!WMODE_CAP_N(wdev->PhyMode)) - wlan_config_set_ht_bw(wdev, HT_BW_20); - -#endif /*DOT11_N_SUPPORT*/ - MlmeUpdateTxRates(pAd, FALSE, wdev->func_idx); -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(wdev->PhyMode)) - MlmeUpdateHtTxRates(pAd, wdev->func_idx); - -#endif /* DOT11_N_SUPPORT */ -#ifdef CONFIG_INIT_RADIO_ONOFF - if (pAd->ApCfg.bRadioOn) -#endif - if (WDEV_WITH_BCN_ABILITY(wdev) && wdev->bAllowBeaconing) { - if (wdev_do_linkup(wdev, NULL) != TRUE) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: link up fail!!\n", __func__)); - } - -#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) - ZeroWaitUpdateForMbss(pAd, bZeroWaitStop, pMbss->wdev.channel, - pMbss->mbss_idx); -#endif /* defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) */ - ucBandIdx = HcGetBandByWdev(wdev); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BssIndex = %d channel = %d\n", __func__, ucBandIdx, - pMbss->wdev.channel)); -#ifdef SINGLE_SKU_V2 -#ifdef RF_LOCKDOWN - - /* Check RF lock Status */ - if (chip_check_rf_lock_down(pAd)) { - pAd->CommonCfg.SKUenable[ucBandIdx] = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: RF lock down!! SKUenable = 1!!\n", __func__)); - } - -#endif /* RF_LOCKDOWN */ - -#if defined(MT7615) || defined(MT7622) - /* enable/disable SKU via profile */ - TxPowerSKUCtrl(pAd, pAd->CommonCfg.SKUenable[ucBandIdx], ucBandIdx); - - /* enable/disable BF Backoff via profile */ - TxPowerBfBackoffCtrl(pAd, pAd->CommonCfg.BFBACKOFFenable[ucBandIdx], - ucBandIdx); -#else -#endif /* defined(MT7615) || defined(MT7622) */ -#endif /* SINGLE_SKU_V2*/ - /* enable/disable Power Percentage via profile */ - TxPowerPercentCtrl(pAd, pAd->CommonCfg.PERCENTAGEenable[ucBandIdx], - ucBandIdx); - - /* Tx Power Percentage value via profile */ - TxPowerDropCtrl(pAd, pAd->CommonCfg.ucTxPowerPercentage[ucBandIdx], - ucBandIdx); - - /* Config Tx CCK Stream */ - TxCCKStreamCtrl(pAd, pAd->CommonCfg.CCKTxStream[ucBandIdx], ucBandIdx); - -#ifdef RF_LOCKDOWN - - /* Check RF lock Status */ - if (chip_check_rf_lock_down(pAd)) { - pAd->CommonCfg.BFBACKOFFenable[ucBandIdx] = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: RF lock down!! BFBACKOFFenable = 1!!\n", - __func__)); - } - -#endif /* RF_LOCKDOWN */ -#ifdef TX_POWER_CONTROL_SUPPORT - /* config Power boost table via profile */ - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_CCK_OFDM, - pAd->CommonCfg.cPowerUpCckOfdm[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_HT20, - pAd->CommonCfg.cPowerUpHt20[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_HT40, - pAd->CommonCfg.cPowerUpHt40[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_VHT20, - pAd->CommonCfg.cPowerUpVht20[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_VHT40, - pAd->CommonCfg.cPowerUpVht40[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_VHT80, - pAd->CommonCfg.cPowerUpVht80[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_VHT160, - pAd->CommonCfg.cPowerUpVht160[ucBandIdx]); -#endif /* TX_POWER_CONTROL_SUPPORT */ - /*init tx/rx stream */ - hc_set_rrm_init(wdev); -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if (wf_drv_tbl.wf_fwd_check_device_hook) - wf_drv_tbl.wf_fwd_check_device_hook(wdev->if_dev, INT_MBSSID, - pMbss->mbss_idx, - wdev->channel, 1); - -#endif /* CONFIG_WIFI_PKT_FWD */ - -#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) - /* Update bInitMbssZeroWait for MBSS Zero Wait */ - UPDATE_MT_INIT_ZEROWAIT_MBSS(pAd, FALSE); -#endif /* defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) */ -#ifdef VOW_SUPPORT - vow_mbss_init(pAd, wdev); -#endif /* VOW_SUPPORT */ -#ifdef GREENAP_SUPPORT - greenap_check_allow_status(pAd, greenap); - - if (greenap_get_capability(greenap) && - greenap_get_allow_status(greenap)) { - for (ucBandIdx = 0; ucBandIdx < amount_of_band; ucBandIdx++) { - greenap_check_peer_connection_status( - pAd, ucBandIdx, FALSE, - greenap_get_allow_status(greenap)); - } - } - -#endif /* GREENAP_SUPPORT */ -#ifdef BAND_STEERING -#ifdef CONFIG_AP_SUPPORT - if (pAd->ApCfg.BandSteering) { - PBND_STRG_CLI_TABLE table; - - table = Get_BndStrgTable(pAd, pMbss->mbss_idx); - - if (!table) { - /* Init time table may not init as wdev not populated */ - BndStrg_TableInit(pAd, pMbss->mbss_idx); - table = Get_BndStrgTable(pAd, pMbss->mbss_idx); - } - - if (table) { - /* Inform daemon interface ready */ - BndStrg_SetInfFlags(pAd, &pMbss->wdev, table, TRUE); - } - } -#ifdef SPECIAL_11B_OBW_FEATURE - if (wdev->channel >= 1 && wdev->channel <= 14) { - if (!pAd->CommonCfg.dbdc_mode) { - reg_addr = PHY_BAND0_PHY_CTRL_1; - phy_val_read = 0; - PHY_IO_READ32(pAd, reg_addr, &phy_val_read); - phy_val_write = phy_val_read & (~(1 << 30)); - printk("[%s]phy_val_write = %x for register = %x\n", - __func__, phy_val_write, reg_addr); - PHY_IO_WRITE32(pAd, reg_addr, phy_val_write); - } - PHY_IO_READ32(pAd, reg_addr, &phy_val_read); - if (phy_val_write != phy_val_read) - printk("[%s] reg write not successful for reg = %x\n", - __func__, reg_addr); - for (i = 0; i < MAX_TXTD_CCK_CR; i++) { - reg_addr = (CR_TXTD_CCK_0 + (i * 4)); - phy_val_read = 0; - phy_val_write = 0; - phy_val_write = phy_reg_value_table[i]; - PHY_IO_WRITE32(pAd, reg_addr, phy_val_write); - PHY_IO_READ32(pAd, reg_addr, &phy_val_read); - if (phy_val_write != phy_val_read) - printk("[%s] reg write not successful for reg = %x\n", - __func__, reg_addr); - } - } -#endif /* SPECIAL_11B_OBW_FEATURE */ -#endif /* CONFIG_AP_SUPPORT */ -#endif /* BAND_STEERING */ - -#ifdef CONFIG_DOT11U_INTERWORKING - pMbss->GASCtrl.b11U_enable = 1; -#endif /* CONFIG_DOT11U_INTERWORKING */ - -#ifdef OCE_SUPPORT - if (IS_OCE_ENABLE(wdev)) { - OCE_CTRL *oceCtrl = &wdev->OceCtrl; - BOOLEAN Cancelled; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (oceCtrl->ShortSSIDEnabled) - oceCtrl->ShortSSID = - Crcbitbybitfast(pMbss->Ssid, pMbss->SsidLen); - - if (IS_OCE_FD_FRAME_ENABLE(wdev) && IS_FD_FRAME_FW_MODE(cap)) { - OceSendFilsDiscoveryAction( - pAd, &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev); - } - - if (IS_OCE_RNR_ENABLE(wdev)) - RTMPSetTimer(&pAd->ApCfg.APAutoScanNeighborTimer, - OCE_RNR_SCAN_PERIOD); - else - RTMPCancelTimer(&pAd->ApCfg.APAutoScanNeighborTimer, - &Cancelled); - } -#endif /* OCE_SUPPORT */ -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - wapp_send_bss_state_change(pAd, wdev, WAPP_BSS_START); -#endif /*WAPP_SUPPORT*/ - -#ifdef CONFIG_AP_SUPPORT -#ifdef MIN_PHY_RATE_SUPPORT - /*Send In-Band Command to N9 to Config Min PHy Rate*/ - MtCmdSetMinPhyRate(pAd, &pMbss->wdev); -#endif /* MIN_PHY_RATE_SUPPORT */ - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT - DfsThresholdParamInit(pAd); - Set_DfsDefaultRDDThresholdParam(pAd); -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef ANTENNA_CONTROL_SUPPORT - Antenna_Control_Init(pAd, wdev); -#endif /* ANTENNA_CONTROL_SUPPORT */ -#ifdef MGMT_TXPWR_CTRL - /*clear old data for iwpriv set channel*/ - wdev->bPwrCtrlEn = FALSE; - wdev->TxPwrDelta = 0; - /* Get EPA info by Tx Power info cmd*/ - pAd->ApCfg.fEpaReq = TRUE; - TxPowerShowInfo(pAd, 0, ucBandIdx); - - /* Update beacon/probe TxPwr wrt profile param */ - if (wdev->MgmtTxPwr) { - /* wait until TX Pwr event rx*/ - RtmpusecDelay(50); - update_mgmt_frame_power(pAd, wdev); - } -#endif -} - -VOID APStartUpByBss(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss) -{ - struct wifi_dev *wdev; -#ifdef CUSTOMER_DCC_FEATURE - UCHAR bandIdx = 0; -#endif - if (pMbss == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() Invalid Mbss\n", __func__)); - return; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s() mbss_idx %d\n", __func__, pMbss->mbss_idx)); - wdev = &pMbss->wdev; - - /* Workaround start: Let Rx packet can be dequeued from PSE or Tx CMD will fail */ - /* Workaround end */ - - /* setup tx preamble */ - MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble); - /* Clear BG-Protection flag */ - OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); - /* default NO_PROTECTION */ - AsicUpdateProtect(pAd); - - /* Update devinfo for any phymode change */ - if (wdev_do_open(wdev) != TRUE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() open fail!!!\n", __func__)); - - /* Update ERP */ - ApUpdateCapabilityAndErpIe(pAd, pMbss); -#ifndef CONFIG_INIT_RADIO_ONOFF - APStartUpForMbss(pAd, pMbss); -#endif -#ifdef DOT11_N_SUPPORT - /* Update HT & GF Protect */ - APUpdateOperationMode(pAd, wdev); -#endif /* DOT11_N_SUPPORT */ - - /* Set the RadarDetect Mode as Normal, bc the APUpdateAllBeaconFram() will refer this parameter. */ - /*pAd->Dot11_H.RDMode = RD_NORMAL_MODE;*/ -#ifdef LED_CONTROL_SUPPORT -#ifndef CONFIG_LED_ACTIVITY_ON_MAIN_MBSS - RTMPSetLED(pAd, LED_LINK_UP); -#endif -#endif /* LED_CONTROL_SUPPORT */ -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - WifiFwdSet(pAd->CommonCfg.WfFwdDisabled); -#endif /* CONFIG_WIFI_PKT_FWD */ - ApLogEvent(pAd, pAd->CurrentAddress, EVENT_RESET_ACCESS_POINT); - pAd->Mlme.PeriodicRound = 0; - pAd->Mlme.OneSecPeriodicRound = 0; - pAd->MacTab.MsduLifeTime = 5; /* default 5 seconds */ - OPSTATUS_SET_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - RTMP_IndicateMediaState(pAd, NdisMediaStateConnected); - - /* beacon init for USB/SDIO */ - asic_bss_beacon_init(pAd); - - /* start sending BEACON out */ -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - if (pMbss && - (pMbss->APStartPseduState == AP_STATE_ALWAYS_START_AP_DEFAULT)) -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IF_STATE_CHG); - /* - Set group re-key timer if necessary. - It must be processed after clear flag "fRTMP_ADAPTER_HALT_IN_PROGRESS" - */ - APStartRekeyTimer(pAd, wdev); - -#ifdef CARRIER_DETECTION_SUPPORT - - if (pAd->CommonCfg.CarrierDetect.Enable == TRUE) - CarrierDetectionStart(pAd); - -#endif /* CARRIER_DETECTION_SUPPORT */ - - /* Pre-tbtt interrupt setting. */ - AsicSetPreTbtt(pAd, TRUE, HW_BSSID_0); -#ifdef IDS_SUPPORT - - /* Start IDS timer */ - if (pAd->ApCfg.IdsEnable) { -#ifdef SYSTEM_LOG_SUPPORT - - if (pAd->CommonCfg.bWirelessEvent == FALSE) - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("!!! WARNING !!! The WirelessEvent parameter doesn't be enabled\n")); - -#endif /* SYSTEM_LOG_SUPPORT */ - RTMPIdsStart(pAd); - } - -#endif /* IDS_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - FT_Init(pAd); -#endif /* DOT11R_FT_SUPPORT */ -#ifdef SMART_ANTENNA - RtmpSAStart(pAd); -#endif /* SMART_ANTENNA */ - RTMP_ASIC_INTERRUPT_ENABLE(pAd); - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY); - -#ifdef CUSTOMER_DCC_FEATURE - bandIdx = HcGetBandByWdev(wdev); - - pAd->CommonCfg.channelSwitch.CHSWMode = NORMAL_MODE; - pAd->Dot11_H[bandIdx].CSPeriod = - pAd->CommonCfg.channelSwitch.Dot11_H_CSPeriod; - pAd->CommonCfg.NewExtChanOffset.NewExtChanOffset = - wlan_config_get_ext_cha(wdev); - if (pMbss->wdev.bAllowBeaconing) - UpdateBeaconHandler(pAd, &pMbss->wdev, BCN_UPDATE_ENABLE_TX); - AsicSetSyncModeAndEnable(pAd, pAd->CommonCfg.BeaconPeriod, HW_BSSID_0, - OPMODE_AP); - RTMP_IRQ_ENABLE(pAd); - RTMPEnableRxTx(pAd); - RTMP_MLME_HANDLER(pAd); -#endif - -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - if (pAd->ApEnableBeaconTable) - BssTableInit(&pAd->AvailableBSS); -#endif - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Main bssid = %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pAd->ApCfg.MBSSID[BSS0].wdev.bssid))); -#if defined(NF_SUPPORT) || defined(OFFCHANNEL_SCAN_FEATURE) - if (IS_MT7615(pAd)) - enable_nf_support(pAd); -#endif - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s()\n", __func__)); -#ifdef VENDOR_FEATURE7_SUPPORT - { - UCHAR event_msg[48] = { 0 }; - - if (WMODE_CAP_5G(pAd->ApCfg.MBSSID[BSS0].wdev.PhyMode)) - sprintf(event_msg, - "%sGHz AP start/restart successful\n", "5"); - else - sprintf(event_msg, - "%sGHz AP start/restart successful\n", "2.4"); - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, WLAN_LOG_SAVE, - 0, event_msg, strlen(event_msg)); - } -#endif -} - -VOID ap_over_lapping_scan(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss) -{ - struct wifi_dev *wdev; - if (pMbss == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() Invalid Mbss\n", __func__)); - return; - } - wdev = &pMbss->wdev; - - if (pAd->CommonCfg.bForty_Mhz_Intolerant == TRUE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Disable 20/40 BSSCoex Channel Scan(BssCoex=%d, 40MHzIntolerant=%d)\n", - pAd->CommonCfg.bBssCoexEnable, - pAd->CommonCfg.bForty_Mhz_Intolerant)); - } else if (pAd->CommonCfg.bBssCoexEnable == TRUE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Enable 20/40 BSSCoex Channel Scan(BssCoex=%d)\n", - pAd->CommonCfg.bBssCoexEnable)); - APOverlappingBSSScan(pAd, wdev); - } -} - -VOID APStartUp(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, ENUM_AP_BSS_OPER oper) -{ - UINT32 idx; - BSS_STRUCT *pCurMbss = NULL; - UCHAR ch = 0; -#ifdef CONFIG_MAP_SUPPORT - UCHAR i, j; - struct DOT11_H *pDot11h = NULL; - struct wifi_dev *wdev_temp = NULL; - struct wifi_dev *sta_wdev = NULL; -#endif - - /* Don't care pMbss if operation is for all */ - if ((pMbss == NULL) && (oper != AP_BSS_OPER_ALL)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() Invalid oper(%d)\n", __func__, oper)); - return; - } - - if (pMbss) - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(), oper(%d) bssid(%d)=%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, oper, pMbss->mbss_idx, - PRINT_MAC(pMbss->wdev.bssid))); - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(), oper(%d)\n", __func__, oper)); - - switch (oper) { - case AP_BSS_OPER_ALL: - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - pCurMbss = &pAd->ApCfg.MBSSID[idx]; - pCurMbss->mbss_idx = idx; - - APStartUpByBss(pAd, pCurMbss); - if (pCurMbss->wdev.channel && - (pCurMbss->wdev.channel < 14)) - ch = pCurMbss->wdev.channel; - } - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - pCurMbss = &pAd->ApCfg.MBSSID[idx]; - - /* check MBSS status is up */ - if (!pCurMbss->wdev.if_up_down_state) - continue; - - if (ch < 14) { - /* check MBSS work on the same RF(channel) */ - if (pCurMbss->wdev.channel == ch) { - ap_over_lapping_scan(pAd, pCurMbss); - break; - } - } - } - break; - case AP_BSS_OPER_BY_RF: - ch = pMbss->wdev.channel; - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - pCurMbss = &pAd->ApCfg.MBSSID[idx]; - pCurMbss->mbss_idx = idx; - - /* check MBSS status is up */ - if (!pCurMbss->wdev.if_up_down_state) - continue; - if (pCurMbss->wdev.open_state == FALSE) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(), wdev idx (%d) skip ApStart as device is not open\n", - __func__, pCurMbss->wdev.wdev_idx)); - continue; - } - - /* check MBSS work on the same RF(channel) */ - if (pCurMbss->wdev.channel != ch) - continue; - - pCurMbss->wdev.start_stop_running = TRUE; - APStartUpByBss(pAd, pCurMbss); - if (pCurMbss->wdev.open_state == FALSE) { - RTMP_OS_COMPLETE( - &pCurMbss->wdev.start_stop_complete); - } - pCurMbss->wdev.start_stop_running = FALSE; - } - break; - - case AP_BSS_OPER_SINGLE: - default: - APStartUpByBss(pAd, pMbss); - if (pMbss->wdev.if_up_down_state && pMbss->wdev.channel < 14) - ap_over_lapping_scan(pAd, pMbss); - break; - } - - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY); -#ifdef CONFIG_MAP_SUPPORT - /*If this AP stop start is due to radar detect then send the radar notify event to MAP*/ - if (IS_MAP_TURNKEY_ENABLE(pAd)) { - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - wdev_temp = &pAd->ApCfg.MBSSID[i].wdev; - if (wdev_temp == NULL) { - continue; - } - pDot11h = wdev_temp->pDot11_H; - if (pDot11h == NULL) { - continue; - } - if (pDot11h->RDMode == RD_SILENCE_MODE) { - if (wdev_temp->cac_not_required == TRUE) - wapp_send_cac_period_event( - pAd, - RtmpOsGetNetIfIndex( - wdev_temp->if_dev), - wdev_temp->channel, 2, 0); - else - wapp_send_cac_period_event( - pAd, - RtmpOsGetNetIfIndex( - wdev_temp->if_dev), - wdev_temp->channel, 1, - pDot11h->ChMovingTime); - /*Disable Apcli on the CAC running apcli interface, reconnection will be handled by MAP*/ - for (j = 0; j < MAX_APCLI_NUM; j++) { - sta_wdev = &pAd->ApCfg.ApCliTab[j].wdev; - if (sta_wdev->channel == - wdev_temp->channel) { - pAd->ApCfg.ApCliTab[j].Enable = - FALSE; - } - } - } - if (wdev_temp->map_radar_detect) { - wapp_send_radar_detect_notif( - pAd, wdev_temp, - wdev_temp->map_radar_channel, 0); - wdev_temp->map_radar_detect = 0; - wdev_temp->map_radar_channel = 0; - } - } - } -#endif - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s()\n", __func__)); -} - -/*Only first time will run it*/ -VOID APInitForMain(RTMP_ADAPTER *pAd) -{ - BSS_STRUCT *pMbss = NULL; - UINT32 apidx = 0; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s()\n", __func__)); - AsicDisableSync( - pAd, - HW_BSSID_0); /* don't gen beacon, reset tsf timer, don't gen interrupt. */ - /*reset hw wtbl*/ - ap_hw_tb_init(pAd); - pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; - pMbss->mbss_idx = MAIN_MBSSID; - /*update main runtime attribute*/ - -#ifdef DOT11_N_SUPPORT - AsicSetRalinkBurstMode(pAd, pAd->CommonCfg.bRalinkBurstMode); -#ifdef PIGGYBACK_SUPPORT - AsicSetPiggyBack(pAd, pAd->CommonCfg.bPiggyBackCapable); -#endif /* PIGGYBACK_SUPPORT */ -#endif /* DOT11_N_SUPPORT */ - /* Workaround start: Let Rx packet can be dequeued from PSE or Tx CMD will fail */ - /* Workaround end */ - /* Clear BG-Protection flag */ - OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); - MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble); - /* Set the RadarDetect Mode as Normal, bc the APUpdateAllBeaconFram() will refer this parameter. */ - /* pAd->Dot11_H.RDMode = RD_NORMAL_MODE; */ - /* Disable Protection first. */ - AsicUpdateProtect(pAd); - ApUpdateCapabilityAndErpIe(pAd, pMbss); -#ifdef DOT11_N_SUPPORT - APUpdateOperationMode(pAd, &pMbss->wdev); -#endif /* DOT11_N_SUPPORT */ -#ifdef LED_CONTROL_SUPPORT -#ifndef CONFIG_LED_ACTIVITY_ON_MAIN_MBSS - RTMPSetLED(pAd, LED_LINK_UP); -#endif -#endif /* LED_CONTROL_SUPPORT */ -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - WifiFwdSet(pAd->CommonCfg.WfFwdDisabled); -#endif /* CONFIG_WIFI_PKT_FWD */ - ApLogEvent(pAd, pAd->CurrentAddress, EVENT_RESET_ACCESS_POINT); - pAd->Mlme.PeriodicRound = 0; - pAd->Mlme.OneSecPeriodicRound = 0; - pAd->MacTab.MsduLifeTime = 5; /* default 5 seconds */ - OPSTATUS_SET_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - RTMP_IndicateMediaState(pAd, NdisMediaStateConnected); - /* - NOTE!!!: - All timer setting shall be set after following flag be cleared - fRTMP_ADAPTER_HALT_IN_PROGRESS - */ - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); - /* - Set group re-key timer if necessary. - It must be processed after clear flag "fRTMP_ADAPTER_HALT_IN_PROGRESS" - */ - APStartRekeyTimer(pAd, &pMbss->wdev); - /* RadarStateCheck(pAd); */ - -#ifdef CARRIER_DETECTION_SUPPORT - - if (pAd->CommonCfg.CarrierDetect.Enable == TRUE) - CarrierDetectionStart(pAd); - -#endif /* CARRIER_DETECTION_SUPPORT */ - - /* Pre-tbtt interrupt setting. */ - AsicSetPreTbtt(pAd, TRUE, HW_BSSID_0); - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - pMbss = &pAd->ApCfg.MBSSID[apidx]; - OPSTATUS_SET_FLAG_WDEV(&pMbss->wdev, - fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - } - -#ifdef IDS_SUPPORT - - /* Start IDS timer */ - if (pAd->ApCfg.IdsEnable) { -#ifdef SYSTEM_LOG_SUPPORT - - if (pAd->CommonCfg.bWirelessEvent == FALSE) - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("!!! WARNING !!! The WirelessEvent parameter doesn't be enabled\n")); - -#endif /* SYSTEM_LOG_SUPPORT */ - RTMPIdsStart(pAd); - } - -#endif /* IDS_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - FT_Init(pAd); -#endif /* DOT11R_FT_SUPPORT */ -#ifdef SMART_ANTENNA - RtmpSAStart(pAd); -#endif /* SMART_ANTENNA */ -#ifdef BAND_STEERING - - if (pAd->ApCfg.BandSteering) - BndStrg_Init(pAd); - -#endif /* BAND_STEERING */ - RTMP_ASIC_INTERRUPT_ENABLE(pAd); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Main bssid = %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pAd->ApCfg.MBSSID[BSS0].wdev.bssid))); -#ifdef VENDOR_FEATURE7_SUPPORT - { - UCHAR event_msg[48] = { 0 }; - - if (WMODE_CAP_5G(pAd->ApCfg.MBSSID[BSS0].wdev.PhyMode)) - sprintf(event_msg, - "%sGHz AP start/restart successful\n", "5"); - else - sprintf(event_msg, - "%sGHz AP start/restart successful\n", "2.4"); - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, WLAN_LOG_SAVE, - 0 /*dummy*/, event_msg, strlen(event_msg)); - } -#endif - /* Sta idle check param init */ - pAd->StaIdleCheck_At_Sec = 3; - pAd->StaIdleCheck_At_TxPktCnt = 50; - pAd->StaIdleCheck_At_NullFrameTxFailCnt = 3; - pAd->StaIdleCheck_At_NullFrameTxCnt = 10; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s()\n", __func__)); -} - -VOID APStopByBss(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss) -{ - BOOLEAN Cancelled; - struct wifi_dev *wdev_bss; -#if defined(MESH_SUPPORT) || defined(APCLI_SUPPORT) || defined(BAND_STEERING) - INT idx = 0; -#ifdef APCLI_SUPPORT - struct wifi_dev *wdev; -#endif /* APCLI_SUPPORT */ -#ifdef WSC_INCLUDED - PWSC_CTRL pWscControl; -#endif /* WSC_INCLUDED */ -#endif -#ifdef GREENAP_SUPPORT - struct greenap_ctrl *greenap = &pAd->ApCfg.greenap; -#endif /* GREENAP_SUPPORT */ - - if (pMbss == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() Invalid Mbss\n", __func__)); - return; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s() mbss_idx %d\n", __func__, pMbss->mbss_idx)); - wdev_bss = &pMbss->wdev; - - /* */ - /* Cancel the Timer, to make sure the timer was not queued. */ - /* */ - OPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - RTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected); -#ifdef CARRIER_DETECTION_SUPPORT - - if (pAd->CommonCfg.CarrierDetect.Enable == TRUE) { - /* make sure CarrierDetect wont send CTS */ - CarrierDetectionStop(pAd); - } - -#endif /* CARRIER_DETECTION_SUPPORT */ -#ifdef APCLI_SUPPORT -#ifdef WAPP_SUPPORT - if (wdev_bss->avoid_apcli_linkdown != TRUE) { -#endif -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (IS_APCLI_SYNC_PEER_DEAUTH_ENBL(pAd) == FALSE) { -#endif - for (idx = 0; idx < MAX_APCLI_NUM; idx++) { - wdev = &pAd->ApCfg.ApCliTab[idx].wdev; - -#ifdef WSC_INCLUDED - /* WPS cli will disconnect and connect again */ - pWscControl = &pAd->ApCfg.ApCliTab[idx] - .wdev.WscControl; - if (pWscControl->bWscTrigger == TRUE) - continue; -#endif /* WSC_INCLUDED */ - - if (wdev->channel == wdev_bss->channel) { - UINT8 enable = - pAd->ApCfg.ApCliTab[idx].Enable; - - if (enable) { - pAd->ApCfg.ApCliTab[idx].Enable = - FALSE; - ApCliIfDown(pAd); -#ifdef CONFIG_MAP_SUPPORT - if (!IS_MAP_TURNKEY_ENABLE(pAd)) -#endif - pAd->ApCfg.ApCliTab[idx] - .Enable = - enable; - } - } - } -#ifdef BW_VENDOR10_CUSTOM_FEATURE - } -#endif -#ifdef WAPP_SUPPORT - } -#endif -#endif /* APCLI_SUPPORT */ - - /*AP mode*/ - MacTableResetWdev(pAd, wdev_bss); - OPSTATUS_CLEAR_FLAG_WDEV(wdev_bss, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); -#ifdef GREENAP_SUPPORT - if (greenap_get_capability(greenap) && - greenap_get_allow_status(greenap)) - greenap_exit(pAd, wdev_bss, greenap); -#endif /* GREENAP_SUPPORT */ - - /* Disable pre-tbtt interrupt */ - AsicSetPreTbtt(pAd, FALSE, HW_BSSID_0); - /* Disable piggyback */ - AsicSetPiggyBack(pAd, FALSE); - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - AsicDisableSync(pAd, HW_BSSID_0); -#ifdef LED_CONTROL_SUPPORT - /* Set LED */ - RTMPSetLED(pAd, LED_LINK_DOWN); -#endif /* LED_CONTROL_SUPPORT */ - } - - /* beacon exit for USB/SDIO */ - asic_bss_beacon_exit(pAd); - -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - if (IS_MAP_ENABLE(pAd)) - map_a4_deinit(pAd, pMbss->mbss_idx, TRUE); -#endif - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if (wf_drv_tbl.wf_fwd_entry_delete_hook) - wf_drv_tbl.wf_fwd_entry_delete_hook(pAd->net_dev, - wdev_bss->if_dev, 0); - - if (wf_drv_tbl.wf_fwd_check_device_hook) - wf_drv_tbl.wf_fwd_check_device_hook(wdev_bss->if_dev, - INT_MBSSID, pMbss->mbss_idx, - wdev_bss->channel, 0); - -#endif /* CONFIG_WIFI_PKT_FWD */ - /* clear protection to default */ - wdev_bss->protection = 0; - - /* clear csa cnt */ - wdev_bss->csa_count = 0; - -#ifdef CONFIG_RCSA_SUPPORT - /* When RCSA is send, ALTX is en and BF suspended, restore state*/ - RcsaRecovery(pAd, wdev_bss); -#endif - - if (wdev_do_linkdown(wdev_bss) != TRUE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() linkdown fail!!!\n", __func__)); - - if (WMODE_CAP_5G(wdev_bss->PhyMode)) { -#ifdef MT_DFS_SUPPORT /* Jelly20150217 */ - WrapDfsRadarDetectStop(pAd); - /* Zero wait hand off recovery for CAC period + interface down case */ - DfsZeroHandOffRecovery(pAd, wdev_bss); -#endif - } - - /* Update devinfo for any phymode change */ - if (wdev_do_close(wdev_bss) != TRUE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() close fail!!!\n", __func__)); - - APReleaseRekeyTimer(pAd, wdev_bss); -#ifdef BAND_STEERING - if (pAd->ApCfg.BandSteering) { - PBND_STRG_CLI_TABLE table; - - table = Get_BndStrgTable(pAd, idx); - if (table) { - /* Inform daemon interface ready */ - BndStrg_SetInfFlags(pAd, &pMbss->wdev, table, FALSE); - } - } -#endif /* BAND_STEERING */ - - if (pAd->ApCfg.CMTimerRunning == TRUE) { - RTMPCancelTimer(&pAd->ApCfg.CounterMeasureTimer, &Cancelled); - pAd->ApCfg.CMTimerRunning = FALSE; - pAd->ApCfg.BANClass3Data = FALSE; - } - -#ifdef IDS_SUPPORT - /* if necessary, cancel IDS timer */ - RTMPIdsStop(pAd); -#endif /* IDS_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - FT_Release(pAd); -#endif /* DOT11R_FT_SUPPORT */ -#ifdef SMART_ANTENNA - RtmpSAStop(pAd); -#endif /* SMART_ANTENNA */ -#ifdef VOW_SUPPORT - vow_reset(pAd); -#endif /* VOW_SUPPORT */ -#ifdef OCE_SUPPORT - OceDeInit(pAd, wdev_bss); -#endif /* OCE_SUPPORT */ -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - wapp_send_bss_state_change(pAd, wdev_bss, WAPP_BSS_STOP); -#endif /*WAPP_SUPPORT*/ -} - -VOID APStop(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, ENUM_AP_BSS_OPER oper) -{ - UINT32 idx; - BSS_STRUCT *pCurMbss = NULL; - UCHAR ch = 0; - - /* Don't care pMbss if operation is for all */ - if ((pMbss == NULL) && (oper != AP_BSS_OPER_ALL)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() Invalid oper(%d)\n", __func__, oper)); - return; - } - - if (pMbss) - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(), oper(%d) bssid(%d)=%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, oper, pMbss->mbss_idx, - PRINT_MAC(pMbss->wdev.bssid))); - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(), oper(%d)\n", __func__, oper)); - - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY); - - switch (oper) { - case AP_BSS_OPER_ALL: - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - pCurMbss = &pAd->ApCfg.MBSSID[idx]; - pCurMbss->mbss_idx = idx; - - APStopByBss(pAd, pCurMbss); - } - break; - case AP_BSS_OPER_BY_RF: - ch = pMbss->wdev.channel; - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - pCurMbss = &pAd->ApCfg.MBSSID[idx]; - pCurMbss->mbss_idx = idx; - - /* check MBSS status is up */ - if (!pCurMbss->wdev.if_up_down_state && - !pCurMbss->wdev.bcn_buf.bBcnSntReq) - continue; - if (pCurMbss->wdev.open_state == FALSE) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(), wdev idx (%d) skip ApStart as device is not open\n", - __func__, pCurMbss->wdev.wdev_idx)); - continue; - } - - /* check MBSS work on the same RF(channel) */ - if (pCurMbss->wdev.channel != ch) - continue; - - pCurMbss->wdev.start_stop_running = TRUE; - APStopByBss(pAd, pCurMbss); - if (pCurMbss->wdev.open_state == FALSE) { - RTMP_OS_COMPLETE( - &pCurMbss->wdev.start_stop_complete); - } - pCurMbss->wdev.start_stop_running = FALSE; - } - break; - - case AP_BSS_OPER_SINGLE: - default: - APStopByBss(pAd, pMbss); - break; - } - - if (!RTCMDRunning(&pAd->cmdQTask)) - RTCMDUp(&pAd->cmdQTask); - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<=== %s()\n", __func__)); -} - -/* - ========================================================================== - Description: - This routine is used to clean up a specified power-saving queue. It's - used whenever a wireless client is deleted. - ========================================================================== - */ -VOID APCleanupPsQueue(RTMP_ADAPTER *pAd, QUEUE_HEADER *pQueue) -{ - PQUEUE_ENTRY pEntry; - PNDIS_PACKET pPacket; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): (0x%08lx)...\n", __func__, (ULONG)pQueue)); - - while (pQueue->Head) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():%u...\n", __func__, pQueue->Number)); - pEntry = RemoveHeadQueue(pQueue); - /*pPacket = CONTAINING_RECORD(pEntry, NDIS_PACKET, MiniportReservedEx); */ - pPacket = QUEUE_ENTRY_TO_PACKET(pEntry); - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); - } -} - -/* -* -*/ -static VOID avg_pkt_len_reset(struct _RTMP_ADAPTER *ad) -{ -#if defined(VOW_SUPPORT) && defined(CONFIG_AP_SUPPORT) - vow_avg_pkt_len_reset(ad); -#endif - ad->mcli_ctl.pkt_avg_len = 0; - ad->mcli_ctl.sta_nums = 0; -} - -/* -* -*/ -static VOID avg_pkt_len_calculate(struct _MAC_TABLE_ENTRY *entry) -{ - struct _RTMP_ADAPTER *ad = entry->wdev->sys_handle; - UINT32 avg_pkt_len = 0; - struct multi_cli_ctl *mctrl = &ad->mcli_ctl; - -#if defined(VOW_SUPPORT) && defined(CONFIG_AP_SUPPORT) - vow_avg_pkt_len_calculate(entry); -#endif - if (!ad->CommonCfg.dbdc_mode) - return; - - if (entry->avg_tx_pkts > 0) - avg_pkt_len = (UINT32)(entry->AvgTxBytes / entry->avg_tx_pkts); - - if ((avg_pkt_len > VERIWAVE_INVALID_PKT_LEN_HIGH) || - (avg_pkt_len < VERIWAVE_INVALID_PKT_LEN_LOW)) - return; - /*moving average for pkt avg length*/ - mctrl->pkt_avg_len = - ((mctrl->pkt_avg_len * mctrl->sta_nums) + avg_pkt_len) / - (mctrl->sta_nums + 1); - mctrl->sta_nums++; -} - -#define FAR_CLIENT_RSSI (-70) -#define FAR_CLIENT_DELTA_RSSI (10) -static VOID CalFarClientNum(struct _RTMP_ADAPTER *ad, - struct _MAC_TABLE_ENTRY *entry) -{ - UINT8 idx; - CHAR avg_rssi[4]; - - for (idx = 0; idx < 4; idx++) - avg_rssi[idx] = ad->ApCfg.RssiSample.LastRssi[idx] - - ad->BbpRssiToDbmDelta; - - for (idx = 0; idx < 4; idx++) { - if ((entry->RssiSample.AvgRssi[idx] < FAR_CLIENT_RSSI) && - (entry->RssiSample.AvgRssi[idx] != -127)) { - if ((avg_rssi[idx] - entry->RssiSample.AvgRssi[idx]) >= - FAR_CLIENT_DELTA_RSSI) { - ad->nearfar_far_client_num++; - break; - } - } - } -} - -/* -* -*/ - -#ifndef DISABLE_MULTICLIENT_DYNAMIC_TXOP -static VOID dynamic_amsdu_protect_adjust(struct _RTMP_ADAPTER *ad) -{ - UCHAR amsdu_cnt = 4, band_idx = 0; - ULONG per = 0; - ULONG tx_cnt; - ULONG tx_fail_cnt; - COUNTER_802_11 *wlan_ct = NULL; - struct wifi_dev *wdev = NULL; - UINT16 multi_client_num_th = 0, veriwave_tp_amsdu_dis_th = 0; - BOOLEAN mc_flg = FALSE; - - /*concurrent case, not adjust*/ - if (ad->txop_ctl[DBDC_BAND0].multi_client_nums > 0) { -#if DBDC_BAND_NUM == 2 - if (ad->txop_ctl[DBDC_BAND1].multi_client_nums > 0) - return; -#endif - band_idx = DBDC_BAND0; - } -#if DBDC_BAND_NUM == 2 - else if (ad->txop_ctl[DBDC_BAND1].multi_client_nums > 0) - band_idx = DBDC_BAND1; -#endif - else - return; - - wlan_ct = &ad->WlanCounters[band_idx]; - wdev = ad->txop_ctl[band_idx].cur_wdev; - - if (WMODE_CAP_2G(wdev->PhyMode)) { - multi_client_num_th = MULTI_CLIENT_2G_NUMS_TH; - veriwave_tp_amsdu_dis_th = VERIWAVE_2G_TP_AMSDU_DIS_TH; - } else if (WMODE_CAP_5G(wdev->PhyMode)) { - multi_client_num_th = MULTI_CLIENT_NUMS_TH; - veriwave_tp_amsdu_dis_th = VERIWAVE_TP_AMSDU_DIS_TH; - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s[%d]\n", __func__, __LINE__)); - return; - } - - /*adjust amsdu*/ - if (ad->txop_ctl[band_idx].multi_client_nums == multi_client_num_th) { - mc_flg = TRUE; - } - - if (ad->mcli_ctl.amsdu_cnt != amsdu_cnt) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): change amsdu %d to %d\n", __func__, - ad->mcli_ctl.amsdu_cnt, amsdu_cnt)); - ad->mcli_ctl.amsdu_cnt = amsdu_cnt; - if (IS_ASIC_CAP(ad, fASIC_CAP_MCU_OFFLOAD)) - MtCmdCr4Set(ad, CR4_SET_ID_CONFIG_STA_AMSDU_MAX_NUM, - 255, amsdu_cnt); - else - ad->amsdu_max_num = amsdu_cnt; - } - /* reset */ - ad->nearfar_far_client_num = 0; - - /*only change protection scenario when sta more than MULTI_CLIENT_NUMS_TH*/ - if (!mc_flg) { - ad->mcli_ctl.last_tx_cnt = wlan_ct->AmpduSuccessCount.u.LowPart; - ad->mcli_ctl.last_tx_fail_cnt = - wlan_ct->AmpduFailCount.u.LowPart; - if (ad->mcli_ctl.c2s_only == TRUE) { - asic_rts_on_off(wdev, TRUE); - ad->mcli_ctl.c2s_only = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s(): enable RTS\n", __func__)); - } - return; - } - - tx_cnt = - wlan_ct->AmpduSuccessCount.u.LowPart - ad->mcli_ctl.last_tx_cnt; - tx_fail_cnt = wlan_ct->AmpduFailCount.u.LowPart - - ad->mcli_ctl.last_tx_fail_cnt; - - ad->mcli_ctl.last_tx_cnt = wlan_ct->AmpduSuccessCount.u.LowPart; - ad->mcli_ctl.last_tx_fail_cnt = wlan_ct->AmpduFailCount.u.LowPart; - - if (tx_cnt > 0) { - per = (100 * tx_fail_cnt) / (tx_fail_cnt + tx_cnt); - if ((ad->mcli_ctl.c2s_only == FALSE) && - (per < VERIWAVE_PER_RTS_DIS_TH_LOW_MARK)) { - asic_rts_on_off(wdev, FALSE); - ad->mcli_ctl.c2s_only = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s(): disable RTS, per=%lu\n", __func__, - per)); - } else if ((ad->mcli_ctl.c2s_only == TRUE) && - (per >= VERIWAVE_PER_RTS_DIS_TH_HIGH_MARK)) { - asic_rts_on_off(wdev, TRUE); - ad->mcli_ctl.c2s_only = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s(): enable RTS, per=%lu\n", __func__, - per)); - } - } -} -#endif - -#if defined(VOW_SUPPORT) && defined(CONFIG_AP_SUPPORT) -static VOID dynamic_airtime_fairness_adjust(struct _RTMP_ADAPTER *ad) -{ - BOOLEAN shrink_flag = FALSE; - BOOLEAN mc_flg = FALSE, fband_2g = FALSE; - UCHAR band_idx = 0; - UINT16 multi_client_num_th = 0, veriwave_tp_amsdu_dis_th = 0; - struct wifi_dev *wdev = NULL; - - if (!ad->vow_cfg.en_airtime_fairness) - return; - - /*concurrent case, not adjust*/ - if (ad->txop_ctl[DBDC_BAND0].multi_client_nums > 0) { -#if DBDC_BAND_NUM == 2 - if (ad->txop_ctl[DBDC_BAND1].multi_client_nums > 0) - return; -#endif - band_idx = DBDC_BAND0; - } -#if DBDC_BAND_NUM == 2 - else if (ad->txop_ctl[DBDC_BAND1].multi_client_nums > 0) - band_idx = DBDC_BAND1; -#endif - else - return; - - wdev = ad->txop_ctl[band_idx].cur_wdev; - - if (WMODE_CAP_2G(wdev->PhyMode)) { - multi_client_num_th = MULTI_CLIENT_2G_NUMS_TH; - veriwave_tp_amsdu_dis_th = VERIWAVE_2G_TP_AMSDU_DIS_TH; - fband_2g = TRUE; - } else if (WMODE_CAP_5G(wdev->PhyMode)) { - multi_client_num_th = MULTI_CLIENT_NUMS_TH; - veriwave_tp_amsdu_dis_th = VERIWAVE_TP_AMSDU_DIS_TH; - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s[%d]\n", __func__, __LINE__)); - return; - } - - /*adjust amsdu*/ - if (ad->txop_ctl[band_idx].multi_client_nums == multi_client_num_th) { - if (ad->vow_mcli_ctl.pkt_avg_len > VERIWAVE_PKT_LEN_LOW) - shrink_flag = TRUE; - } else { - if (ad->txop_ctl[band_idx].multi_client_nums > 1) { - if (ad->vow_mcli_ctl.pkt_avg_len > - veriwave_tp_amsdu_dis_th) - shrink_flag = TRUE; - else if (ad->vow_mcli_ctl.pkt_avg_len > - VERIWAVE_PKT_LEN_LOW) - shrink_flag = TRUE; - } - } - - if (ad->txop_ctl[band_idx].multi_client_nums == multi_client_num_th) - mc_flg = TRUE; - - if (ad->vow_sta_frr_flag != shrink_flag) { - /* adj airtime quantum only when WATF is not enabled */ - ad->vow_sta_frr_flag = shrink_flag; - if (ad->vow_cfg.en_airtime_fairness && - ad->vow_sta_frr_quantum && !vow_watf_is_enabled(ad)) { - if ((shrink_flag == TRUE) & - (ad->nearfar_far_client_num <= 1) && - mc_flg) - RTMP_SET_STA_DWRR_QUANTUM( - ad, FALSE, - ad->vow_sta_frr_quantum); /* fast round robin */ - else - RTMP_SET_STA_DWRR_QUANTUM(ad, TRUE, - 0); /* restore */ - } - } - return; -} -#endif /* defined (VOW_SUPPORT) && defined(CONFIG_AP_SUPPORT) */ - -#ifdef WHNAT_SUPPORT -static VOID tx_offload_counter_update(struct _RTMP_ADAPTER *ad, - struct _MAC_TABLE_ENTRY *entry) -{ -#ifdef CONFIG_AP_SUPPORT - if (IS_ENTRY_CLIENT(entry) && entry->pMbss) { - entry->pMbss->TxCount += entry->one_sec_tx_pkts; - entry->pMbss->TransmittedByteCount += entry->OneSecTxBytes; - /* Update per-entry cumulative stats */ - entry->TxBytes += entry->OneSecTxBytes; -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(ad)) - entry->TxBytesMAP += entry->OneSecTxBytes; -#endif - entry->TxPackets.QuadPart += entry->one_sec_tx_pkts; -#ifdef MAP_R2 - if (IS_MAP_ENABLE(ad) && IS_MAP_R2_ENABLE(ad)) - entry->pMbss->ucBytesTx += entry->OneSecTxBytes; -#endif - } -#endif /*CONFIG_AP_SUPPORT*/ - -#ifdef APCLI_SUPPORT - if ((IS_ENTRY_APCLI(entry) -#ifdef MAC_REPEATER_SUPPORT - || IS_ENTRY_REPEATER(entry) -#endif /*MAC_REPEATER_SUPPORT*/ - ) && - entry->pApCli) { - struct _APCLI_STRUCT *apcli_entry = entry->pApCli; - apcli_entry->TxCount += entry->one_sec_tx_pkts; - apcli_entry->TransmittedByteCount += entry->OneSecTxBytes; - } -#endif /*APCLI_SUPPORT*/ - -#ifdef WDS_SUPPORT - - if (IS_ENTRY_WDS(entry)) { - ad->WdsTab.WdsEntry[entry->func_tb_idx] - .WdsCounter.TransmittedFragmentCount.QuadPart += - entry->one_sec_tx_pkts; - ad->WdsTab.WdsEntry[entry->func_tb_idx] - .WdsCounter.TransmittedByteCount += - entry->OneSecTxBytes; - } -#endif /* WDS_SUPPORT */ -} -#endif /*WHNAT_SUPPORT*/ - -static VOID do_sta_keep_action(struct _RTMP_ADAPTER *ad, - struct _MAC_TABLE_ENTRY *entry, BOOLEAN is_no_rx) -{ -#ifdef IAPP_SUPPORT - if (entry->wdev && is_no_rx && - (ad->Mlme.PeriodicRound % STA_KEEP_ALIVE_NOTIFY_L2) == 0) { - IAPP_L2_Update_Frame_Send(ad, entry->Addr, - entry->wdev->wdev_idx); - } -#endif /*IAPP_SUPPORT*/ -} - -/* - ========================================================================== - Description: - This routine is called by APMlmePeriodicExec() every second to check if - 1. any associated client in PSM. If yes, then TX MCAST/BCAST should be - out in DTIM only - 2. any client being idle for too long and should be aged-out from MAC table - 3. garbage collect PSQ - ========================================================================== -*/ - -VOID MacTableMaintenance(RTMP_ADAPTER *pAd) -{ - int wcid, startWcid; -#ifdef DOT11_N_SUPPORT - BOOLEAN bRdgActive = FALSE; - BOOLEAN bRalinkBurstMode; -#endif /* DOT11_N_SUPPORT */ -#ifdef RTMP_MAC_PCI - unsigned long IrqFlags; -#endif /* RTMP_MAC_PCI */ - MAC_TABLE *pMacTable; - CHAR avgRssi; - BSS_STRUCT *pMbss; -#ifdef WFA_VHT_PF - RSSI_SAMPLE *worst_rssi = NULL; - int worst_rssi_sta_idx = 0; -#endif /* WFA_VHT_PF */ -#ifdef MT_MAC - BOOLEAN bPreAnyStationInPsm = FALSE; -#endif /* MT_MAC */ - UINT BandIdx = 0; -#ifdef SMART_CARRIER_SENSE_SUPPORT - CHAR tmpRssi = 0; -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -#ifdef APCLI_SUPPORT - ULONG apcli_avg_tx = 0; - ULONG apcli_avg_rx = 0; - struct wifi_dev *apcli_wdev = NULL; -#endif /* APCLI_SUPPORT */ - struct wifi_dev *sta_wdev = NULL; - struct wifi_dev *txop_wdev = NULL; - UCHAR sta_hit_2g_infra_case_number = 0; -#if defined(A4_CONN) && defined(IGMP_SNOOP_SUPPORT) - BOOLEAN IgmpQuerySendTickChanged = FALSE; - BOOLEAN MldQuerySendTickChanged = FALSE; -#endif - struct _RTMP_CHIP_CAP *cap; - BOOLEAN is_no_rx_cnt = FALSE; - ULONG last_one_sec_tx_pkts = 0; - - cap = hc_get_chip_cap(pAd->hdev_ctrl); - pMacTable = &pAd->MacTab; -#ifdef MT_MAC - bPreAnyStationInPsm = pMacTable->fAnyStationInPsm; -#endif /* MT_MAC */ - pMacTable->fAnyStationInPsm = FALSE; - pMacTable->fAnyStationBadAtheros = FALSE; - pMacTable->fAnyTxOPForceDisable = FALSE; - pMacTable->fAllStationAsRalink[0] = TRUE; - pMacTable->fAllStationAsRalink[1] = TRUE; - pMacTable->fCurrentStaBw40 = FALSE; -#ifdef DOT11_N_SUPPORT - pMacTable->fAnyStationNonGF = FALSE; - pMacTable->fAnyStation20Only = FALSE; - pMacTable->fAnyStationIsLegacy = FALSE; - pMacTable->fAnyStationMIMOPSDynamic = FALSE; -#ifdef DOT11N_DRAFT3 - pMacTable->fAnyStaFortyIntolerant = FALSE; -#endif /* DOT11N_DRAFT3 */ - pMacTable->fAllStationGainGoodMCS = TRUE; -#endif /* DOT11_N_SUPPORT */ - startWcid = 1; -#ifdef SMART_CARRIER_SENSE_SUPPORT - - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - pAd->SCSCtrl.SCSMinRssi[BandIdx] = - 0; /* (Reset)The minimum RSSI of STA */ - pAd->SCSCtrl.OneSecRxByteCount[BandIdx] = 0; - pAd->SCSCtrl.OneSecTxByteCount[BandIdx] = 0; - } - -#endif /* SMART_CARRIER_SENSE_SUPPORT */ - - avg_pkt_len_reset(pAd); - /*TODO: Carter, modification start Wcid, Aid shall not simply equal to WCID.*/ - for (wcid = startWcid; VALID_UCAST_ENTRY_WCID(pAd, wcid); wcid++) { - MAC_TABLE_ENTRY *pEntry = &pMacTable->Content[wcid]; - STA_TR_ENTRY *tr_entry = &pMacTable->tr_entry[wcid]; - BOOLEAN bDisconnectSta = FALSE; - - if (IS_ENTRY_NONE(pEntry)) - continue; - -#ifdef CUSTOMER_DCC_FEATURE - GetTxRxActivityTime(pAd, wcid); -#endif - -#ifdef HTC_DECRYPT_IOT - - if (pEntry && - (IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry))) { - if (pEntry->HTC_AAD_OM_CountDown > - 0) /* count down to start all new pEntry->HTC_ICVErrCnt */ - pEntry->HTC_AAD_OM_CountDown--; - } - -#endif /* HTC_DECRYPT_IOT */ -#ifdef SMART_CARRIER_SENSE_SUPPORT - - if (IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry)) { - BandIdx = HcGetBandByWdev(pEntry->wdev); - pAd->SCSCtrl.OneSecRxByteCount[BandIdx] += - pEntry->OneSecRxBytes; - pAd->SCSCtrl.OneSecTxByteCount[BandIdx] += - pEntry->OneSecTxBytes; - - if (pAd->SCSCtrl.SCSEnable[BandIdx] == SCS_ENABLE) { - tmpRssi = RTMPMinRssi( - pAd, pEntry->RssiSample.AvgRssi[0], - pEntry->RssiSample.AvgRssi[1], - pEntry->RssiSample.AvgRssi[2], - pEntry->RssiSample.AvgRssi[3]); - - if (tmpRssi < pAd->SCSCtrl.SCSMinRssi[BandIdx]) - pAd->SCSCtrl.SCSMinRssi[BandIdx] = - tmpRssi; - } - } - -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -#ifdef RACTRL_LIMIT_MAX_PHY_RATE -#ifdef DOT11_VHT_AC - - if (pAd->MacTab.Size == 0) - pAd->fgRaLimitPhyRate = FALSE; - else if ((pAd->fgRaLimitPhyRate == FALSE) && - !IS_ENTRY_NONE(pEntry)) { - UINT16 u2TxTP; - BOOLEAN fgPhyModeCheck = FALSE; - - u2TxTP = pEntry->OneSecTxBytes >> BYTES_PER_SEC_TO_MBPS; - - if (pEntry->SupportRateMode & SUPPORT_VHT_MODE) { - if (pEntry->MaxHTPhyMode.field.BW == BW_160) - fgPhyModeCheck = TRUE; - - if (RACTRL_LIMIT_MAX_PHY_RATE >= - MAX_PHY_RATE_3SS) { - if (pEntry->SupportVHTMCS4SS) - fgPhyModeCheck = TRUE; - } else if (RACTRL_LIMIT_MAX_PHY_RATE >= - MAX_PHY_RATE_2SS) { - if (pEntry->SupportVHTMCS3SS) - fgPhyModeCheck = TRUE; - } else - fgPhyModeCheck = TRUE; - } - - if ((u2TxTP > LIMIT_MAX_PHY_RATE_THRESHOLD) && - fgPhyModeCheck) { - MtCmdSetMaxPhyRate(pAd, - RACTRL_LIMIT_MAX_PHY_RATE); - pAd->fgRaLimitPhyRate = TRUE; - } - } - -#endif /* DOT11_VHT_AC */ -#endif /* RACTRL_LIMIT_MAX_PHY_RATE */ -#ifdef APCLI_SUPPORT - - if (IS_ENTRY_APCLI(pEntry) && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) { - PAPCLI_STRUCT pApCliEntry = - &pAd->ApCfg.ApCliTab[pEntry->func_tb_idx]; - - pApCliEntry->OneSecTxBytes = pEntry->OneSecTxBytes; - pApCliEntry->OneSecRxBytes = pEntry->OneSecRxBytes; -#ifdef APCLI_CERT_SUPPORT - - if (pApCliEntry->NeedFallback == TRUE) { - pApCliEntry->NeedFallback = FALSE; - - if (pAd->bApCliCertTest == TRUE) { -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - if (cap->fgRateAdaptFWOffload == TRUE) { - CMD_STAREC_AUTO_RATE_UPDATE_T - rRaParam; - - NdisZeroMemory( - &rRaParam, - sizeof(CMD_STAREC_AUTO_RATE_UPDATE_T)); - rRaParam.u4Field = - RA_PARAM_HT_2040_COEX; - RAParamUpdate(pAd, pEntry, - &rRaParam); - MTWF_LOG( - DBG_CAT_ALL, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("FallBack APClient BW to 20MHz\n")); - } -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - } - } - -#endif /* APCLI_CERT_SUPPORT */ - } - -#endif /* APCLI_SUPPORT */ - -#ifdef WHNAT_SUPPORT - if ((pAd->CommonCfg.whnat_en) && - (IS_ASIC_CAP(pAd, fASIC_CAP_MCU_OFFLOAD))) { - MtCmdCr4Query(pAd, CR4_QUERY_OPTION_GET_TX_STATISTICS, - wcid, 0); - tx_offload_counter_update(pAd, pEntry); - last_one_sec_tx_pkts = pEntry->one_sec_tx_pkts; - } else -#endif - { - pEntry->AvgTxBytes = (pEntry->AvgTxBytes == 0) ? - pEntry->OneSecTxBytes : - ((pEntry->AvgTxBytes + - pEntry->OneSecTxBytes) >> - 1); - pEntry->OneSecTxBytes = 0; - pEntry->avg_tx_pkts = - (pEntry->avg_tx_pkts == 0) ? - pEntry->one_sec_tx_pkts : - ((pEntry->avg_tx_pkts + - pEntry->one_sec_tx_pkts) >> - 1); - - last_one_sec_tx_pkts = pEntry->one_sec_tx_pkts; - pEntry->one_sec_tx_pkts = 0; - } - - pEntry->AvgRxBytes = - (pEntry->AvgRxBytes == 0) ? - pEntry->OneSecRxBytes : - ((pEntry->AvgRxBytes + pEntry->OneSecRxBytes) >> - 1); - pEntry->OneSecRxBytes = 0; - pEntry->avg_rx_pkts = (pEntry->avg_rx_pkts == 0) ? - pEntry->one_sec_rx_pkts : - ((pEntry->avg_rx_pkts + - pEntry->one_sec_rx_pkts) >> - 1); - pEntry->one_sec_rx_pkts = 0; - - HW_GET_TX_STATISTIC(pAd, GET_TX_STAT_ENTRY_TX_CNT, wcid); -#ifdef APCLI_SUPPORT - - if ((IS_ENTRY_APCLI(pEntry) || IS_ENTRY_REPEATER(pEntry)) && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) { -#ifdef MAC_REPEATER_SUPPORT - - if (pEntry->bReptCli) { - pEntry->ReptCliIdleCount++; - - if ((pEntry->bReptEthCli) && - (pEntry->ReptCliIdleCount >= - MAC_TABLE_AGEOUT_TIME) && - (pEntry->bReptEthBridgeCli == - FALSE)) { /* Do NOT ageout br-lan link. @2016/1/27 */ - REPEATER_CLIENT_ENTRY *pReptCliEntry = - NULL; - - pReptCliEntry = - &pAd->ApCfg.pRepeaterCliPool - [pEntry->MatchReptCliIdx]; - - if (pReptCliEntry) - pReptCliEntry - ->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_MTM_REMOVE_STA; - - MlmeEnqueue(pAd, - APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, - 0, NULL, - (REPT_MLME_START_IDX + - pEntry->MatchReptCliIdx)); - RTMP_MLME_HANDLER(pAd); - continue; - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - - if (IS_ENTRY_APCLI(pEntry)) - apcli_wdev = pEntry->wdev; - - apcli_avg_tx += pEntry->AvgTxBytes; - apcli_avg_rx += pEntry->AvgRxBytes; - - if (((pAd->Mlme.OneSecPeriodicRound % 10) == 8) -#ifdef CONFIG_MULTI_CHANNEL - && (pAd->Mlme.bStartMcc == FALSE) -#endif /* CONFIG_MULTI_CHANNEL */ - ) { - /* use Null or QoS Null to detect the ACTIVE station*/ - BOOLEAN ApclibQosNull = FALSE; - - if (CLIENT_STATUS_TEST_FLAG( - pEntry, fCLIENT_STATUS_WMM_CAPABLE)) - ApclibQosNull = TRUE; - - ApCliRTMPSendNullFrame(pAd, pEntry->CurrTxRate, - ApclibQosNull, pEntry, - PWR_ACTIVE); - continue; - } - } - -#endif /* APCLI_SUPPORT */ - - if (!IS_ENTRY_CLIENT(pEntry)) - continue; - - if (pEntry->fgGband256QAMSupport && (pEntry->RXBAbitmap != 0) && - (pEntry->TXBAbitmap != 0) && - sta_hit_2g_infra_case_number <= STA_NUMBER_FOR_TRIGGER) { - sta_wdev = pEntry->wdev; - - if (WMODE_CAP_2G(sta_wdev->PhyMode)) { - UINT tx_tp = (pEntry->AvgTxBytes >> - BYTES_PER_SEC_TO_MBPS); - UINT rx_tp = (pEntry->AvgRxBytes >> - BYTES_PER_SEC_TO_MBPS); - - if (tx_tp > INFRA_TP_PEEK_BOUND_THRESHOLD && - ((tx_tp + rx_tp) > 0) && - (tx_tp * 100) / (tx_tp + rx_tp) > - TX_MODE_RATIO_THRESHOLD) { - if (sta_hit_2g_infra_case_number < - STA_NUMBER_FOR_TRIGGER) { - txop_wdev = sta_wdev; - sta_hit_2g_infra_case_number++; - } else - sta_hit_2g_infra_case_number++; - } - } - } - - if (pEntry->wdev) { - UINT32 tx_tp = - (pEntry->AvgTxBytes >> BYTES_PER_SEC_TO_MBPS); - UINT32 rx_tp = - (pEntry->AvgRxBytes >> BYTES_PER_SEC_TO_MBPS); - ULONG avg_tx_b = pEntry->AvgTxBytes; - ULONG avg_rx_b = pEntry->AvgRxBytes; - UINT8 traffc_mode = 0; -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - ULONG data_rate = 0; - UINT32 tp_ratio = 0; - UINT8 bidir_traffc_mode = 0; -#endif - -#ifdef CONFIG_TX_DELAY - struct tx_delay_control *tx_delay_ctl = - &pAd->tr_ctl.tx_delay_ctl; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if ((rx_tp >= MIN_AGG_EN_TP) && - (rx_tp <= MAX_AGG_EN_TP) && cap->tx_delay_support) { - if (!tx_delay_ctl->que_agg_en) { - tx_delay_ctl->que_agg_en = TRUE; - if (IS_ASIC_CAP(pAd, - fASIC_CAP_MCU_OFFLOAD)) { - MtCmdCr4Set( - pAd, - CR4_SET_ID_CONFIG_TX_DELAY_MODE, - TX_DELAY_MODE_ARG1_TX_BATCH_CNT, - tx_delay_ctl - ->tx_process_batch_cnt); - } - } - } else { - if (tx_delay_ctl->que_agg_en) { - tx_delay_ctl->que_agg_en = FALSE; - if (IS_ASIC_CAP(pAd, - fASIC_CAP_MCU_OFFLOAD)) { - MtCmdCr4Set( - pAd, - CR4_SET_ID_CONFIG_TX_DELAY_MODE, - TX_DELAY_MODE_ARG1_TX_BATCH_CNT, - 1); - } - } - } -#endif - - if ((tx_tp + rx_tp) == 0) - traffc_mode = TRAFFIC_0; - else if (((tx_tp * 100) / (tx_tp + rx_tp)) > - TX_MODE_RATIO_THRESHOLD) - traffc_mode = TRAFFIC_DL_MODE; - else if (((rx_tp * 100) / (tx_tp + rx_tp)) > - RX_MODE_RATIO_THRESHOLD) - traffc_mode = TRAFFIC_UL_MODE; - - /* get associated band with wdev*/ - BandIdx = HcGetBandByWdev(pEntry->wdev); - if (traffc_mode) { - struct tr_delay_control *tr_delay_ctl = - &pAd->tr_ctl.tr_delay_ctl; - UINT32 i; - struct dly_ctl_cfg *cfg; - UINT32 reg_val; - UINT32 rx_reg_val = 0x0; - - HIF_IO_READ32(pAd, MT_DELAY_INT_CFG, ®_val); - - rx_reg_val = reg_val & 0xffff; - - if (tr_delay_ctl->rx_delay_en) { - if (traffc_mode == TRAFFIC_DL_MODE) { - for (i = 0; - i < - tr_delay_ctl - ->dl_rx_dly_ctl_tbl_size; - i++) { - cfg = tr_delay_ctl - ->dl_rx_dly_ctl_tbl + - i; - if (tx_tp > - cfg->avg_tp) { - rx_reg_val = - cfg->dly_cfg; - continue; - } else { - break; - } - } - } - - if (traffc_mode == TRAFFIC_UL_MODE) { - for (i = 0; - i < - tr_delay_ctl - ->ul_rx_dly_ctl_tbl_size; - i++) { - cfg = tr_delay_ctl - ->ul_rx_dly_ctl_tbl + - i; - if (rx_tp > - cfg->avg_tp) { - rx_reg_val = - cfg->dly_cfg; - continue; - } else { - break; - } - } - } - } - - HIF_IO_WRITE32(pAd, MT_DELAY_INT_CFG, - rx_reg_val); - } - - if (WMODE_CAP_5G(pEntry->wdev->PhyMode) && - (pAd->txop_ctl[BandIdx].multi_client_nums < - MULTI_CLIENT_NUMS_TH)) { - pAd->txop_ctl[BandIdx].cur_wdev = pEntry->wdev; - - if (((pEntry->avg_tx_pkts > - VERIWAVE_5G_PKT_CNT_TH) && - ((avg_tx_b + avg_rx_b) > 0) && - (((avg_tx_b * 100) / - (avg_tx_b + avg_rx_b)) > - TX_MODE_RATIO_THRESHOLD)) || - ((pEntry->avg_rx_pkts > - VERIWAVE_5G_PKT_CNT_TH) && - ((avg_tx_b + avg_rx_b) > 0) && - (((avg_rx_b * 100) / - (avg_tx_b + avg_rx_b)) > - RX_MODE_RATIO_THRESHOLD))) - pAd->txop_ctl[BandIdx] - .multi_client_nums++; - } - - if (WMODE_CAP_2G(pEntry->wdev->PhyMode) && - (pAd->txop_ctl[BandIdx].multi_client_nums < - MULTI_CLIENT_2G_NUMS_TH)) { - pAd->txop_ctl[BandIdx].cur_wdev = pEntry->wdev; - - if (((pEntry->avg_tx_pkts > - VERIWAVE_2G_PKT_CNT_TH) && - ((avg_tx_b + avg_rx_b) > 0) && - (((avg_tx_b * 100) / - (avg_tx_b + avg_rx_b)) > - TX_MODE_RATIO_THRESHOLD)) || - ((pEntry->avg_rx_pkts > - VERIWAVE_2G_PKT_CNT_TH) && - ((avg_tx_b + avg_rx_b) > 0) && - (((avg_rx_b * 100) / - (avg_tx_b + avg_rx_b)) > - RX_MODE_RATIO_THRESHOLD))) - pAd->txop_ctl[BandIdx] - .multi_client_nums++; - } - - avg_pkt_len_calculate(pEntry); - CalFarClientNum(pAd, pEntry); - - if (WMODE_CAP_5G(pEntry->wdev->PhyMode)) { - if (pAd->peak_tp_ctl[BandIdx].cur_wdev == NULL) - pAd->peak_tp_ctl[BandIdx].cur_wdev = - pEntry->wdev; - pAd->peak_tp_ctl[BandIdx].client_nums++; - if (traffc_mode == TRAFFIC_DL_MODE) { - /* the entry is in tx mode */ - if (tx_tp > pAd->peak_tp_ctl[BandIdx] - .max_tx_tp) { - pAd->peak_tp_ctl[BandIdx] - .max_tx_tp = tx_tp; - pAd->peak_tp_ctl[BandIdx] - .cur_wdev = - pEntry->wdev; - } - } - } - - if (WMODE_CAP_2G(pEntry->wdev->PhyMode)) { - if (pAd->peak_tp_ctl[BandIdx].cur_wdev == NULL) - pAd->peak_tp_ctl[BandIdx].cur_wdev = - pEntry->wdev; - - pAd->peak_tp_ctl[BandIdx].client_nums++; - - if (traffc_mode == TRAFFIC_DL_MODE) { - /* the entry is in tx mode */ - if (tx_tp > pAd->peak_tp_ctl[BandIdx] - .max_tx_tp) { - pAd->peak_tp_ctl[BandIdx] - .max_tx_tp = tx_tp; - pAd->peak_tp_ctl[BandIdx] - .cur_wdev = - pEntry->wdev; - } - } - } - - if (pEntry->one_sec_tx_succ_pkts > - INFRA_KEEP_STA_PKT_TH && - pEntry->NoDataIdleCount != 0) { - pEntry->NoDataIdleCount = 0; - is_no_rx_cnt = TRUE; - } - -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - if (IS_MAP_ENABLE(pAd)) { - getRate(pEntry->HTPhyMode, &data_rate); - tp_ratio = ((tx_tp + rx_tp) * 100) / data_rate; - - if (tp_ratio > STA_TP_IDLE_THRESHOLD) - bidir_traffc_mode = - TRAFFIC_BIDIR_ACTIVE_MODE; - else - bidir_traffc_mode = - TRAFFIC_BIDIR_IDLE_MODE; - - if ((pEntry->pre_traffic_mode == - TRAFFIC_BIDIR_ACTIVE_MODE) && - (tp_ratio <= STA_TP_IDLE_THRESHOLD)) - wapp_send_cli_active_change(pAd, pEntry, - INACTIVE); - else if ((pEntry->pre_traffic_mode == - TRAFFIC_BIDIR_IDLE_MODE) && - (tp_ratio > STA_TP_IDLE_THRESHOLD)) - wapp_send_cli_active_change(pAd, pEntry, - ACTIVE); - - pEntry->pre_traffic_mode = bidir_traffc_mode; - } -#endif - } - - if (pEntry->NoDataIdleCount == 0) - pEntry->StationKeepAliveCount = 0; - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - pEntry->LastRxTimeCount++; -#endif - pEntry->NoDataIdleCount++; - /* TODO: shiang-usw, remove upper setting becasue we need to migrate to tr_entry! */ - pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0; - pEntry->StaConnectTime++; - pMbss = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; - - if (pAd->StaFastIdleCheckEnable) { - pEntry->Sta_Idle_Check_At_Sec = - pAd->StaIdleCheck_At_Sec; - if (pEntry->KeepAliveSendSucess) { - pEntry->KeepAliveSend = 0; - pEntry->KeepAliveSendError = 0; - pEntry->KeepAliveSendSucess = 0; - pEntry->NoDataLastIdleCount = 0; - } else if (pEntry->KeepAliveSendError >= - pAd->StaIdleCheck_At_NullFrameTxFailCnt) { - bDisconnectSta = TRUE; - pEntry->KeepAliveSendError = 0; - goto DeauthSta; - } else if ((pEntry->KeepAliveSend) && - (pEntry->KeepAliveSendError == 0)) { - pEntry->Sta_Idle_Check_At_Sec = 1; - pEntry->KeepAliveSend = 0; - pEntry->KeepAliveSendError = 0; - pEntry->KeepAliveSendSucess = 0; - } - - if (pEntry->wdev && - (pEntry->wdev->wdev_type == WDEV_TYPE_AP) && - (pEntry->PsMode != PWR_SAVE)) { - if ((pEntry->NoDataIdleCount > - pEntry->NoDataLastIdleCount) && - ((pEntry->NoDataIdleCount - - pEntry->NoDataLastIdleCount) >= - pEntry->Sta_Idle_Check_At_Sec)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("3 second idle case hit,last_one_sec_tx_pkts : %lu\n", - last_one_sec_tx_pkts)); - if (last_one_sec_tx_pkts > - pAd->StaIdleCheck_At_TxPktCnt) { - pEntry->KeepAliveSend++; - MtCmdSendNullFrame( - pAd, PID_NULL_FRAME, - pAd->StaIdleCheck_At_NullFrameTxCnt, - pEntry->wcid); - } - pEntry->NoDataLastIdleCount = - pEntry->NoDataIdleCount; - } - } - last_one_sec_tx_pkts = 0; - } - - /* 0. STA failed to complete association should be removed to save MAC table space. */ - if ((pEntry->Sst != SST_ASSOC) && - (pEntry->NoDataIdleCount >= pEntry->AssocDeadLine)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x fail to complete ASSOC in %lu sec\n", - PRINT_MAC(pEntry->Addr), - pEntry->AssocDeadLine)); -#ifdef WSC_AP_SUPPORT - - if (NdisEqualMemory(pEntry->Addr, - pMbss->wdev.WscControl.EntryAddr, - MAC_ADDR_LEN)) - NdisZeroMemory(pMbss->wdev.WscControl.EntryAddr, - MAC_ADDR_LEN); - -#endif /* WSC_AP_SUPPORT */ - mac_entry_delete(pAd, pEntry); - continue; - } - - /* - 1. check if there's any associated STA in power-save mode. this affects outgoing - MCAST/BCAST frames should be stored in PSQ till DtimCount=0 - */ - if (pEntry->PsMode == PWR_SAVE) { - pMacTable->fAnyStationInPsm = TRUE; - - if (pEntry->wdev && - (pEntry->wdev->wdev_type == WDEV_TYPE_AP || - pEntry->wdev->wdev_type == WDEV_TYPE_GO)) { - /* TODO: it looks like pEntry->wdev->tr_tb_idx is not assigned? */ - pAd->MacTab.tr_entry[pEntry->wdev->tr_tb_idx] - .PsMode = PWR_SAVE; - - if (tr_entry->PsDeQWaitCnt) { - tr_entry->PsDeQWaitCnt++; - - if (tr_entry->PsDeQWaitCnt > 2) - tr_entry->PsDeQWaitCnt = 0; - } - } - } - -#ifdef DOT11_N_SUPPORT - - if (pEntry->MmpsMode == MMPS_DYNAMIC) - pMacTable->fAnyStationMIMOPSDynamic = TRUE; - - if (pEntry->MaxHTPhyMode.field.BW == BW_20) - pMacTable->fAnyStation20Only = TRUE; - - if (pEntry->MaxHTPhyMode.field.MODE != MODE_HTGREENFIELD) - pMacTable->fAnyStationNonGF = TRUE; - - if ((pEntry->MaxHTPhyMode.field.MODE == MODE_OFDM) || - (pEntry->MaxHTPhyMode.field.MODE == MODE_CCK)) - pMacTable->fAnyStationIsLegacy = TRUE; - -#ifdef DOT11N_DRAFT3 - - if (pEntry->bForty_Mhz_Intolerant) - pMacTable->fAnyStaFortyIntolerant = TRUE; - -#endif /* DOT11N_DRAFT3 */ - -#endif /* DOT11_N_SUPPORT */ - /* detect the station alive status */ - - /* detect the station alive status */ - if ((pMbss->StationKeepAliveTime > 0) && - (pEntry->NoDataIdleCount >= pMbss->StationKeepAliveTime)) { - /* - If no any data success between ap and the station for - StationKeepAliveTime, try to detect whether the station is - still alive. - - Note: Just only keepalive station function, no disassociation - function if too many no response. - */ - - /* - For example as below: - - 1. Station in ACTIVE mode, - - ...... - sam> tx ok! - sam> count = 1! ==> 1 second after the Null Frame is acked - sam> count = 2! ==> 2 second after the Null Frame is acked - sam> count = 3! - sam> count = 4! - sam> count = 5! - sam> count = 6! - sam> count = 7! - sam> count = 8! - sam> count = 9! - sam> count = 10! - sam> count = 11! - sam> count = 12! - sam> count = 13! - sam> count = 14! - sam> count = 15! ==> 15 second after the Null Frame is acked - sam> tx ok! ==> (KeepAlive Mechanism) send a Null Frame to - detect the STA life status - sam> count = 1! ==> 1 second after the Null Frame is acked - sam> count = 2! - sam> count = 3! - sam> count = 4! - ...... - - If the station acknowledges the QoS Null Frame, - the NoDataIdleCount will be reset to 0. - - - 2. Station in legacy PS mode, - - We will set TIM bit after 15 seconds, the station will send a - PS-Poll frame and we will send a QoS Null frame to it. - If the station acknowledges the QoS Null Frame, the - NoDataIdleCount will be reset to 0. - - - 3. Station in legacy UAPSD mode, - - Currently we do not support the keep alive mechanism. - So if your station is in UAPSD mode, the station will be - kicked out after 300 seconds. - - Note: the rate of QoS Null frame can not be 1M of 2.4GHz or - 6M of 5GHz, or no any statistics count will occur. - */ - if (pEntry->StationKeepAliveCount++ == 0) { - if (pEntry->PsMode == PWR_SAVE) { - /* use TIM bit to detect the PS station */ - WLAN_MR_TIM_BIT_SET(pAd, - pEntry->func_tb_idx, - pEntry->Aid); - } else { - /* use Null or QoS Null to detect the ACTIVE station */ - BOOLEAN bQosNull = FALSE; - - if (CLIENT_STATUS_TEST_FLAG( - pEntry, - fCLIENT_STATUS_WMM_CAPABLE)) - bQosNull = TRUE; - - RtmpEnqueueNullFrame( - pAd, pEntry->Addr, - pEntry->CurrTxRate, pEntry->Aid, - pEntry->func_tb_idx, bQosNull, - TRUE, 0); - } - } else { - if (pEntry->StationKeepAliveCount >= - pMbss->StationKeepAliveTime) - pEntry->StationKeepAliveCount = 0; - } - } - - /* 2. delete those MAC entry that has been idle for a long time */ - - if (pEntry->NoDataIdleCount >= pEntry->StaIdleTimeout) { - bDisconnectSta = TRUE; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("ageout %02x:%02x:%02x:%02x:%02x:%02x after %d-sec silence\n", - PRINT_MAC(pEntry->Addr), - pEntry->StaIdleTimeout)); - ApLogEvent(pAd, pEntry->Addr, EVENT_AGED_OUT); -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, - pEntry->Addr, - DIAG_CONN_FRAME_LOST, - REASON_AGING_TIME_OUT); -#endif - } else if (pEntry->ContinueTxFailCnt >= - pAd->ApCfg.EntryLifeCheck) { - /* - AP have no way to know that the PwrSaving STA is leaving or not. - So do not disconnect for PwrSaving STA. - */ - if (pEntry->PsMode != PWR_SAVE) { - bDisconnectSta = TRUE; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("STA-%02x:%02x:%02x:%02x:%02x:%02x had left (%d %lu)\n", - PRINT_MAC(pEntry->Addr), - pEntry->ContinueTxFailCnt, - pAd->ApCfg.EntryLifeCheck)); -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, - pEntry->Addr, - DIAG_CONN_FRAME_LOST, - REASON_CONTINUE_TX_FAIL); -#endif - } - } - - avgRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample); - - if (pMbss->RssiLowForStaKickOut && - (avgRssi < pMbss->RssiLowForStaKickOut)) { - bDisconnectSta = TRUE; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("Disassoc STA %02x:%02x:%02x:%02x:%02x:%02x , RSSI Kickout Thres[%d]-[%d]\n", - PRINT_MAC(pEntry->Addr), - pMbss->RssiLowForStaKickOut, avgRssi)); - -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, - pEntry->Addr, DIAG_CONN_DEAUTH, - REASON_RSSI_TOO_LOW); -#endif - } - - DeauthSta: - if (bDisconnectSta) { - /* send wireless event - for ageout */ - RTMPSendWirelessEvent(pAd, IW_AGEOUT_EVENT_FLAG, - pEntry->Addr, 0, 0); -#ifdef VENDOR_FEATURE7_SUPPORT - { - UCHAR disassoc_event_msg[32] = { 0 }; - - if (WMODE_CAP_5G(pMbss->wdev.PhyMode)) - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - " %02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pEntry->Addr), - (pEntry->func_tb_idx) + - WIFI_50_RADIO); - else - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - " %02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pEntry->Addr), - (pEntry->func_tb_idx) + - WIFI_24_RADIO); - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_EVENT, STA_DISSOC, - disassoc_event_msg, - strlen(disassoc_event_msg)); - } -#endif - if (pEntry->Sst == SST_ASSOC) { - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - HEADER_802_11 DeAuthHdr; - USHORT Reason; - /* send out a DISASSOC request frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" MlmeAllocateMemory fail ..\n")); - /*NdisReleaseSpinLock(&pAd->MacTabLock); */ - continue; - } - - Reason = REASON_DEAUTH_STA_LEAVING; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("Send DEAUTH - Reason = %d frame TO %x %x %x %x %x %x\n", - Reason, PRINT_MAC(pEntry->Addr))); - MgtMacHeaderInit(pAd, &DeAuthHdr, - SUBTYPE_DEAUTH, 0, - pEntry->Addr, - pMbss->wdev.if_addr, - pMbss->wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), - &DeAuthHdr, 2, &Reason, - END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -#ifdef MAC_REPEATER_SUPPORT - - if ((pAd->ApCfg.bMACRepeaterEn == TRUE) && - IS_ENTRY_CLIENT(pEntry) -#ifdef A4_CONN - && (IS_ENTRY_A4(pEntry) == FALSE) -#endif /* A4_CONN */ - ) { - UCHAR apCliIdx, CliIdx; - REPEATER_CLIENT_ENTRY *pReptEntry = - NULL; - - pReptEntry = RTMPLookupRepeaterCliEntry( - pAd, TRUE, pEntry->Addr, TRUE); - - if (pReptEntry && - (pReptEntry->CliConnectState != - REPT_ENTRY_DISCONNT)) { - pReptEntry - ->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_MTM_REMOVE_STA; - apCliIdx = - pReptEntry - ->MatchApCliIdx; - CliIdx = - pReptEntry->MatchLinkIdx; - MlmeEnqueue( - pAd, - APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, - 0, NULL, - (REPT_MLME_START_IDX + - CliIdx)); - RTMP_MLME_HANDLER(pAd); - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - } - - mac_entry_delete(pAd, pEntry); - continue; - } else { - do_sta_keep_action(pAd, pEntry, is_no_rx_cnt); - } - -#if defined(CONFIG_HOTSPOT_R2) || defined(CONFIG_DOT11V_WNM) - - if (pEntry->BTMDisassocCount == 1) { - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - HEADER_802_11 DisassocHdr; - USHORT Reason; - /* send out a DISASSOC request frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" MlmeAllocateMemory fail ..\n")); - /*NdisReleaseSpinLock(&pAd->MacTabLock); */ - continue; - } - - Reason = REASON_DISASSOC_INACTIVE; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("BTM ASSOC - Send DISASSOC Reason = %d frame TO %x %x %x %x %x %x\n", - Reason, pEntry->Addr[0], pEntry->Addr[1], - pEntry->Addr[2], pEntry->Addr[3], - pEntry->Addr[4], pEntry->Addr[5])); - MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, - pEntry->Addr, pMbss->wdev.if_addr, - pMbss->wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), &DisassocHdr, - 2, &Reason, END_OF_ARGS); - MiniportMMRequest(pAd, MGMT_USE_PS_FLAG, pOutBuffer, - FrameLen); - MlmeFreeMemory(pOutBuffer); - -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, - pEntry->Addr, DIAG_CONN_DEAUTH, - Reason); -#endif - - /* JERRY */ - if (!pEntry->IsKeep) { - mac_entry_delete(pAd, pEntry); - } - - continue; - } - - if (pEntry->BTMDisassocCount != 0) - pEntry->BTMDisassocCount--; - -#endif /* CONFIG_HOTSPOT_R2 */ - - /* 3. garbage collect the ps_queue if the STA has being idle for a while */ - if ((pEntry->PsMode == PWR_SAVE) && - (tr_entry->ps_state == APPS_RETRIEVE_DONE || - tr_entry->ps_state == APPS_RETRIEVE_IDLE)) { - if (tr_entry->enqCount > 0) { - tr_entry->PsQIdleCount++; - - if (tr_entry->PsQIdleCount > 5) { - struct qm_ops *ops = pAd->qm_ops; - - if (ops->sta_clean_queue) - ops->sta_clean_queue( - pAd, pEntry->wcid); - - tr_entry->PsQIdleCount = 0; - WLAN_MR_TIM_BIT_CLEAR( - pAd, pEntry->func_tb_idx, - pEntry->Aid); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s():Clear WCID[%d] packets\n", - __func__, pEntry->wcid)); - } - } - } else - tr_entry->PsQIdleCount = 0; - -#ifdef UAPSD_SUPPORT - UAPSD_QueueMaintenance(pAd, pEntry); -#endif /* UAPSD_SUPPORT */ - - /* check if this STA is Ralink-chipset */ - if (!CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_RALINK_CHIPSET)) { - UCHAR band_idx; - - band_idx = HcGetBandByWdev(pEntry->wdev); - pMacTable->fAllStationAsRalink[band_idx] = FALSE; - } - -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - - if ((pEntry->BSS2040CoexistenceMgmtSupport) && - (pAd->CommonCfg.Bss2040CoexistFlag & - BSS_2040_COEXIST_INFO_NOTIFY) && - (pAd->CommonCfg.bBssCoexEnable == TRUE)) - SendNotifyBWActionFrame(pAd, pEntry->wcid, - pEntry->func_tb_idx); - -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - - /* only apply burst when run in MCS0,1,8,9,16,17, not care about phymode */ - if ((pEntry->HTPhyMode.field.MCS != 32) && - ((pEntry->HTPhyMode.field.MCS % 8 == 0) || - (pEntry->HTPhyMode.field.MCS % 8 == 1))) - pMacTable->fAllStationGainGoodMCS = FALSE; - - /* Check Current STA's Operation Mode is BW20 or BW40 */ - pMacTable->fCurrentStaBw40 = - (pEntry->HTPhyMode.field.BW == BW_40) ? TRUE : FALSE; -#ifdef WFA_VHT_PF - - if (worst_rssi == NULL) { - worst_rssi = &pEntry->RssiSample; - worst_rssi_sta_idx = wcid; - } else { - if (worst_rssi->AvgRssi[0] > - pEntry->RssiSample.AvgRssi[0]) { - worst_rssi = &pEntry->RssiSample; - worst_rssi_sta_idx = wcid; - } - } - -#endif /* WFA_VHT_PF */ -#if (defined(WH_EVENT_NOTIFIER) || \ - (defined(A4_CONN) && defined(IGMP_SNOOP_SUPPORT))) - if (pEntry && IS_ENTRY_CLIENT(pEntry) -#ifdef A4_CONN - && !IS_ENTRY_A4(pEntry) -#endif /* A4_CONN */ - && (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) { -#if defined(A4_CONN) && defined(IGMP_SNOOP_SUPPORT) - if (pMbss->a4_init && pMbss->wdev.IgmpSnoopEnable) { - /* If Snooping & MWDS enabled*/ - if ((pAd->Mlme.OneSecPeriodicRound % 10) == 0) { - /* Per 10 sec check */ - /* Logic implemented to do Periodic Multicast membership queries to NON-MWDS STAs - for update of entries in IGMP table, to avoid aging of interested members. - Also, in case another Membership querier detected in network, logic implemented to - hold internal query transmission to avoid flooding on network. - Decrement time tick counters for Query Sent & Query hold as applicable - Send the query once on each MBSS, for which both these counters are 0. - (Ensured that even with multiple STA on a MBSS, only one multicast query transmitted)*/ - - if (pAd->bIGMPperiodicQuery == TRUE) { - /* If Periodic IGMP query feature enabled */ - - if ((pMbss->IgmpQueryHoldTick > - 0) && - (pMbss->IgmpQueryHoldTickChanged == - FALSE)) { - /*Decrement IgmpQueryHoldTick, only once for each MBSS*/ - pMbss->IgmpQueryHoldTick--; - pMbss->IgmpQueryHoldTickChanged = - TRUE; - } - - if ((pAd->IgmpQuerySendTick > - 0) && - (IgmpQuerySendTickChanged == - FALSE)) { - /*Decrement IgmpQuerySendTick, only once for each MBSS*/ - pAd->IgmpQuerySendTick--; - IgmpQuerySendTickChanged = - TRUE; - } - - if ((pMbss->IGMPPeriodicQuerySent == - FALSE) && - ((pMbss->IgmpQueryHoldTick == - 0) && - (pAd->IgmpQuerySendTick == - 0))) { - /*transmit IGMP query on this MBSS, only once*/ - send_igmpv3_gen_query_pkt( - pAd, pEntry); - - pMbss->IGMPPeriodicQuerySent = - TRUE; - } - } - - if (pAd->bMLDperiodicQuery == - TRUE) { /*If Periodic MLD query feature enabled*/ - - if ((pMbss->MldQueryHoldTick > - 0) && - (pMbss->MldQueryHoldTickChanged == - FALSE)) { - /*Decrement MldQueryHoldTick, only once for each MBSS*/ - pMbss->MldQueryHoldTick--; - pMbss->MldQueryHoldTickChanged = - TRUE; - } - - if ((pAd->MldQuerySendTick > - 0) && - (MldQuerySendTickChanged == - FALSE)) { - /*Decrement MldQuerySendTick, only once for each MBSS*/ - pAd->MldQuerySendTick--; - MldQuerySendTickChanged = - TRUE; - } - if ((pMbss->MLDPeriodicQuerySent == - FALSE) && - ((pMbss->MldQueryHoldTick == - 0) && - (pAd->MldQuerySendTick == - 0))) { - /*transmit MLD query on this MBSS, only once*/ - send_mldv2_gen_query_pkt( - pAd, pEntry); - - pMbss->MLDPeriodicQuerySent = - TRUE; - } - } - } else if ((pAd->Mlme.OneSecPeriodicRound % - 10) == 1) { /* Per 11 sec check */ - - if (pAd->IgmpQuerySendTick == - 0) /* Set the period for IGMP query again */ - pAd->IgmpQuerySendTick = - QUERY_SEND_PERIOD; - - if (pAd->MldQuerySendTick == - 0) /* Set the period for MLD query again */ - pAd->MldQuerySendTick = - QUERY_SEND_PERIOD; - - if (pMbss->IGMPPeriodicQuerySent == - TRUE) - pMbss->IGMPPeriodicQuerySent = - FALSE; /* Reset flag for next period query */ - - if (pMbss->MLDPeriodicQuerySent == TRUE) - pMbss->MLDPeriodicQuerySent = - FALSE; /* Reset flag for next period query */ - - pMbss->IgmpQueryHoldTickChanged = - FALSE; /* Reset flag for next 10th second counter edit */ - pMbss->MldQueryHoldTickChanged = - FALSE; /* Reset flag for next 10th second counter edit */ - } - } -#endif - } -#endif - } - -#ifdef WFA_VHT_PF - - if (worst_rssi != NULL && ((pAd->Mlme.OneSecPeriodicRound % 10) == 5) && - (worst_rssi_sta_idx >= 1)) { - CHAR gain = 2; - - if (worst_rssi->AvgRssi[0] >= -40) - gain = 1; - else if (worst_rssi->AvgRssi[0] <= -50) - gain = 2; - - rt85592_lna_gain_adjust(pAd, gain); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():WorstRSSI for STA(%02x:%02x:%02x:%02x:%02x:%02x):%d,%d,%d, Set Gain as %s\n", - __func__, - PRINT_MAC(pMacTable->Content[worst_rssi_sta_idx].Addr), - worst_rssi->AvgRssi[0], worst_rssi->AvgRssi[1], - worst_rssi->AvgRssi[2], (gain == 2 ? "Mid" : "Low"))); - } - -#endif /* WFA_VHT_PF */ -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - - if (pAd->CommonCfg.Bss2040CoexistFlag & BSS_2040_COEXIST_INFO_NOTIFY) - pAd->CommonCfg.Bss2040CoexistFlag &= - (~BSS_2040_COEXIST_INFO_NOTIFY); - -#endif /* DOT11N_DRAFT3 */ - - /* If all associated STAs are Ralink-chipset, AP shall enable RDG. */ - if (pAd->CommonCfg.bRdg) { - if (pMacTable->fAllStationAsRalink[0]) - bRdgActive = TRUE; - else - bRdgActive = FALSE; - - if (pAd->CommonCfg.dbdc_mode) { - if (pMacTable->fAllStationAsRalink[1]) - ; /* Not support yet... */ - } - } - -#ifdef APCLI_SUPPORT - - if (apcli_wdev) { - UINT tx_tp = (apcli_avg_tx >> BYTES_PER_SEC_TO_MBPS); - UINT rx_tp = (apcli_avg_rx >> BYTES_PER_SEC_TO_MBPS); - - apcli_dync_txop_alg(pAd, apcli_wdev, tx_tp, rx_tp); - } - -#endif /* APCLI_SUPPORT */ - - if (sta_hit_2g_infra_case_number == STA_NUMBER_FOR_TRIGGER) { - if (pAd->G_MODE_INFRA_TXOP_RUNNING == FALSE) { - pAd->g_mode_txop_wdev = txop_wdev; - pAd->G_MODE_INFRA_TXOP_RUNNING = TRUE; - enable_tx_burst(pAd, txop_wdev, AC_BE, PRIO_2G_INFRA, - TXOP_FE); - } else if (pAd->g_mode_txop_wdev != txop_wdev) { - disable_tx_burst(pAd, pAd->g_mode_txop_wdev, AC_BE, - PRIO_2G_INFRA, TXOP_0); - enable_tx_burst(pAd, txop_wdev, AC_BE, PRIO_2G_INFRA, - TXOP_FE); - pAd->g_mode_txop_wdev = txop_wdev; - } - } else { - if (pAd->G_MODE_INFRA_TXOP_RUNNING == TRUE) { - disable_tx_burst(pAd, pAd->g_mode_txop_wdev, AC_BE, - PRIO_2G_INFRA, TXOP_0); - pAd->G_MODE_INFRA_TXOP_RUNNING = FALSE; - pAd->g_mode_txop_wdev = NULL; - } - } - -#ifndef DISABLE_MULTICLIENT_DYNAMIC_TXOP - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - if (pAd->txop_ctl[BandIdx].multi_client_nums == - MULTI_CLIENT_NUMS_TH) { - if (pAd->txop_ctl[BandIdx].multi_cli_txop_running == - FALSE) { - pAd->txop_ctl[BandIdx].multi_cli_txop_running = - TRUE; - enable_tx_burst(pAd, - pAd->txop_ctl[BandIdx].cur_wdev, - AC_BE, PRIO_MULTI_CLIENT, - TXOP_0); - } - } else { - if (pAd->txop_ctl[BandIdx].multi_cli_txop_running == - TRUE) { - pAd->txop_ctl[BandIdx].multi_cli_txop_running = - FALSE; - disable_tx_burst( - pAd, pAd->txop_ctl[BandIdx].cur_wdev, - AC_BE, PRIO_MULTI_CLIENT, TXOP_0); - } - } - } - - /* - if (pAd->txop_ctl.multi_client_nums_2g == MULTI_CLIENT_2G_NUMS_TH) { - if (pAd->txop_ctl.multi_cli_txop_2g_running == FALSE) { - pAd->txop_ctl.multi_cli_txop_2g_running = TRUE; - enable_tx_burst(pAd, pAd->txop_ctl.cur_wdev_2g, AC_BE, PRIO_MULTI_CLIENT, TXOP_0); - } - } else { - if (pAd->txop_ctl.multi_cli_txop_2g_running == TRUE) { - pAd->txop_ctl.multi_cli_txop_2g_running = FALSE; - disable_tx_burst(pAd, pAd->txop_ctl.cur_wdev_2g, AC_BE, PRIO_MULTI_CLIENT, TXOP_0); - } - } -*/ - /*dynamic adjust amsdu & protection mode*/ - dynamic_amsdu_protect_adjust(pAd); -#endif -#if defined(VOW_SUPPORT) && defined(CONFIG_AP_SUPPORT) - dynamic_airtime_fairness_adjust(pAd); -#endif - dynamic_ampdu_efficiency_adjust_all(pAd); - - if (pAd->CommonCfg.bRalinkBurstMode && - pMacTable->fAllStationGainGoodMCS) - bRalinkBurstMode = TRUE; - else - bRalinkBurstMode = FALSE; - - if (bRdgActive != RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE)) { - /* DBDC not support yet, only using BAND_0 */ - } - - if (bRalinkBurstMode != - RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RALINK_BURST_MODE)) - AsicSetRalinkBurstMode(pAd, bRalinkBurstMode); - -#endif /* DOT11_N_SUPPORT */ -#ifdef RTMP_MAC_PCI - RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); -#endif /* RTMP_MAC_PCI */ - - /* - 4. - garbage collect pAd->MacTab.McastPsQueue if backlogged MCAST/BCAST frames - stale in queue. Since MCAST/BCAST frames always been sent out whenever - DtimCount==0, the only case to let them stale is surprise removal of the NIC, - so that ASIC-based Tbcn interrupt stops and DtimCount dead. - */ - /* TODO: shiang-usw. revise this becasue now we have per-BSS McastPsQueue! */ -#ifdef RT_CFG80211_SUPPORT -#else - if (pMacTable->McastPsQueue.Head) { - UINT bss_index; - - pMacTable->PsQIdleCount++; - - if (pMacTable->PsQIdleCount > 1) { - APCleanupPsQueue(pAd, &pMacTable->McastPsQueue); - pMacTable->PsQIdleCount = 0; - - if (pAd->ApCfg.BssidNum > MAX_MBSSID_NUM(pAd)) - pAd->ApCfg.BssidNum = MAX_MBSSID_NUM(pAd); - - /* clear MCAST/BCAST backlog bit for all BSS */ - for (bss_index = BSS0; bss_index < pAd->ApCfg.BssidNum; - bss_index++) - WLAN_MR_TIM_BCMC_CLEAR(bss_index); - } - } else - pMacTable->PsQIdleCount = 0; -#endif - -#ifdef RTMP_MAC_PCI - RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); -#endif /* RTMP_MAC_PCI */ -#ifndef DISABLE_MULTICLIENT_DYNAMIC_TXOP - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) - pAd->txop_ctl[BandIdx].multi_client_nums = 0; -#endif -} - -UINT32 MacTableAssocStaNumGet(RTMP_ADAPTER *pAd) -{ - UINT32 num = 0; - UINT32 i; - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i]; - - if (!IS_ENTRY_CLIENT(pEntry)) - continue; - - if (pEntry->Sst == SST_ASSOC) - num++; - } - - return num; -} - -/* - ========================================================================== - Description: - Look up a STA MAC table. Return its Sst to decide if an incoming - frame from this STA or an outgoing frame to this STA is permitted. - Return: - ========================================================================== -*/ -MAC_TABLE_ENTRY *APSsPsInquiry(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr, - OUT SST *Sst, OUT USHORT *Aid, OUT UCHAR *PsMode, - OUT UCHAR *Rate) -{ - MAC_TABLE_ENTRY *pEntry = NULL; - - if (MAC_ADDR_IS_GROUP(pAddr)) { /* mcast & broadcast address */ - *Sst = SST_ASSOC; - *Aid = MCAST_WCID_TO_REMOVE; /* Softap supports 1 BSSID and use WCID=0 as multicast Wcid index */ - *PsMode = PWR_ACTIVE; - *Rate = pAd->CommonCfg.MlmeRate; - } else { /* unicast address */ - pEntry = MacTableLookup(pAd, pAddr); - - if (pEntry) { - *Sst = pEntry->Sst; - *Aid = pEntry->Aid; - *PsMode = pEntry->PsMode; - - if (IS_AKM_WPA_CAPABILITY_Entry(pEntry) && - (pEntry->SecConfig.Handshake.GTKState != - REKEY_ESTABLISHED)) - *Rate = pAd->CommonCfg.MlmeRate; - else - *Rate = pEntry->CurrTxRate; - } else { - *Sst = SST_NOT_AUTH; - *Aid = MCAST_WCID_TO_REMOVE; - *PsMode = PWR_ACTIVE; - *Rate = pAd->CommonCfg.MlmeRate; - } - } - - return pEntry; -} - -#ifdef SYSTEM_LOG_SUPPORT -/* - ========================================================================== - Description: - This routine is called to log a specific event into the event table. - The table is a QUERY-n-CLEAR array that stop at full. - ========================================================================== - */ -VOID ApLogEvent(RTMP_ADAPTER *pAd, UCHAR *pAddr, USHORT Event) -{ - if (pAd->EventTab.Num < MAX_NUM_OF_EVENT) { - RT_802_11_EVENT_LOG *pLog = - &pAd->EventTab.Log[pAd->EventTab.Num]; - - RTMP_GetCurrentSystemTime(&pLog->SystemTime); - COPY_MAC_ADDR(pLog->Addr, pAddr); - pLog->Event = Event; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("LOG#%ld %02x:%02x:%02x:%02x:%02x:%02x %s\n", - pAd->EventTab.Num, pAddr[0], pAddr[1], pAddr[2], - pAddr[3], pAddr[4], pAddr[5], pEventText[Event])); - pAd->EventTab.Num += 1; - } -} -#endif /* SYSTEM_LOG_SUPPORT */ - -#ifdef DOT11_N_SUPPORT -/* - ========================================================================== - Description: - Operationg mode is as defined at 802.11n for how proteciton in this BSS operates. - Ap broadcast the operation mode at Additional HT Infroamtion Element Operating Mode fields. - 802.11n D1.0 might has bugs so this operating mode use EWC MAC 1.24 definition first. - - Called when receiving my bssid beacon or beaconAtJoin to update protection mode. - 40MHz or 20MHz protection mode in HT 40/20 capabale BSS. - As STA, this obeys the operation mode in ADDHT IE. - As AP, update protection when setting ADDHT IE and after new STA joined. - ========================================================================== -*/ -VOID APUpdateOperationMode(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - BOOLEAN bNonGFExist = FALSE; - ADD_HT_INFO_IE *addht = NULL; - UINT32 new_protection = 0; - UCHAR op_mode = NON_PROTECT; - UCHAR ht_protect_en = 1; - UINT16 multi_client_num_th; - - if (wdev == NULL) - return; - - if (WMODE_CAP_2G(wdev->PhyMode)) - multi_client_num_th = MULTI_CLIENT_2G_NUMS_TH; - else if (WMODE_CAP_5G(wdev->PhyMode)) - multi_client_num_th = MULTI_CLIENT_NUMS_TH; - else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s[%d]\n", __func__, __LINE__)); - return; - } - - addht = wlan_operate_get_addht(wdev); - ht_protect_en = wlan_config_get_ht_protect_en(wdev); - - if (ht_protect_en) { - /* non HT BSS exist within 5 sec */ - if ((pAd->ApCfg.LastNoneHTOLBCDetectTime + (5 * OS_HZ)) > - pAd->Mlme.Now32 && - pAd->Mlme.Now32 != 0) { - op_mode = NONMEMBER_PROTECT; - bNonGFExist = TRUE; /* non-HT means nonGF support */ - new_protection = SET_PROTECT(NON_MEMBER_PROTECT); - } - - /* If I am 40MHz BSS, and there exist HT-20MHz station. */ - /* Update to 2 when it's zero. Because OperaionMode = 1 or 3 has more protection. */ - if ((op_mode == NON_PROTECT) && - (pAd->MacTab.fAnyStation20Only) && - (wlan_config_get_ht_bw(wdev) == HT_BW_40)) { - op_mode = BW20_PROTECT; - new_protection = SET_PROTECT(HT20_PROTECT); - } - - if (pAd->MacTab.fAnyStationIsLegacy || - pAd->MacTab.Size >= multi_client_num_th) { - op_mode = NONHT_MM_PROTECT; - new_protection = SET_PROTECT(NON_HT_MIXMODE_PROTECT); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - (" --%s:\n OperationMode: %d, bNonGFExist: %d\n", - __func__, addht->AddHtInfo2.OperaionMode, - bNonGFExist)); - - if ((op_mode != addht->AddHtInfo2.OperaionMode) || - (pAd->MacTab.fAnyStationNonGF != - addht->AddHtInfo2.NonGfPresent)) { - addht->AddHtInfo2.OperaionMode = op_mode; - addht->AddHtInfo2.NonGfPresent = - pAd->MacTab.fAnyStationNonGF; - - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } - - if (bNonGFExist == FALSE) - bNonGFExist = pAd->MacTab.fAnyStationNonGF; - - if (bNonGFExist) - new_protection |= SET_PROTECT(GREEN_FIELD_PROTECT); - - /*if no protect should enable for CTS-2-Self, WHQA_00025629*/ - if (MTK_REV_GTE(pAd, MT7615, MT7615E1) && - MTK_REV_LT(pAd, MT7615, MT7615E3)) - if (pAd->CommonCfg.dbdc_mode && - op_mode == NON_PROTECT) { - op_mode = BW20_PROTECT; - new_protection |= SET_PROTECT(HT20_PROTECT); - } - } - if (nonerp_protection(&pAd->ApCfg.MBSSID[wdev->func_idx])) - new_protection |= SET_PROTECT(ERP); - -#if defined(MT_MAC) - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if ((new_protection & wdev->protection) != new_protection) { - wdev->protection = new_protection; - - AsicUpdateProtect(pAd); - } - } -#endif -} -#endif /* DOT11_N_SUPPORT */ - -/* - ========================================================================== - Description: - Check if the specified STA pass the Access Control List checking. - If fails to pass the checking, then no authentication nor association - is allowed - Return: - MLME_SUCCESS - this STA passes ACL checking - - ========================================================================== -*/ -BOOLEAN ApCheckAccessControlList(RTMP_ADAPTER *pAd, UCHAR *pAddr, UCHAR Apidx) -{ - BOOLEAN Result = TRUE; -#ifdef ACL_BLK_COUNT_SUPPORT - ULONG idx; -#endif - if (Apidx >= HW_BEACON_MAX_NUM) - return FALSE; - -#ifdef CUSTOMER_DCC_FEATURE - if (pAd->ApDisableSTAConnectFlag == TRUE) { - INT count, i; - UINT32 time; - - Result = FALSE; - time = jiffies_to_msecs(jiffies); - count = pAd->AllowedStaList.StaCount; - for (i = 0; i < count; i++) { - if (NdisEqualMemory(&(pAd->AllowedStaList.AllowedSta[i] - .MacAddr[0]), - pAddr, MAC_ADDR_LEN)) { - if ((time - pAd->AllowedStaList.AllowedSta[i] - .DissocTime) < 30000) { - Result = TRUE; - } - break; - } - } - - if (!Result) - return Result; - } -#endif - - if (pAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy == - 0) /* ACL is disabled */ - Result = TRUE; - else { - ULONG i; - - if (pAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy == - 1) /* ACL is a positive list */ - Result = FALSE; - else /* ACL is a negative list */ - Result = TRUE; - - for (i = 0; i < pAd->ApCfg.MBSSID[Apidx].AccessControlList.Num; - i++) { - if (MAC_ADDR_EQUAL(pAddr, - pAd->ApCfg.MBSSID[Apidx] - .AccessControlList.Entry[i] - .Addr)) { - Result = !Result; - break; - } - } - } -#ifdef ACL_BLK_COUNT_SUPPORT - if (pAd->ApCfg.MBSSID[Apidx].AccessControlList.Policy != 2) { - for (idx = 0; - idx < pAd->ApCfg.MBSSID[Apidx].AccessControlList.Num; - idx++) - (pAd->ApCfg.MBSSID[Apidx] - .AccessControlList.Entry[idx] - .Reject_Count) = 0; - } -#endif - - if (Result == FALSE) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x failed in ACL checking\n", - PRINT_MAC(pAddr))); - } - - return Result; -} - -/* - ========================================================================== - Description: - This routine update the current MAC table based on the current ACL. - If ACL change causing an associated STA become un-authorized. This STA - will be kicked out immediately. - ========================================================================== -*/ -VOID ApUpdateAccessControlList(RTMP_ADAPTER *pAd, UCHAR Apidx) -{ - USHORT AclIdx, MacIdx; - BOOLEAN Matched; - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - HEADER_802_11 DisassocHdr; - USHORT Reason; - MAC_TABLE_ENTRY *pEntry; - BSS_STRUCT *pMbss; - BOOLEAN drop; - - ASSERT(Apidx < MAX_MBSSID_NUM(pAd)); - - if (Apidx >= MAX_MBSSID_NUM(pAd)) - return; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ApUpdateAccessControlList : Apidx = %d\n", Apidx)); - /* ACL is disabled. Do nothing about the MAC table. */ - pMbss = &pAd->ApCfg.MBSSID[Apidx]; - - if (pMbss->AccessControlList.Policy == 0) - return; - - for (MacIdx = 0; VALID_UCAST_ENTRY_WCID(pAd, MacIdx); MacIdx++) { - pEntry = &pAd->MacTab.Content[MacIdx]; - - if (!IS_ENTRY_CLIENT(pEntry)) - continue; - - /* We only need to update associations related to ACL of MBSSID[Apidx]. */ - if (pEntry->func_tb_idx != Apidx) - continue; - - drop = FALSE; - Matched = FALSE; - - for (AclIdx = 0; AclIdx < pMbss->AccessControlList.Num; - AclIdx++) { - if (MAC_ADDR_EQUAL(&pEntry->Addr[0], - pMbss->AccessControlList - .Entry[AclIdx] - .Addr)) { - Matched = TRUE; - break; - } - } - - if ((Matched == FALSE) && - (pMbss->AccessControlList.Policy == 1)) { - drop = TRUE; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("STA not on positive ACL. remove it...\n")); - } else if ((Matched == TRUE) && - (pMbss->AccessControlList.Policy == 2)) { - drop = TRUE; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("STA on negative ACL. remove it...\n")); - } - - if (drop == TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Apidx = %d\n", Apidx)); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("pAd->ApCfg.MBSSID[%d].AccessControlList.Policy = %ld\n", - Apidx, pMbss->AccessControlList.Policy)); - - /* Before delete the entry from MacTable, send disassociation packet to client. */ - if (pEntry->Sst == SST_ASSOC) { - /* send out a DISASSOC frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" MlmeAllocateMemory fail ..\n")); - return; - } - - Reason = REASON_DECLINED; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("ASSOC - Send DISASSOC Reason = %d frame TO %x %x %x %x %x %x\n", - Reason, PRINT_MAC(pEntry->Addr))); - MgtMacHeaderInit(pAd, &DisassocHdr, - SUBTYPE_DISASSOC, 0, - pEntry->Addr, - pMbss->wdev.if_addr, - pMbss->wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), - &DisassocHdr, 2, &Reason, - END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - RtmpusecDelay(5000); - } -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, - pEntry->Addr, DIAG_CONN_ACL_BLK, - 0); -#endif -#ifdef MAP_R2 - if (IS_ENTRY_CLIENT(pEntry) && IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc(pAd, pEntry->wcid, - Reason); -#endif - mac_entry_delete(pAd, pEntry); - } - } -} - -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 -/* - Depends on the 802.11n Draft 4.0, Before the HT AP start a BSS, it should scan some specific channels to -collect information of existing BSSs, then depens on the collected channel information, adjust the primary channel -and secondary channel setting. - - For 5GHz, - Rule 1: If the AP chooses to start a 20/40 MHz BSS in 5GHz and that occupies the same two channels - as any existing 20/40 MHz BSSs, then the AP shall ensure that the primary channel of the - new BSS is identical to the primary channel of the existing 20/40 MHz BSSs and that the - secondary channel of the new 20/40 MHz BSS is identical to the secondary channel of the - existing 20/40 MHz BSSs, unless the AP discoverr that on those two channels are existing - 20/40 MHz BSSs with different primary and secondary channels. - Rule 2: If the AP chooses to start a 20/40MHz BSS in 5GHz, the selected secondary channel should - correspond to a channel on which no beacons are detected during the overlapping BSS - scan time performed by the AP, unless there are beacons detected on both the selected - primary and secondary channels. - Rule 3: An HT AP should not start a 20 MHz BSS in 5GHz on a channel that is the secondary channel - of a 20/40 MHz BSS. - For 2.4GHz, - Rule 1: The AP shall not start a 20/40 MHz BSS in 2.4GHz if the value of the local variable "20/40 - Operation Permitted" is FALSE. - - 20/40OperationPermitted = (P == OPi for all values of i) AND - (P == OTi for all values of i) AND - (S == OSi for all values if i) - where - P is the operating or intended primary channel of the 20/40 MHz BSS - S is the operating or intended secondary channel of the 20/40 MHz BSS - OPi is member i of the set of channels that are members of the channel set C and that are the - primary operating channel of at least one 20/40 MHz BSS that is detected within the AP's - BSA during the previous X seconds - OSi is member i of the set of channels that are members of the channel set C and that are the - secondary operating channel of at least one 20/40 MHz BSS that is detected within AP's - BSA during the previous X seconds - OTi is member i of the set of channels that comparises all channels that are members of the - channel set C that were listed once in the Channel List fields of 20/40 BSS Intolerant Channel - Report elements receved during the previous X seconds and all channels that are members - of the channel set C and that are the primary operating channel of at least one 20/40 MHz - BSS that were detected within the AP's BSA during the previous X seconds. - C is the set of all channels that are allowed operating channels within the current operational - regulatory domain and whose center frequency falls within the 40 MHz affected channel - range given by following equation: - Fp + Fs Fp + Fs - 40MHz affected channel range = [ ------ - 25MHz, ------- + 25MHz ] - 2 2 - Where - Fp = the center frequency of channel P - Fs = the center frequency of channel S - - "==" means that the values on either side of the "==" are to be tested for equaliy with a resulting - Boolean value. - =>When the value of OPi is the empty set, then the expression (P == OPi for all values of i) - is defined to be TRUE - =>When the value of OTi is the empty set, then the expression (P == OTi for all values of i) - is defined to be TRUE - =>When the value of OSi is the empty set, then the expression (S == OSi for all values of i) - is defined to be TRUE -*/ -INT GetBssCoexEffectedChRange(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN BSS_COEX_CH_RANGE *pCoexChRange, - IN UCHAR Channel) -{ - INT index, cntrCh = 0; - UCHAR op_ext_cha = wlan_operate_get_ext_cha(wdev); - - UCHAR BandIdx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - - memset(pCoexChRange, 0, sizeof(BSS_COEX_CH_RANGE)); - /* Build the effected channel list, if something wrong, return directly. */ -#ifdef A_BAND_SUPPORT - - if (Channel > 14) { - /* For 5GHz band */ - for (index = 0; index < pChCtrl->ChListNum; index++) { - if (pChCtrl->ChList[index].Channel == Channel) - break; - } - - if (index < pChCtrl->ChListNum) { - /* First get the primary channel */ - pCoexChRange->primaryCh = - pChCtrl->ChList[index].Channel; - - /* Now check about the secondary and central channel */ - if (op_ext_cha == EXTCHA_ABOVE) { - pCoexChRange->effectChStart = - pCoexChRange->primaryCh; - pCoexChRange->effectChEnd = - pCoexChRange->primaryCh + 4; - pCoexChRange->secondaryCh = - pCoexChRange->effectChEnd; - } else { - pCoexChRange->effectChStart = - pCoexChRange->primaryCh - 4; - pCoexChRange->effectChEnd = - pCoexChRange->primaryCh; - pCoexChRange->secondaryCh = - pCoexChRange->effectChStart; - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("5.0GHz: Found CtrlCh idx(%d) from the ChList, ExtCh=%s, PriCh=[Idx:%d, CH:%d], SecCh=[Idx:%d, CH:%d], effected Ch=[CH:%d~CH:%d]!\n", - index, - ((op_ext_cha == EXTCHA_ABOVE) ? "ABOVE" : - "BELOW"), - pCoexChRange->primaryCh, - pChCtrl->ChList[pCoexChRange->primaryCh] - .Channel, - pCoexChRange->secondaryCh, - pChCtrl->ChList[pCoexChRange->secondaryCh] - .Channel, - pChCtrl->ChList[pCoexChRange->effectChStart] - .Channel, - pChCtrl->ChList[pCoexChRange->effectChEnd] - .Channel)); - return TRUE; - } - - /* It should not happened! */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("5GHz: Cannot found the CtrlCh(%d) in ChList, something wrong?\n", - Channel)); - } else -#endif /* A_BAND_SUPPORT */ - { /* For 2.4GHz band */ - for (index = 0; index < pChCtrl->ChListNum; index++) { - if (pChCtrl->ChList[index].Channel == Channel) - break; - } - - if (index < pChCtrl->ChListNum) { - /* First get the primary channel */ - pCoexChRange->primaryCh = index; - - /* Now check about the secondary and central channel */ - if (op_ext_cha == EXTCHA_ABOVE) { - if ((index + 4) < pChCtrl->ChListNum) { - cntrCh = index + 2; - pCoexChRange->secondaryCh = index + 4; - } - } else { - if ((index - 4) >= 0) { - cntrCh = index - 2; - pCoexChRange->secondaryCh = index - 4; - } - } - - if (cntrCh) { - pCoexChRange->effectChStart = - (cntrCh - 5) > 0 ? (cntrCh - 5) : 0; - pCoexChRange->effectChEnd = - (cntrCh + 5) < pChCtrl->ChListNum ? - (cntrCh + 5) : - (pChCtrl->ChListNum - 1); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("2.4GHz: Found CtrlCh idx(%d) from the ChList, ExtCh=%s, PriCh=[Idx:%d, CH:%d], SecCh=[Idx:%d, CH:%d], effected Ch=[CH:%d~CH:%d]!\n", - index, - ((op_ext_cha == EXTCHA_ABOVE) ? - "ABOVE" : - "BELOW"), - pCoexChRange->primaryCh, - pChCtrl->ChList[pCoexChRange->primaryCh] - .Channel, - pCoexChRange->secondaryCh, - pChCtrl->ChList[pCoexChRange - ->secondaryCh] - .Channel, - pChCtrl->ChList[pCoexChRange - ->effectChStart] - .Channel, - pChCtrl->ChList[pCoexChRange - ->effectChEnd] - .Channel)); - } - - return TRUE; - } - - /* It should not happened! */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("2.4GHz: Didn't found valid channel range, Ch index=%d, ChListNum=%d, CtrlCh=%d\n", - index, pChCtrl->ChListNum, Channel)); - } - - return FALSE; -} - -#ifndef RT_CFG80211_SUPPORT -static INT32 wlan_update_rf_ht_bw(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR ht_bw, UCHAR ext_cha) -{ - UINT32 idx; - BSS_STRUCT *pCurMbss = NULL; - - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - pCurMbss = &pAd->ApCfg.MBSSID[idx]; - - /* MBSS is up */ - if (!pCurMbss->wdev.if_up_down_state) - continue; - - /* MBSS works on the same channel as wdev */ - if (pCurMbss->wdev.channel == wdev->channel) { - wlan_operate_set_prim_ch(&pCurMbss->wdev, - pCurMbss->wdev.channel); - wlan_operate_set_ht_bw(&pCurMbss->wdev, ht_bw, ext_cha); - } - } - - return 0; -} -#endif - -VOID APOverlappingBSSScan(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - BOOLEAN needFallBack = FALSE; - INT chStartIdx, chEndIdx, index, curPriChIdx, curSecChIdx; - BSS_COEX_CH_RANGE coexChRange; - UCHAR PhyMode = wdev->PhyMode; - UCHAR Channel = wdev->channel; - UCHAR ht_bw = wlan_operate_get_ht_bw(wdev); - UCHAR ext_cha = wlan_operate_get_ext_cha(wdev); - UCHAR BandIdx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - - if (!WMODE_CAP_2G(PhyMode)) - return; - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY)) - return; - - /* We just care BSS who operating in 40MHz N Mode. */ - if ((!WMODE_CAP_N(PhyMode)) || (ht_bw == BW_20)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("The wdev->PhyMode=%d, BW=%d, didn't need channel adjustment!\n", - PhyMode, ht_bw)); - return; - } - - /* Build the effected channel list, if something wrong, return directly. */ - /* For 2.4GHz band */ - for (index = 0; index < pChCtrl->ChListNum; index++) { - if (pChCtrl->ChList[index].Channel == Channel) - break; - } - - if (index < pChCtrl->ChListNum) { - if (ext_cha == EXTCHA_ABOVE) { - curPriChIdx = index; - curSecChIdx = ((index + 4) < pChCtrl->ChListNum) ? - (index + 4) : - (pChCtrl->ChListNum - 1); - chStartIdx = (curPriChIdx >= 3) ? (curPriChIdx - 3) : 0; - chEndIdx = ((curSecChIdx + 3) < pChCtrl->ChListNum) ? - (curSecChIdx + 3) : - (pChCtrl->ChListNum - 1); - } else { - curPriChIdx = index; - curSecChIdx = ((index - 4) >= 0) ? (index - 4) : 0; - chStartIdx = (curSecChIdx >= 3) ? (curSecChIdx - 3) : 0; - chEndIdx = ((curPriChIdx + 3) < pChCtrl->ChListNum) ? - (curPriChIdx + 3) : - (pChCtrl->ChListNum - 1); - } - } else { - /* It should not happened! */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("2.4GHz: Cannot found the Control Channel(%d) in ChannelList, something wrong?\n", - Channel)); - return; - } - - GetBssCoexEffectedChRange(pAd, wdev, &coexChRange, Channel); - - /* Before we do the scanning, clear the bEffectedChannel as zero for latter use. */ - for (index = 0; index < pChCtrl->ChListNum; index++) - pChCtrl->ChList[index].bEffectedChannel = 0; - - pAd->CommonCfg.BssCoexApCnt = 0; - - /* If we are not ready for Tx/Rx Pakcet, enable it now for receiving Beacons. */ - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP) == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Card still not enable Tx/Rx, enable it now!\n")); - RTMP_IRQ_ENABLE(pAd); - /* rtmp_rx_done_handle() API will check this flag to decide accept incoming packet or not. */ - /* Set the flag be ready to receive Beacon frame for autochannel select. */ - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP); - } - - RTMPEnableRxTx(pAd); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Ready to do passive scanning for Channel[%d] to Channel[%d]!\n", - pChCtrl->ChList[chStartIdx].Channel, - pChCtrl->ChList[chEndIdx].Channel)); - /* Now start to do the passive scanning. */ - pAd->CommonCfg.bOverlapScanning = TRUE; - - for (index = chStartIdx; index <= chEndIdx; index++) { - Channel = pChCtrl->ChList[index].Channel; - wlan_operate_scan(wdev, Channel); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AP OBSS SYNC - BBP R4 to 20MHz.l\n")); - /*MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Passive scanning for Channel %d.....\n", Channel)); */ - OS_WAIT(300); /* wait for 200 ms at each channel. */ - } - - pAd->CommonCfg.bOverlapScanning = FALSE; - - /* After scan all relate channels, now check the scan result to find out if we need fallback to 20MHz. */ - for (index = chStartIdx; index <= chEndIdx; index++) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Channel[Idx=%d, Ch=%d].bEffectedChannel=0x%x!\n", - index, pChCtrl->ChList[index].Channel, - pChCtrl->ChList[index].bEffectedChannel)); - - if ((pChCtrl->ChList[index].bEffectedChannel & - (EFFECTED_CH_PRIMARY | EFFECTED_CH_LEGACY)) && - (index != curPriChIdx)) { - needFallBack = TRUE; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("needFallBack=TRUE due to OP/OT!\n")); - } - - if ((pChCtrl->ChList[index].bEffectedChannel & - EFFECTED_CH_SECONDARY) && - (index != curSecChIdx)) { - needFallBack = TRUE; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("needFallBack=TRUE due to OS!\n")); - } - } - - /* If need fallback, now do it. */ - if ((needFallBack == TRUE) && - (pAd->CommonCfg.BssCoexApCnt > pAd->CommonCfg.BssCoexApCntThr)) { -#ifdef RT_CFG80211_SUPPORT - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); -#else - wlan_update_rf_ht_bw(pAd, wdev, HT_BW_20, EXTCHA_NONE); - pAd->CommonCfg.need_fallback = 1; -#endif - pAd->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq = 1; - pAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC; - } else { - pAd->CommonCfg.need_fallback = 0; - /*restore to original channel*/ - wlan_operate_set_prim_ch(wdev, wdev->channel); - wlan_operate_set_ht_bw(wdev, ht_bw, ext_cha); - } -} -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - -#define DBDC_AP_5G_PEAK_TP 610 -#define DBDC_AP_2G_PEAK_TP 270 -#define TP_100M_LOWER_BOUND 60 -#define TP_100M_UPPER_BOUND 120 -#define DBDC_PEAK_TP_PER_THRESHOLD 5 - -static VOID dynamic_ampdu_efficiency_adjust_all(struct _RTMP_ADAPTER *ad) -{ - EDCA_PARM *edcaparam; - ULONG per = 0; - ULONG tx_cnt; - COUNTER_802_11 *wlan_ct = NULL; - struct wifi_dev *wdev = NULL; - UINT16 level = TXOP_80, multi_client_num_th = 0, dbdc_peak_tp = 0; - UCHAR band_idx = 0; - - for (band_idx = 0; band_idx < DBDC_BAND_NUM; band_idx++) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] BandIdx:%d\n", __func__, band_idx)); - - if (ad->peak_tp_ctl[band_idx].client_nums == 0) - goto ignore_ampdu_efficiency_check; - - wlan_ct = &ad->WlanCounters[band_idx]; - wdev = ad->peak_tp_ctl[band_idx].cur_wdev; - tx_cnt = wlan_ct->AmpduSuccessCount.u.LowPart; - - if (WMODE_CAP_2G(wdev->PhyMode)) { - multi_client_num_th = MULTI_CLIENT_2G_NUMS_TH; - dbdc_peak_tp = DBDC_AP_2G_PEAK_TP; - } else if (WMODE_CAP_5G(wdev->PhyMode)) { - multi_client_num_th = MULTI_CLIENT_NUMS_TH; - dbdc_peak_tp = DBDC_AP_5G_PEAK_TP; - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s[%d]\n", __func__, __LINE__)); - continue; - } - - if (ad->txop_ctl[band_idx].multi_client_nums == - multi_client_num_th) { - /* do no apply patch, it is in veriwave multi-client case */ - goto ignore_ampdu_efficiency_check; - } - - if (tx_cnt > 0) - per = 100 * (wlan_ct->AmpduFailCount.u.LowPart) / - (wlan_ct->AmpduFailCount.u.LowPart + tx_cnt); - - if (per >= DBDC_PEAK_TP_PER_THRESHOLD) { - /* do no apply patch, it is in noise environment */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s[%d]per=%lu\n", __func__, __LINE__, per)); - goto ignore_ampdu_efficiency_check; - } - - /* scenario detection */ - if ((ad->CommonCfg.dbdc_mode) && - (ad->peak_tp_ctl[band_idx].max_tx_tp > dbdc_peak_tp)) { - ad->peak_tp_ctl[band_idx].cli_peak_tp_running = 1; - level = TXOP_FE; - - if (level != - ad->peak_tp_ctl[band_idx].cli_peak_tp_txop_level) - ad->peak_tp_ctl[band_idx] - .cli_peak_tp_txop_enable = FALSE; - } else if ((ad->peak_tp_ctl[band_idx].max_tx_tp > - TP_100M_LOWER_BOUND) && - (ad->peak_tp_ctl[band_idx].max_tx_tp < - TP_100M_UPPER_BOUND)) { - ad->peak_tp_ctl[band_idx].cli_peak_tp_running = 1; - level = TXOP_60; - - if (level != - ad->peak_tp_ctl[band_idx].cli_peak_tp_txop_level) - ad->peak_tp_ctl[band_idx] - .cli_peak_tp_txop_enable = FALSE; - } else - ad->peak_tp_ctl[band_idx].cli_peak_tp_running = 0; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s[%d]per=%lu, tx=%d M, (%d, %d, %d)\n\r", __func__, - __LINE__, per, ad->peak_tp_ctl[band_idx].max_tx_tp, - ad->peak_tp_ctl[band_idx].cli_peak_tp_running, - ad->peak_tp_ctl[band_idx].cli_ampdu_efficiency_running, - ad->peak_tp_ctl[band_idx].cli_peak_tp_txop_enable)); - - /* increase ampdu efficiency if running peak T.P */ - if (ad->peak_tp_ctl[band_idx].cli_peak_tp_running) { - if (!ad->peak_tp_ctl[band_idx] - .cli_ampdu_efficiency_running) { - if (query_tx_burst_prio(ad, wdev) <= - PRIO_PEAK_TP) { - AsicAmpduEfficiencyAdjust(wdev, 0xf); - ad->peak_tp_ctl[band_idx] - .cli_ampdu_efficiency_running = - TRUE; - } - } - - if (!ad->peak_tp_ctl[band_idx].cli_peak_tp_txop_enable) { - enable_tx_burst(ad, wdev, AC_BE, PRIO_PEAK_TP, - level); - ad->peak_tp_ctl[band_idx] - .cli_peak_tp_txop_level = level; - ad->peak_tp_ctl[band_idx] - .cli_peak_tp_txop_enable = TRUE; - } - } else { - /* restore to original */ - if (ad->peak_tp_ctl[band_idx] - .cli_ampdu_efficiency_running) { - edcaparam = HcGetEdca(ad, wdev); - - if (edcaparam) - AsicAmpduEfficiencyAdjust( - wdev, edcaparam->Aifsn[0]); - - ad->peak_tp_ctl[band_idx] - .cli_ampdu_efficiency_running = FALSE; - } - - if (ad->peak_tp_ctl[band_idx].cli_peak_tp_txop_enable) { - disable_tx_burst(ad, wdev, AC_BE, PRIO_PEAK_TP, - level); - ad->peak_tp_ctl[band_idx] - .cli_peak_tp_txop_enable = FALSE; - } - } - - ignore_ampdu_efficiency_check: - - /* restore aifs adjust since dynamic txop owner is not peak throughput */ - if (ad->peak_tp_ctl[band_idx].cli_ampdu_efficiency_running) { - if (query_tx_burst_prio(ad, wdev) > PRIO_PEAK_TP) { - edcaparam = HcGetEdca(ad, wdev); - - if (edcaparam) - AsicAmpduEfficiencyAdjust( - wdev, edcaparam->Aifsn[0]); - - ad->peak_tp_ctl[band_idx] - .cli_ampdu_efficiency_running = FALSE; - } - } - - /* clear some record */ - ad->peak_tp_ctl[band_idx].client_nums = 0; - ad->peak_tp_ctl[band_idx].max_tx_tp = 0; - } -} - -#ifdef DOT1X_SUPPORT -/* - ======================================================================== - Routine Description: - Send Leyer 2 Frame to notify 802.1x daemon. This is a internal command - - Arguments: - - Return Value: - TRUE - send successfully - FAIL - send fail - - Note: - ======================================================================== -*/ -BOOLEAN DOT1X_InternalCmdAction(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry, IN UINT8 cmd) -{ - INT apidx = MAIN_MBSSID; - UCHAR RalinkIe[9] = { 221, 7, 0x00, 0x0c, 0x43, 0x00, 0x00, 0x00, 0x00 }; - UCHAR s_addr[MAC_ADDR_LEN]; - UCHAR EAPOL_IE[] = { 0x88, 0x8e }; -#ifdef OCE_FILS_SUPPORT -#define OCE_FILS_CMD_PAYLOAD_LEN 1024 -#else -#define OCE_FILS_CMD_PAYLOAD_LEN 0 -#endif /* OCE_FILS_SUPPORT */ -#ifdef RADIUS_ACCOUNTING_SUPPORT - DOT1X_QUERY_STA_DATA data; -#define FRAME_BUF_LEN \ - (LENGTH_802_3 + sizeof(RalinkIe) + VLAN_HDR_LEN + \ - sizeof(DOT1X_QUERY_STA_DATA) + OCE_FILS_CMD_PAYLOAD_LEN) -#else -#define FRAME_BUF_LEN \ - (LENGTH_802_3 + sizeof(RalinkIe) + VLAN_HDR_LEN + \ - OCE_FILS_CMD_PAYLOAD_LEN) -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ - UINT frame_len = 0; - UCHAR FrameBuf[FRAME_BUF_LEN]; - UINT8 offset = 0; - USHORT bss_Vlan_Priority = 0; - USHORT bss_Vlan; - USHORT TCI; - /* Init the frame buffer */ - NdisZeroMemory(FrameBuf, FRAME_BUF_LEN); -#ifdef RADIUS_ACCOUNTING_SUPPORT - NdisMoveMemory(data.StaAddr, pEntry->Addr, MAC_ADDR_LEN); - data.rx_bytes = pEntry->RxBytes; - data.tx_bytes = pEntry->TxBytes; - data.rx_packets = pEntry->RxPackets.u.LowPart; - data.tx_packets = pEntry->TxPackets.u.LowPart; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::rx_byte:%lu tx_byte:%lu rx_pkt:%lu tx_pkt:%lu\n", - __func__, data.rx_bytes, data.tx_bytes, data.rx_packets, - data.rx_packets)); -#endif /* RADIUS_ACCOUNTING_SUPPORT */ - - if (pEntry) { - apidx = pEntry->func_tb_idx; - NdisMoveMemory(s_addr, pEntry->Addr, MAC_ADDR_LEN); - } else { - /* Fake a Source Address for transmission */ - NdisMoveMemory(s_addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid, - MAC_ADDR_LEN); - s_addr[0] |= 0x80; - } - - /* Assign internal command for Ralink dot1x daemon */ - RalinkIe[5] = cmd; - - if (pAd->ApCfg.MBSSID[apidx].wdev.VLAN_VID) { - bss_Vlan = pAd->ApCfg.MBSSID[apidx].wdev.VLAN_VID; - bss_Vlan_Priority = pAd->ApCfg.MBSSID[apidx].wdev.VLAN_Priority; - frame_len = (LENGTH_802_3 + sizeof(RalinkIe) + VLAN_HDR_LEN); - MAKE_802_3_HEADER(FrameBuf, pAd->ApCfg.MBSSID[apidx].wdev.bssid, - s_addr, EAPOL_IE); - offset += LENGTH_802_3 - 2; - NdisMoveMemory((FrameBuf + offset), TPID, 2); - offset += 2; - TCI = (bss_Vlan & 0x0FFF) | ((bss_Vlan_Priority & 0x7) << 13); -#ifndef RT_BIG_ENDIAN - TCI = SWAP16(TCI); -#endif - *(USHORT *)(FrameBuf + offset) = TCI; - offset += 2; - NdisMoveMemory((FrameBuf + offset), EAPOL_IE, 2); - offset += 2; - } else { - frame_len = (LENGTH_802_3 + sizeof(RalinkIe)); - /* Prepare the 802.3 header */ - MAKE_802_3_HEADER(FrameBuf, pAd->ApCfg.MBSSID[apidx].wdev.bssid, - s_addr, EAPOL_IE); - offset += LENGTH_802_3; - } - - /* Prepare the specific header of internal command */ - NdisMoveMemory(&FrameBuf[offset], RalinkIe, sizeof(RalinkIe)); -#ifdef RADIUS_ACCOUNTING_SUPPORT - offset += sizeof(RalinkIe); - /*add accounting info*/ - NdisMoveMemory(&FrameBuf[offset], (unsigned char *)&data, - sizeof(DOT1X_QUERY_STA_DATA)); -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ -#ifdef OCE_FILS_SUPPORT - if ((cmd == DOT1X_MLME_EVENT) || (cmd == DOT1X_AEAD_ENCR_EVENT)) { -#ifdef RADIUS_ACCOUNTING_SUPPORT - offset += sizeof(DOT1X_QUERY_STA_DATA); -#else - offset += sizeof(RalinkIe); -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ - frame_len += pEntry->filsInfo.pending_ie_len; - if (frame_len > FRAME_BUF_LEN) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s frame_len(%u) > FRAME_BUF_LEN(%u) (cmd=%d)\n", - __func__, frame_len, FRAME_BUF_LEN, cmd)); - return FALSE; - } - - NdisMoveMemory(&FrameBuf[offset], pEntry->filsInfo.pending_ie, - pEntry->filsInfo.pending_ie_len); - } else if (cmd == DOT1X_AEAD_DECR_EVENT) { - PHEADER_802_11 pHeader = NULL; - UCHAR hdr_len = LENGTH_802_11; - -#ifdef RADIUS_ACCOUNTING_SUPPORT - offset += sizeof(DOT1X_QUERY_STA_DATA); -#else - offset += sizeof(RalinkIe); -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ - /* PTK Info */ - frame_len += pEntry->filsInfo.PTK_len; - NdisMoveMemory(&FrameBuf[offset], pEntry->filsInfo.PTK, - pEntry->filsInfo.PTK_len); - offset += pEntry->filsInfo.PTK_len; - - /* EAPOL Packet */ - pHeader = (PHEADER_802_11)pEntry->filsInfo.pending_ie; -#ifdef A4_CONN - if (pHeader->FC.FrDs == 1 && pHeader->FC.ToDs == 1) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif /* A4_CONN */ - - frame_len += (pEntry->filsInfo.pending_ie_len - hdr_len - - LENGTH_802_1_H); - if (frame_len > FRAME_BUF_LEN) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s frame_len(%u) > FRAME_BUF_LEN(%u) (cmd=%d)\n", - __func__, frame_len, FRAME_BUF_LEN, cmd)); - return FALSE; - } - NdisMoveMemory( - &FrameBuf[offset], - &pEntry->filsInfo.pending_ie[hdr_len + LENGTH_802_1_H], - (pEntry->filsInfo.pending_ie_len - hdr_len - - LENGTH_802_1_H)); - } -#endif /* OCE_FILS_SUPPORT */ - - /* Report to upper layer */ - if (RTMP_L2_FRAME_TX_ACTION(pAd, apidx, FrameBuf, frame_len) == FALSE) - return FALSE; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s done. (cmd=%d)\n", __func__, cmd)); - return TRUE; -} - -/* - ======================================================================== - Routine Description: - Send Leyer 2 Frame to trigger 802.1x EAP state machine. - - Arguments: - - Return Value: - TRUE - send successfully - FAIL - send fail - - Note: - ======================================================================== -*/ -BOOLEAN DOT1X_EapTriggerAction(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry) -{ - /* TODO: shiang-usw, fix me for pEntry->apidx to func_tb_idx */ - INT apidx = MAIN_MBSSID; - UCHAR eapol_start_1x_hdr[4] = { 0x01, 0x01, 0x00, 0x00 }; - enum { FRAME_LEN = LENGTH_802_3 + sizeof(eapol_start_1x_hdr) }; - UINT8 frame_len = FRAME_LEN; - UCHAR FrameBuf[FRAME_LEN + 32]; - UINT8 offset = 0; - USHORT bss_Vlan_Priority = 0; - USHORT bss_Vlan; - USHORT TCI; - - if (IS_AKM_1X_Entry(pEntry) || - IS_IEEE8021X_Entry(&pAd->ApCfg.MBSSID[apidx].wdev)) { - /* Init the frame buffer */ - NdisZeroMemory(FrameBuf, FRAME_LEN); - /* Assign apidx */ - apidx = pEntry->func_tb_idx; - - if (pAd->ApCfg.MBSSID[apidx].wdev.VLAN_VID) { - /*Prepare 802.3 header including VLAN tag*/ - bss_Vlan = pAd->ApCfg.MBSSID[apidx].wdev.VLAN_VID; - bss_Vlan_Priority = - pAd->ApCfg.MBSSID[apidx].wdev.VLAN_Priority; - frame_len += VLAN_HDR_LEN; - MAKE_802_3_HEADER(FrameBuf, - pAd->ApCfg.MBSSID[apidx].wdev.bssid, - pEntry->Addr, EAPOL) - offset += LENGTH_802_3 - 2; - NdisMoveMemory((FrameBuf + offset), TPID, 2); - offset += 2; - TCI = (bss_Vlan & 0x0fff) | - ((bss_Vlan_Priority & 0x7) << 13); -#ifndef RT_BIG_ENDIAN - TCI = SWAP16(TCI); -#endif - *(USHORT *)(FrameBuf + offset) = TCI; - offset += 2; - NdisMoveMemory((FrameBuf + offset), EAPOL, 2); - offset += 2; - } else { - /* Prepare the 802.3 header */ - MAKE_802_3_HEADER(FrameBuf, - pAd->ApCfg.MBSSID[apidx].wdev.bssid, - pEntry->Addr, EAPOL); - offset += LENGTH_802_3; - } - - /* Prepare a fake eapol-start body */ - NdisMoveMemory(&FrameBuf[offset], eapol_start_1x_hdr, - sizeof(eapol_start_1x_hdr)); -#ifdef CONFIG_HOTSPOT_R2 - - if (pEntry) { - BSS_STRUCT *pMbss = pEntry->pMbss; - - if ((pMbss->HotSpotCtrl.HotSpotEnable == 1) && - (IS_AKM_WPA2_Entry(&pMbss->wdev)) && - (pEntry->hs_info.ppsmo_exist == 1)) { - UCHAR HS2_Header[4] = { 0x50, 0x6f, 0x9a, - 0x12 }; - - memcpy(&FrameBuf[offset + - sizeof(eapol_start_1x_hdr)], - HS2_Header, 4); - memcpy(&FrameBuf[offset + - sizeof(eapol_start_1x_hdr) + 4], - &pEntry->hs_info, - sizeof(struct _sta_hs_info)); - frame_len += 4 + sizeof(struct _sta_hs_info); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("DOT1X_EapTriggerAction: event eapol start, %x:%x:%x:%x\n", - FrameBuf[offset + - sizeof(eapol_start_1x_hdr) + - 4], - FrameBuf[offset + - sizeof(eapol_start_1x_hdr) + - 5], - FrameBuf[offset + - sizeof(eapol_start_1x_hdr) + - 6], - FrameBuf[offset + - sizeof(eapol_start_1x_hdr) + - 7])); - } - } - -#endif - - /* Report to upper layer */ - if (RTMP_L2_FRAME_TX_ACTION(pAd, apidx, FrameBuf, frame_len) == - FALSE) - return FALSE; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Notify 8021.x daemon to trigger EAP-SM for this sta(%02x:%02x:%02x:%02x:%02x:%02x)\n", - PRINT_MAC(pEntry->Addr))); - } - - return TRUE; -} - -#endif /* DOT1X_SUPPORT */ - -INT rtmp_ap_init(RTMP_ADAPTER *pAd) -{ -#ifdef WSC_AP_SUPPORT - UCHAR j; - BSS_STRUCT *mbss = NULL; - struct wifi_dev *wdev = NULL; - PWSC_CTRL pWscControl; - - for (j = BSS0; j < pAd->ApCfg.BssidNum; j++) { - mbss = &pAd->ApCfg.MBSSID[j]; - wdev = &pAd->ApCfg.MBSSID[j].wdev; - { - pWscControl = &wdev->WscControl; - pWscControl->WscRxBufLen = 0; - pWscControl->pWscRxBuf = NULL; - os_alloc_mem(pAd, &pWscControl->pWscRxBuf, - MAX_MGMT_PKT_LEN); - - if (pWscControl->pWscRxBuf) - NdisZeroMemory(pWscControl->pWscRxBuf, - MAX_MGMT_PKT_LEN); - - pWscControl->WscTxBufLen = 0; - pWscControl->pWscTxBuf = NULL; - os_alloc_mem(pAd, &pWscControl->pWscTxBuf, - MAX_MGMT_PKT_LEN); - - if (pWscControl->pWscTxBuf) - NdisZeroMemory(pWscControl->pWscTxBuf, - MAX_MGMT_PKT_LEN); - } - } - -#endif /* WSC_AP_SUPPORT */ - APOneShotSettingInitialize(pAd); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("apstart up %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pAd->CurrentAddress))); - APInitForMain(pAd); - - /* Set up the Mac address*/ - RtmpOSNetDevAddrSet(pAd->OpMode, pAd->net_dev, &pAd->CurrentAddress[0], - NULL); - /* ap_func_init(pAd); */ - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - /* Now Enable MacRxTx*/ - RTMP_IRQ_ENABLE(pAd); - RTMPEnableRxTx(pAd); - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP); - } - -#ifdef CONFIG_INIT_RADIO_ONOFF - if (!pAd->ApCfg.bRadioOn) { -#ifdef FT_R1KH_KEEP - pAd->ApCfg.FtTab.FT_RadioOff = TRUE; -#endif /* FT_R1KH_KEEP */ - APStop(pAd, &pAd->ApCfg.MBSSID[BSS0], AP_BSS_OPER_BY_RF); - MlmeRadioOff(pAd, &pAd->ApCfg.MBSSID[BSS0].wdev); - } -#endif - -#ifdef CFG_SUPPORT_MU_MIMO_RA - /*Send In-Band Command to N9 about Platform Type 7621/7623*/ - SetMuraPlatformTypeProc(pAd); - SetMuraEnableHwSwPatch(pAd); -#endif - -#ifdef FAST_UP_RATE_SUPPORT - MtCmdSetFastUpRate(pAd, TRUE); -#endif - -#ifdef MT_FDB - fdb_enable(pAd); -#endif /* MT_FDB */ - return NDIS_STATUS_SUCCESS; -} - -VOID rtmp_ap_exit(RTMP_ADAPTER *pAd) -{ - BOOLEAN Cancelled; - - RTMPReleaseTimer(&pAd->ApCfg.CounterMeasureTimer, &Cancelled); -#ifdef IDS_SUPPORT - /* Init intrusion detection timer */ - RTMPReleaseTimer(&pAd->ApCfg.IDSTimer, &Cancelled); -#endif /* IDS_SUPPORT */ -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - RTMP_11N_D3_TimerRelease(pAd); -#endif /*DOT11N_DRAFT3*/ -#endif /*DOT11_N_SUPPORT*/ - /* Free BssTab & ChannelInfo tabbles.*/ - AutoChBssTableDestroy(pAd); - ChannelInfoDestroy(pAd); -#ifdef IGMP_SNOOP_SUPPORT - MultiCastFilterTableReset(pAd, &pAd->pMulticastFilterTable); - MultiCastWLTableReset(pAd, &pAd->pMcastWLTable); -#endif /* IGMP_SNOOP_SUPPORT */ -} - -/* -* system security decision for ap mode -*/ -UINT32 starec_ap_feature_decision(struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, - UINT32 *feature) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - UINT32 features = 0; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - - if (cap->APPSMode == APPS_MODE2) - features |= STA_REC_AP_PS_FEATURE; - - /*temport used for security will integrate to CMD*/ - if (IS_CIPHER_WEP(entry->SecConfig.PairwiseCipher)) - features |= STA_REC_INSTALL_KEY_FEATURE; - - /*return value, must use or operation*/ - *feature |= features; - return TRUE; -} - -/*system for ap mode*/ -/* -* -*/ -INT ap_link_up(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry) -{ - if (WDEV_BSS_STATE(wdev) == BSS_INIT) { - wifi_sys_linkup(wdev, NULL); - APStartRekeyTimer(wdev->sys_handle, wdev); - } - - OPSTATUS_SET_FLAG_WDEV(wdev, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - return TRUE; -} - -/* -* -*/ -INT ap_link_down(struct wifi_dev *wdev) -{ - APStopRekeyTimer(wdev->sys_handle, wdev); - ap_sec_deinit(wdev); - - if (WDEV_BSS_STATE(wdev) >= BSS_INITED) { - /* kick out all stas behind the Bss */ - MbssKickOutStas(wdev->sys_handle, wdev->func_idx, - REASON_DISASSOC_INACTIVE); - UpdateBeaconHandler(wdev->sys_handle, wdev, - BCN_UPDATE_DISABLE_TX); - - /*linkdown bssinfo*/ - if (wifi_sys_linkdown(wdev) != TRUE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): linkdown fail!\n", __func__)); - return FALSE; - } - } - - return TRUE; -} - -/* -* -*/ -INT ap_conn_act(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - - /*generic connection action*/ - if (wifi_sys_conn_act(wdev, entry) != TRUE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): connect action fail!\n", __func__)); - } - -#if defined(MT7615) || defined(MT7637) || defined(MT7622) || defined(P18) || \ - defined(MT7663) - - if (IS_MT7615(ad) || IS_MT7637(ad) || IS_MT7622(ad) || IS_P18(ad) || - IS_MT7663(ad)) - RAInit(ad, entry); - -#endif /* defined(MT7615) || defined(MT7637) || defined(MT7622) */ -#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) && \ - defined(TXBF_SUPPORT) && defined(MT7615) - - /* Disable TXBF apply for DFS zero wait start */ - if ((ad->BgndScanCtrl.BgndScanStatMachine.CurrState == - BGND_RDD_DETEC) && - IS_SUPPORT_MT_ZEROWAIT_DFS(ad)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s][ZeroWait]In CAC period, Disable TXBF Apply\n", - __func__)); - HW_AP_TXBF_TX_APPLY(ad, FALSE); - } - -#endif - return TRUE; -} - -/* -* -*/ -INT ap_inf_open(struct wifi_dev *wdev) -{ - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; -#ifdef BACKGROUND_SCAN_SUPPORT - UINT32 CrValue; -#endif /* BACKGROUND_SCAN_SUPPORT */ - -#ifdef GREENAP_SUPPORT - /* This function will check and update allow status */ - if (greenap_check_when_if_down_up(pAd) == FALSE) - return FALSE; -#endif /* GREENAP_SUPPORT */ -#ifdef CONFIG_INIT_RADIO_ONOFF - if (pAd->ApCfg.bRadioOn) { -#endif - - if (wifi_sys_open(wdev) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() open fail!!!\n", __func__)); - return FALSE; - } - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP inf up for ra_%x(func_idx) OmacIdx=%d\n", - wdev->func_idx, wdev->OmacIdx)); - - MlmeRadioOn(pAd, wdev); -#ifdef CONFIG_INIT_RADIO_ONOFF - } -#endif - - /* action for ap interface up */ - pAd->ApCfg.MBSSID[wdev->func_idx].mbss_idx = wdev->func_idx; -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - if (pAd->ApCfg.MBSSID[wdev->func_idx].APStartPseduState != - AP_STATE_ALWAYS_START_AP_DEFAULT) { - wdev->bAllowBeaconing = FALSE; - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Disable Beaconing\n", __func__)); - } else { - wdev->bAllowBeaconing = TRUE; - } -#else - wdev->bAllowBeaconing = TRUE; -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - ap_run_at_boot(pAd, wdev); -#ifdef BACKGROUND_SCAN_SUPPORT - BackgroundScanInit(pAd); - /* Enable band0 IPI SW control */ - HW_IO_READ32(pAd, PHY_RXTD_12, &CrValue); - CrValue |= (1 << B0IrpiSwCtrlResetOffset); - CrValue |= (1 << B0IrpiSwCtrlOnlyOffset); - HW_IO_WRITE32(pAd, PHY_RXTD_12, CrValue); - HW_IO_WRITE32(pAd, PHY_RXTD_12, CrValue); - /* Enable badn0 IPI control */ - HW_IO_READ32(pAd, PHY_BAND0_PHYMUX_5, &CrValue); - CrValue |= (B0IpiEnableCtrlValue << B0IpiEnableCtrlOffset); - HW_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, CrValue); -#endif /* BACKGROUND_SCAN_SUPPORT */ - - APStartUpForMbss(pAd, &pAd->ApCfg.MBSSID[wdev->func_idx]); - /* Logic to perform OBSS scan for 2.4G only and - * one time for all MBSS configured to same channel. - */ - { - BSS_STRUCT *pMbss = NULL; - - pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - /* - * GBandChanBitMap is used to store the 2.4Ghz channel for which - * BSS overlap scan is done. - * Purpose: In case of MBSS, to avoid repeated - * overlapped scan for the same channel. - * No need for obss scan if RF up is on 5Ghz - */ - if (pMbss && (pMbss->wdev.channel < 14)) { - if (!(pAd->ApCfg.ObssGBandChanBitMap & - (1 << pMbss->wdev.channel))) { - pAd->ApCfg.ObssGBandChanBitMap |= - (1 << pMbss->wdev.channel); - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] wdev->func_idx:%d channel:%d ApCfg.BssidNum:%d \ - wdev.if_up_down_state:%d GBandChanBitMap:0x%x\n", - __func__, wdev->func_idx, - wdev->channel, pAd->ApCfg.BssidNum, - pMbss->wdev.if_up_down_state, - pAd->ApCfg.ObssGBandChanBitMap)); - - if (pMbss->wdev.if_up_down_state) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] calling ap_over_lapping_scan\n", - __func__)); - ap_over_lapping_scan(pAd, pMbss); - } - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] 2.4G Band CHAN already Set:: GBandChanBitMap:0x%x pMbss->wdev.channel:%d\n", - __func__, - pAd->ApCfg.ObssGBandChanBitMap, - pMbss->wdev.channel)); - if (pAd->CommonCfg.need_fallback == 1) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] Need fallback to 20 MHz: pMbss->wdev.channel:%d\n", - __func__, - pMbss->wdev.channel)); - wlan_operate_set_ht_bw(&pMbss->wdev, - HT_BW_20, - EXTCHA_NONE); - } - } - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] CHAN is of 5G Band: pMbss->wdev.channel:%d\n", - __func__, pMbss->wdev.channel)); - } - } - -#ifdef WSC_INCLUDED - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("apidx %d for WscUUIDInit\n", wdev->func_idx)); - WscUUIDInit(pAd, wdev->func_idx, FALSE); -#endif /* WSC_INCLUDED */ - -#ifdef DPP_SUPPORT - DlListInit(&wdev->dpp_frame_event_list); -#endif /* DPP_SUPPORT */ - - return TRUE; -} - -/* -* -*/ -INT ap_inf_close(struct wifi_dev *wdev) -{ - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; - - if (pAd == NULL) - return FALSE; - -#ifdef GREENAP_SUPPORT - /* This function will check and update allow status */ - if (greenap_check_when_if_down_up(pAd) == FALSE) - return FALSE; -#endif /* GREENAP_SUPPORT */ - - /* Move orig RTMPInfClose here */ - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - wdev->bAllowBeaconing = FALSE; - - if (wdev_do_linkdown(wdev) != TRUE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() linkdown fail!!!\n", __func__)); - - if (wifi_sys_close(wdev) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() close fail!!!\n", __func__)); - return FALSE; - } -#ifdef BAND_STEERING - if (pAd->ApCfg.BandSteering) { - PBND_STRG_CLI_TABLE table; - - table = Get_BndStrgTable(pAd, BSS0); - if (table) { - /* Inform daemon interface down */ - BndStrg_SetInfFlags(pAd, wdev, table, FALSE); - } - } -#endif /* BAND_STEERING */ - } - - return TRUE; -} - -BOOLEAN media_state_connected(struct wifi_dev *wdev) -{ - struct _RTMP_ADAPTER *ad; - - ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - return (OPSTATUS_TEST_FLAG(ad, fOP_STATUS_MEDIA_STATE_CONNECTED) && - OPSTATUS_TEST_FLAG(ad, fOP_AP_STATUS_MEDIA_STATE_CONNECTED)); -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_apcli.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_apcli.c deleted file mode 100644 index ee71fca40d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_apcli.c +++ /dev/null @@ -1,7179 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_apcli.c - Abstract: - Support AP-Client function. - - Note: - 1. Call RT28xx_ApCli_Init() in init function and - call RT28xx_ApCli_Remove() in close function - - 2. MAC of ApCli-interface is initialized in RT28xx_ApCli_Init() - - 3. ApCli index (0) of different rx packet is got in - - 4. ApCli index (0) of different tx packet is assigned in - - 5. ApCli index (0) of different interface is got in tx_pkt_handle() by using - - 6. ApCli index (0) of IOCTL command is put in pAd->OS_Cookie->ioctl_if - - 8. The number of ApCli only can be 1 - - 9. apcli convert engine subroutines, we should just take care data packet. - Revision History: - Who When What - -------------- ---------- ---------------------------------------------- - Shiang, Fonchi 02-13-2007 created -*/ - -#ifdef APCLI_SUPPORT - -#include "rt_config.h" -#ifdef ROAMING_ENHANCE_SUPPORT -#include -#endif /* ROAMING_ENHANCE_SUPPORT */ - -#ifdef DOT11_VHT_AC -#ifdef APCLI_CERT_SUPPORT -extern UINT16 vht_max_mpdu_size[]; -#endif -#endif /* DOT11_VHT_AC */ -#ifdef MAC_REPEATER_SUPPORT -VOID ReptWaitLinkDown(struct _REPEATER_CLIENT_ENTRY *pReptEntry); -#endif /*MAC_REPEATER_SUPPORT*/ - -#ifdef CONVERTER_MODE_SWITCH_SUPPORT -#ifdef MULTI_INF_SUPPORT -/* Index 0 for Card_1, Index 1 for Card_2 */ -extern VOID *adapt_list[MAX_NUM_OF_INF]; -#endif /* MULTI_INF_SUPPORT */ -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - -BOOLEAN ApCliWaitProbRsp(PRTMP_ADAPTER pAd, USHORT ifIndex) -{ - if (ifIndex >= MAX_APCLI_NUM) - return FALSE; - - return (pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState == - APCLI_JOIN_WAIT_PROBE_RSP) ? - TRUE : - FALSE; -} - -VOID ApCliSimulateRecvBeacon(RTMP_ADAPTER *pAd) -{ - INT loop; - ULONG Now32, BPtoJiffies; - PAPCLI_STRUCT pApCliEntry = NULL; - LONG timeDiff; - - NdisGetSystemUpTime(&Now32); - - for (loop = 0; loop < MAX_APCLI_NUM; loop++) { - pApCliEntry = &pAd->ApCfg.ApCliTab[loop]; - - if ((pApCliEntry->Valid == TRUE) && - (VALID_UCAST_ENTRY_WCID(pAd, pApCliEntry->MacTabWCID))) { - /* - When we are connected and do the scan progress, it's very possible we cannot receive - the beacon of the AP. So, here we simulate that we received the beacon. - */ - if (RTMP_TEST_FLAG( - pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) && - (RTMP_TIME_AFTER(pAd->Mlme.Now32, - pApCliEntry->ApCliRcvBeaconTime + - (1 * OS_HZ)))) { - BPtoJiffies = - (((pApCliEntry->ApCliBeaconPeriod * - 1024 / 1000) * - OS_HZ) / - 1000); - timeDiff = (pAd->Mlme.Now32 - - pApCliEntry->ApCliRcvBeaconTime) / - BPtoJiffies; - - if (timeDiff > 0) - pApCliEntry->ApCliRcvBeaconTime += - (timeDiff * BPtoJiffies); - - if (RTMP_TIME_AFTER( - pApCliEntry->ApCliRcvBeaconTime, - pAd->Mlme.Now32)) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("MMCHK - APCli BeaconRxTime adjust wrong(BeaconRx=0x%lx, Now=0x%lx)\n", - pApCliEntry->ApCliRcvBeaconTime, - pAd->Mlme.Now32)); - } - } - - /* update channel quality for Roaming and UI LinkQuality display */ - MlmeCalculateChannelQuality( - pAd, - &pAd->MacTab.Content[pApCliEntry->MacTabWCID], - Now32); - } - } -} - -/* -* Synchronized function -*/ - -static VOID ApCliCompleteInit(APCLI_STRUCT *pApCliEntry) -{ - RTMP_OS_INIT_COMPLETION(&pApCliEntry->ifdown_complete); - RTMP_OS_INIT_COMPLETION(&pApCliEntry->linkdown_complete); -#ifdef APCLI_CFG80211_SUPPORT - RTMP_OS_INIT_COMPLETION(&pApCliEntry->scan_complete); -#endif /* APCLI_CFG80211_SUPPORT */ -} - -static VOID ApCliLinkDownComplete(APCLI_STRUCT *pApCliEntry) -{ - RTMP_OS_COMPLETE(&pApCliEntry->linkdown_complete); -} - -static VOID ApCliWaitLinkDown(APCLI_STRUCT *pApCliEntry) -{ - if (pApCliEntry->Valid && - !RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT( - &pApCliEntry->linkdown_complete, APCLI_WAIT_TIMEOUT)) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("(%s) ApCli [%d] can't done.\n", __func__, - pApCliEntry->wdev.func_idx)); - } -} - -static VOID ApCliWaitStateDisconnect(APCLI_STRUCT *pApCliEntry) -{ - /* - * Before doing wdev_do_close,we have to make sure the ctrl - * state machine has switched to APCLI_CTRL_DISCONNECTED - */ - int wait_cnt = 0; - int wait_times = 50; - int delay_time = 100; - - while (pApCliEntry->CtrlCurrState != APCLI_CTRL_DISCONNECTED) { - if (wait_cnt >= wait_times) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("Need to debug apcli ctrl state machine(Ctrl State=%lu)\n\r", - pApCliEntry->CtrlCurrState)); - break; - } - - OS_WAIT(delay_time); - wait_cnt++; - } -} - -static VOID ApCliIfDownComplete(APCLI_STRUCT *pApCliEntry) -{ - RTMP_OS_COMPLETE(&pApCliEntry->ifdown_complete); -} - -static VOID ApCliWaitIfDown(APCLI_STRUCT *pApCliEntry) -{ - if (pApCliEntry->Valid && - !RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&pApCliEntry->ifdown_complete, - APCLI_WAIT_TIMEOUT)) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("%s: wait ApCli [%d] interface down faild!!\n", - __func__, pApCliEntry->wdev.func_idx)); - } -} - -/* -======================================================================== -Routine Description: - Close ApCli network interface. - -Arguments: - ad_p points to our adapter - -Return Value: - None - -Note: -======================================================================== -*/ -VOID RT28xx_ApCli_Close(RTMP_ADAPTER *ad_p) -{ - UINT index; - - for (index = 0; index < MAX_APCLI_NUM; index++) { - if (ad_p->ApCfg.ApCliTab[index].wdev.if_dev) - RtmpOSNetDevClose( - ad_p->ApCfg.ApCliTab[index].wdev.if_dev); - } -} - -/* --------------------------------- Private -------------------------------- */ -INT ApCliIfLookUp(RTMP_ADAPTER *pAd, UCHAR *pAddr) -{ - SHORT if_idx; - - for (if_idx = 0; if_idx < MAX_APCLI_NUM; if_idx++) { - if (MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[if_idx].wdev.if_addr, - pAddr)) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s():ApCliIfIndex=%d\n", __func__, if_idx)); - return if_idx; - } - } - - return -1; -} - -BOOLEAN isValidApCliIf(SHORT if_idx) -{ - return (((if_idx >= 0) && (if_idx < MAX_APCLI_NUM)) ? TRUE : FALSE); -} - -/*! \brief init the management mac frame header - * \param p_hdr mac header - * \param subtype subtype of the frame - * \param p_ds destination address, don't care if it is a broadcast address - * \return none - * \pre the station has the following information in the pAd->UserCfg - * - bssid - * - station address - * \post - * \note this function initializes the following field - */ -VOID ApCliMgtMacHeaderInit(IN RTMP_ADAPTER *pAd, INOUT HEADER_802_11 *pHdr80211, - IN UCHAR SubType, IN UCHAR ToDs, IN UCHAR *pDA, - IN UCHAR *pBssid, IN USHORT ifIndex) -{ - NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11)); - pHdr80211->FC.Type = FC_TYPE_MGMT; - pHdr80211->FC.SubType = SubType; - pHdr80211->FC.ToDs = ToDs; - COPY_MAC_ADDR(pHdr80211->Addr1, pDA); - COPY_MAC_ADDR(pHdr80211->Addr2, - pAd->ApCfg.ApCliTab[ifIndex].wdev.if_addr); - COPY_MAC_ADDR(pHdr80211->Addr3, pBssid); -} - -#ifdef DOT11_N_SUPPORT -/* - ======================================================================== - - Routine Description: - Verify the support rate for HT phy type - - Arguments: - pAd Pointer to our adapter - - Return Value: - FALSE if pAd->CommonCfg.SupportedHtPhy doesn't accept the pHtCapability. (AP Mode) - - IRQL = PASSIVE_LEVEL - - ======================================================================== -*/ -BOOLEAN ApCliCheckHt(IN RTMP_ADAPTER *pAd, IN USHORT IfIndex, - INOUT HT_CAPABILITY_IE *pHtCapability, - INOUT ADD_HT_INFO_IE *pAddHtInfo) -{ - APCLI_STRUCT *pApCliEntry = NULL; - HT_CAPABILITY_IE *aux_ht_cap; - HT_CAPABILITY_IE *curr_ht_cap; - struct wifi_dev *wdev; - UCHAR cfg_ht_bw; - UCHAR op_ext_cha; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (IfIndex >= MAX_APCLI_NUM) - return FALSE; - - pApCliEntry = &pAd->ApCfg.ApCliTab[IfIndex]; - wdev = &pApCliEntry->wdev; - cfg_ht_bw = wlan_config_get_ht_bw(wdev); - op_ext_cha = wlan_operate_get_ext_cha(wdev); - curr_ht_cap = (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - aux_ht_cap = &pApCliEntry->MlmeAux.HtCapability; - aux_ht_cap->MCSSet[0] = 0xff; - - /* For 20MHz bandwidth, setting MCS 32 bit is not required */ - if (cfg_ht_bw != HT_BW_20) - aux_ht_cap->MCSSet[4] = 0x1; - - switch (wlan_operate_get_rx_stream(wdev)) { - case 1: - aux_ht_cap->MCSSet[0] = 0xff; - aux_ht_cap->MCSSet[1] = 0x00; - aux_ht_cap->MCSSet[2] = 0x00; - aux_ht_cap->MCSSet[3] = 0x00; - break; - - case 2: - aux_ht_cap->MCSSet[0] = 0xff; - aux_ht_cap->MCSSet[1] = 0xff; - aux_ht_cap->MCSSet[2] = 0x00; - aux_ht_cap->MCSSet[3] = 0x00; - break; - - case 3: - aux_ht_cap->MCSSet[0] = 0xff; - aux_ht_cap->MCSSet[1] = 0xff; - aux_ht_cap->MCSSet[2] = 0xff; - aux_ht_cap->MCSSet[3] = 0x00; - break; - - case 4: - aux_ht_cap->MCSSet[0] = 0xff; - aux_ht_cap->MCSSet[1] = 0xff; - aux_ht_cap->MCSSet[2] = 0xff; - aux_ht_cap->MCSSet[3] = 0xff; - break; - } - - aux_ht_cap->MCSSet[0] &= pHtCapability->MCSSet[0]; - aux_ht_cap->MCSSet[1] &= pHtCapability->MCSSet[1]; - aux_ht_cap->MCSSet[2] &= pHtCapability->MCSSet[2]; - aux_ht_cap->MCSSet[3] &= pHtCapability->MCSSet[3]; - /* Record the RxMcs of AP */ - NdisMoveMemory(pApCliEntry->RxMcsSet, pHtCapability->MCSSet, 16); - /* choose smaller setting */ -#ifdef CONFIG_MULTI_CHANNEL - aux_ht_cap->HtCapInfo.ChannelWidth = pAddHtInfo->AddHtInfo.RecomWidth; -#else /* CONFIG_MULTI_CHANNEL */ - aux_ht_cap->HtCapInfo.ChannelWidth = - pAddHtInfo->AddHtInfo.RecomWidth & cfg_ht_bw; -#endif /* !CONFIG_MULTI_CHANNEL */ - - /* it should go back to bw 20 if extension channel is different with root ap */ - if (op_ext_cha != pAddHtInfo->AddHtInfo.ExtChanOffset) { - if (pApCliEntry->wdev.channel > 14) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("ApCliCheckHt : channel=%u, my extcha=%u, root ap extcha=%u, inconsistent!!\n", - pApCliEntry->wdev.channel, op_ext_cha, - pAddHtInfo->AddHtInfo.ExtChanOffset)); - } - - aux_ht_cap->HtCapInfo.ChannelWidth = BW_20; - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - } else - wlan_operate_set_ht_bw(wdev, pAddHtInfo->AddHtInfo.RecomWidth, - pAddHtInfo->AddHtInfo.ExtChanOffset); - - /* If selcected BW of APCLI is changed to 20MHZ, reset MCS 32 bit */ - if (aux_ht_cap->HtCapInfo.ChannelWidth == BW_20) { - aux_ht_cap->MCSSet[4] = 0x0; - } - - aux_ht_cap->HtCapInfo.GF = - pHtCapability->HtCapInfo.GF & curr_ht_cap->HtCapInfo.GF; -#ifdef CONFIG_MULTI_CHANNEL /* APCLI's bw , Central , channel */ - - if (RTMP_CFG80211_VIF_P2P_CLI_ON(pAd)) { - UCHAR ht_bw = aux_ht_cap->HtCapInfo.ChannelWidth; - UCHAR ext_cha; - UCHAR cen_ch; - - if (ht_bw == HT_BW_20) { - pApCliEntry->wdev.channel = pAddHtInfo->ControlChan; - ext_cha = EXTCHA_NONE; - } else if (ht_bw == HT_BW_40) { - pApCliEntry->wdev.channel = pAddHtInfo->ControlChan; - - if (pAddHtInfo->AddHtInfo.ExtChanOffset == EXTCHA_ABOVE) - ext_cha = EXTCHA_ABOVE; - else if (pAddHtInfo->AddHtInfo.ExtChanOffset == - EXTCHA_BELOW) - ext_cha = EXTCHA_BELOW; - else /* EXTCHA_NONE , should not be here!*/ - ext_cha = EXTCHA_NONE; - } - wlan_operate_set_ht_bw(wdev, ht_bw, ext_cha); - cen_ch = wlan_operate_get_cen_ch_1(wdev); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("ApCliCheckHt : channel=%u, CentralChannel=%u, bw=%u\n", - wdev->channel, cen_ch, ht_bw)); - } - -#endif /* CONFIG_MULTI_CHANNEL */ - /* Send Assoc Req with my HT capability. */ - aux_ht_cap->HtCapInfo.AMsduSize = curr_ht_cap->HtCapInfo.AMsduSize; - aux_ht_cap->HtCapInfo.MimoPs = pHtCapability->HtCapInfo.MimoPs; - aux_ht_cap->HtCapInfo.ShortGIfor20 = - (curr_ht_cap->HtCapInfo.ShortGIfor20) & - (pHtCapability->HtCapInfo.ShortGIfor20); - aux_ht_cap->HtCapInfo.ShortGIfor40 = - (curr_ht_cap->HtCapInfo.ShortGIfor40) & - (pHtCapability->HtCapInfo.ShortGIfor40); - aux_ht_cap->HtCapInfo.TxSTBC = (curr_ht_cap->HtCapInfo.TxSTBC) & - (pHtCapability->HtCapInfo.RxSTBC); - aux_ht_cap->HtCapInfo.RxSTBC = (curr_ht_cap->HtCapInfo.RxSTBC) & - (pHtCapability->HtCapInfo.TxSTBC); - - /* Fix throughput issue for some vendor AP with AES mode */ - if (pAddHtInfo->AddHtInfo.RecomWidth & cfg_ht_bw) - aux_ht_cap->HtCapInfo.CCKmodein40 = - pHtCapability->HtCapInfo.CCKmodein40; - else - aux_ht_cap->HtCapInfo.CCKmodein40 = 0; - - aux_ht_cap->HtCapParm.MaxRAmpduFactor = - curr_ht_cap->HtCapParm.MaxRAmpduFactor; - aux_ht_cap->HtCapParm.MpduDensity = - pHtCapability->HtCapParm.MpduDensity; - aux_ht_cap->ExtHtCapInfo.PlusHTC = pHtCapability->ExtHtCapInfo.PlusHTC; - - if (pAd->CommonCfg.bRdg) - aux_ht_cap->ExtHtCapInfo.RDGSupport = - pHtCapability->ExtHtCapInfo.RDGSupport; - - if (wlan_config_get_ht_ldpc(wdev) && (cap->phy_caps & fPHY_CAP_LDPC)) - aux_ht_cap->HtCapInfo.ht_rx_ldpc = - pHtCapability->HtCapInfo.ht_rx_ldpc; - else - aux_ht_cap->HtCapInfo.ht_rx_ldpc = 0; - - aux_ht_cap->TxBFCap = pHtCapability->TxBFCap; - - /*COPY_AP_HTSETTINGS_FROM_BEACON(pAd, pHtCapability); */ - return TRUE; -} -#endif /* DOT11_N_SUPPORT */ - -#ifdef APCLI_CERT_SUPPORT -void ApCliCertEDCAAdjust(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PEDCA_PARM pEdcaParm) -{ - UCHAR Cwmin[WMM_NUM_OF_AC] = { 3, 3, 3, 3 }; - UCHAR Cwmax[WMM_NUM_OF_AC] = { 4, 4, 4, 4 }; - - if (pAd->bApCliCertTest && (wdev->wdev_type == WDEV_TYPE_APCLI)) { - PAPCLI_STRUCT pApCliEntry = NULL; - /* SSID for TGn TC 5.2.7 */ - UCHAR Ssid1[] = "GLKDAJ98~@"; - /* SSID for TGn TC 5.2.13 */ - UCHAR Ssid2[] = "WPA2"; - UCHAR Ssid1Equal = 0; - UCHAR Ssid2Equal = 0; - - pApCliEntry = (PAPCLI_STRUCT)wdev->func_dev; - if (pApCliEntry) { - Ssid1Equal = SSID_EQUAL(pApCliEntry->CfgSsid, - pApCliEntry->CfgSsidLen, Ssid1, - strlen(Ssid1)); - Ssid2Equal = SSID_EQUAL(pApCliEntry->CfgSsid, - pApCliEntry->CfgSsidLen, Ssid2, - strlen(Ssid2)); - } - /* To tame down the BE aggresiveness increasing the Cwmin */ - if (Ssid1Equal || Ssid2Equal) { - if (pEdcaParm->Cwmin[0] == 4) - pEdcaParm->Cwmin[0]++; - return; - } - - /* fix 5.2.29 step 7 fail */ - if ((pEdcaParm->Cwmin[2] == 3) && (pEdcaParm->Cwmax[2] == 4)) { - pEdcaParm->Cwmin[2]++; - pEdcaParm->Cwmax[2]++; - if (pEdcaParm->Txop[2] == 94) - pEdcaParm->Txop[2] = pEdcaParm->Txop[2] - 9; - } - } - - if ((memcmp(pEdcaParm->Cwmin, Cwmin, 4) == 0) && - (memcmp(pEdcaParm->Cwmax, Cwmax, 4) == 0)) { - /* ignore 5.2.32*/ - return; - } -} -#endif - -#ifdef CONVERTER_MODE_SWITCH_SUPPORT -void V10ConverterModeStartStop(RTMP_ADAPTER *pAd, BOOLEAN BeaconStart) -{ - UCHAR idx = 0; -#ifdef MULTI_INF_SUPPORT - UCHAR adIdx = 0; -#endif /* MULTI_INF_SUPPORT */ - RTMP_ADAPTER *pAdapter = pAd; - -#ifdef MULTI_INF_SUPPORT - for (adIdx = 0; adIdx < MAX_NUM_OF_INF; adIdx++) -#endif /* MULTI_INF_SUPPORT */ - { -#ifdef MULTI_INF_SUPPORT - pAdapter = (RTMP_ADAPTER *)adapt_list[adIdx]; -#endif /* MULTI_INF_SUPPORT */ - if (pAdapter) { - if (BeaconStart) { -#ifdef MULTI_INF_SUPPORT - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("%s() : Resume Beaconing, Interface = %u\n", - __func__, - multi_inf_get_idx(pAdapter))); -#else - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("%s() : Resume Beaconing\n", - __func__)); -#endif /* MULTI_INF_SUPPORT */ - for (idx = 0; idx < pAdapter->ApCfg.BssidNum; - idx++) { - BSS_STRUCT *pMbss = - &pAdapter->ApCfg.MBSSID[idx]; - pMbss->APStartPseduState = - AP_STATE_ALWAYS_START_AP_DEFAULT; - if (WDEV_WITH_BCN_ABILITY( - &pMbss->wdev)) { - pMbss->wdev.bAllowBeaconing = - TRUE; - if (wdev_do_linkup(&pMbss->wdev, - NULL) != - TRUE) - MTWF_LOG( - DBG_CAT_ALL, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: link up fail!!\n", - __func__)); - } - } - } else { -#ifdef MULTI_INF_SUPPORT - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("%s() : Pause Beaconing, Interface = %u\n", - __func__, - multi_inf_get_idx(pAdapter))); -#else - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("%s() : Pause Beaconing\n", - __func__)); -#endif /* MULTI_INF_SUPPORT */ - for (idx = 0; idx < pAdapter->ApCfg.BssidNum; - idx++) { - BSS_STRUCT *pMbss = - &pAdapter->ApCfg.MBSSID[idx]; - if (WDEV_WITH_BCN_ABILITY( - &pMbss->wdev)) { - pMbss->wdev.bAllowBeaconing = - FALSE; - if (wdev_do_linkdown( - &pMbss->wdev) != - TRUE) - MTWF_LOG( - DBG_CAT_ALL, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: link down fail!!\n", - __func__)); - } - pMbss->APStartPseduState = - AP_STATE_START_AFTER_APCLI_CONNECTION; - } - } - } - } -} -#endif /*CONVERTER_MODE_SWITCH_SUPPORT*/ - -/* - ========================================================================== - - Routine Description: - Connected to the BSSID - - Arguments: - pAd - Pointer to our adapter - ApCliIdx - Which ApCli interface - Return Value: - FALSE: fail to alloc Mac entry. - - Note: - - ========================================================================== -*/ -BOOLEAN ApCliLinkUp(RTMP_ADAPTER *pAd, UCHAR ifIndex) -{ - BOOLEAN result = FALSE; - PAPCLI_STRUCT pApCliEntry = NULL; - PMAC_TABLE_ENTRY pMacEntry = NULL; - STA_TR_ENTRY *tr_entry; - struct wifi_dev *wdev; -#if defined(MAC_REPEATER_SUPPORT) || defined(MT_MAC) - UCHAR CliIdx = 0xFF; -#ifdef MAC_REPEATER_SUPPORT - INVAILD_TRIGGER_MAC_ENTRY *pSkipEntry = NULL; - struct _REPEATER_CLIENT_ENTRY *pReptEntry = NULL; -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* defined(MAC_REPEATER_SUPPORT) || defined(MT_MAC) */ -#ifdef APCLI_AUTO_CONNECT_SUPPORT - USHORT apcli_ifIndex; -#endif - UCHAR ext_cha; - - do { - if ((ifIndex < MAX_APCLI_NUM) -#ifdef MAC_REPEATER_SUPPORT - || (ifIndex >= REPT_MLME_START_IDX) -#endif /* MAC_REPEATER_SUPPORT */ - ) { -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn) { - if (ifIndex < MAX_APCLI_NUM) { -#ifdef LINUX - struct net_device *pNetDev; - struct net *net = &init_net; - /* old kernerl older than 2.6.21 didn't have for_each_netdev()*/ -#ifndef for_each_netdev - - for (pNetDev = dev_base; - pNetDev != NULL; - pNetDev = pNetDev->next) -#else - for_each_netdev (net, pNetDev) -#endif - { - if (pNetDev->priv_flags & - IFF_EBRIDGE) { - COPY_MAC_ADDR( - pAd->ApCfg - .BridgeAddress, - pNetDev->dev_addr); - MTWF_LOG( - DBG_CAT_CLIENT, - CATCLIENT_APCLI, - DBG_LVL_ERROR, - (" Bridge Addr = %02X:%02X:%02X:%02X:%02X:%02X. !!!\n", - PRINT_MAC( - pAd->ApCfg - .BridgeAddress))); - } - - pSkipEntry = - RepeaterInvaildMacLookup( - pAd, - pNetDev->dev_addr); - - if (pSkipEntry == NULL) - InsertIgnoreAsRepeaterEntryTable( - pAd, - pNetDev->dev_addr); - } - - if (!MAC_ADDR_EQUAL( - pAd->ApCfg.BridgeAddress, - ZERO_MAC_ADDR)) { - pSkipEntry = RepeaterInvaildMacLookup( - pAd, - pAd->ApCfg - .BridgeAddress); - - if (pSkipEntry) { - UCHAR MacAddr - [MAC_ADDR_LEN]; - UCHAR entry_idx; - - COPY_MAC_ADDR( - MacAddr, - pSkipEntry - ->MacAddr); - entry_idx = - pSkipEntry - ->entry_idx; - RepeaterRemoveIngoreEntry( - pAd, entry_idx, - MacAddr); - } - } - -#endif - } - - if (ifIndex >= REPT_MLME_START_IDX) { - CliIdx = ifIndex - REPT_MLME_START_IDX; - pReptEntry = - &pAd->ApCfg.pRepeaterCliPool - [CliIdx]; - ifIndex = pReptEntry->wdev->func_idx; - pMacEntry = MacTableLookup( - pAd, - pReptEntry->OriginalAddress); - - if (pMacEntry && - IS_ENTRY_CLIENT(pMacEntry)) - pReptEntry->bEthCli = FALSE; - else - pReptEntry->bEthCli = TRUE; - - pMacEntry = NULL; - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - } else { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("!!! ERROR : APCLI LINK UP - IF(apcli%d)!!!\n", - ifIndex)); - result = FALSE; - break; - } - -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx != 0xFF) - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("(%s) ifIndex = %d, CliIdx = %d !!!\n", - __func__, ifIndex, CliIdx)); - else -#endif /* MAC_REPEATER_SUPPORT */ - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("(%s) ifIndex = %d!!!\n", __func__, ifIndex)); -#ifdef APCLI_AUTO_CONNECT_SUPPORT - apcli_ifIndex = (USHORT)(ifIndex); -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - - if ((pApCliEntry->Valid) -#ifdef MAC_REPEATER_SUPPORT - && (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - ) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("!!! ERROR : This link had existed - IF(apcli%d)!!!\n", - ifIndex)); - result = FALSE; - break; - } - - wdev = &pApCliEntry->wdev; -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - if (pApCliEntry->ApCliMode == - APCLI_MODE_START_AP_AFTER_APCLI_CONNECTION) { -#ifdef WAPP_SUPPORT - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s() :APCLI Linkup Event send to wapp\n", - __func__)); - wapp_send_apcli_association_change_vendor10( - WAPP_APCLI_ASSOCIATED, pAd, pApCliEntry); -#else - V10ConverterModeStartStop(pAd, TRUE); -#endif - } -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - { - if (wf_drv_tbl.wf_fwd_get_rep_hook) - wf_drv_tbl.wf_fwd_get_rep_hook( - pAd->CommonCfg.EtherTrafficBand); - - if (wf_drv_tbl.wf_fwd_check_device_hook) - wf_drv_tbl.wf_fwd_check_device_hook( - wdev->if_dev, INT_APCLI, CliIdx, - wdev->channel, 1); - - if (wf_drv_tbl.wf_fwd_entry_insert_hook) - wf_drv_tbl.wf_fwd_entry_insert_hook( - wdev->if_dev, pAd->net_dev, pAd); - - if (wf_drv_tbl.wf_fwd_insert_repeater_mapping_hook) -#ifdef MAC_REPEATER_SUPPORT - wf_drv_tbl.wf_fwd_insert_repeater_mapping_hook( - pAd, &pAd->ApCfg.ReptCliEntryLock, - &pAd->ApCfg.ReptCliHash[0], - &pAd->ApCfg.ReptMapHash[0], - &pAd->ApCfg.ApCliTab[ifIndex] - .wdev.if_addr); -#else - wf_drv_tbl.wf_fwd_insert_repeater_mapping_hook( - pAd, NULL, NULL, NULL, - &pAd->ApCfg.ApCliTab[ifIndex] - .wdev.if_addr); -#endif /* MAC_REPEATER_SUPPORT */ - } - -#endif /* CONFIG_WIFI_PKT_FWD */ - /* Insert the Remote AP to our MacTable. */ - /*pMacEntry = MacTableInsertApCliEntry(pAd, (PUCHAR)(pAd->ApCfg.ApCliTab[0].MlmeAux.Bssid)); */ -#ifdef FAST_EAPOL_WAR -#ifdef MAC_REPEATER_SUPPORT - - if ((pAd->ApCfg.bMACRepeaterEn) && (IS_HIF_TYPE(pAd, HIF_MT)) && - (CliIdx != 0xFF)) { - pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - - if (pReptEntry->pre_entry_alloc == TRUE) - pMacEntry = - &pAd->MacTab - .Content[pReptEntry->MacTabWCID]; - } else -#endif /* MAC_REPEATER_SUPPORT */ - { - if (pApCliEntry->pre_entry_alloc == TRUE) - pMacEntry = &pAd->MacTab.Content - [pApCliEntry->MacTabWCID]; - } - -#else /* FAST_EAPOL_WAR */ -#ifdef MAC_REPEATER_SUPPORT - - if ((pAd->ApCfg.bMACRepeaterEn) && (IS_HIF_TYPE(pAd, HIF_MT)) && - (CliIdx != 0xFF)) { - pMacEntry = MacTableInsertEntry( - pAd, (PUCHAR)(pApCliEntry->MlmeAux.Bssid), wdev, - ENTRY_REPEATER, OPMODE_AP, TRUE); - } else -#endif /* MAC_REPEATER_SUPPORT */ - pMacEntry = MacTableInsertEntry( - pAd, (PUCHAR)(pApCliEntry->MlmeAux.Bssid), wdev, - ENTRY_APCLI, OPMODE_AP, TRUE); - -#endif /* !FAST_EAPOL_WAR */ -#if (!(defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT))) - /*Shifted to before Auth as now mac table entry is * -created before Auth wi Fast Eapol WAR */ - - if (pMacEntry) { - struct _SECURITY_CONFIG *pProfile_SecConfig = - &wdev->SecConfig; - struct _SECURITY_CONFIG *pEntry_SecConfig = - &pMacEntry->SecConfig; -#ifdef DOT11W_PMF_SUPPORT - /*fill the pMacEntry's PMF parameters*/ - { - RSN_CAPABILITIES RsnCap; - - NdisMoveMemory(&RsnCap, - &pApCliEntry->MlmeAux.RsnCap, - sizeof(RSN_CAPABILITIES)); - RsnCap.word = cpu2le16(RsnCap.word); - - /*mismatch case*/ - if (((pProfile_SecConfig->PmfCfg.MFPR) && - (RsnCap.field.MFPC == FALSE)) || - ((pProfile_SecConfig->PmfCfg.MFPC == - FALSE) && - (RsnCap.field.MFPR))) { - pEntry_SecConfig->PmfCfg.UsePMFConnect = - FALSE; - pEntry_SecConfig->key_deri_alg = - SEC_KEY_DERI_SHA1; - } - - if ((pProfile_SecConfig->PmfCfg.MFPC) && - (RsnCap.field.MFPC)) { - pEntry_SecConfig->PmfCfg.UsePMFConnect = - TRUE; - - if ((pApCliEntry->MlmeAux - .IsSupportSHA256KeyDerivation) || - (RsnCap.field.MFPR)) - pEntry_SecConfig->key_deri_alg = - SEC_KEY_DERI_SHA256; - - pEntry_SecConfig->PmfCfg.MFPC = - RsnCap.field.MFPC; - pEntry_SecConfig->PmfCfg.MFPR = - RsnCap.field.MFPR; - } - - pEntry_SecConfig->PmfCfg.igtk_cipher = - pApCliEntry->MlmeAux - .IntegrityGroupCipher; - } -#endif /* DOT11W_PMF_SUPPORT */ - - if (IS_CIPHER_WEP(pEntry_SecConfig->PairwiseCipher)) { - os_move_mem(pEntry_SecConfig->WepKey, - pProfile_SecConfig->WepKey, - sizeof(SEC_KEY_INFO) * SEC_KEY_NUM); - pProfile_SecConfig->GroupKeyId = - pProfile_SecConfig->PairwiseKeyId; - pEntry_SecConfig->PairwiseKeyId = - pProfile_SecConfig->PairwiseKeyId; - } else { - CHAR rsne_idx = 0; - { - NdisCopyMemory(pEntry_SecConfig->PMK, - pProfile_SecConfig->PMK, - LEN_PMK); - } - -#ifdef MAC_REPEATER_SUPPORT - - if ((pAd->ApCfg.bMACRepeaterEn) && - (IS_HIF_TYPE(pAd, HIF_MT)) && - (CliIdx != 0xFF)) { - os_move_mem(pEntry_SecConfig->Handshake - .AAddr, - pMacEntry->Addr, - MAC_ADDR_LEN); - os_move_mem(pEntry_SecConfig->Handshake - .SAddr, - pReptEntry->CurrentAddress, - MAC_ADDR_LEN); - } else -#endif /* MAC_REPEATER_SUPPORT */ - { - os_move_mem(pEntry_SecConfig->Handshake - .AAddr, - pMacEntry->Addr, - MAC_ADDR_LEN); - os_move_mem(pEntry_SecConfig->Handshake - .SAddr, - wdev->if_addr, - MAC_ADDR_LEN); - } - - os_zero_mem(pEntry_SecConfig->Handshake - .ReplayCounter, - LEN_KEY_DESC_REPLAY); - - for (rsne_idx = 0; rsne_idx < SEC_RSNIE_NUM; - rsne_idx++) { - pEntry_SecConfig->RSNE_Type[rsne_idx] = - pProfile_SecConfig - ->RSNE_Type[rsne_idx]; - - if (pEntry_SecConfig - ->RSNE_Type[rsne_idx] == - SEC_RSNIE_NONE) - continue; - - os_move_mem( - pEntry_SecConfig - ->RSNE_EID[rsne_idx], - pProfile_SecConfig - ->RSNE_EID[rsne_idx], - sizeof(UCHAR)); - pEntry_SecConfig->RSNE_Len[rsne_idx] = - pProfile_SecConfig - ->RSNE_Len[rsne_idx]; - os_move_mem( - pEntry_SecConfig - ->RSNE_Content[rsne_idx], - pProfile_SecConfig - ->RSNE_Content[rsne_idx], - sizeof(UCHAR) * - MAX_LEN_OF_RSNIE); - } - - pMacEntry->SecConfig.Handshake.WpaState = - AS_INITPSK; - } - - pEntry_SecConfig->GroupKeyId = - pProfile_SecConfig->GroupKeyId; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: (apcli%d) connect AKM(0x%x)=%s, PairwiseCipher(0x%x)=%s, GroupCipher(0x%x)=%s\n", - __func__, ifIndex, pEntry_SecConfig->AKMMap, - GetAuthModeStr(pEntry_SecConfig->AKMMap), - pEntry_SecConfig->PairwiseCipher, - GetEncryModeStr( - pEntry_SecConfig->PairwiseCipher), - pEntry_SecConfig->GroupCipher, - GetEncryModeStr( - pEntry_SecConfig->GroupCipher))); - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): PairwiseKeyId=%d, GroupKeyId=%d\n", - __func__, pEntry_SecConfig->PairwiseKeyId, - pEntry_SecConfig->GroupKeyId)); - } -#endif /*(!(defined(APCLI_SAE_SUPPORT)|| defined(APCLI_OWE_SUPPORT)))*/ - if (pMacEntry) { - UCHAR Rates[MAX_LEN_OF_SUPPORTED_RATES]; - PUCHAR pRates = Rates; - UCHAR RatesLen; - UCHAR MaxSupportedRate = 0; - - tr_entry = &pAd->MacTab.tr_entry[pMacEntry->wcid]; - pMacEntry->Sst = SST_ASSOC; -#ifdef HTC_DECRYPT_IOT - - if ((pMacEntry->HTC_ICVErrCnt) || - (pMacEntry->HTC_AAD_OM_Force) || - (pMacEntry->HTC_AAD_OM_CountDown) || - (pMacEntry->HTC_AAD_OM_Freeze)) { - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("@@@ %s(): (wcid=%u), HTC_ICVErrCnt(%u), HTC_AAD_OM_Freeze(%u), HTC_AAD_OM_CountDown(%u), HTC_AAD_OM_Freeze(%u) is in Asso. stage!\n", - __func__, pMacEntry->wcid, - pMacEntry->HTC_ICVErrCnt, - pMacEntry->HTC_AAD_OM_Force, - pMacEntry->HTC_AAD_OM_CountDown, - pMacEntry->HTC_AAD_OM_Freeze)); - /* Force clean. */ - pMacEntry->HTC_ICVErrCnt = 0; - pMacEntry->HTC_AAD_OM_Force = 0; - pMacEntry->HTC_AAD_OM_CountDown = 0; - pMacEntry->HTC_AAD_OM_Freeze = 0; - } - -#endif /* HTC_DECRYPT_IOT */ - /* pMacEntry->wdev = &pApCliEntry->wdev;//duplicate assign. */ -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx != 0xFF) { - pReptEntry = - &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - pReptEntry->MacTabWCID = pMacEntry->wcid; - pReptEntry->CliValid = TRUE; - pMacEntry->bReptCli = TRUE; - pMacEntry->bReptEthBridgeCli = FALSE; - pMacEntry->MatchReptCliIdx = CliIdx; - pMacEntry->ReptCliIdleCount = 0; - COPY_MAC_ADDR(pMacEntry->ReptCliAddr, - pReptEntry->CurrentAddress); - tr_entry->OmacIdx = - HcGetRepeaterOmac(pAd, pMacEntry); - - if (pReptEntry->bEthCli == TRUE) { - pMacEntry->bReptEthCli = TRUE; - - if (MAC_ADDR_EQUAL( - pAd->ApCfg.BridgeAddress, - pAd->ApCfg - .pRepeaterCliPool - [CliIdx] - .OriginalAddress)) - pMacEntry->bReptEthBridgeCli = - TRUE; - } else - pMacEntry->bReptEthCli = FALSE; - } else -#endif /* MAC_REPEATER_SUPPORT */ - { - pApCliEntry->Valid = TRUE; - pApCliEntry->MacTabWCID = pMacEntry->wcid; -#ifdef MAC_REPEATER_SUPPORT - pMacEntry->bReptCli = FALSE; -#endif /* MAC_REPEATER_SUPPORT */ - COPY_MAC_ADDR(&wdev->bssid[0], - &pApCliEntry->MlmeAux.Bssid[0]); - os_move_mem(wdev->bss_info_argument.Bssid, - wdev->bssid, MAC_ADDR_LEN); - COPY_MAC_ADDR(APCLI_ROOT_BSSID_GET( - pAd, - pApCliEntry->MacTabWCID), - pApCliEntry->MlmeAux.Bssid); - pApCliEntry->SsidLen = - pApCliEntry->MlmeAux.SsidLen; - NdisMoveMemory(pApCliEntry->Ssid, - pApCliEntry->MlmeAux.Ssid, - pApCliEntry->SsidLen); - ComposePsPoll(pAd, &(pApCliEntry->PsPollFrame), - pApCliEntry->MlmeAux.Aid, - pApCliEntry->MlmeAux.Bssid, - pApCliEntry->wdev.if_addr); - ComposeNullFrame(pAd, &(pApCliEntry->NullFrame), - pApCliEntry->MlmeAux.Bssid, - pApCliEntry->wdev.if_addr, - pApCliEntry->MlmeAux.Bssid); - } - - if (IS_AKM_WPA_CAPABILITY_Entry(pMacEntry) -#ifdef WSC_AP_SUPPORT - && ((pApCliEntry->wdev.WscControl.WscConfMode == - WSC_DISABLE) || - (pApCliEntry->wdev.WscControl.bWscTrigger == - FALSE)) -#endif /* WSC_AP_SUPPORT */ - ) - tr_entry->PortSecured = - WPA_802_1X_PORT_NOT_SECURED; - else { - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; - -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx != 0xFF) - pReptEntry->CliConnectState = - REPT_ENTRY_CONNTED; - -#endif /* MAC_REPEATER_SUPPORT */ - } - -#ifdef APCLI_AUTO_CONNECT_SUPPORT - - if ((pAd->ApCfg.ApCliAutoConnectRunning[apcli_ifIndex] == - TRUE) && -#ifdef MAC_REPEATER_SUPPORT - (CliIdx == 0xFF) && -#endif /* MAC_REPEATER_SUPPORT */ - (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED)) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("ApCli auto connected: ApCliLinkUp()\n")); - pAd->ApCfg - .ApCliAutoConnectRunning[apcli_ifIndex] = - FALSE; - } - -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - NdisGetSystemUpTime( - &pApCliEntry->ApCliLinkUpTime); - - SupportRate(pApCliEntry->MlmeAux.SupRate, - pApCliEntry->MlmeAux.SupRateLen, - pApCliEntry->MlmeAux.ExtRate, - pApCliEntry->MlmeAux.ExtRateLen, &pRates, - &RatesLen, &MaxSupportedRate); - pMacEntry->MaxSupportedRate = - min(wdev->rate.MaxTxRate, MaxSupportedRate); - pMacEntry->RateLen = RatesLen; - MacTableSetEntryPhyCfg(pAd, pMacEntry); - pMacEntry->CapabilityInfo = - pApCliEntry->MlmeAux.CapabilityInfo; - pApCliEntry->ApCliBeaconPeriod = - pApCliEntry->MlmeAux.BeaconPeriod; -#ifdef DOT11_N_SUPPORT - - /* If this Entry supports 802.11n, upgrade to HT rate. */ - if (pApCliEntry->MlmeAux.HtCapabilityLen != 0) { - PHT_CAPABILITY_IE pHtCapability = - (PHT_CAPABILITY_IE)&pApCliEntry->MlmeAux - .HtCapability; - - ht_mode_adjust(pAd, pMacEntry, pHtCapability); - /* find max fixed rate */ - pMacEntry->MaxHTPhyMode.field - .MCS = get_ht_max_mcs( - pAd, &wdev->DesiredHtPhyInfo.MCSSet[0], - &pHtCapability->MCSSet[0]); - - if (wdev->DesiredTransmitSetting.field.MCS != - MCS_AUTO) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("IF-apcli%d : Desired MCS = %d\n", - ifIndex, - wdev->DesiredTransmitSetting - .field.MCS)); - set_ht_fixed_mcs( - pAd, pMacEntry, - wdev->DesiredTransmitSetting - .field.MCS, - wdev->HTPhyMode.field.MCS); - } - - pMacEntry->HTPhyMode.word = - pMacEntry->MaxHTPhyMode.word; - set_sta_ht_cap(pAd, pMacEntry, pHtCapability); - NdisMoveMemory( - &pMacEntry->HTCapability, - &pApCliEntry->MlmeAux.HtCapability, - sizeof(HT_CAPABILITY_IE)); - NdisMoveMemory(pMacEntry->HTCapability.MCSSet, - pApCliEntry->RxMcsSet, 16); - assoc_ht_info_debugshow( - pAd, pMacEntry, - sizeof(HT_CAPABILITY_IE), - &pApCliEntry->MlmeAux.HtCapability); -#ifdef APCLI_CERT_SUPPORT - - if (pAd->bApCliCertTest == TRUE) { - ADD_HTINFO2 *ht_info2 = - &pApCliEntry->MlmeAux.AddHtInfo - .AddHtInfo2; - - wdev->protection = 0; - - wdev->protection |= SET_PROTECT( - ht_info2->OperaionMode); - - if (ht_info2->NonGfPresent == 1) - wdev->protection |= SET_PROTECT( - GREEN_FIELD_PROTECT); - else - wdev->protection &= ~(SET_PROTECT( - GREEN_FIELD_PROTECT)); - - AsicUpdateProtect(pAd); - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("SYNC - Root AP changed N OperaionMode to %d\n", - ht_info2->OperaionMode)); - } - -#endif /* APCLI_CERT_SUPPORT */ - } else { - pAd->MacTab.fAnyStationIsLegacy = TRUE; - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("ApCliLinkUp - MaxSupRate=%d Mbps\n", - RateIdToMbps - [pMacEntry->MaxSupportedRate])); - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(wdev->PhyMode) && - pApCliEntry->MlmeAux.vht_cap_len && - pApCliEntry->MlmeAux.vht_op_len) { - vht_mode_adjust(pAd, pMacEntry, - &(pApCliEntry->MlmeAux.vht_cap), - &(pApCliEntry->MlmeAux.vht_op)); - dot11_vht_mcs_to_internal_mcs( - pAd, wdev, - &pApCliEntry->MlmeAux.vht_cap, - &pMacEntry->MaxHTPhyMode); - /* Move to set_vht_cap(), which could be reused by AP, WDS and P2P */ - /* - pMacEntry->MaxRAmpduFactor = - (pApCliEntry->MlmeAux.vht_cap.vht_cap.max_ampdu_exp > pMacEntry->MaxRAmpduFactor) ? - pApCliEntry->MlmeAux.vht_cap.vht_cap.max_ampdu_exp : pMacEntry->MaxRAmpduFactor; - pMacEntry->AMsduSize = pApCliEntry->MlmeAux.vht_cap.vht_cap.max_mpdu_len; - */ - set_vht_cap(pAd, pMacEntry, - &(pApCliEntry->MlmeAux.vht_cap)); -#ifdef APCLI_CERT_SUPPORT - /* For TGac Test case 5.2.47 AMSDU+AMPDU aggregation is to large for WFA sniffer to handle -during 3x3 throughput check,so we limit the AMSDU len to 3839* -*/ - if (pAd->bApCliCertTest == TRUE) { - UCHAR Ssid[] = "VHT-5.2.47-AP3"; - UCHAR SsidEqual = 0; - - SsidEqual = SSID_EQUAL( - pApCliEntry->CfgSsid, - pApCliEntry->CfgSsidLen, Ssid, - strlen(Ssid)); - - if (SsidEqual && - (pMacEntry->AMsduSize > 0)) { - pMacEntry->AMsduSize = 0; - pMacEntry->amsdu_limit_len = vht_max_mpdu_size - [pMacEntry->AMsduSize]; - pMacEntry - ->amsdu_limit_len_adjust = - pMacEntry - ->amsdu_limit_len; - } - } -#endif - NdisMoveMemory(&pMacEntry->vht_cap_ie, - &pApCliEntry->MlmeAux.vht_cap, - sizeof(VHT_CAP_IE)); - assoc_vht_info_debugshow( - pAd, pMacEntry, - &pApCliEntry->MlmeAux.vht_cap, - &pApCliEntry->MlmeAux.vht_op); - } - -#endif /* DOT11_VHT_AC */ - /* update per wdev bw */ - ext_cha = wlan_config_get_ext_cha(wdev); - - if (pMacEntry->MaxHTPhyMode.field.BW < BW_80) - wlan_operate_set_ht_bw( - wdev, pMacEntry->MaxHTPhyMode.field.BW, - ext_cha); - else { -#ifdef DOT11_VHT_AC - - switch (pMacEntry->MaxHTPhyMode.field.BW) { - case BW_80: - wlan_operate_set_vht_bw(wdev, - VHT_BW_80); - wlan_operate_set_ht_bw(wdev, HT_BW_40, - ext_cha); - break; - - case BW_160: - wlan_operate_set_vht_bw(wdev, - VHT_BW_160); - wlan_operate_set_ht_bw(wdev, HT_BW_40, - ext_cha); - break; - - default: - wlan_operate_set_vht_bw(wdev, - VHT_BW_2040); - wlan_operate_set_ht_bw(wdev, HT_BW_40, - ext_cha); - break; - } - -#endif - } - - pMacEntry->HTPhyMode.word = - pMacEntry->MaxHTPhyMode.word; - pMacEntry->CurrTxRate = pMacEntry->MaxSupportedRate; - RTMPSetSupportMCS(pAd, OPMODE_AP, pMacEntry, - pApCliEntry->MlmeAux.SupRate, - pApCliEntry->MlmeAux.SupRateLen, - pApCliEntry->MlmeAux.ExtRate, - pApCliEntry->MlmeAux.ExtRateLen, -#ifdef DOT11_VHT_AC - pApCliEntry->MlmeAux.vht_cap_len, - &pApCliEntry->MlmeAux.vht_cap, -#endif /* DOT11_VHT_AC */ - &pApCliEntry->MlmeAux.HtCapability, - pApCliEntry->MlmeAux.HtCapabilityLen); -#ifdef MT_MAC -#ifdef MT7615 - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pApCliEntry->MlmeAux.APEdcaParm.bValid) { - pMacEntry->bACMBit[WMM_AC_BK] = - pApCliEntry->MlmeAux.APEdcaParm - .bACM[WMM_AC_BK]; - pMacEntry->bACMBit[WMM_AC_BE] = - pApCliEntry->MlmeAux.APEdcaParm - .bACM[WMM_AC_BE]; - pMacEntry->bACMBit[WMM_AC_VI] = - pApCliEntry->MlmeAux.APEdcaParm - .bACM[WMM_AC_VI]; - pMacEntry->bACMBit[WMM_AC_VO] = - pApCliEntry->MlmeAux.APEdcaParm - .bACM[WMM_AC_VO]; - } - } - -#endif /* MT7615 */ -#endif /* MT_MAC */ - - /* - set this entry WMM capable or not - It need to before linkup, or it cannot link non_wmm AP - */ - if ((pApCliEntry->MlmeAux.APEdcaParm.bValid) -#ifdef DOT11_N_SUPPORT - || IS_HT_STA(pMacEntry) -#endif /* DOT11_N_SUPPORT */ - ) - CLIENT_STATUS_SET_FLAG( - pMacEntry, fCLIENT_STATUS_WMM_CAPABLE); - else - CLIENT_STATUS_CLEAR_FLAG( - pMacEntry, fCLIENT_STATUS_WMM_CAPABLE); - - NdisGetSystemUpTime(&pApCliEntry->ApCliRcvBeaconTime); - - /* set the apcli interface be valid. */ - /*only apcli should linkup*/ - if (CliIdx == 0xFF) { - if (wdev_do_linkup(wdev, pMacEntry) != TRUE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s(): linkup fail!!\n", - __func__)); - } - - if (wdev_do_conn_act(wdev, pMacEntry) != TRUE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s(): connect fail!!\n", __func__)); - - MacTableSetEntryRaCap(pAd, pMacEntry, - &pApCliEntry->MlmeAux.vendor_ie); -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (wdev->bAutoTxRateSwitch == TRUE) - pMacEntry->bAutoTxRateSwitch = TRUE; - else { - pMacEntry->HTPhyMode.field.MCS = - wdev->HTPhyMode.field.MCS; - pMacEntry->bAutoTxRateSwitch = FALSE; - /* If the legacy mode is set, overwrite the transmit setting of this entry. */ - RTMPUpdateLegacyTxSetting( - (UCHAR)wdev - ->DesiredTransmitSetting - .field.FixedTxMode, - pMacEntry); - } - - RAInit(pAd, pMacEntry); -#ifdef TXBF_SUPPORT - - if (HcIsBfCapSupport(wdev)) - HW_APCLI_BF_CAP_CONFIG(pAd, pMacEntry); - -#endif /* TXBF_SUPPORT */ - } - -#endif - - if (IS_CIPHER_WEP_Entry(pMacEntry)) { - INT BssIdx; - ASIC_SEC_INFO Info = { 0 }; - struct _SECURITY_CONFIG *pSecConfig = - &pMacEntry->SecConfig; - - BssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + - ifIndex; -#ifdef MAC_APCLI_SUPPORT - BssIdx = APCLI_BSS_BASE + ifIndex; -#endif /* MAC_APCLI_SUPPORT */ - - /* Set Group key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_GROUP_KEY; - Info.Direction = SEC_ASIC_KEY_RX; - Info.Wcid = - wdev->bss_info_argument.ucBcMcWlanIdx; - Info.BssIndex = BssIdx; - Info.Cipher = pSecConfig->GroupCipher; - Info.KeyIdx = pSecConfig->GroupKeyId; - os_move_mem(&Info.PeerAddr[0], pMacEntry->Addr, - MAC_ADDR_LEN); - os_move_mem(&Info.Key, - &pSecConfig->WepKey[Info.KeyIdx], - sizeof(SEC_KEY_INFO)); - - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - - /* Set Pairwise key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pMacEntry->wcid; - Info.BssIndex = BssIdx; - Info.Cipher = pSecConfig->PairwiseCipher; - Info.KeyIdx = pSecConfig->PairwiseKeyId; - os_move_mem(&Info.PeerAddr[0], pMacEntry->Addr, - MAC_ADDR_LEN); - os_move_mem(&Info.Key, - &pSecConfig->WepKey[Info.KeyIdx], - sizeof(SEC_KEY_INFO)); - - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - } - -#ifdef PIGGYBACK_SUPPORT - - if (CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_PIGGYBACK_CAPABLE)) { - AsicSetPiggyBack(pAd, TRUE); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("Turn on Piggy-Back\n")); - } - -#endif /* PIGGYBACK_SUPPORT */ - -#ifdef A4_CONN - if ((CliIdx == 0xff) && (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED)) { - } -#endif /* A4_CONN */ - -#ifdef MT_MAC -#ifdef MAC_REPEATER_SUPPORT - - if ((CliIdx != 0xff && IS_HIF_TYPE(pAd, HIF_MT))) { - AsicInsertRepeaterRootEntry( - pAd, pMacEntry->wcid, - (PUCHAR)(pApCliEntry->MlmeAux.Bssid), - CliIdx); -#ifdef TXBF_SUPPORT - - if ((pAd->fgClonedStaWithBfeeSelected) && - (pAd->ReptClonedStaEntry_CliIdx == CliIdx)) - HW_APCLI_BF_REPEATER_CONFIG( - pAd, - pMacEntry); /* Move cloned STA's MAC addr from MUAR table to ownmac */ - -#endif /* TXBF_SUPPORT */ - } - -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* MT_MAC */ - result = TRUE; - pAd->ApCfg.ApCliInfRunned++; -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -#ifdef MAC_REPEATER_SUPPORT - if (CliIdx == 0xFF) -#endif - wf_apcli_active_links++; - -#ifdef CONFIG_FAST_NAT_SUPPORT - - if ((wf_apcli_active_links >= 2) && - (ra_sw_nat_hook_rx != NULL) && - (wf_ra_sw_nat_hook_rx_bkup == NULL)) { - wf_ra_sw_nat_hook_rx_bkup = ra_sw_nat_hook_rx; - ra_sw_nat_hook_rx = NULL; - } - -#endif /*CONFIG_FAST_NAT_SUPPORT*/ -#endif - break; - } - - result = FALSE; - } while (FALSE); - - if (result == FALSE) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - (" (%s) alloc mac entry fail!!!\n", __func__)); - return result; - } - -#ifdef WSC_AP_SUPPORT - - /* WSC initial connect to AP, jump to Wsc start action and set the correct parameters */ - if ((result == TRUE) && - (pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl.WscConfMode == - WSC_ENROLLEE) && - (pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl.bWscTrigger == - TRUE)) { - pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl.WscState = - WSC_STATE_LINK_UP; - pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl.WscStatus = - WSC_STATE_LINK_UP; - pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl.WscConfStatus = - WSC_SCSTATE_UNCONFIGURED; - NdisZeroMemory(pApCliEntry->wdev.WscControl.EntryAddr, - MAC_ADDR_LEN); - NdisMoveMemory(pApCliEntry->wdev.WscControl.EntryAddr, - pApCliEntry->MlmeAux.Bssid, MAC_ADDR_LEN); - WscSendEapolStart(pAd, pMacEntry->Addr, AP_MODE, - &pAd->ApCfg.ApCliTab[ifIndex].wdev); - } else - WscStop(pAd, TRUE, - &pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl); - -#endif /* WSC_AP_SUPPORT */ -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 -#ifdef APCLI_CERT_SUPPORT - - if (pAd->bApCliCertTest == TRUE) { - if ((pAd->CommonCfg.bBssCoexEnable == TRUE) && - (wdev->channel <= 14) && - (wdev->DesiredHtPhyInfo.bHtEnable == TRUE) && - (pApCliEntry->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport == - 1)) { - OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SCAN_2040); - BuildEffectedChannelList(pAd, wdev); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("LinkUP AP supports 20/40 BSS COEX !!! Dot11BssWidthTriggerScanInt[%d]\n", - pAd->CommonCfg.Dot11BssWidthTriggerScanInt)); - } else { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("not supports 20/40 BSS COEX !!!\n")); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("pAd->CommonCfg.bBssCoexEnable %d !!!\n", - pAd->CommonCfg.bBssCoexEnable)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("Channel %d !!!\n", wdev->channel)); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("pApCliEntry->DesiredHtPhyInfo.bHtEnable %d !!!\n", - pApCliEntry->wdev.DesiredHtPhyInfo.bHtEnable)); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("pAd->MlmeAux.ExtCapInfo.BssCoexstSup %d !!!\n", - pApCliEntry->MlmeAux.ExtCapInfo - .BssCoexistMgmtSupport)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("CentralChannel: %d !!!\n", - wlan_operate_get_cen_ch_1(wdev))); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("PhyMode %d !!!\n", wdev->PhyMode)); - } - } - -#endif /* APCLI_CERT_SUPPORT */ -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - if (IS_MAP_ENABLE(pAd) && - (pMacEntry->DevPeerRole & - (BIT(MAP_ROLE_FRONTHAUL_BSS) | BIT(MAP_ROLE_BACKHAUL_BSS)))) { - pApCliEntry->PeerMAPEnable = 1; - } else { - pApCliEntry->PeerMAPEnable = 0; - } - /*For security NONE & WEP case*/ - if ((CliIdx == 0xFF) && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) { - wapp_send_apcli_association_change(WAPP_APCLI_ASSOCIATED, pAd, - pApCliEntry); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("APCLIENT MAP_ENABLE (No Security)\n")); -#ifdef A4_CONN - map_a4_peer_enable(pAd, pMacEntry, FALSE); -#endif - if (pApCliEntry->wdev.WscControl.bWscTrigger == FALSE) - map_send_bh_sta_wps_done_event(pAd, pMacEntry, FALSE); - } -#endif /*WAPP_SUPPORT*/ - -#ifdef MTFWD -#ifdef MAC_REPEATER_SUPPORT - if (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - RTMP_OS_NETDEV_CARRIER_ON(wdev->if_dev); -#endif - - return result; -} - -static CHAR LinkDownReason[APCLI_LINKDOWN_PEER_DEASSOC_RSP + 1][30] = { - "none", - "send deauth req", - "send deassociate req", - "recv deassociate req", - "got disconnect req", - "recv deassociate resp" -}; - -static CHAR SubLinkDownReason[APCLI_DISCONNECT_SUB_REASON_APCLI_TRIGGER_TOO_LONG + - 1][30] = { "none", - "rept connect too long", - "idle too long", - "remove sta", - "apcli if down", - "beacon miss", - "recv sta disassociate req", - "recv sta deauth req", - "manually del mac entry", - "repter bind to other apcli", - "apcli connect too long" }; -/* - ========================================================================== - - Routine Description: - Disconnect current BSSID - - Arguments: - pAd - Pointer to our adapter - ApCliIdx - Which ApCli interface - Return Value: - None - - Note: - - ========================================================================== -*/ -VOID ApCliLinkDown(RTMP_ADAPTER *pAd, UCHAR ifIndex) -{ - APCLI_STRUCT *pApCliEntry = NULL; - struct wifi_dev *wdev = NULL; - UCHAR CliIdx = 0xFF; -#ifdef MAC_REPEATER_SUPPORT - struct _REPEATER_CLIENT_ENTRY *pReptEntry = NULL; -#endif /* MAC_REPEATER_SUPPORT */ - UCHAR MacTabWCID = 0; - - if ((ifIndex < MAX_APCLI_NUM) -#ifdef MAC_REPEATER_SUPPORT - || (ifIndex >= REPT_MLME_START_IDX) -#endif /* MAC_REPEATER_SUPPORT */ - ) { -#ifdef MAC_REPEATER_SUPPORT - - if (ifIndex >= REPT_MLME_START_IDX) { - CliIdx = ifIndex - REPT_MLME_START_IDX; - pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - ifIndex = pReptEntry->wdev->func_idx; - - if (pReptEntry->LinkDownReason == - APCLI_LINKDOWN_PEER_DEASSOC_REQ) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("!!! REPEATER CLI LINK DOWN - IF(apcli%d) Cli %d (Reason=%s,Reason code=%lu)!!!\n", - ifIndex, CliIdx, - LinkDownReason - [pReptEntry->LinkDownReason], - pReptEntry->Disconnect_Sub_Reason)); - } else { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("!!! REPEATER CLI LINK DOWN - IF(apcli%d) Cli %d (Reason=%s,sub=%s)!!!\n", - ifIndex, CliIdx, - LinkDownReason - [pReptEntry->LinkDownReason], - SubLinkDownReason - [pReptEntry - ->Disconnect_Sub_Reason])); - } - } else -#endif /* MAC_REPEATER_SUPPORT */ - { - if (pAd->ApCfg.ApCliTab[ifIndex].LinkDownReason == - APCLI_LINKDOWN_PEER_DEASSOC_REQ) - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("!!! APCLI LINK DOWN - IF(apcli%d) (Reason=%s,Reason code=%lu)!!!\n", - ifIndex, - LinkDownReason - [pAd->ApCfg.ApCliTab[ifIndex] - .LinkDownReason], - pAd->ApCfg.ApCliTab[ifIndex] - .Disconnect_Sub_Reason)); - else - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("!!! APCLI LINK DOWN - IF(apcli%d) (Reason=%s,sub=%s)!!!\n", - ifIndex, - LinkDownReason - [pAd->ApCfg.ApCliTab[ifIndex] - .LinkDownReason], - SubLinkDownReason - [pAd->ApCfg.ApCliTab[ifIndex] - .Disconnect_Sub_Reason])); - } - } else { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("!!! ERROR : APCLI LINK DOWN - IF(apcli%d)!!!\n", - ifIndex)); - return; - } - - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - wdev = &pApCliEntry->wdev; -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - if (pApCliEntry->ApCliMode == - APCLI_MODE_START_AP_AFTER_APCLI_CONNECTION) { -#ifdef WAPP_SUPPORT - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s() :APCLI LinkDown Event send to wapp\n", - __func__)); - wapp_send_apcli_association_change_vendor10( - WAPP_APCLI_DISASSOCIATED, pAd, pApCliEntry); -#else - V10ConverterModeStartStop(pAd, FALSE); -#endif - } -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - - if ((pApCliEntry->Valid == FALSE) -#ifdef MAC_REPEATER_SUPPORT - && (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - ) - return; - -#ifdef MTFWD -#ifdef MAC_REPEATER_SUPPORT - if (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - RTMP_OS_NETDEV_CARRIER_OFF(wdev->if_dev); -#endif - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - { - if (wf_drv_tbl.wf_fwd_entry_delete_hook) - wf_drv_tbl.wf_fwd_entry_delete_hook( - pApCliEntry->wdev.if_dev, pAd->net_dev, 1); - - if (wf_drv_tbl.wf_fwd_check_device_hook) - wf_drv_tbl.wf_fwd_check_device_hook( - pApCliEntry->wdev.if_dev, INT_APCLI, CliIdx, - pApCliEntry->wdev.channel, 0); - } -#ifdef MAC_REPEATER_SUPPORT - else { - if (wf_drv_tbl.packet_source_delete_entry_hook) - wf_drv_tbl.packet_source_delete_entry_hook(100); - } - -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* CONFIG_WIFI_PKT_FWD */ -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - pAd->ApCfg.ApCliInfRunned--; - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -#ifdef MAC_REPEATER_SUPPORT - if (CliIdx == 0xFF) -#endif /* MAC_REPEATER_SUPPORT */ - wf_apcli_active_links--; - -#ifdef CONFIG_FAST_NAT_SUPPORT - if ((wf_apcli_active_links < 2) && (ra_sw_nat_hook_rx == NULL) && - (wf_ra_sw_nat_hook_rx_bkup != NULL)) { - ra_sw_nat_hook_rx = wf_ra_sw_nat_hook_rx_bkup; - wf_ra_sw_nat_hook_rx_bkup = NULL; - } - -#endif /*CONFIG_FAST_NAT_SUPPORT*/ -#endif - -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx != 0xFF) { - MacTabWCID = pReptEntry->MacTabWCID; - MacTableDeleteEntry(pAd, MacTabWCID, - pAd->MacTab.Content[MacTabWCID].Addr); -#ifdef FAST_EAPOL_WAR - pReptEntry->pre_entry_alloc = FALSE; -#endif /* FAST_EAPOL_WAR */ - } else -#endif /* MAC_REPEATER_SUPPORT */ - { - MacTabWCID = pApCliEntry->MacTabWCID; - MacTableDeleteEntry(pAd, MacTabWCID, - APCLI_ROOT_BSSID_GET(pAd, MacTabWCID)); -#ifdef FAST_EAPOL_WAR - pApCliEntry->pre_entry_alloc = FALSE; -#endif /* FAST_EAPOL_WAR */ - } - -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx != 0xFF) - HW_REMOVE_REPT_ENTRY(pAd, ifIndex, CliIdx); - else -#endif /* MAC_REPEATER_SUPPORT */ - { - pApCliEntry->Valid = - FALSE; /* This link doesn't associated with any remote-AP */ - MSDU_FORBID_SET(&pApCliEntry->wdev, - MSDU_FORBID_CONNECTION_NOT_READY); - pApCliEntry->wdev.PortSecured = WPA_802_1X_PORT_NOT_SECURED; -#ifdef DOT11W_PMF_SUPPORT - BssTableDeleteEntry(&pAd->ScanTab, pApCliEntry->MlmeAux.Bssid, - wdev->channel); -#else -#endif /* DOT11W_PMF_SUPPORT */ - } - -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - map_a4_peer_disable(pAd, &pAd->MacTab.Content[MacTabWCID], FALSE); -#endif - - pAd->ApCfg.ApCliTab[ifIndex].bPeerExist = FALSE; - - /*TODO & FIXME: Carter, REPEATER CASE */ - if (CliIdx == 0xFF) { - if (wdev_do_linkdown(wdev) != TRUE) - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("(%s) linkdown fail!\n", __func__)); - } - -#ifdef TXBF_SUPPORT - - if ((pAd->fgClonedStaWithBfeeSelected) && - (pAd->ReptClonedStaEntry_CliIdx == CliIdx)) { - pAd->fgClonedStaWithBfeeSelected = FALSE; - /* Remove cloned STA's MAC addr from ownmac */ - } - -#endif /* TXBF_SUPPORT */ -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) - RT_CFG80211_LOST_GO_INFORM(pAd); - /* TODO: need to consider driver without no FW offload @20140728 */ - /* NoA Stop */ - /* if (bP2pCliPmEnable) */ - CmdP2pNoaOffloadCtrl(pAd, P2P_NOA_DISABLED); -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ - -#ifdef APCLI_CFG80211_SUPPORT - RT_CFG80211_LOST_AP_INFORM(pAd); -#endif /* APCLI_CFG80211_SUPPORT */ - - /*for APCLI linkdown*/ - if (CliIdx == 0xFF) { -#ifdef DOT11_N_SUPPORT - wlan_operate_set_ht_bw( - &pApCliEntry->wdev, - wlan_config_get_ht_bw(&pApCliEntry->wdev), - wlan_config_get_ext_cha(&pApCliEntry->wdev)); -#endif -#ifdef DOT11_VHT_AC - wlan_operate_set_vht_bw( - &pApCliEntry->wdev, - wlan_config_get_vht_bw(&pApCliEntry->wdev)); -#endif - ApCliLinkDownComplete(pApCliEntry); - } -} - -/* - ========================================================================== - Description: - APCLI Interface Up. - ========================================================================== - */ -VOID ApCliIfUp(RTMP_ADAPTER *pAd) -{ - UCHAR ifIndex; - APCLI_STRUCT *pApCliEntry; -#ifdef APCLI_CONNECTION_TRIAL - PULONG pCurrState = NULL; -#endif /* APCLI_CONNECTION_TRIAL */ - struct DOT11_H *pDot11h = NULL; - - /* Reset is in progress, stop immediately */ - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | - fRTMP_ADAPTER_RADIO_OFF) || - (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))) - return; - - for (ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++) { - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - - /* sanity check whether the interface is initialized. */ - if (pApCliEntry->ApCliInit != TRUE) - continue; - -#ifdef APCLI_CONNECTION_TRIAL - pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; -#endif /* APCLI_CONNECTION_TRIAL */ - - if (!HcIsRadioAcq(&pApCliEntry->wdev)) - continue; - - if (APCLI_IF_UP_CHECK(pAd, ifIndex) && - (pApCliEntry->Enable == TRUE) && - (pApCliEntry->Valid == FALSE) -#ifdef APCLI_CFG80211_SUPPORT - && (pApCliEntry->ReadyToConnect == TRUE) -#endif -#ifdef APCLI_CONNECTION_TRIAL - && - (ifIndex != (pAd->ApCfg.ApCliNum - - 1)) /* last IF is for apcli connection trial */ -#endif /* APCLI_CONNECTION_TRIAL */ - ) { - pDot11h = pApCliEntry->wdev.pDot11_H; - if (pDot11h == NULL) - return; - if (IS_DOT11_H_RADAR_STATE(pAd, RD_SILENCE_MODE, - pApCliEntry->wdev.channel, - pDot11h)) { - if (pApCliEntry->bPeerExist == TRUE) { - /* Got peer's beacon; change to normal mode */ - pDot11h->RDCount = - pDot11h->ChMovingTime; - MTWF_LOG(DBG_CAT_CLIENT, - CATCLIENT_APCLI, DBG_LVL_TRACE, - ("ApCliIfUp - PeerExist\n")); - } else - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("ApCliIfUp - Stop probing while Radar state is silent\n")); - - continue; - } - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("(%s) ApCli interface[%d] startup.\n", - __func__, ifIndex)); - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_JOIN_REQ, 0, NULL, ifIndex); - /* Reset bPeerExist each time in case we could keep old status */ - pApCliEntry->bPeerExist = FALSE; - } -#ifdef APCLI_CONNECTION_TRIAL - else if (APCLI_IF_UP_CHECK(pAd, ifIndex) && - (*pCurrState == - APCLI_CTRL_DISCONNECTED) /* Apcli1 is not connected state. */ - && (pApCliEntry->TrialCh != 0) - /* && NdisCmpMemory(pApCliEntry->ApCliMlmeAux.Ssid, pApCliEntry->CfgSsid, pApCliEntry->SsidLen) != 0 */ - && (pApCliEntry->CfgSsidLen != 0) && - (pApCliEntry->Enable != 0) - /* new ap ssid shall different from the origin one. */ - ) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("(%s) Enqueue APCLI_CTRL_TRIAL_CONNECT\n", - __func__)); - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_TRIAL_CONNECT, 0, NULL, ifIndex); - /* Reset bPeerExist each time in case we could keep old status */ - pApCliEntry->bPeerExist = FALSE; - } - -#endif /* APCLI_CONNECTION_TRIAL */ - } -} - -/* - ========================================================================== - Description: - APCLI Interface Down. - ========================================================================== - */ -VOID ApCliIfDown(RTMP_ADAPTER *pAd) -{ - UCHAR ifIndex; - PAPCLI_STRUCT pApCliEntry; -#ifdef MAC_REPEATER_SUPPORT - UCHAR CliIdx, idx; - INVAILD_TRIGGER_MAC_ENTRY *pEntry = NULL; - struct _REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); -#endif /* MAC_REPEATER_SUPPORT */ - - for (ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++) { - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s():ApCli interface[%d] start down.\n", __func__, - ifIndex)); - - if (pApCliEntry->Enable == TRUE) - continue; - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if (wf_drv_tbl.wf_fwd_entry_delete_hook) - wf_drv_tbl.wf_fwd_entry_delete_hook( - pApCliEntry->wdev.if_dev, pAd->net_dev, 1); - -#endif /* CONFIG_WIFI_PKT_FWD */ -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn) { - for (CliIdx = 0; - CliIdx < GET_MAX_REPEATER_ENTRY_NUM(cap); - CliIdx++) { - pReptEntry = - &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - - /*disconnect the ReptEntry which is bind on the CliLink*/ - if ((pReptEntry->CliEnable) && - (pReptEntry->wdev == &pApCliEntry->wdev)) { - RTMP_OS_INIT_COMPLETION( - &pReptEntry->free_ack); - pReptEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_APCLI_IF_DOWN; - MlmeEnqueue( - pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, - NULL, - (REPT_MLME_START_IDX + CliIdx)); - RTMP_MLME_HANDLER(pAd); - ReptWaitLinkDown(pReptEntry); - } - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - RTMP_OS_INIT_COMPLETION(&pApCliEntry->linkdown_complete); - pApCliEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_APCLI_IF_DOWN; - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, NULL, ifIndex); - RTMP_MLME_HANDLER(pAd); - ApCliWaitLinkDown(pApCliEntry); - } - -#ifdef MAC_REPEATER_SUPPORT - - for (idx = 0; idx < MAX_IGNORE_AS_REPEATER_ENTRY_NUM; idx++) { - pEntry = &pAd->ApCfg.ReptControl.IgnoreAsRepeaterEntry[idx]; - - if (pAd->ApCfg.ApCliInfRunned == 0) - RepeaterRemoveIngoreEntry(pAd, idx, pEntry->MacAddr); - } - -#endif /* MAC_REPEATER_SUPPORT */ -} - -/* - ========================================================================== - Description: - APCLI Interface Monitor. - ========================================================================== - */ -VOID ApCliIfMonitor(RTMP_ADAPTER *pAd) -{ - UCHAR index; - APCLI_STRUCT *pApCliEntry; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - /* Reset is in progress, stop immediately */ - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) || - !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) - return; - - if (ScanRunning(pAd) == TRUE) - return; - - for (index = 0; index < MAX_APCLI_NUM; index++) { - UCHAR Wcid; - PMAC_TABLE_ENTRY pMacEntry; - STA_TR_ENTRY *tr_entry; - BOOLEAN bForceBrocken = FALSE; - BOOLEAN bWpa_4way_too_log = FALSE; - BOOLEAN bBeacon_miss = FALSE; -#ifdef APCLI_CONNECTION_TRIAL - - if (index == (pAd->ApCfg.ApCliNum - - 1)) /* last IF is for apcli connection trial */ - continue; /* skip apcli1 monitor. FIXME:Carter shall find a better way. */ - -#endif /* APCLI_CONNECTION_TRIAL */ - pApCliEntry = &pAd->ApCfg.ApCliTab[index]; - - /* sanity check whether the interface is initialized. */ - if (pApCliEntry->ApCliInit != TRUE) - continue; - -#ifdef MAC_REPEATER_SUPPORT - RepeaterLinkMonitor(pAd); -#endif /* MAC_REPEATER_SUPPORT */ - - if (pApCliEntry->Valid == TRUE) { - BOOLEAN ApclibQosNull = FALSE; - - Wcid = pAd->ApCfg.ApCliTab[index].MacTabWCID; - - if (!VALID_UCAST_ENTRY_WCID(pAd, Wcid)) - continue; - - pMacEntry = &pAd->MacTab.Content[Wcid]; - tr_entry = &pAd->MacTab.tr_entry[Wcid]; - - if ((IS_AKM_WPA_CAPABILITY( - pMacEntry->SecConfig.AKMMap)) && - (tr_entry->PortSecured != - WPA_802_1X_PORT_SECURED) && - (RTMP_TIME_AFTER(pAd->Mlme.Now32, - (pApCliEntry->ApCliLinkUpTime + - (30 * OS_HZ))))) { - bWpa_4way_too_log = TRUE; - bForceBrocken = TRUE; - } - - { -#ifdef CONFIG_MULTI_CHANNEL - /* increase to 12 */ - if (RTMP_TIME_AFTER( - pAd->Mlme.Now32, - (pApCliEntry->ApCliRcvBeaconTime + - (12 * OS_HZ)))) { -#else -#ifdef MT7615 -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - - if (cap->fgRateAdaptFWOffload == TRUE) { - if ((RTMP_TIME_AFTER( - pAd->Mlme.Now32, - pApCliEntry->ApCliRcvBeaconTime + - (1 * OS_HZ))) && - (RTMP_TIME_BEFORE( - pAd->Mlme.Now32, - pApCliEntry->ApCliRcvBeaconTime + - (3 * OS_HZ)))) { - pMacEntry->TxStatRspCnt = 0; - pMacEntry->TotalTxSuccessCnt = - 0; - } - - if (RTMP_TIME_AFTER( - pAd->Mlme.Now32, - pApCliEntry->ApCliRcvBeaconTime + - (1 * OS_HZ))) - HW_GET_TX_STATISTIC( - pAd, - GET_TX_STAT_ENTRY_TX_CNT, - pMacEntry->wcid); - } - -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ -#endif /* MT7615 */ - - if (RTMP_TIME_AFTER( - pAd->Mlme.Now32, - (pApCliEntry->ApCliRcvBeaconTime + - (6 * OS_HZ)))) { -#endif /* CONFIG_MULTI_CHANNEL */ -#ifdef MT7615 -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - - if ((cap->fgRateAdaptFWOffload == - TRUE) && - (pMacEntry->TxStatRspCnt > 1) && - (pMacEntry->TotalTxSuccessCnt)) { -#ifdef BEACON_MISS_ON_PRIMARY_CHANNEL - /*When Root AP changes the primary channel within the same group of bandwidth, APCLI not disconnects from Root AP. - This happens as the NULL packet transmits in the configured bandwidth only, the transmitted NULL packet is succeeding - which update TX Success count. - Example, BW is configured for 80 MHz, Root AP switches primary channel from 36 to 40, - NULL packet transmits will happen in 80 MHz only*/ - if ((pApCliEntry->wdev.channel > - 14) && - (pMacEntry->MaxHTPhyMode - .field.BW > 0) && - (RTMP_TIME_AFTER( - pAd->Mlme.Now32, - (pApCliEntry - ->ApCliRcvBeaconTime_MlmeEnqueueForRecv + - (6 * OS_HZ))))) { - bBeacon_miss = TRUE; - bForceBrocken = TRUE; - } else -#endif - pApCliEntry - ->ApCliRcvBeaconTime = - pAd->Mlme.Now32; - } else -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ -#endif /* MT7615 */ - { - bBeacon_miss = TRUE; - bForceBrocken = TRUE; - } - } - } - if (CLIENT_STATUS_TEST_FLAG(pMacEntry, - fCLIENT_STATUS_WMM_CAPABLE)) - ApclibQosNull = TRUE; -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - if (bWpa_4way_too_log == TRUE) { - if (IS_AKM_SAE_SHA256( - pApCliEntry->MlmeAux.AKMMap) || - IS_AKM_OWE(pApCliEntry->MlmeAux.AKMMap)) { - UCHAR pmkid[LEN_PMKID]; - UCHAR pmk[LEN_PMK]; - INT cached_idx; - UCHAR if_index = - pApCliEntry->wdev.func_idx; - UCHAR cli_idx = 0xFF; - - /* Connection taking too long update PMK cache and delete sae instance*/ - if ( -#ifdef APCLI_SAE_SUPPORT - - (IS_AKM_SAE_SHA256( - pApCliEntry->MlmeAux - .AKMMap) && - sae_get_pmk_cache( - &pAd->SaeCfg, - pApCliEntry->wdev - .if_addr, - pApCliEntry->MlmeAux - .Bssid, - pmkid, pmk)) -#endif - -#ifdef APCLI_OWE_SUPPORT - || - IS_AKM_OWE(pApCliEntry->MlmeAux - .AKMMap) -#endif - ) { - - cached_idx = - apcli_search_pmkid_cache( - pAd, - pApCliEntry - ->MlmeAux - .Bssid, - if_index, - cli_idx); - if (cached_idx != - INVALID_PMKID_IDX) { -#ifdef APCLI_SAE_SUPPORT - SAE_INSTANCE *pSaeIns = search_sae_instance( - &pAd->SaeCfg, - pApCliEntry->wdev - .if_addr, - pApCliEntry - ->MlmeAux - .Bssid); - - MTWF_LOG( - DBG_CAT_SEC, - CATSEC_SAE, - DBG_LVL_ERROR, - ("Reconnection falied with pmkid ,delete cache entry and sae instance \n")); - - if (pSaeIns != NULL) { - delete_sae_instance( - pSaeIns); - } -#endif - apcli_delete_pmkid_cache( - pAd, - pApCliEntry - ->MlmeAux - .Bssid, - if_index, - cli_idx); - } - } - } - } -#endif - if ((bForceBrocken == FALSE) -#ifdef CONFIG_MULTI_CHANNEL - && (pAd->Mlme.bStartMcc == FALSE) -#endif /* CONFIG_MULTI_CHANNEL */ - ) { -#if (defined(WH_EZ_SETUP) && defined(RACTRL_FW_OFFLOAD_SUPPORT)) - UCHAR idx, Total; - - if (IS_ADPTR_EZ_SETUP_ENABLED(pAd)) { - if (cap->fgRateAdaptFWOffload == TRUE) - Total = 3; - else - Total = 1; - - for (idx = 0; idx < Total; idx++) - ApCliRTMPSendNullFrame( - pAd, - pMacEntry->CurrTxRate, - ApclibQosNull, - pMacEntry, PWR_ACTIVE); - } else -#endif - ApCliRTMPSendNullFrame( - pAd, pMacEntry->CurrTxRate, - ApclibQosNull, pMacEntry, - PWR_ACTIVE); - } - } else - continue; - - if (bForceBrocken == TRUE) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("ApCliIfMonitor: IF(apcli%d) - no Beancon is received from root-AP.\n", - index)); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("ApCliIfMonitor: Reconnect the Root-Ap again.\n")); -#ifdef CONFIG_MULTI_CHANNEL - - if (pAd->Mlme.bStartMcc == TRUE) - return; - -#endif /* CONFIG_MULTI_CHANNEL */ - - if (bBeacon_miss) { - ULONG Now32; - - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("ApCliIfMonitor apcli%d time1: %lu\n", - index, - pApCliEntry - ->ApCliRcvBeaconTime_MlmeEnqueueForRecv)); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("ApCliIfMonitor apcli%d time2: %lu\n", - index, - pApCliEntry - ->ApCliRcvBeaconTime_MlmeEnqueueForRecv_2)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("ApCliIfMonitor apcli%d time3: %lu\n", - index, - pApCliEntry->ApCliRcvBeaconTime)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("ApCliIfMonitor apcli%d OS_HZ: %d\n", - index, OS_HZ)); - NdisGetSystemUpTime(&Now32); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("ApCliIfMonitor apcli%d time now: %lu\n", - index, Now32)); - } - - /* MCC TODO: WCID Not Correct when MCC on */ -#ifdef MCC_TEST -#else -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn) { - APCLI_STRUCT *apcli_entry = pApCliEntry; - REPEATER_CLIENT_ENTRY *pReptEntry; - UCHAR CliIdx; - - for (CliIdx = 0; - CliIdx < GET_MAX_REPEATER_ENTRY_NUM(cap); - CliIdx++) { - pReptEntry = - &pAd->ApCfg.pRepeaterCliPool - [CliIdx]; - - if ((pReptEntry->CliEnable) && - (pReptEntry->wdev == - &apcli_entry->wdev)) { - if (bBeacon_miss) - pReptEntry - ->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_MNT_NO_BEACON; - else - pReptEntry - ->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_APCLI_TRIGGER_TOO_LONG; - - MlmeEnqueue( - pAd, - APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, - 0, NULL, - (REPT_MLME_START_IDX + - CliIdx)); - RTMP_MLME_HANDLER(pAd); - } - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - - if (bBeacon_miss) - pApCliEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_MNT_NO_BEACON; - else - pApCliEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_APCLI_TRIGGER_TOO_LONG; - - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, NULL, index); - RTMP_MLME_HANDLER(pAd); -#endif /* MCC_TEST */ - } - } - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_LOUD, - ("ra offload=%d\n", cap->fgRateAdaptFWOffload)); -} - -/*! \brief To substitute the message type if the message is coming from external - * \param pFrame The frame received - * \param *Machine The state machine - * \param *MsgType the message type for the state machine - * \return TRUE if the substitution is successful, FALSE otherwise - * \pre - * \post - */ -BOOLEAN ApCliMsgTypeSubst(IN PRTMP_ADAPTER pAd, IN PFRAME_802_11 pFrame, - OUT INT *Machine, OUT INT *MsgType) -{ - USHORT Seq; -#ifdef APCLI_SAE_SUPPORT - USHORT Alg; -#endif - UCHAR EAPType; - BOOLEAN Return = FALSE; -#ifdef WSC_AP_SUPPORT - UCHAR EAPCode; - PMAC_TABLE_ENTRY pEntry; -#endif /* WSC_AP_SUPPORT */ - unsigned char hdr_len = LENGTH_802_11; - -#ifdef A4_CONN - if ((pFrame->Hdr.FC.FrDs == 1) && (pFrame->Hdr.FC.ToDs == 1)) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - - /* only PROBE_REQ can be broadcast, all others must be unicast-to-me && is_mybssid; otherwise, */ - /* ignore this frame */ - - /* WPA EAPOL PACKET */ - if (pFrame->Hdr.FC.Type == FC_TYPE_DATA) { -#ifdef WSC_AP_SUPPORT - /*WSC EAPOL PACKET */ - pEntry = MacTableLookup(pAd, pFrame->Hdr.Addr2); - - if (pEntry && IS_ENTRY_APCLI(pEntry) && - pAd->ApCfg.ApCliTab[pEntry->func_tb_idx] - .wdev.WscControl.WscConfMode == - WSC_ENROLLEE) { - *Machine = WSC_STATE_MACHINE; - EAPType = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + - 1); - EAPCode = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + - 4); - Return = WscMsgTypeSubst(EAPType, EAPCode, MsgType); - } - - if (!Return) -#endif /* WSC_AP_SUPPORT */ - { - *Machine = WPA_STATE_MACHINE; - EAPType = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + - 1); - Return = WpaMsgTypeSubst(EAPType, MsgType); - } - - return Return; - } else if (pFrame->Hdr.FC.Type == FC_TYPE_MGMT) { - switch (pFrame->Hdr.FC.SubType) { - case SUBTYPE_ASSOC_RSP: - *Machine = APCLI_ASSOC_STATE_MACHINE; - *MsgType = APCLI_MT2_PEER_ASSOC_RSP; - break; - - case SUBTYPE_DISASSOC: - *Machine = APCLI_ASSOC_STATE_MACHINE; - *MsgType = APCLI_MT2_PEER_DISASSOC_REQ; - break; - - case SUBTYPE_DEAUTH: - *Machine = APCLI_AUTH_STATE_MACHINE; - *MsgType = APCLI_MT2_PEER_DEAUTH; - break; - - case SUBTYPE_AUTH: - /* get the sequence number from payload 24 Mac Header + 2 bytes algorithm */ -#ifdef APCLI_SAE_SUPPORT - NdisMoveMemory(&Alg, &pFrame->Octet[0], sizeof(USHORT)); -#endif /* APCLI_SAE_SUPPORT */ - NdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(USHORT)); -#ifdef APCLI_SAE_SUPPORT - if (Alg == AUTH_MODE_SAE && Seq == 1) { - *Machine = APCLI_AUTH_STATE_MACHINE; - *MsgType = APCLI_MT2_MLME_SAE_AUTH_COMMIT; - } else if (Alg == AUTH_MODE_SAE && Seq == 2) { - *Machine = APCLI_AUTH_STATE_MACHINE; - *MsgType = APCLI_MT2_MLME_SAE_AUTH_CONFIRM; - } else -#endif /* APCLI_SAE_SUPPORT */ - if (Seq == 2 || Seq == 4) { - *Machine = APCLI_AUTH_STATE_MACHINE; - *MsgType = APCLI_MT2_PEER_AUTH_EVEN; - } else - return FALSE; - - break; - - case SUBTYPE_ACTION: - *Machine = ACTION_STATE_MACHINE; - - /* Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support */ - if ((pFrame->Octet[0] & 0x7F) > MAX_PEER_CATE_MSG) - *MsgType = MT2_ACT_INVALID; - else - *MsgType = (pFrame->Octet[0] & 0x7F); - - break; - - default: - return FALSE; - } - - return TRUE; - } - - return FALSE; -} - -BOOLEAN preCheckMsgTypeSubset(IN PRTMP_ADAPTER pAd, IN PFRAME_802_11 pFrame, - OUT INT *Machine, OUT INT *MsgType) -{ - if (pFrame->Hdr.FC.Type == FC_TYPE_MGMT) { - switch (pFrame->Hdr.FC.SubType) { - /* Beacon must be processed by AP Sync state machine. */ - case SUBTYPE_BEACON: - *Machine = AP_SYNC_STATE_MACHINE; - *MsgType = APMT2_PEER_BEACON; - break; - - /* Only Sta have chance to receive Probe-Rsp. */ - case SUBTYPE_PROBE_RSP: - if (pAd->Mlme.ApSyncMachine.CurrState == - AP_SCAN_LISTEN) { - *Machine = AP_SYNC_STATE_MACHINE; - *MsgType = APMT2_PEER_PROBE_RSP; - } else { - *Machine = APCLI_SYNC_STATE_MACHINE; - *MsgType = APCLI_MT2_PEER_PROBE_RSP; - } - break; - - default: - return FALSE; - } - - return TRUE; - } - - return FALSE; -} - -/* - ========================================================================== - Description: - MLME message sanity check - Return: - TRUE if all parameters are OK, FALSE otherwise - - IRQL = DISPATCH_LEVEL - - ========================================================================== - */ -BOOLEAN ApCliPeerAssocRspSanity( - IN PRTMP_ADAPTER pAd, IN VOID *pMsg, IN ULONG MsgLen, OUT PUCHAR pAddr2, - OUT USHORT *pCapabilityInfo, OUT USHORT *pStatus, OUT USHORT *pAid, - OUT UCHAR SupRate[], OUT UCHAR *pSupRateLen, OUT UCHAR ExtRate[], - OUT UCHAR *pExtRateLen, OUT HT_CAPABILITY_IE *pHtCapability, - OUT ADD_HT_INFO_IE - *pAddHtInfo, /* AP might use this additional ht info IE */ - OUT UCHAR *pHtCapabilityLen, OUT UCHAR *pAddHtInfoLen, - OUT UCHAR *pNewExtChannelOffset, OUT PEDCA_PARM pEdcaParm, - OUT UCHAR *pCkipFlag, OUT IE_LISTS *ie_list) -{ - CHAR IeType, *Ptr; - PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg; - PEID_STRUCT pEid; - ULONG Length = 0; -#ifdef CONFIG_MAP_SUPPORT - unsigned char map_cap; -#ifdef MAP_R2 - UCHAR map_profile; - UINT16 map_vid; -#endif -#endif - - *pNewExtChannelOffset = 0xff; - *pHtCapabilityLen = 0; - *pAddHtInfoLen = 0; - COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2); - Ptr = (CHAR *)pFrame->Octet; - Length += LENGTH_802_11; - NdisMoveMemory(pCapabilityInfo, &pFrame->Octet[0], 2); - Length += 2; - NdisMoveMemory(pStatus, &pFrame->Octet[2], 2); - Length += 2; - *pCkipFlag = 0; - *pExtRateLen = 0; - pEdcaParm->bValid = FALSE; - - if (*pStatus != MLME_SUCCESS) - return TRUE; - - NdisMoveMemory(pAid, &pFrame->Octet[4], 2); - Length += 2; - /* Aid already swaped byte order in RTMPFrameEndianChange() for big endian platform */ - *pAid = (*pAid) & 0x3fff; /* AID is low 14-bit */ - /* -- get supported rates from payload and advance the pointer */ - IeType = pFrame->Octet[6]; - *pSupRateLen = pFrame->Octet[7]; - - if ((IeType != IE_SUPP_RATES) || - (*pSupRateLen > MAX_LEN_OF_SUPPORTED_RATES)) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s(): fail - wrong SupportedRates IE\n", __func__)); - return FALSE; - } - NdisMoveMemory(SupRate, &pFrame->Octet[8], *pSupRateLen); - - Length = Length + 2 + *pSupRateLen; - /* many AP implement proprietary IEs in non-standard order, we'd better */ - /* tolerate mis-ordered IEs to get best compatibility */ - pEid = (PEID_STRUCT)&pFrame->Octet[8 + (*pSupRateLen)]; - - /* get variable fields from payload and advance the pointer */ - while ((Length + 2 + pEid->Len) <= MsgLen) { - switch (pEid->Eid) { - case IE_EXT_SUPP_RATES: - if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) { - NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len); - *pExtRateLen = pEid->Len; - } - - break; -#ifdef DOT11_N_SUPPORT - - case IE_HT_CAP: - case IE_HT_CAP2: - if (pEid->Len >= - SIZE_HT_CAP_IE) { /*Note: allow extension.!! */ - NdisMoveMemory(pHtCapability, pEid->Octet, - SIZE_HT_CAP_IE); - *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16( - *(USHORT *)(&pHtCapability->HtCapInfo)); - *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16( - *(USHORT *)(&pHtCapability - ->ExtHtCapInfo)); - *(UINT32 *)(&pHtCapability->TxBFCap) = cpu2le32( - *(UINT32 *)(&pHtCapability->TxBFCap)); - *pHtCapabilityLen = SIZE_HT_CAP_IE; - } else - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_WARN, - ("%s():wrong IE_HT_CAP\n", __func__)); - - break; - - case IE_ADD_HT: - case IE_ADD_HT2: - if (pEid->Len >= sizeof(ADD_HT_INFO_IE)) { - /* This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only */ - /* copy first sizeof(ADD_HT_INFO_IE) */ - NdisMoveMemory(pAddHtInfo, pEid->Octet, - sizeof(ADD_HT_INFO_IE)); - *pAddHtInfoLen = SIZE_ADD_HT_INFO_IE; - } else - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_WARN, - ("%s():wrong IE_ADD_HT\n", __func__)); - - break; - - case IE_SECONDARY_CH_OFFSET: - if (pEid->Len == 1) - *pNewExtChannelOffset = pEid->Octet[0]; - else - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_WARN, - ("%s():wrong IE_SECONDARY_CH_OFFSET\n", - __func__)); - - break; -#ifdef DOT11_VHT_AC - - case IE_VHT_CAP: - if (pEid->Len == sizeof(VHT_CAP_IE)) { - NdisMoveMemory(&ie_list->vht_cap, pEid->Octet, - sizeof(VHT_CAP_IE)); - ie_list->vht_cap_len = sizeof(VHT_CAP_IE); - } else - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_WARN, - ("%s():wrong IE_VHT_CAP\n", __func__)); - - break; - - case IE_VHT_OP: - if (pEid->Len == sizeof(VHT_OP_IE)) { - NdisMoveMemory(&ie_list->vht_op, pEid->Octet, - sizeof(VHT_OP_IE)); - ie_list->vht_op_len = sizeof(VHT_OP_IE); - } else - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_WARN, - ("%s():wrong IE_VHT_OP\n", __func__)); - - break; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - - /* CCX2, WMM use the same IE value */ - /* case IE_CCX_V2: */ - case IE_VENDOR_SPECIFIC: -#ifdef CONFIG_MAP_SUPPORT - if (map_check_cap_ie(pEid, &map_cap -#ifdef MAP_R2 - , - &map_profile, &map_vid -#endif - ) == TRUE) { - ie_list->MAP_AttriValue = map_cap; -#ifdef MAP_R2 - ie_list->MAP_ProfileValue = map_profile; - ie_list->MAP_default_vid = map_vid; - -#endif - } -#endif /* CONFIG_MAP_SUPPORT */ - - /* handle WME PARAMTER ELEMENT */ - if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && - (pEid->Len == 24)) { - PUCHAR ptr; - int i; - /* parsing EDCA parameters */ - pEdcaParm->bValid = TRUE; - pEdcaParm->bQAck = - FALSE; /* pEid->Octet[0] & 0x10; */ - pEdcaParm->bQueueRequest = - FALSE; /* pEid->Octet[0] & 0x20; */ - pEdcaParm->bTxopRequest = - FALSE; /* pEid->Octet[0] & 0x40; */ - /*pEdcaParm->bMoreDataAck = FALSE; // pEid->Octet[0] & 0x80; */ - pEdcaParm->EdcaUpdateCount = - pEid->Octet[6] & 0x0f; - pEdcaParm->bAPSDCapable = - (pEid->Octet[6] & 0x80) ? 1 : 0; - ptr = (PUCHAR)&pEid->Octet[8]; - - for (i = 0; i < 4; i++) { - UCHAR aci = (*ptr & 0x60) >> - 5; /* b5~6 is AC INDEX */ - - pEdcaParm->bACM[aci] = - (((*ptr) & 0x10) == - 0x10); /* b5 is ACM */ - pEdcaParm->Aifsn[aci] = - (*ptr) & - 0x0f; /* b0~3 is AIFSN */ - pEdcaParm->Cwmin[aci] = - *(ptr + 1) & - 0x0f; /* b0~4 is Cwmin */ - pEdcaParm->Cwmax[aci] = - *(ptr + 1) >> - 4; /* b5~8 is Cwmax */ - pEdcaParm->Txop[aci] = - *(ptr + 2) + - 256 * (*(ptr + - 3)); /* in unit of 32-us */ - ptr += 4; /* point to next AC */ - } - } - - break; - case IE_RSN: - /* Copy whole RSNIE context */ - NdisMoveMemory(&ie_list->RSN_IE[0], pEid, - pEid->Len + 2); - ie_list->RSNIE_Len = pEid->Len + 2; - break; - - case IE_WLAN_EXTENSION: { - /*parse EXTENSION EID*/ - UCHAR *extension_id = (UCHAR *)pEid + 2; - switch (*extension_id) { - case IE_EXTENSION_ID_ECDH: -#ifdef APCLI_OWE_SUPPORT - { - UCHAR *ext_ie_length = (UCHAR *)pEid + 1; - os_zero_mem(ie_list->ecdh_ie.public_key, - *ext_ie_length - 3); - ie_list->ecdh_ie.ext_ie_id = IE_WLAN_EXTENSION; - ie_list->ecdh_ie.length = pEid->Len; - NdisMoveMemory(&ie_list->ecdh_ie.ext_id_ecdh, - pEid->Octet, pEid->Len); - } -#endif /*APCLI_OWE_SUPPORT*/ - break; - - default: - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("RESP IE_WLAN_EXTENSION: no handler for extension_id:%d\n", - *extension_id)); - break; - } - break; - } - - default: - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s():ignore unrecognized EID = %d\n", - __func__, pEid->Eid)); - break; - } - - Length = Length + 2 + pEid->Len; - pEid = (PEID_STRUCT)((UCHAR *)pEid + 2 + pEid->Len); - } - - return TRUE; -} - -MAC_TABLE_ENTRY *ApCliTableLookUpByWcid(RTMP_ADAPTER *pAd, UCHAR wcid, - UCHAR *pAddrs) -{ - ULONG ApCliIndex; - PMAC_TABLE_ENTRY pCurEntry = NULL; - PMAC_TABLE_ENTRY pEntry = NULL; - - if (!VALID_UCAST_ENTRY_WCID(pAd, wcid)) - return NULL; - - NdisAcquireSpinLock(&pAd->MacTabLock); - - do { - pCurEntry = &pAd->MacTab.Content[wcid]; - ApCliIndex = 0xff; - - if ((pCurEntry) && - (IS_ENTRY_APCLI(pCurEntry) || IS_ENTRY_REPEATER(pCurEntry))) - ApCliIndex = pCurEntry->func_tb_idx; - - if ((ApCliIndex == 0xff) || (ApCliIndex >= MAX_APCLI_NUM)) - break; - - if (pAd->ApCfg.ApCliTab[ApCliIndex].Valid != TRUE) - break; - - if (MAC_ADDR_EQUAL(pCurEntry->Addr, pAddrs)) { - pEntry = pCurEntry; - break; - } - } while (FALSE); - - NdisReleaseSpinLock(&pAd->MacTabLock); - return pEntry; -} - -VOID APCLIerr_Action(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR Idx) -{ - HEADER_802_11 DisassocHdr; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - NDIS_STATUS NStatus; - USHORT Reason = REASON_CLS3ERR; - MAC_TABLE_ENTRY *pEntry = NULL; - - if (VALID_UCAST_ENTRY_WCID(pAd, pRxBlk->wcid)) - pEntry = &(pAd->MacTab.Content[pRxBlk->wcid]); - - if (pEntry) { - mac_entry_delete(pAd, pEntry); - } - - /* 2. send out a DISASSOC request frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("APCLI ASSOC - Class 3 Error, Send DISASSOC frame to %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pRxBlk->Addr2))); - - ApCliMgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, - pRxBlk->Addr2, pRxBlk->Addr2, Idx); - - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &DisassocHdr, 2, &Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -} -/* - ========================================================================== - Description: - Check the Apcli Entry is valid or not. - ========================================================================== - */ -static inline BOOLEAN ValidApCliEntry(RTMP_ADAPTER *pAd, INT apCliIdx) -{ - BOOLEAN result; - PMAC_TABLE_ENTRY pMacEntry; - APCLI_STRUCT *pApCliEntry; - - do { - if ((apCliIdx < 0) || (apCliIdx >= MAX_APCLI_NUM)) { - result = FALSE; - break; - } - - pApCliEntry = (APCLI_STRUCT *)&pAd->ApCfg.ApCliTab[apCliIdx]; - - if (pApCliEntry->Valid != TRUE) { - result = FALSE; - break; - } - - if (pApCliEntry->Enable != TRUE) { - result = FALSE; - break; - } - - if ((!VALID_UCAST_ENTRY_WCID(pAd, pApCliEntry->MacTabWCID)) - /* || (pApCliEntry->MacTabWCID < 0) //MacTabWCID is UCHAR, no need to check */ - ) { - result = FALSE; - break; - } - - pMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; - - if (!IS_ENTRY_APCLI(pMacEntry)) { - result = FALSE; - break; - } - - result = TRUE; - } while (FALSE); - - return result; -} - -INT apcli_fp_tx_pkt_allowed(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN PNDIS_PACKET pkt) -{ - UCHAR idx; - BOOLEAN allowed = FALSE; - APCLI_STRUCT *apcli_entry; -#ifdef MAC_REPEATER_SUPPORT - UINT Ret = 0; -#endif -#ifdef MAP_TS_TRAFFIC_SUPPORT - MAC_TABLE_ENTRY *peer_entry = NULL; -#endif - UCHAR wcid = RTMP_GET_PACKET_WCID(pkt); - UCHAR frag_nums; - - for (idx = 0; idx < MAX_APCLI_NUM; idx++) { - apcli_entry = &pAd->ApCfg.ApCliTab[idx]; - - if (&apcli_entry->wdev == wdev) { - if (ValidApCliEntry(pAd, idx) == FALSE) - break; - -#ifdef MAC_REPEATER_SUPPORT - if ((pAd->ApCfg.bMACRepeaterEn == TRUE) -#ifdef A4_CONN - && (IS_APCLI_A4(apcli_entry) == FALSE) -#endif /* A4_CONN */ - ) { - Ret = ReptTxPktCheckHandler(pAd, wdev, pkt, - &wcid); - - if (Ret == REPEATER_ENTRY_EXIST) { - allowed = TRUE; - } else if (Ret == INSERT_REPT_ENTRY) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("apcli_fp_tx_pkt_allowed: return FALSE as ReptTxPktCheckHandler indicated INSERT_REPT_ENTRY\n")); - allowed = FALSE; - } else if (Ret == INSERT_REPT_ENTRY_AND_ALLOW) { - allowed = TRUE; - } else if (Ret == USE_CLI_LINK_INFO) { - wcid = apcli_entry->MacTabWCID; - allowed = TRUE; - } - } else -#endif /* MAC_REPEATER_SUPPORT */ - { - pAd->RalinkCounters.PendingNdisPacketCount++; - RTMP_SET_PACKET_WDEV(pkt, wdev->wdev_idx); - wcid = apcli_entry->MacTabWCID; - allowed = TRUE; - } - - break; - } - } - - if (allowed) { -#ifdef MAP_TS_TRAFFIC_SUPPORT - if (pAd->bTSEnable) { - peer_entry = &pAd->MacTab.Content[wcid]; - if (!map_ts_tx_process(pAd, wdev, pkt, peer_entry)) - return FALSE; - } -#endif - RTMP_SET_PACKET_WCID(pkt, wcid); - frag_nums = get_frag_num(pAd, wdev, pkt); - RTMP_SET_PACKET_FRAGMENTS(pkt, frag_nums); - - /* ethertype check is not offload to mcu for fragment frame*/ - if (frag_nums > 1) { - if (!RTMPCheckEtherType(pAd, pkt, - &pAd->MacTab.tr_entry[wcid], - wdev)) - allowed = FALSE; - } - } - - return allowed; -} - -INT apcli_tx_pkt_allowed(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN PNDIS_PACKET pkt) -{ - UCHAR idx; - BOOLEAN allowed = FALSE; - APCLI_STRUCT *apcli_entry; -#ifdef MAC_REPEATER_SUPPORT - UINT Ret = 0; -#endif -#ifdef MAP_TS_TRAFFIC_SUPPORT - MAC_TABLE_ENTRY *peer_entry = NULL; -#endif - UCHAR wcid = RTMP_GET_PACKET_WCID(pkt); - UCHAR frag_nums; - - for (idx = 0; idx < MAX_APCLI_NUM; idx++) { - apcli_entry = &pAd->ApCfg.ApCliTab[idx]; - - if (&apcli_entry->wdev == wdev) { - if (ValidApCliEntry(pAd, idx) == FALSE) - break; - -#ifdef MAC_REPEATER_SUPPORT - if ((pAd->ApCfg.bMACRepeaterEn == TRUE) -#ifdef A4_CONN - && (IS_APCLI_A4(apcli_entry) == FALSE) -#endif /* A4_CONN */ - ) { - Ret = ReptTxPktCheckHandler(pAd, wdev, pkt, - &wcid); - - if (Ret == REPEATER_ENTRY_EXIST) { - allowed = TRUE; - } else if (Ret == INSERT_REPT_ENTRY) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("apcli_tx_pkt_allowed: return FALSE as ReptTxPktCheckHandler indicated INSERT_REPT_ENTRY\n")); - allowed = FALSE; - } else if (Ret == INSERT_REPT_ENTRY_AND_ALLOW) { - allowed = TRUE; - } else if (Ret == USE_CLI_LINK_INFO) { - wcid = apcli_entry->MacTabWCID; - allowed = TRUE; - } - } else -#endif /* MAC_REPEATER_SUPPORT */ - { - pAd->RalinkCounters.PendingNdisPacketCount++; - RTMP_SET_PACKET_WDEV(pkt, wdev->wdev_idx); - wcid = apcli_entry->MacTabWCID; - allowed = TRUE; - } - break; - } - } - - if (allowed) { -#ifdef MAP_TS_TRAFFIC_SUPPORT - if (pAd->bTSEnable) { - peer_entry = &pAd->MacTab.Content[wcid]; - if (!map_ts_tx_process(pAd, wdev, pkt, peer_entry)) - return FALSE; - } -#endif - RTMP_SET_PACKET_WCID(pkt, wcid); - frag_nums = get_frag_num(pAd, wdev, pkt); - RTMP_SET_PACKET_FRAGMENTS(pkt, frag_nums); - - if (!RTMPCheckEtherType(pAd, pkt, &pAd->MacTab.tr_entry[wcid], - wdev)) - allowed = FALSE; - } - - return allowed; -} - -/* - ======================================================================== - - Routine Description: - Validate the security configuration against the RSN information - element - - Arguments: - pAdapter Pointer to our adapter - eid_ptr Pointer to VIE - - Return Value: - TRUE for configuration match - FALSE for otherwise - - Note: - - ======================================================================== -*/ -BOOLEAN ApCliValidateRSNIE(IN RTMP_ADAPTER *pAd, IN PEID_STRUCT pEid_ptr, - IN USHORT eid_len, IN USHORT idx, IN UCHAR Privacy) -{ - PUCHAR pVIE, pTmp; - UCHAR len; - PEID_STRUCT pEid; - PAPCLI_STRUCT pApCliEntry = NULL; - USHORT Count; - PRSN_IE_HEADER_STRUCT pRsnHeader; - PCIPHER_SUITE_STRUCT pCipher; - PAKM_SUITE_STRUCT pAKM; - struct _SECURITY_CONFIG *pSecConfig; - UINT32 AKMMap = 0; - UINT32 PairwiseCipher = 0; - UINT32 GroupCipher = 0; - UCHAR end_field = 0; - UCHAR res = TRUE; - RSN_CAPABILITIES *pRSN_Cap = NULL; - - pVIE = (PUCHAR)pEid_ptr; - len = eid_len; - pApCliEntry = &pAd->ApCfg.ApCliTab[idx]; - pSecConfig = &pApCliEntry->wdev.SecConfig; - -#ifdef APCLI_OWE_SUPPORT - if (IS_AKM_OWE(pSecConfig->AKMMap) && (Privacy == 0)) { - CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap); - CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher); - CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher); - SET_AKM_OPEN(pApCliEntry->MlmeAux.AKMMap); - SET_CIPHER_NONE(pApCliEntry->MlmeAux.PairwiseCipher); - SET_CIPHER_NONE(pApCliEntry->MlmeAux.GroupCipher); - return TRUE; /* No Security */ - } else -#endif - if (IS_SECURITY(pSecConfig) && (Privacy == 0)) { - return FALSE; /* None matched*/ - } else if (IS_NO_SECURITY(pSecConfig) && (Privacy == 1)) { - return FALSE; /* None matched*/ - } else if (IS_NO_SECURITY(pSecConfig) && (Privacy == 0)) { - CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap); - CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher); - CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher); - SET_AKM_OPEN(pApCliEntry->MlmeAux.AKMMap); - SET_CIPHER_NONE(pApCliEntry->MlmeAux.PairwiseCipher); - SET_CIPHER_NONE(pApCliEntry->MlmeAux.GroupCipher); - return TRUE; /* No Security */ - } - - AKMMap = pApCliEntry->MlmeAux.AKMMap; - PairwiseCipher = pApCliEntry->MlmeAux.PairwiseCipher; - GroupCipher = pApCliEntry->MlmeAux.GroupCipher; - - CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap); - CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher); - CLEAR_CIPHER(pApCliEntry->MlmeAux.GroupCipher); - - /* 1. Parse Cipher this received RSNIE */ - while (len > 0) { - pTmp = pVIE; - pEid = (PEID_STRUCT)pTmp; - - switch (pEid->Eid) { - case IE_WPA: - if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4) != 1) { - /* if unsupported vendor specific IE */ - break; - } - - /* Skip OUI ,version and multicast suite OUI */ - pTmp += 11; - - /* - Cipher Suite Selectors from Spec P802.11i/D3.2 P26. - Value Meaning - 0 None - 1 WEP-40 - 2 Tkip - 3 WRAP - 4 AES - 5 WEP-104 - */ - /* Parse group cipher*/ - switch (*pTmp) { - case 1: - SET_CIPHER_WEP40( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 5: - SET_CIPHER_WEP104( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 2: - SET_CIPHER_TKIP( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 4: - SET_CIPHER_CCMP128( - pApCliEntry->MlmeAux.GroupCipher); - break; - - default: - break; - } - - /* number of unicast suite*/ - pTmp += 1; - /* skip all unicast cipher suites*/ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - - /* Parsing all unicast cipher suite*/ - while (Count > 0) { - /* Skip OUI*/ - pTmp += 3; - - switch (*pTmp) { - case 1: - SET_CIPHER_WEP40( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway*/ - SET_CIPHER_WEP104( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 2: - SET_CIPHER_TKIP( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 4: - SET_CIPHER_CCMP128( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - default: - break; - } - - pTmp++; - Count--; - } - - /* 4. get AKM suite counts*/ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - pTmp += 3; - - switch (*pTmp) { - case 1: - /* Set AP support WPA-enterprise mode*/ - SET_AKM_WPA1(pApCliEntry->MlmeAux.AKMMap); - break; - - case 2: - /* Set AP support WPA-PSK mode*/ - SET_AKM_WPA1PSK(pApCliEntry->MlmeAux.AKMMap); - break; - - default: - break; - } - - pTmp += 1; - break; /* End of case IE_WPA */ - - case IE_RSN: - pRsnHeader = (PRSN_IE_HEADER_STRUCT)pTmp; - res = wpa_rsne_sanity(pTmp, pRsnHeader->Length + 2, - &end_field); - - if (res == FALSE) - break; - - if (end_field < RSN_FIELD_GROUP_CIPHER) - SET_CIPHER_CCMP128( - pApCliEntry->MlmeAux.GroupCipher); - if (end_field < RSN_FIELD_PAIRWISE_CIPHER) - SET_CIPHER_CCMP128( - pApCliEntry->MlmeAux.PairwiseCipher); - if (end_field < RSN_FIELD_AKM) - SET_AKM_WPA2(pApCliEntry->MlmeAux.AKMMap); - - /* 0. Version must be 1*/ - if (le2cpu16(pRsnHeader->Version) != 1) - break; - - /* 1. Check group cipher*/ - if (end_field < RSN_FIELD_GROUP_CIPHER) - break; - - pTmp += sizeof(RSN_IE_HEADER_STRUCT); - pCipher = (PCIPHER_SUITE_STRUCT)pTmp; - - if (!RTMPEqualMemory(&pCipher->Oui, RSN_OUI, 3)) - break; - - /* Parse group cipher*/ - switch (pCipher->Type) { - case 1: - SET_CIPHER_WEP40( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 2: - SET_CIPHER_TKIP( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 4: - SET_CIPHER_CCMP128( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 5: - SET_CIPHER_WEP104( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 8: - SET_CIPHER_GCMP128( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 9: - SET_CIPHER_GCMP256( - pApCliEntry->MlmeAux.GroupCipher); - break; - - case 10: - SET_CIPHER_CCMP256( - pApCliEntry->MlmeAux.GroupCipher); - break; - - default: - break; - } - - /* set to correct offset for next parsing*/ - pTmp += sizeof(CIPHER_SUITE_STRUCT); - /* 2. Get pairwise cipher counts*/ - if (end_field < RSN_FIELD_PAIRWISE_CIPHER) - break; - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - - /* 3. Get pairwise cipher*/ - /* Parsing all unicast cipher suite*/ - while (Count > 0) { - /* Skip OUI*/ - pCipher = (PCIPHER_SUITE_STRUCT)pTmp; - - switch (pCipher->Type) { - case 1: - SET_CIPHER_WEP40( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 2: - SET_CIPHER_TKIP( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 4: - SET_CIPHER_CCMP128( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 5: - SET_CIPHER_WEP104( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 8: - SET_CIPHER_GCMP128( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 9: - SET_CIPHER_GCMP256( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - case 10: - SET_CIPHER_CCMP256( - pApCliEntry->MlmeAux - .PairwiseCipher); - break; - - default: - break; - } - - pTmp += sizeof(CIPHER_SUITE_STRUCT); - Count--; - } - - /* 4. get AKM suite counts*/ - if (end_field < RSN_FIELD_AKM) - break; - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - - /* 5. Get AKM ciphers*/ - /* Parsing all AKM ciphers*/ - while (Count > 0) { - pAKM = (PAKM_SUITE_STRUCT)pTmp; - - if (!RTMPEqualMemory(pTmp, RSN_OUI, 3) -#ifdef DPP_SUPPORT - && !RTMPEqualMemory(pTmp, DPP_OUI, 3) -#endif /* DPP_SUPPORT */ - ) - break; - - switch (pAKM->Type) { - case 0: - SET_AKM_WPANONE( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 1: - SET_AKM_WPA2( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 2: -#ifdef DPP_SUPPORT - if (RTMPEqualMemory(pTmp, RSN_OUI, 3)) - SET_AKM_WPA2PSK( - pApCliEntry->MlmeAux - .AKMMap); - else if (RTMPEqualMemory(pTmp, DPP_OUI, - 3)) - SET_AKM_DPP(pApCliEntry->MlmeAux - .AKMMap); -#else - SET_AKM_WPA2PSK( - pApCliEntry->MlmeAux.AKMMap); -#endif /* DPP_SUPPORT */ - break; - - case 3: - SET_AKM_FT_WPA2( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 4: - SET_AKM_FT_WPA2PSK( - pApCliEntry->MlmeAux.AKMMap); - break; -#ifdef DOT11W_PMF_SUPPORT - - case 5: - SET_AKM_WPA2( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 6: - SET_AKM_WPA2PSK( - pApCliEntry->MlmeAux.AKMMap); - break; -#else /* DOT11W_PMF_SUPPORT */ - - case 5: - SET_AKM_WPA2_SHA256( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 6: - SET_AKM_WPA2PSK_SHA256( - pApCliEntry->MlmeAux.AKMMap); - break; -#endif /* !DOT11W_PMF_SUPPORT */ - - case 7: - SET_AKM_TDLS( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 8: - SET_AKM_SAE_SHA256( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 9: - SET_AKM_FT_SAE_SHA256( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 11: - SET_AKM_SUITEB_SHA256( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 12: - SET_AKM_SUITEB_SHA384( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 13: - SET_AKM_FT_WPA2_SHA384( - pApCliEntry->MlmeAux.AKMMap); - break; - - case 18: - SET_AKM_OWE( - pApCliEntry->MlmeAux.AKMMap); - break; - - default: - break; - } - - pTmp += sizeof(AKM_SUITE_STRUCT); - Count--; - } - - /* 6. Get RSN capability*/ - if (end_field < RSN_FIELD_RSN_CAP) - break; - - pRSN_Cap = (RSN_CAPABILITIES *)pTmp; -#ifdef APCLI_OWE_SUPPORT - if (IS_AKM_OWE(pApCliEntry->MlmeAux.AKMMap)) { - /*OWE connection should be allowed with only OWE AP which has PMF Capable and PMF required set*/ - if ((pRSN_Cap->field.MFPC == 0) || - (pRSN_Cap->field.MFPR == 0)) - return FALSE; - } -#endif - - if ((pRSN_Cap->field.MFPC == 1) && - (end_field < RSN_FIELD_GROUP_MGMT_CIPHER)) - SET_CIPHER_BIP_CMAC128( - pApCliEntry->MlmeAux - .IntegrityGroupCipher); - - /* skip RSN capability, update in ApCliPeerProbeRspAtJoinAction */ - pTmp += sizeof(USHORT); - - /* 7. get PMKID counts*/ - if (end_field < RSN_FIELD_PMKID) - break; - /*Count = *(PUSHORT) pTmp;*/ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - - /* 8. ignore PMKID */ - pTmp += 16 * Count; - - /* 9. Get Group Management Cipher Suite*/ - if (end_field < RSN_FIELD_GROUP_MGMT_CIPHER) - break; - pCipher = (PCIPHER_SUITE_STRUCT)pTmp; - if (!RTMPEqualMemory(&pCipher->Oui, RSN_OUI, 3)) - break; - switch (pCipher->Type) { - case 6: - SET_CIPHER_BIP_CMAC128( - pApCliEntry->MlmeAux - .IntegrityGroupCipher); - break; - - case 11: - SET_CIPHER_BIP_GMAC128( - pApCliEntry->MlmeAux - .IntegrityGroupCipher); - break; - - case 12: - SET_CIPHER_BIP_GMAC256( - pApCliEntry->MlmeAux - .IntegrityGroupCipher); - break; - - case 13: - SET_CIPHER_BIP_CMAC256( - pApCliEntry->MlmeAux - .IntegrityGroupCipher); - break; - default: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s: unknown Group Management Cipher Suite %d\n", - __func__, pCipher->Type)); - break; - } - pTmp += sizeof(CIPHER_SUITE_STRUCT); - } - - /* skip this Eid */ - pVIE += (pEid->Len + 2); - len -= (pEid->Len + 2); - } - - if ((pApCliEntry->MlmeAux.AKMMap == 0x0) && (Privacy == 1)) { - /* WEP mode */ - if (IS_AKM_AUTOSWITCH(pSecConfig->AKMMap)) - SET_AKM_AUTOSWITCH(pApCliEntry->MlmeAux.AKMMap); - else if (IS_AKM_OPEN(pSecConfig->AKMMap)) - SET_AKM_OPEN(pApCliEntry->MlmeAux.AKMMap); - else if (IS_AKM_SHARED(pSecConfig->AKMMap)) - SET_AKM_SHARED(pApCliEntry->MlmeAux.AKMMap); - else - SET_AKM_OPEN(pApCliEntry->MlmeAux.AKMMap); - - SET_CIPHER_WEP(pApCliEntry->MlmeAux.PairwiseCipher); - SET_CIPHER_WEP(pApCliEntry->MlmeAux.GroupCipher); - } -#ifdef APCLI_SAE_SUPPORT - if (IS_AKM_WPA2PSK_ONLY(pApCliEntry->MlmeAux.AKMMap) && - IS_AKM_WPA3PSK_ONLY(pSecConfig->AKMMap)) { - CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap); - SET_AKM_WPA2PSK(pApCliEntry->MlmeAux.AKMMap); - pApCliEntry->MlmeAux.PairwiseCipher &= - pSecConfig->PairwiseCipher; - } else -#endif -#ifdef APCLI_OWE_SUPPORT - /*Disallow TKIP cipher with OWE*/ - if (IS_AKM_OWE(pApCliEntry->MlmeAux.AKMMap) && - IS_CIPHER_TKIP(pApCliEntry->MlmeAux.PairwiseCipher)) - return FALSE; - else -#endif - { - pApCliEntry->MlmeAux.AKMMap &= pSecConfig->AKMMap; - pApCliEntry->MlmeAux.PairwiseCipher &= - pSecConfig->PairwiseCipher; - } - - if ((pApCliEntry->MlmeAux.AKMMap == 0) || - (pApCliEntry->MlmeAux.PairwiseCipher == 0)) { - pApCliEntry->MlmeAux.AKMMap = AKMMap; - pApCliEntry->MlmeAux.PairwiseCipher = PairwiseCipher; - pApCliEntry->MlmeAux.GroupCipher = GroupCipher; - return FALSE; /* None matched*/ - } - /* Decide Pairwise and group cipher with AP */ - if (IS_AKM_WPA1(pApCliEntry->MlmeAux.AKMMap) && - IS_AKM_WPA2(pApCliEntry->MlmeAux.AKMMap)) { - CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap); - SET_AKM_WPA2(pApCliEntry->MlmeAux.AKMMap); - } else if (IS_AKM_WPA1PSK(pApCliEntry->MlmeAux.AKMMap) && - IS_AKM_WPA2PSK(pApCliEntry->MlmeAux.AKMMap)) { - CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap); - SET_AKM_WPA2PSK(pApCliEntry->MlmeAux.AKMMap); - } -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - else if (IS_AKM_WPA2PSK(pApCliEntry->MlmeAux.AKMMap) && - IS_AKM_WPA3PSK(pApCliEntry->MlmeAux.AKMMap)) { - CLEAR_SEC_AKM(pApCliEntry->MlmeAux.AKMMap); - SET_AKM_WPA3PSK(pApCliEntry->MlmeAux.AKMMap); - } -#endif - if (IS_CIPHER_TKIP(pApCliEntry->MlmeAux.PairwiseCipher) && - IS_CIPHER_CCMP128(pApCliEntry->MlmeAux.PairwiseCipher)) { - CLEAR_CIPHER(pApCliEntry->MlmeAux.PairwiseCipher); - SET_CIPHER_CCMP128(pApCliEntry->MlmeAux.PairwiseCipher); - } - - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("%s(): Candidate Security AKMMap=%s, PairwiseCipher=%s, GroupCipher=%s\n", - __func__, GetAuthModeStr(pApCliEntry->MlmeAux.AKMMap), - GetEncryModeStr(pApCliEntry->MlmeAux.PairwiseCipher), - GetEncryModeStr(pApCliEntry->MlmeAux.GroupCipher))); - return TRUE; -} - -BOOLEAN ApCliHandleRxBroadcastFrame(IN RTMP_ADAPTER *pAd, IN RX_BLK *pRxBlk, - IN MAC_TABLE_ENTRY *pEntry) -{ - APCLI_STRUCT *pApCliEntry = NULL; -#ifdef MAC_REPEATER_SUPPORT - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; -#endif /* MAC_REPEATER_SUPPORT */ - /* - It is possible to receive the multicast packet when in AP Client mode - ex: broadcast from remote AP to AP-client, - addr1=ffffff, addr2=remote AP's bssid, addr3=sta4_mac_addr - */ - pApCliEntry = &pAd->ApCfg.ApCliTab[pEntry->func_tb_idx]; - - /* Filter out Bcast frame which AP relayed for us */ - /* Multicast packet send from AP1 , received by AP2 and send back to AP1, drop this frame */ - - if (MAC_ADDR_EQUAL(pRxBlk->Addr3, pApCliEntry->wdev.if_addr)) - return FALSE; - - if (pEntry->PrivacyFilter != Ndis802_11PrivFilterAcceptAll) - return FALSE; - -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn -#ifdef A4_CONN - && (IS_APCLI_A4(pApCliEntry) == FALSE) -#endif /* A4_CONN */ - ) { - pReptEntry = RTMPLookupRepeaterCliEntry(pAd, FALSE, - pRxBlk->Addr3, TRUE); - - if (pReptEntry) { - //MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - // ("ApCliHandleRxBroadcastFrame: return FALSE pReptEntry found\n")); - return FALSE; /* give up this frame */ - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - return TRUE; -} - -/* - ======================================================================== - - Routine Description: - Verify the support rate for different PHY type - - Arguments: - pAd Pointer to our adapter - - Return Value: - None - - IRQL = PASSIVE_LEVEL - - ======================================================================== -*/ -/* TODO: shiang-6590, modify this due to it's really a duplication of "RTMPUpdateMlmeRate()" in common/mlme.c */ -VOID ApCliUpdateMlmeRate(RTMP_ADAPTER *pAd, USHORT ifIndex) -{ - UCHAR MinimumRate; - UCHAR ProperMlmeRate; /*= RATE_54; */ - UCHAR i, j, - RateIdx = 12; /* 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */ - BOOLEAN bMatch = FALSE; - struct wifi_dev *wdev; - struct dev_rate_info *rate; - PAPCLI_STRUCT pApCliEntry = NULL; - - if (ifIndex >= MAX_APCLI_NUM) - return; - - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - wdev = &pApCliEntry->wdev; - rate = &wdev->rate; - - switch (wdev->PhyMode) { - case (WMODE_B): - ProperMlmeRate = RATE_11; - MinimumRate = RATE_1; - break; - - case (WMODE_B | WMODE_G): -#ifdef DOT11_N_SUPPORT - case (WMODE_A | WMODE_B | WMODE_G | WMODE_GN | WMODE_AN): - case (WMODE_B | WMODE_G | WMODE_GN): -#ifdef DOT11_VHT_AC - case (WMODE_A | WMODE_B | WMODE_G | WMODE_GN | WMODE_AN | WMODE_AC): -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - if ((pApCliEntry->MlmeAux.SupRateLen == 4) && - (pApCliEntry->MlmeAux.ExtRateLen == 0)) - ProperMlmeRate = RATE_11; /* B only AP */ - else - ProperMlmeRate = RATE_24; - - if (pApCliEntry->MlmeAux.Channel <= 14) - MinimumRate = RATE_1; - else - MinimumRate = RATE_6; - - break; - - case (WMODE_A): -#ifdef DOT11_N_SUPPORT - case (WMODE_GN): - case (WMODE_G | WMODE_GN): - case (WMODE_A | WMODE_G | WMODE_AN | WMODE_GN): - case (WMODE_A | WMODE_AN): - case (WMODE_AN): -#ifdef DOT11_VHT_AC - case (WMODE_AC): - case (WMODE_AN | WMODE_AC): - case (WMODE_A | WMODE_AN | WMODE_AC): -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - ProperMlmeRate = RATE_24; - MinimumRate = RATE_6; - break; - - case (WMODE_B | WMODE_A | WMODE_G): - ProperMlmeRate = RATE_24; - - if (pApCliEntry->MlmeAux.Channel <= 14) - MinimumRate = RATE_1; - else - MinimumRate = RATE_6; - - break; - - default: /* error */ - ProperMlmeRate = RATE_1; - MinimumRate = RATE_1; - break; - } - - for (i = 0; i < pApCliEntry->MlmeAux.SupRateLen; i++) { - for (j = 0; j < RateIdx; j++) { - if ((pApCliEntry->MlmeAux.SupRate[i] & 0x7f) == - RateIdTo500Kbps[j]) { - if (j == ProperMlmeRate) { - bMatch = TRUE; - break; - } - } - } - - if (bMatch) - break; - } - - if (bMatch == FALSE) { - for (i = 0; i < pApCliEntry->MlmeAux.ExtRateLen; i++) { - for (j = 0; j < RateIdx; j++) { - if ((pApCliEntry->MlmeAux.ExtRate[i] & 0x7f) == - RateIdTo500Kbps[j]) { - if (j == ProperMlmeRate) { - bMatch = TRUE; - break; - } - } - } - - if (bMatch) - break; - } - } - - if (bMatch == FALSE) - ProperMlmeRate = MinimumRate; - - if (!OPSTATUS_TEST_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED)) { - pAd->CommonCfg.MlmeRate = MinimumRate; - pAd->CommonCfg.RtsRate = ProperMlmeRate; - - if (pAd->CommonCfg.MlmeRate >= RATE_6) { - rate->MlmeTransmit.field.MODE = MODE_OFDM; - rate->MlmeTransmit.field.MCS = - OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; - pAd->MacTab.Content[BSS0Mcast_WCID] - .HTPhyMode.field.MODE = MODE_OFDM; - pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = - OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; - } else { - rate->MlmeTransmit.field.MODE = MODE_CCK; - rate->MlmeTransmit.field.MCS = pAd->CommonCfg.MlmeRate; - pAd->MacTab.Content[BSS0Mcast_WCID] - .HTPhyMode.field.MODE = MODE_CCK; - pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = - pAd->CommonCfg.MlmeRate; - } - } - - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s():=>MlmeTransmit=0x%x, MinimumRate=%d, ProperMlmeRate=%d\n", - __func__, rate->MlmeTransmit.word, MinimumRate, - ProperMlmeRate)); -} -#ifdef FOLLOW_HIDDEN_SSID_FEATURE -VOID ApCliCheckPeerExistence(RTMP_ADAPTER *pAd, CHAR *Ssid, UCHAR SsidLen, - UCHAR *Bssid, UCHAR Channel) -#else -VOID ApCliCheckPeerExistence(RTMP_ADAPTER *pAd, CHAR *Ssid, UCHAR SsidLen, - UCHAR Channel) -#endif -{ - UCHAR ifIndex; -#ifdef FOLLOW_HIDDEN_SSID_FEATURE - UINT32 mbss_idx = 0; - UCHAR ZeroSsid[MAX_LEN_OF_SSID] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 }; -#endif - APCLI_STRUCT *pApCliEntry; - - for (ifIndex = 0; ifIndex < MAX_APCLI_NUM; ifIndex++) { - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - if (pApCliEntry->bPeerExist == TRUE -#ifdef FOLLOW_HIDDEN_SSID_FEATURE - && !NdisEqualMemory(Bssid, pApCliEntry->MlmeAux.Bssid, - MAC_ADDR_LEN) -#endif - ) { - continue; - } else if (Channel == pApCliEntry->wdev.channel && - ((SsidLen == pApCliEntry->CfgSsidLen && - NdisEqualMemory(Ssid, pApCliEntry->CfgSsid, - SsidLen)) || -#ifdef FOLLOW_HIDDEN_SSID_FEATURE - ((SsidLen == 0 && - NdisEqualMemory(Bssid, pApCliEntry->MlmeAux.Bssid, - MAC_ADDR_LEN)) || - ((NdisEqualMemory(Ssid, ZeroSsid, SsidLen)) && - NdisEqualMemory(Bssid, pApCliEntry->MlmeAux.Bssid, - MAC_ADDR_LEN))) -#else - (SsidLen == 0) -#endif - )) { - pApCliEntry->bPeerExist = TRUE; -#ifdef FOLLOW_HIDDEN_SSID_FEATURE - if (pApCliEntry->CtrlCurrState != APCLI_CTRL_CONNECTED) - continue; - - if ((SsidLen == 0 || - NdisEqualMemory(Ssid, ZeroSsid, SsidLen)) && - !pApCliEntry->MlmeAux.Hidden) { - pApCliEntry->MlmeAux.Hidden = 1; - printk("(%s): !! Following Hidden SSID now !!\n", - __func__); - for (mbss_idx = 0; - mbss_idx < pAd->ApCfg.BssidNum; - mbss_idx++) { - if (pAd->ApCfg.MBSSID[mbss_idx] - .wdev.PhyMode == - pApCliEntry->wdev.PhyMode) { - pAd->ApCfg.MBSSID[mbss_idx] - .bHideSsid = - pApCliEntry->MlmeAux - .Hidden; - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("[%s]-->Follow Root AP Hidden ssid\n", - __func__)); - /*Feature:Update forwardhaul beaconing ssid to hidden if root ap hidden */ - UpdateBeaconHandler( - pAd, - &pAd->ApCfg - .MBSSID[mbss_idx] - .wdev, - BCN_UPDATE_IE_CHG); - } - } - } else if (pApCliEntry->MlmeAux.Hidden && - !(SsidLen == 0 || - NdisEqualMemory(Ssid, ZeroSsid, - SsidLen))) { - pApCliEntry->MlmeAux.Hidden = 0; - printk("(%s): !! Following Broadcast SSID now !!\n", - __func__); - for (mbss_idx = 0; - mbss_idx < pAd->ApCfg.BssidNum; - mbss_idx++) { - if (pAd->ApCfg.MBSSID[mbss_idx] - .wdev.PhyMode == - pApCliEntry->wdev.PhyMode) { - pAd->ApCfg.MBSSID[mbss_idx] - .bHideSsid = - pApCliEntry->MlmeAux - .Hidden; - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("[%s]-->Follow Root AP Broadcast ssid\n", - __func__)); - UpdateBeaconHandler( - pAd, - &pAd->ApCfg - .MBSSID[mbss_idx] - .wdev, - BCN_UPDATE_IE_CHG); - } - } - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("[%s] No action required SSID Len = %d,Hidden status = %d\n", - __func__, SsidLen, - pApCliEntry->MlmeAux.Hidden)); - } -#endif - } else { - /* No Root AP match the SSID */ - } - } -} - -#ifdef CONFIG_MAP_SUPPORT -VOID ApCliCheckConConnectivity(RTMP_ADAPTER *pAd, APCLI_STRUCT *pApCliEntry, - BCN_IE_LIST *ie_list) -{ - struct _vendor_ie_cap *vendor_ie = &ie_list->vendor_ie; - UINT32 TotalLen = 0; - UCHAR *msg; - struct wifi_dev *wdev; - struct wapp_event *event; - wdev = &pApCliEntry->wdev; - - if (!IS_MAP_TURNKEY_ENABLE(pAd)) - return; - - if (pApCliEntry->last_controller_connectivity != - vendor_ie->map_info.connectivity_to_controller) { - TotalLen = sizeof(CHAR) * 2 + sizeof(struct map_vendor_ie) + - sizeof(UINT32); - os_alloc_mem(NULL, (PUCHAR *)&msg, TotalLen); - if (msg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:failed to allocated memory\n", __func__)); - return; - } - event = (struct wapp_event *)msg; - event->event_id = WAPP_MAP_VENDOR_IE; - event->ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - NdisCopyMemory(&event->data, &vendor_ie->map_info, - sizeof(struct map_vendor_ie)); - RtmpOSWrielessEventSend(wdev->if_dev, RT_WLAN_EVENT_CUSTOM, - OID_WAPP_EVENT, NULL, (PUCHAR)event, - TotalLen); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("send connectivity change event to user space %u %u\n", - pApCliEntry->last_controller_connectivity, - vendor_ie->map_info.connectivity_to_controller)); - pApCliEntry->last_controller_connectivity = - vendor_ie->map_info.connectivity_to_controller; - os_free_mem((PUCHAR)msg); - } -} -#else -VOID ApCliCheckConConnectivity(RTMP_ADAPTER *pAd, APCLI_STRUCT *pApCliEntry, - BCN_IE_LIST *ie_list) -{ -} -#endif -VOID ApCliPeerCsaAction(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BCN_IE_LIST *ie_list) -{ - struct DOT11_H *pDot11h = NULL; - - if (wdev == NULL) - return; - - pDot11h = wdev->pDot11_H; - - if (pAd == NULL || ie_list == NULL) - return; - - if (pDot11h == NULL) - return; - - if ((pAd->CommonCfg.bIEEE80211H == 1) && ie_list->NewChannel != 0 && - wdev->channel != ie_list->NewChannel && - pDot11h->RDMode != RD_SWITCHING_MODE) { -#ifdef DOT11_VHT_AC - { - struct _RTMP_CHIP_CAP *cap = - hc_get_chip_cap(pAd->hdev_ctrl); - if (IS_CAP_BW160(cap)) { - VHT_OP_INFO *vht_op = - &ie_list->vht_op_ie.vht_op_info; - - print_vht_op_info(vht_op); - wlan_operate_set_cen_ch_2( - wdev, vht_op->center_freq_2); - } - } -#endif /* DOT11_VHT_AC */ - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("[APCLI] Following root AP to switch channel to ch%u\n", - ie_list->NewChannel)); -#if defined(WAPP_SUPPORT) && defined(CONFIG_MAP_SUPPORT) - if (pAd->bMAPQuickChChangeEn) - wdev->quick_ch_change = - QUICK_CH_SWICH_ENABLE_WO_DISCONNECTION; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("Channel Change due to csa\n")); -#endif -#if defined(CONFIG_MAP_SUPPORT) - if (IS_MAP_TURNKEY_ENABLE(pAd) && - (pAd->bMAPAvoidScanDuringCac == 1)) { -#if defined(DBDC_MODE) - if (pAd->CommonCfg.dbdc_mode == TRUE) { - UCHAR Band = 0; - - if (WMODE_CAP_2G(wdev->PhyMode)) - Band = 0; - if (WMODE_CAP_5G(wdev->PhyMode)) - Band = 1; - BssTableInitByBand(&pAd->ScanTab, Band); - } else -#endif - BssTableInit(&pAd->ScanTab); - } -#endif - rtmp_set_channel(pAd, wdev, ie_list->NewChannel); -#if defined(WAPP_SUPPORT) && defined(CONFIG_MAP_SUPPORT) - if (pAd->bMAPQuickChChangeEn) - wdev->quick_ch_change = QUICK_CH_SWICH_DISABLE; - wapp_send_csa_event(pAd, RtmpOsGetNetIfIndex(wdev->if_dev), - ie_list->NewChannel); -#endif - } -} - -static void apcli_sync_wdev(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct wifi_dev *ap_wdev = NULL; - - if (pAd->CommonCfg.dbdc_mode == TRUE) { - int mbss_idx; - - /*for 5G+5G case choose both phymode & func_idx the same first.*/ - for (mbss_idx = 0; mbss_idx < pAd->ApCfg.BssidNum; mbss_idx++) { - if (pAd->ApCfg.MBSSID[mbss_idx].wdev.PhyMode == - wdev->PhyMode && - wdev->func_idx == mbss_idx) { - ap_wdev = &pAd->ApCfg.MBSSID[mbss_idx].wdev; - update_att_from_wdev(wdev, ap_wdev); - } - } - - if (ap_wdev) - return; - - /*original rule*/ - for (mbss_idx = 0; mbss_idx < pAd->ApCfg.BssidNum; mbss_idx++) { - if (pAd->ApCfg.MBSSID[mbss_idx].wdev.PhyMode == - wdev->PhyMode) { - update_att_from_wdev( - wdev, - &pAd->ApCfg.MBSSID[mbss_idx].wdev); - } - } - } else { - /* align phy mode to BSS0 by default */ - wdev->PhyMode = pAd->ApCfg.MBSSID[BSS0].wdev.PhyMode; - update_att_from_wdev(wdev, &pAd->ApCfg.MBSSID[BSS0].wdev); - } -} - -BOOLEAN apcli_fill_non_offload_tx_blk(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk) -{ - PACKET_INFO PacketInfo; - PNDIS_PACKET pPacket; - MAC_TABLE_ENTRY *pMacEntry = NULL; - struct wifi_dev_ops *ops = wdev->wdev_ops; - pPacket = pTxBlk->pPacket; - - RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, - &pTxBlk->SrcBufLen); - pTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket); - pTxBlk->wmm_set = HcGetWmmIdx(pAd, wdev); - pTxBlk->UserPriority = RTMP_GET_PACKET_UP(pPacket); - pTxBlk->FrameGap = IFS_HTTXOP; - pTxBlk->pMbss = NULL; - pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader; - - if (IS_ASIC_CAP(pAd, fASIC_CAP_TX_HDR_TRANS)) { - if ((pTxBlk->TxFrameType == TX_LEGACY_FRAME) || - (pTxBlk->TxFrameType == TX_AMSDU_FRAME) || - (pTxBlk->TxFrameType == TX_MCAST_FRAME)) - TX_BLK_SET_FLAG(pTxBlk, fTX_HDR_TRANS); - } - - if (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pTxBlk->pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame); - else - TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bClearEAPFrame); - - if (pTxBlk->tr_entry->EntryType == ENTRY_CAT_MCAST) { - pTxBlk->pMacEntry = NULL; - TX_BLK_SET_FLAG(pTxBlk, fTX_ForceRate); - { -#ifdef MCAST_RATE_SPECIFIC - PUCHAR pDA = GET_OS_PKT_DATAPTR(pPacket); - - if (((*pDA & 0x01) == 0x01) && (*pDA != 0xff)) - pTxBlk->pTransmit = - &pAd->CommonCfg.MCastPhyMode; - else -#endif /* MCAST_RATE_SPECIFIC */ - { - pTxBlk->pTransmit = - &pAd->MacTab - .Content[MCAST_WCID_TO_REMOVE] - .HTPhyMode; - - if (pTxBlk->wdev->channel > 14) { - pTxBlk->pTransmit->field.MODE = - MODE_OFDM; - pTxBlk->pTransmit->field.MCS = - MCS_RATE_6; - } - } - } - /* AckRequired = FALSE, when broadcast packet in Adhoc mode.*/ - TX_BLK_CLEAR_FLAG(pTxBlk, (fTX_bAckRequired | fTX_bAllowFrag | - fTX_bWMM)); - - if (RTMP_GET_PACKET_MOREDATA(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData); - } else { - pTxBlk->pMacEntry = &pAd->MacTab.Content[pTxBlk->Wcid]; - pTxBlk->pTransmit = &pTxBlk->pMacEntry->HTPhyMode; - pMacEntry = pTxBlk->pMacEntry; - - if (!pMacEntry) - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Err!! pMacEntry is NULL!!\n", - __func__)); - else - pTxBlk->pMbss = pMacEntry->pMbss; - -#ifdef MULTI_WMM_SUPPORT - - if (IS_ENTRY_APCLI(pMacEntry)) - pTxBlk->QueIdx = EDCA_WMM1_AC0_PIPE; - -#endif /* MULTI_WMM_SUPPORT */ - /* For all unicast packets, need Ack unless the Ack Policy is not set as NORMAL_ACK.*/ -#ifdef MULTI_WMM_SUPPORT - - if (pTxBlk->QueIdx >= EDCA_WMM1_AC0_PIPE) { - if (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx - - EDCA_WMM1_AC0_PIPE] != - NORMAL_ACK) - TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); - else - TX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired); - } else -#endif /* MULTI_WMM_SUPPORT */ - { - if (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx] != - NORMAL_ACK) - TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); - else - TX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired); - } - - { - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef A4_CONN - if (IS_ENTRY_A4(pMacEntry)) { - pTxBlk->pMacEntry = pMacEntry; - pTxBlk->pApCliEntry = - &pAd->ApCfg.ApCliTab - [pMacEntry->func_tb_idx]; - TX_BLK_SET_FLAG(pTxBlk, fTX_bA4Frame); - } else -#endif /* A4_CONN */ - if (pMacEntry && - (IS_ENTRY_APCLI(pMacEntry) || - IS_ENTRY_REPEATER(pMacEntry)) && - ((pTxBlk->TxFrameType != - TX_MCAST_FRAME) && - (pTxBlk->TxFrameType != - TX_MLME_DATAQ_FRAME) && - (pTxBlk->TxFrameType != - TX_MLME_MGMTQ_FRAME))) { -#ifdef MAT_SUPPORT - PNDIS_PACKET apCliPkt = NULL; - UCHAR *pMacAddr = NULL; -#ifdef MAC_REPEATER_SUPPORT - - if ((pMacEntry->bReptCli) && - (pAd->ApCfg.bMACRepeaterEn)) { - UCHAR tmpIdx; - - pAd->MatCfg - .bMACRepeaterEn = - pAd->ApCfg - .bMACRepeaterEn; - - if (pAd->ApCfg - .MACRepeaterOuiMode != - CASUALLY_DEFINE_MAC_ADDR) { - tmpIdx = - REPT_MLME_START_IDX + - pMacEntry - ->MatchReptCliIdx; - /* TODO: shiang-lock, fix ME! */ - apCliPkt = (PNDIS_PACKET)MATEngineTxHandle( - pAd, - pPacket, - tmpIdx, - pTxBlk->OpMode); - pMacAddr = - &pAd->ApCfg - .pRepeaterCliPool - [pMacEntry - ->MatchReptCliIdx] - .CurrentAddress - [0]; - } - } else -#endif /* MAC_REPEATER_SUPPORT */ - { - /* For each tx packet, update our MAT convert engine databases.*/ - /* CFG_TODO */ -#ifdef APCLI_AS_WDS_STA_SUPPORT - if (pAd->ApCfg - .ApCliTab[0] - .wdev - .wds_enable == - 0) -#endif /* APCLI_AS_WDS_STA_SUPPORT */ - apCliPkt = (PNDIS_PACKET)MATEngineTxHandle( - pAd, - pPacket, - pMacEntry - ->func_tb_idx, - pTxBlk->OpMode); - pMacAddr = - &pAd->ApCfg - .ApCliTab[pMacEntry - ->func_tb_idx] - .wdev - .if_addr[0]; - } - - if (apCliPkt) { - RELEASE_NDIS_PACKET( - pAd, pPacket, - NDIS_STATUS_SUCCESS); - pPacket = apCliPkt; - RTMP_QueryPacketInfo( - pPacket, - &PacketInfo, - &pTxBlk->pSrcBufHeader, - &pTxBlk->SrcBufLen); - pTxBlk->pPacket = - apCliPkt; - } - - if (TX_BLK_TEST_FLAG( - pTxBlk, - fTX_HDR_TRANS)) { - PUCHAR pSrcBufVA = - GET_OS_PKT_DATAPTR( - pPacket); - if (pMacAddr -#ifdef APCLI_AS_WDS_STA_SUPPORT - && - (pAd->ApCfg - .ApCliTab[0] - .wdev - .wds_enable == - 0) -#endif /* APCLI_AS_WDS_STA_SUPPORT */ - ) - NdisMoveMemory( - pSrcBufVA + - 6, - pMacAddr, - MAC_ADDR_LEN); - } - -#endif /* MAT_SUPPORT */ - pTxBlk->pApCliEntry = - &pAd->ApCfg.ApCliTab - [pMacEntry->func_tb_idx]; - TX_BLK_SET_FLAG( - pTxBlk, - fTX_bApCliPacket); - } else if (pMacEntry && - IS_ENTRY_CLIENT(pMacEntry)) { - ; - } else - return FALSE; - - /* If both of peer and us support WMM, enable it.*/ - if (OPSTATUS_TEST_FLAG(pAd, - fOP_STATUS_WMM_INUSED) && - CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_WMM_CAPABLE)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM); - } - } - - if (pTxBlk->TxFrameType == TX_LEGACY_FRAME) { - if (((RTMP_GET_PACKET_LOWRATE(pPacket)) -#ifdef UAPSD_SUPPORT - && (!(pMacEntry && (pMacEntry->bAPSDFlagSPStart))) -#endif /* UAPSD_SUPPORT */ - ) || - ((pAd->OpMode == OPMODE_AP) && - (pMacEntry->MaxHTPhyMode.field.MODE == MODE_CCK) && - (pMacEntry->MaxHTPhyMode.field.MCS == RATE_1))) { - /* Specific packet, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame, need force low rate. */ - pTxBlk->pTransmit = - &pAd->MacTab - .Content[MCAST_WCID_TO_REMOVE] - .HTPhyMode; - TX_BLK_SET_FLAG(pTxBlk, fTX_ForceRate); - - /* Modify the WMM bit for ICV issue. If we have a packet with EOSP field need to set as 1, how to handle it? */ - if (!pTxBlk->pMacEntry) - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s():Err!! pTxBlk->pMacEntry is NULL!!\n", - __func__)); - else if (IS_HT_STA(pTxBlk->pMacEntry) && - (CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_RALINK_CHIPSET)) && - ((pAd->CommonCfg.bRdg == TRUE) && - CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_RDG_CAPABLE))) - TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM); - } - - if (!pMacEntry) - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s():Err!! pMacEntry is NULL!!\n", - __func__)); - else if ((IS_HT_RATE(pMacEntry) == FALSE) && - (CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_PIGGYBACK_CAPABLE))) { - /* Currently piggy-back only support when peer is operate in b/g mode.*/ - TX_BLK_SET_FLAG(pTxBlk, fTX_bPiggyBack); - } - - if (RTMP_GET_PACKET_MOREDATA(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData); - -#ifdef UAPSD_SUPPORT - - if (RTMP_GET_PACKET_EOSP(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP); - -#endif /* UAPSD_SUPPORT */ - } else if (pTxBlk->TxFrameType == TX_FRAG_FRAME) - TX_BLK_SET_FLAG(pTxBlk, fTX_bAllowFrag); - - if (!pMacEntry) - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Err!! pMacEntry is NULL!!\n", - __func__)); - else { - pMacEntry->DebugTxCount++; -#ifdef MAC_REPEATER_SUPPORT - - if (pMacEntry->bReptCli) - pMacEntry->ReptCliIdleCount = 0; - -#endif - } - } - - pAd->LastTxRate = (USHORT)pTxBlk->pTransmit->word; - ops->find_cipher_algorithm(pAd, wdev, pTxBlk); - return TRUE; -} - -BOOLEAN apcli_fill_offload_tx_blk(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk) -{ - PACKET_INFO PacketInfo; - PNDIS_PACKET pPacket; - UCHAR *pMacAddr = NULL; - PMAC_TABLE_ENTRY pMacEntry = NULL; -#ifdef MAT_SUPPORT - PUCHAR pSrcBufVA = NULL; - PNDIS_PACKET convertPkt = NULL; -#endif - pPacket = pTxBlk->pPacket; - pTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket); - RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, - &pTxBlk->SrcBufLen); - - if (RTMP_GET_PACKET_MGMT_PKT(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_CT_WithTxD); - - if (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame); - - if (IS_ASIC_CAP(pAd, fASIC_CAP_TX_HDR_TRANS)) { - if ((pTxBlk->TxFrameType == TX_LEGACY_FRAME) || - (pTxBlk->TxFrameType == TX_AMSDU_FRAME) || - (pTxBlk->TxFrameType == TX_MCAST_FRAME)) - TX_BLK_SET_FLAG(pTxBlk, fTX_HDR_TRANS); - } - - pMacEntry = &pAd->MacTab.Content[pTxBlk->Wcid]; - -#ifdef A4_CONN - if (IS_ENTRY_A4(pMacEntry)) { - pTxBlk->pMacEntry = pMacEntry; - pTxBlk->pApCliEntry = - &pAd->ApCfg.ApCliTab[pMacEntry->func_tb_idx]; - TX_BLK_SET_FLAG(pTxBlk, fTX_bA4Frame); - } else -#endif /* A4_CONN */ - if ((IS_ENTRY_APCLI(pMacEntry) || - IS_ENTRY_REPEATER(pMacEntry)) && - ((pTxBlk->TxFrameType != TX_MCAST_FRAME) && - (pTxBlk->TxFrameType != TX_MLME_DATAQ_FRAME) && - (pTxBlk->TxFrameType != TX_MLME_MGMTQ_FRAME))) { -#ifdef MAT_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - - if ((pMacEntry->bReptCli) && - (pAd->ApCfg.bMACRepeaterEn)) { - UCHAR tmpIdx; - - pAd->MatCfg.bMACRepeaterEn = - pAd->ApCfg.bMACRepeaterEn; - - if (pAd->ApCfg.MACRepeaterOuiMode != - CASUALLY_DEFINE_MAC_ADDR) { - tmpIdx = REPT_MLME_START_IDX + - pMacEntry->MatchReptCliIdx; - convertPkt = - (PNDIS_PACKET)MATEngineTxHandle( - pAd, pPacket, tmpIdx, - pTxBlk->OpMode); - pMacAddr = - &pAd->ApCfg - .pRepeaterCliPool - [pMacEntry->MatchReptCliIdx] - .CurrentAddress[0]; - } - } else -#endif /* MAC_REPEATER_SUPPORT */ - { -#ifdef APCLI_AS_WDS_STA_SUPPORT - if (pAd->ApCfg.ApCliTab[0].wdev.wds_enable == 0) -#endif /* APCLI_AS_WDS_STA_SUPPORT */ - /* For each tx packet, update our MAT convert engine databases.*/ - convertPkt = - (PNDIS_PACKET)MATEngineTxHandle( - pAd, pPacket, - pMacEntry->func_tb_idx, - pTxBlk->OpMode); - pMacAddr = - &pAd->ApCfg - .ApCliTab[pMacEntry->func_tb_idx] - .wdev.if_addr[0]; - } - - if (convertPkt) { - RELEASE_NDIS_PACKET(pAd, pPacket, - NDIS_STATUS_SUCCESS); - pPacket = convertPkt; - RTMP_QueryPacketInfo(pPacket, &PacketInfo, - &pTxBlk->pSrcBufHeader, - &pTxBlk->SrcBufLen); - pTxBlk->pPacket = convertPkt; - } - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) { - if (pMacAddr != NULL) { - if (pMacAddr) { - pSrcBufVA = GET_OS_PKT_DATAPTR( - pPacket); -#ifdef APCLI_AS_WDS_STA_SUPPORT - if (pAd->ApCfg.ApCliTab[0] - .wdev.wds_enable == - 0) -#endif /* APCLI_AS_WDS_STA_SUPPORT */ - NdisMoveMemory( - pSrcBufVA + 6, - pMacAddr, - MAC_ADDR_LEN); - } - } - } -#endif /* MAT_SUPPORT */ - pTxBlk->pApCliEntry = - &pAd->ApCfg.ApCliTab[pMacEntry->func_tb_idx]; - pTxBlk->pMacEntry = pMacEntry; - TX_BLK_SET_FLAG(pTxBlk, fTX_bApCliPacket); -#ifdef MAC_REPEATER_SUPPORT - - if (pMacEntry->bReptCli) - pMacEntry->ReptCliIdleCount = 0; - -#endif - } - - pTxBlk->wmm_set = HcGetWmmIdx(pAd, wdev); - pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader; - return TRUE; -} - -static struct wifi_dev_ops apcli_wdev_ops = { - .tx_pkt_allowed = apcli_tx_pkt_allowed, - .fp_tx_pkt_allowed = apcli_fp_tx_pkt_allowed, - .send_data_pkt = ap_send_data_pkt, - .fp_send_data_pkt = fp_send_data_pkt, - .send_mlme_pkt = ap_send_mlme_pkt, - .tx_pkt_handle = ap_tx_pkt_handle, - .fill_non_offload_tx_blk = apcli_fill_non_offload_tx_blk, - .fill_offload_tx_blk = apcli_fill_offload_tx_blk, - .legacy_tx = ap_legacy_tx, - .ampdu_tx = ap_ampdu_tx, - .frag_tx = ap_frag_tx, - .amsdu_tx = ap_amsdu_tx, - .mlme_mgmtq_tx = ap_mlme_mgmtq_tx, - .mlme_dataq_tx = ap_mlme_dataq_tx, - .ieee_802_11_data_tx = ap_ieee_802_11_data_tx, - .ieee_802_3_data_tx = ap_ieee_802_3_data_tx, - .rx_pkt_allowed = sta_rx_pkt_allow, - .rx_pkt_foward = sta_rx_fwd_hnd, - .ieee_802_3_data_rx = ap_ieee_802_3_data_rx, - .ieee_802_11_data_rx = ap_ieee_802_11_data_rx, - .find_cipher_algorithm = ap_find_cipher_algorithm, - .mac_entry_lookup = mac_entry_lookup, -}; - -VOID APCli_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps) -{ -#define APCLI_MAX_DEV_NUM 32 - PNET_DEV new_dev_p; - INT idx; - APCLI_STRUCT *pApCliEntry; - struct wifi_dev *wdev; - UINT8 MaxNumApcli; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - /* sanity check to avoid redundant virtual interfaces are created */ - if (pAd->flg_apcli_init != FALSE) { - for (idx = 0; idx < pAd->ApCfg.ApCliNum; idx++) { - pApCliEntry = &pAd->ApCfg.ApCliTab[idx]; - wdev = &pApCliEntry->wdev; - apcli_sync_wdev(pAd, wdev); - } - - return; - } - - /* init */ - for (idx = 0; idx < MAX_APCLI_NUM; idx++) { - pApCliEntry = &pAd->ApCfg.ApCliTab[idx]; - - if (pApCliEntry->ApCliInit != FALSE) - continue; - - pApCliEntry->wdev.if_dev = NULL; - } - - MaxNumApcli = pAd->ApCfg.ApCliNum; - - if (MaxNumApcli > MAX_APCLI_NUM) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("ApCliNum(%d) exceeds MAX_APCLI_NUM(%d)!\n", - MaxNumApcli, MAX_APCLI_NUM)); - return; - } - - /* create virtual network interface */ - for (idx = 0; idx < MaxNumApcli; idx++) { - UINT32 MC_RowID = 0, IoctlIF = 0; - INT32 Ret = 0; - char *dev_name; -#ifdef MULTI_PROFILE - UCHAR final_name[32] = ""; -#endif - -#ifdef MULTIPLE_CARD_SUPPORT - MC_RowID = pAd->MC_RowID; -#endif /* MULTIPLE_CARD_SUPPORT */ -#ifdef HOSTAPD_SUPPORT - IoctlIF = pAd->IoctlIF; -#endif /* HOSTAPD_SUPPORT */ - pApCliEntry = &pAd->ApCfg.ApCliTab[idx]; - - /* sanity check to avoid redundant virtual interfaces are created */ - if (pApCliEntry->ApCliInit != FALSE) - continue; - - dev_name = get_dev_name_prefix(pAd, INT_APCLI); -#ifdef MULTI_PROFILE - if (dev_name == NULL) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("%s(): apcli interface name is null,apcli idx=%d!\n", - __func__, idx)); - break; - } - snprintf(final_name, sizeof(final_name), "%s", dev_name); - multi_profile_apcli_devname_req(pAd, final_name, &idx); - if (pAd->CommonCfg.dbdc_mode == TRUE) { - /* MULTI_PROFILE enable, apcli interface name will be apcli0,apclix0*/ - new_dev_p = RtmpOSNetDevCreate( - MC_RowID, &IoctlIF, INT_APCLI, 0, - sizeof(struct mt_dev_priv), final_name, TRUE); - } else { - new_dev_p = RtmpOSNetDevCreate( - MC_RowID, &IoctlIF, INT_APCLI, idx, - sizeof(struct mt_dev_priv), final_name, TRUE); - } -#else - new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_APCLI, - idx, sizeof(struct mt_dev_priv), - dev_name, TRUE); -#endif /*MULTI_PROFILE*/ - if (!new_dev_p) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("%s(): Create net_device for %s(%d) fail!\n", - __func__, dev_name, idx)); - break; - } - -#ifdef HOSTAPD_SUPPORT - pAd->IoctlIF = IoctlIF; -#endif /* HOSTAPD_SUPPORT */ -#ifdef FAST_EAPOL_WAR - pApCliEntry->MacTabWCID = 0; - pApCliEntry->pre_entry_alloc = FALSE; -#endif /* FAST_EAPOL_WAR */ - pApCliEntry->ifIndex = idx; - pApCliEntry->pAd = pAd; - -#ifdef APCLI_SAE_SUPPORT - pApCliEntry->sae_cfg_group = SAE_DEFAULT_GROUP; -#endif -#ifdef APCLI_OWE_SUPPORT - pApCliEntry->curr_owe_group = ECDH_GROUP_256; -#endif - - ApCliCompleteInit(pApCliEntry); - wdev = &pApCliEntry->wdev; - Ret = wdev_init(pAd, wdev, WDEV_TYPE_APCLI, new_dev_p, idx, - (VOID *)pApCliEntry, (VOID *)pAd); - - if (!Ret) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("Assign wdev idx for %s failed, free net device!\n", - RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); - RtmpOSNetDevFree(new_dev_p); - break; - } - - Ret = wdev_ops_register(wdev, WDEV_TYPE_APCLI, &apcli_wdev_ops, - cap->wmm_detect_method); - - if (!Ret) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("register wdev_ops %s failed, free net device!\n", - RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); - RtmpOSNetDevFree(new_dev_p); - break; - } - - COPY_MAC_ADDR(wdev->if_addr, pAd->CurrentAddress); - apcli_sync_wdev(pAd, wdev); - /*update rate info*/ - RTMPUpdateRateInfo(wdev->PhyMode, &wdev->rate); - RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); - RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); -#ifdef MT_MAC - - if (!IS_HIF_TYPE(pAd, HIF_MT)) { -#endif /* MT_MAC */ - - if (cap->MBSSIDMode >= MBSSID_MODE1) { - if ((pAd->ApCfg.BssidNum > 0) || - (MAX_MESH_NUM > 0)) { - UCHAR MacMask = 0; - - if ((pAd->ApCfg.BssidNum + - MAX_APCLI_NUM + MAX_MESH_NUM) <= 2) - MacMask = 0xFE; - else if ((pAd->ApCfg.BssidNum + - MAX_APCLI_NUM + - MAX_MESH_NUM) <= 4) - MacMask = 0xFC; - else if ((pAd->ApCfg.BssidNum + - MAX_APCLI_NUM + - MAX_MESH_NUM) <= 8) - MacMask = 0xF8; - - /* - Refer to HW definition - - Bit1 of MAC address Byte0 is local administration bit - and should be set to 1 in extended multiple BSSIDs' - Bit3~ of MAC address Byte0 is extended multiple BSSID index. - */ - if (cap->MBSSIDMode == MBSSID_MODE1) { - /* - Refer to HW definition - - Bit1 of MAC address Byte0 is local administration bit - and should be set to 1 in extended multiple BSSIDs' - Bit3~ of MAC address Byte0 is extended multiple BSSID index. - */ -#ifdef ENHANCE_NEW_MBSSID_MODE - wdev->if_addr[0] &= - (MacMask << 2); -#endif /* ENHANCE_NEW_MBSSID_MODE */ - wdev->if_addr[0] |= 0x2; - wdev->if_addr[0] += - (((pAd->ApCfg.BssidNum + - MAX_MESH_NUM) - - 1) - << 2); - } -#ifdef ENHANCE_NEW_MBSSID_MODE - else { - wdev->if_addr[0] |= 0x2; - wdev->if_addr[cap->MBSSIDMode - - 1] &= (MacMask); - wdev->if_addr[cap->MBSSIDMode - - 1] += - ((pAd->ApCfg.BssidNum + - MAX_MESH_NUM) - - 1); - } - -#endif /* ENHANCE_NEW_MBSSID_MODE */ - } - } else - wdev->if_addr[MAC_ADDR_LEN - 1] = - (wdev->if_addr[MAC_ADDR_LEN - 1] + - pAd->ApCfg.BssidNum + MAX_MESH_NUM) & - 0xFF; - -#ifdef MT_MAC - } else { - UCHAR MacByte = 0; - UCHAR MacMask = 0xef; - UINT32 Value = 0; - RTMP_IO_READ32(pAd, LPON_BTEIR, &Value); - MacByte = Value >> 29; - if (MaxNumApcli <= 2) - MacMask = 0xef; - else if (MaxNumApcli <= 4) - MacMask = 0xcf; - - wdev->if_addr[0] |= - 0x2; /* bit 1 needs to turn on for local mac address definition*/ - /* apcli can not use the same mac as MBSS,so change if_addr[0] to separate */ - if ((wdev->if_addr[0] & 0x4) == 0x4) - wdev->if_addr[0] &= ~0x4; - else - wdev->if_addr[0] |= 0x4; - - switch (MacByte) { - case 0x1: /* choose bit[23:20]*/ - wdev->if_addr[2] = - wdev->if_addr[2] & - MacMask; /*clear high 4 bits,*/ - wdev->if_addr[2] = - (wdev->if_addr[2] | (idx << 4)); - break; - case 0x2: /* choose bit[31:28]*/ - wdev->if_addr[3] = - wdev->if_addr[3] & - MacMask; /*clear high 4 bits,*/ - wdev->if_addr[3] = - (wdev->if_addr[3] | (idx << 4)); - break; - case 0x3: /* choose bit[39:36]*/ - wdev->if_addr[4] = - wdev->if_addr[4] & - MacMask; /*clear high 4 bits,*/ - wdev->if_addr[4] = - (wdev->if_addr[4] | (idx << 4)); - break; - case 0x4: /* choose bit [47:44]*/ - wdev->if_addr[5] = - wdev->if_addr[5] & - MacMask; /*clear high 4 bits,*/ - wdev->if_addr[5] = - (wdev->if_addr[5] | (idx << 4)); - break; - default: /* choose bit[15:12]*/ - wdev->if_addr[1] = - wdev->if_addr[1] & - MacMask; /*clear high 4 bits,*/ - wdev->if_addr[1] = - (wdev->if_addr[1] | (idx << 4)); - break; - } - } - -#endif /* MT_MAC */ - pNetDevOps->priv_flags = - INT_APCLI; /* we are virtual interface */ - pNetDevOps->needProtcted = TRUE; - pNetDevOps->wdev = wdev; - NdisMoveMemory(pNetDevOps->devAddr, &wdev->if_addr[0], - MAC_ADDR_LEN); - -#ifdef APCLI_CFG80211_SUPPORT - { - struct wireless_dev *pWdev; - CFG80211_CB *p80211CB = pAd->pCfg80211_CB; - UINT32 DevType = RT_CMD_80211_IFTYPE_STATION; - - os_alloc_mem_suspend(NULL, (UCHAR **)&pWdev, - sizeof(*pWdev)); - if (!pWdev) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("mem alloc failed for %s, free net device!\n", - RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); - RtmpOSNetDevFree(new_dev_p); - break; - } - os_zero_mem((PUCHAR)pWdev, sizeof(*pWdev)); - new_dev_p->ieee80211_ptr = pWdev; - pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; - SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); - pWdev->netdev = new_dev_p; - pWdev->iftype = DevType; - pWdev->use_4addr = true; - } -#endif /* APCLI_CFG80211_SUPPORT */ - - /* register this device to OS */ - RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); - pApCliEntry->ApCliInit = TRUE; - } - -#ifdef MAC_REPEATER_SUPPORT - CliLinkMapInit(pAd); -#endif - - pAd->flg_apcli_init = TRUE; -} - -VOID ApCli_Remove(RTMP_ADAPTER *pAd) -{ - UINT index; - struct wifi_dev *wdev; - - for (index = 0; index < MAX_APCLI_NUM; index++) { - wdev = &pAd->ApCfg.ApCliTab[index].wdev; - - if (wdev->if_dev) { - RtmpOSNetDevProtect(1); - RtmpOSNetDevDetach(wdev->if_dev); - RtmpOSNetDevProtect(0); -#ifdef APCLI_CFG80211_SUPPORT - os_free_mem(wdev->if_dev->ieee80211_ptr); - wdev->if_dev->ieee80211_ptr = NULL; -#endif /* APCLI_CFG80211_SUPPORT */ - wdev_deinit(pAd, wdev); - RtmpOSNetDevFree(wdev->if_dev); - /* Clear it as NULL to prevent latter access error. */ - pAd->ApCfg.ApCliTab[index].ApCliInit = FALSE; - - pAd->flg_apcli_init = FALSE; - wdev->if_dev = NULL; - } - } -} - -/* -* ApCli_Open -*/ -INT apcli_inf_open(struct wifi_dev *wdev) -{ - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; - APCLI_STRUCT *pApCliEntry; - -#if defined(CONFIG_FAST_NAT_SUPPORT) && \ - (defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE)) - - if (wf_drv_tbl.wf_fwd_probe_adapter) - wf_drv_tbl.wf_fwd_probe_adapter(pAd); - - if (wf_ra_sw_nat_hook_rx_bkup != NULL) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:wf_ra_sw_nat_hook_rx_bkup:%p\n", __func__, - wf_ra_sw_nat_hook_rx_bkup)); - - wf_ra_sw_nat_hook_rx_bkup = NULL; - -#endif - -#ifdef GREENAP_SUPPORT - /* This function will check and update allow status */ - if (greenap_check_when_if_down_up(pAd) == FALSE) - return FALSE; -#endif /* GREENAP_SUPPORT */ - - /* If AP channel is changed, the corresponding ApCli wdev channel is not updated */ - /* if ApCli interface is not up, sync apcli channel with binding radio channel */ - /*Enable this function by default (Don't keep under WH_EZ_SETUP)*/ - apcli_sync_wdev(pAd, wdev); - pApCliEntry = &pAd->ApCfg.ApCliTab[wdev->func_idx]; - ApCliWaitIfDown(pApCliEntry); - - /* Security initial */ - if (wdev->SecConfig.AKMMap == 0x0) - SET_AKM_OPEN(wdev->SecConfig.AKMMap); - - if (wdev->SecConfig.PairwiseCipher == 0x0) { - SET_CIPHER_NONE(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_NONE(wdev->SecConfig.GroupCipher); - } - - if (wifi_sys_open(wdev) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() open fail!!!\n", __func__)); - return FALSE; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("APCLI inf up for apcli_%x(func_idx) OmacIdx=%d\n", - wdev->func_idx, wdev->OmacIdx)); - - RTMPSetPhyMode(pAd, wdev, wdev->PhyMode); - RTMPUpdateRateInfo(wdev->PhyMode, &wdev->rate); - -#ifdef EXT_BUILD_CHANNEL_LIST - BuildChannelListEx(pAd, wdev); -#else - BuildChannelList(pAd, wdev); -#endif - RTMPSetPhyMode(pAd, wdev, wdev->PhyMode); - RTMPUpdateRateInfo(wdev->PhyMode, &wdev->rate); - -#ifdef WSC_INCLUDED - WscUUIDInit(pAd, wdev->func_idx, TRUE); -#endif /* WSC_INCLUDED */ - -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - if (IS_MAP_ENABLE(pAd)) - map_a4_init(pAd, wdev->func_idx, FALSE); -#endif - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - NdisAllocateSpinLock(pAd, &pApCliEntry->SavedPMK_lock); -#endif - -#ifndef APCLI_CFG80211_SUPPORT - ApCliIfUp(pAd); -#endif /* APCLI_CFG80211_SUPPORT */ - - { - UCHAR ucBandIdx = 0; - - ucBandIdx = HcGetBandByWdev( - &pAd->ApCfg.ApCliTab[wdev->func_idx].wdev); - -#ifdef SINGLE_SKU_V2 -#ifdef RF_LOCKDOWN - - /* Check RF lock Status */ - if (chip_check_rf_lock_down(pAd)) { - pAd->CommonCfg.SKUenable[ucBandIdx] = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: RF lock down!! SKUenable = 1!!\n", - __func__)); - } - -#endif /* RF_LOCKDOWN */ - -#if defined(MT7615) || defined(MT7622) - /* enable/disable SKU via profile */ - TxPowerSKUCtrl(pAd, pAd->CommonCfg.SKUenable[ucBandIdx], - ucBandIdx); - - /* enable/disable BF Backoff via profile */ - TxPowerBfBackoffCtrl(pAd, - pAd->CommonCfg.BFBACKOFFenable[ucBandIdx], - ucBandIdx); -#else -#endif /* defined(MT7615) || defined(MT7622) */ -#endif /* SINGLE_SKU_V2*/ - /* enable/disable Power Percentage via profile */ - TxPowerPercentCtrl(pAd, - pAd->CommonCfg.PERCENTAGEenable[ucBandIdx], - ucBandIdx); - - /* Tx Power Percentage value via profile */ - TxPowerDropCtrl(pAd, - pAd->CommonCfg.ucTxPowerPercentage[ucBandIdx], - ucBandIdx); - - /* Config Tx CCK Stream */ - TxCCKStreamCtrl(pAd, pAd->CommonCfg.CCKTxStream[ucBandIdx], - ucBandIdx); - -#ifdef RF_LOCKDOWN - - /* Check RF lock Status */ - if (chip_check_rf_lock_down(pAd)) { - pAd->CommonCfg.BFBACKOFFenable[ucBandIdx] = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: RF lock down!! BFBACKOFFenable = 1!!\n", - __func__)); - } - -#endif /* RF_LOCKDOWN */ -#ifdef TX_POWER_CONTROL_SUPPORT - /* config Power boost table via profile */ - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_CCK_OFDM, - pAd->CommonCfg.cPowerUpCckOfdm[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_HT20, - pAd->CommonCfg.cPowerUpHt20[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_HT40, - pAd->CommonCfg.cPowerUpHt40[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_VHT20, - pAd->CommonCfg.cPowerUpVht20[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_VHT40, - pAd->CommonCfg.cPowerUpVht40[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_VHT80, - pAd->CommonCfg.cPowerUpVht80[ucBandIdx]); - TxPwrUpCtrl(pAd, ucBandIdx, POWER_UP_CATE_VHT160, - pAd->CommonCfg.cPowerUpVht160[ucBandIdx]); -#endif /* TX_POWER_CONTROL_SUPPORT */ - } - -#ifdef DPP_SUPPORT - DlListInit(&wdev->dpp_frame_event_list); -#endif /* DPP_SUPPORT */ - return TRUE; -} - -/* -* ApCli_Close -*/ -INT apcli_inf_close(struct wifi_dev *wdev) -{ - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; -#ifdef MAC_REPEATER_SUPPORT - REPEATER_CLIENT_ENTRY *pReptEntry; - UCHAR CliIdx; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); -#endif /* MAC_REPEATER_SUPPORT */ - APCLI_STRUCT *apcli_entry; - -#ifdef GREENAP_SUPPORT - /* This function will check and update allow status */ - if (greenap_check_when_if_down_up(pAd) == FALSE) - return FALSE; -#endif /* GREENAP_SUPPORT */ - - apcli_entry = &pAd->ApCfg.ApCliTab[wdev->func_idx]; - -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - if (IS_MAP_ENABLE(pAd)) - map_a4_deinit(pAd, wdev->func_idx, FALSE); -#endif - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - NdisFreeSpinLock(&apcli_entry->SavedPMK_lock); -#endif - -#if defined(WPA_SUPPLICANT_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) -#ifdef APCLI_CFG80211_SUPPORT - if (pAd->cfg80211_ctrl.FlgCfg80211Scanning) { - RTMP_OS_INIT_COMPLETION(&apcli_entry->scan_complete); - apcli_entry->MarkToClose = TRUE; - RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&apcli_entry->scan_complete, - 500); - apcli_entry->MarkToClose = FALSE; - RT_CFG80211_SCAN_END(pAd, TRUE); - } - - if (apcli_entry->wpa_supplicant_info.pWpsProbeReqIe) { - os_free_mem(apcli_entry->wpa_supplicant_info.pWpsProbeReqIe); - apcli_entry->wpa_supplicant_info.pWpsProbeReqIe = NULL; - apcli_entry->wpa_supplicant_info.WpsProbeReqIeLen = 0; - } -#endif - - if (apcli_entry->wpa_supplicant_info.pWpaAssocIe) { - os_free_mem(apcli_entry->wpa_supplicant_info.pWpaAssocIe); - apcli_entry->wpa_supplicant_info.pWpaAssocIe = NULL; - apcli_entry->wpa_supplicant_info.WpaAssocIeLen = 0; - } -#endif /* defined(WPA_SUPPLICANT_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) */ - - /* send disconnect-req to sta State Machine. */ - if (apcli_entry->Enable) { -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn) { - for (CliIdx = 0; - CliIdx < GET_MAX_REPEATER_ENTRY_NUM(cap); - CliIdx++) { - pReptEntry = - &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - - if ((pReptEntry->CliEnable) && - (pReptEntry->wdev == &apcli_entry->wdev)) { - RTMP_OS_INIT_COMPLETION( - &pReptEntry->free_ack); - pReptEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_NONE; - MlmeEnqueue( - pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, - NULL, - (REPT_MLME_START_IDX + CliIdx)); - RTMP_MLME_HANDLER(pAd); - ReptWaitLinkDown(pReptEntry); - } - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - RTMP_OS_INIT_COMPLETION(&apcli_entry->linkdown_complete); - apcli_entry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_NONE; - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, NULL, wdev->func_idx); - RTMP_MLME_HANDLER(pAd); - ApCliWaitLinkDown(apcli_entry); - ApCliWaitStateDisconnect(apcli_entry); -#ifdef APCLI_AUTO_CONNECT_SUPPORT - pAd->ApCfg.ApCliAutoConnectRunning[wdev->func_idx] = FALSE; -#endif - -#if defined(CONFIG_FAST_NAT_SUPPORT) && \ - (defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE)) - if (wf_ra_sw_nat_hook_rx_bkup != NULL) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:wf_ra_sw_nat_hook_rx_bkup:%p\n", __func__, - wf_ra_sw_nat_hook_rx_bkup)); - - wf_ra_sw_nat_hook_rx_bkup = NULL; - -#endif - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("(%s) ApCli interface[%d] startdown.\n", __func__, - wdev->func_idx)); - } - -#ifdef RT_CFG80211_SUPPORT - pAd->cfg80211_ctrl.FlgCfg80211Connecting = FALSE; -#endif - if (wifi_sys_close(wdev) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() close fail!!!\n", __func__)); - return FALSE; - } - - /*send for ApOpen can know interface down is done*/ - ApCliIfDownComplete(apcli_entry); - - return TRUE; -} - -#ifdef APCLI_AUTO_CONNECT_SUPPORT -#ifdef APCLI_AUTO_BW_TMP /* should be removed after apcli auto-bw is applied */ -BOOLEAN ApCliAutoConnectBWAdjust(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN BSS_ENTRY *bss_entry) -{ - BOOLEAN bAdjust = FALSE; - BOOLEAN bAdjust_by_channel = FALSE; - BOOLEAN bAdjust_by_ht = FALSE; - BOOLEAN bAdjust_by_vht = FALSE; - UCHAR orig_op_ht_bw; -#ifdef DOT11_VHT_AC - UCHAR orig_op_vht_bw; - struct _RTMP_CHIP_CAP *cap = NULL; -#endif - UCHAR orig_ext_cha; - - if (pAd == NULL || wdev == NULL || bss_entry == NULL) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("(%s) Error! entry is NULL.\n", __func__)); - return FALSE; - } - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("BW info of root AP (%s):\n", bss_entry->Ssid)); - orig_op_ht_bw = wlan_operate_get_ht_bw(wdev); -#ifdef DOT11_VHT_AC - orig_op_vht_bw = wlan_operate_get_vht_bw(wdev); -#endif /*DOT11_VHT_AC*/ - orig_ext_cha = wlan_operate_get_ext_cha(wdev); - - if (wdev->channel != bss_entry->Channel) { - bAdjust = TRUE; - bAdjust_by_channel = TRUE; - } - -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(wdev->PhyMode) && (bss_entry->AddHtInfoLen != 0)) { - ADD_HTINFO *add_ht_info = &bss_entry->AddHtInfo.AddHtInfo; - UCHAR op_ht_bw = wlan_operate_get_ht_bw(wdev); - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - UCHAR ext_cha = wlan_operate_get_ext_cha(wdev); -#ifdef BW_VENDOR10_CUSTOM_FEATURE - UCHAR soft_ap_bw = - wlan_operate_get_bw(&pAd->ApCfg.MBSSID[0].wdev); -#endif - - if (!bAdjust && ((ext_cha != add_ht_info->ExtChanOffset) || -#ifdef BW_VENDOR10_CUSTOM_FEATURE - /* Soft AP BW : Sync Required */ - (soft_ap_bw != add_ht_info->RecomWidth) || -#endif - (op_ht_bw != add_ht_info->RecomWidth))) - bAdjust = TRUE; - - if (bAdjust) { - switch (add_ht_info->RecomWidth) { /* peer side vht bw */ - case BW_20: - if (op_ht_bw == BW_40) { - wlan_operate_set_ht_bw( - wdev, add_ht_info->RecomWidth, - EXTCHA_NONE); - bAdjust_by_ht = TRUE; - -#ifdef BW_VENDOR10_CUSTOM_FEATURE - /* Sync new BW & Ext Channel for Soft AP */ - if (IS_SYNC_BW_POLICY_VALID( - pAd, TRUE, - HT_4020_DOWN_ENBL)) { - MTWF_LOG( - DBG_CAT_CLIENT, - CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("[%s] Enter 4020 HT Sync\n", - __func__)); - wdev_sync_ht_bw(pAd, wdev, - add_ht_info); - } -#endif - } - - break; - case BW_40: -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (op_ht_bw == BW_20 || - (soft_ap_bw == BW_20)) { -#else - if (op_ht_bw == BW_20) { -#endif -#ifdef BT_APCLI_SUPPORT - if (pAd->ApCfg.ApCliAutoBWBTSupport == - TRUE) { - /*set to config extension channel/bw to let ap use new configuration*/ - UCHAR mbss_idx = 0; - /*Moving both AP and CLI to 40Mhz since RootAP is working in 40Mhz */ - for (mbss_idx = 0; - mbss_idx < - pAd->ApCfg.BssidNum; - mbss_idx++) { - struct wifi_dev - *mbss_wdev; - - mbss_wdev = - &pAd->ApCfg - .MBSSID[mbss_idx] - .wdev; - - if (HcGetBandByWdev( - mbss_wdev) == - HcGetBandByWdev( - wdev)) { - wlan_config_set_ht_bw( - mbss_wdev, - add_ht_info - ->RecomWidth); - wlan_config_set_ext_cha( - mbss_wdev, - add_ht_info - ->ExtChanOffset); - } - } - /*set Config BW of CLI to 40Mhz*/ - wlan_config_set_ht_bw( - wdev, - add_ht_info->RecomWidth); - wlan_operate_set_ht_bw( - wdev, - add_ht_info->RecomWidth, - add_ht_info - ->ExtChanOffset); - wlan_config_set_ext_cha( - wdev, - add_ht_info - ->ExtChanOffset); - bAdjust_by_ht = TRUE; - } -#endif -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (cfg_ht_bw == BW_40 && - IS_SYNC_BW_POLICY_VALID( - pAd, TRUE, - HT_2040_UP_ENBL)) { - MTWF_LOG( - DBG_CAT_CLIENT, - CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("[%s] Enter 2040 HT Sync\n", - __func__)); - /*set Config BW of CLI to 40Mhz*/ - bAdjust_by_ht = TRUE; - } -#endif - } else { - if (cfg_ht_bw == BW_40) { - /* Control should not reach here. BW sync missing */ - UCHAR mbss_idx = 0; - wlan_config_set_ext_cha( - wdev, - add_ht_info - ->ExtChanOffset); - bAdjust_by_ht = TRUE; - -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (IS_SYNC_BW_POLICY_VALID( - pAd, TRUE, - HT_2040_UP_ENBL) == - FALSE) - break; -#endif - for (mbss_idx = 0; - mbss_idx < - pAd->ApCfg.BssidNum; - mbss_idx++) { - struct wifi_dev - *mbss_wdev; - mbss_wdev = - &pAd->ApCfg - .MBSSID[mbss_idx] - .wdev; - if (HcGetBandByWdev( - mbss_wdev) == - HcGetBandByWdev( - wdev)) { - wlan_config_set_ext_cha( - mbss_wdev, - add_ht_info - ->ExtChanOffset); - } - } - } - } -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (bAdjust_by_ht && - IS_SYNC_BW_POLICY_VALID(pAd, TRUE, - HT_2040_UP_ENBL)) { - /* Soft AP Op BW 20 M / Root AP Link Up when Soft AP is Down */ - MTWF_LOG(DBG_CAT_CLIENT, - CATCLIENT_APCLI, DBG_LVL_TRACE, - ("[%s] Enter 2040 HT Sync\n", - __func__)); - - /*set Config BW of CLI to 40Mhz*/ - wlan_config_set_ht_bw( - wdev, add_ht_info->RecomWidth); - wlan_operate_set_ht_bw( - wdev, add_ht_info->RecomWidth, - add_ht_info->ExtChanOffset); - wlan_config_set_ext_cha( - wdev, - add_ht_info->ExtChanOffset); - - wdev_sync_ht_bw(pAd, wdev, add_ht_info); - } -#endif - break; - } - } - } - -#endif /* DOT11_N_SUPPORT */ - -#ifdef DOT11_VHT_AC - cap = hc_get_chip_cap(pAd->hdev_ctrl); - if (WMODE_CAP_AC(wdev->PhyMode) && IS_CAP_BW160(cap) && - (bss_entry->vht_cap_len != 0) && (bss_entry->vht_op_len != 0)) { -#ifdef BW_VENDOR10_CUSTOM_FEATURE - BOOLEAN bDown80_2040 = FALSE, bDown160_80 = FALSE; -#endif - BOOLEAN bResetVHTBw = FALSE, bDownBW = FALSE; - UCHAR bw = VHT_BW_2040; - VHT_OP_INFO *vht_op = &bss_entry->vht_op_ie.vht_op_info; - UCHAR op_vht_bw = wlan_operate_get_vht_bw(wdev); - UCHAR cfg_vht_bw = wlan_config_get_vht_bw(wdev); - UCHAR BandIdx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = - hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - bw = check_vht_op_bw(vht_op); - - if (!bAdjust && (bw != op_vht_bw)) - bAdjust = TRUE; - - if (bAdjust) { - switch (bw) { /* peer side vht bw */ - case VHT_BW_2040: - if (cfg_vht_bw > VHT_BW_2040) { - bResetVHTBw = TRUE; -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (op_vht_bw == VHT_BW_80 && - IS_SYNC_BW_POLICY_VALID( - pAd, FALSE, - VHT_80_2040_DOWN_CHK)) { - MTWF_LOG( - DBG_CAT_CLIENT, - CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("[%s] Enter 802040 HT Sync\n", - __func__)); - bDown80_2040 = TRUE; - } -#endif - bDownBW = TRUE; - bAdjust_by_vht = TRUE; - } - - break; - - case VHT_BW_80: - if (cfg_vht_bw > VHT_BW_80) { - bResetVHTBw = TRUE; - bDownBW = TRUE; - bAdjust_by_vht = TRUE; -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (op_vht_bw == VHT_BW_160 && - IS_SYNC_BW_POLICY_VALID( - pAd, FALSE, - VHT_160_80_DOWN_CHK)) - bDown160_80 = TRUE; -#endif - } - - break; - - case VHT_BW_160: - if (cfg_vht_bw == VHT_BW_160) { - bAdjust_by_vht = TRUE; - bResetVHTBw = 1; - } - - break; - - case VHT_BW_8080: - if (cfg_vht_bw == VHT_BW_8080) { - wlan_operate_set_cen_ch_2( - wdev, vht_op->center_freq_2); - bResetVHTBw = 1; - bAdjust_by_vht = TRUE; - } - - break; - } - } - - if (bResetVHTBw) { - INT Idx = -1; - BOOLEAN bMatch = FALSE; - - for (Idx = 0; Idx < pChCtrl->ChListNum; Idx++) { - if (bss_entry->Channel == - pChCtrl->ChList[Idx].Channel) { - bMatch = TRUE; - break; - } - } - - if (bMatch && (Idx < MAX_NUM_OF_CHANNELS)) { - if (bDownBW) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_OFF, - ("(%s): Follow BW info of root AP (%s) from vht_bw = %d to %d. (MAX=%d)\n", - __func__, bss_entry->Ssid, - op_vht_bw, bw, cfg_vht_bw)); - wlan_operate_set_vht_bw(wdev, bw); - } else if (!bDownBW && - (pChCtrl->ChList[Idx].Flags & - CHANNEL_80M_CAP)) - wlan_operate_set_vht_bw(wdev, - cfg_vht_bw); - - wlan_operate_set_cen_ch_2( - wdev, vht_op->center_freq_2); -#ifdef BW_VENDOR10_CUSTOM_FEATURE - /* Sync new BW & Central Channel for Soft AP */ - if (bDown80_2040 || bDown160_80) - wdev_sync_vht_bw( - pAd, wdev, - ((bDownBW) ? - (bw) : - ((bw >= VHT_BW_160) ? - (VHT_BW_160) : - (cfg_vht_bw))), - vht_op->center_freq_2); -#endif - } - } - } - -#endif /* DOT11_VHT_AC */ - bAdjust = FALSE; - - if (bAdjust_by_channel == TRUE) - bAdjust = TRUE; - - if (bAdjust_by_ht == TRUE) - bAdjust = TRUE; - - if (bAdjust_by_vht == TRUE) - bAdjust = TRUE; - - if (bAdjust) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s:Adjust (%d %d %d)\n\r", __func__, - bAdjust_by_channel, bAdjust_by_ht, bAdjust_by_vht)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s:HT BW:%d to %d. MAX(%d)\n\r", __func__, - orig_op_ht_bw, wlan_operate_get_ht_bw(wdev), - wlan_config_get_ht_bw(wdev))); -#ifdef DOT11_VHT_AC - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s:VHT BW:%d to %d. MAX(%d)\n\r", __func__, - orig_op_vht_bw, wlan_operate_get_vht_bw(wdev), - wlan_config_get_vht_bw(wdev))); -#endif /*DOT11_VHT_AC*/ - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s:EXT CH:%d to %d\n\r", __func__, orig_ext_cha, - wlan_operate_get_ext_cha(wdev))); - } - - return bAdjust; -} -#endif /* APCLI_AUTO_BW_TMP */ - -/* - =================================================== - - Description: - Find the AP that is configured in the ApcliTab, and switch to - the channel of that AP - - Arguments: - pAd: pointer to our adapter - - Return Value: - TRUE: no error occured - FALSE: otherwise - - Note: - =================================================== -*/ -BOOLEAN ApCliAutoConnectExec(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev) -{ - UCHAR ifIdx, CfgSsidLen, entryIdx; - RTMP_STRING *pCfgSsid; - BSS_TABLE *pScanTab, *pSsidBssTab; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - INT old_ioctl_if; - INT old_ioctl_if_type; - UCHAR Channel = 0; - -#ifdef APCLI_OWE_SUPPORT - UCHAR switch_to_owe_channel = 0; - BOOLEAN bupdate_owe_trans = FALSE; - BSS_TABLE *powe_bss_tab = NULL; - APCLI_STRUCT *papcli_entry = NULL; -#endif - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("---> ApCliAutoConnectExec()\n")); - - if (wdev) - ifIdx = wdev->func_idx; - else - return FALSE; - - if (ifIdx >= MAX_APCLI_NUM) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error ifIdx=%d\n", ifIdx)); - return FALSE; - } - - if (pAd->ApCfg.ApCliTab[ifIdx].AutoConnectFlag != TRUE) - return FALSE; - - CfgSsidLen = pAd->ApCfg.ApCliTab[ifIdx].CfgSsidLen; - pCfgSsid = pAd->ApCfg.ApCliTab[ifIdx].CfgSsid; - pScanTab = &pAd->ScanTab; - pSsidBssTab = &pAd->ApCfg.ApCliTab[ifIdx].MlmeAux.SsidBssTab; - pSsidBssTab->BssNr = 0; - -#ifdef APCLI_OWE_SUPPORT - papcli_entry = &pAd->ApCfg.ApCliTab[ifIdx]; - if (IS_AKM_OWE(wdev->SecConfig.AKMMap)) { - powe_bss_tab = &papcli_entry->MlmeAux.owe_bss_tab; - powe_bss_tab->BssNr = 0; - - BssTableInit(powe_bss_tab); - - apcli_reset_owe_parameters(pAd, ifIdx); - - /* - Find out APs with the OWE transition IE and store in owe_bss_tab* - */ - for (entryIdx = 0; entryIdx < pScanTab->BssNr; entryIdx++) { - BSS_ENTRY *pBssEntry = &pScanTab->BssEntry[entryIdx]; - - if (pBssEntry->Channel == 0) - continue; - - if ((pBssEntry->owe_trans_ie_len > 0) && - (powe_bss_tab->BssNr < MAX_LEN_OF_BSS_TABLE)) { - NdisMoveMemory(&powe_bss_tab->BssEntry - [powe_bss_tab->BssNr++], - pBssEntry, sizeof(BSS_ENTRY)); - } - } - - if (powe_bss_tab->BssNr < MAX_LEN_OF_BSS_TABLE) - NdisZeroMemory( - &powe_bss_tab->BssEntry[powe_bss_tab->BssNr], - sizeof(BSS_ENTRY)); - } - -#endif - - /* - Find out APs with the desired SSID. - */ - for (entryIdx = 0; entryIdx < pScanTab->BssNr; entryIdx++) { - BSS_ENTRY *pBssEntry = &pScanTab->BssEntry[entryIdx]; - - if (pBssEntry->Channel == 0) - break; - - if (NdisEqualMemory(pCfgSsid, pBssEntry->Ssid, CfgSsidLen) && - pBssEntry->SsidLen && (pBssEntry->SsidLen == CfgSsidLen) && -#if defined(DBDC_MODE) && defined(DOT11K_RRM_SUPPORT) - /* - double check the SSID in the same band could be in candidate list -*/ - (((pBssEntry->Channel > 14) && - WMODE_CAP_5G(wdev->PhyMode)) || - ((pBssEntry->Channel <= 14) && - WMODE_CAP_2G(wdev->PhyMode))) && -#endif /* defined(DBDC_MODE) && defined(DOT11K_RRM_SUPPORT) */ - (pSsidBssTab->BssNr < MAX_LEN_OF_BSS_TABLE)) { - if ((((wdev->SecConfig.AKMMap & pBssEntry->AKMMap) != - 0) || - (IS_AKM_AUTOSWITCH(wdev->SecConfig.AKMMap) && - IS_AKM_SHARED(pBssEntry->AKMMap)) -#ifdef APCLI_SAE_SUPPORT - || (IS_AKM_WPA2PSK_ONLY(pBssEntry->AKMMap) && - IS_AKM_WPA3PSK_ONLY(wdev->SecConfig.AKMMap)) -#endif -/* While using OWE allow ApCli AutoConnect Scan to copy entries of OPEN BSS also*/ -#ifdef APCLI_OWE_SUPPORT - || (IS_AKM_OPEN(pBssEntry->AKMMap) && - IS_AKM_OWE(wdev->SecConfig.AKMMap)) -#endif - ) && - ((wdev->SecConfig.PairwiseCipher & - pBssEntry->PairwiseCipher) -#ifdef APCLI_OWE_SUPPORT - || (IS_CIPHER_CCMP128( - wdev->SecConfig.PairwiseCipher) && - IS_CIPHER_NONE(pBssEntry->PairwiseCipher)) -#endif - ) != 0) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("Found desired ssid in Entry %2d:\n", - entryIdx)); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("I/F(apcli%d) ApCliAutoConnectExec:(Len=%d,Ssid=%s, Channel=%d, Rssi=%d)\n", - ifIdx, pBssEntry->SsidLen, - pBssEntry->Ssid, pBssEntry->Channel, - pBssEntry->Rssi)); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("I/F(apcli%d) ApCliAutoConnectExec::(AuthMode=%s, EncrypType=%s)\n", - ifIdx, - GetAuthMode(pBssEntry->AuthMode), - GetEncryptType(pBssEntry->WepStatus))); - NdisMoveMemory(&pSsidBssTab->BssEntry - [pSsidBssTab->BssNr++], - pBssEntry, sizeof(BSS_ENTRY)); - } - } - } - - if (pSsidBssTab->BssNr < MAX_LEN_OF_BSS_TABLE) - NdisZeroMemory(&pSsidBssTab->BssEntry[pSsidBssTab->BssNr], - sizeof(BSS_ENTRY)); - /* - Sort by Rssi in the increasing order, and connect to - the last entry (strongest Rssi) - */ - BssTableSortByRssi(pSsidBssTab, TRUE); - - if ((pSsidBssTab->BssNr == 0)) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("No match entry.\n")); - pAd->ApCfg.ApCliAutoConnectRunning[ifIdx] = FALSE; - } else if (pSsidBssTab->BssNr > 0 && - pSsidBssTab->BssNr <= MAX_LEN_OF_BSS_TABLE) { - /* - Switch to the channel of the candidate AP - */ - BSS_ENTRY *pBssEntry = - &pSsidBssTab->BssEntry[pSsidBssTab->BssNr - 1]; -#ifdef APCLI_AUTO_BW_TMP /* should be removed after apcli auto-bw is applied */ - BOOLEAN bw_adj = FALSE; -#endif - -#ifdef APCLI_OWE_SUPPORT - - if ((IS_AKM_OWE(wdev->SecConfig.AKMMap)) && - (IS_AKM_OPEN(pBssEntry->AKMMap) && - IS_CIPHER_NONE(pBssEntry->PairwiseCipher))) { - if (pBssEntry->owe_trans_ie_len > 0) { - UCHAR pair_ch = 0; - UCHAR pair_bssid[MAC_ADDR_LEN] = { 0 }; - UCHAR pair_ssid[MAX_LEN_OF_SSID] = { 0 }; - UCHAR pair_band = 0; - UCHAR pair_ssid_len = 0; - - extract_pair_owe_bss_info( - pBssEntry->owe_trans_ie, - pBssEntry->owe_trans_ie_len, pair_bssid, - pair_ssid, &pair_ssid_len, &pair_band, - &pair_ch); - - if (pair_ch != 0) { - /*OWE Entry found ,update OweTransBssid and OweTranSsid*/ - - /*OWE bss is on different channel*/ - - if (BOARD_IS_5G_ONLY(pAd)) { - UCHAR BandIdx = - HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = - hc_get_channel_ctrl( - pAd->hdev_ctrl, - BandIdx); - - /*Single Chip Dual band 5g only case*/ - - if (MTChGrpChannelChk( - pChCtrl, pair_ch)) { - if ((pair_ch != - pBssEntry->Channel) || - (papcli_entry->wdev - .channel != - pair_ch)) { - /*Channel is valid in the current channel group*/ - - /*OWE send EVENT to host for OWE indicating different channel*/ - MTWF_LOG( - DBG_CAT_CLIENT, - CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("%s:%d Different channel same band\n", - __func__, - __LINE__)); - switch_to_owe_channel = - pair_ch; - bupdate_owe_trans = - TRUE; - wext_send_owe_trans_chan_event( - wdev->if_dev, - OID_802_11_OWE_EVT_SAME_BAND_DIFF_CHANNEL, - pair_bssid, - pair_ssid, - &pair_ssid_len, - &pair_band, - &pair_ch); - } else /*Same Channel send directed probe request to OWE BSS*/ - bupdate_owe_trans = - TRUE; - } else { - /*Channel not in group of current band , but entry exists so send event to host to trigger connection on other band*/ - - wext_send_owe_trans_chan_event( - wdev->if_dev, - OID_802_11_OWE_EVT_DIFF_BAND, - pair_bssid, - pair_ssid, - &pair_ssid_len, - &pair_band, - &pair_ch); - } - } else { - /*Check if the OWE bss is on the same band as the CLI,then check if channel change required*/ - if ((WMODE_2G_ONLY( - papcli_entry->wdev - .PhyMode) && - (pair_ch <= 14)) || - (WMODE_5G_ONLY( - papcli_entry->wdev - .PhyMode) && - (pair_ch > 14))) { - if ((pair_ch != - pBssEntry->Channel) || - (papcli_entry->wdev - .channel != - pair_ch)) { - /*OWE send EVENT to host for OWE indicating different channel*/ - MTWF_LOG( - DBG_CAT_CLIENT, - CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("%s:%d Different channel same band\n", - __func__, - __LINE__)); - switch_to_owe_channel = - pair_ch; - bupdate_owe_trans = - TRUE; - wext_send_owe_trans_chan_event( - wdev->if_dev, - OID_802_11_OWE_EVT_SAME_BAND_DIFF_CHANNEL, - pair_bssid, - pair_ssid, - &pair_ssid_len, - &pair_band, - &pair_ch); - } else /*Same Channel send directed probe request to OWE BSS*/ - bupdate_owe_trans = - TRUE; - } else { - /*Channel not in group of current band , but entry exists so send event to host to trigger connection on other band*/ - - wext_send_owe_trans_chan_event( - wdev->if_dev, - OID_802_11_OWE_EVT_DIFF_BAND, - pair_bssid, - pair_ssid, - &pair_ssid_len, - &pair_band, - &pair_ch); - } - } - } else { /*Same Channel send directed probe request to OWE BSS*/ - bupdate_owe_trans = TRUE; - if (papcli_entry->wdev.channel != - pBssEntry->Channel) - switch_to_owe_channel = - pBssEntry->Channel; - } - - if (bupdate_owe_trans) { - NdisMoveMemory( - &papcli_entry->owe_trans_bssid, - pair_bssid, MAC_ADDR_LEN); - NdisMoveMemory( - &papcli_entry->owe_trans_ssid, - pair_ssid, pair_ssid_len); - papcli_entry->owe_trans_ssid_len = - pair_ssid_len; - - NdisMoveMemory( - &papcli_entry - ->owe_trans_open_bssid, - pBssEntry->Bssid, MAC_ADDR_LEN); - NdisMoveMemory( - &papcli_entry - ->owe_trans_open_ssid, - pBssEntry->Ssid, - pBssEntry->SsidLen); - papcli_entry->owe_trans_open_ssid_len = - pBssEntry->SsidLen; - - /*Clear last update settings before trying connection with OWE BSS*/ - CLEAR_SEC_AKM( - papcli_entry->MlmeAux.AKMMap); - CLEAR_CIPHER(papcli_entry->MlmeAux - .PairwiseCipher); - CLEAR_CIPHER(papcli_entry->MlmeAux - .GroupCipher); - - /*Delete the Open Bss entry from Scan table because apcli does not ageout scan tab entries*/ - BssTableDeleteEntry(pScanTab, - pBssEntry->Bssid, - pBssEntry->Channel); - } - } - } -#endif - -#ifdef APCLI_AUTO_BW_TMP /* should be removed after apcli auto-bw is applied */ -#ifdef APCLI_OWE_SUPPORT - if ((IS_AKM_OWE(wdev->SecConfig.AKMMap)) && - (pBssEntry->owe_trans_ie_len > 0)) { - if (switch_to_owe_channel > 0) - bw_adj = TRUE; - } else -#endif - bw_adj = (ApCliAutoConnectBWAdjust(pAd, wdev, - pBssEntry) || - (!IS_INVALID_HT_SECURITY( - pBssEntry->PairwiseCipher))); - if (bw_adj) -#endif /* APCLI_AUTO_BW_TMP */ - { - -#ifdef APCLI_OWE_SUPPORT - if (switch_to_owe_channel) - Channel = switch_to_owe_channel; - else -#endif - { - Channel = pBssEntry->Channel; - pAd->ApCfg.ApCliAutoBWAdjustCnt[ifIdx]++; - } - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("Switch to channel :%d\n", - pBssEntry->Channel)); - rtmp_set_channel(pAd, wdev, Channel); - } - } else { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("Error! Out of table range: (BssNr=%d).\n", - pSsidBssTab->BssNr)); - RtmpOSNetDevProtect(1); - old_ioctl_if = pObj->ioctl_if; - old_ioctl_if_type = pObj->ioctl_if_type; - pObj->ioctl_if = ifIdx; - pObj->ioctl_if_type = INT_APCLI; - Set_ApCli_Enable_Proc(pAd, "1"); - pObj->ioctl_if = old_ioctl_if; - pObj->ioctl_if_type = old_ioctl_if_type; - RtmpOSNetDevProtect(0); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("<--- ApCliAutoConnectExec()\n")); - return FALSE; - } - RtmpOSNetDevProtect(1); - old_ioctl_if = pObj->ioctl_if; - old_ioctl_if_type = pObj->ioctl_if_type; - pObj->ioctl_if = ifIdx; - pObj->ioctl_if_type = INT_APCLI; - Set_ApCli_Enable_Proc(pAd, "1"); - pObj->ioctl_if = old_ioctl_if; - pObj->ioctl_if_type = old_ioctl_if_type; - RtmpOSNetDevProtect(0); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("<--- ApCliAutoConnectExec()\n")); - return TRUE; -} - -/* - =================================================== - - Description: - If the previous selected entry connected failed, this function will - choose next entry to connect. The previous entry will be deleted. - - Arguments: - pAd: pointer to our adapter - - Note: - Note that the table is sorted by Rssi in the "increasing" order, thus - the last entry in table has stringest Rssi. - =================================================== -*/ - -VOID ApCliSwitchCandidateAP(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev) -{ - BSS_TABLE *pSsidBssTab; - PAPCLI_STRUCT pApCliEntry; - UCHAR lastEntryIdx, ifIdx; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - INT old_ioctl_if; - INT old_ioctl_if_type; - - if (pAd->ScanCtrl.PartialScan.bScanning == TRUE) - return; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("---> ApCliSwitchCandidateAP()\n")); - - if (wdev) - ifIdx = wdev->func_idx; - else - return; - - if (ifIdx >= MAX_APCLI_NUM) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error ifIdx=%d\n", ifIdx)); - return; - } - - if (pAd->ApCfg.ApCliTab[ifIdx].AutoConnectFlag != TRUE) - return; - - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIdx]; - pSsidBssTab = &pApCliEntry->MlmeAux.SsidBssTab; - - if (pSsidBssTab->BssNr == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("No Bss\n")); - pAd->ApCfg.ApCliAutoConnectRunning[ifIdx] = FALSE; - return; - } - - /* - delete (zero) the previous connected-failled entry and always - connect to the last entry in talbe until the talbe is empty. - */ - NdisZeroMemory(&pSsidBssTab->BssEntry[--pSsidBssTab->BssNr], - sizeof(BSS_ENTRY)); - lastEntryIdx = pSsidBssTab->BssNr - 1; - - if ((pSsidBssTab->BssNr > 0) && - (pSsidBssTab->BssNr < MAX_LEN_OF_BSS_TABLE)) { - BSS_ENTRY *pBssEntry = - &pSsidBssTab->BssEntry[pSsidBssTab->BssNr - 1]; -#ifdef APCLI_AUTO_BW_TMP /* should be removed after apcli auto-bw is applied */ - BOOLEAN bw_adj; - - bw_adj = ApCliAutoConnectBWAdjust(pAd, wdev, pBssEntry); - if (bw_adj) -#endif /* APCLI_AUTO_BW_TMP */ - { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("Switch to channel :%d\n", - pBssEntry->Channel)); - rtmp_set_channel(pAd, wdev, pBssEntry->Channel); - } - } else { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("No candidate AP, the process is about to stop.\n")); - pAd->ApCfg.ApCliAutoConnectRunning[ifIdx] = FALSE; - } - RtmpOSNetDevProtect(1); - old_ioctl_if = pObj->ioctl_if; - old_ioctl_if_type = pObj->ioctl_if_type; - pObj->ioctl_if = ifIdx; - pObj->ioctl_if_type = INT_APCLI; - Set_ApCli_Enable_Proc(pAd, "1"); - pObj->ioctl_if = old_ioctl_if; - pObj->ioctl_if_type = old_ioctl_if_type; - RtmpOSNetDevProtect(0); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("---> ApCliSwitchCandidateAP()\n")); -} -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - -VOID ApCliRTMPReportMicError(IN RTMP_ADAPTER *pAd, IN UCHAR uniCastKey, - IN INT ifIndex) -{ - ULONG Now; - PAPCLI_STRUCT pApCliEntry = NULL; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - (" ApCliRTMPReportMicError <---\n")); - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - /* Record Last MIC error time and count */ - NdisGetSystemUpTime(&Now); - - if (pAd->ApCfg.ApCliTab[ifIndex].MicErrCnt == 0) { - pAd->ApCfg.ApCliTab[ifIndex].MicErrCnt++; - pAd->ApCfg.ApCliTab[ifIndex].LastMicErrorTime = Now; - NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].ReplayCounter, 8); - } else if (pAd->ApCfg.ApCliTab[ifIndex].MicErrCnt == 1) { - if ((pAd->ApCfg.ApCliTab[ifIndex].LastMicErrorTime + - (60 * OS_HZ)) < Now) { - /* Update Last MIC error time, this did not violate two MIC errors within 60 seconds */ - pAd->ApCfg.ApCliTab[ifIndex].LastMicErrorTime = Now; - } else { - /* RTMPSendWirelessEvent(pAd, IW_COUNTER_MEASURES_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); */ - pAd->ApCfg.ApCliTab[ifIndex].LastMicErrorTime = Now; - /* Violate MIC error counts, MIC countermeasures kicks in */ - pAd->ApCfg.ApCliTab[ifIndex].MicErrCnt++; - } - } else { - /* MIC error count >= 2 */ - /* This should not happen */ - ; - } - - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_MIC_FAILURE_REPORT_FRAME, 1, &uniCastKey, ifIndex); - - if (pAd->ApCfg.ApCliTab[ifIndex].MicErrCnt == 2) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - (" MIC Error count = 2 Trigger Block timer....\n")); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - (" pAd->ApCfg.ApCliTab[%d].LastMicErrorTime = %ld\n", - ifIndex, - pAd->ApCfg.ApCliTab[ifIndex].LastMicErrorTime)); -#ifdef APCLI_CERT_SUPPORT - - if (pAd->bApCliCertTest == TRUE) - RTMPSetTimer(&pApCliEntry->MlmeAux - .WpaDisassocAndBlockAssocTimer, - 100); - -#endif /* APCLI_CERT_SUPPORT */ - } - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("ApCliRTMPReportMicError --->\n")); -} - -#ifdef DOT11W_PMF_SUPPORT -/* chane the cmd depend on security mode first, and update to run time flag*/ -INT Set_ApCliPMFMFPC_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; - PMF_CFG *pPmfCfg = NULL; - struct wifi_dev *wdev = NULL; - - if (strlen(arg) == 0) - return FALSE; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - pPmfCfg = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev.SecConfig.PmfCfg; - wdev = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev; - - if (!pPmfCfg || !wdev) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: pPmfCfg=%p, wdev=%p\n", __func__, pPmfCfg, - wdev)); - return FALSE; - } - - if (os_str_tol(arg, 0, 10)) - pPmfCfg->Desired_MFPC = TRUE; - else { - pPmfCfg->Desired_MFPC = FALSE; - pPmfCfg->MFPC = FALSE; - pPmfCfg->MFPR = FALSE; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: Desired MFPC=%d\n", __func__, - pPmfCfg->Desired_MFPC)); - - if ((IS_AKM_WPA2_Entry(wdev) || IS_AKM_WPA2PSK_Entry(wdev) -#ifdef APCLI_SAE_SUPPORT - || IS_AKM_WPA3PSK_Entry(wdev) -#ifdef DPP_SUPPORT - || IS_AKM_DPP_Entry(wdev) -#endif /* DPP_SUPPORT */ -#endif -#ifdef APCLI_OWE_SUPPORT - || IS_AKM_OWE_Entry(wdev) -#endif - ) && - IS_CIPHER_AES_Entry(wdev)) { - pPmfCfg->PMFSHA256 = pPmfCfg->Desired_PMFSHA256; - - if (pPmfCfg->Desired_MFPC) { - pPmfCfg->MFPC = TRUE; - pPmfCfg->MFPR = pPmfCfg->Desired_MFPR; - - if (pPmfCfg->MFPR) - pPmfCfg->PMFSHA256 = TRUE; - } - } else if (pPmfCfg->Desired_MFPC) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: Security is not WPA2/WPA2PSK/WPA3PSK AES\n", - __func__)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: MFPC=%d, MFPR=%d, SHA256=%d\n", __func__, - pPmfCfg->MFPC, pPmfCfg->MFPR, pPmfCfg->PMFSHA256)); - return TRUE; -} - -/* chane the cmd depend on security mode first, and update to run time flag*/ -INT Set_ApCliPMFMFPR_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; - PMF_CFG *pPmfCfg = NULL; - struct wifi_dev *wdev = NULL; - - if (strlen(arg) == 0) - return FALSE; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - pPmfCfg = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev.SecConfig.PmfCfg; - wdev = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev; - - if (!pPmfCfg || !wdev) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: pPmfCfg=%p, wdev=%p\n", __func__, pPmfCfg, - wdev)); - return FALSE; - } - - if (os_str_tol(arg, 0, 10)) - pPmfCfg->Desired_MFPR = TRUE; - else { - pPmfCfg->Desired_MFPR = FALSE; - /* only close the MFPR */ - pPmfCfg->MFPR = FALSE; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: Desired MFPR=%d\n", __func__, - pPmfCfg->Desired_MFPR)); - - if ((IS_AKM_WPA2_Entry(wdev) || IS_AKM_WPA2PSK_Entry(wdev) -#ifdef APCLI_SAE_SUPPORT - || IS_AKM_WPA3PSK_Entry(wdev) -#endif -#ifdef APCLI_OWE_SUPPORT - || IS_AKM_OWE_Entry(wdev) -#endif - ) && - IS_CIPHER_AES_Entry(wdev)) { - pPmfCfg->PMFSHA256 = pPmfCfg->Desired_PMFSHA256; - - if (pPmfCfg->Desired_MFPC) { - pPmfCfg->MFPC = TRUE; - pPmfCfg->MFPR = pPmfCfg->Desired_MFPR; - - if (pPmfCfg->MFPR) - pPmfCfg->PMFSHA256 = TRUE; - } - } else if (pPmfCfg->Desired_MFPC) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: Security is not WPA2/WPA2PSK/WPA3PSK AES\n", - __func__)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: MFPC=%d, MFPR=%d, SHA256=%d\n", __func__, - pPmfCfg->MFPC, pPmfCfg->MFPR, pPmfCfg->PMFSHA256)); - return TRUE; -} - -INT Set_ApCliPMFSHA256_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; - PMF_CFG *pPmfCfg = NULL; - - if (strlen(arg) == 0) - return FALSE; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - pPmfCfg = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev.SecConfig.PmfCfg; - - if (!pPmfCfg) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: pPmfCfg=%p\n", __func__, pPmfCfg)); - return FALSE; - } - - if (os_str_tol(arg, 0, 10)) - pPmfCfg->Desired_PMFSHA256 = TRUE; - else - pPmfCfg->Desired_PMFSHA256 = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF]%s:: Desired PMFSHA256=%d\n", __func__, - pPmfCfg->Desired_PMFSHA256)); - return TRUE; -} -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef APCLI_SAE_SUPPORT -INT set_apcli_sae_group_proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; - UCHAR *pSaeCfgGroup = NULL; - UCHAR group = 0; - - if (strlen(arg) == 0) - return FALSE; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - pSaeCfgGroup = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].sae_cfg_group; - - group = os_str_tol(arg, 0, 10); - - if ((group == 19) || (group == 20)) { - *pSaeCfgGroup = (UCHAR)group; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[SAE]%s:: Set group=%d \n", __func__, group)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[SAE]%s:: group=%d not supported\n", __func__, - group)); - - return FALSE; - } - return TRUE; -} -#endif /*APCLI_SAE_SUPPORT*/ - -#ifdef APCLI_OWE_SUPPORT -INT set_apcli_owe_group_proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; - UCHAR group = 0; - UCHAR *pcurr_group = NULL; - - if (0 == strlen(arg)) - return FALSE; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - pcurr_group = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].curr_owe_group; - - group = os_str_tol(arg, 0, 10); - /*OWE-currently allowing configuration of groups 19(mandatory) and 20(optional) */ - if ((group == 19) || (group == 20)) { - *pcurr_group = (UCHAR)group; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[OWE]%s:: Set group=%d \n", __func__, group)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[OWE]%s:: group=%d not supported\n", __func__, - group)); - - return FALSE; - } - return TRUE; -} -#endif /*APCLI_SAE_SUPPORT*/ - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) -INT set_apcli_del_pmkid_list(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; - UCHAR action = 0; - - if (0 == strlen(arg)) - return FALSE; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - action = os_str_tol(arg, 0, 10); - - /*Delete all pmkid list associated with this ApCli Interface*/ - if (action == 1) { - apcli_delete_pmkid_cache_all(pAd, pObj->ioctl_if); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: Delete PMKID list (%d) \n", __func__, action)); - } - return TRUE; -} -#endif - -VOID apcli_dync_txop_alg(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, UINT tx_tp, - UINT rx_tp) -{ -#define COND3_COOL_DOWN_TIME 240 - - if (!pAd || !wdev) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: pAd or wdev is NULL!\n", __func__)); - } else { - INT i; - BOOLEAN cond[NUM_OF_APCLI_TXOP_COND] = { FALSE }; - UINT16 cond_txop_level[NUM_OF_APCLI_TXOP_COND] = { 0 }; - UINT16 cond_thrd[NUM_OF_APCLI_TXOP_COND] = { 0 }; - UINT16 txop_level = TXOP_0; - UINT16 current_txop_level = TXOP_0; - BOOLEAN apcli_txop_en = FALSE; - APCLI_STRUCT *apcli_entry = NULL; - - cond_txop_level[1] = TXOP_30; - cond_txop_level[2] = TXOP_FE; - cond_txop_level[3] = TXOP_80; - cond_thrd[1] = TP_PEEK_BOUND_THRESHOLD; - cond_thrd[2] = TX_MODE_TP_CHECK; - current_txop_level = - wdev->bss_info_argument.txop_level[PRIO_APCLI_REPEATER]; - apcli_entry = &pAd->ApCfg.ApCliTab[wdev->func_idx]; - - /* if cond_1 is taking effect, adjust the threshold to prevent instability */ - if (current_txop_level == cond_txop_level[1]) { - /* Adjust cond_thrd[1] */ - if (apcli_entry->dync_txop_histogram[1] >= 4) { - UINT32 tolerance_adjust_factor = 10; - UINT32 tolerance_adjust_value = 0; - - tolerance_adjust_value = - TOLERANCE_OF_TP_THRESHOLD + - (apcli_entry->dync_txop_histogram[1] * - tolerance_adjust_factor); - - if (tolerance_adjust_value > 150) - tolerance_adjust_value = 150; - - cond_thrd[1] = TP_PEEK_BOUND_THRESHOLD - - tolerance_adjust_value; - } else - cond_thrd[1] = TP_PEEK_BOUND_THRESHOLD - - TOLERANCE_OF_TP_THRESHOLD; - - /* Check if t.p. has degrade right after apply cond1 */ - if (tx_tp <= (TP_PEEK_BOUND_THRESHOLD - - TOLERANCE_OF_TP_THRESHOLD) && - apcli_entry->dync_txop_histogram[1] < 4) { - /* If t.p. is bad right after cond1, we trigger cond3 to recover old txop */ - cond[3] = TRUE; - } - } else if (current_txop_level == cond_txop_level[2]) { - /* if cond_2 is taking effect, adjust the threshold to prevent instability */ - cond_thrd[2] = - TX_MODE_TP_CHECK - TOLERANCE_OF_TP_THRESHOLD; - } - - if (tx_tp > cond_thrd[1]) - cond[1] = TRUE; - else if (tx_tp > cond_thrd[2] && WMODE_CAP_2G(wdev->PhyMode)) { - /* We don't check "divided by 0" because the "if condition" already do that */ - UINT tx_ratio = (tx_tp * 100) / (tx_tp + rx_tp); - - if (tx_ratio > TX_MODE_RATIO_THRESHOLD) - cond[2] = TRUE; - } - - if (apcli_entry->dync_txop_histogram[3] != 0) { - cond[3] = TRUE; - txop_level = cond_txop_level[3]; - apcli_txop_en = TRUE; - - if (tx_tp < TP_PEEK_BOUND_THRESHOLD) { - /* If cond3 triggered but t.p cannot keep high, we raise the decade rate */ - UINT8 cond3_decade_factor = 0; - UINT32 cond3_accumulate_value = 0; - - cond[4] = TRUE; - cond3_decade_factor = - (1 - << apcli_entry->dync_txop_histogram - [4]); /* exponential decade */ - cond3_accumulate_value = - apcli_entry->dync_txop_histogram[3] + - cond3_decade_factor; - apcli_entry->dync_txop_histogram[3] = - (cond3_accumulate_value > - COND3_COOL_DOWN_TIME) ? - (COND3_COOL_DOWN_TIME) : - cond3_accumulate_value; - } - } else if (cond[1] == TRUE) { - txop_level = cond_txop_level[1]; - apcli_txop_en = TRUE; - } else if (cond[2] == TRUE) { - txop_level = cond_txop_level[2]; - apcli_txop_en = TRUE; - } else { - txop_level = TXOP_0; - apcli_txop_en = FALSE; - } - - if (txop_level != current_txop_level) { - if (apcli_txop_en == TRUE) - enable_tx_burst(pAd, wdev, AC_BE, - PRIO_APCLI_REPEATER, - txop_level); - else - disable_tx_burst(pAd, wdev, AC_BE, - PRIO_APCLI_REPEATER, - txop_level); - } - - /* update histogram */ - for (i = 0; i < NUM_OF_APCLI_TXOP_COND; i++) { - if (cond[i] == TRUE) - apcli_entry->dync_txop_histogram[i]++; - else - apcli_entry->dync_txop_histogram[i] = 0; - } - - /* clear histogram */ - if (apcli_entry->dync_txop_histogram[3] > COND3_COOL_DOWN_TIME) - apcli_entry->dync_txop_histogram[3] = 0; - } -} - -/* -* system layer api for APCLI -*/ -INT apcli_link_up(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - struct _APCLI_STRUCT *apcli = &ad->ApCfg.ApCliTab[wdev->func_idx]; - - if (WDEV_BSS_STATE(wdev) == BSS_INIT) { - apcli->Valid = TRUE; - MSDU_FORBID_CLEAR(wdev, MSDU_FORBID_CONNECTION_NOT_READY); - wdev->PortSecured = WPA_802_1X_PORT_SECURED; - - if (wifi_sys_linkup(wdev, entry) != TRUE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():link up fail!\n", __func__)); - } - } - - return TRUE; -} - -#ifdef ROAMING_ENHANCE_SUPPORT -#ifndef ETH_HDR_LEN -#define ETH_HDR_LEN 14 /* dstMac(6) + srcMac(6) + protoType(2) */ -#endif - -#ifndef VLAN_ETH_HDR_LEN -#define VLAN_ETH_HDR_LEN \ - (ETH_HDR_LEN + 4) /* 4 for h_vlan_TCI and h_vlan_encapsulated_proto */ -#endif - -#ifndef IP_HDR_SRC_OFFSET -#define IP_HDR_SRC_OFFSET 12 /* shift 12 for IP header len. */ -#endif - -BOOLEAN IsApCliLinkUp(IN PRTMP_ADAPTER pAd) -{ - if ((pAd->ApCfg.ApCliInfRunned > 0) -#ifdef CONFIG_WIFI_PKT_FWD - || ((wf_drv_tbl.wf_fwd_needed_hook != NULL) && - (wf_drv_tbl.wf_fwd_needed_hook() == TRUE)) -#endif /* CONFIG_WIFI_PKT_FWD */ - ) - return TRUE; - - return FALSE; -} - -BOOLEAN ApCliDoRoamingRefresh(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PNDIS_PACKET pRxPacket, - IN struct wifi_dev *wdev) -{ - UCHAR *pPktHdr, *pLayerHdr; - UINT16 ProtoType; - - if (!pRxPacket || !wdev) - return FALSE; - - /* Get the upper layer protocol type of this 802.3 pkt */ - pPktHdr = GET_OS_PKT_DATAPTR(pRxPacket); - ProtoType = - OS_NTOHS(get_unaligned((PUINT16)(pPktHdr + (ETH_HDR_LEN - 2)))); - if (IS_VLAN_PACKET(pPktHdr)) - pLayerHdr = (pPktHdr + VLAN_ETH_HDR_LEN); - else - pLayerHdr = (pPktHdr + ETH_HDR_LEN); - - if (ProtoType == ETH_P_ARP) { - pEntry->bRoamingRefreshDone = TRUE; - return TRUE; - } else if (ProtoType == ETH_P_IP) { - UINT32 SrcIP = 0; - PNDIS_PACKET pPacket = NULL; - - NdisMoveMemory(&SrcIP, (pLayerHdr + IP_HDR_SRC_OFFSET), 4); - if (SrcIP != 0) { - pPacket = (PNDIS_PACKET)arp_create( - ARPOP_REQUEST, ETH_P_ARP, SrcIP, wdev->if_dev, - SrcIP, BROADCAST_ADDR, pEntry->Addr, - BROADCAST_ADDR); - if (pPacket != NULL) { -#ifdef CONFIG_WIFI_PKT_FWD - set_wf_fwd_cb(pAd, pPacket, wdev); -#endif /* CONFIG_WIFI_PKT_FWD */ - RtmpOsPktProtocolAssign(pPacket); - RtmpOsPktRcvHandle(pPacket); - pEntry->bRoamingRefreshDone = TRUE; - return TRUE; - } - } - } - - return FALSE; -} -#endif /* ROAMING_ENHANCE_SUPPORT */ - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) -INT apcli_add_pmkid_cache(IN PRTMP_ADAPTER pAd, IN UCHAR *paddr, - IN UCHAR *pmkid, IN UCHAR *pmk, IN UINT8 pmk_len, - IN UINT8 if_index, IN UINT8 cli_idx) -{ - PAPCLI_STRUCT papcli_entry = NULL; -#ifdef MAC_REPEATER_SUPPORT - PREPEATER_CLIENT_ENTRY preptcli_entry = NULL; -#endif - INT cached_idx; - PBSSID_INFO psaved_pmk = NULL; - PUINT psaved_pmk_num = NULL; - UCHAR update_pmkid = FALSE; - VOID *psaved_pmk_lock = NULL; - -#ifdef MAC_REPEATER_SUPPORT - if (cli_idx != 0xff) { - preptcli_entry = &pAd->ApCfg.pRepeaterCliPool[cli_idx]; - papcli_entry = &pAd->ApCfg.ApCliTab[if_index]; - psaved_pmk = (PBSSID_INFO)&preptcli_entry->SavedPMK[0]; - psaved_pmk_num = &preptcli_entry->SavedPMKNum; - psaved_pmk_lock = (VOID *)&preptcli_entry->SavedPMK_lock; - } else -#endif - { - papcli_entry = &pAd->ApCfg.ApCliTab[if_index]; - psaved_pmk = (PBSSID_INFO)&papcli_entry->SavedPMK[0]; - psaved_pmk_num = &papcli_entry->SavedPMKNum; - psaved_pmk_lock = (VOID *)&papcli_entry->SavedPMK_lock; - } - - cached_idx = apcli_search_pmkid_cache(pAd, paddr, if_index, cli_idx); - - if (psaved_pmk_lock) - NdisAcquireSpinLock(psaved_pmk_lock); - - if (cached_idx != INVALID_PMKID_IDX) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("%s :PMKID found, %d\n", __func__, cached_idx)); - /* Update the values here also, may have been updated - * No meaning of deletion and then insertion. - */ - update_pmkid = TRUE; - } else { - /* Find free cache entry */ - for (cached_idx = 0; cached_idx < PMKID_NO; cached_idx++) { - if (psaved_pmk[cached_idx].Valid == FALSE) - break; - } - - if (cached_idx < PMKID_NO) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("Free Cache entry found,cached_idx %d\n", - cached_idx)); - *psaved_pmk_num = *psaved_pmk_num + 1; - } else { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("cache full, overwrite cached_idx 0\n")); - - cached_idx = 0; - } - update_pmkid = TRUE; - } - - if (update_pmkid == TRUE) { - psaved_pmk[cached_idx].Valid = TRUE; - COPY_MAC_ADDR(&psaved_pmk[cached_idx].BSSID, paddr); - NdisMoveMemory(&psaved_pmk[cached_idx].PMKID, pmkid, LEN_PMKID); - NdisMoveMemory(&psaved_pmk[cached_idx].PMK, pmk, pmk_len); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): add %02x:%02x:%02x:%02x:%02x:%02x cache(%d)\n", - __func__, PRINT_MAC(paddr), cached_idx)); - } - - if (psaved_pmk_lock) - NdisReleaseSpinLock(psaved_pmk_lock); - - return cached_idx; -} - -INT apcli_search_pmkid_cache(IN PRTMP_ADAPTER pAd, IN UCHAR *paddr, - IN UCHAR if_index, IN UCHAR cli_idx) -{ - INT i = 0; - PBSSID_INFO psaved_pmk = NULL; - PAPCLI_STRUCT papcli_entry = NULL; -#ifdef MAC_REPEATER_SUPPORT - PREPEATER_CLIENT_ENTRY preptcli_entry = NULL; -#endif - VOID *psaved_pmk_lock = NULL; - -#ifdef MAC_REPEATER_SUPPORT - if (cli_idx != 0xff) { - preptcli_entry = &pAd->ApCfg.pRepeaterCliPool[cli_idx]; - papcli_entry = &pAd->ApCfg.ApCliTab[if_index]; - psaved_pmk = (PBSSID_INFO)&preptcli_entry->SavedPMK[0]; - psaved_pmk_lock = (VOID *)&preptcli_entry->SavedPMK_lock; - } else -#endif - { - papcli_entry = &pAd->ApCfg.ApCliTab[if_index]; - psaved_pmk = (PBSSID_INFO)&papcli_entry->SavedPMK[0]; - psaved_pmk_lock = (VOID *)&papcli_entry->SavedPMK_lock; - } - - if (psaved_pmk_lock) - NdisAcquireSpinLock(psaved_pmk_lock); - - for (i = 0; i < PMKID_NO; i++) { - if ((psaved_pmk[i].Valid == TRUE) && - MAC_ADDR_EQUAL(&psaved_pmk[i].BSSID, paddr)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():%02x:%02x:%02x:%02x:%02x:%02x cache(%d)\n", - __func__, PRINT_MAC(paddr), i)); - break; - } - } - - if (psaved_pmk_lock) - NdisReleaseSpinLock(psaved_pmk_lock); - - if (i >= PMKID_NO) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): not found\n", __func__)); - return INVALID_PMKID_IDX; - } - - return i; -} - -VOID apcli_delete_pmkid_cache(IN PRTMP_ADAPTER pAd, IN UCHAR *paddr, - IN UCHAR if_index, IN UCHAR cli_idx) -{ - INT cached_idx; - PBSSID_INFO psaved_pmk = NULL; - PAPCLI_STRUCT papcli_entry = NULL; -#ifdef MAC_REPEATER_SUPPORT - PREPEATER_CLIENT_ENTRY preptcli_entry = NULL; -#endif - VOID *psaved_pmk_lock = NULL; - PUINT psaved_pmk_num = NULL; - -#ifdef MAC_REPEATER_SUPPORT - if (cli_idx != 0xff) { - preptcli_entry = &pAd->ApCfg.pRepeaterCliPool[cli_idx]; - psaved_pmk = (PBSSID_INFO)&preptcli_entry->SavedPMK[0]; - psaved_pmk_num = &preptcli_entry->SavedPMKNum; - psaved_pmk_lock = (VOID *)&preptcli_entry->SavedPMK_lock; - } else -#endif - { - papcli_entry = &pAd->ApCfg.ApCliTab[if_index]; - psaved_pmk = (PBSSID_INFO)&papcli_entry->SavedPMK[0]; - psaved_pmk_num = &papcli_entry->SavedPMKNum; - psaved_pmk_lock = (VOID *)&papcli_entry->SavedPMK_lock; - } - - cached_idx = apcli_search_pmkid_cache(pAd, paddr, if_index, cli_idx); - - if (cached_idx != INVALID_PMKID_IDX) { - if (psaved_pmk_lock) - NdisAcquireSpinLock(psaved_pmk_lock); - - if (psaved_pmk[cached_idx].Valid == TRUE) { - psaved_pmk[cached_idx].Valid = FALSE; - - if (*psaved_pmk_num) - *psaved_pmk_num = *psaved_pmk_num - 1; - } - - if (psaved_pmk_lock) - NdisReleaseSpinLock(psaved_pmk_lock); - } -} - -VOID apcli_delete_pmkid_cache_all(IN PRTMP_ADAPTER pAd, IN UCHAR if_index) -{ - INT cli_idx = 0; - INT cached_idx; - PBSSID_INFO psaved_pmk = NULL; - PAPCLI_STRUCT papcli_entry = NULL; -#ifdef MAC_REPEATER_SUPPORT - PREPEATER_CLIENT_ENTRY preptcli_entry = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); -#endif -#ifdef APCLI_SAE_SUPPORT - SAE_INSTANCE *pSaeIns = NULL; - SAE_CFG *pSaeCfg = NULL; - UINT32 i; - UINT32 ins_cnt = 0; -#endif - - VOID *psaved_pmk_lock = NULL; - PUINT psaved_pmk_num = NULL; - - papcli_entry = &pAd->ApCfg.ApCliTab[if_index]; - psaved_pmk = (PBSSID_INFO)&papcli_entry->SavedPMK[0]; - psaved_pmk_num = &papcli_entry->SavedPMKNum; - psaved_pmk_lock = (VOID *)&papcli_entry->SavedPMK_lock; - -#ifdef APCLI_SAE_SUPPORT - pSaeCfg = &pAd->SaeCfg; - /*Delete all SAE instances for this ApCli Interface*/ - NdisAcquireSpinLock(&pSaeCfg->sae_cfg_lock); - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - if (pSaeCfg->sae_ins[i].valid == FALSE) - continue; - - if (RTMPEqualMemory(pSaeCfg->sae_ins[i].own_mac, - papcli_entry->wdev.if_addr, MAC_ADDR_LEN)) { - pSaeIns = &pSaeCfg->sae_ins[i]; - if (pSaeIns != NULL && (pSaeIns->valid == TRUE)) { - NdisReleaseSpinLock(&pSaeCfg->sae_cfg_lock); - delete_sae_instance(pSaeIns); - NdisAcquireSpinLock(&pSaeCfg->sae_cfg_lock); - } - } - - ins_cnt++; - - if (ins_cnt == pSaeCfg->total_ins) - break; - } - - NdisReleaseSpinLock(&pSaeCfg->sae_cfg_lock); -#endif - - /*Delete ApCli PMKID list*/ - for (cached_idx = 0; cached_idx < PMKID_NO; cached_idx++) { - if (psaved_pmk_lock) - NdisAcquireSpinLock(psaved_pmk_lock); - - if (psaved_pmk[cached_idx].Valid == TRUE) { - psaved_pmk[cached_idx].Valid = FALSE; - - if (*psaved_pmk_num) - *psaved_pmk_num = *psaved_pmk_num - 1; - } - - if (psaved_pmk_lock) - NdisReleaseSpinLock(psaved_pmk_lock); - } - /*Delete PMKID list for MacRepeater linked with ApCli */ - -#ifdef MAC_REPEATER_SUPPORT - if (pAd->ApCfg.bMACRepeaterEn == TRUE) { - for (cli_idx = 0; cli_idx < GET_MAX_REPEATER_ENTRY_NUM(cap); - cli_idx++) { - preptcli_entry = &pAd->ApCfg.pRepeaterCliPool[cli_idx]; - - if (preptcli_entry && - (preptcli_entry->CliValid == TRUE) && - (preptcli_entry->MatchApCliIdx == - papcli_entry->wdev.func_idx)) { -#ifdef APCLI_SAE_SUPPORT - /*Delete all SAE instances for this Rept entry*/ - NdisAcquireSpinLock(&pSaeCfg->sae_cfg_lock); - ins_cnt = 0; - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - if (pSaeCfg->sae_ins[i].valid == FALSE) - continue; - - if (RTMPEqualMemory( - pSaeCfg->sae_ins[i].own_mac, - preptcli_entry - ->CurrentAddress, - MAC_ADDR_LEN)) { - pSaeIns = &pSaeCfg->sae_ins[i]; - if (pSaeIns != NULL && - (pSaeIns->valid == TRUE)) { - NdisReleaseSpinLock( - &pSaeCfg->sae_cfg_lock); - delete_sae_instance( - pSaeIns); - NdisAcquireSpinLock( - &pSaeCfg->sae_cfg_lock); - } - } - - ins_cnt++; - - if (ins_cnt == pSaeCfg->total_ins) - break; - } - - NdisReleaseSpinLock(&pSaeCfg->sae_cfg_lock); -#endif - psaved_pmk = (PBSSID_INFO)&preptcli_entry - ->SavedPMK[0]; - psaved_pmk_num = &preptcli_entry->SavedPMKNum; - psaved_pmk_lock = - (VOID *)&preptcli_entry->SavedPMK_lock; - - for (cached_idx = 0; cached_idx < PMKID_NO; - cached_idx++) { - if (psaved_pmk_lock) - NdisAcquireSpinLock( - psaved_pmk_lock); - - if (psaved_pmk[cached_idx].Valid == - TRUE) { - psaved_pmk[cached_idx].Valid = - FALSE; - - if (*psaved_pmk_num) - *psaved_pmk_num = - *psaved_pmk_num - - 1; - } - - if (psaved_pmk_lock) - NdisReleaseSpinLock( - psaved_pmk_lock); - } - } - } - } -#endif -} -#endif - -#ifdef APCLI_OWE_SUPPORT -VOID apcli_reset_owe_parameters(IN PRTMP_ADAPTER pAd, IN UCHAR if_index) -{ - PAPCLI_STRUCT papcli_entry = NULL; - - papcli_entry = &pAd->ApCfg.ApCliTab[if_index]; - - /*OWE Trans reset the OWE trans bssid and ssid*/ - - if (papcli_entry && IS_AKM_OWE(papcli_entry->wdev.SecConfig.AKMMap) && - (papcli_entry->owe_trans_ssid_len > 0)) { - NdisZeroMemory(papcli_entry->owe_trans_bssid, MAC_ADDR_LEN); - NdisZeroMemory(papcli_entry->owe_trans_ssid, MAX_LEN_OF_SSID); - papcli_entry->owe_trans_ssid_len = 0; - - NdisZeroMemory(papcli_entry->owe_trans_open_bssid, - MAC_ADDR_LEN); - NdisZeroMemory(papcli_entry->owe_trans_open_ssid, - MAX_LEN_OF_SSID); - papcli_entry->owe_trans_open_ssid_len = 0; - } -} - -#endif - -#endif /* APCLI_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_apcli_inf.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_apcli_inf.c deleted file mode 100644 index b5060c50bc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_apcli_inf.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_apcli.c - - Abstract: - Support AP-Client function. - - Note: - 1. Call RT28xx_ApCli_Init() in init function and - call RT28xx_ApCli_Remove() in close function - - 2. MAC of ApCli-interface is initialized in RT28xx_ApCli_Init() - - 3. ApCli index (0) of different rx packet is got in - - 4. ApCli index (0) of different tx packet is assigned in - - 5. ApCli index (0) of different interface is got in tx_pkt_handle() by using - - 6. ApCli index (0) of IOCTL command is put in pAd->OS_Cookie->ioctl_if - - 8. The number of ApCli only can be 1 - - 9. apcli convert engine subroutines, we should just take care data packet. - Revision History: - Who When What - -------------- ---------- ---------------------------------------------- - Shiang, Fonchi 02-13-2007 created -*/ -#define RTMP_MODULE_OS - -#ifdef APCLI_SUPPORT - -/*#include "rt_config.h" */ -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" - -/* --------------------------------- Public -------------------------------- */ -NET_DEV_STATS *RT28xx_get_ether_stats(PNET_DEV net_dev); -/* -======================================================================== -Routine Description: - Init AP-Client function. - -Arguments: - pAd points to our adapter - main_dev_p points to the main BSS network interface - -Return Value: - None - -Note: - 1. Only create and initialize virtual network interfaces. - 2. No main network interface here. -======================================================================== -*/ -VOID RT28xx_ApCli_Init(VOID *pAd, PNET_DEV main_dev_p) -{ - RTMP_OS_NETDEV_OP_HOOK netDevOpHook; - /* init operation functions */ - NdisZeroMemory(&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); - netDevOpHook.open = apcli_virtual_if_open; - netDevOpHook.stop = apcli_virtual_if_close; - netDevOpHook.xmit = rt28xx_send_packets; - netDevOpHook.ioctl = rt28xx_ioctl; - netDevOpHook.get_stats = RT28xx_get_ether_stats; - RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_INIT, 0, - &netDevOpHook, 0); -} - -/* -======================================================================== -Routine Description: - Open a virtual network interface. - -Arguments: - dev_p which WLAN network interface - -Return Value: - 0: open successfully - otherwise: open fail - -Note: -======================================================================== -*/ -INT apcli_virtual_if_open(PNET_DEV pDev) -{ - VOID *pAd; - - pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); - ASSERT(pAd); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_OFF, - ("%s: ===> %s\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev), __func__)); - - if (VIRTUAL_IF_INIT(pAd, pDev) != 0) - return -1; - - if (VIRTUAL_IF_UP(pAd, pDev) != 0) - return -1; - - /* increase MODULE use count */ - RT_MOD_INC_USE_COUNT(); - RT_MOD_HNAT_REG(pDev); - RTMP_OS_NETDEV_START_QUEUE(pDev); - -#ifdef MTFWD - RTMP_OS_NETDEV_CARRIER_OFF(pDev); -#endif - return 0; -} - -/* -======================================================================== -Routine Description: - Close a virtual network interface. - -Arguments: - dev_p which WLAN network interface - -Return Value: - 0: close successfully - otherwise: close fail - -Note: -======================================================================== -*/ -INT apcli_virtual_if_close(PNET_DEV pDev) -{ - VOID *pAd; - - pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); - ASSERT(pAd); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_OFF, - ("%s: ===> %s\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev), __func__)); - - VIRTUAL_IF_DOWN(pAd, pDev); - - VIRTUAL_IF_DEINIT(pAd, pDev); - - RT_MOD_HNAT_DEREG(pDev); - RT_MOD_DEC_USE_COUNT(); - return 0; -} - -/* -======================================================================== -Routine Description: - Remove ApCli-BSS network interface. - -Arguments: - pAd points to our adapter - -Return Value: - None - -Note: -======================================================================== -*/ -VOID RT28xx_ApCli_Remove(VOID *pAd) -{ - RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_REMOVE, 0, NULL, 0); -} - -#endif /* APCLI_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_assoc.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_assoc.c deleted file mode 100644 index 5de3b7ebb4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_assoc.c +++ /dev/null @@ -1,3674 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - assoc.c - - Abstract: - Handle association related requests either from WSTA or from local MLME - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - John Chang 08-04-2003 created for 11g soft-AP - */ - -#include "rt_config.h" - -#ifdef VENDOR_FEATURE7_SUPPORT -#include "arris_wps_gpio_handler.h" -#endif -extern UCHAR CISCO_OUI[]; -extern UCHAR WPA_OUI[]; -extern UCHAR RSN_OUI[]; -extern UCHAR WME_INFO_ELEM[]; -extern UCHAR WME_PARM_ELEM[]; -extern UCHAR RALINK_OUI[]; -extern UCHAR BROADCOM_OUI[]; - -#ifdef IGMP_TVM_SUPPORT -extern UCHAR IGMP_TVM_OUI[]; -#endif /* IGMP_TVM_SUPPORT */ - -static USHORT update_associated_mac_entry(IN RTMP_ADAPTER *pAd, - IN MAC_TABLE_ENTRY *pEntry, - IN IE_LISTS *ie_list, - IN UCHAR MaxSupportedRate, - IN BOOLEAN isReassoc) -{ - BSS_STRUCT *mbss; - struct wifi_dev *wdev; -#ifdef TXBF_SUPPORT - BOOLEAN supportsETxBF = FALSE; -#endif /* TXBF_SUPPORT // */ - STA_TR_ENTRY *tr_entry; - UCHAR PhyMode; - UCHAR Channel; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - BOOLEAN need_clr_set_wtbl = FALSE; - - ASSERT((pEntry->func_tb_idx < pAd->ApCfg.BssidNum)); - mbss = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; - wdev = &mbss->wdev; - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - PhyMode = wdev->PhyMode; - Channel = wdev->channel; - - /* use this to decide reassociation rsp need to clear set wtbl or not */ - if (pEntry->Sst == SST_ASSOC && isReassoc == TRUE -#ifdef DOT11R_FT_SUPPORT - && (IS_FT_STA(pEntry)) -#endif /* DOT11R_FT_SUPPORT */ - ) - need_clr_set_wtbl = TRUE; - - /* Update auth, wep, legacy transmit rate setting . */ - pEntry->Sst = SST_ASSOC; - pEntry->MaxSupportedRate = min(wdev->rate.MaxTxRate, MaxSupportedRate); - MacTableSetEntryPhyCfg(pAd, pEntry); - pEntry->CapabilityInfo = ie_list->CapabilityInfo; - - if (IS_AKM_PSK_Entry(pEntry)) { - pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP; - pEntry->SecConfig.Handshake.WpaState = AS_INITPSK; - } -#ifdef DOT1X_SUPPORT - else if (IS_AKM_1X_Entry(pEntry) || IS_IEEE8021X_Entry(wdev)) { - pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP; - pEntry->SecConfig.Handshake.WpaState = AS_AUTHENTICATION; - } - -#endif /* DOT1X_SUPPORT */ - /* Ralink proprietary Piggyback and Aggregation support for legacy RT61 chip */ - MacTableSetEntryRaCap(pAd, pEntry, &ie_list->vendor_ie); - - /* In WPA or 802.1x mode, the port is not secured, otherwise is secued. */ - if (IS_AKM_WPA_CAPABILITY_Entry(pEntry) -#ifdef DOT1X_SUPPORT - || IS_IEEE8021X_Entry(wdev) -#endif /* DOT1X_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT - || wdev->IsCFG1xWdev -#endif /* RT_CFG80211_SUPPORT */ -#if defined(WSC_INCLUDED) || defined(RT_CFG80211_SUPPORT) - || (pEntry->bWscCapable && IS_AKM_WPA_CAPABILITY_Entry(wdev)) -#endif /* WSC_INCLUDED */ - ) - tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; - else - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; - -#ifdef SOFT_ENCRYPT - /* There are some situation to need to encryption by software - 1. The Client support PMF. It shall ony support AES cipher. - 2. The Client support WAPI. - If use RT3883 or later, HW can handle the above. - */ -#ifdef DOT11W_PMF_SUPPORT - - if ((cap->FlgPMFEncrtptMode == PMF_ENCRYPT_MODE_0) && - (pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE)) - CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT); - -#endif /* DOT11W_PMF_SUPPORT */ -#endif /* SOFT_ENCRYPT */ - - if (wdev->bWmmCapable && ie_list->bWmmCapable) - CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); - else - CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); - -#ifdef DOT11_N_SUPPORT - - /* - WFA recommend to restrict the encryption type in 11n-HT mode. - So, the WEP and TKIP are not allowed in HT rate. - */ - if (pAd->CommonCfg.HT_DisallowTKIP && - IS_INVALID_HT_SECURITY(pEntry->SecConfig.PairwiseCipher)) { - /* Force to None-HT mode due to WiFi 11n policy */ - ie_list->ht_cap_len = 0; -#ifdef DOT11_VHT_AC - ie_list->vht_cap_len = 0; -#endif /* DOT11_VHT_AC */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Force the STA as Non-HT mode\n", __func__)); - } - -#ifdef CONFIG_HOTSPOT_R2 - - if (ie_list->ExtCapInfo.qosmap) - pEntry->QosMapSupport = 1; - -#endif -#ifdef CONFIG_DOT11V_WNM - - /* #ifdef CONFIG_HOTSPOT_R2 Remove for WNM independance. */ - if (ie_list->ExtCapInfo.BssTransitionManmt) - pEntry->BssTransitionManmtSupport = 1; - - /* #endif CONFIG_HOTSPOT_R2 */ -#endif /* CONFIG_DOT11V_WNM */ - - /* If this Entry supports 802.11n, upgrade to HT rate. */ - if ((ie_list->ht_cap_len != 0) && (wdev->DesiredHtPhyInfo.bHtEnable) && - WMODE_CAP_N(PhyMode)) { - ht_mode_adjust(pAd, pEntry, &ie_list->HTCapability); - -#ifdef DOT11N_DRAFT3 - if (ie_list->ExtCapInfo.BssCoexistMgmtSupport) - pEntry->BSS2040CoexistenceMgmtSupport = 1; -#endif /* DOT11N_DRAFT3 */ - - /* 40Mhz BSS Width Trigger events */ -#ifdef BW_VENDOR10_CUSTOM_FEATURE - /* Soft AP to follow BW of Root AP */ - if ((IS_APCLI_BW_SYNC_FEATURE_ENBL(pAd) == FALSE) && - ie_list->HTCapability.HtCapInfo.Forty_Mhz_Intolerant) { -#else - if (ie_list->HTCapability.HtCapInfo.Forty_Mhz_Intolerant) { -#endif -#ifdef DOT11N_DRAFT3 - UCHAR op_ht_bw = wlan_operate_get_ht_bw(wdev); - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - UCHAR op_ext_cha = wlan_operate_get_ext_cha(wdev); - - pEntry->bForty_Mhz_Intolerant = TRUE; - pAd->MacTab.fAnyStaFortyIntolerant = TRUE; - - if (((cfg_ht_bw == HT_BW_40) && (Channel <= 14)) && - ((pAd->CommonCfg.bBssCoexEnable == TRUE) && - (op_ht_bw != HT_BW_20) && (op_ext_cha != 0))) { - pAd->CommonCfg.LastBSSCoexist2040.field - .BSS20WidthReq = 1; - wlan_operate_set_ht_bw(wdev, HT_BW_20, - EXTCHA_NONE); - pAd->CommonCfg.Bss2040CoexistFlag |= - BSS_2040_COEXIST_INFO_SYNC; - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s, Update Beacon for mbss_idx:%d\n", - __func__, pEntry->func_tb_idx)); - UpdateBeaconHandler(pAd, wdev, - BCN_UPDATE_IE_CHG); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("pEntry set 40MHz Intolerant as 1\n")); -#endif /* DOT11N_DRAFT3 */ - Handle_BSS_Width_Trigger_Events(pAd, Channel); - } - -#ifdef TXBF_SUPPORT -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(PhyMode) && (Channel > 14) && - (ie_list->vht_cap_len)) - supportsETxBF = mt_WrapClientSupportsVhtETxBF( - pAd, &ie_list->vht_cap.vht_cap); - else -#endif /* DOT11_VHT_AC */ - supportsETxBF = mt_WrapClientSupportsETxBF( - pAd, &ie_list->HTCapability.TxBFCap); - -#endif /* TXBF_SUPPORT */ - /* find max fixed rate */ - pEntry->MaxHTPhyMode.field.MCS = - get_ht_max_mcs(pAd, &wdev->DesiredHtPhyInfo.MCSSet[0], - &ie_list->HTCapability.MCSSet[0]); - - if (wdev->DesiredTransmitSetting.field.MCS != MCS_AUTO) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("@@@ IF-ra%d DesiredTransmitSetting.field.MCS = %d\n", - pEntry->func_tb_idx, - wdev->DesiredTransmitSetting.field.MCS)); - set_ht_fixed_mcs(pAd, pEntry, - wdev->DesiredTransmitSetting.field.MCS, - wdev->HTPhyMode.field.MCS); - } - - set_sta_ht_cap(pAd, pEntry, &ie_list->HTCapability); - /* Record the received capability from association request */ - NdisMoveMemory(&pEntry->HTCapability, &ie_list->HTCapability, - sizeof(HT_CAPABILITY_IE)); -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(PhyMode) && (Channel > 14) && - ie_list->vht_cap_len) { - vht_mode_adjust(pAd, pEntry, &ie_list->vht_cap, - (ie_list->vht_op_len == 0) ? - NULL : - &ie_list->vht_op); - dot11_vht_mcs_to_internal_mcs(pAd, wdev, - &ie_list->vht_cap, - &pEntry->MaxHTPhyMode); - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): Peer's PhyCap=>Mode:%s, BW:%s, NSS:%d, MCS:%d\n", - __func__, - get_phymode_str( - pEntry->MaxHTPhyMode.field.MODE), - get_bw_str(pEntry->MaxHTPhyMode.field.BW), - ((pEntry->MaxHTPhyMode.field.MCS & - (0x3 << 4)) >> - 4) + 1, - (pEntry->MaxHTPhyMode.field.MCS & 0xf))); - - set_vht_cap(pAd, pEntry, &ie_list->vht_cap); - NdisMoveMemory(&pEntry->vht_cap_ie, &ie_list->vht_cap, - sizeof(VHT_CAP_IE)); - } - - if (ie_list->operating_mode_len == sizeof(OPERATING_MODE) && - ie_list->operating_mode.rx_nss_type == 0) { - pEntry->operating_mode = ie_list->operating_mode; - pEntry->force_op_mode = TRUE; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Peer's OperatingMode=>RxNssType: %d, RxNss: %d, ChBW: %d\n", - __func__, pEntry->operating_mode.rx_nss_type, - pEntry->operating_mode.rx_nss, - pEntry->operating_mode.ch_width)); - } else - pEntry->force_op_mode = FALSE; - -#endif /* DOT11_VHT_AC */ - } else { -#ifdef CONFIG_HOTSPOT_R2 - - if (ie_list->ExtCapInfo.qosmap) - pEntry->QosMapSupport = 1; - -#endif - pAd->MacTab.fAnyStationIsLegacy = TRUE; - NdisZeroMemory(&pEntry->HTCapability, sizeof(HT_CAPABILITY_IE)); - pEntry->SupportHTMCS = 0; - pEntry->SupportRateMode &= (~SUPPORT_HT_MODE); -#ifdef DOT11_VHT_AC - /* TODO: shiang-usw, it's ugly and need to revise it */ - NdisZeroMemory(&pEntry->vht_cap_ie, sizeof(VHT_CAP_IE)); - pEntry->SupportVHTMCS1SS = 0; - pEntry->SupportVHTMCS2SS = 0; - pEntry->SupportVHTMCS3SS = 0; - pEntry->SupportVHTMCS4SS = 0; - pEntry->SupportRateMode &= (~SUPPORT_VHT_MODE); -#endif /* DOT11_VHT_AC */ - } - -#endif /* DOT11_N_SUPPORT */ - pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; - pEntry->CurrTxRate = pEntry->MaxSupportedRate; - -#ifdef MFB_SUPPORT - pEntry->lastLegalMfb = 0; - pEntry->isMfbChanged = FALSE; - pEntry->fLastChangeAccordingMfb = FALSE; - pEntry->toTxMrq = TRUE; - pEntry->msiToTx = 0; /*has to increment whenever a mrq is sent */ - pEntry->mrqCnt = 0; - pEntry->pendingMfsi = 0; - pEntry->toTxMfb = FALSE; - pEntry->mfbToTx = 0; - pEntry->mfb0 = 0; - pEntry->mfb1 = 0; -#endif /* MFB_SUPPORT */ - pEntry->freqOffsetValid = FALSE; -#ifdef TXBF_SUPPORT - - if (cap->FlgHwTxBfCap) - chip_tx_bf_init(pAd, pEntry, ie_list, supportsETxBF); - -#endif /* TXBF_SUPPORT // */ -#ifdef MT_MAC - - if (cap->hif_type == HIF_MT) { - if (wdev->bAutoTxRateSwitch == TRUE) - pEntry->bAutoTxRateSwitch = TRUE; - else { - pEntry->HTPhyMode.field.MCS = wdev->HTPhyMode.field.MCS; - pEntry->bAutoTxRateSwitch = FALSE; -#ifdef WFA_VHT_PF - - if (WMODE_CAP_AC(PhyMode)) { - pEntry->HTPhyMode.field.MCS = - wdev->DesiredTransmitSetting.field.MCS + - ((wlan_operate_get_tx_stream(wdev) - 1) - << 4); - } - -#endif /* WFA_VHT_PF */ - - if (pEntry->HTPhyMode.field.MODE == MODE_VHT) { - pEntry->HTPhyMode.field.MCS = - wdev->DesiredTransmitSetting.field.MCS + - ((wlan_operate_get_tx_stream(wdev) - 1) - << 4); - } - - /* If the legacy mode is set, overwrite the transmit setting of this entry. */ - RTMPUpdateLegacyTxSetting( - (UCHAR)wdev->DesiredTransmitSetting.field - .FixedTxMode, - pEntry); - } - -#if !defined(MT7615) && !defined(MT7637) && !defined(MT7622) && \ - !defined(P18) && !defined(MT7663) - - if (!IS_MT7615(pAd) && !IS_MT7637(pAd) && !IS_MT7622(pAd) && - !IS_P18(pAd) && !IS_MT7663(pAd)) - RAInit(pAd, pEntry); - -#endif /* !defined(MT7615) && !defined(MT7637) && !defined(MT7622) && !defined(P18) && !defined(MT7663) */ - } - -#endif /* MT_MAC */ - - if (IS_NO_SECURITY(&pEntry->SecConfig) || - IS_CIPHER_WEP(pEntry->SecConfig.PairwiseCipher)) - ApLogEvent(pAd, pEntry->Addr, EVENT_ASSOCIATED); - - if ((pEntry->MaxHTPhyMode.field.MODE == MODE_OFDM) || - (pEntry->MaxHTPhyMode.field.MODE == MODE_CCK)) - pAd->MacTab.fAnyStationIsLegacy = TRUE; - - NdisAcquireSpinLock(&pAd->MacTabLock); - nonerp_sta_num(pEntry, PEER_JOIN); - NdisReleaseSpinLock(&pAd->MacTabLock); - - ApUpdateCapabilityAndErpIe(pAd, mbss); -#ifdef DOT11_N_SUPPORT - APUpdateOperationMode(pAd, wdev); -#endif /* DOT11_N_SUPPORT */ -#ifdef HOSTAPD_SUPPORT - - if ((wdev->Hostapd == Hostapd_EXT) && - ((wdev->AuthMode >= Ndis802_11AuthModeWPA) || wdev->IEEE8021X)) { - RtmpOSWrielessEventSendExt( - pAd->net_dev, RT_WLAN_EVENT_EXPIRED, -1, pEntry->Addr, - NULL, 0, - ((pEntry->CapabilityInfo & 0x0010) == 0 ? 0xFFFD : - 0xFFFC)); - } - -#endif /*HOSTAPD_SUPPORT*/ - return MLME_SUCCESS; -} - -/* - ========================================================================== - Description: - assign a new AID to the newly associated/re-associated STA and - decide its MaxSupportedRate and CurrTxRate. Both rates should not - exceed AP's capapbility - Return: - MLME_SUCCESS - association successfully built - others - association failed due to resource issue - ========================================================================== - */ -#ifndef HOSTAPD_11R_SUPPORT -static -#endif /* HOSTAPD_11R_SUPPORT */ - USHORT - APBuildAssociation(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN IE_LISTS *ie_list, - IN UCHAR MaxSupportedRateIn500Kbps, OUT USHORT *pAid, - IN BOOLEAN isReassoc) -{ - USHORT StatusCode = MLME_SUCCESS; - UCHAR MaxSupportedRate = RATE_11; - struct wifi_dev *wdev; -#ifdef WSC_AP_SUPPORT - WSC_CTRL *wsc_ctrl; -#endif /* WSC_AP_SUPPORT */ - STA_TR_ENTRY *tr_entry; -#ifdef CONFIG_OWE_SUPPORT - PUINT8 pPmkid = NULL; - UINT8 pmkid_count = 0; -#endif /*CONFIG_OWE_SUPPORT*/ -#ifdef RATE_PRIOR_SUPPORT - PBLACK_STA pBlackSta = NULL; -#endif /*RATE_PRIOR_SUPPORT*/ - - if (!pEntry) - return MLME_UNSPECIFY_FAIL; - - wdev = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev; - MaxSupportedRate = dot11_2_ra_rate(MaxSupportedRateIn500Kbps); - - if ((WMODE_EQUAL(wdev->PhyMode, WMODE_G) -#ifdef DOT11_N_SUPPORT - || WMODE_EQUAL(wdev->PhyMode, (WMODE_G | WMODE_GN)) -#endif /* DOT11_N_SUPPORT */ - ) && - (MaxSupportedRate < RATE_FIRST_OFDM_RATE)) - return MLME_ASSOC_REJ_DATA_RATE; - -#ifdef DOT11_N_SUPPORT - - /* 11n only */ - if (WMODE_HT_ONLY(wdev->PhyMode) && (ie_list->ht_cap_len == 0)) - return MLME_ASSOC_REJ_DATA_RATE; - -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(wdev->PhyMode) && (wdev->channel > 14) && - (ie_list->vht_cap_len == 0) && (pAd->CommonCfg.bNonVhtDisallow)) - return MLME_ASSOC_REJ_DATA_RATE; - -#endif /* DOT11_VHT_AC */ - -#ifdef RATE_PRIOR_SUPPORT - if (pAd->LowRateCtrl.RatePrior) { - if (wdev->channel < 14 && ie_list->ht_cap_len == 0) - return MLME_UNSPECIFY_FAIL; -#ifdef DOT11_VHT_AC - if (wdev->channel > 14 && ie_list->vht_cap_len == 0) - return MLME_UNSPECIFY_FAIL; -#endif /* DOT11_VHT_AC */ - RTMP_SEM_LOCK(&pAd->LowRateCtrl.BlackListLock); - DlListForEach(pBlackSta, &pAd->LowRateCtrl.BlackList, BLACK_STA, - List) - { - if (NdisCmpMemory(pBlackSta->Addr, pEntry->Addr, - MAC_ADDR_LEN) == 0) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Reject blk sta: %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pBlackSta->Addr))); - RTMP_SEM_UNLOCK( - &pAd->LowRateCtrl.BlackListLock); - return MLME_UNSPECIFY_FAIL; - } - } - RTMP_SEM_UNLOCK(&pAd->LowRateCtrl.BlackListLock); - } -#endif /*RATE_PRIOR_SUPPORT*/ - - if ((pEntry->Sst == SST_AUTH) || (pEntry->Sst == SST_ASSOC)) { - /* TODO: - should qualify other parameters, for example - - capablity, supported rates, listen interval, etc., to - decide the Status Code - */ - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - *pAid = pEntry->Aid; - pEntry->NoDataIdleCount = 0; - /* TODO: shiang-usw, remove upper setting becasue we need to migrate to tr_entry! */ - pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0; - pEntry->StaConnectTime = 0; -#ifdef CONFIG_HOTSPOT_R2 - - if (!CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_OSEN_CAPABLE)) -#endif - { -#ifdef WSC_AP_SUPPORT - - if (pEntry->bWscCapable == FALSE) -#endif /* WSC_AP_SUPPORT */ - { - /* check the validity of the received RSNIE */ - StatusCode = - WPAValidateRSNIE(&wdev->SecConfig, - &pEntry->SecConfig, - &ie_list->RSN_IE[0], - ie_list->RSNIE_Len); -#ifdef DOT11R_FT_SUPPORT - if (!IS_FT_STA( - pEntry)) /* IS_FT_RSN_STA should be use at 4-way only due to rnsie is assigned at assoc state */ -#endif - { -#ifdef DOT11_SAE_SUPPORT - INT cacheidx; - - if ((StatusCode == MLME_SUCCESS) && - IS_AKM_WPA3PSK( - pEntry->SecConfig.AKMMap) && - (is_rsne_pmkid_cache_match( - ie_list->RSN_IE, - ie_list->RSNIE_Len, - &pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, - pEntry->Addr, &cacheidx)) && - (cacheidx == INVALID_PMKID_IDX)) - StatusCode = MLME_INVALID_PMKID; -#endif /* DOT11_SAE_SUPPORT */ - if (StatusCode == MLME_SUCCESS) - StatusCode = parse_rsnxe_ie( - &pEntry->SecConfig, - &ie_list->rsnxe_ie[0], - ie_list->rsnxe_ie_len, - TRUE); -#ifdef CONFIG_OWE_SUPPORT - if ((StatusCode == MLME_SUCCESS) && - IS_AKM_OWE( - pEntry->SecConfig.AKMMap)) - StatusCode = owe_pmkid_ecdh_process( - pAd, pEntry, - ie_list->RSN_IE, - ie_list->RSNIE_Len, - &ie_list->ecdh_ie, - ie_list->ecdh_ie.length, - pPmkid, &pmkid_count, - SUBTYPE_ASSOC_REQ); -#endif /*CONFIG_OWE_SUPPORT*/ - } - - if (StatusCode != MLME_SUCCESS) { - /* send wireless event - for RSN IE sanity check fail */ - RTMPSendWirelessEvent( - pAd, - IW_RSNIE_SANITY_FAIL_EVENT_FLAG, - pEntry->Addr, 0, 0); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : invalid status code(%d) !!!\n", - __func__, StatusCode)); - return StatusCode; - } - - if (pEntry->SecConfig.AKMMap == 0x0) { - SET_AKM_OPEN(pEntry->SecConfig.AKMMap); - SET_CIPHER_NONE( - pEntry->SecConfig - .PairwiseCipher); - SET_CIPHER_NONE( - pEntry->SecConfig.GroupCipher); - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s : (AID#%d AKM=0x%x, PairwiseCipher=0x%x)\n", - __func__, pEntry->Aid, - pEntry->SecConfig.AKMMap, - pEntry->SecConfig.PairwiseCipher)); - } - } - - NdisMoveMemory(pEntry->RSN_IE, &ie_list->RSN_IE[0], - ie_list->RSNIE_Len); - pEntry->RSNIE_Len = ie_list->RSNIE_Len; - - if (*pAid == 0) - StatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA; - else if ((pEntry->RSNIE_Len == 0) && - (IS_AKM_WPA_CAPABILITY_Entry(pEntry)) -#ifdef HOSTAPD_SUPPORT - && (wdev->Hostapd == Hostapd_EXT) -#endif /* HOSTAPD_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT - && (wdev->Hostapd == Hostapd_CFG) -#endif /*RT_CFG80211_SUPPORT*/ - ) { -#ifdef WSC_AP_SUPPORT - wsc_ctrl = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.WscControl; - - if (((wsc_ctrl->WscConfMode != WSC_DISABLE) && - pEntry->bWscCapable -#ifdef WSC_V2_SUPPORT - && (wsc_ctrl->WscV2Info.bWpsEnable || - (wsc_ctrl->WscV2Info.bEnableWpsV2 == FALSE)) -#endif /* WSC_V2_SUPPORT */ - ) -#ifdef HOSTAPD_SUPPORT - || (wdev->Hostapd == Hostapd_EXT) -#endif /*HOSTAPD_SUPPORT*/ -#ifdef RT_CFG80211_SUPPORT - || wdev->Hostapd == Hostapd_CFG -#endif /*RT_CFG80211_SUPPORT*/ - ) { - pEntry->Sst = SST_ASSOC; - StatusCode = MLME_SUCCESS; - - /* In WPA or 802.1x mode, the port is not secured. */ - if (IS_AKM_WPA_CAPABILITY( - pEntry->SecConfig.AKMMap) -#ifdef DOT1X_SUPPORT - || IS_IEEE8021X_Entry(wdev) -#endif /* DOT1X_SUPPORT */ - ) - tr_entry->PortSecured = - WPA_802_1X_PORT_NOT_SECURED; - else - tr_entry->PortSecured = - WPA_802_1X_PORT_SECURED; - - if (IS_AKM_PSK(pEntry->SecConfig.AKMMap)) { - pEntry->PrivacyFilter = - Ndis802_11PrivFilter8021xWEP; - pEntry->SecConfig.Handshake.WpaState = - AS_INITPSK; - } -#ifdef DOT1X_SUPPORT - else if (IS_AKM_1X(pEntry->SecConfig.AKMMap) || - IS_IEEE8021X_Entry(wdev)) { - pEntry->PrivacyFilter = - Ndis802_11PrivFilter8021xWEP; - pEntry->SecConfig.Handshake.WpaState = - AS_AUTHENTICATION; - } - -#endif /* DOT1X_SUPPORT */ - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ASSOC - WSC_STATE_MACHINE is OFF.\n", - wsc_ctrl->WscConfMode, - pEntry->func_tb_idx)); - StatusCode = MLME_ASSOC_DENY_OUT_SCOPE; - } - -#else /* WSC_AP_SUPPORT */ - StatusCode = MLME_ASSOC_DENY_OUT_SCOPE; -#endif /* WSC_AP_SUPPORT */ -#ifdef HOSTAPD_SUPPORT - - if (wdev->Hostapd == Hostapd_EXT && - (wdev->AuthMode >= Ndis802_11AuthModeWPA || - wdev->IEEE8021X)) { - RtmpOSWrielessEventSendExt( - pAd->net_dev, RT_WLAN_EVENT_EXPIRED, -1, - pEntry->Addr, NULL, 0, - ((pEntry->CapabilityInfo & 0x0010) == - 0 ? - 0xFFFD : - 0xFFFC)); - } - -#endif /*HOSTAPD_SUPPORT*/ - } else - StatusCode = update_associated_mac_entry( - pAd, pEntry, ie_list, MaxSupportedRate, - isReassoc); - } else /* CLASS 3 error should have been handled beforehand; here should be MAC table full */ - StatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA; - - if (StatusCode == MLME_SUCCESS) { - } - - return StatusCode; -} - -#ifdef IAPP_SUPPORT -/* - ======================================================================== - Routine Description: - Send Leyer 2 Update Frame to update forwarding table in Layer 2 devices. - - Arguments: - *mac_p - the STATION MAC address pointer - - Return Value: - TRUE - send successfully - FAIL - send fail - - Note: - ======================================================================== -*/ -BOOLEAN IAPP_L2_Update_Frame_Send(RTMP_ADAPTER *pAd, UINT8 *mac, INT wdev_idx) -{ - NDIS_PACKET *pNetBuf; - struct wifi_dev *wdev; - - wdev = pAd->wdev_list[wdev_idx]; - pNetBuf = - RtmpOsPktIappMakeUp(get_netdev_from_bssid(pAd, wdev_idx), mac); - - if (pNetBuf == NULL) - return FALSE; - - /*Which band is this packet transfer*/ -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if (wf_drv_tbl.wf_fwd_needed_hook != NULL && - wf_drv_tbl.wf_fwd_needed_hook() == TRUE) - set_wf_fwd_cb(pAd, pNetBuf, wdev); - -#endif /* CONFIG_WIFI_PKT_FWD */ - /* UCOS: update the built-in bridge, too (don't use gmac.xmit()) */ - announce_802_3_packet(pAd, pNetBuf, OPMODE_AP); - IAPP_L2_UpdatePostCtrl(pAd, mac, wdev_idx); - return TRUE; -} /* End of IAPP_L2_Update_Frame_Send */ -#endif /* IAPP_SUPPORT */ -#ifdef ASUS_AC68_FIX -static BOOLEAN ext_channel_check(PRTMP_ADAPTER pAd, INT len, UCHAR *chlist, - UCHAR Channel) -{ - int i; - UCHAR first_channel, last_channel = 0; - UCHAR num_of_ch; - UCHAR ext_ch; - - ext_ch = (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == - EXTCHA_BELOW) ? - Channel - 4 : - Channel + 4; - for (i = 0; i < len; i += 2) { - first_channel = chlist[i]; - num_of_ch = chlist[i + 1]; - /* for 5G, last = first + 4*(num_ch - 1) */ - if (first_channel <= 14) - last_channel = first_channel + (num_of_ch - 1); - - if (ext_ch >= first_channel && ext_ch <= last_channel) - return TRUE; - } - - return FALSE; -} -#endif /* ASUS_AC68_FIX */ - -/* - ========================================================================== - Description: - MLME message sanity check - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== - */ -BOOLEAN PeerAssocReqCmmSanity(RTMP_ADAPTER *pAd, BOOLEAN isReassoc, VOID *Msg, - INT MsgLen, IE_LISTS *ie_lists) -{ - CHAR *Ptr; - PFRAME_802_11 Fr = (PFRAME_802_11)Msg; - PEID_STRUCT eid_ptr; - UCHAR Sanity = 0; - UCHAR WPA1_OUI[4] = { 0x00, 0x50, 0xF2, 0x01 }; -#ifdef CONFIG_HOTSPOT_R2 - UCHAR HS2_OSEN_OUI[4] = { 0x50, 0x6f, 0x9a, 0x12 }; - UCHAR HS2OUIBYTE[4] = { 0x50, 0x6f, 0x9a, 0x10 }; -#endif -#ifdef MBO_SUPPORT - UCHAR MBO_OCE_OUI_BYTE[4] = { 0x50, 0x6f, 0x9a, 0x16 }; -#endif /* MBO_SUPPORT */ - - MAC_TABLE_ENTRY *pEntry = (MAC_TABLE_ENTRY *)NULL; -#ifdef DOT11R_FT_SUPPORT - FT_INFO *pFtInfo = &ie_lists->FtInfo; -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - RRM_EN_CAP_IE *pRrmEnCap = &ie_lists->RrmEnCap; -#endif /* DOT11K_RRM_SUPPORT */ - HT_CAPABILITY_IE *pHtCapability = &ie_lists->HTCapability; - UCHAR i; -#ifdef CONFIG_MAP_SUPPORT - unsigned char map_cap; -#ifdef MAP_R2 - UCHAR map_profile; - UINT16 map_vid; -#endif -#endif -#ifdef ASUS_AC68_FIX - BOOLEAN isFTPossible = TRUE; - UCHAR Channel = 0, apidx; -#endif /* ASUS_AC68_FIX */ - - pEntry = MacTableLookup(pAd, &Fr->Hdr.Addr2[0]); - - if (pEntry == NULL) - return FALSE; - - COPY_MAC_ADDR(&ie_lists->Addr1[0], &Fr->Hdr.Addr1[0]); - COPY_MAC_ADDR(&ie_lists->Addr2[0], &Fr->Hdr.Addr2[0]); - Ptr = (PCHAR)Fr->Octet; - NdisMoveMemory(&ie_lists->CapabilityInfo, &Fr->Octet[0], 2); - NdisMoveMemory(&ie_lists->ListenInterval, &Fr->Octet[2], 2); - - if (isReassoc) { - NdisMoveMemory(&ie_lists->ApAddr[0], &Fr->Octet[4], 6); - eid_ptr = (PEID_STRUCT)&Fr->Octet[10]; - } else - eid_ptr = (PEID_STRUCT)&Fr->Octet[4]; - - /* get variable fields from payload and advance the pointer */ - while (((UCHAR *)eid_ptr + eid_ptr->Len + 1) < ((UCHAR *)Fr + MsgLen)) { - switch (eid_ptr->Eid) { - case IE_SSID: - if (((Sanity & 0x1) == 1)) - break; - - if (eid_ptr->Len <= MAX_LEN_OF_SSID) { - Sanity |= 0x01; - NdisMoveMemory(&ie_lists->Ssid[0], - eid_ptr->Octet, eid_ptr->Len); - ie_lists->SsidLen = eid_ptr->Len; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("PeerAssocReqSanity - SsidLen = %d\n", - ie_lists->SsidLen)); - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("PeerAssocReqSanity - wrong IE_SSID\n")); - return FALSE; - } - - break; - - case IE_SUPP_RATES: - if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) && - (eid_ptr->Len > 0)) { - Sanity |= 0x02; - NdisMoveMemory(&ie_lists->SupportedRates[0], - eid_ptr->Octet, eid_ptr->Len); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("PeerAssocReqSanity - IE_SUPP_RATES., Len=%d. Rates[0]=%x\n", - eid_ptr->Len, - ie_lists->SupportedRates[0])); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("Rates[1]=%x %x %x %x %x %x %x\n", - ie_lists->SupportedRates[1], - ie_lists->SupportedRates[2], - ie_lists->SupportedRates[3], - ie_lists->SupportedRates[4], - ie_lists->SupportedRates[5], - ie_lists->SupportedRates[6], - ie_lists->SupportedRates[7])); - ie_lists->SupportedRatesLen = eid_ptr->Len; - } else { - UCHAR RateDefault[8] = { - 0x82, 0x84, 0x8b, 0x96, - 0x12, 0x24, 0x48, 0x6c - }; - /* HT rate not ready yet. return true temporarily. rt2860c */ - /*MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("PeerAssocReqSanity - wrong IE_SUPP_RATES\n")); */ - Sanity |= 0x02; - ie_lists->SupportedRatesLen = 8; - NdisMoveMemory(&ie_lists->SupportedRates[0], - RateDefault, 8); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("PeerAssocReqSanity - wrong IE_SUPP_RATES., Len=%d\n", - eid_ptr->Len)); - } - - break; - - case IE_EXT_SUPP_RATES: - if (eid_ptr->Len + ie_lists->SupportedRatesLen <= - MAX_LEN_OF_SUPPORTED_RATES) { - UINT32 _RateIdx = ie_lists->SupportedRatesLen % - MAX_LEN_OF_SUPPORTED_RATES; - NdisMoveMemory( - &ie_lists->SupportedRates[_RateIdx], - eid_ptr->Octet, eid_ptr->Len); - ie_lists->SupportedRatesLen += eid_ptr->Len; - } else { - NdisMoveMemory( - &ie_lists->SupportedRates - [ie_lists->SupportedRatesLen], - eid_ptr->Octet, - MAX_LEN_OF_SUPPORTED_RATES - - (ie_lists->SupportedRatesLen)); - ie_lists->SupportedRatesLen = - MAX_LEN_OF_SUPPORTED_RATES; - } - - break; - - case IE_HT_CAP: - if (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE)) { - NdisMoveMemory(pHtCapability, eid_ptr->Octet, - SIZE_HT_CAP_IE); - *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16( - *(USHORT *)(&pHtCapability->HtCapInfo)); -#ifdef UNALIGNMENT_SUPPORT - { - EXT_HT_CAP_INFO extHtCapInfo; - - NdisMoveMemory( - (PUCHAR)(&extHtCapInfo), - (PUCHAR)(&pHtCapability - ->ExtHtCapInfo), - sizeof(EXT_HT_CAP_INFO)); - *(USHORT *)(&extHtCapInfo) = cpu2le16( - *(USHORT *)(&extHtCapInfo)); - NdisMoveMemory( - (PUCHAR)(&pHtCapability - ->ExtHtCapInfo), - (PUCHAR)(&extHtCapInfo), - sizeof(EXT_HT_CAP_INFO)); - } -#else - *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16( - *(USHORT *)(&pHtCapability - ->ExtHtCapInfo)); -#endif /* UNALIGNMENT_SUPPORT */ -#ifdef RT_BIG_ENDIAN - *(USHORT *)(&pHtCapability->TxBFCap) = le2cpu32( - *(USHORT *)(&pHtCapability->TxBFCap)); -#endif - ie_lists->ht_cap_len = SIZE_HT_CAP_IE; - Sanity |= 0x10; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("PeerAssocReqSanity - IE_HT_CAP\n")); - } else - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("PeerAssocReqSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\n", - eid_ptr->Len)); - - break; - - case IE_EXT_CAPABILITY: - if (eid_ptr->Len) { - INT ext_len = eid_ptr->Len; -#ifdef RT_BIG_ENDIAN - UCHAR *pextCapInfo = NULL; -#endif - ext_len = - ext_len > sizeof(EXT_CAP_INFO_ELEMENT) ? - sizeof(EXT_CAP_INFO_ELEMENT) : - ext_len; - NdisMoveMemory(&ie_lists->ExtCapInfo, - eid_ptr->Octet, ext_len); -#ifdef RT_BIG_ENDIAN - pextCapInfo = (UCHAR *)&ie_lists->ExtCapInfo; - *((UINT32 *)pextCapInfo) = - cpu2le32(*((UINT32 *)pextCapInfo)); - *((UINT32 *)(pextCapInfo + 4)) = cpu2le32( - *((UINT32 *)(pextCapInfo + 4))); -#endif - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("PeerAssocReqSanity - IE_EXT_CAPABILITY!\n")); - } - - break; - - case IE_WPA: /* same as IE_VENDOR_SPECIFIC */ -#ifdef MBO_SUPPORT - if (NdisEqualMemory(eid_ptr->Octet, MBO_OCE_OUI_BYTE, - sizeof(MBO_OCE_OUI_BYTE)) && - (eid_ptr->Len >= 5)) { - MboParseStaMboIE( - pAd, - &pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev, - pEntry, eid_ptr->Octet, eid_ptr->Len, - MBO_FRAME_TYPE_ASSOC_REQ); - break; - } -#endif /* MBO_SUPPORT */ - -#ifdef IGMP_TVM_SUPPORT - if (IS_IGMP_TVM_MODE_EN(pEntry->wdev->IsTVModeEnable)) { - if (NdisEqualMemory(eid_ptr->Octet, - IGMP_TVM_OUI, 4) && - (eid_ptr->Len == IGMP_TVM_IE_LENGTH)) { - RTMPMoveMemory(&ie_lists->tvm_ie, - &eid_ptr->Eid, - IGMP_TVM_IE_LENGTH + 2); - break; - } - } -#endif /* IGMP_TVM_SUPPORT */ - -#ifdef CONFIG_MAP_SUPPORT - if (map_check_cap_ie(eid_ptr, &map_cap -#ifdef MAP_R2 - , - &map_profile, &map_vid -#endif - ) == TRUE) { - ie_lists->MAP_AttriValue = map_cap; -#ifdef MAP_R2 - ie_lists->MAP_ProfileValue = map_profile; - ie_lists->MAP_default_vid = map_vid; -#endif - } -#endif /* CONFIG_MAP_SUPPORT */ - /* FALLTHRU */ - - case IE_WPA2: -#ifdef DOT11R_FT_SUPPORT -#endif /* DOT11R_FT_SUPPORT */ -#ifdef CONFIG_HOTSPOT_R2 - if (NdisEqualMemory(eid_ptr->Octet, HS2OUIBYTE, - sizeof(HS2OUIBYTE)) && - (eid_ptr->Len >= 5)) { - /* UCHAR tmp2 = 0x12; */ - UCHAR *hs2_config = (UCHAR *)&eid_ptr->Octet[4]; - UCHAR ppomo_exist = ((*hs2_config) >> 1) & 0x01; - UCHAR hs2_version = ((*hs2_config) >> 4) & 0x0f; - /* UCHAR *tmp3 = (UCHAR *)&pEntry->hs_info.ppsmo_id; */ - /* UCHAR tmp[2] = {0x12,0x34}; */ - pEntry->hs_info.version = hs2_version; - pEntry->hs_info.ppsmo_exist = ppomo_exist; - - if (pEntry->hs_info.ppsmo_exist) { - NdisMoveMemory( - &pEntry->hs_info.ppsmo_id, - &eid_ptr->Octet[5], 2); - /* NdisMoveMemory(tmp3, tmp, 2); */ - } - - break; - } - -#endif /* CONFIG_HOTSPOT_R2 */ - - if (NdisEqualMemory(eid_ptr->Octet, WPS_OUI, 4)) { -#ifdef WSC_AP_SUPPORT -#ifdef WSC_V2_SUPPORT - - if ((pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.WscControl.WscV2Info - .bWpsEnable) || - (pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.WscControl.WscV2Info - .bEnableWpsV2 == FALSE)) -#endif /* WSC_V2_SUPPORT */ - ie_lists->bWscCapable = TRUE; - -#ifdef RT_CFG80211_SUPPORT - ie_lists->bWscCapable = TRUE; -#endif -#endif /* WSC_AP_SUPPORT */ - break; - } - - /* Handle Atheros and Broadcom draft 11n STAs */ - if (NdisEqualMemory(eid_ptr->Octet, BROADCOM_OUI, 3)) { - switch (eid_ptr->Octet[3]) { - case 0x33: - if ((eid_ptr->Len - 4) == - sizeof(HT_CAPABILITY_IE)) { - NdisMoveMemory( - pHtCapability, - &eid_ptr->Octet[4], - SIZE_HT_CAP_IE); - *(USHORT *)(&pHtCapability - ->HtCapInfo) = - cpu2le16(*( - USHORT *)(&pHtCapability - ->HtCapInfo)); -#ifdef UNALIGNMENT_SUPPORT - { - EXT_HT_CAP_INFO - extHtCapInfo; - - NdisMoveMemory( - (PUCHAR)(&extHtCapInfo), - (PUCHAR)(&pHtCapability - ->ExtHtCapInfo), - sizeof(EXT_HT_CAP_INFO)); - *(USHORT *)(&extHtCapInfo) = cpu2le16( - *(USHORT *)(&extHtCapInfo)); - NdisMoveMemory( - (PUCHAR)(&pHtCapability - ->ExtHtCapInfo), - (PUCHAR)(&extHtCapInfo), - sizeof(EXT_HT_CAP_INFO)); - } -#else - *(USHORT *)(&pHtCapability - ->ExtHtCapInfo) = - cpu2le16(*( - USHORT *)(&pHtCapability - ->ExtHtCapInfo)); -#endif /* UNALIGNMENT_SUPPORT */ - ie_lists->ht_cap_len = - SIZE_HT_CAP_IE; - } - - break; - - default: - /* ignore other cases */ - break; - } - } - - check_vendor_ie(pAd, (UCHAR *)eid_ptr, - &(ie_lists->vendor_ie)); - - /* WMM_IE */ - if (NdisEqualMemory(eid_ptr->Octet, WME_INFO_ELEM, 6) && - (eid_ptr->Len == 7)) { - ie_lists->bWmmCapable = TRUE; -#ifdef UAPSD_SUPPORT - - if (pEntry) { - UAPSD_AssocParse( - pAd, pEntry, - (UINT8 *)&eid_ptr->Octet[6], - pAd->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.UapsdInfo - .bAPSDCapable); - } - -#endif /* UAPSD_SUPPORT */ - break; - } - - if (IS_NO_SECURITY( - &pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.SecConfig) || - IS_CIPHER_WEP( - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.SecConfig.PairwiseCipher)) - break; - - /* If this IE did not begins with 00:0x50:0xf2:0x01, - it would be proprietary. So we ignore it. */ - if (!NdisEqualMemory(eid_ptr->Octet, WPA1_OUI, - sizeof(WPA1_OUI)) && - !(eid_ptr->Eid == IE_WPA2)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Not RSN IE, maybe WMM IE!!!\n")); -#ifdef CONFIG_HOTSPOT_R2 - - if (!NdisEqualMemory(eid_ptr->Octet, - HS2_OSEN_OUI, - sizeof(HS2_OSEN_OUI))) { - unsigned char *tmp = - (unsigned char *)eid_ptr->Octet; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("!!!!!!not found OSEN IE,%x:%x:%x:%x\n", - *tmp, *(tmp + 1), *(tmp + 2), - *(tmp + 3))); - pEntry->OSEN_IE_Len = 0; - CLIENT_STATUS_CLEAR_FLAG( - pEntry, - fCLIENT_STATUS_OSEN_CAPABLE); - break; - } - - CLIENT_STATUS_SET_FLAG( - pEntry, fCLIENT_STATUS_OSEN_CAPABLE); - NdisMoveMemory(pEntry->OSEN_IE, eid_ptr, - eid_ptr->Len + 2); - pEntry->OSEN_IE_Len = eid_ptr->Len + 2; - SET_AKM_WPA2(pEntry->SecConfig.AKMMap); - SET_CIPHER_CCMP128( - pEntry->SecConfig.PairwiseCipher); - SET_CIPHER_CCMP128( - pEntry->SecConfig.GroupCipher); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("!!!!!!found OSEN IE Entry AuthMode %s, EncryptType %s\n", - GetAuthModeStr( - pEntry->SecConfig.AKMMap), - GetEncryModeStr( - pEntry->SecConfig - .PairwiseCipher))); -#else - break; -#endif - } - - /* Copy whole RSNIE context */ - NdisMoveMemory(&ie_lists->RSN_IE[0], eid_ptr, - eid_ptr->Len + 2); - ie_lists->RSNIE_Len = eid_ptr->Len + 2; -#ifdef DOT11R_FT_SUPPORT - NdisMoveMemory(pFtInfo->RSN_IE, eid_ptr, - eid_ptr->Len + 2); - pFtInfo->RSNIE_Len = eid_ptr->Len + 2; -#endif /* DOT11R_FT_SUPPORT */ - - break; -#ifdef DOT11R_FT_SUPPORT - - case IE_FT_MDIE: - FT_FillMdIeInfo(eid_ptr, &pFtInfo->MdIeInfo); - break; - - case IE_FT_FTIE: - FT_FillFtIeInfo(eid_ptr, &pFtInfo->FtIeInfo); - break; - - case IE_FT_RIC_DATA: - - /* record the pointer of first RDIE. */ - if (pFtInfo->RicInfo.pRicInfo == NULL) { - pFtInfo->RicInfo.pRicInfo = &eid_ptr->Eid; - pFtInfo->RicInfo.Len = ((UCHAR *)Fr + MsgLen) - - (UCHAR *)eid_ptr + 1; - } - break; - - case IE_FT_RIC_DESCRIPTOR: - if ((pFtInfo->RicInfo.RicIEsLen + eid_ptr->Len + 2) < - MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfo->RicInfo.RicIEs - [pFtInfo->RicInfo.RicIEsLen], - &eid_ptr->Eid, eid_ptr->Len + 2); - pFtInfo->RicInfo.RicIEsLen += eid_ptr->Len + 2; - } - - break; -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - - case IE_RRM_EN_CAP: { - UINT64 value; - - NdisMoveMemory(&value, eid_ptr->Octet, sizeof(UINT64)); - pRrmEnCap->word = le2cpu64(value); - } break; -#endif /* DOT11K_RRM_SUPPORT */ -#ifdef DOT11_VHT_AC - - case IE_VHT_CAP: - if (eid_ptr->Len == sizeof(VHT_CAP_IE)) { -#ifdef RT_BIG_ENDIAN - UINT32 tmp_1; - UINT64 tmp_2; -#endif - NdisMoveMemory(&ie_lists->vht_cap, - eid_ptr->Octet, - sizeof(VHT_CAP_IE)); - ie_lists->vht_cap_len = eid_ptr->Len; -#ifdef RT_BIG_ENDIAN - NdisCopyMemory(&tmp_1, - &ie_lists->vht_cap.vht_cap, 4); - tmp_1 = le2cpu32(tmp_1); - NdisCopyMemory(&ie_lists->vht_cap.vht_cap, - &tmp_1, 4); - - NdisCopyMemory(&tmp_2, - &(ie_lists->vht_cap.mcs_set), 8); - tmp_2 = le2cpu64(tmp_2); - NdisCopyMemory(&(ie_lists->vht_cap.mcs_set), - &tmp_2, 8); -#endif - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s():IE_VHT_CAP\n", __func__)); - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s():wrong IE_VHT_CAP, eid->Len = %d\n", - __func__, eid_ptr->Len)); - } - break; - - case IE_VHT_OP: - if (eid_ptr->Len == sizeof(VHT_OP_IE)) { -#ifdef RT_BIG_ENDIAN - UINT32 tmp; -#endif - NdisMoveMemory(&ie_lists->vht_op, - eid_ptr->Octet, - sizeof(VHT_OP_IE)); - ie_lists->vht_op_len = eid_ptr->Len; -#ifdef RT_BIG_ENDIAN - NdisCopyMemory(&tmp, - &ie_lists->vht_op.basic_mcs_set, - sizeof(VHT_MCS_MAP)); - tmp = le2cpu16(tmp); - NdisCopyMemory(&ie_lists->vht_op.basic_mcs_set, - &tmp, sizeof(VHT_MCS_MAP)); -#endif - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s():IE_VHT_OP\n", __func__)); - } - break; - - case IE_OPERATING_MODE_NOTIFY: - if (eid_ptr->Len == sizeof(OPERATING_MODE)) { - ie_lists->operating_mode_len = - sizeof(OPERATING_MODE); - NdisMoveMemory(&ie_lists->operating_mode, - &eid_ptr->Octet[0], - sizeof(OPERATING_MODE)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s():IE_OPERATING_MODE_NOTIFY!\n", - __func__)); - } - - break; -#endif /* DOT11_VHT_AC */ - - case IE_SUPP_CHANNELS: - if (eid_ptr->Len > MAX_LEN_OF_SUPPORTED_CHL || - (eid_ptr->Len % 2)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s():wrong IE_SUPP_CHANNELS, eid->Len = %d\n", - __func__, eid_ptr->Len)); - } else if (eid_ptr->Len + ie_lists->SupportedChlLen <= - MAX_LEN_OF_SUPPORTED_CHL) { - UINT32 _ChlIdx = ie_lists->SupportedChlLen % - MAX_LEN_OF_SUPPORTED_CHL; - NdisMoveMemory(&ie_lists->SupportedChl[_ChlIdx], - eid_ptr->Octet, eid_ptr->Len); - ie_lists->SupportedChlLen += eid_ptr->Len; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s():IE_SUPP_CHANNELS, eid->Len = %d\n", - __func__, eid_ptr->Len)); - } else { - NdisMoveMemory( - &ie_lists->SupportedChl - [ie_lists->SupportedChlLen], - eid_ptr->Octet, - MAX_LEN_OF_SUPPORTED_CHL - - (ie_lists->SupportedChlLen)); - ie_lists->SupportedChlLen = - MAX_LEN_OF_SUPPORTED_CHL; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s():IE_SUPP_CHANNELS, eid->Len = %d (Exceeded)\n", - __func__, eid_ptr->Len)); - } - - if (ie_lists->SupportedChlLen > - MAX_LEN_OF_SUPPORTED_CHL) - ie_lists->SupportedChlLen = - MAX_LEN_OF_SUPPORTED_CHL; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - (" Supported Channels: [ FirstCh : NumOfCh ]\n")); - - for (i = 0; i < ie_lists->SupportedChlLen; i += 2) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - (" [ %4d : %4d ]\n", - ie_lists->SupportedChl[i], - ie_lists->SupportedChl[i + 1])); -#ifdef ASUS_AC68_FIX - /* Although regulatory or other factors may limit Fat Channel operation (in the 2.4GHz) - * as is apparent from a STA's supported channels IE, yet if the STA advertise - * 40MHz capable in its IE_HT_CAP, then its a (possible) BUG. - * ASUS AC68 STA has this issue. - * The workaround is to override 'ChannelWidth' in HT_CAP and force 20MHz association - * only for the STA. - */ - /* XXX: only 2.4GHz handled now */ - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - if (!RtmpOSNetDevIsUp(pAd->ApCfg.MBSSID[apidx] - .wdev.if_dev)) - continue; - Channel = pAd->ApCfg.MBSSID[apidx].wdev.channel; - break; - } - if ((Channel != 0) && (Channel <= 14) && - (Channel == BW_40)) - isFTPossible = - ext_channel_check(pAd, eid_ptr->Len, - eid_ptr->Octet, - Channel); - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("40MHz can%s be supported for this association\n", - isFTPossible ? "yes" : "not")); -#endif /* ASUS_AC68_FIX */ - - break; - case IE_WLAN_EXTENSION: { - /*parse EXTENSION EID*/ - UCHAR *extension_id = (UCHAR *)eid_ptr + 2; - - switch (*extension_id) { - case IE_EXTENSION_ID_ECDH: -#if defined(CONFIG_OWE_SUPPORT) || defined(HOSTAPD_OWE_SUPPORT) - { - UCHAR *ext_ie_length = (UCHAR *)eid_ptr + 1; - os_zero_mem(ie_lists->ecdh_ie.public_key, - *ext_ie_length - 3); - ie_lists->ecdh_ie.ext_ie_id = IE_WLAN_EXTENSION; - ie_lists->ecdh_ie.length = eid_ptr->Len; - NdisMoveMemory(&ie_lists->ecdh_ie.ext_id_ecdh, - eid_ptr->Octet, eid_ptr->Len); - } -#endif /*CONFIG_OWE_SUPPORT*/ - break; - default: - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("IE_WLAN_EXTENSION: no handler for extension_id:%d\n", - *extension_id)); - break; - } - } break; - default: - break; - } - - eid_ptr = (PEID_STRUCT)((UCHAR *)eid_ptr + 2 + eid_ptr->Len); - } - -#ifdef ASUS_AC68_FIX - if (!isFTPossible) - pHtCapability->HtCapInfo.ChannelWidth = 0; -#endif /* ASUS_AC68_FIX */ - - if ((Sanity & 0x3) != 0x03) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s(): - missing mandatory field\n", __func__)); - return FALSE; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s() - success\n", __func__)); - return TRUE; -} - -#ifdef CONFIG_MAP_SUPPORT -static BOOLEAN is_controller_found(struct wifi_dev *wdev) -{ - struct map_vendor_ie *ie = - (struct map_vendor_ie *)wdev->MAPCfg.vendor_ie_buf; - - if (ie->connectivity_to_controller) - return TRUE; - - return FALSE; -} -#endif - -/* - ========================================================================== - Description: - peer assoc req handling procedure - Parameters: - Adapter - Adapter pointer - Elem - MLME Queue Element - Pre: - the station has been authenticated and the following information is stored - Post : - -# An association response frame is generated and sent to the air - ========================================================================== - */ -VOID APPeerAssocReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - ap_cmm_peer_assoc_req_action(pAd, Elem, 0); -} - -/* - ========================================================================== - Description: - mlme reassoc req handling procedure - Parameters: - Elem - - Pre: - -# SSID (Adapter->ApCfg.ssid[]) - -# BSSID (AP address, Adapter->ApCfg.bssid) - -# Supported rates (Adapter->ApCfg.supported_rates[]) - -# Supported rates length (Adapter->ApCfg.supported_rates_len) - -# Tx power (Adapter->ApCfg.tx_power) - ========================================================================== - */ -VOID APPeerReassocReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - ap_cmm_peer_assoc_req_action(pAd, Elem, 1); -} - -VOID ap_cmm_peer_assoc_req_action(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem, - IN BOOLEAN isReassoc) -{ - struct wifi_dev *wdev = NULL; - struct dev_rate_info *rate; - BSS_STRUCT *pMbss; - BOOLEAN bAssocSkip = FALSE; - CHAR rssi; - IE_LISTS *ie_list = NULL; - HEADER_802_11 AssocRspHdr; - USHORT CapabilityInfoForAssocResp; - USHORT StatusCode = MLME_SUCCESS; - USHORT Aid = 0; - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - UCHAR MaxSupportedRate = 0; - UCHAR SupRateLen, PhyMode, FlgIs11bSta; - UCHAR i; -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - UCHAR ucETxBfCap; -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ - MAC_TABLE_ENTRY *pEntry = NULL; - STA_TR_ENTRY *tr_entry; -#ifdef DBG - UCHAR *sAssoc = isReassoc ? (PUCHAR) "ReASSOC" : (PUCHAR) "ASSOC"; -#endif /* DBG */ - UCHAR SubType; - BOOLEAN bACLReject = FALSE; -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - BOOLEAN bBlReject = FALSE; -#endif -#ifdef DOT11R_FT_SUPPORT - PFT_CFG pFtCfg = NULL; - PFT_INFO FtInfoBuf = NULL; -#endif /* DOT11R_FT_SUPPORT */ -#ifdef WSC_AP_SUPPORT - WSC_CTRL *wsc_ctrl; -#endif /* WSC_AP_SUPPORT */ -#ifdef RT_BIG_ENDIAN - UINT32 tmp_1; - UINT64 tmp_2; -#endif /*RT_BIG_ENDIAN*/ - ADD_HT_INFO_IE *addht; -#ifdef GREENAP_SUPPORT - struct greenap_ctrl *greenap = &pAd->ApCfg.greenap; -#endif /* GREENAP_SUPPORT */ - struct _build_ie_info ie_info; -#ifdef MBO_SUPPORT - BOOLEAN bMboReject = FALSE; -#endif /* MBO_SUPPORT */ -#ifdef WAPP_SUPPORT - UINT8 wapp_cnnct_stage = WAPP_ASSOC; - UINT16 wapp_assoc_fail = NOT_FAILURE; -#endif /* WAPP_SUPPORT */ - -#ifdef DOT11R_FT_SUPPORT - os_alloc_mem_suspend(NULL, (UCHAR **)&FtInfoBuf, sizeof(FT_INFO)); - - if (FtInfoBuf == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): mem alloc failed\n", __func__)); -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_NO_RESOURCE; -#endif /* WAPP_SUPPORT */ - goto assoc_check; - } - - NdisZeroMemory(FtInfoBuf, sizeof(FT_INFO)); -#endif - - /* disallow new association */ - if (pAd->ApCfg.BANClass3Data == TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Disallow new Association\n")); -#ifdef WAPP_SUPPORT - wapp_assoc_fail = DISALLOW_NEW_ASSOCI; -#endif /* WAPP_SUPPORT */ - goto assoc_check; - } - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(IE_LISTS)); - - if (ie_list == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): mem alloc failed\n", __func__)); -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_NO_RESOURCE; -#endif /* WAPP_SUPPORT */ - goto assoc_check; - } - - NdisZeroMemory(ie_list, sizeof(IE_LISTS)); - - if (!PeerAssocReqCmmSanity(pAd, isReassoc, Elem->Msg, Elem->MsgLen, - ie_list)) - goto LabelOK; - - pEntry = MacTableLookup(pAd, ie_list->Addr2); - - if (!pEntry) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("NoAuth MAC - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(ie_list->Addr2))); - goto LabelOK; - } - - if (!VALID_MBSS(pAd, pEntry->func_tb_idx)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():pEntry bounding invalid wdev(apidx=%d)\n", - __func__, pEntry->func_tb_idx)); - goto LabelOK; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():pEntry->func_tb_idx=%d\n", __func__, - pEntry->func_tb_idx)); - wdev = wdev_search_by_address(pAd, ie_list->Addr1); - - if (wdev == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Wrong Addr1 - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(ie_list->Addr1))); - goto LabelOK; - } - -/* WPS_BandSteering Support */ -#if defined(BAND_STEERING) && defined(WSC_INCLUDED) - if (pAd->ApCfg.BandSteering) { - PWSC_CTRL pWscControl = NULL; - PBND_STRG_CLI_ENTRY cli_entry = NULL; - PBND_STRG_CLI_TABLE table = NULL; - PWPS_WHITELIST_ENTRY wps_entry = NULL; - PBS_LIST_ENTRY bs_whitelist_entry = NULL; - - pWscControl = &pAd->ApCfg.MBSSID[wdev->func_idx].WscControl; - table = Get_BndStrgTable(pAd, wdev->func_idx); - if (table && table->bEnabled) { - cli_entry = BndStrg_TableLookup(table, pEntry->Addr); - wps_entry = FindWpsWhiteListEntry(&table->WpsWhiteList, - pEntry->Addr); - - /* WPS: special WIN7 case: no wps/rsn ie in assoc */ - /* and send eapol start, consider it as wps station */ - if ((ie_list->RSNIE_Len == 0) && - (IS_AKM_WPA_CAPABILITY_Entry(wdev)) && - (pWscControl->WscConfMode != WSC_DISABLE)) - ie_list->bWscCapable = TRUE; - - /* in case probe did not have wps ie, but assoc has, create wps whitelist entry here */ - if (!wps_entry && ie_list->bWscCapable && - pWscControl->bWscTrigger) { - NdisAcquireSpinLock(&table->WpsWhiteListLock); - AddWpsWhiteList(&table->WpsWhiteList, - pEntry->Addr); - NdisReleaseSpinLock(&table->WpsWhiteListLock); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("channel %u: WPS Assoc req: STA %02x:%02x:%02x:%02x:%02x:%02x wps whitelisted\n", - table->Channel, - PRINT_MAC(pEntry->Addr))); - BND_STRG_PRINTQAMSG( - table, pEntry->Addr, - ("ASSOC STA %02x:%02x:%02x:%02x:%02x:%02x channel %u added in WPS Whitelist\n", - PRINT_MAC(pEntry->Addr), - table->Channel)); - } - - bs_whitelist_entry = FindBsListEntry(&table->WhiteList, - pEntry->Addr); - - /* handle case: where a client has wps ie in probe, not have bndstrg entry/bndstrg whitelist, */ - /* but doing normal assoc: dont allow */ - if ((pWscControl->bWscTrigger) && (!cli_entry) && - (!ie_list->bWscCapable) && (!bs_whitelist_entry)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\n%s():reject assoc:bWscTrigger:%d, cli_entry:%p,bWscCapable:%d, bs_whitelist_entry:%p\n", - __func__, pWscControl->bWscTrigger, - cli_entry, ie_list->bWscCapable, - bs_whitelist_entry)); - BND_STRG_PRINTQAMSG( - table, pEntry->Addr, - ("STA %02x:%02x:%02x:%02x:%02x:%02x Normal Assoc Rejected for BS unauthorized client\n", - PRINT_MAC(pEntry->Addr))); - goto LabelOK; - } - } - } -#endif - pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; -#ifdef WSC_AP_SUPPORT - wsc_ctrl = &wdev->WscControl; -#endif /* WSC_AP_SUPPORT */ - PhyMode = wdev->PhyMode; - rate = &wdev->rate; - addht = wlan_operate_get_addht(wdev); - - if (!OPSTATUS_TEST_FLAG_WDEV(wdev, - fOP_AP_STATUS_MEDIA_STATE_CONNECTED)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): AP is not ready, disallow new Association\n", - __func__)); - goto LabelOK; - } - -#ifdef OCE_FILS_SUPPORT - if ((pEntry->filsInfo.is_post_assoc == TRUE) && - (pEntry->filsInfo.auth_algo == AUTH_MODE_FILS) && - IS_AKM_FILS(wdev->SecConfig.AKMMap) && - IS_AKM_FILS(pEntry->SecConfig.AKMMap)) { - StatusCode = pEntry->filsInfo.status; - pEntry->filsInfo.is_post_assoc = FALSE; - goto assoc_post; - } -#endif /* OCE_FILS_SUPPORT */ - - ie_info.frame_subtype = SUBTYPE_ASSOC_RSP; - ie_info.channel = wdev->channel; - ie_info.phy_mode = PhyMode; - ie_info.wdev = wdev; - -#ifdef HTC_DECRYPT_IOT - - if ((pEntry->HTC_ICVErrCnt) || (pEntry->HTC_AAD_OM_Force) || - (pEntry->HTC_AAD_OM_CountDown) || (pEntry->HTC_AAD_OM_Freeze)) { - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("@@@ %s(): (wcid=%u), HTC_ICVErrCnt(%u), HTC_AAD_OM_Freeze(%u), HTC_AAD_OM_CountDown(%u), HTC_AAD_OM_Freeze(%u) is in Asso. stage!\n", - __func__, pEntry->wcid, pEntry->HTC_ICVErrCnt, - pEntry->HTC_AAD_OM_Force, pEntry->HTC_AAD_OM_CountDown, - pEntry->HTC_AAD_OM_Freeze)); - /* Force clean. */ - pEntry->HTC_ICVErrCnt = 0; - pEntry->HTC_AAD_OM_Force = 0; - pEntry->HTC_AAD_OM_CountDown = 0; - pEntry->HTC_AAD_OM_Freeze = 0; - } - -#endif /* HTC_DECRYPT_IOT */ - FlgIs11bSta = 1; - - for (i = 0; i < ie_list->SupportedRatesLen; i++) { - if (((ie_list->SupportedRates[i] & 0x7F) != 2) && - ((ie_list->SupportedRates[i] & 0x7F) != 4) && - ((ie_list->SupportedRates[i] & 0x7F) != 11) && - ((ie_list->SupportedRates[i] & 0x7F) != 22)) { - FlgIs11bSta = 0; - break; - } - } -#ifdef CONFIG_MAP_SUPPORT - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():IS_MAP_ENABLE(pEntry->wdev)=%d\n", __func__, - IS_MAP_ENABLE(pAd))); - if (IS_MAP_ENABLE(pAd)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Assoc Req len=%ld, ASSOC_REQ_LEN = %d\n", - __func__, Elem->MsgLen, ASSOC_REQ_LEN_MAX)); - if (Elem->MsgLen > ASSOC_REQ_LEN_MAX) - pEntry->assoc_req_len = ASSOC_REQ_LEN_MAX; - else - pEntry->assoc_req_len = Elem->MsgLen; - NdisMoveMemory(pEntry->assoc_req_frame, Elem->Msg, - pEntry->assoc_req_len); - } -#endif - -#ifdef MBO_SUPPORT - if (!MBO_AP_ALLOW_ASSOC(wdev)) { - StatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA; - bMboReject = TRUE; -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_UNABLE_HANDLE_STA; -#endif /* WAPP_SUPPORT */ - goto SendAssocResponse; - } -#endif /* MBO_SUPPORT */ - - /* YF@20120419: Refuse the weak signal of AssocReq */ - rssi = RTMPMaxRssi(pAd, - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0), - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1), - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3) -#endif - ); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("ra[%d] ASSOC_REQ Threshold = %d, PktMaxRssi=%d\n", - pEntry->func_tb_idx, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx].AssocReqRssiThreshold, - rssi)); - - if ((pAd->ApCfg.MBSSID[pEntry->func_tb_idx].AssocReqRssiThreshold != - 0) && - (rssi < - pAd->ApCfg.MBSSID[pEntry->func_tb_idx].AssocReqRssiThreshold)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Reject this ASSOC_REQ due to Weak Signal.\n")); -#ifdef OCE_SUPPORT - if (IS_OCE_ENABLE(wdev)) { - struct oce_info *oceInfo = &pEntry->oceInfo; - CHAR rssiThres = pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .AssocReqRssiThreshold; - - oceInfo->DeltaAssocRSSI = - (rssiThres > rssi) ? (rssiThres - rssi) : 0; - StatusCode = MLME_DISASSOC_LOW_ACK; -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_UNABLE_HANDLE_STA; -#endif /* WAPP_SUPPORT */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Reject the AssocReq and DeltaRssi :%d\n", - __func__, oceInfo->DeltaAssocRSSI)); - - goto SendAssocResponse; - } else -#endif /* OCE_SUPPORT */ - bAssocSkip = TRUE; - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Accept RSSI: ===> %d, %d\n", - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .AssocReqRssiThreshold, - rssi)); - } -#ifdef DOT11W_PMF_SUPPORT - - if ((tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) && - (pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE) -#ifdef DOT11R_FT_SUPPORT - && (!IS_FT_RSN_STA(pEntry)) -#endif /* DOT11R_FT_SUPPORT */ -#ifdef OCE_FILS_SUPPORT - && (pEntry->filsInfo.auth_algo != AUTH_MODE_FILS) -#endif /* OCE_FILS_SUPPORT */ - ) { - StatusCode = MLME_ASSOC_REJ_TEMPORARILY; -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_ASSOC_REJ_TEMP; -#endif /* WAPP_SUPPORT */ - goto SendAssocResponse; - } - -#endif /* DOT11W_PMF_SUPPORT */ - - /* clear the previous Pairwise key table */ - if ((pEntry->Aid != 0) -#ifdef DOT11R_FT_SUPPORT - && (!IS_FT_STA(pEntry)) -#endif /* DOT11R_FT_SUPPORT */ -#ifdef OCE_FILS_SUPPORT - && (pEntry->filsInfo.auth_algo != AUTH_MODE_FILS) -#endif /* OCE_FILS_SUPPORT */ - && ((!IS_AKM_OPEN(pEntry->SecConfig.AKMMap)) || - (!IS_AKM_SHARED(pEntry->SecConfig.AKMMap)) -#ifdef DOT1X_SUPPORT - || IS_IEEE8021X(&pEntry->SecConfig) -#endif /* DOT1X_SUPPORT */ - )) { - ASIC_SEC_INFO *Info; - /* clear GTK state */ - pEntry->SecConfig.Handshake.GTKState = REKEY_NEGOTIATING; - NdisZeroMemory(&pEntry->SecConfig.PTK, LEN_MAX_PTK); - /* Set key material to Asic */ - - os_alloc_mem(pAd, (UCHAR **)&Info, sizeof(ASIC_SEC_INFO)); - if (Info == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): mem alloc failed\n", __func__)); -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_NO_RESOURCE; -#endif /* WAPP_SUPPORT */ - goto assoc_check; - } - os_zero_mem(Info, sizeof(ASIC_SEC_INFO)); - - Info->Operation = SEC_ASIC_REMOVE_PAIRWISE_KEY; - Info->Wcid = pEntry->wcid; - /* Set key material to Asic */ - HW_ADDREMOVE_KEYTABLE(pAd, Info); -#if defined(DOT1X_SUPPORT) && !defined(RADIUS_ACCOUNTING_SUPPORT) - - /* Notify 802.1x daemon to clear this sta info */ - if (IS_AKM_1X(pEntry->SecConfig.AKMMap) || - IS_IEEE8021X(&pEntry->SecConfig)) - DOT1X_InternalCmdAction(pAd, pEntry, - DOT1X_DISCONNECT_ENTRY); - -#endif /* DOT1X_SUPPORT */ - os_free_mem(Info); - } - -#ifdef WSC_AP_SUPPORT - /* since sta has been left, ap should receive EapolStart and EapRspId again. */ - pEntry->Receive_EapolStart_EapRspId = 0; - pEntry->bWscCapable = ie_list->bWscCapable; -#ifdef WSC_V2_SUPPORT - - if ((wsc_ctrl->WscV2Info.bEnableWpsV2) && - (wsc_ctrl->WscV2Info.bWpsEnable == FALSE)) - ; - else -#endif /* WSC_V2_SUPPORT */ - { - if (pEntry->func_tb_idx < pAd->ApCfg.BssidNum) { - if (MAC_ADDR_EQUAL(pEntry->Addr, wsc_ctrl->EntryAddr)) { - BOOLEAN Cancelled; - - RTMPZeroMemory(wsc_ctrl->EntryAddr, - MAC_ADDR_LEN); - RTMPCancelTimer(&wsc_ctrl->EapolTimer, - &Cancelled); - wsc_ctrl->EapolTimerRunning = FALSE; - } - } - - if ((ie_list->RSNIE_Len == 0) && - (IS_AKM_WPA_CAPABILITY_Entry(wdev)) && -#ifdef RT_CFG80211_SUPPORT - (pMbss->WscIEBeacon.Value) -#else - (wsc_ctrl->WscConfMode != WSC_DISABLE) -#endif - ) - pEntry->bWscCapable = TRUE; - } - -#endif /* WSC_AP_SUPPORT */ - - /* for hidden SSID sake, SSID in AssociateRequest should be fully verified */ - if ((ie_list->SsidLen != pMbss->SsidLen) || - (NdisEqualMemory(ie_list->Ssid, pMbss->Ssid, ie_list->SsidLen) == - 0)) - goto LabelOK; - -#ifdef WSC_V2_SUPPORT - - /* Do not check ACL when WPS V2 is enabled and ACL policy is positive. */ - if ((pEntry->bWscCapable) && (wsc_ctrl->WscConfMode != WSC_DISABLE) && - (wsc_ctrl->WscV2Info.bEnableWpsV2) && - (wsc_ctrl->WscV2Info.bWpsEnable) && - (MAC_ADDR_EQUAL(wsc_ctrl->EntryAddr, ZERO_MAC_ADDR))) - ; - else -#endif /* WSC_V2_SUPPORT */ -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - /* set a flag for sending Assoc-Fail response to unwanted STA later. */ - if (map_is_entry_bl(pAd, ie_list->Addr2, pEntry->func_tb_idx) == - TRUE) { - bBlReject = TRUE; - } else -#endif - - /* set a flag for sending Assoc-Fail response to unwanted STA later. */ - if (!ApCheckAccessControlList(pAd, ie_list->Addr2, - pEntry->func_tb_idx)) - bACLReject = TRUE; - -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s - MBSS(%d), receive %s request from %02x:%02x:%02x:%02x:%02x:%02x Rej BL/ACL %d/%d\n", - sAssoc, pEntry->func_tb_idx, sAssoc, PRINT_MAC(ie_list->Addr2), - bBlReject, bACLReject)); -#else - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s - MBSS(%d), receive %s request from %02x:%02x:%02x:%02x:%02x:%02x\n", - sAssoc, pEntry->func_tb_idx, sAssoc, - PRINT_MAC(ie_list->Addr2))); -#endif - - /* supported rates array may not be sorted. sort it and find the maximum rate */ - for (i = 0; i < ie_list->SupportedRatesLen; i++) { - if (MaxSupportedRate < (ie_list->SupportedRates[i] & 0x7f)) - MaxSupportedRate = ie_list->SupportedRates[i] & 0x7f; - } - - /* - Assign RateLen here or we will select wrong rate table in - APBuildAssociation() when 11N compile option is disabled. - */ - pEntry->RateLen = ie_list->SupportedRatesLen; - - RTMPSetSupportMCS(pAd, OPMODE_AP, pEntry, ie_list->SupportedRates, - ie_list->SupportedRatesLen, NULL, 0, -#ifdef DOT11_VHT_AC - ie_list->vht_cap_len, &ie_list->vht_cap, -#endif /* DOT11_VHT_AC */ - &ie_list->HTCapability, ie_list->ht_cap_len); - - /* 2. qualify this STA's auth_asoc status in the MAC table, decide StatusCode */ - StatusCode = APBuildAssociation(pAd, pEntry, ie_list, MaxSupportedRate, - &Aid, isReassoc); -#ifdef WAPP_SUPPORT - if (StatusCode != MLME_SUCCESS) - wapp_assoc_fail = MLME_UNABLE_HANDLE_STA; -#endif /* WAPP_SUPPORT */ - - /*is status is success ,update STARec*/ - if (StatusCode == MLME_SUCCESS && (pEntry->Sst == SST_ASSOC)) { - if (wdev_do_conn_act(pEntry->wdev, pEntry) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():connect action fail!!\n", __func__)); - } - } - -#ifdef DOT11R_FT_SUPPORT - - if (pEntry->func_tb_idx < pAd->ApCfg.BssidNum) { - pFtCfg = &(wdev->FtCfg); - - if ((pFtCfg->FtCapFlag.Dot11rFtEnable) && - (StatusCode == MLME_SUCCESS)) - StatusCode = - FT_AssocReqHandler(pAd, isReassoc, pFtCfg, - pEntry, &ie_list->FtInfo, - FtInfoBuf); - -#ifdef WAPP_SUPPORT - if (StatusCode != MLME_SUCCESS) - wapp_assoc_fail = FT_ERROR; -#endif /* WAPP_SUPPORT */ - - /* just silencely discard this frame */ - if (StatusCode == 0xFFFF) - goto LabelOK; - } - -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - - if ((pEntry->func_tb_idx < pAd->ApCfg.BssidNum) && IS_RRM_ENABLE(wdev)) - pEntry->RrmEnCap.word = ie_list->RrmEnCap.word; - -#endif /* DOT11K_RRM_SUPPORT */ -#ifdef DOT11_VHT_AC - - if (ie_list->vht_cap_len) { - /* +++Add by shiang for debug */ - if (WMODE_CAP_AC(wdev->PhyMode)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Peer is VHT capable device!\n", - __func__)); - NdisMoveMemory(&pEntry->ext_cap, &ie_list->ExtCapInfo, - sizeof(ie_list->ExtCapInfo)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("\tOperatingModeNotification=%d\n", - pEntry->ext_cap.operating_mode_notification)); - /* dump_vht_cap(pAd, &ie_list->vht_cap); */ - } - - /* ---Add by shiang for debug */ - } - -#endif /* DOT11_VHT_AC */ - - if (StatusCode == MLME_ASSOC_REJ_DATA_RATE) - RTMPSendWirelessEvent(pAd, IW_STA_MODE_EVENT_FLAG, pEntry->Addr, - wdev->wdev_idx, 0); - -#ifdef IGMP_TVM_SUPPORT - if (IS_IGMP_TVM_MODE_EN(pEntry->wdev->IsTVModeEnable)) { - /* Check whether the Peer has TV IE or not, because this needs to be set to */ - /* FW to enable/disabled Mcast Packet cloning and conversion */ - if (ie_list->tvm_ie.len == IGMP_TVM_IE_LENGTH) { - if (ie_list->tvm_ie.data.field.TVMode == - IGMP_TVM_IE_MODE_ENABLE) - pEntry->TVMode = IGMP_TVM_IE_MODE_ENABLE; - else - pEntry->TVMode = IGMP_TVM_IE_MODE_AUTO; - } else { - pEntry->TVMode = IGMP_TVM_IE_MODE_DISABLE; - } - } else { - pEntry->TVMode = IGMP_TVM_IE_MODE_DISABLE; - } -#endif /* IGMP_TVM_SUPPORT */ - -SendAssocResponse: - - /* 3. send Association Response */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - goto LabelOK; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s - Send %s response (Status=%d)...\n", sAssoc, sAssoc, - StatusCode)); - Aid |= 0xc000; /* 2 most significant bits should be ON */ - SubType = isReassoc ? SUBTYPE_REASSOC_RSP : SUBTYPE_ASSOC_RSP; - CapabilityInfoForAssocResp = - pMbss->CapabilityInfo; /*use AP's cability */ -#ifdef WSC_AP_SUPPORT -#ifdef WSC_V2_SUPPORT - - if ((wsc_ctrl->WscV2Info.bEnableWpsV2) && - (wsc_ctrl->WscV2Info.bWpsEnable == FALSE)) - ; - else -#endif /* WSC_V2_SUPPORT */ - { - if ((wsc_ctrl->WscConfMode != WSC_DISABLE) && - (ie_list->CapabilityInfo & 0x0010)) - CapabilityInfoForAssocResp |= 0x0010; - } - -#endif /* WSC_AP_SUPPORT */ - /* fail in ACL checking => send an Assoc-Fail resp. */ - SupRateLen = rate->SupRateLen; - - /* TODO: need to check rate in support rate element, not number */ - if (FlgIs11bSta == 1) - SupRateLen = 4; - - if (bACLReject == TRUE || bAssocSkip -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - || bBlReject == TRUE -#endif - ) { - MgtMacHeaderInit(pAd, &AssocRspHdr, SubType, 0, ie_list->Addr2, - wdev->if_addr, wdev->bssid); - StatusCode = MLME_UNSPECIFY_FAIL; -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_UNSPECIFY_FAILURE; -#endif /* WAPP_SUPPORT */ - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &AssocRspHdr, 2, &CapabilityInfoForAssocResp, - 2, &StatusCode, 2, &Aid, END_OF_ARGS); - FrameLen += build_support_rate_ie( - wdev, rate->SupRate, SupRateLen, pOutBuffer + FrameLen); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory((PVOID)pOutBuffer); - RTMPSendWirelessEvent(pAd, IW_MAC_FILTER_LIST_EVENT_FLAG, - ie_list->Addr2, wdev->wdev_idx, 0); -#ifdef WSC_V2_SUPPORT - - /* If this STA exists, delete it. */ - if (pEntry) - MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); - -#endif /* WSC_V2_SUPPORT */ - - if (bAssocSkip == TRUE) { - pEntry = MacTableLookup(pAd, ie_list->Addr2); - - if (pEntry) - MacTableDeleteEntry(pAd, pEntry->wcid, - pEntry->Addr); - } - - goto LabelOK; - } - - MgtMacHeaderInit(pAd, &AssocRspHdr, SubType, 0, ie_list->Addr2, - wdev->if_addr, wdev->bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &AssocRspHdr, 2, &CapabilityInfoForAssocResp, 2, - &StatusCode, 2, &Aid, END_OF_ARGS); - FrameLen += build_support_rate_ie(wdev, rate->SupRate, SupRateLen, - pOutBuffer + FrameLen); - - if (FlgIs11bSta == FALSE) - FrameLen += build_support_ext_rate_ie(wdev, SupRateLen, - rate->ExtRate, - rate->ExtRateLen, - pOutBuffer + FrameLen); - -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd)) { - pEntry->DevPeerRole = ie_list->MAP_AttriValue; -#ifdef MAP_R2 - pEntry->profile = ie_list->MAP_ProfileValue; -#endif - if ((IS_MAP_TURNKEY_ENABLE(pAd)) && - (((pEntry->DevPeerRole & BIT(MAP_ROLE_BACKHAUL_STA)) && - (wdev->MAPCfg.DevOwnRole & BIT(MAP_ROLE_BACKHAUL_BSS)) && - !(is_controller_found(wdev))) || - ((!ie_list->MAP_AttriValue) && - (!(wdev->MAPCfg.DevOwnRole & - BIT(MAP_ROLE_FRONTHAUL_BSS)))))) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("disallowing connection, DevOwnRole=%u,DevPeerRole=%u,controller=%d\n", - wdev->MAPCfg.DevOwnRole, pEntry->DevPeerRole, - is_controller_found(wdev))); - MlmeDeAuthAction(pAd, pEntry, REASON_DECLINED, FALSE); - goto LabelOK; - } else - MAP_InsertMapCapIE(pAd, wdev, pOutBuffer + FrameLen, - &FrameLen); - } -#endif /* CONFIG_MAP_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT - - if (IS_RRM_ENABLE(wdev)) - RRM_InsertRRMEnCapIE(pAd, pOutBuffer + FrameLen, &FrameLen, - pEntry->func_tb_idx); - -#endif /* DOT11K_RRM_SUPPORT */ - - /* add WMM IE here */ - /* printk("%s()=>bWmmCapable=%d,CLINE=%d\n",__FUNCTION__,wdev->bWmmCapable,CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)); */ - - if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)) { - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_wmm_cap_ie(pAd, &ie_info); - } - -#ifdef DOT11W_PMF_SUPPORT - - if (StatusCode == MLME_ASSOC_REJ_TEMPORARILY) { - ULONG TmpLen; - UCHAR IEType = IE_TIMEOUT_INTERVAL; /* IE:0x15 */ - UCHAR IELen = 5; - UCHAR TIType = 3; - UINT32 units = 1 << 10; /* 1 seconds, should be 0x3E8 */ - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &IEType, 1, - &IELen, 1, &TIType, 4, &units, END_OF_ARGS); - FrameLen += TmpLen; - } - -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - /* HT capability in AssocRsp frame. */ - if ((ie_list->ht_cap_len > 0) && WMODE_CAP_N(wdev->PhyMode) && - (wdev->DesiredHtPhyInfo.bHtEnable)) { -#ifdef DOT11_VHT_AC - struct _build_ie_info vht_ie_info; -#endif /* DOT11_VHT_AC */ - - ie_info.is_draft_n_type = FALSE; - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_ht_ies(pAd, &ie_info); - - if ((ie_list->vendor_ie.ra_cap) == 0 || - (pAd->bBroadComHT == TRUE)) { - ie_info.is_draft_n_type = TRUE; - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_ht_ies(pAd, &ie_info); - } -#ifdef DOT11_VHT_AC - vht_ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - vht_ie_info.frame_subtype = SUBTYPE_ASSOC_RSP; - vht_ie_info.channel = wdev->channel; - vht_ie_info.phy_mode = wdev->PhyMode; - vht_ie_info.wdev = wdev; -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - ucETxBfCap = wlan_config_get_etxbf(wdev); - - if (HcIsBfCapSupport(wdev) == FALSE) - wlan_config_set_etxbf(wdev, SUBF_OFF); - -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ - FrameLen += build_vht_ies(pAd, &vht_ie_info); -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - wlan_config_set_etxbf(wdev, ucETxBfCap); -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ -#endif /* DOT11_VHT_AC */ - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef CONFIG_HOTSPOT_R2 - /* qosmap IE */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("entry wcid %d QosMapSupport=%d\n", pEntry->wcid, - pEntry->QosMapSupport)); - - if (pEntry->QosMapSupport) { - ULONG TmpLen; - UCHAR QosMapIE, ielen = 0, explen = 0; - PHOTSPOT_CTRL pHSCtrl = - &pAd->ApCfg.MBSSID[pEntry->apidx].HotSpotCtrl; - - if (pHSCtrl->QosMapEnable) { - QosMapIE = IE_QOS_MAP_SET; - - /* Fixed field Dscp range:16, len:1 IE_ID:1*/ - if (pHSCtrl->QosMapSetIELen > 18) - explen = pHSCtrl->QosMapSetIELen - 18; - - pEntry->DscpExceptionCount = explen; - memcpy((UCHAR *)pEntry->DscpRange, - (UCHAR *)pHSCtrl->DscpRange, 16); - memcpy((UCHAR *)pEntry->DscpException, - (UCHAR *)pHSCtrl->DscpException, 42); - ielen = explen + 16; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &QosMapIE, 1, &ielen, explen, - pEntry->DscpException, 16, - pEntry->DscpRange, END_OF_ARGS); - FrameLen += TmpLen; - } - } - -#endif /* CONFIG_HOTSPOT_R2 */ - - if (IS_AKM_OWE_Entry(pEntry)) { - CHAR rsne_idx; - ULONG TmpLen; - struct _SECURITY_CONFIG *pSecConfig = &pEntry->SecConfig; - /*struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig;*/ - - WPAMakeRSNIE(wdev->wdev_type, pSecConfig, pEntry); - - for (rsne_idx = 0; rsne_idx < SEC_RSNIE_NUM; rsne_idx++) { - if (pSecConfig->RSNE_Type[rsne_idx] == SEC_RSNIE_NONE) - continue; - - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, 1, - &pSecConfig->RSNE_EID[rsne_idx][0], 1, - &pSecConfig->RSNE_Len[rsne_idx], - pSecConfig->RSNE_Len[rsne_idx], - &pSecConfig->RSNE_Content[rsne_idx][0], - END_OF_ARGS); - FrameLen += TmpLen; - } - } - - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_extended_cap_ie(pAd, &ie_info); -#ifdef CONFIG_DOT11V_WNM - /* #ifdef CONFIG_HOTSPOT_R2 Remove for WNM independance */ - if (ie_list->ExtCapInfo.BssTransitionManmt == 1) { - pEntry->bBSSMantSTASupport = TRUE; - } -#endif /* CONFIG_DOT11V_WNM */ - - /* add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back */ - FrameLen += build_vendor_ie(pAd, wdev, (pOutBuffer + FrameLen), - VIE_ASSOC_RESP); - -#ifdef MBO_SUPPORT - if (IS_MBO_ENABLE(wdev) -#ifdef OCE_SUPPORT - || IS_OCE_ENABLE(wdev) -#endif /* OCE_SUPPORT */ - ) - MakeMboOceIE(pAd, wdev, pEntry, pOutBuffer + FrameLen, - &FrameLen, MBO_FRAME_TYPE_ASSOC_RSP); -#endif /* MBO_SUPPORT */ - -#ifdef WSC_AP_SUPPORT -#ifndef RT_CFG80211_SUPPORT - - if (pEntry->bWscCapable) { - UCHAR *pWscBuf = NULL, WscIeLen = 0; - ULONG WscTmpLen = 0; - - os_alloc_mem(NULL, (UCHAR **)&pWscBuf, 512); - - if (pWscBuf) { - NdisZeroMemory(pWscBuf, 512); - WscBuildAssocRespIE(pAd, pEntry->func_tb_idx, 0, - pWscBuf, &WscIeLen); - MakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen, - WscIeLen, pWscBuf, END_OF_ARGS); - FrameLen += WscTmpLen; - os_free_mem(pWscBuf); - } - } - -#endif /* RT_CFG80211_SUPPORT */ -#endif /* WSC_AP_SUPPORT */ - -#ifdef RT_CFG80211_SUPPORT - - /* Append extra IEs provided by wpa_supplicant */ - if (pAd->ApCfg.MBSSID[pEntry->apidx].AssocRespExtraIeLen) { - ULONG TmpLen = 0; - INT32 IesLen = - pAd->ApCfg.MBSSID[pEntry->apidx].AssocRespExtraIeLen; - UCHAR *Ies = pAd->ApCfg.MBSSID[pEntry->apidx].AssocRespExtraIe; - - if (RTMPIsValidIEs(Ies, IesLen)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AssocRespExtraIE Added (Len=%d)\n", IesLen)); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - IesLen, Ies, END_OF_ARGS); - FrameLen += TmpLen; - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AssocRespExtraIE len incorrect!\n")); - } - -#endif /* RT_CFG80211_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - - if ((pFtCfg != NULL) && (pFtCfg->FtCapFlag.Dot11rFtEnable)) { - PUINT8 mdie_ptr; - UINT8 mdie_len; - PUINT8 ftie_ptr = NULL; - UINT8 ftie_len = 0; - PUINT8 ricie_ptr = NULL; - UINT8 ricie_len = 0; - struct _SECURITY_CONFIG *pSecConfig = &pEntry->SecConfig; - - /* Insert RSNIE if necessary */ - if (FtInfoBuf->RSNIE_Len != 0) { - ULONG TmpLen; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - FtInfoBuf->RSNIE_Len, - FtInfoBuf->RSN_IE, END_OF_ARGS); - FrameLen += TmpLen; - } - - /* Insert MDIE. */ - mdie_ptr = pOutBuffer + FrameLen; - mdie_len = 5; - /* Insert MdId only if the Peer has sent one */ - if (FtInfoBuf->MdIeInfo.Len != 0) { - FT_InsertMdIE(pAd, pOutBuffer + FrameLen, &FrameLen, - FtInfoBuf->MdIeInfo.MdId, - FtInfoBuf->MdIeInfo.FtCapPlc); - } - /* Insert FTIE. */ - if (FtInfoBuf->FtIeInfo.Len != 0) { - ftie_ptr = pOutBuffer + FrameLen; - ftie_len = (2 + FtInfoBuf->FtIeInfo.Len); - FT_InsertFTIE(pAd, pOutBuffer + FrameLen, &FrameLen, - FtInfoBuf->FtIeInfo.Len, - FtInfoBuf->FtIeInfo.MICCtr, - FtInfoBuf->FtIeInfo.MIC, - FtInfoBuf->FtIeInfo.ANonce, - FtInfoBuf->FtIeInfo.SNonce); - } - - /* Insert R1KH IE into FTIE. */ - if (FtInfoBuf->FtIeInfo.R1khIdLen != 0) - FT_FTIE_InsertKhIdSubIE(pAd, pOutBuffer + FrameLen, - &FrameLen, FT_R1KH_ID, - FtInfoBuf->FtIeInfo.R1khId, - FtInfoBuf->FtIeInfo.R1khIdLen); - - /* Insert GTK Key info into FTIE. */ - if (FtInfoBuf->FtIeInfo.GtkLen != 0) - FT_FTIE_InsertGTKSubIE(pAd, pOutBuffer + FrameLen, - &FrameLen, - FtInfoBuf->FtIeInfo.GtkSubIE, - FtInfoBuf->FtIeInfo.GtkLen); - - /* Insert R0KH IE into FTIE. */ - if (FtInfoBuf->FtIeInfo.R0khIdLen != 0) - FT_FTIE_InsertKhIdSubIE(pAd, pOutBuffer + FrameLen, - &FrameLen, FT_R0KH_ID, - FtInfoBuf->FtIeInfo.R0khId, - FtInfoBuf->FtIeInfo.R0khIdLen); - - /* Insert IGTK Key info into FTIE. */ - - if (FtInfoBuf->FtIeInfo.IGtkLen != 0) { - FT_FTIE_InsertIGTKSubIE(pAd, pOutBuffer + FrameLen, - &FrameLen, - FtInfoBuf->FtIeInfo.IGtkSubIE, - FtInfoBuf->FtIeInfo.IGtkLen); - } - - /* Insert RIC. */ - if (ie_list->FtInfo.RicInfo.Len) { - ULONG TempLen; - - FT_RIC_ResourceRequestHandle( - pAd, pEntry, - (PUCHAR)ie_list->FtInfo.RicInfo.pRicInfo, - ie_list->FtInfo.RicInfo.Len, - (PUCHAR)pOutBuffer + FrameLen, - (PUINT32)&TempLen); - ricie_ptr = (PUCHAR)(pOutBuffer + FrameLen); - ricie_len = TempLen; - FrameLen += TempLen; - } - - /* Calculate the FT MIC for FT procedure */ - if (FtInfoBuf->FtIeInfo.MICCtr.field.IECnt) { - UINT8 ft_mic[FT_MIC_LEN]; - PFT_FTIE pFtIe; - - FT_CalculateMIC(pEntry->Addr, wdev->bssid, - pEntry->FT_PTK, 6, FtInfoBuf->RSN_IE, - FtInfoBuf->RSNIE_Len, mdie_ptr, - mdie_len, ftie_ptr, ftie_len, ricie_ptr, - ricie_len, ft_mic); - /* Update the MIC field of FTIE */ - pFtIe = (PFT_FTIE)(ftie_ptr + 2); - NdisMoveMemory(pFtIe->MIC, ft_mic, FT_MIC_LEN); - /* Install pairwise key */ -#ifdef MBO_SUPPORT - /* YF_FT */ - if (IS_MBO_ENABLE(wdev)) - /* update STA bssid & security info to daemon */ - MboIndicateStaBssidInfo(pAd, wdev, - pEntry->Addr); -#endif /* MBO_SUPPORT */ - pSecConfig->Handshake.GTKState = REKEY_ESTABLISHED; - pSecConfig->Handshake.WpaState = AS_PTKINITDONE; - pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; - WifiSysUpdatePortSecur(pAd, pEntry, NULL); - } - - /* Record the MDIE & FTIE of (re)association response of - Initial Mobility Domain Association. It's used in - FT 4-Way handshaking */ - if ((IS_AKM_WPA2_Entry(pEntry) || - IS_AKM_WPA2PSK_Entry(pEntry) || - IS_AKM_WPA3PSK_Entry(pEntry) || - IS_AKM_WPA3_192BIT_Entry(pEntry)) && - ie_list->FtInfo.FtIeInfo.Len == 0) { - NdisMoveMemory(&pEntry->InitialMDIE, mdie_ptr, - mdie_len); - pEntry->InitialFTIE_Len = ftie_len; - NdisMoveMemory(pEntry->InitialFTIE, ftie_ptr, ftie_len); - } - } - -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef OCE_FILS_SUPPORT - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += oce_build_ies(pAd, &ie_info, TRUE); -#endif /*OCE_FILS_SUPPORT */ - - FrameLen += build_rsnxe_ie(&wdev->SecConfig, - (UCHAR *)pOutBuffer + FrameLen); - -#ifdef CONFIG_OWE_SUPPORT - if (IS_AKM_OWE_Entry(pEntry) && (StatusCode == MLME_SUCCESS)) { - BOOLEAN need_ecdh_ie = FALSE; - INT CacheIdx; /* Key cache */ - UINT8 *pmkid = NULL; - UINT8 pmkid_count = 0; - - pmkid = WPA_ExtractSuiteFromRSNIE(ie_list->RSN_IE, - ie_list->RSNIE_Len, - PMKID_LIST, &pmkid_count); - if (pmkid != NULL) { - CacheIdx = RTMPSearchPMKIDCache(&pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, - pEntry->Addr); - if ((CacheIdx == -1) || - ((RTMPEqualMemory(pmkid, - &pAd->ApCfg.PMKIDCache - .BSSIDInfo[CacheIdx] - .PMKID, - LEN_PMKID)) == 0)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: AKM_OWE_Entry PMKID not found, do normal ECDH procedure\n", - __func__)); - need_ecdh_ie = TRUE; - } - } else - need_ecdh_ie = TRUE; - - if (need_ecdh_ie == TRUE) { - FrameLen += build_owe_dh_ie( - pAd, pEntry, (UCHAR *)pOutBuffer + FrameLen, - pEntry->SecConfig.owe.last_try_group); - } - } -#endif /*CONFIG_OWE_SUPPORT*/ - -#ifdef IGMP_TVM_SUPPORT - /* ADD TV IE to this packet */ - MakeTVMIE(pAd, wdev, pOutBuffer, &FrameLen); -#endif /* IGMP_TVM_SUPPORT*/ - -#ifdef OCE_FILS_SUPPORT - if (StatusCode == MLME_SUCCESS && (pEntry->Sst == SST_ASSOC)) { - if ((pEntry->filsInfo.auth_algo == AUTH_MODE_FILS) && - IS_AKM_FILS(wdev->SecConfig.AKMMap) && - IS_AKM_FILS(pEntry->SecConfig.AKMMap)) { - struct fils_info *filsInfo = &pEntry->filsInfo; - PFRAME_802_11 Fr = (PFRAME_802_11)Elem->Msg; - - if (!filsInfo->is_pending_assoc) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("STA - %02x:%02x:%02x:%02x:%02x:%02x do FILS assoc with Pending\n", - PRINT_MAC(ie_list->Addr2))); - - if (filsInfo->pending_ie) { - os_free_mem(filsInfo->pending_ie); - filsInfo->pending_ie_len = 0; - filsInfo->pending_ie = NULL; - } - - if (filsInfo->extra_ie) { - os_free_mem(filsInfo->extra_ie); - filsInfo->extra_ie_len = 0; - filsInfo->extra_ie = NULL; - } - - filsInfo->pending_ie_len = Elem->MsgLen; - os_alloc_mem(NULL, - (UCHAR **)&filsInfo->pending_ie, - filsInfo->pending_ie_len); - if (!filsInfo->pending_ie) - goto LabelOK; - - NdisMoveMemory(filsInfo->pending_ie, Elem->Msg, - filsInfo->pending_ie_len); - - filsInfo->extra_ie_len = FrameLen; - os_alloc_mem(NULL, - (UCHAR **)&filsInfo->extra_ie, - filsInfo->extra_ie_len); - if (!filsInfo->extra_ie) { - goto LabelOK; - } - NdisMoveMemory(filsInfo->extra_ie, pOutBuffer, - filsInfo->extra_ie_len); - - NdisMoveMemory(&filsInfo->rssi_info, - &Elem->rssi_info, - sizeof(struct raw_rssi_info)); - if (isReassoc) - filsInfo->pending_action = - APPeerReassocReqAction; - else - filsInfo->pending_action = - APPeerAssocReqAction; - - filsInfo->is_pending_assoc = TRUE; - filsInfo->last_pending_id = Fr->Hdr.Sequence; - - DOT1X_InternalCmdAction(pAd, pEntry, - DOT1X_MLME_EVENT); - goto free_check; - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("STA - %02x:%02x:%02x:%02x:%02x:%02x skip FILS assoc in Pending\n", - PRINT_MAC(ie_list->Addr2))); - goto free_check; - } - } - } -#endif /* OCE_FILS_SUPPORT */ - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory((PVOID)pOutBuffer); - -#ifdef OCE_FILS_SUPPORT -assoc_post: -#endif /* OCE_FILS_SUPPORT */ - -#ifdef DOT11W_PMF_SUPPORT - - if (StatusCode == MLME_ASSOC_REJ_TEMPORARILY) - PMF_MlmeSAQueryReq(pAd, pEntry); - -#endif /* DOT11W_PMF_SUPPORT */ - - /* set up BA session */ - if (StatusCode == MLME_SUCCESS) { - pEntry->PsMode = PWR_ACTIVE; - /* TODO: shiang-usw, we need to rmove upper setting and migrate to tr_entry->PsMode */ - pAd->MacTab.tr_entry[pEntry->wcid].PsMode = PWR_ACTIVE; - MSDU_FORBID_CLEAR(wdev, MSDU_FORBID_CONNECTION_NOT_READY); -#ifdef IAPP_SUPPORT - /*PFRAME_802_11 Fr = (PFRAME_802_11)Elem->Msg; */ - /* POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; */ - { - /* send association ok message to IAPPD */ - IAPP_L2_Update_Frame_Send(pAd, pEntry->Addr, - pEntry->wdev->wdev_idx); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("####### Send L2 Frame Mac=%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pEntry->Addr))); - } - - /* SendSingalToDaemon(SIGUSR2, pObj->IappPid); */ -#ifdef DOT11R_FT_SUPPORT - { - /* - Do not do any check here. - We need to send MOVE-Req frame to AP1 even open mode. - */ - if (IS_FT_RSN_STA(pEntry) && - (ie_list->FtInfo.FtIeInfo.Len != 0)) { - if (isReassoc == 1) { - /* only for reassociation frame */ - FT_KDP_EVT_REASSOC EvtReAssoc; - - EvtReAssoc.SeqNum = 0; - NdisMoveMemory(EvtReAssoc.MacAddr, - pEntry->Addr, - MAC_ADDR_LEN); - NdisMoveMemory(EvtReAssoc.OldApMacAddr, - ie_list->ApAddr, - MAC_ADDR_LEN); - FT_KDP_EVENT_INFORM( - pAd, pEntry->func_tb_idx, - FT_KDP_SIG_FT_REASSOCIATION, - &EvtReAssoc, sizeof(EvtReAssoc), - NULL); - } - } - } - -#endif /* DOT11R_FT_SUPPORT */ -#endif /* IAPP_SUPPORT */ - /* ap_assoc_info_debugshow(pAd, isReassoc, pEntry, ie_list); */ - /* send wireless event - for association */ -#ifdef VENDOR_FEATURE7_SUPPORT - /* Passed in the pEntry->apindx argument */ - RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pEntry->Addr, - pEntry->func_tb_idx, 0); -#else - RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pEntry->Addr, 0, - 0); -#endif - /* This is a reassociation procedure */ - pEntry->IsReassocSta = isReassoc; - /* clear txBA bitmap */ - pEntry->TXBAbitmap = 0; - - if (pEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX) { - CLIENT_STATUS_SET_FLAG(pEntry, - fCLIENT_STATUS_WMM_CAPABLE); - - if ((wdev->channel <= 14) && - addht->AddHtInfo.ExtChanOffset && - (ie_list->HTCapability.HtCapInfo.ChannelWidth == - BW_40)) - SendBeaconRequest(pAd, pEntry->wcid); - - ba_ori_session_setup(pAd, pEntry, 5, 0, 10, FALSE); - } - -#ifdef DOT11R_FT_SUPPORT - - /* If the length of FTIE field of the (re)association-request frame - is larger than zero, it shall indicate the Fast-BSS transition is in progress. */ - if (ie_list->FtInfo.FtIeInfo.Len > 0) - ; - else -#endif /* DOT11R_FT_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT - if (TRUE) { /*CFG_TODO*/ - /* need to update pEntry to inform later flow to keep ConnectionState in connected */ - pEntry->bWscCapable = ie_list->bWscCapable; - { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("SINGLE CFG: NOITFY ASSOCIATED, pEntry->bWscCapable:%d\n", - pEntry->bWscCapable)); -#ifdef RT_CFG80211_SUPPORT - CFG80211OS_NewSta(pEntry->wdev->if_dev, - ie_list->Addr2, - (PUCHAR)Elem->Msg, - Elem->MsgLen, isReassoc); -#endif - - if (IS_CIPHER_WEP( - pEntry->SecConfig.PairwiseCipher)) { - ASIC_SEC_INFO *Info; - os_alloc_mem(pAd, (UCHAR **)&Info, - sizeof(ASIC_SEC_INFO)); - if (Info == NULL) { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): mem alloc failed\n", - __func__)); -#ifdef WAPP_SUPPORT - wapp_assoc_fail = - MLME_NO_RESOURCE; -#endif /* WAPP_SUPPORT */ - goto assoc_check; - } - os_zero_mem(Info, - sizeof(ASIC_SEC_INFO)); - - /* Set key material to Asic */ - Info->Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - Info->Direction = SEC_ASIC_KEY_BOTH; - Info->Wcid = pEntry->wcid; - Info->BssIndex = pEntry->func_tb_idx; - Info->KeyIdx = - pEntry->SecConfig.PairwiseKeyId; - Info->Cipher = - pEntry->SecConfig.PairwiseCipher; - Info->KeyIdx = - pEntry->SecConfig.PairwiseKeyId; - os_move_mem( - &Info->Key, - &pEntry->SecConfig.WepKey - [pEntry->SecConfig - .PairwiseKeyId], - sizeof(SEC_KEY_INFO)); - os_move_mem(&Info->PeerAddr[0], - pEntry->Addr, MAC_ADDR_LEN); - HW_ADDREMOVE_KEYTABLE(pAd, Info); - - os_free_mem(Info); - } - } - - hex_dump("ASSOC_REQ", Elem->Msg, Elem->MsgLen); - } else -#endif - /* enqueue a EAPOL_START message to trigger EAP state machine doing the authentication */ - if (IS_AKM_PSK_Entry(pEntry)) { - INT cacheidx; - - if (is_rsne_pmkid_cache_match( - ie_list->RSN_IE, ie_list->RSNIE_Len, - &pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, pEntry->Addr, - &cacheidx)) { - store_pmkid_cache_in_sec_config( - pAd, pEntry, cacheidx); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ASSOC - CacheIdx = %d\n", - cacheidx)); - } - -#ifdef WSC_AP_SUPPORT - /* - * In WPA-PSK mode, - * If Association Request of station has RSN/SSN, - * WPS AP Must Not send EAP-Request/Identity to station - * no matter WPS AP does receive EAPoL-Start from STA or not. - * Marvell WPS test bed(v2.1.1.5) will send AssocReq with WPS IE and RSN/SSN IE. - */ - if (pEntry->bWscCapable || - (ie_list->RSNIE_Len == 0)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ASSOC - IF(ra%d) This is a WPS Client.\n\n", - pEntry->func_tb_idx)); - goto LabelOK; - } else { - pEntry->bWscCapable = FALSE; - pEntry->Receive_EapolStart_EapRspId = - (WSC_ENTRY_GET_EAPOL_START | - WSC_ENTRY_GET_EAP_RSP_ID); - /* This STA is not a WPS STA */ - NdisZeroMemory(wsc_ctrl->EntryAddr, 6); - } - -#endif /* WSC_AP_SUPPORT */ - /* Enqueue a EAPOL-start message with the pEntry for WPAPSK State Machine */ - if (1 -#ifdef HOSTAPD_SUPPORT - && wdev->Hostapd == Hostapd_Disable -#endif /*HOSTAPD_SUPPORT*/ -#ifdef WSC_AP_SUPPORT - && !pEntry->bWscCapable -#endif /* WSC_AP_SUPPORT */ - ) { - /* Enqueue a EAPOL-start message with the pEntry */ - os_move_mem(&pEntry->SecConfig.Handshake - .AAddr, - wdev->bssid, MAC_ADDR_LEN); - os_move_mem(&pEntry->SecConfig.Handshake - .SAddr, - pEntry->Addr, MAC_ADDR_LEN); - - if (!IS_AKM_WPA3PSK( - pEntry->SecConfig.AKMMap) && -#ifdef DPP_SUPPORT - !(IS_AKM_DPP( - pEntry->SecConfig.AKMMap)) && -#endif /* DPP_SUPPORT */ - !(IS_AKM_OWE( - pEntry->SecConfig.AKMMap))) - os_move_mem( - &pEntry->SecConfig.PMK, - &wdev->SecConfig.PMK, - LEN_PMK); - - RTMPSetTimer( - &pEntry->SecConfig - .StartFor4WayTimer, - ENQUEUE_EAPOL_START_TIMER); - } - } -#ifdef DOT1X_SUPPORT - else if (IS_AKM_WPA2_Entry(pEntry) || - IS_AKM_WPA3_192BIT_Entry(pEntry)) { - INT cacheidx; - if (is_rsne_pmkid_cache_match( - ie_list->RSN_IE, ie_list->RSNIE_Len, - &pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, pEntry->Addr, - &cacheidx)) - process_pmkid(pAd, wdev, pEntry, - cacheidx); - } else if (IS_AKM_1X_Entry(pEntry) || - (IS_IEEE8021X(&pEntry->SecConfig) -#ifdef WSC_AP_SUPPORT - && (!pEntry->bWscCapable) -#endif /* WSC_AP_SUPPORT */ - )) { - /* Enqueue a EAPOL-start message to trigger EAP SM */ - if (pEntry->EnqueueEapolStartTimerRunning == - EAPOL_START_DISABLE -#ifdef HOSTAPD_SUPPORT - && wdev->Hostapd == Hostapd_Disable -#endif /*HOSTAPD_SUPPORT*/ - ) { - pEntry->EnqueueEapolStartTimerRunning = - EAPOL_START_1X; - RTMPSetTimer( - &pEntry->SecConfig - .StartFor4WayTimer, - ENQUEUE_EAPOL_START_TIMER); - } - } - -#endif /* DOT1X_SUPPORT */ - -#if defined(MWDS) || defined(CONFIG_MAP_SUPPORT) || defined(WAPP_SUPPORT) - if (tr_entry && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) { -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - map_a4_peer_enable(pAd, pEntry, TRUE); -#endif /* CONFIG_MAP_SUPPORT */ -#ifdef WAPP_SUPPORT - wapp_send_cli_join_event(pAd, pEntry); -#endif - } -#endif -#ifdef SMART_ANTENNA - { - unsigned long irqflags; - /* Check if need to reset the sa training procedures to init stage! */ - RTMP_IRQ_LOCK(&pAd->smartAntLock, irqflags); - - if (RTMP_SA_WORK_ON(pAd)) { - /* sa_add_train_entry(pAd, &pEntry->Addr[0], FALSE); */ - pAd->pSAParam->bStaChange = TRUE; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s():sta(%02x:%02x:%02x:%02x:%02x:%02x) add!\n", - __func__, PRINT_MAC(pEntry->Addr))); - } - - RTMP_IRQ_UNLOCK(&pAd->smartAntLock, irqflags); - } -#endif /* SMART_ANTENNA // */ -#ifdef GREENAP_SUPPORT - - if (greenap_get_capability(greenap) && - greenap_get_allow_status(greenap)) { - if (StatusCode == MLME_SUCCESS && - (pEntry->Sst == SST_ASSOC)) - greenap_check_peer_connection_at_link_up_down( - pAd, wdev, greenap); - } - -#endif /* GREENAP_SUPPORT */ -#ifdef CONFIG_HOTSPOT_R2 - - /* add to cr4 pool */ - if (pEntry->QosMapSupport) { - PHOTSPOT_CTRL pHSCtrl = - &pAd->ApCfg.MBSSID[pEntry->apidx].HotSpotCtrl; - - if (pHSCtrl->QosMapEnable) { - if (!pHSCtrl->QosMapAddToPool) { - pHSCtrl->QosMapAddToPool = TRUE; - pHSCtrl->QosMapPoolID = - hotspot_qosmap_add_pool(pAd, - pEntry); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("add current MBSS qosmap to CR4\n")); - } - - hotspot_qosmap_update_sta_mapping_to_cr4( - pAd, pEntry, pHSCtrl->QosMapPoolID); - } - } - -#endif /* CONFIG_HOTSPOT_R2 */ -#ifdef DSCP_QOS_MAP_SUPPORT - if (CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_WMM_CAPABLE)) { - if (pMbss->DscpQosMapEnable) { - pEntry->PoolId = pMbss->DscpQosPoolId; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[DSCP-QOS-MAP] update sta mapping to CR4 for Pool %d wcid %d", - pEntry->PoolId, pEntry->wcid)); - dscp_qosmap_update_sta_mapping_to_cr4( - pAd, pEntry, pEntry->PoolId); - } - } -#endif - -#ifdef MBSS_AS_WDS_AP_SUPPORT - if (IS_CIPHER_NONE(wdev->SecConfig.PairwiseCipher)) { - if (IS_ENTRY_CLIENT(pEntry)) { - pEntry->bEnable4Addr = TRUE; - if (wdev->wds_enable) - HW_SET_ASIC_WCID_4ADDR_HDR_TRANS( - pAd, pEntry->wcid, TRUE); - else if (MAC_ADDR_EQUAL(pAd->ApCfg.wds_mac, - pEntry->Addr)) - HW_SET_ASIC_WCID_4ADDR_HDR_TRANS( - pAd, pEntry->wcid, TRUE); - } - } -#endif - } - -#ifdef FAST_EAPOL_WAR - /* -* Moved from WifiSysApPeerLinkUp() in open security mode. -* to make sure the STATE_PORT_SECURE flag can be polled by MU N9 module. -* then MU Action Frame sent out after Asso Resp. -*/ - if (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) { - if (!(IS_AKM_WPA_CAPABILITY_Entry(pEntry) -#ifdef DOT1X_SUPPORT - || IS_IEEE8021X(&pEntry->SecConfig) -#endif /* DOT1X_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT - || wdev->IsCFG1xWdev -#endif /* RT_CFG80211_SUPPORT */ - || pEntry->bWscCapable)) { - WifiSysUpdatePortSecur(pAd, pEntry, NULL); - } - } -#endif /* FAST_EAPOL_WAR */ -#ifdef BAND_STEERING - if ((pAd->ApCfg.BandSteering)) { - BndStrg_UpdateEntry(pAd, pEntry, ie_list, TRUE); - } -#endif - -#ifdef VENDOR_FEATURE7_SUPPORT - if (arris_event_send_hook && pEntry && (StatusCode == MLME_SUCCESS)) { - UCHAR assoc_event_msg[32] = { 0 }; - UINT32 count = 0; - UCHAR *assoc_sta_info = NULL; - HT_CAP_INFO *pHTCap = &(ie_list->HTCapability).HtCapInfo; - HT_CAP_PARM *pHTCapParm = &(ie_list->HTCapability).HtCapParm; - /* Send a WLAN_EVENT to ATOM which in turns sends an RPC - * to update our client table on the ARM. - */ - NdisZeroMemory(assoc_event_msg, sizeof(assoc_event_msg)); - if (WMODE_CAP_5G(PhyMode)) - count = snprintf( - assoc_event_msg, sizeof(assoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pEntry->Addr), - (pEntry->func_tb_idx) + WIFI_50_RADIO); - else - count = snprintf( - assoc_event_msg, sizeof(assoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pEntry->Addr), - (pEntry->func_tb_idx) + WIFI_24_RADIO); - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, WLAN_EVENT, - STA_ASSOC, assoc_event_msg, count); - - /* Log this cleint's capabilities in our nvram */ - /* assoc_sta_info = kmalloc(1300, GFP_ATOMIC); */ - os_alloc_mem(NULL, (UCHAR **)&assoc_sta_info, 1300); - if (assoc_sta_info) { - NdisZeroMemory(assoc_sta_info, 1300); - count = 0; - count += snprintf( - (assoc_sta_info + count), (1300 - count), - "Association: (%02x:%02x:%02x:%02x:%02x:%02x) --> %s%d (%s)\n", - PRINT_MAC(pEntry->Addr), INF_MAIN_DEV_NAME, - pEntry->func_tb_idx, pEntry->pMbss->Ssid); - if (pHTCap && pHTCapParm && ie_list->ht_cap_len && - WMODE_CAP_N(wdev->PhyMode)) { - count += snprintf((assoc_sta_info + count), - (1300 - count), - " Station Info:\n"); - count += snprintf( - (assoc_sta_info + count), - (1300 - count), - "\tRSSI0(%d), RSSI1(%d), Mode(%s), BW(%s), MCS(%d), SGI(%d)\n", - ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_0), - ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_1), - get_phymode_str( - pEntry->HTPhyMode.field.MODE), - get_bw_str(pEntry->HTPhyMode.field.BW), - pEntry->HTPhyMode.field.MCS, - pEntry->HTPhyMode.field.ShortGI); - } else { - count += snprintf( - (assoc_sta_info + count), - (1300 - count), - " Station Info (Legacy):\n"); - count += snprintf( - (assoc_sta_info + count), - (1300 - count), - "\tRSSI0(%d), RSSI1(%d), Mode(%s), MCS(%d)\n", - ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_0), - ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_1), - get_phymode_str( - pEntry->HTPhyMode.field.MODE), - pEntry->HTPhyMode.field.MCS); - } - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_LOG_SAVE, 0, assoc_sta_info, count); - os_free_mem(assoc_sta_info); - } - } -#endif - -LabelOK: -#ifdef RT_CFG80211_SUPPORT - - if (!((StatusCode == MLME_SUCCESS) -#ifdef DOT11W_PMF_SUPPORT - || (StatusCode == MLME_ASSOC_REJ_TEMPORARILY) -#endif /*DOT11W_PMF_SUPPORT*/ - )) - CFG80211_ApStaDelSendEvent(pAd, pEntry->Addr, - pEntry->wdev->if_dev); - -#endif /* RT_CFG80211_SUPPORT */ -assoc_check: -#ifdef WAPP_SUPPORT - if (StatusCode != MLME_SUCCESS && wapp_assoc_fail != NOT_FAILURE) - wapp_send_sta_connect_rejected(pAd, wdev, ie_list->Addr2, - ie_list->Addr1, wapp_cnnct_stage, - wapp_assoc_fail, StatusCode, 0); -#endif /* WAPP_SUPPORT */ - -#ifdef OCE_FILS_SUPPORT -free_check: -#endif /* OCE_FILS_SUPPORT */ - if (ie_list != NULL) - os_free_mem(ie_list); -#ifdef DOT11R_FT_SUPPORT - if (FtInfoBuf != NULL) - os_free_mem(FtInfoBuf); -#endif - return; -} - -/* - ========================================================================== - Description: - MLME message sanity check - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== - */ -static BOOLEAN PeerDisassocReqSanity(IN PRTMP_ADAPTER pAd, IN VOID *Msg, - IN ULONG MsgLen, OUT PUCHAR pDA, - OUT PUCHAR pAddr2, OUT UINT16 *SeqNum, - OUT USHORT *Reason) -{ - PFRAME_802_11 Fr = (PFRAME_802_11)Msg; - - COPY_MAC_ADDR(pDA, &Fr->Hdr.Addr1); - COPY_MAC_ADDR(pAddr2, &Fr->Hdr.Addr2); - *SeqNum = Fr->Hdr.Sequence; - NdisMoveMemory(Reason, &Fr->Octet[0], 2); - return TRUE; -} - -/* - ========================================================================== - Description: - left part of IEEE 802.11/1999 p.374 - Parameters: - Elem - MLME message containing the received frame - ========================================================================== - */ -VOID APPeerDisassocReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - USHORT Reason; - UINT16 SeqNum; - MAC_TABLE_ENTRY *pEntry; - struct wifi_dev *wdev; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ASSOC - 1 receive DIS-ASSOC request\n")); - - if (!PeerDisassocReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1, Addr2, - &SeqNum, &Reason)) - return; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ASSOC - receive DIS-ASSOC(seq-%d) request from %02x:%02x:%02x:%02x:%02x:%02x, reason=%d\n", - SeqNum, PRINT_MAC(Addr2), Reason)); - pEntry = MacTableLookup(pAd, Addr2); - - if (pEntry == NULL) - return; - - if (VALID_UCAST_ENTRY_WCID(pAd, Elem->Wcid)) { - wdev = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev; - - /* - iPhone sometimes sends disassoc frame which DA is old AP and BSSID is new AP. - @2016/1/26 - */ - if (!MAC_ADDR_EQUAL(wdev->if_addr, Addr1)) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ASSOC - The DA of this DIS-ASSOC request is %02x:%02x:%02x:%02x:%02x:%02x, ignore.\n", - PRINT_MAC(Addr1))); - return; - } - -#if defined(DOT1X_SUPPORT) && !defined(RADIUS_ACCOUNTING_SUPPORT) - - /* Notify 802.1x daemon to clear this sta info */ - if (IS_AKM_1X_Entry(pEntry) || IS_IEEE8021X_Entry(wdev)) - DOT1X_InternalCmdAction(pAd, pEntry, - DOT1X_DISCONNECT_ENTRY); - -#endif /* DOT1X_SUPPORT */ - /* send wireless event - for disassociation */ - RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, Addr2, 0, 0); -#ifdef VENDOR_FEATURE7_SUPPORT - { - UCHAR disassoc_event_msg[32] = { 0 }; - - if (WMODE_CAP_5G(pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.PhyMode)) - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(Addr2), - (pEntry->func_tb_idx) + WIFI_50_RADIO); - else - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(Addr2), - (pEntry->func_tb_idx) + WIFI_24_RADIO); - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_EVENT, STA_DISSOC, - disassoc_event_msg, - strlen(disassoc_event_msg)); - } -#endif - ApLogEvent(pAd, Addr2, EVENT_DISASSOCIATED); - -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_DEAUTH, - REASON_DEAUTH_STA_LEAVING); -#endif - /* printk("APPeerDisassocReqAction normal\n");*/ - if (IS_ENTRY_CLIENT(pEntry)) { -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && IS_MAP_R2_ENABLE(pAd)) - wapp_send_sta_disassoc_stats_event(pAd, pEntry, - Reason); - /* // TODO: if the port secured is not true, then send failed assoc.*/ -#endif - } - MacTableDeleteEntry(pAd, Elem->Wcid, Addr2); -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn == TRUE) { - UCHAR apCliIdx, CliIdx; - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - - pReptEntry = RTMPLookupRepeaterCliEntry(pAd, TRUE, - Addr2, TRUE); - - if (pReptEntry && (pReptEntry->CliConnectState != 0)) { - apCliIdx = pReptEntry->MatchApCliIdx; - CliIdx = pReptEntry->MatchLinkIdx; - pReptEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_AP_PEER_DISASSOC_REQ; - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, NULL, - (REPT_MLME_START_IDX + CliIdx)); - RTMP_MLME_HANDLER(pAd); - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - } -} - -#ifdef BW_VENDOR10_CUSTOM_FEATURE -BOOLEAN IsClientConnected(RTMP_ADAPTER *pAd) -{ - INT i; - PMAC_TABLE_ENTRY pEntry; - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - return TRUE; - } - - return FALSE; -} -#endif - -/* - ========================================================================== - Description: - delete it from STA and disassoc s STA - Parameters: - Elem - - ========================================================================== - */ -VOID MbssKickOutStas(RTMP_ADAPTER *pAd, INT apidx, USHORT Reason) -{ - INT i; - PMAC_TABLE_ENTRY pEntry; - -#ifdef MBO_SUPPORT - MboIndicateStaDisassocToDaemon(pAd, NULL, MBO_MSG_AP_TERMINATION); -#endif /* MBO_SUPPORT */ - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (pEntry && IS_ENTRY_CLIENT(pEntry) && - pEntry->func_tb_idx == apidx) - APMlmeKickOutSta(pAd, pEntry->Addr, pEntry->wcid, - Reason); - } - /* mbo wait for max 500ms and check all IsKeep is zero */ -#ifdef MBO_SUPPORT - MboWaitAllStaGone(pAd, apidx); -#endif /* MBO_SUPPORT */ -} - -/* - ========================================================================== - Description: - delete it from STA and disassoc s STA - Parameters: - Elem - - ========================================================================== - */ -VOID APMlmeKickOutSta(RTMP_ADAPTER *pAd, UCHAR *pStaAddr, UCHAR Wcid, - USHORT Reason) -{ - HEADER_802_11 DisassocHdr; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - NDIS_STATUS NStatus; - MAC_TABLE_ENTRY *pEntry; - UCHAR Aid; - UCHAR ApIdx; - - pEntry = MacTableLookup(pAd, pStaAddr); - - if (pEntry == NULL) - return; - - Aid = pEntry->Aid; - ApIdx = pEntry->func_tb_idx; - - if (ApIdx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid Apidx=%d\n", __func__, ApIdx)); - return; - } - - if (VALID_UCAST_ENTRY_WCID(pAd, Wcid)) { - /* send wireless event - for disassocation */ - RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, pStaAddr, 0, - 0); -#ifdef VENDOR_FEATURE7_SUPPORT - { - UCHAR disassoc_event_msg[32] = { 0 }; - - if (WMODE_CAP_5G(pAd->ApCfg.MBSSID[ApIdx].wdev.PhyMode)) - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pStaAddr), - (ApIdx) + WIFI_50_RADIO); - else - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pStaAddr), - (ApIdx) + WIFI_24_RADIO); - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_EVENT, STA_DISSOC, - disassoc_event_msg, - strlen(disassoc_event_msg)); - } -#endif - ApLogEvent(pAd, pStaAddr, EVENT_DISASSOCIATED); - /* 2. send out a DISASSOC request frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc(pAd, Wcid, Reason); -#endif - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ASSOC - MLME disassociates %02x:%02x:%02x:%02x:%02x:%02x; Send DISASSOC request\n", - PRINT_MAC(pStaAddr))); - MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, - pStaAddr, - pAd->ApCfg.MBSSID[ApIdx].wdev.if_addr, - pAd->ApCfg.MBSSID[ApIdx].wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &DisassocHdr, 2, &Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_DEAUTH, Reason); -#endif - MacTableDeleteEntry(pAd, Wcid, pStaAddr); - } -} - -#ifdef DOT11W_PMF_SUPPORT -VOID APMlmeKickOutAllSta(RTMP_ADAPTER *pAd, UCHAR apidx, USHORT Reason) -{ - HEADER_802_11 DisassocHdr; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - NDIS_STATUS NStatus; - UCHAR BROADCAST_ADDR[MAC_ADDR_LEN] = { 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff }; - PPMF_CFG pPmfCfg = NULL; - - pPmfCfg = &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PmfCfg; - - if ((apidx < pAd->ApCfg.BssidNum) && (pPmfCfg)) { - /* Send out a Deauthentication request frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Send DISASSOC Broadcast frame(%d) with ra%d\n", - Reason, apidx)); - /* 802.11 Header */ - NdisZeroMemory(&DisassocHdr, sizeof(HEADER_802_11)); - DisassocHdr.FC.Type = FC_TYPE_MGMT; - DisassocHdr.FC.SubType = SUBTYPE_DISASSOC; - DisassocHdr.FC.ToDs = 0; - DisassocHdr.FC.Wep = 0; - COPY_MAC_ADDR(DisassocHdr.Addr1, BROADCAST_ADDR); - COPY_MAC_ADDR(DisassocHdr.Addr2, - pAd->ApCfg.MBSSID[apidx].wdev.bssid); - COPY_MAC_ADDR(DisassocHdr.Addr3, - pAd->ApCfg.MBSSID[apidx].wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &DisassocHdr, 2, &Reason, END_OF_ARGS); - - if (pPmfCfg->MFPC == TRUE) { - ULONG TmpLen; - UCHAR res_buf[LEN_PMF_MMIE]; - UCHAR EID, ELen; - - EID = IE_PMF_MMIE; - ELen = LEN_PMF_MMIE; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &EID, 1, &ELen, LEN_PMF_MMIE, res_buf, - END_OF_ARGS); - FrameLen += TmpLen; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("[PMF]: This is a Broadcast Robust management frame, Add 0x4C(76) EID\n")); - } - - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - } -} -#endif /* DOT11W_PMF_PLUGFEST */ - -/* - ========================================================================== - Description: - Upper layer orders to disassoc s STA - Parameters: - Elem - - ========================================================================== - */ -VOID APMlmeDisassocReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - MLME_DISASSOC_REQ_STRUCT *DisassocReq = - (MLME_DISASSOC_REQ_STRUCT *)(Elem->Msg); - APMlmeKickOutSta(pAd, DisassocReq->Addr, Elem->Wcid, - DisassocReq->Reason); -} - -/* - ========================================================================== - Description: - right part of IEEE 802.11/1999 page 374 - Note: - This event should never cause ASSOC state machine perform state - transition, and has no relationship with CNTL machine. So we separate - this routine as a service outside of ASSOC state transition table. - ========================================================================== - */ -VOID APCls3errAction(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - HEADER_802_11 DisassocHdr; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - NDIS_STATUS NStatus; - USHORT Reason = REASON_CLS3ERR; - MAC_TABLE_ENTRY *pEntry = NULL; - - if (VALID_UCAST_ENTRY_WCID(pAd, pRxBlk->wcid)) - pEntry = &(pAd->MacTab.Content[pRxBlk->wcid]); - - if (pEntry) { -#ifdef WIFI_DIAG - if (IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_DEAUTH, Reason); -#endif -#ifdef MAP_R2 - wapp_handle_sta_disassoc(pAd, pEntry->wcid, Reason); -#endif - - /*ApLogEvent(pAd, pAddr, EVENT_DISASSOCIATED); */ - mac_entry_delete(pAd, pEntry); - } - - /* 2. send out a DISASSOC request frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ASSOC - Class 3 Error, Send DISASSOC frame to %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pRxBlk->Addr2))); - MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pRxBlk->Addr2, - pRxBlk->Addr1, pRxBlk->Addr1); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &DisassocHdr, 2, &Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -} - -/* - ========================================================================== - Description: - association state machine init, including state transition and timer init - Parameters: - S - pointer to the association state machine - Note: - The state machine looks like the following - - AP_ASSOC_IDLE - APMT2_MLME_DISASSOC_REQ mlme_disassoc_req_action - APMT2_PEER_DISASSOC_REQ peer_disassoc_action - APMT2_PEER_ASSOC_REQ drop - APMT2_PEER_REASSOC_REQ drop - APMT2_CLS3ERR cls3err_action - ========================================================================== - */ -VOID APAssocStateMachineInit(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]) -{ -#ifdef CUSTOMER_DCC_FEATURE - pAd->ApDisableSTAConnectFlag = FALSE; - pAd->AllowedStaList.StaCount = 0; -#endif - StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, AP_MAX_ASSOC_STATE, - AP_MAX_ASSOC_MSG, (STATE_MACHINE_FUNC)Drop, - AP_ASSOC_IDLE, AP_ASSOC_MACHINE_BASE); - StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_MLME_DISASSOC_REQ, - (STATE_MACHINE_FUNC)APMlmeDisassocReqAction); - StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_PEER_DISASSOC_REQ, - (STATE_MACHINE_FUNC)APPeerDisassocReqAction); - StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_PEER_ASSOC_REQ, - (STATE_MACHINE_FUNC)APPeerAssocReqAction); - StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_PEER_REASSOC_REQ, - (STATE_MACHINE_FUNC)APPeerReassocReqAction); - /* StateMachineSetAction(S, AP_ASSOC_IDLE, APMT2_CLS3ERR, APCls3errAction); */ -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_auth.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_auth.c deleted file mode 100644 index 8c5431dd2e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_auth.c +++ /dev/null @@ -1,1611 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - auth.c - - Abstract: - Handle de-auth request from local MLME - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - John Chang 08-04-2003 created for 11g soft-AP - */ - -#include "rt_config.h" -#ifdef DOT11R_FT_SUPPORT -#include "ft.h" -#endif /* DOT11R_FT_SUPPORT */ -#ifdef VENDOR_FEATURE7_SUPPORT -#include "arris_wps_gpio_handler.h" -#endif - -/* - ========================================================================== - Description: - MLME message sanity check - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== - */ -static BOOLEAN PeerDeauthReqSanity(IN PRTMP_ADAPTER pAd, IN VOID *Msg, - IN ULONG MsgLen, OUT PUCHAR pAddr2, - OUT UINT16 *SeqNum, OUT USHORT *Reason) -{ - PFRAME_802_11 Fr = (PFRAME_802_11)Msg; - - COPY_MAC_ADDR(pAddr2, &Fr->Hdr.Addr2); - *SeqNum = Fr->Hdr.Sequence; - NdisMoveMemory(Reason, &Fr->Octet[0], 2); - return TRUE; -} - -/* - ========================================================================== - Description: - Upper Layer request to kick out a STA - ========================================================================== - */ - -VOID APMlmeBroadcastDeauthReqAction(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem) -{ - MLME_BROADCAST_DEAUTH_REQ_STRUCT *pInfo; - HEADER_802_11 Hdr; - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - MAC_TABLE_ENTRY *pEntry; - UCHAR apidx = 0; - struct wifi_dev *wdev; - int wcid, startWcid; - - startWcid = 1; - pInfo = (PMLME_BROADCAST_DEAUTH_REQ_STRUCT)Elem->Msg; - if (!MAC_ADDR_EQUAL(pInfo->Addr, BROADCAST_ADDR)) - return; - wdev = pInfo->wdev; - apidx = wdev->func_idx; - for (wcid = startWcid; VALID_UCAST_ENTRY_WCID(pAd, wcid); wcid++) { - pEntry = &pAd->MacTab.Content[wcid]; - if (pEntry->wdev != wdev) - continue; - RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pEntry->Addr, - 0, 0); - ApLogEvent(pAd, pInfo->Addr, EVENT_DISASSOCIATED); -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc(pAd, wcid, pInfo->Reason); -#endif - MacTableDeleteEntry(pAd, wcid, pEntry->Addr); - } - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - if (NStatus != NDIS_STATUS_SUCCESS) - return; - MgtMacHeaderInit(pAd, &Hdr, SUBTYPE_DEAUTH, 0, pInfo->Addr, - pAd->ApCfg.MBSSID[apidx].wdev.if_addr, - pAd->ApCfg.MBSSID[apidx].wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &Hdr, 2, - &pInfo->Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -} - -#if !defined(WH_EZ_SETUP) && !defined(CONFIG_MAP_SUPPORT) -static -#endif - VOID - APMlmeDeauthReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ - MLME_DEAUTH_REQ_STRUCT *pInfo; - HEADER_802_11 Hdr; - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - MAC_TABLE_ENTRY *pEntry; - UCHAR apidx; - struct wifi_dev *wdev; - - pInfo = (MLME_DEAUTH_REQ_STRUCT *)Elem->Msg; - - if (VALID_UCAST_ENTRY_WCID(pAd, Elem->Wcid)) { - pEntry = &pAd->MacTab.Content[Elem->Wcid]; - - if (!pEntry) - return; - - /* send wireless event - for deauthentication */ - RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pInfo->Addr, 0, - 0); - ApLogEvent(pAd, pInfo->Addr, EVENT_DISASSOCIATED); - apidx = pEntry->func_tb_idx; -#ifdef VENDOR_FEATURE7_SUPPORT - { - UCHAR disassoc_event_msg[32] = { 0 }; - - if (WMODE_CAP_5G(pAd->ApCfg.MBSSID[apidx].wdev.PhyMode)) - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pInfo->Addr), - (pEntry->func_tb_idx) + WIFI_50_RADIO); - else - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pInfo->Addr), - (pEntry->func_tb_idx) + WIFI_24_RADIO); - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_EVENT, STA_DISSOC, - disassoc_event_msg, - strlen(disassoc_event_msg)); - } -#endif -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_DEAUTH, pInfo->Reason); -#endif -#ifdef MAP_R2 - if (IS_ENTRY_CLIENT(pEntry) && IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc(pAd, Elem->Wcid, - pInfo->Reason); -#endif - - /* 1. remove this STA from MAC table */ - MacTableDeleteEntry(pAd, Elem->Wcid, pInfo->Addr); - /* 2. send out DE-AUTH request frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Send DE-AUTH req to %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pInfo->Addr))); - MgtMacHeaderInit(pAd, &Hdr, SUBTYPE_DEAUTH, 0, pInfo->Addr, - pAd->ApCfg.MBSSID[apidx].wdev.if_addr, - pAd->ApCfg.MBSSID[apidx].wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &Hdr, 2, &pInfo->Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - - } else { - MLME_BROADCAST_DEAUTH_REQ_STRUCT *pInfo; - - pInfo = (PMLME_BROADCAST_DEAUTH_REQ_STRUCT)Elem->Msg; - wdev = pInfo->wdev; - APMlmeBroadcastDeauthReqAction(pAd, Elem); - } -} - -void ApSendBroadcastDeauth(void *ad_obj, struct wifi_dev *wdev) -{ - MLME_BROADCAST_DEAUTH_REQ_STRUCT *pInfo = NULL; - MLME_QUEUE_ELEM *Elem; - RTMP_ADAPTER *pAd = ad_obj; - - MlmeAllocateMemory(pAd, (UCHAR **)&Elem); - if (Elem == NULL) - return; - if (Elem) { - pInfo = (MLME_BROADCAST_DEAUTH_REQ_STRUCT *)Elem->Msg; - pInfo->wdev = wdev; - Elem->Wcid = WCID_ALL; - pInfo->Reason = MLME_UNSPECIFY_FAIL; - NdisCopyMemory(pInfo->Addr, BROADCAST_ADDR, MAC_ADDR_LEN); - APMlmeDeauthReqAction(pAd, Elem); - MlmeFreeMemory(Elem); - } -} - -static VOID APPeerDeauthReqAction(IN PRTMP_ADAPTER pAd, - IN PMLME_QUEUE_ELEM Elem) -{ - UCHAR Addr2[MAC_ADDR_LEN]; - UINT16 Reason, SeqNum; - MAC_TABLE_ENTRY *pEntry; - - if (!PeerDeauthReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &SeqNum, - &Reason)) - return; - - pEntry = NULL; - - /*pEntry = MacTableLookup(pAd, Addr2); */ - if (VALID_UCAST_ENTRY_WCID(pAd, Elem->Wcid)) { - pEntry = &pAd->MacTab.Content[Elem->Wcid]; - { - /* - Add Hotspot2.0 Rlease 1 Prestested Code - */ - BSS_STRUCT *pMbss = - &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; - PFRAME_802_11 Fr = (PFRAME_802_11)Elem->Msg; - unsigned char *tmp = (unsigned char *)pMbss->wdev.bssid; - unsigned char *tmp2 = (unsigned char *)&Fr->Hdr.Addr1; - - if (memcmp(&Fr->Hdr.Addr1, pMbss->wdev.bssid, 6) != 0) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("da not match bssid,bssid:0x%02x%02x%02x%02x%02x%02x, addr1:0x%02x%02x%02x%02x%02x%02x\n", - *tmp, *(tmp + 1), *(tmp + 2), - *(tmp + 3), *(tmp + 4), *(tmp + 5), - *tmp2, *(tmp2 + 1), *(tmp2 + 2), - *(tmp2 + 3), *(tmp2 + 4), - *(tmp2 + 5))); - return; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("da match,0x%02x%02x%02x%02x%02x%02x\n", *tmp, - *(tmp + 1), *(tmp + 2), *(tmp + 3), - *(tmp + 4), *(tmp + 5))); - } -#if defined(DOT1X_SUPPORT) && !defined(RADIUS_ACCOUNTING_SUPPORT) - - /* Notify 802.1x daemon to clear this sta info */ - if (IS_AKM_1X_Entry(pEntry) || - IS_IEEE8021X_Entry( - &pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev)) - DOT1X_InternalCmdAction(pAd, pEntry, - DOT1X_DISCONNECT_ENTRY); - -#endif /* DOT1X_SUPPORT */ - /* send wireless event - for deauthentication */ - RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, Addr2, 0, 0); -#ifdef VENDOR_FEATURE7_SUPPORT - { - UCHAR disassoc_event_msg[32] = { 0 }; - - if (WMODE_CAP_5G(pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.PhyMode)) - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(Addr2), - (pEntry->func_tb_idx) + WIFI_50_RADIO); - else - snprintf( - disassoc_event_msg, - sizeof(disassoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(Addr2), - (pEntry->func_tb_idx) + WIFI_24_RADIO); - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_EVENT, STA_DISSOC, - disassoc_event_msg, - strlen(disassoc_event_msg)); - } -#endif - ApLogEvent(pAd, Addr2, EVENT_DISASSOCIATED); - - if (pEntry->CMTimerRunning == TRUE) { - /* - If one who initilized Counter Measure deauth itself, - AP doesn't log the MICFailTime - */ - pAd->ApCfg.aMICFailTime = pAd->ApCfg.PrevaMICFailTime; - } - -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_DEAUTH, - REASON_DEAUTH_STA_LEAVING); -#endif - - if (pEntry && !IS_ENTRY_CLIENT(pEntry)) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: receive not client de-auth ###\n", - __func__)); - else { -#ifdef MAP_R2 - wapp_send_sta_disassoc_stats_event(pAd, pEntry, Reason); -#endif - MacTableDeleteEntry(pAd, Elem->Wcid, Addr2); - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - receive DE-AUTH(seq-%d) from %02x:%02x:%02x:%02x:%02x:%02x, reason=%d\n", - SeqNum, PRINT_MAC(Addr2), Reason)); -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn == TRUE) { - UCHAR apCliIdx, CliIdx; - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - - pReptEntry = RTMPLookupRepeaterCliEntry(pAd, TRUE, - Addr2, TRUE); - - if (pReptEntry && (pReptEntry->CliConnectState != - REPT_ENTRY_DISCONNT)) { - apCliIdx = pReptEntry->MatchApCliIdx; - CliIdx = pReptEntry->MatchLinkIdx; - pReptEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_AP_PEER_DEAUTH_REQ; - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, NULL, - (REPT_MLME_START_IDX + CliIdx)); - RTMP_MLME_HANDLER(pAd); - } - } - -#endif /* MAC_REPEATER_SUPPORT */ - } -} - -/* - ========================================================================== - Description: - MLME message sanity check - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== - */ -static BOOLEAN APPeerAuthSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, - IN ULONG MsgLen, IN AUTH_FRAME_INFO *auth_info) -{ - PFRAME_802_11 Fr = (PFRAME_802_11)Msg; - - COPY_MAC_ADDR(auth_info->addr1, &Fr->Hdr.Addr1); /* BSSID */ - COPY_MAC_ADDR(auth_info->addr2, &Fr->Hdr.Addr2); /* SA */ - /* TODO: shiang-usw, how about the endian issue here?? */ - NdisMoveMemory(&auth_info->auth_alg, &Fr->Octet[0], 2); - NdisMoveMemory(&auth_info->auth_seq, &Fr->Octet[2], 2); - NdisMoveMemory(&auth_info->auth_status, &Fr->Octet[4], 2); - - if (auth_info->auth_alg == AUTH_MODE_OPEN) { - if (auth_info->auth_seq == 1 || auth_info->auth_seq == 2) - return TRUE; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): fail - wrong Seg# (=%d)\n", __func__, - auth_info->auth_seq)); - return FALSE; - } else if (auth_info->auth_alg == AUTH_MODE_KEY) { - if (auth_info->auth_seq == 1 || auth_info->auth_seq == 4) - return TRUE; - else if (auth_info->auth_seq == 2 || auth_info->auth_seq == 3) { - NdisMoveMemory(auth_info->Chtxt, &Fr->Octet[8], - CIPHER_TEXT_LEN); - return TRUE; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): fail - wrong Seg# (=%d)\n", __func__, - auth_info->auth_seq)); - return FALSE; - } -#ifdef DOT11R_FT_SUPPORT - else if (auth_info->auth_alg == AUTH_MODE_FT) { - PEID_STRUCT eid_ptr; - UCHAR *Ptr; - UCHAR WPA2_OUI[3] = { 0x00, 0x0F, 0xAC }; - PFT_INFO pFtInfo = &auth_info->FtInfo; - - NdisZeroMemory(pFtInfo, sizeof(FT_INFO)); - Ptr = &Fr->Octet[6]; - eid_ptr = (PEID_STRUCT)Ptr; - - /* get variable fields from payload and advance the pointer */ - while (((UCHAR *)eid_ptr + eid_ptr->Len + 1) < - ((UCHAR *)Fr + MsgLen)) { - switch (eid_ptr->Eid) { - case IE_FT_MDIE: - FT_FillMdIeInfo(eid_ptr, &pFtInfo->MdIeInfo); - break; - - case IE_FT_FTIE: - FT_FillFtIeInfo(eid_ptr, &pFtInfo->FtIeInfo); - break; - - case IE_FT_RIC_DATA: - - /* record the pointer of first RDIE. */ - if (pFtInfo->RicInfo.pRicInfo == NULL) { - pFtInfo->RicInfo.pRicInfo = - &eid_ptr->Eid; - pFtInfo->RicInfo.Len = - ((UCHAR *)Fr + MsgLen) - - (UCHAR *)eid_ptr + 1; - } - - if ((pFtInfo->RicInfo.RicIEsLen + eid_ptr->Len + - 2) < MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfo->RicInfo.RicIEs - [pFtInfo->RicInfo - .RicIEsLen], - &eid_ptr->Eid, - eid_ptr->Len + 2); - pFtInfo->RicInfo.RicIEsLen += - eid_ptr->Len + 2; - } - - break; - - case IE_FT_RIC_DESCRIPTOR: - if ((pFtInfo->RicInfo.RicIEsLen + eid_ptr->Len + - 2) < MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfo->RicInfo.RicIEs - [pFtInfo->RicInfo - .RicIEsLen], - &eid_ptr->Eid, - eid_ptr->Len + 2); - pFtInfo->RicInfo.RicIEsLen += - eid_ptr->Len + 2; - } - - break; - - case IE_RSN: - if (NdisEqualMemory(&eid_ptr->Octet[2], - WPA2_OUI, - sizeof(WPA2_OUI))) { - NdisMoveMemory(pFtInfo->RSN_IE, eid_ptr, - eid_ptr->Len + 2); - pFtInfo->RSNIE_Len = eid_ptr->Len + 2; - } - - break; - - default: - break; - } - - eid_ptr = (PEID_STRUCT)((UCHAR *)eid_ptr + 2 + - eid_ptr->Len); - } - } -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11_SAE_SUPPORT - else if (auth_info->auth_alg == AUTH_MODE_SAE) { - if (auth_info->auth_seq != SAE_COMMIT_SEQ && - auth_info->auth_seq != SAE_CONFIRM_SEQ) - return FALSE; - } -#endif /* DOT11_SAE_SUPPORT */ -#ifdef OCE_FILS_SUPPORT - else if (auth_info->auth_alg == AUTH_MODE_FILS) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Recv FILS Auth from (%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(auth_info->addr2))); - return TRUE; - } -#endif /* OCE_FILS_SUPPORT */ - else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): fail - wrong algorithm (=%d)\n", __func__, - auth_info->auth_alg)); - return FALSE; - } - - return TRUE; -} - -/* - ========================================================================== - Description: - Send out a Authentication (response) frame - ========================================================================== -*/ -VOID APPeerAuthSimpleRspGenAndSend(IN PRTMP_ADAPTER pAd, IN PHEADER_802_11 pHdr, - IN USHORT Alg, IN USHORT Seq, - IN USHORT StatusCode) -{ - HEADER_802_11 AuthHdr; - ULONG FrameLen = 0; - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - if (StatusCode == MLME_SUCCESS) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH_RSP - Send AUTH response (SUCCESS)...\n")); - else { - /* For MAC wireless client(Macintosh), need to send AUTH_RSP with Status Code (fail reason code) to reject it. */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH_RSP - Peer AUTH fail (Status = %d)...\n", - StatusCode)); - } - - MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, pHdr->Addr2, - pHdr->Addr1, pHdr->Addr1); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &AuthHdr, 2, &Alg, 2, &Seq, 2, &StatusCode, - END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -} - -static VOID APPeerAuthReqAtIdleAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - INT i; - USHORT RspReason; - AUTH_FRAME_INFO *pAuth_info; - UINT32 apidx; - BOOLEAN checkAuthSanity = FALSE; - PHEADER_802_11 pRcvHdr; - HEADER_802_11 AuthHdr; - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - MAC_TABLE_ENTRY *pEntry; - STA_TR_ENTRY *tr_entry; - UCHAR ChTxtIe = 16, ChTxtLen = CIPHER_TEXT_LEN; -#ifdef DOT11R_FT_SUPPORT - PFT_CFG pFtCfg; - PFT_INFO pFtInfoBuf; -#endif /* DOT11R_FT_SUPPORT */ - BSS_STRUCT *pMbss; - struct wifi_dev *wdev; -#ifdef WAPP_SUPPORT - UINT8 wapp_cnnct_stage = WAPP_AUTH; - UINT16 wapp_auth_fail = NOT_FAILURE; - UINT16 status_code = MLME_SUCCESS; -#endif /* WAPP_SUPPORT */ -#ifdef RADIUS_MAC_AUTH_SUPPORT - UINT32 freq; - MAP_CHANNEL_ID_TO_KHZ(pAd->LatchRfRegs.Channel, freq); - freq /= 1000; -#endif /* RADIUS_MAC_AUTH_SUPPORT */ -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - BOOLEAN bACLReject = FALSE; - BOOLEAN bBlReject = FALSE; -#endif - - os_alloc_mem_suspend(pAd, (UCHAR **)&pAuth_info, - sizeof(AUTH_FRAME_INFO)); - - if (!pAuth_info) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("auth_info: Mem Alloc fail!\n")); - return; - } - os_zero_mem(pAuth_info, sizeof(AUTH_FRAME_INFO)); - - checkAuthSanity = - APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, pAuth_info); - /* Find which MBSSID to be authenticate */ - apidx = get_apidx_by_addr(pAd, pAuth_info->addr1); - pMbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &pMbss->wdev; - ASSERT((wdev->func_idx == apidx)); - - if (pAd->ApCfg.BANClass3Data == TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Disallow new Association\n")); -#ifdef WAPP_SUPPORT - wapp_auth_fail = DISALLOW_NEW_ASSOCI; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - - if (!checkAuthSanity) { -#ifdef WAPP_SUPPORT - wapp_auth_fail = PEER_REQ_SANITY_FAIL; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Bssid not found\n")); -#ifdef WAPP_SUPPORT - wapp_auth_fail = BSSID_NOT_FOUND; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - - if (apidx >= HW_BEACON_MAX_NUM) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Index out of bound\n")); -#ifdef WAPP_SUPPORT - wapp_auth_fail = BSSID_NOT_FOUND; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - - if (!OPSTATUS_TEST_FLAG_WDEV(wdev, - fOP_AP_STATUS_MEDIA_STATE_CONNECTED)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AP is not ready, disallow new Association\n")); -#ifdef WAPP_SUPPORT - wapp_auth_fail = AP_NOT_READY; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - - if ((wdev->if_dev == NULL) || - ((wdev->if_dev != NULL) && - ((!(RTMP_OS_NETDEV_STATE_RUNNING(wdev->if_dev))) -#ifdef CONFIG_MAP_SUPPORT - || (wdev->bcn_buf.bBcnSntReq == FALSE) -#endif - - ))) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Bssid IF didn't up yet.\n")); -#ifdef WAPP_SUPPORT - wapp_auth_fail = BSSID_IF_NOT_READY; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - - pEntry = MacTableLookup(pAd, pAuth_info->addr2); - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - /* reset NoDataIdleCount to prevent unexpected STA assoc timeout and kicked by MacTableMaintenance */ - pEntry->NoDataIdleCount = 0; - pEntry->NoDataLastIdleCount = 0; -#ifdef DOT11W_PMF_SUPPORT - - if ((pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE) && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) - goto SendAuth; - -#endif /* DOT11W_PMF_SUPPORT */ - - if (!RTMPEqualMemory( - pAuth_info->addr1, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid, - MAC_ADDR_LEN)) { - MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); - pEntry = NULL; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("AUTH - Bssid does not match\n")); -#ifdef WAPP_SUPPORT - wapp_auth_fail = BSSID_MISMATCH; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - - } else { -#ifdef DOT11_N_SUPPORT - ba_session_tear_down_all(pAd, pEntry->wcid); -#endif /* DOT11_N_SUPPORT */ - } - } - -#ifdef DOT11W_PMF_SUPPORT -SendAuth: -#endif /* DOT11W_PMF_SUPPORT */ - pRcvHdr = (PHEADER_802_11)(Elem->Msg); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - MBSS(%d), Rcv AUTH seq#%d, Alg=%02x, Status=%d from [wcid=%d]%02x:%02x:%02x:%02x:%02x:%02x\n", - apidx, pAuth_info->auth_seq, pAuth_info->auth_alg, - pAuth_info->auth_status, Elem->Wcid, - PRINT_MAC(pAuth_info->addr2))); - -#ifdef WSC_V2_SUPPORT - - /* Do not check ACL when WPS V2 is enabled and ACL policy is positive. */ - if ((wdev->WscControl.WscConfMode != WSC_DISABLE) && - (wdev->WscControl.WscV2Info.bEnableWpsV2) && - (wdev->WscControl.WscV2Info.bWpsEnable)) - ; - else -#endif /* WSC_V2_SUPPORT */ -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - /* set a flag for sending Assoc-Fail response to unwanted STA later. */ - if (map_is_entry_bl(pAd, pAuth_info->addr2, apidx) == TRUE) { - bBlReject = TRUE; - } else -#endif - - /* fail in ACL checking => send an AUTH-Fail seq#2. */ - if (!ApCheckAccessControlList(pAd, pAuth_info->addr2, - apidx)) { -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - bACLReject = TRUE; -#endif -#ifdef ACL_BLK_COUNT_SUPPORT - if (pAd->ApCfg.MBSSID[apidx] - .AccessControlList.Policy == 2) { - ULONG idx; - ULONG acl_num; - acl_num = - pAd->ApCfg.MBSSID[apidx] - .AccessControlList.Num; - for (idx = 0; idx < acl_num; idx++) { - if (MAC_ADDR_EQUAL( - pAuth_info->addr2, - pAd->ApCfg - .MBSSID[apidx] - .AccessControlList - .Entry[idx] - .Addr)) { - pAd->ApCfg.MBSSID[apidx] - .AccessControlList - .Entry[idx] - .Reject_Count += - 1; - break; - } - } - } -#endif /*ACL_BLK_COUNT_SUPPORT*/ -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - } - /* fail in ACL checking => send an AUTH-Fail seq#2. */ - if (bBlReject || bACLReject) { -#endif - ASSERT(pAuth_info->auth_seq == 1); - ASSERT(pEntry == NULL); -#ifdef WAPP_SUPPORT - status_code = MLME_UNSPECIFY_FAIL; -#endif - APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, - pAuth_info->auth_alg, - pAuth_info->auth_seq + 1, - MLME_UNSPECIFY_FAIL); -#ifdef WIFI_DIAG - DiagConnError(pAd, apidx, pAuth_info->addr2, DIAG_CONN_ACL_BLK, - 0); -#endif - /* If this STA exists, delete it. */ - if (pEntry) - MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); - - RTMPSendWirelessEvent(pAd, IW_MAC_FILTER_LIST_EVENT_FLAG, - pAuth_info->addr2, wdev->wdev_idx, 0); -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Failed in BL/ACL %d/%d checking => send an AUTH seq#2 with Status code = %d\n", - bBlReject, bACLReject, MLME_UNSPECIFY_FAIL)); -#else - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Failed in ACL checking => send an AUTH seq#2 with Status code = %d\n", - MLME_UNSPECIFY_FAIL)); -#endif - -#ifdef WAPP_SUPPORT - wapp_auth_fail = ACL_CHECK_FAIL; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - -#ifdef BAND_STEERING - if (pAd->ApCfg.BandSteering - - ) { - BOOLEAN bBndStrgCheck = TRUE; - - bBndStrgCheck = - BndStrg_CheckConnectionReq(pAd, wdev, pAuth_info->addr2, - &(Elem->rssi_info), - Elem->MsgType, NULL); - if (bBndStrgCheck == FALSE) { -#ifdef WAPP_SUPPORT - status_code = MLME_UNSPECIFY_FAIL; -#endif - APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, - pAuth_info->auth_alg, - pAuth_info->auth_seq + 1, - MLME_UNSPECIFY_FAIL); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - check failed.\n")); -#ifdef WAPP_SUPPORT - wapp_auth_fail = BND_STRG_CONNECT_CHECK_FAIL; -#endif /* WAPP_SUPPORT */ -#ifdef WIFI_DIAG - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_BAND_STE, 0); -#endif - goto auth_failure; - } - } -#endif /* BAND_STEERING */ - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS(wdev->SecConfig.AKMMap) && - (pAuth_info->auth_alg == AUTH_MODE_FILS)) { - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, pAuth_info->addr2, - wdev, ENTRY_CLIENT, - OPMODE_AP, TRUE); - - /* SET FILS First for clean STA if auth fail - and adjust AKM with 256/384 in assoc phase */ - SET_AKM_FILS_SHA256(pEntry->SecConfig.AKMMap); - if (0) { - } else { - struct fils_info *filsInfo = &pEntry->filsInfo; - - if (filsInfo->pending_ie) { - os_free_mem(filsInfo->pending_ie); - filsInfo->pending_ie_len = 0; - filsInfo->pending_ie = NULL; - } - - filsInfo->auth_algo = AUTH_MODE_FILS; - filsInfo->pending_ie_len = Elem->MsgLen; - os_alloc_mem(NULL, (UCHAR **)&filsInfo->pending_ie, - filsInfo->pending_ie_len); - NdisMoveMemory(filsInfo->pending_ie, Elem->Msg, - filsInfo->pending_ie_len); - - DOT1X_InternalCmdAction(pAd, pEntry, DOT1X_MLME_EVENT); - filsInfo->is_pending_auth = TRUE; - - os_free_mem(pAuth_info); - return; - } - } -#endif /* OCE_FILS_SUPPORT */ - -#ifdef CONFIG_STEERING_API_SUPPORT - if (BlackList_StaLookup(pAd, pAuth_info->addr2)) { - os_free_mem(pAuth_info); - return; - } -#endif -#ifdef RADIUS_MAC_ACL_SUPPORT - - if (IS_IEEE8021X_Entry(wdev) && - (wdev->SecConfig.RadiusMacAuthCache.Policy == - RADIUS_MAC_AUTH_ENABLE)) { -#define RADIUS_ACL_REJECT 0 -#define RADIUS_ACL_ACCEPT 1 -#define RADIUS_ACL_PENDING 2 -#define RADIUS_ACL_ACCEPT_TIMEOUT 3 - PRT_802_11_RADIUS_ACL_ENTRY pAclEntry = NULL; - - pAclEntry = RadiusFindAclEntry( - &wdev->SecConfig.RadiusMacAuthCache.cacheList, - pAuth_info->addr2); - - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, pAuth_info->addr2, - wdev, ENTRY_CLIENT, - OPMODE_AP, TRUE); - - if (pAclEntry) { - if (pAclEntry->result == RADIUS_ACL_REJECT) { -#ifdef WAPP_SUPPORT - status_code = MLME_UNSPECIFY_FAIL; -#endif - APPeerAuthSimpleRspGenAndSend( - pAd, pRcvHdr, pAuth_info->auth_alg, - pAuth_info->auth_seq + 1, - MLME_UNSPECIFY_FAIL); -#ifdef WIFI_DIAG - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_ACL_BLK, 0); -#endif - if (pEntry) - MacTableDeleteEntry(pAd, pEntry->wcid, - pEntry->Addr); - - RTMPSendWirelessEvent( - pAd, IW_MAC_FILTER_LIST_EVENT_FLAG, - Addr2, apidx, 0); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x RADIUS ACL checking => Reject.\n", - PRINT_MAC(pAuth_info->addr2))); - } else if (pAclEntry->result == RADIUS_ACL_ACCEPT) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x RADIUS ACL checking => OK.\n", - PRINT_MAC(pAuth_info->addr2))); - } else if (pAclEntry->result == - RADIUS_ACL_ACCEPT_TIMEOUT) { - /* with SESSION-TIMEOUT from Radius Server */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x RADIUS ACL checking => OK. (TIMEOUT)\n", - PRINT_MAC(pAuth_info->addr2))); - DOT1X_InternalCmdAction(pAd, pEntry, - DOT1X_ACL_ENTRY); - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x RADIUS ACL checking => Unkown.\n", - PRINT_MAC(pAuth_info->addr2))); - } - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x Not Found in RADIUS ACL & go to Check.\n", - PRINT_MAC(pAuth_info->addr2))); - DOT1X_InternalCmdAction(pAd, pEntry, DOT1X_ACL_ENTRY); -#ifdef WAPP_SUPPORT - wapp_auth_fail = NOT_FOUND_IN_RADIUS_ACL; -#endif /* WAPP_SUPPORT */ -#ifdef WIFI_DIAG - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_ACL_BLK, 0); -#endif - goto auth_failure; - } - } - -#endif /* RADIUS_MAC_ACL_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - pFtCfg = &wdev->FtCfg; - - if ((pFtCfg->FtCapFlag.Dot11rFtEnable) && - (pAuth_info->auth_alg == AUTH_MODE_FT)) { - USHORT result; - - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, pAuth_info->addr2, - wdev, ENTRY_CLIENT, - OPMODE_AP, TRUE); - - if (pEntry != NULL) { - os_alloc_mem(pAd, (UCHAR **)&pFtInfoBuf, - sizeof(FT_INFO)); - - if (pFtInfoBuf) { - result = FT_AuthReqHandler(pAd, pEntry, - &pAuth_info->FtInfo, - pFtInfoBuf); - - if (result == MLME_SUCCESS) { - NdisMoveMemory( - &pEntry->MdIeInfo, - &pAuth_info->FtInfo.MdIeInfo, - sizeof(FT_MDIE_INFO)); - pEntry->AuthState = AS_AUTH_OPEN; - /*According to specific, if it already in SST_ASSOC, it can not go back */ - if (pEntry->Sst != SST_ASSOC) - pEntry->Sst = SST_AUTH; - } else if (result == MLME_FAIL_NO_RESOURCE) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s - give up this AUTH pkt ======================> Query R1KH from backbone (Wcid%d, %d)\n", - __func__, pEntry->wcid, - pEntry->FT_R1kh_CacheMiss_Times)); - os_free_mem(pFtInfoBuf); -#ifdef WIFI_DIAG - DiagConnError(pAd, apidx, - pAuth_info->addr2, - DIAG_CONN_AUTH_FAIL, - REASON_NO_RESOURCE); -#endif -#ifdef WAPP_SUPPORT - wapp_auth_fail = MLME_NO_RESOURCE; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - - FT_EnqueueAuthReply(pAd, pRcvHdr, - pAuth_info->auth_alg, 2, - result, - &pFtInfoBuf->MdIeInfo, - &pFtInfoBuf->FtIeInfo, NULL, - pFtInfoBuf->RSN_IE, - pFtInfoBuf->RSNIE_Len); - os_free_mem(pFtInfoBuf); - if (result == MLME_SUCCESS) { - struct _ASIC_SEC_INFO *info = NULL; - - os_alloc_mem(NULL, (UCHAR **)&info, - sizeof(ASIC_SEC_INFO)); - - if (info) { - struct _SECURITY_CONFIG - *pSecConfig = - &pEntry->SecConfig; - - os_zero_mem( - info, - sizeof(ASIC_SEC_INFO)); - NdisCopyMemory(pSecConfig->PTK, - pEntry->FT_PTK, - LEN_MAX_PTK); - info->Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - info->Direction = - SEC_ASIC_KEY_BOTH; - info->Wcid = pEntry->wcid; - info->BssIndex = - pEntry->func_tb_idx; - info->Cipher = - pSecConfig - ->PairwiseCipher; - info->KeyIdx = - pSecConfig - ->PairwiseKeyId; - os_move_mem(&info->PeerAddr[0], - pEntry->Addr, - MAC_ADDR_LEN); - os_move_mem( - info->Key.Key, - &pEntry->FT_PTK - [LEN_PTK_KCK + - LEN_PTK_KEK], - (LEN_TK + LEN_TK2)); - WPAInstallKey(pAd, info, TRUE, - TRUE); - /* Update status and set Port as Secured */ - pSecConfig->Handshake.WpaState = - AS_PTKINITDONE; - os_free_mem(info); - } else { - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: struct alloc fail\n", - __func__)); - } - } - } - } -#ifdef WIFI_DIAG - else /* MAC table full*/ - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_STA_LIM, 0); -#endif - os_free_mem(pAuth_info); - return; - } - -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11_SAE_SUPPORT - if ((pAuth_info->auth_alg == AUTH_MODE_SAE) && - (IS_AKM_SAE_SHA256(pMbss->wdev.SecConfig.AKMMap))) { - UCHAR is_h2e_connect; - UCHAR *pmk; -#ifdef DOT11W_PMF_SUPPORT - - if (pEntry) { - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - - if ((pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE) && - (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED)) { -#ifdef WAPP_SUPPORT - status_code = MLME_ASSOC_REJ_TEMPORARILY; -#endif - APPeerAuthSimpleRspGenAndSend( - pAd, pRcvHdr, pAuth_info->auth_alg, - pAuth_info->auth_seq, - MLME_ASSOC_REJ_TEMPORARILY); - PMF_MlmeSAQueryReq(pAd, pEntry); -#ifdef WIFI_DIAG - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_AUTH_FAIL, - REASON_REJ_TEMPORARILY); -#endif -#ifdef WAPP_SUPPORT - wapp_auth_fail = MLME_ASSOC_REJ_TEMP; -#endif /* WAPP_SUPPORT */ - goto auth_failure; - } - } - -#endif /* DOT11W_PMF_SUPPORT */ - /* ap is passive, so do not consider the retrun value of sae_handle_auth */ - sae_handle_auth(pAd, &pAd->SaeCfg, Elem->Msg, Elem->MsgLen, - pMbss->wdev.SecConfig.PSK, - pMbss->wdev.SecConfig.pt_list, - &pMbss->wdev.SecConfig.sae_cap, -#ifdef DOT11_SAE_PWD_ID_SUPPORT - &pMbss->wdev.SecConfig.pwd_id_list_head, -#endif - pAuth_info->auth_seq, pAuth_info->auth_status, - &pmk, &is_h2e_connect); - if (pmk) { - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, - pAuth_info->addr2, - wdev, ENTRY_CLIENT, - OPMODE_AP, TRUE); - - if (pEntry) { - UCHAR pmkid[80]; - NdisMoveMemory(pEntry->SecConfig.PMK, pmk, - LEN_PMK); - pEntry->AuthState = AS_AUTH_OPEN; - /*According to specific, if it already in SST_ASSOC, it can not go back */ - if (pEntry->Sst != SST_ASSOC) - pEntry->Sst = SST_AUTH; - pEntry->SecConfig.is_h2e_connect = - is_h2e_connect; - pEntry->SecConfig.sae_cap.gen_pwe_method = - pMbss->wdev.SecConfig.sae_cap - .gen_pwe_method; - if (sae_get_pmk_cache( - &pAd->SaeCfg, pAuth_info->addr1, - pAuth_info->addr2, pmkid, NULL)) { - RTMPAddPMKIDCache( - &pAd->ApCfg.PMKIDCache, apidx, - pEntry->Addr, pmkid, pmk, - LEN_PMK); - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, - DBG_LVL_TRACE, - ("WPA3PSK(SAE):(%02x:%02x:%02x:%02x:%02x:%02x)Calc PMKID=%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pEntry->Addr), - pmkid[0], pmkid[1], pmkid[2], - pmkid[3], pmkid[4], pmkid[5])); - } - } -#ifdef WIFI_DIAG - else /* MAC table full*/ - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_STA_LIM, 0); -#endif - } - } else -#endif /* DOT11_SAE_SUPPORT */ - if ((pAuth_info->auth_alg == AUTH_MODE_OPEN) && - (!IS_AKM_SHARED(pMbss->wdev.SecConfig.AKMMap))) { - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, - pAuth_info->addr2, - wdev, ENTRY_CLIENT, - OPMODE_AP, TRUE); - - if (pEntry) { - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - if (1 -#ifdef DOT11W_PMF_SUPPORT - && - ((pEntry->SecConfig.PmfCfg.UsePMFConnect == - FALSE) || - (tr_entry->PortSecured != - WPA_802_1X_PORT_SECURED)) -#endif /* DOT11W_PMF_SUPPORT */ - ) { - pEntry->AuthState = AS_AUTH_OPEN; - /*According to specific, if it already in SST_ASSOC, it can not go back */ - if (pEntry->Sst != SST_ASSOC) - pEntry->Sst = SST_AUTH; - } - - APPeerAuthSimpleRspGenAndSend( - pAd, pRcvHdr, pAuth_info->auth_alg, - pAuth_info->auth_seq + 1, MLME_SUCCESS); -#ifdef RADIUS_MAC_AUTH_SUPPORT - if (wdev->radius_mac_auth_enable) - CFG80211OS_RxMgmt(wdev->if_dev, freq, - Elem->Msg, - Elem->MsgLen); -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - } -#ifdef WIFI_DIAG - else /* MAC table full*/ - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_STA_LIM, 0); -#endif - } else if ((pAuth_info->auth_alg == AUTH_MODE_KEY) && - (IS_AKM_SHARED(pMbss->wdev.SecConfig.AKMMap) || - IS_AKM_AUTOSWITCH(pMbss->wdev.SecConfig.AKMMap))) { - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, - pAuth_info->addr2, - wdev, ENTRY_CLIENT, - OPMODE_AP, TRUE); - - if (pEntry) { - pEntry->AuthState = AS_AUTHENTICATING; - /*According to specific, if it already in SST_ASSOC, it can not go back */ - if (pEntry->Sst != SST_ASSOC) - pEntry->Sst = SST_NOT_AUTH; - /* log this STA in AuthRspAux machine, only one STA is stored. If two STAs using */ - /* SHARED_KEY authentication mingled together, then the late comer will win. */ - COPY_MAC_ADDR(&pAd->ApMlmeAux.Addr, - pAuth_info->addr2); - - for (i = 0; i < CIPHER_TEXT_LEN; i++) - pAd->ApMlmeAux.Challenge[i] = - RandomByte(pAd); - - RspReason = 0; - pAuth_info->auth_seq++; - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { -#ifdef WAPP_SUPPORT - wapp_auth_fail = MLME_NO_RESOURCE; -#endif /* WAPP_SUPPORT */ -#ifdef WIFI_DIAG - DiagConnError(pAd, apidx, - pAuth_info->addr2, - DIAG_CONN_AUTH_FAIL, - REASON_NO_RESOURCE); -#endif - goto auth_failure; /* if no memory, can't do anything */ - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("AUTH - Send AUTH seq#2 (Challenge)\n")); - MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, - pAuth_info->addr2, - wdev->if_addr, wdev->bssid); - MakeOutgoingFrame( - pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), &AuthHdr, 2, - &pAuth_info->auth_alg, 2, - &pAuth_info->auth_seq, 2, &RspReason, 1, - &ChTxtIe, 1, &ChTxtLen, CIPHER_TEXT_LEN, - pAd->ApMlmeAux.Challenge, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -#ifdef RADIUS_MAC_AUTH_SUPPORT - if (wdev->radius_mac_auth_enable) - CFG80211OS_RxMgmt(wdev->if_dev, freq, - Elem->Msg, - Elem->MsgLen); -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - } -#ifdef WIFI_DIAG - else /* MAC table full */ - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_STA_LIM, 0); -#endif - } else { - /* wrong algorithm */ -#ifdef WAPP_SUPPORT - status_code = MLME_ALG_NOT_SUPPORT; -#endif - APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, - pAuth_info->auth_alg, - pAuth_info->auth_seq + 1, - MLME_ALG_NOT_SUPPORT); -#ifdef WIFI_DIAG - DiagConnError(pAd, apidx, pAuth_info->addr2, - DIAG_CONN_AUTH_FAIL, - REASON_AUTH_WRONG_ALGORITHM); -#endif - /* If this STA exists, delete it. */ - if (pEntry) - MacTableDeleteEntry(pAd, pEntry->wcid, - pEntry->Addr); - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Alg=%d, Seq=%d\n", - pAuth_info->auth_alg, pAuth_info->auth_seq)); - } - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - INT32 aid = pEntry->wcid; - - SET_FLAG_CONN_IN_PROG(aid, pAd->ConInPrgress); - } - os_free_mem(pAuth_info); - return; -auth_failure: -#ifdef WAPP_SUPPORT - wapp_send_sta_connect_rejected(pAd, wdev, pAuth_info->addr2, - pAuth_info->addr1, wapp_cnnct_stage, - wapp_auth_fail, status_code, 0); -#endif /* WAPP_SUPPORT */ - os_free_mem(pAuth_info); - return; -} - -static VOID APPeerAuthConfirmAction(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem) -{ - AUTH_FRAME_INFO *auth_info = NULL; - PHEADER_802_11 pRcvHdr; - MAC_TABLE_ENTRY *pEntry; - UINT32 apidx; -#ifdef DOT11R_FT_SUPPORT - PFT_CFG pFtCfg; - PFT_INFO pFtInfoBuf; -#endif /* DOT11R_FT_SUPPORT */ - - if (pAd == NULL) - return; - - os_alloc_mem(pAd, (UCHAR **)&auth_info, sizeof(AUTH_FRAME_INFO)); - if (!auth_info) - return; - - if (!APPeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, auth_info)) - goto error; - - apidx = get_apidx_by_addr(pAd, auth_info->addr1); - - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Bssid not found\n")); - goto error; - } - - if (apidx >= HW_BEACON_MAX_NUM) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Index out of bound\n")); - goto error; - } - - if ((pAd->ApCfg.MBSSID[apidx].wdev.if_dev != NULL) && - (!(RTMP_OS_NETDEV_STATE_RUNNING( - pAd->ApCfg.MBSSID[apidx].wdev.if_dev)) -#ifdef CONFIG_MAP_SUPPORT - || (pAd->ApCfg.MBSSID[apidx].wdev.bcn_buf.bBcnSntReq == FALSE) -#endif - )) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Bssid IF didn't up yet.\n")); - goto error; - } /* End of if */ - - if (!VALID_UCAST_ENTRY_WCID(pAd, Elem->Wcid)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AUTH - Invalid wcid (%d).\n", Elem->Wcid)); - goto error; - } - - pEntry = &pAd->MacTab.Content[Elem->Wcid]; - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - if (!RTMPEqualMemory( - auth_info->addr1, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid, - MAC_ADDR_LEN)) { - MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); - pEntry = NULL; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("AUTH - Bssid does not match\n")); - } else - ba_session_tear_down_all(pAd, pEntry->wcid); - } - - pRcvHdr = (PHEADER_802_11)(Elem->Msg); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - MBSS(%d), Rcv AUTH seq#%d, Alg=%02x, Status=%d from [wcid=%d]%02x:%02x:%02x:%02x:%02x:%02x\n", - apidx, auth_info->auth_seq, auth_info->auth_alg, - auth_info->auth_status, Elem->Wcid, - PRINT_MAC(auth_info->addr2))); - - if (pEntry && MAC_ADDR_EQUAL(auth_info->addr2, pAd->ApMlmeAux.Addr)) { -#ifdef DOT11R_FT_SUPPORT - pFtCfg = &pAd->ApCfg.MBSSID[apidx].wdev.FtCfg; - - if ((pFtCfg->FtCapFlag.Dot11rFtEnable) && - (auth_info->auth_alg == AUTH_MODE_FT)) { - USHORT result; - - os_alloc_mem(pAd, (UCHAR **)&pFtInfoBuf, - sizeof(FT_INFO)); - - if (pFtInfoBuf) { - os_alloc_mem( - pAd, - (UCHAR **)&( - pFtInfoBuf->RicInfo.pRicInfo), - 512); - - if (pFtInfoBuf->RicInfo.pRicInfo != NULL) { - result = FT_AuthConfirmHandler( - pAd, pEntry, &auth_info->FtInfo, - pFtInfoBuf); - FT_EnqueueAuthReply( - pAd, pRcvHdr, - auth_info->auth_alg, 4, result, - &pFtInfoBuf->MdIeInfo, - &pFtInfoBuf->FtIeInfo, - &pFtInfoBuf->RicInfo, - pFtInfoBuf->RSN_IE, - pFtInfoBuf->RSNIE_Len); - os_free_mem( - pFtInfoBuf->RicInfo.pRicInfo); - } - - os_free_mem(pFtInfoBuf); - } - } else -#endif /* DOT11R_FT_SUPPORT */ - if ((pRcvHdr->FC.Wep == 1) && - NdisEqualMemory(auth_info->Chtxt, - pAd->ApMlmeAux.Challenge, - CIPHER_TEXT_LEN)) { - struct wifi_dev *wdev = - &pAd->ApCfg.MBSSID[apidx].wdev; - /* Copy security config from AP to STA's entry */ - pEntry->SecConfig.AKMMap = - wdev->SecConfig.AKMMap; - pEntry->SecConfig.PairwiseCipher = - wdev->SecConfig.PairwiseCipher; - pEntry->SecConfig.PairwiseKeyId = - wdev->SecConfig.PairwiseKeyId; - pEntry->SecConfig.GroupCipher = - wdev->SecConfig.GroupCipher; - pEntry->SecConfig.GroupKeyId = - wdev->SecConfig.GroupKeyId; - os_move_mem(pEntry->SecConfig.WepKey, - wdev->SecConfig.WepKey, - sizeof(SEC_KEY_INFO) * SEC_KEY_NUM); - pEntry->SecConfig.GroupKeyId = - wdev->SecConfig.GroupKeyId; - /* Successful */ - APPeerAuthSimpleRspGenAndSend( - pAd, pRcvHdr, auth_info->auth_alg, - auth_info->auth_seq + 1, MLME_SUCCESS); - pEntry->AuthState = AS_AUTH_KEY; - /*According to specific, if it already in SST_ASSOC, it can not go back */ - if (pEntry->Sst != SST_ASSOC) - pEntry->Sst = SST_AUTH; - } else { - /* send wireless event - Authentication rejected because of challenge failure */ - RTMPSendWirelessEvent( - pAd, IW_AUTH_REJECT_CHALLENGE_FAILURE, - pEntry->Addr, 0, 0); - /* fail - wep bit is not set or challenge text is not equal */ - APPeerAuthSimpleRspGenAndSend( - pAd, pRcvHdr, auth_info->auth_alg, - auth_info->auth_seq + 1, - MLME_REJ_CHALLENGE_FAILURE); -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, - pEntry->Addr, - DIAG_CONN_AUTH_FAIL, - REASON_CHALLENGE_FAIL); -#endif - MacTableDeleteEntry(pAd, pEntry->wcid, - pEntry->Addr); - /*Chtxt[127]='\0'; */ - /*pAd->ApMlmeAux.Challenge[127]='\0'; */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s\n", - ((pRcvHdr->FC.Wep == 1) ? - "challenge text is not equal" : - "wep bit is not set"))); - /*MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Sent Challenge = %s\n",&pAd->ApMlmeAux.Challenge[100])); */ - /*MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Rcv Challenge = %s\n",&Chtxt[100])); */ - } - } else { - /* fail for unknown reason. most likely is AuthRspAux machine be overwritten by another */ - /* STA also using SHARED_KEY authentication */ - APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info->auth_alg, - auth_info->auth_seq + 1, - MLME_UNSPECIFY_FAIL); - - /* If this STA exists, delete it. */ - if (pEntry) { -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, - pEntry->Addr, DIAG_CONN_AUTH_FAIL, - REASON_UNKNOWN); -#endif - MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); - } - } -error: - os_free_mem(auth_info); -} - -/* - ========================================================================== - Description: - Some STA/AP - Note: - This action should never trigger AUTH state transition, therefore we - separate it from AUTH state machine, and make it as a standalone service - ========================================================================== - */ -VOID APCls2errAction(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - HEADER_802_11 Hdr; - UCHAR *pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - USHORT Reason = REASON_CLS2ERR; - MAC_TABLE_ENTRY *pEntry = NULL; - UCHAR apidx; - - if (VALID_UCAST_ENTRY_WCID(pAd, pRxBlk->wcid)) - pEntry = &(pAd->MacTab.Content[pRxBlk->wcid]); - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { -#ifdef WIFI_DIAG - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_DEAUTH, Reason); -#endif -#ifdef MAP_R2 - wapp_handle_sta_disassoc(pAd, pEntry->wcid, Reason); -#endif - /*ApLogEvent(pAd, pAddr, EVENT_DISASSOCIATED); */ - mac_entry_delete(pAd, pEntry); - } else { - apidx = get_apidx_by_addr(pAd, pRxBlk->Addr1); - - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Class 2 error but not my bssid %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pRxBlk->Addr1))); - return; - } - } - - /* send out DEAUTH frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Class 2 error, Send DEAUTH frame to %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pRxBlk->Addr2))); - MgtMacHeaderInit(pAd, &Hdr, SUBTYPE_DEAUTH, 0, pRxBlk->Addr2, - pRxBlk->Addr1, pRxBlk->Addr1); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &Hdr, 2, - &Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -} - -/* - ========================================================================== - Description: - authenticate state machine init, including state transition and timer init - Parameters: - Sm - pointer to the auth state machine - Note: - The state machine looks like this - - AP_AUTH_REQ_IDLE - APMT2_MLME_DEAUTH_REQ mlme_deauth_req_action - ========================================================================== - */ -void APAuthStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]) -{ - StateMachineInit(Sm, (STATE_MACHINE_FUNC *)Trans, AP_MAX_AUTH_STATE, - AP_MAX_AUTH_MSG, (STATE_MACHINE_FUNC)Drop, - AP_AUTH_REQ_IDLE, AP_AUTH_MACHINE_BASE); - /* the first column */ - StateMachineSetAction(Sm, AP_AUTH_REQ_IDLE, APMT2_MLME_DEAUTH_REQ, - (STATE_MACHINE_FUNC)APMlmeDeauthReqAction); - StateMachineSetAction(Sm, AP_AUTH_REQ_IDLE, APMT2_PEER_DEAUTH, - (STATE_MACHINE_FUNC)APPeerDeauthReqAction); - StateMachineSetAction(Sm, AP_AUTH_REQ_IDLE, APMT2_PEER_AUTH_REQ, - (STATE_MACHINE_FUNC)APPeerAuthReqAtIdleAction); - StateMachineSetAction(Sm, AP_AUTH_REQ_IDLE, APMT2_PEER_AUTH_CONFIRM, - (STATE_MACHINE_FUNC)APPeerAuthConfirmAction); -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_autoChSel.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_autoChSel.c deleted file mode 100644 index 099e6b4d47..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_autoChSel.c +++ /dev/null @@ -1,4506 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - - Abstract: -*/ - -#include "rt_config.h" -#include "ap_autoChSel.h" -#ifdef TR181_SUPPORT -#include "hdev/hdev_basic.h" -#endif - -extern UCHAR ZeroSsid[32]; - -extern COUNTRY_REGION_CH_DESC Country_Region_ChDesc_2GHZ[]; -extern UINT16 const Country_Region_GroupNum_2GHZ; -extern COUNTRY_REGION_CH_DESC Country_Region_ChDesc_5GHZ[]; -extern UINT16 const Country_Region_GroupNum_5GHZ; -#ifdef AP_SCAN_SUPPORT -extern INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, - struct wifi_dev *pwdev); -#endif /*AP_SCAN_SUPPORT*/ - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -extern VOID DfsV10AddWeighingFactor(IN PRTMP_ADAPTER pAd, - IN struct wifi_dev *pwdev); -#endif - -#ifdef DOT11_VHT_AC -struct vht_ch_layout { - UCHAR ch_low_bnd; - UCHAR ch_up_bnd; - UCHAR cent_freq_idx; -}; -#endif /* DOT11_VHT_AC */ - -static inline INT GetABandChOffset(IN INT Channel) -{ -#ifdef A_BAND_SUPPORT - - if ((Channel == 36) || (Channel == 44) || (Channel == 52) || - (Channel == 60) || (Channel == 100) || (Channel == 108) || - (Channel == 116) || (Channel == 124) || (Channel == 132) || - (Channel == 149) || (Channel == 157)) - return 1; - else if ((Channel == 40) || (Channel == 48) || (Channel == 56) || - (Channel == 64) || (Channel == 104) || (Channel == 112) || - (Channel == 120) || (Channel == 128) || (Channel == 136) || - (Channel == 153) || (Channel == 161)) - return -1; - -#endif /* A_BAND_SUPPORT */ - return 0; -} - -ULONG AutoChBssSearchWithSSID(IN PRTMP_ADAPTER pAd, IN PUCHAR Bssid, - IN PUCHAR pSsid, IN UCHAR SsidLen, - IN UCHAR Channel, IN struct wifi_dev *pwdev) -{ - UCHAR i; - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - PBSSINFO pBssInfoTab = pAutoChCtrl->pBssInfoTab; - - if (pBssInfoTab == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAd->pBssInfoTab equal NULL.\n")); - return (ULONG)BSS_NOT_FOUND; - } - - for (i = 0; i < pBssInfoTab->BssNr; i++) { - if ((((pBssInfoTab->BssEntry[i].Channel <= 14) && - (Channel <= 14)) || - ((pBssInfoTab->BssEntry[i].Channel > 14) && - (Channel > 14))) && - MAC_ADDR_EQUAL(&(pBssInfoTab->BssEntry[i].Bssid), Bssid) && - (SSID_EQUAL(pSsid, SsidLen, pBssInfoTab->BssEntry[i].Ssid, - pBssInfoTab->BssEntry[i].SsidLen) || - (NdisEqualMemory(pSsid, ZeroSsid, SsidLen)) || - (NdisEqualMemory(pBssInfoTab->BssEntry[i].Ssid, ZeroSsid, - pBssInfoTab->BssEntry[i].SsidLen)))) - return i; - } - - return (ULONG)BSS_NOT_FOUND; -} - -static inline VOID AutoChBssEntrySet(OUT BSSENTRY *pBss, IN PUCHAR pBssid, - IN CHAR Ssid[], IN UCHAR SsidLen, - IN UCHAR Channel, IN UCHAR ExtChOffset, - IN CHAR Rssi) -{ - COPY_MAC_ADDR(pBss->Bssid, pBssid); - - if (SsidLen > 0 && SsidLen <= MAX_LEN_OF_SSID) { - /* - For hidden SSID AP, it might send beacon with SSID len equal to 0, - Or send beacon /probe response with SSID len matching real SSID length, - but SSID is all zero. such as "00-00-00-00" with length 4. - We have to prevent this case overwrite correct table - */ - if (NdisEqualMemory(Ssid, ZeroSsid, SsidLen) == 0) { - NdisMoveMemory(pBss->Ssid, Ssid, SsidLen); - pBss->SsidLen = SsidLen; - } - } - - pBss->Channel = Channel; - pBss->ExtChOffset = ExtChOffset; - pBss->Rssi = Rssi; -} - -VOID UpdateChannelInfo(IN PRTMP_ADAPTER pAd, IN int ch_index, - IN ChannelSel_Alg Alg, IN struct wifi_dev *pwdev) -{ - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); -#ifdef ACS_CTCC_SUPPORT - CHANNEL_CTRL *ch_ctrl = NULL; - INT score = 0; - - ch_ctrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); -#endif - if (pAutoChCtrl->pChannelInfo != NULL) { - UINT32 BusyTime; - UINT32 cca_cnt = AsicGetCCACnt(pAd); - - if (Alg == ChannelAlgCCA) { - pAd->RalinkCounters.OneSecFalseCCACnt += cca_cnt; - pAutoChCtrl->pChannelInfo->FalseCCA[ch_index] = cca_cnt; - } - - /* - do busy time statistics for primary channel - scan time 200ms, beacon interval 100 ms - */ - BusyTime = AsicGetChBusyCnt(pAd, BandIdx); -#if (defined(CUSTOMER_DCC_FEATURE) || defined(OFFCHANNEL_SCAN_FEATURE)) - if ((pAd->ScanCtrl - .ScanTime[pAd->ScanCtrl.CurrentGivenChan_Index]) != - 0) - pAd->ScanCtrl.ScanTimeActualEnd = jiffies; -#endif -#ifdef AP_QLOAD_SUPPORT - pAutoChCtrl->pChannelInfo->chanbusytime[ch_index] = - (BusyTime * 100) / AUTO_CHANNEL_SEL_TIMEOUT; -#else - pAutoChCtrl->pChannelInfo->chanbusytime[ch_index] = - (BusyTime * 100) / 200; -#endif /* AP_QLOAD_SUPPORT */ -#ifdef OFFCHANNEL_SCAN_FEATURE - pAd->ChannelInfo.chanbusytime[ch_index] = BusyTime; - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] channel busy time[%d] = %d\n", __func__, - ch_index, BusyTime)); -#ifndef NEIGHBORING_AP_STAT - if ((pAd->ScanCtrl - .ScanTime[pAd->ScanCtrl.CurrentGivenChan_Index]) != - 0) { - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] calling Calculate_NF with bandidx = %d\n", - __func__, pAd->ChannelInfo.bandidx)); - Calculate_NF(pAd, pAd->ChannelInfo.bandidx); - } -#endif -#endif -#ifdef CUSTOMER_DCC_FEATURE - pAd->ChannelInfo.FalseCCA[ch_index] = cca_cnt; - if (!pAd->ChannelInfo.GetChannelInfo) - pAd->ChannelInfo.GetChannelInfo = TRUE; -#endif -#if (defined(CUSTOMER_DCC_FEATURE) || defined(OFFCHANNEL_SCAN_FEATURE)) - if ((pAd->ScanCtrl - .ScanTime[pAd->ScanCtrl.CurrentGivenChan_Index]) != - 0) { - /* Calculate the channel busy value precision by using actual scan time */ - pAd->ScanCtrl.ScanTimeActualDiff = - (UCHAR)jiffies_to_msecs( - abs(pAd->ScanCtrl.ScanTimeActualEnd - - pAd->ScanCtrl.ScanTimeActualStart)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("time_diff: %d Busytime: %d\n", - pAd->ScanCtrl.ScanTimeActualDiff, - pAd->ChannelInfo.chanbusytime[ch_index])); - } -#endif -#ifdef ACS_CTCC_SUPPORT -#ifdef AP_QLOAD_SUPPORT - score = 100 - BusyTime / (AUTO_CHANNEL_SEL_TIMEOUT * 10); - pAutoChCtrl->pChannelInfo->supp_ch_list[ch_index].busy_time = - (BusyTime * 100) / AUTO_CHANNEL_SEL_TIMEOUT; -#else - score = 100 - BusyTime / (200 * 10); - pAutoChCtrl->pChannelInfo->supp_ch_list[ch_index].busy_time = - (BusyTime * 100) / 200; -#endif - if (score < 0) - score = 0; - pAutoChCtrl->pChannelInfo->channel_score[ch_index].score = - score; - pAutoChCtrl->pChannelInfo->channel_score[ch_index].channel = - ch_ctrl->ChList[ch_index].Channel; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("channel %d busytime %d\n", - pAutoChCtrl->pChannelInfo->supp_ch_list[ch_index] - .channel, - pAutoChCtrl->pChannelInfo->chanbusytime[ch_index])); -#endif - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAutoChCtrl->pChannelInfo equal NULL.\n")); -} - -static inline INT GetChIdx(IN PRTMP_ADAPTER pAd, IN UCHAR Channel, - IN UCHAR BandIdx) -{ - INT Idx; - - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - - for (Idx = 0; Idx < pChCtrl->ChListNum; Idx++) { - if (Channel == pChCtrl->ChList[Idx].Channel) - break; - } - - return Idx; -} - -static inline VOID AutoChannelSkipListSetDirty(IN PRTMP_ADAPTER pAd) -{ - UCHAR i; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - UCHAR BandIdx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - for (i = 0; i < pAd->ApCfg.AutoChannelSkipListNum; i++) { - UCHAR channel_idx = GetChIdx( - pAd, pAd->ApCfg.AutoChannelSkipList[i], BandIdx); - - if (channel_idx != pChCtrl->ChListNum) - pAutoChCtrl->pChannelInfo->SkipList[channel_idx] = TRUE; - } -} - -static inline BOOLEAN AutoChannelSkipListCheck(IN PRTMP_ADAPTER pAd, - IN UCHAR Ch) -{ - UCHAR i; - BOOLEAN result = FALSE; - - for (i = 0; i < pAd->ApCfg.AutoChannelSkipListNum; i++) { - if (Ch == pAd->ApCfg.AutoChannelSkipList[i]) { - result = TRUE; - break; - } - } - - return result; -} - -static inline BOOLEAN BW40_ChannelCheck(IN UCHAR ch) -{ - INT i; - BOOLEAN result = TRUE; - UCHAR NorBW40_CH[] = { 140, 165 }; - UCHAR NorBW40ChNum = sizeof(NorBW40_CH) / sizeof(UCHAR); - - for (i = 0; i < NorBW40ChNum; i++) { - if (ch == NorBW40_CH[i]) { - result = FALSE; - break; - } - } - - return result; -} - -static inline UCHAR SelectClearChannelRandom(RTMP_ADAPTER *pAd) -{ - UCHAR cnt, ch = 0, i, RadomIdx; - /*BOOLEAN bFindIt = FALSE;*/ - UINT8 TempChList[MAX_NUM_OF_CHANNELS] = { 0 }; - UCHAR cfg_ht_bw = - wlan_config_get_ht_bw(&pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev); - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - UCHAR BandIdx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - - if (pAd->CommonCfg.bIEEE80211H) { - cnt = 0; - - /* Filter out an available channel list */ - for (i = 0; i < pChCtrl->ChListNum; i++) { - /* Check DFS channel RemainingTimeForUse */ - if (pChCtrl->ChList[i].RemainingTimeForUse) - continue; - - /* Check skip channel list */ - if (AutoChannelSkipListCheck( - pAd, pChCtrl->ChList[i].Channel) == TRUE) - continue; - -#ifdef DOT11_N_SUPPORT - - /* Check N-group of BW40 */ - if (cfg_ht_bw == BW_40 && - !(pChCtrl->ChList[i].Flags & CHANNEL_40M_CAP)) - continue; - -#endif /* DOT11_N_SUPPORT */ - /* Store available channel to temp list */ - TempChList[cnt++] = pChCtrl->ChList[i].Channel; - } - - /* Randomly select a channel from temp list */ - if (cnt) { - RadomIdx = RandomByte2(pAd) % cnt; - ch = TempChList[RadomIdx]; - } else - ch = get_channel_by_reference( - pAd, 1, &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev); - } else { - ch = pChCtrl->ChList[RandomByte2(pAd) % pChCtrl->ChListNum] - .Channel; - - if (ch == 0) - ch = FirstChannel(pAd, wdev); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Select Channel %d\n", __func__, ch)); - return ch; -} - -/* - ========================================================================== - Description: - This routine calaulates the dirtyness of all channels by the - CCA value and Rssi. Store dirtyness to pChannelInfo strcut. - This routine is called at iwpriv cmmand or initialization. It chooses and returns - a good channel whith less interference. - Return: - ch - channel number that - NOTE: - ========================================================================== - */ -static inline UCHAR SelectClearChannelCCA(RTMP_ADAPTER *pAd) -{ -#define CCA_THRESHOLD (100) - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - UCHAR BandIdx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - PBSSINFO pBssInfoTab = pAutoChCtrl->pBssInfoTab; - PCHANNELINFO pChannelInfo = pAutoChCtrl->pChannelInfo; - INT ch = 1, channel_idx, BssTab_idx; - BSSENTRY *pBss; - UINT32 min_dirty, min_falsecca; - int candidate_ch; - UCHAR ExChannel[2] = { 0 }, candidate_ExChannel[2] = { 0 }; - UCHAR base; - UCHAR cfg_ht_bw = - wlan_config_get_ht_bw(&pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev); - - if (pBssInfoTab == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAd->pBssInfoTab equal NULL.\n")); - return FirstChannel(pAd, wdev); - } - - if (pChannelInfo == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAd->pChannelInfo equal NULL.\n")); - return FirstChannel(pAd, wdev); - } - - for (BssTab_idx = 0; BssTab_idx < pBssInfoTab->BssNr; BssTab_idx++) { - pBss = &(pBssInfoTab->BssEntry[BssTab_idx]); - channel_idx = GetChIdx(pAd, pBss->Channel, BandIdx); - - if (channel_idx < 0 || channel_idx >= MAX_NUM_OF_CHANNELS + 1) - continue; - - if (pBss->Rssi >= RSSI_TO_DBM_OFFSET - 50) { - /* high signal >= -50 dbm */ - pChannelInfo->dirtyness[channel_idx] += 50; - } else if (pBss->Rssi <= RSSI_TO_DBM_OFFSET - 80) { - /* low signal <= -80 dbm */ - pChannelInfo->dirtyness[channel_idx] += 30; - } else { - /* mid signal -50 ~ -80 dbm */ - pChannelInfo->dirtyness[channel_idx] += 40; - } - - pChannelInfo->dirtyness[channel_idx] += 40; - { - INT BelowBound; - INT AboveBound; - INT loop; - - switch (pBss->ExtChOffset) { - case EXTCHA_ABOVE: - BelowBound = pChannelInfo->IsABand ? 1 : 4; - AboveBound = pChannelInfo->IsABand ? 2 : 8; - break; - - case EXTCHA_BELOW: - BelowBound = pChannelInfo->IsABand ? 2 : 8; - AboveBound = pChannelInfo->IsABand ? 1 : 4; - break; - - default: - BelowBound = pChannelInfo->IsABand ? 1 : 4; - AboveBound = pChannelInfo->IsABand ? 1 : 4; - break; - } - - /* check neighbor channel */ - for (loop = (channel_idx + 1); - loop <= (channel_idx + AboveBound); loop++) { - if (loop >= MAX_NUM_OF_CHANNELS) - break; - - if (pChCtrl->ChList[loop].Channel - - pChCtrl->ChList[loop - 1].Channel > - 4) - break; - - pChannelInfo->dirtyness[loop] += - ((9 - (loop - channel_idx)) * 4); - } - - /* check neighbor channel */ - for (loop = (channel_idx - 1); - loop >= (channel_idx - BelowBound); loop--) { - if (loop < 0 || loop >= MAX_NUM_OF_CHANNELS) - break; - - if (pChCtrl->ChList[(loop + 1) % - MAX_NUM_OF_CHANNELS] - .Channel - - pChCtrl->ChList[loop % - MAX_NUM_OF_CHANNELS] - .Channel > - 4) - continue; - - pChannelInfo->dirtyness[loop] += - ((9 - (channel_idx - loop)) * 4); - } - } - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" ch%d bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", - pBss->Channel, pBss->Bssid[0], pBss->Bssid[1], - pBss->Bssid[2], pBss->Bssid[3], pBss->Bssid[4], - pBss->Bssid[5])); - } - - AutoChannelSkipListSetDirty(pAd); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=====================================================\n")); - - for (channel_idx = 0; channel_idx < pChCtrl->ChListNum; channel_idx++) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Channel %d : Dirty = %ld, False CCA = %u, Busy Time = %u, Skip Channel = %s\n", - pChCtrl->ChList[channel_idx].Channel, - pChannelInfo->dirtyness[channel_idx], - pChannelInfo->FalseCCA[channel_idx], -#ifdef AP_QLOAD_SUPPORT - pChannelInfo->chanbusytime[channel_idx], -#else - 0, -#endif /* AP_QLOAD_SUPPORT */ - (pChannelInfo->SkipList[channel_idx] == TRUE) ? - "TRUE" : - "FALSE")); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=====================================================\n")); - min_dirty = min_falsecca = 0xFFFFFFFF; - /* - * Rule 1. Pick up a good channel that False_CCA =< CCA_THRESHOLD - * by dirtyness - */ - candidate_ch = -1; - - for (channel_idx = 0; channel_idx < pChCtrl->ChListNum; channel_idx++) { - if (pChannelInfo->SkipList[channel_idx] == TRUE) - continue; - - if (pChannelInfo->FalseCCA[channel_idx] <= CCA_THRESHOLD) { - UINT32 dirtyness = pChannelInfo->dirtyness[channel_idx]; - - ch = pChCtrl->ChList[channel_idx].Channel; -#ifdef AP_QLOAD_SUPPORT - - /* QLOAD ALARM */ - /* when busy time of a channel > threshold, skip it */ - /* TODO: Use weight for different references to do channel selection */ - if (QBSS_LoadIsBusyTimeAccepted( - pAd, - pChannelInfo->chanbusytime[channel_idx]) == - FALSE) { - /* check next one */ - continue; - } - -#endif /* AP_QLOAD_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - /* - User require 40MHz Bandwidth. - In the case, ignor all channel - doesn't support 40MHz Bandwidth. - */ - if ((cfg_ht_bw == BW_40) && - (pChannelInfo->IsABand && - (GetABandChOffset(ch) == 0))) - continue; - - /* - Need to Consider the dirtyness of extending channel - in 40 MHz bandwidth channel. - */ - if (cfg_ht_bw == BW_40) { - if (pAutoChCtrl->pChannelInfo->IsABand) { - if (((channel_idx + - GetABandChOffset(ch)) >= 0) && - ((channel_idx + - GetABandChOffset(ch)) < - pChCtrl->ChListNum)) { - INT ChOffsetIdx = - channel_idx + - GetABandChOffset(ch); - - dirtyness += - pChannelInfo->dirtyness - [ChOffsetIdx]; - } - } else { - UCHAR ExChannel_idx = 0; - - if (pChCtrl->ChList[channel_idx] - .Channel == 14) { - dirtyness = 0xFFFFFFFF; - break; - } - NdisZeroMemory(ExChannel, - sizeof(ExChannel)); - - if (((channel_idx - 4) >= 0) && - ((channel_idx - 4) < - pChCtrl->ChListNum)) { - dirtyness += - pChannelInfo->dirtyness - [channel_idx - - 4]; - ExChannel[ExChannel_idx++] = - pChCtrl->ChList - [channel_idx - 4] - .Channel; - } - - if (((channel_idx + 4) >= 0) && - ((channel_idx + 4) < - pChCtrl->ChListNum)) { - dirtyness += - pChannelInfo->dirtyness - [channel_idx + - 4]; - ExChannel[ExChannel_idx++] = - pChCtrl->ChList - [channel_idx + 4] - .Channel; - } - } - } - -#endif /* DOT11_N_SUPPORT */ - - if (min_dirty > dirtyness) { - min_dirty = dirtyness; - candidate_ch = channel_idx; - NdisMoveMemory(candidate_ExChannel, ExChannel, - 2); - } - } - } - - if (candidate_ch >= 0) { - ch = pChCtrl->ChList[candidate_ch].Channel; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rule 1 CCA value : Min Dirtiness (Include extension channel) ==> Select Channel %d\n", - ch)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Min Dirty = %u\n", min_dirty)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ExChannel = %d , %d\n", candidate_ExChannel[0], - candidate_ExChannel[1])); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("BW = %s\n", - (cfg_ht_bw == BW_40) ? "40" : "20")); - return ch; - } - - /* - * Rule 2. Pick up a good channel that False_CCA > CCA_THRESHOLD - * by FalseCCA (FalseCCA + Dirtyness) - */ - candidate_ch = -1; - - for (channel_idx = 0; channel_idx < pChCtrl->ChListNum; channel_idx++) { - if (pChannelInfo->SkipList[channel_idx] == TRUE) - continue; - - if (pChannelInfo->FalseCCA[channel_idx] > CCA_THRESHOLD) { - UINT32 falsecca = pChannelInfo->FalseCCA[channel_idx] + - pChannelInfo->dirtyness[channel_idx]; - - ch = pChCtrl->ChList[channel_idx].Channel; -#ifdef DOT11_N_SUPPORT - - if ((cfg_ht_bw == BW_40) && - (pChannelInfo->IsABand && - (GetABandChOffset(ch) == 0))) - continue; - -#endif /* DOT11_N_SUPPORT */ - - if ((GetABandChOffset(ch) != 0) && - ((channel_idx + GetABandChOffset(ch)) >= 0) && - ((channel_idx + GetABandChOffset(ch)) < - pChCtrl->ChListNum)) { - INT ChOffsetIdx = - channel_idx + GetABandChOffset(ch); - - falsecca += - (pChannelInfo->FalseCCA[ChOffsetIdx] + - pChannelInfo->dirtyness[ChOffsetIdx]); - } - -#ifdef AP_QLOAD_SUPPORT - - /* QLOAD ALARM */ - /* when busy time of a channel > threshold, skip it */ - /* TODO: Use weight for different references to do channel selection */ - if (QBSS_LoadIsBusyTimeAccepted( - pAd, - pChannelInfo->chanbusytime[channel_idx]) == - FALSE) { - /* check next one */ - continue; - } - -#endif /* AP_QLOAD_SUPPORT */ - - if (min_falsecca > falsecca) { - min_falsecca = falsecca; - candidate_ch = channel_idx; - } - } - } - - if (candidate_ch >= 0) { - ch = pChCtrl->ChList[candidate_ch].Channel; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rule 2 CCA value : Min False CCA value ==> Select Channel %d, min falsecca = %d\n", - ch, min_falsecca)); - return ch; - } - - base = RandomByte2(pAd); - - for (channel_idx = 0; channel_idx < pChCtrl->ChListNum; channel_idx++) { - ch = pChCtrl->ChList[(base + channel_idx) % pChCtrl->ChListNum] - .Channel; - - if (AutoChannelSkipListCheck(pAd, ch)) - continue; - - if ((pAd->ApCfg.bAvoidDfsChannel == TRUE) && - (pChannelInfo->IsABand == TRUE) && - RadarChannelCheck(pAd, ch)) - continue; - - break; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rule 3 CCA value : Randomly Select ==> Select Channel %d\n", - ch)); - return ch; -} - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -VOID AutoChannelSkipChannels(IN PRTMP_ADAPTER pAd, IN UCHAR size, - IN UINT16 grpStart) -{ - UCHAR i = 0; - - for (i = 0; i < size; i++) - AutoChannelSkipListAppend(pAd, (grpStart + (i * 4))); -} - -VOID AutoChannelSkipListClear(IN PRTMP_ADAPTER pAd) -{ - UCHAR ChIdx = 0; - - os_zero_mem(pAd->ApCfg.AutoChannelSkipList, 20); - pAd->ApCfg.AutoChannelSkipListNum = 0; - - for (ChIdx = 0; ChIdx < 20; ChIdx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] Ch = %3d\n", __func__, - pAd->ApCfg.AutoChannelSkipList[ChIdx])); - } -} - -VOID AutoChannelSkipListAppend(IN PRTMP_ADAPTER pAd, IN UCHAR Ch) -{ - pAd->ApCfg.AutoChannelSkipList[pAd->ApCfg.AutoChannelSkipListNum] = Ch; - - pAd->ApCfg.AutoChannelSkipListNum++; -} - -BOOLEAN DfsV10ACSMarkChnlConsumed(IN PRTMP_ADAPTER pAd, IN UCHAR channel) -{ - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; - UCHAR i = 0; - BOOLEAN status = FALSE; - UCHAR channelcount = 0; - - if (IS_DFS_V10_ACS_VALID(pAd) == FALSE) - return FALSE; - - if (pAd->CommonCfg.bCh144Enabled) - channelcount = V10_TOTAL_CHANNEL_COUNT; - else - channelcount = V10_TOTAL_CHANNEL_COUNT - 1; - - for (i = 0; i < channelcount; i++) { - if (channel == pDfsParam->DfsV10SortedACSList[i].Channel) { - pDfsParam->DfsV10SortedACSList[i].isConsumed = TRUE; - status = TRUE; - break; - } else - continue; - } - - if (status == FALSE) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] Channel %d not found \n", __func__, channel)); - - return status; -} - -BOOLEAN DfsV10ACSListSortFunction(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev) -{ - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; - UINT_32 temp_busy = 0; - UCHAR i = 0, j = 0, temp_chnl = 0; - UCHAR BandIdx = HcGetBandByWdev(wdev); - - if ((!pAd->ApCfg.bAutoChannelAtBootup[BandIdx]) && - IS_DFS_V10_ACS_VALID(pAd)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] False Entry \n", __func__)); - return FALSE; - } - - for (i = 0; i < V10_TOTAL_CHANNEL_COUNT; i++) { - for (j = i + 1; j < V10_TOTAL_CHANNEL_COUNT; j++) { - if (pDfsParam->DfsV10SortedACSList[i].BusyTime > - pDfsParam->DfsV10SortedACSList[j].BusyTime) { - temp_busy = pDfsParam->DfsV10SortedACSList[i] - .BusyTime; - temp_chnl = pDfsParam->DfsV10SortedACSList[i] - .Channel; - - pDfsParam->DfsV10SortedACSList[i].BusyTime = - pDfsParam->DfsV10SortedACSList[j] - .BusyTime; - pDfsParam->DfsV10SortedACSList[i].Channel = - pDfsParam->DfsV10SortedACSList[j] - .Channel; - - pDfsParam->DfsV10SortedACSList[j].BusyTime = - temp_busy; - pDfsParam->DfsV10SortedACSList[j].Channel = - temp_chnl; - } - } - } - - for (i = 0; i < V10_TOTAL_CHANNEL_COUNT; i++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel %d\t", - pDfsParam->DfsV10SortedACSList[i].Channel)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Busy Time %d\t", - pDfsParam->DfsV10SortedACSList[i].BusyTime)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Used %d\n", - pDfsParam->DfsV10SortedACSList[i].isConsumed)); - } - - pDfsParam->bV10ChannelListValid = TRUE; - - return TRUE; -} -#endif - -/* - ========================================================================== - Description: - This routine calaulates the dirtyness of all channels by the dirtiness value and - number of AP in each channel and stores in pChannelInfo strcut. - This routine is called at iwpriv cmmand or initialization. It chooses and returns - a good channel whith less interference. - Return: - ch - channel number that - NOTE: - ========================================================================== - */ -static inline UCHAR SelectClearChannelApCnt(RTMP_ADAPTER *pAd, - struct wifi_dev *pwdev) -{ - /*PBSSINFO pBssInfoTab = pAutoChCtrl->pBssInfoTab; */ - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - PCHANNELINFO pChannelInfo = pAutoChCtrl->pChannelInfo; - /*BSSENTRY *pBss; */ - UCHAR channel_index = 0, dirty, base = 0; - UCHAR final_channel = 0; - UCHAR op_ht_bw = wlan_operate_get_ht_bw(pwdev); - UCHAR ext_cha = wlan_operate_get_ext_cha(pwdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - - if (pChannelInfo == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAd->pChannelInfo equal NULL.\n")); - return FirstChannel(pAd, pwdev); - } - - /* Calculate Dirtiness */ - - for (channel_index = 0; channel_index < pChCtrl->ChListNum; - channel_index++) { - if (pChannelInfo->ApCnt[channel_index] > 0) { - INT ll; - - pChannelInfo->dirtyness[channel_index] += 30; - - /*5G */ - if (pChannelInfo->IsABand) { - int Channel = - pChCtrl->ChList[channel_index].Channel; - - /*Make secondary channel dirty */ - if (op_ht_bw == BW_40) { - if (Channel > 14) { - if ((Channel == 36) || - (Channel == 44) || - (Channel == 52) || - (Channel == 60) || - (Channel == 100) || - (Channel == 108) || - (Channel == 116) || - (Channel == 124) || - (Channel == 132) || - (Channel == 149) || - (Channel == 157)) { - if (channel_index + 1 < - MAX_NUM_OF_CHANNELS) - if (pChCtrl->ChList[channel_index + - 1] - .Channel - - pChCtrl->ChList[channel_index] - .Channel == - 4) - pChannelInfo - ->dirtyness - [channel_index + - 1] += - 1; - } else if ((Channel == 40) || - (Channel == 48) || - (Channel == 56) || - (Channel == 64) || - (Channel == 104) || - (Channel == 112) || - (Channel == 120) || - (Channel == 128) || - (Channel == 136) || - (Channel == 153) || - (Channel == 161)) { - if (channel_index - 1 >= - 0) - if (pChCtrl->ChList[channel_index] - .Channel - - pChCtrl->ChList - [channel_index - - 1] - .Channel == - 4) - pChannelInfo - ->dirtyness - [channel_index - - 1] += - 1; - } - } - } - } - - /*2.4G */ - if (!pChannelInfo->IsABand) { - int ChanOffset = 0; - - if ((op_ht_bw == BW_40) && - (ext_cha == EXTCHA_BELOW)) { - /* - BW is 40Mhz - the distance between two channel to prevent interference - is 4 channel width plus 4 channel width (secondary channel) - */ - ChanOffset = 8; - } else { - /* - BW is 20Mhz - The channel width of 2.4G band is 5Mhz. - The distance between two channel to prevent interference is 4 channel width - */ - ChanOffset = 4; - } - - for (ll = channel_index + 1; - ll < (channel_index + ChanOffset + 1); - ll++) { - if (ll < MAX_NUM_OF_CHANNELS) - pChannelInfo->dirtyness[ll]++; - } - - if ((op_ht_bw == BW_40) && - (ext_cha == EXTCHA_ABOVE)) { - /* BW is 40Mhz */ - ChanOffset = 8; - } else { - /* BW is 20Mhz */ - ChanOffset = 4; - } - - for (ll = channel_index - 1; - ll > (channel_index - ChanOffset - 1); - ll--) { - if (ll >= 0 && - ll < MAX_NUM_OF_CHANNELS + 1) - pChannelInfo->dirtyness[ll]++; - } - } - } - } /* Calculate Dirtiness */ - - AutoChannelSkipListSetDirty(pAd); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=====================================================\n")); - - for (channel_index = 0; channel_index < pChCtrl->ChListNum; - channel_index++) - /* debug messages */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Channel %d : Dirty = %ld, ApCnt=%ld, Busy Time = %d, Skip Channel = %s\n", - pChCtrl->ChList[channel_index].Channel, - pChannelInfo->dirtyness[channel_index], - pChannelInfo->ApCnt[channel_index], -#ifdef AP_QLOAD_SUPPORT - pChannelInfo->chanbusytime[channel_index], -#else - 0, -#endif /* AP_QLOAD_SUPPORT */ - (pChannelInfo->SkipList[channel_index] == TRUE) ? - "TRUE" : - "FALSE")); - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=====================================================\n")); - pAd->ApCfg.AutoChannel_Channel = 0; - - /* RULE 1. pick up a good channel that no one used */ - - for (channel_index = 0; channel_index < pChCtrl->ChListNum; - channel_index++) { - if (pChannelInfo->SkipList[channel_index] == TRUE) - continue; - - if ((pAd->ApCfg.bAvoidDfsChannel == TRUE) && - (pChannelInfo->IsABand == TRUE) && - RadarChannelCheck(pAd, - pChCtrl->ChList[channel_index].Channel)) - continue; - -#ifdef AP_QLOAD_SUPPORT - - /* QLOAD ALARM */ - if (QBSS_LoadIsBusyTimeAccepted( - pAd, pChannelInfo->chanbusytime[channel_index]) == - FALSE) - continue; - -#endif /* AP_QLOAD_SUPPORT */ - - if (pChannelInfo->dirtyness[channel_index] == 0) - break; - } - - if (channel_index < pChCtrl->ChListNum) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rule 1 APCnt : dirtiness == 0 (no one used and no interference) ==> Select Channel %d\n", - pChCtrl->ChList[channel_index].Channel)); - return pChCtrl->ChList[channel_index].Channel; - } - - /* RULE 2. if not available, then co-use a channel that's no interference (dirtyness=30) */ - /* RULE 3. if not available, then co-use a channel that has minimum interference (dirtyness=31,32) */ - for (dirty = 30; dirty <= 32; dirty++) { - BOOLEAN candidate[MAX_NUM_OF_CHANNELS + 1], candidate_num = 0; - UCHAR min_ApCnt = 255; - - final_channel = 0; - NdisZeroMemory(candidate, MAX_NUM_OF_CHANNELS + 1); - - for (channel_index = 0; channel_index < pChCtrl->ChListNum; - channel_index++) { - if (pChannelInfo->SkipList[channel_index] == TRUE) - continue; - - if (pChannelInfo->dirtyness[channel_index] == dirty) { - candidate[channel_index] = TRUE; - candidate_num++; - } - } - - /* if there's more than 1 candidate, pick up the channel with minimum RSSI */ - if (candidate_num) { - for (channel_index = 0; - channel_index < pChCtrl->ChListNum; - channel_index++) { -#ifdef AP_QLOAD_SUPPORT - - /* QLOAD ALARM */ - /* when busy time of a channel > threshold, skip it */ - /* TODO: Use weight for different references to do channel selection */ - if (QBSS_LoadIsBusyTimeAccepted( - pAd, pChannelInfo->chanbusytime - [channel_index]) == - FALSE) { - /* check next one */ - continue; - } - -#endif /* AP_QLOAD_SUPPORT */ - - if (candidate[channel_index] && - (pChannelInfo->ApCnt[channel_index] < - min_ApCnt)) { - if ((op_ht_bw == BW_40) && - (BW40_ChannelCheck( - pChCtrl->ChList[channel_index] - .Channel) == - FALSE)) - continue; - - if ((pAd->ApCfg.bAvoidDfsChannel == - TRUE) && - (pChannelInfo->IsABand == TRUE) && - RadarChannelCheck( - pAd, - pChCtrl->ChList[channel_index] - .Channel)) - continue; - - final_channel = - pChCtrl->ChList[channel_index] - .Channel; - min_ApCnt = - pChannelInfo - ->ApCnt[channel_index]; - } - } - - if (final_channel != 0) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Rule 2 APCnt : minimum APCnt with minimum interference(dirtiness: 30~32) ==> Select Channel %d\n", - final_channel)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" Dirtiness = %d , Min ApCnt = %d\n", - dirty, min_ApCnt)); - return final_channel; - } - } - } - - /* RULE 3. still not available, pick up the random channel */ - base = RandomByte2(pAd); - - for (channel_index = 0; channel_index < pChCtrl->ChListNum; - channel_index++) { - final_channel = pChCtrl->ChList[(base + channel_index) % - pChCtrl->ChListNum] - .Channel; - - if (AutoChannelSkipListCheck(pAd, final_channel)) - continue; - - if ((pAd->ApCfg.bAvoidDfsChannel == TRUE) && - (pChannelInfo->IsABand == TRUE) && - RadarChannelCheck(pAd, final_channel)) - continue; - - break; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rule 3 APCnt : Randomly Select ==> Select Channel %d\n", - final_channel)); - return final_channel; -} - -ULONG AutoChBssInsertEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pBssid, - IN CHAR Ssid[], IN UCHAR SsidLen, IN UCHAR ChannelNo, - IN UCHAR ExtChOffset, IN CHAR Rssi, - IN struct wifi_dev *pwdev) -{ - ULONG Idx; - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - PBSSINFO pBssInfoTab = pAutoChCtrl->pBssInfoTab; - - if (pBssInfoTab == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAd->pBssInfoTab equal NULL.\n")); - return BSS_NOT_FOUND; - } - - Idx = AutoChBssSearchWithSSID(pAd, pBssid, (PUCHAR)Ssid, SsidLen, - ChannelNo, pwdev); - - if (Idx == BSS_NOT_FOUND) { - Idx = pBssInfoTab->BssNr; - if (Idx >= MAX_LEN_OF_BSS_TABLE) - return BSS_NOT_FOUND; - - AutoChBssEntrySet( - &pBssInfoTab->BssEntry[Idx % MAX_LEN_OF_BSS_TABLE], - pBssid, Ssid, SsidLen, ChannelNo, ExtChOffset, Rssi); - pBssInfoTab->BssNr++; - } else { - AutoChBssEntrySet( - &pBssInfoTab->BssEntry[Idx % MAX_LEN_OF_BSS_TABLE], - pBssid, Ssid, SsidLen, ChannelNo, ExtChOffset, Rssi); - } - - return Idx; -} - -void AutoChBssTableDestroy(RTMP_ADAPTER *pAd) -{ - AUTO_CH_CTRL *pAutoChCtrl; - UCHAR BandIdx; - - pAutoChCtrl = HcGetAutoChCtrl(pAd); - - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - if (!pAutoChCtrl) - continue; - - if (pAutoChCtrl->pBssInfoTab) { - os_free_mem(pAutoChCtrl->pBssInfoTab); - pAutoChCtrl->pBssInfoTab = NULL; - } - } -} - -static VOID AutoChBssTableReset(RTMP_ADAPTER *pAd, UINT8 BandIdx) -{ - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - PBSSINFO pBssInfoTab = pAutoChCtrl->pBssInfoTab; - - if (pBssInfoTab) - NdisZeroMemory(pBssInfoTab, sizeof(BSSINFO)); - else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAutoChCtrl->pBssInfoTab equal NULL.\n")); - } -} - -void AutoChBssTableInit(IN PRTMP_ADAPTER pAd) -{ - BSSINFO *pBssInfoTab = NULL; - UCHAR BandIdx; - AUTO_CH_CTRL *pAutoChCtrl = NULL; - - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - os_alloc_mem(pAd, (UCHAR **)&pBssInfoTab, sizeof(BSSINFO)); - - if (pBssInfoTab) { - NdisZeroMemory(pBssInfoTab, sizeof(BSSINFO)); - pAutoChCtrl->pBssInfoTab = pBssInfoTab; - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Fail to alloc memory for pAutoChCtrl->pBssInfoTab", - __func__)); - } - } -} - -void ChannelInfoDestroy(IN PRTMP_ADAPTER pAd) -{ - UCHAR BandIdx; - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - AUTO_CH_CTRL *pAutoChCtrl = - HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - if (pAutoChCtrl->pChannelInfo) { - os_free_mem(pAutoChCtrl->pChannelInfo); - pAutoChCtrl->pChannelInfo = NULL; - } - } -} - -static VOID ChannelInfoReset(RTMP_ADAPTER *pAd, UINT8 BandIdx) -{ - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - CHANNELINFO *ch_info = pAutoChCtrl->pChannelInfo; - - if (ch_info) - NdisZeroMemory(ch_info, sizeof(CHANNELINFO)); - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pChannelInfo equal NULL, band:%d\n", BandIdx)); -} - -void ChannelInfoInit(IN PRTMP_ADAPTER pAd) -{ - CHANNELINFO *ch_info = NULL; - UCHAR BandIdx; - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - AUTO_CH_CTRL *pAutoChCtrl = - HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - ch_info = NULL; - os_alloc_mem(pAd, (UCHAR **)&ch_info, sizeof(CHANNELINFO)); - - if (ch_info) { - os_zero_mem(ch_info, sizeof(CHANNELINFO)); - pAutoChCtrl->pChannelInfo = ch_info; - } else { - pAutoChCtrl->pChannelInfo = NULL; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Fail to alloc memory for pAd->pChannelInfo", - __func__)); - } - } -} - -#ifdef ACS_CTCC_SUPPORT -VOID build_acs_scan_ch_list(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev) -{ - UCHAR channel_idx = 0; - UCHAR ch_list_num = 0; - UCHAR ch = 0; - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - UCHAR op_ext_cha = wlan_config_get_ext_cha(wdev); - UCHAR band_idx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *ch_ctrl = hc_get_channel_ctrl(pAd->hdev_ctrl, band_idx); - AUTO_CH_CTRL *auto_ch_ctrl = NULL; - - auto_ch_ctrl = HcGetAutoChCtrlbyBandIdx(pAd, band_idx); - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] ------------>\n", __func__)); - AutoChannelSkipListSetDirty(pAd); - if (auto_ch_ctrl->pChannelInfo->IsABand) { - for (channel_idx = 0; channel_idx < ch_ctrl->ChListNum; - channel_idx++) { - ch = ch_ctrl->ChList[channel_idx].Channel; - auto_ch_ctrl->pChannelInfo->supp_ch_list[ch_list_num] - .ap_cnt = - auto_ch_ctrl->pChannelInfo->ApCnt[ch_list_num]; - if (cfg_ht_bw == BW_20) { - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .channel = - ch_ctrl->ChList[channel_idx].Channel; - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx].Channel; - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .dfs_req = - ch_ctrl->ChList[channel_idx].DfsReq; - if (auto_ch_ctrl->pChannelInfo - ->SkipList[channel_idx] == TRUE) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .skip_channel = TRUE; - ch_list_num++; - } -#ifdef DOT11_N_SUPPORT - else if ((cfg_ht_bw == BW_40) -#ifdef DOT11_VHT_AC - && - (wlan_config_get_vht_bw(wdev) == VHT_BW_2040) -#endif /* DOT11_VHT_AC */ - ) { - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .channel = - ch_ctrl->ChList[channel_idx].Channel; - - if (N_ChannelGroupCheck(pAd, ch, wdev)) { - if (GetABandChOffset(ch) == 1) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx] - .Channel + - 2; - else - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx] - .Channel - - 2; - } else - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx] - .Channel; - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .dfs_req = - ch_ctrl->ChList[channel_idx].DfsReq; - if (auto_ch_ctrl->pChannelInfo - ->SkipList[channel_idx] == TRUE) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .skip_channel = TRUE; - ch_list_num++; - } -#ifdef DOT11_VHT_AC - else if (wlan_config_get_vht_bw(wdev) == VHT_BW_80) { - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .channel = - ch_ctrl->ChList[channel_idx].Channel; - if (vht80_channel_group(pAd, ch)) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - vht_cent_ch_freq(ch, VHT_BW_80); - else - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx] - .Channel; - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .dfs_req = - ch_ctrl->ChList[channel_idx].DfsReq; - if (auto_ch_ctrl->pChannelInfo - ->SkipList[channel_idx] == TRUE) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .skip_channel = TRUE; - ch_list_num++; - } -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - } - } else { - for (channel_idx = 0; channel_idx < ch_ctrl->ChListNum; - channel_idx++) { - if (cfg_ht_bw == BW_40) { - if (op_ext_cha == EXTCHA_ABOVE) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx] - .Channel + - 2; - else { - if (auto_ch_ctrl->pChannelInfo - ->supp_ch_list[channel_idx] - .channel == 14) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx] - .Channel - - 1; - else - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx] - .Channel - - 2; - } - } else - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .cen_channel = - ch_ctrl->ChList[channel_idx].Channel; - auto_ch_ctrl->pChannelInfo->supp_ch_list[ch_list_num] - .channel = ch_ctrl->ChList[channel_idx].Channel; - if (auto_ch_ctrl->pChannelInfo->SkipList[channel_idx] == - TRUE) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[ch_list_num] - .skip_channel = TRUE; - ch_list_num++; - } - } - auto_ch_ctrl->pChannelInfo->channel_list_num = ch_list_num; - for (channel_idx = 0; - channel_idx < auto_ch_ctrl->pChannelInfo->channel_list_num; - channel_idx++) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] Support channel: PrimCh=%d, CentCh=%d, DFS=%d, skip %d\n", - __func__, - auto_ch_ctrl->pChannelInfo->supp_ch_list[channel_idx] - .channel, - auto_ch_ctrl->pChannelInfo->supp_ch_list[channel_idx] - .cen_channel, - auto_ch_ctrl->pChannelInfo->supp_ch_list[channel_idx] - .dfs_req, - auto_ch_ctrl->pChannelInfo->supp_ch_list[ch_list_num] - .skip_channel)); - } -} - -UINT8 acs_group_ch_list_search(AUTO_CH_CTRL *auto_ch_ctrl, UCHAR cen_channel) -{ - UCHAR i; - struct acs_scan_ch_group_list *group_ch_list = - auto_ch_ctrl->pChannelInfo->group_ch_list; - - for (i = 0; i < auto_ch_ctrl->pChannelInfo->group_ch_list_num; i++) { - if (group_ch_list->cen_channel == cen_channel) - return i; - group_ch_list++; - } - - return 0xff; -} - -VOID acs_group_ch_list_insert(AUTO_CH_CTRL *auto_ch_ctrl, - struct acs_scan_supp_ch_list *source, - IN struct wifi_dev *wdev) -{ - UCHAR i = auto_ch_ctrl->pChannelInfo->group_ch_list_num; - UCHAR j = 0; - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - UCHAR cfg_vht_bw = wlan_config_get_vht_bw(wdev); - struct acs_scan_ch_group_list *group_ch_list = - &auto_ch_ctrl->pChannelInfo->group_ch_list[i]; - - group_ch_list->best_ctrl_channel = source->channel; - group_ch_list->cen_channel = source->cen_channel; - group_ch_list->max_busy_time = source->busy_time; - group_ch_list->min_busy_time = source->busy_time; - group_ch_list->skip_group = source->skip_channel; - if (cfg_vht_bw == VHT_BW_80) { - group_ch_list - ->bw80_grp_ch_member[group_ch_list - ->bw80_grp_ch_member_idx] - .channel = source->channel; - group_ch_list - ->bw80_grp_ch_member[group_ch_list - ->bw80_grp_ch_member_idx] - .busy_time = source->busy_time; - group_ch_list->bw80_grp_ch_member_idx++; - } else if ((cfg_ht_bw == BW_40) && (cfg_vht_bw == VHT_BW_2040)) { - group_ch_list - ->bw40_grp_ch_member[group_ch_list - ->bw40_grp_ch_member_idx] - .channel = source->channel; - group_ch_list - ->bw40_grp_ch_member[group_ch_list - ->bw40_grp_ch_member_idx] - .busy_time = source->busy_time; - group_ch_list->bw40_grp_ch_member_idx++; - } else { - } - - for (j = 0; j < auto_ch_ctrl->pChannelInfo->channel_list_num; j++) { - if (source->channel == - auto_ch_ctrl->pChannelInfo->channel_score[j].channel) - group_ch_list->grp_score = - auto_ch_ctrl->pChannelInfo->channel_score[j] - .score; - } - - auto_ch_ctrl->pChannelInfo->group_ch_list_num = i + 1; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s Insert new group channel list Number=%d,cen_channel=%d\n", - __func__, auto_ch_ctrl->pChannelInfo->group_ch_list_num, - group_ch_list->cen_channel)); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s best_ctrl_channel=%d,BUSY_TIEM=%d,skip_group=%d,grp_score=%d\n", - __func__, group_ch_list->best_ctrl_channel, - group_ch_list->max_busy_time, group_ch_list->skip_group, - group_ch_list->grp_score)); -} - -VOID acs_group_ch_list_update(AUTO_CH_CTRL *auto_ch_ctrl, UCHAR index, - struct acs_scan_supp_ch_list *source, - IN struct wifi_dev *wdev) -{ - UCHAR i = 0; - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - UCHAR cfg_vht_bw = wlan_config_get_vht_bw(wdev); - struct acs_scan_ch_group_list *group_ch_list = - &auto_ch_ctrl->pChannelInfo->group_ch_list[index]; - - if (source->busy_time > group_ch_list->max_busy_time) { - group_ch_list->max_busy_time = source->busy_time; - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (source->channel == - auto_ch_ctrl->pChannelInfo->channel_score[i].channel) - group_ch_list->grp_score = - auto_ch_ctrl->pChannelInfo - ->channel_score[i] - .score; - } - } - - if (source->busy_time < group_ch_list->min_busy_time) { - group_ch_list->min_busy_time = source->busy_time; - group_ch_list->best_ctrl_channel = source->channel; - } - - if (group_ch_list->skip_group == 0 && source->skip_channel == 1) - group_ch_list->skip_group = source->skip_channel; - - if (cfg_vht_bw == VHT_BW_80) { - group_ch_list - ->bw80_grp_ch_member[group_ch_list - ->bw80_grp_ch_member_idx] - .channel = source->channel; - group_ch_list - ->bw80_grp_ch_member[group_ch_list - ->bw80_grp_ch_member_idx] - .busy_time = source->busy_time; - group_ch_list->bw80_grp_ch_member_idx++; - } else if ((cfg_ht_bw == BW_40) && (cfg_vht_bw == VHT_BW_2040)) { - group_ch_list - ->bw40_grp_ch_member[group_ch_list - ->bw40_grp_ch_member_idx] - .channel = source->channel; - group_ch_list - ->bw40_grp_ch_member[group_ch_list - ->bw40_grp_ch_member_idx] - .busy_time = source->busy_time; - group_ch_list->bw40_grp_ch_member_idx++; - } else { - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s Update group channel list index=%d,cen_channel=%d\n", - __func__, auto_ch_ctrl->pChannelInfo->group_ch_list_num, - group_ch_list->cen_channel)); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s best_ctrl_channel=%d,BUSY_TIEM=%d,skip_group=%d,grp_score=%d\n", - __func__, group_ch_list->best_ctrl_channel, - group_ch_list->max_busy_time, group_ch_list->skip_group, - group_ch_list->grp_score)); -} - -VOID acs_generate_group_channel_list(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *wdev) -{ - UCHAR i = 0; - UCHAR list_index = 0; - UCHAR band_idx = HcGetBandByWdev(wdev); - AUTO_CH_CTRL *auto_ch_ctrl = NULL; - struct acs_scan_supp_ch_list *supp_ch_list = NULL; - - auto_ch_ctrl = HcGetAutoChCtrlbyBandIdx(pAd, band_idx); - supp_ch_list = &auto_ch_ctrl->pChannelInfo->supp_ch_list[0]; - memset(auto_ch_ctrl->pChannelInfo->group_ch_list, 0, - (MAX_NUM_OF_CHANNELS + 1) * - sizeof(struct acs_scan_ch_group_list)); - auto_ch_ctrl->pChannelInfo->group_ch_list_num = 0; - - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; i++) { - list_index = acs_group_ch_list_search( - auto_ch_ctrl, supp_ch_list->cen_channel); - if (list_index == 0xff) - acs_group_ch_list_insert(auto_ch_ctrl, supp_ch_list, - wdev); - else - acs_group_ch_list_update(auto_ch_ctrl, list_index, - supp_ch_list, wdev); - - supp_ch_list++; - } -} - -UCHAR find_best_channel_of_all_grp(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *wdev) -{ - UINT32 i = 0; - UINT32 j = 0; - UINT32 k = 0; - INT l = 0; - UINT32 min_busy = 0xffffffff; - UINT32 max_busy = 0x0; - UINT32 min_score = 0x0; - UINT32 busy = 0; - UCHAR best_channel = 0; - UCHAR band_idx = HcGetBandByWdev(wdev); - AUTO_CH_CTRL *auto_ch_ctrl = HcGetAutoChCtrlbyBandIdx(pAd, band_idx); - CHANNEL_CTRL *ch_ctrl = hc_get_channel_ctrl(pAd->hdev_ctrl, band_idx); - struct auto_ch_sel_grp_member tmp; - struct acs_scan_ch_group_list *acs_grp_ch_list = NULL; - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - UCHAR cfg_vht_bw = wlan_config_get_vht_bw(wdev); - - for (i = 0; i < auto_ch_ctrl->pChannelInfo->group_ch_list_num; i++) { - acs_grp_ch_list = &auto_ch_ctrl->pChannelInfo->group_ch_list[i]; - - if (cfg_vht_bw == VHT_BW_80) { - for (k = 0; k < 3; k++) { - for (j = 0; j < 3 - k; j++) { - if (acs_grp_ch_list - ->bw80_grp_ch_member[j] - .busy_time > - acs_grp_ch_list - ->bw80_grp_ch_member[j + 1] - .busy_time) { - tmp.busy_time = - acs_grp_ch_list - ->bw80_grp_ch_member - [j + 1] - .busy_time; - tmp.channel = - acs_grp_ch_list - ->bw80_grp_ch_member - [j + 1] - .channel; - acs_grp_ch_list - ->bw80_grp_ch_member[j + - 1] - .busy_time = - acs_grp_ch_list - ->bw80_grp_ch_member - [j] - .busy_time; - acs_grp_ch_list - ->bw80_grp_ch_member[j + - 1] - .channel = - acs_grp_ch_list - ->bw80_grp_ch_member - [j] - .channel; - acs_grp_ch_list - ->bw80_grp_ch_member[j] - .busy_time = - tmp.busy_time; - acs_grp_ch_list - ->bw80_grp_ch_member[j] - .channel = tmp.channel; - } - } - } - - if (vht80_channel_group(pAd, auto_ch_ctrl->pChannelInfo - ->group_ch_list[i] - .cen_channel) == - FALSE) - acs_grp_ch_list->bw80_not_allowed = TRUE; - } else if ((cfg_ht_bw == BW_40) && - (cfg_vht_bw == VHT_BW_2040)) { - if (acs_grp_ch_list->bw40_grp_ch_member[0].busy_time > - acs_grp_ch_list->bw40_grp_ch_member[1].busy_time) { - tmp.busy_time = - acs_grp_ch_list->bw40_grp_ch_member[1] - .busy_time; - tmp.channel = - acs_grp_ch_list->bw40_grp_ch_member[1] - .channel; - acs_grp_ch_list->bw40_grp_ch_member[1] - .busy_time = - acs_grp_ch_list->bw40_grp_ch_member[0] - .busy_time; - acs_grp_ch_list->bw40_grp_ch_member[1].channel = - acs_grp_ch_list->bw40_grp_ch_member[0] - .channel; - acs_grp_ch_list->bw40_grp_ch_member[0] - .busy_time = tmp.busy_time; - acs_grp_ch_list->bw40_grp_ch_member[0].channel = - tmp.channel; - } - - if (vht40_channel_group(pAd, auto_ch_ctrl->pChannelInfo - ->group_ch_list[i] - .cen_channel) == - FALSE) - acs_grp_ch_list->bw40_not_allowed = TRUE; - } else { - } - - if (auto_ch_ctrl->pChannelInfo->group_ch_list[i].skip_group == - FALSE) { - busy = auto_ch_ctrl->pChannelInfo->group_ch_list[i] - .max_busy_time; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ChIdx=%d control-Channel=%d cen-channel=%d Max_BUSY_TIME=%d\n", - i, - auto_ch_ctrl->pChannelInfo->group_ch_list[i] - .best_ctrl_channel, - auto_ch_ctrl->pChannelInfo->group_ch_list[i] - .cen_channel, - auto_ch_ctrl->pChannelInfo->group_ch_list[i] - .max_busy_time)); - - if ((busy <= min_busy) && - (acs_grp_ch_list->bw80_not_allowed == FALSE) && - (acs_grp_ch_list->bw40_not_allowed == FALSE)) { - min_busy = busy; - best_channel = auto_ch_ctrl->pChannelInfo - ->group_ch_list[i] - .best_ctrl_channel; - } - - if (busy > max_busy) { - max_busy = busy; - min_score = 100 - max_busy / 1000; - if (min_score < 0) - min_score = 0; - } - } - } - - for (i = 0; i < auto_ch_ctrl->pChannelInfo->group_ch_list_num; i++) { - for (j = 0; j < auto_ch_ctrl->pChannelInfo->channel_list_num; - j++) { - if (auto_ch_ctrl->pChannelInfo->group_ch_list[i] - .best_ctrl_channel == - auto_ch_ctrl->pChannelInfo->supp_ch_list[j].channel) { - if (cfg_vht_bw == VHT_BW_80) { - for (k = 0; k < 4; k++) { - for (l = -3; l < 4; l++) { - if ((j + l < 0) || - (j + l >= - auto_ch_ctrl - ->pChannelInfo - ->channel_list_num)) - continue; - if (auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .channel == - auto_ch_ctrl - ->pChannelInfo - ->group_ch_list - [i] - .bw80_grp_ch_member - [k] - .channel) { - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score = - auto_ch_ctrl - ->pChannelInfo - ->group_ch_list - [i] - .grp_score + - 3 - k; - if ((auto_ch_ctrl - ->pChannelInfo - ->group_ch_list - [i] - .bw80_not_allowed == - TRUE) || - (vht80_channel_group( - pAd, - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .channel) == - FALSE)) { - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score = - min_score; - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Channel %d don't support BW80, force to assign min score(%d)!!!!!!\n", - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .channel, - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score)); - } - if (auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score > - 100) - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score = - 100; - break; - } - } - } - } else if ((cfg_ht_bw == BW_40) && - (cfg_vht_bw == VHT_BW_2040)) { - for (k = 0; k < 2; k++) { - for (l = -1; l < 2; l++) { - if ((j + l < 0) || - (j + l >= - auto_ch_ctrl - ->pChannelInfo - ->channel_list_num)) - continue; - if (auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .channel == - auto_ch_ctrl - ->pChannelInfo - ->group_ch_list - [i] - .bw40_grp_ch_member - [k] - .channel) { - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score = - auto_ch_ctrl - ->pChannelInfo - ->group_ch_list - [i] - .grp_score + - 1 - k; - if ((auto_ch_ctrl - ->pChannelInfo - ->group_ch_list - [i] - .bw40_not_allowed == - TRUE) || - (vht40_channel_group( - pAd, - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .channel) == - FALSE)) { - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score = - min_score; - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Channel %d don't support BW40, force to assign min score(%d)!!!!!!\n", - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .channel, - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score)); - } - if (auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score > - 100) - auto_ch_ctrl - ->pChannelInfo - ->channel_score - [j + - l] - .score = - 100; - break; - } - } - } - } else { - } - } - } - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("=================ACS score board===================\n")); - for (j = 0; j < ch_ctrl->ChListNum; j++) { - if (auto_ch_ctrl->pChannelInfo->channel_score[j].channel == 0) - continue; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CH%d final score is %d\n", - auto_ch_ctrl->pChannelInfo->channel_score[j].channel, - auto_ch_ctrl->pChannelInfo->channel_score[j].score)); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Min Busy Time=%d,select best channel %d\n", min_busy, - best_channel)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("====================================================\n")); - - return best_channel; -} - -static inline UCHAR select_clear_channel_busy_time(IN PRTMP_ADAPTER pAd, - IN struct wifi_dev *wdev) -{ - UINT32 i = 0; - UINT32 score = 0; - UINT32 ch1_busy_time = 0xffffffff; - UINT32 ch6_busy_time = 0xffffffff; - UINT32 ch11_busy_time = 0xffffffff; - UINT32 min_busy = 0xffffffff; - UINT32 max_busy = 0; - UCHAR best_channel = 0; - UINT8 bit_map = 0; /*ch1:bit0;ch6:bit1;ch11:bit2*/ - UCHAR band_idx = HcGetBandByWdev(wdev); - AUTO_CH_CTRL *auto_ch_ctrl = HcGetAutoChCtrlbyBandIdx(pAd, band_idx); - - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; i++) { - if (((auto_ch_ctrl->pChannelInfo->supp_ch_list[i].channel == - 1) || - (auto_ch_ctrl->pChannelInfo->supp_ch_list[i].channel == - 6) || - (auto_ch_ctrl->pChannelInfo->supp_ch_list[i].channel == - 11))) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time < min_busy) { - min_busy = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - best_channel = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time > max_busy) - max_busy = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - } - - if ((auto_ch_ctrl->pChannelInfo->ApCnt[i] != 0)) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 1) - bit_map |= (1 << 0); - else if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 6) - bit_map |= (1 << 1); - else if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 11) - bit_map |= (1 << 2); - } - } - /*AP @ Ch 1,6,11*/ - switch (bit_map) { - case 7: - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (((auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 1) || - (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 6) || - (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 11))) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time < min_busy) { - min_busy = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - best_channel = - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - } - } - - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (((auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 1) && - (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 6) && - (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 11))) { - auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time += max_busy; - } - } - break; - case 6: - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 1) - auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - break; - case 5: - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 6) - auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - break; - case 4: - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 1) - ch1_busy_time = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - else if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 6) - ch6_busy_time = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - } - - if (ch1_busy_time <= ch6_busy_time) { - for (i = 0; - i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 1) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - } else { - for (i = 0; - i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 6) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - } - break; - case 3: - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 11) - auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - break; - case 2: - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 1) - ch1_busy_time = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - else if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 11) - ch11_busy_time = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - } - - if (ch1_busy_time <= ch11_busy_time) { - for (i = 0; - i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 1) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - } else { - for (i = 0; - i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 11) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - } - break; - case 1: - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 6) - ch6_busy_time = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - else if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel == 11) - ch11_busy_time = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time; - } - - if (ch6_busy_time <= ch11_busy_time) { - for (i = 0; - i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 6) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - } else { - for (i = 0; - i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .channel != 11) - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = - auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - } - break; - case 0: - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; - i++) { - if (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time != min_busy) - auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .busy_time += max_busy; - else - best_channel = auto_ch_ctrl->pChannelInfo - ->supp_ch_list[i] - .channel; - } - break; - - default: - break; - } - - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; i++) { - score = 100 - - (auto_ch_ctrl->pChannelInfo->supp_ch_list[i].busy_time / - 1000); - if (score < 0) - score = 0; - auto_ch_ctrl->pChannelInfo->channel_score[i].score = score; - auto_ch_ctrl->pChannelInfo->channel_score[i].channel = - auto_ch_ctrl->pChannelInfo->supp_ch_list[i].channel; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("=====================================================\n")); - for (i = 0; i < auto_ch_ctrl->pChannelInfo->channel_list_num; i++) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Channel %d : Busy Time = %u, Score %d,Skip Channel = %s\n", - auto_ch_ctrl->pChannelInfo->supp_ch_list[i].channel, - auto_ch_ctrl->pChannelInfo->supp_ch_list[i].busy_time, - auto_ch_ctrl->pChannelInfo->channel_score[i].score, - (auto_ch_ctrl->pChannelInfo->supp_ch_list[i] - .skip_channel == TRUE) ? - "TRUE" : - "FALSE")); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("=====================================================\n")); - } - - if (WMODE_CAP_5G(wdev->PhyMode)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("=============== select best ch for 5G ===============\n")); - acs_generate_group_channel_list(pAd, wdev); - best_channel = find_best_channel_of_all_grp(pAd, wdev); - } else - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("=============== select best ch for 2.4G =============\n")); - - return best_channel; -} -#else -static inline UCHAR SelectClearChannelBusyTime(IN PRTMP_ADAPTER pAd, - IN struct wifi_dev *wdev) -{ - UCHAR BandIdx = HcGetBandByWdev(wdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - PCHANNELINFO pChannelInfo = pAutoChCtrl->pChannelInfo; - UINT32 SubGroupMaxBusyTime, SubGroupMaxBusyTimeChIdx, MinBusyTime; - UINT32 SubGroupMinBusyTime, SubGroupMinBusyTimeChIdx, ChannelIdx, - StartChannelIdx, Temp1, Temp2; - INT i, j, GroupNum, CandidateCh1 = 0, CandidateChIdx1, base; -#ifdef DOT11_VHT_AC - UINT32 MinorMinBusyTime; - INT CandidateCh2, CandidateChIdx2; - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - UCHAR vht_bw = wlan_config_get_vht_bw(wdev); - UCHAR cen_ch_2; -#endif /* DOT11_VHT_AC */ -#ifndef DOT11_VHT_AC -#endif /* DOT11_VHT_AC */ - PUINT32 pSubGroupMaxBusyTimeTable = NULL; - PUINT32 pSubGroupMaxBusyTimeChIdxTable = NULL; - PUINT32 pSubGroupMinBusyTimeTable = NULL; - PUINT32 pSubGroupMinBusyTimeChIdxTable = NULL; -#if defined(ONDEMAND_DFS) || defined(DFS_VENDOR10_CUSTOM_FEATURE) - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; -#endif - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[SelectClearChannelBusyTime] - band%d START\n", BandIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[SelectClearChannelBusyTime] - cfg_ht_bw = %d vht_bw = %d\n", - cfg_ht_bw, vht_bw)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - if (pChannelInfo == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAd->pChannelInfo equal NULL.\n")); - return FirstChannel(pAd, wdev); - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("====================================================================\n")); - - for (ChannelIdx = 0; ChannelIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; - ChannelIdx++) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel %3d : Busy Time = %6u, Skip Channel = %s, BwCap = %s\n", - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChannelIdx] - .Channel, - pChannelInfo->chanbusytime[ChannelIdx], - (pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChannelIdx] - .SkipChannel == TRUE) ? - "TRUE" : - "FALSE", - (pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChannelIdx] - .BwCap == TRUE) ? - "TRUE" : - "FALSE")); - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("====================================================================\n")); - /*Initialization*/ - SubGroupMaxBusyTimeChIdx = 0; - SubGroupMaxBusyTime = - pChannelInfo->chanbusytime[SubGroupMaxBusyTimeChIdx]; - SubGroupMinBusyTimeChIdx = 0; - SubGroupMinBusyTime = - pChannelInfo->chanbusytime[SubGroupMinBusyTimeChIdx]; - StartChannelIdx = SubGroupMaxBusyTimeChIdx + 1; - GroupNum = 0; - os_alloc_mem(pAd, (UCHAR **)&pSubGroupMaxBusyTimeTable, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(UINT32)); - if (!pSubGroupMaxBusyTimeTable) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("alloc buf for pSubGroupMaxBusyTimeTable failed!\n")); - goto ReturnCh; - } - os_alloc_mem(pAd, (UCHAR **)&pSubGroupMaxBusyTimeChIdxTable, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(UINT32)); - if (!pSubGroupMaxBusyTimeChIdxTable) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("alloc buf for pSubGroupMaxBusyTimeChIdxTable failed!\n")); - goto ReturnCh; - } - os_alloc_mem(pAd, (UCHAR **)&pSubGroupMinBusyTimeTable, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(UINT32)); - if (!pSubGroupMinBusyTimeTable) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("alloc buf for pSubGroupMinBusyTimeTable failed!\n")); - goto ReturnCh; - } - os_alloc_mem(pAd, (UCHAR **)&pSubGroupMinBusyTimeChIdxTable, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(UINT32)); - if (!pSubGroupMinBusyTimeChIdxTable) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("alloc buf for pSubGroupMinBusyTimeChIdxTable failed!\n")); - goto ReturnCh; - } - NdisZeroMemory(pSubGroupMaxBusyTimeTable, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(UINT32)); - NdisZeroMemory(pSubGroupMaxBusyTimeChIdxTable, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(UINT32)); - NdisZeroMemory(pSubGroupMinBusyTimeTable, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(UINT32)); - NdisZeroMemory(pSubGroupMinBusyTimeChIdxTable, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(UINT32)); - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - if ((pAd->ApCfg.bAutoChannelAtBootup[BandIdx]) && - IS_SUPPORT_V10_DFS(pAd) && (WMODE_CAP_5G(wdev->PhyMode)) && - (IS_DFS_V10_ACS_VALID(pAd) == FALSE) && - (wlan_config_get_vht_bw(wdev) == VHT_BW_2040)) { - UCHAR listSize = 0; - ChannelIdx = 0; - listSize = V10_TOTAL_CHANNEL_COUNT; - - NdisZeroMemory(pDfsParam->DfsV10SortedACSList, - (V10_TOTAL_CHANNEL_COUNT) * - sizeof(V10_CHANNEL_LIST)); - pDfsParam->DfsV10SortedACSList[ChannelIdx].BusyTime = - pChannelInfo->chanbusytime[ChannelIdx]; - pDfsParam->DfsV10SortedACSList[ChannelIdx].Channel = - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChannelIdx] - .Channel; - } -#endif - - for (ChannelIdx = StartChannelIdx; - ChannelIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; ChannelIdx++) { -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - if ((pAd->ApCfg.bAutoChannelAtBootup[BandIdx]) && - IS_SUPPORT_V10_DFS(pAd) && (WMODE_CAP_5G(wdev->PhyMode)) && - (IS_DFS_V10_ACS_VALID(pAd) == FALSE) && - (wlan_config_get_vht_bw(wdev) == VHT_BW_2040)) { - pDfsParam->DfsV10SortedACSList[ChannelIdx].BusyTime = - pChannelInfo->chanbusytime[ChannelIdx]; - pDfsParam->DfsV10SortedACSList[ChannelIdx].Channel = - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChannelIdx] - .Channel; - } -#endif - /*Compare the busytime with each other in the same group*/ - if (pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChannelIdx] - .CentralChannel == - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChannelIdx - 1] - .CentralChannel) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("pChannelInfo->chanbusytime[%d] = %d, SubGroupMaxBusyTime = %d, SubGroupMinBusyTime = %d\n", - ChannelIdx, - pChannelInfo->chanbusytime[ChannelIdx], - SubGroupMaxBusyTime, SubGroupMinBusyTime)); - - if (pChannelInfo->chanbusytime[ChannelIdx] > - SubGroupMaxBusyTime) { - SubGroupMaxBusyTime = - pChannelInfo->chanbusytime[ChannelIdx]; - SubGroupMaxBusyTimeChIdx = ChannelIdx; - } else if (pChannelInfo->chanbusytime[ChannelIdx] < - SubGroupMinBusyTime) { - SubGroupMinBusyTime = - pChannelInfo->chanbusytime[ChannelIdx]; - SubGroupMinBusyTimeChIdx = ChannelIdx; - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SubGroupMaxBusyTime = %d, SubGroupMaxBusyTimeChIdx = %d,SubGroupMinBusyTime = %d SubGroupMinBusyTimeChIdx = %d\n", - SubGroupMaxBusyTime, SubGroupMaxBusyTimeChIdx, - SubGroupMinBusyTime, - SubGroupMinBusyTimeChIdx)); - - /*Fill in the group table in order for the last group*/ - if (ChannelIdx == - (pAutoChCtrl->AutoChSelCtrl.ChListNum - 1)) { - pSubGroupMaxBusyTimeTable[GroupNum] = - SubGroupMaxBusyTime; - pSubGroupMaxBusyTimeChIdxTable[GroupNum] = - SubGroupMaxBusyTimeChIdx; - pSubGroupMinBusyTimeTable[GroupNum] = - SubGroupMinBusyTime; - pSubGroupMinBusyTimeChIdxTable[GroupNum] = - SubGroupMinBusyTimeChIdx; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("SubGroupMaxBusyTimeTable[%d] = %d, SubGroupMaxBusyTimeChIdxTable[%d] = %d, SubGroupMinBusyTimeTable[%d] = %d, SubGroupMinBusyTimeChIdxTable[%d] = %d\n", - GroupNum, - pSubGroupMaxBusyTimeTable[GroupNum], - GroupNum, - pSubGroupMaxBusyTimeChIdxTable[GroupNum], - GroupNum, - pSubGroupMinBusyTimeTable[GroupNum], - GroupNum, - pSubGroupMinBusyTimeChIdxTable - [GroupNum])); - GroupNum++; - } - } else { - /*Fill in the group table*/ - pSubGroupMaxBusyTimeTable[GroupNum] = - SubGroupMaxBusyTime; - pSubGroupMaxBusyTimeChIdxTable[GroupNum] = - SubGroupMaxBusyTimeChIdx; - pSubGroupMinBusyTimeTable[GroupNum] = - SubGroupMinBusyTime; - pSubGroupMinBusyTimeChIdxTable[GroupNum] = - SubGroupMinBusyTimeChIdx; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SubGroupMaxBusyTimeTable[%d] = %d, SubGroupMaxBusyTimeChIdxTable[%d] = %d, SubGroupMinBusyTimeTable[%d] = %d, SubGroupMinBusyTimeChIdxTable[%d] = %d\n", - GroupNum, pSubGroupMaxBusyTimeTable[GroupNum], - GroupNum, - pSubGroupMaxBusyTimeChIdxTable[GroupNum], - GroupNum, pSubGroupMinBusyTimeTable[GroupNum], - GroupNum, - pSubGroupMinBusyTimeChIdxTable[GroupNum])); - GroupNum++; - - /*Fill in the group table in order for the last group in case of BW20*/ - if ((ChannelIdx == - (pAutoChCtrl->AutoChSelCtrl.ChListNum - 1)) && - (pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChannelIdx] - .Bw == BW_20)) { - pSubGroupMaxBusyTimeTable[GroupNum] = - pChannelInfo->chanbusytime[ChannelIdx]; - pSubGroupMaxBusyTimeChIdxTable[GroupNum] = - ChannelIdx; - pSubGroupMinBusyTimeTable[GroupNum] = - pChannelInfo->chanbusytime[ChannelIdx]; - pSubGroupMinBusyTimeChIdxTable[GroupNum] = - ChannelIdx; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("SubGroupMaxBusyTimeTable[%d] = %d, SubGroupMaxBusyTimeChIdxTable[%d] = %d, SubGroupMinBusyTimeTable[%d] = %d, SubGroupMinBusyTimeChIdxTable[%d] = %d\n", - GroupNum, - pSubGroupMaxBusyTimeTable[GroupNum], - GroupNum, - pSubGroupMaxBusyTimeChIdxTable[GroupNum], - GroupNum, - pSubGroupMinBusyTimeTable[GroupNum], - GroupNum, - pSubGroupMinBusyTimeChIdxTable - [GroupNum])); - GroupNum++; - } else { - /*Reset indices in order to start checking next group*/ - SubGroupMaxBusyTime = - pChannelInfo->chanbusytime[ChannelIdx]; - SubGroupMaxBusyTimeChIdx = ChannelIdx; - SubGroupMinBusyTime = - pChannelInfo->chanbusytime[ChannelIdx]; - SubGroupMinBusyTimeChIdx = ChannelIdx; - } - } - } - - for (i = 0; i < GroupNum; i++) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SubGroupMaxBusyTimeTable[%d] = %d, pSubGroupMaxBusyTimeChIdxTable[%d] = %d,\nSubGroupMinBusyTimeTable[%d] = %d, pSubGroupMinBusyTimeChIdxTable[%d] = %d\n", - i, pSubGroupMaxBusyTimeTable[i], i, - pSubGroupMaxBusyTimeChIdxTable[i], i, - pSubGroupMinBusyTimeTable[i], i, - pSubGroupMinBusyTimeChIdxTable[i])); - } - - /*Sort max_busy_time group table from the smallest to the biggest one */ - for (i = 0; i < GroupNum; i++) { - for (j = 1; j < (GroupNum - i); j++) { - if (pSubGroupMaxBusyTimeTable[i] > - pSubGroupMaxBusyTimeTable[i + j]) { - /*Swap pSubGroupMaxBusyTimeTable[i] for pSubGroupMaxBusyTimeTable[i+j]*/ - Temp1 = pSubGroupMaxBusyTimeTable[i + j]; - pSubGroupMaxBusyTimeTable[i + j] = - pSubGroupMaxBusyTimeTable[i]; - pSubGroupMaxBusyTimeTable[i] = Temp1; - /*Swap pSubGroupMaxBusyTimeChIdxTable[i] for pSubGroupMaxBusyTimeChIdxTable[i+j]*/ - Temp2 = pSubGroupMaxBusyTimeChIdxTable[i + j]; - pSubGroupMaxBusyTimeChIdxTable[i + j] = - pSubGroupMaxBusyTimeChIdxTable[i]; - pSubGroupMaxBusyTimeChIdxTable[i] = Temp2; - /*Swap pSubGroupMinBusyTimeTable[i] for pSubGroupMinBusyTimeTable[i+j]*/ - Temp1 = pSubGroupMinBusyTimeTable[i + j]; - pSubGroupMinBusyTimeTable[i + j] = - pSubGroupMinBusyTimeTable[i]; - pSubGroupMinBusyTimeTable[i] = Temp1; - /*Swap pSubGroupMinBusyTimeChIdxTable[i] for pSubGroupMinBusyTimeChIdxTable[i+j]*/ - Temp2 = pSubGroupMinBusyTimeChIdxTable[i + j]; - pSubGroupMinBusyTimeChIdxTable[i + j] = - pSubGroupMinBusyTimeChIdxTable[i]; - pSubGroupMinBusyTimeChIdxTable[i] = Temp2; - } - } - } - - for (i = 0; i < GroupNum; i++) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SubGroupMaxBusyTimeTable[%d] = %d, pSubGroupMaxBusyTimeChIdxTable[%d] = %d,\nSubGroupMinBusyTimeTable[%d] = %d, pSubGroupMinBusyTimeChIdxTable[%d] = %d\n", - i, pSubGroupMaxBusyTimeTable[i], i, - pSubGroupMaxBusyTimeChIdxTable[i], i, - pSubGroupMinBusyTimeTable[i], i, - pSubGroupMinBusyTimeChIdxTable[i])); - } - -#ifdef DOT11_VHT_AC - - /*Return channel in case of VHT BW80+80*/ - if ((vht_bw == VHT_BW_8080) && (cfg_ht_bw == BW_40) && (GroupNum > 2) && - (WMODE_CAP_AC(wdev->PhyMode) == TRUE)) { - MinBusyTime = pSubGroupMaxBusyTimeTable[0]; - MinorMinBusyTime = pSubGroupMaxBusyTimeTable[1]; - /*Select primary channel, whose busy time is minimum in the group*/ - CandidateChIdx1 = pSubGroupMinBusyTimeChIdxTable[0]; - CandidateCh1 = pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[CandidateChIdx1] - .Channel; - /*Select secondary VHT80 central channel*/ - CandidateChIdx2 = pSubGroupMaxBusyTimeChIdxTable[1]; - CandidateCh2 = pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[CandidateChIdx2] - .Channel; - cen_ch_2 = vht_cent_ch_freq((UCHAR)CandidateCh2, VHT_BW_80); - /*Since primary channel is not updated yet ,cannot update sec Ch here*/ - wdev->auto_channel_cen_ch_2 = cen_ch_2; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rule 3 Channel Busy time value : Select Primary Channel %d\n", - CandidateCh1)); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rule 3 Channel Busy time value : Select Secondary Central Channel %d\n", - cen_ch_2)); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rule 3 Channel Busy time value : Min Channel Busy = %u\n", - MinBusyTime)); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rule 3 Channel Busy time value : MinorMin Channel Busy = %u\n", - MinorMinBusyTime)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rule 3 Channel Busy time value : BW = %s\n", - "80+80")); - goto ReturnCh; - } - -#endif /*DOT11_VHT_AC*/ - - if (GroupNum > 0) { -#ifdef ONDEMAND_DFS - if (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd) && - (WMODE_CAP_5G(wdev->PhyMode)) && - (IS_ONDEMAND_ACS_LIST_VALID(pAd) == FALSE)) { - os_alloc_mem(pAd, - (UCHAR **)&pDfsParam->OnDemandChannelList, - (GroupNum) * sizeof(OD_CHANNEL_LIST)); - if (pDfsParam->OnDemandChannelList) { - /* Record Best Channels from each group */ - os_zero_mem(pDfsParam->OnDemandChannelList, - (GroupNum) * - sizeof(OD_CHANNEL_LIST)); - for (ChannelIdx = 0; ChannelIdx < GroupNum; - ChannelIdx++) { - CandidateCh1 = - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList - [pSubGroupMinBusyTimeChIdxTable - [ChannelIdx]] - .Channel; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Channel %d BusyTime %d Idx %d\n", - CandidateCh1, - pSubGroupMinBusyTimeTable - [ChannelIdx], - pSubGroupMinBusyTimeChIdxTable - [ChannelIdx])); - pDfsParam - ->OnDemandChannelList[ChannelIdx] - .Channel = CandidateCh1; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Channel %d \n", - pDfsParam - ->OnDemandChannelList - [ChannelIdx] - .Channel)); - } - /* Enable ACS List */ - pDfsParam->bOnDemandChannelListValid = TRUE; - pDfsParam->MaxGroupCount = GroupNum; - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("[%s] Null Pointer returned for ACS List \n", - __func__)); - } - } -#endif - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - /* V10 VHT80 ACS Enable */ - if ((pAd->ApCfg.bAutoChannelAtBootup[BandIdx]) && - IS_SUPPORT_V10_DFS(pAd) && (WMODE_CAP_5G(wdev->PhyMode)) && - (IS_DFS_V10_ACS_VALID(pAd) == FALSE) && - (wlan_config_get_vht_bw(wdev) == VHT_BW_80)) { - /* Record Best Channels from each group */ - os_zero_mem(pDfsParam->DfsV10SortedACSList, - (GroupNum) * sizeof(V10_CHANNEL_LIST)); - for (ChannelIdx = 0; ChannelIdx < GroupNum; - ChannelIdx++) { - CandidateCh1 = - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList - [pSubGroupMinBusyTimeChIdxTable - [ChannelIdx]] - .Channel; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Channel %d BusyTime %d Idx %d\n", - CandidateCh1, - pSubGroupMinBusyTimeTable[ChannelIdx], - pSubGroupMinBusyTimeChIdxTable - [ChannelIdx])); - pDfsParam->DfsV10SortedACSList[ChannelIdx] - .Channel = CandidateCh1; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel %d \n", - pDfsParam - ->DfsV10SortedACSList[ChannelIdx] - .Channel)); - } - /* Enable V10 VHT80 ACS List */ - pDfsParam->bV10ChannelListValid = TRUE; - pDfsParam->GroupCount = GroupNum; - } - - if ((pAd->ApCfg.bAutoChannelAtBootup[BandIdx]) && - (wlan_config_get_vht_bw(wdev) == VHT_BW_2040) && - DfsV10ACSListSortFunction(pAd, wdev) == FALSE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] Invalid V10 ACS List BW %d \n", - __func__, wlan_config_get_vht_bw(wdev))); -#endif - - MinBusyTime = pSubGroupMaxBusyTimeTable[0]; - /*Select primary channel, whose busy time is minimum in the group*/ - CandidateChIdx1 = pSubGroupMinBusyTimeChIdxTable[0]; - CandidateCh1 = pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[CandidateChIdx1] - .Channel; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rule 3 Channel Busy time value : Select Primary Channel %d\n", - CandidateCh1)); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rule 3 Channel Busy time value : Min Channel Busy = %u\n", - MinBusyTime)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rule 3 Channel Busy time value : BW = %s\n", - (pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[CandidateChIdx1] - .Bw == BW_160) ? - "160" : - (pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[CandidateChIdx1] - .Bw == BW_80) ? - "80" : - (pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[CandidateChIdx1] - .Bw == BW_40) ? - "40" : - "20")); - goto ReturnCh; - } - - base = RandomByte2(pAd); - - for (ChannelIdx = 0; ChannelIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; - ChannelIdx++) { - CandidateCh1 = - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[(base + ChannelIdx) % - pAutoChCtrl->AutoChSelCtrl - .ChListNum] - .Channel; - - if (AutoChannelSkipListCheck(pAd, CandidateCh1)) - continue; - - if ((pAd->ApCfg.bAvoidDfsChannel == TRUE) && - (pAutoChCtrl->AutoChSelCtrl.IsABand == TRUE) && - RadarChannelCheck(pAd, CandidateCh1)) - continue; - - break; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Randomly Select : Select Channel %d\n", CandidateCh1)); -ReturnCh: - if (pSubGroupMaxBusyTimeTable) - os_free_mem(pSubGroupMaxBusyTimeTable); - - if (pSubGroupMaxBusyTimeChIdxTable) - os_free_mem(pSubGroupMaxBusyTimeChIdxTable); - - if (pSubGroupMinBusyTimeTable) - os_free_mem(pSubGroupMinBusyTimeTable); - - if (pSubGroupMinBusyTimeChIdxTable) - os_free_mem(pSubGroupMinBusyTimeChIdxTable); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[SelectClearChannelBusyTime] - band%d END\n", BandIdx)); - return CandidateCh1; -} -#endif -/* - ========================================================================== - Description: - This routine sets the current PhyMode for calculating - the dirtyness. - Return: - none - NOTE: - ========================================================================== - */ -void CheckPhyModeIsABand(RTMP_ADAPTER *pAd, UINT8 BandIdx) -{ - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - UCHAR PhyMode = HcGetRadioPhyModeByBandIdx(pAd, BandIdx); - - pAutoChCtrl->pChannelInfo->IsABand = - (WMODE_CAP_5G(PhyMode)) ? TRUE : FALSE; -} - -UCHAR SelectBestChannel(RTMP_ADAPTER *pAd, ChannelSel_Alg Alg, - struct wifi_dev *pwdev) -{ - UCHAR ch = 0; - /* init RadioCtrl.pChannelInfo->IsABand */ - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - CheckPhyModeIsABand(pAd, BandIdx); -#ifdef MICROWAVE_OVEN_SUPPORT - - if (Alg == ChannelAlgCCA) - pAd->CommonCfg.MO_Cfg.bEnable = TRUE; - -#endif /* MICROWAVE_OVEN_SUPPORT */ - - switch (Alg) { - case ChannelAlgRandom: - case ChannelAlgApCnt: - ch = SelectClearChannelApCnt(pAd, pwdev); - break; - - case ChannelAlgCCA: - ch = SelectClearChannelCCA(pAd); - break; - - case ChannelAlgBusyTime: -#ifdef ACS_CTCC_SUPPORT - ch = select_clear_channel_busy_time(pAd, pwdev); -#else - ch = SelectClearChannelBusyTime(pAd, pwdev); -#endif - break; - - default: -#ifdef ACS_CTCC_SUPPORT - ch = select_clear_channel_busy_time(pAd, pwdev); -#else - ch = SelectClearChannelBusyTime(pAd, pwdev); -#endif - break; - } - - RTMPSendWirelessEvent(pAd, IW_CHANNEL_CHANGE_EVENT_FLAG, 0, 0, ch); - pAutoChCtrl->AutoChSelCtrl.ACSChStat = ACS_CH_STATE_SELECTED; - pAutoChCtrl->AutoChSelCtrl.SelCh = ch; -#ifdef CONFIG_INIT_RADIO_ONOFF - if (pAd->ApCfg.bRadioOn == TRUE) { - int i = 0; - UCHAR line[256] = { 0 }; - UCHAR *event_msg = NULL; - //PCHANNELINFO chinfo = pAd->pChannelInfo; - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrl(pAd); - PCHANNELINFO chinfo = pAutoChCtrl->pChannelInfo; - //event_msg = kmalloc(1300, GFP_ATOMIC); - os_alloc_mem(NULL, (UCHAR **)&event_msg, 5120); - if (chinfo && event_msg) { - NdisZeroMemory(event_msg, 5120); - if (chinfo->IsABand) - strcat(event_msg, - "******** 5GHz ACS report ********\n"); - else - strcat(event_msg, - "******** 2.4GHz ACS report ********\n"); - strcat(event_msg, - "+-------+-----------+----------+----------+----------+----+\n"); - snprintf(line, sizeof(line), - "|%-7s|%-11s|%-10s|%-10s|%-10s|%-4s|\n", - "Channel", "AP Detected", "Dirty", "False CCA", - "Busy Time", "Skip"); - strcat(event_msg, line); - strcat(event_msg, - "+-------+-----------+----------+----------+----------+----+\n"); - for (; i < pAd->ChannelListNum; i++) { - if (ch == pAd->ChannelList[i].Channel) { - //strcat(event_msg, "|\033[40m\033[30;47m%-7d|%-11lu|%-10lu|%-10d|%-10d|%-4c\033[0m|\n", - snprintf( - line, sizeof(line), - "|%-7d|%-11lu|%-10lu|%-10d|%-10d|%-4c|<--\n", - pAd->ChannelList[i].Channel, - chinfo->ApCnt[i], - chinfo->dirtyness[i], - chinfo->FalseCCA[i], - chinfo->chanbusytime[i], - (((chinfo->SkipList[i]) ? - 'Y' : - 'N'))); - } else { - snprintf( - line, sizeof(line), - "|%-7d|%-11lu|%-10lu|%-10d|%-10d|%-4c|\n", - pAd->ChannelList[i].Channel, - chinfo->ApCnt[i], - chinfo->dirtyness[i], - chinfo->FalseCCA[i], - chinfo->chanbusytime[i], - (((chinfo->SkipList[i]) ? - 'Y' : - 'N'))); - } - strcat(event_msg, line); - } - strcat(event_msg, - "+-------+-----------+----------+----------+----------+----+\n"); - - event_msg[5120] = '\0'; - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_LOG_SAVE, 0 /*dummy*/, event_msg, - strlen(event_msg)); - os_free_mem(event_msg); - } - } -#endif - return ch; -} - -VOID APAutoChannelInit(RTMP_ADAPTER *pAd, struct wifi_dev *pwdev) -{ - UINT32 BusyTime; - UCHAR BandIdx = HcGetBandByWdev(pwdev); - - /* reset bss table */ - AutoChBssTableReset(pAd, BandIdx); - /* clear Channel Info */ - ChannelInfoReset(pAd, BandIdx); - /* init RadioCtrl.pChannelInfo->IsABand */ - CheckPhyModeIsABand(pAd, BandIdx); -#ifdef ACS_CTCC_SUPPORT - build_acs_scan_ch_list(pAd, pwdev); -#endif - pAd->ApCfg.current_channel_index = 0; - /* read clear for primary channel */ - BusyTime = AsicGetChBusyCnt(pAd, BandIdx); -} - -/* - ========================================================================== - Description: - This routine is called at initialization. It returns a channel number - that complies to regulation domain and less interference with current - enviornment. - Return: - ch - channel number that - NOTE: - The retruned channel number is guaranteed to comply to current regulation - domain that recorded in pAd->CommonCfg.CountryRegion - ========================================================================== - */ -UCHAR APAutoSelectChannel(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev, - IN ChannelSel_Alg Alg, IN BOOLEAN IsABand) -{ - UCHAR ch = 0; - - if (pAd->phy_op && pAd->phy_op->AutoCh) - ch = pAd->phy_op->AutoCh(pAd, pwdev, Alg, IsABand); - - return ch; -} - -UCHAR MTAPAutoSelectChannel(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev, - IN ChannelSel_Alg Alg, IN BOOLEAN IsABand) -{ - UCHAR ch = 0, i = 0; - UINT32 BusyTime; - - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - if (!BandIdx && WMODE_CAP_5G(pwdev->PhyMode) && - pAd->CommonCfg.dbdc_mode) - printk("[%s] Incorrect Bandidx for 5G Phy mode\n", __func__); - if (BandIdx && WMODE_CAP_2G(pwdev->PhyMode) && pAd->CommonCfg.dbdc_mode) - printk("[%s] Incorrect Bandidx for 2G Phy mode\n", __func__); - if (pAutoChCtrl->AutoChSelCtrl.ACSChStat == ACS_CH_STATE_SELECTED) { - ch = pAutoChCtrl->AutoChSelCtrl.SelCh; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[MTAPAutoSelectChannel] ACS channel is selected, selected ch = %d\n", - ch)); - return ch; - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Init some structures before doing AutoChannelSelect() */ - APAutoChannelInit(pAd, pwdev); - -#ifdef MICROWAVE_OVEN_SUPPORT - pAd->CommonCfg.MO_Cfg.bEnable = FALSE; - AsicMeasureFalseCCA(pAd); -#endif /* MICROWAVE_OVEN_SUPPORT */ - - /* Re-arrange channel list and fill in channel properties for auto-channel selection*/ - AutoChSelBuildChannelList(pAd, IsABand, pwdev); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: IsABand = %d, ChannelListNum = %d\n", __func__, IsABand, - pAutoChCtrl->AutoChSelCtrl.ChListNum)); - -#ifdef ACS_CTCC_SUPPORT - for (i = 0; i < pAutoChCtrl->pChannelInfo->channel_list_num; i++) -#else - for (i = 0; i < pAutoChCtrl->AutoChSelCtrl.ChListNum; i++) -#endif - { -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - ULONG wait_time = GET_V10_OFF_CHNL_TIME(pAd); -#else - ULONG wait_time = 200; /* Wait for 200 ms at each channel. */ -#endif -#ifdef ACS_CTCC_SUPPORT - wlan_operate_scan( - pwdev, - pAutoChCtrl->pChannelInfo->supp_ch_list[i].channel); -#else - wlan_operate_scan( - pwdev, - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[i].Channel); -#endif - pAd->ApCfg.current_channel_index = i; - pAd->ApCfg.AutoChannel_Channel = - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[i].Channel; - /* Read-Clear reset Channel busy time counter */ - BusyTime = AsicGetChBusyCnt(pAd, BandIdx); -#ifdef AP_QLOAD_SUPPORT - /* QLOAD ALARM, ever alarm from QLOAD module */ - if (QLOAD_DOES_ALARM_OCCUR(pAd)) - wait_time = 400; -#endif /* AP_QLOAD_SUPPORT */ - OS_WAIT(wait_time); - UpdateChannelInfo(pAd, i, Alg, pwdev); - } - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - if (IS_SUPPORT_V10_DFS(pAd) && pAutoChCtrl->pChannelInfo) - /* Weighting Factor for ACS Enable Case */ - DfsV10AddWeighingFactor(pAd, pwdev); -#endif - - ch = SelectBestChannel(pAd, Alg, pwdev); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - return ch; -} - -/* - ========================================================================== - Description: - Update channel to wdev which is supported for A-band or G-band. - - Return: - None. - ========================================================================== - */ -VOID AutoChSelUpdateChannel(IN PRTMP_ADAPTER pAd, IN UCHAR Channel, - IN BOOLEAN IsABand, IN struct wifi_dev *pwdev) -{ - UINT8 ExtChaDir; -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - UCHAR i = 0; - struct wifi_dev *wdev = NULL; -#endif - - if (IsABand) { -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -#ifdef CONFIG_AP_SUPPORT - if (IS_SUPPORT_V10_DFS(pAd)) { - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - wdev = &pAd->ApCfg.MBSSID[i].wdev; - wdev->channel = Channel; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("BSS%d Channel=%d\n", i, - wdev->channel)); - } - } - } else -#endif /* CONFIG_AP_SUPPORT */ -#endif - /*5G Channel*/ - pwdev->channel = Channel; - } else { - /*2G Channel*/ - /* Update primary channel in wdev */ - pwdev->channel = Channel; - - /* Query ext_cha in wdev */ - ExtChaDir = wlan_config_get_ext_cha(pwdev); - - /* Check current extension channel */ - if (!ExtChCheck(pAd, Channel, ExtChaDir, pwdev)) { - if (ExtChaDir == EXTCHA_BELOW) - ExtChaDir = EXTCHA_ABOVE; - else - ExtChaDir = EXTCHA_BELOW; - - /* Update ext_cha in wdev */ - wlan_config_set_ext_cha(pwdev, ExtChaDir); - } - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[41m %s(): Update channel for wdev for this band PhyMode = %d, Channel = %d \x1b[m\n", - __func__, pwdev->PhyMode, pwdev->channel)); -} - -/* - ========================================================================== - Description: - Build channel list for auto-channel selection. - - Return: - None. - ========================================================================== - */ -VOID AutoChSelBuildChannelList(IN RTMP_ADAPTER *pAd, IN BOOLEAN IsABand, - IN struct wifi_dev *pwdev) -{ - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Initialize channel list*/ - os_zero_mem(pAutoChCtrl->AutoChSelCtrl.AutoChSelChList, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(AUTOCH_SEL_CH_LIST)); - - if (IsABand) { - pAutoChCtrl->AutoChSelCtrl.IsABand = TRUE; - - /* Build 5G channel list used by ACS */ - AutoChSelBuildChannelListFor5G(pAd, pwdev); - } else if (!IsABand) { - pAutoChCtrl->AutoChSelCtrl.IsABand = FALSE; - - /* Build 2G channel list used by ACS */ - AutoChSelBuildChannelListFor2G(pAd, pwdev); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -} -/* - ========================================================================== - Description: - Build channel list for 2.4G according to 1) Country Region 2) RF IC type for auto-channel selection. - - Return: - None. - ========================================================================== - */ -VOID AutoChSelBuildChannelListFor2G(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *pwdev) -{ - INT ChIdx, ChListNum = 0; - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(pwdev); - AUTOCH_SEL_CH_LIST *pACSChList; - UCHAR BandIdx = HcGetBandByWdev(pwdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - pAutoChCtrl->AutoChSelCtrl.ChListNum = pChCtrl->ChListNum; - - /* Initialize local ACS channel list*/ - os_alloc_mem(NULL, (UCHAR **)&pACSChList, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(AUTOCH_SEL_CH_LIST)); - os_zero_mem(pACSChList, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(AUTOCH_SEL_CH_LIST)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - for (ChIdx = 0; ChIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; ChIdx++) - pACSChList[ChIdx].Channel = pChCtrl->ChList[ChIdx].Channel; - - for (ChIdx = 0; ChIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; ChIdx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Ch = %3d\n", __func__, - pACSChList[ChIdx].Channel)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - /* Check for skip-channel list */ - for (ChIdx = 0; ChIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; ChIdx++) - pACSChList[ChIdx].SkipChannel = AutoChannelSkipListCheck( - pAd, pACSChList[ChIdx].Channel); - - for (ChIdx = 0; ChIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; ChIdx++) { - /* 2.4G only support for BW20 auto-channel selection */ - pACSChList[ChIdx].Bw = BW_20; - pACSChList[ChIdx].CentralChannel = pACSChList[ChIdx].Channel; - - if (cfg_ht_bw == BW_20) - pACSChList[ChIdx].BwCap = TRUE; -#ifdef DOT11_N_SUPPORT - else if ((cfg_ht_bw == BW_40) && - N_ChannelGroupCheck(pAd, pACSChList[ChIdx].Channel, - pwdev)) - pACSChList[ChIdx].BwCap = TRUE; -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[AutoChSelBuildChannelListFor2G] - ChIdx = %d, ChListNum = %d\n", - ChIdx, pAutoChCtrl->AutoChSelCtrl.ChListNum)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PrimChannel = %3d, CenChannel = %3d, BW= %d, BwCap= %d, SkipChannel= %d\n", - __func__, pACSChList[ChIdx].Channel, - pACSChList[ChIdx].CentralChannel, pACSChList[ChIdx].Bw, - pACSChList[ChIdx].BwCap, - pACSChList[ChIdx].SkipChannel)); - } - - for (ChIdx = 0; ChIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; ChIdx++) { - if ((pACSChList[ChIdx].SkipChannel == TRUE) || - (pACSChList[ChIdx].BwCap == FALSE)) - continue; - else { - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .Channel = pACSChList[ChIdx].Channel; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .Bw = pACSChList[ChIdx].Bw; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .BwCap = pACSChList[ChIdx].BwCap; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .CentralChannel = - pACSChList[ChIdx].CentralChannel; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .SkipChannel = pACSChList[ChIdx].SkipChannel; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .Flags = pACSChList[ChIdx].Flags; - ChListNum++; - } - } -#ifdef OCE_SUPPORT - - if (IS_OCE_ENABLE(pwdev)) { - ChListNum = 0; - for (ChIdx = 0; ChIdx < pAutoChCtrl->AutoChSelCtrl.ChListNum; - ChIdx++) { - if (pACSChList[ChIdx].Channel != 1 && - pACSChList[ChIdx].Channel != 6 && - pACSChList[ChIdx].Channel != 11) - continue; - else { - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .Channel = pACSChList[ChIdx].Channel; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .Bw = pACSChList[ChIdx].Bw; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .BwCap = TRUE; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .CentralChannel = - pACSChList[ChIdx].CentralChannel; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .SkipChannel = - pACSChList[ChIdx].SkipChannel; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .Flags = pACSChList[ChIdx].Flags; - ChListNum++; - } - } - if (ChListNum == 0) { - for (ChIdx = 1; ChIdx <= 11; ChIdx += 5) { - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .Channel = pACSChList[ChIdx].Channel; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .Bw = pACSChList[ChIdx].Bw; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .BwCap = pACSChList[ChIdx].BwCap; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .CentralChannel = - pACSChList[ChIdx].CentralChannel; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .SkipChannel = - pACSChList[ChIdx].SkipChannel; - pAutoChCtrl->AutoChSelCtrl - .AutoChSelChList[ChListNum] - .Flags = pACSChList[ChIdx].Flags; - ChListNum++; - } - } - } -#endif /* OCE_SUPPORT */ - - pAutoChCtrl->AutoChSelCtrl.ChListNum = ChListNum; - os_free_mem(pACSChList); -} -/* - ========================================================================== - Description: - Build channel list for 5G according to 1) Country Region 2) RF IC type for auto-channel selection. - - Return: - None. - ========================================================================== - */ -VOID AutoChSelBuildChannelListFor5G(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *pwdev) -{ -#define EXT_ABOVE 1 -#define EXT_BELOW -1 - INT ChIdx; -#ifdef DOT11_VHT_AC - INT k, count, idx; - struct vht_ch_layout *vht_ch_80M = get_ch_array(80); - struct vht_ch_layout *vht_ch_160M = get_ch_array(160); - UCHAR cfg_vht_bw = wlan_config_get_vht_bw(pwdev); -#endif /* DOT11_VHT_AC */ - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(pwdev); - AUTOCH_SEL_CH_LIST *pACSChList; - INT ChListNum5G = 0; - INT ChListNum = 0; - - UCHAR BandIdx = HcGetBandByWdev(pwdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[AutoChSelBuildChannelListFor5G] cfg_ht_bw = %d, cfg_vht_bw = %d\n", - cfg_ht_bw, cfg_vht_bw)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Initialize local ACS channel list*/ - os_alloc_mem(NULL, (UCHAR **)&pACSChList, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(AUTOCH_SEL_CH_LIST)); - os_zero_mem(pACSChList, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(AUTOCH_SEL_CH_LIST)); - - /*Skip Non occupancy channel*/ - for (ChIdx = 0; ChIdx < pChCtrl->ChListNum; ChIdx++) { - if (CheckNonOccupancyChannel(pAd, pwdev, - pChCtrl->ChList[ChIdx].Channel)) { - pACSChList[ChListNum5G++].Channel = - pChCtrl->ChList[ChIdx].Channel; - } - } - - for (ChIdx = 0; ChIdx < ChListNum5G; ChIdx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Ch = %3d\n", __func__, - pACSChList[ChIdx].Channel)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[AutoChSelBuildChannelListFor5G] ChListNum5G = %d\n", - ChListNum5G)); - /* Check for skip-channel list */ - for (ChIdx = 0; ChIdx < ChListNum5G; ChIdx++) { - pACSChList[ChIdx].SkipChannel = AutoChannelSkipListCheck( - pAd, pACSChList[ChIdx].Channel); -#ifdef BACKGROUND_SCAN_SUPPORT - if (pAd->BgndScanCtrl.SkipDfsChannel) - pACSChList[ChIdx].SkipChannel = RadarChannelCheck( - pAd, pACSChList[ChIdx].Channel); -#endif /* BACKGROUND_SCAN_SUPPORT */ - } - - /* Set parameters (BW/BWCap/CentralChannel/..)of ACS channel list*/ - for (ChIdx = 0; ChIdx < ChListNum5G; ChIdx++) { - if (cfg_ht_bw == BW_20) { - pACSChList[ChIdx].Bw = BW_20; - pACSChList[ChIdx].BwCap = TRUE; - pACSChList[ChIdx].CentralChannel = - pACSChList[ChIdx].Channel; - } -#ifdef DOT11_N_SUPPORT - else if (((cfg_ht_bw == BW_40) -#ifdef DOT11_VHT_AC - && (cfg_vht_bw == VHT_BW_2040) -#endif /* DOT11_VHT_AC */ - ) && - N_ChannelGroupCheck(pAd, pACSChList[ChIdx].Channel, - pwdev)) { - pACSChList[ChIdx].Bw = BW_40; - - /* Check that if there is a secondary channel in current BW40-channel group for BW40 capacity. */ - if ((GetABandChOffset(pACSChList[ChIdx].Channel) == - EXT_ABOVE) && - (pACSChList[ChIdx + 1].Channel == - (pACSChList[ChIdx].Channel + 4))) - pACSChList[ChIdx].BwCap = TRUE; - else if ((GetABandChOffset(pACSChList[ChIdx].Channel) == - EXT_BELOW) && - (pACSChList[ChIdx - 1].Channel == - (pACSChList[ChIdx].Channel - 4))) - pACSChList[ChIdx].BwCap = TRUE; - else { -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - if ((IS_SUPPORT_V10_DFS(pAd) && - pACSChList[ChIdx].Channel == 140 && - pAd->CommonCfg.bCh144Enabled == FALSE) || - (IS_SUPPORT_V10_DFS(pAd) && - pACSChList[ChIdx].Channel == 144 && - pAd->CommonCfg.bCh144Enabled == TRUE)) - pACSChList[ChIdx].BwCap = TRUE; - else -#endif - pACSChList[ChIdx].BwCap = FALSE; - } - - /* Check that whether there is a skip-channel in current BW40-channel group */ - /* If there is a skip-channel in BW40-channel group, just also skip secondary channel */ - if (pACSChList[ChIdx].SkipChannel == TRUE) { - if ((GetABandChOffset( - pACSChList[ChIdx].Channel) == - EXT_ABOVE) && - (pACSChList[ChIdx + 1].Channel == - (pACSChList[ChIdx].Channel + 4))) - pACSChList[ChIdx + 1].SkipChannel = - TRUE; - else if ((GetABandChOffset( - pACSChList[ChIdx].Channel) == - EXT_BELOW) && - (pACSChList[ChIdx - 1].Channel == - (pACSChList[ChIdx].Channel - 4))) - pACSChList[ChIdx - 1].SkipChannel = - TRUE; - } - - /* Fill in central-channel parameter */ - if (GetABandChOffset(pACSChList[ChIdx].Channel) == - EXT_ABOVE) - pACSChList[ChIdx].CentralChannel = - pACSChList[ChIdx].Channel + 2; - else - pACSChList[ChIdx].CentralChannel = - pACSChList[ChIdx].Channel - 2; - } -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11_VHT_AC - else if (((cfg_vht_bw == VHT_BW_80) || - (cfg_vht_bw == VHT_BW_8080)) && - vht80_channel_group(pAd, pACSChList[ChIdx].Channel)) { - pACSChList[ChIdx].Bw = BW_80; - idx = 0; - count = 0; - - /* Find out VHT BW80 channel group for current channel */ - while (vht_ch_80M[idx].ch_up_bnd != 0) { - if ((pACSChList[ChIdx].Channel >= - vht_ch_80M[idx].ch_low_bnd) && - (pACSChList[ChIdx].Channel <= - vht_ch_80M[idx].ch_up_bnd)) - break; - idx++; - } - - if (vht_ch_80M[idx].ch_up_bnd != 0) { - /* Count for secondary channels in current VHT BW80 channel group */ - for (k = 1; k < 4; k++) { - if ((pACSChList[ChIdx + k].Channel >= - vht_ch_80M[idx].ch_low_bnd) && - (pACSChList[ChIdx + k].Channel <= - vht_ch_80M[idx].ch_up_bnd)) - count++; - - if ((pACSChList[ChIdx - k].Channel >= - vht_ch_80M[idx].ch_low_bnd) && - (pACSChList[ChIdx - k].Channel <= - vht_ch_80M[idx].ch_up_bnd)) - count++; - } - -#ifndef ACS_CTCC_SUPPORT - if (count == 3) -#endif - { - pACSChList[ChIdx].BwCap = TRUE; - } - } - /* Check that whether there is a skip-channel in BW80-channel group */ - /* If there is a skip-channel in BW80-channel group, just also skip secondary channels */ - if (pACSChList[ChIdx].SkipChannel == TRUE) { - for (k = 1; k < 4; k++) { - if ((pACSChList[ChIdx + k].Channel >= - vht_ch_80M[idx].ch_low_bnd) && - (pACSChList[ChIdx + k].Channel <= - vht_ch_80M[idx].ch_up_bnd)) - pACSChList[ChIdx + k] - .SkipChannel = TRUE; - - if ((pACSChList[ChIdx - k].Channel >= - vht_ch_80M[idx].ch_low_bnd) && - (pACSChList[ChIdx - k].Channel <= - vht_ch_80M[idx].ch_up_bnd)) - pACSChList[ChIdx - k] - .SkipChannel = TRUE; - } - } - - pACSChList[ChIdx].CentralChannel = vht_cent_ch_freq( - pACSChList[ChIdx].Channel, VHT_BW_80); - } else if ((cfg_vht_bw == VHT_BW_160) && - vht80_channel_group(pAd, - pACSChList[ChIdx].Channel)) { - pACSChList[ChIdx].Bw = BW_160; - idx = 0; - count = 0; - - /* Find out VHT BW160 channel group for current channel */ - while (vht_ch_160M[idx].ch_up_bnd != 0) { - if ((pACSChList[ChIdx].Channel >= - vht_ch_160M[idx].ch_low_bnd) && - (pACSChList[ChIdx].Channel <= - vht_ch_160M[idx].ch_up_bnd)) - break; - - idx++; - } - - if (vht_ch_160M[idx].ch_up_bnd != 0) { - /* Count for secondary channels in current VHT BW160 channel group */ - for (k = 1; k < 8; k++) { - if ((pACSChList[ChIdx + k].Channel >= - vht_ch_160M[idx].ch_low_bnd) && - (pACSChList[ChIdx + k].Channel <= - vht_ch_160M[idx].ch_up_bnd)) - count++; - - if ((pACSChList[ChIdx - k].Channel >= - vht_ch_160M[idx].ch_low_bnd) && - (pACSChList[ChIdx - k].Channel <= - vht_ch_160M[idx].ch_up_bnd)) - count++; - } - - if (count == 7) - pACSChList[ChIdx].BwCap = TRUE; - } - - /* Check that whether there is a skip-channel in BW160-channel group */ - /* If there is a skip-channel in BW160-channel group, just also skip secondary channels */ - if (pACSChList[ChIdx].SkipChannel == TRUE) { - for (k = 1; k < 8; k++) { - if ((pACSChList[ChIdx + k].Channel >= - vht_ch_160M[idx].ch_low_bnd) && - (pACSChList[ChIdx + k].Channel <= - vht_ch_160M[idx].ch_up_bnd)) - pACSChList[ChIdx + k] - .SkipChannel = TRUE; - - if ((pACSChList[ChIdx - k].Channel >= - vht_ch_160M[idx].ch_low_bnd) && - (pACSChList[ChIdx - k].Channel <= - vht_ch_160M[idx].ch_up_bnd)) - pACSChList[ChIdx - k] - .SkipChannel = TRUE; - } - } - - pACSChList[ChIdx].CentralChannel = vht_cent_ch_freq( - pACSChList[ChIdx].Channel, VHT_BW_160); - } else { - /*The channel is undefined*/ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[AutoChSelBuildChannelListFor5G] The channel:%d is undefined\n", - pACSChList[ChIdx].Channel)); - if ((cfg_ht_bw == BW_40) && (cfg_vht_bw == VHT_BW_2040)) - pACSChList[ChIdx].Bw = BW_40; - else if ((cfg_vht_bw == VHT_BW_80) || - (cfg_vht_bw == VHT_BW_8080)) - pACSChList[ChIdx].Bw = BW_80; - else if (cfg_vht_bw == VHT_BW_160) - pACSChList[ChIdx].Bw = BW_160; - - pACSChList[ChIdx].BwCap = FALSE; - pACSChList[ChIdx].CentralChannel = - pACSChList[ChIdx].Channel; - } -#endif /* DOT11_VHT_AC */ - } - - /*Show ACS channel list*/ - for (ChIdx = 0; ChIdx < ChListNum5G; ChIdx++) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PrimChannel = %3d, CenChannel = %3d, BW= %d, BwCap= %d, SkipChannel= %d\n", - __func__, pACSChList[ChIdx].Channel, - pACSChList[ChIdx].CentralChannel, pACSChList[ChIdx].Bw, - pACSChList[ChIdx].BwCap, - pACSChList[ChIdx].SkipChannel)); - } - - /*Set channel list of auto channel selection*/ - for (ChIdx = 0; ChIdx < ChListNum5G; ChIdx++) { - if ((pACSChList[ChIdx].SkipChannel == TRUE) || - (pACSChList[ChIdx].BwCap == FALSE)) - continue; - else { - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .Channel = pACSChList[ChIdx].Channel; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .Bw = pACSChList[ChIdx].Bw; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .BwCap = pACSChList[ChIdx].BwCap; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .CentralChannel = - pACSChList[ChIdx].CentralChannel; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .SkipChannel = pACSChList[ChIdx].SkipChannel; - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[ChListNum] - .Flags = pACSChList[ChIdx].Flags; - ChListNum++; - } - } - pAutoChCtrl->AutoChSelCtrl.ChListNum = ChListNum; - - os_free_mem(pACSChList); -} - -/* - ========================================================================== - Description: - - Return: - ScanChIdx - Channel index which is mapping to related channel to be scanned. - Note: - return -1 if no more next channel - ========================================================================== - */ -CHAR AutoChSelFindScanChIdx(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev, - IN CHAR LastScanChIdx) -{ - CHAR ScanChIdx = -1; - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - if (LastScanChIdx == -1) - ScanChIdx = 0; - else { - ScanChIdx = LastScanChIdx + 1; - -#ifdef ACS_CTCC_SUPPORT - if (ScanChIdx >= pAutoChCtrl->pChannelInfo->channel_list_num) -#else - if (ScanChIdx >= pAutoChCtrl->AutoChSelCtrl.ChListNum) -#endif - ScanChIdx = -1; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : LastScanChIdx = %d, ScanChIdx = %d, ChannelListNum = %d\n", - __func__, LastScanChIdx, ScanChIdx, - pAutoChCtrl->AutoChSelCtrl.ChListNum)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - return ScanChIdx; -} - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -UINT8 SelectBestV10Chnl_From_List(IN RTMP_ADAPTER *pAd) -{ - UCHAR Best_Channel = 0; - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; - UCHAR i = 0; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - INT32 ifIndex = pObj->ioctl_if; - struct wifi_dev *wdev; - - if (pObj->ioctl_if == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else - wdev = &pAd->ApCfg.MBSSID[0].wdev; - - if (IS_DFS_V10_ACS_VALID(pAd)) { - /* Fetch Channel from ACS Channel List */ - for (i = 0; i < ((wlan_config_get_vht_bw(wdev) == VHT_BW_2040) ? - (V10_TOTAL_CHANNEL_COUNT) : - (pDfsParam->GroupCount)); - i++) { - if (pDfsParam->DfsV10SortedACSList[i].isConsumed) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s]:Channel %d Consumed\n", __func__, - pDfsParam->DfsV10SortedACSList[i] - .Channel)); - continue; - } - - if (!CheckNonOccupancyChannel( - pAd, wdev, - pDfsParam->DfsV10SortedACSList[i].Channel)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("[%s]:Channel %d NOP\n", __func__, - pDfsParam->DfsV10SortedACSList[i] - .Channel)); - continue; - } - - Best_Channel = - pDfsParam->DfsV10SortedACSList[i].Channel; - pDfsParam->DfsV10SortedACSList[i].isConsumed = TRUE; - break; - } - } - return Best_Channel; -} -#endif - -#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(ONDEMAND_DFS) -VOID ChannelInfoResetNew(IN PRTMP_ADAPTER pAd) -{ - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrl(pAd); - CHANNELINFO *ch_info = pAutoChCtrl->pChannelInfo; - - if (ch_info) { - NdisZeroMemory(ch_info, sizeof(CHANNELINFO)); - pAd->ApCfg.current_channel_index = 0; - } -} -#endif -/* - ========================================================================== - Description:Select best channel from Sorted Ranking List of channels - - Return: - Best_Channel - Channel which is having least channel busy . - Note: - return 0 if no channel - ========================================================================== - */ -#if defined(OFFCHANNEL_SCAN_FEATURE) && defined(ONDEMAND_DFS) -UINT8 SelectBestChannel_From_List(RTMP_ADAPTER *pAd, BOOLEAN IsABand, - BOOLEAN SkipDFS) -{ - INT i = 0; - UINT8 Best_Channel = 0; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - if ((!pAd) || (!pAd->sorted_list.size)) { - if (pAd != NULL) - MTWF_LOG(DBG_CAT_ALL, DBG_CAT_ALL, DBG_LVL_ERROR, - ("%s return error list size = %d\n", __func__, - pAd->sorted_list.size)); - return 0; - } - for (i = 0; i < pAd->sorted_list.size; i++) { - if (!SkipDFS) { - if (RadarChannelCheck( - pAd, - pAd->sorted_list - .SortedMinChannelBusyTimeList[i])) { - if (pAd->last_selected_channel != - pAd->sorted_list - .SortedMinChannelBusyTimeList[i]) { - if (CheckNonOccupancyOnDemandChannel( - pAd, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])) { - pAd->last_selected_channel = - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i]; - MTWF_LOG( - DBG_CAT_ALL, - DBG_CAT_ALL, - DBG_LVL_TRACE, - ("%s Return Best Radar channel = %d \n", - __func__, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])); - break; - } else { - MTWF_LOG( - DBG_CAT_ALL, - DBG_CAT_ALL, - DBG_LVL_INFO, - ("%s skipping occupied Radar channel = %d\n", - __func__, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])); - continue; - } - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_CAT_ALL, - DBG_LVL_INFO, - ("%s skipping Radar channel = %d because same as last occupied\n", - __func__, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])); - continue; - } - } else { - if (pAd->last_selected_channel != - pAd->sorted_list - .SortedMinChannelBusyTimeList[i]) { - pAd->last_selected_channel = - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i]; - MTWF_LOG( - DBG_CAT_ALL, DBG_CAT_ALL, - DBG_LVL_TRACE, - ("%s Return Best non Radar channel = %d (skip DFS = FALSE)\n", - __func__, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])); - break; - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_CAT_ALL, - DBG_LVL_INFO, - ("%s skipping channel = %d because its already last selected\n", - __func__, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])); - continue; - } - } - } else { - if (!RadarChannelCheck( - pAd, - pAd->sorted_list - .SortedMinChannelBusyTimeList[i])) { - if (pAd->last_selected_channel != - pAd->sorted_list - .SortedMinChannelBusyTimeList[i]) { - pAd->last_selected_channel = - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i]; - MTWF_LOG( - DBG_CAT_ALL, DBG_CAT_ALL, - DBG_LVL_TRACE, - ("%s Return Best non Radar channel = %d \n", - __func__, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])); - break; - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_CAT_ALL, - DBG_LVL_INFO, - ("%s skipping LAST SELECTED non Radar channel = %d in skip DFS = TRUE mode\n", - __func__, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])); - continue; - } - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_CAT_ALL, DBG_LVL_INFO, - ("%s skipping Radar channel = %d because skip DFS = TRUE\n", - __func__, - pAd->sorted_list - .SortedMinChannelBusyTimeList - [i])); - continue; - } - } - } - if (i < pAd->sorted_list.size) { - MTWF_LOG(DBG_CAT_ALL, DBG_CAT_ALL, DBG_LVL_TRACE, - ("%s return selected channel = %d skip dfs = %d\n", - __func__, pAd->last_selected_channel, SkipDFS)); - Best_Channel = pAd->last_selected_channel; - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s failure no channel selected\n", __func__)); - Best_Channel = 0; - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - return Best_Channel; -} - -#endif - -/* - ========================================================================== - Description: - Scan next channel - ========================================================================== - */ -VOID AutoChSelScanNextChannel(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev) -{ - RALINK_TIMER_STRUCT *ScanTimer; - CHAR Idx; - UINT32 BusyTime; - ULONG wait_time = 200; /* Wait for 200 ms at each channel. */ - UCHAR NewCh, BandIdx = HcGetBandByWdev(pwdev); - INT ret; - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); -#ifdef TR181_SUPPORT - struct hdev_obj *hdev = (struct hdev_obj *)pwdev->pHObj; -#endif - - ScanTimer = &pAutoChCtrl->AutoChSelCtrl.AutoChScanTimer; - Idx = pAutoChCtrl->AutoChSelCtrl.ScanChIdx; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); -#ifdef AP_QLOAD_SUPPORT - - /* QLOAD ALARM, ever alarm from QLOAD module */ - if (QLOAD_DOES_ALARM_OCCUR(pAd)) - wait_time = 400; - -#endif /* AP_QLOAD_SUPPORT */ - - if (pAutoChCtrl->AutoChSelCtrl.ScanChIdx == -1) { -#ifdef ACS_CTCC_SUPPORT - NewCh = select_clear_channel_busy_time(pAd, pwdev); -#else - NewCh = SelectClearChannelBusyTime(pAd, pwdev); -#endif - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Current channel = %d , selected new channel = %d\n", - __func__, pwdev->channel, NewCh)); - -#ifdef AP_SCAN_SUPPORT - scan_ch_restore(pAd, OPMODE_AP, - pwdev); /* Restore original channel */ -#endif /* AP_SCAN_SUPPORT */ - - if (NewCh != pwdev->channel) { -#ifdef ACS_CTCC_SUPPORT - if (pAd->ApCfg.auto_ch_score_flag == FALSE) -#endif - { - ret = rtmp_set_channel(pAd, pwdev, NewCh); - if (!ret) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : Fail to set channel !!\n", - __func__)); - } -#ifdef TR181_SUPPORT - else { - if (hdev->rdev->pRadioCtrl - ->ACSTriggerFlag == 2) { - /*ACS triggered by manual command*/ - hdev->rdev->pRadioCtrl - ->ForceACSChannelChangeCount++; - hdev->rdev->pRadioCtrl - ->TotalChannelChangeCount++; - hdev->rdev->pRadioCtrl - ->ACSTriggerFlag = 0; - } else if (hdev->rdev->pRadioCtrl - ->ACSTriggerFlag == - 1) { - /*ACS triggered by periodic refresh*/ - hdev->rdev->pRadioCtrl - ->RefreshACSChannelChangeCount++; - hdev->rdev->pRadioCtrl - ->TotalChannelChangeCount++; - hdev->rdev->pRadioCtrl - ->ACSTriggerFlag = 0; - } - } -#endif - } - } - RTMPSendWirelessEvent(pAd, IW_CHANNEL_CHANGE_EVENT_FLAG, 0, 0, - 0); - - pAutoChCtrl->AutoChSelCtrl.ACSChStat = ACS_CH_STATE_SELECTED; - /* Update current state from listen state to idle. */ - if (pAd->CommonCfg.set_ch_async_flag == FALSE) { - pAutoChCtrl->AutoChSelCtrl.AutoChScanStatMachine - .CurrState = AUTO_CH_SEL_SCAN_IDLE; - if (pAd->CommonCfg.iwpriv_event_flag) - RTMP_OS_COMPLETE( - &pAd->CommonCfg.set_ch_aync_done); - } -#ifdef ACS_CTCC_SUPPORT - pAd->ApCfg.auto_ch_score_flag = FALSE; -#endif - /* Enable MibBucket after ACS done */ - pAd->MsMibBucket.Enabled = TRUE; - pAd->OneSecMibBucket.Enabled[BandIdx] = TRUE; - } else { - /* Update current state from idle state to listen. */ - pAutoChCtrl->AutoChSelCtrl.AutoChScanStatMachine.CurrState = - AUTO_CH_SEL_SCAN_LISTEN; -#ifdef ACS_CTCC_SUPPORT - wlan_operate_scan( - pwdev, - pAutoChCtrl->pChannelInfo->supp_ch_list[Idx].channel); -#else - wlan_operate_scan( - pwdev, - pAutoChCtrl->AutoChSelCtrl.AutoChSelChList[Idx].Channel); -#endif - /* Read-Clear reset Channel busy time counter */ - BusyTime = AsicGetChBusyCnt(pAd, BandIdx); - - RTMPSetTimer(ScanTimer, wait_time); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -} - -/* - ========================================================================== - Description: - Auto-channel selection SCAN req state machine procedure - ========================================================================== - */ -VOID AutoChSelScanReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *pElem) -{ - BOOLEAN Cancelled; - UCHAR BandIdx; - AUTO_CH_CTRL *pAutoChCtrl; - struct wifi_dev *pwdev = (struct wifi_dev *)pElem->Priv; - if (!pwdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AutoChSelScanReqAction - pwdev == NULL \n")); - return; - } - BandIdx = HcGetBandByWdev(pwdev); - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - RTMPCancelTimer(&pAutoChCtrl->AutoChSelCtrl.AutoChScanTimer, - &Cancelled); -#ifdef ACS_CTCC_SUPPORT - APAutoChannelInit(pAd, pwdev); -#endif - AutoChSelScanNextChannel(pAd, pwdev); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -} - -/* - ========================================================================== - Description: - Auto-channel selection SCAN timeout state machine procedure - ========================================================================== - */ -VOID AutoChSelScanTimeoutAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *pElem) -{ - CHAR Idx; - UCHAR BandIdx; - AUTO_CH_CTRL *pAutoChCtrl; - struct wifi_dev *pwdev = (struct wifi_dev *)pElem->Priv; - if (!pwdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AutoChSelScanTimeoutAction - pwdev == NULL \n")); - return; - } - BandIdx = HcGetBandByWdev(pwdev); - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - Idx = pAutoChCtrl->AutoChSelCtrl.ScanChIdx; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - UpdateChannelInfo(pAd, Idx, ChannelAlgBusyTime, pwdev); - pAutoChCtrl->AutoChSelCtrl.ScanChIdx = - AutoChSelFindScanChIdx(pAd, pwdev, Idx); - AutoChSelScanNextChannel(pAd, pwdev); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -} - -/* - ========================================================================== - Description: - Scan start handler, executed in timer thread - ========================================================================== - */ -VOID AutoChSelScanStart(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev) -{ - UCHAR BandIdx = HcGetBandByWdev(pwdev); - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - /* Reset ACS ChCtrl*/ - pAutoChCtrl->AutoChSelCtrl.ACSChStat = ACS_CH_STATE_NONE; - os_zero_mem(pAutoChCtrl->AutoChSelCtrl.AutoChSelChList, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(AUTOCH_SEL_CH_LIST)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Disable MibBucket during doing ACS */ - pAd->MsMibBucket.Enabled = FALSE; - pAd->OneSecMibBucket.Enabled[BandIdx] = FALSE; - - pAutoChCtrl->AutoChSelCtrl.ScanChIdx = 0; /* Start from first channel */ - pAutoChCtrl->AutoChSelCtrl.pScanReqwdev = pwdev; - - if (WMODE_CAP_5G(pwdev->PhyMode)) - pAutoChCtrl->AutoChSelCtrl.IsABand = TRUE; - else - pAutoChCtrl->AutoChSelCtrl.IsABand = FALSE; - - AutoChSelBuildChannelList(pAd, pAutoChCtrl->AutoChSelCtrl.IsABand, - pwdev); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: IsABand = %d, ChannelListNum = %d\n", __func__, - pAutoChCtrl->AutoChSelCtrl.IsABand, - pAutoChCtrl->AutoChSelCtrl.ChListNum)); - MlmeEnqueue(pAd, AUTO_CH_SEL_STATE_MACHINE, AUTO_CH_SEL_SCAN_REQ, 0, - NULL, (ULONG)pwdev); - RTMP_MLME_HANDLER(pAd); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -} - -/* - ========================================================================== - Description: - Scan timeout handler, executed in timer thread - ========================================================================== - */ -VOID AutoChSelScanTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - PTIMER_FUNC_CONTEXT pContext = (PTIMER_FUNC_CONTEXT)FunctionContext; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pContext->pAd; - UCHAR BandIdx = pContext->BandIdx; - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - struct wifi_dev *pwdev = pAutoChCtrl->AutoChSelCtrl.pScanReqwdev; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[AutoChSelScanTimeout] - BandIdx = %d\n", BandIdx)); - MlmeEnqueue(pAd, AUTO_CH_SEL_STATE_MACHINE, AUTO_CH_SEL_SCAN_TIMEOUT, 0, - NULL, (ULONG)pwdev); - RTMP_MLME_HANDLER(pAd); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -} - -/* - ========================================================================== - Description: - Auto-channel selection state machine. - Parameters: - Sm - pointer to the state machine - NOTE: - The state machine is classified as follows: - a. AUTO_CH_SEL_SCAN_IDLE - b. AUTO_CH_SEL_SCAN_LISTEN - ========================================================================== - */ -VOID AutoChSelStateMachineInit(IN RTMP_ADAPTER *pAd, IN UCHAR BandIdx, - IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]) -{ - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - pAutoChCtrl->AutoChSelCtrl.ACSTimerFuncContex.pAd = pAd; - pAutoChCtrl->AutoChSelCtrl.ACSTimerFuncContex.BandIdx = BandIdx; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - StateMachineInit(Sm, (STATE_MACHINE_FUNC *)Trans, - AUTO_CH_SEL_SCAN_MAX_STATE, AUTO_CH_SEL_SCAN_MAX_MSG, - (STATE_MACHINE_FUNC)Drop, AUTO_CH_SEL_SCAN_IDLE, - AUTO_CH_SEL_MACHINE_BASE); - /* Scan idle state */ - StateMachineSetAction(Sm, AUTO_CH_SEL_SCAN_IDLE, AUTO_CH_SEL_SCAN_REQ, - (STATE_MACHINE_FUNC)AutoChSelScanReqAction); - /* Scan listen state */ - StateMachineSetAction(Sm, AUTO_CH_SEL_SCAN_LISTEN, - AUTO_CH_SEL_SCAN_TIMEOUT, - (STATE_MACHINE_FUNC)AutoChSelScanTimeoutAction); - RTMPInitTimer(pAd, &pAutoChCtrl->AutoChSelCtrl.AutoChScanTimer, - GET_TIMER_FUNCTION(AutoChSelScanTimeout), - &pAutoChCtrl->AutoChSelCtrl.ACSTimerFuncContex, FALSE); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -} - -/* - ========================================================================== - Description: - Init for auto-channel selection scan-timer. - NOTE: - ========================================================================== - */ -VOID AutoChSelInit(IN PRTMP_ADAPTER pAd) -{ - UCHAR BandIdx; - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - AUTO_CH_CTRL *pAutoChCtrl = - HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - AutoChSelStateMachineInit( - pAd, BandIdx, - &pAutoChCtrl->AutoChSelCtrl.AutoChScanStatMachine, - pAutoChCtrl->AutoChSelCtrl.AutoChScanFunc); - } -} - -/* - ========================================================================== - Description: - Release auto-channel selection scan-timer. - NOTE: - ========================================================================== - */ -VOID AutoChSelRelease(IN PRTMP_ADAPTER pAd) -{ - BOOLEAN Cancelled; - - UCHAR BandIdx; - AUTO_CH_CTRL *pAutoChCtrl; - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - RTMPReleaseTimer(&pAutoChCtrl->AutoChSelCtrl.AutoChScanTimer, - &Cancelled); - } -} - -/* - ========================================================================== - Description: - Set auto channel select parameters by reading profile settings. - - Return: - None. - ========================================================================== -*/ -VOID auto_ch_select_set_cfg(RTMP_ADAPTER *pAd, RTMP_STRING *buffer) -{ - UINT8 band_idx = 0; - RTMP_STRING *ptr; - struct wifi_dev *pwdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - ChannelSel_Alg sel_alg = ChannelAlgBusyTime; - - for (band_idx = 0, ptr = rstrtok(buffer, ";"); ptr; - ptr = rstrtok(NULL, ";"), band_idx++) { - BOOLEAN acs_bootup = FALSE; - - if (band_idx >= DBDC_BAND_NUM) - break; - - sel_alg = (ChannelSel_Alg)simple_strtol(ptr, 0, 10); - if ((ChannelAlgRandom < sel_alg) && - (sel_alg <= ChannelAlgBusyTime)) - acs_bootup = TRUE; - else if (ChannelAlgRandom == sel_alg) - acs_bootup = FALSE; - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():INFO::Invalid argument!\n", __func__)); - } - - if (pAd->CommonCfg.eDBDC_mode == ENUM_DBDC_5G5G) { - /* 5G + 5G */ - pAd->ApCfg.AutoChannelAlg[band_idx] = sel_alg; - pAd->ApCfg.bAutoChannelAtBootup[band_idx] = acs_bootup; - } else { - if (WMODE_CAP_5G(pwdev->PhyMode)) { - /* 5G + 2G */ - if (band_idx == 0 && - (pAd->CommonCfg.dbdc_mode == 1)) { -#ifdef DBDC_MODE - /* [5G] + 2G */ - pAd->ApCfg.AutoChannelAlg[BAND1] = - sel_alg; - pAd->ApCfg.bAutoChannelAtBootup[BAND1] = - acs_bootup; -#endif - } else { - /* 5G + [2G] */ - pAd->ApCfg.AutoChannelAlg[BAND0] = - sel_alg; - pAd->ApCfg.bAutoChannelAtBootup[BAND0] = - acs_bootup; - } - } else { - /* 2G + 5G or 2G only */ - pAd->ApCfg.AutoChannelAlg[band_idx] = sel_alg; - pAd->ApCfg.bAutoChannelAtBootup[band_idx] = - acs_bootup; - } - } - } - - for (band_idx = 0; band_idx < DBDC_BAND_NUM; band_idx++) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): BandIdx%d, AutoChannelAtBootup=%d, AutoChannelAlg = %d\n", - __func__, band_idx, - pAd->ApCfg.bAutoChannelAtBootup[band_idx], - pAd->ApCfg.AutoChannelAlg[band_idx])); - } -} - -#ifdef AP_SCAN_SUPPORT -/* - ========================================================================== - Description: - trigger Auto Channel Selection every period of ACSCheckTime. - - NOTE: - This function is called in a 1-sec mlme periodic check. - Do ACS only on one HW band at a time. - Do ACS only when no clients is associated. - ========================================================================== - */ -VOID AutoChannelSelCheck(RTMP_ADAPTER *pAd) -{ - UCHAR i, WdevBandIdx = 0, BandIdx, HWBandNum; - MAC_TABLE_ENTRY *pEntry = NULL; - struct wifi_dev *pwdev = NULL; - - /* Query current cofigured HW band number */ - HWBandNum = HcGetAmountOfBand(pAd); - - for (BandIdx = 0; BandIdx < HWBandNum; BandIdx++) { - /* Do nothing if ACSCheckTime is not configured */ - if (pAd->ApCfg.ACSCheckTime[BandIdx] == 0) - continue; - pAd->ApCfg.ACSCheckCount[BandIdx]++; - - if (pAd->ApCfg.ACSCheckCount[BandIdx] > - pAd->ApCfg.ACSCheckTime[BandIdx]) { - /* Find wdev, BandIdx of wdev is the same as BandIdx */ - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - pwdev = &pAd->ApCfg.MBSSID[i].wdev; - WdevBandIdx = HcGetBandByWdev(pwdev); - if (BandIdx == WdevBandIdx) - break; - } - - /* Do nothing if AP is doing channel scanning */ - if (ApScanRunning(pAd, pwdev)) - continue; - - /* Reset Counter */ - pAd->ApCfg.ACSCheckCount[BandIdx] = 0; - - /* Do Auto Channel Selection only when no client is associated in current band */ - if (pAd->MacTab.Size != 0) { - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); - i++) { - pEntry = &pAd->MacTab.Content[i]; - - if ((pEntry->wdev != NULL) && - (IS_ENTRY_CLIENT(pEntry))) { - WdevBandIdx = HcGetBandByWdev( - pEntry->wdev); - - if (BandIdx == WdevBandIdx) { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\x1b[41m%s(): Ignore ACS checking because has associated clients in current band%d\x1b[m\n", - __func__, - BandIdx)); - - return; - } - } - } - } - /* Start for ACS checking */ - { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(): Scanning channels for channel selection.\n", - __func__)); - - if (pAd->ApCfg.AutoChannelAlg[BandIdx] == - ChannelAlgBusyTime) { -#ifdef TR181_SUPPORT - { - struct hdev_obj *hdev = - (struct hdev_obj *) - pwdev->pHObj; - - /*set ACS trigger flag to periodic refresh trigger*/ - hdev->rdev->pRadioCtrl - ->ACSTriggerFlag = 1; - } -#endif - AutoChSelScanStart(pAd, pwdev); - } else - ApSiteSurvey_by_wdev(pAd, NULL, - SCAN_PASSIVE, TRUE, - pwdev); - return; - } - } - } -} -#endif /* AP_SCAN_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_band_steering.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_band_steering.c deleted file mode 100644 index 88ec2bd75d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_band_steering.c +++ /dev/null @@ -1,2999 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_band_steering.c -*/ - -#ifdef BAND_STEERING -#include "rt_config.h" - -#define BNDSTRG_DRIVER_VER "3.1.3" -static inline PBND_STRG_CLI_TABLE Get_BndStrgTableByChannel(PRTMP_ADAPTER pAd, - UINT8 Channel) -{ - PBND_STRG_CLI_TABLE table = NULL; - INT i; - - for (i = 0; i < DBDC_BAND_NUM; i++) { - table = P_BND_STRG_TABLE(i); - - if (table->bInitialized && (table->Channel == Channel)) - return table; - } - - return NULL; -} - -inline PBND_STRG_CLI_TABLE Get_BndStrgTable(PRTMP_ADAPTER pAd, INT apidx) -{ - BSS_STRUCT *pMbss = NULL; - UINT8 Channel; - - if (apidx < HW_BEACON_MAX_NUM) - pMbss = &pAd->ApCfg.MBSSID[apidx]; - - if (pMbss) { - Channel = pMbss->wdev.channel; - return Get_BndStrgTableByChannel(pAd, Channel); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (RED("%s:(%d):invalid pMbss. apidx=%d\n"), __func__, __LINE__, - apidx)); - return NULL; -} - -/* WPS_BandSteering Support */ -PWPS_WHITELIST_ENTRY FindWpsWhiteListEntry(PLIST_HEADER pWpsWhiteList, - PUCHAR pMacAddr) -{ - PWPS_WHITELIST_ENTRY pWpsWhiteListEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = pWpsWhiteList->pHead; - pWpsWhiteListEntry = (PWPS_WHITELIST_ENTRY)pListEntry; - while (pWpsWhiteListEntry != NULL) { - if (NdisEqualMemory(pWpsWhiteListEntry->addr, pMacAddr, - MAC_ADDR_LEN)) - return pWpsWhiteListEntry; - pListEntry = pListEntry->pNext; - pWpsWhiteListEntry = (PWPS_WHITELIST_ENTRY)pListEntry; - } - - return NULL; -} - -VOID AddWpsWhiteList(PLIST_HEADER pWpsWhiteList, PUCHAR pMacAddr) -{ - PWPS_WHITELIST_ENTRY pWpsWhiteListEntry = NULL; - - pWpsWhiteListEntry = FindWpsWhiteListEntry(pWpsWhiteList, pMacAddr); - - if (pWpsWhiteListEntry) { - /* the Entry already exist */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Found %02x:%02x:%02x:%02x:%02x:%02x in Wps White List\n", - __func__, PRINT_MAC(pMacAddr))); - } else { - /* Add new Entry */ - os_alloc_mem(NULL, (UCHAR **)&pWpsWhiteListEntry, - sizeof(WPS_WHITELIST_ENTRY)); - if (pWpsWhiteListEntry) { - NdisZeroMemory(pWpsWhiteListEntry, - sizeof(WPS_WHITELIST_ENTRY)); - pWpsWhiteListEntry->pNext = NULL; - NdisCopyMemory(pWpsWhiteListEntry->addr, pMacAddr, - MAC_ADDR_LEN); - insertTailList(pWpsWhiteList, - (RT_LIST_ENTRY *)pWpsWhiteListEntry); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s]%02x:%02x:%02x:%02x:%02x:%02x added to WpsList:size::%d\n", - __func__, PRINT_MAC(pWpsWhiteListEntry->addr), - pWpsWhiteList->size)); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] Mem alloc fail\n", __func__)); - } -} - -VOID DelWpsWhiteListExceptMac(PLIST_HEADER pWpsWhiteList, PUCHAR pMacAddr) -{ - RT_LIST_ENTRY *pListEntry = NULL, *pDelEntry = NULL; - PWPS_WHITELIST_ENTRY pWpsWhiteListEntry = NULL; - PLIST_HEADER pListHeader = pWpsWhiteList; - UCHAR Addr[6]; - - NdisCopyMemory(Addr, pMacAddr, MAC_ADDR_LEN); - - if (pListHeader->size == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: WpsWhiteList Empty.\n", __func__)); - return; - } - - pListEntry = pListHeader->pHead; - pWpsWhiteListEntry = (PWPS_WHITELIST_ENTRY)pListEntry; - - while (pWpsWhiteListEntry != NULL) { - if (MAC_ADDR_EQUAL(pWpsWhiteListEntry->addr, Addr)) { - pListEntry = pListEntry->pNext; - } else { - pDelEntry = delEntryList(pWpsWhiteList, pListEntry); - pListEntry = pDelEntry->pNext; - os_free_mem(pDelEntry); - } - pWpsWhiteListEntry = (PWPS_WHITELIST_ENTRY)pListEntry; - } - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: WpsWhiteList size : %d\n", __func__, - pWpsWhiteList->size)); -} - -VOID ClearWpsWhiteList(PLIST_HEADER pWpsWhiteList) -{ - RT_LIST_ENTRY *pListEntry = NULL; - PLIST_HEADER pListHeader = pWpsWhiteList; - - if (pListHeader->size == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: WpsWhiteList already Empty.\n", __func__)); - return; - } - - pListEntry = pListHeader->pHead; - while (pListEntry != NULL) { - /*Remove ListEntry from Header*/ - removeHeadList(pListHeader); - os_free_mem(pListEntry); - pListEntry = pListHeader->pHead; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Clean WpsWhiteList.\n", __func__)); -} - -PBS_LIST_ENTRY FindBsListEntry(PLIST_HEADER pBsList, PUCHAR pMacAddr) -{ - PBS_LIST_ENTRY pBsListEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = pBsList->pHead; - pBsListEntry = (PBS_LIST_ENTRY)pListEntry; - while (pBsListEntry != NULL) { - if (NdisEqualMemory(pBsListEntry->addr, pMacAddr, MAC_ADDR_LEN)) - return pBsListEntry; - pListEntry = pListEntry->pNext; - pBsListEntry = (PBS_LIST_ENTRY)pListEntry; - } - - return NULL; -} - -VOID AddBsListEntry(PLIST_HEADER pBsList, PUCHAR pMacAddr) -{ - PBS_LIST_ENTRY pBsListEntry = NULL; - - pBsListEntry = FindBsListEntry(pBsList, pMacAddr); - - if (pBsListEntry) { - /* the Entry already exist */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Found %02x:%02x:%02x:%02x:%02x:%02x in BsList.\n", - __func__, PRINT_MAC(pMacAddr))); - } else { - /* Add new Entry */ - os_alloc_mem(NULL, (UCHAR **)&pBsListEntry, - sizeof(BS_LIST_ENTRY)); - if (pBsListEntry) { - NdisZeroMemory(pBsListEntry, sizeof(BS_LIST_ENTRY)); - pBsListEntry->pNext = NULL; - NdisCopyMemory(pBsListEntry->addr, pMacAddr, - MAC_ADDR_LEN); - insertTailList(pBsList, (RT_LIST_ENTRY *)pBsListEntry); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] %02x:%02x:%02x:%02x:%02x:%02x added in BsList:size::%d\n", - __func__, PRINT_MAC(pBsListEntry->addr), - pBsList->size)); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s]Mem alloc fail\n", __func__)); - } -} - -VOID DelBsListEntry(PLIST_HEADER pBsList, PUCHAR pMacAddr) -{ - PBS_LIST_ENTRY pBsListEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL, *pDelEntry = NULL; - - pBsListEntry = FindBsListEntry(pBsList, pMacAddr); - - if (!pBsListEntry) { - /* the Entry already exist */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Not Found %02x:%02x:%02x:%02x:%02x:%02x in BsList.\n", - __func__, PRINT_MAC(pMacAddr))); - } else { - pListEntry = (RT_LIST_ENTRY *)pBsListEntry; - /* Delete the Entry */ - pDelEntry = delEntryList(pBsList, pListEntry); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Sta %02x:%02x:%02x:%02x:%02x:%02x deleted from BsList:size::%d\n", - __func__, PRINT_MAC(pBsListEntry->addr), - pBsList->size)); - os_free_mem(pDelEntry); - } -} - -VOID ClearBsList(PLIST_HEADER pBsList) -{ - RT_LIST_ENTRY *pListEntry = NULL; - PLIST_HEADER pListHeader = pBsList; - - if (pListHeader->size == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: BsList already Empty.\n", __func__)); - return; - } - - pListEntry = pListHeader->pHead; - while (pListEntry != NULL) { - /*Remove ListEntry from Header*/ - removeHeadList(pListHeader); - os_free_mem(pListEntry); - pListEntry = pListHeader->pHead; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Clean BsList.\n", __func__)); -} - -INT Show_BndStrg_Info(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - PBND_STRG_CLI_TABLE table; - POS_COOKIE pObj; - UCHAR ifIndex; - struct wifi_dev *wdev = NULL; - BNDSTRG_MSG msg = { 0 }; - UINT8 idx = 0; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - ifIndex = pObj->ioctl_if; - - if (ifIndex >= HW_BEACON_MAX_NUM) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - - if (!pAd->ApCfg.BndStrgBssIdx[wdev->func_idx]) - return TRUE; - - table = Get_BndStrgTable(pAd, ifIndex); - - if (!table) - return FALSE; - - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Band Steering Driver Ver - %s\n", - BNDSTRG_DRIVER_VER)); - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t BndStrgBssIdx")); - - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (":%d", pAd->ApCfg.BndStrgBssIdx[idx])); - - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t WhiteListSize:%d\n", table->WhiteList.size)); - - if (table->WhiteList.size) { - PBS_LIST_ENTRY pBsListEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = table->WhiteList.pHead; - pBsListEntry = (PBS_LIST_ENTRY)pListEntry; - - while (pBsListEntry != NULL) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t -> %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pBsListEntry->addr))); - pListEntry = pListEntry->pNext; - pBsListEntry = (PBS_LIST_ENTRY)pListEntry; - } - } - - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t BlackListSize:%d\n", table->BlackList.size)); - - if (table->BlackList.size) { - PBS_LIST_ENTRY pBsListEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = table->BlackList.pHead; - pBsListEntry = (PBS_LIST_ENTRY)pListEntry; - - while (pBsListEntry != NULL) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t -> %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pBsListEntry->addr))); - pListEntry = pListEntry->pNext; - pBsListEntry = (PBS_LIST_ENTRY)pListEntry; - } - } - - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - msg.Action = TABLE_INFO; - BndStrgSendMsg(pAd, &msg); - return TRUE; -} - -INT Show_BndStrg_List(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - PBND_STRG_CLI_TABLE table; - POS_COOKIE pObj; - UCHAR ifIndex; - UINT32 display_type; - BNDSTRG_MSG msg = { 0 }; - CHAR band_str[4][10] = { "", "5G", "2.4G", "2.4G/5G" }; - INT i; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - ifIndex = pObj->ioctl_if; - table = Get_BndStrgTable(pAd, ifIndex); - - if (!table) - return FALSE; - - if (arg == NULL) - display_type = 0; - else - display_type = (UINT32)simple_strtol(arg, 0, 10); - - if (display_type > 3) - display_type = 0; - - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t%s Accessible Clients: %d\n", - band_str[table->Band], table->Size)); - - for (i = 0; i < BND_STRG_MAX_TABLE_SIZE; i++) { - if (table->Entry[i].bValid) { - if (MAC_ADDR_EQUAL(table->MonitorAddr, - table->Entry[i].Addr)) { - BND_STRG_PRINTQAMSG( - table, table->Entry[i].Addr, - (YLW("\t%d: %02x:%02x:%02x:%02x:%02x:%02x [TblIdx:%d]\n"), - i, PRINT_MAC(table->Entry[i].Addr), - table->Entry[i].TableIndex)); - } else { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\t%d: %02x:%02x:%02x:%02x:%02x:%02x [TblIdx:%d]\n", - i, PRINT_MAC(table->Entry[i].Addr), - table->Entry[i].TableIndex)); - } - } - } - - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBndStrg Table Entries:\n")); - msg.Action = ENTRY_LIST; - msg.data.display_type.display_type = display_type; - msg.data.display_type.filer_band = table->Band; - msg.data.display_type.channel = table->Channel; - BndStrgSendMsg(pAd, &msg); - - return TRUE; -} - -INT Set_BndStrg_Enable(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - PBND_STRG_CLI_TABLE table; - POS_COOKIE pObj; - UCHAR ifIndex; - BOOLEAN enable; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - ifIndex = pObj->ioctl_if; - enable = (BOOLEAN)simple_strtol(arg, 0, 10); - - if (!(enable ^ pAd->ApCfg.BandSteering)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (GRN("BndStrg is already %s\n"), - pAd->ApCfg.BandSteering ? "Enable" : "Disable")); - return TRUE; - } - - if (enable) { - BSS_STRUCT *pMbss = NULL; - INT apidx, IdBss; - - apidx = ifIndex; - - if (apidx < HW_BEACON_MAX_NUM) - pMbss = &pAd->ApCfg.MBSSID[apidx]; - - if (pMbss == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (RED("%s:(%d):invalid pMbss. apidx=%d\n"), - __func__, __LINE__, apidx)); - return FALSE; - } - - /* bnstrg table does not init yet, call BndStrg_Init directly */ - BndStrg_Init(pAd); - - /* enable all active mbss BndStrg InfFlags to nitify daemon */ - for (IdBss = 0; IdBss < pAd->ApCfg.BssidNum; IdBss++) { - pMbss = &pAd->ApCfg.MBSSID[IdBss]; - table = Get_BndStrgTable(pAd, IdBss); - - if (table) { - /* Inform daemon interface ready */ - BndStrg_SetInfFlags(pAd, &pMbss->wdev, table, - TRUE); - } - } - - pAd->ApCfg.BandSteering = enable; - } else { - BndStrg_Release(pAd); - pAd->ApCfg.BandSteering = enable; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (GRN("BndStrg %s Success\n"), - pAd->ApCfg.BandSteering ? "Enable" : "Disable")); - return TRUE; -} - -INT Set_BndStrg_Param(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - PBND_STRG_CLI_TABLE table; - POS_COOKIE pObj; - UCHAR ifIndex; - BNDSTRG_MSG msg = { 0 }; - struct bnd_msg_param *bndstrg_param = &msg.data.bndstrg_param; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - ifIndex = pObj->ioctl_if; - - if (ifIndex > HW_BEACON_MAX_NUM) - return FALSE; - - table = Get_BndStrgTable(pAd, ifIndex); - - if (!table) - return FALSE; - - msg.Action = BNDSTRG_PARAM; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): BndStrg param = %s\n", __func__, arg)); - - bndstrg_param->Band = table->Band; - bndstrg_param->Channel = table->Channel; - bndstrg_param->len = strlen(arg); - strncpy(bndstrg_param->arg, arg, sizeof(bndstrg_param->arg) - 1); - BndStrgSendMsg(pAd, &msg); - - return TRUE; -} - -#ifdef BND_STRG_DBG -INT Set_BndStrg_MonitorAddr(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - UCHAR MonitorAddr[MAC_ADDR_LEN]; - RTMP_STRING *value; - INT i; - PBND_STRG_CLI_TABLE table; - POS_COOKIE pObj; - UCHAR ifIndex; - BNDSTRG_MSG msg = { 0 }; - struct bnd_msg_mnt_addr *mnt_addr = &msg.data.mnt_addr; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - ifIndex = pObj->ioctl_if; - table = Get_BndStrgTable(pAd, ifIndex); - - if (!table) - return FALSE; - - if (strlen(arg) != - 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */ - return FALSE; - - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid */ - - AtoH(value, (UCHAR *)&MonitorAddr[i++], 1); - } - - COPY_MAC_ADDR(table->MonitorAddr, MonitorAddr); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): %02x:%02x:%02x:%02x:%02x:%02x\n", __func__, - PRINT_MAC(table->MonitorAddr))); - msg.Action = SET_MNT_ADDR; - COPY_MAC_ADDR(mnt_addr->Addr, table->MonitorAddr); - BndStrgSendMsg(pAd, &msg); - - return TRUE; -} -#endif /* BND_STRG_DBG */ - -INT BndStrg_Init(PRTMP_ADAPTER pAd) -{ - INT ret_val = BND_STRG_SUCCESS; - INT max_mbss_check_num; - INT apidx; - - max_mbss_check_num = pAd->ApCfg.BssidNum; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (YLW("%s()\n"), __func__)); - - for (apidx = 0; apidx < max_mbss_check_num; apidx++) { - if (pAd->ApCfg.BndStrgBssIdx[apidx]) { - ret_val = BndStrg_TableInit(pAd, apidx); - if (ret_val != BND_STRG_SUCCESS) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Error in %s(), error code = %d on apidx = %d\n", - __func__, ret_val, apidx)); - } - } - } - - return ret_val; -} - -#ifdef DOT11K_RRM_SUPPORT -VOID BndStrg_InsertNeighborRepIE(PRTMP_ADAPTER pAd, - PBND_STRG_CLI_TABLE init_table) -{ - RRM_NEIGHBOR_REP_INFO NeighborRepInfo = { { 0 } }; - BSS_STRUCT *pMbss = NULL; - RRM_BSSID_INFO BssidInfo; - UINT8 idx, CondensedPhyType = 0; /* 7:2G,9:5G */ - - if (init_table->Channel == 0) { - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s]Error zero channel\n", __func__)); - return; - } - - for (idx = 0; idx < HW_BEACON_MAX_NUM; idx++) { - pMbss = &pAd->ApCfg.MBSSID[idx]; - if (pMbss->wdev.channel == init_table->Channel && - pAd->ApCfg.BndStrgBssIdx[idx]) - break; - } - - if (idx >= HW_BEACON_MAX_NUM) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s]Error no pMbss init to channel table channel:%d\n", - __func__, init_table->Channel)); - return; - } - - COPY_MAC_ADDR(NeighborRepInfo.Bssid, pMbss->wdev.bssid); - CondensedPhyType = (pMbss->wdev.channel > 14) ? 9 : 7; /* 7:2G,9:5G */ - /* our own info */ - BssidInfo.word = 0; - BssidInfo.field.APReachAble = 3; - BssidInfo.field.Security = 1; /* rrm to do. */ - BssidInfo.field.KeyScope = - 1; /* "report AP has same authenticator as the AP. */ - BssidInfo.field.SpectrumMng = - (pMbss->CapabilityInfo & (1 << 8)) ? 1 : 0; - BssidInfo.field.Qos = (pMbss->CapabilityInfo & (1 << 9)) ? 1 : 0; - BssidInfo.field.APSD = (pMbss->CapabilityInfo & (1 << 11)) ? 1 : 0; - BssidInfo.field.RRM = (pMbss->CapabilityInfo & RRM_CAP_BIT) ? 1 : 0; - BssidInfo.field.DelayBlockAck = - (pMbss->CapabilityInfo & (1 << 14)) ? 1 : 0; - BssidInfo.field.ImmediateBA = - (pMbss->CapabilityInfo & (1 << 15)) ? 1 : 0; - - NeighborRepInfo.BssidInfo = BssidInfo.word; - NeighborRepInfo.RegulatoryClass = get_regulatory_class( - pAd, pMbss->wdev.channel, pMbss->wdev.PhyMode, &pMbss->wdev); - NeighborRepInfo.ChNum = pMbss->wdev.channel; - NeighborRepInfo.PhyType = CondensedPhyType; - - NdisCopyMemory(&init_table->NeighborRepInfo, &NeighborRepInfo, - sizeof(RRM_NEIGHBOR_REP_INFO)); -} -#endif - -INT BndStrg_TableInit(PRTMP_ADAPTER pAd, INT apidx) -{ - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; - PBND_STRG_CLI_TABLE table = NULL, init_table = NULL; - INT i; - UINT8 Band, Channel; - - if (pMbss) { - Band = WMODE_CAP_5G(pMbss->wdev.PhyMode) ? BAND_5G : BAND_24G; - Channel = pMbss->wdev.channel; - if (!Channel) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(),Invalid Channel:%d pMbss apidx:%d\n", - __func__, Channel, apidx)); - return BND_STRG_UNEXP; - } - - } else { - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error in %s(), pMbss is NULL!\n", - __func__)); - return BND_STRG_UNEXP; - } - - for (i = 0; i < DBDC_BAND_NUM; i++) { - table = P_BND_STRG_TABLE(i); - - if (!table->bInitialized && !init_table) { - init_table = table; - continue; - } - - if (table->bInitialized && (table->Channel == Channel)) - return BND_STRG_SUCCESS; - } - - if (init_table) { - NdisZeroMemory(init_table, sizeof(BND_STRG_CLI_TABLE)); - OS_NdisAllocateSpinLock(&init_table->Lock); - /* WPS_BandSteering Support */ - OS_NdisAllocateSpinLock(&init_table->WpsWhiteListLock); - OS_NdisAllocateSpinLock(&init_table->WhiteListLock); - OS_NdisAllocateSpinLock(&init_table->BlackListLock); - - init_table->DaemonPid = 0xffffffff; - init_table->priv = (VOID *)pAd; - init_table->Band = Band; - init_table->Channel = Channel; - init_table->bInitialized = TRUE; - /* As in init time wdev may not be populated need to move when ap up complete */ - /* moved to BndStrg_SetInfFlags() function. */ - /* -#ifdef DOT11K_RRM_SUPPORT - BndStrg_InsertNeighborRepIE(pAd, init_table); -#endif -*/ - } - return BND_STRG_SUCCESS; -} - -INT BndStrg_Release(PRTMP_ADAPTER pAd) -{ - INT ret_val = BND_STRG_SUCCESS; - INT apidx; - PBND_STRG_CLI_TABLE table = NULL; - BSS_STRUCT *pMbss = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (YLW("%s()\n"), __func__)); - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - table = Get_BndStrgTable(pAd, apidx); - - if (table) { - pMbss = &pAd->ApCfg.MBSSID[apidx]; - BndStrg_SetInfFlags(pAd, &pMbss->wdev, table, FALSE); - } - } - - if (table) - BndStrg_TableRelease(table); - - return ret_val; -} - -INT BndStrg_TableRelease(PBND_STRG_CLI_TABLE table) -{ - INT ret_val = BND_STRG_SUCCESS; - - if (table->bInitialized == FALSE) - return BND_STRG_NOT_INITIALIZED; - - OS_NdisFreeSpinLock(&table->Lock); - - NdisAcquireSpinLock(&table->WhiteListLock); - ClearBsList(&table->WhiteList); - NdisReleaseSpinLock(&table->WhiteListLock); - - NdisAcquireSpinLock(&table->BlackListLock); - ClearBsList(&table->BlackList); - NdisReleaseSpinLock(&table->BlackListLock); - - NdisAcquireSpinLock(&table->WpsWhiteListLock); - ClearWpsWhiteList(&table->WpsWhiteList); - NdisReleaseSpinLock(&table->WpsWhiteListLock); - - OS_NdisFreeSpinLock(&table->WpsWhiteListLock); - OS_NdisFreeSpinLock(&table->WhiteListLock); - OS_NdisFreeSpinLock(&table->BlackListLock); - table->bInitialized = FALSE; - - if (ret_val != BND_STRG_SUCCESS) { - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error in %s(), error code = %d!\n", - __func__, ret_val)); - } - return ret_val; -} - -INT BndStrg_InsertEntry(PBND_STRG_CLI_TABLE table, - struct bnd_msg_cli_add *cli_add, - PBND_STRG_CLI_ENTRY *entry_out) -{ - INT i; - UCHAR HashIdx; - PBND_STRG_CLI_ENTRY entry = NULL, this_entry = NULL; - INT ret_val = BND_STRG_SUCCESS; - - if (table->Size >= BND_STRG_MAX_TABLE_SIZE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s(): Table is full!\n", __func__)); - return BND_STRG_TABLE_FULL; - } - - NdisAcquireSpinLock(&table->Lock); - - for (i = 0; i < BND_STRG_MAX_TABLE_SIZE; i++) { - entry = &table->Entry[i]; - - /* pick up the first available vacancy*/ - if (entry->bValid == FALSE) { - NdisZeroMemory(entry, sizeof(BND_STRG_CLI_ENTRY)); - /* Fill Entry */ - RTMP_GetCurrentSystemTick(&entry->jiffies); - COPY_MAC_ADDR(entry->Addr, cli_add->Addr); - entry->TableIndex = cli_add->TableIndex; - entry->BndStrg_Sta_State = BNDSTRG_STA_INIT; - entry->bValid = TRUE; - break; - } - - entry = NULL; - } - - if (entry) { - /* add this MAC entry into HASH table */ - HashIdx = MAC_ADDR_HASH_INDEX(cli_add->Addr); - - if (table->Hash[HashIdx] == NULL) - table->Hash[HashIdx] = entry; - - else { - this_entry = table->Hash[HashIdx]; - - while (this_entry->pNext != NULL) - this_entry = this_entry->pNext; - - this_entry->pNext = entry; - } - - *entry_out = entry; - table->Size++; - } - - NdisReleaseSpinLock(&table->Lock); - return ret_val; -} - -INT BndStrg_DeleteEntry(PBND_STRG_CLI_TABLE table, PUCHAR pAddr, UINT32 Index) -{ - USHORT HashIdx; - PBND_STRG_CLI_ENTRY entry, pre_entry, this_entry; - INT ret_val = BND_STRG_SUCCESS; - - NdisAcquireSpinLock(&table->Lock); - - if (Index >= BND_STRG_MAX_TABLE_SIZE) { - if (pAddr == NULL) - return BND_STRG_INVALID_ARG; - - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - entry = table->Hash[HashIdx]; - - while (entry) { - if (MAC_ADDR_EQUAL(pAddr, entry->Addr)) { - /* this is the entry we're looking for */ - break; - } else - entry = entry->pNext; - } - - if (entry == NULL) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): Index=%u, %02x:%02x:%02x:%02x:%02x:%02x, Entry not found.\n", - __func__, Index, PRINT_MAC(pAddr))); - NdisReleaseSpinLock(&table->Lock); - return BND_STRG_INVALID_ARG; - } - } else { - entry = &table->Entry[Index]; - HashIdx = MAC_ADDR_HASH_INDEX(entry->Addr); - } - - if (entry->bValid) { - { - pre_entry = NULL; - this_entry = table->Hash[HashIdx]; - ASSERT(this_entry); - - if (this_entry != NULL) { - /* update Hash list*/ - do { - if (this_entry == entry) { - if (pre_entry == NULL) - table->Hash[HashIdx] = - entry->pNext; - else - pre_entry->pNext = - entry->pNext; - - break; - } - - pre_entry = this_entry; - this_entry = this_entry->pNext; - } while (this_entry); - } - /* not found !!!*/ - ASSERT(this_entry != NULL); - - NdisZeroMemory(entry->Addr, MAC_ADDR_LEN); - entry->pNext = NULL; - entry->bValid = FALSE; - table->Size--; - } - } else { - } - - NdisReleaseSpinLock(&table->Lock); - - return ret_val; -} - -PBND_STRG_CLI_ENTRY BndStrg_TableLookup(PBND_STRG_CLI_TABLE table, PUCHAR pAddr) -{ - ULONG HashIdx; - BND_STRG_CLI_ENTRY *entry = NULL; - - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - entry = table->Hash[HashIdx]; - - while (entry && entry->bValid) { - if (MAC_ADDR_EQUAL(entry->Addr, pAddr)) - break; - else - entry = entry->pNext; - } - - return entry; -} - -BOOLEAN BndStrg_CheckConnectionReq(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - PUCHAR pSrcAddr, - struct raw_rssi_info *rssi_info, - ULONG MsgType, - PEER_PROBE_REQ_PARAM *ProbeReqParam) -{ - UINT8 FrameType = MsgType; - CHAR Rssi[4] = { 0 }; - PBND_STRG_CLI_TABLE table = Get_BndStrgTable(pAd, wdev->func_idx); - BNDSTRG_MSG msg = { 0 }; - struct bnd_msg_cli_event *cli_event = &msg.data.cli_event; - CHAR i, rssi_max; - PBND_STRG_CLI_ENTRY entry = NULL; - - if (!pAd->ApCfg.BndStrgBssIdx[wdev->func_idx]) - return TRUE; - - if (!table || !table->bEnabled) - return TRUE; - - /* send response to white listed clients*/ - if (table->WhiteList.size > 0) { - PBS_LIST_ENTRY bs_whitelist_entry = NULL; - - bs_whitelist_entry = - FindBsListEntry(&table->WhiteList, pSrcAddr); - - if (bs_whitelist_entry) { - BND_STRG_PRINTQAMSG( - table, pSrcAddr, - ("BndStrg STA %02x:%02x:%02x:%02x:%02x:%02x whitelisted\n", - PRINT_MAC(pSrcAddr))); - return TRUE; - } - } - - Rssi[0] = rssi_info->raw_rssi[0] ? - ConvertToRssi(pAd, (rssi_info), RSSI_IDX_0) : - 0; - Rssi[1] = rssi_info->raw_rssi[1] ? - ConvertToRssi(pAd, (rssi_info), RSSI_IDX_1) : - 0; - Rssi[2] = rssi_info->raw_rssi[2] ? - ConvertToRssi(pAd, (rssi_info), RSSI_IDX_2) : - 0; - Rssi[3] = rssi_info->raw_rssi[3] ? - ConvertToRssi(pAd, (rssi_info), RSSI_IDX_3) : - 0; - -#ifdef DBDC_MODE - - if (pAd->CommonCfg.dbdc_mode) { - UCHAR band_idx = HcGetBandByWdev(wdev); - - if (band_idx == DBDC_BAND0) - rssi_max = pAd->dbdc_band0_rx_path; - else - rssi_max = pAd->dbdc_band1_rx_path; - } else -#endif - rssi_max = pAd->Antenna.field.RxPath; - - msg.Action = CLI_EVENT; - - if (WMODE_CAP_2G(wdev->PhyMode) && wdev->channel <= 14) { - cli_event->Band = BAND_24G; - } - - if (WMODE_CAP_5G(wdev->PhyMode) && wdev->channel > 14) - cli_event->Band = BAND_5G; - - cli_event->Channel = wdev->channel; - cli_event->FrameType = FrameType; - - if (FrameType == APMT2_PEER_PROBE_REQ) { - struct bnd_msg_cli_probe *cli_probe = - &cli_event->data.cli_probe; - - if (ProbeReqParam->IsHtSupport && WMODE_CAP_N(wdev->PhyMode)) - cli_probe->bAllowStaConnectInHt = TRUE; - if (ProbeReqParam->IsVhtSupport && WMODE_CAP_AC(wdev->PhyMode)) - cli_probe->bVHTCapable = TRUE; - - if (ProbeReqParam->IsFromIos) - cli_probe->bIosCapable = TRUE; - - cli_probe->Nss = GetNssFromHTCapRxMCSBitmask( - ProbeReqParam->RxMCSBitmask); - - memset(cli_probe->Rssi, 0x80, sizeof(cli_probe->Rssi)); - for (i = 0; i < rssi_max; i++) - cli_probe->Rssi[i] = Rssi[i]; - } else if (FrameType == APMT2_PEER_AUTH_REQ) { - struct bnd_msg_cli_auth *cli_auth = &cli_event->data.cli_auth; - - memset(cli_auth->Rssi, 0x80, sizeof(cli_auth->Rssi)); - for (i = 0; i < rssi_max; i++) - cli_auth->Rssi[i] = Rssi[i]; - } - COPY_MAC_ADDR(cli_event->Addr, pSrcAddr); - BndStrgSendMsg(pAd, &msg); - - /* check for backlist client, stop response for them */ - if (table->BlackList.size > 0) { - PBS_LIST_ENTRY bs_blacklist_entry = NULL; - - bs_blacklist_entry = - FindBsListEntry(&table->BlackList, pSrcAddr); - - if (bs_blacklist_entry) { - BND_STRG_PRINTQAMSG( - table, pSrcAddr, - ("BndStrg STA %02x:%02x:%02x:%02x:%02x:%02x blacklisted\n", - PRINT_MAC(pSrcAddr))); - return FALSE; - } - } - -#ifdef WSC_INCLUDED - /* WPS_BandSteering Support */ - { - PWSC_CTRL pWscControl; - - pWscControl = &pAd->ApCfg.MBSSID[wdev->func_idx].WscControl; - - if (FrameType == APMT2_PEER_PROBE_REQ) { - if (pWscControl->bWscTrigger) { - if (ProbeReqParam->bWpsCapable) { - NdisAcquireSpinLock( - &table->WpsWhiteListLock); - AddWpsWhiteList(&table->WpsWhiteList, - pSrcAddr); - NdisReleaseSpinLock( - &table->WpsWhiteListLock); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("channel %u: Probe req: STA %02x:%02x:%02x:%02x:%02x:%02x wps whitelisted\n", - table->Channel, - PRINT_MAC(pSrcAddr))); - BND_STRG_PRINTQAMSG( - table, pSrcAddr, - ("STA %02x:%02x:%02x:%02x:%02x:%02x channel %u added in WPS Whitelist\n", - PRINT_MAC(pSrcAddr), - table->Channel)); - } - return TRUE; - } - } - - if (FrameType == APMT2_PEER_AUTH_REQ) { - if (pWscControl->bWscTrigger) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("channel %u: Auth req: STA %02x:%02x:%02x:%02x:%02x:%02x wps whitelisted\n", - table->Channel, PRINT_MAC(pSrcAddr))); - BND_STRG_PRINTQAMSG( - table, pSrcAddr, - ("STA %02x:%02x:%02x:%02x:%02x:%02x channel %u allowed Auth as per WPS Whitelist\n", - PRINT_MAC(pSrcAddr), table->Channel)); - return TRUE; - } - } - } -#endif /* WSC_INCLUDED */ - - if (table->BndStrgMode == POST_CONNECTION_STEERING) { - return TRUE; - } - - entry = BndStrg_TableLookup(table, pSrcAddr); - - if (entry && (FrameType == APMT2_PEER_AUTH_REQ) && - (entry->BndStrg_Sta_State == BNDSTRG_STA_ASSOC)) { - BND_STRG_PRINTQAMSG( - table, pSrcAddr, - (RED("%s: (ch%d) check %s request failed. client's (%02x:%02x:%02x:%02x:%02x:%02x) request is ignored. Client disconnected without DeAuth.!!Waiting for bndstrg result!!\n"), - (table->Band == BAND_24G ? "2.4G" : "5G"), - table->Channel, "Auth", PRINT_MAC(pSrcAddr))); - return FALSE; - } - - if (entry) { -#ifdef BND_STRG_QA - BND_STRG_PRINTQAMSG( - table, pSrcAddr, - (GRN("%s: (ch%d) check %s request ok. client's (%02x:%02x:%02x:%02x:%02x:%02x) request is accepted.\n"), - (table->Band == BAND_24G ? "2.4G" : "5G"), - table->Channel, - FrameType == 0 ? ("probe") : - (FrameType == 3 ? "auth" : "unknow"), - PRINT_MAC(pSrcAddr))); -#endif - return TRUE; - } else { -#ifdef BND_STRG_QA - BND_STRG_PRINTQAMSG( - table, pSrcAddr, - (RED("%s: (ch%d) check %s request failed. client's (%02x:%02x:%02x:%02x:%02x:%02x) request is ignored.\n"), - (table->Band == BAND_24G ? "2.4G" : "5G"), - table->Channel, - FrameType == 0 ? ("probe") : - (FrameType == 3 ? "auth" : "unknow"), - PRINT_MAC(pSrcAddr))); -#endif - return FALSE; - } - return TRUE; -} - -INT BndStrg_Tbl_Enable(PBND_STRG_CLI_TABLE table, BOOLEAN enable, CHAR *IfName) -{ - BNDSTRG_MSG msg = { 0 }; - PRTMP_ADAPTER pAd = NULL; - struct bnd_msg_onoff *onoff = &msg.data.onoff; - - if (table == NULL) - return BND_STRG_TABLE_IS_NULL; - - if (table->bInitialized == FALSE) - return BND_STRG_NOT_INITIALIZED; - - if (!(table->bEnabled ^ enable)) { - /* Already enabled/disabled */ - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, /* TRACE */ - (GRN("%s(): Band steering is already %s.\n"), __func__, - (enable ? "enabled" : "disabled"))); - return BND_STRG_SUCCESS; - } - - if (enable) { - table->bEnabled = TRUE; - strncpy(table->ucIfName, IfName, - sizeof(table->ucIfName) - 1); /* decide it by daemon */ - } else - table->bEnabled = FALSE; - - pAd = (PRTMP_ADAPTER)table->priv; - msg.Action = BNDSTRG_ONOFF; - onoff->OnOff = table->bEnabled; - onoff->Band = table->Band; - onoff->Channel = table->Channel; - strncpy(onoff->ucIfName, IfName, sizeof(onoff->ucIfName) - 1); - RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, - OID_BNDSTRG_MSG, NULL, (UCHAR *)&msg, - sizeof(msg)); - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (GRN("%s(): Band steering %s running.\n"), __func__, - (enable ? "start" : "stop"))); - return BND_STRG_SUCCESS; -} - -INT BndStrgSendMsg(PRTMP_ADAPTER pAd, BNDSTRG_MSG *msg) -{ - return RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, - OID_BNDSTRG_MSG, NULL, (UCHAR *)msg, - sizeof(BNDSTRG_MSG)); -} - -INT BndStrg_SetInfFlags(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - PBND_STRG_CLI_TABLE table, BOOLEAN bInfReady) -{ - INT ret_val = BND_STRG_SUCCESS; - UINT8 Band; - BNDSTRG_MSG msg = { 0 }; - struct bnd_msg_inf_status_rsp *inf_status_rsp = - &msg.data.inf_status_rsp; - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev is NULL!\n", __func__)); - return BND_STRG_UNEXP; - } - - if (!wdev->if_dev) { - /* inf down up issue*/ - wdev->bInfReady = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): if_dev is NULL!\n", __func__)); - return BND_STRG_UNEXP; - } - - if (!IS_VALID_MAC(wdev->bssid)) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Invalid bssid(%02x:%02x:%02x:%02x:%02x:%02x)!\n", - __func__, PRINT_MAC(wdev->bssid))); - return BND_STRG_UNEXP; - } - - Band = WMODE_CAP_5G(wdev->PhyMode) ? BAND_5G : BAND_24G; - - if (!(wdev->bInfReady ^ bInfReady)) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (GRN("%s(): %s [%d] Inf %s Band steering is already %s.\n"), - __func__, (IS_5G_BAND(Band) ? "5G" : "2G"), - wdev->channel, wdev->if_dev->name, - (bInfReady ? "up" : "down"))); - return BND_STRG_SUCCESS; - } - - if (bInfReady) { /* Exec. by each interface up */ - table->uIdx = wdev->func_idx; - /* table->Channel = wdev->channel; */ - - if (WMODE_CAP_5G(wdev->PhyMode) && WMODE_CAP_AC(wdev->PhyMode)) - table->bVHTCapable = TRUE; - else - table->bVHTCapable = FALSE; - - table->ActiveCount++; -/* Add Neighbor report*/ -#ifdef DOT11K_RRM_SUPPORT - BndStrg_InsertNeighborRepIE(pAd, table); -#endif - } else { /* Exec. by each interface down */ - if (table->ActiveCount > 0) - table->ActiveCount--; - } - - wdev->bInfReady = bInfReady; - - table->nss = wlan_config_get_tx_stream(wdev); - msg.Action = INF_STATUS_RSP; - - inf_status_rsp->band = Band; - inf_status_rsp->bInfReady = bInfReady; - inf_status_rsp->Channel = wdev->channel; - inf_status_rsp->bVHTCapable = table->bVHTCapable; - inf_status_rsp->nss = table->nss; - inf_status_rsp->table_src_addr = (ULONG)table; - inf_status_rsp->table_size = BND_STRG_MAX_TABLE_SIZE; - strncpy(inf_status_rsp->ucIfName, wdev->if_dev->name, - sizeof(inf_status_rsp->ucIfName)); -#ifdef VENDOR_FEATURE5_SUPPORT - inf_status_rsp->nvram_support = 1; -#else - inf_status_rsp->nvram_support = 0; -#endif - BndStrgSendMsg(pAd, &msg); - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (BLUE("%s(): BSS(%02X:%02X:%02X:%02X:%02X:%02X)") - BLUE(" set %s Inf %s %s.\n"), - __func__, PRINT_MAC(wdev->bssid), - IS_5G_BAND(Band) ? "5G" : "2G", wdev->if_dev->name, - bInfReady ? "ready" : "not ready")); - - if (table->bInfReady ^ bInfReady) { - if (bInfReady) { - table->bInfReady = TRUE; - table->Band |= Band; - } else { - if (!bInfReady && (table->ActiveCount == 0)) { - table->bInfReady = FALSE; - - if (table->bEnabled) - BndStrg_Tbl_Enable(table, FALSE, - table->ucIfName); - } - } - } - - return ret_val; -} - -void BndStrg_UpdateEntry(PRTMP_ADAPTER pAd, MAC_TABLE_ENTRY *pEntry, - IE_LISTS *ie_list, BOOLEAN bConnStatus) -{ - struct wifi_dev *wdev; - BNDSTRG_MSG msg = { 0 }; - struct bnd_msg_cli_event *cli_event = &msg.data.cli_event; - UINT8 Nss = 1; - UINT32 RxMCSBitmask = 0; - PBND_STRG_CLI_ENTRY entry = NULL; - PBND_STRG_CLI_TABLE table = NULL; - - if (!pEntry || !pEntry->wdev || - (pAd->ApCfg.BndStrgBssIdx[pEntry->func_tb_idx] != 1)) - return; - - table = Get_BndStrgTable(pAd, pEntry->wdev->func_idx); - - if (!table) - return; - - wdev = pEntry->wdev; - - if (WMODE_CAP_5G(wdev->PhyMode)) - cli_event->Band = BAND_5G; - else - cli_event->Band = BAND_24G; - - cli_event->Channel = wdev->channel; - COPY_MAC_ADDR(cli_event->Addr, pEntry->Addr); - msg.Action = CLI_EVENT; - - if (bConnStatus) { - struct bnd_msg_cli_assoc *cli_assoc = - &cli_event->data.cli_assoc; - - cli_event->FrameType = APMT2_PEER_ASSOC_REQ; - if (ie_list->ht_cap_len > 0) { - cli_assoc->bAllowStaConnectInHt = TRUE; - RxMCSBitmask = - *(UINT32 *)(ie_list->HTCapability.MCSSet); - Nss = GetNssFromHTCapRxMCSBitmask(RxMCSBitmask); - } - if (ie_list->vht_cap_len > 0) - cli_assoc->bVHTCapable = TRUE; - cli_assoc->Nss = Nss; -#ifdef WSC_INCLUDED - /* WPS_BandSteering Support */ - cli_assoc->bWpsAssoc = ie_list->bWscCapable; -#endif /* WSC_INCLUDED */ -#ifdef CONFIG_DOT11V_WNM - cli_assoc->BTMSupport = pEntry->BssTransitionManmtSupport; -#endif - } else { - cli_event->FrameType = APMT2_PEER_DISASSOC_REQ; - } - - BndStrgSendMsg(pAd, &msg); - entry = BndStrg_TableLookup(table, pEntry->Addr); - - if (entry) { - if (bConnStatus) - entry->BndStrg_Sta_State = BNDSTRG_STA_ASSOC; - else - entry->BndStrg_Sta_State = BNDSTRG_STA_DISASSOC; - entry->bConnStatus = bConnStatus; - } - return; -} - -INT Set_BndStrg_BssIdx(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - UINT8 i; - RTMP_STRING *macptr; - - for (i = 0, macptr = rstrtok(arg, ";"); macptr; - macptr = rstrtok(NULL, ";"), i++) { - pAd->ApCfg.BndStrgBssIdx[i] = simple_strtoul(macptr, 0, 10); - } - - return TRUE; -} - -#ifdef VENDOR_FEATURE5_SUPPORT -INT Show_BndStrg_NvramTable(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - PBND_STRG_CLI_TABLE table; - POS_COOKIE pObj; - UCHAR ifIndex; - PBNDSTRG_NVRAM_CLIENT table_nvram_client; - int i; - char PhyMode[10]; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - ifIndex = pObj->ioctl_if; - table = Get_BndStrgTable(pAd, ifIndex); - - if (!table) - return FALSE; - - printk("%s bndstrg_nvram_client_count %d\n", __func__, - table->bndstrg_nvram_client_count); - printk("Addr Band\tPhymde\t\t\t\tNSS\tManipulable\n"); - - for (i = 0; i < table->bndstrg_nvram_client_count; i++) { - table_nvram_client = &table->nvram_entry[i]; - memset(PhyMode, 0x00, 10); - - if (table_nvram_client->PhyMode == fPhyMode_Legacy) - sprintf(PhyMode, "%s", "Legacy"); - else if (table_nvram_client->PhyMode == fPhyMode_HT) - sprintf(PhyMode, "%s", "11n"); - else if (table_nvram_client->PhyMode == fPhyMode_VHT) - sprintf(PhyMode, "%s", "11ac"); - - printk("%02x:%02x:%02x:%02x:%02x:%02x \t%-3s\t%-20s\t\t%d\t%s\n", - PRINT_MAC(table_nvram_client->Addr), - (IS_5G_BAND(table_nvram_client->Band) ? "5G" : "2G"), - PhyMode, table_nvram_client->Nss, - (table_nvram_client->Manipulable ? "YES" : "NO")); - } - return TRUE; -} - -static BOOLEAN BndStrg_NvramTableLookup(PBND_STRG_CLI_TABLE table, - unsigned char *pAddr) -{ - int i; - - for (i = 0; i < NVRAM_TABLE_SIZE; i++) { - if (MAC_ADDR_EQUAL(table->nvram_entry[i].Addr, pAddr)) - return TRUE; - } - return FALSE; -} - -static BOOLEAN BndStrg_NvramInsertEntry(PBND_STRG_CLI_TABLE table, - PBNDSTRG_NVRAM_CLIENT msg) -{ - PBNDSTRG_NVRAM_CLIENT nvram_entry = NULL; - int i = 0; - - if (!BndStrg_NvramTableLookup(table, msg->Addr)) { - if (table->bndstrg_nvram_client_count < NVRAM_TABLE_SIZE) { - nvram_entry = - &table->nvram_entry - [table->bndstrg_nvram_client_count]; - memset(nvram_entry, 0, sizeof(BNDSTRG_NVRAM_CLIENT)); - memcpy(nvram_entry->Addr, msg->Addr, MAC_ADDR_LEN); - table->bndstrg_nvram_client_count++; - } - } else { - for (i = 0; i < table->bndstrg_nvram_client_count; i++) { - if (MAC_ADDR_EQUAL(table->nvram_entry[i].Addr, - msg->Addr)) - break; - } - - nvram_entry = &table->nvram_entry[i]; - } - - if (nvram_entry) { - nvram_entry->Band = msg->Band; - nvram_entry->Nss = msg->Nss; - nvram_entry->Manipulable = msg->Manipulable; - nvram_entry->PhyMode = msg->PhyMode; - } else { - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: nvram_entry is NULL!\n", __func__)); - return FALSE; - } - - return TRUE; -} - -void BndStrg_SetNvram(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - INT apidx) -{ - BNDSTRG_NVRAM_CLIENT bsdmsg; - PBND_STRG_CLI_TABLE table = NULL; - BNDSTRG_MSG msg = { 0 }; - struct bnd_msg_nvram_entry_update *entry_update = - &msg.data.entry_update; - INT Status; - - table = Get_BndStrgTable(pAd, apidx); - - if (!table || (table->bInitialized == FALSE) || - (wrq->u.data.length != sizeof(BNDSTRG_NVRAM_CLIENT))) - return; - - Status = copy_from_user(&bsdmsg, wrq->u.data.pointer, - wrq->u.data.length); - - if ((BndStrg_NvramInsertEntry(table, &bsdmsg))) { - msg.Action = NVRAM_UPDATE; - memcpy(entry_update->nvram_entry.Addr, bsdmsg.Addr, - MAC_ADDR_LEN); - memcpy(entry_update->Addr, bsdmsg.Addr, MAC_ADDR_LEN); - entry_update->nvram_entry.Band = bsdmsg.Band; - entry_update->nvram_entry.Manipulable = bsdmsg.Manipulable; - entry_update->nvram_entry.Nss = bsdmsg.Nss; - entry_update->nvram_entry.PhyMode = bsdmsg.PhyMode; - BndStrgSendMsg(pAd, &msg); - } else - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: NVRAM table full\n", __func__)); -} - -void BndStrg_GetNvram(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - INT apidx) -{ - PBND_STRG_CLI_TABLE table = NULL; - BNDSTRG_NVRAM_LIST *nvram_list = NULL; - PBNDSTRG_NVRAM_CLIENT nvram_client; - PBNDSTRG_NVRAM_CLIENT table_nvram_client; - int i; - - table = Get_BndStrgTable(pAd, apidx); - - if (!table || (table->bInitialized == FALSE)) - return; - - os_alloc_mem(pAd, (UCHAR **)&nvram_list, sizeof(BNDSTRG_NVRAM_LIST)); - - if (nvram_list == NULL) - return; - - NdisZeroMemory(nvram_list, sizeof(BNDSTRG_NVRAM_LIST)); - nvram_list->Num = table->bndstrg_nvram_client_count; - - for (i = 0; i < nvram_list->Num; i++) { - table_nvram_client = &table->nvram_entry[i]; - nvram_client = &nvram_list->nvram_entry[i]; - memcpy(nvram_client->Addr, table_nvram_client->Addr, - MAC_ADDR_LEN); - nvram_client->Band = table_nvram_client->Band; - nvram_client->Manipulable = table_nvram_client->Manipulable; - nvram_client->PhyMode = table_nvram_client->PhyMode; - nvram_client->Nss = table_nvram_client->Nss; - } - - wrq->u.data.length = sizeof(BNDSTRG_NVRAM_LIST); - copy_to_user(wrq->u.data.pointer, nvram_list, wrq->u.data.length); - - if (nvram_list != NULL) - os_free_mem(nvram_list); - - return; -} -#endif /* VENDOR_FEATURE5_SUPPORT */ - -UINT8 GetNssFromHTCapRxMCSBitmask(UINT32 RxMCSBitmask) -{ - UCHAR RxMCS[4]; - UINT8 nss; - *((UINT32 *)RxMCS) = RxMCSBitmask; - - if (RxMCS[3] != 0) - nss = 4; - else if (RxMCS[2] != 0) - nss = 3; - else if (RxMCS[1] != 0) - nss = 2; - else - nss = 1; - - return nss; -} - -VOID BndStrg_CLIStatusRsp(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table, - BNDSTRG_MSG *msg) -{ - if (table->bInitialized == TRUE) { - BNDSTRG_MSG new_msg = { 0 }; - struct bnd_msg_cli_status_rsp *cli_status_rsp = - &new_msg.data.cli_status_rsp; - MAC_TABLE_ENTRY *pEntry = NULL; - PBND_STRG_CLI_ENTRY entry = NULL; - int i = 0; - /* Send to daemon */ - new_msg.Action = CLI_STATUS_RSP; - memset(cli_status_rsp, 0x00, - sizeof(struct bnd_msg_cli_status_rsp)); - - for (i = 0; i < BND_STRG_MAX_TABLE_SIZE; i++) { - entry = &table->Entry[i]; - - /* pick up the first available vacancy*/ - if (!entry || entry->bValid == FALSE || - !entry->bConnStatus) - continue; - - cli_status_rsp->TableIndex = entry->TableIndex; - pEntry = MacTableLookup(pAd, entry->Addr); - - if (pEntry && IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC) && - (pEntry->pMbss != NULL)) { - INT32 avgrssi = 0; - /* get information */ - /* RSSI */ - /* avgrssi = RTMPAvgRssi(pAd, &pEntry->RssiSample); */ - { -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - struct _RTMP_CHIP_CAP *cap = - hc_get_chip_cap(pAd->hdev_ctrl); - - if (cap->fgRateAdaptFWOffload == TRUE && - (pEntry->bAutoTxRateSwitch == - TRUE)) { - ULONG DataRate = 0; - ULONG DataRate_r = 0; - UCHAR phy_mode, rate, bw, sgi, - stbc; - UCHAR phy_mode_r, rate_r, bw_r, - sgi_r, stbc_r; -#ifdef DOT11_VHT_AC - UCHAR vht_nss; - UCHAR vht_nss_r; -#endif - UINT32 RawData; - UINT32 RawData_r; - UINT32 lastTxRate = - pEntry->LastTxRate; - UINT32 lastRxRate = - pEntry->LastRxRate; - - if (pEntry->bAutoTxRateSwitch == - TRUE) { - EXT_EVENT_TX_STATISTIC_RESULT_T - rTxStatResult; - HTTRANSMIT_SETTING - LastTxRate; - HTTRANSMIT_SETTING - LastRxRate; - - MtCmdGetTxStatistic( - pAd, - GET_TX_STAT_ENTRY_TX_RATE, - 0 /*Don't Care*/, - pEntry->wcid, - &rTxStatResult); - LastTxRate.field.MODE = - rTxStatResult - .rEntryTxRate - .MODE; - LastTxRate.field.BW = - rTxStatResult - .rEntryTxRate - .BW; - LastTxRate.field.ldpc = - rTxStatResult.rEntryTxRate - .ldpc ? - 1 : - 0; - LastTxRate.field - .ShortGI = - rTxStatResult.rEntryTxRate - .ShortGI ? - 1 : - 0; - LastTxRate.field.STBC = - rTxStatResult - .rEntryTxRate - .STBC; - - if (LastTxRate.field - .MODE == - MODE_VHT) - LastTxRate.field - .MCS = - (((rTxStatResult - .rEntryTxRate - .VhtNss - - 1) & - 0x3) - << 4) + - rTxStatResult - .rEntryTxRate - .MCS; - else if (LastTxRate - .field - .MODE == - MODE_OFDM) - LastTxRate.field - .MCS = - getLegacyOFDMMCSIndex( - rTxStatResult - .rEntryTxRate - .MCS) & - 0x0000003F; - else - LastTxRate.field - .MCS = - rTxStatResult - .rEntryTxRate - .MCS; - - lastTxRate = - (UINT32)(LastTxRate - .word); - LastRxRate - .word = (USHORT) - lastRxRate; - RawData = lastTxRate; - phy_mode = (RawData >> - 13) & - 0x7; - rate = RawData & 0x3F; - bw = (RawData >> 7) & - 0x3; - sgi = (RawData >> 9) & - 0x1; - stbc = ((RawData >> - 10) & - 0x1); - /* ---- */ - RawData_r = lastRxRate; - phy_mode_r = - (RawData_r >> - 13) & - 0x7; - rate_r = RawData_r & - 0x3F; - bw_r = (RawData_r >> - 7) & - 0x3; - sgi_r = (RawData_r >> - 9) & - 0x1; - stbc_r = ((RawData_r >> - 10) & - 0x1); -#ifdef DOT11_VHT_AC - - if (phy_mode == - MODE_VHT) { - vht_nss = - ((rate & - (0x3 - << 4)) >> - 4) + - 1; - rate = rate & - 0xF; - /* snprintf(tmp_str,temp_str_len,"%dS-M%d/",vht_nss, rate); */ - } else -#endif /* DOT11_VHT_AC */ - { - /* snprintf(tmp_str,temp_str_len,"%d/",rate); */ - } - -#ifdef DOT11_VHT_AC - - if (phy_mode_r == - MODE_VHT) { - vht_nss_r = - ((rate_r & - (0x3 - << 4)) >> - 4) + - 1; - rate_r = - rate_r & - 0xF; - /* snprintf(tmp_str+strlen(tmp_str),temp_str_len-strlen(tmp_str),"%dS-M%d",vht_nss_r, rate_r); */ - } else -#endif /* DOT11_VHT_AC */ -#if DOT11_N_SUPPORT - if (phy_mode_r >= - MODE_HTMIX) { - /* snprintf(tmp_str+strlen(tmp_str),temp_str_len-strlen(tmp_str),"%d",rate_r); */ - } else -#endif - if (phy_mode_r == - MODE_OFDM) { - if (rate_r == - TMI_TX_RATE_OFDM_6M) - LastRxRate - .field - .MCS = - 0; - else if (rate_r == - TMI_TX_RATE_OFDM_9M) - LastRxRate - .field - .MCS = - 1; - else if (rate_r == - TMI_TX_RATE_OFDM_12M) - LastRxRate - .field - .MCS = - 2; - else if (rate_r == - TMI_TX_RATE_OFDM_18M) - LastRxRate - .field - .MCS = - 3; - else if (rate_r == - TMI_TX_RATE_OFDM_24M) - LastRxRate - .field - .MCS = - 4; - else if (rate_r == - TMI_TX_RATE_OFDM_36M) - LastRxRate - .field - .MCS = - 5; - else if (rate_r == - TMI_TX_RATE_OFDM_48M) - LastRxRate - .field - .MCS = - 6; - else if (rate_r == - TMI_TX_RATE_OFDM_54M) - LastRxRate - .field - .MCS = - 7; - else - LastRxRate - .field - .MCS = - 0; - - /* snprintf(tmp_str+strlen(tmp_str),temp_str_len-strlen(tmp_str),"%d",LastRxRate.field.MCS); */ - } else if (phy_mode_r == - MODE_CCK) { - if (rate_r == - TMI_TX_RATE_CCK_1M_LP) - LastRxRate - .field - .MCS = - 0; - else if (rate_r == - TMI_TX_RATE_CCK_2M_LP) - LastRxRate - .field - .MCS = - 1; - else if (rate_r == - TMI_TX_RATE_CCK_5M_LP) - LastRxRate - .field - .MCS = - 2; - else if (rate_r == - TMI_TX_RATE_CCK_11M_LP) - LastRxRate - .field - .MCS = - 3; - else if (rate_r == - TMI_TX_RATE_CCK_2M_SP) - LastRxRate - .field - .MCS = - 1; - else if (rate_r == - TMI_TX_RATE_CCK_5M_SP) - LastRxRate - .field - .MCS = - 2; - else if (rate_r == - TMI_TX_RATE_CCK_11M_SP) - LastRxRate - .field - .MCS = - 3; - else - LastRxRate - .field - .MCS = - 0; - - /* snprintf(tmp_str+strlen(tmp_str),temp_str_len-strlen(tmp_str),"%d",LastRxRate.field.MCS); */ - } - - getRate(LastTxRate, - &DataRate); - getRate(LastRxRate, - &DataRate_r); - cli_status_rsp - ->data_tx_Rate = - DataRate; - cli_status_rsp - ->data_rx_Rate = - DataRate_r; - cli_status_rsp - ->data_tx_Phymode = - phy_mode; - cli_status_rsp - ->data_rx_Phymode = - phy_mode_r; - - if (LastTxRate.field - .MODE >= - MODE_VHT) { - cli_status_rsp - ->data_tx_mcs = - LastTxRate - .field - .MCS & - 0xf; - cli_status_rsp - ->data_tx_ant = - (LastTxRate - .field - .MCS >> - 4) + - 1; - } else if (LastTxRate - .field - .MODE >= - MODE_HTMIX) { - cli_status_rsp - ->data_tx_mcs = - LastTxRate - .field - .MCS; - cli_status_rsp - ->data_tx_ant = - (LastTxRate - .field - .MCS >> - 3) + - 1; - - if (cli_status_rsp - ->data_tx_mcs > - 7) - cli_status_rsp - ->data_tx_mcs %= - 8; - } else if (LastTxRate - .field - .MODE >= - MODE_OFDM) { - cli_status_rsp - ->data_tx_mcs = - LastTxRate - .field - .MCS; - cli_status_rsp - ->data_tx_ant = - 1; - } else if (LastTxRate - .field - .MODE >= - MODE_CCK) { - cli_status_rsp - ->data_tx_mcs = - LastTxRate - .field - .MCS; - cli_status_rsp - ->data_tx_ant = - 1; - } - - if (LastRxRate.field - .MODE >= - MODE_VHT) { - cli_status_rsp - ->data_rx_mcs = - LastRxRate - .field - .MCS & - 0xf; - cli_status_rsp - ->data_rx_ant = - (LastRxRate - .field - .MCS >> - 4) + - 1; - } else if (LastRxRate - .field - .MODE >= - MODE_HTMIX) { - cli_status_rsp - ->data_rx_mcs = - LastRxRate - .field - .MCS; - cli_status_rsp - ->data_rx_ant = - (LastRxRate - .field - .MCS >> - 3) + - 1; - - if (cli_status_rsp - ->data_rx_mcs > - 7) - cli_status_rsp - ->data_rx_mcs %= - 8; - } else if (LastRxRate - .field - .MODE >= - MODE_OFDM) { - cli_status_rsp - ->data_rx_mcs = - LastRxRate - .field - .MCS; - cli_status_rsp - ->data_rx_ant = - 1; - } else if (LastRxRate - .field - .MODE >= - MODE_CCK) { - cli_status_rsp - ->data_rx_mcs = - LastRxRate - .field - .MCS; - cli_status_rsp - ->data_rx_ant = - 1; - } - - cli_status_rsp - ->data_tx_bw = - LastTxRate.field - .BW; - cli_status_rsp - ->data_rx_bw = - LastRxRate.field - .BW; - cli_status_rsp - ->data_tx_sgi = - LastTxRate.field - .ShortGI; - cli_status_rsp - ->data_rx_sgi = - LastRxRate.field - .ShortGI; - cli_status_rsp - ->data_tx_stbc = - LastTxRate.field - .STBC; - cli_status_rsp - ->data_rx_stbc = - LastRxRate.field - .STBC; - cli_status_rsp - ->data_tx_packets = - pEntry->TxPackets - .QuadPart; - cli_status_rsp - ->data_rx_packets = - pEntry->RxPackets - .QuadPart; - } - } else -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - { - ULONG DataRate = 0; - ULONG DataRate_r = 0; - UINT32 lastRxRate = - pEntry->LastRxRate; - HTTRANSMIT_SETTING LastRxRate; - UCHAR phy_mode_r, rate_r; - - LastRxRate.word = - (USHORT)lastRxRate; - phy_mode_r = - LastRxRate.field.MODE; - rate_r = LastRxRate.word & 0x3F; - - if (phy_mode_r == MODE_OFDM) { - if (rate_r == - TMI_TX_RATE_OFDM_6M) - LastRxRate.field - .MCS = - 0; - else if (rate_r == - TMI_TX_RATE_OFDM_9M) - LastRxRate.field - .MCS = - 1; - else if (rate_r == - TMI_TX_RATE_OFDM_12M) - LastRxRate.field - .MCS = - 2; - else if (rate_r == - TMI_TX_RATE_OFDM_18M) - LastRxRate.field - .MCS = - 3; - else if (rate_r == - TMI_TX_RATE_OFDM_24M) - LastRxRate.field - .MCS = - 4; - else if (rate_r == - TMI_TX_RATE_OFDM_36M) - LastRxRate.field - .MCS = - 5; - else if (rate_r == - TMI_TX_RATE_OFDM_48M) - LastRxRate.field - .MCS = - 6; - else if (rate_r == - TMI_TX_RATE_OFDM_54M) - LastRxRate.field - .MCS = - 7; - else - LastRxRate.field - .MCS = - 0; - } else if (phy_mode_r == - MODE_CCK) { - if (rate_r == - TMI_TX_RATE_CCK_1M_LP) - LastRxRate.field - .MCS = - 0; - else if (rate_r == - TMI_TX_RATE_CCK_2M_LP) - LastRxRate.field - .MCS = - 1; - else if (rate_r == - TMI_TX_RATE_CCK_5M_LP) - LastRxRate.field - .MCS = - 2; - else if (rate_r == - TMI_TX_RATE_CCK_11M_LP) - LastRxRate.field - .MCS = - 3; - else if (rate_r == - TMI_TX_RATE_CCK_2M_SP) - LastRxRate.field - .MCS = - 1; - else if (rate_r == - TMI_TX_RATE_CCK_5M_SP) - LastRxRate.field - .MCS = - 2; - else if (rate_r == - TMI_TX_RATE_CCK_11M_SP) - LastRxRate.field - .MCS = - 3; - else - LastRxRate.field - .MCS = - 0; - } - - getRate(pEntry->HTPhyMode, - &DataRate); - getRate(LastRxRate, - &DataRate_r); - cli_status_rsp->data_tx_Rate = - DataRate; - cli_status_rsp->data_rx_Rate = - DataRate_r; - cli_status_rsp->data_tx_Phymode = - pEntry->HTPhyMode.field - .MODE; - cli_status_rsp->data_rx_Phymode = - 0; - - if (pEntry->HTPhyMode.field - .MODE >= MODE_VHT) { - cli_status_rsp - ->data_tx_mcs = - (pEntry->HTPhyMode - .field - .MCS & - 0xf); - cli_status_rsp - ->data_tx_ant = - (pEntry->HTPhyMode - .field - .MCS >> - 4) + - 1; - } else if (pEntry->HTPhyMode - .field.MODE >= - MODE_HTMIX) { - cli_status_rsp - ->data_tx_mcs = - pEntry->HTPhyMode - .field - .MCS; - cli_status_rsp - ->data_tx_ant = - (pEntry->HTPhyMode - .field - .MCS >> - 3) + - 1; - - if (cli_status_rsp - ->data_tx_mcs > - 7) - cli_status_rsp - ->data_tx_mcs %= - 8; - } else if (pEntry->HTPhyMode - .field.MODE >= - MODE_OFDM) { - cli_status_rsp - ->data_tx_mcs = - pEntry->HTPhyMode - .field - .MCS; - cli_status_rsp - ->data_tx_ant = - 1; - } else if (pEntry->HTPhyMode - .field.MODE >= - MODE_CCK) { - cli_status_rsp - ->data_tx_mcs = - pEntry->HTPhyMode - .field - .MCS; - cli_status_rsp - ->data_tx_ant = - 1; - } - - if (LastRxRate.field.MODE >= - MODE_VHT) { - cli_status_rsp - ->data_rx_mcs = - LastRxRate.field - .MCS & - 0xf; - cli_status_rsp - ->data_rx_ant = - (LastRxRate - .field - .MCS >> - 4) + - 1; - } else if (LastRxRate.field - .MODE >= - MODE_HTMIX) { - cli_status_rsp - ->data_rx_mcs = - LastRxRate.field - .MCS; - cli_status_rsp - ->data_rx_ant = - (LastRxRate - .field - .MCS >> - 3) + - 1; - - if (cli_status_rsp - ->data_rx_mcs > - 7) - cli_status_rsp - ->data_rx_mcs %= - 8; - } else if (LastRxRate.field - .MODE >= - MODE_OFDM) { - cli_status_rsp - ->data_rx_mcs = - LastRxRate.field - .MCS; - cli_status_rsp - ->data_rx_ant = - 1; - } else if (LastRxRate.field - .MODE >= - MODE_CCK) { - cli_status_rsp - ->data_rx_mcs = - LastRxRate.field - .MCS; - cli_status_rsp - ->data_rx_ant = - 1; - } - - cli_status_rsp->data_tx_bw = - pEntry->HTPhyMode.field - .BW; - cli_status_rsp->data_rx_bw = - LastRxRate.field.BW; - cli_status_rsp->data_tx_sgi = - pEntry->HTPhyMode.field - .ShortGI; - cli_status_rsp->data_rx_sgi = - LastRxRate.field.ShortGI; - cli_status_rsp->data_tx_stbc = - pEntry->HTPhyMode.field - .STBC; - cli_status_rsp->data_rx_stbc = - LastRxRate.field.STBC; - cli_status_rsp->data_tx_packets = - pEntry->TxPackets - .QuadPart; - cli_status_rsp->data_rx_packets = - pEntry->RxPackets - .QuadPart; - } - } - /* Calculate Avg data RSSI */ - { - INT rssi_tmp = 0, i = 0; - UINT32 rx_stream; - - if (pAd->CommonCfg.dbdc_mode) - rx_stream = 2; - else - rx_stream = pAd->Antenna.field - .RxPath; - - for (i = 0; i < rx_stream; i++) - rssi_tmp += pEntry->RssiSample - .AvgRssi[i]; - - avgrssi = (CHAR)(rssi_tmp / rx_stream); - } - cli_status_rsp->data_Rssi = (char)avgrssi; - /* cli_status_rsp->data_tx_TP = pEntry->AvgTxBytes >> 17; //Mbps */ - /* cli_status_rsp->data_rx_TP = pEntry->AvgRxBytes >> 17; //Mbps */ - cli_status_rsp->data_tx_Byte = - pEntry->AvgTxBytes; - cli_status_rsp->data_rx_Byte = - pEntry->AvgRxBytes; - memcpy(cli_status_rsp->Addr, entry->Addr, - MAC_ADDR_LEN); - cli_status_rsp->ReturnCode = BND_STRG_SUCCESS; - BndStrgSendMsg(pAd, &new_msg); - } - } - } - - return; -} - -VOID BndStrg_ChannelLoadStatusRsp(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table, - BNDSTRG_MSG *msg) -{ - if (table->bInitialized == TRUE) { - BNDSTRG_MSG new_msg = { 0 }; - struct bnd_msg_chanload_status_rsp *chanload_status_rsp = - &new_msg.data.chanload_status_rsp; - /* Send to daemon */ - new_msg.Action = CHANLOAD_STATUS_RSP; - chanload_status_rsp->ReturnCode = BND_STRG_SUCCESS; - chanload_status_rsp->band = table->Band; - chanload_status_rsp->Channel = table->Channel; - { - UINT32 ChanBusyTime[DBDC_BAND_NUM] = { 0 }; - UINT32 ChanBusyTimeCcaNavTx[DBDC_BAND_NUM] = { 0 }; - UINT32 ObssAirTime[DBDC_BAND_NUM] = { 0 }; - UINT32 MyTxAirTime[DBDC_BAND_NUM] = { 0 }; - UINT32 MyRxAirTime[DBDC_BAND_NUM] = { 0 }; - UINT32 EDCCATime[DBDC_BAND_NUM] = { 0 }; - UCHAR ChanBusyOccupyPercentage[DBDC_BAND_NUM] = { 0 }; - UCHAR ObssAirOccupyPercentage[DBDC_BAND_NUM] = { 0 }; - UCHAR MyAirOccupyPercentage[DBDC_BAND_NUM] = { 0 }; - UCHAR MyTxAirOccupyPercentage[DBDC_BAND_NUM] = { 0 }; - UCHAR MyRxAirOccupyPercentage[DBDC_BAND_NUM] = { 0 }; - UCHAR EdccaOccupyPercentage[DBDC_BAND_NUM] = { 0 }; - UCHAR i; - - i = HcGetBandByChannel(pAd, table->Channel); - ChanBusyTime[i] = - pAd->OneSecMibBucket.ChannelBusyTime[i]; - ChanBusyTimeCcaNavTx[i] = - pAd->OneSecMibBucket.ChannelBusyTimeCcaNavTx[i]; - ObssAirTime[i] = Get_OBSS_AirTime(pAd, i); - MyTxAirTime[i] = Get_My_Tx_AirTime(pAd, i); - MyRxAirTime[i] = Get_My_Rx_AirTime(pAd, i); - EDCCATime[i] = Get_EDCCA_Time(pAd, i); - - if (ChanBusyTime[i] != 0) - ChanBusyOccupyPercentage[i] = - (ChanBusyTime[i] * 100) / ONE_SEC_2_US; - - if (ObssAirTime[i] != 0) - ObssAirOccupyPercentage[i] = - (ObssAirTime[i] * 100) / ONE_SEC_2_US; - - if (MyTxAirTime[i] != 0 || MyRxAirTime[i] != 0) - MyAirOccupyPercentage[i] = - ((MyTxAirTime[i] + MyRxAirTime[i]) * - 100) / - ONE_SEC_2_US; - - if (MyTxAirTime[i] != 0) - MyTxAirOccupyPercentage[i] = - (MyTxAirTime[i] * 100) / ONE_SEC_2_US; - - if (MyRxAirTime[i] != 0) - MyRxAirOccupyPercentage[i] = - (MyRxAirTime[i] * 100) / ONE_SEC_2_US; - - if (EDCCATime[i] != 0) - EdccaOccupyPercentage[i] = - (EDCCATime[i] * 100) / ONE_SEC_2_US; - - chanload_status_rsp->chanload = - MyAirOccupyPercentage[i] + - ObssAirOccupyPercentage[i]; - } - BndStrgSendMsg(pAd, &new_msg); - } -} - -VOID BndStrg_InfStatusRsp(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table, - BNDSTRG_MSG *msg) -{ - struct bnd_msg_inf_status_req *inf_status_req = - &msg->data.inf_status_req; - - if (table->bInitialized == TRUE) { - BNDSTRG_MSG new_msg = { 0 }; - struct bnd_msg_inf_status_rsp *inf_status_rsp = - &new_msg.data.inf_status_rsp; - /* Send to daemon */ - new_msg.Action = INF_STATUS_RSP; - - inf_status_rsp->band = table->Band; - inf_status_rsp->bInfReady = table->bInfReady; - inf_status_rsp->Channel = table->Channel; - inf_status_rsp->bVHTCapable = table->bVHTCapable; - inf_status_rsp->nss = table->nss; - inf_status_rsp->table_src_addr = (ULONG)table; - inf_status_rsp->table_size = BND_STRG_MAX_TABLE_SIZE; - strncpy(inf_status_rsp->ucIfName, inf_status_req->ucIfName, - sizeof(inf_status_rsp->ucIfName) - 1); -#ifdef VENDOR_FEATURE5_SUPPORT - inf_status_rsp->nvram_support = 1; -#else - inf_status_rsp->nvram_support = 0; -#endif - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n%s:INF [%s]STATUS QUERY ON\n", __func__, - inf_status_req->ucIfName)); - BndStrgSendMsg(pAd, &new_msg); - } -} - -VOID BndStrg_KickOutAllSta(RTMP_ADAPTER *pAd, UCHAR apidx, USHORT Reason) -{ - HEADER_802_11 DisassocHdr; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - NDIS_STATUS NStatus; - UCHAR BROADCAST_ADDR[MAC_ADDR_LEN] = { 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff }; - - if (apidx < pAd->ApCfg.BssidNum) { - /* Send out a Deauthentication request frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Send DISASSOC frame(%d) with ra%d\n", Reason, - apidx)); - /* 802.11 Header */ - NdisZeroMemory(&DisassocHdr, sizeof(HEADER_802_11)); - DisassocHdr.FC.Type = FC_TYPE_MGMT; - DisassocHdr.FC.SubType = SUBTYPE_DISASSOC; - DisassocHdr.FC.ToDs = 0; - DisassocHdr.FC.Wep = 0; - COPY_MAC_ADDR(DisassocHdr.Addr1, BROADCAST_ADDR); - COPY_MAC_ADDR(DisassocHdr.Addr2, - pAd->ApCfg.MBSSID[apidx].wdev.bssid); - COPY_MAC_ADDR(DisassocHdr.Addr3, - pAd->ApCfg.MBSSID[apidx].wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &DisassocHdr, 2, &Reason, END_OF_ARGS); - - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - } -} - -VOID BndStrg_handle_onoff_event(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table, - BNDSTRG_MSG *msg) -{ - struct bnd_msg_onoff *onoff = &msg->data.onoff; - UINT32 ap_idx; - UINT32 i; - - if (onoff->OnOff && (table->bEnabled ^ onoff->OnOff)) { - /* disconnect all connected STA to keep the link status - * between bndstrg daemon and driver - */ - for (ap_idx = MAIN_MBSSID; ap_idx < pAd->ApCfg.BssidNum; - ap_idx++) { - if (pAd->ApCfg.BndStrgBssIdx[ap_idx] == TRUE) - BndStrg_KickOutAllSta( - pAd, ap_idx, REASON_DEAUTH_STA_LEAVING); - } - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_CLIENT(pEntry) && - pAd->ApCfg.BndStrgBssIdx[pEntry->func_tb_idx] == - TRUE) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("[PMF]%s: MacTableDeleteEntry %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, PRINT_MAC(pEntry->Addr))); - MacTableDeleteEntry(pAd, pEntry->wcid, - pEntry->Addr); - } - } - - BndStrg_Send_NeighborReport(pAd, table); - table->BndStrgMode = onoff->BndStrgMode; - } else if ((onoff->OnOff == 0) && (table->bEnabled ^ onoff->OnOff)) { - if (table->Size > 0) { - PBND_STRG_CLI_ENTRY entry = NULL; - - for (i = 0; i < BND_STRG_MAX_TABLE_SIZE; i++) { - entry = &table->Entry[i]; - - if (entry->bValid == TRUE) - BndStrg_DeleteEntry(table, entry->Addr, - i); - } - } - } - - BndStrg_Tbl_Enable(table, onoff->OnOff, onoff->ucIfName); - - if (table->bEnabled) - table->DaemonPid = current->pid; - else - table->DaemonPid = 0xffffffff; - return; -} - -VOID BndStrg_UpdateWhiteBlackList(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table, - BNDSTRG_MSG *msg) -{ - struct bnd_msg_update_white_black_list *update_list = - &msg->data.update_white_black_list; - PLIST_HEADER pUpdateList = NULL; - NDIS_SPIN_LOCK *pBsListLock = NULL; - - BND_STRG_PRINTQAMSG( - table, update_list->Addr, - ("%s: client[%02x:%02x:%02x:%02x:%02x:%02x] %s %s\n", __func__, - PRINT_MAC(update_list->Addr), - (update_list->deladd ? "Add to" : "Remove From"), - ((update_list->list_type == bndstrg_whitelist) ? - "WhiteList" : - "BlackList"))); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: client[%02x:%02x:%02x:%02x:%02x:%02x] %s %s\n", __func__, - PRINT_MAC(update_list->Addr), - (update_list->deladd ? "Add to" : "Remove From"), - ((update_list->list_type == bndstrg_whitelist) ? - "WhiteList" : - "BlackList"))); - - if (update_list->list_type == bndstrg_whitelist) { - pUpdateList = &table->WhiteList; - pBsListLock = &table->WhiteListLock; - } else if (update_list->list_type == bndstrg_blacklist) { - pUpdateList = &table->BlackList; - pBsListLock = &table->BlackListLock; - } else - return; - - if (update_list->deladd) { - NdisAcquireSpinLock(pBsListLock); - AddBsListEntry(pUpdateList, update_list->Addr); - NdisReleaseSpinLock(pBsListLock); - } else { - NdisAcquireSpinLock(pBsListLock); - DelBsListEntry(pUpdateList, update_list->Addr); - NdisReleaseSpinLock(pBsListLock); - } -} - -INT BndStrg_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - INT apidx) -{ - PBND_STRG_CLI_ENTRY entry = NULL; - BNDSTRG_MSG msg_copy = { 0 }; - BNDSTRG_MSG *msg = &msg_copy; - PBND_STRG_CLI_TABLE table = NULL; - INT Status = NDIS_STATUS_SUCCESS; - - table = Get_BndStrgTable(pAd, apidx); - - if (!table || (table->bInitialized == FALSE)) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: BND_STRG_NOT_INITIALIZED on apidex[%d]!\n", - __func__, apidx)); - return BND_STRG_NOT_INITIALIZED; - } - - if (wrq->u.data.length > sizeof(BNDSTRG_MSG)) { - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: The length of message not match!\n", - __func__)); - return BND_STRG_INVALID_ARG; - } else { - Status = copy_from_user(&msg_copy, wrq->u.data.pointer, - wrq->u.data.length); - } - - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: action code (%d)\n", __func__, msg->Action)); - - if ((table->DaemonPid != 0xffffffff) && - (table->DaemonPid != current->pid)) { - BNDSTRG_MSG new_msg = { 0 }; - - new_msg.Action = REJECT_EVENT; - new_msg.data.reject_body.DaemonPid = table->DaemonPid; - BndStrgSendMsg(pAd, &new_msg); - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:Unknown BndStrg PID\n", __func__)); - return BND_STRG_SUCCESS; - } - - switch (msg->Action) { - case CLI_ADD: { - struct bnd_msg_cli_add *cli_add = &msg->data.cli_add; - -#ifdef BND_STRG_QA - BND_STRG_PRINTQAMSG( - table, cli_add->Addr, - (("%s[%d][Channel:%d]: Add (%02x:%02x:%02x:%02x:%02x:%02x) client to %s driver table\n\r"), - __func__, __LINE__, table->Channel, - PRINT_MAC(cli_add->Addr), - (IS_5G_BAND(table->Band) ? "5G" : "2.4G"))); -#endif - - entry = BndStrg_TableLookup(table, cli_add->Addr); - - if (entry == NULL) { - if (BndStrg_InsertEntry(table, cli_add, &entry) == - BND_STRG_SUCCESS) { - if (table->BndStrgMode == - POST_CONNECTION_STEERING) { - entry->bConnStatus = TRUE; - entry->BndStrg_Sta_State = - BNDSTRG_STA_ASSOC; - } - } - } else - entry->BndStrg_Sta_State = BNDSTRG_STA_INIT; - } break; - - case CLI_DEL: { - struct bnd_msg_cli_del *cli_del = &msg->data.cli_del; - MAC_TABLE_ENTRY *pEntry = NULL; - - if (BndStrg_TableLookup(table, cli_del->Addr)) { - /*remove sta if sta is existed*/ - pEntry = MacTableLookup(pAd, cli_del->Addr); - - if (pEntry && (apidx == pEntry->func_tb_idx) && - pAd->ApCfg.BndStrgBssIdx[pEntry->func_tb_idx]) { -#ifdef BND_STRG_QA - BND_STRG_PRINTQAMSG( - table, cli_del->Addr, - (("%s[%d]: kick out client's (%02x:%02x:%02x:%02x:%02x:%02x)\n\r"), - __func__, __LINE__, - PRINT_MAC(cli_del->Addr))); -#endif - MlmeDeAuthAction(pAd, pEntry, - REASON_DISASSOC_STA_LEAVING, - FALSE); - MacTableDeleteEntry(pAd, pEntry->wcid, - pEntry->Addr); - } - - BndStrg_DeleteEntry(table, cli_del->Addr, 0xFF); -#ifdef BND_STRG_QA - BND_STRG_PRINTQAMSG( - table, cli_del->Addr, - (("%s[%d][Channel:%d]:DEL (%02x:%02x:%02x:%02x:%02x:%02x) client from %s driver table\n\r"), - __func__, __LINE__, table->Channel, - PRINT_MAC(cli_del->Addr), - (IS_5G_BAND(table->Band) ? "5G" : "2.4G"))); -#endif - } - } break; - case CLI_STATUS_REQ: - if (table->bInfReady) - BndStrg_CLIStatusRsp(pAd, table, msg); - - break; - - case CHANLOAD_STATUS_REQ: - if (table->bInfReady) - BndStrg_ChannelLoadStatusRsp(pAd, table, msg); - - break; - - case INF_STATUS_QUERY: - if (table->bInfReady) - BndStrg_InfStatusRsp(pAd, table, msg); - - break; - - case HEARTBEAT_MONITOR: - if (table->bInfReady) - pAd->ApCfg.BndStrgHeartbeatCount++; - - break; - - case BNDSTRG_ONOFF: - if (table && table->bInitialized) - BndStrg_handle_onoff_event(pAd, table, msg); - break; -#ifdef VENDOR_FEATURE5_SUPPORT - case NVRAM_UPDATE: { - struct bnd_msg_nvram_entry_update *entry_update = - &msg->data.entry_update; - - if (!(BndStrg_NvramInsertEntry(table, - &entry_update->nvram_entry))) - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s: NVRAM table full\n", __func__)); - } break; -#endif /* VENDOR_FEATURE5_SUPPORT */ - - case BNDSTRG_WNM_BTM: -#ifdef CONFIG_DOT11V_WNM - { - struct wnm_command *cmd_data = - (struct wnm_command *)&msg->data.wnm_cmd_data; - - hex_dump("BNDSTRG_WNM_BTM MSG", (unsigned char *)msg, - sizeof(BNDSTRG_MSG)); - if (cmd_data->command_id == OID_802_11_WNM_CMD_SEND_BTM_REQ) { - MAC_TABLE_ENTRY *pEntry; - unsigned char *request_mode; - struct btm_req_data *req_data; -#define DISASSOC_IMMINENT (0x01 << 2) - req_data = - (struct btm_req_data *)cmd_data->command_body; - request_mode = (unsigned char *)req_data->btm_req; - if ((*request_mode) & DISASSOC_IMMINENT) { - /* imminent dis-assoc BTM Req, delete entry from driver table */ - BndStrg_DeleteEntry( - table, req_data->peer_mac_addr, 0xFF); - } - pEntry = MacTableLookup(pAd, req_data->peer_mac_addr); - if (pEntry != NULL) { - BndStrg_send_BTM_req(pAd, - req_data->peer_mac_addr, - req_data->btm_req, - req_data->btm_req_len, - table); - } - } else { - hex_dump("BNDSTRG_WNM_BTM", (unsigned char *)cmd_data, - cmd_data->command_len); - BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: Unknow wnm cmd id %d\n", - __func__, cmd_data->command_id)); - } - } -#endif - break; - - case UPDATE_WHITE_BLACK_LIST: - if (table->bInfReady) { - BndStrg_UpdateWhiteBlackList(pAd, table, msg); - } - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: unknown action code. (%d)\n", __func__, - msg->Action)); - break; - } - - return BND_STRG_SUCCESS; -} - -void BndStrgHeartBeatMonitor(PRTMP_ADAPTER pAd) -{ - if (pAd->ApCfg.BndStrgTable[BAND0].bEnabled -#ifdef DBDC_MODE - || pAd->ApCfg.BndStrgTable[BAND1].bEnabled -#endif - ) { - if (pAd->ApCfg.BndStrgHeartbeatMonitor != - pAd->ApCfg.BndStrgHeartbeatCount) { - pAd->ApCfg.BndStrgHeartbeatMonitor = - pAd->ApCfg.BndStrgHeartbeatCount; - pAd->ApCfg.BndStrgHeartbeatNoChange = 0; - return; - } else - pAd->ApCfg.BndStrgHeartbeatNoChange++; - - if (pAd->ApCfg.BndStrgHeartbeatNoChange == 20) { - BND_STRG_MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:BndStrg Daemon Killed\n", __func__)); - pAd->ApCfg.BndStrgHeartbeatNoChange = 0; - BndStrg_Release(pAd); - } - } -} - -void BndStrgSetProfileParam(struct _RTMP_ADAPTER *pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *pBuffer) -{ - INT i = 0; - RTMP_STRING *macptr = NULL; - - if (RTMPGetKeyParameter("BandSteering", tmpbuf, 10, pBuffer, TRUE)) { - pAd->ApCfg.BandSteering = (UCHAR)simple_strtol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_CAT_AP, DBG_LVL_OFF, - ("BandSteering=%d\n", pAd->ApCfg.BandSteering)); - } - - if (RTMPGetKeyParameter("BndStrgBssIdx", tmpbuf, 50, pBuffer, TRUE)) { - MTWF_LOG(DBG_CAT_CFG, DBG_CAT_AP, DBG_LVL_OFF, - ("BndStrgBssIdx=%s\n", tmpbuf)); - - for (i = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), i++) - pAd->ApCfg.BndStrgBssIdx[i] = - simple_strtoul(macptr, 0, 10); - - if (i == 0) - pAd->ApCfg.BndStrgBssIdx[MAIN_MBSSID] = 1; - } else - pAd->ApCfg.BndStrgBssIdx[MAIN_MBSSID] = 1; -} -#ifdef CONFIG_DOT11V_WNM -void BndStrg_send_BTM_req(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *BTMReq, IN UINT32 BTMReqLen, - PBND_STRG_CLI_TABLE table) -{ - UCHAR *Buf; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR APIndex = pObj->ioctl_if; - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[APIndex].WNMCtrl; - BTM_EVENT_DATA *Event; - BTM_PEER_ENTRY *BTMPeerEntry; -#ifdef DOT11K_RRM_SUPPORT - RRM_NEIGHBOR_REP_INFO *NeighborReport = NULL; - ULONG FrameLen = 0; -#endif - UINT32 Len = 0; - INT32 Ret; - BOOLEAN IsFound = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - - RTMP_SEM_EVENT_WAIT(&pWNMCtrl->BTMPeerListLock, Ret); - DlListForEach(BTMPeerEntry, &pWNMCtrl->BTMPeerList, BTM_PEER_ENTRY, - List) - { - if (MAC_ADDR_EQUAL(BTMPeerEntry->PeerMACAddr, PeerMACAddr)) { - IsFound = TRUE; - break; - } - } - RTMP_SEM_EVENT_UP(&pWNMCtrl->BTMPeerListLock); - - if (!IsFound) { - os_alloc_mem(NULL, (UCHAR **)&BTMPeerEntry, - sizeof(*BTMPeerEntry)); - - if (!BTMPeerEntry) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Not available memory\n", __func__)); - goto error0; - } - - NdisZeroMemory(BTMPeerEntry, sizeof(*BTMPeerEntry)); - - BTMPeerEntry->CurrentState = WAIT_BTM_REQ; - BTMPeerEntry->ControlIndex = APIndex; - NdisMoveMemory(BTMPeerEntry->PeerMACAddr, PeerMACAddr, - MAC_ADDR_LEN); - BTMPeerEntry->DialogToken = 1; - BTMPeerEntry->Priv = pAd; - - RTMPInitTimer(pAd, &BTMPeerEntry->WaitPeerBTMRspTimer, - GET_TIMER_FUNCTION(WaitPeerBTMRspTimeout), - BTMPeerEntry, FALSE); - RTMP_SEM_EVENT_WAIT(&pWNMCtrl->BTMPeerListLock, Ret); - DlListAddTail(&pWNMCtrl->BTMPeerList, &BTMPeerEntry->List); - RTMP_SEM_EVENT_UP(&pWNMCtrl->BTMPeerListLock); - } - -#ifdef DOT11K_RRM_SUPPORT - os_alloc_mem(NULL, (UCHAR **)&Buf, - sizeof(*Event) + BTMReqLen + - sizeof(RRM_NEIGHBOR_REP_INFO) + 3); - /* Size 3 is for the preference sub element in neighbor report*/ -#else - os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*Event) + BTMReqLen); -#endif - - if (!Buf) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Not available memory\n", __func__)); - goto error1; - } - -#ifdef DOT11K_RRM_SUPPORT - NdisZeroMemory(Buf, sizeof(*Event) + BTMReqLen + - sizeof(RRM_NEIGHBOR_REP_INFO) + 3); - /* Size 3 is for the preference sub element in neighbor report*/ -#else - NdisZeroMemory(Buf, sizeof(*Event) + BTMReqLen); -#endif - - Event = (BTM_EVENT_DATA *)Buf; - - Event->ControlIndex = APIndex; - Len += 1; - - NdisMoveMemory(Event->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN); - Len += MAC_ADDR_LEN; - - Event->EventType = BTM_REQ; - Len += 2; - - Event->u.BTM_REQ_DATA.DialogToken = BTMPeerEntry->DialogToken; - Len += 1; - - Event->u.BTM_REQ_DATA.BTMReqLen = BTMReqLen; - Len += 2; - - NdisMoveMemory(Event->u.BTM_REQ_DATA.BTMReq, BTMReq, BTMReqLen); - - BTMReq += BTMReqLen; /*advance pointer to neighbour report*/ -#ifdef DOT11K_RRM_SUPPORT - hex_dump("BndStrg_send_BTM_req NeighborReport", (unsigned char *)BTMReq, - sizeof(RRM_NEIGHBOR_REP_INFO)); - NeighborReport = (RRM_NEIGHBOR_REP_INFO *)BTMReq; - - RRM_InsertNeighborRepIE( - pAd, (Event->u.BTM_REQ_DATA.BTMReq + BTMReqLen), &FrameLen, - sizeof(RRM_NEIGHBOR_REP_INFO) + 3, - NeighborReport); /* Neighbor report IE + Preferance Sub-IE length*/ - BTMReqLen += FrameLen; - - { - ULONG TempLen = 0; - UINT8 IEId = 3; - UINT8 Len = 1; - UINT8 BssPreference = 255; - - MakeOutgoingFrame((Event->u.BTM_REQ_DATA.BTMReq + BTMReqLen), - &TempLen, 1, &IEId, 1, &Len, 1, - &BssPreference, END_OF_ARGS); - BTMReqLen += TempLen; - } - Event->u.BTM_REQ_DATA.BTMReqLen = BTMReqLen; - Len += BTMReqLen; -#endif - hex_dump("BndStrg_send_BTM_req Enque", (unsigned char *)Buf, Len); - hex_dump("BndStrg_send_BTM_req Event length", - (unsigned char *)Event->u.BTM_REQ_DATA.BTMReq, - Event->u.BTM_REQ_DATA.BTMReqLen); - MlmeEnqueue(pAd, BTM_STATE_MACHINE, BTM_REQ, Len, Buf, 0); - - os_free_mem(Buf); - - return; - -error1: - if (!IsFound) - os_free_mem(BTMPeerEntry); -error0: - return; -} - -#endif - -void BndStrg_Send_NeighborReport(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table) -{ -#ifdef DOT11K_RRM_SUPPORT - BNDSTRG_MSG msg = { 0 }; - struct bnd_msg_neighbor_report *NeighborReport = - &msg.data.Neighbor_Report; - - msg.Action = BNDSTRG_NEIGHBOR_REPORT; - - NeighborReport->Band = table->Band; - NeighborReport->Channel = table->Channel; - NdisCopyMemory(&NeighborReport->NeighborRepInfo, - &table->NeighborRepInfo, sizeof(RRM_NEIGHBOR_REP_INFO)); - BndStrgSendMsg(pAd, &msg); -#endif - return; -} - -#endif /* BAND_STEERING */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_cfg.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_cfg.c deleted file mode 100644 index c5742e834b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_cfg.c +++ /dev/null @@ -1,23474 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - ap_cfg.c - - Abstract: - IOCTL related subroutines - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" - -#ifdef VENDOR_FEATURE7_SUPPORT -#ifdef WSC_LED_SUPPORT -#include "rt_led.h" -#endif /* WSC_LED_SUPPORT */ -#endif -#ifdef RLM_CAL_CACHE_SUPPORT -#include "phy/rlm_cal_cache.h" -#endif /* RLM_CAL_CACHE_SUPPORT */ - -#if defined(TR181_SUPPORT) || defined(TXRX_STAT_SUPPORT) -#include "hdev/hdev_basic.h" -#endif - -#define A_BAND_REGION_0 0 -#define A_BAND_REGION_1 1 -#define A_BAND_REGION_2 2 -#define A_BAND_REGION_3 3 -#define A_BAND_REGION_4 4 -#define A_BAND_REGION_5 5 -#define A_BAND_REGION_6 6 -#define A_BAND_REGION_7 7 -#define A_BAND_REGION_8 8 -#define A_BAND_REGION_9 9 -#define A_BAND_REGION_10 10 - -#define G_BAND_REGION_0 0 -#define G_BAND_REGION_1 1 -#define G_BAND_REGION_2 2 -#define G_BAND_REGION_3 3 -#define G_BAND_REGION_4 4 -#define G_BAND_REGION_5 5 -#define G_BAND_REGION_6 6 - -COUNTRY_CODE_TO_COUNTRY_REGION allCountry[] = { - /* {Country Number, ISO Name, Country Name, Support 11A, 11A Country Region, Support 11G, 11G Country Region} */ - { 0, "DB", "Debug", TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_5 }, - { 8, "AL", "ALBANIA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 12, "DZ", "ALGERIA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 32, "AR", "ARGENTINA", TRUE, A_BAND_REGION_3, TRUE, G_BAND_REGION_1 }, - { 51, "AM", "ARMENIA", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1 }, - { 36, "AU", "AUSTRALIA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 40, "AT", "AUSTRIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 31, "AZ", "AZERBAIJAN", TRUE, A_BAND_REGION_2, TRUE, - G_BAND_REGION_1 }, - { 48, "BH", "BAHRAIN", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 112, "BY", "BELARUS", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 56, "BE", "BELGIUM", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 84, "BZ", "BELIZE", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1 }, - { 68, "BO", "BOLIVIA", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1 }, - { 76, "BR", "BRAZIL", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 96, "BN", "BRUNEI DARUSSALAM", TRUE, A_BAND_REGION_4, TRUE, - G_BAND_REGION_1 }, - { 100, "BG", "BULGARIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 124, "CA", "CANADA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0 }, - { 152, "CL", "CHILE", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 156, "CN", "CHINA", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1 }, - { 170, "CO", "COLOMBIA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0 }, - { 188, "CR", "COSTA RICA", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 191, "HR", "CROATIA", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1 }, - { 196, "CY", "CYPRUS", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 203, "CZ", "CZECH REPUBLIC", TRUE, A_BAND_REGION_2, TRUE, - G_BAND_REGION_1 }, - { 208, "DK", "DENMARK", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 214, "DO", "DOMINICAN REPUBLIC", TRUE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_0 }, - { 218, "EC", "ECUADOR", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 818, "EG", "EGYPT", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1 }, - { 222, "SV", "EL SALVADOR", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 233, "EE", "ESTONIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 246, "FI", "FINLAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 250, "FR", "FRANCE", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1 }, - { 268, "GE", "GEORGIA", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1 }, - { 276, "DE", "GERMANY", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 300, "GR", "GREECE", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 320, "GT", "GUATEMALA", TRUE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_0 }, - { 340, "HN", "HONDURAS", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 344, "HK", "HONG KONG", TRUE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 348, "HU", "HUNGARY", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 352, "IS", "ICELAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 356, "IN", "INDIA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 360, "ID", "INDONESIA", TRUE, A_BAND_REGION_4, TRUE, - G_BAND_REGION_1 }, - { 364, "IR", "IRAN", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1 }, - { 372, "IE", "IRELAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 376, "IL", "ISRAEL", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 380, "IT", "ITALY", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 392, "JP", "JAPAN", TRUE, A_BAND_REGION_9, TRUE, G_BAND_REGION_1 }, - { 400, "JO", "JORDAN", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 398, "KZ", "KAZAKHSTAN", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 408, "KP", "KOREA DEMOCRATIC PEOPLE'S REPUBLIC OF", TRUE, - A_BAND_REGION_5, TRUE, G_BAND_REGION_1 }, - { 410, "KR", "KOREA REPUBLIC OF", TRUE, A_BAND_REGION_5, TRUE, - G_BAND_REGION_1 }, - { 414, "KW", "KUWAIT", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 428, "LV", "LATVIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 422, "LB", "LEBANON", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 438, "LI", "LIECHTENSTEIN", TRUE, A_BAND_REGION_1, TRUE, - G_BAND_REGION_1 }, - { 440, "LT", "LITHUANIA", TRUE, A_BAND_REGION_1, TRUE, - G_BAND_REGION_1 }, - { 442, "LU", "LUXEMBOURG", TRUE, A_BAND_REGION_1, TRUE, - G_BAND_REGION_1 }, - { 446, "MO", "MACAU", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 807, "MK", "MACEDONIA", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 458, "MY", "MALAYSIA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 484, "MX", "MEXICO", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0 }, - { 492, "MC", "MONACO", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1 }, - { 504, "MA", "MOROCCO", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 528, "NL", "NETHERLANDS", TRUE, A_BAND_REGION_1, TRUE, - G_BAND_REGION_1 }, - { 554, "NZ", "NEW ZEALAND", TRUE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 578, "NO", "NORWAY", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0 }, - { 512, "OM", "OMAN", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 586, "PK", "PAKISTAN", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 591, "PA", "PANAMA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0 }, - { 604, "PE", "PERU", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1 }, - { 608, "PH", "PHILIPPINES", TRUE, A_BAND_REGION_4, TRUE, - G_BAND_REGION_1 }, - { 616, "PL", "POLAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 620, "PT", "PORTUGAL", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 630, "PR", "PUERTO RICO", TRUE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_0 }, - { 634, "QA", "QATAR", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 642, "RO", "ROMANIA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 643, "RU", "RUSSIA FEDERATION", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 682, "SA", "SAUDI ARABIA", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 702, "SG", "SINGAPORE", TRUE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 703, "SK", "SLOVAKIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 705, "SI", "SLOVENIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 710, "ZA", "SOUTH AFRICA", TRUE, A_BAND_REGION_1, TRUE, - G_BAND_REGION_1 }, - { 724, "ES", "SPAIN", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 752, "SE", "SWEDEN", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1 }, - { 756, "CH", "SWITZERLAND", TRUE, A_BAND_REGION_1, TRUE, - G_BAND_REGION_1 }, - { 760, "SY", "SYRIAN ARAB REPUBLIC", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 158, "TW", "TAIWAN", TRUE, A_BAND_REGION_3, TRUE, G_BAND_REGION_0 }, - { 764, "TH", "THAILAND", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 780, "TT", "TRINIDAD AND TOBAGO", TRUE, A_BAND_REGION_2, TRUE, - G_BAND_REGION_1 }, - { 788, "TN", "TUNISIA", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1 }, - { 792, "TR", "TURKEY", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1 }, - { 804, "UA", "UKRAINE", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 784, "AE", "UNITED ARAB EMIRATES", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 826, "GB", "UNITED KINGDOM", TRUE, A_BAND_REGION_1, TRUE, - G_BAND_REGION_1 }, - { 840, "US", "UNITED STATES", TRUE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_0 }, - { 858, "UY", "URUGUAY", TRUE, A_BAND_REGION_5, TRUE, G_BAND_REGION_1 }, - { 860, "UZ", "UZBEKISTAN", TRUE, A_BAND_REGION_1, TRUE, - G_BAND_REGION_0 }, - { 862, "VE", "VENEZUELA", TRUE, A_BAND_REGION_5, TRUE, - G_BAND_REGION_1 }, - { 704, "VN", "VIET NAM", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 887, "YE", "YEMEN", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1 }, - { 716, "ZW", "ZIMBABWE", FALSE, A_BAND_REGION_0, TRUE, - G_BAND_REGION_1 }, - { 999, "", "", 0, 0, 0, 0 } -}; - -#define NUM_OF_COUNTRIES \ - (sizeof(allCountry) / sizeof(COUNTRY_CODE_TO_COUNTRY_REGION)) - -static const struct apcfg_parameters apcfg_for_peak = { - .cfg_mode[0] = 9, /*WirelessMode*/ - .cfg_mode[1] = 14, - .tx_power_percentage = 100, /*TxPower*/ - .tx_preamble = 1, /*TxPreamble*/ - .conf_len_thld = 2347, /*RTSThreshold*/ - .oper_len_thld = 2347, - .conf_frag_thld = 2346, /*FragThreshold*/ - .oper_frag_thld = 2346, - .bEnableTxBurst = 1, /*TxBurst*/ - .bUseShortSlotTime = 1, /*ShortSlot*/ -#ifdef DOT11_N_SUPPORT - .conf_ht_bw = 1, /*HT_BW*/ - .oper_ht_bw = 1, -#ifdef DOT11N_DRAFT3 - .bBssCoexEnable = 0, /*HT_BSSCoexistence*/ -#endif - - .ht_tx_streams = 4, /*HT_TxStream*/ - .ht_rx_streams = 4, /*HT_RxStream*/ - - .bBADecline = 0, /*HT_BADecline*/ - .AutoBA = 1, /*HT_AutoBA*/ - .AmsduEnable = 1, /*HT_AMSDU*/ - .RxBAWinLimit = 64, /*HT_BAWinSize*/ - .ht_gi = 1, /*HT_GI*/ - .ht_stbc = 1, /*HT_STBC*/ - .ht_ldpc = 1, /*HT_LDPC*/ - .bRdg = 0, /*HT_RDG*/ -#endif - .HT_DisallowTKIP = 1, /*HT_DisallowTKIP*/ - -#ifdef DOT11_VHT_AC - .conf_vht_bw = 1, /*VHT_BW, 5G only*/ - .oper_vht_bw = 1, - .vht_sgi = 1, /*VHT_SGI, 5G only*/ - .vht_stbc = 1, /*VHT_STBC, 5G only*/ - .vht_bw_signal = 0, /*VHT_BW_SIGNAL, 5G only*/ - .vht_ldpc = 1, /*VHT_LDPC, 5G only*/ - .g_band_256_qam = 1, /*G_BAND_256QAM, 2.4G only*/ -#endif - - .bIEEE80211H = 1, /*IEEE80211H*/ - -#ifdef MT_DFS_SUPPORT - .bDfsEnable = 0, /*DfsEnable, 5G only*/ -#endif - -#ifdef BACKGROUND_SCAN_SUPPORT - .DfsZeroWaitSupport = 0, /*DfsZeroWait, Single band only*/ -#endif - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT - .ETxBfEnCond = 0, /*ETxBfEnCond*/ -#endif -#endif - - .ITxBfEn = 0, /*ITxBfEn*/ - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT - .MUTxRxEnable = 0, /*MUTxRxEnable*/ -#endif -#endif -}; - -#ifdef CFG_SUPPORT_MU_MIMO - -/* iwprive test code */ - -INT32 hqa_mu_get_qd(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_get_init_mcs(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_get_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT32 hqa_mu_cal_init_mcs(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_cal_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT32 hqa_mu_set_snr_offset(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_set_zero_nss(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_set_speedup_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_set_mu_table(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_set_group(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_set_enable(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_set_gid_up(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_su_cal_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_su_get_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_set_gid_up(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT32 hqa_mu_set_trigger_mu_tx(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -/* get function */ -INT ShowMuEnableProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowMuProfileProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowGroupTblEntryProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowClusterTblEntryProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowGroupUserThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowGroupNssThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowTxReqMinTimeProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowSuNssCheckProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowCalcInitMCSProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowTxopDefaultProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowSuLossThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowMuGainThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowSecondaryAcPolicyProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowGroupTblDmcsMaskProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowMaxGroupSearchCntProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowMuProfileTxStsCntProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* set function */ -INT SetMuProfileProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetGroupTblEntryProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetClusterTblEntryProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuEnableProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetGroupUserThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetGroupNssThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTxReqMinTimeProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetSuNssCheckProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetCalculateInitMCSProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTriggerGIDMgmtFrameProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTriggerMuTxProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTriggerDegroupProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTriggerGroupProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTriggerBbpProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTriggerSndProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTxopDefaultProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetSuLossThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuGainThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetSecondaryAcPolicyProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetGroupTblDmcsMaskProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMaxGroupSearchCntProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -#ifdef AIR_MONITOR -INT Set_Enable_Air_Monitor_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorRule_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorIndex_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorShowAll_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorClearCounter_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget0_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget3_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget4_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget5_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget6_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget7_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget8_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget9_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget10_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget11_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget12_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget13_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget14_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorTarget15_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -VOID Air_Monitor_Pkt_Report_Action(RTMP_ADAPTER *pAd, UCHAR wcid, - RX_BLK *pRxBlk); -#endif /* AIR_MONITOR */ - -#ifdef DSCP_PRI_SUPPORT -INT Set_Dscp_Pri_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Show_Dscp_Pri_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif - -#ifdef CFG_SUPPORT_MU_MIMO_RA -/* mura set function */ -INT SetMuraPeriodicSndProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraTestAlgorithmProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraTestAlgorithmInit(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraFixedRateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraFixedGroupRateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraFixedSndParamProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraDisableCN3CN4Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* mura get function */ -INT GetMuraMonitorStateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT GetMuraPFIDStatProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -INT Set_CountryString_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_CountryCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef EXT_BUILD_CHANNEL_LIST -INT Set_ChGeography_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* EXT_BUILD_CHANNEL_LIST */ - -#ifdef SPECIFIC_TX_POWER_SUPPORT -INT Set_AP_PKT_PWR(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* SPECIFIC_TX_POWER_SUPPORT */ - -INT Set_AP_SSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxRate_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_OLBCDetection_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_AP_PerMbssMaxStaNum_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_AP_IdleTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef IAPP_SUPPORT -INT Set_IappPID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* IAPP_SUPPORT */ - -INT Set_AP_WpaMixPairCipher_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_RekeyInterval_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_RekeyMethod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_PMKCachePeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_ASSOC_REQ_RSSI_THRESHOLD(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_KickStaRssiLow_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_BasicRate_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef REDUCE_TCP_ACK_SUPPORT -INT Set_ReduceAckEnable_Proc(IN PRTMP_ADAPTER pAdapter, IN RTMP_STRING *pParam); - -INT Show_ReduceAckInfo_Proc(IN PRTMP_ADAPTER pAdapter, IN RTMP_STRING *pParam); - -INT Set_ReduceAckProb_Proc(IN PRTMP_ADAPTER pAdapter, IN RTMP_STRING *pParam); -#endif - -INT Set_BeaconPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DtimPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_NoForwarding_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_NoForwardingBTNSSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_NoForwardingMBCast_Proc(IN PRTMP_ADAPTER pAdapter, IN RTMP_STRING *arg); - -INT Set_AP_WmmCapable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_HideSSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef VLAN_SUPPORT -INT Set_VLANEn_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_VLANID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_VLANPriority_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_VLAN_TAG_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_VLAN_Policy_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_VLAN_Info_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*VLAN_SUPPORT*/ - -INT Set_AccessPolicy_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_ACLAddEntry_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_ACLDelEntry_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_ACLShowAll_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_ACLClearAll_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SiteSurvey_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AutoChannelSel_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_PartialScan_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_PeriodicPartialScan_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_PartialScanTriggerPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef AP_SCAN_SUPPORT -INT Set_AutoChannelSelCheckTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ClearSiteSurvey_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* AP_SCAN_SUPPORT */ - -#ifdef NEIGHBORING_AP_STAT -INT Set_IPI_RPI_Config_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_CustomScanResult_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif - -INT Set_BADecline_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef TXRX_STAT_SUPPORT - -INT Show_Sta_Stat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_Bss_Stat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_Radio_Stat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Enable_Last_Sec_TXRX_Stats(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Enable_RSSI_Stats(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -#ifdef EAP_STATS_SUPPORT -INT Show_Eap_Stats_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* EAP_STATS_SUPPORT */ - -INT Show_StaCount_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_Sat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -static INT show_apcfg_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Show_RAInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef TXBF_SUPPORT -INT Show_TxBfInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* TXBF_SUPPORT */ -#ifdef RTMP_MAC_PCI -#ifdef DBG_DIAGNOSE -INT Set_DiagOpt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_diag_cond_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_Diag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* DBG_DAIGNOSE */ -#endif /* RTMP_MAC_PCI */ - -INT show_timer_list(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_wtbl_state(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT show_radio_info_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Show_Sat_Reset_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_MATTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef DOT1X_SUPPORT -INT Set_IEEE8021X_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_PreAuth_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_RADIUS_Server_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_RADIUS_Port_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_RADIUS_Key_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DeletePMKID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DumpPMKID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef RADIUS_MAC_ACL_SUPPORT -INT Set_RADIUS_MacAuth_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_RADIUS_CacheTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT show_RADIUS_acl_cache(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* RADIUS_MAC_ACL_SUPPORT */ -#endif /* DOT1X_SUPPORT */ - -#ifdef CUSTOMER_DCC_FEATURE -VOID RTMPIoctlGetBSSID_LIST(PRTMP_ADAPTER pAdapter, - RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /* CUSTOMER_DCC_FEATURE */ - -INT Set_DisConnectSta_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef VENDOR_FEATURE7_SUPPORT -INT Set_DisConnectBssSta_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -INT Set_DisConnectAllSta_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef MBSS_AS_WDS_AP_SUPPORT -INT Set_Wds_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_WdsMac_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif - -#ifdef DYNAMIC_VLAN_SUPPORT -INT Set_Dvlan_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_Sta_Vlan(PRTMP_ADAPTER pAd, RT_CMD_AP_STA_VLAN *sta_vlan); -#endif - -#ifdef HOSTAPD_11R_SUPPORT -INT Set_Ft_Param(PRTMP_ADAPTER pAd, RT_CMD_AP_11R_PARAM *ap_11r_param); -#endif /* HOSTAPD_11R_SUPPORT */ - -#ifdef APCLI_SUPPORT -INT Set_ApCli_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ApCli_Ssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ApCli_Bssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ApCli_TxMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ApCli_TxMcs_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ApCli_WirelessMode_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -#ifdef APCLI_AUTO_CONNECT_SUPPORT -INT Set_ApCli_AutoConnect_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ -#ifdef APCLI_CONNECTION_TRIAL -INT Set_ApCli_Trial_Ch_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* APCLI_CONNECTION_TRIAL */ - -#ifdef MAC_REPEATER_SUPPORT -INT Set_ReptMode_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Cli_Link_Map_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* MAC_REPEATER_SUPPORT */ - -#ifdef WSC_AP_SUPPORT -INT Set_AP_WscSsid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef APCLI_SUPPORT -INT Set_ApCli_WscScanMode_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif /* APCLI_SUPPORT */ -#endif /* WSC_AP_SUPPORT */ - -#ifdef APCLI_CERT_SUPPORT -INT Set_ApCli_Cert_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* Add for APCLI PMF 5.3.3.3 option test item. (Only Tx De-auth Req. and make sure the pkt can be Encrypted) */ -INT ApCliTxDeAuth(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* APCLI_CERT_SUPPORT */ - -#ifdef WSC_AP_SUPPORT -INT Set_Wps_Cert_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -#ifdef ROAMING_ENHANCE_SUPPORT -INT Set_RoamingEnhance_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* ROAMING_ENHANCE_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#ifdef UAPSD_SUPPORT -INT Set_UAPSD_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* UAPSD_SUPPORT */ - -#ifdef WSC_AP_SUPPORT -INT Set_WscStatus_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef BB_SOC -INT Set_WscOOB_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -INT Set_WscStop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef RADIUS_MAC_AUTH_SUPPORT -INT Set_Radius_Mac_Auth_Policy_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - -VOID RTMPIoctlWscProfile(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlWscPINCode(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlWscStatus(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetWscDynInfo(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetWscRegsDynInfo(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -BOOLEAN WscCheckEnrolleeNonceFromUpnp(IN PRTMP_ADAPTER pAdapter, - IN RTMP_STRING *pData, IN USHORT Length, - IN PWSC_CTRL pWscControl); - -UCHAR WscRxMsgTypeFromUpnp(IN PRTMP_ADAPTER pAdapter, IN RTMP_STRING *pData, - IN USHORT Length); - -INT WscGetConfForUpnp(IN PRTMP_ADAPTER pAd, IN PWSC_CTRL pWscControl); - -#ifdef CON_WPS -INT Set_ConWpsApCliMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ConWpsApcliAutoPreferIface_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ConWpsApCliDisabled_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ConWpsApDisabled_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CON_WPS */ -INT Set_AP_WscConfMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_WscConfStatus_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_WscPinCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_WscSecurityMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_AP_WscMultiByteCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscVersion_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef VENDOR_FEATURE6_SUPPORT -INT Set_WscUUID_STR_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_WscUUID_HEX_E_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* VENDOR_FEATURE6_SUPPORT */ - -#ifdef WSC_V2_SUPPORT -INT Set_WscV2Support_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscVersion2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscExtraTlvTag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscExtraTlvType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscExtraTlvData_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscSetupLock_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscFragment_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscFragmentSize_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscMaxPinAttack_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_WscSetupLockTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* WSC_V2_SUPPORT */ -INT Set_WscAutoTriggerDisable_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -#endif /* WSC_AP_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -#ifdef MCAST_RATE_SPECIFIC -#ifdef MCAST_BCAST_RATE_SET_SUPPORT -INT Set_McastType(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ -INT Set_McastPhyMode(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_McastMcs(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_McastRate(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* MCAST_RATE_SPECIFIC */ - -#ifdef DOT11N_DRAFT3 -INT Set_OBSSScanParam_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_AP2040ReScan_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* DOT11N_DRAFT3 */ - -INT Set_EntryLifeCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef RTMP_RBUS_SUPPORT -#ifdef LED_CONTROL_SUPPORT -INT Set_WlanLed_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* LED_CONTROL_SUPPORT */ -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef AP_QLOAD_SUPPORT -INT Set_QloadClr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* QLOAD ALARM */ -INT Set_QloadAlarmTimeThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_QloadAlarmNumThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* AP_QLOAD_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -INT Set_MemDebug_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef CONFIG_AP_SUPPORT -INT Set_PowerSaveLifeTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef DYNAMIC_VGA_SUPPORT -INT Set_DyncVgaEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT set_false_cca_hi_th(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_false_cca_low_th(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* DYNAMIC_VGA_SUPPORT */ - -#ifdef MT_MAC -INT Set_AP_TimEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT setApTmrEnableProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_TmrCalResult_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef CUT_THROUGH -INT Set_CutThrough_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CUT_THROUGH */ - -#ifdef DBG -INT set_tim_update_proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_AP_DumpTime_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_BcnStateCtrl_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /*DBG*/ - -#ifdef PRE_CAL_TRX_SET1_SUPPORT -INT Set_KtoFlash_Debug_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_RDCE_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#ifdef TX_AGG_ADJUST_WKR -INT Set_AggAdjWkr_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /* TX_AGG_ADJUST_WKR */ - -#ifdef RLM_CAL_CACHE_SUPPORT -INT Set_RLM_Cal_Cache_Debug_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /* RLM_CAL_CACHE_SUPPORT */ - -#ifdef PKT_BUDGET_CTRL_SUPPORT -INT Set_PBC_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -#endif /*PKT_BUDGET_CTRL_SUPPORT*/ - -INT Set_BWF_Enable_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -#ifdef CONFIG_HOTSPOT_R2 -INT Set_CR4_Hotspot_Flag(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /* CONFIG_HOTSPOT_R2 */ - -#ifdef HTC_DECRYPT_IOT -INT Set_HTC_Err_TH_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -INT Set_Entry_HTC_Err_Cnt_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -INT Set_WTBL_AAD_OM_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /* HTC_DECRYPT_IOT */ - -#ifdef DHCP_UC_SUPPORT -INT Set_DHCP_UC_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /* DHCP_UC_SUPPORT */ -#endif /* MT_MAC */ - -#ifdef TXSTAT_2040BW_24G_SUPPORT -INT Set_40Bw_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif - -#ifdef CONFIG_TX_DELAY -INT Set_TX_Batch_Cnt_Proc(PRTMP_ADAPTER pAd, char *arg); - -INT Set_Pkt_Min_Len_Proc(PRTMP_ADAPTER pAd, char *arg); - -INT Set_Pkt_Max_Len_Proc(PRTMP_ADAPTER pAd, char *arg); - -INT Set_TX_Delay_Timeout_Proc(PRTMP_ADAPTER pAd, char *arg); -#endif -#ifdef LED_CONTROL_SUPPORT -#ifdef VENDOR_FEATURE7_SUPPORT -INT Set_Led_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -#endif -#ifdef CONFIG_STEERING_API_SUPPORT -VOID RTMPIoctlQueryNaSTAReport(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq); -INT Store_Btm_Action_Frame_Request(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq); -INT Steer_Action(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif - -#ifdef DBG_STARVATION -static INT show_starv_info_proc(struct _RTMP_ADAPTER *ad, char *arg) -{ - starv_log_dump(&ad->starv_log_ctrl); - return TRUE; -} -#endif /*DBG_STARVATION*/ - -static struct { - RTMP_STRING *name; - INT(*set_proc) - (PRTMP_ADAPTER pAdapter, RTMP_STRING *arg); -} * PRTMP_PRIVATE_SET_PROC, RTMP_PRIVATE_SUPPORT_PROC[] = { - { "RateAlg", Set_RateAlg_Proc }, -#ifdef NEW_RATE_ADAPT_SUPPORT - { "PerThrdAdj", Set_PerThrdAdj_Proc }, - { "LowTrafficThrd", Set_LowTrafficThrd_Proc }, - { "TrainUpRule", Set_TrainUpRule_Proc }, - { "TrainUpRuleRSSI", Set_TrainUpRuleRSSI_Proc }, - { "TrainUpLowThrd", Set_TrainUpLowThrd_Proc }, - { "TrainUpHighThrd", Set_TrainUpHighThrd_Proc }, -#endif /* NEW_RATE_ADAPT_SUPPORT */ - { "CountryRegion", Set_CountryRegion_Proc }, - { "CountryRegionABand", Set_CountryRegionABand_Proc }, - { "CountryString", Set_CountryString_Proc }, - { "CountryCode", Set_CountryCode_Proc }, -#ifdef EXT_BUILD_CHANNEL_LIST - { "ChGeography", Set_ChGeography_Proc }, -#endif /* EXT_BUILD_CHANNEL_LIST */ -#ifdef AIR_MONITOR - { "mnt_en", Set_Enable_Air_Monitor_Proc }, - { "mnt_rule", Set_MonitorRule_Proc }, - { "mnt_sta", Set_MonitorTarget_Proc }, - { "mnt_idx", Set_MonitorIndex_Proc }, - { "mnt_show", Set_MonitorShowAll_Proc }, - { "mnt_clr", Set_MonitorClearCounter_Proc }, - { "mnt_sta0", Set_MonitorTarget0_Proc }, - { "mnt_sta1", Set_MonitorTarget1_Proc }, - { "mnt_sta2", Set_MonitorTarget2_Proc }, - { "mnt_sta3", Set_MonitorTarget3_Proc }, - { "mnt_sta4", Set_MonitorTarget4_Proc }, - { "mnt_sta5", Set_MonitorTarget5_Proc }, - { "mnt_sta6", Set_MonitorTarget6_Proc }, - { "mnt_sta7", Set_MonitorTarget7_Proc }, - { "mnt_sta8", Set_MonitorTarget8_Proc }, - { "mnt_sta9", Set_MonitorTarget9_Proc }, - { "mnt_sta10", Set_MonitorTarget10_Proc }, - { "mnt_sta11", Set_MonitorTarget11_Proc }, - { "mnt_sta12", Set_MonitorTarget12_Proc }, - { "mnt_sta13", Set_MonitorTarget13_Proc }, - { "mnt_sta14", Set_MonitorTarget14_Proc }, - { "mnt_sta15", Set_MonitorTarget15_Proc }, -#endif /* AIR_MONITOR */ -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -#endif -#ifdef A4_CONN - { "APProxyStatus", Set_APProxy_Status_Show_Proc }, - { "APProxyRefresh", Set_APProxy_Refresh_Proc }, -#endif /* A4_CONN */ - { "SSID", Set_AP_SSID_Proc }, - { "WirelessMode", Set_WirelessMode_Proc }, - { "BasicRate", Set_BasicRate_Proc }, - { "ShortSlot", Set_ShortSlot_Proc }, - { "ProbeRspTimes", Set_Probe_Rsp_Times_Proc }, - { "Channel", Set_Channel_Proc }, -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - { "V10Converter", Set_V10ConverterMode_Proc }, -#endif /*CONVERTER_MODE_SWITCH_SUPPORT*/ -#ifdef REDUCE_TCP_ACK_SUPPORT - { "ReduceAckEnable", Set_ReduceAckEnable_Proc }, - { "ReduceAckProb", Set_ReduceAckProb_Proc }, -#endif - { "BeaconPeriod", Set_BeaconPeriod_Proc }, - { "DtimPeriod", Set_DtimPeriod_Proc }, - { "TxPower", Set_TxPower_Proc }, - { "MaxTxPwr", Set_MaxTxPwr_Proc }, - { "BGProtection", Set_BGProtection_Proc }, - { "DisableOLBC", Set_OLBCDetection_Proc }, - { "TxPreamble", Set_TxPreamble_Proc }, - { "RTSThreshold", Set_RTSThreshold_Proc }, - { "FragThreshold", Set_FragThreshold_Proc }, - { "TxBurst", Set_TxBurst_Proc }, - { "MbssMaxStaNum", Set_AP_PerMbssMaxStaNum_Proc }, -#ifdef MBSS_AS_WDS_AP_SUPPORT - { "wds", Set_Wds_Proc }, - { "WdsMac", Set_WdsMac_Proc }, -#endif -#ifdef RTMP_MAC_PCI - { "ShowRF", Set_ShowRF_Proc }, -#endif /* RTMP_MAC_PCI */ - { "IdleTimeout", Set_AP_IdleTimeout_Proc }, - { "SlotTime", Set_AP_SlotTime_Proc }, -#ifdef DOT11_N_SUPPORT - { "BASetup", Set_BASetup_Proc }, - { "BADecline", Set_BADecline_Proc }, - { "SendMIMOPS", Set_SendSMPSAction_Proc }, - { "BAOriTearDown", Set_BAOriTearDown_Proc }, - { "BARecTearDown", Set_BARecTearDown_Proc }, - { "HtBw", Set_HtBw_Proc }, - { "HtMcs", Set_HtMcs_Proc }, - { "HtGi", Set_HtGi_Proc }, - { "HtOpMode", Set_HtOpMode_Proc }, - { "HtLdpc", Set_HtLdpc_Proc }, - { "HtStbc", Set_HtStbc_Proc }, - { "HtExtcha", Set_HtExtcha_Proc }, - { "HtMpduDensity", Set_HtMpduDensity_Proc }, - { "HtBaWinSize", Set_HtBaWinSize_Proc }, - { "HtMIMOPS", Set_HtMIMOPSmode_Proc }, - { "HtRdg", Set_HtRdg_Proc }, - { "HtLinkAdapt", Set_HtLinkAdapt_Proc }, - { "HtAmsdu", Set_HtAmsdu_Proc }, - { "HtAutoBa", Set_HtAutoBa_Proc }, - { "HtProtect", Set_HtProtect_Proc }, - { "HtMimoPs", Set_HtMimoPs_Proc }, - { "HtTxStream", Set_HtTxStream_Proc }, - { "HtRxStream", Set_HtRxStream_Proc }, - { "ForceShortGI", Set_ForceShortGI_Proc }, - { "ForceGF", Set_ForceGF_Proc }, - { "HtTxBASize", Set_HtTxBASize_Proc }, - { "BurstMode", Set_BurstMode_Proc }, -#ifdef GREENAP_SUPPORT - { "GreenAP", Set_GreenAP_Proc }, -#endif /* GREENAP_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - { "PcieAspm", set_pcie_aspm_dym_ctrl_cap_proc }, -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - { "HtDisallowTKIP", Set_HtDisallowTKIP_Proc }, -#endif /* DOT11_N_SUPPORT */ - -#ifdef DOT11_VHT_AC - { "VhtBw", Set_VhtBw_Proc }, - { "VhtLdpc", Set_VhtLdpc_Proc }, - { "VhtStbc", Set_VhtStbc_Proc }, - { "VhtBwSignal", set_VhtBwSignal_Proc }, - { "VhtDisallowNonVHT", Set_VhtDisallowNonVHT_Proc }, -#endif /* DOT11_VHT_AC */ -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE - { "V10RssiEnbl", Set_RSSI_Enbl }, -#endif -#ifdef IAPP_SUPPORT - { "IappPID", Set_IappPID_Proc }, -#endif /* IAPP_SUPPORT */ - -#ifdef AGGREGATION_SUPPORT - { "PktAggregate", Set_PktAggregate_Proc }, -#endif /* AGGREGATION_SUPPORT */ - - { "WmmCapable", Set_AP_WmmCapable_Proc }, - - { "BSSAifsn", Set_BSSAifsn_Proc }, - { "BSSCwmin", Set_BSSCwmin_Proc }, - { "BSSCwmax", Set_BSSCwmax_Proc }, - { "BSSTxop", Set_BSSTxop_Proc }, - - { "APAifsn", Set_APAifsn_Proc }, - { "APCwmin", Set_APCwmin_Proc }, - { "APCwmax", Set_APCwmax_Proc }, - { "APTxop", Set_APTxop_Proc }, - - { "NoForwarding", Set_NoForwarding_Proc }, - { "NoForwardingBTNBSSID", Set_NoForwardingBTNSSID_Proc }, - { "NoForwardingMBCast", Set_NoForwardingMBCast_Proc }, - { "HideSSID", Set_HideSSID_Proc }, - { "IEEE80211H", Set_IEEE80211H_Proc }, -#ifdef VLAN_SUPPORT - { "VLANEn", Set_VLANEn_Proc }, - { "VLANID", Set_VLANID_Proc }, - { "VLANPriority", Set_VLANPriority_Proc }, - { "VLANTag", Set_VLAN_TAG_Proc }, - { "VLANPolicy", Set_VLAN_Policy_Proc }, -#endif /*VLAN_SUPPORT*/ - { "AuthMode", Set_SecAuthMode_Proc }, - { "EncrypType", Set_SecEncrypType_Proc }, - { "WpaMixPairCipher", Set_AP_WpaMixPairCipher_Proc }, - { "RekeyInterval", Set_AP_RekeyInterval_Proc }, - { "RekeyMethod", Set_AP_RekeyMethod_Proc }, - { "DefaultKeyID", Set_SecDefaultKeyID_Proc }, - { "Key1", Set_SecKey1_Proc }, - { "Key2", Set_SecKey2_Proc }, - { "Key3", Set_SecKey3_Proc }, - { "Key4", Set_SecKey4_Proc }, - { "AccessPolicy", Set_AccessPolicy_Proc }, - { "ACLAddEntry", Set_ACLAddEntry_Proc }, - { "ACLDelEntry", Set_ACLDelEntry_Proc }, - { "ACLShowAll", Set_ACLShowAll_Proc }, - { "ACLClearAll", Set_ACLClearAll_Proc }, - { "WPAPSK", Set_SecWPAPSK_Proc }, - { "RadioOn", Set_RadioOn_Proc }, - { "Lp", Set_Lp_Proc }, -#ifdef SPECIFIC_TX_POWER_SUPPORT - { "PktPwr", Set_AP_PKT_PWR }, -#endif /* SPECIFIC_TX_POWER_SUPPORT */ - { "AssocReqRssiThres", Set_AP_ASSOC_REQ_RSSI_THRESHOLD }, - { "KickStaRssiLow", Set_AP_KickStaRssiLow_Proc }, -#ifdef OCE_SUPPORT - { "OceRssiThreshold", Set_OceRssiThreshold_Proc }, - { "OceAssocRetryDelay", Set_OceAssocRetryDelay_Proc }, - { "OceFdFrameEnable", Set_OceFdFrameCtrl_Proc }, - { "OceReducedNeighborReport", Set_OceReducedNRIndicate_Proc }, - { "OceDownlinkAvailCap", Set_OceDownlinkAvailCap_Proc }, - { "OceUplinkAvailCap", Set_OceUplinkAvailCap_Proc }, - { "OceReducedWanEnable", Set_OceReducedWanEnable_Proc }, - { "OceEspEnable", Set_OceEspEnable_Proc }, -#endif /* OCE_SUPPORT */ -#ifdef AP_SCAN_SUPPORT - { "SiteSurvey", Set_SiteSurvey_Proc }, - { "AutoChannelSel", Set_AutoChannelSel_Proc }, - { "PartialScan", Set_PartialScan_Proc }, - { "PeriodicPartialScan", Set_PeriodicPartialScan_Proc }, - { "PartialScanTriggerPeriod", Set_PartialScanTriggerPeriod_Proc }, - { "ACSCheckTime", Set_AutoChannelSelCheckTime_Proc }, - { "ClearSiteSurvey", Set_ClearSiteSurvey_Proc }, -#ifdef NEIGHBORING_AP_STAT - { "SetIpi", Set_IPI_RPI_Config_Proc }, - { "CustomScanResult", Set_CustomScanResult_Proc }, -#endif -#endif /* AP_SCAN_SUPPORT */ -#ifdef TXRX_STAT_SUPPORT - { "enable_rssi", Set_Enable_RSSI_Stats }, - { "enable_txrx_stat", Set_Enable_Last_Sec_TXRX_Stats }, -#endif -#ifdef CUSTOMER_RSG_FEATURE - { "ApEnableRadioChStats", Set_ApEnableRadioChStats_Proc }, -#endif -#ifdef CUSTOMER_DCC_FEATURE - { "ApEnableBeaconTable", Set_ApEnableBeaconTable_Proc }, - { "ApChannelSwitch", Set_ApChannelSwitch_Proc }, - { "ApDisableSTAConnect", Set_ApDisableSTAConnect_Proc }, -#endif - { "ResetCounter", Set_ResetStatCounter_Proc }, - { "DisConnectSta", Set_DisConnectSta_Proc }, -#ifdef VENDOR_FEATURE7_SUPPORT - { "DisConnectBssSta", Set_DisConnectBssSta_Proc }, -#endif - { "DisConnectAllSta", Set_DisConnectAllSta_Proc }, -#ifdef DOT1X_SUPPORT - { "IEEE8021X", Set_IEEE8021X_Proc }, - { "PreAuth", Set_PreAuth_Proc }, - { "PMKCachePeriod", Set_AP_PMKCachePeriod_Proc }, - { "own_ip_addr", Set_OwnIPAddr_Proc }, - { "EAPifname", Set_EAPIfName_Proc }, - { "PreAuthifname", Set_PreAuthIfName_Proc }, - { "RADIUS_Server", Set_RADIUS_Server_Proc }, - { "RADIUS_Port", Set_RADIUS_Port_Proc }, - { "RADIUS_Key", Set_RADIUS_Key_Proc }, - { "DeletePMKID", Set_DeletePMKID_Proc }, - { "DumpPMKID", Set_DumpPMKID_Proc }, -#ifdef RADIUS_MAC_ACL_SUPPORT - { "RADIUS_MacAuth_Enable", Set_RADIUS_MacAuth_Enable_Proc }, - { "RADIUS_CacheTimeout", Set_RADIUS_CacheTimeout_Proc }, -#endif /* RADIUS_MAC_ACL_SUPPORT */ -#endif /* DOT1X_SUPPORT */ -#ifdef DBG - { "Debug", Set_Debug_Proc }, - { "DebugCat", Set_DebugCategory_Proc }, -#endif /* DBG */ -#ifdef RANDOM_PKT_GEN - { "TxCtrl", Set_TxCtrl_Proc }, -#endif -#ifdef CSO_TEST_SUPPORT - { "CsCtrl", Set_CsCtrl_Proc }, -#endif - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) - { "RBIST_SwitchMode", Set_RBIST_Switch_Mode }, - { "RBIST_CaptureStart", Set_RBIST_Capture_Start }, - { "RBIST_CaptureStatus", Get_RBIST_Capture_Status }, - { "RBIST_RawDataProc", Get_RBIST_Raw_Data_Proc }, - { "RBIST_IQDataProc", Get_RBIST_IQ_Data_Proc }, - { "WirelessInfo", Get_System_Wireless_Info }, -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - - { "IRR_ADC", Set_IRR_ADC }, - { "IRR_RxGain", Set_IRR_RxGain }, - { "IRR_TTG", Set_IRR_TTG }, - { "IRR_TTGOnOff", Set_IRR_TTGOnOff }, -#ifdef OFFCHANNEL_SCAN_FEATURE - { "ApScanChannel", Set_ApScan_Proc }, - { "ApScanResults", Set_ScanResults_Proc }, -#endif -#ifdef MT_DFS_SUPPORT /* Jelly20150301 */ - { "ShowDfsCh", Set_DfsChannelShow_Proc }, - { "ShowDfsBw", Set_DfsBwShow_Proc }, - { "ShowDfsRDMode", Set_DfsRDModeShow_Proc }, - - { "ShowDfsRegion", Set_DfsRDDRegionShow_Proc }, - { "RadarDetectStart", Set_RadarDetectStart_Proc }, - { "RadarDetectStop", Set_RadarDetectStop_Proc }, - { "ByPassCac", Set_ByPassCac_Proc }, - { "ShowDfsNOP", Show_DfsNonOccupancy_Proc }, - { "DfsNOPClean", Set_DfsNOP_Proc }, - { "RDDReport", Set_RDDReport_Proc }, - { "CSPeriod", Set_CSPeriod_Proc }, -#ifdef TXSTAT_2040BW_24G_SUPPORT - { "Enable2040TXStat", Set_40Bw_Proc }, -#endif - /* DFS zero wait */ - { "DfsZeroWaitCacTime", Set_DfsZeroWaitCacTime_Proc }, - { "DfsDedicatedBwCh", Set_DedicatedBwCh_Proc }, - { "DfsModifyChList", Set_ModifyChannelList_Proc }, - { "DfsDynamicCtrl", Set_DfsZeroWaitDynamicCtrl_Proc }, - { "DfsForceNOP", Set_DfsZeroWaitNOP_Proc }, - { "DfsTargetCh", Set_DfsTargetCh_Proc }, -#endif - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT - { "RadarMinLPN", Set_RadarMinLPN_Proc }, - { "RadarThresholdParam", Set_RadarThresholdParam_Proc }, - { "RadarPulseThresholdParam", Set_RadarPulseThresholdParam_Proc }, - { "RadarDbgLogConfig", Set_RadarDbgLogConfig_Proc }, -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT - { "RadarPulsePattern", Set_RadarTestPulsePattern_Proc }, -#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */ - -#if defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT) - { "RadarShow", Set_RadarShow_Proc }, -#ifdef CARRIER_DETECTION_SUPPORT - { "CarrierDetect", Set_CarrierDetect_Proc }, - { "CarrierCriteria", Set_CarrierCriteria_Proc }, - { "CarrierReCheck", Set_CarrierReCheck_Proc }, - { "CarrierGoneThreshold", Set_CarrierGoneThreshold_Proc }, - { "CarrierDebug", Set_CarrierDebug_Proc }, - { "Delta", Set_CarrierDelta_Proc }, - { "DivFlag", Set_CarrierDivFlag_Proc }, - { "CarrThrd", Set_CarrierThrd_Proc }, - /* v2 functions */ - { "SymRund", Set_CarrierSymRund_Proc }, - { "CarrMask", Set_CarrierMask_Proc }, -#endif /* CARRIER_DETECTION_SUPPORT */ -#endif /* defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT) */ - - { "LegFreqDupEn", SetRaOptionFrequecyDup_Proc }, -#ifdef CONFIG_ATE - { "ATE", SetATE }, - { "ATEMPSDUMP", SetATEMPSDump }, - { "ATEMPSPHY", SetATEMPSPhyMode }, - { "ATEMPSRATE", SetATEMPSRate }, - { "ATEMPSPATH", SetATEMPSPath }, - { "ATEMPSLEN", SetATEMPSPayloadLen }, - { "ATEMPSTXCNT", SetATEMPSPktCnt }, - { "ATEMPSTXPWR", SetATEMPSPwr }, - { "ATEMPSNSS", SetATEMPSNss }, - { "ATEMPSPKTBW", SetATEMPSPktBw }, - { "ATEMPSTXSTART", SetATEMPSStart }, - { "ATELOGEN", SetATELOGEnable }, - { "ATELOGDUMP", SetATELOGDump }, - { "ATEMACTRX", SetATEMACTRx }, - { "ATETXSTREAM", SetATETxStream }, - { "ATERXSTREAM", SetATERxStream }, - { "ATETXSENABLE", SetATETxSEnable }, - { "ATERXFILTER", SetATERxFilter }, - { "ATELOGDIS", SetATELOGDisable }, - { "ATEDEQCNT", SetATEDeqCnt }, - { "ATEQID", SetATEQid }, - { "ATEDA", SetATEDa }, - { "ATESA", SetATESa }, - { "ADCDump", SetADCDump }, - { "ATEBSSID", SetATEBssid }, - { "ATECHANNEL", SetATEChannel }, - { "ATEDUTYCYCLE", set_ate_duty_cycle }, - { "ATEPKTTXTIME", set_ate_pkt_tx_time }, - { "ATECTRLBANDIDX", set_ate_control_band_idx }, -#ifdef MT7615 - { "ATECHANNELEXT", set_ate_channel_ext }, - { "ATESTARTTXEXT", set_ate_start_tx_ext }, -#endif /* MT7615 */ - { "ATEINITCHAN", SetATEInitChan }, -#ifdef RTMP_TEMPERATURE_CALIBRATION - { "ATETEMPCAL", SetATETempCal }, - { "ATESHOWTSSI", SetATEShowTssi }, -#endif /* RTMP_TEMPERATURE_CALIBRATION */ - { "ATETXPOW0", SetATETxPower0 }, - { "ATETXPOW1", SetATETxPower1 }, - { "ATETXPOW2", SetATETxPower2 }, - { "ATETXPOW3", SetATETxPower3 }, - { "ATEFORCETXPOWER", SetATEForceTxPower }, - { "ATETXPOWEVAL", SetATETxPowerEvaluation }, - { "ATETXANT", SetATETxAntenna }, - { "ATERXANT", SetATERxAntenna }, - { "ATERFPOWER", SetATERFPower }, - { "ATEDIGITALPOWER", SetATEDigitalPower }, - { "ATEDCOFFSETI", SetATEDCOffset_I }, - { "ATEDCOFFSETQ", SetATEDCOffset_Q }, - { "ATETXFREQOFFSET", SetATETxFreqOffset }, - { "ATETXBW", SetATETxBw }, - { "ATETXLEN", SetATETxLength }, - { "ATETXCNT", SetATETxCount }, - { "ATETXMCS", SetATETxMcs }, - { "ATEVHTNSS", SetATEVhtNss }, - { "ATETXLDPC", SetATETxLdpc }, - { "ATETXSTBC", SetATETxStbc }, - { "ATETXMODE", SetATETxMode }, - { "ATETXGI", SetATETxGi }, - { "ATERXFER", SetATERxFer }, - { "ATERRF", SetATEReadRF }, -#if (!defined(RTMP_RF_RW_SUPPORT)) && (!defined(RLT_RF)) - { "ATEWRF1", SetATEWriteRF1 }, - { "ATEWRF2", SetATEWriteRF2 }, - { "ATEWRF3", SetATEWriteRF3 }, - { "ATEWRF4", SetATEWriteRF4 }, -#endif /* (!defined(RTMP_RF_RW_SUPPORT)) && (!defined(RLT_RF)) */ - { "ATELDE2P", SetATELoadE2p }, - { "ATERE2P", SetATEReadE2p }, -#ifdef LED_CONTROL_SUPPORT -#endif /* LED_CONTROL_SUPPORT */ - { "ATEAUTOALC", SetATEAutoAlc }, - { "ATETEMPSENSOR", SetATETempSensor }, - { "ATEIPG", SetATEIpg }, - { "ATEPAYLOAD", SetATEPayload }, - { "ATEFIXEDPAYLOAD", SetATEFixedPayload }, -#ifdef TXBF_SUPPORT -#ifdef MT_MAC - { "ATETxBfInit", SetATETxBfDutInitProc }, - { "ATETxBfGdInit", SetATETxBfGdInitProc }, - { "ATETxBfChanProfileUpdate", SetATETxBfChanProfileUpdate }, - { "ATETXBF", SetATETXBFProc }, - { "ATETXSOUNDING", SetATETxSoundingProc }, - { "ATEIBfGdCal", SetATEIBfGdCal }, - { "ATEIBfInstCal", SetATEIBfInstCal }, - { "ATETxBfLnaGain", SetATETxBfLnaGain }, - { "ATEIBfProfileConfig", SetATEIBfProfileUpdate }, - { "ATEEBfProfileConfig", SetATEEBfProfileConfig }, - { "ATETxBfProfileRead", SetATETxBfProfileRead }, - { "ATETxPacketWithBf", SetATETxPacketWithBf }, - { "ATEIBFPhaseE2pUpdate", SetATETxBfPhaseE2pUpdate }, - { "ATEIBFPhaseComp", SetATEIBfPhaseComp }, - { "ATEIBFPhaseVerify", SetATEIBfPhaseVerify }, - { "ATEConTxETxBfGdProc", SetATEConTxETxBfGdProc }, - { "ATEConTxETxBfInitProc", SetATEConTxETxBfInitProc }, - { "ATESPE", SetATESpeIdx }, - { "ATETXEBF", SetATEEBfTx }, - { "ATEEBFCE", SetATEEBFCE }, - { "ATEEBFCEInfo", SetATEEBFCEInfo }, - { "ATEEBFCEHELP", SetATEEBFCEHelp }, -#endif -#endif /* TXBF_SUPPORT */ - { "ATETTR", SetATETtr }, - { "ATESHOW", SetATEShow }, - { "ATEHELP", SetATEHelp }, -#ifdef CONFIG_QA - { "TxStop", SetTxStop }, - { "RxStop", SetRxStop }, -#ifdef DBG - { "EERead", SetEERead }, - { "EEWrite", SetEEWrite }, - { "BBPRead", SetBBPRead }, - { "BBPWrite", SetBBPWrite }, -#endif /* DBG */ -#endif /* CONFIG_QA */ - -#if defined(MT7615) - -#ifdef SINGLE_SKU_V2 - { "ATESINGLESKU", SetATESingleSKUEn }, -#endif /* SINGLE_SKU_V2 */ - - { "BFBackoffMode", SetATEBFBackoffMode }, - { "ATEPowerPercent", SetATEPowerPercentEn }, - { "ATEPowerDropLevel", SetATEPowerPercentCtrl }, - { "ATEBFBackoff", SetATEBFBackoffEn }, - { "ATETempComp", SetATETempCompEn }, - { "ATETSSI", SetATETSSIEn }, - { "ATETXPOWERCTRL", SetATETxPowerCtrlEn }, -#endif /* defined(MT7615) */ - -#endif /* CONFIG_ATE */ - -#ifdef APCLI_SUPPORT - { "ApCliEnable", set_apcli_enable_proc2 }, - { "ApCliSsid", Set_ApCli_Ssid_Proc }, - { "ApCliBssid", Set_ApCli_Bssid_Proc }, - { "ApCliAuthMode", Set_SecAuthMode_Proc }, - { "ApCliEncrypType", Set_SecEncrypType_Proc }, - { "ApCliDefaultKeyID", Set_SecDefaultKeyID_Proc }, - { "ApCliWPAPSK", Set_SecWPAPSK_Proc }, - { "ApCliKey1", Set_SecKey1_Proc }, - { "ApCliKey2", Set_SecKey2_Proc }, - { "ApCliKey3", Set_SecKey3_Proc }, - { "ApCliKey4", Set_SecKey4_Proc }, - { "ApCliTxMode", Set_ApCli_TxMode_Proc }, - { "ApCliTxMcs", Set_ApCli_TxMcs_Proc }, -#ifdef APCLI_CONNECTION_TRIAL - /* - for Trial the root AP which locates on another channel - what if the connection is ok, it will make BSSID switch to the new channel. - */ - { "ApCliTrialCh", Set_ApCli_Trial_Ch_Proc }, -#endif /* APCLI_CONNECTION_TRIAL */ -#ifdef DBDC_MODE - { "ApCliWirelessMode", Set_ApCli_WirelessMode_Proc }, -#endif /*DBDC_MODE*/ -#ifdef APCLI_AUTO_CONNECT_SUPPORT - { "ApCliAutoConnect", Set_ApCli_AutoConnect_Proc }, -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - -#ifdef MAC_REPEATER_SUPPORT - { "MACRepeaterEn", Set_ReptMode_Enable_Proc }, - { "CliLinkMAP", Set_Cli_Link_Map_Proc }, -#endif /* MAC_REPEATER_SUPPORT */ -#ifdef CONFIG_MAP_SUPPORT - { "bhbss", Set_Bh_Bss_Proc }, - { "fhbss", Set_Fh_Bss_Proc }, - { "mapEnable", Set_Map_Proc }, - { "MapChannel", Set_Map_Channel_Proc }, - { "MapChannelEn", Set_Map_Channel_En_Proc }, -#ifdef MAP_R2 - { "mapR2Enable", Set_MapR2_Proc }, - { "ts_bh_primary_vid", Set_Map_Bh_Primary_Vid_Proc }, - { "ts_bh_primary_pcp", Set_Map_Bh_Primary_Pcp_Proc }, - { "ts_bh_vid", Set_Map_Bh_Vid_Proc }, - { "ts_fh_vid", Set_Map_Fh_Vid_Proc }, - { "transparent_vid", Set_Map_Transparent_Vid_Proc }, -#endif -#ifdef MAP_TS_TRAFFIC_SUPPORT - { "mapTSEnable", Set_MapTS_Proc }, -#endif -#ifdef MAP_BL_SUPPORT - { "BlAdd", Set_BlackList_Add }, - { "BlDel", Set_BlackList_Del }, - { "BlShow", Set_BlackList_Show }, -#endif /* MAP_BL_SUPPORT */ -#endif /* CONFIG_MAP_SUPPORT */ - { "QuickChannelSwitch", Set_Quick_Channel_Switch_En_Proc }, -#ifdef DYNAMIC_VLAN_SUPPORT - { "dvlan", Set_Dvlan_Proc }, -#endif - -#ifdef RADIUS_MAC_AUTH_SUPPORT - { "radius_auth_enable", Set_Radius_Mac_Auth_Policy_Proc }, -#endif /* RADIUS_MAC_AUTH_SUPPORT */ -#ifdef WSC_AP_SUPPORT - { "ApCliWscSsid", Set_AP_WscSsid_Proc }, - { "ApCliWscScanMode", Set_ApCli_WscScanMode_Proc }, -#endif /* WSC_AP_SUPPORT */ - -#ifdef APCLI_CERT_SUPPORT - { "ApCliCertEnable", Set_ApCli_Cert_Enable_Proc }, - /* Add for APCLI PMF 5.3.3.3 option test item. (Only Tx De-auth Req. and make sure the pkt can be Encrypted) */ - { "ApCliTxDeAuth", ApCliTxDeAuth }, -#endif /* APCLI_CERT_SUPPORT */ - -#ifdef WSC_AP_SUPPORT - { "WpsCertEnable", Set_Wps_Cert_Enable_Proc }, -#endif - -#ifdef DOT11W_PMF_SUPPORT - { "ApCliPMFMFPC", Set_ApCliPMFMFPC_Proc }, - { "ApCliPMFMFPR", Set_ApCliPMFMFPR_Proc }, - { "ApCliPMFSHA256", Set_ApCliPMFSHA256_Proc }, -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef ROAMING_ENHANCE_SUPPORT - { "RoamingEnhance", Set_RoamingEnhance_Enable_Proc }, -#endif /* ROAMING_ENHANCE_SUPPORT */ -#ifdef APCLI_SAE_SUPPORT - { "ApCliSAEGroup", set_apcli_sae_group_proc }, -#endif /* APCLI_SAE_SUPPORT */ -#ifdef APCLI_OWE_SUPPORT - { "ApCliOWEGroup", set_apcli_owe_group_proc }, -#endif /* APCLI_SAE_SUPPORT */ -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - { "ApCliDelPMKIDList", set_apcli_del_pmkid_list }, -#endif /* defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) */ -#endif /* APCLI_SUPPORT */ -#ifdef WSC_AP_SUPPORT -#ifdef CON_WPS - { "ConWpsApCliMode", Set_ConWpsApCliMode_Proc }, - { "ConWpsApCliDisabled", Set_ConWpsApCliDisabled_Proc }, - { "ConWpsApDisabled", Set_ConWpsApDisabled_Proc }, - { "ConWpsApcliPreferIface", Set_ConWpsApcliAutoPreferIface_Proc }, -#endif /* CON_WPS */ - { "WscConfMode", Set_AP_WscConfMode_Proc }, - { "WscConfStatus", Set_AP_WscConfStatus_Proc }, - { "WscMode", Set_AP_WscMode_Proc }, - { "WscStatus", Set_WscStatus_Proc }, - { "WscGetConf", Set_AP_WscGetConf_Proc }, - { "WscPinCode", Set_AP_WscPinCode_Proc }, - { "WscStop", Set_WscStop_Proc }, - { "WscGenPinCode", Set_WscGenPinCode_Proc }, - { "WscVendorPinCode", Set_WscVendorPinCode_Proc }, - { "WscSecurityMode", Set_AP_WscSecurityMode_Proc }, - { "WscMultiByteCheck", Set_AP_WscMultiByteCheck_Proc }, - { "WscVersion", Set_WscVersion_Proc }, -#ifdef VENDOR_FEATURE6_SUPPORT - /* HEX : 32 Length */ - { "WscUUID_E", Set_WscUUID_HEX_E_Proc }, - /* 37 Length */ - { "WscUUID_Str", Set_WscUUID_STR_Proc }, -#endif /* VENDOR_FEATURE6_SUPPORT */ -#ifdef WSC_V2_SUPPORT - { "WscV2Support", Set_WscV2Support_Proc }, - { "WscVersion2", Set_WscVersion2_Proc }, - { "WscExtraTlvTag", Set_WscExtraTlvTag_Proc }, - { "WscExtraTlvType", Set_WscExtraTlvType_Proc }, - { "WscExtraTlvData", Set_WscExtraTlvData_Proc }, - { "WscSetupLock", Set_WscSetupLock_Proc }, - { "WscFragment", Set_WscFragment_Proc }, - { "WscFragmentSize", Set_WscFragmentSize_Proc }, - { "WscMaxPinAttack", Set_WscMaxPinAttack_Proc }, - { "WscSetupLockTime", Set_WscSetupLockTime_Proc }, -#endif /* WSC_V2_SUPPORT */ - { "WscAutoTriggerDisable", Set_WscAutoTriggerDisable_Proc }, -#endif /* WSC_AP_SUPPORT */ -#ifdef UAPSD_SUPPORT - { "UAPSDCapable", Set_UAPSD_Proc }, -#endif /* UAPSD_SUPPORT */ -#ifdef IGMP_SNOOP_SUPPORT - { "IgmpSnEnable", Set_IgmpSn_Enable_Proc }, - { "IgmpAdd", Set_IgmpSn_AddEntry_Proc }, - { "IgmpDel", Set_IgmpSn_DelEntry_Proc }, - { "IgmpFloodingCIDR", Set_Igmp_Flooding_CIDR_Proc }, -#ifdef IGMP_TVM_SUPPORT - { "IgmpSnExemptIP", Set_IgmpSn_BlackList_Proc }, - { "IgmpSnAgeOut", Set_IgmpSn_AgeOut_Proc }, -#endif /* IGMP_TVM_SUPPORT */ -#endif /* IGMP_SNOOP_SUPPORT */ -#ifdef CONFIG_AP_SUPPORT -#ifdef MCAST_RATE_SPECIFIC -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - { "McastType", Set_McastType }, -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - { "McastPhyMode", Set_McastPhyMode }, - { "McastMcs", Set_McastMcs }, -#endif /* MCAST_RATE_SPECIFIC */ -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - { "BcnPhyMode", Set_BcnPhyMode }, - { "BcnMcs", Set_BcnMcs }, -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - { "FixedTxMode", Set_FixedTxMode_Proc }, -#ifdef CONFIG_APSTA_MIXED_SUPPORT - { "OpMode", Set_OpMode_Proc }, -#endif /* CONFIG_APSTA_MIXED_SUPPORT */ -#ifdef DSCP_PRI_SUPPORT - { "DscpPri", Set_Dscp_Pri_Proc }, -#endif - -#ifdef TXBF_SUPPORT -#if (!defined(MT_MAC)) - { "TxBfTag", Set_TxBfTag_Proc }, - { "ReadITxBf", Set_ReadITxBf_Proc }, - { "WriteITxBf", Set_WriteITxBf_Proc }, - { "StatITxBf", Set_StatITxBf_Proc }, - { "ReadETxBf", Set_ReadETxBf_Proc }, - { "WriteETxBf", Set_WriteETxBf_Proc }, - { "StatETxBf", Set_StatETxBf_Proc }, - { "ITxBfTimeout", Set_ITxBfTimeout_Proc }, - { "ETxBfTimeout", Set_ETxBfTimeout_Proc }, - { "ITxBfCal", Set_ITxBfCal_Proc }, - { "ITxBfLnaCal", Set_ITxBfLnaCal_Proc }, -#endif /* MT76x2, MT_MAC */ - { "InvTxBfTag", Set_InvTxBfTag_Proc }, - { "ITxBfDivCal", Set_ITxBfDivCal_Proc }, - - { "ITxBfEn", Set_ITxBfEn_Proc }, - { "ETxBfEnCond", Set_ETxBfEnCond_Proc }, - { "ETxBfCodebook", Set_ETxBfCodebook_Proc }, - { "ETxBfCoefficient", Set_ETxBfCoefficient_Proc }, - { "ETxBfGrouping", Set_ETxBfGrouping_Proc }, - { "ETxBfNoncompress", Set_ETxBfNoncompress_Proc }, - { "ETxBfIncapable", Set_ETxBfIncapable_Proc }, - { "NoSndgCntThrd", Set_NoSndgCntThrd_Proc }, - { "NdpSndgStreams", Set_NdpSndgStreams_Proc }, - -#ifdef MT_MAC - { "TxBfTxApply", Set_TxBfTxApply }, - { "TriggerSounding", Set_Trigger_Sounding_Proc }, - { "StopSounding", Set_Stop_Sounding_Proc }, - { "StaRecBfUpdate", Set_StaRecBfUpdate }, - { "StaRecBfRead", Set_StaRecBfRead }, - { "TxBfAwareCtrl", Set_TxBfAwareCtrl }, -#ifdef CONFIG_ATE - { "StaRecCmmUpdate", Set_StaRecCmmUpdate }, - { "BssInfoUpdate", Set_BssInfoUpdate }, - { "DevInfoUpdate", Set_DevInfoUpdate }, - { "ManualAssoc", SetATEAssocProc }, -#endif /* CONFIG_ATE */ - { "TxBfPfmuMemAlloc", Set_TxBfPfmuMemAlloc }, - { "TxBfPfmuMemRelease", Set_TxBfPfmuMemRelease }, - { "TxBfPfmuMemAllocMapRead", Set_TxBfPfmuMemAllocMapRead }, - { "TxBfProfileTagHelp", Set_TxBfProfileTag_Help }, - { "TxBfProfileTagInValid", Set_TxBfProfileTag_InValid }, - { "TxBfProfileTagPfmuIdx", Set_TxBfProfileTag_PfmuIdx }, - { "TxBfProfileTagBfType", Set_TxBfProfileTag_BfType }, - { "TxBfProfileTagBw", Set_TxBfProfileTag_DBW }, - { "TxBfProfileTagSuMu", Set_TxBfProfileTag_SuMu }, - { "TxBfProfileTagMemAlloc", Set_TxBfProfileTag_Mem }, - { "TxBfProfileTagMatrix", Set_TxBfProfileTag_Matrix }, - { "TxBfProfileTagSnr", Set_TxBfProfileTag_SNR }, - { "TxBfProfileTagSmtAnt", Set_TxBfProfileTag_SmartAnt }, - { "TxBfProfileTagSeIdx", Set_TxBfProfileTag_SeIdx }, - { "TxBfProfileTagRmsdThrd", Set_TxBfProfileTag_RmsdThrd }, - { "TxBfProfileTagMcsThrd", Set_TxBfProfileTag_McsThrd }, - { "TxBfProfileTagTimeOut", Set_TxBfProfileTag_TimeOut }, - { "TxBfProfileTagDesiredBw", Set_TxBfProfileTag_DesiredBW }, - { "TxBfProfileTagDesiredNc", Set_TxBfProfileTag_DesiredNc }, - { "TxBfProfileTagDesiredNr", Set_TxBfProfileTag_DesiredNr }, - { "TxBfProfileTagRead", Set_TxBfProfileTagRead }, - { "TxBfProfileTagWrite", Set_TxBfProfileTagWrite }, - { "TxBfProfileDataRead", Set_TxBfProfileDataRead }, - { "TxBfProfileDataWrite", Set_TxBfProfileDataWrite }, - { "TxBfProfilePnRead", Set_TxBfProfilePnRead }, - { "TxBfProfilePnWrite", Set_TxBfProfilePnWrite }, -#ifdef TXBF_DYNAMIC_DISABLE - { "TxBfDisable", Set_TxBfDynamicDisable_Proc }, -#endif /* TXBF_DYNAMIC_DISABLE */ -#endif /* MT_MAC */ - -#endif /* TXBF_SUPPORT */ -#ifdef VHT_TXBF_SUPPORT - { "VhtNDPA", Set_VhtNDPA_Sounding_Proc }, -#endif /* VHT_TXBF_SUPPORT */ - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - { "wf_fwd", Set_WifiFwd_Proc }, - { "wf_fwd_down", Set_WifiFwd_Down }, - { "wf_fwd_acs", Set_WifiFwdAccessSchedule_Proc }, - { "wf_fwd_hij", Set_WifiFwdHijack_Proc }, - { "wf_fwd_bpdu", Set_WifiFwdBpdu_Proc }, - { "wf_fwd_rep", Set_WifiFwdRepDevice }, - { "wf_fwd_show", Set_WifiFwdShowEntry }, - { "wf_fwd_del", Set_WifiFwdDeleteEntry }, - { "pkt_src_show", Set_PacketSourceShowEntry }, - { "pkt_src_del", Set_PacketSourceDeleteEntry }, - { "wf_fwd_bridge", Set_WifiFwdBridge_Proc }, -#endif /* CONFIG_WIFI_PKT_FWD */ - -#ifdef MT_MAC -#ifdef DBG - { "FixedRate", Set_Fixed_Rate_Proc }, - { "FixedRateFallback", Set_Fixed_Rate_With_FallBack_Proc }, - { "RaDebug", Set_RA_Debug_Proc }, -#endif /* DBG */ - { "ForceVhtForHt", Set_Force_Vht_For_Ht }, -#endif /* MT_MAC */ - -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - { "SupRateSet", Set_SupRateSet_Proc }, - { "HtSupRateSet", Set_HtSupRateSet_Proc }, - { "VhtSupRateSet", Set_VhtSupRateSet_Proc }, -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - -#ifdef STREAM_MODE_SUPPORT - { "StreamMode", Set_StreamMode_Proc }, - { "StreamModeMac", Set_StreamModeMac_Proc }, - { "StreamModeMCS", Set_StreamModeMCS_Proc }, -#endif /* STREAM_MODE_SUPPORT */ - - { "LongRetry", Set_LongRetryLimit_Proc }, - { "ShortRetry", Set_ShortRetryLimit_Proc }, - { "AutoFallBack", Set_AutoFallBack_Proc }, -#ifdef RTMP_MAC_PCI -#ifdef DBG_DIAGNOSE - { "DiagOpt", Set_DiagOpt_Proc }, - { "diag_cond", Set_diag_cond_Proc }, -#endif /* DBG_DIAGNOSE */ -#endif /* RTMP_MAC_PCI */ - - { "MeasureReq", Set_MeasureReq_Proc }, - { "TpcReq", Set_TpcReq_Proc }, - { "TpcReqByAddr", Set_TpcReqByAddr_Proc }, - { "PwrConstraint", Set_PwrConstraint }, -#ifdef TPC_SUPPORT - { "TpcCtrl", Set_TpcCtrl_Proc }, - { "TpcEn", Set_TpcEnable_Proc }, -#endif /* TPC_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - { "BcnReq", Set_BeaconReq_Proc }, - { "BcnReqRandInt", Set_BeaconReq_RandInt_Proc }, - { "LinkReq", Set_LinkMeasureReq_Proc }, - { "RrmEnable", Set_Dot11kRRM_Enable_Proc }, - { "TxReq", Set_TxStreamMeasureReq_Proc }, - - /* only for selftesting and debugging. */ - { "rrm", Set_RRM_Selftest_Proc }, -#endif /* DOT11K_RRM_SUPPORT */ - { "RegDomain", Set_Reg_Domain_Proc }, -#ifdef CONFIG_DOT11V_WNM - { "WNMCertEnable", Set_WNMCertEnable_Proc }, - { "SendBTMReq", Set_SendBTMReq_Proc }, -#endif -#ifdef DOT11N_DRAFT3 - { "OBSSScanParam", Set_OBSSScanParam_Proc }, - { "AP2040Rescan", Set_AP2040ReScan_Proc }, - { "HtBssCoex", Set_HT_BssCoex_Proc }, - { "HtBssCoexApCntThr", Set_HT_BssCoexApCntThr_Proc }, -#endif /* DOT11N_DRAFT3 */ - { "EntryLifeCheck", Set_EntryLifeCheck_Proc }, -#ifdef DOT11R_FT_SUPPORT - { "ft", FT_Ioctl }, - { "ftenable", Set_FT_Enable }, - { "ftmdid", Set_FT_Mdid }, - { "ftr0khid", Set_FT_R0khid }, - { "ftric", Set_FT_RIC }, - { "ftotd", Set_FT_OTD }, -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef RTMP_EFUSE_SUPPORT - { "efuseLoadFromBin", - set_eFuseLoadFromBin_Proc }, /* For backward compatible, the usage is the same as bufferLoadFromBin + bufferWriteBack */ - { "efuseFreeNumber", set_eFuseGetFreeBlockCount_Proc }, - { "efuseDump", set_eFusedump_Proc }, -#ifdef CONFIG_ATE - { "bufferLoadFromEfuse", Set_LoadEepromBufferFromEfuse_Proc }, -#ifdef BB_SOC - { "efuseBufferModeWriteBack", set_BinModeWriteBack_Proc }, -#else - { "efuseBufferModeWriteBack", - set_eFuseBufferModeWriteBack_Proc }, /* For backward compatible, the usage is the same as bufferWriteBack */ -#endif -#endif /* CONFIG_ATE */ -#endif /* RTMP_EFUSE_SUPPORT */ - { "bufferLoadFromBin", Set_LoadEepromBufferFromBin_Proc }, - { "bufferWriteBack", Set_EepromBufferWriteBack_Proc }, - { "bufferMode", Set_bufferMode_Proc }, - -#ifdef CAL_FREE_IC_SUPPORT - { "bufferLoadFromCalFree", Set_LoadCalFreeData_Proc }, - { "CheckCalFree", Set_CheckCalFree_Proc }, -#endif - -#ifdef RF_LOCKDOWN - { "CalFreeApply", SetCalFreeApply }, -#if defined(MT7615) - { "WriteEffuseRFpara", SetWriteEffuseRFpara }, -#endif -#endif /* RF_LOCKDOWN */ - -#ifdef RTMP_RBUS_SUPPORT -#ifdef LED_CONTROL_SUPPORT - { "WlanLed", Set_WlanLed_Proc }, -#endif /* LED_CONTROL_SUPPORT */ -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef AP_QLOAD_SUPPORT - { "qloadclr", Set_QloadClr_Proc }, - { "qloadalarmtimethres", - Set_QloadAlarmTimeThreshold_Proc }, /* QLOAD ALARM */ - { "qloadalarmnumthres", - Set_QloadAlarmNumThreshold_Proc }, /* QLOAD ALARM */ -#endif /* AP_QLOAD_SUPPORT */ - - { "ra_interval", Set_RateAdaptInterval }, - -#ifdef THERMAL_PROTECT_SUPPORT - { "tpc", set_thermal_protection_criteria_proc }, - { "tpc_duty", set_thermal_protection_admin_ctrl_duty_proc }, -#endif /* THERMAL_PROTECT_SUPPORT */ - -#ifdef SMART_ANTENNA - { "sa", Set_SmartAnt_Proc }, - { "sa_msc", Set_McsStableCnt_Proc }, - { "sa_mcs", Set_SA_McsBound_Proc }, - { "sa_sta", Set_SA_Station_Proc }, - { "sa_starule", Set_SA_StationCandRule_Proc }, - { "sa_mode", Set_SA_Mode_Proc }, - { "sa_txNss", set_SA_txNss_Proc }, - { "sa_ant", Set_SA_StaticAntPair_Proc }, - { "sa_agsp", Set_SA_AGSP_Proc }, - { "sa_tseq", Set_SA_TrainSeq_Proc }, - { "sa_tdelay", Set_SA_TrainDelay_Proc }, - { "sa_tcond", Set_SA_TrainCond_Proc }, - { "sa_rssivar", Set_SA_RssiVariance_Proc }, - { "sa_rssith", Set_SA_RssiThreshold_Proc }, - { "sa_skipconf", Set_SA_SkipConfirmStage_Proc }, - { "sa_tcand", Set_SA_AntCand_Proc }, - { "sa_tp", Set_TestPeriod_Proc }, - { "sa_tc", Set_MaxAntennaTry_Proc }, - { "sa_dbg", Set_DbgLogOn_Proc }, -#endif /* SMART_ANTENNA // */ - - { "memdebug", Set_MemDebug_Proc }, - -#ifdef CONFIG_AP_SUPPORT - { "pslifetime", Set_PowerSaveLifeTime_Proc }, - -#ifdef MBSS_SUPPORT - { "MBSSWirelessMode", Set_MBSS_WirelessMode_Proc }, -#endif /* MBSS_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - - { "VcoPeriod", Set_VcoPeriod_Proc }, -#ifdef SNIFFER_SUPPORT - { "MonitorMode", Set_MonitorMode_Proc }, - { "MonitorFilterSize", Set_MonitorFilterSize_Proc }, - { "MonitorFrameType", Set_MonitorFrameType_Proc }, - { "MonitorMacFilter", Set_MonitorMacFilter_Proc }, - { "MonitorMacFilterOff", Set_MonitorMacFilterOff_Proc }, -#endif /* SNIFFER_SUPPORT */ - -#ifdef DOT11W_PMF_SUPPORT - { "PMFMFPC", Set_PMFMFPC_Proc }, - { "PMFMFPR", Set_PMFMFPR_Proc }, - { "PMFSHA256", Set_PMFSHA256_Proc }, - { "PMFSA_Q", Set_PMFSA_Q_Proc }, -#endif /* DOT11W_PMF_SUPPORT */ - -#ifdef MICROWAVE_OVEN_SUPPORT - { "MO_FalseCCATh", Set_MO_FalseCCATh_Proc }, -#endif /* MICROWAVE_OVEN_SUPPORT */ - - { "no_bcn", set_no_bcn }, - -#if defined(WFA_VHT_PF) || defined(MT7603_FPGA) || defined(MT7628_FPGA) || \ - defined(MT7636_FPGA) || defined(MT7637_FPGA) - { "force_amsdu", set_force_amsdu }, -#endif /* defined(WFA_VHT_PF) || defined(MT7603_FPGA) */ - -#ifdef WFA_VHT_PF - { "nss_mcs_opt", set_vht_nss_mcs_opt }, /* SIGMA */ - { "opt_md_notif_ie", set_vht_opmode_notify_ie }, /* SIGMA */ - { "force_op", set_force_operating_mode }, - { "force_noack", set_force_noack }, - { "force_vht_sgi", set_force_vht_sgi }, - { "force_vht_stbc", set_force_vht_tx_stbc }, - { "ext_cca", set_force_ext_cca }, -#endif /* WFA_VHT_PF */ - { "rf", SetRF }, - { "tssi_enable", set_tssi_enable }, -#ifdef DYNAMIC_VGA_SUPPORT - { "DyncVgaEnable", Set_DyncVgaEnable_Proc }, - { "fc_hth", set_false_cca_hi_th }, - { "fc_lth", set_false_cca_low_th }, -#endif /* DYNAMIC_VGA_SUPPORT */ -#ifdef MT_MAC - { "TimEnable", - Set_AP_TimEnable_Proc }, /* only for development purpose!! iwpriv ra0 set */ - { "TmrVer", setTmrVerProc }, - { "TmrEnable", - setTmrEnableProc }, /* 0: disalbe, 1: initialiter, 2: responser. */ - { "TmrCal", SetTmrCalProc }, -#ifdef FTM_SUPPORT - { "FtmReq", Set_FtmReqTx_Proc }, - { "FtmAsap", Set_FtmAsapReq_Proc }, - { "FtmMinDelta", Set_FtmMinDelta_Proc }, - { "FtmNum", Set_FtmNum_Proc }, - { "FtmBurstExp", Set_FtmBurstExp_Proc }, - { "FtmBurstDur", Set_FtmBurstDuration_Proc }, - { "FtmBurstPeriod", Set_FtmBurstPeriod_Proc }, - { "FtmLciValue", Set_FtmLciValue_Proc }, - { "FtmLciLat", Set_FtmLciLat_ThisAP_Proc }, - { "FtmLciLng", Set_FtmLciLng_ThisAP_Proc }, - { "FtmLciAlt", Set_FtmLciAlt_ThisAP_Proc }, - { "FtmLciKnown", Set_FtmLciKnown_Proc }, - { "FtmLci", Set_FtmLciFlag_Proc }, - { "FtmZ", Set_FtmZFlag_Proc }, - { "FtmCivicKnown", Set_FtmCivicKnown_Proc }, - { "FtmCivic", Set_FtmCivicFlag_Proc }, - { "Anqp", Send_ANQP_Req_For_Test }, - { "Nrpt", Send_NeighborReq_For_Test }, - { "RM", Send_RadioMeasurement_Req_For_Test }, - { "RMMinAp", Set_FtmRMMinimumApCount_Proc }, - { "RMRandomInt", Set_FtmRMRandomizationInterval_Proc }, -#endif /* FTM_SUPPORT */ - - /* support CR4 cmds */ - { "cr4_query", set_cr4_query }, - { "cr4_set", set_cr4_set }, - { "cr4_capability", set_cr4_capability }, - { "cr4_debug", set_cr4_debug }, - - { "dump_remap_cr", dump_remap_cr_content }, - { "ReCal", set_re_calibration }, - { "ThermalReCalMode", set_thermal_recal_mode }, - { "get_fid", set_get_fid }, - { "fwlog", set_fw_log }, - { "isrcmd", set_isr_cmd }, - { "txop", set_txop_cfg }, - { "rts", set_rts_cfg }, - { "fwset", set_fw_cmd }, - { "fwget", get_fw_cmd }, - -#ifdef FW_DUMP_SUPPORT - { "fwdump_maxsize", set_fwdump_max_size }, - { "fwdump_path", set_fwdump_path }, - { "fwdump_print", fwdump_print }, -#endif - { "protect", set_manual_protect }, - { "rdg", set_manual_rdg }, - { "cca_en", set_cca_en }, -#ifdef DBG - { "DumpTime", - Set_AP_DumpTime_Proc }, /* only for development purpose!! iwpriv ra0 set */ - { "BcnStateCtrl", - Set_BcnStateCtrl_Proc }, /* only for development purpose!! iwpriv ra0 set */ - { "trigger_tim", set_tim_update_proc }, -#endif -#ifdef CUT_THROUGH - { "cut_through", Set_CutThrough_Proc }, -#endif /* CUT_THROUGH */ -#ifdef RTMP_MAC_PCI - { "pse_dbg", SetPSEWatchDog_Proc }, - { "pdma_dbg", Set_PDMAWatchDog_Proc }, -#endif - { "get_thermal_sensor", Set_themal_sensor }, -#ifdef CFG_SUPPORT_MU_MIMO - { "hqa_mu_cal_init_mcs", hqa_mu_cal_init_mcs }, - { "hqa_mu_cal_lq", hqa_mu_cal_lq }, - { "hqa_su_cal_lq", hqa_su_cal_lq }, - { "hqa_mu_set_snr_offset", hqa_mu_set_snr_offset }, - { "hqa_mu_set_zero_nss", hqa_mu_set_zero_nss }, - { "hqa_mu_set_speedup_lq", hqa_mu_set_speedup_lq }, - { "hqa_mu_set_mu_tbl", hqa_mu_set_mu_table }, - { "hqa_mu_set_group", hqa_mu_set_group }, - { "hqa_mu_set_enable", hqa_mu_set_enable }, - { "hqa_mu_set_gid_up", hqa_mu_set_gid_up }, - { "hqa_mu_set_trigger_mu_tx", hqa_mu_set_trigger_mu_tx }, - - /* jeffrey, 20141116 */ - /* the followings are relative to MU debbuging/verification, and not use for ATE */ - { "set_mu_profile", SetMuProfileProc }, /* set MU profile */ - { "set_mu_grouptbl", SetGroupTblEntryProc }, /* set group table entry */ - { "set_mu_clustertbl", - SetClusterTblEntryProc }, /* set cluster table entry */ - { "set_mu_enable", SetMuEnableProc }, /* set MU enable or disable */ - { "set_mu_groupuserthreshold", - SetGroupUserThresholdProc }, /* set group threshold */ - { "set_mu_groupnssthreshold", - SetGroupNssThresholdProc }, /* set group NSS */ - { "set_mu_txreqmintime", - SetTxReqMinTimeProc }, /* set TX req min. time */ - { "set_mu_calcinitmcs", - SetCalculateInitMCSProc }, /* set calculate init MCS */ - { "set_mu_sunsscheck", - SetSuNssCheckProc }, /* set enable or disable NSS check */ - { "set_mu_txopdefault", - SetTxopDefaultProc }, /* set MU enable or disable */ - { "set_mu_sulossthreshold", - SetSuLossThresholdProc }, /* set SU loss threshold */ - { "set_mu_mugainthreshold", - SetMuGainThresholdProc }, /* set MU gain threshold */ - { "set_mu_secondaryacpolicy", - SetSecondaryAcPolicyProc }, /* set secondary AC policy */ - { "set_mu_grouptbldmcsmask", - SetGroupTblDmcsMaskProc }, /* set group table DMCS mask enable or disable */ - { "set_mu_maxgroupsearchcnt", - SetMaxGroupSearchCntProc }, /* set Max group search count */ - /* the followings are relative to trigger MU-flow test command */ - { "set_mu_send_gid_mgmt_frame", - SetTriggerGIDMgmtFrameProc }, /* set trigger GID mgmt. frame */ - { "set_mu_trigger_mutx", SetTriggerMuTxProc }, /* set trigger MU TX */ - { "set_mu_trigger_degroup", - SetTriggerDegroupProc }, /* set trigger MU degrouping */ - { "set_mu_trigger_group", - SetTriggerGroupProc }, /* set trigger MU grouping */ - { "set_mu_trigger_bbp", SetTriggerBbpProc }, /* set trigger LQ */ - { "set_mu_trigger_sounding", - SetTriggerSndProc }, /* set trigger MU sounding */ -/* the followings are relative to channel model setting */ -#endif - -#ifdef VOW_SUPPORT - /* VOW GROUP table */ - { "vow_min_rate_token", set_vow_min_rate_token }, - { "vow_max_rate_token", set_vow_max_rate_token }, - { "vow_min_airtime_token", set_vow_min_airtime_token }, - { "vow_max_airtime_token", set_vow_max_airtime_token }, - { "vow_min_rate_bucket", set_vow_min_rate_bucket }, - { "vow_max_rate_bucket", set_vow_max_rate_bucket }, - { "vow_min_airtime_bucket", set_vow_min_airtime_bucket }, - { "vow_max_airtime_bucket", set_vow_max_airtime_bucket }, - { "vow_max_wait_time", set_vow_max_wait_time }, - { "vow_max_backlog_size", set_vow_max_backlog_size }, - - /* VOW CTRL */ - { "vow_bw_enable", set_vow_bw_en }, - { "vow_refill_en", set_vow_refill_en }, - { "vow_airtime_fairness_en", set_vow_airtime_fairness_en }, - { "vow_txop_switch_bss_en", set_vow_txop_switch_bss_en }, - { "vow_dbdc_search_rule", set_vow_dbdc_search_rule }, - { "vow_refill_period", set_vow_refill_period }, - { "vow_bss_enable", set_vow_bss_en }, - - { "vow_airtime_control_en", set_vow_airtime_ctrl_en }, - { "vow_bw_control_en", set_vow_bw_ctrl_en }, - - /* group other */ - { "vow_bss_dwrr_quantum", set_vow_bss_dwrr_quantum }, - { "vow_group_dwrr_max_wait_time", set_vow_group_dwrr_max_wait_time }, - { "vow_group2band_map", set_vow_group2band_map }, - - /* VOW STA table */ - { "vow_sta_dwrr_quantum", set_vow_sta_dwrr_quantum }, - { "vow_sta_dwrr_quantum_id", set_vow_sta_dwrr_quantum_id }, - { "vow_sta_ac_priority", set_vow_sta_ac_priority }, - { "vow_sta_pause", set_vow_sta_pause }, - { "vow_sta_psm", set_vow_sta_psm }, - { "vow_sta_group", set_vow_sta_group }, - { "vow_dwrr_max_wait_time", set_vow_dwrr_max_wait_time }, - - /* STA fast round robin */ - { "vow_sta_frr_quantum", set_vow_sta_frr_quantum }, - - /* USER */ - { "vow_min_rate", set_vow_min_rate }, - { "vow_max_rate", set_vow_max_rate }, - { "vow_min_ratio", set_vow_min_ratio }, - { "vow_max_ratio", set_vow_max_ratio }, - - /* RX airtime */ - { "vow_rx_counter_clr", set_vow_rx_counter_clr }, - { "vow_rx_airtime_en", set_vow_rx_airtime_en }, - { "vow_rx_ed_offset", set_vow_rx_ed_offset }, - { "vow_rx_obss_backoff", set_vow_rx_obss_backoff }, - /* {"vow_rx_add_obss", set_vow_rx_add_obss}, */ - /* {"vow_rx_add_non_wifi", set_vow_rx_add_non_wifi}, */ - { "vow_rx_wmm_backoff", set_vow_rx_wmm_backoff }, - { "vow_om_wmm_backoff", set_vow_rx_om_wmm_backoff }, - { "vow_repeater_wmm_backoff", set_vow_rx_repeater_wmm_backoff }, - { "vow_rx_non_qos_backoff", set_vow_rx_non_qos_backoff }, - { "vow_rx_bss_wmmset", set_vow_rx_bss_wmmset }, - { "vow_rx_om_wmm_sel", set_vow_rx_om_wmm_select }, - - /* airtime estimator */ - { "vow_at_est_en", set_vow_at_est_en }, - { "vow_at_mon_period", set_vow_at_mon_period }, - - /* badnode detector */ - { "vow_bn_en", set_vow_bn_en }, - { "vow_bn_mon_period", set_vow_bn_mon_period }, - { "vow_bn_fallback_th", set_vow_bn_fallback_th }, - { "vow_bn_per_th", set_vow_bn_per_th }, - - /* airtime counter test */ - { "vow_counter_test", set_vow_counter_test_en }, - { "vow_counter_test_period", set_vow_counter_test_period }, - { "vow_counter_test_band", set_vow_counter_test_band }, - { "vow_counter_test_avgcnt", set_vow_counter_test_avgcnt }, - { "vow_counter_test_target", set_vow_counter_test_target }, - - /* DVT */ - { "vow_dvt_en", set_vow_dvt_en }, - { "vow_monitor_sta", set_vow_monitor_sta }, - { "vow_show_sta", set_vow_show_sta }, - { "vow_monitor_bss", set_vow_monitor_bss }, - { "vow_monitor_mbss", set_vow_monitor_mbss }, - { "vow_show_mbss", set_vow_show_mbss }, - { "vow_avg_num", set_vow_avg_num }, - - /*WATF*/ - { "vow_watf_en", set_vow_watf_en }, - { "vow_watf_q", set_vow_watf_q }, - { "vow_watf_add_entry", set_vow_watf_add_entry }, - { "vow_watf_del_entry", set_vow_watf_del_entry }, - - /* help */ - { "vow_help", set_vow_help }, - -/* - {"vow_rx_add_obss", set_vow_rx_add_obss}, - {"vow_rx_add_non_wifi", set_vow_rx_add_non_wifi}, - */ -#endif /* VOW_SUPPORT */ - -#ifdef RED_SUPPORT - { "red_en", set_red_enable }, - { "red_show_sta", set_red_show_sta }, - { "red_tar_delay", set_red_target_delay }, - { "red_debug_en", set_red_debug_enable }, - { "red_dump_reset", set_red_dump_reset }, -#endif /* RED_SUPPORT */ -#ifdef FQ_SCH_SUPPORT - { "fq_en", set_fq_enable }, - { "fq_debug_en", set_fq_debug_enable }, - { "fq_listmap", set_fq_dbg_listmap }, - { "fq_linklist", set_fq_dbg_linklist }, -#endif /* RRSCH_SUPPORT */ - { "cp_support", set_cp_support_en }, - { "RxvRecordEn", SetRxvRecordEn }, - { "RxRateRecordEn", SetRxRateRecordEn }, -#ifdef CFG_SUPPORT_MU_MIMO_RA - { "mura_periodic_sounding", - SetMuraPeriodicSndProc }, /* set trigger MURGA Algorithm sounding */ - { "mura_algorithm_test", SetMuraTestAlgorithmProc }, - { "mura_algorithm_init", SetMuraTestAlgorithmInit }, - { "mura_algorithm_fixed", SetMuraFixedRateProc }, - { "mura_algorithm_fixed_group", SetMuraFixedGroupRateProc }, - { "mura_sounding_fixed_param", SetMuraFixedSndParamProc }, - { "mura_disabe_CN3_CN4", SetMuraDisableCN3CN4Proc }, - { "mura_mobility_en", SetMuraMobilityCtrlProc }, - { "mura_mobility_interval_ctrl", SetMuraMobilityIntervalCtrlProc }, - { "mura_mobility_snr_ctrl", SetMuraMobilitySNRCtrlProc }, - { "mura_mobility_threshold_ctrl", SetMuraMobilityThresholdCtrlProc }, - { "mura_mobility_snd_cnt", SetMuraMobilitySndCountProc }, - { "mura_mobility_mode_ctrl", SetMuraMobilityModeCtrlProc }, - { "mura_mobility_log_ctrl", SetMuraMobilityLogCtrlProc }, - { "mura_mobility_test_ctrl", SetMuraMobilityTestCtrlProc }, -#endif - -#endif /* MT_MAC */ -#ifdef BACKGROUND_SCAN_SUPPORT - { "bgndscan", set_background_scan }, - { "bgndscantest", set_background_scan_test }, - { "bgndscannotify", set_background_scan_notify }, - { "bgndscancfg", set_background_scan_cfg }, -#endif /* BACKGROUND_SCAN_SUPPORT */ -#ifdef NEW_SET_RX_STREAM - { "RxStream", Set_RxStream_Proc }, -#endif -#ifdef ERR_RECOVERY - { "ErrDetectOn", Set_ErrDetectOn_Proc }, - { "ErrDetectMode", Set_ErrDetectMode_Proc }, -#endif /* ERR_RECOVERY */ -#ifdef CUT_THROUGH - { "CtLowWaterMark", Set_CtLowWaterMark_Proc }, -#endif /*CUT_THROUGH*/ -#ifdef SMART_CARRIER_SENSE_SUPPORT - { "SCSEnable", Set_SCSEnable_Proc }, - { "SCSCfg", Set_SCSCfg_Proc }, - { "SCSPd", Set_SCSPd_Proc }, -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -#ifdef BAND_STEERING - { "BndStrgEnable", Set_BndStrg_Enable }, - { "BndStrgBssIdx", Set_BndStrg_BssIdx }, - { "BndStrgParam", Set_BndStrg_Param }, -#ifdef BND_STRG_DBG - { "BndStrgMntAddr", Set_BndStrg_MonitorAddr }, -#endif /* BND_STRG_DBG */ -#endif /* BAND_STEERING */ -#ifdef ACK_CTS_TIMEOUT_SUPPORT - { "CCK_ACK_timeout", Set_CCK_ACK_Timeout_Proc }, - { "OFDM_ACK_timeout", Set_OFDM_ACK_Timeout_Proc }, -#endif -#ifdef TXPWRMANUAL - { "TxPwrManualSet", SetTxPwrManualCtrl }, -#endif /* TXPWRMANUAL */ - - { "SKUCtrl", SetSKUCtrl }, - { "PercentageCtrl", SetPercentageCtrl }, - { "PowerDropCtrl", SetPowerDropCtrl }, - { "BFBackoffCtrl", SetBfBackoffCtrl }, - { "ThermoCompCtrl", SetThermoCompCtrl }, -#ifdef ANTENNA_CONTROL_SUPPORT - { "AntCtrl", Set_Antenna_Control_Proc }, -#endif /* ANTENNA_CONTROL_SUPPORT */ - { "RFTxAnt", SetRfTxAnt }, - { "TxPowerInfo", SetTxPowerInfo }, - { "TOAECtrl", SetTOAECtrl }, - { "EDCCACtrl", SetEDCCACtrl }, - { "SKUInfo", SetSKUInfo }, - { "BFBackoffInfo", SetBFBackoffInfo }, - { "CCKTxStream", SetCCKTxStream }, -#ifdef WIFI_EAP_FEATURE - { "EDCCAThreshold", SetEDCCAThresholdCtrl }, -#ifndef NEIGHBORING_AP_STAT - { "InitIPICtrl", SetInitIPICtrl }, -#endif - { "mgmt_txpwr_offset", set_mgmt_txpwr_offset }, - { "data_txpwr_offset", set_data_txpwr_offset }, - { "fw_ratbl", set_fw_ratbl_ctrl }, -#endif -#ifdef ETSI_RX_BLOCKER_SUPPORT - { "ETSISetFixWbIbRssiCtrl", SetFixWbIbRssiCtrl }, - { "ETSISetRssiThCtrl", SetRssiThCtrl }, - { "ETSISetCheckThCtrl", SetCheckThCtrl }, - { "ETSISetAdaptRxBlockCtrl", SetAdaptRxBlockCtrl }, - { "ETSISetWbRssiDirectCtrl", SetWbRssiDirectCtrl }, - { "ETSISetIbRssiDirectCtrl", SetIbRssiDirectCtrl }, -#endif /* end ETSI_RX_BLOCKER_SUPPORT */ - { "MUTxPower", SetMUTxPower }, - { "BFNDPATxDCtrl", SetBFNDPATxDCtrl }, - { "TxPowerCompInfo", SetTxPowerCompInfo }, - { "ThermalManualMode", SetThermalManualCtrl }, -#ifdef TX_POWER_CONTROL_SUPPORT - { "TxPowerBoostCtrl", SetTxPowerBoostCtrl }, -#endif - -#ifdef LED_CONTROL_SUPPORT - { "led_setting", Set_Led_Proc }, -#endif /* LED_CONTROL_SUPPORT */ -#ifdef PRE_CAL_TRX_SET1_SUPPORT - { "ktoflash_debug", Set_KtoFlash_Debug_Proc }, - { "RDCE", Set_RDCE_Proc }, -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - { "hw_nat_register", set_hnat_register }, - { "MibBucket", Set_MibBucket_Proc }, -#ifdef RLM_CAL_CACHE_SUPPORT - { "rlm_cal_cache", Set_RLM_Cal_Cache_Debug_Proc }, -#endif /* RLM_CAL_CACHE_SUPPORT */ -#ifdef PKT_BUDGET_CTRL_SUPPORT - { "pbc_ubound", Set_PBC_Proc }, -#endif /*PKT_BUDGET_CTRL_SUPPORT*/ - { "bwf", Set_BWF_Enable_Proc }, -#ifdef TX_AGG_ADJUST_WKR - { "agg_adj_wkr", Set_AggAdjWkr_Proc }, -#endif /* TX_AGG_ADJUST_WKR */ -#ifdef HTC_DECRYPT_IOT - { "htc_th", Set_HTC_Err_TH_Proc }, - { "htc_entry_err_cnt", Set_Entry_HTC_Err_Cnt_Proc }, - { "wtbl_addom", Set_WTBL_AAD_OM_Proc }, -#endif /* HTC_DECRYPT_IOT */ -#ifdef DHCP_UC_SUPPORT - { "dhcp_uc", Set_DHCP_UC_Proc }, -#endif /* DHCP_UC_SUPPORT */ -#ifdef CONFIG_HOTSPOT_R2 - { "hs_flag", Set_CR4_Hotspot_Flag }, -#endif /* CONFIG_HOTSPOT_R2 */ - - { "ser", set_ser }, -#ifdef CONFIG_TX_DELAY - { "tx_batch_cnt", Set_TX_Batch_Cnt_Proc }, - { "tx_delay_timeout", Set_TX_Delay_Timeout_Proc }, - { "tx_pkt_min_len", Set_Pkt_Min_Len_Proc }, - { "tx_pkt_max_len", Set_Pkt_Max_Len_Proc }, -#endif - { "fix_amsdu", set_fix_amsdu }, - { "rx_max_cnt", set_rx_max_cnt }, - { "rx1_max_cnt", set_rx1_max_cnt }, -#ifdef MBO_SUPPORT - { "mbo_nr", SetMboNRIndicateProc }, -#endif /* MBO_SUPPORT */ - { "rx_delay_ctl", set_rx_dly_ctl }, - { "tx_delay_ctl", set_tx_dly_ctl }, - { "vie_op", vie_oper_proc }, -#ifdef LED_CONTROL_SUPPORT -#ifdef VENDOR_FEATURE7_SUPPORT - { "LEDEnable", Set_Led_Enable_Proc }, -#endif -#endif - { "wpa3_test", set_wpa3_test }, -#ifdef RATE_PRIOR_SUPPORT - { "LowRateCtrl", Set_RatePrior_Proc }, - { "LowRateRatioThreshold", Set_LowRateRatio_Proc }, - { "LowRateCountPeriod", Set_LowRateCountPeriod_Proc }, - { "TotalCntThreshold", Set_TotalCntThreshold_Proc }, -#endif /*RATE_PRIOR_SUPPORT*/ -#ifdef DOT11_SAE_SUPPORT - { "sae_k_iter", sae_set_k_iteration }, - { "sae_anti_clogging_th", sae_set_anti_clogging_th }, -#endif -#ifdef MGMT_TXPWR_CTRL - { "mgmt_frame_pwr", set_mgmt_frame_power }, -#endif -#ifdef AMPDU_CONF_SUPPORT - { "AGG_MPDU_Count", Set_AMPDU_MPDU_Count }, - { "AMPDUretrycount", Set_AMPDU_Retry_Count }, -#endif /* AMPDU_CONF_SUPPORT*/ - { "Sta_Idle_Check", Set_Sta_Idle_Check }, - { "sta_fast_idle_check", Set_Sta_Fast_Idle_Check_Proc }, -#ifdef DPP_SUPPORT - { "DppEnable", Set_Enable_Dpp_Proc }, -#endif /* DPP_SUPPORT */ -#ifdef MLME_MULTI_QUEUE_SUPPORT - { "MlmeMultiQCtrl", set_mlme_queue_ration }, -#endif - { - NULL, - } -}; - -static struct { - RTMP_STRING *name; - INT(*set_proc) - (RTMP_ADAPTER *pAd, RTMP_STRING *arg); -} * PRTMP_PRIVATE_SHOW_PROC, RTMP_PRIVATE_SHOW_SUPPORT_PROC[] = { -#ifdef ACL_BLK_COUNT_SUPPORT - { "ACLRejectCount", Show_ACLRejectCount_Proc }, -#endif /*ACL_BLK_COUNT_SUPPORT*/ - { "stainfo", Show_MacTable_Proc }, -#ifdef MEM_ALLOC_INFO_SUPPORT - { "meminfo", Show_MemInfo_Proc }, - { "pktmeminfo", Show_PktInfo_Proc }, -#endif /* MEM_ALLOC_INFO_SUPPORT */ -#ifdef MT_MAC - { "pauseinfo", Show_PSTable_Proc }, - { "wtbl", show_wtbl_proc }, - { "wtbltlv", show_wtbltlv_proc }, - { "mibinfo", show_mib_proc }, - { "amsduinfo", show_amsdu_proc }, - { "wifi_sys", show_wifi_sys }, -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - { "GetClientIdleTime", show_client_idle_time }, -#endif -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE - { "GetCurrentRSSI", show_current_rssi }, -#endif -#ifdef DBDC_MODE - { "dbdcinfo", ShowDbdcProc }, -#endif - { "channelinfo", ShowChCtrl }, -#ifdef GREENAP_SUPPORT - { "greenapinfo", ShowGreenAPProc }, -#endif /* GREENAP_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - { "pcieaspminfo", show_pcie_aspm_dym_ctrl_cap_proc }, -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - { "txopinfo", show_tx_burst_info }, - { "tmacinfo", ShowTmacInfo }, - { "agginfo", ShowAggInfo }, - { "manual_txop", ShowManualTxOP }, - { "pseinfo", ShowPseInfo }, - { "psedata", ShowPseData }, - { "pleinfo", ShowPLEInfo }, - { "txdinfo", show_TXD_proc }, - { "dumpmem", show_mem_proc }, - { "protectinfo", show_protect_info }, - { "ccainfo", show_cca_info }, -#ifdef MT_FDB - { "fdbn9log", show_fdb_n9_log }, - { "fdbcr4log", show_fdb_cr4_log }, -#endif /* MT_FDB */ -#ifdef CUT_THROUGH - { "ctinfo", ShowCutThroughInfo }, -#endif /* CUT_THROUGH */ - - { "dschinfo", show_dmasch_proc }, - -#endif /* MT_MAC */ - { "sta_tr", Show_sta_tr_proc }, - { "peerinfo", show_stainfo_proc }, - { "stacountinfo", Show_StaCount_Proc }, -#ifdef TXRX_STAT_SUPPORT - { "sta_stat", Show_Sta_Stat_Proc }, - { "mbss_stat", Show_Bss_Stat_Proc }, - { "radio_stat", Show_Radio_Stat_Proc }, -#endif -#ifdef EAP_STATS_SUPPORT - { "eap_stats", Show_Eap_Stats_Proc }, -#endif /* EAP_STATS_SUPPORT */ - { "secinfo", Show_APSecurityInfo_Proc }, - { "descinfo", Show_DescInfo_Proc }, - { "driverinfo", show_driverinfo_proc }, - { "apcfginfo", show_apcfg_info }, - { "devinfo", show_devinfo_proc }, - { "sysinfo", show_sysinfo_proc }, - { "trinfo", show_trinfo_proc }, - { "tpinfo", show_tpinfo_proc }, - { "BSSEdca", show_BSSEdca_proc }, - { "APEdca", show_APEdca_proc }, - { "pwrinfo", chip_show_pwr_info }, - { "txqinfo", show_txqinfo_proc }, - { "swqinfo", show_swqinfo }, - { "efuseinfo", show_efuseinfo_proc }, - { "e2pinfo", show_e2pinfo_proc }, - { "cr4_pdma_probe", dump_cr4_pdma_debug_probe }, -#ifdef WDS_SUPPORT - { "wdsinfo", Show_WdsTable_Proc }, -#endif /* WDS_SUPPORT */ -#ifdef DOT11_N_SUPPORT - { "bainfo", Show_BaTable_Proc }, - { "channelset", Show_ChannelSet_Proc }, -#endif /* DOT11_N_SUPPORT */ - { "stat", Show_Sat_Proc }, -#ifdef RTMP_MAC_PCI -#ifdef DBG_DIAGNOSE - { "diag", Show_Diag_Proc }, -#endif /* DBG_DIAGNOSE */ -#endif /* RTMP_MAC_PCI */ - { "stat_reset", Show_Sat_Reset_Proc }, -#ifdef IGMP_SNOOP_SUPPORT - { "igmpinfo", Set_IgmpSn_TabDisplay_Proc }, - { "igmpwl", Set_Igmp_Show_Flooding_CIDR_Proc }, -#ifdef IGMP_TVM_SUPPORT - { "IgmpSnExemptIP", Show_IgmpSn_BlackList_Proc }, - { "IgmpSnMcastTable", Show_IgmpSn_McastTable_Proc }, -#endif /* IGMP_TVM_SUPPORT */ -#endif /* IGMP_SNOOP_SUPPORT */ -#ifdef MCAST_RATE_SPECIFIC - { "mcastrate", Show_McastRate }, -#endif /* MCAST_RATE_SPECIFIC */ -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - { "bcnrate", Show_BcnRate }, -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ -#ifdef MAT_SUPPORT - { "matinfo", Show_MATTable_Proc }, -#endif /* MAT_SUPPORT */ -#ifdef MT_DFS_SUPPORT - { "DfsProvideChList", Show_available_BwCh_Proc }, - { "DfsNOP", Show_DfsNonOccupancy_Proc }, - { "DfsNOPOfChList", Show_NOP_Of_ChList }, - { "DfsTargetInfo", Show_Target_Ch_Info }, -#endif -#ifdef DOT11R_FT_SUPPORT - { "ftinfo", Show_FTConfig_Proc }, -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - { "rrminfo", RRM_InfoDisplay_Proc }, -#endif /* DOT11K_RRM_SUPPORT */ -#ifdef AP_QLOAD_SUPPORT - { "qload", Show_QoSLoad_Proc }, -#endif /* AP_QLOAD_SUPPORT */ - { "TmrCal", Show_TmrCalResult_Proc }, -#ifdef FTM_SUPPORT -#ifdef FTM_INITIATOR - { "FtmRxTmrQ", Show_FtmRxTmrQ_Proc }, -#endif /* FTM_INITIATOR */ - { "FtmEntry", Show_FtmEntry_Proc }, - { "FtmPidList", Show_FtmPidList_Proc }, - { "FtmLciValue", Show_FtmLciValue_Proc }, -#endif /* FTM_SUPPORT */ -#ifdef APCLI_SUPPORT - { "connStatus", RTMPIoctlConnStatus }, -#endif /* APCLI_SUPPORT */ -#ifdef MAC_REPEATER_SUPPORT - { "reptinfo", Show_Repeater_Cli_Proc }, - { "rept_table", Show_ReptTable_Proc }, -#endif /* MAC_REPEATER_SUPPORT */ -#ifdef SMART_ANTENNA - { "sainfo", Show_SA_CfgInfo_Proc }, - { "sadbginfo", Show_SA_DbgInfo_Proc }, -#endif /* SMART_ANTENNA // */ - - { "rainfo", Show_RAInfo_Proc }, -#ifdef TXBF_SUPPORT - { "txbfinfo", Show_TxBfInfo_Proc }, -#endif /* TXBF_SUPPORT */ -#ifdef MBSS_SUPPORT - { "mbss", Show_MbssInfo_Display_Proc }, -#endif /* MBSS_SUPPORT */ -#ifdef WSC_AP_SUPPORT - { "WscPeerList", WscApShowPeerList }, - { "WscPin", WscApShowPin }, -#endif /* WSC_AP_SUPPORT */ -#ifdef VLAN_SUPPORT - { "vlaninfo", Show_VLAN_Info_Proc }, -#endif /*VLAN_SUPPORT*/ - { "rfinfo", ShowRFInfo }, - { "bbpinfo", ShowBBPInfo }, - { "wfintcnt", ShowWifiInterruptCntProc }, -#ifdef CFG_SUPPORT_MU_MIMO - { "hqa_mu_get_init_mcs", hqa_mu_get_init_mcs }, - { "hqa_mu_get_qd", hqa_mu_get_qd }, - { "hqa_mu_get_lq", hqa_mu_get_lq }, - { "hqa_su_get_lq", hqa_su_get_lq }, - - { "get_mu_enable", ShowMuEnableProc }, /* show mu enable or disable */ - { "get_mu_profile", ShowMuProfileProc }, /* show mu profile entry */ - { "get_mu_grouptbl", - ShowGroupTblEntryProc }, /* show group table entry */ - { "get_mu_clustertbl", - ShowClusterTblEntryProc }, /* show cluster table entry */ - { "get_mu_groupuserthreshold", - ShowGroupUserThresholdProc }, /* show group user threshold */ - { "get_mu_groupnssthreshold", - ShowGroupNssThresholdProc }, /* show group NSS threshold */ - { "get_mu_txreqmintime", - ShowTxReqMinTimeProc }, /* show tx req. min. time */ - { "get_mu_sunsscheck", - ShowSuNssCheckProc }, /* show SU Nss check enable or disable */ - { "get_mu_calcinitmcs", ShowCalcInitMCSProc }, /* show Init MCS */ - { "get_mu_txopdefault", ShowTxopDefaultProc }, /* show TXOP default */ - { "get_mu_sulossthreshold", - ShowSuLossThresholdProc }, /* show SU loss threshold */ - { "get_mu_mugainthreshold", - ShowMuGainThresholdProc }, /* show MU gain threshold */ - { "get_mu_secondaryacpolicy", - ShowSecondaryAcPolicyProc }, /* show secondary AC policay */ - { "get_mu_grouptbldmcsmask", - ShowGroupTblDmcsMaskProc }, /* show group table DMCS mask enable or disable */ - { "get_mu_maxgroupsearchcnt", - ShowMaxGroupSearchCntProc }, /* show max. group table search count */ - { "get_mu_txstatus", - ShowMuProfileTxStsCntProc }, /* show mu profile tx status */ -#endif - -#ifdef CFG_SUPPORT_MU_MIMO_RA - { "mura_algorithm_monitor", GetMuraMonitorStateProc }, - { "get_mura_pfid_stat", GetMuraPFIDStatProc }, -#endif - - { "hwctrl", Show_HwCtrlStatistic_Proc }, - -#ifdef VOW_SUPPORT - /* VOW RX */ - { "vow_rx_time", show_vow_rx_time }, - /* {"vow_get_sta_token", show_vow_get_sta_token}, */ - { "vow_sta_conf", show_vow_sta_conf }, - { "vow_all_sta_conf", show_vow_all_sta_conf }, - { "vow_bss_conf", show_vow_bss_conf }, - { "vow_all_bss_conf", show_vow_all_bss_conf }, - { "vow_info", show_vow_info }, - - /* {"vow_status", show_vow_status} */ - - /* CR dump */ - { "vow_dump_sta", show_vow_dump_sta }, - { "vow_dump_bss_bitmap", show_vow_dump_bss_bitmap }, - { "vow_dump_bss", show_vow_dump_bss }, - { "vow_dump_vow", show_vow_dump_vow }, - { "vow_show_sta_dtoken", vow_show_sta_dtoken }, - { "vow_show_bss_dtoken", vow_show_bss_dtoken }, - { "vow_show_bss_atoken", vow_show_bss_atoken }, - { "vow_show_bss_ltoken", vow_show_bss_ltoken }, - - /* DVT */ - { "vow_show_queue", vow_show_queue_status }, - - /*WATF*/ - { "vow_watf_info", show_vow_watf_info }, - - /* help */ - { "vow_help", show_vow_help }, -#endif /* VOW_SUPPORT */ -#ifdef RED_SUPPORT - { "red_info", show_red_info }, -#endif /* RED_SUPPORT */ -#ifdef FQ_SCH_SUPPORT - { "fq_info", show_fq_info }, -#endif - { "timer_list", show_timer_list }, - { "wtbl_stat", show_wtbl_state }, -#ifdef SMART_CARRIER_SENSE_SUPPORT - { "SCSInfo", Show_SCSinfo_proc }, -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -#ifdef WIFI_EAP_FEATURE -#ifdef CHUTIL_SUPPORT - { "chutil", Show_ChUtil_Proc }, -#endif -#endif - { "MibBucket", Show_MibBucket_Proc }, -#ifdef REDUCE_TCP_ACK_SUPPORT - { "ReduceAckShow", Show_ReduceAckInfo_Proc }, -#endif - { "EDCCAStatus", ShowEDCCAStatus }, -#ifdef BAND_STEERING - { "BndStrgList", Show_BndStrg_List }, - { "BndStrgInfo", Show_BndStrg_Info }, -#ifdef VENDOR_FEATURE5_SUPPORT - { "BndStrgNvramtable", Show_BndStrg_NvramTable }, -#endif /* VENDOR_FEATURE5_SUPPORT */ -#endif /* BAND_STEERING */ -#ifdef AMPDU_CONF_SUPPORT - { "AGG_MPDU_Count", Show_AMPDU_MPDU_Count }, - { "AMPDUretrycount", Show_AMPDU_retry_Count }, -#endif /* AMPDU_CONF_SUPPORT*/ - { "radio_info", show_radio_info_proc }, -#ifdef BACKGROUND_SCAN_SUPPORT - { "bgndscaninfo", show_background_scan_info }, -#endif -#ifdef ERR_RECOVERY - { "serinfo", ShowSerProc }, - { "ser", ShowSerProc2 }, -#endif - { "bcninfo", ShowBcnProc }, -#ifdef RADIUS_MAC_ACL_SUPPORT - { "RadiusAclCache", show_RADIUS_acl_cache }, -#endif /* RADIUS_MAC_ACL_SUPPORT */ -#ifdef DBG_STARVATION - { "starv_info", show_starv_info_proc }, -#endif /*DBG_STARVATION*/ -#ifdef TX_POWER_CONTROL_SUPPORT - { "TxPowerBoostInfo", ShowTxPowerBoostInfo }, -#endif /* TX_POWER_CONTROL_SUPPORT */ -#ifdef ACK_CTS_TIMEOUT_SUPPORT - { "CCK_ACK_timeout", Show_CCK_ACK_Timeout_Proc }, - { "OFDM_ACK_timeout", Show_OFDM_ACK_Timeout_Proc }, -#endif -#ifdef ETSI_RX_BLOCKER_SUPPORT - { "ETSIShowRssiThInfo", ShowRssiThInfo }, -#endif /* ETSI_RX_BLOCKER_SUPPORT */ - { "qdisc_dump", set_qiscdump_proc }, -#ifdef MBO_SUPPORT - { "mbo", ShowMboStatProc }, -#endif /* MBO_SUPPORT */ - { "l1profile", ShowL1profile }, -#ifdef DOT11_SAE_SUPPORT - { "saeinfo", show_sae_info_proc }, -#endif -#ifdef NF_SUPPORT - { "channf", Show_noise_floor_info }, -#endif /* NF_SUPPORT*/ -#ifdef WIFI_EAP_FEATURE -#ifndef NEIGHBORING_AP_STAT - { "IPIValue", ShowIPIValue }, -#endif - { "RATblInfo", show_ratbl_info }, -#endif - { "show_wifi_cap_list", show_wifi_cap_list }, -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT - { "RadarThresholdParam", Show_Radar_Threshold_Param_Proc }, -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT - { "DfsDebug", Show_DFS_Debug_Proc }, -#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */ -#ifdef DSCP_PRI_SUPPORT - { "DscpPri", Show_Dscp_Pri_Proc }, -#endif -#ifdef MGMT_TXPWR_CTRL - { "mgmt_frame_pwr", show_mgmt_frame_power }, -#endif -#ifdef ANTENNA_CONTROL_SUPPORT - { "AntCtrl", Show_Antenna_Control_info }, -#endif /* ANTENNA_CONTROL_SUPPORT */ -#ifdef CONFIG_MAP_SUPPORT -#ifdef MAP_R2 - { "ts_info", show_traffic_separation_info }, - { "MapR2Policy", Show_MapR2_Policy_Proc }, -#endif -#endif /* CONFIG_MAP_SUPPORT */ - - { - NULL, - } -}; - -/** - * @addtogroup embedded_ioctl - * @{ - * @code AP RX IOCTL - */ - -static struct { - RTMP_STRING *name; - INT(*rx_proc) - (RTMP_ADAPTER *pAd, RTMP_STRING *arg, RTMP_IOCTL_INPUT_STRUCT *wrq); -} * PRTMP_PRIVATE_RX_PROC, RTMP_PRIVATE_RX_SUPPORT_PROC[] = { -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - { "stat", Show_Rx_Statistic }, - { "vector", Set_Rx_Vector_Control }, -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - { - NULL, - } -}; - -INT RTMPAPPrivIoctlSet(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr) -{ - RTMP_STRING *this_char, *value; - INT Status = NDIS_STATUS_SUCCESS; - - UCHAR *tmp = NULL, *buf = NULL; - - os_alloc_mem(NULL, (UCHAR **)&buf, pIoctlCmdStr->u.data.length + 1); - if (!buf) - return -ENOMEM; - - if (copy_from_user(buf, pIoctlCmdStr->u.data.pointer, - pIoctlCmdStr->u.data.length)) { - os_free_mem(buf); - return -EFAULT; - } - /* Play safe - take care of a situation in which user-space didn't NULL terminate */ - buf[pIoctlCmdStr->u.data.length] = 0; - - /* Use tmp to parse string, because strsep() would change it */ - tmp = buf; - - while ((this_char = strsep((char **)&tmp, "\0")) != NULL) { - if (!*this_char) - continue; - - value = strchr(this_char, '='); - - if (value != NULL) - *value++ = 0; - - if (!value -#ifdef WSC_AP_SUPPORT - && ((strcmp(this_char, "WscStop") != 0) && - (strcmp(this_char, "ser") != 0) && -#ifdef BB_SOC - (strcmp(this_char, "WscResetPinCode") != 0) && -#endif - (strcmp(this_char, "WscGenPinCode") != 0)) -#endif /* WSC_AP_SUPPORT */ -#ifdef SMART_ANTENNA - && (strcmp(this_char, "sa") != 0) -#endif /* SMART_ANTENNA */ - ) - continue; - - for (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; - PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++) { - if (!strcasecmp(this_char, - PRTMP_PRIVATE_SET_PROC->name)) { - if (!PRTMP_PRIVATE_SET_PROC->set_proc(pAd, - value)) { - /*FALSE:Set private failed then return Invalid argument */ - Status = -EINVAL; - } - - break; /*Exit for loop. */ - } - } - - if (PRTMP_PRIVATE_SET_PROC->name == NULL) { - /*Not found argument */ - Status = -EINVAL; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IOCTL::(iwpriv) Command not Support [%s=%s]\n", - this_char, value)); - break; - } - } - os_free_mem(buf); - - return Status; -} - -INT RTMPAPPrivIoctlShow(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr) -{ - RTMP_STRING *this_char, *value = NULL; - INT Status = NDIS_STATUS_SUCCESS; - - UCHAR *tmp = NULL, *buf = NULL; - - os_alloc_mem(NULL, (UCHAR **)&buf, pIoctlCmdStr->u.data.length + 1); - if (!buf) - return -ENOMEM; - - if (copy_from_user(buf, pIoctlCmdStr->u.data.pointer, - pIoctlCmdStr->u.data.length)) { - os_free_mem(buf); - return -EFAULT; - } - /* Play safe - take care of a situation in which user-space didn't NULL terminate */ - buf[pIoctlCmdStr->u.data.length] = 0; - - /* Use tmp to parse string, because strsep() would change it */ - tmp = buf; - - while ((this_char = strsep((char **)&tmp, ",")) != NULL) { - if (!*this_char) - continue; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Before check, this_char=%s\n", __func__, - this_char)); - value = strchr(this_char, '='); - - if (value) { - if (strlen(value) > 1) { - *value = 0; - value++; - } else - value = NULL; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): after check, this_char=%s, value=%s\n", - __func__, this_char, (value == NULL ? "" : value))); - - for (PRTMP_PRIVATE_SHOW_PROC = RTMP_PRIVATE_SHOW_SUPPORT_PROC; - PRTMP_PRIVATE_SHOW_PROC->name; PRTMP_PRIVATE_SHOW_PROC++) { - if (!strcasecmp(this_char, - PRTMP_PRIVATE_SHOW_PROC->name)) { - if (!PRTMP_PRIVATE_SHOW_PROC->set_proc(pAd, - value)) { - /*FALSE:Set private failed then return Invalid argument */ - Status = -EINVAL; - } - - break; /*Exit for loop. */ - } - } - - if (PRTMP_PRIVATE_SHOW_PROC->name == NULL) { - /*Not found argument */ - Status = -EINVAL; -#ifdef RTMP_RBUS_SUPPORT - - if (pAd->infType == RTMP_DEV_INF_RBUS) { - for (PRTMP_PRIVATE_SHOW_PROC = - RTMP_PRIVATE_SHOW_SUPPORT_PROC; - PRTMP_PRIVATE_SHOW_PROC->name; - PRTMP_PRIVATE_SHOW_PROC++) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s\n", - PRTMP_PRIVATE_SHOW_PROC->name)); - } - -#endif /* RTMP_RBUS_SUPPORT */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IOCTL::(iwpriv) Command not Support [%s=%s]\n", - this_char, value)); - break; - } - } - - os_free_mem(buf); - return Status; -} - -#ifdef VENDOR_FEATURE6_SUPPORT -#define ASSO_MAC_LINE_LEN \ - (1 + 19 + 4 + 4 + 4 + 4 + 8 + 7 + 7 + 7 + 7 + 10 + 6 + 6 + 6 + 6 + 7 + \ - 7 + 7 + 1) -VOID RTMPAPGetAssoMacTable(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - UINT32 DataRate = 0; - INT i; - char *msg; - - os_alloc_mem(NULL, (UCHAR **)&msg, - sizeof(CHAR) * (MAX_LEN_OF_MAC_TABLE * ASSO_MAC_LINE_LEN)); - - if (msg == NULL) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Alloc memory failed\n", __func__)); - return; - } - - memset(msg, 0, MAX_LEN_OF_MAC_TABLE * ASSO_MAC_LINE_LEN); - sprintf(msg + strlen(msg), "\n%-19s%-4s%-4s%-4s%-4s%-8s", "MAC", "AID", - "BSS", "PSM", "WMM", "MIMOPS"); - sprintf(msg + strlen(msg), "%-7s%-7s%-7s%-7s", "RSSI0", "RSSI1", - "RSSI2", "RSSI3"); - sprintf(msg + strlen(msg), "%-10s%-6s%-6s%-6s%-6s%-7s%-7s%-7s\n", - "PhMd", "BW", "MCS", "SGI", "STBC", "Idle", "Rate", "TIME"); - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if ((IS_ENTRY_CLIENT(pEntry) || (IS_ENTRY_APCLI(pEntry) -#ifdef MAC_REPEATER_SUPPORT - || IS_ENTRY_REPEATER(pEntry) -#endif /* MAC_REPEATER_SUPPORT */ - )) && - (pEntry->Sst == SST_ASSOC)) { - if ((strlen(msg) + ASSO_MAC_LINE_LEN) >= - (MAX_LEN_OF_MAC_TABLE * ASSO_MAC_LINE_LEN)) - break; - - DataRate = 0; - DataRate = 0; - /* getRate(pEntry->HTPhyMode, &DataRate); */ - RtmpDrvMaxRateGet(pAd, pEntry->HTPhyMode.field.MODE, - pEntry->HTPhyMode.field.ShortGI, - pEntry->HTPhyMode.field.BW, - pEntry->HTPhyMode.field.MCS, - (pEntry->MaxHTPhyMode.field.MCS >> - 4) + 1, - (UINT32 *)&DataRate); - DataRate /= 500000; - sprintf(msg + strlen(msg), - "%02X:%02X:%02X:%02X:%02X:%02X ", - PRINT_MAC(pEntry->Addr)); - sprintf(msg + strlen(msg), "%-4d", (int)pEntry->Aid); - sprintf(msg + strlen(msg), "%-4d", (int)pEntry->apidx); - sprintf(msg + strlen(msg), "%-4d", (int)pEntry->PsMode); - sprintf(msg + strlen(msg), "%-4d", - (int)CLIENT_STATUS_TEST_FLAG( - pEntry, fCLIENT_STATUS_WMM_CAPABLE)); -#ifdef DOT11_N_SUPPORT - sprintf(msg + strlen(msg), "%-8d", - (int)pEntry->MmpsMode); -#endif /* DOT11_N_SUPPORT */ - sprintf(msg + strlen(msg), "%-7d%-7d%-7d%-7d", - pEntry->RssiSample.AvgRssi[0], - pEntry->RssiSample.AvgRssi[1], - pEntry->RssiSample.AvgRssi[2], - pEntry->RssiSample.AvgRssi[3]); - sprintf(msg + strlen(msg), "%-10s", - get_phymode_str(pEntry->HTPhyMode.field.MODE)); - sprintf(msg + strlen(msg), "%-6s", - get_bw_str(pEntry->HTPhyMode.field.BW)); -#ifdef DOT11_VHT_AC - - if (pEntry->HTPhyMode.field.MODE == MODE_VHT) - sprintf(msg + strlen(msg), "%dS-M%-3d", - ((pEntry->HTPhyMode.field.MCS >> 4) + - 1), - (pEntry->HTPhyMode.field.MCS & 0xf)); - else -#endif /* DOT11_VHT_AC */ - sprintf(msg + strlen(msg), "%-6d", - pEntry->HTPhyMode.field.MCS); - - sprintf(msg + strlen(msg), "%-6d", - pEntry->HTPhyMode.field.ShortGI); - sprintf(msg + strlen(msg), "%-6d", - pEntry->HTPhyMode.field.STBC); - sprintf(msg + strlen(msg), "%-7d", - (int)(pEntry->StaIdleTimeout - - pEntry->NoDataIdleCount)); - sprintf(msg + strlen(msg), "%-7d", (int)DataRate); - sprintf(msg + strlen(msg), "%-7d", - (int)pEntry->StaConnectTime); - sprintf(msg + strlen(msg), "%-10d, %d, %d%%\n", - pEntry->DebugFIFOCount, pEntry->DebugTxCount, - (pEntry->DebugTxCount) ? - ((pEntry->DebugTxCount - - pEntry->DebugFIFOCount) * - 100 / pEntry->DebugTxCount) : - 0); - sprintf(msg + strlen(msg), "\n"); - } - } - - /* for compatible with old API just do the printk to console*/ - wrq->u.data.length = strlen(msg); - - if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s", msg)); - - os_free_mem(msg); -} -#endif /* VENDOR_FEATURE6_SUPPORT */ - -#if defined(INF_AR9) || defined(BB_SOC) -#if defined(AR9_MAPI_SUPPORT) || defined(BB_SOC) -INT RTMPAPPrivIoctlAR9Show(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr) -{ - INT Status = NDIS_STATUS_SUCCESS; - - if (!strcmp(pIoctlCmdStr->u.data.pointer, "get_mac_table")) - RTMPAR9IoctlGetMacTable(pAd, pIoctlCmdStr); - else if (!strcmp(pIoctlCmdStr->u.data.pointer, "get_stat2")) - RTMPIoctlGetSTAT2(pAd, pIoctlCmdStr); - else if (!strcmp(pIoctlCmdStr->u.data.pointer, "get_radio_dyn_info")) - RTMPIoctlGetRadioDynInfo(pAd, pIoctlCmdStr); - -#ifdef WSC_AP_SUPPORT - else if (!strcmp(pIoctlCmdStr->u.data.pointer, "get_wsc_profile")) - RTMPAR9IoctlWscProfile(pAd, pIoctlCmdStr); - else if (!strcmp(pIoctlCmdStr->u.data.pointer, "get_wsc_pincode")) - RTMPIoctlWscPINCode(pAd, pIoctlCmdStr); - else if (!strcmp(pIoctlCmdStr->u.data.pointer, "get_wsc_status")) - RTMPIoctlWscStatus(pAd, pIoctlCmdStr); - else if (!strcmp(pIoctlCmdStr->u.data.pointer, "get_wps_dyn_info")) - RTMPIoctlGetWscDynInfo(pAd, pIoctlCmdStr); - else if (!strcmp(pIoctlCmdStr->u.data.pointer, "get_wps_regs_dyn_info")) - RTMPIoctlGetWscRegsDynInfo(pAd, pIoctlCmdStr); - -#endif - return Status; -} -#endif /*AR9_MAPI_SUPPORT*/ -#endif /*AR9_INF*/ -VOID restart_ap(void *wdev_obj) -{ - struct wifi_dev *wdev = wdev_obj; - BSS_STRUCT *mbss = wdev->func_dev; - - UpdateBeaconHandler(wdev->sys_handle, wdev, BCN_UPDATE_DISABLE_TX); - wifi_sys_linkdown(wdev); - wifi_sys_close(wdev); - wifi_sys_open(wdev); - wifi_sys_linkup(wdev, NULL); - if (IS_SECURITY(&wdev->SecConfig)) - mbss->CapabilityInfo |= 0x0010; - else - mbss->CapabilityInfo &= (~0x0010); -#ifdef MGMT_TXPWR_CTRL - if (wdev->bPwrCtrlEn) - wtbl_update_pwr_offset(wdev->sys_handle, wdev); -#endif - UpdateBeaconHandler(wdev->sys_handle, wdev, BCN_UPDATE_IE_CHG); -} - -INT RTMPAPSetInformation(IN PRTMP_ADAPTER pAd, - INOUT RTMP_IOCTL_INPUT_STRUCT *rq, IN INT cmd) -{ - RTMP_IOCTL_INPUT_STRUCT *wrq = (RTMP_IOCTL_INPUT_STRUCT *)rq; - UCHAR Addr[MAC_ADDR_LEN]; - INT Status = NDIS_STATUS_SUCCESS; -#ifdef SNMP_SUPPORT - /*snmp */ - UINT KeyIdx = 0; - PNDIS_AP_802_11_KEY pKey = NULL; - TX_RTY_CFG_STRUC tx_rty_cfg; - ULONG ShortRetryLimit, LongRetryLimit; - UCHAR ctmp; -#endif /* SNMP_SUPPORT */ - NDIS_802_11_WEP_STATUS WepStatus; - NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeMax; - NDIS_802_11_SSID Ssid; -#ifdef HOSTAPD_SUPPORT - MAC_TABLE_ENTRY *pEntry; - STA_TR_ENTRY *tr_entry; - struct ieee80211req_mlme mlme; - struct ieee80211req_key Key; - struct ieee80211req_del_key delkey; - UINT8 Wcid; - BSS_STRUCT *pMbss; - WSC_LV_INFO WscIEBeacon; - WSC_LV_INFO WscIEProbeResp; - int i; -#endif /*HOSTAPD_SUPPORT*/ -#ifdef APCLI_SUPPORT -#endif /*APCLI_SUPPORT*/ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - switch (cmd & 0x7FFF) { -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - case OID_GET_RXDATA_LAPSE_TIME: { - int i = 0; - MSG_CLIENT_LIST Rsp; - - NdisZeroMemory((void *)&Rsp, sizeof(MSG_CLIENT_LIST)); - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("%d ", pEntry->wcid)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%02X:%02X:%02X:%02X:%02X:%02X ", - PRINT_MAC(pEntry->Addr))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%ld\n", pEntry->LastRxTimeCount)); - - Rsp.CLIENTLIST[i - 1].LastRxTimeCount = - pEntry->LastRxTimeCount; - COPY_MAC_ADDR(&Rsp.CLIENTLIST[i - 1].Addr, - pEntry->Addr); - Rsp.ClientCnt++; - } - } - - Status = copy_to_user(wrq->u.data.pointer, &Rsp, - wrq->u.data.length); - } break; -#endif -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE - case OID_GET_CURRENT_RSSI: { - int i = 0; - MSG_RSSI_LIST Rsp; - INT32 ifIndex = pObj->ioctl_if; - struct wifi_dev *wdev; - - if ((pObj->ioctl_if_type != INT_APCLI) || - (ifIndex >= MAX_APCLI_NUM)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] Invalid Interface Type %d Number %d \n", - __func__, pObj->ioctl_if_type, ifIndex)); - Status = EFAULT; - break; - } else - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - - if (IS_VENDOR10_RSSI_VALID(wdev) == FALSE) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] RSSI Feature Disabled \n", __func__)); - Status = EFAULT; - break; - } - - NdisZeroMemory((void *)&Rsp, sizeof(MSG_RSSI_LIST)); - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if (IS_VALID_ENTRY(pEntry)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%02X:%02X:%02X:%02X:%02X:%02X ", - PRINT_MAC(pEntry->Addr))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%d\n", pEntry->CurRssi)); - - Rsp.CurRssi = pEntry->CurRssi; - COPY_MAC_ADDR(&Rsp.Addr, pEntry->Addr); - break; - } - } - - if (i > MAX_LEN_OF_MAC_TABLE) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] No Entry Found \n", __func__)); - Status = EFAULT; - break; - } - - Status = copy_to_user(wrq->u.data.pointer, &Rsp, - wrq->u.data.length); - } break; - - case OID_SET_VENDOR10_RSSI: { - BOOLEAN RssiEnbl; - UINT32 mac_val = 0; - INT32 ifIndex = pObj->ioctl_if; - struct wifi_dev *wdev; - - if ((pObj->ioctl_if_type != INT_APCLI) || - (ifIndex >= MAX_APCLI_NUM)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] Invalid Interface Type %d Number %d \n", - __func__, pObj->ioctl_if_type, ifIndex)); - Status = EFAULT; - break; - } else - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - - if (wrq->u.data.length != sizeof(BOOLEAN)) - Status = -EINVAL; - else { - Status = copy_from_user(&RssiEnbl, wrq->u.data.pointer, - wrq->u.data.length); - SET_VENDOR10_RSSI_VALID(wdev, RssiEnbl); - - /* RCPI include ACK and Data */ - MAC_IO_READ32(pAd, WTBL_OFF_RMVTCR, &mac_val); - - if (RX_MV_MODE & mac_val) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Current Alg Respond Frame Alg %d\n", - mac_val)); - else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Current Alg Respond Frame/Data Alg %d\n", - mac_val)); - - if (IS_VENDOR10_RSSI_VALID(wdev) && - !(RX_MV_MODE & mac_val)) { - mac_val |= RX_MV_MODE; - MAC_IO_WRITE32(pAd, WTBL_OFF_RMVTCR, mac_val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("New Alg Respond Frame/Data %d\n", - mac_val)); - } else if ((IS_VENDOR10_RSSI_VALID(wdev) == FALSE) && - (RX_MV_MODE & mac_val)) { - mac_val &= ~RX_MV_MODE; - MAC_IO_WRITE32(pAd, WTBL_OFF_RMVTCR, mac_val); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("New Alg Respond Frame %d\n", - mac_val)); - } - } - } break; -#endif - -#ifdef OFFCHANNEL_SCAN_FEATURE - case OID_802_11_CHANNELINFO: { - int i = 0; - struct msg_channel_list Rsp; - UCHAR BandIdx = 0; - INT32 ifIndex = pObj->ioctl_if; - CHANNEL_CTRL *pChCtrl = NULL; - struct wifi_dev *wdev; - - if (pObj->ioctl_if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else - wdev = &pAd->ApCfg.MBSSID[0].wdev; - BandIdx = HcGetBandByWdev(wdev); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - NdisZeroMemory((void *)&Rsp, sizeof(struct msg_channel_list)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s] : (sync) Msg received !! \n", __LINE__, - __func__)); - pAd->ChannelListNum = pChCtrl->ChListNum; - for (i = 0; i < pChCtrl->ChListNum; i++) { - Rsp.CHANNELLIST[i].channel = pChCtrl->ChList[i].Channel; - pAd->ChannelList[i].Channel = - pChCtrl->ChList[i].Channel; - Rsp.CHANNELLIST[i].channel_idx = i; - Rsp.CHANNELLIST[i].dfs_req = pChCtrl->ChList[i].DfsReq; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s] : channel : %d channel_id : %d dfs_req : %d !! \n", - __LINE__, __func__, Rsp.CHANNELLIST[i].channel, - Rsp.CHANNELLIST[i].channel_idx, - Rsp.CHANNELLIST[i].dfs_req)); - } - Status = copy_to_user(wrq->u.data.pointer, &Rsp, - wrq->u.data.length); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%d][%s] OID_802_11_CHANNELINFO: channel count: %d IOCTL_Call_Status:%d!! \n", - __LINE__, __func__, pChCtrl->ChListNum, Status)); - } break; - case OID_802_11_CURRENT_CHANNEL_INFO: { - CHANNEL_INFO Rsp; - struct wifi_dev *wdev = NULL; - INT32 ifIndex = pObj->ioctl_if; - UCHAR RfIC = 0; - - if (pObj->ioctl_if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else - wdev = &pAd->ApCfg.MBSSID[0].wdev; - RfIC = (WMODE_CAP_5G(wdev->PhyMode)) ? RFIC_5GHZ : RFIC_24GHZ; - memcpy(pAd->ScanCtrl.if_name, wrq->ifr_ifrn.ifrn_name, - IFNAMSIZ); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s] : (sync) Msg received for current channel info!! \n", - __LINE__, __func__)); - Rsp.channel = HcGetChannelByRf(pAd, RfIC); - Rsp.channel_idx = Channel2Index(pAd, Rsp.channel); - Rsp.dfs_req = pAd->ChannelList[Rsp.channel_idx].DfsReq; - Rsp.tx_time = pAd->Ch_Stats[DBDC_BAND0].Tx_Time; - Rsp.rx_time = pAd->Ch_Stats[DBDC_BAND0].Rx_Time; - Rsp.obss_time = pAd->Ch_Stats[DBDC_BAND0].Obss_Time; - Rsp.NF = pAd->Avg_NF[DBDC_BAND0]; - Rsp.channel_busy_time = pAd->Ch_BusyTime[DBDC_BAND0]; - Rsp.actual_measured_time = - (pAd->ChannelStats.MeasurementDuration / - 1000); /* Convert MeasurementDuration to milli seconds */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%d][%s] : Current channel : %d Current channel_id : %d Current ch dfs_req : %d NF : %d Ch_bsy_time : %u!! \n", - __LINE__, __func__, Rsp.channel, Rsp.channel_idx, - Rsp.dfs_req, Rsp.NF, Rsp.channel_busy_time)); - Status = copy_to_user(wrq->u.data.pointer, &Rsp, - wrq->u.data.length); - } break; - case OID_OPERATING_INFO: { - OPERATING_INFO Info; - INT32 ifIndex = pObj->ioctl_if; - UCHAR RfIC = 0; - struct wifi_dev *wdev; - - if (pObj->ioctl_if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else - wdev = &pAd->ApCfg.MBSSID[0].wdev; - RfIC = (WMODE_CAP_5G(wdev->PhyMode)) ? RFIC_5GHZ : RFIC_24GHZ; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s] : (sync) Msg received for current channel info!! \n", - __LINE__, __func__)); - Info.cfg_ht_bw = wlan_config_get_ht_bw(wdev); - Info.cfg_vht_bw = wlan_config_get_vht_bw(wdev); - Info.RDDurRegion = pAd->CommonCfg.RDDurRegion; - Info.region = GetCountryRegionFromCountryCode( - pAd->CommonCfg.CountryCode); - Info.channel = HcGetChannelByRf(pAd, RfIC); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%d][%s] : Channel: %d Info.cfg_ht_bw : %d Info.cfg_vht_bw : %d !! \n", - __LINE__, __func__, Info.channel, Info.cfg_ht_bw, - Info.cfg_vht_bw)); - Status = copy_to_user(wrq->u.data.pointer, &Info, - wrq->u.data.length); - } break; -#endif -#ifdef APCLI_SUPPORT -#endif /*APCLI_SUPPORT*/ - - case OID_802_11_DEAUTHENTICATION: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_DEAUTHENTICATION\n")); - - if (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT)) - Status = -EINVAL; - else { - MAC_TABLE_ENTRY *pEntry = NULL; - MLME_DEAUTH_REQ_STRUCT *pInfo = NULL; - MLME_QUEUE_ELEM *Elem; - - os_alloc_mem(pAd, (UCHAR **)&Elem, - sizeof(MLME_QUEUE_ELEM)); - - if (Elem == NULL) { - Status = -ENOMEM; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Set::OID_802_11_DEAUTHENTICATION, Failed!!\n")); - break; - } - -#ifdef APCLI_SUPPORT -#endif /*APCLI_SUPPORT*/ - { - if (Elem) { - pInfo = (MLME_DEAUTH_REQ_STRUCT *) - Elem->Msg; - Status = copy_from_user( - pInfo, wrq->u.data.pointer, - wrq->u.data.length); - pEntry = MacTableLookup(pAd, - pInfo->Addr); - - if (pEntry != NULL) { - Elem->Wcid = pEntry->wcid; - MlmeEnqueue( - pAd, - AP_AUTH_STATE_MACHINE, - APMT2_MLME_DEAUTH_REQ, - sizeof(MLME_DEAUTH_REQ_STRUCT), - Elem, 0); - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\n", - pInfo->Reason)); - } - - os_free_mem(Elem); - } - } - } - - break; -#ifdef IAPP_SUPPORT - - case RT_SET_IAPP_PID: { - unsigned IappPid; - - if (sizeof(IappPid) != wrq->u.data.length) { - Status = -EFAULT; - break; - } - - if (copy_from_user(&IappPid, wrq->u.data.pointer, - wrq->u.data.length)) - Status = -EFAULT; - else { - RTMP_GET_OS_PID(pObj->IappPid, IappPid); - pObj->IappPid_nr = IappPid; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_SET_APD_PID::(IappPid=%u)\n", IappPid)); - } - } break; -#endif /* IAPP_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - - case RT_SET_FT_STATION_NOTIFY: - case RT_SET_FT_KEY_REQ: - case RT_SET_FT_KEY_RSP: - case RT_FT_KEY_SET: - case RT_FT_NEIGHBOR_REPORT: - case RT_FT_NEIGHBOR_REQUEST: - case RT_FT_NEIGHBOR_RESPONSE: - case RT_FT_ACTION_FORWARD: { - UCHAR *pBuffer; - - FT_MEM_ALLOC(pAd, &pBuffer, wrq->u.data.length + 1); - - if (pBuffer == NULL) - break; - - if (copy_from_user(pBuffer, wrq->u.data.pointer, - wrq->u.data.length)) { - Status = -EFAULT; - FT_MEM_FREE(pAd, pBuffer); - break; - } - - switch (cmd & 0x7FFF) { - case RT_SET_FT_STATION_NOTIFY: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_SET_FT_STATION_NOTIFY\n")); - FT_KDP_StationInform(pAd, pBuffer, wrq->u.data.length); - break; - - case RT_SET_FT_KEY_REQ: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_SET_FT_KEY_REQ\n")); - FT_KDP_IOCTL_KEY_REQ(pAd, pBuffer, wrq->u.data.length); - break; - - case RT_SET_FT_KEY_RSP: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_SET_FT_KEY_RSP\n")); - FT_KDP_KeyResponseToUs(pAd, pBuffer, - wrq->u.data.length); - break; - - case RT_FT_KEY_SET: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_FT_KEY_SET\n")); - /* Note: the key must be ended by 0x00 */ - pBuffer[wrq->u.data.length] = 0x00; - FT_KDP_CryptKeySet(pAd, pBuffer, wrq->u.data.length); - break; - - case RT_FT_NEIGHBOR_REPORT: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_FT_NEIGHBOR_REPORT\n")); -#ifdef FT_KDP_FUNC_INFO_BROADCAST - FT_KDP_NeighborReportHandle(pAd, pBuffer, - wrq->u.data.length); -#endif /* FT_KDP_FUNC_INFO_BROADCAST */ - break; - - case RT_FT_NEIGHBOR_REQUEST: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_FT_NEIGHBOR_REPORT\n")); - FT_KDP_NeighborRequestHandle(pAd, pBuffer, - wrq->u.data.length); - break; - - case RT_FT_NEIGHBOR_RESPONSE: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_FT_NEIGHBOR_RESPONSE\n")); - FT_KDP_NeighborResponseHandle(pAd, pBuffer, - wrq->u.data.length); - break; - - case RT_FT_ACTION_FORWARD: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[ra%d] RT_FT_ACTION_FORWARD\n", - pObj->ioctl_if)); - FT_RRB_ActionHandle(pAd, pObj->ioctl_if, pBuffer, - wrq->u.data.length); - break; - } - - FT_MEM_FREE(pAd, pBuffer); - } break; - - case OID_802_11R_SUPPORT: - if (wrq->u.data.length != sizeof(BOOLEAN)) - Status = -EINVAL; - else { - UCHAR apidx = pObj->ioctl_if; - ULONG value; - - Status = copy_from_user(&value, wrq->u.data.pointer, - wrq->u.data.length); - pAd->ApCfg.MBSSID[apidx] - .wdev.FtCfg.FtCapFlag.Dot11rFtEnable = - (value == 0 ? FALSE : TRUE); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11R_SUPPORT(=%d)\n", - pAd->ApCfg.MBSSID[apidx] - .wdev.FtCfg.FtCapFlag.Dot11rFtEnable)); - } - - break; - - case OID_802_11R_MDID: - if (wrq->u.data.length != FT_MDID_LEN) - Status = -EINVAL; - else { - UCHAR apidx = pObj->ioctl_if; - - Status = copy_from_user( - pAd->ApCfg.MBSSID[apidx].wdev.FtCfg.FtMdId, - wrq->u.data.pointer, wrq->u.data.length); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11R_MDID(=%c%c)\n", - pAd->ApCfg.MBSSID[apidx].wdev.FtCfg.FtMdId[0], - pAd->ApCfg.MBSSID[apidx].wdev.FtCfg.FtMdId[0])); - /*#ifdef WH_EZ_SETUP - Dynamic update of MdId in ez security Info not supported currently - #endif */ - } - - break; - - case OID_802_11R_R0KHID: - if (wrq->u.data.length <= FT_ROKH_ID_LEN) - Status = -EINVAL; - else { - UCHAR apidx = pObj->ioctl_if; - - Status = copy_from_user( - pAd->ApCfg.MBSSID[apidx].wdev.FtCfg.FtR0khId, - wrq->u.data.pointer, wrq->u.data.length); - pAd->ApCfg.MBSSID[apidx].wdev.FtCfg.FtR0khIdLen = - wrq->u.data.length; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11R_OID_802_11R_R0KHID(=%s) Len=%d\n", - pAd->ApCfg.MBSSID[apidx].wdev.FtCfg.FtR0khId, - pAd->ApCfg.MBSSID[apidx] - .wdev.FtCfg.FtR0khIdLen)); - } - - break; - - case OID_802_11R_RIC: - if (wrq->u.data.length != sizeof(BOOLEAN)) - Status = -EINVAL; - else { - UCHAR apidx = pObj->ioctl_if; - ULONG value; - - Status = copy_from_user(&value, wrq->u.data.pointer, - wrq->u.data.length); - pAd->ApCfg.MBSSID[apidx].wdev.FtCfg.FtCapFlag.RsrReqCap = - (value == 0 ? FALSE : TRUE); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11R_RIC(=%d)\n", - pAd->ApCfg.MBSSID[apidx] - .wdev.FtCfg.FtCapFlag.Dot11rFtEnable)); - } - - break; - - case OID_802_11R_OTD: - if (wrq->u.data.length != sizeof(BOOLEAN)) - Status = -EINVAL; - else { - UCHAR apidx = pObj->ioctl_if; - ULONG value; - - Status = copy_from_user(&value, wrq->u.data.pointer, - wrq->u.data.length); - pAd->ApCfg.MBSSID[apidx].wdev.FtCfg.FtCapFlag.FtOverDs = - (value == 0 ? FALSE : TRUE); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11R_OTD(=%d)\n", - pAd->ApCfg.MBSSID[apidx] - .wdev.FtCfg.FtCapFlag.Dot11rFtEnable)); - } - - break; -#endif /* DOT11R_FT_SUPPORT */ - - case RT_SET_APD_PID: { - unsigned long apd_pid; - - if (sizeof(apd_pid) != wrq->u.data.length) { - Status = -EFAULT; - break; - } - - if (copy_from_user(&apd_pid, wrq->u.data.pointer, - wrq->u.data.length)) - Status = -EFAULT; - else { - RTMP_GET_OS_PID(pObj->apd_pid, apd_pid); - pObj->apd_pid_nr = apd_pid; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_SET_APD_PID::(ApdPid=%lu)\n", apd_pid)); - } - } break; - - case RT_SET_DEL_MAC_ENTRY: - if (wrq->u.data.length != MAC_ADDR_LEN) { - Status = -EFAULT; - break; - } - - if (copy_from_user(Addr, wrq->u.data.pointer, - wrq->u.data.length)) - Status = -EFAULT; - else { - MAC_TABLE_ENTRY *pEntry = NULL; - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_SET_DEL_MAC_ENTRY::(%02x:%02x:%02x:%02x:%02x:%02x)\n", - Addr[0], Addr[1], Addr[2], Addr[3], Addr[4], - Addr[5])); - - if ((pObj->ioctl_if_type == INT_MAIN) || - (pObj->ioctl_if_type == INT_MBSSID)) { - struct wifi_dev *wdev = NULL; - - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - pEntry = MacTableLookup2(pAd, Addr, wdev); - } else - pEntry = MacTableLookup(pAd, Addr); - - if (pEntry) { -#ifdef MAC_REPEATER_SUPPORT - - /* - Need to delete repeater entry if this is mac repeater entry. - */ - if (pAd->ApCfg.bMACRepeaterEn) { - UCHAR apCliIdx, CliIdx; - REPEATER_CLIENT_ENTRY *pReptEntry = - NULL; - - pReptEntry = RTMPLookupRepeaterCliEntry( - pAd, TRUE, pEntry->Addr, TRUE); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Delete (%02x:%02x:%02x:%02x:%02x:%02x) mac repeater entry\n", - Addr[0], Addr[1], Addr[2], - Addr[3], Addr[4], Addr[5])); - - if (pReptEntry) { - apCliIdx = - pReptEntry - ->MatchApCliIdx; - CliIdx = - pReptEntry->MatchLinkIdx; - pReptEntry - ->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_APCFG_DEL_MAC_ENTRY; - MlmeEnqueue( - pAd, - APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, - 0, NULL, - (64 + - MAX_EXT_MAC_ADDR_SIZE * - apCliIdx + - CliIdx)); - RTMP_MLME_HANDLER(pAd); - } - } - -#endif /* MAC_REPEATER_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - - /* - If AP send de-auth to Apple STA, - Apple STA will re-do auth/assoc and security handshaking with AP again. - @20150313 - */ - if (IS_FT_RSN_STA(pEntry)) - MacTableDeleteEntry(pAd, pEntry->Aid, - Addr); - else -#endif /* DOT11R_FT_SUPPORT */ - MlmeDeAuthAction( - pAd, pEntry, - REASON_DISASSOC_STA_LEAVING, - FALSE); - /*// TODO: MAP R2*/ - } - } - - break; -#ifdef WSC_AP_SUPPORT -#ifdef CON_WPS - - case RT_OID_WSC_SET_CON_WPS_STOP: { - UCHAR apidx = pObj->ioctl_if; - PWSC_UPNP_CTRL_WSC_BAND_STOP pWscUpnpBandStop; - PWSC_CTRL pWpsCtrl = NULL; - INT IsAPConfigured; - - os_alloc_mem(NULL, (UCHAR **)&pWscUpnpBandStop, - sizeof(WSC_UPNP_CTRL_WSC_BAND_STOP)); - - if (pWscUpnpBandStop) { - Status = copy_from_user(pWscUpnpBandStop, - wrq->u.data.pointer, - wrq->u.data.length); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CON_WPS BAND_STOP_CMD From[%s], isApCli[%d], is2gBand[%d]\n", - pWscUpnpBandStop->ifName, - pWscUpnpBandStop->isApCli, - pWscUpnpBandStop->is2gBand)); - - if (pWscUpnpBandStop->isApCli) { - UCHAR i; - struct wifi_dev *apcli_wdev; - - for (i = 0; i < MAX_APCLI_NUM; i++) { - pWpsCtrl = &pAd->ApCfg.ApCliTab[i] - .wdev.WscControl; - apcli_wdev = - &pAd->ApCfg.ApCliTab[i].wdev; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("CON_WPS FROM IOCTL: Stop the %s WPS, state [%d]\n", - apcli_wdev->if_dev->name, - pWpsCtrl->WscState)); - - if (pWpsCtrl->WscState != - WSC_STATE_OFF) { - WscStop(pAd, TRUE, pWpsCtrl); - pWpsCtrl->WscConfMode = - WSC_DISABLE; - } - } - } else { - struct wifi_dev *wdev = - &pAd->ApCfg.MBSSID[apidx].wdev; - - pWpsCtrl = &wdev->WscControl; - IsAPConfigured = pWpsCtrl->WscConfStatus; - - if ((pWpsCtrl->WscConfMode != WSC_DISABLE) && - (pWpsCtrl->bWscTrigger == TRUE)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("FROM IOCTL CON_WPS[%d]: Stop the AP Wsc Machine\n", - apidx)); - WscBuildBeaconIE(pAd, IsAPConfigured, - FALSE, 0, 0, apidx, - NULL, 0, AP_MODE); - WscBuildProbeRespIE( - pAd, WSC_MSGTYPE_AP_WLAN_MGR, - IsAPConfigured, FALSE, 0, 0, - apidx, NULL, 0, AP_MODE); - UpdateBeaconHandler(pAd, wdev, - BCN_UPDATE_IE_CHG); - WscStop(pAd, FALSE, pWpsCtrl); - } - } - - os_free_mem(pWscUpnpBandStop); - } - } break; -#endif /* CON_WPS */ - - case RT_OID_WSC_SET_SELECTED_REGISTRAR: { - PUCHAR upnpInfo; - UCHAR apidx = pObj->ioctl_if; -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - Status = -EINVAL; - } else { -#endif /*HOSTAPD_SUPPORT*/ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WSC::RT_OID_WSC_SET_SELECTED_REGISTRAR, wrq->u.data.length=%d!\n", - wrq->u.data.length)); - os_alloc_mem(pAd, (UCHAR **)&upnpInfo, - wrq->u.data.length); - - if (upnpInfo) { - int len, Status; - - Status = copy_from_user(upnpInfo, - wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - len = wrq->u.data.length; - - if ((pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl - .WscConfMode & - WSC_PROXY)) { - WscSelectedRegistrar(pAd, - upnpInfo, - len, - apidx); - - if (pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl - .Wsc2MinsTimerRunning == - TRUE) { - BOOLEAN Cancelled; - - RTMPCancelTimer( - &pAd->ApCfg - .MBSSID[apidx] - .wdev - .WscControl - .Wsc2MinsTimer, - &Cancelled); - } - - /* 2mins time-out timer */ - RTMPSetTimer( - &pAd->ApCfg - .MBSSID[apidx] - .wdev - .WscControl - .Wsc2MinsTimer, - WSC_TWO_MINS_TIME_OUT); - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl - .Wsc2MinsTimerRunning = - TRUE; - } - } - - os_free_mem(upnpInfo); - } else - Status = -EINVAL; - -#ifdef HOSTAPD_SUPPORT - } - -#endif /*HOSTAPD_SUPPORT*/ - } break; - - case RT_OID_WSC_EAPMSG: { - RTMP_WSC_U2KMSG_HDR *msgHdr = NULL; - PUCHAR pUPnPMsg = NULL; - UINT msgLen = 0, Machine = 0, msgType = 0; - int retVal, senderID = 0; - struct wifi_dev *wdev; -#ifdef HOSTAPD_SUPPORT - UCHAR apidx = pObj->ioctl_if; - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - Status = -EINVAL; - } else { -#endif /*HOSTAPD_SUPPORT*/ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WSC::RT_OID_WSC_EAPMSG, wrq->u.data.length=%d, ioctl_if=%d\n", - wrq->u.data.length, pObj->ioctl_if)); - msgLen = wrq->u.data.length; - os_alloc_mem(pAd, (UCHAR **)&pUPnPMsg, msgLen); - - if (pUPnPMsg == NULL) - Status = -EINVAL; - else { - int HeaderLen; - RTMP_STRING *pWpsMsg; - UINT WpsMsgLen; - PWSC_CTRL pWscControl; - BOOLEAN bGetDeviceInfo = FALSE; - - NdisZeroMemory(pUPnPMsg, msgLen); - retVal = copy_from_user( - pUPnPMsg, wrq->u.data.pointer, msgLen); - msgHdr = (RTMP_WSC_U2KMSG_HDR *)pUPnPMsg; - wdev = wdev_search_by_address( - pAd, &msgHdr->Addr1[0]); - - if (!wdev) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:: cannot find wdev by addr(%02x:%02x:%02x:%02x:%02x:%02x).\n", - __func__, - PRINT_MAC(msgHdr->Addr1))); - os_free_mem(pUPnPMsg); - Status = -EINVAL; - break; - } - - senderID = get_unaligned( - (INT32 *)(&msgHdr->Addr2[0])); - /*senderID = *((int *)&msgHdr->Addr2); */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RT_OID_WSC_EAPMSG++++++++\n\n")); - hex_dump("MAC::", &msgHdr->Addr3[0], - MAC_ADDR_LEN); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RT_OID_WSC_EAPMSG++++++++\n\n")); - HeaderLen = LENGTH_802_11 + LENGTH_802_1_H + - sizeof(IEEE8021X_FRAME) + - sizeof(EAP_FRAME); - pWpsMsg = (RTMP_STRING *)&pUPnPMsg[HeaderLen]; - WpsMsgLen = msgLen - HeaderLen; - /*assign the STATE_MACHINE type */ - Machine = WSC_STATE_MACHINE; - msgType = WSC_EAPOL_UPNP_MSG; - pWscControl = &wdev->WscControl; - - /* If AP is unconfigured, WPS state machine will be triggered after received M2. */ - if ((pWscControl->WscConfStatus == - WSC_SCSTATE_UNCONFIGURED) -#ifdef WSC_V2_SUPPORT - && (pWscControl->WscV2Info.bWpsEnable || - (pWscControl->WscV2Info.bEnableWpsV2 == - FALSE)) -#endif /* WSC_V2_SUPPORT */ - ) { - if (strstr(pWpsMsg, "SimpleConfig") && - !pWscControl->EapMsgRunning && - !pWscControl->WscUPnPNodeInfo - .bUPnPInProgress) { - /* GetDeviceInfo */ - WscInit(pAd, FALSE, - pObj->ioctl_if); - /* trigger wsc re-generate public key */ - pWscControl->RegData - .ReComputePke = 1; - bGetDeviceInfo = TRUE; - } else if (WscRxMsgTypeFromUpnp( - pAd, pWpsMsg, - WpsMsgLen) == - WSC_MSG_M2 && - !pWscControl->EapMsgRunning && - !pWscControl->WscUPnPNodeInfo - .bUPnPInProgress) { - /* Check Enrollee Nonce of M2 */ - if (WscCheckEnrolleeNonceFromUpnp( - pAd, pWpsMsg, - WpsMsgLen, - pWscControl)) { - WscGetConfWithoutTrigger( - pAd, - pWscControl, - TRUE); - pWscControl->WscState = - WSC_STATE_SENT_M1; - } - } - } - - retVal = MlmeEnqueueForWsc(pAd, msgHdr->envID, - senderID, Machine, - msgType, msgLen, - pUPnPMsg, wdev); - - if ((retVal == FALSE) && (msgHdr->envID != 0)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("MlmeEnqueuForWsc return False and envID=0x%x!\n", - msgHdr->envID)); - Status = -EINVAL; - } - - os_free_mem(pUPnPMsg); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_OID_WSC_EAPMSG finished!\n")); -#ifdef HOSTAPD_SUPPORT - } - -#endif /*HOSTAPD_SUPPORT*/ - } break; - - case RT_OID_WSC_READ_UFD_FILE: - if (wrq->u.data.length > 0) { - RTMP_STRING *pWscUfdFileName = NULL; - UCHAR apIdx = pObj->ioctl_if; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apIdx]; - WSC_CTRL *pWscCtrl = &pMbss->wdev.WscControl; - - os_alloc_mem(pAd, (UCHAR **)&pWscUfdFileName, - wrq->u.data.length + 1); - - if (pWscUfdFileName) { - RTMPZeroMemory(pWscUfdFileName, - wrq->u.data.length + 1); - - if (copy_from_user(pWscUfdFileName, - wrq->u.data.pointer, - wrq->u.data.length)) - Status = -EFAULT; - else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RT_OID_WSC_READ_UFD_FILE (WscUfdFileName=%s)\n", - pWscUfdFileName)); - - if (pWscCtrl->WscConfStatus == - WSC_SCSTATE_UNCONFIGURED) { - if (WscReadProfileFromUfdFile( - pAd, apIdx, - pWscUfdFileName)) { - pWscCtrl->WscConfStatus = - WSC_SCSTATE_CONFIGURED; - APStop(pAd, pMbss, - AP_BSS_OPER_SINGLE); - APStartUp( - pAd, pMbss, - AP_BSS_OPER_SINGLE); - } - } else { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RT_OID_WSC_READ_UFD_FILE: AP is configured.\n")); - Status = -EINVAL; - } - } - - os_free_mem(pWscUfdFileName); - } else - Status = -ENOMEM; - } else - Status = -EINVAL; - - break; - - case RT_OID_WSC_WRITE_UFD_FILE: - if (wrq->u.data.length > 0) { - RTMP_STRING *pWscUfdFileName = NULL; - UCHAR apIdx = pObj->ioctl_if; - WSC_CTRL *pWscCtrl = - &pAd->ApCfg.MBSSID[apIdx].wdev.WscControl; - - os_alloc_mem(pAd, (UCHAR **)&pWscUfdFileName, - wrq->u.data.length + 1); - - if (pWscUfdFileName) { - RTMPZeroMemory(pWscUfdFileName, - wrq->u.data.length + 1); - - if (copy_from_user(pWscUfdFileName, - wrq->u.data.pointer, - wrq->u.data.length)) - Status = -EFAULT; - else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RT_OID_WSC_WRITE_UFD_FILE (WscUfdFileName=%s)\n", - pWscUfdFileName)); - - if (pWscCtrl->WscConfStatus == - WSC_SCSTATE_CONFIGURED) - WscWriteProfileToUfdFile( - pAd, apIdx, - pWscUfdFileName); - else { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RT_OID_WSC_WRITE_UFD_FILE: AP is un-configured.\n")); - Status = -EINVAL; - } - } - - os_free_mem(pWscUfdFileName); - } else - Status = -ENOMEM; - } else - Status = -EINVAL; - - break; - case OID_WSC_UUID: - case RT_OID_WSC_UUID: - if (wrq->u.data.length == (UUID_LEN_STR - 1)) { - UCHAR apIdx = pObj->ioctl_if; - - pAd->ApCfg.MBSSID[apIdx] - .wdev.WscControl.Wsc_Uuid_Str[0] = '\0'; - Status = copy_from_user( - &pAd->ApCfg.MBSSID[apIdx] - .wdev.WscControl.Wsc_Uuid_Str[0], - wrq->u.data.pointer, wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("UUID ASCII string: %s\n", - pAd->ApCfg.MBSSID[apIdx] - .wdev.WscControl.Wsc_Uuid_Str)); - } else if (wrq->u.data.length == UUID_LEN_HEX) { - UCHAR apIdx = pObj->ioctl_if, ii; - - Status = copy_from_user( - &pAd->ApCfg.MBSSID[apIdx] - .wdev.WscControl.Wsc_Uuid_E[0], - wrq->u.data.pointer, wrq->u.data.length); - - for (ii = 0; ii < 16; ii++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%02x", (pAd->ApCfg.MBSSID[apIdx] - .wdev.WscControl - .Wsc_Uuid_E[ii] & - 0xff))); - } else - Status = -EINVAL; - - break; -#endif /* WSC_AP_SUPPORT */ - case OID_SET_SSID: - if (wrq->u.data.length <= MAX_LEN_OF_SSID) { -#ifdef APCLI_SUPPORT - UCHAR apcli_idx = pObj->ioctl_if; - BOOLEAN apcliEn; - APCLI_STRUCT *apcli_entry; -#endif /* APCLI_SUPPORT */ - struct wifi_dev *wdev; - struct DOT11_H *pDot11h = NULL; - BSS_STRUCT *pMbss = NULL; -#ifdef APCLI_SUPPORT - if (pObj->ioctl_if_type == INT_APCLI) { - apcli_entry = &pAd->ApCfg.ApCliTab[apcli_idx]; - wdev = &apcli_entry->wdev; - /* bring apcli interface down first */ - apcliEn = apcli_entry->Enable; - - if (apcliEn == TRUE) { - apcli_entry->Enable = FALSE; - ApCliIfDown(pAd); - } - - apcli_entry->bPeerExist = FALSE; - NdisZeroMemory(apcli_entry->CfgSsid, - MAX_LEN_OF_SSID); - Status = copy_from_user(apcli_entry->CfgSsid, - wrq->u.data.pointer, - wrq->u.data.length); - apcli_entry->CfgSsidLen = - (UCHAR)wrq->u.data.length; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(apcli%d) OID_APCLI_SSID::(Len=%d,Ssid=%s)\n", - apcli_entry->ifIndex, - apcli_entry->CfgSsidLen, - apcli_entry->CfgSsid)); - apcli_entry->Enable = apcliEn; - } else { -#endif /* APCLI_SUPPORT */ - if (pObj->ioctl_if < HW_BEACON_MAX_NUM) { - pMbss = &pAd->ApCfg - .MBSSID[pObj->ioctl_if]; - wdev = &pMbss->wdev; - NdisZeroMemory(pMbss->Ssid, - MAX_LEN_OF_SSID); - Status = copy_from_user( - pMbss->Ssid, - wrq->u.data.pointer, - wrq->u.data.length); - pMbss->SsidLen = wrq->u.data.length; - if (wdev == NULL) { - Status = -EINVAL; - break; - } - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) { - Status = -EINVAL; - break; - } - { - ApSendBroadcastDeauth(pAd, - wdev); - if (IS_SECURITY( - &wdev->SecConfig)) - pMbss->CapabilityInfo |= - 0x0010; - else - pMbss->CapabilityInfo &= - ~(0x0010); - APSecInit(pAd, wdev); - restart_ap(&pMbss->wdev); - if (pAd->CommonCfg - .need_fallback == - 1) { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] Need fallback to 20 MHz: pMbss->wdev.channel:%d\n", - __func__, - pMbss->wdev - .channel)); - wlan_operate_set_ht_bw( - &pMbss->wdev, - HT_BW_20, - EXTCHA_NONE); - } - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(ra%d) Set_SSID::(Len=%d,Ssid=%s)\n", - pObj->ioctl_if, - pMbss->SsidLen, - pMbss->Ssid)); - } - } else - Status = -EINVAL; - break; -#ifdef APCLI_SUPPORT - } -#endif /* APCLI_SUPPORT */ - } else - Status = -EINVAL; - break; - - case OID_SET_PSK: { - struct _SECURITY_CONFIG *pSecConfig = pObj->pSecConfig; - - if (pSecConfig == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:: pSecConfig == NULL \n", __func__)); - return FALSE; - } - - if (wrq->u.data.length < 65) { - Status = copy_from_user(pSecConfig->PSK, - wrq->u.data.pointer, - wrq->u.data.length); - pSecConfig->PSK[wrq->u.data.length] = '\0'; - } else - pSecConfig->PSK[0] = '\0'; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PSK = %s\n", __func__, pSecConfig->PSK)); -#ifdef CONFIG_AP_SUPPORT -#ifdef WSC_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - WSC_CTRL *pWscControl = NULL; - - if ((pObj->ioctl_if_type == INT_MAIN || - pObj->ioctl_if_type == INT_MBSSID)) { - UCHAR apidx = pObj->ioctl_if; - - pWscControl = &pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl; - } -#ifdef APCLI_SUPPORT - else if (pObj->ioctl_if_type == INT_APCLI) { - UCHAR apcli_idx = pObj->ioctl_if; - - pWscControl = &pAd->ApCfg.ApCliTab[apcli_idx] - .wdev.WscControl; - } - -#endif /* APCLI_SUPPORT */ - - if (pWscControl) { - NdisZeroMemory(pWscControl->WpaPsk, 64); - pWscControl->WpaPskLen = 0; - pWscControl->WpaPskLen = wrq->u.data.length; - Status = copy_from_user(pWscControl->WpaPsk, - wrq->u.data.pointer, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: PSK = %s\n", __func__, - pWscControl->WpaPsk)); - } - } -#endif /* WSC_AP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - break; - } - -#ifdef SNMP_SUPPORT - - case OID_802_11_SHORTRETRYLIMIT: - if (wrq->u.data.length != sizeof(ULONG)) - Status = -EINVAL; - else { - Status = copy_from_user(&ShortRetryLimit, - wrq->u.data.pointer, - wrq->u.data.length); - AsicSetRetryLimit(pAd, TX_RTY_CFG_RTY_LIMIT_SHORT, - ShortRetryLimit); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_SHORTRETRYLIMIT (ShortRetryLimit=%ld)\n", - ShortRetryLimit)); - } - - break; - - case OID_802_11_LONGRETRYLIMIT: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_LONGRETRYLIMIT\n")); - - if (wrq->u.data.length != sizeof(ULONG)) - Status = -EINVAL; - else { - Status = copy_from_user(&LongRetryLimit, - wrq->u.data.pointer, - wrq->u.data.length); - AsicSetRetryLimit(pAd, TX_RTY_CFG_RTY_LIMIT_LONG, - LongRetryLimit); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_LONGRETRYLIMIT (,LongRetryLimit=%ld)\n", - LongRetryLimit)); - } - - break; - - case OID_802_11_WEPDEFAULTKEYVALUE: { - UINT KeyIdx; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_WEPDEFAULTKEYVALUE\n")); - os_alloc_mem(pAd, (UCHAR **)&pKey, wrq->u.data.length); - - if (pKey == NULL) { - Status = -EINVAL; - break; - } - - Status = copy_from_user(pKey, wrq->u.data.pointer, - wrq->u.data.length); - - /*pKey = &WepKey; */ - - if (pKey->Length != wrq->u.data.length) { - Status = -EINVAL; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\n")); - } - - KeyIdx = pKey->KeyIndex & 0x0fffffff; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("pKey->KeyIndex =%d, pKey->KeyLength=%d\n", - pKey->KeyIndex, pKey->KeyLength)); - - /* it is a shared key */ - if (KeyIdx > 4) - Status = -EINVAL; - else { - pAd->SharedKey[pObj->ioctl_if] - [pAd->ApCfg.MBSSID[pObj->ioctl_if] - .DefaultKeyId] - .KeyLen = (UCHAR)pKey->KeyLength; - NdisMoveMemory( - &pAd->SharedKey[pObj->ioctl_if] - [pAd->ApCfg - .MBSSID[pObj->ioctl_if] - .DefaultKeyId] - .Key, - &pKey->KeyMaterial, pKey->KeyLength); - - if (pKey->KeyIndex & 0x80000000) { - /* Default key for tx (shared key) */ - pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId = - (UCHAR)KeyIdx; - } - - /*RestartAPIsRequired = TRUE; */ - } - - os_free_mem(pKey); - break; - } - - case OID_802_11_WEPDEFAULTKEYID: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_WEPDEFAULTKEYID\n")); - - if (wrq->u.data.length != sizeof(UCHAR)) - Status = -EINVAL; - else - Status = copy_from_user( - &pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, - wrq->u.data.pointer, wrq->u.data.length); - - break; - - case OID_802_11_CURRENTCHANNEL: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_CURRENTCHANNEL\n")); - - if (wrq->u.data.length != sizeof(UCHAR)) - Status = -EINVAL; - else { - RTMP_STRING ChStr[5] = { 0 }; - - Status = copy_from_user(&ctmp, wrq->u.data.pointer, - wrq->u.data.length); - snprintf(ChStr, sizeof(ChStr), "%d", ctmp); - Set_Channel_Proc(pAd, ChStr); - } - - break; -#endif /* SNMP_SUPPORT */ -#ifdef DOT1X_SUPPORT - - case OID_802_DOT1X_PMKID_CACHE: - RTMPIoctlAddPMKIDCache(pAd, wrq); - break; - - case OID_802_DOT1X_RADIUS_DATA: - Dot1xIoctlRadiusData(pAd, wrq); - break; - - case OID_802_DOT1X_WPA_KEY: - Dot1xIoctlAddWPAKey(pAd, wrq); - break; - - case OID_802_DOT1X_STATIC_WEP_COPY: - Dot1xIoctlStaticWepCopy(pAd, wrq); - break; - - case OID_802_DOT1X_IDLE_TIMEOUT: - RTMPIoctlSetIdleTimeout(pAd, wrq); - break; -#ifdef RADIUS_MAC_ACL_SUPPORT - - case OID_802_DOT1X_RADIUS_ACL_NEW_CACHE: - RTMPIoctlAddRadiusMacAuthCache(pAd, wrq); - break; - - case OID_802_DOT1X_RADIUS_ACL_DEL_CACHE: - RTMPIoctlDelRadiusMacAuthCache(pAd, wrq); - break; - - case OID_802_DOT1X_RADIUS_ACL_CLEAR_CACHE: - RTMPIoctlClearRadiusMacAuthCache(pAd, wrq); - break; -#endif /* RADIUS_MAC_ACL_SUPPORT */ -#endif /* DOT1X_SUPPORT */ - -#ifdef OCE_FILS_SUPPORT - case OID_802_DOT1X_MLME_EVENT: - RTMPIoctlStaMlmeEvent(pAd, wrq); - break; - case OID_802_DOT1X_RSNE_SYNC: - RTMPIoctlRsneSyncEvent(pAd, wrq); - break; - case OID_802_DOT1X_KEY_EVENT: { - RTMPIoctlKeyEvent(pAd, wrq); - break; - } - case OID_802_DOT1X_PMK_CACHE_EVENT: - RTMPIoctlPmkCacheEvent(pAd, wrq); - break; -#endif /* OCE_FILS_SUPPORT */ - case OID_802_11_AUTHENTICATION_MODE: { - struct wifi_dev *wdev = NULL; - UCHAR apIdx = pObj->ioctl_if; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apIdx]; - - if (wrq->u.data.length != - sizeof(NDIS_802_11_AUTHENTICATION_MODE)) - Status = -EINVAL; - else { - UINT32 AKMMap = 0; - - Status = copy_from_user(&AuthMode, wrq->u.data.pointer, - wrq->u.data.length); - - if (AuthMode > Ndis802_11AuthModeMax) { - Status = -EINVAL; - break; - } - - AKMMap = SecAuthModeOldToNew(AuthMode); -#ifdef APCLI_SUPPORT -#endif /*APCLI_SUPPORT*/ - { - wdev = &pMbss->wdev; - - if (wdev->SecConfig.AKMMap != AKMMap) { - /* Config has changed */ - pAd->bConfigChanged = TRUE; - } - - wdev->SecConfig.AKMMap = AKMMap; - } - - wdev->PortSecured = WPA_802_1X_PORT_NOT_SECURED; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_AUTHENTICATION_MODE (=0x%x)\n", - wdev->SecConfig.AKMMap)); - } - - if (wdev) { - APStop(pAd, pMbss, AP_BSS_OPER_SINGLE); - APStartUp(pAd, pMbss, AP_BSS_OPER_SINGLE); - } - - break; - } - - case OID_802_11_WEP_STATUS: - if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS)) - Status = -EINVAL; - else { - UINT32 EncryType = 0; - - Status = copy_from_user(&WepStatus, wrq->u.data.pointer, - wrq->u.data.length); - EncryType = SecEncryModeOldToNew(WepStatus); -#ifdef APCLI_SUPPORT -#endif /*APCLI_SUPPORT*/ - { - UCHAR apIdx = pObj->ioctl_if; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apIdx]; - struct wifi_dev *wdev = &pMbss->wdev; - - /* Since TKIP, AES, WEP are all supported. It should not have any invalid setting */ - if (EncryType != 0) { - if (wdev->SecConfig.PairwiseCipher != - EncryType) { - /* Config has changed */ - pAd->bConfigChanged = TRUE; - } - - wdev->SecConfig.PairwiseCipher = - EncryType; - - if (IS_CIPHER_TKIP(EncryType) && - IS_CIPHER_CCMP128(EncryType)) - SET_CIPHER_TKIP( - wdev->SecConfig - .GroupCipher); - else - wdev->SecConfig.GroupCipher = - EncryType; - } else { - Status = -EINVAL; - break; - } - - APStop(pAd, pMbss, AP_BSS_OPER_SINGLE); - APStartUp(pAd, pMbss, AP_BSS_OPER_SINGLE); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Set::OID_802_11_WEP_STATUS (=0x%x)\n", - EncryType)); - } - } - - break; - - case OID_802_11_SSID: - if (wrq->u.data.length != sizeof(NDIS_802_11_SSID)) - Status = -EINVAL; - else { - RTMP_STRING *pSsidString = NULL; - - Status = copy_from_user(&Ssid, wrq->u.data.pointer, - wrq->u.data.length); - - if (Ssid.SsidLength > MAX_LEN_OF_SSID) - Status = -EINVAL; - else { - if (Ssid.SsidLength == 0) - Status = -EINVAL; - else { - os_alloc_mem(NULL, - (UCHAR **)&pSsidString, - MAX_LEN_OF_SSID + 1); - - if (pSsidString) { - NdisZeroMemory(pSsidString, - MAX_LEN_OF_SSID + - 1); - NdisMoveMemory(pSsidString, - Ssid.Ssid, - Ssid.SsidLength); -#ifdef APCLI_SUPPORT -#endif /*APCLI_SUPPORT*/ - { - NdisZeroMemory( - (PCHAR)pAd->ApCfg - .MBSSID[pObj->ioctl_if] - .Ssid, - MAX_LEN_OF_SSID); - strncpy((PCHAR)pAd->ApCfg - .MBSSID[pObj->ioctl_if] - .Ssid, - pSsidString, - MAX_LEN_OF_SSID); - pAd->ApCfg - .MBSSID[pObj->ioctl_if] - .Ssid[MAX_LEN_OF_SSID] = - (CHAR)'\0'; - pAd->ApCfg - .MBSSID[pObj->ioctl_if] - .SsidLen = strlen( - pSsidString); - } - - os_free_mem(pSsidString); - } else - Status = -ENOMEM; - } - } - } - - break; -#ifdef VENDOR_FEATURE6_SUPPORT - - case OID_802_11_PASSPHRASES: { - INT i; - BSS_STRUCT *pMBSSStruct; - INT retval; - NDIS80211PSK tmpPSK; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - NdisZeroMemory(&tmpPSK, sizeof(tmpPSK)); - Status = copy_from_user(&tmpPSK, wrq->u.data.pointer, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::OID_802_11_PASSPHRASE\n")); - - for (i = 0; i < tmpPSK.WPAKeyLen; i++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%c", tmpPSK.WPAKey[i])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - pMBSSStruct = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - retval = SetWPAPSKKey(pAd, &tmpPSK.WPAKey[0], tmpPSK.WPAKeyLen, - (PUCHAR)pMBSSStruct->Ssid, - pMBSSStruct->SsidLen, pMBSSStruct->PMK); - - if (retval == FALSE) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("PassPhrase Generate Fail\n")); - -#ifdef WSC_AP_SUPPORT - NdisZeroMemory(pMBSSStruct->WscControl.WpaPsk, 64); - pMBSSStruct->WscControl.WpaPskLen = tmpPSK.WPAKeyLen; - NdisMoveMemory(pMBSSStruct->WscControl.WpaPsk, - &tmpPSK.WPAKey[0], - pMBSSStruct->WscControl.WpaPskLen); -#endif /* WSC_AP_SUPPORT */ - } break; -#endif /* VENDOR_FEATURE6_SUPPORT */ -#ifdef HOSTAPD_SUPPORT - - case HOSTAPD_OID_SET_802_1X: /*pure 1x is enabled. */ - Set_IEEE8021X_Proc(pAd, "1"); - break; - - case HOSTAPD_OID_SET_KEY: { - UINT KeyIdx; - - Status = -EINVAL; - pObj = (POS_COOKIE)pAd->OS_Cookie; - UINT apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - - if (wrq->u.data.length != sizeof(struct ieee80211req_key) || - !wrq->u.data.pointer) - break; - - Status = copy_from_user(&Key, wrq->u.data.pointer, - wrq->u.data.length); - pEntry = MacTableLookup(pAd, Key.ik_macaddr); - - if ((Key.ik_type == CIPHER_WEP64) || - (Key.ik_type == CIPHER_WEP128)) { /*dynamic wep with 1x */ - if (pEntry) { /*pairwise key */ - pEntry->PairwiseKey.KeyLen = Key.ik_keylen; - NdisMoveMemory(pEntry->PairwiseKey.Key, - Key.ik_keydata, Key.ik_keylen); - pEntry->PairwiseKey.CipherAlg = Key.ik_type; - KeyIdx = pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .DefaultKeyId; - AsicAddPairwiseKeyEntry(pAd, - (UCHAR)pEntry->wcid, - &pEntry->PairwiseKey); - RTMPAddWcidAttributeEntry( - pAd, pEntry->func_tb_idx, - KeyIdx, /* The value may be not zero */ - pEntry->PairwiseKey.CipherAlg, pEntry); - } else { /*group key */ - pMbss = &pAd->ApCfg.MBSSID[apidx]; - KeyIdx = Key.ik_keyix & 0x0fff; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ra%d KeyIdx=%d\n", apidx, KeyIdx)); - - /* it is a shared key */ - if (KeyIdx < 4) { - pAd->SharedKey[apidx][KeyIdx].KeyLen = - (UCHAR)Key.ik_keylen; - NdisMoveMemory( - pAd->SharedKey[apidx][KeyIdx] - .Key, - &Key.ik_keydata, Key.ik_keylen); - - if (Key.ik_keyix & 0x8000) { - /* Default key for tx (shared key) */ - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ra%d DefaultKeyId=%d\n", - apidx, KeyIdx)); - pMbss->DefaultKeyId = - (UCHAR)KeyIdx; - } - - /*pMbss->DefaultKeyId=1; */ - pAd->SharedKey[apidx][KeyIdx].CipherAlg = - Key.ik_type; - AsicAddSharedKeyEntry( - pAd, apidx, KeyIdx, - &pAd->SharedKey[apidx][KeyIdx]); - RTMPAddWcidAttributeEntry( - pAd, apidx, KeyIdx, - pAd->SharedKey - [apidx] - [pMbss->DefaultKeyId] - .CipherAlg, - NULL); - } - } - } else if (pEntry) { - KeyIdx = Key.ik_keyix & 0x0fff; - - if (pEntry->WepStatus == Ndis802_11TKIPEnable) { - pEntry->PairwiseKey.KeyLen = LEN_TK; - NdisMoveMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], - Key.ik_keydata, Key.ik_keylen); - NdisMoveMemory(pEntry->PairwiseKey.Key, - &pEntry->PTK[OFFSET_OF_PTK_TK], - Key.ik_keylen); - } - - if (pEntry->WepStatus == Ndis802_11AESEnable) { - pEntry->PairwiseKey.KeyLen = LEN_TK; - NdisMoveMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], - Key.ik_keydata, - OFFSET_OF_PTK_TK); - NdisMoveMemory(pEntry->PairwiseKey.Key, - &pEntry->PTK[OFFSET_OF_PTK_TK], - Key.ik_keylen); - } - - pEntry->PairwiseKey.CipherAlg = CIPHER_NONE; - - if (pEntry->WepStatus == Ndis802_11TKIPEnable) - pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP; - else if (pEntry->WepStatus == Ndis802_11AESEnable) - pEntry->PairwiseKey.CipherAlg = CIPHER_AES; - - pEntry->PairwiseKey.CipherAlg = Key.ik_type; - AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->wcid, - &pEntry->PairwiseKey); - } else { - pMbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &pMbss->wdev; - KeyIdx = Key.ik_keyix & 0x0fff; - /*if (Key.ik_keyix & 0x8000) */ - { - pMbss->DefaultKeyId = (UCHAR)KeyIdx; - } - - if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == - Ndis802_11TKIPEnable) { - pAd->SharedKey[apidx][pMbss->DefaultKeyId] - .KeyLen = LEN_TK; - NdisMoveMemory( - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .Key, - Key.ik_keydata, 16); - NdisMoveMemory( - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .RxMic, - (Key.ik_keydata + 16 + 8), 8); - NdisMoveMemory( - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .TxMic, - (Key.ik_keydata + 16), 8); - } - - if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == - Ndis802_11AESEnable) { - pAd->SharedKey[apidx][pMbss->DefaultKeyId] - .KeyLen = LEN_TK; - NdisMoveMemory( - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .Key, - Key.ik_keydata, 16); - NdisMoveMemory( - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .RxMic, - (Key.ik_keydata + 16 + 8), 8); - NdisMoveMemory( - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .TxMic, - (Key.ik_keydata + 16), 8); - } - - pAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg = - CIPHER_NONE; - - if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == - Ndis802_11TKIPEnable) - pAd->SharedKey[apidx][pMbss->DefaultKeyId] - .CipherAlg = CIPHER_TKIP; - else if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == - Ndis802_11AESEnable) - pAd->SharedKey[apidx][pMbss->DefaultKeyId] - .CipherAlg = CIPHER_AES; - - hex_dump("Key.ik_keydata,", - (unsigned char *)Key.ik_keydata, 32); - AsicAddSharedKeyEntry( - pAd, apidx, pMbss->DefaultKeyId, - &pAd->SharedKey[apidx][pMbss->DefaultKeyId]); - GET_GroupKey_WCID(wdev, Wcid); - /*RTMPAddWcidAttributeEntry( - pAd, - apidx, - pMbss->DefaultKeyId, - pAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg, - NULL);*/ - } - - break; - } - - case HOSTAPD_OID_DEL_KEY: - Status = -EINVAL; - - if (wrq->u.data.length != sizeof(struct ieee80211req_del_key) || - !wrq->u.data.pointer) - break; - - Status = copy_from_user(&delkey, wrq->u.data.pointer, - wrq->u.data.length); - pEntry = MacTableLookup(pAd, delkey.idk_macaddr); - - if (pEntry) { - /* clear the previous Pairwise key table */ - if (pEntry->wcid != 0) { - NdisZeroMemory(&pEntry->PairwiseKey, - sizeof(CIPHER_KEY)); - AsicRemovePairwiseKeyEntry(pAd, - (UCHAR)pEntry->wcid); - } - } else if ((delkey.idk_macaddr == NULL) && - (delkey.idk_keyix < 4)) - /* remove group key */ - AsicRemoveSharedKeyEntry(pAd, pEntry->func_tb_idx, - delkey.idk_keyix); - - break; - - case HOSTAPD_OID_SET_STA_AUTHORIZED: /*for portsecured flag. */ - if (wrq->u.data.length != sizeof(struct ieee80211req_mlme)) - Status = -EINVAL; - else { - Status = copy_from_user(&mlme, wrq->u.data.pointer, - wrq->u.data.length); - pEntry = MacTableLookup(pAd, mlme.im_macaddr); - - if (!pEntry) - Status = -EINVAL; - else { - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - - switch (mlme.im_op) { - case IEEE80211_MLME_AUTHORIZE: - pEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - pEntry->WpaState = - AS_PTKINITDONE; /*wpa state machine is not in use. */ - /*pAd->StaCfg[0].PortSecured= WPA_802_1X_PORT_SECURED; */ - tr_entry->PortSecured = - WPA_802_1X_PORT_SECURED; - break; - - case IEEE80211_MLME_UNAUTHORIZE: - pEntry->PrivacyFilter = - Ndis802_11PrivFilter8021xWEP; - tr_entry->PortSecured = - WPA_802_1X_PORT_NOT_SECURED; - break; - - default: - Status = -EINVAL; - } - } - } - - break; - - case HOSTAPD_OID_STATIC_WEP_COPY: { - UINT KeyIdx; - INT apidx; - - if (wrq->u.data.length != sizeof(struct ieee80211req_mlme)) - Status = -EINVAL; - else { - Status = copy_from_user(&mlme, wrq->u.data.pointer, - wrq->u.data.length); - pEntry = MacTableLookup(pAd, mlme.im_macaddr); - - if (!pEntry) - Status = -EINVAL; - else { - /*Status = -EINVAL; */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Woody HOSTAPD_OID_STATIC_WEP_COPY IEEE8021X=%d WepStatus=%d\n", - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.IEEE8021X, - pEntry->WepStatus)); - - if (pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.IEEE8021X != TRUE) - break; - - if (pEntry->WepStatus != Ndis802_11WEPEnabled) - break; - - apidx = pObj->ioctl_if; - pMbss = &pAd->ApCfg.MBSSID[apidx]; - KeyIdx = pMbss->DefaultKeyId; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Woody HOSTAPD_OID_STATIC_WEP_COPY=%d\n", - KeyIdx)); - pEntry->AuthMode = - pAd->ApCfg.MBSSID[apidx].AuthMode; - pEntry->PairwiseKey.KeyLen = - pAd->SharedKey[apidx][KeyIdx].KeyLen; - NdisMoveMemory( - pEntry->PairwiseKey.Key, - pAd->SharedKey[apidx][KeyIdx].Key, - pAd->SharedKey[apidx][KeyIdx].KeyLen); - pEntry->PairwiseKey.CipherAlg = - pAd->SharedKey[apidx][KeyIdx].CipherAlg; - AsicAddPairwiseKeyEntry(pAd, - (UCHAR)pEntry->wcid, - &pEntry->PairwiseKey); - RTMPAddWcidAttributeEntry( - pAd, pEntry->func_tb_idx, - KeyIdx, /* The value may be not zero */ - pEntry->PairwiseKey.CipherAlg, pEntry); - } - } - - break; - } - - case HOSTAPD_OID_SET_STA_DEAUTH: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::HOSTAPD_OID_SET_STA_DEAUTH\n")); - MLME_DEAUTH_REQ_STRUCT *pInfo; - MLME_QUEUE_ELEM *Elem; - - os_alloc_mem(NULL, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM)); - - if (Elem) { - pInfo = (MLME_DEAUTH_REQ_STRUCT *)Elem->Msg; - - if (wrq->u.data.length != - sizeof(struct ieee80211req_mlme)) - Status = -EINVAL; - else { - Status = copy_from_user(&mlme, - wrq->u.data.pointer, - wrq->u.data.length); - NdisMoveMemory(pInfo->Addr, mlme.im_macaddr, - MAC_ADDR_LEN); - pEntry = MacTableLookup(pAd, pInfo->Addr); - - if (pEntry != NULL) { - pInfo->Reason = mlme.im_reason; - Elem->Wcid = pEntry->wcid; - MlmeEnqueue( - pAd, AP_AUTH_STATE_MACHINE, - APMT2_MLME_DEAUTH_REQ, - sizeof(MLME_DEAUTH_REQ_STRUCT), - Elem, 0); - } - } - - os_free_mem(Elem); - } - - break; - - case HOSTAPD_OID_SET_STA_DISASSOC: /*hostapd request to disassoc the station. */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::HOSTAPD_OID_SET_STA_DISASSOC\n")); - MLME_DISASSOC_REQ_STRUCT DisassocReq; - - if (wrq->u.data.length != sizeof(struct ieee80211req_mlme)) - Status = -EINVAL; - else { - Status = copy_from_user(&mlme, wrq->u.data.pointer, - wrq->u.data.length); - NdisMoveMemory(DisassocReq.Addr, mlme.im_macaddr, - MAC_ADDR_LEN); - DisassocReq.Reason = mlme.im_reason; - MlmeEnqueue(pAd, AP_ASSOC_STATE_MACHINE, - APMT2_MLME_DISASSOC_REQ, - sizeof(MLME_DISASSOC_REQ_STRUCT), - &DisassocReq, 0); - } - - break; - - case OID_HOSTAPD_SUPPORT: /*notify the driver to support hostapd. */ - if (wrq->u.data.length != sizeof(BOOLEAN)) - Status = -EINVAL; - else { - BOOLEAN hostapd_enable; - int v, apidx; - - apidx = pObj->ioctl_if; - Status = copy_from_user(&hostapd_enable, - wrq->u.data.pointer, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OID_HOSTAPD_SUPPORT apidx=%d\n", apidx)); - pAd->ApCfg.MBSSID[apidx].Hostapd = hostapd_enable; - BSS_STRUCT *pMBSSStruct; - - for (v = 0; v < MAX_MBSSID_NUM(pAd); v++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ApCfg->MBSSID[%d].Hostapd == %s\n", - v, - (pAd->ApCfg.MBSSID[v].Hostapd == - Hostapd_EXT ? - "TRUE" : - "FALSE"))); - pMBSSStruct = &pAd->ApCfg.MBSSID[v]; - pMBSSStruct->WPAREKEY.ReKeyInterval = 0; - pMBSSStruct->WPAREKEY.ReKeyMethod = - DISABLE_REKEY; - } - } - - break; - - case HOSTAPD_OID_COUNTERMEASURES: /*report txtsc to hostapd. */ - if (wrq->u.data.length != sizeof(BOOLEAN)) - Status = -EINVAL; - else { - BOOLEAN countermeasures_enable; - - Status = copy_from_user(&countermeasures_enable, - wrq->u.data.pointer, - wrq->u.data.length); - - if (countermeasures_enable) { - { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Receive CM Attack Twice within 60 seconds ====>>>\n")); - /* send wireless event - for counter measures */ - pAd->ApCfg.CMTimerRunning = FALSE; - - for (i = 0; - VALID_UCAST_ENTRY_WCID(pAd, i); - i++) { - MAC_TABLE_ENTRY *pEntry = - &pAd->MacTab.Content[i]; - - /* happened twice within 60 sec, AP SENDS disaccociate all associated STAs. All STA's transition to State 2 */ - if (IS_ENTRY_CLIENT(pEntry)) - MlmeDeAuthAction( - pAd, - &pAd->MacTab.Content - [i], - REASON_MIC_FAILURE, - FALSE); - } - - /* Further, ban all Class 3 DATA transportation for a period of 60 sec */ - /* disallow new association , too */ - pAd->ApCfg.BANClass3Data = TRUE; - } - } else - pAd->ApCfg.BANClass3Data = FALSE; - } - - break; - - case HOSTAPD_OID_SET_WPS_BEACON_IE: /*pure 1x is enabled. */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("HOSTAPD_OID_SET_WPS_BEACON_IE\n")); - - if (wrq->u.data.length != sizeof(WSC_LV_INFO)) - Status = -EINVAL; - else { - INT apidx; - - apidx = pObj->ioctl_if; - pAd->ApCfg.MBSSID[apidx].HostapdWPS = TRUE; - BSS_STRUCT *pMBSSStruct; - - NdisZeroMemory(&WscIEBeacon, sizeof(WSC_LV_INFO)); - Status = copy_from_user(&WscIEBeacon, - wrq->u.data.pointer, - wrq->u.data.length); - pMBSSStruct = &pAd->ApCfg.MBSSID[apidx]; - NdisMoveMemory(pMBSSStruct->WscIEBeacon.Value, - WscIEBeacon.Value, WscIEBeacon.ValueLen); - pMBSSStruct->WscIEBeacon.ValueLen = - WscIEBeacon.ValueLen; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } - - break; - - case HOSTAPD_OID_SET_WPS_PROBE_RESP_IE: /*pure 1x is enabled. */ - apidx = pObj->ioctl_if; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("HOSTAPD_OID_SET_WPS_PROBE_RESP_IE\n")); - - if (wrq->u.data.length != sizeof(WSC_LV_INFO)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("HOSTAPD_OID_SET_WPS_PROBE_RESP_IE failed\n")); - Status = -EINVAL; - } else { - INT apidx; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - apidx = pObj->ioctl_if; - pAd->ApCfg.MBSSID[apidx].HostapdWPS = TRUE; - BSS_STRUCT *pMBSSStruct; - - NdisZeroMemory(&WscIEProbeResp, sizeof(WSC_LV_INFO)); - Status = copy_from_user(&WscIEProbeResp, - wrq->u.data.pointer, - wrq->u.data.length); - pMBSSStruct = &pAd->ApCfg.MBSSID[apidx]; - NdisMoveMemory(pMBSSStruct->WscIEProbeResp.Value, - WscIEProbeResp.Value, - WscIEProbeResp.ValueLen); - pMBSSStruct->WscIEProbeResp.ValueLen = - WscIEProbeResp.ValueLen; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } - - break; -#endif /*HOSTAPD_SUPPORT*/ -#if defined(WAPP_SUPPORT) - case OID_802_11_HS_ANQP_RSP: { - UCHAR *Buf; - struct anqp_rsp_data *rsp_data; - - os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - rsp_data = (struct anqp_rsp_data *)Buf; - Send_ANQP_Rsp(pAd, rsp_data->peer_mac_addr, rsp_data->anqp_rsp, - rsp_data->anqp_rsp_len); - os_free_mem(Buf); - } break; -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG - case OID_SEND_OFFCHAN_ACTION_FRAME: { - UCHAR *Buf; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - mtk_send_offchannel_action_frame(pAd, wdev, - (struct action_frm_data *)Buf); - os_free_mem(Buf); - } break; - case OID_802_11_CANCEL_ROC: { - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - - mtk_cancel_roc(pAd, wdev); - } break; - case OID_802_11_START_ROC: { - UCHAR *Buf; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - mtk_start_roc(pAd, wdev, (struct roc_req *)Buf); - os_free_mem(Buf); - } break; -#endif -#ifdef DPP_SUPPORT - case OID_802_11_SET_PMK: { - if (pAd->bDppEnable) { - UCHAR *Buf; - struct wifi_dev *wdev = - get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, - pObj->ioctl_if_type); - - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - mtk_set_pmk(pAd, wdev, (struct pmk_req *)Buf); - os_free_mem(Buf); - } else - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, DPP Disabled please enable it\n", - __func__)); - } break; -#endif /* DPP_SUPPORT */ -#ifdef CONFIG_HOTSPOT_R2 - case OID_802_11_HS_ONOFF: { - UCHAR *Buf; - struct hs_onoff *onoff; - - os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - onoff = (struct hs_onoff *)Buf; - Set_HotSpot_OnOff(pAd, onoff->hs_onoff, onoff->event_trigger, - onoff->event_type); - os_free_mem(Buf); - } break; - - case OID_802_11_HS_RESET_RESOURCE: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("hotspot reset some resource\n")); - Clear_Hotspot_All_IE(pAd); - /* Clear_All_PROXY_TABLE(pAd); */ - break; - - case OID_802_11_HS_SASN_ENABLE: { - UCHAR *Buf; - PHOTSPOT_CTRL pHSCtrl = - &pAd->ApCfg.MBSSID[pObj->ioctl_if].HotSpotCtrl; - - os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - pHSCtrl->bASANEnable = Buf[0]; - /* for 7615 offload to CR4 */ - hotspot_update_bssflag(pAd, fgASANEnable, Buf[0], pHSCtrl); - hotspot_update_bss_info_to_cr4(pAd, pObj->ioctl_if); - os_free_mem(Buf); - } break; - - case OID_802_11_BSS_LOAD: { - UCHAR *Buf; - PHOTSPOT_CTRL pHSCtrl = - &pAd->ApCfg.MBSSID[pObj->ioctl_if].HotSpotCtrl; - - os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - pHSCtrl->QLoadTestEnable = Buf[0]; - pHSCtrl->QLoadCU = Buf[1]; - memcpy(&pHSCtrl->QLoadStaCnt, &Buf[2], 2); - os_free_mem(Buf); - } break; -#endif -#endif -#ifdef CONFIG_DOT11V_WNM - - case OID_802_11_WNM_COMMAND: { - UCHAR *Buf; - struct wnm_command *cmd_data; - - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - cmd_data = (struct wnm_command *)Buf; - - if (wnm_handle_command(pAd, cmd_data) != NDIS_STATUS_SUCCESS) - Status = -EINVAL; - - os_free_mem(Buf); - } break; -#ifdef WAPP_SUPPORT - case OID_802_11_WAPP_IE: { - UCHAR *IE; - - os_alloc_mem(NULL, (UCHAR **)&IE, wrq->u.data.length); - Status = copy_from_user(IE, wrq->u.data.pointer, - wrq->u.data.length); - wapp_set_ap_ie(pAd, IE, wrq->u.data.length, - (UCHAR)pObj->ioctl_if); - os_free_mem(IE); - } break; - case OID_802_11_WAPP_PARAM_SETTING: { - UCHAR *Buf; - struct wapp_param_setting *param_setting; - - os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - param_setting = (struct wapp_param_setting *)Buf; - set_wapp_param(pAd, param_setting->param, param_setting->value); - os_free_mem(Buf); - } break; - case OID_802_11_INTERWORKING_ENABLE: { - UCHAR *Buf; - PGAS_CTRL pGASCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].GASCtrl; - - os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - pGASCtrl->b11U_enable = Buf[0] ? TRUE : FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s GAS service for MBSSID[%d]\n", - pGASCtrl->b11U_enable ? "Enable" : "Disable", - pObj->ioctl_if)); - os_free_mem(Buf); - } break; - - case OID_802_11_WNM_BTM_REQ: { - UCHAR *Buf; - MAC_TABLE_ENTRY *pEntry = NULL; - struct btm_req_data *req_data; - - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - req_data = (struct btm_req_data *)Buf; - pEntry = MacTableLookup(pAd, req_data->peer_mac_addr); - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s : NO ENTRY!!!!!!\n", __func__)); - } /*else if (pEntry->BssTransitionManmtSupport != 1) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("OID_802_11_WNM_BTM_REQ::the peer does not support BTM(%d)\n", - pEntry->BssTransitionManmtSupport)); - } */ - else if (IS_AKM_OPEN(pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.AKMMap) || - ((pEntry->SecConfig.Handshake.WpaState == - AS_PTKINITDONE) && - (pEntry->SecConfig.Handshake.GTKState == - REKEY_ESTABLISHED))) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("btm1\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("peer_mac_addr=%02x:%02x:%02x:%02x:%02x:%02x\n", - req_data->peer_mac_addr[0], - req_data->peer_mac_addr[1], - req_data->peer_mac_addr[2], - req_data->peer_mac_addr[3], - req_data->peer_mac_addr[4], - req_data->peer_mac_addr[5])); - Send_BTM_Req(pAd, req_data->peer_mac_addr, - req_data->btm_req, req_data->btm_req_len); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!btm2\n")); - pEntry->IsBTMReqValid = TRUE; - os_alloc_mem(pEntry->ReqbtmData, - (UCHAR **)&pEntry->ReqbtmData, - sizeof(struct btm_req_data) + - req_data->btm_req_len); - memcpy(pEntry->ReqbtmData, Buf, - sizeof(struct btm_req_data) + - req_data->btm_req_len); - } - - os_free_mem(Buf); - } break; - -#ifdef OCE_SUPPORT - case OID_802_11_OCE_REDUCED_NEIGHBOR_REPORT: { /*pure 1x is enabled. */ - INT apidx = pObj->ioctl_if; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - REDUCED_NR_LIST_INFO ReducedNRListInfo; - BSS_STRUCT *pMBSS; - - apidx = pObj->ioctl_if; - - if (IS_OCE_RNR_ENABLE(wdev)) { - pAd->ApCfg.MBSSID[apidx].ReducedNRListExist = TRUE; - NdisZeroMemory(&ReducedNRListInfo, - sizeof(REDUCED_NR_LIST_INFO)); - Status = copy_from_user(&ReducedNRListInfo, - wrq->u.data.pointer, - wrq->u.data.length); - pMBSS = &pAd->ApCfg.MBSSID[apidx]; - NdisMoveMemory(pMBSS->ReducedNRListInfo.Value, - ReducedNRListInfo.Value, - ReducedNRListInfo.ValueLen); - pMBSS->ReducedNRListInfo.ValueLen = - ReducedNRListInfo.ValueLen; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } - } break; -#endif /*OCE_SUPPORT*/ - case OID_802_11_WNM_NOTIFY_REQ: { - UCHAR *Buf; - MAC_TABLE_ENTRY *pEntry; - struct wnm_req_data *req_data; - - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - req_data = (struct wnm_req_data *)Buf; - pEntry = MacTableLookup(pAd, req_data->peer_mac_addr); - - if (pEntry == NULL) { - } else if ((IS_AKM_OPEN(pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.AKMMap)) || - ((pEntry->SecConfig.Handshake.WpaState == - AS_PTKINITDONE) && - (pEntry->SecConfig.Handshake.GTKState == - REKEY_ESTABLISHED))) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wnm1\n")); - Send_WNM_Notify_Req(pAd, req_data->peer_mac_addr, - req_data->wnm_req, - req_data->wnm_req_len, - req_data->type); - } -#ifdef CONFIG_HOTSPOT_R2 - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wnm2\n")); - pEntry->IsWNMReqValid = TRUE; - os_alloc_mem(pEntry->ReqData, - (UCHAR **)&pEntry->ReqData, - sizeof(struct wnm_req_data) + - req_data->wnm_req_len); - memcpy(pEntry->ReqData, Buf, - sizeof(struct wnm_req_data) + - req_data->wnm_req_len); - } -#endif /* CONFIG_HOTSPOT_R2 */ - - os_free_mem(Buf); - } break; - -#ifdef CONFIG_HOTSPOT_R2 - case OID_802_11_QOSMAP_CONFIGURE: { - UCHAR *Buf; - MAC_TABLE_ENTRY *pEntry; - struct qosmap_data *req_data; - unsigned int i; - UCHAR PoolID = 0; - - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - req_data = (struct qosmap_data *)Buf; - pEntry = MacTableLookup(pAd, req_data->peer_mac_addr); - - if (pEntry != NULL) { - /* clear previous data */ - pEntry->DscpExceptionCount = 0; - memset(pEntry->DscpRange, 0xff, 16); - memset(pEntry->DscpException, 0xff, 42); - pEntry->DscpExceptionCount = req_data->qosmap_len - 16; - memcpy((UCHAR *)pEntry->DscpRange, - &req_data->qosmap[pEntry->DscpExceptionCount], - 16); - - if (pEntry->DscpExceptionCount != 0) - memcpy((UCHAR *)pEntry->DscpException, - req_data->qosmap, - pEntry->DscpExceptionCount); - - PoolID = hotspot_qosmap_add_pool(pAd, pEntry); - hotspot_qosmap_update_sta_mapping_to_cr4(pAd, pEntry, - PoolID); - Send_QOSMAP_Configure(pAd, req_data->peer_mac_addr, - req_data->qosmap, - req_data->qosmap_len, - pEntry->func_tb_idx); - } else if ((req_data->peer_mac_addr[0] == 0) && - (req_data->peer_mac_addr[1] == 0) && - (req_data->peer_mac_addr[2] == 0) && - (req_data->peer_mac_addr[3] == 0) && - (req_data->peer_mac_addr[4] == 0) && - (req_data->peer_mac_addr[5] == 0)) { - /* Special MAC 00:00:00:00:00:00 for HS2 QoS Map Change using. */ - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if ((IS_ENTRY_CLIENT(pEntry)) && - (pEntry->Sst == SST_ASSOC)) { - if (pEntry->QosMapSupport) { - pEntry->DscpExceptionCount = 0; - memset(pEntry->DscpRange, 0xff, - 16); - memset(pEntry->DscpException, - 0xff, 42); - pEntry->DscpExceptionCount = - req_data->qosmap_len - - 16; - memcpy((UCHAR *)pEntry - ->DscpRange, - &req_data->qosmap - [pEntry->DscpExceptionCount], - 16); - - if (pEntry->DscpExceptionCount != - 0) { - memcpy((UCHAR *)pEntry - ->DscpException, - req_data->qosmap, - pEntry->DscpExceptionCount); - } - - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("send QoS map frame: apidx=%d\n", - pEntry->func_tb_idx)); - Send_QOSMAP_Configure( - pAd, pEntry->Addr, - req_data->qosmap, - req_data->qosmap_len, - pEntry->func_tb_idx); - } - } - } - } - - os_free_mem(Buf); - } break; -#endif /* CONFIG_HOTSPOT_R2 */ -#endif /* WAPP_SUPPORT */ -#endif -#ifdef DOT11K_RRM_SUPPORT - - case OID_802_11_RRM_COMMAND: - Status = rrm_MsgHandle(pAd, wrq); - - if (Status != NDIS_STATUS_SUCCESS) - Status = -NDIS_STATUS_FAILURE; - - break; -#endif -#ifdef MBO_SUPPORT - case OID_802_11_MBO_MSG: { - UCHAR *Buf; - struct wapp_param_setting *param_setting; - - os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length); - copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length); - param_setting = (struct wapp_param_setting *)Buf; - MBO_MsgHandle(pAd, param_setting->param, param_setting->value); - os_free_mem(Buf); - } break; -#endif /* MBO_SUPPORT */ -#ifdef WAPP_SUPPORT - case OID_WAPP_EVENT: { - UCHAR *buf; - struct wapp_req *req; - - os_alloc_mem(NULL, (UCHAR **)&buf, wrq->u.data.length); - copy_from_user(buf, wrq->u.data.pointer, wrq->u.data.length); - req = (struct wapp_req *)buf; - wapp_event_handle(pAd, req); - os_free_mem(buf); - } break; -#endif /* WAPP_SUPPORT */ -#ifdef OFFCHANNEL_SCAN_FEATURE - case OID_OFFCHANNEL_INFO: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s] : Msg received !! \n", __LINE__, __func__)); - Status = Channel_Info_MsgHandle(pAd, wrq, pObj); - if (!Status) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Channel_Info_MsgHandle return status received = failure changing it to negative for application \n", - __func__)); - Status = -NDIS_STATUS_FAILURE; - } - break; -#endif - -#ifdef VOW_SUPPORT -#define VOW_CMD_STR_LEN 16 - - case OID_802_11_VOW_BW_EN: - /* not used now */ - break; - - case OID_802_11_VOW_BW_AT_EN: { - P_VOW_UI_CONFIG cfg; - UCHAR buf[VOW_CMD_STR_LEN]; - UINT8 group; - - os_alloc_mem(cfg, (UCHAR **)&cfg, wrq->u.data.length); - - if (cfg == NULL) { - Status = -ENOMEM; - break; - } - - Status = copy_from_user(cfg, wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - for (group = 0; group < cfg->ssid_num; group++) { - sprintf(buf, "%d-%d", group, cfg->val[group]); - set_vow_airtime_ctrl_en(pAd, buf); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OID_802_11_VOW_BW_AT_EN(0x%08x) -> val %d\n", - cmd, cfg->val[group])); - } - } else - Status = -EFAULT; - - os_free_mem(cfg); - } break; - - case OID_802_11_VOW_BW_TPUT_EN: { - P_VOW_UI_CONFIG cfg; - UCHAR buf[VOW_CMD_STR_LEN]; - UINT8 group; - - os_alloc_mem(cfg, (UCHAR **)&cfg, wrq->u.data.length); - - if (cfg == NULL) { - Status = -ENOMEM; - break; - } - - Status = copy_from_user(cfg, wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - for (group = 0; group < cfg->ssid_num; group++) { - sprintf(buf, "%d-%d", group, cfg->val[group]); - set_vow_bw_ctrl_en(pAd, buf); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OID_802_11_VOW_BW_TPUT_EN(0x%08x) -> val %d\n", - cmd, cfg->val[group])); - } - } else - Status = -EFAULT; - - os_free_mem(cfg); - } break; - - case OID_802_11_VOW_ATF_EN: { - UCHAR *val, buf[VOW_CMD_STR_LEN]; - - os_alloc_mem(val, (UCHAR **)&val, wrq->u.data.length); - - if (val == NULL) { - Status = -ENOMEM; - break; - } - - Status = copy_from_user(val, wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - sprintf(buf, "%d", val[0]); - set_vow_airtime_fairness_en(pAd, buf); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OID_802_11_VOW_ATF_EN(0x%08x) -> val %d\n", - cmd, val[0])); - } else - Status = -EFAULT; - - os_free_mem(val); - } break; - - case OID_802_11_VOW_RX_EN: { - UCHAR *val, buf[VOW_CMD_STR_LEN]; - - os_alloc_mem(val, (UCHAR **)&val, wrq->u.data.length); - - if (val == NULL) { - Status = -ENOMEM; - break; - } - - Status = copy_from_user(val, wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - sprintf(buf, "%d", val[0]); - set_vow_rx_airtime_en(pAd, buf); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OID_802_11_VOW_RX_EN(0x%08x) -> val %d\n", - cmd, val[0])); - } else - Status = -EFAULT; - - os_free_mem(val); - } break; - - case OID_802_11_VOW_GROUP_MAX_RATE: { - P_VOW_UI_CONFIG cfg; - UCHAR buf[VOW_CMD_STR_LEN]; - UINT8 group; - - os_alloc_mem(cfg, (UCHAR **)&cfg, wrq->u.data.length); - - if (cfg == NULL) { - Status = -ENOMEM; - break; - } - - Status = copy_from_user(cfg, wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - for (group = 0; group < cfg->ssid_num; group++) { - sprintf(buf, "%d-%d", group, cfg->val[group]); - set_vow_max_rate(pAd, buf); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OID_802_11_VOW_GROUP_MAX_RATE(0x%08x) -> val %d\n", - cmd, cfg->val[group])); - } - } else - Status = -EFAULT; - - os_free_mem(cfg); - } break; - - case OID_802_11_VOW_GROUP_MIN_RATE: { - P_VOW_UI_CONFIG cfg; - UCHAR buf[VOW_CMD_STR_LEN]; - UINT8 group; - - os_alloc_mem(cfg, (UCHAR **)&cfg, wrq->u.data.length); - - if (cfg == NULL) { - Status = -ENOMEM; - break; - } - - Status = copy_from_user(cfg, wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - for (group = 0; group < cfg->ssid_num; group++) { - sprintf(buf, "%d-%d", group, cfg->val[group]); - set_vow_min_rate(pAd, buf); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OID_802_11_VOW_GROUP_MIN_RATE(0x%08x) -> val %d\n", - cmd, cfg->val[group])); - } - } else - Status = -EFAULT; - - os_free_mem(cfg); - } break; - - case OID_802_11_VOW_GROUP_MAX_RATIO: { - P_VOW_UI_CONFIG cfg; - UCHAR buf[VOW_CMD_STR_LEN]; - UINT8 group; - - os_alloc_mem(cfg, (UCHAR **)&cfg, wrq->u.data.length); - - if (cfg == NULL) { - Status = -ENOMEM; - break; - } - - Status = copy_from_user(cfg, wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - for (group = 0; group < cfg->ssid_num; group++) { - sprintf(buf, "%d-%d", group, cfg->val[group]); - set_vow_max_ratio(pAd, buf); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OID_802_11_VOW_GROUP_MAX_RATIO(0x%08x) -> val %d\n", - cmd, cfg->val[group])); - } - } else - Status = -EFAULT; - - os_free_mem(cfg); - } break; - - case OID_802_11_VOW_GROUP_MIN_RATIO: { - P_VOW_UI_CONFIG cfg; - UCHAR buf[VOW_CMD_STR_LEN]; - UINT8 group; - - os_alloc_mem(cfg, (UCHAR **)&cfg, wrq->u.data.length); - - if (cfg == NULL) { - Status = -ENOMEM; - break; - } - - Status = copy_from_user(cfg, wrq->u.data.pointer, - wrq->u.data.length); - - if (Status == NDIS_STATUS_SUCCESS) { - for (group = 0; group < cfg->ssid_num; group++) { - sprintf(buf, "%d-%d", group, cfg->val[group]); - set_vow_min_ratio(pAd, buf); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OID_802_11_VOW_GROUP_MIN_RATIO(0x%08x) -> val %d\n", - cmd, cfg->val[group])); - } - } else - Status = -EFAULT; - - os_free_mem(cfg); - } break; -#endif /* VOW_SUPPORT */ -#ifdef WIFI_SPECTRUM_SUPPORT - case OID_802_11_WIFISPECTRUM_SET_PARAMETER: { - P_RBIST_CAP_START_T pSpectrumInfo; - UINT_32 ret; - - os_alloc_mem(pAd, (UCHAR **)&pSpectrumInfo, wrq->u.data.length); - ret = copy_from_user(pSpectrumInfo, wrq->u.data.pointer, - wrq->u.data.length); - pSpectrumInfo->u4BW = - Get_System_Bw_Info(pAd, pSpectrumInfo->u4CaptureNode); - chip_spectrum_start(pAd, (UINT8 *)pSpectrumInfo); - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s :\n Trigger = 0x%08x\n" - " RingCapEn = 0x%08x\n TriggerEvent = 0x%08x\n CaptureNode = 0x%08x\n CaptureLen = 0x%08x\n" - " CapStopCycle = 0x%08x\n BW = 0x%08x\n MACTriggerEvent = 0x%08x\n SourceAddrLSB = 0x%08x\n" - " SourceAddrMSB = 0x%08x\n BandIdx = 0x%08x\n", - __func__, pSpectrumInfo->fgTrigger, - pSpectrumInfo->fgRingCapEn, - pSpectrumInfo->u4TriggerEvent, - pSpectrumInfo->u4CaptureNode, - pSpectrumInfo->u4CaptureLen, - pSpectrumInfo->u4CapStopCycle, pSpectrumInfo->u4BW, - pSpectrumInfo->u4MACTriggerEvent, - pSpectrumInfo->u4SourceAddressLSB, - pSpectrumInfo->u4SourceAddressMSB, - pSpectrumInfo->u4BandIdx)); - - os_free_mem(pSpectrumInfo); - } break; - - case OID_802_11_WIFISPECTRUM_GET_CAPTURE_STATUS: { - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->SpectrumStatus != NULL) - Status = ops->SpectrumStatus(pAd); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The function is not hooked !!\n", - __func__)); - } - - if (Status != NDIS_STATUS_SUCCESS) - Status = -NDIS_STATUS_FAILURE; - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OID_802_11_WIFISPECTRUM_GET_CAPTURE_STATUS Status : %d\n", - Status)); - } break; - - case OID_802_11_WIFISPECTRUM_DUMP_DATA: { - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->SpectrumCmdRawDataProc != NULL) - Status = ops->SpectrumCmdRawDataProc(pAd); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The function is not hooked !!\n", - __func__)); - } - - if (Status != NDIS_STATUS_SUCCESS) - Status = -NDIS_STATUS_FAILURE; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OID_802_11_WIFISPECTRUM_DUMP_DATA Status : %d\n", - Status)); - } break; -#endif /* WIFI_SPECTRUM_SUPPORT */ -#ifdef BAND_STEERING - case OID_BNDSTRG_MSG: - BndStrg_MsgHandle(pAd, wrq, pObj->ioctl_if); - break; -#ifdef VENDOR_FEATURE5_SUPPORT - case OID_BNDSTRG_GET_NVRAM: - BndStrg_GetNvram(pAd, wrq, pObj->ioctl_if); - break; - - case OID_BNDSTRG_SET_NVRAM: - BndStrg_SetNvram(pAd, wrq, pObj->ioctl_if); - break; -#endif /* VENDOR_FEATURE5_SUPPORT */ -#endif /* BAND_STEERING */ -#ifdef CONFIG_STEERING_API_SUPPORT - case OID_NON_ASSOCIATED_STA_REPORT_ENABLE: { - UCHAR *StaReportEnable; - INT i; - PNA_STA_ENTRY entry; - os_alloc_mem(StaReportEnable, (UCHAR **)&StaReportEnable, - sizeof(UCHAR)); - if (copy_from_user(StaReportEnable, wrq->u.data.pointer, - sizeof(UCHAR))) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("NASTAREPORTENABLE: copy from user failed!\n")); - Status = EFAULT; - os_free_mem(StaReportEnable); - break; - } - pAd->ApCfg.NonAssocStaEnable = *StaReportEnable; - os_free_mem(StaReportEnable); - if (!pAd->ApCfg.NonAssocStaEnable) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("NASTAREPORTENABLE: Disabled!\n")); - for (i = 0; i < NA_STA_REPORT_SIZE; i++) { - entry = &pAd->ApCfg.NaStaMacList.Entry[i]; - if (entry->bValid == TRUE) { - NAStaList_DeleteEntry(pAd, - entry->MacAddr); - } - } - pAd->ApCfg.NAStaReportList.reportSize = 0; - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("NASTAREPORTENABLE: Enabled!\n")); - } break; - - case OID_802_11_BTM_ACTION_FRAME_REQUEST: { - Status = Store_Btm_Action_Frame_Request(pAd, wrq); - if (Status != NDIS_STATUS_SUCCESS) { - Status = -NDIS_STATUS_FAILURE; - } - } break; - - case OID_STEER_ACTION: { - Status = Steer_Action(pAd, wrq); - if (Status != NDIS_STATUS_SUCCESS) { - Status = -NDIS_STATUS_FAILURE; - } - } break; -#endif - -#ifdef MT_DFS_SUPPORT - case OID_DFS_ZERO_WAIT: - Status = ZeroWaitDfsCmdHandler(pAd, wrq); - break; -#endif - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG - case OID_SET_CH_SWITCH_DURATION: { - INT ret; - struct ch_switch_cfg *ch_sw_cfg; - UCHAR band_idx; - struct wifi_dev *wdev; - - if (wrq->u.data.length == 0 || - wrq->u.data.length != sizeof(struct ch_switch_cfg)) { - Status = -EFAULT; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("data len is invalid, return!!!\n")); - break; - } - ret = os_alloc_mem(pAd, (UCHAR **)&ch_sw_cfg, - wrq->u.data.length); - if (ret == NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Set::OID_SET_CH_SWITCH_DURATION\n")); - if (copy_from_user(ch_sw_cfg, wrq->u.data.pointer, - wrq->u.data.length)) { - Status = -EFAULT; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s()::copy from user fail\n", - __func__)); - } else { - if (pObj->ioctl_if_type != INT_APCLI) - wdev = &pAd->ApCfg - .MBSSID[pObj->ioctl_if] - .wdev; - else - wdev = &pAd->ApCfg - .ApCliTab[pObj->ioctl_if] - .wdev; - band_idx = HcGetBandByWdev(wdev); - Status = set_ch_switch_monitor_cfg( - pAd, wdev, band_idx, ch_sw_cfg); - } - os_free_mem(ch_sw_cfg); - } else { - Status = -EFAULT; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s()::alloc memory fail\n", __func__)); - } - break; - } -#endif - - case OID_802_11_VENDOR_IE_ADD: - case OID_802_11_VENDOR_IE_UPDATE: - case OID_802_11_VENDOR_IE_REMOVE: { - UCHAR *Buf; - struct vie_op_data_s *vie_op_data; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - UINT32 length = 0; - UINT32 oui_oitype = 0; - - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, - wrq->u.data.length); - vie_op_data = (struct vie_op_data_s *)Buf; - length = vie_op_data->vie_length; - NdisMoveMemory((UCHAR *)&oui_oitype, vie_op_data->oui_oitype, - sizeof(UINT32)); - - if ((cmd & 0x7FFF) == VIE_REMOVE) { - if (remove_vie(pAd, wdev, vie_op_data->frm_type_map, - oui_oitype, length, - vie_op_data->app_ie_ctnt) == - NDIS_STATUS_FAILURE) { - Status = NDIS_STATUS_FAILURE; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): OID_802_11_VENDOR_IE_REMOVE failed.\n", - __func__)); - } - } else { - if (add_vie(pAd, wdev, vie_op_data->frm_type_map, - oui_oitype, length, - vie_op_data->app_ie_ctnt) == - NDIS_STATUS_FAILURE) { - Status = NDIS_STATUS_FAILURE; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): OID_802_11_VENDOR_IE_ADD failed.\n", - __func__)); - } - } - - os_free_mem(Buf); - } break; - case OID_802_11_VENDOR_IE_SHOW: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OID_802_11_VENDOR_IE_SHOW not finish yet\n")); - break; -#ifdef CUSTOMER_VENDOR_IE_SUPPORT - case OID_AP_VENDOR_IE_SET: { - INT apidx; - INT ret; - CHAR *vendor_ie_temp; - struct customer_vendor_ie *ap_vendor_ie; - struct wifi_dev *wdev; - - apidx = pObj->ioctl_if; - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - if (wrq->u.data.length == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): data length is 0, return!!\n", - __func__)); - break; - } - - ret = os_alloc_mem(pAd, (UCHAR **)&vendor_ie_temp, - wrq->u.data.length); - if (ret == NDIS_STATUS_SUCCESS) { - Status = copy_from_user(vendor_ie_temp, - wrq->u.data.pointer, - wrq->u.data.length); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Set::OID_AP_VENDOR_IE_SET\n")); - ap_vendor_ie = &pAd->ApCfg.MBSSID[apidx].ap_vendor_ie; - RTMP_SPIN_LOCK(&ap_vendor_ie->vendor_ie_lock); - if (ap_vendor_ie->pointer != NULL) - os_free_mem(ap_vendor_ie->pointer); - ap_vendor_ie->pointer = vendor_ie_temp; - ap_vendor_ie->length = wrq->u.data.length; - - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - RTMP_SPIN_UNLOCK(&ap_vendor_ie->vendor_ie_lock); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): alloc memory fail!!\n", __func__)); - } - } break; - - case OID_AP_VENDOR_IE_DEL: { - INT apidx; - struct customer_vendor_ie *ap_vendor_ie; - struct wifi_dev *wdev; - - apidx = pObj->ioctl_if; - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Del::OID_AP_VENDOR_IE_DEL\n")); - ap_vendor_ie = &pAd->ApCfg.MBSSID[apidx].ap_vendor_ie; - - RTMP_SPIN_LOCK(&ap_vendor_ie->vendor_ie_lock); - if (ap_vendor_ie->pointer != NULL) { - os_free_mem(ap_vendor_ie->pointer); - ap_vendor_ie->pointer = NULL; - } - ap_vendor_ie->length = 0; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - RTMP_SPIN_UNLOCK(&ap_vendor_ie->vendor_ie_lock); - } break; - - case OID_SET_OUI_FILTER: { - INT ret; - CHAR *customer_oui_temp; - struct customer_oui_filter *ap_customer_oui; - - if (wrq->u.data.length == 0) { - ap_customer_oui = &pAd->ApCfg.ap_customer_oui; - RTMP_SPIN_LOCK(&ap_customer_oui->oui_filter_lock); - if (ap_customer_oui->pointer != NULL) - os_free_mem(ap_customer_oui->pointer); - ap_customer_oui->pointer = NULL; - RTMP_SPIN_UNLOCK(&ap_customer_oui->oui_filter_lock); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): OUI data length is 0, Delete Filter and return!!\n", - __func__)); - break; - } - - ret = os_alloc_mem(pAd, (UCHAR **)&customer_oui_temp, - wrq->u.data.length); - if (ret == NDIS_STATUS_SUCCESS) { - Status = copy_from_user(customer_oui_temp, - wrq->u.data.pointer, - wrq->u.data.length); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Set::OID_SET_OUI_FILTER\n")); - ap_customer_oui = &pAd->ApCfg.ap_customer_oui; - RTMP_SPIN_LOCK(&ap_customer_oui->oui_filter_lock); - if (ap_customer_oui->pointer != NULL) - os_free_mem(ap_customer_oui->pointer); - ap_customer_oui->pointer = customer_oui_temp; - ap_customer_oui->length = wrq->u.data.length; - RTMP_SPIN_UNLOCK(&ap_customer_oui->oui_filter_lock); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): alloc memory fail!!\n", __func__)); - } - } break; -#endif /* CUSTOMER_VENDOR_IE_SUPPORT */ -#ifdef MAP_R2 - case OID_802_11_CAC_STOP: { - UCHAR BandIdx = 0; - INT32 ifIndex = pObj->ioctl_if; - struct wifi_dev *wdev; -#ifdef A_BAND_SUPPORT - int i = 0; - BOOLEAN bSupport5G = HcIsRfSupport(pAd, RFIC_5GHZ); -#endif - if (pObj->ioctl_if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else - wdev = &pAd->ApCfg.MBSSID[0].wdev; - - if (wdev->pHObj == NULL) - break; - - BandIdx = HcGetBandByWdev(wdev); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%d][%s] OID_802_11_CAC_STOP!!\n", __LINE__, - __func__)); - -#ifdef A_BAND_SUPPORT - if (bSupport5G && (pAd->CommonCfg.bIEEE80211H == 1)) { - BOOLEAN BandInCac[DBDC_BAND_NUM]; - struct DOT11_H *pDot11hTest = NULL; - - for (i = 0; i < DBDC_BAND_NUM; i++) - BandInCac[i] = FALSE; - - pDot11hTest = &pAd->Dot11_H[BandIdx]; - - if (pDot11hTest == NULL) - break; -#ifdef MT_DFS_SUPPORT - if (pDot11hTest->RDMode == RD_SILENCE_MODE) { -#ifdef MAP_R2 - BandInCac[BandIdx] = TRUE; -#endif - pDot11hTest->RDCount = 0; - MlmeEnqueue(pAd, DFS_STATE_MACHINE, DFS_CAC_END, - 0, NULL, HcGetBandByWdev(wdev)); - AsicSetSyncModeAndEnable( - pAd, pAd->CommonCfg.BeaconPeriod, - HW_BSSID_0, OPMODE_AP); - pDot11hTest->RDMode = RD_NORMAL_MODE; - } - } -#endif -#endif /* A_BAND_SUPPORT */ - } break; -#endif - default: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::unknown IOCTL's subcmd = 0x%08x\n", cmd)); - Status = -EOPNOTSUPP; - break; - } - - return Status; -} - -#ifdef OFFCHANNEL_SCAN_FEATURE -INT Channel_Info_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - POS_COOKIE pObj) -{ - OFFCHANNEL_SCAN_MSG msg; - struct wifi_dev *wdev = NULL; - INT i = 0; - INT32 ifIndex = pObj->ioctl_if; - INT Status = CHANNEL_MONITOR_STRG_SUCCESS; -#ifdef ONDEMAND_DFS - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; - UINT8 Channel = 0; -#endif - UCHAR BandIdx = BAND0; - - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - BandIdx = HcGetBandByWdev(wdev); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s] : Ioctl : %d !! \n", __LINE__, __func__, ifIndex)); - if (wrq->u.data.length != sizeof(OFFCHANNEL_SCAN_MSG)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%d][%s] error \n", __LINE__, __func__)); - return CHANNEL_MONITOR_STRG_FAILURE; - } else { - Status = copy_from_user(&msg, wrq->u.data.pointer, - wrq->u.data.length); - memcpy(pAd->ScanCtrl.if_name, wrq->ifr_ifrn.ifrn_name, - IFNAMSIZ); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] interface name = %s\n", __func__, - pAd->ScanCtrl.if_name)); - switch (msg.Action) { - case GET_OFFCHANNEL_INFO: { - if (pAd->ScanCtrl.state != OFFCHANNEL_SCAN_INVALID) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s:failed because offchannel scan is still ongoing\n", - __func__)); - Status = CHANNEL_MONITOR_STRG_FAILURE; - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s][%d] : num of away channel to scan = %d\n", - __func__, __LINE__, - msg.data.offchannel_param - .Num_of_Away_Channel)); - pAd->ScanCtrl.Num_Of_Channels = - msg.data.offchannel_param - .Num_of_Away_Channel; - pAd->ScanCtrl.Off_Ch_Scan_BW = - msg.data.offchannel_param.bw; - /* Fillup the paramters received for all channels */ - for (i = 0; i < msg.data.offchannel_param - .Num_of_Away_Channel; - i++) { - pAd->ScanCtrl.ScanGivenChannel[i] = - msg.data.offchannel_param - .channel[i]; - pAd->ScanCtrl.Offchan_Scan_Type[i] = - msg.data.offchannel_param - .scan_type[i]; - pAd->ScanCtrl.ScanTime[i] = - msg.data.offchannel_param - .scan_time[i]; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] channel = %d:scan type = %d:scan time = %d\n", - __func__, - pAd->ScanCtrl - .ScanGivenChannel[i], - pAd->ScanCtrl - .Offchan_Scan_Type[i], - pAd->ScanCtrl.ScanTime[i])); - } - Status = ApSiteSurveyNew_by_wdev( - pAd, - msg.data.offchannel_param.channel[0], - msg.data.offchannel_param.scan_time[0], - msg.data.offchannel_param.scan_type[0], - FALSE, wdev); - } - } break; - case TRIGGER_DRIVER_CHANNEL_SWITCH: -#ifdef ONDEMAND_DFS - Channel = msg.data.channel_data.channel; - if (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd)) { - /* Enable ACS at Bootup */ - pAd->ApCfg.bAutoChannelAtBootup[BandIdx] = TRUE; - /* Evaulate whether new channel should be updated */ - Status = DfsOnDemandDynamicChannelUpdate( - pAd, wdev, - msg.data.channel_data.channel); - if (Status == DFS_CHNL_UPDATE_WAIT) { - MTWF_LOG( - DBG_CAT_ALL, DBG_CAT_ALL, - DBG_LVL_OFF, - ("[%s] DFS_CHNL_UPDATE_WAIT return TRUE\n", - __func__)); - return TRUE; - } else if (Status == DFS_CHNL_UPDATE_FAIL) { - MTWF_LOG( - DBG_CAT_ALL, DBG_CAT_ALL, - DBG_LVL_OFF, - ("[%s] DFS_CHNL_UPDATE_FAIL return FALSE\n", - __func__)); - return FALSE; - } else { - if (RadarChannelCheck( - pAd, - pDfsParam->OutBandCh) && - (!RadarChannelCheck( - pAd, pDfsParam->Band0Ch))) { - /* DFS to DFS Update; Temporary Non-DFS Switch */ - Channel = pDfsParam->Band0Ch; - } - DfsDedicatedExamineSetNewCh(pAd, - Channel); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\x1b[1;33m [%s] 1 \x1b[m \n", - __func__)); - DedicatedZeroWaitStop(pAd, TRUE); - } - } - Status = rtmp_set_channel(pAd, wdev, Channel); -#else - Status = rtmp_set_channel( - pAd, wdev, msg.data.channel_data.channel); -#endif - break; - case UPDATE_DRIVER_SORTED_CHANNEL_LIST: - MTWF_LOG( - DBG_SUBCAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s num of channels in sorted channel list received from App =%d\n", - __func__, msg.data.sorted_channel_list.size)); - if (msg.data.sorted_channel_list.size > 0) { - pAd->sorted_list.size = - msg.data.sorted_channel_list.size; - for (i = 0; - i < msg.data.sorted_channel_list.size; - i++) { - pAd->sorted_list - .SortedMaxChannelBusyTimeList[i] = - msg.data.sorted_channel_list - .SortedMaxChannelBusyTimeList - [i]; - MTWF_LOG( - DBG_SUBCAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s channel[%d] = %d\n", - __func__, i, - pAd->sorted_list - .SortedMaxChannelBusyTimeList - [i])); - pAd->sorted_list - .SortedMinChannelBusyTimeList[i] = - msg.data.sorted_channel_list - .SortedMinChannelBusyTimeList - [i]; - } -#ifdef ONDEMAND_DFS - SET_ONDEMAND_ACS_LIST_INVALID(pAd); -#endif - Status = CHANNEL_MONITOR_STRG_SUCCESS; - } else { - MTWF_LOG( - DBG_SUBCAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s num of channels in sorted channel list received is invalid\n", - __func__)); - Status = CHANNEL_MONITOR_STRG_FAILURE; - } - break; - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: unknown action code. (%d)\n", __func__, - msg.Action)); - break; - } - } - return Status; -} -#endif - -#ifdef CONFIG_MAP_SUPPORT -int Fill_OID_WSC_PROFILE(IN RTMP_ADAPTER *pAd, UCHAR ifIndex, - p_wsc_apcli_config_msg *wsc_config) -{ - PWSC_CTRL pWscControl = NULL; - PWSC_CREDENTIAL pCredential = NULL; - WSC_PROFILE *pWscProfile = NULL; - struct wifi_dev *wdev; - int i = 0, TotalLen = 0; - wsc_apcli_config_msg *temp_wsc_config = NULL; - - pWscControl = &pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl; - pWscProfile = &pWscControl->WscProfile; - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - TotalLen = sizeof(wsc_apcli_config_msg) + - sizeof(wsc_apcli_config) * pWscProfile->ProfileCnt; - if (TotalLen > 512) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Total Length is >512 return\n")); - return FALSE; - } - os_alloc_mem(NULL, (PUCHAR *)&temp_wsc_config, TotalLen); - if (temp_wsc_config == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:failed to allocated memory\n", __func__)); - return FALSE; - } - NdisZeroMemory(temp_wsc_config, TotalLen); - *wsc_config = (wsc_apcli_config_msg *)temp_wsc_config; - temp_wsc_config->profile_count = pWscProfile->ProfileCnt; - for (i = 0; i < pWscProfile->ProfileCnt; i++) { - pCredential = &pWscProfile->Profile[i]; - NdisZeroMemory(temp_wsc_config->apcli_config[i].ssid, - sizeof(temp_wsc_config->apcli_config[i].ssid)); - NdisCopyMemory(temp_wsc_config->apcli_config[i].ssid, - pCredential->SSID.Ssid, - pCredential->SSID.SsidLength); - NdisCopyMemory(temp_wsc_config->apcli_config[i].Key, - pCredential->Key, pCredential->KeyLength); - NdisCopyMemory(temp_wsc_config->apcli_config[i].bssid, - pCredential->MacAddr, MAC_ADDR_LEN); - temp_wsc_config->apcli_config[i].SsidLen = - pCredential->SSID.SsidLength; - temp_wsc_config->apcli_config[i].AuthType = - pCredential->AuthType; - temp_wsc_config->apcli_config[i].EncrType = - pCredential->EncrType; - temp_wsc_config->apcli_config[i].KeyLength = - pCredential->KeyLength; - temp_wsc_config->apcli_config[i].KeyIndex = - pCredential->KeyIndex; - temp_wsc_config->apcli_config[i].peer_map_role = - pCredential->DevPeerRole; - temp_wsc_config->apcli_config[i].own_map_role = - wdev->MAPCfg.DevOwnRole; - } - return TotalLen; -} -#endif - -INT RTMPAPQueryInformation(IN RTMP_ADAPTER *pAd, - IN OUT RTMP_IOCTL_INPUT_STRUCT *rq, IN INT cmd) -{ - RTMP_IOCTL_INPUT_STRUCT *wrq = (RTMP_IOCTL_INPUT_STRUCT *)rq; - INT Status = NDIS_STATUS_SUCCESS; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - RTMP_STRING driverVersion[16]; - UCHAR apidx = pObj->ioctl_if; -#ifdef CONFIG_MAP_SUPPORT - PUCHAR pStaMacAddr = NULL; -#endif -#ifdef WSC_AP_SUPPORT - UINT WscPinCode = 0; - PWSC_PROFILE pProfile; - PWSC_CTRL pWscControl; -#endif /* WSC_AP_SUPPORT */ -#if defined(SNMP_SUPPORT) || defined(VENDOR_FEATURE6_SUPPORT) - ULONG ulInfo; -#endif /* defined(SNMP_SUPPORT) || defined(VENDOR_FEATURE6_SUPPORT) */ -#ifdef SNMP_SUPPORT - DefaultKeyIdxValue *pKeyIdxValue; - INT valueLen; - TX_RTY_CFG_STRUC tx_rty_cfg; - ULONG ShortRetryLimit, LongRetryLimit; - UCHAR snmp_tmp[64]; -#endif /* SNMP_SUPPORT */ -#ifdef HOSTAPD_SUPPORT - struct default_group_key group_key; - struct ieee80211req_key ik; - unsigned char *p; - MAC_TABLE_ENTRY *pEntry = (MAC_TABLE_ENTRY *)NULL; - struct ieee80211req_wpaie wpaie; - BSS_STRUCT *pMbss; -#endif /*HOSTAPD_SUPPORT*/ -#if (defined(APCLI_SUPPORT) || defined(WH_EZ_SETUP)) - NDIS_802_11_SSID Ssid; -#endif -#ifdef APCLI_SUPPORT - UCHAR ifIndex; - BOOLEAN apcliEn = FALSE; - PAPCLI_STRUCT pApCliEntry = NULL; -#endif /*APCLI_SUPPORT*/ - NDIS_802_11_STATISTICS *pStatistics; -#ifdef DOT1X_SUPPORT - INT IEEE8021X = 0; -#endif /* DOT1X_SUPPORT */ - NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeMax; - struct wifi_dev *wdev = NULL; - - /* For all ioctl to this function, we assume that's query for AP/APCLI/GO device */ - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) { - if (apidx >= pAd->ApCfg.BssidNum) - return -EFAULT; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - } - - switch (cmd) { -#ifdef ACS_CTCC_SUPPORT - case OID_802_11_GET_ACS_CHANNEL_SCORE: { - INT channel_idx = 0; - struct acs_channel_score *ch_score; - UCHAR band_idx = 0; - AUTO_CH_CTRL *auto_ch_ctrl = NULL; - PCHANNELINFO channel_info = NULL; - band_idx = HcGetBandByWdev(wdev); - auto_ch_ctrl = HcGetAutoChCtrlbyBandIdx(pAd, band_idx); - channel_info = auto_ch_ctrl->pChannelInfo; - os_alloc_mem(pAd, (UCHAR **)&ch_score, - sizeof(struct acs_channel_score)); - if (ch_score == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("allocate memory is failed\n")); - Status = RTMP_IO_EFAULT; - break; - } - ch_score->acs_alg = pAd->ApCfg.AutoChannelAlg[band_idx]; - for (channel_idx = 0; - channel_idx < channel_info->channel_list_num; - channel_idx++) { - ch_score->acs_channel_score[channel_idx].score = - channel_info->channel_score[channel_idx].score; - ch_score->acs_channel_score[channel_idx].channel = - channel_info->channel_score[channel_idx].channel; - } - wrq->u.data.length = sizeof(struct acs_channel_score); - Status = copy_to_user(wrq->u.data.pointer, ch_score, - wrq->u.data.length); - if (Status != 0) { - Status = RTMP_IO_EFAULT; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: OID_802_11_GET_ACS_CHANNEL_SCORE is falied\n", - __func__)); - } - os_free_mem(ch_score); - break; - } -#endif -#ifdef CUSTOMER_RSG_FEATURE - case OID_802_11_GET_CURRENT_CHANNEL_STATS: - if (pAd->EnableChannelStatsCheck) { - CURRENT_CHANNEL_STATISTICS *ChannelStats; - os_alloc_mem(pAd, (UCHAR **)&ChannelStats, - sizeof(CURRENT_CHANNEL_STATISTICS)); - ChannelStats->SamplePeriod = - pAd->ChannelStats.TotalDuration; - ChannelStats->FalseCCACount = - pAd->ChannelStats.FalseCCACount; - ChannelStats->EdCcaBusyTime = - pAd->ChannelStats.CCABusytime; - ChannelStats->ChannelBusyTime = - pAd->ChannelStats.ChBusytime; - ChannelStats->ChannelApActivity = - pAd->ChannelStats.ChannelApActivity; - - wrq->u.data.length = sizeof(CURRENT_CHANNEL_STATISTICS); - Status = copy_to_user(wrq->u.data.pointer, ChannelStats, - wrq->u.data.length); - - ResetChannelStats(pAd); - os_free_mem(ChannelStats); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Radio Channel Stats monitoring is not enabled \n", - __FUNCTION__)); - Status = RTMP_IO_EFAULT; - } - break; - - case OID_802_11_GET_CURRENT_CHANNEL_FALSE_CCA_AVG: - if (pAd->EnableChannelStatsCheck) { - UINT32 AvgValue; - - AvgValue = pAd->ChannelStats.FalseCCACountAvg; - pAd->ChannelStats.FalseCCACountAvg = 0; - wrq->u.data.length = sizeof(INT); - Status = copy_to_user(wrq->u.data.pointer, &AvgValue, - wrq->u.data.length); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Radio Channel Stats monitoring is not enabled \n", - __FUNCTION__)); - Status = RTMP_IO_EFAULT; - } - break; - - case OID_802_11_GET_CURRENT_CHANNEL_CST_TIME_AVG: - if (pAd->EnableChannelStatsCheck) { - UINT32 AvgValue; - - AvgValue = pAd->ChannelStats.CCABusyTimeAvg; - pAd->ChannelStats.CCABusyTimeAvg = 0; - wrq->u.data.length = sizeof(INT); - Status = copy_to_user(wrq->u.data.pointer, &AvgValue, - wrq->u.data.length); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Radio Channel Stats monitoring is not enabled \n", - __FUNCTION__)); - Status = RTMP_IO_EFAULT; - } - break; - - case OID_802_11_GET_CURRENT_CHANNEL_BUSY_TIME_AVG: - if (pAd->EnableChannelStatsCheck) { - UINT32 AvgValue; - - AvgValue = pAd->ChannelStats.ChBusyTimeAvg; - pAd->ChannelStats.ChBusyTimeAvg = 0; - wrq->u.data.length = sizeof(INT); - Status = copy_to_user(wrq->u.data.pointer, &AvgValue, - wrq->u.data.length); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Radio Channel Stats monitoring is not enabled \n", - __FUNCTION__)); - Status = RTMP_IO_EFAULT; - } - break; - - case OID_802_11_GET_CURRENT_CHANNEL_AP_ACTIVITY_AVG: - if (pAd->EnableChannelStatsCheck) { - UINT32 AvgValue; - - AvgValue = pAd->ChannelStats.ChannelApActivityAvg; - pAd->ChannelStats.ChannelApActivityAvg = 0; - wrq->u.data.length = sizeof(INT); - Status = copy_to_user(wrq->u.data.pointer, &AvgValue, - wrq->u.data.length); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Radio Channel Stats monitoring is not enabled \n", - __FUNCTION__)); - Status = RTMP_IO_EFAULT; - } - break; - case OID_802_11_GET_RADIO_STATS_COUNT: - RTMPIoctlGetRadioStatsCount(pAd, wrq); - break; -#endif -#ifdef CUSTOMER_DCC_FEATURE - case OID_802_11_SCAN_BSSID_LIST: - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) { - /* - * Still scanning, indicate the caller should try again. - */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_BSSID_LIST (Still scanning)\n")); - return -EAGAIN; - } - RTMPIoctlGetBSSID_LIST(pAd, wrq); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_BSSID_LIST: (length: %d)\n", - wrq->u.data.length)); - break; - case OID_802_11_GET_CURRENT_CHANNEL_AP_TABLE: - if (pAd->ApEnableBeaconTable == TRUE) - RTMPIoctlGetApTable(pAd, wrq); - else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Beacon Table monitoring is not enabled \n", - __FUNCTION__)); - Status = RTMP_IO_EFAULT; - } - break; - case OID_802_11_GET_SCAN_RESULTS: - if (pAd->ChannelInfo.GetChannelInfo && - pAd->ChannelInfo.ChannelNo != 0) { - RTMPIoctlGetApScanResults(pAd, wrq); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:Single Channel scan has not been run before getting the scan result \n", - __FUNCTION__)); - Status = RTMP_IO_EFAULT; - } - break; - case OID_802_11_GET_ACCESS_CATEGORY_TRAFFIC_STATUS: - RTMPIoctlGetStreamType(pAd, wrq); - break; - case OID_802_11_MBSS_STATISTICS: - RTMPIoctlQueryMbssStat(pAd, wrq); - break; - case OID_802_11_STA_STATISTICS: - RTMPIoctlQuerySTAStat(pAd, wrq); - break; -#endif /* CUSTOMER_DCC_FEATURE */ - -#ifdef AIR_MONITOR - case OID_GET_AIR_MONITOR_RESULT: { - MNT_STA_ENTRY *pEntry = NULL; - MNT_STA_ENTRY *pEntryStart = NULL; - MNT_STA_ENTRY *pTmpEntry = NULL; - UINT32 pEntryLen = 0; - UCHAR i; - - os_alloc_mem(NULL, (UCHAR **)&pEntry, - MAX_NUM_OF_MONITOR_STA * sizeof(MNT_STA_ENTRY)); - if (pEntry == NULL) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Query::OID_GET_AIR_MONITOR_RESULT alloc memory failed!\n")); - return -EFAULT; - } - pEntryStart = pEntry; - NdisZeroMemory(pEntry, - MAX_NUM_OF_MONITOR_STA * sizeof(MNT_STA_ENTRY)); - - for (i = 0; i < MAX_NUM_OF_MONITOR_STA; i++) { - pTmpEntry = &pAd->MntTable[i]; - - if (pTmpEntry->bValid) { - NdisCopyMemory(pEntry + pEntryLen, pTmpEntry, - sizeof(MNT_STA_ENTRY)); - pEntryLen += 1; - } - } - - Status = copy_to_user(wrq->u.data.pointer, pEntryStart, - MAX_NUM_OF_MONITOR_STA * - sizeof(MNT_STA_ENTRY)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_GET_AIR_MONITOR_RESULT success!\n")); - os_free_mem(pEntry); - } break; -#endif - -#ifdef DOT1X_SUPPORT - - case OID_802_11_SET_IEEE8021X: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_SET_IEEE8021X\n")); - wrq->u.data.length = sizeof(INT); - - if (IS_IEEE8021X_Entry(&pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev)) - IEEE8021X = 1; - else - IEEE8021X = 0; - - Status = copy_to_user(wrq->u.data.pointer, &IEEE8021X, - wrq->u.data.length); - break; -#endif /* DOT1X_SUPPORT */ - - case OID_802_11_AUTHENTICATION_MODE: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_AUTHENTICATION_MODE\n")); - wrq->u.data.length = sizeof(NDIS_802_11_AUTHENTICATION_MODE); - AuthMode = SecAuthModeNewToOld( - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.SecConfig.AKMMap); - Status = copy_to_user(wrq->u.data.pointer, &AuthMode, - wrq->u.data.length); - break; - - case OID_GET_CPU_TEMPERATURE: { - UINT32 temperature = 0; - - RTMP_GET_TEMPERATURE(pAd, &temperature); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CurrentTemperature = %d\n", - temperature)); - wrq->u.data.length = sizeof(UINT32); - Status = copy_to_user(wrq->u.data.pointer, &temperature, - wrq->u.data.length); - break; - } - -#ifdef APCLI_SUPPORT - - case OID_802_11_BSSID: - if ((pObj->ioctl_if_type != INT_APCLI) -#ifdef VENDOR_FEATURE6_SUPPORT - && (pObj->ioctl_if_type != INT_MAIN) -#endif /* VENDOR_FEATURE6_SUPPORT */ - ) - return FALSE; - - ifIndex = pObj->ioctl_if; - - if (pObj->ioctl_if_type == INT_APCLI) { - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable; - - if (!apcliEn) - return FALSE; - - Status = copy_to_user(wrq->u.data.pointer, - pApCliEntry->MlmeAux.Bssid, - sizeof(NDIS_802_11_MAC_ADDRESS)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\n", - PRINT_MAC(pApCliEntry->MlmeAux.Bssid))); - } -#ifdef VENDOR_FEATURE6_SUPPORT - else if (pObj->ioctl_if_type == INT_MAIN) { - if (wdev) { - wrq->u.data.length = MAC_ADDR_LEN; - Status = copy_to_user(wrq->u.data.pointer, - &wdev->bssid[0], - wrq->u.data.length); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Query::OID_802_11_BSSID (%02x:%02x:%02x:%02x:%02x:%02x)\n", - PRINT_MAC(wdev->bssid))); - } - } -#endif /* VENDOR_FEATURE6_SUPPORT */ - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_BSSID(=EMPTY)\n")); - Status = -ENOTCONN; - } - - break; -#endif /*APCLI_SUPPORT*/ -#if (defined(APCLI_SUPPORT) || defined(WH_EZ_SETUP)) - - case OID_802_11_SSID: - ifIndex = pObj->ioctl_if; - NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable; - - if (!apcliEn) - return FALSE; - - Ssid.SsidLength = pApCliEntry->CfgSsidLen; - NdisMoveMemory(Ssid.Ssid, pApCliEntry->CfgSsid, - Ssid.SsidLength); - } - -#endif /* APCLI_SUPPORT */ - wrq->u.data.length = sizeof(NDIS_802_11_SSID); - Status = copy_to_user(wrq->u.data.pointer, &Ssid, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query OID_802_11_SSID (Len=%d, ssid=%s)\n", - Ssid.SsidLength, Ssid.Ssid)); - break; -#endif - - case RT_OID_VERSION_INFO: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_VERSION_INFO\n")); - wrq->u.data.length = strlen(AP_DRIVER_VERSION); - snprintf(&driverVersion[0], sizeof(driverVersion), "%s", - AP_DRIVER_VERSION); - driverVersion[wrq->u.data.length] = '\0'; - - if (copy_to_user(wrq->u.data.pointer, &driverVersion, - wrq->u.data.length)) - Status = -EFAULT; - - break; -#ifdef VENDOR_FEATURE6_SUPPORT - - case RT_OID_802_11_PHY_MODE: { - UCHAR *temp_wmode = NULL; - - if (wdev) { - ulInfo = (ULONG)wdev->PhyMode; - wrq->u.data.length = sizeof(ulInfo); - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - temp_wmode = wmode_2_str(wdev->PhyMode); - } - - if (temp_wmode != NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_PHY_MODE (=%lu), %s\n", - ulInfo, temp_wmode)); - os_free_mem(temp_wmode); - temp_wmode = NULL; - } else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_PHY_MODE (=%lu), Null\n", - ulInfo)); - } break; - - case OID_802_11_CHANNEL_WIDTH: { - wrq->u.data.length = sizeof(UCHAR); - ulInfo = wlan_operate_get_ht_bw(wdev); - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_CHANNEL_WIDTH (=%lu)\n", ulInfo)); - break; - } break; - - case RT_OID_802_11_COUNTRY_REGION: - wrq->u.data.length = sizeof(ulInfo); - ulInfo = pAd->CommonCfg.CountryRegionForABand; - ulInfo = (ulInfo << 8) | (pAd->CommonCfg.CountryRegion); - - if (copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length)) - Status = -EFAULT; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_COUNTRY_REGION (=%lu)\n", - ulInfo)); - break; - - case OID_802_11_BEACON_PERIOD: - wrq->u.data.length = sizeof(ulInfo); - ulInfo = pAd->CommonCfg.BeaconPeriod; - - if (copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length)) - Status = -EFAULT; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_BEACON_PERIOD (=%lu)\n", ulInfo)); - break; - - case RT_OID_802_11_TX_POWER_LEVEL_1: - wrq->u.data.length = sizeof(UINT8); - ulInfo = pAd->CommonCfg.ucTxPowerPercentage[BAND0]; - Status = - copy_to_user(wrq->u.data.pointer, - &pAd->CommonCfg.ucTxPowerPercentage[BAND0], - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_TX_POWER_LEVEL_1 (=%u)\n", - pAd->CommonCfg.ucTxPowerPercentage[BAND0])); - break; - - case RT_OID_802_11_QUERY_WMM: - if (wdev) { - wrq->u.data.length = sizeof(BOOLEAN); - Status = copy_to_user(wrq->u.data.pointer, - &wdev->bWmmCapable, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_QUERY_WMM (=%d)\n", - wdev->bWmmCapable)); - } - - break; - - case RT_OID_802_11_PREAMBLE: - wrq->u.data.length = sizeof(ulInfo); - ulInfo = pAd->CommonCfg.TxPreamble; - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_PREAMBLE(=%lu)\n", - pAd->CommonCfg.TxPreamble)); - break; - - case OID_802_11_HT_STBC: - wrq->u.data.length = sizeof(UCHAR); - ulInfo = wlan_config_get_ht_stbc(wdev); - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_HT_STBC(=%lu)\n", ulInfo)); - break; - - case OID_802_11_UAPSD: - if (wdev) { - wrq->u.data.length = sizeof(BOOLEAN); - Status = copy_to_user(wrq->u.data.pointer, - &wdev->UapsdInfo.bAPSDCapable, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_UAPSD (=%d)\n", - wdev->UapsdInfo.bAPSDCapable)); - } - - break; - - case OID_802_11_TX_PACKET_BURST: - wrq->u.data.length = sizeof(BOOLEAN); - Status = copy_to_user(wrq->u.data.pointer, - &pAd->CommonCfg.bEnableTxBurst, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_TX_PACKET_BURST (=%d)\n", - pAd->CommonCfg.bEnableTxBurst)); - break; - - case OID_802_11_AMSDU: - wrq->u.data.length = sizeof(ulInfo); - ulInfo = pAd->CommonCfg.BACapability.field.AmsduEnable; - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_AMSDU (=%lu)\n", ulInfo)); - break; - - case OID_802_11_AMPDU: - wrq->u.data.length = sizeof(ulInfo); - ulInfo = pAd->CommonCfg.BACapability.field.AutoBA; - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_AMPDU (=%lu)\n", ulInfo)); - break; - - case OID_802_11_ASSOLIST: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_ASSOLIST\n")); - RTMPAPGetAssoMacTable(pAd, wrq); - break; -#ifdef WSC_AP_SUPPORT - - case OID_802_11_CURRENT_CRED: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_CURRENT_CRED\n")); - RTMPGetCurrentCred(pAd, wrq); - break; -#endif /* WSC_AP_SUPPORT */ -#endif /* VENDOR_FEATURE6_SUPPORT */ -#if (defined(VENDOR_FEATURE6_SUPPORT) || defined(CONFIG_MAP_SUPPORT)) - case OID_802_11_COEXISTENCE: - wrq->u.data.length = sizeof(BOOLEAN); - Status = copy_to_user(wrq->u.data.pointer, - &pAd->CommonCfg.bBssCoexEnable, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_COEXISTENCE (=%d)\n", - pAd->CommonCfg.bBssCoexEnable)); - break; -#endif - case OID_802_11_NETWORK_TYPES_SUPPORTED: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_NETWORK_TYPES_SUPPORTED\n")); - wrq->u.data.length = sizeof(UCHAR); - - if (copy_to_user(wrq->u.data.pointer, &pAd->RfIcType, - wrq->u.data.length)) - Status = -EFAULT; - - break; -#ifdef IAPP_SUPPORT - - case RT_QUERY_SIGNAL_CONTEXT: { - BOOLEAN FlgIs11rSup = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_QUERY_SIGNAL_CONTEXT\n")); -#ifdef DOT11R_FT_SUPPORT - FlgIs11rSup = TRUE; -#endif /* DOT11R_FT_SUPPORT */ - - if (FlgIs11rSup == FALSE) - Status = -EFAULT; - -#ifdef DOT11R_FT_SUPPORT - else { - FT_KDP_SIGNAL *pFtKdp; - FT_KDP_EVT_HEADER *pEvtHdr; - /* query signal content for 11r */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_QUERY_FT_KDP_CONTEXT\n")); - FT_KDP_EventGet(pAd, &pFtKdp); - - if (pFtKdp != NULL) - pEvtHdr = (FT_KDP_EVT_HEADER *)pFtKdp->Content; - - /* End of if */ - - if ((pFtKdp != NULL) && - ((RT_SIGNAL_STRUC_HDR_SIZE + pEvtHdr->EventLen) <= - wrq->u.data.length)) { - /* copy the event */ - if (copy_to_user(wrq->u.data.pointer, pFtKdp, - RT_SIGNAL_STRUC_HDR_SIZE + - pEvtHdr->EventLen)) { - wrq->u.data.length = 0; - Status = -EFAULT; - } else { - wrq->u.data.length = - RT_SIGNAL_STRUC_HDR_SIZE; - wrq->u.data.length += pEvtHdr->EventLen; - } - - FT_MEM_FREE(pAd, pFtKdp); - } else { - /* no event is queued */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ft_kdp> no event is queued!\n")); - wrq->u.data.length = 0; - } - } - -#endif /* DOT11R_FT_SUPPORT */ - } break; -#ifdef DOT11R_FT_SUPPORT - - case RT_FT_DATA_ENCRYPT: - case RT_FT_DATA_DECRYPT: { - UCHAR *pBuffer; - UINT32 DataLen; - - DataLen = wrq->u.data.length; - - /* - Make sure the data length is multiple of 8 - due to AES_KEY_WRAP() limitation. - */ - if (DataLen & 0x07) - DataLen += 8 - (DataLen & 0x07); - - /* End of if */ - FT_MEM_ALLOC(pAd, &pBuffer, - DataLen + FT_KDP_KEY_ENCRYPTION_EXTEND); - - if (pBuffer == NULL) - break; - - NdisZeroMemory(pBuffer, DataLen + FT_KDP_KEY_ENCRYPTION_EXTEND); - - if (copy_from_user(pBuffer, wrq->u.data.pointer, - wrq->u.data.length)) { - Status = -EFAULT; - FT_MEM_FREE(pAd, pBuffer); - break; - } - - switch (cmd) { - case RT_FT_DATA_ENCRYPT: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_FT_DATA_ENCRYPT\n")); - FT_KDP_DataEncrypt(pAd, (UCHAR *)pBuffer, &DataLen); - break; - - case RT_FT_DATA_DECRYPT: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_FT_DATA_DECRYPT\n")); - FT_KDP_DataDecrypt(pAd, (UCHAR *)pBuffer, &DataLen); - break; - } - - wrq->u.data.length = DataLen; - - if (copy_to_user(wrq->u.data.pointer, pBuffer, - wrq->u.data.length)) - Status = -EFAULT; - - FT_MEM_FREE(pAd, pBuffer); - } break; - - case RT_OID_802_11R_INFO: { - UCHAR apidx = pObj->ioctl_if; - PFT_CONFIG_INFO pFtConfig; - PFT_CFG pFtCfg; - - os_alloc_mem(pAd, (UCHAR **)&pFtConfig, sizeof(FT_CONFIG_INFO)); - - if (pFtConfig == NULL) - break; - - pFtCfg = &pAd->ApCfg.MBSSID[apidx].wdev.FtCfg; - NdisZeroMemory(pFtConfig, sizeof(FT_CONFIG_INFO)); - pFtConfig->FtSupport = pFtCfg->FtCapFlag.Dot11rFtEnable; - pFtConfig->FtRicSupport = pFtCfg->FtCapFlag.RsrReqCap; - pFtConfig->FtOtdSupport = pFtCfg->FtCapFlag.FtOverDs; - NdisMoveMemory(pFtConfig->MdId, pFtCfg->FtMdId, FT_MDID_LEN); - pFtConfig->R0KHIdLen = pFtCfg->FtR0khIdLen; - NdisMoveMemory(pFtConfig->R0KHId, pFtCfg->FtR0khId, - pFtCfg->FtR0khIdLen); - wrq->u.data.length = sizeof(FT_CONFIG_INFO); - Status = copy_to_user(wrq->u.data.pointer, pFtConfig, - wrq->u.data.length); - os_free_mem(pFtConfig); - } break; -#endif /* DOT11R_FT_SUPPORT */ -#endif /* IAPP_SUPPORT */ - -#ifdef CONFIG_11KV_API_SUPPORT -#ifdef CONFIG_DOT11V_WNM - case RT_QUERY_WNM_CAPABILITY: { - PUCHAR p_wnm_query_data = NULL; - PMAC_TABLE_ENTRY pEntry = NULL; - PUINT8 p_cap = NULL; - struct wnm_command *p_wnm_command = NULL; - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[apidx].WNMCtrl; - UINT16 TotalLen = 0; - - TotalLen = wrq->u.data.length; -#ifdef CONFIG_STEERING_API_SUPPORT - if (TotalLen < (sizeof(*p_wnm_command) + 1)) { - UCHAR *WnmStatus; - os_alloc_mem(pAd, (UCHAR **)&WnmStatus, - sizeof(WnmStatus)); - wrq->u.data.length = sizeof(UCHAR); - - if (pWNMCtrl->WNMBTMEnable) - *WnmStatus = TRUE; - else - *WnmStatus = FALSE; - - if (copy_to_user(wrq->u.data.pointer, WnmStatus, - wrq->u.data.length)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("RT_QUERY_WNM_CAPABILITY: copy to user failed!\n")); - Status = EFAULT; - } - - os_free_mem(WnmStatus); - break; - } else -#endif - - if (TotalLen != - sizeof(*p_wnm_command) + MAC_ADDR_LEN + 1) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_ERROR, - ("RT_QUERY_WNM_CAPABILITY: length(%d) check failed\n", - TotalLen)); - Status = EINVAL; - break; - } - - if (!pWNMCtrl->WNMBTMEnable) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_ERROR, - ("RT_QUERY_WNM_CAPABILITY: btm off\n")); - Status = EINVAL; - break; - } - - os_alloc_mem(NULL, (UCHAR **)&p_wnm_command, - wrq->u.data.length); - if (p_wnm_command == NULL) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_ERROR, - ("RT_QUERY_WNM_CAPABILITY: no memory!!!\n")); - Status = ENOMEM; - break; - } - - if (copy_from_user(p_wnm_command, wrq->u.data.pointer, - wrq->u.data.length)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_QUERY_WNM_CAPABILITY: copy from user failed!\n")); - Status = EFAULT; - os_free_mem(p_wnm_command); - break; - } - - p_wnm_query_data = p_wnm_command->command_body; - - /*first six bytes of data is sta mac*/ - pEntry = MacTableLookup(pAd, p_wnm_query_data); - if (!pEntry || !(IS_AKM_OPEN(pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.AKMMap) || - ((pEntry->SecConfig.Handshake.WpaState == - AS_PTKINITDONE) && - (pEntry->SecConfig.Handshake.GTKState == - REKEY_ESTABLISHED)))) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_QUERY_WNM_CAPABILITY: ")); - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_ERROR, - ("STA(%02x:%02x:%02x:%02x:%02x:%02x)not associates with AP!\n", - PRINT_MAC(p_wnm_query_data))); - Status = EINVAL; - os_free_mem(p_wnm_command); - break; - } - /*check for btm capablility*/ - p_cap = (UINT8 *)(p_wnm_query_data + MAC_ADDR_LEN); - *p_cap = 0; - - if (p_wnm_command->command_id == - OID_802_11_WNM_CMD_QUERY_BTM_CAP) { - if (pEntry->BssTransitionManmtSupport) { - *p_cap = 1; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RT_QUERY_WNM_CAPABILITY: BTMCap=%d\n", - (*p_cap))); - } - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RT_QUERY_WNM_CAPABILITY: only check btm cap now\n")); - Status = EINVAL; - os_free_mem(p_wnm_command); - break; - } - if (copy_to_user(wrq->u.data.pointer, (PUCHAR)p_wnm_command, - wrq->u.data.length)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_QUERY_WNM_CAPABILITY: copy to user failed!\n")); - Status = EFAULT; - os_free_mem(p_wnm_command); - break; - } - os_free_mem(p_wnm_command); - break; - } -#endif -#ifdef DOT11K_RRM_SUPPORT - case RT_QUERY_RRM_CAPABILITY: { - PUCHAR p_rrm_query_data = NULL; - PMAC_TABLE_ENTRY pEntry = NULL; - p_rrm_command_t p_rrm_command = NULL; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; - PUINT8 p_cap = NULL; - UINT16 TotalLen = 0; - - TotalLen = wrq->u.data.length; - if (TotalLen != sizeof(*p_rrm_command) + MAC_ADDR_LEN + 8) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_ERROR, - ("RT_QUERY_RRM_CAPABILITY: length(%d) check failed\n", - TotalLen)); - Status = EINVAL; - break; - } - if (!pMbss->wdev.RrmCfg.bDot11kRRMEnable) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_WNM, DBG_LVL_ERROR, - ("%s(): RT_QUERY_RRM_CAPABILITY: rrm off, IF Index: %d\n", - __func__, apidx)); - Status = EINVAL; - break; - } - os_alloc_mem(NULL, (UCHAR **)&p_rrm_command, - wrq->u.data.length); - if (p_rrm_command == NULL) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_ERROR, - ("RT_QUERY_RRM_CAPABILITY : no memory!!!\n")); - Status = ENOMEM; - break; - } - - if (copy_from_user(p_rrm_command, wrq->u.data.pointer, - wrq->u.data.length)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_QUERY_RRM_CAPABILITY: copy from user failed!\n")); - Status = EFAULT; - os_free_mem(p_rrm_command); - break; - } - - p_rrm_query_data = p_rrm_command->command_body; - - /*first six bytes of data is sta mac*/ - pEntry = MacTableLookup(pAd, p_rrm_query_data); - if (!pEntry || !(IS_AKM_OPEN(pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.AKMMap) || - ((pEntry->SecConfig.Handshake.WpaState == - AS_PTKINITDONE) && - (pEntry->SecConfig.Handshake.GTKState == - REKEY_ESTABLISHED)))) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RT_QUERY_RRM_CAPABILITY: ")); - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_ERROR, - ("STA(%02x:%02x:%02x:%02x:%02x:%02x) not associates with AP!\n", - PRINT_MAC(p_rrm_query_data))); - Status = EINVAL; - os_free_mem(p_rrm_command); - break; - } - /*check for btm capablility*/ - p_cap = (UINT8 *)(p_rrm_query_data + MAC_ADDR_LEN); - memset(p_cap, 0, 8); - - if (p_rrm_command->command_id == OID_802_11_RRM_CMD_QUERY_CAP) { - memcpy(p_cap, (PUCHAR) & (pEntry->RrmEnCap), - sizeof(pEntry->RrmEnCap)); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RT_QUERY_WNM_CAPABILITY: only check rrm cap now\n")); - Status = EINVAL; - os_free_mem(p_rrm_command); - break; - } - if (copy_to_user(wrq->u.data.pointer, (PUCHAR)p_rrm_command, - wrq->u.data.length)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_QUERY_RRM_CAPABILITY: copy to user failed!\n")); - Status = EFAULT; - os_free_mem(p_rrm_command); - break; - } - os_free_mem(p_rrm_command); - break; - } -#endif -#endif /* CONFIG_11KV_API_SUPPORT */ - -#ifdef WSC_AP_SUPPORT -#ifdef VENDOR_FEATURE7_SUPPORT - case ARRIS_OID_WSC_QUERY_STATE: { - wrq->u.data.length = sizeof(UCHAR); - Status = copy_to_user( - wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx].WscControl.WscState, - wrq->u.data.length); - } break; -#endif - case RT_OID_WSC_QUERY_STATUS: { - INT WscStatus; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_WSC_QUERY_STATUS\n")); -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - INT ApCliIdx = pObj->ioctl_if; - - APCLI_MR_APIDX_SANITY_CHECK(ApCliIdx); - WscStatus = pAd->ApCfg.ApCliTab[ApCliIdx] - .wdev.WscControl.WscStatus; - } else -#endif /* APCLI_SUPPORT */ - { - WscStatus = pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscStatus; - } - - wrq->u.data.length = sizeof(INT); - - if (copy_to_user(wrq->u.data.pointer, &WscStatus, - wrq->u.data.length)) - Status = -EFAULT; - - break; - } - - case RT_OID_WSC_PIN_CODE: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_WSC_PIN_CODE\n")); - wrq->u.data.length = sizeof(UINT); - /*WscPinCode = GenerateWpsPinCode(pAd, FALSE, apidx); */ - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - - WscPinCode = pWscControl->WscEnrolleePinCode; - - if (copy_to_user(wrq->u.data.pointer, &WscPinCode, - wrq->u.data.length)) - Status = -EFAULT; - - break; -#ifdef APCLI_SUPPORT - - case RT_OID_APCLI_WSC_PIN_CODE: - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_APCLI_WSC_PIN_CODE\n")); - wrq->u.data.length = sizeof(UINT); - /*WscPinCode = GenerateWpsPinCode(pAd, TRUE, apidx); */ - WscPinCode = pAd->ApCfg.ApCliTab[apidx] - .wdev.WscControl.WscEnrolleePinCode; - - if (copy_to_user(wrq->u.data.pointer, &WscPinCode, - wrq->u.data.length)) - Status = -EFAULT; - - break; -#endif /* APCLI_SUPPORT */ - case OID_WSC_UUID: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_WSC_QUERY_UUID\n")); - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - - wrq->u.data.length = UUID_LEN_HEX; - if (copy_to_user(wrq->u.data.pointer, - &pWscControl->Wsc_Uuid_E[0], UUID_LEN_HEX)) - Status = -EFAULT; - - break; - - case RT_OID_WSC_UUID: - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_WSC_QUERY_UUID\n")); - wrq->u.data.length = UUID_LEN_STR; - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - - if (copy_to_user(wrq->u.data.pointer, - &pWscControl->Wsc_Uuid_Str[0], UUID_LEN_STR)) - Status = -EFAULT; - - break; - - case RT_OID_WSC_MAC_ADDRESS: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_WSC_MAC_ADDRESS\n")); - wrq->u.data.length = MAC_ADDR_LEN; - - if (copy_to_user(wrq->u.data.pointer, - pAd->ApCfg.MBSSID[apidx].wdev.bssid, - wrq->u.data.length)) - Status = -EFAULT; - - break; - - case RT_OID_WSC_CONFIG_STATUS: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_WSC_CONFIG_STATUS\n")); - wrq->u.data.length = sizeof(UCHAR); - - if (copy_to_user(wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscConfStatus, - wrq->u.data.length)) - Status = -EFAULT; - - break; - - case RT_OID_WSC_QUERY_PEER_INFO_ON_RUNNING: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_WSC_QUERY_PEER_INFO_ON_RUNNING\n")); - - if (pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscState > - WSC_STATE_WAIT_M2) { - wrq->u.data.length = sizeof(WSC_PEER_DEV_INFO); - - if (copy_to_user(wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscPeerInfo, - wrq->u.data.length)) - Status = -EFAULT; - } else - Status = -EFAULT; - - break; - - case RT_OID_802_11_WSC_QUERY_PROFILE: - wrq->u.data.length = sizeof(WSC_PROFILE); - os_alloc_mem(pAd, (UCHAR **)&pProfile, sizeof(WSC_PROFILE)); - - if (pProfile == NULL) { - Status = -EFAULT; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RT_OID_802_11_WSC_QUERY_PROFILE fail!\n")); - break; - } - -#ifdef APCLI_SUPPORT - if (pObj->ioctl_if_type == INT_APCLI) { - APCLI_MR_APIDX_SANITY_CHECK(apidx); - pWscControl = - &pAd->ApCfg.ApCliTab[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli : %d) RT_OID_802_11_WSC_QUERY_PROFILE :: This command is from apcli interface now.\n", - apidx)); - } else -#endif /* APCLI_SUPPORT */ - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - - RTMPZeroMemory(pProfile, sizeof(WSC_PROFILE)); - NdisMoveMemory(pProfile, &pWscControl->WscProfile, - sizeof(WSC_PROFILE)); - - if ((pProfile->Profile[0].AuthType == WSC_AUTHTYPE_OPEN) && - (pProfile->Profile[0].EncrType == WSC_ENCRTYPE_NONE)) { - pProfile->Profile[0].KeyLength = 0; - NdisZeroMemory(pProfile->Profile[0].Key, 64); - } - - if (copy_to_user(wrq->u.data.pointer, pProfile, - wrq->u.data.length)) - Status = -EFAULT; - - os_free_mem(pProfile); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_WSC_QUERY_PROFILE\n")); - break; -#ifdef WSC_V2_SUPPORT - - case RT_OID_WSC_V2_SUPPORT: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_WSC_V2_SUPPORT (=%d)\n", - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscV2Info.bEnableWpsV2)); - wrq->u.data.length = sizeof(BOOLEAN); - - if (copy_to_user( - wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscV2Info.bEnableWpsV2, - wrq->u.data.length)) - Status = -EFAULT; - - break; - - case RT_OID_WSC_FRAGMENT_SIZE: - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_WSC_FRAGMENT_SIZE (=%d)\n", - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscFragSize)); - wrq->u.data.length = sizeof(USHORT); - - if (copy_to_user(wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscFragSize, - wrq->u.data.length)) - Status = -EFAULT; - - break; -#endif /* WSC_V2_SUPPORT */ -#endif /* WSC_AP_SUPPORT */ -#ifdef LLTD_SUPPORT - - case RT_OID_GET_LLTD_ASSO_TABLE: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::Get LLTD association table\n")); - - if ((wrq->u.data.pointer == NULL) || (apidx != MAIN_MBSSID)) - Status = -EFAULT; - else { - INT i; - RT_LLTD_ASSOICATION_TABLE AssocTab; - - AssocTab.Num = 0; - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) && - (pAd->MacTab.Content[i].Sst == SST_ASSOC)) { - COPY_MAC_ADDR( - AssocTab.Entry[AssocTab.Num] - .Addr, - &pAd->MacTab.Content[i].Addr); - AssocTab.Entry[AssocTab.Num].phyMode = - pAd->ApCfg.MBSSID[apidx] - .wdev.PhyMode; - AssocTab.Entry[AssocTab.Num].MOR = - RateIdToMbps - [pAd->ApCfg - .MBSSID[apidx] - .MaxTxRate] * - 2; - AssocTab.Num += 1; - } - } - - wrq->u.data.length = sizeof(RT_LLTD_ASSOICATION_TABLE); - - if (copy_to_user(wrq->u.data.pointer, &AssocTab, - wrq->u.data.length)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: copy_to_user() fail\n", - __func__)); - Status = -EFAULT; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AssocTab.Num = %d\n", AssocTab.Num)); - } - - break; -#ifdef APCLI_SUPPORT - - case RT_OID_GET_REPEATER_AP_LINEAGE: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Not Support : Get repeater AP lineage.\n")); - break; -#endif /* APCLI_SUPPORT */ -#endif /* LLTD_SUPPORT */ -#ifdef DOT1X_SUPPORT - - case OID_802_DOT1X_CONFIGURATION: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::Get Radius setting(%lu)\n", - (ULONG)sizeof(DOT1X_CMM_CONF))); - Dot1xIoctlQueryRadiusConf(pAd, wrq); - break; - - case OID_802_DOT1X_QUERY_STA_AID: - RTMPIoctlQueryStaAid(pAd, wrq); - break; -#ifdef RADIUS_ACCOUNTING_SUPPORT - - case OID_802_DOT1X_QUERY_STA_DATA: - RTMPIoctlQueryStaData(pAd, wrq); - break; -#endif /* RADIUS_ACCOUNTING_SUPPORT */ - case OID_802_DOT1X_QUERY_STA_RSN: - RTMPIoctlQueryStaRsn(pAd, wrq); - break; -#endif /* DOT1X_SUPPORT */ - - case RT_OID_802_11_MAC_ADDRESS: - wrq->u.data.length = MAC_ADDR_LEN; - Status = copy_to_user(wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx].wdev.bssid, - wrq->u.data.length); - break; -#ifdef SNMP_SUPPORT - - case RT_OID_802_11_MANUFACTUREROUI: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_MANUFACTUREROUI\n")); - wrq->u.data.length = ManufacturerOUI_LEN; - Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, - wrq->u.data.length); - break; - - case RT_OID_802_11_MANUFACTURERNAME: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_MANUFACTURERNAME\n")); - wrq->u.data.length = strlen(ManufacturerNAME); - Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, - wrq->u.data.length); - break; - - case RT_OID_802_11_RESOURCETYPEIDNAME: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_RESOURCETYPEIDNAME\n")); - wrq->u.data.length = strlen(ResourceTypeIdName); - Status = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, - wrq->u.data.length); - break; - - case RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED: { - ULONG ulInfo; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED\n")); - ulInfo = 1; /* 1 is support wep else 2 is not support. */ - wrq->u.data.length = sizeof(ulInfo); - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - break; - } - - case RT_OID_802_11_POWERMANAGEMENTMODE: { - ULONG ulInfo; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_POWERMANAGEMENTMODE\n")); - ulInfo = 1; /* 1 is power active else 2 is power save. */ - wrq->u.data.length = sizeof(ulInfo); - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - break; - } - - case OID_802_11_WEPDEFAULTKEYVALUE: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_WEPDEFAULTKEYVALUE\n")); - pKeyIdxValue = wrq->u.data.pointer; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("KeyIdxValue.KeyIdx = %d,\n", pKeyIdxValue->KeyIdx)); - valueLen = pAd->SharedKey[pObj->ioctl_if] - [pAd->ApCfg.MBSSID[pObj->ioctl_if] - .DefaultKeyId] - .KeyLen; - NdisMoveMemory(pKeyIdxValue->Value, - &pAd->SharedKey[pObj->ioctl_if] - [pAd->ApCfg.MBSSID[pObj->ioctl_if] - .DefaultKeyId] - .Key, - valueLen); - pKeyIdxValue->Value[valueLen] = '\0'; - wrq->u.data.length = sizeof(DefaultKeyIdxValue); - Status = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, - wrq->u.data.length); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x\n", - pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, - wrq->u.data.length, - pAd->SharedKey[pObj->ioctl_if] - [pAd->ApCfg.MBSSID[pObj->ioctl_if] - .DefaultKeyId] - .KeyLen, - pAd->SharedKey[pObj->ioctl_if][0].Key[0], - pAd->SharedKey[pObj->ioctl_if][1].Key[0], - pAd->SharedKey[pObj->ioctl_if][2].Key[0], - pAd->SharedKey[pObj->ioctl_if][3].Key[0])); - break; - - case OID_802_11_WEPDEFAULTKEYID: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_WEPDEFAULTKEYID\n")); - wrq->u.data.length = sizeof(UCHAR); - Status = copy_to_user( - wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DefaultKeyId =%d\n", - pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId)); - break; - - case RT_OID_802_11_WEPKEYMAPPINGLENGTH: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH\n")); - wrq->u.data.length = sizeof(UCHAR); - Status = copy_to_user( - wrq->u.data.pointer, - &pAd->SharedKey[pObj->ioctl_if] - [pAd->ApCfg.MBSSID[pObj->ioctl_if] - .DefaultKeyId] - .KeyLen, - wrq->u.data.length); - break; - - case OID_802_11_SHORTRETRYLIMIT: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_SHORTRETRYLIMIT\n")); - wrq->u.data.length = sizeof(ULONG); - ShortRetryLimit = - AsicGetRetryLimit(pAd, TX_RTY_CFG_RTY_LIMIT_SHORT); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ShortRetryLimit =%ld\n", ShortRetryLimit)); - Status = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, - wrq->u.data.length); - break; - - case OID_802_11_LONGRETRYLIMIT: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_LONGRETRYLIMIT\n")); - wrq->u.data.length = sizeof(ULONG); - LongRetryLimit = - AsicGetRetryLimit(pAd, TX_RTY_CFG_RTY_LIMIT_LONG); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("LongRetryLimit =%ld\n", LongRetryLimit)); - Status = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, - wrq->u.data.length); - break; - - case RT_OID_802_11_PRODUCTID: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_PRODUCTID\n")); -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) { - USHORT device_id; - - if (((POS_COOKIE)pAd->OS_Cookie)->pci_dev != NULL) - pci_read_config_word( - ((POS_COOKIE)pAd->OS_Cookie)->pci_dev, - PCI_DEVICE_ID, &device_id); - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, (" pci_dev = NULL\n")); - - snprintf((RTMP_STRING *)snmp_tmp, sizeof(snmp_tmp), - "%04x %04x\n", NIC_PCI_VENDOR_ID, device_id); - } - -#endif /* RTMP_PCI_SUPPORT */ - wrq->u.data.length = strlen((RTMP_STRING *)snmp_tmp); - Status = copy_to_user(wrq->u.data.pointer, snmp_tmp, - wrq->u.data.length); - break; - - case RT_OID_802_11_MANUFACTUREID: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_MANUFACTUREID\n")); - wrq->u.data.length = strlen(ManufacturerNAME); - Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, - wrq->u.data.length); - break; -#endif /* SNMP_SUPPORT */ -#if (defined(SNMP_SUPPORT) || defined(WH_EZ_SETUP) || \ - defined(VENDOR_FEATURE6_SUPPORT)) - - case OID_802_11_CURRENTCHANNEL: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_CURRENTCHANNEL\n")); - wrq->u.data.length = sizeof(UCHAR); - Status = copy_to_user(wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx].wdev.channel, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Status=%d\n", Status)); - break; -#endif - - case OID_802_11_STATISTICS: - os_alloc_mem(pAd, (UCHAR **)&pStatistics, - sizeof(NDIS_802_11_STATISTICS)); - - if (pStatistics) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_STATISTICS\n")); - /* add the most up-to-date h/w raw counters into software counters */ - /*NICUpdateRawCountersNew(pAd);*/ - pStatistics->TransmittedFragmentCount.QuadPart = - pAd->WlanCounters[0] - .TransmittedFragmentCount.QuadPart + - pAd->WlanCounters[0] - .MulticastTransmittedFrameCount.QuadPart; - pStatistics->MulticastTransmittedFrameCount.QuadPart = - pAd->WlanCounters[0] - .MulticastTransmittedFrameCount.QuadPart; - pStatistics->FailedCount.QuadPart = - pAd->WlanCounters[0].FailedCount.QuadPart; - pStatistics->RetryCount.QuadPart = - pAd->WlanCounters[0].RetryCount.QuadPart; - pStatistics->MultipleRetryCount.QuadPart = - pAd->WlanCounters[0].MultipleRetryCount.QuadPart; - pStatistics->RTSSuccessCount.QuadPart = - pAd->WlanCounters[0].RTSSuccessCount.QuadPart; - pStatistics->RTSFailureCount.QuadPart = - pAd->WlanCounters[0].RTSFailureCount.QuadPart; - pStatistics->ACKFailureCount.QuadPart = - pAd->WlanCounters[0].ACKFailureCount.QuadPart; - pStatistics->FrameDuplicateCount.QuadPart = - pAd->WlanCounters[0] - .FrameDuplicateCount.QuadPart; - pStatistics->ReceivedFragmentCount.QuadPart = - pAd->WlanCounters[0] - .ReceivedFragmentCount.QuadPart; - pStatistics->MulticastReceivedFrameCount.QuadPart = - pAd->WlanCounters[0] - .MulticastReceivedFrameCount.QuadPart; -#ifdef DBG - pStatistics->FCSErrorCount = - pAd->RalinkCounters.RealFcsErrCount; -#else - pStatistics->FCSErrorCount.QuadPart = - pAd->WlanCounters[0].FCSErrorCount.QuadPart; - pStatistics->FrameDuplicateCount.u.LowPart = - pAd->WlanCounters[0] - .FrameDuplicateCount.u.LowPart / - 100; -#endif - pStatistics->TransmittedFrameCount.QuadPart = - pAd->WlanCounters[0] - .TransmittedFragmentCount.QuadPart; - pStatistics->WEPUndecryptableCount.QuadPart = - pAd->WlanCounters[0] - .WEPUndecryptableCount.QuadPart; - wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS); - Status = copy_to_user(wrq->u.data.pointer, pStatistics, - wrq->u.data.length); - os_free_mem(pStatistics); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_STATISTICS(mem alloc failed)\n")); - Status = -EFAULT; - } - - break; - -#ifdef ACL_BLK_COUNT_SUPPORT - case OID_802_11_ACL_BLK_REJCT_COUNT_STATICS: { - UINT8 count = 0; - ULONG Policy; - ULONG Num; - UCHAR *pAddr; - - wrq->u.data.length = sizeof(RT_802_11_ACL); - Policy = pAd->ApCfg.MBSSID[apidx].AccessControlList.Policy; - Num = pAd->ApCfg.MBSSID[apidx].AccessControlList.Num; - pAddr = (pAd->ApCfg.MBSSID[apidx] - .AccessControlList.Entry[count] - .Addr); - if (Policy == 2) - Status = copy_to_user( - wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx].AccessControlList, - wrq->u.data.length); - else { - for (count = 0; - count < - pAd->ApCfg.MBSSID[apidx].AccessControlList.Num; - count++) - pAd->ApCfg.MBSSID[apidx] - .AccessControlList.Entry[count] - .Reject_Count = 0; - Status = copy_to_user( - wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[apidx].AccessControlList, - wrq->u.data.length); - } - break; - } -#endif /*ACL_BLK_COUNT_SUPPORT*/ - - case RT_OID_802_11_PER_BSS_STATISTICS: { - PMBSS_STATISTICS pMbssStat; - INT apidx = pObj->ioctl_if; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; - - os_alloc_mem(pAd, (UCHAR **)&pMbssStat, - sizeof(MBSS_STATISTICS)); - NdisZeroMemory(pMbssStat, sizeof(MBSS_STATISTICS)); - pMbssStat->TransmittedByteCount = pMbss->TransmittedByteCount; - pMbssStat->ReceivedByteCount = pMbss->ReceivedByteCount; - pMbssStat->TxCount = pMbss->TxCount; - pMbssStat->RxCount = pMbss->RxCount; - pMbssStat->RxErrorCount = pMbss->RxErrorCount; - pMbssStat->RxDropCount = pMbss->RxDropCount; - pMbssStat->TxErrorCount = pMbss->TxErrorCount; - pMbssStat->TxDropCount = pMbss->TxDropCount; - pMbssStat->ucPktsTx = pMbss->ucPktsTx; - pMbssStat->ucPktsRx = pMbss->ucPktsRx; - pMbssStat->mcPktsTx = pMbss->mcPktsTx; - pMbssStat->mcPktsRx = pMbss->mcPktsRx; - pMbssStat->bcPktsTx = pMbss->bcPktsTx; - pMbssStat->bcPktsRx = pMbss->bcPktsRx; - wrq->u.data.length = sizeof(MBSS_STATISTICS); - Status = copy_to_user(wrq->u.data.pointer, pMbssStat, - wrq->u.data.length); - os_free_mem(pMbssStat); - } break; -#ifdef HOSTAPD_SUPPORT - - case HOSTAPD_OID_GETWPAIE: /*report wpa ie of the new station to hostapd. */ - if (wrq->u.data.length != sizeof(wpaie)) - Status = -EINVAL; - else if (copy_from_user(&wpaie, wrq->u.data.pointer, - IEEE80211_ADDR_LEN)) - Status = -EFAULT; - else { - pEntry = MacTableLookup(pAd, wpaie.wpa_macaddr); - - if (!pEntry) { - Status = -EINVAL; - break; - } - - NdisZeroMemory(wpaie.rsn_ie, sizeof(wpaie.rsn_ie)); - - /* For WPA1, RSN_IE=221 */ - if ((pEntry->AuthMode == Ndis802_11AuthModeWPA) || - (pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) || - (pEntry->AuthMode == Ndis802_11AuthModeWPA2) || - (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) || - (pEntry->AuthMode == Ndis802_11AuthModeWPA1WPA2) || - (pEntry->AuthMode == - Ndis802_11AuthModeWPA1PSKWPA2PSK)) { - int ielen = pEntry->RSNIE_Len; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("pEntry->RSNIE_Len=%d\n", - pEntry->RSNIE_Len)); - - if (ielen > sizeof(wpaie.rsn_ie)) - ielen = sizeof(wpaie.rsn_ie) - 1; - - p = wpaie.rsn_ie; - hex_dump( - "HOSTAPD_OID_GETWPAIE woody==>pEntry->RSN_IE", - (unsigned char *)pEntry->RSN_IE, ielen); - NdisMoveMemory(p, pEntry->RSN_IE, ielen); - } - } - - if (copy_to_user(wrq->u.data.pointer, &wpaie, sizeof(wpaie))) - Status = -EFAULT; - - break; - - case HOSTAPD_OID_GET_SEQ: /*report txtsc to hostapd. */ - pMbss = &pAd->ApCfg.MBSSID[apidx]; - - if (wrq->u.data.length != sizeof(ik)) - Status = -EINVAL; - else if (copy_from_user(&ik, wrq->u.data.pointer, - IEEE80211_ADDR_LEN)) - Status = -EFAULT; - else { - NdisZeroMemory(&ik.ik_keytsc, sizeof(ik.ik_keytsc)); - p = (unsigned char *)&ik.ik_keytsc; - NdisMoveMemory( - p + 2, - pAd->SharedKey[apidx][pMbss->DefaultKeyId].TxTsc, - 6); - - if (copy_to_user(wrq->u.data.pointer, &ik, sizeof(ik))) - Status = -EFAULT; - } - - break; - - case HOSTAPD_OID_GET_1X_GROUP_KEY: /*report default group key to hostapd. */ - pMbss = &pAd->ApCfg.MBSSID[apidx]; - - if (wrq->u.data.length != sizeof(group_key)) - Status = -EINVAL; - else { - if (pAd->SharedKey[apidx][pMbss->DefaultKeyId].KeyLen != - 0 && - pAd->SharedKey[apidx][pMbss->DefaultKeyId].Key != - NULL) { - group_key.ik_keyix = pMbss->DefaultKeyId; - group_key.ik_keylen = - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .KeyLen; - NdisMoveMemory( - group_key.ik_keydata, - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .Key, - pAd->SharedKey[apidx] - [pMbss->DefaultKeyId] - .KeyLen); - - if (copy_to_user(wrq->u.data.pointer, - &group_key, sizeof(group_key))) - Status = -EFAULT; - } - } - - break; -#endif /*HOSTAPD_SUPPORT*/ -#ifdef APCLI_SUPPORT - - case OID_GEN_MEDIA_CONNECT_STATUS: { - ULONG ApCliIdx = pObj->ioctl_if; - NDIS_MEDIA_STATE MediaState; - PMAC_TABLE_ENTRY pEntry; - STA_TR_ENTRY *tr_entry; - PAPCLI_STRUCT pApCliEntry; - - if (pObj->ioctl_if_type != INT_APCLI) { - Status = -EOPNOTSUPP; - break; - } - - APCLI_MR_APIDX_SANITY_CHECK(ApCliIdx); - pApCliEntry = &pAd->ApCfg.ApCliTab[ApCliIdx]; - - if (pApCliEntry->MacTabWCID >= MAX_LEN_OF_MAC_TABLE) { - Status = -EOPNOTSUPP; - break; - } - - pEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; - tr_entry = &pAd->MacTab.tr_entry[pApCliEntry->MacTabWCID]; - - if (!IS_ENTRY_APCLI(pEntry) && !IS_ENTRY_REPEATER(pEntry)) { - Status = -EOPNOTSUPP; - break; - } - - if ((pAd->ApCfg.ApCliTab[ApCliIdx].Valid == TRUE) && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) - MediaState = NdisMediaStateConnected; - else - MediaState = NdisMediaStateDisconnected; - - wrq->u.data.length = sizeof(NDIS_MEDIA_STATE); - Status = copy_to_user(wrq->u.data.pointer, &MediaState, - wrq->u.data.length); - } break; -#endif /* APCLI_SUPPORT */ -#ifdef RTMP_RBUS_SUPPORT - - case RT_OID_802_11_SNR_0: - if (wdev && wdev->LastSNR0 > 0) { - ULONG ulInfo; - - ulInfo = ConvertToSnr(pAd, wdev->LastSNR0); - wrq->u.data.length = sizeof(ulInfo); - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_SNR_0(0x=%lx)\n", - ulInfo)); - } else - Status = -EFAULT; - - break; - - case RT_OID_802_11_SNR_1: - if (wdev && (pAd->Antenna.field.RxPath > 1) && - (wdev->LastSNR1 > 0)) { - ULONG ulInfo; - - ulInfo = ConvertToSnr(pAd, wdev->LastSNR1); - wrq->u.data.length = sizeof(ulInfo); - Status = copy_to_user(wrq->u.data.pointer, &ulInfo, - wrq->u.data.length); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_SNR_1(%lx, LastSNR1=%d)\n", - ulInfo, wdev->LastSNR1)); - } else - Status = -EFAULT; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::RT_OID_802_11_SNR_1, Status=%d\n", Status)); - break; -#endif /* RTMP_RBUS_SUPPORT */ - case OID_802_11_ACL_LIST: - if (wrq->u.data.length < sizeof(RT_802_11_ACL)) - Status = -EINVAL; - else - Status = copy_to_user(wrq->u.data.pointer, - &pAd->ApCfg.MBSSID[pObj->ioctl_if] - .AccessControlList, - sizeof(RT_802_11_ACL)); - - break; -#ifdef CONFIG_HOTSPOT -#ifdef CONFIG_DOT11V_WNM - - case OID_802_11_WNM_IPV4_PROXY_ARP_LIST: { - BSS_STRUCT *pMbss; - PUCHAR pProxyARPTable; - UINT32 ARPTableLen; - - pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - ARPTableLen = IPv4ProxyARPTableLen(pAd, pMbss); - os_alloc_mem(NULL, &pProxyARPTable, ARPTableLen); - GetIPv4ProxyARPTable(pAd, pMbss, &pProxyARPTable); - wrq->u.data.length = ARPTableLen; - Status = copy_to_user(wrq->u.data.pointer, pProxyARPTable, - ARPTableLen); - os_free_mem(pProxyARPTable); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_WNM_PROXY_ARP_LIST\n")); - break; - - case OID_802_11_WNM_IPV6_PROXY_ARP_LIST: { - BSS_STRUCT *pMbss; - PUCHAR pProxyARPTable; - UINT32 ARPTableLen; - - pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - ARPTableLen = IPv6ProxyARPTableLen(pAd, pMbss); - os_alloc_mem(NULL, &pProxyARPTable, ARPTableLen); - GetIPv6ProxyARPTable(pAd, pMbss, &pProxyARPTable); - wrq->u.data.length = ARPTableLen; - Status = copy_to_user(wrq->u.data.pointer, pProxyARPTable, - ARPTableLen); - os_free_mem(pProxyARPTable); - } break; -#endif - - case OID_802_11_SECURITY_TYPE: { - BSS_STRUCT *pMbss; - PUCHAR pType; - struct security_type *SecurityType; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query:OID_802_11_SECURITY_TYPE\n")); - os_alloc_mem(NULL, &pType, sizeof(*SecurityType)); - SecurityType = (struct security_type *)pType; - pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - SecurityType->ifindex = pObj->ioctl_if; - SecurityType->auth_mode = - SecAuthModeNewToOld(pMbss->wdev.SecConfig.AKMMap); - SecurityType->encryp_type = SecEncryModeNewToOld( - pMbss->wdev.SecConfig.PairwiseCipher); - wrq->u.data.length = sizeof(*SecurityType); - Status = copy_to_user(wrq->u.data.pointer, pType, - sizeof(*SecurityType)); - os_free_mem(pType); - } break; - - case OID_802_11_HS_BSSID: { - BSS_STRUCT *pMbss; - - pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - wrq->u.data.length = 6; - Status = - copy_to_user(wrq->u.data.pointer, pMbss->wdev.bssid, 6); - } break; -#ifdef CONFIG_HOTSPOT_R2 - - case OID_802_11_HS_OSU_SSID: { - wrq->u.data.length = - pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen; /* +2; */ - /* tmpbuf[0] = IE_SSID; */ - /* tmpbuf[1] = pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen; */ - /* memcpy(&tmpbuf[2], pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid, pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen); */ - /* Status = copy_to_user(wrq->u.data.pointer, tmpbuf, wrq->u.data.length); */ - Status = - copy_to_user(wrq->u.data.pointer, - pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid, - pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\033[1;32m %s, %u OID_802_11_HS_OSU_SSID [%s]\033[0m\n", - __func__, __LINE__, - pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid)); - /* this is an osu ssid , disable 11U capability */ - pAd->ApCfg.MBSSID[pObj->ioctl_if].GASCtrl.b11U_enable = FALSE; - } break; -#endif /* CONFIG_HOTSPOT_R2 */ -#endif -#ifdef WAPP_SUPPORT - case OID_802_11_WIFI_VER: { - wrq->u.data.length = strlen(AP_DRIVER_VERSION); - snprintf(&driverVersion[0], sizeof(driverVersion), "%s", - AP_DRIVER_VERSION); - driverVersion[wrq->u.data.length] = '\0'; - - Status = copy_to_user(wrq->u.data.pointer, driverVersion, - wrq->u.data.length); - } break; - case OID_802_11_WAPP_SUPPORT_VER: { - RTMP_STRING wapp_support_ver[16]; - wrq->u.data.length = strlen(WAPP_SUPPORT_VERSION); - snprintf(&wapp_support_ver[0], sizeof(wapp_support_ver), "%s", - WAPP_SUPPORT_VERSION); - wapp_support_ver[wrq->u.data.length] = '\0'; - - Status = copy_to_user(wrq->u.data.pointer, wapp_support_ver, - wrq->u.data.length); - } break; -#endif /* WAPP_SUPPORT */ -#ifdef VENDOR_FEATURE7_SUPPORT -#ifdef DOT11_N_SUPPORT - case ARRIS_OID_HTEXTCHA_QUERY_VALUE: { - PUCHAR Buf = NULL; - - os_alloc_mem(pAd, (UCHAR **)&Buf, wrq->u.data.length); - if (!Buf) { - Status = -EINVAL; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Memory is not available\n")); - } - Show_HtExtcha_Proc(pAd, Buf, wrq->u.data.length); - Status = copy_to_user(wrq->u.data.pointer, Buf, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("HtExtCha is:%s", Buf)); - os_free_mem(Buf); - } break; -#endif -#endif -#ifdef WIFI_SPECTRUM_SUPPORT - case OID_802_11_WIFISPECTRUM_GET_CAPTURE_BW: { - UINT32 CapNode; - UCHAR CapBw; - - CapNode = Get_System_CapNode_Info(pAd); - CapBw = Get_System_Bw_Info(pAd, CapNode); - wrq->u.data.length = sizeof(UCHAR); - Status = copy_to_user(wrq->u.data.pointer, &CapBw, - wrq->u.data.length); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_WIFISPECTRUM_GET_CAPTURE_BW CapBw = %d\n", - CapBw)); - } break; - - case OID_802_11_WIFISPECTRUM_GET_CENTRAL_FREQ: { - UINT32 CapNode; - USHORT CenFreq; - - CapNode = Get_System_CapNode_Info(pAd); - CenFreq = Get_System_CenFreq_Info(pAd, CapNode); - wrq->u.data.length = sizeof(USHORT); - Status = copy_to_user(wrq->u.data.pointer, &CenFreq, - wrq->u.data.length); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_11_WIFISPECTRUM_GET_CENTRAL_FREQ CenFreq = %d\n", - CenFreq)); - } break; -#endif /* WIFI_SPECTRUM_SUPPORT */ -#ifdef MT_DFS_SUPPORT - case OID_DFS_ZERO_WAIT: - Status = ZeroWaitDfsQueryCmdHandler(pAd, wrq); - break; -#endif -#ifdef CONFIG_STEERING_API_SUPPORT - case OID_802_11_GET_OPERATING_CLASS: { - UINT32 *OperatingClass; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - os_alloc_mem(pAd, (UCHAR **)&OperatingClass, - sizeof(OperatingClass)); - *OperatingClass = - get_regulatory_class(pAd, pMbss->wdev.channel, - pMbss->wdev.PhyMode, &pMbss->wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OperatingClass %d \n", *OperatingClass)); - wrq->u.data.length = sizeof(INT); - Status = copy_to_user(wrq->u.data.pointer, OperatingClass, - wrq->u.data.length); - os_free_mem(OperatingClass); - } break; - - case OID_NON_ASSOCIATED_STA_REPORT_CAPABLE: { - INT *NonAssocStaReportCap; - os_alloc_mem(pAd, (UCHAR **)&NonAssocStaReportCap, - sizeof(NonAssocStaReportCap)); - *NonAssocStaReportCap = pAd->ApCfg.NonAssocStaReport; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("NonAssocStaReportCap %d \n", *NonAssocStaReportCap)); - wrq->u.data.length = sizeof(INT); - Status = copy_to_user(wrq->u.data.pointer, NonAssocStaReportCap, - wrq->u.data.length); - os_free_mem(NonAssocStaReportCap); - } break; - case OID_NON_ASSOCIATED_STA_REPORT: { - RTMPIoctlQueryNaSTAReport(pAd, wrq); - } break; -#endif - case OID_QUERY_FEATURE_SUP_LIST: - Status = copy_to_user(wrq->u.data.pointer, &pAd->wifi_cap_list, - wrq->u.data.length); - break; -#ifdef CONFIG_MAP_SUPPORT - case OID_GET_WSC_PROFILES: { - int TotalLen = 0; - wsc_apcli_config_msg *wsc_config = NULL; - - ifIndex = pObj->ioctl_if; - TotalLen = Fill_OID_WSC_PROFILE(pAd, ifIndex, &wsc_config); - if (!wsc_config) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wsc_config is NULL return FALSE\n")); - return FALSE; - } - wrq->u.data.length = TotalLen; - Status = copy_to_user(wrq->u.data.pointer, wsc_config, - wrq->u.data.length); - if (wsc_config) - os_free_mem((PUCHAR)wsc_config); - break; - } -#ifdef DPP_SUPPORT - case OID_802_11_GET_DPP_FRAME: { - if (pAd->bDppEnable) { - UINT32 frm_id; -#ifdef APCLI_SUPPORT - /*No need to assign in case of AP, done in initialization of function*/ - if (pObj->ioctl_if_type == INT_APCLI) - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; -#endif /* APCLI_SUPPORT */ - Status = - copy_from_user(&frm_id, wrq->u.data.pointer, 4); - if (wext_send_dpp_cached_frame(wdev, frm_id, wrq) == - false) { - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s, Unsuccessful send to Wapp\n", - __func__)); - wrq->u.data.length = 0; - break; - } - } else - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, DPP Disabled pleae enable in driver\n", - __func__)); - break; - } -#endif /* DPP_SUPPORT */ -#ifdef MAP_R2 -#ifdef MT_DFS_SUPPORT - case OID_GET_CAC_CAP: { - struct DOT11_H *pDot11h = NULL; - UCHAR bandIdx; - - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; - - NdisZeroMemory(&wdev->cac_capability, - sizeof(wdev->cac_capability)); - wapp_get_cac_cap(pAd, wdev, &wdev->cac_capability); - NdisMoveMemory(&wdev->cac_capability.country_code[0], - pAd->CommonCfg.CountryCode, 2); - wdev->cac_capability.rdd_region = pAd->CommonCfg.RDDurRegion; - - /* CAC Ongoing Update */ - bandIdx = HcGetBandByWdev(wdev); - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) - return FALSE; - - wdev->cac_capability.active_cac = FALSE; - if (pDot11h->RDMode == RD_SILENCE_MODE) { - wdev->cac_capability.active_cac = TRUE; - if (pDfsParam->Bw == BW_80 || pDfsParam->Bw == BW_160) - wdev->cac_capability.ch_num = DfsPrimToCent( - pDfsParam->PrimCh, pDfsParam->Bw); - else - wdev->cac_capability.ch_num = pDfsParam->PrimCh; - if (pDot11h->ChMovingTime > pDot11h->RDCount) - wdev->cac_capability.remain_time = - (pDot11h->ChMovingTime - - pDot11h->RDCount); - else - wdev->cac_capability.remain_time = 0; - } - - wrq->u.data.length = sizeof(wdev->cac_capability); - Status = - copy_to_user(wrq->u.data.pointer, &wdev->cac_capability, - wrq->u.data.length); - break; - } -#endif -#endif - case OID_GET_MISC_CAP: { - wdev_misc_cap misc_cap; - - NdisZeroMemory(&misc_cap, sizeof(wdev_misc_cap)); - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - - misc_cap.max_num_of_cli = 64; - misc_cap.max_num_of_bss = HW_BEACON_MAX_NUM; - misc_cap.num_of_bss = pAd->ApCfg.BssidNum; - misc_cap.max_num_of_block_cli = BLOCK_LIST_NUM; - wrq->u.data.length = sizeof(wdev_misc_cap); - Status = copy_to_user(wrq->u.data.pointer, &misc_cap, - wrq->u.data.length); - break; - } - case OID_GET_HT_CAP: { - wdev_ht_cap ht_cap; - - NdisZeroMemory(&ht_cap, sizeof(wdev_ht_cap)); - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - - ht_cap.tx_stream = wlan_config_get_tx_stream(wdev); - ht_cap.rx_stream = wlan_config_get_rx_stream(wdev); - ht_cap.sgi_20 = (wlan_config_get_ht_gi(wdev) == GI_400) ? 1 : 0; - ht_cap.sgi_40 = (wlan_config_get_ht_gi(wdev) == GI_400) ? 1 : 0; - - ht_cap.ht_40 = (wlan_operate_get_ht_bw(wdev) == BW_40) ? 1 : 0; - - wrq->u.data.length = sizeof(wdev_ht_cap); - Status = copy_to_user(wrq->u.data.pointer, &ht_cap, - wrq->u.data.length); - break; - } - case OID_GET_VHT_CAP: { - wdev_vht_cap vht_cap; - VHT_CAP_INFO drv_vht_cap; - VHT_OP_IE drv_vht_op; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - NdisZeroMemory(&vht_cap, sizeof(wdev_vht_cap)); - NdisZeroMemory(&drv_vht_cap, sizeof(VHT_CAP_INFO)); - NdisZeroMemory(&drv_vht_op, sizeof(VHT_OP_IE)); - NdisCopyMemory(&drv_vht_cap, &pAd->CommonCfg.vht_cap_ie.vht_cap, - sizeof(VHT_CAP_INFO)); - if (wdev->wdev_type != WDEV_TYPE_AP) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():wdev is not an AP\n", __func__)); - break; - } - - mt_WrapSetVHTETxBFCap(pAd, wdev, &drv_vht_cap); - /* Haipin Debug Print (Y)*/ - /* printk("\033[1;33m wdev_list[%d] type = %u\033[0m\n", i, wdev->wdev_type);*/ - - drv_vht_op.basic_mcs_set.mcs_ss1 = VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss2 = VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss3 = VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss4 = VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss5 = VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss6 = VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss7 = VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss8 = VHT_MCS_CAP_NA; - - switch (wlan_operate_get_rx_stream(wdev)) { - case 4: - drv_vht_op.basic_mcs_set.mcs_ss4 = cap->max_vht_mcs; - /* FALLTHRU */ - case 3: - drv_vht_op.basic_mcs_set.mcs_ss3 = cap->max_vht_mcs; - /* FALLTHRU */ - case 2: - drv_vht_op.basic_mcs_set.mcs_ss2 = cap->max_vht_mcs; - /* FALLTHRU */ - case 1: - drv_vht_op.basic_mcs_set.mcs_ss1 = cap->max_vht_mcs; - break; - } - - NdisMoveMemory(vht_cap.sup_tx_mcs, &drv_vht_op.basic_mcs_set, - sizeof(vht_cap.sup_tx_mcs)); - NdisMoveMemory(vht_cap.sup_rx_mcs, &drv_vht_op.basic_mcs_set, - sizeof(vht_cap.sup_rx_mcs)); - vht_cap.tx_stream = wlan_config_get_tx_stream(wdev); - vht_cap.rx_stream = wlan_config_get_tx_stream(wdev); - vht_cap.sgi_80 = - (wlan_config_get_ht_gi(wdev) == GI_400) ? 1 : 0; - - vht_cap.sgi_160 = - (wlan_config_get_ht_gi(wdev) == GI_400) ? 1 : 0; - vht_cap.vht_160 = - (wlan_operate_get_vht_bw(wdev) == BW_160) ? 1 : 0; - vht_cap.vht_8080 = - (wlan_operate_get_vht_bw(wdev) == BW_8080) ? 1 : 0; - - vht_cap.su_bf = (drv_vht_cap.bfer_cap_su) ? 1 : 0; - - vht_cap.mu_bf = (drv_vht_cap.bfer_cap_mu) ? 1 : 0; - - wrq->u.data.length = sizeof(wdev_vht_cap); - Status = copy_to_user(wrq->u.data.pointer, &vht_cap, - wrq->u.data.length); - break; - } - case OID_GET_CHAN_LIST: { - int i = 0; - UCHAR BandIdx = 0; - INT32 ifIndex = pObj->ioctl_if; - CHANNEL_CTRL *pChCtrl = NULL; - struct wifi_dev *wdev; - wdev_chn_info chn_list; - - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - if (wdev->wdev_type != WDEV_TYPE_AP) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():wdev is not an AP\n", __func__)); - break; - } - BandIdx = HcGetBandByWdev(wdev); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%d][%s] : (sync) Msg received !! \n", __LINE__, - __func__)); - pAd->ChannelListNum = pChCtrl->ChListNum; - for (i = 0; i < pChCtrl->ChListNum; i++) { - pAd->ChannelList[i].Channel = - pChCtrl->ChList[i].Channel; - pAd->ChannelList[i].DfsReq = pChCtrl->ChList[i].DfsReq; - } - NdisZeroMemory(&chn_list, sizeof(wdev_chn_info)); - chn_list.band = wdev->PhyMode; - chn_list.op_ch = wlan_operate_get_prim_ch(wdev); - chn_list.op_class = get_regulatory_class(pAd, wdev->channel, - wdev->PhyMode, wdev); - chn_list.ch_list_num = pAd->ChannelListNum; - chn_list.dl_mcs = wdev->HTPhyMode.field.MCS; - setChannelList(pAd, wdev, &chn_list); -#ifdef CONFIG_MAP_SUPPORT /* TODO: move to MAP */ - chn_list.non_op_chn_num = - getNonOpChnNum(pAd, wdev, chn_list.op_class); - setNonOpChnList(pAd, wdev, chn_list.non_op_ch_list, - chn_list.non_op_chn_num, chn_list.op_class); -#endif /* CONFIG_MAP_SUPPORT */ - wrq->u.data.length = sizeof(wdev_chn_info); - Status = copy_to_user(wrq->u.data.pointer, &chn_list, - wrq->u.data.length); - - break; - } - case OID_GET_OP_CLASS: { - wdev_op_class_info op_class; - - NdisZeroMemory(&op_class, sizeof(wdev_op_class_info)); - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - - if (wdev->wdev_type != WDEV_TYPE_AP) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():wdev is not an AP\n", __func__)); - break; - } - -#ifdef CONFIG_MAP_SUPPORT - op_class.num_of_op_class = - map_set_op_class_info(pAd, wdev, &op_class); -#endif /* CONFIG_MAP_SUPPORT */ - wrq->u.data.length = sizeof(wdev_op_class_info); - Status = copy_to_user(wrq->u.data.pointer, &op_class, - wrq->u.data.length); - break; - } - case OID_GET_BSS_INFO: { - wdev_bss_info bss_info; - - NdisZeroMemory(&bss_info, sizeof(wdev_bss_info)); - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - - if (wdev->wdev_type != WDEV_TYPE_AP) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():wdev is not an AP\n", __func__)); - break; - } - bss_info.SsidLen = pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen; - NdisMoveMemory(bss_info.ssid, - pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid, - (MAX_LEN_OF_SSID + 1)); - NdisMoveMemory(bss_info.bssid, wdev->bssid, MAC_ADDR_LEN); - NdisMoveMemory(bss_info.if_addr, wdev->if_addr, MAC_ADDR_LEN); -#ifdef CONFIG_MAP_SUPPORT - bss_info.map_role = wdev->MAPCfg.DevOwnRole; - bss_info.auth_mode = - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.SecConfig.AKMMap; - bss_info.enc_type = pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PairwiseCipher; -#ifdef WSC_AP_SUPPORT - bss_info.key_len = strlen(pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.WscControl.WpaPsk); - NdisMoveMemory( - bss_info.key, - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl.WpaPsk, - bss_info.key_len); -#else - bss_info.key_len = - strlen(pAd->ApCfg.MBSSID[pObj->ioctl_if].PSK); - NdisMoveMemory(bss_info->key, - pAd->ApCfg.MBSSID[pObj->ioctl_if].PSK, - bss_info.key_len); -#endif - bss_info.hidden_ssid = - pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid; -#endif - wrq->u.data.length = sizeof(wdev_bss_info); - Status = copy_to_user(wrq->u.data.pointer, &bss_info, - wrq->u.data.length); - - break; - } - case OID_GET_AP_METRICS: { - wdev_ap_metric ap_metric; - BSS_STRUCT *mbss; - - NdisZeroMemory(&ap_metric, sizeof(wdev_ap_metric)); - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - ifIndex = pObj->ioctl_if; - - if (wdev->wdev_type != WDEV_TYPE_AP) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():wdev is not an AP\n", __func__)); - break; - } - - mbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - NdisMoveMemory(ap_metric.bssid, wdev->bssid, MAC_ADDR_LEN); - - ap_metric.cu = get_channel_utilization(pAd, ifIndex); - NdisCopyMemory(ap_metric.ESPI_AC[0], mbss->ESPI_AC_BE, - sizeof(mbss->ESPI_AC_BE)); - NdisCopyMemory(ap_metric.ESPI_AC[1], mbss->ESPI_AC_BK, - sizeof(mbss->ESPI_AC_BK)); - NdisCopyMemory(ap_metric.ESPI_AC[2], mbss->ESPI_AC_VO, - sizeof(mbss->ESPI_AC_VO)); - NdisCopyMemory(ap_metric.ESPI_AC[3], mbss->ESPI_AC_VI, - sizeof(mbss->ESPI_AC_VI)); - wrq->u.data.length = sizeof(wdev_ap_metric); - Status = copy_to_user(wrq->u.data.pointer, &ap_metric, - wrq->u.data.length); - - break; - } - case OID_GET_NOP_CHANNEL_LIST: { - struct nop_channel_list_s nop_channels; - - NdisZeroMemory(&nop_channels, sizeof(nop_channels)); - wapp_prepare_nop_channel_list(pAd, &nop_channels); - Status = copy_to_user(wrq->u.data.pointer, &nop_channels, - wrq->u.data.length); - break; - } - case OID_GET_WMODE: { - UCHAR wmode; - - if (wdev) { - wmode = wdev->PhyMode; - wmode = wmode_2_cfgmode(wmode); - wrq->u.data.length = sizeof(wmode); - Status = copy_to_user(wrq->u.data.pointer, &wmode, - wrq->u.data.length); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OID_GET_WMODE, intf %s wmode=%d\n", - wdev->if_dev->name, wmode)); - } - break; - } - case OID_GET_ASSOC_REQ_FRAME: { - os_alloc_mem(NULL, &pStaMacAddr, MAC_ADDR_LEN); - - if (pStaMacAddr) { - Status = copy_from_user( - pStaMacAddr, wrq->u.data.pointer, MAC_ADDR_LEN); - - if (Status == NDIS_STATUS_SUCCESS) { - PMAC_TABLE_ENTRY pEntry = NULL; - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("GET::(ASSOC REQ STA - %02X:%02X:%02X:%02X:%02X:%02X)\n", - pStaMacAddr[0], pStaMacAddr[1], - pStaMacAddr[2], pStaMacAddr[3], - pStaMacAddr[4], pStaMacAddr[5])); - pEntry = MacTableLookup(pAd, pStaMacAddr); - - if (pEntry) { - Status = copy_to_user( - wrq->u.data.pointer, - pEntry->assoc_req_frame, - wrq->u.data.length); - } else - wrq->u.data.length = 0; - } - - os_free_mem(pStaMacAddr); - } - break; - } -#endif - default: - Status = -EOPNOTSUPP; - - if (Status == -EOPNOTSUPP) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::unknown IOCTL's subcmd = 0x%08x, apidx=%d\n", - cmd, apidx)); - } - - break; - } - - return Status; -} - -/* - ========================================================================== - Description: - Set Country Code. - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_CountryCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef RF_LOCKDOWN - - /* Check RF lock Status */ - if (chip_check_rf_lock_down(pAd)) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: RF lock down!! Cannot config CountryCode status!!\n", - __func__)); - return TRUE; - } - -#endif /* RF_LOCKDOWN */ -#ifdef EXT_BUILD_CHANNEL_LIST - /* reset temp table status */ - pAd->CommonCfg.pChDesp = NULL; - pAd->CommonCfg.DfsType = MAX_RD_REGION; -#endif /* EXT_BUILD_CHANNEL_LIST */ - - if (strlen(arg) == 2) { - NdisMoveMemory(pAd->CommonCfg.CountryCode, arg, 2); - pAd->CommonCfg.bCountryFlag = TRUE; - } else { - NdisZeroMemory(pAd->CommonCfg.CountryCode, - sizeof(pAd->CommonCfg.CountryCode)); - pAd->CommonCfg.bCountryFlag = FALSE; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_CountryCode_Proc::(bCountryFlag=%d, CountryCode=%s)\n", - pAd->CommonCfg.bCountryFlag, pAd->CommonCfg.CountryCode)); - return TRUE; -} - -#ifdef EXT_BUILD_CHANNEL_LIST -INT Set_ChGeography_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - ULONG Geography; - - Geography = os_str_tol(arg, 0, 10); - - if (Geography <= BOTH) - pAd->CommonCfg.Geography = Geography; - else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_ChannelGeography_Proc::(wrong setting. 0: Out-door, 1: in-door, 2: both)\n")); - - pAd->CommonCfg.CountryCode[2] = - (pAd->CommonCfg.Geography == BOTH) ? - ' ' : - ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O'); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_ChannelGeography_Proc:: Geography = %s\n", - pAd->CommonCfg.Geography == ODOR ? - "out-door" : - (pAd->CommonCfg.Geography == IDOR ? "in-door" : - "both"))); - /* After Set ChGeography need invoke SSID change procedural again for Beacon update. */ - /* it's no longer necessary since APStartUp will rebuild channel again. */ - /*BuildChannelListEx(pAd); */ - return TRUE; -} -#endif /* EXT_BUILD_CHANNEL_LIST */ - -/* - ========================================================================== - Description: - Set Country String. - This command will not work, if the field of CountryRegion in eeprom is programmed. - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_CountryString_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT index = 0; - INT success = TRUE; - RTMP_STRING name_buffer[40] = { 0 }; - BOOLEAN IsSupport5G = HcIsRfSupport(pAd, RFIC_5GHZ); - BOOLEAN IsSupport2G = HcIsRfSupport(pAd, RFIC_24GHZ); -#ifdef EXT_BUILD_CHANNEL_LIST - return -EOPNOTSUPP; -#endif /* EXT_BUILD_CHANNEL_LIST */ - - if (strlen(arg) <= 38) { - if (strlen(arg) < 4) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_CountryString_Proc::Parameter of CountryString are too short !\n")); - return FALSE; - } - - for (index = 0; index < strlen(arg); index++) { - if ((arg[index] >= 'a') && (arg[index] <= 'z')) - arg[index] = toupper(arg[index]); - } - - for (index = 0; index < NUM_OF_COUNTRIES; index++) { - NdisZeroMemory(name_buffer, 40); - snprintf(name_buffer, sizeof(name_buffer), "\"%s\"", - (RTMP_STRING *)allCountry[index].pCountryName); - - if (strncmp((RTMP_STRING *)allCountry[index] - .pCountryName, - arg, strlen(arg)) == 0) - break; - else if (strncmp(name_buffer, arg, strlen(arg)) == 0) - break; - } - - if (index == NUM_OF_COUNTRIES) - success = FALSE; - } else - success = FALSE; - - if (success == TRUE) { - if (pAd->CommonCfg.CountryRegion & 0x80) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_CountryString_Proc::parameter of CountryRegion in eeprom is programmed\n")); - success = FALSE; - } else { - success = FALSE; - - if (IsSupport2G) { - if (allCountry[index].SupportGBand == TRUE) { - pAd->CommonCfg.CountryRegion = - (UCHAR)allCountry[index] - .RegDomainNum11G; - success = TRUE; - } else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("The Country are not Support G Band Channel\n")); - } - - if (IsSupport5G) { - if (allCountry[index].SupportABand == TRUE) { - pAd->CommonCfg.CountryRegionForABand = - (UCHAR)allCountry[index] - .RegDomainNum11A; - success = TRUE; - } else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("The Country are not Support A Band Channel\n")); - } - } - } - - if (success == TRUE) { - os_zero_mem(pAd->CommonCfg.CountryCode, - sizeof(pAd->CommonCfg.CountryCode)); - os_move_mem(pAd->CommonCfg.CountryCode, - allCountry[index].IsoName, 2); - pAd->CommonCfg.CountryCode[2] = ' '; - /* After Set ChGeography need invoke SSID change procedural again for Beacon update. */ - /* it's no longer necessary since APStartUp will rebuild channel again. */ - /*BuildChannelList(pAd); */ - pAd->CommonCfg.bCountryFlag = TRUE; - /* if set country string, driver needs to be reset */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_CountryString_Proc::(CountryString=%s CountryRegin=%d CountryCode=%s)\n", - allCountry[index].pCountryName, - pAd->CommonCfg.CountryRegion, - pAd->CommonCfg.CountryCode)); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_CountryString_Proc::Parameters out of range\n")); - - return success; -} - -#ifdef TXSTAT_2040BW_24G_SUPPORT -INT Set_40Bw_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT status = 0; - UCHAR value; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - if ((wdev->channel > 14) || (WMODE_CAP_5G(wdev->PhyMode))) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, - ("Incorrect Config\n")); - return status; - } - - value = os_str_tol(arg, 0, 10); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): arg=%d\n", __func__, value)); - - status = MtCmdSetBWStatFeature(pAd, value); - if (status) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, - ("Set Cmd Failed : %d\n", status)); - return status; - } - - if (value == SET_2040_FEATURE_ENABLE) { - status = MtCmdGetBWStatFeature(pAd, value); - if (status) - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_DFS, DBG_LVL_OFF, - ("Get Cmd Failed : %d\n", status)); - } else { - SET_STAREC_BW_STATS_SUPPORT(SET_2040_FEATURE_DISABLE); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 20/40 Enable=%d\n", IF_STAREC_BW_STATS_SUPPORT())); - } - - return TRUE; -} -#endif - -/* - ========================================================================== - Description: - Set SSID - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_SSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT success = FALSE, i; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - BSS_STRUCT *pMbss = NULL; - struct DOT11_H *pDot11h = NULL; - - if (((pObj->ioctl_if < HW_BEACON_MAX_NUM)) && - (strlen(arg) <= MAX_LEN_OF_SSID)) { - struct wifi_dev *wdev = NULL; - - pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - wdev = &pMbss->wdev; - if (wdev == NULL) - return FALSE; - - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) - return FALSE; - - if (!SSID_EQUAL(arg, strlen(arg), pMbss->Ssid, - strlen(pMbss->Ssid))) { - for (i = 0; i < MAX_PMKID_COUNT; i++) { - if ((pAd->ApCfg.PMKIDCache.BSSIDInfo[i].Valid == - TRUE) && - (pAd->ApCfg.PMKIDCache.BSSIDInfo[i] - .Mbssidx == pMbss->mbss_idx)) { - pAd->ApCfg.PMKIDCache.BSSIDInfo[i] - .Valid = FALSE; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s():Modify SSID and clear PMKID (idx %d)from (mbssidx %d)\n", - __func__, i, pMbss->mbss_idx)); - } - } - } - NdisZeroMemory(pMbss->Ssid, MAX_LEN_OF_SSID); - NdisMoveMemory(pMbss->Ssid, arg, strlen(arg)); - pMbss->SsidLen = (UCHAR)strlen(arg); - success = TRUE; - -#ifdef OCE_SUPPORT - if (IS_OCE_ENABLE(wdev)) { - OCE_CTRL *oceCtrl = &wdev->OceCtrl; - - if (oceCtrl->ShortSSIDEnabled) - oceCtrl->ShortSSID = Crcbitbybitfast( - pMbss->Ssid, pMbss->SsidLen); - } -#endif /* OCE_SUPPORT */ - - { - ApSendBroadcastDeauth(pAd, wdev); - if (IS_SECURITY(&wdev->SecConfig)) - pMbss->CapabilityInfo |= 0x0010; - else - pMbss->CapabilityInfo &= ~(0x0010); - APSecInit(pAd, wdev); - restart_ap(&pMbss->wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(ra%d) Set_SSID_Proc::(Len=%d,Ssid=%s)\n", - pObj->ioctl_if, pMbss->SsidLen, pMbss->Ssid)); - } - } else - success = FALSE; - - return success; -} - -/* - ========================================================================== - Description: - Set TxRate - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_TxRate_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - NdisZeroMemory(pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRates, - MAX_LEN_OF_SUPPORTED_RATES); - pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRatesIndex = - os_str_tol(arg, 0, 10); - /* todo RTMPBuildDesireRate(pAd, pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRatesIndex); */ - /*todo MlmeUpdateTxRates(pAd); */ - return TRUE; -} - -/* - ========================================================================== - Description: - Set BasicRate - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_BasicRate_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - ULONG BasicRateBitmap; - - BasicRateBitmap = (ULONG)os_str_tol(arg, 0, 10); - - if (BasicRateBitmap > 4095) /* (2 ^ MAX_LEN_OF_SUPPORTED_RATES) -1 */ - return FALSE; - - pAd->CommonCfg.BasicRateBitmap = BasicRateBitmap; - pAd->CommonCfg.BasicRateBitmapOld = BasicRateBitmap; - MlmeUpdateTxRates(pAd, FALSE, (UCHAR)pObj->ioctl_if); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_BasicRate_Proc::(BasicRateBitmap=0x%08lx)\n", - pAd->CommonCfg.BasicRateBitmap)); - return TRUE; -} - -/* - ========================================================================== - Description: - Set Beacon Period - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_BeaconPeriod_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - USHORT BeaconPeriod; - INT success = FALSE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = NULL; - - /* only do this for AP MBSS, ignore other inf type */ - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) { - UINT8 IfIdx = pObj->ioctl_if; - - wdev = &pAd->ApCfg.MBSSID[IfIdx].wdev; - } else - return FALSE; - - BeaconPeriod = (USHORT)os_str_tol(arg, 0, 10); - - if ((BeaconPeriod >= 20) && (BeaconPeriod < 1024)) { - pAd->CommonCfg.BeaconPeriod = BeaconPeriod; - success = TRUE; -#ifdef AP_QLOAD_SUPPORT - /* re-calculate QloadBusyTimeThreshold */ - QBSS_LoadAlarmReset(pAd); -#endif /* AP_QLOAD_SUPPORT */ - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_AP_RENEW); - - wdev->bss_info_argument.bcn_period = - pAd->CommonCfg.BeaconPeriod; - wdev->bss_info_argument.u4BssInfoFeature = - BSS_INFO_BASIC_FEATURE; - if (AsicBssInfoUpdate(pAd, wdev->bss_info_argument) != - NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Fail to apply the bssinfo\n")); - } else - success = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_BeaconPeriod_Proc::(BeaconPeriod=%d)\n", - pAd->CommonCfg.BeaconPeriod)); - return success; -} - -/* - ========================================================================== - Description: - Set Dtim Period - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_DtimPeriod_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - USHORT DtimPeriod; - INT success = FALSE; - - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = NULL; - - /* only do this for AP MBSS, ignore other inf type */ - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) { - UINT8 IfIdx = pObj->ioctl_if; - - wdev = &pAd->ApCfg.MBSSID[IfIdx].wdev; - } else - return FALSE; - - DtimPeriod = (USHORT)os_str_tol(arg, 0, 10); - - if ((DtimPeriod >= 1) && (DtimPeriod <= 255)) { -#ifdef MBSS_DTIM_SUPPORT - - pAd->ApCfg.MBSSID[pObj->ioctl_if].DtimPeriod = DtimPeriod; -#else - pAd->ApCfg.DtimPeriod = DtimPeriod; -#endif - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_AP_RENEW); - - wdev->bss_info_argument.dtim_period = DtimPeriod; - wdev->bss_info_argument.u4BssInfoFeature = - BSS_INFO_BASIC_FEATURE; - if (AsicBssInfoUpdate(pAd, wdev->bss_info_argument) != - NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Fail to apply the bssinfo\n")); - - success = TRUE; - } else - success = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_DtimPeriod_Proc::(DtimPeriod=%d)\n", - pAd->ApCfg.DtimPeriod)); - return success; -} - -/* - ========================================================================== - Description: - Disable/enable OLBC detection manually - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_OLBCDetection_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - switch (os_str_tol(arg, 0, 10)) { - case 0: /*enable OLBC detect */ - pAd->CommonCfg.DisableOLBCDetect = 0; - break; - - case 1: /*disable OLBC detect */ - pAd->CommonCfg.DisableOLBCDetect = 1; - break; - - default: /*Invalid argument */ - return FALSE; - } - - return TRUE; -} - -/* -* -*/ -INT set_qiscdump_proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - PNET_DEV ndev = NULL; - - if (wdev == NULL) - return FALSE; - - ndev = wdev->if_dev; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): wdev=%p, idx=%d, dev=%p, %s\n", __func__, wdev, - wdev->wdev_idx, ndev, ndev->name)); - -#ifdef CONFIG_DBG_QDISC - if (wdev && wdev->func_dev) - os_system_tx_queue_dump(ndev); -#endif - return TRUE; -} - -/* - ========================================================================== - Description: - Set WmmCapable Enable or Disable - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_WmmCapable_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - BOOLEAN bWmmCapable; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - - bWmmCapable = os_str_tol(arg, 0, 10); - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - - if (bWmmCapable == 1) - wdev->bWmmCapable = TRUE; - else if (bWmmCapable == 0) - wdev->bWmmCapable = FALSE; - else - return FALSE; /*Invalid argument */ - - pAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapableOrg = - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.bWmmCapable; -#ifdef RTL865X_FAST_PATH - - if (!isFastPathCapable(pAd)) { - rtlairgo_fast_tx_unregister(); - rtl865x_extDev_unregisterUcastTxDev(pAd->net_dev); - } - -#endif -#ifdef DOT11_N_SUPPORT - /*Sync with the HT relate info. In N mode, we should re-enable it */ - SetCommonHtVht(pAd, wdev); -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WmmCapable_Proc::(bWmmCapable=%d)\n", - pObj->ioctl_if, wdev->bWmmCapable)); - return TRUE; -} - -INT Set_AP_PerMbssMaxStaNum_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - INT apidx = pObj->ioctl_if; - - return ApCfg_Set_PerMbssMaxStaNum_Proc(pAd, apidx, arg); -} - -/* - ========================================================================== - Description: - Set session idle timeout - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_IdleTimeout_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - return ApCfg_Set_IdleTimeout_Proc(pAd, arg); -} -/* - ========================================================================== - Description: - Set No Forwarding Enable or Disable - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_NoForwarding_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - ULONG NoForwarding; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - NoForwarding = os_str_tol(arg, 0, 10); - - if (NoForwarding == 1) - pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic = TRUE; - else if (NoForwarding == 0) - pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic = - FALSE; - else - return FALSE; /*Invalid argument */ - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_NoForwarding_Proc::(NoForwarding=%ld)\n", - pObj->ioctl_if, - pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic)); - return TRUE; -} - -/* - ========================================================================== - Description: - Set No Forwarding between each SSID - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_NoForwardingBTNSSID_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - ULONG NoForwarding; - - NoForwarding = os_str_tol(arg, 0, 10); - - if (NoForwarding == 1) - pAd->ApCfg.IsolateInterStaTrafficBTNBSSID = TRUE; - else if (NoForwarding == 0) - pAd->ApCfg.IsolateInterStaTrafficBTNBSSID = FALSE; - else - return FALSE; /*Invalid argument */ - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_NoForwardingBTNSSID_Proc::(NoForwarding=%ld)\n", - pAd->ApCfg.IsolateInterStaTrafficBTNBSSID)); - return TRUE; -} - -INT Set_NoForwardingMBCast_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR NoForwardingMBCast; - - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - NoForwardingMBCast = simple_strtol(arg, 0, 10); - - if (NoForwardingMBCast == 1) - pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaMBCast = TRUE; - else if (NoForwardingMBCast == 0) - pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaMBCast = FALSE; - else - return FALSE; //Invalid argument - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_NoForwardingMBCast_Proc::(IsolateInterStaMBCast=%d)\n", - pObj->ioctl_if, - pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaMBCast)); - - return TRUE; -} - -/* - ========================================================================== - Description: - Set Hide SSID Enable or Disable - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_HideSSID_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - BOOLEAN bHideSsid; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - bHideSsid = os_str_tol(arg, 0, 10); - - if (bHideSsid == 1) - bHideSsid = TRUE; - else if (bHideSsid == 0) - bHideSsid = FALSE; - else - return FALSE; /*Invalid argument */ - - if (pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid != bHideSsid) - pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid = bHideSsid; - -#ifdef WSC_V2_SUPPORT - - if (pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.WscControl.WscV2Info.bEnableWpsV2) - WscOnOff(pAd, pObj->ioctl_if, - pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid); - -#endif /* WSC_V2_SUPPORT */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_HideSSID_Proc::(HideSSID=%d)\n", pObj->ioctl_if, - pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid)); - return TRUE; -} - -#ifdef VLAN_SUPPORT -/* - ========================================================================== - Description: - Enable/Disable VLAN function - Return: - TRUE if parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_VLANEn_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT vlan_en; - - vlan_en = os_str_tol(arg, 0, 10); - - if (vlan_en == 1) - pAd->CommonCfg.bEnableVlan = TRUE; - else if (vlan_en == 0) - pAd->CommonCfg.bEnableVlan = FALSE; - else - return FALSE; /*Invalid argument */ - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_VLANEn_Proc::(vlan_en=%d)\n", - pAd->CommonCfg.bEnableVlan)); - return TRUE; -} - -/* - ========================================================================== - Description: - Set VLAN's ID field - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_VLANID_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - INT ifIndex, if_type; - UINT16 vid; - UINT32 addr, vlantag; - - vid = os_str_tol(arg, 0, 10); - if (vid > MAX_VID) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Invalid VID value\n")); - return FALSE; - } - - ifIndex = pObj->ioctl_if; - if_type = pObj->ioctl_if_type; - - if (if_type == INT_MAIN || if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else if (if_type == INT_APCLI) - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Unexpected if_type\n")); - return FALSE; - } - - if (!wdev) - return FALSE; - - wdev->VLAN_VID = vid; - - addr = DMA_VTR_GET_ADDR(wdev->OmacIdx); - MAC_IO_READ32(pAd, addr, &vlantag); - vlantag = DMA_VTR_SET_VID(wdev->OmacIdx, vlantag, vid); - MAC_IO_WRITE32(pAd, addr, vlantag); - - return TRUE; -} - -/* - ========================================================================== - Description: - Set VLAN's priority field - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_VLANPriority_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - INT ifIndex, if_type; - USHORT priority; - UINT32 addr, vlantag; - - priority = os_str_tol(arg, 0, 10); - if (priority > MAX_PCP) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Invalid PCP value\n")); - return FALSE; - } - - ifIndex = pObj->ioctl_if; - if_type = pObj->ioctl_if_type; - - if (if_type == INT_MAIN || if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else if (if_type == INT_APCLI) - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Unexpected if_type\n")); - return FALSE; - } - - if (!wdev) - return FALSE; - - wdev->VLAN_Priority = priority; - - addr = DMA_VTR_GET_ADDR(wdev->OmacIdx); - MAC_IO_READ32(pAd, addr, &vlantag); - vlantag = DMA_VTR_SET_PCP(wdev->OmacIdx, vlantag, priority); - MAC_IO_WRITE32(pAd, addr, vlantag); - - return TRUE; -} - -/* - ========================================================================== - Description: - Set enable or disable carry VLAN in the air - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_VLAN_TAG_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - INT ifIndex, if_type; - BOOLEAN bVLAN_Tag; - CHAR BssIdx, WlanIdx; - PMAC_TABLE_ENTRY pEntry; - STA_REC_CFG_T StaCfg; - PAPCLI_STRUCT pApCliEntry; - - bVLAN_Tag = (os_str_tol(arg, 0, 10)) ? TRUE : FALSE; - - ifIndex = pObj->ioctl_if; - if_type = pObj->ioctl_if_type; - - if (if_type == INT_MAIN || if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else if (if_type == INT_APCLI) - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Unexpected if_type\n")); - return FALSE; - } - - if (!wdev) - return FALSE; - - wdev->bVLAN_Tag = bVLAN_Tag; - - if (if_type == INT_MAIN || if_type == INT_MBSSID) { - /* Update BC's StaRec of CR4 */ - os_zero_mem(&StaCfg, sizeof(STA_REC_CFG_T)); - pEntry = &pAd->MacTab.Content[wdev->tr_tb_idx]; - StaCfg.MuarIdx = 0xe; - StaCfg.ConnectionState = STATE_PORT_SECURE; - StaCfg.ConnectionType = CONNECTION_INFRA_BC; - StaCfg.u4EnableFeature = (1 << STA_REC_TX_PROC); - StaCfg.ucBssIndex = wdev->bss_info_argument.ucBssIndex; - StaCfg.ucWlanIdx = wdev->tr_tb_idx; - StaCfg.pEntry = pEntry; - - if (CmdExtStaRecUpdate(pAd, StaCfg) != STATUS_TRUE) { - return FALSE; - } - } else if (if_type == INT_APCLI) { - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - WlanIdx = pApCliEntry->MacTabWCID; - BssIdx = wdev->BssIdx; - pEntry = &pAd->MacTab.Content[WlanIdx]; - - os_zero_mem(&StaCfg, sizeof(STA_REC_CFG_T)); - StaCfg.MuarIdx = wdev->OmacIdx; - StaCfg.ConnectionState = pAd->ApCfg.ApCliTab[ifIndex].Valid; - StaCfg.ConnectionType = pEntry->ConnectionType; - StaCfg.u4EnableFeature = (1 << STA_REC_TX_PROC); - StaCfg.ucBssIndex = BssIdx; - StaCfg.ucWlanIdx = WlanIdx; - StaCfg.pEntry = pEntry; - - if (CmdExtStaRecUpdate(pAd, StaCfg) != STATUS_TRUE) - return FALSE; - } - - return TRUE; -} - -/* - ========================================================================== - Description: - Set the VLAN Checking Policy - For the detail, please refer to VLAN_TX_Policy &VLAN_RX_Policy - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_VLAN_Policy_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - INT ifIndex, if_type, if_idx; - char *direction, *policy; - USHORT vlan_policy; - BOOLEAN dir; - - ifIndex = pObj->ioctl_if; - if_type = pObj->ioctl_if_type; - - if (if_type == INT_MAIN || if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else if (if_type == INT_APCLI) - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Unexpected if_type\n")); - return FALSE; - } - - direction = strsep(&arg, ":"); - policy = strsep(&arg, ":"); - - if (!wdev || !direction || !policy) - return FALSE; - - dir = (os_str_tol(direction, 0, 10) == TX_VLAN) ? TX_VLAN : RX_VLAN; - vlan_policy = os_str_tol(policy, 0, 10); - - if ((dir > RX_VLAN) || - (dir == TX_VLAN && vlan_policy >= VLAN_TX_POLICY_NUM) || - (dir == RX_VLAN && vlan_policy >= VLAN_RX_POLICY_NUM)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Invalid argument\n")); - return FALSE; - } - - wdev->VLAN_Policy[dir] = vlan_policy; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Set the VLAN checking policy : %d\n", - wdev->VLAN_Policy[dir])); - - /*Update RX policy to DCR0 (DMA)*/ - if (dir == RX_VLAN) { - switch (vlan_policy) { - case VLAN_RX_UNTAG: - /*InSVlan = 0, RmVlan = 1, SwPcP = 0*/ - AsicRxHeaderTransCtl(pAd, TRUE, FALSE, FALSE, TRUE, - FALSE); - break; - case VLAN_RX_REPLACE_ALL: - /*InSVlan = 1, RmVlan = 0, SwPcP = 1*/ - AsicRxHeaderTransCtl(pAd, TRUE, FALSE, TRUE, FALSE, - TRUE); - break; - case VLAN_RX_REPLACE_VID: - /*InSVlan = 1, RmVlan = 0, SwPcP = 0*/ - AsicRxHeaderTransCtl(pAd, TRUE, FALSE, TRUE, FALSE, - FALSE); - break; - case VLAN_RX_DROP: - case VLAN_RX_ALLOW: - default: - AsicRxHeaderTransCtl(pAd, TRUE, FALSE, FALSE, FALSE, - FALSE); - break; - } - - /* For now, VLAN Rx Policy is HW-supported, so we have to sync the setting to all of the wdev on the pAd */ - for (if_idx = 0; if_idx < HW_BEACON_MAX_NUM; if_idx++) { - pAd->ApCfg.MBSSID[if_idx].wdev.VLAN_Policy[RX_VLAN] = - vlan_policy; - } - - for (if_idx = 0; if_idx < MAX_APCLI_NUM; if_idx++) { - pAd->ApCfg.ApCliTab[if_idx].wdev.VLAN_Policy[RX_VLAN] = - vlan_policy; - } - } - return TRUE; -} - -/* - ========================================================================== - Description: - Show VLAN-related field - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Show_VLAN_Info_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - INT ifIndex, if_type; - - ifIndex = pObj->ioctl_if; - if_type = pObj->ioctl_if_type; - - if (if_type == INT_MAIN || if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else if (if_type == INT_APCLI) - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Unexpected if_type\n")); - return FALSE; - } - - if (!wdev) - return FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("VLANEn=%d\n", pAd->CommonCfg.bEnableVlan)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("bVLAN_Tag=%d\n", wdev->bVLAN_Tag)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("VLANID=%d\n", wdev->VLAN_VID)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("VLANPriority=%d\n", wdev->VLAN_Priority)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("VLANPolicy(Tx)=%d\n", wdev->VLAN_Policy[TX_VLAN])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("VLANPolicy(Rx)=%d\n", wdev->VLAN_Policy[RX_VLAN])); - - return TRUE; -} -#endif /*VLAN_SUPPORT*/ - -INT Set_AP_WpaMixPairCipher_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - /* - In WPA-WPA2 mix mode, it provides a more flexible cipher combination. - - WPA-AES and WPA2-TKIP - - WPA-AES and WPA2-TKIPAES - - WPA-TKIP and WPA2-AES - - WPA-TKIP and WPA2-TKIPAES - - WPA-TKIPAES and WPA2-AES - - WPA-TKIPAES and WPA2-TKIP - - WPA-TKIPAES and WPA2-TKIPAES (default) - */ - Set_SecAuthMode_Proc(pAd, arg); - Set_SecEncrypType_Proc(pAd, arg); - return TRUE; -} - -/* - ========================================================================== - Description: - Set WPA rekey interval value - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_RekeyInterval_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - ULONG value_interval; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - value_interval = os_str_tol(arg, 0, 10); - - if ((value_interval >= 10) && - (value_interval < MAX_GROUP_REKEY_INTERVAL)) - pSecConfig->GroupReKeyInterval = value_interval; - else /*Default*/ - pSecConfig->GroupReKeyInterval = DEFAULT_GROUP_REKEY_INTERVAL; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(%s%d) GroupKey ReKeyInterval=%ld seconds\n", - INF_MBSSID_DEV_NAME, apidx, pSecConfig->GroupReKeyInterval)); - return TRUE; -} - -#ifdef SPECIFIC_TX_POWER_SUPPORT -INT Set_AP_PKT_PWR(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - INT input; - - input = os_str_tol(arg, 0, 10); - - /* - Tx_PWR_ADJ[3:0] From 0 to 7 is Positive & add with Tx Power (dB), - From 8 to 15 is minus with Tx Power mapping to -16 to -2 (step by 2), - Default value: 0. - - [0x13BC]TX_ALC_MONITOR, 13:8 - TX_ALC_REQ_ADJ TX ALC Req Saturated[5:0], unit (0.5dB) - */ - - if ((input >= 0) && (input <= 15)) - pAd->ApCfg.MBSSID[apidx].TxPwrAdj = input; - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AP[%d]->PktPwr: Out of Range\n")); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AP[%d]->PktPwr: %d\n", apidx, - pAd->ApCfg.MBSSID[apidx].TxPwrAdj)); - return TRUE; -} -#endif /* SPECIFIC_TX_POWER_SUPPORT */ -/* - ========================================================================== - Description: - Set WPA rekey method - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_RekeyMethod_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (rtstrcasecmp(arg, "TIME") == TRUE) - pSecConfig->GroupReKeyMethod = SEC_GROUP_REKEY_TIME; - else if (rtstrcasecmp(arg, "PKT") == TRUE) - pSecConfig->GroupReKeyMethod = SEC_GROUP_REKEY_PACKET; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(%s%d) GroupKey ReKeyMethod=%x\n", INF_MBSSID_DEV_NAME, - apidx, pSecConfig->GroupReKeyMethod)); - return TRUE; -} - -/* - ========================================================================== - Description: - Set PMK-cache period - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_PMKCachePeriod_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UINT32 val = os_str_tol(arg, 0, 10); - - pAd->ApCfg.MBSSID[apidx].PMKCachePeriod = val * 60 * OS_HZ; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(ra%d) Set_AP_PMKCachePeriod_Proc=%ld\n", apidx, - pAd->ApCfg.MBSSID[apidx].PMKCachePeriod)); - return TRUE; -} - -/* - ========================================================================== - Description: - Set AssocReq RSSI Threshold to reject STA with weak signal. - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_ASSOC_REQ_RSSI_THRESHOLD(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UINT j; - CHAR rssi; - - rssi = os_str_tol(arg, 0, 10); - - if (rssi == 0) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Disable AP_ASSOC_REQ_RSSI_THRESHOLD\n")); - else if (rssi > 0 || rssi < -100) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_AP_ASSOC_REQ_RSSI_THRESHOLD Value Error.\n")); - return FALSE; - } - - pAd->ApCfg.MBSSID[apidx].AssocReqRssiThreshold = rssi; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(ra%d) Set_AP_ASSOC_REQ_RSSI_THRESHOLD=%d\n", apidx, - pAd->ApCfg.MBSSID[apidx].AssocReqRssiThreshold)); - - for (j = BSS0; j < pAd->ApCfg.BssidNum; j++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%d. ==> %d\n", j, - pAd->ApCfg.MBSSID[j].AssocReqRssiThreshold)); - - return TRUE; -} - -/* - ========================================================================== - Description: - Set lower limit for AP kicking out a STA. - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_KickStaRssiLow_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UINT j; - CHAR rssi; - - rssi = os_str_tol(arg, 0, 10); - - if (rssi == 0) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Disable RssiLowForStaKickOut Function\n")); - else if (rssi > 0 || rssi < -100) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RssiLowForStaKickOut Value Error.\n")); - return FALSE; - } - - pAd->ApCfg.MBSSID[apidx].RssiLowForStaKickOut = rssi; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(ra%d) RssiLowForStaKickOut=%d\n", apidx, - pAd->ApCfg.MBSSID[apidx].RssiLowForStaKickOut)); - - for (j = BSS0; j < pAd->ApCfg.BssidNum; j++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%d. ==> %d\n", j, - pAd->ApCfg.MBSSID[j].RssiLowForStaKickOut)); - - return TRUE; -} - -/* - ========================================================================== - Description: - Set Access ctrol policy - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AccessPolicy_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; -#ifdef ACL_BLK_COUNT_SUPPORT - UINT8 count = 0; - if (os_str_tol(arg, 0, 10) != 2) { - for (count = 0; - count < - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; - count++) - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .AccessControlList.Entry[count] - .Reject_Count = 0; - } -#endif - - switch (os_str_tol(arg, 0, 10)) { - case 0: /*Disable */ - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 0; - break; - - case 1: /* Allow All, and ACL is positive. */ - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 1; - break; - - case 2: /* Reject All, and ACL is negative. */ - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 2; - break; - - default: /*Invalid argument */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_AccessPolicy_Proc::Invalid argument (=%s)\n", - arg)); - return FALSE; - } - - /* check if the change in ACL affects any existent association */ - ApUpdateAccessControlList(pAd, pObj->ioctl_if); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_AccessPolicy_Proc::(AccessPolicy=%ld)\n", - pObj->ioctl_if, - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy)); - return TRUE; -} - -/* Replaced by Set_ACLAddEntry_Proc() and Set_ACLClearAll_Proc() */ - -/* - ========================================================================== - Description: - Add one entry or several entries(if allowed to) - into Access control mac table list - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_ACLAddEntry_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR macAddr[MAC_ADDR_LEN]; - /* RT_802_11_ACL acl; */ - RT_802_11_ACL *pacl = NULL; - RTMP_STRING *this_char; - RTMP_STRING *value; - INT i, j; - BOOLEAN isDuplicate = FALSE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num >= - (MAX_NUM_OF_ACL_LIST - 1)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("The AccessControlList is full, and no more entry can join the list!\n")); - return FALSE; - } - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL)); - - if (pacl == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return FALSE; - } - - NdisZeroMemory(pacl, sizeof(RT_802_11_ACL)); - NdisMoveMemory(pacl, - &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, - sizeof(RT_802_11_ACL)); - - while ((this_char = strsep((char **)&arg, ";")) != NULL) { - if (*this_char == '\0') { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("An unnecessary delimiter entered!\n")); - continue; - } - - if (strlen(this_char) != - 17) { /*Mac address acceptable format 01:02:03:04:05:06 length 17 */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal MAC address length!\n")); - continue; - } - - for (i = 0, value = rstrtok(this_char, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("illegal MAC address format or octet!\n")); - /* Do not use "continue" to replace "break" */ - break; - } - - AtoH(value, &macAddr[i++], 1); - } - - if (i != MAC_ADDR_LEN) - continue; - - /* Check if this entry is duplicate. */ - isDuplicate = FALSE; - - for (j = 0; j < pacl->Num; j++) { - if (memcmp(pacl->Entry[j].Addr, &macAddr, 6) == 0) { - isDuplicate = TRUE; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("You have added an entry before :\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("The duplicate entry is %02x:%02x:%02x:%02x:%02x:%02x\n", - macAddr[0], macAddr[1], macAddr[2], - macAddr[3], macAddr[4], macAddr[5])); - } - } - - if (!isDuplicate) - NdisMoveMemory(pacl->Entry[pacl->Num++].Addr, &macAddr, - MAC_ADDR_LEN); - - if (pacl->Num == MAX_NUM_OF_ACL_LIST) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("The AccessControlList is full, and no more entry can join the list!\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("The last entry of ACL is %02x:%02x:%02x:%02x:%02x:%02x\n", - macAddr[0], macAddr[1], macAddr[2], macAddr[3], - macAddr[4], macAddr[5])); - break; - } - } - - ASSERT(pacl->Num < MAX_NUM_OF_ACL_LIST); - NdisZeroMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, - sizeof(RT_802_11_ACL)); - NdisMoveMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, - pacl, sizeof(RT_802_11_ACL)); - /* check if the change in ACL affects any existent association */ - ApUpdateAccessControlList(pAd, pObj->ioctl_if); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::%s(Policy=%ld, Entry#=%ld)\n", __func__, - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num)); -#ifdef DBG - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=============== Entry ===============\n")); - - for (i = 0; i < pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; - i++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Entry #%02d: ", i + 1)); - - for (j = 0; j < MAC_ADDR_LEN; j++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02X ", pAd->ApCfg.MBSSID[pObj->ioctl_if] - .AccessControlList.Entry[i] - .Addr[j])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - -#endif - - if (pacl != NULL) - os_free_mem(pacl); - - return TRUE; -} - -/* - ========================================================================== - Description: - Delete one entry or several entries(if allowed to) - from Access control mac table list - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_ACLDelEntry_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR macAddr[MAC_ADDR_LEN]; - UCHAR nullAddr[MAC_ADDR_LEN]; - /*RT_802_11_ACL acl; */ - RT_802_11_ACL *pacl = NULL; - RTMP_STRING *this_char; - RTMP_STRING *value; - INT i, j; - BOOLEAN isFound = FALSE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL)); - - if (pacl == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return FALSE; - } - - NdisZeroMemory(pacl, sizeof(RT_802_11_ACL)); - NdisMoveMemory(pacl, - &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, - sizeof(RT_802_11_ACL)); - NdisZeroMemory(nullAddr, MAC_ADDR_LEN); - - while ((this_char = strsep((char **)&arg, ";")) != NULL) { - if (*this_char == '\0') { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("An unnecessary delimiter entered!\n")); - continue; - } - - if (strlen(this_char) != - 17) { /*Mac address acceptable format 01:02:03:04:05:06 length 17 */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal MAC address length!\n")); - continue; - } - - for (i = 0, value = rstrtok(this_char, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("illegal MAC address format or octet!\n")); - /* Do not use "continue" to replace "break" */ - break; - } - - AtoH(value, &macAddr[i++], 1); - } - - if (i != MAC_ADDR_LEN) - continue; - - /* Check if this entry existed. */ - isFound = FALSE; - - for (j = 0; j < pacl->Num; j++) { - if (memcmp(pacl->Entry[j].Addr, &macAddr, - MAC_ADDR_LEN) == 0) { - isFound = TRUE; - NdisZeroMemory(pacl->Entry[j].Addr, - MAC_ADDR_LEN); -#ifdef ACL_BLK_COUNT_SUPPORT - pacl->Entry[j].Reject_Count = 0; -#endif - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("The entry %02x:%02x:%02x:%02x:%02x:%02x founded will be deleted!\n", - macAddr[0], macAddr[1], macAddr[2], - macAddr[3], macAddr[4], macAddr[5])); - } - } - - if (!isFound) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("The entry %02x:%02x:%02x:%02x:%02x:%02x is not in the list!\n", - macAddr[0], macAddr[1], macAddr[2], macAddr[3], - macAddr[4], macAddr[5])); - } - } - - NdisZeroMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, - sizeof(RT_802_11_ACL)); - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = - pacl->Policy; - ASSERT(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num == 0); - i = 0; - - for (j = 0; j < pacl->Num; j++) { - if (memcmp(pacl->Entry[j].Addr, &nullAddr, MAC_ADDR_LEN) == 0) - continue; - else { -#ifdef ACL_BLK_COUNT_SUPPORT - NdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if] - .AccessControlList.Entry[i++]), - &pacl->Entry[j], - sizeof(RT_802_11_ACL_ENTRY)); -#else - NdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if] - .AccessControlList.Entry[i++]), - pacl->Entry[j].Addr, MAC_ADDR_LEN); -#endif /*ACL_BLK_COUNT_SUPPORT*/ - } - } - - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num = i; - ASSERT(pacl->Num >= - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num); - /* check if the change in ACL affects any existent association */ - ApUpdateAccessControlList(pAd, pObj->ioctl_if); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::%s(Policy=%ld, Entry#=%ld)\n", __func__, - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num)); -#ifdef DBG - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=============== Entry ===============\n")); - - for (i = 0; i < pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; - i++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Entry #%02d: ", i + 1)); - - for (j = 0; j < MAC_ADDR_LEN; j++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02X ", pAd->ApCfg.MBSSID[pObj->ioctl_if] - .AccessControlList.Entry[i] - .Addr[j])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - -#endif - os_free_mem(pacl); - - return TRUE; -} - -/* for ACL policy message */ -#define ACL_POLICY_TYPE_NUM 3 -char const *pACL_PolicyMessage[ACL_POLICY_TYPE_NUM] = { - "the Access Control feature is disabled", /* 0 : Disable */ - "only the following entries are allowed to join this BSS", /* 1 : Allow */ - "all the following entries are rejected to join this BSS", /* 2 : Reject */ -}; - -/* - ========================================================================== - Description: - Dump all the entries in the Access control - mac table list of a specified BSS - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_ACLShowAll_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - /* RT_802_11_ACL acl; */ - RT_802_11_ACL *pacl = NULL; - BOOLEAN bDumpAll = FALSE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - INT i, j; - - bDumpAll = os_str_tol(arg, 0, 10); - - if (bDumpAll == 1) - bDumpAll = TRUE; - else if (bDumpAll == 0) { - bDumpAll = FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("Your input is 0!\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("The Access Control List will not be dumped!\n")); - return TRUE; - } else { - return FALSE; /* Invalid argument */ - } - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL)); - - if (pacl == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return FALSE; - } - - NdisZeroMemory(pacl, sizeof(RT_802_11_ACL)); - NdisMoveMemory(pacl, - &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, - sizeof(RT_802_11_ACL)); - - /* Check if the list is already empty. */ - if (pacl->Num == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("The Access Control List is empty!\n")); - os_free_mem(pacl); - return TRUE; - } - - ASSERT(((bDumpAll == 1) && (pacl->Num > 0))); - /* Show the corresponding policy first. */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=============== Access Control Policy ===============\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Policy is %ld : ", pacl->Policy)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", pACL_PolicyMessage[pacl->Policy])); - /* Dump the entry in the list one by one */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=============== Access Control List ===============\n")); - - for (i = 0; i < pacl->Num; i++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Entry #%02d: ", i + 1)); - - for (j = 0; j < MAC_ADDR_LEN; j++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02X ", pacl->Entry[i].Addr[j])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - - os_free_mem(pacl); - - return TRUE; -} - -/* - ========================================================================== - Description: - Clear all the entries in the Access control - mac table list of a specified BSS - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_ACLClearAll_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - /* RT_802_11_ACL acl; */ - RT_802_11_ACL *pacl = NULL; - BOOLEAN bClearAll = FALSE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - bClearAll = os_str_tol(arg, 0, 10); - - if (bClearAll == 1) - bClearAll = TRUE; - else if (bClearAll == 0) { - bClearAll = FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("Your input is 0!\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("The Access Control List will be kept unchanged!\n")); - return TRUE; - } else { - return FALSE; /* Invalid argument */ - } - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL)); - - if (pacl == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return FALSE; - } - - NdisZeroMemory(pacl, sizeof(RT_802_11_ACL)); - NdisMoveMemory(pacl, - &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, - sizeof(RT_802_11_ACL)); - - /* Check if the list is already empty. */ - if (pacl->Num == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("The Access Control List is empty!\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("No need to clear the Access Control List!\n")); - - if (pacl != NULL) - os_free_mem(pacl); - - return TRUE; - } - - ASSERT(((bClearAll == 1) && (pacl->Num > 0))); - - /* Clear the entry in the list one by one */ - /* Keep the corresponding policy unchanged. */ - do { - NdisZeroMemory(pacl->Entry[pacl->Num - 1].Addr, MAC_ADDR_LEN); -#ifdef ACL_BLK_COUNT_SUPPORT - pacl->Entry[pacl->Num - 1].Reject_Count = 0; -#endif - pacl->Num -= 1; - } while (pacl->Num > 0); - - ASSERT(pacl->Num == 0); - NdisZeroMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList), - sizeof(RT_802_11_ACL)); - NdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList), - pacl, sizeof(RT_802_11_ACL)); - /* check if the change in ACL affects any existent association */ - ApUpdateAccessControlList(pAd, pObj->ioctl_if); - - if (pacl != NULL) - os_free_mem(pacl); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set::%s(Policy=%ld, Entry#=%ld)\n", __func__, - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, - pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num)); - return TRUE; -} - -#ifdef DBG -static void _rtmp_hexdump(int level, const char *title, const UINT8 *buf, - size_t len, int show) -{ - size_t i; - - if (level < DebugLevel) - return; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s - hexdump(len=%lu):", title, (unsigned long)len)); - - if (show) { - for (i = 0; i < len; i++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %02x", buf[i])); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" [REMOVED]")); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); -} - -void rtmp_hexdump(int level, const char *title, const UINT8 *buf, size_t len) -{ - _rtmp_hexdump(level, title, buf, len, 1); -} -#endif - -/* - ========================================================================== - Description: - Reset statistics counter - - Arguments: - pAdapter Pointer to our adapter - arg - - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ - -#ifdef AP_SCAN_SUPPORT -/* - ========================================================================== - Description: - Issue a site survey command to driver - Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 set site_survey - ========================================================================== -*/ - -/* - ========================================================================== - Description: - Issue a Auto-Channel Selection command to driver - Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 set AutoChannelSel=1 - Ues the number of AP to choose - 2.) iwpriv ra0 set AutoChannelSel=2 - Ues the False CCA count to choose - 3.) iwpriv ra0 set AutoChannelSel=3 - Ues the channel busy count to choose - ========================================================================== -*/ -INT Set_AutoChannelSel_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - NDIS_802_11_SSID Ssid; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR IfIdx; - struct wifi_dev *pwdev = NULL; - UCHAR band_idx = BAND0; - INT32 ret = 0; - AUTO_CH_CTRL *pAutoChCtrl = NULL; - - NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); - Ssid.SsidLength = 0; - - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) { - IfIdx = pObj->ioctl_if; - pwdev = &pAd->ApCfg.MBSSID[IfIdx].wdev; - - if (!pwdev) - return FALSE; - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Wrong Type parameter, Please input AP type:INT_MAIN or INT_MBSSID\n")); - return FALSE; - } - - band_idx = HcGetBandByWdev(pwdev); - - if (strlen(arg) <= MAX_LEN_OF_SSID) { - if (strlen(arg) > 0) { - NdisMoveMemory(Ssid.Ssid, arg, strlen(arg)); - Ssid.SsidLength = strlen(arg); - } else { /*ANY ssid */ - Ssid.SsidLength = 0; - memcpy(Ssid.Ssid, "", 0); - } - } - - if (strcmp(arg, "1") == 0) - pAd->ApCfg.AutoChannelAlg[band_idx] = ChannelAlgApCnt; - else if (strcmp(arg, "2") == 0) - pAd->ApCfg.AutoChannelAlg[band_idx] = ChannelAlgCCA; - else if (strcmp(arg, "3") == 0) - pAd->ApCfg.AutoChannelAlg[band_idx] = ChannelAlgBusyTime; -#ifdef ACS_CTCC_SUPPORT - else if (strcmp(arg, "5") == 0) { - pAd->ApCfg.AutoChannelAlg[band_idx] = ChannelAlgApCnt; - pAd->ApCfg.auto_ch_score_flag = TRUE; - } else if (strcmp(arg, "6") == 0) { - pAd->ApCfg.AutoChannelAlg[band_idx] = ChannelAlgCCA; - pAd->ApCfg.auto_ch_score_flag = TRUE; - } else if (strcmp(arg, "7") == 0) { - pAd->ApCfg.AutoChannelAlg[band_idx] = ChannelAlgBusyTime; - pAd->ApCfg.auto_ch_score_flag = TRUE; - } -#endif - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_AutoChannelSel_Proc Alg isn't defined\n")); - return FALSE; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_AutoChannelSel_Proc Alg=%d\n", - pAd->ApCfg.AutoChannelAlg[band_idx])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[42m%s: Alg = %d \x1b[m\n", __func__, - pAd->ApCfg.AutoChannelAlg[band_idx])); - - if (pAd->ApCfg.AutoChannelAlg[band_idx] == ChannelAlgBusyTime) { -#ifdef TR181_SUPPORT - { - struct hdev_obj *hdev = (struct hdev_obj *)pwdev->pHObj; - - /*set ACS trigger flag to Manual trigger*/ - hdev->rdev->pRadioCtrl->ACSTriggerFlag = 2; - } -#endif - pAd->CommonCfg.iwpriv_event_flag = TRUE; - AutoChSelScanStart(pAd, pwdev); - ret = RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT( - &pAd->CommonCfg.set_ch_aync_done, - ((120 * 100 * OS_HZ) / 1000)); /* Wait 12s.*/ - if (ret) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s() wait channel setting success.\n", - __func__)); - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s() wait channel setting timeout.\n", - __func__)); - pAd->CommonCfg.set_ch_async_flag = FALSE; - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, band_idx); - if (pAutoChCtrl) - pAutoChCtrl->AutoChSelCtrl.AutoChScanStatMachine - .CurrState = AUTO_CH_SEL_SCAN_IDLE; - } - pAd->CommonCfg.iwpriv_event_flag = FALSE; - } else if (Ssid.SsidLength == 0) - ApSiteSurvey_by_wdev(pAd, &Ssid, SCAN_PASSIVE, TRUE, pwdev); - else - ApSiteSurvey_by_wdev(pAd, &Ssid, SCAN_ACTIVE, TRUE, pwdev); - - return TRUE; -} -INT Set_PartialScan_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex; - UINT8 bPartialScanning; - - if ((pObj->ioctl_if_type != INT_APCLI) && - (pObj->ioctl_if_type != INT_MAIN) && - (pObj->ioctl_if_type != INT_MBSSID)) - return FALSE; - - ifIndex = pObj->ioctl_if; - bPartialScanning = os_str_tol(arg, 0, 10); - - if (bPartialScanning > 0) { - if (((pObj->ioctl_if_type == INT_MAIN) || - (pObj->ioctl_if_type == INT_MBSSID)) && - (ifIndex < HW_BEACON_MAX_NUM)) - pAd->ScanCtrl.PartialScan.pwdev = - &pAd->ApCfg.MBSSID[ifIndex].wdev; - -#ifdef APCLI_SUPPORT - else if ((pObj->ioctl_if_type == INT_APCLI) && - (ifIndex < MAX_APCLI_NUM)) - pAd->ScanCtrl.PartialScan.pwdev = - &pAd->ApCfg.ApCliTab[ifIndex].wdev; - -#endif /* APCLI_SUPPORT */ - } - - pAd->ScanCtrl.PartialScan.bScanning = bPartialScanning ? TRUE : FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): bScanning = %u\n", __func__, - pAd->ScanCtrl.PartialScan.bScanning)); - return TRUE; -} - -INT Set_PeriodicPartialScan_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - if (pAd->CommonCfg.dbdc_mode == TRUE) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Can't trigger Periodic Partial Scan, Since DBDC mode is enabled !!! %s()", - __func__)); - return -1; - } else { - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UINT8 PeriodicPartialScan; - - if ((pObj->ioctl_if_type != INT_APCLI) && - (pObj->ioctl_if_type != INT_MAIN) && - (pObj->ioctl_if_type != INT_MBSSID)) - return FALSE; - PeriodicPartialScan = simple_strtol(arg, 0, 10); - if (PeriodicPartialScan > 0) - pAd->ScanCtrl.PartialScan.bPeriodicPartialScan = TRUE; - else - pAd->ScanCtrl.PartialScan.bPeriodicPartialScan = FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): bPeriodicPartialScan = %u \n", __FUNCTION__, - pAd->ScanCtrl.PartialScan.bPeriodicPartialScan)); - return TRUE; - } -} - -INT Set_PartialScanTriggerPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - if (pAd->CommonCfg.dbdc_mode == TRUE) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Can't set Partial Scan Trigger Period since DBDC mode is enabled !!! %s()", - __func__)); - return -1; - } else { - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UINT8 TriggerPeriod; - - if ((pObj->ioctl_if_type != INT_APCLI) && - (pObj->ioctl_if_type != INT_MAIN) && - (pObj->ioctl_if_type != INT_MBSSID)) - return FALSE; - - TriggerPeriod = simple_strtol(arg, 0, 10); - if (TriggerPeriod > 0) { - pAd->ScanCtrl.PartialScan.TriggerPeriod = - TriggerPeriod * 60 * 10; /*unit 100ms*/ - } - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): TriggerPeriod = %u \n", __FUNCTION__, - pAd->ScanCtrl.PartialScan.TriggerPeriod)); - return TRUE; - } -} - -/* - ========================================================================== - Description: - Set a periodic check time for auto channel selection (unit: hour) - Arguments: - pAdapter Pointer to our adapter - - Return Value: - TRUE if success, FALSE otherwise - - Note: - Usage: - iwpriv ra0 set ACSCheckTime=Hour - - ========================================================================== -*/ -INT Set_AutoChannelSelCheckTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT8 BandIdx, Time; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR IfIdx; - struct wifi_dev *pwdev = NULL; - - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) { - IfIdx = pObj->ioctl_if; - pwdev = &pAd->ApCfg.MBSSID[IfIdx].wdev; - BandIdx = HcGetBandByWdev(pwdev); - Time = os_str_tol(arg, 0, 10); -#ifndef ACS_CTCC_SUPPORT - Time = Time * 3600; /* Hour to second */ -#endif - pAd->ApCfg.ACSCheckTime[BandIdx] = Time; - pAd->ApCfg.ACSCheckCount[BandIdx] = 0; /* Reset counter */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[42m%s(): ACSCheckTime[%d]=%u seconds\x1b[m\n", - __func__, BandIdx, pAd->ApCfg.ACSCheckTime[BandIdx])); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[41m%s(): Not support current interface type = %u!!\x1b[m\n", - __func__, pObj->ioctl_if_type)); - } - - return TRUE; -} -#ifdef NEIGHBORING_AP_STAT -INT Set_IPI_RPI_Config_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UINT8 bSetConfig; - - if ((pObj->ioctl_if_type != INT_MAIN) && - (pObj->ioctl_if_type != INT_MBSSID)) - return FALSE; - - bSetConfig = simple_strtol(arg, 0, 10); - - switch (bSetConfig) { - case 0: - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Reset IPI\n")); - pAd->ScanTab.Ipi = 0; - break; - case 1: - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set IPI\n")); - pAd->ScanTab.Ipi = 1; - break; - default: - printk("please enter 0:reset to default, 1: set IPI\n"); - } - - return TRUE; -} - -/*Dump Custom scan result*/ -INT Set_CustomScanResult_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - int i, j, bssIdx = 0; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - CUSTOM_SCAN_RESULT *rpt = NULL; - UCHAR b_idx = 0; - if ((pObj->ioctl_if_type != INT_APCLI) && - (pObj->ioctl_if_type != INT_MAIN) && - (pObj->ioctl_if_type != INT_MBSSID)) - return FALSE; - /* reset scan entries */ - - /*RPI / IPI Histogram*/ - - for (b_idx = 0; b_idx < COUNT_2G_5G; b_idx++) { - rpt = &pAd->ScanTab.ScanResult[b_idx]; - if (b_idx == SCAN_RESULT_2G) - printk("******************************2G_Stats*******************************\n"); - else - printk("******************************5G_Stats*******************************\n"); - printk("Report Scanned Channel Count=%d\n", rpt->rpi_cnt); - printk("Report Total Neighbouring AP Count: %d\n", - pAd->ScanTab.ScanResult[b_idx].item_ctr); - if (rpt->rpi_cnt <= MAX_RPI_CHANNEL_CNT && rpt->rpi_cnt > 0) { - if (pAd->ScanTab.Ipi) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("IPI Histogram:\n")); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel, Avg_NF, <-92, <-89, <-86, <-83, <-80, <-75, <-70, <-65, <-60, <-55, <-52\n")); - for (i = 0; i < rpt->rpi_cnt; i++) { - printk("%02d, %d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d\n", - rpt->rpi[i].channel, - rpt->rpi[i].NF, - rpt->rpi[i].hist[0], - rpt->rpi[i].hist[1], - rpt->rpi[i].hist[2], - rpt->rpi[i].hist[3], - rpt->rpi[i].hist[4], - rpt->rpi[i].hist[5], - rpt->rpi[i].hist[6], - rpt->rpi[i].hist[7], - rpt->rpi[i].hist[8], - rpt->rpi[i].hist[9], - rpt->rpi[i].hist[10]); - } - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("RPI Histogram:\n")); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Channel, <-87, <-82, <-77, <-72, <-67, <-62, <-57, <-52\n")); - for (i = 0; i < rpt->rpi_cnt; i++) { - printk("%02d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d\n", - rpt->rpi[i].channel, - rpt->rpi[i].hist[0], - rpt->rpi[i].hist[1], - rpt->rpi[i].hist[2], - rpt->rpi[i].hist[3], - rpt->rpi[i].hist[4], - rpt->rpi[i].hist[5], - rpt->rpi[i].hist[6], - rpt->rpi[i].hist[7]); - } - } - } - /*SCAN Result*/ - for (bssIdx = 0; - bssIdx < pAd->ScanTab.ScanResult[b_idx].item_ctr; - bssIdx++) { - if (bssIdx < MAX_COUNT_OF_BSS_ENTRIES) { - printk("\n-------------- No.%03d -------------------\n", - bssIdx); - printk("\tSSID : %s\n", - rpt->items[bssIdx].ssid); - printk("\tMac Address : %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(rpt->items[bssIdx].macAddr)); - printk("\tBeaconPeriod: %d\n", - rpt->items[bssIdx].beaconPeriod); - printk("\tDtimPeriod : %d\n", - rpt->items[bssIdx].dtimPeriod); - printk("\tChannel : %d\n", - rpt->items[bssIdx].channel); - printk("\tBasic Rate : "); - j = 0; - while (rpt->items[bssIdx].basicRate[j] != 0 && - j < MAX_LENGTH_OF_SUPPORT_RATES) { - printk("%d ", - rpt->items[bssIdx].basicRate[j++] / - 2); - } - printk("\n\tSupport Rate: "); - j = 0; - while (rpt->items[bssIdx].suppoRate[j] != 0 && - j < MAX_LENGTH_OF_SUPPORT_RATES) { - printk("%d ", - rpt->items[bssIdx].suppoRate[j++] / - 2); - } - printk("\n"); - } - } - } - return TRUE; -} -#endif - -#endif /* AP_SCAN_SUPPORT */ - -static INT show_apcfg_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - struct wifi_dev *wdev = NULL; - struct apcfg_parameters apcfg_para_setting; - LONG cfg_mode; - UCHAR wmode; - POS_COOKIE pObj = NULL; - CHAR str[10] = ""; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("show ap cfg info:\n")); - - pObj = (POS_COOKIE)pAd->OS_Cookie; - if (pObj == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pObj is NULL\n")); - return FALSE; - } - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - if (wdev == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev is NULL\n")); - return FALSE; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16s%-8s\n", " ", "WIFI_DRIVER", "PEAK_VALUE")); - - /*WirelessMode*/ - wmode = wdev->PhyMode; - cfg_mode = wmode_2_cfgmode(wmode); - if (WMODE_CAP_2G(wmode)) - apcfg_para_setting.cfg_mode[0] = cfg_mode; - else if (WMODE_CAP_5G(wmode)) - apcfg_para_setting.cfg_mode[1] = cfg_mode; - - if (cfg_mode == 9) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16ld%ld\n", "WirelessMode", cfg_mode, - apcfg_for_peak.cfg_mode[0])); - else if (cfg_mode == 14) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16ld%ld\n", "WirelessMode", cfg_mode, - apcfg_for_peak.cfg_mode[1])); - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16ld%ld/%ld\n", "WirelessMode", cfg_mode, - apcfg_for_peak.cfg_mode[0], - apcfg_for_peak.cfg_mode[1])); - - apcfg_para_setting.tx_power_percentage = 0; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16lu%lu\n", "TxPower", - apcfg_para_setting.tx_power_percentage, - apcfg_for_peak.tx_power_percentage)); - - /*TxPreamble*/ - apcfg_para_setting.tx_preamble = pAd->CommonCfg.TxPreamble; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16lu%lu\n", "TxPreamble", - apcfg_para_setting.tx_preamble, apcfg_for_peak.tx_preamble)); - - /*RTSThreshold*/ - apcfg_para_setting.conf_len_thld = wlan_config_get_rts_len_thld(wdev); - apcfg_para_setting.oper_len_thld = wlan_operate_get_rts_len_thld(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "RTSThreshold(config)", - apcfg_para_setting.conf_len_thld, - apcfg_for_peak.conf_len_thld)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "RTSThreshold(operate)", - apcfg_para_setting.oper_len_thld, - apcfg_for_peak.oper_len_thld)); - - /*FragThreshold*/ - apcfg_para_setting.conf_frag_thld = wlan_config_get_frag_thld(wdev); - apcfg_para_setting.oper_frag_thld = wlan_operate_get_frag_thld(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "FragThreshold(config)", - apcfg_para_setting.conf_frag_thld, - apcfg_for_peak.conf_frag_thld)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "FragThreshold(operate)", - apcfg_para_setting.oper_frag_thld, - apcfg_for_peak.oper_frag_thld)); - - /*TxBurst*/ - apcfg_para_setting.bEnableTxBurst = pAd->CommonCfg.bEnableTxBurst; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "TxBurst", - apcfg_para_setting.bEnableTxBurst, - apcfg_for_peak.bEnableTxBurst)); - - /*ShortSlot*/ - apcfg_para_setting.bUseShortSlotTime = wdev->bUseShortSlotTime; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "ShortSlot", - apcfg_para_setting.bUseShortSlotTime, - apcfg_for_peak.bUseShortSlotTime)); - -#ifdef DOT11_N_SUPPORT - /*HT_BW*/ - apcfg_para_setting.conf_ht_bw = wlan_config_get_ht_bw(wdev); - apcfg_para_setting.oper_ht_bw = wlan_operate_get_ht_bw(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_BW(config)", - apcfg_para_setting.conf_ht_bw, apcfg_for_peak.conf_ht_bw)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_BW(operate)", - apcfg_para_setting.oper_ht_bw, apcfg_for_peak.oper_ht_bw)); - -#ifdef DOT11N_DRAFT3 - /*HT_BSSCoexistence */ - apcfg_para_setting.bBssCoexEnable = pAd->CommonCfg.bBssCoexEnable; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_BSSCoexistence", - apcfg_para_setting.bBssCoexEnable, - apcfg_for_peak.bBssCoexEnable)); -#endif - - /*HT_TxStream */ - apcfg_para_setting.ht_tx_streams = wlan_config_get_tx_stream(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_TxStream", - apcfg_para_setting.ht_tx_streams, - (pAd->CommonCfg.dbdc_mode ? - (apcfg_for_peak.ht_tx_streams - 2) : - apcfg_for_peak.ht_tx_streams))); - - /*HT_RxStream */ - apcfg_para_setting.ht_rx_streams = wlan_config_get_rx_stream(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_RxStream", - apcfg_para_setting.ht_rx_streams, - (pAd->CommonCfg.dbdc_mode ? - (apcfg_for_peak.ht_rx_streams - 2) : - apcfg_for_peak.ht_rx_streams))); - - /*HT_BADecline*/ - apcfg_para_setting.bBADecline = pAd->CommonCfg.bBADecline; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_BADecline", - apcfg_para_setting.bBADecline, apcfg_for_peak.bBADecline)); - - /*HT_AutoBA*/ - apcfg_para_setting.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_AutoBA", apcfg_para_setting.AutoBA, - apcfg_for_peak.AutoBA)); - - /*HT_AMSDU*/ - apcfg_para_setting.AmsduEnable = - pAd->CommonCfg.BACapability.field.AmsduEnable; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_AMSDU", apcfg_para_setting.AmsduEnable, - apcfg_for_peak.AmsduEnable)); - - /*HT_BAWinSize*/ - apcfg_para_setting.RxBAWinLimit = - pAd->CommonCfg.BACapability.field.RxBAWinLimit; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_BAWinSize", - apcfg_para_setting.RxBAWinLimit, - apcfg_for_peak.RxBAWinLimit)); - - /*HT_GI*/ - apcfg_para_setting.ht_gi = - pAd->CommonCfg.RegTransmitSetting.field.ShortGI; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_GI", apcfg_para_setting.ht_gi, - apcfg_for_peak.ht_gi)); - - /*HT_STBC*/ - apcfg_para_setting.ht_stbc = wlan_config_get_ht_stbc(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_STBC", apcfg_para_setting.ht_stbc, - apcfg_for_peak.ht_stbc)); - - /*HT_LDPC*/ - apcfg_para_setting.ht_ldpc = wlan_config_get_ht_ldpc(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_LDPC", apcfg_para_setting.ht_ldpc, - apcfg_for_peak.ht_ldpc)); - - /*HT_RDG*/ - apcfg_para_setting.bRdg = pAd->CommonCfg.bRdg; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_RDG", apcfg_para_setting.bRdg, - apcfg_for_peak.bRdg)); -#endif - - /*HT_DisallowTKIP*/ - apcfg_para_setting.HT_DisallowTKIP = pAd->CommonCfg.HT_DisallowTKIP; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "HT_DisallowTKIP", - apcfg_para_setting.HT_DisallowTKIP, - apcfg_for_peak.HT_DisallowTKIP)); - -#ifdef DOT11_VHT_AC - if (WMODE_CAP_5G(wmode)) { - /*VHT_BW*/ - apcfg_para_setting.conf_vht_bw = wlan_config_get_vht_bw(wdev); - apcfg_para_setting.oper_vht_bw = wlan_operate_get_vht_bw(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "VHT_BW(config)", - apcfg_para_setting.conf_vht_bw, - apcfg_for_peak.conf_vht_bw)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "VHT_BW(operate)", - apcfg_para_setting.oper_vht_bw, - apcfg_for_peak.oper_vht_bw)); - - /*VHT_SGI */ - apcfg_para_setting.vht_sgi = wlan_config_get_vht_sgi(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "VHT_SGI", - apcfg_para_setting.vht_sgi, apcfg_for_peak.vht_sgi)); - - /*VHT_STBC*/ - apcfg_para_setting.vht_stbc = wlan_config_get_vht_stbc(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "VHT_STBC", - apcfg_para_setting.vht_stbc, - apcfg_for_peak.vht_stbc)); - - /*VHT_BW_SIGNAL*/ - apcfg_para_setting.vht_bw_signal = - wlan_config_get_vht_bw_sig(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "VHT_BW_SIGNAL", - apcfg_para_setting.vht_bw_signal, - apcfg_for_peak.vht_bw_signal)); - - /*VHT_LDPC*/ - apcfg_para_setting.vht_ldpc = wlan_config_get_vht_ldpc(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "VHT_LDPC", - apcfg_para_setting.vht_ldpc, - apcfg_for_peak.vht_ldpc)); - } - - if (WMODE_CAP_2G(wmode)) { - /*G_BAND_256QAM*/ - apcfg_para_setting.g_band_256_qam = - pAd->CommonCfg.g_band_256_qam; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "G_BAND_256QAM", - apcfg_para_setting.g_band_256_qam, - apcfg_for_peak.g_band_256_qam)); - } -#endif - - /*IEEE80211H*/ - apcfg_para_setting.bIEEE80211H = pAd->CommonCfg.bIEEE80211H; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "IEEE80211H", - apcfg_para_setting.bIEEE80211H, apcfg_for_peak.bIEEE80211H)); - -#ifdef MT_DFS_SUPPORT - /*DfsEnable*/ - if (WMODE_CAP_5G(wmode)) { - apcfg_para_setting.bDfsEnable = - pAd->CommonCfg.DfsParameter.bDfsEnable; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "DfsEnable", - apcfg_para_setting.bDfsEnable, - apcfg_for_peak.bDfsEnable)); - } -#endif - -#ifdef BACKGROUND_SCAN_SUPPORT - /*DfsZeroWait*/ - if (!(pAd->CommonCfg.dbdc_mode)) { - apcfg_para_setting.DfsZeroWaitSupport = - pAd->BgndScanCtrl.DfsZeroWaitSupport; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "DfsZeroWait", - apcfg_para_setting.DfsZeroWaitSupport, - apcfg_for_peak.DfsZeroWaitSupport)); - } -#endif - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT - /*ETxBfEnCond*/ - apcfg_para_setting.ETxBfEnCond = pAd->CommonCfg.ETxBfEnCond; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16lu%lu\n", "CommonCfg.ETxBfEnCond", - apcfg_para_setting.ETxBfEnCond, apcfg_for_peak.ETxBfEnCond)); - - /*ETxBfEnCond*/ - apcfg_para_setting.ETxBfEnCond = wlan_config_get_etxbf(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16lu%lu\n", "ETxBfEnCond", - apcfg_para_setting.ETxBfEnCond, apcfg_for_peak.ETxBfEnCond)); -#endif -#endif - - /*ITxBfEn*/ - apcfg_para_setting.ITxBfEn = - pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16d%d\n", "ITxBfEn", apcfg_para_setting.ITxBfEn, - apcfg_for_peak.ITxBfEn)); - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT - /*MUTxRxEnable*/ - apcfg_para_setting.MUTxRxEnable = pAd->CommonCfg.MUTxRxEnable; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16lu%lu\n", "MUTxRxEnable", - apcfg_para_setting.MUTxRxEnable, - apcfg_for_peak.MUTxRxEnable)); -#endif -#endif - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-----------------------------------------------------\n")); - - /*external channel*/ - apcfg_para_setting.channel = wdev->channel; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16u\n", "current channel", - apcfg_para_setting.channel)); - - apcfg_para_setting.ext_channel = wlan_operate_get_ext_cha(wdev); - - if (apcfg_para_setting.ext_channel == EXTCHA_ABOVE) - sprintf(str, "ABOVE"); - else if (apcfg_para_setting.ext_channel == EXTCHA_BELOW) - sprintf(str, "BELOW"); - else - sprintf(str, "NONE"); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%-24s%-16s\n", "extension channel", str)); - - return TRUE; -} -#ifdef TXRX_STAT_SUPPORT -INT Show_Radio_Stat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT8 i; - struct hdev_ctrl *ctrl = (struct hdev_ctrl *)pAd->hdev_ctrl; - for (i = 0; i < DBDC_BAND_NUM; i++) { - if (ctrl->rdev[i].pRadioCtrl->Last1TxCnt && - ctrl->rdev[i].pRadioCtrl->Last1TxFailCnt) - ctrl->rdev[i].pRadioCtrl->Last1SecPER = - ((100 * - (ctrl->rdev[i].pRadioCtrl->Last1TxFailCnt)) / - ctrl->rdev[i].pRadioCtrl->Last1TxCnt); - } - printk("------------------BAND:0-----------------------\n"); - printk("TxDataPacketCnt = %lld\n", - ctrl->rdev[0].pRadioCtrl->TxDataPacketCount.QuadPart); - printk("TxDataPacketByte = %lld\n", - ctrl->rdev[0].pRadioCtrl->TxDataPacketByte.QuadPart); - printk("RxDataPacketCnt = %lld\n", - ctrl->rdev[0].pRadioCtrl->RxDataPacketCount.QuadPart); - printk("RxDataPacketByte = %lld\n", - ctrl->rdev[0].pRadioCtrl->RxDataPacketByte.QuadPart); - printk("TxMgmtPacketCnt = %lld\n", - ctrl->rdev[0].pRadioCtrl->TxMgmtPacketCount.QuadPart); - printk("RxMgmtPacketCnt = %lld\n", - ctrl->rdev[0].pRadioCtrl->RxMgmtPacketCount.QuadPart); - printk("TxBcnPacketCnt = %lld\n", - ctrl->rdev[0].pRadioCtrl->TxBeaconPacketCount.QuadPart); - printk("ucPktsTx = %lld\n", - ctrl->rdev[0].pRadioCtrl->TxUnicastDataPacket.QuadPart); - printk("mcPktsTx = %lld\n", - ctrl->rdev[0].pRadioCtrl->TxMulticastDataPacket.QuadPart); - printk("bcPktsTx = %lld\n", - ctrl->rdev[0].pRadioCtrl->TxBroadcastDataPacket.QuadPart); - printk("TxDroppedPacketCnt = %lld\n", - ctrl->rdev[0].pRadioCtrl->TxPacketDroppedCount.QuadPart); - printk("ChannelUtilization = %u\n", pAd->Ch_BusyTime_11k[DBDC_BAND0]); - printk("RxCRCErrorCount = %lld\n", - ctrl->rdev[0].pRadioCtrl->RxCRCErrorCount.QuadPart); - printk("RxMICErrorCount = %lld\n", - ctrl->rdev[0].pRadioCtrl->RxMICErrorCount.QuadPart); - printk("RxDecyptionErrorCnt = %lld\n", - ctrl->rdev[0].pRadioCtrl->RxDecryptionErrorCount.QuadPart); - printk("RxTotalErrorCnt = %lld\n", - (ctrl->rdev[0].pRadioCtrl->RxDecryptionErrorCount.QuadPart + - ctrl->rdev[0].pRadioCtrl->RxMICErrorCount.QuadPart + - ctrl->rdev[0].pRadioCtrl->RxMICErrorCount.QuadPart + - ctrl->rdev[0].pRadioCtrl->RxCRCErrorCount.QuadPart)); - printk("ThroughPut(TX Kbps) = %lld\n", - (ctrl->rdev[0].pRadioCtrl->LastSecTxByte.QuadPart >> 7)); - printk("ThroughPut(RX Kbps) = %lld\n", - (ctrl->rdev[0].pRadioCtrl->LastSecRxByte.QuadPart >> 7)); - printk("PER(pct from start) = %u\n", - ctrl->rdev[0].pRadioCtrl->TotalPER); - printk("Total PER(Last Sec) = %u\n", - ctrl->rdev[0].pRadioCtrl->Last1SecPER); - printk("Data BK BE VI VO\n"); - printk("Packets Sent : %10lld %10lld %10lld %10lld\n", - ctrl->rdev[0] - .pRadioCtrl->TxDataPacketCountPerAC[QID_AC_BK] - .QuadPart, - ctrl->rdev[0] - .pRadioCtrl->TxDataPacketCountPerAC[QID_AC_BE] - .QuadPart, - ctrl->rdev[0] - .pRadioCtrl->TxDataPacketCountPerAC[QID_AC_VI] - .QuadPart, - ctrl->rdev[0] - .pRadioCtrl->TxDataPacketCountPerAC[QID_AC_VO] - .QuadPart); - printk("Packets Rcvd : %10lld %10lld %10lld %10lld\n", - ctrl->rdev[0] - .pRadioCtrl->RxDataPacketCountPerAC[QID_AC_BK] - .QuadPart, - ctrl->rdev[0] - .pRadioCtrl->RxDataPacketCountPerAC[QID_AC_BE] - .QuadPart, - ctrl->rdev[0] - .pRadioCtrl->RxDataPacketCountPerAC[QID_AC_VI] - .QuadPart, - ctrl->rdev[0] - .pRadioCtrl->RxDataPacketCountPerAC[QID_AC_VO] - .QuadPart); - printk("RSSI 0 1 2 3\n"); - printk("Data Rx : %d %d %d %d\n", - ctrl->rdev[0].pRadioCtrl->LastDataPktRssi[0], - ctrl->rdev[0].pRadioCtrl->LastDataPktRssi[1], - ctrl->rdev[0].pRadioCtrl->LastDataPktRssi[2], - ctrl->rdev[0].pRadioCtrl->LastDataPktRssi[3]); - printk("----------------------------------------------\n"); - if (pAd->CommonCfg.dbdc_mode) { - printk("------------------BAND:1-----------------------\n"); - printk("TxDataPacketCnt = %lld\n", - ctrl->rdev[1].pRadioCtrl->TxDataPacketCount.QuadPart); - printk("TxDataPacketByte = %lld\n", - ctrl->rdev[1].pRadioCtrl->TxDataPacketByte.QuadPart); - printk("RxDataPacketCnt = %lld\n", - ctrl->rdev[1].pRadioCtrl->RxDataPacketCount.QuadPart); - printk("RxDataPacketByte = %lld\n", - ctrl->rdev[1].pRadioCtrl->RxDataPacketByte.QuadPart); - printk("TxMgmtPacketCnt = %lld\n", - ctrl->rdev[1].pRadioCtrl->TxMgmtPacketCount.QuadPart); - printk("RxMgmtPacketCnt = %lld\n", - ctrl->rdev[1].pRadioCtrl->RxMgmtPacketCount.QuadPart); - printk("TxBcnPacketCnt = %lld\n", - ctrl->rdev[1].pRadioCtrl->TxBeaconPacketCount.QuadPart); - printk("ucPktsTx = %lld\n", - ctrl->rdev[1].pRadioCtrl->TxUnicastDataPacket.QuadPart); - printk("mcPktsTx = %lld\n", - ctrl->rdev[1].pRadioCtrl->TxMulticastDataPacket.QuadPart); - printk("bcPktsTx = %lld\n", - ctrl->rdev[1].pRadioCtrl->TxBroadcastDataPacket.QuadPart); - printk("TxDroppedPacketCnt = %lld\n", - ctrl->rdev[1].pRadioCtrl->TxPacketDroppedCount.QuadPart); - printk("ChannelUtilization = %u\n", - pAd->Ch_BusyTime_11k[DBDC_BAND1]); - printk("RxCRCErrorCount = %lld\n", - ctrl->rdev[1].pRadioCtrl->RxCRCErrorCount.QuadPart); - printk("RxMICErrorCount = %lld\n", - ctrl->rdev[1].pRadioCtrl->RxMICErrorCount.QuadPart); - printk("RxDecyptionErrorCnt = %lld\n", - ctrl->rdev[1] - .pRadioCtrl->RxDecryptionErrorCount.QuadPart); - printk("RxTotalErrorCnt = %lld\n", - (ctrl->rdev[1] - .pRadioCtrl->RxDecryptionErrorCount.QuadPart + - ctrl->rdev[1].pRadioCtrl->RxMICErrorCount.QuadPart + - ctrl->rdev[1].pRadioCtrl->RxMICErrorCount.QuadPart + - ctrl->rdev[1].pRadioCtrl->RxCRCErrorCount.QuadPart)); - printk("ThroughPut(TX Kbps) = %lld\n", - (ctrl->rdev[1].pRadioCtrl->LastSecTxByte.QuadPart >> 7)); - printk("ThroughPut(RX Kbps) = %lld\n", - (ctrl->rdev[1].pRadioCtrl->LastSecRxByte.QuadPart >> 7)); - printk("PER(pct from start) = %u\n", - ctrl->rdev[1].pRadioCtrl->TotalPER); - printk("Total PER(Last Sec) = %u\n", - ctrl->rdev[1].pRadioCtrl->Last1SecPER); - printk("Data BK BE VI VO\n"); - printk("Packets Sent : %10lld %10lld %10lld %10lld\n", - ctrl->rdev[1] - .pRadioCtrl->TxDataPacketCountPerAC[QID_AC_BK] - .QuadPart, - ctrl->rdev[1] - .pRadioCtrl->TxDataPacketCountPerAC[QID_AC_BE] - .QuadPart, - ctrl->rdev[1] - .pRadioCtrl->TxDataPacketCountPerAC[QID_AC_VI] - .QuadPart, - ctrl->rdev[1] - .pRadioCtrl->TxDataPacketCountPerAC[QID_AC_VO] - .QuadPart); - printk("Packets Rcvd : %10lld %10lld %10lld %10lld\n", - ctrl->rdev[1] - .pRadioCtrl->RxDataPacketCountPerAC[QID_AC_BK] - .QuadPart, - ctrl->rdev[1] - .pRadioCtrl->RxDataPacketCountPerAC[QID_AC_BE] - .QuadPart, - ctrl->rdev[1] - .pRadioCtrl->RxDataPacketCountPerAC[QID_AC_VI] - .QuadPart, - ctrl->rdev[1] - .pRadioCtrl->RxDataPacketCountPerAC[QID_AC_VO] - .QuadPart); - printk("RSSI 0 1 2 3\n"); - printk("Data Rx : %d %d %d %d\n", - ctrl->rdev[1].pRadioCtrl->LastDataPktRssi[0], - ctrl->rdev[1].pRadioCtrl->LastDataPktRssi[1], - ctrl->rdev[1].pRadioCtrl->LastDataPktRssi[2], - ctrl->rdev[1].pRadioCtrl->LastDataPktRssi[3]); - printk("----------------------------------------------\n"); - } - return TRUE; -} - -INT Show_Bss_Stat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT8 Bss_Idx, i; - BSS_STRUCT *pMbss = NULL; - EXT_EVENT_TX_STATISTIC_RESULT_T rTxStatResult; - HTTRANSMIT_SETTING LastMbssTxPktRate; - ULONG DataRate_Tx; - ULONG Multicast_Tx_Rate; - USHORT Multicast_Tx_MCS, Multicast_Tx_Mode; - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - pMbss = &pAd->ApCfg.MBSSID[i]; - if (pMbss->stat_bss.Last1TxCnt && - pMbss->stat_bss.Last1TxFailCnt) - pMbss->stat_bss.Last1SecPER = - ((100 * (pMbss->stat_bss.Last1TxFailCnt)) / - pMbss->stat_bss.Last1TxCnt); - } - for (Bss_Idx = 0; Bss_Idx < pAd->ApCfg.BssidNum; Bss_Idx++) { - pMbss = &pAd->ApCfg.MBSSID[Bss_Idx]; - printk("------------------BSS:%d-----------------------\n", - Bss_Idx); - printk("TxDataPacketCnt = %lld\n", - pMbss->stat_bss.TxDataPacketCount.QuadPart); - printk("TxDataPacketByte = %lld\n", - pMbss->stat_bss.TxDataPacketByte.QuadPart); - printk("TxDataPayloadByte = %lld\n", - pMbss->stat_bss.TxDataPayloadByte.QuadPart); - printk("RxDataPacketCnt = %lld\n", - pMbss->stat_bss.RxDataPacketCount.QuadPart); - printk("RxDataPacketByte = %lld\n", - pMbss->stat_bss.RxDataPacketByte.QuadPart); - printk("RxDataPayloadByte = %lld\n", - pMbss->stat_bss.RxDataPayloadByte.QuadPart); - printk("TxMgmtPacketCnt = %lld\n", - pMbss->stat_bss.TxMgmtPacketCount.QuadPart); - printk("TxMgffChlPktCnt = %lld\n", - pMbss->stat_bss.TxMgmtOffChPktCount.QuadPart); - printk("RxMgmtPacketCnt = %lld\n", - pMbss->stat_bss.RxMgmtPacketCount.QuadPart); - printk("ucPktsTx = %lld\n", - pMbss->stat_bss.TxUnicastDataPacket.QuadPart); - printk("ucPktsRx = %lld\n", - pMbss->stat_bss.RxUnicastDataPacket.QuadPart); - printk("mcPktsTx = %lld\n", - pMbss->stat_bss.TxMulticastDataPacket.QuadPart); - printk("bcPktsTx = %lld\n", - pMbss->stat_bss.TxBroadcastDataPacket.QuadPart); - printk("TxDroppedPacketCnt = %lld\n", - pMbss->stat_bss.TxPacketDroppedCount.QuadPart); - printk("RxDroppedPacketCnt = %lld\n", - pMbss->stat_bss.RxPacketDroppedCount.QuadPart); - printk("AverageTXRate(Kbps) = %lld\n", - (pMbss->stat_bss.LastSecTxBytes.QuadPart >> 7)); - printk("AverageRXRate(Kbps) = %lld\n", - (pMbss->stat_bss.LastSecRxBytes.QuadPart >> 7)); - printk("PER (pcnt) = %d\n", - pMbss->stat_bss.Last1SecPER); - printk("TxRetriedPktCnt = %lld\n", - pMbss->stat_bss.TxRetriedPacketCount.QuadPart); - printk("RxMICErrorCount = %lld\n", - pMbss->stat_bss.RxMICErrorCount.QuadPart); - printk("RxDecryptionErrorCnt= %lld\n", - pMbss->stat_bss.RxDecryptionErrorCount.QuadPart); - if (VALID_UCAST_ENTRY_WCID(pAd, - pMbss->stat_bss.LastPktStaWcid)) { - PMAC_TABLE_ENTRY pEntry = - &pAd->MacTab.Content[pMbss->stat_bss - .LastPktStaWcid]; - if (pEntry && IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC) && - (pEntry->pMbss == pMbss)) { - MtCmdGetTxStatistic( - pAd, GET_TX_STAT_ENTRY_TX_RATE, - 0 /*Don't Care*/, - pMbss->stat_bss.LastPktStaWcid, - &rTxStatResult); - LastMbssTxPktRate.field.MODE = - rTxStatResult.rEntryTxRate.MODE; - LastMbssTxPktRate.field.BW = - rTxStatResult.rEntryTxRate.BW; - LastMbssTxPktRate.field.ldpc = - rTxStatResult.rEntryTxRate.ldpc ? 1 : 0; - LastMbssTxPktRate.field.ShortGI = - rTxStatResult.rEntryTxRate.ShortGI ? 1 : - 0; - LastMbssTxPktRate.field.STBC = - rTxStatResult.rEntryTxRate.STBC; - if (LastMbssTxPktRate.field.MODE == MODE_VHT) - LastMbssTxPktRate.field.MCS = - (((rTxStatResult.rEntryTxRate - .VhtNss - - 1) & - 0x3) - << 4) + - rTxStatResult.rEntryTxRate.MCS; - else if (LastMbssTxPktRate.field.MODE == - MODE_OFDM) - LastMbssTxPktRate.field.MCS = - getLegacyOFDMMCSIndex( - rTxStatResult - .rEntryTxRate - .MCS) & - 0x0000003F; - else - LastMbssTxPktRate.field.MCS = - rTxStatResult.rEntryTxRate.MCS; - getRate(LastMbssTxPktRate, &DataRate_Tx); - printk("MbssLastTxPktRate = %lu\n", - DataRate_Tx); - printk("MbssLastTxPktMCS = %d\n", - LastMbssTxPktRate.field.MCS); - } - } - Multicast_Tx_MCS = - pMbss->stat_bss.LastMulticastTxRate.field.MCS; - Multicast_Tx_Mode = - pMbss->stat_bss.LastMulticastTxRate.field.MODE; - getRate(pMbss->stat_bss.LastMulticastTxRate, - &Multicast_Tx_Rate); - if (i >= 1) { - BSS_STRUCT *FirstMbss = &pAd->ApCfg.MBSSID[0]; - Multicast_Tx_MCS = - FirstMbss->stat_bss.LastMulticastTxRate.field - .MCS; - getRate(FirstMbss->stat_bss.LastMulticastTxRate, - &Multicast_Tx_Rate); - } - printk("MulitcastLastTxRate = %lu\n", Multicast_Tx_Rate); - printk("MulitcastLastTxMCS = %d\n", Multicast_Tx_MCS); - printk("Data BK BE VI VO\n"); - printk("Packets Sent : %10lld %10lld %10lld %10lld\n", - pMbss->stat_bss.TxDataPacketCountPerAC[QID_AC_BK] - .QuadPart, - pMbss->stat_bss.TxDataPacketCountPerAC[QID_AC_BE] - .QuadPart, - pMbss->stat_bss.TxDataPacketCountPerAC[QID_AC_VI] - .QuadPart, - pMbss->stat_bss.TxDataPacketCountPerAC[QID_AC_VO] - .QuadPart); - printk("Packets Rcvd : %10lld %10lld %10lld %10lld\n", - pMbss->stat_bss.RxDataPacketCountPerAC[QID_AC_BK] - .QuadPart, - pMbss->stat_bss.RxDataPacketCountPerAC[QID_AC_BE] - .QuadPart, - pMbss->stat_bss.RxDataPacketCountPerAC[QID_AC_VI] - .QuadPart, - pMbss->stat_bss.RxDataPacketCountPerAC[QID_AC_VO] - .QuadPart); - printk("----------------------------------------------\n"); - } - return TRUE; -} -INT Show_Sta_Stat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT i; - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - if (pEntry && IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC)) { - ULONG DataRate_Tx; - ULONG DataRate_Rx; - EXT_EVENT_TX_STATISTIC_RESULT_T rTxStatResult; - HTTRANSMIT_SETTING LastTxRate; - HTTRANSMIT_SETTING LastRxRate; - UINT32 RawData, RawData_r; - UCHAR bw, stbc; - UCHAR phy_mode_r, rate_r, bw_r, stbc_r; - UINT32 lastTxRate, lastRxRate; - lastRxRate = pEntry->LastRxRate; - RawData_r = lastRxRate; - phy_mode_r = (RawData_r >> 13) & 0x7; - rate_r = RawData_r & 0x3F; - bw_r = (RawData_r >> 7) & 0x3; - stbc_r = ((RawData_r >> 10) & 0x1); - MtCmdGetTxStatistic(pAd, GET_TX_STAT_ENTRY_TX_RATE, - 0 /*Don't Care*/, pEntry->wcid, - &rTxStatResult); - LastTxRate.field.MODE = rTxStatResult.rEntryTxRate.MODE; - LastTxRate.field.BW = rTxStatResult.rEntryTxRate.BW; - LastTxRate.field.ldpc = - rTxStatResult.rEntryTxRate.ldpc ? 1 : 0; - LastTxRate.field.ShortGI = - rTxStatResult.rEntryTxRate.ShortGI ? 1 : 0; - LastTxRate.field.STBC = rTxStatResult.rEntryTxRate.STBC; - if (LastTxRate.field.MODE == MODE_VHT) - LastTxRate.field.MCS = - (((rTxStatResult.rEntryTxRate.VhtNss - - 1) & - 0x3) - << 4) + - rTxStatResult.rEntryTxRate.MCS; - else if (LastTxRate.field.MODE == MODE_OFDM) - LastTxRate.field.MCS = - getLegacyOFDMMCSIndex( - rTxStatResult.rEntryTxRate.MCS) & - 0x0000003F; - else - LastTxRate.field.MCS = - rTxStatResult.rEntryTxRate.MCS; - lastTxRate = (UINT32)(LastTxRate.word); - LastRxRate.word = (USHORT)(pEntry->LastRxRate); - RawData = lastTxRate; - bw = (RawData >> 7) & 0x3; - stbc = ((RawData >> 10) & 0x1); - if (phy_mode_r == MODE_OFDM) { - if (rate_r == TMI_TX_RATE_OFDM_6M) - LastRxRate.field.MCS = 0; - else if (rate_r == TMI_TX_RATE_OFDM_9M) - LastRxRate.field.MCS = 1; - else if (rate_r == TMI_TX_RATE_OFDM_12M) - LastRxRate.field.MCS = 2; - else if (rate_r == TMI_TX_RATE_OFDM_18M) - LastRxRate.field.MCS = 3; - else if (rate_r == TMI_TX_RATE_OFDM_24M) - LastRxRate.field.MCS = 4; - else if (rate_r == TMI_TX_RATE_OFDM_36M) - LastRxRate.field.MCS = 5; - else if (rate_r == TMI_TX_RATE_OFDM_48M) - LastRxRate.field.MCS = 6; - else if (rate_r == TMI_TX_RATE_OFDM_54M) - LastRxRate.field.MCS = 7; - else - LastRxRate.field.MCS = 0; - } else if (phy_mode_r == MODE_CCK) { - if (rate_r == TMI_TX_RATE_CCK_1M_LP) - LastRxRate.field.MCS = 0; - else if (rate_r == TMI_TX_RATE_CCK_2M_LP) - LastRxRate.field.MCS = 1; - else if (rate_r == TMI_TX_RATE_CCK_5M_LP) - LastRxRate.field.MCS = 2; - else if (rate_r == TMI_TX_RATE_CCK_11M_LP) - LastRxRate.field.MCS = 3; - else if (rate_r == TMI_TX_RATE_CCK_2M_SP) - LastRxRate.field.MCS = 1; - else if (rate_r == TMI_TX_RATE_CCK_5M_SP) - LastRxRate.field.MCS = 2; - else if (rate_r == TMI_TX_RATE_CCK_11M_SP) - LastRxRate.field.MCS = 3; - else - LastRxRate.field.MCS = 0; - } - getRate(LastTxRate, &DataRate_Tx); - getRate(LastRxRate, &DataRate_Rx); - printk("-----------------WCID:%d-----------------------\n", - i); - printk("MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", - pEntry->Addr[0], pEntry->Addr[1], - pEntry->Addr[2], pEntry->Addr[3], - pEntry->Addr[4], pEntry->Addr[5]); - printk("TxDataPacketCnt = %lld\n", - pEntry->TxDataPacketCount.QuadPart); - printk("TxDataPacketByte = %lld\n", - pEntry->TxDataPacketByte.QuadPart); - printk("TxSuccessCount = %u\n", - pEntry->TxSuccessByWtbl); - printk("TxUnicastSuccessCnt = %u\n", - pEntry->TxSuccessByWtbl); - printk("RxDataPacketCnt = %lld\n", - pEntry->RxDataPacketCount.QuadPart); - printk("RxDataPacketByte = %lld\n", - pEntry->RxDataPacketByte.QuadPart); - printk("Data BK BE VI VO\n"); - printk("Packets Sent : %10lld %10lld %10lld %10lld\n", - pEntry->TxDataPacketCountPerAC[QID_AC_BK] - .QuadPart, - pEntry->TxDataPacketCountPerAC[QID_AC_BE] - .QuadPart, - pEntry->TxDataPacketCountPerAC[QID_AC_VI] - .QuadPart, - pEntry->TxDataPacketCountPerAC[QID_AC_VO] - .QuadPart); - printk("Packets Rcvd : %10lld %10lld %10lld %10lld\n", - pEntry->RxDataPacketCountPerAC[QID_AC_BK] - .QuadPart, - pEntry->RxDataPacketCountPerAC[QID_AC_BE] - .QuadPart, - pEntry->RxDataPacketCountPerAC[QID_AC_VI] - .QuadPart, - pEntry->RxDataPacketCountPerAC[QID_AC_VO] - .QuadPart); - printk("TxMgmtPacketCnt = %lld\n", - pEntry->TxMgmtPacketCount.QuadPart); - printk("RxMgmtPacketCnt = %lld\n", - pEntry->RxMgmtPacketCount.QuadPart); - printk("LastSecTxPackets = %lld\n", - pEntry->TxDataPacketCount1SecValue.QuadPart); - printk("LastSecRxPackets = %lld\n", - pEntry->RxDataPacketCount1SecValue.QuadPart); - printk("LastSecTxBytes = %lld\n", - pEntry->TxDataPacketByte1SecValue.QuadPart); - printk("LastSecRxBytes = %lld\n", - pEntry->RxDataPacketByte1SecValue.QuadPart); - printk("AverageTXRate(Kbps) = %lld\n", - (pEntry->TxDataPacketByte1SecValue.QuadPart >> - 7)); - printk("AverageRXRate(Kbps) = %lld\n", - (pEntry->RxDataPacketByte1SecValue.QuadPart >> - 7)); - printk("Bandwidth(TX/RX) = %s / %s\n", - get_bw_str(bw), get_bw_str(bw_r)); - printk("STBC(TX/RX) = %d / %d\n", stbc, stbc_r); - printk("LastTXDataRate(Mbps)= %lu\n", DataRate_Tx); - printk("LastRXDataRate(Mbps)= %lu\n", DataRate_Rx); - printk("LastRXMgmtRate(Mbps)= %lu\n", - pEntry->RxLastMgmtPktRate); - printk("LastOneSecPER(prcnt)= %u\n", - pEntry->LastOneSecPER); - printk("RxMICErrorCount = %lld\n", - pEntry->RxMICErrorCount.QuadPart); - printk("RxDecryptionErrorCnt= %lld\n", - pEntry->RxDecryptionErrorCount.QuadPart); - printk("RSSI 0 1 2 3\n"); - printk("Data Rx : %d %d %d %d\n", - pEntry->LastDataPktRssi[0], - pEntry->LastDataPktRssi[1], - pEntry->LastDataPktRssi[2], - pEntry->LastDataPktRssi[3]); - printk("Mgmt Rx : %d %d %d %d\n", - pEntry->LastMgmtPktRssi[0], - pEntry->LastMgmtPktRssi[1], - pEntry->LastMgmtPktRssi[2], - pEntry->LastMgmtPktRssi[3]); - printk("ack Rx : %d %d %d %d\n", - pEntry->RssiSample.AvgRssi[0], - pEntry->RssiSample.AvgRssi[1], - pEntry->RssiSample.AvgRssi[2], - pEntry->RssiSample.AvgRssi[3]); - } - } - return TRUE; -} -INT Set_Enable_RSSI_Stats(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - LONG RssiEnable = os_str_tol(arg, 0, 10); - if (RssiEnable == 1) { - pAd->TXRX_EnableReadRssi = TRUE; - printk("RSSI calculation enabled \n"); - } else if (RssiEnable == 0) { - pAd->TXRX_EnableReadRssi = FALSE; - printk("RSSI calculation disabled \n"); - } else { - printk("Invalid Value \n"); - return FALSE; - } - return TRUE; -} - -INT Set_Enable_Last_Sec_TXRX_Stats(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - LONG TxRxStats = os_str_tol(arg, 0, 10); - if (TxRxStats == 1) { - pAd->EnableTxRxStats = TRUE; - printk("TxRx calculation enabled \n"); - } else if (TxRxStats == 0) { - pAd->EnableTxRxStats = FALSE; - printk("TxRx calculation disabled \n"); - } else { - printk("Invalid Value \n"); - return FALSE; - } - return TRUE; -} -#endif - -#ifdef EAP_STATS_SUPPORT -INT Show_Eap_Stats_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UCHAR Wcid; - MAC_TABLE_ENTRY *pEntry = NULL; - - if (arg == NULL) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Please enter in the format \"iwpriv show eap_stats=\"\n")); - return TRUE; - } - - Wcid = simple_strtol(arg, 0, 10); - - if (!VALID_WCID(Wcid)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Invalid Wcid!!\n")); - return TRUE; - } else { - pEntry = &pAd->MacTab.Content[Wcid]; - if (IS_VALID_ENTRY(pEntry) && IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WCID\tMAC Address\t\tmpdu_attempts\tmpdu_retries\t" - "minimum latency(sec:usec)\tmaximum latency(sec:usec)\taverage latency(sec:usec) \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%d\t%02X:%02X:%02X:%02X:%02X:%02X\t", - pEntry->wcid, PRINT_MAC(pEntry->Addr))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%10lld\t%10lld\t", - pEntry->mpdu_attempts.QuadPart, - pEntry->mpdu_retries.QuadPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%20ld:%ld\t%20ld:%ld\t%20ld:%ld\n", - pEntry->tx_latency_min_tv.tv_sec, - pEntry->tx_latency_min_tv.tv_usec, - pEntry->tx_latency_max_tv.tv_sec, - pEntry->tx_latency_max_tv.tv_usec, - pEntry->tx_latency_avg_tv.tv_sec, - pEntry->tx_latency_avg_tv.tv_usec)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Check pEntry or association state\n")); - return TRUE; - } - } - return TRUE; -} -#endif /* EAP_STATS_SUPPORT */ -INT Show_StaCount_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT i; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - ADD_HT_INFO_IE *addht; - - if (!wdev) - return FALSE; - - addht = wlan_operate_get_addht(wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\nHT Operating Mode : %d\n", - addht->AddHtInfo2.OperaionMode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n\n%-19s%-4s%-12s%-12s%-12s%-12s%-12s%-12s\n", "MAC", "AID", - "TxPackets", "RxPackets", "TxBytes", "RxBytes", "TP(Tx)", - "TP(Rx)")); - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry)) && - (pEntry->Sst == SST_ASSOC)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%02X:%02X:%02X:%02X:%02X:%02X ", - pEntry->Addr[0], pEntry->Addr[1], - pEntry->Addr[2], pEntry->Addr[3], - pEntry->Addr[4], pEntry->Addr[5])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-4d", (int)pEntry->Aid)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-12lu", (ULONG)pEntry->TxPackets.QuadPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-12lu", (ULONG)pEntry->RxPackets.QuadPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-12lu", (ULONG)pEntry->TxBytes)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-12lu", (ULONG)pEntry->RxBytes)); -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%-4u", (UINT32)pEntry->TxBytesMAP)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%-4u", (UINT32)pEntry->RxBytesMAP)); - } -#endif - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%lu %-12s", (pEntry->AvgTxBytes >> 17), - "Mbps")); /* (n Bytes x 8) / (1024*1024) = (n >> 17) */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%lu %-12s", (pEntry->AvgRxBytes >> 17), - "Mbps")); /* (n Bytes x 8) / (1024*1024) = (n >> 17) */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n")); - } - } - - return TRUE; -} - -INT Show_RAInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef NEW_RATE_ADAPT_SUPPORT - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("LowTrafficThrd: %d\n", pAd->CommonCfg.lowTrafficThrd)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TrainUpRule: %d\n", pAd->CommonCfg.TrainUpRule)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TrainUpRuleRSSI: %d\n", pAd->CommonCfg.TrainUpRuleRSSI)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TrainUpLowThrd: %d\n", pAd->CommonCfg.TrainUpLowThrd)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TrainUpHighThrd: %d\n", pAd->CommonCfg.TrainUpHighThrd)); -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#ifdef STREAM_MODE_SUPPORT - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("StreamMode: %d\n", pAd->CommonCfg.StreamMode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("StreamModeMCS: 0x%04x\n", pAd->CommonCfg.StreamModeMCS)); -#endif /* STREAM_MODE_SUPPORT */ -#ifdef TXBF_SUPPORT - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ITxBfEn: %d\n", - pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ITxBfTimeout: %ld\n", pAd->CommonCfg.ITxBfTimeout)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ETxBfTimeout: %ld\n", pAd->CommonCfg.ETxBfTimeout)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CommonCfg.ETxBfEnCond: %ld\n", pAd->CommonCfg.ETxBfEnCond)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ETxBfNoncompress: %d\n", pAd->CommonCfg.ETxBfNoncompress)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ETxBfIncapable: %d\n", pAd->CommonCfg.ETxBfIncapable)); -#ifdef TXBF_DYNAMIC_DISABLE - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucAutoSoundingCtrl: %d\n", - pAd->CommonCfg.ucAutoSoundingCtrl)); -#endif /* TXBF_DYNAMIC_DISABLE */ -#endif /* TXBF_SUPPORT */ - return TRUE; -} - -#ifdef TXBF_SUPPORT -INT Show_TxBfInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - HT_CAPABILITY_IE *ht_cap, HtCapabilityTmp; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - HT_BF_CAP *pTxBFCap; - UCHAR ucBandIdx = 0, ucEBfCap; -#ifdef VHT_TXBF_SUPPORT - VHT_CAP_INFO vht_cap; -#endif /* VHT_TXBF_SUPPORT */ - - if (cap->FlgHwTxBfCap) { - wdev = get_wdev_by_ioctl_idx_and_iftype(pAd, pObj->ioctl_if, - pObj->ioctl_if_type); - if (!wdev) - return FALSE; - - if (wdev->pHObj) { - ucBandIdx = HcGetBandByWdev(wdev); - } - ht_cap = (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - NdisMoveMemory(&HtCapabilityTmp, ht_cap, - sizeof(HT_CAPABILITY_IE)); - if (HcIsBfCapSupport(wdev) == FALSE) { - ucEBfCap = wlan_config_get_etxbf(wdev); - wlan_config_set_etxbf(wdev, SUBF_OFF); - mt_WrapSetETxBFCap(pAd, wdev, &HtCapabilityTmp.TxBFCap); - wlan_config_set_etxbf(wdev, ucEBfCap); - } - pTxBFCap = &HtCapabilityTmp.TxBFCap; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Band Index:%d\n", ucBandIdx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IsBfBand:%d\n", HcIsBfCapSupport(wdev))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CommonCfg.ETxBfEnCond:%ld\n", - pAd->CommonCfg.ETxBfEnCond)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ETxBfEnCond:%d\n", wlan_config_get_etxbf(wdev))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CommonCfg.ITxBfEn:%d\n", - pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ITxBfEn:%d\n", wlan_config_get_itxbf(wdev))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("HT TxBF Cap:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" TxBFRecCapable:%d\n", pTxBFCap->TxBFRecCapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" RxSoundCapable:%d\n", pTxBFCap->RxSoundCapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" TxSoundCapable:%d\n", pTxBFCap->TxSoundCapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" RxNDPCapable:%d\n", pTxBFCap->RxNDPCapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" TxNDPCapable:%d\n", pTxBFCap->TxNDPCapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ImpTxBFCapable:%d\n", pTxBFCap->ImpTxBFCapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Calibration:%d\n", pTxBFCap->Calibration)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ExpCSICapable:%d\n", pTxBFCap->ExpCSICapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ExpNoComSteerCapable:%d\n", - pTxBFCap->ExpNoComSteerCapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ExpComSteerCapable:%d\n", - pTxBFCap->ExpComSteerCapable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ExpCSIFbk:%d\n", pTxBFCap->ExpCSIFbk)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ExpNoComBF:%d\n", pTxBFCap->ExpNoComBF)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ExpComBF:%d\n", pTxBFCap->ExpComBF)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" MinGrouping:%d\n", pTxBFCap->MinGrouping)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" CSIBFAntSup:%d\n", pTxBFCap->CSIBFAntSup)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" NoComSteerBFAntSup:%d\n", - pTxBFCap->NoComSteerBFAntSup)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ComSteerBFAntSup:%d\n", - pTxBFCap->ComSteerBFAntSup)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" CSIRowBFSup:%d\n", pTxBFCap->CSIRowBFSup)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ChanEstimation:%d\n", pTxBFCap->ChanEstimation)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" rsv:%d\n", pTxBFCap->rsv)); - -#ifdef VHT_TXBF_SUPPORT - NdisCopyMemory(&vht_cap, &pAd->CommonCfg.vht_cap_ie.vht_cap, - sizeof(VHT_CAP_INFO)); - - ucEBfCap = wlan_config_get_etxbf(wdev); - if (HcIsBfCapSupport(wdev) == FALSE) { - wlan_config_set_etxbf(wdev, SUBF_OFF); - } - mt_WrapSetVHTETxBFCap(pAd, wdev, &vht_cap); - wlan_config_set_etxbf(wdev, ucEBfCap); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("VHT TxBF Cap:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" num_snd_dimension:%d\n", - vht_cap.num_snd_dimension)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" bfee_sts_cap:%d\n", vht_cap.bfee_sts_cap)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" bfee_cap_su:%d\n", vht_cap.bfee_cap_su)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" bfer_cap_su:%d\n", vht_cap.bfer_cap_su)); - -#endif /* VHT_TXBF_SUPPORT */ - } - return TRUE; -} -#endif /* TXBF_SUPPORT */ - -#ifdef RTMP_MAC_PCI -#ifdef DBG_DIAGNOSE -INT Set_DiagOpt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - ULONG diagOpt; - /*POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; */ - diagOpt = os_str_tol(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DiagOpt=%ld!\n", diagOpt)); - return TRUE; -} - -INT Set_diag_cond_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 cond; - - cond = os_str_tol(arg, 0, 10); - pAd->DiagStruct.diag_cond = cond; - return TRUE; -} - -INT Show_Diag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - RtmpDiagStruct *pDiag = NULL; - UCHAR i, start, stop, que_idx; - unsigned long irqFlags; - - os_alloc_mem(pAd, (UCHAR **)&pDiag, sizeof(RtmpDiagStruct)); - - if (!pDiag) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():AllocMem failed!\n", __func__)); - return FALSE; - } - - RTMP_IRQ_LOCK(&pAd->irq_lock, irqFlags); - NdisMoveMemory(pDiag, &pAd->DiagStruct, sizeof(RtmpDiagStruct)); - RTMP_IRQ_UNLOCK(&pAd->irq_lock, irqFlags); - - if (pDiag->inited == FALSE) - goto done; - - start = pDiag->ArrayStartIdx; - stop = pDiag->ArrayCurIdx; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Start=%d, stop=%d!\n\n", start, stop)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %-12s", "Time(Sec)")); - - for (i = 1; i < DIAGNOSE_TIME; i++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-7d", i)); - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n -------------------------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Tx Info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %-12s", "TxDataCnt\n")); - - for (que_idx = 0; que_idx < WMM_NUM_OF_AC; que_idx++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tQueue[%d]:", que_idx)); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-7d", - pDiag->diag_info[i].TxDataCnt[que_idx])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %-12s", "TxFailCnt")); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-7d", pDiag->diag_info[i].TxFailCnt)); - -#ifdef DBG_TX_AGG_CNT - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %-12s", "TxAggCnt")); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-7d", pDiag->diag_info[i].TxAggCnt)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); -#endif /* DBG_TX_AGG_CNT */ -#ifdef DBG_TXQ_DEPTH - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DeQueue Info:\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %-12s\n", "DeQueueFunc Called Distribution")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\t")); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-8d", pDiag->diag_info[i].deq_called)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %-12s\n", "DeQueueRound(Per-Call) Distribution")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\t")); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-8d", pDiag->diag_info[i].deq_round)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %-12s\n", "DeQueueCount(Per-Round) Distribution")); - - for (SwQNumLevel = 0; SwQNumLevel < 9; SwQNumLevel++) { - if (SwQNumLevel == 8) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t>%-5d", SwQNumLevel)); - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%-6d", SwQNumLevel)); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-7d", - pDiag->diag_info[i].deq_cnt[SwQNumLevel])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %-12s%d", "Sw-Queued TxSwQCnt for WCID ", - pDiag->wcid)); - - for (que_idx = 0; que_idx < WMM_NUM_OF_AC; que_idx++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %s[%d]\n", "Queue", que_idx)); - - for (SwQNumLevel = 0; SwQNumLevel < 9; SwQNumLevel++) { - if (SwQNumLevel == 8) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t>%-5d", SwQNumLevel)); - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t%-6d", SwQNumLevel)); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%-7d", - pDiag->diag_info[i] - .TxSWQueCnt[que_idx] - [SwQNumLevel])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n")); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %-12s\n", "TxEnQFailCnt")); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%-7d", - pDiag->diag_info[i].enq_fall_cnt[que_idx])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %s\n", "DeQueFailedCnt:Reason NotTxResource")); - - for (que_idx = 0; que_idx < WMM_NUM_OF_AC; que_idx++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %s[%d]:", "Queue", que_idx)); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%-7d", - pDiag->diag_info[i] - .deq_fail_no_resource_cnt[que_idx])); - } - -#endif /* DBG_TXQ_DEPTH */ -#ifdef DOT11_N_SUPPORT -#ifdef DBG_TX_AGG_CNT - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %-12s\n", "Tx-Agged AMPDUCnt")); - - for (McsIdx = 0; McsIdx < 16; McsIdx++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%-6d", (McsIdx + 1))); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%d(%d%%) ", - pDiag->diag_info[i].TxAMPDUCnt[McsIdx], - pDiag->diag_info[i].TxAMPDUCnt[McsIdx] ? - (pDiag->diag_info[i] - .TxAMPDUCnt[McsIdx] * - 100 / pDiag->diag_info[i].TxAggCnt) : - 0)); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\n")); - } - -#endif /* DBG_TX_AGG_CNT */ -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Rx Info\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %-12s", "RxDataCnt")); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-7d", pDiag->diag_info[i].RxDataCnt)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n %-12s", "RxCrcErrCnt")); - - for (i = start; i != stop; i = (i + 1) % DIAGNOSE_TIME) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-7d", pDiag->diag_info[i].RxCrcErrCnt)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n-------------\n")); -done: - os_free_mem(pDiag); - return TRUE; -} -#endif /* DBG_DIAGNOSE */ -#endif /* RTMP_MAC_PCI */ - -INT Show_Sat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 temperature = 0; - - RTMP_GET_TEMPERATURE(pAd, &temperature); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CurrentTemperature = %d\n", temperature)); - - /* Sanity check for calculation of sucessful count */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TransmitCountFromOS = %d\n", - pAd->WlanCounters[0].TransmitCountFrmOs.u.LowPart)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TransmittedFragmentCount = %lld\n", - (INT64)pAd->WlanCounters[0].TransmittedFragmentCount.u.LowPart + - pAd->WlanCounters[0] - .MulticastTransmittedFrameCount.QuadPart)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MulticastTransmittedFrameCount = %d\n", - pAd->WlanCounters[0].MulticastTransmittedFrameCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("FailedCount = %d\n", - pAd->WlanCounters[0].FailedCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RetryCount = %d\n", - pAd->WlanCounters[0].RetryCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MultipleRetryCount = %d\n", - pAd->WlanCounters[0].MultipleRetryCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTSSuccessCount = %d\n", - pAd->WlanCounters[0].RTSSuccessCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTSFailureCount = %d\n", - pAd->WlanCounters[0].RTSFailureCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ACKFailureCount = %d\n", - pAd->WlanCounters[0].ACKFailureCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("FrameDuplicateCount = %d\n", - pAd->WlanCounters[0].FrameDuplicateCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ReceivedFragmentCount = %d\n", - pAd->WlanCounters[0].ReceivedFragmentCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MulticastReceivedFrameCount = %d\n", - pAd->WlanCounters[0].MulticastReceivedFrameCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Rx drop due to out of resource = %ld\n", - (ULONG)pAd->Counters8023.RxNoBuffer)); -#ifdef DBG - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RealFcsErrCount = %d\n", - pAd->RalinkCounters.RealFcsErrCount.u.LowPart)); -#else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("FCSErrorCount = %d\n", - pAd->WlanCounters[0].FCSErrorCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("FrameDuplicateCount.LowPart = %d\n", - pAd->WlanCounters[0].FrameDuplicateCount.u.LowPart / 100)); -#endif - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TransmittedFrameCount = %d\n", - pAd->WlanCounters[0].TransmittedFragmentCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("WEPUndecryptableCount = %d\n", - pAd->WlanCounters[0].WEPUndecryptableCount.u.LowPart)); -#ifdef OUI_CHECK_SUPPORT - { - INT32 i = 0; - - for (i = 0; i < DBDC_BAND_NUM; i++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("band %d RxHWLookupWcidMismatchCount = %ld\n", - i, - (ULONG)pAd->WlanCounters[i] - .RxHWLookupWcidErrCount.u.LowPart)); - } -#endif -#ifdef DOT11_N_SUPPORT - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n===Some 11n statistics variables:\n")); - /* Some 11n statistics variables */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TxAMSDUCount = %ld\n", - (ULONG)pAd->RalinkCounters.TxAMSDUCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RxAMSDUCount = %ld\n", - (ULONG)pAd->RalinkCounters.RxAMSDUCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TransmittedAMPDUCount = %ld\n", - (ULONG)pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TransmittedMPDUsInAMPDUCount = %ld\n", - (ULONG)pAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u - .LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TransmittedOctetsInAMPDUCount = %ld\n", - (ULONG)pAd->RalinkCounters.TransmittedOctetsInAMPDUCount.u - .LowPart)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MPDUInReceivedAMPDUCount = %ld\n", - (ULONG)pAd->RalinkCounters.MPDUInReceivedAMPDUCount.u.LowPart)); -#ifdef DOT11N_DRAFT3 - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("fAnyStaFortyIntolerant=%d\n", - pAd->MacTab.fAnyStaFortyIntolerant)); -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - { - int apidx; - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("-- IF-ra%d --\n", apidx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Packets Received = %ld\n", - (ULONG)pAd->ApCfg.MBSSID[apidx].RxCount)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Packets Sent = %ld\n", - (ULONG)pAd->ApCfg.MBSSID[apidx].TxCount)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Bytes Received = %ld\n", - (ULONG)pAd->ApCfg.MBSSID[apidx] - .ReceivedByteCount)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Byte Sent = %ld\n", - (ULONG)pAd->ApCfg.MBSSID[apidx] - .TransmittedByteCount)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error Packets Received = %ld\n", - (ULONG)pAd->ApCfg.MBSSID[apidx].RxErrorCount)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Drop Received Packets = %ld\n", - (ULONG)pAd->ApCfg.MBSSID[apidx].RxDropCount)); -#ifdef WSC_INCLUDED - - if (pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscConfMode != - WSC_DISABLE) { - WSC_CTRL *pWscCtrl; - - pWscCtrl = &pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("WscInfo:\n" - "\tWscConfMode=%d\n" - "\tWscMode=%s\n" - "\tWscConfStatus=%d\n" - "\tWscPinCode=%d\n" - "\tWscState=0x%x\n" - "\tWscStatus=0x%x\n", - pWscCtrl->WscConfMode, - ((pWscCtrl->WscMode == WSC_PIN_MODE) ? - "PIN" : - "PBC"), - pWscCtrl->WscConfStatus, - pWscCtrl->WscEnrolleePinCode, - pWscCtrl->WscState, - pWscCtrl->WscStatus)); - } - -#endif /* WSC_INCLUDED */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("-- IF-ra%d end --\n", apidx)); - } - } - { - int i, j, k, maxMcs = MAX_MCS_SET - 1; - PMAC_TABLE_ENTRY pEntry; - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("\n%02x:%02x:%02x:%02x:%02x:%02x - ", - PRINT_MAC(pEntry->Addr))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%-4d\n", (int)pEntry->Aid)); - - for (j = maxMcs; j >= 0; j--) { - if ((pEntry->TXMCSExpected[j] != 0) || - (pEntry->TXMCSFailed[j] != 0)) { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("MCS[%02d]: Expected %u, Successful %u (%d%%), Failed %u\n", - j, - pEntry->TXMCSExpected[j], - pEntry->TXMCSSuccessful - [j], - pEntry->TXMCSExpected[j] ? - (100 * - pEntry->TXMCSSuccessful - [j]) / - pEntry->TXMCSExpected - [j] : - 0, - pEntry->TXMCSFailed[j])); - - for (k = maxMcs; k >= 0; k--) { - if (pEntry->TXMCSAutoFallBack - [j][k] != - 0) { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("\t\t\tAutoMCS[%02d]: %u (%d%%)\n", - k, - pEntry->TXMCSAutoFallBack - [j] - [k], - (100 * - pEntry->TXMCSAutoFallBack - [j] - [k]) / - pEntry->TXMCSExpected - [j])); - } - } - } - } - } - } - } - -#ifdef CONFIG_HOTSPOT - { - PHOTSPOT_CTRL pHSCtrl; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - PGAS_CTRL pGASCtrl = &pAd->ApCfg.MBSSID[apidx].GASCtrl; -#ifdef CONFIG_DOT11V_WNM - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[apidx].WNMCtrl; -#endif - pHSCtrl = &pAd->ApCfg.MBSSID[apidx].HotSpotCtrl; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("hotspot enable = %d\n", - pHSCtrl->HotSpotEnable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("daemon ready = %d\n", - pHSCtrl->HSDaemonReady)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("hotspot DGAFDisable = %d\n", - pHSCtrl->DGAFDisable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("hotspot L2Filter = %d\n", - pHSCtrl->L2Filter)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("hotspot ICMPv4Deny = %d\n", - pHSCtrl->ICMPv4Deny)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("hotspot QosMapEnable = %d\n", - pHSCtrl->QosMapEnable)); -#ifdef CONFIG_DOT11V_WNM - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("proxy arp enable = %d\n", - pWNMCtrl->ProxyARPEnable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("WNMNotify enable = %d\n", - pWNMCtrl->WNMNotifyEnable)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("hotspot OSEN enable = %d\n", - pHSCtrl->bASANEnable)); -#endif - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("GAS come back delay = %d\n", - pGASCtrl->cb_delay)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - } -#endif /* CONFIG_HOTSPOT */ -#if defined(CONFIG_DOT11V_WNM) && !defined(CONFIG_HOTSPOT) - { - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WNMCtrl; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("WNM BSS Transition Management enable = %d\n", - pWNMCtrl->WNMBTMEnable)); - } -#endif -#ifdef CONFIG_DOT11U_INTERWORKING - { - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - PGAS_CTRL pGASCtrl = &pAd->ApCfg.MBSSID[apidx].GASCtrl; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("GAS enable = %d\n", - pGASCtrl->b11U_enable)); - } -#endif /* CONFIG_DOT11U_INTERWORKING */ - -#ifdef DOT11_N_SUPPORT - /* Display Tx Aggregation statistics */ - DisplayTxAgg(pAd); -#endif /* DOT11_N_SUPPORT */ - return TRUE; -} - -INT Show_Sat_Reset_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* Sanity check for calculation of sucessful count */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("TransmittedFragmentCount = %lld\n", - (INT64)pAd->WlanCounters[0].TransmittedFragmentCount.u.LowPart + - pAd->WlanCounters[0] - .MulticastTransmittedFrameCount.QuadPart)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MulticastTransmittedFrameCount = %d\n", - pAd->WlanCounters[0].MulticastTransmittedFrameCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("FailedCount = %d\n", - pAd->WlanCounters[0].FailedCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RetryCount = %d\n", - pAd->WlanCounters[0].RetryCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MultipleRetryCount = %d\n", - pAd->WlanCounters[0].MultipleRetryCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTSSuccessCount = %d\n", - pAd->WlanCounters[0].RTSSuccessCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTSFailureCount = %d\n", - pAd->WlanCounters[0].RTSFailureCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ACKFailureCount = %d\n", - pAd->WlanCounters[0].ACKFailureCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("FrameDuplicateCount = %d\n", - pAd->WlanCounters[0].FrameDuplicateCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ReceivedFragmentCount = %d\n", - pAd->WlanCounters[0].ReceivedFragmentCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MulticastReceivedFrameCount = %d\n", - pAd->WlanCounters[0].MulticastReceivedFrameCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rx drop due to out of resource = %ld\n", - (ULONG)pAd->Counters8023.RxNoBuffer)); -#ifdef DBG - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RealFcsErrCount = %d\n", - pAd->RalinkCounters.RealFcsErrCount.u.LowPart)); -#else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("FCSErrorCount = %d\n", - pAd->WlanCounters[0].FCSErrorCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("FrameDuplicateCount.LowPart = %d\n", - pAd->WlanCounters[0].FrameDuplicateCount.u.LowPart / 100)); -#endif - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("TransmittedFrameCount = %d\n", - pAd->WlanCounters[0].TransmittedFrameCount.u.LowPart)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WEPUndecryptableCount = %d\n", - pAd->WlanCounters[0].WEPUndecryptableCount.u.LowPart)); - pAd->WlanCounters[0].TransmittedFragmentCount.u.LowPart = 0; - pAd->WlanCounters[0].MulticastTransmittedFrameCount.u.LowPart = 0; - pAd->WlanCounters[0].FailedCount.u.LowPart = 0; - pAd->WlanCounters[0].RetryCount.u.LowPart = 0; - pAd->WlanCounters[0].MultipleRetryCount.u.LowPart = 0; - pAd->WlanCounters[0].RTSSuccessCount.u.LowPart = 0; - pAd->WlanCounters[0].RTSFailureCount.u.LowPart = 0; - pAd->WlanCounters[0].ACKFailureCount.u.LowPart = 0; - pAd->WlanCounters[0].FrameDuplicateCount.u.LowPart = 0; - pAd->WlanCounters[0].ReceivedFragmentCount.u.LowPart = 0; - pAd->WlanCounters[0].MulticastReceivedFrameCount.u.LowPart = 0; - pAd->Counters8023.RxNoBuffer = 0; -#ifdef DBG - pAd->RalinkCounters.RealFcsErrCount.u.LowPart = 0; -#else - pAd->WlanCounters[0].FCSErrorCount.u.LowPart = 0; - pAd->WlanCounters[0].FrameDuplicateCount.u.LowPart = 0; -#endif - pAd->WlanCounters[0].TransmittedFrameCount.u.LowPart = 0; - pAd->WlanCounters[0].WEPUndecryptableCount.u.LowPart = 0; - { - int i, j, k, maxMcs = 15; - PMAC_TABLE_ENTRY pEntry; - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\n%02X:%02X:%02X:%02X:%02X:%02X - ", - pEntry->Addr[0], pEntry->Addr[1], - pEntry->Addr[2], pEntry->Addr[3], - pEntry->Addr[4], pEntry->Addr[5])); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%-4d\n", (int)pEntry->Aid)); - - for (j = maxMcs; j >= 0; j--) { - if ((pEntry->TXMCSExpected[j] != 0) || - (pEntry->TXMCSFailed[j] != 0)) { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("MCS[%02d]: Expected %u, Successful %u (%d%%), Failed %u\n", - j, - pEntry->TXMCSExpected[j], - pEntry->TXMCSSuccessful - [j], - pEntry->TXMCSExpected[j] ? - (100 * - pEntry->TXMCSSuccessful - [j]) / - pEntry->TXMCSExpected - [j] : - 0, - pEntry->TXMCSFailed[j])); - - for (k = maxMcs; k >= 0; k--) { - if (pEntry->TXMCSAutoFallBack - [j][k] != - 0) { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\t\t\tAutoMCS[%02d]: %u (%d%%)\n", - k, - pEntry->TXMCSAutoFallBack - [j] - [k], - (100 * - pEntry->TXMCSAutoFallBack - [j] - [k]) / - pEntry->TXMCSExpected - [j])); - } - } - } - } - } - - for (j = 0; j < (maxMcs + 1); j++) { - pEntry->TXMCSExpected[j] = 0; - pEntry->TXMCSSuccessful[j] = 0; - pEntry->TXMCSFailed[j] = 0; - - for (k = maxMcs; k >= 0; k--) - pEntry->TXMCSAutoFallBack[j][k] = 0; - } - } - } -#ifdef DOT11_N_SUPPORT - /* Display Tx Aggregation statistics */ - DisplayTxAgg(pAd); -#endif /* DOT11_N_SUPPORT */ - return TRUE; -} - -#ifdef MAT_SUPPORT -INT Show_MATTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - extern VOID dumpIPMacTb(MAT_STRUCT * pMatCfg, int index); - extern NDIS_STATUS dumpSesMacTb(MAT_STRUCT * pMatCfg, int hashIdx); - extern NDIS_STATUS dumpUidMacTb(MAT_STRUCT * pMatCfg, int hashIdx); - extern NDIS_STATUS dumpIPv6MacTb(MAT_STRUCT * pMatCfg, int hashIdx); - dumpIPMacTb(&pAd->MatCfg, -1); - dumpSesMacTb(&pAd->MatCfg, -1); - dumpUidMacTb(&pAd->MatCfg, -1); - dumpIPv6MacTb(&pAd->MatCfg, -1); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Default BroadCast Address=%02x:%02x:%02x:%02x:%02x:%02x!\n", - BROADCAST_ADDR[0], BROADCAST_ADDR[1], BROADCAST_ADDR[2], - BROADCAST_ADDR[3], BROADCAST_ADDR[4], BROADCAST_ADDR[5])); - return TRUE; -} -#endif /* MAT_SUPPORT */ - -#ifdef DOT1X_SUPPORT -/* - ========================================================================== - Description: - UI should not call this function, it only used by 802.1x daemon - Arguments: - pAd Pointer to our adapter - wrq Pointer to the ioctl argument - ========================================================================== -*/ -VOID RTMPIoctlAddPMKIDCache(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - UCHAR apidx; - NDIS_AP_802_11_KEY *pKey; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - apidx = (UCHAR)pObj->ioctl_if; - pKey = (PNDIS_AP_802_11_KEY)wrq->u.data.pointer; - pSecConfig = &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - - if (IS_AKM_WPA2(pSecConfig->AKMMap) || - IS_AKM_WPA3_192BIT(pSecConfig->AKMMap)) { - if (pKey->KeyLength == 32) { - UCHAR digest[80], PMK_key[20], macaddr[MAC_ADDR_LEN]; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: pKey->KeyLength = %d\n", __func__, - pKey->KeyLength)); - /* Calculate PMKID */ - NdisMoveMemory(&PMK_key[0], "PMK Name", 8); - NdisMoveMemory(&PMK_key[8], - pAd->ApCfg.MBSSID[apidx].wdev.bssid, - MAC_ADDR_LEN); - NdisMoveMemory(&PMK_key[14], pKey->addr, MAC_ADDR_LEN); - if (IS_AKM_SHA384(pSecConfig->AKMMap)) - RT_HMAC_SHA384(pKey->KeyMaterial, - LEN_PMK_SHA384, PMK_key, 20, - digest, LEN_PMKID); -#ifdef OCE_FILS_SUPPORT - /* Todo: why PMF sha256 didn't use it before ? */ - else if (IS_AKM_FILS_SHA256(pSecConfig->AKMMap)) { - RT_HMAC_SHA256(pKey->KeyMaterial, LEN_PMK, - PMK_key, 20, digest, LEN_PMKID); - } -#endif /* OCE_FILS_SUPPORT */ - else - RT_HMAC_SHA1(pKey->KeyMaterial, LEN_PMK, - PMK_key, 20, digest, - SHA1_DIGEST_SIZE); - NdisMoveMemory(macaddr, pKey->addr, MAC_ADDR_LEN); - RTMPAddPMKIDCache(&pAd->ApCfg.PMKIDCache, apidx, - macaddr, digest, pKey->KeyMaterial, - pKey->KeyLength); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPA2(pre-auth):(%02x:%02x:%02x:%02x:%02x:%02x)Calc PMKID=%02x:%02x:%02x:%02x:%02x:%02x\n", - pKey->addr[0], pKey->addr[1], pKey->addr[2], - pKey->addr[3], pKey->addr[4], pKey->addr[5], - digest[0], digest[1], digest[2], digest[3], - digest[4], digest[5])); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("PMK =%02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\n", - pKey->KeyMaterial[0], pKey->KeyMaterial[1], - pKey->KeyMaterial[2], pKey->KeyMaterial[3], - pKey->KeyMaterial[4], pKey->KeyMaterial[5], - pKey->KeyMaterial[6], pKey->KeyMaterial[7])); - } else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set::RT_OID_802_11_WPA2_ADD_PMKID_CACHE ERROR or is wep key\n")); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<== RTMPIoctlAddPMKIDCache\n")); -} - -/* - ========================================================================== - Description: - UI should not call this function, it only used by 802.1x daemon - Arguments: - pAd Pointer to our adapter - wrq Pointer to the ioctl argument - ========================================================================== -*/ -VOID RTMPIoctlStaticWepCopy(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - MAC_TABLE_ENTRY *pEntry; - UCHAR MacAddr[MAC_ADDR_LEN]; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = (UCHAR)pObj->ioctl_if; - ASIC_SEC_INFO Info = { 0 }; - UCHAR KeyIdx; - UINT32 len; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTMPIoctlStaticWepCopy-IF(ra%d)\n", apidx)); - - if (wrq->u.data.length != sizeof(MacAddr)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTMPIoctlStaticWepCopy: the length isn't match (%d)\n", - wrq->u.data.length)); - return; - } - - len = copy_from_user(&MacAddr, wrq->u.data.pointer, wrq->u.data.length); - pEntry = MacTableLookup(pAd, MacAddr); - - if (!pEntry) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTMPIoctlStaticWepCopy: the mac address isn't match\n")); - return; - } - - KeyIdx = pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PairwiseKeyId; - - /* need to copy the default shared-key to pairwise key table for this entry in 802.1x mode */ - if (pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.WepKey[KeyIdx].KeyLen == - 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR: Can not get Default shared-key (index-%d)\n", - KeyIdx)); - return; - } - - pEntry->SecConfig.AKMMap = - pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.AKMMap; - pEntry->SecConfig.PairwiseCipher = - pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PairwiseCipher; - pEntry->SecConfig.PairwiseKeyId = - pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PairwiseKeyId; - NdisMoveMemory(pEntry->SecConfig.WepKey, - pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.WepKey, - sizeof(SEC_KEY_INFO) * SEC_KEY_NUM); - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pEntry->wcid; - Info.BssIndex = pEntry->func_tb_idx; - Info.Cipher = pEntry->SecConfig.PairwiseCipher; - Info.KeyIdx = pEntry->SecConfig.PairwiseKeyId; - os_move_mem(&Info.PeerAddr[0], pEntry->Addr, MAC_ADDR_LEN); - HW_ADDREMOVE_KEYTABLE(pAd, &Info); -} - -/* - ========================================================================== - Description: - UI should not call this function, it only used by 802.1x daemon - Arguments: - pAd Pointer to our adapter - wrq Pointer to the ioctl argument - ========================================================================== -*/ -VOID RTMPIoctlSetIdleTimeout(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - MAC_TABLE_ENTRY *pEntry; - PDOT1X_IDLE_TIMEOUT pIdleTime; - - if (wrq->u.data.length != sizeof(DOT1X_IDLE_TIMEOUT)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : the length is mis-match\n", __func__)); - return; - } - - pIdleTime = (PDOT1X_IDLE_TIMEOUT)wrq->u.data.pointer; - pEntry = MacTableLookup(pAd, pIdleTime->StaAddr); - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : the entry is empty\n", __func__)); - return; - } - - pEntry->NoDataIdleCount = 0; - /* TODO: shiang-usw, remove upper setting becasue we need to migrate to tr_entry! */ - pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0; - pEntry->StaIdleTimeout = pIdleTime->idle_timeout; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Update Idle-Timeout(%d) from dot1x daemon\n", __func__, - pEntry->StaIdleTimeout)); -} - -#ifdef RADIUS_MAC_ACL_SUPPORT -PRT_802_11_RADIUS_ACL_ENTRY RadiusFindAclEntry(PLIST_HEADER pCacheList, - IN PUCHAR pMacAddr) -{ - PRT_802_11_RADIUS_ACL_ENTRY pAclEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = pCacheList->pHead; - pAclEntry = (PRT_802_11_RADIUS_ACL_ENTRY)pListEntry; - - while (pAclEntry != NULL) { - if (NdisEqualMemory(pAclEntry->Addr, pMacAddr, MAC_ADDR_LEN)) - return pAclEntry; - - pListEntry = pListEntry->pNext; - pAclEntry = (PRT_802_11_RADIUS_ACL_ENTRY)pListEntry; - } - - return NULL; -} - -VOID RTMPIoctlAddRadiusMacAuthCache(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - RT_802_11_ACL_ENTRY newCache; - UCHAR apidx; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - PRT_802_11_RADIUS_ACL_ENTRY pAclEntry = NULL; - - apidx = (UCHAR)pObj->ioctl_if; - - if (pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.RadiusMacAuthCache.Policy != - RADIUS_MAC_AUTH_ENABLE) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RADIUS_MAC_AUTH Function State in Disable.\n")); - return; - } - - /* From userSpace struct using RT_802_11_ACL_ENTRY */ - if (wrq->u.data.length != sizeof(RT_802_11_ACL_ENTRY)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s : the length is mis-match\n", __func__)); - return; - } - - copy_from_user(&newCache, wrq->u.data.pointer, wrq->u.data.length); - pAclEntry = RadiusFindAclEntry( - &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.cacheList, - newCache.Addr); - - if (pAclEntry) { - /* Replace the Cache if exist */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%d] Found %02x:%02x:%02x:%02x:%02x:%02x in Cache And Update Result to %d.\n", - apidx, PRINT_MAC(newCache.Addr), newCache.Rsv)); - pAclEntry->result = newCache.Rsv; - return; - } - - /* Add new Cache */ - os_alloc_mem(NULL, (UCHAR **)&pAclEntry, - sizeof(RT_802_11_RADIUS_ACL_ENTRY)); - - if (pAclEntry) { - NdisZeroMemory(pAclEntry, sizeof(RT_802_11_RADIUS_ACL_ENTRY)); - pAclEntry->pNext = NULL; - NdisMoveMemory(pAclEntry->Addr, newCache.Addr, MAC_ADDR_LEN); - pAclEntry->result = newCache.Rsv; - insertTailList( - &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.cacheList, - (RT_LIST_ENTRY *)pAclEntry); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%d] New %02x:%02x:%02x:%02x:%02x:%02x res(%d) in Cache(%d).\n", - apidx, PRINT_MAC(pAclEntry->Addr), pAclEntry->result, - pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.cacheList - .size)); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Error in alloc mem in New Radius ACL Function.\n")); -} - -VOID RTMPIoctlDelRadiusMacAuthCache(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - UCHAR apidx; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - RT_LIST_ENTRY *pListEntry = NULL; - UCHAR macBuf[MAC_ADDR_LEN]; - - apidx = (UCHAR)pObj->ioctl_if; - - if (wrq->u.data.length != MAC_ADDR_LEN) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s : the length is mis-match\n", __func__)); - return; - } - - copy_from_user(&macBuf, wrq->u.data.pointer, wrq->u.data.length); - pListEntry = (RT_LIST_ENTRY *)RadiusFindAclEntry( - &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.cacheList, - macBuf); - - if (pListEntry) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%d]Del %02x:%02x:%02x:%02x:%02x:%02x in Cache(%d).\n", - apidx, PRINT_MAC(macBuf), - pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.cacheList - .size)); - delEntryList( - &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.cacheList, - pListEntry); - os_free_mem(pListEntry); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%d]STA %02x:%02x:%02x:%02x:%02x:%02x not in Cache.\n", - apidx, PRINT_MAC(macBuf))); - } -} - -VOID RTMPIoctlClearRadiusMacAuthCache(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = (UCHAR)pObj->ioctl_if; - RT_LIST_ENTRY *pListEntry = NULL; - PLIST_HEADER pListHeader = - &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.cacheList; - - if (pListHeader->size == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%d] Radius ACL Cache already in empty.\n", apidx)); - return; - } - - pListEntry = pListHeader->pHead; - - while (pListEntry != NULL) { - /*Remove ListEntry from Header*/ - removeHeadList(pListHeader); - os_free_mem(pListEntry); - pListEntry = pListHeader->pHead; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Clean [%d] Radius ACL Cache.\n", apidx)); -} -#endif /* RADIUS_MAC_ACL_SUPPORT */ - -VOID RTMPIoctlQueryStaAid(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - DOT1X_QUERY_STA_AID macBuf; - MAC_TABLE_ENTRY *pEntry = NULL; - - if (wrq->u.data.length != sizeof(DOT1X_QUERY_STA_AID)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : the length is mis-match\n", __func__)); - return; - } - - if (copy_from_user(&macBuf, wrq->u.data.pointer, wrq->u.data.length)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: copy_to_user() fail\n", __func__)); - return; - } - - pEntry = MacTableLookup(pAd, macBuf.StaAddr); - - if (pEntry != NULL) { - wrq->u.data.length = sizeof(DOT1X_QUERY_STA_AID); - macBuf.aid = pEntry->Aid; - macBuf.wcid = pEntry->wcid; - - if (copy_to_user(wrq->u.data.pointer, &macBuf, - wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: copy_to_user() fail\n", __func__)); - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_DOT1X_QUERY_STA_AID(%02x:%02x:%02x:%02x:%02x:%02x, AID=%d)\n", - PRINT_MAC(macBuf.StaAddr), macBuf.aid)); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_DOT1X_QUERY_STA_AID(%02x:%02x:%02x:%02x:%02x:%02x, Not Found)\n", - PRINT_MAC(macBuf.StaAddr))); - } -} - -VOID RTMPIoctlQueryStaRsn(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - struct DOT1X_QUERY_STA_RSN sta_rsn; - MAC_TABLE_ENTRY *pEntry = NULL; - - if (wrq->u.data.length != sizeof(struct DOT1X_QUERY_STA_RSN)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SUITEB, DBG_LVL_ERROR, - ("%s : the length is mis-match\n", __func__)); - return; - } - - if (copy_from_user(&sta_rsn, wrq->u.data.pointer, wrq->u.data.length)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SUITEB, DBG_LVL_ERROR, - ("%s: copy_to_user() fail\n", __func__)); - return; - } - - pEntry = MacTableLookup(pAd, sta_rsn.sta_addr); - - if (pEntry != NULL) { - wrq->u.data.length = sizeof(struct DOT1X_QUERY_STA_RSN); - sta_rsn.akm = pEntry->SecConfig.AKMMap; - sta_rsn.pairwise_cipher = pEntry->SecConfig.PairwiseCipher; - sta_rsn.group_cipher = pEntry->SecConfig.GroupCipher; -#ifdef DOT11W_PMF_SUPPORT - sta_rsn.group_mgmt_cipher = - pEntry->SecConfig.PmfCfg.igtk_cipher; -#else - sta_rsn.group_mgmt_cipher = 0; -#endif - - if (copy_to_user(wrq->u.data.pointer, &sta_rsn, - wrq->u.data.length)) - MTWF_LOG(DBG_CAT_SEC, CATSEC_SUITEB, DBG_LVL_ERROR, - ("%s: copy_to_user() fail\n", __func__)); - - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SUITEB, DBG_LVL_TRACE, - ("Query::OID_802_DOT1X_QUERY_STA_RSN(%02x:%02x:%02x:%02x:%02x:%02x)\n", - PRINT_MAC(sta_rsn.sta_addr))); - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SUITEB, DBG_LVL_TRACE, - ("%s: AKM=%x, pairwise=%x, group_cipher=%x, group_mgmt_cipher=%x\n", - __func__, sta_rsn.akm, sta_rsn.pairwise_cipher, - sta_rsn.group_cipher, sta_rsn.group_mgmt_cipher)); - } else { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SUITEB, DBG_LVL_TRACE, - ("Query::OID_802_DOT1X_QUERY_STA_RSN(%02x:%02x:%02x:%02x:%02x:%02x, Not Found)\n", - PRINT_MAC(sta_rsn.sta_addr))); - } -} - -#ifdef RADIUS_ACCOUNTING_SUPPORT -VOID RTMPIoctlQueryStaData(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - DOT1X_QUERY_STA_DATA macBuf; - MAC_TABLE_ENTRY *pEntry = NULL; - INT Status; - - if (wrq->u.data.length != sizeof(DOT1X_QUERY_STA_DATA)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : the length is mis-match\n", __func__)); - return; - } - - Status = copy_from_user(&macBuf, wrq->u.data.pointer, - wrq->u.data.length); - pEntry = MacTableLookup(pAd, macBuf.StaAddr); - - if (pEntry != NULL) { - wrq->u.data.length = sizeof(DOT1X_QUERY_STA_DATA); - macBuf.rx_bytes = pEntry->RxBytes; - macBuf.tx_bytes = pEntry->TxBytes; - macBuf.rx_packets = pEntry->RxPackets.u.LowPart; - macBuf.tx_packets = pEntry->TxPackets.u.LowPart; - - if (copy_to_user(wrq->u.data.pointer, &macBuf, - wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: copy_to_user() fail\n", __func__)); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Query::OID_802_DOT1X_QUERY_STA_AID(%02x:%02x:%02x:%02x:%02x:%02x, Not Found)\n", - PRINT_MAC(macBuf.StaAddr))); - } -} -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ - -#endif /* DOT1X_SUPPORT */ - -#if defined(DBG) || (defined(BB_SOC) && defined(CONFIG_ATE)) - -/* - ========================================================================== - Description: - Read / Write BBP -Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 bbp ==> read all BBP - 2.) iwpriv ra0 bbp 1 ==> read BBP where RegID=1 - 3.) iwpriv ra0 bbp 1=10 ==> write BBP R1=0x10 - ========================================================================== -*/ -VOID RTMPAPIoctlBBP(IN PRTMP_ADAPTER pAdapter, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IOCTL::(iwpriv) Command not Support!\n")); -} - -/* CFG TODO: double define in ap_cfg / sta_cfg */ -#if defined(RT_CFG80211_P2P_SUPPORT) || defined(CFG80211_MULTI_STA) -#else -#endif - -#ifdef RTMP_RF_RW_SUPPORT -/* - ========================================================================== - Description: - Read / Write RF register -Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 rf ==> read all RF registers - 2.) iwpriv ra0 rf 1 ==> read RF where RegID=1 - 3.) iwpriv ra0 rf 1=10 ==> write RF R1=0x10 - ========================================================================== -*/ -VOID RTMPAPIoctlRF(IN PRTMP_ADAPTER pAdapter, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ -#if defined(RT_CFG80211_P2P_SUPPORT) || defined(CFG80211_MULTI_STA) -#else -#endif -} -#endif /* RTMP_RF_RW_SUPPORT */ -#endif /*#ifdef DBG */ - -/* - ========================================================================== - Description: - Read / Write E2PROM -Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 e2p 0 ==> read E2PROM where Addr=0x0 - 2.) iwpriv ra0 e2p 0=1234 ==> write E2PROM where Addr=0x0, value=1234 - ========================================================================== -*/ -VOID RTMPAPIoctlE2PROM(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - RTMP_STRING *this_char, *value; - INT j = 0, k = 0; - RTMP_STRING *mpool, *msg; /*msg[1024]; */ - RTMP_STRING *arg, *ptr; - USHORT eepAddr = 0; - UCHAR temp[16]; - RTMP_STRING temp2[16]; - USHORT eepValue; - BOOLEAN bIsPrintAllE2PROM = FALSE; - UINT_32 start = 0; - UINT_32 end = 0; - os_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR) * (4096 + 256 + 12)); - - if (mpool == NULL) - return; - - msg = (RTMP_STRING *)((ULONG)(mpool + 3) & (ULONG)~0x03); - arg = (RTMP_STRING *)((ULONG)(msg + 4096 + 3) & (ULONG)~0x03); - memset(msg, 0x00, 4096); - memset(arg, 0x00, 256); - - if ( -#ifdef LINUX - (wrq->u.data.length > 1) /* If no parameter, dump all e2p. */ -#endif /* LINUX */ - ) { -#ifdef LINUX - if (copy_from_user(arg, wrq->u.data.pointer, - (wrq->u.data.length > 255) ? - 255 : - wrq->u.data.length)) - goto done; -#else - NdisMoveMemory(arg, wrq->u.data.pointer, - (wrq->u.data.length > 255) ? 255 : - wrq->u.data.length); -#endif - ptr = arg; - sprintf(msg, "\n"); - - /*Parsing Read or Write */ - while ((this_char = strsep((char **)&ptr, ",")) != NULL) { - if (!*this_char) - continue; - - value = strchr(this_char, '='); - - if (value != NULL) - *value++ = 0; - - if (!value || !*value) { - /*Read */ - - /* Sanity check */ - if (strstr(this_char, ":")) { - UINT_32 e2p_end = EEPROM_SIZE; - UINT_32 e2p_print_lmt = EEPROM_SIZE; - -#if defined(RTMP_FLASH_SUPPORT) - if (pAdapter->E2pAccessMode == - E2P_FLASH_MODE) - e2p_end = get_dev_eeprom_size( - pAdapter); -#endif - sscanf(arg, "%4x:%4x", &start, &end); - - if ((start + end) > 0 && end > start && - end < e2p_end) { - if (end - start > - e2p_print_lmt) { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Maximum display %d bytes, display 0x%x to 0x%x\n", - e2p_print_lmt, - start, - start + e2p_print_lmt)); - end = start + - e2p_print_lmt; - } - bIsPrintAllE2PROM = TRUE; - } - break; - } else if (strlen(this_char) > 4) { - break; - } - - j = strlen(this_char); - - while (j-- > 0) { - if (this_char[j] > 'f' || - this_char[j] < '0') - goto done; /*return; */ - } - - /* E2PROM addr */ - k = j = strlen(this_char); - - while (j-- > 0) - this_char[4 - k + j] = this_char[j]; - - while (k < 4) - this_char[3 - k++] = '0'; - - this_char[4] = '\0'; - - if (strlen(this_char) == 4) { - AtoH(this_char, temp, 2); - eepAddr = *temp * 256 + temp[1]; - - if (eepAddr < 0xFFFF) { - RT28xx_EEPROM_READ16(pAdapter, - eepAddr, - eepValue); - sprintf(msg + strlen(msg), - "[0x%04X]:0x%04X ", - eepAddr, eepValue); - } else { - /*Invalid parametes, so default printk all bbp */ - break; - } - } - } else { - /*Write */ - NdisMoveMemory(&temp2, value, strlen(value)); - temp2[strlen(value)] = '\0'; - - /* Sanity check */ - if ((strlen(this_char) > 4) || - strlen(temp2) > 8) - break; - - j = strlen(this_char); - - while (j-- > 0) { - if (this_char[j] > 'f' || - this_char[j] < '0') - goto done; /* return; */ - } - - j = strlen(temp2) - 1; - - while (j >= 0) { - if (temp2[j] > 'f' || temp2[j] < '0') - goto done; /* return; */ - - j--; - } - - /* MAC Addr */ - k = j = strlen(this_char); - - while (j-- > 0) - this_char[4 - k + j] = this_char[j]; - - while (k < 4) - this_char[3 - k++] = '0'; - - this_char[4] = '\0'; - /* MAC value */ - k = strlen(temp2); - j = strlen(temp2) - 1; - - while (j >= 0) { - if ((4 - k + j) < 0) - break; - - temp2[4 - k + j] = temp2[j]; - j--; - } - - while (k < 4) - temp2[3 - k++] = '0'; - - temp2[4] = '\0'; - AtoH(this_char, temp, 2); - eepAddr = *temp * 256 + temp[1]; - AtoH(temp2, temp, 2); - eepValue = *temp * 256 + temp[1]; - RT28xx_EEPROM_WRITE16(pAdapter, eepAddr, - eepValue); - sprintf(msg + strlen(msg), "[0x%02X]:%02X ", - eepAddr, eepValue); - } - } - } else - bIsPrintAllE2PROM = TRUE; - - if (bIsPrintAllE2PROM) { - sprintf(msg, "\n"); - - if ((start + end) == 0) { - start = 0; - end = EEPROM_SIZE; - } - - /* E2PROM Registers */ - for (eepAddr = start; eepAddr < end; eepAddr += 2) { - RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue); - sprintf(msg + strlen(msg), "[0x%04X]:%04X ", eepAddr, - eepValue); - - if ((eepAddr & 0x6) == 0x6) - sprintf(msg + strlen(msg), "\n"); - } - } - - if (strlen(msg) == 1) - sprintf(msg + strlen(msg), "===>Error command format!"); - - /* Copy the information into the user buffer */ - AP_E2PROM_IOCTL_PostCtrl(wrq, msg); -done: - os_free_mem(mpool); - - if (wrq->u.data.flags != RT_OID_802_11_HARDWARE_REGISTER) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<==RTMPIoctlE2PROM\n")); -} - -/* #define ENHANCED_STAT_DISPLAY // Display PER and PLR statistics */ - -/* - ========================================================================== - Description: - Read statistics counter -Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 stat 0 ==> Read statistics counter - ========================================================================== -*/ -static VOID ShowAmpduCounter(RTMP_ADAPTER *pAd, UCHAR BandIdx, RTMP_STRING *msg) -{ - COUNTER_802_11 *WlanCounter = &pAd->WlanCounters[BandIdx]; - ULONG per; - - sprintf(msg + strlen(msg), "BandIdx: %d\n", BandIdx); - sprintf(msg + strlen(msg), "TX AGG Range 1 (1) = %ld\n", - (LONG)(WlanCounter->TxAggRange1Count.u.LowPart)); - sprintf(msg + strlen(msg), "TX AGG Range 2 (2~5) = %ld\n", - (LONG)(WlanCounter->TxAggRange2Count.u.LowPart)); - sprintf(msg + strlen(msg), "TX AGG Range 3 (6~15) = %ld\n", - (LONG)(WlanCounter->TxAggRange3Count.u.LowPart)); - sprintf(msg + strlen(msg), "TX AGG Range 4 (>15) = %ld\n", - (LONG)(WlanCounter->TxAggRange4Count.u.LowPart)); - { - ULONG mpduTXCount; - - mpduTXCount = WlanCounter->AmpduSuccessCount.u.LowPart; - sprintf(msg + strlen(msg), - "AMPDU Tx success = %ld\n", mpduTXCount); - per = mpduTXCount == 0 ? - 0 : - 1000 * (WlanCounter->AmpduFailCount.u.LowPart) / - (WlanCounter->AmpduFailCount.u.LowPart + - mpduTXCount); - sprintf(msg + strlen(msg), - "AMPDU Tx fail count = %ld, PER=%ld.%1ld%%\n", - (ULONG)WlanCounter->AmpduFailCount.u.LowPart, per / 10, - per % 10); - } -} - -VOID RTMPIoctlStatistics(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - INT Status; - RTMP_STRING *msg; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - UINT8 ucBand = BAND0; - ULONG txCount = 0; - UINT32 rxCount = 0; -#ifdef ENHANCED_STAT_DISPLAY - ULONG per; - INT i; -#endif -#ifdef RTMP_EFUSE_SUPPORT - UINT efusefreenum = 0; -#endif /* RTMP_EFUSE_SUPPORT */ -#ifdef BB_SOC - ULONG txPackets = 0, rxPackets = 0, txBytes = 0, rxBytes = 0; - UCHAR index = 0; -#endif - BOOLEAN isfound = FALSE; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - os_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR) * (2048)); - - if (msg == NULL) - return; - - if (wdev != NULL) - ucBand = HcGetBandByWdev(wdev); - - memset(msg, 0x00, 1600); - sprintf(msg, "\n"); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_LOUD, - ("ra offload=%d\n", cap->fgRateAdaptFWOffload)); -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - if (cap->fgRateAdaptFWOffload == TRUE) { - EXT_EVENT_TX_STATISTIC_RESULT_T rTxStatResult; - HTTRANSMIT_SETTING LastTxRate; - - MtCmdGetTxStatistic(pAd, - GET_TX_STAT_TOTAL_TX_CNT | - GET_TX_STAT_LAST_TX_RATE, - ucBand, 0, &rTxStatResult); - pAd->WlanCounters[ucBand].TransmittedFragmentCount.u.LowPart += - (rTxStatResult.u4TotalTxCount - - rTxStatResult.u4TotalTxFailCount); - pAd->WlanCounters[ucBand].FailedCount.u.LowPart += - rTxStatResult.u4TotalTxFailCount; - pAd->WlanCounters[ucBand].CurrentBwTxCount.u.LowPart += - rTxStatResult.u4CurrBwTxCnt; - pAd->WlanCounters[ucBand].OtherBwTxCount.u.LowPart += - rTxStatResult.u4OtherBwTxCnt; - - LastTxRate.field.MODE = rTxStatResult.rLastTxRate.MODE; - LastTxRate.field.BW = rTxStatResult.rLastTxRate.BW; - LastTxRate.field.ldpc = rTxStatResult.rLastTxRate.ldpc ? 1 : 0; - LastTxRate.field.ShortGI = - rTxStatResult.rLastTxRate.ShortGI ? 1 : 0; - LastTxRate.field.STBC = rTxStatResult.rLastTxRate.STBC; - - if (LastTxRate.field.MODE == MODE_VHT) - LastTxRate.field.MCS = - (((rTxStatResult.rLastTxRate.VhtNss - 1) & 0x3) - << 4) + - rTxStatResult.rLastTxRate.MCS; - else - LastTxRate.field.MCS = rTxStatResult.rLastTxRate.MCS; - - pAd->LastTxRate = (USHORT)(LastTxRate.word); - } -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - -#ifdef CONFIG_ATE - if (ATE_ON(pAd)) { - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - - txCount = TESTMODE_GET_PARAM(ATECtrl, ucBand, TxDoneCount); - rxCount = ATECtrl->rx_stat.RxTotalCnt[ucBand]; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxCount:%ld, RxCount:%d, if_name:%s\n", txCount, - rxCount, wdev->if_dev->name)); - } else -#endif /* CONFIG_ATE */ - { - txCount = pAd->WlanCounters[ucBand] - .TransmittedFragmentCount.u.LowPart; - rxCount = - pAd->WlanCounters[ucBand].ReceivedFragmentCount.QuadPart; - } - - sprintf(msg + strlen(msg), "Tx success = %ld\n", - txCount); -#ifdef ENHANCED_STAT_DISPLAY - if (IS_HIF_TYPE(pAd, HIF_MT)) { - per = txCount == 0 ? 0 : - 1000 * - (pAd->WlanCounters[ucBand] - .FailedCount.u.LowPart) / - (pAd->WlanCounters[ucBand] - .FailedCount.u.LowPart + - txCount); - sprintf(msg + strlen(msg), - "Tx fail count = %ld, PER=%ld.%1ld%%\n", - (ULONG)pAd->WlanCounters[ucBand].FailedCount.u.LowPart, - per / 10, per % 10); - sprintf(msg + strlen(msg), - "Current BW Tx count = %ld\n", - (ULONG)pAd->WlanCounters[ucBand] - .CurrentBwTxCount.u.LowPart); - sprintf(msg + strlen(msg), - "Other BW Tx count = %ld\n", - (ULONG)pAd->WlanCounters[ucBand] - .OtherBwTxCount.u.LowPart); - } - - sprintf(msg + strlen(msg), "Rx success = %ld\n", - (ULONG)rxCount); - -#ifdef CONFIG_QA - if (ATE_ON(pAd)) { - per = (rxCount == 0) ? - 0 : - 1000 * - (pAd->WlanCounters[ucBand] - .FCSErrorCount.u.LowPart) / - (pAd->WlanCounters[ucBand] - .FCSErrorCount.u.LowPart + - rxCount); - } else -#endif /* CONFIG_QA */ - per = pAd->WlanCounters[0].ReceivedFragmentCount.u.LowPart == - 0 ? - 0 : - 1000 * - (pAd->WlanCounters[0] - .FCSErrorCount.u.LowPart) / - (pAd->WlanCounters[0] - .FCSErrorCount.u.LowPart + - pAd->WlanCounters[0] - .ReceivedFragmentCount.u.LowPart); - - sprintf(msg + strlen(msg), - "Rx with CRC = %ld, PER=%ld.%1ld%%\n", - (ULONG)pAd->WlanCounters[0].FCSErrorCount.u.LowPart, per / 10, - per % 10); - sprintf(msg + strlen(msg), "Rx drop due to out of resource = %ld\n", - (ULONG)pAd->Counters8023.RxNoBuffer); -#endif /* ENHANCED_STAT_DISPLAY */ - -#ifdef CONFIG_QA - if (ATE_ON(pAd)) { - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - UINT32 Ch_Band_0 = - TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, Ch_Band); - UINT32 Ch_Band_1 = - TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, Ch_Band); - UCHAR FAGC_Path_0 = - TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, FAGC_Path); - UCHAR FAGC_Path_1 = - TESTMODE_GET_PARAM(ATECtrl, TESTMODE_BAND0, FAGC_Path); - INT32 RSSI_IB[4] = { 0, 0, 0, 0 }; - - for (i = 0; i < 4; i++) { - if (i < 2) - RSSI_IB[i] = MtATERSSIOffset( - pAd, ATECtrl->rx_stat.FAGC_RSSI_IB[i], - FAGC_Path_0, Ch_Band_0); - else - RSSI_IB[i] = MtATERSSIOffset( - pAd, ATECtrl->rx_stat.FAGC_RSSI_IB[i], - FAGC_Path_1, Ch_Band_1); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RSSI_IB[%d] %d\n", i, RSSI_IB[i])); - } - - if (pAd->ATECtrl.RxAntennaSel == 0) { - sprintf(msg + strlen(msg), - "RSSI-A = %ld\n", - (LONG)(RSSI_IB[0] - pAd->BbpRssiToDbmDelta)); - sprintf(msg + strlen(msg), - "RSSI-B (if available) = %ld\n", - (LONG)(RSSI_IB[1] - pAd->BbpRssiToDbmDelta)); - sprintf(msg + strlen(msg), - "RSSI-C (if available) = %ld\n", - (LONG)(RSSI_IB[2] - pAd->BbpRssiToDbmDelta)); - sprintf(msg + strlen(msg), - "RSSI-D (if available) = %ld\n\n", - (LONG)(RSSI_IB[3] - pAd->BbpRssiToDbmDelta)); - } else - sprintf(msg + strlen(msg), - "RSSI = %ld\n", - (LONG)(RSSI_IB[0] - pAd->BbpRssiToDbmDelta)); - } else -#endif /* CONFIG_QA */ - { -#ifdef ENHANCED_STAT_DISPLAY -#ifdef CCK_LQ_SUPPORT - if (IS_MT7615(pAd)) - sprintf(msg + strlen(msg), - "LQ(CCK) = %d\n", - pAd->Avg_LQ); -#endif -#ifdef LTF_SNR_SUPPORT - if (IS_MT7615(pAd)) - sprintf(msg + strlen(msg), - "LTF-SNR(OFDM) = %d\n", - pAd->Avg_LTFSNR); -#endif -#ifdef NF_SUPPORT - if (IS_MT7615(pAd)) { - sprintf(msg + strlen(msg), "NF = %d\n", pAd->Avg_NF[0]); - sprintf(msg + strlen(msg), "SNR = %ld %ld %ld %ld\n", - (LONG)(pAd->ApCfg.RssiSample.LastRssi[0] - - pAd->Avg_NF[0]), - (LONG)(pAd->ApCfg.RssiSample.LastRssi[1] - - pAd->Avg_NF[0]), - (LONG)(pAd->ApCfg.RssiSample.LastRssi[2] - - pAd->Avg_NF[0]), - (LONG)(pAd->ApCfg.RssiSample.LastRssi[3] - - pAd->Avg_NF[0])); - } -#endif - /* Display Last Rx Rate and BF SNR of first Associated entry in MAC table */ - if (pAd->MacTab.Size > 0) { - static char *phyMode[5] = { "CCK", "OFDM", "MM", "GF", - "VHT" }; - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - PMAC_TABLE_ENTRY pEntry = - &(pAd->MacTab.Content[i]); - - if ((pEntry->wdev == NULL) || - HcGetBandByWdev(pEntry->wdev) != ucBand) - continue; - if ((IS_ENTRY_CLIENT(pEntry) && - pEntry->Sst == SST_ASSOC) || - IS_ENTRY_WDS(pEntry) || - IS_ENTRY_APCLI(pEntry)) { - /* sprintf(msg+strlen(msg), "sta mac: %02x:%02x:%02x:%02x:%02x:%02x\n", pEntry->wdev->if_addr[0], pEntry->wdev->if_addr[1], pEntry->wdev->if_addr[2], pEntry->wdev->if_addr[3], pEntry->wdev->if_addr[4], pEntry->wdev->if_addr[5]); */ - UINT32 lastRxRate = pEntry->LastRxRate; - UINT32 lastTxRate = pEntry->LastTxRate; - - isfound = TRUE; - sprintf(msg + strlen(msg), - "RSSI = %ld %ld %ld %ld\n", - (LONG)(pEntry->RssiSample - .AvgRssi[0] - - pAd->BbpRssiToDbmDelta), - (LONG)(pEntry->RssiSample - .AvgRssi[1] - - pAd->BbpRssiToDbmDelta), - (LONG)(pEntry->RssiSample - .AvgRssi[2] - - pAd->BbpRssiToDbmDelta), - (LONG)(pEntry->RssiSample - .AvgRssi[3] - - pAd->BbpRssiToDbmDelta)); - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - if (cap->fgRateAdaptFWOffload == TRUE) { - if (pEntry->bAutoTxRateSwitch == - TRUE) { - EXT_EVENT_TX_STATISTIC_RESULT_T - rTxStatResult; - HTTRANSMIT_SETTING - LastTxRate; - - MtCmdGetTxStatistic( - pAd, - GET_TX_STAT_ENTRY_TX_RATE, - 0 /*Don't Care*/, - pEntry->wcid, - &rTxStatResult); - LastTxRate.field.MODE = - rTxStatResult - .rEntryTxRate - .MODE; - LastTxRate.field.BW = - rTxStatResult - .rEntryTxRate - .BW; - LastTxRate.field.ldpc = - rTxStatResult.rEntryTxRate - .ldpc ? - 1 : - 0; - LastTxRate.field - .ShortGI = - rTxStatResult.rEntryTxRate - .ShortGI ? - 1 : - 0; - LastTxRate.field.STBC = - rTxStatResult - .rEntryTxRate - .STBC; - - if (LastTxRate.field - .MODE == - MODE_VHT) - LastTxRate.field - .MCS = - (((rTxStatResult - .rEntryTxRate - .VhtNss - - 1) & - 0x3) - << 4) + - rTxStatResult - .rEntryTxRate - .MCS; - else - LastTxRate.field - .MCS = - rTxStatResult - .rEntryTxRate - .MCS; - - lastTxRate = - (UINT32)(LastTxRate - .word); - -#ifdef TXSTAT_2040BW_24G_SUPPORT - if (IF_STAREC_BW_STATS_SUPPORT() == - TRUE) { - UINT_16 BW20MPercentage = - 0; - UINT_16 BW40MPercentage = - 0; - UINT_32 TotalTxCount = - rTxStatResult - .u4TotalTxCount; - UINT_32 Total20MTxCount = - rTxStatResult - .u4Total20MTxCount; - UINT_32 Total40MTxCount = - rTxStatResult - .u4Total40MTxCount; - - if (Total20MTxCount) { - BW20MPercentage = - ((Total20MTxCount * - 100) / - TotalTxCount) + - ((((Total20MTxCount * - 100) % - TotalTxCount) < - (TotalTxCount / - 2)) ? - 0 : - 1); - } - - if (Total40MTxCount) { - BW40MPercentage = - ((Total40MTxCount * - 100) / - TotalTxCount) + - ((((Total40MTxCount * - 100) % - TotalTxCount) < - (TotalTxCount / - 2)) ? - 0 : - 1); - } - - sprintf(msg + strlen(msg), - "20M Pkt Tx Percentage = %d%%\n", - BW20MPercentage); - sprintf(msg + strlen(msg), - "40M Pkt Tx Percentage = %d%%\n", - BW40MPercentage); - } -#endif - } - } -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - StatRateToString(pAd, msg, 0, - lastTxRate); - StatRateToString(pAd, msg, 1, - lastRxRate); - } else -#endif /* MT_MAC */ - { - snprintf( - msg + strlen(msg), 200, - "Last TX Rate = MCS%d, %2dM, %cGI, %s%s\n", - lastTxRate & 0x7F, - ((lastTxRate >> 7) & - 0x1) ? - 40 : - 20, - ((lastTxRate >> 8) & - 0x1) ? - 'S' : - 'L', - phyMode[(lastTxRate >> - 14) & - 0x3], - ((lastTxRate >> 9) & - 0x3) ? - ", STBC" : - " "); - snprintf( - msg + strlen(msg), 200, - "Last RX Rate = MCS%d, %2dM, %cGI, %s%s\n", - lastRxRate & 0x7F, - ((lastRxRate >> 7) & - 0x1) ? - 40 : - 20, - ((lastRxRate >> 8) & - 0x1) ? - 'S' : - 'L', - phyMode[(lastRxRate >> - 14) & - 0x3], - ((lastRxRate >> 9) & - 0x3) ? - ", STBC" : - " "); - } - - break; - } - } - } - - if (isfound == FALSE) { - sprintf(msg + strlen(msg), - "RSSI = %ld %ld %ld %ld\n", - (LONG)MINIMUM_POWER_VALUE, - (LONG)MINIMUM_POWER_VALUE, - (LONG)MINIMUM_POWER_VALUE, - (LONG)MINIMUM_POWER_VALUE); - } -#ifdef MT_MAC - if (IS_HIF_TYPE(pAd, HIF_MT)) { - ShowAmpduCounter(pAd, ucBand, msg); - - if (pAd->CommonCfg.bTXRX_RXV_ON) { - sprintf(msg + strlen(msg), - "/* Condition Number should enable mode4 of 0x6020_426c */\n"); - sprintf(msg + strlen(msg), - "--10 packets Condition Number = [%d|%d|%d|%d|%d|%d|%d|%d|%d|%d]\n", - (UINT8)(pAd->rxv2_cyc3[0] & 0xff), - (UINT8)(pAd->rxv2_cyc3[1] & 0xff), - (UINT8)(pAd->rxv2_cyc3[2] & 0xff), - (UINT8)(pAd->rxv2_cyc3[3] & 0xff), - (UINT8)(pAd->rxv2_cyc3[4] & 0xff), - (UINT8)(pAd->rxv2_cyc3[5] & 0xff), - (UINT8)(pAd->rxv2_cyc3[6] & 0xff), - (UINT8)(pAd->rxv2_cyc3[7] & 0xff), - (UINT8)(pAd->rxv2_cyc3[8] & 0xff), - (UINT8)(pAd->rxv2_cyc3[9] & 0xff)); - } - } - -#endif /* MT_MAC */ -#else - sprintf(msg + strlen(msg), - "RSSI-A = %ld\n", - (LONG)(pAd->ApCfg.RssiSample.LastRssi[0] - - pAd->BbpRssiToDbmDelta)); - sprintf(msg + strlen(msg), - "RSSI-B (if available) = %ld\n", - (LONG)(pAd->ApCfg.RssiSample.LastRssi[1] - - pAd->BbpRssiToDbmDelta)); - sprintf(msg + strlen(msg), - "RSSI-C (if available) = %ld\n\n", - (LONG)(pAd->ApCfg.RssiSample.LastRssi[2] - - pAd->BbpRssiToDbmDelta)); -#endif /* ENHANCED_STAT_DISPLAY */ - } - -#if /*TCSUPPORT_COMPILE*/ defined(TCSUPPORT_SCHEDULE) - - if (pAd->Flags & fRTMP_ADAPTER_RADIO_OFF) - sprintf(msg + strlen(msg), "Enable Wireless LAN = %s\n", - "0"); - else - sprintf(msg + strlen(msg), "Enable Wireless LAN = %s\n", - "1"); - - sprintf(msg + strlen(msg), "\n"); -#endif /*TCSUPPORT_COMPILE*/ - /* - * Let "iwpriv ra0 stat" can print out Tx/Rx Packet and Byte count. - * Therefore, we can parse them out in cfg_manager. --Trey */ -#ifdef BB_SOC - - for (index = 0; index < pAd->ApCfg.BssidNum; index++) { - rxPackets += (ULONG)pAd->ApCfg.MBSSID[index].RxCount; - txPackets += (ULONG)pAd->ApCfg.MBSSID[index].TxCount; - rxBytes += (ULONG)pAd->ApCfg.MBSSID[index].ReceivedByteCount; - txBytes += (ULONG)pAd->ApCfg.MBSSID[index].TransmittedByteCount; - } - - sprintf(msg + strlen(msg), "Packets Received = %lu\n", rxPackets); - sprintf(msg + strlen(msg), "Packets Sent = %lu\n", txPackets); - sprintf(msg + strlen(msg), "Bytes Received = %lu\n", rxBytes); - sprintf(msg + strlen(msg), "Bytes Sent = %lu\n", txBytes); - sprintf(msg + strlen(msg), "\n"); -#endif -#ifdef RTMP_EFUSE_SUPPORT - - if (pAd->bUseEfuse == TRUE) { - eFuseGetFreeBlockCount(pAd, &efusefreenum); - sprintf(msg + strlen(msg), - "efuseFreeNumber = %d\n", efusefreenum); - } - -#endif /* RTMP_EFUSE_SUPPORT */ - snprintf(msg + strlen(msg), 100, "driver_version %s\n", - AP_DRIVER_VERSION); - /* Copy the information into the user buffer */ - wrq->u.data.length = strlen(msg); - Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); - os_free_mem(msg); -#if defined(TXBF_SUPPORT) && defined(ENHANCED_STAT_DISPLAY) -#endif /* defined(TXBF_SUPPORT) && defined(ENHANCED_STAT_DISPLAY) */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<==RTMPIoctlStatistics\n")); -} - -INT RTMPIoctlRXStatistics(IN RTMP_ADAPTER *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - RTMP_STRING *this_char, *value = NULL; - INT Status = NDIS_STATUS_SUCCESS; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - os_alloc_mem(NULL, (UCHAR **)&this_char, wrq->u.data.length + 1); - if (!this_char) - return -ENOMEM; - - if (copy_from_user(this_char, wrq->u.data.pointer, - wrq->u.data.length)) { - os_free_mem(this_char); - return -EFAULT; - } - this_char[wrq->u.data.length] = 0; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Before check, this_char = %s\n", __func__, this_char)); - value = strchr(this_char, '='); - - if (value) { - if (strlen(value) > 1) { - *value = 0; - value++; - } else - value = NULL; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): After check, this_char = %s, value = %s\n", __func__, - this_char, (value == NULL ? "" : value))); - - for (PRTMP_PRIVATE_RX_PROC = RTMP_PRIVATE_RX_SUPPORT_PROC; - PRTMP_PRIVATE_RX_PROC->name; PRTMP_PRIVATE_RX_PROC++) { - if (!strcmp(this_char, PRTMP_PRIVATE_RX_PROC->name)) { - if (!PRTMP_PRIVATE_RX_PROC->rx_proc(pAd, value, wrq)) { - /*FALSE:Set private failed then return Invalid argument */ - Status = -EINVAL; - } - - break; /*Exit for loop. */ - } - } - - if (PRTMP_PRIVATE_RX_PROC->name == NULL) { - /*Not found argument */ - Status = -EINVAL; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IOCTL::(iwpriv) Command not Support [%s = %s]\n", - this_char, value)); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - os_free_mem(this_char); - return Status; -} - -#ifdef DOT11_N_SUPPORT -/* - ========================================================================== - Description: - Get Block ACK Table - Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 get_ba_table - 3.) UI needs to prepare at least 4096bytes to get the results - ========================================================================== -*/ -VOID RTMPIoctlQueryBaTable(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - /*char *msg; */ - UCHAR TotalEntry, i, j, index; - QUERYBA_TABLE *BAT; - - BAT = vmalloc(sizeof(QUERYBA_TABLE)); - - if (BAT == NULL) - return; - - RTMPZeroMemory(BAT, sizeof(QUERYBA_TABLE)); - TotalEntry = pAd->MacTab.Size; - index = 0; - - for (i = 0; ((VALID_UCAST_ENTRY_WCID(pAd, i)) && (TotalEntry > 0)); - i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && - (pEntry->TXBAbitmap) && (index < 32)) { - NdisMoveMemory(BAT->BAOriEntry[index].MACAddr, - pEntry->Addr, 6); - - for (j = 0; j < 8; j++) { - if (pEntry->BAOriWcidArray[j] != 0) - BAT->BAOriEntry[index].BufSize[j] = - pAd->BATable - .BAOriEntry[pEntry->BAOriWcidArray - [j]] - .BAWinSize; - else - BAT->BAOriEntry[index].BufSize[j] = 0; - } - - TotalEntry--; - index++; - BAT->OriNum++; - } - } - - TotalEntry = pAd->MacTab.Size; - index = 0; - - for (i = 0; ((VALID_UCAST_ENTRY_WCID(pAd, i)) && (TotalEntry > 0)); - i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && - (pEntry->RXBAbitmap) && (index < 32)) { - NdisMoveMemory(BAT->BARecEntry[index].MACAddr, - pEntry->Addr, 6); - BAT->BARecEntry[index].BaBitmap = - (UCHAR)pEntry->RXBAbitmap; - - for (j = 0; j < 8; j++) { - if (pEntry->BARecWcidArray[j] != 0) - BAT->BARecEntry[index].BufSize[j] = - pAd->BATable - .BARecEntry[pEntry->BARecWcidArray - [j]] - .BAWinSize; - else - BAT->BARecEntry[index].BufSize[j] = 0; - } - - TotalEntry--; - index++; - BAT->RecNum++; - } - } - - wrq->u.data.length = sizeof(QUERYBA_TABLE); - - if (copy_to_user(wrq->u.data.pointer, BAT, wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: copy_to_user() fail\n", __func__)); - - vfree(BAT); -} -#endif /* DOT11_N_SUPPORT */ - -#ifdef APCLI_SUPPORT - -INT set_apcli_enable_proc2(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; -#ifdef APCLI_OWE_SUPPORT - UCHAR ifIndex; -#endif - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - -#ifdef APCLI_OWE_SUPPORT - ifIndex = pObj->ioctl_if; - apcli_reset_owe_parameters(pAd, ifIndex); -#endif - - return Set_ApCli_Enable_Proc(pAd, arg); -} - -INT Set_ApCli_Enable_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT Enable; - UCHAR ifIndex; - struct wifi_dev *wdev = NULL; -#ifdef CONFIG_MAP_SUPPORT - struct DOT11_H *pDot11h = NULL; -#endif -#ifndef APCLI_CFG80211_SUPPORT - POS_COOKIE pObj; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - ifIndex = pObj->ioctl_if; -#else - ifIndex = 0; -#endif /* !APCLI_CFG80211_SUPPORT */ - if (APCLI_IF_UP_CHECK(pAd, ifIndex) != TRUE) { - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : interface is not up, please do ifconfig up first\n", - __func__)); - return FALSE; - } - - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - -#ifdef CONFIG_MAP_SUPPORT - pDot11h = wdev->pDot11_H; -#endif - Enable = os_str_tol(arg, 0, 16); - pAd->ApCfg.ApCliTab[ifIndex].Enable = (Enable > 0) ? TRUE : FALSE; -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_TURNKEY_ENABLE(pAd)) { - if (pAd->ApCfg.ApCliTab[ifIndex].Enable && - pDot11h->RDMode == RD_SILENCE_MODE) { - /*If CAC is running but get apcli enable as 1 then assumed that channel is available so no need to do CAC*/ - pDot11h->RDCount = pDot11h->ChMovingTime; - } - } -#endif - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) Set_ApCli_Enable_Proc::(enable = %d)\n", - ifIndex, pAd->ApCfg.ApCliTab[ifIndex].Enable)); -#ifdef APCLI_CONNECTION_TRIAL - - if (pAd->ApCfg.ApCliTab[ifIndex].TrialCh == 0) -#endif /* APCLI_CONNECTION_TRIAL */ - ApCliIfDown(pAd); - -#ifdef APCLI_CERT_SUPPORT - /*Fix for TGac 5.2.57*/ - if (pAd->bApCliCertTest) - wlan_operate_set_prim_ch(wdev, wdev->channel); -#endif - - return TRUE; -} - -INT Set_ApCli_Ssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UCHAR ifIndex; - BOOLEAN apcliEn; - INT success = FALSE; - APCLI_STRUCT *apcli_entry; - struct wifi_dev *wdev; -#ifndef APCLI_CFG80211_SUPPORT - POS_COOKIE pObj; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - ifIndex = pObj->ioctl_if; -#else - ifIndex = 0; -#endif /* !APCLI_CFG80211_SUPPORT */ - - if (strlen(arg) <= MAX_LEN_OF_SSID) { - apcli_entry = &pAd->ApCfg.ApCliTab[ifIndex]; - wdev = &apcli_entry->wdev; - /* bring apcli interface down first */ - apcliEn = apcli_entry->Enable; - -#ifdef APCLI_OWE_SUPPORT - apcli_reset_owe_parameters(pAd, ifIndex); -#endif - -#ifdef APCLI_CONNECTION_TRIAL - - if (pAd->ApCfg.ApCliTab[ifIndex].TrialCh == 0) { -#endif /* APCLI_CONNECTION_TRIAL */ - - if (apcliEn == TRUE) { - apcli_entry->Enable = FALSE; - ApCliIfDown(pAd); - } - -#ifdef APCLI_CONNECTION_TRIAL - } - -#endif /* APCLI_CONNECTION_TRIAL */ - apcli_entry->bPeerExist = FALSE; - NdisZeroMemory(apcli_entry->CfgSsid, MAX_LEN_OF_SSID); - NdisMoveMemory(apcli_entry->CfgSsid, arg, strlen(arg)); - apcli_entry->CfgSsidLen = (UCHAR)strlen(arg); - success = TRUE; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) Set_ApCli_Ssid_Proc::(Len=%d,Ssid=%s)\n", - ifIndex, apcli_entry->CfgSsidLen, - apcli_entry->CfgSsid)); - apcli_entry->Enable = apcliEn; -#ifdef APCLI_CFG80211_SUPPORT - apcli_entry->ReadyToConnect = TRUE; -#endif - } else - success = FALSE; - - return success; -} - -INT Set_ApCli_Bssid_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - INT i; - RTMP_STRING *value; - UCHAR ifIndex; - BOOLEAN apcliEn; - POS_COOKIE pObj; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - ifIndex = pObj->ioctl_if; - apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable; - -#ifdef APCLI_OWE_SUPPORT - apcli_reset_owe_parameters(pAd, ifIndex); -#endif - - /* bring apcli interface down first */ - if ((apcliEn == TRUE) && (strcmp(arg, "00:00:00:00:00:00") != 0)) { - pAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE; -#ifdef APCLI_CONNECTION_TRIAL - - if (pAd->ApCfg.ApCliTab[ifIndex].TrialCh == 0) -#endif /* APCLI_CONNECTION_TRIAL */ - ApCliIfDown(pAd); - } - - NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, - MAC_ADDR_LEN); - - if (strlen(arg) == - 17) { /* Mac address acceptable format 01:02:03:04:05:06 length 17 */ - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":"), i++) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /* Invalid */ - - AtoH(value, - &pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[i], 1); - } - - if (i != 6) - return FALSE; /* Invalid */ - } - - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_ApCli_Bssid_Proc (%2X:%2X:%2X:%2X:%2X:%2X)\n", - pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[0], - pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[1], - pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[2], - pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[3], - pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[4], - pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[5])); - pAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn; - return TRUE; -} - -#ifdef APCLI_CFG80211_SUPPORT -INT Set_ApCli_AuthMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - struct _SECURITY_CONFIG *pSecConfig = - &pAd->ApCfg.ApCliTab[0].wdev.SecConfig; - - if (pSecConfig == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: pSecConfig == NULL, arg=%s\n", __func__, arg)); - return FALSE; - } - SetWdevAuthMode(pSecConfig, arg); - return TRUE; -} - -INT Set_ApCli_EncrypType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - struct _SECURITY_CONFIG *pSecConfig = - &pAd->ApCfg.ApCliTab[0].wdev.SecConfig; - - if (pSecConfig == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: pSecConfig == NULL, arg=%s\n", __func__, arg)); - return FALSE; - } - SetWdevEncrypMode(pSecConfig, arg); - return TRUE; -} -#endif /* APCLI_CFG80211_SUPPORT */ - -INT Set_ApCli_TxMode_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - wdev = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev; - wdev->DesiredTransmitSetting.field.FixedTxMode = - RT_CfgSetFixedTxPhyMode(arg); - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) Set_ApCli_TxMode_Proc = %d\n", pObj->ioctl_if, - wdev->DesiredTransmitSetting.field.FixedTxMode)); - return TRUE; -} - -INT Set_ApCli_WirelessMode_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - struct dev_rate_info *rate; - UCHAR WirelessMode = os_str_tol(arg, 0, 10); - UCHAR PhyMode; - APCLI_STRUCT *apcli_entry; - CHANNEL_CTRL *pChCtrl; - UCHAR BandIdx; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - apcli_entry = &pAd->ApCfg.ApCliTab[pObj->ioctl_if]; - wdev = &apcli_entry->wdev; - rate = &wdev->rate; - PhyMode = cfgmode_2_wmode(WirelessMode); - - if (!APCLI_IF_UP_CHECK(pAd, pObj->ioctl_if)) - return FALSE; - - /* apcli always follow per band's channel */ - if (WMODE_CAP_5G(PhyMode)) - wdev->channel = HcGetChannelByRf(pAd, RFIC_5GHZ); - else - wdev->channel = HcGetChannelByRf(pAd, RFIC_24GHZ); - - if (wdev_do_linkdown(wdev) != TRUE) - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("(%s) linkdown fail!\n", __func__)); - - os_msec_delay(100); - - if (wdev_do_close(wdev) != TRUE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() close fail!!!\n", __func__)); - - /* fixed race condition between hw control task */ - os_msec_delay(100); - wdev->PhyMode = PhyMode; - HcAcquireRadioForWdev(pAd, wdev); - /* Change channel state to NONE */ - BandIdx = HcGetBandByWdev(wdev); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - hc_set_ChCtrlChListStat(pChCtrl, CH_LIST_STATE_NONE); -#ifdef EXT_BUILD_CHANNEL_LIST - BuildChannelListEx(pAd, wdev); -#else - BuildChannelList(pAd, wdev); -#endif - RTMPSetPhyMode(pAd, wdev, PhyMode); - /*update rate info for wdev*/ - RTMPUpdateRateInfo(wdev->PhyMode, rate); - /* sync bw ext ch from mbss wdev */ - { - if (pAd->CommonCfg.dbdc_mode == TRUE) { - int mbss_idx; - - for (mbss_idx = 0; mbss_idx < pAd->ApCfg.BssidNum; - mbss_idx++) { - if (pAd->ApCfg.MBSSID[mbss_idx].wdev.PhyMode == - wdev->PhyMode) { - update_att_from_wdev( - wdev, - &pAd->ApCfg.MBSSID[mbss_idx] - .wdev); - break; - } - } - } else { - /* align phy mode to BSS0 by default */ - wdev->PhyMode = pAd->ApCfg.MBSSID[BSS0].wdev.PhyMode; - update_att_from_wdev(wdev, - &pAd->ApCfg.MBSSID[BSS0].wdev); - } - } - os_msec_delay(100); - - /* Security initial */ - if (wdev->SecConfig.AKMMap == 0x0) - SET_AKM_OPEN(wdev->SecConfig.AKMMap); - - if (wdev->SecConfig.PairwiseCipher == 0x0) { - SET_CIPHER_NONE(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_NONE(wdev->SecConfig.GroupCipher); - } - - if (wdev_do_open(wdev) != TRUE) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() open fail!!!\n", __func__)); - - os_msec_delay(100); - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) Set_ApCli_WirelessMode_Proc = %d\n", - pObj->ioctl_if, PhyMode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SupRate[0]=%x\n", rate->SupRate[0])); - return TRUE; -} - -INT Set_ApCli_TxMcs_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - wdev = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev; - wdev->DesiredTransmitSetting.field.MCS = - RT_CfgSetTxMCSProc(arg, &wdev->bAutoTxRateSwitch); - - if (wdev->DesiredTransmitSetting.field.MCS == MCS_AUTO) - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) Set_ApCli_TxMcs_Proc = AUTO\n", - pObj->ioctl_if)); - else { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) Set_ApCli_TxMcs_Proc = %d\n", - pObj->ioctl_if, - wdev->DesiredTransmitSetting.field.MCS)); - } - - return TRUE; -} - -#ifdef APCLI_CONNECTION_TRIAL -INT Set_ApCli_Trial_Ch_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj; - UCHAR ifIndex; - PAPCLI_STRUCT pApCliEntry = NULL; - CHAR *str; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - ifIndex = pObj->ioctl_if; - - if (ifIndex != (pAd->ApCfg.ApCliNum - 1)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n\rI/F(apcli%d) can not run connection trial, use apcli%d\n", - ifIndex, (MAX_APCLI_NUM - 1))); - return FALSE; - } - - if (pAd->CommonCfg.dbdc_mode == TRUE) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n\rI/F(apcli%d) can not run connection trial with DBDC mode\n", - ifIndex)); - return FALSE; - } - - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - pApCliEntry->TrialCh = os_str_tol(arg, 0, 10); - - if (pApCliEntry->TrialCh) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) pApCliEntry->TrialCh = %d\n", ifIndex, - pApCliEntry->TrialCh)); - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) pApCliEntry->TrialCh = %d\n", ifIndex, - pApCliEntry->TrialCh)); - -#ifdef DBDC_MODE - - if ((WMODE_CAP_2G(pApCliEntry->wdev.PhyMode) && - pApCliEntry->TrialCh > 14) || - (WMODE_CAP_5G(pApCliEntry->wdev.PhyMode) && - pApCliEntry->TrialCh <= 14)) { - pApCliEntry->TrialCh = 0; - str = wmode_2_str(pApCliEntry->wdev.PhyMode); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("I/F(apcli%d) TrialCh = %d is not in this phy mode(%s)\n", - ifIndex, pApCliEntry->TrialCh, str)); - if (str) - os_free_mem(str); - return FALSE; - } - -#endif - return TRUE; -} -#endif /* APCLI_CONNECTION_TRIAL */ - -#ifdef MAC_REPEATER_SUPPORT -INT Set_Cli_Link_Map_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex; - UCHAR MbssIdx = 0; - struct wifi_dev *cli_link_wdev = NULL; - struct wifi_dev *mbss_link_wdev = NULL; - - if (pAd->ApCfg.bMACRepeaterEn != TRUE) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Rept has not been enabled yet.\n")); - return FALSE; - } - - if ((pObj->ioctl_if_type != INT_APCLI) && - (pObj->ioctl_if_type != INT_MSTA)) - return FALSE; - - ifIndex = pObj->ioctl_if; - - if (ifIndex >= MAX_APCLI_NUM) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wrong cli link idx:%d to set link map.\n", ifIndex)); - return FALSE; - } - - cli_link_wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - MbssIdx = os_str_tol(arg, 0, 10); - - if (MbssIdx >= HW_BEACON_MAX_NUM) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wrong mbss idx:%d to set link map.\n", MbssIdx)); - return FALSE; - } - - mbss_link_wdev = &pAd->ApCfg.MBSSID[MbssIdx].wdev; - UpdateMbssCliLinkMap(pAd, MbssIdx, cli_link_wdev, mbss_link_wdev); - return TRUE; -} - -INT Set_ReptMode_Enable_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR Enable = os_str_tol(arg, 0, 10); - - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MACRepeaterEn = %d, Repeater Mode (%s)\n", - pAd->ApCfg.bMACRepeaterEn, (Enable ? "ON" : "OFF"))); - AsicSetReptFuncEnable(pAd, Enable); - return TRUE; -} - -#endif /* MAC_REPEATER_SUPPORT */ - -#ifdef APCLI_AUTO_CONNECT_SUPPORT -/* - ========================================================================== - Description: - Trigger Apcli Auto connect to find the missed AP. - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ - -/* -0 : Disable apcli auto connect -1 : User Trigger Scan Mode -2 : Partial Scan Mode -3 : Driver Trigger Scan Mode -*/ - -INT Set_ApCli_AutoConnect_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex; - AP_ADMIN_CONFIG *pApCfg; - NDIS_802_11_SSID Ssid; - long scan_mode = os_str_tol(arg, 0, 10); - struct wifi_dev *wdev = NULL; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - pApCfg = &pAd->ApCfg; - ifIndex = pObj->ioctl_if; - NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); - wdev = &pApCfg->ApCliTab[ifIndex].wdev; - - if (ApScanRunning(pAd, wdev) == TRUE) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Set_ApCli_AutoConnect_Proc() is still running\n")); - return FALSE; - } -#ifdef APCLI_CERT_SUPPORT - /*Modfied RTS Threshold for 5.2.67A - Reverting back to Default */ - if (pAd->bApCliCertTest == TRUE) { - wlan_operate_set_rts_len_thld( - wdev, wlan_config_get_rts_len_thld(wdev)); - } -#endif - if (scan_mode == 0) { /* disable it */ - pAd->ScanCtrl.PartialScan.bScanning = FALSE; - pApCfg->ApCliTab[ifIndex].AutoConnectFlag = FALSE; - pApCfg->ApCliAutoConnectRunning[ifIndex] = FALSE; - pApCfg->ApCliAutoBWAdjustCnt[ifIndex] = 0; - pApCfg->ApCliAutoConnectType[ifIndex] = 0; - pApCfg->bPartialScanEnable[ifIndex] = FALSE; - pApCfg->bPartialScanning[ifIndex] = FALSE; - return TRUE; - } - - pApCfg->ApCliTab[ifIndex].AutoConnectFlag = TRUE; - Set_ApCli_Enable_Proc(pAd, "0"); - pApCfg->ApCliAutoConnectRunning[ifIndex] = TRUE; - pApCfg->ApCliAutoBWAdjustCnt[ifIndex] = 0; - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) Set_ApCli_AutoConnect_Proc::(Len=%d,Ssid=%s)\n", - ifIndex, pApCfg->ApCliTab[ifIndex].CfgSsidLen, - pApCfg->ApCliTab[ifIndex].CfgSsid)); - - /* - use site survey function to trigger auto connecting (when pAd->ApCfg.ApAutoConnectRunning == TRUE) - */ - switch (scan_mode) { - case 2: /* partial scan */ - pAd->ScanCtrl.PartialScan.pwdev = - &pApCfg->ApCliTab[ifIndex].wdev; - pAd->ScanCtrl.PartialScan.bScanning = TRUE; - pApCfg->ApCliAutoConnectType[ifIndex] = TRIGGER_SCAN_BY_USER; - pApCfg->bPartialScanEnable[ifIndex] = TRUE; - pApCfg->bPartialScanning[ifIndex] = TRUE; - break; - case 3: /* full scan and autoconnect in ApCliCtrlJoinReqTimeoutAction, debug purpose */ - pAd->ScanCtrl.PartialScan.bScanning = FALSE; - pApCfg->ApCliAutoConnectType[ifIndex] = TRIGGER_SCAN_BY_DRIVER; - pApCfg->bPartialScanEnable[ifIndex] = FALSE; - pApCfg->bPartialScanning[ifIndex] = FALSE; - ApSiteSurvey_by_wdev(pAd, &Ssid, SCAN_ACTIVE, FALSE, - &pApCfg->ApCliTab[ifIndex].wdev); - break; - case 1: /* full scan and autoconnect in RTMPRepeaterReconnectionCheck */ - default: - pAd->ScanCtrl.PartialScan.bScanning = FALSE; - pApCfg->ApCliAutoConnectType[ifIndex] = TRIGGER_SCAN_BY_USER; - pApCfg->bPartialScanEnable[ifIndex] = FALSE; - pApCfg->bPartialScanning[ifIndex] = FALSE; - ApSiteSurvey_by_wdev(pAd, &Ssid, SCAN_ACTIVE, FALSE, - &pApCfg->ApCliTab[ifIndex].wdev); - break; - } - - return TRUE; -} -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - -#ifdef WSC_AP_SUPPORT -INT Set_AP_WscSsid_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex = pObj->ioctl_if; - PWSC_CTRL pWscControl = &pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - NdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID)); - - if ((strlen(arg) > 0) && (strlen(arg) <= MAX_LEN_OF_SSID)) { - NdisMoveMemory(pWscControl->WscSsid.Ssid, arg, strlen(arg)); - pWscControl->WscSsid.SsidLength = strlen(arg); - NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, - MAX_LEN_OF_SSID); - NdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, - strlen(arg)); - pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscSsid_Proc:: (Select SsidLen=%d,Ssid=%s)\n", - pWscControl->WscSsid.SsidLength, - pWscControl->WscSsid.Ssid)); - } else - return FALSE; /*Invalid argument */ - - return TRUE; -} - -#ifdef APCLI_SUPPORT -INT Set_ApCli_WscScanMode_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR Mode = TRIGGER_FULL_SCAN; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex = pObj->ioctl_if; - PWSC_CTRL pWscControl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - Mode = simple_strtol(arg, 0, 10); - if (Mode != TRIGGER_PARTIAL_SCAN) - Mode = TRIGGER_FULL_SCAN; - -#ifdef AP_SCAN_SUPPORT - if ((pWscControl->WscApCliScanMode == TRIGGER_PARTIAL_SCAN) && - (Mode != TRIGGER_PARTIAL_SCAN)) { - pAd->ScanCtrl.PartialScan.pwdev = NULL; - pAd->ScanCtrl.PartialScan.LastScanChannel = 0; - pAd->ScanCtrl.PartialScan.bScanning = FALSE; - } -#endif /* AP_SCAN_SUPPORT */ - pWscControl->WscApCliScanMode = Mode; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:: (WscApCliScanMode=%d)\n", __func__, Mode)); - - return TRUE; -} -#endif /* APCLI_SUPPORT */ - -#endif /* WSC_AP_SUPPORT */ - -#ifdef APCLI_CERT_SUPPORT -INT Set_ApCli_Cert_Enable_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - UINT Enable; - POS_COOKIE pObj; - UCHAR ifIndex; - UCHAR wmode; - struct wifi_dev *wdev = NULL; - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - ifIndex = pObj->ioctl_if; - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - wmode = wdev->PhyMode; - Enable = os_str_tol(arg, 0, 16); - pAd->bApCliCertTest = (Enable > 0) ? TRUE : FALSE; - - if (pAd->bApCliCertTest == TRUE) { - pAd->CommonCfg.bEnableTxBurst = FALSE; - /* TGn case 5.2.47 & 5.2.50 */ - pAd->CommonCfg.bSeOff = 1; - if (WMODE_CAP_2G(wmode)) - pAd->CommonCfg.g_band_256_qam = FALSE; - /* TGn case 5.2.3 */ - HW_IO_WRITE32(pAd, RMAC_NAVOPT, 0); - -#if defined(WHNAT_SUPPORT) && defined(PKT_BUDGET_CTRL_SUPPORT) - /* - * Decrease budget control queue size if wifi nat is enabled - * Only 1024 hardware tokens are available to the host - * whereas budget control AC queue sizes are larger than it. - * These will cause packets in sw queue to be dropped - * due to non availability of tokens. - * WMM traffic differentiation test cases will fail since - * pkts will be dropped without priority check. - * - * for TGn case 5.2.27 & 5.2.30 - */ - if ((pAd->CommonCfg.whnat_en) && - (IS_ASIC_CAP(pAd, fASIC_CAP_MCU_OFFLOAD))) { - pAd->pbc_bound[PBC_AC_BE] = PBC_WMM_UP_DEFAULT_BE / 2; - pAd->pbc_bound[PBC_AC_BK] = PBC_WMM_UP_DEFAULT_BK / 2; - pAd->pbc_bound[PBC_AC_VO] = PBC_WMM_UP_DEFAULT_VO / 2; - pAd->pbc_bound[PBC_AC_VI] = PBC_WMM_UP_DEFAULT_VI / 2; - } -#endif - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) Set_ApCli_Cert_Enable_Proc::(enable = %d)\n", - ifIndex, pAd->bApCliCertTest)); - return TRUE; -} - -/* Add for APCLI PMF 5.3.3.3 option test item. (Only Tx De-auth Req. and make sure the pkt can be Encrypted) */ -INT ApCliTxDeAuth(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - USHORT Reason = (USHORT)REASON_DEAUTH_STA_LEAVING; -#ifdef MAC_REPEATER_SUPPORT - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - UCHAR CliIdx = 0xFF; -#endif /* MAC_REPEATER_SUPPORT */ - HEADER_802_11 DeauthHdr; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - NDIS_STATUS NStatus; - POS_COOKIE pObj; - UCHAR ifIndex; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (pObj->ioctl_if_type != INT_APCLI) - return FALSE; - - ifIndex = pObj->ioctl_if; - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s : ifIndex=%u\n", __func__, ifIndex)); - - if ((ifIndex >= MAX_APCLI_NUM) -#ifdef MAC_REPEATER_SUPPORT - && (ifIndex < REPT_MLME_START_IDX) -#endif /* MAC_REPEATER_SUPPORT */ - ) - return FALSE; - -#ifdef MAC_REPEATER_SUPPORT - - if (ifIndex >= REPT_MLME_START_IDX) { - CliIdx = ifIndex - REPT_MLME_START_IDX; - pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - ifIndex = pReptEntry->wdev->func_idx; - } - -#endif /* MAC_REPEATER_SUPPORT */ - NStatus = MlmeAllocateMemory( - pAd, &pOutBuffer); /*Get an unused nonpaged memory */ - - if (NStatus != NDIS_STATUS_SUCCESS) - return FALSE; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s: DE-AUTH request (Reason=%d)...\n", __func__, Reason)); - ApCliMgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, - pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, - pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, - ifIndex); -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx != 0xFF) - COPY_MAC_ADDR( - DeauthHdr.Addr2, - pAd->ApCfg.pRepeaterCliPool[CliIdx].CurrentAddress); - -#endif /* MAC_REPEATER_SUPPORT */ - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &DeauthHdr, 2, &Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - return TRUE; -} - -#endif /* APCLI_CERT_SUPPORT */ -#ifdef ROAMING_ENHANCE_SUPPORT -INT Set_RoamingEnhance_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT Enable; - POS_COOKIE pObj; - UCHAR ifIndex; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - ifIndex = pObj->ioctl_if; - Enable = simple_strtol(arg, 0, 10); - pAd->ApCfg.bRoamingEnhance = (Enable > 0) ? TRUE : FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) %s::(enable = %d)\n", ifIndex, __func__, - pAd->ApCfg.bRoamingEnhance)); - return TRUE; -} -#endif /* ROAMING_ENHANCE_SUPPORT */ -#endif /* APCLI_SUPPORT */ - -#ifdef WSC_AP_SUPPORT -INT Set_Wps_Cert_Enable_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - UINT Enable; - POS_COOKIE pObj; - UCHAR ifIndex; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - ifIndex = pObj->ioctl_if; - Enable = os_str_tol(arg, 0, 16); - pAd->bWpsCertTest = (Enable > 0) ? TRUE : FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_Wps_Cert_Enable_Proc::(enable = %d)\n", - pAd->bWpsCertTest)); - return TRUE; -} -#endif - -#ifdef WSC_AP_SUPPORT -#ifdef CON_WPS -static INT WscPushConcurrentPBCAction(IN PRTMP_ADAPTER pAd, - IN PWSC_CTRL pWscControl, - IN BOOLEAN bIsApCli) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - INT idx; - - if (bIsApCli) - pWscControl->WscConfMode = WSC_ENROLLEE; - else - pWscControl->WscConfMode = WSC_REGISTRAR; - - WscInit(pAd, bIsApCli, apidx); - pWscControl->WscMode = WSC_PBC_MODE; - WscGetRegDataPIN(pAd, pWscControl->WscPinCode, pWscControl); - WscStop(pAd, bIsApCli, pWscControl); - pWscControl->RegData.ReComputePke = 1; - WscInitRegistrarPair(pAd, pWscControl, apidx); - - for (idx = 0; idx < 192; idx++) - pWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAd); - - pWscControl->bWscAutoTigeer = FALSE; - - if (bIsApCli) { - pAd->ApCfg.ApCliTab[apidx].Enable = FALSE; - ApCliIfDown(pAd); - pWscControl->WscSsid.SsidLength = 0; - NdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID)); - pWscControl->WscPBCBssCount = 0; - /* WPS - SW PBC */ - WscPushPBCAction(pAd, pWscControl); - } else { - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - WscBuildBeaconIE(pAd, pWscControl->WscConfStatus, TRUE, - DEV_PASS_ID_PBC, pWscControl->WscConfigMethods, - apidx, NULL, 0, AP_MODE); - WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, - pWscControl->WscConfStatus, TRUE, - DEV_PASS_ID_PBC, - pWscControl->WscConfigMethods, apidx, NULL, - 0, AP_MODE); - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - RTMPSetTimer(&pWscControl->Wsc2MinsTimer, - WSC_TWO_MINS_TIME_OUT); - pWscControl->Wsc2MinsTimerRunning = TRUE; - pWscControl->WscStatus = STATUS_WSC_LINK_UP; - pWscControl->bWscTrigger = TRUE; - RTMP_SEM_LOCK(&pWscControl->WscPeerListSemLock); - WscClearPeerList(&pWscControl->WscPeerList); - RTMP_SEM_UNLOCK(&pWscControl->WscPeerListSemLock); - } - - return TRUE; -} - -INT Set_ConWpsApCliMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef MULTI_INF_SUPPORT - UINT Mode = CON_WPS_APCLI_BAND_AUTO; - UINT opposBandIdx = !multi_inf_get_idx(pAd); - PRTMP_ADAPTER pOpposAd = NULL; - - Mode = os_str_tol(arg, 0, 10); - - if (Mode >= CON_WPS_APCLI_BAND_MAX) - return FALSE; - - pOpposAd = (PRTMP_ADAPTER)adapt_list[opposBandIdx]; - pAd->ApCfg.ConWpsApCliMode = Mode; - - if (pOpposAd != NULL) { - pOpposAd->ApCfg.ConWpsApCliMode = Mode; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, Oppos: %s, Mode = %d\n", __func__, - pAd->net_dev->name, pOpposAd->net_dev->name, Mode)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, Mode = %d\n", __func__, - pAd->net_dev->name, Mode)); - } - -#else - UINT Mode = CON_WPS_APCLI_BAND_AUTO; - - Mode = os_str_tol(arg, 0, 10); - - if (Mode >= CON_WPS_APCLI_BAND_MAX) - return FALSE; - - pAd->ApCfg.ConWpsApCliMode = Mode; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, Mode = %d\n", __func__, - pAd->net_dev->name, Mode)); -#endif - return TRUE; -} - -INT Set_ConWpsApcliAutoPreferIface_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef MULTI_INF_SUPPORT - UINT PreferIface = CON_WPS_APCLI_AUTO_PREFER_IFACE0; - UINT opposBandIdx = !multi_inf_get_idx(pAd); - PRTMP_ADAPTER pOpposAd = NULL; - - PreferIface = os_str_tol(arg, 0, 10); - - if (PreferIface >= CON_WPS_APCLI_AUTO_PREFER_IFACE_MAX) - return FALSE; - - pOpposAd = (PRTMP_ADAPTER)adapt_list[opposBandIdx]; - pAd->ApCfg.ConWpsApcliAutoPreferIface = PreferIface; - - if (pOpposAd != NULL) { - pOpposAd->ApCfg.ConWpsApcliAutoPreferIface = PreferIface; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, Oppos: %s, PreferIface = %d\n", __func__, - pAd->net_dev->name, pOpposAd->net_dev->name, - PreferIface)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, PreferIface = %d\n", __func__, - pAd->net_dev->name, PreferIface)); - } - -#else - UINT PreferIface = CON_WPS_APCLI_AUTO_PREFER_IFACE0; - - PreferIface = os_str_tol(arg, 0, 10); - pAd->ApCfg.ConWpsApcliAutoPreferIface = PreferIface; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, PreferIface = %d\n", __func__, - pAd->net_dev->name, PreferIface)); -#endif - return TRUE; -} - -INT Set_ConWpsApCliDisabled_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef MULTI_INF_SUPPORT - UINT Disabled = FALSE; - UINT opposBandIdx = !multi_inf_get_idx(pAd); - PRTMP_ADAPTER pOpposAd = NULL; - - Disabled = os_str_tol(arg, 0, 10); - pOpposAd = (PRTMP_ADAPTER)adapt_list[opposBandIdx]; - pAd->ApCfg.ConWpsApCliDisableSetting = Disabled; - - if (pOpposAd != NULL) { - pOpposAd->ApCfg.ConWpsApCliDisableSetting = Disabled; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, Oppos: %s, ApClient Disabled = %d\n", - __func__, pAd->net_dev->name, pOpposAd->net_dev->name, - Disabled)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, ApClient Disabled = %d\n", __func__, - pAd->net_dev->name, Disabled)); - } - -#else - UINT Disabled = FALSE; - - Disabled = os_str_tol(arg, 0, 10); - pAd->ApCfg.ConWpsApCliDisableSetting = Disabled; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, ApClient Disabled = %d\n", __func__, - pAd->net_dev->name, Disabled)); -#endif - return TRUE; -} - -INT Set_ConWpsApDisabled_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef MULTI_INF_SUPPORT - UINT Disabled = FALSE; - UINT opposBandIdx = !multi_inf_get_idx(pAd); - PRTMP_ADAPTER pOpposAd = NULL; - - Disabled = simple_strtol(arg, 0, 10); - pOpposAd = (PRTMP_ADAPTER)adapt_list[opposBandIdx]; - pAd->ApCfg.ConWpsApDisableSetting = Disabled; - - if (pOpposAd != NULL) { - pOpposAd->ApCfg.ConWpsApDisableSetting = Disabled; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, Oppos: %s, Ap Disabled = %d\n", __func__, - pAd->net_dev->name, pOpposAd->net_dev->name, - Disabled)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, Ap Disabled = %d\n", __func__, - pAd->net_dev->name, Disabled)); - } - -#else - UINT Disabled = FALSE; - - Disabled = simple_strtol(arg, 0, 10); - pAd->ApCfg.ConWpsApDisableSetting = Disabled; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s Now: %s, Ap Disabled = %d\n", __func__, - pAd->net_dev->name, Disabled)); -#endif - return TRUE; -} -#endif /* CON_WPS */ - -INT Set_AP_WscConfMode_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - INT ConfModeIdx; - /*INT IsAPConfigured; */ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN]; - BOOLEAN bFromApCli = FALSE; - PWSC_CTRL pWscControl; -#ifdef CON_WPS - struct wifi_dev *pWdev = NULL; -#endif - ConfModeIdx = os_str_tol(arg, 0, 10); -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return FALSE; - } - -#endif /*HOSTAPD_SUPPORT*/ -#ifdef CON_WPS - - if (ConfModeIdx == WSC_ENROLLEE_REGISTRAR) { - UINT ApClientWcid = 0; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WPS is using concurrent WPS now apidx=%d\n", apidx)); - - if ((pAd->ApCfg.ConWpsApCliDisableSetting == TRUE) && - (apidx < pAd->ApCfg.ApCliNum) && - (pAd->ApCfg.ApCliTab[apidx].CtrlCurrState == - APCLI_CTRL_CONNECTED)) { - ApClientWcid = pAd->ApCfg.ApCliTab[apidx].MacTabWCID; - - if ((pAd->MacTab.Content[ApClientWcid].Sst == - SST_ASSOC) && - (pAd->MacTab.tr_entry[ApClientWcid].PortSecured == - WPA_802_1X_PORT_SECURED)) - pAd->ApCfg.ConWpsApCliDisabled = TRUE; - } - - if (pAd->ApCfg.ConWpsApCliDisabled == TRUE) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Diabled the ApClient when using concurrent WPS now.\n")); - else if ((apidx < pAd->ApCfg.ApCliNum) && - (pAd->ApCfg.ApCliTab[apidx].Enable)) { - pWdev = &(pAd->ApCfg.ApCliTab[apidx].wdev); - - if (pWdev != NULL) { - pWscControl = &pAd->ApCfg.ApCliTab[apidx] - .wdev.WscControl; - pWscControl->conWscStatus = - CON_WPS_STATUS_APCLI_RUNNING; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Set_AP_WscConfMode_Proc enter WscPushConcurrentPBCAction(apcli%d) pWscControl=0x%p\n", - apidx, pWscControl)); - RTMPZeroMemory(pAd->ApCfg.ApCliTab[apidx] - .wdev.WscControl.IfName, - IFNAMSIZ); - RTMPMoveMemory(pAd->ApCfg.ApCliTab[apidx] - .wdev.WscControl.IfName, - pWdev->if_dev->name, IFNAMSIZ); - WscPushConcurrentPBCAction(pAd, pWscControl, - TRUE); - } - } - - if (pAd->ApCfg.ConWpsApDisableSetting == TRUE) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Disable the AP when using concurrent WPS now\n")); - else { - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - pWscControl->conWscStatus = CON_WPS_STATUS_AP_RUNNING; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Set_AP_WscConfMode_Proc enter WscPushConcurrentPBCAction(ra%d)\n", - apidx)); - WscPushConcurrentPBCAction(pAd, pWscControl, FALSE); - } - - return TRUE; - } - -#endif /* CON_WPS */ -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - bFromApCli = TRUE; - pWscControl = &pAd->ApCfg.ApCliTab[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscConfMode_Proc:: This command is from apcli interface now.\n", - apidx)); - } else -#endif /* APCLI_SUPPORT */ - { - bFromApCli = FALSE; - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscConfMode_Proc:: This command is from ra interface now.\n", - apidx)); - } - - pWscControl->bWscTrigger = FALSE; - - if ((ConfModeIdx & WSC_ENROLLEE_PROXY_REGISTRAR) == WSC_DISABLE) { - pWscControl->WscConfMode = WSC_DISABLE; - pWscControl->WscStatus = STATUS_WSC_NOTUSED; - - if (bFromApCli) - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscConfMode_Proc:: WPS is disabled.\n", - apidx)); - else { - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscConfMode_Proc:: WPS is disabled.\n", - apidx)); - /* Clear WPS IE in Beacon and ProbeResp */ - wdev->WscIEBeacon.ValueLen = 0; - wdev->WscIEProbeResp.ValueLen = 0; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } - } else { -#ifdef APCLI_SUPPORT - - if (bFromApCli) { - if (ConfModeIdx == WSC_ENROLLEE) { - pWscControl->WscConfMode = WSC_ENROLLEE; - WscInit(pAd, TRUE, apidx); - } else { - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscConfMode_Proc:: Ap Client only supports Enrollee mode.(ConfModeIdx=%d)\n", - apidx, ConfModeIdx)); - return FALSE; - } - } else -#endif /* APCLI_SUPPORT */ - { - pWscControl->WscConfMode = - (ConfModeIdx & WSC_ENROLLEE_PROXY_REGISTRAR); - WscInit(pAd, FALSE, apidx); - } - - pWscControl->WscStatus = STATUS_WSC_IDLE; - } - -#ifdef APCLI_SUPPORT - - if (bFromApCli) - memcpy(mac_addr, &pAd->ApCfg.ApCliTab[apidx].wdev.if_addr[0], - MAC_ADDR_LEN); - else -#endif /* APCLI_SUPPORT */ - { - memcpy(mac_addr, &pAd->ApCfg.MBSSID[apidx].wdev.bssid[0], - MAC_ADDR_LEN); - } - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscConfMode_Proc::(WscConfMode(0~7)=%d)\n", - PRINT_MAC(mac_addr), pWscControl->WscConfMode)); - return TRUE; -} - -INT Set_AP_WscConfStatus_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR IsAPConfigured = 0; - INT IsSelectedRegistrar; - USHORT WscMode; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return FALSE; - } - -#endif /*HOSTAPD_SUPPORT*/ -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscConfStatus_Proc:: Ap Client doesn't need this command.\n", - apidx)); - return FALSE; - } - -#endif /* APCLI_SUPPORT */ -#ifdef CONFIG_AP_SUPPORT -#ifdef WSC_V2_SUPPORT - - if ((pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscV2Info.bWpsEnable == - FALSE) && - (pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscV2Info.bEnableWpsV2)) { - pAd->ApCfg.MBSSID[apidx].wdev.WscIEBeacon.ValueLen = 0; - pAd->ApCfg.MBSSID[apidx].wdev.WscIEProbeResp.ValueLen = 0; - return FALSE; - } - -#endif /* WSC_V2_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - IsAPConfigured = (UCHAR)os_str_tol(arg, 0, 10); - IsSelectedRegistrar = - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscSelReg; - - if (pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscMode == 1) - WscMode = DEV_PASS_ID_PIN; - else - WscMode = DEV_PASS_ID_PBC; - - if ((IsAPConfigured > 0) && (IsAPConfigured <= 2)) { - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscConfStatus = - IsAPConfigured; - /* Change SC State of WPS IE in Beacon and ProbeResp */ - WscBuildBeaconIE(pAd, IsAPConfigured, IsSelectedRegistrar, - WscMode, 0, apidx, NULL, 0, AP_MODE); - WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, - IsAPConfigured, IsSelectedRegistrar, - WscMode, 0, apidx, NULL, 0, AP_MODE); - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscConfStatus_Proc:: Set failed!!(WscConfStatus=%s), WscConfStatus is 1 or 2\n", - apidx, arg)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscConfStatus_Proc:: WscConfStatus is not changed (%d)\n", - apidx, - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscConfStatus)); - return FALSE; /*Invalid argument */ - } - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscConfStatus_Proc::(WscConfStatus=%d)\n", - PRINT_MAC(pAd->ApCfg.MBSSID[apidx].wdev.bssid), - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscConfStatus)); - return TRUE; -} - -INT Set_AP_WscMode_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - INT WscMode; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN]; - PWSC_CTRL pWscControl; - BOOLEAN bFromApCli = FALSE; -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return FALSE; - } - -#endif /*HOSTAPD_SUPPORT*/ -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - bFromApCli = TRUE; - pWscControl = &pAd->ApCfg.ApCliTab[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscMode_Proc:: This command is from apcli interface now.\n", - apidx)); - } else -#endif /* APCLI_SUPPORT */ - { - bFromApCli = FALSE; - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscMode_Proc:: This command is from ra interface now.\n", - apidx)); - } - - WscMode = os_str_tol(arg, 0, 10); - - if ((WscMode > 0) && (WscMode <= 2)) { - pWscControl->WscMode = WscMode; - - if (WscMode == WSC_PBC_MODE) - WscGetRegDataPIN(pAd, pWscControl->WscPinCode, - pWscControl); - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscMode_Proc:: Set failed!!(Set_WscMode_Proc=%s), WscConfStatus is 1 or 2\n", - arg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscMode_Proc:: WscMode is not changed (%d)\n", - pWscControl->WscMode)); - return FALSE; /*Invalid argument */ - } - -#ifdef APCLI_SUPPORT - - if (bFromApCli) - memcpy(mac_addr, pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, - MAC_ADDR_LEN); - else -#endif /* APCLI_SUPPORT */ - { - memcpy(mac_addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid, - MAC_ADDR_LEN); - } - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscMode_Proc::(WscMode=%d)\n", - PRINT_MAC(mac_addr), pWscControl->WscMode)); - return TRUE; -} - -INT Set_WscStatus_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscStatus_Proc::(WscStatus=%d)\n", apidx, - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscStatus)); - return TRUE; -} - -#define WSC_GET_CONF_MODE_EAP 1 -#define WSC_GET_CONF_MODE_UPNP 2 -INT Set_AP_WscGetConf_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - INT WscMode, wscGetConfMode = 0; - INT IsAPConfigured; - PWSC_CTRL pWscControl; - PWSC_UPNP_NODE_INFO pWscUPnPNodeInfo; - INT idx; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN]; - BOOLEAN bFromApCli = FALSE; -#ifdef WSC_V2_SUPPORT - PWSC_V2_INFO pWscV2Info = NULL; -#endif /* WSC_V2_SUPPORT */ -#ifdef WSC_LED_SUPPORT - UCHAR WPSLEDStatus; -#endif /* WSC_LED_SUPPORT */ -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return FALSE; - } - -#endif /*HOSTAPD_SUPPORT*/ -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - if (pAd->ApCfg.ApCliTab[apidx].ApCliInit == FALSE) { - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_AP_WscGetConf_Proc:: ApCli is disabled.\n", - apidx)); - return FALSE; - } - - bFromApCli = TRUE; - apidx &= (~MIN_NET_DEVICE_FOR_APCLI); - pWscControl = &pAd->ApCfg.ApCliTab[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_AP_WscGetConf_Proc:: This command is from apcli interface now.\n", - apidx)); - } else -#endif /* APCLI_SUPPORT */ - { - bFromApCli = FALSE; - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_AP_WscGetConf_Proc:: This command is from ra interface now.\n", - apidx)); - } - - NdisZeroMemory(mac_addr, MAC_ADDR_LEN); -#ifdef WSC_V2_SUPPORT - pWscV2Info = &pWscControl->WscV2Info; -#endif /* WSC_V2_SUPPORT */ - wscGetConfMode = os_str_tol(arg, 0, 10); - IsAPConfigured = pWscControl->WscConfStatus; - pWscUPnPNodeInfo = &pWscControl->WscUPnPNodeInfo; - - if ((pWscControl->WscConfMode == WSC_DISABLE) -#ifdef WSC_V2_SUPPORT - || ((pWscV2Info->bWpsEnable == FALSE) && (pWscV2Info->bEnableWpsV2)) -#endif /* WSC_V2_SUPPORT */ - ) { - pWscControl->bWscTrigger = FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscGetConf_Proc: WPS is disabled.\n")); - return FALSE; - } - - WscStop(pAd, bFromApCli, pWscControl); - /* trigger wsc re-generate public key */ - pWscControl->RegData.ReComputePke = 1; - - if (pWscControl->WscMode == 1) - WscMode = DEV_PASS_ID_PIN; - else - WscMode = DEV_PASS_ID_PBC; - - WscInitRegistrarPair(pAd, pWscControl, apidx); - - /* Enrollee 192 random bytes for DH key generation */ - for (idx = 0; idx < 192; idx++) - pWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAd); - -#ifdef APCLI_SUPPORT - - if (bFromApCli) { - BOOLEAN apcliEn = pAd->ApCfg.ApCliTab[apidx].Enable; - /* bring apcli interface down first */ - pAd->ApCfg.ApCliTab[apidx].Enable = FALSE; - ApCliIfDown(pAd); - - if (WscMode == DEV_PASS_ID_PIN) { - NdisMoveMemory(pWscControl->RegData.SelfInfo.MacAddr, - pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, - 6); - pAd->ApCfg.ApCliTab[apidx].Enable = apcliEn; - } else { - pWscControl->WscSsid.SsidLength = 0; - NdisZeroMemory(&pWscControl->WscSsid, - sizeof(NDIS_802_11_SSID)); - pWscControl->WscPBCBssCount = 0; - /* WPS - SW PBC */ - WscPushPBCAction(pAd, pWscControl); - } - - NdisMoveMemory(mac_addr, - pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, - MAC_ADDR_LEN); - } else -#endif /* APCLI_SUPPORT */ - { - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - WscBuildBeaconIE(pAd, IsAPConfigured, TRUE, WscMode, - pWscControl->WscConfigMethods, apidx, NULL, 0, - AP_MODE); - WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, - IsAPConfigured, TRUE, WscMode, - pWscControl->WscConfigMethods, apidx, NULL, - 0, AP_MODE); - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - NdisMoveMemory(mac_addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid, - MAC_ADDR_LEN); - } - -#ifdef APCLI_SUPPORT - - if (bFromApCli && (WscMode == DEV_PASS_ID_PBC)) - ; - else -#endif /* APCLI_SUPPORT */ - { - /* 2mins time-out timer */ - RTMPSetTimer(&pWscControl->Wsc2MinsTimer, - WSC_TWO_MINS_TIME_OUT); - pWscControl->Wsc2MinsTimerRunning = TRUE; - pWscControl->WscStatus = STATUS_WSC_LINK_UP; -/* WPS_BandSteering Support */ -#ifdef BAND_STEERING - /* WPS: clear any previosly existing WPS WHITELIST in case of AP wps trigger */ - if (!bFromApCli && (pAd->ApCfg.BandSteering)) { - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - PBND_STRG_CLI_TABLE table = - Get_BndStrgTable(pAd, wdev->func_idx); - - if (table && table->bEnabled) { - NdisAcquireSpinLock(&table->WpsWhiteListLock); - ClearWpsWhiteList(&table->WpsWhiteList); - NdisReleaseSpinLock(&table->WpsWhiteListLock); - MTWF_LOG( - DBG_CAT_SEC, CATSEC_WPS, DBG_LVL_TRACE, - ("%s:channel %u wps whitelist cleared, size : %d\n", - __func__, table->Channel, - table->WpsWhiteList.size)); - } - } -#endif - pWscControl->bWscTrigger = TRUE; - } - - pWscControl->bWscAutoTigeer = FALSE; - - if (!bFromApCli) { - if (WscMode == DEV_PASS_ID_PIN) { - WscAssignEntryMAC(pAd, pWscControl); - WscSendUPnPConfReqMsg( - pAd, pWscControl->EntryIfIdx, - (PUCHAR)pAd->ApCfg - .MBSSID[pWscControl->EntryIfIdx] - .Ssid, - pAd->ApCfg.MBSSID[apidx].wdev.bssid, 3, 0, - AP_MODE); - } else { - RTMP_SEM_LOCK(&pWscControl->WscPeerListSemLock); - WscClearPeerList(&pWscControl->WscPeerList); - RTMP_SEM_UNLOCK(&pWscControl->WscPeerListSemLock); - } - } - -#ifdef WSC_LED_SUPPORT - WPSLEDStatus = LED_WPS_IN_PROCESS; - RTMPSetLED(pAd, WPSLEDStatus); -#endif /* WSC_LED_SUPPORT */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscGetConf_Proc trigger WSC state machine, wscGetConfMode=%d\n", - PRINT_MAC(mac_addr), wscGetConfMode)); - return TRUE; -} - -INT Set_AP_WscPinCode_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT PinCode = 0; - BOOLEAN validatePin, bFromApCli = FALSE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN]; - PWSC_CTRL pWscControl; -#define IsZero(c) ('0' == (c) ? TRUE : FALSE) - PinCode = os_str_tol( - arg, 0, - 10); /* When PinCode is 03571361, return value is 3571361. */ -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return FALSE; - } - -#endif /*HOSTAPD_SUPPORT*/ -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - bFromApCli = TRUE; - pWscControl = &pAd->ApCfg.ApCliTab[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscPinCode_Proc:: This command is from apcli interface now.\n", - apidx)); - } else -#endif /* APCLI_SUPPORT */ - { - bFromApCli = FALSE; - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscPinCode_Proc:: This command is from ra interface now.\n", - apidx)); - } - - if (strlen(arg) == 4) - validatePin = TRUE; - else - validatePin = ValidateChecksum(PinCode); - - if (validatePin) { - if (pWscControl->WscRejectSamePinFromEnrollee && - (PinCode == pWscControl->WscLastPinFromEnrollee)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("PIN authentication or communication error occurs!!\n" - "Registrar does NOT accept the same PIN again!(PIN:%s)\n", - arg)); - return FALSE; - } - - pWscControl->WscPinCode = PinCode; - pWscControl->WscLastPinFromEnrollee = pWscControl->WscPinCode; - pWscControl->WscRejectSamePinFromEnrollee = FALSE; - - /* PIN Code */ - if (strlen(arg) == 4) { - pWscControl->WscPinCodeLen = 4; - pWscControl->RegData.PinCodeLen = 4; - NdisMoveMemory(pWscControl->RegData.PIN, arg, 4); - } else { - pWscControl->WscPinCodeLen = 8; - - if (IsZero(*arg)) { - pWscControl->RegData.PinCodeLen = 8; - NdisMoveMemory(pWscControl->RegData.PIN, arg, - 8); - } else - WscGetRegDataPIN(pAd, pWscControl->WscPinCode, - pWscControl); - } - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set failed!!(Set_WscPinCode_Proc=%s), PinCode Checksum invalid\n", - arg)); - return FALSE; /*Invalid argument */ - } - -#ifdef APCLI_SUPPORT - - if (bFromApCli) - memcpy(mac_addr, pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, - MAC_ADDR_LEN); - else -#endif /* APCLI_SUPPORT */ - { - memcpy(mac_addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid, - MAC_ADDR_LEN); - } - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscPinCode_Proc::(PinCode=%d)\n", - PRINT_MAC(mac_addr), pWscControl->WscPinCode)); - return TRUE; -} - -INT Set_WscOOB_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - char *pTempSsid = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return FALSE; - } - -#endif /*HOSTAPD_SUPPORT*/ -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscPinCode_Proc:: Ap Client doesn't need this command.\n", - apidx)); - return FALSE; - } - -#endif /* APCLI_SUPPORT */ -#ifdef WSC_V2_SUPPORT - Set_WscSetupLock_Proc(pAd, "0"); -#endif - Set_AP_WscConfStatus_Proc(pAd, "1"); - Set_SecAuthMode_Proc(pAd, "WPA2PSK"); - Set_SecEncrypType_Proc(pAd, "AES"); - pTempSsid = vmalloc(33); - - if (pTempSsid) { - memset(pTempSsid, 0, 33); - snprintf(pTempSsid, 33, "RalinkInitialAP%02X%02X%02X", - pAd->ApCfg.MBSSID[apidx].wdev.bssid[3], - pAd->ApCfg.MBSSID[apidx].wdev.bssid[4], - pAd->ApCfg.MBSSID[apidx].wdev.bssid[5]); - Set_AP_SSID_Proc(pAd, pTempSsid); - vfree(pTempSsid); - } - - Set_SecWPAPSK_Proc(pAd, "RalinkInitialAPxx1234"); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscOOB_Proc\n", apidx)); - return TRUE; -} - -INT Set_WscStop_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - PWSC_CTRL pWscControl; - BOOLEAN bFromApCli = FALSE; -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return FALSE; - } - -#endif /*HOSTAPD_SUPPORT*/ -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - bFromApCli = TRUE; - pWscControl = &pAd->ApCfg.ApCliTab[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscStop_Proc:: This command is from apcli interface now.\n", - apidx)); - } else -#endif /* APCLI_SUPPORT */ - { - bFromApCli = FALSE; - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscStop_Proc:: This command is from ra interface now.\n", - apidx)); - } - -#ifdef APCLI_SUPPORT - - if (bFromApCli) { - WscStop(pAd, TRUE, pWscControl); - pWscControl->WscConfMode = WSC_DISABLE; - } else -#endif /* APCLI_SUPPORT */ - { - INT IsAPConfigured = pWscControl->WscConfStatus; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - WscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, apidx, NULL, - 0, AP_MODE); - WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, - IsAPConfigured, FALSE, 0, 0, apidx, NULL, 0, - AP_MODE); - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - WscStop(pAd, FALSE, pWscControl); - } - - pWscControl->bWscTrigger = FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<===== Set_WscStop_Proc")); - return TRUE; -} - -#ifdef VENDOR_FEATURE6_SUPPORT -/* copy from RTMPIoctlWscProfile() but the strue is use WSC_CONFIGURED_VALUE_2 */ -VOID RTMPGetCurrentCred(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - WSC_CONFIGURED_VALUE_2 Profile; - RTMP_STRING *msg; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - BSS_STRUCT *pMbss; - struct wifi_dev *wdev; - - pMbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &pMbss->wdev; -#ifdef HOSTAPD_SUPPORT - - if (pMbss->Hostapd == TRUE) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return; - } - -#endif /*HOSTAPD_SUPPORT*/ - memset(&Profile, 0x00, sizeof(WSC_CONFIGURED_VALUE_2)); - Profile.WscConfigured = pMbss->WscControl.WscConfStatus; - NdisZeroMemory(Profile.WscSsid, 32); - NdisMoveMemory(Profile.WscSsid, pMbss->Ssid, pMbss->SsidLen); - Profile.WscSsidLen = pMbss->SsidLen; - Profile.WscAuthMode = WscGetAuthType(wdev->SecConfig.AKMMap); - Profile.WscEncrypType = WscGetEncryType(wdev->SecConfig.PairwiseCipher); - NdisZeroMemory(Profile.WscWPAKey, 64); - - if (Profile.WscEncrypType == 2) { - Profile.DefaultKeyIdx = wdev->SecConfig.PairwiseKeyId + 1; - { - int i; - - for (i = 0; - i < wdev->SecConfig.WepKey[Profile.DefaultKeyIdx] - .KeyLen; - i++) { - snprintf((RTMP_STRING *)Profile.WscWPAKey, - sizeof(Profile.WscWPAKey), "%s%02x", - Profile.WscWPAKey, - wdev->SecConfig - .WepKey[Profile.DefaultKeyIdx] - .Key[i]); - } - - Profile.WscWPAKeyLen = - wdev->SecConfig.WepKey[Profile.DefaultKeyIdx] - .KeyLen; - } - } else if (Profile.WscEncrypType >= 4) { - Profile.DefaultKeyIdx = 2; - NdisMoveMemory(Profile.WscWPAKey, pMbss->WscControl.WpaPsk, - pMbss->WscControl.WpaPskLen); - Profile.WscWPAKeyLen = pMbss->WscControl.WpaPskLen; - } else - Profile.DefaultKeyIdx = 1; - - wrq->u.data.length = sizeof(Profile); - - if (copy_to_user(wrq->u.data.pointer, &Profile, wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: copy_to_user() fail\n", __func__)); - - /* msg = (RTMP_STRING *)kmalloc(sizeof(CHAR)*(2048), MEM_ALLOC_FLAG); */ - os_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR) * (2048)); - - if (msg == NULL) - return; - - memset(msg, 0x00, 2048); - sprintf(msg, "%s", "\n"); - - if (Profile.WscEncrypType == 1) - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s\n", - "Configured", "SSID", "AuthMode", "EncrypType"); - else if (Profile.WscEncrypType == 2) - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s%-13s%-26s\n", - "Configured", "SSID", "AuthMode", "EncrypType", - "DefaultKeyID", "Key"); - else - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s%-64s\n", - "Configured", "SSID", "AuthMode", "EncrypType", "Key"); - - if (Profile.WscConfigured == 1) - sprintf(msg + strlen(msg), "%-12s", "No"); - else - sprintf(msg + strlen(msg), "%-12s", "Yes"); - - sprintf(msg + strlen(msg), "%-33s", Profile.WscSsid); - - if (IS_AKM_WPA1PSK(wdev->SecConfig.AKMMap) || - IS_AKM_WPA2PSK(wdev->SecConfig.AKMMap)) - sprintf(msg + strlen(msg), "%-12s", "WPAPSKWPA2PSK"); - else - sprintf(msg + strlen(msg), "%-12s", - WscGetAuthTypeStr(Profile.WscAuthMode)); - - if (IS_CIPHER_TKIP(wdev->SecConfig.PairwiseCipher) || - IS_CIPHER_CCMP128(wdev->SecConfig.PairwiseCipher)) - sprintf(msg + strlen(msg), "%-12s", "TKIPAES"); - else - sprintf(msg + strlen(msg), "%-12s", - WscGetEncryTypeStr(Profile.WscEncrypType)); - - if (Profile.WscEncrypType == 1) - sprintf(msg + strlen(msg), "%s\n", ""); - else if (Profile.WscEncrypType == 2) { - sprintf(msg + strlen(msg), "%-13d", Profile.DefaultKeyIdx); - sprintf(msg + strlen(msg), "%-26s\n", Profile.WscWPAKey); - } else if (Profile.WscEncrypType >= 4) - sprintf(msg + strlen(msg), "%-64s\n", Profile.WscWPAKey); - -#ifdef INF_AR9 - wrq->u.data.length = strlen(msg); - copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); -#endif /* INF_AR9 */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s", msg)); - os_free_mem(msg); -} -#endif /* VENDOR_FEATURE6_SUPPORT */ - -/* - ========================================================================== - Description: - Get WSC Profile - Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 get_wsc_profile - 3.) UI needs to prepare at least 4096bytes to get the results - ========================================================================== -*/ -VOID RTMPIoctlWscProfile(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - WSC_CONFIGURED_VALUE Profile; - RTMP_STRING *msg; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - BSS_STRUCT *pMbss; - struct wifi_dev *wdev; - - pMbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &pMbss->wdev; -#ifdef HOSTAPD_SUPPORT - - if (pMbss->Hostapd == Hostapd_EXT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS is control by hostapd now.\n")); - return; - } - -#endif /*HOSTAPD_SUPPORT*/ - memset(&Profile, 0x00, sizeof(WSC_CONFIGURED_VALUE)); - Profile.WscConfigured = pMbss->wdev.WscControl.WscConfStatus; - NdisZeroMemory(Profile.WscSsid, 32 + 1); - NdisMoveMemory(Profile.WscSsid, pMbss->Ssid, pMbss->SsidLen); - Profile.WscSsid[pMbss->SsidLen] = '\0'; - Profile.WscAuthMode = WscGetAuthType(wdev->SecConfig.AKMMap); - Profile.WscEncrypType = WscGetEncryType(wdev->SecConfig.PairwiseCipher); - NdisZeroMemory(Profile.WscWPAKey, 64 + 1); - - if (Profile.WscEncrypType == 2) { - Profile.DefaultKeyIdx = wdev->SecConfig.PairwiseKeyId + 1; - { - int i; - - for (i = 0; - i < wdev->SecConfig.WepKey[Profile.DefaultKeyIdx] - .KeyLen; - i++) { - snprintf((RTMP_STRING *)Profile.WscWPAKey, - sizeof(Profile.WscWPAKey), "%s%02x", - Profile.WscWPAKey, - wdev->SecConfig - .WepKey[Profile.DefaultKeyIdx] - .Key[i]); - } - - Profile.WscWPAKey[(wdev->SecConfig - .WepKey[Profile.DefaultKeyIdx] - .KeyLen) * - 2] = '\0'; - } - } else if (Profile.WscEncrypType >= 4) { - Profile.DefaultKeyIdx = 2; - NdisMoveMemory(Profile.WscWPAKey, pMbss->wdev.WscControl.WpaPsk, - pMbss->wdev.WscControl.WpaPskLen); - Profile.WscWPAKey[pMbss->wdev.WscControl.WpaPskLen] = '\0'; - } else - Profile.DefaultKeyIdx = 1; - - wrq->u.data.length = sizeof(Profile); - - if (copy_to_user(wrq->u.data.pointer, &Profile, wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: copy_to_user() fail\n", __func__)); - - os_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR) * (2048)); - - if (msg == NULL) - return; - - memset(msg, 0x00, 2048); - sprintf(msg, "%s", "\n"); - - if (Profile.WscEncrypType == 1) - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s\n", - "Configured", "SSID", "AuthMode", "EncrypType"); - else if (Profile.WscEncrypType == 2) - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s%-13s%-26s\n", - "Configured", "SSID", "AuthMode", "EncrypType", - "DefaultKeyID", "Key"); - else - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s%-64s\n", - "Configured", "SSID", "AuthMode", "EncrypType", "Key"); - - if (Profile.WscConfigured == 1) - sprintf(msg + strlen(msg), "%-12s", "No"); - else - sprintf(msg + strlen(msg), "%-12s", "Yes"); - - sprintf(msg + strlen(msg), "%-33s", Profile.WscSsid); - - if (IS_AKM_WPA1PSK(wdev->SecConfig.AKMMap) || - IS_AKM_WPA2PSK(wdev->SecConfig.AKMMap)) - sprintf(msg + strlen(msg), "%-12s", "WPAPSKWPA2PSK"); - else - sprintf(msg + strlen(msg), "%-12s", - WscGetAuthTypeStr(Profile.WscAuthMode)); - - if (IS_CIPHER_TKIP(wdev->SecConfig.PairwiseCipher) || - IS_CIPHER_CCMP128(wdev->SecConfig.PairwiseCipher)) - sprintf(msg + strlen(msg), "%-12s", "TKIPAES"); - else - sprintf(msg + strlen(msg), "%-12s", - WscGetEncryTypeStr(Profile.WscEncrypType)); - - if (Profile.WscEncrypType == 1) - sprintf(msg + strlen(msg), "%s\n", ""); - else if (Profile.WscEncrypType == 2) { - sprintf(msg + strlen(msg), "%-13d", Profile.DefaultKeyIdx); - sprintf(msg + strlen(msg), "%-26s\n", Profile.WscWPAKey); - } else if (Profile.WscEncrypType >= 4) - sprintf(msg + strlen(msg), "%-64s\n", Profile.WscWPAKey); - -#ifdef INF_AR9 - wrq->u.data.length = strlen(msg); - copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); -#endif /* INF_AR9 */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s", msg)); - os_free_mem(msg); -} - -#if defined(INF_AR9) || defined(BB_SOC) -#if defined(AR9_MAPI_SUPPORT) || defined(BB_SOC) - -/* - ========================================================================== - Description: - Get WSC Profile - Arguments: - pAdapter Pointer to our adapter - wrq Pointer to the ioctl argument - - Return Value: - None - - Note: - Usage: - 1.) iwpriv ra0 ar9_show get_wsc_profile - 3.) UI needs to prepare at least 4096bytes to get the results - ========================================================================== -*/ -VOID RTMPAR9IoctlWscProfile(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - WSC_CONFIGURED_VALUE Profile; - RTMP_STRING *msg; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - BSS_STRUCT *pMbss; - struct wifi_dev *wdev; - - pMbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &pMbss->wdev; - memset(&Profile, 0x00, sizeof(WSC_CONFIGURED_VALUE)); - Profile.WscConfigured = - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscConfStatus; - NdisZeroMemory(Profile.WscSsid, 32 + 1); - NdisMoveMemory(Profile.WscSsid, pAd->ApCfg.MBSSID[apidx].Ssid, - pAd->ApCfg.MBSSID[apidx].SsidLen); - Profile.WscSsid[pAd->ApCfg.MBSSID[apidx].SsidLen] = '\0'; - Profile.WscAuthMode = WscGetAuthType(wdev->SecConfig.AKMMap); - Profile.WscEncrypType = WscGetEncryType(wdev->SecConfig.PairwiseCipher); - NdisZeroMemory(Profile.WscWPAKey, 64 + 1); - - if (Profile.WscEncrypType == 2) { - Profile.DefaultKeyIdx = wdev->SecConfig.PairwiseKeyId + 1; - { - int i; - - for (i = 0; - i < wdev->SecConfig.WepKey[Profile.DefaultKeyIdx] - .KeyLen; - i++) { - snprintf((RTMP_STRING *)Profile.WscWPAKey, - sizeof(Profile.WscWPAKey), "%s%02x", - Profile.WscWPAKey, - wdev->SecConfig - .WepKey[Profile.DefaultKeyIdx] - .Key[i]); - } - - Profile.WscWPAKey[(wdev->SecConfig - .WepKey[Profile.DefaultKeyIdx] - .KeyLen) * - 2] = '\0'; - } - } else if (Profile.WscEncrypType >= 4) { - Profile.DefaultKeyIdx = 2; - NdisMoveMemory( - Profile.WscWPAKey, - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WpaPsk, - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WpaPskLen); - Profile.WscWPAKey[pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPskLen] = '\0'; - } else - Profile.DefaultKeyIdx = 1; - - os_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR) * (2048)); - - if (msg == NULL) - return; - - memset(msg, 0x00, 2048); - sprintf(msg, "%s", "\n"); - - if (Profile.WscEncrypType == 1) - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s\n", - "Configured", "SSID", "AuthMode", "EncrypType"); - else if (Profile.WscEncrypType == 2) - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s%-13s%-26s\n", - "Configured", "SSID", "AuthMode", "EncrypType", - "DefaultKeyID", "Key"); - else - sprintf(msg + strlen(msg), "%-12s%-33s%-12s%-12s%-64s\n", - "Configured", "SSID", "AuthMode", "EncrypType", "Key"); - - if (Profile.WscConfigured == 1) - sprintf(msg + strlen(msg), "%-12s", "No"); - else - sprintf(msg + strlen(msg), "%-12s", "Yes"); - - sprintf(msg + strlen(msg), "%-33s", Profile.WscSsid); - - if (IS_AKM_WPA1PSK(wdev->SecConfig.AKMMap) || - IS_AKM_WPA2PSK(wdev->SecConfig.AKMMap)) - sprintf(msg + strlen(msg), "%-12s", "WPAPSKWPA2PSK"); - else - sprintf(msg + strlen(msg), "%-12s", - WscGetAuthTypeStr(Profile.WscAuthMode)); - - if (IS_CIPHER_TKIP(wdev->SecConfig.PairwiseCipher) || - IS_CIPHER_CCMP128(wdev->SecConfig.PairwiseCipher)) - sprintf(msg + strlen(msg), "%-12s", "TKIPAES"); - else - sprintf(msg + strlen(msg), "%-12s", - WscGetEncryTypeStr(Profile.WscEncrypType)); - - if (Profile.WscEncrypType == 1) - sprintf(msg + strlen(msg), "%s\n", ""); - else if (Profile.WscEncrypType == 2) { - sprintf(msg + strlen(msg), "%-13d", Profile.DefaultKeyIdx); - sprintf(msg + strlen(msg), "%-26s\n", Profile.WscWPAKey); - } else if (Profile.WscEncrypType >= 4) - sprintf(msg + strlen(msg), "%-64s\n", Profile.WscWPAKey); - - wrq->u.data.length = strlen(msg); - copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); - { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s", msg)); - } - os_free_mem(msg); -} - -VOID RTMPIoctlWscPINCode(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - RTMP_STRING *msg; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UCHAR tempPIN[9] = { 0 }; - - os_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR) * (128)); - - if (msg == NULL) - return; - - memset(msg, 0x00, 128); - sprintf(msg, "%s", "\n"); - sprintf(msg + strlen(msg), "WSC_PINCode="); - - if (pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscEnrolleePinCode) { - if (pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscEnrolleePinCodeLen == 8) - sprintf((RTMP_STRING *)tempPIN, "%08u", - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscEnrolleePinCode); - else - sprintf((RTMP_STRING *)tempPIN, "%04u", - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WscEnrolleePinCode); - - sprintf(msg, "%s%s\n", msg, tempPIN); - } - - wrq->u.data.length = strlen(msg); - copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); - { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s", msg)); - } - os_free_mem(msg); -} - -VOID RTMPIoctlWscStatus(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - RTMP_STRING *msg; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - - os_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR) * (128)); - - if (msg == NULL) - return; - - memset(msg, 0x00, 128); - sprintf(msg, "%s", "\n"); - sprintf(msg + strlen(msg), "WSC_Status="); - sprintf(msg, "%s%d\n", msg, - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscStatus); - wrq->u.data.length = strlen(msg); - copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); - { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s", msg)); - } - os_free_mem(msg); -} - -VOID RTMPIoctlGetWscDynInfo(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - char *msg; - BSS_STRUCT *pMbss; - INT apidx, configstate; - - os_alloc_mem(NULL, (UCHAR **)&msg, - sizeof(CHAR) * (pAd->ApCfg.BssidNum * (14 * 128))); - - if (msg == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Alloc memory failed\n", __func__)); - return; - } - - memset(msg, 0, pAd->ApCfg.BssidNum * (14 * 128)); - sprintf(msg, "%s", "\n"); - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - pMbss = &pAd->ApCfg.MBSSID[apidx]; - - if (pMbss->wdev.WscControl.WscConfStatus == - WSC_SCSTATE_UNCONFIGURED) - configstate = 0; - else - configstate = 1; - - sprintf(msg + strlen(msg), "ra%d\n", apidx); -#ifdef BB_SOC - sprintf(msg + strlen(msg), "DeviceName = %s\n", - (pMbss->wdev.WscControl.RegData.SelfInfo.DeviceName)); -#endif - sprintf(msg + strlen(msg), "UUID = %s\n", - (pMbss->wdev.WscControl.Wsc_Uuid_Str)); - sprintf(msg + strlen(msg), "wpsVersion = 0x%x\n", WSC_VERSION); - sprintf(msg + strlen(msg), "setuoLockedState = %d\n", 0); - sprintf(msg + strlen(msg), "configstate = %d\n", configstate); - sprintf(msg + strlen(msg), "lastConfigError = %d\n", 0); - } - - wrq->u.data.length = strlen(msg); - - if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s", msg)); - - os_free_mem(msg); -} - -VOID RTMPIoctlGetWscRegsDynInfo(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - char *msg; - BSS_STRUCT *pMbss; - INT apidx; - - os_alloc_mem(NULL, (UCHAR **)&msg, - sizeof(CHAR) * (pAd->ApCfg.BssidNum * (14 * 128))); - - if (msg == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Alloc memory failed\n", __func__)); - return; - } - - memset(msg, 0, pAd->ApCfg.BssidNum * (14 * 128)); - sprintf(msg, "%s", "\n"); - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - pMbss = &pAd->ApCfg.MBSSID[apidx]; - sprintf(msg + strlen(msg), "ra%d\n", apidx); -#ifdef BB_SOC - sprintf(msg + strlen(msg), "DeviceName = %s\n", - (pMbss->wdev.WscControl.RegData.SelfInfo.DeviceName)); -#endif - sprintf(msg + strlen(msg), "UUID_R = %s\n", - (pMbss->wdev.WscControl.RegData.PeerInfo.Uuid)); - } - - wrq->u.data.length = strlen(msg); - - if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s", msg)); - - os_free_mem(msg); -} -#endif /* defined(AR9_MAPI_SUPPORT) || defined(BB_SOC) */ -#endif /* defined(INF_AR9) || defined(BB_SOC) */ - -BOOLEAN WscCheckEnrolleeNonceFromUpnp(IN PRTMP_ADAPTER pAdapter, - IN RTMP_STRING *pData, IN USHORT Length, - IN PWSC_CTRL pWscControl) -{ - USHORT WscType, WscLen; - USHORT WscId = WSC_ID_ENROLLEE_NONCE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("check Enrollee Nonce\n")); - - /* We have to look for WSC_IE_MSG_TYPE to classify M2 ~ M8, the remain size must large than 4 */ - while (Length > 4) { - WSC_IE TLV_Recv; - char ZeroNonce[16] = { 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 }; - - memcpy((UINT8 *)&TLV_Recv, pData, 4); - WscType = be2cpu16(TLV_Recv.Type); - WscLen = be2cpu16(TLV_Recv.Length); - pData += 4; - Length -= 4; - - if (WscType == WscId) { - if (RTMPCompareMemory(pWscControl->RegData.SelfNonce, - pData, 16) == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("Nonce match!!\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("<----- WscCheckNonce\n")); - return TRUE; - } else if (NdisEqualMemory(pData, ZeroNonce, 16)) { - /* Intel external registrar will send WSC_NACK with enrollee nonce */ - /* "10 1A 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" */ - /* when AP is configured and user selects not to configure AP. */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Zero Enrollee Nonce!!\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("<----- WscCheckNonce\n")); - return TRUE; - } - } - - /* Offset to net WSC Ie */ - pData += WscLen; - Length -= WscLen; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Nonce mismatch!!\n")); - return FALSE; -} - -UCHAR WscRxMsgTypeFromUpnp(IN PRTMP_ADAPTER pAdapter, IN RTMP_STRING *pData, - IN USHORT Length) -{ - USHORT WscType, WscLen; - { /* Eap-Esp(Messages) */ - /* the first TLV item in EAP Messages must be WSC_IE_VERSION */ - NdisMoveMemory(&WscType, pData, 2); - - if (ntohs(WscType) != WSC_ID_VERSION) - goto out; - - /* Not Wsc Start, We have to look for WSC_IE_MSG_TYPE to classify M2 ~ M8, the remain size must large than 4 */ - while (Length > 4) { - /* arm-cpu has packet alignment issue, it's better to use memcpy to retrieve data */ - NdisMoveMemory(&WscType, pData, 2); - NdisMoveMemory(&WscLen, pData + 2, 2); - WscLen = ntohs(WscLen); - - if (ntohs(WscType) == WSC_ID_MSG_TYPE) - return (*(pData + - 4)); /* Found the message type */ - - pData += (WscLen + 4); - Length -= (WscLen + 4); - } - } -out: - return WSC_MSG_UNKNOWN; -} - -VOID RTMPIoctlSetWSCOOB(IN PRTMP_ADAPTER pAd) -{ - char *pTempSsid = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - - pObj->pSecConfig = &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscPinCode_Proc:: Ap Client doesn't need this command.\n", - apidx)); - return; - } - -#endif /* APCLI_SUPPORT */ -#ifdef WSC_V2_SUPPORT - Set_WscSetupLock_Proc(pAd, "0"); -#endif - Set_AP_WscConfStatus_Proc(pAd, "1"); - Set_SecAuthMode_Proc(pAd, "WPAPSK"); - Set_SecEncrypType_Proc(pAd, "TKIP"); - pTempSsid = vmalloc(33); - - if (pTempSsid) { - memset(pTempSsid, 0, 33); - snprintf(pTempSsid, 33, "RalinkInitialAP%02X%02X%02X", - pAd->ApCfg.MBSSID[apidx].wdev.bssid[3], - pAd->ApCfg.MBSSID[apidx].wdev.bssid[4], - pAd->ApCfg.MBSSID[apidx].wdev.bssid[5]); - Set_AP_SSID_Proc(pAd, pTempSsid); - vfree(pTempSsid); - } - - Set_SecWPAPSK_Proc(pAd, "RalinkInitialAPxx1234"); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscOOB_Proc\n", apidx)); -} - -/* - ========================================================================== - Description: - Set Wsc Security Mode - 0 : WPA2PSK AES - 1 : WPA2PSK TKIP - 2 : WPAPSK AES - 3 : WPAPSK TKIP - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_AP_WscSecurityMode_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - - if (strcmp(arg, "0") == 0) - pAd->ApCfg.MBSSID[apidx].wdev.WscSecurityMode = WPA2PSKAES; - else if (strcmp(arg, "1") == 0) - pAd->ApCfg.MBSSID[apidx].wdev.WscSecurityMode = WPA2PSKTKIP; - else if (strcmp(arg, "2") == 0) - pAd->ApCfg.MBSSID[apidx].wdev.WscSecurityMode = WPAPSKAES; - else if (strcmp(arg, "3") == 0) - pAd->ApCfg.MBSSID[apidx].wdev.WscSecurityMode = WPAPSKTKIP; - else - return FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscSecurityMode_Proc::(WscSecurityMode=%d)\n", - apidx, pAd->ApCfg.MBSSID[apidx].wdev.WscSecurityMode)); - return TRUE; -} - -INT Set_AP_WscMultiByteCheck_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - BOOLEAN bEnable = FALSE; - PWSC_CTRL pWpsCtrl = NULL; - BOOLEAN bFromApCli = FALSE; -#ifdef APCLI_SUPPORT - - if (pObj->ioctl_if_type == INT_APCLI) { - bFromApCli = TRUE; - pWpsCtrl = &pAd->ApCfg.ApCliTab[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(apcli%d) Set_WscConfMode_Proc:: This command is from apcli interface now.\n", - apidx)); - } else -#endif /* APCLI_SUPPORT */ - { - bFromApCli = FALSE; - pWpsCtrl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_WscConfMode_Proc:: This command is from ra interface now.\n", - apidx)); - } - - if (strcmp(arg, "0") == 0) - bEnable = FALSE; - else if (strcmp(arg, "1") == 0) - bEnable = TRUE; - else - return FALSE; - - if (pWpsCtrl->bCheckMultiByte != bEnable) - pWpsCtrl->bCheckMultiByte = bEnable; - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) Set_AP_WscMultiByteCheck_Proc::(bCheckMultiByte=%d)\n", - apidx, pWpsCtrl->bCheckMultiByte)); - return TRUE; -} - -INT Set_WscVersion_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR version = (UCHAR)os_str_tol(arg, 0, 16); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscVersion_Proc::(version=%x)\n", version)); - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.WscControl.RegData.SelfInfo.Version = version; - return TRUE; -} - -#ifdef VENDOR_FEATURE6_SUPPORT -INT Set_WscUUID_STR_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (strlen(arg) == (UUID_LEN_STR - 1)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscUUID_E_Proc[%d]::(arg=%s)\n", pObj->ioctl_if, - arg)); - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .WscControl.Wsc_Uuid_Str[UUID_LEN_STR - 1] = 0; - NdisMoveMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if] - .WscControl.Wsc_Uuid_Str[0], - arg, strlen(arg)); - return TRUE; - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ERROR Set_WscUUID_E_Proc[%d]::(arg=%s), Leng(%d) is incorrect!\n", - pObj->ioctl_if, arg, (int)strlen(arg))); - return FALSE; - } -} - -INT Set_WscUUID_HEX_E_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (strlen(arg) == (UUID_LEN_HEX * 2)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscUUID_HEX_E_Proc[%d]::(arg=%s)\n", - pObj->ioctl_if, arg)); - AtoH(arg, - &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.Wsc_Uuid_E[0], - UUID_LEN_HEX); - hex_dump("Set_WscUUID_HEX_E_Proc OK:", - &pAd->ApCfg.MBSSID[pObj->ioctl_if] - .WscControl.Wsc_Uuid_E[0], - UUID_LEN_HEX); - return TRUE; - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ERROR Set_WscUUID_HEX_E_Proc[%d]::(arg=%s), Leng(%d) is incorrect!\n", - pObj->ioctl_if, arg, (int)strlen(arg))); - return FALSE; - } -} -#endif /* VENDOR_FEATURE6_SUPPORT */ - -#ifdef WSC_V2_SUPPORT -INT Set_WscFragment_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR bool_flag = (UCHAR)os_str_tol(arg, 0, 16); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscFragment_Proc::(bool_flag=%d)\n", bool_flag)); - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl.bWscFragment = - bool_flag; - return TRUE; -} - -INT Set_WscFragmentSize_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - USHORT WscFragSize = (USHORT)os_str_tol(arg, 0, 10); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscFragmentSize_Proc::(WscFragSize=%d)\n", WscFragSize)); - - if ((WscFragSize >= 128) && (WscFragSize <= 300)) - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl.WscFragSize = - WscFragSize; - - return TRUE; -} - -INT Set_WscSetupLock_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR bEnable = (UCHAR)os_str_tol(arg, 0, 10); - PWSC_CTRL pWscControl = - &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl; - - if (bEnable == 0) { - BOOLEAN bCancelled = FALSE; - - pWscControl->PinAttackCount = 0; - - if (pWscControl->WscSetupLockTimerRunning) - RTMPCancelTimer(&pWscControl->WscSetupLockTimer, - &bCancelled); - - WscSetupLockTimeout(NULL, pWscControl, NULL, NULL); - } else { - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - - pWscControl->bSetupLock = TRUE; - WscBuildBeaconIE(pAd, pWscControl->WscConfStatus, FALSE, 0, 0, - pObj->ioctl_if, NULL, 0, AP_MODE); - WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, - pWscControl->WscConfStatus, FALSE, 0, 0, - pObj->ioctl_if, NULL, 0, AP_MODE); - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscSetupLock_Proc::(bSetupLock=%d)\n", - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl.bSetupLock)); - return TRUE; -} - -INT Set_WscV2Support_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR bEnable = (UCHAR)os_str_tol(arg, 0, 10); - PWSC_CTRL pWscControl = - &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl; - - if (bEnable == 0) - pWscControl->WscV2Info.bEnableWpsV2 = FALSE; - else - pWscControl->WscV2Info.bEnableWpsV2 = TRUE; - - if (pWscControl->WscV2Info.bEnableWpsV2) { - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - /* - WPS V2 doesn't support Chiper WEP and TKIP. - */ - struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig; - - if (IS_CIPHER_WEP_TKIP_ONLY(pSecConfig->PairwiseCipher) || - (pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid)) - WscOnOff(pAd, wdev->func_idx, TRUE); - else - WscOnOff(pAd, wdev->func_idx, FALSE); - - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } else - WscInit(pAd, FALSE, pObj->ioctl_if); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscV2Support_Proc::(bEnableWpsV2=%d)\n", - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.WscControl.WscV2Info.bEnableWpsV2)); - return TRUE; -} - -INT Set_WscVersion2_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR version = (UCHAR)os_str_tol(arg, 0, 16); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscVersion2_Proc::(version=%x)\n", version)); - - if (version >= 0x20) - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.WscControl.RegData.SelfInfo.Version2 = version; - else - return FALSE; - - return TRUE; -} - -INT Set_WscExtraTlvTag_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - USHORT new_tag = (USHORT)os_str_tol(arg, 0, 16); - - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.WscControl.WscV2Info.ExtraTlv.TlvTag = new_tag; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscExtraTlvTag_Proc::(new_tag=0x%04X)\n", new_tag)); - return TRUE; -} - -INT Set_WscExtraTlvType_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR type = (UCHAR)os_str_tol(arg, 0, 10); - - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.WscControl.WscV2Info.ExtraTlv.TlvType = type; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscExtraTlvType_Proc::(type=%d)\n", type)); - return TRUE; -} - -INT Set_WscExtraTlvData_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UINT DataLen = (UINT)strlen(arg); - PWSC_TLV pWscTLV; - INT i; - UINT8 apidx = pObj->ioctl_if; - - pWscTLV = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl.WscV2Info.ExtraTlv; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscExtraTlvData_Proc::(DataLen = %d)\n", DataLen)); - - if ((DataLen != 0) && (pWscTLV->TlvType == TLV_HEX)) { - for (i = 0; i < DataLen; i++) { - if (!isxdigit(*(arg + i))) - return FALSE; /*Not Hex value; */ - } - } - - if (pWscTLV->pTlvData) { - os_free_mem(pWscTLV->pTlvData); - pWscTLV->pTlvData = NULL; - } - - if (DataLen == 0) - return TRUE; - - pWscTLV->TlvLen = 0; - os_alloc_mem(NULL, &pWscTLV->pTlvData, DataLen); - - if (pWscTLV->pTlvData) { - if (pWscTLV->TlvType == TLV_ASCII) { - NdisMoveMemory(pWscTLV->pTlvData, arg, DataLen); - pWscTLV->TlvLen = DataLen; - } else { - pWscTLV->TlvLen = DataLen / 2; - AtoH(arg, pWscTLV->pTlvData, pWscTLV->TlvLen); - } - - return TRUE; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscExtraTlvData_Proc::os_alloc_mem fail\n")); - return FALSE; -} - -INT Set_WscMaxPinAttack_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR MaxPinAttack = (UCHAR)os_str_tol(arg, 0, 10); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscMaxPinAttack_Proc::(MaxPinAttack=%d)\n", - MaxPinAttack)); - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl.MaxPinAttack = - MaxPinAttack; - return TRUE; -} - -INT Set_WscSetupLockTime_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UINT SetupLockTime = (UINT)os_str_tol(arg, 0, 10); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscSetupLockTime_Proc::(SetupLockTime=%d)\n", - SetupLockTime)); - pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl.SetupLockTime = - SetupLockTime; - return TRUE; -} - -#endif /* WSC_V2_SUPPORT */ - -INT Set_WscAutoTriggerDisable_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR bEnable = (UCHAR)os_str_tol(arg, 0, 10); - PWSC_CTRL pWscCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WscControl; - - if (bEnable == 0) - pWscCtrl->bWscAutoTriggerDisable = FALSE; - else - pWscCtrl->bWscAutoTriggerDisable = TRUE; - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_WscAutoTriggerDisable_Proc::(bWscAutoTriggerDisable=%d)\n", - pWscCtrl->bWscAutoTriggerDisable)); - return TRUE; -} - -#endif /* WSC_AP_SUPPORT */ - -#ifdef IAPP_SUPPORT -INT Set_IappPID_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - unsigned long IappPid; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - IappPid = os_str_tol(arg, 0, 10); - RTMP_GET_OS_PID(pObj->IappPid, IappPid); - pObj->IappPid_nr = IappPid; - /* MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("pObj->IappPid = %d", GET_PID_NUMBER(pObj->IappPid))); */ - return TRUE; -} /* End of Set_IappPID_Proc */ -#endif /* IAPP_SUPPORT */ - -INT Set_DisConnectSta_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR macAddr[MAC_ADDR_LEN]; - RTMP_STRING *value; - INT i; - MAC_TABLE_ENTRY *pEntry = NULL; - - if (strlen(arg) != - 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */ - return FALSE; - - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid */ - - AtoH(value, (UCHAR *)&macAddr[i++], 1); - } - - if (NdisEqualMemory(&macAddr[0], &BROADCAST_ADDR[0], MAC_ADDR_LEN)) { - Set_DisConnectAllSta_Proc(pAd, "2"); - return TRUE; - } - - pEntry = MacTableLookup(pAd, macAddr); - - if (pEntry) { -#ifdef MAP_R2 - wapp_send_sta_disassoc_stats_event(pAd, pEntry, - REASON_DISASSOC_STA_LEAVING); -#endif - MlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, - FALSE); - /* MacTableDeleteEntry(pAd, pEntry->wcid, Addr); */ - } - - return TRUE; -} - -#ifdef VENDOR_FEATURE7_SUPPORT -INT Set_DisConnectBssSta_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - INT i, bssId = -1; - - bssId = os_str_tol(arg, 0, 10); - if (bssId >= pAd->ApCfg.BssidNum) - return FALSE; - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if (pEntry && IS_ENTRY_CLIENT(pEntry) && - pEntry->Sst == SST_ASSOC && pEntry->func_tb_idx == bssId) { - MlmeDeAuthAction(pAd, pEntry, REASON_DEAUTH_STA_LEAVING, - FALSE); - } - } - return TRUE; -} -#endif - -#ifdef CUSTOMER_DCC_FEATURE -UINT32 GetAuthModeNum(IN UINT32 authMode) -{ - if (IS_AKM_OPEN(authMode)) - return Ndis802_11AuthModeOpen; - else if (IS_AKM_SHARED(authMode)) - return Ndis802_11AuthModeShared; - else if (IS_AKM_AUTOSWITCH(authMode)) - return Ndis802_11AuthModeAutoSwitch; - else if (IS_AKM_WPANONE(authMode)) - return Ndis802_11AuthModeWPANone; - else if (IS_AKM_WPA1(authMode) && IS_AKM_WPA2(authMode)) - return Ndis802_11AuthModeWPA1WPA2; - else if (IS_AKM_WPA1PSK(authMode) && IS_AKM_WPA2PSK(authMode)) - return Ndis802_11AuthModeWPA1PSKWPA2PSK; - else if (IS_AKM_WPA1(authMode)) - return Ndis802_11AuthModeWPA; - else if (IS_AKM_WPA1PSK(authMode)) - return Ndis802_11AuthModeWPAPSK; - else if (IS_AKM_WPA2(authMode)) - return Ndis802_11AuthModeWPA2; - else if (IS_AKM_WPA2PSK(authMode)) - return Ndis802_11AuthModeWPA2PSK; - else - return Ndis802_11AuthModeMax; -} - -UINT32 GetEncryModeNum(IN UINT32 encryMode) -{ - if (IS_CIPHER_NONE(encryMode)) - return Ndis802_11EncryptionDisabled; - else if (IS_CIPHER_WEP(encryMode)) - return Ndis802_11WEPEnabled; - else if (IS_CIPHER_TKIP(encryMode) && IS_CIPHER_CCMP128(encryMode)) - return (Ndis802_11TKIPAESMix - - 3); /* To mach Legacy enum value */ - else if (IS_CIPHER_TKIP(encryMode)) - return Ndis802_11TKIPEnable; - else if (IS_CIPHER_CCMP128(encryMode)) - return Ndis802_11AESEnable; - else - return Ndis802_11Encryption4KeyAbsent; -} -VOID RTMPIoctlGetBSSID_LIST(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - UINT32 i; - PBSSID_LIST_RESULTS bssResult = NULL; - PWLAN_BSSID_LIST pWlanBSSID; - BSS_ENTRY *pBss; - - os_alloc_mem(NULL, (UCHAR **)&bssResult, sizeof(BSSID_LIST_RESULTS)); - NdisZeroMemory(bssResult, sizeof(BSSID_LIST_RESULTS)); - bssResult->NumberOfItems = pAd->ScanTab.BssNr; - if (bssResult->NumberOfItems > MAX_LEN_OF_BSS_SCAN_TABLE) - bssResult->NumberOfItems = MAX_LEN_OF_BSS_SCAN_TABLE; - for (i = 0; i < bssResult->NumberOfItems; i++) { - pBss = &pAd->ScanTab.BssEntry[i]; - pWlanBSSID = &bssResult->BssidTable[i]; - COPY_MAC_ADDR(pWlanBSSID->Bssid, pBss->Bssid); - if ((pBss->Hidden == 1)) { - pWlanBSSID->Ssid.SsidLength = 0; - } else { - pWlanBSSID->Ssid.SsidLength = pBss->SsidLen; - NdisMoveMemory(pWlanBSSID->Ssid.Ssid, pBss->Ssid, - pBss->SsidLen); - } - pWlanBSSID->Channel = pBss->Channel; - if (pBss->AddHtInfoLen > 0) { - pWlanBSSID->ExtChannel = - pBss->AddHtInfo.AddHtInfo.ExtChanOffset; - } else { - pWlanBSSID->ExtChannel = 0; - } - pWlanBSSID->Privacy = pBss->Privacy; - if (pBss->Rssi >= -50) - pWlanBSSID->Signal = 100; - else if (pBss->Rssi >= -80) /* between -50 ~ -80dbm */ - pWlanBSSID->Signal = - (UINT)(24 + ((pBss->Rssi + 80) * 26) / 10); - else if (pBss->Rssi >= -90) /* between -80 ~ -90dbm */ - pWlanBSSID->Signal = - (UINT)(((pBss->Rssi + 90) * 26) / 10); - else /* < -84 dbm */ - pWlanBSSID->Signal = 0; - - pWlanBSSID->wireless_mode = NetworkTypeInUseSanity(pBss); - pWlanBSSID->AuthMode = GetAuthModeNum(pBss->AKMMap); - pWlanBSSID->Cipher = GetEncryModeNum(pBss->PairwiseCipher); - pWlanBSSID->BssType = pBss->BssType; - pWlanBSSID->WpsAP = pBss->WpsAP; - pWlanBSSID->WscDPIDFromWpsAP = pBss->WscDPIDFromWpsAP; - pWlanBSSID->bQbssLoadValid = pBss->QbssLoad.bValid; - pWlanBSSID->QbssLoadStaNum = pBss->QbssLoad.StaNum; - pWlanBSSID->QbssLoadChannelUtilization = - pBss->QbssLoad.ChannelUtilization; - pWlanBSSID->Snr[0] = pBss->Snr[0]; - pWlanBSSID->Snr[1] = pBss->Snr[1]; - pWlanBSSID->Snr[2] = pBss->Snr[2]; - pWlanBSSID->Snr[3] = pBss->Snr[3]; - if (pBss->HtCapabilityLen) - pWlanBSSID->NumSpatialStream = - GetNumberofSpatialStreams(pBss->HtCapability); - else - pWlanBSSID->NumSpatialStream = 1; - NdisMoveMemory(pWlanBSSID->SupportedRates, pBss->SupRate, - pBss->SupRateLen); - pWlanBSSID->rssi[0] = pBss->rssi[0]; - pWlanBSSID->rssi[1] = pBss->rssi[1]; - pWlanBSSID->rssi[2] = pBss->rssi[2]; - pWlanBSSID->rssi[3] = pBss->rssi[3]; - NdisMoveMemory(pWlanBSSID->vendorOUI0, pBss->vendorOUI0, 3); - NdisMoveMemory(pWlanBSSID->vendorOUI1, pBss->vendorOUI1, 3); - - if (pBss->HtCapabilityLen) - pWlanBSSID->ChannelWidth = - pBss->HtCapability.HtCapInfo.ChannelWidth + 1; - else - pWlanBSSID->ChannelWidth = 1; -#ifdef DOT11_VHT_AC - if (pBss->vht_op_len > 0) { - if (pBss->vht_op_ie.vht_op_info.ch_width) - pWlanBSSID->ChannelWidth = - pBss->vht_op_ie.vht_op_info.ch_width + - 2; - } -#endif - } - { - INT32 channel_idx; - PCHANNELINFO pChannelInfo = &pAd->ChannelInfo; - for (channel_idx = 0; channel_idx < pAd->ChannelListNum; - channel_idx++) { - bssResult->DccCh[channel_idx].ChannelNo = - pAd->ChannelList[channel_idx].Channel; - bssResult->DccCh[channel_idx].FalseCCA = - pChannelInfo->FalseCCA[channel_idx]; - bssResult->DccCh[channel_idx].chanbusytime = - pChannelInfo->chanbusytime[channel_idx]; - } - } - wrq->u.data.length = sizeof(BSSID_LIST_RESULTS); - if (copy_to_user(wrq->u.data.pointer, bssResult, wrq->u.data.length)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: copy_to_user() fail\n", __FUNCTION__)); - } - - if (bssResult != NULL) - os_free_mem(bssResult); -} -#endif /* CUSTOMER_DCC_FEATURE */ - -INT Set_DisConnectAllSta_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - INT i; - MAC_TABLE_ENTRY *pEntry; - -#ifdef DOT11W_PMF_SUPPORT - CHAR value = os_str_tol(arg, 0, 10); - - if (value == 2) { - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("[PMF]%s:: apidx=%d\n", __func__, pObj->ioctl_if)); - APMlmeKickOutAllSta(pAd, pObj->ioctl_if, - REASON_DEAUTH_STA_LEAVING); - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_CLIENT(pEntry)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("[PMF]%s: MacTableDeleteEntry %x:%x:%x:%x:%x:%x\n", - __func__, PRINT_MAC(pEntry->Addr))); - -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc( - pAd, i, - REASON_DEAUTH_STA_LEAVING); -#endif - MacTableDeleteEntry(pAd, pEntry->wcid, - pEntry->Addr); - } - } - } else -#endif /* DOT11W_PMF_SUPPORT */ - { - UCHAR *pOutBuffer = NULL; - NDIS_STATUS NStatus; - HEADER_802_11 DeAuthHdr; - USHORT Reason; - ULONG FrameLen = 0; - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_CLIENT(pEntry)) { - pEntry->EnqueueEapolStartTimerRunning = - EAPOL_START_DISABLE; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - /* Before reset MacTable, send disassociation packet to client.*/ - if (pEntry->Sst == SST_ASSOC) { - /* send out a De-authentication request frame*/ -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc( - pAd, i, - REASON_DEAUTH_STA_LEAVING); -#endif - - NStatus = MlmeAllocateMemory( - pAd, &pOutBuffer); - if (NStatus != - NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_MLME, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" MlmeAllocateMemory fail ..\n")); - return FALSE; - } - - Reason = REASON_NO_LONGER_VALID; - MTWF_LOG( - DBG_CAT_MLME, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("Send DeAuth (Reason=%d) to %02x:%02x:%02x:%02x:%02x:%02x\n", - Reason, - PRINT_MAC( - pEntry->Addr))); - MgtMacHeaderInit( - pAd, &DeAuthHdr, - SUBTYPE_DEAUTH, 0, - pEntry->Addr, - pAd->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.if_addr, - pAd->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.bssid); - MakeOutgoingFrame( - pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), - &DeAuthHdr, 2, &Reason, - END_OF_ARGS); - - MiniportMMRequest(pAd, 0, - pOutBuffer, - FrameLen); - MlmeFreeMemory(pOutBuffer); - RtmpusecDelay(5000); - } - } -#endif /* CONFIG_AP_SUPPORT */ - /* Delete a entry via WCID */ - MacTableDeleteEntry(pAd, i, pEntry->Addr); - } - } - } - - return TRUE; -} - -#ifdef DOT1X_SUPPORT -/* - ========================================================================== - Description: - Set IEEE8021X. - This parameter is 1 when 802.1x-wep turn on, otherwise 0 - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_IEEE8021X_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (os_str_tol(arg, 0, 10) != 0) /*Enable*/ - pSecConfig->IEEE8021X = TRUE; - else /*Disable*/ - pSecConfig->IEEE8021X = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(%s%d) IEEE8021X=%d\n", INF_MBSSID_DEV_NAME, apidx, - pSecConfig->IEEE8021X)); - return TRUE; -} - -/* - ========================================================================== - Description: - Set pre-authentication enable or disable when WPA/WPA2 turn on - Return: - TRUE if all parameters are OK, FALSE otherwise - ========================================================================== -*/ -INT Set_PreAuth_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (os_str_tol(arg, 0, 10) != 0) /*Enable*/ - pSecConfig->PreAuth = TRUE; - else /*Disable*/ - pSecConfig->PreAuth = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(%s%d) PreAuth=%d\n", INF_MBSSID_DEV_NAME, apidx, - pSecConfig->PreAuth)); - return TRUE; -} - -INT Set_OwnIPAddr_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - SetWdevOwnIPAddr(pSecConfig, arg); - return TRUE; -} - -INT Set_EAPIfName_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (strlen(arg) > 0 && strlen(arg) <= IFNAMSIZ) { - pSecConfig->EAPifname_len = strlen(arg); - NdisMoveMemory(pSecConfig->EAPifname, arg, strlen(arg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("EAPifname=%s, len=%d\n", pSecConfig->EAPifname, - pSecConfig->EAPifname_len)); - } - - return TRUE; -} - -INT Set_PreAuthIfName_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (strlen(arg) > 0 && strlen(arg) <= IFNAMSIZ) { - pSecConfig->PreAuthifname_len = strlen(arg); - NdisMoveMemory(pSecConfig->PreAuthifname, arg, strlen(arg)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("PreAuthifname=%s, len=%d\n", - pSecConfig->PreAuthifname, - pSecConfig->PreAuthifname_len)); - } - - return TRUE; -} - -INT Set_RADIUS_Server_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - UINT32 ip_addr; - INT count; - RTMP_STRING *macptr; - INT srv_cnt = 0; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - for (count = 0, macptr = rstrtok(arg, ";"); - (macptr && count < MAX_RADIUS_SRV_NUM); - macptr = rstrtok(NULL, ";"), count++) { - if (rtinet_aton(macptr, &ip_addr)) { - PRADIUS_SRV_INFO pSrvInfo = - &pSecConfig->radius_srv_info[srv_cnt]; - - pSrvInfo->radius_ip = ip_addr; - srv_cnt++; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d), radius_ip(seq-%d)=%s\n", apidx, - srv_cnt, arg)); - } - - if (srv_cnt > 0) - pSecConfig->radius_srv_num = srv_cnt; - } - - return TRUE; -} - -INT Set_RADIUS_Port_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - RTMP_STRING *macptr; - INT count; - INT srv_cnt = 0; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - for (count = 0, macptr = rstrtok(arg, ";"); - (macptr && count < MAX_RADIUS_SRV_NUM); - macptr = rstrtok(NULL, ";"), count++) { - if (srv_cnt < pSecConfig->radius_srv_num) { - PRADIUS_SRV_INFO pSrvInfo = - &pSecConfig->radius_srv_info[srv_cnt]; - - pSrvInfo->radius_port = - (UINT32)os_str_tol(macptr, 0, 10); - srv_cnt++; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d), radius_port(seq-%d)=%d\n", apidx, - srv_cnt, pSrvInfo->radius_port)); - } - } - - return TRUE; -} - -INT Set_RADIUS_Key_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - RTMP_STRING *macptr; - INT count; - INT srv_cnt = 0; - - if (apidx >= pAd->ApCfg.BssidNum) - return FALSE; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - for (count = 0, macptr = rstrtok(arg, ";"); - (macptr && count < MAX_RADIUS_SRV_NUM); - macptr = rstrtok(NULL, ";"), count++) { - if (strlen(macptr) > 0 && strlen(macptr) < 65 && - srv_cnt < pSecConfig->radius_srv_num) { - PRADIUS_SRV_INFO pSrvInfo = - &pSecConfig->radius_srv_info[srv_cnt]; - - pSrvInfo->radius_key_len = strlen(macptr); - NdisMoveMemory(pSrvInfo->radius_key, macptr, - pSrvInfo->radius_key_len); - srv_cnt++; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d), radius_key(seq-%d)=%s, len=%d\n", - apidx, srv_cnt, pSrvInfo->radius_key, - pSrvInfo->radius_key_len)); - } - } - - return TRUE; -} - -INT Set_DeletePMKID_Proc( - RTMP_ADAPTER *pAd, - RTMP_STRING - *arg) /* for testing sending deauth frame if PMKID not found */ -{ - UCHAR apidx = os_str_tol(arg, 0, 10); - INT32 i = 0; - - for (i = 0; i < MAX_PMKID_COUNT; i++) - RTMPDeletePMKIDCache(&pAd->ApCfg.PMKIDCache, apidx, i); - - return TRUE; -} - -INT Set_DumpPMKID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UCHAR imput = os_str_tol(arg, 0, 10); - INT32 i = 0; - - if (imput == 1) { - for (i = 0; i < MAX_PMKID_COUNT; i++) { - PAP_BSSID_INFO pBssInfo = - &pAd->ApCfg.PMKIDCache.BSSIDInfo[i]; - - if (pBssInfo->Valid) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Cacheidx = %d, Mbssidx = %d, Mac = %02x:%02x:%02x:%02x:%02x:%02x\n", - i, pBssInfo->Mbssidx, - PRINT_MAC(pBssInfo->MAC))); - } - } - } - - return TRUE; -} - -#ifdef RADIUS_MAC_ACL_SUPPORT -INT show_RADIUS_acl_cache(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - PRT_802_11_RADIUS_ACL_ENTRY pCacheEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - PLIST_HEADER pListHeader = NULL; - - pListHeader = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.cacheList; - - if (pListHeader->size != 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IF(ra%d), Radius ACL Cache List:\n", apidx)); - pListEntry = pListHeader->pHead; - pCacheEntry = (PRT_802_11_RADIUS_ACL_ENTRY)pListEntry; - - while (pCacheEntry != NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%02x:%02x:%02x:%02x:%02x:%02x --> %d\n", - PRINT_MAC(pCacheEntry->Addr), - pCacheEntry->result)); - pListEntry = pListEntry->pNext; - pCacheEntry = (PRT_802_11_RADIUS_ACL_ENTRY)pListEntry; - } - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IF(ra%d), Radius ACL Cache empty\n", apidx)); - - return TRUE; -} - -INT Set_RADIUS_CacheTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - CHAR val = os_str_tol(arg, 0, 10); - - if (val > 0) { - pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCacheTimeout = val; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ra[%d] Radius Cache Timeout: %d\n", apidx, val)); - return TRUE; - } - - return FALSE; -} - -INT Set_RADIUS_MacAuth_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - CHAR val = os_str_tol(arg, 0, 10); - - if (val == 0) - pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.Policy = - RADIUS_MAC_AUTH_DISABLE; - else if (val == 1) - pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.Policy = - RADIUS_MAC_AUTH_ENABLE; - else - return FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IF(ra%d), Radius MAC Auth: %d\n", apidx, - pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig.RadiusMacAuthCache.Policy)); - return TRUE; -} -#endif /* RADIUS_MAC_ACL_SUPPORT */ -#endif /* DOT1X_SUPPORT */ - -#ifdef UAPSD_SUPPORT -INT Set_UAPSD_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR IdMbss = pObj->ioctl_if; - - if (os_str_tol(arg, 0, 10) != 0) - pAd->ApCfg.MBSSID[IdMbss].wdev.UapsdInfo.bAPSDCapable = TRUE; - else - pAd->ApCfg.MBSSID[IdMbss].wdev.UapsdInfo.bAPSDCapable = FALSE; - - return TRUE; -} /* End of Set_UAPSD_Proc */ -#endif /* UAPSD_SUPPORT */ - -#ifdef MCAST_RATE_SPECIFIC -#ifdef MCAST_BCAST_RATE_SET_SUPPORT -INT Set_McastType(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - BOOLEAN status = TRUE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - MCAST_TYPE McastType = os_str_tol(arg, 0, 10); - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - if ((pObj->ioctl_if_type != INT_MBSSID) && - (pObj->ioctl_if_type != INT_MAIN)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Do nothing! This device interface is NOT AP mode!\n")); - return FALSE; - } - - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Invalid device interface!\n")); - return FALSE; - } - - if ((McastType >= MCAST_TYPE_BOTH_BCM_PKT) && - (McastType <= MCAST_TYPE_BROADCAST_PKT)) { - wdev->rate.McastType = McastType; - pAd->CommonCfg.McastTypeFlag = TRUE; - } else { - wdev->rate.McastType = MCAST_TYPE_BOTH_BCM_PKT; - pAd->CommonCfg.McastTypeFlag = FALSE; - status = FALSE; - } - - if (McastType == MCAST_TYPE_BROADCAST_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting only for Broadcast [%u]\n", __func__, - wdev->rate.McastType)); - NdisMoveMemory(&wdev->rate.BCastPhyMode_5G, - &wdev->rate.MCastPhyMode_5G, - sizeof(HTTRANSMIT_SETTING)); - NdisMoveMemory(&wdev->rate.BCastPhyMode, - &wdev->rate.MCastPhyMode, - sizeof(HTTRANSMIT_SETTING)); - } else if (McastType == MCAST_TYPE_MULTICAST_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting only for Multicast [%u]\n", __func__, - wdev->rate.McastType)); - NdisMoveMemory(&wdev->rate.BCastPhyMode_5G, - &wdev->rate.MCastPhyMode_5G, - sizeof(HTTRANSMIT_SETTING)); - NdisMoveMemory(&wdev->rate.BCastPhyMode, - &wdev->rate.MCastPhyMode, - sizeof(HTTRANSMIT_SETTING)); - } else if (McastType == MCAST_TYPE_BOTH_BCM_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting both for Multicast and Broadcast [%u]\n", - __func__, wdev->rate.McastType)); - } - - return status; -} -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - -INT Set_McastPhyMode(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - BSS_INFO_ARGUMENT_T bss_info_argument; - HTTRANSMIT_SETTING *pTransmit; - BOOLEAN isband5g; - UCHAR cfg_ht_bw; - struct wifi_dev *wdev = NULL; - INT i = 0; - BOOLEAN status = TRUE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UCHAR PhyMode = os_str_tol(arg, 0, 10); -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - MCAST_TYPE McastType = MCAST_TYPE_BOTH_BCM_PKT; - HTTRANSMIT_SETTING *pOriginalTransmit = NULL; -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - - if ((pObj->ioctl_if_type != INT_MBSSID) && - (pObj->ioctl_if_type != INT_MAIN)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Do nothing! This device interface is NOT AP mode!\n")); - return FALSE; - } - - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Invalid device interface!\n")); - return FALSE; - } - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - isband5g = (wdev->channel > 14) ? TRUE : FALSE; - -#ifdef MCAST_BCAST_RATE_SET_SUPPORT -/* - * This command used to be per-pAd config. Thus once this command was invoked it was apply to every wdev. - * When MCAST_BCAST_RATE_SET_SUPPORT is set, we need to keep backward compatibility. - * Therefore, we should iterate through every interface. - */ -next_intf: - if (i < pAd->ApCfg.BssidNum && pAd->CommonCfg.McastTypeFlag) { - wdev = &pAd->ApCfg.MBSSID[i].wdev; - if ((wdev->channel > 14) != isband5g) { - i++; - goto next_intf; - } - } -#endif - - if (isband5g) { - if (PhyMode == MCAST_CCK) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("We could not set CCK mode for multicast frames in 5G band!\n")); - return FALSE; - } - - pTransmit = &wdev->rate.MCastPhyMode_5G; - } else { -#ifdef DOT11_VHT_AC - - if (PhyMode == MCAST_VHT) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("We could not set VHT mode for multicast frames in 2.4G band!\n")); - return FALSE; - } - -#endif /* DOT11_VHT_AC */ - pTransmit = &wdev->rate.MCastPhyMode; - } - - cfg_ht_bw = wlan_config_get_ht_bw(wdev); - pTransmit->field.BW = cfg_ht_bw; -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - McastType = wdev->rate.McastType; - - if (PhyMode != MCAST_DISABLE) { - if (McastType == MCAST_TYPE_BROADCAST_PKT) { - pTransmit = (isband5g) ? (&wdev->rate.BCastPhyMode_5G) : - (&wdev->rate.BCastPhyMode); - pOriginalTransmit = - (isband5g) ? (&wdev->rate.MCastPhyMode_5G) : - (&wdev->rate.MCastPhyMode); - } else if (McastType == MCAST_TYPE_MULTICAST_PKT) { - pOriginalTransmit = - (isband5g) ? (&wdev->rate.BCastPhyMode_5G) : - (&wdev->rate.BCastPhyMode); - } - } -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - - switch (PhyMode) { - case MCAST_DISABLE: /* disable */ - NdisMoveMemory(pTransmit, &wdev->rate.MlmeTransmit, - sizeof(HTTRANSMIT_SETTING)); - pTransmit->field.BW = BW_20; -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - if (isband5g) { - NdisMoveMemory(&wdev->rate.BCastPhyMode_5G, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - } else { - NdisMoveMemory(&wdev->rate.BCastPhyMode, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - } - wdev->rate.McastType = MCAST_TYPE_BOTH_BCM_PKT; - McastType = wdev->rate.McastType; -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - - /* NdisMoveMemory(&pAd->CommonCfg.MCastPhyMode, &pAd->MacTab.Content[MCAST_WCID].HTPhyMode, sizeof(HTTRANSMIT_SETTING)); */ - break; - - case MCAST_CCK: /* CCK */ - pTransmit->field.MODE = MODE_CCK; - pTransmit->field.BW = BW_20; - - if ((pTransmit->field.MCS > 11) || - (pTransmit->field.MCS > 3 && pTransmit->field.MCS < 8)) - pTransmit->field.MCS = 3; - - break; - - case MCAST_OFDM: /* OFDM */ - pTransmit->field.MODE = MODE_OFDM; - pTransmit->field.BW = BW_20; - - if (pTransmit->field.MCS > 7) - pTransmit->field.MCS = 7; - - break; -#ifdef DOT11_N_SUPPORT - - case MCAST_HTMIX: /* HTMIX */ - pTransmit->field.MODE = MODE_HTMIX; - - if ((isband5g) && (wlan_operate_get_bw(wdev) > BW_20)) - pTransmit->field.BW = BW_40; - else - pTransmit->field.BW = BW_20; - - break; -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11_VHT_AC - - case MCAST_VHT: /* VHT */ - pTransmit->field.MODE = MODE_VHT; - pTransmit->field.BW = wlan_operate_get_bw(wdev); - break; -#endif /* DOT11_VHT_AC */ - - default: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("unknown Muticast PhyMode %d.\n", PhyMode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0:Disable, 1:CCK, 2:OFDM, 3:HTMIX, 4:VHT.\n")); - status = FALSE; - break; - } - - NdisZeroMemory(&bss_info_argument, sizeof(BSS_INFO_ARGUMENT_T)); - bss_info_argument.bss_state = BSS_ACTIVE; - bss_info_argument.ucBssIndex = wdev->bss_info_argument.ucBssIndex; - bss_info_argument.u4BssInfoFeature = BSS_INFO_BROADCAST_INFO_FEATURE; -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - if (McastType == MCAST_TYPE_BROADCAST_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting only for Broadcast\n", __func__)); - memmove(&bss_info_argument.BcTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - memmove(&bss_info_argument.McTransmit, pOriginalTransmit, - sizeof(HTTRANSMIT_SETTING)); - } else if (McastType == MCAST_TYPE_MULTICAST_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting only for Multicast\n", __func__)); - memmove(&bss_info_argument.BcTransmit, pOriginalTransmit, - sizeof(HTTRANSMIT_SETTING)); - memmove(&bss_info_argument.McTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - } else if (McastType == MCAST_TYPE_BOTH_BCM_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting both for Multicast and Broadcast\n", - __func__)); - memmove(&bss_info_argument.BcTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - memmove(&bss_info_argument.McTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - } -#else - memmove(&bss_info_argument.BcTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - memmove(&bss_info_argument.McTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - - if (AsicBssInfoUpdate(pAd, bss_info_argument) != NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Fail to apply the bssinfo, BSSID=%d!\n", i)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("set BSSID:%02x:%02x:%02x:%02x:%02x:%02x, Band=%s\n", - PRINT_MAC(wdev->bssid), (isband5g) ? "5G" : "2.4G")); - -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - if (i < pAd->ApCfg.BssidNum && pAd->CommonCfg.McastTypeFlag) { - i++; - goto next_intf; - } -#endif - - return TRUE; -} - -INT Set_McastMcs(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - BSS_INFO_ARGUMENT_T bss_info_argument; - BOOLEAN isband5g; - HTTRANSMIT_SETTING *pTransmit; - UCHAR txnss; - struct wifi_dev *wdev = NULL; - INT i = 0; - BOOLEAN status = TRUE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UCHAR Mcs = os_str_tol(arg, 0, 10); -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - MCAST_TYPE McastType = MCAST_TYPE_BOTH_BCM_PKT; - HTTRANSMIT_SETTING *pOriginalTransmit = NULL; -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - - if ((pObj->ioctl_if_type != INT_MBSSID) && - (pObj->ioctl_if_type != INT_MAIN)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Do nothing! This device interface is NOT AP mode!\n")); - return FALSE; - } - - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Invalid device interface!\n")); - return FALSE; - } - - if (Mcs > 15) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Mcs must be in range of 0 to 15\n")); - return FALSE; - } - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - isband5g = (wdev->channel > 14) ? TRUE : FALSE; - -#ifdef MCAST_BCAST_RATE_SET_SUPPORT -/* - * This command used to be per-pAd config. Thus once this command was invoked it was apply to every wdev. - * When MCAST_BCAST_RATE_SET_SUPPORT is set, we need to keep backward compatibility. - * Therefore, we should iterate through every interface. - */ -next_intf: - if (i < pAd->ApCfg.BssidNum && pAd->CommonCfg.McastTypeFlag) { - wdev = &pAd->ApCfg.MBSSID[i].wdev; - if ((wdev->channel > 14) != isband5g) { - i++; - goto next_intf; - } - } -#endif - - pTransmit = (isband5g) ? (&wdev->rate.MCastPhyMode_5G) : - (&wdev->rate.MCastPhyMode); -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - McastType = wdev->rate.McastType; - - if (McastType == MCAST_TYPE_BROADCAST_PKT) { - pTransmit = (isband5g) ? (&wdev->rate.BCastPhyMode_5G) : - (&wdev->rate.BCastPhyMode); - ; - pOriginalTransmit = (isband5g) ? (&wdev->rate.MCastPhyMode_5G) : - (&wdev->rate.MCastPhyMode); - } else if (McastType == MCAST_TYPE_MULTICAST_PKT) { - pOriginalTransmit = (isband5g) ? (&wdev->rate.BCastPhyMode_5G) : - (&wdev->rate.BCastPhyMode); - } -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - txnss = wlan_operate_get_tx_stream(wdev); - - switch (pTransmit->field.MODE) { - case MODE_CCK: - if ((Mcs <= 3) || (Mcs >= 8 && Mcs <= 11)) { -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - if (OPSTATUS_TEST_FLAG( - pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED) && - (Mcs <= 3)) { - if (Mcs == 0) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Invalid MCS value when short preamble is enabled!\n")); - return FALSE; - } - Mcs = Mcs - 1; - } -#endif - pTransmit->field.MCS = Mcs; - } else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MCS must in range of 0 ~ 3 and 8 ~ 11 for CCK Mode.\n")); - status = FALSE; - } - - break; - - case MODE_OFDM: - if (Mcs > 7) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MCS must in range from 0 to 7 for OFDM Mode.\n")); - status = FALSE; - } else - pTransmit->field.MCS = Mcs; - - break; - - case MODE_HTMIX: - if ((txnss == 1 && Mcs > 7) || (txnss == 2 && Mcs > 15) || - (txnss == 3 && Mcs > 23) || (txnss == 4 && Mcs > 31)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MCS(%d) txnss(%d) error for HT Mode.\n", Mcs, - txnss)); - status = FALSE; - } else - pTransmit->field.MCS = Mcs; - - break; - - case MODE_VHT: - if ((Mcs & 0x0f) > 9 || ((Mcs >> 4) & 0x3) + 1 > txnss) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MCS(%d > 9) txnss(%d > %d) error for VHT Mode.\n", - Mcs & 0x0f, ((Mcs >> 4) & 0x3) + 1, txnss)); - status = FALSE; - } else - pTransmit->field.MCS = Mcs; - - break; - - default: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("unknown Muticast PhyMode in set mcs %d.\n", - pTransmit->field.MODE)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("0:Disable, 1:CCK, 2:OFDM, 3:HTMIX, 4:VHT.\n")); - status = FALSE; - break; - } - - if (!status) - return FALSE; - - NdisZeroMemory(&bss_info_argument, sizeof(BSS_INFO_ARGUMENT_T)); - bss_info_argument.bss_state = BSS_ACTIVE; - bss_info_argument.ucBssIndex = wdev->bss_info_argument.ucBssIndex; - bss_info_argument.u4BssInfoFeature = BSS_INFO_BROADCAST_INFO_FEATURE; -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - if (McastType == MCAST_TYPE_BROADCAST_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting only for Broadcast\n", __func__)); - memmove(&bss_info_argument.BcTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - memmove(&bss_info_argument.McTransmit, pOriginalTransmit, - sizeof(HTTRANSMIT_SETTING)); - } else if (McastType == MCAST_TYPE_MULTICAST_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting only for Multicast\n", __func__)); - memmove(&bss_info_argument.BcTransmit, pOriginalTransmit, - sizeof(HTTRANSMIT_SETTING)); - memmove(&bss_info_argument.McTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - } else if (McastType == MCAST_TYPE_BOTH_BCM_PKT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Setting both for Multicast and Broadcast\n", - __func__)); - memmove(&bss_info_argument.BcTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - memmove(&bss_info_argument.McTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - } -#else - memmove(&bss_info_argument.BcTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); - memmove(&bss_info_argument.McTransmit, pTransmit, - sizeof(HTTRANSMIT_SETTING)); -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - - if (AsicBssInfoUpdate(pAd, bss_info_argument) != NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Fail to apply the bssinfo, BSSID=%d!\n", i)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("set BSSID:%02x:%02x:%02x:%02x:%02x:%02x, Band=%s\n", - PRINT_MAC(wdev->bssid), (isband5g) ? "5G" : "2.4G")); - -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - if (i < pAd->ApCfg.BssidNum && pAd->CommonCfg.McastTypeFlag) { - i++; - goto next_intf; - } -#endif - - return TRUE; -} - -INT Show_McastRate(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - HTTRANSMIT_SETTING *pTransmit; - struct wifi_dev *wdev = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - HTTRANSMIT_SETTING *pOriginalTransmit = NULL; -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - - if ((pObj->ioctl_if_type != INT_MBSSID) && - (pObj->ioctl_if_type != INT_MAIN)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Do nothing! This device interface is NOT AP mode!\n")); - return FALSE; - } - - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Invalid device interface!\n")); - return FALSE; - } - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pTransmit = (wdev->channel > 14) ? (&wdev->rate.MCastPhyMode_5G) : - (&wdev->rate.MCastPhyMode); -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - pOriginalTransmit = (wdev->channel > 14) ? - (&wdev->rate.BCastPhyMode_5G) : - (&wdev->rate.BCastPhyMode); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Bcast PhyMode = %d\n", pOriginalTransmit->field.MODE)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Bcast Mcs = %d\n", pOriginalTransmit->field.MCS)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Bcast BW = %d\n", pOriginalTransmit->field.BW)); -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Mcast PhyMode = %d\n", pTransmit->field.MODE)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Mcast Mcs = %d\n", pTransmit->field.MCS)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Mcast BW = %d\n", pTransmit->field.BW)); - return TRUE; -} -#endif /* MCAST_RATE_SPECIFIC */ -#ifdef CONFIG_RA_PHY_RATE_SUPPORT -INT Set_BcnPhyMode(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - HTTRANSMIT_SETTING *pTransmit; - BOOLEAN isband5g; - UCHAR cfg_ht_bw; - struct wifi_dev *wdev = NULL; - BOOLEAN status = TRUE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UCHAR PhyMode = os_str_tol(arg, 0, 10); - - if ((pObj->ioctl_if_type != INT_MBSSID) && - (pObj->ioctl_if_type != INT_MAIN)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Do nothing! This device interface is NOT AP mode!\n")); - return FALSE; - } - - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Invalid device interface!\n")); - return FALSE; - } - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - isband5g = (wdev->channel > 14) ? TRUE : FALSE; - - if (isband5g) { - if (PhyMode == MCAST_CCK) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("We could not set CCK mode for Beacon in 5G band!\n")); - return FALSE; - } - pTransmit = &wdev->rate.BcnPhyMode_5G; - } else { - pTransmit = &wdev->rate.BcnPhyMode; - } - cfg_ht_bw = wlan_config_get_ht_bw(wdev); - pTransmit->field.BW = cfg_ht_bw; - - switch (PhyMode) { - case BCN_DISABLE: /* disable */ - NdisMoveMemory(pTransmit, &wdev->rate.MlmeTransmit, - sizeof(HTTRANSMIT_SETTING)); - pTransmit->field.BW = BW_20; - - break; - case BCN_CCK: /* CCK */ - pTransmit->field.MODE = MODE_CCK; - pTransmit->field.BW = BW_20; - if ((pTransmit->field.MCS > 11) || - (pTransmit->field.MCS > 3 && pTransmit->field.MCS < 8)) - pTransmit->field.MCS = 3; - break; - case BCN_OFDM: /* OFDM */ - pTransmit->field.MODE = MODE_OFDM; - pTransmit->field.BW = BW_20; - if (pTransmit->field.MCS > 7) - pTransmit->field.MCS = 7; - - break; - default: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("unknown Bcn PhyMode %d.\n", PhyMode)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0:Disable, 1:CCK, 2:OFDM\n")); - status = FALSE; - break; - } - - if (!status) - return FALSE; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_DISABLE_TX); - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_ENABLE_TX); - - return TRUE; -} - -INT Set_BcnMcs(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - BOOLEAN isband5g; - HTTRANSMIT_SETTING *pTransmit; - struct wifi_dev *wdev = NULL; - BOOLEAN status = TRUE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UCHAR Mcs = os_str_tol(arg, 0, 10); - - if ((pObj->ioctl_if_type != INT_MBSSID) && - (pObj->ioctl_if_type != INT_MAIN)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Do nothing! This device interface is NOT AP mode!\n")); - return FALSE; - } - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Invalid device interface!\n")); - return FALSE; - } - if (Mcs > 15) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Mcs must be in range of 0 to 15\n")); - return FALSE; - } - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - isband5g = (wdev->channel > 14) ? TRUE : FALSE; - pTransmit = (isband5g) ? (&wdev->rate.BcnPhyMode_5G) : - (&wdev->rate.BcnPhyMode); - - switch (pTransmit->field.MODE) { - case MODE_CCK: - if ((Mcs <= 3) || (Mcs >= 8 && Mcs <= 11)) - pTransmit->field.MCS = Mcs; - else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MCS must in range of 0 ~ 3 and 8 ~ 11 for CCK Mode.\n")); - status = FALSE; - } - - break; - case MODE_OFDM: - if (Mcs > 7) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MCS must in range from 0 to 7 for OFDM Mode.\n")); - status = FALSE; - } else - pTransmit->field.MCS = Mcs; - - break; - default: - pTransmit->field.MCS = Mcs; - break; - } - - if (!status) - return FALSE; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_DISABLE_TX); - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_ENABLE_TX); - - return TRUE; -} - -INT Show_BcnRate(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - HTTRANSMIT_SETTING *pTransmit; - struct wifi_dev *wdev = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - - if ((pObj->ioctl_if_type != INT_MBSSID) && - (pObj->ioctl_if_type != INT_MAIN)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Do nothing! This device interface is NOT AP mode!\n")); - return FALSE; - } - if (apidx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Invalid device interface!\n")); - return FALSE; - } - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pTransmit = (wdev->channel > 14) ? (&wdev->rate.BcnPhyMode_5G) : - (&wdev->rate.BcnPhyMode); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Bcn PhyMode = %d\n", pTransmit->field.MODE)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Bcn Mcs = %d\n", pTransmit->field.MCS)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Bcn BW = %d\n", pTransmit->field.BW)); - return TRUE; -} -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 -INT Set_OBSSScanParam_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT ObssScanValue; - UINT Idx; - RTMP_STRING *thisChar; - - Idx = 0; - - while ((thisChar = strsep((char **)&arg, "-")) != NULL) { - ObssScanValue = (INT)os_str_tol(thisChar, 0, 10); - - switch (Idx) { - case 0: - if (ObssScanValue < 5 || ObssScanValue > 1000) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Invalid OBSSScanParam for Dot11OBssScanPassiveDwell(%d), should in range 5~1000\n", - ObssScanValue)); - else { - pAd->CommonCfg.Dot11OBssScanPassiveDwell = - ObssScanValue; /* Unit : TU. 5~1000 */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OBSSScanParam for Dot11OBssScanPassiveDwell=%d\n", - ObssScanValue)); - } - - break; - - case 1: - if (ObssScanValue < 10 || ObssScanValue > 1000) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Invalid OBSSScanParam for Dot11OBssScanActiveDwell(%d), should in range 10~1000\n", - ObssScanValue)); - else { - pAd->CommonCfg.Dot11OBssScanActiveDwell = - ObssScanValue; /* Unit : TU. 10~1000 */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OBSSScanParam for Dot11OBssScanActiveDwell=%d\n", - ObssScanValue)); - } - - break; - - case 2: - pAd->CommonCfg.Dot11BssWidthTriggerScanInt = - ObssScanValue; /* Unit : Second */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OBSSScanParam for Dot11BssWidthTriggerScanInt=%d\n", - ObssScanValue)); - break; - - case 3: - if (ObssScanValue < 200 || ObssScanValue > 10000) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Invalid OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel(%d), should in range 200~10000\n", - ObssScanValue)); - else { - pAd->CommonCfg - .Dot11OBssScanPassiveTotalPerChannel = - ObssScanValue; /* Unit : TU. 200~10000 */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel=%d\n", - ObssScanValue)); - } - - break; - - case 4: - if (ObssScanValue < 20 || ObssScanValue > 10000) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Invalid OBSSScanParam for Dot11OBssScanActiveTotalPerChannel(%d), should in range 20~10000\n", - ObssScanValue)); - else { - pAd->CommonCfg - .Dot11OBssScanActiveTotalPerChannel = - ObssScanValue; /* Unit : TU. 20~10000 */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OBSSScanParam for Dot11OBssScanActiveTotalPerChannel=%d\n", - ObssScanValue)); - } - - break; - - case 5: - pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = - ObssScanValue; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\n", - ObssScanValue)); - break; - - case 6: - pAd->CommonCfg.Dot11OBssScanActivityThre = - ObssScanValue; /* Unit : percentage */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\n", - ObssScanValue)); - break; - } - - Idx++; - } - - if (Idx != 7) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Wrong OBSSScanParamtetrs format in ioctl cmd!!!!! Use default value\n")); - pAd->CommonCfg.Dot11OBssScanPassiveDwell = - dot11OBSSScanPassiveDwell; /* Unit : TU. 5~1000 */ - pAd->CommonCfg.Dot11OBssScanActiveDwell = - dot11OBSSScanActiveDwell; /* Unit : TU. 10~1000 */ - pAd->CommonCfg.Dot11BssWidthTriggerScanInt = - dot11BSSWidthTriggerScanInterval; /* Unit : Second */ - pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = - dot11OBSSScanPassiveTotalPerChannel; /* Unit : TU. 200~10000 */ - pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = - dot11OBSSScanActiveTotalPerChannel; /* Unit : TU. 20~10000 */ - pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = - dot11BSSWidthChannelTransactionDelayFactor; - pAd->CommonCfg.Dot11OBssScanActivityThre = - dot11BSSScanActivityThreshold; /* Unit : percentage */ - } - - pAd->CommonCfg.Dot11BssWidthChanTranDelay = - (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * - pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("OBSSScanParam for Dot11BssWidthChanTranDelay=%ld\n", - pAd->CommonCfg.Dot11BssWidthChanTranDelay)); - return TRUE; -} - -INT Set_AP2040ReScan_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - APOverlappingBSSScan(pAd, wdev); - /* apply setting */ - SetCommonHtVht(pAd, wdev); - wlan_operate_set_prim_ch(wdev, wdev->channel); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_AP2040ReScan_Proc() Trigger AP ReScan !!!\n")); - return TRUE; -} -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - -INT Set_EntryLifeCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - ULONG LifeCheckCnt = (ULONG)os_str_tol(arg, 0, 10); - - if (LifeCheckCnt <= 65535) - pAd->ApCfg.EntryLifeCheck = LifeCheckCnt; - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("LifeCheckCnt must in range of 0 to 65535\n")); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("EntryLifeCheck Cnt = %ld.\n", pAd->ApCfg.EntryLifeCheck)); - return TRUE; -} - -INT ApCfg_Set_PerMbssMaxStaNum_Proc(IN PRTMP_ADAPTER pAd, IN INT apidx, - IN RTMP_STRING *arg) -{ - pAd->ApCfg.MBSSID[apidx].MaxStaNum = (UCHAR)os_str_tol(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(ra%d) %s::(MaxStaNum=%d)\n", apidx, __func__, - pAd->ApCfg.MBSSID[apidx].MaxStaNum)); - return TRUE; -} - -INT ApCfg_Set_IdleTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - LONG idle_time; - - idle_time = os_str_tol(arg, 0, 10); - - if (idle_time < MAC_TABLE_MIN_AGEOUT_TIME) - pAd->ApCfg.StaIdleTimeout = MAC_TABLE_MIN_AGEOUT_TIME; - else - pAd->ApCfg.StaIdleTimeout = idle_time; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : IdleTimeout=%d\n", __func__, - pAd->ApCfg.StaIdleTimeout)); - return TRUE; -} - -#ifdef RTMP_RBUS_SUPPORT -#ifdef LED_CONTROL_SUPPORT -INT Set_WlanLed_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - BOOLEAN bWlanLed; -#if defined(RTMP_PCI_SUPPORT) && defined(RTMP_RBUS_SUPPORT) - - if (!IS_RBUS_INF(pAd)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Support RBUS interface only\n", __func__)); - return TRUE; - } - -#endif /* defined(RTMP_PCI_SUPPORT) && defined(RTMP_RBUS_SUPPORT) */ - bWlanLed = (BOOLEAN)os_str_tol(arg, 0, 10); - { - if (bWlanLed) - RTMPStartLEDMode(pAd); - else - RTMPExitLEDMode(pAd); - }; - return TRUE; -} -#endif /* LED_CONTROL_SUPPORT */ -#endif /* RTMP_RBUS_SUPPORT */ - -INT Set_MemDebug_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef VENDOR_FEATURE2_SUPPORT - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Number of Packet Allocated = %lu\n", OS_NumOfPktAlloc)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Number of Packet Freed = %lu\n", OS_NumOfPktFree)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Offset of Packet Allocated/Freed = %lu\n", - OS_NumOfPktAlloc - OS_NumOfPktFree)); -#endif /* VENDOR_FEATURE2_SUPPORT */ - return TRUE; -} - -#ifdef APCLI_SUPPORT -#endif /*APCLI_SUPPORT*/ - -#ifdef CONFIG_AP_SUPPORT -/* -======================================================================== -Routine Description: - Set power save life time. - -Arguments: - pAd - WLAN control block pointer - Arg - Input arguments - -Return Value: - None - -Note: -======================================================================== -*/ -INT Set_PowerSaveLifeTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - pAd->MacTab.MsduLifeTime = os_str_tol(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set new life time = %d\n", pAd->MacTab.MsduLifeTime)); - return TRUE; -} -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef MBSS_SUPPORT -/* -======================================================================== -Routine Description: - Show MBSS information. - -Arguments: - pAd - WLAN control block pointer - Arg - Input arguments - -Return Value: - None - -Note: -======================================================================== -*/ -extern UCHAR *wmode_2_str(UCHAR wmode); - -INT Show_MbssInfo_Display_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 IdBss; - UCHAR PhyMode; - CHAR *mod_str = NULL; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n\tBSS Idx\t\tPhy Mode\n")); - - for (IdBss = 0; IdBss < pAd->ApCfg.BssidNum; IdBss++) { - PhyMode = pAd->ApCfg.MBSSID[IdBss].wdev.PhyMode; - mod_str = wmode_2_str(PhyMode); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\t%d\t\t%s\n", IdBss, mod_str)); - - if (mod_str) - os_free_mem(mod_str); - } - - return TRUE; -} /* End of Show_MbssInfo_Display_Proc */ -#endif /* MBSS_SUPPORT */ - -#ifdef HOSTAPD_SUPPORT -VOID RtmpHostapdSecuritySet(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrqin) -{ - if (wrqin->u.data.length > 20 && - MAX_LEN_OF_RSNIE > wrqin->u.data.length && wrqin->u.data.pointer) { - UCHAR RSNIE_Len[2]; - UCHAR RSNIe[2]; - int offset_next_ie = 0; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ioctl SIOCSIWGENIE pAd->IoctlIF=%d\n", apidx)); - RSNIe[0] = *(UINT8 *)wrqin->u.data.pointer; - - if (IE_WPA != RSNIe[0] && IE_RSN != RSNIe[0]) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IE %02x != 0x30/0xdd\n", RSNIe[0])); - Status = -EINVAL; - break; - } - - RSNIE_Len[0] = *((UINT8 *)wrqin->u.data.pointer + 1); - - if (wrqin->u.data.length != RSNIE_Len[0] + 2) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IE use WPA1 WPA2\n")); - NdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], - MAX_LEN_OF_RSNIE); - RSNIe[1] = *(UINT8 *)wrqin->u.data.pointer; - RSNIE_Len[1] = *((UINT8 *)wrqin->u.data.pointer + 1); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IE1 %02x %02x\n", RSNIe[1], RSNIE_Len[1])); - pAd->ApCfg.MBSSID[apidx].RSNIE_Len[1] = RSNIE_Len[1]; - NdisMoveMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], - (UCHAR *)(wrqin->u.data.pointer) + 2, - RSNIE_Len[1]); - offset_next_ie = RSNIE_Len[1] + 2; - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IE use only %02x\n", RSNIe[0])); - - NdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], - MAX_LEN_OF_RSNIE); - RSNIe[0] = *(((UINT8 *)wrqin->u.data.pointer) + offset_next_ie); - RSNIE_Len[0] = *(((UINT8 *)wrqin->u.data.pointer) + - offset_next_ie + 1); - - if (IE_WPA != RSNIe[0] && IE_RSN != RSNIe[0]) { - Status = -EINVAL; - break; - } - - pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0] = RSNIE_Len[0]; - NdisMoveMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], - ((UCHAR *)(wrqin->u.data.pointer)) + 2 + - offset_next_ie, - RSNIE_Len[0]); - UpdateBeaconHandler(pAd, &pAd->ApCfg.MBSSID[apidx].wdev, - BCN_UPDATE_IF_STATE_CHG); - } -} -#endif /* HOSTAPD_SUPPORT */ - -#ifdef MT_MAC -/* Only for TimReq frame generating */ -/* TODO: Tim service establish. */ -/* used to mapping, tttt hwidx and related CR */ -static TTTT_CR_BSSID_IDX_MAP_T g_arTtttCrHwBssidMapTable[] = { - { HW_BSSID_0, LPON_TT0TPCR, LPON_TT4TPCR }, - { HW_BSSID_1, LPON_TT1TPCR, LPON_TT5TPCR }, - { HW_BSSID_2, LPON_TT2TPCR, LPON_TT6TPCR }, - { HW_BSSID_3, LPON_TT2TPCR, LPON_TT7TPCR }, -}; - -INT Set_AP_TimEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 interval = 0; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR APIndex = pObj->ioctl_if; - BSS_STRUCT *pMbss = NULL; - UINT32 Value = 0; - struct wifi_dev *wdev = NULL; - UINT8 OmacIdx = 0; - UINT8 BssidIdxMapped = 0; - PTTTT_CR_BSSID_IDX_MAP_T pTtttCrMapTable = NULL; - UINT32 u4TtttEnCr = 0, u4TtttIntervelCr = 0; - BOOLEAN fgEnable = FALSE; - - interval = os_str_tol(arg, 0, 10); - - if ((interval < 0) || (interval > 255)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: interval is incorrect!!\n", __func__)); - return FALSE; - } - - pMbss = &pAd->ApCfg.MBSSID[APIndex]; - wdev = &pMbss->wdev; - - if (wdev != NULL) { - OmacIdx = wdev->OmacIdx; - if (wdev_tim_buf_init(pAd, &wdev->bcn_buf.tim_buf) == FALSE) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: tim packet init failed!\n", __func__)); - return FALSE; - } - - /* ext mbss tttt, depends on MBSS_0 */ - if (OmacIdx >= HW_BSSID_MAX) - BssidIdxMapped = HW_BSSID_0; - else - BssidIdxMapped = OmacIdx; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: BssidIdxMapped = %d, OmacIdx = %x\n", __func__, - BssidIdxMapped, OmacIdx)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: idx = %d, no wdev!?\n", __func__, APIndex)); - return FALSE; - } - - pTtttCrMapTable = &g_arTtttCrHwBssidMapTable[BssidIdxMapped]; - u4TtttEnCr = pTtttCrMapTable->u4TTTTEnableCr; - u4TtttIntervelCr = pTtttCrMapTable->u4TTTTIntervalCr; - - if (interval > 0) { /* valid interval --> enable */ - fgEnable = TRUE; - MAC_IO_WRITE32(pAd, LPON_PTTISR, - IDX_DEFAULT_PRETTTT_INTERVAL(BssidIdxMapped)); - MAC_IO_READ32(pAd, u4TtttEnCr, &Value); - Value &= ~TTTTn_OFFSET_OF_TBTTn_MASK; - Value |= DEFAULT_TTTT_OFFSET_IN_MS; - Value |= TTTTn_CAL_EN; - MAC_IO_WRITE32(pAd, u4TtttEnCr, Value); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("u4TtttEnCr = %x, Value = %x\n", u4TtttEnCr, Value)); - MAC_IO_WRITE32(pAd, u4TtttIntervelCr, - SET_TTTT_PERIOD(pAd, interval)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("u4TtttIntervelCr = %x, Value = %x\n", - u4TtttIntervelCr, SET_TTTT_PERIOD(pAd, interval))); - MAC_IO_READ32(pAd, LPON_MPTCR4, &Value); - Value |= TTTT0_PERIODTIMER_EN | TTTT0_TIMEUP_EN | - PRETTTT0TIMEUP_EN | PRETTTT0_TRIG_EN | PRETTTT0INT_EN; - MAC_IO_WRITE32(pAd, LPON_MPTCR4, Value); - MAC_IO_READ32(pAd, AGG_ARCR, &Value); - Value = Value | DUAL_BTIM_EN; - MAC_IO_WRITE32(pAd, AGG_ARCR, Value); - Value = 0 | AGG_BTIMRR_TX_MODE(Legacy_CCK) | - AGG_BTIMRR_TX_RATE(LONG_PREAMBLE_1M); - MAC_IO_WRITE32(pAd, AGG_BTIMRR0, Value); - /*TODO: other omac idx rate setting.*/ - MAC_IO_READ32(pAd, ARB_BTIMCR0, &Value); - Value |= (1 << OmacIdx); - MAC_IO_WRITE32(pAd, ARB_BTIMCR0, - Value); /* enable BTIM_EN bit in ARB_BTIMCR0 */ - MAC_IO_WRITE32(pAd, ARB_BTIMCR1, - Value); /* enable 2 TIM broadcast */ -#ifndef BCN_OFFLOAD_SUPPORT - MAC_IO_WRITE32( - pAd, HWIER4, - 0x80008000); /* enable TTTT0/PRETTTT0 interrupt. */ -#endif - } else { /* interval 0 --> disable */ - MAC_IO_READ32(pAd, ARB_BTIMCR0, &Value); - Value &= ~(1 << OmacIdx); - MAC_IO_WRITE32(pAd, ARB_BTIMCR0, Value); - MAC_IO_WRITE32(pAd, ARB_BTIMCR1, Value); - } - - AsicSetExtTTTTHwCRSetting(pAd, APIndex, fgEnable); - return TRUE; -} - -INT Show_TmrCalResult_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - if (pAd->pTmrCtrlStruct) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): TmrCalResult=0x%X\n", __func__, - pAd->pTmrCtrlStruct->TmrCalResult)); - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): (X) pTmrCtrlStruct is NULL\n", __func__)); - - return TRUE; -} - -#ifdef DBG -INT set_tim_update_proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UpdateBeaconHandler(pAd, NULL, BCN_UPDATE_TIM); - return TRUE; -} - -INT Set_AP_DumpTime_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - int apidx = 0, i = 0; - BSS_STRUCT *pMbss; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n\t%-10s\t%-10s\n", "PreTBTTTime", "TBTTTime")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%-10lu\t%-10lu\n", pAd->HandlePreInterruptTime, - pAd->HandleInterruptTime)); - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - pMbss = &pAd->ApCfg.MBSSID[apidx]; - - if (!BeaconTransmitRequired(pAd, &pMbss->wdev, TRUE)) - continue; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n%s:%d\tBcn_State:%d\t%-10s: %d\n", "Apidx", apidx, - pMbss->wdev.bcn_buf.bcn_state, "recover", - pMbss->bcn_recovery_num)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t%-10s\t%-10s\t%-10s\t%-10s\n", "WriteBcnRing", - "BcnDmaDone", "TXS_TSF", "TXS_SN")); - - for (i = 0; i < MAX_TIME_RECORD; i++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Idx[%d]:\t%-10lu\t%-10lu\t%-10lu\t%-10lu\n", - i, pMbss->WriteBcnDoneTime[i], - pMbss->BcnDmaDoneTime[i], pMbss->TXS_TSF[i], - pMbss->TXS_SN[i])); - } - - return TRUE; -} - -INT Set_BcnStateCtrl_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR bcn_state; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apIndex = pObj->ioctl_if; - BSS_STRUCT *pMbss = NULL; - struct _PCI_HIF_T *hif = hc_get_hif_ctrl(pAd->hdev_ctrl); - - bcn_state = os_str_tol(arg, 0, 10); - - if (!IS_HIF_TYPE(pAd, HIF_MT)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: chipcap is not HIF_MT\n", __func__)); - return FALSE; - } - - if ((bcn_state < BCN_TX_IDLE) || (bcn_state > BCN_TX_DMA_DONE)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: bcn_state is incorrect!!\n", __func__)); - return FALSE; - } - - pMbss = &pAd->ApCfg.MBSSID[apIndex]; - ASSERT(pMbss); - - if (pMbss == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: pMbss == NULL!!\n", __func__)); - return FALSE; - } - - if (pMbss->wdev.bcn_buf.bcn_state != BCN_TX_IDLE) { - RTMP_SEM_LOCK(&hif->BcnRingLock); - pMbss->wdev.bcn_buf.bcn_state = bcn_state; - RTMP_SEM_UNLOCK(&hif->BcnRingLock); - } - - return TRUE; -} -#endif - -INT setApTmrEnableProc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - LONG enable; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apIndex = pObj->ioctl_if; - BSS_STRUCT *pMbss = NULL; - UINT32 value = 0; - struct wifi_dev *wdev; - UCHAR bw; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - enable = os_str_tol(arg, 0, 10); - - if (!IS_HIF_TYPE(pAd, HIF_MT)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: chip_cap is not HIF_MT\n", __func__)); - return FALSE; - } - - if ((enable < 0) || (enable > 2)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: enable is incorrect!!\n", __func__)); - return FALSE; - } - - pMbss = &pAd->ApCfg.MBSSID[apIndex]; - ASSERT(pMbss); - - if (pMbss == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: pMbss == NULL!!\n", __func__)); - return FALSE; - } - - wdev = &pMbss->wdev; - bw = wlan_operate_get_bw(wdev); - - switch (enable) { - case TMR_INITIATOR: { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: enable TMR report, as Initialiter\n", __func__)); - RTMP_IO_READ32(pAd, RMAC_TMR_PA, &value); - value = value | BIT31; - value = value & ~BIT30; - RTMP_IO_WRITE32(pAd, RMAC_TMR_PA, value); - cap->TmrEnable = 1; - MtCmdTmrCal(pAd, enable, - (pMbss->wdev.channel > 14 ? _A_BAND : _G_BAND), bw, - 0, /* Ant 0 at present */ - TMR_INITIATOR); - } break; - - case TMR_RESPONDER: { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: enable TMR report, as Responser\n", __func__)); - RTMP_IO_READ32(pAd, RMAC_TMR_PA, &value); - value = value | BIT31; - value = value | BIT30; - value = value | 0x34; /* Action frame register */ - RTMP_IO_WRITE32(pAd, RMAC_TMR_PA, value); - cap->TmrEnable = 2; - MtCmdTmrCal(pAd, enable, - (pMbss->wdev.channel > 14 ? _A_BAND : _G_BAND), bw, - 0, /* Ant 0 at present */ - TMR_RESPONDER); - } break; - - case TMR_DISABLE: - default: { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: disable TMR report\n", __func__)); - RTMP_IO_READ32(pAd, RMAC_TMR_PA, &value); - value = value & ~BIT31; - RTMP_IO_WRITE32(pAd, RMAC_TMR_PA, value); - cap->TmrEnable = FALSE; - MtCmdTmrCal(pAd, enable, - (pMbss->wdev.channel > 14 ? _A_BAND : _G_BAND), bw, - 0, /* Ant 0 at present */ - TMR_DISABLE); - } - } - - return TRUE; -} - -#ifdef CUT_THROUGH -INT Set_CutThrough_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT mode; - - mode = os_str_tol(arg, 0, 10); - cut_through_set_mode(pAd->PktTokenCb, mode); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():Set CutThroughType as %d\n", __func__, - cut_through_get_mode(pAd->PktTokenCb))); - return TRUE; -} -#endif /* CUT_THROUGH */ -#endif /* MT_MAC */ - -/* -======================================================================== -Routine Description: - Driver Ioctl for AP. - -Arguments: - pAdSrc - WLAN control block pointer - wrq - the IOCTL parameters - cmd - the command ID - subcmd - the sub-command ID - pData - the IOCTL private data pointer - Data - the IOCTL private data - -Return Value: - NDIS_STATUS_SUCCESS - IOCTL OK - Otherwise - IOCTL fail - -Note: -======================================================================== -*/ -INT RTMP_AP_IoctlHandle(IN VOID *pAdSrc, IN RTMP_IOCTL_INPUT_STRUCT *wrq, - IN INT cmd, IN USHORT subcmd, IN VOID *pData, - IN ULONG Data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - INT Status = NDIS_STATUS_SUCCESS; - - switch (cmd) { - case CMD_RTPRIV_IOCTL_SET: - Status = RTMPAPPrivIoctlSet(pAd, wrq); - break; - -#ifdef DYNAMIC_VLAN_SUPPORT - case CMD_RTPRIV_IOCTL_SET_STA_VLAN: - Status = Set_Sta_Vlan(pAd, pData); - break; -#endif - -#ifdef HOSTAPD_11R_SUPPORT - case CMD_RTPRIV_IOCTL_SET_FT_PARAM: - Status = Set_Ft_Param(pAd, pData); - break; -#endif /* HOSTAPD_11R_SUPPORT */ - - case CMD_RT_PRIV_IOCTL: - if (subcmd & OID_GET_SET_TOGGLE) - Status = RTMPAPSetInformation(pAd, wrq, (INT)subcmd); - else { -#ifdef LLTD_SUPPORT - - if (subcmd == RT_OID_GET_PHY_MODE) { - if (pData != NULL) { - UINT modetmp = 0; - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Query::Get phy mode (%02X)\n", - pAd->ApCfg.MBSSID[MAIN_MBSSID] - .wdev.PhyMode)); - modetmp = (UINT)pAd->ApCfg - .MBSSID[MAIN_MBSSID] - .wdev.PhyMode; - wrq->u.data.length = 1; - - /**(ULONG *)pData = (ULONG)pAd->ApCfg.MBSS[MAIN_MBSSID].wdev.PhyMode; */ - if (copy_to_user(pData, &modetmp, - wrq->u.data.length)) - Status = -EFAULT; - } else - Status = -EFAULT; - } else -#endif /* LLTD_SUPPORT */ - Status = RTMPAPQueryInformation(pAd, wrq, - (INT)subcmd); - } - - break; - - case CMD_RTPRIV_IOCTL_SHOW: - Status = RTMPAPPrivIoctlShow(pAd, wrq); - break; -#ifdef WSC_AP_SUPPORT - - case CMD_RTPRIV_IOCTL_SET_WSCOOB: - RTMPIoctlSetWSCOOB(pAd); - break; -#endif /*WSC_AP_SUPPORT*/ - - case CMD_RTPRIV_IOCTL_GET_MAC_TABLE: - RTMPIoctlGetMacTable(pAd, wrq); - break; -#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) - - case CMD_RTPRIV_IOCTL_GSITESURVEY: - RTMPIoctlGetSiteSurvey(pAd, wrq); - break; -#endif /* AP_SCAN_SUPPORT */ - - case CMD_RTPRIV_IOCTL_STATISTICS: - RTMPIoctlStatistics(pAd, wrq); - break; - - case CMD_MTPRIV_IOCTL_RD: - RTMPIoctlRvRDebug(pAd, wrq); - break; - - case CMD_RTPRIV_IOCTL_RX_STATISTICS: - Status = RTMPIoctlRXStatistics(pAd, wrq); - break; -#ifdef WSC_AP_SUPPORT - - case CMD_RTPRIV_IOCTL_WSC_PROFILE: - RTMPIoctlWscProfile(pAd, wrq); - break; -#endif /* WSC_AP_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - case CMD_RTPRIV_IOCTL_QUERY_BATABLE: - RTMPIoctlQueryBaTable(pAd, wrq); - break; -#endif /* DOT11_N_SUPPORT */ - - case CMD_RTPRIV_IOCTL_E2P: - RTMPAPIoctlE2PROM(pAd, wrq); - break; -#ifdef DBG - - case CMD_RTPRIV_IOCTL_BBP: - RTMPAPIoctlBBP(pAd, wrq); - break; - - case CMD_RTPRIV_IOCTL_MAC: - RTMPIoctlMAC(pAd, wrq); - break; -#ifdef RTMP_RF_RW_SUPPORT - - case CMD_RTPRIV_IOCTL_RF: - RTMPAPIoctlRF(pAd, wrq); - break; -#endif /* RTMP_RF_RW_SUPPORT */ -#endif /* DBG */ - - case CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT: - RTMPIoctlGetMacTableStaInfo(pAd, wrq); - break; - - case CMD_RTPRIV_IOCTL_GET_DRIVER_INFO: - RTMPIoctlGetDriverInfo(pAd, wrq); - break; - - case CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR: - if (pObj->ioctl_if < MAX_MBSSID_NUM(pAd)) - NdisCopyMemory((RTMP_STRING *)wrq->u.name, - (RTMP_STRING *)pAd->ApCfg - .MBSSID[pObj->ioctl_if] - .wdev.bssid, - 6); - - break; - - case CMD_RTPRIV_IOCTL_AP_SIOCGIWESSID: { - RT_CMD_AP_IOCTL_SSID *pSSID = (RT_CMD_AP_IOCTL_SSID *)pData; -#ifdef APCLI_SUPPORT - - if (pSSID->priv_flags == INT_APCLI) { - if (pAd->ApCfg.ApCliTab[pObj->ioctl_if].Valid == TRUE) { - pSSID->length = - pAd->ApCfg.ApCliTab[pObj->ioctl_if] - .SsidLen; - pSSID->pSsidStr = - (char *)&pAd->ApCfg - .ApCliTab[pObj->ioctl_if] - .Ssid; - } else { - pSSID->length = 0; - pSSID->pSsidStr = NULL; - } - } else -#endif /* APCLI_SUPPORT */ - { - pSSID->length = pAd->ApCfg.MBSSID[pSSID->apidx].SsidLen; - pSSID->pSsidStr = - (char *)pAd->ApCfg.MBSSID[pSSID->apidx].Ssid; - } - } break; -#ifdef MBSS_SUPPORT - - case CMD_RTPRIV_IOCTL_MBSS_BEACON_UPDATE: - /* Carter, TODO. check this oid. */ - UpdateBeaconHandler(pAd, NULL, BCN_UPDATE_PRETBTT); - break; - - case CMD_RTPRIV_IOCTL_MBSS_INIT: - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s -> CMD_RTPRIV_IOCTL_MBSS_INIT\n", __func__)); - MBSS_Init(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_MBSS_REMOVE: - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s -> CMD_RTPRIV_IOCTL_MBSS_REMOVE\n", __func__)); - MBSS_Remove(pAd); - break; -#ifdef MT_MAC - - case CMD_RTPRIV_IOCTL_MBSS_CR_ENABLE: - if (ext_mbss_hw_cr_enable(pData) != 0) - return NDIS_STATUS_FAILURE; - - break; - - case CMD_RTPRIV_IOCTL_MBSS_CR_DISABLE: - if (ext_mbss_hw_cr_disable(pData) != 0) - return NDIS_STATUS_FAILURE; - - break; -#endif /* MT_MAC */ -#endif /* MBSS_SUPPORT */ - - case CMD_RTPRIV_IOCTL_WSC_INIT: { -#ifdef APCLI_SUPPORT -#ifdef WSC_AP_SUPPORT -#ifdef WSC_V2_SUPPORT - PWSC_V2_INFO pWscV2Info; -#endif /* WSC_V2_SUPPORT */ - APCLI_STRUCT *pApCliEntry = (APCLI_STRUCT *)pData; - WSC_CTRL *wsc_ctrl; - - wsc_ctrl = &pApCliEntry->wdev.WscControl; - WscGenerateUUID(pAd, &wsc_ctrl->Wsc_Uuid_E[0], - &wsc_ctrl->Wsc_Uuid_Str[0], 0, FALSE, TRUE); - wsc_ctrl->bWscFragment = FALSE; - wsc_ctrl->WscFragSize = 128; - wsc_ctrl->WscRxBufLen = 0; - wsc_ctrl->pWscRxBuf = NULL; - os_alloc_mem(pAd, &wsc_ctrl->pWscRxBuf, MAX_MGMT_PKT_LEN); - - if (wsc_ctrl->pWscRxBuf) - NdisZeroMemory(wsc_ctrl->pWscRxBuf, MAX_MGMT_PKT_LEN); - - wsc_ctrl->WscTxBufLen = 0; - wsc_ctrl->pWscTxBuf = NULL; - os_alloc_mem(pAd, &wsc_ctrl->pWscTxBuf, MAX_MGMT_PKT_LEN); - - if (wsc_ctrl->pWscTxBuf) - NdisZeroMemory(wsc_ctrl->pWscTxBuf, MAX_MGMT_PKT_LEN); - - initList(&wsc_ctrl->WscPeerList); - NdisAllocateSpinLock(pAd, &wsc_ctrl->WscPeerListSemLock); - wsc_ctrl->PinAttackCount = 0; - wsc_ctrl->bSetupLock = FALSE; -#ifdef WSC_V2_SUPPORT - pWscV2Info = &wsc_ctrl->WscV2Info; - pWscV2Info->bWpsEnable = TRUE; - pWscV2Info->ExtraTlv.TlvLen = 0; - pWscV2Info->ExtraTlv.TlvTag = 0; - pWscV2Info->ExtraTlv.pTlvData = NULL; - pWscV2Info->ExtraTlv.TlvType = TLV_ASCII; - pWscV2Info->bEnableWpsV2 = TRUE; -#endif /* WSC_V2_SUPPORT */ - WscInit(pAd, TRUE, Data); -#endif /* WSC_AP_SUPPORT */ -#endif /* APCLI_SUPPORT */ - } break; -#ifdef APCLI_SUPPORT - - case CMD_RTPRIV_IOCTL_APC_UP: - ApCliIfUp(pAd); - break; - - case CMD_RTPRIV_IOCTL_APC_DISCONNECT: - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, NULL, Data); - RTMP_MLME_HANDLER(pAd); - break; - - case CMD_RTPRIV_IOCTL_APC_INIT: - APCli_Init(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_APC_REMOVE: - ApCli_Remove(pAd); - break; -#endif /* APCLI_SUPPORT */ - - case CMD_RTPRIV_IOCTL_PREPARE: { - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY)) { - RT_CMD_AP_IOCTL_CONFIG *pConfig = - (RT_CMD_AP_IOCTL_CONFIG *)pData; - - pConfig->Status = RTMP_AP_IoctlPrepare(pAd, pData); - - if (pConfig->Status != 0) - return NDIS_STATUS_FAILURE; - } - } break; - - case CMD_RTPRIV_IOCTL_AP_SIOCGIWAP: { - UCHAR *pBssidDest = (UCHAR *)pData; - PCHAR pBssidStr; -#ifdef APCLI_SUPPORT - - if (Data == INT_APCLI) { - if (pAd->ApCfg.ApCliTab[pObj->ioctl_if].Valid == TRUE) - pBssidStr = (PCHAR)&APCLI_ROOT_BSSID_GET( - pAd, pAd->ApCfg.ApCliTab[pObj->ioctl_if] - .MacTabWCID); - else - pBssidStr = NULL; - } else -#endif /* APCLI_SUPPORT */ - { - pBssidStr = (PCHAR)&pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.bssid[0]; - } - - if (pBssidStr != NULL) { - memcpy(pBssidDest, pBssidStr, ETH_ALEN); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\n", - PRINT_MAC(pBssidStr))); - } else - memset(pBssidDest, 0, ETH_ALEN); - } break; - - case CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ: - /* handle for SIOCGIWRATEQ */ - { - RT_CMD_IOCTL_RATE *pRate = (RT_CMD_IOCTL_RATE *)pData; - HTTRANSMIT_SETTING HtPhyMode; -#ifdef APCLI_SUPPORT - if (pRate->priv_flags == INT_APCLI) - HtPhyMode = pAd->ApCfg.ApCliTab[pObj->ioctl_if] - .wdev.HTPhyMode; - else -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - if (pRate->priv_flags == INT_WDS) - HtPhyMode = pAd->WdsTab.WdsEntry[pObj->ioctl_if] - .wdev.HTPhyMode; - else -#endif /* WDS_SUPPORT */ - { - HtPhyMode = pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.HTPhyMode; - } - - RtmpDrvMaxRateGet(pAd, HtPhyMode.field.MODE, - HtPhyMode.field.ShortGI, - HtPhyMode.field.BW, - HtPhyMode.field.MCS, - pAd->Antenna.field.TxPath, - (UINT32 *)&pRate->BitRate); - } - break; -#ifdef RT_CFG80211_SUPPORT - case CMD_RTPRIV_IOCTL_MAIN_OPEN: { - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - wdev->bAllowBeaconing = TRUE; - - if (VIRTUAL_IF_NUM(pAd) != 0) { - wifi_sys_open(wdev); - pAd->ApCfg.MBSSID[MAIN_MBSSID].mbss_idx = MAIN_MBSSID; - APStartUpForMbss(pAd, &pAd->ApCfg.MBSSID[MAIN_MBSSID]); - APStartRekeyTimer(pAd, wdev); - } - } - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AP interface up for ra_%x\n", MAIN_MBSSID)); - break; -#endif -#ifdef HOSTAPD_SUPPORT - - case CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ: - RtmpHostapdSecuritySet(pAd, wrq); - break; -#endif /* HOSTAPD_SUPPORT */ - -#ifdef WIFI_DIAG - case CMD_RTPRIV_IOCTL_GET_PROCESS_INFO: - DiagGetProcessInfo(pAd, wrq); - break; -#endif - - default: - Status = RTMP_COM_IoctlHandle(pAd, wrq, cmd, subcmd, pData, - Data); - break; - } - - return Status; -} - -#ifdef DYNAMIC_VGA_SUPPORT -INT Set_DyncVgaEnable_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT Enable; - - Enable = os_str_tol(arg, 0, 10); - pAd->CommonCfg.lna_vga_ctl.bDyncVgaEnable = (Enable > 0) ? TRUE : FALSE; - - if (pAd->CommonCfg.lna_vga_ctl.bDyncVgaEnable == TRUE) - dynamic_vga_enable(pAd); - else - dynamic_vga_disable(pAd); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_DyncVgaEnable_Proc::(enable = %d)\n", - pAd->CommonCfg.lna_vga_ctl.bDyncVgaEnable)); - return TRUE; -} - -INT set_false_cca_hi_th(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 val = os_str_tol(arg, 0, 10); - - pAd->CommonCfg.lna_vga_ctl.nFalseCCATh = (val <= 0) ? 800 : val; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::(false cca high threshould = %d)\n", __func__, - pAd->CommonCfg.lna_vga_ctl.nFalseCCATh)); - return TRUE; -} - -INT set_false_cca_low_th(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 val = os_str_tol(arg, 0, 10); - - pAd->CommonCfg.lna_vga_ctl.nLowFalseCCATh = (val <= 0) ? 10 : val; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::(false cca low threshould = %d)\n", __func__, - pAd->CommonCfg.lna_vga_ctl.nLowFalseCCATh)); - return TRUE; -} -#endif /* DYNAMIC_VGA_SUPPORT */ - -#ifdef WAPP_SUPPORT -INT Send_ANQP_Rsp(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *ANQPRsp, IN UINT32 ANQPRspLen) -{ - UCHAR *Buf; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - PGAS_CTRL pGASCtrl = &pAd->ApCfg.MBSSID[apidx].GASCtrl; - GAS_EVENT_DATA *Event; - GAS_PEER_ENTRY *GASPeerEntry; - GAS_QUERY_RSP_FRAGMENT *GASQueryRspFrag, *Tmp; - UINT32 Len = 0, i, QueryRspOffset = 0; - BOOLEAN Cancelled; - BOOLEAN IsFound = FALSE; - - RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock); - /* Cancel PostReply timer after receiving daemon response */ - DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, GAS_PEER_ENTRY, - List) - { - if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, PeerMACAddr)) { - if (GASPeerEntry->PostReplyTimerRunning) { - RTMPCancelTimer(&GASPeerEntry->PostReplyTimer, - &Cancelled); - GASPeerEntry->PostReplyTimerRunning = FALSE; - } - - break; - } - } - RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock); - os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*Event) + ANQPRspLen); - - if (!Buf) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Not available memory\n", __func__)); - goto error0; - } - - NdisZeroMemory(Buf, sizeof(*Event) + ANQPRspLen); - Event = (GAS_EVENT_DATA *)Buf; - Event->ControlIndex = apidx; - Len += 1; - NdisMoveMemory(Event->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN); - Len += MAC_ADDR_LEN; - - if ((ANQPRspLen > pGASCtrl->MMPDUSize) || (pGASCtrl->cb_delay != 0)) { - Event->EventType = GAS_RSP_MORE; - Len += 2; - RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock); - DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, - GAS_PEER_ENTRY, List) - { - if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, - PeerMACAddr)) { - IsFound = TRUE; - Event->u.GAS_RSP_MORE_DATA.DialogToken = - GASPeerEntry->DialogToken; - Len += 1; - - if ((ANQPRspLen % pGASCtrl->MMPDUSize) == 0) - GASPeerEntry->GASRspFragNum = - ANQPRspLen / - pGASCtrl->MMPDUSize; - else - GASPeerEntry->GASRspFragNum = - (ANQPRspLen / - pGASCtrl->MMPDUSize) + - 1; - - GASPeerEntry->CurrentGASFragNum = 0; - - for (i = 0; i < GASPeerEntry->GASRspFragNum; - i++) { - os_alloc_mem(NULL, - (UCHAR **)&GASQueryRspFrag, - sizeof(*GASQueryRspFrag)); - - if (!GASQueryRspFrag) { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s Not available memory\n", - __func__)); - RTMP_SEM_UNLOCK( - &pGASCtrl->GASPeerListLock); - goto error1; - } - - GASPeerEntry->AllocResource++; - NdisZeroMemory( - GASQueryRspFrag, - sizeof(*GASQueryRspFrag)); - GASQueryRspFrag->GASRspFragID = i; - - if (i < - (GASPeerEntry->GASRspFragNum - 1)) - GASQueryRspFrag - ->FragQueryRspLen = - pGASCtrl->MMPDUSize; - else - GASQueryRspFrag - ->FragQueryRspLen = - ANQPRspLen - - (pGASCtrl->MMPDUSize * - i); - - os_alloc_mem(NULL, - (UCHAR **)&GASQueryRspFrag - ->FragQueryRsp, - GASQueryRspFrag - ->FragQueryRspLen); - GASPeerEntry->AllocResource++; - - if (!GASQueryRspFrag->FragQueryRsp) { - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s Not available memory\n", - __func__)); - RTMP_SEM_UNLOCK( - &pGASCtrl->GASPeerListLock); - goto error2; - } - - NdisMoveMemory( - GASQueryRspFrag->FragQueryRsp, - &ANQPRsp[QueryRspOffset], - GASQueryRspFrag - ->FragQueryRspLen); - QueryRspOffset += - GASQueryRspFrag->FragQueryRspLen; - DlListAddTail( - &GASPeerEntry - ->GASQueryRspFragList, - &GASQueryRspFrag->List); - } - - break; - } - } - RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock); - - if (!IsFound) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Can not find peer address in GASPeerList\n", - __func__)); - goto error1; - } - - Event->u.GAS_RSP_MORE_DATA.StatusCode = 0; - Len += 2; - Event->u.GAS_RSP_MORE_DATA.GASComebackDelay = - (pGASCtrl->cb_delay == 0 ? 1 : pGASCtrl->cb_delay); - Len += 2; - Event->u.GAS_RSP_MORE_DATA.AdvertisementProID = - ACCESS_NETWORK_QUERY_PROTOCOL; - Len += 1; - GASPeerEntry->CurrentState = WAIT_GAS_RSP; - MlmeEnqueue(pAd, GAS_STATE_MACHINE, GAS_RSP_MORE, Len, Buf, 0); - } else { - Event->EventType = GAS_RSP; - Len += 2; - - RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock); - DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, - GAS_PEER_ENTRY, List) - { - if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, - PeerMACAddr)) { - IsFound = TRUE; - printk("GAS RSP DialogToken = %x\n", - GASPeerEntry->DialogToken); - Event->u.GAS_RSP_DATA.DialogToken = - GASPeerEntry->DialogToken; - Len += 1; - } - break; - } - RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock); - - if (!IsFound) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Can not find peer address in GASPeerList\n", - __func__)); - goto error1; - } - - Event->u.GAS_RSP_DATA.StatusCode = 0; - Len += 2; - Event->u.GAS_RSP_DATA.GASComebackDelay = 0; - Len += 2; - Event->u.GAS_RSP_DATA.AdvertisementProID = - ACCESS_NETWORK_QUERY_PROTOCOL; - Len += 1; - Event->u.GAS_RSP_DATA.QueryRspLen = ANQPRspLen; - Len += 2; - - NdisMoveMemory(Event->u.GAS_RSP_DATA.QueryRsp, ANQPRsp, - ANQPRspLen); - Len += ANQPRspLen; - - GASPeerEntry->CurrentState = WAIT_GAS_RSP; - - MlmeEnqueue(pAd, GAS_STATE_MACHINE, GAS_RSP, Len, Buf, 0); - } - - os_free_mem(Buf); - return TRUE; -error2: - RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock); - DlListForEachSafe(GASQueryRspFrag, Tmp, - &GASPeerEntry->GASQueryRspFragList, - GAS_QUERY_RSP_FRAGMENT, List) - { - DlListDel(&GASQueryRspFrag->List); - os_free_mem(GASQueryRspFrag); - } - DlListInit(&GASPeerEntry->GASQueryRspFragList); - RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock); -error1: - os_free_mem(Buf); -error0: - return FALSE; -} - -#ifdef DPP_SUPPORT -INT wext_send_dpp_cached_frame(struct wifi_dev *wdev, UINT32 frm_id, - RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - struct wapp_event *event; - struct wapp_dpp_action_frame *req_data = NULL; - struct dpp_frame_list *dpp_frame; - - if (DlListEmpty(&wdev->dpp_frame_event_list)) { - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, no frame latched on this wdev\n", __func__)); - return false; - } - DlListForEach(dpp_frame, &wdev->dpp_frame_event_list, - struct dpp_frame_list, List) - { - if (dpp_frame->dpp_frame_event->data.frame - .wapp_dpp_frame_id_no == frm_id) { - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Found Matching Frame ID\n", __func__)); - break; - } - } - if (dpp_frame == NULL) { - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, DPP Action frame of ID %d not found in Buffer\n", - __func__, frm_id)); - return false; - } - - event = (struct wapp_event *)dpp_frame->dpp_frame_event; - req_data = (struct wapp_dpp_action_frame *)&(event->data.frame); - wrq->u.data.length = sizeof(*req_data) + req_data->frm_len; - copy_to_user(wrq->u.data.pointer, req_data, wrq->u.data.length); - DlListDel(&dpp_frame->List); - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, list size is now=%d\n", __func__, - DlListLen(&wdev->dpp_frame_event_list))); - os_free_mem(dpp_frame->dpp_frame_event); - os_free_mem(dpp_frame); - return true; -} - -INT mtk_set_pmk(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct pmk_req *pmk_data) -{ - struct _SECURITY_CONFIG *pSecConfig = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - UCHAR CliIdx = 0xFF; - - pSecConfig = &wdev->SecConfig; - - if (!IS_AKM_DPP(pSecConfig->AKMMap)) { - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, DPP not supported, first set configuration\n", - __func__)); - return -1; - } - - NdisMoveMemory(pSecConfig->PMK, pmk_data->pmk, pmk_data->pmk_len); - - /* add one entry in pmk cache */ - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) { - RTMPAddPMKIDCache(&pAd->ApCfg.PMKIDCache, apidx, - pmk_data->supplicant_addr, pmk_data->pmkid, - pmk_data->pmk, pmk_data->pmk_len); - } else if (pObj->ioctl_if_type == INT_APCLI) { - apcli_add_pmkid_cache(pAd, pmk_data->supplicant_addr, - pmk_data->pmkid, pmk_data->pmk, - pmk_data->pmk_len, wdev->func_idx, - CliIdx); - } - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s ", __func__)); - hex_dump("PMK", pSecConfig->PMK, pmk_data->pmk_len); - - return 0; -} -#endif /* DPP_SUPPORT */ - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -INT mtk_cancel_roc(PRTMP_ADAPTER pAd, struct wifi_dev *wdev) -{ - struct ch_switch_cfg *ch_sw_info; - INT ret; - - UCHAR BandIdx = HcGetBandByWdev(wdev); - - ch_sw_info = HcGetChanSwitchMonbyBandIdx(pAd, BandIdx); - - if (pAd == NULL) - return -EFAULT; - - if (ch_sw_info == NULL) - return -EFAULT; - - if (wdev == NULL) - return -EFAULT; - - if (ch_sw_info->ch_sw_on_going == TRUE || - ch_sw_info->ch_switch_sm.CurrState == CH_SWITCH_STATE_RUNNING) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::canceling ROC\n", __func__)); - ret = ch_switch_monitor_cancel(pAd, ch_sw_info); - - if (ret) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s failed to cancel roc\n", __func__)); - return ret; - } - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Failed, ROC not going on\n", __func__)); - - return 0; -} - -INT mtk_switch_chan(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, UCHAR channel, - UINT duration) -{ - UCHAR band_idx = 0; - INT ret; - struct ch_switch_cfg *ch_sw_cfg; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--> %s()\n", __func__)); - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev is NULL!\n")); - return FALSE; - } - - ret = os_alloc_mem(pAd, (UCHAR **)&ch_sw_cfg, - sizeof(struct ch_switch_cfg)); - if (ret != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("alloc mem fail!\n")); - return FALSE; - } - band_idx = HcGetBandByWdev(wdev); - - NdisZeroMemory(ch_sw_cfg, sizeof(struct ch_switch_cfg)); - ch_sw_cfg->channel = channel; - if (!duration) - duration = 40; - ch_sw_cfg->duration = duration; - ch_sw_cfg->wdev = wdev; - set_ch_switch_monitor_cfg(pAd, wdev, band_idx, ch_sw_cfg); - os_free_mem(ch_sw_cfg); - - return 0; -} - -INT mtk_start_roc(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, struct roc_req *roc) -{ - UCHAR wdev_channel = wlan_operate_get_prim_ch(wdev); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--> %s()\n", __func__)); - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev is NULL!\n")); - return FALSE; - } - - if (wdev_channel == roc->chan) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wdev is in same channel as roc request\n")); - return 0; - } - - return mtk_switch_chan(pAd, wdev, (UCHAR)roc->chan, roc->wait_time); -} - -INT mtk_send_offchannel_action_frame(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct action_frm_data *frm) -{ - INT ret; - UCHAR wdev_channel = wlan_operate_get_prim_ch(wdev); - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - HEADER_802_11 Hdr; - PUCHAR pOutBuffer = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--> %s()\n", __func__)); - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev is NULL!\n")); - return FALSE; - } - - if (wdev_channel != frm->chan) { - ret = mtk_switch_chan(pAd, wdev, (UCHAR)frm->chan, - frm->wait_time); - if (ret < 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s failed to change channel\n", __func__)); - return ret; - } - } - - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - if (NStatus != NDIS_STATUS_SUCCESS) - return NStatus; - MgtMacHeaderInitExt(pAd, &Hdr, SUBTYPE_ACTION, 0, frm->destination_addr, - frm->transmitter_addr, frm->bssid); - - Hdr.Sequence = frm->seq_no; - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &Hdr, - frm->frm_len, frm->frm, END_OF_ARGS); - - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - - return 0; -} -#endif /* CHANNEL_SWITCH_MONITOR_CONFIG */ -#endif /* WAPP_SUPPORT */ - -#ifdef CONFIG_DOT11V_WNM - -INT Set_SendBTMReq_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex = pObj->ioctl_if; - UCHAR macAddr[MAC_ADDR_LEN]; - RTMP_STRING *value; - INT i; - MAC_TABLE_ENTRY *pEntry = NULL; - BTM_REQUEST_PARAM req_frame; - UCHAR *Buf; - UINT16 BTMReqLen = 0; - RTMP_STRING *BTMReq = NULL; - -#ifdef DOT11K_RRM_SUPPORT -#ifdef AP_SCAN_SUPPORT - UINT32 loop = 0; - ULONG len_of_candidate_list = 0; - RRM_BSSID_INFO BssidInfo; - CHAR *candidate_list_included = NULL; - struct wifi_dev *wdev = NULL; - NDIS_802_11_SSID ssid; - ULONG FrameLen = 0; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[ifIndex]; -#endif /* AP_SCAN_SUPPORT */ -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT - RRM_NEIGHBOR_REP_INFO *NeighborReport = NULL; -#endif - - NdisZeroMemory(&req_frame, sizeof(req_frame)); - - if (ifIndex >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_OFF, - ("Unknown If index (%d)", ifIndex)); - return -1; - } - - if (strlen(arg) != - 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */ - return FALSE; - - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid */ - - AtoH(value, (UCHAR *)&macAddr[i++], 1); - } - - pEntry = MacTableLookup(pAd, macAddr); - if (pEntry) { - req_frame.request_mode = - (req_frame.request_mode & ~0x02) | (1 << 1); - req_frame.request_mode = - (req_frame.request_mode & ~0x04) | (1 << 2); - req_frame.disassociation_timer = 600; - req_frame.validity_interval = 200; - - BTMReqLen = sizeof(BTM_REQUEST_PARAM); - -#ifdef DOT11K_RRM_SUPPORT - os_alloc_mem(NULL, (UCHAR **)&Buf, - BTMReqLen + sizeof(RRM_NEIGHBOR_REP_INFO)); -#else - os_alloc_mem(NULL, (UCHAR **)&Buf, BTMReqLen); -#endif - -#ifdef DOT11K_RRM_SUPPORT - NdisZeroMemory(Buf, BTMReqLen + sizeof(RRM_NEIGHBOR_REP_INFO)); -#else - NdisZeroMemory(Buf, BTMReqLen); -#endif - - os_alloc_mem(NULL, (UCHAR **)&NeighborReport, - sizeof(RRM_NEIGHBOR_REP_INFO)); - - NdisCopyMemory(Buf, &req_frame, sizeof(BTM_REQUEST_PARAM)); - BTMReq = (RTMP_STRING *)Buf; - -#ifdef DOT11K_RRM_SUPPORT -#ifdef AP_SCAN_SUPPORT - if (pObj->ioctl_if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else - wdev = &pAd->ApCfg.MBSSID[0].wdev; - - NdisZeroMemory(&ssid, sizeof(NDIS_802_11_SSID)); - ssid.SsidLength = 0; - ApSiteSurvey_by_wdev(pAd, &ssid, SCAN_PASSIVE, FALSE, wdev); - OS_WAIT(4000); - if (pAd->ScanTab.BssNr > 0) { - candidate_list_included = &BTMReq[0]; - *candidate_list_included |= 0x01; - } - -#endif /* AP_SCAN_SUPPORT */ -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT -#ifdef AP_SCAN_SUPPORT - if (pAd->ScanTab.BssNr > 0) { - /* here to add the BSS Transition Candidate List Entries */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::adding BSS Transition Candidate List Entries\n", - __FUNCTION__)); - - BssTableSortByRssi(&pAd->ScanTab, FALSE); - for (loop = 0; loop < pAd->ScanTab.BssNr; loop++) { - BSS_ENTRY *pBssEntry = - &pAd->ScanTab.BssEntry[loop]; - len_of_candidate_list += - sizeof(RRM_NEIGHBOR_REP_INFO); - if (len_of_candidate_list >= 2304) - break; - if (!SSID_EQUAL( - pAd->ApCfg.MBSSID[ifIndex].Ssid, - pAd->ApCfg.MBSSID[ifIndex].SsidLen, - pBssEntry->Ssid, - pBssEntry->SsidLen)) - continue; - /* update Neighbor Report Information Elements */ - - BssidInfo.word = 0; - BssidInfo.field.APReachAble = 3; - BssidInfo.field.Security = 0; - BssidInfo.field.KeyScope = 0; - BssidInfo.field.SpectrumMng = - (pBssEntry->CapabilityInfo & (1 << 8)) ? - 1 : - 0; - BssidInfo.field.Qos = - (pBssEntry->CapabilityInfo & (1 << 9)) ? - 1 : - 0; - BssidInfo.field.APSD = - (pBssEntry->CapabilityInfo & - (1 << 11)) ? - 1 : - 0; -#ifdef DOT11K_RRM_SUPPORT - BssidInfo.field.RRM = - (pBssEntry->CapabilityInfo & - RRM_CAP_BIT) ? - 1 : - 0; -#endif - BssidInfo.field.DelayBlockAck = - (pBssEntry->CapabilityInfo & - (1 << 14)) ? - 1 : - 0; - BssidInfo.field.ImmediateBA = - (pBssEntry->CapabilityInfo & - (1 << 15)) ? - 1 : - 0; - BssidInfo.field.MobilityDomain = - (pBssEntry->bHasMDIE) ? 1 : 0; - BssidInfo.field.HT = - (pBssEntry->HtCapabilityLen != 0) ? 1 : - 0; -#ifdef DOT11_VHT_AC - BssidInfo.field.VHT = - (pBssEntry->vht_cap_len != 0) ? 1 : 0; -#endif /* DOT11_VHT_AC */ - - if (pBssEntry->Channel > 14) { - if (pBssEntry->HtCapabilityLen != 0) { -#ifdef DOT11_VHT_AC - if (pBssEntry->vht_cap_len != 0) - pBssEntry - ->CondensedPhyType = - 9; - else -#endif /* DOT11_VHT_AC */ - pBssEntry - ->CondensedPhyType = - 7; - } else { - pBssEntry->CondensedPhyType = 4; - } - } else { - if (pBssEntry->HtCapabilityLen != 0) - pBssEntry->CondensedPhyType = 7; - else if (ERP_IS_NON_ERP_PRESENT( - pBssEntry->Erp)) - pBssEntry->CondensedPhyType = 6; - else if (pBssEntry->SupRateLen > 4) - pBssEntry->CondensedPhyType = 4; - } - -#ifdef DOT11K_RRM_SUPPORT - - COPY_MAC_ADDR(NeighborReport->Bssid, - pBssEntry->Bssid); - NeighborReport->BssidInfo = BssidInfo.word; - NeighborReport->RegulatoryClass = - get_regulatory_class( - pAd, pMbss->wdev.channel, - pMbss->wdev.PhyMode, - &pMbss->wdev); - NeighborReport->ChNum = pBssEntry->Channel; - NeighborReport->PhyType = - pBssEntry->CondensedPhyType; - - RRM_InsertNeighborRepIE( - pAd, (BTMReq + BTMReqLen), &FrameLen, - sizeof(RRM_NEIGHBOR_REP_INFO), - NeighborReport); - BTMReqLen += FrameLen; - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("after adding BSS Transition Candidate List Entries::(%d)BTMReqLen=%d\n", - loop, BTMReqLen)); -#endif - } - } -#endif /* AP_SCAN_SUPPORT */ -#endif /* DOT11K_RRM_SUPPORT */ - Send_BTM_Req(pAd, macAddr, Buf, BTMReqLen); - } - - return TRUE; -} - -INT Send_BTM_Req(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *BTMReq, IN UINT32 BTMReqLen) -{ - UCHAR *Buf; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR APIndex = pObj->ioctl_if; - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[APIndex].WNMCtrl; - BTM_EVENT_DATA *Event; - BTM_PEER_ENTRY *BTMPeerEntry; - UINT32 Len = 0; - INT32 Ret; - BOOLEAN IsFound = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - RTMP_SEM_EVENT_WAIT(&pWNMCtrl->BTMPeerListLock, Ret); - DlListForEach(BTMPeerEntry, &pWNMCtrl->BTMPeerList, BTM_PEER_ENTRY, - List) - { - if (MAC_ADDR_EQUAL(BTMPeerEntry->PeerMACAddr, PeerMACAddr)) { - IsFound = TRUE; - break; - } - } - RTMP_SEM_EVENT_UP(&pWNMCtrl->BTMPeerListLock); - - if (!IsFound) { - os_alloc_mem(NULL, (UCHAR **)&BTMPeerEntry, - sizeof(*BTMPeerEntry)); - - if (!BTMPeerEntry) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Not available memory\n", __func__)); - goto error0; - } - - NdisZeroMemory(BTMPeerEntry, sizeof(*BTMPeerEntry)); - BTMPeerEntry->CurrentState = WAIT_BTM_REQ; - BTMPeerEntry->ControlIndex = APIndex; - NdisMoveMemory(BTMPeerEntry->PeerMACAddr, PeerMACAddr, - MAC_ADDR_LEN); - BTMPeerEntry->DialogToken = 1; - BTMPeerEntry->Priv = pAd; - RTMPInitTimer(pAd, &BTMPeerEntry->WaitPeerBTMRspTimer, - GET_TIMER_FUNCTION(WaitPeerBTMRspTimeout), - BTMPeerEntry, FALSE); - RTMP_SEM_EVENT_WAIT(&pWNMCtrl->BTMPeerListLock, Ret); - DlListAddTail(&pWNMCtrl->BTMPeerList, &BTMPeerEntry->List); - RTMP_SEM_EVENT_UP(&pWNMCtrl->BTMPeerListLock); - } - - os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*Event) + BTMReqLen); - - if (!Buf) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Not available memory\n", __func__)); - goto error1; - } - - NdisZeroMemory(Buf, sizeof(*Event) + BTMReqLen); - - Event = (BTM_EVENT_DATA *)Buf; - Event->ControlIndex = APIndex; - Len += 1; - NdisMoveMemory(Event->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN); - Len += MAC_ADDR_LEN; - Event->EventType = BTM_REQ; - Len += 2; - Event->u.BTM_REQ_DATA.DialogToken = BTMPeerEntry->DialogToken; - Len += 1; - Event->u.BTM_REQ_DATA.BTMReqLen = BTMReqLen; - Len += 2; - NdisMoveMemory(Event->u.BTM_REQ_DATA.BTMReq, BTMReq, BTMReqLen); - Len += BTMReqLen; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\nbefore adding BSS Transition Candidate List Entries::BTMReqLen=%d, Len=%d\n", - BTMReqLen, Len)); - MlmeEnqueue(pAd, BTM_STATE_MACHINE, BTM_REQ, Len, Buf, 0); - os_free_mem(Buf); - return TRUE; -error1: - - if (!IsFound) - os_free_mem(BTMPeerEntry); - -error0: - return FALSE; -} - -INT Send_WNM_Notify_Req(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *WNMNotifyReq, IN UINT32 WNMNotifyReqLen, - IN UINT32 type) -{ - UCHAR *Buf; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR APIndex = pObj->ioctl_if; - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[APIndex].WNMCtrl; - WNM_NOTIFY_EVENT_DATA *Event; - WNM_NOTIFY_PEER_ENTRY *WNMNotifyPeerEntry; - UINT32 Len = 0; - INT32 Ret; - BOOLEAN IsFound = FALSE; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - RTMP_SEM_EVENT_WAIT(&pWNMCtrl->WNMNotifyPeerListLock, Ret); - DlListForEach(WNMNotifyPeerEntry, &pWNMCtrl->WNMNotifyPeerList, - WNM_NOTIFY_PEER_ENTRY, List) - { - if (MAC_ADDR_EQUAL(WNMNotifyPeerEntry->PeerMACAddr, - PeerMACAddr)) { - IsFound = TRUE; - break; - } - } - RTMP_SEM_EVENT_UP(&pWNMCtrl->WNMNotifyPeerListLock); - - if (!IsFound) { - os_alloc_mem(NULL, (UCHAR **)&WNMNotifyPeerEntry, - sizeof(*WNMNotifyPeerEntry)); - - if (!WNMNotifyPeerEntry) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Not available memory\n", __func__)); - goto error0; - } - - NdisZeroMemory(WNMNotifyPeerEntry, sizeof(*WNMNotifyPeerEntry)); - WNMNotifyPeerEntry->CurrentState = WNM_NOTIFY_REQ; - WNMNotifyPeerEntry->ControlIndex = APIndex; - NdisMoveMemory(WNMNotifyPeerEntry->PeerMACAddr, PeerMACAddr, - MAC_ADDR_LEN); - WNMNotifyPeerEntry->DialogToken = 1; - WNMNotifyPeerEntry->Priv = pAd; - RTMPInitTimer(pAd, - &WNMNotifyPeerEntry->WaitPeerWNMNotifyRspTimer, - GET_TIMER_FUNCTION(WaitPeerWNMNotifyRspTimeout), - WNMNotifyPeerEntry, FALSE); - RTMP_SEM_EVENT_WAIT(&pWNMCtrl->WNMNotifyPeerListLock, Ret); - DlListAddTail(&pWNMCtrl->WNMNotifyPeerList, - &WNMNotifyPeerEntry->List); - RTMP_SEM_EVENT_UP(&pWNMCtrl->WNMNotifyPeerListLock); - } - - os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*Event) + WNMNotifyReqLen); - - if (!Buf) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Not available memory\n", __func__)); - goto error1; - } - - /* RTMPusecDelay(200000); //200ms */ - NdisZeroMemory(Buf, sizeof(*Event) + WNMNotifyReqLen); - Event = (WNM_NOTIFY_EVENT_DATA *)Buf; - Event->ControlIndex = APIndex; - Len += 1; - NdisMoveMemory(Event->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN); - Len += MAC_ADDR_LEN; - Event->EventType = type; /* WNM_NOTIFY_REQ; */ - Len += 2; - Event->u.WNM_NOTIFY_REQ_DATA.DialogToken = - WNMNotifyPeerEntry->DialogToken; - Len += 1; - Event->u.WNM_NOTIFY_REQ_DATA.WNMNotifyReqLen = WNMNotifyReqLen; - Len += 2; - NdisMoveMemory(Event->u.WNM_NOTIFY_REQ_DATA.WNMNotifyReq, WNMNotifyReq, - WNMNotifyReqLen); - Len += WNMNotifyReqLen; - MlmeEnqueue(pAd, WNM_NOTIFY_STATE_MACHINE, WNM_NOTIFY_REQ, Len, Buf, 0); - os_free_mem(Buf); - return TRUE; -error1: - - if (!IsFound) - os_free_mem(WNMNotifyPeerEntry); - -error0: - return FALSE; -} - -#ifdef CONFIG_HOTSPOT_R2 -INT Send_QOSMAP_Configure(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *QosMapBuf, IN UINT32 QosMapLen, - IN UINT8 Apidx) -{ - MLME_QOS_ACTION_STRUCT QosMapConfig; - QOSMAP_SET *pQOSMap = &QosMapConfig.QOSMap; - - NdisZeroMemory(&QosMapConfig, sizeof(MLME_QOS_ACTION_STRUCT)); - COPY_MAC_ADDR(QosMapConfig.Addr, PeerMACAddr); - QosMapConfig.ActionField = ACTION_QOSMAP_CONFIG; - QosMapConfig.apidx = Apidx; - pQOSMap->DSCP_Field_Len = QosMapLen; - NdisMoveMemory(pQOSMap->DSCP_Field, QosMapBuf, QosMapLen); - MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_QOS_CATE, - sizeof(MLME_QOS_ACTION_STRUCT), (PVOID)&QosMapConfig, 0); - RTMP_MLME_HANDLER(pAd); - return TRUE; -} - -/* for debug */ -INT Set_CR4_Hotspot_Flag(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT8 Flag = os_str_tol(arg, 0, 10); - PHOTSPOT_CTRL pHSCtrl; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR APIndex = pObj->ioctl_if; - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[APIndex].WNMCtrl; - EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T HotspotInfoUpdateT; - - pHSCtrl = &pAd->ApCfg.MBSSID[APIndex].HotSpotCtrl; - pHSCtrl->HotSpotEnable = IS_HOTSPOT_ENABLE(Flag); - pHSCtrl->DGAFDisable = IS_DGAF_DISABLE(Flag); - pHSCtrl->bASANEnable = IS_ASAN_ENABLE(Flag); - pHSCtrl->QosMapEnable = IS_QOSMAP_ENABLE(Flag); - pWNMCtrl->ProxyARPEnable = IS_PROXYARP_ENABLE(Flag); - NdisZeroMemory(&HotspotInfoUpdateT, sizeof(HotspotInfoUpdateT)); - HotspotInfoUpdateT.ucUpdateType |= fgUpdateBssCapability; - HotspotInfoUpdateT.ucHotspotBssFlags = Flag; - HotspotInfoUpdateT.ucHotspotBssId = APIndex; - MtCmdHotspotInfoUpdate(pAd, HotspotInfoUpdateT); - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s ===> Update BSS:%d HotspotFlag:0x%x\n", __func__, - HotspotInfoUpdateT.ucHotspotBssId, - HotspotInfoUpdateT.ucHotspotBssFlags)); - hotspot_bssflag_dump(Flag); - return TRUE; -} - -#endif /* CONFIG_HOTSPOT_R2 */ -#endif /* CONFIG_DOT11V_WNM */ -#ifdef PRE_CAL_TRX_SET1_SUPPORT -INT Set_KtoFlash_Debug_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT Enable; - - Enable = os_str_tol(arg, 0, 10); - pAd->KtoFlashDebug = (Enable > 0) ? TRUE : FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set_KtoFlash_Debug_Proc::(enable = %d)\n", - pAd->KtoFlashDebug)); - return TRUE; -} -INT Set_RDCE_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - INT Type; - INT BW; - INT Band; - INT i4Recv; - - if (arg) { - i4Recv = sscanf(arg, "%d-%d-%d", &(Type), &(BW), &(Band)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Type %d,BW %d,Band %d\n", __func__, Type, BW, - Band)); - - if (i4Recv != 3) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Format Error!\n")); - return FALSE; - } - - MtCmdRDCE(pAd, Type, BW, Band); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Format Error!\n")); - return FALSE; - } - - return TRUE; -} - -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#ifdef RLM_CAL_CACHE_SUPPORT -INT Set_RLM_Cal_Cache_Debug_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - rlmCalCacheStatus(pAd->rlmCalCache); - rlmCalCacheDump(pAd->rlmCalCache); - return TRUE; -} -#endif /* RLM_CAL_CACHE_SUPPORT */ - -INT Set_BWF_Enable_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT Enable; - - Enable = os_str_tol(arg, 0, 10); - MtCmdSetBWFEnable(pAd, (UINT8)Enable); - return TRUE; -} - -#ifdef TX_AGG_ADJUST_WKR -INT Set_AggAdjWkr_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - pAd->TxAggAdjsut = os_str_tol(arg, 0, 16); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxAggAdjsut = %u\n", pAd->TxAggAdjsut)); - return TRUE; -} -#endif /* TX_AGG_ADJUST_WKR */ - -#ifdef CONFIG_TX_DELAY -INT Set_TX_Batch_Cnt_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - struct tx_delay_control *tx_delay_ctl = &pAd->tr_ctl.tx_delay_ctl; - - tx_delay_ctl->tx_process_batch_cnt = simple_strtol(arg, 0, 10); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxProcessBatchCnt = %u\n", - tx_delay_ctl->tx_process_batch_cnt)); - return TRUE; -} - -INT Set_Pkt_Min_Len_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - struct tx_delay_control *tx_delay_ctl = &pAd->tr_ctl.tx_delay_ctl; - - tx_delay_ctl->min_pkt_len = simple_strtol(arg, 0, 10); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("min_pkt_len = %u\n", tx_delay_ctl->min_pkt_len)); - return TRUE; -} - -INT Set_Pkt_Max_Len_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - struct tx_delay_control *tx_delay_ctl = &pAd->tr_ctl.tx_delay_ctl; - - tx_delay_ctl->max_pkt_len = simple_strtol(arg, 0, 10); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("min_pkt_len = %u\n", tx_delay_ctl->max_pkt_len)); - return TRUE; -} - -INT Set_TX_Delay_Timeout_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - struct tx_delay_control *tx_delay_ctl = &pAd->tr_ctl.tx_delay_ctl; - - tx_delay_ctl->que_agg_timeout_value = simple_strtol(arg, 0, 10); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("que_agg_timeout_value = %u\n", - tx_delay_ctl->que_agg_timeout_value)); - return TRUE; -} -#endif - -#ifdef HTC_DECRYPT_IOT -INT Set_WTBL_AAD_OM_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT Enable; - - Enable = os_str_tol(arg, 0, 10); - HW_SET_ASIC_WCID_AAD_OM(pAd, 1, Enable); - return TRUE; -} - -INT Set_HTC_Err_TH_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) - -{ - UINT value; - - value = os_str_tol(arg, 0, 10); - - if (value) - pAd->HTC_ICV_Err_TH = value; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("@@@ pAd->HTC_ICV_Err_TH=%u\n", pAd->HTC_ICV_Err_TH)); - return TRUE; -} - -INT Set_Entry_HTC_Err_Cnt_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) - -{ - UINT value; - PMAC_TABLE_ENTRY pEntry; - - value = os_str_tol(arg, 0, 10); - pEntry = &pAd->MacTab.Content[1]; - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - ULONG Now32; - - NdisGetSystemUpTime(&Now32); - pEntry->HTC_ICVErrCnt = value; - /* Rx HTC and FAIL decryp case! */ - /* if (rxd_base->RxD2.IcvErr == 1) */ - { - if (pEntry->HTC_ICVErrCnt++ > pAd->HTC_ICV_Err_TH) { - pEntry->HTC_ICVErrCnt = - 0; /* reset the history */ - - if (pEntry->HTC_AAD_OM_Force == 0) { - pEntry->HTC_AAD_OM_Force = 1; - HW_SET_ASIC_WCID_AAD_OM(pAd, 1, 1); - } else { - pEntry->HTC_AAD_OM_Force = 0; - HW_SET_ASIC_WCID_AAD_OM(pAd, 1, 0); - } - } - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("@@@ pEntry->HTC_ICVErrCnt=%u\n", - pEntry->HTC_ICVErrCnt)); - } - - return TRUE; -} -#endif /* HTC_DECRYPT_IOT */ - -#ifdef DHCP_UC_SUPPORT -INT Set_DHCP_UC_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT value; - - value = os_str_tol(arg, 0, 10); - - if (value) - pAd->DhcpUcEnable = TRUE; - else - pAd->DhcpUcEnable = FALSE; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("@@@ pAd->DhcpUcEnable=%u\n", pAd->DhcpUcEnable)); - return TRUE; -} -#endif /* DHCP_UC_SUPPORT */ -#ifdef MBSS_AS_WDS_AP_SUPPORT -INT Set_Wds_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; - UCHAR apidx; - //struct _ez_security *ez_sec_info; - UINT8 wds_enable; - struct wifi_dev *pWdev; - MAC_TABLE_ENTRY *pEntry; - int wcid; - MAC_TABLE *pMacTable = &pAd->MacTab; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - apidx = pObj->ioctl_if; - wds_enable = simple_strtol(arg, 0, 10); - -#ifdef APCLI_SUPPORT - if (pObj->ioctl_if_type == INT_APCLI) { - APCLI_STRUCT *pApCli = &pAd->ApCfg.ApCliTab[apidx]; - pWdev = &pApCli->wdev; - if (wds_enable) - pWdev->wds_enable = TRUE; - else - pWdev->wds_enable = FALSE; - - if (pApCli->MacTabWCID) { - pEntry = &pMacTable->Content[pApCli->MacTabWCID]; - - /*Enable 4 address mode for the entry */ - if (pEntry->bEnable4Addr) - HW_SET_ASIC_WCID_4ADDR_HDR_TRANS( - pAd, pEntry->wcid, wds_enable); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("WDS STA 4 Address Mode set to %d for wcid %d \n", - wds_enable, pApCli->MacTabWCID)); - } else -#endif - { - pWdev = &pAd->ApCfg.MBSSID[apidx].wdev; - if (wds_enable && pWdev->wds_enable) - return TRUE; - else if (wds_enable) - pWdev->wds_enable = TRUE; - else - pWdev->wds_enable = FALSE; - - /*for all the connected entries set the 4 address mode */ - for (wcid = 1; VALID_UCAST_ENTRY_WCID(pAd, wcid); wcid++) { - pEntry = &pMacTable->Content[wcid]; - if ((pEntry->wdev == pWdev) && - IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC)) { - /*Enable 4 address mode for the entry */ - if (pEntry->bEnable4Addr) - HW_SET_ASIC_WCID_4ADDR_HDR_TRANS( - pAd, pEntry->wcid, wds_enable); - } - } - - { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Setting 4 Addr Hdr Translation for %d Bcast Entry \n", - pWdev->bss_info_argument.ucBcMcWlanIdx)); - HW_SET_ASIC_WCID_4ADDR_HDR_TRANS( - pAd, pWdev->bss_info_argument.ucBcMcWlanIdx, - wds_enable); - } - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("WDS AP 4 Address Mode set to %d for Mbss %d \n", - wds_enable, apidx)); - } - return TRUE; -} - -INT Set_WdsMac_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR Addr[MAC_ADDR_LEN]; - RTMP_STRING *value; - INT i; - MAC_TABLE_ENTRY *pEntry; - int wcid; - MAC_TABLE *pMacTable = &pAd->MacTab; - POS_COOKIE pObj; - UCHAR apidx; - struct wifi_dev *pWdev; - pObj = (POS_COOKIE)pAd->OS_Cookie; - apidx = pObj->ioctl_if; - - pWdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - if (strlen(arg) != - 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */ - return FALSE; - - for (i = 0, value = rstrtok(arg, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) - return FALSE; /*Invalid */ - - AtoH(value, (UCHAR *)&Addr[i++], 1); - } - COPY_MAC_ADDR(pAd->ApCfg.wds_mac, Addr); - for (wcid = 1; VALID_UCAST_ENTRY_WCID(pAd, wcid); wcid++) { - pEntry = &pMacTable->Content[wcid]; - if ((pEntry->wdev == pWdev) && IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC)) { - /*Enable 4 address mode for the entry */ - if (pEntry->bEnable4Addr && - MAC_ADDR_EQUAL(pEntry->Addr, Addr)) { - HW_SET_ASIC_WCID_4ADDR_HDR_TRANS( - pAd, pEntry->wcid, TRUE); - break; - } - } - } - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("WDS AP 4 Address Mode set to STA MAC %x:%x:%x:%x:%x:%x WCID %u \n", - Addr[0], Addr[1], Addr[2], Addr[3], Addr[4], Addr[5], wcid)); - return TRUE; -} - -#endif - -#ifdef AIR_MONITOR - -/* SMESH */ -#define SMESH_RX_CTL BIT(20) -#define SMESH_RX_CTL_OFFSET 20 -#define SMESH_RX_MGT BIT(19) -#define SMESH_RX_MGT_OFFSET 19 -#define SMESH_RX_DATA BIT(18) -#define SMESH_RX_DATA_OFFSET 18 -#define SMESH_RX_A1 BIT(17) -#define SMESH_RX_A2 BIT(16) -#define SMESH_ADDR_EN BITS(0, 7) - -/* MAR1 */ -#define MAR1_MAR_GROUP_MASK BITS(30, 31) -#define MAR1_MAR_GROUP_OFFSET 30 -#define MAR1_MAR_HASH_MODE_BSSID1 BIT(30) -#define MAR1_MAR_HASH_MODE_BSSID2 BIT(31) -#define MAR1_MAR_HASH_MODE_BSSID3 BITS(30, 31) -#define MAR1_ADDR_INDEX_MASK BITS(24, 29) -#define MAR1_ADDR_INDEX_OFFSET 24 -#define MAR1_READ 0 -#define MAR1_WRITE BIT(17) -#define MAR1_ACCESS_START_STATUS BIT(16) - -void apply_mntr_ruleset(PRTMP_ADAPTER pAd, UINT32 *pu4SMESH) -{ - if (pAd->MntRuleBitMap & RULE_CTL) - *pu4SMESH |= SMESH_RX_CTL; - else - *pu4SMESH &= ~SMESH_RX_CTL; - - if (pAd->MntRuleBitMap & RULE_MGT) - *pu4SMESH |= SMESH_RX_MGT; - else - *pu4SMESH &= ~SMESH_RX_MGT; - - if (pAd->MntRuleBitMap & RULE_DATA) - *pu4SMESH |= SMESH_RX_DATA; - else - *pu4SMESH &= ~SMESH_RX_DATA; - - if (pAd->MntRuleBitMap & RULE_A1) - *pu4SMESH |= SMESH_RX_A1; - else - *pu4SMESH &= ~SMESH_RX_A1; - - if (pAd->MntRuleBitMap & RULE_A2) - *pu4SMESH |= SMESH_RX_A2; - else - *pu4SMESH &= ~SMESH_RX_A2; -} - -INT Set_Enable_Air_Monitor_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - UCHAR mnt_enable = 0, band_idx, flush_all = FALSE; - UINT32 i, u4SMESH = 0, u4MAR0 = 0, u4MAR1 = 0; - UCHAR *p = ZERO_MAC_ADDR, muar_idx = 0; - BOOLEAN bSMESHEn = FALSE; - MNT_STA_ENTRY *pMntEntry = NULL; - MAC_TABLE_ENTRY *pMacEntry = NULL; - MNT_MUAR_GROUP *pMuarGroup = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("--> %s()\n", __func__)); - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev is NULL\n")); - return FALSE; - } - - mnt_enable = (UCHAR)simple_strtol(arg, 0, 10); - band_idx = HcGetBandByWdev(wdev); - - if (band_idx == BAND0) { - HW_IO_READ32(pAd, RMAC_SMESH, &u4SMESH); - - if ((u4SMESH & SMESH_ADDR_EN)) { - bSMESHEn = TRUE; - flush_all = TRUE; - } - } else if (band_idx == BAND1) { - HW_IO_READ32(pAd, RMAC_SMESH_B1, &u4SMESH); - - if ((u4SMESH & SMESH_ADDR_EN)) { - bSMESHEn = TRUE; - flush_all = TRUE; - } - } - - if (bSMESHEn != mnt_enable) { - if (mnt_enable == 0) { - if (flush_all == TRUE) { - for (i = 0; i < MAX_NUM_OF_MONITOR_GROUP; i++) { - pMuarGroup = &pAd->MntGroupTable[i]; - - if (pMuarGroup->bValid && - (pMuarGroup->Band == band_idx)) - NdisZeroMemory( - pMuarGroup, - sizeof(*pMuarGroup)); - } - - u4MAR0 = ((UINT32)p[0]) | ((UINT32)p[1]) << 8 | - ((UINT32)p[2]) << 16 | - ((UINT32)p[3]) << 24; - u4MAR1 = ((UINT32)p[4]) | ((UINT32)p[5]) << 8; - - for (i = 0; i < MAX_NUM_OF_MONITOR_STA; i++) { - pMntEntry = &pAd->MntTable[i]; - - if (!pMntEntry->bValid || - (pMntEntry->Band != band_idx)) - continue; - - muar_idx = pMntEntry->muar_idx; - u4MAR1 |= MAR1_WRITE | - MAR1_ACCESS_START_STATUS | - (muar_idx - << MAR1_ADDR_INDEX_OFFSET) | - (((UINT32)0 - << MAR1_MAR_GROUP_OFFSET) & - MAR1_MAR_GROUP_MASK); - HW_IO_WRITE32(pAd, RMAC_MAR0, u4MAR0); - HW_IO_WRITE32(pAd, RMAC_MAR1, u4MAR1); - pMacEntry = pMntEntry->pMacEntry; - - if (pMacEntry) { - if (band_idx == BAND1) - pMacEntry->mnt_band &= - ~MNT_BAND1; - else - pMacEntry->mnt_band &= - ~MNT_BAND0; - - if (pMacEntry->mnt_band == - 0) { /* no more use for other band */ - MTWF_LOG( - DBG_CAT_ALL, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s::call MacTableDeleteEntry(WCID=%d)- %02X:%02X:%02X:%02X:%02X:%02X\n", - __func__, - pMacEntry->wcid, - PRINT_MAC( - pMacEntry - ->Addr))); - MacTableDeleteEntry( - pAd, - pMacEntry->wcid, - pMacEntry->Addr); - } - } - - pAd->MonitrCnt[band_idx]--; - NdisZeroMemory(pMntEntry, - sizeof(*pMntEntry)); - } - - if (band_idx == DBDC_BAND0) { - HW_IO_READ32(pAd, RMAC_SMESH, &u4SMESH); - u4SMESH &= ~SMESH_ADDR_EN; - HW_IO_WRITE32(pAd, RMAC_SMESH, u4SMESH); - } else if (band_idx == DBDC_BAND1) { - HW_IO_READ32(pAd, RMAC_SMESH_B1, - &u4SMESH); - u4SMESH &= ~SMESH_ADDR_EN; - HW_IO_WRITE32(pAd, RMAC_SMESH_B1, - u4SMESH); - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s():: wrong band index(%d)\n", - __func__, band_idx)); - return FALSE; - } - } - - if ((pAd->MonitrCnt[BAND0] + pAd->MonitrCnt[BAND1]) == - 0) { - pAd->MntEnable = 0; - NdisZeroMemory(&pAd->MntTable, - sizeof(pAd->MntTable)); - NdisZeroMemory(&pAd->MntGroupTable, - sizeof(pAd->MntGroupTable)); - } - } else { - if (band_idx == DBDC_BAND0) { - HW_IO_READ32(pAd, RMAC_SMESH, &u4SMESH); - apply_mntr_ruleset(pAd, &u4SMESH); - u4SMESH |= SMESH_ADDR_EN | u4SMESH; - HW_IO_WRITE32(pAd, RMAC_SMESH, u4SMESH); - } else if (band_idx == DBDC_BAND1) { - HW_IO_READ32(pAd, RMAC_SMESH_B1, &u4SMESH); - apply_mntr_ruleset(pAd, &u4SMESH); - u4SMESH |= SMESH_ADDR_EN | u4SMESH; - HW_IO_WRITE32(pAd, RMAC_SMESH_B1, u4SMESH); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s():: wrong band index(%d)\n", - __func__, band_idx)); - return FALSE; - } - - pAd->MntEnable = 1; - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<-- %s()\n", __func__)); - return TRUE; -} - -INT Set_MonitorRule_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - INT ret = TRUE; - RTMP_STRING *this_char = NULL, *value = NULL; - INT idx = 0; - UCHAR rx_rule[3], band_idx; - UINT32 u4SMESH = 0; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("--> %s()\n", __func__)); - - while ((this_char = strsep((char **)&arg, ";")) != NULL) { - if (*this_char == '\0') { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("An unnecessary delimiter entered!\n")); - continue; - } - - if (strlen(this_char) != - 5) { /* the acceptable format is like 0:1:1 with length 5 */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal length! (acceptable format 0:1:1 length 5)\n")); - continue; - } - - for (idx = 0, value = rstrtok(this_char, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 1) || (!isxdigit(*value))) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("illegal format!\n")); - break; - } - - rx_rule[idx++] = (UCHAR)os_str_tol(value, 0, 10); - } - - if (idx != 3) - continue; - } - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev is NULL\n")); - return FALSE; - } - - pAd->MntRuleBitMap &= ~RULE_CTL; - pAd->MntRuleBitMap &= ~RULE_MGT; - pAd->MntRuleBitMap &= ~RULE_DATA; - pAd->MntRuleBitMap |= - (RULE_DATA & ((UINT32)rx_rule[0] << RULE_DATA_OFFSET)) | - (RULE_MGT & ((UINT32)rx_rule[1] << RULE_MGT_OFFSET)) | - (RULE_CTL & ((UINT32)rx_rule[2] << RULE_CTL_OFFSET)); -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd) && IS_MAP_TURNKEY_ENABLE(pAd)) { - pAd->MntRuleBitMap &= ~SMESH_RX_A1; - } -#endif - - band_idx = HcGetBandByWdev(wdev); - - if (band_idx == DBDC_BAND0) { - HW_IO_READ32(pAd, RMAC_SMESH, &u4SMESH); - u4SMESH &= ~SMESH_RX_DATA; - u4SMESH &= ~SMESH_RX_MGT; - u4SMESH &= ~SMESH_RX_CTL; - u4SMESH |= (SMESH_RX_DATA & - ((UINT32)rx_rule[0] << SMESH_RX_DATA_OFFSET)) | - (SMESH_RX_MGT & - ((UINT32)rx_rule[1] << SMESH_RX_MGT_OFFSET)) | - (SMESH_RX_CTL & - ((UINT32)rx_rule[2] << SMESH_RX_CTL_OFFSET)); -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd) && IS_MAP_TURNKEY_ENABLE(pAd)) { - u4SMESH &= ~SMESH_RX_A1; - } -#endif - HW_IO_WRITE32(pAd, RMAC_SMESH, u4SMESH); - } else if (band_idx == DBDC_BAND1) { - HW_IO_READ32(pAd, RMAC_SMESH_B1, &u4SMESH); - u4SMESH &= ~SMESH_RX_DATA; - u4SMESH &= ~SMESH_RX_MGT; - u4SMESH &= ~SMESH_RX_CTL; - u4SMESH |= (SMESH_RX_DATA & - ((UINT32)rx_rule[0] << SMESH_RX_DATA_OFFSET)) | - (SMESH_RX_MGT & - ((UINT32)rx_rule[1] << SMESH_RX_MGT_OFFSET)) | - (SMESH_RX_CTL & - ((UINT32)rx_rule[2] << SMESH_RX_CTL_OFFSET)); -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd) && IS_MAP_TURNKEY_ENABLE(pAd)) { - u4SMESH &= ~SMESH_RX_A1; - } -#endif - HW_IO_WRITE32(pAd, RMAC_SMESH_B1, u4SMESH); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():: wrong band index(%d)\n", __func__, band_idx)); - return FALSE; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<-- %s()\n", __func__)); - return ret; -} - -INT Set_MonitorTarget_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - INT ret = TRUE; - RTMP_STRING *this_char = NULL; - RTMP_STRING *value = NULL; - INT idx = 0; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("--> %s()\n", __func__)); - - while ((this_char = strsep((char **)&arg, ";")) != NULL) { - if (*this_char == '\0') { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("An unnecessary delimiter entered!\n")); - continue; - } - - if (strlen(this_char) != - 17) { /* the acceptable format of MAC address is like 01:02:03:04:05:06 with length 17 */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal MAC address length! (acceptable format 01:02:03:04:05:06 length 17)\n")); - continue; - } - - for (idx = 0, value = rstrtok(this_char, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("illegal MAC address format or octet!\n")); - break; - } - - AtoH(value, &pAd->curMntAddr[idx++], 1); - } - - if (idx != MAC_ADDR_LEN) - continue; - } - - for (idx = 0; idx < MAC_ADDR_LEN; idx++) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%02X ", pAd->curMntAddr[idx])); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<-- %s()\n", __func__)); - return ret; -} - -INT Set_MonitorIndex_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - INT ret = TRUE, i; - UINT32 u4MAR0 = 0, u4MAR1 = 0, u4DBDC_CTRL = 0; - UCHAR *p = ZERO_MAC_ADDR, mnt_idx = 0, band_idx = 0, muar_idx = 0, - muar_group_base = 0; - BOOLEAN bCreate = FALSE; - MNT_STA_ENTRY *pMntEntry = NULL; - MAC_TABLE_ENTRY *pMacEntry = NULL; - MNT_MUAR_GROUP *pMuarGroup = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("--> %s()\n", __func__)); - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev is NULL\n")); - return FALSE; - } - - band_idx = HcGetBandByWdev(wdev); - mnt_idx = (UCHAR)simple_strtol(arg, 0, 10); - - if (mnt_idx < MAX_NUM_OF_MONITOR_STA) { - pAd->MntIdx = mnt_idx; - pMntEntry = &pAd->MntTable[mnt_idx]; - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("The index is over the maximum limit.\n")); - return FALSE; - } - - if (MAC_ADDR_EQUAL(ZERO_MAC_ADDR, pAd->curMntAddr)) { - if (pMntEntry->bValid) { - pMacEntry = pMntEntry->pMacEntry; - - if (pMacEntry) { - if (band_idx == BAND1) - pMacEntry->mnt_band &= ~MNT_BAND1; - else - pMacEntry->mnt_band &= ~MNT_BAND0; - - if (pMacEntry->mnt_band == - 0) /* no more use for other band */ - MacTableDeleteEntry(pAd, - pMacEntry->wcid, - pMacEntry->Addr); - } - - if (pMntEntry->muar_group_idx < - MAX_NUM_OF_MONITOR_GROUP) - pMuarGroup = - &pAd->MntGroupTable - [pMntEntry->muar_group_idx]; - - if (pMuarGroup) { - pMuarGroup->Count--; - - if (pMuarGroup->Count == 0) - pMuarGroup->bValid = FALSE; - } - - pMntEntry->bValid = FALSE; - - if (pAd->MonitrCnt[band_idx] > 0) - pAd->MonitrCnt[band_idx]--; - - muar_idx = pMntEntry->muar_idx; - } else - return TRUE; - } else { - if (pMntEntry->bValid) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("The index of existed monitor entry.\n")); - return TRUE; - } - - if ((pAd->MonitrCnt[BAND0] + pAd->MonitrCnt[BAND1]) >= - MAX_NUM_OF_MONITOR_STA) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("The monitor number extends to maximum limit(%d).\n", - MAX_NUM_OF_MONITOR_STA)); - return FALSE; - } - - for (i = 0; i < MAX_NUM_OF_MONITOR_GROUP; i++) { - pMuarGroup = &pAd->MntGroupTable[i]; - - if (!pMuarGroup->bValid) { - NdisZeroMemory(pMntEntry, - sizeof(MNT_STA_ENTRY)); - pMuarGroup->MuarGroupBase = - MONITOR_MUAR_BASE_INDEX + - i * MAX_NUM_PER_GROUP; - pMuarGroup->bValid = TRUE; - pMuarGroup->Band = band_idx; - pMntEntry->muar_group_idx = i; - pMntEntry->muar_idx = - (pMuarGroup->MuarGroupBase + - pMuarGroup->Count++); - muar_idx = pMntEntry->muar_idx; - muar_group_base = pMuarGroup->MuarGroupBase; - bCreate = TRUE; - break; - } else if ((pMuarGroup->Count < MAX_NUM_PER_GROUP) && - (pMuarGroup->Band == band_idx)) { - NdisZeroMemory(pMntEntry, - sizeof(MNT_STA_ENTRY)); - pMntEntry->muar_group_idx = i; - pMntEntry->muar_idx = - (pMuarGroup->MuarGroupBase + - pMuarGroup->Count++); - muar_idx = pMntEntry->muar_idx; - muar_group_base = pMuarGroup->MuarGroupBase; - bCreate = TRUE; - break; - } - } - - if (bCreate) { - COPY_MAC_ADDR(pMntEntry->addr, pAd->curMntAddr); - pMacEntry = MacTableLookup(pAd, pMntEntry->addr); - if (pMacEntry == NULL) { - pMacEntry = MacTableInsertEntry( - pAd, pMntEntry->addr, wdev, - ENTRY_CAT_MONITOR, OPMODE_STA, TRUE); - - if (wdev_do_conn_act(wdev, pMacEntry) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): connect fail!!\n", - __func__)); - return FALSE; - } - } - - if (pMacEntry) { - p = pMntEntry->addr; - pAd->MonitrCnt[band_idx]++; - pMntEntry->bValid = TRUE; - pMntEntry->Band = band_idx; - pMacEntry->mnt_idx[band_idx] = mnt_idx; - - if (band_idx == BAND1) - pMacEntry->mnt_band |= MNT_BAND1; - else - pMacEntry->mnt_band |= MNT_BAND0; - - pMntEntry->pMacEntry = pMacEntry; - } - - HW_IO_READ32(pAd, CFG_DBDC_CTRL1, &u4DBDC_CTRL); - - if (band_idx == BAND1) - u4DBDC_CTRL |= (1 << (muar_group_base / - MAX_NUM_PER_GROUP)); - else - u4DBDC_CTRL &= ~(1 << (muar_group_base / - MAX_NUM_PER_GROUP)); - - HW_IO_WRITE32(pAd, CFG_DBDC_CTRL1, u4DBDC_CTRL); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Can't create a monitor entry!\n")); - return FALSE; - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("index: %d\n", mnt_idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("entry: %02X:%02X:%02X:%02X:%02X:%02X\n", PRINT_MAC(p))); - u4MAR0 = ((UINT32)p[0]) | ((UINT32)p[1]) << 8 | ((UINT32)p[2]) << 16 | - ((UINT32)p[3]) << 24; - u4MAR1 = ((UINT32)p[4]) | ((UINT32)p[5]) << 8; - u4MAR1 |= MAR1_WRITE | MAR1_ACCESS_START_STATUS | - (muar_idx << MAR1_ADDR_INDEX_OFFSET) | - (((UINT32)0 << MAR1_MAR_GROUP_OFFSET) & MAR1_MAR_GROUP_MASK); - HW_IO_WRITE32(pAd, RMAC_MAR0, u4MAR0); - HW_IO_WRITE32(pAd, RMAC_MAR1, u4MAR1); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WriteCR 0x%08X:0x%08X 0x%08X:0x%08X\n", RMAC_MAR0, u4MAR0, - RMAC_MAR1, u4MAR1)); - ret = Set_Enable_Air_Monitor_Proc( - pAd, (pAd->MonitrCnt[band_idx] > 0) ? "1" : "0"); - - do { - HW_IO_READ32(pAd, RMAC_MAR1, &u4MAR1); - } while (u4MAR1 & MAR1_ACCESS_START_STATUS); - - HW_IO_READ32(pAd, RMAC_MAR0, &u4MAR0); - p[0] = u4MAR0 & 0xFF; - p[1] = (u4MAR0 & 0xFF00) >> 8; - p[2] = (u4MAR0 & 0xFF0000) >> 16; - p[3] = (u4MAR0 & 0xFF000000) >> 24; - p[4] = u4MAR1 & 0xFF; - p[5] = (u4MAR1 & 0xFF00) >> 8; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("entry: %02X:%02X:%02X:%02X:%02X:%02X\n", PRINT_MAC(p))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<-- %s()\n", __func__)); - return ret; -} - -INT Set_MonitorShowAll_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - INT ret = TRUE; - UCHAR i = 0; - MNT_STA_ENTRY *pEntry = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("--> %s()\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Monitor Enable: %d\n", pAd->MntEnable)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Index last set: %d\n", pAd->MntIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" BAND0 Count: %d\n", pAd->MonitrCnt[BAND0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" BAND1 Count: %d\n", pAd->MonitrCnt[BAND1])); - - for (i = 0; i < MAX_NUM_OF_MONITOR_STA; i++) { - pEntry = &pAd->MntTable[i]; - - if (pEntry->bValid) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Band%d: Monitor STA[%d]\t", pEntry->Band, - i)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%02X:%02X:%02X:%02X:%02X:%02X\t", - PRINT_MAC(pEntry->addr))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[DATA]=%08lu\t", pEntry->data_cnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[MGMT]=%08lu\t", pEntry->mgmt_cnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[CNTL]=%08lu\t", pEntry->cntl_cnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[TOTAL]=%08lu\t", pEntry->Count)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RSSI:%d,%d,%d,%d\n", - pEntry->RssiSample.AvgRssi[0], - pEntry->RssiSample.AvgRssi[1], - pEntry->RssiSample.AvgRssi[2], - pEntry->RssiSample.AvgRssi[3])); - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<-- %s()\n", __func__)); - return ret; -} - -INT Set_MonitorClearCounter_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - INT ret = TRUE; - UCHAR i = 0; - MNT_STA_ENTRY *pEntry = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("--> %s()\n", __func__)); - - for (i = 0; i < MAX_NUM_OF_MONITOR_STA; i++) { - pEntry = pAd->MntTable + i; - pEntry->data_cnt = 0; - pEntry->mgmt_cnt = 0; - pEntry->cntl_cnt = 0; - pEntry->Count = 0; - NdisZeroMemory(&pEntry->RssiSample, sizeof(RSSI_SAMPLE)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<-- %s()\n", __func__)); - return ret; -} - -INT Set_Enable_MonitorTarget_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg, - IN USHORT index) -{ - INT ret = TRUE; - CHAR str[8]; - - ret = Set_MonitorTarget_Proc(pAd, arg); - - if (!ret) - return ret; - - if (index < MAX_NUM_OF_MONITOR_STA) { - sprintf(str, "%u", index); - ret = Set_MonitorIndex_Proc(pAd, str); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("The index is over the maximum limit.\n")); - ret = FALSE; - } - - return ret; -} - -INT Set_MonitorTarget0_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 0); -} - -INT Set_MonitorTarget1_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 1); -} - -INT Set_MonitorTarget2_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 2); -} - -INT Set_MonitorTarget3_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 3); -} - -INT Set_MonitorTarget4_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 4); -} - -INT Set_MonitorTarget5_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 5); -} - -INT Set_MonitorTarget6_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 6); -} - -INT Set_MonitorTarget7_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 7); -} - -INT Set_MonitorTarget8_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 8); -} - -INT Set_MonitorTarget9_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 9); -} - -INT Set_MonitorTarget10_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 10); -} - -INT Set_MonitorTarget11_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 11); -} - -INT Set_MonitorTarget12_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 12); -} - -INT Set_MonitorTarget13_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 13); -} - -INT Set_MonitorTarget14_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 14); -} - -INT Set_MonitorTarget15_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - return Set_Enable_MonitorTarget_Proc(pAd, arg, 15); -} - -VOID Air_Monitor_Pkt_Report_Action(IN RTMP_ADAPTER *pAd, IN UCHAR wcid, - IN RX_BLK *pRxBlk) -{ - UCHAR FrameBuf[512]; - AIR_RAW AirRaw; - HTTRANSMIT_SETTING HTSetting; - UCHAR Apidx = MAIN_MBSSID, BandIdx = 0, Channel = 0; - UCHAR s_addr[MAC_ADDR_LEN]; - UCHAR ETH_P_AIR_MONITOR[LENGTH_802_3_TYPE] = { 0x51, 0xA0 }; - UINT32 frame_len = 0, offset = 0, i; - struct sk_buff *skb = NULL; - FRAME_CONTROL *fc = (FRAME_CONTROL *)pRxBlk->FC; - MAC_TABLE_ENTRY *pMacEntry = &pAd->MacTab.Content[wcid]; - MNT_STA_ENTRY *pMntEntry = NULL; - RXD_BASE_STRUCT *rxd_base = (RXD_BASE_STRUCT *)pRxBlk->rmac_info; - - if (!rxd_base) - return; - - Channel = rxd_base->RxD1.ChFreq; - - if (Channel == 0) - return; - - BandIdx = HcGetBandByChannel(pAd, Channel); - - if (BandIdx >= BAND_NUM) - return; - - pMntEntry = pAd->MntTable + pMacEntry->mnt_idx[BandIdx]; - - if (!pMntEntry->bValid) - return; - - switch (fc->Type) { - case FC_TYPE_MGMT: - if (pAd->MntRuleBitMap & RULE_MGT) - pMntEntry->mgmt_cnt++; - else - goto done; - break; - - case FC_TYPE_CNTL: - if (pAd->MntRuleBitMap & RULE_CTL) - pMntEntry->cntl_cnt++; - else - goto done; - break; - - case FC_TYPE_DATA: - if (pAd->MntRuleBitMap & RULE_DATA) - pMntEntry->data_cnt++; - else - goto done; - break; - - default: - goto done; - } - - pMntEntry->Count++; - NdisMoveMemory(pMntEntry->RssiSample.AvgRssi, - pRxBlk->rx_signal.raw_rssi, - sizeof(pMntEntry->RssiSample.AvgRssi)); - - for (i = 0; i < pAd->Antenna.field.RxPath; i++) { - if (pMntEntry->RssiSample.AvgRssi[i] > 0) - pMntEntry->RssiSample.AvgRssi[i] = -127; - } - - /* Init frame buffer */ - NdisZeroMemory(FrameBuf, sizeof(FrameBuf)); - NdisZeroMemory(&AirRaw, sizeof(AirRaw)); - /* Fake a Source Address for transmission */ - COPY_MAC_ADDR(s_addr, pAd->ApCfg.MBSSID[Apidx].wdev.if_addr); - - if (s_addr[1] == 0xff) - s_addr[1] = 0; - else - s_addr[1]++; - - /* Prepare the 802.3 header */ - MAKE_802_3_HEADER(FrameBuf, pAd->ApCfg.MBSSID[Apidx].wdev.if_addr, - s_addr, ETH_P_AIR_MONITOR); - offset += LENGTH_802_3; - /* For Rate Info */ - HTSetting.field.MODE = pRxBlk->rx_rate.field.MODE; - HTSetting.field.MCS = pRxBlk->rx_rate.field.MCS; - HTSetting.field.BW = pRxBlk->rx_rate.field.BW; - HTSetting.field.ShortGI = pRxBlk->rx_rate.field.ShortGI; - getRate(HTSetting, &AirRaw.wlan_radio_tap.RATE); - AirRaw.wlan_radio_tap.PHYMODE = pRxBlk->rx_rate.field.MODE; - AirRaw.wlan_radio_tap.MCS = pRxBlk->rx_rate.field.MCS; - AirRaw.wlan_radio_tap.BW = pRxBlk->rx_rate.field.BW; - AirRaw.wlan_radio_tap.ShortGI = pRxBlk->rx_rate.field.ShortGI; -#ifdef DOT11_VHT_AC - - if (AirRaw.wlan_radio_tap.PHYMODE >= MODE_VHT) { - AirRaw.wlan_radio_tap.MCS = (pRxBlk->rx_rate.field.MCS & 0xf); - AirRaw.wlan_radio_tap.STREAM = - (pRxBlk->rx_rate.field.MCS >> 4) + 1; - } else -#endif /* DOT11_VHT_AC */ - if (AirRaw.wlan_radio_tap.PHYMODE == MODE_OFDM) { - AirRaw.wlan_radio_tap.MCS = getLegacyOFDMMCSIndex( - pRxBlk->rx_rate.field.MCS); - AirRaw.wlan_radio_tap.STREAM = - (pRxBlk->rx_rate.field.MCS >> 4) + 1; - } else { - AirRaw.wlan_radio_tap.MCS = - (pRxBlk->rx_rate.field.MCS % 8); - AirRaw.wlan_radio_tap.STREAM = - (pRxBlk->rx_rate.field.MCS >> 3) + 1; - } - - /* For RSSI */ - for (i = 0; i < pAd->Antenna.field.RxPath; i++) - AirRaw.wlan_radio_tap.RSSI[i] = - pMntEntry->RssiSample.AvgRssi[i]; - - AirRaw.wlan_radio_tap.Channel = Channel; - - /* For 802.11 Header */ - NdisMoveMemory(&AirRaw.wlan_header.FC, fc, sizeof(*fc)); - AirRaw.wlan_header.Duration = pRxBlk->Duration; - AirRaw.wlan_header.SN = pRxBlk->SN; - AirRaw.wlan_header.FN = pRxBlk->FN; - COPY_MAC_ADDR(AirRaw.wlan_header.Addr1, pRxBlk->Addr1); - COPY_MAC_ADDR(AirRaw.wlan_header.Addr2, pRxBlk->Addr2); - COPY_MAC_ADDR(AirRaw.wlan_header.Addr3, pRxBlk->Addr3); - - if (fc->ToDs == 1 && fc->FrDs == 1) - COPY_MAC_ADDR(AirRaw.wlan_header.Addr4, pRxBlk->Addr4); - - /* Prepare payload*/ - NdisCopyMemory(&FrameBuf[offset], (CHAR *)&AirRaw, sizeof(AirRaw)); - offset += sizeof(AirRaw); - frame_len = offset; - /* Create skb */ - skb = dev_alloc_skb((frame_len + 2)); - - if (!skb) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Error! Can't allocate a skb.\n", __func__)); - return; - } - - SET_OS_PKT_NETDEV(skb, pAd->ApCfg.MBSSID[Apidx].wdev.if_dev); - /* 16 byte align the IP header */ - skb_reserve(skb, 2); - /* Insert the frame content */ - NdisMoveMemory(GET_OS_PKT_DATAPTR(skb), FrameBuf, frame_len); - /* End this frame */ - skb_put(skb, frame_len); - /* Report to upper layer */ - RtmpOsPktProtocolAssign(skb); - RtmpOsPktRcvHandle(skb); -#if defined(WAPP_SUPPORT) && defined(CONFIG_MAP_SUPPORT) - wapp_send_air_mnt_rssi(pAd, pMacEntry, pMntEntry); -#endif -done: - return; -} - -#endif /* AIR_MONITOR */ - -#ifdef DYNAMIC_VLAN_SUPPORT -INT Set_Sta_Vlan(RTMP_ADAPTER *pAd, RT_CMD_AP_STA_VLAN *sta_vlan) -{ - INT Status = NDIS_STATUS_SUCCESS; - MAC_TABLE_ENTRY *pEntry; - - printk("Set_Sta_Vlan searching pEntry for Addr %02x %02x %02x %02x %02x %02x \n", - sta_vlan->sta_addr[0], sta_vlan->sta_addr[1], - sta_vlan->sta_addr[2], sta_vlan->sta_addr[3], - sta_vlan->sta_addr[4], sta_vlan->sta_addr[5]); - - /*Search for station address in the Mac Table if entry found set the vlan id */ - pEntry = MacTableLookup(pAd, sta_vlan->sta_addr); - if (pEntry && IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC)) { - pEntry->vlan_id = sta_vlan->vlan_id; - printk("pEntry %p found and set the vlan id to %d \n", pEntry, - pEntry->vlan_id); - } else - Status = NDIS_STATUS_FAILURE; - - return Status; -} -INT Set_Dvlan_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT8 vlan_id; - MAC_TABLE_ENTRY *pEntry; - MAC_TABLE *pMacTable = &pAd->MacTab; - - vlan_id = simple_strtol(arg, 0, 10); - pEntry = &pMacTable->Content[1]; - - pEntry->vlan_id = vlan_id; - printk("wcid 1 configured for vlan id %d \n", vlan_id); - return TRUE; -} -#endif - -#ifdef HOSTAPD_11R_SUPPORT -INT Set_Ft_Param(RTMP_ADAPTER *pAd, RT_CMD_AP_11R_PARAM *ap_11r_param) -{ - PFT_CFG pFtCfg; - INT Status = NDIS_STATUS_SUCCESS, apidx = 0; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: ownmac: %02x%02x%02x%02x%02x%02x\n", __func__, - PRINT_MAC(ap_11r_param->own_mac))); - - apidx = get_apidx_by_addr(pAd, ap_11r_param->own_mac); - - pFtCfg = &pAd->ApCfg.MBSSID[apidx].wdev.FtCfg; - - if (pFtCfg->FtCapFlag.Dot11rFtEnable) { - NdisZeroMemory(pFtCfg->FtR0khId, sizeof(pFtCfg->FtR0khId)); - NdisMoveMemory(pFtCfg->FtR0khId, ap_11r_param->nas_identifier, - ap_11r_param->nas_id_len); - pFtCfg->FtR0khIdLen = ap_11r_param->nas_id_len; - - NdisZeroMemory(pFtCfg->FtR1khId, MAC_ADDR_LEN); - NdisMoveMemory(pFtCfg->FtR1khId, ap_11r_param->r1_key_holder, - MAC_ADDR_LEN); - - pFtCfg->AssocDeadLine = ap_11r_param->reassociation_deadline; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%02x%02x%02x%02x%02x%02x", - PRINT_MAC(ap_11r_param->r1_key_holder))); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("nas_identifier:%s", ap_11r_param->nas_identifier)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ReAssocDeadline:%d", - ap_11r_param->reassociation_deadline)); - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("11R disabled in driver\n")); - - return Status; -} -#endif /* HOSTAPD_11R_SUPPORT */ - -#ifdef RADIUS_MAC_AUTH_SUPPORT -INT Set_Radius_Mac_Auth_Policy_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj; - UCHAR apidx; - UINT8 mac_auth_enable; - struct wifi_dev *pWdev; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - apidx = pObj->ioctl_if; - mac_auth_enable = simple_strtol(arg, 0, 10); - pWdev = &pAd->ApCfg.MBSSID[apidx].wdev; - if (mac_auth_enable) - pWdev->radius_mac_auth_enable = TRUE; - else - pWdev->radius_mac_auth_enable = FALSE; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Radius Mac Auth Policy Enabled %d for Mbss %d \n", - mac_auth_enable, apidx)); - return TRUE; -} -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - -#ifdef CONFIG_MAP_SUPPORT -INT Set_Bh_Bss_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - UCHAR enable = os_str_tol(arg, 0, 10); - struct wifi_dev *wdev = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR band_idx = 0; - - /* only do this for AP MBSS, ignore other inf type */ - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) { - UINT8 IfIdx = pObj->ioctl_if; - - wdev = &pAd->ApCfg.MBSSID[IfIdx].wdev; - } else - return FALSE; - - band_idx = HcGetBandByWdev(wdev); - - if (enable) { - wdev->MAPCfg.DevOwnRole |= BIT(MAP_ROLE_BACKHAUL_BSS); - if (band_idx < DBDC_BAND_NUM) - pAd->bh_bss_wdev[band_idx] = wdev; - else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s band_idx=%d is invalid.\n", __func__, - band_idx)); - } else - wdev->MAPCfg.DevOwnRole &= ~BIT(MAP_ROLE_BACKHAUL_BSS); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s %s bandIdx = %d ,DevOwnRole 0x%x\n", __func__, - wdev->if_dev->name, band_idx, wdev->MAPCfg.DevOwnRole)); - return TRUE; -} - -/** - * reset_mtk_map_vendor_ie: Function to clear MAP vendor IE in beacons - * - * This API is used to clear MAP vendor IE in beacon of bss - **/ -static void reset_mtk_map_vendor_ie(PRTMP_ADAPTER pAd, struct wifi_dev *wdev) -{ - os_zero_mem(wdev->MAPCfg.vendor_ie_buf, VENDOR_SPECIFIC_LEN); - wdev->MAPCfg.vendor_ie_len = 0; - if (wdev->bAllowBeaconing) - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); -} - -/** - * Set_Map_Proc: Function to enable MAP - * - * This API is used to enabled/disable MAP in WLAN driver. - * Upper layer should take care of killing deamons before disabling - * and configuring MAP settings after enabling - **/ -INT Set_Map_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - UCHAR map_mode = os_str_tol(arg, 0, 10); - UCHAR ifIndex = 0; - PAPCLI_STRUCT pApCliEntry = NULL; - PULONG pCurrState; - PWSC_CTRL pWscControl = NULL; - UCHAR i = 0; - - if (pAd->MAPMode == map_mode) { - /* No need to do anything, current and previos values are same */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s current MAP MODE is %d\n", __func__, map_mode)); - return TRUE; - } - - /* In case of enable we don't need to do anything - * since upper layer should configure interface roles */ - pAd->MAPMode = map_mode; -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd)) - MtCmdSetRxTxAirtimeEn( - pAd, ENUM_RX_AT_FEATURE_SUB_TYPE_AIRTIME_EN, TRUE); -#endif - - if (!IS_MAP_ENABLE(pAd)) { - for (i = 0; i < DBDC_BAND_NUM; i++) - pAd->bh_bss_wdev[i] = NULL; - - /* Reset roles for For AP interfaces */ - for (ifIndex = 0; (ifIndex < MAX_MBSSID_NUM(pAd)); ifIndex++) { - pAd->ApCfg.MBSSID[ifIndex].wdev.MAPCfg.DevOwnRole = - BIT(MAP_ROLE_FRONTHAUL_BSS); - APMlmeKickOutAllSta(pAd, ifIndex, - REASON_DEAUTH_STA_LEAVING); - pWscControl = - &pAd->ApCfg.MBSSID[ifIndex].wdev.WscControl; - - for (i = 0; i < pWscControl->WscBhProfiles.ProfileCnt; - i++) { - NdisZeroMemory( - &pWscControl->WscBhProfiles.Profile[i], - sizeof(WSC_CREDENTIAL)); - } - pWscControl->WscBhProfiles.ProfileCnt = 0; - - reset_mtk_map_vendor_ie( - pAd, &pAd->ApCfg.MBSSID[ifIndex].wdev); - if (pWscControl->bWscTrigger == TRUE) - WscStop(pAd, FALSE, pWscControl); - } - - /* Reset Roles for CLI interfaces */ - for (ifIndex = 0; (ifIndex < MAX_APCLI_NUM); ifIndex++) { - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - pCurrState = - &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; - if (!pApCliEntry->Valid) - continue; - pWscControl = - &pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl; - ApCliLinkDown(pAd, ifIndex); - - /* set the apcli interface be invalid.*/ - pApCliEntry->Valid = FALSE; - /* clear MlmeAux.Ssid and Bssid.*/ - NdisZeroMemory(pApCliEntry->MlmeAux.Bssid, - MAC_ADDR_LEN); - pApCliEntry->MlmeAux.SsidLen = 0; - NdisZeroMemory(pApCliEntry->MlmeAux.Ssid, - MAX_LEN_OF_SSID); - pApCliEntry->MlmeAux.Rssi = 0; - *pCurrState = APCLI_CTRL_DISCONNECTED; - if (pWscControl->bWscTrigger == TRUE) - WscStop(pAd, TRUE, pWscControl); - } - - /* reset SAE instantances, TODO move these to separate APIs */ -#ifdef DOT11_SAE_SUPPORT - sae_cfg_deinit(pAd, &pAd->SaeCfg); - sae_cfg_init(pAd, &pAd->SaeCfg); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: disabled MAP", __func__)); -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd)) - MtCmdSetRxTxAirtimeEn( - pAd, ENUM_RX_AT_FEATURE_SUB_TYPE_AIRTIME_EN, - FALSE); -#endif - } - return TRUE; -} - -#ifdef MAP_R2 -/** - * Set_MapR2_Proc: Function to enable/disable MAP R2 feature - * - * This API is used to enabled/disable MAP R2 feature in WLAN driver. - **/ -INT Set_MapR2_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - UCHAR enable = os_str_tol(arg, 0, 10); - - if (pAd->bMapR2Enable == enable) { - /* No need to do anything, current and previos values are same */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s MAP R2 is already %s\n", __func__, - enable ? "enabled" : "disabled")); - return TRUE; - } - - if (!enable) - pAd->bMapR2Enable = FALSE; - else - pAd->bMapR2Enable = TRUE; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: MAP R2 is %s\n", __func__, - pAd->bMapR2Enable ? "enabled" : "disabled")); - - return TRUE; -} - -INT Show_MapR2_Policy_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 idx; - struct wifi_dev *wdev = NULL; - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MAP R2 is %s, MapR2Enable=%d.\n", - pAd->bMapR2Enable ? "Enabled" : "Disabled", - pAd->bMapR2Enable)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("----------------------------------\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%8s %16s %11s %11s %12s %11s\n", "ifname", "SSID", "vid", - "policy_num", "primary_vid", "default_pcp")); - - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - wdev = &pAd->ApCfg.MBSSID[idx].wdev; -#ifdef MAP_TS_TRAFFIC_SUPPORT - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%6s %24s %5d %7d %11d %11d\n", wdev->if_dev->name, - pAd->ApCfg.MBSSID[wdev->func_idx].Ssid, - IS_VALID_VID(wdev->MAPCfg.fh_vid) ? - wdev->MAPCfg.fh_vid : - 0, - wdev->MAPCfg.vid_num, - IS_VALID_VID(wdev->MAPCfg.primary_vid) ? - wdev->MAPCfg.primary_vid : - 0, - wdev->MAPCfg.primary_pcp)); -#endif - } - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------------------------------------\n")); - return 0; -} - -#endif - -#ifdef DPP_SUPPORT -INT Set_Enable_Dpp_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - UCHAR enable = os_str_tol(arg, 0, 10); - - if (pAd->bDppEnable == enable) { - /* No need to do anything, current and previos values are same */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s DPP is already %s\n", __func__, - enable ? "enabled" : "disabled")); - return TRUE; - } - - if (!enable) - pAd->bDppEnable = FALSE; - else - pAd->bDppEnable = TRUE; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: DPP is %s\n", __func__, - pAd->bDppEnable ? "enabled" : "disabled")); - - return TRUE; -} -#endif /* DPP_SUPPORT */ - -INT Set_Fh_Bss_Proc(PRTMP_ADAPTER pAd, char *arg) -{ - UCHAR enable = os_str_tol(arg, 0, 10); - struct wifi_dev *wdev = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR i = 0; - PWSC_CTRL pWscControl = NULL; - - /* only do this for AP MBSS, ignore other inf type */ - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) { - UINT8 IfIdx = pObj->ioctl_if; - - wdev = &pAd->ApCfg.MBSSID[IfIdx].wdev; - pWscControl = &pAd->ApCfg.MBSSID[IfIdx].wdev.WscControl; - } else - return FALSE; - - if (enable) - wdev->MAPCfg.DevOwnRole |= BIT(MAP_ROLE_FRONTHAUL_BSS); - else { - wdev->MAPCfg.DevOwnRole &= ~BIT(MAP_ROLE_FRONTHAUL_BSS); - /* reset wsc backhaul profiles */ - for (i = 0; i < pWscControl->WscBhProfiles.ProfileCnt; i++) { - NdisZeroMemory(&pWscControl->WscBhProfiles.Profile[i], - sizeof(WSC_CREDENTIAL)); - } - pWscControl->WscBhProfiles.ProfileCnt = 0; - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s %s wdev->MAPCfg.DevOwnRole 0x%x\n", __func__, - wdev->if_dev->name, wdev->MAPCfg.DevOwnRole)); - - return TRUE; -} - -#ifdef MAP_BL_SUPPORT -INT Set_BlackList_Add(PRTMP_ADAPTER pAd, char *arg) -{ - RTMP_STRING *this_char = NULL; - RTMP_STRING *value = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UINT8 IfIdx = pObj->ioctl_if; - UCHAR idx; - UCHAR sta_mac[MAC_ADDR_LEN]; - BSS_STRUCT *pBss = NULL; - MAC_TABLE_ENTRY *pEntry = NULL; - - /* only do this for AP MBSS, ignore other inf type */ - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) - pBss = &pAd->ApCfg.MBSSID[IfIdx]; - else - return FALSE; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--> %s()\n", __func__)); - - while ((this_char = strsep((char **)&arg, ";")) != NULL) { - if (*this_char == '\0') { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("An unnecessary delimiter entered!\n")); - continue; - } - - if (strlen(this_char) != - 17) { /* the acceptable format of MAC address is like 01:02:03:04:05:06 with length 17 */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal MAC address length! (acceptable format 01:02:03:04:05:06 length 17)\n")); - continue; - } - - for (idx = 0, value = rstrtok(this_char, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("illegal MAC address format or octet!\n")); - break; - } - - AtoH(value, &sta_mac[idx++], 1); - } - - if (idx != MAC_ADDR_LEN) - continue; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("sta mac:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(sta_mac))); - RTMP_SEM_LOCK(&pBss->BlackListLock); - map_blacklist_add(&pBss->BlackList, sta_mac); - RTMP_SEM_UNLOCK(&pBss->BlackListLock); - - pEntry = MacTableLookup(pAd, sta_mac); - - if (!pEntry || !pEntry->wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:pEntry or pEntry->wdev is null!\n", __func__)); - return FALSE; - } - - if (pEntry && (pEntry->wdev->func_idx == IfIdx)) { -#ifdef MAP_R2 - wapp_send_sta_disassoc_stats_event(pAd, pEntry, - REASON_DISASSOC_STA_LEAVING); -#endif - MlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, - FALSE); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<-- %s()\n", __func__)); - return TRUE; -} - -INT Set_BlackList_Del(PRTMP_ADAPTER pAd, char *arg) -{ - RTMP_STRING *this_char = NULL; - RTMP_STRING *value = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UINT8 IfIdx = pObj->ioctl_if; - UCHAR idx; - UCHAR sta_mac[MAC_ADDR_LEN]; - BSS_STRUCT *pBss; - - /* only do this for AP MBSS, ignore other inf type */ - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) - pBss = &pAd->ApCfg.MBSSID[IfIdx]; - else - return FALSE; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--> %s()\n", __func__)); - - while ((this_char = strsep((char **)&arg, ";")) != NULL) { - if (*this_char == '\0') { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("An unnecessary delimiter entered!\n")); - continue; - } - - if (strlen(this_char) != - 17) { /* the acceptable format of MAC address is like 01:02:03:04:05:06 with length 17 */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal MAC address length! (acceptable format 01:02:03:04:05:06 length 17)\n")); - continue; - } - - for (idx = 0, value = rstrtok(this_char, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) != 2) || (!isxdigit(*value)) || - (!isxdigit(*(value + 1)))) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("illegal MAC address format or octet!\n")); - break; - } - - AtoH(value, &sta_mac[idx++], 1); - } - - if (idx != MAC_ADDR_LEN) - continue; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("sta mac:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(sta_mac))); - RTMP_SEM_LOCK(&pBss->BlackListLock); - map_blacklist_del(&pBss->BlackList, sta_mac); - RTMP_SEM_UNLOCK(&pBss->BlackListLock); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<-- %s()\n", __func__)); - return TRUE; -} - -INT Set_BlackList_Show(PRTMP_ADAPTER pAd, char *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ap_idx = 0; - - if ((pObj->ioctl_if_type == INT_MBSSID) || - (pObj->ioctl_if_type == INT_MAIN)) - ap_idx = pObj->ioctl_if; - else - return FALSE; - - map_blacklist_show(pAd, ap_idx); - - return TRUE; -} -#endif /* MAP_BL_SUPPORT */ -#endif /* CONFIG_MAP_SUPPORT */ - -#ifdef DSCP_PRI_SUPPORT -INT Set_Dscp_Pri_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - RTMP_STRING *this_char; - UINT8 dscpValue, inf_idx; - INT8 pri; - - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - inf_idx = pObj->ioctl_if; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s bss_idx : %d arg=%s\n", __func__, inf_idx, arg)); - this_char = strsep((char **)&arg, ";"); - if (this_char == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s value not defined for Dscp and Priority\n", - __func__)); - return FALSE; - } - - dscpValue = simple_strtol(this_char, 0, 10); - if ((dscpValue < 0) || (dscpValue > 63)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Invalid Dscp Value Valid Value between 0 to 63\n", - __func__)); - return FALSE; - } - if (arg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Priority not defined for Dscp %d\n", __func__, - dscpValue)); - return FALSE; - } - pri = simple_strtol(arg, 0, 10); - - if (pri < -1 || pri > 7) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Invalid Priority value Valid value between 0 to 7\n", - __func__)); - return FALSE; - } - - if (pri == 0) - pri = 3; - - pAd->ApCfg.MBSSID[inf_idx].dscp_pri_map[dscpValue] = pri; - - return TRUE; -} - -INT Show_Dscp_Pri_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT8 idx; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - BSS_STRUCT *mbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s] DSCP priority setting for Bss Idx %d\n", __func__, - pObj->ioctl_if)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("DSCP PRI DSCP PRI DSCP PRI DSCP PRI DSCP PRI DSCP PRI DSCP PRI DSCP PRI\n")); - for (idx = 0; idx < 64; idx++) { - if (idx % 8 == 0) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%4d %3d", idx, mbss->dscp_pri_map[idx])); - } - return TRUE; -} -#endif - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -VOID ch_switch_monitor_cfg_reset(struct ch_switch_cfg *ch_sw_cfg) -{ - ch_sw_cfg->channel = 0; - ch_sw_cfg->duration = 0; - ch_sw_cfg->ch_sw_on_going = FALSE; - ch_sw_cfg->wdev = NULL; - ch_sw_cfg->ch_switch_sm.CurrState = CH_SWITCH_STATE_INIT; - ch_sw_cfg->ioctl_if = -1; -} - -INT ch_switch_monitor_cancel(PRTMP_ADAPTER pAd, struct ch_switch_cfg *ch_sw_cfg) -{ - BOOLEAN cancelled; - INT ret = 0; - - if (pAd == NULL) - return ret; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::enter\n", __func__)); - RTMPCancelTimer(&ch_sw_cfg->ch_sw_timer, &cancelled); - RTMP_OS_REINIT_COMPLETION(&ch_sw_cfg->chan_switch_done); - ret = MlmeEnqueue(pAd, CH_SWITCH_MONITOR_STATE_MACHINE, - CH_SWITCH_MSG_CANCLE, 0, NULL, - (ULONG)ch_sw_cfg->wdev); - if (ret) - RTMP_MLME_HANDLER(pAd); - else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::enqueue MLME failed!\n", __func__)); - - ret = RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&ch_sw_cfg->chan_switch_done, - RTMPMsecsToJiffies(10000)); - - return ret; -} - -static VOID ch_switch_monitor_restore_last_ch(IN PRTMP_ADAPTER pAd, - struct ch_switch_cfg *ch_sw_cfg) -{ - if (ch_sw_cfg->wdev != NULL && - (ch_sw_cfg->channel != (ch_sw_cfg->wdev)->channel)) - /*scan ch restore will do enable BCN*/ - scan_ch_restore(pAd, OPMODE_AP, ch_sw_cfg->wdev); -} - -VOID ch_switch_monitor_timeout(IN PVOID system_specific1, - IN PVOID function_context, - IN PVOID system_specific2, - IN PVOID system_specific3) -{ - struct ch_switch_cfg *ch_sw_info = - (struct ch_switch_cfg *)function_context; - struct _RTMP_ADAPTER *pAd = - (struct _RTMP_ADAPTER *)ch_sw_info->wdev->sys_handle; - - if (pAd == NULL || ch_sw_info == NULL) - return; - - MlmeEnqueue(pAd, CH_SWITCH_MONITOR_STATE_MACHINE, CH_SWITCH_MSG_TIMEOUT, - 0, NULL, (ULONG)ch_sw_info->wdev); - RTMP_MLME_HANDLER(pAd); -} - -static VOID ch_switch_monitor_listen_exit(RTMP_ADAPTER *pAd, - struct ch_switch_cfg *ch_sw_cfg) -{ - BOOLEAN ch_switch_done = TRUE; - - ch_switch_monitor_restore_last_ch(pAd, ch_sw_cfg); - RTMP_OS_COMPLETE(&ch_sw_cfg->chan_switch_done); - ch_switch_monitor_cfg_reset(ch_sw_cfg); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::Restore to last channel\n", __func__)); - /* send event to userspace */ - RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, - CH_SWITCH_MONITOR_DONE_EVENT_FLAG, NULL, - (char *)&ch_switch_done, - sizeof(ch_switch_done)); -} - -static VOID ch_switch_monitor_listen_cancel(RTMP_ADAPTER *pAd, - MLME_QUEUE_ELEM *Elem) -{ - UCHAR BandIdx = HcGetBandByWdev((struct wifi_dev *)Elem->Priv); - struct ch_switch_cfg *ch_sw_info = - HcGetChanSwitchMonbyBandIdx(pAd, BandIdx); - - if (pAd == NULL) - return; - - ch_switch_monitor_listen_exit(pAd, ch_sw_info); -} - -static VOID ch_switch_monitor_listen_timeout(RTMP_ADAPTER *pAd, - MLME_QUEUE_ELEM *Elem) -{ - UCHAR BandIdx = HcGetBandByWdev((struct wifi_dev *)Elem->Priv); - struct ch_switch_cfg *ch_sw_info = - HcGetChanSwitchMonbyBandIdx(pAd, BandIdx); - - if (pAd == NULL) - return; - - ch_switch_monitor_listen_exit(pAd, ch_sw_info); -} - -static INT do_channel_switch_monitor(IN PRTMP_ADAPTER pAd, - struct ch_switch_cfg *ch_sw_info) -{ - UCHAR channel = 0; - struct wifi_dev *wdev = NULL; - UCHAR BssIdx = 0; - - if (pAd == NULL) - return -1; - - channel = ch_sw_info->channel; - wdev = ch_sw_info->wdev; - - if (wdev == NULL) - return -1; - - if (channel == wdev->channel) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: current channel is the target channel %d\n", - __func__, channel)); - return 0; - } - - /* Disable BCN */ - AsicDisableSync(pAd, HW_BSSID_0); -#ifdef CONFIG_AP_SUPPORT - /* Disable beacon tx for all BSS */ - for (BssIdx = 0; BssIdx < pAd->ApCfg.BssidNum; BssIdx++) { - wdev = &pAd->ApCfg.MBSSID[BssIdx].wdev; - - if (wdev->bAllowBeaconing) - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_DISABLE_TX); - } -#endif /* CONFIG_AP_SUPPORT */ - /*switch channel*/ - wlan_operate_scan(wdev, channel); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:: switch to channel %d\n", __func__, channel)); - - RTMP_OS_COMPLETE(&ch_sw_info->chan_switch_done); - return 0; -} - -static VOID ch_switch_monitor_enter_listen(RTMP_ADAPTER *pAd, - MLME_QUEUE_ELEM *Elem) -{ - INT32 ret; - UCHAR BandIdx = HcGetBandByWdev((struct wifi_dev *)Elem->Priv); - struct ch_switch_cfg *ch_sw_info = - HcGetChanSwitchMonbyBandIdx(pAd, BandIdx); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::enter\n", __func__)); - if (pAd == NULL) - return; - /*switch channel*/ - ret = do_channel_switch_monitor(pAd, ch_sw_info); - if (ret != 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: fail by switch channel\n", __func__)); - ch_switch_monitor_cfg_reset(ch_sw_info); - return; - } - ch_sw_info->ch_switch_sm.CurrState = CH_SWITCH_STATE_RUNNING; - RTMPSetTimer(&ch_sw_info->ch_sw_timer, ch_sw_info->duration); -} - -static BOOLEAN ch_switch_monitor_sanity_check(IN PRTMP_ADAPTER pAd, - UCHAR channel, - struct wifi_dev *wdev) -{ - if (channel == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s pass a invalid channel(0)\n", __func__)); - return FALSE; - } - - /*check channel in channel list*/ - if (ChannelSanity(pAd, channel) == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("the channel parameter is out of channel list\n")); - return FALSE; - } - - /*check channel & phy mode*/ - if ((channel < 14 && WMODE_CAP_5G(wdev->PhyMode)) || - (channel > 14 && WMODE_CAP_2G(wdev->PhyMode))) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("the channel parameter and phy mode is not matched\n")); - return FALSE; - } - - return TRUE; -} - -INT set_ch_switch_monitor_cfg(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - UCHAR BandIdx, struct ch_switch_cfg *ch_sw_cfg) -{ - INT ret = 0; - struct ch_switch_cfg *ch_sw_info; - - if (pAd == NULL) - return -EFAULT; - - ch_sw_info = HcGetChanSwitchMonbyBandIdx(pAd, BandIdx); - - if (ch_sw_info == NULL) - return -EFAULT; - - if (wdev == NULL) - return -EFAULT; - ch_sw_info->wdev = wdev; - - if (ch_sw_info->ch_sw_on_going == TRUE || - ch_sw_info->ch_switch_sm.CurrState == CH_SWITCH_STATE_RUNNING) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Failed!!!Please cancel last channel switch firstly!\n", - __func__)); - return -EFAULT; - } - - if (ch_switch_monitor_sanity_check(pAd, ch_sw_cfg->channel, wdev)) - ch_sw_info->channel = ch_sw_cfg->channel; - else - return -EFAULT; - - if (ch_sw_cfg->duration == 0) - ch_sw_info->duration = CH_SWITCH_DFT_LISTEN_TIME; - else - ch_sw_info->duration = ch_sw_cfg->duration; - - RTMP_OS_REINIT_COMPLETION(&ch_sw_info->chan_switch_done); - ret = MlmeEnqueue(pAd, CH_SWITCH_MONITOR_STATE_MACHINE, - CH_SWITCH_MSG_LISTEN, 0, NULL, - (ULONG)ch_sw_cfg->wdev); - if (ret) { - ch_sw_info->ch_sw_on_going = TRUE; - RTMP_MLME_HANDLER(pAd); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::enqueue MLME failed!\n", __func__)); - - ret = RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&ch_sw_info->chan_switch_done, - RTMPMsecsToJiffies(10000)); - - return ret; -} - -VOID ch_switch_monitor_del(struct _RTMP_ADAPTER *pAd) -{ - BOOLEAN cancelled; - UCHAR BandIdx; - struct ch_switch_cfg *ch_sw_cfg; - - if (pAd == NULL) - return; - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - ch_sw_cfg = HcGetChanSwitchMonbyBandIdx(pAd, BandIdx); - RTMPCancelTimer(&ch_sw_cfg->ch_sw_timer, &cancelled); - RTMPReleaseTimer(&ch_sw_cfg->ch_sw_timer, &cancelled); - NdisZeroMemory(ch_sw_cfg, sizeof(*ch_sw_cfg)); - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Exit\n", __func__)); -} - -VOID ch_switch_monitor_state_machine_init(struct _RTMP_ADAPTER *pAd) -{ - UCHAR BandIdx; - struct ch_switch_cfg *ch_sw_info; - - if (pAd == NULL) - return; - - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - ch_sw_info = HcGetChanSwitchMonbyBandIdx(pAd, BandIdx); - ch_switch_monitor_cfg_reset(ch_sw_info); - /*Init*/ - StateMachineInit( - &ch_sw_info->ch_switch_sm, - (STATE_MACHINE_FUNC *)ch_sw_info->ch_switch_state_func, - CH_SWITCH_STATE_MAX, CH_SWITCH_MSG_MAX, - (STATE_MACHINE_FUNC)Drop, CH_SWITCH_STATE_INIT, - CH_SWITCH_STATE_BASE); - /*Idle*/ - StateMachineSetAction( - &ch_sw_info->ch_switch_sm, CH_SWITCH_STATE_INIT, - CH_SWITCH_MSG_LISTEN, - (STATE_MACHINE_FUNC)ch_switch_monitor_enter_listen); - /*Running*/ - StateMachineSetAction( - &ch_sw_info->ch_switch_sm, CH_SWITCH_STATE_RUNNING, - CH_SWITCH_MSG_CANCLE, - (STATE_MACHINE_FUNC)ch_switch_monitor_listen_cancel); - StateMachineSetAction( - &ch_sw_info->ch_switch_sm, CH_SWITCH_STATE_RUNNING, - CH_SWITCH_MSG_TIMEOUT, - (STATE_MACHINE_FUNC)ch_switch_monitor_listen_timeout); - RTMPInitTimer(pAd, &ch_sw_info->ch_sw_timer, - GET_TIMER_FUNCTION(ch_switch_monitor_timeout), - ch_sw_info, FALSE); - - RTMP_OS_INIT_COMPLETION(&ch_sw_info->chan_switch_done); - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Enter %s\n", __func__)); -} - -#endif -#ifdef LED_CONTROL_SUPPORT -#ifdef VENDOR_FEATURE7_SUPPORT -INT Set_Led_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef MT7615 - if (strcmp(arg, "0") == 0) { - RTMPSetLED(pAd, LED_FORCE_OFF); - } else if (strcmp(arg, "1") == 0) { - RTMPSetLED(pAd, LED_FORCE_ON); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid arg value\n", __FUNCTION__)); - return FALSE; - } -#endif - return TRUE; -} -#endif -#endif -#ifdef CONFIG_STEERING_API_SUPPORT -VOID RTMPIoctlQueryNaSTAReport(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - UCHAR *Buf = NULL; - UCHAR Addr[MAC_ADDR_LEN]; - UCHAR AllMac[MAC_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - UCHAR PauseMac[MAC_ADDR_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - PNA_STA_REPORT_LIST pNaStaReportList; - - if (wrq->u.data.length < MAC_ADDR_LEN) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Error in %s(), Invalid value \n", __FUNCTION__)); - } - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length); - COPY_MAC_ADDR(Addr, Buf); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() MAC ADDR %2x:%2x:%2x:%2x:%2x:%2x \n", __FUNCTION__, - Addr[0], Addr[1], Addr[2], Addr[3], Addr[4], Addr[5])); - - if (MAC_ADDR_EQUAL(Addr, PauseMac)) { - pAd->ApCfg.PauseNonAssocStaReport = TRUE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(), Pause NASTA Report List \n", __FUNCTION__)); - } else if (MAC_ADDR_EQUAL(Addr, AllMac)) { - os_alloc_mem(NULL, (UCHAR **)&pNaStaReportList, - sizeof(NA_STA_REPORT_LIST)); - if (pNaStaReportList == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", - __FUNCTION__)); - return; - } - NdisCopyMemory(pNaStaReportList, &pAd->ApCfg.NAStaReportList, - sizeof(NA_STA_REPORT_LIST)); - wrq->u.data.length = sizeof(NA_STA_REPORT_LIST); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(), Send NASTA Report List to Application \n", - __FUNCTION__)); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(), MAC %2x:%2x:%2x:%2x:%2x:%2x \n", __FUNCTION__, - pNaStaReportList->reportData[0].MacAddr[0], - pNaStaReportList->reportData[0].MacAddr[1], - pNaStaReportList->reportData[0].MacAddr[2], - pNaStaReportList->reportData[0].MacAddr[3], - pNaStaReportList->reportData[0].MacAddr[4], - pNaStaReportList->reportData[0].MacAddr[5])); - - if (copy_to_user(wrq->u.data.pointer, pNaStaReportList, - wrq->u.data.length)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: copy_to_user() fail\n", __FUNCTION__)); - } - if (pNaStaReportList != NULL) - os_free_mem(pNaStaReportList); - } else { - if (NaStaList_Lookup(pAd, Addr) == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(), Inser NASTA MAC \n", __FUNCTION__)); - NAStaList_InsertEntry(pAd, Addr); - } - pAd->ApCfg.PauseNonAssocStaReport = FALSE; - } - if (Buf) - os_free_mem(Buf); -} - -INT Steer_Action(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - UCHAR *Buf = NULL; - INT Status = NDIS_STATUS_SUCCESS; - UCHAR Addr[MAC_ADDR_LEN]; - MAC_TABLE_ENTRY *pEntry = NULL; - STEER_ACTION_TYPE *pSteerActionType; - BTM_PEER_AACTION_FRAME_ENTRY *pBtmPeerActionFrameEntry; - PBTM_ACTION_FRAME_LIST pBtmActionFrameList = - &pAd->ApCfg.BTMActionFrameList; - INT32 Ret; - BOOLEAN IsFound; - PBLOCKED_STA_ENTRY Entry = NULL; - if (wrq->u.data.length < sizeof(STEER_ACTION_TYPE)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Error in %s(), Invalid value \n", __FUNCTION__)); - return NDIS_STATUS_INVALID_DATA; - } - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length); - pSteerActionType = (PSTEER_ACTION_TYPE)Buf; - - COPY_MAC_ADDR(Addr, pSteerActionType->StaMac); - switch (pSteerActionType->Type) { - case 0: { - Entry = BlackList_StaLookup(pAd, Addr); - switch (pSteerActionType->BlkListAction.Action) { - case 0: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s: BlackList_DeleteEntry action \n", - __FUNCTION__)); - if (Entry) - BlackList_DeleteEntry(pAd, Addr); - break; - - case 1: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s: BlackList_InsertEntry action \n", - __FUNCTION__)); - if (!Entry) - BlackList_InsertEntry(pAd, Addr, 0); - break; - - case 2: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s: BlackList_Entry Timer action \n", - __FUNCTION__)); - if (Entry) { - Entry->BlockTime = - pSteerActionType->BlkListAction.Timer; - } else { - Entry = BlackList_InsertEntry( - pAd, Addr, - pSteerActionType->BlkListAction.Timer); - } - if (pSteerActionType->BlkListAction.Timer > 0) { - RTMPInitTimer( - pAd, &Entry->WaitRemoveStaTimer, - GET_TIMER_FUNCTION( - WaitRemoveStaFromBlackList), - Entry, FALSE); - RTMPSetTimer( - &Entry->WaitRemoveStaTimer, - pSteerActionType->BlkListAction.Timer * - 1000); - } - - break; - - default: - break; - } - } break; - - case 1: - pEntry = MacTableLookup(pAd, Addr); - if (!pEntry) - break; - if (!(pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .WNMCtrl.WNMBTMEnable)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s: BTM Not Supported \n", __FUNCTION__)); - break; - } - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s: Send BTM action \n", __FUNCTION__)); - - RTMP_SEM_EVENT_WAIT( - &pBtmActionFrameList->BTMActionFrameListLock, Ret); - DlListForEach(pBtmPeerActionFrameEntry, - &pBtmActionFrameList->BTMActionFrameList, - BTM_PEER_AACTION_FRAME_ENTRY, List) - { - if (MAC_ADDR_EQUAL(pBtmPeerActionFrameEntry - ->reqFrameData.PeerMACAddr, - Addr)) { - IsFound = TRUE; - break; - } - } - RTMP_SEM_EVENT_UP(&pBtmActionFrameList->BTMActionFrameListLock); - if (IsFound) - SendBtmReqToAir(pAd, Addr, - pBtmPeerActionFrameEntry->reqFrameData); - break; - - case 2: { - //action don't care - } break; - - case 4: - pEntry = MacTableLookup(pAd, Addr); - if (pEntry) { - /* send wireless event - for ageout */ - BSS_STRUCT *pMbss; - pMbss = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; - /* send wireless event - for ageout */ - RTMPSendWirelessEvent(pAd, IW_AGEOUT_EVENT_FLAG, - pEntry->Addr, 0, 0); - - if (pEntry->Sst == SST_ASSOC) { - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - HEADER_802_11 DeAuthHdr; - USHORT Reason; - - /* send out a DISASSOC request frame */ - Status = MlmeAllocateMemory(pAd, &pOutBuffer); - if (Status != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - (" MlmeAllocateMemory fail ..\n")); - /*NdisReleaseSpinLock(&pAd->MacTabLock); */ - break; - } - Reason = REASON_DEAUTH_STA_LEAVING; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("Send DEAUTH - Reason = %d frame TO %x %x %x %x %x %x \n", - Reason, PRINT_MAC(pEntry->Addr))); - MgtMacHeaderInit(pAd, &DeAuthHdr, - SUBTYPE_DEAUTH, 0, - pEntry->Addr, - pMbss->wdev.if_addr, - pMbss->wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), - &DeAuthHdr, 2, &Reason, - END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - } - - MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); - } - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("unknown action type action\n")); - break; - } - - os_free_mem(Buf); - return Status; -} -INT Store_Btm_Action_Frame_Request(PRTMP_ADAPTER pAd, - RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - INT Status = NDIS_STATUS_SUCCESS; - UCHAR *Buf = NULL; - UINT32 PayLoadLen; - BOOLEAN IsFound = FALSE; - UCHAR MacAddr[MAC_ADDR_LEN]; - BTM_REQUEST_ACTION_FRAME *pActionFrameRequest; - BTM_PEER_AACTION_FRAME_ENTRY *pBtmPeerActionFrameEntry; - PBTM_ACTION_FRAME_LIST pBtmActionFrameList = - &pAd->ApCfg.BTMActionFrameList; - INT32 Ret; - if (wrq->u.data.length != sizeof(BTM_REQUEST_ACTION_FRAME)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error in %s(), Invalid value \n", __FUNCTION__)); - return NDIS_STATUS_INVALID_DATA; - } - os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length); - Status = copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length); - pActionFrameRequest = (PBTM_REQUEST_ACTION_FRAME)Buf; - - if ((pActionFrameRequest->Payload[0] != CATEGORY_WNM) && - (pActionFrameRequest->Payload[1] != BSS_TRANSITION_REQ)) - return NDIS_STATUS_INVALID_DATA; - - COPY_MAC_ADDR(MacAddr, pActionFrameRequest->MacAddr); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Mac Addr %02x:%02x:%02x:%02x:%02x:%02x, \n", - __FUNCTION__, PRINT_MAC(MacAddr))); - - if (Status == NDIS_STATUS_SUCCESS) { - RTMP_SEM_EVENT_WAIT( - &pBtmActionFrameList->BTMActionFrameListLock, Ret); - DlListForEach(pBtmPeerActionFrameEntry, - &pBtmActionFrameList->BTMActionFrameList, - BTM_PEER_AACTION_FRAME_ENTRY, List) - { - if (MAC_ADDR_EQUAL(pBtmPeerActionFrameEntry - ->reqFrameData.PeerMACAddr, - MacAddr)) { - IsFound = TRUE; - /* update action frame */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" %s: Update BTM Action Frame \n", - __FUNCTION__)); - NdisMoveMemory( - pBtmPeerActionFrameEntry->reqFrameData - .CategoryType, - pActionFrameRequest->CategoryType, 4); - NdisMoveMemory(pBtmPeerActionFrameEntry - ->reqFrameData.Payload, - pActionFrameRequest->Payload, - 1024); - pBtmPeerActionFrameEntry->reqFrameData.Len = 7; - - PayLoadLen = 7; - while (PayLoadLen < 1024) { - if (pActionFrameRequest - ->Payload[PayLoadLen] == - IE_RRM_NEIGHBOR_REP) { - pBtmPeerActionFrameEntry - ->reqFrameData.Len = - PayLoadLen + 2 + - pActionFrameRequest->Payload - [PayLoadLen + 1]; - if (pBtmPeerActionFrameEntry - ->reqFrameData.Len < - 1024) - PayLoadLen = - pBtmPeerActionFrameEntry - ->reqFrameData - .Len; - else { - pBtmPeerActionFrameEntry - ->reqFrameData - .Len = - PayLoadLen; - break; - } - } else - break; - } - } - } - RTMP_SEM_EVENT_UP(&pBtmActionFrameList->BTMActionFrameListLock); - if (!IsFound) { - os_alloc_mem(NULL, (UCHAR **)&pBtmPeerActionFrameEntry, - sizeof(*pBtmPeerActionFrameEntry)); - - if (!pBtmPeerActionFrameEntry) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s Not available memory\n", - __func__)); - goto error; - } - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s: Insert BTM Action Frame \n", - __FUNCTION__)); - NdisZeroMemory(pBtmPeerActionFrameEntry, - sizeof(*pBtmPeerActionFrameEntry)); - - NdisMoveMemory(pBtmPeerActionFrameEntry->reqFrameData - .PeerMACAddr, - MacAddr, MAC_ADDR_LEN); - NdisMoveMemory(pBtmPeerActionFrameEntry->reqFrameData - .CategoryType, - pActionFrameRequest->CategoryType, 4); - NdisMoveMemory( - pBtmPeerActionFrameEntry->reqFrameData.Payload, - pActionFrameRequest->Payload, 1024); - pBtmPeerActionFrameEntry->reqFrameData.Len = 7; - - PayLoadLen = 7; - while (PayLoadLen < 1024) { - if (pActionFrameRequest->Payload[PayLoadLen] == - IE_RRM_NEIGHBOR_REP) { - pBtmPeerActionFrameEntry->reqFrameData - .Len = - PayLoadLen + 2 + - pActionFrameRequest - ->Payload[PayLoadLen + - 1]; - if (pBtmPeerActionFrameEntry - ->reqFrameData.Len < 1024) - PayLoadLen = - pBtmPeerActionFrameEntry - ->reqFrameData - .Len; - else { - pBtmPeerActionFrameEntry - ->reqFrameData.Len = - PayLoadLen; - break; - } - } else - break; - } - - pBtmPeerActionFrameEntry->Priv = pAd; - - RTMP_SEM_EVENT_WAIT( - &pBtmActionFrameList->BTMActionFrameListLock, - Ret); - DlListAddTail(&pBtmActionFrameList->BTMActionFrameList, - &pBtmPeerActionFrameEntry->List); - RTMP_SEM_EVENT_UP( - &pBtmActionFrameList->BTMActionFrameListLock); - } - } -error: - os_free_mem(Buf); - return Status; -} -INT Delete_Btm_Action_Frame_Request(PRTMP_ADAPTER pAd, UCHAR *Addr) -{ - INT Ret; - BOOLEAN IsFound = FALSE; - BTM_PEER_AACTION_FRAME_ENTRY *btmPeerActionFrameEntry; - PBTM_ACTION_FRAME_LIST btmActionFrameList = - &pAd->ApCfg.BTMActionFrameList; - - if (!((Addr[0]) | (Addr[1]) | (Addr[2]) | (Addr[3]) | (Addr[4]) | - (Addr[5]))) /*check for valid mac */ - return 0; - - RTMP_SEM_EVENT_WAIT(&btmActionFrameList->BTMActionFrameListLock, Ret); - DlListForEach(btmPeerActionFrameEntry, - &btmActionFrameList->BTMActionFrameList, - BTM_PEER_AACTION_FRAME_ENTRY, List) - { - if (MAC_ADDR_EQUAL( - btmPeerActionFrameEntry->reqFrameData.PeerMACAddr, - Addr)) { - IsFound = TRUE; - DlListDel(&btmPeerActionFrameEntry->List); - break; - } - } - RTMP_SEM_EVENT_UP(&btmActionFrameList->BTMActionFrameListLock); - if (IsFound) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Delete BTM Action Frame %02x:%02x:%02x:%02x:%02x:%02x, \n", - __FUNCTION__, PRINT_MAC(Addr))); - os_free_mem(btmPeerActionFrameEntry); - } - - return 0; -} -#endif - -INT Set_Sta_Idle_Check(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - INT ret = TRUE; - RTMP_STRING *this_char = NULL, *value = NULL; - INT idx = 0; - UCHAR Sta_Idle_cnt[4]; - - while ((this_char = strsep((char **)&arg, ";")) != NULL) { - if (*this_char == '\0') { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("An unnecessary delimiter entered!\n")); - continue; - } - - /* the acceptable format is like 3:50:3:10 with length 12 */ - if (strlen(this_char) > 12) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal length! (acceptable format 3:50:3:10 length 12), Params: Idle_ch_insec:No_of_tx_pkts:No_of_failed_Null:No_of_Null\n")); - continue; - } - - for (idx = 0, value = rstrtok(this_char, ":"); value; - value = rstrtok(NULL, ":")) { - if ((strlen(value) > 3) || (!isxdigit(*value))) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("illegal format!\n")); - break; - } - Sta_Idle_cnt[idx++] = - (UCHAR)simple_strtol(value, 0, 10); - } - - if (idx != 4) - continue; - } - - if (idx == 4) { - pAd->StaIdleCheck_At_Sec = Sta_Idle_cnt[0]; - pAd->StaIdleCheck_At_TxPktCnt = Sta_Idle_cnt[1]; - pAd->StaIdleCheck_At_NullFrameTxFailCnt = Sta_Idle_cnt[2]; - pAd->StaIdleCheck_At_NullFrameTxCnt = Sta_Idle_cnt[3]; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" StaIdleCheck_At_Sec %d,StaIdleCheck_At_TxPktCnt %d," - "StaIdleCheck_At_NullFrameTxCnt %d,StaIdleCheck_At_NullFrameTxFailCnt %d\n", - pAd->StaIdleCheck_At_Sec, - pAd->StaIdleCheck_At_TxPktCnt, - pAd->StaIdleCheck_At_NullFrameTxCnt, - pAd->StaIdleCheck_At_NullFrameTxFailCnt)); - } - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev is NULL\n")); - return FALSE; - } - - return ret; -} - -INT Set_Sta_Fast_Idle_Check_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT value = 0; - - if (arg == NULL || strlen(arg) == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("@@@ Failed to Set/Reset StaFastIdleCheckEnable\n")); - return FALSE; - } - - value = os_str_tol(arg, 0, 10); - if (value == 1) - pAd->StaFastIdleCheckEnable = TRUE; - else - pAd->StaFastIdleCheckEnable = FALSE; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("@@@ StaFastIdleCheckEnable=%d\n", - pAd->StaFastIdleCheckEnable)); - return TRUE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_data.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_data.c deleted file mode 100644 index f2336a269a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_data.c +++ /dev/null @@ -1,5371 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#include "rt_config.h" -#ifdef TXRX_STAT_SUPPORT -#include "hdev/hdev_basic.h" -#endif -static VOID ap_tx_drop_update(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - TX_BLK *txblk) -{ -#ifdef STATS_COUNT_SUPPORT - BSS_STRUCT *mbss = txblk->pMbss; -#ifdef CUSTOMER_DCC_FEATURE - MAC_TABLE_ENTRY *entry = txblk->pMacEntry; -#endif -#ifdef TXRX_STAT_SUPPORT - struct hdev_obj *hdev = (struct hdev_obj *)wdev->pHObj; -#endif - if (mbss != NULL) { - mbss->TxDropCount++; -#ifdef TXRX_STAT_SUPPORT - INC_COUNTER64(mbss->stat_bss.TxPacketDroppedCount); - INC_COUNTER64(hdev->rdev->pRadioCtrl->TxPacketDroppedCount); -#endif - } -#ifdef CUSTOMER_DCC_FEATURE - if (entry) - entry->TxDropCount++; -#endif - -#endif /* STATS_COUNT_SUPPORT */ -} - -static VOID ap_tx_ok_update(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - TX_BLK *txblk) -{ -#ifdef TXRX_STAT_SUPPORT - struct hdev_obj *hdev = (struct hdev_obj *)(wdev->pHObj); - UCHAR pUserPriority, QIdx; -#endif -#ifdef STATS_COUNT_SUPPORT - MAC_TABLE_ENTRY *entry = txblk->pMacEntry; - - if (!entry) { -#ifdef TXRX_STAT_SUPPORT - BSS_STRUCT *txrx_mbss = NULL; - - if (txblk->wdev) { - UCHAR band_idx = HcGetBandByWdev(txblk->wdev); - struct hdev_ctrl *ctrl = - (struct hdev_ctrl *)ad->hdev_ctrl; - - txrx_mbss = &ad->ApCfg.MBSSID[txblk->wdev->wdev_idx]; - if (IS_MULTICAST_MAC_ADDR(txblk->pSrcBufHeader)) { - INC_COUNTER64(txrx_mbss->stat_bss - .TxMulticastDataPacket); - INC_COUNTER64(ctrl->rdev[band_idx] - .pRadioCtrl - ->TxMulticastDataPacket); - } else if (IS_BROADCAST_MAC_ADDR( - txblk->pSrcBufHeader)) { - INC_COUNTER64(txrx_mbss->stat_bss - .TxBroadcastDataPacket); - INC_COUNTER64(ctrl->rdev[band_idx] - .pRadioCtrl - ->TxBroadcastDataPacket); - } - } -#endif /* TXRX_STAT_SUPPORT */ - return; - } - -#ifdef WHNAT_SUPPORT -#ifdef MAP_R2 - /*if WHNAT enable, query from CR4 and then update it, but before returning update uc and mc counts*/ - if (IS_MAP_ENABLE(ad) && IS_MAP_R2_ENABLE(ad)) { - if ((ad->CommonCfg.whnat_en) && - (IS_ASIC_CAP(ad, fASIC_CAP_MCU_OFFLOAD))) { - BSS_STRUCT *mbss = txblk->pMbss; - if (mbss != NULL) { - mbss->TransmittedByteCount += txblk->SrcBufLen; - mbss->TxCount++; - if (IS_MULTICAST_MAC_ADDR( - txblk->pSrcBufHeader)) { - mbss->mcPktsTx++; - mbss->mcBytesTx += txblk->SrcBufLen; - } else if (IS_BROADCAST_MAC_ADDR( - txblk->pSrcBufHeader)) { - mbss->bcPktsTx++; - mbss->bcBytesTx += txblk->SrcBufLen; - } - } - return; - } - } -#else - /*if WHNAT enable, query from CR4 and then update it*/ - if ((ad->CommonCfg.whnat_en) && - (IS_ASIC_CAP(ad, fASIC_CAP_MCU_OFFLOAD))) - return; -#endif -#endif /*WHNAT_SUPPORT*/ - - /* calculate Tx count and ByteCount per BSS */ - { - BSS_STRUCT *mbss = txblk->pMbss; -#ifdef TXRX_STAT_SUPPORT - BSS_STRUCT *txrx_mbss = NULL; -#endif - - if (mbss != NULL) { - mbss->TransmittedByteCount += txblk->SrcBufLen; - mbss->TxCount++; - - if (IS_MULTICAST_MAC_ADDR(txblk->pSrcBufHeader)) { - mbss->mcPktsTx++; -#ifdef MAP_R2 - if (IS_MAP_ENABLE(ad) && IS_MAP_R2_ENABLE(ad)) - mbss->mcBytesTx += txblk->SrcBufLen; -#endif - } else if (IS_BROADCAST_MAC_ADDR( - txblk->pSrcBufHeader)) { - mbss->bcPktsTx++; -#ifdef MAP_R2 - if (IS_MAP_ENABLE(ad) && IS_MAP_R2_ENABLE(ad)) - mbss->bcBytesTx += txblk->SrcBufLen; -#endif - } else { - mbss->ucPktsTx++; -#ifdef MAP_R2 - if (IS_MAP_ENABLE(ad) && IS_MAP_R2_ENABLE(ad)) - mbss->ucBytesTx += txblk->SrcBufLen; -#endif - } - } -#ifdef TXRX_STAT_SUPPORT - if ((mbss != NULL) || (mbss == NULL && txblk->wdev)) { - UCHAR band_idx = HcGetBandByWdev(txblk->wdev); - struct hdev_ctrl *ctrl = - (struct hdev_ctrl *)ad->hdev_ctrl; - txrx_mbss = &ad->ApCfg.MBSSID[txblk->wdev->wdev_idx]; - if (IS_MULTICAST_MAC_ADDR(txblk->pSrcBufHeader)) { - INC_COUNTER64(txrx_mbss->stat_bss - .TxMulticastDataPacket); - INC_COUNTER64(ctrl->rdev[band_idx] - .pRadioCtrl - ->TxMulticastDataPacket); - } else if (IS_BROADCAST_MAC_ADDR( - txblk->pSrcBufHeader)) { - INC_COUNTER64(txrx_mbss->stat_bss - .TxBroadcastDataPacket); - INC_COUNTER64(ctrl->rdev[band_idx] - .pRadioCtrl - ->TxBroadcastDataPacket); - } else { - INC_COUNTER64( - txrx_mbss->stat_bss.TxUnicastDataPacket); - INC_COUNTER64(ctrl->rdev[band_idx] - .pRadioCtrl - ->TxUnicastDataPacket); - } - } -#endif - if (entry->Sst == SST_ASSOC) { - INC_COUNTER64(entry->TxPackets); - entry->TxBytes += txblk->SrcBufLen; -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(ad)) - entry->TxBytesMAP += txblk->SrcBufLen; -#endif - ad->TxTotalByteCnt += txblk->SrcBufLen; -#ifdef CUSTOMER_DCC_FEATURE - entry->TxCount++; - entry->TransmittedByteCount += txblk->SrcBufLen; -#endif - } -#ifdef TXRX_STAT_SUPPORT - RTMPGetUserPriority(ad, txblk->pPacket, wdev, &pUserPriority, - &QIdx); - if ((entry && IS_ENTRY_CLIENT(entry)) && - (entry->Sst == SST_ASSOC)) { - /*increase unicast packet count per station*/ - INC_COUNTER64(entry->TxDataPacketCount); - INC_COUNTER64(entry->TxDataPacketCountPerAC[QIdx]); - INC_COUNTER64(entry->pMbss->stat_bss.TxDataPacketCount); - INC_COUNTER64(entry->pMbss->stat_bss - .TxDataPacketCountPerAC[QIdx]); - INC_COUNTER64( - hdev->rdev->pRadioCtrl->TxDataPacketCount); - INC_COUNTER64(hdev->rdev->pRadioCtrl - ->TxDataPacketCountPerAC[QIdx]); - entry->pMbss->stat_bss.TxDataPacketByte.QuadPart += - txblk->SrcBufLen; - entry->pMbss->stat_bss.TxDataPayloadByte.QuadPart += - (txblk->SrcBufLen - 14); - entry->TxDataPacketByte.QuadPart += txblk->SrcBufLen; - hdev->rdev->pRadioCtrl->TxDataPacketByte.QuadPart += - txblk->SrcBufLen; - entry->pMbss->stat_bss.LastPktStaWcid = txblk->Wcid; - } else if (entry && (IS_ENTRY_MCAST(entry))) { - /*increase mcast packet count per mbss*/ - } -#endif - } -#ifdef APCLI_SUPPORT - if (IS_ENTRY_APCLI(entry)) { - struct _APCLI_STRUCT *apcli = txblk->pApCliEntry; - - if (apcli != NULL) { - apcli->TxCount++; - apcli->TransmittedByteCount += txblk->SrcBufLen; - } - } -#endif - -#ifdef WDS_SUPPORT - - if (IS_ENTRY_WDS(entry)) { - INC_COUNTER64(ad->WdsTab.WdsEntry[entry->func_tb_idx] - .WdsCounter.TransmittedFragmentCount); - ad->WdsTab.WdsEntry[entry->func_tb_idx] - .WdsCounter.TransmittedByteCount += txblk->SrcBufLen; - } - -#endif /* WDS_SUPPORT */ -#endif /* STATS_COUNT_SUPPORT */ -} - -INT ap_fp_tx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt) -{ - PACKET_INFO pkt_info; - UCHAR *pkt_va; - UINT pkt_len; - MAC_TABLE_ENTRY *entry = NULL; - UCHAR wcid = RESERVED_WCID; - UCHAR frag_nums; -#ifdef MAP_TS_TRAFFIC_SUPPORT - MAC_TABLE_ENTRY *peer_entry = NULL; -#endif - - RTMP_QueryPacketInfo(pkt, &pkt_info, &pkt_va, &pkt_len); - - if ((!pkt_va) || (pkt_len <= 14)) - return FALSE; - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if ((wf_drv_tbl.wf_fwd_needed_hook != NULL) && - (wf_drv_tbl.wf_fwd_needed_hook() == TRUE)) { - if (is_looping_packet(pAd, pkt)) - return FALSE; - } - -#endif /* CONFIG_WIFI_PKT_FWD */ - - if (MAC_ADDR_IS_GROUP(pkt_va)) { -#ifdef A4_CONN - /* If we check an ethernet source move to this device, we should remove it. */ - if (!RTMP_GET_PACKET_A4_FWDDATA(pkt)) - a4_proxy_delete(pAd, wdev->func_idx, - (pkt_va + MAC_ADDR_LEN)); -#endif /* A4_CONN */ - if (wdev->PortSecured != WPA_802_1X_PORT_SECURED) - return FALSE; - wcid = wdev->tr_tb_idx; - } else { - entry = MacTableLookup(pAd, pkt_va); - - if (entry && (entry->Sst == SST_ASSOC)) { -#ifdef DYNAMIC_VLAN_SUPPORT - { - UCHAR *pSrcBuf; - UINT16 TypeLen; - if (entry->vlan_id) { - pSrcBuf = GET_OS_PKT_DATAPTR(pkt); - TypeLen = (pSrcBuf[12] << 8) | - pSrcBuf[13]; - pSrcBuf += LENGTH_802_3; - if (TypeLen == ETH_TYPE_VLAN) { - USHORT vlan_id = - *(USHORT *)pSrcBuf; - vlan_id = cpu2be16(vlan_id); - vlan_id = vlan_id & - 0x0FFF; /* 12 bit */ - if (vlan_id != entry->vlan_id) - return FALSE; - pSrcBuf -= LENGTH_802_3; - memmove(pSrcBuf + 4, pSrcBuf, - 12); - skb_pull(pkt, 4); - } - } - } -#endif - - wcid = (UCHAR)entry->wcid; -#ifdef RADIUS_MAC_AUTH_SUPPORT - if (wdev->radius_mac_auth_enable) { - if (!entry->bAllowTraffic) - return FALSE; - } -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - } - -#ifdef A4_CONN - if ((entry == NULL) -#ifdef AIR_MONITOR - || (entry && IS_ENTRY_MONITOR(entry)) -#endif - ) { - UCHAR main_wcid; - - /* If we check an ethernet source move to this device, we should remove it. */ - if (!RTMP_GET_PACKET_A4_FWDDATA(pkt)) - a4_proxy_delete(pAd, wdev->func_idx, - (pkt_va + MAC_ADDR_LEN)); - if (a4_proxy_lookup(pAd, wdev->func_idx, pkt_va, FALSE, - FALSE, &main_wcid)) - wcid = main_wcid; - } -#endif /* A4_CONN */ - -#ifdef CLIENT_WDS - if ((entry == NULL) -#ifdef AIR_MONITOR - || (entry && IS_ENTRY_MONITOR(entry)) -#endif - ) { - PUCHAR pEntryAddr = CliWds_ProxyLookup(pAd, pkt_va); - if (pEntryAddr != NULL) { - entry = MacTableLookup(pAd, pEntryAddr); - if (entry && (entry->Sst == SST_ASSOC)) { - wcid = (UCHAR)entry->wcid; - } - } - } -#endif /* CLIENT_WDS */ - } - - if (!(VALID_TR_WCID(wcid) && - IS_VALID_ENTRY(&pAd->MacTab.tr_entry[wcid]))) - return FALSE; - - RTMP_SET_PACKET_WCID(pkt, wcid); -#ifdef CONFIG_AP_SUPPORT -#ifdef CFG80211_SUPPORT - - /* CFG_TODO: POS NO GOOD */ - if (pAd->cfg80211_ctrl.isCfgInApMode == RT_CMD_80211_IFTYPE_AP) - RTMP_SET_PACKET_OPMODE(pkt, OPMODE_AP); - -#endif /* CFG80211_SUPPORT */ -#endif - frag_nums = get_frag_num(pAd, wdev, pkt); - RTMP_SET_PACKET_FRAGMENTS(pkt, frag_nums); - -#ifdef MAP_TS_TRAFFIC_SUPPORT - if (pAd->bTSEnable) { - peer_entry = &pAd->MacTab.Content[wcid]; - if (!map_ts_tx_process(pAd, wdev, pkt, peer_entry)) - return FALSE; - } -#endif - - /* ethertype check is not offload to mcu for fragment frame*/ - if (frag_nums > 1) { - if (!RTMPCheckEtherType(pAd, pkt, &pAd->MacTab.tr_entry[wcid], - wdev)) { - return FALSE; - } - } - return TRUE; -} - -INT ap_tx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt) -{ - PACKET_INFO pkt_info; - UCHAR *pkt_va; - UINT pkt_len; - MAC_TABLE_ENTRY *entry = NULL; -#ifdef MAP_TS_TRAFFIC_SUPPORT - MAC_TABLE_ENTRY *peer_entry = NULL; -#endif - UCHAR wcid = RESERVED_WCID; - STA_TR_ENTRY *tr_entry = NULL; - UCHAR frag_nums; - - RTMP_QueryPacketInfo(pkt, &pkt_info, &pkt_va, &pkt_len); - - if ((!pkt_va) || (pkt_len <= 14)) - return FALSE; - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if ((wf_drv_tbl.wf_fwd_needed_hook != NULL) && - (wf_drv_tbl.wf_fwd_needed_hook() == TRUE)) { - if (is_looping_packet(pAd, pkt)) - return FALSE; - } - -#endif /* CONFIG_WIFI_PKT_FWD */ - - if (MAC_ADDR_IS_GROUP(pkt_va)) { -#ifdef A4_CONN - /* If we check an ethernet source move to this device, we should remove it. */ - if (!RTMP_GET_PACKET_A4_FWDDATA(pkt)) - a4_proxy_delete(pAd, wdev->func_idx, - (pkt_va + MAC_ADDR_LEN)); -#endif /* A4_CONN */ - if (wdev->PortSecured != WPA_802_1X_PORT_SECURED) - return FALSE; - wcid = wdev->tr_tb_idx; - } else { - entry = MacTableLookup(pAd, pkt_va); - - if (entry && (entry->Sst == SST_ASSOC)) { -#ifdef DYNAMIC_VLAN_SUPPORT - { - UCHAR *pSrcBuf; - UINT16 TypeLen; - if (entry->vlan_id) { - pSrcBuf = GET_OS_PKT_DATAPTR(pkt); - TypeLen = (pSrcBuf[12] << 8) | - pSrcBuf[13]; - pSrcBuf += LENGTH_802_3; - if (TypeLen == ETH_TYPE_VLAN) { - USHORT vlan_id = - *(USHORT *)pSrcBuf; - vlan_id = cpu2be16(vlan_id); - vlan_id = vlan_id & - 0x0FFF; /* 12 bit */ - if (vlan_id != entry->vlan_id) - return FALSE; - pSrcBuf -= LENGTH_802_3; - memmove(pSrcBuf + 4, pSrcBuf, - 12); - skb_pull(pkt, 4); - } - } - } -#endif - - wcid = (UCHAR)entry->wcid; -#ifdef RADIUS_MAC_AUTH_SUPPORT - if (wdev->radius_mac_auth_enable) { - if (!entry->bAllowTraffic) - return FALSE; - } -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - } -#ifdef A4_CONN - if ((entry == NULL) -#ifdef AIR_MONITOR - || (entry && IS_ENTRY_MONITOR(entry)) -#endif - ) { - UCHAR main_wcid; - - /* If we check an ethernet source move to this device, we should remove it. */ - if (!RTMP_GET_PACKET_A4_FWDDATA(pkt)) - a4_proxy_delete(pAd, wdev->func_idx, - (pkt_va + MAC_ADDR_LEN)); - if (a4_proxy_lookup(pAd, wdev->func_idx, pkt_va, FALSE, - FALSE, &main_wcid)) - wcid = main_wcid; - } -#endif /* A4_CONN */ - -#ifdef CLIENT_WDS - if ((entry == NULL) -#ifdef AIR_MONITOR - || (entry && IS_ENTRY_MONITOR(entry)) -#endif - ) { - PUCHAR pEntryAddr = CliWds_ProxyLookup(pAd, pkt_va); - if (pEntryAddr != NULL) { - entry = MacTableLookup(pAd, pEntryAddr); - if (entry && (entry->Sst == SST_ASSOC)) { - wcid = (UCHAR)entry->wcid; - } - } - } -#endif /* CLIENT_WDS */ - } - - tr_entry = &pAd->MacTab.tr_entry[wcid]; - - if (!(VALID_TR_WCID(wcid) && IS_VALID_ENTRY(tr_entry))) - return FALSE; - - RTMP_SET_PACKET_WCID(pkt, wcid); -#ifdef CONFIG_HOTSPOT - - /* Drop broadcast/multicast packet if disable dgaf */ - if (IS_ENTRY_CLIENT(tr_entry)) { - BSS_STRUCT *pMbss = (BSS_STRUCT *)wdev->func_dev; - - if ((wcid == wdev->bss_info_argument.ucBcMcWlanIdx) && - (pMbss->HotSpotCtrl.HotSpotEnable || - pMbss->HotSpotCtrl.bASANEnable) && - pMbss->HotSpotCtrl.DGAFDisable) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Drop broadcast/multicast packet when dgaf disable\n")); - return FALSE; - } - } - -#endif - frag_nums = get_frag_num(pAd, wdev, pkt); - RTMP_SET_PACKET_FRAGMENTS(pkt, frag_nums); - -#ifdef MAP_TS_TRAFFIC_SUPPORT - if (pAd->bTSEnable) { - peer_entry = &pAd->MacTab.Content[tr_entry->wcid]; - if (!map_ts_tx_process(pAd, wdev, pkt, peer_entry)) - return FALSE; - } -#endif - - if (!RTMPCheckEtherType(pAd, pkt, tr_entry, wdev)) { - return FALSE; - } - - if (tr_entry->PortSecured == WPA_802_1X_PORT_NOT_SECURED) { - if (!((IS_AKM_WPA_CAPABILITY_Entry(wdev) || - (entry && entry->bWscCapable) -#ifdef DOT1X_SUPPORT - || (IS_IEEE8021X_Entry(wdev)) -#endif /* DOT1X_SUPPORT */ -#ifdef HOSTAPD_11R_SUPPORT - || (IS_AKM_PSK_Entry(wdev)) -#endif - ) && - ((RTMP_GET_PACKET_EAPOL(pkt) || - RTMP_GET_PACKET_WAI(pkt))))) - return FALSE; - } - -#ifdef CFG80211_SUPPORT - - /* CFG_TODO: POS NO GOOD */ - if (pAd->cfg80211_ctrl.isCfgInApMode == RT_CMD_80211_IFTYPE_AP) - RTMP_SET_PACKET_OPMODE(pkt, OPMODE_AP); - -#endif /* CFG80211_SUPPORT */ - return TRUE; -} - -UCHAR ap_mlme_search_wcid(RTMP_ADAPTER *pAd, UCHAR *addr1, UCHAR *addr2, - PNDIS_PACKET pkt) -{ - MAC_TABLE_ENTRY *mac_entry = MacTableLookup(pAd, addr1); - struct wifi_dev *wdev = wdev_search_by_address(pAd, addr2); - -#ifdef MAC_REPEATER_SUPPORT - REPEATER_CLIENT_ENTRY *rept_entry = NULL; -#endif - -#ifdef MAC_REPEATER_SUPPORT - if ((mac_entry != NULL) && - (IS_ENTRY_APCLI(mac_entry) || IS_ENTRY_REPEATER(mac_entry))) { - rept_entry = lookup_rept_entry(pAd, addr2); - - if (rept_entry) { /*repeater case*/ - if ((rept_entry->CliEnable == TRUE) && - (rept_entry->CliValid == TRUE)) - mac_entry = - &pAd->MacTab - .Content[rept_entry->MacTabWCID]; - } else { /*apcli case*/ - UCHAR apcli_wcid = 0; - - if (mac_entry->wdev && - (mac_entry->wdev->func_idx < pAd->ApCfg.ApCliNum)) - apcli_wcid = - pAd->ApCfg - .ApCliTab[mac_entry->wdev - ->func_idx] - .MacTabWCID; - else /* use default apcli0 */ - apcli_wcid = pAd->ApCfg.ApCliTab[0].MacTabWCID; - - mac_entry = &pAd->MacTab.Content[apcli_wcid]; - } - } - -#endif - - /* In DBDC mode, as mac_entry will be common, need to check whether STA is connected to */ - /* corrosponding wdev before sending frame using corrosponding wcid */ - - if (mac_entry && wdev && mac_entry->wdev && (mac_entry->wdev == wdev)) - return mac_entry->wcid; - else - return 0; -} - -INT ap_send_mlme_pkt(RTMP_ADAPTER *pAd, PNDIS_PACKET pkt, struct wifi_dev *wdev, - UCHAR q_idx, BOOLEAN is_data_queue) -{ - HEADER_802_11 *pHeader_802_11; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - PACKET_INFO PacketInfo; - UCHAR *pSrcBufVA; - UINT SrcBufLen; - INT ret; - struct qm_ops *ops = pAd->qm_ops; - - RTMP_SET_PACKET_WDEV(pkt, wdev->wdev_idx); - RTMP_SET_PACKET_MGMT_PKT(pkt, 1); - RTMP_QueryPacketInfo(pkt, &PacketInfo, &pSrcBufVA, &SrcBufLen); - - if (pSrcBufVA == NULL) { - RELEASE_NDIS_PACKET(pAd, pkt, NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - - pHeader_802_11 = (HEADER_802_11 *)(pSrcBufVA + tx_hw_hdr_len); - RTMP_SET_PACKET_WCID(pkt, - ap_mlme_search_wcid(pAd, pHeader_802_11->Addr1, - pHeader_802_11->Addr2, pkt)); - - if (in_altx_filter_list(pHeader_802_11->FC.SubType)) { - if (!(RTMP_GET_PACKET_TXTYPE(pkt) & TX_ATE_FRAME)) - RTMP_SET_PACKET_TYPE(pkt, TX_ALTX); - } - - if (!is_data_queue) { - } else { -#ifdef UAPSD_SUPPORT - { - UAPSD_MR_QOS_NULL_HANDLE(pAd, pHeader_802_11, pkt); - } - -#endif /* UAPSD_SUPPORT */ - RTMP_SET_PACKET_MGMT_PKT_DATA_QUE(pkt, 1); - } - - ret = ops->enq_mgmtq_pkt(pAd, wdev, pkt); - - return ret; -} - -static INT ap_ps_handle(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - STA_TR_ENTRY *tr_entry, PNDIS_PACKET pkt, UCHAR q_idx) -{ -#ifdef PS_QUEUE_INC_SUPPORT - UINT32 u4_pkt_cnt; -#endif - struct qm_ctl *qm_ctl = &pAd->qm_ctl; - struct qm_ops *qm_ops = pAd->qm_ops; - UINT16 occupy_cnt = (tr_entry->token_cnt + tr_entry->enqCount); -#ifdef PS_QUEUE_INC_SUPPORT - if (pAd->TotalStaCnt >= DEFAULT_MIN_STA_NUM_SMALL_PS_QUE_CTL) { - if (pAd->TotalStaCnt <= DEFAULT_MIN_720P_NUM_SMALL_PS_QUE_CTL) - u4_pkt_cnt = DEFAULT_MAX_720P_PS_QUE_PKT_NUM; - else - u4_pkt_cnt = SQ_ENQ_PSQ_MAX; - } else - u4_pkt_cnt = SQ_ENQ_PSQ_MAX; - - if (occupy_cnt >= u4_pkt_cnt) -#else - if (occupy_cnt >= SQ_ENQ_PS_MAX) -#endif - { - if ((tr_entry->ps_queue.Number < SQ_ENQ_PSQ_MAX) && - (qm_ctl->total_psq_cnt < SQ_ENQ_PSQ_TOTAL_MAX)) { - qm_ops->enq_psq_pkt(pAd, wdev, tr_entry, pkt); - qm_ctl->total_psq_cnt++; - } else { - RELEASE_NDIS_PACKET(pAd, pkt, NDIS_STATUS_SUCCESS); - } - } else { - if (tr_entry->ps_queue.Number != 0) { - NDIS_PACKET *ps_pkt = NULL; - UCHAR ps_pkt_q_idx; -#ifdef PS_QUEUE_INC_SUPPORT - UINT16 quota = (u4_pkt_cnt - occupy_cnt); - - if (quota > SQ_ENQ_PS_MAX) - quota = SQ_ENQ_PS_MAX; -#else - UINT16 quota = (SQ_ENQ_PS_MAX - occupy_cnt); -#endif - do { - ps_pkt = qm_ops->get_psq_pkt(pAd, tr_entry); - - if (ps_pkt) { - quota--; - qm_ctl->total_psq_cnt--; - ps_pkt_q_idx = - RTMP_GET_PACKET_QUEIDX(ps_pkt); - qm_ops->enq_dataq_pkt(pAd, wdev, ps_pkt, - ps_pkt_q_idx); - } - } while (ps_pkt && (quota > 0)); - - if (quota > 0) { - qm_ops->enq_dataq_pkt(pAd, wdev, pkt, q_idx); - } else { - qm_ops->enq_psq_pkt(pAd, wdev, tr_entry, pkt); - qm_ctl->total_psq_cnt++; - } - - } else { - qm_ops->enq_dataq_pkt(pAd, wdev, pkt, q_idx); - } - } - - return NDIS_STATUS_SUCCESS; -} - -INT ap_send_data_pkt(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, PNDIS_PACKET pkt) -{ - UCHAR wcid = RESERVED_WCID; -#ifdef IGMP_SNOOP_SUPPORT - INT InIgmpGroup = IGMP_NONE; - MULTICAST_FILTER_TABLE_ENTRY *pGroupEntry = NULL; -#endif /* IGMP_SNOOP_SUPPORT */ - STA_TR_ENTRY *tr_entry = NULL; - UCHAR user_prio = 0; - UCHAR q_idx; - struct qm_ops *qm_ops = pAd->qm_ops; - struct wifi_dev_ops *wdev_ops = wdev->wdev_ops; - PACKET_INFO pkt_info; - UCHAR *pkt_va; - UINT pkt_len; - MAC_TABLE_ENTRY *pEntry = NULL; - - RTMP_QueryPacketInfo(pkt, &pkt_info, &pkt_va, &pkt_len); - wcid = RTMP_GET_PACKET_WCID(pkt); - tr_entry = &pAd->MacTab.tr_entry[wcid]; - pEntry = &pAd->MacTab.Content[wcid]; - user_prio = RTMP_GET_PACKET_UP(pkt); - q_idx = RTMP_GET_PACKET_QUEIDX(pkt); - - if (tr_entry->EntryType != ENTRY_CAT_MCAST) - wdev_ops->detect_wmm_traffic(pAd, wdev, user_prio, - FLG_IS_OUTPUT); - else { -#ifdef IGMP_SNOOP_SUPPORT - if (wdev->IgmpSnoopEnable) { - if (IgmpPktInfoQuery(pAd, pkt_va, pkt, wdev, - &InIgmpGroup, &pGroupEntry) != - NDIS_STATUS_SUCCESS) - return NDIS_STATUS_FAILURE; - - /* if it's a mcast packet in igmp gourp. ucast clone it for all members in the gourp. */ - if ((InIgmpGroup == IGMP_IN_GROUP) && pGroupEntry && - (IgmpMemberCnt(&pGroupEntry->MemberList) > 0)) { -#ifdef A4_CONN - if (VALID_WCID(wcid) && pEntry && - IS_ENTRY_A4(pEntry)) { - /* do nothing send as it is*/ - } else -#endif - { - NDIS_STATUS PktCloneResult = - IgmpPktClone( - pAd, wdev, pkt, - InIgmpGroup, - pGroupEntry, q_idx, - user_prio, - GET_OS_PKT_NETDEV(pkt)); -#ifdef IGMP_TVM_SUPPORT - if (PktCloneResult != - NDIS_STATUS_MORE_PROCESSING_REQUIRED) -#endif /* IGMP_TVM_SUPPORT */ - { - RELEASE_NDIS_PACKET( - pAd, pkt, - NDIS_STATUS_SUCCESS); - return PktCloneResult; - } - } - } - - RTMP_SET_PACKET_TXTYPE(pkt, TX_MCAST_FRAME); - } else -#endif /* IGMP_SNOOP_SUPPORT */ - RTMP_SET_PACKET_TXTYPE(pkt, TX_MCAST_FRAME); - } - - RTMP_SET_PACKET_UP(pkt, user_prio); - - RTMP_SEM_LOCK(&tr_entry->ps_sync_lock); - - if (tr_entry->ps_state == PWR_ACTIVE) - qm_ops->enq_dataq_pkt(pAd, wdev, pkt, q_idx); - else - ap_ps_handle(pAd, wdev, tr_entry, pkt, q_idx); - - RTMP_SEM_UNLOCK(&tr_entry->ps_sync_lock); - - ba_ori_session_start(pAd, tr_entry, user_prio); - return NDIS_STATUS_SUCCESS; -} - -/* - -------------------------------------------------------- - FIND ENCRYPT KEY AND DECIDE CIPHER ALGORITHM - Find the WPA key, either Group or Pairwise Key - LEAP + TKIP also use WPA key. - -------------------------------------------------------- - Decide WEP bit and cipher suite to be used. - Same cipher suite should be used for whole fragment burst - In Cisco CCX 2.0 Leap Authentication - WepStatus is Ndis802_11WEPEnabled but the key will use PairwiseKey - Instead of the SharedKey, SharedKey Length may be Zero. -*/ -VOID ap_find_cipher_algorithm(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk) -{ - MAC_TABLE_ENTRY *pMacEntry = pTxBlk->pMacEntry; - - /* TODO:Eddy, Confirm MESH/Apcli.WAPI */ - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bClearEAPFrame)) { - SET_CIPHER_NONE(pTxBlk->CipherAlg); - pTxBlk->pKey = NULL; - } else if (pTxBlk->TxFrameType == TX_MCAST_FRAME) { - pTxBlk->CipherAlg = wdev->SecConfig.GroupCipher; - pTxBlk->KeyIdx = wdev->SecConfig.GroupKeyId; - - if (IS_CIPHER_WEP(wdev->SecConfig.GroupCipher)) - pTxBlk->pKey = - wdev->SecConfig.WepKey[pTxBlk->KeyIdx].Key; - else - pTxBlk->pKey = wdev->SecConfig.GTK; - } else if (pMacEntry) { - pTxBlk->CipherAlg = pMacEntry->SecConfig.PairwiseCipher; - pTxBlk->KeyIdx = pMacEntry->SecConfig.PairwiseKeyId; - - if (IS_CIPHER_WEP(pMacEntry->SecConfig.PairwiseCipher)) - pTxBlk->pKey = - pMacEntry->SecConfig.WepKey[pTxBlk->KeyIdx].Key; - else if (IS_AKM_SHA384(pMacEntry->SecConfig.AKMMap)) - pTxBlk->pKey = - &pMacEntry->SecConfig.PTK[LEN_PTK_KCK_SHA384 + - LEN_PTK_KEK_SHA384]; - else - pTxBlk->pKey = &pMacEntry->SecConfig - .PTK[LEN_PTK_KCK + LEN_PTK_KEK]; - } - - /* For BMcast pMacEntry is not initial */ - if (pTxBlk->CipherAlg == 0x0) - SET_CIPHER_NONE(pTxBlk->CipherAlg); -} - -static inline VOID ap_build_cache_802_11_header(IN RTMP_ADAPTER *pAd, - IN TX_BLK *pTxBlk, - IN UCHAR *pHeader) -{ - STA_TR_ENTRY *tr_entry; - HEADER_802_11 *pHeader80211; - MAC_TABLE_ENTRY *pMacEntry; - - pHeader80211 = (PHEADER_802_11)pHeader; - pMacEntry = pTxBlk->pMacEntry; - tr_entry = pTxBlk->tr_entry; - /* - Update the cached 802.11 HEADER - */ - /* normal wlan header size : 24 octets */ - pTxBlk->MpduHeaderLen = sizeof(HEADER_802_11); - pTxBlk->wifi_hdr_len = sizeof(HEADER_802_11); - /* More Bit */ - pHeader80211->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData); - /* Sequence */ - pHeader80211->Sequence = tr_entry->TxSeq[pTxBlk->UserPriority]; - tr_entry->TxSeq[pTxBlk->UserPriority] = - (tr_entry->TxSeq[pTxBlk->UserPriority] + 1) & MAXSEQ; - /* SA */ -#if defined(WDS_SUPPORT) || defined(CLIENT_WDS) - if (FALSE -#ifdef WDS_SUPPORT - || TX_BLK_TEST_FLAG(pTxBlk, fTX_bWDSEntry) -#endif /* WDS_SUPPORT */ -#ifdef CLIENT_WDS - || TX_BLK_TEST_FLAG(pTxBlk, fTX_bClientWDSFrame) -#endif /* CLIENT_WDS */ - ) { - /* The addr3 of WDS packet is Destination Mac address and Addr4 is the Source Mac address. */ - COPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader); - COPY_MAC_ADDR(pHeader80211->Octet, - pTxBlk->pSrcBufHeader + MAC_ADDR_LEN); - pTxBlk->MpduHeaderLen += MAC_ADDR_LEN; - pTxBlk->wifi_hdr_len += MAC_ADDR_LEN; - } else -#endif /* WDS_SUPPORT || CLIENT_WDS */ -#ifdef A4_CONN - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bA4Frame)) { - pHeader80211->FC.ToDs = 1; - pHeader80211->FC.FrDs = 1; - - if (pTxBlk->pMacEntry) { -#ifdef APCLI_SUPPORT - if (IS_ENTRY_APCLI(pTxBlk->pMacEntry)) { - COPY_MAC_ADDR( - pHeader80211->Addr1, - APCLI_ROOT_BSSID_GET( - pAd, - pTxBlk->Wcid)); /* to AP2 */ - COPY_MAC_ADDR( - pHeader80211->Addr2, - pTxBlk->pApCliEntry->wdev.if_addr); - } else -#endif /* APCLI_SUPPORT */ - if (IS_ENTRY_CLIENT(pTxBlk->pMacEntry)) { - COPY_MAC_ADDR( - pHeader80211->Addr1, - pTxBlk->pMacEntry - ->Addr); /* to AP2 */ - COPY_MAC_ADDR( - pHeader80211->Addr2, - pAd->CurrentAddress); /* from AP1 */ - } - COPY_MAC_ADDR(pHeader80211->Addr3, - pTxBlk->pSrcBufHeader); /* DA */ - COPY_MAC_ADDR(pHeader80211->Octet, - pTxBlk->pSrcBufHeader + - MAC_ADDR_LEN); /* ADDR4 = SA */ - pTxBlk->MpduHeaderLen += MAC_ADDR_LEN; - pTxBlk->wifi_hdr_len += MAC_ADDR_LEN; - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s pTxBlk->pMacEntry == NULL!\n", - __FUNCTION__)); - } else -#endif /* A4_CONN */ -#ifdef APCLI_SUPPORT - if (IS_ENTRY_APCLI(pMacEntry) || IS_ENTRY_REPEATER(pMacEntry)) { - /* The addr3 of Ap-client packet is Destination Mac address. */ - COPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader); - } else -#endif /* APCLI_SUPPORT */ - { /* The addr3 of normal packet send from DS is Src Mac address. */ - COPY_MAC_ADDR(pHeader80211->Addr3, - pTxBlk->pSrcBufHeader + MAC_ADDR_LEN); - } -} - -static inline VOID ap_build_802_11_header(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk) -{ - HEADER_802_11 *wifi_hdr; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - struct wifi_dev *wdev = pTxBlk->wdev; - STA_TR_ENTRY *tr_entry = pTxBlk->tr_entry; - /* - MAKE A COMMON 802.11 HEADER - */ - /* normal wlan header size : 24 octets */ - pTxBlk->MpduHeaderLen = sizeof(HEADER_802_11); - pTxBlk->wifi_hdr_len = sizeof(HEADER_802_11); - /* TODO: shiang-7603 */ - pTxBlk->wifi_hdr = &pTxBlk->HeaderBuf[tx_hw_hdr_len]; - wifi_hdr = (HEADER_802_11 *)pTxBlk->wifi_hdr; - NdisZeroMemory(wifi_hdr, sizeof(HEADER_802_11)); - wifi_hdr->FC.FrDs = 1; - wifi_hdr->FC.Type = FC_TYPE_DATA; - wifi_hdr->FC.SubType = - ((TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) ? SUBTYPE_QDATA : - SUBTYPE_DATA); - - /* TODO: shiang-usw, for BCAST/MCAST, original it's sequence assigned by "pAd->Sequence", how about now? */ - if (tr_entry) { - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) { - wifi_hdr->Sequence = - tr_entry->TxSeq[pTxBlk->UserPriority]; - tr_entry->TxSeq[pTxBlk->UserPriority] = - (tr_entry->TxSeq[pTxBlk->UserPriority] + 1) & - MAXSEQ; - } else { - wifi_hdr->Sequence = tr_entry->NonQosDataSeq; - tr_entry->NonQosDataSeq = - (tr_entry->NonQosDataSeq + 1) & MAXSEQ; - } - } else { - wifi_hdr->Sequence = pAd->Sequence; - pAd->Sequence = - (pAd->Sequence + 1) & MAXSEQ; /* next sequence */ - } - - wifi_hdr->Frag = 0; - wifi_hdr->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData); - -#ifdef A4_CONN - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bA4Frame)) { - wifi_hdr->FC.ToDs = 1; - wifi_hdr->FC.FrDs = 1; - if (pTxBlk->pMacEntry) { -#ifdef APCLI_SUPPORT - if (IS_ENTRY_APCLI(pTxBlk->pMacEntry)) { - COPY_MAC_ADDR( - wifi_hdr->Addr1, - APCLI_ROOT_BSSID_GET( - pAd, - pTxBlk->Wcid)); /* to AP2 */ - COPY_MAC_ADDR( - wifi_hdr->Addr2, - pTxBlk->pApCliEntry->wdev.if_addr); - } else -#endif /* APCLI_SUPPORT */ - if (IS_ENTRY_CLIENT(pTxBlk->pMacEntry)) { - COPY_MAC_ADDR( - wifi_hdr->Addr1, - pTxBlk->pMacEntry - ->Addr); /* to AP2 */ - COPY_MAC_ADDR( - wifi_hdr->Addr2, - pAd->CurrentAddress); /* from AP1 */ - } - COPY_MAC_ADDR(wifi_hdr->Addr3, - pTxBlk->pSrcBufHeader); /* DA */ - COPY_MAC_ADDR(wifi_hdr->Octet, - pTxBlk->pSrcBufHeader + - MAC_ADDR_LEN); /* ADDR4 = SA */ - pTxBlk->MpduHeaderLen += MAC_ADDR_LEN; - pTxBlk->wifi_hdr_len += MAC_ADDR_LEN; - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s pTxBlk->pMacEntry == NULL!\n", - __FUNCTION__)); - } else -#endif /* A4_CONN*/ - -#ifdef APCLI_SUPPORT - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bApCliPacket)) { - wifi_hdr->FC.ToDs = 1; - wifi_hdr->FC.FrDs = 0; - COPY_MAC_ADDR(wifi_hdr->Addr1, - APCLI_ROOT_BSSID_GET(pAd, - pTxBlk->Wcid)); /* to AP2 */ -#ifdef MAC_REPEATER_SUPPORT - - if (pTxBlk->pMacEntry && (pTxBlk->pMacEntry->bReptCli == TRUE)) - COPY_MAC_ADDR(wifi_hdr->Addr2, - pTxBlk->pMacEntry->ReptCliAddr); - else -#endif /* MAC_REPEATER_SUPPORT */ - COPY_MAC_ADDR(wifi_hdr->Addr2, - pTxBlk->pApCliEntry->wdev - .if_addr); /* from AP1 */ - - COPY_MAC_ADDR(wifi_hdr->Addr3, pTxBlk->pSrcBufHeader); /* DA */ - } else -#endif /* APCLI_SUPPORT */ -#if defined(WDS_SUPPORT) || defined(CLIENT_WDS) - if (FALSE -#ifdef WDS_SUPPORT - || TX_BLK_TEST_FLAG(pTxBlk, fTX_bWDSEntry) -#endif /* WDS_SUPPORT */ -#ifdef CLIENT_WDS - || TX_BLK_TEST_FLAG(pTxBlk, fTX_bClientWDSFrame) -#endif /* CLIENT_WDS */ - ) { - wifi_hdr->FC.ToDs = 1; - - if (pTxBlk->pMacEntry == NULL) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s pTxBlk->pMacEntry == NULL!\n", __func__)); - else - COPY_MAC_ADDR(wifi_hdr->Addr1, - pTxBlk->pMacEntry->Addr); /* to AP2 */ - - COPY_MAC_ADDR(wifi_hdr->Addr2, - pAd->CurrentAddress); /* from AP1 */ - COPY_MAC_ADDR(wifi_hdr->Addr3, pTxBlk->pSrcBufHeader); /* DA */ - COPY_MAC_ADDR(&wifi_hdr->Octet[0], - pTxBlk->pSrcBufHeader + - MAC_ADDR_LEN); /* ADDR4 = SA */ - pTxBlk->MpduHeaderLen += MAC_ADDR_LEN; - pTxBlk->wifi_hdr_len += MAC_ADDR_LEN; - } else -#endif /* WDS_SUPPORT || CLIENT_WDS */ - { - /* TODO: how about "MoreData" bit? AP need to set this bit especially for PS-POLL response */ -#if defined(IGMP_SNOOP_SUPPORT) || defined(DOT11V_WNM_SUPPORT) - if (pTxBlk->tr_entry->EntryType != ENTRY_CAT_MCAST) { - COPY_MAC_ADDR(wifi_hdr->Addr1, - pTxBlk->pMacEntry->Addr); /* DA */ - } else -#endif /* defined(IGMP_SNOOP_SUPPORT) || defined(DOT11V_WNM_SUPPORT) */ - { - COPY_MAC_ADDR(wifi_hdr->Addr1, pTxBlk->pSrcBufHeader); - } - - COPY_MAC_ADDR(wifi_hdr->Addr2, pAd->ApCfg.MBSSID[wdev->func_idx] - .wdev.bssid); /* BSSID */ - COPY_MAC_ADDR(wifi_hdr->Addr3, - pTxBlk->pSrcBufHeader + MAC_ADDR_LEN); /* SA */ - } - - if (!IS_CIPHER_NONE(pTxBlk->CipherAlg)) - wifi_hdr->FC.Wep = 1; - - pTxBlk->dot11_type = wifi_hdr->FC.Type; - pTxBlk->dot11_subtype = wifi_hdr->FC.SubType; -} - -BOOLEAN ap_fill_non_offload_tx_blk(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk) -{ - PACKET_INFO PacketInfo; - PNDIS_PACKET pPacket; - MAC_TABLE_ENTRY *pMacEntry = NULL; - struct wifi_dev_ops *ops = wdev->wdev_ops; - - pPacket = pTxBlk->pPacket; - RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, - &pTxBlk->SrcBufLen); - pTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket); - pTxBlk->wmm_set = HcGetWmmIdx(pAd, wdev); - pTxBlk->UserPriority = RTMP_GET_PACKET_UP(pPacket); - pTxBlk->FrameGap = IFS_HTTXOP; - pTxBlk->pMbss = NULL; - pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader; - - if (IS_ASIC_CAP(pAd, fASIC_CAP_TX_HDR_TRANS)) { - if ((pTxBlk->TxFrameType == TX_LEGACY_FRAME) || - (pTxBlk->TxFrameType == TX_AMSDU_FRAME) || - (pTxBlk->TxFrameType == TX_MCAST_FRAME)) - TX_BLK_SET_FLAG(pTxBlk, fTX_HDR_TRANS); - } - - if (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pTxBlk->pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame); - else - TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bClearEAPFrame); - - if (pTxBlk->tr_entry->EntryType == ENTRY_CAT_MCAST) { - pTxBlk->pMacEntry = NULL; - TX_BLK_SET_FLAG(pTxBlk, fTX_ForceRate); - { -#ifdef MCAST_RATE_SPECIFIC - PUCHAR pDA = GET_OS_PKT_DATAPTR(pPacket); - - if (((*pDA & 0x01) == 0x01) && (*pDA != 0xff)) { - pTxBlk->pTransmit = - (pTxBlk->wdev->channel > 14) ? - (&wdev->rate.MCastPhyMode_5G) : - (&wdev->rate.MCastPhyMode); - } else -#endif /* MCAST_RATE_SPECIFIC */ - { - pTxBlk->pTransmit = - &pAd->MacTab - .Content[MCAST_WCID_TO_REMOVE] - .HTPhyMode; - - if (pTxBlk->wdev->channel > 14) { - pTxBlk->pTransmit->field.MODE = - MODE_OFDM; - pTxBlk->pTransmit->field.MCS = - MCS_RATE_6; - } - } -#ifdef MIN_PHY_RATE_SUPPORT - { - PUCHAR pDestAddr = GET_OS_PKT_DATAPTR(pPacket); - if (((*pDestAddr & 0x01) == 0x01) || - (*pDestAddr == 0xff)) { - if (wdev->rate.MinPhyBcMcRate != 0) - pTxBlk->pTransmit = &( - wdev->rate - .MinPhyBcMcRateTransmit); - } - } -#endif /* MIN_PHY_RATE_SUPPORT */ - } - /* AckRequired = FALSE, when broadcast packet in Adhoc mode.*/ - TX_BLK_CLEAR_FLAG(pTxBlk, (fTX_bAckRequired | fTX_bAllowFrag | - fTX_bWMM)); - - if (RTMP_GET_PACKET_MOREDATA(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData); - } else { - pTxBlk->pMacEntry = &pAd->MacTab.Content[pTxBlk->Wcid]; - pTxBlk->pTransmit = &pTxBlk->pMacEntry->HTPhyMode; - pMacEntry = pTxBlk->pMacEntry; - - if (!pMacEntry) - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Err!! pMacEntry is NULL!!\n", - __func__)); - else - pTxBlk->pMbss = pMacEntry->pMbss; - -#ifdef MULTI_WMM_SUPPORT - - if (IS_ENTRY_APCLI(pMacEntry)) - pTxBlk->QueIdx = EDCA_WMM1_AC0_PIPE; - -#endif /* MULTI_WMM_SUPPORT */ - /* For all unicast packets, need Ack unless the Ack Policy is not set as NORMAL_ACK.*/ -#ifdef MULTI_WMM_SUPPORT - - if (pTxBlk->QueIdx >= EDCA_WMM1_AC0_PIPE) { - if (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx - - EDCA_WMM1_AC0_PIPE] != - NORMAL_ACK) - TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); - else - TX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired); - } else -#endif /* MULTI_WMM_SUPPORT */ - { - if (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx] != - NORMAL_ACK) - TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); - else - TX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired); - } - - { -#if defined(P2P_SUPPORT) || defined(RT_CFG80211_P2P_SUPPORT) || \ - defined(CFG80211_MULTI_STA) - - if (pTxBlk->OpMode == OPMODE_AP) -#else - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) -#endif /* P2P_SUPPORT || RT_CFG80211_P2P_SUPPORT*/ - { -#ifdef WDS_SUPPORT - - if (IS_ENTRY_WDS(pMacEntry)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bWDSEntry); - else -#endif /* WDS_SUPPORT */ -#ifdef CLIENT_WDS - if (IS_ENTRY_CLIWDS(pMacEntry)) { - PUCHAR pDA = - GET_OS_PKT_DATAPTR(pPacket); - PUCHAR pSA = - GET_OS_PKT_DATAPTR(pPacket) + - MAC_ADDR_LEN; - UCHAR idx = pMacEntry->func_tb_idx; - - if (((idx < MAX_MBSSID_NUM(pAd)) && - !MAC_ADDR_EQUAL( - pSA, pMacEntry->bssid)) || - !MAC_ADDR_EQUAL(pDA, - pMacEntry->Addr)) - TX_BLK_SET_FLAG( - pTxBlk, - fTX_bClientWDSFrame); - } else -#endif /* CLIENT_WDS */ - if (pMacEntry && - IS_ENTRY_CLIENT(pMacEntry)) { -#ifdef A4_CONN - if (IS_ENTRY_A4(pMacEntry) && - !RTMP_GET_PACKET_EAPOL( - pTxBlk->pPacket)) - TX_BLK_SET_FLAG( - pTxBlk, - fTX_bA4Frame); -#endif /* A4_CONN */ - } else - return FALSE; - - /* If both of peer and us support WMM, enable it.*/ - if (OPSTATUS_TEST_FLAG(pAd, - fOP_STATUS_WMM_INUSED) && - CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_WMM_CAPABLE)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM); - } - } - - if (pTxBlk->TxFrameType == TX_LEGACY_FRAME) { - if (((RTMP_GET_PACKET_LOWRATE(pPacket)) -#ifdef UAPSD_SUPPORT - && (!(pMacEntry && (pMacEntry->bAPSDFlagSPStart))) -#endif /* UAPSD_SUPPORT */ - ) || - ((pAd->OpMode == OPMODE_AP) && - (pMacEntry->MaxHTPhyMode.field.MODE == MODE_CCK) && - (pMacEntry->MaxHTPhyMode.field.MCS == RATE_1))) { - /* Specific packet, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame, need force low rate. */ - pTxBlk->pTransmit = - &pAd->MacTab - .Content[MCAST_WCID_TO_REMOVE] - .HTPhyMode; - TX_BLK_SET_FLAG(pTxBlk, fTX_ForceRate); - - /* Modify the WMM bit for ICV issue. If we have a packet with EOSP field need to set as 1, how to handle it? */ - if (!pTxBlk->pMacEntry) - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s():Err!! pTxBlk->pMacEntry is NULL!!\n", - __func__)); - else if (IS_HT_STA(pTxBlk->pMacEntry) && - (CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_RALINK_CHIPSET)) && - ((pAd->CommonCfg.bRdg == TRUE) && - CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_RDG_CAPABLE))) - TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM); - } - - if ((IS_HT_RATE(pMacEntry) == FALSE) && - (CLIENT_STATUS_TEST_FLAG( - pMacEntry, - fCLIENT_STATUS_PIGGYBACK_CAPABLE))) { - /* Currently piggy-back only support when peer is operate in b/g mode.*/ - TX_BLK_SET_FLAG(pTxBlk, fTX_bPiggyBack); - } - - if (RTMP_GET_PACKET_MOREDATA(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData); - -#ifdef UAPSD_SUPPORT - - if (RTMP_GET_PACKET_EOSP(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP); - -#endif /* UAPSD_SUPPORT */ - } else if (pTxBlk->TxFrameType == TX_FRAG_FRAME) - TX_BLK_SET_FLAG(pTxBlk, fTX_bAllowFrag); - - pMacEntry->DebugTxCount++; - -#ifdef IGMP_SNOOP_SUPPORT - if (RTMP_GET_PACKET_MCAST_CLONE(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_MCAST_CLONE); -#endif - } - - pAd->LastTxRate = (USHORT)pTxBlk->pTransmit->word; - ops->find_cipher_algorithm(pAd, wdev, pTxBlk); - return TRUE; -} - -BOOLEAN ap_fill_offload_tx_blk(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk) -{ - PACKET_INFO PacketInfo; - PNDIS_PACKET pPacket; - - pPacket = pTxBlk->pPacket; - pTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket); - RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, - &pTxBlk->SrcBufLen); - - if (RTMP_GET_PACKET_MGMT_PKT(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_CT_WithTxD); - - if (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pPacket)) - TX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame); - - if (IS_ASIC_CAP(pAd, fASIC_CAP_TX_HDR_TRANS)) { - if ((pTxBlk->TxFrameType == TX_LEGACY_FRAME) || - (pTxBlk->TxFrameType == TX_AMSDU_FRAME) || - (pTxBlk->TxFrameType == TX_MCAST_FRAME)) - TX_BLK_SET_FLAG(pTxBlk, fTX_HDR_TRANS); - } - - pTxBlk->wmm_set = HcGetWmmIdx(pAd, wdev); - pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader; - /*get MBSS for tx counter usage*/ - if (pTxBlk->TxFrameType != TX_MCAST_FRAME) - pTxBlk->pMbss = pTxBlk->pMacEntry->pMbss; - return TRUE; -} - -INT ap_mlme_mgmtq_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *tx_blk) -{ - PQUEUE_ENTRY q_entry; - UCHAR *tmac_info; - HTTRANSMIT_SETTING *transmit; - UCHAR MlmeRate; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - PHEADER_802_11 pHeader_802_11; - MAC_TABLE_ENTRY *pMacEntry = tx_blk->pMacEntry; - RTMP_ARCH_OP *op = &pAd->archOps; - struct dev_rate_info *rate; - BOOLEAN bAckRequired, bInsertTimestamp; - UCHAR PID, wcid = tx_blk->Wcid, tx_rate; - UCHAR prot = 0; - UCHAR apidx = 0; - MAC_TX_INFO mac_info; - struct DOT11_H *pDot11h = NULL; -#ifdef CONFIG_RCSA_SUPPORT - UINT8 BandIdx; -#ifdef MT_DFS_SUPPORT - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; -#endif -#endif -#ifdef DPP_SUPPORT - UINT16 orig_sn; -#endif /* DPP_SUPPORT */ - if (wdev == NULL) - return NDIS_STATUS_FAILURE; - - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) - return NDIS_STATUS_FAILURE; - - q_entry = RemoveHeadQueue(&tx_blk->TxPacketList); - tx_blk->pPacket = QUEUE_ENTRY_TO_PACKET(q_entry); - ap_fill_offload_tx_blk(pAd, wdev, tx_blk); - tmac_info = tx_blk->pSrcBufHeader; - pHeader_802_11 = - (HEADER_802_11 *)(tx_blk->pSrcBufHeader + tx_hw_hdr_len); - - if (pHeader_802_11->Addr1[0] & 0x01) - MlmeRate = pAd->CommonCfg.BasicMlmeRate; - else - MlmeRate = pAd->CommonCfg.MlmeRate; - - /* Verify Mlme rate for a / g bands.*/ - if ((wdev->channel > 14) && (MlmeRate < RATE_6)) /* 11A band*/ - MlmeRate = RATE_6; - - rate = &wdev->rate; - pHeader_802_11->FC.MoreData = RTMP_GET_PACKET_MOREDATA(tx_blk->pPacket); - bInsertTimestamp = FALSE; - - if (pHeader_802_11->FC.Type == FC_TYPE_CNTL) { /* must be PS-POLL*/ - bAckRequired = FALSE; -#ifdef VHT_TXBF_SUPPORT - - if (pHeader_802_11->FC.SubType == SUBTYPE_VHT_NDPA) { - pHeader_802_11->Duration = 100; - } - -#endif /* VHT_TXBF_SUPPORT */ - } else { /* FC_TYPE_MGMT or FC_TYPE_DATA(must be NULL frame)*/ - if (pHeader_802_11->Addr1[0] & 0x01) { /* MULTICAST, BROADCAST*/ - bAckRequired = FALSE; - pHeader_802_11->Duration = 0; - } else { -#ifdef SOFT_SOUNDING - - if (((pHeader_802_11->FC.Type == FC_TYPE_DATA) && - (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL)) && - pMacEntry && (pMacEntry->snd_reqired == TRUE)) { - bAckRequired = FALSE; - pHeader_802_11->Duration = 0; - } else -#endif /* SOFT_SOUNDING */ - { - bAckRequired = TRUE; - pHeader_802_11->Duration = - RTMPCalcDuration(pAd, MlmeRate, 14); - - if ((pHeader_802_11->FC.SubType == - SUBTYPE_PROBE_RSP) && - (pHeader_802_11->FC.Type == FC_TYPE_MGMT)) { - bInsertTimestamp = TRUE; - bAckRequired = - FALSE; /* Disable ACK to prevent retry 0x1f for Probe Response*/ -#ifdef SPECIFIC_TX_POWER_SUPPORT - /* Find which MBSSID to be send this probeRsp */ - UINT32 apidx = get_apidx_by_addr( - pAd, pHeader_802_11->Addr2); - - if (!(apidx >= pAd->ApCfg.BssidNum) && - (pAd->ApCfg.MBSSID[apidx].TxPwrAdj != - -1) && - (rate->MlmeTransmit.field.MODE == - MODE_CCK) && - (rate->MlmeTransmit.field.MCS == - RATE_1)) - TxPwrAdj = - pAd->ApCfg.MBSSID[apidx] - .TxPwrAdj; - -#endif /* SPECIFIC_TX_POWER_SUPPORT */ - } else if ((pHeader_802_11->FC.SubType == - SUBTYPE_PROBE_REQ) && - (pHeader_802_11->FC.Type == - FC_TYPE_MGMT)) { - bAckRequired = - FALSE; /* Disable ACK to prevent retry 0x1f for Probe Request*/ - } else if ((pHeader_802_11->FC.SubType == - SUBTYPE_DEAUTH) && - (pMacEntry == NULL)) { - bAckRequired = - FALSE; /* Disable ACK to prevent retry 0x1f for Deauth */ - } - } - } - } -#ifdef DPP_SUPPORT - orig_sn = pHeader_802_11->Sequence; -#endif /* DPP_SUPPORT */ - pHeader_802_11->Sequence = pAd->Sequence++; - - if (pAd->Sequence > 0xfff) - pAd->Sequence = 0; - - /* - Before radar detection done, mgmt frame can not be sent but probe req - Because we need to use probe req to trigger driver to send probe req in passive scan - */ - if ((pHeader_802_11->FC.SubType != SUBTYPE_PROBE_REQ) -#ifdef CONFIG_RCSA_SUPPORT - && (pHeader_802_11->FC.SubType != SUBTYPE_ACTION) -#endif - && (pAd->CommonCfg.bIEEE80211H == 1) && - (pDot11h->RDMode != RD_NORMAL_MODE)) { - RELEASE_NDIS_PACKET(pAd, tx_blk->pPacket, NDIS_STATUS_FAILURE); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] drop sub_type:%d\n", __func__, - pHeader_802_11->FC.SubType)); - return NDIS_STATUS_FAILURE; - } - - /* - fill scatter-and-gather buffer list into TXD. Internally created NDIS PACKET - should always has only one physical buffer, and the whole frame size equals - to the first scatter buffer size - - Initialize TX Descriptor - For inter-frame gap, the number is for this frame and next frame - For MLME rate, we will fix as 2Mb to match other vendor's implement - - management frame doesn't need encryption. - so use RESERVED_WCID no matter u are sending to specific wcid or not - */ - PID = PID_MGMT; -#ifdef DOT11W_PMF_SUPPORT - PMF_PerformTxFrameAction(pAd, pHeader_802_11, tx_blk->SrcBufLen, - tx_hw_hdr_len, &prot); -#endif - - if (pMacEntry) { - wcid = pMacEntry->wcid; - } else { - wcid = 0; - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("pMacEntry is null !!\n")); - } - - tx_rate = (UCHAR)rate->MlmeTransmit.field.MCS; - transmit = &rate->MlmeTransmit; - - NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info)); - - if (prot) - mac_info.prot = prot; - - if (prot == 2 || prot == 3) - mac_info.bss_idx = apidx; - - mac_info.FRAG = FALSE; - mac_info.CFACK = FALSE; - mac_info.InsTimestamp = bInsertTimestamp; - mac_info.AMPDU = FALSE; - mac_info.Ack = bAckRequired; - mac_info.BM = IS_BM_MAC_ADDR(pHeader_802_11->Addr1); - mac_info.NSeq = FALSE; - mac_info.BASize = 0; - mac_info.WCID = wcid; - mac_info.Type = pHeader_802_11->FC.Type; - mac_info.SubType = pHeader_802_11->FC.SubType; - mac_info.PsmBySw = 1; - if (pAd->CommonCfg.bSeOff != TRUE) { - if (HcGetBandByWdev(wdev) == BAND0) - mac_info.AntPri = BAND0_SPE_IDX; - else if (HcGetBandByWdev(wdev) == BAND1) { - mac_info.AntPri = BAND1_SPE_IDX; - } - } - /* check if the pkt is Tmr frame. */ -#ifdef FTM_SUPPORT - - if (IsPublicActionFrame(pAd, pHeader_802_11)) { - PFTM_PEER_ENTRY pFtmEntry = - FtmEntrySearch(pAd, pHeader_802_11->Addr1); - - if (pFtmEntry && pFtmEntry->bNeedTmr) { - mac_info.IsTmr = TRUE; - PID = FtmGetNewPid(pAd); - FtmAddPidPendingNode(pAd, pFtmEntry, PID); - mac_info.ftm_bw = - pFtmEntry->VerdictParm.ftm_format_and_bw; - pFtmEntry->bTxOK = 0; /* init value */ - pFtmEntry->bTxSCallbackCheck = 1; - RTMPSetTimer(&pFtmEntry->FtmTxTimer, 30); - pFtmEntry->bNeedTmr = FALSE; - } - } - -#endif /* FTM_SUPPORT */ - mac_info.Length = (tx_blk->SrcBufLen - tx_hw_hdr_len); - - if (pHeader_802_11->FC.Type == FC_TYPE_MGMT) { - mac_info.hdr_len = 24; - - if (pHeader_802_11->FC.Order == 1) - mac_info.hdr_len += 4; - -#ifdef MIN_PHY_RATE_SUPPORT - if ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) || - (pHeader_802_11->FC.SubType == SUBTYPE_BEACON)) { - if (rate->MinPhyBeaconRate != 0) { - tx_rate = (UCHAR)rate->MinPhyBeaconRateTransmit - .field.MCS; - transmit = &rate->MinPhyBeaconRateTransmit; - } - } -#endif /* MIN_PHY_RATE_SUPPORT */ -#ifdef DPP_SUPPORT - /* Check whether it is a DPP frame */ - if (!mac_info.BM && - (pHeader_802_11->FC.SubType == SUBTYPE_ACTION) && - ((tx_blk->SrcBufLen - tx_hw_hdr_len) > - sizeof(HEADER_802_11))) { - GAS_FRAME *GASFrame = - (GAS_FRAME *)(tx_blk->pSrcBufHeader + - tx_hw_hdr_len); - UCHAR *pkt_buf = - (tx_blk->pSrcBufHeader + tx_hw_hdr_len + - sizeof(HEADER_802_11)); - /* Public action frame with WFA DPP */ - if ((pkt_buf[0] == CATEGORY_PUBLIC) && - (pkt_buf[1] == - ACTION_WIFI_DIRECT) && /*vendor specific*/ - (memcmp(&pkt_buf[2], DPP_OUI, OUI_LEN) == 0) && - (pkt_buf[2 + OUI_LEN] == WFA_DPP_SUBTYPE) && - (!MAC_ADDR_IS_GROUP(pHeader_802_11->Addr1))) { - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, sending out a dpp frame on interface:%s da:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, wdev->if_dev->name, - PRINT_MAC(pHeader_802_11->Addr1))); - PID = PID_MGMT_DPP_FRAME; - mac_info.seq_no = orig_sn; - } - /* Gas DPP frame */ - if ((GASFrame->u.GAS_INIT_RSP - .Variable[GAS_WFA_DPP_Length_Index] > - GAS_WFA_DPP_Min_Length) && - NdisEqualMemory(&GASFrame->u.GAS_INIT_RSP - .Variable[GAS_OUI_Index], - DPP_OUI, OUI_LEN) && - GASFrame->u.GAS_INIT_RSP - .Variable[GAS_WFA_DPP_Subtype_Index] == - WFA_DPP_SUBTYPE) { - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, sending out a dpp frame on interface %s\n", - __func__, wdev->if_dev->name)); - PID = PID_MGMT_DPP_FRAME; - mac_info.seq_no = orig_sn; - transmit = &rate->MlmeTransmit; - transmit->field.MODE = MODE_OFDM; - transmit->field.BW = BW_20; - transmit->field.MCS = MCS_RATE_6; - tx_rate = transmit->field.MCS; - } - } -#endif /* DPP_SUPPORT */ - } else if (pHeader_802_11->FC.Type == FC_TYPE_DATA) { - switch (pHeader_802_11->FC.SubType) { - case SUBTYPE_DATA_NULL: - mac_info.hdr_len = 24; - tx_rate = (UCHAR)rate->MlmeTransmit.field.MCS; - transmit = &rate->MlmeTransmit; - break; - - case SUBTYPE_QOS_NULL: - mac_info.hdr_len = 26; - tx_rate = (UCHAR)rate->MlmeTransmit.field.MCS; - transmit = &rate->MlmeTransmit; - break; - - default: - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): FIXME!!!Unexpected frame(Type=%d, SubType=%d) send to MgmtRing, need to assign the length!\n", - __func__, pHeader_802_11->FC.Type, - pHeader_802_11->FC.SubType)); - hex_dump("DataFrame", (char *)pHeader_802_11, 24); - break; - } - - if (pMacEntry && pAd->MacTab.tr_entry[wcid].PsDeQWaitCnt) - PID = PID_PS_DATA; - - mac_info.WCID = wcid; - } else if (pHeader_802_11->FC.Type == FC_TYPE_CNTL) { - switch (pHeader_802_11->FC.SubType) { - case SUBTYPE_PS_POLL: - mac_info.hdr_len = sizeof(PSPOLL_FRAME); - tx_rate = (UCHAR)rate->MlmeTransmit.field.MCS; - transmit = &rate->MlmeTransmit; - break; - - default: - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): FIXME!!!Unexpected frame(Type=%d, SubType=%d) send to MgmtRing, need to assign the length!\n", - __func__, pHeader_802_11->FC.Type, - pHeader_802_11->FC.SubType)); - break; - } - } else { - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): FIXME!!!Unexpected frame send to MgmtRing, need to assign the length!\n", - __func__)); - } - - mac_info.PID = PID; - mac_info.TID = 0; - mac_info.TxRate = tx_rate; - mac_info.SpeEn = 1; - mac_info.Preamble = LONG_PREAMBLE; - mac_info.IsAutoRate = FALSE; - mac_info.wmm_set = HcGetWmmIdx(pAd, wdev); - mac_info.q_idx = HcGetMgmtQueueIdx( - pAd, wdev, RTMP_GET_PACKET_TYPE(tx_blk->pPacket)); - - if (pMacEntry && IS_ENTRY_REPEATER(pMacEntry)) - mac_info.OmacIdx = - pAd->MacTab.tr_entry[pMacEntry->wcid].OmacIdx; - else - mac_info.OmacIdx = wdev->OmacIdx; - - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): %d, WMMSET=%d,QId=%d\n", __func__, __LINE__, - mac_info.wmm_set, mac_info.q_idx)); -#ifdef CONFIG_MULTI_CHANNEL - - if (pAd->Mlme.bStartMcc == TRUE) { - if ((NdisEqualMemory(pAd->cfg80211_ctrl.P2PCurrentAddress, - pHeader_802_11->Addr2, MAC_ADDR_LEN)) || - (pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP)) - mac_info.q_idx = Q_IDX_AC10; - else - mac_info.q_idx = Q_IDX_AC0; - } - -#endif /* CONFIG_MULTI_CHANNEL */ -#ifdef APCLI_SUPPORT - - if ((pHeader_802_11->FC.Type == FC_TYPE_DATA) && - ((pHeader_802_11->FC.SubType == SUBTYPE_DATA_NULL) || - (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL))) { - if ((pMacEntry != NULL) && (IS_ENTRY_APCLI(pMacEntry) -#ifdef MAC_REPEATER_SUPPORT - || IS_ENTRY_REPEATER(pMacEntry) -#endif /* MAC_REPEATER_SUPPORT */ - )) { - /* CURRENT_BW_TX_CNT/CURRENT_BW_FAIL_CNT only count for aute rate */ - if (IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd) || - IS_MT7663(pAd)) - mac_info.IsAutoRate = TRUE; - } - } - -#ifdef CONFIG_RCSA_SUPPORT - BandIdx = HcGetBandByWdev(wdev); - if ((pDot11h->RDMode == RD_SWITCHING_MODE) && - (pDfsParam->bRCSAEn == TRUE) && - (pHeader_802_11->FC.Type == FC_TYPE_MGMT) && - (pHeader_802_11->FC.SubType == SUBTYPE_ACTION)) { - mac_info.q_idx = TxQ_IDX_ALTX0; - if (BandIdx == BAND1) - mac_info.q_idx = TxQ_IDX_ALTX1; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Set q_idx to %d\n", __func__, mac_info.q_idx)); - - mac_info.Type = FC_TYPE_MGMT; - mac_info.SubType = SUBTYPE_ACTION; - } -#endif - -#endif /* APCLI_SUPPORT */ -#ifdef SOFT_SOUNDING - - if (((pHeader_802_11->FC.Type == FC_TYPE_DATA) && - (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL)) && - pMacEntry && (pMacEntry->snd_reqired == TRUE)) { - wcid = RESERVED_WCID; - tx_rate = (UCHAR)pMacEntry->snd_rate.field.MCS; - transmit = &pMacEntry->snd_rate; - mac_info.Txopmode = IFS_PIFS; - pMacEntry->snd_reqired = FALSE; - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():Kick Sounding to %02x:%02x:%02x:%02x:%02x:%02x, dataRate(PhyMode:%s, BW:%sHz, %dSS, MCS%d)\n", - __func__, PRINT_MAC(pMacEntry->Addr), - get_phymode_str(transmit->field.MODE), - get_bw_str(transmit->field.BW), - (transmit->field.MCS >> 4) + 1, - (transmit->field.MCS & 0xf))); - } else -#endif /* SOFT_SOUNDING */ - { - mac_info.Txopmode = IFS_BACKOFF; - } - - /* if we are going to send out FTM action. enable CR to report TMR report.*/ - if ((pAd->pTmrCtrlStruct != NULL) && - (pAd->pTmrCtrlStruct->TmrEnable != TMR_DISABLE)) { - if (mac_info.IsTmr == TRUE) { - /* Leo: already set at TmrCtrlInit() MtSetTmrCR(pAd, TMR_INITIATOR); */ - pAd->pTmrCtrlStruct->TmrState = SEND_OUT; - } - } - -#ifdef OCE_SUPPORT - if (IS_OCE_ENABLE(wdev) && wdev->channel <= 14 && - pHeader_802_11->FC.Type == FC_TYPE_MGMT && - pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) { - transmit->field.MODE = (transmit->field.MODE >= MODE_OFDM) ? - transmit->field.MODE : - MODE_OFDM; - transmit->field.MCS = (transmit->field.MCS >= MCS_RATE_6) ? - transmit->field.MCS : - MCS_RATE_6; - } -#endif -#ifdef TXRX_STAT_SUPPORT - if (!(ApScanRunning(pAd, NULL)) && pMacEntry && - IS_ENTRY_CLIENT(pMacEntry) && - (pHeader_802_11->FC.Type == FC_TYPE_MGMT)) { - UCHAR band_idx = HcGetBandByWdev(pMacEntry->wdev); - struct hdev_ctrl *ctrl = (struct hdev_ctrl *)pAd->hdev_ctrl; - INC_COUNTER64(pMacEntry->TxMgmtPacketCount); - INC_COUNTER64(pMacEntry->pMbss->stat_bss.TxMgmtPacketCount); - INC_COUNTER64( - ctrl->rdev[band_idx].pRadioCtrl->TxMgmtPacketCount); - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" On Channel :: ap_mlme_mgmtq_tx :: Tx Mgmt Subtype : %d\n", - pHeader_802_11->FC.SubType)); - } - if ((ApScanRunning(pAd, NULL)) && - (pAd->ScanCtrl.ScanType == SCAN_ACTIVE) && - (pHeader_802_11->FC.Type == FC_TYPE_MGMT) && wdev) { - BSS_STRUCT *mbss = NULL; - mbss = &pAd->ApCfg.MBSSID[wdev->wdev_idx]; - INC_COUNTER64(mbss->stat_bss.TxMgmtOffChPktCount); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" Off Channel :: ap_mlme_mgmtq_tx :: Tx Mgmt Subtype : %d\n", - pHeader_802_11->FC.SubType)); - } -#endif - -#ifdef CONFIG_RCSA_SUPPORT - /* Before sending RCSA using ALTx0 first flush it then enable as there might be pending pkts */ - if ((pDot11h->RDMode == RD_SWITCHING_MODE) && - (pDfsParam->bRCSAEn == TRUE) && (pDfsParam->ChSwMode == 1)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::Enable ALTX for BandIdx:%d for RCSA Tx\n", - __func__, BandIdx)); - mtRddControl(pAd, RDD_ALTX_CTRL, BandIdx, 0, 1); - pAd->CommonCfg.DfsParameter.fCheckRcsaTxDone = TRUE; - } -#endif - -#ifdef MGMT_TXPWR_CTRL - if ((wdev->bPwrCtrlEn == TRUE) && - (pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) && - (pHeader_802_11->FC.Type == FC_TYPE_MGMT)) { - mac_info.WCID = wdev->tr_tb_idx; - mac_info.IsAutoRate = TRUE; - mac_info.prot = 0; - } -#endif - - return op->mlme_hw_tx(pAd, tmac_info, &mac_info, transmit, tx_blk); -} - -INT ap_mlme_dataq_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *tx_blk) -{ - PQUEUE_ENTRY q_entry; - UCHAR *tmac_info, *frm_buf; - UINT frm_len; -#ifdef RT_BIG_ENDIAN - TXD_STRUC *pDestTxD; - UCHAR hw_hdr_info[TXD_SIZE]; -#endif - PHEADER_802_11 pHeader_802_11; - PFRAME_BAR pBar = NULL; - BOOLEAN bAckRequired, bInsertTimestamp; - UCHAR MlmeRate, wcid = tx_blk->Wcid, tx_rate; - MAC_TABLE_ENTRY *pMacEntry = tx_blk->pMacEntry; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - HTTRANSMIT_SETTING *transmit, TransmitSetting; - MAC_TX_INFO mac_info; - RTMP_ARCH_OP *op = &pAd->archOps; -#ifdef SPECIFIC_TX_POWER_SUPPORT - UCHAR TxPwrAdj = 0; -#endif /* SPECIFIC_TX_POWER_SUPPORT */ - struct dev_rate_info *rate; - struct DOT11_H *pDot11h = NULL; - - if (wdev == NULL) - return NDIS_STATUS_FAILURE; - - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) - return NDIS_STATUS_FAILURE; - - q_entry = RemoveHeadQueue(&tx_blk->TxPacketList); - tx_blk->pPacket = QUEUE_ENTRY_TO_PACKET(q_entry); - ap_fill_offload_tx_blk(pAd, wdev, tx_blk); - pHeader_802_11 = - (HEADER_802_11 *)(tx_blk->pSrcBufHeader + tx_hw_hdr_len); - - rate = &wdev->rate; - frm_buf = tx_blk->pSrcBufHeader; - frm_len = tx_blk->SrcBufLen; - tmac_info = tx_blk->pSrcBufHeader; - - if (pHeader_802_11->Addr1[0] & 0x01) - MlmeRate = pAd->CommonCfg.BasicMlmeRate; - else - MlmeRate = pAd->CommonCfg.MlmeRate; - - /* Verify Mlme rate for a/g bands.*/ - if ((wdev->channel > 14) && (MlmeRate < RATE_6)) { /* 11A band*/ - MlmeRate = RATE_6; - transmit = &rate->MlmeTransmit; - transmit->field.MCS = MCS_RATE_6; - transmit->field.MODE = MODE_OFDM; - } - - /* - Should not be hard code to set PwrMgmt to 0 (PWR_ACTIVE) - Snice it's been set to 0 while on MgtMacHeaderInit - By the way this will cause frame to be send on PWR_SAVE failed. - */ - /* In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame */ - bInsertTimestamp = FALSE; - - if (pHeader_802_11->FC.Type == FC_TYPE_CNTL) { - if (pHeader_802_11->FC.SubType == SUBTYPE_BLOCK_ACK_REQ) { - pBar = (PFRAME_BAR)(tx_blk->pSrcBufHeader + - tx_hw_hdr_len); - bAckRequired = TRUE; - } else - bAckRequired = FALSE; - -#ifdef VHT_TXBF_SUPPORT - - if (pHeader_802_11->FC.SubType == SUBTYPE_VHT_NDPA) { - pHeader_802_11->Duration = RTMPCalcDuration( - pAd, MlmeRate, - (tx_blk->SrcBufLen - TXINFO_SIZE - - cap->TXWISize - TSO_SIZE)); - } -#endif /* VHT_TXBF_SUPPORT*/ - } else { /* FC_TYPE_MGMT or FC_TYPE_DATA(must be NULL frame)*/ - if (pHeader_802_11->Addr1[0] & - 0x01) { /* MULTICAST, BROADCAST */ - bAckRequired = FALSE; - pHeader_802_11->Duration = 0; - } else { - bAckRequired = TRUE; - pHeader_802_11->Duration = - RTMPCalcDuration(pAd, MlmeRate, 14); - - if (pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) { - bInsertTimestamp = TRUE; - bAckRequired = FALSE; -#ifdef SPECIFIC_TX_POWER_SUPPORT - /* Find which MBSSID to be send this probeRsp */ - UINT32 apidx = get_apidx_by_addr( - pAd, pHeader_802_11->Addr2); - - if (!(apidx >= pAd->ApCfg.BssidNum) && - (pAd->ApCfg.MBSSID[apidx].TxPwrAdj != -1) && - (rate->MlmeTransmit.field.MODE == - MODE_CCK) && - (rate->MlmeTransmit.field.MCS == RATE_1)) - TxPwrAdj = pAd->ApCfg.MBSSID[apidx] - .TxPwrAdj; - -#endif /* SPECIFIC_TX_POWER_SUPPORT */ - } - } - } - - pHeader_802_11->Sequence = pAd->Sequence++; - - if (pAd->Sequence > 0xfff) - pAd->Sequence = 0; - - /* Before radar detection done, mgmt frame can not be sent but probe req*/ - /* Because we need to use probe req to trigger driver to send probe req in passive scan*/ - if ((pHeader_802_11->FC.SubType != SUBTYPE_PROBE_REQ) && - (pAd->CommonCfg.bIEEE80211H == 1) && - (pDot11h->RDMode != RD_NORMAL_MODE)) { - MTWF_LOG( - DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("MlmeHardTransmit --> radar detect not in normal mode !!!\n")); - RELEASE_NDIS_PACKET(pAd, tx_blk->pPacket, NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - - if (pMacEntry) { - wcid = pMacEntry->wcid; - } else { - wcid = 0; - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("pMacEntry is null !!\n")); - } - - tx_rate = (UCHAR)rate->MlmeTransmit.field.MCS; - transmit = &rate->MlmeTransmit; - NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info)); - mac_info.FRAG = FALSE; - mac_info.CFACK = FALSE; - mac_info.InsTimestamp = bInsertTimestamp; - mac_info.AMPDU = FALSE; - mac_info.BM = IS_BM_MAC_ADDR(pHeader_802_11->Addr1); - mac_info.Ack = bAckRequired; - mac_info.NSeq = FALSE; - mac_info.BASize = 0; - mac_info.WCID = wcid; - mac_info.TID = 0; - mac_info.wmm_set = HcGetWmmIdx(pAd, wdev); - mac_info.q_idx = HcGetMgmtQueueIdx( - pAd, wdev, RTMP_GET_PACKET_TYPE(tx_blk->pPacket)); - if (pAd->CommonCfg.bSeOff != TRUE) { - if (HcGetBandByWdev(wdev) == BAND0) - mac_info.AntPri = BAND0_SPE_IDX; - else if (HcGetBandByWdev(wdev) == BAND1) - mac_info.AntPri = BAND1_SPE_IDX; - } - if (pMacEntry && IS_ENTRY_REPEATER(pMacEntry)) - mac_info.OmacIdx = - pAd->MacTab.tr_entry[pMacEntry->wcid].OmacIdx; - else - mac_info.OmacIdx = wdev->OmacIdx; - - mac_info.Type = pHeader_802_11->FC.Type; - mac_info.SubType = pHeader_802_11->FC.SubType; - mac_info.Length = (tx_blk->SrcBufLen - tx_hw_hdr_len); - - if (pHeader_802_11->FC.Type == FC_TYPE_MGMT) { - mac_info.hdr_len = 24; - - if (pHeader_802_11->FC.Order == 1) - mac_info.hdr_len += 4; - - mac_info.PID = PID_MGMT; - -#ifdef DOT11W_PMF_SUPPORT - PMF_PerformTxFrameAction(pAd, pHeader_802_11, tx_blk->SrcBufLen, - tx_hw_hdr_len, &mac_info.prot); -#endif - } else if (pHeader_802_11->FC.Type == FC_TYPE_DATA) { - switch (pHeader_802_11->FC.SubType) { - case SUBTYPE_DATA_NULL: - mac_info.hdr_len = 24; - tx_rate = (UCHAR)rate->MlmeTransmit.field.MCS; - transmit = &rate->MlmeTransmit; - break; - - case SUBTYPE_QOS_NULL: - mac_info.hdr_len = 26; - tx_rate = (UCHAR)rate->MlmeTransmit.field.MCS; - transmit = &rate->MlmeTransmit; - break; - - default: - MTWF_LOG( - DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s(): FIXME!!!Unexpected frame(Type=%d, SubType=%d) send to MgmtRing, need to assign the length!\n", - __func__, pHeader_802_11->FC.Type, - pHeader_802_11->FC.SubType)); - hex_dump("DataFrame", frm_buf, frm_len); - break; - } - - mac_info.WCID = wcid; - - if (pMacEntry && pAd->MacTab.tr_entry[wcid].PsDeQWaitCnt) - mac_info.PID = PID_PS_DATA; - else - mac_info.PID = PID_MGMT; - } else if (pHeader_802_11->FC.Type == FC_TYPE_CNTL) { - switch (pHeader_802_11->FC.SubType) { - case SUBTYPE_BLOCK_ACK_REQ: - mac_info.PID = PID_CTL_BAR; - mac_info.hdr_len = 16; - mac_info.SpeEn = 0; - mac_info.TID = pBar->BarControl.TID; - - if (wdev->channel > 14) { - /* 5G */ - TransmitSetting.field.MODE = MODE_OFDM; - } else { - /* 2.4G */ - TransmitSetting.field.MODE = MODE_CCK; - } - - TransmitSetting.field.BW = BW_20; - TransmitSetting.field.STBC = 0; - TransmitSetting.field.ShortGI = 0; - TransmitSetting.field.MCS = 0; - TransmitSetting.field.ldpc = 0; - transmit = &TransmitSetting; -#ifdef MIN_PHY_RATE_SUPPORT - if (wdev->rate.MinPhyMgmtRate != 0) { - transmit = &(wdev->rate.MinPhyMgmtRateTransmit); - } -#endif /* MIN_PHY_RATE_SUPPORT */ - - break; - - default: - MTWF_LOG( - DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s(): FIXME!!!Unexpected frame(Type=%d, SubType=%d) send to MgmtRing, need to assign the length!\n", - __func__, pHeader_802_11->FC.Type, - pHeader_802_11->FC.SubType)); - hex_dump("Control Frame", frm_buf, frm_len); - break; - } - } - - mac_info.TxRate = tx_rate; - mac_info.Txopmode = IFS_BACKOFF; - mac_info.SpeEn = 1; - mac_info.Preamble = LONG_PREAMBLE; - mac_info.IsAutoRate = FALSE; -#ifdef APCLI_SUPPORT - - if ((pHeader_802_11->FC.Type == FC_TYPE_DATA) && - ((pHeader_802_11->FC.SubType == SUBTYPE_DATA_NULL) || - (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL))) { - if ((pMacEntry != NULL) && (IS_ENTRY_APCLI(pMacEntry) -#ifdef MAC_REPEATER_SUPPORT - || IS_ENTRY_REPEATER(pMacEntry) -#endif /* MAC_REPEATER_SUPPORT */ - )) { - /* CURRENT_BW_TX_CNT/CURRENT_BW_FAIL_CNT only count for aute rate */ - mac_info.IsAutoRate = TRUE; - } - } - -#endif /* APCLI_SUPPORT */ - -#ifdef TXRX_STAT_SUPPORT - if (!(ApScanRunning(pAd, NULL)) && pMacEntry && - IS_ENTRY_CLIENT(pMacEntry) && - (pHeader_802_11->FC.Type == FC_TYPE_MGMT)) { - UCHAR band_idx = HcGetBandByWdev(pMacEntry->wdev); - struct hdev_ctrl *ctrl = (struct hdev_ctrl *)pAd->hdev_ctrl; - INC_COUNTER64(pMacEntry->TxMgmtPacketCount); - INC_COUNTER64(pMacEntry->pMbss->stat_bss.TxMgmtPacketCount); - INC_COUNTER64( - ctrl->rdev[band_idx].pRadioCtrl->TxMgmtPacketCount); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" On Channel :: ap_mlme_dataq_tx :: Tx Mgmt Subtype : %d\n", - pHeader_802_11->FC.SubType)); - } - if ((ApScanRunning(pAd, NULL)) && - (pAd->ScanCtrl.ScanType == SCAN_ACTIVE) && - (pHeader_802_11->FC.Type == FC_TYPE_MGMT) && wdev) { - BSS_STRUCT *mbss = NULL; - mbss = &pAd->ApCfg.MBSSID[wdev->wdev_idx]; - INC_COUNTER64(mbss->stat_bss.TxMgmtOffChPktCount); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" Off Channel :: ap_mlme_dataq_tx :: Tx Mgmt Subtype : %d\n", - pHeader_802_11->FC.SubType)); - } -#endif - -#ifdef MGMT_TXPWR_CTRL - if ((wdev->bPwrCtrlEn == TRUE) && - (pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) && - (pHeader_802_11->FC.Type == FC_TYPE_MGMT)) { - mac_info.WCID = wdev->tr_tb_idx; - mac_info.IsAutoRate = TRUE; - mac_info.prot = 0; - } -#endif - - return op->mlme_hw_tx(pAd, tmac_info, &mac_info, transmit, tx_blk); -} - -INT ap_ampdu_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk) -{ - HEADER_802_11 *wifi_hdr; - UCHAR *pHeaderBufPtr = NULL, *src_ptr; - USHORT freeCnt = 1; - BOOLEAN bVLANPkt; - MAC_TABLE_ENTRY *pMacEntry; - STA_TR_ENTRY *tr_entry; - PQUEUE_ENTRY pQEntry; -#ifndef MT_MAC - BOOLEAN bHTCPlus = FALSE; -#endif /* !MT_MAC */ - UINT hdr_offset, cache_sz = 0; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 TXWISize = cap->TXWISize; - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - - ASSERT(pTxBlk); - pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); - pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); - - if (!fill_tx_blk(pAd, wdev, pTxBlk)) { - ap_tx_drop_update(pAd, wdev, pTxBlk); - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - - pMacEntry = pTxBlk->pMacEntry; - tr_entry = pTxBlk->tr_entry; - - if (!TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) { - if (IS_HIF_TYPE(pAd, HIF_MT)) - hdr_offset = tx_hw_hdr_len; - else - hdr_offset = TXINFO_SIZE + TXWISize + TSO_SIZE; - - if ((tr_entry->isCached) -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - && (pMacEntry->TxSndgType == SNDG_TYPE_DISABLE) -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - ) { -#ifndef VENDOR_FEATURE1_SUPPORT - NdisMoveMemory( - (UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), - (UCHAR *)(&tr_entry->CachedBuf[0]), - TXWISize + sizeof(HEADER_802_11)); -#else - pTxBlk->HeaderBuf = (UCHAR *)(tr_entry->HeaderBuf); -#endif /* VENDOR_FEATURE1_SUPPORT */ - pHeaderBufPtr = - (UCHAR *)(&pTxBlk->HeaderBuf[hdr_offset]); - ap_build_cache_802_11_header(pAd, pTxBlk, - pHeaderBufPtr); -#ifdef SOFT_ENCRYPT - RTMPUpdateSwCacheCipherInfo(pAd, pTxBlk, pHeaderBufPtr); -#endif /* SOFT_ENCRYPT */ - } else { - ap_build_802_11_header(pAd, pTxBlk); - pHeaderBufPtr = &pTxBlk->HeaderBuf[hdr_offset]; - } - -#ifdef SOFT_ENCRYPT - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) { - if (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == - FALSE) { - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, - NDIS_STATUS_FAILURE); - return; - } - } - -#endif /* SOFT_ENCRYPT */ - wifi_hdr = (HEADER_802_11 *)pHeaderBufPtr; - /* skip common header */ - pHeaderBufPtr += pTxBlk->MpduHeaderLen; -#ifdef VENDOR_FEATURE1_SUPPORT - - if (tr_entry->isCached && - (tr_entry->Protocol == - (RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket))) -#ifdef SOFT_ENCRYPT - && !TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt) -#endif /* SOFT_ENCRYPT */ -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - && (pMacEntry->TxSndgType == SNDG_TYPE_DISABLE) -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - ) { - /* build QOS Control bytes */ - *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); -#ifdef UAPSD_SUPPORT - - if (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, - fCLIENT_STATUS_APSD_CAPABLE) -#ifdef WDS_SUPPORT - && - (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWDSEntry) == FALSE) -#endif /* WDS_SUPPORT */ - ) { - /* - * we can not use bMoreData bit to get EOSP bit because - * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 - */ - if (TX_BLK_TEST_FLAG(pTxBlk, - fTX_bWMM_UAPSD_EOSP)) - *pHeaderBufPtr |= (1 << 4); - } - -#endif /* UAPSD_SUPPORT */ - pTxBlk->MpduHeaderLen = tr_entry->MpduHeaderLen; - pTxBlk->wifi_hdr_len = tr_entry->wifi_hdr_len; - pHeaderBufPtr = - ((UCHAR *)wifi_hdr) + pTxBlk->MpduHeaderLen; - pTxBlk->HdrPadLen = tr_entry->HdrPadLen; - /* skip 802.3 header */ - pTxBlk->pSrcBufData = - pTxBlk->pSrcBufHeader + LENGTH_802_3; - pTxBlk->SrcBufLen -= LENGTH_802_3; - /* skip vlan tag */ - bVLANPkt = - (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : - FALSE); - - if (bVLANPkt) { - pTxBlk->pSrcBufData += LENGTH_802_1Q; - pTxBlk->SrcBufLen -= LENGTH_802_1Q; - } - } else -#endif /* VENDOR_FEATURE1_SUPPORT */ - { - /* build QOS Control bytes */ - *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); -#ifdef UAPSD_SUPPORT - - if (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, - fCLIENT_STATUS_APSD_CAPABLE) -#ifdef WDS_SUPPORT - && - (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWDSEntry) == FALSE) -#endif /* WDS_SUPPORT */ - ) { - /* - * we can not use bMoreData bit to get EOSP bit because - * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 - */ - if (TX_BLK_TEST_FLAG(pTxBlk, - fTX_bWMM_UAPSD_EOSP)) - *pHeaderBufPtr |= (1 << 4); - } - -#endif /* UAPSD_SUPPORT */ - *(pHeaderBufPtr + 1) = 0; - pHeaderBufPtr += 2; - pTxBlk->MpduHeaderLen += 2; - pTxBlk->wifi_hdr_len += 2; -#ifndef MT_MAC - - /* TODO: Shiang-usw, we need a more proper way to handle this instead of ifndef MT_MAC ! */ - /* For MT_MAC, SW not to prepare the HTC field for RDG enable */ - /* build HTC control field after QoS field */ - if ((pAd->CommonCfg.bRdg == TRUE) && - (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, - fCLIENT_STATUS_RDG_CAPABLE)) -#ifdef TXBF_SUPPORT - && (pMacEntry->TxSndgType != SNDG_TYPE_NDP) -#endif /* TXBF_SUPPORT */ - ) { - NdisZeroMemory(pHeaderBufPtr, - sizeof(HT_CONTROL)); - ((PHT_CONTROL)pHeaderBufPtr)->RDG = 1; - bHTCPlus = TRUE; - } - -#endif /* MT_MAC */ -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - - if (cap->FlgHwTxBfCap) { - pTxBlk->TxSndgPkt = SNDG_TYPE_DISABLE; - /* TODO: shiang-lock, fix ME!! */ - NdisAcquireSpinLock(&pMacEntry->TxSndgLock); - - if (pMacEntry->TxSndgType >= - SNDG_TYPE_SOUNDING) { - if (bHTCPlus == FALSE) { - NdisZeroMemory( - pHeaderBufPtr, - sizeof(HT_CONTROL)); - bHTCPlus = TRUE; - } - - if (pMacEntry->TxSndgType == - SNDG_TYPE_SOUNDING) { - /* Select compress if supported. Otherwise select noncompress */ - if ((pAd->CommonCfg - .ETxBfNoncompress == - 0) && - (pMacEntry->HTCapability - .TxBFCap.ExpComBF > - 0)) - ((PHT_CONTROL) - pHeaderBufPtr) - ->CSISTEERING = - 3; - else - ((PHT_CONTROL) - pHeaderBufPtr) - ->CSISTEERING = - 2; - - /* Clear NDP Announcement */ - ((PHT_CONTROL)pHeaderBufPtr) - ->NDPAnnounce = 0; - } else if (pMacEntry->TxSndgType == - SNDG_TYPE_NDP) { - /* Select compress if supported. Otherwise select noncompress */ - if ((pAd->CommonCfg - .ETxBfNoncompress == - 0) && - (pMacEntry->HTCapability - .TxBFCap.ExpComBF > - 0) && - (pMacEntry->HTCapability - .TxBFCap - .ComSteerBFAntSup >= - (pMacEntry->sndgMcs / 8))) - ((PHT_CONTROL) - pHeaderBufPtr) - ->CSISTEERING = - 3; - else - ((PHT_CONTROL) - pHeaderBufPtr) - ->CSISTEERING = - 2; - - /* Set NDP Announcement */ - ((PHT_CONTROL)pHeaderBufPtr) - ->NDPAnnounce = 1; - pTxBlk->TxNDPSndgBW = - pMacEntry->sndgBW; - pTxBlk->TxNDPSndgMcs = - pMacEntry->sndgMcs; - } - - pTxBlk->TxSndgPkt = - pMacEntry->TxSndgType; - pMacEntry->TxSndgType = - SNDG_TYPE_DISABLE; - } - - NdisReleaseSpinLock(&pMacEntry->TxSndgLock); -#ifdef MFB_SUPPORT -#if defined(MRQ_FORCE_TX) - /* have to replace this by the correct condition!!! */ - pMacEntry->HTCapability.ExtHtCapInfo - .MCSFeedback = MCSFBK_MRQ; -#endif - - /* - Ignore sounding frame because the signal format of sounding frmae may - be different from normal data frame, which may result in different MFB - */ - if ((pMacEntry->HTCapability.ExtHtCapInfo - .MCSFeedback >= MCSFBK_MRQ) && - (pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE)) { - if (bHTCPlus == FALSE) { - NdisZeroMemory( - pHeaderBufPtr, - sizeof(HT_CONTROL)); - bHTCPlus = TRUE; - } - - MFB_PerPareMRQ(pAd, pHeaderBufPtr, - pMacEntry); - } - - if (pAd->CommonCfg.HtCapability.ExtHtCapInfo - .MCSFeedback >= - MCSFBK_MRQ && - pMacEntry->toTxMfb == 1) { - if (bHTCPlus == FALSE) { - NdisZeroMemory( - pHeaderBufPtr, - sizeof(HT_CONTROL)); - bHTCPlus = TRUE; - } - - MFB_PerPareMFB( - pAd, pHeaderBufPtr, - pMacEntry); /* not complete yet!!! */ - pMacEntry->toTxMfb = 0; - } - -#endif /* MFB_SUPPORT */ - } - -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - -#ifndef MT_MAC - if (bHTCPlus == TRUE) { - wifi_hdr->FC.Order = 1; - pHeaderBufPtr += 4; - pTxBlk->MpduHeaderLen += 4; - pTxBlk->wifi_hdr_len += 4; - } -#endif /* MT_MAC */ - - /*pTxBlk->MpduHeaderLen = pHeaderBufPtr - pTxBlk->HeaderBuf - TXWI_SIZE - TXINFO_SIZE; */ - ASSERT(pTxBlk->MpduHeaderLen >= 24); - /* skip 802.3 header */ - pTxBlk->pSrcBufData = - pTxBlk->pSrcBufHeader + LENGTH_802_3; - pTxBlk->SrcBufLen -= LENGTH_802_3; - - /* skip vlan tag */ - if (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket)) { - pTxBlk->pSrcBufData += LENGTH_802_1Q; - pTxBlk->SrcBufLen -= LENGTH_802_1Q; - } - - /* - padding at front of LLC header - LLC header should locate at 4-octets aligment - - @@@ MpduHeaderLen excluding padding @@@ - */ - pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; - pHeaderBufPtr = (UCHAR *)ROUND_UP(pHeaderBufPtr, 4); - pTxBlk->HdrPadLen = - (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); -#ifdef VENDOR_FEATURE1_SUPPORT - tr_entry->HdrPadLen = pTxBlk->HdrPadLen; -#endif /* VENDOR_FEATURE1_SUPPORT */ -#ifdef SOFT_ENCRYPT - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) - tx_sw_encrypt(pAd, pTxBlk, pHeaderBufPtr, - wifi_hdr); - else -#endif /* SOFT_ENCRYPT */ - { - /* - Insert LLC-SNAP encapsulation - 8 octets - if original Ethernet frame contains no LLC/SNAP, - then an extra LLC/SNAP encap is required - */ - EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET( - pTxBlk->pSrcBufData - 2, - pTxBlk->pExtraLlcSnapEncap); - - if (pTxBlk->pExtraLlcSnapEncap) { - NdisMoveMemory( - pHeaderBufPtr, - pTxBlk->pExtraLlcSnapEncap, 6); - pHeaderBufPtr += 6; - /* get 2 octets (TypeofLen) */ - NdisMoveMemory(pHeaderBufPtr, - pTxBlk->pSrcBufData - 2, - 2); - pHeaderBufPtr += 2; - pTxBlk->MpduHeaderLen += LENGTH_802_1_H; - } - } - -#ifdef VENDOR_FEATURE1_SUPPORT - tr_entry->Protocol = - RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket); - tr_entry->MpduHeaderLen = pTxBlk->MpduHeaderLen; - tr_entry->wifi_hdr_len = pTxBlk->wifi_hdr_len; -#endif /* VENDOR_FEATURE1_SUPPORT */ - } - } else { - pTxBlk->MpduHeaderLen = 0; - pTxBlk->HdrPadLen = 2; - pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader; - } - - if ((tr_entry->isCached) -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - && (pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE) -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - ) - write_tmac_info_Cache(pAd, &pTxBlk->HeaderBuf[0], pTxBlk); - else { - pAd->archOps.write_tmac_info(pAd, &pTxBlk->HeaderBuf[0], - pTxBlk); - - if (RTMP_GET_PACKET_LOWRATE(pTxBlk->pPacket)) - tr_entry->isCached = FALSE; - - NdisZeroMemory((UCHAR *)(&tr_entry->CachedBuf[0]), - sizeof(tr_entry->CachedBuf)); - - if (!TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) { - cache_sz = (pHeaderBufPtr - - (UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE])); - src_ptr = (UCHAR *)(&pTxBlk->HeaderBuf[TXINFO_SIZE]); - NdisMoveMemory((UCHAR *)(&tr_entry->CachedBuf[0]), - src_ptr, cache_sz); - } - -#ifdef VENDOR_FEATURE1_SUPPORT - /* use space to get performance enhancement */ - NdisZeroMemory((UCHAR *)(&tr_entry->HeaderBuf[0]), - sizeof(tr_entry->HeaderBuf)); - NdisMoveMemory( - (UCHAR *)(&tr_entry->HeaderBuf[0]), - (UCHAR *)(&pTxBlk->HeaderBuf[0]), - (pHeaderBufPtr - (UCHAR *)(&pTxBlk->HeaderBuf[0]))); -#endif /* VENDOR_FEATURE1_SUPPORT */ - } - -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - - if (pTxBlk->TxSndgPkt != SNDG_TYPE_DISABLE) - tr_entry->isCached = FALSE; - -#endif -#endif /* TXBF_SUPPORT */ - - ap_tx_ok_update(pAd, wdev, pTxBlk); - pAd->archOps.write_tx_resource(pAd, pTxBlk, TRUE, &freeCnt); -#ifdef SMART_ANTENNA - - if (pMacEntry) - pMacEntry->saTxCnt++; - -#endif /* SMART_ANTENNA */ - pAd->RalinkCounters.KickTxCount++; - pAd->RalinkCounters.OneSecTxDoneCount++; - return NDIS_STATUS_SUCCESS; -} - -INT ap_amsdu_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *tx_blk) -{ - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - struct wifi_dev_ops *wdev_ops = wdev->wdev_ops; - PQUEUE_ENTRY pQEntry; - INT32 ret = NDIS_STATUS_SUCCESS; - UINT index = 0; - - ASSERT((tx_blk->TxPacketList.Number > 1)); - - while (tx_blk->TxPacketList.Head) { - pQEntry = RemoveHeadQueue(&tx_blk->TxPacketList); - tx_blk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); - - if (index == 0) - tx_blk->amsdu_state = TX_AMSDU_ID_FIRST; - else if (index == (tx_blk->TotalFrameNum - 1)) - tx_blk->amsdu_state = TX_AMSDU_ID_LAST; - else - tx_blk->amsdu_state = TX_AMSDU_ID_MIDDLE; - - if (!fill_tx_blk(pAd, wdev, tx_blk)) { - ap_tx_drop_update(pAd, wdev, tx_blk); - RELEASE_NDIS_PACKET(pAd, tx_blk->pPacket, - NDIS_STATUS_FAILURE); - continue; - } - - if (TX_BLK_TEST_FLAG(tx_blk, fTX_HDR_TRANS)) - wdev_ops->ieee_802_3_data_tx(pAd, wdev, tx_blk); - else - wdev_ops->ieee_802_11_data_tx(pAd, wdev, tx_blk); - - ap_tx_ok_update(pAd, wdev, tx_blk); - - ret = arch_ops->hw_tx(pAd, tx_blk); - - if (ret != NDIS_STATUS_SUCCESS) - return ret; - - pAd->RalinkCounters.KickTxCount++; - pAd->RalinkCounters.OneSecTxDoneCount++; - tx_blk->frame_idx++; - index++; - } - - return NDIS_STATUS_SUCCESS; -} - -#if defined(VOW_SUPPORT) && defined(VOW_DVT) -BOOLEAN vow_is_queue_full(RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR qidx) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: STA %d, qidx %d, vow_queue_len %d \n", __func__, wcid, - qidx, pAd->vow_queue_len[wcid][qidx])); - if (pAd->vow_queue_len[wcid][qidx] >= pAd->vow_q_len) - return TRUE; - else - return FALSE; -} - -UINT32 vow_clone_legacy_frame(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk) -{ - UINT32 i; - /*PNDIS_PACKET pkt;*/ - TX_BLK txb, *pTemp_TxBlk; - struct wifi_dev *wdev = pTxBlk->wdev; - UINT32 KickRingBitMap = 0; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - pTemp_TxBlk = &txb; - - /* return BC/MC */ - if (pTxBlk->TxFrameType == TX_MCAST_FRAME) { - UCHAR wmm_set = 0; - - if (wdev) { - wmm_set = HcGetWmmIdx(pAd, wdev); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: wcid %d, wmm set %d\n", __func__, - pTxBlk->Wcid, wmm_set)); - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wcid %d, wdev is null!\n", __func__, - pTxBlk->Wcid)); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[32m%s: bc/mc packet ........ wcid %d\x1b[m\n", - __func__, pTxBlk->Wcid)); - - return KickRingBitMap; - } - - /*pkt = DuplicatePacket(wdev->if_dev, pTxBlk->pPacket);*/ - /* backup TXBLK */ - os_move_mem(&txb, pTxBlk, sizeof(TX_BLK)); - - /*if (pkt == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: DuplicatePacket failed!!\n", __func__)); - return; - } - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: clone 1 pkt %p, vow_cloned_wtbl_num %d, pkt %p, clone pkt %p\n", - __func__, pkt, pAd->vow_cloned_wtbl_max, pTxBlk->pPacket, pkt));*/ - - if (pAd->vow_cloned_wtbl_max) { - UINT32 end, start; - struct wifi_dev *wdev = pTxBlk->wdev; - UCHAR wmm_set; - - if (wdev) { - wmm_set = HcGetWmmIdx(pAd, wdev); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: wcid %d, wmm set %d\n", __func__, - pTxBlk->Wcid, wmm_set)); - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: wcid %d, wdev is null!\n", __func__, - pTxBlk->Wcid)); - } - - if (pAd->CommonCfg.dbdc_mode) { - /* if (wmm_set == 0) */ - if (pTxBlk->Wcid == 1) { - start = 3; - end = pAd->vow_cloned_wtbl_num[0]; - } else { - start = pAd->vow_cloned_wtbl_num[0] + 1; - end = pAd->vow_cloned_wtbl_num[1]; - } - } else { - start = 2; - end = pAd->vow_cloned_wtbl_num[0]; - } - - /* for (i = 3; i <= pAd->vow_cloned_wtbl_num; i++) */ - for (i = start; i <= end; i++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: sta%d, tx_en %d\n", __func__, i, - pAd->vow_tx_en[i])); - - /* check queue status */ - if (vow_is_queue_full(pAd, i, pAd->vow_sta_ac[i])) { - /*printk("\x1b[31m%s: full wcid %d, ac %d\x1b[m\n", __FUNCTION__, i, pAd->vow_sta_ac[i]);*/ - continue; - } - - if (pAd->vow_tx_en[i] && - (pAd->archOps.get_tx_resource_free_num(pAd, 0) > - 2)) { - USHORT free_cnt = 1, tx_idx; - /* clone packet */ - /*PNDIS_PACKET clone = DuplicatePacket(wdev->if_dev, pkt);*/ - PNDIS_PACKET clone = DuplicatePacket( - wdev->if_dev, pTxBlk->pPacket); - - if (clone == NULL) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: DuplicatePacket failed!!\n", - __func__)); - /*pAd->archOps.kickout_data_tx(pAd, pTxBlk, pTxBlk->resource_idx);*/ /* move to ge_tx_pkt_deq_bh() */ - goto CLONE_DONE; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: sta%d, free no %d, clone pkt %p\n", - __func__, i, - pAd->archOps.get_tx_resource_free_num( - pAd, 0), - clone)); - /* cloned PKT */ - pTemp_TxBlk->pPacket = clone; - - /* pTxBlk->Wcid = 1; */ - pTemp_TxBlk->Wcid = i; - - if (pAd->vow_sta_ac[i] != QID_AC_VO) - pTemp_TxBlk->resource_idx = - pAd->vow_sta_ac[i]; /* BK/BE/VI */ - else - pTemp_TxBlk->resource_idx = - HIF_TX_IDX4; /* VO */ - - /* get MAC TXD buffer */ - pTemp_TxBlk->HeaderBuf = - pAd->archOps.get_hif_buf( - pAd, pTemp_TxBlk, - pTemp_TxBlk->resource_idx, - pTemp_TxBlk->TxFrameType); - - /* modified DA */ - if (!TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) { - HEADER_802_11 *hdr = - (HEADER_802_11 *) - pTemp_TxBlk->wifi_hdr; - - hdr->Addr1[4] = i; - } else if (TX_BLK_TEST_FLAG(pTxBlk, - fTX_HDR_TRANS)) { - INT32 ret = NDIS_STATUS_SUCCESS; - - /* modified DA */ - - /* fill TXD */ - if ((pTxBlk->amsdu_state == - TX_AMSDU_ID_NO) || - (pTxBlk->amsdu_state == - TX_AMSDU_ID_LAST)) - pAd->archOps.write_tmac_info( - pAd, - &pTemp_TxBlk - ->HeaderBuf[0], - pTemp_TxBlk); - - /* fill TXP in TXD */ - ret = pAd->archOps.write_txp_info( - pAd, - &pTemp_TxBlk->HeaderBuf - [cap->tx_hw_hdr_len], - pTemp_TxBlk); - - if (ret != NDIS_STATUS_SUCCESS) { - RELEASE_NDIS_PACKET( - pAd, clone, - NDIS_STATUS_FAILURE); - goto CLONE_DONE; - } - /* fill DMAD */ - if ((pTxBlk->amsdu_state == - TX_AMSDU_ID_NO) || - (pTxBlk->amsdu_state == - TX_AMSDU_ID_LAST)) - tx_idx = - pAd->archOps.write_tx_resource( - pAd, - pTemp_TxBlk, - TRUE, - &free_cnt); - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: sta%d, tx idx %d, resource_idx %d\n", - __func__, i, tx_idx, - pTemp_TxBlk->resource_idx)); - } - } - KickRingBitMap |= (1 << pTemp_TxBlk->resource_idx); - } - } - -CLONE_DONE: - /* release original pkt */ - if (pAd->vow_need_drop_cnt[pTxBlk->Wcid] > 0) { - /*printk("\x1b[31m%s release....wcid %d, drop cnt %d\n\x1b[m\n", __FUNCTION__, pTxBlk->Wcid, - pAd->vow_need_drop_cnt[pTxBlk->Wcid]);*/ - pAd->vow_need_drop_cnt[pTxBlk->Wcid]--; - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS); - } - - return KickRingBitMap; -} -#endif /* defined(VOW_SUPPORT) && (defined(VOW_DVT) */ - -VOID ap_ieee_802_11_data_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk) -{ - HEADER_802_11 *wifi_hdr; - UCHAR *pHeaderBufPtr; - BOOLEAN bVLANPkt; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - ap_build_802_11_header(pAd, pTxBlk); -#ifdef SOFT_ENCRYPT - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) { - if (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE) { - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, - NDIS_STATUS_FAILURE); - return; - } - } - -#endif /* SOFT_ENCRYPT */ - /* skip 802.3 header */ - pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; - pTxBlk->SrcBufLen -= LENGTH_802_3; - /* skip vlan tag */ - bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); - - if (bVLANPkt) { - pTxBlk->pSrcBufData += LENGTH_802_1Q; - pTxBlk->SrcBufLen -= LENGTH_802_1Q; - } - - /* record these MCAST_TX frames for group key rekey */ - if (pTxBlk->TxFrameType == TX_MCAST_FRAME) { - INT idx; -#ifdef STATS_COUNT_SUPPORT - INC_COUNTER64( - pAd->WlanCounters[0].MulticastTransmittedFrameCount); -#endif /* STATS_COUNT_SUPPORT */ - - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - if (pAd->ApCfg.MBSSID[idx].WPAREKEY.ReKeyMethod == - PKT_REKEY) - pAd->ApCfg.MBSSID[idx].REKEYCOUNTER += - (pTxBlk->SrcBufLen); - } - } -#ifdef MT_MAC - else { - /* Unicast */ - if (pTxBlk->tr_entry && pTxBlk->tr_entry->PsDeQWaitCnt) - pTxBlk->Pid = PID_PS_DATA; - } - -#endif /* MT_MAC */ - pHeaderBufPtr = pTxBlk->wifi_hdr; - wifi_hdr = (HEADER_802_11 *)pHeaderBufPtr; - /* skip common header */ - pHeaderBufPtr += pTxBlk->wifi_hdr_len; - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) { - struct wifi_dev *wdev_tmp = NULL; - UCHAR ack_policy = pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx]; - wdev_tmp = pTxBlk->wdev; - if (wdev_tmp) - ack_policy = wlan_config_get_ack_policy(wdev_tmp, - pTxBlk->QueIdx); - - /* build QOS Control bytes */ - *pHeaderBufPtr = - ((pTxBlk->UserPriority & 0x0F) | (ack_policy << 5)); -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - *pHeaderBufPtr |= (pAd->vow_sta_ack[pTxBlk->Wcid] << 5); -#endif /* defined(VOW_SUPPORT) && (defined(VOW_DVT) */ -#ifdef WFA_VHT_PF - - if (pAd->force_noack) - *pHeaderBufPtr |= (1 << 5); - -#endif /* WFA_VHT_PF */ -#ifdef UAPSD_SUPPORT - if (CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, - fCLIENT_STATUS_APSD_CAPABLE) -#ifdef WDS_SUPPORT - && (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWDSEntry) == FALSE) -#endif /* WDS_SUPPORT */ - ) { - /* - we can not use bMoreData bit to get EOSP bit because - maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 - */ - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP)) - *pHeaderBufPtr |= (1 << 4); - } - -#endif /* UAPSD_SUPPORT */ - *(pHeaderBufPtr + 1) = 0; - pHeaderBufPtr += 2; - pTxBlk->wifi_hdr_len += 2; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_LOUD, - ("%s: tx_bf: %d\n", __func__, cap->FlgHwTxBfCap)); -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - - if (cap->FlgHwTxBfCap && (pTxBlk->pMacEntry) && - (pTxBlk->pTransmit->field.MODE >= MODE_HTMIX)) { - MAC_TABLE_ENTRY *pMacEntry = pTxBlk->pMacEntry; - BOOLEAN bHTCPlus = FALSE; - - pTxBlk->TxSndgPkt = SNDG_TYPE_DISABLE; - /* TODO: shiang-usw, fix ME!! */ - NdisAcquireSpinLock(&pMacEntry->TxSndgLock); - - if (pMacEntry->TxSndgType >= SNDG_TYPE_SOUNDING) { - NdisZeroMemory(pHeaderBufPtr, - sizeof(HT_CONTROL)); - - if (pMacEntry->TxSndgType == - SNDG_TYPE_SOUNDING) { - /* Select compress if supported. Otherwise select noncompress */ - if ((pAd->CommonCfg.ETxBfNoncompress == - 0) && - (pMacEntry->HTCapability.TxBFCap - .ExpComBF > 0)) - ((PHT_CONTROL)pHeaderBufPtr) - ->CSISTEERING = 3; - else - ((PHT_CONTROL)pHeaderBufPtr) - ->CSISTEERING = 2; - - /* Clear NDP Announcement */ - ((PHT_CONTROL)pHeaderBufPtr) - ->NDPAnnounce = 0; - } else if (pMacEntry->TxSndgType == - SNDG_TYPE_NDP) { - /* Select compress if supported. Otherwise select noncompress */ - if ((pAd->CommonCfg.ETxBfNoncompress == - 0) && - (pMacEntry->HTCapability.TxBFCap - .ExpComBF > 0) && - (pMacEntry->HTCapability.TxBFCap - .ComSteerBFAntSup >= - (pMacEntry->sndgMcs / 8))) - ((PHT_CONTROL)pHeaderBufPtr) - ->CSISTEERING = 3; - else - ((PHT_CONTROL)pHeaderBufPtr) - ->CSISTEERING = 2; - - /* Set NDP Announcement */ - ((PHT_CONTROL)pHeaderBufPtr) - ->NDPAnnounce = 1; - pTxBlk->TxNDPSndgBW = pMacEntry->sndgBW; - pTxBlk->TxNDPSndgMcs = - pMacEntry->sndgMcs; - } - - pTxBlk->TxSndgPkt = pMacEntry->TxSndgType; - pMacEntry->TxSndgType = SNDG_TYPE_DISABLE; - bHTCPlus = TRUE; - } - - NdisReleaseSpinLock(&pMacEntry->TxSndgLock); -#ifdef MFB_SUPPORT -#if defined(MRQ_FORCE_TX) - /* have to replace this by the correct condition!!! */ - pMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback = - MCSFBK_MRQ; -#endif - - /* - Ignore sounding frame because the signal format of sounding frmae may - be different from normal data frame, which may result in different MFB - */ - if ((pMacEntry->HTCapability.ExtHtCapInfo.MCSFeedback >= - MCSFBK_MRQ) && - (pTxBlk->TxSndgPkt == SNDG_TYPE_DISABLE)) { - if (bHTCPlus == FALSE) { - NdisZeroMemory(pHeaderBufPtr, - sizeof(HT_CONTROL)); - bHTCPlus = TRUE; - } - - MFB_PerPareMRQ(pAd, pHeaderBufPtr, pMacEntry); - } - - if (pAd->CommonCfg.HtCapability.ExtHtCapInfo - .MCSFeedback >= MCSFBK_MRQ && - pMacEntry->toTxMfb == 1) { - if (bHTCPlus == FALSE) { - NdisZeroMemory(pHeaderBufPtr, - sizeof(HT_CONTROL)); - bHTCPlus = TRUE; - } - - MFB_PerPareMFB( - pAd, pHeaderBufPtr, - pMacEntry); /* not complete yet!!! */ - pMacEntry->toTxMfb = 0; - } - -#endif /* MFB_SUPPORT */ - - if (bHTCPlus == TRUE) { - /* mark HTC bit */ - wifi_hdr->FC.Order = 1; - pHeaderBufPtr += 4; - pTxBlk->wifi_hdr_len += 4; - } - } - -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - } - - /* The remaining content of MPDU header should locate at 4-octets aligment */ - pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; - pHeaderBufPtr = (UCHAR *)ROUND_UP(pHeaderBufPtr, 4); - pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); - pTxBlk->MpduHeaderLen = pTxBlk->wifi_hdr_len; -#ifdef SOFT_ENCRYPT - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) - tx_sw_encrypt(pAd, pTxBlk, pHeaderBufPtr, wifi_hdr); - else -#endif /* SOFT_ENCRYPT */ - { - /* - Insert LLC-SNAP encapsulation - 8 octets - if original Ethernet frame contains no LLC/SNAP, - then an extra LLC/SNAP encap is required - */ - EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, - pTxBlk->pExtraLlcSnapEncap); - - if (pTxBlk->pExtraLlcSnapEncap) { - UCHAR vlan_size; - - NdisMoveMemory(pHeaderBufPtr, - pTxBlk->pExtraLlcSnapEncap, 6); - pHeaderBufPtr += 6; - /* skip vlan tag */ - vlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0; - /* get 2 octets (TypeofLen) */ - NdisMoveMemory(pHeaderBufPtr, - pTxBlk->pSrcBufHeader + 12 + vlan_size, - 2); - pHeaderBufPtr += 2; - pTxBlk->MpduHeaderLen += LENGTH_802_1_H; - } - } -} - -VOID ap_ieee_802_3_data_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk) -{ - pTxBlk->MpduHeaderLen = 0; - pTxBlk->HdrPadLen = 0; - pTxBlk->wifi_hdr_len = 0; - pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader; -} - -INT ap_legacy_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk) -{ - QUEUE_ENTRY *pQEntry; - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - INT32 ret = NDIS_STATUS_SUCCESS; - struct wifi_dev_ops *wdev_ops = wdev->wdev_ops; - - ASSERT(pTxBlk); - pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); - pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); - - if (!fill_tx_blk(pAd, wdev, pTxBlk)) { - ap_tx_drop_update(pAd, wdev, pTxBlk); - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) - wdev_ops->ieee_802_3_data_tx(pAd, wdev, pTxBlk); - else - wdev_ops->ieee_802_11_data_tx(pAd, wdev, pTxBlk); - - ap_tx_ok_update(pAd, wdev, pTxBlk); - - ret = arch_ops->hw_tx(pAd, pTxBlk); - - if (ret != NDIS_STATUS_SUCCESS) - return ret; - - if (RTMP_GET_PACKET_LOWRATE(pTxBlk->pPacket)) - if (pTxBlk->tr_entry) - pTxBlk->tr_entry->isCached = FALSE; - - pAd->RalinkCounters.KickTxCount++; - pAd->RalinkCounters.OneSecTxDoneCount++; - return NDIS_STATUS_SUCCESS; -} - -INT ap_frag_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk) -{ - HEADER_802_11 *wifi_hdr; - QUEUE_ENTRY *pQEntry; - PACKET_INFO PacketInfo; -#ifdef SOFT_ENCRYPT - UCHAR *tmp_ptr = NULL; - UINT32 buf_offset = 0; -#endif /* SOFT_ENCRYPT */ - HTTRANSMIT_SETTING *pTransmit; - UCHAR fragNum = 0; - USHORT EncryptionOverhead = 0; - UINT32 FreeMpduSize, SrcRemainingBytes; - USHORT AckDuration; - UINT NextMpduSize; - RTMP_ARCH_OP *op = &pAd->archOps; - INT32 ret = NDIS_STATUS_SUCCESS; - struct wifi_dev_ops *ops = wdev->wdev_ops; - - ASSERT(pTxBlk); - pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); - pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); - - if (!fill_tx_blk(pAd, wdev, pTxBlk)) { - ap_tx_drop_update(pAd, wdev, pTxBlk); - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--%s(%d): ##########Fail#########\n", __func__, - __LINE__)); - return NDIS_STATUS_SUCCESS; - } - -#ifdef SOFT_ENCRYPT - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) { - if (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE) { - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, - NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - } - -#endif /* SOFT_ENCRYPT */ - - if (IS_CIPHER_TKIP(pTxBlk->CipherAlg)) { - pTxBlk->pPacket = - duplicate_pkt_with_TKIP_MIC(pAd, pTxBlk->pPacket); - - if (pTxBlk->pPacket == NULL) - return NDIS_STATUS_FAILURE; - - RTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo, - &pTxBlk->pSrcBufHeader, - &pTxBlk->SrcBufLen); - } - - ops->ieee_802_11_data_tx(pAd, wdev, pTxBlk); - - /* 1. If TKIP is used and fragmentation is required. Driver has to - append TKIP MIC at tail of the scatter buffer - 2. When TXWI->FRAG is set as 1 in TKIP mode, - MAC ASIC will only perform IV/EIV/ICV insertion but no TKIP MIC */ - /* TKIP appends the computed MIC to the MSDU data prior to fragmentation into MPDUs. */ - if (IS_CIPHER_TKIP(pTxBlk->CipherAlg)) { - RTMPCalculateMICValue(pAd, pTxBlk->pPacket, - pTxBlk->pExtraLlcSnapEncap, pTxBlk->pKey, - &pTxBlk->pKey[LEN_TK], wdev->func_idx); - /* - NOTE: DON'T refer the skb->len directly after following copy. Becasue the length is not adjust - to correct lenght, refer to pTxBlk->SrcBufLen for the packet length in following progress. - */ - NdisMoveMemory(pTxBlk->pSrcBufData + pTxBlk->SrcBufLen, - &pAd->PrivateInfo.Tx.MIC[0], 8); - pTxBlk->SrcBufLen += 8; - pTxBlk->TotalFrameLen += 8; - } - - ap_tx_ok_update(pAd, wdev, pTxBlk); - - /* - calcuate the overhead bytes that encryption algorithm may add. This - affects the calculate of "duration" field - */ - if ((pTxBlk->CipherAlg == CIPHER_WEP64) || - (pTxBlk->CipherAlg == CIPHER_WEP128) || - (pTxBlk->CipherAlg == CIPHER_WEP152)) - EncryptionOverhead = 8; /* WEP: IV[4] + ICV[4]; */ - else if (pTxBlk->CipherAlg == CIPHER_TKIP) - EncryptionOverhead = - 12; /* TKIP: IV[4] + EIV[4] + ICV[4], MIC will be added to TotalPacketLength */ - else if (pTxBlk->CipherAlg == CIPHER_AES) - EncryptionOverhead = 16; /* AES: IV[4] + EIV[4] + MIC[8] */ - - else - EncryptionOverhead = 0; - - pTransmit = pTxBlk->pTransmit; - - /* Decide the TX rate */ - if (pTransmit->field.MODE == MODE_CCK) - pTxBlk->TxRate = pTransmit->field.MCS; - else if (pTransmit->field.MODE == MODE_OFDM) - pTxBlk->TxRate = pTransmit->field.MCS + RATE_FIRST_OFDM_RATE; - else - pTxBlk->TxRate = RATE_6_5; - - /* decide how much time an ACK/CTS frame will consume in the air */ - if (pTxBlk->TxRate <= RATE_LAST_OFDM_RATE) - AckDuration = RTMPCalcDuration( - pAd, pAd->CommonCfg.ExpectedACKRate[pTxBlk->TxRate], - 14); - else - AckDuration = RTMPCalcDuration(pAd, RATE_6_5, 14); - - /*MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("!!!Fragment AckDuration(%d), TxRate(%d)!!!\n", AckDuration, pTxBlk->TxRate)); */ -#ifdef SOFT_ENCRYPT - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) { - /* store the outgoing frame for calculating MIC per fragmented frame */ - os_alloc_mem(pAd, (PUCHAR *)&tmp_ptr, pTxBlk->SrcBufLen); - - if (tmp_ptr == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():no memory for MIC calculation!\n", - __func__)); - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, - NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - - NdisMoveMemory(tmp_ptr, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen); - } - -#endif /* SOFT_ENCRYPT */ - /* Init the total payload length of this frame. */ - SrcRemainingBytes = pTxBlk->SrcBufLen; - pTxBlk->TotalFragNum = 0xff; - wifi_hdr = (HEADER_802_11 *)pTxBlk->wifi_hdr; - - do { - FreeMpduSize = wlan_operate_get_frag_thld(&pTxBlk->pMbss->wdev); - FreeMpduSize -= LENGTH_CRC; - FreeMpduSize -= pTxBlk->MpduHeaderLen; - - if (SrcRemainingBytes <= FreeMpduSize) { - /* This is the last or only fragment */ - pTxBlk->SrcBufLen = SrcRemainingBytes; - wifi_hdr->FC.MoreFrag = 0; - wifi_hdr->Duration = pAd->CommonCfg.Dsifs + AckDuration; - /* Indicate the lower layer that this's the last fragment. */ - pTxBlk->TotalFragNum = fragNum; -#ifdef MT_MAC - pTxBlk->FragIdx = ((fragNum == 0) ? TX_FRAG_ID_NO : - TX_FRAG_ID_LAST); -#endif /* MT_MAC */ - } else { - /* more fragment is required */ - pTxBlk->SrcBufLen = FreeMpduSize; - NextMpduSize = min( - ((UINT)SrcRemainingBytes - pTxBlk->SrcBufLen), - ((UINT)wlan_operate_get_frag_thld( - &pTxBlk->pMbss->wdev))); - wifi_hdr->FC.MoreFrag = 1; - wifi_hdr->Duration = - (3 * pAd->CommonCfg.Dsifs) + (2 * AckDuration) + - RTMPCalcDuration(pAd, pTxBlk->TxRate, - NextMpduSize + - EncryptionOverhead); -#ifdef MT_MAC - pTxBlk->FragIdx = ((fragNum == 0) ? TX_FRAG_ID_FIRST : - TX_FRAG_ID_MIDDLE); -#endif /* MT_MAC */ - } - - SrcRemainingBytes -= pTxBlk->SrcBufLen; - - if (fragNum == 0) - pTxBlk->FrameGap = IFS_HTTXOP; - else - pTxBlk->FrameGap = IFS_SIFS; - -#ifdef SOFT_ENCRYPT - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) { - UCHAR ext_offset = 0; - - NdisMoveMemory(pTxBlk->pSrcBufData, - tmp_ptr + buf_offset, pTxBlk->SrcBufLen); - buf_offset += pTxBlk->SrcBufLen; - /* Encrypt the MPDU data by software */ - RTMPSoftEncryptionAction( - pAd, pTxBlk->CipherAlg, (UCHAR *)wifi_hdr, - pTxBlk->pSrcBufData, pTxBlk->SrcBufLen, - pTxBlk->KeyIdx, pTxBlk->pKey, &ext_offset); - pTxBlk->SrcBufLen += ext_offset; - pTxBlk->TotalFrameLen += ext_offset; - } - -#endif /* SOFT_ENCRYPT */ - ret = op->hw_tx(pAd, pTxBlk); - - if (ret != NDIS_STATUS_SUCCESS) - return ret; - -#ifdef SMART_ANTENNA - - if (pTxBlk->pMacEntry) - pTxBlk->pMacEntry->saTxCnt++; - -#endif /* SMART_ANTENNA */ - pAd->RalinkCounters.KickTxCount++; - pAd->RalinkCounters.OneSecTxDoneCount++; -#ifdef SOFT_ENCRYPT - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) { - if ((pTxBlk->CipherAlg == CIPHER_WEP64) || - (pTxBlk->CipherAlg == CIPHER_WEP128)) { - inc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WEP_TSC, - 1); - /* Construct and insert 4-bytes WEP IV header to MPDU header */ - RTMPConstructWEPIVHdr( - pTxBlk->KeyIdx, pTxBlk->pKey->TxTsc, - pHeaderBufPtr - (LEN_WEP_IV_HDR)); - } else if (pTxBlk->CipherAlg == CIPHER_TKIP) - ; - else if (pTxBlk->CipherAlg == CIPHER_AES) { - inc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WPA_TSC, - 1); - /* Construct and insert 8-bytes CCMP header to MPDU header */ - RTMPConstructCCMPHdr( - pTxBlk->KeyIdx, pTxBlk->pKey->TxTsc, - pHeaderBufPtr - (LEN_CCMP_HDR)); - } - } else -#endif /* SOFT_ENCRYPT */ - { - /* Update the frame number, remaining size of the NDIS packet payload. */ - if (fragNum == 0 && pTxBlk->pExtraLlcSnapEncap) - pTxBlk->MpduHeaderLen -= - LENGTH_802_1_H; /* space for 802.11 header. */ - } - - fragNum++; - /* SrcRemainingBytes -= pTxBlk->SrcBufLen; */ - pTxBlk->pSrcBufData += pTxBlk->SrcBufLen; - wifi_hdr->Frag++; /* increase Frag # */ - } while (SrcRemainingBytes > 0); - -#ifdef SOFT_ENCRYPT - - if (tmp_ptr != NULL) - os_free_mem(tmp_ptr); - -#endif /* SOFT_ENCRYPT */ - return NDIS_STATUS_SUCCESS; -} - -INT ap_tx_pkt_handle(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk) -{ - PQUEUE_ENTRY pQEntry; - PNDIS_PACKET pPacket = NULL; - struct wifi_dev_ops *ops = NULL; - MAC_TABLE_ENTRY *pEntry = NULL; - INT32 ret = NDIS_STATUS_SUCCESS; - struct DOT11_H *pDot11h = NULL; - - if (!wdev) { - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - - ops = wdev->wdev_ops; - pDot11h = wdev->pDot11_H; - - if (pDot11h == NULL) - return NDIS_STATUS_FAILURE; - - if ((pDot11h->RDMode != RD_NORMAL_MODE) -#ifdef CARRIER_DETECTION_SUPPORT - || (isCarrierDetectExist(pAd) == TRUE) -#endif /* CARRIER_DETECTION_SUPPORT */ - ) { -#ifdef CONFIG_RCSA_SUPPORT - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - UCHAR *pData = GET_OS_PKT_DATAPTR(pTxBlk->pPacket); - HEADER_802_11 *pHeader_802_11 = - (HEADER_802_11 *)(pData + tx_hw_hdr_len); - - if (!(pTxBlk->TxFrameType == TX_MLME_MGMTQ_FRAME && - pHeader_802_11->FC.SubType == SUBTYPE_ACTION && - pHeader_802_11->Octet[0] == CATEGORY_SPECTRUM && - pHeader_802_11->Octet[1] == SPEC_CHANNEL_SWITCH)) -#endif - { - while (pTxBlk->TxPacketList.Head) { - pQEntry = - RemoveHeadQueue(&pTxBlk->TxPacketList); - pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); - - if (pPacket) - RELEASE_NDIS_PACKET( - pAd, pPacket, - NDIS_STATUS_FAILURE); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--%s(%d)\n", __func__, __LINE__)); - return NDIS_STATUS_FAILURE; - } - } - -#ifdef DOT11K_RRM_SUPPORT -#ifdef QUIET_SUPPORT - - if (IS_RRM_QUIET(wdev)) { - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - -#endif /* QUIET_SUPPORT */ -#endif /* DOT11K_RRM_SUPPORT */ - - switch (pTxBlk->TxFrameType) { - case TX_AMPDU_FRAME: - ret = ops->ampdu_tx(pAd, wdev, pTxBlk); - break; - - case TX_LEGACY_FRAME: - ret = ops->legacy_tx(pAd, wdev, pTxBlk); - break; - - case TX_MCAST_FRAME: - ret = ops->legacy_tx(pAd, wdev, pTxBlk); - break; - - case TX_AMSDU_FRAME: - ret = ops->amsdu_tx(pAd, wdev, pTxBlk); - break; - - case TX_FRAG_FRAME: - ret = ops->frag_tx(pAd, wdev, pTxBlk); - break; - - case TX_MLME_MGMTQ_FRAME: - ret = ops->mlme_mgmtq_tx(pAd, wdev, pTxBlk); - break; - - case TX_MLME_DATAQ_FRAME: - ret = ops->mlme_dataq_tx(pAd, wdev, pTxBlk); - break; -#ifdef CONFIG_ATE - - case TX_ATE_FRAME: - ret = ops->ate_tx(pAd, wdev, pTxBlk); - break; -#endif /* CONFIG_ATE */ - - default: - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Send a pacekt was not classified!!\n")); - - while (pTxBlk->TxPacketList.Head) { - pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); - pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); - - if (pPacket) - RELEASE_NDIS_PACKET(pAd, pPacket, - NDIS_STATUS_FAILURE); - } - - return NDIS_STATUS_FAILURE; - } - - pEntry = - &pAd->MacTab - .Content[(UCHAR)RTMP_GET_PACKET_WCID(pTxBlk->pPacket)]; - INC_COUNTER64(pEntry->TxPackets); - pEntry->TxBytes += pTxBlk->SrcBufLen; - pEntry->OneSecTxBytes += pTxBlk->SrcBufLen; - pEntry->one_sec_tx_pkts++; - return ret; -} - -/* - ======================================================================== - Description: - This routine checks if a received frame causes class 2 or class 3 - error, and perform error action (DEAUTH or DISASSOC) accordingly - ======================================================================== -*/ -BOOLEAN ap_chk_cl2_cl3_err(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - /* software MAC table might be smaller than ASIC on-chip total size. */ - /* If no mathed wcid index in ASIC on chip, do we need more check??? need to check again. 06-06-2006 */ - if (!VALID_UCAST_ENTRY_WCID(pAd, pRxBlk->wcid)) { - MAC_TABLE_ENTRY *pEntry; - - pEntry = MacTableLookup(pAd, pRxBlk->Addr2); - - if (pEntry) - return FALSE; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Rx a frame from %02x:%02x:%02x:%02x:%02x:%02x with WCID(%d) > %d\n", - __func__, PRINT_MAC(pRxBlk->Addr2), pRxBlk->wcid, - GET_MAX_UCAST_NUM(pAd))); - APCls2errAction(pAd, pRxBlk); - return TRUE; - } - - if (pAd->MacTab.Content[pRxBlk->wcid].Sst == SST_ASSOC) - /* okay to receive this DATA frame */ - return FALSE; - else if (pAd->MacTab.Content[pRxBlk->wcid].Sst == SST_AUTH) { - APCls3errAction(pAd, pRxBlk); - return TRUE; - } - APCls2errAction(pAd, pRxBlk); - return TRUE; -} - -VOID ap_rx_error_handle(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - MAC_TABLE_ENTRY *pEntry = NULL; - RXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo; - - if (pRxInfo->CipherErr) { - INC_COUNTER64(pAd->WlanCounters[0].WEPUndecryptableCount); - - if ((pRxInfo->U2M) && - VALID_UCAST_ENTRY_WCID(pAd, pRxBlk->wcid)) { -#ifdef APCLI_SUPPORT -#if defined(APCLI_CERT_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT) - UCHAR Wcid; - - Wcid = pRxBlk->wcid; - - if (VALID_UCAST_ENTRY_WCID(pAd, Wcid)) - pEntry = ApCliTableLookUpByWcid(pAd, Wcid, - pRxBlk->Addr2); - else - pEntry = MacTableLookup(pAd, pRxBlk->Addr2); - - if (pEntry && (IS_ENTRY_APCLI(pEntry) -#ifdef MAC_REPEATER_SUPPORT - || IS_ENTRY_REPEATER(pEntry) -#endif /* MAC_REPEATER_SUPPORT */ - )) { - if ((IS_CIPHER_TKIP_Entry(pEntry)) && - (pRxInfo->CipherErr == 2) && - !(RX_BLK_TEST_FLAG(pRxBlk, - fRX_WCID_MISMATCH))) { - ApCliRTMPReportMicError( - pAd, 1, pEntry->func_tb_idx); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Rx MIC Value error\n")); - } - } else -#endif /* defined(APCLI_CERT_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT) */ -#endif /* APCLI_SUPPORT */ - { - pEntry = &pAd->MacTab.Content[pRxBlk->wcid]; - - /* - MIC error - Before verifying the MIC, the receiver shall check FCS, ICV and TSC. - This avoids unnecessary MIC failure events. - */ - if ((IS_CIPHER_TKIP_Entry(pEntry)) && - (pRxInfo->CipherErr == 2) && - !(RX_BLK_TEST_FLAG(pRxBlk, - fRX_WCID_MISMATCH))) { -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg - .MBSSID[pEntry->func_tb_idx] - .Hostapd == Hostapd_EXT) - ieee80211_notify_michael_failure( - pAd, pRxBlk->pHeader, - (UINT32)pRxBlk->key_idx, - 0); - else -#endif /*HOSTAPD_SUPPORT*/ - { - RTMP_HANDLE_COUNTER_MEASURE( - pAd, pEntry); - } - } - - /* send wireless event - for icv error */ - if ((pRxInfo->CipherErr & 1) == 1) - RTMPSendWirelessEvent( - pAd, IW_ICV_ERROR_EVENT_FLAG, - pEntry->Addr, 0, 0); - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rx u2me Cipher Err(MPDUsize=%d, WCID=%d, CipherErr=%d)\n", - pRxBlk->MPDUtotalByteCnt, pRxBlk->wcid, - pRxInfo->CipherErr)); - } -#ifdef APCLI_SUPPORT -#ifdef APCLI_CERT_SUPPORT - else if (pRxInfo->Mcast || pRxInfo->Bcast) { - pEntry = MacTableLookup(pAd, pRxBlk->Addr2); - - if (pEntry && (IS_ENTRY_APCLI(pEntry) -#ifdef MAC_REPEATER_SUPPORT - || IS_ENTRY_REPEATER(pEntry) -#endif /* MAC_REPEATER_SUPPORT */ - )) { - if ((pRxInfo->CipherErr == 2) && - !(RX_BLK_TEST_FLAG(pRxBlk, - fRX_WCID_MISMATCH))) { - ApCliRTMPReportMicError( - pAd, 0, pEntry->func_tb_idx); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Rx MIC Value error\n")); - } - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rx bc/mc Cipher Err(MPDUsize=%d, WCID=%d, CipherErr=%d)\n", - pRxBlk->MPDUtotalByteCnt, pRxBlk->wcid, - pRxInfo->CipherErr)); - } - -#endif /* APCLI_CERT_SUPPORT */ -#endif /* APCLI_SUPPORT */ - } -} - -#ifdef RLT_MAC_DBG -static int dump_next_valid; -#endif /* RLT_MAC_DBG */ -BOOLEAN ap_check_valid_frame(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - FRAME_CONTROL *FC = (FRAME_CONTROL *)pRxBlk->FC; - BOOLEAN isVaild = FALSE; - - do { - if (FC->ToDs == 0) - break; - -#ifdef IDS_SUPPORT - - if ((FC->FrDs == 0) && - (pRxBlk->wcid == - RESERVED_WCID)) { /* not in RX WCID MAC table */ - if (++pAd->ApCfg.RcvdMaliciousDataCount > - pAd->ApCfg.DataFloodThreshold) - break; - } - -#endif /* IDS_SUPPORT */ - - /* check if Class2 or 3 error */ - if ((FC->FrDs == 0) && (ap_chk_cl2_cl3_err(pAd, pRxBlk))) - break; - - if (pAd->ApCfg.BANClass3Data == TRUE) - break; - - isVaild = TRUE; - } while (0); - - return isVaild; -} - -INT ap_rx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, RX_BLK *pRxBlk) -{ -#if defined(CONFIG_MAP_SUPPORT) || !defined(CUSTOMER_DCC_FEATURE) - RXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo; -#endif - FRAME_CONTROL *pFmeCtrl = (FRAME_CONTROL *)pRxBlk->FC; - MAC_TABLE_ENTRY *pEntry = NULL; - INT hdr_len = 0; - - pEntry = PACInquiry(pAd, pRxBlk->wcid); -#if defined(WDS_SUPPORT) || defined(CLIENT_WDS) || defined(A4_CONN) - - if ((pFmeCtrl->FrDs == 1) && (pFmeCtrl->ToDs == 1)) { -#ifdef CLIENT_WDS - - if (pEntry) { - /* The CLIENT WDS must be a associated STA */ - if (IS_ENTRY_CLIWDS(pEntry)) - ; - else if (IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC)) - SET_ENTRY_CLIWDS(pEntry); - else - return FALSE; - - CliWds_ProxyTabUpdate(pAd, pEntry->Aid, pRxBlk->Addr4); - } - -#endif /* CLIENT_WDS */ - -#ifdef A4_CONN - if (!pEntry) - pEntry = MacTableLookup(pAd, pRxBlk->Addr2); - - if (pEntry && IS_ENTRY_A4(pEntry)) { - MAC_TABLE_ENTRY *pMovedEntry = NULL; - UINT16 ProtoType = 0; - UINT32 ARPSenderIP = 0; - UCHAR *Pos = (pRxBlk->pData + 12); - BOOLEAN bTAMatchSA = - MAC_ADDR_EQUAL(pEntry->Addr, pRxBlk->Addr4); - - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("APRxPktAllow: wdev_idx=0x%x, wdev_type=0x%x, func_idx=0x%x Recvd MWDS Pkt\n", - pEntry->wdev->wdev_idx,pEntry->wdev->wdev_type,pEntry->wdev->func_idx); - */ - - /* if ((((PUCHAR)pRxBlk->pData)[4])& 0x1 == 0x1) - { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,("APRxPktAllow: MWDS Pkt=> wdev_idx=0x%x, wdev_type=0x%x, func_idx=0x%x \nEth Hdr: Dest[%02x-%02x-%02x-%02x-%02x-%02x] Source[%02x-%02x-%02x-%02x-%02x-%02x] Type[%02x-%02x]\n", - pEntry->wdev->wdev_idx,pEntry->wdev->wdev_type,pEntry->wdev->func_idx, - ((PUCHAR)pRxBlk->pData)[4],((PUCHAR)pRxBlk->pData)[5],((PUCHAR)pRxBlk->pData)[6],((PUCHAR)pRxBlk->pData)[7],((PUCHAR)pRxBlk->pData)[8],((PUCHAR)pRxBlk->pData)[9], - ((PUCHAR)pRxBlk->pData)[10],((PUCHAR)pRxBlk->pData)[11],((PUCHAR)pRxBlk->pData)[12],((PUCHAR)pRxBlk->pData)[13],((PUCHAR)pRxBlk->pData)[14],((PUCHAR)pRxBlk->pData)[15], - ((PUCHAR)pRxBlk->pData)[16],((PUCHAR)pRxBlk->pData)[17])); - }*/ - - ProtoType = OS_NTOHS(*((UINT16 *)Pos)); - if (ProtoType == 0x0806) /* ETH_P_ARP */ - NdisCopyMemory(&ARPSenderIP, (Pos + 16), 4); - - /* - It means this source entry has moved to another one and hidden behind it. - So delete this source entry! - */ - if (!bTAMatchSA) { /* TA isn't same with SA case*/ - pMovedEntry = - MacTableLookup(pAd, pRxBlk->Addr4); - if (pMovedEntry -#ifdef AIR_MONITOR - && !IS_ENTRY_MONITOR(pMovedEntry) -#endif /* AIR_MONITOR */ - && IS_ENTRY_CLIENT(pMovedEntry)) { - /* - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("APRxPktAllow: AP found a entry(%02X:%02X:%02X:%02X:%02X:%02X) who has moved to another side! Delete it from MAC table.\n", - PRINT_MAC(pMovedEntry->Addr))); - */ - -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc( - pAd, pMovedEntry->wcid, - REASON_DEAUTH_STA_LEAVING); -#endif - - mac_entry_delete(pAd, pMovedEntry); - } - } - a4_proxy_update(pAd, pEntry->func_tb_idx, pEntry->wcid, - pRxBlk->Addr4, ARPSenderIP); - } else { -#if defined(CONFIG_MAP_SUPPORT) - if (!IS_MAP_ENABLE(pAd) || - (pEntry->DevPeerRole & - BIT(MAP_ROLE_BACKHAUL_STA)) == 0) -#endif - pEntry = NULL; - } -#endif /* A4_CONN */ - -#ifdef WDS_SUPPORT - - if (!pEntry) { - /* - The WDS frame only can go here when in auto learning mode and - this is the first trigger frame from peer - - So we check if this is un-registered WDS entry by call function - "FindWdsEntry()" - */ - if (MAC_ADDR_EQUAL(pRxBlk->Addr1, pAd->CurrentAddress)) - pEntry = FindWdsEntry(pAd, pRxBlk); - - /* have no valid wds entry exist, then discard the incoming packet.*/ - if (!(pEntry && - WDS_IF_UP_CHECK(pAd, pEntry->func_tb_idx))) - return FALSE; - - /*receive corresponding WDS packet, disable TX lock state (fix WDS jam issue) */ - if (pEntry && (pEntry->LockEntryTx == TRUE)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Receive WDS packet, disable TX lock state!\n")); - pEntry->ContinueTxFailCnt = 0; - pEntry->LockEntryTx = FALSE; - /* TODO: shiang-usw, remove upper setting because we need to mirgate to tr_entry! */ - pAd->MacTab.tr_entry[pEntry->wcid] - .ContinueTxFailCnt = 0; - pAd->MacTab.tr_entry[pEntry->wcid].LockEntryTx = - FALSE; - } - } - -#endif /* WDS_SUPPORT */ - - if (pEntry) { -#ifdef WDS_SUPPORT -#ifdef STATS_COUNT_SUPPORT - if (IS_ENTRY_WDS(pEntry)) { - RT_802_11_WDS_ENTRY *pWdsEntry = - &pAd->WdsTab - .WdsEntry[pEntry->func_tb_idx]; - - pWdsEntry->WdsCounter.ReceivedByteCount += - pRxBlk->MPDUtotalByteCnt; - INC_COUNTER64(pWdsEntry->WdsCounter - .ReceivedFragmentCount); - - if (IS_MULTICAST_MAC_ADDR(pRxBlk->Addr3)) - INC_COUNTER64( - pWdsEntry->WdsCounter - .MulticastReceivedFrameCount); - } -#endif /* STATS_COUNT_SUPPORT */ -#endif /* WDS_SUPPORT */ - RX_BLK_SET_FLAG(pRxBlk, fRX_WDS); - hdr_len = LENGTH_802_11_WITH_ADDR4; - return hdr_len; - } - } - -#endif /* defined(WDS_SUPPORT) || defined(CLIENT_WDS) || defined(A4_CONN) */ - - if (!pEntry) { -#ifdef IDS_SUPPORT - - if ((pFmeCtrl->FrDs == 0) && - (pRxBlk->wcid == - RESERVED_WCID)) /* not in RX WCID MAC table */ - pAd->ApCfg.RcvdMaliciousDataCount++; - -#endif /* IDS_SUPPORT */ - return FALSE; - } - - if (!((pFmeCtrl->FrDs == 0) && (pFmeCtrl->ToDs == 1))) { -#ifdef IDS_SUPPORT - - /* - Replay attack detection, - drop it if detect a spoofed data frame from a rogue AP - */ - if (pFmeCtrl->FrDs == 1) - RTMPReplayAttackDetection(pAd, pRxBlk->Addr2, pRxBlk); - -#endif /* IDS_SUPPORT */ - return FALSE; - } - -#ifdef A4_CONN - if (((pFmeCtrl->FrDs == 0) && (pFmeCtrl->ToDs == 1))) { - if ((pFmeCtrl->SubType != SUBTYPE_DATA_NULL) && - (pFmeCtrl->SubType != SUBTYPE_QOS_NULL)) { -#if defined(CONFIG_MAP_SUPPORT) - /* do not receive 3-address broadcast/multicast packet, */ - /* because the broadcast/multicast packet woulld be send using 4-address, */ - /* 1905 message is an exception, need to receive 3-address 1905 multicast, */ - /* because some vendor send only one 3-address 1905 multicast packet */ - /* 1905 daemon would filter and drop duplicate packet */ - if (GET_ENTRY_A4(pEntry) == A4_TYPE_MAP && - (pRxInfo->Mcast || pRxInfo->Bcast) && - (memcmp(pRxBlk->Addr1, multicast_mac_1905, - MAC_ADDR_LEN) != 0)) - return FALSE; -#endif - } - } -#endif /* A4_CONN */ - - /* check if Class2 or 3 error */ - if (ap_chk_cl2_cl3_err(pAd, pRxBlk)) - return FALSE; - - if (pAd->ApCfg.BANClass3Data == TRUE) - return FALSE; - -#ifdef STATS_COUNT_SUPPORT -#ifndef CUSTOMER_DCC_FEATURE - /* Increase received byte counter per BSS */ - if (pFmeCtrl->FrDs == 0 && pRxInfo->U2M) { - BSS_STRUCT *pMbss = pEntry->pMbss; - - if (pMbss != NULL) { - pMbss->ReceivedByteCount += pRxBlk->MPDUtotalByteCnt; - pMbss->RxCount++; - } - } -#endif - if (IS_MULTICAST_MAC_ADDR(pRxBlk->Addr3)) - INC_COUNTER64(pAd->WlanCounters[0].MulticastReceivedFrameCount); - -#endif /* STATS_COUNT_SUPPORT */ - -#ifdef RADIUS_MAC_AUTH_SUPPORT - if (pEntry->wdev->radius_mac_auth_enable) { - if (!pEntry->bAllowTraffic) - return FALSE; - } -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - - hdr_len = LENGTH_802_11; - RX_BLK_SET_FLAG(pRxBlk, fRX_STA); - ASSERT(pEntry->wcid == pRxBlk->wcid); - return hdr_len; -} - -INT ap_rx_ps_handle(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, RX_BLK *pRxBlk) -{ - MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[pRxBlk->wcid]; - FRAME_CONTROL *FC = (FRAME_CONTROL *)pRxBlk->FC; - UCHAR OldPwrMgmt = PWR_ACTIVE; /* 1: PWR_SAVE, 0: PWR_ACTIVE */ - /* 1: PWR_SAVE, 0: PWR_ACTIVE */ - OldPwrMgmt = - RtmpPsIndicate(pAd, pRxBlk->Addr2, pEntry->wcid, FC->PwrMgmt); -#ifdef UAPSD_SUPPORT - - if ((FC->PwrMgmt == PWR_SAVE) && (OldPwrMgmt == PWR_SAVE) && - (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_APSD_CAPABLE)) && - (FC->SubType & 0x08)) { - /* - In IEEE802.11e, 11.2.1.4 Power management with APSD, - If there is no unscheduled SP in progress, the unscheduled SP begins - when the QAP receives a trigger frame from a non-AP QSTA, which is a - QoS data or QoS Null frame associated with an AC the STA has - configured to be trigger-enabled. - - In WMM v1.1, A QoS Data or QoS Null frame that indicates transition - to/from Power Save Mode is not considered to be a Trigger Frame and - the AP shall not respond with a QoS Null frame. - */ - /* Trigger frame must be QoS data or QoS Null frame */ - UCHAR OldUP; - - if (RX_BLK_TEST_FLAG(pRxBlk, fRX_HDR_TRANS)) - OldUP = (*(pRxBlk->pData + 32) & 0x07); - else - OldUP = (*(pRxBlk->pData + LENGTH_802_11) & 0x07); - - UAPSD_TriggerFrameHandle(pAd, pEntry, OldUP); - } - -#endif /* UAPSD_SUPPORT */ - return TRUE; -} - -#ifdef MBSS_AS_WDS_AP_SUPPORT -INT RxWdsPktFw(RTMP_ADAPTER *pAd, struct wifi_dev *bdst_wdev, - struct wifi_dev *wdev, PNDIS_PACKET pPacket, UCHAR wcid) -{ - PNDIS_PACKET pForwardPacket; - - pForwardPacket = DuplicatePacket(wdev->if_dev, pPacket); - - if (pForwardPacket == NULL) - return FALSE; - RTMP_SET_PACKET_WDEV(pForwardPacket, bdst_wdev->wdev_idx); - RTMP_SET_PACKET_WCID(pForwardPacket, wcid); - - RTMP_SET_PACKET_MOREDATA(pForwardPacket, FALSE); - -#ifdef REDUCE_TCP_ACK_SUPPORT - ReduceAckUpdateDataCnx(pAd, pForwardPacket); - - if (ReduceTcpAck(pAd, pForwardPacket) == FALSE) -#endif - { - send_data_pkt(pAd, wdev, pForwardPacket); - } - return TRUE; -} -#endif - -INT ap_rx_pkt_foward(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pPacket) -{ - MAC_TABLE_ENTRY *pEntry = NULL; - BOOLEAN to_os, to_air; - UCHAR *pHeader802_3; - PNDIS_PACKET pForwardPacket; -#ifdef RTMP_UDMA_SUPPORT -#ifdef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - PNDIS_PACKET pSendToOsPacket; -#endif -#endif - BSS_STRUCT *pMbss; - struct wifi_dev *dst_wdev = NULL; - UCHAR wcid; -#ifdef A4_CONN - INT Ret; -#endif /* A4_CONN */ - - if (wdev->func_idx >= HW_BEACON_MAX_NUM) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid func_idx(%d), type(%d)!\n", __func__, - wdev->func_idx, wdev->wdev_type)); - return FALSE; - } - - /* only one connected sta, directly to upper layer */ - if (pAd->MacTab.Size <= 1) - return TRUE; - - /* TODO: shiang-usw, remove pMbss structure here to make it more generic! */ - pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - pHeader802_3 = GET_OS_PKT_DATAPTR(pPacket); - /* by default, announce this pkt to upper layer (bridge) and not to air */ - to_os = TRUE; - to_air = FALSE; - - if (pHeader802_3[0] & 0x01) { - if ((wdev->func_idx < MAX_MBSSID_NUM(pAd)) && - (wdev->func_idx < HW_BEACON_MAX_NUM) && - (pAd->ApCfg.MBSSID[wdev->func_idx].StaCount > 1) - - ) { - /* forward the M/Bcast packet back to air if connected STA > 1 */ - if (pAd->ApCfg.MBSSID[wdev->func_idx] - .IsolateInterStaMBCast == 0) { - to_air = TRUE; - } - } -#ifdef RTMP_UDMA_SUPPORT -#ifdef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - else if (pAd->CommonCfg.bUdmaFlag && (pAd->MacTab.Size > 1)) { - /* forward the M/Bcast packet back to air if connected STA > 1 */ - to_air = TRUE; - } -#endif -#endif -#ifdef MAP_SUPPORT - /* when rx 1905 mc in star topology, directly to upper layer for 1905 to handle */ - if (IS_MAP_ENABLE(wdev) && - (wdev->MAPCfg.DevOwnRole & (BIT(MAP_ROLE_BACKHAUL_BSS))) && - (memcmp(pHeader802_3, multicast_mac_1905, MAC_ADDR_LEN) == - 0)) - return TRUE; -#endif - } else { - /* if destinated STA is a associated wireless STA */ - pEntry = MacTableLookup(pAd, pHeader802_3); - - if (pEntry && pEntry->Sst == SST_ASSOC && pEntry->wdev) { - dst_wdev = pEntry->wdev; - - if (wdev == dst_wdev) { - /* - STAs in same SSID, default send to air and not to os, - but not to air if match following case: - a). pMbss->IsolateInterStaTraffic == TRUE - */ - to_air = TRUE; - to_os = FALSE; - - if (pMbss->IsolateInterStaTraffic == 1) - to_air = FALSE; - } else { - /* - STAs in different SSID, default send to os and not to air - but not to os if match any of following cases: - a). destination VLAN ID != source VLAN ID - b). pAd->ApCfg.IsolateInterStaTrafficBTNBSSID - */ - to_os = TRUE; - to_air = FALSE; -#ifdef RTMP_UDMA_SUPPORT -#ifdef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - if (pAd->CommonCfg.bUdmaFlag) { - /* - default send to air and not to os, - but not to air if match following case: - a). destination VLAN ID != source VLAN ID - b). pAd->ApCfg.IsolateInterStaTrafficBTNBSSID - */ - to_os = FALSE; - to_air = TRUE; - } -#endif -#endif - - if (pAd->ApCfg.IsolateInterStaTrafficBTNBSSID == - 1 || - (wdev->VLAN_VID != dst_wdev->VLAN_VID)) { - to_os = FALSE; -#ifdef RTMP_UDMA_SUPPORT -#ifdef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - to_air = FALSE; -#endif -#endif - } - } - } -#ifdef A4_CONN - else if ((((!pEntry) -#ifdef AIR_MONITOR - || (pEntry && IS_ENTRY_MONITOR(pEntry)) -#endif - ) && - a4_proxy_lookup(pAd, wdev->func_idx, pHeader802_3, - FALSE, TRUE, &wcid))) { - if (VALID_WCID(wcid)) - pEntry = &pAd->MacTab.Content[wcid]; - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - to_os = FALSE; - to_air = TRUE; - dst_wdev = pEntry->wdev; - } - } -#endif /* A4_CONN */ - -#ifdef MBSS_AS_WDS_AP_SUPPORT -#ifdef CLIENT_WDS - else if ((!pEntry) -#ifdef AIR_MONITOR - || (pEntry && IS_ENTRY_MONITOR(pEntry)) -#endif - ) { - PUCHAR pEntryAddr = - CliWds_ProxyLookup(pAd, pHeader802_3); - - if ((pEntryAddr != NULL) && - (!MAC_ADDR_EQUAL(pEntryAddr, pHeader802_3 + 6))) { - pEntry = MacTableLookup(pAd, pEntryAddr); - if (pEntry && (pEntry->Sst == SST_ASSOC) && - pEntry->wdev -#ifndef RTMP_UDMA_SUPPORT -#ifndef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - && (!pEntry->wdev->bVLAN_Tag) -#endif -#endif - ) { -#ifndef RTMP_UDMA_SUPPORT -#ifndef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - to_os = FALSE; - to_air = TRUE; -#endif -#endif - dst_wdev = pEntry->wdev; - if (wdev == dst_wdev) { - /* - STAs in same SSID, default send to air and not to os, - but not to air if match following case: - a). pMbss->IsolateInterStaTraffic == TRUE - */ - to_air = TRUE; - to_os = FALSE; - if (pMbss->IsolateInterStaTraffic == - 1) - to_air = FALSE; - } else { - /* - STAs in different SSID, default send to os and not to air - but not to os if match any of following cases: - a). destination VLAN ID != source VLAN ID - b). pAd->ApCfg.IsolateInterStaTrafficBTNBSSID - */ - to_os = TRUE; - to_air = FALSE; -#ifdef RTMP_UDMA_SUPPORT -#ifdef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - if (pAd->CommonCfg.bUdmaFlag) { - /* - default send to air and not to os, - but not to air if match following case: - a). destination VLAN ID != source VLAN ID - b). pAd->ApCfg.IsolateInterStaTrafficBTNBSSID - */ - to_os = FALSE; - to_air = TRUE; - } -#endif -#endif - if (pAd->ApCfg.IsolateInterStaTrafficBTNBSSID == - 1 || - (wdev->VLAN_VID != - dst_wdev->VLAN_VID)) { - to_os = FALSE; -#ifdef RTMP_UDMA_SUPPORT -#ifdef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - to_air = FALSE; -#endif -#endif - } - } - } - } - } -#endif /* CLIENT_WDS */ -#endif - } -#ifdef RTMP_UDMA_SUPPORT -#ifdef ALLOW_INTER_STA_TRAFFIC_BTN_BSSID - /*for M/Bcast Traffic */ - if (pAd->CommonCfg.bUdmaFlag && !pEntry && to_air) { - UCHAR wcid; - struct wifi_dev *bdst_wdev = NULL; - INT MbssIdx = 0; - - if (to_os) { - pSendToOsPacket = - DuplicatePacket(wdev->if_dev, pPacket); - if (pSendToOsPacket == NULL) - return to_os; -#if defined(CONFIG_WIFI_PKT_FWD) - if (wf_fwd_needed_hook != NULL && - wf_fwd_needed_hook() == TRUE) - set_wf_fwd_cb(pAd, pSendToOsPacket, wdev); -#endif /* CONFIG_WIFI_PKT_FWD */ - announce_802_3_packet(pAd, pSendToOsPacket, - pAd->OpMode); - } - - /* Remove the 4-byte vlan header from tagged packets */ - if (((GET_OS_PKT_DATAPTR(pPacket))[12] == 0x81) && - ((GET_OS_PKT_DATAPTR(pPacket))[13] == 0x00)) { - memmove((GET_OS_PKT_DATAPTR(pPacket)) + 4, - (GET_OS_PKT_DATAPTR(pPacket)), 12); - skb_pull(pPacket, 4); - } - - for (MbssIdx = 0; MbssIdx < pAd->ApCfg.BssidNum; MbssIdx++) { - if (!RtmpOSNetDevIsUp( - pAd->ApCfg.MBSSID[MbssIdx].wdev.if_dev)) - continue; - bdst_wdev = &pAd->ApCfg.MBSSID[MbssIdx].wdev; - - if ((wdev == bdst_wdev) && bdst_wdev->wds_enable && - (pMbss->StaCount <= 1)) - continue; - - if ((wdev == bdst_wdev) && (pMbss->StaCount <= 1)) - continue; - - if (wdev->VLAN_VID != bdst_wdev->VLAN_VID) - continue; - - if (!bdst_wdev->wds_enable) { - wcid = bdst_wdev->tr_tb_idx; - if (!RxWdsPktFw(pAd, bdst_wdev, wdev, pPacket, - wcid)) - return to_os; - } else if (bdst_wdev->wds_enable) { - MAC_TABLE_ENTRY *pWdsEntry = NULL; - PUCHAR pEntryWdsAddr = NULL; - UINT32 i; - - pWdsEntry = - MacTableLookup(pAd, pHeader802_3 + 6); - if (!pWdsEntry) { - pEntryWdsAddr = - (PUCHAR)CliWds_ProxyLookup( - pAd, pHeader802_3 + 6); - if (pEntryWdsAddr != NULL) - pEntry = MacTableLookup( - pAd, pEntryWdsAddr); - } - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); - i++) { - PMAC_TABLE_ENTRY pEntryWds = - &pAd->MacTab.Content[i]; - - if ((pEntryWds->Sst != SST_ASSOC) && - (pEntryWds->wdev != bdst_wdev)) - continue; - - if (pEntry && - MAC_ADDR_EQUAL(pEntry->Addr, - pEntryWds->Addr)) - continue; - - wcid = pEntryWds->wcid; - - if (!RxWdsPktFw(pAd, bdst_wdev, wdev, - pPacket, wcid)) - return to_os; - } - } - } - if (to_os == TRUE) - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); - } else -#endif /*ALLOW_INTER_STA_TRAFFIC_BTN_BSSID */ -#endif /* RTMP_UDMA_SUPPORT */ - - if (to_air) { -#ifdef MAP_TS_TRAFFIC_SUPPORT - if (pAd->bTSEnable) - pForwardPacket = - CopyPacket(wdev->if_dev, pPacket); - else -#endif - pForwardPacket = - DuplicatePacket(wdev->if_dev, pPacket); - -#ifdef RTMP_UDMA_SUPPORT - if (to_os) { -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - if ((wf_drv_tbl.wf_fwd_needed_hook != NULL) && - (wf_drv_tbl.wf_fwd_needed_hook() == TRUE)) - set_wf_fwd_cb(pAd, pPacket, wdev); -#endif /* CONFIG_WIFI_PKT_FWD */ - announce_802_3_packet(pAd, pPacket, - pAd->OpMode); - } -#endif - if (pForwardPacket == NULL) - return to_os; - - /* 1.1 apidx != 0, then we need set packet mbssid attribute. */ - if (pEntry) { - wcid = pEntry->wcid; - RTMP_SET_PACKET_WDEV(pForwardPacket, - dst_wdev->wdev_idx); - RTMP_SET_PACKET_WCID(pForwardPacket, wcid); - } else { /* send bc/mc frame back to the same bss */ - wcid = wdev->tr_tb_idx; - RTMP_SET_PACKET_WDEV(pForwardPacket, - wdev->wdev_idx); - RTMP_SET_PACKET_WCID(pForwardPacket, wcid); - } - - RTMP_SET_PACKET_MOREDATA(pForwardPacket, FALSE); - -#ifdef REDUCE_TCP_ACK_SUPPORT - ReduceAckUpdateDataCnx(pAd, pForwardPacket); - - if (ReduceTcpAck(pAd, pForwardPacket) == FALSE) -#endif - { -#ifndef A4_CONN - send_data_pkt(pAd, wdev, pForwardPacket); -#else - RTMP_SET_PACKET_A4_FWDDATA(pForwardPacket, TRUE); - Ret = send_data_pkt(pAd, wdev, - pForwardPacket); // rakesh: recheck - /* send bc/mc frame back to the same bss */ - if ((pHeader802_3[0] & 0x01) && - (Ret == NDIS_STATUS_SUCCESS)) - a4_send_clone_pkt(pAd, wdev->func_idx, pPacket, - pHeader802_3 + MAC_ADDR_LEN); -#endif /* A4_CONN */ - } - } -#ifdef RTMP_UDMA_SUPPORT - if (to_os == FALSE) { - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): No need to send to OS!\n", __func__)); - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); -#ifdef CUT_THROUGH_DBG - pAd->RxDropPacket++; -#endif - } - return (to_os & (!to_air)); -#endif - - return to_os; -} - -INT ap_ieee_802_3_data_rx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - RX_BLK *pRxBlk, MAC_TABLE_ENTRY *pEntry) -{ - RXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo; - UCHAR wdev_idx = BSS0; - BOOLEAN bFragment = FALSE; - FRAME_CONTROL *pFmeCtrl = (FRAME_CONTROL *)pRxBlk->FC; - struct wifi_dev_ops *ops = wdev->wdev_ops; -#ifdef TXRX_STAT_SUPPORT - struct hdev_obj *hdev = (struct hdev_obj *)wdev->pHObj; -#endif - wdev_idx = wdev->wdev_idx; - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): wcid=%d, wdev_idx=%d, pRxBlk->Flags=0x%x, fRX_AP/STA/ADHOC=0x%x/0x%x/0x%x, Type/SubType=%d/%d, FrmDS/ToDS=%d/%d\n", - __func__, pEntry->wcid, wdev->wdev_idx, pRxBlk->Flags, - RX_BLK_TEST_FLAG(pRxBlk, fRX_AP), - RX_BLK_TEST_FLAG(pRxBlk, fRX_STA), - RX_BLK_TEST_FLAG(pRxBlk, fRX_ADHOC), pFmeCtrl->Type, - pFmeCtrl->SubType, pFmeCtrl->FrDs, pFmeCtrl->ToDs)); - - /* Gather PowerSave information from all valid DATA frames. IEEE 802.11/1999 p.461 */ - /* must be here, before no DATA check */ - if (ops->rx_ps_handle) - ops->rx_ps_handle(pAd, wdev, pRxBlk); - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - if (IS_SUPPORT_V10_DFS(pAd) && - (((FRAME_CONTROL *)pRxBlk->FC)->Type == FC_TYPE_DATA)) - pEntry->LastRxTimeCount = 0; -#endif - - pEntry->NoDataIdleCount = 0; - pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0; - pEntry->RxBytes += pRxBlk->MPDUtotalByteCnt; -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd)) - pEntry->RxBytesMAP += pRxBlk->MPDUtotalByteCnt; -#endif - pEntry->OneSecRxBytes += pRxBlk->MPDUtotalByteCnt; - pAd->RxTotalByteCnt += pRxBlk->MPDUtotalByteCnt; - INC_COUNTER64(pEntry->RxPackets); - pEntry->one_sec_rx_pkts++; -#ifdef TXRX_STAT_SUPPORT - if ((pEntry != NULL) && IS_ENTRY_CLIENT(pEntry)) { - INC_COUNTER64(pEntry->RxDataPacketCount); - INC_COUNTER64(pEntry->RxUnicastPktCount); - INC_COUNTER64(pEntry->pMbss->stat_bss.RxUnicastDataPacket); - INC_COUNTER64(pEntry->pMbss->stat_bss.RxDataPacketCount); - INC_COUNTER64(hdev->rdev->pRadioCtrl->RxDataPacketCount); - pEntry->RxDataPacketByte.QuadPart += pRxBlk->MPDUtotalByteCnt; - pEntry->RxUnicastByteCount.QuadPart += pRxBlk->MPDUtotalByteCnt; - pEntry->pMbss->stat_bss.RxDataPayloadByte.QuadPart += - (pRxBlk->MPDUtotalByteCnt - 14); - pEntry->pMbss->stat_bss.RxDataPacketByte.QuadPart += - pRxBlk->MPDUtotalByteCnt; - hdev->rdev->pRadioCtrl->RxDataPacketByte.QuadPart += - pRxBlk->MPDUtotalByteCnt; - if (CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_WMM_CAPABLE)) { - INC_COUNTER64( - pEntry->RxDataPacketCountPerAC - [WMM_UP2AC_MAP[pRxBlk->UserPriority]]); - INC_COUNTER64( - pEntry->pMbss->stat_bss.RxDataPacketCountPerAC - [WMM_UP2AC_MAP[pRxBlk->UserPriority]]); - INC_COUNTER64( - hdev->rdev->pRadioCtrl->RxDataPacketCountPerAC - [WMM_UP2AC_MAP[pRxBlk->UserPriority]]); - } - { - int ant_idx; - for (ant_idx = 0; ant_idx < 4; ant_idx++) { - pEntry->LastDataPktRssi[ant_idx] = ConvertToRssi( - pAd, - (struct raw_rssi_info - *)(&pRxBlk->rx_signal - .raw_rssi[0]), - ant_idx); - hdev->rdev->pRadioCtrl->LastDataPktRssi - [ant_idx] = ConvertToRssi( - pAd, - (struct raw_rssi_info - *)(&pRxBlk->rx_signal - .raw_rssi[0]), - ant_idx); - } - } - } -#endif -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) || \ - defined(MAP_R2) - if (pFmeCtrl->FrDs == 0 && pRxInfo->U2M && - pRxBlk->bss_idx < pAd->ApCfg.BssidNum) { -#if defined(CUSTOMER_DCC_FEATURE) || defined(MAP_R2) - UCHAR *pDA = pRxBlk->Addr3; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[pRxBlk->bss_idx]; - pMbss->ReceivedByteCount += pRxBlk->MPDUtotalByteCnt; - pMbss->RxCount++; - if (((*pDA) & 0x1) == 0x01) { - if (IS_BROADCAST_MAC_ADDR(pDA)) { - pMbss->bcPktsRx++; - pMbss->bcBytesRx += pRxBlk->MPDUtotalByteCnt; - } else { - pMbss->mcPktsRx++; - pMbss->mcBytesRx += pRxBlk->MPDUtotalByteCnt; - } - } else { - pMbss->ucPktsRx++; - pMbss->ucBytesRx += pRxBlk->MPDUtotalByteCnt; - } - -#ifdef CUSTOMER_DCC_FEATURE - pEntry->ReceivedByteCount += pRxBlk->MPDUtotalByteCnt; - pEntry->RxCount++; - - if (pRxBlk->rx_signal.raw_snr[0]) { - Update_Snr_Sample(pAd, pEntry, &pRxBlk->rx_signal); - } -#endif -#endif -#ifdef CUSTOMER_RSG_FEATURE - pAd->RadioStatsCounter.RxDataCount++; -#endif - } -#endif - - if (((FRAME_CONTROL *)pRxBlk->FC)->SubType & 0x08) { - if (pAd->MacTab.Content[pRxBlk->wcid] - .BARecWcidArray[pRxBlk->TID] != 0) - pRxInfo->BA = 1; - else - pRxInfo->BA = 0; - - if (pRxBlk->AmsduState) - RX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU); - - if (pRxInfo->BA) - RX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU); - } - - /*check if duplicate frame, ignore it and then drop*/ - if (rx_chk_duplicate_frame(pAd, pRxBlk, wdev) == NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): duplicate frame drop it!\n", __func__)); - return FALSE; - } - - if ((pRxBlk->FN == 0) && (pFmeCtrl->MoreFrag != 0)) { - bFragment = TRUE; - de_fragment_data_pkt(pAd, pRxBlk); - } - - if (pRxInfo->U2M) - pEntry->LastRxRate = (ULONG)(pRxBlk->rx_rate.word); - -#ifdef IGMP_SNOOP_SUPPORT - - if ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_WDS(pEntry)) && - (wdev->IgmpSnoopEnable) && IS_MULTICAST_MAC_ADDR(pRxBlk->Addr3)) { - PUCHAR pDA = pRxBlk->Addr3; - PUCHAR pSA = pRxBlk->Addr2; - PUCHAR pData = pRxBlk->pData + 12; - UINT16 protoType = OS_NTOHS(*((UINT16 *)(pData))); - INT IpHeaderLen; - UCHAR IgmpVerType; - PUCHAR pIgmpHeader; - PUCHAR pGroupIpAddr; - UCHAR GroupMacAddr[6]; - PUCHAR pGroupMacAddr = (PUCHAR)&GroupMacAddr; - USHORT HashIdx; - MULTICAST_FILTER_TABLE_ENTRY *pEntry_Igmp = NULL; - MULTICAST_FILTER_TABLE_ENTRY *pPrevEntry_Igmp = NULL; - PMULTICAST_FILTER_TABLE pMulticastFilterTable = - pAd->pMulticastFilterTable; -#ifdef MAP_TS_TRAFFIC_SUPPORT - /*when TS enable, for igmp need skip vlan header before handle*/ - if (pAd->bTSEnable) { - if (RTMPEqualMemory(pData, TPID, 2)) { - pData += LENGTH_802_1Q; - protoType = OS_NTOHS(*((UINT16 *)(pData))); - } - } -#endif - if (protoType == ETH_P_IP) - IGMPSnooping(pAd, pDA, pSA, pData, pEntry, - pRxBlk->wcid); - else if (protoType == ETH_P_IPV6) - MLDSnooping(pAd, pDA, pSA, pData, pEntry, pRxBlk->wcid); - - if (isIgmpPkt(pDA, pData)) { - IpHeaderLen = (*(pData + 2) & 0x0f) * 4; - pIgmpHeader = pData + 2 + IpHeaderLen; - IgmpVerType = (UCHAR)(*(pIgmpHeader)); - - if (IgmpVerType == IGMP_LEAVE_GROUP) { - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: Receive IGMP Leave Pkt, type=%0x\n", - __func__, IgmpVerType)); - pGroupIpAddr = (PUCHAR)(pIgmpHeader + 4); - ConvertMulticastIP2MAC(pGroupIpAddr, - (PUCHAR *)&pGroupMacAddr, - ETH_P_IP); - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: IGMP Group=%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, PRINT_MAC(GroupMacAddr))); - - if (pMulticastFilterTable == NULL) - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: Multicase filter table is not ready.\n", - __func__)); - else { - RTMP_SEM_LOCK( - &pMulticastFilterTable - ->MulticastFilterTabLock); - HashIdx = MULTICAST_ADDR_HASH_INDEX( - GroupMacAddr); - pPrevEntry_Igmp = pEntry_Igmp = - pMulticastFilterTable - ->Hash[HashIdx]; - while (pEntry_Igmp && - pEntry_Igmp->Valid) { - if ((pEntry_Igmp->net_dev == - wdev->if_dev) && - MAC_ADDR_EQUAL( - pEntry_Igmp->Addr, - GroupMacAddr)) - break; - else { - pPrevEntry_Igmp = - pEntry_Igmp; - pEntry_Igmp = - pEntry_Igmp - ->pNext; - } - } - - /*Drop this IGMP Leave Pkt*/ - if (pEntry_Igmp != NULL) { - MTWF_LOG( - DBG_CAT_RX, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: Find IGMP group entry,IGMP Group=%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, - PRINT_MAC( - pEntry_Igmp - ->Addr))); - - if (IgmpMemberCnt( - &pEntry_Igmp - ->MemberList) > - 0) { - MTWF_LOG( - DBG_CAT_RX, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: Receive IGMP Leave Pkt,igmp group id has other member, membercnt=%d\r\n", - __func__, - IgmpMemberCnt( - &pEntry_Igmp - ->MemberList))); - RTMP_SEM_UNLOCK( - &pMulticastFilterTable - ->MulticastFilterTabLock); - return FALSE; - } - } - RTMP_SEM_UNLOCK( - &pMulticastFilterTable - ->MulticastFilterTabLock); - } - } - } - } - -#ifdef IGMP_TVM_SUPPORT - /* Convert Unicast Rx packet from AP to Multicast */ - if (IS_ENTRY_APCLI(pEntry) && !IS_BM_MAC_ADDR(pRxBlk->Addr1) && - IS_IGMP_TVM_MODE_EN(wdev->IsTVModeEnable)) { - ConvertUnicastMacToMulticast(pAd, wdev, pRxBlk); - } -#endif /* IGMP_TVM_SUPPORT */ -#endif /* IGMP_SNOOP_SUPPORT */ - - if (pRxBlk->pRxPacket) { - RTMP_SET_PACKET_WCID(pRxBlk->pRxPacket, pRxBlk->wcid); - rx_802_3_data_frm_announce(pAd, pEntry, pRxBlk, pEntry->wdev); - } - - return TRUE; -} - -INT ap_ieee_802_11_data_rx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - RX_BLK *pRxBlk, MAC_TABLE_ENTRY *pEntry) -{ - RXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo; - FRAME_CONTROL *pFmeCtrl = (FRAME_CONTROL *)pRxBlk->FC; - BOOLEAN bFragment = FALSE; - UCHAR wdev_idx = BSS0; - UCHAR UserPriority = 0; - INT hdr_len = LENGTH_802_11; - COUNTER_RALINK *pCounter = &pAd->RalinkCounters; - UCHAR *pData; - BOOLEAN drop_err = TRUE; -#if defined(SOFT_ENCRYPT) || defined(ADHOC_WPA2PSK_SUPPORT) - NDIS_STATUS status; -#endif /* defined(SOFT_ENCRYPT) || defined(ADHOC_WPA2PSK_SUPPORT) */ - struct wifi_dev_ops *ops = wdev->wdev_ops; - - wdev_idx = wdev->wdev_idx; - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): wcid=%d, wdev_idx=%d, pRxBlk->Flags=0x%x, fRX_AP/STA/ADHOC=0x%x/0x%x/0x%x, Type/SubType=%d/%d, FrmDS/ToDS=%d/%d\n", - __func__, pEntry->wcid, wdev->wdev_idx, pRxBlk->Flags, - RX_BLK_TEST_FLAG(pRxBlk, fRX_AP), - RX_BLK_TEST_FLAG(pRxBlk, fRX_STA), - RX_BLK_TEST_FLAG(pRxBlk, fRX_ADHOC), pFmeCtrl->Type, - pFmeCtrl->SubType, pFmeCtrl->FrDs, pFmeCtrl->ToDs)); - /* Gather PowerSave information from all valid DATA frames. IEEE 802.11/1999 p.461 */ - /* must be here, before no DATA check */ - pData = pRxBlk->FC; - - if (ops->rx_ps_handle) - ops->rx_ps_handle(pAd, wdev, pRxBlk); - - pEntry->NoDataIdleCount = 0; - pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0; - /* - update RxBlk->pData, DataSize, 802.11 Header, QOS, HTC, Hw Padding - */ - -#if defined(A4_CONN) || defined(APCLI_AS_WDS_STA_SUPPORT) - if (RX_BLK_TEST_FLAG(pRxBlk, fRX_WDS)) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - - pData = pRxBlk->FC; - /* 1. skip 802.11 HEADER */ - pData += hdr_len; - pRxBlk->DataSize -= hdr_len; - - /* 2. QOS */ - if (pFmeCtrl->SubType & 0x08) { - UserPriority = *(pData)&0x0f; - - if (pAd->MacTab.Content[pRxBlk->wcid] - .BARecWcidArray[pRxBlk->TID] != 0) - pRxInfo->BA = 1; - else - pRxInfo->BA = 0; - - /* bit 7 in QoS Control field signals the HT A-MSDU format */ - if ((*pData) & 0x80) { - RX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU); - pCounter->RxAMSDUCount.u.LowPart++; - } - - if (pRxInfo->BA) { - RX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU); - /* incremented by the number of MPDUs */ - /* received in the A-MPDU when an A-MPDU is received. */ - pCounter->MPDUInReceivedAMPDUCount.u.LowPart++; - } - - /* skip QOS contorl field */ - pData += 2; - pRxBlk->DataSize -= 2; - } - - pRxBlk->UserPriority = UserPriority; - - /*check if duplicate frame, ignore it and then drop*/ - if (rx_chk_duplicate_frame(pAd, pRxBlk, wdev) == NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): duplicate frame drop it!\n", __func__)); - return FALSE; - } - - /* 3. Order bit: A-Ralink or HTC+ */ - if (pFmeCtrl->Order) { -#ifdef AGGREGATION_SUPPORT - - /* TODO: shiang-MT7603, fix me, because now we don't have rx_rate.field.MODE can refer */ - if ((pRxBlk->rx_rate.field.MODE <= MODE_OFDM) && - (CLIENT_STATUS_TEST_FLAG( - pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE))) - RX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK); - else -#endif /* AGGREGATION_SUPPORT */ - { -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - struct _RTMP_CHIP_CAP *cap = - hc_get_chip_cap(pAd->hdev_ctrl); - - if (cap->FlgHwTxBfCap && (pFmeCtrl->SubType & 0x08)) - handleHtcField(pAd, pRxBlk); - -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - /* skip HTC control field */ - pData += 4; - pRxBlk->DataSize -= 4; - } - } - - Update_Rssi_Sample(pAd, &pEntry->RssiSample, &pRxBlk->rx_signal, - pRxBlk->rx_rate.field.MODE, - pRxBlk->rx_rate.field.BW); - - /* Drop NULL, CF-ACK(no data), CF-POLL(no data), and CF-ACK+CF-POLL(no data) data frame */ - if (pFmeCtrl->SubType & 0x04) { /* bit 2 : no DATA */ - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): Null/QosNull frame!\n", __func__)); - drop_err = FALSE; -#ifdef CUSTOMER_RSG_FEATURE - /* Add Qos Null Data frame to Rx data count */ - pAd->RadioStatsCounter.RxDataCount++; -#endif - return FALSE; - } - - /* 4. skip HW padding */ - if (pRxInfo->L2PAD) { - /* just move pData pointer because DataSize excluding HW padding */ - RX_BLK_SET_FLAG(pRxBlk, fRX_PAD); - pData += 2; - } - - pRxBlk->pData = pData; -#if defined(SOFT_ENCRYPT) || defined(ADHOC_WPA2PSK_SUPPORT) - - /* Use software to decrypt the encrypted frame if necessary. - If a received "encrypted" unicast packet(its WEP bit as 1) - and it's passed to driver with "Decrypted" marked as 0 in RxInfo. - */ - if (!IS_HIF_TYPE(pAd, HIF_MT)) { - if ((pFmeCtrl->Wep == 1) && (pRxInfo->Decrypted == 0)) { -#ifdef HDR_TRANS_SUPPORT - - if (RX_BLK_TEST_FLAG(pRxBlk, fRX_HDR_TRANS)) { - status = RTMPSoftDecryptionAction( - pAd, pRxBlk->FC, UserPriority, - &pEntry->PairwiseKey, - pRxBlk->pTransData + 14, - &(pRxBlk->TransDataSize)); - } else -#endif /* HDR_TRANS_SUPPORT */ - { - CIPHER_KEY *pSwKey = &pEntry->PairwiseKey; - - status = RTMPSoftDecryptionAction( - pAd, pRxBlk->FC, UserPriority, pSwKey, - pRxBlk->pData, &(pRxBlk->DataSize)); - } - - if (status != NDIS_STATUS_SUCCESS) { - RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, - NDIS_STATUS_FAILURE); - return; - } - - /* Record the Decrypted bit as 1 */ - pRxInfo->Decrypted = 1; - } - } - -#endif /* SOFT_ENCRYPT || ADHOC_WPA2PSK_SUPPORT */ -#ifdef SMART_ANTENNA - - if (RTMP_SA_WORK_ON(pAd)) - sa_pkt_radio_info_update(pAd, pRxBlk, pEntry); - -#endif /* SMART_ANTENNA */ - - pEntry->NoDataIdleCount = 0; - /* TODO: shiang-usw, remove upper setting becasue we need to migrate to tr_entry! */ - pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0; - - if (pRxInfo->U2M) { - Update_Rssi_Sample(pAd, &pAd->ApCfg.RssiSample, - &pRxBlk->rx_signal, - pRxBlk->rx_rate.field.MODE, - pRxBlk->rx_rate.field.BW); - pAd->ApCfg.NumOfAvgRssiSample++; - pEntry->LastRxRate = (ULONG)(pRxBlk->rx_rate.word); -#ifdef TXBF_SUPPORT - - if (pRxBlk->rx_rate.field.ShortGI) - pEntry->OneSecRxSGICount++; - else - pEntry->OneSecRxLGICount++; - -#endif /* TXBF_SUPPORT */ -#ifdef DBG_DIAGNOSE - - if (pAd->DiagStruct.inited) { - struct dbg_diag_info *diag_info; - - diag_info = - &pAd->DiagStruct - .diag_info[pAd->DiagStruct.ArrayCurIdx]; - diag_info->RxDataCnt++; - } - -#endif /* DBG_DIAGNOSE */ - } - - wdev->LastSNR0 = (UCHAR)(pRxBlk->rx_signal.raw_snr[0]); - wdev->LastSNR1 = (UCHAR)(pRxBlk->rx_signal.raw_snr[1]); - pEntry->freqOffset = (CHAR)(pRxBlk->rx_signal.freq_offset); - pEntry->freqOffsetValid = TRUE; - - if ((pRxBlk->FN != 0) || (pFmeCtrl->MoreFrag != 0)) { - bFragment = TRUE; - de_fragment_data_pkt(pAd, pRxBlk); - } - - if (pRxBlk->pRxPacket) { - /* - process complete frame which encrypted by TKIP, - Minus MIC length and calculate the MIC value - */ - if (bFragment && (pFmeCtrl->Wep) && - IS_CIPHER_TKIP_Entry(pEntry)) { - pRxBlk->DataSize -= 8; - - if (rtmp_chk_tkip_mic(pAd, pEntry, pRxBlk) == FALSE) - return TRUE; - } - - pEntry->RxBytes += pRxBlk->MPDUtotalByteCnt; -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd)) - pEntry->RxBytesMAP += pRxBlk->MPDUtotalByteCnt; -#endif - pAd->RxTotalByteCnt += pRxBlk->MPDUtotalByteCnt; - INC_COUNTER64(pEntry->RxPackets); - pEntry->one_sec_rx_pkts++; -#ifdef CUSTOMER_RSG_FEATURE - pAd->RadioStatsCounter.RxDataCount++; -#endif -#ifdef CUSTOMER_DCC_FEATURE - if (pRxBlk->rx_signal.raw_snr[0]) { - Update_Snr_Sample(pAd, pEntry, &pRxBlk->rx_signal); - } -#endif -#ifdef MAC_REPEATER_SUPPORT - - if (IS_ENTRY_APCLI(pEntry)) - RTMP_SET_PACKET_WCID(pRxBlk->pRxPacket, pRxBlk->wcid); - -#endif /* MAC_REPEATER_SUPPORT */ -#ifdef IGMP_SNOOP_SUPPORT - - if ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_WDS(pEntry)) && - (wdev->IgmpSnoopEnable) && - IS_MULTICAST_MAC_ADDR(pRxBlk->Addr3)) { - PUCHAR pDA = pRxBlk->Addr3; - PUCHAR pSA = pRxBlk->Addr2; - PUCHAR pData = - NdisEqualMemory(SNAP_802_1H, pRxBlk->pData, 6) ? - (pRxBlk->pData + 6) : - pRxBlk->pData; - UINT16 protoType = OS_NTOHS(*((UINT16 *)(pData))); - - if (protoType == ETH_P_IP) - IGMPSnooping(pAd, pDA, pSA, pData, pEntry, - pRxBlk->wcid); - else if (protoType == ETH_P_IPV6) - MLDSnooping(pAd, pDA, pSA, pData, pEntry, - pRxBlk->wcid); - } - -#endif /* IGMP_SNOOP_SUPPORT */ - - if (RX_BLK_TEST_FLAG(pRxBlk, fRX_HDR_TRANS)) - rx_802_3_data_frm_announce(pAd, pEntry, pRxBlk, wdev); - else - rx_data_frm_announce(pAd, pEntry, pRxBlk, wdev); - } - - return TRUE; -} - -BOOLEAN ap_dev_rx_mgmt_frm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - MAC_TABLE_ENTRY *pEntry) -{ - RXINFO_STRUC *pRxInfo = pRxBlk->pRxInfo; - INT op_mode = OPMODE_AP; - FRAME_CONTROL *FC = (FRAME_CONTROL *)pRxBlk->FC; -#ifdef IDS_SUPPORT - - /* - Check if a rogue AP impersonats our mgmt frame to spoof clients - drop it if it's a spoofed frame - */ - if (RTMPSpoofedMgmtDetection(pAd, pRxBlk)) - return FALSE; - - /* update sta statistics for traffic flooding detection later */ - RTMPUpdateStaMgmtCounter(pAd, FC->SubType); -#endif /* IDS_SUPPORT */ - - if (!pRxInfo->U2M) { - if ((FC->SubType != SUBTYPE_BEACON) && - (FC->SubType != SUBTYPE_PROBE_REQ)) { - BOOLEAN bDrop = TRUE; -#ifdef DOT11W_PMF_SUPPORT - /* For PMF TEST Plan 5.4.3.1 & 5.4.3.2 */ -#ifdef APCLI_SUPPORT - - if (pEntry && ((FC->SubType == SUBTYPE_DISASSOC) || - (FC->SubType == SUBTYPE_DEAUTH))) { - if (IS_ENTRY_APCLI(pEntry)) - bDrop = FALSE; - } - -#endif /* APCLI_SUPPORT */ -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef APCLI_SUPPORT -#ifdef APCLI_CERT_SUPPORT - - if (pAd->bApCliCertTest == TRUE) { - if ((FC->SubType == SUBTYPE_ACTION) && - (pEntry) && IS_ENTRY_APCLI(pEntry)) - bDrop = FALSE; - } - -#endif /* APCLI_CERT_SUPPOR */ -#endif /* APCLI_SUPPORT */ -#if defined(FTM_SUPPORT) || defined(CONFIG_HOTSPOT) - - if (IsPublicActionFrame(pAd, (VOID *)FC)) - bDrop = FALSE; - -#endif /* defined(FTM_SUPPORT) || defined(CONFIG_HOTSPOT) */ -#ifdef CUSTOMER_DCC_FEATURE - if (bDrop && (pRxBlk->bss_idx < pAd->ApCfg.BssidNum)) { - BSS_STRUCT *pMbss = - &pAd->ApCfg.MBSSID[pRxBlk->bss_idx]; - pMbss->MGMTRxDropCount++; - } -#endif - if (bDrop == TRUE) - return FALSE; - } - } - - /* Software decrypt WEP data during shared WEP negotiation */ - if ((FC->SubType == SUBTYPE_AUTH) && (FC->Wep == 1) && - (pRxInfo->Decrypted == 0)) { - UCHAR *pMgmt = (PUCHAR)FC; - UINT16 mgmt_len = pRxBlk->MPDUtotalByteCnt; - UCHAR DefaultKeyId; - - if (!pEntry) { - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR: SW decrypt WEP data fails - the Entry is empty.\n")); -#ifdef CUSTOMER_DCC_FEATURE - if (pRxBlk->bss_idx < pAd->ApCfg.BssidNum) { - BSS_STRUCT *pMbss = - &pAd->ApCfg.MBSSID[pRxBlk->bss_idx]; - pMbss->MGMTRxErrorCount++; - } -#endif - return FALSE; - } - - /* Skip 802.11 header */ - pMgmt += LENGTH_802_11; - mgmt_len -= LENGTH_802_11; -#ifdef CONFIG_AP_SUPPORT - DefaultKeyId = pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.SecConfig.PairwiseKeyId; -#endif /* CONFIG_AP_SUPPORT */ - - /* handle WEP decryption */ - if (RTMPSoftDecryptWEP( - &pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.SecConfig.WepKey[DefaultKeyId], - pMgmt, &mgmt_len) == FALSE) { -#ifdef WIFI_DIAG - if (IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, - pEntry->Addr, DIAG_CONN_AUTH_FAIL, - REASON_DECRYPTION_FAIL); -#endif - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR: SW decrypt WEP data fails.\n")); -#ifdef CUSTOMER_DCC_FEATURE - if (pRxBlk->bss_idx < pAd->ApCfg.BssidNum) { - BSS_STRUCT *pMbss = - &pAd->ApCfg.MBSSID[pRxBlk->bss_idx]; - pMbss->MGMTRxErrorCount++; - } -#endif - - return FALSE; - } - -#ifdef RT_BIG_ENDIAN - /* swap 16 bit fields - Auth Alg No. field */ - *(USHORT *)pMgmt = SWAP16(*(USHORT *)pMgmt); - /* swap 16 bit fields - Auth Seq No. field */ - *(USHORT *)(pMgmt + 2) = SWAP16(*(USHORT *)(pMgmt + 2)); - /* swap 16 bit fields - Status Code field */ - *(USHORT *)(pMgmt + 4) = SWAP16(*(USHORT *)(pMgmt + 4)); -#endif /* RT_BIG_ENDIAN */ - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Decrypt AUTH seq#3 successfully\n")); - /* Update the total length */ - pRxBlk->DataSize -= (LEN_WEP_IV_HDR + LEN_ICV); - } - - if (pEntry && (FC->SubType == SUBTYPE_ACTION)) { - /* only PM bit of ACTION frame can be set */ - if (((op_mode == OPMODE_AP) && IS_ENTRY_CLIENT(pEntry)) || - ((op_mode == OPMODE_STA) && (IS_ENTRY_TDLS(pEntry)))) - RtmpPsIndicate(pAd, pRxBlk->Addr2, pRxBlk->wcid, - FC->PwrMgmt); - - /* - In IEEE802.11, 11.2.1.1 STA Power Management modes, - The Power Managment bit shall not be set in any management - frame, except an Action frame. - - In IEEE802.11e, 11.2.1.4 Power management with APSD, - If there is no unscheduled SP in progress, the unscheduled SP - begins when the QAP receives a trigger frame from a non-AP QSTA, - which is a QoS data or QoS Null frame associated with an AC the - STA has configured to be trigger-enabled. - So a management action frame is not trigger frame. - */ - } -#ifdef CUSTOMER_DCC_FEATURE - if (!(ApScanRunning(pAd, NULL))) { - if (FC->FrDs == 0 && pRxBlk->pRxInfo->U2M && - pRxBlk->bss_idx < pAd->ApCfg.BssidNum) { - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[pRxBlk->bss_idx]; - if ((pEntry != NULL) && (pEntry->Sst == SST_ASSOC)) { - pMbss->MGMTReceivedByteCount += - pRxBlk->MPDUtotalByteCnt; - pMbss->MGMTRxCount++; - } - } - } -#endif -#ifdef TXRX_STAT_SUPPORT - if (!(ApScanRunning(pAd, NULL))) { - int ant_idx; - struct hdev_ctrl *ctrl = (struct hdev_ctrl *)pAd->hdev_ctrl; - HTTRANSMIT_SETTING last_mgmt_rx_rate; - ULONG MgmtRate; - if ((pEntry != NULL) && IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC || - FC->SubType == SUBTYPE_ASSOC_REQ)) { - UCHAR band_idx = HcGetBandByWdev(pEntry->wdev); - INC_COUNTER64( - pEntry->pMbss->stat_bss.RxMgmtPacketCount); - INC_COUNTER64(pEntry->RxMgmtPacketCount); - INC_COUNTER64(ctrl->rdev[band_idx] - .pRadioCtrl->RxMgmtPacketCount); - last_mgmt_rx_rate = pRxBlk->rx_rate; - getRate(last_mgmt_rx_rate, &MgmtRate); - pEntry->RxLastMgmtPktRate = MgmtRate; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rx-Pkt Src Address : %02x:%02x:%02x:%02x:%02x:%02x\n", - pRxBlk->Addr2[0], pRxBlk->Addr2[1], - pRxBlk->Addr2[2], pRxBlk->Addr2[3], - pRxBlk->Addr2[4], pRxBlk->Addr2[5])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Rx Mgmt Subtype : %d\n", FC->SubType)); - for (ant_idx = 0; ant_idx < 4; ant_idx++) - pEntry->LastMgmtPktRssi[ant_idx] = ConvertToRssi( - pAd, - (struct raw_rssi_info - *)(&pRxBlk->rx_signal - .raw_rssi[0]), - ant_idx); - } - } -#endif -#ifdef CONVERTER_MODE_SWITCH_SUPPORT -#ifdef CONFIG_AP_SUPPORT - if (((FC->Type == FC_TYPE_MGMT) && - ((FC->SubType == SUBTYPE_ASSOC_REQ) || - (FC->SubType == SUBTYPE_REASSOC_REQ) || - (FC->SubType == SUBTYPE_PROBE_REQ))) && - (pAd->ApCfg.MBSSID[0].APStartPseduState != - AP_STATE_ALWAYS_START_AP_DEFAULT)) { - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Ignore mgmt packet\n", __func__)); - return TRUE; - } -#endif /* CONFIG_AP_SUPPORT */ -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - - /* Signal in MLME_QUEUE isn't used, therefore take this item to save min SNR. */ - { - RXD_BASE_STRUCT *rxd_base = - (RXD_BASE_STRUCT *)pRxBlk->rmac_info; - struct wifi_dev *wdev = NULL; - - if (pRxBlk->wcid != RESERVED_WCID) - wdev = pAd->MacTab.Content[pRxBlk->wcid].wdev; - else - wdev = pAd->wdev_list[0]; - REPORT_MGMT_FRAME_TO_MLME( - pAd, pRxBlk->wcid, FC, pRxBlk->DataSize, - pRxBlk->rx_signal.raw_rssi[0], - pRxBlk->rx_signal.raw_rssi[1], - pRxBlk->rx_signal.raw_rssi[2], - pRxBlk->rx_signal.raw_rssi[3], -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - pRxBlk->rx_signal.raw_snr[0], - pRxBlk->rx_signal.raw_snr[1], - pRxBlk->rx_signal.raw_snr[2], - pRxBlk->rx_signal.raw_snr[3], -#endif - min(pRxBlk->rx_signal.raw_snr[0], - pRxBlk->rx_signal.raw_snr[1]), - (rxd_base != NULL) ? rxd_base->RxD1.ChFreq : 0, op_mode, - wdev, /*pAd->wdev_list[0],*/ - pRxBlk->rx_rate.field.MODE); - } - return TRUE; -} - -struct wifi_dev_ops ap_wdev_ops = { - .tx_pkt_allowed = ap_tx_pkt_allowed, - .fp_tx_pkt_allowed = ap_fp_tx_pkt_allowed, - .send_data_pkt = ap_send_data_pkt, - .fp_send_data_pkt = fp_send_data_pkt, - .send_mlme_pkt = ap_send_mlme_pkt, - .tx_pkt_handle = ap_tx_pkt_handle, - .legacy_tx = ap_legacy_tx, - .ampdu_tx = ap_ampdu_tx, - .frag_tx = ap_frag_tx, - .amsdu_tx = ap_amsdu_tx, - .fill_non_offload_tx_blk = ap_fill_non_offload_tx_blk, - .fill_offload_tx_blk = ap_fill_offload_tx_blk, - .mlme_mgmtq_tx = ap_mlme_mgmtq_tx, - .mlme_dataq_tx = ap_mlme_dataq_tx, -#ifdef CONFIG_ATE - .ate_tx = mt_ate_tx, -#endif - .ieee_802_11_data_tx = ap_ieee_802_11_data_tx, - .ieee_802_3_data_tx = ap_ieee_802_3_data_tx, - .rx_pkt_allowed = ap_rx_pkt_allowed, - .rx_ps_handle = ap_rx_ps_handle, - .rx_pkt_foward = ap_rx_pkt_foward, - .ieee_802_3_data_rx = ap_ieee_802_3_data_rx, - .ieee_802_11_data_rx = ap_ieee_802_11_data_rx, - .find_cipher_algorithm = ap_find_cipher_algorithm, - .mac_entry_lookup = mac_entry_lookup, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_ftkd.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_ftkd.c deleted file mode 100644 index 276a0ee7b0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_ftkd.c +++ /dev/null @@ -1,1607 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - All related IEEE802.11r Key Distribution Protocol (FT KDP) body. - - Overview: - - 1. A station associates to us, send out a broadcast ADD-Notify packet. - - ASSOC --> - FT_KDP_EVENT_INFORM(FT_KDP_SIG_FT_ASSOCIATION) --> - FT_KDP_EventInform(FT_KDP_SIG_FT_ASSOCIATION) --> - Notify IAPP daemon, IAPP_RcvHandlerRawDrv(), IAPP_SIG_Process() --> - Send ADD-Notify packet, IAPP_UDP_PacketSend(), IAPP_L2UpdateFrameSend() - - 2. When receiving a ADD-Notify packet, send a unicast SSB packet to - request PMK-R1 key for the station with our R0KH. - - IAPP daemon, IAPP_RcvHandlerUdp() --> - Notify driver, IAPP_MsgProcess() --> - IOCTL, RTMPAPSetInformation() --> - FT_KDP_StationInform() --> - Notify IAPP daemon, FT_KDP_EventInform(FT_KDP_SIG_KEY_REQ_AUTO) --> - Notify IAPP daemon, IAPP_RcvHandlerRawDrv(), IAPP_SIG_Process() --> - Send SSB packet with R0KHID = 0, by using TCP or UDP based on peerIP - - 3. A station reassociates to us, send out a MOVE-Request packet. - - REASSOC --> - FT_KDP_EVENT_INFORM(FT_KDP_SIG_FT_REASSOCIATION) --> - FT_KDP_EventInform(FT_KDP_SIG_FT_REASSOCIATION) --> - Notify IAPP daemon, IAPP_RcvHandlerRawDrv(), IAPP_SIG_Process() --> - Send MOVE-Request packet by using TCP or UDP, IAPP_L2UpdateFrameSend() - - 4. When receiving a MOVE-Request packet, delete the STA MAC entry. - - IAPP daemon, IAPP_RcvHandlerUdp()/ IAPP_RcvHandlerTcp() --> - Notify driver, IAPP_MsgProcess() --> - IOCTL, RTMPAPSetInformation() --> - RT_SET_DEL_MAC_ENTRY --> - Send MOVE-Response packet by using TCP, FT_KDP_MoveFrameSend() - - 5. When receiving a MOVE-Response packet, nothing to do. - - 6. When receiving a SSB packet (i.e. key request), send a unicast SAB - packet to response the key to the R1KH. - - IAPP daemon --> - Notify driver, IAPP_MsgProcess() --> - IOCTL, RTMPAPSetInformation() --> - FT_KDP_IOCTL_KEY_REQ() --> - Notify IAPP daemon, FT_KDP_EventInform(FT_KDP_SIG_KEY_RSP_AUTO) --> - Send SAB packet with my R0KHID, FT_KDP_SecurityBlockSend() by using TCP - - 7. When receiving a SAB packet (i.e. key response), set the PMK-R1 key. - - IAPP daemon --> - Notify driver, IAPP_MsgProcess() --> - IOCTL, RTMPAPSetInformation() --> - FT_KDP_KeyResponseToUs() - - 8. Send a information broadcast to the LAN periodically. - -***************************************************************************/ - -#ifdef DOT11R_FT_SUPPORT - -#include "rt_config.h" -#include "ft_cmm.h" - -#define TYPE_FUNC -#define FT_KDP_DEBUG -#define FT_KDP_FUNC_TEST -/*#define FT_KDP_EMPTY */ /* empty codes to debug */ - -#define IAPP_DAEMON_CMD_PARSE(__pInfo, __InfoLen, __PeerIP, __pData, \ - __DataLen) \ - do { \ - NdisMoveMemory(&__PeerIP, __pInfo, FT_IP_ADDRESS_SIZE); \ - __pData = (UCHAR *)(__pInfo + FT_IP_ADDRESS_SIZE); \ - __DataLen = __InfoLen - FT_IP_ADDRESS_SIZE; \ - } while (0) - -/* private variable */ -UINT32 FT_KDP_MemAllocNum, FT_KDP_MemFreeNum; - -/* extern variable */ -#ifdef FT_KDP_FUNC_TEST -extern UCHAR gFT_MAC_OldAP[]; -#endif /* FT_KDP_FUNC_TEST */ - -/* private function prototype */ -#ifdef FT_KDP_FUNC_R0KH_IP_RECORD -BOOLEAN FT_KDP_R0KH_InfoAdd(IN PRTMP_ADAPTER pAd, IN UCHAR *pR0KHID, - IN UCHAR *pMAC, IN UINT32 IP); -VOID FT_KDP_R0KH_InfoDel(IN PRTMP_ADAPTER pAd, IN UCHAR *pR0KHID, - IN UCHAR *pMAC, IN UINT32 IP); -static BOOLEAN FT_KDP_R0KH_InfoGet(IN PRTMP_ADAPTER pAd, INOUT UCHAR *pR0KHID, - INOUT UCHAR *pMAC, OUT UINT32 *pIP); -#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */ - -/* public function */ -/* -======================================================================== -Routine Description: - Initialize FT KDP Module. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_Init(IN PRTMP_ADAPTER pAd) -{ -#ifndef FT_KDP_EMPTY - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 1) - return; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> Initialize FT KDP Module...\n")); - /* allocate control block */ - FT_MEM_ALLOC(pAd, &pAd->ApCfg.FtTab.pFT_KDP_Ctrl_BK, - sizeof(FT_KDP_CTRL_BLOCK)); - - if (pAd->ApCfg.FtTab.pFT_KDP_Ctrl_BK == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> Allocate control block fail!\n")); - return; - } - - NdisAllocateSpinLock(pAd, &(pAd->ApCfg.FtTab.FT_KdpLock)); -#ifndef FT_KDP_FUNC_SOCK_COMM - /* init event list */ - initList(&(FT_KDP_CB->EventList)); -#endif /* FT_KDP_FUNC_SOCK_COMM */ -#ifdef FT_KDP_FUNC_R0KH_IP_RECORD - /* init R0KH information record */ - FT_KDP_CB->R0KH_InfoHead = NULL; - FT_KDP_CB->R0KH_InfoTail = NULL; - FT_KDP_CB->R0KH_Size = 0; -#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */ -#ifdef FT_KDP_FUNC_INFO_BROADCAST - RTMPInitTimer(pAd, &FT_KDP_CB->TimerReport, - GET_TIMER_FUNCTION(FT_KDP_InfoBroadcast), (PVOID)pAd, - TRUE); - RTMPSetTimer(&FT_KDP_CB->TimerReport, FT_KDP_INFO_BC_PERIOD_TIME); -#endif /* FT_KDP_FUNC_INFO_BROADCAST */ -#endif /* FT_KDP_EMPTY */ - pAd->ApCfg.FtTab.FlgIsFtKdpInit = 1; -} - -/* -======================================================================== -Routine Description: - Release FT KDP Module. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_Release(IN PRTMP_ADAPTER pAd) -{ -#ifndef FT_KDP_EMPTY -#ifdef FT_KDP_FUNC_R0KH_IP_RECORD - FT_KDP_R0KH_INFO *pInfoHead = NULL, *pInfo = NULL; -#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */ - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) - return; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> Release FT KDP Module...\n")); -#ifndef FT_KDP_FUNC_SOCK_COMM - /* free event list */ - FT_KDP_EVT_LIST_EMPTY(pAd, &(FT_KDP_CB->EventList)); -#endif /* FT_KDP_FUNC_SOCK_COMM */ -#ifdef FT_KDP_FUNC_R0KH_IP_RECORD - /* free all R0KH information */ - if (FT_KDP_CB != NULL) - pInfoHead = FT_KDP_CB->R0KH_InfoHead; - - while (pInfoHead != NULL) { - pInfo = pInfoHead; - pInfoHead = pInfoHead->pNext; - FT_MEM_FREE(pAd, pInfo); - } - -#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */ - - if (pAd->ApCfg.FtTab.pFT_KDP_Ctrl_BK != NULL) { - FT_MEM_FREE(pAd, pAd->ApCfg.FtTab.pFT_KDP_Ctrl_BK); - pAd->ApCfg.FtTab.pFT_KDP_Ctrl_BK = NULL; - } - -#ifdef FT_KDP_FUNC_INFO_BROADCAST - { - BOOLEAN Status; - - RTMPCancelTimer(&FT_KDP_CB->TimerReport, &Status); - } -#endif /* FT_KDP_FUNC_INFO_BROADCAST */ - /* free spin lock */ - NdisFreeSpinLock(&(pAd->ApCfg.FtTab.FT_KdpLock)); -#endif /* FT_KDP_EMPTY */ - pAd->ApCfg.FtTab.FlgIsFtKdpInit = 0; -} - -/* -======================================================================== -Routine Description: - Inform us a event occurs. - -Arguments: - pAd - WLAN control block pointer - ApIdx - MBSS ID - EventId - which event, such as FT_KDP_SIG_FT_ASSOCIATION - *pEvent - event body - EventLen - event body length - PeerIP - peer IP address - pCB - for special use (such as FT_KDP_SIG_ACTION) - -Return Value: - None - -Note: - EventId *pEvent - -------------------------------------------------------------------- - FT_KDP_SIG_FT_ASSOCIATION FT_KDP_EVT_ASSOC - FT_KDP_SIG_FT_REASSOCIATION FT_KDP_EVT_REASSOC - FT_KDP_SIG_KEY_TIMEOUT yet implement - FT_KDP_SIG_KEY_REQ FT_KDP_EVT_KEY_ELM - FT_KDP_SIG_ACTION WLAN Frame Body (Start from Category field) - pCB == FT_KDP_EVT_ACTION - -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_EventInform(IN PRTMP_ADAPTER pAd, IN UINT32 ApIdx, - IN UCHAR EventId, IN VOID *pEvent, - IN UINT16 EventLen, IN UINT32 PeerIP, - IN VOID *pCB) -{ -#ifndef FT_KDP_EMPTY -#ifndef FT_KDP_FUNC_SOCK_COMM - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR Size; -#endif /* FT_KDP_FUNC_SOCK_COMM */ - FT_KDP_SIGNAL *pFtKdp; - FT_KDP_EVT_HEADER EvtHdr; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - -#ifndef FT_KDP_FUNC_SOCK_COMM - if (CHECK_PID_LEGALITY(pObj->IappPid)) { - /* valid, can do next step */ - } else - return; - - FT_KDP_EVT_LIST_SIZE_GET(pAd, &FT_KDP_CB->EventList, Size); - - if (Size > FT_KDP_EVENT_MAX) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Queued Events are too much!\n")); - return; - } - -#endif /* FT_KDP_FUNC_SOCK_COMM */ - /* make up event content */ - NdisZeroMemory(&EvtHdr, sizeof(FT_KDP_EVT_HEADER)); - FT_MEM_ALLOC(pAd, &pFtKdp, sizeof(FT_KDP_SIGNAL)); - - if (pFtKdp == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Allocate signal content fail!\n")); - return; - } - - pFtKdp->Sig = EventId; - - /* handle different event */ - switch (EventId) { - case FT_KDP_SIG_FT_ASSOCIATION: { - /* a station associates to us */ - /* - When a STA uses the 802.11 Association Request, rather than - the Reassociation Request, the IAPP may not be able to notify - the AP at which the STA was previously associated of the new - association. - */ - FT_KDP_EVT_ASSOC *pEvtAssoc; - - pEvtAssoc = (FT_KDP_EVT_ASSOC *)pEvent; - pFtKdp->Sequence = pEvtAssoc->SeqNum; - NdisMoveMemory(pFtKdp->MacAddr, pEvtAssoc->MacAddr, - MAC_ADDR_LEN); - } break; - - case FT_KDP_SIG_FT_REASSOCIATION: { - /* a station reassociates to us */ - /* - IEEE802.11f, 1.3 Inter-AP recommended practice overview - - In particular, the IAPP entity must be able to find and use - a RADIUS server to look up the IP addresses of other APs in - the ESS when given the Basic Service Set Identifier (BSSIDs) - of those other APs (if a local capability to perform such a - translation is not present), and to obtain security information - to protect the content of certain IAPP packets. - - Here we dont use any Radius server so sometimes we can not - send the MOVE-notify frame. - */ - /* - The IAPP is not a routing protocol. The IAPP does not deal - directly with the delivery of 802.11 data frames to the STA; - instead the DS utilizes existing network functionality for - data frame delivery. - - When a STA associates or reassociates, the STA must ascertain - that its network layer address(es) is configured such that the - normal routing functions of the network attaching to the BSS - will correctly deliver the STA¡¦s traffic to the BSS to which - it is associated. - - Two mechanisms for a STA to accomplish this are to renew a - Dynamic Host Configuration Protocol (DHCP) lease for its IP - address and to use Mobile IP to obtain a local IP address. - */ - FT_KDP_EVT_REASSOC *pEvtReAssoc; - - pEvtReAssoc = (FT_KDP_EVT_REASSOC *)pEvent; - pFtKdp->Sequence = pEvtReAssoc->SeqNum; - NdisMoveMemory(pFtKdp->MacAddr, pEvtReAssoc->MacAddr, - MAC_ADDR_LEN); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> The previous AP showed in Reassoc is =%02x:%02x:%02x:%02x:%02x:%02x\n", - pEvtReAssoc->OldApMacAddr[0], - pEvtReAssoc->OldApMacAddr[1], - pEvtReAssoc->OldApMacAddr[2], - pEvtReAssoc->OldApMacAddr[3], - pEvtReAssoc->OldApMacAddr[4], - pEvtReAssoc->OldApMacAddr[5])); - - /* try to get the IP of old AP */ - if (FT_KDP_R0KH_InfoGet(pAd, NULL, pEvtReAssoc->OldApMacAddr, - &PeerIP) == FALSE) { - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Send Move notify to Peer IP = %d.%d.%d.%d!\n", - (UINT)(htonl(PeerIP) >> 24) & 0xFF, - (UINT)(htonl(PeerIP) >> 16) & 0xFF, - (UINT)(htonl(PeerIP) >> 8) & 0xFF, - (UINT)(htonl(PeerIP) & 0xFF))); - } break; - - case FT_KDP_SIG_KEY_TIMEOUT: - /* PMK-R1 Key timeout */ - break; - - case FT_KDP_SIG_KEY_REQ: { - FT_KDP_EVT_KEY_ELM *pEvtKeyReq; - - /* PMK-R1 Key Request */ - if (PeerIP != 0) - break; - - /* try to find the Peer IP address */ - pEvtKeyReq = (FT_KDP_EVT_KEY_ELM *)pEvent; - - if (FT_KDP_R0KH_InfoGet(pAd, pEvtKeyReq->KeyInfo.R0KHID, NULL, - &PeerIP) == FALSE) { - /* send a broadcast key request packet */ - } - } break; - - case FT_KDP_SIG_ACTION: { - /* forward FT Action frame by using RRB protocol */ - FT_KDP_EVT_ACTION *pActionCB = (FT_KDP_EVT_ACTION *)pCB; - - if (pCB == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> pCB == NULL!\n")); - FT_MEM_FREE(pAd, pFtKdp); - return; - } - - pFtKdp->Sequence = pActionCB->RequestType; - NdisMoveMemory(pFtKdp->MacAddr, pActionCB->MacDa, ETH_ALEN); - NdisMoveMemory(pFtKdp->MacAddrSa, pActionCB->MacSa, ETH_ALEN); - NdisMoveMemory(pFtKdp->CurrAPAddr, pActionCB->MacAp, ETH_ALEN); - } break; - - case FT_KDP_SIG_KEY_REQ_AUTO: - /* PMK-R1 Key Request */ - break; - - case FT_KDP_SIG_KEY_RSP_AUTO: - /* PMK-R1 Key Response */ - break; - - case FT_KDP_SIG_INFO_BROADCAST: - /* broadcast our AP information to neighbor APs */ - break; - - case FT_KDP_SIG_AP_INFO_REQ: - /* request neighbor AP information */ - break; - - case FT_KDP_SIG_AP_INFO_RSP: - /* response my information to a AP */ - break; - - case FT_KSP_SIG_DEBUG_TRACE: - /* change the debug level of IAPP daemon */ - break; - - case FT_KDP_SIG_TERMINATE: - /* terminate FT KDP daemon */ - break; - - default: - /* error event */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Signal is not supported %d!\n", EventId)); - FT_MEM_FREE(pAd, pFtKdp); - return; - } - - /* init event content */ - EvtHdr.PeerIpAddr = PeerIP; - EvtHdr.EventLen = EventLen; - NdisMoveMemory(pFtKdp->Content, &EvtHdr, sizeof(FT_KDP_EVT_HEADER)); - - if (pEvent != NULL) { - NdisMoveMemory(pFtKdp->Content + sizeof(FT_KDP_EVT_HEADER), - pEvent, EventLen); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Event ID = %d, EventLen = %d (%d, %d)\n", EventId, - EventLen, FT_KDP_MemAllocNum, FT_KDP_MemFreeNum)); -#ifndef FT_KDP_FUNC_SOCK_COMM - /* insert to the event queue */ - FT_KDP_EVT_LIST_INSERT_TAIL(pAd, &FT_KDP_CB->EventList, pFtKdp); - - /* inform FT KDP daemon to handle the event */ - if ((EventId == FT_KDP_SIG_TERMINATE) || - (EventId == FT_KSP_SIG_DEBUG_TRACE) || - (EventId == FT_KDP_SIG_FT_ASSOCIATION) || - (EventId == FT_KDP_SIG_FT_REASSOCIATION) || - (EventId == FT_KDP_SIG_KEY_REQ) || - (EventId == FT_KDP_SIG_KEY_TIMEOUT)) { - /* - Note: in VxWorks, we can not send any signal to same task - which issues a ioctl path. - */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Send signal to ft kdp daemon... (EventLen = %d)\n", - EventLen)); - SendSignalToDaemon(SIGUSR2, pObj->IappPid, pObj->IappPid_nr); - } /* End of if */ - -#endif /* FT_KDP_FUNC_SOCK_COMM */ -#ifdef FT_KDP_FUNC_SOCK_COMM - /* inform FT KDP daemon to handle the event */ - { - FT_DRV_ETH_HEADER Hdr8023, *pHdr8023 = &Hdr8023; - NDIS_PACKET *pPktComm; - UINT32 FrameLen; -#ifdef FT_OS_VXWORKS - END_OBJ *pEndEth; -#endif /* FT_OS_VXWORKS */ - /* allocate a rx packet */ - pPktComm = RtmpOSNetPktAlloc(pAd, sizeof(RT_SIGNAL_STRUC) + - LENGTH_802_3); - - if (pPktComm != NULL) { - /* make up 802.3 header */ - NdisMoveMemory(pHdr8023->DA, - pAd->ApCfg.MBSSID[ApIdx].wdev.bssid, - MAC_ADDR_LEN); - /* can not send a packet with same SA & DA in 5VT board */ - /* NdisMoveMemory(pHdr8023->SA, pAd->ApCfg.MBSSID[ApIdx].Bssid, 6); */ - NdisZeroMemory(pHdr8023->SA, ETH_ALEN); - pHdr8023->SA[5] = 0x01; - pHdr8023->Len = IAPP_ETH_PRO; - /* convert 802.11 to 802.3 packet */ -#ifdef FT_OS_VXWORKS - pEndEth = endFindByName("mirror", 0); - - if (pEndEth != NULL) { - /* - Sometimes if I use ra0 to send the command packet, daemon - can not receive the command packet! - So I use bridge to do the receive network interface. - - Support IEEE802.11r DS, must have bridge network interface. - */ - SET_OS_PKT_NETDEV(pPktComm, - pEndEth->devObject.pDevice); - } else -#endif /* FT_OS_VXWORKS */ - SET_OS_PKT_NETDEV(pPktComm, - get_netdev_from_bssid(pAd, - ApIdx)); - - OS_PKT_RESERVE(RTPKT_TO_OSPKT(pPktComm), - 2); /* 16 byte align the IP header */ - NdisMoveMemory( - OS_PKT_TAIL_BUF_EXTEND(RTPKT_TO_OSPKT(pPktComm), - LENGTH_802_3), - pHdr8023, LENGTH_802_3); - FrameLen = RT_SIGNAL_STRUC_HDR_SIZE + - sizeof(FT_KDP_EVT_HEADER) + EventLen; - NdisMoveMemory( - OS_PKT_TAIL_BUF_EXTEND(RTPKT_TO_OSPKT(pPktComm), - FrameLen), - pFtKdp, FrameLen); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Send a command (MBSS%d, Frame Len%d) to IAPP daemon.\n", - ApIdx, FrameLen)); - /* pass this packet to upper layer */ - announce_802_3_packet(pAd, pPktComm, OPMODE_AP); - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Allocate signal to ft kdp daemon fail!\n")); - } - } -#endif -#ifdef FT_KDP_FUNC_SOCK_COMM - FT_MEM_FREE(pAd, pFtKdp); -#endif /* FT_KDP_FUNC_SOCK_COMM */ -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Get a event. - -Arguments: - pAd - WLAN control block pointer - **pFtKdp - the queued event; if NULL, no event is queued. - -Return Value: - None - -Note: - Used in IOCTL from FT KDP daemon. -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_EventGet(IN PRTMP_ADAPTER pAd, OUT FT_KDP_SIGNAL **pFtKdp) -{ -#ifndef FT_KDP_EMPTY -#ifndef FT_KDP_FUNC_SOCK_COMM - UCHAR Size; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* init */ - FT_KDP_EVT_LIST_SIZE_GET(pAd, &FT_KDP_CB->EventList, Size); - - /* check if any event is queued */ - if (Size <= 0) { - *pFtKdp = NULL; - return; - } - - /* return a event */ - FT_KDP_EVT_LIST_REMOVE_HEAD(pAd, &FT_KDP_CB->EventList, (*pFtKdp)); -#else - *pFtKdp = NULL; -#endif /* FT_KDP_FUNC_SOCK_COMM */ -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Inform us a AP request the key. - -Arguments: - pAd - WLAN control block pointer - PeerIP - the IP of R1KH, must not be 0 - *pNonce - the nonce for key request - *pEvtKeyReq - information for key request - -Return Value: - TRUE - request ok - FALSE - can not find the IP of R0KH - -Note: - If PeerIP == 0, search its IP from our information record. -======================================================================== -*/ -BOOLEAN TYPE_FUNC FT_KDP_KeyRequestToUs(IN PRTMP_ADAPTER pAd, IN UINT32 PeerIP, - IN UCHAR *pNonce, - IN FT_KDP_EVT_KEY_ELM *pEvtKeyReq) -{ -#ifndef FT_KDP_EMPTY - UINT32 IDR0KH; - UINT32 ApIdx = BSS0; - MAC_TABLE_ENTRY *pEntry = NULL; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Req from Peer IP = %d.%d.%d.%d!\n", - (htonl(PeerIP) >> 24) & 0xFF, (htonl(PeerIP) >> 16) & 0xFF, - (htonl(PeerIP) >> 8) & 0xFF, (htonl(PeerIP) & 0xFF))); - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return FALSE; - } - - if (PeerIP == 0) - return FALSE; - - /* sanity check for R0KHID */ -#ifdef FT_KDP_DEBUG - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Req: R0KH-ID = 0x%02x:%02x:%02x:%02x:%02x:%02x!\n", - pEvtKeyReq->KeyInfo.R0KHID[0], pEvtKeyReq->KeyInfo.R0KHID[1], - pEvtKeyReq->KeyInfo.R0KHID[2], pEvtKeyReq->KeyInfo.R0KHID[3], - pEvtKeyReq->KeyInfo.R0KHID[4], pEvtKeyReq->KeyInfo.R0KHID[5])); -#endif /* FT_KDP_DEBUG */ - - for (IDR0KH = 0; IDR0KH < FT_KDP_R0KHID_MAX_SIZE; IDR0KH++) { - if (pEvtKeyReq->KeyInfo.R0KHID[IDR0KH] != 0x00) { - /* check if the R0KHID is same as us (MBSS); if not, return FALSE */ - /* yet implement */ - } - } - - /* check if the request format is correct */ - if ((pEvtKeyReq->ElmId == FT_KDP_ELM_ID_PRI) && - (pEvtKeyReq->OUI[0] == FT_KDP_ELM_PRI_OUI_0) && - (pEvtKeyReq->OUI[1] == FT_KDP_ELM_PRI_OUI_1) && - (pEvtKeyReq->OUI[2] == FT_KDP_ELM_PRI_OUI_2)) { -#ifdef FT_KDP_DEBUG - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Req: Station MAC = 0x%02x:%02x:%02x:%02x:%02x:%02x!\n", - pEvtKeyReq->MacAddr[0], pEvtKeyReq->MacAddr[1], - pEvtKeyReq->MacAddr[2], pEvtKeyReq->MacAddr[3], - pEvtKeyReq->MacAddr[4], pEvtKeyReq->MacAddr[5])); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Req: R1KH-ID = 0x%02x:%02x:%02x:%02x:%02x:%02x!\n", - pEvtKeyReq->KeyInfo.R1KHID[0], - pEvtKeyReq->KeyInfo.R1KHID[1], - pEvtKeyReq->KeyInfo.R1KHID[2], - pEvtKeyReq->KeyInfo.R1KHID[3], - pEvtKeyReq->KeyInfo.R1KHID[4], - pEvtKeyReq->KeyInfo.R1KHID[5])); -#endif /* FT_KDP_DEBUG */ - - pEntry = MacTableLookup(pAd, pEvtKeyReq->MacAddr); - - if (!pEntry) - return FALSE; - else - ApIdx = pEntry->func_tb_idx; - - /* calculate the PMK-R1 Key for the station vs. the AP */ - if (FT_QueryKeyInfoForKDP(pAd, ApIdx, pEvtKeyReq) == FALSE) - return FALSE; - - /* response the requested PMK-R1 Key to the R1KH */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Rsp to Peer IP = %d.%d.%d.%d!\n", - (htonl(PeerIP) >> 24) & 0xFF, - (htonl(PeerIP) >> 16) & 0xFF, - (htonl(PeerIP) >> 8) & 0xFF, (htonl(PeerIP) & 0xFF))); - FT_KDP_EventInform(pAd, ApIdx, FT_KDP_SIG_KEY_RSP_AUTO, - (VOID *)pEvtKeyReq, - sizeof(FT_KDP_EVT_KEY_ELM), PeerIP, NULL); - return TRUE; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Req format incorrect!\n")); -#endif /* FT_KDP_EMPTY */ - return FALSE; -} - -/* -======================================================================== -Routine Description: - Inform us a AP response the key. - -Arguments: - pAd - WLAN control block pointer - *pInfo - key information - InfoLen - information length - -Return Value: - None - -Note: - pInfo format is PeerIP (4B) + Nonce (8B) + FT_KDP_EVT_KEY_ELM structure -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_KeyResponseToUs(IN PRTMP_ADAPTER pAd, IN UCHAR *pInfo, - IN INT32 InfoLen) -{ -#ifndef FT_KDP_EMPTY - UINT32 PeerIP, DataLen; - UCHAR *pData; - FT_KDP_EVT_KEY_ELM *pEvtKeyRsp; - UCHAR *pNonce; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* init */ - IAPP_DAEMON_CMD_PARSE(pInfo, InfoLen, PeerIP, pData, DataLen); - pNonce = pData; - pEvtKeyRsp = (FT_KDP_EVT_KEY_ELM *)(pNonce + FT_NONCE_SIZE); -#ifdef FT_KDP_DEBUG - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Rsp from Peer IP = %d.%d.%d.%d!\n", - (htonl(PeerIP) >> 24) & 0xFF, (htonl(PeerIP) >> 16) & 0xFF, - (htonl(PeerIP) >> 8) & 0xFF, (htonl(PeerIP) & 0xFF))); -#endif /* FT_KDP_DEBUG */ - - /* check if the response format is correct */ - if ((pEvtKeyRsp->ElmId == FT_KDP_ELM_ID_PRI) && - (pEvtKeyRsp->OUI[0] == FT_KDP_ELM_PRI_OUI_0) && - (pEvtKeyRsp->OUI[1] == FT_KDP_ELM_PRI_OUI_1) && - (pEvtKeyRsp->OUI[2] == FT_KDP_ELM_PRI_OUI_2)) { - PFT_R1HK_ENTRY pR1hkEntry; - BOOLEAN bUpdateR1kh = FALSE; -#ifdef FT_KDP_DEBUG - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Rsp: Station MAC = 0x%02x:%02x:%02x:%02x:%02x:%02x!\n", - pEvtKeyRsp->MacAddr[0], pEvtKeyRsp->MacAddr[1], - pEvtKeyRsp->MacAddr[2], pEvtKeyRsp->MacAddr[3], - pEvtKeyRsp->MacAddr[4], pEvtKeyRsp->MacAddr[5])); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Rsp: R1KH-ID = 0x%02x:%02x:%02x:%02x:%02x:%02x!\n", - pEvtKeyRsp->KeyInfo.R1KHID[0], - pEvtKeyRsp->KeyInfo.R1KHID[1], - pEvtKeyRsp->KeyInfo.R1KHID[2], - pEvtKeyRsp->KeyInfo.R1KHID[3], - pEvtKeyRsp->KeyInfo.R1KHID[4], - pEvtKeyRsp->KeyInfo.R1KHID[5])); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MacAddr")); - hex_dump("PMKR1Name", pEvtKeyRsp->PMKR1Name, - FT_KDP_WPA_NAME_MAX_SIZE); - hex_dump("R0KH_MAC", pEvtKeyRsp->R0KH_MAC, ETH_ALEN); - hex_dump("AKM Suite", pEvtKeyRsp->AkmSuite, 4); -#endif /* FT_KDP_DEBUG */ - /* Upon receiving a new PMK-R1 key for a STA, the target AP shall - delete the prior PMK-R1 SA and PTKSAs derived from the prior - PMK-R1 key */ - pR1hkEntry = FT_R1khEntryTabLookup(pAd, pEvtKeyRsp->PMKR1Name); - - if (pR1hkEntry == NULL) - bUpdateR1kh = TRUE; - - if (pR1hkEntry && - RTMPEqualMemory(pR1hkEntry->PmkR1Key, pEvtKeyRsp->PMKR1, - LEN_PMK) == FALSE) { - FT_R1khEntryDelete(pAd, pR1hkEntry); - bUpdateR1kh = TRUE; - } - - if (bUpdateR1kh) { - MAC_TABLE_ENTRY *pEntry = NULL; - - pEntry = MacTableLookup(pAd, pEvtKeyRsp->MacAddr); - - /* assign the PMK-R1 key to FT kernel */ - FT_R1khEntryInsert(pAd, pEvtKeyRsp->KeyInfo.PMKR0Name, - pEvtKeyRsp->PMKR1Name, - pEvtKeyRsp->PMKR1, - pEvtKeyRsp->PairwisChipher, - pEvtKeyRsp->AkmSuite, - pEvtKeyRsp->KeyLifeTime, - pEvtKeyRsp->ReassocDeadline, - (PUINT8)pEvtKeyRsp->KeyInfo.R0KHID, - pEvtKeyRsp->KeyInfo.R0KHIDLen, - pEvtKeyRsp->MacAddr); - - /* YF_FT */ - if (pEntry && ((pEntry->FT_R1kh_CacheMiss_Times > 0) -#ifdef R1KH_HARD_RETRY /* yiwei no give up! */ - || (pEntry->FT_R1kh_CacheMiss_Hard > 0) -#endif /*R1KH_HARD_RETRY */ - )) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s - Reset FT_R1kh_CacheMiss_Times to Zero (Wcid%d, value:%d), time=%ld\n", - __func__, pEntry->wcid, - pEntry->FT_R1kh_CacheMiss_Times, - (jiffies * 1000) / OS_HZ)); - pEntry->FT_R1kh_CacheMiss_Times = 0; - -#ifdef R1KH_HARD_RETRY /* yiwei no give up! */ - pEntry->FT_R1kh_CacheMiss_Hard = 0; - RTMP_OS_COMPLETE(&pEntry->ack_r1kh); -#endif /* R1KH_HARD_RETRY */ - } - } - -#ifdef FT_KDP_FUNC_R0KH_IP_RECORD - /* add the R0KH information */ - FT_KDP_R0KH_InfoAdd(pAd, pEvtKeyRsp->KeyInfo.R0KHID, - pEvtKeyRsp->R0KH_MAC, PeerIP); -#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */ - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Key Rsp format incorrect!\n")); - -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Inform us a FT station joins the BSS domain. - -Arguments: - pAd - WLAN control block pointer - *pInfo - station information - InfoLen - information length - -Return Value: - None - -Note: - pInfo format is PeerIP (4B) + Station MAC (6B) -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_StationInform(IN PRTMP_ADAPTER pAd, IN UCHAR *pInfo, - IN INT32 InfoLen) -{ -#ifndef FT_KDP_EMPTY - UINT32 PeerIP, DataLen; - UCHAR *pData; - FT_KDP_EVT_KEY_ELM EvtKeyReq, *pEvtKeyReq; - UCHAR StaMac[ETH_ALEN]; - UINT32 IdBssNum; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* init */ - IAPP_DAEMON_CMD_PARSE(pInfo, InfoLen, PeerIP, pData, DataLen); -#ifndef FT_KDP_FUNC_TEST - - /* check if we are in security mode; if not, return */ - for (IdBssNum = 0; IdBssNum < pAd->ApCfg.BssidNum; IdBssNum++) { - if (!IS_AKM_OPEN( - pAd->ApCfg.MBSSID[IdBssNum].wdev.SecConfig.AKMMap)) - break; - } - - if (IdBssNum == pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> All BSS are open mode!\n")); - return; /* all BSS are open mode */ - } - -#endif - NdisMoveMemory(StaMac, pData, ETH_ALEN); - NdisZeroMemory(&EvtKeyReq, sizeof(FT_KDP_EVT_KEY_ELM)); - pEvtKeyReq = &EvtKeyReq; -#ifdef FT_KDP_DEBUG - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Station Inform from Peer IP = %d.%d.%d.%d!\n", - (htonl(PeerIP) >> 24) & 0xFF, (htonl(PeerIP) >> 16) & 0xFF, - (htonl(PeerIP) >> 8) & 0xFF, (htonl(PeerIP) & 0xFF))); -#endif - /* make up request content */ - pEvtKeyReq->ElmId = FT_KDP_ELM_ID_PRI; - pEvtKeyReq->ElmLen = FT_KDP_ELM_PRI_LEN; - pEvtKeyReq->OUI[0] = FT_KDP_ELM_PRI_OUI_0; - pEvtKeyReq->OUI[1] = FT_KDP_ELM_PRI_OUI_1; - pEvtKeyReq->OUI[2] = FT_KDP_ELM_PRI_OUI_2; - NdisMoveMemory(pEvtKeyReq->MacAddr, StaMac, ETH_ALEN); - NdisMoveMemory(pEvtKeyReq->KeyInfo.S1KHID, StaMac, - FT_KDP_S1KHID_MAX_SIZE); - /* request PMK-R1 Key (our R1KH vs. the station) from the R0KH */ -#ifdef FT_KDP_DEBUG - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Send Key Req to Peer IP = %d.%d.%d.%d!\n", - (htonl(PeerIP) >> 24) & 0xFF, (htonl(PeerIP) >> 16) & 0xFF, - (htonl(PeerIP) >> 8) & 0xFF, (htonl(PeerIP) & 0xFF))); -#endif /* FT_KDP_DEBUG */ - - for (IdBssNum = 0; IdBssNum < pAd->ApCfg.BssidNum; IdBssNum++) { -#ifndef FT_KDP_FUNC_TEST - - if (!IS_AKM_OPEN( - pAd->ApCfg.MBSSID[IdBssNum].wdev.SecConfig.AKMMap)) -#endif /* FT_KDP_FUNC_TEST */ - { - /* copy our MAC address to be the R1KHID */ - /* different MAC for different BSS in MBSS mode */ - NdisMoveMemory(pEvtKeyReq->KeyInfo.R1KHID, - pAd->ApCfg.MBSSID[IdBssNum].wdev.bssid, - FT_KDP_R1KHID_MAX_SIZE); - FT_KDP_EventInform(pAd, IdBssNum, - FT_KDP_SIG_KEY_REQ_AUTO, - (VOID *)pEvtKeyReq, - sizeof(FT_KDP_EVT_KEY_ELM), PeerIP, - NULL); - } - } - -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Set the encryption/decryption key from daemon or driver. - -Arguments: - pAd - WLAN control block pointer - *pKey - the key - KeyLen - the key length - -Return Value: - None - -Note: - Key length can be 8B ~ 64B. - - We support key set from daemon or driver. - - Only one key for multiple BSS mode. -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_CryptKeySet(IN PRTMP_ADAPTER pAd, IN UCHAR *pKey, - IN INT32 KeyLen) -{ -#ifndef FT_KDP_EMPTY - UCHAR KeyMaterial[40]; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* key set */ - if ((KeyLen >= 8) && (KeyLen <= 64)) { - WPAPasswordHash((RTMP_STRING *)pKey, - (PUCHAR)FT_KDP_RALINK_PASSPHRASE, - strlen(FT_KDP_RALINK_PASSPHRASE), KeyMaterial); - } else { - WPAPasswordHash((RTMP_STRING *)FT_KDP_KEY_DEFAULT, - (PUCHAR)FT_KDP_RALINK_PASSPHRASE, - strlen(FT_KDP_RALINK_PASSPHRASE), KeyMaterial); - } - - /* use the first 16B of KeyMaterial[] */ - NdisMoveMemory(FT_KDP_CB->CryptKey, KeyMaterial, sizeof(KeyMaterial)); -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Encrypt the data. - -Arguments: - pAd - WLAN control block pointer - *pData - data buffer - *pDataLen - data buffer length - -Return Value: - None - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_DataEncrypt(IN PRTMP_ADAPTER pAd, INOUT UCHAR *pData, - IN UINT32 *pDataLen) -{ -#ifndef FT_KDP_EMPTY - UCHAR *pOutputBuf; - UINT OutputLen = 0; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* init */ - FT_MEM_ALLOC(pAd, &pOutputBuf, - *pDataLen + FT_KDP_KEY_ENCRYPTION_EXTEND); - - if (pOutputBuf == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> Allocate encryption buffer fail!\n")); - return; - } - - NdisZeroMemory(pOutputBuf, *pDataLen + FT_KDP_KEY_ENCRYPTION_EXTEND); - /* encrypt */ - AES_Key_Wrap(pData, *pDataLen, FT_KDP_CB->CryptKey, 16, pOutputBuf, - &OutputLen); - *pDataLen = OutputLen; - NdisMoveMemory(pData, pOutputBuf, *pDataLen); - FT_MEM_FREE(pAd, pOutputBuf); -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Decrypt the data. - -Arguments: - pAd - WLAN control block pointer - *pData - data buffer - *pDataLen - data buffer length - -Return Value: - None - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_DataDecrypt(IN PRTMP_ADAPTER pAd, IN UCHAR *pData, - IN UINT32 *pDataLen) -{ -#ifndef FT_KDP_EMPTY - UCHAR *pOutputBuf; - UINT OutputLen = 0; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - if ((*pDataLen) <= FT_KDP_KEY_ENCRYPTION_EXTEND) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd>Decryption length is too small!\n")); - return; - } - - /* init */ - FT_MEM_ALLOC(pAd, &pOutputBuf, *pDataLen); - - if (pOutputBuf == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> Allocate decryption buffer fail!\n")); - return; - } - - /* decrypt */ - AES_Key_Unwrap(pData, *pDataLen, FT_KDP_CB->CryptKey, 16, pOutputBuf, - &OutputLen); - *pDataLen = OutputLen; - NdisMoveMemory(pData, pOutputBuf, *pDataLen); - FT_MEM_FREE(pAd, pOutputBuf); -#endif /* FT_KDP_EMPTY */ -} - -/* private function */ -#ifdef FT_KDP_FUNC_R0KH_IP_RECORD -/* -======================================================================== -Routine Description: - Add a R0KH Information. - -Arguments: - pAd - WLAN control block pointer - *pR0KHID - R0KH ID - *pMAC - R0KH MAC - IP - R0KH IP - -Return Value: - None - -Note: -======================================================================== -*/ -BOOLEAN TYPE_FUNC FT_KDP_R0KH_InfoAdd(IN PRTMP_ADAPTER pAd, IN UCHAR *pR0KHID, - IN UCHAR *pMAC, IN UINT32 IP) -{ -#ifndef FT_KDP_EMPTY - FT_KDP_R0KH_INFO *pInfo; - BOOLEAN FlgIsSameRecordFound; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return FALSE; - } - - /* sanity check for maximum size */ - if (FT_KDP_CB->R0KH_Size >= FT_KDP_R0KH_INFO_MAX_SIZE) { - /* delete oldest record first */ - FT_KDP_R0KH_InfoDel(pAd, NULL, NULL, 0); - } - - RTMP_SEM_LOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); - /* sanity check if same information exists */ - FlgIsSameRecordFound = FALSE; - pInfo = FT_KDP_CB->R0KH_InfoHead; - - while (pInfo != NULL) { - if ((NdisEqualMemory(pInfo->R0KHID, pR0KHID, - sizeof(pInfo->R0KHID))) || - (NdisEqualMemory(pInfo->MAC, pMAC, sizeof(pInfo->MAC))) || - (pInfo->IP == IP)) { - /* need to update the new information to the entry */ - FlgIsSameRecordFound = TRUE; - break; - } - - pInfo = pInfo->pNext; - } - - /* init or update */ - if (FlgIsSameRecordFound == FALSE) { - /* allocate a new record */ - FT_MEM_ALLOC(pAd, &pInfo, sizeof(FT_KDP_R0KH_INFO)); - - if (pInfo == NULL) { - RTMP_SEM_UNLOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> Allocate R0KH INFO fail!\n")); - return FALSE; - } - - pInfo->pNext = NULL; - } - - /* update other R0KH device information */ - NdisMoveMemory(pInfo->R0KHID, pR0KHID, sizeof(pInfo->R0KHID)); - NdisMoveMemory(pInfo->MAC, pMAC, sizeof(pInfo->MAC)); - pInfo->IP = IP; - NdisGetSystemUpTime(&pInfo->TimeUpdate); - - /* append the new information to the information list */ - if (FlgIsSameRecordFound == FALSE) { - if (FT_KDP_CB->R0KH_InfoTail == NULL) { - FT_KDP_CB->R0KH_InfoHead = pInfo; - FT_KDP_CB->R0KH_InfoTail = pInfo; - } else { - (FT_KDP_CB->R0KH_InfoTail)->pNext = pInfo; - FT_KDP_CB->R0KH_InfoTail = pInfo; - } - - FT_KDP_CB->R0KH_Size++; - } - - RTMP_SEM_UNLOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); -#endif /* FT_KDP_EMPTY */ - return TRUE; -} - -/* -======================================================================== -Routine Description: - Delete a R0KH Information. - -Arguments: - pAd - WLAN control block pointer - *pR0KHID - R0KH ID - *pMAC - R0KH MAC - IP - R0KH IP - -Return Value: - None - -Note: - If pR0KHID == NULL, pMAC == NULL, and IP = 0, means deleting the oldest. -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_R0KH_InfoDel(IN PRTMP_ADAPTER pAd, IN UCHAR *pR0KHID, - IN UCHAR *pMAC, IN UINT32 IP) -{ -#ifndef FT_KDP_EMPTY - FT_KDP_R0KH_INFO *pInfo; - FT_KDP_R0KH_INFO *pInfoBackup, *pInfoDelPrev, *pInfoDel; - ULONG TimeOldest; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* init */ - pInfoDelPrev = NULL; - pInfoDel = NULL; - TimeOldest = 0xFFFFFFFF; - RTMP_SEM_LOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); - /* try to find the one expected to delete */ - pInfo = FT_KDP_CB->R0KH_InfoHead; - - if (pInfo == NULL) { - RTMP_SEM_UNLOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); - return; - } - - pInfoBackup = pInfo; - - while (pInfo != NULL) { - if ((pR0KHID == NULL) && (pMAC == NULL) && (IP == 0)) { - /* check if the info is the oldest one */ - if (pInfo->TimeUpdate < TimeOldest) { - TimeOldest = pInfo->TimeUpdate; - pInfoDelPrev = pInfoBackup; - pInfoDel = pInfo; - } - } else { - /* check if the info is the one expected to delete */ - if ((pR0KHID != NULL) && - (NdisEqualMemory(pR0KHID, pInfo->R0KHID, - sizeof(pInfo->R0KHID)))) { - pInfoDelPrev = pInfoBackup; - pInfoDel = pInfo; - break; - } - - if ((pMAC != NULL) && - (NdisEqualMemory(pMAC, pInfo->MAC, - sizeof(pInfo->MAC)))) { - pInfoDelPrev = pInfoBackup; - pInfoDel = pInfo; - break; - } - - if (pInfo->IP == IP) { - pInfoDelPrev = pInfoBackup; - pInfoDel = pInfo; - break; - } - } - - /* check next one */ - pInfoBackup = pInfo; - pInfo = pInfo->pNext; - } - - /* delete the information record */ - if (pInfoDel != NULL) { - FT_KDP_CB->R0KH_Size--; - - if (FT_KDP_CB->R0KH_Size == 0) { - /* list is empty */ - FT_KDP_CB->R0KH_InfoHead = NULL; - FT_KDP_CB->R0KH_InfoTail = NULL; - } else { - if (pInfoDelPrev == pInfoDel) { - /* must be the head one */ - FT_KDP_CB->R0KH_InfoHead = pInfoDel->pNext; - } else { - /* must not be the head one */ - pInfoDelPrev->pNext = pInfoDel->pNext; - } - } - } else { - /* sorry! can not find the one in the list */ - } - - RTMP_SEM_UNLOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); - - /* free the one */ - if (pInfoDel != NULL) - FT_MEM_FREE(pAd, pInfoDel); - -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Get the IP of R0KH by R0KHID or MAC. - -Arguments: - pAd - WLAN control block pointer - *pR0KHID - R0KH ID - *pMAC - R0KH MAC - pIP - R0KH IP - -Return Value: - TRUE - get ok - FALSE - get fail - -Note: -======================================================================== -*/ -static BOOLEAN TYPE_FUNC FT_KDP_R0KH_InfoGet(IN PRTMP_ADAPTER pAd, - INOUT UCHAR *pR0KHID, - INOUT UCHAR *pMAC, OUT UINT32 *pIP) -{ -#ifndef FT_KDP_EMPTY - FT_KDP_R0KH_INFO *pInfo; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return FALSE; - } - - RTMP_SEM_LOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); - pInfo = FT_KDP_CB->R0KH_InfoHead; - - while (pInfo != NULL) { - /* check if the info is the one expected to get */ - if ((pR0KHID != NULL) && - (NdisEqualMemory(pR0KHID, pInfo->R0KHID, - sizeof(pInfo->R0KHID)))) { - *pIP = pInfo->IP; - goto LabelOk; - } - - if ((pMAC != NULL) && - (NdisEqualMemory(pMAC, pInfo->MAC, sizeof(pInfo->MAC)))) { - *pIP = pInfo->IP; - goto LabelOk; - } - - /* check next one */ - pInfo = pInfo->pNext; - } - - RTMP_SEM_UNLOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); - return FALSE; -LabelOk: - RTMP_SEM_UNLOCK(&(pAd->ApCfg.FtTab.FT_KdpLock)); - return TRUE; -#else - return FALSE; -#endif /* FT_KDP_EMPTY */ -} -#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */ - -/* -======================================================================== -Routine Description: - Broadcast our AP information. - -Arguments: - SystemSpecific1 - no use - FunctionContext - WLAN control block pointer - SystemSpecific2 - no use - SystemSpecific3 - no use - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_InfoBroadcast(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3) -{ -#ifndef FT_KDP_EMPTY -#ifdef FT_KDP_FUNC_INFO_BROADCAST - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)FunctionContext; - UINT32 IdBssNum; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* get my neighbor report element information */ - /* yet implement */ - - for (IdBssNum = 0; IdBssNum < pAd->ApCfg.BssidNum; IdBssNum++) { - /* PeerIP = 0 means destination MAC = 0xFF FF FF FF FF FF */ - FT_KDP_EventInform(pAd, IdBssNum, FT_KDP_SIG_INFO_BROADCAST, - "test", 4, 0, NULL); - } - -#endif /* FT_KDP_FUNC_INFO_BROADCAST */ -#endif /* FT_KDP_EMPTY */ -} - -#ifdef FT_KDP_FUNC_INFO_BROADCAST -/* -======================================================================== -Routine Description: - Receive a neighbor report from another AP. - -Arguments: - pAd - WLAN control block pointer - *pInfo - report information - InfoLen - information length - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_NeighborReportHandle(IN PRTMP_ADAPTER pAd, - IN UCHAR *pInfo, IN INT32 InfoLen) -{ -#ifndef FT_KDP_EMPTY - UINT32 PeerIP, DataLen; - UCHAR *pData; - UINT32 IdBssNum; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* init */ - IAPP_DAEMON_CMD_PARSE(pInfo, InfoLen, PeerIP, pData, DataLen); -#ifdef FT_KDP_DEBUG - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Neighbor Report from Peer IP = %d.%d.%d.%d!\n", - (htonl(PeerIP) >> 24) & 0xFF, (htonl(PeerIP) >> 16) & 0xFF, - (htonl(PeerIP) >> 8) & 0xFF, (htonl(PeerIP) & 0xFF))); -#endif /* FT_KDP_DEBUG */ - /* yet implememnt */ -#endif /* FT_KDP_EMPTY */ -} -#endif /* FT_KDP_FUNC_INFO_BROADCAST */ - -/* -======================================================================== -Routine Description: - Receive a neighbor request from another AP. - -Arguments: - pAd - WLAN control block pointer - *pInfo - report information - InfoLen - information length - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_NeighborRequestHandle(IN PRTMP_ADAPTER pAd, - IN UCHAR *pInfo, IN INT32 InfoLen) -{ -#ifndef FT_KDP_EMPTY - UINT32 PeerIP, DataLen; - UCHAR *pData; - UINT32 IdBssNum; - UINT16 SsidLen; - RTMP_STRING *pSSID; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* init */ - IAPP_DAEMON_CMD_PARSE(pInfo, InfoLen, PeerIP, pData, DataLen); - SsidLen = DataLen; - pSSID = (RTMP_STRING *)pData; - pSSID[SsidLen] = 0x00; - IdBssNum = BSS0; -#ifdef FT_KDP_DEBUG - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Neighbor Request from Peer IP = %d.%d.%d.%d, SSID = %s\n", - (htonl(PeerIP) >> 24) & 0xFF, (htonl(PeerIP) >> 16) & 0xFF, - (htonl(PeerIP) >> 8) & 0xFF, (htonl(PeerIP) & 0xFF), pSSID)); -#endif /* FT_KDP_DEBUG */ - /* check if the requested SSID is for us */ - /* 11k yet implememnt */ - /* 11K_ApInfoGet(&ApInfo); */ - /* reponse the neighbor request to the AP */ - /* FT_KDP_EventInform(pAd, IdBssNum, FT_KDP_SIG_AP_INFO_RSP, */ - /* &ApInfo, sizeof(ApInfo), PeerIP, NULL); */ -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Receive a neighbor response from another AP. - -Arguments: - pAd - WLAN control block pointer - *pInfo - report information - InfoLen - information length - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_NeighborResponseHandle(IN PRTMP_ADAPTER pAd, - IN UCHAR *pInfo, IN INT32 InfoLen) -{ -#ifndef FT_KDP_EMPTY - UINT32 PeerIP, DataLen; - UCHAR *pData; - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* init */ - IAPP_DAEMON_CMD_PARSE(pInfo, InfoLen, PeerIP, pData, DataLen); -#ifdef FT_KDP_DEBUG - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_ftkd> Neighbor Response from Peer IP = %d.%d.%d.%d\n", - (htonl(PeerIP) >> 24) & 0xFF, (htonl(PeerIP) >> 16) & 0xFF, - (htonl(PeerIP) >> 8) & 0xFF, (htonl(PeerIP) & 0xFF))); -#endif /* FT_KDP_DEBUG */ - /* 11k yet implememnt */ - /* 11K_ResponseHandle(pData, DataLen); */ -#endif /* FT_KDP_EMPTY */ -} - -/* -======================================================================== -Routine Description: - Handle a RRB frame from DS. - -Arguments: - pAd - WLAN control block pointer - *pInfo - report information - InfoLen - information length - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_RRB_ActionHandle(IN PRTMP_ADAPTER pAd, IN INT32 ApIdx, - IN UCHAR *pInfo, IN INT32 InfoLen) -{ -#ifndef FT_KDP_EMPTY - - if (pAd->ApCfg.FtTab.FlgIsFtKdpInit == 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ap_ftkd> %s: FT KDP is not init!\n", __func__)); - return; - } - - /* handle it */ - FT_RrbHandler(pAd, ApIdx, pInfo, InfoLen); -#endif /* FT_KDP_EMPTY */ -} - -#endif /* DOT11R_FT_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_ids.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_ids.c deleted file mode 100644 index e47f165abb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_ids.c +++ /dev/null @@ -1,512 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - ap_ids.c - - Abstract: - monitor intrusion detection condition - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - */ -#ifdef IDS_SUPPORT - -#include "rt_config.h" - -#define IDS_EXEC_INTV 1000 /* 1 sec */ - -VOID RTMPIdsStart(IN PRTMP_ADAPTER pAd) -{ - if (pAd->ApCfg.IDSTimerRunning == FALSE) { - RTMPSetTimer(&pAd->ApCfg.IDSTimer, IDS_EXEC_INTV); - pAd->ApCfg.IDSTimerRunning = TRUE; - } -} - -VOID RTMPIdsStop(IN PRTMP_ADAPTER pAd) -{ - BOOLEAN Cancelled; - - if (pAd->ApCfg.IDSTimerRunning == TRUE) { - RTMPCancelTimer(&pAd->ApCfg.IDSTimer, &Cancelled); - pAd->ApCfg.IDSTimerRunning = FALSE; - } -} - -#ifdef SYSTEM_LOG_SUPPORT -VOID RTMPHandleIdsEvent(IN PRTMP_ADAPTER pAd) -{ - INT i, j; - UINT32 FloodFrameCount[IW_FLOOD_EVENT_TYPE_NUM]; - UINT32 FloodFrameThreshold[IW_FLOOD_EVENT_TYPE_NUM]; - - FloodFrameCount[0] = pAd->ApCfg.RcvdAuthCount; - FloodFrameCount[1] = pAd->ApCfg.RcvdAssocReqCount; - FloodFrameCount[2] = pAd->ApCfg.RcvdReassocReqCount; - FloodFrameCount[3] = pAd->ApCfg.RcvdProbeReqCount; - FloodFrameCount[4] = pAd->ApCfg.RcvdDisassocCount; - FloodFrameCount[5] = pAd->ApCfg.RcvdDeauthCount; - FloodFrameCount[6] = pAd->ApCfg.RcvdEapReqCount; - FloodFrameThreshold[0] = pAd->ApCfg.AuthFloodThreshold; - FloodFrameThreshold[1] = pAd->ApCfg.AssocReqFloodThreshold; - FloodFrameThreshold[2] = pAd->ApCfg.ReassocReqFloodThreshold; - FloodFrameThreshold[3] = pAd->ApCfg.ProbeReqFloodThreshold; - FloodFrameThreshold[4] = pAd->ApCfg.DisassocFloodThreshold; - FloodFrameThreshold[5] = pAd->ApCfg.DeauthFloodThreshold; - FloodFrameThreshold[6] = pAd->ApCfg.EapReqFloodThreshold; - - /* trigger flooding traffic event */ - for (j = 0; j < IW_FLOOD_EVENT_TYPE_NUM; j++) { - if ((FloodFrameThreshold[j] > 0) && - (FloodFrameCount[j] > FloodFrameThreshold[j])) { - RTMPSendWirelessEvent(pAd, IW_FLOOD_AUTH_EVENT_FLAG + j, - NULL, MAIN_MBSSID, 0); - /*MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("flooding traffic event(%d) - %d\n", IW_FLOOD_AUTH_EVENT_FLAG + j, FloodFrameCount[j])); */ - } - } - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - UINT32 SpoofedFrameCount[IW_SPOOF_EVENT_TYPE_NUM]; - CHAR RssiOfSpoofedFrame[IW_SPOOF_EVENT_TYPE_NUM]; - INT k; - - SpoofedFrameCount[0] = - pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount; - SpoofedFrameCount[1] = - pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount; - SpoofedFrameCount[2] = - pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount; - SpoofedFrameCount[3] = - pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount; - SpoofedFrameCount[4] = - pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount; - SpoofedFrameCount[5] = - pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount; - SpoofedFrameCount[6] = - pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount; - SpoofedFrameCount[7] = - pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount; - SpoofedFrameCount[8] = - pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount; - SpoofedFrameCount[9] = - pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount; - RssiOfSpoofedFrame[0] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid; - RssiOfSpoofedFrame[1] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp; - RssiOfSpoofedFrame[2] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp; - RssiOfSpoofedFrame[3] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp; - RssiOfSpoofedFrame[4] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon; - RssiOfSpoofedFrame[5] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc; - RssiOfSpoofedFrame[6] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth; - RssiOfSpoofedFrame[7] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth; - RssiOfSpoofedFrame[8] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt; - RssiOfSpoofedFrame[9] = - pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack; - - /* trigger spoofed attack event */ - for (k = 0; k < IW_SPOOF_EVENT_TYPE_NUM; k++) { - if (SpoofedFrameCount[k] > 0) { - RTMPSendWirelessEvent( - pAd, IW_CONFLICT_SSID_EVENT_FLAG + k, - NULL, i, RssiOfSpoofedFrame[k]); - /*MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("spoofed attack event(%d) - %d\n", IW_CONFLICT_SSID_EVENT_FLAG + k, SpoofedFrameCount[k])); */ - } - } - } -} -#endif /* SYSTEM_LOG_SUPPORT */ - -VOID RTMPClearAllIdsCounter(IN PRTMP_ADAPTER pAd) -{ - INT i; - - pAd->ApCfg.RcvdAuthCount = 0; - pAd->ApCfg.RcvdAssocReqCount = 0; - pAd->ApCfg.RcvdReassocReqCount = 0; - pAd->ApCfg.RcvdProbeReqCount = 0; - pAd->ApCfg.RcvdDisassocCount = 0; - pAd->ApCfg.RcvdDeauthCount = 0; - pAd->ApCfg.RcvdEapReqCount = 0; - pAd->ApCfg.RcvdMaliciousDataCount = 0; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount = 0; - pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount = 0; - pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount = 0; - pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount = 0; - pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount = 0; - pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount = 0; - pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount = 0; - pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount = 0; - pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount = 0; - pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt = 0; - pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = 0; - } -} - -VOID RTMPIdsPeriodicExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext; - - pAd->ApCfg.IDSTimerRunning = FALSE; -#ifdef SYSTEM_LOG_SUPPORT - - /* when IDS occured, send out wireless event */ - if (pAd->CommonCfg.bWirelessEvent) - RTMPHandleIdsEvent(pAd); - -#endif /* SYSTEM_LOG_SUPPORT */ - /* clear all IDS counter */ - RTMPClearAllIdsCounter(pAd); - - /* set timer */ - if (pAd->ApCfg.IdsEnable) { - RTMPSetTimer(&pAd->ApCfg.IDSTimer, IDS_EXEC_INTV); - pAd->ApCfg.IDSTimerRunning = TRUE; - } -} - -/* - ======================================================================== - Routine Description: - This routine is used to check if a rogue AP sent an 802.11 management - frame to a client using our BSSID. - - Arguments: - pAd - Pointer to our adapter - pHeader - Pointer to 802.11 header - - Return Value: - TRUE - This is a spoofed frame - FALSE - This isn't a spoofed frame - - ======================================================================== -*/ -BOOLEAN RTMPSpoofedMgmtDetection(IN RTMP_ADAPTER *pAd, IN RX_BLK *rxblk) -{ - INT i; - FRAME_CONTROL *FC = (FRAME_CONTROL *)rxblk->FC; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - /* Spoofed BSSID detection */ - if (NdisEqualMemory(rxblk->Addr2, - pAd->ApCfg.MBSSID[i].wdev.bssid, - MAC_ADDR_LEN)) { - CHAR RcvdRssi; - struct raw_rssi_info rssi_info; - - rssi_info.raw_rssi[0] = rxblk->rx_signal.raw_rssi[0]; - rssi_info.raw_rssi[1] = rxblk->rx_signal.raw_rssi[1]; - rssi_info.raw_rssi[2] = rxblk->rx_signal.raw_rssi[2]; -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - rssi_info.raw_rssi[3] = rxblk->rx_signal.raw_rssi[3]; -#endif - RcvdRssi = RTMPMaxRssi( - pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0), - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1), - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_3) -#endif - - ); - - switch (FC->SubType) { - case SUBTYPE_ASSOC_RSP: - pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount++; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp = - RcvdRssi; - break; - - case SUBTYPE_REASSOC_RSP: - pAd->ApCfg.MBSSID[i] - .RcvdSpoofedReassocRespCount++; - pAd->ApCfg.MBSSID[i] - .RssiOfRcvdSpoofedReassocResp = - RcvdRssi; - break; - - case SUBTYPE_PROBE_RSP: - pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount++; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp = - RcvdRssi; - break; - - case SUBTYPE_BEACON: - pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount++; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon = - RcvdRssi; - break; - - case SUBTYPE_DISASSOC: - pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount++; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc = - RcvdRssi; - break; - - case SUBTYPE_AUTH: - pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount++; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth = - RcvdRssi; - break; - - case SUBTYPE_DEAUTH: - pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount++; - pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth = - RcvdRssi; - break; - - default: - pAd->ApCfg.MBSSID[i] - .RcvdSpoofedUnknownMgmtCount++; - pAd->ApCfg.MBSSID[i] - .RssiOfRcvdSpoofedUnknownMgmt = - RcvdRssi; - break; - } - - return TRUE; - } - } - - return FALSE; -} - -VOID RTMPConflictSsidDetection(IN PRTMP_ADAPTER pAd, IN PUCHAR pSsid, - IN UCHAR SsidLen, IN CHAR Rssi0, IN CHAR Rssi1, - IN CHAR Rssi2 -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - IN CHAR Rssi3 -#endif -) -{ - INT i; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - /* Conflict SSID detection */ - if (SSID_EQUAL(pSsid, SsidLen, pAd->ApCfg.MBSSID[i].Ssid, - pAd->ApCfg.MBSSID[i].SsidLen)) { - CHAR RcvdRssi; - struct raw_rssi_info rssi_info; - - rssi_info.raw_rssi[0] = Rssi0; - rssi_info.raw_rssi[1] = Rssi1; - rssi_info.raw_rssi[2] = Rssi2; -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - rssi_info.raw_rssi[3] = Rssi3; -#endif - - RcvdRssi = RTMPMaxRssi( - pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0), - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1), - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_3) -#endif - ); - pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount++; - pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = RcvdRssi; - return; - } - } -} - -BOOLEAN RTMPReplayAttackDetection(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr2, - IN RX_BLK *rxblk) -{ - INT i; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - /* Conflict SSID detection */ - if (NdisEqualMemory(pAddr2, pAd->ApCfg.MBSSID[i].wdev.bssid, - MAC_ADDR_LEN)) { - CHAR RcvdRssi; - struct raw_rssi_info rssi_info; - - rssi_info.raw_rssi[0] = rxblk->rx_signal.raw_rssi[0]; - rssi_info.raw_rssi[1] = rxblk->rx_signal.raw_rssi[1]; - rssi_info.raw_rssi[2] = rxblk->rx_signal.raw_rssi[2]; -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - rssi_info.raw_rssi[3] = rxblk->rx_signal.raw_rssi[3]; -#endif - RcvdRssi = RTMPMaxRssi( - pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0), - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1), - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi(pAd, &rssi_info, RSSI_IDX_3) -#endif - - ); - pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount++; - pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = RcvdRssi; - return TRUE; - } - } - - return FALSE; -} - -VOID RTMPUpdateStaMgmtCounter(RTMP_ADAPTER *pAd, USHORT type) -{ - switch (type) { - case SUBTYPE_ASSOC_REQ: - pAd->ApCfg.RcvdAssocReqCount++; - break; - - case SUBTYPE_REASSOC_REQ: - pAd->ApCfg.RcvdReassocReqCount++; - break; - - case SUBTYPE_PROBE_REQ: - pAd->ApCfg.RcvdProbeReqCount++; - break; - - case SUBTYPE_DISASSOC: - pAd->ApCfg.RcvdDisassocCount++; - break; - - case SUBTYPE_DEAUTH: - pAd->ApCfg.RcvdDeauthCount++; - break; - - case SUBTYPE_AUTH: - pAd->ApCfg.RcvdAuthCount++; - break; - } - - /* - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("RcvdAssocReqCount=%d\n", pAd->ApCfg.RcvdAssocReqCount)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("RcvdReassocReqCount=%d\n", pAd->ApCfg.RcvdReassocReqCount)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("RcvdProbeReqCount=%d\n", pAd->ApCfg.RcvdProbeReqCount)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("RcvdDisassocCount=%d\n", pAd->ApCfg.RcvdDisassocCount)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("RcvdDeauthCount=%d\n", pAd->ApCfg.RcvdDeauthCount)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("RcvdAuthCount=%d\n", pAd->ApCfg.RcvdAuthCount)); - */ -} - -VOID rtmp_read_ids_from_file(IN PRTMP_ADAPTER pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *buffer) -{ - /*IdsEnable */ - if (RTMPGetKeyParameter("IdsEnable", tmpbuf, 10, buffer, TRUE)) { - if (os_str_tol(tmpbuf, 0, 10) == 1) - pAd->ApCfg.IdsEnable = TRUE; - else - pAd->ApCfg.IdsEnable = FALSE; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IDS is %s\n", - pAd->ApCfg.IdsEnable ? "enabled" : "disabled")); - } - - /*AuthFloodThreshold */ - if (RTMPGetKeyParameter("AuthFloodThreshold", tmpbuf, 10, buffer, - TRUE)) { - pAd->ApCfg.AuthFloodThreshold = os_str_tol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AuthFloodThreshold = %d\n", - pAd->ApCfg.AuthFloodThreshold)); - } - - /*AssocReqFloodThreshold */ - if (RTMPGetKeyParameter("AssocReqFloodThreshold", tmpbuf, 10, buffer, - TRUE)) { - pAd->ApCfg.AssocReqFloodThreshold = os_str_tol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AssocReqFloodThreshold = %d\n", - pAd->ApCfg.AssocReqFloodThreshold)); - } - - /*ReassocReqFloodThreshold */ - if (RTMPGetKeyParameter("ReassocReqFloodThreshold", tmpbuf, 10, buffer, - TRUE)) { - pAd->ApCfg.ReassocReqFloodThreshold = os_str_tol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ReassocReqFloodThreshold = %d\n", - pAd->ApCfg.ReassocReqFloodThreshold)); - } - - /*ProbeReqFloodThreshold */ - if (RTMPGetKeyParameter("ProbeReqFloodThreshold", tmpbuf, 10, buffer, - TRUE)) { - pAd->ApCfg.ProbeReqFloodThreshold = os_str_tol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ProbeReqFloodThreshold = %d\n", - pAd->ApCfg.ProbeReqFloodThreshold)); - } - - /*DisassocFloodThreshold */ - if (RTMPGetKeyParameter("DisassocFloodThreshold", tmpbuf, 10, buffer, - TRUE)) { - pAd->ApCfg.DisassocFloodThreshold = os_str_tol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DisassocFloodThreshold = %d\n", - pAd->ApCfg.DisassocFloodThreshold)); - } - - /*DeauthFloodThreshold */ - if (RTMPGetKeyParameter("DeauthFloodThreshold", tmpbuf, 10, buffer, - TRUE)) { - pAd->ApCfg.DeauthFloodThreshold = os_str_tol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DeauthFloodThreshold = %d\n", - pAd->ApCfg.DeauthFloodThreshold)); - } - - /*EapReqFloodThreshold */ - if (RTMPGetKeyParameter("EapReqFloodThreshold", tmpbuf, 10, buffer, - TRUE)) { - pAd->ApCfg.EapReqFloodThreshold = os_str_tol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("EapReqFloodThreshold = %d\n", - pAd->ApCfg.EapReqFloodThreshold)); - } - - /* DataFloodThreshold */ - if (RTMPGetKeyParameter("DataFloodThreshold", tmpbuf, 10, buffer, - TRUE)) { - pAd->ApCfg.DataFloodThreshold = os_str_tol(tmpbuf, 0, 10); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DataFloodThreshold = %d\n", - pAd->ApCfg.DataFloodThreshold)); - } -} - -#endif /* IDS_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mbss.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mbss.c deleted file mode 100644 index 8834e65eac..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mbss.c +++ /dev/null @@ -1,381 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - Support multi-BSS function. - - Note: - 1. Call RT28xx_MBSS_Init() in init function and - call RT28xx_MBSS_Remove() in close function - - 2. MAC of different BSS is initialized in APStartUp() - - 3. BSS Index (0 ~ 15) of different rx packet is got in - - 4. BSS Index (0 ~ 15) of different tx packet is assigned in - - 5. BSS Index (0 ~ 15) of different BSS is got in tx_pkt_handle() by using - - 6. BSS Index (0 ~ 15) of IOCTL command is put in pAd->OS_Cookie->ioctl_if - - 7. Beacon of different BSS is enabled in APMakeAllBssBeacon() by writing 1 - to the register MAC_BSSID_DW1 - - 8. The number of MBSS can be 1, 2, 4, or 8 - -***************************************************************************/ -#ifdef MBSS_SUPPORT - -#include "rt_config.h" - -#ifdef VENDOR_FEATURE7_SUPPORT -#ifndef ARRIS_MODULE_PRESENT -void (*f)(int, int, int, char *, int) = arris_event_send_hook_fn; -#endif /* !ARRIS_MODULE_PRESENT */ -#endif -#ifdef MULTI_PROFILE -INT multi_profile_devname_req(struct _RTMP_ADAPTER *ad, UCHAR *final_name, - UCHAR *ifidx); -#endif /*MULTI_PROFILE*/ - -extern struct wifi_dev_ops ap_wdev_ops; - -/* --------------------------------- Public -------------------------------- */ -/* -======================================================================== -Routine Description: - Initialize Multi-BSS function. - -Arguments: - pAd points to our adapter - pDevMain points to the main BSS network interface - -Return Value: - None - -Note: - 1. Only create and initialize virtual network interfaces. - 2. No main network interface here. - 3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat, - it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again. -======================================================================== -*/ -VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps) -{ -#define MBSS_MAX_DEV_NUM 32 - PNET_DEV pDevNew; - INT32 IdBss, MaxNumBss; - INT status; - RTMP_OS_NETDEV_OP_HOOK netDevHook; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - /* sanity check to avoid redundant virtual interfaces are created */ - if (pAd->FlgMbssInit != FALSE) - return; - -#ifdef CREATE_ALL_INTERFACE_AT_INIT - /* Create and initialize all 8 MBSS interfaces duirng - * driver insmod as part of customer requirement - */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Set 8 Max BSS\n")); - pAd->ApCfg.BssidNum = MAX_MBSS_NUM; -#endif - - MaxNumBss = pAd->ApCfg.BssidNum; - - if (MaxNumBss > HW_BEACON_MAX_NUM) - MaxNumBss = HW_BEACON_MAX_NUM; - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < HW_BEACON_MAX_NUM; IdBss++) { - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev = NULL; - pAd->ApCfg.MBSSID[IdBss].wdev.bcn_buf.BeaconPkt = NULL; - } - - /* create virtual network interface */ - for (IdBss = FIRST_MBSSID; IdBss < MaxNumBss; IdBss++) { - struct wifi_dev *wdev; - UINT32 MC_RowID = 0, IoctlIF = 0; - char *dev_name = NULL; - INT32 Ret; - BSS_STRUCT *pMbss = NULL; - UCHAR ifidx = IdBss; - UCHAR final_name[32] = ""; - BOOLEAN autoSuffix = TRUE; -#ifdef MULTIPLE_CARD_SUPPORT - MC_RowID = pAd->MC_RowID; -#endif /* MULTIPLE_CARD_SUPPORT */ -#ifdef HOSTAPD_SUPPORT - IoctlIF = pAd->IoctlIF; -#endif /* HOSTAPD_SUPPORT */ - - dev_name = get_dev_name_prefix(pAd, INT_MBSSID); - - if (dev_name == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("get_dev_name_prefix error!\n")); - break; - } - snprintf(final_name, sizeof(final_name), "%s", dev_name); -#ifdef MULTI_PROFILE - multi_profile_devname_req(pAd, final_name, &ifidx); - if (ifidx == 0) - autoSuffix = FALSE; -#endif /*MULTI_PROFILE*/ -#ifdef INTELP6_SUPPORT -#ifdef CONFIG_RT_SECOND_CARD - if (pAd->dev_idx == 1) - pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, - INT_MBSSID, - IdBss + MAX_MBSS_NUM, - sizeof(struct mt_dev_priv), - dev_name, autoSuffix); - else -#endif -#endif - pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, - INT_MBSSID, ifidx, - sizeof(struct mt_dev_priv), - final_name, autoSuffix); -#ifdef HOSTAPD_SUPPORT - pAd->IoctlIF = IoctlIF; -#endif /* HOSTAPD_SUPPORT */ - - if (pDevNew == NULL) { - pAd->ApCfg.BssidNum = - IdBss; /* re-assign new MBSS number */ - break; - } - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Register MBSSID IF (%s)\n", - RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); - - pMbss = &pAd->ApCfg.MBSSID[IdBss]; - wdev = &pAd->ApCfg.MBSSID[IdBss].wdev; - Ret = wdev_init(pAd, wdev, WDEV_TYPE_AP, pDevNew, IdBss, - (VOID *)&pAd->ApCfg.MBSSID[IdBss], (void *)pAd); - - if (!Ret) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Assign wdev idx for %s failed, free net device!\n", - RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); - RtmpOSNetDevFree(pDevNew); - break; - } - - Ret = wdev_ops_register(wdev, WDEV_TYPE_AP, &ap_wdev_ops, - cap->wmm_detect_method); - - if (!Ret) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("register wdev_ops %s failed, free net device!\n", - RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); - RtmpOSNetDevFree(pDevNew); - break; - } - - RTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd); - RTMP_OS_NETDEV_SET_WDEV(pDevNew, wdev); - /* init operation functions and flags */ - NdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook)); - netDevHook.priv_flags = INT_MBSSID; -#ifdef CREATE_ALL_INTERFACE_AT_INIT - netDevHook.needProtcted = FALSE; -#else - netDevHook.needProtcted = TRUE; -#endif - netDevHook.wdev = wdev; - /* Init MAC address of virtual network interface */ - NdisMoveMemory(&netDevHook.devAddr[0], &wdev->bssid[0], - MAC_ADDR_LEN); - -#ifdef RT_CFG80211_SUPPORT - { - struct wireless_dev *pWdev; - CFG80211_CB *p80211CB = pAd->pCfg80211_CB; - UINT32 DevType = RT_CMD_80211_IFTYPE_AP; - os_alloc_mem_suspend(NULL, (UCHAR **)&pWdev, - sizeof(*pWdev)); - if (!pWdev) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("mem alloc failed for %s, free net device!\n", - RTMP_OS_NETDEV_GET_DEVNAME(pDevNew))); - RtmpOSNetDevFree(pDevNew); - break; - } - os_zero_mem((PUCHAR)pWdev, sizeof(*pWdev)); - pDevNew->ieee80211_ptr = pWdev; - pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; - SET_NETDEV_DEV(pDevNew, wiphy_dev(pWdev->wiphy)); - pWdev->netdev = pDevNew; - pWdev->iftype = DevType; - } -#endif /* RT_CFG80211_SUPPORT */ - - /* register this device to OS */ - status = RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook); -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_TURNKEY_ENABLE(pAd)) { - if (wdev && wdev->wdev_type == WDEV_TYPE_AP) - map_make_vend_ie(pAd, IdBss); - } -#endif /* CONFIG_MAP_SUPPORT */ - } - - pAd->FlgMbssInit = TRUE; -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd)) - MtCmdSetRxTxAirtimeEn( - pAd, ENUM_RX_AT_FEATURE_SUB_TYPE_AIRTIME_EN, TRUE); -#endif -} - -/* -======================================================================== -Routine Description: - Remove Multi-BSS network interface. - -Arguments: - pAd points to our adapter - -Return Value: - None - -Note: - FIRST_MBSSID = 1 - Main BSS is not removed here. -======================================================================== -*/ -VOID MBSS_Remove(RTMP_ADAPTER *pAd) -{ - struct wifi_dev *wdev; - UINT IdBss; - BSS_STRUCT *pMbss; - INT32 MaxNumBss; - - if (!pAd) - return; - - MaxNumBss = pAd->ApCfg.BssidNum; - - if (MaxNumBss > HW_BEACON_MAX_NUM) - MaxNumBss = HW_BEACON_MAX_NUM; - - for (IdBss = FIRST_MBSSID; IdBss < MaxNumBss; IdBss++) { - wdev = &pAd->ApCfg.MBSSID[IdBss].wdev; - pMbss = &pAd->ApCfg.MBSSID[IdBss]; - - if (pMbss) - bcn_buf_deinit(pAd, &wdev->bcn_buf); - - if (wdev->if_dev) { - RtmpOSNetDevProtect(1); - RtmpOSNetDevDetach(wdev->if_dev); - RtmpOSNetDevProtect(0); - wdev_deinit(pAd, wdev); -#ifdef RT_CFG80211_SUPPORT - os_free_mem(wdev->if_dev->ieee80211_ptr); - wdev->if_dev->ieee80211_ptr = NULL; -#endif /* RT_CFG80211_SUPPORT */ - RtmpOSNetDevFree(wdev->if_dev); - wdev->if_dev = NULL; - } - } -} - -/* -======================================================================== -Routine Description: - Get multiple bss idx. - -Arguments: - pAd points to our adapter - pDev which WLAN network interface - -Return Value: - 0: close successfully - otherwise: close fail - -Note: -======================================================================== -*/ -INT32 RT28xx_MBSS_IdxGet(RTMP_ADAPTER *pAd, PNET_DEV pDev) -{ - INT32 BssId = -1; - INT32 IdBss; - - if (!pAd || !pDev) - return -1; - - for (IdBss = 0; IdBss < pAd->ApCfg.BssidNum; IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev == pDev) { - BssId = IdBss; - break; - } - } - - return BssId; -} - -#ifdef MT_MAC -INT32 ext_mbss_hw_cr_enable(PNET_DEV pDev) -{ - PRTMP_ADAPTER pAd; - INT BssId; - - pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); - BssId = RT28xx_MBSS_IdxGet(pAd, pDev); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("##### %s, BssId = %d\n", __func__, BssId)); - - if (BssId < 0) - return -1; - - if (!IS_HIF_TYPE(pAd, HIF_MT)) - return 0; - - AsicSetExtMbssEnableCR(pAd, BssId, TRUE); /* enable rmac 0_1~0_15 bit */ - AsicSetMbssHwCRSetting( - pAd, BssId, TRUE); /* enable lp timing setting for 0_1~0_15 */ - return 0; -} - -INT ext_mbss_hw_cr_disable(PNET_DEV pDev) -{ - PRTMP_ADAPTER pAd; - INT BssId; - - pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); - BssId = RT28xx_MBSS_IdxGet(pAd, pDev); - - if (BssId < 0) - return -1; - - if (!IS_HIF_TYPE(pAd, HIF_MT)) - return 0; - - AsicSetMbssHwCRSetting(pAd, BssId, FALSE); - AsicSetExtMbssEnableCR(pAd, BssId, FALSE); - return 0; -} -#endif /* MT_MAC */ - -#endif /* MBSS_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mbss_inf.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mbss_inf.c deleted file mode 100644 index ebf15c3394..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mbss_inf.c +++ /dev/null @@ -1,181 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - Support multi-BSS function. - - Note: - 1. Call RT28xx_MBSS_Init() in init function and - call RT28xx_MBSS_Remove() in close function - - 2. MAC of different BSS is initialized in APStartUp() - - 3. BSS Index (0 ~ 15) of different rx packet is got in - - 4. BSS Index (0 ~ 15) of different tx packet is assigned in - - 5. BSS Index (0 ~ 15) of different BSS is got in ap_tx_pkt_handle() by using - - 6. BSS Index (0 ~ 15) of IOCTL command is put in pAd->OS_Cookie->ioctl_if - - 7. Beacon of different BSS is enabled in APMakeAllBssBeacon() by writing 1 - to the register MAC_BSSID_DW1 - - 8. The number of MBSS can be 1, 2, 4, or 8 - -***************************************************************************/ -#define RTMP_MODULE_OS - -#ifdef MBSS_SUPPORT - -/*#include "rt_config.h" */ -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" - -/* --------------------------------- Public -------------------------------- */ -NET_DEV_STATS *RT28xx_get_ether_stats(PNET_DEV net_dev); - -/* -======================================================================== -Routine Description: - Initialize Multi-BSS function. - -Arguments: - pAd points to our adapter - pDevMain points to the main BSS network interface - -Return Value: - None - -Note: - 1. Only create and initialize virtual network interfaces. - 2. No main network interface here. - 3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat, - it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again. -======================================================================== -*/ -VOID RT28xx_MBSS_Init(VOID *pAd, PNET_DEV pDevMain) -{ - RTMP_OS_NETDEV_OP_HOOK netDevHook; - - NdisZeroMemory(&netDevHook, sizeof(netDevHook)); - netDevHook.open = mbss_virtual_if_open; /* device opem hook point */ - netDevHook.stop = mbss_virtual_if_close; /* device close hook point */ - netDevHook.xmit = rt28xx_send_packets; /* hard transmit hook point */ - netDevHook.ioctl = rt28xx_ioctl; /* ioctl hook point */ - netDevHook.get_stats = RT28xx_get_ether_stats; - RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_INIT, 0, - &netDevHook, 0); -} - -/* -======================================================================== -Routine Description: - Remove Multi-BSS network interface. - -Arguments: - pAd points to our adapter - -Return Value: - None - -Note: - FIRST_MBSSID = 1 - Main BSS is not removed here. -======================================================================== -*/ -VOID RT28xx_MBSS_Remove(VOID *pAd) -{ - RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_REMOVE, 0, NULL, - 0); -} - -/* --------------------------------- Private -------------------------------- */ -/* -======================================================================== -Routine Description: - Open a virtual network interface. - -Arguments: - pDev which WLAN network interface - -Return Value: - 0: open successfully - otherwise: open fail - -Note: -======================================================================== -*/ -INT mbss_virtual_if_open(PNET_DEV pDev) -{ - VOID *pAd; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ===> %s\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev), __func__)); - - pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); - - if (VIRTUAL_IF_INIT(pAd, pDev) != 0) - return -1; - - if (VIRTUAL_IF_UP(pAd, pDev) != 0) - return -1; - - /* increase MODULE use count */ - RT_MOD_INC_USE_COUNT(); - RT_MOD_HNAT_REG(pDev); - RTMP_OS_NETDEV_START_QUEUE(pDev); - return 0; -} - -/* -======================================================================== -Routine Description: - Close a virtual network interface. - -Arguments: - pDev which WLAN network interface - -Return Value: - 0: close successfully - otherwise: close fail - -Note: -======================================================================== -*/ -INT mbss_virtual_if_close(PNET_DEV pDev) -{ - VOID *pAd; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ===> %s\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev), __func__)); - - pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); - - RTMP_OS_NETDEV_STOP_QUEUE(pDev); - - VIRTUAL_IF_DOWN(pAd, pDev); - - VIRTUAL_IF_DEINIT(pAd, pDev); - - RT_MOD_HNAT_DEREG(pDev); - RT_MOD_DEC_USE_COUNT(); - return 0; -} - -#endif /* MBSS_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mlme.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mlme.c deleted file mode 100644 index 58efbe1f22..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mlme.c +++ /dev/null @@ -1,861 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - mlme.c - - Abstract: - Major MLME state machiones here - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - John Chang 08-04-2003 created for 11g soft-AP - */ - -#include "rt_config.h" -#include - -#define MCAST_WCID_TO_REMOVE 0 /* Pat: TODO */ - -#ifdef APCLI_SUPPORT -#ifdef APCLI_CERT_SUPPORT -extern UCHAR ZeroSsid[32]; -#endif /* APCLI_CERT_SUPPORT */ -#endif /* APCLI_SUPPORT */ - -#ifdef DOT11_N_SUPPORT - -int DetectOverlappingPeriodicRound; - -#ifdef DOT11N_DRAFT3 -VOID Bss2040CoexistTimeOut(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - int apidx; - PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Bss2040CoexistTimeOut(): Recovery to original setting!\n")); - /* Recovery to original setting when next DTIM Interval. */ - pAd->CommonCfg.Bss2040CoexistFlag &= (~BSS_2040_COEXIST_TIMER_FIRED); - NdisZeroMemory(&pAd->CommonCfg.LastBSSCoexist2040, - sizeof(BSS_2040_COEXIST_IE)); - pAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC; - - if (pAd->CommonCfg.bBssCoexEnable == FALSE) { - /* TODO: Find a better way to handle this when the timer is fired and we disable the bBssCoexEable support!! */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Bss2040CoexistTimeOut(): bBssCoexEnable is FALSE, return directly!\n")); - return; - } - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) - SendBSS2040CoexistMgmtAction(pAd, MCAST_WCID_TO_REMOVE, apidx, - 0); -} -#endif /* DOT11N_DRAFT3 */ - -#endif /* DOT11_N_SUPPORT */ - -VOID APDetectOverlappingExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ -#ifdef DOT11_N_SUPPORT - PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext; - struct freq_oper oper; - BOOLEAN bSupport2G = HcIsRfSupport(pAd, RFIC_24GHZ); - int i; - struct wifi_dev *wdev; - UCHAR cfg_ht_bw; - UCHAR cfg_ext_cha; - - if (DetectOverlappingPeriodicRound == 0) { - /* switch back 20/40 */ - if (bSupport2G) { - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - wdev = &pAd->ApCfg.MBSSID[i].wdev; - cfg_ht_bw = wlan_config_get_ht_bw(wdev); - if (wmode_2_rfic(wdev->PhyMode) == RFIC_24GHZ && - (cfg_ht_bw == HT_BW_40)) { - cfg_ext_cha = - wlan_config_get_ext_cha(wdev); - wlan_operate_set_ht_bw(wdev, HT_BW_40, - cfg_ext_cha); - } - } - } - } else { - if ((DetectOverlappingPeriodicRound == 25) || - (DetectOverlappingPeriodicRound == 1)) { - if (hc_radio_query_by_rf(pAd, RFIC_24GHZ, &oper) != - HC_STATUS_OK) { - return; - } - if (oper.ht_bw == HT_BW_40) { - SendBeaconRequest(pAd, 1); - SendBeaconRequest(pAd, 2); - SendBeaconRequest(pAd, 3); - } - } - - DetectOverlappingPeriodicRound--; - } - -#endif /* DOT11_N_SUPPORT */ -} - -/* - ========================================================================== - Description: - This routine is executed every second - - 1. Decide the overall channel quality - 2. Check if need to upgrade the TX rate to any client - 3. perform MAC table maintenance, including ageout no-traffic clients, - and release packet buffer in PSQ is fail to TX in time. - ========================================================================== - */ -VOID APMlmePeriodicExec(PRTMP_ADAPTER pAd) -{ -#ifdef A_BAND_SUPPORT - BOOLEAN bSupport5G = HcIsRfSupport(pAd, RFIC_5GHZ); - -#ifdef MT_DFS_SUPPORT - USHORT ChannelMovingTime; -#endif -#endif /*A_BAND_SUPPORT*/ -#ifdef A4_CONN - UCHAR mbss_idx; -#endif -#ifdef CUSTOMER_DCC_FEATURE - if (pAd->AllowedStaList.StaCount > 0) - RemoveOldStaList(pAd); - APResetStreamingStatus(pAd); -#endif -#ifdef CUSTOMER_DCC_FEATURE - if (pAd->ApEnableBeaconTable == TRUE) - RemoveOldBssEntry(pAd); -#endif - - /* - Reqeust by David 2005/05/12 - It make sense to disable Adjust Tx Power on AP mode, since we can't - take care all of the client's situation - ToDo: need to verify compatibility issue with WiFi product. - */ -#ifdef CARRIER_DETECTION_SUPPORT - - if (isCarrierDetectExist(pAd) == TRUE) { - PCARRIER_DETECTION_STRUCT pCarrierDetect = - &pAd->CommonCfg.CarrierDetect; - - if (pCarrierDetect->OneSecIntCount < - pCarrierDetect->CarrierGoneThreshold) { - pCarrierDetect->CD_State = CD_NORMAL; - pCarrierDetect->recheck = pCarrierDetect->recheck1; - - if (pCarrierDetect->Debug != DBG_LVL_TRACE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("Carrier gone\n")); - /* start all TX actions. */ - UpdateBeaconHandler(pAd, NULL, - BCN_UPDATE_AP_RENEW); - AsicSetSyncModeAndEnable( - pAd, pAd->CommonCfg.BeaconPeriod, - HW_BSSID_0, OPMODE_AP); - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("Carrier gone\n")); - } - - pCarrierDetect->OneSecIntCount = 0; - } - -#endif /* CARRIER_DETECTION_SUPPORT */ -#ifdef VOW_SUPPORT - vow_display_info_periodic(pAd); -#endif /* VOW_SUPPORT */ -#ifdef RED_SUPPORT - if (pAd->red_debug_en && (pAd->red_have_cr4 == FALSE)) - appShowRedDebugMessage(pAd); -#endif /* RED_SUPPORT */ -#ifdef FQ_SCH_SUPPORT - if (pAd->fq_ctrl.dbg_en) - app_show_fq_dbgmsg(pAd); -#endif /* RRSCH_SUPPORT */ - - RTMP_CHIP_HIGH_POWER_TUNING(pAd, &pAd->ApCfg.RssiSample); - /* Disable Adjust Tx Power for WPA WiFi-test. */ - /* Because high TX power results in the abnormal disconnection of Intel BG-STA. */ - /*#ifndef WIFI_TEST */ - /* if (pAd->CommonCfg.bWiFiTest == FALSE) */ - /* for SmartBit 64-byte stream test */ - /* removed based on the decision of Ralink congress at 2011/7/06 */ - /* if (pAd->MacTab.Size > 0) */ - RTMP_CHIP_ASIC_ADJUST_TX_POWER(pAd); - /*#endif // WIFI_TEST */ - RTMP_CHIP_ASIC_TEMPERATURE_COMPENSATION(pAd); - /* walk through MAC table, see if switching TX rate is required */ - - /* MAC table maintenance */ - if (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0) { - /* one second timer */ - MacTableMaintenance(pAd); - - RTMPMaintainPMKIDCache(pAd); -#ifdef WDS_SUPPORT - WdsTableMaintenance(pAd); -#endif /* WDS_SUPPORT */ -#ifdef CLIENT_WDS - CliWds_ProxyTabMaintain(pAd); -#endif /* CLIENT_WDS */ -#ifdef A4_CONN - for (mbss_idx = 0; mbss_idx < pAd->ApCfg.BssidNum; mbss_idx++) - a4_proxy_maintain(pAd, mbss_idx); - pAd->a4_need_refresh = FALSE; -#endif /* A4_CONN */ - -#ifdef WIFI_DIAG - DiagApMlmeOneSecProc(pAd); -#endif - } - -#ifdef AP_SCAN_SUPPORT - AutoChannelSelCheck(pAd); -#endif /* AP_SCAN_SUPPORT */ -#ifdef APCLI_SUPPORT - - if (pAd->Mlme.OneSecPeriodicRound % 2 == 0) - ApCliIfMonitor(pAd); - - if ((pAd->Mlme.OneSecPeriodicRound % 2 == 1 -#ifdef APCLI_AUTO_CONNECT_SUPPORT - && (pAd->ApCfg.ApCliAutoConnectChannelSwitching == FALSE) -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - ) || - (pAd->Mlme.OneSecPeriodicRound % 2 == 1 -#ifdef CONFIG_MAP_SUPPORT - && (IS_MAP_TURNKEY_ENABLE(pAd)) -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - )) { - ApCliIfUp(pAd); - } - - { - INT loop; - ULONG Now32; - MAC_TABLE_ENTRY *pEntry; - -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn) - RTMPRepeaterReconnectionCheck(pAd); - -#endif /* MAC_REPEATER_SUPPORT */ - - NdisGetSystemUpTime(&Now32); - - for (loop = 0; loop < MAX_APCLI_NUM; loop++) { - PAPCLI_STRUCT pApCliEntry = &pAd->ApCfg.ApCliTab[loop]; -#ifdef APCLI_CERT_SUPPORT - - if ((pApCliEntry->bBlockAssoc == TRUE) && - RTMP_TIME_AFTER(Now32, - pApCliEntry->LastMicErrorTime + - (60 * OS_HZ))) - pAd->ApCfg.ApCliTab[loop].bBlockAssoc = FALSE; - -#endif /* APCLI_CERT_SUPPORT */ - - if ((pApCliEntry->Valid == TRUE) && - (VALID_UCAST_ENTRY_WCID(pAd, - pApCliEntry->MacTabWCID))) { - /* update channel quality for Roaming and UI LinkQuality display */ - pEntry = &pAd->MacTab.Content - [pApCliEntry->MacTabWCID]; - /* update channel quality for Roaming and UI LinkQuality display */ - if (pEntry && (pApCliEntry->MacTabWCID > 0) && - IS_ENTRY_AP(pEntry)) - MlmeCalculateChannelQuality(pAd, pEntry, - Now32); - } - } - } -#endif /* APCLI_SUPPORT */ -#ifdef DOT11_N_SUPPORT - { - INT IdBss = 0; - UCHAR ht_protect_en = 1; - BSS_STRUCT *pMbss = NULL; - - for (IdBss = 0; IdBss < pAd->ApCfg.BssidNum; IdBss++) { - pMbss = &pAd->ApCfg.MBSSID[IdBss]; - - if ((pMbss) && (&pMbss->wdev) && - (pMbss->wdev.DevInfo.Active)) { - ht_protect_en = wlan_config_get_ht_protect_en( - &pMbss->wdev); - if (ht_protect_en) { - ApUpdateCapabilityAndErpIe(pAd, pMbss); - APUpdateOperationMode(pAd, - &pMbss->wdev); - } - } - } - } -#endif /* DOT11_N_SUPPORT */ - -#ifdef A_BAND_SUPPORT - if (bSupport5G && (pAd->CommonCfg.bIEEE80211H == 1)) { - INT IdBss = 0; - BOOLEAN BandInCac[DBDC_BAND_NUM]; - UCHAR i; - BSS_STRUCT *pMbss = NULL; - struct DOT11_H *pDot11hTest = NULL; - struct wifi_dev *wdev; - UCHAR BandIdx; - - for (i = 0; i < DBDC_BAND_NUM; i++) - BandInCac[i] = FALSE; - - for (IdBss = 0; IdBss < pAd->ApCfg.BssidNum; IdBss++) { - pMbss = &pAd->ApCfg.MBSSID[IdBss]; - wdev = &pMbss->wdev; - - if ((pMbss == NULL) || (wdev == NULL)) - continue; - if (wdev->pHObj == NULL) - continue; - - BandIdx = HcGetBandByWdev(wdev); - pDot11hTest = &pAd->Dot11_H[BandIdx]; - - if (pDot11hTest == NULL) - continue; -#ifdef MT_DFS_SUPPORT -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_TURNKEY_ENABLE(pAd)) { - if (wdev->map_indicate_channel_change && - (wdev->map_radar_detect == 0)) { - wdev->map_indicate_channel_change = 0; - wapp_send_ch_change_rsp(pAd, wdev, - wdev->channel); - } - } -#endif - if (pDot11hTest->RDMode == RD_SILENCE_MODE) { - if (BandInCac[BandIdx] == TRUE) - continue; - else - BandInCac[BandIdx] = TRUE; -#ifdef BACKGROUND_SCAN_SUPPORT - if (IS_SUPPORT_MT_ZEROWAIT_DFS(pAd) == TRUE) - ChannelMovingTime = - pDot11hTest - ->DfsZeroWaitChMovingTime; - else -#endif - { - ChannelMovingTime = - pDot11hTest->ChMovingTime; - } - - if (pDot11hTest->RDCount++ > - ChannelMovingTime) { - pDot11hTest->RDCount = 0; -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd)) { - wapp_send_cac_stop( - pAd, - RtmpOsGetNetIfIndex( - wdev->if_dev), - wdev->channel, TRUE); - } -#endif - MlmeEnqueue(pAd, DFS_STATE_MACHINE, - DFS_CAC_END, 0, NULL, - HcGetBandByWdev(wdev)); - AsicSetSyncModeAndEnable( - pAd, - pAd->CommonCfg.BeaconPeriod, - HW_BSSID_0, OPMODE_AP); - pDot11hTest->RDMode = RD_NORMAL_MODE; - } - } else -#endif - { - pDot11hTest->InServiceMonitorCount++; - } - } - } -#endif /* A_BAND_SUPPORT */ - -#ifdef MT_DFS_SUPPORT - DfsNonOccupancyCountDown(pAd); - DfsOutBandCacCountUpdate(pAd); -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - DfsV10W56APDownTimeCountDown(pAd); -#endif -#endif -#ifdef MBO_SUPPORT - MboCheckBssTermination(pAd); -#endif /* MBO_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - FT_R1KHInfoMaintenance(pAd); -#endif /* DOT11R_FT_SUPPORT */ -#ifdef APCLI_SUPPORT -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 -#ifdef APCLI_CERT_SUPPORT - /* Perform 20/40 BSS COEX scan every Dot11BssWidthTriggerScanInt */ - { - UCHAR apcli2Gidx = 0; -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) - apcli2Gidx = 1; -#endif - if (APCLI_IF_UP_CHECK(pAd, apcli2Gidx) && - (pAd->bApCliCertTest == TRUE)) { - if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040)) && - (pAd->CommonCfg.Dot11BssWidthTriggerScanInt != 0) && - ((pAd->Mlme.OneSecPeriodicRound % - pAd->CommonCfg.Dot11BssWidthTriggerScanInt) == - (pAd->CommonCfg.Dot11BssWidthTriggerScanInt - 1))) { -#ifdef MT7615 - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - PAPCLI_STRUCT pApCliEntry = - &pAd->ApCfg.ApCliTab[BSS0]; - MAC_TABLE_ENTRY *pEntry = NULL; - STA_TR_ENTRY *tr_entry = NULL; - UINT tx_tp = 0; - UINT rx_tp = 0; - - if (pApCliEntry->Valid == TRUE) { - pEntry = - &pAd->MacTab.Content - [pApCliEntry - ->MacTabWCID]; - tr_entry = - &pAd->MacTab.tr_entry - [pApCliEntry - ->MacTabWCID]; - } - - if ((pEntry) && - IS_ENTRY_APCLI(pEntry) && - (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED)) { - tx_tp = ((pApCliEntry - ->OneSecTxBytes) >> - BYTES_PER_SEC_TO_MBPS); - rx_tp = ((pApCliEntry - ->OneSecRxBytes) >> - BYTES_PER_SEC_TO_MBPS); - } - - /* Check last scan time at least 30 seconds from now. */ - /* Check traffic is less than about 1.5~2Mbps.*/ - /* it might cause data lost if we enqueue scanning.*/ - /* This criteria needs to be considered*/ - - if ((tx_tp < 1) && (rx_tp < 1)) { - MLME_SCAN_REQ_STRUCT ScanReq; - /* Fill out stuff for scan request and kick to scan*/ - ScanParmFill( - pAd, &ScanReq, ZeroSsid, - 0, BSS_ANY, - SCAN_2040_BSS_COEXIST); - /* Before scan, reset trigger event table. */ - TriEventInit(pAd); - MlmeEnqueue( - pAd, - AP_SYNC_STATE_MACHINE, - APMT2_MLME_SCAN_REQ, - sizeof(MLME_SCAN_REQ_STRUCT), - &ScanReq, - (ULONG)(&pApCliEntry - ->wdev)); - /* Set InfoReq = 1, So after scan , alwats sebd 20/40 Coexistence frame to AP*/ - pAd->CommonCfg.BSSCoexist2040 - .field.InfoReq = 1; - RTMP_MLME_HANDLER(pAd); - } - } else -#endif /* MT7615 */ - { - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("MMCHK - LastOneSecTotalTxCount/LastOneSecRxOkDataCnt = %d/%d\n", - pAd->RalinkCounters - .LastOneSecTotalTxCount, - pAd->RalinkCounters - .LastOneSecRxOkDataCnt)); - - /* Check last scan time at least 30 seconds from now. */ - /* Check traffic is less than about 1.5~2Mbps.*/ - /* it might cause data lost if we enqueue scanning.*/ - /* This criteria needs to be considered*/ - if ((pAd->RalinkCounters - .LastOneSecTotalTxCount < - 70) && - (pAd->RalinkCounters - .LastOneSecRxOkDataCnt < - 70)) { - MLME_SCAN_REQ_STRUCT ScanReq; - /* Fill out stuff for scan request and kick to scan*/ - ScanParmFill( - pAd, &ScanReq, ZeroSsid, - 0, BSS_ANY, - SCAN_2040_BSS_COEXIST); - /* Before scan, reset trigger event table. */ - TriEventInit(pAd); - MlmeEnqueue( - pAd, - AP_SYNC_STATE_MACHINE, - APMT2_MLME_SCAN_REQ, - sizeof(MLME_SCAN_REQ_STRUCT), - &ScanReq, 0); - /* Set InfoReq = 1, So after scan , alwats sebd 20/40 Coexistence frame to AP*/ - pAd->CommonCfg.BSSCoexist2040 - .field.InfoReq = 1; - RTMP_MLME_HANDLER(pAd); - } - - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("MMCHK - LastOneSecTotalTxCount/LastOneSecRxOkDataCnt = %d/%d\n", - pAd->RalinkCounters - .LastOneSecTotalTxCount, - pAd->RalinkCounters - .LastOneSecRxOkDataCnt)); - } - } - } - } -#endif /* APCLI_CERT_SUPPORT */ -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#ifdef BAND_STEERING - BndStrgHeartBeatMonitor(pAd); -#endif -} - -/*! \brief To substitute the message type if the message is coming from external - * \param *Fr The frame received - * \param *Machine The state machine - * \param *MsgType the message type for the state machine - * \return TRUE if the substitution is successful, FALSE otherwise - * \pre - * \post - */ -BOOLEAN APMsgTypeSubst(IN PRTMP_ADAPTER pAd, IN PFRAME_802_11 pFrame, - OUT INT *Machine, OUT INT *MsgType) -{ - USHORT Seq; -#ifdef DOT11_SAE_SUPPORT - USHORT Alg; -#endif /* DOT11_SAE_SUPPORT */ - UCHAR EAPType; - BOOLEAN Return = FALSE; -#ifdef WSC_AP_SUPPORT - UCHAR EAPCode; - PMAC_TABLE_ENTRY pEntry; -#endif /* WSC_AP_SUPPORT */ - unsigned char hdr_len = LENGTH_802_11; - -#ifdef A4_CONN - if ((pFrame->Hdr.FC.FrDs == 1) && (pFrame->Hdr.FC.ToDs == 1)) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - /* - TODO: - only PROBE_REQ can be broadcast, all others must be unicast-to-me && is_mybssid; - otherwise, ignore this frame - */ - - /* wpa EAPOL PACKET */ - if (pFrame->Hdr.FC.Type == FC_TYPE_DATA) { -#ifdef WSC_AP_SUPPORT - WSC_CTRL *wsc_ctrl; - struct wifi_dev *wdev; - - /*WSC EAPOL PACKET */ - pEntry = MacTableLookup(pAd, pFrame->Hdr.Addr2); - - if (pEntry) { - wdev = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev; - - if (pEntry->bWscCapable || - IS_AKM_OPEN(wdev->SecConfig.AKMMap) || - IS_AKM_SHARED(wdev->SecConfig.AKMMap) || - IS_AKM_AUTOSWITCH(wdev->SecConfig.AKMMap)) { - /* - WSC AP only can service one WSC STA in one WPS session. - Forward this EAP packet to WSC SM if this EAP packets is from - WSC STA that WSC AP services or WSC AP doesn't service any - WSC STA now. - */ - wsc_ctrl = &wdev->WscControl; - - if ((MAC_ADDR_EQUAL(wsc_ctrl->EntryAddr, - pEntry->Addr) || - MAC_ADDR_EQUAL(wsc_ctrl->EntryAddr, - ZERO_MAC_ADDR)) && - IS_ENTRY_CLIENT(pEntry) && - (wsc_ctrl->WscConfMode != WSC_DISABLE)) { - *Machine = WSC_STATE_MACHINE; - EAPType = *((UCHAR *)pFrame + hdr_len + - LENGTH_802_1_H + 1); - EAPCode = *((UCHAR *)pFrame + hdr_len + - LENGTH_802_1_H + 4); - Return = WscMsgTypeSubst( - EAPType, EAPCode, MsgType); - } - } - } - -#endif /* WSC_AP_SUPPORT */ - - if (!Return) { - *Machine = WPA_STATE_MACHINE; - EAPType = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + - 1); - Return = WpaMsgTypeSubst(EAPType, (INT *)MsgType); - } - - return Return; - } - - if (pFrame->Hdr.FC.Type != FC_TYPE_MGMT) - return FALSE; - - switch (pFrame->Hdr.FC.SubType) { - case SUBTYPE_ASSOC_REQ: - *Machine = AP_ASSOC_STATE_MACHINE; - *MsgType = APMT2_PEER_ASSOC_REQ; - break; - - /* - case SUBTYPE_ASSOC_RSP: - *Machine = AP_ASSOC_STATE_MACHINE; - *MsgType = APMT2_PEER_ASSOC_RSP; - break; - */ - case SUBTYPE_REASSOC_REQ: - *Machine = AP_ASSOC_STATE_MACHINE; - *MsgType = APMT2_PEER_REASSOC_REQ; - break; - - /* - case SUBTYPE_REASSOC_RSP: - *Machine = AP_ASSOC_STATE_MACHINE; - *MsgType = APMT2_PEER_REASSOC_RSP; - break; - */ - case SUBTYPE_PROBE_REQ: - *Machine = AP_SYNC_STATE_MACHINE; - *MsgType = APMT2_PEER_PROBE_REQ; - break; - - /* For Active Scan */ - case SUBTYPE_PROBE_RSP: - *Machine = AP_SYNC_STATE_MACHINE; - *MsgType = APMT2_PEER_PROBE_RSP; - break; - - case SUBTYPE_BEACON: - *Machine = AP_SYNC_STATE_MACHINE; - *MsgType = APMT2_PEER_BEACON; - break; - - /* - case SUBTYPE_ATIM: - *Machine = AP_SYNC_STATE_MACHINE; - *MsgType = APMT2_PEER_ATIM; - break; - */ - case SUBTYPE_DISASSOC: - *Machine = AP_ASSOC_STATE_MACHINE; - *MsgType = APMT2_PEER_DISASSOC_REQ; - break; - - case SUBTYPE_AUTH: - /* get the sequence number from payload 24 Mac Header + 2 bytes algorithm */ -#ifdef DOT11_SAE_SUPPORT - NdisMoveMemory(&Alg, &pFrame->Octet[0], sizeof(USHORT)); -#endif /* DOT11_SAE_SUPPORT */ - NdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(USHORT)); - *Machine = AP_AUTH_STATE_MACHINE; - - if (Seq == 1 -#ifdef DOT11_SAE_SUPPORT - || (Alg == AUTH_MODE_SAE && Seq == 2) -#endif /* DOT11_SAE_SUPPORT */ - ) - *MsgType = APMT2_PEER_AUTH_REQ; - else if (Seq == 3) - *MsgType = APMT2_PEER_AUTH_CONFIRM; - else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("wrong AUTH seq=%d Octet=%02x %02x %02x %02x %02x %02x %02x %02x\n", - Seq, pFrame->Octet[0], pFrame->Octet[1], - pFrame->Octet[2], pFrame->Octet[3], - pFrame->Octet[4], pFrame->Octet[5], - pFrame->Octet[6], pFrame->Octet[7])); - return FALSE; - } - - break; - - case SUBTYPE_DEAUTH: - *Machine = AP_AUTH_STATE_MACHINE; /*AP_AUTH_RSP_STATE_MACHINE;*/ - *MsgType = APMT2_PEER_DEAUTH; - break; - - case SUBTYPE_ACTION: - case SUBTYPE_ACTION_NO_ACK: - *Machine = ACTION_STATE_MACHINE; - /* Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support */ - if ((pFrame->Octet[0] & 0x7F) > MAX_PEER_CATE_MSG) - *MsgType = MT2_ACT_INVALID; - else - *MsgType = (pFrame->Octet[0] & 0x7F); - - break; - - default: - return FALSE; - } - - return TRUE; -} - -/* - ======================================================================== - Routine Description: - Periodic evaluate antenna link status - - Arguments: - pAd - Adapter pointer - - Return Value: - None - - ======================================================================== -*/ -VOID APAsicEvaluateRxAnt(IN PRTMP_ADAPTER pAd) -{ - ULONG TxTotalCnt; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - return; - -#endif /* CONFIG_ATE */ -#ifdef CARRIER_DETECTION_SUPPORT - - if (pAd->CommonCfg.CarrierDetect.CD_State == CD_SILENCE) - return; - -#endif /* CARRIER_DETECTION_SUPPORT */ - bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath); - TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + - pAd->RalinkCounters.OneSecTxRetryOkCount + - pAd->RalinkCounters.OneSecTxFailCount; - - if (TxTotalCnt > 50) { - RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 20); - pAd->Mlme.bLowThroughput = FALSE; - } else { - RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300); - pAd->Mlme.bLowThroughput = TRUE; - } -} - -/* - ======================================================================== - Routine Description: - After evaluation, check antenna link status - - Arguments: - pAd - Adapter pointer - - Return Value: - None - - ======================================================================== -*/ -VOID APAsicRxAntEvalTimeout(RTMP_ADAPTER *pAd) -{ - CHAR rssi[3], *target_rssi; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - return; - -#endif /* CONFIG_ATE */ - - /* if the traffic is low, use average rssi as the criteria */ - if (pAd->Mlme.bLowThroughput == TRUE) - target_rssi = &pAd->ApCfg.RssiSample.LastRssi[0]; - else - target_rssi = &pAd->ApCfg.RssiSample.AvgRssi[0]; - - NdisMoveMemory(&rssi[0], target_rssi, 3); - /* Disable the below to fix 1T/2R issue. It's suggested by Rory at 2007/7/11. */ - bbp_set_rxpath(pAd, pAd->Mlme.RealRxPath); -} - -/* - ======================================================================== - Routine Description: - After evaluation, check antenna link status - - Arguments: - pAd - Adapter pointer - - Return Value: - None - - ======================================================================== -*/ -VOID APAsicAntennaAvg(IN PRTMP_ADAPTER pAd, IN UCHAR AntSelect, - IN SHORT *RssiAvg) -{ - SHORT realavgrssi; - LONG realavgrssi1; - ULONG recvPktNum = pAd->RxAnt.RcvPktNum[AntSelect]; - - realavgrssi1 = pAd->RxAnt.Pair1AvgRssiGroup1[AntSelect]; - - if (realavgrssi1 == 0) { - *RssiAvg = 0; - return; - } - - realavgrssi = (SHORT)(realavgrssi1 / recvPktNum); - pAd->RxAnt.Pair1AvgRssiGroup1[0] = 0; - pAd->RxAnt.Pair1AvgRssiGroup1[1] = 0; - pAd->RxAnt.Pair1AvgRssiGroup2[0] = 0; - pAd->RxAnt.Pair1AvgRssiGroup2[1] = 0; - pAd->RxAnt.RcvPktNum[0] = 0; - pAd->RxAnt.RcvPktNum[1] = 0; - *RssiAvg = realavgrssi - 256; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mumimo.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mumimo.c deleted file mode 100644 index bca31712d9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mumimo.c +++ /dev/null @@ -1,4711 +0,0 @@ -/* - * $Id$ - * $DateTime$ - * Jeffrey Chang - */ -/* - This file contains IOCTL for MU-MIMO specfic commands - */ -/******************************************************************************* - * Copyright (c) 2014 MediaTek Inc. - * - * All rights reserved. Copying, compilation, modification, distribution - * or any other use whatsoever of this material is strictly prohibited - * except in accordance with a Software License Agreement with - * MediaTek Inc. - * ****************************************************************************** - */ -/****************************************************************************** - * LEGAL DISCLAIMER - * - * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND - * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK - * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE - * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY - * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT - * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE - * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY - * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK - * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY - * WARRANTY CLAIM RELATING THERetO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE - * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO - * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. - * - * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE - * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL - * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT - * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY - * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - * - * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE - * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT - * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING - * THEREOF AND RELATED THERetO SHALL BE SETTLED BY ARBITRATION IN SAN - * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE - * (ICC). - * ****************************************************************************** - */ -#include "rt_config.h" -#ifdef CFG_SUPPORT_MU_MIMO -/* For debugging, Not for ATE */ -#define SU 0 -#define MU 1 -#define MU_PROFILE_NUM 32 /* to be removed */ -#define QD_RAW_DATA_LEN 56 -static VOID eventDispatcher(struct cmd_msg *msg, char *rsp_payload, - UINT16 rsp_payload_len); -INT SetMuProfileProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - PCHAR pch = NULL; - PCHAR pValid = NULL; - PCHAR pIdx = NULL; - PCHAR pBaMask = NULL; - PCHAR pWlanIdx = NULL; - CMD_MU_SET_MUPROFILE_ENTRY param = { 0 }; - UINT32 cmd = MU_SET_MUPROFILE_ENTRY; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: arg = %s\n", __func__, arg)); - pch = strsep(&arg, "_"); - - if (pch != NULL) - pValid = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pIdx = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pBaMask = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, ""); - - if (pch != NULL) - pWlanIdx = pch; - else { - Ret = 0; - goto error; - } - - param.valid = (BOOLEAN)os_str_tol(pValid, 0, 10); - param.index = os_str_tol(pIdx, 0, 10); - param.baMask = os_str_tol(pBaMask, 0, 16); - param.wlanIdx = os_str_tol(pWlanIdx, 0, 10); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT ShowMuProfileProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - PCHAR pch = NULL; - struct cmd_msg *msg = NULL; - INT32 Ret = TRUE; - PCHAR pIdx = NULL; - UINT32 index = 0; - EVENT_SHOW_MUPROFILE_ENTRY result = { 0 }; - UINT32 cmd = MU_GET_MUPROFILE_ENTRY; - struct _CMD_ATTRIBUTE attr = { 0 }; - - pch = arg; - - if (pch != NULL) - pIdx = pch; - else { - Ret = 0; - goto error; - } - - index = os_str_tol(pIdx, 0, 10); - index = cpu2le32(index); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(index)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)&index, sizeof(index)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* | ucNumUser | ucBW | ucNS0 | ucNS1 | ucNS2 | ucNS3 | - * | ucPFIDUser0 | ucPFIDUser1 | ucPFIDUser2 | ucPFIDUser3 | - * | fgIsShortGI | fgIsUsed | fgIsDisable | - * | ucInitMCSUser0 | ucInitMCSUser1 | ucInitMCSUser2 | ucIitMCSUser3| - * | ucdMCSUser0 | ucdMCSUser1 | ucdMCSUser2 | ucdMCSUser3| -*/ -/* iwpriv ra0 [index] [num_user: 0/1/2/3] [bw:/0/1/2/3] [ns0:0/1] [ns1:0/1] [ns2:0/1] [ns3:0/1] - [pfid0] [pfid1] [pfid2] [pfid3] [sgi] [used] [dis] [initMcs0] [initMcs1] - [initMcs2] [initMcs3] [dMcs0] [dMcs1] [dMcs2] [dMcs3] -*/ -INT SetGroupTblEntryProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - PCHAR pch = NULL; - PCHAR pNumUser = NULL; - PCHAR pIndex = NULL; - PCHAR pBw = NULL; - PCHAR pNs0 = NULL; - PCHAR pNs1 = NULL; - PCHAR pNs2 = NULL; - PCHAR pNs3 = NULL; - PCHAR ppfid0 = NULL; - PCHAR ppfid1 = NULL; - PCHAR ppfid2 = NULL; - PCHAR ppfid3 = NULL; - PCHAR psgi = NULL; - PCHAR pused = NULL; - PCHAR pdis = NULL; - PCHAR pinitMcsUser0 = NULL; - PCHAR pinitMcsUser1 = NULL; - PCHAR pinitMcsUser2 = NULL; - PCHAR pinitMcsUser3 = NULL; - PCHAR pdMcsUser0 = NULL; - PCHAR pdMcsUser1 = NULL; - PCHAR pdMcsUser2 = NULL; - PCHAR pdMcsUser3 = NULL; - CMD_MU_SET_GROUP_TBL_ENTRY param = { 0 }; - UINT32 cmd = MU_SET_GROUP_TBL_ENTRY; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* we fetch the minimum first */ - pch = strsep(&arg, "_"); - - if (pch != NULL) - pIndex = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pNumUser = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pBw = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pNs0 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pNs1 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pNs2 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pNs3 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - ppfid0 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - ppfid1 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - ppfid2 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - ppfid3 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - psgi = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pused = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pdis = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pinitMcsUser0 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pinitMcsUser1 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pinitMcsUser2 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pinitMcsUser3 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pdMcsUser0 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pdMcsUser1 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pdMcsUser2 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, ""); - - if (pch != NULL) - pdMcsUser3 = pch; - else { - Ret = 0; - goto error; - } - - param.index = os_str_tol(pIndex, 0, 10); - param.numUser = os_str_tol(pNumUser, 0, 10); - param.BW = os_str_tol(pBw, 0, 10); - param.PFIDUser0 = os_str_tol(ppfid0, 0, 10); - param.PFIDUser1 = os_str_tol(ppfid1, 0, 10); - param.PFIDUser2 = os_str_tol(ppfid2, 0, 10); - param.PFIDUser3 = os_str_tol(ppfid3, 0, 10); - param.fgIsShortGI = (BOOLEAN)os_str_tol(psgi, 0, 10); - param.fgIsUsed = (BOOLEAN)os_str_tol(pused, 0, 10); - param.fgIsDisable = (BOOLEAN)os_str_tol(pdis, 0, 10); - param.initMcsUser0 = os_str_tol(pinitMcsUser0, 0, 10); - param.initMcsUser1 = os_str_tol(pinitMcsUser1, 0, 10); - param.initMcsUser2 = os_str_tol(pinitMcsUser2, 0, 10); - param.initMcsUser3 = os_str_tol(pinitMcsUser3, 0, 10); - param.dMcsUser0 = os_str_tol(pdMcsUser0, 0, 10); - param.dMcsUser1 = os_str_tol(pdMcsUser1, 0, 10); - param.dMcsUser2 = os_str_tol(pdMcsUser2, 0, 10); - param.dMcsUser3 = os_str_tol(pdMcsUser3, 0, 10); - param.NS0 = os_str_tol(pNs0, 0, 10); - param.NS1 = os_str_tol(pNs1, 0, 10); - param.NS2 = os_str_tol(pNs2, 0, 10); - param.NS3 = os_str_tol(pNs3, 0, 10); -#ifdef RT_BIG_ENDIAN - param.index = cpu2le32(param.index); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Values %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", - param.index, param.numUser, param.BW, param.NS0, param.NS1, - param.NS2, param.NS3, param.PFIDUser0, param.PFIDUser1, - param.PFIDUser2, param.PFIDUser3, param.fgIsShortGI, - param.fgIsUsed, param.fgIsDisable, param.initMcsUser0, - param.initMcsUser1, param.initMcsUser2, param.initMcsUser3, - param.dMcsUser0, param.dMcsUser1, param.dMcsUser2, - param.dMcsUser3)); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + - sizeof(CMD_MU_SET_GROUP_TBL_ENTRY)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, - sizeof(CMD_MU_SET_GROUP_TBL_ENTRY)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT ShowGroupTblEntryProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - PCHAR pch = NULL; - PCHAR pIndex = NULL; - UINT32 index = 0; - EVENT_SHOW_GROUP_TBL_ENTRY result = { 0 }; - UINT32 cmd = MU_GET_GROUP_TBL_ENTRY; - struct _CMD_ATTRIBUTE attr = { 0 }; - - pch = arg; - - if (pch != NULL) - pIndex = pch; - else { - Ret = 0; - goto error; - } - - index = os_str_tol(pIndex, 0, 10); - index = cpu2le32(index); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Index is: %d\n", index)); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(index)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)&index, sizeof(index)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/*<-------------------------------------------------------------------------->*/ -/* iwpriv ra0 [index] [lowMemberStatus] [highMemberStatus] [[lowUserPosition0] - [lowUserPosition1][highUserPosistion0] [highUserPosistion1] - in hex -*/ -INT SetClusterTblEntryProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - PCHAR pch = NULL; - PCHAR pIndex = NULL; - PCHAR pLowGidUserMemberStatus = NULL; - PCHAR pHighGidUserMemberStatus = NULL; - PCHAR pLowGidUserPosition0 = NULL; - PCHAR pLowGidUserPosition1 = NULL; - PCHAR pHighGidUserPosition0 = NULL; - PCHAR pHighGidUserPosition1 = NULL; - CMD_MU_SET_CLUSTER_TBL_ENTRY param = { 0 }; - UINT32 cmd = MU_SET_CLUSTER_TBL_ENTRY; - struct _CMD_ATTRIBUTE attr = { 0 }; - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pIndex = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pLowGidUserMemberStatus = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pHighGidUserMemberStatus = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pLowGidUserPosition0 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pLowGidUserPosition1 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pHighGidUserPosition0 = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, ""); - - if (pch != NULL) - pHighGidUserPosition1 = pch; - else { - Ret = 0; - goto error; - } - - param.index = os_str_tol(pIndex, 0, 10); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); - /* do we need change edian? */ - param.gidUserMemberStatus[0] = - os_str_tol(pLowGidUserMemberStatus, 0, 16); - param.gidUserMemberStatus[1] = - os_str_tol(pHighGidUserMemberStatus, 0, 16); - param.gidUserPosition[0] = os_str_tol(pLowGidUserPosition0, 0, 16); - param.gidUserPosition[1] = os_str_tol(pLowGidUserPosition1, 0, 16); - param.gidUserPosition[2] = os_str_tol(pHighGidUserPosition0, 0, 16); - param.gidUserPosition[3] = os_str_tol(pHighGidUserPosition1, 0, 16); -#ifdef RT_BIG_ENDIAN - param.gidUserMemberStatus[0] = cpu2le32(param.gidUserMemberStatus[0]); - param.gidUserMemberStatus[1] = cpu2le32(param.gidUserMemberStatus[1]); - param.gidUserPosition[0] = cpu2le32(param.gidUserPosition[0]); - param.gidUserPosition[1] = cpu2le32(param.gidUserPosition[1]); - param.gidUserPosition[2] = cpu2le32(param.gidUserPosition[2]); - param.gidUserPosition[3] = cpu2le32(param.gidUserPosition[3]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Values: %d %d %d %d %d %d %d\n", param.index, - param.gidUserMemberStatus[0], param.gidUserMemberStatus[1], - param.gidUserPosition[0], param.gidUserPosition[1], - param.gidUserPosition[2], param.gidUserPosition[3])); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, - sizeof(CMD_MU_SET_CLUSTER_TBL_ENTRY)); - AndesSendCmdMsg(pAd, msg); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("msg is sent\n")); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT ShowClusterTblEntryProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - PCHAR pch = NULL; - PCHAR pIndex = NULL; - UINT32 index = 0; - EVENT_MU_GET_CLUSTER_TBL_ENTRY result = { 0 }; - UINT32 cmd = MU_GET_CLUSTER_TBL_ENTRY; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* we fetch the minimum first */ - pch = arg; - - if (pch != NULL) - pIndex = pch; - else { - Ret = 0; - goto error; - } - - index = os_str_tol(pIndex, 0, 10); - index = cpu2le32(index); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Index is: %d\n", index)); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(index)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)&index, sizeof(index)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetMuEnableProc - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * @descriton: enable/1 or disable/0 the MU module - */ -/* iwpriv ra0 set_mu_enable [1/0] */ -INT SetMuEnableProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - BOOLEAN value = 0; - UINT32 cmd = MU_SET_ENABLE; - CMD_MU_SET_ENABLE param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, NULL, 10); - param.fgIsEnable = value; - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(CMD_MU_SET_ENABLE)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)&value, sizeof(value)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT ShowMuEnableProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - EVENT_SHOW_MU_ENABLE result = { 0 }; - UINT32 cmd = MU_GET_ENABLE; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(EVENT_SHOW_MU_ENABLE)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT SetGroupUserThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - PCHAR pch = NULL; - PCHAR pMinVal = NULL; - PCHAR pMaxVal = NULL; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_GROUP_USER_THRESHOLD param = { 0 }; - UINT32 cmd = MU_SET_GROUP_USER_THRESHOLD; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* we fetch the minimum first */ - pch = strsep(&arg, "_"); - - if (pch != NULL) - pMinVal = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, ""); - - if (pch != NULL) - pMaxVal = pch; - else { - Ret = 0; - goto error; - } - - param.min = os_str_tol(pMinVal, 0, 10); - param.max = os_str_tol(pMaxVal, 0, 10); - - if (param.min < 2 || param.max > 4) { - Ret = 0; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Min < 2 and Max > 4 is NOT allowed\n")); - goto error; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Values %d %d\n", param.min, param.max)); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT ShowGroupUserThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - EVENT_MU_GET_GROUP_USER_THRESHOLD result = { 0 }; - UINT32 cmd = MU_GET_GROUP_USER_THRESHOLD; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT SetCalculateInitMCSProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - PCHAR pch = NULL; - PCHAR pIndex = NULL; - UINT32 index = 0; - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_SET_CALC_INIT_MCS; - EVENT_STATUS result = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pIndex = pch; - else { - Ret = 0; - goto error; - } - - index = cpu2le32(index); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(index)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)&index, sizeof(index)); - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetGroupNssProc - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * - */ -INT SetGroupNssThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - PCHAR pch = NULL; - PCHAR pMinVal = NULL; - PCHAR pMaxVal = NULL; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_GROUP_NSS_THRESHOLD param = { 0 }; - UINT32 cmd = MU_SET_GROUP_NSS_THRESHOLD; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* we fetch the minimum first */ - pch = strsep(&arg, "_"); - - if (pch != NULL) - pMinVal = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, ""); - - if (pch != NULL) - pMaxVal = pch; - else { - Ret = 0; - goto error; - } - - param.min = os_str_tol(pMinVal, 0, 10); - param.max = os_str_tol(pMaxVal, 0, 10); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Values %d %d\n", param.min, param.max)); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT ShowGroupNssThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - EVENT_MU_GET_GROUP_NSS_THRESHOLD result = { 0 }; - UINT32 cmd = MU_GET_GROUP_NSS_THRESHOLD; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetTxReqMinTime - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - */ -INT SetTxReqMinTimeProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT16 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_TXREQ_MIN_TIME param = { 0 }; - UINT32 cmd = MU_SET_TXREQ_MIN_TIME; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 16); - param.value = cpu2le16(value); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Values %d\n", param.value)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT ShowTxReqMinTimeProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - EVENT_MU_GET_TXREQ_MIN_TIME result = { 0 }; - UINT32 cmd = MU_GET_TXREQ_MIN_TIME; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Nitesh: In the function ShowCalcInitMCSProc - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - *it shows the Init MCS value for the corresponding Group Index - */ -INT ShowCalcInitMCSProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - PCHAR pch = NULL; - PCHAR pIndex = NULL; - UINT32 index = 0; - EVENT_SHOW_GROUP_TBL_ENTRY result = { 0 }; - UINT32 cmd = MU_GET_CALC_INIT_MCS; - struct _CMD_ATTRIBUTE attr = { 0 }; - - pch = arg; - - if (pch != NULL) - pIndex = pch; - else { - Ret = 0; - goto error; - } - - index = os_str_tol(pIndex, 0, 10); - index = cpu2le32(index); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(index)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)&index, sizeof(index)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function MuSetSuNssCheck - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - *it checl the nss of the primary ac owner if su nss= mu nss - */ -INT SetSuNssCheckProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT8 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_SET_SU_NSS_CHECK; - CMD_SET_NSS_CHECK param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - - if (value < 0 || value > 1) - return FALSE; - - param.fgIsEnable = value; - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function MuSetSuNssCheck - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * - */ -INT ShowSuNssCheckProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_GET_SU_NSS_CHECK; - EVENT_SHOW_NSS_CHECK result = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function send GID management frame - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - *it triggers the GID management frame - */ -INT SetTriggerGIDMgmtFrameProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_SET_TRIGGER_GID_MGMT_FRAME; - PCHAR pch = NULL; - PCHAR pWlanIdx = NULL; - PCHAR pGid = NULL; - PCHAR pUp = NULL; - CMD_SET_TRIGGER_GID_MGMT_FRAME param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pWlanIdx = pch; - else { - Ret = FALSE; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pGid = pch; - else { - Ret = FALSE; - goto error; - } - - pch = strsep(&arg, ""); - - if (pch != NULL) - pUp = pch; - else { - Ret = FALSE; - goto error; - } - - param.wlanIndex = os_str_tol(pWlanIdx, 0, 10); -#ifdef RT_BIG_ENDIAN - param.wlanIndex = cpu2le16(param.wlanIndex); -#endif - param.gid = os_str_tol(pGid, 0, 10); - param.up = os_str_tol(pUp, 0, 10); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(value)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT SetTriggerSndProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_SET_TRIGGER_SND; - CMD_SET_TRIGGER_SND param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT SetTriggerBbpProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_SET_TRIGGER_BBP; - CMD_SET_TRIGGER_BBP param = { 0 }; - UINT16 value = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - - if (value > 2048) { - Ret = FALSE; - goto error; - } - - param.u2GroupIndex = cpu2le16(value); /* 0~3: 1 to 4 user grouping */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT SetTriggerGroupProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_SET_TRIGGER_GROUP; - CMD_SET_TRIGGER_GROUP param = { 0 }; - UINT8 value = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - - if (value < 2) { - Ret = FALSE; - goto error; - } - - param.ucNum = (value - 1); /* 0~3: 1 to 4 user grouping */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT SetTriggerDegroupProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_SET_TRIGGER_DEGROUP; - CMD_SET_TRIGGER_DEGROUP param = { 0 }; - UINT8 value = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - param.ucMuProfileIndex = value; - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT SetTriggerMuTxProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_SET_TRIGGER_MU_TX; - UINT32 index = 0; - CMD_SET_TRIGGER_MU_TX_FRAME param = { 0 }; - PCHAR pch = NULL; - PCHAR pAcIndex = NULL; - PCHAR pNumOfStas = NULL; - PCHAR pRound = NULL; - PCHAR pRandom = NULL; - PCHAR pWlanIndex = NULL; - PCHAR pPayloadLength = NULL; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* we fetch the minimum first */ - pch = strsep(&arg, "_"); - - if (pch != NULL) - pAcIndex = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pRandom = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pNumOfStas = pch; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "_"); - - if (pch != NULL) - pRound = pch; - else { - Ret = 0; - goto error; - } - - param.ucAcIndex = os_str_tol(pAcIndex, 0, 10); - param.fgIsRandomPattern = os_str_tol(pRandom, 0, 10); - param.u4NumOfSTAs = os_str_tol(pNumOfStas, 0, 10); - param.u4Round = os_str_tol(pRound, 0, 10); - - for (index = 0; index < param.u4NumOfSTAs; index++) { - pch = strsep(&arg, "_"); - - if (pch != NULL) - pWlanIndex = pch; - else { - Ret = 0; - goto error; - } - - param.aucWlanIndexArray[index] = os_str_tol(pWlanIndex, 0, 10); - } - - for (index = 0; index < param.u4NumOfSTAs; index++) { - if (index != (param.u4NumOfSTAs - 1)) { - pch = strsep(&arg, "_"); - - if (pch != NULL) - pPayloadLength = pch; - else { - Ret = 0; - goto error; - } - } else { - pch = strsep(&arg, ""); - - if (pch != NULL) - pPayloadLength = pch; - else { - Ret = 0; - goto error; - } - } - - param.au4PayloadLength[index] = - os_str_tol(pPayloadLength, 0, 10); - param.au4PayloadLength[index] = - cpu2le32(param.au4PayloadLength[index]); - } - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(param)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, ¶m); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); - param.u4NumOfSTAs = cpu2le32(param.u4NumOfSTAs); - param.u4Round = cpu2le32(param.u4Round); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetTxopDefault - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * - */ -INT SetTxopDefaultProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_TXOP_DEFAULT param = { 0 }; - UINT32 cmd = MU_SET_TXOP_DEFAULT; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - param.value = cpu2le32(value); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* @Jeffrey: In the function SetTxopDefault -* -* @params: pAd, to provide Adapter -* @params: arg, the command line strings -* -* -*/ -INT ShowTxopDefaultProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - EVENT_GET_TXOP_DEFAULT result = { 0 }; - UINT32 cmd = MU_GET_TXOP_DEFAULT; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetSuLossThreshold - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * - */ -INT SetSuLossThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT16 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_SU_LOSS_THRESHOLD param = { 0 }; - UINT32 cmd = MU_SET_SU_LOSS_THRESHOLD; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - param.value = cpu2le16(value); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* @Jeffrey: In the function SetTxopDefault -* -* @params: pAd, to provide Adapter -* @params: arg, the command line strings -* -* -*/ -INT ShowSuLossThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - EVENT_MU_GET_SU_LOSS_THRESHOLD result = { 0 }; - UINT32 cmd = MU_GET_SU_LOSS_THRESHOLD; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetMuGainThreshold - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * - */ -INT SetMuGainThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT16 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_MU_GAIN_THRESHOLD param = { 0 }; - UINT32 cmd = MU_SET_MU_GAIN_THRESHOLD; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - param.value = cpu2le16(value); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* @Jeffrey: In the function SetTxopDefault -* -* @params: pAd, to provide Adapter -* @params: arg, the command line strings -* -* -*/ -INT ShowMuGainThresholdProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - EVENT_MU_GET_MU_GAIN_THRESHOLD result = { 0 }; - UINT32 cmd = MU_GET_MU_GAIN_THRESHOLD; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetSecondaryAcPolicy - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * - */ -INT SetSecondaryAcPolicyProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT16 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_MU_SECONDARY_AC_POLICY param = { 0 }; - UINT32 cmd = MU_SET_SECONDARY_AC_POLICY; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - param.value = cpu2le16(value); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* @Jeffrey: In the function SetTxopDefault -* -* @params: pAd, to provide Adapter -* @params: arg, the command line strings -* -* -*/ -INT ShowSecondaryAcPolicyProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - EVENT_MU_GET_SECONDARY_AC_POLICY result = { 0 }; - UINT32 cmd = MU_GET_SECONDARY_AC_POLICY; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetGroupTblDmcsMask - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * - */ -INT SetGroupTblDmcsMaskProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT8 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_MU_GROUP_TBL_DMCS_MASK param = { 0 }; - UINT32 cmd = MU_SET_GROUP_TBL_DMCS_MASK; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - param.value = value; - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* @Jeffrey: In the function SetTxopDefault -* -* @params: pAd, to provide Adapter -* @params: arg, the command line strings -* -* -*/ -INT ShowGroupTblDmcsMaskProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - EVENT_MU_GET_GROUP_TBL_DMCS_MASK result = { 0 }; - UINT32 cmd = MU_GET_GROUP_TBL_DMCS_MASK; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* - * @Jeffrey: In the function SetMaxGroupSearchCnt - * - * @params: pAd, to provide Adapter - * @params: arg, the command line strings - * - * - */ -INT SetMaxGroupSearchCntProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 value = 0; - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_SET_MU_MAX_GROUP_SEARCH_CNT param = { 0 }; - UINT32 cmd = MU_SET_MAX_GROUP_SEARCH_CNT; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - param.value = cpu2le32(value); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* @Jeffrey: In the function SetTxopDefault -* -* @params: pAd, to provide Adapter -* @params: arg, the command line strings -* -* -*/ -INT ShowMaxGroupSearchCntProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - EVENT_MU_GET_MAX_GROUP_SEARCH_CNT result = { 0 }; - UINT32 cmd = MU_GET_MAX_GROUP_SEARCH_CNT; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(result)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -INT ShowMuProfileTxStsCntProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - PCHAR pch = NULL; - PCHAR pIndex = NULL; - UINT16 index = 0; - CMD_GET_MU_PFID_TXS_CNT param = { 0 }; - EVENT_MU_GET_MUPROFILE_TX_STATUS_CNT result = { 0 }; - UINT32 cmd = MU_GET_MU_PROFILE_TX_STATUS_CNT; - struct _CMD_ATTRIBUTE attr = { 0 }; - - pch = arg; - - if (pch != NULL) - pIndex = pch; - else { - Ret = 0; - goto error; - } - - index = os_str_tol(pIndex, 0, 10); - param.u2PfidIndex = cpu2le16(index); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(index)); - - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -static VOID ShowGroupTblEntryCallback(char *rsp_payload, UINT16 rsp_payload_len) -{ - UINT8 ucI = 0; - P_EVENT_SHOW_GROUP_TBL_ENTRY pGentry = - (P_EVENT_SHOW_GROUP_TBL_ENTRY)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Resp Payload: ")); - - for (ucI = 0; ucI < rsp_payload_len; ucI++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %x", rsp_payload[ucI])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("group table index %d\n", pGentry->index)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Number of User %d\n", pGentry->numUser)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("BW %d\n", pGentry->BW)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("NS0 %d\n", pGentry->NS0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("NS1 %d\n", pGentry->NS1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("NS2 %d\n", pGentry->NS2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("NS3 %d\n", pGentry->NS3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("PFIDUser0 %d\n", pGentry->PFIDUser0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("PFIDUser1 %d\n", pGentry->PFIDUser1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("PFIDUser2 %d\n", pGentry->PFIDUser2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("PFIDUser3 %d\n", pGentry->PFIDUser3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("SGI %d\n", pGentry->fgIsShortGI)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("USED %d\n", pGentry->fgIsUsed)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DISABLED %d\n", pGentry->fgIsDisable)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("initMCS0 %d\n", pGentry->initMcsUser0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("initMCS1 %d\n", pGentry->initMcsUser1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("initMCS2 %d\n", pGentry->initMcsUser2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("initMCS3 %d\n", pGentry->initMcsUser3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("dMCS0 %d\n", pGentry->dMcsUser0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("dMCS1 %d\n", pGentry->dMcsUser1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("dMCS2 %d\n", pGentry->dMcsUser2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("dMCS3 %d\n", pGentry->dMcsUser3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -/* | Valid |BA | WLAN INDEX| */ -/* usage iwpriv ra0 set_mu_profile [valid] [index] [bamask] [wlanIdex] */ -static VOID ShowMuProfileEntryCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - UINT8 ucI = 0; - P_EVENT_SHOW_MUPROFILE_ENTRY pMentry = - (P_EVENT_SHOW_MUPROFILE_ENTRY)rsp_payload; - /* TODO: replaced printk to Driver logger */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("mu table index %d\n", pMentry->index)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Valid %d\n", pMentry->valid)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("BAMask %x\n", pMentry->baMask)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wlanIdx %d\n", pMentry->wlanIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("rsp payload len %d\n", rsp_payload_len)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Resp Payload: ")); - - for (ucI = 0; ucI < rsp_payload_len; ucI++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %x", rsp_payload[ucI])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -/* usage iwpriv ra0 set_mu_profile [valid] [index] [bamask] [wlanIdex] */ -static VOID ShowMuEnableCallback(char *rsp_payload, UINT16 rsp_payload_len) -{ - UINT8 ucI = 0; - P_EVENT_SHOW_MU_ENABLE pMentry = (P_EVENT_SHOW_MU_ENABLE)rsp_payload; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MU enable:%x", pMentry->fgIsEnable)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Resp Payload: ")); - - for (ucI = 0; ucI < rsp_payload_len; ucI++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %x", rsp_payload[ucI])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowGroupUserThresholdCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_GROUP_USER_THRESHOLD pGentry = - (P_EVENT_MU_GET_GROUP_USER_THRESHOLD)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Group user Threshold minimum value: %x\n", pGentry->min)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Group user Threshold maximum value: %x\n", pGentry->max)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowSecondaryAcPolicyCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_SECONDARY_AC_POLICY pGentry = - (P_EVENT_MU_GET_SECONDARY_AC_POLICY)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("secondary ac policy value: %x\n", pGentry->value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowGroupTblDmcsMaskCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_GROUP_TBL_DMCS_MASK pGentry = - (P_EVENT_MU_GET_GROUP_TBL_DMCS_MASK)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("group table dmcs mask value: %x\n", pGentry->value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowMaxGroupSearchCntCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_MAX_GROUP_SEARCH_CNT pGentry = - (P_EVENT_MU_GET_MAX_GROUP_SEARCH_CNT)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("max. group search cnt value: %x\n", pGentry->value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowTxReqMinTimeCallback(char *rsp_payload, UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_TXREQ_MIN_TIME pGentry = - (P_EVENT_MU_GET_TXREQ_MIN_TIME)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TxReqMinTime value: %x\n", pGentry->value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowMuProfileTxStsCntCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_MUPROFILE_TX_STATUS_CNT pGentry = - (P_EVENT_MU_GET_MUPROFILE_TX_STATUS_CNT)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("mu profile index: %x\n", pGentry->pfIndex)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,2) used: %x\n", pGentry->cn2used)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,2) rate down: %x\n", pGentry->cn2rateDown)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,2) delta mcs: %x\n", pGentry->cn2deltaMcs)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,2) tx fail count: %x\n", pGentry->cn2TxFailCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,2) tx succes count: %x\n", pGentry->cn2TxSuccessCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,3) used: %x\n", pGentry->cn3used)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,3) rate down: %x\n", pGentry->cn3rateDown)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,3) delta mcs: %x\n", pGentry->cn3deltaMcs)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,3) tx fail count: %x\n", pGentry->cn3TxFailCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,3) tx succes count: %x\n", pGentry->cn3TxSuccessCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,4) used: %x\n", pGentry->cn4used)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,4) rate down: %x\n", pGentry->cn4rateDown)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,4) delta mcs: %x\n", pGentry->cn4deltaMcs)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,4) tx fail count: %x\n", pGentry->cn4TxFailCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("c(n,4) tx succes count: %x\n", pGentry->cn4TxSuccessCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowSuNssCheckCallback(char *rsp_payload, UINT16 rsp_payload_len) -{ - P_EVENT_SHOW_NSS_CHECK ptr = (P_EVENT_SHOW_NSS_CHECK)rsp_payload; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("SU NSS Check value: %x\n", ptr->fgIsEnable)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowGroupNssThresholdCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_GROUP_NSS_THRESHOLD pGentry = - (P_EVENT_MU_GET_GROUP_NSS_THRESHOLD)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Group Nss Threshold minimum value: %x\n", pGentry->min)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Group Nss Threshold maximum value: %x\n", pGentry->max)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowClusterTblEntryCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_CLUSTER_TBL_ENTRY pGentry = - (P_EVENT_MU_GET_CLUSTER_TBL_ENTRY)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Cluster index %d\n", pGentry->index)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("GID User Membership Status [0] = %x\n", - pGentry->gidUserMemberStatus[0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("GID User Membership Status [1] = %x\n", - pGentry->gidUserMemberStatus[1])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("GID User Position [0] = %x\n", pGentry->gidUserPosition[0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("GID User Position [1] = %x\n", pGentry->gidUserPosition[1])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("GID User Position [2] = %x\n", pGentry->gidUserPosition[2])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("GID User Position [3] = %x\n", pGentry->gidUserPosition[3])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowTxopDefaultCallback(char *rsp_payload, UINT16 rsp_payload_len) -{ - P_EVENT_GET_TXOP_DEFAULT pGentry = - (P_EVENT_GET_TXOP_DEFAULT)rsp_payload; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TXOP default value: %x\n", pGentry->value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowSuLossThresholdCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_SU_LOSS_THRESHOLD pGentry = - (P_EVENT_MU_GET_SU_LOSS_THRESHOLD)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("su loss threshold value: %x\n", pGentry->value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowMuGainThresholdCallback(char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_MU_GET_MU_GAIN_THRESHOLD pGentry = - (P_EVENT_MU_GET_MU_GAIN_THRESHOLD)rsp_payload; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("mu gain threshold value: %x\n", pGentry->value)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowStatusOfCommand(char *rsp_payload, UINT16 rsp_payload_len) -{ - P_EVENT_STATUS pGentry = (P_EVENT_STATUS)rsp_payload; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("status: %x\n", pGentry->status)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -static VOID ShowStatusOfHqaCommand(char *rsp_payload, UINT16 rsp_payload_len) -{ - P_EVENT_HQA_STATUS pGentry = (P_EVENT_HQA_STATUS)rsp_payload; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("status: %x\n", pGentry->status)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("END")); -} -bool hqa_wifi_test_mu_cal_init_mcs(PRTMP_ADAPTER pAd, - P_MU_STRUCT_SET_CALC_INIT_MCS pParams) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_HQA_SET_CALC_INIT_MCS; - CMD_HQA_SET_INIT_MCS param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.num_of_user = pParams->num_of_user; - param.bandwidth = pParams->bandwidth; - param.nss_of_user0 = pParams->nss_of_user0; - param.nss_of_user1 = pParams->nss_of_user1; - param.nss_of_user2 = pParams->nss_of_user2; - param.nss_of_user3 = pParams->nss_of_user3; - param.pf_mu_id_of_user0 = pParams->pf_mu_id_of_user0; - param.pf_mu_id_of_user1 = pParams->pf_mu_id_of_user1; - param.pf_mu_id_of_user2 = pParams->pf_mu_id_of_user2; - param.pf_mu_id_of_user3 = pParams->pf_mu_id_of_user3; - param.spe_index = pParams->spe_index; - param.num_of_txer = pParams->num_of_txer; - param.group_index = cpu2le32(pParams->group_index); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("spe_index %d\n", param.spe_index)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Group Index Values %d\n", pParams->group_index)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Txer Values %d\n", pParams->num_of_txer)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -static VOID hqa_wifi_test_mu_get_init_mcs_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_HQA_INIT_MCS pEntry = (P_EVENT_HQA_INIT_MCS)rsp_payload; - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! event fill null!!\n", __func__)); - return; - } - - if (msg->attr.rsp.wb_buf_in_calbk == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! buffer not specific by cmd\n", - __func__)); - } else { - P_MU_STRUCT_MU_GROUP_INIT_MCS pOutput = - (P_MU_STRUCT_MU_GROUP_INIT_MCS) - msg->attr.rsp.wb_buf_in_calbk; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: EVENT_HQA_INIT_MCS\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("eventId %u\n", pEntry->u4EventId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user0InitMCS %u\n", - cpu2le32(pEntry->rEntry.user0InitMCS))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user1InitMCS %u\n", - cpu2le32(pEntry->rEntry.user1InitMCS))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user2InitMCS %u\n", - cpu2le32(pEntry->rEntry.user2InitMCS))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user3InitMCS %u\n", - cpu2le32(pEntry->rEntry.user3InitMCS))); - pOutput->user0InitMCS = cpu2le32(pEntry->rEntry.user0InitMCS); - pOutput->user1InitMCS = cpu2le32(pEntry->rEntry.user1InitMCS); - pOutput->user2InitMCS = cpu2le32(pEntry->rEntry.user2InitMCS); - pOutput->user3InitMCS = cpu2le32(pEntry->rEntry.user3InitMCS); - } -} -bool hqa_wifi_test_mu_get_init_mcs(PRTMP_ADAPTER pAd, UINT32 groupIndex, - P_MU_STRUCT_MU_GROUP_INIT_MCS poutput) -{ - INT32 Ret = 0; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_HQA_CALC_GET_INIT_MCS_ENTRY param = { 0 }; - UINT32 cmd = MU_HQA_GET_CALC_INIT_MCS; - struct _CMD_ATTRIBUTE attr = { 0 }; - - if (poutput == NULL) { - Ret = FALSE; - goto error; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Group Index Values %d\n", groupIndex)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("poutput = %p\n", poutput)); - param.groupIndex = cpu2le32(groupIndex); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: param.groupIndex %u\n", __func__, param.groupIndex)); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_HQA_INIT_MCS)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, poutput); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -bool hqa_wifi_test_mu_cal_lq(PRTMP_ADAPTER pAd, P_MU_STRUCT_SET_CALC_LQ pParams) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_HQA_SET_CALC_LQ; - CMD_HQA_SET_MU_CALC_LQ param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.num_of_user = pParams->num_of_user; - param.bandwidth = pParams->bandwidth; - param.nss_of_user0 = pParams->nss_of_user0; - param.nss_of_user1 = pParams->nss_of_user1; - param.nss_of_user2 = pParams->nss_of_user2; - param.nss_of_user3 = pParams->nss_of_user3; - param.pf_mu_id_of_user0 = pParams->pf_mu_id_of_user0; - param.pf_mu_id_of_user1 = pParams->pf_mu_id_of_user1; - param.pf_mu_id_of_user2 = pParams->pf_mu_id_of_user2; - param.pf_mu_id_of_user3 = pParams->pf_mu_id_of_user3; - param.spe_index = pParams->spe_index; - param.num_of_txer = pParams->num_of_txer; - param.group_index = cpu2le32(pParams->group_index); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: CMD_HQA_SET_MU_CALC_LQ\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("num_of_user = %u\n", param.num_of_user)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("bandwidth = %u\n", param.bandwidth)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("nss_of_user0 = %u\n", param.nss_of_user0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("nss_of_user1 = %u\n", param.nss_of_user1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("nss_of_user2 = %u\n", param.nss_of_user2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("nss_of_user3 = %u\n", param.nss_of_user3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pf_mu_id_of_user0 = %u\n", param.pf_mu_id_of_user0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pf_mu_id_of_user1 = %u\n", param.pf_mu_id_of_user1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pf_mu_id_of_user2 = %u\n", param.pf_mu_id_of_user2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pf_mu_id_of_user3 = %u\n", param.pf_mu_id_of_user3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("num_of_txer = %u\n", param.num_of_txer)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("group_index = %u\n", param.group_index)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -bool hqa_wifi_test_su_cal_lq(PRTMP_ADAPTER pAd, - P_MU_STRUCT_SET_SU_CALC_LQ pParams) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_HQA_SET_CALC_SU_LQ; - CMD_HQA_SET_SU_CALC_LQ param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.num_of_user = pParams->num_of_user; - param.bandwidth = pParams->bandwidth; - param.nss_of_user0 = pParams->nss_of_user0; - param.pf_mu_id_of_user0 = pParams->pf_mu_id_of_user0; - param.num_of_txer = pParams->num_of_txer; - param.group_index = cpu2le32(pParams->group_index); - param.spe_index = pParams->spe_index; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: CMD_HQA_SET_SU_CALC_LQ\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("num_of_user = %u\n", param.num_of_user)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("bandwidth = %u\n", param.bandwidth)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("nss_of_user0 = %u\n", param.nss_of_user0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pf_mu_id_of_user0 = %u\n", param.pf_mu_id_of_user0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("num_of_txer = %u\n", param.num_of_txer)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("group_index = %u\n", param.group_index)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -static VOID hqa_wifi_test_mu_get_su_lq_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_HQA_GET_SU_CALC_LQ pEntry = - (P_EVENT_HQA_GET_SU_CALC_LQ)rsp_payload; - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! event fill null!!\n", __func__)); - return; - } - - if (msg->attr.rsp.wb_buf_in_calbk == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! buffer not specific by cmd\n", - __func__)); - } else { - P_SU_STRUCT_LQ_REPORT pOutput = - (P_SU_STRUCT_LQ_REPORT)msg->attr.rsp.wb_buf_in_calbk; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:EVENT_HQA_GET_SU_CALC_LQ\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("eventId %u\n", pEntry->u4EventId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[4] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[4]))); - pOutput->lq_report[0] = cpu2le32(pEntry->rEntry.lq_report[0]); - pOutput->lq_report[1] = cpu2le32(pEntry->rEntry.lq_report[1]); - pOutput->lq_report[2] = cpu2le32(pEntry->rEntry.lq_report[2]); - pOutput->lq_report[3] = cpu2le32(pEntry->rEntry.lq_report[3]); - pOutput->lq_report[4] = cpu2le32(pEntry->rEntry.lq_report[4]); - } -} -bool hqa_wifi_test_su_get_lq(PRTMP_ADAPTER pAd, P_SU_STRUCT_LQ_REPORT pOutput) -{ - INT32 Ret = 0; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_HQA_GET_CALC_SU_LQ; - struct _CMD_ATTRIBUTE attr = { 0 }; - - if (pOutput == NULL) { - Ret = -1; - goto error; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:intput pOutput = %p\n", __func__, pOutput)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_HQA_GET_SU_CALC_LQ)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pOutput); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -static VOID hqa_wifi_test_mu_get_lq_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_HQA_GET_MU_CALC_LQ pEntry = - (P_EVENT_HQA_GET_MU_CALC_LQ)rsp_payload; - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! event fill null!!\n", __func__)); - return; - } - - if (msg->attr.rsp.wb_buf_in_calbk == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! buffer not specific by cmd\n", - __func__)); - } else { - P_MU_STRUCT_LQ_REPORT pOutput = - (P_MU_STRUCT_LQ_REPORT)msg->attr.rsp.wb_buf_in_calbk; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:EVENT_HQA_GET_MU_CALC_LQ\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("eventId %u\n", pEntry->u4EventId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][0] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[0][0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][1] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[0][1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][2] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[0][2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][3] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[0][3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][4] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[0][4]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][0] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[1][0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][1] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[1][1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][2] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[1][2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][3] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[1][3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][4] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[1][4]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][0] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[2][0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][1] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[2][1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][2] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[2][2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][3] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[2][3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][4] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[2][4]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][0] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[3][0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][1] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[3][1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][2] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[3][2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][3] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[3][3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][4] = 0x%x\n", - cpu2le32(pEntry->rEntry.lq_report[3][4]))); - pOutput->lq_report[0][0] = - cpu2le32(pEntry->rEntry.lq_report[0][0]); - pOutput->lq_report[0][1] = - cpu2le32(pEntry->rEntry.lq_report[0][1]); - pOutput->lq_report[0][2] = - cpu2le32(pEntry->rEntry.lq_report[0][2]); - pOutput->lq_report[0][3] = - cpu2le32(pEntry->rEntry.lq_report[0][3]); - pOutput->lq_report[0][4] = - cpu2le32(pEntry->rEntry.lq_report[0][4]); - pOutput->lq_report[1][0] = - cpu2le32(pEntry->rEntry.lq_report[1][0]); - pOutput->lq_report[1][1] = - cpu2le32(pEntry->rEntry.lq_report[1][1]); - pOutput->lq_report[1][2] = - cpu2le32(pEntry->rEntry.lq_report[1][2]); - pOutput->lq_report[1][3] = - cpu2le32(pEntry->rEntry.lq_report[1][3]); - pOutput->lq_report[1][4] = - cpu2le32(pEntry->rEntry.lq_report[1][4]); - pOutput->lq_report[2][0] = - cpu2le32(pEntry->rEntry.lq_report[2][0]); - pOutput->lq_report[2][1] = - cpu2le32(pEntry->rEntry.lq_report[2][1]); - pOutput->lq_report[2][2] = - cpu2le32(pEntry->rEntry.lq_report[2][2]); - pOutput->lq_report[2][3] = - cpu2le32(pEntry->rEntry.lq_report[2][3]); - pOutput->lq_report[2][4] = - cpu2le32(pEntry->rEntry.lq_report[2][4]); - pOutput->lq_report[3][0] = - cpu2le32(pEntry->rEntry.lq_report[3][0]); - pOutput->lq_report[3][1] = - cpu2le32(pEntry->rEntry.lq_report[3][1]); - pOutput->lq_report[3][2] = - cpu2le32(pEntry->rEntry.lq_report[3][2]); - pOutput->lq_report[3][3] = - cpu2le32(pEntry->rEntry.lq_report[3][3]); - pOutput->lq_report[3][4] = - cpu2le32(pEntry->rEntry.lq_report[3][4]); - } -} -bool hqa_wifi_test_mu_get_lq(PRTMP_ADAPTER pAd, P_MU_STRUCT_LQ_REPORT pOutput) -{ - INT32 Ret = 0; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_HQA_GET_CALC_LQ; - struct _CMD_ATTRIBUTE attr = { 0 }; - - if (pOutput == NULL) { - Ret = -1; - goto error; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:intput pOutput = %p\n", __func__, pOutput)); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_HQA_GET_MU_CALC_LQ)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pOutput); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -bool hqa_wifi_test_snr_offset_set(PRTMP_ADAPTER pAd, char val) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_HQA_SET_SNR_OFFSET; - CMD_HQA_SET_MU_SNR_OFFSET param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.offset = val; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, offset:0x%x\n", __func__, val)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d_\n", __func__, Ret)); - return Ret; -} -bool hqa_wifi_test_mu_set_zero_nss(PRTMP_ADAPTER pAd, unsigned char val) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - CMD_HQA_SET_MU_NSS_ZERO param = { 0 }; - UINT32 cmd = MU_HQA_SET_ZERO_NSS; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.ucValue = val; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, val:%u\n", __func__, val)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -bool hqa_wifi_test_mu_speed_up_lq(PRTMP_ADAPTER pAd, int val) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - CMD_HQA_SET_MU_LQ_SPEED_UP param = { 0 }; - UINT32 cmd = MU_HQA_SET_SPEED_UP_LQ; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.ucValue = val; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, val:%d\n", __func__, val)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -bool hqa_wifi_test_mu_table_set(PRTMP_ADAPTER pAd, P_MU_STRUCT_MU_TABLE ptr) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - UINT32 cmd = 0; - P_CMD_HQA_SET_MU_METRIC_TABLE pMuParam = NULL; - P_CMD_HQA_SET_SU_METRIC_TABLE pSuParam = NULL; - UINT32 i = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - if (ptr == NULL) { - Ret = -1; - goto error; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: type = %u, length = %u\n", __func__, ptr->type, - ptr->length)); - - cmd = (ptr->type == SU) ? MU_HQA_SET_SU_TABLE : MU_HQA_SET_MU_TABLE; - - if (ptr->type == SU) { - os_alloc_mem(pAd, (UCHAR **)&pSuParam, sizeof(*pSuParam)); - NdisZeroMemory(pSuParam, sizeof(*pSuParam)); - } else if (ptr->type == MU) { - os_alloc_mem(pAd, (UCHAR **)&pMuParam, sizeof(*pMuParam)); - NdisZeroMemory(pMuParam, sizeof(*pMuParam)); - } else { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("error type!\n")); - Ret = -1; - goto error; - } - - if (ptr->type == SU) { - if (ptr->length <= sizeof(pSuParam->metric_table)) - NdisCopyMemory(pSuParam->metric_table, ptr->prTable, - ptr->length); - else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("length(%u) error!!should < su_metric_tbl(%zu)\n", - ptr->length, sizeof(pSuParam->metric_table))); - Ret = -1; - goto error; - } - } else { - if (ptr->length <= sizeof(pMuParam->metric_table)) - NdisCopyMemory(pMuParam->metric_table, ptr->prTable, - ptr->length); - else { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("length(%u) error!!should < mu_metric_tbl(%zu)\n", - ptr->length, sizeof(pSuParam->metric_table))); - Ret = -1; - goto error; - } - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", - ptr->type == SU ? "su_metric_table:" : "mu_metric_table:")); - - if (ptr->type == MU) { - for (i = 0; i < ptr->length; i += 8) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", - pMuParam->metric_table[i + 0], - pMuParam->metric_table[i + 1], - pMuParam->metric_table[i + 2], - pMuParam->metric_table[i + 3], - pMuParam->metric_table[i + 4], - pMuParam->metric_table[i + 5], - pMuParam->metric_table[i + 6], - pMuParam->metric_table[i + 7])); - } - } else { - for (i = 0; i < ptr->length; i += 3) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0x%x 0x%x 0x%x\n", - pSuParam->metric_table[i + 0], - pSuParam->metric_table[i + 1], - pSuParam->metric_table[i + 2])); - } - } - - msg = AndesAllocCmdMsg( - pAd, (sizeof(cmd) + ((ptr->type == SU) ? (sizeof(*pSuParam)) : - (sizeof(*pMuParam))))); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg( - msg, (ptr->type == SU) ? (char *)pSuParam : (char *)pMuParam, - (ptr->type == SU) ? (sizeof(*pSuParam)) : (sizeof(*pMuParam))); - AndesSendCmdMsg(pAd, msg); -error: - - if (ptr && (ptr->type == SU)) { - if (pSuParam) - os_free_mem(pSuParam); - } else { - if (pMuParam) - os_free_mem(pMuParam); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -static void dump_set_mu_group_parms(P_MU_STRUCT_MU_GROUP mu_group) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_STRUCT_MU_GROUP Content\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("groupIndex = %u\n", mu_group->groupIndex)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("numOfUser = %u\n", mu_group->numOfUser)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("fgUser0Ldpc = %u\n", mu_group->user0Ldpc)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("fgUser1Ldpc = %u\n", mu_group->user1Ldpc)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("fgUser20Ldpc = %u\n", mu_group->user2Ldpc)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("fgUser3Ldpc = %u\n", mu_group->user3Ldpc)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("shortGI = %u\n", mu_group->shortGI)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("bw = %u\n", mu_group->bw)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user0Nss = %u\n", mu_group->user0Nss)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user1Nss = %u\n", mu_group->user1Nss)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user2Nss = %u\n", mu_group->user2Nss)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user3Nss = %u\n", mu_group->user3Nss)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("groupId = %u\n", mu_group->groupId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user0UP = %u\n", mu_group->user0UP)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user1UP = %u\n", mu_group->user1UP)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user2UP = %u\n", mu_group->user2UP)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user3UP = %u\n", mu_group->user3UP)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user0MuPfId = %u\n", mu_group->user0MuPfId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user1MuPfId = %u\n", mu_group->user1MuPfId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user2MuPfId = %u\n", mu_group->user2MuPfId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user3MuPfId = %u\n", mu_group->user3MuPfId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user0InitMCS = %u\n", mu_group->user0InitMCS)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user1InitMCS = %u\n", mu_group->user1InitMCS)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user2InitMCS = %u\n", mu_group->user2InitMCS)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("user3InitMCS = %u\n", mu_group->user3InitMCS)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("aucUser0MacAddr:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(mu_group->aucUser0MacAddr))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("aucUser1MacAddr:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(mu_group->aucUser1MacAddr))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("aucUser2MacAddr:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(mu_group->aucUser2MacAddr))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("aucUser3MacAddr:%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(mu_group->aucUser3MacAddr))); -} -bool hqa_wifi_test_mu_group_set(PRTMP_ADAPTER pAd, - P_MU_STRUCT_MU_GROUP mu_group) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - UINT32 cmd = MU_HQA_SET_GROUP; - CMD_HQA_SET_MU_GROUP param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.groupIndex = cpu2le32(mu_group->groupIndex); - param.numOfUser = mu_group->numOfUser; - param.fgUser0Ldpc = mu_group->user0Ldpc; - param.fgUser1Ldpc = mu_group->user1Ldpc; - param.fgUser2Ldpc = mu_group->user2Ldpc; - param.fgUser3Ldpc = mu_group->user3Ldpc; - param.bandwidth = mu_group->bw; - param.fgIsShortGI = mu_group->shortGI; - param.user0Nss = mu_group->user0Nss; - param.user1Nss = mu_group->user1Nss; - param.user2Nss = mu_group->user2Nss; - param.user3Nss = mu_group->user3Nss; - param.groupId = mu_group->groupId; - param.user0InitMCS = mu_group->user0InitMCS; - param.user1InitMCS = mu_group->user1InitMCS; - param.user2InitMCS = mu_group->user2InitMCS; - param.user3InitMCS = mu_group->user3InitMCS; - param.user0MuPfId = mu_group->user0MuPfId; - param.user1MuPfId = mu_group->user1MuPfId; - param.user2MuPfId = mu_group->user2MuPfId; - param.user3MuPfId = mu_group->user3MuPfId; - /* config_mu_vht_ldpc_cap_in_wtbl(pAd, mu_group); */ - dump_set_mu_group_parms(mu_group); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -static VOID hqa_wifi_test_mu_get_qd_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_HQA_MU_QD pEntry = (P_EVENT_HQA_MU_QD)rsp_payload; - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! event fill null!!\n", __func__)); - return; - } - - if (msg->attr.rsp.wb_buf_in_calbk == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! buffer not specific by cmd\n", - __func__)); - } else { - P_MU_STRUCT_MU_QD pOutput = - (P_MU_STRUCT_MU_QD)msg->attr.rsp.wb_buf_in_calbk; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:EVENT_HQA_MU_QD\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("eventId %u\n", pEntry->u4EventId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[0] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[1] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[2] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[3] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[4] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[4]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[5] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[5]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[6] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[6]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[7] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[7]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[8] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[8]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[9] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[9]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[10] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[10]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[11] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[11]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[12] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[12]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[13] = 0x%x\n", - cpu2le32(pEntry->rEntry.qd_report[13]))); - pOutput->qd_report[0] = cpu2le32(pEntry->rEntry.qd_report[0]); - pOutput->qd_report[1] = cpu2le32(pEntry->rEntry.qd_report[1]); - pOutput->qd_report[2] = cpu2le32(pEntry->rEntry.qd_report[2]); - pOutput->qd_report[3] = cpu2le32(pEntry->rEntry.qd_report[3]); - pOutput->qd_report[4] = cpu2le32(pEntry->rEntry.qd_report[4]); - pOutput->qd_report[5] = cpu2le32(pEntry->rEntry.qd_report[5]); - pOutput->qd_report[6] = cpu2le32(pEntry->rEntry.qd_report[6]); - pOutput->qd_report[7] = cpu2le32(pEntry->rEntry.qd_report[7]); - pOutput->qd_report[8] = cpu2le32(pEntry->rEntry.qd_report[8]); - pOutput->qd_report[9] = cpu2le32(pEntry->rEntry.qd_report[9]); - pOutput->qd_report[10] = cpu2le32(pEntry->rEntry.qd_report[10]); - pOutput->qd_report[11] = cpu2le32(pEntry->rEntry.qd_report[11]); - pOutput->qd_report[12] = cpu2le32(pEntry->rEntry.qd_report[12]); - pOutput->qd_report[13] = cpu2le32(pEntry->rEntry.qd_report[13]); - } -} -bool hqa_wifi_test_mu_get_qd(PRTMP_ADAPTER pAd, INT8 subcarrierIndex, - P_MU_STRUCT_MU_QD pOutput) -{ - INT32 Ret = 0; - /* prepare command message */ - struct cmd_msg *msg = NULL; - CMD_HQA_GET_QD param = { 0 }; - UINT32 cmd = MU_HQA_GET_QD; - struct _CMD_ATTRIBUTE attr = { 0 }; - - if (!pOutput) - return -1; - - param.scIdx = subcarrierIndex; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(param.scIdx = %d_\n", __func__, param.scIdx)); - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_HQA_MU_QD)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pOutput); - SET_CMD_ATTR_RSP_HANDLER(attr, eventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -bool hqa_wifi_test_mu_set_enable(PRTMP_ADAPTER pAd, unsigned char val) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - CMD_HQA_SET_MU_ENABLE param = { 0 }; - UINT32 cmd = MU_HQA_SET_ENABLE; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.fgIsEnable = val; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(param.fgIsEnable = %d_\n", __func__, param.fgIsEnable)); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -/* New API for Mu TX */ -bool hqa_wifi_test_mu_trigger_mu_tx( - PRTMP_ADAPTER pAd, P_MU_STRUCT_TRIGGER_MU_TX_FRAME_PARAM pParam) -{ - INT Ret = 0; - struct cmd_msg *msg = NULL; - CMD_SET_TRIGGER_MU_TX_FRAME param = { 0 }; - UINT32 cmd = MU_SET_TRIGGER_MU_TX; - struct _CMD_ATTRIBUTE attr = { 0 }; - - param.ucAcIndex = 1; - param.fgIsRandomPattern = pParam->fgIsRandomPattern; - param.u4NumOfSTAs = cpu2le32(pParam->u4NumOfSTAs + 1); - param.u4Round = cpu2le32(pParam->u4MuPacketCount); - param.au4PayloadLength[0] = cpu2le32(pParam->msduPayloadLength0); - param.au4PayloadLength[1] = cpu2le32(pParam->msduPayloadLength1); - param.au4PayloadLength[2] = cpu2le32(pParam->msduPayloadLength2); - param.au4PayloadLength[3] = cpu2le32(pParam->msduPayloadLength3); - param.aucWlanIndexArray[0] = 1; - param.aucWlanIndexArray[1] = 2; - param.aucWlanIndexArray[2] = 3; - param.aucWlanIndexArray[3] = 4; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:MD_SET_TRIGGER_MU_TX_FRAME\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ucAcIndex = %u\n", param.ucAcIndex)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("fgIsRandomPattern = %u\n", param.fgIsRandomPattern)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("u4NumOfSTAs = %u\n", param.u4NumOfSTAs)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("u4Round = %u\n", param.u4Round)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("au4PayloadLength[0] = %u\n", param.au4PayloadLength[0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("au4PayloadLength[1] = %u\n", param.au4PayloadLength[1])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("au4PayloadLength[2] = %u\n", param.au4PayloadLength[2])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("au4PayloadLength[3] = %u\n", param.au4PayloadLength[3])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("aucWlanIndexArray[0] = %u\n", param.aucWlanIndexArray[0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("aucWlanIndexArray[1] = %u\n", param.aucWlanIndexArray[1])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("aucWlanIndexArray[2] = %u\n", param.aucWlanIndexArray[2])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("aucWlanIndexArray[3] = %u\n", param.aucWlanIndexArray[3])); - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = -1; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} -static VOID eventDispatcher(struct cmd_msg *msg, char *rsp_payload, - UINT16 rsp_payload_len) -{ - UINT32 u4EventId = (*(UINT32 *)rsp_payload); - char *pData = (rsp_payload); - UINT16 len = (rsp_payload_len); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: u4EventId = %u, len = %u\n", __func__, u4EventId, len)); -#ifdef RT_BIG_ENDIAN - u4EventId = cpu2le32(u4EventId); -#endif - - switch (u4EventId) { - case MU_EVENT_MU_ENABLE: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_MU_ENABLE\n", __func__)); - ShowMuEnableCallback(pData, len); - break; - - case MU_EVENT_MUPROFILE_ENTRY: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_MUPROFILE_ENTRY\n", __func__)); - ShowMuProfileEntryCallback(pData, len); - break; - - case MU_EVENT_GROUP_TBL_ENTRY: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_GROUP_TBL_ENTRY\n", __func__)); - ShowGroupTblEntryCallback(pData, len); - break; - - case MU_EVENT_CALC_INIT_MCS: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_CALC_INIT_MCS\n", __func__)); - ShowGroupTblEntryCallback(pData, len); - break; - - case MU_EVENT_GROUP_NSS_THRESHOLD: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_GROUP_NSS_THRESHOLD\n", __func__)); - ShowGroupNssThresholdCallback(pData, len); - break; - - case MU_EVENT_TXREQ_MIN_TIME: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_TXREQ_MIN_TIME\n", __func__)); - ShowTxReqMinTimeCallback(pData, len); - break; - - case MU_EVENT_GROUP_USER_THRESHOLD: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_GROUP_USER_THRESHOLD\n", __func__)); - ShowGroupUserThresholdCallback(pData, len); - break; - - case MU_EVENT_CLUSTER_TBL_ENTRY: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_CLUSTER_TBL_ENTRY\n", __func__)); - ShowClusterTblEntryCallback(pData, len); - break; - - case MU_EVENT_SU_NSS_CHECK: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_SU_NSS_CHECK\n", __func__)); - ShowSuNssCheckCallback(pData, len); - break; - - case MU_EVENT_TXOP_DEFAULT: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_TXOP_DEFAULT\n", __func__)); - ShowTxopDefaultCallback(pData, len); - break; - - case MU_EVENT_SU_LOSS_THRESHOLD: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_SU_LOSS_THRESHOLD\n", __func__)); - ShowSuLossThresholdCallback(pData, len); - break; - - case MU_EVENT_MU_GAIN_THRESHOLD: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_MU_GAIN_THRESHOLD\n", __func__)); - ShowMuGainThresholdCallback(pData, len); - break; - - case MU_EVENT_SECONDARY_AC_POLICY: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_SECONDARY_AC_POLICY\n", __func__)); - ShowSecondaryAcPolicyCallback(pData, len); - break; - - case MU_EVENT_GROUP_TBL_DMCS_MASK: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_GROUP_TBL_DMCS_MASK\n", __func__)); - ShowGroupTblDmcsMaskCallback(pData, len); - break; - - case MU_EVENT_MAX_GROUP_SEARCH_CNT: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_MAX_GROUP_SEARCH_CNT\n", __func__)); - ShowMaxGroupSearchCntCallback(pData, len); - break; - - case MU_EVENT_MUPROFILE_TX_STS_CNT: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_MUPROFILE_TX_STS_CNT\n", __func__)); - ShowMuProfileTxStsCntCallback(pData, len); - break; - - case MU_EVENT_STATUS: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_STATUS\n", __func__)); - ShowStatusOfCommand(pData, len); - break; - - case MU_EVENT_HQA_STATUS: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_HQA_STATUS\n", __func__)); - ShowStatusOfHqaCommand(pData, len); - break; - - case MU_EVENT_HQA_GET_INIT_MCS: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_HQA_GET_INIT_MCS\n", __func__)); - hqa_wifi_test_mu_get_init_mcs_callback(msg, pData, len); - break; - - case MU_EVENT_HQA_GET_QD: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_HQA_GET_QD\n", __func__)); - hqa_wifi_test_mu_get_qd_callback(msg, pData, len); - break; - - case MU_EVENT_HQA_GET_LQ: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_HQA_GET_LQ\n", __func__)); - hqa_wifi_test_mu_get_lq_callback(msg, pData, len); - break; - - case MU_EVENT_HQA_GET_SU_LQ: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MU_EVENT_HQA_GET_SU_LQ\n", __func__)); - hqa_wifi_test_mu_get_su_lq_callback(msg, pData, len); - break; - - default: - break; - } -} -/* MU UT API test code */ -INT32 hqa_mu_get_init_mcs(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - UINT32 gid = 0; - MU_STRUCT_MU_GROUP_INIT_MCS init_mcs; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: arg = %s\n", __func__, arg)); - gid = os_str_toul(arg, 0, 10); - os_zero_mem(&init_mcs, sizeof(init_mcs)); - Ret = hqa_wifi_test_mu_get_init_mcs(pAd, gid, &init_mcs); - - if (Ret == 0) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, gid:%u\n", __func__, gid)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, init_mcs.user1InitMCS:%u\n", __func__, - init_mcs.user0InitMCS)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, init_mcs.user1InitMCS:%u\n", __func__, - init_mcs.user1InitMCS)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, init_mcs.user1InitMCS:%u\n", __func__, - init_mcs.user2InitMCS)); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, init_mcs.user1InitMCS:%u\n", __func__, - init_mcs.user3InitMCS)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_cal_init_mcs(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - MU_STRUCT_SET_CALC_INIT_MCS param = { 0 }; - UINT32 num_of_user = 0; - UINT32 bandwidth = 0; - UINT32 nss_of_user0 = 0; - UINT32 nss_of_user1 = 0; - UINT32 nss_of_user2 = 0; - UINT32 nss_of_user3 = 0; - UINT32 pf_mu_id_of_user0 = 0; - UINT32 pf_mu_id_of_user1 = 0; - UINT32 pf_mu_id_of_user2 = 0; - UINT32 pf_mu_id_of_user3 = 0; - UINT32 num_of_txer = 0; - UINT32 group_index = 0; - PCHAR pnum_of_user = NULL; - PCHAR pbandwidth = NULL; - PCHAR pnss_of_user0 = NULL; - PCHAR pnss_of_user1 = NULL; - PCHAR pnss_of_user2 = NULL; - PCHAR pnss_of_user3 = NULL; - PCHAR ppf_mu_id_of_user0 = NULL; - PCHAR ppf_mu_id_of_user1 = NULL; - PCHAR ppf_mu_id_of_user2 = NULL; - PCHAR ppf_mu_id_of_user3 = NULL; - PCHAR pnum_of_txer = NULL; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: arg = %s\n", __func__, arg)); - pnum_of_user = strsep(&arg, ":"); - pbandwidth = strsep(&arg, ":"); - pnss_of_user0 = strsep(&arg, ":"); - pnss_of_user1 = strsep(&arg, ":"); - pnss_of_user2 = strsep(&arg, ":"); - pnss_of_user3 = strsep(&arg, ":"); - ppf_mu_id_of_user0 = strsep(&arg, ":"); - ppf_mu_id_of_user1 = strsep(&arg, ":"); - ppf_mu_id_of_user2 = strsep(&arg, ":"); - ppf_mu_id_of_user3 = strsep(&arg, ":"); - pnum_of_txer = strsep(&arg, ":"); - - if (pnum_of_user == NULL || pbandwidth == NULL || - pnss_of_user0 == NULL || pnss_of_user1 == NULL || - pnss_of_user2 == NULL || pnss_of_user3 == NULL || - ppf_mu_id_of_user0 == NULL || ppf_mu_id_of_user1 == NULL || - ppf_mu_id_of_user2 == NULL || ppf_mu_id_of_user3 == NULL || - pnum_of_txer == NULL || arg == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Invalid parameters\n", __func__)); - return -1; - } - - num_of_user = os_str_toul(pnum_of_user, 0, 10); - bandwidth = os_str_toul(pbandwidth, 0, 10); - nss_of_user0 = os_str_toul(pnss_of_user0, 0, 10); - nss_of_user1 = os_str_toul(pnss_of_user1, 0, 10); - nss_of_user2 = os_str_toul(pnss_of_user2, 0, 10); - nss_of_user3 = os_str_toul(pnss_of_user3, 0, 10); - pf_mu_id_of_user0 = os_str_toul(ppf_mu_id_of_user0, 0, 10); - pf_mu_id_of_user1 = os_str_toul(ppf_mu_id_of_user1, 0, 10); - pf_mu_id_of_user2 = os_str_toul(ppf_mu_id_of_user2, 0, 10); - pf_mu_id_of_user3 = os_str_toul(ppf_mu_id_of_user3, 0, 10); - num_of_txer = os_str_toul(pnum_of_txer, 0, 10); - group_index = os_str_toul(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: gid = %u, num_txer = %u\n", __func__, group_index, - num_of_txer)); - os_zero_mem(¶m, sizeof(param)); - param.num_of_user = num_of_user; - param.bandwidth = bandwidth; - param.nss_of_user0 = nss_of_user0; - param.nss_of_user1 = nss_of_user1; - param.nss_of_user2 = nss_of_user2; - param.nss_of_user3 = nss_of_user3; - param.pf_mu_id_of_user0 = pf_mu_id_of_user0; - param.pf_mu_id_of_user1 = pf_mu_id_of_user1; - param.pf_mu_id_of_user2 = pf_mu_id_of_user2; - param.pf_mu_id_of_user3 = pf_mu_id_of_user3; - param.num_of_txer = num_of_txer; - param.group_index = group_index; - Ret = hqa_wifi_test_mu_cal_init_mcs(pAd, ¶m); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_cal_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - UINT32 num_of_user = 0; - UINT32 bandwidth = 0; - UINT32 nss_of_user0 = 0; - UINT32 nss_of_user1 = 0; - UINT32 nss_of_user2 = 0; - UINT32 nss_of_user3 = 0; - UINT32 pf_mu_id_of_user0 = 0; - UINT32 pf_mu_id_of_user1 = 0; - UINT32 pf_mu_id_of_user2 = 0; - UINT32 pf_mu_id_of_user3 = 0; - UINT32 num_of_txer = 0; - UINT32 group_index = 0; - PCHAR pnum_of_user = NULL; - PCHAR pbandwidth = NULL; - PCHAR pnss_of_user0 = NULL; - PCHAR pnss_of_user1 = NULL; - PCHAR pnss_of_user2 = NULL; - PCHAR pnss_of_user3 = NULL; - PCHAR ppf_mu_id_of_user0 = NULL; - PCHAR ppf_mu_id_of_user1 = NULL; - PCHAR ppf_mu_id_of_user2 = NULL; - PCHAR ppf_mu_id_of_user3 = NULL; - PCHAR pnum_of_txer = NULL; - CMD_HQA_SET_MU_CALC_LQ param = { 0 }; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: arg = %s\n", __func__, arg)); - pnum_of_user = strsep(&arg, ":"); - pbandwidth = strsep(&arg, ":"); - pnss_of_user0 = strsep(&arg, ":"); - pnss_of_user1 = strsep(&arg, ":"); - pnss_of_user2 = strsep(&arg, ":"); - pnss_of_user3 = strsep(&arg, ":"); - ppf_mu_id_of_user0 = strsep(&arg, ":"); - ppf_mu_id_of_user1 = strsep(&arg, ":"); - ppf_mu_id_of_user2 = strsep(&arg, ":"); - ppf_mu_id_of_user3 = strsep(&arg, ":"); - pnum_of_txer = strsep(&arg, ":"); - - if (pnum_of_user == NULL || pbandwidth == NULL || - pnss_of_user0 == NULL || pnss_of_user1 == NULL || - pnss_of_user2 == NULL || pnss_of_user3 == NULL || - ppf_mu_id_of_user0 == NULL || ppf_mu_id_of_user1 == NULL || - ppf_mu_id_of_user2 == NULL || ppf_mu_id_of_user3 == NULL || - pnum_of_txer == NULL || arg == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Invalid parameters\n", __func__)); - return -1; - } - - num_of_user = os_str_toul(pnum_of_user, 0, 10); - bandwidth = os_str_toul(pbandwidth, 0, 10); - nss_of_user0 = os_str_toul(pnss_of_user0, 0, 10); - nss_of_user1 = os_str_toul(pnss_of_user1, 0, 10); - nss_of_user2 = os_str_toul(pnss_of_user2, 0, 10); - nss_of_user3 = os_str_toul(pnss_of_user3, 0, 10); - pf_mu_id_of_user0 = os_str_toul(ppf_mu_id_of_user0, 0, 10); - pf_mu_id_of_user1 = os_str_toul(ppf_mu_id_of_user1, 0, 10); - pf_mu_id_of_user2 = os_str_toul(ppf_mu_id_of_user2, 0, 10); - pf_mu_id_of_user3 = os_str_toul(ppf_mu_id_of_user3, 0, 10); - num_of_txer = os_str_toul(pnum_of_txer, 0, 10); - group_index = os_str_toul(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: gid = %u, num_txer = %u\n", __func__, group_index, - num_of_txer)); - os_zero_mem(¶m, sizeof(param)); - param.num_of_user = num_of_user; - param.bandwidth = bandwidth; - param.nss_of_user0 = nss_of_user0; - param.nss_of_user1 = nss_of_user1; - param.nss_of_user2 = nss_of_user2; - param.nss_of_user3 = nss_of_user3; - param.pf_mu_id_of_user0 = pf_mu_id_of_user0; - param.pf_mu_id_of_user1 = pf_mu_id_of_user1; - param.pf_mu_id_of_user2 = pf_mu_id_of_user2; - param.pf_mu_id_of_user3 = pf_mu_id_of_user3; - param.num_of_txer = num_of_txer; - param.group_index = group_index; - Ret = hqa_wifi_test_mu_cal_lq(pAd, (P_MU_STRUCT_SET_CALC_LQ)¶m); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_get_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - MU_STRUCT_LQ_REPORT lq; - - os_zero_mem(&lq, sizeof(lq)); - Ret = hqa_wifi_test_mu_get_lq(pAd, (P_MU_STRUCT_LQ_REPORT)&lq); - - if (Ret == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:MU_STRUCT_LQ_REPORT\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][0] = 0x%x\n", - cpu2le32(lq.lq_report[0][0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][1] = 0x%x\n", - cpu2le32(lq.lq_report[0][1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][2] = 0x%x\n", - cpu2le32(lq.lq_report[0][2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][3] = 0x%x\n", - cpu2le32(lq.lq_report[0][3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0][4] = 0x%x\n", - cpu2le32(lq.lq_report[0][4]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][0] = 0x%x\n", - cpu2le32(lq.lq_report[1][0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][1] = 0x%x\n", - cpu2le32(lq.lq_report[1][1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][2] = 0x%x\n", - cpu2le32(lq.lq_report[1][2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][3] = 0x%x\n", - cpu2le32(lq.lq_report[1][3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1][4] = 0x%x\n", - cpu2le32(lq.lq_report[1][4]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][0] = 0x%x\n", - cpu2le32(lq.lq_report[2][0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][1] = 0x%x\n", - cpu2le32(lq.lq_report[2][1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][2] = 0x%x\n", - cpu2le32(lq.lq_report[2][2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][3] = 0x%x\n", - cpu2le32(lq.lq_report[2][3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2][4] = 0x%x\n", - cpu2le32(lq.lq_report[2][4]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][0] = 0x%x\n", - cpu2le32(lq.lq_report[3][0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][1] = 0x%x\n", - cpu2le32(lq.lq_report[3][1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][2] = 0x%x\n", - cpu2le32(lq.lq_report[3][2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][3] = 0x%x\n", - cpu2le32(lq.lq_report[3][3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3][4] = 0x%x\n", - cpu2le32(lq.lq_report[3][4]))); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_su_cal_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - UINT32 num_of_user = 0; - UINT32 bandwidth = 0; - UINT32 nss_of_user0 = 0; - UINT32 pf_mu_id_of_user0 = 0; - UINT32 num_of_txer = 0; - UINT32 group_index = 0; - PCHAR pnum_of_user = NULL; - PCHAR pbandwidth = NULL; - PCHAR pnss_of_user0 = NULL; - PCHAR ppf_mu_id_of_user0 = NULL; - PCHAR pnum_of_txer = NULL; - CMD_HQA_SET_SU_CALC_LQ param = { 0 }; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: arg = %s\n", __func__, arg)); - pnum_of_user = strsep(&arg, ":"); - pbandwidth = strsep(&arg, ":"); - pnss_of_user0 = strsep(&arg, ":"); - ppf_mu_id_of_user0 = strsep(&arg, ":"); - pnum_of_txer = strsep(&arg, ":"); - - if (pnum_of_user == NULL || pbandwidth == NULL || - pnss_of_user0 == NULL || ppf_mu_id_of_user0 == NULL || - pnum_of_txer == NULL || arg == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Invalid parameters\n", __func__)); - return -1; - } - - num_of_user = os_str_toul(pnum_of_user, 0, 10); - bandwidth = os_str_toul(pbandwidth, 0, 10); - nss_of_user0 = os_str_toul(pnss_of_user0, 0, 10); - pf_mu_id_of_user0 = os_str_toul(ppf_mu_id_of_user0, 0, 10); - num_of_txer = os_str_toul(pnum_of_txer, 0, 10); - group_index = os_str_toul(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: gid = %u, num_txer = %u\n", __func__, group_index, - num_of_txer)); - os_zero_mem(¶m, sizeof(param)); - param.num_of_user = num_of_user; - param.bandwidth = bandwidth; - param.nss_of_user0 = nss_of_user0; - param.pf_mu_id_of_user0 = pf_mu_id_of_user0; - param.num_of_txer = num_of_txer; - param.group_index = group_index; - Ret = hqa_wifi_test_su_cal_lq(pAd, (P_MU_STRUCT_SET_SU_CALC_LQ)¶m); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_su_get_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - SU_STRUCT_LQ_REPORT lq; - - os_zero_mem(&lq, sizeof(lq)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s:\n", __func__)); - Ret = hqa_wifi_test_su_get_lq(pAd, (P_SU_STRUCT_LQ_REPORT)&lq); - - if (Ret == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:SU_STRUCT_LQ_REPORT\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[0] = 0x%x\n", cpu2le32(lq.lq_report[0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[1] = 0x%x\n", cpu2le32(lq.lq_report[1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[2] = 0x%x\n", cpu2le32(lq.lq_report[2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[3] = 0x%x\n", cpu2le32(lq.lq_report[3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lq_report[4] = 0x%x\n", cpu2le32(lq.lq_report[4]))); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_set_snr_offset(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - INT32 offset = 0; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: arg = %s\n", __func__, arg)); - offset = os_str_tol(arg, 0, 10); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, offset:0x%x\n", __func__, offset)); - Ret = hqa_wifi_test_snr_offset_set(pAd, offset); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_set_zero_nss(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - UINT32 zero_nss = 0; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: arg = %s\n", __func__, arg)); - zero_nss = os_str_toul(arg, 0, 10); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, zero_nss:0x%x\n", __func__, zero_nss)); - Ret = hqa_wifi_test_mu_set_zero_nss(pAd, (UCHAR)zero_nss); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_set_speedup_lq(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - INT32 spdup_lq = 0; - - spdup_lq = os_str_tol(arg, 0, 10); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: spdup_lq:%x\n", __func__, spdup_lq)); - Ret = hqa_wifi_test_mu_speed_up_lq(pAd, spdup_lq); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -/* 1024:*/ -INT32 hqa_mu_set_mu_table(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - MU_STRUCT_MU_TABLE info; - UINT32 type = 0; - UCHAR *type_ptr = NULL; - UINT32 specific_metric_content = 0; - UINT32 length = 0; - UINT32 i = 0; - struct _CMD_HQA_SET_MU_METRIC_TABLE mu_metric_table; - struct _CMD_HQA_SET_SU_METRIC_TABLE su_metric_table; - - if (arg == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Invalid parameters\n", __func__)); - return -1; - } - - type_ptr = strsep(&arg, ":"); - if (type_ptr == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Invalid parameters\n", __func__)); - return -1; - } - - type = os_str_toul(type_ptr, 0, 10); - specific_metric_content = os_str_toul(arg, 0, 10); - specific_metric_content = cpu2le32(specific_metric_content); - - if (type == MU) { - length = sizeof(struct _CMD_HQA_SET_MU_METRIC_TABLE); - NdisFillMemory(&mu_metric_table, length, - specific_metric_content); - } else if (type == SU) { - length = sizeof(struct _CMD_HQA_SET_SU_METRIC_TABLE); - NdisFillMemory(&su_metric_table, length, - specific_metric_content); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Type error(%u)!!! neither MU nor SU\n", __func__, - type)); - return -1; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: type:%u, length:%u, data = %zu\n", __func__, type, - length, - type == MU ? sizeof(mu_metric_table) : - sizeof(su_metric_table))); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s\n", - type == MU ? "mu_metric_table:" : "su_metric_table:")); - - if (type == MU) { - for (i = 0; i < length; i += 8) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", - mu_metric_table.metric_table[i + 0], - mu_metric_table.metric_table[i + 1], - mu_metric_table.metric_table[i + 2], - mu_metric_table.metric_table[i + 3], - mu_metric_table.metric_table[i + 4], - mu_metric_table.metric_table[i + 5], - mu_metric_table.metric_table[i + 6], - mu_metric_table.metric_table[i + 7])); - } - } else { - for (i = 0; i < length; i += 3) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0x%x 0x%x 0x%x\n", - su_metric_table.metric_table[i + 0], - su_metric_table.metric_table[i + 1], - su_metric_table.metric_table[i + 2])); - } - } - - info.type = type; - info.length = length; - info.prTable = (type == MU) ? (char *)&mu_metric_table : - (char *)&su_metric_table; - Ret = hqa_wifi_test_mu_table_set(pAd, (P_MU_STRUCT_MU_TABLE)&info); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_set_group(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - MU_STRUCT_MU_GROUP mu_group; - UINT8 aucUser0MacAddr[6] = { 0x00, 0x0c, 0x40, 0x12, 0x34, 0x56 }; - UINT8 aucUser1MacAddr[6] = { 0x00, 0x0c, 0x40, 0x12, 0x34, 0x57 }; - UINT8 aucUser2MacAddr[6] = { 0x00, 0x0c, 0x40, 0x12, 0x34, 0x58 }; - UINT8 aucUser3MacAddr[6] = { 0x00, 0x0c, 0x40, 0x12, 0x34, 0x59 }; - mu_group.groupIndex = 0; - mu_group.numOfUser = 1; - mu_group.user0Ldpc = 1; - mu_group.user1Ldpc = 1; - mu_group.user2Ldpc = 1; - mu_group.user3Ldpc = 1; - mu_group.shortGI = 0; - mu_group.bw = 0; - mu_group.user0Nss = 0; - mu_group.user1Nss = 0; - mu_group.user2Nss = 0; - mu_group.user3Nss = 0; - mu_group.groupId = 10; - mu_group.user0UP = 0; - mu_group.user1UP = 0; - mu_group.user2UP = 0; - mu_group.user3UP = 0; - mu_group.user0MuPfId = 0; - mu_group.user1MuPfId = 1; - mu_group.user2MuPfId = 2; - mu_group.user3MuPfId = 3; - mu_group.user0InitMCS = 0; - mu_group.user1InitMCS = 0; - mu_group.user2InitMCS = 0; - mu_group.user3InitMCS = 0; - NdisMoveMemory(mu_group.aucUser0MacAddr, aucUser0MacAddr, MAC_ADDR_LEN); - NdisMoveMemory(mu_group.aucUser1MacAddr, aucUser1MacAddr, MAC_ADDR_LEN); - NdisMoveMemory(mu_group.aucUser2MacAddr, aucUser2MacAddr, MAC_ADDR_LEN); - NdisMoveMemory(mu_group.aucUser3MacAddr, aucUser3MacAddr, MAC_ADDR_LEN); - Ret = hqa_wifi_test_mu_group_set(pAd, (P_MU_STRUCT_MU_GROUP)&mu_group); - /* error: */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_get_qd(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - INT32 subcarrier_idx = 0; - MU_STRUCT_MU_QD qd; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: arg = %s\n", __func__, arg)); - subcarrier_idx = os_str_toul(arg, 0, 10); - Ret = hqa_wifi_test_mu_get_qd(pAd, subcarrier_idx, - (P_MU_STRUCT_MU_QD)&qd); - - if (Ret == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:MU_STRUCT_MU_QD\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[0] = 0x%x\n", cpu2le32(qd.qd_report[0]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[1] = 0x%x\n", cpu2le32(qd.qd_report[1]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[2] = 0x%x\n", cpu2le32(qd.qd_report[2]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[3] = 0x%x\n", cpu2le32(qd.qd_report[3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[4] = 0x%x\n", cpu2le32(qd.qd_report[4]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[5] = 0x%x\n", cpu2le32(qd.qd_report[5]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[6] = 0x%x\n", cpu2le32(qd.qd_report[6]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[7] = 0x%x\n", cpu2le32(qd.qd_report[7]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[8] = 0x%x\n", cpu2le32(qd.qd_report[8]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[9] = 0x%x\n", cpu2le32(qd.qd_report[9]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[10] = 0x%x\n", - cpu2le32(qd.qd_report[10]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[11] = 0x%x\n", - cpu2le32(qd.qd_report[11]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[12] = 0x%x\n", - cpu2le32(qd.qd_report[12]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("qd_report[13] = 0x%x\n", - cpu2le32(qd.qd_report[13]))); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == TRUE ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_set_enable(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - UINT32 is_enable = 0; - - is_enable = os_str_toul(arg, 0, 10); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s,MU is %s\n", __func__, - is_enable == 1 ? "Enable" : "Disable")); - Ret = hqa_wifi_test_mu_set_enable(pAd, is_enable); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_set_gid_up(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - MU_STRUCT_MU_STA_PARAM param; - UINT32 gid_0 = 0; - UINT32 gid_1 = 0; - UINT32 up_0 = 0; - UINT32 up_1 = 0; - UINT32 up_2 = 0; - UINT32 up_3 = 0; - PCHAR temp_ptr_use_to_check = NULL; - PCHAR gid_0_ptr = NULL; - PCHAR gid_1_ptr = NULL; - PCHAR up_0_ptr = NULL; - PCHAR up_1_ptr = NULL; - PCHAR up_2_ptr = NULL; - PCHAR up_3_ptr = NULL; - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - gid_0_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - gid_1_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - up_0_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - up_1_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - up_2_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = arg; - - if (temp_ptr_use_to_check != NULL) - up_3_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - gid_0 = os_str_tol(gid_0_ptr, 0, 10); - gid_1 = os_str_tol(gid_1_ptr, 0, 10); - up_0 = os_str_tol(up_0_ptr, 0, 10); - up_1 = os_str_tol(up_1_ptr, 0, 10); - up_2 = os_str_tol(up_2_ptr, 0, 10); - up_3 = os_str_tol(up_3_ptr, 0, 10); - param.gid[0] = gid_0; - param.gid[1] = gid_1; - param.up[0] = up_0; - param.up[1] = up_1; - param.up[2] = up_2; - param.up[3] = up_3; - Ret = hqa_wifi_test_mu_set_sta_gid_and_up(pAd, ¶m); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -INT32 hqa_mu_set_trigger_mu_tx(PRTMP_ADAPTER pAd, RTMP_STRING *arg) -{ - INT32 Ret = 0; - MU_STRUCT_TRIGGER_MU_TX_FRAME_PARAM param = { 0 }; - UINT8 fgIsRandomPattern = 0; /* is random pattern or not */ - UINT32 msduPayloadLength0 = - 0; /* payload length of the MSDU for user 0 */ - UINT32 msduPayloadLength1 = - 0; /* payload length of the MSDU for user 1 */ - UINT32 msduPayloadLength2 = - 0; /* payload length of the MSDU for user 2 */ - UINT32 msduPayloadLength3 = - 0; /* payload length of the MSDU for user 3 */ - UINT32 u4MuPacketCount = 0; /* MU TX count */ - UINT32 u4NumOfSTAs = 0; /* number of user in the MU TX */ - PCHAR temp_ptr_use_to_check = NULL; - PCHAR fgIsRandomPattern_ptr = NULL; - PCHAR msduPayloadLength0_ptr = NULL; - PCHAR msduPayloadLength1_ptr = NULL; - PCHAR msduPayloadLength2_ptr = NULL; - PCHAR msduPayloadLength3_ptr = NULL; - PCHAR u4MuPacketCount_ptr = NULL; - PCHAR u4NumOfSTAs_ptr = NULL; - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - fgIsRandomPattern_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - msduPayloadLength0_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - msduPayloadLength1_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - msduPayloadLength2_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - msduPayloadLength3_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = strsep(&arg, ":"); - - if (temp_ptr_use_to_check != NULL) - u4MuPacketCount_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - temp_ptr_use_to_check = arg; - - if (temp_ptr_use_to_check != NULL) - u4NumOfSTAs_ptr = temp_ptr_use_to_check; - else { - Ret = -1; - goto error; - } - - fgIsRandomPattern = os_str_tol(fgIsRandomPattern_ptr, 0, 10); - msduPayloadLength0 = os_str_tol(msduPayloadLength0_ptr, 0, 10); - msduPayloadLength1 = os_str_tol(msduPayloadLength1_ptr, 0, 10); - msduPayloadLength2 = os_str_tol(msduPayloadLength2_ptr, 0, 10); - msduPayloadLength3 = os_str_tol(msduPayloadLength3_ptr, 0, 10); - u4MuPacketCount = os_str_tol(u4MuPacketCount_ptr, 0, 10); - u4NumOfSTAs = os_str_tol(u4NumOfSTAs_ptr, 0, 10); - param.fgIsRandomPattern = fgIsRandomPattern; - param.msduPayloadLength0 = msduPayloadLength0; - param.msduPayloadLength1 = msduPayloadLength1; - param.msduPayloadLength2 = msduPayloadLength2; - param.msduPayloadLength3 = msduPayloadLength3; - param.u4MuPacketCount = u4MuPacketCount; - param.u4NumOfSTAs = u4NumOfSTAs; - param.macAddrs[0][0] = 0x11; - param.macAddrs[0][1] = 0x22; - param.macAddrs[0][2] = 0x33; - param.macAddrs[0][3] = 0x44; - param.macAddrs[0][4] = 0x55; - param.macAddrs[0][5] = 0x66; - - if (u4NumOfSTAs >= 1) { - param.macAddrs[1][0] = 0x11; - param.macAddrs[1][1] = 0x22; - param.macAddrs[1][2] = 0x33; - param.macAddrs[1][3] = 0x44; - param.macAddrs[1][4] = 0x55; - param.macAddrs[1][5] = 0x66; - } - - if (u4NumOfSTAs >= 2) { - param.macAddrs[2][0] = 0x11; - param.macAddrs[2][1] = 0x22; - param.macAddrs[2][2] = 0x33; - param.macAddrs[2][3] = 0x44; - param.macAddrs[2][4] = 0x55; - param.macAddrs[2][5] = 0x66; - } - - if (u4NumOfSTAs >= 2) { - param.macAddrs[3][0] = 0x11; - param.macAddrs[3][1] = 0x22; - param.macAddrs[3][2] = 0x33; - param.macAddrs[3][3] = 0x44; - param.macAddrs[3][4] = 0x55; - param.macAddrs[3][5] = 0x66; - } - - Ret = hqa_wifi_test_mu_trigger_mu_tx(pAd, ¶m); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:CMD %s\n", __func__, Ret == 0 ? "Success" : "Fail")); - return Ret; -} -#endif /* CFG_SUPPORT_MU_MIMO */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mura.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mura.c deleted file mode 100644 index 9650f88784..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_mura.c +++ /dev/null @@ -1,2298 +0,0 @@ -/* - * $Id$ - * $DateTime$ - * Pluto Kang - */ -/* - This file contains IOCTL for MU-MIMO specfic commands - */ - -/******************************************************************************* - * Copyright (c) 2014 MediaTek Inc. - * - * All rights reserved. Copying, compilation, modification, distribution - * or any other use whatsoever of this material is strictly prohibited - * except in accordance with a Software License Agreement with - * MediaTek Inc. - * ****************************************************************************** - */ - -/****************************************************************************** - * LEGAL DISCLAIMER - * - * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND - * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK - * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE - * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY - * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT - * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE - * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY - * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK - * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY - * WARRANTY CLAIM RELATING THERetO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE - * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO - * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. - * - * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE - * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL - * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT - * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY - * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - * - * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE - * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT - * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING - * THEREOF AND RELATED THERetO SHALL BE SETTLED BY ARBITRATION IN SAN - * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE - * (ICC). - * ****************************************************************************** - */ - -#include "rt_config.h" - -#ifdef CFG_SUPPORT_MU_MIMO_RA - -static VOID MuraEventDispatcher(struct cmd_msg *msg, char *rsp_payload, - UINT16 rsp_payload_len); - -static VOID mura_algorithm_state_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len); - -static VOID mura_algorithm_group_state_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len); - -static VOID mura_algorithm_hwfb_state_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len); - -/** @brief Monitor the MU-RGA PFID statistics callback. - * - * Show PFID statistics. - * - * @param msg: pointer to message - * @param rsp_payload: payload array - * @param rsp_payload_len: payload length - * @return Void. - */ -static VOID mura_algorithm_pfid_stat_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len); - -/* - ========================================================================== - Description: - Set Mura Sounding Period, TBD - - Parameters: - Standard MU SND Paramter - - ========================================================================== - */ -INT SetMuraPeriodicSndProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_PERIODIC_SND; - CMD_SET_PERIODIC_SND param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __func__, Ret)); - return Ret; -} - -/* - ========================================================================== - Description: - Set MU_RGA initialization, for test - - Parameters: - Standard MU SND Paramter - - ========================================================================== - */ -INT SetMuraTestAlgorithmInit(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - PCHAR pch = NULL; - PCHAR pIdx = NULL; - UINT32 index = 0; - - pch = arg; - - if (pch != NULL) - pIdx = pch; - else - return 0; - - index = os_str_tol(pIdx, 0, 10); - - /* 4 E3 RF /BBP Script */ - /* TBD */ - - /* 4 E3 MU-MIMO Script */ - /* TBD */ - - /* 4 MU-MIMO Initialization */ - if (index == 0) - SetMuraTestAlgorithmProc(pAd, "1"); - - return TRUE; -} - -/* - ========================================================================== - Description: - Set MU_RGA test flow, for test - - Parameters: - Standard MU SND Paramter - - ========================================================================== - */ -INT SetMuraTestAlgorithmProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - INT16 value = 0; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_TEST_ALGORITHM; - CMD_SET_PERIODIC_SND param = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - value = os_str_tol(arg, 0, 10); - param.u2Reserved = cpu2le16(value); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d_\n", __func__, Ret)); - return Ret; -} - -/* - ========================================================================== - Description: - Get MU_RGA algorithm status, for Debug - - Parameters: - Standard MU-RGA Paramter - - ========================================================================== - */ -INT GetMuraMonitorStateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* =============================================================================================== */ - UINT32 index = 0; - UINT32 index2 = 0; - PCHAR pch = NULL; - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_ALGORITHM_STAT; - struct _CMD_ATTRIBUTE attr = { 0 }; - - pch = arg; - - if (pch != NULL) - index = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - if (index == MURA_STATE) { - P_EVENT_SHOW_ALGORITHM_STATE pstat_result = NULL; - - os_alloc_mem(NULL, (UCHAR **)&pstat_result, - sizeof(EVENT_SHOW_ALGORITHM_STATE)); - if (!pstat_result) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): mem alloc failed\n", __func__)); - Ret = 0; - goto error; - } - os_zero_mem(pstat_result, sizeof(EVENT_SHOW_ALGORITHM_STATE)); - msg = AndesAllocCmdMsg( - pAd, sizeof(cmd) + sizeof(EVENT_SHOW_ALGORITHM_STATE)); - - if (!msg) { - Ret = 0; - os_free_mem(pstat_result); - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE( - attr, sizeof(EVENT_SHOW_ALGORITHM_STATE)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pstat_result); - SET_CMD_ATTR_RSP_HANDLER(attr, MuraEventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); - - os_free_mem(pstat_result); - } else if (index == MURA_GROUP_STAT) { - P_EVENT_SHOW_ALGORITHM_GROUP_STATE pgroup_stat_result = NULL; - - os_alloc_mem(NULL, (UCHAR **)&pgroup_stat_result, - sizeof(EVENT_SHOW_ALGORITHM_GROUP_STATE)); - if (!pgroup_stat_result) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): mem alloc failed\n", __func__)); - Ret = 0; - goto error; - } - os_zero_mem(pgroup_stat_result, - sizeof(EVENT_SHOW_ALGORITHM_GROUP_STATE)); - - cmd = MURA_ALGORITHM_GROUP_STAT; - pch = strsep(&arg, "-"); - - if (pch == NULL) { - Ret = 0; - os_free_mem(pgroup_stat_result); - goto error; - } else { - pch = strsep(&arg, ""); - - if (pch != NULL) { - index2 = os_str_tol(pch, 0, 10); - - if (index2 >= MAX_MURA_GRP) { - Ret = 0; - os_free_mem(pgroup_stat_result); - goto error; - } - -#ifdef RT_BIG_ENDIAN - index2 = cpu2le32(index2); -#endif - } else { - Ret = 0; - os_free_mem(pgroup_stat_result); - goto error; - } - } - - msg = AndesAllocCmdMsg( - pAd, - sizeof(cmd) + sizeof(EVENT_SHOW_ALGORITHM_GROUP_STATE)); - - if (!msg) { - Ret = 0; - os_free_mem(pgroup_stat_result); - goto error; - } -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE( - attr, sizeof(EVENT_SHOW_ALGORITHM_GROUP_STATE)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pgroup_stat_result); - SET_CMD_ATTR_RSP_HANDLER(attr, MuraEventDispatcher); - AndesInitCmdMsg(msg, attr); - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)&index2, sizeof(index2)); - AndesSendCmdMsg(pAd, msg); - os_free_mem(pgroup_stat_result); - } else if (index == MURA_HWFB_STAT) { - P_EVENT_SHOW_ALGORITHM_HWFB_STATE phwfb_stat_result = NULL; - - os_alloc_mem(NULL, (UCHAR **)&phwfb_stat_result, - sizeof(EVENT_SHOW_ALGORITHM_HWFB_STATE)); - if (!phwfb_stat_result) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): mem alloc failed\n", __func__)); - Ret = 0; - goto error; - } - os_zero_mem(phwfb_stat_result, - sizeof(EVENT_SHOW_ALGORITHM_HWFB_STATE)); - - cmd = MURA_ALGORITHM_HWFB_STAT; - msg = AndesAllocCmdMsg( - pAd, - sizeof(cmd) + sizeof(EVENT_SHOW_ALGORITHM_HWFB_STATE)); - - if (!msg) { - Ret = 0; - os_free_mem(phwfb_stat_result); - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE( - attr, sizeof(EVENT_SHOW_ALGORITHM_HWFB_STATE)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, phwfb_stat_result); - SET_CMD_ATTR_RSP_HANDLER(attr, MuraEventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesSendCmdMsg(pAd, msg); - os_free_mem(phwfb_stat_result); - } else - goto error; - -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __func__, Ret)); - return Ret; -} - -INT GetMuraPFIDStatProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 u4Index = 0; - PCHAR pch = NULL; - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_PFID_STAT; - struct _CMD_ATTRIBUTE attr = { 0 }; - EVENT_SHOW_PFID_STAT stat_result = { 0 }; - - pch = arg; - if (pch != NULL) { - u4Index = simple_strtol(pch, 0, 10); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Argument is NULL\n", __func__)); - Ret = FALSE; - goto error; - } - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(stat_result) + - sizeof(u4Index)); - if (!msg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Msg allocation failed\n", __func__)); - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(stat_result)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &stat_result); - SET_CMD_ATTR_RSP_HANDLER(attr, MuraEventDispatcher); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); - u4Index = cpu2le32(u4Index); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)&u4Index, sizeof(u4Index)); - - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - return Ret; -} - -/* - ========================================================================== - Description: - Set MU_RGA algorithm with Fixed Rate - - Parameters: - Standard MU-RGA Paramter - - ========================================================================== - */ -INT SetMuraFixedRateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_FIXED_RATE_ALGORITHM; - UINT_8 param = 0; - UINT8 value = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - value = os_str_tol(arg, 0, 10); - /* 2: MU-RGA Stop, 1:MU-RGA Fixed Rate, 0:MU-RGA Auto Rate */ - param = value; - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __func__, Ret)); - return Ret; -} - -/* - ========================================================================== - Description: - Set MU_RGA algorithm with Fixed Group Entry - - Parameters: - Standard MU-RGA Paramter - - ========================================================================== - */ -INT SetMuraFixedGroupRateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - PCHAR pch = NULL; - INT32 Ret = TRUE; - UINT_8 ucNNS_MCS = 0; - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_FIXED_GROUP_RATE_ALGORITHM; - CMD_MURGA_SET_GROUP_TBL_ENTRY param = { 0 }; - - pch = strsep(&arg, "-"); - - if (pch != NULL) - param.numUser = os_str_tol(pch, 0, 10) - 1; - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "-"); - - if (pch != NULL) - param.BW = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - if (param.numUser >= 1) { - pch = strsep(&arg, "-"); - - if (pch != NULL) - param.WLIDUser0 = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "-"); - - if (pch != NULL) { - UINT_8 ucNNS_MCS = 0; - - ucNNS_MCS = os_str_tol(pch, 0, 10); - param.NS0 = (ucNNS_MCS > 10); - param.initMcsUser0 = - (ucNNS_MCS > 10) ? (ucNNS_MCS - 10) : ucNNS_MCS; - } else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "-"); - - if (pch != NULL) - param.WLIDUser1 = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - if (param.numUser == 1) - pch = strsep(&arg, ""); - else - pch = strsep(&arg, "-"); - - if (pch != NULL) { - ucNNS_MCS = os_str_tol(pch, 0, 10); - param.NS1 = (ucNNS_MCS > 10); - param.initMcsUser1 = - (ucNNS_MCS > 10) ? (ucNNS_MCS - 10) : ucNNS_MCS; - } else { - Ret = 0; - goto error; - } - } - - if (param.numUser >= 2) { - pch = strsep(&arg, "-"); - - if (pch != NULL) - param.WLIDUser2 = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - if (param.numUser == 2) - pch = strsep(&arg, ""); - else - pch = strsep(&arg, "-"); - - if (pch != NULL) { - ucNNS_MCS = os_str_tol(pch, 0, 10); - param.NS2 = (ucNNS_MCS > 10); - param.initMcsUser2 = - (ucNNS_MCS > 10) ? (ucNNS_MCS - 10) : ucNNS_MCS; - } else { - Ret = 0; - goto error; - } - } - - if (param.numUser >= 3) { - pch = strsep(&arg, "-"); - - if (pch != NULL) - param.WLIDUser3 = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, ""); - - if (pch != NULL) { - ucNNS_MCS = os_str_tol(pch, 0, 10); - param.NS3 = (ucNNS_MCS > 10); - param.initMcsUser3 = - (ucNNS_MCS > 10) ? (ucNNS_MCS - 10) : ucNNS_MCS; - } else { - Ret = 0; - goto error; - } - } - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __func__, Ret)); - return Ret; -} - -/* -========================================================================== -Description: - Set MU_RGA algorithm with Fixed Group Entry - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraFixedSndParamProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - PCHAR pch = NULL; - INT32 Ret = TRUE; - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_SOUNDING_PERIOD; - CMD_SET_SND_PARAMS param = { 0 }; - - pch = strsep(&arg, "-"); - - if (pch != NULL) { - param.ucWLIDUser = os_str_tol(pch, 0, 10); - - if (param.ucWLIDUser == 0) - param.ucAllMuUser = 1; - } else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "-"); - - if (pch != NULL) - param.ucMaxSoundingPeriod = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, "-"); - - if (pch != NULL) - param.ucMinSoundingPeriod = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - pch = strsep(&arg, ""); - - if (pch != NULL) - param.ucSoundingPeriodStep = os_str_tol(pch, 0, 10); - else { - Ret = 0; - goto error; - } - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __func__, Ret)); - return Ret; -} - -/* -========================================================================== -Description: - Set MU_RGA algorithm with Fixed Group Entry - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraPlatformTypeProc(RTMP_ADAPTER *pAd) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_PLATFORM_TYPE; - CMD_SET_PLATFORM_TYPE param = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - -#if defined(CONFIG_RALINK_MT7621) - param.ucPlatformType = 1; /*MT7621*/ -#endif -#if defined(CONFIG_ARCH_MT7623) - param.ucPlatformType = 2; /*MT7623*/ -#endif -#if defined(CONFIG_ARCH_MT7622) - param.ucPlatformType = 2; /*MT7622*/ -#endif - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __func__, Ret)); - return Ret; -} - -/* -========================================================================== -Description: - Set MU_RGA Mobility Detect On Off - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraMobilityCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_MOBILITY_CTRL; - CMD_MURGA_SET_MOBILITY_TYPE param = { 0 }; - - /* declair parsing function related parameter */ - UINT8 u1ParamIdx; - CHAR *cstr; - BOOLEAN fgMobilityDetectEn = 0; - - /* sanity check for input parameter existence */ - if (!arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): No parameters!!\n", __func__)); - goto error0; - } - - /* sanity check for input parameter format */ - if (strlen(arg) != 1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Wrong parameter format!!\n", __func__)); - goto error0; - } - - /* parameter parsing */ - for (u1ParamIdx = 0, cstr = rstrtok(arg, ":"); cstr; - cstr = rstrtok(NULL, ":"), u1ParamIdx++) { - switch (u1ParamIdx) { - case 0: - /* 1 symbol representation */ - fgMobilityDetectEn = simple_strtol(cstr, 0, 10); - break; - default: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Number of parameters exceed expectation !!\n", - __func__)); - goto error0; - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): fgMobilityDetectEn: %d\n", __func__, - fgMobilityDetectEn)); - - /* memory allocate for command message */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - /* sanity check for command message memory allocate */ - if (!msg) - goto error1; - - /* command message contents config */ - param.fgMobilityType = fgMobilityDetectEn; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - chip_cmd_tx(pAd, msg); - return TRUE; - -error0: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Expected format is as below:\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" iwpriv set mura_mobility_en=O\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param1: Mobility Enable (0, 1)\n")); - return FALSE; - -error1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): command message memory allocated fail!!\n", __func__)); - return FALSE; -} - -/* -========================================================================== -Description: - Set MU_RGA Mobility Detect Interval Ctrl - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraMobilityIntervalCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_MOBILITY_INTERVAL_CTRL; - CMD_MURGA_SET_MOBILITY_INTERVAL param = { 0 }; - - /* declair parsing function related parameter */ - UINT8 u1ParamIdx; - CHAR *cstr; - UINT16 u2MobilityInteral = 0; - - /* sanity check for input parameter existence */ - if (!arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): No parameters!!\n", __func__)); - goto error0; - } - - /* sanity check for input parameter format */ - if (strlen(arg) != 1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Wrong parameter format!!\n", __func__)); - goto error0; - } - - /* parameter parsing */ - for (u1ParamIdx = 0, cstr = rstrtok(arg, ":"); cstr; - cstr = rstrtok(NULL, ":"), u1ParamIdx++) { - switch (u1ParamIdx) { - case 0: - /* 1 symbol representation */ - u2MobilityInteral = simple_strtol(cstr, 0, 10); - break; - default: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Number of parameters exceed expectation !!\n", - __func__)); - goto error0; - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): u2MobilityInteral: %d\n", __func__, - u2MobilityInteral)); - - /* memory allocate for command message */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - /* sanity check for command message memory allocate */ - if (!msg) - goto error1; - - /* command message contents config */ - param.u2MobilityInteral = u2MobilityInteral; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); - param.u2MobilityInteral = cpu2le16(param.u2MobilityInteral); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - chip_cmd_tx(pAd, msg); - return TRUE; - -error0: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Expected format is as below:\n\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" iwpriv set mura_mobility_interval_ctrl=O\n\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param1: Mobility Computation Profile Time Interval (180, 360)\n")); - return FALSE; - -error1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): command message memory allocated fail!!\n", __func__)); - return FALSE; -} - -/* -========================================================================== -Description: - Set MU_RGA Mobility Detect SNR Ctrl - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraMobilitySNRCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_MOBILITY_SNR_CTRL; - CMD_MURGA_SET_MOBILITY_SNR param = { 0 }; - - /* declair parsing function related parameter */ - UINT8 u1ParamIdx; - CHAR *cstr; - UINT8 ucMobilitySNR = 0; - - /* sanity check for input parameter existence */ - if (!arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): No parameters!!\n", __func__)); - goto error0; - } - - /* sanity check for input parameter format */ - if (strlen(arg) != 1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Wrong parameter format!!\n", __func__)); - goto error0; - } - - /* parameter parsing */ - for (u1ParamIdx = 0, cstr = rstrtok(arg, ":"); cstr; - cstr = rstrtok(NULL, ":"), u1ParamIdx++) { - switch (u1ParamIdx) { - case 0: - /* 1 symbol representation */ - ucMobilitySNR = simple_strtol(cstr, 0, 10); - break; - default: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Number of parameters exceed expectation !!\n", - __func__)); - goto error0; - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): ucMobilitySNR: %d\n", __func__, ucMobilitySNR)); - - /* memory allocate for command message */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - /* sanity check for command message memory allocate */ - if (!msg) - goto error1; - - /* command message contents config */ - param.ucMobilitySNR = ucMobilitySNR; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - chip_cmd_tx(pAd, msg); - return TRUE; - -error0: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Expected format is as below:\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" iwpriv set mura_mobility_snr_ctrl=O\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param1: Mobility Computation SNR value (0~63)\n")); - return FALSE; - -error1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): command message memory allocated fail!!\n", __func__)); - return FALSE; -} - -/* -========================================================================== -Description: - Set MU_RGA Mobility Detect Threshold Ctrl - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraMobilityThresholdCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_MOBILITY_THRESHOLD_CTRL; - CMD_MURGA_SET_MOBILITY_THRESHOLD param = { 0 }; - - /* declair parsing function related parameter */ - UINT8 u1ParamIdx; - CHAR *cstr; - UINT8 ucWlanId = 0, ucMobilityThreshold = 0; - - /* sanity check for input parameter existence */ - if (!arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): No parameters!!\n", __func__)); - goto error0; - } - - /* sanity check for input parameter format */ - if (strlen(arg) != 6) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Wrong parameter format!!\n", __func__)); - goto error0; - } - - /* parameter parsing */ - for (u1ParamIdx = 0, cstr = rstrtok(arg, ":"); cstr; - cstr = rstrtok(NULL, ":"), u1ParamIdx++) { - switch (u1ParamIdx) { - case 0: - /* 3 symbol representation */ - ucWlanId = simple_strtol(cstr, 0, 10); - break; - case 1: - /* 2 symbol representation */ - ucMobilityThreshold = simple_strtol(cstr, 0, 10); - break; - default: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Number of parameters exceed expectation !!\n", - __func__)); - goto error0; - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): ucWlanId: %d, ucMobilityThreshold: %d\n", __func__, - ucWlanId, ucMobilityThreshold)); - - /* memory allocate for command message */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - /* sanity check for command message memory allocate */ - if (!msg) - goto error1; - - /* command message contents config */ - param.ucWlanId = ucWlanId; - param.ucMobilityThreshold = ucMobilityThreshold; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - chip_cmd_tx(pAd, msg); - return TRUE; - -error0: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Expected format is as below:\n\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" iwpriv set mura_mobility_threshold_ctrl=OOO:OO\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param1: WlanId (0~127)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param2: Mobility LQ Threshold (0~63)\n")); - return FALSE; - -error1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): command message memory allocated fail!!\n", __func__)); - return FALSE; -} - -/* -========================================================================== -Description: - Set MU_RGA Sounding counter info - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraMobilitySndCountProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_MOBILITY_SOUNDING_INTERVAL_COUNT; - CMD_MURGA_GET_MOBILITY_SND_INTERVAL param = { 0 }; - - PCHAR pbuffer = NULL; - PCHAR pflag = NULL; - UINT8 fgMobilitySndIntvalCnt = 0; - - pbuffer = arg; - if (pbuffer != NULL) { - pflag = pbuffer; - } else { - return 0; - } - - fgMobilitySndIntvalCnt = simple_strtol(pflag, 0, 10); - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - param.fgMobilitySndIntvalCnt = fgMobilitySndIntvalCnt; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); - - return Ret; - -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __FUNCTION__, Ret)); - - return Ret; -} - -/* -========================================================================== -Description: - Set MU_RGA Mobility Mode Ctrl - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraMobilityModeCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_MOBILITY_MODE_CTRL; - CMD_MURGA_SET_MOBILITY_MODE param = { 0 }; - - /* declair parsing function related parameter */ - UINT8 u1ParamIdx; - CHAR *cstr; - BOOLEAN fgMULQPingPongEn = TRUE; - BOOLEAN fgMULQTriggerCalEn = TRUE; - BOOLEAN fgMobilityFlagForceEn = FALSE; - - /* sanity check for input parameter existence */ - if (!arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): No parameters!!\n", __func__)); - goto error0; - } - - /* sanity check for input parameter format */ - if (strlen(arg) != 5) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Wrong parameter format!!\n", __func__)); - goto error0; - } - - /* parameter parsing */ - for (u1ParamIdx = 0, cstr = rstrtok(arg, ":"); cstr; - cstr = rstrtok(NULL, ":"), u1ParamIdx++) { - switch (u1ParamIdx) { - case 0: - /* 1 symbol representation */ - fgMULQPingPongEn = simple_strtol(cstr, 0, 10); - break; - case 1: - /* 1 symbol representation */ - fgMULQTriggerCalEn = simple_strtol(cstr, 0, 10); - break; - case 2: - /* 1 symbol representation */ - fgMobilityFlagForceEn = simple_strtol(cstr, 0, 10); - break; - default: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Number of parameters exceed expectation !!\n", - __func__)); - goto error0; - } - } - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): fgMULQPingPongEn: %d, fgMULQTriggerCalEn: %d, fgMobilityFlagForceEn: %d\n", - __func__, fgMULQPingPongEn, fgMULQTriggerCalEn, - fgMobilityFlagForceEn)); - - /* memory allocate for command message */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - /* sanity check for command message memory allocate */ - if (!msg) - goto error1; - - /* command message contents config */ - param.fgMULQPingPongEn = fgMULQPingPongEn; - param.fgMULQTriggerCalEn = fgMULQTriggerCalEn; - param.fgMobilityFlagForceEn = fgMobilityFlagForceEn; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - chip_cmd_tx(pAd, msg); - return TRUE; - -error0: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Expected format is as below:\n\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" iwpriv set mura_mobility_mode_ctrl=O:O:O\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param1: Mobility PingPong Mechanism Enable (0, 1)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param2: Mobility Trigger Computation (0, 1)\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param3: Mobility Flag Enable Forced Mode (0, 1)\n")); - return FALSE; - -error1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): command message memory allocated fail!!\n", __func__)); - return FALSE; -} - -/* -========================================================================== -Description: - Set MU_RGA Mobility Log Ctrl - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraMobilityLogCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_MOBILITY_LOG_CTRL; - CMD_MURGA_SET_MOBILITY_LOG param = { 0 }; - - /* declair parsing function related parameter */ - UINT8 u1ParamIdx; - CHAR *cstr; - BOOLEAN fgMobilityLogEn = TRUE; - - /* sanity check for input parameter existence */ - if (!arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): No parameters!!\n", __func__)); - goto error0; - } - - /* sanity check for input parameter format */ - if (strlen(arg) != 1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Wrong parameter format!!\n", __func__)); - goto error0; - } - - /* parameter parsing */ - for (u1ParamIdx = 0, cstr = rstrtok(arg, ":"); cstr; - cstr = rstrtok(NULL, ":"), u1ParamIdx++) { - switch (u1ParamIdx) { - case 0: - /* 3 symbol representation */ - fgMobilityLogEn = simple_strtol(cstr, 0, 10); - break; - default: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Number of parameters exceed expectation !!\n", - __func__)); - goto error0; - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): fgMobilityLogEn: %d\n", __func__, fgMobilityLogEn)); - - /* memory allocate for command message */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - /* sanity check for command message memory allocate */ - if (!msg) - goto error1; - - /* command message contents config */ - param.fgMobilityLogEn = fgMobilityLogEn; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - chip_cmd_tx(pAd, msg); - return TRUE; - -error0: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Expected format is as below:\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" iwpriv set mura_mobility_log_ctrl=O\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param1: Mobility Log Enable (0, 1)\n")); - return FALSE; - -error1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): command message memory allocated fail!!\n", __func__)); - return FALSE; -} - -/* -========================================================================== -Description: - Set MU_RGA Mobility Test Ctrl - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraMobilityTestCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_MOBILITY_TEST_CTRL; - CMD_MURGA_SET_MOBILITY_TEST param = { 0 }; - - /* declair parsing function related parameter */ - UINT8 u1ParamIdx; - CHAR *cstr; - BOOLEAN fgMobilityTestEn = TRUE; - - /* sanity check for input parameter existence */ - if (!arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): No parameters!!\n", __func__)); - goto error0; - } - - /* sanity check for input parameter format */ - if (strlen(arg) != 1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Wrong parameter format!!\n", __func__)); - goto error0; - } - - /* parameter parsing */ - for (u1ParamIdx = 0, cstr = rstrtok(arg, ":"); cstr; - cstr = rstrtok(NULL, ":"), u1ParamIdx++) { - switch (u1ParamIdx) { - case 0: - /* 3 symbol representation */ - fgMobilityTestEn = simple_strtol(cstr, 0, 10); - break; - default: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Number of parameters exceed expectation !!\n", - __func__)); - goto error0; - } - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): fgMobilityTestEn: %d\n", __func__, fgMobilityTestEn)); - - /* memory allocate for command message */ - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - /* sanity check for command message memory allocate */ - if (!msg) - goto error1; - - /* command message contents config */ - param.fgMobilityTestEn = fgMobilityTestEn; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - chip_cmd_tx(pAd, msg); - return TRUE; - -error0: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Expected format is as below:\n\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" iwpriv set mura_mobility_test_ctrl=O\n\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" param1: Mobility Test Force each MU User as Mobility Candidate (0, 1)\n")); - return FALSE; - -error1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): command message memory allocated fail!!\n", __func__)); - return FALSE; -} - -/* -========================================================================== -Description: - Set MU_RGA Disable CN3, CN4 Group Entry - -Parameters: - Standard MU-RGA Paramter - -========================================================================== - */ -INT SetMuraDisableCN3CN4Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_DISABLE_CN3_CN4; - CMD_SET_DISABLE_CN3_CN4 param = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - if (!msg) { - Ret = FALSE; - goto error; - } - - param.ucDisableCn3Cn4 = simple_strtol(arg, 0, 10); - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __FUNCTION__, Ret)); - - return Ret; -} - -INT SetMuraEnableHwSwPatch(RTMP_ADAPTER *pAd) -{ - INT32 Ret = TRUE; - /* prepare command message */ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - UINT32 cmd = MURA_ENABLE_MU_HWSW_PATCH; - CMD_MURGA_ENABLE_HW_SW_PATCH param = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(cmd) + sizeof(param)); - - if (!msg) { - Ret = FALSE; - goto error; - } - - param.ucEnableHwSwPatch = pAd->MuHwSwPatch; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MU_MIMO_RA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - cmd = cpu2le32(cmd); -#endif - - AndesAppendCmdMsg(msg, (char *)&cmd, sizeof(cmd)); - AndesAppendCmdMsg(msg, (char *)¶m, sizeof(param)); - AndesSendCmdMsg(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d_\n", __func__, Ret)); - - return Ret; -} - -/* - ========================================================================== - Description: - MU_RGA Event Handler - - Parameters: - Standard MU-RGA Paramter - - ========================================================================== - */ -static VOID MuraEventDispatcher(struct cmd_msg *msg, char *rsp_payload, - UINT16 rsp_payload_len) -{ - UINT32 u4EventId = (*(UINT32 *)rsp_payload); - char *pData = (rsp_payload); - UINT16 len = (rsp_payload_len); -#ifdef RT_BIG_ENDIAN - u4EventId = cpu2le32(u4EventId); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: u4EventId = %u, len = %u\n", __func__, u4EventId, len)); - - switch (u4EventId) { - case MURA_EVENT_ALGORITHM_STAT: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MURA_EVENT_GET_ALGORITHM_STATE\n", __func__)); - mura_algorithm_state_callback(msg, pData, len); - break; - - case MURA_EVENT_ALGORITHM_GROUP_STAT: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MURA_EVENT_GET_ALGORITHM_GROUP_STATE\n", - __func__)); - mura_algorithm_group_state_callback(msg, pData, len); - break; - - case MURA_EVENT_ALGORITHM_HWFB_STAT: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MURA_EVENT_GET_ALGORITHM_HWFB_STATE\n", - __func__)); - mura_algorithm_hwfb_state_callback(msg, pData, len); - break; - - case MURA_EVENT_PFID_STAT: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MURA_EVENT_PFID_STAT\n", __func__)); - mura_algorithm_pfid_stat_callback(msg, pData, len); - break; - - default: - break; - } -} - -/*----------------------------------------------------------------------------*/ -/*! -* @brief [CMD] Monitor the MU-RGA State -* -* @param pucParam -* -* @return status -*/ -/*----------------------------------------------------------------------------*/ -static VOID mura_algorithm_state_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_SHOW_ALGORITHM_STATE pEntry = NULL; - UINT_8 ucPFIDList_Idx = 0, - ucGroupEntryList_Idx = 0; /* , ucNumofGroupEntry = 0; */ - - /* P_MURA_CN_ENTRY_INFO_T pGroupEntry; */ - if (rsp_payload == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! rsp_payload is null!!\n", __func__)); - return; - } - - pEntry = (P_EVENT_SHOW_ALGORITHM_STATE)rsp_payload; - - /* if (msg->rsp_payload == NULL) */ - /* { */ - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, */ - /* ("%s: error !! buffer not specific by cmd\n", __FUNCTION__)); */ - /* } */ - /* else */ - { - /* Current MUser in the system */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (MURA_COLOR_RESET "\n Number of Totally MUser : %2d\n", - pEntry->ucMaxMuarNum)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n Number of Sounding MUser : %2d\n", - pEntry->ucSoundingNum)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n Number of Waiting MUser : %2d\n", - pEntry->ucWaitingNum)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n Number of SU Current Space : %2d\n", - pEntry->ucMaxSndingCap)); - /* Show MU-RGA Sounding Candidate List */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Sounding Candidate WLAN ID List :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->ucMURAWlanIdList[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Group Candidate List */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Group Entry Candidate List :")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { - if (pEntry->ucMURAPfidList[ucPFIDList_Idx] == 0x1F) - continue; - - for (ucGroupEntryList_Idx = 0; - ucGroupEntryList_Idx < MU_2U_NUM; - ucGroupEntryList_Idx++) { - if ((ucGroupEntryList_Idx % 20) == 0) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("\n %2d: ", - ucGroupEntryList_Idx)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%1d, ", - pEntry->au4PfidGroupTableMap - [ucPFIDList_Idx] - [ucGroupEntryList_Idx])); - } - - for (ucGroupEntryList_Idx = MU_2U_NUM; - ucGroupEntryList_Idx < (MU_2U_NUM + MU_3U_NUM); - ucGroupEntryList_Idx++) { - if (((ucGroupEntryList_Idx - MU_2U_NUM) % 20) == - 0) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("\n %2d: ", - ucGroupEntryList_Idx)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - (MURA_COLOR_RED "%1d" MURA_COLOR_RESET - ", ", - pEntry->au4PfidGroupTableMap - [ucPFIDList_Idx] - [ucGroupEntryList_Idx])); - } - - for (ucGroupEntryList_Idx = (MU_2U_NUM + MU_3U_NUM); - ucGroupEntryList_Idx < MAX_MURA_GRP; - ucGroupEntryList_Idx++) { - if (((ucGroupEntryList_Idx - - (MU_2U_NUM + MU_3U_NUM)) % - 20) == 0) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("\n %2d: ", - ucGroupEntryList_Idx)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - (MURA_COLOR_GREEN - "%1d" MURA_COLOR_RESET ", ", - pEntry->au4PfidGroupTableMap - [ucPFIDList_Idx] - [ucGroupEntryList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n")); - } - - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,("\n")); */ - /* Show MU-RGA Tx Success Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn2 Tx Succ Counter :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { -#ifdef RT_BIG_ENDIAN - pEntry->u4TxSuccCnt[ucPFIDList_Idx] = - le2cpu32(pEntry->u4TxSuccCnt[ucPFIDList_Idx]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->u4TxSuccCnt[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Tx Fail Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn2 Tx Fail Counter :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { -#ifdef RT_BIG_ENDIAN - pEntry->u4TxFailCnt[ucPFIDList_Idx] = - le2cpu32(pEntry->u4TxFailCnt[ucPFIDList_Idx]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->u4TxFailCnt[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Tx Success Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn3 Tx Succ Counter :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { -#ifdef RT_BIG_ENDIAN - pEntry->u4TxCn3SuccCnt[ucPFIDList_Idx] = le2cpu32( - pEntry->u4TxCn3SuccCnt[ucPFIDList_Idx]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->u4TxCn3SuccCnt[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Tx Fail Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn3 Tx Fail Counter :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { -#ifdef RT_BIG_ENDIAN - pEntry->u4TxCn3FailCnt[ucPFIDList_Idx] = le2cpu32( - pEntry->u4TxCn3FailCnt[ucPFIDList_Idx]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->u4TxCn3FailCnt[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Tx Success Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn4 Tx Succ Counter :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { -#ifdef RT_BIG_ENDIAN - pEntry->u4TxCn4SuccCnt[ucPFIDList_Idx] = le2cpu32( - pEntry->u4TxCn4SuccCnt[ucPFIDList_Idx]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->u4TxCn4SuccCnt[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Tx Fail Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn4 Tx Fail Counter :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { -#ifdef RT_BIG_ENDIAN - pEntry->u4TxCn4FailCnt[ucPFIDList_Idx] = le2cpu32( - pEntry->u4TxCn4FailCnt[ucPFIDList_Idx]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->u4TxCn4FailCnt[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Tx PER Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn2 Total Tx PER :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", pEntry->ucTxPER[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Tx PER Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn3 Total Tx PER :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", pEntry->ucTxCn3PER[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Tx PER Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Cn4 Total Tx PER :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", pEntry->ucTxCn4PER[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Mobility */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Mobility :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", pEntry->fgMobility[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU-RGA Delta MCS */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Delta MCS Rate :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->aucMURADeltaMCS[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU Succ Sounding Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA MU Succ Sounding Counter :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { -#ifdef RT_BIG_ENDIAN - pEntry->au2SuccSounding[ucPFIDList_Idx] = le2cpu16( - pEntry->au2SuccSounding[ucPFIDList_Idx]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->au2SuccSounding[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU Fail Sounding Counter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA MU Fail Sounding Counter :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { -#ifdef RT_BIG_ENDIAN - pEntry->au2FailSounding[ucPFIDList_Idx] = le2cpu16( - pEntry->au2FailSounding[ucPFIDList_Idx]); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->au2FailSounding[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); - /* Show MU SND PER */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA MU Sounding Fail Rate :\n")); - - for (ucPFIDList_Idx = 0; ucPFIDList_Idx < MAX_MURA_NUM; - ucPFIDList_Idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %2d,", - pEntry->aucSoundingFailRate[ucPFIDList_Idx])); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n\n")); -#ifdef RT_BIG_ENDIAN - pEntry->u4CalculateSoundingEnd = - le2cpu32(pEntry->u4CalculateSoundingEnd); - pEntry->u4CalculateSoundingStart = - le2cpu32(pEntry->u4CalculateSoundingStart); - pEntry->u4CalculateGroupMcsRateEnd = - le2cpu32(pEntry->u4CalculateGroupMcsRateEnd); - pEntry->u4CalculateGroupMcsRateStart = - le2cpu32(pEntry->u4CalculateGroupMcsRateStart); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" Sounding Period : %d ms\n", - pEntry->u4CalculateSoundingEnd - - pEntry->u4CalculateSoundingStart)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" Group Period : %d ms\n", - pEntry->u4CalculateGroupMcsRateEnd - - pEntry->u4CalculateGroupMcsRateStart)); - } -} - -/*----------------------------------------------------------------------------*/ -/*! -* @brief [CMD] Monitor the MU-RGA Group State -* -* @param pucParam -* -* @return status -*/ -/*----------------------------------------------------------------------------*/ -static VOID mura_algorithm_group_state_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_SHOW_ALGORITHM_GROUP_STATE pEntry = NULL; - - if (rsp_payload == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! rsp_payload is null!!\n", __func__)); - return; - } - - pEntry = (P_EVENT_SHOW_ALGORITHM_GROUP_STATE)rsp_payload; - - /* if (msg->rsp_payload == NULL) */ - /* { */ - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, */ - /* ("%s: error !! buffer not specific by cmd\n", __FUNCTION__)); */ - /* } */ - /* else */ - { - /* Show MU-RGA Group Entry Information */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Group Entry Information :")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n GPID MNUM\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %4d %4d\n", (pEntry->rMuraGroupEntry).u4GroupID, - (pEntry->rMuraGroupEntry).ucUserNum)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" MU0_ID MU1_ID MU2_ID MU3_ID\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %6d %6d %6d %6d\n", - (pEntry->rMuraGroupEntry).u4U0PFID, - (pEntry->rMuraGroupEntry).u4U1PFID, - (pEntry->rMuraGroupEntry).u4U2PFID, - (pEntry->rMuraGroupEntry).u4U3PFID)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" RATE0 RATE1 RATE2 RATE3\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %5d %5d %5d %5d\n", - (pEntry->rMuraGroupEntry).u2U0Rate + - ((pEntry->rMuraGroupEntry).ucU0SSN * 10), - (pEntry->rMuraGroupEntry).u2U1Rate + - ((pEntry->rMuraGroupEntry).ucU1SSN * 10), - (pEntry->rMuraGroupEntry).u2U2Rate + - ((pEntry->rMuraGroupEntry).ucU2SSN * 10), - (pEntry->rMuraGroupEntry).u2U3Rate + - ((pEntry->rMuraGroupEntry).ucU3SSN * 10))); - - if ((pEntry->rMuraGroupEntry).u4GroupValid) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n")); - else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n No Valid Group Entry\n\n")); - } -} - -/*----------------------------------------------------------------------------*/ -/*! -* @brief [CMD] Monitor the MU-RGA Hardware fallback State -* -* @param pucParam -* -* @return status -*/ -/*----------------------------------------------------------------------------*/ -static VOID mura_algorithm_hwfb_state_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_SHOW_ALGORITHM_HWFB_STATE pEntry = NULL; - UINT_8 ucMCSRate = 0; - - if (rsp_payload == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: error !! rsp_payload is null!!\n", __func__)); - return; - } - - pEntry = (P_EVENT_SHOW_ALGORITHM_HWFB_STATE)rsp_payload; - - /* if (msg->rsp_payload == NULL) */ - /* { */ - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, */ - /* ("%s: error !! buffer not specific by cmd\n", __FUNCTION__)); */ - /* } */ - /* else */ - { - /* Show MU-RGA Group Entry Information */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MU-RGA Hardware fallback Information :")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n MCS DnEn DnThres DnValue UpEn UpThres UpValue 20BSamp 40BSamp 80BSamp\n")); - - for (ucMCSRate = 0; ucMCSRate < 10; ucMCSRate++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %3d %4d %7d %7d %4d %7d %7d %7d %7d %7d\n", - ucMCSRate, pEntry->fgDownOneStep[ucMCSRate], - pEntry->ucDownThreshold[ucMCSRate], - pEntry->ucDownMCS[ucMCSRate], - pEntry->fgUpOneStep[ucMCSRate], - pEntry->ucUpThreshold[ucMCSRate], - pEntry->ucUpMCS[ucMCSRate], - pEntry->uc20BWSample[ucMCSRate] * - pEntry->uc20BWSampleFactor, - pEntry->uc40BWSample[ucMCSRate] * - pEntry->uc40BWSampleFactor, - pEntry->uc80BWSample[ucMCSRate] * - pEntry->uc80BWSampleFactor)); - } - } -} - -static VOID mura_algorithm_pfid_stat_callback(struct cmd_msg *msg, - char *rsp_payload, - UINT16 rsp_payload_len) -{ - P_EVENT_SHOW_PFID_STAT pEntry = (P_EVENT_SHOW_PFID_STAT)rsp_payload; - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Event is NULL!!\n", __func__)); - return; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Value of PFID stat are :-\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WlanIdx = %d\n", pEntry->u1WlanIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Mobility = %d\n", pEntry->fgMobility)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn2 SuccCnt = %u\n", pEntry->u4TxSuccCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn2 FailCnt = %u\n", pEntry->u4TxFailCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn3 SuccCnt = %u\n", pEntry->u4TxCn3SuccCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn3 FailCnt = %u\n", pEntry->u4TxCn3FailCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn4 SuccCnt = %u\n", pEntry->u4TxCn4SuccCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn4 FailCnt = %u\n", pEntry->u4TxCn4FailCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn2 TxPER = %u\n", pEntry->u1TxPER)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn3 TxPER = %u\n", pEntry->u1TxCn3PER)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Cn4 TxPER = %u\n", pEntry->u1TxCn4PER)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Sounding Period = %u\n", pEntry->u1SoundingPeriod)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Min Sounding Period = %u\n", pEntry->u1MinSoundingPeriod)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Max Sounding Period = %u\n", pEntry->u1MaxSoundingPeriod)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Sounding Period Step = %u\n", pEntry->u1SoundingPeriodStep)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Succ Sounding = %u\n", pEntry->u2SuccSounding)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Fail Sounding = %u\n", pEntry->u2FailSounding)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Sounding Fail Rate = %u\n", pEntry->u1SoundingFailRate)); -} - -#endif /* CFG_SUPPORT_MU_MIMO_RA */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_nps.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_nps.c deleted file mode 100644 index 141faca304..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_nps.c +++ /dev/null @@ -1,277 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - ap_nps.c - - Abstract: - IEEE 802.11v NPS SoftAP related function - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Carter Chen 08-23-2013 created for 7603 AP - */ -#ifdef MT_MAC - -#include "rt_config.h" - -extern VOID write_tmac_info_tim(RTMP_ADAPTER *pAd, INT apidx, UCHAR *tmac_buf, - HTTRANSMIT_SETTING *BeaconTransmit, - ULONG frmLen); - -BOOLEAN TimTransmitRequired(RTMP_ADAPTER *pAd, INT apidx, BSS_STRUCT *pMbss) -{ - BOOLEAN result = FALSE; - TIM_BUF_STRUC *tim_info; - - tim_info = &pMbss->wdev.bcn_buf.tim_buf; - - if (tim_info->TimBufIdx >= HW_BEACON_MAX_NUM) - return result; - - if (tim_info->bTimSntReq == TRUE) - result = TRUE; - - return result; -} - -#ifdef MT_MAC -VOID MtUpdateTimToAsic(IN RTMP_ADAPTER *pAd, IN INT apidx, IN ULONG FrameLen) -{ - TIM_BUF_STRUC *tim_buf = NULL; - UCHAR *buf; - INT len; - PNDIS_PACKET *pkt = NULL; - UINT32 WdevIdx; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - tim_buf = &wdev->bcn_buf.tim_buf; - } - - if (!tim_buf) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): bcn_buf is NULL!\n", __func__)); - return; - } - - WdevIdx = wdev->wdev_idx; - pkt = tim_buf->TimPkt; - - if (pkt) { - UCHAR qIdx; - buf = (UCHAR *)GET_OS_PKT_DATAPTR(pkt); - len = FrameLen + cap->tx_hw_hdr_len; - SET_OS_PKT_LEN(pkt, len); - RTMP_SET_PACKET_WDEV(pkt, WdevIdx); - qIdx = HcGetBcnQueueIdx(pAd, wdev); - RTMP_SET_PACKET_TYPE(pkt, TX_MGMT); - send_mlme_pkt(pAd, pkt, wdev, qIdx, FALSE); - return; - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): TimPkt is NULL!\n", __func__)); -} -#endif /* MT_MAC */ - -VOID write_tmac_info_tim(RTMP_ADAPTER *pAd, INT apidx, UCHAR *tmac_buf, - HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen) -{ - MAC_TX_INFO mac_info; - struct wifi_dev *wdev; - - NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info)); -#ifdef MT_MAC - mac_info.Type = FC_TYPE_MGMT; - mac_info.SubType = SUBTYPE_ACTION; -#endif - mac_info.FRAG = FALSE; - mac_info.CFACK = FALSE; - mac_info.InsTimestamp = FALSE; - mac_info.AMPDU = FALSE; - mac_info.BM = 1; - mac_info.Ack = FALSE; - mac_info.NSeq = TRUE; - mac_info.BASize = 0; - mac_info.WCID = 0; - mac_info.Length = frmLen; - mac_info.PID = PID_MGMT; - mac_info.TID = 0; - mac_info.TxRate = 0; - mac_info.Txopmode = IFS_HTTXOP; - mac_info.hdr_len = 24; - mac_info.bss_idx = apidx; - mac_info.SpeEn = 1; - mac_info.Preamble = LONG_PREAMBLE; - mac_info.IsAutoRate = FALSE; - wdev = wdev_search_by_address(pAd, tmac_buf + sizeof(TMAC_TXD_L) + 10); - - if (!wdev) - return; - - mac_info.q_idx = HcGetBcnQueueIdx(pAd, wdev); -#ifdef MT_MAC - mac_info.TxSPriv = wdev->func_idx; - mac_info.OmacIdx = wdev->OmacIdx; - - if (wdev->bcn_buf.BcnUpdateMethod == BCN_GEN_BY_FW) - mac_info.IsOffloadPkt = TRUE; - else - mac_info.IsOffloadPkt = FALSE; - - mac_info.Preamble = LONG_PREAMBLE; - NdisZeroMemory(tmac_buf, sizeof(TMAC_TXD_L)); -#endif - pAd->archOps.write_tmac_info_fixed_rate(pAd, tmac_buf, &mac_info, - BeaconTransmit); -} - -VOID APMakeBssTimFrame(RTMP_ADAPTER *pAd, INT apidx) -{ - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; - HEADER_802_11 TimHdr; - LARGE_INTEGER FakeTimestamp; - ULONG FrameLen = 0; - UCHAR *pTimFrame, *ptr, *tmac_info; - HTTRANSMIT_SETTING TimTransmit = { - .word = 0 - }; /* MGMT frame PHY rate setting when operatin at HT rate. */ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - UCHAR Cat = 11; /* Tim Category field */ - UCHAR Act = 0; /* Tim Action field */ - UCHAR ChkBcn = 0; /* Check Beacon field init from 0. */ - ULONG UpdatePos = 0; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - if (!TimTransmitRequired(pAd, apidx, pMbss)) - return; - - if (wdev->bcn_buf.tim_buf.TimPkt == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid TimPkt for MBSS[%d]\n", __func__, - apidx)); - return; - } - - tmac_info = (UCHAR *)GET_OS_PKT_DATAPTR(wdev->bcn_buf.tim_buf.TimPkt); - pTimFrame = (UCHAR *)(tmac_info + tx_hw_hdr_len); - ActHeaderInit(pAd, &TimHdr, BROADCAST_ADDR, wdev->if_addr, wdev->bssid); - MakeOutgoingFrame(pTimFrame, &FrameLen, sizeof(HEADER_802_11), &TimHdr, - 1, &Cat, 1, &Act, 1, &ChkBcn, TIMESTAMP_LEN, - &FakeTimestamp, END_OF_ARGS); - TimTransmit.word = 0; - wdev->bcn_buf.TimIELocationInTim = (UCHAR)FrameLen; - UpdatePos = wdev->bcn_buf.TimIELocationInTim; - /* - step 2 - update TIM IE - TODO: enlarge TIM bitmap to support up to 64 STAs - TODO: re-measure if RT2600 TBTT interrupt happens faster than BEACON sent out time - */ - ptr = pTimFrame + (UCHAR)FrameLen; - *ptr = IE_TIM; - *(ptr + 1) = 0x0e; - *(ptr + 2) = pAd->ApCfg.DtimCount; - *(ptr + 3) = pAd->ApCfg.DtimPeriod; - *(ptr + 4) = 0xa0; - *(ptr + 5) = 0xa0; - *(ptr + 6) = 0xa0; - *(ptr + 7) = 0xa0; - *(ptr + 8) = 0xa0; - *(ptr + 9) = 0xa0; - *(ptr + 10) = 0xa0; - *(ptr + 11) = 0xa0; - *(ptr + 12) = 0xa0; - *(ptr + 13) = 0xa0; - *(ptr + 14) = 0xa0; - *(ptr + 15) = 0xa0; - /* adjust TIM length according to the new TIM */ - FrameLen += 16; /* (2 + *(ptr+1)); */ - - /* When Beacon is use CCK to send, high rate TIM shall use OFDM to send. and it's mandatory. */ - if (wdev->channel <= 14) { - TimTransmit.field.MODE = MODE_OFDM; - TimTransmit.field.MCS = MCS_RATE_6; - } else { - TimTransmit.field.MODE = MODE_OFDM; - TimTransmit.field.MCS = MCS_RATE_9; - } - - write_tmac_info_tim(pAd, apidx, tmac_info, &TimTransmit, FrameLen); -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - AsicUpdateBeacon(pAd, wdev, FrameLen, PKT_V2_TIM); -#else - AsicUpdateBeacon(pAd, wdev, FrameLen, PKT_TIM); -#endif - if (0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Dump the TimFrame of BSS%d!\n", __func__, - apidx)); - hex_dump("Initial TimFrameBuf", tmac_info, - FrameLen + tx_hw_hdr_len); - } -} - -UCHAR GetTimNum(RTMP_ADAPTER *pAd) -{ - int i; - int NumTim; - TIM_BUF_STRUC *tim_info; - - NumTim = 0; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - tim_info = &pAd->ApCfg.MBSSID[i].wdev.bcn_buf.tim_buf; - - if (tim_info->bTimSntReq) { - tim_info->TimBufIdx = NumTim; - NumTim++; - } - } - - return NumTim; -} - -VOID APMakeAllTimFrame(RTMP_ADAPTER *pAd) -{ - INT i; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) - APMakeBssTimFrame(pAd, i); -} - -INT wdev_tim_buf_init(RTMP_ADAPTER *pAd, TIM_BUF_STRUC *tim_info) -{ - INT ret; - - /* tim_info->TimBufIdx = HW_BEACON_MAX_NUM; */ - if (!tim_info->TimPkt) { - ret = RTMPAllocateNdisPacket(pAd, &tim_info->TimPkt, NULL, 0, - NULL, MAX_TIM_SIZE); - if (ret != NDIS_STATUS_SUCCESS) - return FALSE; - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():TimPkt is allocated!\n", __func__)); - } - - tim_info->bTimSntReq = TRUE; - return TRUE; -} - -#endif /* MT_MAC */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_qload.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_qload.c deleted file mode 100644 index b53dac11a1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_qload.c +++ /dev/null @@ -1,997 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - Provide information on the current STA population and traffic levels - in the QBSS. - - This attribute is available only at a QAP. This attribute, when TRUE, - indicates that the QAP implementation is capable of generating and - transmitting the QBSS load element in the Beacon and Probe Response frames. - -***************************************************************************/ - -#include "rt_config.h" - -#ifdef AP_QLOAD_SUPPORT - -struct GNU_PACKED _ELM_QBSS_LOAD { - UINT8 ElementId; - UINT8 Length; - - /* the total number of STAs currently associated with this QBSS */ - UINT16 StationCount; - - /* defined as the percentage of time, nomalized to 255, the QAP sensed the - medium busy, as indicated by either the physical or virtual carrier - sense mechanism. - This percentage is computed using the formula: - ((channel busy time / (dot11ChannelUtilizationBeaconIntervals * - dot11BeaconPeriod * 1024)) * 255) */ - UINT8 ChanUtil; - - /* specifies the remaining amount of medium time available via explicit - admission control, in units of 32 microsecond periods per 1 second. - The field is helpful for roaming non-AP QSTAs to select a QAP that is - likely to accept future admission control requests, but it does not - represent a guarantee that the HC will admit these requests. */ - UINT16 AvalAdmCap; -}; - -#define ELM_QBSS_LOAD_ID 11 -#define ELM_QBSS_LOAD_LEN 5 - -/* - We will send a alarm when channel busy time (primary or secondary) >= - Time Threshold and Num Threshold. - - QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD = 0 means alarm function is disabled. - - If you want to enable it, use command - "iwpriv ra0 set qloadalarmtimethres=90" -*/ -#define QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD 0 /* unit: % */ -#define QBSS_LOAD_ALRAM_BUSY_NUM_THRESHOLD 10 /* unit: 1 */ - -/* a alarm will not re-issued until QBSS_LOAD_ALARM_DURATION * TBTT */ -#define QBSS_LOAD_ALARM_DURATION 100 /* unit: TBTT */ - -static VOID QBSS_LoadAlarmSuspend(IN RTMP_ADAPTER *pAd); - -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM -/* handle a alarm */ -static VOID QBSS_LoadAlarm(IN RTMP_ADAPTER *pAd); -static VOID QBSS_LoadAlarmBusyTimeThresholdReset(IN RTMP_ADAPTER *pAd, - IN UINT32 TimePeriod); -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - -/* --------------------------------- Private -------------------------------- */ - -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM -/* -======================================================================== -Routine Description: - Handle a alarm. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - You can use different methods to handle QBSS Load alarm here. - - Current methods are: - 1. Change 20/40 to 20-only. - 2. Change channel to the clear channel. -======================================================================== -*/ -static VOID QBSS_LoadAlarm(IN RTMP_ADAPTER *pAd) -{ - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - struct wifi_dev *wdev; - UCHAR i; - UCHAR op_ht_bw; - UCHAR op_ext_cha; -#endif /*DOT11N_DRAFT3*/ -#endif /*DOT11_N_SUPPORT*/ - /* suspend alarm until channel switch */ - QBSS_LoadAlarmSuspend(pAd); - pQloadCtrl->QloadAlarmNumber++; - /* check if we have already been 20M bandwidth */ -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - wdev = &pAd->ApCfg.MBSSID[i].wdev; - op_ext_cha = wlan_operate_get_ext_cha(wdev); - op_ht_bw = wlan_operate_get_ht_bw(wdev); - - if ((op_ext_cha != 0) && (op_ht_bw != HT_BW_20)) { - MAC_TABLE *pMacTable; - UINT32 StaId; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("qbss> Alarm! Change to 20 bw...\n")); - /* disassociate stations without D3 2040Coexistence function */ - pMacTable = &pAd->MacTab; - - /*TODO: Carter, check StaId why start from 1.*/ - - for (StaId = 1; VALID_UCAST_ENTRY_WCID(pAd, StaId); - StaId++) { - MAC_TABLE_ENTRY *pEntry = - &pMacTable->Content[StaId]; - BOOLEAN bDisconnectSta = FALSE; - - if (!IS_ENTRY_CLIENT(pEntry)) - continue; - - if (pEntry->Sst != SST_ASSOC) - continue; - - if (pEntry->BSS2040CoexistenceMgmtSupport) - bDisconnectSta = TRUE; - - if (bDisconnectSta) { - /* send wireless event - for ageout */ - RTMPSendWirelessEvent( - pAd, IW_AGEOUT_EVENT_FLAG, - pEntry->Addr, 0, 0); - { - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - HEADER_802_11 DeAuthHdr; - USHORT Reason; - /* send out a DISASSOC request frame */ - NStatus = MlmeAllocateMemory( - pAd, &pOutBuffer); - - if (NStatus != - NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" MlmeAllocateMemory fail ..\n")); - /*NdisReleaseSpinLock(&pAd->MacTabLock); */ - continue; - } - - Reason = - REASON_DEAUTH_STA_LEAVING; - MgtMacHeaderInit( - pAd, &DeAuthHdr, - SUBTYPE_DEAUTH, 0, - pEntry->Addr, - pAd->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.if_addr, - pAd->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.bssid); - MakeOutgoingFrame( - pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), - &DeAuthHdr, 2, &Reason, - END_OF_ARGS); - MiniportMMRequest(pAd, 0, - pOutBuffer, - FrameLen); - MlmeFreeMemory(pOutBuffer); - } - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("qbss> Alarm! Deauth the station %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pEntry->Addr))); -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc( - pAd, pEntry->wcid, - REASON_DEAUTH_STA_LEAVING); -#endif - mac_entry_delete(pAd, pEntry); - continue; - } - } - - /* for 11n */ - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - /* mark alarm flag */ - pQloadCtrl->FlgQloadAlarm = TRUE; - QBSS_LoadAlarmResume(pAd); - } else -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - { - /* we are in 20MHz bandwidth so try to switch channel */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("qbss> Alarm! Switch channel...\n")); - /* send command to switch channel */ - RTEnqueueInternalCmd(pAd, CMDTHREAD_CHAN_RESCAN, - (VOID *)&i, sizeof(UCHAR)); - } - } -} - -/* -======================================================================== -Routine Description: - Re-calculate busy time threshold. - -Arguments: - pAd - WLAN control block pointer - TimePeriod - TBTT - -Return Value: - None - -Note: - EX: TBTT=100ms, 90%, pAd->QloadBusyTimeThreshold = 90ms -======================================================================== -*/ -static VOID QBSS_LoadAlarmBusyTimeThresholdReset(IN RTMP_ADAPTER *pAd, - IN UINT32 TimePeriod) -{ - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - pQloadCtrl->QloadBusyTimeThreshold = TimePeriod; - pQloadCtrl->QloadBusyTimeThreshold *= - pQloadCtrl->QloadAlarmBusyTimeThreshold; - pQloadCtrl->QloadBusyTimeThreshold /= 100; - pQloadCtrl->QloadBusyTimeThreshold <<= - 10; /* translate mini-sec to micro-sec */ -} -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - -/* -======================================================================== -Routine Description: - Initialize ASIC Channel Busy Calculation mechanism. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - Init Condition: WMM must be enabled. -======================================================================== -*/ -VOID QBSS_LoadInit(RTMP_ADAPTER *pAd) -{ - UINT32 IdBss; - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - /* check whether any BSS enables WMM feature */ - for (IdBss = 0; IdBss < pAd->ApCfg.BssidNum; IdBss++) { - if ((pAd->ApCfg.MBSSID[IdBss].wdev.bWmmCapable) -#ifdef DOT11K_RRM_SUPPORT - || (IS_RRM_ENABLE(&pAd->ApCfg.MBSSID[IdBss].wdev)) -#endif /* DOT11K_RRM_SUPPORT */ - ) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.channel > 14) - pQloadCtrl = HcGetQloadCtrlByRf(pAd, RFIC_5GHZ); - else - pQloadCtrl = - HcGetQloadCtrlByRf(pAd, RFIC_24GHZ); - if (!pQloadCtrl) - continue; - if (pQloadCtrl->FlgQloadEnable) - continue; - - pQloadCtrl->FlgQloadEnable = TRUE; - /* default value is 50, please reference to IEEE802.11e 2005 Annex D */ - /* pQloadCtrl->QloadChanUtilBeaconInt = 50; */ - pQloadCtrl->QloadChanUtilBeaconInt = 5; - - AsicSetChBusyStat(pAd, pQloadCtrl->FlgQloadEnable); - - pQloadCtrl->QloadChanUtilTotal = 0; - pQloadCtrl->QloadChanUtilTotalCcaNavTx = 0; - pQloadCtrl->QloadUpTimeLast = 0; - -#ifdef QLOAD_FUNC_BUSY_TIME_STATS - /* clear busy time statistics */ - NdisZeroMemory(pQloadCtrl->QloadBusyCountPri, - sizeof(pQloadCtrl->QloadBusyCountPri)); - NdisZeroMemory(pQloadCtrl->QloadBusyCountSec, - sizeof(pQloadCtrl->QloadBusyCountSec)); -#endif /* QLOAD_FUNC_BUSY_TIME_STATS */ - -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - /* init threshold before QBSS_LoadAlarmReset */ - pQloadCtrl->QloadAlarmBusyTimeThreshold = - QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD; - pQloadCtrl->QloadAlarmBusyNumThreshold = - QBSS_LOAD_ALRAM_BUSY_NUM_THRESHOLD; - - QBSS_LoadAlarmReset(pAd); -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - } - } -} - -/* -======================================================================== -Routine Description: - Reset alarm function. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID QBSS_LoadAlarmReset(IN RTMP_ADAPTER *pAd) -{ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - pQloadCtrl->FlgQloadAlarm = FALSE; - pQloadCtrl->QloadAlarmDuration = 0; - pQloadCtrl->QloadAlarmNumber = 0; - pQloadCtrl->FlgQloadAlarmIsSuspended = FALSE; - QBSS_LoadAlarmBusyTimeThresholdReset(pAd, pAd->CommonCfg.BeaconPeriod); -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ -} - -/* -======================================================================== -Routine Description: - Resume alarm function. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID QBSS_LoadAlarmResume(IN RTMP_ADAPTER *pAd) -{ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - pQloadCtrl->FlgQloadAlarmIsSuspended = FALSE; -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ -} - -/* -======================================================================== -Routine Description: - Suspend alarm function. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -static VOID QBSS_LoadAlarmSuspend(IN RTMP_ADAPTER *pAd) -{ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - pQloadCtrl->FlgQloadAlarmIsSuspended = TRUE; -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ -} - -/* -======================================================================== -Routine Description: - Get average busy time in current channel. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - average busy time - -Note: -======================================================================== -*/ -UINT32 QBSS_LoadBusyTimeGet(IN RTMP_ADAPTER *pAd) -{ - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - if (pQloadCtrl->QloadChanUtilBeaconCnt == 0) - return pQloadCtrl->QloadChanUtilTotal; - - return (pQloadCtrl->QloadChanUtilTotal / - pQloadCtrl->QloadChanUtilBeaconCnt); -} - -/* -======================================================================== -Routine Description: - Check if a alarm is occurred and clear the alarm. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - TRUE - alarm occurs - FALSE - no alarm - -Note: - We will clear the alarm in the function. -======================================================================== -*/ -BOOLEAN QBSS_LoadIsAlarmIssued(IN RTMP_ADAPTER *pAd) -{ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - BOOLEAN FlgQloadAlarm = pQloadCtrl->FlgQloadAlarm; - - pQloadCtrl->FlgQloadAlarm = FALSE; - return FlgQloadAlarm; -#else - return FALSE; -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ -} - -/* -======================================================================== -Routine Description: - Check if the busy time is accepted. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - TURE - ok - FALSE - fail - -Note: -======================================================================== -*/ -BOOLEAN QBSS_LoadIsBusyTimeAccepted(IN RTMP_ADAPTER *pAd, IN UINT32 BusyTime) -{ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - if (pQloadCtrl->QloadAlarmBusyTimeThreshold == 0) - return TRUE; /* always ok */ - - if (BusyTime >= pQloadCtrl->QloadBusyTimeThreshold) - return FALSE; - -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - return TRUE; -} - -#ifdef CONFIG_HOTSPOT_R2 -UINT32 QBSS_LoadElementAppend_HSTEST(IN RTMP_ADAPTER *pAd, - OUT UINT8 *pBeaconBuf, IN UCHAR apidx) -{ - struct _ELM_QBSS_LOAD load, *pLoad = &load; - ULONG ElmLen; - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - /* check whether channel busy time calculation is enabled */ - if (pQloadCtrl->FlgQloadEnable == 0) - return 0; - - /* End of if */ - /* init */ - pLoad->ElementId = ELM_QBSS_LOAD_ID; - pLoad->Length = ELM_QBSS_LOAD_LEN; - pLoad->StationCount = - le2cpu16(pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.QLoadStaCnt); - pLoad->ChanUtil = pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.QLoadCU; - /* because no ACM is supported, the available bandwidth is 1 sec */ - pLoad->AvalAdmCap = le2cpu16(0xffff); /* 0x7a12 * 32us = 1 second */ - /* copy the element to the frame */ - MakeOutgoingFrame(pBeaconBuf, &ElmLen, sizeof(struct _ELM_QBSS_LOAD), - pLoad, END_OF_ARGS); - return ElmLen; -} /* End of QBSS_LoadElementAppend */ -#endif - -/* -======================================================================== -Routine Description: - Append the QBSS Load element to the beacon frame. - -Arguments: - pAd - WLAN control block pointer - *pBeaconBuf - the beacon or probe response frame - -Return Value: - the element total Length - -Note: - Append Condition: You must check whether WMM is enabled before the - function is using. -======================================================================== -*/ -UINT32 QBSS_LoadElementAppend(RTMP_ADAPTER *pAd, UINT8 *pBeaconBuf, - QLOAD_CTRL *pQloadCtrl, UCHAR apidx) -{ - struct _ELM_QBSS_LOAD load, *pLoad = &load; - ULONG ElmLen; - - /* check whether channel busy time calculation is enabled */ - if (pQloadCtrl->FlgQloadEnable == 0) - return 0; - - /* init */ - pLoad->ElementId = ELM_QBSS_LOAD_ID; - pLoad->Length = ELM_QBSS_LOAD_LEN; - pLoad->StationCount = le2cpu16(pAd->ApCfg.MBSSID[apidx].StaCount); - pLoad->ChanUtil = pQloadCtrl->QloadChanUtilCcaNavTx; - /* because no ACM is supported, the available bandwidth is 1 sec */ - pLoad->AvalAdmCap = le2cpu16(0x7a12); /* 0x7a12 * 32us = 1 second */ - /* copy the element to the frame */ - MakeOutgoingFrame(pBeaconBuf, &ElmLen, sizeof(struct _ELM_QBSS_LOAD), - pLoad, END_OF_ARGS); - return ElmLen; -} - -/* -======================================================================== -Routine Description: - Update Channel Utilization. - -Arguments: - pAd - WLAN control block pointer - UpTime - current up time - -Return Value: - None - -Note: - UpTime is used in QLOAD_FUNC_BUSY_TIME_STATS & QLOAD_FUNC_BUSY_TIME_ALARM - - If UpTime != 0, it means that the time period calling the function - maybe not TBTT so we need to re-calculate the time period. - - If you call the function in kernel thread, the time period sometimes - will not accurate due to kernel thread is not real-time, so we need to - recalculate the time period. -======================================================================== -*/ -VOID QBSS_LoadUpdate(IN RTMP_ADAPTER *pAd, IN ULONG UpTime) -{ - UINT32 ChanUtilNu, ChanUtilNuCcaNavTx, ChanUtilDe; - UINT32 BusyTime = 0; - UINT32 BusyTimeCcaNavTx = 0; - UINT32 BusyTimeId; - UINT32 TimePeriod = pAd->CommonCfg.BeaconPeriod; -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - BOOLEAN FlgIsBusyOverThreshold = FALSE; - BOOLEAN FlgIsAlarmNeeded = FALSE; -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ -#ifdef OCE_SUPPORT - BOOLEAN SameChanUtil = TRUE; -#endif /* OCE_SUPPORT */ - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - UINT8 UpdateBands = 1, i = 0; -#if defined(ACS_CTCC_SUPPORT) || defined(OCE_SUPPORT) - struct wifi_dev *wdev = NULL; - UCHAR band_idx = 0; - AUTO_CH_CTRL *auto_ch_ctrl = NULL; - wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - band_idx = HcGetBandByWdev(wdev); - auto_ch_ctrl = HcGetAutoChCtrlbyBandIdx(pAd, band_idx); -#endif /* ACS_CTCC_SUPPORT OCE_SUPPORT*/ - - UpdateBands = (pAd->CommonCfg.dbdc_mode == 0) ? 1 : 2; - - for (i = 0; i < UpdateBands; i++) { - if (pAd->CommonCfg.dbdc_mode != 0) { - UCHAR PhyMode = HcGetRadioPhyModeByBandIdx(pAd, i); - UINT32 RfIC = (WMODE_CAP_5G(PhyMode)) ? RFIC_5GHZ : - RFIC_24GHZ; - pQloadCtrl = HcGetQloadCtrlByRf(pAd, RfIC); - if (!pQloadCtrl) - continue; - } - - /* check whether channel busy time calculation is enabled */ - if ((pQloadCtrl->FlgQloadEnable == 0) || - (pQloadCtrl->FlgQloadAlarmIsSuspended == TRUE)) - continue; - - /* calculate new time period if needed */ - if ((UpTime > 0) && (pQloadCtrl->QloadUpTimeLast > 0) && - (UpTime > pQloadCtrl->QloadUpTimeLast)) { - /* re-calculate time period */ - TimePeriod = - (UINT32)(UpTime - pQloadCtrl->QloadUpTimeLast); - /* translate to mini-second */ - TimePeriod = (TimePeriod * 1000) / OS_HZ; -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - - /* re-calculate QloadBusyTimeThreshold */ - if (TimePeriod != pQloadCtrl->QloadTimePeriodLast) - QBSS_LoadAlarmBusyTimeThresholdReset( - pAd, TimePeriod); - - pQloadCtrl->QloadTimePeriodLast = TimePeriod; -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - } - - /* update up time */ - pQloadCtrl->QloadUpTimeLast = UpTime; - /* do busy time statistics */ -#ifdef DOT11_N_SUPPORT - { - struct freq_oper oper; - - if (hc_radio_query_by_index(pAd, i, &oper) != - HC_STATUS_OK) - continue; - - if ((oper.ext_cha != 0) && (oper.ht_bw != 0) -#ifdef OFFCHANNEL_SCAN_FEATURE - && (!ApScanRunning(pAd, NULL)) && - (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_INVALID) -#endif - ) { - /* in 20MHz, no need to check busy time of secondary channel */ -#ifdef ACS_CTCC_SUPPORT - if (auto_ch_ctrl->AutoChSelCtrl - .AutoChScanStatMachine.CurrState == - AUTO_CH_SEL_SCAN_IDLE) -#endif - BusyTimeCcaNavTx = - AsicGetChBusyCnt(pAd, 1); - pQloadCtrl->QloadLatestChannelBusyTimeSec = - BusyTime; -#ifdef QLOAD_FUNC_BUSY_TIME_STATS - BusyTimeId = BusyTimeCcaNavTx >> - 10; /* translate us to ms */ - /* ex:95ms, 95*20/100 = 19 */ - BusyTimeId = - (BusyTimeId * QLOAD_BUSY_INTERVALS) / - TimePeriod; - - if (BusyTimeId >= QLOAD_BUSY_INTERVALS) - BusyTimeId = QLOAD_BUSY_INTERVALS - 1; - - pQloadCtrl->QloadBusyCountSec[BusyTimeId]++; -#endif /* QLOAD_FUNC_BUSY_TIME_STATS */ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - - if ((pQloadCtrl->FlgQloadAlarmIsSuspended == - FALSE) && - (pQloadCtrl->QloadAlarmBusyTimeThreshold > - 0)) { - /* Alarm is not suspended and is enabled */ - if ((pQloadCtrl->QloadBusyTimeThreshold != - 0) && - (BusyTimeCcaNavTx >= - pQloadCtrl->QloadBusyTimeThreshold)) - FlgIsBusyOverThreshold = TRUE; - } - -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - } - } - -#endif /* DOT11_N_SUPPORT */ - /* do busy time statistics for primary channel */ - /* BusyTime = AsicGetChBusyCnt(pAd, 0); */ - /* update BusyTime from OneSecMibBucket[i] */ - BusyTime = pAd->OneSecMibBucket.ChannelBusyTime[i]; - if (i < DBDC_BAND_NUM) - BusyTimeCcaNavTx = - pAd->OneSecMibBucket.ChannelBusyTimeCcaNavTx[i]; - pQloadCtrl->QloadLatestChannelBusyTimePri = BusyTime; -#ifdef QLOAD_FUNC_BUSY_TIME_STATS - BusyTimeId = BusyTimeCcaNavTx >> 10; /* translate us to ms */ - /* ex:95ms, 95*20/100 = 19 */ - BusyTimeId = (BusyTimeId * QLOAD_BUSY_INTERVALS) / TimePeriod; - - if (BusyTimeId >= QLOAD_BUSY_INTERVALS) - BusyTimeId = QLOAD_BUSY_INTERVALS - 1; - - pQloadCtrl->QloadBusyCountPri[BusyTimeId]++; -#endif /* QLOAD_FUNC_BUSY_TIME_STATS */ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - - if ((pQloadCtrl->FlgQloadAlarmIsSuspended == FALSE) && - (pQloadCtrl->QloadAlarmBusyTimeThreshold > 0)) { - /* Alarm is not suspended and is enabled */ - if ((pQloadCtrl->QloadBusyTimeThreshold != 0) && - (BusyTimeCcaNavTx >= - pQloadCtrl->QloadBusyTimeThreshold)) - FlgIsBusyOverThreshold = TRUE; - } - -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - /* accumulate channel busy time for primary channel */ - pQloadCtrl->QloadChanUtilTotal += BusyTime; - pQloadCtrl->QloadChanUtilTotalCcaNavTx += BusyTimeCcaNavTx; - - /* update new channel utilization for primary channel */ - if (++pQloadCtrl->QloadChanUtilBeaconCnt >= - pQloadCtrl->QloadChanUtilBeaconInt) { - ChanUtilNu = pQloadCtrl->QloadChanUtilTotal; - ChanUtilNu *= 255; - ChanUtilNuCcaNavTx = - pQloadCtrl->QloadChanUtilTotalCcaNavTx; - ChanUtilNuCcaNavTx *= 255; - ChanUtilDe = pQloadCtrl->QloadChanUtilBeaconInt; - ChanUtilDe *= 1000000; /* sec to us */ -#ifdef OCE_SUPPORT - if (pQloadCtrl->QloadChanUtilCcaNavTx == - (UINT8)(ChanUtilNuCcaNavTx / ChanUtilDe)) - SameChanUtil = TRUE; - else - SameChanUtil = FALSE; -#endif /* OCE_SUPPORT */ - pQloadCtrl->QloadChanUtil = - (UINT8)(ChanUtilNu / ChanUtilDe); - pQloadCtrl->QloadChanUtilCcaNavTx = - (UINT8)(ChanUtilNuCcaNavTx / ChanUtilDe); - - if ((ChanUtilNu / ChanUtilDe) >= 255) - pQloadCtrl->QloadChanUtil = 255; - if ((ChanUtilNuCcaNavTx / ChanUtilDe) >= 255) - pQloadCtrl->QloadChanUtilCcaNavTx = 255; - - /* re-accumulate channel busy time */ - pQloadCtrl->QloadChanUtilBeaconCnt = 0; - pQloadCtrl->QloadChanUtilTotal = 0; - pQloadCtrl->QloadChanUtilTotalCcaNavTx = 0; -#ifdef OCE_SUPPORT - if (!SameChanUtil) - UpdateBeaconHandler(pAd, wdev, - BCN_UPDATE_IE_CHG); -#endif /* OCE_SUPPORT */ - } - -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - - /* check if alarm function is enabled */ - if ((pQloadCtrl->FlgQloadAlarmIsSuspended == FALSE) && - (pQloadCtrl->QloadAlarmBusyTimeThreshold > 0)) { - /* Alarm is not suspended and is enabled */ - - /* check if we need to issue a alarm */ - if (FlgIsBusyOverThreshold == TRUE) { - if (pQloadCtrl->QloadAlarmDuration == 0) { - /* last alarm ended so we can check new alarm */ - pQloadCtrl->QloadAlarmBusyNum++; - - if (pQloadCtrl->QloadAlarmBusyNum >= - pQloadCtrl - ->QloadAlarmBusyNumThreshold) { - /* - The continued number of busy time >= threshold is larger - than number threshold so issuing a alarm. - */ - FlgIsAlarmNeeded = TRUE; - pQloadCtrl->QloadAlarmDuration++; - } - } - } else - pQloadCtrl->QloadAlarmBusyNum = 0; - - if (pQloadCtrl->QloadAlarmDuration > 0) { - /* - New alarm occurs so we can not re-issue new alarm during - QBSS_LOAD_ALARM_DURATION * TBTT. - */ - if (++pQloadCtrl->QloadAlarmDuration >= - QBSS_LOAD_ALARM_DURATION) { - /* can re-issue next alarm */ - pQloadCtrl->QloadAlarmDuration = 0; - pQloadCtrl->QloadAlarmBusyNum = 0; - } - } - - if (FlgIsAlarmNeeded == TRUE) - QBSS_LoadAlarm(pAd); - } else { - /* clear statistics counts */ - pQloadCtrl->QloadAlarmBusyNum = 0; - pQloadCtrl->QloadAlarmDuration = 0; - pQloadCtrl->FlgQloadAlarm = FALSE; - } - -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - } -} - -/* -======================================================================== -Routine Description: - Clear QoS Load information. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID QBSS_LoadStatusClear(IN RTMP_ADAPTER *pAd, IN UCHAR Channel) -{ - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - if (pAd->CommonCfg.dbdc_mode == 0) - pQloadCtrl = HcGetQloadCtrl(pAd); - else - pQloadCtrl = (Channel > 14) ? - HcGetQloadCtrlByRf(pAd, RFIC_5GHZ) : - HcGetQloadCtrlByRf(pAd, RFIC_24GHZ); - - if (pQloadCtrl) { -#ifdef QLOAD_FUNC_BUSY_TIME_STATS - /* clear busy time statistics */ - NdisZeroMemory(pQloadCtrl->QloadBusyCountPri, - sizeof(pQloadCtrl->QloadBusyCountPri)); - NdisZeroMemory(pQloadCtrl->QloadBusyCountSec, - sizeof(pQloadCtrl->QloadBusyCountSec)); -#endif /* QLOAD_FUNC_BUSY_TIME_STATS */ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - /* clear alarm function variables */ - pQloadCtrl->QloadChanUtilTotal = 0; - pQloadCtrl->QloadChanUtilTotalCcaNavTx = 0; - pQloadCtrl->FlgQloadAlarm = FALSE; - pQloadCtrl->QloadAlarmBusyNum = 0; -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - } -} - -/* -======================================================================== -Routine Description: - Show QoS Load information. - -Arguments: - pAd - WLAN control block pointer - Arg - Input arguments - -Return Value: - None - -Note: -======================================================================== -*/ -INT Show_QoSLoad_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#ifdef QLOAD_FUNC_BUSY_TIME_STATS - UINT32 BusyTimeId; - UINT32 Time; - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - Time = pAd->CommonCfg.BeaconPeriod / QLOAD_BUSY_INTERVALS; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n\tPrimary Busy Time\tTimes\n")); - - for (BusyTimeId = 0; BusyTimeId < QLOAD_BUSY_INTERVALS; BusyTimeId++) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t%dms ~ %dms\t\t%d\n", BusyTimeId * Time, - (BusyTimeId + 1) * Time, - pQloadCtrl->QloadBusyCountPri[BusyTimeId])); - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n\tSecondary Busy Time\tTimes\n")); - - for (BusyTimeId = 0; BusyTimeId < QLOAD_BUSY_INTERVALS; BusyTimeId++) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t%dms ~ %dms\t\t%d\n", BusyTimeId * Time, - (BusyTimeId + 1) * Time, - pQloadCtrl->QloadBusyCountSec[BusyTimeId])); - } - -#else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBusy time statistics is not included into the driver!\n")); -#endif /* QLOAD_FUNC_BUSY_TIME_STATS */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); - return TRUE; -} - -/* -======================================================================== -Routine Description: - Command for QoS Load information clear. - -Arguments: - pAd - WLAN control block pointer - Arg - Input arguments - -Return Value: - None - -Note: -======================================================================== -*/ -INT Set_QloadClr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - QBSS_LoadStatusClear(pAd, 1); - QBSS_LoadStatusClear(pAd, 36); - return TRUE; -} - -/* -======================================================================== -Routine Description: - Command for QoS Alarm Time Threshold set. - -Arguments: - pAd - WLAN control block pointer - Arg - Input arguments - -Return Value: - None - -Note: -======================================================================== -*/ -INT Set_QloadAlarmTimeThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - pQloadCtrl->QloadAlarmBusyTimeThreshold = (UCHAR)os_str_tol(Arg, 0, 10); - QBSS_LoadAlarmReset(pAd); - pQloadCtrl->QloadTimePeriodLast = pAd->CommonCfg.BeaconPeriod; -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - return TRUE; -} - -/* -======================================================================== -Routine Description: - Command for QoS Alarm Number Threshold set. - -Arguments: - pAd - WLAN control block pointer - Arg - Input arguments - -Return Value: - None - -Note: -======================================================================== -*/ -INT Set_QloadAlarmNumThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg) -{ -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); - - pQloadCtrl->QloadAlarmBusyNumThreshold = (UCHAR)os_str_tol(Arg, 0, 10); -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ - return TRUE; -} - -#endif /* AP_QLOAD_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_repeater.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_repeater.c deleted file mode 100644 index 7d8b440e5f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_repeater.c +++ /dev/null @@ -1,1670 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2012, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_repeater.c - - Abstract: - Support MAC Repeater function. - - Revision History: - Who When What - -------------- ---------- ---------------------------------------------- - Arvin 11-16-2012 created -*/ - -#ifdef MAC_REPEATER_SUPPORT - -#include "rt_config.h" - -#define OUI_LEN 3 -UCHAR VENDOR_DEFINED_OUI_ADDR[][OUI_LEN] = -#ifdef VENDOR_FEATURE5_SUPPORT - { { 0x02, 0x0F, 0xB5 }, { 0x02, 0x09, 0x5B }, { 0x02, 0x14, 0x6C }, - { 0x02, 0x18, 0x4D }, { 0x02, 0x1B, 0x2F }, { 0x02, 0x1E, 0x2A } }; -#else - { { 0x02, 0x0C, 0x43 }, { 0x02, 0x0C, 0xE7 }, { 0x02, 0x0A, 0x00 } }; -#endif -static UCHAR rept_vendor_def_oui_table_size = - (sizeof(VENDOR_DEFINED_OUI_ADDR) / sizeof(UCHAR[OUI_LEN])); - -/* IOCTL */ -INT Show_ReptTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - int CliIdx; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - RETURN_ZERO_IF_PAD_NULL(pAd); - - if (!pAd->ApCfg.bMACRepeaterEn) - return TRUE; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("---------------------------------\n")); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("--------pRepeaterCliPool --------\n")); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("---------------------------------\n")); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("\n%-3s%-4s%-5s%-4s%-4s%-5s%-6s%-5s%-5s%-5s%-5s%-5s%-19s%-19s%-19s%-19s\n", - "AP", "CLI", "WCID", "En", "Vld", "bEth", "Block", "Conn", - "CTRL", "SYNC", "AUTH", "ASSO", "REAL_MAC", "FAKE_MAC", - "MUAR_MAC", "MUAR_ROOT")); - - for (CliIdx = 0; CliIdx < GET_MAX_REPEATER_ENTRY_NUM(cap); CliIdx++) { - PREPEATER_CLIENT_ENTRY pReptCliEntry; - - pReptCliEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-3d", pReptCliEntry->MatchApCliIdx)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-4d", pReptCliEntry->MatchLinkIdx)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-5d", pReptCliEntry->MacTabWCID)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-4d", pReptCliEntry->CliEnable)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-4d", pReptCliEntry->CliValid)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-5d", pReptCliEntry->bEthCli)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-6d", pReptCliEntry->bBlockAssoc)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-5d", pReptCliEntry->CliConnectState)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-5lu", pReptCliEntry->CtrlCurrState)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-5lu", pReptCliEntry->SyncCurrState)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-5lu", pReptCliEntry->AuthCurrState)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-5lu", pReptCliEntry->AssocCurrState)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%02X:%02X:%02X:%02X:%02X:%02X ", - pReptCliEntry->OriginalAddress[0], - pReptCliEntry->OriginalAddress[1], - pReptCliEntry->OriginalAddress[2], - pReptCliEntry->OriginalAddress[3], - pReptCliEntry->OriginalAddress[4], - pReptCliEntry->OriginalAddress[5])); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%02X:%02X:%02X:%02X:%02X:%02X ", - pReptCliEntry->CurrentAddress[0], - pReptCliEntry->CurrentAddress[1], - pReptCliEntry->CurrentAddress[2], - pReptCliEntry->CurrentAddress[3], - pReptCliEntry->CurrentAddress[4], - pReptCliEntry->CurrentAddress[5])); - /* read muar cr MAR0,MAR1 */ - { - /* UINT32 mar_val; */ - RMAC_MAR0_STRUC mar0_val; - RMAC_MAR1_STRUC mar1_val; - - memset(&mar0_val, 0x0, sizeof(mar0_val)); - memset(&mar1_val, 0x0, sizeof(mar1_val)); - mar1_val.field.access_start = 1; - mar1_val.field.multicast_addr_index = - pReptCliEntry->MatchLinkIdx * 2; - /* Issue a read command */ - HW_IO_WRITE32(pAd, RMAC_MAR1, (UINT32)mar1_val.word); - - /* wait acess complete*/ - do { - HW_IO_READ32(pAd, RMAC_MAR1, - (UINT32 *)&mar1_val); - /* delay */ - } while (mar1_val.field.access_start == 1); - - HW_IO_READ32(pAd, RMAC_MAR0, (UINT32 *)&mar0_val); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x ", - (UINT8)(mar0_val.addr_31_0 & 0x000000ff), - (UINT8)((mar0_val.addr_31_0 & 0x0000ff00) >> - 8), - (UINT8)((mar0_val.addr_31_0 & 0x00ff0000) >> - 16), - (UINT8)((mar0_val.addr_31_0 & 0xff000000) >> - 24), - (UINT8)mar1_val.field.addr_39_32, - (UINT8)mar1_val.field.addr_47_40)); - memset(&mar0_val, 0x0, sizeof(mar0_val)); - memset(&mar1_val, 0x0, sizeof(mar1_val)); - mar1_val.field.access_start = 1; - mar1_val.field.multicast_addr_index = - pReptCliEntry->MatchLinkIdx * 2 + 1; - /* Issue a read command */ - HW_IO_WRITE32(pAd, RMAC_MAR1, (UINT32)mar1_val.word); - - /* wait acess complete*/ - do { - HW_IO_READ32(pAd, RMAC_MAR1, - (UINT32 *)&mar1_val); - /* delay */ - } while (mar1_val.field.access_start == 1); - - HW_IO_READ32(pAd, RMAC_MAR0, (UINT32 *)&mar0_val); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%02x:%02x:%02x:%02x:%02x:%02x\n", - (UINT8)(mar0_val.addr_31_0 & 0x000000ff), - (UINT8)((mar0_val.addr_31_0 & 0x0000ff00) >> - 8), - (UINT8)((mar0_val.addr_31_0 & 0x00ff0000) >> - 16), - (UINT8)((mar0_val.addr_31_0 & 0xff000000) >> - 24), - (UINT8)mar1_val.field.addr_39_32, - (UINT8)mar1_val.field.addr_47_40)); - } - } - - return TRUE; -} - -/* End of IOCTL */ - -VOID ApCliAuthTimeoutExt(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - PREPEATER_CLIENT_ENTRY pRepeaterCliEntry = - (PREPEATER_CLIENT_ENTRY)FunctionContext; - PRTMP_ADAPTER pAd; - USHORT ifIndex = 0; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("Repeater Cli AUTH - AuthTimeout\n")); - pAd = pRepeaterCliEntry->pAd; - ifIndex = pRepeaterCliEntry->MatchLinkIdx + REPT_MLME_START_IDX; - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("(%s) ifIndex = %d, CliIdx = %d !!!\n", __func__, - pRepeaterCliEntry->MatchApCliIdx, - pRepeaterCliEntry->MatchLinkIdx)); - MlmeEnqueue(pAd, APCLI_AUTH_STATE_MACHINE, APCLI_MT2_AUTH_TIMEOUT, 0, - NULL, ifIndex); - RTMP_MLME_HANDLER(pAd); -} - -DECLARE_TIMER_FUNCTION(ApCliAuthTimeoutExt); -BUILD_TIMER_FUNCTION(ApCliAuthTimeoutExt); - -/* - ========================================================================== - Description: - Association timeout procedure. After association timeout, this function - will be called and it will put a message into the MLME queue - Parameters: - Standard timer parameters - ========================================================================== - */ -VOID ApCliAssocTimeoutExt(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - PREPEATER_CLIENT_ENTRY pRepeaterCliEntry = - (PREPEATER_CLIENT_ENTRY)FunctionContext; - PRTMP_ADAPTER pAd; - struct wifi_dev *wdev; - USHORT ifIndex = 0; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("Repeater Cli ASSOC - enqueue APCLI_MT2_ASSOC_TIMEOUT\n")); - pAd = pRepeaterCliEntry->pAd; - wdev = pRepeaterCliEntry->wdev; - ifIndex = pRepeaterCliEntry->MatchLinkIdx + REPT_MLME_START_IDX; - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - (" (%s) ifIndex = %d, CliIdx = %d !!!\n", __func__, - pRepeaterCliEntry->MatchApCliIdx, - pRepeaterCliEntry->MatchLinkIdx)); - MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_ASSOC_TIMEOUT, 0, - NULL, ifIndex); - RTMP_MLME_HANDLER(pAd); -} - -DECLARE_TIMER_FUNCTION(ApCliAssocTimeoutExt); -BUILD_TIMER_FUNCTION(ApCliAssocTimeoutExt); - -static VOID ReptCompleteInit(REPEATER_CLIENT_ENTRY *pReptEntry) -{ - RTMP_OS_INIT_COMPLETION(&pReptEntry->free_ack); -} - -static VOID ReptLinkDownComplete(REPEATER_CLIENT_ENTRY *pReptEntry) -{ - RTMP_OS_COMPLETE(&pReptEntry->free_ack); -} - -VOID ReptWaitLinkDown(REPEATER_CLIENT_ENTRY *pReptEntry) -{ - if (pReptEntry->CliEnable && - !RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&pReptEntry->free_ack, - REPT_WAIT_TIMEOUT)) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("(%s) ApCli Rept[%d] can't done.\n", __func__, - pReptEntry->MatchLinkIdx)); - } -} - -VOID CliLinkMapInit(RTMP_ADAPTER *pAd) -{ - UCHAR MbssIdx; - MBSS_TO_CLI_LINK_MAP_T *pMbssToCliLinkMap; - struct wifi_dev *cli_link_wdev = - &pAd->ApCfg.ApCliTab[0].wdev; /* default bind to apcli0 */ - struct wifi_dev *mbss_link_wdev; - int apcli_idx; - - NdisAcquireSpinLock(&pAd->ApCfg.CliLinkMapLock); - - for (MbssIdx = 0; MbssIdx < HW_BEACON_MAX_NUM; MbssIdx++) { - mbss_link_wdev = &pAd->ApCfg.MBSSID[MbssIdx].wdev; - pMbssToCliLinkMap = &pAd->ApCfg.MbssToCliLinkMap[MbssIdx]; - - if (pAd->CommonCfg.dbdc_mode == TRUE) { - for (apcli_idx = 0; apcli_idx < pAd->ApCfg.ApCliNum; - apcli_idx++) { - cli_link_wdev = - &pAd->ApCfg.ApCliTab[apcli_idx].wdev; - - if (mbss_link_wdev->channel <= 14) { /* 2.4G */ - if (cli_link_wdev->channel <= - 14) { /* 2.4G */ - pMbssToCliLinkMap->mbss_wdev = - mbss_link_wdev; - pMbssToCliLinkMap - ->cli_link_wdev = - cli_link_wdev; - } - } else { /* 5G */ - if (cli_link_wdev->channel > 14) { - /*5G + 5G dbdc support changes*/ - if (cli_link_wdev->channel == - mbss_link_wdev->channel) { - pMbssToCliLinkMap - ->mbss_wdev = - mbss_link_wdev; - pMbssToCliLinkMap - ->cli_link_wdev = - cli_link_wdev; - } - } - } - } - } else { - pMbssToCliLinkMap->mbss_wdev = mbss_link_wdev; - pMbssToCliLinkMap->cli_link_wdev = cli_link_wdev; - } - } - - NdisReleaseSpinLock(&pAd->ApCfg.CliLinkMapLock); -} - -VOID RepeaterCtrlInit(RTMP_ADAPTER *pAd) -{ - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR MaxNumChipRept = GET_MAX_REPEATER_ENTRY_NUM(pChipCap); - UINT32 Ret = FALSE; - UCHAR i; - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - UINT32 PoolMemSize; - - NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); - - if (pAd->ApCfg.bMACRepeaterEn == TRUE) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_WARN, - ("%s, wrong State\n", __func__)); - return; - } - - PoolMemSize = sizeof(REPEATER_CLIENT_ENTRY) * MaxNumChipRept; - Ret = os_alloc_mem(NULL, (UCHAR **)&pAd->ApCfg.pRepeaterCliPool, - PoolMemSize); - - if (Ret != NDIS_STATUS_SUCCESS) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - (" Alloc memory for pRepeaterCliPool failed.\n")); - return; - } - - os_zero_mem(pAd->ApCfg.pRepeaterCliPool, PoolMemSize); - PoolMemSize = sizeof(REPEATER_CLIENT_ENTRY_MAP) * MaxNumChipRept; - Ret = os_alloc_mem(NULL, (UCHAR **)&pAd->ApCfg.pRepeaterCliMapPool, - PoolMemSize); - - if (Ret != NDIS_STATUS_SUCCESS) { - if (pAd->ApCfg.pRepeaterCliPool) - os_free_mem(pAd->ApCfg.pRepeaterCliPool); - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - (" Alloc memory for pRepeaterCliMapPool failed.\n")); - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - return; - } - - os_zero_mem(pAd->ApCfg.pRepeaterCliMapPool, PoolMemSize); - - /*initialize RepeaterEntryPool*/ - for (i = 0; i < MaxNumChipRept; i++) { - pReptEntry = &pAd->ApCfg.pRepeaterCliPool[i]; - pReptEntry->CliConnectState = REPT_ENTRY_DISCONNT; - pReptEntry->CliEnable = FALSE; - pReptEntry->CliValid = FALSE; - pReptEntry->bEthCli = FALSE; - pReptEntry->pAd = pAd; - pReptEntry->MatchApCliIdx = 0; - pReptEntry->MatchLinkIdx = i; - pReptEntry->AuthCurrState = APCLI_CTRL_DISCONNECTED; - pReptEntry->AssocCurrState = APCLI_ASSOC_IDLE; - pReptEntry->bss_info_argument.ucBssIndex = 0xff; - pReptEntry->AuthCurrState = APCLI_AUTH_REQ_IDLE; - ReptCompleteInit(pReptEntry); - /* RTMPInitTimer(pAd, */ - /* &pReptEntry->ApCliAssocTimer, */ - /* GET_TIMER_FUNCTION(ApCliAssocTimeoutExt), */ - /* pReptEntry, FALSE); */ - /* */ - /* RTMPInitTimer(pAd, &pReptEntry->ApCliAuthTimer, */ - /* GET_TIMER_FUNCTION(ApCliAuthTimeoutExt), pReptEntry, FALSE); */ - } - - pAd->ApCfg.RepeaterCliSize = 0; - os_zero_mem(&pAd->ApCfg.ReptControl, sizeof(REPEATER_CTRL_STRUCT)); - pAd->ApCfg.bMACRepeaterEn = TRUE; - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); -} - -VOID RepeaterCtrlExit(RTMP_ADAPTER *pAd) -{ - /* TODO: check whole repeater control release. */ - int wait_cnt = 0; - /* - Add MacRepeater Entry De-Init Here, and let "iwpriv ra0 set MACRepeaterEn=0" - can do this instead of "iwpriv apcli0 set ApCliEnable=0" - */ - UCHAR CliIdx; - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (pAd->ApCfg.bMACRepeaterEn) { - for (CliIdx = 0; CliIdx < GET_MAX_REPEATER_ENTRY_NUM(cap); - CliIdx++) { - pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - - /*disconnect the ReptEntry which is bind on the CliLink*/ - if (pReptEntry->CliEnable) { - RTMP_OS_INIT_COMPLETION(&pReptEntry->free_ack); - pReptEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_APCLI_IF_DOWN; - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, NULL, - (REPT_MLME_START_IDX + CliIdx)); - RTMP_MLME_HANDLER(pAd); - ReptWaitLinkDown(pReptEntry); - } - } - } - - while (pAd->ApCfg.RepeaterCliSize > 0) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_OFF, - ("%s, wait entry to be deleted\n", __func__)); - OS_WAIT(10); - wait_cnt++; - - if (wait_cnt > 1000) - break; - } - - NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); - - if (pAd->ApCfg.bMACRepeaterEn == FALSE) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_WARN, - ("%s, wrong State\n", __func__)); - return; - } - - pAd->ApCfg.bMACRepeaterEn = FALSE; - - if (pAd->ApCfg.pRepeaterCliMapPool != NULL) { - os_free_mem(pAd->ApCfg.pRepeaterCliMapPool); - pAd->ApCfg.pRepeaterCliMapPool = NULL; - } - - if (pAd->ApCfg.pRepeaterCliPool != NULL) { - os_free_mem(pAd->ApCfg.pRepeaterCliPool); - pAd->ApCfg.pRepeaterCliPool = NULL; - } - - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); -} - -REPEATER_CLIENT_ENTRY *RTMPLookupRepeaterCliEntry(IN PVOID pData, - IN BOOLEAN bRealMAC, - IN PUCHAR pAddr, - IN BOOLEAN bIsPad) -{ - ULONG HashIdx; - UCHAR tempMAC[6]; - REPEATER_CLIENT_ENTRY *pEntry = NULL; - REPEATER_CLIENT_ENTRY_MAP *pMapEntry = NULL; - - COPY_MAC_ADDR(tempMAC, pAddr); - HashIdx = MAC_ADDR_HASH_INDEX(tempMAC); - - /* NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); */ - if (bIsPad == TRUE) - NdisAcquireSpinLock( - &((PRTMP_ADAPTER)pData)->ApCfg.ReptCliEntryLock); - else - NdisAcquireSpinLock( - ((REPEATER_ADAPTER_DATA_TABLE *)pData)->EntryLock); - - if (bRealMAC == TRUE) { - if (bIsPad == TRUE) - pMapEntry = ((PRTMP_ADAPTER)pData) - ->ApCfg.ReptMapHash[HashIdx]; - else - pMapEntry = (REPEATER_CLIENT_ENTRY_MAP *)(*( - (((REPEATER_ADAPTER_DATA_TABLE *)pData) - ->MapHash) + - HashIdx)); - - while (pMapEntry) { - pEntry = pMapEntry->pReptCliEntry; - - if (pEntry) { - if (pEntry->CliEnable && - MAC_ADDR_EQUAL(pEntry->OriginalAddress, - tempMAC)) - break; - pEntry = NULL; - pMapEntry = pMapEntry->pNext; - } else - pMapEntry = pMapEntry->pNext; - } - } else { - if (bIsPad == TRUE) - pEntry = ((PRTMP_ADAPTER)pData) - ->ApCfg.ReptCliHash[HashIdx]; - else - pEntry = (REPEATER_CLIENT_ENTRY *)(*( - (((REPEATER_ADAPTER_DATA_TABLE *)pData) - ->CliHash) + - HashIdx)); - - while (pEntry) { - if (pEntry->CliEnable && - MAC_ADDR_EQUAL(pEntry->CurrentAddress, tempMAC)) - break; - pEntry = pEntry->pNext; - } - } - - /* NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); */ - if (bIsPad == TRUE) - NdisReleaseSpinLock( - &((PRTMP_ADAPTER)pData)->ApCfg.ReptCliEntryLock); - else - NdisReleaseSpinLock( - ((REPEATER_ADAPTER_DATA_TABLE *)pData)->EntryLock); - - return pEntry; -} - -BOOLEAN RTMPQueryLookupRepeaterCliEntryMT(IN PVOID pData, IN PUCHAR pAddr, - IN BOOLEAN bIsPad) -{ - REPEATER_CLIENT_ENTRY *pEntry = NULL; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_INFO, - ("%s:: %02x:%02x:%02x:%02x:%02x:%02x\n", __func__, pAddr[0], - pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5])); - pEntry = RTMPLookupRepeaterCliEntry(pData, FALSE, pAddr, bIsPad); - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_INFO, - ("%s:: not the repeater client\n", __func__)); - return FALSE; - } - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_INFO, - ("%s:: is the repeater client\n", __func__)); - return TRUE; -} - -REPEATER_CLIENT_ENTRY *lookup_rept_entry(RTMP_ADAPTER *pAd, PUCHAR address) -{ - REPEATER_CLIENT_ENTRY *rept_entry = NULL; - - rept_entry = RTMPLookupRepeaterCliEntry(pAd, FALSE, address, TRUE); - - if (!rept_entry) - rept_entry = - RTMPLookupRepeaterCliEntry(pAd, TRUE, address, TRUE); - - if (rept_entry) - return rept_entry; - - return NULL; -} - -UINT32 ReptTxPktCheckHandler(RTMP_ADAPTER *pAd, - IN struct wifi_dev *cli_link_wdev, - IN PNDIS_PACKET pPacket, OUT UCHAR *pWcid) -{ - PUCHAR pSrcBufVA = NULL; - PACKET_INFO PacketInfo; - UINT SrcBufLen; - STA_TR_ENTRY *tr_entry; - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - APCLI_STRUCT *pApCliEntry = cli_link_wdev->func_dev; - MAC_TABLE_ENTRY *pMacEntry = NULL; - struct wifi_dev *mbss_wdev = NULL; - MBSS_TO_CLI_LINK_MAP_T *pMbssToCliLinkMap = NULL; - UINT16 eth_type; -#ifdef WSC_AP_SUPPORT - PWSC_CTRL wsc_control = NULL; - - wsc_control = &cli_link_wdev->WscControl; -#endif /* WSC_AP_SUPPORT */ - - RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); - - eth_type = (pSrcBufVA[12] << 8) | pSrcBufVA[13]; - -#ifdef VLAN_SUPPORT - if ((pAd->CommonCfg.bEnableVlan) && (eth_type == ETH_TYPE_VLAN)) - eth_type = (pSrcBufVA[16] << 8) | pSrcBufVA[17]; -#endif - - pReptEntry = RTMPLookupRepeaterCliEntry( - pAd, TRUE, (pSrcBufVA + MAC_ADDR_LEN), TRUE); - - if (pReptEntry && pReptEntry->CliValid) { -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if ((pReptEntry->MatchApCliIdx != pApCliEntry->ifIndex) && - (wf_drv_tbl.wf_fwd_check_active_hook && - wf_drv_tbl.wf_fwd_check_active_hook())) { - UCHAR apCliIdx, CliIdx; - - apCliIdx = pReptEntry->MatchApCliIdx; - CliIdx = pReptEntry->MatchLinkIdx; - pReptEntry->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_CHANGE_APCLI_IF; - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, 0, NULL, - (REPT_MLME_START_IDX + CliIdx)); - RTMP_MLME_HANDLER(pAd); - return INSERT_REPT_ENTRY; - } - -#endif /* CONFIG_WIFI_PKT_FWD */ - *pWcid = pReptEntry->MacTabWCID; - return REPEATER_ENTRY_EXIST; - } - /* check SA valid. */ - if (RTMPRepeaterVaildMacEntry(pAd, pSrcBufVA + MAC_ADDR_LEN)) { - tr_entry = &pAd->MacTab.tr_entry[pApCliEntry->MacTabWCID]; - - if ((tr_entry) && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) { - pMacEntry = - MacTableLookup(pAd, (pSrcBufVA + MAC_ADDR_LEN)); - - if (eth_type == ETH_TYPE_EAPOL) - return INSERT_REPT_ENTRY_AND_ALLOW; - - if (pMacEntry && IS_ENTRY_CLIENT(pMacEntry)) { - STA_TR_ENTRY *sta_tr_entry; - - sta_tr_entry = - &pAd->MacTab.tr_entry[pMacEntry->wcid]; - - if ((sta_tr_entry) && - (sta_tr_entry->PortSecured != - WPA_802_1X_PORT_SECURED)) { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - (" wireless client is not ready !!!\n")); - return INSERT_REPT_ENTRY; - } - - mbss_wdev = pMacEntry->wdev; - pMbssToCliLinkMap = - &pAd->ApCfg.MbssToCliLinkMap - [mbss_wdev->func_idx]; - - if ( -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - (wf_drv_tbl.wf_fwd_check_active_hook && - wf_drv_tbl.wf_fwd_check_active_hook()) || -#endif /* CONFIG_WIFI_PKT_FWD */ - (pMbssToCliLinkMap->cli_link_wdev == - cli_link_wdev)) { -#ifdef WSC_AP_SUPPORT - if (!((wsc_control->WscConfMode != - WSC_DISABLE) && - (wsc_control->bWscTrigger == - TRUE))) { -#endif /* WSC_AP_SUPPORT */ - HW_ADD_REPT_ENTRY( - pAd, cli_link_wdev, - (pSrcBufVA + - MAC_ADDR_LEN)); - MTWF_LOG( - DBG_CAT_CLIENT, - CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("pMacEntry connect to mbss idx:%d, use CliLink:%d to RootAP\n", - mbss_wdev->func_idx, - cli_link_wdev - ->func_idx)); - return INSERT_REPT_ENTRY; -#ifdef WSC_AP_SUPPORT - } else { - MTWF_LOG( - DBG_CAT_CLIENT, - CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("%s() WPS is triggered now, don't add entry\n", - __func__)); - } -#endif /* WSC_AP_SUPPORT */ - } - } else - /*SA is not in mac table, pkt should from upper layer or eth.*/ - { - /* -TODO: Carter, if more than one apcli/sta, -the eth pkt or upper layer pkt connecting rule should be refined. -*/ -#ifdef WSC_AP_SUPPORT - if (!((wsc_control->WscConfMode != - WSC_DISABLE) && - (wsc_control->bWscTrigger == TRUE))) { -#endif /* WSC_AP_SUPPORT */ - HW_ADD_REPT_ENTRY( - pAd, cli_link_wdev, - (pSrcBufVA + MAC_ADDR_LEN)); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("pAddr %x %x %x %x %x %x: use CliLink:%d to RootAP\n", - PRINT_MAC((pSrcBufVA + - MAC_ADDR_LEN)), - cli_link_wdev->func_idx)); - - return INSERT_REPT_ENTRY; -#ifdef WSC_AP_SUPPORT - } else { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("%s() WPS is triggered now, don't add entry\n", - __func__)); - } -#endif /* WSC_AP_SUPPORT */ - } - } - } - - return USE_CLI_LINK_INFO; -} - -REPEATER_CLIENT_ENTRY *RTMPLookupRepeaterCliEntry_NoLock(IN PVOID pData, - IN BOOLEAN bRealMAC, - IN PUCHAR pAddr, - IN BOOLEAN bIsPad) -{ - ULONG HashIdx; - UCHAR tempMAC[6]; - REPEATER_CLIENT_ENTRY *pEntry = NULL; - REPEATER_CLIENT_ENTRY_MAP *pMapEntry = NULL; - - COPY_MAC_ADDR(tempMAC, pAddr); - HashIdx = MAC_ADDR_HASH_INDEX(tempMAC); - - /* NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); */ - - if (bRealMAC == TRUE) { - if (bIsPad == TRUE) - pMapEntry = ((PRTMP_ADAPTER)pData) - ->ApCfg.ReptMapHash[HashIdx]; - else - pMapEntry = *((((REPEATER_ADAPTER_DATA_TABLE *)pData) - ->MapHash) + - HashIdx); - - while (pMapEntry) { - pEntry = pMapEntry->pReptCliEntry; - - if (pEntry) { - if (pEntry->CliEnable && - MAC_ADDR_EQUAL(pEntry->OriginalAddress, - tempMAC)) - break; - pEntry = NULL; - pMapEntry = pMapEntry->pNext; - } else - pMapEntry = pMapEntry->pNext; - } - } else { - if (bIsPad == TRUE) - pEntry = ((PRTMP_ADAPTER)pData) - ->ApCfg.ReptCliHash[HashIdx]; - else - pEntry = *((((REPEATER_ADAPTER_DATA_TABLE *)pData) - ->CliHash) + - HashIdx); - - while (pEntry) { - if (pEntry->CliEnable && - MAC_ADDR_EQUAL(pEntry->CurrentAddress, tempMAC)) - break; - pEntry = pEntry->pNext; - } - } - - return pEntry; -} - -VOID RTMPInsertRepeaterEntry(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - PUCHAR pAddr) -{ - INT CliIdx, idx; - UCHAR HashIdx; - /* BOOLEAN Cancelled; */ - UCHAR tempMAC[MAC_ADDR_LEN]; - APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; - PREPEATER_CLIENT_ENTRY pReptCliEntry = NULL, pCurrEntry = NULL; - INT pValid_ReptCliIdx; - PREPEATER_CLIENT_ENTRY_MAP pReptCliMap; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%s.\n", __func__)); - NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); - - if (pAd->ApCfg.RepeaterCliSize >= GET_MAX_REPEATER_ENTRY_NUM(cap)) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - (" Repeater Client Full !!!\n")); - return; - } - - pValid_ReptCliIdx = GET_MAX_REPEATER_ENTRY_NUM(cap); - - for (CliIdx = 0; CliIdx < GET_MAX_REPEATER_ENTRY_NUM(cap); CliIdx++) { - pReptCliEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - - if ((pReptCliEntry->CliEnable) && - (MAC_ADDR_EQUAL(pReptCliEntry->OriginalAddress, pAddr) || - (pAd->ApCfg.MACRepeaterOuiMode != - VENDOR_DEFINED_MAC_ADDR_OUI && - MAC_ADDR_EQUAL(pReptCliEntry->CurrentAddress, pAddr)))) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_INFO, - ("\n receive mac :%02x:%02x:%02x:%02x:%02x:%02x !!!\n", - PRINT_MAC(pAddr))); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_INFO, - (" duplicate Insert !!!\n")); - return; - } - - if ((pReptCliEntry->CliEnable == FALSE) && - (pValid_ReptCliIdx == GET_MAX_REPEATER_ENTRY_NUM(cap))) - pValid_ReptCliIdx = CliIdx; - } - - CliIdx = pValid_ReptCliIdx; - - if (CliIdx >= GET_MAX_REPEATER_ENTRY_NUM(cap)) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("Repeater Pool Full !!!\n")); - return; - } - - pReptCliEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - pReptCliMap = &pAd->ApCfg.pRepeaterCliMapPool[CliIdx]; - /* ENTRY PREEMPTION: initialize the entry */ - /* timer init */ - RTMPInitTimer(pAd, &pReptCliEntry->ApCliAssocTimer, - GET_TIMER_FUNCTION(ApCliAssocTimeoutExt), pReptCliEntry, - FALSE); - /* timer init */ - RTMPInitTimer(pAd, &pReptCliEntry->ApCliAuthTimer, - GET_TIMER_FUNCTION(ApCliAuthTimeoutExt), pReptCliEntry, - FALSE); - pReptCliEntry->CtrlCurrState = APCLI_CTRL_DISCONNECTED; - pReptCliEntry->AuthCurrState = APCLI_AUTH_REQ_IDLE; - pReptCliEntry->AssocCurrState = APCLI_ASSOC_IDLE; - pReptCliEntry->CliConnectState = REPT_ENTRY_DISCONNT; - pReptCliEntry->LinkDownReason = APCLI_LINKDOWN_NONE; - pReptCliEntry->Disconnect_Sub_Reason = APCLI_DISCONNECT_SUB_REASON_NONE; - pReptCliEntry->CliValid = FALSE; - pReptCliEntry->bEthCli = FALSE; - pReptCliEntry->MacTabWCID = 0xFF; -#ifdef FAST_EAPOL_WAR - - if (pReptCliEntry->pre_entry_alloc == TRUE) - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Unexpected condition,check it (pReptCliEntry->pre_entry_alloc=%d)\n", - __func__, pReptCliEntry->pre_entry_alloc)); - - pReptCliEntry->pre_entry_alloc = FALSE; -#endif /* FAST_EAPOL_WAR */ - pReptCliEntry->AuthReqCnt = 0; - pReptCliEntry->AssocReqCnt = 0; - pReptCliEntry->CliTriggerTime = 0; - pReptCliEntry->pNext = NULL; - pReptCliEntry->wdev = wdev; - pReptCliEntry->MatchApCliIdx = wdev->func_idx; - pReptCliEntry->BandIdx = HcGetBandByWdev(wdev); - pReptCliMap->pReptCliEntry = pReptCliEntry; -#ifdef APCLI_SAE_SUPPORT - pReptCliEntry->sae_cfg_group = - pAd->ApCfg.ApCliTab[pReptCliEntry->MatchApCliIdx].sae_cfg_group; -#endif - -#ifdef APCLI_OWE_SUPPORT - pReptCliEntry->curr_owe_group = - pAd->ApCfg.ApCliTab[pReptCliEntry->MatchApCliIdx].curr_owe_group; -#endif - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - NdisAllocateSpinLock(pAd, &pReptCliEntry->SavedPMK_lock); -#endif - - pReptCliMap->pNext = NULL; - COPY_MAC_ADDR(pReptCliEntry->OriginalAddress, pAddr); - COPY_MAC_ADDR(tempMAC, pAddr); - - if (pAd->ApCfg.MACRepeaterOuiMode == CASUALLY_DEFINE_MAC_ADDR) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("todo !!!\n")); - } else if (pAd->ApCfg.MACRepeaterOuiMode == - VENDOR_DEFINED_MAC_ADDR_OUI) { - INT IdxToUse = 0, i; - UCHAR checkMAC[MAC_ADDR_LEN]; - UCHAR flag = 0; - - COPY_MAC_ADDR(checkMAC, pAddr); - - for (idx = 0; idx < rept_vendor_def_oui_table_size; idx++) { - if (RTMPEqualMemory(VENDOR_DEFINED_OUI_ADDR[idx], pAddr, - OUI_LEN)) { - if (idx < rept_vendor_def_oui_table_size - 1) { - NdisCopyMemory( - checkMAC, - VENDOR_DEFINED_OUI_ADDR[idx + 1], - OUI_LEN); - for (i = 0; i < pAd->ApCfg.BssidNum; - i++) { - if (MAC_ADDR_EQUAL( - pAd->ApCfg.MBSSID[i] - .wdev - .if_addr, - checkMAC)) { - flag = 1; - break; - } - } - if (i >= pAd->ApCfg.BssidNum) { - IdxToUse = idx + 1; - break; - } - } - } else if (flag == 1) { - NdisCopyMemory(checkMAC, - VENDOR_DEFINED_OUI_ADDR[idx], - OUI_LEN); - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - if (MAC_ADDR_EQUAL(pAd->ApCfg.MBSSID[i] - .wdev.if_addr, - checkMAC)) - break; - } - if (i >= pAd->ApCfg.BssidNum) { - IdxToUse = idx; - break; - } - } - } - NdisCopyMemory(tempMAC, VENDOR_DEFINED_OUI_ADDR[IdxToUse], - OUI_LEN); - } else - NdisCopyMemory(tempMAC, wdev->if_addr, OUI_LEN); - - if (RTMPLookupRepeaterCliEntry_NoLock(pAd, FALSE, tempMAC, TRUE) != - NULL) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("ReptCLI duplicate Insert %02x:%02x:%02x:%02x:%02x:%02x !\n", - PRINT_MAC(tempMAC))); - return; - } - - COPY_MAC_ADDR(pReptCliEntry->CurrentAddress, tempMAC); - pReptCliEntry->CliEnable = TRUE; - pReptCliEntry->CliConnectState = REPT_ENTRY_CONNTING; - pReptCliEntry->pNext = NULL; - NdisGetSystemUpTime(&pReptCliEntry->CliTriggerTime); - pAd->ApCfg.RepeaterCliSize++; - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - /* Before add into muar table, config Band binding. */ - HcAddRepeaterEntry(wdev, CliIdx); - AsicInsertRepeaterEntry(pAd, CliIdx, tempMAC); - HashIdx = MAC_ADDR_HASH_INDEX(tempMAC); - - if (pAd->ApCfg.ReptCliHash[HashIdx] == NULL) - pAd->ApCfg.ReptCliHash[HashIdx] = pReptCliEntry; - else { - pCurrEntry = pAd->ApCfg.ReptCliHash[HashIdx]; - - while (pCurrEntry->pNext != NULL) - pCurrEntry = pCurrEntry->pNext; - - pCurrEntry->pNext = pReptCliEntry; - } - - HashIdx = MAC_ADDR_HASH_INDEX(pReptCliEntry->OriginalAddress); - - if (pAd->ApCfg.ReptMapHash[HashIdx] == NULL) - pAd->ApCfg.ReptMapHash[HashIdx] = pReptCliMap; - else { - PREPEATER_CLIENT_ENTRY_MAP pCurrMapEntry; - - pCurrMapEntry = pAd->ApCfg.ReptMapHash[HashIdx]; - - while (pCurrMapEntry->pNext != NULL) - pCurrMapEntry = pCurrMapEntry->pNext; - - pCurrMapEntry->pNext = pReptCliMap; - } - - /* - FIXME: - if apcli is removed afterward, - the state machine massage should be reviewed. - */ - NdisZeroMemory(&ApCliCtrlMsg, sizeof(APCLI_CTRL_MSG_STRUCT)); - ApCliCtrlMsg.Status = MLME_SUCCESS; - COPY_MAC_ADDR(&ApCliCtrlMsg.SrcAddr[0], tempMAC); - ApCliCtrlMsg.BssIdx = wdev->func_idx; - ApCliCtrlMsg.CliIdx = CliIdx; - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_MT2_AUTH_REQ, - sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, - wdev->func_idx); - RTMP_MLME_HANDLER(pAd); -#ifdef MTFWD - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Insert MacRep Sta:%pM, orig MAC:%pM, %s\n", tempMAC, - pReptCliEntry->OriginalAddress, wdev->if_dev->name)); - - RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, - FWD_CMD_ADD_TX_SRC, NULL, tempMAC, - MAC_ADDR_LEN); -#endif -} - -VOID RTMPRemoveRepeaterEntry(IN PRTMP_ADAPTER pAd, IN UCHAR func_tb_idx, - IN UCHAR CliIdx) -{ - USHORT HashIdx; - REPEATER_CLIENT_ENTRY *pEntry, *pPrevEntry, *pProbeEntry; - REPEATER_CLIENT_ENTRY_MAP *pMapEntry, *pPrevMapEntry, *pProbeMapEntry; - BOOLEAN bVaild = TRUE; - BOOLEAN Cancelled; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - (" %s.CliIdx=%d\n", __func__, CliIdx)); - AsicRemoveRepeaterEntry(pAd, CliIdx); - NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); - pEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - - /* move NULL check here, to prevent pEntry NULL dereference */ - if (pEntry == NULL) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("%s - pEntry is NULL !!!\n", __func__)); - return; - } - - if (pEntry->CliEnable == FALSE) { - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - ("%s - CliIdx:%d Enable is FALSE already\n", __func__, - CliIdx)); - return; - } - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - NdisFreeSpinLock(&pEntry->SavedPMK_lock); -#endif - - /*Release OMAC Idx*/ - HcDelRepeaterEntry(pEntry->wdev, CliIdx); - HashIdx = MAC_ADDR_HASH_INDEX(pEntry->CurrentAddress); - pPrevEntry = NULL; - pProbeEntry = pAd->ApCfg.ReptCliHash[HashIdx]; - ASSERT(pProbeEntry); - - if (pProbeEntry == NULL) { - bVaild = FALSE; - goto done; - } - - if (pProbeEntry != NULL) { - /* update Hash list*/ - do { - if (pProbeEntry == pEntry) { - if (pPrevEntry == NULL) - pAd->ApCfg.ReptCliHash[HashIdx] = - pEntry->pNext; - else - pPrevEntry->pNext = pEntry->pNext; - - break; - } - - pPrevEntry = pProbeEntry; - pProbeEntry = pProbeEntry->pNext; - } while (pProbeEntry); - } - - /* not found !!!*/ - ASSERT(pProbeEntry != NULL); - - if (pProbeEntry == NULL) { - bVaild = FALSE; - goto done; - } - - pMapEntry = &pAd->ApCfg.pRepeaterCliMapPool[CliIdx]; - HashIdx = MAC_ADDR_HASH_INDEX(pEntry->OriginalAddress); - pPrevMapEntry = NULL; - pProbeMapEntry = pAd->ApCfg.ReptMapHash[HashIdx]; - ASSERT(pProbeMapEntry); - - if (pProbeMapEntry != NULL) { - /* update Hash list*/ - do { - if (pProbeMapEntry == pMapEntry) { - if (pPrevMapEntry == NULL) - pAd->ApCfg.ReptMapHash[HashIdx] = - pMapEntry->pNext; - else - pPrevMapEntry->pNext = pMapEntry->pNext; - - break; - } - - pPrevMapEntry = pProbeMapEntry; - pProbeMapEntry = pProbeMapEntry->pNext; - } while (pProbeMapEntry); - } - - /* not found !!!*/ - ASSERT(pProbeMapEntry != NULL); -done: - RTMPReleaseTimer(&pEntry->ApCliAuthTimer, &Cancelled); - RTMPReleaseTimer(&pEntry->ApCliAssocTimer, &Cancelled); -#ifdef FAST_EAPOL_WAR - - if (pEntry->pre_entry_alloc == TRUE) - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Unexpected condition,check it (pEntry->pre_entry_alloc=%d)\n", - __func__, pEntry->pre_entry_alloc)); - - pEntry->pre_entry_alloc = FALSE; -#endif /* FAST_EAPOL_WAR */ - pEntry->CliConnectState = REPT_ENTRY_DISCONNT; - pEntry->CliValid = FALSE; - pEntry->CliEnable = FALSE; - - if (bVaild == TRUE) - pAd->ApCfg.RepeaterCliSize--; - - ReptLinkDownComplete(pEntry); - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); -#ifdef MTFWD - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Remove MacRep Sta:%pM\n", pEntry->CurrentAddress)); - RtmpOSWrielessEventSend(pEntry->wdev->if_dev, RT_WLAN_EVENT_CUSTOM, - FWD_CMD_DEL_TX_SRC, NULL, - pEntry->CurrentAddress, MAC_ADDR_LEN); -#endif -} - -VOID RTMPRepeaterReconnectionCheck(IN PRTMP_ADAPTER pAd) -{ -#ifdef APCLI_AUTO_CONNECT_SUPPORT - INT i; - PCHAR pApCliSsid, pApCliCfgSsid; - UCHAR CfgSsidLen; - NDIS_802_11_SSID Ssid; - ULONG timeDiff[MAX_APCLI_NUM]; - - if (pAd->ApCfg.bMACRepeaterEn && - pAd->ApCfg.MACRepeaterOuiMode == VENDOR_DEFINED_MAC_ADDR_OUI && - pAd->ScanCtrl.PartialScan.bScanning == FALSE) { - for (i = 0; i < MAX_APCLI_NUM; i++) { - if (!APCLI_IF_UP_CHECK(pAd, i) || - (pAd->ApCfg.ApCliTab[i].Enable == FALSE)) - continue; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - (" %s(): i=%d,%d,%d,%d,%d,%d\n", __func__, - (int)i, - (int)ApScanRunning( - pAd, &pAd->ApCfg.ApCliTab[i].wdev), - (int)pAd->ApCfg.ApCliAutoConnectRunning[i], - (int)pAd->ApCfg.ApCliAutoConnectType[i], - (int)pAd->ApCfg.bPartialScanEnable[i], - (int)(pAd->Mlme.OneSecPeriodicRound % 23))); - - if (ApScanRunning(pAd, &pAd->ApCfg.ApCliTab[i].wdev)) - continue; - if (pAd->ApCfg.ApCliAutoConnectRunning[i] != FALSE) - continue; - if (pAd->ApCfg.ApCliTab[i].AutoConnectFlag == FALSE) - continue; - pApCliSsid = pAd->ApCfg.ApCliTab[i].Ssid; - pApCliCfgSsid = pAd->ApCfg.ApCliTab[i].CfgSsid; - CfgSsidLen = pAd->ApCfg.ApCliTab[i].CfgSsidLen; - - if ((pAd->ApCfg.ApCliTab[i].CtrlCurrState < - APCLI_CTRL_AUTH || - !NdisEqualMemory(pApCliSsid, pApCliCfgSsid, - CfgSsidLen)) && - pAd->ApCfg.ApCliTab[i].CfgSsidLen > 0) { - if (RTMP_TIME_AFTER( - pAd->Mlme.Now32, - pAd->ApCfg.ApCliIssueScanTime[i])) - timeDiff[i] = - (pAd->Mlme.Now32 - - pAd->ApCfg - .ApCliIssueScanTime[i]); - else - timeDiff[i] = - (pAd->ApCfg - .ApCliIssueScanTime[i] - - pAd->Mlme.Now32); - /* will trigger scan after 23 sec */ - if (timeDiff[i] <= RTMPMsecsToJiffies(23000)) - continue; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - (" %s(): Scan channels for AP (%s)\n", - __func__, pApCliCfgSsid)); - pAd->ApCfg.ApCliAutoConnectRunning[i] = TRUE; - if (pAd->ApCfg.bPartialScanEnable[i]) { - pAd->ApCfg.bPartialScanning[i] = TRUE; - pAd->ScanCtrl.PartialScan.pwdev = - &pAd->ApCfg.ApCliTab[i].wdev; - pAd->ScanCtrl.PartialScan.bScanning = - TRUE; - } - Ssid.SsidLength = CfgSsidLen; - NdisCopyMemory(Ssid.Ssid, pApCliCfgSsid, - CfgSsidLen); - NdisGetSystemUpTime( - &pAd->ApCfg.ApCliIssueScanTime[i]); - ApSiteSurvey_by_wdev( - pAd, &Ssid, SCAN_ACTIVE, FALSE, - &pAd->ApCfg.ApCliTab[i].wdev); - } - } - } - -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ -} - -BOOLEAN RTMPRepeaterVaildMacEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr) -{ - INVAILD_TRIGGER_MAC_ENTRY *pEntry = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (pAd->ApCfg.RepeaterCliSize >= GET_MAX_REPEATER_ENTRY_NUM(cap)) - return FALSE; - - if (IS_MULTICAST_MAC_ADDR(pAddr)) - return FALSE; - - if (IS_BROADCAST_MAC_ADDR(pAddr)) - return FALSE; - - pEntry = RepeaterInvaildMacLookup(pAd, pAddr); - - if (pEntry) - return FALSE; - else - return TRUE; -} - -INVAILD_TRIGGER_MAC_ENTRY *RepeaterInvaildMacLookup(IN PRTMP_ADAPTER pAd, - IN PUCHAR pAddr) -{ - ULONG HashIdx; - INVAILD_TRIGGER_MAC_ENTRY *pEntry = NULL; - - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - pEntry = pAd->ApCfg.ReptControl.IgnoreAsRepeaterHash[HashIdx]; - - while (pEntry) { - if (MAC_ADDR_EQUAL(pEntry->MacAddr, pAddr)) - break; - pEntry = pEntry->pNext; - } - - if (pEntry && pEntry->bInsert) - return pEntry; - else - return NULL; -} - -VOID InsertIgnoreAsRepeaterEntryTable(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr) -{ - UCHAR HashIdx, idx = 0; - INVAILD_TRIGGER_MAC_ENTRY *pEntry = NULL; - INVAILD_TRIGGER_MAC_ENTRY *pCurrEntry = NULL; - - if (pAd->ApCfg.ReptControl.IgnoreAsRepeaterEntrySize >= - MAX_IGNORE_AS_REPEATER_ENTRY_NUM) - return; - - if (MAC_ADDR_EQUAL(pAddr, ZERO_MAC_ADDR)) - return; - - NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); - - for (idx = 0; idx < MAX_IGNORE_AS_REPEATER_ENTRY_NUM; idx++) { - pEntry = &pAd->ApCfg.ReptControl.IgnoreAsRepeaterEntry[idx]; - - if (MAC_ADDR_EQUAL(pEntry->MacAddr, pAddr)) { - if (pEntry->bInsert) { - NdisReleaseSpinLock( - &pAd->ApCfg.ReptCliEntryLock); - return; - } - } - - /* pick up the first available vacancy*/ - if (pEntry->bInsert == FALSE) { - NdisZeroMemory(pEntry->MacAddr, MAC_ADDR_LEN); - COPY_MAC_ADDR(pEntry->MacAddr, pAddr); - pEntry->entry_idx = idx; - pEntry->bInsert = TRUE; - break; - } - } - - /* add this entry into HASH table */ - if (pEntry) { - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - pEntry->pNext = NULL; - - if (pAd->ApCfg.ReptControl.IgnoreAsRepeaterHash[HashIdx] == - NULL) - pAd->ApCfg.ReptControl.IgnoreAsRepeaterHash[HashIdx] = - pEntry; - else { - pCurrEntry = pAd->ApCfg.ReptControl - .IgnoreAsRepeaterHash[HashIdx]; - - while (pCurrEntry->pNext != NULL) - pCurrEntry = pCurrEntry->pNext; - - pCurrEntry->pNext = pEntry; - } - } - - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - (" Store Invaild MacAddr = %02x:%02x:%02x:%02x:%02x:%02x. !!!\n", - PRINT_MAC(pEntry->MacAddr))); - pAd->ApCfg.ReptControl.IgnoreAsRepeaterEntrySize++; - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); -} - -BOOLEAN RepeaterRemoveIngoreEntry(IN PRTMP_ADAPTER pAd, IN UCHAR idx, - IN PUCHAR pAddr) -{ - USHORT HashIdx; - INVAILD_TRIGGER_MAC_ENTRY *pEntry = NULL; - INVAILD_TRIGGER_MAC_ENTRY *pPrevEntry, *pProbeEntry; - - NdisAcquireSpinLock(&pAd->ApCfg.ReptCliEntryLock); - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - pEntry = &pAd->ApCfg.ReptControl.IgnoreAsRepeaterEntry[idx]; - - if (pEntry && pEntry->bInsert) { - pPrevEntry = NULL; - pProbeEntry = - pAd->ApCfg.ReptControl.IgnoreAsRepeaterHash[HashIdx]; - ASSERT(pProbeEntry); - - if (pProbeEntry != NULL) { - /* update Hash list*/ - do { - if (pProbeEntry == pEntry) { - if (pPrevEntry == NULL) - pAd->ApCfg.ReptControl - .IgnoreAsRepeaterHash - [HashIdx] = - pEntry->pNext; - else - pPrevEntry->pNext = - pEntry->pNext; - - break; - } - - pPrevEntry = pProbeEntry; - pProbeEntry = pProbeEntry->pNext; - } while (pProbeEntry); - } - - /* not found !!!*/ - ASSERT(pProbeEntry != NULL); - pAd->ApCfg.ReptControl.IgnoreAsRepeaterEntrySize--; - } - - NdisZeroMemory(pEntry->MacAddr, MAC_ADDR_LEN); - pEntry->bInsert = FALSE; - NdisReleaseSpinLock(&pAd->ApCfg.ReptCliEntryLock); - return TRUE; -} - -VOID RepeaterLinkMonitor(RTMP_ADAPTER *pAd) -{ - REPEATER_CLIENT_ENTRY *ReptPool = pAd->ApCfg.pRepeaterCliPool; - REPEATER_CLIENT_ENTRY *pReptCliEntry = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR Wcid = 0; - STA_TR_ENTRY *tr_entry = NULL; - APCLI_CTRL_MSG_STRUCT msg; - UCHAR CliIdx; - UCHAR TimeoutVal = 5; -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - APCLI_STRUCT *papcli_entry = NULL; - - TimeoutVal = 30; -#endif - - if ((pAd->ApCfg.bMACRepeaterEn) && (ReptPool != NULL)) { - for (CliIdx = 0; CliIdx < GET_MAX_REPEATER_ENTRY_NUM(cap); - CliIdx++) { - pReptCliEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - papcli_entry = - &pAd->ApCfg - .ApCliTab[pReptCliEntry->MatchApCliIdx]; -#endif - if (pReptCliEntry->CliEnable) { - Wcid = pReptCliEntry->MacTabWCID; - tr_entry = &pAd->MacTab.tr_entry[Wcid]; - - if ((tr_entry->PortSecured != - WPA_802_1X_PORT_SECURED) && - RTMP_TIME_AFTER( - pAd->Mlme.Now32, - (pReptCliEntry->CliTriggerTime + - (TimeoutVal * OS_HZ)))) { - if (pReptCliEntry->CtrlCurrState == - APCLI_CTRL_DISCONNECTED) - HW_REMOVE_REPT_ENTRY( - pAd, - pReptCliEntry - ->MatchApCliIdx, - CliIdx); - else { - if (!VALID_UCAST_ENTRY_WCID( - pAd, Wcid)) - continue; - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - - if (IS_AKM_SAE_SHA256( - papcli_entry->MlmeAux - .AKMMap) || - IS_AKM_OWE( - papcli_entry->MlmeAux - .AKMMap)) { - UCHAR pmkid[LEN_PMKID]; - UCHAR pmk[LEN_PMK]; - INT cached_idx; - UCHAR if_index = - papcli_entry - ->wdev - .func_idx; - - /*Update PMK cache and delete sae instance*/ - if ( -#ifdef APCLI_SAE_SUPPORT - - (IS_AKM_SAE_SHA256( - papcli_entry - ->MlmeAux - .AKMMap) && - sae_get_pmk_cache( - &pAd->SaeCfg, - pReptCliEntry - ->CurrentAddress, - papcli_entry - ->MlmeAux - .Bssid, - pmkid, - pmk)) -#endif - ) { - - cached_idx = apcli_search_pmkid_cache( - pAd, - papcli_entry - ->MlmeAux - .Bssid, - if_index, - CliIdx); - - if (cached_idx != - INVALID_PMKID_IDX) { -#ifdef APCLI_SAE_SUPPORT - SAE_INSTANCE *pSaeIns = search_sae_instance( - &pAd->SaeCfg, - pReptCliEntry - ->CurrentAddress, - papcli_entry - ->MlmeAux - .Bssid); - - MTWF_LOG( - DBG_CAT_SEC, - CATSEC_SAE, - DBG_LVL_ERROR, - ("%s:Connection falied with pmkid ,delete cache entry and sae instance \n", - __func__)); - if (pSaeIns != - NULL) { - delete_sae_instance( - pSaeIns); - pSaeIns = - NULL; - } -#endif - apcli_delete_pmkid_cache( - pAd, - papcli_entry - ->MlmeAux - .Bssid, - if_index, - CliIdx); - } - } - } -#endif - - pReptCliEntry - ->Disconnect_Sub_Reason = - APCLI_DISCONNECT_SUB_REASON_REPTLM_TRIGGER_TOO_LONG; - NdisZeroMemory( - &msg, - sizeof(APCLI_CTRL_MSG_STRUCT)); - msg.BssIdx = - pReptCliEntry - ->MatchApCliIdx; - msg.CliIdx = CliIdx; - MlmeEnqueue( - pAd, - APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_DISCONNECT_REQ, - sizeof(APCLI_CTRL_MSG_STRUCT), - &msg, - REPT_MLME_START_IDX + - CliIdx); - RTMP_MLME_HANDLER(pAd); - } - } - } - } - } -} - -INT Show_Repeater_Cli_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT i; - ULONG DataRate = 0; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - ADD_HT_INFO_IE *addht; - - if (!wdev) - return FALSE; - - addht = wlan_operate_get_addht(wdev); - - if (!pAd->ApCfg.bMACRepeaterEn) - return TRUE; - - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("\n")); -#ifdef DOT11_N_SUPPORT - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("HT Operating Mode : %d\n", addht->AddHtInfo2.OperaionMode)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, ("\n")); -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("\n%-19s%-4s%-4s%-4s%-4s%-8s%-7s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s%-7s%-7s\n", - "MAC", "AID", "BSS", "PSM", "WMM", "MIMOPS", "RSSI0", "RSSI1", - "RSSI2", "RSSI3", "PhMd", "BW", "MCS", "SGI", "STBC", "Idle", - "Rate")); - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if (pEntry && - (IS_ENTRY_APCLI(pEntry) || IS_ENTRY_REPEATER(pEntry)) && - (pEntry->Sst == SST_ASSOC) && (pEntry->bReptCli)) { - DataRate = 0; - getRate(pEntry->HTPhyMode, &DataRate); - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%02X:%02X:%02X:%02X:%02X:%02X ", - pEntry->ReptCliAddr[0], pEntry->ReptCliAddr[1], - pEntry->ReptCliAddr[2], pEntry->ReptCliAddr[3], - pEntry->ReptCliAddr[4], - pEntry->ReptCliAddr[5])); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-4d", (int)pEntry->Aid)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-4d-%d", (int)pEntry->apidx, - pEntry->func_tb_idx)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-4d", (int)pEntry->PsMode)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-4d", - (int)CLIENT_STATUS_TEST_FLAG( - pEntry, fCLIENT_STATUS_WMM_CAPABLE))); -#ifdef DOT11_N_SUPPORT - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-8d", (int)pEntry->MmpsMode)); -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-7d", pEntry->RssiSample.AvgRssi[0])); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-7d", pEntry->RssiSample.AvgRssi[1])); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-7d", pEntry->RssiSample.AvgRssi[2])); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-7d", pEntry->RssiSample.AvgRssi[3])); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-10s", - get_phymode_str( - pEntry->HTPhyMode.field.MODE))); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-6s", - get_bw_str(pEntry->HTPhyMode.field.BW))); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-6d", pEntry->HTPhyMode.field.MCS)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-6d", pEntry->HTPhyMode.field.ShortGI)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-6d", pEntry->HTPhyMode.field.STBC)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-7d", (int)(pEntry->StaIdleTimeout - - pEntry->NoDataIdleCount))); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-7d", (int)DataRate)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("%-10d, %d, %d%%\n", pEntry->DebugFIFOCount, - pEntry->DebugTxCount, - (pEntry->DebugTxCount) ? - ((pEntry->DebugTxCount - - pEntry->DebugFIFOCount) * - 100 / pEntry->DebugTxCount) : - 0)); - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_TRACE, - ("\n")); - } - } - - return TRUE; -} - -VOID UpdateMbssCliLinkMap(RTMP_ADAPTER *pAd, UCHAR MbssIdx, - struct wifi_dev *cli_link_wdev, - struct wifi_dev *mbss_link_wdev) -{ - MBSS_TO_CLI_LINK_MAP_T *pMbssToCliLinkMap = NULL; - - NdisAcquireSpinLock(&pAd->ApCfg.CliLinkMapLock); - pMbssToCliLinkMap = &pAd->ApCfg.MbssToCliLinkMap[MbssIdx]; - pMbssToCliLinkMap->mbss_wdev = mbss_link_wdev; - pMbssToCliLinkMap->cli_link_wdev = cli_link_wdev; - NdisReleaseSpinLock(&pAd->ApCfg.CliLinkMapLock); -} - -#endif /* MAC_REPEATER_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sanity.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sanity.c deleted file mode 100644 index 49df1f073c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sanity.c +++ /dev/null @@ -1,29 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - ap_sanity.c - - Abstract: - Handle association related requests either from WSTA or from local MLME - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - John Chang 08-14-2003 created for 11g soft-AP - John Chang 12-30-2004 merge with STA driver for RT2600 -*/ - -#include "rt_config.h" diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sec.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sec.c deleted file mode 100644 index 9615a3e97a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sec.c +++ /dev/null @@ -1,953 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_sec.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#include "rt_config.h" -BUILD_TIMER_FUNCTION(GroupRekeyExec); - -#ifdef DOT11W_PMF_SUPPORT -VOID APPMFInit(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev) -{ - struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig; - /* - IEEE 802.11W/P.10 - - A STA that has associated with Management Frame Protection enabled - shall not use pairwise cipher suite selectors WEP-40, WEP-104, - TKIP, or "Use Group cipher suite". - - IEEE 802.11W/P.3 - - IEEE Std 802.11 provides one security protocol, CCMP, for protection - of unicast Robust Management frames. - */ - pSecConfig->PmfCfg.MFPC = FALSE; - pSecConfig->PmfCfg.MFPR = FALSE; - pSecConfig->PmfCfg.PMFSHA256 = FALSE; - - if (IS_AKM_WPA3PSK(pSecConfig->AKMMap)) { - /* In WPA3 spec, When a WPA3-Personal only BSS is configured, - * Protected Management Frame (PMF) shall be set to required (MFPR=1) - * When WPA2-Personal and WPA3-Personal are configured on the same BSS (mixed mode), - * Protected Management Frame (PMF) shall be set to capable (MFPC = 1, MFPR = 0) - */ - pSecConfig->PmfCfg.MFPC = TRUE; - pSecConfig->PmfCfg.MFPR = - (IS_AKM_WPA2PSK(pSecConfig->AKMMap)) ? FALSE : TRUE; - } else if (IS_AKM_WPA3_192BIT(pSecConfig->AKMMap) || - IS_AKM_OWE(pSecConfig->AKMMap) -#ifdef DPP_SUPPORT - || IS_AKM_DPP(pSecConfig->AKMMap) -#endif /* DPP_SUPPORT */ - || IS_AKM_WPA3(pSecConfig->AKMMap)) { - /* In WPA3 spec, When WPA3-Enterprise Suite B is used, - * Protected Management Frame (PMF) shall be set to required (MFPR=1). - */ - pSecConfig->PmfCfg.MFPC = TRUE; - pSecConfig->PmfCfg.MFPR = TRUE; - } else if ((IS_AKM_WPA2(pSecConfig->AKMMap) || - IS_AKM_WPA2PSK(pSecConfig->AKMMap)) && - IS_CIPHER_CCMP128(pSecConfig->PairwiseCipher) && - IS_CIPHER_CCMP128(pSecConfig->GroupCipher) && - (pSecConfig->PmfCfg.Desired_MFPC -#ifdef OCE_SUPPORT - || IS_OCE_ENABLE(wdev) -#endif /* OCE_SUPPORT */ - )) { - pSecConfig->PmfCfg.MFPC = TRUE; - pSecConfig->PmfCfg.MFPR = pSecConfig->PmfCfg.Desired_MFPR; - - if ((pSecConfig->PmfCfg.Desired_PMFSHA256) || - (pSecConfig->PmfCfg.MFPR)) - pSecConfig->PmfCfg.PMFSHA256 = TRUE; -#ifdef OCE_SUPPORT - if (IS_OCE_ENABLE(wdev) && - pSecConfig->PmfCfg.Desired_MFPC == FALSE) - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_OFF, - ("%s:: Force MFPC on when OCE enable\n", - __func__)); -#endif /* OCE_SUPPORT */ - } else if (pSecConfig->PmfCfg.Desired_MFPC) - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s:: Security is not WPA2/WPA2PSK AES\n", - __func__)); - - if (pSecConfig->PmfCfg.MFPC) { - if (IS_AKM_WPA3_192BIT(pSecConfig->AKMMap)) - SET_CIPHER_BIP_GMAC256(pSecConfig->PmfCfg.igtk_cipher); - else - SET_CIPHER_BIP_CMAC128(pSecConfig->PmfCfg.igtk_cipher); - } - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s:: apidx=%d, MFPC=%d, MFPR=%d, SHA256=%d\n", __func__, - wdev->func_idx, pSecConfig->PmfCfg.MFPC, - pSecConfig->PmfCfg.MFPR, pSecConfig->PmfCfg.PMFSHA256)); -} -#endif /* DOT11W_PMF_SUPPORT */ - -INT APSecInit(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev) -{ - struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig; - - if (pSecConfig->AKMMap == 0x0) - SET_AKM_OPEN(pSecConfig->AKMMap); - - if (pSecConfig->PairwiseCipher == 0x0) - SET_CIPHER_NONE(pSecConfig->PairwiseCipher); - - /* Decide Group cipher */ - if ((IS_AKM_OPEN(pSecConfig->AKMMap) || - IS_AKM_SHARED(pSecConfig->AKMMap)) && - (IS_CIPHER_WEP(pSecConfig->PairwiseCipher))) { - /* WEP */ - pSecConfig->GroupCipher = pSecConfig->PairwiseCipher; - pSecConfig->GroupKeyId = pSecConfig->PairwiseKeyId; - } else if (IS_AKM_WPA_CAPABILITY(pSecConfig->AKMMap) && - IS_CIPHER_TKIP(pSecConfig->PairwiseCipher)) { - /* Mix mode */ - SET_CIPHER_TKIP(pSecConfig->GroupCipher); - } else - pSecConfig->GroupCipher = pSecConfig->PairwiseCipher; - - /* Default key index is always 2 in WPA mode */ - if (IS_AKM_WPA_CAPABILITY(pSecConfig->AKMMap)) - pSecConfig->GroupKeyId = 1; - -#ifdef DOT11R_FT_SUPPORT - - if (wdev->FtCfg.FtCapFlag.Dot11rFtEnable) { - if (IS_AKM_WPA2(pSecConfig->AKMMap)) - SET_AKM_FT_WPA2(pSecConfig->AKMMap); - - if (IS_AKM_WPA2PSK(pSecConfig->AKMMap)) - SET_AKM_FT_WPA2PSK(pSecConfig->AKMMap); - - if (IS_AKM_WPA3PSK(pSecConfig->AKMMap)) - SET_AKM_FT_SAE_SHA256(pSecConfig->AKMMap); - - if (IS_AKM_SUITEB_SHA384(pSecConfig->AKMMap)) - SET_AKM_FT_WPA2_SHA384(pSecConfig->AKMMap); - } - -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11W_PMF_SUPPORT - APPMFInit(pAd, wdev); -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef DOT11_SAE_SUPPORT -#ifdef DOT11_SAE_PWD_ID_SUPPORT - if (pSecConfig->pwd_id_cnt == 0) { - pSecConfig->pwd_id_only = FALSE; - DlListInit(&pSecConfig->pwd_id_list_head.list); - } -#endif /* DOT11_SAE_PWD_ID_SUPPORT */ - - if (IS_AKM_SAE(pSecConfig->AKMMap)) { - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - - sae_derive_pt(&pAd->SaeCfg, pSecConfig->PSK, pMbss->Ssid, - pMbss->SsidLen, &pSecConfig->pt_list); - } -#endif /* DOT11_SAE_SUPPORT */ - /* Generate the corresponding RSNIE */ -#ifdef HOSTAPD_SUPPORT - - if (pAd->ApCfg.MBSSID[wdev->func_id].Hostapd) - return TRUE; -#endif /* HOSTAPD_SUPPORT */ - WPAMakeRSNIE(wdev->wdev_type, &wdev->SecConfig, NULL); - - return TRUE; -} - -INT ap_sec_deinit(IN struct wifi_dev *wdev) -{ -#ifdef DOT11_SAE_SUPPORT - struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig; - - if (IS_AKM_SAE(pSecConfig->AKMMap)) - sae_pt_list_deinit(&pSecConfig->pt_list); -#endif - - return TRUE; -} - -INT APKeyTableInit(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN STA_REC_CTRL_T *sta_rec) -{ - BSS_STRUCT *pMbss = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - ASIC_SEC_INFO *asic_sec_info = &sta_rec->asic_sec_info; - USHORT Wcid = 0; - STA_TR_ENTRY *tr_entry = NULL; - - if (wdev == NULL) - return 0; - - /* - Initialize security variable per entry, - 1. pairwise key table, re-set all WCID entry as NO-security mode. - 2. access control port status - */ - /* Init Security variables */ - pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - pSecConfig = &wdev->SecConfig; - RTMPInitTimer(pAd, &pSecConfig->GroupRekeyTimer, - GET_TIMER_FUNCTION(GroupRekeyExec), pAd, TRUE); - - if (IS_AKM_WPA_CAPABILITY(pSecConfig->AKMMap)) - pSecConfig->GroupKeyId = 1; - - /* Get a specific WCID to record this MBSS key attribute */ - Wcid = sta_rec->WlanIdx; - tr_entry = &pAd->MacTab.tr_entry[Wcid]; - wdev->PortSecured = WPA_802_1X_PORT_NOT_SECURED; - tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; - /* Set key material to Asic */ - os_zero_mem(asic_sec_info, sizeof(ASIC_SEC_INFO)); - asic_sec_info->Operation = SEC_ASIC_ADD_GROUP_KEY; - asic_sec_info->Direction = SEC_ASIC_KEY_TX; - asic_sec_info->Wcid = Wcid; - asic_sec_info->BssIndex = wdev->func_idx; - asic_sec_info->Cipher = pSecConfig->GroupCipher; - asic_sec_info->KeyIdx = pSecConfig->GroupKeyId; - os_move_mem(&asic_sec_info->PeerAddr[0], wdev->bssid, MAC_ADDR_LEN); - - /* When WEP, TKIP or AES is enabled, set group key info to Asic */ - if (IS_CIPHER_WEP(pSecConfig->GroupCipher)) { - INT i; - - /* Generate 3-bytes IV randomly for software encryption using */ - for (i = 0; i < LEN_WEP_TSC; i++) - pSecConfig->WepKey[asic_sec_info->KeyIdx].TxTsc[i] = - RandomByte(pAd); - - os_move_mem(&asic_sec_info->Key, - &pSecConfig->WepKey[asic_sec_info->KeyIdx], - sizeof(SEC_KEY_INFO)); - sta_rec->EnableFeature |= STA_REC_INSTALL_KEY_FEATURE; - } else if (IS_CIPHER_TKIP(pSecConfig->GroupCipher) || - IS_CIPHER_CCMP128(pSecConfig->GroupCipher) || - IS_CIPHER_CCMP256(pSecConfig->GroupCipher) || - IS_CIPHER_GCMP128(pSecConfig->GroupCipher) || - IS_CIPHER_GCMP256(pSecConfig->GroupCipher)) { - struct _SEC_KEY_INFO *pGroupKey = &asic_sec_info->Key; - /* Calculate PMK */ - SetWPAPSKKey(pAd, pSecConfig->PSK, strlen(pSecConfig->PSK), - (PUCHAR)pMbss->Ssid, pMbss->SsidLen, - pSecConfig->PMK); - /* Generate GMK and GNonce randomly per MBSS */ - GenRandom(pAd, wdev->bssid, pSecConfig->GMK); - GenRandom(pAd, wdev->bssid, pSecConfig->Handshake.GNonce); - /* Derive GTK per BSSID */ - WpaDeriveGTK(pSecConfig->GMK, - (UCHAR *)pSecConfig->Handshake.GNonce, wdev->bssid, - (UCHAR *)pSecConfig->GTK, LEN_MAX_GTK); - /* Install Shared key */ - os_move_mem(pGroupKey->Key, pSecConfig->GTK, LEN_MAX_GTK); -#ifdef DOT11W_PMF_SUPPORT - - if (pSecConfig->PmfCfg.MFPC == TRUE) { - /* IGTK default key index as 4 */ - pSecConfig->PmfCfg.IGTK_KeyIdx = 4; - /* Clear IPN */ - NdisZeroMemory(&pSecConfig->PmfCfg.IPN[0][0], - LEN_WPA_TSC); - /* Derive IGTK */ - PMF_DeriveIGTK(pAd, &pSecConfig->PmfCfg.IGTK[0][0]); - os_move_mem(asic_sec_info->IGTK, - &pSecConfig->PmfCfg.IGTK[0][0], - LEN_MAX_IGTK); - if (IS_CIPHER_BIP_CMAC128( - pSecConfig->PmfCfg.igtk_cipher) || - IS_CIPHER_BIP_GMAC128( - pSecConfig->PmfCfg.igtk_cipher)) - asic_sec_info->IGTKKeyLen = LEN_BIP128_IGTK; - else if (IS_CIPHER_BIP_CMAC256( - pSecConfig->PmfCfg.igtk_cipher) || - IS_CIPHER_BIP_GMAC256( - pSecConfig->PmfCfg.igtk_cipher)) - asic_sec_info->IGTKKeyLen = LEN_BIP256_IGTK; - - if (asic_sec_info->IGTKKeyLen != 0) - asic_sec_info->Cipher |= - pSecConfig->PmfCfg.igtk_cipher; - } - -#endif /* DOT11W_PMF_SUPPORT */ - WPAInstallKey(pAd, asic_sec_info, TRUE, FALSE); - sta_rec->EnableFeature |= STA_REC_INSTALL_KEY_FEATURE; - pSecConfig->Handshake.GTKState = REKEY_ESTABLISHED; - } - - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("### BSS(%d) AKM=0x%x, PairwiseCipher=0x%x, GroupCipher=0x%x\n", - wdev->func_idx, pSecConfig->AKMMap, pSecConfig->PairwiseCipher, - pSecConfig->GroupCipher)); - return TRUE; -} - -VOID GroupRekeyExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - UINT i, apidx; - ULONG temp_counter = 0; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; - PRALINK_TIMER_STRUCT pTimer = (PRALINK_TIMER_STRUCT)SystemSpecific3; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - if (&pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.GroupRekeyTimer == - pTimer) - break; - } - - if (apidx == pAd->ApCfg.BssidNum) - return; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (pSecConfig->GroupReKeyInterval == 0) - return; - - if (pSecConfig->Handshake.GTKState == REKEY_NEGOTIATING) { - pSecConfig->GroupReKeyInstallCountDown--; - - if (pSecConfig->GroupReKeyInstallCountDown == 0) - goto INSTALL_KEY; - } - - if (pSecConfig->GroupReKeyMethod == SEC_GROUP_REKEY_TIME) - temp_counter = (++pSecConfig->GroupPacketCounter); - else if (pSecConfig->GroupReKeyMethod == SEC_GROUP_REKEY_PACKET) - temp_counter = pSecConfig->GroupPacketCounter / - 1000; /* Packet-based: kilo-packets */ - else - return; - - if (temp_counter > pSecConfig->GroupReKeyInterval) { - UINT entry_count = 0; - - pSecConfig->GroupPacketCounter = 0; - pSecConfig->Handshake.GTKState = REKEY_NEGOTIATING; - /* change key index */ - pSecConfig->GroupKeyId = (pSecConfig->GroupKeyId == 1) ? 2 : 1; - /* Generate GNonce randomly per MBSS */ - GenRandom(pAd, wdev->bssid, pSecConfig->Handshake.GNonce); - /* Derive GTK per BSSID */ - WpaDeriveGTK(pSecConfig->GMK, - (UCHAR *)pSecConfig->Handshake.GNonce, wdev->bssid, - (UCHAR *)pSecConfig->GTK, LEN_MAX_GTK); - - /* Process 2-way handshaking */ - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_CLIENT(pEntry) && - (pEntry->SecConfig.Handshake.WpaState == - AS_PTKINITDONE) && - (pEntry->func_tb_idx == apidx)) { -#ifdef A4_CONN - if (IS_ENTRY_A4(pEntry)) - continue; -#endif /* A4_CONN */ - entry_count++; - RTMPSetTimer( - &pEntry->SecConfig.StartFor2WayTimer, - ENQUEUE_EAPOL_2WAY_START_TIMER); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Rekey interval excess, Update Group Key for %02X:%02X:%02X:%02X:%02X:%02X , DefaultKeyId= %x\n", - PRINT_MAC(pEntry->Addr), - pSecConfig->GroupKeyId)); - } - } - - if (entry_count == 0) - goto INSTALL_KEY; - else - pSecConfig->GroupReKeyInstallCountDown = - 1; /* 1 seconds */ - } - - return; -INSTALL_KEY: - /* If no sta connect, directly install group rekey, else install key after 2 way completed or 1 seconds */ - { - ASIC_SEC_INFO Info = { 0 }; - USHORT Wcid; - /* Get a specific WCID to record this MBSS key attribute */ - GET_GroupKey_WCID(wdev, Wcid); - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_GROUP_KEY; - Info.Direction = SEC_ASIC_KEY_TX; - Info.Wcid = Wcid; - Info.BssIndex = apidx; - Info.Cipher = pSecConfig->GroupCipher; - Info.KeyIdx = pSecConfig->GroupKeyId; - os_move_mem(&Info.PeerAddr[0], BROADCAST_ADDR, MAC_ADDR_LEN); - /* Install Shared key */ - os_move_mem(Info.Key.Key, pSecConfig->GTK, LEN_MAX_GTK); - WPAInstallKey(pAd, &Info, TRUE, TRUE); - pSecConfig->Handshake.GTKState = REKEY_ESTABLISHED; - } -} - -VOID WPAGroupRekeyByWdev(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev) - -{ - struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig; - - if (IS_CIPHER_TKIP(pSecConfig->GroupCipher) || - IS_CIPHER_CCMP128(pSecConfig->GroupCipher) || - IS_CIPHER_CCMP256(pSecConfig->GroupCipher) || - IS_CIPHER_GCMP128(pSecConfig->GroupCipher) || - IS_CIPHER_GCMP256(pSecConfig->GroupCipher)) { - /* Group rekey related */ - if ((pSecConfig->GroupReKeyInterval != 0) && - ((pSecConfig->GroupReKeyMethod == SEC_GROUP_REKEY_TIME) || - (pSecConfig->GroupReKeyMethod == SEC_GROUP_REKEY_PACKET))) { - pSecConfig->GroupPacketCounter = 0; - RTMPSetTimer(&pSecConfig->GroupRekeyTimer, - GROUP_KEY_UPDATE_EXEC_INTV); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s : Group rekey method= %d , interval = 0x%lx\n", - __func__, pSecConfig->GroupReKeyMethod, - pSecConfig->GroupReKeyInterval)); - } - } -} - -/* - Set group re-key timer if necessary. - It must be processed after clear flag "fRTMP_ADAPTER_HALT_IN_PROGRESS" -*/ -VOID APStartRekeyTimer(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev) -{ - if (HcIsRadioAcq(wdev)) { - WPAGroupRekeyByWdev(pAd, wdev); - } -} - -VOID APStopRekeyTimer(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev) -{ - BOOLEAN Cancelled; - RTMPCancelTimer(&wdev->SecConfig.GroupRekeyTimer, &Cancelled); -} - -VOID APReleaseRekeyTimer(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev) -{ - BOOLEAN Cancelled; - RTMPReleaseTimer(&wdev->SecConfig.GroupRekeyTimer, &Cancelled); -} - -static PCHAR portsecured[] = { "NONE", "PORT_SECURED", "NOT_SECURED" }; -INT Show_APSecurityInfo_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - UCHAR idx; - USHORT Wcid; - struct _SECURITY_CONFIG *pSecConfig = NULL; - struct wifi_dev *wdev = NULL; - STA_TR_ENTRY *tr_entry = NULL; - - if (!pAd) - return FALSE; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Security Infomation: AP\n")); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BSS\tWCID\tAuthMode\tPairwiseCipher\tGroupCipher\tGroupKeyId\tPortSecured\n")); - - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) { - pSecConfig = &pAd->ApCfg.MBSSID[idx].wdev.SecConfig; - wdev = &pAd->ApCfg.MBSSID[idx].wdev; - GET_GroupKey_WCID(wdev, Wcid); - tr_entry = &pAd->MacTab.tr_entry[Wcid]; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" %d\t%d\t%s\t\t%s\t\t%s\t\t%d\t\t%s\n", idx, Wcid, - GetAuthModeStr(GET_SEC_AKM(pSecConfig)), - GetEncryModeStr(GET_PAIRWISE_CIPHER(pSecConfig)), - GetEncryModeStr(GET_GROUP_CIPHER(pSecConfig)), - pSecConfig->GroupKeyId, - portsecured[tr_entry->PortSecured])); - } - -#ifdef DOT11_SAE_PWD_ID_SUPPORT - if (!DlListEmpty(&pSecConfig->pwd_id_list_head.list)) { - struct pwd_id_list *list = NULL; - UCHAR i = 0; - DlListForEach(list, &pSecConfig->pwd_id_list_head.list, - struct pwd_id_list, list) - { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%d pwdid = %s, pwd = %s\n", i++, - list->pwd_id, list->pwd)); - hex_dump_with_lvl("pwdid", list->pwd_id, 40, 1); - hex_dump_with_lvl("pwd", list->pwd, LEN_PSK, 1); - } - } - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PWDID Required = %d\n", pSecConfig->sae_cap.pwd_id_only)); -#endif - -#ifdef APCLI_SUPPORT - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Security Infomation: AP Client\n")); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BSS\tWCID\tAuthMode\tPairwiseCipher\tPortSecured\n")); - - for (idx = 0; idx < MAX_APCLI_NUM; idx++) { - PAPCLI_STRUCT pApCliEntry = &pAd->ApCfg.ApCliTab[idx]; - - pSecConfig = &pApCliEntry->wdev.SecConfig; - wdev = &pApCliEntry->wdev; - tr_entry = &pAd->MacTab.tr_entry[wdev->bss_info_argument - .ucBcMcWlanIdx]; - - if (pApCliEntry->Enable == TRUE) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" %d\t%d\t%s\t\t%s\t\t%s\n", idx, - wdev->bss_info_argument.ucBcMcWlanIdx, - GetAuthModeStr(GET_SEC_AKM(pSecConfig)), - GetEncryModeStr( - GET_PAIRWISE_CIPHER(pSecConfig)), - portsecured[tr_entry->PortSecured])); - } - } - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); -#endif - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Security Infomation: STA\n")); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("BSS\t\t\tAID\tWCID\tAuthMode\tPairwiseCipher\tPortSecured\n")); - - for (idx = 0; idx < MAX_LEN_OF_MAC_TABLE; idx++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[idx]; - - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; - pSecConfig = &pEntry->SecConfig; - - if (pEntry && IS_ENTRY_CLIENT(pEntry) && - pEntry->Sst == SST_ASSOC) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%02X:%02X:%02X:%02X:%02X:%02X\t%d\t%d\t%s\t\t%s\t\t%s\n", - PRINT_MAC(pEntry->Addr), pEntry->Aid, - pEntry->wcid, - GetAuthModeStr(GET_SEC_AKM(pSecConfig)), - GetEncryModeStr( - GET_PAIRWISE_CIPHER(pSecConfig)), - portsecured[tr_entry->PortSecured])); - } - } - - return TRUE; -} - -VOID CheckBMCPortSecured(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN BOOLEAN isConnect) -{ - UINT32 bss_index = pEntry->func_tb_idx; - UINT32 wcid; - UCHAR PortSecured = WPA_802_1X_PORT_NOT_SECURED; - MAC_TABLE_ENTRY *pMacEntry = NULL; - STA_TR_ENTRY *tr_entry = NULL; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[bss_index].wdev; - - if (wdev->tr_tb_idx == 0xff) - return; /* skip uninit tr_tb_idx. */ - - if (isConnect) - PortSecured = WPA_802_1X_PORT_SECURED; - else { - for (wcid = 1; VALID_UCAST_ENTRY_WCID(pAd, wcid); wcid++) { - pMacEntry = &pAd->MacTab.Content[wcid]; - tr_entry = &pAd->MacTab.tr_entry[wcid]; - - if (wcid == pEntry->wcid) - continue; - - if (((pMacEntry) && (IS_ENTRY_CLIENT(pMacEntry)) && - (pMacEntry->Sst == SST_ASSOC) && - (pMacEntry->func_tb_idx == bss_index) && - (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED))) { - PortSecured = WPA_802_1X_PORT_SECURED; - break; - } - } - } - - if (wdev->PortSecured != PortSecured) { - tr_entry = &pAd->MacTab.tr_entry[wdev->bss_info_argument - .ucBcMcWlanIdx]; - tr_entry->PortSecured = PortSecured; - wdev->PortSecured = PortSecured; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: bss_index = %d, wcid = %d, PortSecured = %d\n", - __func__, bss_index, - wdev->bss_info_argument.ucBcMcWlanIdx, PortSecured)); - } -} - -#ifdef DOT1X_SUPPORT -/* - ======================================================================== - - Routine Description: - Sending EAP Req. frame to station in authenticating state. - These frames come from Authenticator deamon. - - Arguments: - pAdapter Pointer to our adapter - pPacket Pointer to outgoing EAP frame body + 8023 Header - Len length of pPacket - - Return Value: - None - ======================================================================== -*/ -VOID WpaSend(RTMP_ADAPTER *pAdapter, UCHAR *pPacket, ULONG Len) -{ - PEAP_HDR pEapHdr; - UCHAR Addr[MAC_ADDR_LEN]; - UCHAR Header802_3[LENGTH_802_3]; - MAC_TABLE_ENTRY *pEntry; - STA_TR_ENTRY *tr_entry; - PUCHAR pData; - - NdisMoveMemory(Addr, pPacket, 6); - NdisMoveMemory(Header802_3, pPacket, LENGTH_802_3); - pEapHdr = (EAP_HDR *)(pPacket + LENGTH_802_3); - pData = (pPacket + LENGTH_802_3); - pEntry = MacTableLookup(pAdapter, Addr); - if (pEntry == NULL) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("WpaSend - No such MAC - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(Addr))); - return; - } - - tr_entry = &pAdapter->MacTab.tr_entry[pEntry->wcid]; - - /* Send EAP frame to STA */ - if ((IS_AKM_WPA_CAPABILITY_Entry(pEntry) && - (pEapHdr->ProType != EAPOLKey)) || - (IS_IEEE8021X(&pAdapter->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.SecConfig))) - RTMPToWirelessSta(pAdapter, pEntry, Header802_3, LENGTH_802_3, - pData, Len - LENGTH_802_3, - (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED) ? - FALSE : - TRUE); - - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d), pEapHdr->code=%d, pEntry->SecConfig.Handshake.WpaState=%d\n", - __func__, __LINE__, pEapHdr->code, - pEntry->SecConfig.Handshake.WpaState)); - - if (RTMPEqualMemory((pPacket + 12), EAPOL, 2)) { - switch (pEapHdr->code) { - case EAP_CODE_REQUEST: - if ((pEntry->SecConfig.Handshake.WpaState >= - AS_PTKINITDONE) && - (pEapHdr->ProType == EAPPacket)) { - pEntry->SecConfig.Handshake.WpaState = - AS_AUTHENTICATION; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Start to re-authentication by 802.1x daemon\n")); - } - - break; - - /* After receiving EAP_SUCCESS, trigger state machine */ - case EAP_CODE_SUCCESS: - if (IS_AKM_WPA_CAPABILITY_Entry(pEntry) && - (pEapHdr->ProType != EAPOLKey)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Send EAP_CODE_SUCCESS\n\n")); - - if (pEntry->Sst == SST_ASSOC) { - UINT8 pmk_len = LEN_PMK; - pEntry->SecConfig.Handshake.WpaState = - AS_INITPMK; - pEntry->SecConfig.Handshake - .MsgRetryCounter = 0; - os_move_mem( - &pEntry->SecConfig.Handshake - .AAddr, - pAdapter->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.bssid, - MAC_ADDR_LEN); - os_move_mem(&pEntry->SecConfig.Handshake - .SAddr, - pEntry->Addr, MAC_ADDR_LEN); - if (pEntry->SecConfig.key_deri_alg == - SEC_KEY_DERI_SHA384) - pmk_len = LEN_PMK_SHA384; - os_move_mem( - &pEntry->SecConfig.PMK, - &pAdapter->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.SecConfig.PMK, - pmk_len); - WPABuildPairMsg1(pAdapter, - &pEntry->SecConfig, - pEntry); - } - } else { - pEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - pEntry->SecConfig.Handshake.WpaState = - AS_PTKINITDONE; - /* 1x+WEP will update port secured in key install stage, todo: change the below code to WifiSysUpdatePortSecur? */ - if (IS_CIPHER_NONE( - pEntry->SecConfig.PairwiseCipher)) { - pAdapter->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.PortSecured = - WPA_802_1X_PORT_SECURED; - tr_entry->PortSecured = - WPA_802_1X_PORT_SECURED; - } -#ifdef WSC_AP_SUPPORT - - if (pAdapter->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.WscControl.WscConfMode != - WSC_DISABLE) - WscInformFromWPA(pEntry); - -#endif /* WSC_AP_SUPPORT */ - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IEEE8021X-WEP : Send EAP_CODE_SUCCESS\n\n")); - } - - break; - - case EAP_CODE_FAILURE: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Send Deauth, Reason : REASON_8021X_AUTH_FAIL\n")); - MlmeDeAuthAction(pAdapter, pEntry, - REASON_8021X_AUTH_FAIL, FALSE); - break; - - default: - break; - } - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Send Deauth, Reason : REASON_NO_LONGER_VALID\n")); - MlmeDeAuthAction(pAdapter, pEntry, REASON_NO_LONGER_VALID, - FALSE); - } -} - -INT RTMPAddPMKIDCache(IN NDIS_AP_802_11_PMKID *pPMKIDCache, IN INT apidx, - IN UCHAR *pAddr, IN UCHAR *PMKID, IN UCHAR *PMK, - IN UINT8 pmk_len) -{ - INT i, CacheIdx; - /* Update PMKID status */ - CacheIdx = RTMPSearchPMKIDCache(pPMKIDCache, apidx, pAddr); - - if (CacheIdx != INVALID_PMKID_IDX) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): cache found and renew it(%d)\n", __func__, - CacheIdx)); - } else { - ULONG ts = 0; - INT old_entry = 0; - - /* Add a new PMKID */ - for (i = 0; i < MAX_PMKID_COUNT; i++) { - if (pPMKIDCache->BSSIDInfo[i].Valid == FALSE) { - CacheIdx = i; - break; - } - if ((ts == 0) || - (ts > pPMKIDCache->BSSIDInfo[i].RefreshTime)) { - ts = pPMKIDCache->BSSIDInfo[i].RefreshTime; - old_entry = i; - } - } - - if (i == MAX_PMKID_COUNT) { - CacheIdx = old_entry; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s():Cache full, replace oldest(%d)\n", - __func__, old_entry)); - } - } - - pPMKIDCache->BSSIDInfo[CacheIdx].Valid = TRUE; - pPMKIDCache->BSSIDInfo[CacheIdx].Mbssidx = apidx; - NdisGetSystemUpTime(&(pPMKIDCache->BSSIDInfo[CacheIdx].RefreshTime)); - COPY_MAC_ADDR(&pPMKIDCache->BSSIDInfo[CacheIdx].MAC, pAddr); - NdisMoveMemory(&pPMKIDCache->BSSIDInfo[CacheIdx].PMKID, PMKID, - LEN_PMKID); - NdisMoveMemory(&pPMKIDCache->BSSIDInfo[CacheIdx].PMK, PMK, pmk_len); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): add %02x:%02x:%02x:%02x:%02x:%02x cache(%d) for ra%d\n", - __func__, PRINT_MAC(pAddr), CacheIdx, apidx)); - return CacheIdx; -} - -INT RTMPSearchPMKIDCache(IN NDIS_AP_802_11_PMKID *pPMKIDCache, IN INT apidx, - IN UCHAR *pAddr) -{ - INT i = 0; - - for (i = 0; i < MAX_PMKID_COUNT; i++) { - if ((pPMKIDCache->BSSIDInfo[i].Valid == TRUE) && - (pPMKIDCache->BSSIDInfo[i].Mbssidx == apidx) && - MAC_ADDR_EQUAL(&pPMKIDCache->BSSIDInfo[i].MAC, pAddr)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():%02x:%02x:%02x:%02x:%02x:%02x cache(%d) from IF(ra%d)\n", - __func__, PRINT_MAC(pAddr), i, apidx)); - break; - } - } - - if (i >= MAX_PMKID_COUNT) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): - IF(%d) not found\n", __func__, apidx)); - return INVALID_PMKID_IDX; - } - - return i; -} - -INT RTMPSearchPMKIDCacheByPmkId(IN NDIS_AP_802_11_PMKID *pPMKIDCache, - IN INT apidx, IN UCHAR *pAddr, IN UCHAR *pPmkId) -{ - INT i = 0; - - for (i = 0; i < MAX_PMKID_COUNT; i++) { - if ((pPMKIDCache->BSSIDInfo[i].Valid == TRUE) && - (pPMKIDCache->BSSIDInfo[i].Mbssidx == apidx) && - MAC_ADDR_EQUAL(&pPMKIDCache->BSSIDInfo[i].MAC, pAddr) && - RTMPEqualMemory(pPmkId, &pPMKIDCache->BSSIDInfo[i].PMKID, - LEN_PMKID)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():%02x:%02x:%02x:%02x:%02x:%02x cache(%d) from IF(ra%d)\n", - __func__, PRINT_MAC(pAddr), i, apidx)); - break; - } - } - - if (i >= MAX_PMKID_COUNT) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): - IF(%d) not found\n", __func__, apidx)); - return INVALID_PMKID_IDX; - } - - return i; -} - -INT RTMPValidatePMKIDCache(IN NDIS_AP_802_11_PMKID *pPMKIDCache, IN INT apidx, - IN UCHAR *pAddr, IN UCHAR *pPMKID) -{ - INT CacheIdx = RTMPSearchPMKIDCache(pPMKIDCache, apidx, pAddr); - - if (CacheIdx == INVALID_PMKID_IDX) - return INVALID_PMKID_IDX; - - if (RTMPEqualMemory(pPMKID, &pPMKIDCache->BSSIDInfo[CacheIdx].PMKID, - LEN_PMKID)) - return CacheIdx; - else - return INVALID_PMKID_IDX; -} - -VOID RTMPDeletePMKIDCache(IN NDIS_AP_802_11_PMKID *pPMKIDCache, IN INT apidx, - IN INT idx) -{ - PAP_BSSID_INFO pInfo = &pPMKIDCache->BSSIDInfo[idx]; - - if (pInfo->Valid && (pInfo->Mbssidx == apidx)) { - pInfo->Valid = FALSE; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():(IF(%d), del PMKID CacheIdx=%d\n", __func__, - apidx, idx)); - } -} - -VOID RTMPMaintainPMKIDCache(IN RTMP_ADAPTER *pAd) -{ - INT i; - ULONG Now; - - for (i = 0; i < MAX_PMKID_COUNT; i++) { - PAP_BSSID_INFO pBssInfo = &pAd->ApCfg.PMKIDCache.BSSIDInfo[i]; - - NdisGetSystemUpTime(&Now); - - if ((pBssInfo->Valid) && /*((Now - pBssInfo->RefreshTime) >= pMbss->PMKCachePeriod)*/ - (RTMP_TIME_AFTER(Now, (pBssInfo->RefreshTime + - pAd->ApCfg.MBSSID[pBssInfo->Mbssidx] - .PMKCachePeriod)))) - RTMPDeletePMKIDCache(&pAd->ApCfg.PMKIDCache, - pBssInfo->Mbssidx, i); - } -} - -UCHAR is_rsne_pmkid_cache_match(IN UINT8 *rsnie, IN UINT rsnie_len, - IN NDIS_AP_802_11_PMKID *pmkid_cache, - IN INT apidx, IN UCHAR *addr, OUT INT *cacheidx) -{ - UINT8 *pmkid = NULL; - UINT8 pmkid_count; - - pmkid = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, PMKID_LIST, - &pmkid_count); - - if (pmkid != NULL) { - *cacheidx = - RTMPValidatePMKIDCache(pmkid_cache, apidx, addr, pmkid); - return TRUE; - } - return FALSE; -} -#endif /* DOT1X_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sync.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sync.c deleted file mode 100644 index a61a254cca..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_sync.c +++ /dev/null @@ -1,3625 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - sync.c - - Abstract: - Synchronization state machine related services - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - John Chang 08-04-2003 created for 11g soft-AP - - */ - -#include "rt_config.h" - -#define OBSS_BEACON_RSSI_THRESHOLD (-85) - -/* - ========================================================================== - Description: - Process the received ProbeRequest from clients - Parameters: - Elem - msg containing the ProbeReq frame - ========================================================================== - */ -VOID APPeerProbeReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ - PEER_PROBE_REQ_PARAM ProbeReqParam = { { 0 } }; - HEADER_802_11 ProbeRspHdr; - NDIS_STATUS NStatus; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0, TmpLen; - LARGE_INTEGER FakeTimestamp; - UCHAR DsLen = 1; - UCHAR ErpIeLen = 1; - UCHAR apidx = 0, PhyMode, SupRateLen; - BSS_STRUCT *mbss; - struct wifi_dev *wdev; - struct dev_rate_info *rate; - struct freq_oper oper; -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - UCHAR ucETxBfCap; -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ -#ifdef AP_QLOAD_SUPPORT - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); -#endif - CHAR rsne_idx = 0; - struct _SECURITY_CONFIG *pSecConfig = NULL; - UCHAR cfg_ht_bw; - UCHAR op_ht_bw; - struct _build_ie_info ie_info; -#ifndef VENDOR_FEATURE7_SUPPORT - UCHAR Environment = 0x20; -#endif -#ifdef CONFIG_HOTSPOT_R2 - extern UCHAR OSEN_IE[]; - extern UCHAR OSEN_IELEN; -#endif /* CONFIG_HOTSPOT_R2 */ -#ifdef OCE_SUPPORT - P_OCE_CTRL pOceCtrl = NULL; -#endif - struct DOT11_H *pDot11h = NULL; -#ifdef WSC_AP_SUPPORT - UCHAR Addr3[MAC_ADDR_LEN]; - PFRAME_802_11 pFrame = (PFRAME_802_11)Elem->Msg; - - COPY_MAC_ADDR(Addr3, pFrame->Hdr.Addr3); -#endif /* WSC_AP_SUPPORT */ -#ifdef WDS_SUPPORT - - /* if in bridge mode, no need to reply probe req. */ - if (pAd->WdsTab.Mode == WDS_BRIDGE_MODE) - return; - -#endif /* WDS_SUPPORT */ - - if (PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, &ProbeReqParam) == - FALSE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():shiang! PeerProbeReqSanity failed!\n", - __func__)); - return; - } - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - mbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &mbss->wdev; - rate = &wdev->rate; - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) - continue; -#ifdef OCE_SUPPORT - if (ProbeReqParam.bProbeSupp[apidx]) { - ProbeReqParam.bProbeSupp[apidx] = FALSE; - continue; - } -#endif - cfg_ht_bw = wlan_config_get_ht_bw(wdev); - op_ht_bw = wlan_operate_get_ht_bw(wdev); - hc_radio_query_by_channel(pAd, wdev->channel, &oper); - if ((wdev->if_dev == NULL) || - ((wdev->if_dev != NULL) && - (!(RTMP_OS_NETDEV_STATE_RUNNING(wdev->if_dev)) -#ifdef CONFIG_MAP_SUPPORT - || (wdev->bcn_buf.bBcnSntReq == FALSE) -#endif - - ))) { - /* the interface is down, so we can not send probe response */ - continue; - } - - if ((Elem->Channel != oper.prim_ch) && - (Elem->Channel != oper.cen_ch_1)) - continue; - - PhyMode = wdev->PhyMode; - - ie_info.frame_subtype = SUBTYPE_PROBE_RSP; - ie_info.channel = wdev->channel; - ie_info.phy_mode = PhyMode; - ie_info.wdev = wdev; - - if (((((ProbeReqParam.SsidLen == 0) && (!mbss->bHideSsid)) || - ((ProbeReqParam.SsidLen == mbss->SsidLen) && - NdisEqualMemory(ProbeReqParam.Ssid, mbss->Ssid, - (ULONG)ProbeReqParam.SsidLen))) -#ifdef CONFIG_HOTSPOT - && ProbeReqforHSAP(pAd, apidx, &ProbeReqParam) -#endif - ) -#ifdef WSC_AP_SUPPORT - /* buffalo WPS testbed STA send ProbrRequest ssid length = 32 and ssid are not AP , but DA are AP. for WPS test send ProbeResponse */ - || ((ProbeReqParam.SsidLen == 32) && - MAC_ADDR_EQUAL(Addr3, wdev->bssid) && - (mbss->bHideSsid == 0)) -#endif /* WSC_AP_SUPPORT */ - ) - ; - else { - continue; /* check next BSS */ - } - -#ifdef CONFIG_STEERING_API_SUPPORT - if (pAd->ApCfg.NonAssocStaReport && - pAd->ApCfg.NonAssocStaEnable && - (!pAd->ApCfg.PauseNonAssocStaReport)) { - PNA_STA_ENTRY entry = NULL; - entry = NaStaList_Lookup(pAd, ProbeReqParam.Addr2); - if (entry) { - NaStaReportListInsertEntry( - pAd, Elem->rssi_info.raw_rssi, - Elem->Msg, Elem->MsgLen, - &entry->ListIndex, ProbeReqParam.Addr2, - wdev); - } - } -#endif -#ifdef BAND_STEERING - if (pAd->ApCfg.BandSteering) { - BOOLEAN bBndStrgCheck = TRUE; - - bBndStrgCheck = BndStrg_CheckConnectionReq( - pAd, wdev, ProbeReqParam.Addr2, - &(Elem->rssi_info), Elem->MsgType, - &ProbeReqParam); - if (bBndStrgCheck == FALSE) - return; - } -#endif /* BAND_STEERING */ -#ifdef OCE_SUPPORT - pOceCtrl = &wdev->OceCtrl; - /* Saidul: Fix for APUT broadcast Probe Response and Probe Suppression test, BcnPrd and MaxCannelTime under parenthesis */ - if (ProbeReqParam.MaxChannelTime && - (pOceCtrl->MaxChannelTimesUp || - (pAd->CommonCfg.BeaconPeriod <= - ProbeReqParam.MaxChannelTime))) { - pOceCtrl->MaxChannelTimesUp = FALSE; - pOceCtrl->MaxChannelTimerRunning = FALSE; - continue; - } - pOceCtrl->MaxChannelTimesUp = FALSE; - pOceCtrl->MaxChannelTimerRunning = FALSE; -#endif /* OCE_SUPPORT */ -#ifdef CONFIG_STEERING_API_SUPPORT - if (BlackList_StaLookup(pAd, ProbeReqParam.Addr2)) - return; -#endif -#ifdef WAPP_SUPPORT - wapp_send_cli_probe_event(pAd, - RtmpOsGetNetIfIndex(wdev->if_dev), - ProbeReqParam.Addr2, Elem); -#endif -#ifdef CUSTOMER_VENDOR_IE_SUPPORT - if ((ProbeReqParam.report_param.vendor_ie.element_id == - IE_VENDOR_SPECIFIC) && - (ProbeReqParam.report_param.vendor_ie.len > 0)) { - struct probe_req_report pProbeReqReportTemp; - - memset(&pProbeReqReportTemp, 0, - sizeof(struct probe_req_report)); - pProbeReqReportTemp.band = - (WMODE_CAP_2G(wdev->PhyMode) && - wdev->channel <= 14) ? - 0 : - 1; - COPY_MAC_ADDR(pProbeReqReportTemp.sta_mac, - ProbeReqParam.Addr2); - pProbeReqReportTemp.vendor_ie.element_id = - ProbeReqParam.report_param.vendor_ie.element_id; - pProbeReqReportTemp.vendor_ie.len = - ProbeReqParam.report_param.vendor_ie.len; - NdisMoveMemory( - pProbeReqReportTemp.vendor_ie.custom_ie, - ProbeReqParam.report_param.vendor_ie.custom_ie, - ProbeReqParam.report_param.vendor_ie.len); - - RtmpOSWrielessEventSend( - wdev->if_dev, RT_WLAN_EVENT_CUSTOM, - RT_PROBE_REQ_REPORT_EVENT, NULL, - (PUCHAR)&pProbeReqReportTemp, - MAC_ADDR_LEN + 3 + - ProbeReqParam.report_param.vendor_ie - .len); - } -#endif /* CUSTOMER_VENDOR_IE_SUPPORT */ - - /* allocate and send out ProbeRsp frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - -#ifdef OCE_SUPPORT - if (IS_OCE_ENABLE(wdev) && - MAC_ADDR_EQUAL(ProbeReqParam.Addr1, BROADCAST_ADDR) && - ProbeReqParam - .IsOceCapability) /* broadcast probe request && is OCE STA*/ - MgtMacHeaderInit( - pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, - BROADCAST_ADDR, wdev->if_addr, - wdev->bssid); /* broadcast probe response */ - else -#endif - MgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, - 0, ProbeReqParam.Addr2, wdev->if_addr, - wdev->bssid); - { - SupRateLen = rate->SupRateLen; - - if (PhyMode == WMODE_B) - SupRateLen = 4; - - MakeOutgoingFrame(pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), &ProbeRspHdr, - TIMESTAMP_LEN, &FakeTimestamp, 2, - &pAd->CommonCfg.BeaconPeriod, 2, - &mbss->CapabilityInfo, 1, &SsidIe, 1, - &mbss->SsidLen, mbss->SsidLen, - mbss->Ssid, 1, &SupRateIe, 1, - &SupRateLen, SupRateLen, - rate->SupRate, 1, &DsIe, 1, &DsLen, 1, - &wdev->channel, END_OF_ARGS); - } - - if ((rate->ExtRateLen) && (PhyMode != WMODE_B)) { - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &ErpIe, 1, &ErpIeLen, 1, - &mbss->ErpIeContent, 1, &ExtRateIe, 1, - &rate->ExtRateLen, rate->ExtRateLen, - rate->ExtRate, END_OF_ARGS); - FrameLen += TmpLen; - } - -#ifdef DOT11_N_SUPPORT - if (WMODE_CAP_N(PhyMode) && - (wdev->DesiredHtPhyInfo.bHtEnable)) { - ie_info.is_draft_n_type = FALSE; - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_ht_ies(pAd, &ie_info); - } -#endif /* DOT11_N_SUPPORT */ - /* Append RSN_IE when WPA OR WPAPSK, */ - pSecConfig = &wdev->SecConfig; -#ifdef CONFIG_HOTSPOT_R2 - - if ((mbss->HotSpotCtrl.HotSpotEnable == 0) && - (mbss->HotSpotCtrl.bASANEnable == 1) && - (IS_AKM_WPA2_Entry(wdev))) { - /* replace RSN IE with OSEN IE if it's OSEN wdev */ - UCHAR RSNIe = IE_WPA; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &RSNIe, 1, &OSEN_IELEN, OSEN_IELEN, - OSEN_IE, END_OF_ARGS); - FrameLen += TmpLen; - } else -#endif /* CONFIG_HOTSPOT_R2 */ - { - for (rsne_idx = 0; rsne_idx < SEC_RSNIE_NUM; - rsne_idx++) { - if (pSecConfig->RSNE_Type[rsne_idx] == - SEC_RSNIE_NONE) - continue; - - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, 1, - &pSecConfig->RSNE_EID[rsne_idx][0], 1, - &pSecConfig->RSNE_Len[rsne_idx], - pSecConfig->RSNE_Len[rsne_idx], - &pSecConfig->RSNE_Content[rsne_idx][0], - END_OF_ARGS); - FrameLen += TmpLen; - } - } - -#if defined(DOT11U_INTERWORKING_IE_SUPPORT) && !defined(CONFIG_HOTSPOT) - if (pAd->ApCfg.MBSSID[apidx].bEnableInterworkingIe == TRUE) { - ULONG TmpLen; - UCHAR InterworkIeLen, InterWorkIe; - PINTERWORKING_IE pInterWorkInfo; - - InterWorkIe = IE_INTERWORKING; - InterworkIeLen = sizeof(*pInterWorkInfo); - pInterWorkInfo = - &pAd->ApCfg.MBSSID[apidx].InterWorkingIe; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &InterWorkIe, 1, &InterworkIeLen, - InterworkIeLen, pInterWorkInfo, - END_OF_ARGS); - FrameLen += TmpLen; - } -#endif /* DOT11U_INTERWORKING_IE_SUPPORT */ - -#if defined(CONFIG_HOTSPOT) || defined(FTM_SUPPORT) - - if (pAd->ApCfg.MBSSID[apidx].GASCtrl.b11U_enable) { - ULONG TmpLen; - /* Interworking element */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx] - .GASCtrl.InterWorkingIELen, - pAd->ApCfg.MBSSID[apidx].GASCtrl.InterWorkingIE, - END_OF_ARGS); - FrameLen += TmpLen; - /* Advertisement Protocol element */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx] - .GASCtrl.AdvertisementProtoIELen, - pAd->ApCfg.MBSSID[apidx] - .GASCtrl.AdvertisementProtoIE, - END_OF_ARGS); - FrameLen += TmpLen; - } - -#endif /* defined(CONFIG_HOTSPOT) || defined(FTM_SUPPORT) */ -#ifdef CONFIG_HOTSPOT - - if (pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.HotSpotEnable) { - ULONG TmpLen; - /* Hotspot 2.0 Indication */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.HSIndicationIELen, - pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.HSIndicationIE, - END_OF_ARGS); - FrameLen += TmpLen; - /* Roaming Consortium element */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.RoamingConsortiumIELen, - pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.RoamingConsortiumIE, - END_OF_ARGS); - FrameLen += TmpLen; - /* P2P element */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.P2PIELen, - pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.P2PIE, - END_OF_ARGS); - FrameLen += TmpLen; - } - -#endif - /* Extended Capabilities IE */ - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_extended_cap_ie(pAd, &ie_info); -#ifdef AP_QLOAD_SUPPORT - - if (pAd->CommonCfg.dbdc_mode == 0) - pQloadCtrl = HcGetQloadCtrl(pAd); - else - pQloadCtrl = - (wdev->channel > 14) ? - HcGetQloadCtrlByRf(pAd, RFIC_5GHZ) : - HcGetQloadCtrlByRf(pAd, RFIC_24GHZ); - - if (pQloadCtrl->FlgQloadEnable != 0) { -#ifdef CONFIG_HOTSPOT_R2 - - if (pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.QLoadTestEnable == 1) - FrameLen += QBSS_LoadElementAppend_HSTEST( - pAd, pOutBuffer + FrameLen, apidx); - else if (pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.QLoadTestEnable == 0) -#endif - FrameLen += QBSS_LoadElementAppend( - pAd, pOutBuffer + FrameLen, pQloadCtrl, - apidx); - } - -#endif /* AP_QLOAD_SUPPORT */ - - /* add WMM IE here */ - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_wmm_cap_ie(pAd, &ie_info); -#ifdef VENDOR_FEATURE7_SUPPORT - /* add country IE, power constraint IE */ - if (pAd->CommonCfg.bCountryFlag || - (wdev->channel > 14 && pAd->CommonCfg.bIEEE80211H == TRUE) -#ifdef DOT11K_RRM_SUPPORT - || IS_RRM_ENABLE(wdev) -#endif /* DOT11K_RRM_SUPPORT */ - ) { -#ifndef EXT_BUILD_CHANNEL_LIST - ULONG TmpLen = 0; -#endif /* !EXT_BUILD_CHANNEL_LIST */ - ULONG TmpLen2 = 0; - UCHAR TmpFrame[256] = { 0 }; -#ifndef EXT_BUILD_CHANNEL_LIST - PCH_DESC pChDesc = NULL; - UINT i; - - if (WMODE_CAP_2G(wdev->PhyMode)) { - if (pAd->CommonCfg.pChDesc2G != NULL) - pChDesc = (PCH_DESC)pAd->CommonCfg - .pChDesc2G; - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: pChDesc2G is NULL !!!\n", - __func__)); - } else if (WMODE_CAP_5G(wdev->PhyMode)) { - if (pAd->CommonCfg.pChDesc5G != NULL) - pChDesc = (PCH_DESC)pAd->CommonCfg - .pChDesc5G; - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: pChDesc5G is NULL !!!\n", - __func__)); - } -#endif /* !EXT_BUILD_CHANNEL_LIST */ - - if (TmpFrame != NULL) { - NdisZeroMemory(TmpFrame, 256); - - /* prepare channel information */ -#ifdef EXT_BUILD_CHANNEL_LIST - BuildBeaconChList(pAd, wdev, TmpFrame, - &TmpLen2); -#else - { - UCHAR MaxTxPower = GetCuntryMaxTxPwr( - pAd, wdev->PhyMode, wdev, - op_ht_bw); - - for (i = 0; - pChDesc[i].FirstChannel != 0; - i++) { - MakeOutgoingFrame( - TmpFrame + TmpLen2, - &TmpLen, 1, - &pChDesc[i].FirstChannel, - 1, &pChDesc[i].NumOfCh, - 1, &MaxTxPower, - END_OF_ARGS); - TmpLen2 += TmpLen; - } - } -#endif /* EXT_BUILD_CHANNEL_LIST */ - -#ifdef A_BAND_SUPPORT - /* - * Only 802.11a APs that comply with 802.11h are required to include - * a Power Constrint Element(IE=32) in beacons and probe response frames - */ - if ((wdev->channel > 14 && - pAd->CommonCfg.bIEEE80211H == TRUE) -#ifdef DOT11K_RRM_SUPPORT - || IS_RRM_ENABLE(wdev) -#endif /* DOT11K_RRM_SUPPORT */ - ) { - - UINT8 PwrConstraintIE = - IE_POWER_CONSTRAINT; - UINT8 PwrConstraintLen = 1; - UINT8 PwrConstraint = - pAd->CommonCfg.PwrConstraint; - /* prepare power constraint IE */ - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TmpLen, 1, - &PwrConstraintIE, 1, - &PwrConstraintLen, 1, - &PwrConstraint, - END_OF_ARGS); - FrameLen += TmpLen; - - /* prepare TPC Report IE */ - InsertTpcReportIE(pAd, - pOutBuffer + FrameLen, - &FrameLen, - GetMaxTxPwr(pAd), 0); -#ifdef DOT11_VHT_AC - if (WMODE_CAP_AC(PhyMode)) { - ULONG TmpLen; - UINT8 vht_txpwr_env_ie = - IE_VHT_TXPWR_ENV; - UINT8 ie_len; - VHT_TXPWR_ENV_IE txpwr_env; - - ie_len = build_vht_txpwr_envelope( - pAd, wdev, - (UCHAR *)&txpwr_env); - MakeOutgoingFrame( - pOutBuffer + FrameLen, - &TmpLen, 1, - &vht_txpwr_env_ie, 1, - &ie_len, ie_len, - &txpwr_env, - END_OF_ARGS); - FrameLen += TmpLen; - } -#endif /* DOT11_VHT_AC */ - } -#endif /* A_BAND_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - if (IS_RRM_ENABLE(wdev)) { - UCHAR reg_class = get_regulatory_class( - pAd, mbss->wdev.channel, - mbss->wdev.PhyMode, - &mbss->wdev); - if (reg_class != 0) { - TmpLen2 = 0; - NdisZeroMemory( - TmpFrame, - sizeof(TmpFrame)); - RguClass_BuildBcnChList( - pAd, TmpFrame, &TmpLen2, - wdev, reg_class); - } - } -#endif /* DOT11K_RRM_SUPPORT */ - - /* add COUNTRY_IE in probe resp frames */ - { - UCHAR CountryIe = IE_COUNTRY; - /* need to do the padding bit check, and concatenate it */ - /* TmpFrame holds Channel list */ - if ((TmpLen2 % 2) == 0) { - UCHAR TmpLen3 = TmpLen2 + 4; - MakeOutgoingFrame( - pOutBuffer + FrameLen, - &TmpLen, 1, &CountryIe, - 1, &TmpLen3, 3, - pAd->CommonCfg - .CountryCode, - TmpLen2 + 1, TmpFrame, - END_OF_ARGS); - } else { - UCHAR TmpLen3 = TmpLen2 + 3; - MakeOutgoingFrame( - pOutBuffer + FrameLen, - &TmpLen, 1, &CountryIe, - 1, &TmpLen3, 3, - pAd->CommonCfg - .CountryCode, - TmpLen2, TmpFrame, - END_OF_ARGS); - } - } - FrameLen += TmpLen; - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", - __func__)); - } -#endif - -#ifdef DOT11K_RRM_SUPPORT - if (IS_RRM_ENABLE(wdev)) { - RRM_InsertRRMEnCapIE(pAd, pOutBuffer + FrameLen, - &FrameLen, apidx); - InsertChannelRepIE( - pAd, pOutBuffer + FrameLen, &FrameLen, - (RTMP_STRING *)pAd->CommonCfg.CountryCode, - get_regulatory_class(pAd, mbss->wdev.channel, - mbss->wdev.PhyMode, - &mbss->wdev), - NULL, PhyMode, wdev->func_idx); -#ifndef APPLE_11K_IOT - /* Insert BSS AC Access Delay IE. */ - RRM_InsertBssACDelayIE(pAd, pOutBuffer + FrameLen, - &FrameLen); - /* Insert BSS Available Access Capacity IE. */ - RRM_InsertBssAvailableACIE(pAd, pOutBuffer + FrameLen, - &FrameLen); -#endif /* !APPLE_11K_IOT */ - } -#endif /* DOT11K_RRM_SUPPORT */ -#ifdef OCE_SUPPORT - if (IS_OCE_ENABLE( - wdev)) { /* some OCE STA may only have files ie(without oce CAP.)*/ - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += oce_build_ies( - pAd, &ie_info, - (MAC_ADDR_EQUAL(ProbeReqParam.Addr1, - BROADCAST_ADDR) && - ProbeReqParam.IsOceCapability)); - } -#endif /* OCE_SUPPORT */ - -#ifndef VENDOR_FEATURE7_SUPPORT - /* add Country IE and power-related IE */ - if (pAd->CommonCfg.bCountryFlag || - (wdev->channel > 14 && pAd->CommonCfg.bIEEE80211H == TRUE) -#ifdef DOT11K_RRM_SUPPORT - || IS_RRM_ENABLE(wdev) -#endif /* DOT11K_RRM_SUPPORT */ - ) { - ULONG TmpLen2 = 0; - UCHAR TmpFrame[256] = { 0 }; - UCHAR CountryIe = IE_COUNTRY; -#ifndef EXT_BUILD_CHANNEL_LIST - PCH_DESC pChDesc = NULL; - - if (WMODE_CAP_2G(wdev->PhyMode)) { - if (pAd->CommonCfg.pChDesc2G != NULL) - pChDesc = (PCH_DESC)pAd->CommonCfg - .pChDesc2G; - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: pChDesc2G is NULL !!!\n", - __func__)); - } else if (WMODE_CAP_5G(wdev->PhyMode)) { - if (pAd->CommonCfg.pChDesc5G != NULL) - pChDesc = (PCH_DESC)pAd->CommonCfg - .pChDesc5G; - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: pChDesc5G is NULL !!!\n", - __func__)); - } -#endif - - /* - Only APs that comply with 802.11h or 802.11k are required to include - the Power Constraint element (IE=32) and - the TPC Report element (IE=35) and - the VHT Transmit Power Envelope element (IE=195) - in beacon frames and probe response frames - */ - if ((wdev->channel > 14 && - pAd->CommonCfg.bIEEE80211H == TRUE) -#ifdef DOT11K_RRM_SUPPORT - || IS_RRM_ENABLE(wdev) -#endif /* DOT11K_RRM_SUPPORT */ - ) { - /* prepare power constraint IE */ - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TmpLen, 3, PowerConstraintIE, - END_OF_ARGS); - FrameLen += TmpLen; - /* prepare TPC Report IE */ - InsertTpcReportIE(pAd, pOutBuffer + FrameLen, - &FrameLen, GetMaxTxPwr(pAd), - 0); -#ifdef DOT11_VHT_AC - - /* prepare VHT Transmit Power Envelope IE */ - if (WMODE_CAP_AC(PhyMode)) { - ULONG TmpLen; - UINT8 vht_txpwr_env_ie = - IE_VHT_TXPWR_ENV; - UINT8 ie_len; - VHT_TXPWR_ENV_IE txpwr_env; - - ie_len = build_vht_txpwr_envelope( - pAd, wdev, (UCHAR *)&txpwr_env); - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TmpLen, 1, - &vht_txpwr_env_ie, 1, - &ie_len, ie_len, - &txpwr_env, - END_OF_ARGS); - FrameLen += TmpLen; - } - -#endif /* DOT11_VHT_AC */ - } - - /* NdisZeroMemory(TmpFrame, sizeof(TmpFrame)); */ -#ifdef EXT_BUILD_CHANNEL_LIST - BuildBeaconChList(pAd, wdev, TmpFrame, &TmpLen2); -#else - { - UINT i = 0; - UCHAR MaxTxPower = GetCuntryMaxTxPwr( - pAd, wdev->PhyMode, wdev, op_ht_bw); - - if (pChDesc != NULL) { - for (i = 0; - pChDesc[i].FirstChannel != 0; - i++) { - MakeOutgoingFrame( - TmpFrame + TmpLen2, - &TmpLen, 1, - &pChDesc[i].FirstChannel, - 1, &pChDesc[i].NumOfCh, - 1, &MaxTxPower, - END_OF_ARGS); - TmpLen2 += TmpLen; - } - } - } -#endif /* EXT_BUILD_CHANNEL_LIST */ -#ifdef DOT11K_RRM_SUPPORT - - if (IS_RRM_ENABLE(wdev)) { - UCHAR reg_class = get_regulatory_class( - pAd, mbss->wdev.channel, - mbss->wdev.PhyMode, &mbss->wdev); - if (reg_class != 0) { - TmpLen2 = 0; - NdisZeroMemory(TmpFrame, - sizeof(TmpFrame)); - RguClass_BuildBcnChList(pAd, TmpFrame, - &TmpLen2, wdev, - reg_class); - } - } - -#endif /* DOT11K_RRM_SUPPORT */ -#ifdef MBO_SUPPORT - if (IS_MBO_ENABLE(wdev)) - Environment = MBO_AP_USE_GLOBAL_OPERATING_CLASS; -#endif /* MBO_SUPPORT */ - /* need to do the padding bit check, and concatenate it */ - if ((TmpLen2 % 2) == 0) { - UCHAR TmpLen3 = TmpLen2 + 4; - - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, 1, - &CountryIe, 1, &TmpLen3, 1, - &pAd->CommonCfg.CountryCode[0], 1, - &pAd->CommonCfg.CountryCode[1], 1, - &Environment, TmpLen2 + 1, TmpFrame, - END_OF_ARGS); - } else { - UCHAR TmpLen3 = TmpLen2 + 3; - - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, 1, - &CountryIe, 1, &TmpLen3, 1, - &pAd->CommonCfg.CountryCode[0], 1, - &pAd->CommonCfg.CountryCode[1], 1, - &Environment, TmpLen2, TmpFrame, - END_OF_ARGS); - } - - FrameLen += TmpLen; - } /* Country IE - */ -#endif -#ifdef A_BAND_SUPPORT - /* add Channel switch announcement IE */ - if (((wdev->channel > 14) && - (pAd->CommonCfg.bIEEE80211H == 1) && - (pDot11h->RDMode == RD_SWITCHING_MODE)) -#ifdef CUSTOMER_DCC_FEATURE - || (pAd->CommonCfg.channelSwitch.CHSWMode == - CHANNEL_SWITCHING_MODE) -#endif - ) { - - UCHAR CSAIe = IE_CHANNEL_SWITCH_ANNOUNCEMENT; - UCHAR CSALen = 3; - UCHAR CSAMode = 1; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &CSAIe, 1, &CSALen, 1, &CSAMode, 1, - &wdev->channel, 1, &pDot11h->CSCount, - END_OF_ARGS); - FrameLen += TmpLen; -#ifdef DOT11_N_SUPPORT - - if (pAd->CommonCfg.bExtChannelSwitchAnnouncement) { - HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE - HtExtChannelSwitchIe; - - build_ext_channel_switch_ie( - pAd, &HtExtChannelSwitchIe, - wdev->channel, wdev->PhyMode, wdev); - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE), - &HtExtChannelSwitchIe, END_OF_ARGS); - FrameLen += TmpLen; - } - -#endif /* DOT11_N_SUPPORT */ - } - -#endif /* A_BAND_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(PhyMode) && - (wdev->DesiredHtPhyInfo.bHtEnable)) { -#ifdef DOT11_VHT_AC - struct _build_ie_info vht_ie_info; -#endif /*DOT11_VHT_AC*/ - if (pAd->bBroadComHT == TRUE) { - struct _build_ie_info ie_info; - - ie_info.frame_subtype = SUBTYPE_PROBE_RSP; - ie_info.channel = wdev->channel; - ie_info.phy_mode = wdev->PhyMode; - ie_info.wdev = wdev; - ie_info.is_draft_n_type = TRUE; - ie_info.frame_buf = - (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_ht_ies(pAd, &ie_info); - } -#ifdef DOT11_VHT_AC - vht_ie_info.frame_buf = - (UCHAR *)(pOutBuffer + FrameLen); - vht_ie_info.frame_subtype = SUBTYPE_PROBE_RSP; - vht_ie_info.channel = wdev->channel; - vht_ie_info.phy_mode = wdev->PhyMode; - vht_ie_info.wdev = wdev; -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - ucETxBfCap = wlan_config_get_etxbf(wdev); - - if (HcIsBfCapSupport(wdev) == FALSE) - wlan_config_set_etxbf(wdev, SUBF_OFF); - -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ - FrameLen += build_vht_ies(pAd, &vht_ie_info); -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - wlan_config_set_etxbf(wdev, ucETxBfCap); -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ -#endif /* DOT11_VHT_AC */ - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef WSC_INCLUDED - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_wsc_ie(pAd, &ie_info); -#endif /* WSC_INCLUDED */ -#ifdef DOT11R_FT_SUPPORT - - /* The Mobility Domain information element (MDIE) is present in Probe- - ** Request frame when dot11FastBssTransitionEnable is set to true. */ - if (pAd->ApCfg.MBSSID[apidx] - .wdev.FtCfg.FtCapFlag.Dot11rFtEnable) { - PFT_CFG pFtCfg = &pAd->ApCfg.MBSSID[apidx].wdev.FtCfg; - FT_CAP_AND_POLICY FtCap; - - FtCap.field.FtOverDs = pFtCfg->FtCapFlag.FtOverDs; - FtCap.field.RsrReqCap = pFtCfg->FtCapFlag.RsrReqCap; - FT_InsertMdIE(pAd, pOutBuffer + FrameLen, &FrameLen, - pFtCfg->FtMdId, FtCap); - } - -#endif /* DOT11R_FT_SUPPORT */ -#if defined(WAPP_SUPPORT) && defined(CONFIG_MAP_SUPPORT) - if (IS_MAP_ENABLE(pAd) && wdev->MAPCfg.vendor_ie_len) { - ULONG MAPIeTmpLen = 0; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &MAPIeTmpLen, - wdev->MAPCfg.vendor_ie_len, - wdev->MAPCfg.vendor_ie_buf, - END_OF_ARGS); - FrameLen += MAPIeTmpLen; - } -#endif - /* - add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back - Byte0.b3=1 for rssi-feedback - */ - FrameLen += build_vendor_ie(pAd, wdev, (pOutBuffer + FrameLen), - VIE_PROBE_RESP); -#ifdef MBO_SUPPORT - if (IS_MBO_ENABLE(wdev) -#ifdef OCE_SUPPORT - || IS_OCE_ENABLE(wdev) -#endif /* OCE_SUPPORT */ - ) - MakeMboOceIE(pAd, wdev, NULL, pOutBuffer + FrameLen, - &FrameLen, MBO_FRAME_TYPE_PROBE_RSP); -#endif /* MBO_SUPPORT */ - { - /* Question to Rorscha: bit4 in old chip is used? but currently is using for 2.4G 256QAM */ -#ifdef RSSI_FEEDBACK - UCHAR RalinkSpecificIe[9] = { IE_VENDOR_SPECIFIC, - 7, - 0x00, - 0x0c, - 0x43, - 0x00, - 0x00, - 0x00, - 0x00 }; - ULONG TmpLen; - - if (ProbeReqParam.bRequestRssi == TRUE) { - MAC_TABLE_ENTRY *pEntry = NULL; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("SYNC - Send PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\n", - PRINT_MAC(ProbeReqParam.Addr2))); - RalinkSpecificIe[5] |= 0x8; - pEntry = MacTableLookup(pAd, - ProbeReqParam.Addr2); - - if (pEntry != NULL) { - RalinkSpecificIe[6] = - (UCHAR)pEntry->RssiSample - .AvgRssi[0]; - RalinkSpecificIe[7] = - (UCHAR)pEntry->RssiSample - .AvgRssi[1]; - RalinkSpecificIe[8] = - (UCHAR)pEntry->RssiSample - .AvgRssi[2]; - } - } - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 9, - RalinkSpecificIe, END_OF_ARGS); - FrameLen += TmpLen; -#endif /* RSSI_FEEDBACK */ - } - -#ifdef IGMP_TVM_SUPPORT - /* Add TV IE to this packet */ - MakeTVMIE(pAd, wdev, pOutBuffer, &FrameLen); -#endif /* IGMP_TVM_SUPPORT */ - - /* 802.11n 11.1.3.2.2 active scanning. sending probe response with MCS rate is */ - /* Confure to better support Multi-Sta */ - { - struct _RTMP_CHIP_CAP *cap = - hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 idx = 0; - UINT8 num = cap->ProbeRspTimes; - - /* solve the problem of STA connection slow under multiple BSS conditions */ - /* 8 is experience value, you can modify it */ - num = (pAd->ApCfg.BssidNum >= 8) ? 1 : num; - for (idx = 0; idx < num; idx++) - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - } - MlmeFreeMemory(pOutBuffer); - } -} - -/* - ========================================================================== - Description: - parse the received BEACON - - NOTE: - The only thing AP cares about received BEACON frames is to decide - if there's any overlapped legacy BSS condition (OLBC). - If OLBC happened, this AP should set the ERP->Use_Protection bit in its - outgoing BEACON. The result is to tell all its clients to use RTS/CTS - or CTS-to-self protection to protect B/G mixed traffic - ========================================================================== - */ - -struct { - ULONG count; - UCHAR bssid[MAC_ADDR_LEN]; -} BSSIDENTRY; - -#ifdef CUSTOMER_DCC_FEATURE -VOID APChannelSwitch(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt) -{ - UCHAR apIdx; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; - UCHAR apOper = AP_BSS_OPER_ALL; - struct DOT11_H *pDot11h = NULL; - UCHAR op_ht_bw; - UCHAR ext_ch; - - NdisMoveMemory(&apIdx, CMDQelmt->buffer, sizeof(UCHAR)); - - /* check apidx valid */ - if (apIdx != 0xff) { - pMbss = &pAd->ApCfg.MBSSID[apIdx]; - apOper = AP_BSS_OPER_BY_RF; - } - - if (pMbss == NULL) - return; - pDot11h = pMbss->wdev.pDot11_H; - if (pDot11h == NULL) - return; - /* Normal DFS */ -#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) - if (pMbss->wdev.channel >= 36) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[1;33m [%s] 2 \x1b[m\n", __func__)); -#ifdef ONDEMAND_DFS - if (IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(pAd)) - DedicatedZeroWaitStop(pAd, TRUE); - else -#endif - DedicatedZeroWaitStop(pAd, FALSE); - } -#endif - pDot11h->RDMode = RD_SILENCE_MODE; - op_ht_bw = wlan_config_get_ht_bw(&pMbss->wdev); - ext_ch = wlan_config_get_ext_cha(&pMbss->wdev); - wlan_config_set_ht_bw(&pMbss->wdev, op_ht_bw); - wlan_operate_set_ht_bw(&pMbss->wdev, op_ht_bw, ext_ch); - wlan_operate_set_prim_ch(&pMbss->wdev, pMbss->wdev.channel); - SetCommonHtVht(pAd, &pMbss->wdev); - APStop(pAd, pMbss, apOper); -#ifdef MT_DFS_SUPPORT - if (pMbss->wdev.channel >= 36) - if (DfsStopWifiCheck(pAd)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s] Stop AP Startup\n", __func__)); - return; - } -#endif - APStartUp(pAd, pMbss, apOper); -#ifdef MT_DFS_SUPPORT - if (pMbss->wdev.channel >= 36) { - if (pAd->CommonCfg.dbdc_mode) - MtCmdSetDfsTxStart(pAd, HcGetBandByWdev(&pMbss->wdev)); - else - MtCmdSetDfsTxStart(pAd, DBDC_BAND0); - DfsSetCacRemainingTime(pAd, &pMbss->wdev); - DfsReportCollision(pAd); -#ifdef BACKGROUND_SCAN_SUPPORT - DfsDedicatedScanStart(pAd); -#endif - } -#endif - return; -} -#endif - -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE -INT RTMPV10AvgRssi(RTMP_ADAPTER *pAd, RSSI_SAMPLE *pRssi, UCHAR channel) -{ - INT Rssi; - UINT32 rx_stream; - BOOLEAN isDbdc2G = FALSE; - - rx_stream = pAd->Antenna.field.RxPath; - - /* single chip dbdc only has 2 functional antennae*/ - if (pAd->CommonCfg.dbdc_mode == TRUE && rx_stream == 4) - rx_stream = 2; - - /* Antenna Selection for 2G/5G in DBDC Mode */ - if (pAd->CommonCfg.dbdc_mode == TRUE && channel <= 14) - isDbdc2G = TRUE; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s]: DBDC %d Channel %d RX %d\n", __func__, - pAd->CommonCfg.dbdc_mode, channel, rx_stream)); - - if (rx_stream == 4) - Rssi = (pRssi->AvgRssi[0] + pRssi->AvgRssi[1] + - pRssi->AvgRssi[2] + pRssi->AvgRssi[3]) >> - 2; - else if (rx_stream == 3) - Rssi = (pRssi->AvgRssi[0] + pRssi->AvgRssi[1] + - pRssi->AvgRssi[2]) / - 3; - else if (rx_stream == 2 && (isDbdc2G || !(pAd->CommonCfg.dbdc_mode))) - /* Normal RX Stream 2 or DBDC 2G */ - Rssi = (pRssi->AvgRssi[0] + pRssi->AvgRssi[1]) >> 1; - else if (rx_stream == 2 && (!isDbdc2G && pAd->CommonCfg.dbdc_mode)) - /* DBDC 5G */ - Rssi = (pRssi->AvgRssi[2] + pRssi->AvgRssi[3]) >> 1; - else - Rssi = pRssi->AvgRssi[0]; - - return Rssi; -} - -VOID Vendor10RssiUpdate(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN BOOLEAN isBcn, IN INT RealRssi) -{ - if (isBcn) { - /* Peer AP Beacon & Normal Operation (No Scannning) */ - if (!pEntry || !pEntry->wdev) - return; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s]: Bcn Mac Address %02X:%02X:%02X:%02X:%02X:%02X\n", - __func__, PRINT_MAC(pEntry->Addr))); - - /* Continuous Averaging */ - pEntry->CurRssi += RealRssi; - pEntry->CurRssi >>= 1; - } else { - CHAR RSSI[4]; - INT AvgRssi; - UINT i; - - /* WTBL RSSI Peridic Update */ - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if ((IS_VALID_ENTRY(pEntry)) && - (IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry)) && - (pEntry->func_tb_idx < MAX_APCLI_NUM)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s]: Mlme Mac Address %02X:%02X:%02X:%02X:%02X:%02X\n", - __func__, PRINT_MAC(pEntry->Addr))); - - /* RSSI fetch from WTBL */ - MtRssiGet(pAd, pEntry->wcid, &RSSI[0]); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s]: R0 %d R1 %d R2 %d R3 %d\n", - __func__, RSSI[0], RSSI[1], RSSI[2], - RSSI[3])); - - pEntry->RssiSample.AvgRssi[0] = RSSI[0]; - pEntry->RssiSample.AvgRssi[1] = RSSI[1]; - pEntry->RssiSample.AvgRssi[2] = RSSI[2]; - pEntry->RssiSample.AvgRssi[3] = RSSI[3]; - - AvgRssi = - RTMPV10AvgRssi(pAd, &pEntry->RssiSample, - pEntry->wdev->channel); - - /* Continuous Averaging */ - pEntry->CurRssi += AvgRssi; - pEntry->CurRssi >>= 1; - } - } - } -} -#endif - -VOID APPeerBeaconAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ - UCHAR Rates[MAX_LEN_OF_SUPPORTED_RATES], *pRates = NULL, RatesLen; - BOOLEAN LegacyBssExist; - CHAR RealRssi; - UCHAR *VarIE = NULL; - USHORT LenVIE; - NDIS_802_11_VARIABLE_IEs *pVIE = NULL; - UCHAR MaxSupportedRate = 0; - BCN_IE_LIST *ie_list = NULL; - PMAC_TABLE_ENTRY pEntry = NULL; - UCHAR Channel = 0; -#ifdef OCE_SUPPORT - struct wifi_dev *wdev = Elem->wdev; - P_OCE_CTRL pOceCtrl = &wdev->OceCtrl; - int OceBOnlyPresentOldValue; -#endif /* OCE_SUPPORT */ - struct freq_oper oper; -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - INT32 ifIndex = pObj->ioctl_if; -#ifdef OCE_SUPPORT - wdev = NULL; -#else - struct wifi_dev *wdev = NULL; -#endif - - if ((pObj->ioctl_if_type == INT_APCLI) && (ifIndex <= MAX_APCLI_NUM)) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; -#endif - - RETURN_IF_PAD_NULL(pAd); - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST)); - - if (ie_list == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate ie_list fail!!!\n", __func__)); - goto LabelErr; - } - - NdisZeroMemory(ie_list, sizeof(BCN_IE_LIST)); - /* Init Variable IE structure */ - os_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN); - - if (VarIE == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate VarIE fail!!!\n", __func__)); - goto LabelErr; - } - - pVIE = (PNDIS_802_11_VARIABLE_IEs)VarIE; - pVIE->Length = 0; - pRates = (PUCHAR)Rates; - /* Init the DUT's working channel from RX'D param first, actually we need to get the accurate Channel from wdev */ - Channel = Elem->Channel; - /* PeerBeaconAndProbeRspSanity() may overwrite ie_list->Channel if beacon or probe resp contain IE_DS_PARM */ - ie_list->Channel = Elem->Channel; - RealRssi = RTMPMaxRssi(pAd, - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0), - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1), - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3) -#endif - - ); - - if (PeerBeaconAndProbeRspSanity(pAd, Elem->wdev, Elem->Msg, - Elem->MsgLen, Elem->Channel, ie_list, - &LenVIE, pVIE, FALSE, FALSE)) { - if (VALID_UCAST_ENTRY_WCID(pAd, Elem->Wcid)) { - pEntry = MacTableLookup( - pAd, - ie_list->Addr2); /* Found the pEntry from Peer Bcn Content */ - - if (!pEntry || !pEntry->wdev) - goto __End_Of_APPeerBeaconAction; - - Channel = pEntry->wdev->channel; - } - - hc_radio_query_by_channel(pAd, Channel, &oper); -#ifdef APCLI_SUPPORT -#ifdef FOLLOW_HIDDEN_SSID_FEATURE - ApCliCheckPeerExistence(pAd, ie_list->Ssid, ie_list->SsidLen, - ie_list->Bssid, ie_list->Channel); -#else - ApCliCheckPeerExistence(pAd, ie_list->Ssid, ie_list->SsidLen, - ie_list->Channel); -#endif -#endif /* APCLI_SUPPORT */ - - /* ignore BEACON not in this channel */ - if (ie_list->Channel != Channel -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - && (pAd->CommonCfg.bOverlapScanning == FALSE) -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ -#ifdef CFG80211_MULTI_STA - && (!RTMP_CFG80211_MULTI_STA_ON( - pAd, pAd->cfg80211_ctrl.multi_sta_net_dev)) -#endif /* CFG80211_MULTI_STA */ - ) - goto __End_Of_APPeerBeaconAction; - -#ifdef IDS_SUPPORT - /* Conflict SSID detection */ - RTMPConflictSsidDetection(pAd, (PUCHAR)ie_list->Ssid, - ie_list->SsidLen, - (CHAR)Elem->rssi_info.raw_rssi[0], - (CHAR)Elem->rssi_info.raw_rssi[1], - (CHAR)Elem->rssi_info.raw_rssi[2] -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - (CHAR)Elem->rssi_info.raw_rssi[3] -#endif - - ); -#endif /* IDS_SUPPORT */ - -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) -#if defined(CUSTOMER_DCC_FEATURE) - if (pEntry && (ie_list->Channel == pEntry->wdev->channel) && - (pAd->ApEnableBeaconTable == TRUE)) -#elif defined(CONFIG_MAP_SUPPORT) - if (IS_MAP_TURNKEY_ENABLE(pAd) && - ie_list->vendor_ie.map_vendor_ie_found == TRUE - /*&& map_ssid_match(pAd, ie_list)*/) -#endif - { - ULONG Idx; - CHAR Rssi = -127; - UCHAR Snr[4] = { 0 }; - UCHAR SNR[4] = { 0 }; - CHAR rssi[4] = { 0 }; - - SNR[0] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[0]); - SNR[1] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[1]); - SNR[2] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[2]); - SNR[3] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[3]); - - Idx = BssTableSearch(&pAd->AvailableBSS, ie_list->Bssid, - ie_list->Channel); - if (Idx != BSS_NOT_FOUND) { - Rssi = pAd->AvailableBSS.BssEntry[Idx].Rssi; - Snr[0] = pAd->AvailableBSS.BssEntry[Idx].Snr[0]; - Snr[1] = pAd->AvailableBSS.BssEntry[Idx].Snr[1]; - Snr[2] = pAd->AvailableBSS.BssEntry[Idx].Snr[2]; - Snr[3] = pAd->AvailableBSS.BssEntry[Idx].Snr[3]; - } - rssi[0] = ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_0); - rssi[1] = ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_1); - rssi[2] = ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_2); - rssi[3] = ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_3); - - RealRssi = RTMPMaxRssi(pAd, rssi[0], rssi[1], rssi[2], - rssi[3]); - RealRssi = RealRssi + pAd->BbpRssiToDbmDelta; - - if (Rssi == -127) - Rssi = RealRssi; - else - Rssi = (((Rssi * (MOV_AVG_CONST - 1)) + - RealRssi) >> - MOV_AVG_CONST_SHIFT); - -#ifdef CONFIG_MAP_SUPPORT - if (Idx != BSS_NOT_FOUND) { - BSS_ENTRY *pBss = - &pAd->AvailableBSS.BssEntry[Idx]; - - pBss->rx_cnt++; - pBss->rssi_sum += RealRssi; - if (pBss->rx_cnt <= 0) { - pBss->rssi_sum = RealRssi; - pBss->rx_cnt = 1; - } - pBss->avg_rssi = (INT8)((pBss->rssi_sum) / - (INT32)(pBss->rx_cnt)); - Rssi = pBss->avg_rssi; - } -#endif - Snr[0] = (Snr[0] == 0) ? - SNR[0] : - (((Snr[0] * (MOV_AVG_CONST - 1)) + - SNR[0]) >> - MOV_AVG_CONST_SHIFT); - Snr[1] = (Snr[1] == 0) ? - SNR[1] : - (((Snr[1] * (MOV_AVG_CONST - 1)) + - SNR[1]) >> - MOV_AVG_CONST_SHIFT); - Snr[2] = (Snr[2] == 0) ? - SNR[2] : - (((Snr[2] * (MOV_AVG_CONST - 1)) + - SNR[2]) >> - MOV_AVG_CONST_SHIFT); - Snr[3] = (Snr[3] == 0) ? - SNR[3] : - (((Snr[3] * (MOV_AVG_CONST - 1)) + - SNR[3]) >> - MOV_AVG_CONST_SHIFT); - - Idx = BssTableSetEntry(pAd, &pAd->AvailableBSS, ie_list, - Rssi, LenVIE, pVIE, Snr, rssi); - - if (Idx != BSS_NOT_FOUND) { - NdisMoveMemory( - pAd->AvailableBSS.BssEntry[Idx].PTSF, - &Elem->Msg[24], 4); - NdisMoveMemory( - &pAd->AvailableBSS.BssEntry[Idx].TTSF[0], - &Elem->TimeStamp.u.LowPart, 4); - NdisMoveMemory( - &pAd->AvailableBSS.BssEntry[Idx].TTSF[4], - &Elem->TimeStamp.u.LowPart, 4); - } - } -#endif - -#ifdef DOT11_N_SUPPORT - - /* 40Mhz BSS Width Trigger events Intolerant devices */ -#ifdef BW_VENDOR10_CUSTOM_FEATURE - /* Soft AP to follow BW of Root AP */ - if ((IS_APCLI_BW_SYNC_FEATURE_ENBL(pAd) == FALSE) && - (RealRssi > OBSS_BEACON_RSSI_THRESHOLD) && - (ie_list->HtCapability.HtCapInfo.Forty_Mhz_Intolerant)) -#else - if ((RealRssi > OBSS_BEACON_RSSI_THRESHOLD) && - (ie_list->HtCapability.HtCapInfo - .Forty_Mhz_Intolerant)) /* || (HtCapabilityLen == 0))) */ -#endif - Handle_BSS_Width_Trigger_Events(pAd, Channel); - -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - if (Channel <= 14 && (oper.ht_bw == HT_BW_40) -#ifdef DOT11N_DRAFT3 - && (pAd->CommonCfg.bOverlapScanning == FALSE) -#endif /* DOT11N_DRAFT3 */ - ) { -#if defined(P2P_SUPPORT) || defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || \ - defined(CFG80211_MULTI_STA) - - if (OPSTATUS_TEST_FLAG( - pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED) && - RTMP_CFG80211_MULTI_STA_ON( - pAd, - pAd->cfg80211_ctrl.multi_sta_net_dev)) { - if (ie_list->Channel != Channel) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("Channel=%d is not equal as band Channel = %d.\n", - ie_list->Channel, Channel)); - } - } else -#endif /* P2P_SUPPORT || RT_CFG80211_P2P_CONCURRENT_DEVICE */ - if (((oper.cen_ch_1 + 2) != ie_list->Channel) && - ((oper.cen_ch_1 - 2) != ie_list->Channel)) { - /* - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%02x:%02x:%02x:%02x:%02x:%02x is a legacy BSS (%d)\n", - Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5], Channel)); - */ - /* EZ_DEBUG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,("APPeerBeaconAction 4\n")); */ - /* EZ_DEBUG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,("Central channel = %d\n", HcGetCentralChByRf(pAd,RFIC_24GHZ))); */ - goto __End_Of_APPeerBeaconAction; - } - } else { - if (ie_list->Channel != Channel) - goto __End_Of_APPeerBeaconAction; - } - -#endif /* DOT11_N_SUPPORT */ - SupportRate(ie_list->SupRate, ie_list->SupRateLen, - ie_list->ExtRate, ie_list->ExtRateLen, &pRates, - &RatesLen, &MaxSupportedRate); - - if ((ie_list->Erp & 0x01) || (RatesLen <= 4)) - LegacyBssExist = TRUE; - else - LegacyBssExist = FALSE; - -#ifdef OCE_SUPPORT - if (!pOceCtrl->Scan11bOceAPTimerRunning) { - if (WMODE_CAP_2G(wdev->PhyMode) && RatesLen <= 4) { - OceBOnlyPresentOldValue = OCE_GET_CONTROL_FIELD( - pOceCtrl->OceCapIndication, - OCE_11B_ONLY_PRESENT_MASK, - OCE_11B_ONLY_PRESENT_OFFSET); - OCE_SET_CONTROL_FIELD( - pOceCtrl->OceCapIndication, 1, - OCE_11B_ONLY_PRESENT_MASK, - OCE_11B_ONLY_PRESENT_OFFSET); - - if (OceBOnlyPresentOldValue != - OCE_GET_CONTROL_FIELD( - pOceCtrl->OceCapIndication, - OCE_11B_ONLY_PRESENT_MASK, - OCE_11B_ONLY_PRESENT_OFFSET)) - OceSendFilsDiscoveryAction(pAd, wdev); - } - RTMPSetTimer(&pOceCtrl->Scan11bOceAPTimer, - OCE_SCAN_11BOCEAP_PERIOD_TIME); - pOceCtrl->Scan11bOceAPTimerRunning = TRUE; - } -#endif - - if (LegacyBssExist && pAd->CommonCfg.DisableOLBCDetect == 0) { - pAd->ApCfg.LastOLBCDetectTime = pAd->Mlme.Now32; - } - -#ifdef DOT11_N_SUPPORT - - if ((ie_list->HtCapabilityLen == 0) && - (RealRssi > OBSS_BEACON_RSSI_THRESHOLD)) { - pAd->ApCfg.LastNoneHTOLBCDetectTime = pAd->Mlme.Now32; - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef APCLI_SUPPORT - - if (VALID_UCAST_ENTRY_WCID(pAd, Elem->Wcid)) { - pEntry = &pAd->MacTab.Content[Elem->Wcid]; - - if (pEntry && - (IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry)) && - (pEntry->func_tb_idx < MAX_APCLI_NUM)) { - PAPCLI_STRUCT pApCliEntry = NULL; - -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE - if (wdev && IS_VENDOR10_RSSI_VALID(wdev)) { - /* Skip Scanning & Look for Peer Beacons only */ - pEntry->RssiSample.AvgRssi[0] = - ConvertToRssi(pAd, - &Elem->rssi_info, - RSSI_IDX_0); - pEntry->RssiSample.AvgRssi[1] = - ConvertToRssi(pAd, - &Elem->rssi_info, - RSSI_IDX_1); - pEntry->RssiSample.AvgRssi[2] = - ConvertToRssi(pAd, - &Elem->rssi_info, - RSSI_IDX_2); - pEntry->RssiSample.AvgRssi[3] = - ConvertToRssi(pAd, - &Elem->rssi_info, - RSSI_IDX_3); - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s]: R0 %d R1 %d R2 %d R3 %d\n", - __func__, - pEntry->RssiSample.AvgRssi[0], - pEntry->RssiSample.AvgRssi[1], - pEntry->RssiSample.AvgRssi[2], - pEntry->RssiSample.AvgRssi[3])); - - Vendor10RssiUpdate( - pAd, pEntry, TRUE, - RTMPV10AvgRssi( - pAd, - &pEntry->RssiSample, - Channel)); - } -#endif - - pApCliEntry = - &pAd->ApCfg - .ApCliTab[pEntry->func_tb_idx]; - pApCliEntry->ApCliRcvBeaconTime = - pAd->Mlme.Now32; - AdjustBwToSyncAp(pAd, ie_list, - pApCliEntry->MacTabWCID, - pEntry->func_tb_idx); - ApCliCheckConConnectivity(pAd, pApCliEntry, - ie_list); - -#ifdef APCLI_CERT_SUPPORT - if (pAd->bApCliCertTest == TRUE) { - UCHAR RegClass; - OVERLAP_BSS_SCAN_IE BssScan; - BOOLEAN brc; -#ifdef DOT11_N_SUPPORT - ADD_HT_INFO_IE *aux_add_ht = - &pApCliEntry->MlmeAux.AddHtInfo; - ADD_HT_INFO_IE *addht; - BOOLEAN bNonGFExist = - (aux_add_ht->AddHtInfo2 - .NonGfPresent) ? - TRUE : - FALSE; - UINT16 OperationMode = - aux_add_ht->AddHtInfo2 - .OperaionMode; -#endif /* DOT11_N_SUPPORT */ - - brc = PeerBeaconAndProbeRspSanity2( - pAd, Elem->Msg, Elem->MsgLen, - &BssScan, &RegClass); - - if (brc == TRUE) { - pAd->CommonCfg - .Dot11BssWidthTriggerScanInt = - le2cpu16( - BssScan.TriggerScanInt); /*APBssScan.TriggerScanInt[1] * 256 + APBssScan.TriggerScanInt[0];*/ - - /*DBGPRINT(RT_DEBUG_ERROR,("Update Dot11BssWidthTriggerScanInt=%d\n", pAd->CommonCfg.Dot11BssWidthTriggerScanInt)); */ - /* out of range defined in MIB... So fall back to default value.*/ - if ((pAd->CommonCfg - .Dot11BssWidthTriggerScanInt < - 10) || - (pAd->CommonCfg - .Dot11BssWidthTriggerScanInt > - 900)) - pAd->CommonCfg - .Dot11BssWidthTriggerScanInt = - 900; - } -#ifdef DOT11_N_SUPPORT - /* check Ht protection mode. and adhere to the Non-GF device indication by AP. */ - if (ie_list->AddHtInfoLen != 0) { - if ((ie_list->AddHtInfo - .AddHtInfo2 - .OperaionMode != - OperationMode) || - (ie_list->AddHtInfo - .AddHtInfo2 - .NonGfPresent != - bNonGFExist)) { - aux_add_ht->AddHtInfo2 - .OperaionMode = - ie_list->AddHtInfo - .AddHtInfo2 - .OperaionMode; - aux_add_ht->AddHtInfo2 - .NonGfPresent = - ie_list->AddHtInfo - .AddHtInfo2 - .NonGfPresent; - - pApCliEntry->wdev - .protection = SET_PROTECT( - ie_list->AddHtInfo - .AddHtInfo2 - .OperaionMode); - - OperationMode = - aux_add_ht - ->AddHtInfo2 - .OperaionMode; - bNonGFExist = - (aux_add_ht - ->AddHtInfo2 - .NonGfPresent) ? - TRUE : - FALSE; - - if (bNonGFExist) { - pApCliEntry->wdev - .protection |= - SET_PROTECT( - GREEN_FIELD_PROTECT); - } else { - pApCliEntry->wdev - .protection &= - ~(SET_PROTECT( - GREEN_FIELD_PROTECT)); - } - - if (pApCliEntry->wdev - .channel > - 14) { - /* always no BG protection in A-band. - * falsely happened when switching A/G band to a dual-band AP */ - pApCliEntry->wdev - .protection &= - ~(SET_PROTECT( - ERP)); - } - addht = wlan_operate_get_addht( - &pApCliEntry - ->wdev); - if (addht) { /* sync addht information into wlan operation addht */ - *addht = - pApCliEntry - ->MlmeAux - .AddHtInfo; - } - - AsicUpdateProtect(pAd); - - MTWF_LOG( - DBG_CAT_CLIENT, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("SYNC - AP changed N OperaionMode to %d, my protection to %d\n", - OperationMode, - pApCliEntry - ->wdev - .protection)); - } - } -#endif /* DOT11_N_SUPPORT */ - } -#endif /* APCLI_CERT_SUPPORT */ - } - - if (pEntry && ie_list->NewChannel != 0) { -#ifdef CONFIG_RCSA_SUPPORT - if (pAd->CommonCfg.DfsParameter.bRCSAEn) { - pAd->CommonCfg.DfsParameter.fSendRCSA = - FALSE; - ChannelSwitchAction_1( - pAd, &ie_list->CsaInfo); - } else -#endif - ApCliPeerCsaAction(pAd, pEntry->wdev, - ie_list); - } - } - -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - - if (pAd->WdsTab.Mode != WDS_DISABLE_MODE) { - if (pAd->WdsTab.flg_wds_init) { - MAC_TABLE_ENTRY *pEntry; - BOOLEAN bWmmCapable; - /* check BEACON does in WDS TABLE. */ - pEntry = WdsTableLookup(pAd, ie_list->Addr2, - FALSE); - bWmmCapable = - ie_list->EdcaParm.bValid ? TRUE : FALSE; - - if (pEntry && - (pEntry->bAutoTxRateSwitch == TRUE)) - WdsPeerBeaconProc(pAd, pEntry, - MaxSupportedRate, - RatesLen, bWmmCapable, - ie_list); - } else - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(), ERROR!! Beacon comes before wds_init\n", - __func__)); - } - -#endif /* WDS_SUPPORT */ - if (Elem->wdev != NULL) { - bss_coex_insert_effected_ch_list(pAd, Channel, ie_list, - Elem->wdev); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(), Elem->wdev = NULL\n", __func__)); - } - } - - /* sanity check fail, ignore this frame */ -__End_Of_APPeerBeaconAction: - /*#ifdef AUTO_CH_SELECT_ENHANCE */ -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - UCHAR BandIdx = BAND0; - AUTO_CH_CTRL *pAutoChCtrl = NULL; - if (ie_list->Channel == pAd->ApCfg.AutoChannel_Channel) { - if (Elem->wdev != NULL) - BandIdx = HcGetBandByWdev(Elem->wdev); - else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(), Elem->wdev = NULL\n", - __func__)); - - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - if (pAutoChCtrl->pChannelInfo && - AutoChBssSearchWithSSID( - pAd, ie_list->Bssid, (PUCHAR)ie_list->Ssid, - ie_list->SsidLen, ie_list->Channel, - Elem->wdev) == BSS_NOT_FOUND) - pAutoChCtrl->pChannelInfo->ApCnt - [pAd->ApCfg.current_channel_index]++; - - AutoChBssInsertEntry(pAd, ie_list->Bssid, ie_list->Ssid, - ie_list->SsidLen, ie_list->Channel, - ie_list->NewExtChannelOffset, - RealRssi, Elem->wdev); - } - } -#endif /* CONFIG_AP_SUPPORT */ - /*#endif // AUTO_CH_SELECT_ENHANCE */ -LabelErr: - - if (VarIE != NULL) - os_free_mem(VarIE); - - if (ie_list != NULL) - os_free_mem(ie_list); -} - -#ifdef AP_SCAN_SUPPORT -/* - ========================================================================== - Description: - ========================================================================== - */ -VOID APInvalidStateWhenScan(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AYNC - InvalidStateWhenScan(state=%ld). Reset SYNC machine\n", - pAd->Mlme.ApSyncMachine.CurrState)); -} - -/* - ========================================================================== - Description: - Scan timeout handler, executed in timer thread - ========================================================================== - */ -VOID APScanTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)FunctionContext; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AP SYNC - Scan Timeout\n")); - MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_SCAN_TIMEOUT, 0, NULL, - (ULONG)pAd->ApCfg.ScanReqwdev); - RTMP_MLME_HANDLER(pAd); -} - -/* - ========================================================================== - Description: - Scan timeout procedure. basically add channel index by 1 and rescan - ========================================================================== - */ -VOID APScanTimeoutAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ -#ifdef NEIGHBORING_AP_STAT - UCHAR idx, bandidx, index, lastChannel = pAd->ScanCtrl.Channel; - INT32 crVal, temp[11], total; - SCAN_RPI_HIST *rpiData; - UINT32 band_offset; - INT16 NF_Power[11] = { -92, -89, -86, -83, -80, -75, - -70, -65, -60, -55, -52 }; - INT32 xNF = 0; -#endif -#ifdef MAP_R2 - UINT32 CrValue; -#endif -#ifdef OFFCHANNEL_SCAN_FEATURE - OFFCHANNEL_SCAN_MSG Rsp; - - if (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_START) { - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s pAd->ScanCtrl.CurrentGivenChan_Index = %d\n", - __func__, pAd->ScanCtrl.CurrentGivenChan_Index)); - /* Last channel to scan from list */ - if ((pAd->ScanCtrl.Num_Of_Channels - - pAd->ScanCtrl.CurrentGivenChan_Index) == 1) { - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s][%d] Num_of_channel = %d scanning complete\n", - __func__, __LINE__, - pAd->ScanCtrl.Num_Of_Channels)); - pAd->ScanCtrl.Channel = 0; - pAd->ScanCtrl.state = OFFCHANNEL_SCAN_COMPLETE; - } - } else { -#endif - UCHAR BandIdx; - CHANNEL_CTRL *pChCtrl; - struct wifi_dev *wdev = NULL; - - if (pAd->ApCfg.ScanReqwdev) - wdev = pAd->ApCfg.ScanReqwdev; - else - wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - - BandIdx = HcGetBandByWdev(wdev); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - pAd->ScanCtrl.Channel = - FindScanChannel(pAd, pAd->ScanCtrl.Channel, wdev); - /* only scan the channel which binding band supported */ - if (pAd->ApCfg.ScanReqwdev != NULL && - (pAd->ScanCtrl.Channel != 0)) { - while ((WMODE_CAP_2G(pAd->ApCfg.ScanReqwdev->PhyMode) && - pAd->ScanCtrl.Channel > 14) || - (WMODE_CAP_5G(pAd->ApCfg.ScanReqwdev->PhyMode) && - pAd->ScanCtrl.Channel <= 14) -#ifdef CONFIG_MAP_SUPPORT - || - (MapNotRequestedChannel(pAd->ApCfg.ScanReqwdev, - pAd->ScanCtrl.Channel)) -#endif - ) { - pAd->ScanCtrl.Channel = FindScanChannel( - pAd, pAd->ScanCtrl.Channel, wdev); - if (pAd->ScanCtrl.Channel == 0) - break; - } - } -#ifdef OFFCHANNEL_SCAN_FEATURE - } -#endif -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - UCHAR BandIdx; - CHANNEL_CTRL *pChCtrl; - struct wifi_dev *wdev = NULL; - if (pAd->ApCfg.ScanReqwdev) - wdev = pAd->ApCfg.ScanReqwdev; - else - wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - BandIdx = HcGetBandByWdev(wdev); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - /* - iwpriv set auto channel selection - update the current index of the channel - */ -#ifndef OFFCHANNEL_SCAN_FEATURE - if (pAd->ApCfg.bAutoChannelAtBootup[BandIdx] == TRUE) { -#endif - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] pAd->ApCfg.current_channel_index = %d\n", - __func__, pAd->ApCfg.current_channel_index)); - /* update current channel info */ - UpdateChannelInfo(pAd, pAd->ApCfg.current_channel_index, - pAd->ApCfg.AutoChannelAlg[BandIdx], - wdev); -#ifdef NEIGHBORING_AP_STAT - if (lastChannel != pAd->ScanCtrl.Channel) { - bandidx = HcGetBandByChannel(pAd, lastChannel); - if (lastChannel <= 14) - index = SCAN_RESULT_2G; - else - index = SCAN_RESULT_5G; - /*support for band0 RPI only*/ - if (bandidx == DBDC_BAND0) { - band_offset = 0x12250; - } else { - band_offset = 0x12a44; - } - total = 0; - if (pAd->ScanTab.ScanResult[index].rpi_cnt < - MAX_RPI_CHANNEL_CNT) { - int regcount = 0; - rpiData = - &pAd->ScanTab.ScanResult[index].rpi - [pAd->ScanTab - .ScanResult[index] - .rpi_cnt]; - rpiData->channel = lastChannel; - if (pAd->ScanTab.Ipi == 1) - regcount = 11; - else - regcount = 8; - for (idx = 0; idx < regcount; idx++) { - RTMP_IO_READ32(pAd, - band_offset + - idx * 4, - &crVal); - total += (crVal & 0x7FFFFF); - temp[idx] = (crVal & 0x7FFFFF); - if (pAd->ScanTab.Ipi) { - xNF += (NF_Power[idx] * - temp[idx]); - } - } - for (idx = 0; idx < regcount; idx++) { - rpiData->hist[idx] = temp[idx]; - } - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("[APScanTimeoutAction]BandIdx : %d index : %d\n", - bandidx, index)); - /* print RXTD 17-24 */ - if (pAd->ScanTab.Ipi) { - rpiData->NF = - xNF / (INT32)total; -#ifdef OFFCHANNEL_SCAN_FEATURE - pAd->ChannelInfo.AvgNF = - rpiData->NF; -#endif - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Average NF Power :%d\n", - rpiData->NF)); - MTWF_LOG(DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IPI Histogram:\n")); - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Hist: %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d\n", - rpiData->hist[0], - rpiData->hist[1], - rpiData->hist[2], - rpiData->hist[3], - rpiData->hist[4], - rpiData->hist[5], - rpiData->hist[6], - rpiData->hist[7], - rpiData->hist[8], - rpiData->hist[9], - rpiData->hist[10])); - } else { - MTWF_LOG(DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RPI Histogram:\n")); - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Hist: %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d\n", - rpiData->hist[0], - rpiData->hist[1], - rpiData->hist[2], - rpiData->hist[3], - rpiData->hist[4], - rpiData->hist[5], - rpiData->hist[6], - rpiData->hist[7])); - } - pAd->ScanTab.ScanResult[index].rpi_cnt++; - } - /* restor ctrl cr value */ - if (bandidx == DBDC_BAND0) - RTMP_IO_WRITE32( - pAd, PHY_BAND0_PHYMUX_5, - pAd->ScanTab.ScanResult[index] - .ctr_cr[bandidx]); - else - RTMP_IO_WRITE32( - pAd, PHY_BAND1_PHYMUX_5, - pAd->ScanTab.ScanResult[index] - .ctr_cr[bandidx]); - } -#endif - -#ifdef OFFCHANNEL_SCAN_FEATURE - if (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_START) { - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] channel no : %d : obss time :%d channel_idx = %d\n", - __func__, pAd->ChannelInfo.ChannelNo, - pAd->ChannelInfo.ChStats.Obss_Time, - pAd->ChannelInfo.ChannelIdx)); - memcpy(Rsp.ifrn_name, pAd->ScanCtrl.if_name, - IFNAMSIZ); - Rsp.Action = OFFCHANNEL_INFO_RSP; - Rsp.data.channel_data.channel_busy_time = - pAd->ChannelInfo.chanbusytime - [pAd->ApCfg - .current_channel_index]; - Rsp.data.channel_data.NF = - pAd->ChannelInfo.AvgNF; - Rsp.data.channel_data.channel = - pAd->ChannelInfo.ChannelNo; - Rsp.data.channel_data.tx_time = - pAd->ChannelInfo.ChStats.Tx_Time; - Rsp.data.channel_data.rx_time = - pAd->ChannelInfo.ChStats.Rx_Time; - Rsp.data.channel_data.obss_time = - pAd->ChannelInfo.ChStats.Obss_Time; - Rsp.data.channel_data.channel_idx = - pAd->ApCfg.current_channel_index; - /* This value to be used by application to calculate channel busy percentage */ - Rsp.data.channel_data.actual_measured_time = - pAd->ScanCtrl.ScanTimeActualDiff; -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) { - Update_Mib_Bucket_500Ms(pAd); - Update_Mib_Bucket_for_map(pAd); - /* EDCCA time */ - RTMP_IO_READ32(pAd, MIB_M0SDR18, - &CrValue); - Rsp.data.channel_data.edcca = CrValue; - } -#endif - RtmpOSWrielessEventSend( - pAd->net_dev, RT_WLAN_EVENT_CUSTOM, - OID_OFFCHANNEL_INFO, NULL, - (UCHAR *)&Rsp, - sizeof(OFFCHANNEL_SCAN_MSG)); - pAd->ScanCtrl.ScanTime - [pAd->ScanCtrl.CurrentGivenChan_Index] = - 0; - /* Scan complete increment index to start the next channel */ - pAd->ScanCtrl.CurrentGivenChan_Index++; - /* Reinitialize the Scan parameters for the next offchannel */ - pAd->ScanCtrl.ScanType = - pAd->ScanCtrl.Offchan_Scan_Type - [pAd->ScanCtrl - .CurrentGivenChan_Index]; - pAd->ScanCtrl.Channel = - pAd->ScanCtrl.ScanGivenChannel - [pAd->ScanCtrl - .CurrentGivenChan_Index]; - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s][%d]:Next OFFChannel scan for : %d:Scan type =%d from given list\n", - __func__, __LINE__, - pAd->ScanCtrl.Channel, - pAd->ScanCtrl.ScanType)); - pAd->ChannelInfo.bandidx = HcGetBandByChannel( - pAd, pAd->ScanCtrl.Channel); - pAd->ChannelInfo.ChannelIdx = Channel2Index( - pAd, pAd->ScanCtrl.Channel); - if (pAd->ScanCtrl.Channel) { - pAd->ChannelInfo.ChannelNo = - pAd->ScanCtrl.Channel; - } - } - /* move to next channel */ - if (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_START) -#endif - pAd->ApCfg.current_channel_index++; - if (pAd->ApCfg.current_channel_index < - pChCtrl->ChListNum) - pAd->ApCfg.AutoChannel_Channel = - pChCtrl->ChList - [pAd->ApCfg.current_channel_index] - .Channel; -#ifndef OFFCHANNEL_SCAN_FEATURE - } -#endif - } -#endif /* CONFIG_AP_SUPPORT */ - ScanNextChannel(pAd, OPMODE_AP, pAd->ApCfg.ScanReqwdev); -} - -#ifdef CON_WPS -VOID APMlmeScanCompleteAction(PRTMP_ADAPTER pAd, MLME_QUEUE_ELEM *Elem) -{ - PWSC_CTRL pWscControl; - PWSC_CTRL pApCliWscControl; - UCHAR apidx; - INT IsAPConfigured; - struct wifi_dev *wdev; - BOOLEAN bNeedSetPBCTimer = TRUE; -#if defined(CON_WPS) - INT currIfaceIdx = 0; - UCHAR ifIdx; - UCHAR oppifIdx; - struct wifi_dev *ConWpsdev = NULL; - PWSC_CTRL pTriggerApCliWscControl; - PWSC_CTRL pOpposApCliWscControl; - PRTMP_ADAPTER pOpposAd; - BOOLEAN bTwoCardConWPS = FALSE; - UCHAR apcli_idx; -#ifdef MULTI_INF_SUPPORT /* Index 0 for 2.4G, 1 for 5Ghz Card */ - UINT opposIfaceIdx = !multi_inf_get_idx(pAd); -#endif /* MULTI_INF_SUPPORT */ -#endif /*CON_WPS*/ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP SYNC - APMlmeScanCompleteAction\n")); -#if defined(CON_WPS) - pOpposAd = NULL; - pOpposApCliWscControl = NULL; - pTriggerApCliWscControl = NULL; -#ifdef MULTI_INF_SUPPORT /* Index 0 for 2.4G, 1 for 5Ghz Card */ - pOpposAd = (PRTMP_ADAPTER)adapt_list[opposIfaceIdx]; -#endif /* MULTI_INF_SUPPORT */ -#endif /*CON_WPS*/ - - /* If We catch the SR=TRUE in last scan_res, stop the AP Wsc SM */ - if (Elem) { - ifIdx = (USHORT)(Elem->Priv); - - if (ifIdx < pAd->ApCfg.ApCliNum) - ConWpsdev = &(pAd->ApCfg.ApCliTab[ifIdx].wdev); - - if (ConWpsdev == NULL) - return; - } else - return; - - if (ifIdx == BSS0) - oppifIdx = BSS1; - else if (ifIdx == BSS1) - oppifIdx = BSS0; - else - return; - - if (ConWpsdev) { - pApCliWscControl = &pAd->ApCfg.ApCliTab[ifIdx].wdev.WscControl; - pAd->ApCfg.ApCliTab[ifIdx].ConWpsApCliModeScanDoneStatus = - CON_WPS_APCLI_SCANDONE_STATUS_FINISH; - } - - if (pOpposAd) { - for (apcli_idx = 0; apcli_idx < pOpposAd->ApCfg.ApCliNum; - apcli_idx++) { - if (pOpposAd->ApCfg.ApCliTab[apcli_idx] - .wdev.WscControl.conWscStatus == - CON_WPS_STATUS_APCLI_RUNNING) { - pOpposApCliWscControl = - &pOpposAd->ApCfg.ApCliTab[apcli_idx] - .wdev.WscControl; - bTwoCardConWPS = TRUE; - break; - } - } - - if (apcli_idx == pOpposAd->ApCfg.ApCliNum) { - pOpposApCliWscControl = NULL; - bTwoCardConWPS = FALSE; - } - } - - if (bTwoCardConWPS == FALSE) { - for (apcli_idx = 0; apcli_idx < pAd->ApCfg.ApCliNum; - apcli_idx++) { - if (apcli_idx == ifIdx) - continue; - else if (pAd->ApCfg.ApCliTab[apcli_idx] - .wdev.WscControl.conWscStatus == - CON_WPS_STATUS_APCLI_RUNNING) { - pOpposApCliWscControl = - &pAd->ApCfg.ApCliTab[apcli_idx] - .wdev.WscControl; - break; - } - } - } - - if (pOpposAd && - pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_AUTO) { /* 2.2G and 5G must trigger scan */ - if (pOpposAd && bTwoCardConWPS) { - for (apcli_idx = 0; apcli_idx < pAd->ApCfg.ApCliNum; - apcli_idx++) { - if (pOpposAd->ApCfg.ApCliTab[apcli_idx] - .ConWpsApCliModeScanDoneStatus == - CON_WPS_APCLI_SCANDONE_STATUS_ONGOING) { - pApCliWscControl - ->ConWscApcliScanDoneCheckTimerRunning = - TRUE; - RTMPSetTimer( - &pApCliWscControl - ->ConWscApcliScanDoneCheckTimer, - 1000); - return; - } - } - } - } else { - for (apcli_idx = 0; apcli_idx < pAd->ApCfg.ApCliNum; - apcli_idx++) { - if (pAd->ApCfg.ApCliTab[apcli_idx] - .ConWpsApCliModeScanDoneStatus == - CON_WPS_APCLI_SCANDONE_STATUS_ONGOING) { - pApCliWscControl - ->ConWscApcliScanDoneCheckTimerRunning = - TRUE; - - if (pAd->Mlme.ApSyncMachine.CurrState == 0) - WscScanExec( - pAd, - &(pAd->ApCfg.ApCliTab[apcli_idx] - .wdev.WscControl)); - - RTMPSetTimer( - &pApCliWscControl - ->ConWscApcliScanDoneCheckTimer, - 1000); - return; - } - } - } - - if ((pOpposApCliWscControl) == NULL && pOpposAd) { - pOpposApCliWscControl = - &pOpposAd->ApCfg.ApCliTab[BSS0].WscControl; - bTwoCardConWPS = TRUE; - } - - if (pOpposApCliWscControl == NULL) { - pOpposApCliWscControl = - &pAd->ApCfg.ApCliTab[oppifIdx].WscControl; - bTwoCardConWPS = FALSE; - } - - WscPBCBssTableSort(pAd, pApCliWscControl); -#if defined(CON_WPS) -#ifdef MULTI_INF_SUPPORT /* Index 0 for 2.4G, 1 for 5Ghz Card */ - - if (pOpposAd && bTwoCardConWPS) { - if (pOpposApCliWscControl) - WscPBCBssTableSort(pOpposAd, pOpposApCliWscControl); - } else -#endif /* MULTI_INF_SUPPORT */ - { - if (pOpposApCliWscControl) - WscPBCBssTableSort(pAd, pOpposApCliWscControl); - } - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[Iface_Idx: %d] Scan_Completed!!! In APMlmeScanCompleteAction\n", - currIfaceIdx)); -#endif /*CON_WPS*/ -#ifdef MULTI_INF_SUPPORT - currIfaceIdx = multi_inf_get_idx(pAd); -#else - currIfaceIdx = (pApCliWscControl->EntryIfIdx & 0x0F); -#endif /* MULTI_INF_SUPPORT */ - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pWscControl = &wdev->WscControl; - IsAPConfigured = pWscControl->WscConfStatus; - - if ((pWscControl->WscConfMode != WSC_DISABLE) && - (pApCliWscControl->WscPBCBssCount > 0)) { - if (pWscControl->bWscTrigger == TRUE) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s CON_WPS[%d]: Stop the AP Wsc Machine\n", - __func__, apidx)); - WscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, - 0, apidx, NULL, 0, AP_MODE); - WscBuildProbeRespIE(pAd, - WSC_MSGTYPE_AP_WLAN_MGR, - IsAPConfigured, FALSE, 0, 0, - apidx, NULL, 0, AP_MODE); - UpdateBeaconHandler(pAd, wdev, - BCN_UPDATE_IE_CHG); - WscStop(pAd, FALSE, pWscControl); - } - - WscConWpsStop(pAd, FALSE, pWscControl); - } - - continue; - } - - if (bTwoCardConWPS) { - if (pApCliWscControl->WscPBCBssCount == 1 && - pOpposApCliWscControl->WscPBCBssCount == 1) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[Iface_Idx: %d] AutoPreferIface = %d\n", - currIfaceIdx, - pAd->ApCfg.ConWpsApcliAutoPreferIface)); - - if (currIfaceIdx == 0) { - if (pAd->ApCfg.ConWpsApcliAutoPreferIface == - CON_WPS_APCLI_AUTO_PREFER_IFACE1) { - bNeedSetPBCTimer = FALSE; - WscStop(pAd, TRUE, pApCliWscControl); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("!! STOP APCLI = %d !!\n", - currIfaceIdx)); - } else { - WscConWpsStop(pAd, TRUE, - pApCliWscControl); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("!! STOP APCLI = %d !!\n", - !currIfaceIdx)); - } - } else if (currIfaceIdx == 1) { - if (pAd->ApCfg.ConWpsApcliAutoPreferIface == - CON_WPS_APCLI_AUTO_PREFER_IFACE0) { - bNeedSetPBCTimer = FALSE; - WscStop(pAd, TRUE, pApCliWscControl); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("!!STOP APCLI = %d !!\n", - currIfaceIdx)); - } else { - WscConWpsStop(pAd, TRUE, - pApCliWscControl); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("!! STOP APCLI = %d !!\n", - !currIfaceIdx)); - } - } - } - - if (pApCliWscControl->WscPBCBssCount == 1 && - pOpposApCliWscControl->WscPBCBssCount == 0) { - WscConWpsStop(pAd, TRUE, pApCliWscControl); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("!! (5)STOP APCLI = %d !!\n", !currIfaceIdx)); - } - } else { - currIfaceIdx = (pApCliWscControl->EntryIfIdx & 0x0F); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[Iface_Idx: %d] Registrar_Found, APCLI_Auto_Mode PreferIface = %d\n", - currIfaceIdx, pAd->ApCfg.ConWpsApcliAutoPreferIface)); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[Iface_Idx: %d] WscPBCBssCount = %d, opposWscPBCBssCount = %d\n", - currIfaceIdx, pApCliWscControl->WscPBCBssCount, - pOpposApCliWscControl->WscPBCBssCount)); - - if (pApCliWscControl->WscPBCBssCount == 1 && - pOpposApCliWscControl->WscPBCBssCount == 1) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[Iface_Idx: %d] AutoPreferIface = %d\n", - currIfaceIdx, - pAd->ApCfg.ConWpsApcliAutoPreferIface)); - - if (pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_AUTO) { - if (currIfaceIdx != - pAd->ApCfg.ConWpsApcliAutoPreferIface) { - bNeedSetPBCTimer = FALSE; - WscStop(pAd, TRUE, pApCliWscControl); - WscConWpsStop(pAd, TRUE, - pOpposApCliWscControl); - pTriggerApCliWscControl = - pOpposApCliWscControl; - } else { - WscConWpsStop(pAd, TRUE, - pApCliWscControl); - pTriggerApCliWscControl = - pApCliWscControl; - } - } else if (pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_2G) { - WscConWpsStop(pAd, TRUE, - &(pAd->ApCfg.ApCliTab[BSS0] - .wdev.WscControl)); - pTriggerApCliWscControl = - &(pAd->ApCfg.ApCliTab[BSS0] - .wdev.WscControl); - } else if (pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_5G) { - WscConWpsStop(pAd, TRUE, - &(pAd->ApCfg.ApCliTab[BSS1] - .wdev.WscControl)); - pTriggerApCliWscControl = - &(pAd->ApCfg.ApCliTab[BSS1] - .wdev.WscControl); - } - } - - /*Only Found 1 Registrar at one interface*/ - if (pApCliWscControl->WscPBCBssCount == 1 && - pOpposApCliWscControl->WscPBCBssCount == 0) { - if (pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_AUTO) { - WscConWpsStop(pAd, TRUE, pApCliWscControl); - pTriggerApCliWscControl = pApCliWscControl; - } else if (pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_2G) { - if (currIfaceIdx == 0) { - WscConWpsStop(pAd, TRUE, - pApCliWscControl); - pTriggerApCliWscControl = - pApCliWscControl; - } - } else if (pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_5G) { - if (currIfaceIdx == 1) { - WscConWpsStop(pAd, TRUE, - pApCliWscControl); - pTriggerApCliWscControl = - pApCliWscControl; - } - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("!! (5)STOP APCLI = %d !!\n", !currIfaceIdx)); - } else if (pApCliWscControl->WscPBCBssCount == 0 && - pOpposApCliWscControl->WscPBCBssCount == 1) { - if (pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_AUTO) { - WscConWpsStop(pAd, TRUE, pOpposApCliWscControl); - pTriggerApCliWscControl = pOpposApCliWscControl; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("!! (6)STOP APCLI = %d !!\n", - !currIfaceIdx)); - } else { - if ((pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_2G) && - (pOpposApCliWscControl->EntryIfIdx & - 0x0F) == 0) { - WscConWpsStop(pAd, TRUE, - pOpposApCliWscControl); - pTriggerApCliWscControl = - pOpposApCliWscControl; - } else if ((pAd->ApCfg.ConWpsApCliMode == - CON_WPS_APCLI_BAND_5G) && - (pOpposApCliWscControl->EntryIfIdx & - 0x0F) == 1) { - WscConWpsStop(pAd, TRUE, - pOpposApCliWscControl); - pTriggerApCliWscControl = - pOpposApCliWscControl; - } - } - } - } - - if (bTwoCardConWPS) { - if (bNeedSetPBCTimer && - pApCliWscControl->WscPBCTimerRunning == FALSE) { - if (pApCliWscControl->bWscTrigger) { - pApCliWscControl->WscPBCTimerRunning = TRUE; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("!! TwoCardConWPS Trigger %s WPS!!\n", - (pApCliWscControl->IfName))); - RTMPSetTimer(&pApCliWscControl->WscPBCTimer, - 1000); - } - } - } else { - if (pTriggerApCliWscControl != NULL && - (pTriggerApCliWscControl->WscPBCTimerRunning == FALSE) && - (pTriggerApCliWscControl->bWscTrigger == TRUE)) { - pTriggerApCliWscControl->WscPBCTimerRunning = TRUE; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("!! One Card DBDC Trigger %s WPS!!\n", - (pTriggerApCliWscControl->IfName))); - RTMPSetTimer(&pTriggerApCliWscControl->WscPBCTimer, - 1000); - } else { - if (pApCliWscControl && - pApCliWscControl->WscPBCTimerRunning == FALSE && - (pApCliWscControl->bWscTrigger == TRUE)) { - pAd->ApCfg - .ApCliTab[(pApCliWscControl->EntryIfIdx & - 0x0F)] - .ConWpsApCliModeScanDoneStatus = - CON_WPS_APCLI_SCANDONE_STATUS_ONGOING; - pApCliWscControl->WscPBCTimerRunning = TRUE; - RTMPSetTimer(&pApCliWscControl->WscPBCTimer, - 1000); - } - - if (pOpposApCliWscControl && - pOpposApCliWscControl->WscPBCTimerRunning == - FALSE && - (pOpposApCliWscControl->bWscTrigger == TRUE)) { - pAd->ApCfg - .ApCliTab[(pOpposApCliWscControl - ->EntryIfIdx & - 0x0F)] - .ConWpsApCliModeScanDoneStatus = - CON_WPS_APCLI_SCANDONE_STATUS_ONGOING; - pOpposApCliWscControl->WscPBCTimerRunning = - TRUE; - RTMPSetTimer( - &pOpposApCliWscControl->WscPBCTimer, - 1000); - } - } - } -} -#endif /* CON_WPS*/ - -/* - ========================================================================== - Description: - MLME SCAN req state machine procedure - ========================================================================== - */ -VOID APMlmeScanReqAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - BOOLEAN Cancelled; - UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType; - struct wifi_dev *wdev = (struct wifi_dev *)Elem->Priv; -#ifdef CONFIG_AP_SUPPORT - UCHAR BandIdx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); -#endif -#ifdef MAP_R2 - UINT32 CrValue; -#endif -#ifdef CONFIG_INIT_RADIO_ONOFF - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY)) - return; -#endif - - /* first check the parameter sanity */ - if (MlmeScanReqSanity(pAd, Elem->Msg, Elem->MsgLen, &BssType, - (PCHAR)Ssid, &SsidLen, &ScanType)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AP SYNC - MlmeScanReqAction\n")); - NdisGetSystemUpTime(&pAd->ApCfg.LastScanTime); - RTMPCancelTimer(&pAd->ScanCtrl.APScanTimer, &Cancelled); - /* record desired BSS parameters */ - pAd->ScanCtrl.BssType = BssType; - pAd->ScanCtrl.ScanType = ScanType; - pAd->ScanCtrl.SsidLen = SsidLen; - NdisMoveMemory(pAd->ScanCtrl.Ssid, Ssid, SsidLen); - - /* start from the first channel */ - if (pAd->ScanCtrl.PartialScan.bScanning == TRUE) { - /* only scan the channel which binding band supported */ - pAd->ApCfg.ScanReqwdev = (struct wifi_dev *)Elem->Priv; - find_next_channel: - pAd->ScanCtrl.Channel = FindScanChannel(pAd, 0, wdev); - - if (pAd->ScanCtrl.PartialScan.bScanning == TRUE) { - if ((WMODE_CAP_2G( - pAd->ApCfg.ScanReqwdev->PhyMode) && - pAd->ScanCtrl.Channel > 14) || - (WMODE_CAP_5G( - pAd->ApCfg.ScanReqwdev->PhyMode) && - pAd->ScanCtrl.Channel <= 14)) { - pAd->ScanCtrl.Channel = FindScanChannel( - pAd, pAd->ScanCtrl.Channel, - wdev); - - if (pAd->ScanCtrl.Channel == 0) { - if (pAd->ScanCtrl.PartialScan - .bScanning == - TRUE) { - pAd->ScanCtrl - .PartialScan - .NumOfChannels = - DEFLAUT_PARTIAL_SCAN_CH_NUM; - goto find_next_channel; - } - } - } - } - } else { -#ifdef OFFCHANNEL_SCAN_FEATURE - if (pAd->ScanCtrl.ScanGivenChannel - [pAd->ScanCtrl.CurrentGivenChan_Index]) { - pAd->ScanCtrl.Channel = - pAd->ScanCtrl.ScanGivenChannel - [pAd->ScanCtrl - .CurrentGivenChan_Index]; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s][%d] start offchannel scan on %d : channel list index = %d\n", - __func__, __LINE__, - pAd->ScanCtrl.Channel, - pAd->ScanCtrl.CurrentGivenChan_Index)); - pAd->ScanCtrl.state = OFFCHANNEL_SCAN_START; -#ifdef MAP_R2 - /* EDCCA time Read and Clear here*/ - RTMP_IO_READ32(pAd, MIB_M0SDR18, &CrValue); -#endif - } else -#endif - pAd->ScanCtrl.Channel = - FindScanChannel(pAd, 0, wdev); - /* only scan the channel which binding band supported */ - pAd->ApCfg.ScanReqwdev = (struct wifi_dev *)Elem->Priv; -#ifdef OFFCHANNEL_SCAN_FEATURE - if (!pAd->ScanCtrl.Num_Of_Channels) { -#endif - if (pAd->ApCfg.ScanReqwdev != NULL) { - while ((WMODE_CAP_2G( - pAd->ApCfg.ScanReqwdev - ->PhyMode) && - pAd->ScanCtrl.Channel > 14) || - (WMODE_CAP_5G( - pAd->ApCfg.ScanReqwdev - ->PhyMode) && - pAd->ScanCtrl.Channel <= 14) -#ifdef CONFIG_MAP_SUPPORT - || - (MapNotRequestedChannel( - pAd->ApCfg.ScanReqwdev, - pAd->ScanCtrl.Channel)) -#endif - ) { - pAd->ScanCtrl.Channel = - FindScanChannel( - pAd, - pAd->ScanCtrl - .Channel, - wdev); - if (pAd->ScanCtrl.Channel == 0) - break; - } - } -#ifdef OFFCHANNEL_SCAN_FEATURE - } -#endif - } - -#ifdef OFFCHANNEL_SCAN_FEATURE - { - if (pAd->ScanCtrl.state == OFFCHANNEL_SCAN_START) - pAd->MsMibBucket.Enabled = FALSE; - } -#endif -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (pAd->ApCfg.bAutoChannelAtBootup[BandIdx] == - TRUE) { /* iwpriv set auto channel selection */ - APAutoChannelInit(pAd, wdev); - pAd->ApCfg.AutoChannel_Channel = - pChCtrl->ChList[0].Channel; - } - } -#endif /* CONFIG_AP_SUPPORT */ - ScanNextChannel(pAd, OPMODE_AP, (struct wifi_dev *)Elem->Priv); - } else { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AP SYNC - MlmeScanReqAction() sanity check fail. BUG!!!\n")); - pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE; - } -} - -/* - ========================================================================== - Description: - peer sends beacon back when scanning - ========================================================================== - */ -VOID APPeerBeaconAtScanAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - PFRAME_802_11 pFrame; - UCHAR *VarIE = NULL; - USHORT LenVIE; - NDIS_802_11_VARIABLE_IEs *pVIE = NULL; - CHAR RealRssi = -127; - BCN_IE_LIST *ie_list = NULL; -#ifdef APCLI_SUPPORT -#ifdef CONFIG_MAP_SUPPORT - int index_map = 0; - struct wifi_dev *wdev = pAd->ApCfg.ScanReqwdev; -#endif -#endif -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - UCHAR Snr[4] = { 0 }; - CHAR rssi[4] = { 0 }; - Snr[0] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[0]); - Snr[1] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[1]); - Snr[2] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[2]); - Snr[3] = ConvertToSnr(pAd, Elem->rssi_info.raw_Snr[3]); - - rssi[0] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0); - rssi[1] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1); - rssi[2] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2); - rssi[3] = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3); -#endif - - os_alloc_mem(pAd, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST)); - - if (!ie_list) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Alloc memory for ie_list fail!!!\n", __func__)); - return; - } - - NdisZeroMemory((UCHAR *)ie_list, sizeof(BCN_IE_LIST)); - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN); - - if (VarIE == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - goto LabelErr; - } - - pFrame = (PFRAME_802_11)Elem->Msg; - /* Init Variable IE structure */ - pVIE = (PNDIS_802_11_VARIABLE_IEs)VarIE; - pVIE->Length = 0; - - if (PeerBeaconAndProbeRspSanity(pAd, Elem->wdev, Elem->Msg, - Elem->MsgLen, Elem->Channel, ie_list, - &LenVIE, pVIE, FALSE, FALSE)) { - ULONG Idx; - CHAR Rssi = -127; - MAC_TABLE_ENTRY *pEntry = NULL; - UCHAR Channel; -#ifdef CONFIG_MAP_SUPPORT - UCHAR SsidAllZero = 0; - UCHAR k = 0; - /* check ssid values, assume it's all zero first */ - if (ie_list->SsidLen != 0) - SsidAllZero = 1; - for (k = 0; k < ie_list->SsidLen; k++) { - if (ie_list->Ssid[k] != 0) { - SsidAllZero = 0; - break; - } - } -#endif - - pEntry = MacTableLookup( - pAd, - ie_list->Addr2); /* Found the pEntry from Peer Bcn Content */ - RealRssi = RTMPMaxRssi( - pAd, ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0), - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1), - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3) -#endif - - ); - - if (ie_list->Channel > 14) - Channel = HcGetChannelByRf(pAd, RFIC_5GHZ); - else - Channel = HcGetChannelByRf(pAd, RFIC_24GHZ); - - { - /* ignore BEACON not in this channel */ - if (ie_list->Channel != pAd->ScanCtrl.Channel -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - && (pAd->CommonCfg.bOverlapScanning == FALSE) -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - ) - goto __End_Of_APPeerBeaconAtScanAction; - } - -#ifdef DOT11_N_SUPPORT -#ifdef BW_VENDOR10_CUSTOM_FEATURE - /* Soft AP to follow BW of Root AP */ - if ((IS_APCLI_BW_SYNC_FEATURE_ENBL(pAd) == FALSE) && - (RealRssi > OBSS_BEACON_RSSI_THRESHOLD) && - (ie_list->HtCapability.HtCapInfo.Forty_Mhz_Intolerant)) { -#else - if ((RealRssi > OBSS_BEACON_RSSI_THRESHOLD) && - (ie_list->HtCapability.HtCapInfo - .Forty_Mhz_Intolerant)) { /* || (HtCapabilityLen == 0))) */ -#endif - if ((pAd->ScanCtrl.ScanType == SCAN_2040_BSS_COEXIST) && - (pAd->ApCfg.ScanReqwdev->wdev_type == - WDEV_TYPE_APCLI)) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s:Ignore BW 40->20\n", __func__)); - else - Handle_BSS_Width_Trigger_Events(pAd, Channel); - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef IDS_SUPPORT - - /* Conflict SSID detection */ - if (ie_list->Channel == Channel) - RTMPConflictSsidDetection(pAd, ie_list->Ssid, - ie_list->SsidLen, - Elem->rssi_info.raw_rssi[0], - Elem->rssi_info.raw_rssi[1], - Elem->rssi_info.raw_rssi[2] -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - Elem->rssi_info.raw_rssi[3] -#endif - - ); - -#endif /* IDS_SUPPORT */ - /* - This correct im-proper RSSI indication during SITE SURVEY issue. - Always report bigger RSSI during SCANNING when receiving multiple BEACONs from the same AP. - This case happens because BEACONs come from adjacent channels, so RSSI become weaker as we - switch to more far away channels. - */ - Idx = BssTableSearch(&pAd->ScanTab, ie_list->Bssid, - ie_list->Channel); -#ifdef CONFIG_MAP_SUPPORT - if (Idx != BSS_NOT_FOUND && Idx < MAX_LEN_OF_BSS_TABLE && - ie_list->SsidLen != 0 && SsidAllZero == 0) -#else - if (Idx != BSS_NOT_FOUND && Idx < MAX_LEN_OF_BSS_TABLE) -#endif - Rssi = pAd->ScanTab.BssEntry[Idx].Rssi; -#ifdef CONFIG_MAP_SUPPORT - else { - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("wdev is NULL return\n")); - return; - } - if ((IS_MAP_TURNKEY_ENABLE(pAd)) && - (((pAd->CommonCfg.bIEEE80211H == 1) && - RadarChannelCheck(pAd, pAd->ScanCtrl.Channel))) && - (wdev->MAPCfg.FireProbe_on_DFS == FALSE)) { - wdev->MAPCfg.FireProbe_on_DFS = TRUE; - while (index_map < MAX_BH_PROFILE_CNT) { - if (wdev->MAPCfg.scan_bh_ssids - .scan_SSID_val[index_map] - .SsidLen > 0) { - FireExtraProbeReq( - pAd, OPMODE_AP, - SCAN_ACTIVE, wdev, - wdev->MAPCfg - .scan_bh_ssids - .scan_SSID_val - [index_map] - .ssid, - wdev->MAPCfg - .scan_bh_ssids - .scan_SSID_val - [index_map] - .SsidLen); - } - index_map++; - } - } - } -#endif - - /* TODO: 2005-03-04 dirty patch. we should change all RSSI related variables to SIGNED SHORT for easy/efficient reading and calaulation */ - RealRssi = RTMPMaxRssi( - pAd, ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0), - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1), - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_3) -#endif - - ); - - if ((RealRssi + pAd->BbpRssiToDbmDelta) > Rssi) - Rssi = RealRssi + pAd->BbpRssiToDbmDelta; - - Idx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, Rssi, - LenVIE, pVIE -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - , - Snr, rssi -#endif /* CONFIG_AP_SUPPORT */ - ); -#ifdef APCLI_SUPPORT -#ifdef APCLI_CERT_SUPPORT -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - { - struct wifi_dev *wdev = (struct wifi_dev *)Elem->wdev; - UCHAR BandIdx = HcGetBandByWdev(wdev); - CHANNEL_CTRL *pChCtrl = - hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - UCHAR apcli2Gidx = 0; -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) - apcli2Gidx = 1; -#endif - /* Check if this scan channel is the effeced channel */ - if (APCLI_IF_UP_CHECK(pAd, apcli2Gidx) && - (pAd->bApCliCertTest == TRUE) && - (pAd->CommonCfg.bBssCoexEnable == TRUE) && - ((ie_list->Channel > 0) && - (ie_list->Channel <= 14))) { - int chListIdx; - - /* - First we find the channel list idx by the channel number - */ - for (chListIdx = 0; - chListIdx < pChCtrl->ChListNum; - chListIdx++) { - if (ie_list->Channel == - pChCtrl->ChList[chListIdx].Channel) - break; - } - - if (chListIdx < pChCtrl->ChListNum) { - /* - If this channel is effected channel for the 20/40 coex operation. Check the related IEs. - */ - if (pChCtrl->ChList[chListIdx] - .bEffectedChannel == TRUE) { - UCHAR RegClass; - OVERLAP_BSS_SCAN_IE BssScan; - /* Read Beacon's Reg Class IE if any. */ - PeerBeaconAndProbeRspSanity2( - pAd, Elem->Msg, - Elem->MsgLen, &BssScan, - &RegClass); - /* printk("\x1b[31m TriEventTableSetEntry \x1b[m\n"); */ - TriEventTableSetEntry( - pAd, - &pAd->CommonCfg - .TriggerEventTab, - ie_list->Bssid, - &ie_list->HtCapability, - ie_list->HtCapabilityLen, - RegClass, - ie_list->Channel); - } - } - } - } -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ -#endif /* APCLI_CERT_SUPPORT */ -#endif /* APCLI_SUPPORT */ - - if (Idx != BSS_NOT_FOUND) { - NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, - &Elem->Msg[24], 4); - NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], - &Elem->TimeStamp.u.LowPart, 4); - NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], - &Elem->TimeStamp.u.LowPart, 4); - } - -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || \ - defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT) - - if (RTMPEqualMemory(ie_list->Ssid, "DIRECT-", 7)) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s P2P_SCANNING: %s [%lu], channel =%d\n", - __func__, ie_list->Ssid, Idx, Elem->Channel)); - - /* Determine primary channel by IE's DSPS rather than channel of received frame */ - if (ie_list->Channel != 0) - Elem->Channel = ie_list->Channel; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("APPeerBeaconAtScanAction : Update the SSID %s in Kernel Table, Elem->Channel=%u\n", - ie_list->Ssid, Elem->Channel)); - RT_CFG80211_SCANNING_INFORM(pAd, Idx, - /*ie_list->Channel*/ Elem->Channel, - (UCHAR *)Elem->Msg, Elem->MsgLen, - RealRssi); -#endif /* (RT_CFG80211_P2P_CONCURRENT_DEVICE) || (CFG80211_MULTI_STA) || (APCLI_CFG80211_SUPPORT) */ -#ifdef APCLI_SUPPORT -#endif /* APCLI_SUPPORT */ - } - - /* sanity check fail, ignored */ -__End_Of_APPeerBeaconAtScanAction: - /*scan beacon in pastive */ -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (ie_list->Channel == pAd->ApCfg.AutoChannel_Channel) { - UCHAR BandIdx = HcGetBandByWdev(Elem->wdev); - AUTO_CH_CTRL *pAutoChCtrl = - HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - if (AutoChBssSearchWithSSID( - pAd, ie_list->Bssid, (PUCHAR)ie_list->Ssid, - ie_list->SsidLen, ie_list->Channel, - Elem->wdev) == BSS_NOT_FOUND) - pAutoChCtrl->pChannelInfo->ApCnt - [pAd->ApCfg.current_channel_index]++; - - AutoChBssInsertEntry(pAd, ie_list->Bssid, - (CHAR *)ie_list->Ssid, - ie_list->SsidLen, ie_list->Channel, - ie_list->NewExtChannelOffset, - RealRssi, Elem->wdev); - } - } -#endif /* CONFIG_AP_SUPPORT */ -LabelErr: - - if (VarIE != NULL) - os_free_mem(VarIE); - - if (ie_list != NULL) - os_free_mem(ie_list); -} - -/* - ========================================================================== - Description: - MLME Cancel the SCAN req state machine procedure - ========================================================================== - */ -VOID APScanCnclAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem) -{ - BOOLEAN Cancelled; - - RTMPCancelTimer(&pAd->ScanCtrl.APScanTimer, &Cancelled); - pAd->ScanCtrl.Channel = 0; - ScanNextChannel(pAd, OPMODE_AP, pAd->ApCfg.ScanReqwdev); -} - -#ifdef APCLI_CFG80211_SUPPORT -/* -*note we can also check the channel set by cfg80211 here right now ignoring channel from cfg layer -*using our internal channel list if NL supports partial scan we can use the channel passed from cfg layer -*/ -VOID ApCliSiteSurvey(IN PRTMP_ADAPTER pAd, IN PNDIS_802_11_SSID pSsid, - IN UCHAR ScanType, IN BOOLEAN ChannelSel, - IN struct wifi_dev *wdev) -{ - MLME_SCAN_REQ_STRUCT ScanReq; - UCHAR BandIdx = HcGetBandByWdev(wdev); - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) { - /* Still scanning, ignore this scan */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Scanning now!\n", __func__)); - return; - } - AsicDisableSync(pAd, HW_BSSID_0); - /* Don't clear the scan table if we are doing partial scan */ - if ((pAd->ScanCtrl.PartialScan.bScanning == TRUE && - pAd->ScanCtrl.PartialScan.LastScanChannel == 0) || - pAd->ScanCtrl.PartialScan.bScanning == FALSE) { - BssTableInit(&pAd->ScanTab); - } - - pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE; - RTMPZeroMemory(ScanReq.Ssid, MAX_LEN_OF_SSID); - ScanReq.SsidLen = 0; - if ((pSsid) && (pSsid->SsidLength > 0) && - (pSsid->SsidLength <= (NDIS_802_11_LENGTH_SSID))) { - ScanReq.SsidLen = pSsid->SsidLength; - NdisMoveMemory(ScanReq.Ssid, pSsid->Ssid, pSsid->SsidLength); - } - ScanReq.BssType = BSS_ANY; - ScanReq.ScanType = ScanType; - pAd->ApCfg.bAutoChannelAtBootup[BandIdx] = ChannelSel; - - MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_MLME_SCAN_REQ, - sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, (ULONG)wdev); - RTMP_MLME_HANDLER(pAd); -} -#endif /* APCLI_CFG80211_SUPPORT */ - -/* - ========================================================================== - Description: - if ChannelSel is false, - AP scans channels and lists the information of channels. - if ChannelSel is true, - AP scans channels and selects an optimal channel. - - NOTE: - ========================================================================== -*/ -VOID ApSiteSurvey(PRTMP_ADAPTER pAd, PNDIS_802_11_SSID pSsid, UCHAR ScanType, - BOOLEAN ChannelSel) -{ - MLME_SCAN_REQ_STRUCT ScanReq; - struct wifi_dev *wdev = NULL; - INT BssIdx; - INT MaxNumBss = pAd->ApCfg.BssidNum; - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) { - /* - Still scanning, ignore this scan. - */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Scanning now!\n", __func__)); - return; - } - - AsicDisableSync(pAd, HW_BSSID_0); - - /* Disable beacon tx for all BSS */ - for (BssIdx = 0; BssIdx < MaxNumBss; BssIdx++) { - wdev = &pAd->ApCfg.MBSSID[BssIdx].wdev; - - if (wdev->bAllowBeaconing) - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_DISABLE_TX); - } - - /* Don't clear the scan table if we are doing partial scan */ - if ((pAd->ScanCtrl.PartialScan.bScanning == TRUE && - pAd->ScanCtrl.PartialScan.LastScanChannel == 0) || - pAd->ScanCtrl.PartialScan.bScanning == FALSE) - BssTableInit(&pAd->ScanTab); - - pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE; -#ifdef OFFCHANNEL_SCAN_FEATURE - ChannelInfoResetNew(pAd); - RTMPZeroMemory(&ScanReq, sizeof(ScanReq)); -#else - RTMPZeroMemory(ScanReq.Ssid, MAX_LEN_OF_SSID); -#endif - ScanReq.SsidLen = 0; - - if ((pSsid) && (pSsid->SsidLength > 0) && - (pSsid->SsidLength <= (NDIS_802_11_LENGTH_SSID))) { - ScanReq.SsidLen = pSsid->SsidLength; - NdisMoveMemory(ScanReq.Ssid, pSsid->Ssid, pSsid->SsidLength); - } - - ScanReq.BssType = BSS_ANY; - ScanReq.ScanType = ScanType; - pAd->ApCfg.bAutoChannelAtBootup[BAND0] = ChannelSel; - MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_MLME_SCAN_REQ, - sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); - RTMP_MLME_HANDLER(pAd); -} - -VOID ApSiteSurvey_by_wdev(PRTMP_ADAPTER pAd, PNDIS_802_11_SSID pSsid, - UCHAR ScanType, BOOLEAN ChannelSel, - struct wifi_dev *wdev) -{ - MLME_SCAN_REQ_STRUCT ScanReq; -#ifdef CON_WPS - UCHAR ifIdx; -#endif /*ifIdx*/ - struct wifi_dev *wdev_temp = NULL; - INT BssIdx; - INT MaxNumBss = pAd->ApCfg.BssidNum; - INT BandIdx = HcGetBandByWdev(wdev); - - struct DOT11_H *pDot11hTest = &pAd->Dot11_H[BandIdx]; - - BOOLEAN bSupport5G = HcIsRfSupport(pAd, RFIC_5GHZ); - if (bSupport5G && (pAd->CommonCfg.bIEEE80211H == 1) -#ifdef MT_DFS_SUPPORT - && (pAd->CommonCfg.DfsParameter.bDfsEnable == 1) -#endif - ) { -#ifdef CONFIG_MAP_SUPPORT - if (pDot11hTest->RDMode == RD_SILENCE_MODE) { - if (wdev->wdev_type != WDEV_TYPE_APCLI) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("INFO::AP is in Silent Mode.DFS CAC is under process!\n")); - return; - } else if (pAd->bMAPAvoidScanDuringCac == 1) { -#if defined(DBDC_MODE) - if (pAd->CommonCfg.dbdc_mode == TRUE) { - UCHAR BandIdx = 0; - - if (WMODE_CAP_2G(wdev->PhyMode)) - BandIdx = 0; - if (WMODE_CAP_5G(wdev->PhyMode)) - BandIdx = 1; - BssTableInitByBand(&pAd->ScanTab, - BandIdx); - } else -#endif - BssTableInit(&pAd->ScanTab); - if ((wdev->WscControl.WscConfMode != - WSC_DISABLE) && - (wdev->WscControl.bWscTrigger == TRUE)) - wapp_send_wsc_scan_complete_notification( - pAd, wdev); - else - wapp_send_scan_complete_notification( - pAd, wdev); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("INFO::AP is in Silent Mode.DFS CAC is under process!\n")); - return; - } - } -#else - if (pDot11hTest->RDMode == RD_SILENCE_MODE) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("INFO::AP is in Silent Mode.DFS CAC is under process!\n")); - return; - } -#endif - } - if (pDot11hTest->RDMode != RD_SILENCE_MODE) { - AsicDisableSync(pAd, HW_BSSID_0); - /* Disable beacon tx for BSS with same band */ - for (BssIdx = 0; BssIdx < MaxNumBss; BssIdx++) { - wdev_temp = &pAd->ApCfg.MBSSID[BssIdx].wdev; - - if (BandIdx != HcGetBandByWdev(wdev_temp)) - continue; - - if (wdev_temp->bAllowBeaconing) - UpdateBeaconHandler(pAd, wdev_temp, - BCN_UPDATE_DISABLE_TX); - } - } - /* Don't clear the scan table if we are doing partial scan */ -#ifdef CON_WPS - ifIdx = wdev->func_idx; - - if ((ifIdx < MAX_APCLI_NUM) && - (pAd->ApCfg.ConWpsApCliDisabled == FALSE) && - (pAd->ApCfg.ApCliTab[ifIdx].wdev.WscControl.conWscStatus & - CON_WPS_STATUS_APCLI_RUNNING)) - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\033[1;32m ApSiteSurvey_by_wdev don't need Init BSS table\033[0m\n")); - else -#endif /*CON_WPS*/ - if ((pAd->ScanCtrl.PartialScan.bScanning == TRUE && - pAd->ScanCtrl.PartialScan.LastScanChannel == 0) || - pAd->ScanCtrl.PartialScan.bScanning == FALSE) { -#if defined(DBDC_MODE) && defined(DOT11K_RRM_SUPPORT) - if (pAd->CommonCfg.dbdc_mode == TRUE) { - UCHAR Band = 0; - if (WMODE_CAP_2G(wdev->PhyMode)) - Band = 0; - if (WMODE_CAP_5G(wdev->PhyMode)) - Band = 1; - - /* backup the other band's scan result. */ - BssTableInitByBand(&pAd->ScanTab, Band); - } else -#endif /* defined(DBDC_MODE) && defined(DOT11K_RRM_SUPPORT) */ - BssTableInit(&pAd->ScanTab); -#ifdef NEIGHBORING_AP_STAT - { - UINT8 index = 0; - if (wdev->channel <= 14) - index = SCAN_RESULT_2G; - else - index = SCAN_RESULT_5G; - pAd->ScanTab.ScanResult[index].rpi_cnt = 0; - pAd->ScanTab.ScanResult[index].item_ctr = 0; - RTMPZeroMemory( - pAd->ScanTab.ScanResult[index].items, - MAX_LEN_OF_BSS_TABLE * - sizeof(SCAN_RPT_ITEM)); - RTMPZeroMemory( - pAd->ScanTab.ScanResult[index].rpi, - MAX_RPI_CHANNEL_CNT * - sizeof(SCAN_RPI_HIST)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("(%s)::Current channel : %d \n", - __FUNCTION__, wdev->channel)); - } -#endif - } - - pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE; - -#ifdef OFFCHANNEL_SCAN_FEATURE - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("INFO::reset ChannelInfo!\n")); - ChannelInfoResetNew(pAd); - RTMPZeroMemory(&ScanReq, sizeof(ScanReq)); -#else - RTMPZeroMemory(ScanReq.Ssid, MAX_LEN_OF_SSID); -#endif - - ScanReq.SsidLen = 0; - - if ((pSsid) && (pSsid->SsidLength > 0) && - (pSsid->SsidLength <= (NDIS_802_11_LENGTH_SSID))) { - ScanReq.SsidLen = pSsid->SsidLength; - NdisMoveMemory(ScanReq.Ssid, pSsid->Ssid, pSsid->SsidLength); - } - - ScanReq.BssType = BSS_ANY; - ScanReq.ScanType = ScanType; - pAd->ApCfg.bAutoChannelAtBootup[BandIdx] = ChannelSel; - MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_MLME_SCAN_REQ, - sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, (ULONG)wdev); - RTMP_MLME_HANDLER(pAd); -} - -BOOLEAN ApScanRunning(RTMP_ADAPTER *pAd, struct wifi_dev *pwdev) -{ - BOOLEAN isScanOn = FALSE; - UCHAR BandIdx = 0; - AUTO_CH_CTRL *pAutoChCtrl = NULL; - - if (pwdev) { - BandIdx = HcGetBandByWdev(pwdev); - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - - if ((pAd->Mlme.ApSyncMachine.CurrState == AP_SCAN_LISTEN) || - (pAutoChCtrl->AutoChSelCtrl.AutoChScanStatMachine - .CurrState == AUTO_CH_SEL_SCAN_LISTEN)) - isScanOn = TRUE; - else - isScanOn = FALSE; - } else { - /* wdev null means check all of band */ - BandIdx = 0; - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - if ((pAd->Mlme.ApSyncMachine.CurrState == - AP_SCAN_LISTEN) || - (pAutoChCtrl->AutoChSelCtrl.AutoChScanStatMachine - .CurrState == AUTO_CH_SEL_SCAN_LISTEN)) - isScanOn |= TRUE; - } - } - - return isScanOn; -} -#endif /* AP_SCAN_SUPPORT */ - -/* - ========================================================================== - Description: - The sync state machine, - Parameters: - Sm - pointer to the state machine - Note: - the state machine looks like the following - - AP_SYNC_IDLE - APMT2_PEER_PROBE_REQ peer_probe_req_action - ========================================================================== - */ -VOID APSyncStateMachineInit(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]) -{ - StateMachineInit(Sm, (STATE_MACHINE_FUNC *)Trans, AP_MAX_SYNC_STATE, - AP_MAX_SYNC_MSG, (STATE_MACHINE_FUNC)Drop, - AP_SYNC_IDLE, AP_SYNC_MACHINE_BASE); - StateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_PEER_PROBE_REQ, - (STATE_MACHINE_FUNC)APPeerProbeReqAction); - StateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_PEER_BEACON, - (STATE_MACHINE_FUNC)APPeerBeaconAction); -#if defined(P2P_SUPPORT) || defined(RT_CFG80211_P2P_SUPPORT) || \ - defined(CFG80211_MULTI_STA) - StateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_PEER_PROBE_RSP, - (STATE_MACHINE_FUNC)APPeerBeaconAtScanAction); -#endif /* P2P_SUPPORT || RT_CFG80211_P2P_SUPPORT || CFG80211_MULTI_STA */ -#ifdef AP_SCAN_SUPPORT - StateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_MLME_SCAN_REQ, - (STATE_MACHINE_FUNC)APMlmeScanReqAction); -#ifdef CON_WPS - StateMachineSetAction(Sm, AP_SYNC_IDLE, APMT2_MLME_SCAN_COMPLETE, - (STATE_MACHINE_FUNC)APMlmeScanCompleteAction); -#endif /* CON_WPS */ - /* scan_listen state */ - StateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_MLME_SCAN_REQ, - (STATE_MACHINE_FUNC)APInvalidStateWhenScan); - StateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_PEER_BEACON, - (STATE_MACHINE_FUNC)APPeerBeaconAtScanAction); - StateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_PEER_PROBE_RSP, - (STATE_MACHINE_FUNC)APPeerBeaconAtScanAction); - StateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_SCAN_TIMEOUT, - (STATE_MACHINE_FUNC)APScanTimeoutAction); - StateMachineSetAction(Sm, AP_SCAN_LISTEN, APMT2_MLME_SCAN_CNCL, - (STATE_MACHINE_FUNC)APScanCnclAction); - RTMPInitTimer(pAd, &pAd->ScanCtrl.APScanTimer, - GET_TIMER_FUNCTION(APScanTimeout), pAd, FALSE); -#endif /* AP_SCAN_SUPPORT */ -} - -VOID SupportRate(IN PUCHAR SupRate, IN UCHAR SupRateLen, IN PUCHAR ExtRate, - IN UCHAR ExtRateLen, OUT PUCHAR *ppRates, OUT PUCHAR RatesLen, - OUT PUCHAR pMaxSupportRate) -{ - INT i; - *pMaxSupportRate = 0; - - if ((SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES) && (SupRateLen > 0)) { - NdisMoveMemory(*ppRates, SupRate, SupRateLen); - *RatesLen = SupRateLen; - } else { - /* HT rate not ready yet. return true temporarily. rt2860c */ - /*MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("PeerAssocReqSanity - wrong IE_SUPP_RATES\n")); */ - *RatesLen = 8; - *(*ppRates + 0) = 0x82; - *(*ppRates + 1) = 0x84; - *(*ppRates + 2) = 0x8b; - *(*ppRates + 3) = 0x96; - *(*ppRates + 4) = 0x12; - *(*ppRates + 5) = 0x24; - *(*ppRates + 6) = 0x48; - *(*ppRates + 7) = 0x6c; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SUPP_RATES., Len=%d\n", SupRateLen)); - } - - if (ExtRateLen + *RatesLen <= MAX_LEN_OF_SUPPORTED_RATES) { - NdisMoveMemory((*ppRates + (ULONG)*RatesLen), ExtRate, - ExtRateLen); - *RatesLen = (*RatesLen) + ExtRateLen; - } else { - NdisMoveMemory((*ppRates + (ULONG)*RatesLen), ExtRate, - MAX_LEN_OF_SUPPORTED_RATES - (*RatesLen)); - *RatesLen = MAX_LEN_OF_SUPPORTED_RATES; - } - - for (i = 0; i < *RatesLen; i++) { - if (*pMaxSupportRate < (*(*ppRates + i) & 0x7f)) - *pMaxSupportRate = (*(*ppRates + i) & 0x7f); - } -} -#ifdef OFFCHANNEL_SCAN_FEATURE -UCHAR Channel2Index(IN PRTMP_ADAPTER pAd, IN UCHAR channel) -{ - UCHAR i; - - for (i = 0; i < pAd->ChannelListNum; i++) { - if (channel == pAd->ChannelList[i].Channel) - return i; - } - return -1; -} - -INT ApSiteSurveyNew_by_wdev(IN PRTMP_ADAPTER pAd, IN UINT channel, - IN UINT timeout, IN UCHAR ScanType, - IN BOOLEAN ChannelSel, struct wifi_dev *wdev) -{ - MLME_SCAN_REQ_STRUCT ScanReq; - UCHAR BandIdx = HcGetBandByWdev(wdev); - - RTMPZeroMemory(&ScanReq, sizeof(ScanReq)); - ; - AsicDisableSync(pAd, HW_BSSID_0); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s , %u, %u, %u", __func__, channel, timeout, ScanType)); - BssTableInit(&pAd->ScanTab); - ChannelInfoResetNew(pAd); - pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE; - pAd->ScanCtrl.CurrentGivenChan_Index = 0; - ScanReq.BssType = BSS_ANY; - ScanReq.ScanType = ScanType; - /* to make the code compatible with non application/iwpriv path */ - if (!pAd->ScanCtrl.ScanTime[0]) { - pAd->ScanCtrl.ScanTime[0] = timeout; - pAd->ScanCtrl.ScanGivenChannel[0] = channel; - } - pAd->ApCfg.bAutoChannelAtBootup[BandIdx] = ChannelSel; - pAd->ChannelInfo.bandidx = HcGetBandByChannel(pAd, channel); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : bandidx :%d!! \n", __func__, pAd->ChannelInfo.bandidx)); - pAd->ChannelInfo.ChannelIdx = Channel2Index(pAd, channel); - if (channel) { - pAd->ApCfg.current_channel_index = Channel2Index(pAd, channel); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] ApCfg.current_channel_index = %d\n", __func__, - pAd->ApCfg.current_channel_index)); - pAd->ChannelInfo.ChannelNo = channel; - } - MlmeEnqueue(pAd, AP_SYNC_STATE_MACHINE, APMT2_MLME_SCAN_REQ, - sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, (ULONG)wdev); - RTMP_MLME_HANDLER(pAd); - return CHANNEL_MONITOR_STRG_SUCCESS; -} -#endif - -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - -#define OLD_BSS_TIMEOUT 300000 - -#ifdef CONFIG_MAP_SUPPORT -#undef OLD_BSS_TIMEOUT -#define OLD_BSS_TIMEOUT 10000 /*10 seconds*/ -#endif -VOID RemoveOldBssEntry(IN PRTMP_ADAPTER pAd) -{ - INT32 i; - - if (pAd->AvailableBSS.BssNr > 0) { - for (i = 0; i < pAd->AvailableBSS.BssNr; i++) { - if (MAC_ADDR_EQUAL(ZERO_MAC_ADDR, - pAd->AvailableBSS.BssEntry[i].Bssid)) - continue; - if ((jiffies_to_msecs(jiffies) - - pAd->AvailableBSS.BssEntry[i].LastBeaconRxTimeT) >= - OLD_BSS_TIMEOUT) { - NdisZeroMemory(&pAd->AvailableBSS.BssEntry[i], - sizeof(BSS_ENTRY)); - if (i != (pAd->AvailableBSS.BssNr - 1)) { - NdisCopyMemory( - &pAd->AvailableBSS.BssEntry[i], - &pAd->AvailableBSS.BssEntry - [pAd->AvailableBSS.BssNr - - 1], - sizeof(BSS_ENTRY)); - NdisZeroMemory( - &pAd->AvailableBSS.BssEntry - [pAd->AvailableBSS.BssNr - - 1], - sizeof(BSS_ENTRY)); - } - pAd->AvailableBSS.BssNr--; - } - } - } -} - -#endif - -#ifdef DOT11_N_SUPPORT -void build_ext_channel_switch_ie(IN PRTMP_ADAPTER pAd, - IN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE, - IN UCHAR Channel, IN UCHAR PhyMode, - IN struct wifi_dev *wdev) -{ - struct DOT11_H *pDot11h = NULL; - - if (wdev == NULL) - return; - - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) - return; - pDot11h = wdev->pDot11_H; - pIE->ID = IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT; - pIE->Length = 4; - pIE->ChannelSwitchMode = 1; /*no further frames */ - pIE->NewRegClass = get_regulatory_class(pAd, Channel, PhyMode, wdev); - pIE->NewChannelNum = Channel; -#ifdef CUSTOMER_DCC_FEATURE - if ((pAd->CommonCfg.channelSwitch.CHSWMode == CHANNEL_SWITCHING_MODE) && - (pDot11h->RDMode != RD_SWITCHING_MODE)) - pIE->ChannelSwitchCount = - pAd->CommonCfg.channelSwitch.CHSWPeriod - - pAd->CommonCfg.channelSwitch.CHSWCount - 1; - else -#endif - pIE->ChannelSwitchCount = - (pDot11h->CSPeriod - pDot11h->CSCount - 1); -} -#endif /* DOT11_N_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_vow.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_vow.c deleted file mode 100644 index a7eb576e7a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/ap/ap_vow.c +++ /dev/null @@ -1,4985 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_vow.c -*/ - -#include "rt_config.h" -#include "mcu/mt_cmd.h" -#include "hdev/hdev.h" - -#ifdef VOW_SUPPORT -#define UMAC_DRR_TABLE_CTRL0 (0x00008388) - -#define UMAC_DRR_TABLE_WDATA0 (0x00008340) -#define UMAC_DRR_TABLE_WDATA1 (0x00008344) -#define UMAC_DRR_TABLE_WDATA2 (0x00008348) -#define UMAC_DRR_TABLE_WDATA3 (0x0000834C) - -/* Charge mode control control operation (0x8x : charge tx time & length) */ - -#define UMAC_CHARGE_BW_TOKEN_BIT_MASK BIT(0) -#define UMAC_CHARGE_BW_DRR_BIT_MASK BIT(1) -#define UMAC_CHARGE_AIRTIME_DRR_BIT_MASK BIT(2) -#define UMAC_CHARGE_ADD_MODE_BIT_MASK BIT(3) - -#define UMAC_CHARGE_OP_BASE 0x80 -#define UMAC_CHARGE_BW_TOKEN_OP_MASK \ - (UMAC_CHARGE_OP_BASE | UMAC_CHARGE_BW_TOKEN_BIT_MASK) -#define UMAC_CHARGE_BW_DRR_OP_MASK \ - (UMAC_CHARGE_OP_BASE | UMAC_CHARGE_BW_DRR_BIT_MASK) -#define UMAC_CHARGE_AIRTIME_DRR_OP_MASK \ - (UMAC_CHARGE_OP_BASE | UMAC_CHARGE_AIRTIME_DRR_BIT_MASK) - -#define UMAC_CHARGE_MODE_STA_ID_MASK BITS(0, 7) -#define UMAC_CHARGE_MODE_STA_ID_OFFSET 0 -#define UMAC_CHARGE_MODE_QUEUE_ID_MASK BITS(8, 11) -#define UMAC_CHARGE_MODE_QUEUE_ID_OFFSET 8 - -#define UMAC_CHARGE_MODE_BSS_GROUP_MASK BITS(0, 3) -#define UMAC_CHARGE_MODE_BSS_GROUP_OFFSET 0 - -#define UMAC_CHARGE_MODE_WDATA_CHARGE_LENGTH_MASK BITS(0, 15) -#define UMAC_CHARGE_MODE_WDATA_CHARGE_LENGTH_OFFSET 0 - -#define UMAC_CHARGE_MODE_WDATA_CHARGE_TIME_MASK BITS(16, 31) -#define UMAC_CHARGE_MODE_WDATA_CHARGE_TIME_OFFSET 16 - -/* Change MODE Ctrl operation */ -#define UMAC_DRR_TABLE_CTRL0_CHANGE_MODE_MASK BIT(23) -#define UMAC_DRR_TABLE_CTRL0_CHANGE_MODE_OFFSET 23 - -/* 00000340 DRR_Table_WData DRR table Wdata register register 00000000 */ - -#define UMAC_DRR_TABLE_WDATA0_STA_MODE_MASK BITS(0, 15) -#define UMAC_DRR_TABLE_WDATA0_STA_MODE_OFFSET 0 - -/* 00000350 DRR_Table_Rdata DRR table control register read data 00000000 */ -#define UMAC_DRR_TABLE_RDATA0_STA_MODE_MASK BITS(0, 15) -#define UMAC_DRR_TABLE_RDATA0_STA_MODE_OFFSET 0 - -/* 00000388 DRR_Table_ctrl0 DRR table control register register 0 00000000 */ - -#define UMAC_DRR_TABLE_CTRL0_EXEC_MASK BIT(31) -#define UMAC_DRR_TABLE_CTRL0_EXEC_OFFSET 31 -#define UMAC_DRR_TABLE_CTRL0_MODE_OP_OFFSET 16 - -#define UMAC_BSS_GROUP_NUMBER 16 -#define UMAC_WLAN_ID_MAX_VALUE 127 - -#ifndef _LINUX_BITOPS_H -#define BIT(n) ((UINT32)1 << (n)) -#endif /* BIT */ -#define BITS(m, n) (~(BIT(m) - 1) & ((BIT(n) - 1) | BIT(n))) - -#define VOW_DEF_AVA_AIRTIME (1000000) /* us */ - -#define VOW_BSS_SETTING_BEGIN 16 -#define VOW_BSS_SETTING_END (VOW_BSS_SETTING_BEGIN + 16) - -/* global variables */ -PRTMP_ADAPTER pvow_pad; -UINT32 vow_tx_time[MAX_LEN_OF_MAC_TABLE]; -UINT32 vow_rx_time[MAX_LEN_OF_MAC_TABLE]; -UINT32 vow_tx_ok[MAX_LEN_OF_MAC_TABLE]; -UINT32 vow_tx_fail[MAX_LEN_OF_MAC_TABLE]; -UINT32 vow_sum_tx_rx_time; -UINT32 vow_avg_sum_time; -UINT32 vow_last_tx_time[MAX_LEN_OF_MAC_TABLE]; -UINT32 vow_last_rx_time[MAX_LEN_OF_MAC_TABLE]; -UINT16 vow_idx; -UINT32 vow_tx_bss_byte[WMM_NUM_OF_AC]; -UINT32 vow_rx_bss_byte[WMM_NUM_OF_AC]; -UINT32 vow_tx_mbss_byte[VOW_MAX_GROUP_NUM]; -UINT32 vow_rx_mbss_byte[VOW_MAX_GROUP_NUM]; -UINT32 vow_ampdu_cnt; -UINT32 vow_interval; -UINT32 vow_last_free_cnt; - -/* VOW internal commands */ -/***********************************************************/ -/* EXT_CMD_ID_DRR_CTRL = 0x36 */ -/***********************************************************/ -/* for station DWRR configration */ -INT32 vow_set_sta(PRTMP_ADAPTER pad, UINT8 sta_id, UINT32 subcmd) -{ - EXT_CMD_VOW_DRR_CTRL_T sta_ctrl; - UINT32 Setting = 0; - INT32 ret; - - if (sta_id >= MAX_LEN_OF_MAC_TABLE) - return FALSE; - - NdisZeroMemory(&sta_ctrl, sizeof(sta_ctrl)); - sta_ctrl.u4CtrlFieldID = subcmd; - sta_ctrl.ucStaID = sta_id; - - switch (subcmd) { - case ENUM_VOW_DRR_CTRL_FIELD_STA_ALL: - /* station configration */ - Setting |= pad->vow_sta_cfg[sta_id].group; - Setting |= (pad->vow_sta_cfg[sta_id].ac_change_rule - << pad->vow_gen.VOW_STA_AC_PRIORITY_OFFSET); - Setting |= (pad->vow_sta_cfg[sta_id].dwrr_quantum[WMM_AC_BK] - << pad->vow_gen.VOW_STA_WMM_AC0_OFFSET); - Setting |= (pad->vow_sta_cfg[sta_id].dwrr_quantum[WMM_AC_BE] - << pad->vow_gen.VOW_STA_WMM_AC1_OFFSET); - Setting |= (pad->vow_sta_cfg[sta_id].dwrr_quantum[WMM_AC_VI] - << pad->vow_gen.VOW_STA_WMM_AC2_OFFSET); - Setting |= (pad->vow_sta_cfg[sta_id].dwrr_quantum[WMM_AC_VO] - << pad->vow_gen.VOW_STA_WMM_AC3_OFFSET); - sta_ctrl.rAirTimeCtrlValue.u4ComValue = Setting; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - Setting)); - break; - - case ENUM_VOW_DRR_CTRL_FIELD_STA_BSS_GROUP: - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_sta_cfg[sta_id].group; - break; - - case ENUM_VOW_DRR_CTRL_FIELD_STA_PRIORITY: - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_sta_cfg[sta_id].ac_change_rule; - break; - - case ENUM_VOW_DRR_CTRL_FIELD_STA_AC0_QUA_ID: - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_sta_cfg[sta_id].dwrr_quantum[WMM_AC_BK]; - break; - - case ENUM_VOW_DRR_CTRL_FIELD_STA_AC1_QUA_ID: - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_sta_cfg[sta_id].dwrr_quantum[WMM_AC_BE]; - break; - - case ENUM_VOW_DRR_CTRL_FIELD_STA_AC2_QUA_ID: - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_sta_cfg[sta_id].dwrr_quantum[WMM_AC_VI]; - break; - - case ENUM_VOW_DRR_CTRL_FIELD_STA_AC3_QUA_ID: - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_sta_cfg[sta_id].dwrr_quantum[WMM_AC_VO]; - break; - break; - - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L0: - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L1: - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L2: - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L3: - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L4: - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L5: - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L6: - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L7: - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_cfg.vow_sta_dwrr_quantum - [subcmd - - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L0]; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - pad->vow_cfg.vow_sta_dwrr_quantum - [subcmd - - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L0])); - break; - - case ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_ALL: { - UINT32 i; - - /* station quantum configruation */ - for (i = 0; i < VOW_MAX_STA_DWRR_NUM; i++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(vow_sta_dwrr_quantum[%d] = 0x%x)\n", - __func__, i, - pad->vow_cfg.vow_sta_dwrr_quantum[i])); - sta_ctrl.rAirTimeCtrlValue.rAirTimeQuantumAllField - .ucAirTimeQuantum[i] = - pad->vow_cfg.vow_sta_dwrr_quantum[i]; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - Setting)); - } break; - - case ENUM_VOW_DRR_CTRL_FIELD_STA_PAUSE_SETTING: { - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_sta_cfg[sta_id].paused; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - pad->vow_sta_cfg[sta_id].paused)); - } break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such command = 0x%x)\n", __func__, subcmd)); - break; - } - - ret = MtCmdSetVoWDRRCtrl(pad, &sta_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_VOW_DRR_CTRL_T))); - return ret; -} - -/* for DWRR max wait time configuration */ -INT vow_set_sta_DWRR_max_time(PRTMP_ADAPTER pad) -{ - EXT_CMD_VOW_DRR_CTRL_T sta_ctrl; - INT32 ret; - - NdisZeroMemory(&sta_ctrl, sizeof(sta_ctrl)); - sta_ctrl.u4CtrlFieldID = ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_DEFICIT_BOUND; - sta_ctrl.rAirTimeCtrlValue.u4ComValue = pad->vow_cfg.sta_max_wait_time; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(sta_max_wait_time = 0x%x)\n", __func__, - pad->vow_cfg.sta_max_wait_time)); - ret = MtCmdSetVoWDRRCtrl(pad, &sta_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_VOW_DRR_CTRL_T))); - return ret; -} -/***********************************************************/ -/* EXT_CMD_ID_BSSGROUP_CTRL = 0x37 */ -/***********************************************************/ -VOID vow_fill_group_all(PRTMP_ADAPTER pad, UINT8 group_id, - EXT_CMD_BSS_CTRL_T *group_ctrl) -{ - /* DW0 */ - group_ctrl->arAllBssGroupMultiField[group_id].u2MinRateToken = - pad->vow_bss_cfg[group_id].min_rate_token; - group_ctrl->arAllBssGroupMultiField[group_id].u2MaxRateToken = - pad->vow_bss_cfg[group_id].max_rate_token; - /* DW1 */ - group_ctrl->arAllBssGroupMultiField[group_id].u4MinTokenBucketTimeSize = - pad->vow_bss_cfg[group_id].min_airtimebucket_size; - group_ctrl->arAllBssGroupMultiField[group_id].u4MinAirTimeToken = - pad->vow_bss_cfg[group_id].min_airtime_token; - group_ctrl->arAllBssGroupMultiField[group_id].u4MinTokenBucketLengSize = - pad->vow_bss_cfg[group_id].min_ratebucket_size; - /* DW2 */ - group_ctrl->arAllBssGroupMultiField[group_id].u4MaxTokenBucketTimeSize = - pad->vow_bss_cfg[group_id].max_airtimebucket_size; - group_ctrl->arAllBssGroupMultiField[group_id].u4MaxAirTimeToken = - pad->vow_bss_cfg[group_id].max_airtime_token; - group_ctrl->arAllBssGroupMultiField[group_id].u4MaxTokenBucketLengSize = - pad->vow_bss_cfg[group_id].max_ratebucket_size; - /* DW3 */ - group_ctrl->arAllBssGroupMultiField[group_id].u4MaxWaitTime = - pad->vow_bss_cfg[group_id].max_wait_time; - group_ctrl->arAllBssGroupMultiField[group_id].u4MaxBacklogSize = - pad->vow_bss_cfg[group_id].max_backlog_size; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(Group id = 0x%x, min_rate %d, max_rate %d, min_ratio %d, max_ratio %d)\n", - __func__, group_id, pad->vow_bss_cfg[group_id].min_rate, - pad->vow_bss_cfg[group_id].max_rate, - pad->vow_bss_cfg[group_id].min_airtime_ratio, - pad->vow_bss_cfg[group_id].max_airtime_ratio)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(min rate token = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].min_rate_token)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(max rate token = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].max_rate_token)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(min airtime token = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].min_airtime_token)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(max airtime token = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].max_airtime_token)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(min rate bucket = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].min_ratebucket_size)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(max rate bucket = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].max_ratebucket_size)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(min airtime bucket = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].min_airtimebucket_size)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(max airtime bucket = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].max_airtimebucket_size)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(max baclog size = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].max_backlog_size)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(max wait time = 0x%x)\n", __func__, - pad->vow_bss_cfg[group_id].max_wait_time)); -} -/* for group configuration */ -INT vow_set_group(PRTMP_ADAPTER pad, UINT8 group_id, UINT32 subcmd) -{ - EXT_CMD_BSS_CTRL_T group_ctrl; - INT32 ret; - - NdisZeroMemory(&group_ctrl, sizeof(group_ctrl)); - group_ctrl.u4CtrlFieldID = subcmd; - group_ctrl.ucBssGroupID = group_id; - - switch (subcmd) { - /* group configuration */ - case ENUM_BSSGROUP_CTRL_ALL_ITEM_FOR_1_GROUP: - vow_fill_group_all(pad, group_id, &group_ctrl); - break; - - case ENUM_BSSGROUP_CTRL_MIN_RATE_TOKEN_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].min_rate_token; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MAX_RATE_TOKEN_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].max_rate_token; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MIN_TOKEN_BUCKET_TIME_SIZE_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].min_airtimebucket_size; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MIN_AIRTIME_TOKEN_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].min_airtime_token; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MIN_TOKEN_BUCKET_LENG_SIZE_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].min_ratebucket_size; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MAX_TOKEN_BUCKET_TIME_SIZE_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].max_airtimebucket_size; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MAX_AIRTIME_TOKEN_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].max_airtime_token; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MAX_TOKEN_BUCKET_LENG_SIZE_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].max_ratebucket_size; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MAX_WAIT_TIME_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].max_wait_time; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_MAX_BACKLOG_SIZE_CFG_ITEM: - group_ctrl.u4SingleFieldIDValue = - pad->vow_bss_cfg[group_id].max_backlog_size; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(SubCmd %x, Value = 0x%x)\n", __func__, subcmd, - group_ctrl.u4SingleFieldIDValue)); - break; - - case ENUM_BSSGROUP_CTRL_ALL_ITEM_FOR_ALL_GROUP: { - UINT32 i; - - for (i = 0; i < VOW_MAX_GROUP_NUM; i++) - vow_fill_group_all(pad, i, &group_ctrl); - } break; - - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_00: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_01: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_02: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_03: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_04: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_05: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_06: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_07: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_08: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_09: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0A: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0B: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0C: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0D: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0E: - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0F: - /* Group DWRR quantum */ - group_ctrl.ucBssGroupQuantumTime[group_id] = - pad->vow_bss_cfg[group_id].dwrr_quantum; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(group %d DWRR quantum = 0x%x)\n", __func__, - group_id, pad->vow_bss_cfg[group_id].dwrr_quantum)); - break; - - case ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_ALL: { - UINT32 i; - - for (i = 0; i < VOW_MAX_GROUP_NUM; i++) { - group_ctrl.ucBssGroupQuantumTime[i] = - pad->vow_bss_cfg[i].dwrr_quantum; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(group %d DWRR quantum = 0x%x)\n", - __func__, i, - pad->vow_bss_cfg[i].dwrr_quantum)); - } - } break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such command = 0x%x)\n", __func__, subcmd)); - break; - } - - ret = MtCmdSetVoWGroupCtrl(pad, &group_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_BSS_CTRL_T))); - return ret; -} - -/* for DWRR max wait time configuration */ -INT vow_set_group_DWRR_max_time(PRTMP_ADAPTER pad) -{ - EXT_CMD_VOW_DRR_CTRL_T sta_ctrl; - INT32 ret; - - NdisZeroMemory(&sta_ctrl, sizeof(sta_ctrl)); - sta_ctrl.u4CtrlFieldID = ENUM_VOW_DRR_CTRL_FIELD_BW_DEFICIT_BOUND; - sta_ctrl.rAirTimeCtrlValue.u4ComValue = - pad->vow_cfg.group_max_wait_time; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(group_max_wait_time = 0x%x)\n", __func__, - pad->vow_cfg.group_max_wait_time)); - ret = MtCmdSetVoWDRRCtrl(pad, &sta_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_VOW_DRR_CTRL_T))); - return ret; -} - -/***********************************************************/ -/* EXT_CMD_ID_VOW_FEATURE_CTRL = 0x38 */ -/***********************************************************/ -/* for group configuration */ -INT vow_set_feature_all(PRTMP_ADAPTER pad) -{ - EXT_CMD_VOW_FEATURE_CTRL_T feature_ctrl; - INT32 ret, i; - - NdisZeroMemory(&feature_ctrl, sizeof(feature_ctrl)); - /* DW0 - flags */ - feature_ctrl.u2IfApplyBss_0_to_16_CtrlFlag = 0xFFFF; /* 16'b */ - feature_ctrl.u2IfApplyRefillPerildFlag = TRUE; /* 1'b */ - feature_ctrl.u2IfApplyDbdc1SearchRuleFlag = TRUE; /* 1'b */ - feature_ctrl.u2IfApplyDbdc0SearchRuleFlag = TRUE; /* 1'b */ - feature_ctrl.u2IfApplyEnTxopNoChangeBssFlag = TRUE; /* 1'b */ - feature_ctrl.u2IfApplyAirTimeFairnessFlag = TRUE; /* 1'b */ - feature_ctrl.u2IfApplyWeightedAirTimeFairnessFlag = TRUE; /* 1'b */ - feature_ctrl.u2IfApplyEnbwrefillFlag = TRUE; /* 1'b */ - feature_ctrl.u2IfApplyEnbwCtrlFlag = TRUE; /* 1'b */ - /* DW1 - flags */ - feature_ctrl.u2IfApplyBssCheckTimeToken_0_to_16_CtrlFlag = 0xFFFF; - /* DW2 - flags */ - feature_ctrl.u2IfApplyBssCheckLengthToken_0_to_16_CtrlFlag = 0xFFFF; - /* DW5 - ctrl values */ - feature_ctrl.u2Bss_0_to_16_CtrlValue = - pad->vow_cfg.per_bss_enable; /* 16'b */ - feature_ctrl.u2RefillPerildValue = pad->vow_cfg.refill_period; /* 8'b */ - feature_ctrl.u2Dbdc1SearchRuleValue = - pad->vow_cfg.dbdc1_search_rule; /* 1'b */ - feature_ctrl.u2Dbdc0SearchRuleValue = - pad->vow_cfg.dbdc0_search_rule; /* 1'b */ - feature_ctrl.u2WeightedAirTimeFairnessValue = - pad->vow_watf_en; /* 1'b */ - feature_ctrl.u2EnTxopNoChangeBssValue = - pad->vow_cfg.en_txop_no_change_bss; /* 1'b */ - feature_ctrl.u2AirTimeFairnessValue = - pad->vow_cfg.en_airtime_fairness; /* 1'b */ - feature_ctrl.u2EnbwrefillValue = pad->vow_cfg.en_bw_refill; /* 1'b */ - feature_ctrl.u2EnbwCtrlValue = pad->vow_cfg.en_bw_ctrl; /* 1'b */ - - /* DW6 - ctrl values */ - for (i = 0; i < VOW_MAX_GROUP_NUM; i++) - feature_ctrl.u2BssCheckTimeToken_0_to_16_CtrlValue |= - (pad->vow_bss_cfg[i].at_on << i); - - /* DW7 - ctrl values */ - for (i = 0; i < VOW_MAX_GROUP_NUM; i++) - feature_ctrl.u2BssCheckLengthToken_0_to_16_CtrlValue |= - (pad->vow_bss_cfg[i].bw_on << i); - - if (pad->vow_gen.VOW_GEN == VOW_GEN_2) { - /* DW8 - misc */ - feature_ctrl.u4IfApplyStaLockForRtsFlag = TRUE; /* 1'b */ - feature_ctrl.u4RtsStaLockValue = - pad->vow_misc_cfg.rts_sta_lock; /* 1'b */ - /* VOW is disabled, skip all setting */ - if (vow_is_enabled(pad)) { - feature_ctrl.u4IfApplyKeepQuantumFlag = TRUE; /* 1'b */ - feature_ctrl.u4KeepQuantumValue = - pad->vow_misc_cfg.keep_quantum; /* 1'b */ - feature_ctrl.u4IfApplyTxCountModeFlag = TRUE; /* 1'b */ - feature_ctrl.u4TxCountValue = - pad->vow_misc_cfg.tx_rr_count; /* 4'b */ - feature_ctrl.u4IfApplyTxMeasurementModeFlag = - TRUE; /* 1'b */ - feature_ctrl.u4TxMeasurementModeValue = - pad->vow_misc_cfg.measurement_mode; /* 1'b */ - feature_ctrl.u4IfApplyTxBackOffBoundFlag = - TRUE; /* 1'b */ - feature_ctrl.u4TxBackOffBoundEnable = - pad->vow_misc_cfg.max_backoff_bound_en; /* 1'b */ - feature_ctrl.u4TxBackOffBoundValue = - pad->vow_misc_cfg.max_backoff_bound; /* 4'b */ - feature_ctrl.u4IfApplyRtsFailedChargeDisFlag = - TRUE; /* 1'b */ - feature_ctrl.u4RtsFailedChargeDisValue = - pad->vow_misc_cfg - .rts_failed_charge_time_en; /* 1'b */ - feature_ctrl.u4IfApplyRxEifsToZeroFlag = TRUE; /* 1'b */ - feature_ctrl.u4ApplyRxEifsToZeroValue = - pad->vow_misc_cfg.zero_eifs_time; /* 1'b */ - feature_ctrl.u4IfApplyRxRifsModeforCckCtsFlag = - TRUE; /* 1'b */ - feature_ctrl.u4RxRifsModeforCckCtsValue = - pad->vow_misc_cfg.rx_rifs_mode; /* 1'b */ - feature_ctrl.u4IfApplyKeepVoWSettingForSerFlag = - TRUE; /* 1'b */ - feature_ctrl.u4VowKeepSettingValue = - pad->vow_misc_cfg - .keep_vow_sram_setting; /* 1'b */ - feature_ctrl.u4VowKeepSettingBit = - pad->vow_misc_cfg - .keep_vow_sram_setting_bit; /* 1'b */ - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2Bss_0_to_16_CtrlValue = 0x%x)\n", __func__, - pad->vow_cfg.per_bss_enable)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2RefillPerildValue = 0x%x)\n", __func__, - pad->vow_cfg.refill_period)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2Dbdc1SearchRuleValue = 0x%x)\n", __func__, - pad->vow_cfg.dbdc1_search_rule)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2Dbdc0SearchRuleValue = 0x%x)\n", __func__, - pad->vow_cfg.dbdc0_search_rule)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2EnTxopNoChangeBssValue = 0x%x)\n", __func__, - pad->vow_cfg.en_txop_no_change_bss)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2AirTimeFairnessValue = 0x%x)\n", __func__, - pad->vow_cfg.en_airtime_fairness)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2EnbwrefillValue = 0x%x)\n", __func__, - pad->vow_cfg.en_bw_refill)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2EnbwCtrlValue = 0x%x)\n", __func__, - pad->vow_cfg.en_bw_ctrl)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2WeightedAirTimeFairnessValue = 0x%x)\n", __func__, - pad->vow_watf_en)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2BssCheckTimeToken_0_to_16_CtrlValue = 0x%x)\n", - __func__, - feature_ctrl.u2BssCheckTimeToken_0_to_16_CtrlValue)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(u2BssCheckLengthToken_0_to_16_CtrlValue = 0x%x)\n", - __func__, - feature_ctrl.u2BssCheckLengthToken_0_to_16_CtrlValue)); - ret = MtCmdSetVoWFeatureCtrl(pad, &feature_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_VOW_FEATURE_CTRL_T))); - return ret; -} - -/***********************************************************/ -/* EXT_CMD_ID_RX_AIRTIME_CTRL = 0x4a */ -/***********************************************************/ -/* for RX airtime configuration */ -INT vow_set_rx_airtime(PRTMP_ADAPTER pad, UINT8 cmd, UINT32 subcmd) -{ - EXT_CMD_RX_AT_CTRL_T rx_at_ctrl; - INT32 ret; - /* init structure to zero */ - NdisZeroMemory(&rx_at_ctrl, sizeof(rx_at_ctrl)); - /* assign cmd and subcmd */ - rx_at_ctrl.u4CtrlFieldID = cmd; - rx_at_ctrl.u4CtrlSubFieldID = subcmd; - - switch (cmd) { - /* RX airtime feature control */ - case ENUM_RX_AT_FEATURE_CTRL: - switch (subcmd) { - case ENUM_RX_AT_FEATURE_SUB_TYPE_AIRTIME_EN: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl - .fgRxAirTimeEn = - pad->vow_rx_time_cfg.rx_time_en; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, value = 0x%x)\n", - __func__, cmd, subcmd, - pad->vow_rx_time_cfg.rx_time_en)); - break; - - case ENUM_RX_AT_FEATURE_SUB_TYPE_MIBTIME_EN: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(Not implemented yet = 0x%x)\n", __func__, - subcmd)); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such sub command = 0x%x)\n", __func__, - subcmd)); - } - - break; - - case ENUM_RX_AT_BITWISE_CTRL: - switch (subcmd) { - case ENUM_RX_AT_BITWISE_SUB_TYPE_AIRTIME_CLR: /* clear all RX airtime counters */ - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl - .fgRxAirTimeClrEn = TRUE; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, value = 0x%x)\n", - __func__, cmd, subcmd, - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl - .fgRxAirTimeClrEn)); - break; - - case ENUM_RX_AT_BITWISE_SUB_TYPE_MIBTIME_CLR: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(Not implemented yet = 0x%x)\n", __func__, - subcmd)); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such sub command = 0x%x)\n", __func__, - subcmd)); - } - - break; - - case ENUM_RX_AT_TIMER_VALUE_CTRL: - switch (subcmd) { - case ENUM_RX_AT_TIME_VALUE_SUB_TYPE_ED_OFFSET_CTRL: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .ucEdOffsetValue = - pad->vow_rx_time_cfg.ed_offset; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, value = 0x%x)\n", - __func__, cmd, subcmd, - pad->vow_rx_time_cfg.ed_offset)); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such sub command = 0x%x)\n", __func__, - subcmd)); - } - - break; - - case EMUM_RX_AT_REPORT_CTRL: - switch (subcmd) { - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such sub command = 0x%x)\n", __func__, - subcmd)); - } - - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such command = 0x%x)\n", __func__, subcmd)); - break; - } - - ret = MtCmdSetVoWRxAirtimeCtrl(pad, &rx_at_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_RX_AT_CTRL_T))); - return ret; -} - -/* select RX WMM backoff time for 4 OM */ -INT vow_set_wmm_selection(PRTMP_ADAPTER pad, UINT8 om) -{ - EXT_CMD_RX_AT_CTRL_T rx_at_ctrl; - INT32 ret; - /* init structure to zero */ - NdisZeroMemory(&rx_at_ctrl, sizeof(rx_at_ctrl)); - /* assign cmd and subcmd */ - rx_at_ctrl.u4CtrlFieldID = ENUM_RX_AT_BITWISE_CTRL; - rx_at_ctrl.u4CtrlSubFieldID = ENUM_RX_AT_BITWISE_SUB_TYPE_STA_WMM_CTRL; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.ucOwnMacID = om; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.fgtoApplyWm00to03MibCfg = - pad->vow_rx_time_cfg.wmm_backoff_sel[om]; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, OM = 0x%x, Map = 0x%x)\n", - __func__, - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.ucOwnMacID, - ENUM_RX_AT_BITWISE_SUB_TYPE_STA_WMM_CTRL, om, - pad->vow_rx_time_cfg.wmm_backoff_sel[om])); - ret = MtCmdSetVoWRxAirtimeCtrl(pad, &rx_at_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_RX_AT_CTRL_T))); - return ret; -} - -/* set 16 MBSS mapping to 4 RX backoff time configurations */ -INT vow_set_mbss2wmm_map(PRTMP_ADAPTER pad, UINT8 bss_idx) -{ - EXT_CMD_RX_AT_CTRL_T rx_at_ctrl; - INT32 ret; - /* init structure to zero */ - NdisZeroMemory(&rx_at_ctrl, sizeof(rx_at_ctrl)); - /* assign cmd and subcmd */ - rx_at_ctrl.u4CtrlFieldID = ENUM_RX_AT_BITWISE_CTRL; - rx_at_ctrl.u4CtrlSubFieldID = ENUM_RX_AT_BITWISE_SUB_TYPE_MBSS_WMM_CTRL; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.ucMbssGroup = bss_idx; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.ucWmmGroup = - pad->vow_rx_time_cfg.bssid2wmm_set[bss_idx]; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, bss_idx = 0x%x, Map = 0x%x)\n", - __func__, rx_at_ctrl.u4CtrlFieldID, - rx_at_ctrl.u4CtrlSubFieldID, bss_idx, - pad->vow_rx_time_cfg.bssid2wmm_set[bss_idx])); - ret = MtCmdSetVoWRxAirtimeCtrl(pad, &rx_at_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_RX_AT_CTRL_T))); - return ret; -} - -/* set backoff time for RX*/ -INT vow_set_backoff_time(PRTMP_ADAPTER pad, UINT8 target) -{ - EXT_CMD_RX_AT_CTRL_T rx_at_ctrl; - INT32 ret; - /* init structure to zero */ - NdisZeroMemory(&rx_at_ctrl, sizeof(rx_at_ctrl)); - /* assign cmd and subcmd */ - rx_at_ctrl.u4CtrlFieldID = ENUM_RX_AT_TIMER_VALUE_CTRL; - rx_at_ctrl.u4CtrlSubFieldID = - ENUM_RX_AT_TIME_VALUE_SUB_TYPE_BACKOFF_TIMER; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackoffWmmGroupIdx = target; - - switch (target) { - case ENUM_RX_AT_WMM_GROUP_0: - case ENUM_RX_AT_WMM_GROUP_1: - case ENUM_RX_AT_WMM_GROUP_2: - case ENUM_RX_AT_WMM_GROUP_3: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC0Backoff = - pad->vow_rx_time_cfg.wmm_backoff[target][WMM_AC_BK]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC1Backoff = - pad->vow_rx_time_cfg.wmm_backoff[target][WMM_AC_BE]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC2Backoff = - pad->vow_rx_time_cfg.wmm_backoff[target][WMM_AC_VI]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC3Backoff = - pad->vow_rx_time_cfg.wmm_backoff[target][WMM_AC_VO]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxAtBackoffAcQMask = - (ENUM_RX_AT_AC_Q0_MASK_T | ENUM_RX_AT_AC_Q1_MASK_T | - ENUM_RX_AT_AC_Q2_MASK_T | ENUM_RX_AT_AC_Q3_MASK_T); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, group = 0x%x, BK = 0x%x, BE = 0x%x, VI = 0x%x, VO = 0x%x)\n", - __func__, rx_at_ctrl.u4CtrlFieldID, - rx_at_ctrl.u4CtrlSubFieldID, target, - pad->vow_rx_time_cfg.wmm_backoff[target][WMM_AC_BK], - pad->vow_rx_time_cfg.wmm_backoff[target][WMM_AC_BE], - pad->vow_rx_time_cfg.wmm_backoff[target][WMM_AC_VI], - pad->vow_rx_time_cfg.wmm_backoff[target][WMM_AC_VO])); - break; - - case ENUM_RX_AT_WMM_GROUP_PEPEATER: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC0Backoff = - pad->vow_rx_time_cfg.repeater_wmm_backoff[WMM_AC_BK]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC1Backoff = - pad->vow_rx_time_cfg.repeater_wmm_backoff[WMM_AC_BE]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC2Backoff = - pad->vow_rx_time_cfg.repeater_wmm_backoff[WMM_AC_VI]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC3Backoff = - pad->vow_rx_time_cfg.repeater_wmm_backoff[WMM_AC_VO]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxAtBackoffAcQMask = - (ENUM_RX_AT_AC_Q0_MASK_T | ENUM_RX_AT_AC_Q1_MASK_T | - ENUM_RX_AT_AC_Q2_MASK_T | ENUM_RX_AT_AC_Q3_MASK_T); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, group = 0x%x, BK = 0x%x, BE = 0x%x, VI = 0x%x, VO = 0x%x)\n", - __func__, rx_at_ctrl.u4CtrlFieldID, - rx_at_ctrl.u4CtrlSubFieldID, target, - pad->vow_rx_time_cfg.repeater_wmm_backoff[WMM_AC_BK], - pad->vow_rx_time_cfg.repeater_wmm_backoff[WMM_AC_BE], - pad->vow_rx_time_cfg.repeater_wmm_backoff[WMM_AC_VI], - pad->vow_rx_time_cfg.repeater_wmm_backoff[WMM_AC_VO])); - break; - - case ENUM_RX_AT_WMM_GROUP_STA: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC0Backoff = - pad->vow_rx_time_cfg.om_wmm_backoff[WMM_AC_BK]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC1Backoff = - pad->vow_rx_time_cfg.om_wmm_backoff[WMM_AC_BE]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC2Backoff = - pad->vow_rx_time_cfg.om_wmm_backoff[WMM_AC_VI]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC3Backoff = - pad->vow_rx_time_cfg.om_wmm_backoff[WMM_AC_VO]; - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxAtBackoffAcQMask = - (ENUM_RX_AT_AC_Q0_MASK_T | ENUM_RX_AT_AC_Q1_MASK_T | - ENUM_RX_AT_AC_Q2_MASK_T | ENUM_RX_AT_AC_Q3_MASK_T); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, group = 0x%x, BK = 0x%x, BE = 0x%x, VI = 0x%x, VO = 0x%x)\n", - __func__, rx_at_ctrl.u4CtrlFieldID, - rx_at_ctrl.u4CtrlSubFieldID, target, - pad->vow_rx_time_cfg.om_wmm_backoff[WMM_AC_BK], - pad->vow_rx_time_cfg.om_wmm_backoff[WMM_AC_BE], - pad->vow_rx_time_cfg.om_wmm_backoff[WMM_AC_VI], - pad->vow_rx_time_cfg.om_wmm_backoff[WMM_AC_VO])); - break; - - case ENUM_RX_AT_NON_QOS: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC0Backoff = - pad->vow_rx_time_cfg.non_qos_backoff; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, group = 0x%x, backoff time = 0x%x)\n", - __func__, rx_at_ctrl.u4CtrlFieldID, - rx_at_ctrl.u4CtrlSubFieldID, target, - pad->vow_rx_time_cfg.non_qos_backoff)); - break; - - case ENUM_RX_AT_OBSS: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC0Backoff = - pad->vow_rx_time_cfg.obss_backoff; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, group = 0x%x, backoff time = 0x%x)\n", - __func__, rx_at_ctrl.u4CtrlFieldID, - rx_at_ctrl.u4CtrlSubFieldID, target, - pad->vow_rx_time_cfg.obss_backoff)); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such command = 0x%x)\n", __func__, target)); - break; - } - - ret = MtCmdSetVoWRxAirtimeCtrl(pad, &rx_at_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_RX_AT_CTRL_T))); - return ret; -} - -/* set backoff time for RX*/ -INT vow_get_rx_time_counter(PRTMP_ADAPTER pad, UINT8 target, UINT8 band_idx) -{ - EXT_CMD_RX_AT_CTRL_T rx_at_ctrl; - INT32 ret; - /* init structure to zero */ - NdisZeroMemory(&rx_at_ctrl, sizeof(rx_at_ctrl)); - /* assign cmd and subcmd */ - rx_at_ctrl.u4CtrlFieldID = EMUM_RX_AT_REPORT_CTRL; - rx_at_ctrl.u4CtrlSubFieldID = target; - - switch (target) { - case ENUM_RX_AT_REPORT_SUB_TYPE_RX_NONWIFI_TIME: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtReportSubCtrl - .ucRxNonWiFiBandIdx = band_idx; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, target = 0x%x, band_idx = 0x%x)\n", - __func__, rx_at_ctrl.u4CtrlFieldID, - rx_at_ctrl.u4CtrlSubFieldID, target, band_idx)); - break; - - case ENUM_RX_AT_REPORT_SUB_TYPE_RX_OBSS_TIME: - rx_at_ctrl.rRxAtGeneralCtrl.rRxAtReportSubCtrl.ucRxObssBandIdx = - band_idx; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, target = 0x%x, band_idx = 0x%x)\n", - __func__, rx_at_ctrl.u4CtrlFieldID, - rx_at_ctrl.u4CtrlSubFieldID, target, band_idx)); - break; - - case ENUM_RX_AT_REPORT_SUB_TYPE_MIB_OBSS_TIME: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(Not implemented yet = 0x%x)\n", __func__, - target)); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such command = 0x%x)\n", __func__, target)); - } - - ret = MtCmdGetVoWRxAirtimeCtrl(pad, &rx_at_ctrl); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_RX_AT_CTRL_T))); - - if (target == ENUM_RX_AT_REPORT_SUB_TYPE_RX_NONWIFI_TIME) - return rx_at_ctrl.rRxAtGeneralCtrl.rRxAtReportSubCtrl - .u4RxNonWiFiBandTimer; - else if (target == ENUM_RX_AT_REPORT_SUB_TYPE_RX_OBSS_TIME) - return rx_at_ctrl.rRxAtGeneralCtrl.rRxAtReportSubCtrl - .u4RxObssBandTimer; - else if (target == ENUM_RX_AT_REPORT_SUB_TYPE_MIB_OBSS_TIME) - return rx_at_ctrl.rRxAtGeneralCtrl.rRxAtReportSubCtrl - .u4RxMibObssBandTimer; - else - return -1; -} -/***********************************************************/ -/* EXT_CMD_ID_AT_PROC_MODULE = 0x4b */ -/***********************************************************/ - -/* for airtime estimator module */ -INT vow_set_at_estimator(PRTMP_ADAPTER pad, UINT32 subcmd) -{ - EXT_CMD_AT_PROC_MODULE_CTRL_T at_proc; - INT32 ret; - /* init structure to zero */ - NdisZeroMemory(&at_proc, sizeof(at_proc)); - /* assign cmd and subcmd */ - at_proc.u4CtrlFieldID = ENUM_AT_RPOCESS_ESTIMATE_MODULE_CTRL; - at_proc.u4CtrlSubFieldID = cpu2le16(subcmd); -#ifdef RT_BIG_ENDIAN - at_proc.u4CtrlFieldID = cpu2le16(at_proc.u4CtrlFieldID); -#endif - - switch (subcmd) { - case ENUM_AT_PROC_EST_FEATURE_CTRL: - at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl.fgAtEstimateOnOff = - pad->vow_at_est.at_estimator_en; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, val = 0x%x)\n", - __func__, at_proc.u4CtrlFieldID, - at_proc.u4CtrlSubFieldID, - pad->vow_at_est.at_estimator_en)); - break; - - case ENUM_AT_PROC_EST_MONITOR_PERIOD_CTRL: - at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl - .u2AtEstMonitorPeriod = - cpu2le16(pad->vow_at_est.at_monitor_period); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, val = 0x%x)\n", - __func__, at_proc.u4CtrlFieldID, - at_proc.u4CtrlSubFieldID, - pad->vow_at_est.at_monitor_period)); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such command = 0x%x)\n", __func__, subcmd)); - } - - ret = MtCmdSetVoWModuleCtrl(pad, &at_proc); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_AT_PROC_MODULE_CTRL_T))); - return ret; -} - -INT vow_set_at_estimator_group(PRTMP_ADAPTER pad, UINT32 subcmd, UINT8 group_id) -{ - EXT_CMD_AT_PROC_MODULE_CTRL_T at_proc; - INT32 ret; - /* init structure to zero */ - NdisZeroMemory(&at_proc, sizeof(at_proc)); - /* assign cmd and subcmd */ - at_proc.u4CtrlFieldID = ENUM_AT_RPOCESS_ESTIMATE_MODULE_CTRL; - at_proc.u4CtrlSubFieldID = subcmd; -#ifdef RT_BIG_ENDIAN - at_proc.u4CtrlFieldID = cpu2le16(at_proc.u4CtrlFieldID); - at_proc.u4CtrlSubFieldID = cpu2le16(at_proc.u4CtrlSubFieldID); -#endif - - switch (subcmd) { - case ENUM_AT_PROC_EST_GROUP_RATIO_CTRL: - at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl - .u4GroupRatioBitMask |= (1UL << group_id); - at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl - .u2GroupMaxRatioValue[group_id] = - cpu2le16(pad->vow_bss_cfg[group_id].max_airtime_ratio); - at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl - .u2GroupMinRatioValue[group_id] = - cpu2le16(pad->vow_bss_cfg[group_id].min_airtime_ratio); -#ifdef RT_BIG_ENDIAN - at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl - .u4GroupRatioBitMask = - cpu2le32(at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl - .u4GroupRatioBitMask); -#endif - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, group %d, val = 0x%x/0x%x)\n", - __func__, at_proc.u4CtrlFieldID, - at_proc.u4CtrlSubFieldID, group_id, - pad->vow_bss_cfg[group_id].max_airtime_ratio, - pad->vow_bss_cfg[group_id].min_airtime_ratio)); - break; - - case ENUM_AT_PROC_EST_GROUP_TO_BAND_MAPPING: - at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl - .ucGrouptoSelectBand = group_id; - at_proc.rAtProcGeneralCtrl.rAtEstimateSubCtrl - .ucBandSelectedfromGroup = - pad->vow_bss_cfg[group_id].band_idx; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, group %d, val = 0x%x)\n", - __func__, at_proc.u4CtrlFieldID, - at_proc.u4CtrlSubFieldID, group_id, - pad->vow_bss_cfg[group_id].band_idx)); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such command = 0x%x)\n", __func__, subcmd)); - } - - ret = MtCmdSetVoWModuleCtrl(pad, &at_proc); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_AT_PROC_MODULE_CTRL_T))); - return ret; -} - -/* for bad node detector */ -INT vow_set_bad_node(PRTMP_ADAPTER pad, UINT32 subcmd) -{ - EXT_CMD_AT_PROC_MODULE_CTRL_T at_proc; - INT32 ret; - /* init structure to zero */ - NdisZeroMemory(&at_proc, sizeof(at_proc)); - /* assign cmd and subcmd */ - at_proc.u4CtrlFieldID = ENUM_AT_RPOCESS_BAD_NODE_MODULE_CTRL; -#ifdef RT_BIG_ENDIAN - at_proc.u4CtrlFieldID = cpu2le16(at_proc.u4CtrlFieldID); -#endif - at_proc.u4CtrlSubFieldID = cpu2le16(subcmd); - - switch (subcmd) { - case ENUM_AT_PROC_BAD_NODE_FEATURE_CTRL: - at_proc.rAtProcGeneralCtrl.rAtBadNodeSubCtrl.fgAtBadNodeOnOff = - pad->vow_badnode.bn_en; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, val = 0x%x)\n", - __func__, at_proc.u4CtrlFieldID, - at_proc.u4CtrlSubFieldID, pad->vow_badnode.bn_en)); - break; - - case ENUM_AT_PROC_BAD_NODE_MONITOR_PERIOD_CTRL: - at_proc.rAtProcGeneralCtrl.rAtBadNodeSubCtrl - .u2AtBadNodeMonitorPeriod = - cpu2le16(pad->vow_badnode.bn_monitor_period); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, val = 0x%x)\n", - __func__, at_proc.u4CtrlFieldID, - at_proc.u4CtrlSubFieldID, - pad->vow_badnode.bn_monitor_period)); - break; - - case ENUM_AT_PROC_BAD_NODE_FALLBACK_THRESHOLD: - at_proc.rAtProcGeneralCtrl.rAtBadNodeSubCtrl - .ucFallbackThreshold = - pad->vow_badnode.bn_fallback_threshold; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, val = 0x%x)\n", - __func__, at_proc.u4CtrlFieldID, - at_proc.u4CtrlSubFieldID, - pad->vow_badnode.bn_fallback_threshold)); - break; - - case ENUM_AT_PROC_BAD_NODE_PER_THRESHOLD: - at_proc.rAtProcGeneralCtrl.rAtBadNodeSubCtrl.ucTxPERThreshold = - pad->vow_badnode.bn_per_threshold; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(cmd = 0x%x, subcmd = 0x%x, val = 0x%x)\n", - __func__, at_proc.u4CtrlFieldID, - at_proc.u4CtrlSubFieldID, - pad->vow_badnode.bn_per_threshold)); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(No such command = 0x%x)\n", __func__, subcmd)); - } - - ret = MtCmdSetVoWModuleCtrl(pad, &at_proc); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d), sizeof %zu\n", __func__, ret, - sizeof(EXT_CMD_AT_PROC_MODULE_CTRL_T))); - return ret; -} - -void vow_dump_umac_CRs(PRTMP_ADAPTER pad) -{ - int i; - - for (i = 0x8340; i < 0x83c0; i += 4) { - UINT32 val; - - RTMP_IO_READ32(pad, i, &val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%0x -> 0x%0x\n", i, val)); - } -} -/* ---------------------- end -------------------------------*/ - -BOOLEAN vow_is_enabled(PRTMP_ADAPTER pad) -{ - return (pad->vow_cfg.en_bw_ctrl || pad->vow_cfg.en_airtime_fairness); -} - -BOOLEAN vow_watf_is_enabled(IN PRTMP_ADAPTER pad) -{ - return pad->vow_watf_en; -} - -VOID vow_init(PRTMP_ADAPTER pad) -{ - BOOLEAN ret; - /* for M2M test */ - pvow_pad = pad; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[31m%s: start ...\x1b[m\n", __func__)); - /* vow CR address init */ - vow_init_CR_offset_gen_1_gen_2(pad); - /* vow_dump_umac_CRs(pad); */ - /* vow station init */ - vow_init_sta(pad); - /* vow group init */ - vow_init_group(pad); - /* vow rx init */ - vow_init_rx(pad); - /* vow misc init */ - vow_init_misc(pad); - /* feature control */ - ret = vow_set_feature_all(pad); - /* configure badnode detector */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[31m%s: end ...\x1b[m\n", __func__)); -} - -VOID vow_init_CR_offset_gen_1_gen_2(PRTMP_ADAPTER pad) -{ - if (pad->vow_gen.VOW_GEN == VOW_GEN_1) { - /* VOW debug command 0x22/0x44 */ - pad->vow_gen.VOW_STA_SETTING_BEGIN = 0; - pad->vow_gen.VOW_STA_SETTING_END = - pad->vow_gen.VOW_STA_SETTING_BEGIN + 16; - pad->vow_gen.VOW_STA_BITMAP_BEGIN = 0; - pad->vow_gen.VOW_STA_BITMAP_END = - pad->vow_gen.VOW_STA_BITMAP_BEGIN + 16; - pad->vow_gen.VOW_BSS_TOKEN_OFFSET = 32; - pad->vow_gen.VOW_STA_SETTING_FACTOR = 3; - - /* STA setting */ - pad->vow_gen.VOW_STA_AC_PRIORITY_OFFSET = 4; - pad->vow_gen.VOW_STA_WMM_AC0_OFFSET = 6; - pad->vow_gen.VOW_STA_WMM_AC1_OFFSET = 8; - pad->vow_gen.VOW_STA_WMM_AC2_OFFSET = 10; - pad->vow_gen.VOW_STA_WMM_AC3_OFFSET = 12; - pad->vow_gen.VOW_STA_WMM_ID_OFFSET = 14; - } else { - /* VOW debug command 0x22/0x44 */ - pad->vow_gen.VOW_STA_SETTING_BEGIN = 68; - pad->vow_gen.VOW_STA_SETTING_END = - pad->vow_gen.VOW_STA_SETTING_BEGIN + 32; - pad->vow_gen.VOW_STA_BITMAP_BEGIN = 52; - pad->vow_gen.VOW_STA_BITMAP_END = - pad->vow_gen.VOW_STA_BITMAP_BEGIN + 16; - pad->vow_gen.VOW_BSS_TOKEN_OFFSET = 0; - pad->vow_gen.VOW_STA_SETTING_FACTOR = 2; - - /* STA setting */ - pad->vow_gen.VOW_STA_AC_PRIORITY_OFFSET = 4; - pad->vow_gen.VOW_STA_WMM_AC0_OFFSET = 8; - pad->vow_gen.VOW_STA_WMM_AC1_OFFSET = 12; - pad->vow_gen.VOW_STA_WMM_AC2_OFFSET = 16; - pad->vow_gen.VOW_STA_WMM_AC3_OFFSET = 20; - pad->vow_gen.VOW_STA_WMM_ID_OFFSET = 6; - } -} - -VOID vow_init_sta(PRTMP_ADAPTER pad) -{ - UINT8 i; - BOOLEAN ret; - - /* if ATF is disabled, the default max DWRR wait time is configured as 256us to force STA round-robin */ - if (pad->vow_cfg.en_airtime_fairness == FALSE) - pad->vow_cfg.sta_max_wait_time = 1; /* 256us */ - - /* set max wait time for DWRR station */ - ret = vow_set_sta_DWRR_max_time(pad); - - /* VOW is disabled, skip all setting */ - if (vow_is_enabled(pad) == FALSE) - return; - - /* station DWRR quantum */ - ret = vow_set_sta(pad, VOW_ALL_STA, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_ALL); - - /* per station DWRR configuration */ - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - ret = vow_set_sta(pad, i, ENUM_VOW_DRR_CTRL_FIELD_STA_ALL); - ret = vow_set_sta(pad, i, - ENUM_VOW_DRR_CTRL_FIELD_STA_BSS_GROUP); - /* set station pause status */ - ret = vow_set_sta(pad, i, - ENUM_VOW_DRR_CTRL_FIELD_STA_PAUSE_SETTING); - } -} - -VOID vow_init_group(PRTMP_ADAPTER pad) -{ - BOOLEAN ret; - - /* VOW is disabled, skip all setting */ - if (vow_is_enabled(pad) == FALSE) - return; - - /* group DWRR quantum */ - ret = vow_set_group(pad, VOW_ALL_GROUP, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_ALL); - - /* set group configuration */ - ret = vow_set_group(pad, VOW_ALL_GROUP, - ENUM_BSSGROUP_CTRL_ALL_ITEM_FOR_ALL_GROUP); - - /* set max BSS wait time and sta wait time */ - /* RTMP_IO_WRITE32(pad, 0x8374, 0x00200020); */ - vow_set_group_DWRR_max_time(pad); - /*set Airtime estimator enable*/ - pad->vow_at_est.at_estimator_en = TRUE; - vow_set_at_estimator(pad, ENUM_AT_PROC_EST_FEATURE_CTRL); -} - -VOID vow_init_rx(PRTMP_ADAPTER pad) -{ - UINT8 i; - BOOLEAN ret; - - /* VOW is disabled, skip all setting */ - if (vow_is_enabled(pad) == FALSE) { - pad->vow_rx_time_cfg.rx_time_en = FALSE; - vow_set_rx_airtime(pad, ENUM_RX_AT_FEATURE_CTRL, - ENUM_RX_AT_FEATURE_SUB_TYPE_AIRTIME_EN); - return; - } - - /* reset all RX counters */ - ret = vow_set_rx_airtime(pad, ENUM_RX_AT_BITWISE_CTRL, - ENUM_RX_AT_BITWISE_SUB_TYPE_AIRTIME_CLR); - /* RX airtime feature enable */ - ret = vow_set_rx_airtime(pad, ENUM_RX_AT_FEATURE_CTRL, - ENUM_RX_AT_FEATURE_SUB_TYPE_AIRTIME_EN); - /* set ED offset */ - ret = vow_set_rx_airtime(pad, ENUM_RX_AT_TIMER_VALUE_CTRL, - ENUM_RX_AT_TIME_VALUE_SUB_TYPE_ED_OFFSET_CTRL); - /* set OBSS backoff time - 1 set*/ - ret = vow_set_backoff_time(pad, ENUM_RX_AT_OBSS); - /* set non QOS backoff time - 1 set */ - ret = vow_set_backoff_time(pad, ENUM_RX_AT_NON_QOS); - /* set repeater backoff time - 1 set */ - ret = vow_set_backoff_time(pad, ENUM_RX_AT_WMM_GROUP_PEPEATER); - /* set OM backoff time */ - ret = vow_set_backoff_time(pad, ENUM_RX_AT_WMM_GROUP_STA); - - /* set WMM AC backoff time */ - for (i = 0; i < VOW_MAX_WMM_SET_NUM; i++) - ret = vow_set_backoff_time(pad, i); - - /* set BSS belogs to which WMM set */ - for (i = 0; i < VOW_MAX_GROUP_NUM; i++) - ret = vow_set_mbss2wmm_map(pad, i); - - /* select RX WMM backoff time for 4 OM */ - for (i = 0; i < VOW_MAX_WMM_SET_NUM; i++) - ret = vow_set_wmm_selection(pad, i); - - /* configure airtime estimator */ - for (i = 0; i < VOW_MAX_GROUP_NUM; i++) { - vow_set_at_estimator_group( - pad, ENUM_AT_PROC_EST_GROUP_RATIO_CTRL, i); - /* vow_set_at_estimator_group(pad, ENUM_AT_PROC_EST_GROUP_TO_BAND_MAPPING, i); */ - } -} - -VOID vow_init_misc(PRTMP_ADAPTER pad) -{ - UINT32 reg32, i; - - if (pad->vow_gen.VOW_GEN == VOW_GEN_1) { - /* disable RTS failed airtime charge for RTS deadlock */ - HW_IO_READ32(pad, AGG_SCR, ®32); - reg32 |= RTS_FAIL_CHARGE_DIS; - HW_IO_WRITE32(pad, AGG_SCR, reg32); - } - - /* VOW is disabled, skip all setting */ - if (vow_is_enabled(pad) == FALSE) - return; - - if (pad->vow_gen.VOW_GEN == VOW_GEN_1) { - /* RX_RIFS_MODE enable, 820F4000 bit[23] set to 1 */ - /* detect ED signal down for CCK CTS */ - HW_IO_READ32(pad, TMAC_TCR, ®32); - reg32 |= RX_RIFS_MODE; - HW_IO_WRITE32(pad, TMAC_TCR, reg32); - - /* Configure 1 to force rmac_cr_eifs_time=0 for VOW OBSS counter, 820f52e0 bit[21] set to 1 */ - HW_IO_READ32(pad, RMAC_RSVD0, ®32); - reg32 |= RX_EIFS_TIME_ZERO; - HW_IO_WRITE32(pad, RMAC_RSVD0, reg32); - - /* for SER (0x82060370 bit[26]=1 --> keep all VOW setting) */ - HW_IO_READ32(pad, VOW_CONTROL, ®32); - reg32 |= VOW_RESET_DISABLE; - HW_IO_WRITE32(pad, VOW_CONTROL, reg32); - } - - if (vow_watf_is_enabled(pad)) { - pad->vow_cfg.vow_sta_dwrr_quantum[0] = pad->vow_watf_q_lv0; - pad->vow_cfg.vow_sta_dwrr_quantum[1] = pad->vow_watf_q_lv1; - pad->vow_cfg.vow_sta_dwrr_quantum[2] = pad->vow_watf_q_lv2; - pad->vow_cfg.vow_sta_dwrr_quantum[3] = pad->vow_watf_q_lv3; - } else { - pad->vow_cfg.vow_sta_dwrr_quantum[0] = VOW_STA_DWRR_QUANTUM0; - pad->vow_cfg.vow_sta_dwrr_quantum[1] = VOW_STA_DWRR_QUANTUM1; - pad->vow_cfg.vow_sta_dwrr_quantum[2] = VOW_STA_DWRR_QUANTUM2; - pad->vow_cfg.vow_sta_dwrr_quantum[3] = VOW_STA_DWRR_QUANTUM3; - } - - for (i = 0; i < VOW_WATF_LEVEL_NUM; i++) - vow_set_sta(pad, VOW_ALL_STA, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L0 + i); -} - -VOID vow_reset(PRTMP_ADAPTER pad) -{ - vow_reset_watf(pad); - vow_reset_dvt(pad); -} - -VOID vow_update_om_wmm(PRTMP_ADAPTER pad, struct wifi_dev *wdev, - PEDCA_PARM pApEdcaParm) -{ - UCHAR wmm_idx; - UCHAR st; - UINT16 cw; - UCHAR ac_idx; - UCHAR ac_map[] = { WMM_AC_BE, WMM_AC_BK, WMM_AC_VI, WMM_AC_VO }; - struct _EDCA_PARM *pBssEdca = wlan_config_get_ht_edca(wdev); - - /* VOW is disabled, skip all setting */ - if (vow_is_enabled(pad) == FALSE) - return; - - if (WMODE_CAP_5G(wdev->PhyMode)) - st = SLOT_TIME_5G; - else if (wdev->bUseShortSlotTime) - st = SLOT_TIME_24G_SHORT; - else - st = SLOT_TIME_24G_LONG; - - if (pBssEdca) { - /* invalid */ - if (pBssEdca->bValid == FALSE) - return; - - if ((pApEdcaParm == NULL) || (pApEdcaParm->bValid == FALSE)) - return; - - wmm_idx = pApEdcaParm->WmmSet; - - for (ac_idx = 0; ac_idx < WMM_NUM_OF_AC; ac_idx++) { - cw = (1 << pBssEdca->Cwmin[ac_map[ac_idx]]) - 1; - pad->vow_rx_time_cfg.wmm_backoff[wmm_idx][ac_idx] = - (WMODE_CAP_5G(wdev->PhyMode) ? SIFS_TIME_5G : - SIFS_TIME_24G) + - pBssEdca->Aifsn[ac_map[ac_idx]] * st + cw * st; - } - - vow_set_backoff_time(pad, wmm_idx); - } -} - -VOID vow_mbss_init(PRTMP_ADAPTER pad, struct wifi_dev *wdev) -{ - /* VOW is disabled, skip all setting */ - if (vow_is_enabled(pad) == FALSE) - return; - - if (wdev) { - vow_mbss_grp_band_map(pad, wdev); - vow_mbss_wmm_map(pad, wdev); - /* configure BCMC entry */ - vow_set_client(pad, wdev->wdev_idx, wdev->tr_tb_idx); - } -} - -VOID vow_group_band_map(PRTMP_ADAPTER pad, UCHAR band_idx, UCHAR group_idx) -{ - UINT32 reg32; - - HW_IO_READ32(pad, VOW_DBDC_BW_GROUP_CTRL, ®32); - reg32 &= ~(1 << group_idx); - reg32 |= (band_idx << group_idx); - HW_IO_WRITE32(pad, VOW_DBDC_BW_GROUP_CTRL, reg32); -} - -/* do bss(group) and band mapping */ -VOID vow_mbss_grp_band_map(PRTMP_ADAPTER pad, struct wifi_dev *wdev) -{ - UCHAR band_idx; - UCHAR wdev_idx; - - if (wdev) { - band_idx = HcGetBandByWdev(wdev); - wdev_idx = wdev->wdev_idx; - /* MBSS <--> group 1 to 1 mapping, ex: SSID0 --> Group0 */ - vow_group_band_map(pad, band_idx, wdev_idx); - pad->vow_bss_cfg[wdev_idx].band_idx = band_idx; - vow_set_at_estimator_group( - pad, ENUM_AT_PROC_EST_GROUP_TO_BAND_MAPPING, wdev_idx); - } -} - -/* do bss and wmm mapping for RX */ -VOID vow_mbss_wmm_map(PRTMP_ADAPTER pad, struct wifi_dev *wdev) -{ - UCHAR wmm_idx; - - if (wdev) { - wmm_idx = HcGetWmmIdx(pad, wdev); - pad->vow_rx_time_cfg.bssid2wmm_set[wdev->wdev_idx] = wmm_idx; - vow_set_mbss2wmm_map(pad, wdev->wdev_idx); - } -} - -static UINT32 vow_get_availabe_airtime(VOID) -{ - return VOW_DEF_AVA_AIRTIME; -} - -/* get rate token */ -UINT16 vow_convert_rate_token(PRTMP_ADAPTER pad, UINT8 type, UINT8 group_id) -{ - UINT16 period, rate, token = 0; - - period = (1 << pad->vow_cfg.refill_period); - - if (type == VOW_MAX) { - rate = pad->vow_bss_cfg[group_id].max_rate; - token = (period * rate); - } else { - rate = pad->vow_bss_cfg[group_id].min_rate; - token = (period * rate); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: period %dus, rate %u, token %u\n", __func__, period, - rate, token)); - return token; -} - -/* get airtime token */ -UINT16 vow_convert_airtime_token(PRTMP_ADAPTER pad, UINT8 type, UINT8 group_id) -{ - UINT16 period, ratio, token = 0; - UINT32 atime = vow_get_availabe_airtime(); - UINT64 tmp; - - period = (1 << pad->vow_cfg.refill_period); - - if (type == VOW_MAX) - ratio = pad->vow_bss_cfg[group_id].max_airtime_ratio; - else - ratio = pad->vow_bss_cfg[group_id].min_airtime_ratio; - - /* shift 3 --> because unit is 1/8 us, - 10^8 --> ratio needs to convert from integer to %, preiod needs to convert from us to s - */ - tmp = ((UINT64)period * atime * ratio) << 3; - /* printk("%s: tmp %llu\n", __FUNCTION__, tmp); */ - token = div64_u64(tmp, 100000000); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: period %dus, ratio %u, available time %u, token %u\n", - __func__, period, ratio, atime, token)); - return token; -} - -/* add client(station) */ - -VOID vow_set_client(PRTMP_ADAPTER pad, UINT8 group, UINT8 sta_id) -{ - BOOLEAN ret; - /* set group for station */ - pad->vow_sta_cfg[sta_id].group = group; - /* update station bitmap */ - /* don't change command sequence - STA_BSS_GROUP will refer to STA_ALL's old setting */ - ret = vow_set_sta(pad, sta_id, ENUM_VOW_DRR_CTRL_FIELD_STA_BSS_GROUP); - ret = vow_set_sta(pad, sta_id, ENUM_VOW_DRR_CTRL_FIELD_STA_ALL); - /* set station pause status */ - ret = vow_set_sta(pad, sta_id, - ENUM_VOW_DRR_CTRL_FIELD_STA_PAUSE_SETTING); -} - -INT set_vow_min_rate_token(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].min_rate_token = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MIN_RATE_TOKEN_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_max_rate_token(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].max_rate_token = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MAX_RATE_TOKEN_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_min_airtime_token(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].min_airtime_token = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MIN_AIRTIME_TOKEN_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_max_airtime_token(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].max_airtime_token = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MAX_AIRTIME_TOKEN_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_min_rate_bucket(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].min_ratebucket_size = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MIN_TOKEN_BUCKET_LENG_SIZE_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_max_rate_bucket(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].max_ratebucket_size = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MAX_TOKEN_BUCKET_LENG_SIZE_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_min_airtime_bucket(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].min_airtimebucket_size = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MIN_TOKEN_BUCKET_TIME_SIZE_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_max_airtime_bucket(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].max_airtimebucket_size = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MAX_TOKEN_BUCKET_TIME_SIZE_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_max_backlog_size(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].max_backlog_size = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MAX_BACKLOG_SIZE_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_max_wait_time(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].max_wait_time = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MAX_WAIT_TIME_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_group_dwrr_max_wait_time(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if (rv > 0) { - INT ret; - - pad->vow_cfg.group_max_wait_time = val; - ret = vow_set_group_DWRR_max_time(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_sta_pause(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 sta, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &sta, &val); - - if ((rv > 1) && (sta < MAX_LEN_OF_MAC_TABLE)) { - pad->vow_sta_cfg[sta].paused = val; - vow_set_sta(pad, sta, - ENUM_VOW_DRR_CTRL_FIELD_STA_PAUSE_SETTING); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: sta %d set %u.\n", __func__, sta, val)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_sta_group(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 sta, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &sta, &val); - - if ((rv > 1) && (sta < MAX_LEN_OF_MAC_TABLE)) { - INT ret; - - pad->vow_sta_cfg[sta].group = val; - ret = vow_set_sta( - pad, sta, - ENUM_VOW_DRR_CTRL_FIELD_STA_BSS_GROUP); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: sta %d group %u.\n", __func__, sta, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_bw_en(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0)) { - INT ret; - - pad->vow_cfg.en_bw_ctrl = val; - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_refill_en(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0)) { - INT ret; - - pad->vow_cfg.en_bw_refill = val; - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_airtime_fairness_en(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0)) { - INT ret; - - pad->vow_cfg.en_airtime_fairness = val; - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); -#if defined(FQ_SCH_SUPPORT) - if (pad->vow_cfg.en_airtime_fairness == 0) - set_fq_enable(pad, "0-0"); -#endif - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_txop_switch_bss_en(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0)) { - INT ret; - - pad->vow_cfg.en_txop_no_change_bss = val; - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_dbdc_search_rule(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv, band; - - if (arg) { - rv = sscanf(arg, "%d-%d", &band, &val); - - if ((rv > 1)) { - INT ret; - - if (band == 0) - pad->vow_cfg.dbdc0_search_rule = val; - else - pad->vow_cfg.dbdc1_search_rule = val; - - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_refill_period(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0)) { - INT ret; - - pad->vow_cfg.refill_period = val; - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_bss_en(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv, group; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < 16)) { - INT ret; - - pad->vow_cfg.per_bss_enable &= ~(1 << group); - pad->vow_cfg.per_bss_enable |= (val << group); - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_sta_dwrr_quantum(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv, id; - - if (arg) { - rv = sscanf(arg, "%d-%d", &id, &val); - - if ((rv > 1) && (id < 8)) { - INT ret; - - pad->vow_cfg.vow_sta_dwrr_quantum[id] = val; - ret = vow_set_sta( - pad, VOW_ALL_STA, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L0 + - id); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set quantum id %u, val %d.\n", __func__, - id, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_sta_frr_quantum(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - if ((rv > 0) && (val <= 0xff)) { - pad->vow_sta_frr_quantum = val; - pad->vow_sta_frr_flag = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set FRR quantum %d.\n", __FUNCTION__, - val)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_airtime_ctrl_en(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv, group; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < 16)) { - INT ret; - - pad->vow_bss_cfg[group].at_on = val; - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_bw_ctrl_en(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv, group; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < 16)) { - INT ret; - - pad->vow_bss_cfg[group].bw_on = val; - ret = vow_set_feature_all(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_sta_ac_priority(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv, sta; - - if (arg) { - rv = sscanf(arg, "%d-%d", &sta, &val); - - if ((rv > 1) && (sta < MAX_LEN_OF_MAC_TABLE) && (val < 4)) { - BOOLEAN ret; - /* set AC change rule */ - pad->vow_sta_cfg[sta].ac_change_rule = val; - ret = vow_set_sta(pad, sta, - ENUM_VOW_DRR_CTRL_FIELD_STA_PRIORITY); - - if (ret) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: sta %d W ENUM_VOW_DRR_PRIORITY_CFG_ITEM failed.\n", - __func__, sta)); - return FALSE; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: sta %d W AC change rule %d.\n", __func__, - sta, pad->vow_sta_cfg[sta].ac_change_rule)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_sta_dwrr_quantum_id(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv, sta, ac; - - if (arg) { - rv = sscanf(arg, "%d-%d-%d", &sta, &ac, &val); - - if ((rv > 2) && (sta < MAX_LEN_OF_MAC_TABLE) && (ac < 4) && - (val < 8)) { - INT ret; - - pad->vow_sta_cfg[sta].dwrr_quantum[ac] = val; - ret = vow_set_sta( - pad, sta, - ENUM_VOW_DRR_CTRL_FIELD_STA_AC0_QUA_ID + ac); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set sta %d, ac %d, quantum id %u.\n", - __func__, sta, ac, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_bss_dwrr_quantum(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv, group; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < 16)) { - INT ret; - - pad->vow_bss_cfg[group].dwrr_quantum = val; - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_00 + - group); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set group %d, quantum id %u.\n", - __func__, group, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_dwrr_max_wait_time(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0)) { - INT ret; - - pad->vow_cfg.sta_max_wait_time = val; - /* ret = vow_set_sta(pad, 0xFF, ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_DEFICIT_BOUND); */ - ret = vow_set_sta_DWRR_max_time(pad); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_min_rate(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].min_rate = val; - pad->vow_bss_cfg[group].min_rate_token = - vow_convert_rate_token(pad, VOW_MIN, group); - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MIN_RATE_TOKEN_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set rate %u\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_max_rate(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].max_rate = val; - pad->vow_bss_cfg[group].max_rate_token = - vow_convert_rate_token(pad, VOW_MAX, group); - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MAX_RATE_TOKEN_CFG_ITEM); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, group, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_min_ratio(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].min_airtime_ratio = val; - pad->vow_bss_cfg[group].min_airtime_token = - vow_convert_airtime_token(pad, VOW_MIN, group); - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MIN_AIRTIME_TOKEN_CFG_ITEM); - if (ret == 0) { - ret = vow_set_at_estimator_group( - pad, ENUM_AT_PROC_EST_GROUP_RATIO_CTRL, - group); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, - group, val)); - } - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_max_ratio(IN PRTMP_ADAPTER pad, IN RTMP_STRING *arg) -{ - UINT32 group, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &group, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - INT ret; - - pad->vow_bss_cfg[group].max_airtime_ratio = val; - pad->vow_bss_cfg[group].max_airtime_token = - vow_convert_airtime_token(pad, VOW_MAX, group); - ret = vow_set_group( - pad, group, - ENUM_BSSGROUP_CTRL_MAX_AIRTIME_TOKEN_CFG_ITEM); - if (ret == 0) { - ret = vow_set_at_estimator_group( - pad, ENUM_AT_PROC_EST_GROUP_RATIO_CTRL, - group); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: group %d set %u.\n", __func__, - group, val)); - } - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_counter_clr(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0)) { - INT ret; - - ret = vow_set_rx_airtime( - pAd, ENUM_RX_AT_BITWISE_CTRL, - ENUM_RX_AT_BITWISE_SUB_TYPE_AIRTIME_CLR); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_airtime_en(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0)) { - INT ret; - - pAd->vow_rx_time_cfg.rx_time_en = val; - ret = vow_set_rx_airtime( - pAd, ENUM_RX_AT_FEATURE_CTRL, - ENUM_RX_AT_FEATURE_SUB_TYPE_AIRTIME_EN); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_ed_offset(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0) && (val < 32)) { - INT ret; - - pAd->vow_rx_time_cfg.ed_offset = val; - ret = vow_set_rx_airtime( - pAd, ENUM_RX_AT_TIMER_VALUE_CTRL, - ENUM_RX_AT_TIME_VALUE_SUB_TYPE_ED_OFFSET_CTRL); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_obss_backoff(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0) && (val <= 0xFFFF)) { - INT ret; - - pAd->vow_rx_time_cfg.obss_backoff = val; - ret = vow_set_backoff_time(pAd, ENUM_RX_AT_OBSS); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_wmm_backoff(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 wmm, ac, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d-%d", &wmm, &ac, &val); - - if ((rv > 2) && (wmm < VOW_MAX_WMM_SET_NUM) && - (ac < WMM_NUM_OF_AC) && (val <= 0xFFFF)) { - INT ret; - - pAd->vow_rx_time_cfg.wmm_backoff[wmm][ac] = val; - ret = vow_set_backoff_time(pAd, wmm); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: wmm %d ac %d set %u.\n", __func__, wmm, - ac, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_non_qos_backoff(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 val, rv; - - if (arg) { - rv = sscanf(arg, "%d", &val); - - if ((rv > 0) && (val <= 0xFFFFF)) { - INT ret; - - pAd->vow_rx_time_cfg.non_qos_backoff = val; - ret = vow_set_backoff_time(pAd, ENUM_RX_AT_NON_QOS); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set %u.\n", __func__, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_om_wmm_backoff(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 ac, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &ac, &val); - - if ((rv > 0) && (ac < WMM_NUM_OF_AC) && (val <= 0xFFFFF)) { - INT ret; - - pAd->vow_rx_time_cfg.om_wmm_backoff[ac] = val; - ret = vow_set_backoff_time(pAd, - ENUM_RX_AT_WMM_GROUP_STA); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set ac %d, val = %u.\n", __func__, ac, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_repeater_wmm_backoff(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 ac, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &ac, &val); - - if ((rv > 0) && (ac < WMM_NUM_OF_AC) && (val <= 0xFFFFF)) { - INT ret; - - pAd->vow_rx_time_cfg.repeater_wmm_backoff[ac] = val; - ret = vow_set_backoff_time( - pAd, ENUM_RX_AT_WMM_GROUP_PEPEATER); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: set ac %d, val = %u.\n", __func__, ac, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_bss_wmmset(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 bss_idx, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &bss_idx, &val); - - if ((rv > 1) && (val < VOW_MAX_WMM_SET_NUM) && - (bss_idx < VOW_MAX_GROUP_NUM)) { - INT ret; - - pAd->vow_rx_time_cfg.bssid2wmm_set[bss_idx] = val; - ret = vow_set_mbss2wmm_map(pAd, bss_idx); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: bss_idx %d set %u.\n", __func__, bss_idx, - val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_rx_om_wmm_select(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 om_idx, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &om_idx, &val); - - if ((rv > 1) && (om_idx < 4)) { /* FIXME: enum --> 4 */ - INT ret; - - pAd->vow_rx_time_cfg.wmm_backoff_sel[om_idx] = val; - ret = vow_set_wmm_selection(pAd, om_idx); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: OM MAC index %d set %u.\n", __func__, - om_idx, val)); - - if (ret) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: set command failed.\n", - __func__)); - return FALSE; - } - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -BOOLEAN halUmacVoWChargeBwToken(IN UINT_8 ucBssGroup, IN BOOLEAN fgChargeMode, - IN UINT_16 u2ChargeLenValue, - IN UINT_16 u2ChargeTimeValue) -{ - UINT32 reg; - - if ((ucBssGroup >= UMAC_BSS_GROUP_NUMBER) || - ((fgChargeMode != TRUE) && (fgChargeMode != FALSE))) - return FALSE; - - reg = ((((UINT32)u2ChargeLenValue - << UMAC_CHARGE_MODE_WDATA_CHARGE_LENGTH_OFFSET) & - UMAC_CHARGE_MODE_WDATA_CHARGE_LENGTH_MASK) | - (((UINT32)u2ChargeTimeValue - << UMAC_CHARGE_MODE_WDATA_CHARGE_TIME_OFFSET) & - UMAC_CHARGE_MODE_WDATA_CHARGE_TIME_MASK)); - RTMP_IO_WRITE32(pvow_pad, UMAC_DRR_TABLE_WDATA0, reg); - reg = ((UMAC_DRR_TABLE_CTRL0_EXEC_MASK) | - ((UMAC_CHARGE_BW_TOKEN_OP_MASK | - (((UINT32)fgChargeMode - << (ffs(UMAC_CHARGE_ADD_MODE_BIT_MASK) - 1)) & - UMAC_CHARGE_ADD_MODE_BIT_MASK)) - << UMAC_DRR_TABLE_CTRL0_MODE_OP_OFFSET) | - ((ucBssGroup << UMAC_CHARGE_MODE_BSS_GROUP_OFFSET) & - UMAC_CHARGE_MODE_BSS_GROUP_MASK)); - RTMP_IO_WRITE32(pvow_pad, UMAC_DRR_TABLE_CTRL0, reg); - return TRUE; -} - -BOOLEAN halUmacVoWChargeBwTokenLength(IN UINT8 ucBssGroup, - IN BOOLEAN fgChargeMode, - IN UINT16 u2ChargeLenValue) -{ - return halUmacVoWChargeBwToken(ucBssGroup, fgChargeMode, - u2ChargeLenValue, 0); -} - -BOOLEAN halUmacVoWChargeBwTokenTime(IN UINT8 ucBssGroup, - IN BOOLEAN fgChargeMode, - IN UINT16 u2ChargeTimeValue) -{ - return halUmacVoWChargeBwToken(ucBssGroup, fgChargeMode, 0, - u2ChargeTimeValue); -} - -BOOLEAN halUmacVoWChargeBwDrr(IN UINT8 ucBssGroup, IN BOOLEAN fgChargeMode, - IN UINT16 u2ChargeLenValue, - IN UINT16 u2ChargeTimeValue) -{ - UINT32 reg; - - if ((ucBssGroup >= UMAC_BSS_GROUP_NUMBER) || - ((fgChargeMode != TRUE) && (fgChargeMode != FALSE))) - return FALSE; - - reg = ((((UINT32)u2ChargeLenValue - << UMAC_CHARGE_MODE_WDATA_CHARGE_LENGTH_OFFSET) & - UMAC_CHARGE_MODE_WDATA_CHARGE_LENGTH_MASK) | - (((UINT32)u2ChargeTimeValue - << UMAC_CHARGE_MODE_WDATA_CHARGE_TIME_OFFSET) & - UMAC_CHARGE_MODE_WDATA_CHARGE_TIME_MASK)); - RTMP_IO_WRITE32(pvow_pad, UMAC_DRR_TABLE_WDATA0, reg); - reg = ((UMAC_DRR_TABLE_CTRL0_EXEC_MASK) | - ((UMAC_CHARGE_BW_DRR_OP_MASK | - (fgChargeMode << UMAC_CHARGE_ADD_MODE_BIT_MASK)) - << UMAC_DRR_TABLE_CTRL0_MODE_OP_OFFSET) | - ((ucBssGroup << UMAC_CHARGE_MODE_BSS_GROUP_OFFSET) & - UMAC_CHARGE_MODE_BSS_GROUP_MASK)); - RTMP_IO_WRITE32(pvow_pad, UMAC_DRR_TABLE_CTRL0, reg); - return TRUE; -} - -BOOLEAN halUmacVoWChargeBwDrrLength(IN UINT8 ucBssGroup, - IN BOOLEAN fgChargeMode, - IN UINT16 u2ChargeLenValue) -{ - return halUmacVoWChargeBwDrr(ucBssGroup, fgChargeMode, u2ChargeLenValue, - 0); -} - -BOOLEAN halUmacVoWChargeBwDrrTime(IN UINT8 ucBssGroup, IN BOOLEAN fgChargeMode, - IN UINT16 u2ChargeTimeValue) -{ - return halUmacVoWChargeBwDrr(ucBssGroup, fgChargeMode, 0, - u2ChargeTimeValue); -} - -BOOLEAN halUmacVoWChargeAitTimeDRR(IN UINT8 ucStaID, IN UINT8 ucAcId, - IN BOOLEAN fgChargeMode, - IN UINT16 u2ChargeValue) -{ - UINT32 reg; - - if ((ucStaID > UMAC_WLAN_ID_MAX_VALUE) || (ucAcId >= 4) || - ((fgChargeMode != TRUE) && (fgChargeMode != FALSE))) - return FALSE; - - reg = (((UINT32)u2ChargeValue - << UMAC_CHARGE_MODE_WDATA_CHARGE_TIME_OFFSET) & - UMAC_CHARGE_MODE_WDATA_CHARGE_TIME_MASK); - RTMP_IO_WRITE32(pvow_pad, UMAC_DRR_TABLE_WDATA0, reg); - reg = ((UMAC_DRR_TABLE_CTRL0_EXEC_MASK) | - ((UMAC_CHARGE_AIRTIME_DRR_OP_MASK | - (((UINT32)fgChargeMode - << (ffs(UMAC_CHARGE_ADD_MODE_BIT_MASK) - 1) & - UMAC_CHARGE_ADD_MODE_BIT_MASK))) - << UMAC_DRR_TABLE_CTRL0_MODE_OP_OFFSET) | - ((ucStaID << UMAC_CHARGE_MODE_STA_ID_OFFSET) & - UMAC_CHARGE_MODE_STA_ID_MASK) | - ((ucAcId << UMAC_CHARGE_MODE_QUEUE_ID_OFFSET) & - UMAC_CHARGE_MODE_QUEUE_ID_MASK)); - RTMP_IO_WRITE32(pvow_pad, UMAC_DRR_TABLE_CTRL0, reg); - return TRUE; -} - -INT set_vow_charge_sta_dwrr(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 sta, ac, mode, val, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d-%d-%d", &sta, &mode, &ac, &val); - - if ((rv > 3) && (sta < MAX_LEN_OF_MAC_TABLE) && - (ac < WMM_NUM_OF_AC)) { - halUmacVoWChargeAitTimeDRR(sta, ac, mode, val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: sta%d/ac%d %c charge--> %u.\n", __func__, - sta, ac, mode == 0 ? 'd' : 'a', val)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_charge_bw_time(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 group, val, mode, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d-%d", &group, &mode, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - halUmacVoWChargeBwTokenTime(group, mode, val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group%d %c charge--> %u.\n", __func__, - group, mode == 0 ? 'd' : 'a', val)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_charge_bw_len(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 group, val, mode, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d-%d", &group, &mode, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - halUmacVoWChargeBwTokenLength(group, mode, val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group%d %c charge--> %u.\n", __func__, - group, mode == 0 ? 'd' : 'a', val)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_charge_bw_dwrr(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 group, val, mode, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d-%d", &group, &mode, &val); - - if ((rv > 1) && (group < VOW_MAX_GROUP_NUM)) { - halUmacVoWChargeBwDrrTime(group, mode, val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: group%d %c charge--> %u.\n", __func__, - group, mode == 0 ? 'd' : 'a', val)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_sta_psm(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 sta, psm, rv; - - if (arg) { - rv = sscanf(arg, "%d-%d", &sta, &psm); - - if ((rv > 1) && (sta < MAX_LEN_OF_MAC_TABLE)) { - UINT32 offset, reg; - /* clear PSM update mask bit31 */ - RTMP_IO_WRITE32(pAd, 0x23000, 0x80000000); - /* set PSM bit in WTBL DW3 bit 30 */ - offset = (sta << 8) | 0x3000c; - RTMP_IO_READ32(pAd, offset, ®); - - if (psm) { - reg |= 0x40000000; - RTMP_IO_WRITE32(pAd, offset, reg); - } else { - reg &= ~0x40000000; - RTMP_IO_WRITE32(pAd, offset, reg); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: sta%d psm--> %u.\n", __func__, sta, - psm)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_monitor_sta(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 sta, rv; - - if (arg) { - rv = sscanf(arg, "%d", &sta); - - if ((rv > 0) && (sta < MAX_LEN_OF_MAC_TABLE)) { - pAd->vow_monitor_sta = sta; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: monitor sta%d.\n", __func__, sta)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_monitor_bss(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 bss, rv; - - if (arg) { - rv = sscanf(arg, "%d", &bss); - - if ((rv > 0) && (bss <= 16)) { - pAd->vow_monitor_bss = bss; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: monitor bss%d.\n", __func__, bss)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_monitor_mbss(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 bss, rv; - - if (arg) { - rv = sscanf(arg, "%d", &bss); - - if ((rv > 0) && (bss < 16)) { - pAd->vow_monitor_mbss = bss; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: monitor mbss%d.\n", __func__, bss)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_avg_num(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 num, rv; - - if (arg) { - rv = sscanf(arg, "%d", &num); - - if ((rv > 0) && (num < 1000)) { - pAd->vow_avg_num = num; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: average numer %d.\n", __func__, num)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_dvt_en(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UINT32 en, rv; - - if (arg) { - rv = sscanf(arg, "%d", &en); - - if (rv > 0) { - pAd->vow_dvt_en = en; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: DVT enable %d.\n", __func__, - pAd->vow_dvt_en)); - } else - return FALSE; - } else - return FALSE; - - return TRUE; -} - -INT set_vow_help(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("======== Group table =========\n" - "vow_min_rate_token = -\n" - "vow_max_rate_token = -\n" - "vow_min_airtime_token = -\n" - "vow_max_airtime_token = -\n" - "vow_min_rate_bucket = - 1K\n" - "vow_max_rate_bucket = - 1K\n" - "vow_min_airtime_bucket = -

6Xe=xLn?@PRYI-*mepG$>R4&SVDbm#raU~gvndZV872g~;s zH9qf`Mv^dN{ry&SHy`Ew^iEOTt`fq(LLXO|kKz5B?dxCvTzKR-#fkg!+Puaa!{*~` zUwgfy+yP3|&b^>UtElL7f*H+IgufQ=`rBXLx-Ak*FZOiapd^EfDz)#?MqKeYr%5`e z2`jQgKLp`fxn9Un3mTPQNZ_#E1&Rfc*_sN%HSSo8pklIcnN%W1-zNFmQ`!-2%609i zna_c)AMk4o1Y6o)4Vw$~$uEU)xa{3++CjR?VT)36?`ZYg_LeSjh;y9P@B3$g{kaD8 zuNGD)qsV~qVuZMJ_sNNuPQ*MPP26q59yfq@Z(F;wX>*j7_Axs=zH#Y$&r}?LS&AxX;E9u)vzm4?UN$3v>-$D9L((fR>MnX?j_?@KR zMfxt%cawfM>GzPnKthZve3A5fNxzTu`$>O*^an}bOZr2kKTP^Q(jOuHwzOpC$b{(vOk;I}+OJ!jF^w0_iW3 zeuDHR(od5966r6K{tD^8C;b%Zuaf>6>3<;okEH*J^g8LMNq?R6H%Nbz^gomS7U^%3 zeungSNPm~~_elQ>>1RoQpY#t%KS%m`(l3zyA?X)MzeM^+r2m!lk4e8w`X{7+O8RG{ ze@^-rq<=~JSEOINd-tx=zs-H;=YRGGh;0I$N#PoFV~)SNa>VIU|GpWv=XPw52#y84 zafj*mE--x%@RCE^jgi94)a2PIoy+2mIJuX|sl((*OqHl@?6Gc(tW^&rZ^*8g0$-$*4%aZgvj472VX1u&-iFr^ZJ|6>gH7Ca|{?xj21+xTz{5 z6{U{*#`49{(X!v;gUVSa2BSVGg!2hEHahz}*a5X=_VMEyq(A7PIz9(}&xm_==;j?a z));T?!({|^eWr1ap=m$c8$CnQX`$nz!G+8`nV%;BxL?wTq|_denL$%M+IiAWy7|B=PLJ#y+1 z!XkI;H{{-AqLMCds$~WxZktFZl1-R%t{*FNdo-a_%LMsExs@ulB-gsQ zVdKfNtZ4pqp{dPkeWo$HGj@3IA1l1w2+X(gSIF~k^Y=gS_gDG*!I47YLnH4f%u4?9!tj4DQ&;6FORW0}1G>iG)QitV!14jAZ4!7BJ*Oz6#qxnNsm@37B9y#Rp zWVv*eX1Or>RM4x@@l@6JRMb;gW^uRocko{6%S1IzL5#s6#8E0XJtcgU#dLa$IoD*4 zVy8z6hEY+lrHA^0ELDH37s(ofHu!)2_Ht|{sekodrS*W)p<`)#)DSvb zS)wjogJv7m%T-?3Zf|m*PxHof+7)gY)%i7Q4fl_EQH;y$@jyMbyuuv9&)mJaq0s-z!$v(4fsT6x!qytnDYY)XsS$0sP#CE zz{w@tpj~BV^JQHRmU7l2?%6KtDzAKQQs!ZU?R8q`g)hgCr^!}FCCdFJnf7qzqblrM= zvDIFOpSX6ga8$49U^|G>4Df(7(BU!e3~r2{)xlAogzIJTyD4Ig2`vV*kZTzI$Bn|s zBCNZ@>Gy`Z-$2Y=K=@ulfM4Qo1#zK_B1M0%kyk;0kfLJ^QCKlu62$JPvXXcm1&jA3 zQYj=vXmP>AZy%KCATea0zY>@gGv@tC(kDo`n#z@5QlMojtQ&1n-&}dl`|HBJM1?8-XFgb@-71Jk>zRH^Ur(LrIx6KdR<2Vn8~^i zPTB(AR%j!zz&4276eBRpP7rM^R;o2S>S9u42(l*?f`T^aZ~FX-tZHP|kutMLXdGg& z>(o1uP757u(=mj4WYsp>Y>vza1Vg%Yb@Rr44jc&!(HSx(DK{>QV z0Cp5rMw&xZE0FWJ!0xXy$~B1C^MWn&2i_sqJEotB3pQ)wNE&O`gO~ zqm$P=HECq3+Y3jyQX}DoNj9(D?=FmN7#`3rmOV_m`(^gItXQ(y`F<8wah$MfjMY_a z8@g|(1oI?|-vm}FSr)|9M7xLr=E<6;{4;#(w|I!n(zVlW$%_ov2JM$%&mv1j*5=xs#RfOwwgp{*GtZ9`Bv6^2R!J{bVju@y zyfTWoJHpotPSfcM^EZCnB%MKWMB5yjAgY8KUgmDXlNe+iiBEMg`6(G?bA}bPtG)68N+aMOvawJvyIIRKhw1n-3DJVl+KEJ~U{= zXiCLg<=0mz_t+fXj(==Qh+`i+$vplsy~Ull_mj1q64-nJ9=mXm5v5}v8!FE~MVFO( z+dLI4#D6T)^BD2P-8bUX-nUb2(eTI4@TSlBl2)Fbmmc~!_3h0+&EC!_$Fc%x-RaXH z!+Vk3V{-<@MI%4&{f|TJlUV&IaIE{+>wZQ;(5KiayWx4?<2Y^icr4lbn8(;U1QhWp z!|rL@hDQsrz_7>0ZpCrOw_zwyTDbCHNaeZ5emqC-XO;76ys0J(y6>@+P}vjvmVY}! za;{AOV_kWZtD*0)si8Nq zzMb;5*~|I2*?zf`S6(L9cDiOcEYbToJGK=X7!^)+1%!Kb<{IX!9uK+YB^Da`IKA$L zw|hL9M^Q)XbE5Dl6x+0QZbl_Ary=IZD2ftTsNvbrg2959o(u!E0&(OL*-n;9_06^-ISkc6lLB>)UiDoWEyRx2+w524VGo@ z-Vmkwl$3m(-Np{8KItf!fPi`}h(NN5za}@SRNHIq7FNQ2PJrB+F#(x_9Xfg-jw0A& zv)}}nRCFH2l)Ug8nOew|K^ljP)>k&eyFrBm!wt@x4d-LyeBr1X^+}P%S!Zyo8&~UH zqDSF8S;u&Rax0yFq0bEDp5Q=sxLn@OW5MdE?{rZzBCJkT25KFKktOJR9z>3dni#Y7 zS}`oBsFz|GA!1a;DASuSUiXU}*7@Rw_$WWba~g>1`kL$(HzW@n8eZ83oM?FQY2`*%ZqmFj#LI4#&9EMJW{1KBe@ zc7?j^VRpx!I8yAcwVOJi&6yHhPeVwDhzeCOn?y#}yMFOl3=$E-Y$MnT40C8I(&@HS z-0I~usl=YtxA-cjK*hdUJa$`}DvCP0)19MG0ccDnv|=_u&6IFK+u{Gn*rO->QjHGj+uu09r>~K9y8d%dKn+;Xc@xd z-VJ<)c1xP2)3e&soOhMPr)QFu49h|r5Id#s@`pN6WWeM5Sri>dq5tz_A+63PqUXQS z=ppV>Yo2=+PvOR$Vf+RU4PK#|uJi7zHhU_eT3%0J9%O*x0`F%OTI=z1PPwtMRBdDuVs0}u1U+~7mWB%#ke52H8} z$20IS_o61qhvGa=Hb#9*AMV>FeaAdJ*eAGH@3ZX9V0Z0#o>prdm~6qh_j3=$x#+}8 z_B4GMZg}l!HIpue$VS;iHQFP%Xq-JfVXx?tW8Txfn@S}^A4aKS_(R+GYBS}~(rQz2 zW$43uReQcTSnZ%3ldG0>$%BC{wxp1t~sZc)}ftg13ay?>-&NJ>UD!zSs`WjC#+KV93C{!F)eH0Nd- zn|w~HM~RuiULJN*4yt2;G|P1yS+?6CtOG)~>Z}Ju(J!I1^p|zD_n0&fd*D`M?#XkP z2Q!|f>xvub=v6xewa|q3uZi{OPEVIxhq4WJ7R=VYAwvg|fNDrVx)V_cp+wK*Fo_1- zb%43&*Q1V|bCh;2avaX3CVp7=I|lA|t6rrS@ya|XpW<#f@n;wza9YsLQ?9D}AQWCs z4KuYCEh_|4mh9x$Ca#@NFUph^CPEngkSX{-g1K;VdUjGl&#G>b30LVHaG|3C$Tlkq z(=hlP6wDfEipo`wek~WK2JEqOBY;ulrXy$})5w|Eqdqj+N$WNep*i~n&%{xS@-o;~ zW#;lRy{w$O49`_ZdeWrLUG|C8h<#C>*?#R>C< z1>&+icd|}+{iAYl@Q)gGfhMTWk6+w4V=fm*pYUL?IB3~L6Wr9-3lYMm3c@T0F2?&? zPoSL7IKn=@?i_Ia}68IebvbC7aEN{5A2+JHvNHvT8}DlP7xFnn+glP$e|q-nZUz!Ie+N ztQ@zP+Qh}ytf3r>WUZZ7Ysc{qD#1GBCSo+1J}cP<+~S9Nu~D64;HYxyZ5f?9r=K{Z ztn+Snww#GGqodz)0=L|Nwji9;cErFs*=IO8% z+PJYcZzdvh<;=*}#UqJ;lDM!;Za%lPW|u_HOqLcnVlsU+d3|B+*>ETq*WhqCSGN$P zzl`}0Pn_2eKm59BdnFf(?hUWQ2>gXW*FB3OAE6wtGgl;@#*LBq973GiPWguZ3-8tC zjH~Dk)D5%-nwpgmFz|x0vWG`HkZk+{Q;>4EyyixXTwY3>aXpQM?j~*loX~Ygf|R^v zPKjxd*d&>~aOsl32@lp?i}uZVUsOSI{*tz4kGMKOmxpZCVTSHcJ3N3m(T=Ss-h(v* z6ziO|-Z5h1%t(9_+y^{_dSRCP>UEu;#k5$P!;SN$jY@fQeObEWi)tO%fuKR0xlKkY zis)X@+dHTX4h%E}dbcz9esXA~d<_nuij$m?#cIl3n0};)7id^%+l>~FGy+5Fl$gay z39HnzgY`}>KuWqI%xRe!tGBgp>xp94 zbo#^yAhbhLS0!2#_|Po6rR7p}F~J2y%G3NS)BtzaQ(ha$?shPRp^o~C9^c;(T_>GJ z?MF5G$4(X^*_5YsUhERq1WN{bWXLlkbvpgjUl^(oQEXPQUxTAsXJ)L{SUCL6zcWak zXGN9X=##IaSHok?LbZ9fak zK)I%RD>4+6*W#$6WENn|7>mH77>vu}YeiU^ffBa-X^Ekg*t)z?5vD&aGLsDUB(>SA zC)2(%VTQ9lIo{N0{9|R$rMoOlLl0WjKm(^`W3>6CdB`D0m|%~4uj=xNxEQOd1 z{9pZez#PX5I&5%`e-}7XFo{o_|GLDl=tV1UwQb(@xB%{T zmoMiR%*HzOOUD_!#W{4o>XR$5DP28ON@T;|6_KB!ap{ zwYb4|#c8-jlF#oBHOp^U9(S9xt?@6|;Ro-jyo;~WqgBg`qtudzoB(D`e%a-0ux zHlu2;d$G9q;+CkaTipZ z=HFY#8moC^{)V@$Cc%o=IY*uH!`^20&k-3SgNKs! zFTziMPrLS31`CSVpjJIji`T93#oFZ^IXsR;)}mV9N+CA3obQLmJ5nf&eoIhTO6!*s zunmKNCG#{wA)9I$IwHPO@8gW_*xMo>c^NrRV+^MlLCfO@$MeIfNxnlvEFgO9w0f|@ zlzgNFsK;weuW~PwzZbiZ$E;C&&2=IFI7+SdSm>NNyVQ^6Af|m1=Iq&C95)L4>pqE` z|C}xcuM}9{)agQcAuquZZnT!>Ikf&o5eT7#X{$1&g)tsyd@*! z=Swo$>pv;m_r+9dfg`s&FXk}{x&vyIYSkUdFQ>g>SZcj_=B9JrTWEDHssWnT-UGi< zIVscvI-YV~9Vk^-JSDREqLk^QtMTxdS>K7fAkPa0Rf6RvirbC4?jK4A6XFX7T~Nx3 zMCl~cyKp#P9u7^eAA`-!?CxPzw_WnNthfgsvPH>9nN9|dXK(^`gX1Jb7;DNw#7yWc zi*6nWOUCKaDmQBUsSXS}W&rcO`Wyo@v{vhz@#YJWH8zLwKK$`YC-X2{kdva&XGg%O_`PEi+75egsikpQ1)|}psVKdl5Vg6-o5n{ zwAgz#y7wRwiv07FZdl+vua0^wU0%V#yvgmwrc*`3<%e6J#=%VBmaSjo21B=!S)MO& zL~FScyBjGgKu{0&f}n0gtIt`CP9mw6;~6N^*h)CX8-Hc4I;fK8Cj20W4sDs4r+uf4 zQ`*y?SbIlMBUlva5Gkctv)yKw0cw+hPG)Vl&F1#s)P-Ds+%n_*Uqna8BP`C_Y@!9f zg>FfwF}P@lqxf=(ms5W{zrk>1Au&IE*hTS?x-HuM(1{d)rDxbI*?L?uL(jCYN9Sha zfZO115ZwfQjGgrWuUH5{Cd;u;dim9(VUa4jjIzADQ75t}#+>ufcr@0>04re4UQ6|I zAOO{Y!VDDuNSITPitI+w@x(W>4!lFCtXX+O#xX?aKApL8h{nH6{>t`3ROHz&fJR%{ zAMwK!vAMH9v8r&AKix947Qcs(dB4S$P&bK~TazJhxhQD~-Hw_nonlWlkv+s=JXttG zRm7=!qZMvc8BSTkxzM0;+dL}m)mExUE9DJ^Hnhh7@AlpTI;-P*8=VLtXmBZ(;1WXc z;K6x;ge16YAh-m#QnWxRRw(XLC{P@V6=|^oMT!-QwzRZJp>FiH3moIts#!civdQoCi5;4 zev;j-IfIg|p}eB{NHI(iS)CXs(CKe<*Je#x{}mSxBK#|^HG54N_rJfpdy?7@H5a)I zg`t>^=jcHv@zCKK)_vAwYD~1g4h`B5)f&2&HZ+m;poX@jS3J@(A?saN%?8r>5ZUA zGei05xc?BrYON7g1FXP}x|&kBTMAQ5&&sK%KD{)(?!5u6%p(HcCqV0_bSHJ#prNJ~ zC%87nQu(In*v)#iSqV*B*Baz#XN(>jefpsSYb@d>mI1B_?%P|QS9yAj+dB8gDUa54 z$~<|QoST&U869WI+MHlnSds4+2T&K(uOGRBFoAs->w!qx`Am0d^$XyzN!nhd#%vnJ z%ZtU0TbEgqbHeery}h_GfvdQnQ?(0c<)Y~E^YQimFo}Jm`QqFuLu_Zs=g#7KrFhN2efHxHbMqgAi&x zK+oF*d2fQff5KW(!6r%^aD{@Y9ao!%GaAfj=1|ufduZo6ZLla88Cj)F*>VxREl%Dc z4A+_Z61@w9Z^-CP_(MYr;u$j^wu3ZG92%pa`z#p2M`CfeZk?4+m(#STb5mbz{mxD6 z^MSffqt8TnW8Uj*-Nd4;JTRGFuvmxkmezu}J`Ww(t5-i7>1`KfKp8l^dV_TLK&9{$ z7}d%+xCMNmK6MVxFoKbRpYn#+Xu0(EL*LeUD%MFM&g(NOIhjD^O}oso1BNmQHILS+ z$RVNDLTTeSf|RD?6;M-X#VV1u+Ur{q!v@f9n&f0YM2-TIw~~_*VS9bO>9!yZA=dqI z9(#I2Wi>sFKhCD2-oq_@|1$l1CwHeY$dUWe8@Nc;7us)$;TAfa;P?(KrQCWngW^GF zk6^q^OXWmE5&}|$kd|(>HK!LJ^}}s6&I5WCRd?DWa5tmUE@v@Qvyoym$#G6y(N#O5 zJGn{*OCLbps5QBF)Sw7c!(k4L4Cr4bG0~a`QPZ)`O|~b^$<#jR_6jAZzJ4qMCtFxb zypaH}n50)!$26-~pPu0er9M*kOnj_Cc`}~w*61^&Y2`B_l-^J>jG8K{JGXkY5$miw zdme0+w?6j3y2)kERHtXp(`w(6dQdt5kf12-_OzV7^5f!EbDGmkz?|EZ)_HWswOnrd zRf$wdaUa#?$I$>~YJ^nFaf|wIZL#HI+I=yNNaS7PF?;l)5j0Hcx@JYA-uM50J{+*x z42C1KSBJ}k8wRHYH`!?p)Vn{Pr7uoT-X>X32k;XBrLbs1FOMbrcufT_M1T%+4?d*7 z1i$(K_}o)>#i(GNb3~(w-9pg_>GAyD1kGcGe!nKxoiX5G3?VNQEtt;48IVl3`Y_k% z`mSC8uou&;B{h3Jp4Xvh8Oq)#-PO9W?~Y{O&2q(}nvDm9H6$-ZrCfje*YY0ioZug4 z!OijtEGov(%l@tyt{Yt(sbX##=<(DJg4!z?oJrCFn7j-)oFI+dG+h z6MA4>2jg`g>>*HBQ>g-8-WFOnu4P18$Dw13sjK7#Lrga@g4&Yhx6)!V{8pM*briiP z>#U%1+=*Bnq;uFCJy}9ssl5p49o@a=7(ttMbea8YYNZueK8j&;BFEL>x9T%7w$4^a>Ps9Eg^2OyLrlmm!`EHGV)>Fi^CzHAq^o{PVZdT7( zyK`$g+LNA=!?0r?5!5;5SzY2~$;l_MZh*ZpR^v~bK=W8Sqo+H*(4q-{(TlvC46B8t zbYvj$-0`of{Ir5ySK)=5ArF9jK!>h7E;I+qPN^6^6D{;B;;;9vJ57%^oQ11>03G4 z6Ku~C(96@RYh-A>G7UoM_^Qqc6)T3;t=mKo>FgFn@O%1b4agc3>RQog2_Iua1MEDe zZ{&k_PsB+>G;^h`>U!Q{uSp93ssRdxR@|_`%3g)BTy0ZO#wSNf@ct>Iab<9Q#kV6v z>GoT5x{+9qZn-t58#}n6hFf>mF&Vh+){Aaw;dZ5clgzr=7fQMw^bemn+QT}mKW`|G zDaTDJpjw#DaX`2+iQ|88JIXo$$Y!I3FM7J}Uq|_o--M>4%g!}Bp#$sa9o6(YjZs(% zpb5;srzH%e*1A?&sqdn#b$D2iH|O99RoWs&Zz&$qmnO@@d&939$TKSp-82&k<=2Vp z6+$cv5Fo!KynAhfNW1lF^U9*@L^EsAj~oQ@Lr{kYB=#CeJ9sGR0B+cfot20z)c^f^ zn6k14w^ryR&H8jumg`24Rcon0tYBh5mu3;%J5yaqWTFm0GfM9P)hZjv{-;=7ypkeeRAUR5S>nC-u zy#`(OnoR@hyRDON;rY|M|WQZA}QkP4&;B4sE>BtMm2 z<)XXy_D@DD(9Q+RkxCgUz=~A6U%&qlLbjv~>26(Pz2(WC`r5|>*_9hLo*e4B{5oM? z%d{$5U1W*%kn+HOs6kYMbdQl=0n;v#_8BG)z$LGlPnu3ZA%sB=i9TNri|(MQ_ZPod+OMmij5z`qih&Vsi3 ze(vQ{lK-Rr@DEn`sL9cpO==f?uA$FcG|fBfPeost_hHJV;kPPYz%sAKz?mMfmtrz8ET_j}xsj{46pvc3WN}) zs&rKp5MBuMph>enxyF`qA6DXoKv7{`8sz z;@vY)sSdl5-k0i(X?ud=YQcYY&KT%WOr%rc&wVQvUhT zD-dYWu3Z4V_Te4EB|B#>P%2{(?c`lZw$NwTVtVBRb?-T;LtB!LUI(#^Y@u|WSWaCC zEuLOop;Q}6-$$#+E=u3F)ztA(euS*0S58oVG+IZmWuWwqSWhR2Q+nrZR4O~AGiejy zQ~osCLgAFo9y?0>MEdU;C6^1Vv^Mf^qg)9WrM-+wzmc|iOpk5j%7?xIsl{YrLs zJwvaEAe?b$seH)p2j}Q|viIa?R4!y^-b-X3*}3uxz1D&39B_m3fbc$|cRTz|>7M?C z@{#!WJ*E0W*KPQT@aV#%Un$>Hleg;Ur)H5|MN|2yXiEReAV2jXm2W?K3}Y(U(LSA@ z8b;;XExn%_OE@btQaI&vbS6LAX+*D&p!eloBmVdteySnaQ#Y5NszUtjU-MJ(RF8J$ z@l%_~u9ErvR45jsgLBX?U8sMEihumo!r+`47P>;9j%yMSm`w#KsKeC68Hcj|LErLH zK2jE`_I0gg{?0Av#H55`^=tPAqh?{xio>#v_>i!8BtLyN~Ns#MQ4zu)Xa>u#qmJgWD&yl;H{ zTD7c4$45_lw72-Pw|@S((XtmGUmW&($#nIuuNpn+beYH*r?#*9;m_aG7oM;vU7Pn$ zmG9ba&E-tT?}cx#7n!=x_;1VK-Fu8l3^{zQ7=Z*7$y-8mH8&9{f&?< zdmBD}(Bbuu!~QOPE1_@1{Nz`kADk1BE8^XKySqO6Xe&Jxp#J$MAVpTKzqaw4qm)IJ zD3o$vb*5(^lgrS1jr%1}p8XkRQTl1mryQPiXOKYp2FPmq5qrH&}vV^>Ov)Q49ZFPEFI+N*gT?VS`8Y4%8~wDOxhEn znWFEHTRmdV&C1;m7O&rJ=cn5a{-WwGd#(1VRhL)Zy8iXUNtG|$&31KZlMHRcm!-}y zBk_F1oBMtk8@@5mdtWrl`$>4e`=_!$dOR}MnccIp-u0bMjvrU(>YOQC_k0<8ZBMDI zVb8VY5k+T6F;rmfl}{KBWx6^6dHmn*_H`qk?bdJ zn+?oUKifxzUgT>qW?=VXv3(j2+k9h3o}?=crnmq6;m8qBmiHXqYjN&kFEZ@OSvXUc zHFV?U*z|yjt@;$1lT<6FaeRq{kNgMr9DcppizR>c4)mWlseH9Rm;QR^&_CtJ{C;-) z#}^|q&wIK5amzBTs@LnbGIfRgl@7N*{A|jBY3q&;o{)RC?@FGmk2|&<_2<@4N4A|( zxM1+LQ$uoBJ{-4+UT7WrN93%p>#vxT>rRIKZ*HI1uQo) zot0Aue3$j7ziv(|b7b^ye|^)r)A&Dk?3?%E+sH22N^L4Ow&>o9sUL(_xY1?f z=FCIFZ#7-j@!XR9+tdBlY4(#+A!Wm}A4(dX{l{<4Z|$(+#HWu7Zs@tC^p@|Jd^EJ< zfzTU^D_8$y`^xfLhxeV;q;HjR0bTmMcKz|tFP8U-{Y-6tej;{jc>N`N1|0t4Y*LQs z;ZZRMJGR~Od55uYygL5Qxmm5=-*cl;;*NS5PG{`f{I}7GoAy?HelNr62RS$Xu;*Hz zgNMI@@a~2mzHBmU{gRoLSIxOJvRB%z8NPVB;q&Cv6L$TaFf!l0pBtxLx$0=1A4rKRO_Hs|pSJESux^%dy3`qP|Nvqhi3Jri1R!TK@9u&)<18WnG!1 zHB0UsOf&W9qKjkx{%P9vW(C&LZ@$}Oh75YXanhf^hCHjWd-t*_-$&)ok@LtO&#u%u z@=E>v>bIq>Lu!^e^=ZLZ*9+7d{p!iCA))my)?1UabM-%-o>`l-^Z1u9|4d!vhn8>r zS%2j02KCnD=@HWZMer{@vpsAa`^SSGrACKsxR5rl|I;j&^JTAkG*9<)X9tyjQ1bcS z317tr9jbcZ`_l*V&6vBU$g&Tn%ni7GZ`q#x#akY&c>euW_wN+Xzp#AHwFL*Hd-!F! zJN@%k+wkAbjFI#T9 zS@}lPkhyg(Eibp^df9L4fA!kk-qWHQpWS||LdKalMtqfVfAI!OJ1jU>d4Ha;KXN~r z@Nn^?BQevvKUn(|TbA0(MUo4#S-txclT>9;Ud1cqmnYA@!S+R#3_N86F zDZKEtkoEW4?ti`OgN`TGj+{T?gJwBb{CH^0iV=tZ8GC1W_D@fp-#b4r-G{9!hwLp= zspF6eyL|cMPVT+BXzurye>#(8M*WLZe1|VA%jz4S)VNNr4QIYQmLXN8zH{z zrV~+x+UkwU*^3%i>7v2u4 zlDqkksgM3zT(;fCz_&l`cR!(Vw!PzC>)EpO=Q}=ZIV-8?)hf4NmY$Sh{rz?HK zFO(U5`V@5tM|b3y8t>og-2*R9^b2lX??{$wPiLp^nf2?eeJkyp^s+_U0p(3XuW>&%!^HR?pIqN%>URIzmK^lyGJ z<7C9Sq%Uuts<7bY+=AVzrT-;v<*bi$1pU~z^_0H@TO5Bn`AqO1e%mhZ-g~}OV6@a1=z&KJCSJSOiqiiV|#Y~Ugq?+ zR|C6WxE$Fv!^WC>>Q8GF_g=%2*(Ud^)2`f|5rI4Uv^yB?TbQL>{+5|q7j5;V=FK8o zHYVSjx9w^Ew8yT-RPtS!a4g?1wSKKKYt^f`%2hrYnLMOXr!oE0|Mlha*%^A?cxUOf zn7Z>H*UGtL-R3WT?m4Q}n3;Jll_}c4Rq2^&yR<5vYF33O%}N|k(`4)UHqEQ8=zMN+ zK&ja0xr+WcwfGxN3aop5)vNgX<-6T(lk@ZZcPHMSaj*TPqCo=!I*mJ4DSxA4jjG+8 zcJfSYyIz;qZRvC6ny+u^QrCLje*9=`NQw4MhUXo#GVbQ6)kA9#c=3W~&^VHSg!!$4wc#XiJ^>YFFFl%S*p#n9#Av?eJ3v=d^t5 zdB#coCZFi{)$>y~DZS;x(vJ) zkz-V@TIcfZxY6=L((ga)ytg(gvTB+%8LJNN@+@v?r}Qg}*I0hMP?qS#u(-BAoes^u z;Yn1Zi?jL{|8d)iKjsD&>YMz_sK}t?6UCYj%Q`;jt$BQ$7C zv8e&Q_tfk>t=W5Lt0%4PF=>3ITt(u(sM9FV$#fGA?%vw&WTj!{a;zM4t3*h#Z|+Qe z`*HtG^J}MXy0O~nw*Dt-kGa+2@9J|G)%);eF&d@+?QLbaG-u^r3L#%tA%=S#w>&S_ zxLgtKiN&Nn9+_?OuM1}>H9esW}_K`yAV=le@dj3j+ldV$qR|yvXmGp zD}jTtnC3z5)ch~1L|l_pG>K9w75(c-*1rSiT`djHM8EiE{ZN2u<-%gUc- z%JhS>QfzIoKb9)-Jv~kGX$tSxNI{1P!RkA%Gtqt_tV0TeRRdaNP|DWfqF~j57B(Cm z$|6{Oi4PMG7X_=;LI?0*wT5|ZJestSZWkxY)**v~Rie0-R#r$CnVvoj2Wn}s>WmMg zLp2XpABk&mQLxHDixW;f7!a(s344)O!D^zgmsUPVS4_l1VpDPeJXoC*@o062bhSnL zu-uT+Hq_r>)kE;2KBv@SW*4mTi2S3K9nuXGI$CWZ-Dg5aD?g;Wiy}37MXNxhYr{IF z%bZqd{-wioIAvOB1?XQoTFoKdWahQ;Xk($k`6dyX^|3jYrH={szi@@tr_OeVQ7DiDNR;P zwDrc+@@*-AUaO1(1BxGUHQ`kcOG-rt-=i*BQV?B-TIA;+L@`sV80JFCed?^{@)unG z%!OJ81b?!t3H5@u1TIGc7wVZ66I`fa;PN+I$QPgbLURQOt^i>d`jl9DEun=+cN>Tc zH4*3ml!r}e7`7#Fq4t3*z;Geged?v=3KU#{!mdE(LR|$qdaovUYmt^x(Sv`epH>*S zP&2_5Xt+?OKJ|;{N+q~b39eMc6{Ap(ftQLf;uLDICBZJ#T}!gd%aT%4exMGcexTO) zl>cz6exNj+`homztn4yFj>Id}bD$v2O%!UlC4n#0NI~@Qqg`e}#x~SRpUSAYQVXus z%oU~)Qgc2QG!nQ983|m4jbz(~d_@0m)kV~CpUR@Sf|;v`z9v}M70mfq)P#Wx{wM4T z=K4|GNZ=|#61aj57g~@{<F8ju^=#>waC8&*V33(V{!oXEVbEP$07*8Cobb>3L;7Z5k6{+#) z_6^lAM*>$_6Xv!no#8^?;!`EHUGNkfyWlf5rlo7klJvwCPY>nV66`8(Byd$Q61Xao zgz`#nxX^R?RD|ZrAh_VAIb0c-tCGgcKz6m@+ncBx8MtmlnJ{ow(Oek}7g~=`C1|dU zf-56)+3hPMb5+%NbnBGts%9kE1^*Mw8L9O-ePTw#g&x%53Sln0&clat+HweU)zEk$ z%vIA!;HqULH&=+^LjUY=!H06nE0f5>OvKehMQglF%;iYns%^sDT$v0PdJ>=Nqw_Gc z;DQhBlvif9tB%IYOkA-vGFrKonaiu5k-%lwjm(A%UkO&33mC61g^#;p&n*2To{FXYKi8`%62u;*JKstm6hy@Aw(-3S;?*#`e#ev ziZzlu53?FBjB!4-S94_(d6-S)VK&agW*RRWamCZPWpQQWJd87vn=6~)!U*bcWfxr8 z1y^?BiY0stJv(zH7zyKLb0dMP1xd)m?1l?ttxp}$cI6OUIYb`j;5=-p@p5n;wlWg9 zS{uo2R}RC4k=&;)Xs(=sE2rSf$y{wTUQXt6ByhDgVc@cTshoxjeuBf5OK|04F57R* z#d+9HCi3t#wyQJ6Ji^z(u4YvKEEIPMy=E+d|Kn44bP44V=y`-Cc^JKmPDdWj zHAjLaT}>Fc?9nlg;evPNQ_nP4Ucr@@x$F@uFLQO%czKztyOF@v!${ytBnh=Vui=8X zMqZ)j$|tz;3A^$!S5J+XkGXmo30z4=a@&>9aKXcKxbh3G{KBsM%+*`tToVdVjc7)D?yMf90FR6|PXXq+PP3?A zXlU%`KZsIb{d2zAn*a3K$y|e#f>7cKR>`U8!^|X6%E78AoLi%V=bCah2>&&h)@=~a zo*}}EO*sq2h@CPXywhM+0Zy&C7Cvgqc<@w%)%HL{vpGtzPV&O%3|6<<4m%z^&y;Bi zXPv|=?GZ16b#lc6Ehc69;1j0gfM*!2(ge|m$v=2^!73A6BVz}AykIp)#Dk}o5)Wf~ zN*z47l;u&`BObiDl=0xxrNo1mmeMx(YAJQ_*iz!b>q;39zE?^eJg{K(5JLm!3ubGf z^xbJMp`yKnDz_&T%I#$!#YcY`%58Iyk>D{5HWJ#V?YV}UwuyS}aD@r3Fy=z>06mPk zhLD7wI*hrR>Yh4G_^M$B9WBJC{?I*IK}Jv3cm)M|K}H{H!Y~dv5?cQ-69!9cAEBV( zLd$cw3NhDkeN7?3RfxD^=+&T>U4^)pv2(2u_cS9-n47DR;X;e1`Sb{DK3!PkT4BLe zn7Kw#eDsNhO^;TXc$%uwny0YHzruzGy@XE%X`Uj?Ge%!iMDP@0p0OqjJ*RC`5w>ZZ z33J<2#Biba@u{?$t0;4g*VhykTt&I8UZ*hFRMgm1lzAqYYrq4q-il?<+0mmpJjF!b z6%#zg*rqo$UNKQl#h7cN33J<2%-DpUlIHB%rs9IDxZo7p7|Cr{ zal?fk*x@R{Ty|YAA-GDgT~jq)31L?WwriRRbK6zIaG_^+xJnAUa9_ch1D0gF-qd&{ zgaC z%82|c!#wEkfmeojV$?fELVvNqNZ?v%Byc5?1gjFXC9_)dR1h{*Fg)@v0#tgD^xT*@ar6&N`j}7;Hkts>oiX#!&8ZQ)@z&-T z$?(8eba*NYp2~u!GV^TEc$JxFqmfWX?-|K$Q)R;iAJnHB>oSUBt|t1LC{adH%(aQa zP}`!I%dTxvqGX~BI_d-+La5QJ2=pofy$Yjm*639PdKH0Q#h}A4_NjIny{gEkssg<# zqrb1ws|xh00==q1hlfpT2O7PaK(8jyt1ppu_9;sct&$H3WJMfnI~rw`uem0=@pI# zc9VoO)M75o+53fH&fbsKiZC}%(!cI`x}{6v7)cZZawpfnB)*d$O~@(dR<%8Jbyz3o z*mXVP)$`ER_s}))&^2V8yzAV^Bc9Jg*O+y3E{=X7SS1A0hnYJ!Wu2Vw$9U*sJ#@`H zba5WKcn@8IhpxGY4)e2=<O6d(P0v}pO!qUA@M7Kxhdpw|}t3iiP` zEwVPF@1^)?XSEp}ZM`_CFPu+jj5mwX@Jaw37zs9S>JRcef zBj5oexqF#9#wN5nhYR~7oO?^yAK}SF$VlKiY$P{VUBiXe>{Fw)UG)T4 zJ?64K73{@`p^~xkiJpEV=_4b7>!^{yb&MqBbUnj`Uc#p)YA$+6*=1LKVOM?TIvHj>+}`i2X=58cPoTn(7(6Mans!PS7dPEr_B+km-H6R^LesXAq@aq~1V zJm}GAe~IR4$UL@h+)(f|O#^z%AJjTzk@ryDc+1qwr{G&WW=W-C6^tc{r`hVaqTU^H;hn=m?t29#zK zk@hBp9-}UrFpSQQgmS-R!oY6NB$^mYFv>Xj)Reg{>uZ{d@@UGITrpv&%b$}3yO3W^ zIekqgo|~Gdnc;z#-&B2Ju5sJb%^?0)@FW->cr8AaU)$51dG3)8 z<!dTIQt$3(Y z)Pi~J5xa%qfluY|v=ltpq3ie^Es3Y4`bzV(G(0Vt=WET=Qt-4iJn++e>TPXLE5XxB z@U&uk9%-IdhNl(te4}|<37%Gl2fm+A&C@)s1y5_i)0%i<)VG?awc%;aJdZU`Yv##d zV%fa_{7HwWjo@j+JoX6ChVA)IW)nv1Xl;a)q%NQXuJ;0dIVy>1(SnmQGuK{iS9j*Rtns=tS4JaYhoC>wvX4Fxw2@y-pu7l zuq&$xb941JTSuT`&iT}3&C{QG=u8~u=`U>R&pdc`7-{HFJhA*Fu_eK#ye7=u ze)}6PjGqqI0OCqe`Sdjd1lIuKicxeH58E`r*ffA_YN`sDYrqp~V%hB%W3t0DP~_b} z<_Xg|Igok6G{Qi`Gm!Icp^4?@8EEXmIPX)}blweO9=qNR5En{RPYRCo^Z`G)bI>tp3<6UDD$9Y!k(dq2fmn3z0y3x1kW(R zGmLp6G|w=@GmLr4Xr5urV~@4N3=jM}S|J@}tu_s3o=APoaKSU2%crd78E$xnGtXSY zLB0(a`8M3}z-OdYEzL86dF*;Uf_dz|dj#{)sf3&(BMi?7<|(h!HbU4l!tlTkb$CXK zd>bk38A&|xs)EKFNjz=|eNROb<{l$P8ZP*^4%aB=vg`IJ!8MA@2q#jZlt(caa%&XZ zR9W+k5;l!8Jn)$vp3%al(IW3gGf$M}8Etq*Gfx%GGg|PBHazgd9iB0QXAJX%Q4FMe z43|+=%`?W7(HQ2brg_FNPj0#fR*x|}@a-L*v4Ur;$hWb~Q(g0nH9TXPr-tSkD|p5l z9?TaUo^i}mQ(rSq@Qh;~oF|5qjx#*tm?zp?gL+`Mp>c)>a}ZkL)OCBjuxGsB8PDZY zTl0)JJmZ^>Xw8i(g~!Sg!v*lp-_;)z%FG~VmP6R+wU33a=Hk=%9r zb+!rf{_Q;Pw`cs;OkYa&T;KhPc+Nk}`zKJEQ{Fdz!$UXGLpRAoH<@*9#2kN$N4%-5 z`!N-Ln0fj%)_ud*M*CSO2E56-TmkNQ(^)6y-!oVzd1rdWd&?u;mQRK_ptQ!(U zA5`hAw9IB*5DL-g=CJM^VK4gHlzBSOLpPsw*M)8Gu&%hsmjxcz!cR%b@vet%k%w-v zhi-|7ZmEZEnTKwe1mzyC3Qv}ZxVb2u9gMP=SYHFUTf@iAWnaVr~nrEuvnaVuPwLMdX zJyQ)2`Z9-Sn&6oxc&2f_wa|Feh$mJ#62^j-CJc4XUeB6lxX?$^K1yxVo6KeVId6(G zdXsHxrEPlC*z_jb^abIdZoet=?oGpke%Ild&OCNooi1#e&OEI(&ve5xoq5`5d!~!L zn{If}mpeQ&MBdF{9(x>}K|Jw%77hA@8HQ&D^WgAV*fWE9Y`8~ z=4nrOxFb1}dF(x*Ga0>uwsodK$4KL#za`M$61nvjqvK2^r1mXBkLMGXED5vUPA1Iu z2COi69-S!+Jt;;phi{hPnP~ z&uqgpn`%O9)l>7#7Bz0R;lU{G@XTSJUiz9jqO9hyJxL}kkXU;gDHT0|+{Z|;$sUR3 z7%q4RJ~cq+-CV&nS8&Z`uD*nayqjxmnoBmdQ+Cfimu<3n<`Pdd*9UkU4$nNnGf(i$ zW1fDRXP)7iCwS%wo_WR|criXTMB6i8l+k?Vv0LkW;)zxLb^gpJp7t&Y^=^O(v+Esd zHhdz7;T^&7j$n9)83t;UcbLJEz%a;!xf$SLISdN~!vc|43plR^6AH>?fyt`{BCi&R zyjo!L3SOJTvygf0+5AGmvygd)Xr6_JXQAL(D0mhc9(aNd&%4ZH-+g>n@Vv`8mP|b8 z+1@3dSjr{qdGL1`Jp*B(CBMt)Ln$W81b(H%u!tFkQ5a$_5)6yjlHuBtMaGgv!jeV8 zl10W6_^LiNT-UC}qGT2ep2f^FLh~#(Jd2sf_CFRgkL|ZDHazfu9iAnEXNllh!aO52 z&l1D4gn35kJXj*^Sz>tLQ#(9M1833alE5`6{R6q1*fJDGQgT~ zu4bK_>8|n6t@Y5YW8G0ooia1*^&asyc<45=PR?rI^U!VbxOOw^kmlCL1X=#hOAA zxK=aQwPb5mdo^>}H?_6X@$0 z-S(!|5qhkesqxlvDL4{*owrPw?dzalTxYn@8#r9+1=o6E$$GYAmd0Dpme{k>^;`;X zQy9?K8+7z5KDAI=vVqa}aHwyHPgx*=r z(dZi)eXfy^GmQxgY2Rqj(bqZX?=kv3ea(9U{XI_md=rKd=p7@u(cd%Z=rw7lvQGOZ zk@igjeG{WE(0H3D?N06ABywhxK}Y}Vpl=pw-z?BKGx|b}zM0Tlt9Om$PWxs;58;-J zo}Bix=(N8t(*C|cf1lA8X}tFteX)_;=dJ;Gl0|^dyL z*6M4v6FRNXQVe)V+ZlZwg`vf4r(VaW^{74T%{4)!x7*cr!-MhI;n^YbXos+32lH&u zcss}nr{?bvHGhXe$H?xW?-b}e1^P}#->A`datXX=B&6NGE4I_1!$3dwkr*R@md?F5+pgHc=WdKEn5KxONM!-GXa3b8XgX-!1ZKx5%g6 z#u9ij4*DKOx9id#fxd^)-`D7S1o|FEw`=MigARYlLEkIVzE_~{W%Ml?eXl^@E7HE# zpu@9r(Dw=SeT*JPF;G+YG5S`GzK`>Mn~~5Cs!&YS;(Z1kKAMBRU!d<7==%x1jru_2 z?WZz!OX!WZn=m)me!~Ud&!pu=x>&_81I!y4fuf&LMrA2DI> z{_`V&{t=^NCOeTjdF$D5YxlVOsc+}IHD`6633t9B4(^>ErBtT8H+jrMcicmF!bA75 zhwc*(-ANDKDG%Lg58W9L-C5S%37`+^D6ARzr>v7R@^c=#^B%ejtUDM?A7)1WnMb^f zq)VOROuI`SI`rA8m7Gyt@rd_1>#F3S55s$vb@JM4tdq7~XI)%c`Y?HLgLM&b35@Qh zhYt6XQmaE^MdKFhB*$$J-IuJB>AT|*?=I`o1=0uGhSBpVeRo>PQPBpEax1aDnWNlF zY(L;Aw{Y7JI7+R=@dJ)>D*-xcGVRjTecv&GevHv=FY*|nhp3Nq8$8D7M~&p}S&tcX zvP%}IfNlF`qaF!ZdS8p)mZlLj5V5S?nO(|(H4?e&gR z0{s-DH`I8iDD95ld&>0NsE6pq9L&>nCJpA!k!hFX9=^jx~MVFQaW3!OGZLE z;jtl|=!Koq`czf640-agcM^ua4^q{6rUF`f!Na~9(fot&mIKV!@I&?OC!Ob`Ab?24>ZaZ#(ZcbV4~Lo zCdP9I^K-)Vsjqa*&k56~>@nhV!tAWRHepETBO|%f34g$+s_JxJ73sVx(s@;+^D3wF z8;yCD%LwU2iCyEE-|Dby9MfJkyv8xHY6y$qWzcRJ&3;|5Ul;7x*`mi9^EzXGXC!xN z!b@>5Z!jkAz9D5d1m+FG?5e)kC^rbRn|fj-U_K=Y>4cZ#VBTcRXFBFh#_?9f5gAVBTTO-!#e{#&|iPg}M=Oa4oX+15S6OF3J(@1c9(p?m0| z`^rOyJ~$=EBM;p-9=dNmbdNoB-+Ac1XPvy4_{1aLQxDxU){W0aA7+;FoONHNck6y& zot$aBV4a+$ykuQnF?;)wb@Cl&KY3jHvxn{%)=A!9J>vc5q5IuK_lJk>Pu59}zdYjo z?V)?+aqT}T;-O!-M>?NsrTc|@qF=Zt+QvO@8-ME7aF5%@Uq(XPut#FlUpnznW8N3- z?LMRYt*^T;TJ3$&YEk29SC>Y4AW$A~%EBlHdb$UU`ATCxV9bAv90|~V$1*|xiQgV9n7x<=GTmA z`v_k%W}rs-TIA=~B0tgMY1fC&&qo6Dk-&V!n5i`8BZ2uyV4}yMyUrT(8ZqtnE+?cWK^?*!&|jG0zre#e;UjD&J8L0D*w=rJA4 z?*-=f!uIbOGrdOno-s2R$z7Mw}o!eqhWTMgpeYD`Hfl zJL($q1!LyaF<%JG7mS(9gdxvt&*p{6Gt?K1Y7XX0#qrm);G4q-*q%)t9+?W_u9n7B?Grx}clfe9mF$PONavpd^H0Vsqf!3kbVeGty<}c<8cv=(4d+ z@@8k~S0At$YL4d#vV9c5tGk`H`83~y1Ex-`SDA77BP@n`dN^KK{9JD>fKu(!$ zEm|zS_hgK9Pa>5_St`b~J-$?oSw~~0;*`}j5>jTbkD&6tf$7%+WC!WmC>2@9C$aU9HG#%!!( z1`Et!#%yB3fZ5bYNT;2j=&@+^Sf?|M$j>w)KhrQ~j7CYr`59{@VA{0@J)VP^R$!(T z=}gO*%`{3{#*8zP8xuVyt&8e(rW2UyL^{(kX1qp8$C&nAm~>p1(48Vb(c?Op=>=wb z#thSSH$7t}Xw38$rjd|N8xuXYgPB2KW)SJjz?dyGN(R3`>O)!@2_?3Iu+VZch*YEh zr#DvUoXE%wt@L#nMeb%~hSnx56*1sBdthc{Onc6Q@x#Fk5vdLlm?4bWR-=S)PP8+U zyTma5IGC9j({2Ho1ZF0}3{mYhN+!naU?g`7!1zV0OWO9#BAuBTGfbCQX2$GDC@5)+ zan5yF_&R&-CyPi+7PhaGX3xTDvDYfHh@J>zB%L&`(~?!BC9A;9%9x!sW>&`RVkCE- zVT`4d-Zf@6ftgKUW@F5*8YLUoo^D3MJ&W!}0)t)B7_n(ZKr>_)4A})kc4p|IQL=NY z6OH696^!@}W)6XwLty4$%$|gTd-ypR6XgT{z(L3<5OOkt-K*zhgkCxwIT^ve>yeYn zr@I+z;a|`^UR#<=VCE93%Eg#T8Z#GT_BIkQ(X*k|z(1ikFYB<}gz2OGQg#^b--Q_o zb-J&KiT2#wNWg?&4@~$sKJu7t37Gwj1k3?O0_H$1!3T1#%OmW|L-sk>Akcw6#NkT1vXO^gr=n~6M>^+t3apfoWo+c;q6MHK~n;jS>KQXjXR(u;b;E5a3IZ#%g%P ztLdSul|qMBg8G-JPU=3G#2Fa zPcjnxrO8Herys2>QQgrDg_vQAj#)@B6k>*{CJZ@bGZZ2lI;&|W%cg`q!xnJAzlri7ZC`B35p5ql2o)!8W2eTMs&eGQv6PU#q^KBD` z{G4qhJDtc0^jV2&jt(nMn2BcOE>4(<<~f<-oS$<|OkmD45-{zN8-1RGSwdiz5a}$z znDaGC39>zeSGJI{6703uWrRL6QT?Iwvm|3K(ASkD%$_PtmwQRZTxi08IhU>mW=VmG zJ~vUl(wL=0I!lRkmSW6zHD)O;qeVu7?WmVvK%bqc7VEHZff>%2VLF}RjJd?bgg4+w z$lawT3=H;q0Y-pCwM>VV77V3Ds!KD&auXAnD~tq8+ke9d;$TJy%m{%QL71J@N{tf1 zIkCz}z(fl`PGAIbFv|$cG6J&7zS~%a%g?T77|#;bS{*Y|FhmN5 zNY06MCT1$tORYB&QjL0sRAW4JFv~LL1|74kz%0v{8%-F}`JR#NJ`0!_PZQN99afGp zHyg?QhK+KJ`96iAU&5H1sB(~#29)x2o#XeFr?fbJUwOLD@%zg2Xs|^yl&3OkqqZ6e zDYN}PjNpl?q-LnVDch!FRuBvoIAtH0Fj#B%QWZom1rH!mMQF^5jA_p)D+`;3HIZm;aYgGy9AHD*=D+^=I+73r+Xm>-(3RCL0_0VAO<*(-bS zz#PnKBAwMlI;%0}L5)(4(wSuTC{&~TbTHw;IhfT2W_6Ly>Wq0vV^(L|4;#si2@lZ0 ztRXOKh;-Iq%p)452B-5QBe^l*K{}W<1!hf=&YFyQRHM{n%wtA!W5NSXR0DJw)nZKB zm#QT&Ycb|=jZ%v-Z4a;(=O^kXW@2?{Ij*07H`&>*Rfl`X2Ebc<35>=+KL#YvK{F zDeIn54m-2G7}m*mYoJF=$=l2WFU~_3@1aXz-EsQs@M6t2wUW9P9=evSlV#M3butfH zvrd*?`jLo z+Kl0i)yJD70-GfrT}G3FhO8ONA+jpW8e-=CU72n%y@wr&zSc#N<3rUH7E<%+`$gM8|B+m`{y_cJ$mx!2H2TzO977!hB|>vyH%P!ZZMLCw z_Es-7N*lKQMI_^RxZLy#MkX?GX7{(?5&a8x%{k(P&~+bngRcn;D#m zep#XawDZeH)&#Vn?55>RibUUnp3|nzT&gl@cKT(Z!zk>Zf9Qu$)Dgc#HOViS;^P|U zHyeG=nOW72Q_Wk{rjMfh(V{**^WHqaB2Yht)3N>4B>IQXDGH|~`_mc0I9b@A&ep}* zvi@{BB+mWwSG|IB(l4RvAAjYCG!PzD1EtcCIVvcV+Fam#YCJv_L`hADZCb9Mt{462 zMmSxl($n7_WGudCroT#MqUE-~HodqU(=D!6XV#ZweJTDsku?)|NzMW+;*Y#&><1%` z1;ScP>R^gellgB^irtfc9@Q%5`d-|id|Ru8>-%a|kW$lwuJ@yV{vy{)(%E6$eF&AE!F}KTsYo zF8xn=DE0qNd055wKY#y^$pN$|bQb8qUQtJuiayctrq(jN0_gwe=l`EM@QOA!V@F`h zAJmI`Q&ztGy;)MG_vZ$yQpI-Nj3nI_`bEEw@J9N39DSmmB+)Mh!J+h>ENMt>RwhHtcO}`TkJYR)t z@ZJ82rY{r1eN*#PJLiY*YSCnsaq>CxWB&V}|CRmzSI=Kv7Lg~@{CCOz@ZYz={-gBk zwjY~oVL$9`L%*=43;n`Qcu>$dA?ZYuj(7H9cQX>i_tepMVh;?Xr1N zV&c%U&ew9z*YYYoMFco97LnHt+ZeqW&lp+P(}(!+Q+3rqdh^{NdJjW4dS~GO?oSpX zbGMBD=6dAc!2c%Ve;Mb0m;b+n{ja0_f0^HpdiMZow6GyG7!}8=5dDei-F?Ww zEz(E200C-w_17a3VTR97tw7j=5~>>0&3hdDfgt7t@&`l-s!!4&*I KKmVuZ!2bo$!SV Enable All Three Rx Antennas - iwpriv ra0 set ATERXFER=1 ==> Enable Rx Frame Error Rate: RxCnt/RxTotal - iwpriv ra0 set ATE=RXFRAME ==> Start Rx - MlmePeriodicExec: Rx packet cnt = 2/4 - MlmePeriodicExec: Rx AvgRssi0=-88, AvgRssi1=-80, AvgRssi2=-91 - MlmePeriodicExec: Rx packet cnt = 2/6 - MlmePeriodicExec: Rx AvgRssi0=-86, AvgRssi1=-77, AvgRssi2=-89 - - iwpriv ra0 set ATERXANT=1 ==> Enable Three Rx Antenna-1 - iwpriv ra0 set ATERXFER=1 ==> Enable Rx Frame Error Rate: RxCnt/RxTotal - iwpriv ra0 set ATE=RXFRAME ==> Start Rx - MlmePeriodicExec: Rx packet cnt = 0/7 - MlmePeriodicExec: Rx AvgRssi=-87 - MlmePeriodicExec: Rx packet cnt = 7/14 - MlmePeriodicExec: Rx AvgRssi=-90 - - -=================================================================================================== -3. Hardware Access -================== - -===================================== -3.1 iwpriv ra0 bbp [parameters]=[Value] - Read/Write BBP registers by ID number. - BBPID - -3.1.1 Read BBP register, BBPID only, no = symbol. - BBPID: - 0 ~ xx ; decimal, 8-bit - BBPID=Value - -3.1.2 Write BBP register. - BBPID: - 0 ~ xx ; decimal, 8-bit - Value: - 00 ~FF ; hexdecimal, 8-bit - -===================================== -3.2 iwpriv ra0 mac [parameters]=[val] - Read/Write MAC registers by offset. - MAC_OFFSET - -3.2.1 Read MAC register, MAC_OFFSET only, no = symbol. - MAC_OFFSET: - 0000 ~ FFFF ; hexdecimal, 16-bit - MAC_OFFSET=Value - -3.2.2 Write MAC register. - MAC_OFFSET: - 0000 ~ FFFF ; hexdecimal, 16-bit - Value: - 0000 ~FFFF ; hexdecimal, 32-bit - -===================================== -3.3 iwpriv ra0 e2p [parameters]=[val] - Read/Write EEPROM content by address. - EEP_ADDR - -3.3.1 Read EEPROM content, EEP_ADDR only, no = symbol. - EEP_ADDR: - 00 ~ FF ; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, ) - EEP_ADDR=Value - -3.3.2 Write EEPROM content. - EEP_ADDR: - 00 ~ FF ; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, ) - Value: - 0000 ~FFFF ; hexdecimal, 16-bit - -===================================== -3.4 Example - -3.4.1 Hardware access - iwpriv ra0 bbp 0 # read BBP register 0 - iwpriv ra0 bbp 0=12 # write BBP register 0 as 0x12 - iwpriv ra0 mac 0 # read MAC register 0 - iwpriv ra0 mac 0=1234abcd # write MAC register 0 as 0x1234abcd - iwpriv ra0 e2p 0 # read E2PROM 0 - iwpriv ra0 e2p c=12ab # write E2PROM 0xc as 0x12ab - -3.4.2 Statistic counter operation - iwpriv ra0 stat # read statistic counter - iwpriv ra0 set ResetCounter=0 # reset statistic counter - - Suggestion: - 1. To turn on ATE functionality, you have to add compile flag "CONFIG_ATE" to Makefile - 2. Before doing ATE testing, please stop AP function - 3. If you want to test another ATE action, prefer to stop AP & ATE function - 4. All ATE function settings will lose efficacy after reboot. - 5. Before hardware register access, please reference hardware spec. - Note. - In ATE mode, the channel must set via "ATECHANNEL" - -=================================================================================================== -4. ated -======= -4.1 Introduction -The ated is an optional user space component for RT28xx Linux driver. -When Windows GUI starts, AP enters ATE mode (i.e.,ATESTART) immediately. -It behaves as a proxy between Windows GUI and RT28xx Linux driver when ATE process proceeds. -The ated will be killed automatically when Windows GUI is closed. -You can kill it manually, too(for example, type '$killall ated'). -RT28xx linux driver will leave ATE mode either ated is killed or Windows GUI is closed. - -4.2 Environment setup -1. Connect the platform you want to test directly with a Windows host by ether network line. -2. In the Windows host, run WinPcap_4_0.exe for the QA GUI or ./RT2880_ATE/RaUI.exe(please unrar "RT2880_ATE.rar" to get it). - -4.3 How to use ated for ATE purpose -0. First you should set both "HAS_ATE=y" and "HAS_QA_SUPPORT=y" in the file ~/Module/os/linux/config.mk and compile the driver. -1. Modify the Makefile according to our target "PLATFORM". -2. Change the path of "CROSS_COMPILE" if needed. -3. Then type 'make' command to compile the source code of the daemon. -4. After the driver interface has started up, attach both of the wireless interface and the ethernet interface to the bridge interface. -5. If you have no bridge interface, please give an IP address to the ethernet interface. - (for example : '$ated -beth0') -6. After the interfaces have entered forwarding states, manually start ated, type '$ated -bbrX -iraX'. -7. If your WLAN interface and Bridge interface is "ra0" and "br-lan" respectively, just type $ated. - (For further usage of options, type $ated -h) -8. In the Windows host, run RT28xxQA_ATE.exe or ./RT2880_ATE/RaUI.exe. -9. Select the wired network adapter, then press OK and wait for a moment. -10.If the Windows host cannot tolerate such a broadcast storm from ated, - please run ated with option -u.(for example : '$ated -ira1 -u') -11.If your target platform concerns its network security, please run RT28xxQA_unicast.exe instead of RT28xxQA_ATE.exe. - -Note : -a. The names of WLAN interface(default is "ra0") and Bridge interface(default is "br-lan") must be specified manually(for example : '$ated -bbr1 -ira2') if your WLAN interface or Bridge interface is not "ra0" or "br-lan" respectively ! -b. Please make sure no other RaUI is running before you excute ./RT2880_ATE/RaUI.exe. - - - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/brftph_usage.txt b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/brftph_usage.txt deleted file mode 100644 index 63392e86d0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/brftph_usage.txt +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ****************************************************************************/ - -The steps for bridge fast path function in wireless driver: - -1. Change HAS_BGFP_SUPPORT=y and HAS_BGFP_OPEN_SUPPORT=y - Note1: When you just only want to enable fast path in WLAN module, you can - only enable HAS_BGFP_SUPPORT. - Note2: When you want to enable fast path in WLAN and Ethernet module, you - need to enable HAS_BGFP_SUPPORT and HAS_BGFP_OPEN_SUPPORT. - - -The steps for bridge fast path function in ethernet driver: - -1. Find the function you pass received packets to upper layer. -2. Path code to the function. - -Note: If the ethernet driver is a library type, i.e. ***.ko, you must insert -the ethernet driver to the Linux kernel before RALINK WLAN driver. - -For examples: - -1. Declare a symbol and a function prototype. - UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket); - EXPORT_SYMBOL(RALINK_FP_Handle); - -2. Support your received handler, called packet_forward() - - In Linux, find the keyword, netif_rx(), such as - packet_forward() - { - ...... - - // pass the packet to upper layer - skb->protocol = eth_type_trans(skb, skb->dev); - netif_rx(skb); - } - -3. Change the code segment to - packet_forward() - { - UINT32 HandRst = 1; - - ...... - - if (RALINK_FP_Handle != NULL) - HandRst = RALINK_FP_Handle(skb); - - if (HandRst != 0) - { - // pass the packet to upper layer - // printk("pass to upper layer!\n"); - skb->protocol = eth_type_trans(skb, skb->dev); - netif_rx(skb); - } - } diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/header_translation.txt b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/header_translation.txt deleted file mode 100644 index be656157d3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/header_translation.txt +++ /dev/null @@ -1,84 +0,0 @@ -Tx Feature: --AMPDU --QoS Data --Non Qos Data --WDS Data(Not Mesh) --IBSS Data --Packet Sequence Number Maintain --HTC insertion(RDG) --HTC insertion --(TXBF Sounding Frame) --IPX(8137) --AppleTalk(80F3) --LLC Tunnel(AAAA03000000/ AAAA030000F8) --VLAN Remove (per pkt control) - -TXD --HF (00: non-802.11 data frame) (pTxBlk->NeedTrans) --ETYPE (1: indicate that this frame is an Ehternet-II frame which type/len >= 1536(0x600)) (RTMP_GET_PACKET_PROTOCOL(pkt) need check if already 802.3 packet in ) --VLAN (0: no VLAN field, 1: exist VLAN field) (RTMP_GET_PACKET_VLAN(pkt)) --RMVL (0: keep VLAN field, 1: remove VLAN field) (dat setting, current setting use 1 that remove vlan) --MRD (More Data: TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData)) --EOSP (End of service period: TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP)) --PF (pTxBlk->CipherAlg) --HE (must be 0) --DAS --OM[5:0] --NA --Header Padding (padding the dummy bytes in the head of header) - -WTBL --PA --QoS (will be set when peer side has HT capability) --TD (According to mac_entry->EntryType and ) --FD (According to entry type) - -Tx Translation rule - -Frame Control Field[15:0] --Protocol version (fixed value: 0x00) --Type[1:0] =2'b10 (Data SW guarantee) --SubType[3:0]=4'b0000 (non-QoS) or 4'b1000(QoS) = WTBL.QoS bit --ToDS = WTBL.TD --FromDS = WTBL.FD --MoreFrag = 1'b0 (fragment packet should be 802.11 format) --Retry - HW generate --PwrMgt --MoreData = TxD.MRD --ProtectFrame = TxD.PF --Order = TxD.HE (must be 0) - -Duration/ID[15:0] = 16'h0 (TMAC will replace this) - -A1-A4 -DA = (TxD.DAS = 0, DA in MSDU) or (TxD.DAS = 1, PA in WTBL) (use TMI_DAS_FROM_MPDU for TxD.DAS) -SA = SA in MSDU (DMA read it from header buffer) -BSSID = select by TxD.OM[5:0] for multiple BSSID -RA = PA in WTBL -TA = select by TxD.OM[5:0] - -Sequence Control field[15:0] = HW prepare - -QoS Control [15:0] -TID[3:0] = TxD.TID (pTxBlk->UserPriority) -EOSP(bit 4) = TxD.EOSP -Ack Policy[1:0] - = 2'b01 if TxD.NA == 1 - = 2'b00 if TxD.NA == 0 and not PSMP queue (AC6) - = 2'b10 if PSMA queue (AC6), TxD.NA must be 0 -A-MSDU = 1'b0 -QoS Control [15:8] = 8'h0 (Not support Mesh-TX header translation) - -Driver Tx path: -1.not need to touch skb->data packet -2.Only build txd header and fill related information for ethernet-ii or 802.3 packet - -Rx Feature: --Translation Enable/Disable (DCR.RX_HDR_TRANS_EN / DCR.RX_HDR_TRANS_CHK_BSSID) --Translation Enable/Disable per Peer (WTBL.DIS_RHTR) --QoS Data --Non-QoS Data --MPDU carry a MSDU --MPDU carry a AMSDU --No Error packet convert --Fragment data convert diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/iwpriv_usage.txt b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/iwpriv_usage.txt deleted file mode 100644 index 940d646c92..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/iwpriv_usage.txt +++ /dev/null @@ -1,447 +0,0 @@ -iwpriv -================= -This is detailed explanation of each parameters for iwpriv. -Before reading this document, make sure you already read README. - -------------------------------------------------------------------------------------------------------- -USAGE: - iwpriv ra0 commands val - -NOTE: - Wireless Extension Private Handlers - -where -[commands] [val] - {range} ------------------ ------------------------------------------------- -wsc_conf_mode {0, 1, 2} - ::Set WPS conf mode - 0: WPS Disabled - 1: Enrollee - 2: Registrar - -wsc_mode {1, 2} - ::PIN or PBC - 1: PIN - 2: PBC - -wsc_pin {00000000 ~ 99999999} - ::Set Enrollee's PIN Code - -wsc_ssid {0~z, 1~32 ascii characters} - ::Set WPS AP SSID - -wsc_start NULL - ::Trigger RT2860 STA driver to do WPS process - -wsc_stop NULL - ::Stop WPS process - -wsc_gen_pincode NULL - ::Generate new PIN code - -wsc_cred_count {1 ~ 8} - ::Set count of WPS credential - -wsc_cred_ssid {"idx ssid_str"} - ::Set SSID into credtentail[idx] - idx: 0 ~ 7 - ssid_str: 0~z, 1~32 ascii characters - -wsc_cred_auth {"idx auth_str"} - ::Set AuthMode into credtentail[idx] - idx: 0 ~ 7 - auth_str: OPEN, WPAPSK, WPA2PSK, SHARED, WPA, WPA2 - -wsc_cred_encr {"idx encr_str"} - ::Set EncrypType into credtentail[idx] - idx: 0 ~ 7 - encr_str: NONE, WEP, TKIP, AES - -wsc_cred_keyIdx {"idx key_index"} - ::Set Key Index into credtentail[idx] - idx: 0 ~ 7 - key_index: 1 ~ 4 - -wsc_cred_key {"idx key"} - ::Set Key into credtentail[idx] - idx: 0 ~ 7 - key: ASCII string (wep_key_len(=5,13), passphrase_len(=8~63)) - OR - Hex string (wep_key_len(=10,26), passphrase_len(=64)) - -wsc_cred_mac {"idx mac_str"} - ::Set AP's MAC into credtentail[idx] - idx: 0 ~ 7 - mac_str: xx:xx:xx:xx:xx:xx - -wsc_conn_by_idx {0 ~ 7} - ::Connect AP by credential index - -wsc_auto_conn {0, 1} - ::Set driver to re-connecting to AP or not after registration. - 0: Disabled, driver won't re-connect to AP with new configurations. - 1: Enabled, driver will re-connect to AP with new configurations. - -wsc_ap_band {0, 1, 2} - ::Set prefer band to do WPS with dual band WPS AP - 0 : prefer 2.4G - 1 : prefer 5G - 2 : auto - Default value is auto (2) - -------------------------------------------------------------------------------------------------------- -USAGE: - iwpriv ra0 set [parameters]=[val] - -NOTE: - Execute one iwpriv/set command simultaneously. - -where -[parameters] [val] - {range} ------------------ ------------------------------------------------- -CountryRegion {0~7} - ::Set country region - 0: 1 ~ 11 ch - 1: 1 ~ 13 ch - 2: 10, 11 ch - 3: 10 ~ 13 ch - 4: 14 ch - 5: 1 ~ 14 ch - 6: 3 ~ 9 ch - 7: 5 ~ 13 ch - 31: 1 ~ 14 ch (ch1-11:active scan, ch12-14 passive scan) - -CountryRegionABand {0~11} - ::Set country region for A band - 0: 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 ch - 1: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 ch - 2: 36, 40, 44, 48, 52, 56, 60, 64 ch - 3: 52, 56, 60, 64, 149, 153, 157, 161 ch - 4: 149, 153, 157, 161, 165 ch - 5: 149, 153, 157, 161 ch - 6: 36, 40, 44, 48 ch - 7: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 ch - 8: 52, 56, 60, 64 ch - 9: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 ch - 10: 36, 40, 44, 48, 149, 153, 157, 161, 165 ch - 11: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 ch - -SSID {0~z, 1~32 ascii characters} - ::Set AP SSID - -WirelessMode {0~10} - ::Set Wireless Mode - 0: legacy 11b/g mixed - 1: legacy 11B only - 2: legacy 11A only - 3: legacy 11a/b/g mixed - 4: legacy 11G only - 5: 11ABGN mixed - 6: 11N only - 7: 11GN mixed - 8: 11AN mixed - 9: 11BGN mixed - 10: 11AGN mixed - -Channel depends on CountryRegion or CountryRegionForABand - ::Set Channel - -BGProtection {0~2} - ::Set 11B/11G Protection - 0:Auto, - 1:Always on, - 2:Always off - -TxPreamble {0~2} - ::Set TxPreamble - 0:Preamble Long, - 1:Preamble Short, - 2:Auto - -RTSThreshold {1~2347} - ::Set RTS Threshold - -FragThreshold {256~2346} - ::Set Fragment Threshold - -TxBurst {0,1} - ::Set TxBurst Enable or Disable - 0:Disable, - 1:Enable - -NetworkType {Infra,Adhoc} - ::Set Network type - -AuthMode {OPEN,SHARED,WEPAUTO,WPAPSK,WPA2PSK,WPANONE} - ::Set Authentication Mode - -EncrypType {NONE,WEP,TKIP,AES} - ::Set Encryption Type - -DefaultKeyID {1~4} - ::Set Default Key ID - - -Key1 {5 ascii characters or 10 hex number or - 13 ascii characters or 26 hex numbers} - ::Set Key1 String - -Key2 {5 ascii characters or 10 hex number or - 13 ascii characters or 26 hex numbers} - ::Set Key2 String - -Key3 {5 ascii characters or 10 hex number or - 13 ascii characters or 26 hex numbers} - ::Set Key3 String - -Key4 {5 ascii characters or 10 hex number or - 13 ascii characters or 26 hex numbers} - ::Set Key4 String - -WPAPSK {8~63 ascii or 64 hex characters} - ::WPA Pre-Shared Key - -WmmCapable {0,1} - ::Set WMM Capable - 0:Disable WMM, - 1:Enable WMM - -PSMode {CAM, MAX_PSP, FAST_PSP} - ::Set Power Saving Mode - -HtBw {0,1} - ::Set BandWidth - 0: 20Hz - 1: 40Hz - -HtMcs {0 ~ 15, 33} - ::Set MCS - 33: Auto Rate - -HtGi {0,1} - ::Set Guard Interval(GI) - 0: long GI - 1: short GI - -HtOpMode {0,1} - ::Set HT Operation Mode - 0: HT mixed format - 1: HT greenfield format - -HtExtcha {0,1} - ::Set Extended Channel Switch Announcement - 0: Below - 1: Above - -HtMpduDensity {0 ~ 7} - ::Set The Minimum Time Between MPDUs within an AMPDU - -HtBaWinSize {1 ~ 64} - ::Set BA WinSize - -HtRdg {0,1} - ::Set RDG Capable - 0: Disabled - 1: Enabled - -HtAmsdu {0,1} - ::Set AMSDU Capable - 0: Disabled - 1: Enabled - -HtAutoBa {0,1} - ::Set Auto BA Capable - 0: Disabled - 1: Enabled - -HtBaDecline {0,1} - ::Reject BA request from AP - 0: Disabled - 1: Enabled - -HtProtect {0,1} - ::Set HT Protect Capable - 0: Disabled - 1: Enabled - -FixedTxMode {CCK, OFDM} - :: Set Fixed Tx Mode for fixed rate setting - Mode = CCK - MCS = 0 => 1Mbps - = 1 => 2Mbps - = 2 => 5.5 Mbps - = 3 => 11 Mbps - Mode = OFDM - MCS = 0 => 6Mbps - = 1 => 9Mbps - = 2 => 12Mbps - = 3 => 18Mbps - = 4 => 24Mbps - = 5 => 36Mbps - = 6 => 48Mbps - = 7 => 54Mbps - -==> Build Ethernet Convert function. Please set 'HAS_ETH_CONVERT_SUPPORT=y' in os/linux/config.mk -EthConvertMode {dongle, clone, hybrid} - ::Set Ethernet Convert Mode - -EthCloneMac {xx:xx:xx:xx:xx:xx} - :: Set Clone MAC - -LongRetry {0,255} - :: Set Tx Long Retry Limit - -ShortRetry {0,255} - :: Set Tx Short Retry Limit - -MeshId {Length 1~32 ascii characters} - :: Set Mesh ID - -MeshHostName {Length 1~32 ascii characters} - :: Set Mesh Host Name - -MeshAutoLink {1,0} - :: Set Mesh Auto Link Capable - 0: Disabled - 1: Enabled - -MeshAddLink {xx:xx:xx:xx:xx:xx} - :: Add Mesh Link - -MeshDelLink {xx:xx:xx:xx:xx:xx} - :: Delete Mesh Link - -MeshMultiCastAgeOut {20 ~ 65535 seconds} - :: Set AgeOut time for Mesh MultiCast - -MeshAuthMode {OPEN, WPANONE} - :: Set Mesh Authentication Mode - -MeshEncrypType {NONE, WEP, TKIP, AES} - :: Set Mesh Encryption Type - -MeshDefaultkey {1 ~ 4} - :: Set Mesh Default Key ID - -MeshWEPKEY {5 ascii characters or 10 hex number or - 13 ascii characters or 26 hex numbers} - :: Set Mesh WEP Key String - -MeshWPAKEY {8~63 ascii or 64 hex characters} - :: Set Mesh WPA Pre-Shared Key - -Examples -=================================================================== -------------------------------------------------------------------------------------------------------- -a> Config STA to link with AP which is OPEN/NONE(Authentication/Encryption) - 1. iwpriv ra0 set NetworkType=Infra - 2. iwpriv ra0 set AuthMode=OPEN - 3. iwpriv ra0 set EncrypType=NONE - 4. iwpriv ra0 set SSID="AP's SSID" - -b> Config STA to link with AP which is SHARED/WEP(Authentication/Encryption) - 1. iwpriv ra0 set NetworkType=Infra - 2. iwpriv ra0 set AuthMode=SHARED - 3. iwpriv ra0 set EncrypType=WEP - 4. iwpriv ra0 set DefaultKeyID=1 - 5. iwpriv ra0 set Key1="AP's wep key" - 6. iwpriv ra0 set SSID="AP's SSID" - -c> Config STA to link with AP which is WPAPSK/TKIP(Authentication/Encryption) - 1. iwpriv ra0 set NetworkType=Infra - 2. iwpriv ra0 set AuthMode=WPAPSK - 3. iwpriv ra0 set EncrypType=TKIP - 4. iwpriv ra0 set SSID="AP's SSID" - 5. iwpriv ra0 set WPAPSK="AP's wpa-preshared key" - 6. iwpriv ra0 set SSID="AP's SSID" - -d> Config STA to link with AP which is WPAPSK/AES(Authentication/Encryption) - 1. iwpriv ra0 set NetworkType=Infra - 2. iwpriv ra0 set AuthMode=WPAPSK - 3. iwpriv ra0 set EncrypType=AES - 4. iwpriv ra0 set SSID="AP's SSID" - 5. iwpriv ra0 set WPAPSK="AP's wpa-preshared key" - 6. iwpriv ra0 set SSID="AP's SSID" - -e> Config STA to link with AP which is WPA2PSK/TKIP(Authentication/Encryption) - 1. iwpriv ra0 set NetworkType=Infra - 2. iwpriv ra0 set AuthMode=WPA2PSK - 3. iwpriv ra0 set EncrypType=TKIP - 4. iwpriv ra0 set SSID="AP's SSID" - 5. iwpriv ra0 set WPAPSK=12345678 - 6. iwpriv ra0 set SSID="AP's SSID" - -f> Config STA to create/link as adhoc mode, which is OPEN/NONE(Authentication/Encryption) - 1. iwpriv ra0 set NetworkType=Adhoc - 2. iwpriv ra0 set AuthMode=OPEN - 3. iwpriv ra0 set EncrypType=NONE - 4. iwpriv ra0 set SSID="Adhoc's SSID" - -g> Config STA to create/link as adhoc mode, which is WPANONE/TKIP(Authentication/Encryption) - 1. iwpriv ra0 set NetworkType=Adhoc - 2. iwpriv ra0 set AuthMode=WPANONE - 3. iwpriv ra0 set EncrypType=TKIP - 4. iwpriv ra0 set SSID="AP's SSID" - 5. iwpriv ra0 set WPAPSK=12345678 - 6. iwpriv ra0 set SSID="AP's SSID" - -h> Get site survey - usage: iwpriv ra0 get_site_survey - -i> Get Statistics - usage: iwpriv ra0 stat ; read statistic counter - iwpriv ra0 set ResetCounter=0 ; reset statistic counter - -j> Link with an AP which is the largest strength ; set ANY SSID (ssidLen=0) - usage: iwconfig ra0 essid "" - or - usage: iwpriv ra0 set SSID="" - -k> Config STA to link as dongle mode with STA own MAC - usage: iwpriv ra0 set EthConvertMode=dongle - -l> Config STA to link as clone mode - usage: iwpriv ra0 set EthConvertMode=clone - iwpriv ra0 set EthCloneMac="Desired MAC" ;; 00:00:00:00:00:00 means using STA own MAC - ;; FF:FF:FF:FF:FF:FF means using source MAC of first packet coming from wired device - -m> Config STA to link as hybrid(dongle+clone) mode - usage: iwpriv ra0 set EthConvertMode=hybrid - iwpriv ra0 set EthCloneMac="Desired MAC" ;; 00:00:00:00:00:00 means using STA own MAC - ;; FF:FF:FF:FF:FF:FF means using source MAC of first packet coming from wired device - -=================================================================== - -iwlist -================= -This is detailed explanation of each parameters for iwlist. - -------------------------------------------------------------------------------------------------------- -iwlist ra0 scanning ; list the results after scanning(manual rescan) - - - -======================================================================================================= - -iwconfig -================= -The following are our support in standard configuration - iwconfig - -------------------------------------------------------------------------------------------------------- -iwconfig ra0 essid {NN|on|off} ; set essid -iwconfig ra0 mode {managed|ad-hoc|...} ; set wireless mode ->> rt2860sta driver support monitor mode with linux kernel > 2.4.20. ->> Note: For using monitor mode => if mesh interface is ON, please down the mesh interface first. -iwconfig ra0 freq N.NNNN[k|M|G]] ; set frequency -iwconfig ra0 channel N ; set channel -iwconfig ra0 ap {N|off|auto} ; set AP address -iwconfig ra0 nick N ; set nickname -iwconfig ra0 rate {N|auto|fixed} ; set rate (only support legacy rate setting) -iwconfig ra0 rts {N|auto|fixed|off} ; set RTS threshold -iwconfig ra0 frag {N|auto|fixed|off} ; set Fragment threshold -iwconfig ra0 enc {NNNN-NNNN|off} ; set encryption type -iwconfig ra0 power {period N|timeout N} ; set power management modes - -*** Wireless extension usage please refer to man page of 'iwconfig', 'iwlist' and 'iwpriv'. *** diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/mainpage.dox b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/mainpage.dox deleted file mode 100644 index 21c332a027..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/mainpage.dox +++ /dev/null @@ -1,8 +0,0 @@ -/** - * @mainpage - * - * - * ## WiFi Driver Branch - * //Jedi/TRUNK/JEDI_WIFI (wifi driver main branch) - */ - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/mbss_phy.readme b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/mbss_phy.readme deleted file mode 100644 index fd89411a65..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/mbss_phy.readme +++ /dev/null @@ -1,65 +0,0 @@ -Readme for different phy mode of different BSS as below: - -1. Extend WirelessMode usage in DAT file - - EX: WirelessMode=0;9;1;9 i.e. bg, bgn, b-only, bgn, pAd->CommonCfg.PhyMode will be 9 - - EX: WirelessMode=0;0;1;0 i.e. bg, bg, b-only, bg, pAd->CommonCfg.PhyMode will be 0 - - - - -2. Add a new parameter, PhyMode, in MULTISSID_STRUCT structure - - - -3. Use pAd->ApCfg.MBSSID[apidx].PhyMode, not pAd->CommonCfg.PhyMode in APUpdateBeaconFrame() - - Use pAd->ApCfg.MBSSID[apidx].PhyMode, not pAd->CommonCfg.PhyMode in APPeerProbeReqAction() - - - -4. Use maximum capability for all BSS in RT_CfgSetWirelessMode(). - - EX: In MBSS mode, BSS0 is 11g-only, BSS1 is 11b-only, pAd->CommonCfg.PhyMode will be 11bg-mixed. - - EX: In MBSS mode, BSS0 is 11n-2.4G-only, BSS1 is also 11n-2.4G-only, pAd->CommonCfg.PhyMode will be 11n-2.4G-only, not 11bgn-mixed. - - EX: In MBSS mode, BSS0 is 11b-only, BSS1 is also 11b-only, pAd->CommonCfg.PhyMode will be 11b-only. - - EX: In MBSS mode, BSS0 is 11b-only, BSS1 is also 11bgn-mixed, pAd->CommonCfg.PhyMode will be 11bgn-mixed. - - - - So no impact for GreenAP mode. Check with K.H. - - - -5. Add two new command - - (1) iwpriv ra0 set MBSSWirelessMode=[0 ~ 11] - - Set different phy mode for different BSS. - - (2) iwpriv ra0 show mbss - - Show current phy mode for different BSS. EX: - - - - BSS Idx Phy Mode - MAX BGN Mixed - 0 BG Mixed - 1 BG Mixed - 2 BG Mixed - 3 BGN Mixed - - - -6. When ra0 use 2.4G, users set ra1 to 5G, ra0 will be same as ra1. - When ra0 use 5G, users set ra1 to 2.4G, ra0 will be same as ra1. - EX: BSS0 is 11bg-mixed, then users set BSS1 to 11a-only, ra0 will be 11a-only, not 11an-mixed. - EX: BSS0 is 11bg-mixed, then users set BSS1 to 11an-mixed, ra0 will be 11an-mixed. - - -7. Use CONFIG_AP_SUPPORT and MBSS_SUPPORT to include these codes. diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/sta_ate_iwpriv_usage.txt b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/sta_ate_iwpriv_usage.txt deleted file mode 100644 index d058e17972..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/sta_ate_iwpriv_usage.txt +++ /dev/null @@ -1,439 +0,0 @@ -=================================================================================================== -ATE Test Command Format for station driver - -****** IMPORTANT ****** -If you are not familiar with hardware, it is recommanded not to modify hardware default value. -It may damage hardware. - -=================================================================================================== -Usage: - iwpriv ra0 [act] [parameters]=[val] - - -where - -[act] [parameters] [val] constraints explaination ------ ------------- ----------------- -------------------------------- - -===================================== -1. Set ATE actions. - Value: - ATESTART - Start ATE function and stop station function. - ATESTOP - Stop ATE function and start station function. - TXCONT - Start continuous TX, for power mask. - TXCARR - Start carrier test, for frequency calibration. - TXFRAME - Transmit frame, for EVM. - RXFRAME - Continuous RX, for PER/FER. - -1.1 ATEDA - Set ATE frame header destination address. - Value: - xx:xx:xx:xx:xx:xx ; hex - -1.2 ATESA - Set ATE frame header source addr. - Value: - xx:xx:xx:xx:xx:xx ; hex - -1.3 ATEBSSID - Set ATE frame header BSSID. - Value: - xx:xx:xx:xx:xx:xx ; hex - -1.4 ATECHANNEL - Set ATE Channel, deimal. - Value: - 802.11b/g: 1 ~ 14 depends on CountryRegion setting - -1.5 ATETXPOW0 - Set ATE Tx power for Antenna 1. - Value: - 0 ~ 31 ; 2.4GHz, deimal - -7 ~15 ; 5.5GHz, deimal - -1.6 ATETXPOW1 - Set ATE Tx power for Antenna 2. - Value: - 0 ~ 31 ; 2.4GHz, decimal - -7 ~15 ; 5.5GHz, deimal - -1.7 ATETXFREQOFFSET - Set ATE RF frequency offset. - Value: - 0 ~ 63 ; unit: 2KHz, decimal - -1.8 ATETXLEN - Set ATE frame length. - Value: - 24 ~ 2312 ; decimal - -1.9 ATETXCNT - Set ATE frame Tx count. - Value: - 1 ~ ; 32-bit, decimal - -1.10 ATETXMODE (Refer to TxMode) - Set ATE Tx Mode. - Value: - 0: CCK 802.11b - 1: OFDM 802.11g - 2: HT_MIX 802.11b/g/n - 3: Green Field 802.11n - -1.11 ATETXBW (Refer to TxMode) - Set ATE Tx and Rx Bandwidth. - Value: - 0: 20MHz - 1: 40MHz - -1.12 ATETXGI (Refer to TxMode) - Set ATE Tx Guard Interval. - Value: - 0: Long - 1: Short - -1.13 ATETXMCS (Refer to TxMode) - Set ATE Tx MCS type. - Value: - 0 ~ 15 - -1.14 ATETXANT - Set ATE TX antenna. - Value: - 0: All - 1: Antenna one - 2: Antenna two - -1.15 ATERXANT - Set ATE RX antenna. - Value: - 0: All - 1: Antenna one - 2: Antenna two - 3: Antenna three - -1.16 ATERXFER - Set ATE to periodically reset and show up RxCount (per-second) and RxTotalCount. - Value: - 0: Disable counter visability - 1: Enable counter visability - -1.17 ATESHOW - Show all parameters of ATE. - Value: - 1 - -1.18 ATEHELP - List all commands of ATE. - Value: - 1 - -1.19 ResetCounter - Reset statistic counter. - Value: - 1 - -1.20 ATERRF - Read all of the RF registers. - Value: - 1 - -1.21 ATEWRF1 - Write the RF register 1. - Value: - xxxxxxxx ;32-bit, hex - -1.22 ATEWRF2 - Write the RF register 2. - Value: - xxxxxxxx ;32-bit, hex - -1.23 ATEWRF3 - Write the RF register 3. - Value: - xxxxxxxx ;32-bit, hex - -1.24 ATEWRF4 - Write the RF register 4. - Value: - xxxxxxxx ;32-bit, hex - -1.25 ATELDE2P - Overwrite all EEPROM contents - Value: - 1 - E.g. - iwpriv ra0 set ATELDE2P=1 - -1.26 ATERE2P - Display all EEPROM content. - Value: - 1 - E.g. - iwpriv ra0 set ATERE2P=1 - -=================================================================================================== -2. Examples: -========= - -2.1 Check EVM & Power - iwpriv ra0 set ATE=ATESTART - iwpriv ra0 set ATEDA=00:11:22:33:44:55 - iwpriv ra0 set ATESA=00:aa:bb:cc:dd:ee - iwpriv ra0 set ATEBSSID=00:11:22:33:44:55 - iwpriv ra0 set ATECHANNEL=1 ; set Channel - iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. - iwpriv ra0 set ATETXMCS=7 ; set MCS type. - iwpriv ra0 set ATETXBW=0 ; set Bandwidth - iwpriv ra0 set ATETXGI=0 ; set Long GI. - iwpriv ra0 set ATETXLEN=1024 ; set packet length. - iwpriv ra0 set ATETXPOW0=18 - iwpriv ra0 set ATETXPOW1=18 - iwpriv ra0 set ATETXCNT=100000 - iwpriv ra0 set ATE=TXFRAME - iwpriv ra0 set ATETXPOW0=19 - iwpriv ra0 set ATETXPOW0=20 - iwpriv ra0 set ATE=ATESTART - -2.2 Check Carrier - iwpriv ra0 set ATE=ATESTART - iwpriv ra0 set ATECHANNEL=1 ; set Channel - iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. - iwpriv ra0 set ATETXMCS=7 ; set MCS type. - iwpriv ra0 set ATETXBW=0 ; set Bandwidth - iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial) - iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame(inform BBP to change, modulation mode) - iwpriv ra0 set ATE=TXCARR ; Start Tx carrier, Measure carrier with instrument - iwpriv ra0 set ATETXPOW0=05 - iwpriv ra0 set ATETXPOW1=05 - iwpriv ra0 set ATETXFREQOFFSET=19 - iwpriv ra0 set ATE=ATESTART - -2.3 Check specturm mask - iwpriv ra0 set ATE=ATESTART - iwpriv ra0 set ATECHANNEL=1 ; set Channel - iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. - iwpriv ra0 set ATETXMCS=7 ; set MCS type. - iwpriv ra0 set ATETXBW=0 ; set Bandwidth - iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial) - iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame(inform BBP to change, modulation mode) - iwpriv ra0 set ATE=TXCONT ; Start continuous TX, Measure specturm mask with instrument - iwpriv ra0 set ATETXPOW0=5 - iwpriv ra0 set ATETXPOW1=5 - iwpriv ra0 set ATE=ATESTART - -2.4 Frequency offset tuning - iwpriv ra0 set ATE=ATESTART - iwpriv ra0 set ATECHANNEL=1 ; set Channel - iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. - iwpriv ra0 set ATETXMCS=7 ; set MCS type. - iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial) - iwpriv ra0 set ATETXFREQOFFSET=0 ; Set frequency offset 0(decimal) - iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame - iwpriv ra0 set ATE=TXCARR ; Start Tx carrier, Measure carrier frequency with instrument - iwpriv ra0 set ATETXFREQOFFSET=10 ; Dynamic turning frequency offset, 10(decimal) - iwpriv ra0 set ATETXFREQOFFSET=20 ; Dynamic turning frequency offset, 20(decimal) - iwpriv ra0 set ATE=ATESTART ; Stop, Store the tuning result to EEPROM - -2.5 Rx - iwpriv ra0 set ATE=ATESTART - iwpriv ra0 set ATECHANNEL=1 ; set Channel - iwpriv ra0 set ResetCounter=1 ; Reset statistic counter - iwpriv ra0 set ATETXFREQOFFSET=value ;To use the value(decimal) you got in tx calibration - iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. - iwpriv ra0 set ATETXMCS=7 ; set MCS type. - iwpriv ra0 set ATETXBW=0 ; set Bandwidth - iwpriv ra0 set ATE=RXFRAME ; Start Rx, - iwpriv ra0 set ATERXFER=1 ; show RxCnt and RSSI/per-antenna, Transmit test packets - iwpriv ra0 set ATE=ATESTART ; Stop - iwpriv ra0 stat ; get statistics counter - iwpriv ra0 set ATERXFER=1 - iwpriv ra0 set ATERXANT=1 - - iwpriv ra0 set ATE=ATESTART - iwpriv ra0 set ATERXANT=0 - iwpriv ra0 set ATE=RXFRAME - -2.6 Show all ate parameters - iwpriv ra0 set ATESHOW=1 - - Mode=4 - TxPower0=0 - TxPower1=0 - TxAntennaSel=0 - RxAntennaSel=0 - BBPCurrentBW=0 - GI=0 - MCS=7 - TxMode=1 - Addr1=00:11:22:aa:bb:cc - Addr2=00:11:22:aa:bb:cc - Addr3=00:11:22:aa:bb:cc - Channel=1 - TxLength=1024 - TxCount=40000 - TxRate=11 - RFFreqOffset=0 - -2.7 Online help - iwpriv ra0 set ATEHELP=1 - - ATE=ATESTART, ATESTOP, TXCONT, TXCARR, TXFRAME, RXFRAME - ATEDA - ATESA - ATEBSSID - ATECHANNEL, range:0~14(unless A band !). - ATETXPOW0, set power level of antenna 1. - ATETXPOW1, set power level of antenna 2. - ATETXANT, set TX antenna. 0: all, 1: antenna one, 2: antenna two. - ATERXANT, set RX antenna.0: all, 1: antenna one, 2: antenna two, 3: antenna three. - ATETXFREQOFFSET, set frequency offset, range 0~63. - ATETXBW, set BandWidth, 0:20MHz, 1:40MHz. - ATETXLEN, set Frame length, range 24~2312. - ATETXCNT, set how many frame going to transmit. - ATETXMCS, set MCS, reference to rate table. - ATETXMODE, set Mode 0: CCK, 1: OFDM, 2: HT-Mix, 3: GreenField, reference to rate table. - ATETXGI, set GI interval, 0: Long, 1: Short. - ATERXFER, 0: disable Rx Frame error rate. 1: enable Rx Frame error rate. - ATERRF, show all RF registers. - ATEWRF1, set RF1 register. - ATEWRF2, set RF2 register. - ATEWRF3, set RF3 register. - ATEWRF4, set RF4 register. - ATELDE2P, load EEPROM from .bin file. - ATERE2P, display all EEPROM content. - ATESHOW, display all parameters of ATE. - ATEHELP, online help. - -2.8 Display Rx Packet Count and RSSI - iwpriv ra0 set ATERXANT=0 ==> Enable All Three Rx Antennas - iwpriv ra0 set ATERXFER=1 ==> Enable Rx Frame Error Rate: RxCnt/RxTotal - iwpriv ra0 set ATE=RXFRAME ==> Start Rx - MlmePeriodicExec: Rx packet cnt = 2/4 - MlmePeriodicExec: Rx AvgRssi0=-88, AvgRssi1=-80, AvgRssi2=-91 - MlmePeriodicExec: Rx packet cnt = 2/6 - MlmePeriodicExec: Rx AvgRssi0=-86, AvgRssi1=-77, AvgRssi2=-89 - - iwpriv ra0 set ATERXANT=1 ==> Enable Three Rx Antenna-1 - iwpriv ra0 set ATERXFER=1 ==> Enable Rx Frame Error Rate: RxCnt/RxTotal - iwpriv ra0 set ATE=RXFRAME ==> Start Rx - MlmePeriodicExec: Rx packet cnt = 0/7 - MlmePeriodicExec: Rx AvgRssi=-87 - MlmePeriodicExec: Rx packet cnt = 7/14 - MlmePeriodicExec: Rx AvgRssi=-90 - - -=================================================================================================== -3. Hardware Access -================== - -===================================== -3.1 iwpriv ra0 bbp [parameters]=[Value] - Read/Write BBP registers by ID number. - BBPID - -3.1.1 Read BBP register, BBPID only, no = symbol. - BBPID: - 0 ~ xx ; decimal, 8-bit - BBPID=Value - -3.1.2 Write BBP register. - BBPID: - 0 ~ xx ; decimal, 8-bit - Value: - 00 ~FF ; hexdecimal, 8-bit - -===================================== -3.2 iwpriv ra0 mac [parameters]=[val] - Read/Write MAC registers by offset. - MAC_OFFSET - -3.2.1 Read MAC register, MAC_OFFSET only, no = symbol. - MAC_OFFSET: - 0000 ~ FFFF ; hexdecimal, 16-bit - MAC_OFFSET=Value - -3.2.2 Write MAC register. - MAC_OFFSET: - 0000 ~ FFFF ; hexdecimal, 16-bit - Value: - 0000 ~FFFF ; hexdecimal, 32-bit - -===================================== -3.3 iwpriv ra0 e2p [parameters]=[val] - Read/Write EEPROM content by address. - EEP_ADDR - -3.3.1 Read EEPROM content, EEP_ADDR only, no = symbol. - EEP_ADDR: - 00 ~ FF ; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, ) - EEP_ADDR=Value - -3.3.2 Write EEPROM content. - EEP_ADDR: - 00 ~ FF ; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, ) - Value: - 0000 ~FFFF ; hexdecimal, 16-bit - -===================================== -3.4 Example - -3.4.1 Hardware access - iwpriv ra0 bbp 0 # read BBP register 0 - iwpriv ra0 bbp 0=12 # write BBP register 0 as 0x12 - iwpriv ra0 mac 0 # read MAC register 0 - iwpriv ra0 mac 0=1234abcd # write MAC register 0 as 0x1234abcd - iwpriv ra0 e2p 0 # read E2PROM 0 - iwpriv ra0 e2p c=12ab # write E2PROM 0xc as 0x12ab - -3.4.2 Statistic counter operation - iwpriv ra0 stat # read statistic counter - iwpriv ra0 set ResetCounter=0 # reset statistic counter - - Suggestion: - 1. To turn on ATE functionality, you have to add compile flag "CONFIG_ATE" to Makefile - 2. Before doing ATE testing, please stop AP function - 3. If you want to test another ATE action, prefer to stop AP & ATE function - 4. All ATE function settings will lose efficacy after reboot. - 5. Before hardware register access, please reference hardware spec. - Note. - In ATE mode, the channel must set via "ATECHANNEL" - -=================================================================================================== -4. ated -======= -4.1 Introduction -The ated is an optional user space component for RT28xx Linux driver. -When Windows GUI starts, AP enters ATE mode (i.e.,ATESTART) immediately. -It behaves as a proxy between Windows GUI and RT28xx Linux driver when ATE process proceeds. -The ated will be killed automatically when Windows GUI is closed. -You can kill it manually, too(for example, type '$killall ated'). -RT28xx linux driver will leave ATE mode either ated is killed or Windows GUI is closed. - -4.2 Environment setup -1. Connect the platform you want to test directly with a Windows host by ether network line. -2. In the Windows host, run WinPcap_4_0.exe for the QA GUI or ./RT2880_ATE/RaUI.exe(please unrar "RT2880_ATE.rar" to get it). - -4.3 How to use ated for ATE purpose -0. First you should set both "HAS_ATE=y" and "HAS_QA_SUPPORT=y" in the file ~/Module/os/linux/config.mk and compile the driver. -1. Modify the Makefile according to our target "PLATFORM". -2. Change the path of "CROSS_COMPILE" if needed. -3. Then type 'make' command to compile the source code of the daemon. -4. After the driver interface has started up, attach both of the wireless interface and the ethernet interface to the bridge interface. -5. If you have no bridge interface, please give an IP address to the ethernet interface. - (for example : '$ated -beth0') -6. After the interfaces have entered forwarding states, manually start ated, type '$ated -bbrX -iraX'. -7. If your WLAN interface and Bridge interface is "ra0" and "br-lan" respectively, just type $ated. - (For further usage of options, type $ated -h) -8. In the Windows host, run RT28xxQA_ATE.exe or ./RT2880_ATE/RaUI.exe. -9. Select the wired network adapter, then press OK and wait for a moment. -10.If the Windows host cannot tolerate such a broadcast storm from ated, - please run ated with option -u.(for example : '$ated -ira1 -u') -11.If your target platform concerns its network security, please run RT28xxQA_unicast.exe instead of RT28xxQA_ATE.exe. - -Note : -a. The names of WLAN interface(default is "ra0") and Bridge interface(default is "br-lan") must be specified manually(for example : '$ated -bbr1 -ira2') if your WLAN interface or Bridge interface is not "ra0" or "br-lan" respectively ! -b. Please make sure no other RaUI is running before you excute ./RT2880_ATE/RaUI.exe. - - - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/wps_iwpriv_usage.txt b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/wps_iwpriv_usage.txt deleted file mode 100644 index 89d87b922d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/doc/wps_iwpriv_usage.txt +++ /dev/null @@ -1,173 +0,0 @@ -/* - * README: WPS STA as an Enrollee or Registrar -*/ - -0. Build WPS function. Please set 'HAS_WSC=y'. - -1. Enrollee Mode - -1.1) PIN mode: - -Running Scenarios (case 'a' and 'b') - -------------------------------------------------------- - a. Adding an Enrollee to AP+Registrar (EAP) - [AP+Registrar]<----EAP--->[Enrollee Client] - -------------------------------------------------------- - b. Adding an Enrollee with external Registrar (UPnP/EAP) - [External Registrar]<----UPnP--->[AP_Proxy]<---EAP--->[Enrollee Client] - -------------------------------------------------------- - Note: 'EAP' indicates to use wireless medium and 'UPnP' indicates to use - wired or wireless medium. - -(i) [Registrar] or [AP+Registrar] - Enter the Enrollee PinCode on the Registrar and start WPS on the Registrar. - Note: How to get the Enrollee PinCode? Use 'iwpriv ra0 stat' on the Enrollee. - -(ii)[RT2860 Linux WPS STA] - iwpriv ra0 wsc_conf_mode 1 ;; Enrollee - iwpriv ra0 wsc_mode 1 ;; PIN - iwpriv ra0 wsc_ap_band 0 (or 1) ;; 0: prefer 2.4G, 1: prefer 5G - iwpriv ra0 wsc_ssid "AP's SSID" - iwpriv ra0 wsc_start - -{iii) If the registration is successful, the Enrollee will be re-configured - with the new parameters, and will connect to the AP with these new parameters. - -1.2) PBC mode: - - Running Scenarios (case 'a' only) - -------------------------------------------------------- - a. Adding an Enrollee to AP+Registrar (EAP) - [AP+Registrar]<----EAP--->[Client] - -------------------------------------------------------- - -(i) [AP+Registrar] - Start PBC on the Registrar. - -{ii)[RT2860 Linux WPS STA] - iwpriv ra0 wsc_conf_mode 1 ;; Enrollee - iwpriv ra0 wsc_mode 2 ;; PBC - iwpriv ra0 wsc_ap_band 0 (or 1) ;; 0: prefer 2.4G, 1: prefer 5G - iwpriv ra0 wsc_start - -{iii) If the registration is successful, the Enrollee will be re-configured - with the new parameters, and will connect to the AP with these new parameters. - - -2. Registrar Mode - -2.1) PIN mode: - -Running Scenarios (case 'a' and 'b') - -------------------------------------------------------- - a. Configure the un-configured AP - [Unconfigured AP]<----EAP--->[Registrar] - -------------------------------------------------------- - b. Configure the configured AP - [Configured AP]<----EAP--->[Registrar] - -------------------------------------------------------- - -(i) [AP] - Start PIN on the Enrollee WPS AP. - -(ii)[RT2860 Linux WPS STA] - iwpriv ra0 wsc_conf_mode 2 ;; Registrar - iwpriv ra0 wsc_mode 1 ;; PIN - iwpriv ra0 wsc_pin xxxxxxxx ;; AP's PIN Code - iwpriv ra0 wsc_ap_band 0 (or 1) ;; 0: prefer 2.4G, 1: prefer 5G - iwpriv ra0 wsc_ssid "AP's SSID" - iwpriv ra0 wsc_start - -{iii) If the registration is successful; - in case 'a': - The Registrar will be re-configured with the new parameters, - and will connect to the AP with these new parameters; - in case 'b': - The Registrar will be re-configured with AP's configurations, - and will connect to the AP with these new parameters. - -2.2) PBC mode: - same scenarios as PIN mod - -(i) [AP] - Start PBC on the Enrollee WPS AP. - -(ii)[RT2860 Linux WPS STA] - iwpriv ra0 wsc_conf_mode 2 ;; Registrar - iwpriv ra0 wsc_mode 2 ;; PBC - iwpriv ra0 wsc_ap_band 0 (or 1) ;; 0: prefer 2.4, 1: prefer 5G - iwpriv ra0 wsc_start - -{iii) If the registration is successful; - in case 'a': - The Registrar will be re-configured with the new parameters, - and will connect to the AP with these new parameters; - in case 'b': - The Registrar will be re-configured with AP's configurations, - and will connect to the AP with these new parameters. - - -3. Others - iwpriv ra0 wsc_cred_count 1 ;; Set count of credentials, Only support one credential for M8 in Registrar mode. - integer: 1 ~ 8 - - iwpriv ra0 wsc_cred_ssid "idx ssid_str" ;; Set SSID into credtentail[idx] - string: - idx: 0 ~ 7 - ssid_str: SSID for AP - example: - iwpriv ra0 wsc_cred_ssid "0 wps_ap1" - - iwpriv ra0 wsc_cred_auth "idx auth_str" ;; Set AuthMode into credtentail[idx] - string: - idx: 0 ~ 7 - auth_str: OPEN, WPAPSK, WPA2PSK, SHARED, WPA, WPA2 - example: - iwpriv ra0 wsc_cred_auth "0 WPAPSK" - - iwpriv ra0 wsc_cred_encr "idx encr_str" ;; Set EncrypType into credtentail[idx] - string: - idx: 0 ~ 7 - encr_str: NONE, WEP, TKIP, AES - example: - iwpriv ra0 wsc_cred_encr "0 TKIP" - - iwpriv ra0 wsc_cred_keyIdx "idx key_index" ;; Set Key Index into credtentail[idx] - string: - idx: 0 ~ 7 - key_index: 1 ~ 4 - example: - iwpriv ra0 wsc_cred_keyIdx "0 1" - - iwpriv ra0 wsc_cred_key "idx key" ;; Set Key into credtentail[idx] - string: - idx: 0 ~ 7 - key: ASCII string (wep_key_len(=5,13), passphrase_len(=8~63)) - OR - Hex string (wep_key_len(=10,26), passphrase_len(=64)) - example: - iwpriv ra0 wsc_cred_key "0 12345678" ;; Passphrase - iwpriv ra0 wsc_cred_key "0 abcd" ;; WEP Key - - iwpriv ra0 wsc_cred_mac "idx mac_str" ;; Set AP's MAC into credtentail[idx] - string: - idx: 0 ~ 7 - mac_str: xx:xx:xx:xx:xx:xx - example: - iwpriv ra0 wsc_cred_mac "0 00:11:22:33:44:55" - - iwpriv ra0 wsc_conn_by_idx 0 ;; Connect AP by credential index. - integer: 0 ~ 7 - - iwpriv ra0 wsc_auto_conn 0 ;; If the registration is successful, driver will re-connect to AP or not. - integer: 0 ;; Disabled, driver won't re-connect to AP with new configurations. - 1 ;; Enabled, driver will re-connect to AP with new configurations. - Note. Default value is 1. - - iwpriv ra0 wsc_stop ;; Stop WSC work and don't wait upon two-minute timeout - iwpriv ra0 wsc_ap_band val - val: 0 ;; prefer 2.4G AP - 1 ;; prefer 5G AP - 2 ;; Auto - iwpriv ra0 stat ;; Read statistics counter and WPS status. - \ No newline at end of file diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/hdev_basic.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/hdev_basic.c deleted file mode 100644 index 9ec71ab672..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/hdev_basic.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - hdev.c -*/ -#include "rt_config.h" -#include "hdev/hdev.h" - -/*Local functions*/ -VOID HdevHwResourceInit(struct hdev_ctrl *ctrl) -{ - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - - os_zero_mem(pHwResourceCfg, sizeof(HD_RESOURCE_CFG)); - /*initial radio control*/ - RcInit(ctrl); - /*initial wmm control*/ - WcInit(ctrl, &pHwResourceCfg->WmmCtrl); - /*initial wtbl control*/ - WtcInit(ctrl); -} - -VOID HdevHwResourceExit(struct hdev_ctrl *ctrl) -{ - UCHAR i; - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - - WtcExit(ctrl); - - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) - HdevExit(ctrl, i); - - WcExit(&pHwResourceCfg->WmmCtrl); -} - -static VOID HdevHwResourceShow(HD_RESOURCE_CFG *pHwResourceCfg) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("band_num: %d\n", pHwResourceCfg->concurrent_bands)); - RcRadioShow(pHwResourceCfg); -} - -/* -* -*/ -VOID HdevObjShow(struct hdev_obj *obj) -{ - HD_REPT_ENRTY *pEntry; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("band_id\t: %d\n", obj->rdev->pRadioCtrl->BandIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("obj_id\t: %d\n", obj->Idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("omac_id\t: %d\n", obj->OmacIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wmmcap\t: %d\n", obj->bWmmAcquired)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wmm_idx\t: %d\n", obj->WmmIdx)); - DlListForEach(pEntry, &obj->RepeaterList, struct _HD_REPT_ENRTY, list) - { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\trept_id: %d, omac_id:%x\n", pEntry->CliIdx, - pEntry->ReptOmacIdx)); - } -} - -/* -* -*/ -void bw_2_str(UCHAR bw, CHAR *bw_str); -void extcha_2_str(UCHAR extcha, CHAR *ec_str); - -static VOID HdevShow(struct radio_dev *rdev) -{ - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; - UCHAR pm = pRadioCtrl->PhyMode; - UCHAR ch = pRadioCtrl->Channel; - UCHAR c1 = pRadioCtrl->CentralCh; - UCHAR bw = pRadioCtrl->Bw; - UCHAR ech = pRadioCtrl->ExtCha; - UCHAR *pstr = NULL; - CHAR str[32] = ""; - - /*for 2.4G check*/ - if (WMODE_CAP_2G(pm) && ch <= 14) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("==========2.4G band==========\n")); - pstr = wmode_2_str(pm); - - if (pstr != NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("wmode\t: %s\n", pstr)); - os_free_mem(pstr); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ch\t: %d\n", ch)); -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(pm)) { - bw_2_str(bw, str); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("bw\t: %s\n", str)); - extcha_2_str(ech, str); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("extcha\t: %s\n", str)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("cen_ch\t: %d\n", c1)); - } - -#endif /*DOT11_N_SUPPORT*/ - } else - - /*for 5G check*/ - if (WMODE_CAP_5G(pm) && ch > 14) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("==========5G band==========\n")); - pstr = wmode_2_str(pm); - - if (pstr != NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("wmode\t: %s\n", pstr)); - os_free_mem(pstr); - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ch\t: %d\n", ch)); -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(pm)) { - bw_2_str(bw, str); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("bw\t: %s\n", str)); - extcha_2_str(ech, str); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("extcha\t: %s\n", str)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("cen_ch1\t: %d\n", c1)); - } - -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(pm)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("cen ch2\t: %d\n", - pRadioCtrl->Channel2)); - -#endif /*DOT11_VHT_AC*/ -#endif /*DOT11_N_SUPPORT*/ - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("band_id\t: %d\n", pRadioCtrl->BandIdx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("obj_num\t: %d\n", rdev->DevNum)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("state\t: %d\n", pRadioCtrl->CurStat)); -} - -/* -* -*/ -static VOID HdevDel(struct radio_dev *rdev) -{ - struct hdev_obj *obj, *pTemp; - - DlListForEachSafe(obj, pTemp, &rdev->DevObjList, struct hdev_obj, list) - { - HdevObjDel(rdev, obj); - } - DlListInit(&rdev->DevObjList); -} - -/*Export function*/ -/* - * -*/ -VOID HdevObjAdd(struct radio_dev *rdev, struct hdev_obj *obj) -{ - DlListAddTail(&rdev->DevObjList, &obj->list); - obj->rdev = rdev; - DlListInit(&obj->RepeaterList); - rdev->DevNum++; - if (obj->state != HOBJ_STATE_NONE) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): obj state is not free! need to check!\n", - __func__)); - } - obj->state = HOBJ_STATE_USED; -} - -/* - * -*/ -VOID HdevObjDel(struct radio_dev *rdev, struct hdev_obj *obj) -{ - obj->state = HOBJ_STATE_NONE; - obj->rdev = NULL; - DlListDel(&obj->list); - DlListInit(&obj->RepeaterList); - rdev->DevNum--; -} - -/* -* -*/ - -INT32 HdevInit(struct hdev_ctrl *ctrl, UCHAR HdevIdx, RADIO_CTRL *pRadioCtrl) -{ - struct radio_dev *rdev = NULL; - - if (HdevIdx >= DBDC_BAND_NUM) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: HdevIdx:%d >= %d\n", __func__, HdevIdx, - DBDC_BAND_NUM)); - return 0; - } - - rdev = &ctrl->rdev[HdevIdx]; - os_zero_mem(rdev, sizeof(struct radio_dev)); - DlListInit(&rdev->DevObjList); - rdev->pRadioCtrl = pRadioCtrl; - rdev->priv = ctrl; - rdev->Idx = HdevIdx; - rdev->DevNum = 0; - return 0; -} - -/* -* -*/ - -INT32 HdevExit(struct hdev_ctrl *ctrl, UCHAR HdevIdx) -{ - struct radio_dev *rdev = NULL; - - if (HdevIdx >= DBDC_BAND_NUM) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: HdevIdx:%d >= %d\n", __func__, HdevIdx, - DBDC_BAND_NUM)); - return 0; - } - - rdev = &ctrl->rdev[HdevIdx]; - HdevDel(rdev); - os_zero_mem(rdev, sizeof(struct radio_dev)); - return 0; -} - -/* -* -*/ -VOID HdevCfgShow(struct hdev_ctrl *ctrl) -{ - UCHAR i; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - HdevHwResourceShow(pHwResource); - - for (i = 0; i < pHwResource->concurrent_bands; i++) - HdevShow(&ctrl->rdev[i]); -} - -/* -* -*/ -BOOLEAN hdev_obj_state_ready(struct hdev_obj *obj) -{ - /* basic sanity */ - if (!obj) - return FALSE; - - if (obj->state == HOBJ_STATE_USED) - return TRUE; - else - return FALSE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/omac_ctrl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/omac_ctrl.c deleted file mode 100644 index e725444154..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/omac_ctrl.c +++ /dev/null @@ -1,273 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#include "rt_config.h" -#include "hdev/hdev.h" - -/* Omac controller */ - -static INT32 GetFirstAvailableOmacIdx(struct hdev_ctrl *ctrl, BOOLEAN NeedBss, - UINT32 OmacType) -{ - UINT32 Index; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - struct _RTMP_CHIP_CAP *cap = &ctrl->chip_cap; -#if defined(MT7615) || defined(MT7622) - enum { bss_nums = 4 }; -#endif /* defined(MT7615) || defined(MT7622) */ - - if (NeedBss) { - for (Index = 0; Index < bss_nums; Index++) { - if ((pHwResource->OmacBssCtl.OmacBitMap & - (1 << Index)) == 0) { - if ((OmacType == WDEV_TYPE_APCLI) && !Index) - continue; - pHwResource->OmacBssCtl.OmacBitMap |= - (1 << Index); - return Index; - } - } - } else { - for (Index = bss_nums; Index < cap->OmacNums; Index++) { - if ((pHwResource->OmacBssCtl.OmacBitMap & - (1 << Index)) == 0) { - pHwResource->OmacBssCtl.OmacBitMap |= - (1 << Index); - return Index; - } - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: OmacIndex is not available\n", __func__)); - return -1; -} - -static INT32 GetFirstAvailableRepeaterOmacIdx(struct hdev_ctrl *ctrl) -{ - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - struct _RTMP_CHIP_CAP *cap = &ctrl->chip_cap; - UCHAR i; - - for (i = 0; i < cap->MaxRepeaterNum; i++) { - if ((pHwResource->OmacBssCtl.RepeaterBitMap & (1 << i)) == 0) { - pHwResource->OmacBssCtl.RepeaterBitMap |= (1 << i); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: found used OmacIndex:0x%x\n", __func__, - cap->RepeaterStartIdx + i)); - return cap->RepeaterStartIdx + i; - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: OmacIndex is not available\n", __func__)); - return -1; -} - -VOID ReleaseOmacIdx(struct hdev_ctrl *ctrl, UINT32 OmacType, UINT32 Idx) -{ - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - struct _RTMP_CHIP_CAP *cap = &ctrl->chip_cap; - - switch (OmacType) { - case WDEV_TYPE_AP: - if (Idx == 0) { - pHwResource->OmacBssCtl.OmacBitMap &= ~(1 << 0); - return; - } else { - pHwResource->OmacBssCtl.HwMbssBitMap &= ~(1 << (Idx)); - return; - } - - break; - - case WDEV_TYPE_STA: - case WDEV_TYPE_ADHOC: - case WDEV_TYPE_GO: - case WDEV_TYPE_GC: - case WDEV_TYPE_APCLI: - case WDEV_TYPE_P2P_DEVICE: - pHwResource->OmacBssCtl.OmacBitMap &= ~(1 << Idx); - return; - break; - - /* - Carter note, - because of WDS0~WDS3 use the same mac address as RA0, - so the OmacIdx should use ra0's. - - otherwise, if the pkt sa is ra0's but omacIdx use ra1's, - it will cause the ack from peer could not be passed at Rmac. - - and WDS OmacIdx should not be released, unless Ra0 is released. - */ - case WDEV_TYPE_WDS: - break; - - case WDEV_TYPE_MESH: - /* TODO */ - break; - - case WDEV_TYPE_REPEATER: - pHwResource->OmacBssCtl.RepeaterBitMap &= - ~(1 << (Idx - cap->RepeaterStartIdx)); - return; - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: OmacType(%d)\n", __func__, OmacType)); - break; - } - - return; -} - -INT32 GetOmacIdx(struct hdev_ctrl *ctrl, UINT32 OmacType, INT8 Idx) -{ - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - struct _RTMP_CHIP_CAP *cap = &ctrl->chip_cap; - - switch (OmacType) { - case WDEV_TYPE_AP: - if (Idx == 0) { - pHwResource->OmacBssCtl.OmacBitMap |= (1 << 0); - return 0; - } else { - pHwResource->OmacBssCtl.HwMbssBitMap |= - (1 << (Idx - 0)); - return cap->ExtMbssOmacStartIdx + Idx; - } - - break; - - case WDEV_TYPE_STA: - case WDEV_TYPE_ADHOC: - case WDEV_TYPE_GO: - case WDEV_TYPE_GC: - case WDEV_TYPE_APCLI: - return GetFirstAvailableOmacIdx(ctrl, TRUE, OmacType); - break; - - /* - Carter note, - because of WDS0~WDS3 use the same mac address as RA0, - so the OmacIdx should use ra0's. - - otherwise, if the pkt sa is ra0's but omacIdx use ra1's, - it will cause the ack from peer could not be passed at Rmac. - */ - case WDEV_TYPE_WDS: - return 0; - break; - - case WDEV_TYPE_MESH: - /* TODO */ - break; - - case WDEV_TYPE_REPEATER: - return GetFirstAvailableRepeaterOmacIdx(ctrl); - break; - - case WDEV_TYPE_P2P_DEVICE: - return GetFirstAvailableOmacIdx(ctrl, FALSE, OmacType); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: OmacType(%d)\n", __func__, OmacType)); - break; - } - - return -1; -} - -/* -* -*/ -INT32 OcAddRepeaterEntry(struct hdev_obj *obj, UCHAR ReptIdx) -{ - INT32 ret = 0; - HD_REPT_ENRTY *pReptEntry = NULL; - struct radio_dev *rdev = obj->rdev; - struct hdev_ctrl *ctrl = rdev->priv; - - ret = os_alloc_mem(NULL, (UCHAR **)&pReptEntry, sizeof(HD_REPT_ENRTY)); - - if (ret != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, DBG_LVL_ERROR, - (" Alloc memory for HD_REPT_ENRTY failed.\n")); - return ret; - } - - OS_SPIN_LOCK(&obj->RefCntLock); - obj->RefCnt++; - OS_SPIN_UNLOCK(&obj->RefCntLock); - pReptEntry->CliIdx = ReptIdx; - pReptEntry->ReptOmacIdx = GetOmacIdx(ctrl, WDEV_TYPE_REPEATER, ReptIdx); - DlListAddTail(&obj->RepeaterList, &pReptEntry->list); - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -VOID OcDelRepeaterEntry(struct hdev_obj *obj, UCHAR ReptIdx) -{ - HD_REPT_ENRTY *pReptEntry = NULL, *tmp = NULL; - struct radio_dev *rdev = obj->rdev; - struct hdev_ctrl *ctrl = rdev->priv; - - DlListForEachSafe(pReptEntry, tmp, &obj->RepeaterList, - struct _HD_REPT_ENRTY, list) - { - if (pReptEntry->CliIdx == ReptIdx) { - OS_SPIN_LOCK(&obj->RefCntLock); - - if (obj->RefCnt > 0) - obj->RefCnt--; - else { - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_ERROR, - ("%s, bug here? RefCnt zero already.\n", - __func__)); - } - - OS_SPIN_UNLOCK(&obj->RefCntLock); - ReleaseOmacIdx(ctrl, WDEV_TYPE_REPEATER, - pReptEntry->ReptOmacIdx); - DlListDel(&pReptEntry->list); - os_free_mem(pReptEntry); - } - } -} - -HD_REPT_ENRTY *OcGetRepeaterEntry(struct hdev_obj *obj, UCHAR ReptIdx) -{ - HD_REPT_ENRTY *pReptEntry = NULL; - - DlListForEach(pReptEntry, &obj->RepeaterList, struct _HD_REPT_ENRTY, - list) - { - if (pReptEntry->CliIdx == ReptIdx) - return pReptEntry; - } - return NULL; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/radio_ctrl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/radio_ctrl.c deleted file mode 100644 index 66d34f6ac4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/radio_ctrl.c +++ /dev/null @@ -1,1107 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#include "rt_config.h" -#include "hdev/hdev.h" - -/*Radio controller*/ - -/* - * -*/ - -/*Local functions*/ -static UCHAR rcGetRfByIdx(struct hdev_ctrl *ctrl, UCHAR DbdcMode, UCHAR BandIdx) -{ - /* TODO: Should remove when antenna move to rdev */ -#ifdef DBDC_MODE - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ctrl->priv; - - if (ctrl->chip_ops.BandGetByIdx && DbdcMode) - return ctrl->chip_ops.BandGetByIdx(pAd, BandIdx); - else - return RFIC_DUAL_BAND; - -#endif /*DBDC_MODE*/ - return RFIC_DUAL_BAND; -} - -/*Get RfIC Band from EEPORM content*/ -static UINT8 rcGetBandSupport(struct hdev_ctrl *ctrl, UCHAR DbdcMode, - UCHAR BandIdx) -{ - /* TODO: Should remove when antenna move to rdev */ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ctrl->priv; - - if (BOARD_IS_5G_ONLY(pAd)) - return RFIC_5GHZ; - else if (BOARD_IS_2G_ONLY(pAd)) - return RFIC_24GHZ; - else if (RFIC_IS_5G_BAND(pAd)) - return rcGetRfByIdx(ctrl, DbdcMode, BandIdx); - else - return RFIC_24GHZ; -} - -static UCHAR rcGetDefaultChannel(UCHAR PhyMode) -{ - /*priority must the same as Default PhyMode*/ - if (WMODE_CAP_2G(PhyMode)) - return 1; - else if (WMODE_CAP_5G(PhyMode)) - return 36; - - return 0; -} - -static UCHAR rcGetDefaultPhyMode(UCHAR Channel) -{ - /*priority must the same as Default Channel*/ - if (Channel <= 14) - return WMODE_B; - else - return WMODE_A; -} - -static struct radio_dev *rcGetHdevByRf(struct hdev_ctrl *ctrl, UCHAR RfType) -{ - INT i; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - RADIO_CTRL *radio_ctrl = NULL; - /*get hdev by phymode first*/ - for (i = 0; i < pHwResource->concurrent_bands; i++) { - radio_ctrl = &pHwResource->PhyCtrl[i].RadioCtrl; - if (wmode_2_rfic(radio_ctrl->PhyMode) & RfType) - return &ctrl->rdev[i]; - } - /*get hdev by cap*/ - for (i = 0; i < pHwResource->concurrent_bands; i++) { - if (pHwResource->PhyCtrl[i].rf_band_cap & RfType) - return &ctrl->rdev[i]; - } - return NULL; -} - -static BOOLEAN rcCheckIsTheSameBand(UCHAR PhyMode, UCHAR Channel) -{ - if (WMODE_CAP_5G(PhyMode) && WMODE_CAP_2G(PhyMode)) - return TRUE; - else if (WMODE_CAP_5G(PhyMode) && Channel > 14) - return TRUE; - else if (WMODE_CAP_2G(PhyMode) && Channel <= 14) - return TRUE; - - return FALSE; -} - -#ifdef DBDC_MODE -static RADIO_CTRL *rcGetRadioCtrlByRf(struct hdev_ctrl *ctrl, UCHAR RfType) -{ - INT i; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - for (i = 0; i < pHwResource->concurrent_bands; i++) { - if (RfType & pHwResource->PhyCtrl[i].rf_band_cap) - return &pHwResource->PhyCtrl[i].RadioCtrl; - } - - return NULL; -} - -static VOID rcFillEntry(BCTRL_ENTRY_T *pEntry, UINT8 Type, UINT8 BandIdx, - UINT8 Index) -{ - pEntry->Type = Type; - pEntry->BandIdx = BandIdx; - pEntry->Index = Index; -} - -static INT32 rcUpdateBandForMBSS(struct hdev_obj *obj, BCTRL_ENTRY_T *pEntry) -{ - struct radio_dev *rdev = obj->rdev; - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; - UCHAR MbssIdx; - struct hdev_ctrl *ctrl = rdev->priv; - - if (obj->OmacIdx == 0) - rcFillEntry(pEntry, DBDC_TYPE_BSS, pRadioCtrl->BandIdx, 0); - else { - /*ctrl->chipCap.ExtMbssOmacStartIdx+1 since 0x10 will control by 0x10*/ - MbssIdx = - obj->OmacIdx - (ctrl->chip_cap.ExtMbssOmacStartIdx + 1); - rcFillEntry(pEntry, DBDC_TYPE_MBSS, pRadioCtrl->BandIdx, - MbssIdx); - } - - return 0; -} - -static INT32 rcUpdateBandForBSS(struct hdev_obj *obj, BCTRL_ENTRY_T *pEntry) -{ - struct radio_dev *rdev = obj->rdev; - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; - - rcFillEntry(pEntry, DBDC_TYPE_BSS, pRadioCtrl->BandIdx, obj->OmacIdx); - return 0; -} - -static INT32 rcUpdateBandByType(struct hdev_obj *obj, BCTRL_ENTRY_T *pEntry) -{ - switch (obj->Type) { - case WDEV_TYPE_AP: { - rcUpdateBandForMBSS(obj, pEntry); - } break; - - case WDEV_TYPE_STA: - case WDEV_TYPE_ADHOC: - case WDEV_TYPE_GO: - case WDEV_TYPE_GC: - case WDEV_TYPE_APCLI: { - rcUpdateBandForBSS(obj, pEntry); - } break; - - case WDEV_TYPE_WDS: - case WDEV_TYPE_MESH: - default: { - /* TODO: STAR for DBDC */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): Current not support this type of WdevType=%d\n", - __func__, obj->Type)); - return -1; - } break; - } - - return 0; -} - -/*Must call after update ownmac*/ -static INT32 rcUpdateBandForBFMU(struct hdev_ctrl *ctrl, BCTRL_INFO_T *pBInfo) -{ - struct radio_dev *rdev; - RADIO_CTRL *pRadioCtrl = NULL; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - BCTRL_ENTRY_T *pEntry = NULL; - UINT32 i; -#ifdef TXBF_SUPPORT - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ctrl->priv; -#endif /*TXBF_SUPPORT*/ - - /*first choice 5G as the BF/MU band*/ - rdev = rcGetHdevByRf(ctrl, RFIC_5GHZ); - - /*else 2.4G*/ - if (!rdev || (rdev->DevNum == 0)) - rdev = rcGetHdevByRf(ctrl, RFIC_24GHZ); - - /*If MU is not enable & 5G not support , else select first dev as bf band*/ - if (!rdev) - rdev = &ctrl->rdev[0]; - - pRadioCtrl = rdev->pRadioCtrl; - - /*If get phyCtrl, set bf to this band*/ - if (pRadioCtrl == NULL) - return -1; - - /*support MU & enable MU, BF & MU should be 5G only*/ - pEntry = &pBInfo->BctrlEntries[pBInfo->TotalNum]; - rcFillEntry(pEntry, DBDC_TYPE_MU, pRadioCtrl->BandIdx, 0); - pBInfo->TotalNum++; - - for (i = 0; i < 3; i++) { - pEntry = &pBInfo->BctrlEntries[pBInfo->TotalNum]; - rcFillEntry(pEntry, DBDC_TYPE_BF, pRadioCtrl->BandIdx, i); - pBInfo->TotalNum++; - } - - pRadioCtrl->IsBfBand = TRUE; - - for (i = 0; i < pHwResource->concurrent_bands; i++) { - if (pHwResource->PhyCtrl[i].RadioCtrl.IsBfBand && - (pHwResource->PhyCtrl[i].RadioCtrl.BandIdx != - pRadioCtrl->BandIdx)) - pHwResource->PhyCtrl[i].RadioCtrl.IsBfBand = FALSE; - } - - for (i = 0; i < pHwResource->concurrent_bands; i++) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s PhyCtrl[%d].RadioCtrl.IsBfBand = %d\n", - __func__, i, - pHwResource->PhyCtrl[i].RadioCtrl.IsBfBand)); - } -#ifdef TXBF_SUPPORT - TxBfModuleEnCtrl(pAd); -#endif /*TXBF_SUPPORT*/ - return 0; -} - -static INT32 rcUpdateBandForRepeater(struct hdev_ctrl *ctrl, - BCTRL_INFO_T *pBInfo) -{ - INT32 i; - BCTRL_ENTRY_T *pEntry; - struct radio_dev *rdev; - struct hdev_obj *obj; - HD_REPT_ENRTY *pReptEntry = NULL, *tmp = NULL; - - if (ctrl->HwResourceCfg.concurrent_bands == 2) { /* DBDC mode */ - for (i = 0; i < ctrl->HwResourceCfg.concurrent_bands; i++) { - /* search repeater entry from all obj */ - rdev = &ctrl->rdev[i]; - DlListForEach(obj, &rdev->DevObjList, struct hdev_obj, - list) - { - DlListForEachSafe(pReptEntry, tmp, - &obj->RepeaterList, - struct _HD_REPT_ENRTY, list) - { - pEntry = &pBInfo->BctrlEntries - [pBInfo->TotalNum]; - rcFillEntry(pEntry, DBDC_TYPE_REPEATER, - rdev->pRadioCtrl->BandIdx, - pReptEntry->CliIdx); - pBInfo->TotalNum++; - } - } - } - } else { - for (i = 0; i < ctrl->chip_cap.MaxRepeaterNum; i++) { - pEntry = &pBInfo->BctrlEntries[pBInfo->TotalNum]; - /*always bind band 0*/ - rcFillEntry(pEntry, DBDC_TYPE_REPEATER, 0, i); - pBInfo->TotalNum++; - } - } - - return 0; -} - -static INT32 rcUpdateBandForWMM(struct hdev_ctrl *ctrl, BCTRL_INFO_T *pBInfo) -{ - INT32 i, WmmNum = WcGetWmmNum(ctrl); - EDCA_PARM *pEdca = NULL; - BCTRL_ENTRY_T *pEntry; - - for (i = 0; i < WmmNum; i++) { - pEdca = WcGetWmmByIdx(ctrl, i); - - if (!pEdca->bValid) - continue; - - pEntry = &pBInfo->BctrlEntries[pBInfo->TotalNum]; - rcFillEntry(pEntry, DBDC_TYPE_WMM, pEdca->BandIdx, i); - pBInfo->TotalNum++; - } - - return 0; -} - -static INT32 rcUpdateBandForMGMT(struct hdev_ctrl *ctrl, BCTRL_INFO_T *pBInfo) -{ - INT32 i; - BCTRL_ENTRY_T *pEntry; - - for (i = 0; i < 2; i++) { - pEntry = &pBInfo->BctrlEntries[pBInfo->TotalNum]; - rcFillEntry(pEntry, DBDC_TYPE_MGMT, i, i); - pBInfo->TotalNum++; - } - - return 0; -} - -static INT32 rcUpdateBandForPTA(struct hdev_ctrl *ctrl, BCTRL_INFO_T *pBInfo) -{ - BCTRL_ENTRY_T *pEntry; - RADIO_CTRL *pRadioCtrl; - - pEntry = &pBInfo->BctrlEntries[pBInfo->TotalNum]; - /*fix to bind band 0 for 2.4G band*/ - pRadioCtrl = rcGetRadioCtrlByRf(ctrl, RFIC_24GHZ); - - if (pRadioCtrl != NULL) - rcFillEntry(pEntry, DBDC_TYPE_PTA, pRadioCtrl->BandIdx, 0); - else - rcFillEntry(pEntry, DBDC_TYPE_PTA, 0, 0); - - pBInfo->TotalNum++; - return 0; -} - -static INT32 rcUpdateBandForOwnMac(struct hdev_ctrl *ctrl, BCTRL_INFO_T *pBInfo) -{ - INT32 i, ret = 0; - struct hdev_obj *obj; - struct radio_dev *rdev; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - BCTRL_ENTRY_T *pEntry = NULL; - - for (i = 0; i < pHwResource->concurrent_bands; i++) { - rdev = &ctrl->rdev[i]; - DlListForEach(obj, &rdev->DevObjList, struct hdev_obj, list) - { - pEntry = &pBInfo->BctrlEntries[pBInfo->TotalNum]; - rcUpdateBandByType(obj, pEntry); - pBInfo->TotalNum++; - } - } - - return ret; -} -#endif /*DBDC_MODE*/ - -/*Export functions*/ -/* -* -*/ -INT32 RcUpdateBandCtrl(struct hdev_ctrl *ctrl) -{ -#ifdef DBDC_MODE - INT32 ret = 0; - BCTRL_INFO_T BctrlInfo; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ctrl->priv; - - os_zero_mem(&BctrlInfo, sizeof(BCTRL_INFO_T)); - BctrlInfo.DBDCEnable = pAd->CommonCfg.dbdc_mode; - - /*if enable dbdc, run band selection algorithm*/ - if (IS_CAP_DBDC(ctrl->chip_cap) && BctrlInfo.DBDCEnable) { - /*Since phyctrl need to update */ - rcUpdateBandForOwnMac(ctrl, &BctrlInfo); - rcUpdateBandForBFMU(ctrl, &BctrlInfo); - rcUpdateBandForWMM(ctrl, &BctrlInfo); - rcUpdateBandForMGMT(ctrl, &BctrlInfo); - rcUpdateBandForPTA(ctrl, &BctrlInfo); - rcUpdateBandForRepeater(ctrl, &BctrlInfo); - /*Since will add one more time, must minus 1*/ - BctrlInfo.TotalNum = (BctrlInfo.TotalNum - 1); - - if (BctrlInfo.TotalNum > MAX_BCTRL_ENTRY) - BctrlInfo.TotalNum = MAX_BCTRL_ENTRY; - } - - ret = AsicSetDbdcCtrl(pAd, &BctrlInfo); - - if (ret != NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Error for conifgure dbdc, ret = %d !\n", - __func__, ret)); - -#endif /*DBDC_MODE*/ - return 0; -} - -/* -* -*/ -INT32 RcUpdateRepeaterEntry(struct radio_dev *rdev, UINT32 ReptIdx) -{ - INT32 ret = 0; -#ifdef DBDC_MODE - BCTRL_ENTRY_T *pEntry; - BCTRL_INFO_T BandInfoValue; - struct hdev_ctrl *ctrl = rdev->priv; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ctrl->priv; - - if (IS_CAP_DBDC(ctrl->chip_cap) && pAd->CommonCfg.dbdc_mode) { - os_zero_mem(&BandInfoValue, sizeof(BCTRL_INFO_T)); - BandInfoValue.DBDCEnable = pAd->CommonCfg.dbdc_mode; - pEntry = &BandInfoValue.BctrlEntries[0]; - /*fix to bind band 0 currently*/ - rcFillEntry(pEntry, DBDC_TYPE_REPEATER, - rdev->pRadioCtrl->BandIdx, ReptIdx); - BandInfoValue.TotalNum++; - ret = AsicSetDbdcCtrl(pAd, &BandInfoValue); - - if (ret != NDIS_STATUS_SUCCESS) - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Error for conifgure dbdc, ret = %d !\n", - __func__, ret)); - } - -#endif /*DBDC_MODE*/ - return ret; -} - -/* -* -*/ -INT32 RcUpdateWmmEntry(struct radio_dev *rdev, struct hdev_obj *obj, - UINT32 WmmIdx) -{ - INT32 ret = 0; -#ifdef DBDC_MODE - BCTRL_ENTRY_T *pEntry; - BCTRL_INFO_T BandInfoValue; - struct hdev_ctrl *ctrl = rdev->priv; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ctrl->priv; - - if (obj && IS_CAP_DBDC(ctrl->chip_cap) && pAd->CommonCfg.dbdc_mode) { - os_zero_mem(&BandInfoValue, sizeof(BCTRL_INFO_T)); - BandInfoValue.DBDCEnable = pAd->CommonCfg.dbdc_mode; - pEntry = &BandInfoValue.BctrlEntries[0]; - /*fix to bind band 0 currently*/ - obj->WmmIdx = WmmIdx; - rcFillEntry(pEntry, DBDC_TYPE_WMM, rdev->pRadioCtrl->BandIdx, - WmmIdx); - BandInfoValue.TotalNum++; - ret = AsicSetDbdcCtrl(pAd, &BandInfoValue); - - if (ret != NDIS_STATUS_SUCCESS) - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Error for conifgure dbdc, ret = %d !\n", - __func__, ret)); - } - -#endif /*DBDC_MODE*/ - return ret; -} - -/* -* Used for DATA path can get -*/ -/* -* -*/ -UINT32 RcGetMgmtQueueIdx(struct hdev_obj *obj, enum PACKET_TYPE pkt_type) -{ - struct radio_dev *rdev = obj->rdev; - - if (pkt_type == TX_ALTX) { - if (rdev->pRadioCtrl && rdev->pRadioCtrl->BandIdx) - return TxQ_IDX_ALTX1; - - return TxQ_IDX_ALTX0; - } else { - return dmac_wmm_swq_2_hw_ac_que[obj->WmmIdx][QID_AC_BE]; - } -} - -/* -* -*/ -UINT32 RcGetBcnQueueIdx(struct hdev_obj *obj) -{ -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - struct radio_dev *rdev = obj->rdev; - - if (rdev->pRadioCtrl->BandIdx) - return TxQ_IDX_BCN1; - - return TxQ_IDX_BCN0; -#else - return Q_IDX_BCN; -#endif -} - -/* -* -*/ -UINT32 RcGetTxRingIdx(struct hdev_obj *obj) -{ - struct radio_dev *rdev = obj->rdev; - - if (rdev->pRadioCtrl && rdev->pRadioCtrl->BandIdx) - return 1; - - return 0; -} - -/* -* -*/ -UINT32 RcGetWmmIdx(struct hdev_obj *obj) -{ - struct radio_dev *rdev = obj->rdev; - - if (rdev->pRadioCtrl) - return obj->WmmIdx; - - return 0; -} -UINT32 MAPRcGetBandIdxByChannelCheck(struct hdev_ctrl *ctrl, UCHAR Channel) -{ -#ifdef DBDC_MODE - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ctrl->priv; - - /*not enable dbdc mode band should always in band0*/ - if (!pAd->CommonCfg.dbdc_mode) - return 0; - - /*enable dbdc mode, chose bandIdx from channel*/ - if (Channel > 14) - return BAND1; - else - return BAND0; -#endif /*DBDC_MODE*/ - return 0; -} - -/* -* -*/ -UINT32 RcGetBandIdxByChannel(struct hdev_ctrl *ctrl, UCHAR Channel) -{ -#ifdef DBDC_MODE - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ctrl->priv; - RADIO_CTRL *pRadioCtrl = NULL; - - /*not enable dbdc mode band should always in band0*/ - if (!pAd->CommonCfg.dbdc_mode) - return 0; - - /*enable dbdc mode, chose bandIdx from channel*/ - if (Channel > 14) - pRadioCtrl = rcGetRadioCtrlByRf(ctrl, RFIC_5GHZ); - else - pRadioCtrl = rcGetRadioCtrlByRf(ctrl, RFIC_24GHZ); - - if (pRadioCtrl) - return pRadioCtrl->BandIdx; - -#endif /*DBDC_MODE*/ - return 0; -} - -/* -* -*/ -VOID RcRadioInit(struct hdev_ctrl *ctrl, UCHAR RfIC, UCHAR DbdcMode) -{ - RADIO_CTRL *pRadioCtrl = NULL; - RTMP_PHY_CTRL *pPhyCtrl = NULL; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - UCHAR i; - - if (IS_CAP_DBDC(ctrl->chip_cap) && DbdcMode) - pHwResource->concurrent_bands = 2; - else - pHwResource->concurrent_bands = 1; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): DbdcMode=%d, ConcurrentBand=%d\n", __func__, DbdcMode, - pHwResource->concurrent_bands)); - - /*Allocate PhyCtrl for HwResource*/ - for (i = 0; i < pHwResource->concurrent_bands; i++) { - pPhyCtrl = &pHwResource->PhyCtrl[i]; - pRadioCtrl = &pPhyCtrl->RadioCtrl; - os_zero_mem(pRadioCtrl, sizeof(*pRadioCtrl)); - pPhyCtrl->rf_band_cap = rcGetBandSupport(ctrl, DbdcMode, i); - pRadioCtrl->BandIdx = i; - pRadioCtrl->ExtCha = EXTCHA_NOASSIGN; - - if ((pPhyCtrl->rf_band_cap) & RFIC_24GHZ) - pRadioCtrl->Channel = rcGetDefaultChannel(WMODE_B); - else - pRadioCtrl->Channel = rcGetDefaultChannel(WMODE_A); - - pRadioCtrl->PhyMode = rcGetDefaultPhyMode(pRadioCtrl->Channel); - pRadioCtrl->CurStat = PHY_IDLE; - /*if only one band, band to band 0*/ -#ifdef TXBF_SUPPORT - - if (pHwResource->concurrent_bands == 1) - pRadioCtrl->IsBfBand = 1; - -#endif /*TXBF_SUPPORT*/ -#ifdef GREENAP_SUPPORT - pRadioCtrl->bGreenAPActive = FALSE; -#endif /* GREENAP_SUPPORT */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): pRadioCtrl=%p,Band=%d,rfcap=%d,channel=%d,PhyMode=%d extCha=0x%x\n", - __func__, pRadioCtrl, i, pPhyCtrl->rf_band_cap, - pRadioCtrl->Channel, pRadioCtrl->PhyMode, - pRadioCtrl->ExtCha)); - HdevInit(ctrl, i, pRadioCtrl); - } - - RcUpdateBandCtrl(ctrl); -} - -/* -* -*/ -VOID RcReleaseBandForObj(struct hdev_ctrl *ctrl, struct hdev_obj *obj) -{ - struct radio_dev *rdev = NULL; - - if (!obj) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():can't find obj\n", __func__)); - return; - } - - ReleaseOmacIdx(ctrl, obj->Type, obj->OmacIdx); - rdev = obj->rdev; - - if (rdev) { - if (obj->bWmmAcquired) - WcReleaseEdca(obj); - - HdevObjDel(rdev, obj); - NdisFreeSpinLock(&obj->RefCntLock); - } - - return; -} - -/* -* Refine when OmacIdx is ready -*/ -struct radio_dev *RcAcquiredBandForObj(struct hdev_ctrl *ctrl, - struct hdev_obj *obj, UCHAR obj_idx, - UCHAR PhyMode, UCHAR Channel, - UCHAR ObjType) -{ - struct radio_dev *rdev = NULL; - UCHAR is_default = 0; - RADIO_CTRL *pRadioCtrl = NULL; - - /*Release first*/ - if (obj->state == HOBJ_STATE_USED) - RcReleaseBandForObj(ctrl, obj); - - rdev = RcGetHdevByPhyMode(ctrl, PhyMode, Channel); - - /*can't get hdev by phymode, use default band*/ - if (!rdev) { - rdev = &ctrl->rdev[0]; - if (WMODE_CAP_5G(PhyMode)) { - printk("[%s] rdev received NULL in 5G mode\n", - __func__); - } - is_default = 1; - } - - /*update phy mode for radio control*/ - pRadioCtrl = rdev->pRadioCtrl; - /*Can get rdev. change phyCtrl to INUSED state*/ - if (pRadioCtrl->CurStat == PHY_IDLE) - pRadioCtrl->CurStat = PHY_INUSE; - /*if mixed mode*/ - if ((ObjType == WDEV_TYPE_STA) && - (!WMODE_5G_ONLY(PhyMode) || !WMODE_2G_ONLY(PhyMode))) { - pRadioCtrl->PhyMode = PhyMode; - } else if (!is_default) { - /*Make phymode of band should be the maxize*/ - if (wmode_band_equal(pRadioCtrl->PhyMode, PhyMode)) - pRadioCtrl->PhyMode |= PhyMode; - else - pRadioCtrl->PhyMode = PhyMode; - } - /*update hdev_obj information*/ - obj->Idx = obj_idx; - obj->Type = ObjType; - obj->OmacIdx = GetOmacIdx(ctrl, ObjType, obj_idx); - HdevObjAdd(rdev, obj); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): BandIdx:%d, PhyMode=%d,Channel=%d,rdev=%p,pHdevObj=%p\n", - __func__, pRadioCtrl->BandIdx, pRadioCtrl->PhyMode, - pRadioCtrl->Channel, rdev, obj)); - RcUpdateBandCtrl(ctrl); - NdisAllocateSpinLock(NULL, &obj->RefCntLock); - return rdev; -} - -/* -* -*/ -struct radio_dev *RcGetHdevByChannel(struct hdev_ctrl *ctrl, UCHAR Channel) -{ - struct radio_dev *rdev = NULL; - UCHAR i = 0; - - for (i = 0; i < ctrl->HwResourceCfg.concurrent_bands; i++) { - rdev = &ctrl->rdev[i]; - if (rdev != NULL && rdev->pRadioCtrl->Channel == Channel) { - return rdev; - } - } - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Err! Update PhyMode failed, no phyctrl support this channel=%d!\n", - __func__, Channel)); - return NULL; -} - -/* -* Get rdev by PhyMode & Channel, can't find pHdev may rdev is full -*/ -struct radio_dev *RcGetHdevByPhyMode(struct hdev_ctrl *ctrl, UCHAR PhyMode, - UCHAR channel) -{ - UCHAR i; - struct radio_dev *rdev = NULL; - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - RTMP_PHY_CTRL *pPhyCtrl = NULL; - CHAR *str; - CHANNEL_CTRL *pChCtrl = NULL; - - /*check == first*/ - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) { - pPhyCtrl = &pHwResourceCfg->PhyCtrl[i]; - - if (WMODE_CAP_2G(PhyMode) && - (pPhyCtrl->rf_band_cap == RFIC_24GHZ)) - rdev = &ctrl->rdev[i]; - else if (WMODE_CAP_5G(PhyMode) && - (pPhyCtrl->rf_band_cap == RFIC_5GHZ)) - rdev = &ctrl->rdev[i]; - - if (rdev) { - pChCtrl = hc_get_channel_ctrl( - ctrl, rdev->pRadioCtrl->BandIdx); - /* if ACS Enabled channel is 0 initially */ - if (channel) { - if ((rdev->DevNum == 0) || - (rdev->pRadioCtrl->Channel == channel) || - MTChGrpChannelChk(pChCtrl, channel)) - break; - } else { - printk("[%s] channel 0 fix for rdev fetching\n", - __func__); - break; - } - } - rdev = NULL; - } - - if (rdev) - return rdev; - - /*check & case*/ - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) { - pPhyCtrl = &pHwResourceCfg->PhyCtrl[i]; - - if (WMODE_CAP_2G(PhyMode) && - (pPhyCtrl->rf_band_cap & RFIC_24GHZ)) - rdev = &ctrl->rdev[i]; - else if (WMODE_CAP_5G(PhyMode) && - (pPhyCtrl->rf_band_cap & RFIC_5GHZ)) - rdev = &ctrl->rdev[i]; - if (channel) { - if (rdev && ((rdev->DevNum == 0) || - (rdev->pRadioCtrl->Channel == channel))) { - break; - } - } else { - if (rdev) { - printk("[%s]-- channel 0 fix for rdev fetching\n", - __func__); - break; - } - } - } - - if (!rdev) { - str = wmode_2_str(PhyMode); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Err! chip not support this PhyMode:%s !\n", - __func__, str)); - if (str) - os_free_mem(str); - } - - return rdev; -} - -/* -* -*/ -INT32 RcUpdateChannel(struct radio_dev *rdev, UCHAR Channel, BOOLEAN scan) -{ - INT32 ret = 0; - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; -#ifdef TR181_SUPPORT - if ((pRadioCtrl->Channel != Channel) && (scan == 0)) { - ULONG CurJiffies; - - NdisGetSystemUpTime(&CurJiffies); - pRadioCtrl->CurChannelUpTime = jiffies_to_usecs(CurJiffies); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:orig_chan=%d, new_chan=%d, CurChanUpTime=%u\n", - __func__, pRadioCtrl->Channel, Channel, - pRadioCtrl->CurChannelUpTime)); - } -#endif - pRadioCtrl->Channel = Channel; - pRadioCtrl->scan_state = scan; - return ret; -} - -/* -* -*/ -INT32 RcUpdateRadio(struct radio_dev *rdev, UCHAR bw, UCHAR central_ch1, - UCHAR control_ch2, UCHAR ext_cha) -{ - INT32 ret = 0; - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; - - pRadioCtrl->CentralCh = central_ch1; - pRadioCtrl->Bw = bw; - pRadioCtrl->Channel2 = control_ch2; - pRadioCtrl->ExtCha = ext_cha; - return ret; -} - -/* -* -*/ -INT32 RcUpdatePhyMode(struct radio_dev *rdev, UCHAR PhyMode) -{ - INT32 ret = 0; - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; - /*band is not changed or not*/ - if (rcCheckIsTheSameBand(PhyMode, pRadioCtrl->Channel)) { - pRadioCtrl->PhyMode |= PhyMode; - return ret; - } - - /*band is changed*/ - pRadioCtrl->PhyMode = PhyMode; - pRadioCtrl->Channel = rcGetDefaultChannel(PhyMode); - RcUpdateBandCtrl(rdev->priv); - return -1; -} - -/* -* -*/ -UCHAR RcUpdateBw(struct radio_dev *rdev, UCHAR Bw) -{ - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; - - /*Legacy mode, only can support BW20*/ - if (!WMODE_CAP_N(pRadioCtrl->PhyMode) && Bw > BW_20) - pRadioCtrl->Bw = BW_20; - else if (!WMODE_CAP_AC(pRadioCtrl->PhyMode) && Bw > BW_40) - pRadioCtrl->Bw = BW_40; - else - pRadioCtrl->Bw = Bw; - - return Bw; -} - -/* -* -*/ -INT32 RcUpdateExtCha(struct radio_dev *rdev, UCHAR ExtCha) -{ - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; - - pRadioCtrl->ExtCha = ExtCha; - return -1; -} - -/* -* -*/ -UCHAR RcGetExtCha(struct radio_dev *rdev) -{ - RADIO_CTRL *pRadioCtrl = rdev->pRadioCtrl; - - return pRadioCtrl->ExtCha; -} - -/* -* -*/ -UCHAR RcGetPhyMode(struct radio_dev *rdev) -{ - return rdev->pRadioCtrl->PhyMode; -} - -/* -* -*/ -UCHAR RcGetChannel(struct radio_dev *rdev) -{ - return rdev->pRadioCtrl->Channel; -} - -/* -* -*/ -UCHAR RcGetCentralCh(struct radio_dev *rdev) -{ - return rdev->pRadioCtrl->CentralCh; -} - -/* -* -*/ -UCHAR RcGetBandIdx(struct radio_dev *rdev) -{ - if (rdev && rdev->pRadioCtrl) - return rdev->pRadioCtrl->BandIdx; - else - return 0; -} - -/* -* -*/ -PHY_STATUS RcGetRadioCurStat(struct radio_dev *rdev) -{ - return rdev->pRadioCtrl->CurStat; -} - -/* -* -*/ -VOID RcSetRadioCurStat(struct radio_dev *rdev, PHY_STATUS CurStat) -{ - rdev->pRadioCtrl->CurStat = CurStat; -} - -/* -* -*/ -UCHAR RcGetBw(struct radio_dev *rdev) -{ - return rdev->pRadioCtrl->Bw; -} - -/* -* -*/ -UCHAR RcGetBandIdxByRf(struct hdev_ctrl *ctrl, UCHAR RfIC) -{ - struct radio_dev *rdev = rcGetHdevByRf(ctrl, RfIC); - - if (rdev) - return RcGetBandIdx(rdev); - - return 0; -} - -/* -* -*/ -struct radio_dev *RcGetBandIdxByBf(struct hdev_ctrl *ctrl) -{ - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - RADIO_CTRL *pRadioCtrl = NULL; - UCHAR i; - - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) { - pRadioCtrl = &pHwResourceCfg->PhyCtrl[i].RadioCtrl; - - if (pRadioCtrl->IsBfBand) - return &ctrl->rdev[i]; - } - - return NULL; -} - -/* -* -*/ -struct radio_dev *RcInit(struct hdev_ctrl *ctrl) -{ - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - RTMP_PHY_CTRL *pPhyCtrl = NULL; - UCHAR i; - - for (i = 0; i < DBDC_BAND_NUM; i++) { - pPhyCtrl = &pHwResourceCfg->PhyCtrl[i]; - os_zero_mem(pPhyCtrl, sizeof(RTMP_PHY_CTRL)); - } - - return NULL; -} - -/* -* -*/ -VOID RcRadioShow(HD_RESOURCE_CFG *pHwResourceCfg) -{ - UCHAR i; - - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("band\t: %d,rfic: %d, bf_cap: %d\n", i, - pHwResourceCfg->PhyCtrl[i].rf_band_cap, - pHwResourceCfg->PhyCtrl[i].RadioCtrl.IsBfBand ? - TRUE : - FALSE)); - } -} - -/* -* -*/ -BOOLEAN RcIsBfCapSupport(struct hdev_obj *obj) -{ - struct radio_dev *rdev = obj->rdev; - RADIO_CTRL *rc; - - if (!rdev) - return FALSE; - - rc = rdev->pRadioCtrl; - return rc->IsBfBand; -} - -/* -* -*/ -BOOLEAN rc_radio_equal(struct radio_dev *dev, struct freq_oper *oper) -{ - RADIO_CTRL *rc = dev->pRadioCtrl; - - /*if previous action is for scan, always allow to switch channel*/ - if (rc->scan_state == TRUE) - return FALSE; - - if (rc->Channel != oper->prim_ch) - return FALSE; - - if (rc->Bw != oper->bw) - return FALSE; - - if (rc->CentralCh != oper->cen_ch_1) - return FALSE; - - if (rc->Channel2 != oper->cen_ch_2) - return FALSE; - - return TRUE; -} - -/* -* -*/ -BOOLEAN rc_radio_res_acquire(struct radio_dev *dev, struct radio_res *res) -{ - RADIO_CTRL *rc = dev->pRadioCtrl; - - if (rc->CurStat != PHY_INUSE) - return FALSE; - - return TRUE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/wmm_ctrl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/wmm_ctrl.c deleted file mode 100644 index decb6af879..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/wmm_ctrl.c +++ /dev/null @@ -1,322 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#include "rt_config.h" -#include "hdev/hdev.h" - -/*WMM control*/ - -/*Local functions*/ -static BOOLEAN wcCompareEdca(EDCA_PARM *pEdcaParm, EDCA_PARM *pEdca) -{ - if ((!pEdcaParm->bValid) || (!pEdca->bValid)) - return FALSE; - - if ((pEdca->BandIdx != pEdcaParm->BandIdx)) - return FALSE; - - if (os_cmp_mem(pEdca->Aifsn, pEdcaParm->Aifsn, 4)) - return FALSE; - - if (os_cmp_mem(pEdca->Txop, pEdcaParm->Txop, sizeof(USHORT) * 4)) - return FALSE; - - if (os_cmp_mem(pEdca->Cwmax, pEdcaParm->Cwmax, 4)) - return FALSE; - - if (os_cmp_mem(pEdca->Cwmin, pEdcaParm->Cwmin, 4)) - return FALSE; - - return TRUE; -} - -/*Export Functions*/ - -/* - * - */ -UINT32 WcGetWmmNum(struct hdev_ctrl *ctrl) -{ - struct _RTMP_CHIP_CAP *cap = &ctrl->chip_cap; - - return cap->WmmHwNum; -} - -/* - * -*/ -EDCA_PARM *WcGetWmmByIdx(struct hdev_ctrl *ctrl, UINT32 Idx) -{ - return &ctrl->HwResourceCfg.WmmCtrl.pWmmSet[Idx]; -} - -/* - * -*/ -VOID WcReleaseEdca(struct hdev_obj *obj) -{ - EDCA_PARM *pEdca; - struct radio_dev *rdev = NULL; - struct hdev_ctrl *ctrl = NULL; - UINT32 WmmIdx; - /* TODO: Star, should remove it. */ - RTMP_ADAPTER *pAd; - - if (!obj || !obj->bWmmAcquired) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): Can't find HdevObj or Edca not required\n", - __func__)); - return; - } - - rdev = obj->rdev; - ctrl = rdev->priv; - pAd = (RTMP_ADAPTER *)ctrl->priv; - pEdca = WcGetWmmByIdx(ctrl, obj->WmmIdx); - - if (!pEdca || !pEdca->bValid) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): Can't find Edca for rdev: %d, Obj: %d\n", - __func__, rdev->Idx, obj->Idx)); - return; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): ObjIdx=%d,WmmIdx=%d\n", __func__, obj->Idx, - obj->WmmIdx)); - WmmIdx = pEdca->WmmSet; - pEdca->RefCnt--; - - if (pEdca->RefCnt <= 0) { - os_zero_mem(pEdca, sizeof(EDCA_PARM)); - pEdca->bValid = FALSE; - pEdca->RefCnt = 0; - pEdca->WmmSet = WmmIdx; - AsicSetEdcaParm(pAd, pEdca, pAd->wdev_list[obj->Idx]); - } - - obj->WmmIdx = 0; - obj->bWmmAcquired = FALSE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Release a WMM for ObjIdx: %d\n", obj->Idx)); -} - -/* - * -*/ -VOID WcAcquiredEdca(struct hdev_obj *obj, EDCA_PARM *pEdcaParm) -{ - struct radio_dev *rdev; - struct hdev_ctrl *ctrl; - INT32 i; - UINT32 NumOfWmm; - EDCA_PARM *pEdca, ReleaseEdca; - /* TODO: Star, should remove it. */ - - if (!obj) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): Can't find HdevObj\n", __func__)); - return; - } - - rdev = obj->rdev; - ctrl = rdev->priv; - NumOfWmm = WcGetWmmNum(ctrl); - os_zero_mem(&ReleaseEdca, sizeof(EDCA_PARM)); - - /*if input edca is all zero, assign default APEdca parameter*/ - if (!os_cmp_mem(&ReleaseEdca, pEdcaParm, sizeof(EDCA_PARM)) || - pEdcaParm->bValid != TRUE) - set_default_sta_edca_param(pEdcaParm); - - pEdcaParm->BandIdx = RcGetBandIdx(rdev); - - /*if can't search and WmmAcquired is not found*/ - if (obj->bWmmAcquired) { - pEdca = WcGetWmmByIdx(ctrl, obj->WmmIdx); - - if (wcCompareEdca(pEdca, pEdcaParm)) { - /*do nothing*/ - return; - } - - /*Reacquire wmm*/ - WcReleaseEdca(obj); - } - - for (i = 0; i < NumOfWmm; i++) { - pEdca = WcGetWmmByIdx(ctrl, i); - - if (wcCompareEdca(pEdca, pEdcaParm)) { - pEdca->RefCnt++; - obj->WmmIdx = i; - obj->bWmmAcquired = TRUE; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("WMM already created, assign WmmIdx:%d to ObjIdx: %d\n", - i, obj->Idx)); - return; - } - } - - /*Bind a new WMM for band*/ - for (i = 0; i < NumOfWmm; i++) { - pEdca = WcGetWmmByIdx(ctrl, i); - - if (!pEdca->bValid) { - obj->WmmIdx = i; - obj->bWmmAcquired = TRUE; - os_move_mem(pEdca->Aifsn, pEdcaParm->Aifsn, 4); - os_move_mem(pEdca->Cwmax, pEdcaParm->Cwmax, 4); - os_move_mem(pEdca->Cwmin, pEdcaParm->Cwmin, 4); - os_move_mem(pEdca->Txop, pEdcaParm->Txop, - sizeof(USHORT) * 4); - os_move_mem(pEdca->bACM, pEdcaParm->bACM, 4); - pEdca->RefCnt = 1; - pEdca->bValid = TRUE; - pEdca->BandIdx = RcGetBandIdx(rdev); - pEdcaParm->WmmSet = i; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Create a new WmmIdx:%d to ObjIdx: %d\n", i, - obj->Idx)); - return; - } - } - - /*allocate a default wmm set when obj can't allocate a new once*/ - for (i = 0; i < NumOfWmm; i++) { - pEdca = WcGetWmmByIdx(ctrl, i); - - if (pEdca->bValid && pEdca->BandIdx == RcGetBandIdx(rdev)) { - obj->WmmIdx = i; - obj->bWmmAcquired = TRUE; - pEdca->RefCnt++; - pEdcaParm->WmmSet = i; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("assign a old WmmIdx:%d to ObjIdx: %d, but not apply new parameter\n", - i, obj->Idx)); - return; - } - } - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Allocate WmmSet to ObjIdx:%d fail since Wmm is full and no WmmSet can match band\n", - obj->Idx)); -} - -/* -* -*/ -VOID WcSetEdca(struct hdev_obj *obj) -{ - struct radio_dev *rdev; - struct hdev_ctrl *ctrl; - EDCA_PARM *pEdca; - RTMP_ADAPTER *pAd; - - rdev = obj->rdev; - ctrl = (struct hdev_ctrl *)rdev->priv; - pAd = (RTMP_ADAPTER *)ctrl->priv; - - if (obj->bWmmAcquired) { - pEdca = WcGetWmmByIdx(ctrl, obj->WmmIdx); - /*set EDCA parameters from AP*/ - AsicSetEdcaParm(pAd, pEdca, pAd->wdev_list[obj->Idx]); - /*Update band control */ - RcUpdateWmmEntry(rdev, obj, obj->WmmIdx); - } -} - -/* - * -*/ -INT32 WcInit(struct hdev_ctrl *ctrl, WMM_CTRL_T *pWmmCtrl) -{ - INT32 NumOfWmm = WcGetWmmNum(ctrl); - EDCA_PARM *pEdcaArray = NULL; - INT32 i = 0; - - os_alloc_mem(NULL, (UCHAR **)&pEdcaArray, sizeof(EDCA_PARM) * NumOfWmm); - - if (pEdcaArray == NULL) - return -1; - - os_zero_mem(pEdcaArray, sizeof(EDCA_PARM) * NumOfWmm); - pWmmCtrl->pWmmSet = pEdcaArray; - - for (i = 0; i < NumOfWmm; i++) { - pEdcaArray[i].bValid = FALSE; - pEdcaArray[i].WmmSet = i; - pEdcaArray[i].RefCnt = 0; - } - - return 0; -} - -/* - * -*/ -INT32 WcExit(WMM_CTRL_T *pWmmCtrl) -{ - if (pWmmCtrl->pWmmSet) { - os_free_mem(pWmmCtrl->pWmmSet); - pWmmCtrl->pWmmSet = NULL; - } - - return 0; -} - -/* - * -*/ -VOID WcShowEdca(struct hdev_ctrl *ctrl) -{ - INT i; - EDCA_PARM *pEdca = NULL; - INT32 NumOfWmm = WcGetWmmNum(ctrl); - - for (i = 0; i < NumOfWmm; i++) { - pEdca = WcGetWmmByIdx(ctrl, i); - - if (pEdca->bValid) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tEdcaIdx: %d,BandIdx: %d, RfCnt: %d\n", - pEdca->WmmSet, pEdca->BandIdx, - pEdca->RefCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAifs: %d/%d/%d/%d\n", pEdca->Aifsn[0], - pEdca->Aifsn[1], pEdca->Aifsn[2], - pEdca->Aifsn[3])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTxop: %d/%d/%d/%d\n", pEdca->Txop[0], - pEdca->Txop[1], pEdca->Txop[2], - pEdca->Txop[3])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCwmin: %d/%d/%d/%d\n", pEdca->Cwmin[0], - pEdca->Cwmin[1], pEdca->Cwmin[2], - pEdca->Cwmin[3])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCwmax: %d/%d/%d/%d\n", pEdca->Cwmax[0], - pEdca->Cwmax[1], pEdca->Cwmax[2], - pEdca->Cwmax[3])); - } - } -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/wtbl_ctrl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/wtbl_ctrl.c deleted file mode 100644 index f180ed4a10..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev/wtbl_ctrl.c +++ /dev/null @@ -1,355 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#include "rt_config.h" -#include "hdev/hdev.h" - -/* -* local function -*/ - -/* -* -*/ -static UCHAR wtc_acquire_groupkey_wcid(struct hdev_ctrl *ctrl, - WTBL_CFG *pWtblCfg, struct hdev_obj *obj) -{ - UCHAR AvailableWcid = INVAILD_WCID; - UCHAR OmacIdx, WdevType; - int i; - WTBL_IDX_PARAMETER *pWtblIdxRec = NULL; - UCHAR min_wcid = pWtblCfg->MinMcastWcid; - struct _RTMP_CHIP_CAP *cap = &ctrl->chip_cap; - - OmacIdx = obj->OmacIdx; - WdevType = obj->Type; - NdisAcquireSpinLock(&pWtblCfg->WtblIdxRecLock); - - for (i = (cap->WtblHwNum - 1); i >= min_wcid; i--) { - pWtblIdxRec = &pWtblCfg->WtblIdxRec[i]; - - if (pWtblIdxRec->State != WTBL_STATE_NONE_OCCUPIED) - continue; - else { - pWtblIdxRec->State = WTBL_STATE_SW_OCCUPIED; - pWtblIdxRec->WtblIdx = i; - /*TODO: Carter, check flow when calling this function, OmacIdx might be erroed.*/ - pWtblIdxRec->LinkToOmacIdx = OmacIdx; - pWtblIdxRec->LinkToWdevType = WdevType; - pWtblIdxRec->type = WTBL_TYPE_MCAST; - AvailableWcid = (UCHAR)i; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Found a non-occupied wtbl_idx:%d for WDEV_TYPE:%d\n" - " LinkToOmacIdx = %x, LinkToWdevType = %d\n", - __func__, i, WdevType, OmacIdx, WdevType)); - NdisReleaseSpinLock(&pWtblCfg->WtblIdxRecLock); - return AvailableWcid; - } - } - - NdisReleaseSpinLock(&pWtblCfg->WtblIdxRecLock); - - if (i < min_wcid) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: no available wtbl_idx for WDEV_TYPE:%d\n", - __func__, WdevType)); - } - - return AvailableWcid; -} - -/*Wtable control*/ -/* -* -*/ -VOID WtcInit(struct hdev_ctrl *ctrl) -{ - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - WTBL_IDX_PARAMETER *pWtblParm = NULL; - UCHAR i = 0; - - os_zero_mem(pWtblCfg, sizeof(WTBL_CFG)); - NdisAllocateSpinLock(NULL, &pWtblCfg->WtblIdxRecLock); - - for (i = 0; i < MAX_LEN_OF_TR_TABLE; i++) { - pWtblParm = &pWtblCfg->WtblIdxRec[i]; - pWtblParm->State = WTBL_STATE_NONE_OCCUPIED; - pWtblParm->type = WTBL_TYPE_NONE; - } -} - -/* -* -*/ -VOID WtcExit(struct hdev_ctrl *ctrl) -{ - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - - NdisFreeSpinLock(&pWtblCfg->WtblIdxRecLock); - os_zero_mem(pWtblCfg, sizeof(WTBL_CFG)); -} - -/* -* -*/ -UCHAR WtcSetMaxStaNum(struct hdev_ctrl *ctrl, UCHAR BssidNum, UCHAR MSTANum) -{ - UCHAR wtbl_num_resv_for_mcast = 0; - UCHAR wtbl_num_use_for_ucast = 0; - UCHAR wtbl_num_use_for_sta = 0; - UCHAR MaxNumChipRept = 0; - UCHAR ApcliNum = MAX_APCLI_NUM; - UCHAR WdsNum = MAX_WDS_ENTRY; - UCHAR MaxUcastEntryNum = 0; - struct _RTMP_CHIP_CAP *cap = &ctrl->chip_cap; -#ifdef CONFIG_AP_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - MaxNumChipRept = GET_MAX_REPEATER_ENTRY_NUM(cap); -#endif /*MAC_REPEATER_SUPPROT*/ -#endif /*CONFIG_AP_SUPPORT*/ - wtbl_num_resv_for_mcast = BssidNum + ApcliNum + MSTANum; - wtbl_num_use_for_ucast = WdsNum + MaxNumChipRept + ApcliNum + MSTANum; - wtbl_num_use_for_sta = cap->WtblHwNum - wtbl_num_resv_for_mcast - - wtbl_num_use_for_ucast; - MaxUcastEntryNum = wtbl_num_use_for_sta + wtbl_num_use_for_ucast; - ctrl->HwResourceCfg.WtblCfg.MaxUcastEntryNum = MaxUcastEntryNum; - ctrl->HwResourceCfg.WtblCfg.MinMcastWcid = - cap->WtblHwNum - wtbl_num_resv_for_mcast; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BssidNum:%d, MaxStaNum:%d (WdsNum:%d, ApcliNum:%d, MaxNumChipRept:%d), MinMcastWcid:%d\n", - __func__, BssidNum, - (MaxUcastEntryNum - 1), /* WTBL 0 for management use*/ - WdsNum, ApcliNum, MaxNumChipRept, - ctrl->HwResourceCfg.WtblCfg.MinMcastWcid)); - return MaxUcastEntryNum; -} - -/* -* -*/ -UCHAR WtcAcquireGroupKeyWcid(struct hdev_ctrl *ctrl, struct hdev_obj *obj) -{ - UCHAR wcid; - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - - wcid = wtc_acquire_groupkey_wcid(ctrl, pWtblCfg, obj); - return wcid; -} - -/* -* -*/ -UCHAR WtcReleaseGroupKeyWcid(struct hdev_ctrl *ctrl, struct hdev_obj *obj, - UCHAR idx) -{ - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - WTBL_IDX_PARAMETER *pWtblIdxRec = NULL; - UCHAR ReleaseWcid = INVAILD_WCID; - - if (idx >= MAX_LEN_OF_MAC_TABLE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: idx:%d > MAX_LEN_OF_MAC_TABLE\n", __func__, - idx)); - return idx; - } - - NdisAcquireSpinLock(&pWtblCfg->WtblIdxRecLock); - pWtblIdxRec = &pWtblCfg->WtblIdxRec[idx]; - - if (pWtblIdxRec->type != WTBL_TYPE_MCAST) { - NdisReleaseSpinLock(&pWtblCfg->WtblIdxRecLock); - return idx; - } - - if (pWtblIdxRec->State == WTBL_STATE_NONE_OCCUPIED) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: try to release non-occupied idx:%d, something wrong?\n", - __func__, idx)); - ReleaseWcid = idx; - } else { - os_zero_mem(pWtblIdxRec, sizeof(WTBL_IDX_PARAMETER)); - /*make sure entry is cleared to usable one.*/ - pWtblIdxRec->State = WTBL_STATE_NONE_OCCUPIED; - pWtblIdxRec->type = WTBL_TYPE_NONE; - } - - NdisReleaseSpinLock(&pWtblCfg->WtblIdxRecLock); - return ReleaseWcid; -} - -/* -* -*/ -UCHAR WtcGetWcidLinkType(struct hdev_ctrl *ctrl, UCHAR idx) -{ - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - WTBL_IDX_PARAMETER *pWtblIdxRec = &pWtblCfg->WtblIdxRec[idx]; - - return pWtblIdxRec->LinkToWdevType; -} - -/* -* -*/ -UCHAR WtcGetMaxStaNum(struct hdev_ctrl *ctrl) -{ - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - - if (pWtblCfg->MaxUcastEntryNum > MAX_LEN_OF_MAC_TABLE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MaxUcastEntryNum=%d >= MAX_LEN_OF_MAC_TABLE(%d)\n", - __func__, pWtblCfg->MaxUcastEntryNum, - MAX_LEN_OF_MAC_TABLE)); - return MAX_LEN_OF_MAC_TABLE; - } else - return pWtblCfg->MaxUcastEntryNum; -} - -/* -* -*/ -UCHAR WtcAcquireUcastWcid(struct hdev_ctrl *ctrl, struct hdev_obj *obj) -{ - UCHAR FirstWcid = 1; - UCHAR i; - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - WTBL_IDX_PARAMETER *pWtblIdxRec = NULL; - - if (obj == NULL || pResource == NULL || pWtblCfg == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: unexpected NULL please check!!\n", __func__)); - return INVAILD_WCID; - } - - NdisAcquireSpinLock(&pWtblCfg->WtblIdxRecLock); - - /* skip entry#0 so that "entry index == AID" for fast lookup*/ - for (i = FirstWcid; i < pWtblCfg->MaxUcastEntryNum; i++) { - /* sanity check to avoid out of bound with pAd->MacTab.Content */ - if (i >= MAX_LEN_OF_MAC_TABLE) - continue; - - pWtblIdxRec = &pWtblCfg->WtblIdxRec[i]; - - if (pWtblIdxRec == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: unexpected NULL please check!!\n", - __func__)); - return INVAILD_WCID; - } - - if (pWtblIdxRec->State != WTBL_STATE_NONE_OCCUPIED) - continue; - - pWtblIdxRec->State = WTBL_STATE_SW_OCCUPIED; - pWtblIdxRec->WtblIdx = i; - /*TODO: Carter, check flow when calling this function, OmacIdx might be erroed.*/ - pWtblIdxRec->LinkToOmacIdx = obj->OmacIdx; - pWtblIdxRec->LinkToWdevType = obj->Type; - pWtblIdxRec->type = WTBL_TYPE_UCAST; - NdisReleaseSpinLock(&pWtblCfg->WtblIdxRecLock); - return i; - } - - NdisReleaseSpinLock(&pWtblCfg->WtblIdxRecLock); - return INVAILD_WCID; -} - -/* -* -*/ -UCHAR WtcReleaseUcastWcid(struct hdev_ctrl *ctrl, struct hdev_obj *obj, - UCHAR idx) -{ - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - WTBL_IDX_PARAMETER *pWtblIdxRec = NULL; - UCHAR ReleaseWcid = INVAILD_WCID; - - if (idx >= MAX_LEN_OF_MAC_TABLE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: idx:%d > MAX_LEN_OF_MAC_TABLE\n", __func__, - idx)); - return idx; - } - - NdisAcquireSpinLock(&pWtblCfg->WtblIdxRecLock); - pWtblIdxRec = &pWtblCfg->WtblIdxRec[idx]; - - if (pWtblIdxRec->type != WTBL_TYPE_UCAST) { - NdisReleaseSpinLock(&pWtblCfg->WtblIdxRecLock); - return idx; - } - - if (pWtblIdxRec->State == WTBL_STATE_NONE_OCCUPIED) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: try to release non-occupied idx:%d, something wrong?\n", - __func__, idx)); - ReleaseWcid = idx; - } else { - os_zero_mem(pWtblIdxRec, sizeof(WTBL_IDX_PARAMETER)); - /*make sure entry is cleared to usable one.*/ - pWtblIdxRec->State = WTBL_STATE_NONE_OCCUPIED; - pWtblIdxRec->type = WTBL_TYPE_NONE; - } - - NdisReleaseSpinLock(&pWtblCfg->WtblIdxRecLock); - return ReleaseWcid; -} - -/* -* -*/ -VOID WtcRecDump(struct hdev_ctrl *ctrl) -{ - HD_RESOURCE_CFG *pResource = &ctrl->HwResourceCfg; - WTBL_CFG *pWtblCfg = &pResource->WtblCfg; - WTBL_IDX_PARAMETER *pWtblIdxRec = NULL; - UCHAR i; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tWtblRecDump, Max Ucast is %d\n", - pWtblCfg->MaxUcastEntryNum)); - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - pWtblIdxRec = &pWtblCfg->WtblIdxRec[i]; - - if (pWtblIdxRec->State) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tIdx:%d,State:%d,Omac:%d,Type:%d,Wcid:%d, WcidType:%d\n", - i, pWtblIdxRec->State, - pWtblIdxRec->LinkToOmacIdx, - pWtblIdxRec->LinkToWdevType, - pWtblIdxRec->WtblIdx, pWtblIdxRec->type)); - } - } -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev_ctrl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev_ctrl.c deleted file mode 100644 index a2e532c1fb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hdev_ctrl.c +++ /dev/null @@ -1,1789 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - hdev_ctrl.c -*/ -#include "rt_config.h" -#include "hdev/hdev.h" - -/* -* local function -*/ -#ifdef DBDC_MODE -static VOID hcGetBandTypeName(UCHAR Type, UCHAR *Str, UINT32 max_len) -{ - switch (Type) { - case DBDC_TYPE_WMM: - snprintf(Str, max_len, "%s", "WMM"); - break; - - case DBDC_TYPE_MGMT: - snprintf(Str, max_len, "%s", "MGMT"); - break; - - case DBDC_TYPE_BSS: - snprintf(Str, max_len, "%s", "BSS"); - break; - - case DBDC_TYPE_MBSS: - snprintf(Str, max_len, "%s", "MBSS"); - break; - - case DBDC_TYPE_REPEATER: - snprintf(Str, max_len, "%s", "REPEATER"); - break; - - case DBDC_TYPE_MU: - snprintf(Str, max_len, "%s", "MU"); - break; - - case DBDC_TYPE_BF: - snprintf(Str, max_len, "%s", "BF"); - break; - - case DBDC_TYPE_PTA: - snprintf(Str, max_len, "%s", "PTA"); - break; - } -} -#endif - -/* - * -*/ -/*Only this function can use pAd*/ -INT32 hdev_ctrl_init(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = NULL; - UINT32 ret; - - ret = os_alloc_mem(NULL, (UCHAR **)&ctrl, sizeof(struct hdev_ctrl)); - - if (ctrl == NULL) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Allocate Hardware device Configure fail!!\n", - __func__)); - return -1; - } - - os_zero_mem(ctrl, sizeof(struct hdev_ctrl)); - ctrl->priv = (VOID *)pAd; - pAd->hdev_ctrl = (VOID *)ctrl; - return 0; -} - -/* -* -*/ -VOID hdev_resource_init(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - struct _RTMP_ADAPTER *ad = ctrl->priv; - - /*initial hardware resource*/ - HdevHwResourceInit(ctrl); - /*initial resource*/ - /*hook hif*/ -#if defined(RTMP_MAC_PCI) - if (IS_PCIE_INF(ad) || IS_RBUS_INF(ad)) - ctrl->hif = &ad->PciHif; -#endif /*RTMP_MAC_PCI*/ - ctrl->cookie = ad->OS_Cookie; - ctrl->mcu_ctrl = &ad->MCUCtrl; - ctrl->arch_ops = &ad->archOps; -} - -/* - * -*/ -VOID hdev_ctrl_exit(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - /*exist hw resource*/ - HdevHwResourceExit(ctrl); - /*exist hdevcfg*/ - pAd->hdev_ctrl = NULL; - os_free_mem(ctrl); -} - -/* - * -*/ -VOID HcDevExit(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - UCHAR i; - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) - HdevExit(ctrl, i); -} - -/* -* -*/ -INT32 HcAcquireRadioForWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - INT32 ret = HC_STATUS_OK; - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct radio_dev *rdev = NULL; - struct hdev_obj *obj = wdev->pHObj; - - rdev = RcAcquiredBandForObj(ctrl, obj, wdev->wdev_idx, wdev->PhyMode, - wdev->channel, wdev->wdev_type); - - /*correct wdev configure, if configure is not sync with hdev */ - if (!wmode_band_equal(wdev->PhyMode, RcGetPhyMode(rdev))) { - wdev->PhyMode = RcGetPhyMode(rdev); - wdev->channel = RcGetChannel(rdev); - } - -#ifdef EXT_BUILD_CHANNEL_LIST - BuildChannelListEx(pAd); -#else - BuildChannelList(pAd, wdev); -#endif - /*temporal set, will be repaced by HcGetOmacIdx*/ - wdev->OmacIdx = obj->OmacIdx; - /* Initialize the pDot11H of wdev */ - UpdateDot11hForWdev(wdev->sys_handle, wdev, TRUE); - /*re-init operation*/ - wlan_operate_init(wdev); - return ret; -} - -/* -* -*/ -INT32 HcReleaseRadioForWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - INT32 ret = 0; - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct hdev_obj *obj = wdev->pHObj; - - OS_SPIN_LOCK(&obj->RefCntLock); - - if (obj->RefCnt > 0) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): there are other link reference the Obj\n", - __func__)); - OS_SPIN_UNLOCK(&obj->RefCntLock); - return ret; - } - - OS_SPIN_UNLOCK(&obj->RefCntLock); - RcReleaseBandForObj(ctrl, obj); - return ret; -} - -/* -* -*/ -UCHAR HcGetBandByWdev(struct wifi_dev *wdev) -{ - UCHAR BandIdx = 0; - struct hdev_obj *obj; - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - - ASSERT(wdev); - /* exit from here if wdev is null */ - if (!wdev) - return 0; - - obj = wdev->pHObj; - if (hdev_obj_state_ready(obj)) - BandIdx = RcGetBandIdx(obj->rdev); - else { - if ((ad->CommonCfg.dbdc_mode) && (!BOARD_IS_5G_ONLY(ad))) { - if (WMODE_CAP_5G(wdev->PhyMode)) - BandIdx = DBDC_BAND1; - else - BandIdx = DBDC_BAND0; - } else - BandIdx = 0; - } - - return BandIdx; -} - -/* -* -*/ -VOID HcSetRadioCurStatByWdev(struct wifi_dev *wdev, PHY_STATUS CurStat) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (hdev_obj_state_ready(obj)) - RcSetRadioCurStat(obj->rdev, CurStat); - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): obj is not ready!!\n", __func__)); -} - -/* -* -*/ -VOID HcSetRadioCurStatByChannel(RTMP_ADAPTER *pAd, UCHAR Channel, - PHY_STATUS CurStat) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct radio_dev *rdev = NULL; - - rdev = RcGetHdevByChannel(ctrl, Channel); - - if (!rdev) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): no hdev parking on channel:%d !!!\n", __func__, - Channel)); - return; - } - - RcSetRadioCurStat(rdev, CurStat); -} - -/* -* -*/ -VOID HcSetAllSupportedBandsRadioOff(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = (struct hdev_ctrl *)pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - struct radio_dev *rdev = NULL; - UCHAR i; - - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) { - rdev = &ctrl->rdev[i]; - rdev->pRadioCtrl->CurStat = PHY_RADIOOFF; - } -} - -/* -* -*/ -VOID HcSetAllSupportedBandsRadioOn(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - struct radio_dev *rdev = NULL; - UCHAR i; - - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) { - rdev = &ctrl->rdev[i]; - rdev->pRadioCtrl->CurStat = PHY_INUSE; - } -} - -/* -* -*/ -BOOLEAN IsHcRadioCurStatOffByWdev(struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev_idx %d obj is not ready, return TRUE !!!\n", - __func__, wdev->wdev_idx)); - return TRUE; - } - - if (!obj->rdev) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): no hdev parking on wdev_idx:%d!!!\n", __func__, - wdev->wdev_idx)); - return TRUE; - } - - if (RcGetRadioCurStat(obj->rdev) == PHY_RADIOOFF) - return TRUE; - else - return FALSE; -} - -/* -* -*/ -BOOLEAN IsHcRadioCurStatOffByChannel(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct radio_dev *rdev = NULL; - - rdev = RcGetHdevByChannel(ctrl, Channel); - - if (!rdev) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): no hdev parking on channel:%d!!!\n", __func__, - Channel)); - return TRUE; - } - - if (RcGetRadioCurStat(rdev) == PHY_RADIOOFF) - return TRUE; - else - return FALSE; -} - -/* -* -*/ -BOOLEAN IsHcAllSupportedBandsRadioOff(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResourceCfg = &ctrl->HwResourceCfg; - struct radio_dev *rdev = NULL; - UCHAR i; - BOOLEAN AllSupportedBandsRadioOff = TRUE; - - for (i = 0; i < pHwResourceCfg->concurrent_bands; i++) { - rdev = &ctrl->rdev[i]; - - if ((rdev->pRadioCtrl->CurStat == PHY_INUSE) && - (rdev->pRadioCtrl->CurStat != PHY_RADIOOFF)) { - AllSupportedBandsRadioOff = FALSE; - break; - } - } - - return AllSupportedBandsRadioOff; -} - -#ifdef GREENAP_SUPPORT -/* -* -*/ -VOID HcSetGreenAPActiveByBand(RTMP_ADAPTER *pAd, UCHAR BandIdx, - BOOLEAN bGreenAPActive) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct radio_dev *rdev = NULL; - - if (!ctrl) - return; - - rdev = &ctrl->rdev[BandIdx]; - - if (!rdev) - return; - - rdev->pRadioCtrl->bGreenAPActive = bGreenAPActive; -} - -/* -* -*/ -BOOLEAN IsHcGreenAPActiveByBand(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct radio_dev *rdev = NULL; - - if (!ctrl) - return FALSE; - - rdev = &ctrl->rdev[BandIdx]; - - if (!rdev) - return FALSE; - - return rdev->pRadioCtrl->bGreenAPActive; -} - -/* -* -*/ -BOOLEAN IsHcGreenAPActiveByWdev(struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - struct radio_dev *rdev = NULL; - - if (!hdev_obj_state_ready(obj)) - return FALSE; - - rdev = obj->rdev; - - return rdev->pRadioCtrl->bGreenAPActive; -} -#endif /* GREENAP_SUPPORT */ - -/* -* -*/ -UCHAR HcGetChannelByBf(RTMP_ADAPTER *pAd) -{ - struct radio_dev *rdev = RcGetBandIdxByBf(pAd->hdev_ctrl); - - if (rdev == NULL) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): no hdev can support beamform!\n", __func__)); - return 0; - } - - return rdev->pRadioCtrl->Channel; -} - -/* -* -*/ -BOOLEAN HcIsBfCapSupport(struct wifi_dev *wdev) -{ - if (!hdev_obj_state_ready(wdev->pHObj)) - return FALSE; - - return RcIsBfCapSupport(wdev->pHObj); -} - -#ifdef MAC_REPEATER_SUPPORT -/* -* -*/ -INT32 HcAddRepeaterEntry(struct wifi_dev *wdev, UINT32 ReptIdx) -{ - INT32 ret = 0; - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return HC_STATUS_FAIL; - } - - /*Acquire Repeater OMACIdx*/ - OcAddRepeaterEntry(obj, ReptIdx); - RcUpdateRepeaterEntry(obj->rdev, ReptIdx); - return ret; -} - -/* -* -*/ -INT32 HcDelRepeaterEntry(struct wifi_dev *wdev, UINT32 ReptIdx) -{ - INT32 ret = 0; - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return HC_STATUS_FAIL; - } - - /*Acquire Repeater OMACIdx*/ - OcDelRepeaterEntry(obj, ReptIdx); - return ret; -} - -/* -* -*/ -UCHAR HcGetRepeaterOmac(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry) -{ - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - HD_REPT_ENRTY *pHReptEntry = NULL; - UCHAR ReptOmacIdx = 0xff; - - pReptEntry = RTMPLookupRepeaterCliEntry(pAd, FALSE, pEntry->ReptCliAddr, - TRUE); - - if (pReptEntry) { - pHReptEntry = OcGetRepeaterEntry(pReptEntry->wdev->pHObj, - pReptEntry->MatchLinkIdx); - - if (pHReptEntry) - ReptOmacIdx = pHReptEntry->ReptOmacIdx; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Get ReptOmacIdx: %d!\n", __func__, ReptOmacIdx)); - return ReptOmacIdx; -} -#endif /*#MAC_REPEATER_SUPPORT*/ - -/* -* -*/ -INT32 HcRadioInit(RTMP_ADAPTER *pAd, UCHAR RfIC, UCHAR DbdcMode) -{ - INT32 ret = 0; - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - - RcRadioInit(ctrl, RfIC, DbdcMode); - return ret; -} - -/* -* -*/ -INT32 HcUpdateCsaCntByChannel(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - INT32 ret = 0; - struct radio_dev *rdev = NULL; - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct hdev_obj *obj; - struct wifi_dev *wdev; - struct DOT11_H *pDot11h = NULL; - - rdev = RcGetHdevByChannel(ctrl, Channel); - if (!rdev) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Update Channel %d faild, not support this RF\n", - __func__, Channel)); - return -1; - } - - DlListForEach(obj, &rdev->DevObjList, struct hdev_obj, list) - { - wdev = pAd->wdev_list[obj->Idx]; - - if (wdev == NULL) - continue; - - pDot11h = wdev->pDot11_H; - - if (pDot11h == NULL) - return -1; -#ifdef CUSTOMER_DCC_FEATURE - if (pAd->CommonCfg.channelSwitch.CHSWMode == - CHANNEL_SWITCHING_MODE) { - wdev->csa_count = - pAd->CommonCfg.channelSwitch.CHSWPeriod; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } else -#endif - if (pDot11h->RDMode != RD_SILENCE_MODE) { - pAd->CommonCfg.set_ch_async_flag = TRUE; - pDot11h->wdev_count++; - wdev->csa_count = pDot11h->CSPeriod; - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - } - } - return ret; -} - -#ifdef DBDC_MODE -/* -* -*/ -VOID HcShowBandInfo(RTMP_ADAPTER *pAd) -{ - UINT32 i; - BCTRL_INFO_T BctrlInfo; - BCTRL_ENTRY_T *pEntry = NULL; - CHAR TempStr[16] = ""; - - os_zero_mem(&BctrlInfo, sizeof(BCTRL_INFO_T)); - AsicGetDbdcCtrl(pAd, &BctrlInfo); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDbdcEnable: %d\n", BctrlInfo.DBDCEnable)); - - for (i = 0; i < BctrlInfo.TotalNum; i++) { - pEntry = &BctrlInfo.BctrlEntries[i]; - hcGetBandTypeName(pEntry->Type, TempStr, sizeof(TempStr)); - - if (pEntry->Type != DBDC_TYPE_MBSS) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t(%s,%d): Band %d\n", TempStr, - pEntry->Index, pEntry->BandIdx)); - else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t(%s,0-%d): Band %d\n", TempStr, - pEntry->Index + 1, pEntry->BandIdx)); - } -} -#endif - -VOID HcShowChCtrlInfo(struct _RTMP_ADAPTER *pAd) -{ - UCHAR BandIdx, ChIdx; - CHANNEL_CTRL *pChCtrl; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=====================START====================\n ")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------\n ")); - - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - - if (pChCtrl->ChListNum == 0) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\x1b[1;33mBandIdx = %d\x1b[m, ChannelListNum = %d (it is not available)\n ", - BandIdx, pChCtrl->ChListNum)); - break; - } else { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\x1b[1;33mBandIdx = %d\x1b[m, ChannelListNum = %d\n ", - BandIdx, pChCtrl->ChListNum)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tChGrpABandEn = %d\n ", - pChCtrl->ChGrpABandEn)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tChannel list information:\n ")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tChannel \tPwr0/1 \t\tFlags\n ")); - for (ChIdx = 0; ChIdx < pChCtrl->ChListNum; ChIdx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\t#%d \t\t%d/%d \t\t%x\n ", - pChCtrl->ChList[ChIdx].Channel, - pChCtrl->ChList[ChIdx].Power, - pChCtrl->ChList[ChIdx].Power2, - pChCtrl->ChList[ChIdx].Flags)); - } - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("---------------------------------------------\n ")); - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=====================END=====================\n ")); -} -#ifdef GREENAP_SUPPORT -/* - * - */ -VOID HcShowGreenAPInfo(RTMP_ADAPTER *pAd) -{ - struct greenap_ctrl *greenap = &pAd->ApCfg.greenap; - - greenap_show(pAd, greenap); -} -#endif /* GREENAP_SUPPORT */ - -/* -* -*/ -void hc_show_edca_info(struct _RTMP_ADAPTER *ad) -{ - struct hdev_ctrl *ctrl = ad->hdev_ctrl; - - WcShowEdca(ctrl); -} - -/* -* -*/ -void hc_show_radio_info(struct _RTMP_ADAPTER *ad) -{ - struct hdev_ctrl *ctrl = ad->hdev_ctrl; - - HdevCfgShow(ctrl); -} - -/* -* -*/ -void hc_show_hdev_obj(struct wifi_dev *wdev) -{ - if (!hdev_obj_state_ready(wdev->pHObj)) - return; - - HdevObjShow(wdev->pHObj); -} - -/* -* -*/ -VOID HcAcquiredEdca(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, EDCA_PARM *pEdca) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return; - } - WcAcquiredEdca(obj, pEdca); -} - -/* -* -*/ -VOID HcReleaseEdca(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return; - } - WcReleaseEdca(obj); -} - -/* -* -*/ -VOID HcSetEdca(struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return; - } - WcSetEdca(obj); -} - -/* -* -*/ -UCHAR HcGetOmacIdx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return 0xff; - } - return obj->OmacIdx; -} - -/* -* Need refine -*/ - -/* -* Only temporal usage, should remove when cmm_asic_xxx.c is not apply pAd -*/ - -UCHAR HcGetChannelByRf(RTMP_ADAPTER *pAd, UCHAR RfIC) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - UCHAR i; - - for (i = 0; i < pHwResource->concurrent_bands; i++) { - if (pHwResource->PhyCtrl[i].rf_band_cap & RfIC) - return pHwResource->PhyCtrl[i].RadioCtrl.Channel; - } - - return 0; -} - -/* -* for Single Band Usage -*/ -UCHAR HcGetRadioChannel(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - return pHwResource->PhyCtrl[0].RadioCtrl.Channel; -} - -/* -* -*/ -UCHAR HcGetRadioPhyMode(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - return pHwResource->PhyCtrl[0].RadioCtrl.PhyMode; -} - -UCHAR HcGetRadioPhyModeByBandIdx(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - return pHwResource->PhyCtrl[BandIdx].RadioCtrl.PhyMode; -} -/* -* -*/ -UCHAR HcGetRadioRfIC(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - - return ctrl->HwResourceCfg.PhyCtrl[0].rf_band_cap; -} - -/* -* -*/ -BOOLEAN HcIsRfSupport(RTMP_ADAPTER *pAd, UCHAR RfIC) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - UCHAR i; - - for (i = 0; i < pHwResource->concurrent_bands; i++) { - if (pHwResource->PhyCtrl[i].rf_band_cap & RfIC) - return TRUE; - } - - return FALSE; -} - -/* -* -*/ -BOOLEAN HcIsRfRun(RTMP_ADAPTER *pAd, UCHAR RfIC) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - struct radio_dev *rdev; - UCHAR i; - - for (i = 0; i < pHwResource->concurrent_bands; i++) { - rdev = &ctrl->rdev[i]; - - if (WMODE_CAP_2G(rdev->pRadioCtrl->PhyMode) && - (RfIC & RFIC_24GHZ)) - return TRUE; - else if (WMODE_CAP_5G(rdev->pRadioCtrl->PhyMode) && - (RfIC & RFIC_5GHZ)) - return TRUE; - } - - return FALSE; -} - -#ifdef CONFIG_AP_SUPPORT -#ifdef AP_QLOAD_SUPPORT -/* -* -*/ -QLOAD_CTRL *HcGetQloadCtrlByRf(RTMP_ADAPTER *pAd, UINT32 RfIC) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - UCHAR i; - - for (i = 0; i < pHwResource->concurrent_bands; i++) { - if (pHwResource->PhyCtrl[i].rf_band_cap & RfIC) - return &pHwResource->PhyCtrl[i].QloadCtrl; - } - - return 0; -} - -/* -* -*/ -QLOAD_CTRL *HcGetQloadCtrl(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - return &pHwResource->PhyCtrl[0].QloadCtrl; -} -#endif /*AP_QLOAD_SUPPORT*/ - -/* -* -*/ -AUTO_CH_CTRL *HcGetAutoChCtrl(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - return &pHwResource->PhyCtrl[0].AutoChCtrl; -} -#endif /*CONFIG_AP_SUPPORT*/ -#ifdef CONFIG_AP_SUPPORT -AUTO_CH_CTRL *HcGetAutoChCtrlbyBandIdx(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - return &pHwResource->PhyCtrl[BandIdx].AutoChCtrl; -} -#endif - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -struct ch_switch_cfg *HcGetChanSwitchMonbyBandIdx(RTMP_ADAPTER *pAd, - UCHAR BandIdx) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - - return &pHwResource->PhyCtrl[BandIdx].ch_sw_cfg; -} -#endif - -/* -* -*/ -UCHAR HcGetBw(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return 0xff; - } - - return RcGetBw(obj->rdev); -} - -/* -* -*/ -UINT32 HcGetMgmtQueueIdx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - enum PACKET_TYPE pkt_type) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return TxQ_IDX_ALTX0; - } - - return RcGetMgmtQueueIdx(obj, pkt_type); -} - -/* -* -*/ -UINT32 HcGetBcnQueueIdx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return TxQ_IDX_BCN0; - } - - return RcGetBcnQueueIdx(obj); -} - -/* -* -*/ -UINT32 HcGetTxRingIdx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - enum PACKET_TYPE pkt_type, UCHAR q_idx) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return 0; - } - - return RcGetTxRingIdx(obj); -} - -/* -* -*/ -UINT32 HcGetWmmIdx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return 0; - } - - return RcGetWmmIdx(obj); -} - -#ifdef CUSTOMER_DCC_FEATURE -INT32 HcUpdateExtCha(RTMP_ADAPTER *pAd, UCHAR Channel, UCHAR ExtCha) -{ - INT32 ret = 0; - struct radio_dev *pHdev = NULL; - struct hdev_ctrl *pHdCfg = (struct hdev_ctrl *)pAd->hdev_ctrl; - - pHdev = RcGetHdevByChannel(pHdCfg, Channel); - if (!pHdev) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Get Hdev by Channel %d faild, not support this RF\n", - __FUNCTION__, Channel)); - return -1; - } - - /*Update ExtCha to radio*/ - ret = RcUpdateExtCha(pHdev, ExtCha); - - return ret; -} - -UCHAR HcGetExtCha(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - struct radio_dev *rdev = NULL; - struct hdev_ctrl *pHdCfg = pAd->hdev_ctrl; - - rdev = RcGetHdevByChannel(pHdCfg, Channel); - - if (!rdev) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Get Hdev by Channel %d faild, not support this RF\n", - __FUNCTION__, Channel)); - return 0; - } - return RcGetExtCha(rdev); -} -#endif - -/* -* -*/ -UCHAR HcGetBandByChannel(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct radio_dev *rdev = NULL; - UCHAR BandIdx; - - rdev = RcGetHdevByChannel(ctrl, Channel); - - if (!rdev) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): no hdev parking on channel:%d!\n", __func__, - Channel)); - return 0; - } - - BandIdx = RcGetBandIdx(rdev); - return BandIdx; -} - -/* -* -*/ -EDCA_PARM *HcGetEdca(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - EDCA_PARM *pEdca = NULL; - struct hdev_obj *obj = wdev->pHObj; - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return NULL; - } - - pEdca = WcGetWmmByIdx(ctrl, obj->WmmIdx); - return pEdca; -} - -/* -* -*/ -VOID HcCrossChannelCheck(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR Channel) -{ - UCHAR PhyMode = wdev->PhyMode; - UCHAR WChannel = wdev->channel; - - /*check channel is belong to differet band*/ - if (Channel > 14 && WChannel > 14) - return; - - if (Channel <= 14 && WChannel <= 14) - return; - - /*is mixed mode, change default channel and */ - if (!WMODE_5G_ONLY(PhyMode) || !WMODE_2G_ONLY(PhyMode)) { - /*update wdev channel to new band*/ - wdev->channel = Channel; - /*need change to other band*/ - HcAcquireRadioForWdev(pAd, wdev); - } - - return; -} - -/* - * Description: - * - * the function will check all enabled function, - * check the bssid num is defined, - * - * preserve the group key wtbl num will be used. - * then decide the max station number could be used. - */ -UCHAR HcGetMaxStaNum(RTMP_ADAPTER *pAd) -{ - UCHAR MaxStaNum = WtcGetMaxStaNum(pAd->hdev_ctrl); - - if (MaxStaNum > MAX_LEN_OF_MAC_TABLE) - MaxStaNum = MAX_LEN_OF_MAC_TABLE; - - return MaxStaNum; -} - -UCHAR HcSetMaxStaNum(RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - UCHAR BssidNum = 0, MSTANum = 0; -#ifdef CONFIG_AP_SUPPORT - BssidNum = pAd->ApCfg.BssidNum; -#endif /*CONFIG_AP_SUPPORT*/ - return WtcSetMaxStaNum(ctrl, BssidNum, MSTANum); -} - -/* -* -*/ -UCHAR HcAcquireGroupKeyWcid(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return INVAILD_WCID; - } - - wdev->tr_tb_idx = WtcAcquireGroupKeyWcid(pAd->hdev_ctrl, obj); - return wdev->tr_tb_idx; -} - -/* -* -*/ -VOID HcReleaseGroupKeyWcid(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR idx) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return; - } - - wdev->tr_tb_idx = WtcReleaseGroupKeyWcid(pAd->hdev_ctrl, obj, idx); -} - -/* -* -*/ -UCHAR HcGetWcidLinkType(RTMP_ADAPTER *pAd, UCHAR Wcid) -{ - return WtcGetWcidLinkType(pAd->hdev_ctrl, Wcid); -} - -/* -* -*/ -UCHAR HcAcquireUcastWcid(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return INVAILD_WCID; - } - - return WtcAcquireUcastWcid(pAd->hdev_ctrl, obj); -} - -/* -* -*/ -UCHAR HcReleaseUcastWcid(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR idx) -{ - struct hdev_obj *obj = wdev->pHObj; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - if (idx > 0) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): releasing wcid %d, hobj is not ready!\n", - __func__, idx)); - } else - return INVAILD_WCID; - } - - return WtcReleaseUcastWcid(pAd->hdev_ctrl, obj, idx); -} - -/* -* -*/ -VOID HcWtblRecDump(RTMP_ADAPTER *pAd) -{ - WtcRecDump(pAd->hdev_ctrl); -} - -/* -* -*/ -BOOLEAN HcIsRadioAcq(struct wifi_dev *wdev) -{ - return hdev_obj_state_ready(wdev->pHObj); -} - -UCHAR HcGetAmountOfBand(struct _RTMP_ADAPTER *pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - - return ctrl->HwResourceCfg.concurrent_bands; -} - -static INT32 HcSuspendMSDUTx(struct radio_dev *rdev) -{ - INT32 ret = 0; - struct hdev_obj *obj; - struct hdev_ctrl *ctrl = rdev->priv; - struct _RTMP_ADAPTER *ad = ctrl->priv; - struct wifi_dev *wdev; - - /*update all of wdev*/ - DlListForEach(obj, &rdev->DevObjList, struct hdev_obj, list) - { - wdev = ad->wdev_list[obj->Idx]; - RTMPSuspendMsduTransmission(wdev->sys_handle, wdev); - } - return ret; -} - -static INT32 HcUpdateMSDUTxAllow(struct radio_dev *rdev) -{ - INT32 ret = 0; - struct hdev_obj *obj; - struct hdev_ctrl *ctrl = rdev->priv; - struct _RTMP_ADAPTER *ad = ctrl->priv; - struct wifi_dev *wdev; - - /*update all of wdev*/ - DlListForEach(obj, &rdev->DevObjList, struct hdev_obj, list) - { - wdev = ad->wdev_list[obj->Idx]; - - if (wdev->channel == rdev->pRadioCtrl->Channel) - RTMPResumeMsduTransmission(wdev->sys_handle, wdev); - else - RTMPSuspendMsduTransmission(wdev->sys_handle, wdev); - } - return ret; -} - -/* -* -*/ -static VOID hc_radio_update(struct wifi_dev *wdev, struct radio_res *res) -{ - struct hdev_obj *obj = wdev->pHObj; - struct radio_dev *rdev; - struct freq_oper *oper = res->oper; -#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; -#endif - BOOLEAN scan = (res->reason == REASON_NORMAL_SCAN) ? TRUE : FALSE; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return; - } - rdev = obj->rdev; -#ifdef CONFIG_AP_SUPPORT -#ifdef AP_QLOAD_SUPPORT - /* clear all statistics count for QBSS Load */ - QBSS_LoadStatusClear(wdev->sys_handle, oper->prim_ch); -#endif /* AP_QLOAD_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - HcSuspendMSDUTx(rdev); - AsicSwitchChannel(wdev->sys_handle, rdev->Idx, oper, scan); - AsicSetBW(wdev->sys_handle, oper->bw, rdev->Idx); - RcUpdateRadio(rdev, oper->bw, oper->cen_ch_1, oper->cen_ch_2, - oper->ext_cha); - RcUpdateChannel(rdev, oper->prim_ch, scan); - /*after update channel resum tx*/ - HcUpdateMSDUTxAllow(rdev); -#if defined(MT_DFS_SUPPORT) && defined(BACKGROUND_SCAN_SUPPORT) - DfsInitDedicatedScanStart(ad); -#endif -} - -/* -* -*/ -BOOLEAN hc_radio_res_request(struct wifi_dev *wdev, struct radio_res *res) -{ - struct hdev_obj *obj = wdev->pHObj; - struct radio_dev *rdev; -#ifdef ANTENNA_CONTROL_SUPPORT - UINT8 BandIdx = 0; - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; - - BandIdx = HcGetBandByWdev(wdev); -#endif /* ANTENNA_CONTROL_SUPPORT */ -#ifdef MT_WOW_SUPPORT - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; -#endif /*MT_WOW_SUPPORT*/ - -#ifdef BW_VENDOR10_CUSTOM_FEATURE - /* Sync SoftAp BW for Down Case */ - if (wdev->wdev_type == WDEV_TYPE_AP && - wlan_operate_get_state(wdev) == WLAN_OPER_STATE_INVALID) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): AP wdev=%d, Interface Down!\n", __func__, - wdev->wdev_idx)); - return FALSE; - } -#endif - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return FALSE; - } - - rdev = obj->rdev; - if ( -#ifdef ANTENNA_CONTROL_SUPPORT - (!pAd->bAntennaSetAPEnable[BandIdx]) && -#endif /* ANTENNA_CONTROL_SUPPORT */ - (rc_radio_equal(rdev, res->oper))) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): radio is equal, prim_ch=%d!\n", __func__, - res->oper->prim_ch)); - return TRUE; - } - - if (rc_radio_res_acquire(rdev, res) != TRUE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): can't acquire radio resource!\n", __func__)); - return FALSE; - } - -#ifdef MT_WOW_SUPPORT - - if (ad->WOW_Cfg.bWoWRunning) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] WoW is running, skip!\n", __func__)); - return FALSE; - } - -#endif /*MT_WOW_SUPPORT*/ - /*update to radio resouce*/ - hc_radio_update(wdev, res); - return TRUE; -} - -/* -* -*/ -UCHAR hc_reset_radio(struct _RTMP_ADAPTER *ad) -{ - struct hdev_ctrl *ctrl = ad->hdev_ctrl; - struct radio_dev *rdev = NULL; - struct freq_oper freq; - struct _RADIO_CTRL *radio_ctrl; - UCHAR i; - - for (i = 0; i < ctrl->HwResourceCfg.concurrent_bands; i++) { - os_zero_mem(&freq, sizeof(freq)); - rdev = &ctrl->rdev[i]; - radio_ctrl = rdev->pRadioCtrl; - freq.bw = radio_ctrl->Bw; - freq.prim_ch = radio_ctrl->Channel; - freq.cen_ch_1 = radio_ctrl->CentralCh; - freq.cen_ch_2 = radio_ctrl->Channel2; - AsicSwitchChannel(ad, i, &freq, FALSE); - } - return TRUE; -} - -/* -* -*/ -VOID hc_set_rrm_init(struct wifi_dev *wdev) -{ - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - UCHAR band_idx = HcGetBandByWdev(wdev); - - AsicSetTxStream(wdev->sys_handle, ad->Antenna.field.TxPath, OPMODE_AP, - TRUE, band_idx); - AsicSetRxStream(wdev->sys_handle, ad->Antenna.field.RxPath, band_idx); -} - -/* -* -*/ -INT hc_radio_query_by_wdev(struct wifi_dev *wdev, struct freq_oper *oper) -{ - struct hdev_obj *obj = wdev->pHObj; - struct radio_dev *rdev; - struct _RADIO_CTRL *radio; - - if (!hdev_obj_state_ready(obj)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev=%d, hobj is not ready!\n", __func__, - wdev->wdev_idx)); - return HC_STATUS_FAIL; - } - - rdev = obj->rdev; - radio = rdev->pRadioCtrl; - oper->bw = radio->Bw; - oper->cen_ch_1 = radio->CentralCh; - oper->cen_ch_2 = radio->Channel2; - oper->ext_cha = radio->ExtCha; - oper->prim_ch = radio->Channel; - oper->ht_bw = (oper->bw > BW_20) ? HT_BW_40 : HT_BW_20; - oper->vht_bw = rf_bw_2_vht_bw(oper->bw); - return HC_STATUS_OK; -} - -/* -* -*/ -INT hc_radio_query_by_channel(struct _RTMP_ADAPTER *ad, UCHAR channel, - struct freq_oper *oper) -{ - INT ret = HC_STATUS_FAIL; - struct hdev_ctrl *ctrl = ad->hdev_ctrl; - struct _HD_RESOURCE_CFG *res = &ctrl->HwResourceCfg; - struct _RADIO_CTRL *radio = NULL; - UCHAR i; - - for (i = 0; i < res->concurrent_bands; i++) { - radio = &res->PhyCtrl[i].RadioCtrl; - if (radio->Channel == channel) { - oper->bw = radio->Bw; - oper->cen_ch_1 = radio->CentralCh; - oper->cen_ch_2 = radio->Channel2; - oper->ext_cha = radio->ExtCha; - oper->prim_ch = radio->Channel; - oper->ht_bw = (oper->bw > BW_20) ? HT_BW_40 : HT_BW_20; - oper->vht_bw = rf_bw_2_vht_bw(oper->bw); - ret = HC_STATUS_OK; - break; - } - } - return ret; -} - -/* -* suggest only used by phy related features, others should use hc_radio_query_by_wdev -*/ -INT hc_radio_query_by_index(struct _RTMP_ADAPTER *ad, UCHAR index, - struct freq_oper *oper) -{ - INT ret = HC_STATUS_OK; - struct hdev_ctrl *ctrl = ad->hdev_ctrl; - struct _HD_RESOURCE_CFG *res = &ctrl->HwResourceCfg; - struct _RADIO_CTRL *radio = NULL; - - radio = &res->PhyCtrl[index].RadioCtrl; - oper->bw = radio->Bw; - oper->cen_ch_1 = radio->CentralCh; - oper->cen_ch_2 = radio->Channel2; - oper->ext_cha = radio->ExtCha; - oper->prim_ch = radio->Channel; - oper->ht_bw = (oper->bw > BW_20) ? HT_BW_40 : HT_BW_20; - oper->vht_bw = rf_bw_2_vht_bw(oper->bw); - return ret; -} - -/* -* temporally use, only query first freq_oper by rfic, not support in 5G+5G or 2G+2G case -*/ -INT hc_radio_query_by_rf(struct _RTMP_ADAPTER *ad, UCHAR rfic, - struct freq_oper *oper) -{ - INT ret = HC_STATUS_FAIL; - struct hdev_ctrl *ctrl = ad->hdev_ctrl; - struct _HD_RESOURCE_CFG *res = &ctrl->HwResourceCfg; - struct _RADIO_CTRL *radio = NULL; - UCHAR i; - - for (i = 0; i < res->concurrent_bands; i++) { - radio = &res->PhyCtrl[i].RadioCtrl; - if (wmode_2_rfic(radio->PhyMode) & rfic) { - oper->bw = radio->Bw; - oper->cen_ch_1 = radio->CentralCh; - oper->cen_ch_2 = radio->Channel2; - oper->ext_cha = radio->ExtCha; - oper->prim_ch = radio->Channel; - oper->ht_bw = (oper->bw > BW_20) ? HT_BW_40 : HT_BW_20; - oper->vht_bw = rf_bw_2_vht_bw(oper->bw); - ret = HC_STATUS_OK; - break; - } - } - return ret; -} - -/* -* -*/ -INT hc_obj_init(struct wifi_dev *wdev, INT idx) -{ - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - struct hdev_ctrl *ctrl = ad->hdev_ctrl; - - wdev->pHObj = &ctrl->HObjList[idx]; - return HC_STATUS_OK; -} - -/* -* -*/ -VOID hc_obj_exit(struct wifi_dev *wdev) -{ - wdev->pHObj = NULL; -} - -/* -* -*/ -inline struct _RTMP_CHIP_CAP *hc_get_chip_cap(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - return &ctrl->chip_cap; -} -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(hc_get_chip_cap); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ - -/* -* -*/ -struct _RTMP_CHIP_OP *hc_get_chip_ops(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return &ctrl->chip_ops; -} -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(hc_get_chip_ops); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ -/* -* -*/ -void hc_register_chip_ops(void *hdev_ctrl, struct _RTMP_CHIP_OP *ops) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - os_move_mem(&ctrl->chip_ops, ops, sizeof(*ops)); -} - -/* -* -*/ -UCHAR hc_set_ChCtrl(CHANNEL_CTRL *ChCtrl, RTMP_ADAPTER *pAd, UCHAR ChIdx, - UCHAR ChIdx2) -{ - os_move_mem(&ChCtrl->ChList[ChIdx], &pAd->TxPower[ChIdx2], - sizeof(CHANNEL_TX_POWER)); - return HC_STATUS_OK; -} - -UCHAR hc_set_ChCtrlFlags_CAP(CHANNEL_CTRL *ChCtrl, UINT ChannelListFlag, - UCHAR ChIdx) -{ - ChCtrl->ChList[ChIdx].Flags |= ChannelListFlag; - return HC_STATUS_OK; -} - -UCHAR hc_set_ChCtrlChListStat(CHANNEL_CTRL *ChCtrl, CH_LIST_STATE ChListStat) -{ - ChCtrl->ChListStat = ChListStat; - return HC_STATUS_OK; -} - -CHANNEL_CTRL *hc_get_channel_ctrl(void *hdev_ctrl, UCHAR BandIdx) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - return &ctrl->ChCtrl[BandIdx]; -} - -UCHAR hc_init_ChCtrl(RTMP_ADAPTER *pAd) -{ - UCHAR BandIdx; - CHANNEL_CTRL *pChCtrl; - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - os_zero_mem(pChCtrl, sizeof(CHANNEL_CTRL)); - } - return HC_STATUS_OK; -} -#ifdef CONFIG_AP_SUPPORT -UCHAR hc_init_ACSChCtrl(RTMP_ADAPTER *pAd) -{ - UCHAR BandIdx; - AUTO_CH_CTRL *pAutoChCtrl; - for (BandIdx = 0; BandIdx < DBDC_BAND_NUM; BandIdx++) { - pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - pAutoChCtrl->AutoChSelCtrl.pScanReqwdev = NULL; - pAutoChCtrl->AutoChSelCtrl.ScanChIdx = 0; - pAutoChCtrl->AutoChSelCtrl.ChListNum = 0; - pAutoChCtrl->AutoChSelCtrl.ACSChStat = ACS_CH_STATE_NONE; - os_zero_mem(pAutoChCtrl->AutoChSelCtrl.AutoChSelChList, - (MAX_NUM_OF_CHANNELS + 1) * - sizeof(AUTOCH_SEL_CH_LIST)); - } - return HC_STATUS_OK; -} -UCHAR hc_init_ACSChCtrlByBandIdx(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - AUTO_CH_CTRL *pAutoChCtrl = HcGetAutoChCtrlbyBandIdx(pAd, BandIdx); - pAutoChCtrl->AutoChSelCtrl.pScanReqwdev = NULL; - pAutoChCtrl->AutoChSelCtrl.ScanChIdx = 0; - pAutoChCtrl->AutoChSelCtrl.ChListNum = 0; - pAutoChCtrl->AutoChSelCtrl.ACSChStat = ACS_CH_STATE_NONE; - os_zero_mem(pAutoChCtrl->AutoChSelCtrl.AutoChSelChList, - (MAX_NUM_OF_CHANNELS + 1) * sizeof(AUTOCH_SEL_CH_LIST)); - return HC_STATUS_OK; -} -#endif - -UCHAR hc_check_ChCtrlChListStat(CHANNEL_CTRL *ChCtrl, CH_LIST_STATE ChListStat) -{ - return (ChCtrl->ChListStat == ChListStat); -} -struct _RTMP_CHIP_DBG *hc_get_chip_dbg(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return &ctrl->chip_dbg; -} - -/* -* -*/ -UINT32 hc_get_hif_type(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->chip_cap.hif_type; -} - -/* -* -*/ -UINT32 hc_get_asic_cap(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->chip_cap.asic_caps; -} - -/* -* -*/ -VOID hc_set_asic_cap(void *hdev_ctrl, UINT32 caps) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - ctrl->chip_cap.asic_caps |= caps; -} - -/* -* -*/ -VOID hc_clear_asic_cap(void *hdev_ctrl, UINT32 caps) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - ctrl->chip_cap.asic_caps &= ~(caps); -} - -/* -* -*/ -UINT8 hc_get_chip_bcn_max_num(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->chip_cap.BcnMaxNum; -} - -/* -* -*/ -UINT8 hc_get_chip_bcn_hw_num(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->chip_cap.BcnMaxHwNum; -} - -/* -* -*/ -BOOLEAN hc_get_chip_wapi_sup(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->chip_cap.FlgIsHwWapiSup; -} - -/* -* -*/ -inline VOID *hc_get_hif_ctrl(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->hif; -} - -/* -* -*/ -VOID *hc_get_os_cookie(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->cookie; -} - -/* -* -*/ -VOID *hc_get_mcu_ctrl(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->mcu_ctrl; -} - -/* -* -*/ -struct _RTMP_ARCH_OP *hc_get_asic_ops(void *hdev_ctrl) -{ - struct hdev_ctrl *ctrl = hdev_ctrl; - - return ctrl->arch_ops; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl.c deleted file mode 100644 index ac01dc7781..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl.c +++ /dev/null @@ -1,1644 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - hw_ctrl.c -*/ -#include "rt_config.h" -#include "hw_ctrl.h" -#include "hw_ctrl_basic.h" -#ifdef VENDOR_FEATURE7_SUPPORT -#ifdef WSC_LED_SUPPORT -#include "rt_led.h" -#endif /* WSC_LED_SUPPORT */ -#endif - -static NTSTATUS HwCtrlUpdateRtsThreshold(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - struct rts_thld *rts = (struct rts_thld *)CMDQelmt->buffer; - - AsicUpdateRtsThld(pAd, rts->wdev, rts->pkt_thld, rts->len_thld, - rts->retry_limit); - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlUpdateProtect(RTMP_ADAPTER *pAd) -{ - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - UINT32 mode = 0, wdev_idx = 0; - struct wifi_dev *wdev = NULL; - MT_PROTECT_CTRL_T protect; -#ifdef DBDC_MODE - MT_PROTECT_CTRL_T protect_5g; -#endif /* DBDC_MODE */ - os_zero_mem(&protect, sizeof(MT_PROTECT_CTRL_T)); -#ifdef DBDC_MODE - os_zero_mem(&protect_5g, sizeof(MT_PROTECT_CTRL_T)); -#endif /* DBDC_MODE */ - - if (arch_ops->archUpdateProtect == NULL) { - AsicNotSupportFunc(pAd, __func__); - return NDIS_STATUS_FAILURE; - } - - do { - wdev = pAd->wdev_list[wdev_idx]; - - if (wdev == NULL) - break; - - mode = wdev->protection; -#ifdef DBDC_MODE - - if ((pAd->CommonCfg.dbdc_mode == TRUE) && - (HcGetBandByWdev(wdev) == DBDC_BAND1)) { -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#ifdef APCLI_CERT_SUPPORT - - if ((pAd->bApCliCertTest == TRUE) && - (wdev->wdev_type == WDEV_TYPE_APCLI)) - os_zero_mem(&protect_5g, - sizeof(MT_PROTECT_CTRL_T)); - -#endif /* APCLI_CERT_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - - if (mode & SET_PROTECT(ERP)) - protect_5g.erp_mask = ERP_OMAC_ALL; - - if (mode & SET_PROTECT(NON_MEMBER_PROTECT)) { - protect_5g.mix_mode = 1; - protect_5g.gf = 1; - protect_5g.bw40 = 1; - } - - if (mode & SET_PROTECT(HT20_PROTECT)) - protect_5g.bw40 = 1; - - if (mode & SET_PROTECT(NON_HT_MIXMODE_PROTECT)) { - protect_5g.mix_mode = 1; - protect_5g.gf = 1; - protect_5g.bw40 = 1; - } - - if (mode & SET_PROTECT(GREEN_FIELD_PROTECT)) - protect_5g.gf = 1; - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE)) - protect_5g.long_nav = 1; - - if (mode & SET_PROTECT(LONG_NAV_PROTECT)) - protect_5g.long_nav = 1; - - if (mode & SET_PROTECT(RIFS_PROTECT)) { - protect_5g.long_nav = 1; - protect_5g.rifs = 1; - } - - if (mode & SET_PROTECT(FORCE_RTS_PROTECT)) { - arch_ops->archUpdateRtsThld( - pAd, wdev, 0, 1, - wlan_operate_get_rts_retry_limit(wdev)); - goto end; - } - - protect_5g.band_idx = DBDC_BAND1; - } else -#endif /* DBDC_MODE */ - { -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#ifdef APCLI_CERT_SUPPORT - - if ((pAd->bApCliCertTest == TRUE) && - (wdev->wdev_type == WDEV_TYPE_APCLI)) - os_zero_mem(&protect, - sizeof(MT_PROTECT_CTRL_T)); - -#endif /* APCLI_CERT_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - - if (mode & SET_PROTECT(ERP)) - protect.erp_mask = ERP_OMAC_ALL; - - if (mode & SET_PROTECT(NON_MEMBER_PROTECT)) { - protect.mix_mode = 1; - protect.gf = 1; - protect.bw40 = 1; - } - - if (mode & SET_PROTECT(HT20_PROTECT)) - protect.bw40 = 1; - - if (mode & SET_PROTECT(NON_HT_MIXMODE_PROTECT)) { - protect.mix_mode = 1; - protect.gf = 1; - protect.bw40 = 1; - } - - if (mode & SET_PROTECT(GREEN_FIELD_PROTECT)) - protect.gf = 1; - - /* if (mode & SET_PROTECT(RDG)) { */ - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE)) - protect.long_nav = 1; - - if (mode & SET_PROTECT(LONG_NAV_PROTECT)) - protect.long_nav = 1; - - if (mode & SET_PROTECT(RIFS_PROTECT)) { - protect.long_nav = 1; - protect.rifs = 1; - } - - if (mode & SET_PROTECT(FORCE_RTS_PROTECT)) { - arch_ops->archUpdateRtsThld( - pAd, wdev, 0, 1, - wlan_operate_get_rts_retry_limit(wdev)); - goto end; - } - } - - if (mode & SET_PROTECT(_NOT_DEFINE_HT_PROTECT)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR] NOT Defined HT Protection!\n")); - } - - wdev_idx++; - } while (wdev_idx < WDEV_NUM_MAX); - - arch_ops->archUpdateProtect(pAd, &protect); -#ifdef DBDC_MODE - - if (pAd->CommonCfg.dbdc_mode == TRUE) - arch_ops->archUpdateProtect(pAd, &protect_5g); - -#endif /* DBDC_MODE */ -end: - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlSetClientMACEntry(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PRT_SET_ASIC_WCID pInfo; - - pInfo = (PRT_SET_ASIC_WCID)CMDQelmt->buffer; - AsicUpdateRxWCIDTable(pAd, pInfo->WCID, pInfo->Addr, pInfo->IsBMC, - pInfo->IsReset); - return NDIS_STATUS_SUCCESS; -} - -#ifdef TXBF_SUPPORT -static NTSTATUS HwCtrlSetClientBfCap(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PMAC_TABLE_ENTRY pMacEntry; - - pMacEntry = (PMAC_TABLE_ENTRY)CMDQelmt->buffer; - AsicUpdateClientBfCap(pAd, pMacEntry); - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlSetBfRepeater(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PMAC_TABLE_ENTRY pMacEntry; - - pMacEntry = (PMAC_TABLE_ENTRY)CMDQelmt->buffer; -#ifdef MAC_REPEATER_SUPPORT -#ifdef CONFIG_AP_SUPPORT - AsicTxBfReptClonedStaToNormalSta(pAd, pMacEntry->wcid, - pMacEntry->MatchReptCliIdx); -#endif /* CONFIG_AP_SUPPORT */ -#endif /* MAC_REPEATER_SUPPORT */ - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlAdjBfSounding(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PMT_STA_BF_ADJ prMtStaBfAdj = NULL; - UCHAR ucConnState; - struct wifi_dev *wdev = NULL; - - prMtStaBfAdj = (PMT_STA_BF_ADJ)CMDQelmt->buffer; - - if (prMtStaBfAdj) { - ucConnState = prMtStaBfAdj->ConnectionState; - wdev = prMtStaBfAdj->wdev; - } - - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlTxBfTxApply(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PUCHAR pTxBfApply; - - pTxBfApply = (PUCHAR)CMDQelmt->buffer; -#ifdef BACKGROUND_SCAN_SUPPORT - BfSwitch(pAd, *pTxBfApply); -#endif - return NDIS_STATUS_SUCCESS; -} - -#endif /* TXBF_SUPPORT */ - -static NTSTATUS HwCtrlDelAsicWcid(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - RT_SET_ASIC_WCID SetAsicWcid; - - SetAsicWcid = *((PRT_SET_ASIC_WCID)(CMDQelmt->buffer)); - - if (!VALID_WCID(SetAsicWcid.WCID) && (SetAsicWcid.WCID != WCID_ALL)) - return NDIS_STATUS_FAILURE; - - AsicDelWcidTab(pAd, SetAsicWcid.WCID); - return NDIS_STATUS_SUCCESS; -} - -#ifdef HTC_DECRYPT_IOT -static NTSTATUS HwCtrlSetAsicWcidAAD_OM(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - RT_SET_ASIC_AAD_OM SetAsicAAD_OM; - - SetAsicAAD_OM = *((PRT_SET_ASIC_AAD_OM)(CMDQelmt->buffer)); - AsicSetWcidAAD_OM(pAd, SetAsicAAD_OM.WCID, SetAsicAAD_OM.Value); - return NDIS_STATUS_SUCCESS; -} -#endif /* HTC_DECRYPT_IOT */ - -#ifdef MBSS_AS_WDS_AP_SUPPORT -static NTSTATUS HwCtrlUpdate4Addr_HdrTrans(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - RT_ASIC_4ADDR_HDR_TRANS Update_4Addr_Hdr_Trans; - Update_4Addr_Hdr_Trans = - *((PRT_ASIC_4ADDR_HDR_TRANS)(CMDQelmt->buffer)); - - AsicSetWcid4Addr_HdrTrans(pAd, Update_4Addr_Hdr_Trans.Wcid, - Update_4Addr_Hdr_Trans.Enable); - - return NDIS_STATUS_SUCCESS; -} -#endif -static void update_txop_level(UINT16 *dst, UINT16 *src, UINT32 bitmap, - UINT32 len) -{ - UINT32 prio; - - for (prio = 0; prio < len; prio++) { - if (bitmap & (1 << prio)) { - if (*(dst + prio) < *(src + prio)) - *(dst + prio) = *(src + prio); - } - } -} - -static void tx_burst_arbiter(struct _RTMP_ADAPTER *pAd, - struct wifi_dev *curr_wdev, UCHAR bss_idx) -{ - struct wifi_dev **wdev = pAd->wdev_list; - UINT32 idx = 0; - UINT32 _prio_bitmap = 0; - UINT16 txop_level = TXOP_0; - UINT16 _txop_level[MAX_PRIO_NUM] = { 0 }; - UINT8 prio; - UINT8 curr_prio = PRIO_DEFAULT; - EDCA_PARM *edca_param = NULL; - UCHAR wmm_idx = 0; - - edca_param = HcGetEdca(pAd, curr_wdev); - - if (edca_param == NULL) - return; - - wmm_idx = edca_param->WmmSet; - - /* judge the final prio bitmap for specific BSS */ - do { - if (wdev[idx] == NULL) - break; - - if (wdev[idx]->bss_info_argument.ucBssIndex == bss_idx) { - _prio_bitmap |= wdev[idx]->prio_bitmap; - update_txop_level(_txop_level, wdev[idx]->txop_level, - _prio_bitmap, MAX_PRIO_NUM); - } - - idx++; - } while (idx < WDEV_NUM_MAX); - - /* update specific BSS's prio bitmap & txop_level array */ - curr_wdev->bss_info_argument.prio_bitmap = _prio_bitmap; - memcpy(curr_wdev->bss_info_argument.txop_level, _txop_level, - (sizeof(UINT16) * MAX_PRIO_NUM)); - - /* find the highest prio module */ - for (prio = 0; prio < MAX_PRIO_NUM; prio++) { - if (_prio_bitmap & (1 << prio)) - curr_prio = prio; - } - - txop_level = curr_wdev->bss_info_argument.txop_level[curr_prio]; - AsicSetWmmParam(pAd, wmm_idx, WMM_AC_BE, WMM_PARAM_TXOP, txop_level); -} - -static void set_tx_burst(struct _RTMP_ADAPTER *pAd, - struct _tx_burst_cfg *txop_cfg) -{ - struct _BSS_INFO_ARGUMENT_T *bss_info = NULL; - UCHAR bss_idx = 0; - - if (txop_cfg->enable) { - txop_cfg->wdev->prio_bitmap |= (1 << txop_cfg->prio); - txop_cfg->wdev->txop_level[txop_cfg->prio] = - txop_cfg->txop_level; - } else - txop_cfg->wdev->prio_bitmap &= ~(1 << txop_cfg->prio); - - bss_info = &txop_cfg->wdev->bss_info_argument; - bss_idx = bss_info->ucBssIndex; - tx_burst_arbiter(pAd, txop_cfg->wdev, bss_idx); -} - -void hw_set_tx_burst(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT8 ac_type, UINT8 prio, UINT16 level, UINT8 enable) -{ - struct _tx_burst_cfg txop_cfg; - - if (wdev == NULL) - return; - - txop_cfg.wdev = wdev; - txop_cfg.prio = prio; - txop_cfg.ac_type = ac_type; - txop_cfg.txop_level = level; - txop_cfg.enable = enable; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n -%s: prio=%x, level=%x, enable=%x\n", - __builtin_return_address(0), __func__, prio, level, enable)); - set_tx_burst(pAd, &txop_cfg); -} - -static NTSTATUS HwCtrlSetTxBurst(struct _RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - struct _tx_burst_cfg *txop_cfg = - (struct _tx_burst_cfg *)CMDQelmt->buffer; - - if (txop_cfg == NULL) - return NDIS_STATUS_FAILURE; - - set_tx_burst(pAd, txop_cfg); - return NDIS_STATUS_SUCCESS; -} - -#ifdef CONFIG_AP_SUPPORT -static NTSTATUS HwCtrlAPAdjustEXPAckTime(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CmdThread::CMDTHREAD_AP_ADJUST_EXP_ACK_TIME\n")); - RTMP_IO_WRITE32(pAd, EXP_ACK_TIME, 0x005400ca); - } - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlAPRecoverEXPAckTime(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CmdThread::CMDTHREAD_AP_RECOVER_EXP_ACK_TIME\n")); - RTMP_IO_WRITE32(pAd, EXP_ACK_TIME, 0x002400ca); - } - return NDIS_STATUS_SUCCESS; -} -#endif /* CONFIG_AP_SUPPORT */ - -static NTSTATUS HwCtrlUpdateRawCounters(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(line:%d)\n", __func__, __LINE__)); - NICUpdateRawCounters(pAd); - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlAddRemoveKeyTab(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - ASIC_SEC_INFO *pInfo; - - pInfo = (PASIC_SEC_INFO)CMDQelmt->buffer; - AsicAddRemoveKeyTab(pAd, pInfo); - return NDIS_STATUS_SUCCESS; -} - -#ifdef MAC_REPEATER_SUPPORT -static NTSTATUS HwCtrlAddReptEntry(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PADD_REPT_ENTRY_STRUC pInfo; - struct wifi_dev *wdev = NULL; - UCHAR *pAddr = NULL; - - pInfo = (PADD_REPT_ENTRY_STRUC)CMDQelmt->buffer; - wdev = pInfo->wdev; - pAddr = pInfo->arAddr; - RTMPInsertRepeaterEntry(pAd, wdev, pAddr); - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlRemoveReptEntry(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PREMOVE_REPT_ENTRY_STRUC pInfo; - UCHAR func_tb_idx; - UCHAR CliIdx; - - pInfo = (PREMOVE_REPT_ENTRY_STRUC)CMDQelmt->buffer; - func_tb_idx = pInfo->func_tb_idx; - CliIdx = pInfo->CliIdx; - RTMPRemoveRepeaterEntry(pAd, func_tb_idx, CliIdx); - return NDIS_STATUS_SUCCESS; -} -#endif /*MAC_REPEATER_SUPPORT*/ - -#ifdef MT_MAC -#ifdef OCE_SUPPORT -static NTSTATUS HwCtrlSetFdFrameOffload(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PMT_SET_FD_FRAME_OFFLOAD pSetFdFrameOffload = - (PMT_SET_FD_FRAME_OFFLOAD)CMDQelmt->buffer; - P_CMD_FD_FRAME_OFFLOAD_T pFd_frame_offload = NULL; - struct wifi_dev *wdev = pAd->wdev_list[pSetFdFrameOffload->WdevIdx]; - - os_alloc_mem(NULL, (PUCHAR *)&pFd_frame_offload, - sizeof(CMD_FD_FRAME_OFFLOAD_T)); - - if (!pFd_frame_offload) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("can not allocate fd_frame_offload\n")); - return NDIS_STATUS_FAILURE; - } - - os_zero_mem(pFd_frame_offload, sizeof(CMD_FD_FRAME_OFFLOAD_T)); - - pFd_frame_offload->ucEnable = pSetFdFrameOffload->ucEnable; - pFd_frame_offload->ucWlanIdx = 0; - pFd_frame_offload->ucOwnMacIdx = wdev->OmacIdx; - pFd_frame_offload->ucBandIdx = HcGetBandByWdev(wdev); - - if (pFd_frame_offload->ucEnable) { - pFd_frame_offload->u2TimestampFieldPos = - pSetFdFrameOffload->u2TimestampFieldPos; - pFd_frame_offload->u2PktLength = - pSetFdFrameOffload->u2PktLength; - os_move_mem(pFd_frame_offload->acPktContent, - pSetFdFrameOffload->acPktContent, - pFd_frame_offload->u2PktLength); - } - - hex_dump_with_lvl("FD_FRAME HwCtrlSetFdFrameOffload", - pFd_frame_offload->acPktContent, - pFd_frame_offload->u2PktLength, DBG_LVL_TRACE); - - MtCmdFdFrameOffloadSet(pAd, pFd_frame_offload); - - os_free_mem(pFd_frame_offload); - - return NDIS_STATUS_SUCCESS; -} -#endif /* OCE_SUPPORT */ - -#ifdef BCN_OFFLOAD_SUPPORT -static NTSTATUS HwCtrlSetBcnOffload(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PMT_SET_BCN_OFFLOAD pSetBcnOffload = - (PMT_SET_BCN_OFFLOAD)CMDQelmt->buffer; - struct wifi_dev *wdev = pAd->wdev_list[pSetBcnOffload->WdevIdx]; - - CMD_BCN_OFFLOAD_T *bcn_offload = NULL; - - BCN_BUF_STRUC *bcn_buf = NULL; -#ifdef CONFIG_AP_SUPPORT - TIM_BUF_STRUC *tim_buf = NULL; -#endif - UCHAR *buf; - PNDIS_PACKET *pkt = NULL; - - os_alloc_mem(NULL, (PUCHAR *)&bcn_offload, sizeof(*bcn_offload)); - if (!bcn_offload) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("can not allocate bcn_offload\n")); - return NDIS_STATUS_FAILURE; - } - os_zero_mem(bcn_offload, sizeof(*bcn_offload)); - - if ((pSetBcnOffload->OffloadPktType == PKT_BCN) -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - || (pSetBcnOffload->OffloadPktType == PKT_V2_BCN) -#endif - ) { - bcn_buf = &wdev->bcn_buf; - - if (!bcn_buf) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): bcn_buf is NULL!\n", __func__)); - os_free_mem(bcn_offload); - return NDIS_STATUS_FAILURE; - } - - pkt = bcn_buf->BeaconPkt; - } - -#ifdef CONFIG_AP_SUPPORT - else { /* tim pkt case in AP mode. */ - if (pAd->OpMode == OPMODE_AP) - tim_buf = &wdev->bcn_buf.tim_buf; - - if (!tim_buf) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): tim_buf is NULL!\n", __func__)); - os_free_mem(bcn_offload); - return NDIS_STATUS_FAILURE; - } - - pkt = tim_buf->TimPkt; - } - -#endif /* CONFIG_AP_SUPPORT */ - bcn_offload->ucEnable = pSetBcnOffload->Enable; - bcn_offload->ucWlanIdx = 0; /* hardcode at present */ - bcn_offload->ucOwnMacIdx = wdev->OmacIdx; - bcn_offload->ucBandIdx = HcGetBandByWdev(wdev); - bcn_offload->u2PktLength = pSetBcnOffload->WholeLength; - bcn_offload->ucPktType = pSetBcnOffload->OffloadPktType; -#ifdef CONFIG_AP_SUPPORT - bcn_offload->u2TimIePos = pSetBcnOffload->TimIePos; - bcn_offload->u2CsaIePos = pSetBcnOffload->CsaIePos; - bcn_offload->ucCsaCount = wdev->csa_count; -#endif - buf = (UCHAR *)GET_OS_PKT_DATAPTR(pkt); - NdisCopyMemory(bcn_offload->acPktContent, buf, - pSetBcnOffload->WholeLength); - - MtCmdBcnOffloadSet(pAd, bcn_offload); - - os_free_mem(bcn_offload); - - return NDIS_STATUS_SUCCESS; -} -#endif /*BCN_OFFLOAD_SUPPORT*/ - -static NTSTATUS HwCtrlSetTREntry(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PRT_SET_TR_ENTRY pInfo; - MAC_TABLE_ENTRY *pEntry; - - pInfo = (PRT_SET_TR_ENTRY)CMDQelmt->buffer; - pEntry = (MAC_TABLE_ENTRY *)pInfo->pEntry; - TRTableInsertEntry(pAd, pInfo->WCID, pEntry); - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlUpdateBssInfo(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - BSS_INFO_ARGUMENT_T *pBssInfoArgs = - (BSS_INFO_ARGUMENT_T *)CMDQelmt->buffer; - UINT32 ret; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::CmdThread\n", __func__)); - ret = AsicBssInfoUpdate(pAd, *pBssInfoArgs); - return ret; -} - -static NTSTATUS HwCtrlSetBaRec(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - MT_BA_CTRL_T *pSetBaRec = (MT_BA_CTRL_T *)CMDQelmt->buffer; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::CmdThread\n", __func__)); - AsicUpdateBASession(pAd, pSetBaRec->Wcid, pSetBaRec->Tid, pSetBaRec->Sn, - pSetBaRec->BaWinSize, pSetBaRec->isAdd, - pSetBaRec->BaSessionType); - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlHandleUpdateBeacon(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - MT_UPDATE_BEACON *prMtUpdateBeacon = - (MT_UPDATE_BEACON *)CMDQelmt->buffer; - struct wifi_dev *wdev = prMtUpdateBeacon->wdev; - UCHAR UpdateReason = prMtUpdateBeacon->UpdateReason; - UCHAR i; - BOOLEAN UpdateAfterTim = FALSE; - BCN_BUF_STRUC *pbcn_buf = NULL; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Update reason: %d\n", __func__, UpdateReason)); - - switch (UpdateReason) { - case BCN_UPDATE_INIT: - case BCN_UPDATE_IF_STATE_CHG: - case BCN_UPDATE_IE_CHG: - case BCN_UPDATE_AP_RENEW: { - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (wdev != NULL) { -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - UpdateBeaconProc(pAd, wdev, UpdateAfterTim, - PKT_V2_BCN, TRUE); -#else - UpdateBeaconProc(pAd, wdev, UpdateAfterTim, - PKT_BCN, TRUE); -#endif - } else { - /* Update/Renew all BSS if wdev = NULL */ - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - UpdateBeaconProc( - pAd, pAd->wdev_list[i], - UpdateAfterTim, - PKT_V2_BCN, TRUE); -#else - UpdateBeaconProc( - pAd, pAd->wdev_list[i], - UpdateAfterTim, PKT_BCN, - TRUE); -#endif - } - } - } - } - } break; - - case BCN_UPDATE_ENABLE_TX: { - if (wdev != NULL) { - pbcn_buf = &wdev->bcn_buf; - - if (WDEV_WITH_BCN_ABILITY(wdev) && - wdev->bAllowBeaconing) { - if (pbcn_buf->BcnUpdateMethod == - BCN_GEN_BY_FW) { - wdev->bcn_buf.bBcnSntReq = TRUE; -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - UpdateBeaconProc(pAd, wdev, - UpdateAfterTim, - PKT_V2_BCN, TRUE); -#else - UpdateBeaconProc(pAd, wdev, - UpdateAfterTim, - PKT_BCN, TRUE); -#endif - } else - AsicEnableBeacon(pAd, wdev); - } - } - } break; - - case BCN_UPDATE_DISABLE_TX: { - if (wdev != NULL) { - pbcn_buf = &wdev->bcn_buf; - - if (WDEV_WITH_BCN_ABILITY(wdev)) { - if (pbcn_buf->BcnUpdateMethod == - BCN_GEN_BY_FW) { - wdev->bcn_buf.bBcnSntReq = FALSE; - /* No need to make beacon */ -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - UpdateBeaconProc(pAd, wdev, - UpdateAfterTim, - PKT_V2_BCN, FALSE); -#else - UpdateBeaconProc(pAd, wdev, - UpdateAfterTim, - PKT_BCN, FALSE); -#endif - } else - AsicDisableBeacon(pAd, wdev); - } - } - } break; - - case BCN_UPDATE_PRETBTT: { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef AP_QLOAD_SUPPORT - ULONG UpTime; - /* update channel utilization */ - NdisGetSystemUpTime(&UpTime); - QBSS_LoadUpdate(pAd, UpTime); -#endif /* AP_QLOAD_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - RRM_QuietUpdata(pAd); -#endif /* DOT11K_RRM_SUPPORT */ - UpdateAfterTim = TRUE; - updateBeaconRoutineCase(pAd, UpdateAfterTim); - } - -#endif /* CONFIG_AP_SUPPORT */ - } break; - - case BCN_UPDATE_TIM: { -#ifdef CONFIG_AP_SUPPORT - APMakeAllTimFrame(pAd); -#endif - } break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Wrong Update reason: %d\n", __func__, - UpdateReason)); - break; - } - - return NDIS_STATUS_SUCCESS; -} - -#ifdef ERR_RECOVERY - -static INT ErrRecoveryMcuIntEvent(RTMP_ADAPTER *pAd, UINT32 status) -{ - UINT32 u4McuInitEvent = MT_MCU_INT_EVENT; - UINT32 IntStatus = 0; - - IntStatus |= status; - - RTMP_IO_WRITE32(pAd, u4McuInitEvent, IntStatus); /* write 1 to clear */ - -#if defined(MT7622) - if (IS_MT7622(pAd)) { - mt7622_trigger_intr_to_mcu(TRUE); - mt7622_trigger_intr_to_mcu(FALSE); - } -#endif - - return TRUE; -} - -static INT ErrRecoveryStopPdmaAccess(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl) -{ - if (pErrRecoveryCtl == NULL) - return FALSE; - - pErrRecoveryCtl->errRecovState = ERR_RECOV_STOP_PDMA0; - return TRUE; -} - -static INT ErrRecoveryStopPdmaAccessDone(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl) -{ - if (pErrRecoveryCtl == NULL) - return FALSE; - - pErrRecoveryCtl->errRecovState = ERR_RECOV_STOP_IDLE_DONE; - return TRUE; -} - -static INT ErrRecoveryReinitPdma(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl) -{ - if (pErrRecoveryCtl == NULL) - return FALSE; - - pErrRecoveryCtl->errRecovState = ERR_RECOV_RESET_PDMA0; - return TRUE; -} - -static INT ErrRecoveryWaitN9Normal(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl) -{ - if (pErrRecoveryCtl == NULL) - return FALSE; - - pErrRecoveryCtl->errRecovState = ERR_RECOV_WAIT_N9_NORMAL; - return TRUE; -} - -static INT ErrRecoveryEventReentry(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl) -{ - if (pErrRecoveryCtl == NULL) - return FALSE; - - pErrRecoveryCtl->errRecovState = ERR_RECOV_EVENT_REENTRY; - return TRUE; -} - -static INT ErrRecoveryDone(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl) -{ - if (pErrRecoveryCtl == NULL) - return FALSE; - - pErrRecoveryCtl->errRecovState = ERR_RECOV_STOP_IDLE; - return TRUE; -} - -static UINT32 ErrRecoveryTimeDiff(UINT32 time1, UINT32 time2) -{ - UINT32 timeDiff = 0; - - if (time1 > time2) - timeDiff = (0xFFFFFFFF - time1 + 1) + time2; - else - timeDiff = time2 - time1; - - return timeDiff; -} - -void SerTimeLogDump(RTMP_ADAPTER *pAd) -{ - UINT32 idx = 0; - UINT32 *pSerTimes = NULL; - - if (pAd == NULL) - return; - - pSerTimes = &pAd->HwCtrl.ser_times[0]; - - for (idx = SER_TIME_ID_T0; idx < SER_TIME_ID_END; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s,::E R , Time[%d](us)=%u\n", __func__, idx, - pSerTimes[idx])); - } - - for (idx = SER_TIME_ID_T0; idx < (SER_TIME_ID_END - 1); idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s,::E R , T%d - T%d(us)=%u\n", __func__, idx + 1, - idx, - ErrRecoveryTimeDiff(pSerTimes[idx], - pSerTimes[idx + 1]))); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s,::E R , Total Time(us)=%u\n", __func__, - ErrRecoveryTimeDiff(pSerTimes[SER_TIME_ID_T0], - pSerTimes[SER_TIME_ID_T7]))); -} - -VOID ser_sys_reset(RTMP_STRING *arg) -{ -#ifdef SDK_TIMER_WDG - /*kernel_restart(NULL);*/ - panic(arg); /* trigger SDK WATCHDOG TIMER */ -#endif /* SDK_TIMER_WDG */ -} - -static void ErrRecoveryEndDriverRestore(RTMP_ADAPTER *pAd) -{ - POS_COOKIE pObj; - struct tm_ops *tm_ops = pAd->tm_hif_ops; - PCI_HIF_T *pci_hif = &pAd->PciHif; - - pci_hif->IntPending |= (MT_INT_RX | MT_INT_RX_DLY); - pObj = (POS_COOKIE)pAd->OS_Cookie; -#if defined(RTMP_MAC_PCI) || defined(RTMP_MAC_USB) - tm_ops->schedule_task(pAd, TR_DONE_TASK); -#endif /* defined(RTMP_MAC_PCI) || defined(RTMP_MAC_USB) */ -} - -NTSTATUS HwRecoveryFromError(RTMP_ADAPTER *pAd) -{ - UINT32 Status; - UINT32 Stat; - ERR_RECOVERY_CTRL_T *pErrRecoveryCtrl; - UINT32 Highpart, Lowpart; - UINT32 *pSerTimes = NULL; - - if (!pAd) - return NDIS_STATUS_INVALID_DATA; - -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Ser():The driver is in ATE mode now\n")); - //return NDIS_STATUS_SUCCESS; - } - -#endif /* CONFIG_ATE */ - pErrRecoveryCtrl = &pAd->ErrRecoveryCtl; - -Label: - Status = pAd->HwCtrl.ser_status; - Stat = ErrRecoveryCurStat(pErrRecoveryCtrl); - pSerTimes = &pAd->HwCtrl.ser_times[0]; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Ser ,::E R , stat=0x%08X\n", Stat)); - /*wlan hook for ser*/ - WLAN_HOOK_CALL(WLAN_HOOK_SER, pAd, pErrRecoveryCtrl); - - switch (Stat) { - case ERR_RECOV_STOP_IDLE: - case ERR_RECOV_EVENT_REENTRY: - if ((Status & ERROR_DETECT_STOP_PDMA) == - ERROR_DETECT_STOP_PDMA) { - os_zero_mem(pSerTimes, - (sizeof(pSerTimes[SER_TIME_ID_T0]) * - SER_TIME_ID_END)); - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T0] = Lowpart; - /* Stop access PDMA. */ - ErrRecoveryStopPdmaAccessDone(pErrRecoveryCtrl); - /* send PDMA0 stop to N9 through interrupt. */ - ErrRecoveryMcuIntEvent(pAd, MCU_INT_PDMA0_STOP_DONE); - /* all mmio need to be stop till hw reset done. */ - pAd->bPCIclkOff = TRUE; - RtmpusecDelay( - 100 * - 1000); /* delay for 100 ms to wait reset done. */ - pAd->bPCIclkOff = FALSE; - /*re-call for change status to stop dma0*/ - HwRecoveryFromError(pAd); - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T1] = Lowpart; - } else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!! SER CurStat=%u Event=%x!!!\n", - ErrRecoveryCurStat(pErrRecoveryCtrl), - Status)); - } - - break; - - case ERR_RECOV_STOP_PDMA0: - if ((Status & ERROR_DETECT_RESET_DONE) == - ERROR_DETECT_RESET_DONE) { - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T2] = Lowpart; - tm_exit(pAd); - qm_exit(pAd); -#ifdef RESOURCE_PRE_ALLOC - RTMPResetTxRxRingMemory(pAd); -#endif - cut_through_deinit((PKT_TOKEN_CB **)&pAd->PktTokenCb); - - WfHifInit(pAd); - qm_init(pAd); - tm_init(pAd); - RT28XXDMAEnable(pAd); - HIF_IO_WRITE32(pAd, MT_WPDMA_MEM_RNG_ERR, 0); - ErrRecoveryReinitPdma(pErrRecoveryCtrl); - /* send PDMA0 reinit done to N9 through interrupt. */ - ErrRecoveryMcuIntEvent(pAd, MCU_INT_PDMA0_INIT_DONE); - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T3] = Lowpart; - } else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!! SER CurStat=%u Event=%x!!!\n", - ErrRecoveryCurStat(pErrRecoveryCtrl), - Status)); - } - - break; - - case ERR_RECOV_RESET_PDMA0: - if ((Status & ERROR_DETECT_RECOVERY_DONE) == - ERROR_DETECT_RECOVERY_DONE) { - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T4] = Lowpart; - ErrRecoveryWaitN9Normal(pErrRecoveryCtrl); - ErrRecoveryMcuIntEvent(pAd, - MCU_INT_PDMA0_RECOVERY_DONE); - pSerTimes[SER_TIME_ID_T5] = Lowpart; - } else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!! SER CurStat=%u Event=%x!!!\n", - ErrRecoveryCurStat(pErrRecoveryCtrl), - Status)); - } - - break; - - case ERR_RECOV_WAIT_N9_NORMAL: - if ((Status & ERROR_DETECT_N9_NORMAL_STATE) == - ERROR_DETECT_N9_NORMAL_STATE) { - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T6] = Lowpart; - ErrRecoveryDone(pErrRecoveryCtrl); - /* update Beacon frame if operating in AP mode. */ - UpdateBeaconHandler(pAd, NULL, BCN_UPDATE_AP_RENEW); - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T7] = Lowpart; - /*print out ser log timing*/ - SerTimeLogDump(pAd); - ErrRecoveryEndDriverRestore(pAd); - } else if ((Status & ERROR_DETECT_STOP_PDMA) == - ERROR_DETECT_STOP_PDMA) { - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T6] = Lowpart; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!! ERROR SER re-entry CurStat=%u Event=%x!!!\n", - ErrRecoveryCurStat(pErrRecoveryCtrl), Status)); - MtAsicGetTsfTimeByDriver(pAd, &Highpart, &Lowpart, - HW_BSSID_0); - pSerTimes[SER_TIME_ID_T7] = Lowpart; - /*print out ser log timing*/ - SerTimeLogDump(pAd); - ErrRecoveryEventReentry(pErrRecoveryCtrl); - HwRecoveryFromError(pAd); - } else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!! SER CurStat=%u Event=%x!!!\n", - ErrRecoveryCurStat(pErrRecoveryCtrl), - Status)); - } - - break; - - case ERR_RECOV_STOP_IDLE_DONE: - ErrRecoveryStopPdmaAccess(pErrRecoveryCtrl); - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!! SER CurStat=%u Event=%x!!!\n", - ErrRecoveryCurStat(pErrRecoveryCtrl), Status)); - break; - } - - if (Status != pAd->HwCtrl.ser_status) { - goto Label; - } - - return NDIS_STATUS_SUCCESS; -} -#endif /* ERR_RECOVERY */ - -#endif - -/*STA part*/ - -#ifdef HOST_RESUME_DONE_ACK_SUPPORT -static NTSTATUS hw_ctrl_host_resume_done_ack(struct _RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->HostResumeDoneAck != NULL) - ops->HostResumeDoneAck(pAd); - - return NDIS_STATUS_SUCCESS; -} -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ - -static NTSTATUS HwCtrlNICUpdateRawCounters(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - NICUpdateRawCounters(pAd); - return NDIS_STATUS_SUCCESS; -} - -/*Pheripheral Handler*/ -static NTSTATUS HwCtrlCheckGPIO(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - return NDIS_STATUS_SUCCESS; -} - -#ifdef LED_CONTROL_SUPPORT -static NTSTATUS HwCtrlSetLEDStatus(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - UCHAR LEDStatus = *((PUCHAR)(CMDQelmt->buffer)); - - RTMPSetLEDStatus(pAd, LEDStatus); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: CMDTHREAD_SET_LED_STATUS (LEDStatus = %d)\n", __func__, - LEDStatus)); - return NDIS_STATUS_SUCCESS; -} -#endif /* LED_CONTROL_SUPPORT */ - -#ifdef WSC_INCLUDED -#ifdef WSC_LED_SUPPORT -/*WPS LED MODE 10*/ -static NTSTATUS HwCtrlLEDWPSMode10(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - UINT WPSLedMode10 = *((PUINT)(CMDQelmt->buffer)); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("WPS LED mode 10::ON or Flash or OFF : %x\n", WPSLedMode10)); - - switch (WPSLedMode10) { - case LINK_STATUS_WPS_MODE10_TURN_ON: - RTMPSetLEDStatus(pAd, LED_WPS_MODE10_TURN_ON); - break; - - case LINK_STATUS_WPS_MODE10_FLASH: - RTMPSetLEDStatus(pAd, LED_WPS_MODE10_FLASH); - break; - - case LINK_STATUS_WPS_MODE10_TURN_OFF: - RTMPSetLEDStatus(pAd, LED_WPS_MODE10_TURN_OFF); - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("WPS LED mode 10:: No this status %d!!!\n", - WPSLedMode10)); - break; - } - - return NDIS_STATUS_SUCCESS; -} -#endif /* WSC_LED_SUPPORT */ -#endif /* WSC_INCLUDED */ - -#ifdef VOW_SUPPORT -#ifdef CONFIG_AP_SUPPORT -static NTSTATUS HwCtrlSetStaDWRR(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - MT_VOW_STA_GROUP *pVoW = (MT_VOW_STA_GROUP *)(CMDQelmt->buffer); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: group %d, staid %d\n", __func__, pVoW->GroupIdx, - pVoW->StaIdx)); - vow_set_client(pAd, pVoW->GroupIdx, pVoW->StaIdx); - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlSetStaDWRRQuantum(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - INT32 ret; - MT_VOW_STA_QUANTUM *pVoW = (MT_VOW_STA_QUANTUM *)(CMDQelmt->buffer); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[31m%s: restore %d, quantum %d\x1b[m\n", __func__, - pVoW->restore, pVoW->quantum)); - - if (pVoW->restore) { - if (vow_watf_is_enabled(pAd)) { - pAd->vow_cfg.vow_sta_dwrr_quantum[0] = - pAd->vow_watf_q_lv0; - pAd->vow_cfg.vow_sta_dwrr_quantum[1] = - pAd->vow_watf_q_lv1; - pAd->vow_cfg.vow_sta_dwrr_quantum[2] = - pAd->vow_watf_q_lv2; - pAd->vow_cfg.vow_sta_dwrr_quantum[3] = - pAd->vow_watf_q_lv3; - } else { - pAd->vow_cfg.vow_sta_dwrr_quantum[0] = - VOW_STA_DWRR_QUANTUM0; - pAd->vow_cfg.vow_sta_dwrr_quantum[1] = - VOW_STA_DWRR_QUANTUM1; - pAd->vow_cfg.vow_sta_dwrr_quantum[2] = - VOW_STA_DWRR_QUANTUM2; - pAd->vow_cfg.vow_sta_dwrr_quantum[3] = - VOW_STA_DWRR_QUANTUM3; - } - } else { - UINT8 ac; - /* 4 ac with the same quantum */ - for (ac = 0; ac < WMM_NUM_OF_AC; ac++) - pAd->vow_cfg.vow_sta_dwrr_quantum[ac] = pVoW->quantum; - } - - ret = vow_set_sta(pAd, 0x0, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_ALL); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[31m%s: ret %d\x1b[m\n", __func__, ret)); - - return NDIS_STATUS_SUCCESS; -} - -#endif /* CONFIG_AP_SUPPORT */ -#endif /* VOW_SUPPORT */ - -#ifdef THERMAL_PROTECT_SUPPORT -static NTSTATUS HwCtrlThermalProtRadioOff(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:\n", __func__)); - /* Set Radio off Process*/ - Set_RadioOn_Proc(pAd, "0"); - return NDIS_STATUS_SUCCESS; -} -#endif /* THERMAL_PROTECT_SUPPORT */ - -static NTSTATUS HwCtrlUpdateRssi(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - RssiUpdate(pAd); - return NDIS_STATUS_SUCCESS; -} - -#ifdef ETSI_RX_BLOCKER_SUPPORT -static NTSTATUS HwCtrlCheckRssi(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - /* Check RSSI on evey 100 ms */ - CheckRssi(pAd); - return NDIS_STATUS_SUCCESS; -} -#endif /* end of ETSI_RX_BLOCKER_SUPPORT */ - -static NTSTATUS HwCtrlGetTemperature(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - UINT32 temperature = 0; - /*ActionIdx 0 means get temperature*/ - MtCmdGetThermalSensorResult(pAd, 0, &temperature); - os_move_mem(CMDQelmt->RspBuffer, &temperature, CMDQelmt->RspBufferLen); - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlGetTxStatistic(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - TX_STAT_STRUC *pTxStat = (PTX_STAT_STRUC)CMDQelmt->buffer; - struct _MAC_TABLE_ENTRY *pEntry; - struct _STA_TR_ENTRY *tr_entry; - struct wifi_dev *wdev; - UCHAR dbdc_idx = 0; - - if (!VALID_UCAST_ENTRY_WCID(pAd, pTxStat->Wcid)) - return NDIS_STATUS_SUCCESS; - - pEntry = &pAd->MacTab.Content[pTxStat->Wcid]; - - if (IS_ENTRY_NONE(pEntry)) - return NDIS_STATUS_SUCCESS; - - wdev = pEntry->wdev; - - if (!wdev) - return NDIS_STATUS_SUCCESS; - - dbdc_idx = HcGetBandByWdev(wdev); - - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; - - if (tr_entry->StaRec.ConnectionState != STATE_PORT_SECURE) - return NDIS_STATUS_SUCCESS; - - mt_cmd_get_sta_tx_statistic(pAd, pTxStat->Wcid, dbdc_idx, - pTxStat->Field); -#endif - return NDIS_STATUS_SUCCESS; -} - -static NTSTATUS HwCtrlRadioOnOff(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PRADIO_ON_OFF_T pRadioOnOff = (PRADIO_ON_OFF_T)CMDQelmt->buffer; - - AsicRadioOnOffCtrl(pAd, pRadioOnOff->ucDbdcIdx, pRadioOnOff->ucRadio); - return NDIS_STATUS_SUCCESS; -} - -#ifdef GREENAP_SUPPORT -static NTSTATUS HwCtrlGreenAPOnOff(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - PGREENAP_ON_OFF_T pGreenAP = (PGREENAP_ON_OFF_T)CMDQelmt->buffer; - - AsicGreenAPOnOffCtrl(pAd, pGreenAP->ucDbdcIdx, pGreenAP->ucGreenAPOn); - return NDIS_STATUS_SUCCESS; -} -#endif /* GREENAP_SUPPORT */ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -static NTSTATUS hw_ctrl_pcie_aspm_dym_ctrl(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - P_PCIE_ASPM_DYM_CTRL_T ppcie_aspm_dym_ctrl = - (P_PCIE_ASPM_DYM_CTRL_T)CMDQelmt->buffer; - - asic_pcie_aspm_dym_ctrl(pAd, ppcie_aspm_dym_ctrl->ucDbdcIdx, - ppcie_aspm_dym_ctrl->fgL1Enable, - ppcie_aspm_dym_ctrl->fgL0sEnable); - - return NDIS_STATUS_SUCCESS; -} -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -static NTSTATUS HwCtrlSetSlotTime(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - SLOT_CFG *pSlotCfg = (SLOT_CFG *)CMDQelmt->buffer; - - AsicSetSlotTime(pAd, pSlotCfg->bUseShortSlotTime, pSlotCfg->Channel, - pSlotCfg->wdev); - return NDIS_STATUS_SUCCESS; -} - -#ifdef PKT_BUDGET_CTRL_SUPPORT -/* -* -*/ -static NTSTATUS HwCtrlSetPbc(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - struct pbc_ctrl *pbc = (struct pbc_ctrl *)CMDQelmt->buffer; - INT32 ret = 0; - UINT8 bssid = (pbc->wdev) ? (pbc->wdev->bss_info_argument.ucBssIndex) : - PBC_BSS_IDX_FOR_ALL; - UINT16 wcid = (pbc->entry) ? (pbc->entry->wcid) : PBC_WLAN_IDX_FOR_ALL; - - ret = MtCmdPktBudgetCtrl(pAd, bssid, wcid, pbc->type); - return ret; -} -#endif /*PKT_BUDGET_CTRL_SUPPORT*/ - -static NTSTATUS HwCtrlSetEdca(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - INT32 ret = 0; - PEDCA_PARM pedca_param = (PEDCA_PARM)CMDQelmt->buffer; - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - ASSERT(arch_ops->archSetEdcaParm); - arch_ops->archSetEdcaParm(pAd, pedca_param); - return ret; -} - -/* -* -*/ -static NTSTATUS HwCtrlWifiSysOpen(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - struct WIFI_SYS_CTRL *wsys = (struct WIFI_SYS_CTRL *)CMDQelmt->buffer; - - if (pAd->HwCtrl.hwctrl_ops.wifi_sys_open) - return pAd->HwCtrl.hwctrl_ops.wifi_sys_open(wsys); - else { - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } -} - -/* -* -*/ -static NTSTATUS HwCtrlWifiSysClose(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - struct WIFI_SYS_CTRL *wsys = (struct WIFI_SYS_CTRL *)CMDQelmt->buffer; - - if (pAd->HwCtrl.hwctrl_ops.wifi_sys_close) - return pAd->HwCtrl.hwctrl_ops.wifi_sys_close(wsys); - else { - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } -} - -/* -* -*/ -static NTSTATUS HwCtrlWifiSysLinkUp(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - struct WIFI_SYS_CTRL *wsys = (struct WIFI_SYS_CTRL *)CMDQelmt->buffer; - - if (pAd->HwCtrl.hwctrl_ops.wifi_sys_link_up) - return pAd->HwCtrl.hwctrl_ops.wifi_sys_link_up(wsys); - else { - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } -} - -/* -* -*/ -static NTSTATUS HwCtrlWifiSysLinkDown(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - struct WIFI_SYS_CTRL *wsys = (struct WIFI_SYS_CTRL *)CMDQelmt->buffer; - - if (pAd->HwCtrl.hwctrl_ops.wifi_sys_link_down) - return pAd->HwCtrl.hwctrl_ops.wifi_sys_link_down(wsys); - else { - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } -} - -/* -* -*/ -static NTSTATUS HwCtrlWifiSysPeerLinkDown(RTMP_ADAPTER *pAd, - HwCmdQElmt *CMDQelmt) -{ - struct WIFI_SYS_CTRL *wsys = (struct WIFI_SYS_CTRL *)CMDQelmt->buffer; - - if (pAd->HwCtrl.hwctrl_ops.wifi_sys_disconnt_act) - return pAd->HwCtrl.hwctrl_ops.wifi_sys_disconnt_act(wsys); - else { - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } -} - -/* -* -*/ -static NTSTATUS HwCtrlWifiSysPeerLinkUp(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - struct WIFI_SYS_CTRL *wsys = (struct WIFI_SYS_CTRL *)CMDQelmt->buffer; - - if (pAd->HwCtrl.hwctrl_ops.wifi_sys_connt_act) - return pAd->HwCtrl.hwctrl_ops.wifi_sys_connt_act(wsys); - else { - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } -} - -/* -* -*/ -static NTSTATUS HwCtrlWifiSysPeerUpdate(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - struct WIFI_SYS_CTRL *wsys = (struct WIFI_SYS_CTRL *)CMDQelmt->buffer; - - if (pAd->HwCtrl.hwctrl_ops.wifi_sys_peer_update) - return pAd->HwCtrl.hwctrl_ops.wifi_sys_peer_update(wsys); - else { - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } -} - -#ifdef MBO_SUPPORT -static NTSTATUS HwCtrlBssTermination(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt) -{ - struct wifi_dev *wdev = (struct wifi_dev *)CMDQelmt->buffer; - UCHAR RfIC = 0; - - RfIC = wmode_2_rfic(wdev->PhyMode); - - if (!wdev->if_up_down_state) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("==>HwCtrlBssTermination (%s) but IF is done, ignore!!! (wdev_idx %d)\n", - "OFF", wdev->wdev_idx)); - return TRUE; - } - - if (IsHcRadioCurStatOffByChannel(pAd, wdev->channel)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("==>HwCtrlBssTermination (%s) equal to current state, ignore!!! (wdev_idx %d)\n", - "OFF", wdev->wdev_idx)); - return TRUE; - } - - MlmeRadioOff(pAd, wdev); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==>HwCtrlBssTermination (OFF)\n")); - - return NDIS_STATUS_SUCCESS; -} -#endif - -/*HWCMD_TYPE_RADIO*/ -static HW_CMD_TABLE_T HwCmdRadioTable[] = { - { HWCMD_ID_UPDATE_DAW_COUNTER, HwCtrlUpdateRawCounters, 0 }, -#ifdef MT_MAC - { HWCMD_ID_SET_CLIENT_MAC_ENTRY, HwCtrlSetClientMACEntry, 0 }, -#ifdef TXBF_SUPPORT - { HWCMD_ID_SET_APCLI_BF_CAP, HwCtrlSetClientBfCap, 0 }, - { HWCMD_ID_SET_APCLI_BF_REPEATER, HwCtrlSetBfRepeater, 0 }, - { HWCMD_ID_ADJUST_STA_BF_SOUNDING, HwCtrlAdjBfSounding, 0 }, - { HWCMD_ID_TXBF_TX_APPLY_CTRL, HwCtrlTxBfTxApply, 0 }, -#endif - { HWCMD_ID_SET_TR_ENTRY, HwCtrlSetTREntry, 0 }, - { HWCMD_ID_SET_BA_REC, HwCtrlSetBaRec, 0 }, - { HWCMD_ID_UPDATE_BSSINFO, HwCtrlUpdateBssInfo, 0 }, - { HWCMD_ID_UPDATE_BEACON, HwCtrlHandleUpdateBeacon, 0 }, - { HWCMD_ID_SET_TX_BURST, HwCtrlSetTxBurst, 0 }, -#endif /*MT_MAC*/ -#ifdef CONFIG_AP_SUPPORT - { HWCMD_ID_AP_ADJUST_EXP_ACK_TIME, HwCtrlAPAdjustEXPAckTime, 0 }, - { HWCMD_ID_AP_RECOVER_EXP_ACK_TIME, HwCtrlAPRecoverEXPAckTime, 0 }, -#endif -#ifdef VOW_SUPPORT -#ifdef CONFIG_AP_SUPPORT - { HWCMD_ID_SET_STA_DWRR, HwCtrlSetStaDWRR, 0 }, - { HWCMD_ID_SET_STA_DWRR_QUANTUM, HwCtrlSetStaDWRRQuantum, 0 }, -#endif /* CONFIG_AP_SUPPORT */ -#endif /* VOW_SUPPORT */ - { HWCMD_ID_UPDATE_RSSI, HwCtrlUpdateRssi, 0 }, - { HWCMD_ID_GET_TEMPERATURE, HwCtrlGetTemperature, 0 }, - { HWCMD_ID_SET_SLOTTIME, HwCtrlSetSlotTime, 0 }, -#ifdef ETSI_RX_BLOCKER_SUPPORT - { HWCMD_RX_CHECK_RSSI, HwCtrlCheckRssi, 0 }, -#endif /* end of ETSI_RX_BLOCKER_SUPPORT */ -#ifdef BCN_OFFLOAD_SUPPORT - { HWCMD_ID_SET_BCN_OFFLOAD, HwCtrlSetBcnOffload, 0 }, -#endif -#ifdef OCE_SUPPORT - { HWCMD_ID_SET_FD_FRAME_OFFLOAD, HwCtrlSetFdFrameOffload, 0 }, -#endif /* OCE_SUPPORT */ - -#ifdef MAC_REPEATER_SUPPORT - { HWCMD_ID_ADD_REPT_ENTRY, HwCtrlAddReptEntry, 0 }, - { HWCMD_ID_REMOVE_REPT_ENTRY, HwCtrlRemoveReptEntry, 0 }, -#endif -#ifdef THERMAL_PROTECT_SUPPORT - { HWCMD_ID_THERMAL_PROTECTION_RADIOOFF, HwCtrlThermalProtRadioOff, 0 }, -#endif /* THERMAL_PROTECT_SUPPORT */ - { HWCMD_ID_RADIO_ON_OFF, HwCtrlRadioOnOff, 0 }, -#ifdef GREENAP_SUPPORT - { HWCMD_ID_GREENAP_ON_OFF, HwCtrlGreenAPOnOff, 0 }, -#endif /* GREENAP_SUPPORT */ -#ifdef MBO_SUPPORT - { HWCMD_ID_BSS_TERMINATION, HwCtrlBssTermination, 0 }, -#endif /* MBO_SUPPORT */ -#ifdef MBSS_AS_WDS_AP_SUPPORT - { HWCMD_ID_UPDATE_4ADDR_HDR_TRANS, HwCtrlUpdate4Addr_HdrTrans, 0 }, -#endif - { HWCMD_ID_END, NULL, 0 } -}; - -/*HWCMD_TYPE_SECURITY*/ -static HW_CMD_TABLE_T HwCmdSecurityTable[] = { { HWCMD_ID_ADDREMOVE_ASIC_KEY, - HwCtrlAddRemoveKeyTab, 0 }, - { HWCMD_ID_END, NULL, 0 } }; - -/*HWCMD_TYPE_PERIPHERAL*/ -static HW_CMD_TABLE_T HwCmdPeripheralTable[] = { - { HWCMD_ID_GPIO_CHECK, HwCtrlCheckGPIO, 0 }, -#ifdef WSC_INCLUDED -#ifdef WSC_LED_SUPPORT - { HWCMD_ID_LED_WPS_MODE10, HwCtrlLEDWPSMode10, 0 }, -#endif -#endif -#ifdef LED_CONTROL_SUPPORT - { HWCMD_ID_SET_LED_STATUS, HwCtrlSetLEDStatus, 0 }, -#endif - { HWCMD_ID_END, NULL, 0 } -}; - -/*HWCMD_TYPE_HT_CAP*/ -static HW_CMD_TABLE_T HwCmdHtCapTable[] = { - { HWCMD_ID_DEL_ASIC_WCID, HwCtrlDelAsicWcid, 0 }, -#ifdef HTC_DECRYPT_IOT - { HWCMD_ID_SET_ASIC_AAD_OM, HwCtrlSetAsicWcidAAD_OM, 0 }, -#endif /* HTC_DECRYPT_IOT */ - { HWCMD_ID_END, NULL, 0 } -}; - -/*HWCMD_TYPE_PS*/ -static HW_CMD_TABLE_T HwCmdPsTable[] = { -#ifdef MT_MAC -#endif - { HWCMD_ID_PERODIC_CR_ACCESS_NIC_UPDATE_RAW_COUNTERS, - HwCtrlNICUpdateRawCounters, 0 }, -#ifdef HOST_RESUME_DONE_ACK_SUPPORT - { HWCMD_ID_HOST_RESUME_DONE_ACK, hw_ctrl_host_resume_done_ack, 0 }, -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - { HWCMD_ID_PCIE_ASPM_DYM_CTRL, hw_ctrl_pcie_aspm_dym_ctrl, 0 }, -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - { HWCMD_ID_END, NULL, 0 } -}; - -/*HWCMD_TYPE_WIFISYS*/ -static HW_CMD_TABLE_T HwCmdWifiSysTable[] = { - { HWCMD_ID_WIFISYS_LINKDOWN, HwCtrlWifiSysLinkDown, 0 }, - { HWCMD_ID_WIFISYS_LINKUP, HwCtrlWifiSysLinkUp, 0 }, - { HWCMD_ID_WIFISYS_OPEN, HwCtrlWifiSysOpen, 0 }, - { HWCMD_ID_WIFISYS_CLOSE, HwCtrlWifiSysClose, 0 }, - { HWCMD_ID_WIFISYS_PEER_LINKDOWN, HwCtrlWifiSysPeerLinkDown, 0 }, - { HWCMD_ID_WIFISYS_PEER_LINKUP, HwCtrlWifiSysPeerLinkUp, 0 }, - { HWCMD_ID_WIFISYS_PEER_UPDATE, HwCtrlWifiSysPeerUpdate, 0 }, - { HWCMD_ID_GET_TX_STATISTIC, HwCtrlGetTxStatistic, 0 }, - { HWCMD_ID_END, NULL, 0 } -}; - -/*HWCMD_TYPE_WMM*/ -static HW_CMD_TABLE_T HwCmdWmmTable[] = { -#ifdef PKT_BUDGET_CTRL_SUPPORT - { HWCMD_ID_PBC_CTRL, HwCtrlSetPbc, 0 }, -#endif /*PKT_BUDGET_CTRL_SUPPORT*/ - { HWCMD_ID_SET_EDCA, HwCtrlSetEdca, 0 }, - { HWCMD_ID_END, NULL, 0 } -}; - -/*HWCMD_TYPE_PROTECT*/ -static HW_CMD_TABLE_T HwCmdProtectTable[] = { { HWCMD_ID_RTS_THLD, - HwCtrlUpdateRtsThreshold, 0 }, - { HWCMD_ID_END, NULL, 0 } }; - -/*Order can't be changed, follow HW_CMD_TYPE order definition*/ -HW_CMD_TABLE_T *HwCmdTable[] = { - HwCmdRadioTable, HwCmdSecurityTable, HwCmdPeripheralTable, - HwCmdHtCapTable, HwCmdPsTable, HwCmdWifiSysTable, - HwCmdWmmTable, HwCmdProtectTable, NULL -}; - -HW_FLAG_TABLE_T HwFlagTable[] = { { HWFLAG_ID_UPDATE_PROTECT, - HwCtrlUpdateProtect, 0 }, - { HWFLAG_ID_END, NULL, 0 } }; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_basic.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_basic.c deleted file mode 100644 index 641b103158..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_basic.c +++ /dev/null @@ -1,661 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - hw_ctrl_basic.c -*/ -#include "rt_config.h" -#include "hw_ctrl_basic.h" - -extern HW_CMD_TABLE_T *HwCmdTable[]; -extern HW_FLAG_TABLE_T HwFlagTable[]; - -/*==========================================================/ - // Basic Command API implement / -/==========================================================*/ -static inline HwCmdHdlr HwCtrlValidCmd(HwCmdQElmt *CmdQelmt) -{ - UINT32 CmdType = CmdQelmt->type; - UINT32 CmdIndex = CmdQelmt->command; - SHORT CurIndex = 0; - HwCmdHdlr Handler = NULL; - HW_CMD_TABLE_T *pHwTargetTable = NULL; - - if (CmdType >= HWCMD_TYPE_END) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CMD TPYE(%u) OOB error! HWCMD_TYPE_END %u\n", - CmdType, HWCMD_TYPE_END)); - return NULL; - } - - if (CmdIndex >= HWCMD_ID_END) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CMD ID(%u) OOB error! HWCMD_ID_END %u\n", CmdIndex, - HWCMD_ID_END)); - return NULL; - } - - pHwTargetTable = HwCmdTable[CmdType]; - - if (!pHwTargetTable) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("No HwCmdTable entry for this CMD %u Type %u\n", - CmdIndex, CmdType)); - return NULL; - } - - CurIndex = 0; - - do { - if (pHwTargetTable[CurIndex].CmdID == CmdIndex) { - Handler = pHwTargetTable[CurIndex].CmdHdlr; - pHwTargetTable[CurIndex].RfCnt++; - break; - } - - CurIndex++; - } while (pHwTargetTable[CurIndex].CmdHdlr != NULL); - - if (Handler == NULL) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("No corresponding CMDHdlr for this CMD %u Type %u\n", - CmdIndex, CmdType)); - } - - return Handler; -} - -static inline HwFlagHdlr HwCtrlValidFlag(PHwFlagCtrl pHwCtrlFlag) -{ - SHORT CurIndex = 0; - HwFlagHdlr Handler = NULL; - - if (pHwCtrlFlag->FlagId > (1 << HWFLAG_ID_END)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("FLAG ID(%x) is out of boundary\n", - pHwCtrlFlag->FlagId)); - pHwCtrlFlag->FlagId = 0; - return NULL; - } - - CurIndex = 0; - - do { - if (HwFlagTable[CurIndex].FlagId & pHwCtrlFlag->FlagId) { - Handler = HwFlagTable[CurIndex].FlagHdlr; - /*Unmask flag*/ - pHwCtrlFlag->FlagId &= ~(HwFlagTable[CurIndex].FlagId); - HwFlagTable[CurIndex].RfCnt++; - break; - } - - CurIndex++; - } while (HwFlagTable[CurIndex].FlagHdlr != NULL); - - if (Handler == NULL) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("No corresponding FlagHdlr for this FlagID(%x)\n", - pHwCtrlFlag->FlagId)); - pHwCtrlFlag->FlagId = 0; - } - - return Handler; -} - -static VOID HwCtrlDequeueCmd(HwCmdQ *cmdq, HwCmdQElmt **pcmdqelmt) -{ - *pcmdqelmt = cmdq->head; - - if (*pcmdqelmt != NULL) { - cmdq->head = cmdq->head->next; - cmdq->size--; - - if (cmdq->size == 0) - cmdq->tail = NULL; - } -} - -static VOID free_hwcmd(os_kref *ref) -{ - struct _HwCmdQElmt *cmd = container_of(ref, struct _HwCmdQElmt, refcnt); - - if (cmd->NeedWait) - RTMP_OS_EXIT_COMPLETION(&cmd->ack_done); - - if (cmd->buffer != NULL) { - os_free_mem(cmd->buffer); - cmd->buffer = NULL; - } - os_free_mem(cmd); -} - -static VOID HwCtrlCmdHandler(RTMP_ADAPTER *pAd) -{ - PHwCmdQElmt cmdqelmt; - NDIS_STATUS NdisStatus = NDIS_STATUS_SUCCESS; - NTSTATUS ntStatus; - HwCmdHdlr Handler = NULL; - HW_CTRL_T *pHwCtrl = &pAd->HwCtrl; - UINT32 process_cnt = 0; - - while (pAd && pHwCtrl->HwCtrlQ.size > 0) { - NdisStatus = NDIS_STATUS_SUCCESS; - - /* For worst case, avoid process HwCtrlQ too long which cause RCU_sched stall */ - process_cnt++; - /* process_cnt-16 */ - if ((!in_interrupt()) && - (process_cnt >= (MAX_LEN_OF_HWCTRL_QUEUE >> 4))) { - process_cnt = 0; - OS_SCHEDULE(); - } - - NdisAcquireSpinLock(&pHwCtrl->HwCtrlQLock); - HwCtrlDequeueCmd(&pHwCtrl->HwCtrlQ, &cmdqelmt); - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - - if (cmdqelmt == NULL) - break; - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) && - RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) { - Handler = HwCtrlValidCmd(cmdqelmt); - - if (Handler) { - ntStatus = Handler(pAd, cmdqelmt); - - if (cmdqelmt->CallbackFun) - cmdqelmt->CallbackFun( - pAd, cmdqelmt->CallbackArgs); - } - } -#ifdef DBG_STARVATION - starv_dbg_put(&cmdqelmt->starv); -#endif /*DBG_STARVATION*/ - - /*complete*/ - if (cmdqelmt->NeedWait) - RTMP_OS_COMPLETE(&cmdqelmt->ack_done); - - os_kref_put(&cmdqelmt->refcnt, free_hwcmd); - } /* end of while */ -} - -static VOID HwCtrlFlagHandler(RTMP_ADAPTER *pAd) -{ - HW_CTRL_T *pHwCtrl = &pAd->HwCtrl; - PHwFlagCtrl pHwCtrlFlag = &pHwCtrl->HwCtrlFlag; - NTSTATUS ntStatus; - HwFlagHdlr Handler = NULL; - HwFlagCtrl HwCtrlFlag; - - NdisAcquireSpinLock(&pHwCtrl->HwCtrlQLock); - HwCtrlFlag.FlagId = pHwCtrlFlag->FlagId; - HwCtrlFlag.IsFlagSet = pHwCtrlFlag->IsFlagSet; - pHwCtrlFlag->FlagId = 0; - pHwCtrlFlag->IsFlagSet = 0; - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - while (HwCtrlFlag.FlagId) { - Handler = HwCtrlValidFlag(&HwCtrlFlag); - - if (Handler) - ntStatus = Handler(pAd); - } - } -} - -static INT HwCtrlThread(ULONG Context) -{ - RTMP_ADAPTER *pAd; - RTMP_OS_TASK *pTask; - HwCmdQElmt *pCmdQElmt = NULL; - HW_CTRL_T *pHwCtrl; - int status; - - status = 0; - pTask = (RTMP_OS_TASK *)Context; - pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask); - - if (pAd == NULL) - return 0; - - pHwCtrl = &pAd->HwCtrl; - RtmpOSTaskCustomize(pTask); - NdisAcquireSpinLock(&pHwCtrl->HwCtrlQLock); - pHwCtrl->HwCtrlQ.CmdQState = RTMP_TASK_STAT_RUNNING; - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - - while (pHwCtrl->HwCtrlQ.CmdQState == RTMP_TASK_STAT_RUNNING) { - if (RtmpOSTaskWait(pAd, pTask, &status) == FALSE) { - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); - break; - } - - if (pHwCtrl->HwCtrlQ.CmdQState == RTMP_TASK_STAT_STOPED) - break; - - /*every time check command formate event*/ - HwCtrlCmdHandler(pAd); - - /*support flag type*/ - if (pHwCtrl->HwCtrlFlag.IsFlagSet) - HwCtrlFlagHandler(pAd); - - pHwCtrl->TotalCnt++; - } - - /* Clear the CmdQElements. */ - NdisAcquireSpinLock(&pHwCtrl->HwCtrlQLock); - pHwCtrl->HwCtrlQ.CmdQState = RTMP_TASK_STAT_STOPED; - - while (pHwCtrl->HwCtrlQ.size) { - HwCtrlDequeueCmd(&pHwCtrl->HwCtrlQ, &pCmdQElmt); - - if (pCmdQElmt) { -#ifdef DBG_STARVATION - starv_dbg_put(&pCmdQElmt->starv); -#endif /*DBG_STARVATION*/ - /*complete*/ - if (pCmdQElmt->NeedWait) - RTMP_OS_COMPLETE(&pCmdQElmt->ack_done); - - os_kref_put(&pCmdQElmt->refcnt, free_hwcmd); - } - } - - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("<---%s\n", __func__)); - RtmpOSTaskNotifyToExit(pTask); - return 0; -} - -#ifdef ERR_RECOVERY -static INT ser_ctrl_task(ULONG context) -{ - RTMP_ADAPTER *pAd; - RTMP_OS_TASK *task; - HW_CTRL_T *hw_ctrl; - int status = 0; - - task = (RTMP_OS_TASK *)context; - pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(task); - - if (pAd == NULL) - return 0; - - hw_ctrl = &pAd->HwCtrl; - RtmpOSTaskCustomize(task); - NdisAcquireSpinLock(&hw_ctrl->ser_lock); - hw_ctrl->ser_func_state = RTMP_TASK_STAT_RUNNING; - NdisReleaseSpinLock(&hw_ctrl->ser_lock); - - while (task && !RTMP_OS_TASK_IS_KILLED(task)) { - if (RtmpOSTaskWait(pAd, task, &status) == FALSE) - break; - - HwRecoveryFromError(pAd); - } - - NdisAcquireSpinLock(&hw_ctrl->ser_lock); - hw_ctrl->ser_func_state = RTMP_TASK_STAT_UNKNOWN; - NdisReleaseSpinLock(&hw_ctrl->ser_lock); - status = RtmpOSTaskNotifyToExit(task); - return status; -} - -INT ser_init(RTMP_ADAPTER *pAd) -{ - INT Status = 0; - HW_CTRL_T *hw_ctrl = &pAd->HwCtrl; - RTMP_OS_TASK *task = &hw_ctrl->ser_task; - - NdisAllocateSpinLock(pAd, &hw_ctrl->ser_lock); - hw_ctrl->ser_func_state = RTMP_TASK_STAT_INITED; - RTMP_OS_TASK_INIT(task, "ser_task", pAd); - Status = RtmpOSTaskAttach(task, ser_ctrl_task, (ULONG)task); - - if (Status == NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: unable to start %s\n", - RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), __func__)); - return NDIS_STATUS_FAILURE; - } - - return TRUE; -} - -INT ser_exit(RTMP_ADAPTER *pAd) -{ - INT32 ret; - HW_CTRL_T *hw_ctrl = &pAd->HwCtrl; - /*kill task*/ - ret = RtmpOSTaskKill(&hw_ctrl->ser_task); - NdisFreeSpinLock(&hw_ctrl->ser_lock); - return ret; -} -#endif /* ERR_RECOVERY */ - -#ifdef DBG_STARVATION -static void hwctrl_starv_timeout_handle(struct starv_dbg *starv, - struct starv_log_entry *entry) -{ - struct _HwCmdQElmt *cmd = - container_of(starv, struct _HwCmdQElmt, starv); - struct _HW_CTRL_T *hw_ctrl = starv->block->priv; - struct starv_log_basic *log = NULL; - - os_alloc_mem(NULL, (UCHAR **)&log, sizeof(struct starv_log_basic)); - if (log) { - log->qsize = hw_ctrl->HwCtrlQ.size; - log->id = cmd->command; - entry->log = log; - } -} - -static void hwctrl_starv_block_init(struct starv_log *ctrl, - struct _HW_CTRL_T *hw_ctrl) -{ - struct starv_dbg_block *block = &hw_ctrl->block; - - strncpy(block->name, "hwctrl", sizeof(block->name)); - block->priv = hw_ctrl; - block->ctrl = ctrl; - block->timeout = 100; - block->timeout_fn = hwctrl_starv_timeout_handle; - block->log_fn = starv_timeout_log_basic; - register_starv_block(block); -} - -#endif /*DBG_STARVATION*/ - -/* - ======================================================================== - - Routine Description: - - Arguments: - - Return Value: - - IRQL = - - Note: - - ======================================================================== -*/ -UINT32 HwCtrlInit(RTMP_ADAPTER *pAd) -{ - INT Status = 0; - HW_CTRL_T *pHwCtrl = &pAd->HwCtrl; - HwCmdQ *cmdq = &pHwCtrl->HwCtrlQ; - RTMP_OS_TASK *pTask = &pHwCtrl->HwCtrlTask; - -#ifdef DBG_STARVATION - hwctrl_starv_block_init(&pAd->starv_log_ctrl, pHwCtrl); -#endif /*DBG_STARVATION*/ - NdisAllocateSpinLock(pAd, &pHwCtrl->HwCtrlQLock); - NdisAcquireSpinLock(&pHwCtrl->HwCtrlQLock); - cmdq->head = NULL; - cmdq->tail = NULL; - cmdq->size = 0; - cmdq->CmdQState = RTMP_TASK_STAT_INITED; - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - pHwCtrl->TotalCnt = 0; - pTask = &pHwCtrl->HwCtrlTask; - RTMP_OS_TASK_INIT(pTask, "HwCtrlTask", pAd); - Status = RtmpOSTaskAttach(pTask, HwCtrlThread, (ULONG)pTask); - - if (Status == NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: unable to start %s\n", - RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), __func__)); - return NDIS_STATUS_FAILURE; - } - -#ifdef ERR_RECOVERY - Status = ser_init(pAd); -#endif /* ERR_RECOVERY */ - return NDIS_STATUS_SUCCESS; -} - -VOID HwCtrlExit(RTMP_ADAPTER *pAd) -{ - INT32 ret; - HW_CTRL_T *pHwCtrl = &pAd->HwCtrl; - HWCTRL_OP *hwctrl_ops = &pHwCtrl->hwctrl_ops; - /*flush all queued command*/ - HwCtrlCmdHandler(pAd); - /*kill task*/ - ret = RtmpOSTaskKill(&pHwCtrl->HwCtrlTask); - NdisFreeSpinLock(&pHwCtrl->HwCtrlQLock); - hwctrl_ops->wifi_sys_open = NULL; - hwctrl_ops->wifi_sys_close = NULL; - hwctrl_ops->wifi_sys_link_up = NULL; - hwctrl_ops->wifi_sys_link_down = NULL; - hwctrl_ops->wifi_sys_connt_act = NULL; - hwctrl_ops->wifi_sys_disconnt_act = NULL; - hwctrl_ops->wifi_sys_peer_update = NULL; -#ifdef ERR_RECOVERY - ret = ser_exit(pAd); -#endif /* ERR_RECOVERY */ -#ifdef DBG_STARVATION - unregister_starv_block(&pHwCtrl->block); -#endif /*DBG_STARVATION*/ -} - -NDIS_STATUS HwCtrlEnqueueCmd(RTMP_ADAPTER *pAd, HW_CTRL_TXD HwCtrlTxd) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PHwCmdQElmt cmdqelmt = NULL; - PHwCmdQ cmdq = NULL; - UINT32 wait_time = 0; - HW_CTRL_T *pHwCtrl = &pAd->HwCtrl; - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->%s - NIC is not exist!!\n", __func__)); - return NDIS_STATUS_FAILURE; - } - - status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt, sizeof(HwCmdQElmt)); - - if (cmdqelmt == NULL) - return NDIS_STATUS_RESOURCES; - - NdisZeroMemory(cmdqelmt, sizeof(HwCmdQElmt)); - /*initial lock*/ - NdisAllocateSpinLock(NULL, &cmdqelmt->lock); - /*creat wait */ - cmdqelmt->NeedWait = HwCtrlTxd.NeedWait; - /*initial stravation dbg*/ -#ifdef DBG_STARVATION - starv_dbg_init(&pHwCtrl->block, &cmdqelmt->starv); -#endif /*DBG_STARVATION*/ - - if (HwCtrlTxd.NeedWait) - RTMP_OS_INIT_COMPLETION(&cmdqelmt->ack_done); - - if (HwCtrlTxd.InformationBufferLength > 0) { - status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, - HwCtrlTxd.InformationBufferLength); - if (cmdqelmt->buffer == NULL) { - status = NDIS_STATUS_RESOURCES; - goto end; - } - /*initial buffer*/ - os_move_mem(cmdqelmt->buffer, HwCtrlTxd.pInformationBuffer, - HwCtrlTxd.InformationBufferLength); - cmdqelmt->bufferlength = HwCtrlTxd.InformationBufferLength; - } - /*initial cmd element*/ - cmdqelmt->command = HwCtrlTxd.CmdId; - cmdqelmt->type = HwCtrlTxd.CmdType; - cmdqelmt->RspBuffer = HwCtrlTxd.pRespBuffer; - cmdqelmt->RspBufferLen = HwCtrlTxd.RespBufferLength; - cmdqelmt->CallbackFun = HwCtrlTxd.CallbackFun; - cmdqelmt->CallbackArgs = HwCtrlTxd.CallbackArgs; - - /*create reference count*/ - os_kref_init(&cmdqelmt->refcnt); - - NdisAcquireSpinLock(&pHwCtrl->HwCtrlQLock); - /*check queue status*/ - if (!(pHwCtrl->HwCtrlQ.CmdQState & RTMP_TASK_CAN_DO_INSERT)) { - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - status = NDIS_STATUS_FAILURE; - goto end; - } - /*add reference count for cmd due to send to thread*/ - os_kref_get(&cmdqelmt->refcnt); - - /*enqueue to cmdq*/ - cmdq = &pHwCtrl->HwCtrlQ; - - if (cmdq->size == 0) - cmdq->head = cmdqelmt; - else - cmdq->tail->next = cmdqelmt; - - cmdq->tail = cmdqelmt; - cmdqelmt->next = NULL; - cmdq->size++; - - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - /*get stravation */ -#ifdef DBG_STARVATION - starv_dbg_get(&cmdqelmt->starv); -#endif /*DBG_STARVATION*/ - RTCMDUp(&pHwCtrl->HwCtrlTask); - - /*not need wait, goto end directly*/ - if (!HwCtrlTxd.NeedWait) - goto end; - - /*wait handle*/ - wait_time = - HwCtrlTxd.wait_time ? HwCtrlTxd.wait_time : HWCTRL_CMD_TIMEOUT; - if (!RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT( - &cmdqelmt->ack_done, RTMPMsecsToJiffies(wait_time))) { - status = NDIS_STATUS_FAILURE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): HwCtrl CmdTimeout, TYPE:%d,ID:%d!!\n", - __func__, cmdqelmt->type, cmdqelmt->command)); - } -end: - os_kref_put(&cmdqelmt->refcnt, free_hwcmd); - return status; -} - -NDIS_STATUS HwCtrlSetFlag(RTMP_ADAPTER *pAd, INT32 FlagId) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - HW_CTRL_T *pHwCtrl = &pAd->HwCtrl; - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->%s - NIC is not exist!!\n", __func__)); - return NDIS_STATUS_FAILURE; - } - - NdisAcquireSpinLock(&pHwCtrl->HwCtrlQLock); - pHwCtrl->HwCtrlFlag.IsFlagSet = TRUE; - pHwCtrl->HwCtrlFlag.FlagId |= FlagId; - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - /*Send command*/ - RTCMDUp(&pHwCtrl->HwCtrlTask); - return status; -} - -/* -* -*/ -INT Show_HwCtrlStatistic_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - HW_CTRL_T *pHwCtrl = &pAd->HwCtrl; - HW_CMD_TABLE_T *pHwCmdTable = NULL; - UCHAR i = 0, j = 0; - PHwCmdQElmt cmdqelmt = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHwCtrlTask Totaol Ref. Cnt: %d\n", pHwCtrl->TotalCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHwCtrlTask CMD Statistic:\n")); - pHwCmdTable = HwCmdTable[i]; - - while (pHwCmdTable != NULL) { - j = 0; - - while (pHwCmdTable[j].CmdID != HWCMD_ID_END) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCMDID: %d, Handler: %p, RfCnt: %d\n", - pHwCmdTable[j].CmdID, pHwCmdTable[j].CmdHdlr, - pHwCmdTable[j].RfCnt)); - j++; - } - - pHwCmdTable = HwCmdTable[++i]; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHwCtrlTask Flag Statistic:\n")); - i = 0; - - while (HwFlagTable[i].FlagId != HWFLAG_ID_END) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFLAGID: %d, Handler: %p, RfCnt: %d\n", - HwFlagTable[i].FlagId, HwFlagTable[i].FlagHdlr, - HwFlagTable[i].RfCnt)); - i++; - } - - NdisAcquireSpinLock(&pHwCtrl->HwCtrlQLock); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tQueSize: %d\n", pHwCtrl->HwCtrlQ.size)); - cmdqelmt = pHwCtrl->HwCtrlQ.head; - while (cmdqelmt) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTYPE:%d, CID:%d\n", cmdqelmt->type, - cmdqelmt->command)); - cmdqelmt = cmdqelmt->next; - } - NdisReleaseSpinLock(&pHwCtrl->HwCtrlQLock); - return TRUE; -} - -UINT32 HWCtrlOpsReg(RTMP_ADAPTER *pAd) -{ - HW_CTRL_T *pHwCtrl = &pAd->HwCtrl; - HWCTRL_OP *hwctrl_ops = &pHwCtrl->hwctrl_ops; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - /*hook funcion*/ - switch (cap->hw_ops_ver) { -#ifdef WIFI_SYS_FW_V2 - - case HWCTRL_OP_TYPE_V2: - hw_ctrl_ops_v2_register(hwctrl_ops); - break; -#endif /*WIFI_SYS_FW_V2*/ -#ifdef WIFI_SYS_FW_V1 - - case HWCTRL_OP_TYPE_V1: - default: - hw_ctrl_ops_v1_register(hwctrl_ops); - break; -#endif /*WIFI_SYS_FW_V1*/ - } - - return NDIS_STATUS_SUCCESS; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_cmd.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_cmd.c deleted file mode 100644 index 71f6df0987..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_cmd.c +++ /dev/null @@ -1,840 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - hw_ctrl.c -*/ -#include "rt_config.h" - -extern NDIS_STATUS HwCtrlEnqueueCmd(RTMP_ADAPTER *pAd, HW_CTRL_TXD HwCtrlTxd); - -/*Only can used in this file*/ -static INT32 HW_CTRL_BASIC_ENQ(RTMP_ADAPTER *pAd, UINT32 CmdType, UINT32 CmdId, - UINT32 Len, VOID *pBuffer) -{ - HW_CTRL_TXD HwCtrlTxd; - UINT32 ret; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - HwCtrlTxd.CmdType = CmdType; - HwCtrlTxd.CmdId = CmdId; - HwCtrlTxd.NeedWait = FALSE; - HwCtrlTxd.wait_time = 0; - HwCtrlTxd.InformationBufferLength = Len; - HwCtrlTxd.pInformationBuffer = pBuffer; - HwCtrlTxd.pRespBuffer = NULL; - HwCtrlTxd.RespBufferLength = 0; - HwCtrlTxd.CallbackFun = NULL; - HwCtrlTxd.CallbackArgs = NULL; - ret = HwCtrlEnqueueCmd(pAd, HwCtrlTxd); - return ret; -} - -#define HW_CTRL_TXD_BASIC(_pAd, _CmdType, _CmdId, _Len, _pBuffer, _HwCtrlTxd) \ - { \ - _HwCtrlTxd.CmdType = _CmdType; \ - _HwCtrlTxd.CmdId = _CmdId; \ - _HwCtrlTxd.NeedWait = FALSE; \ - _HwCtrlTxd.wait_time = 0; \ - _HwCtrlTxd.InformationBufferLength = _Len; \ - _HwCtrlTxd.pInformationBuffer = _pBuffer; \ - _HwCtrlTxd.pRespBuffer = NULL; \ - _HwCtrlTxd.RespBufferLength = 0; \ - _HwCtrlTxd.CallbackFun = NULL; \ - _HwCtrlTxd.CallbackArgs = NULL; \ - } - -#define HW_CTRL_TXD_RSP(_pAd, _RspLen, _RspBuffer, _wait_time, _HwCtrlTxd) \ - { \ - _HwCtrlTxd.NeedWait = TRUE; \ - _HwCtrlTxd.wait_time = _wait_time; \ - _HwCtrlTxd.pRespBuffer = _RspBuffer; \ - _HwCtrlTxd.RespBufferLength = _RspLen; \ - } - -#define HW_CTRL_TXD_CALLBACK(_pAd, _CallbackFun, _CallbackArgs, _HwCtrlTxd) \ - { \ - _HwCtrlTxd.CallbackFun = _CallbackFun; \ - _HwCtrlTxd.CallbackArgs = _CallbackArgs; \ - } - -/*CMD Definition Start*/ -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -#else -/*Define Export API for common part usage.*/ -VOID RTMP_UPDATE_PROTECT(PRTMP_ADAPTER pAd) -{ - RT_ASIC_PROTECT_INFO AsicProtectInfo; - INT32 ret; - ret = -1; -} - -VOID RTMP_SET_TR_ENTRY(PRTMP_ADAPTER pAd, MAC_TABLE_ENTRY *pEntry) -{ - RT_SET_TR_ENTRY Info; - UINT32 ret; - - Info.WCID = pEntry->wcid; - Info.pEntry = (VOID *)pEntry; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_SET_TR_ENTRY, - sizeof(RT_SET_TR_ENTRY), &Info); -} - -#ifdef CONFIG_AP_SUPPORT - -VOID RTMP_AP_ADJUST_EXP_ACK_TIME(PRTMP_ADAPTER pAd) -{ - UINT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_AP_ADJUST_EXP_ACK_TIME, 0, NULL); -} - -VOID RTMP_AP_RECOVER_EXP_ACK_TIME(PRTMP_ADAPTER pAd) -{ - UINT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_AP_RECOVER_EXP_ACK_TIME, 0, NULL); -} - -#endif /* CONFIG_AP_SUPPORT */ - -VOID RTMP_SET_LED_STATUS(PRTMP_ADAPTER pAd, UCHAR Status) -{ - UINT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_PERIPHERAL, - HWCMD_ID_SET_LED_STATUS, sizeof(UCHAR), - &Status); -} - -VOID RTMP_SET_LED(PRTMP_ADAPTER pAd, UINT32 WPSLedMode10) -{ - UINT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_PERIPHERAL, - HWCMD_ID_LED_WPS_MODE10, sizeof(WPSLedMode10), - &WPSLedMode10); -} -#endif /*defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) */ - -/* PCI, USB, SDIO use the same LP function */ - -#ifdef HOST_RESUME_DONE_ACK_SUPPORT -VOID rtmp_host_resume_done_ack(struct _RTMP_ADAPTER *pAd) -{ - if (HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_PS, HWCMD_ID_HOST_RESUME_DONE_ACK, - 0, NULL) != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_PS, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Failed to enqueue cmd\n", __func__)); - } -} -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ - -VOID RTMP_GET_TEMPERATURE(RTMP_ADAPTER *pAd, UINT32 *pTemperature) -{ - UINT32 ret; - HW_CTRL_TXD HwCtrlTxd; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - HW_CTRL_TXD_BASIC(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_GET_TEMPERATURE, 0, - NULL, HwCtrlTxd); - HW_CTRL_TXD_RSP(pAd, sizeof(UINT32), pTemperature, 0, HwCtrlTxd); - ret = HwCtrlEnqueueCmd(pAd, HwCtrlTxd); -} - -VOID RTMP_RADIO_ON_OFF_CTRL(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, UINT8 ucRadio) -{ - HW_CTRL_TXD HwCtrlTxd; - RADIO_ON_OFF_T RadioOffOn = { 0 }; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - RadioOffOn.ucDbdcIdx = ucDbdcIdx; - RadioOffOn.ucRadio = ucRadio; - HW_CTRL_TXD_BASIC(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_RADIO_ON_OFF, - sizeof(RADIO_ON_OFF_T), &RadioOffOn, HwCtrlTxd); - HW_CTRL_TXD_RSP(pAd, 0, NULL, HWCTRL_CMD_WAITTIME, HwCtrlTxd); - HwCtrlEnqueueCmd(pAd, HwCtrlTxd); -} - -#ifdef MBO_SUPPORT -VOID RTMP_BSS_TERMINATION(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - HW_CTRL_TXD HwCtrlTxd; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - HW_CTRL_TXD_BASIC(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_BSS_TERMINATION, - sizeof(struct wifi_dev), wdev, HwCtrlTxd); - HwCtrlEnqueueCmd(pAd, HwCtrlTxd); -} -#endif /* MBO_SUPPORT */ - -#ifdef GREENAP_SUPPORT -VOID RTMP_GREENAP_ON_OFF_CTRL(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN ucGreenAP) -{ - GREENAP_ON_OFF_T GreenAPCtrl = { 0 }; - - GreenAPCtrl.ucDbdcIdx = ucDbdcIdx; - GreenAPCtrl.ucGreenAPOn = ucGreenAP; - - if (HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_GREENAP_ON_OFF, - sizeof(GREENAP_ON_OFF_T), - &GreenAPCtrl) != NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_PS, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Failed to enqueue cmd\n", __func__)); -} -#endif /* GREENAP_SUPPORT */ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -VOID rtmp_pcie_aspm_dym_ctrl(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN fgL1Enable, BOOLEAN fgL0sEnable) -{ - PCIE_ASPM_DYM_CTRL_T pcie_aspm_dym_ctrl = { 0 }; - - pcie_aspm_dym_ctrl.ucDbdcIdx = ucDbdcIdx; - pcie_aspm_dym_ctrl.fgL1Enable = fgL1Enable; - pcie_aspm_dym_ctrl.fgL0sEnable = fgL0sEnable; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::b(%d),L1(%d),L0s(%d)\n", __func__, ucDbdcIdx, fgL1Enable, - fgL0sEnable)); - - if (HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_PS, HWCMD_ID_PCIE_ASPM_DYM_CTRL, - sizeof(PCIE_ASPM_DYM_CTRL_T), - &pcie_aspm_dym_ctrl) != NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_LVL_TRACE, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Failed to enqueue cmd\n", __func__)); -} -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -VOID RTMP_UPDATE_RAW_COUNTER(PRTMP_ADAPTER pAd) -{ - UINT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_UPDATE_DAW_COUNTER, 0, NULL); -} - -#ifdef MT_MAC - -#if defined(PRETBTT_INT_EVENT_SUPPORT) || defined(BCN_OFFLOAD_SUPPORT) -VOID RTMP_HANDLE_PRETBTT_INT_EVENT(PRTMP_ADAPTER pAd) -{ - UpdateBeaconHandler(pAd, NULL, BCN_UPDATE_PRETBTT); -} -#endif - -VOID HW_ADDREMOVE_KEYTABLE(struct _RTMP_ADAPTER *pAd, - struct _ASIC_SEC_INFO *pInfo) -{ - HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_SECURITY, HWCMD_ID_ADDREMOVE_ASIC_KEY, - sizeof(ASIC_SEC_INFO), pInfo); -} - -VOID HW_SET_DEL_ASIC_WCID(PRTMP_ADAPTER pAd, ULONG Wcid) -{ - RT_SET_ASIC_WCID SetAsicWcid; - - SetAsicWcid.WCID = Wcid; - HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_HT_CAP, HWCMD_ID_DEL_ASIC_WCID, - sizeof(RT_SET_ASIC_WCID), &SetAsicWcid); -} - -#ifdef HTC_DECRYPT_IOT -VOID HW_SET_ASIC_WCID_AAD_OM(PRTMP_ADAPTER pAd, ULONG Wcid, UCHAR value) -{ - RT_SET_ASIC_AAD_OM SetAsicAAD_OM; - - SetAsicAAD_OM.WCID = Wcid; - SetAsicAAD_OM.Value = value; - HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_HT_CAP, HWCMD_ID_SET_ASIC_AAD_OM, - sizeof(RT_SET_ASIC_AAD_OM), &SetAsicAAD_OM); -} -#endif /* HTC_DECRYPT_IOT */ -#ifdef MBSS_AS_WDS_AP_SUPPORT -VOID HW_SET_ASIC_WCID_4ADDR_HDR_TRANS(PRTMP_ADAPTER pAd, ULONG Wcid, - UCHAR IsEnable) -{ - RT_ASIC_4ADDR_HDR_TRANS Update_4Addr_Hdr_Trans; - Update_4Addr_Hdr_Trans.Wcid = Wcid; - Update_4Addr_Hdr_Trans.Enable = IsEnable; - HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_UPDATE_4ADDR_HDR_TRANS, - sizeof(RT_ASIC_4ADDR_HDR_TRANS), - &Update_4Addr_Hdr_Trans); -} -#endif -#ifdef BCN_OFFLOAD_SUPPORT -VOID HW_SET_BCN_OFFLOAD(RTMP_ADAPTER *pAd, UINT8 WdevIdx, ULONG WholeLength, - BOOLEAN Enable, UCHAR OffloadPktType, ULONG TimIePos, - ULONG CsaIePos) -{ - UINT32 ret; - MT_SET_BCN_OFFLOAD rMtSetBcnOffload; - - os_zero_mem(&rMtSetBcnOffload, sizeof(MT_SET_BCN_OFFLOAD)); - rMtSetBcnOffload.WdevIdx = WdevIdx; - rMtSetBcnOffload.WholeLength = WholeLength; - rMtSetBcnOffload.Enable = Enable; - rMtSetBcnOffload.OffloadPktType = OffloadPktType; - rMtSetBcnOffload.TimIePos = TimIePos; - rMtSetBcnOffload.CsaIePos = CsaIePos; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_SET_BCN_OFFLOAD, - sizeof(rMtSetBcnOffload), &rMtSetBcnOffload); -} -#endif /*BCN_OFFLOAD_SUPPORT*/ - -#ifdef OCE_SUPPORT -VOID HW_SET_FD_FRAME_OFFLOAD(RTMP_ADAPTER *pAd, UINT8 WdevIdx, - ULONG WholeLength, BOOLEAN Enable, - UINT16 TimestampPos, UCHAR *Buf) -{ - UINT32 ret; - MT_SET_FD_FRAME_OFFLOAD MtSetFdFrameOffload; - - os_zero_mem(&MtSetFdFrameOffload, sizeof(MT_SET_FD_FRAME_OFFLOAD)); - MtSetFdFrameOffload.WdevIdx = WdevIdx; - MtSetFdFrameOffload.ucEnable = Enable; - - if (MtSetFdFrameOffload.ucEnable) { - MtSetFdFrameOffload.u2TimestampFieldPos = TimestampPos; - MtSetFdFrameOffload.u2PktLength = WholeLength; - os_move_mem(MtSetFdFrameOffload.acPktContent, Buf, - MtSetFdFrameOffload.u2PktLength); - } - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_SET_FD_FRAME_OFFLOAD, - sizeof(MtSetFdFrameOffload), - &MtSetFdFrameOffload); -} -#endif /* OCE_SUPPORT */ - -VOID HW_UPDATE_BSSINFO(RTMP_ADAPTER *pAd, BSS_INFO_ARGUMENT_T *BssInfoArgs) -{ - UINT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_UPDATE_BSSINFO, - sizeof(BSS_INFO_ARGUMENT_T), BssInfoArgs); -} - -VOID HW_SET_BA_REC(RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid, UINT16 sn, - UCHAR basize, BOOLEAN isAdd, INT ses_type) -{ - UINT32 ret; - MT_BA_CTRL_T SetBaRec; - - os_zero_mem(&SetBaRec, sizeof(MT_BA_CTRL_T)); - SetBaRec.Wcid = wcid; - SetBaRec.Tid = tid; - SetBaRec.Sn = sn; - SetBaRec.BaWinSize = basize; - SetBaRec.isAdd = isAdd; - SetBaRec.BaSessionType = ses_type; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_SET_BA_REC, - sizeof(MT_BA_CTRL_T), &SetBaRec); -} - -#ifdef ERR_RECOVERY -VOID RTMP_MAC_RECOVERY(struct _RTMP_ADAPTER *pAd, UINT32 Status) -{ - UINT32 value = 0; - -#if defined(MT7615) || defined(MT7622) || defined(P18) - if (IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd)) - value = Status & ERROR_DETECT_MASK; -#endif - - /* Trigger error recovery process with fw reload. */ - if (pAd->HwCtrl.ser_func_state != RTMP_TASK_STAT_RUNNING) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::ERR! SER func not ready(%d)\n", __func__, - pAd->HwCtrl.ser_func_state)); - /* TODO: do we may hit this case? */ - return; - } - - if (value != pAd->HwCtrl.ser_status) { - pAd->HwCtrl.ser_status = value; - RTCMDUp(&pAd->HwCtrl.ser_task); - } else { - /* TODO: do we may hit this case? */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::ERR! prev state=%x, new stat=%x\n", __func__, - pAd->HwCtrl.ser_status, value)); - } -} - -INT IsStopingPdma(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl) -{ - return (pErrRecoveryCtl->errRecovState == ERR_RECOV_STOP_IDLE) ? FALSE : - TRUE; -} - -BOOLEAN IsErrRecoveryInIdleStat(RTMP_ADAPTER *pAd) -{ - UINT32 Stat; - - if (pAd == NULL) - return TRUE; - - Stat = ErrRecoveryCurStat(&pAd->ErrRecoveryCtl); - - if (Stat == ERR_RECOV_STOP_IDLE) - return TRUE; - else - return FALSE; -} - -ERR_RECOVERY_STATE ErrRecoveryCurStat(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl) -{ - if (pErrRecoveryCtl == NULL) - return ERR_RECOV_STOP_IDLE; - - return pErrRecoveryCtl->errRecovState; -} -#endif /* ERR_RECOVERY */ -#endif /*MT_MAC*/ - -#ifdef VOW_SUPPORT -VOID RTMP_SET_STA_DWRR(PRTMP_ADAPTER pAd, MAC_TABLE_ENTRY *pEntry) -{ - UINT32 ret; - MT_VOW_STA_GROUP VoW; - HW_CTRL_TXD HwCtrlTxd; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - os_zero_mem(&VoW, sizeof(MT_VOW_STA_GROUP)); - VoW.StaIdx = pEntry->wcid; - VoW.GroupIdx = pEntry->func_tb_idx; - HW_CTRL_TXD_BASIC(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_SET_STA_DWRR, - sizeof(MT_VOW_STA_GROUP), &VoW, HwCtrlTxd); - ret = HwCtrlEnqueueCmd(pAd, HwCtrlTxd); -} - -VOID RTMP_SET_STA_DWRR_QUANTUM(PRTMP_ADAPTER pAd, BOOLEAN restore, - UCHAR quantum) -{ - UINT32 ret; - MT_VOW_STA_QUANTUM VoW; - HW_CTRL_TXD HwCtrlTxd; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - os_zero_mem(&VoW, sizeof(MT_VOW_STA_QUANTUM)); - - VoW.restore = restore; - VoW.quantum = quantum; - HW_CTRL_TXD_BASIC(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_SET_STA_DWRR_QUANTUM, - sizeof(MT_VOW_STA_GROUP), &VoW, HwCtrlTxd); - ret = HwCtrlEnqueueCmd(pAd, HwCtrlTxd); -} -#endif /* VOW_SUPPORT */ - -#ifdef THERMAL_PROTECT_SUPPORT -VOID RTMP_SET_THERMAL_RADIO_OFF(PRTMP_ADAPTER pAd) -{ - UINT32 ret; - HW_CTRL_TXD HwCtrlTxd; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - HW_CTRL_TXD_BASIC(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_THERMAL_PROTECTION_RADIOOFF, 0, NULL, - HwCtrlTxd); - ret = HwCtrlEnqueueCmd(pAd, HwCtrlTxd); -} -#endif /* THERMAL_PROTECT_SUPPORT */ - -VOID RTMP_SET_UPDATE_RSSI(PRTMP_ADAPTER pAd) -{ - UINT32 ret; - HW_CTRL_TXD HwCtrlTxd; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - HW_CTRL_TXD_BASIC(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_UPDATE_RSSI, 0, NULL, - HwCtrlTxd); - ret = HwCtrlEnqueueCmd(pAd, HwCtrlTxd); -} - -#ifdef ETSI_RX_BLOCKER_SUPPORT /* RX Blocker Solution */ -VOID RTMP_CHECK_RSSI(PRTMP_ADAPTER pAd) -{ - UINT32 ret; - HW_CTRL_TXD HwCtrlTxd; - - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - - HW_CTRL_TXD_BASIC(pAd, HWCMD_TYPE_RADIO, HWCMD_RX_CHECK_RSSI, 0, NULL, - HwCtrlTxd); - ret = HwCtrlEnqueueCmd(pAd, HwCtrlTxd); -} -#endif /* end ETSI_RX_BLOCKER_SUPPORT */ - -/* - ======================================================================== - - Routine Description: - Read statistical counters from hardware registers and record them - in software variables for later on query - - Arguments: - pAd Pointer to our adapter - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - ======================================================================== -*/ -VOID NICUpdateRawCountersNew(IN PRTMP_ADAPTER pAd) -{ - if (HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_PS, - HWCMD_ID_PERODIC_CR_ACCESS_NIC_UPDATE_RAW_COUNTERS, - 0, NULL) != NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_PS, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Failed to enqueue cmd\n", __func__)); -} - -/*----------------------------------------------------------------------------*/ -/*! -* \brief This routine calculates the acumulated TxPER of eaxh TxRate. And -* according to the calculation result, change CommonCfg.TxRate which -* is the stable TX Rate we expect the Radio situation could sustained. -* -* \param[in] pAd -* -* \return None -*/ -/*----------------------------------------------------------------------------*/ - -VOID HW_SET_SLOTTIME(RTMP_ADAPTER *pAd, BOOLEAN bUseShortSlotTime, - UCHAR Channel, struct wifi_dev *wdev) -{ - UINT32 ret; - SLOT_CFG SlotCfg; - - SlotCfg.bUseShortSlotTime = bUseShortSlotTime; - SlotCfg.Channel = Channel; - SlotCfg.wdev = wdev; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_SET_SLOTTIME, - sizeof(SLOT_CFG), (VOID *)&SlotCfg); -} - -VOID RTMP_SET_TX_BURST(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, BOOLEAN enable) -{ - UINT32 ret; - WMM_CFG wmm_cfg; - EDCA_PARM *edca_param = &wmm_cfg.EdcaParm; - RTMP_CHIP_CAP *chip_cap = hc_get_chip_cap(pAd->hdev_ctrl); - - os_zero_mem(&wmm_cfg, sizeof(WMM_CFG)); - wmm_cfg.wdev = wdev; - /*since RDG not ready, for APCLI should set TXOP to 0x80 (remove when RDG ready)*/ -#ifdef CONFIG_RALINK_MT7621 - - if (wdev->fAnyStationPeekTpBound == TRUE) - chip_cap->default_txop = 0x30; - else -#endif /* CONFIG_RALINK_MT7621 */ - if (pAd->CommonCfg.bRdg) { -#define RDG_TXOP 0x80 - chip_cap->default_txop = RDG_TXOP; - } else { -#define TXBURST_TXOP 0x60 - chip_cap->default_txop = TXBURST_TXOP; - } - - edca_param->Txop[WMM_AC_BE] = - (enable) ? (chip_cap->default_txop) : (0x0); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%pS, %s: enable=%x, txop=%x\n", __builtin_return_address(0), - __func__, enable, edca_param->Txop[WMM_AC_BE])); - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_SET_TX_BURST, - sizeof(WMM_CFG), (VOID *)&wmm_cfg); -} - -VOID HW_SET_TX_BURST(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT8 ac_type, UINT8 prio, UINT16 level, UINT8 enable) -{ - struct _tx_burst_cfg txop_cfg; - UINT32 ret; - - if (wdev == NULL) - return; - - txop_cfg.wdev = wdev; - txop_cfg.ac_type = ac_type; - txop_cfg.prio = prio; - txop_cfg.txop_level = level; - txop_cfg.enable = enable; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\n -%s: enable=%x, ac_type=%x, prio=%x, txop=%x\n", - __builtin_return_address(0), __func__, txop_cfg.enable, - txop_cfg.ac_type, txop_cfg.prio, txop_cfg.txop_level)); - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_SET_TX_BURST, - sizeof(struct _tx_burst_cfg), - (VOID *)&txop_cfg); -} - -VOID HW_ADD_REPT_ENTRY(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, PUCHAR pAddr) -{ - UINT32 ret; - ADD_REPT_ENTRY_STRUC add_rept_entry; - - os_zero_mem(&add_rept_entry, sizeof(ADD_REPT_ENTRY_STRUC)); - add_rept_entry.wdev = wdev; - os_move_mem(add_rept_entry.arAddr, pAddr, MAC_ADDR_LEN); - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_ADD_REPT_ENTRY, - sizeof(ADD_REPT_ENTRY_STRUC), &add_rept_entry); -} - -VOID HW_REMOVE_REPT_ENTRY(PRTMP_ADAPTER pAd, UCHAR func_tb_idx, UCHAR CliIdx) -{ - UINT32 ret; - REMOVE_REPT_ENTRY_STRUC remove_rept_entry; - - os_zero_mem(&remove_rept_entry, sizeof(REMOVE_REPT_ENTRY_STRUC)); - remove_rept_entry.func_tb_idx = func_tb_idx; - remove_rept_entry.CliIdx = CliIdx; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_REMOVE_REPT_ENTRY, - sizeof(REMOVE_REPT_ENTRY_STRUC), - &remove_rept_entry); -} - -VOID HW_BEACON_UPDATE(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN UCHAR UpdateReason) -{ - UINT32 ret; - MT_UPDATE_BEACON rMtUpdateBeacon; - - rMtUpdateBeacon.wdev = wdev; - rMtUpdateBeacon.UpdateReason = UpdateReason; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, OmaxIdx = 0x%x, Update reason = %x, pAd Idx = %u\n", - __func__, (wdev ? wdev->OmacIdx : 0xff), UpdateReason, -#ifdef MULTI_INF_SUPPORT - multi_inf_get_idx(pAd) -#else - 0 -#endif /* MULTI_INF_SUPPORT */ - )); - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, HWCMD_ID_UPDATE_BEACON, - sizeof(MT_UPDATE_BEACON), &rMtUpdateBeacon); -} - -#ifdef PKT_BUDGET_CTRL_SUPPORT -VOID HW_SET_PBC_CTRL(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, UCHAR type) -{ - struct pbc_ctrl pbc; - UINT32 ret; - - pbc.entry = entry; - pbc.wdev = wdev; - pbc.type = type; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_WMM, HWCMD_ID_PBC_CTRL, - sizeof(struct pbc_ctrl), (VOID *)&pbc); -} -#endif - -/* - * set RTS Threshold per wdev - */ -VOID HW_SET_RTS_THLD(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR pkt_num, UINT32 length, UINT8 retry_limit) -{ - struct rts_thld rts; - UINT32 ret; - - rts.wdev = wdev; - rts.pkt_thld = pkt_num; - rts.len_thld = length; - rts.retry_limit = retry_limit; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_PROTECT, HWCMD_ID_RTS_THLD, - sizeof(rts), (VOID *)&rts); -} - -#ifdef TXBF_SUPPORT -/* -* -*/ -VOID HW_APCLI_BF_CAP_CONFIG(PRTMP_ADAPTER pAd, PMAC_TABLE_ENTRY pMacEntry) -{ - INT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_SET_APCLI_BF_CAP, - sizeof(MAC_TABLE_ENTRY), pMacEntry); -} - -/* -* -*/ -VOID HW_APCLI_BF_REPEATER_CONFIG(PRTMP_ADAPTER pAd, PMAC_TABLE_ENTRY pMacEntry) -{ - INT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_SET_APCLI_BF_REPEATER, - sizeof(MAC_TABLE_ENTRY), pMacEntry); -} - -VOID HW_STA_BF_SOUNDING_ADJUST(PRTMP_ADAPTER pAd, UCHAR connState, - struct wifi_dev *wdev) -{ - INT32 ret; - MT_STA_BF_ADJ rMtStaBfAdj; - - os_zero_mem(&rMtStaBfAdj, sizeof(MT_STA_BF_ADJ)); - rMtStaBfAdj.wdev = wdev; - rMtStaBfAdj.ConnectionState = connState; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_ADJUST_STA_BF_SOUNDING, - sizeof(MT_STA_BF_ADJ), &rMtStaBfAdj); -} - -VOID HW_AP_TXBF_TX_APPLY(struct _RTMP_ADAPTER *pAd, UCHAR enable) -{ - INT32 ret; - UCHAR BfApply; - - BfApply = enable; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_RADIO, - HWCMD_ID_TXBF_TX_APPLY_CTRL, sizeof(UCHAR), - &BfApply); -} -#endif /* TXBF_SUPPORT */ - -/*WIFI_SYS related HwCtrl CMD*/ -static UINT32 wifi_sys_queue_work(struct _RTMP_ADAPTER *ad, UINT32 id, - struct WIFI_SYS_CTRL *wsys) -{ - UINT32 ret = 0; - HW_CTRL_TXD HwCtrlTxd; - - if (in_interrupt()) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): do not equeue wifi sys layer API to dispatch context!\n", - __func__)); - dump_stack(); - return ret; - } - - HW_CTRL_TXD_BASIC(ad, HWCMD_TYPE_WIFISYS, id, - sizeof(struct WIFI_SYS_CTRL), wsys, HwCtrlTxd); - HW_CTRL_TXD_RSP(ad, 0, NULL, 2000, HwCtrlTxd); - ret = HwCtrlEnqueueCmd(ad, HwCtrlTxd); - return ret; -} - -/* -* -*/ -VOID HW_WIFISYS_OPEN(RTMP_ADAPTER *pAd, struct WIFI_SYS_CTRL *wsys) -{ - wifi_sys_queue_work(pAd, HWCMD_ID_WIFISYS_OPEN, wsys); -} - -/* -* -*/ -VOID HW_WIFISYS_CLOSE(RTMP_ADAPTER *pAd, struct WIFI_SYS_CTRL *wsys) -{ - wifi_sys_queue_work(pAd, HWCMD_ID_WIFISYS_CLOSE, wsys); -} - -/* -* -*/ -VOID HW_WIFISYS_LINKDOWN(RTMP_ADAPTER *pAd, struct WIFI_SYS_CTRL *wsys) -{ - wifi_sys_queue_work(pAd, HWCMD_ID_WIFISYS_LINKDOWN, wsys); -} - -/* -* -*/ -VOID HW_WIFISYS_LINKUP(RTMP_ADAPTER *pAd, struct WIFI_SYS_CTRL *wsys) -{ - wifi_sys_queue_work(pAd, HWCMD_ID_WIFISYS_LINKUP, wsys); -} - -/* -* -*/ -VOID HW_WIFISYS_PEER_LINKUP(RTMP_ADAPTER *pAd, struct WIFI_SYS_CTRL *wsys) -{ - wifi_sys_queue_work(pAd, HWCMD_ID_WIFISYS_PEER_LINKUP, wsys); -} - -/* -* -*/ -VOID HW_WIFISYS_PEER_LINKDOWN(RTMP_ADAPTER *pAd, struct WIFI_SYS_CTRL *wsys) -{ - wifi_sys_queue_work(pAd, HWCMD_ID_WIFISYS_PEER_LINKDOWN, wsys); -} - -/* -* -*/ -VOID HW_WIFISYS_PEER_UPDATE(RTMP_ADAPTER *pAd, struct WIFI_SYS_CTRL *wsys) -{ - wifi_sys_queue_work(pAd, HWCMD_ID_WIFISYS_PEER_UPDATE, wsys); -} - -/* -* for ra update -*/ -VOID HW_WIFISYS_RA_UPDATE(RTMP_ADAPTER *pAd, struct WIFI_SYS_CTRL *wsys) -{ - UINT32 ret; - - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_WIFISYS, - HWCMD_ID_WIFISYS_PEER_UPDATE, - sizeof(struct WIFI_SYS_CTRL), wsys); -} - -VOID HW_GET_TX_STATISTIC(RTMP_ADAPTER *pAd, UINT32 Field, UINT8 Wcid) -{ - UINT32 ret; - HW_CTRL_TXD HwCtrlTxd; - TX_STAT_STRUC TxStat; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): Field = 0x%x, Wcid = %d\n", __func__, Field, Wcid)); - os_zero_mem(&HwCtrlTxd, sizeof(HW_CTRL_TXD)); - os_zero_mem(&TxStat, sizeof(TX_STAT_STRUC)); - TxStat.Field = Field; - TxStat.Wcid = Wcid; - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_WIFISYS, - HWCMD_ID_GET_TX_STATISTIC, - sizeof(TX_STAT_STRUC), (VOID *)&TxStat); -} - -VOID HW_SET_EDCA(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct _EDCA_PARM *pedca_param) -{ - UINT32 ret; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%pS, %s: cmax:%x\n", __builtin_return_address(0), __func__, - pedca_param->Cwmax[WMM_AC_BE])); - ret = HW_CTRL_BASIC_ENQ(pAd, HWCMD_TYPE_WMM, HWCMD_ID_SET_EDCA, - sizeof(EDCA_PARM), (VOID *)pedca_param); - return; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v1.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v1.c deleted file mode 100644 index c3660ef766..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v1.c +++ /dev/null @@ -1,289 +0,0 @@ -#ifdef WIFI_SYS_FW_V1 - -#include "rt_config.h" -#include "hw_ctrl.h" -#include "hw_ctrl_basic.h" - -static NTSTATUS hw_ctrl_flow_v1_open(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - struct _DEV_INFO_CTRL_T *devinfo = &wsys->DevInfoCtrl; - - if (devinfo->EnableFeature) { - AsicDevInfoUpdate(ad, devinfo->OwnMacIdx, devinfo->OwnMacAddr, - devinfo->BandIdx, devinfo->Active, - devinfo->EnableFeature); - /*update devinfo to wdev*/ - wifi_sys_update_devinfo(ad, wdev, devinfo); - } - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v1_close(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = (PRTMP_ADAPTER)wdev->sys_handle; - struct _DEV_INFO_CTRL_T *devinfo = &wsys->DevInfoCtrl; - - if (devinfo->EnableFeature) { - AsicDevInfoUpdate(ad, devinfo->OwnMacIdx, devinfo->OwnMacAddr, - devinfo->BandIdx, devinfo->Active, - devinfo->EnableFeature); - /*update devinfo to wdev*/ - wifi_sys_update_devinfo(ad, wdev, devinfo); - } - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v1_link_up(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - UINT16 txop_level = TXOP_0; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; - struct _STA_TR_ENTRY *tr_entry = (struct _STA_TR_ENTRY *)sta_rec->priv; - struct _BSS_INFO_ARGUMENT_T *bss = &wsys->BssInfoCtrl; - - if (bss->u4BssInfoFeature) { - AsicBssInfoUpdate(ad, wsys->BssInfoCtrl); - HcSetEdca(wdev); - /*update bssinfo to wdev*/ - wifi_sys_update_bssinfo(ad, wdev, bss); - } - - if (sta_rec->EnableFeature & ~STA_REC_INSTALL_KEY_FEATURE) { - AsicUpdateRxWCIDTable(ad, sta_rec->WlanIdx, tr_entry->Addr, - TRUE, FALSE); /* Haipin: check IsReset */ - AsicStaRecUpdate(ad, sta_rec); - } - - if (sta_rec->EnableFeature & STA_REC_INSTALL_KEY_FEATURE) - AsicAddRemoveKeyTab(ad, &sta_rec->asic_sec_info); - - /*update bmc starec to tr_entry*/ - if (sta_rec->EnableFeature) - wifi_sys_update_starec(ad, sta_rec); - - if (ad->CommonCfg.bEnableTxBurst) { - txop_level = TXOP_80; - - if (ad->CommonCfg.bRdg) - txop_level = TXOP_80; - } else - txop_level = TXOP_0; - - hw_set_tx_burst(ad, wdev, AC_BE, PRIO_DEFAULT, txop_level, 1); -#ifdef CONFIG_AP_SUPPORT - - if (WDEV_WITH_BCN_ABILITY(wdev)) { - UpdateBeaconHandler(ad, wdev, BCN_UPDATE_INIT); - } - -#endif /*CONFIG_AP_SUPPORT*/ - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v1_link_down(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; - struct _BSS_INFO_ARGUMENT_T *bss = &wsys->BssInfoCtrl; - - if (sta_rec->EnableFeature & ~STA_REC_INSTALL_KEY_FEATURE) { - AsicStaRecUpdate(ad, sta_rec); - AsicDelWcidTab(ad, sta_rec->WlanIdx); - wifi_sys_update_starec(ad, sta_rec); - } - - if (!wsys->skip_set_txop) - hw_set_tx_burst(ad, wdev, AC_BE, PRIO_DEFAULT, TXOP_0, 0); - - if (bss->u4BssInfoFeature) { - AsicBssInfoUpdate(ad, wsys->BssInfoCtrl); - wifi_sys_update_bssinfo(ad, wdev, bss); - } - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v1_disconnt_act(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; - - if (sta_rec->EnableFeature & ~STA_REC_INSTALL_KEY_FEATURE) - AsicStaRecUpdate(ad, sta_rec); - - /* Delete this entry from ASIC on-chip WCID Table*/ - if (!((sta_rec->WlanIdx >= GET_MAX_UCAST_NUM(ad)) && - (sta_rec->WlanIdx != WCID_ALL))) - AsicDelWcidTab(ad, sta_rec->WlanIdx); - - if (!wsys->skip_set_txop) - hw_set_tx_burst(ad, wdev, AC_BE, PRIO_DEFAULT, TXOP_0, 0); - /*update starec to tr_entry*/ - wifi_sys_update_starec(ad, sta_rec); - - switch (wdev->wdev_type) { -#ifdef CONFIG_AP_SUPPORT - - case WDEV_TYPE_AP: { - ADD_HT_INFO_IE *addht = wlan_operate_get_addht(wdev); - /* back to default protection */ - wdev->protection = 0; - addht->AddHtInfo2.OperaionMode = 0; - UpdateBeaconHandler(ad, wdev, BCN_UPDATE_IE_CHG); - AsicUpdateProtect(ad); - } break; -#endif /*CONFIG_AP_SUPPORT*/ - } - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v1_connt_act(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - PEER_LINKUP_HWCTRL *lu_ctrl = (PEER_LINKUP_HWCTRL *)wsys->priv; - UINT16 txop_level = TXOP_0; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; - struct _STA_TR_ENTRY *tr_entry = (struct _STA_TR_ENTRY *)sta_rec->priv; - - /*check starec is exist should not add new starec for this wcid*/ - if (get_starec_by_wcid(ad, sta_rec->WlanIdx)) { - if (sta_rec->EnableFeature & STA_REC_INSTALL_KEY_FEATURE) - AsicAddRemoveKeyTab(ad, &sta_rec->asic_sec_info); - goto end; - } - - if (sta_rec->EnableFeature & ~STA_REC_INSTALL_KEY_FEATURE) { - AsicUpdateRxWCIDTable(ad, sta_rec->WlanIdx, tr_entry->Addr, - FALSE, FALSE); /* Haipin: Check IsReset */ - AsicStaRecUpdate(ad, sta_rec); - } - - if (sta_rec->EnableFeature & STA_REC_INSTALL_KEY_FEATURE) - AsicAddRemoveKeyTab(ad, &sta_rec->asic_sec_info); - - /*update starec to tr_entry*/ - wifi_sys_update_starec(ad, sta_rec); - - if (ad->CommonCfg.bEnableTxBurst) { - txop_level = TXOP_80; - - if (ad->CommonCfg.bRdg) - txop_level = TXOP_80; - } else - txop_level = TXOP_0; - - hw_set_tx_burst(ad, wdev, AC_BE, PRIO_DEFAULT, txop_level, 1); - - if (wdev->wdev_type == WDEV_TYPE_AP) { -#ifdef DOT11_N_SUPPORT - - if (lu_ctrl->bRdgCap) { - } - -#endif - } - -end: - if (lu_ctrl) - os_free_mem(lu_ctrl); - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v1_peer_update(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = (PRTMP_ADAPTER)wdev->sys_handle; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - UINT32 featues = 0; - - /*update ra rate*/ - if ((sta_rec->EnableFeature & STA_REC_RA_UPDATE_FEATURE) && - wsys->priv) { - AsicRaParamStaRecUpdate( - ad, sta_rec->WlanIdx, - (CMD_STAREC_AUTO_RATE_UPDATE_T *)wsys->priv, - STA_REC_RA_UPDATE_FEATURE); - - if (wsys->priv) - os_free_mem(wsys->priv); - - return NDIS_STATUS_SUCCESS; - } - - /*update ra reldated setting, can't change the order*/ - if (sta_rec->EnableFeature & STA_REC_RA_COMMON_INFO_FEATURE) { - featues = sta_rec->EnableFeature; - sta_rec->EnableFeature = STA_REC_RA_COMMON_INFO_FEATURE; - AsicStaRecUpdate(ad, sta_rec); - sta_rec->EnableFeature = - featues & (~STA_REC_RA_COMMON_INFO_FEATURE); - } - - if (sta_rec->EnableFeature & STA_REC_RA_FEATURE) { - featues = sta_rec->EnableFeature; - sta_rec->EnableFeature = STA_REC_RA_FEATURE; - AsicStaRecUpdate(ad, sta_rec); - sta_rec->EnableFeature = featues & (~STA_REC_RA_FEATURE); - } - -#endif /*RACTRL_FW_OFFLOAD_SUPPORT*/ - - if (sta_rec->EnableFeature & STA_REC_INSTALL_KEY_FEATURE) { - AsicAddRemoveKeyTab(ad, &sta_rec->asic_sec_info); - sta_rec->EnableFeature &= ~STA_REC_INSTALL_KEY_FEATURE; - } - - /*normal update*/ - if (sta_rec->EnableFeature) { - AsicStaRecUpdate(ad, sta_rec); - /*update starec to tr_entry*/ - wifi_sys_update_starec_info(ad, sta_rec); - } - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -VOID hw_ctrl_ops_v1_register(struct _HWCTRL_OP *hwctrl_ops) -{ - hwctrl_ops->wifi_sys_open = hw_ctrl_flow_v1_open; - hwctrl_ops->wifi_sys_close = hw_ctrl_flow_v1_close; - hwctrl_ops->wifi_sys_link_up = hw_ctrl_flow_v1_link_up; - hwctrl_ops->wifi_sys_link_down = hw_ctrl_flow_v1_link_down; - hwctrl_ops->wifi_sys_connt_act = hw_ctrl_flow_v1_connt_act; - hwctrl_ops->wifi_sys_disconnt_act = hw_ctrl_flow_v1_disconnt_act; - hwctrl_ops->wifi_sys_peer_update = hw_ctrl_flow_v1_peer_update; -} - -#endif /*WIFI_SYS_FW_V1*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v2.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v2.c deleted file mode 100644 index 1fad9ee479..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/hw_ctrl/hw_ctrl_ops_v2.c +++ /dev/null @@ -1,265 +0,0 @@ -#ifdef WIFI_SYS_FW_V2 - -#include "rt_config.h" -#include "hw_ctrl.h" -#include "hw_ctrl_basic.h" - -static NTSTATUS hw_ctrl_flow_v2_open(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = (PRTMP_ADAPTER)wdev->sys_handle; - struct _DEV_INFO_CTRL_T *devinfo = &wsys->DevInfoCtrl; - - if (devinfo->EnableFeature) { - AsicDevInfoUpdate(ad, devinfo->OwnMacIdx, devinfo->OwnMacAddr, - devinfo->BandIdx, devinfo->Active, - devinfo->EnableFeature); - /*update devinfo to wdev*/ - wifi_sys_update_devinfo(ad, wdev, devinfo); - } - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v2_close(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = (PRTMP_ADAPTER)wdev->sys_handle; - struct _DEV_INFO_CTRL_T *devinfo = &wsys->DevInfoCtrl; - - if (devinfo->EnableFeature) { - AsicDevInfoUpdate(ad, devinfo->OwnMacIdx, devinfo->OwnMacAddr, - devinfo->BandIdx, devinfo->Active, - devinfo->EnableFeature); - /*update devinfo to wdev*/ - wifi_sys_update_devinfo(ad, wdev, devinfo); - } - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v2_link_up(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; - struct _BSS_INFO_ARGUMENT_T *bss = &wsys->BssInfoCtrl; - UINT16 txop_level = TXOP_0; - - if (bss->u4BssInfoFeature) { - AsicBssInfoUpdate(ad, wsys->BssInfoCtrl); - HcSetEdca(wdev); - /*update bssinfo tp wdev*/ - wifi_sys_update_bssinfo(ad, wdev, bss); - } - - if (sta_rec->EnableFeature) { - AsicStaRecUpdate(ad, sta_rec); - /*update starec to tr_entry*/ - wifi_sys_update_starec(ad, sta_rec); - } - - if (ad->CommonCfg.bEnableTxBurst) { - txop_level = TXOP_80; - - if (ad->CommonCfg.bRdg) - txop_level = TXOP_80; - } else { - txop_level = TXOP_0; - } - - hw_set_tx_burst(ad, wdev, AC_BE, PRIO_DEFAULT, txop_level, 1); -#ifdef CONFIG_AP_SUPPORT - - if (WDEV_WITH_BCN_ABILITY(wdev)) { - UpdateBeaconHandler(ad, wdev, BCN_UPDATE_INIT); - } - -#endif /*CONFIG_AP_SUPPORT*/ - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v2_link_down(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = (PRTMP_ADAPTER)wdev->sys_handle; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; - struct _BSS_INFO_ARGUMENT_T *bss = &wsys->BssInfoCtrl; - - if (sta_rec->EnableFeature) { - AsicStaRecUpdate(ad, sta_rec); - /*update starec to tr_entry*/ - wifi_sys_update_starec(ad, sta_rec); - } - - if (!wsys->skip_set_txop) - hw_set_tx_burst(ad, wdev, AC_BE, PRIO_DEFAULT, TXOP_0, 0); - - if (bss->u4BssInfoFeature) { - AsicBssInfoUpdate(ad, wsys->BssInfoCtrl); - /*update bssinfo to wdev*/ - wifi_sys_update_bssinfo(ad, wdev, bss); - } - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v2_disconnt_act(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = (PRTMP_ADAPTER)wdev->sys_handle; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; - - /*release ucast wcid on hw*/ - if (sta_rec->EnableFeature) - AsicStaRecUpdate(ad, sta_rec); - - if (!wsys->skip_set_txop) - hw_set_tx_burst(ad, wdev, AC_BE, PRIO_DEFAULT, TXOP_0, 0); - - /*update starec to tr_entry*/ - wifi_sys_update_starec(ad, sta_rec); - - switch (wdev->wdev_type) { -#ifdef CONFIG_AP_SUPPORT - - case WDEV_TYPE_AP: { - ADD_HT_INFO_IE *addht = wlan_operate_get_addht(wdev); - /* back to default protection */ - wdev->protection = 0; - addht->AddHtInfo2.OperaionMode = 0; - UpdateBeaconHandler(ad, wdev, BCN_UPDATE_IE_CHG); - AsicUpdateProtect(ad); - } break; -#endif /*CONFIG_AP_SUPPORT*/ - } - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v2_connt_act(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - PEER_LINKUP_HWCTRL *lu_ctrl = (PEER_LINKUP_HWCTRL *)wsys->priv; - UINT16 txop_level = TXOP_0; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; - - /*check starec is exist should not add new starec for this wcid*/ - if (get_starec_by_wcid(ad, sta_rec->WlanIdx)) - goto end; - - if (sta_rec->EnableFeature) - AsicStaRecUpdate(ad, sta_rec); - - /*update sta_rec to tr_entry*/ - wifi_sys_update_starec(ad, sta_rec); - - if (ad->CommonCfg.bEnableTxBurst) { - txop_level = TXOP_80; - - if (ad->CommonCfg.bRdg) - txop_level = TXOP_80; - } else - txop_level = TXOP_0; - - hw_set_tx_burst(ad, wdev, AC_BE, PRIO_DEFAULT, txop_level, 1); - - if (wdev->wdev_type == WDEV_TYPE_AP) { -#ifdef DOT11_N_SUPPORT - - if (lu_ctrl->bRdgCap) { - } - -#endif - } - -end: - if (lu_ctrl) - os_free_mem(lu_ctrl); - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -static NTSTATUS hw_ctrl_flow_v2_peer_update(struct WIFI_SYS_CTRL *wsys) -{ - struct wifi_dev *wdev = wsys->wdev; - struct _RTMP_ADAPTER *ad = wdev->sys_handle; - struct _STA_REC_CTRL_T *sta_rec = &wsys->StaRecCtrl; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - UINT32 featues = 0; - - /*update ra rate*/ - if ((sta_rec->EnableFeature & STA_REC_RA_UPDATE_FEATURE) && - wsys->priv) { - AsicRaParamStaRecUpdate( - ad, sta_rec->WlanIdx, - (CMD_STAREC_AUTO_RATE_UPDATE_T *)wsys->priv, - STA_REC_RA_UPDATE_FEATURE); - - if (wsys->priv) - os_free_mem(wsys->priv); - - return NDIS_STATUS_SUCCESS; - } - - /*update ra reldated setting, can't change the order*/ - if (sta_rec->EnableFeature & STA_REC_RA_COMMON_INFO_FEATURE) { - featues = sta_rec->EnableFeature; - sta_rec->EnableFeature = STA_REC_RA_COMMON_INFO_FEATURE; - AsicStaRecUpdate(ad, sta_rec); - sta_rec->EnableFeature = - featues & (~STA_REC_RA_COMMON_INFO_FEATURE); - } - - if (sta_rec->EnableFeature & STA_REC_RA_FEATURE) { - featues = sta_rec->EnableFeature; - sta_rec->EnableFeature = STA_REC_RA_FEATURE; - AsicStaRecUpdate(ad, sta_rec); - sta_rec->EnableFeature = featues & (~STA_REC_RA_FEATURE); - } - -#endif /*RACTRL_FW_OFFLOAD_SUPPORT*/ - - /*normal update*/ - if (sta_rec->EnableFeature) { - AsicStaRecUpdate(ad, sta_rec); - /*update starec to tr_entry*/ - wifi_sys_update_starec_info(ad, sta_rec); - } - - return NDIS_STATUS_SUCCESS; -} - -/* -* -*/ -VOID hw_ctrl_ops_v2_register(struct _HWCTRL_OP *hwctrl_ops) -{ - hwctrl_ops->wifi_sys_open = hw_ctrl_flow_v2_open; - hwctrl_ops->wifi_sys_close = hw_ctrl_flow_v2_close; - hwctrl_ops->wifi_sys_link_up = hw_ctrl_flow_v2_link_up; - hwctrl_ops->wifi_sys_link_down = hw_ctrl_flow_v2_link_down; - hwctrl_ops->wifi_sys_connt_act = hw_ctrl_flow_v2_connt_act; - hwctrl_ops->wifi_sys_disconnt_act = hw_ctrl_flow_v2_disconnt_act; - hwctrl_ops->wifi_sys_peer_update = hw_ctrl_flow_v2_peer_update; -} - -#endif /*WIFI_SYS_FW_V2*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/a4_conn.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/a4_conn.h deleted file mode 100644 index 287c4a0862..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/a4_conn.h +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef __A4_CONN_H__ -#define __A4_CONN_H__ -/* - *************************************************************************** - * Ralink Tech Inc. - * 5F., No.36, Taiyuan St., Jhubei City, - * Hsinchu County 302, - * Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - - Module Name: - a4_conn.h - - Abstract: - This is A4 connection function used to process those 4-addr of connected APClient or STA. - Used by MWDS and MAP feature - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ -#ifdef A4_CONN -#include "rtmp_def.h" - -typedef struct _A4_CONNECT_ENTRY { - DL_LIST List; - UCHAR valid; - UCHAR wcid; -} A4_CONNECT_ENTRY, *PA4_CONNECT_ENTRY; - -#define A4_TYPE_NONE 0 -#define A4_TYPE_MWDS 1 -#define A4_TYPE_MAP 2 /*high priority*/ - -#define IS_ENTRY_A4(_x) ((_x)->a4_entry != 0) -#define GET_ENTRY_A4(_x) ((_x)->a4_entry) -#define SET_ENTRY_A4(_x, _type) ((_x)->a4_entry = _type) - -#define IS_APCLI_A4(_x) ((_x)->a4_apcli != 0) -#define GET_APCLI_A4(_x) ((_x)->a4_apcli) -#define SET_APCLI_A4(_x, _type) ((_x)->a4_apcli = _type) - -BOOLEAN a4_interface_init(IN PRTMP_ADAPTER adapter, IN UCHAR if_index, - IN BOOLEAN is_ap, IN UCHAR a4_type); - -BOOLEAN a4_interface_deinit(IN PRTMP_ADAPTER adapter, IN UCHAR if_index, - IN BOOLEAN is_ap, IN UCHAR a4_type); - -VOID a4_proxy_delete(IN PRTMP_ADAPTER adapter, IN UCHAR if_index, - IN PUCHAR mac_addr); - -BOOLEAN a4_proxy_lookup(IN PRTMP_ADAPTER adapter, IN UCHAR if_index, - IN PUCHAR mac_addr, IN BOOLEAN update_alive_time, - IN BOOLEAN is_rx, OUT UCHAR *wcid); - -VOID a4_proxy_update(IN PRTMP_ADAPTER adapter, IN UCHAR if_index, IN UCHAR wcid, - IN PUCHAR mac_addr, IN UINT32 ip /* ARP Sender IP*/ -); - -VOID a4_proxy_maintain(IN PRTMP_ADAPTER adapter, IN UCHAR if_index); - -void a4_send_clone_pkt(IN PRTMP_ADAPTER adapter, IN UCHAR if_index, - IN PNDIS_PACKET pkt, IN PUCHAR exclude_mac_addr); - -BOOLEAN a4_ap_peer_enable(IN PRTMP_ADAPTER adapter, IN PMAC_TABLE_ENTRY entry, - IN UCHAR type); - -BOOLEAN a4_ap_peer_disable(IN PRTMP_ADAPTER adapter, IN PMAC_TABLE_ENTRY entry, - IN UCHAR type); - -#ifdef APCLI_SUPPORT -BOOLEAN a4_apcli_peer_enable(IN PRTMP_ADAPTER adapter, - IN PAPCLI_STRUCT apcli_entry, - IN PMAC_TABLE_ENTRY entry, IN UCHAR type); - -BOOLEAN a4_apcli_peer_disable(IN PRTMP_ADAPTER adapter, - IN PAPCLI_STRUCT apcli_entry, - IN PMAC_TABLE_ENTRY entry, IN UCHAR type); -#endif - -INT Set_APProxy_Status_Show_Proc(IN PRTMP_ADAPTER adapter, IN RTMP_STRING *arg); -INT Set_APProxy_Refresh_Proc(IN PRTMP_ADAPTER adapter, IN RTMP_STRING *arg); - -#endif /* A4_CONN */ -#endif /* __A4_CONN_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/action.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/action.h deleted file mode 100644 index b3f99480a3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/action.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - aironet.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __ACTION_H__ -#define __ACTION_H__ - -struct _RTMP_ADAPTER; - -VOID MlmeQOSAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeDLSAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeInvalidAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerRMAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerQOSAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID peer_addba_req_action(PRTMP_ADAPTER pAd, MLME_QUEUE_ELEM *Elem); - -VOID peer_addba_rsp_action(PRTMP_ADAPTER pAd, MLME_QUEUE_ELEM *Elem); - -VOID peer_delba_action(PRTMP_ADAPTER pAd, MLME_QUEUE_ELEM *Elem); - -VOID PeerBAAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerHTAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -#ifdef DOT11_VHT_AC -VOID PeerVHTAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); -#endif /* DOT11_VHT_AC */ - -VOID PeerPublicAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerProtectedDualAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); - -#ifdef CONFIG_AP_SUPPORT -VOID ApPublicAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); -#endif /* CONFIG_AP_SUPPORT */ - -#endif /* __ACTION_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ags.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ags.h deleted file mode 100644 index aa8f0e9400..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ags.h +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - All AGS (Adaptive Group Switching) Related Structure & Definition - -***************************************************************************/ - -#ifndef __AGS_H__ -#define __AGS_H__ - -extern UCHAR AGS1x1HTRateTable[]; -extern UCHAR AGS2x2HTRateTable[]; -extern UCHAR AGS3x3HTRateTable[]; -#ifdef DOT11_VHT_AC -extern UCHAR Ags1x1VhtRateTable[]; -extern UCHAR Ags2x2VhtRateTable[]; -#endif /* DOT11_VHT_AC */ - -#define AGS_TX_QUALITY_WORST_BOUND 8 -#define AGS_QUICK_RA_TIME_INTERVAL 50 /* 50ms */ - -/* The size, in bytes, of an AGS entry in the rate switch table */ -#define SIZE_OF_AGS_RATE_TABLE_ENTRY 9 - -typedef struct _RTMP_RA_AGS_TB { - UCHAR ItemNo; - - UCHAR STBC : 1; - UCHAR ShortGI : 1; - UCHAR BW : 2; - UCHAR Mode : 3; - UCHAR Rsv1 : 1; - - UCHAR Nss : 2; - UCHAR rsv2 : 6; - - UCHAR CurrMCS; - UCHAR TrainUp; - UCHAR TrainDown; - UCHAR downMcs; - UCHAR upMcs3; - UCHAR upMcs2; - UCHAR upMcs1; -} RTMP_RA_AGS_TB; - -/* AGS control */ -typedef struct _AGS_CONTROL { - UCHAR MCSGroup; /* The MCS group under testing */ - UCHAR lastRateIdx; -} AGS_CONTROL, *PAGS_CONTROL; - -/* The statistics information for AGS */ -typedef struct _AGS_STATISTICS_INFO { - CHAR RSSI; - ULONG TxErrorRatio; - ULONG AccuTxTotalCnt; - ULONG TxTotalCnt; - ULONG TxSuccess; - ULONG TxRetransmit; - ULONG TxFailCount; -} AGS_STATISTICS_INFO, *PAGS_STATISTICS_INFO; - -/* Support AGS (Adaptive Group Switching) */ -#define SUPPORT_AGS(__pAd) ((__pAd)->rateAlg == RATE_ALG_AGS) - -#ifdef DOT11_VHT_AC -#define AGS_IS_USING(__pAd, __pRateTable) \ - (SUPPORT_AGS(__pAd) && ((__pRateTable == AGS1x1HTRateTable) || \ - (__pRateTable == AGS2x2HTRateTable) || \ - (__pRateTable == AGS3x3HTRateTable) || \ - (__pRateTable == Ags1x1VhtRateTable) || \ - (__pRateTable == Ags2x2VhtRateTable))) -#else -#define AGS_IS_USING(__pAd, __pRateTable) \ - (SUPPORT_AGS(__pAd) && ((__pRateTable == AGS1x1HTRateTable) || \ - (__pRateTable == AGS2x2HTRateTable) || \ - (__pRateTable == AGS3x3HTRateTable))) -#endif /* DOT11_VHT_AC */ - -#endif /* __AGS_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap.h deleted file mode 100644 index e0d1dc4df8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap.h +++ /dev/null @@ -1,419 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap.h - - Abstract: - Miniport generic portion header file - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __AP_H__ -#define __AP_H__ - -#ifdef DOT11R_FT_SUPPORT -#include "ft_cmm.h" -#endif /* DOT11R_FT_SUPPORT */ - -#define INFRA_TP_PEEK_BOUND_THRESHOLD 50 -#define VERIWAVE_TP_PEEK_BOUND_TH 30 -#define VERIWAVE_2G_PKT_CNT_TH 100 -#define VERIWAVE_5G_PKT_CNT_TH 200 -#define BYTES_PER_SEC_TO_MBPS 17 -#define TX_MODE_RATIO_THRESHOLD 70 -#define RX_MODE_RATIO_THRESHOLD 70 -#define STA_TP_IDLE_THRESHOLD 10 -#define STA_NUMBER_FOR_TRIGGER 1 -#define MULTI_CLIENT_NUMS_TH 16 -#define MULTI_CLIENT_2G_NUMS_TH 16 -#define INFRA_KEEP_STA_PKT_TH 1 -#define VERIWAVE_TP_AMSDU_DIS_TH 1400 -#define VERIWAVE_2G_TP_AMSDU_DIS_TH 1024 -#define VERIWAVE_PER_RTS_DIS_TH_LOW_MARK 3 -#define VERIWAVE_PER_RTS_DIS_TH_HIGH_MARK 9 -#define VERIWAVE_PKT_LEN_LOW 60 -#define VERIWAVE_INVALID_PKT_LEN_HIGH 2000 -#define VERIWAVE_INVALID_PKT_LEN_LOW 64 -#define TRAFFIC_0 0 -#define TRAFFIC_DL_MODE 1 -#define TRAFFIC_UL_MODE 2 -#define TRAFFIC_BIDIR_ACTIVE_MODE 3 -#define TRAFFIC_BIDIR_IDLE_MODE 4 - -/* ============================================================= */ -/* Common definition */ -/* ============================================================= */ -#define MBSS_VLAN_INFO_GET(__pAd, __VLAN_VID, __VLAN_Priority, __func_idx) \ - { \ - if ((__func_idx < __pAd->ApCfg.BssidNum) && \ - (__func_idx < HW_BEACON_MAX_NUM) && \ - (__pAd->ApCfg.MBSSID[__func_idx].wdev.VLAN_VID != 0)) { \ - __VLAN_VID = \ - __pAd->ApCfg.MBSSID[__func_idx].wdev.VLAN_VID; \ - __VLAN_Priority = __pAd->ApCfg.MBSSID[__func_idx] \ - .wdev.VLAN_Priority; \ - } \ - } - -#define WDEV_VLAN_INFO_GET(__pAd, __VLAN_VID, __VLAN_Priority, __wdev) \ - { \ - if ((__wdev->VLAN_VID != 0)) { \ - __VLAN_VID = __wdev->VLAN_VID; \ - __VLAN_Priority = __wdev->VLAN_Priority; \ - } \ - } - -#ifdef CUSTOMER_RSG_FEATURE -#define TIMESTAMP_GET(__pAd, __TimeStamp) \ - { \ - UINT32 tsf_l = 0, tsf_h = 0; \ - UINT64 __Value64; \ - AsicGetTsfTime((__pAd), &tsf_h, &tsf_l); \ - __TimeStamp = (UINT64)tsf_l; \ - __Value64 = (UINT64)tsf_h; \ - __TimeStamp |= (tsf_h << 32); \ - } -#endif - -#ifndef HOSTAPD_11R_SUPPORT -typedef struct _AUTH_FRAME_INFO { - UCHAR addr1[MAC_ADDR_LEN]; - UCHAR addr2[MAC_ADDR_LEN]; - USHORT auth_alg; - USHORT auth_seq; - USHORT auth_status; - CHAR Chtxt[CIPHER_TEXT_LEN]; -#ifdef DOT11R_FT_SUPPORT - FT_INFO FtInfo; -#endif /* DOT11R_FT_SUPPORT */ -} AUTH_FRAME_INFO; -#endif /* HOSTAPD_11R_SUPPORT */ - -#ifdef CONVERTER_MODE_SWITCH_SUPPORT -typedef enum _ENUM_AP_START_STATE_T { - AP_STATE_ALWAYS_START_AP_DEFAULT = 0, - AP_STATE_START_AFTER_APCLI_CONNECTION, - AP_STATE_NEVER_START_AP, - AP_STATE_INVALID_MAX -} ENUM_AP_START_STATE; - -typedef enum _ENUM_APCLI_MODE_T { - APCLI_MODE_ALWAYS_START_AP_DEFAULT = 0, - APCLI_MODE_START_AP_AFTER_APCLI_CONNECTION, - APCLI_MODE_NEVER_START_AP, - APCLI_MODE_INVALID_MAX -} ENUM_APCLI_MODE; - -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - -typedef enum _ENUM_AP_BSS_OPER_T { - AP_BSS_OPER_ALL = 0, - AP_BSS_OPER_BY_RF, - AP_BSS_OPER_SINGLE, - AP_BSS_OPER_NUM -} ENUM_AP_BSS_OPER; - -/* ============================================================= */ -/* Function Prototypes */ -/* ============================================================= */ - -BOOLEAN APBridgeToWirelessSta(IN PRTMP_ADAPTER pAd, IN PUCHAR pHeader, - IN UINT HdrLen, IN PUCHAR pData, IN UINT DataLen, - IN ULONG fromwdsidx); - -INT ap_tx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pPacket); -INT ap_fp_tx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt); -INT ap_rx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, RX_BLK *pRxBlk); -INT ap_rx_ps_handle(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, RX_BLK *pRxBlk); -BOOLEAN ap_dev_rx_mgmt_frm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - MAC_TABLE_ENTRY *pEntry); -INT ap_rx_pkt_foward(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pPacket); -INT ap_mlme_mgmtq_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *tx_blk); -INT ap_mlme_dataq_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *tx_blk); -INT ap_ieee_802_3_data_rx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - RX_BLK *pRxBlk, MAC_TABLE_ENTRY *pEntry); -INT ap_ieee_802_11_data_rx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - RX_BLK *pRxBlk, MAC_TABLE_ENTRY *pEntry); -INT ap_conn_act(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT ap_link_up(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT ap_link_down(struct wifi_dev *wdev); -INT ap_inf_open(struct wifi_dev *wdev); -INT ap_inf_close(struct wifi_dev *wdev); -INT ap_send_data_pkt(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt); -INT ap_send_mlme_pkt(RTMP_ADAPTER *pAd, PNDIS_PACKET pkt, struct wifi_dev *wdev, - UCHAR q_idx, BOOLEAN is_data_queue); -UINT32 starec_ap_feature_decision(struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, - UINT32 *feature); - -NDIS_STATUS APInsertPsQueue(IN RTMP_ADAPTER *pAd, IN PNDIS_PACKET pPacket, - IN STA_TR_ENTRY *tr_entry, IN UCHAR QueIdx); - -INT ap_tx_pkt_handle(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT ap_legacy_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT ap_ampdu_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT ap_amsdu_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT ap_frag_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -VOID ap_ieee_802_11_data_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk); -VOID ap_ieee_802_3_data_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk); -VOID ap_find_cipher_algorithm(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk); -BOOLEAN ap_fill_non_offload_tx_blk(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk); -BOOLEAN ap_fill_offload_tx_blk(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk); - -VOID rx_eapol_frm_handle(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN RX_BLK *pRxBlk, IN UCHAR wdev_idx); - -VOID ap_rx_error_handle(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); -BOOLEAN ap_chk_cl2_cl3_err(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); - -VOID RTMPDescriptorEndianChange(UCHAR *pData, ULONG DescriptorType); - -VOID RTMPFrameEndianChange(IN RTMP_ADAPTER *pAd, IN UCHAR *pData, IN ULONG Dir, - IN BOOLEAN FromRxDoneInt); - -/* ap_assoc.c */ - -VOID APAssocStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID ap_cmm_peer_assoc_req_action(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem, - IN BOOLEAN isReassoc); - -VOID MbssKickOutStas(RTMP_ADAPTER *pAd, INT apidx, USHORT Reason); -VOID APMlmeKickOutSta(RTMP_ADAPTER *pAd, UCHAR *staAddr, UCHAR Wcid, - USHORT Reason); - -#ifdef BW_VENDOR10_CUSTOM_FEATURE -BOOLEAN IsClientConnected(RTMP_ADAPTER *pAd); -#endif - -#ifdef DOT11W_PMF_SUPPORT -VOID APMlmeKickOutAllSta(RTMP_ADAPTER *pAd, UCHAR apidx, USHORT Reason); -#endif /* DOT11W_PMF_SUPPORT */ - -VOID APCls3errAction(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); - -/* ap_auth.c */ - -void APAuthStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID APCls2errAction(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); - -#ifdef HOSTAPD_11R_SUPPORT -/*for ap_assoc in cfg mode*/ -BOOLEAN PeerAssocReqCmmSanity(RTMP_ADAPTER *pAd, BOOLEAN isReassoc, VOID *Msg, - INT MsgLen, IE_LISTS *ie_lists); - -USHORT APBuildAssociation(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN IE_LISTS *ie_list, - IN UCHAR MaxSupportedRateIn500Kbps, OUT USHORT *pAid, - IN BOOLEAN isReassoc); -#endif /* HOSTAPD_11R_SUPPORT */ -/* ap_connect.c */ - -#ifdef CONFIG_AP_SUPPORT -#ifdef MT_MAC -VOID APMakeAllTimFrame(RTMP_ADAPTER *pAd); -VOID APMakeTimFrame(RTMP_ADAPTER *pAd, INT apidx); -VOID APCheckBcnQHandler(RTMP_ADAPTER *pAd, INT apidx, BOOLEAN *is_pretbtt_int); -#endif -#endif /* CONFIG_AP_SUPPORT */ - -/* ap_sync.c */ -VOID APSyncStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID APScanTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID ApSiteSurvey(IN PRTMP_ADAPTER pAd, IN PNDIS_802_11_SSID pSsid, - IN UCHAR ScanType, IN BOOLEAN ChannelSel); - -VOID ApSiteSurvey_by_wdev(IN PRTMP_ADAPTER pAd, IN PNDIS_802_11_SSID pSsid, - IN UCHAR ScanType, IN BOOLEAN ChannelSel, - IN struct wifi_dev *wdev); - -#ifdef TXRX_STAT_SUPPORT -VOID Update_LastSec_TXRX_Stats(IN PRTMP_ADAPTER pAd); -#endif -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) -VOID Update_Wtbl_Counters(IN PRTMP_ADAPTER pAd); - -#endif -#ifdef CUSTOMER_RSG_FEATURE -VOID UpdateRadioStatCounters(IN PRTMP_ADAPTER pAd); - -VOID ClearChannelStatsCr(IN PRTMP_ADAPTER pAd); - -VOID ResetChannelStats(IN PRTMP_ADAPTER pAd); - -#endif -#ifdef CUSTOMER_DCC_FEATURE -VOID GetTxRxActivityTime(IN PRTMP_ADAPTER pAd, IN UINT wcid); -VOID RemoveOldStaList(IN PRTMP_ADAPTER pAd); - -VOID APResetStreamingStatus(IN PRTMP_ADAPTER pAd); -#endif - -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) -VOID RemoveOldBssEntry(IN PRTMP_ADAPTER pAd); -#endif - -#ifdef APCLI_CFG80211_SUPPORT -VOID ApCliSiteSurvey(IN PRTMP_ADAPTER pAd, IN PNDIS_802_11_SSID pSsid, - IN UCHAR ScanType, IN BOOLEAN ChannelSel, - IN struct wifi_dev *wdev); -#endif /* APCLI_CFG80211_SUPPORT */ - -VOID SupportRate(IN PUCHAR SupRate, IN UCHAR SupRateLen, IN PUCHAR ExtRate, - IN UCHAR ExtRateLen, OUT PUCHAR *Rates, OUT PUCHAR RatesLen, - OUT PUCHAR pMaxSupportRate); - -BOOLEAN ApScanRunning(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -#ifdef OFFCHANNEL_SCAN_FEATURE -UCHAR Channel2Index(IN PRTMP_ADAPTER pAd, IN UCHAR channel); - -INT ApSiteSurveyNew_by_wdev(IN PRTMP_ADAPTER pAd, IN UINT Channel, - IN UINT Timeout, IN UCHAR ScanType, - IN BOOLEAN ChannelSel, IN struct wifi_dev *wdev); -#endif - -#ifdef DOT11_N_SUPPORT -VOID APUpdateOperationMode(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -#ifdef DOT11N_DRAFT3 -VOID APOverlappingBSSScan(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -INT GetBssCoexEffectedChRange(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN BSS_COEX_CH_RANGE *pCoexChRange, - IN UCHAR Channel); -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - -/* ap_mlme.c */ -VOID APMlmePeriodicExec(RTMP_ADAPTER *pAd); - -BOOLEAN APMsgTypeSubst(IN PRTMP_ADAPTER pAd, IN PFRAME_802_11 pFrame, - OUT INT *Machine, OUT INT *MsgType); - -VOID APQuickResponeForRateUpExec(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); - -VOID APAsicEvaluateRxAnt(RTMP_ADAPTER *pAd); -VOID APAsicRxAntEvalTimeout(RTMP_ADAPTER *pAd); - -/* ap.c */ -UCHAR get_apidx_by_addr(RTMP_ADAPTER *pAd, UCHAR *addr); - -NDIS_STATUS APOneShotSettingInitialize(RTMP_ADAPTER *pAd); -#ifdef CONFIG_INIT_RADIO_ONOFF -VOID APStartUpForMain(RTMP_ADAPTER *pAd); -#endif - -/* INT ap_func_init(RTMP_ADAPTER *pAd); */ - -VOID APShutdown(RTMP_ADAPTER *pAd); - -VOID APStartUpForMbss(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss); -VOID APStartUp(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, ENUM_AP_BSS_OPER oper); -VOID APStartUpByBss(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss); - -VOID APStop(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, ENUM_AP_BSS_OPER oper); -VOID APStopByBss(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss); - -VOID APCleanupPsQueue(RTMP_ADAPTER *pAd, QUEUE_HEADER *pQueue); - -VOID MacTableMaintenance(RTMP_ADAPTER *pAd); - -UINT32 MacTableAssocStaNumGet(RTMP_ADAPTER *pAd); - -MAC_TABLE_ENTRY *APSsPsInquiry(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, - OUT SST *Sst, OUT USHORT *Aid, OUT UCHAR *PsMode, - OUT UCHAR *Rate); - -#ifdef SYSTEM_LOG_SUPPORT -VOID ApLogEvent(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, IN USHORT Event); -#else -#define ApLogEvent(_pAd, _pAddr, _Event) -#endif /* SYSTEM_LOG_SUPPORT */ - -VOID ApUpdateCapabilityAndErpIe(RTMP_ADAPTER *pAd, struct _BSS_STRUCT *mbss); - -BOOLEAN ApCheckAccessControlList(RTMP_ADAPTER *pAd, UCHAR *addr, UCHAR apidx); -VOID ApUpdateAccessControlList(RTMP_ADAPTER *pAd, UCHAR apidx); - -#ifdef AP_QLOAD_SUPPORT -VOID QBSS_LoadInit(RTMP_ADAPTER *pAd); -VOID QBSS_LoadAlarmReset(RTMP_ADAPTER *pAd); -VOID QBSS_LoadAlarmResume(RTMP_ADAPTER *pAd); -UINT32 QBSS_LoadBusyTimeGet(RTMP_ADAPTER *pAd); -BOOLEAN QBSS_LoadIsAlarmIssued(RTMP_ADAPTER *pAd); -BOOLEAN QBSS_LoadIsBusyTimeAccepted(RTMP_ADAPTER *pAd, UINT32 BusyTime); -UINT32 QBSS_LoadElementAppend(RTMP_ADAPTER *pAd, UINT8 *pBeaconBuf, - QLOAD_CTRL *pQloadCtrl, UCHAR apidx); -VOID QBSS_LoadUpdate(RTMP_ADAPTER *pAd, ULONG UpTime); -VOID QBSS_LoadStatusClear(RTMP_ADAPTER *pAd, UCHAR Channel); - -INT Show_QoSLoad_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef CONFIG_HOTSPOT_R2 -UINT32 QBSS_LoadElementAppend_HSTEST(RTMP_ADAPTER *pAd, UINT8 *pBeaconBuf, - UCHAR apidx); -#endif /* CONFIG_HOTSPOT_R2 */ -#endif /* AP_QLOAD_SUPPORT */ - -#ifdef DOT1X_SUPPORT -INT Set_OwnIPAddr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_EAPIfName_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_PreAuthIfName_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* Define in ap.c */ -BOOLEAN DOT1X_InternalCmdAction(IN RTMP_ADAPTER *pAd, - IN MAC_TABLE_ENTRY *pEntry, IN UINT8 cmd); - -BOOLEAN DOT1X_EapTriggerAction(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -#endif /* DOT1X_SUPPORT */ - -VOID AP_E2PROM_IOCTL_PostCtrl(RTMP_IOCTL_INPUT_STRUCT *wrq, RTMP_STRING *msg); - -VOID IAPP_L2_UpdatePostCtrl(RTMP_ADAPTER *pAd, UINT8 *mac, INT wdev_idx); - -INT rtmp_ap_init(RTMP_ADAPTER *pAd); -VOID rtmp_ap_exit(RTMP_ADAPTER *pAd); - -#if defined(VOW_SUPPORT) && defined(VOW_DVT) -UINT32 vow_clone_legacy_frame(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk); -#endif -VOID ap_over_lapping_scan(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss); - -#endif /* __AP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_apcli.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_apcli.h deleted file mode 100644 index 09128ad124..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_apcli.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_apcli.h - - Abstract: - Support AP-Client function. - - Revision History: - Who When What - -------------- ---------- ---------------------------------------------- - Shiang, Fonchi 02-13-2007 created -*/ - -#ifndef _AP_APCLI_H_ -#define _AP_APCLI_H_ - -#ifdef APCLI_SUPPORT - -#include "rtmp.h" - -#define PROBE_TIMEOUT 1000 /* unit: msec */ - -#define TOLERANCE_OF_TP_THRESHOLD 50 -#define TP_PEEK_BOUND_THRESHOLD 830 -/* #define BYTES_PER_SEC_TO_MBPS 17 */ -/* #define TX_MODE_RATIO_THRESHOLD 70 */ -#define TX_MODE_TP_CHECK 250 -#define NUM_OF_APCLI_TXOP_COND 5 - -#ifdef APCLI_CONNECTION_TRIAL -#define TRIAL_TIMEOUT 400 /* unit: msec */ -#endif /* APCLI_CONNECTION_TRIAL */ -#define APCLI_WAIT_TIMEOUT RTMPMsecsToJiffies(300) -#define REPT_WAIT_TIMEOUT RTMPMsecsToJiffies(5000) - -#define APCLI_ROOT_BSSID_GET(pAd, wcid) ((pAd)->MacTab.Content[(wcid)].Addr) - -/* sanity check for apidx */ -#define APCLI_MR_APIDX_SANITY_CHECK(idx) \ - { \ - if ((idx) >= MAX_APCLI_NUM) { \ - (idx) = 0; \ - MTWF_LOG(DBG_CAT_CLIENT, CATCLIENT_APCLI, \ - DBG_LVL_ERROR, \ - ("%s> Error! apcli-idx > MAX_APCLI_NUM!\n", \ - __func__)); \ - } \ - } - -#ifdef ROAMING_ENHANCE_SUPPORT -#define APCLI_ROAMING_ENHANCE_CHECK(pAd, pEntry, pRxBlk, wdev) \ - { \ - if (pAd->ApCfg.bRoamingEnhance && IsApCliLinkUp(pAd)) { \ - if ((pEntry->bRoamingRefreshDone == FALSE) && \ - IS_ENTRY_CLIENT(pEntry)) \ - ApCliDoRoamingRefresh( \ - pAd, pEntry, pRxBlk->pRxPacket, wdev); \ - } \ - } -#endif /* ROAMING_ENHANCE_SUPPORT */ - -typedef struct _APCLI_MLME_JOIN_REQ_STRUCT { - UCHAR Bssid[MAC_ADDR_LEN]; - UCHAR SsidLen; - UCHAR Ssid[MAX_LEN_OF_SSID]; -} APCLI_MLME_JOIN_REQ_STRUCT; - -typedef struct _APCLI_CTRL_MSG_STRUCT { - USHORT Status; - UCHAR SrcAddr[MAC_ADDR_LEN]; -#ifdef MAC_REPEATER_SUPPORT - UCHAR BssIdx; - UCHAR CliIdx; -#endif /* MAC_REPEATER_SUPPORT */ -} APCLI_CTRL_MSG_STRUCT, *PSTA_CTRL_MSG_STRUCT; - -BOOLEAN isValidApCliIf(SHORT ifIndex); - -VOID ApCliCtrlStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID ApCliSyncStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID ApCliAuthStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID ApCliAssocStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -MAC_TABLE_ENTRY *ApCliTableLookUpByWcid(IN RTMP_ADAPTER *pAd, IN UCHAR wcid, - IN UCHAR *pAddrs); - -BOOLEAN ApCliValidateRSNIE(IN RTMP_ADAPTER *pAd, IN PEID_STRUCT pEid_ptr, - IN USHORT eid_len, IN USHORT idx, IN UCHAR Privacy); - -VOID ApCli_Remove(IN PRTMP_ADAPTER pAd); - -VOID RT28xx_ApCli_Close(IN PRTMP_ADAPTER pAd); - -INT ApCliIfLookUp(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr); - -VOID ApCliMgtMacHeaderInit(IN PRTMP_ADAPTER pAd, - IN OUT PHEADER_802_11 pHdr80211, IN UCHAR SubType, - IN UCHAR ToDs, IN PUCHAR pDA, IN PUCHAR pBssid, - IN USHORT ifIndex); - -#ifdef DOT11_N_SUPPORT -BOOLEAN ApCliCheckHt(IN PRTMP_ADAPTER pAd, IN USHORT IfIndex, - IN OUT HT_CAPABILITY_IE *pHtCapability, - IN OUT ADD_HT_INFO_IE *pAddHtInfo); -#endif /* DOT11_N_SUPPORT */ - -#ifdef APCLI_CERT_SUPPORT -void ApCliCertEDCAAdjust(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - IN PEDCA_PARM pEdcaParm); -#endif - -#ifdef CONVERTER_MODE_SWITCH_SUPPORT -void V10ConverterModeStartStop(RTMP_ADAPTER *pAd, BOOLEAN BeaconStart); -#endif /*CONVERTER_MODE_SWITCH_SUPPORT*/ - -BOOLEAN ApCliLinkUp(IN PRTMP_ADAPTER pAd, IN UCHAR ifIndex); - -VOID ApCliLinkDown(IN PRTMP_ADAPTER pAd, IN UCHAR ifIndex); - -VOID ApCliIfUp(IN PRTMP_ADAPTER pAd); - -VOID ApCliIfDown(IN PRTMP_ADAPTER pAd); - -VOID ApCliIfMonitor(IN PRTMP_ADAPTER pAd); - -VOID APCLIerr_Action(IN RTMP_ADAPTER *pAd, IN RX_BLK *pRxBlk, IN UCHAR Idx); - -BOOLEAN ApCliMsgTypeSubst(IN PRTMP_ADAPTER pAd, IN PFRAME_802_11 pFrame, - OUT INT *Machine, OUT INT *MsgType); - -BOOLEAN preCheckMsgTypeSubset(IN PRTMP_ADAPTER pAd, IN PFRAME_802_11 pFrame, - OUT INT *Machine, OUT INT *MsgType); - -BOOLEAN ApCliPeerAssocRspSanity( - IN PRTMP_ADAPTER pAd, IN VOID *pMsg, IN ULONG MsgLen, OUT PUCHAR pAddr2, - OUT USHORT *pCapabilityInfo, OUT USHORT *pStatus, OUT USHORT *pAid, - OUT UCHAR SupRate[], OUT UCHAR *pSupRateLen, OUT UCHAR ExtRate[], - OUT UCHAR *pExtRateLen, OUT HT_CAPABILITY_IE *pHtCapability, - OUT ADD_HT_INFO_IE - *pAddHtInfo, /* AP might use this additional ht info IE */ - OUT UCHAR *pHtCapabilityLen, OUT UCHAR *pAddHtInfoLen, - OUT UCHAR *pNewExtChannelOffset, OUT PEDCA_PARM pEdcaParm, - OUT UCHAR *pCkipFlag, OUT IE_LISTS *le_list); - -VOID ApCliPeerPairMsg1Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN MLME_QUEUE_ELEM *Elem); - -VOID ApCliPeerPairMsg3Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN MLME_QUEUE_ELEM *Elem); - -VOID ApCliPeerGroupMsg1Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN MLME_QUEUE_ELEM *Elem); - -BOOLEAN ApCliCheckRSNIE(IN PRTMP_ADAPTER pAd, IN PUCHAR pData, IN UCHAR DataLen, - IN MAC_TABLE_ENTRY *pEntry, OUT UCHAR *Offset); - -BOOLEAN ApCliParseKeyData(IN PRTMP_ADAPTER pAd, IN PUCHAR pKeyData, - IN UCHAR KeyDataLen, IN MAC_TABLE_ENTRY *pEntry, - IN UCHAR IfIdx, IN UCHAR bPairewise); - -INT apcli_tx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt); - -BOOLEAN ApCliHandleRxBroadcastFrame(IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk, - IN MAC_TABLE_ENTRY *pEntry); - -VOID ApCliUpdateMlmeRate(RTMP_ADAPTER *pAd, USHORT ifIndex); - -VOID ApCliCheckPeerExistence(IN RTMP_ADAPTER *pAd, IN CHAR *Ssid, - IN UCHAR SsidLen, -#ifdef FOLLOW_HIDDEN_SSID_FEATURE - IN UCHAR *Bssid, -#endif - IN UCHAR Channel); - -VOID ApCliCheckConConnectivity(RTMP_ADAPTER *pAd, APCLI_STRUCT *pApCliEntry, - BCN_IE_LIST *ie_list); - -VOID ApCliPeerCsaAction(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BCN_IE_LIST *ie_list); - -VOID APCli_Init(IN RTMP_ADAPTER *pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetDevOps); - -BOOLEAN ApCli_Open(RTMP_ADAPTER *pAd, PNET_DEV dev_p); -BOOLEAN ApCli_Close(RTMP_ADAPTER *pAd, PNET_DEV dev_p); - -BOOLEAN ApCliWaitProbRsp(RTMP_ADAPTER *pAd, USHORT ifIndex); -VOID ApCliSimulateRecvBeacon(RTMP_ADAPTER *pAd); - -#ifdef APCLI_AUTO_CONNECT_SUPPORT -extern INT Set_ApCli_Enable_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -extern INT Set_ApCli_Bssid_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -BOOLEAN ApCliAutoConnectExec(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev); - -VOID ApCliSwitchCandidateAP(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev); - -#ifdef APCLI_AUTO_BW_TMP /* should be removed after apcli auto-bw is applied */ -BOOLEAN ApCliAutoConnectBWAdjust(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN BSS_ENTRY *bss_entry); -#endif /* APCLI_AUTO_BW_TMP */ -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - -#ifdef DOT11W_PMF_SUPPORT -INT Set_ApCliPMFMFPC_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_ApCliPMFMFPR_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_ApCliPMFSHA256_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /* DOT11W_PMF_SUPPORT */ - -#ifdef APCLI_SAE_SUPPORT -INT set_apcli_sae_group_proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif - -#ifdef APCLI_OWE_SUPPORT -INT set_apcli_owe_group_proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif - -VOID ApCliRTMPReportMicError(IN RTMP_ADAPTER *pAd, IN UCHAR uniCastKey, - IN INT ifIndex); - -VOID apcli_dync_txop_alg(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, UINT tx_tp, - UINT rx_tp); - -INT apcli_phy_rrm_init_byRf(RTMP_ADAPTER *pAd, UCHAR RfIC); -INT apcli_link_up(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT apcli_inf_open(struct wifi_dev *wdev); -INT apcli_inf_close(struct wifi_dev *wdev); - -VOID ApCliMlmeDeauthReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - -INT apcli_add_pmkid_cache(IN PRTMP_ADAPTER pAd, IN UCHAR *paddr, - IN UCHAR *pmkid, IN UCHAR *pmk, IN UINT8 pmk_len, - IN UINT8 if_index, IN UINT8 cli_idx); - -INT apcli_search_pmkid_cache(IN PRTMP_ADAPTER pAd, IN UCHAR *paddr, - IN UCHAR if_index, IN UCHAR cli_idx); - -VOID apcli_delete_pmkid_cache(IN PRTMP_ADAPTER pAd, IN UCHAR *paddr, - IN UCHAR if_index, IN UCHAR cli_idx); - -VOID apcli_delete_pmkid_cache_all(IN PRTMP_ADAPTER pAd, IN UCHAR if_index); - -INT set_apcli_del_pmkid_list(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif - -#ifdef APCLI_OWE_SUPPORT - -VOID apcli_reset_owe_parameters(IN PRTMP_ADAPTER pAd, IN UCHAR if_index); - -#endif - -#endif /* APCLI_SUPPORT */ - -#endif /* _AP_APCLI_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_autoChSel.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_autoChSel.h deleted file mode 100644 index 2e99fbfd3b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_autoChSel.h +++ /dev/null @@ -1,146 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Abstract: - - - */ - -#include "ap_autoChSel_cmm.h" - -#ifndef __AUTOCHSELECT_H__ -#define __AUTOCHSELECT_H__ - -ULONG AutoChBssSearchWithSSID(IN PRTMP_ADAPTER pAd, IN PUCHAR Bssid, - IN PUCHAR pSsid, IN UCHAR SsidLen, - IN UCHAR Channel, IN struct wifi_dev *pwdev); - -VOID APAutoChannelInit(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *pwdev); - -VOID UpdateChannelInfo(IN PRTMP_ADAPTER pAd, IN int ch, IN ChannelSel_Alg Alg, - IN struct wifi_dev *pwdev); - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -#define IS_V10_BOOTACS_INVALID(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bV10BootACSValid == TRUE) - -#define SET_V10_BOOTACS_INVALID(_pAd, valid) \ - (_pAd->CommonCfg.DfsParameter.bV10BootACSValid = valid) - -#define IS_V10_APINTF_DOWN(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bV10APInterfaceDownEnbl == TRUE) - -#define SET_V10_APINTF_DOWN(_pAd, valid) \ - (_pAd->CommonCfg.DfsParameter.bV10APInterfaceDownEnbl = valid) - -#define IS_V10_W56_AP_DOWN_ENBLE(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bV10W56APDownEnbl == TRUE) - -#define SET_V10_W56_AP_DOWN(_pAd, valid) \ - (_pAd->CommonCfg.DfsParameter.bV10W56APDownEnbl = valid) - -#define SET_V10_AP_BCN_UPDATE_ENBL(_pAd, enable) \ - (_pAd->CommonCfg.DfsParameter.bV10APBcnUpdateEnbl = enable) - -#define IS_V10_AP_BCN_UPDATE_ENBL(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bV10APBcnUpdateEnbl == TRUE) - -VOID AutoChannelSkipListAppend(IN PRTMP_ADAPTER pAd, IN UCHAR Ch); - -VOID AutoChannelSkipChannels(IN PRTMP_ADAPTER pAd, IN UCHAR size, - IN UINT16 grpStart); - -VOID AutoChannelSkipListClear(IN PRTMP_ADAPTER pAd); - -BOOLEAN DfsV10ACSMarkChnlConsumed(IN PRTMP_ADAPTER pAd, IN UCHAR channel); -#endif - -ULONG AutoChBssInsertEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pBssid, - IN CHAR Ssid[], IN UCHAR SsidLen, IN UCHAR ChannelNo, - IN UCHAR ExtChOffset, IN CHAR Rssi, - IN struct wifi_dev *pwdev); - -VOID AutoChBssTableInit(IN PRTMP_ADAPTER pAd); - -VOID ChannelInfoInit(IN PRTMP_ADAPTER pAd); - -VOID AutoChBssTableDestroy(IN PRTMP_ADAPTER pAd); - -VOID ChannelInfoDestroy(IN PRTMP_ADAPTER pAd); - -VOID CheckPhyModeIsABand(IN PRTMP_ADAPTER pAd, IN UINT8 BandIdx); - -UCHAR SelectBestChannel(IN PRTMP_ADAPTER pAd, IN ChannelSel_Alg Alg, - IN struct wifi_dev *pwdev); -UCHAR APAutoSelectChannel(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *pwdev, - IN ChannelSel_Alg Alg, IN BOOLEAN IsABand); - -UCHAR MTAPAutoSelectChannel(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev, - IN ChannelSel_Alg Alg, IN BOOLEAN IsABand); - -#ifdef AP_SCAN_SUPPORT -VOID AutoChannelSelCheck(IN PRTMP_ADAPTER pAd); -#endif /* AP_SCAN_SUPPORT */ - -VOID AutoChSelBuildChannelList(IN RTMP_ADAPTER *pAd, IN BOOLEAN IsABand, - IN struct wifi_dev *pwdev); - -VOID AutoChSelBuildChannelListFor2G(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *pwdev); - -VOID AutoChSelBuildChannelListFor5G(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *pwdev); - -VOID AutoChSelUpdateChannel(IN PRTMP_ADAPTER pAd, IN UCHAR Channel, - IN BOOLEAN IsABand, IN struct wifi_dev *pwdev); - -CHAR AutoChSelFindScanChIdx(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev, - IN CHAR LastScanChIdx); - -VOID AutoChSelScanNextChannel(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev); - -VOID AutoChSelScanReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *pElem); - -VOID AutoChSelScanTimeoutAction(IN RTMP_ADAPTER *pAd, - IN MLME_QUEUE_ELEM *pElem); - -VOID AutoChSelScanStart(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *pwdev); - -VOID AutoChSelScanTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID AutoChSelStateMachineInit(IN RTMP_ADAPTER *pAd, IN UCHAR BandIdx, - IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID AutoChSelInit(IN PRTMP_ADAPTER pAd); - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -UINT8 SelectBestV10Chnl_From_List(IN RTMP_ADAPTER *pAd); -#endif - -#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(ONDEMAND_DFS) -VOID ChannelInfoResetNew(IN PRTMP_ADAPTER pAd); -#endif -#if defined(OFFCHANNEL_SCAN_FEATURE) && defined(ONDEMAND_DFS) -UINT8 SelectBestChannel_From_List(IN RTMP_ADAPTER *pAd, IN BOOLEAN IsABand, - IN BOOLEAN SkipDFS); -#endif - -VOID AutoChSelRelease(IN PRTMP_ADAPTER pAd); - -VOID auto_ch_select_set_cfg(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *buffer); - -#endif /* __AUTOCHSELECT_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_autoChSel_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_autoChSel_cmm.h deleted file mode 100644 index d04dedcbf4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_autoChSel_cmm.h +++ /dev/null @@ -1,177 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Abstract: - - - */ - -#ifndef __AUTOCHSELECT_CMM_H__ -#define __AUTOCHSELECT_CMM_H__ - -#define RSSI_TO_DBM_OFFSET 120 /* RSSI-115 = dBm */ - -/*Define for auto-channel state machine*/ -#define AUTO_CH_SEL_MACHINE_BASE 0 -#define AUTO_CH_SEL_SCAN_IDLE 0 -#define AUTO_CH_SEL_SCAN_LISTEN 1 -#define AUTO_CH_SEL_SCAN_MAX_STATE 2 - -#define AUTO_CH_SEL_SCAN_REQ 0 -#define AUTO_CH_SEL_SCAN_TIMEOUT 1 -#define AUTO_CH_SEL_SCAN_MAX_MSG 2 - -#define AUTO_CH_SEL_SCAN_FUNC_SIZE \ - (AUTO_CH_SEL_SCAN_MAX_STATE * AUTO_CH_SEL_SCAN_MAX_MSG) - -#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(TR181_SUPPORT) || \ - defined(TXRX_STAT_SUPPORT) -typedef struct _CHANENL_BUSY_TIME { - UINT32 Rx_Time; - UINT32 Tx_Time; - UINT32 Obss_Time; -} CHANNEL_BUSY_TIME, *PCHANNEL_BUSY_TIME; -#endif - -#ifdef ACS_CTCC_SUPPORT -struct acs_scan_ch_group_list { - UCHAR best_ctrl_channel; /* Min in group */ - UCHAR cen_channel; - UCHAR regulatory_domain; - UINT32 max_busy_time; /* Max in group */ - UINT32 min_busy_time; /* Min in group */ - BOOLEAN skip_group; - UINT32 grp_score; - struct auto_ch_sel_grp_member bw80_grp_ch_member[4]; - UCHAR bw80_grp_ch_member_idx; - BOOLEAN bw80_not_allowed; - struct auto_ch_sel_grp_member bw40_grp_ch_member[2]; - UCHAR bw40_grp_ch_member_idx; - BOOLEAN bw40_not_allowed; -}; -struct acs_scan_supp_ch_list { - UCHAR group_type; /*0:BW20, 1:BW40, 2:BW80 */ - ULONG ap_cnt; - UCHAR channel; - UCHAR cen_channel; - UCHAR dfs_req; - UCHAR regulatory_domain; - BOOLEAN skip_channel; - UINT32 busy_time; - UCHAR flags; -}; -#define CHANNEL_DEFAULT_PROP 0x00 -#define CHANNEL_DISABLED 0x01 /* no use */ -#define CHANNEL_PASSIVE_SCAN 0x02 -#define CHANNEL_NO_IBSS 0x04 -#define CHANNEL_RADAR 0x08 -#define CHANNEL_NO_FAT_ABOVE 0x10 -#define CHANNEL_NO_FAT_BELOW 0x20 -#define CHANNEL_40M_CAP 0x40 -#define CHANNEL_80M_CAP 0x80 -#endif -typedef struct { - ULONG dirtyness[MAX_NUM_OF_CHANNELS + 1]; - ULONG ApCnt[MAX_NUM_OF_CHANNELS + 1]; - UINT32 FalseCCA[MAX_NUM_OF_CHANNELS + 1]; - BOOLEAN SkipList[MAX_NUM_OF_CHANNELS + 1]; -#ifdef OFFCHANNEL_SCAN_FEATURE - UINT32 ChannelNo; - UINT8 ChannelIdx; - BOOLEAN GetChannelInfo; - CHANNEL_BUSY_TIME ChStats; - INT32 AvgNF; - UCHAR bandidx; - UINT32 diff_time; -#endif - /* #ifdef AP_QLOAD_SUPPORT */ - UINT32 chanbusytime[MAX_NUM_OF_CHANNELS + 1]; /* QLOAD ALARM */ - /* #endif */ /* AP_QLOAD_SUPPORT */ - BOOLEAN IsABand; -#ifdef ACS_CTCC_SUPPORT - struct auto_ch_sel_score channel_score[MAX_NUM_OF_CHANNELS + 1]; - UINT32 channel_list_num; - UINT32 group_ch_list_num; - struct acs_scan_supp_ch_list supp_ch_list[MAX_NUM_OF_CHANNELS + 1]; - struct acs_scan_ch_group_list group_ch_list[MAX_NUM_OF_CHANNELS + 1]; -#endif -} CHANNELINFO, *PCHANNELINFO; - -typedef struct { - UCHAR Bssid[MAC_ADDR_LEN]; - UCHAR SsidLen; - CHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR Channel; - UCHAR ExtChOffset; - CHAR Rssi; -} BSSENTRY, *PBSSENTRY; - -typedef struct { - UCHAR BssNr; - BSSENTRY BssEntry[MAX_LEN_OF_BSS_TABLE]; -} BSSINFO, *PBSSINFO; - -typedef struct _AUTOCH_SEL_CH_LIST { - UCHAR Channel; - UCHAR Flags; - UCHAR CentralChannel; - UCHAR Bw; - UCHAR PhyMode; - BOOLEAN BwCap; - BOOLEAN SkipChannel; - - /* - Channel property: - - CHANNEL_DISABLED: The channel is disabled. - CHANNEL_PASSIVE_SCAN: Only passive scanning is allowed. - CHANNEL_NO_IBSS: IBSS is not allowed. - CHANNEL_RADAR: Radar detection is required. - CHANNEL_NO_FAT_ABOVE: Extension channel above this channel is not allowed. - CHANNEL_NO_FAT_BELOW: Extension channel below this channel is not allowed. - CHANNEL_40M_CAP: 40 BW channel group - CHANNEL_80M_CAP: 80 BW channel group - */ -#define CHANNEL_DEFAULT_PROP 0x00 -#define CHANNEL_DISABLED 0x01 /* no use */ -#define CHANNEL_PASSIVE_SCAN 0x02 -#define CHANNEL_NO_IBSS 0x04 -#define CHANNEL_RADAR 0x08 -#define CHANNEL_NO_FAT_ABOVE 0x10 -#define CHANNEL_NO_FAT_BELOW 0x20 -#define CHANNEL_40M_CAP 0x40 -#define CHANNEL_80M_CAP 0x80 -} AUTOCH_SEL_CH_LIST, *PAUTOCH_SEL_CH_LIST; - -typedef enum { - ACS_CH_STATE_NONE = 0, - ACS_CH_STATE_SELECTED, -} ACS_CH_LIST_STATE; - -typedef struct _AUTOCH_SEL_CTRL { - struct wifi_dev *pScanReqwdev; - CHAR ScanChIdx; - UCHAR SelCh; /*The channel is selected after ACS is executed*/ - UCHAR ChListNum; - ACS_CH_LIST_STATE ACSChStat; - UCHAR IsABand; - RALINK_TIMER_STRUCT AutoChScanTimer; - STATE_MACHINE AutoChScanStatMachine; - STATE_MACHINE_FUNC AutoChScanFunc[AUTO_CH_SEL_SCAN_FUNC_SIZE]; - AUTOCH_SEL_CH_LIST AutoChSelChList[MAX_NUM_OF_CHANNELS + 1]; - TIMER_FUNC_CONTEXT ACSTimerFuncContex; -} AUTOCH_SEL_CTRL, *PAUTOCH_SEL_CTRL; - -#endif /* __AUTOCHSELECT_CMM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_cfg.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_cfg.h deleted file mode 100644 index f0b8e7c25a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_cfg.h +++ /dev/null @@ -1,304 +0,0 @@ -#ifndef __AP_CFG_H__ -#define __AP_CFG_H__ - -INT RTMPAPPrivIoctlSet(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr); - -INT RTMPAPPrivIoctlShow(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr); - -#ifdef VENDOR_FEATURE6_SUPPORT -VOID RTMPAPGetAssoMacTable(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr); -#endif /* VENDOR_FEATURE6_SUPPORT */ - -#if defined(INF_AR9) || defined(BB_SOC) -#if defined(AR9_MAPI_SUPPORT) || defined(BB_SOC) -INT RTMPAPPrivIoctlAR9Show(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr); - -VOID RTMPAR9IoctlGetMacTable(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetSTAT2(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetRadioDynInfo(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /*AR9_MAPI_SUPPORT*/ -#endif /* INF_AR9 */ - -INT RTMPAPSetInformation(IN PRTMP_ADAPTER pAd, - IN OUT RTMP_IOCTL_INPUT_STRUCT *rq, IN INT cmd); - -INT RTMPAPQueryInformation(IN PRTMP_ADAPTER pAd, - IN OUT RTMP_IOCTL_INPUT_STRUCT *rq, IN INT cmd); - -VOID RTMPIoctlStatistics(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -INT RTMPIoctlRXStatistics(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetMacTableStaInfo(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetMacTable(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetDriverInfo(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPAPIoctlE2PROM(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -#if defined(DBG) || (defined(BB_SOC) && defined(CONFIG_ATE)) -VOID RTMPAPIoctlBBP(IN PRTMP_ADAPTER pAdapter, IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -#ifdef RTMP_RF_RW_SUPPORT -VOID RTMPAPIoctlRF(IN PRTMP_ADAPTER pAdapter, IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /* RTMP_RF_RW_SUPPORT */ - -#endif /* DBG */ - -VOID RtmpDrvMaxRateGet( - IN VOID *pReserved, - /* IN PHTTRANSMIT_SETTING pHtPhyMode, */ - IN UINT8 MODE, IN UINT8 ShortGI, IN UINT8 BW, IN UINT8 MCS, - IN UINT8 Antenna, OUT UINT32 *pRate); - -#ifdef WSC_AP_SUPPORT -VOID RTMPGetCurrentCred(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -VOID RTMPIoctlWscProfile(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlWscProfile(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -/*add by woody */ -#if defined(INF_AR9) || defined(BB_SOC) -#if defined(AR9_MAPI_SUPPORT) || defined(BB_SOC) -VOID RTMPAR9IoctlWscProfile(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlWscPINCode(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlWscStatus(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetWscDynInfo(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetWscRegsDynInfo(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /*AR9_MAPI_SUPPORT*/ -#endif /* INF_AR9 */ -#endif /* WSC_AP_SUPPORT */ - -#ifdef DOT11_N_SUPPORT -VOID RTMPIoctlQueryBaTable(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /* DOT11_N_SUPPORT */ - -#ifdef DOT1X_SUPPORT -VOID RTMPIoctlAddPMKIDCache(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlSetIdleTimeout(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlQueryStaAid(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlQueryStaRsn(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -#ifdef RADIUS_ACCOUNTING_SUPPORT -VOID RTMPIoctlQueryStaData(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /* RADIUS_ACCOUNTING_SUPPORT */ - -#ifdef RADIUS_MAC_ACL_SUPPORT -PRT_802_11_RADIUS_ACL_ENTRY RadiusFindAclEntry(PLIST_HEADER pCacheList, - IN PUCHAR pMacAddr); - -VOID RTMPIoctlAddRadiusMacAuthCache(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlDelRadiusMacAuthCache(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlClearRadiusMacAuthCache(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /* RADIUS_MAC_ACL_SUPPORT */ -#endif /* DOT1X_SUPPORT */ - -INT Set_AP_Daemon_Status(IN PRTMP_ADAPTER pAd, IN UINT8 WorkSpaceID, - IN BOOLEAN Status); - -#ifdef CONFIG_HOTSPOT -INT Send_ANQP_Rsp(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *ANQPReq, IN UINT32 ANQPReqLen); -#endif - -INT ApCfg_Set_PerMbssMaxStaNum_Proc(IN PRTMP_ADAPTER pAd, IN INT apidx, - IN RTMP_STRING *arg); - -INT ApCfg_Set_IdleTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -struct apcfg_parameters { - LONG cfg_mode[2]; /*WirelessMode*/ - ULONG tx_power_percentage; /*TxPower*/ - ULONG tx_preamble; /*TxPreamble*/ - UINT32 conf_len_thld; /*RTSThreshold*/ - UINT32 oper_len_thld; - UINT32 conf_frag_thld; /*FragThreshold*/ - UINT32 oper_frag_thld; - BOOLEAN bEnableTxBurst; /*TxBurst*/ - BOOLEAN bUseShortSlotTime; /*ShortSlot*/ -#ifdef DOT11_N_SUPPORT - UCHAR conf_ht_bw; /*HT_BW*/ - UCHAR oper_ht_bw; -#ifdef DOT11N_DRAFT3 - BOOLEAN bBssCoexEnable; /*HT_BSSCoexistence*/ -#endif - UCHAR ht_tx_streams; /*HT_TxStream*/ - UCHAR ht_rx_streams; /*HT_RxStream*/ - BOOLEAN bBADecline; /*HT_BADecline*/ - UINT32 AutoBA; /*HT_AutoBA*/ - UINT32 AmsduEnable; /*HT_AMSDU*/ - UINT32 RxBAWinLimit; /*HT_BAWinSize*/ - UCHAR ht_gi; /*HT_GI*/ - UCHAR ht_stbc; /*HT_STBC*/ - UCHAR ht_ldpc; /*HT_LDPC*/ - BOOLEAN bRdg; /*HT_RDG*/ -#endif - - BOOLEAN HT_DisallowTKIP; /*HT_DisallowTKIP*/ - -#ifdef DOT11_VHT_AC - UCHAR conf_vht_bw; /*VHT_BW*/ - UCHAR oper_vht_bw; - UCHAR vht_sgi; /*VHT_SGI*/ - UCHAR vht_stbc; /*VHT_STBC*/ - UCHAR vht_bw_signal; /*VHT_BW_SIGNAL*/ - UCHAR vht_ldpc; /*VHT_LDPC*/ - BOOLEAN g_band_256_qam; /*G_BAND_256QAM*/ -#endif - - BOOLEAN bIEEE80211H; /*IEEE80211H*/ - -#ifdef MT_DFS_SUPPORT - BOOLEAN bDfsEnable; /*DfsEnable*/ -#endif - -#ifdef BACKGROUND_SCAN_SUPPORT - BOOLEAN DfsZeroWaitSupport; /*DfsZeroWait*/ -#endif - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT - ULONG ETxBfEnCond; /*ETxBfEnCond*/ -#endif -#endif - - UINT32 ITxBfEn; /*ITxBfEn*/ - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT - ULONG MUTxRxEnable; /*MUTxRxEnable*/ -#endif -#endif - UCHAR channel; - UCHAR CentralChannel; - UCHAR ext_channel; -}; - -INT Set_Quick_Channel_Switch_En_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef CONFIG_AP_SUPPORT -void ap_phy_rrm_init_byRf(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -#endif -#ifdef CONFIG_MAP_SUPPORT -INT Set_Bh_Bss_Proc(PRTMP_ADAPTER pAd, char *arg); -INT Set_Fh_Bss_Proc(PRTMP_ADAPTER pAd, char *arg); -INT Set_Map_Proc(PRTMP_ADAPTER pAd, char *arg); -INT Set_Map_Channel_Proc(PRTMP_ADAPTER pAd, char *arg); -INT Set_Map_Channel_En_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -VOID MacTableResetNonMapWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -#ifdef MAP_R2 -INT Set_Map_Bh_Primary_Vid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Map_Bh_Primary_Pcp_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Map_Bh_Vid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Map_Fh_Vid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Map_Transparent_Vid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MapR2_Proc(PRTMP_ADAPTER pAd, char *arg); -INT Show_MapR2_Policy_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -#ifdef MAP_TS_TRAFFIC_SUPPORT -INT Set_MapTS_Proc(PRTMP_ADAPTER pAd, char *arg); -#endif -#ifdef MAP_BL_SUPPORT -INT Set_BlackList_Add(PRTMP_ADAPTER pAd, char *arg); -INT Set_BlackList_Del(PRTMP_ADAPTER pAd, char *arg); -INT Set_BlackList_Show(PRTMP_ADAPTER pAd, char *arg); -#endif /* MAP_BL_SUPPORT */ -#endif /* CONFIG_MAP_SUPPORT */ - -#ifdef CONFIG_RA_PHY_RATE_SUPPORT -INT Set_BcnPhyMode(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_BcnMcs(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Show_BcnRate(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - -#ifdef DPP_SUPPORT -INT Set_Enable_Dpp_Proc(PRTMP_ADAPTER pAd, char *arg); -#endif /* DPP_SUPPORT */ - -#ifdef APCLI_SUPPORT -#endif /* APCLI_SUPPORT */ - -INT set_qiscdump_proc(struct _RTMP_ADAPTER *ad, RTMP_STRING *arg); - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -INT set_ch_switch_monitor_cfg(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - UCHAR BandIdx, struct ch_switch_cfg *ch_sw_cfg); -VOID ch_switch_monitor_state_machine_init(struct _RTMP_ADAPTER *pAd); -VOID ch_switch_monitor_del(struct _RTMP_ADAPTER *pAd); -VOID ch_switch_monitor_timeout(IN PVOID system_specific1, - IN PVOID function_context, - IN PVOID system_specific2, - IN PVOID system_specific3); -extern INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode, - struct wifi_dev *pwdev); -#endif -#ifdef OCE_FILS_SUPPORT -VOID RTMPIoctlStaMlmeEvent(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlRsneSyncEvent(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlKeyEvent(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlPmkCacheEvent(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -#endif /* OCE_FILS_SUPPORT */ - -INT Set_Sta_Idle_Check(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_Sta_Fast_Idle_Check_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef DPP_SUPPORT -INT wext_send_dpp_cached_frame(struct wifi_dev *wdev, UINT32 frm_id, - RTMP_IOCTL_INPUT_STRUCT *wrq); -INT mtk_cancel_roc(PRTMP_ADAPTER pAd, struct wifi_dev *wdev); -INT mtk_start_roc(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct roc_req *roc); -INT mtk_set_pmk(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct pmk_req *pmk_data); -INT ch_switch_monitor_cancel(PRTMP_ADAPTER pAd, - struct ch_switch_cfg *ch_sw_cfg); -INT mtk_send_offchannel_action_frame(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct action_frm_data *frm); -#endif /*DPP_SUPPORT*/ - -#endif /* __AP_CFG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_ids.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_ids.h deleted file mode 100644 index 21b11eeae5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_ids.h +++ /dev/null @@ -1,52 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - ap_ids.c - - Abstract: - IDS definition - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - */ - -VOID RTMPIdsPeriodicExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -BOOLEAN RTMPSpoofedMgmtDetection(IN RTMP_ADAPTER *pAd, IN RX_BLK *rxblk); - -VOID RTMPConflictSsidDetection(IN PRTMP_ADAPTER pAd, IN PUCHAR pSsid, - IN UCHAR SsidLen, IN CHAR Rssi0, IN CHAR Rssi1, - IN CHAR Rssi2 -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - IN CHAR Rssi3 -#endif -); - -BOOLEAN RTMPReplayAttackDetection(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr2, - IN RX_BLK *rxblk); - -VOID RTMPUpdateStaMgmtCounter(IN PRTMP_ADAPTER pAd, IN USHORT type); - -VOID RTMPClearAllIdsCounter(IN PRTMP_ADAPTER pAd); - -VOID RTMPIdsStart(IN PRTMP_ADAPTER pAd); - -VOID RTMPIdsStop(IN PRTMP_ADAPTER pAd); - -VOID rtmp_read_ids_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer); diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mbss.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mbss.h deleted file mode 100644 index 06196f5c7c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mbss.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_mbss.h - - Abstract: - Support multi-BSS function. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Sample Lin 01-02-2007 created -*/ - -/* - For MBSS, the phy mode is different; - So MBSS_PHY_MODE_RESET() can help us to adjust the correct mode & - maximum MCS for the BSS. -*/ -#define MBSS_PHY_MODE_RESET(__BssId, __HtPhyMode) \ - { \ - UCHAR __PhyMode = pAd->ApCfg.MBSSID[__BssId].wdev.PhyMode; \ - if ((__PhyMode == WMODE_B) && \ - (__HtPhyMode.field.MODE != MODE_CCK)) { \ - __HtPhyMode.field.MODE = MODE_CCK; \ - __HtPhyMode.field.MCS = 3; \ - } else if ((!WMODE_CAP_N(__PhyMode)) && \ - (__PhyMode != WMODE_B) && \ - (__HtPhyMode.field.MODE != MODE_OFDM)) { \ - __HtPhyMode.field.MODE = MODE_OFDM; \ - __HtPhyMode.field.MCS = 7; \ - } else if ((__PhyMode != WMODE_B) && (__PhyMode != WMODE_G) && \ - (__PhyMode != WMODE_A) && \ - (!WMODE_CAP_AC(__PhyMode)) && \ - (__HtPhyMode.field.MODE != MODE_HTMIX)) { \ - __HtPhyMode.field.MODE = MODE_HTMIX; \ - __HtPhyMode.field.MCS = 7; \ - } else { \ - __HtPhyMode.field.MODE = MODE_VHT; \ - __HtPhyMode.field.MCS = 9; \ - __HtPhyMode.field.BW = BW_80; \ - } \ - } - -/* Public function list */ -INT Show_MbssInfo_Display_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps); - -VOID MBSS_Remove(RTMP_ADAPTER *pAd); - -INT32 RT28xx_MBSS_IdxGet(IN PRTMP_ADAPTER pAd, IN PNET_DEV pDev); - -#ifdef MT_MAC -INT ext_mbss_hw_cr_enable(PNET_DEV pDev); -INT ext_mbss_hw_cr_disable(PNET_DEV pDev); -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mumimo.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mumimo.h deleted file mode 100644 index da82b08eaf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mumimo.h +++ /dev/null @@ -1,809 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_mumimo.h - - Abstract: - Miniport generic portion header file - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __AP_MUMIMO_H__ -#define __AP_MUMIMO_H__ - -#define NUM_OF_USER 4 -#define NUM_OF_MODUL 5 - -#define NUM_MUT_FEC 2 -#define NUM_MUT_NR 3 -#define NUM_MUT_MCS 10 -#define NUM_MUT_INDEX 8 -#define NUM_SUT_INDEX 3 - -enum { - /* debug commands */ - MU_SET_ENABLE = 0, - MU_GET_ENABLE, - MU_SET_MUPROFILE_ENTRY, - MU_GET_MUPROFILE_ENTRY, - MU_SET_GROUP_TBL_ENTRY, - MU_GET_GROUP_TBL_ENTRY, - MU_SET_CLUSTER_TBL_ENTRY, - MU_GET_CLUSTER_TBL_ENTRY, - MU_SET_GROUP_USER_THRESHOLD, - MU_GET_GROUP_USER_THRESHOLD, - MU_SET_GROUP_NSS_THRESHOLD, - MU_GET_GROUP_NSS_THRESHOLD, - MU_SET_TXREQ_MIN_TIME, - MU_GET_TXREQ_MIN_TIME, - MU_SET_SU_NSS_CHECK, - MU_GET_SU_NSS_CHECK, - MU_SET_CALC_INIT_MCS, - MU_GET_CALC_INIT_MCS, - MU_SET_TXOP_DEFAULT, - MU_GET_TXOP_DEFAULT, - MU_SET_SU_LOSS_THRESHOLD, - MU_GET_SU_LOSS_THRESHOLD, - MU_SET_MU_GAIN_THRESHOLD, - MU_GET_MU_GAIN_THRESHOLD, - MU_SET_SECONDARY_AC_POLICY, - MU_GET_SECONDARY_AC_POLICY, - MU_SET_GROUP_TBL_DMCS_MASK, - MU_GET_GROUP_TBL_DMCS_MASK, - MU_SET_MAX_GROUP_SEARCH_CNT, - MU_GET_MAX_GROUP_SEARCH_CNT, - MU_GET_MU_PROFILE_TX_STATUS_CNT, - MU_SET_TRIGGER_MU_TX, - /* F/W flow test commands */ - MU_SET_TRIGGER_GROUP, - MU_SET_TRIGGER_DEGROUP, - MU_SET_TRIGGER_GID_MGMT_FRAME, - MU_SET_TRIGGER_BBP, - MU_SET_TRIGGER_SND, - /* HQA AP commands */ - MU_HQA_SET_ENABLE = 70, - MU_HQA_SET_SNR_OFFSET, - MU_HQA_SET_ZERO_NSS, - MU_HQA_SET_SPEED_UP_LQ, - MU_HQA_SET_GROUP, - MU_HQA_SET_MU_TABLE, - MU_HQA_SET_SU_TABLE, - MU_HQA_SET_CALC_LQ, - MU_HQA_GET_CALC_LQ, - MU_HQA_SET_CALC_INIT_MCS, - MU_HQA_GET_CALC_INIT_MCS, - MU_HQA_GET_QD, - MU_HQA_GET_CALC_SU_LQ, - MU_HQA_SET_CALC_SU_LQ, -}; - -enum { - MU_EVENT_MU_ENABLE, - MU_EVENT_MUPROFILE_ENTRY, - MU_EVENT_GROUP_TBL_ENTRY, - MU_EVENT_CLUSTER_TBL_ENTRY, - MU_EVENT_GROUP_USER_THRESHOLD, - MU_EVENT_GROUP_NSS_THRESHOLD, - MU_EVENT_TXREQ_MIN_TIME, - MU_EVENT_CALC_INIT_MCS, - MU_EVENT_SU_NSS_CHECK, - MU_EVENT_TXOP_DEFAULT, - MU_EVENT_SU_LOSS_THRESHOLD, - MU_EVENT_MU_GAIN_THRESHOLD, - MU_EVENT_SECONDARY_AC_POLICY, - MU_EVENT_GROUP_TBL_DMCS_MASK, - MU_EVENT_MAX_GROUP_SEARCH_CNT, - MU_EVENT_MUPROFILE_TX_STS_CNT, - MU_EVENT_STATUS, - /* HQA AP event */ - MU_EVENT_HQA_GET_INIT_MCS = 70, - MU_EVENT_HQA_GET_LQ, - MU_EVENT_HQA_GET_SU_LQ, - MU_EVENT_HQA_GET_QD, - MU_EVENT_HQA_STATUS, -}; - -typedef struct _CMD_MU_SET_ENABLE { - UINT8 fgIsEnable; -} CMD_MU_SET_ENABLE, *P_CMD_MU_SET_ENABLE; - -typedef struct _CMD_MU_SET_MUPROFILE_ENTRY { - UINT8 index; - BOOLEAN valid; -#ifdef RT_BIG_ENDIAN - UINT8 reserved : 4; - UINT8 baMask : 4; -#else - UINT8 baMask : 4; - UINT8 reserved : 4; -#endif - UINT8 wlanIdx; -} CMD_MU_SET_MUPROFILE_ENTRY, *P_CMD_MU_SET_MUPROFILE_ENTRY; - -typedef struct _CMD_MU_SET_GROUP_TBL_ENTRY { - UINT32 index; -#ifdef RT_BIG_ENDIAN - UINT8 NS3 : 1; - UINT8 NS2 : 1; - UINT8 NS1 : 1; - UINT8 NS0 : 1; - UINT8 BW : 2; - UINT8 numUser : 2; -#else - UINT8 numUser : 2; - UINT8 BW : 2; - UINT8 NS0 : 1; - UINT8 NS1 : 1; - UINT8 NS2 : 1; - UINT8 NS3 : 1; -#endif - UINT8 PFIDUser0; - UINT8 PFIDUser1; - UINT8 PFIDUser2; - UINT8 PFIDUser3; - BOOLEAN fgIsShortGI; - BOOLEAN fgIsUsed; - BOOLEAN fgIsDisable; -#ifdef RT_BIG_ENDIAN - UINT8 dMcsUser3 : 4; - UINT8 dMcsUser2 : 4; - UINT8 dMcsUser1 : 4; - UINT8 dMcsUser0 : 4; - UINT8 initMcsUser3 : 4; - UINT8 initMcsUser2 : 4; - UINT8 initMcsUser1 : 4; - UINT8 initMcsUser0 : 4; -#else - UINT8 initMcsUser0 : 4; - UINT8 initMcsUser1 : 4; - UINT8 initMcsUser2 : 4; - UINT8 initMcsUser3 : 4; - UINT8 dMcsUser0 : 4; - UINT8 dMcsUser1 : 4; - UINT8 dMcsUser2 : 4; - UINT8 dMcsUser3 : 4; -#endif -} CMD_MU_SET_GROUP_TBL_ENTRY, *P_CMD_MU_SET_GROUP_TBL_ENTRY; - -typedef struct _CMD_MU_SET_CLUSTER_TBL_ENTRY { - UINT8 index; - UINT32 gidUserMemberStatus[2]; - UINT32 gidUserPosition[4]; -} CMD_MU_SET_CLUSTER_TBL_ENTRY, *P_CMD_MU_SET_CLUSTER_TBL_ENTRY; - -typedef struct _CMD_SET_TXREQ_MIN_TIME { - UINT16 value; -} CMD_SET_TXREQ_MIN_TIME, *P_CMD_SET_TXREQ_MIN_TIME; - -typedef struct _CMD_SET_NSS_CHECK { - UINT8 fgIsEnable; -} CMD_SET_NSS_CHECK, *P_CMD_SET_NSS_CHECK; - -typedef struct _CMD_SET_SU_LOSS_THRESHOLD { - UINT16 value; -} CMD_SET_SU_LOSS_THRESHOLD, *P_CMD_SET_SU_LOSS_THRESHOLD; - -typedef struct _CMD_SET_MU_GAIN_THRESHOLD { - UINT16 value; -} CMD_SET_MU_GAIN_THRESHOLD, *P_CMD_SET_MU_GAIN_THRESHOLD; - -typedef struct _CMD_SET_TXOP_DEFAULT { - UINT32 value; -} CMD_SET_TXOP_DEFAULT, *P_CMD_SET_TXOP_DEFAULT; - -typedef struct _CMD_SET_GROUP_USER_THRESHOLD { - UINT8 min; - UINT8 max; -} CMD_SET_GROUP_USER_THRESHOLD, *P_CMD_SET_GROUP_USER_THRESHOLD; - -typedef struct _CMD_SET_MU_SECONDARY_AC_POLICY { - UINT16 value; -} CMD_SET_MU_SECONDARY_AC_POLICY, *P_CMD_SET_MU_SECONDARY_AC_POLICY; - -typedef struct _CMD_SET_MU_MAX_GROUP_SEARCH_CNT { - UINT32 value; -} CMD_SET_MU_MAX_GROUP_SEARCH_CNT, *P_CMD_SET_MU_MAX_GROUP_SEARCH_CNT; - -typedef struct _CMD_SET_MU_GROUP_TBL_DMCS_MASK { - UINT8 value; -} CMD_SET_MU_GROUP_TBL_DMCS_MASK, *P_CMD_SET_MU_GROUP_TBL_DMCS_MASK; - -typedef struct _CMD_SET_GROUP_NSS_THRESHOLD { - UINT8 min; - UINT8 max; -} CMD_SET_GROUP_NSS_THRESHOLD, *P_CMD_SET_GROUP_NSS_THRESHOLD; - -typedef struct _EVENT_SHOW_MU_ENABLE { - UINT32 u4EventId; - UINT8 fgIsEnable; -} EVENT_SHOW_MU_ENABLE, *P_EVENT_SHOW_MU_ENABLE; - -typedef struct _EVENT_STATUS { - UINT32 u4EventId; - UINT16 status; -} EVENT_STATUS, *P_EVENT_STATUS; - -typedef struct _EVENT_HQA_STATUS { - UINT32 u4EventId; - UINT16 status; -} EVENT_HQA_STATUS, *P_EVENT_HQA_STATUS; - -typedef struct _EVENT_SHOW_NSS_CHECK { - UINT32 u4EventId; - UINT8 fgIsEnable; -} EVENT_SHOW_NSS_CHECK, *P_EVENT_SHOW_NSS_CHECK; - -typedef struct _EVENT_SHOW_MUPROFILE_ENTRY { - UINT32 u4EventId; - UINT8 index; - BOOLEAN valid; -#ifdef RT_BIG_ENDIAN - UINT8 reserved : 4; - UINT8 baMask : 4; -#else - UINT8 baMask : 4; - UINT8 reserved : 4; -#endif - UINT8 wlanIdx; -} EVENT_SHOW_MUPROFILE_ENTRY, *P_EVENT_SHOW_MUPROFILE_ENTRY; - -typedef struct _EVENT_GET_TXOP_DEFAULT { - UINT32 u4EventId; - UINT32 value; -} EVENT_GET_TXOP_DEFAULT, *P_EVENT_GET_TXOP_DEFAULT; - -typedef struct _EVENT_SHOW_GROUP_TBL_ENTRY { - UINT32 u4EventId; - UINT32 index; -#ifdef RT_BIG_ENDIAN - UINT8 NS3 : 1; - UINT8 NS2 : 1; - UINT8 NS1 : 1; - UINT8 NS0 : 1; - UINT8 BW : 2; - UINT8 numUser : 2; -#else - UINT8 numUser : 2; - UINT8 BW : 2; - UINT8 NS0 : 1; - UINT8 NS1 : 1; - UINT8 NS2 : 1; - UINT8 NS3 : 1; -#endif - UINT8 PFIDUser0; - UINT8 PFIDUser1; - UINT8 PFIDUser2; - UINT8 PFIDUser3; - BOOLEAN fgIsShortGI; - BOOLEAN fgIsUsed; - BOOLEAN fgIsDisable; -#ifdef RT_BIG_ENDIAN - UINT8 initMcsUser1 : 4; - UINT8 initMcsUser0 : 4; -#else - UINT8 initMcsUser0 : 4; - UINT8 initMcsUser1 : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT8 initMcsUser3 : 4; - UINT8 initMcsUser2 : 4; -#else - UINT8 initMcsUser2 : 4; - UINT8 initMcsUser3 : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT8 dMcsUser1 : 4; - UINT8 dMcsUser0 : 4; -#else - UINT8 dMcsUser0 : 4; - UINT8 dMcsUser1 : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT8 dMcsUser3 : 4; - UINT8 dMcsUser2 : 4; -#else - UINT8 dMcsUser2 : 4; - UINT8 dMcsUser3 : 4; -#endif -} EVENT_SHOW_GROUP_TBL_ENTRY, *P_EVENT_SHOW_GROUP_TBL_ENTRY; - -typedef struct _EVENT_MU_GET_ENABLE { - UINT32 u4EventId; - UINT8 fgIsEnable; -} EVENT_MU_GET_ENABLE, *P_EVENT_MU_GET_ENABLE; - -typedef struct _EVENT_MU_GET_CLUSTER_TBL_ENTRY { - UINT32 u4EventId; - UINT8 index; - UINT32 gidUserMemberStatus[2]; - UINT32 gidUserPosition[4]; -} EVENT_MU_GET_CLUSTER_TBL_ENTRY, *P_EVENT_MU_GET_CLUSTER_TBL_ENTRY; - -typedef struct _EVENT_MU_GET_GROUP_USER_THRESHOLD { - UINT32 u4EventId; - UINT8 min; - UINT8 max; -} EVENT_MU_GET_GROUP_USER_THRESHOLD, *P_EVENT_MU_GET_GROUP_USER_THRESHOLD; - -typedef struct _EVENT_MU_GET_SU_LOSS_THRESHOLD { - UINT32 u4EventId; - UINT32 value; -} EVENT_MU_GET_SU_LOSS_THRESHOLD, *P_EVENT_MU_GET_SU_LOSS_THRESHOLD; - -typedef struct _EVENT_MU_GET_GROUP_NSS_THRESHOLD { - UINT32 u4EventId; - UINT8 min; - UINT8 max; -} EVENT_MU_GET_GROUP_NSS_THRESHOLD, *P_EVENT_MU_GET_GROUP_NSS_THRESHOLD; - -typedef struct _EVENT_MU_GET_TXOP_DEFAULT { - UINT_32 u4EventId; - UINT_8 value; -} EVENT_MU_GET_TXOP_DEFAULT, *P_EVENT_MU_GET_TXOP_DEFAULT; - -typedef struct _EVENT_MU_GET_MU_GAIN_THRESHOLD { - UINT32 u4EventId; - UINT32 value; -} EVENT_MU_GET_MU_GAIN_THRESHOLD, *P_EVENT_MU_GET_MU_GAIN_THRESHOLD; - -typedef struct _EVENT_MU_GET_SECONDARY_AC_POLICY { - UINT32 u4EventId; - UINT8 value; -} EVENT_MU_GET_SECONDARY_AC_POLICY, *P_EVENT_MU_GET_SECONDARY_AC_POLICY; - -typedef struct _EVENT_MU_GET_GROUP_TBL_DMCS_MASK { - UINT32 u4EventId; - UINT8 value; -} EVENT_MU_GET_GROUP_TBL_DMCS_MASK, *P_EVENT_MU_GET_GROUP_TBL_DMCS_MASK; - -typedef struct _EVENT_MU_GET_TXREQ_MIN_TIME { - UINT32 u4EventId; - UINT16 value; -} EVENT_MU_GET_TXREQ_MIN_TIME, *P_EVENT_MU_GET_TXREQ_MIN_TIME; - -typedef struct _EVENT_MU_GET_MAX_GROUP_SEARCH_CNT { - UINT32 u4EventId; - UINT32 value; -} EVENT_MU_GET_MAX_GROUP_SEARCH_CNT, *P_EVENT_MU_GET_MAX_GROUP_SEARCH_CNT; - -typedef struct _CMD_SET_TRIGGER_GID_MGMT_FRAME { - UINT16 wlanIndex; - UINT8 gid; - UINT8 up; -} CMD_SET_TRIGGER_GID_MGMT_FRAME, *P_CMD_SET_TRIGGER_GID_MGMT_FRAME; - -typedef struct _CMD_SET_TRIGGER_DEGROUP { - UINT8 ucMuProfileIndex; -} CMD_SET_TRIGGER_DEGROUP, *P_CMD_SET_TRIGGER_DEGROUP; - -typedef struct _CMD_SET_TRIGGER_GROUP { - UINT8 ucNum; -} CMD_SET_TRIGGER_GROUP, *P_CMD_SET_TRIGGER_GROUP; - -typedef struct _CMD_SET_TRIGGER_BBP { - UINT16 u2GroupIndex; -} CMD_SET_TRIGGER_BBP, *P_CMD_SET_TRIGGER_BBP; - -typedef struct _CMD_SET_TRIGGER_SND { - UINT16 u2Reserved; -} CMD_SET_TRIGGER_SND, *P_CMD_SET_TRIGGER_SND; - -typedef struct _CMD_SET_TRIGGER_MU_TX_FRAME { - UINT8 ucAcIndex; - BOOLEAN fgIsRandomPattern; - UINT32 u4NumOfSTAs; - UINT32 u4Round; - UINT32 au4PayloadLength[4]; - UINT8 aucWlanIndexArray[4]; /* TODO: jeffrey, replaced by marco */ -} CMD_SET_TRIGGER_MU_TX_FRAME, *P_CMD_SET_TRIGGER_MU_TX_FRAME; - -typedef struct _CMD_GET_MU_PFID_TXS_CNT { - UINT16 u2PfidIndex; -} CMD_GET_MU_PFID_TXS_CNT, *P_CMD_GET_MU_PFID_TXS_CNT; - -typedef struct _EVENT_MU_GET_MUPROFILE_TX_STATUS_CNT { - UINT32 u4EventId; - UINT16 pfIndex; - UINT16 cn2used; - UINT16 cn2rateDown; - UINT16 cn2deltaMcs; - UINT16 cn2TxFailCnt; - UINT16 cn2TxSuccessCnt; - UINT16 cn3used; - UINT16 cn3rateDown; - UINT16 cn3deltaMcs; - UINT16 cn3TxFailCnt; - UINT16 cn3TxSuccessCnt; - UINT16 cn4used; - UINT16 cn4rateDown; - UINT16 cn4deltaMcs; - UINT16 cn4TxFailCnt; - UINT16 cn4TxSuccessCnt; -} EVENT_MU_GET_MUPROFILE_TX_STATUS_CNT, *P_EVENT_MU_GET_MUPROFILE_TX_STATUS_CNT; - -typedef struct _MU_STRUCT_LQ_REPORT { - int lq_report[NUM_OF_USER][NUM_OF_MODUL]; -} MU_STRUCT_LQ_REPORT, *P_MU_STRUCT_LQ_REPORT; - -typedef struct _SU_STRUCT_LQ_REPORT { - int lq_report[NUM_OF_MODUL]; -} SU_STRUCT_LQ_REPORT, *P_SU_STRUCT_LQ_REPORT; - -typedef struct _MU_STRUCT_MU_TABLE { - UINT16 type; /* 0: SU, 1:MU */ - UINT32 length; - char *prTable; /* point to array of data */ -} MU_STRUCT_MU_TABLE, *P_MU_STRUCT_MU_TABLE; - -typedef struct _MU_STRUCT_MU_GROUP { - UINT32 groupIndex; /* Group Table Idx */ - UINT32 numOfUser; - UINT32 user0Ldpc; - UINT32 user1Ldpc; - UINT32 user2Ldpc; - UINT32 user3Ldpc; - UINT32 shortGI; - UINT32 bw; - UINT32 user0Nss; - UINT32 user1Nss; - UINT32 user2Nss; - UINT32 user3Nss; - UINT32 groupId; - UINT32 user0UP; - UINT32 user1UP; - UINT32 user2UP; - UINT32 user3UP; - UINT32 user0MuPfId; - UINT32 user1MuPfId; - UINT32 user2MuPfId; - UINT32 user3MuPfId; - UINT32 user0InitMCS; - UINT32 user1InitMCS; - UINT32 user2InitMCS; - UINT32 user3InitMCS; - uint8_t aucUser0MacAddr[6]; - uint8_t aucUser1MacAddr[6]; - uint8_t aucUser2MacAddr[6]; - uint8_t aucUser3MacAddr[6]; -} MU_STRUCT_MU_GROUP, *P_MU_STRUCT_MU_GROUP; - -typedef struct _MU_STRUCT_MU_QD { - UINT_32 qd_report[14]; -} MU_STRUCT_MU_QD, *P_MU_STRUCT_MU_QD; - -typedef struct _MU_STRUCT_SET_SU_CALC_LQ { - UINT8 num_of_user; - UINT8 bandwidth; - - UINT8 nss_of_user0; - - UINT8 pf_mu_id_of_user0; - - UINT8 num_of_txer; /* number of antenna */ - - UINT8 spe_index; - - UINT8 reserved[2]; - - UINT32 group_index; -} MU_STRUCT_SET_SU_CALC_LQ, *P_MU_STRUCT_SET_SU_CALC_LQ; - -typedef struct _MU_STRUCT_SET_CALC_INIT_MCS { - UINT8 num_of_user; - UINT8 bandwidth; - - UINT8 nss_of_user0; - UINT8 nss_of_user1; - - UINT8 nss_of_user2; - UINT8 nss_of_user3; - - UINT8 pf_mu_id_of_user0; - UINT8 pf_mu_id_of_user1; - - UINT8 pf_mu_id_of_user2; - UINT8 pf_mu_id_of_user3; - - UINT8 num_of_txer; /* number of antenna */ - UINT8 spe_index; - - UINT32 group_index; - -} MU_STRUCT_SET_CALC_INIT_MCS, *P_MU_STRUCT_SET_CALC_INIT_MCS; - -typedef struct _MU_STRUCT_SET_CALC_LQ { - UINT8 num_of_user; - UINT8 bandwidth; - - UINT8 nss_of_user0; - UINT8 nss_of_user1; - - UINT8 nss_of_user2; - UINT8 nss_of_user3; - - UINT8 pf_mu_id_of_user0; - UINT8 pf_mu_id_of_user1; - - UINT8 pf_mu_id_of_user2; - UINT8 pf_mu_id_of_user3; - - UINT8 num_of_txer; /* number of antenna */ - UINT8 spe_index; - - UINT32 group_index; -} MU_STRUCT_SET_CALC_LQ, *P_MU_STRUCT_SET_CALC_LQ; - -typedef struct _CMD_HQA_SET_SU_CALC_LQ { - UINT8 num_of_user; - UINT8 bandwidth; - - UINT8 nss_of_user0; - - UINT8 pf_mu_id_of_user0; - - UINT8 num_of_txer; /* number of antenna */ - - UINT8 spe_index; - - UINT8 reserved[2]; - - UINT32 group_index; -} CMD_HQA_SET_SU_CALC_LQ, *P_CMD_HQA_SET_SU_CALC_LQ; - -typedef struct _CMD_HQA_SET_MU_CALC_LQ { - UINT8 num_of_user; - UINT8 bandwidth; - - UINT8 nss_of_user0; - UINT8 nss_of_user1; - - UINT8 nss_of_user2; - UINT8 nss_of_user3; - - UINT8 pf_mu_id_of_user0; - UINT8 pf_mu_id_of_user1; - - UINT8 pf_mu_id_of_user2; - UINT8 pf_mu_id_of_user3; - - UINT8 num_of_txer; /* number of antenna */ - UINT8 spe_index; - - UINT32 group_index; -} CMD_HQA_SET_MU_CALC_LQ, *P_CMD_HQA_SET_MU_CALC_LQ; - -typedef struct _CMD_HQA_SET_MU_GROUP { - UINT32 groupIndex; /* Group Table Idx */ - BOOLEAN fgUser0Ldpc; - BOOLEAN fgUser1Ldpc; - BOOLEAN fgUser2Ldpc; - BOOLEAN fgUser3Ldpc; - UINT8 user0Nss; - UINT8 user1Nss; - UINT8 user2Nss; - UINT8 user3Nss; - UINT8 user0InitMCS; - UINT8 user1InitMCS; - UINT8 user2InitMCS; - UINT8 user3InitMCS; - UINT8 user0MuPfId; - UINT8 user1MuPfId; - UINT8 user2MuPfId; - UINT8 user3MuPfId; - UINT8 numOfUser; - UINT8 groupId; - BOOLEAN fgIsShortGI; - UINT8 bandwidth; -} CMD_HQA_SET_MU_GROUP, *P_CMD_HQA_SET_MU_GROUP; - -typedef struct _CMD_HQA_CALC_GET_INIT_MCS_ENTRY { - UINT32 groupIndex; -} CMD_HQA_CALC_GET_INIT_MCS_ENTRY, *P_CMD_HQA_CALC_GET_INIT_MCS_ENTRY; - -typedef struct _CMD_HQA_SET_INIT_MCS { - UINT8 num_of_user; /* number of users */ - UINT8 bandwidth; - - UINT8 nss_of_user0; /* the number of spatil streams which user0 used */ - UINT8 nss_of_user1; /* the number of spatil streams which user1 used */ - UINT8 nss_of_user2; /* the number of spatil streams which user2 used */ - UINT8 nss_of_user3; /* the number of spatil streams which user3 used */ - - UINT8 pf_mu_id_of_user0; /* the PF MU ID of user0 */ - UINT8 pf_mu_id_of_user1; /* the PF MU ID of user1 */ - UINT8 pf_mu_id_of_user2; /* the PF MU ID of user2 */ - UINT8 pf_mu_id_of_user3; /* the PF MU ID of user3 */ - - UINT8 num_of_txer; /* number of antenna */ - UINT8 spe_index; - - UINT32 group_index; -} CMD_HQA_SET_INIT_MCS, *P_CMD_HQA_SET_INIT_MCS; - -typedef struct _CMD_SHOW_CALC_INIT_MCS_ENTRY { - UINT8 num_of_user; /* number of users */ - UINT8 bandwidth; - - UINT8 nss_of_user0; /* the number of spatil streams which user0 used */ - UINT8 nss_of_user1; /* the number of spatil streams which user1 used */ - UINT8 nss_of_user2; /* the number of spatil streams which user2 used */ - UINT8 nss_of_user3; /* the number of spatil streams which user3 used */ - - UINT8 pf_mu_id_of_user0; /* the PF MU ID of user0 */ - UINT8 pf_mu_id_of_user1; /* the PF MU ID of user1 */ - UINT8 pf_mu_id_of_user2; /* the PF MU ID of user2 */ - UINT8 pf_mu_id_of_user3; /* the PF MU ID of user3 */ - - UINT8 num_of_txer; /* number of antenna */ - UINT8 reserved; - - UINT32 group_index; -} CMD_SHOW_CALC_INIT_MCS_ENTRY, *P_CMD_SHOW_CALC_INIT_MCS_ENTRY; - -typedef struct _CMD_HQA_SET_MU_NSS_ZERO { - UINT8 ucValue; -} CMD_HQA_SET_MU_NSS_ZERO, *P_CMD_HQA_SET_MU_NSS_ZERO; - -typedef struct _CMD_HQA_SET_MU_METRIC_TABLE { - UINT8 metric_table[NUM_MUT_NR * NUM_MUT_FEC * NUM_MUT_MCS * - NUM_MUT_INDEX]; -} CMD_HQA_SET_MU_METRIC_TABLE, *P_CMD_HQA_SET_MU_METRIC_TABLE; - -typedef struct _CMD_HQA_SET_SU_METRIC_TABLE { - UINT8 metric_table[NUM_MUT_FEC * NUM_MUT_MCS * NUM_SUT_INDEX]; -} CMD_HQA_SET_SU_METRIC_TABLE, *P_CMD_HQA_SET_SU_METRIC_TABLE; - -typedef struct _CMD_HQA_SET_MU_LQ_SPEED_UP { - UINT8 ucValue; -} CMD_HQA_SET_MU_LQ_SPEED_UP, *P_CMD_HQA_SET_MU_LQ_SPEED_UP; - -typedef struct _CMD_HQA_SET_MU_ENABLE { - UINT8 fgIsEnable; -} CMD_HQA_SET_MU_ENABLE, *P_CMD_HQA_SET_MU_ENABLE; - -typedef struct _CMD_HQA_GET_QD { - INT8 scIdx; -} CMD_HQA_GET_QD, *P_CMD_HQA_GET_QD; - -typedef struct _CMD_HQA_SET_MU_SNR_OFFSET { - INT8 offset; -} CMD_HQA_SET_MU_SNR_OFFSET, *P_CMD_HQA_SET_MU_SNR_OFFSET; - -typedef struct _EVENT_HQA_GET_MU_CALC_LQ { - UINT32 u4EventId; - /* P_MU_STRUCT_LQ_REPORT pOutput; */ - MU_STRUCT_LQ_REPORT rEntry; -} EVENT_HQA_GET_MU_CALC_LQ, *P_EVENT_HQA_GET_MU_CALC_LQ; - -typedef struct _EVENT_HQA_GET_SU_CALC_LQ { - UINT32 u4EventId; - /* P_SU_STRUCT_LQ_REPORT pOutput; */ - SU_STRUCT_LQ_REPORT rEntry; -} EVENT_HQA_GET_SU_CALC_LQ, *P_EVENT_HQA_GET_SU_CALC_LQ; - -typedef struct _EVENT_HQA_MU_QD { - UINT32 u4EventId; - /* P_MU_STRUCT_MU_QD pOutput; */ - MU_STRUCT_MU_QD rEntry; -} EVENT_HQA_MU_QD, *P_EVENT_HQA_MU_QD; - -/* -typedef struct _EVENT_HQA_GET_QD { - UINT32 u4EventId; - INT_8 sCIdx; - UINT_32 au4RawData[14]; -} EVENT_HQA_GET_QD, *P_EVENT_HQA_GET_QD; -*/ - -typedef struct _EVENT_HQA_STATUS_CALCLQ { - UINT32 u4EventId; - UINT16 status; -} EVENT_HQA_STATUS_CALCLQ, *P_EVENT_HQA_STATUS_CALCLQ; - -/* -typedef struct _MU_STRUCT_MU_GROUP_INIT_MCS { - UINT32 u4EventId; - P_MU_STRUCT_MU_GROUP_INIT_MCS pOutput; - MU_STRUCT_MU_GROUP_INIT_MCS rEntry; -} MU_STRUCT_MU_GROUP_INIT_MCS, *P_MU_STRUCT_MU_GROUP_INIT_MCS; -*/ -typedef struct _MU_STRUCT_MU_GROUP_INIT_MCS { - UINT32 user0InitMCS; - UINT32 user1InitMCS; - UINT32 user2InitMCS; - UINT32 user3InitMCS; -} MU_STRUCT_MU_GROUP_INIT_MCS, *P_MU_STRUCT_MU_GROUP_INIT_MCS; - -typedef struct _EVENT_HQA_INIT_MCS { - UINT32 u4EventId; - /* P_MU_STRUCT_MU_GROUP_INIT_MCS pOutput; */ - MU_STRUCT_MU_GROUP_INIT_MCS rEntry; -} EVENT_HQA_INIT_MCS, *P_EVENT_HQA_INIT_MCS; - -typedef struct _MU_STRUCT_TRIGGER_MU_TX_FRAME_PARAM { - UINT8 fgIsRandomPattern; /* is random pattern or not */ - UINT32 msduPayloadLength0; /* payload length of the MSDU for user 0 */ - UINT32 msduPayloadLength1; /* payload length of the MSDU for user 1 */ - UINT32 msduPayloadLength2; /* payload length of the MSDU for user 2 */ - UINT32 msduPayloadLength3; /* payload length of the MSDU for user 3 */ - UINT32 u4MuPacketCount; /* MU TX count */ - UINT32 u4NumOfSTAs; /* number of user in the MU TX */ - UINT8 macAddrs[4][6]; /* MAC address of users */ -} MU_STRUCT_TRIGGER_MU_TX_FRAME_PARAM, *P_MU_STRUCT_TRIGGER_MU_TX_FRAME_PARAM; - -/* these struct here for temply, will be removed in feature */ -typedef struct _MU_STRUCT_MU_GET_STA_PARAM { - UINT32 gid[2]; - UINT32 up[4]; -} MU_STRUCT_MU_GET_STA_PARAM, *P_MU_STRUCT_MU_GET_STA_PARAM; - -typedef struct _MU_STRUCT_MU_STA_PARAM { - UINT32 gid[2]; - UINT32 up[4]; -} MU_STRUCT_MU_STA_PARAM, *P_MU_STRUCT_MU_STA_PARAM; - -/* Prototype for HQA */ -bool hqa_wifi_test_mu_cal_init_mcs(PRTMP_ADAPTER pAd, - P_MU_STRUCT_SET_CALC_INIT_MCS pParams); - -bool hqa_wifi_test_mu_get_init_mcs(PRTMP_ADAPTER pAd, UINT32 groupIndex, - P_MU_STRUCT_MU_GROUP_INIT_MCS poutput - -); - -bool hqa_wifi_test_mu_cal_lq(PRTMP_ADAPTER pAd, - P_MU_STRUCT_SET_CALC_LQ pParams); - -bool hqa_wifi_test_su_cal_lq(PRTMP_ADAPTER pAd, - P_MU_STRUCT_SET_SU_CALC_LQ pParams); - -bool hqa_wifi_test_mu_get_lq(PRTMP_ADAPTER pAd, P_MU_STRUCT_LQ_REPORT pOutput); - -bool hqa_wifi_test_su_get_lq(PRTMP_ADAPTER pAd, P_SU_STRUCT_LQ_REPORT pOutput); - -bool hqa_wifi_test_snr_offset_set(PRTMP_ADAPTER pAd, char val); - -bool hqa_wifi_test_mu_set_zero_nss(PRTMP_ADAPTER pAd, unsigned char val); - -bool hqa_wifi_test_mu_speed_up_lq(PRTMP_ADAPTER pAd, int val); - -bool hqa_wifi_test_mu_table_set(PRTMP_ADAPTER pAd, P_MU_STRUCT_MU_TABLE ptr); - -bool hqa_wifi_test_mu_group_set(PRTMP_ADAPTER pAd, P_MU_STRUCT_MU_GROUP ptr); - -bool hqa_wifi_test_mu_get_qd(PRTMP_ADAPTER pAd, INT8 subcarrierIndex, - P_MU_STRUCT_MU_QD pOutput); - -bool hqa_wifi_test_mu_set_enable(PRTMP_ADAPTER pAd, unsigned char val); - -/* new API for Mu TX */ -bool hqa_wifi_test_mu_trigger_mu_tx( - PRTMP_ADAPTER pAd, P_MU_STRUCT_TRIGGER_MU_TX_FRAME_PARAM pParam); - -/* STA API in here temply and will remove in feature */ -bool hqa_wifi_test_mu_get_sta_gid_and_up(PRTMP_ADAPTER pAd, - P_MU_STRUCT_MU_GET_STA_PARAM pOutput); - -bool hqa_wifi_test_mu_set_sta_gid_and_up(PRTMP_ADAPTER pAd, - P_MU_STRUCT_MU_STA_PARAM ptr); - -INT SetMuEnableProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#endif /* __AP_MUMIMO_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mura.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mura.h deleted file mode 100644 index 3887c64da6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_mura.h +++ /dev/null @@ -1,492 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_mura.h - - Abstract: - Miniport generic portion header file - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __AP_MUMIMO_RA_H__ -#define __AP_MUMIMO_RA_H__ - -#define MURA_COLOR_RED "\x1b[31m" -#define MURA_COLOR_GREEN "\x1b[32m" -#define MURA_COLOR_YELLOW "\x1b[33m" -#define MURA_COLOR_BLUE "\x1b[34m" -#define MURA_COLOR_MAGENTA "\x1b[35m" -#define MURA_COLOR_CYAN "\x1b[36m" -#define MURA_COLOR_RESET "\x1b[0m" - -#define MAX_MURA_NUM 8 -#define MAX_MURA_WAIT_NUM 32 -#define MAX_MURA_GRP 68 -#define MU_2U_NUM 28 -#define MU_3U_NUM 35 - -#define MURA_STATE 1 -#define MURA_GROUP_STAT 2 -#define MURA_HWFB_STAT 3 - -enum { - /* debug commands */ - MURA_PERIODIC_SND = 0, - MURA_ALGORITHM_STAT = 1, - MURA_ALGORITHM_GROUP_STAT, - MURA_ALGORITHM_HWFB_STAT, - MURA_FIXED_RATE_ALGORITHM, - MURA_FIXED_GROUP_RATE_ALGORITHM, - MURA_TEST_ALGORITHM, - MURA_SOUNDING_PERIOD, - MURA_PLATFORM_TYPE, - MURA_DISABLE_CN3_CN4, - MURA_PFID_STAT, - MURA_ENABLE_MU_HWSW_PATCH, - MURA_MOBILITY_CTRL, - MURA_MOBILITY_INTERVAL_CTRL, - MURA_MOBILITY_SNR_CTRL, - MURA_MOBILITY_THRESHOLD_CTRL, - MURA_MOBILITY_SOUNDING_INTERVAL_COUNT, - MURA_MOBILITY_MODE_CTRL, - MURA_MOBILITY_LOG_CTRL, - MURA_MOBILITY_TEST_CTRL, - MURA_MAX_COMMAND, -}; - -enum { - MURA_EVENT_ALGORITHM_STAT = 0, - MURA_EVENT_ALGORITHM_GROUP_STAT, - MURA_EVENT_ALGORITHM_HWFB_STAT, - MURA_EVENT_PFID_STAT, - MURA_MAX_EVENT -}; - -typedef struct _LINK_ENTRY_T { - struct _LINK_ENTRY_T *prNext, *prPrev; -} LINK_ENTRY_T, *P_LINK_ENTRY_T; - -typedef struct _MURA_CN_ENTRY_T { - LINK_ENTRY_T rLinkEntry; - - UINT_8 ucBBPCalcState; -#ifdef RT_BIG_ENDIAN - UINT_8 ucMU3RateCalcState : 2; - UINT_8 ucMU2RateCalcState : 2; - UINT_8 ucMU1RateCalcState : 2; - UINT_8 ucMU0RateCalcState : 2; -#else - UINT_8 ucMU0RateCalcState : 2; - UINT_8 ucMU1RateCalcState : 2; - UINT_8 ucMU2RateCalcState : 2; - UINT_8 ucMU3RateCalcState : 2; -#endif -#ifdef RT_BIG_ENDIAN - UINT_16 u2Reserve1 : 1; - UINT_16 u2U2PreSSN : 1; - UINT_16 u2U1PreSSN : 1; - UINT_16 u2U0PreSSN : 1; - UINT_16 u2U2PreRate : 4; - UINT_16 u2U1PreRate : 4; - UINT_16 u2U0PreRate : 4; -#else - UINT_16 u2U0PreRate : 4; - UINT_16 u2U1PreRate : 4; - UINT_16 u2U2PreRate : 4; - UINT_16 u2U0PreSSN : 1; - UINT_16 u2U1PreSSN : 1; - UINT_16 u2U2PreSSN : 1; - UINT_16 u2Reserve1 : 1; -#endif -#ifdef RT_BIG_ENDIAN - UINT_16 u2U3Rate : 4; - UINT_16 u2U2Rate : 4; - UINT_16 u2U1Rate : 4; - UINT_16 u2U0Rate : 4; -#else - UINT_16 u2U0Rate : 4; - UINT_16 u2U1Rate : 4; - UINT_16 u2U2Rate : 4; - UINT_16 u2U3Rate : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_16 u2U3AutoRate : 4; - UINT_16 u2U2AutoRate : 4; - UINT_16 u2U1AutoRate : 4; - UINT_16 u2U0AutoRate : 4; -#else - UINT_16 u2U0AutoRate : 4; - UINT_16 u2U1AutoRate : 4; - UINT_16 u2U2AutoRate : 4; - UINT_16 u2U3AutoRate : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_16 u2U3LastRate : 4; - UINT_16 u2U2LastRate : 4; - UINT_16 u2U1LastRate : 4; - UINT_16 u2U0LastRate : 4; -#else - UINT_16 u2U0LastRate : 4; - UINT_16 u2U1LastRate : 4; - UINT_16 u2U2LastRate : 4; - UINT_16 u2U3LastRate : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_16 u2U3DeltaMCS : 4; - UINT_16 u2U2DeltaMCS : 4; - UINT_16 u2U1DeltaMCS : 4; - UINT_16 u2U0DeltaMCS : 4; -#else - UINT_16 u2U0DeltaMCS : 4; - UINT_16 u2U1DeltaMCS : 4; - UINT_16 u2U2DeltaMCS : 4; - UINT_16 u2U3DeltaMCS : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_8 ucU3LastSSNReverse : 3; - UINT_8 ucGroupInit : 1; - UINT_8 ucU3LastSSN : 1; - UINT_8 ucU2LastSSN : 1; - UINT_8 ucU1LastSSN : 1; - UINT_8 ucU0LastSSN : 1; -#else - UINT_8 ucU0LastSSN : 1; - UINT_8 ucU1LastSSN : 1; - UINT_8 ucU2LastSSN : 1; - UINT_8 ucU3LastSSN : 1; - UINT_8 ucGroupInit : 1; - UINT_8 ucU3LastSSNReverse : 3; -#endif -#ifdef RT_BIG_ENDIAN - UINT_8 ucUserNum : 2; - UINT_8 ucGPBW : 2; - UINT_8 ucU3SSN : 1; - UINT_8 ucU2SSN : 1; - UINT_8 ucU1SSN : 1; - UINT_8 ucU0SSN : 1; -#else - UINT_8 ucU0SSN : 1; - UINT_8 ucU1SSN : 1; - UINT_8 ucU2SSN : 1; - UINT_8 ucU3SSN : 1; - UINT_8 ucGPBW : 2; - UINT_8 ucUserNum : 2; -#endif -#ifdef RT_BIG_ENDIAN - UINT_32 u4GroupValid : 1; - UINT_32 u4GroupID : 11; // 0 ~ 2047 Group Idx - UINT_32 u4U3PFID : 5; - UINT_32 u4U2PFID : 5; - UINT_32 u4U1PFID : 5; - UINT_32 u4U0PFID : 5; -#else - UINT_32 u4U0PFID : 5; - UINT_32 u4U1PFID : 5; - UINT_32 u4U2PFID : 5; - UINT_32 u4U3PFID : 5; - UINT_32 u4GroupID : 11; /* 0 ~ 2047 Group Idx */ - UINT_32 u4GroupValid : 1; -#endif - - UINT_8 ucU0TxPER; - UINT_8 ucU1TxPER; - UINT_8 ucU2TxPER; - UINT_8 ucU3TxPER; - - /* For Future Used : Smart MU Rate Algorithm with Dynamic Programming Method */ -#ifdef RT_BIG_ENDIAN - UINT_8 ucU1TxQ_UpSS1 : 4; - UINT_8 ucU0TxQ_UpSS1 : 4; -#else - UINT_8 ucU0TxQ_UpSS1 : 4; - UINT_8 ucU1TxQ_UpSS1 : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_8 ucU3TxQ_UpSS1 : 4; - UINT_8 ucU2TxQ_UpSS1 : 4; -#else - UINT_8 ucU2TxQ_UpSS1 : 4; - UINT_8 ucU3TxQ_UpSS1 : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_8 ucU1TxQ_UpSS2 : 4; - UINT_8 ucU0TxQ_UpSS2 : 4; -#else - UINT_8 ucU0TxQ_UpSS2 : 4; - UINT_8 ucU1TxQ_UpSS2 : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_8 ucU3TxQ_UpSS2 : 4; - UINT_8 ucU2TxQ_UpSS2 : 4; -#else - UINT_8 ucU2TxQ_UpSS2 : 4; - UINT_8 ucU3TxQ_UpSS2 : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_8 ucU1TxQ_Down : 4; - UINT_8 ucU0TxQ_Down : 4; -#else - UINT_8 ucU0TxQ_Down : 4; - UINT_8 ucU1TxQ_Down : 4; -#endif -#ifdef RT_BIG_ENDIAN - UINT_8 ucU3TxQ_Down : 4; - UINT_8 ucU2TxQ_Down : 4; -#else - UINT_8 ucU2TxQ_Down : 4; - UINT_8 ucU3TxQ_Down : 4; -#endif -} MURA_CN_ENTRY_INFO_T, *P_MURA_CN_ENTRY_INFO_T; - -typedef struct _CMD_MURGA_SET_GROUP_TBL_ENTRY { -#ifdef RT_BIG_ENDIAN - UINT_8 NS3 : 1; - UINT_8 NS2 : 1; - UINT_8 NS1 : 1; - UINT_8 NS0 : 1; - UINT_8 BW : 2; - UINT_8 numUser : 2; -#else - UINT_8 numUser : 2; - UINT_8 BW : 2; - UINT_8 NS0 : 1; - UINT_8 NS1 : 1; - UINT_8 NS2 : 1; - UINT_8 NS3 : 1; -#endif - - UINT_8 WLIDUser0; /* WLANID0 */ - UINT_8 WLIDUser1; /* WLANID1 */ - UINT_8 WLIDUser2; /* WLANID2 */ - UINT_8 WLIDUser3; /* WLANID3 */ -#ifdef RT_BIG_ENDIAN - UINT_8 initMcsUser1 : 4; - UINT_8 initMcsUser0 : 4; -#else - UINT_8 initMcsUser0 : 4; - UINT_8 initMcsUser1 : 4; -#endif - -#ifdef RT_BIG_ENDIAN - UINT_8 initMcsUser3 : 4; - UINT_8 initMcsUser2 : 4; -#else - UINT_8 initMcsUser2 : 4; - UINT_8 initMcsUser3 : 4; -#endif - -} CMD_MURGA_SET_GROUP_TBL_ENTRY, *P_CMD_MURGA_SET_GROUP_TBL_ENTRY; - -typedef struct _CMD_SET_PERIODIC_SND { - UINT16 u2Reserved; -} CMD_SET_PERIODIC_SND, *P_CMD_SET_PERIODIC_SND; - -typedef struct _CMD_SET_SND_PARAMS { - UINT_8 ucAllMuUser; - UINT_8 ucWLIDUser; - UINT_8 ucMaxSoundingPeriod; - UINT_8 ucMinSoundingPeriod; - UINT_8 ucSoundingPeriodStep; -} CMD_SET_SND_PARAMS, *P_CMD_SET_SND_PARAMS; - -typedef struct _CMD_SET_PLATFORM_TYPE { - UINT_8 ucPlatformType; - UINT_8 ucReserved[3]; -} CMD_SET_PLATFORM_TYPE, *P_CMD_SET_PLATFORM_TYPE; - -typedef struct _CMD_SET_DISABLE_CN3_CN4 { - UINT_8 ucDisableCn3Cn4; - UINT_8 ucReserved[3]; -} CMD_SET_DISABLE_CN3_CN4, *P_CMD_SET_DISABLE_CN3_CN4; - -typedef struct _CMD_MURGA_ENABLE_HW_SW_PATCH { - UINT_8 ucEnableHwSwPatch; - UINT_8 ucReserved[3]; -} CMD_MURGA_ENABLE_HW_SW_PATCH, *P_CMD_MURGA_ENABLE_HW_SW_PATCH; - -typedef struct _CMD_MURGA_SET_MOBILITY_TYPE { - BOOLEAN fgMobilityType; - UINT_8 ucReserved[3]; -} CMD_MURGA_SET_MOBILITY_TYPE, *P_CMD_MURGA_SET_MOBILITY_TYPE; - -typedef struct _CMD_MURGA_SET_MOBILITY_INTERVAL { - UINT_16 u2MobilityInteral; - UINT_8 ucReserved[2]; -} CMD_MURGA_SET_MOBILITY_INTERVAL, *P_CMD_MURGA_SET_MOBILITY_INTERVAL; - -typedef struct _CMD_MURGA_SET_MOBILITY_SNR { - UINT_8 ucMobilitySNR; - UINT_8 ucReserved[3]; -} CMD_MURGA_SET_MOBILITY_SNR, *P_CMD_MURGA_SET_MOBILITY_SNR; - -typedef struct _CMD_MURGA_SET_MOBILITY_THRESHOLD { - UINT_8 ucWlanId; - UINT_8 ucMobilityThreshold; - UINT_8 ucReserved[2]; -} CMD_MURGA_SET_MOBILITY_THRESHOLD, *P_CMD_MURGA_SET_MOBILITY_THRESHOLD; - -typedef struct _CMD_MURGA_GET_MOBILITY_SND_INTERVAL { - BOOLEAN fgMobilitySndIntvalCnt; - UINT_8 ucReserved[3]; -} CMD_MURGA_GET_MOBILITY_SND_INTERVAL, *P_CMD_MURGA_GET_MOBILITY_SND_INTERVAL; - -typedef struct _CMD_MURGA_SET_MOBILITY_MODE { - BOOLEAN fgMULQPingPongEn; - BOOLEAN fgMULQTriggerCalEn; - BOOLEAN fgMobilityFlagForceEn; - UINT_8 ucReserved; -} CMD_MURGA_SET_MOBILITY_MODE, *P_CMD_MURGA_SET_MOBILITY_MODE; - -typedef struct _CMD_MURGA_SET_MOBILITY_LOG { - BOOLEAN fgMobilityLogEn; - UINT_8 ucReserved[3]; -} CMD_MURGA_SET_MOBILITY_LOG, *P_CMD_MURGA_SET_MOBILITY_LOG; - -typedef struct _CMD_MURGA_SET_MOBILITY_TEST { - BOOLEAN fgMobilityTestEn; - UINT_8 ucReserved[3]; -} CMD_MURGA_SET_MOBILITY_TEST, *P_CMD_MURGA_SET_MOBILITY_TEST; - -typedef struct _EVENT_SHOW_ALGORITHM_STATE { - UINT_32 u4EventId; - - /* MU-RGA Overall Information */ - BOOLEAN fgMobility[MAX_MURA_NUM]; - UINT_8 ucMaxMuarNum; - UINT_8 ucSoundingNum; - UINT_8 ucWaitingNum; - UINT_8 ucMaxSndingCap; - - UINT_8 ucSoundingPeriod[MAX_MURA_NUM]; - UINT_32 u4TxSuccCnt[MAX_MURA_NUM]; - UINT_32 u4TxFailCnt[MAX_MURA_NUM]; - UINT_32 u4TxCn3SuccCnt[MAX_MURA_NUM]; - UINT_32 u4TxCn3FailCnt[MAX_MURA_NUM]; - UINT_32 u4TxCn4SuccCnt[MAX_MURA_NUM]; - UINT_32 u4TxCn4FailCnt[MAX_MURA_NUM]; - UINT_8 ucTxPER[MAX_MURA_NUM]; - UINT_8 ucTxCn3PER[MAX_MURA_NUM]; - UINT_8 ucTxCn4PER[MAX_MURA_NUM]; - - /* PFID Sounding Information */ - UINT_8 ucMURAWlanIdList[MAX_MURA_NUM]; - UINT_8 ucMURAPfidList[MAX_MURA_NUM]; - BOOLEAN au4PfidGroupTableMap[MAX_MURA_NUM][MAX_MURA_GRP]; - UINT_8 aucMURADeltaMCS[MAX_MURA_NUM]; - UINT_16 au2SuccSounding[MAX_MURA_NUM]; - UINT_16 au2FailSounding[MAX_MURA_NUM]; - UINT_8 aucSoundingFailRate[MAX_MURA_NUM]; - - /* MU-RGA Timing */ - UINT_32 u4CalculateSoundingEnd; - UINT_32 u4CalculateSoundingStart; - UINT_32 u4CalculateGroupMcsRateEnd; - UINT_32 u4CalculateGroupMcsRateStart; - -} EVENT_SHOW_ALGORITHM_STATE, *P_EVENT_SHOW_ALGORITHM_STATE; - -typedef struct _EVENT_SHOW_PFID_STAT { - UINT_32 u4EventId; - - /* MU-RGA Overall Information */ - BOOLEAN fgMobility; - UINT_8 u1MaxMuarNum; - UINT_8 u1SoundingNum; - UINT_8 u1WaitingNum; - UINT_8 u1MaxSndingCap; - - UINT_8 u1SoundingPeriod; - UINT_8 u1MinSoundingPeriod; - UINT_8 u1MaxSoundingPeriod; - UINT_8 u1SoundingPeriodStep; - UINT_8 u1WlanIdx; - UINT_32 u4TxSuccCnt; - UINT_32 u4TxFailCnt; - UINT_32 u4TxCn3SuccCnt; - UINT_32 u4TxCn3FailCnt; - UINT_32 u4TxCn4SuccCnt; - UINT_32 u4TxCn4FailCnt; - UINT_8 u1TxPER; - UINT_8 u1TxCn3PER; - UINT_8 u1TxCn4PER; - - /* PFID Sounding Information */ - UINT_16 u2SuccSounding; - UINT_16 u2FailSounding; - UINT_8 u1SoundingFailRate; -} EVENT_SHOW_PFID_STAT, *P_EVENT_SHOW_PFID_STAT; - -typedef struct _EVENT_SHOW_ALGORITHM_GROUP_STATE { - UINT_32 u4EventId; - - /* Group Entry Information */ - /* MURA_CN_ENTRY_INFO_T arMuraGroupEntry[MAX_MURA_GRP]; */ - MURA_CN_ENTRY_INFO_T rMuraGroupEntry; - -} EVENT_SHOW_ALGORITHM_GROUP_STATE, *P_EVENT_SHOW_ALGORITHM_GROUP_STATE; - -typedef struct _EVENT_SHOW_ALGORITHM_HWFB_STATE { - UINT_32 u4EventId; - - /* HWFB Entry Information */ - BOOLEAN fgDownOneStep[10]; - BOOLEAN fgUpOneStep[10]; - UINT_8 ucDownThreshold[10]; - UINT_8 ucUpThreshold[10]; - UINT_8 ucDownMCS[10]; - UINT_8 ucUpMCS[10]; - UINT_8 uc20BWSample[10]; - UINT_8 uc40BWSample[10]; - UINT_8 uc80BWSample[10]; - UINT_8 uc20BWSampleFactor; - UINT_8 uc40BWSampleFactor; - UINT_8 uc80BWSampleFactor; - -} EVENT_SHOW_ALGORITHM_HWFB_STATE, *P_EVENT_SHOW_ALGORITHM_HWFB_STATE; - -INT GetMuraMonitorStateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/** @brief Get MU_RGA PFID statistics - * - * Get MU_RGA PFID statistics for debug - * - * @param pAd: pointer to adapter - * @param arg: pointer to argument - * @return Int. - */ -INT GetMuraPFIDStatProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraPeriodicSndProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraTestAlgorithmProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraTestAlgorithmInit(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraFixedRateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraFixedGroupRateProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraFixedSndParamProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraPlatformTypeProc(RTMP_ADAPTER *pAd); -INT SetMuraMobilityCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraMobilityIntervalCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraMobilitySNRCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraMobilityThresholdCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraMobilitySndCountProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraMobilityModeCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraMobilityLogCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetMuraEnableHwSwPatch(RTMP_ADAPTER *pAd); -INT SetMuraMobilityTestCtrlProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#endif /* __AP_MUMIMO_RA_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_repeater.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_repeater.h deleted file mode 100644 index 96ddfa2c83..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_repeater.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_repeater.h - - Abstract: - repeater function related definition collection. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Carter.Chen 2015-April-14 init version. -*/ -#ifndef __AP_REPEATER_H__ -#define __AP_REPEATER_H__ - -#include "rtmp.h" - -#define GET_MAX_REPEATER_ENTRY_NUM(_pChipCap) _pChipCap->MaxRepeaterNum - -VOID RepeaterCtrlInit(RTMP_ADAPTER *pAd); -VOID RepeaterCtrlExit(RTMP_ADAPTER *pAd); -VOID CliLinkMapInit(RTMP_ADAPTER *pAd); - -enum _REPEATER_MLME_ENQ_IDX_CHK_TBL { - REPT_MLME_START_IDX = 64, - REPT_MLME_LAST_IDX = 95, - REPT_MLME_MAX_IDX = 96, /*shall not over this.*/ -}; - -enum _REPT_ENTRY_CONNT_STATE { - REPT_ENTRY_DISCONNT = 0, - REPT_ENTRY_CONNTING = 1, - REPT_ENTRY_CONNTED = 2, -}; - -enum _REPEATER_MAC_ADDR_RULE_TYPE { - FOLLOW_CLI_LINK_MAC_ADDR_OUI = 0, - CASUALLY_DEFINE_MAC_ADDR = 1, - VENDOR_DEFINED_MAC_ADDR_OUI = 2, -}; - -enum _REPEATER_TX_PKT_CHECK_RESULT { - REPEATER_ENTRY_EXIST = 0, - INSERT_REPT_ENTRY = 1, - USE_CLI_LINK_INFO = 2, - INSERT_REPT_ENTRY_AND_ALLOW = 3, -}; - -/* IOCTL*/ -INT Show_ReptTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID RepeaterLinkMonitor(RTMP_ADAPTER *pAd); - -UINT32 ReptTxPktCheckHandler(RTMP_ADAPTER *pAd, - IN struct wifi_dev *cli_link_wdev, - IN PNDIS_PACKET pPacket, OUT UCHAR *pWcid); - -VOID RepeaterFillMlmeParaThenEnq(RTMP_ADAPTER *pAd, ULONG Machine, - ULONG MsgType, - REPEATER_CLIENT_ENTRY *pReptEntry); - -INT AsicSetReptFuncEnable(RTMP_ADAPTER *pAd, BOOLEAN enable); - -REPEATER_CLIENT_ENTRY *RTMPLookupRepeaterCliEntry(IN VOID *pData, - IN BOOLEAN bRealMAC, - IN PUCHAR pAddr, - IN BOOLEAN bIsPad); - -BOOLEAN RTMPQueryLookupRepeaterCliEntryMT(IN PVOID pData, IN PUCHAR pAddr, - IN BOOLEAN bIsPad); - -VOID RTMPInsertRepeaterEntry(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PUCHAR pAddr); - -VOID RTMPRemoveRepeaterEntry(IN RTMP_ADAPTER *pAd, IN UCHAR func_tb_idx, - IN UCHAR CliIdx); - -VOID RTMPRepeaterReconnectionCheck(IN RTMP_ADAPTER *pAd); - -MAC_TABLE_ENTRY *RTMPInsertRepeaterMacEntry(IN RTMP_ADAPTER *pAd, - IN PUCHAR pAddr, - IN struct wifi_dev *wdev, - IN UCHAR apidx, IN UCHAR cliIdx, - IN BOOLEAN CleanAll); - -BOOLEAN RTMPRepeaterVaildMacEntry(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr); - -INVAILD_TRIGGER_MAC_ENTRY *RepeaterInvaildMacLookup(IN RTMP_ADAPTER *pAd, - IN UCHAR *pAddr); - -VOID InsertIgnoreAsRepeaterEntryTable(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr); - -BOOLEAN RepeaterRemoveIngoreEntry(IN RTMP_ADAPTER *pAd, IN UCHAR idx, - IN UCHAR *pAddr); - -INT Show_Repeater_Cli_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID ApCliAuthTimeoutExt(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID ApCliAssocTimeoutExt(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID UpdateMbssCliLinkMap(RTMP_ADAPTER *pAd, UCHAR MbssIdx, - struct wifi_dev *cli_link_wdev, - struct wifi_dev *mbss_link_wdev); - -REPEATER_CLIENT_ENTRY *lookup_rept_entry(RTMP_ADAPTER *pAd, PUCHAR address); - -#endif /* __AP_REPEATER_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_vow.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_vow.h deleted file mode 100644 index 924f840d41..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_vow.h +++ /dev/null @@ -1,584 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_vow.h -*/ - -#ifndef __AP_VOW_H_ -#define __AP_VOW_H_ - -struct _EDCA_PARM; - -#define VOW_VIDEO_SET_PARAM 1 -#define VOW_VIDEO_RESTORE_PARAM 2 -#define VIDEO_RTS_PKT_THLD 6 -#define VIDEO_CWMAX 10 -#define VIDEO_RTS_RETRY_LIMIT 31 - -/* #define CONFIG_VOW_VIDEO_PARAM 1*/ - -#define VOW_GEN_1 0 -#define VOW_GEN_2 1 - -#define VOW_MAX_GROUP_NUM 16 -#define VOW_MAX_STA_DWRR_NUM 8 -#define VOW_MAX_WMM_SET_NUM 4 - -#define VOW_DEF_REFILL_PERIOD 3 /* 8us */ -#define VOW_DEF_MIN_RATE_BUCKET_SIZE 1000 /* x*1024B */ -#define VOW_DEF_MAX_RATE_BUCKET_SIZE 1000 /* x*1024B */ -#define VOW_DEF_MIN_AIRTIME_BUCKET_SIZE 16 /* x*1.024ms */ -#define VOW_DEF_MAX_AIRTIME_BUCKET_SIZE 16 /* x*1.024ms */ -#define VOW_DEF_BACKLOG_SIZE 1000 /* x*1024B */ -#define VOW_DEF_MAX_WAIT_TIME 16 /* x*1.024ms for 11b */ -#define VOW_DEF_BSS_DWRR_QUANTUM 16 /* x*256us */ -#define VOW_DEF_STA_MAX_WAIT_TIME 64 /* x*256us for 11b */ -#define VOW_DEF_BSS_MAX_WAIT_TIME 64 /* x*256us for 11b */ - -/* G band */ -#define VOW_DEF_GBAND_BK_BACKOFF \ - 352 /* SIFS + 7 slot time + CW min(31) = 10 + 7*9 + 31*9 = 352us */ -#define VOW_DEF_GBAND_BE_BACKOFF \ - 316 /* SIFS + 3 slot time + CW min(31) = 10 + 3*9 + 31*9 = 316us */ -#define VOW_DEF_GBAND_VI_BACKOFF \ - 163 /* SIFS + 2 slot time + CW min(15) = 10 + 2*9 + 15*9 = 163us */ -#define VOW_DEF_GBAND_VO_BACKOFF \ - 91 /* SIFS + 2 slot time + CW min(7) = 10 + 2*9 + 7*9 = 91us */ - -/* A band */ -#define VOW_DEF_ABAND_BK_BACKOFF \ - 358 /* SIFS + 7 slot time + CW min(31) = 16 + 7*9 + 31*9 = 358us */ -#define VOW_DEF_ABAND_BE_BACKOFF \ - 322 /* SIFS + 3 slot time + CW min(31) = 16 + 3*9 + 31*9 = 322us */ -#define VOW_DEF_ABAND_VI_BACKOFF \ - 169 /* SIFS + 2 slot time + CW min(15) = 16 + 2*9 + 15*9 = 169us */ -#define VOW_DEF_ABAND_VO_BACKOFF \ - 97 /* SIFS + 2 slot time + CW min(7) = 16 + 2*9 + 7*9 = 97us */ - -/* for RX */ -#define VOW_DEF_ED_OFFSET 4 /* OFDM CCA time */ -#define VOW_DEF_GBAND_OBSS_BACKOFF VOW_DEF_GBAND_BE_BACKOFF -#define VOW_DEF_ABAND_OBSS_BACKOFF VOW_DEF_ABAND_BE_BACKOFF -#define VOW_DEF_NON_QOS_BACKOFF VOW_DEF_ABAND_BE_BACKOFF - -/* WMM backoff time selection */ -#define VOW_WMM_ONE2ONE_MAPPING 1 -#define VOW_WMM_SHARE_MAPPING 0 - -/* Weighted ATF */ -#define VOW_WATF_LEVEL_NUM 4 - -/* MACRO for status */ -#define VOW_IS_ENABLED(_pAd) \ - ((_pAd != NULL) && ((_pAd->vow_cfg.en_bw_ctrl == TRUE) || \ - (_pAd->vow_cfg.en_airtime_fairness == TRUE))) - -/* for dummy group/sta id */ -#define VOW_ALL_GROUP 0 -#define VOW_ALL_STA 0 - -/* group id */ -enum { - VOW_GROUP_ID0, - VOW_GROUP_ID1, - VOW_GROUP_ID2, - VOW_GROUP_ID3, - VOW_GROUP_ID4, - VOW_GROUP_ID5, - VOW_GROUP_ID6, - VOW_GROUP_ID7, - VOW_GROUP_ID8, - VOW_GROUP_ID9, - VOW_GROUP_ID10, - VOW_GROUP_ID11, - VOW_GROUP_ID12, - VOW_GROUP_ID13, - VOW_GROUP_ID14, - VOW_GROUP_ID15 -}; - -enum { VOW_MIN, VOW_MAX }; - -/* internal collision - search priority */ -enum { VOW_WMM_AC_FIRST, VOW_WMM_SET_FIRST }; - -/* station DWRR quantum index */ -enum { - VOW_STA_DWRR_IDX0, /* unit: 256us */ - VOW_STA_DWRR_IDX1, - VOW_STA_DWRR_IDX2, - VOW_STA_DWRR_IDX3, - VOW_STA_DWRR_IDX4, - VOW_STA_DWRR_IDX5, - VOW_STA_DWRR_IDX6, - VOW_STA_DWRR_IDX7 -}; - -/* station DWRR quantum */ -enum { - VOW_STA_DWRR_QUANTUM0 = 6, /* unit: 256us */ - VOW_STA_DWRR_QUANTUM1 = 12, - VOW_STA_DWRR_QUANTUM2 = 16, - VOW_STA_DWRR_QUANTUM3 = 20, - VOW_STA_DWRR_QUANTUM4 = 24, - VOW_STA_DWRR_QUANTUM5 = 28, - VOW_STA_DWRR_QUANTUM6 = 32, - VOW_STA_DWRR_QUANTUM7 = 36 -}; -/* WMM set */ -enum { VOW_WMM_SET0, VOW_WMM_SET1, VOW_WMM_SET2, VOW_WMM_SET3 }; - -/* AC priority change */ -enum { VOW_DEFAULT_AC, VOW_HIGH_AC_TO_BE, VOW_HIGH_AC_TO_BK }; - -/* token refill period */ -typedef enum { - VOW_REFILL_PERIOD_1US, - VOW_REFILL_PERIOD_2US, - VOW_REFILL_PERIOD_4US, - VOW_REFILL_PERIOD_8US, - VOW_REFILL_PERIOD_16US, - VOW_REFILL_PERIOD_32US, - VOW_REFILL_PERIOD_64US, - VOW_REFILL_PERIOD_128US -} VOW_REFILL_PERIOD_T; - -/* for group(BSS) */ -typedef struct _VOW_BSS_USER_CFG_T { - UINT16 min_rate; /* guarantee rate(Mbps) */ - UINT16 max_rate; /* ceiling rate(Mbps) */ - UINT8 min_airtime_ratio; /* guarantee airtime ratio(%) */ - UINT8 max_airtime_ratio; /* ceiling airtime ratio(%) */ - - UINT16 min_ratebucket_size; /* guarantee rate bucket size(1024byte) */ - UINT16 max_ratebucket_size; /* ceiling rate bucket size(1024byte) */ - UINT16 max_backlog_size; /* -1*max backlog size(1024byte) < token <= bucket size */ - UINT8 min_airtimebucket_size; /* guarantee airtime token bucket size(1.024ms) */ - UINT8 max_airtimebucket_size; /* ceiling airtime token bucket size(1.024ms) */ - UINT8 max_wait_time; /* -1*maximum wait time(1.024ms) < token <= bucket size */ - UINT8 dwrr_quantum; /* for the same priority BSS, each BSS can TX quantum time(256us) */ - UINT16 min_rate_token; /* the amount of guarantee rate token are filled periodically */ - UINT16 max_rate_token; /* the amount of ceiling rate token are filled periodically */ - UINT16 min_airtime_token; /* the amount of guarantee airtime token are filled periodically */ - UINT16 max_airtime_token; /* the amount of ceiling airtime token are filled periodically */ - - UINT8 band_idx; /* belongs to which RF(Radio) band */ - - BOOLEAN bw_on; /* bandwidth control */ - BOOLEAN at_on; /* airtime control */ -} VOW_BSS_USER_CFG_T, *PVOW_BSS_USER_CFG_T; - -/* for station */ -typedef struct _VOW_STA_USER_CFG_T { - UINT8 dwrr_quantum[WMM_NUM_OF_AC]; /* WMM AC */ - UINT8 group; /* belongs to which control group */ - UINT8 wmm_idx; /* belongs to which WMM group */ - UINT8 ac_change_rule; /* for dynamic AC changing. */ - BOOLEAN paused; /* if this station TX is paused. */ -} VOW_STA_USER_CFG_T, *PBW_STA_USER_CFG_T; - -/* for control */ -typedef struct _VOW_CFG_T { - BOOLEAN en_bw_ctrl; /* enable bandwidth(airtime) control */ - BOOLEAN en_bw_refill; /* enable token refill */ - BOOLEAN en_airtime_fairness; /* enable airtime fairness */ - BOOLEAN en_txop_no_change_bss; /* enable HW doesn??¢t change BSS group in TXOP burst */ - BOOLEAN dbdc0_search_rule; /* 1 WMM set first, 0 WMM AC first */ - BOOLEAN dbdc1_search_rule; /* 1 WMM set first, 0 WMM AC first */ - UINT8 refill_period; /* token refill period */ - UINT16 per_bss_enable; /* bitmap for per BSS group enable */ - UINT8 sta_max_wait_time; /* for STA DWRR */ - UINT8 group_max_wait_time; /* for STA DWRR */ - UINT8 vow_sta_dwrr_quantum[VOW_MAX_STA_DWRR_NUM]; /* STA DWRR quantum */ -} VOW_CFG_T, *PVOW_CFG_T; - -/* RX airtime */ -typedef struct _VOW_RX_TIME_CFG_T { - UINT8 ed_offset; /* normal WI-FI packet's duration of ED to CS for both CCK and OFDM. */ - UINT16 obss_backoff; /* backoff threshold for OBSS */ - UINT8 wmm_backoff_sel - [VOW_MAX_WMM_SET_NUM]; /* OM WMM backoff time selection */ - UINT16 wmm_backoff - [VOW_MAX_WMM_SET_NUM] - [WMM_NUM_OF_AC]; /* WMM0~4 backoff time for 4 AC for MBSS or OM*/ - UINT16 om_wmm_backoff - [WMM_NUM_OF_AC]; /* WMM0~4 backoff time for 4 AC for OM */ - UINT16 repeater_wmm_backoff - [WMM_NUM_OF_AC]; /* WMM0~4 backoff time for 4 AC for repeater */ - UINT16 non_qos_backoff; /* non-QOS packet backoff time */ - UINT8 bssid2wmm_set[VOW_MAX_GROUP_NUM]; /* BSSID belongs to which WMM set */ - BOOLEAN rx_time_en; /* enable RX time function, include non-wifi, OBSS and per-STA timer */ -} VOW_RX_TIME_CFG_T, *PVOW_RX_TIME_CFG_T; - -/* for airtime report */ - -/* for airtime estimator */ -typedef struct _VOW_AT_ESTIMATOR_T { - UINT8 at_estimator_en; - UINT16 at_monitor_period; -} VOW_AT_ESTIMATOR_T, *P_VOW_AT_ESTIMATOR_T; - -/* for bad node detector */ -typedef struct _VOW_BAD_NODE_T { - UINT8 bn_en; - UINT16 bn_monitor_period; - UINT16 bn_fallback_threshold; - UINT16 bn_per_threshold; -} VOW_BAD_NODE_T, *P_VOW_BAD_NODE_T; - -/* for UI - OID commands */ -typedef struct _VOW_UI_CONFIG { - UINT8 ssid_num; - UINT16 val[0]; -} VOW_UI_CONFIG, *P_VOW_UI_CONFIG; - -/* for misc configuration */ -typedef struct _VOW_MISC_CFG_T { - BOOLEAN rts_sta_lock; - BOOLEAN keep_quantum; - UINT8 tx_rr_count; - BOOLEAN measurement_mode; - BOOLEAN max_backoff_bound_en; - UINT8 max_backoff_bound; - BOOLEAN rts_failed_charge_time_en; - BOOLEAN zero_eifs_time; - BOOLEAN rx_rifs_mode; - BOOLEAN keep_vow_sram_setting; - UINT8 keep_vow_sram_setting_bit; -} VOW_MISC_CFG_T; - -/* function prototype */ - -/* weighted airtime fairness*/ - -typedef struct _VOW_WATF_ENTRY { - UINT8 Addr[MAC_ADDR_LEN]; -} VOW_WATF_ENTRY, *P_VOW_WATF_ENTRY; - -typedef struct GNU_PACKED _VOW_WATF { - UINT8 Num; - VOW_WATF_ENTRY Entry[MAX_LEN_OF_MAC_TABLE]; -} VOW_WATF, *PVOW_WATF; - -/* for gen_1 & gen_2 - CR address offset */ -typedef struct _VOW_CR_OFFSET_FOR_GEN_T { - /* Is Gen_1 or Gen_2 */ - UINT8 VOW_GEN; - - /* VOW debug command 0x22/0x44 */ - UINT32 VOW_STA_SETTING_BEGIN; - UINT32 VOW_STA_SETTING_END; - UINT32 VOW_STA_BITMAP_BEGIN; - UINT32 VOW_STA_BITMAP_END; - UINT32 VOW_BSS_TOKEN_OFFSET; - UINT32 VOW_STA_SETTING_FACTOR; - - /* STA setting */ - UINT32 VOW_STA_AC_PRIORITY_OFFSET; - UINT32 VOW_STA_WMM_AC0_OFFSET; - UINT32 VOW_STA_WMM_AC1_OFFSET; - UINT32 VOW_STA_WMM_AC2_OFFSET; - UINT32 VOW_STA_WMM_AC3_OFFSET; - UINT32 VOW_STA_WMM_ID_OFFSET; -} VOW_CR_OFFSET_FOR_GEN_T, *PVOW_CR_OFFSET_FOR_GEN_T; - -struct video_ctl { - BOOLEAN enable; - struct _EDCA_PARM edca_backup[WMM_NUM_OF_AC * WMM_NUM]; - UINT32 rts_thld_pkt_len_backup[DBDC_BAND_NUM]; - UINT16 rts_thld_pkt_num_backup[DBDC_BAND_NUM]; - UINT16 rts_retry_limit_backup; -}; - -VOID vow_init(struct _RTMP_ADAPTER *pad); -VOID vow_init_CR_offset_gen_1_gen_2(struct _RTMP_ADAPTER *pad); -VOID vow_init_sta(struct _RTMP_ADAPTER *pad); -VOID vow_init_group(struct _RTMP_ADAPTER *pad); -VOID vow_init_rx(struct _RTMP_ADAPTER *pad); -VOID vow_init_misc(struct _RTMP_ADAPTER *pad); -VOID vow_reset(struct _RTMP_ADAPTER *pad); -VOID vow_reset_dvt(struct _RTMP_ADAPTER *pad); - -UINT16 vow_convert_rate_token(struct _RTMP_ADAPTER *pad, UINT8 type, - UINT8 group_id); -UINT16 vow_convert_airtime_token(struct _RTMP_ADAPTER *pad, UINT8 type, - UINT8 group_id); -VOID vow_set_client(struct _RTMP_ADAPTER *pad, UINT8 group, UINT8 sta_id); -VOID vow_group_band_map(struct _RTMP_ADAPTER *pad, UCHAR band_idx, - UCHAR group_idx); -VOID vow_mbss_grp_band_map(struct _RTMP_ADAPTER *pad, struct wifi_dev *wdev); -VOID vow_mbss_wmm_map(struct _RTMP_ADAPTER *pad, struct wifi_dev *wdev); -VOID vow_mbss_init(struct _RTMP_ADAPTER *pad, struct wifi_dev *wdev); -VOID vow_update_om_wmm(struct _RTMP_ADAPTER *pad, struct wifi_dev *wdev, - struct _EDCA_PARM *pApEdcaParm); -BOOLEAN vow_is_enabled(struct _RTMP_ADAPTER *pad); -VOID vow_atf_off_init(struct _RTMP_ADAPTER *pad); -INT32 vow_set_sta(struct _RTMP_ADAPTER *pad, UINT8 sta_id, UINT32 subcmd); -void set_vow_video_param(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT8 opmode); - -INT set_vow_min_rate_token(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_max_rate_token(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_min_airtime_token(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_max_airtime_token(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_min_rate_bucket(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_max_rate_bucket(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_min_airtime_bucket(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_max_airtime_bucket(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_max_backlog_size(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_max_wait_time(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_group_dwrr_max_wait_time(IN struct _RTMP_ADAPTER *pad, - IN RTMP_STRING *arg); - -INT set_vow_sta_pause(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_group(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_bw_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_refill_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_airtime_fairness_en(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_txop_switch_bss_en(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_dbdc_search_rule(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_refill_period(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_bss_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_dwrr_max_wait_time(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_airtime_ctrl_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_bw_ctrl_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_dwrr_quantum(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_frr_quantum(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_bss_dwrr_quantum(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_dwrr_quantum_id(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_min_rate(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_max_rate(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_min_ratio(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_max_ratio(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_counter_clr(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_airtime_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_ed_offset(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_obss_backoff(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_add_obss(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_add_non_wifi(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_wmm_backoff(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_non_qos_backoff(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_rx_om_wmm_backoff(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_rx_repeater_wmm_backoff(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_vow_rx_bss_wmmset(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_rx_om_wmm_select(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_charge_sta_dwrr(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_charge_bw_time(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_charge_bw_len(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_charge_bw_dwrr(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_life_time(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -/* STA */ - -INT set_vow_sta_ac_priority(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_psm(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -/* M2M test */ -INT set_vow_pkt_ac(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_monitor_sta(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_monitor_bss(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_monitor_mbss(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_avg_num(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_dvt_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_cloned_wtbl(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_ack_all(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_ack(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_wmm_all(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_wmm(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_ac_all(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_ac(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_tx_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_tx_en_all(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_mbss(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_show_sta(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_show_mbss(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_dump_vow(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_dump_sta(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_dump_bss_bitmap(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_dump_bss(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT vow_show_bss_atoken(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT vow_show_bss_ltoken(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT vow_show_bss_dtoken(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT vow_show_sta_dtoken(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT vow_show_queue_status(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_bcmc_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -VOID vow_display_info_periodic(IN struct _RTMP_ADAPTER *pAd); - -INT set_vow_q_len(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_txs_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -/* for CR4 commands */ -INT set_vow_sta_cnt(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_q(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta2_q(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_sta_th(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -/* show */ -INT show_vow_rx_time(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_get_sta_token(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_sta_conf(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_all_sta_conf(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_bss_conf(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_all_bss_conf(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_info(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -/* airtime estimator */ -INT set_vow_at_est_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_at_mon_period(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_group2band_map(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -/* bad node detector */ -INT set_vow_bn_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_bn_mon_period(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_bn_fallback_th(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_bn_per_th(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -/* VOW rx counter test */ -INT set_vow_counter_test_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -INT set_vow_counter_test_period(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); -INT set_vow_counter_test_band(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); -INT set_vow_counter_test_avgcnt(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); -INT set_vow_counter_test_target(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -/* help */ - -INT set_vow_help(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT show_vow_help(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -/* WATF */ - -VOID vow_reset_watf(IN struct _RTMP_ADAPTER *pad); - -BOOLEAN vow_watf_is_enabled(IN struct _RTMP_ADAPTER *pad); - -INT show_vow_watf_info(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_watf_en(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_watf_q(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_watf_add_entry(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT set_vow_watf_del_entry(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -VOID set_vow_watf_sta_dwrr(IN struct _RTMP_ADAPTER *pAd, IN UINT8 *Addr, - IN UINT8 Wcid); -INT set_vow_fixed_rate(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -BOOLEAN vow_is_queue_full(IN struct _RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR qidx); - -#endif /* __AP_VOW_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_wds.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_wds.h deleted file mode 100644 index 4bc285fc4e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ap_wds.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ap_wds.h - - Abstract: - Support WDS function. - - Revision History: - Who When What - ------ ---------- ---------------------------------------------- - Fonchi 02-13-2007 created -*/ - -#ifndef _AP_WDS_H_ -#define _AP_WDS_H_ - -#define WDS_ENTRY_RETRY_INTERVAL (100 * OS_HZ / 1000) - -static inline BOOLEAN WDS_IF_UP_CHECK(IN PRTMP_ADAPTER pAd, IN ULONG ifidx) -{ - if ((pAd->WdsTab.flg_wds_init != TRUE) || (ifidx >= MAX_WDS_ENTRY)) - return FALSE; - - /* if(RTMP_OS_NETDEV_STATE_RUNNING(pAd->WdsTab.WdsEntry[ifidx].dev)) */ - /* Patch for wds ,when dirver call apmlmeperiod => APMlmeDynamicTxRateSwitching check if wds device ready */ - if ((pAd->WdsTab.WdsEntry[ifidx].wdev.if_dev != NULL) && - (RTMP_OS_NETDEV_STATE_RUNNING( - pAd->WdsTab.WdsEntry[ifidx].wdev.if_dev))) - return TRUE; - - return FALSE; -} - -INT WdsEntryAlloc(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr); - -VOID WdsEntryDel(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr); - -MAC_TABLE_ENTRY *MacTableInsertWDSEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, - UINT WdsTabIdx); - -BOOLEAN MacTableDeleteWDSEntry(IN PRTMP_ADAPTER pAd, IN USHORT wcid); - -MAC_TABLE_ENTRY *WdsTableLookupByWcid(IN PRTMP_ADAPTER pAd, IN UCHAR wcid, - IN PUCHAR pAddr, - IN BOOLEAN bResetIdelCount); - -MAC_TABLE_ENTRY *WdsTableLookup(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, - IN BOOLEAN bResetIdelCount); - -MAC_TABLE_ENTRY *FindWdsEntry(IN PRTMP_ADAPTER pAd, IN struct _RX_BLK *pRxBlk); - -VOID WdsTableMaintenance(IN PRTMP_ADAPTER pAd); - -VOID AsicUpdateWdsRxWCIDTable(IN PRTMP_ADAPTER pAd, IN UINT WdsTabIdx); - -VOID AsicUpdateWdsEncryption(IN PRTMP_ADAPTER pAd, IN UCHAR wcid); - -VOID WdsPeerBeaconProc(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN UCHAR MaxSupportedRateIn500Kbps, - IN UCHAR MaxSupportedRateLen, IN BOOLEAN bWmmCapable, - IN BCN_IE_LIST *ie_list); - -VOID APWdsInitialize(RTMP_ADAPTER *pAd); - -INT Show_WdsTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID rtmp_read_wds_from_file(IN PRTMP_ADAPTER pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *buffer); - -VOID WDS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps); -VOID WDS_Remove(RTMP_ADAPTER *pAd); -BOOLEAN WDS_StatsGet(RTMP_ADAPTER *pAd, RT_CMD_STATS *pStats); -VOID AP_WDS_KeyNameMakeUp(RTMP_STRING *pKey, UINT32 KeyMaxSize, INT KeyId); - -INT wds_tx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt); - -INT wds_rx_foward_handle(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pPacket); - -UCHAR WdsPhyOpModeToSuppPhyMode(IN PRTMP_ADAPTER pAd, - IN PRT_802_11_WDS_ENTRY pWdsEntry); - -UCHAR WdsPhyOpModeToSuppRateMode(IN PRTMP_ADAPTER pAd, - IN PRT_802_11_WDS_ENTRY pWdsEntry); - -/* - ========================================================================== - Description: - Check the WDS Entry is valid or not. - ========================================================================== - */ - -BOOLEAN ValidWdsEntry(IN PRTMP_ADAPTER pAd, IN UCHAR WdsIndex); - -INT wds_inf_open(struct wifi_dev *wdev); -INT wds_inf_close(struct wifi_dev *wdev); - -BOOLEAN WdsMsgTypeSubst(IN PRTMP_ADAPTER pAd, IN PFRAME_802_11 pFrame, - OUT PINT Machine, OUT PINT MsgType); - -VOID ap_wds_rcv_uc_data_action(IN struct _RTMP_ADAPTER *pAd, - IN struct _MLME_QUEUE_ELEM *Elem); - -VOID ap_wds_bss_linkdown(IN struct _RTMP_ADAPTER *pAd, - IN struct _MLME_QUEUE_ELEM *Elem); - -/* ap_wds.c */ -VOID WdsStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -#endif /* _AP_WDS_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/arris_mod_api.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/arris_mod_api.h deleted file mode 100644 index 6c0b4b1e8c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/arris_mod_api.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifdef VENDOR_FEATURE7_SUPPORT -/* Copyright 2014, ARRIS Enterprises, Inc., All rights reserved */ - -#ifndef _ARRIS_MOD_API_H -#define _ARRIS_MOD_API_H - -#include - -#define ARRISMOD_DEFINE(type, fn, args...) \ - { \ - type (*fn)(args) = NULL; \ - EXPORT_SYMBOL(fn) \ - } - -/* FIXME: silence undefined reference */ -#ifndef ARRIS_MODULE_PRESENT - -static inline void arris_event_send_hook_fn(int cpu, int logtype, int dummy, - char *msg, int msglen) -{ - printk(KERN_ERR "\nARRIS_EVENT::: %s\n", msg); -} -extern void (*f)(int, int, int, char *, int); -#define arris_event_send_hook f - -#else - -#define arris_event_send_hook NULL - -#define ARRISMOD_EXTERN(type, fn, args...) \ - { \ - extern type (*fn)(args); \ - } -#endif /* ARRIS_MODULE_PRESENT */ - -#define ARRISMOD_CALL(fn, args...) \ - { \ - if (fn) { \ - fn(args); \ - } \ - } - -#define ARRISMOD_CALL_SET(val, fn, args...) \ - { \ - if (fn) { \ - val = fn(args) \ - } \ - } - -#define ARRISMOD_CALL_BREAK(fn, args...) \ - { \ - if (fn) { \ - if (fn(args) < 0) \ - break; \ - } \ - } - -#define ARRISMOD_CALL_EXIT(fn, args...) \ - { \ - if (fn) { \ - if (fn(args) < 0) \ - return; \ - } \ - } - -#define ARRISMOD_RETURN(fn, ret_trig, ret_val, args...) \ - { \ - if (fn) { \ - if (fn(args) == ret_trig) \ - return ret_val; \ - } \ - } - -#endif /* _ARRIS_MOD_API_H */ -#endif /* VENDOR_FEATURE7_SUPPORT*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/arris_wps_gpio_handler.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/arris_wps_gpio_handler.h deleted file mode 100644 index 733620a284..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/arris_wps_gpio_handler.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifdef VENDOR_FEATURE7_SUPPORT -#ifndef __ARRIS_WPS_GPIO_H__ -#define __ARRIS_WPS_GPIO_H__ - -#define GPIO_WPS_SW 50 -#define GPIO_WPS_LED 31 -#define WPS_LED_HIGH 0 -#define WPS_LED_LOW 1 - -#define WPS_CONNECT_TIME 400 /* 120 sec * ( iterations per sec ) */ -#define WPS_LED_CHECK_TIME 3 /* sec 3 * 100ms */ -#define WPS_PBC_MAX_TIME 10 /* sec 3s = 10 * 300ms */ -#define WIFI_24_RADIO 1 -#define WIFI_50_RADIO 9 - -#define LED_AP_STOP 66 /* used to flag whether AP is stop */ - -#define print_console(fmt, args...) ({ fprintf(stdout, fmt, ##args); }) -#define print_err(fmt, args...) ({ fprintf(stderr, fmt, ##args); }) - -/* ++ Anjan: silence undefined reference */ -#ifndef ARRIS_MODULE_PRESENT -static inline int arris_wps_gpio_check_wps_button(void) -{ - return 0; -} - -static inline void arris_wps_led_stat_set(int radio, int ledSta) -{ -} - -static inline void arris_wps_led_handler(int radio) -{ -} - -#else /* ARRIS_MODULE_PRESENT */ -int arris_wps_gpio_check_wps_button(void); - -void arris_wps_led_stat_set(int radio, int ledSta); - -void arris_wps_led_handler(int radio); -#endif /* ARRIS_MODULE_PRESENT */ - -#endif -#endif /* VENDOR_FEATURE7_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/band_steering.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/band_steering.h deleted file mode 100644 index a89e40971b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/band_steering.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - band_steering.h -*/ - -#ifndef _BAND_STEERING_H_ -#define __BAND_STEERING_H__ - -#ifdef BAND_STEERING - -/* ioctl */ -INT Show_BndStrg_List(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Show_BndStrg_Info(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_BndStrg_Enable(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_BndStrg_Param(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#ifdef BND_STRG_DBG -INT Set_BndStrg_MonitorAddr(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif /* BND_STRG_DBG */ - -INT BndStrg_Init(PRTMP_ADAPTER pAd); -INT BndStrg_Release(PRTMP_ADAPTER pAd); -INT BndStrg_TableInit(PRTMP_ADAPTER pAd, INT apidx); -INT BndStrg_TableRelease(PBND_STRG_CLI_TABLE table); -PBND_STRG_CLI_TABLE Get_BndStrgTable(PRTMP_ADAPTER pAd, INT apidx); -PBND_STRG_CLI_ENTRY BndStrg_TableLookup(PBND_STRG_CLI_TABLE table, - PUCHAR pAddr); - -/* WPS_BandSteering Support */ -PWPS_WHITELIST_ENTRY FindWpsWhiteListEntry(PLIST_HEADER pWpsWhiteList, - PUCHAR pMacAddr); -VOID AddWpsWhiteList(PLIST_HEADER pWpsWhiteList, PUCHAR pMacAddr); -VOID DelWpsWhiteListExceptMac(PLIST_HEADER pWpsWhiteList, PUCHAR pMacAddr); -VOID ClearWpsWhiteList(PLIST_HEADER pWpsWhiteList); - -PBS_LIST_ENTRY FindBsListEntry(PLIST_HEADER pBsList, PUCHAR pMacAddr); -VOID AddBsListEntry(PLIST_HEADER pBsList, PUCHAR pMacAddr); -VOID DelBsListEntry(PLIST_HEADER pBsList, PUCHAR pMacAddr); -VOID ClearBsList(PLIST_HEADER pBsList); - -BOOLEAN BndStrg_CheckConnectionReq(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - PUCHAR pSrcAddr, - struct raw_rssi_info *rssi_info, - ULONG MsgType, - PEER_PROBE_REQ_PARAM *ProbeReqParam); - -INT BndStrg_Tb_Enable(PBND_STRG_CLI_TABLE table, BOOLEAN enable, CHAR *IfName); -INT BndStrg_SetInfFlags(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - PBND_STRG_CLI_TABLE table, BOOLEAN bInfReady); -INT BndStrg_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - INT apidx); -#ifdef VENDOR_FEATURE5_SUPPORT -void BndStrg_GetNvram(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - INT apidx); -void BndStrg_SetNvram(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - INT apidx); -INT Show_BndStrg_NvramTable(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif /* VENDOR_FEATURE5_SUPPORT */ -INT Set_BndStrg_BssIdx(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -void BndStrg_UpdateEntry(PRTMP_ADAPTER pAd, MAC_TABLE_ENTRY *pEntry, - IE_LISTS *ie_list, BOOLEAN bConnStatus); -UINT8 GetNssFromHTCapRxMCSBitmask(UINT32 RxMCSBitmask); -void BndStrgSetProfileParam(struct _RTMP_ADAPTER *pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *pBuffer); -void BndStrgHeartBeatMonitor(PRTMP_ADAPTER pAd); -INT BndStrgSendMsg(PRTMP_ADAPTER pAd, BNDSTRG_MSG *msg); -void BndStrg_send_BTM_req(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *BTMReq, IN UINT32 BTMReqLen, - PBND_STRG_CLI_TABLE table); -void BndStrg_Send_NeighborReport(PRTMP_ADAPTER pAd, PBND_STRG_CLI_TABLE table); - -#define IS_VALID_MAC(addr) \ - ((addr[0]) | (addr[1]) | (addr[2]) | (addr[3]) | (addr[4]) | (addr[5])) - -#ifdef BND_STRG_DBG -#define RED(_text) "\033[1;31m" _text "\033[0m" -#define GRN(_text) "\033[1;32m" _text "\033[0m" -#define YLW(_text) "\033[1;33m" _text "\033[0m" -#define BLUE(_text) "\033[1;36m" _text "\033[0m" - -#define BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, _Level, _Fmt) \ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, _Level, _Fmt) -#else /* BND_STRG_DBG */ -#define RED(_text) _text -#define GRN(_text) _text -#define YLW(_text) _text -#define BLUE(_text) _text - -#define BND_STRG_MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, _Level, _Fmt) -#endif /* !BND_STRG_DBG */ - -#ifdef BND_STRG_QA -#define BND_STRG_PRINTQAMSG(_table, _Addr, _Fmt) \ - { \ - if (MAC_ADDR_EQUAL(_table->MonitorAddr, _Addr)) \ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, \ - _Fmt); \ - } -#else -#define BND_STRG_PRINTQAMSG(_Level, _Fmt) -#endif /* BND_STRG_QA */ - -#endif /* BAND_STEERING */ -#endif /* _BAND_STEERING_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/band_steering_def.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/band_steering_def.h deleted file mode 100644 index fa4f2b8ddd..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/band_steering_def.h +++ /dev/null @@ -1,376 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - band_steering_def.h -*/ - -#ifndef _BAND_STEERING_DEF_H_ -#define _BAND_STEERING_DEF_H_ - -#ifdef BAND_STEERING -#ifndef DOT11_N_SUPPORT -#error : "DOT11_N_SUPPORT must be enabled when using band steering" -#endif /* DOT11_N_SUPPORT */ - -#define BND_STRG_MAX_TABLE_SIZE 64 -#define P_BND_STRG_TABLE(_x) (&pAd->ApCfg.BndStrgTable[_x]) -/* #define SIZE_OF_VHT_CAP_IE 12 */ -#define IS_5G_BAND(_p) (((_p)&BAND_5G) == BAND_5G) - -#define BND_STRG_DBG -#define BND_STRG_QA - -typedef struct _BND_STRG_CLI_ENTRY { - BOOLEAN bValid; - BOOLEAN bConnStatus; - UINT8 TableIndex; - UINT32 Control_Flags; - ULONG jiffies; /* timestamp when insert-entry */ - UINT32 elapsed_time; /* ms */ - UCHAR Addr[MAC_ADDR_LEN]; - UCHAR BndStrg_Sta_State; - struct _BND_STRG_CLI_ENTRY *pNext; -} BND_STRG_CLI_ENTRY, *PBND_STRG_CLI_ENTRY; - -/* WPS_BandSteering Support */ -typedef struct _WPS_WHITELIST_ENTRY { - struct _WPS_WHITELIST_ENTRY *pNext; - UCHAR addr[MAC_ADDR_LEN]; - UCHAR state; -} WPS_WHITELIST_ENTRY, *PWPS_WHITELIST_ENTRY; - -typedef struct _BS_LIST_ENTRY { - struct _BS_LIST_ENTRY *pNext; - UCHAR addr[MAC_ADDR_LEN]; - UCHAR state; -} BS_LIST_ENTRY, *PBS_LIST_ENTRY; - -#define NVRAM_TABLE_SIZE 128 - -typedef struct _bndstrg_nvram_client { - UINT8 Addr[MAC_ADDR_LEN]; - UINT8 Manipulable; - UINT8 PhyMode; - UINT8 Band; - UINT8 Nss; -} BNDSTRG_NVRAM_CLIENT, *PBNDSTRG_NVRAM_CLIENT; - -typedef struct _bndstrg_nvram_list { - UINT8 Num; - BNDSTRG_NVRAM_CLIENT nvram_entry[NVRAM_TABLE_SIZE]; -} BNDSTRG_NVRAM_LIST, *PBNDSTRG_NVRAM_LIST; - -enum PhyMode { - fPhyMode_Legacy, - fPhyMode_HT, - fPhyMode_VHT, -}; - -#define BND_STRG_MAX_WHITELIST_ENTRY 16 -#define BND_STRG_MAX_BLACKLIST_ENTRY 4 - -typedef struct _BND_STRG_CLI_TABLE { - BOOLEAN bInitialized; - BOOLEAN bEnabled; - UINT32 Size; - BND_STRG_CLI_ENTRY Entry[BND_STRG_MAX_TABLE_SIZE]; - PBND_STRG_CLI_ENTRY Hash[HASH_TABLE_SIZE]; - NDIS_SPIN_LOCK Lock; - VOID *priv; - BOOLEAN bInfReady; - CHAR ucIfName[32]; - UINT8 uIdx; -#ifdef BND_STRG_DBG - UCHAR MonitorAddr[MAC_ADDR_LEN]; -#endif /* BND_STRG_DBG */ -#ifdef VENDOR_FEATURE5_SUPPORT - BNDSTRG_NVRAM_CLIENT nvram_entry[NVRAM_TABLE_SIZE]; - UINT8 bndstrg_nvram_client_count; -#endif /* VENDOR_FEATURE5_SUPPORT */ - UINT8 Band; - UINT8 Channel; - BOOLEAN bVHTCapable; - UINT8 nss; - INT8 ActiveCount; - UINT32 DaemonPid; -#ifdef DOT11K_RRM_SUPPORT - RRM_NEIGHBOR_REP_INFO NeighborRepInfo; -#endif - UINT8 BndStrgMode; - /* WPS_BandSteering Support */ - LIST_HEADER WpsWhiteList; /* WPS: init in bandstearing table init */ - NDIS_SPIN_LOCK WpsWhiteListLock; - LIST_HEADER WhiteList; /* init in bandstearing table init */ - NDIS_SPIN_LOCK WhiteListLock; - LIST_HEADER BlackList; /* init in bandstearing table init */ - NDIS_SPIN_LOCK BlackListLock; -} BND_STRG_CLI_TABLE, *PBND_STRG_CLI_TABLE; - -enum BND_STRG_RETURN_CODE { - BND_STRG_SUCCESS = 0, - BND_STRG_INVALID_ARG, - BND_STRG_RESOURCE_ALLOC_FAIL, - BND_STRG_TABLE_FULL, - BND_STRG_TABLE_IS_NULL, - BND_STRG_NOT_INITIALIZED, - BND_STRG_2G_INF_NOT_READY, - BND_STRG_5G_INF_NOT_READY, - BND_STRG_STA_IS_CONNECTED, - BND_STRG_UNEXP, -}; - -enum ACTION_CODE { - CLI_EVENT = 1, - CLI_ADD, - CLI_DEL, - CLI_STATUS_REQ, - CLI_STATUS_RSP, - CHANLOAD_STATUS_REQ, - CHANLOAD_STATUS_RSP, - INF_STATUS_QUERY, - INF_STATUS_RSP, - TABLE_INFO, - ENTRY_LIST, - BNDSTRG_ONOFF, - SET_MNT_ADDR, - NVRAM_UPDATE, - REJECT_EVENT, - HEARTBEAT_MONITOR, - BNDSTRG_WNM_BTM, - BNDSTRG_PARAM, - BNDSTRG_NEIGHBOR_REPORT, - UPDATE_WHITE_BLACK_LIST, -}; - -enum BND_STRG_STA_STATE { - BNDSTRG_STA_INIT = 0, - BNDSTRG_STA_ASSOC, - BNDSTRG_STA_DISASSOC, -}; - -enum bndstrg_mode { - PRE_CONNECTION_STEERING = 0x01, - POST_CONNECTION_STEERING = 0x02, -}; - -enum bndstrg_list_type { - bndstrg_whitelist = 1, - bndstrg_blacklist = 2, -}; - -/* HEARTBEAT_MONITOR */ -struct bnd_msg_heartbeat { - CHAR ucIfName[32]; -}; - -struct bnd_msg_cli_probe { - BOOLEAN bAllowStaConnectInHt; - BOOLEAN bIosCapable; /* For IOS immediately connect */ - UINT8 bVHTCapable; - UINT8 Nss; - CHAR Rssi[4]; -}; - -struct bnd_msg_cli_auth { - CHAR Rssi[4]; -}; - -struct bnd_msg_cli_assoc { - BOOLEAN bAllowStaConnectInHt; - UINT8 bVHTCapable; - UINT8 Nss; - UINT8 BTMSupport; - /* WPS_BandSteering Support */ - BOOLEAN bWpsAssoc; -}; - -struct bnd_msg_cli_delete { -}; - -/* CLI_EVENT */ -struct bnd_msg_cli_event { - UINT8 FrameType; - UINT8 Band; - UINT8 Channel; - UCHAR Addr[MAC_ADDR_LEN]; - union { - struct bnd_msg_cli_probe cli_probe; - struct bnd_msg_cli_auth cli_auth; - struct bnd_msg_cli_assoc cli_assoc; - struct bnd_msg_cli_delete cli_delete; - } data; -}; - -/* CLI_ADD */ -struct bnd_msg_cli_add { - UINT8 TableIndex; - UCHAR Addr[MAC_ADDR_LEN]; -}; - -/* CLI_DEL */ -struct bnd_msg_cli_del { - UINT8 TableIndex; - UCHAR Addr[MAC_ADDR_LEN]; -}; - -/* CLI_STATUS_REQ */ -struct bnd_msg_cli_status_req { -}; - -/* CLI_STATUS_RSP */ -struct bnd_msg_cli_status_rsp { - UINT8 TableIndex; - UINT8 ReturnCode; - UCHAR Addr[MAC_ADDR_LEN]; - char data_Rssi; - UINT32 data_tx_Rate; - UINT32 data_rx_Rate; - UINT64 data_tx_Byte; - UINT64 data_rx_Byte; - UINT8 data_tx_Phymode; - UINT8 data_rx_Phymode; - UINT8 data_tx_mcs; - UINT8 data_rx_mcs; - UINT8 data_tx_bw; - UINT8 data_rx_bw; - UINT8 data_tx_sgi; - UINT8 data_rx_sgi; - UINT8 data_tx_stbc; - UINT8 data_rx_stbc; - UINT8 data_tx_ant; - UINT8 data_rx_ant; - UINT64 data_tx_packets; - UINT64 data_rx_packets; -}; - -/* CHANLOAD_STATUS_REQ */ -struct bnd_msg_chanload_status_req { - CHAR ucIfName[32]; - /* u8 band; */ - /* u8 Channel; */ -}; -/* CHANLOAD_STATUS_RSP */ -struct bnd_msg_chanload_status_rsp { - UINT8 ReturnCode; - UINT8 band; - UINT8 Channel; - /* TBD */ - UINT8 chanload; - UINT8 chan_busy_load; - UINT8 obss_load; - UINT8 edcca_load; - UINT8 myair_load; - UINT8 mytxair_load; - UINT8 myrxair_load; -}; - -/* INF_STATUS_QUERY */ -struct bnd_msg_inf_status_req { - CHAR ucIfName[32]; -}; - -struct bnd_msg_inf_status_rsp { - BOOLEAN bInfReady; - UINT8 Channel; - BOOLEAN bVHTCapable; - ULONG table_src_addr; - CHAR ucIfName[32]; - UINT8 nvram_support; - UINT8 nss; - UINT8 band; - UINT32 table_size; -}; - -/* BNDSTRG_ONOFF */ -struct bnd_msg_onoff { - UINT8 Band; - UINT8 Channel; - BOOLEAN OnOff; - UINT8 BndStrgMode; - CHAR ucIfName[32]; -}; - -/* set band steering paramater */ -struct bnd_msg_param { - UINT8 Band; - UINT8 Channel; - UINT8 len; - CHAR arg[64]; -}; - -struct bnd_msg_neighbor_report { - UCHAR Addr[MAC_ADDR_LEN]; - UINT8 Band; - UINT8 Channel; - CHAR NeighborRepInfo[64]; -}; - -/* SET_MNT_ADDR */ -struct bnd_msg_mnt_addr { - UCHAR Addr[MAC_ADDR_LEN]; -}; - -/* NVRAM_UPDATE */ -struct bnd_msg_nvram_entry_update { - UCHAR Addr[MAC_ADDR_LEN]; - BNDSTRG_NVRAM_CLIENT nvram_entry; -}; - -struct bnd_msg_reject_body { - UINT32 DaemonPid; -}; - -/*display type for list*/ -struct bnd_msg_display_entry_list { - UINT32 display_type; - UINT8 filer_band; - UINT8 channel; -}; - -struct bnd_msg_update_white_black_list { - CHAR ucIfName[32]; - UINT8 list_type; - UCHAR Addr[MAC_ADDR_LEN]; - BOOLEAN deladd; -}; - -struct bnd_msg_wnm_command { - UINT8 wnm_data[64]; -}; - -typedef struct _BNDSTRG_MSG { - UINT8 Action; - union { - struct bnd_msg_cli_event cli_event; - struct bnd_msg_cli_add cli_add; - struct bnd_msg_cli_del cli_del; - struct bnd_msg_cli_status_req cli_status_req; - struct bnd_msg_cli_status_rsp cli_status_rsp; - struct bnd_msg_chanload_status_req chanload_status_req; - struct bnd_msg_chanload_status_rsp chanload_status_rsp; - struct bnd_msg_inf_status_req inf_status_req; - struct bnd_msg_inf_status_rsp inf_status_rsp; - struct bnd_msg_onoff onoff; - struct bnd_msg_mnt_addr mnt_addr; - struct bnd_msg_nvram_entry_update entry_update; - struct bnd_msg_reject_body reject_body; - struct bnd_msg_display_entry_list display_type; - struct bnd_msg_heartbeat heartbeat; - struct bnd_msg_param bndstrg_param; - struct bnd_msg_update_white_black_list update_white_black_list; - struct bnd_msg_wnm_command wnm_cmd_data; - struct bnd_msg_neighbor_report Neighbor_Report; - } data; -} BNDSTRG_MSG, *PBNDSTRG_MSG; -#endif /* BAND_STEERING */ -#endif /* _BAND_STEERING_DEF_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bcn.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bcn.h deleted file mode 100644 index 9659a39d1f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bcn.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - bcn.h - - Abstract: - bcn related fucntions definition. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Carter 2014-1121 Created. -*/ - -#ifndef __BCN_H__ -#define __BCN_H__ - -#define MAX_BEACON_LENGTH \ - (sizeof(HEADER_802_11) + TIMESTAMP_FIELD_LEN + \ - BEACON_INTERVAL_FIELD_LEN + CAP_INFO_FIELD_LEN + MAX_IE_LENGTH) - -enum BCN_UPDATE_REASON { - BCN_UPDATE_INIT = 0, /* beacon resource initial. */ - BCN_UPDATE_IF_STATE_CHG = - 1, /* there is interface up or down, check related TXD handle. */ - BCN_UPDATE_IE_CHG = - 2, /* simple IE change, just update the corresponding interface content. */ - BCN_UPDATE_AP_RENEW = - 3, /* prepared All beacon for All active interface. */ - BCN_UPDATE_PRETBTT = - 4, /* update function routine, source could from INT isr or timer or event notify. */ - BCN_UPDATE_ENABLE_TX = 5, /* Enable Beacon TX. */ - BCN_UPDATE_DISABLE_TX = 6, /* Disable Beacon TX. */ - BCN_UPDATE_TIM = 7, /* TIM preparing */ -}; - -typedef enum _ENUM_UPDATE_PKT_TYPE_T { - PKT_BCN = 0, - PKT_TIM = 1, -/* add bcn v2 support , 1.5k beacon support */ -#ifdef BCN_V2_SUPPORT - PKT_V2_BCN = 2, - PKT_V2_TIM = 3, -#endif -} ENUM_UPDATE_PKT_TYPE_T; - -typedef enum _BCN_GEN_METHOD { - BCN_GEN_BY_HW_SHARED_MEM = 0, /* RT chip */ - BCN_GEN_BY_HOST_IN_PRETBTT, /* MT_chip with small size fw */ - BCN_GEN_BY_FW, /* MT_chip with large size fw */ - BCN_GEN_BY_HOST_TOUCH_PSE_CTNT /* TODO:MT_chip don't free bcn in BcnQ, recycle update by Host */ -} BCN_GEN_METHOD; - -VOID write_tmac_info_beacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *tmac_buf, HTTRANSMIT_SETTING *BeaconTransmit, - ULONG frmLen); - -INT bcn_buf_deinit(RTMP_ADAPTER *pAd, BCN_BUF_STRUC *bcn_info); - -INT bcn_buf_init(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -INT clearHwBcnTxMem(RTMP_ADAPTER *pAd); - -ULONG ComposeBcnPktHead(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *pBeaconFrame); -VOID BcnCheck(RTMP_ADAPTER *pAd); - -#ifdef CONFIG_AP_SUPPORT -INT BcnTimUpdate(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *ptr); -#endif -VOID ComposeBcnPktTail(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - ULONG *pFrameLen, UCHAR *pBeaconFrame); - -UINT16 MakeBeacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BOOLEAN UpdateRoutine); - -BOOLEAN BeaconTransmitRequired(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BOOLEAN UpdateRoutine); - -VOID UpdateBeaconHandler(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR BCN_UPDATE_REASON); - -BOOLEAN UpdateBeaconProc(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BOOLEAN UpdateRoutine, UCHAR UpdatePktType, - BOOLEAN bMakeBeacon); - -VOID updateBeaconRoutineCase(RTMP_ADAPTER *pAd, BOOLEAN UpdateAfterTim); - -#endif /* __BCN_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bgnd_scan.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bgnd_scan.h deleted file mode 100644 index 3c5a4e1984..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bgnd_scan.h +++ /dev/null @@ -1,62 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Abstract: - - - */ - -#include "bgnd_scan_cmm.h" - -#ifndef __BGND_SCAN_H__ -#define __BGND_SCAN_H__ - -#define GET_BGND_STATE(_pAd, _state) \ - ((_pAd->BgndScanCtrl.BgndScanStatMachine.CurrState == _state)) - -VOID BackgroundScanCancelAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -VOID BackgroundScanStartAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -VOID BackgroundScanTimeoutAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -VOID BackgroundSwitchChannelAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -VOID BackgroundChannelSwitchAnnouncementAction(RTMP_ADAPTER *pAd, - MLME_QUEUE_ELEM *Elem); -VOID BackgroundScanPartialAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -VOID BackgroundScanWaitAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -VOID BackgroundScanNextChannel(IN PRTMP_ADAPTER pAd, IN UINT8 ScanType); -VOID BackgroundScanInit(IN PRTMP_ADAPTER pAd); -VOID BackgroundScanDeInit(IN PRTMP_ADAPTER pAd); -VOID BackgroundScanStart(IN PRTMP_ADAPTER pAd, IN UINT8 BgndscanType); - -void BackgroundScanTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); -void DfsZeroWaitTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); -VOID BackgroundScanTest(IN PRTMP_ADAPTER pAd, IN MT_BGND_SCAN_CFG BgndScanCfg); -VOID ChannelQualityDetection(IN PRTMP_ADAPTER pAd); - -VOID DfsZeroWaitStartAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -VOID DfsZeroWaitStopAction(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -VOID DfsZeroWaitStart(IN PRTMP_ADAPTER pAd, IN BOOLEAN DfsZeroWaitEnable, - struct wifi_dev *wdev); -#ifdef MT_DFS_SUPPORT -VOID DedicatedZeroWaitStartAction(IN RTMP_ADAPTER *pAd, - IN MLME_QUEUE_ELEM *Elem); -VOID DedicatedZeroWaitRunningAction(IN RTMP_ADAPTER *pAd, - IN MLME_QUEUE_ELEM *Elem); -VOID DedicatedZeroWaitStop(IN RTMP_ADAPTER *pAd, BOOLEAN bApplyCurrentCh); -#endif -VOID BfSwitch(IN PRTMP_ADAPTER pAd, IN UCHAR enabled); -VOID MuSwitch(IN PRTMP_ADAPTER pAd, IN UCHAR enabled); -#endif /* __BGND_SCAN_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bgnd_scan_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bgnd_scan_cmm.h deleted file mode 100644 index 17a5b4274d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/bgnd_scan_cmm.h +++ /dev/null @@ -1,204 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Abstract: - - - */ -#ifndef __BGND_SCAN_CMM_H__ -#define __BGND_SCAN_CMM_H__ -#define BGND_SCAN_MACHINE_BASE 0 -#define BGND_SCAN_IDLE 0 -#define BGND_SCAN_LISTEN 1 -#define BGND_RDD_DETEC 2 -#define BGND_CS_ANN 3 -#define BGND_SCAN_WAIT 4 -#ifdef ONDEMAND_DFS -#define BGND_ONDMND_CNLSWITCH_ON 5 -#define BGND_SCAN_MAX_STATE 6 -#else -#define BGND_SCAN_MAX_STATE 5 -#endif - -#define BGND_SCAN_REQ 0 -#define BGND_SCAN_TIMEOUT 1 -#define BGND_SCAN_CNCL 2 -#define BGND_SWITCH_CHANNEL 3 -#define BGND_RDD_REQ 4 -#define BGND_RDD_CNCL 5 -#define BGND_RDD_TIMEOUT 6 -#define BGND_OUTBAND_RADAR_FOUND 7 -#define BGND_OUTBAND_SWITCH 8 -#define BGND_CH_SW_ANN 9 -#define BGND_PARTIAL_SCAN 10 -#define BGND_SCAN_DONE 11 -#define BGND_DEDICATE_RDD_REQ 12 -#define BGND_SCAN_MAX_MSG 13 - -#define BGND_SCAN_FUNC_SIZE (BGND_SCAN_MAX_STATE * BGND_SCAN_MAX_MSG) - -#define DefaultBgndScanInterval \ - 1800 /* 30min. The auto trigger interval shoulde more than this value */ -#define DefaultBgndScanPerChInterval 10 /* 10 seconds. Partial Scan interval */ -#define DefaultNoisyThreshold 85 /* % */ -#define DefaultChBusyTimeThreshold 600000 -#define DefaultMyAirtimeUsageThreshold 100000 -#define DefaultScanDuration 200 /*ms*/ -#define B0IrpiSwCtrlOnlyOffset 29 -#define B0IrpiSwCtrlResetOffset 18 -#define B0IpiEnableCtrlOffset 12 -#define B0IpiEnableCtrlValue 0x5 -/*redefine for band1 for code readability*/ -#define B1IrpiSwCtrlOnlyOffset 29 -#define B1IrpiSwCtrlResetOffset 18 -#define B1IpiEnableCtrlOffset 12 -#define B1IpiEnableCtrlValue 0x5 - -#define DefaultIdleTimeThreshold 80000 /* *8us */ - -#ifdef ONDEMAND_DFS -enum Dynamic_OnDemand_Chnl_Update_Status_Code { - DFS_CHNL_UPDATE_FAIL = 0, - DFS_CHNL_UPDATE_PASS, - DFS_CHNL_UPDATE_WAIT -}; -#endif - -enum { - TYPE_BGND_DISABLE_SCAN, - TYPE_BGND_PARTIAL_SCAN, - TYPE_BGND_CONTINUOUS_SCAN, - TYPE_BGND_CONTINUOUS_SCAN_SWITCH_CH -}; - -typedef struct _BGND_SCAN_SUPP_CH_LIST { - UCHAR GroupType; /*0:BW20, 1:BW40, 2:BW80 */ - UCHAR Channel; - UCHAR CenChannel; - UCHAR DfsReq; - UCHAR RegulatoryDomain; - BOOLEAN SkipChannel; - UINT32 PccaTime; - UINT32 SccaTime; - UINT32 EDCCATime; - UINT32 Band0TxTime; - UINT32 Mdrdy; - - /* - Channel property: - - CHANNEL_DISABLED: The channel is disabled. - CHANNEL_PASSIVE_SCAN: Only passive scanning is allowed. - CHANNEL_NO_IBSS: IBSS is not allowed. - CHANNEL_RADAR: Radar detection is required. - CHANNEL_NO_FAT_ABOVE: Extension channel above this channel is not allowed. - CHANNEL_NO_FAT_BELOW: Extension channel below this channel is not allowed. - CHANNEL_40M_CAP: 40 BW channel group - CHANNEL_80M_CAP: 800 BW channel group - */ -#define CHANNEL_DEFAULT_PROP 0x00 -#define CHANNEL_DISABLED 0x01 /* no use */ -#define CHANNEL_PASSIVE_SCAN 0x02 -#define CHANNEL_NO_IBSS 0x04 -#define CHANNEL_RADAR 0x08 -#define CHANNEL_NO_FAT_ABOVE 0x10 -#define CHANNEL_NO_FAT_BELOW 0x20 -#define CHANNEL_40M_CAP 0x40 -#define CHANNEL_80M_CAP 0x80 - - UCHAR Flags; - -} BGND_SCAN_SUPP_CH_LIST, *PBGND_SCAN_SUPP_CH_LIST; - -typedef struct _BGND_SCAN_CH_GROUP_LIST { - UCHAR BestCtrlChannel; /* Min in group */ - UCHAR CenChannel; - UCHAR DfsReq; - UCHAR RegulatoryDomain; - UINT32 Max_PCCA_Time; /* Max in group */ - UINT32 Min_PCCA_Time; /* Min in group */ - UINT32 Band0_Tx_Time; - BOOLEAN SkipGroup; -} BGND_SCAN_CH_GROUP_LIST, *PBGND_SCAN_CH_GROUP_LIST; - -typedef struct _MT_BGND_SCAN_NOTIFY { - UCHAR NotifyFunc; /* bit0 for notify RA, bit1 for MU, bit2 for BF, bit3 for Smart Ant. bit4 reserve. bit5~7 indicate TxStream */ - UCHAR BgndScanStatus; /* 0:stop, 1:start, 2:running */ -} MT_BGND_SCAN_NOTIFY; - -typedef struct _MT_BGND_SCAN_CFG { - UCHAR ControlChannel; - UCHAR CentralChannel; - UCHAR Bw; - UCHAR TxStream; - UCHAR RxPath; - UCHAR Reason; - UCHAR BandIdx; -} MT_BGND_SCAN_CFG; -typedef struct _BACKGROUND_SCAN_CTRL { - /* - UCHAR ScanType; - UCHAR BssType; - UCHAR Channel; - UCHAR SsidLen; - CHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR Bssid[MAC_ADDR_LEN]; - */ - UCHAR ScanBW; - UCHAR ChannelListNum; - BOOL IsABand; - BOOL BgndScanSupport; - BGND_SCAN_SUPP_CH_LIST BgndScanChList - [MAX_NUM_OF_CHANNELS]; /* list all supported channels for background scan */ - /* BGND_SCAN_CHINFO BgndScanChInfo; */ - UCHAR ScanChannel; /* Current scan control channel */ - UCHAR ScanCenChannel; /* Current scan centrol channel */ - STATE_MACHINE_FUNC BgndScanFunc[BGND_SCAN_FUNC_SIZE]; - STATE_MACHINE BgndScanStatMachine; - - RALINK_TIMER_STRUCT BgndScanTimer; - RALINK_TIMER_STRUCT DfsZeroWaitTimer; - UCHAR RxPath; /* RxPath for background scan */ - UCHAR TxStream; /* TxStream number for background scan */ - UCHAR FirstChannel; /* Record first channle of channle list */ - UCHAR ChannelIdx; - UINT16 ScanDuration; - BGND_SCAN_CH_GROUP_LIST GroupChList[MAX_NUM_OF_CHANNELS]; - UCHAR GroupChListNum; - UCHAR BestChannel; - MT_SWITCH_CHANNEL_CFG CurrentSwChCfg[1]; - UINT32 PartialScanInterval; - UINT32 PartialScanIntervalCount; - UINT32 BgndScanIntervalCount; - UCHAR Noisy; - UCHAR NoisyTH; - UINT32 ChBusyTimeTH; - UCHAR DfsZeroWaitChannel; - ULONG DfsZeroWaitDuration; - BOOL SkipDfsChannel; - BOOL DfsZeroWaitSupport; - BOOL RadarDetected; - UCHAR BFSTARecord[MAX_LEN_OF_MAC_TABLE]; - BOOL DriverTrigger; - UINT8 ScanType; /* 0:Disable 1:partial scan 2:continuous scan */ - UINT8 SkipChannelNum; - UCHAR SkipChannelList[MAX_NUM_OF_CHANNELS]; - BOOL IsSwitchChannel; - UINT32 IPIIdleTime; - UINT32 IPIIdleTimeTH; - -} BACKGROUND_SCAN_CTRL, *PBACKGROUND_SCAN_CTRL; - -#endif /* __BGND_SCAN_CMM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/br_ftph.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/br_ftph.h deleted file mode 100644 index eb2ddb5c62..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/br_ftph.h +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - All Bridge Fast Path Related Structure & Definition. - -***************************************************************************/ - -#ifndef __BR_FTPH_H__ -#define __BR_FTPH_H__ - -/* Public function prototype */ -/* -======================================================================== -Routine Description: - Init bridge fast path module. - -Arguments: - None - -Return Value: - None - -Note: - Used in module init. -======================================================================== -*/ -VOID BG_FTPH_Init(VOID); - -/* -======================================================================== -Routine Description: - Remove bridge fast path module. - -Arguments: - None - -Return Value: - None - -Note: - Used in module remove. -======================================================================== -*/ -VOID BG_FTPH_Remove(VOID); - -/* -======================================================================== -Routine Description: - Forward the received packet. - -Arguments: - pPacket - the received packet - -Return Value: - None - -Note: -======================================================================== -*/ -UINT32 BG_FTPH_PacketFromApHandle(IN PNDIS_PACKET pPacket); - -#endif /* __BR_FTPH_H__ */ - -/* End of br_ftph.h */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211.h deleted file mode 100644 index b32b16e182..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211.h +++ /dev/null @@ -1,92 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - All MAC80211/CFG80211 Related Structure & Definition. - -***************************************************************************/ -#ifndef __CFG80211_H__ -#define __CFG80211_H__ - -#ifdef RT_CFG80211_SUPPORT - -#include - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -#define IEEE80211_NUM_BANDS NUM_NL80211_BANDS -#define IEEE80211_BAND_2GHZ NL80211_BAND_2GHZ -#define IEEE80211_BAND_5GHZ NL80211_BAND_5GHZ -#endif - -typedef enum _NDIS_HOSTAPD_STATUS { - Hostapd_Disable = 0, - Hostapd_EXT, - Hostapd_CFG -} NDIS_HOSTAPD_STATUS, - *PNDIS_HOSTAPD_STATUS; - -typedef struct __CFG80211_CB { - /* we can change channel/rate information on the fly so we backup them */ - struct ieee80211_supported_band Cfg80211_bands[IEEE80211_NUM_BANDS]; - struct ieee80211_channel *pCfg80211_Channels; - struct ieee80211_rate *pCfg80211_Rates; - - /* used in wiphy_unregister */ - struct wireless_dev *pCfg80211_Wdev; - - /* used in scan end */ - struct cfg80211_scan_request *pCfg80211_ScanReq; - - /* monitor filter */ - UINT32 MonFilterFlag; - - /* channel information */ - struct ieee80211_channel ChanInfo[MAX_NUM_OF_CHS]; - - /* to protect scan status */ - spinlock_t scan_notify_lock; - -} CFG80211_CB; - -/* -======================================================================== -Routine Description: - Register MAC80211 Module. - -Arguments: - pAd - WLAN control block pointer - pDev - Generic device interface - pNetDev - Network device - -Return Value: - NONE - -Note: - pDev != pNetDev - #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev)) - - Can not use pNetDev to replace pDev; Or kernel panic. -======================================================================== -*/ -BOOLEAN CFG80211_Register(VOID *pAd, struct device *pDev, - struct net_device *pNetDev); - -#endif /* RT_CFG80211_SUPPORT */ - -#endif /* __CFG80211_H__ */ - -/* End of cfg80211.h */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211_cmm.h deleted file mode 100644 index 532faa2476..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211_cmm.h +++ /dev/null @@ -1,175 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - All CFG80211 Function Prototype. - -***************************************************************************/ - -#ifndef __CFG80211CMM_H__ -#define __CFG80211CMM_H__ - -#ifdef RT_CFG80211_SUPPORT - -#define RTMP_CFG80211_HOSTAPD_ON(__pAd) \ - (__pAd->net_dev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_AP) - -#define CFG80211_GetEventDevice(__pAd) __pAd->net_dev - -#define CFG_GO_BSSID_IDX (MAIN_MBSSID + 1) - -#ifdef CFG_TDLS_SUPPORT -#define CATEGORY_TDLS 12 -#define PROTO_NAME_TDLS 2 -#define TDLS_TIMEOUT 5000 /* unit: msec */ - -#define TDLS_ELM_LEN_LINK_IDENTIFIER 18 -#define LENGTH_TDLS_H 24 -#define LENGTH_TDLS_PAYLOAD_H \ - 3 /* payload type(1 byte) + category(1 byte) + action(1 byte) */ - -/* Information element ID defined in 802.11z D13.0 specification. */ -#define IE_TDLS_LINK_IDENTIFIER 101 -#define IE_TDLS_WAKEUP_SCHEDULE 102 -#define IE_TDLS_CHANNEL_SWITCH_TIMING 104 -#define IE_TDLS_PTI_CONTROL 105 -#define IE_TDLS_PU_BUFFER_STATUS 106 - -#define TDLS_ACTION_CODE_SETUP_REQUEST 0 -#define TDLS_ACTION_CODE_SETUP_RESPONSE 1 -#define TDLS_ACTION_CODE_SETUP_CONFIRM 2 -#define TDLS_ACTION_CODE_TEARDOWN 3 -#define TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION 4 /* for TDLS UAPSD */ -#define TDLS_ACTION_CODE_CHANNEL_SWITCH_REQUEST 5 -#define TDLS_ACTION_CODE_CHANNEL_SWITCH_RESPONSE 6 -#define TDLS_ACTION_CODE_PEER_PSM_REQUEST 7 -#define TDLS_ACTION_CODE_PEER_PSM_RESPONSE 8 -#define TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE 9 /* for TDLS UAPSD */ -#define TDLS_ACTION_CODE_DISCOVERY_REQUEST 10 -#define TDLS_ACTION_CODE_WFD_TUNNELED_PROBE_REQ 11 -#define TDLS_ACTION_CODE_WFD_TUNNELED_PROBE_RSP 12 -#define TDLS_ACTION_CODE_AUTO_TEARDOWN 13 /* auto teardown */ - -#define TDLS_CHANNEL_SWITCH_TIME 11000 /* micro seconds */ -#define TDLS_CHANNEL_SWITCH_TIMEOUT 19000 /* micro seconds */ - -#define IS_TDLS_SUPPORT(_P) \ - ((_P)->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info.bCfgTDLSCapable == \ - TRUE) -#define TDLS_TIMESTAMP_GET(__pAd, __TimeStamp) \ - { \ - UINT32 __CSR = 0; \ - UINT64 __Value64; \ - RTMP_IO_READ32((__pAd), TSF_TIMER_DW0, &__CSR); \ - __TimeStamp = (UINT32)__CSR; \ - } - -#define MAX_NUM_OF_CFG_TDLS_ENTRY 4 - -enum { to_AP = 0, to_PEER }; -typedef struct _CFG_TDLS_ENTRY { - BOOLEAN EntryValid; - UCHAR MacAddr[MAC_ADDR_LEN]; - RALINK_TIMER_STRUCT Timer; /* Use to time out Peer Traffic Indicator */ - - UCHAR Token; /* Dialog token */ - BOOLEAN bInitiator; /* TRUE: I am TDLS Initiator STA, FALSE: I am TDLS Responder STA */ - UCHAR MacTabMatchWCID; - PVOID pAd; -#ifdef UAPSD_SUPPORT - BOOLEAN FlgIsWaitingUapsdTraRsp; /* 1: waiting for traffic rsp frame */ - UCHAR UapsdTraIndDelayCnt; /* used to send a detect traffic ind */ - BOOLEAN FlgIsUapsdTraRspRcv; /* if we have ever received rsp frame */ - UCHAR QosCapability; -#endif /* UAPSD_SUPPORT */ - - UCHAR HtCapabilityLen; - HT_CAPABILITY_IE HtCapability; - -} CFG_TDLS_ENTRY, *PCFG_TDLS_ENTRY; - -typedef struct _CFG_TDLS_CHSW_PARAM { - UCHAR cmd; - UCHAR offch_prim; - UCHAR offch_center; - UCHAR bw_off; - UCHAR role; - UINT16 stay_time; - UINT32 start_time_tsf; - UINT16 switch_time; - UINT16 switch_timeout; -} CFG_TDLS_CHSW_PARAM, *PCFG_TDLS_CHSW_PARAM; - -#define FT_MIC_LEN 16 -#define FT_NONCE_LEN 32 - -/* Information element ID defined in 802.11rD9.0 specification. */ -#define IE_FT_MDIE 54 -#define IE_FT_FTIE 55 -#define IE_FT_TIMEOUT_INTERVAL 56 -#define IE_FT_RIC_DATA 57 -#define IE_FT_RIC_DESCRIPTOR 75 - -/* RIC Type */ -#define FT_RIC_TYPE_BA 1 - -/* AKM SUITE */ -#define FT_AKM_SUITE_1X 3 -#define FT_AKM_SUITE_PSK 4 - -typedef union GNU_PACKED _FT_MIC_CTR_FIELD { - /* - IECnt: contains the number of IEs - that are included int eht MIC calculation. - */ - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT16 IECnt : 8; - UINT16 reserved : 8; -#else - UINT16 reserved : 8; - UINT16 IECnt : 8; -#endif - } field; - UINT16 word; -} FT_MIC_CTR_FIELD, *PFT_MIC_CTR_FIELD; - -/* -** FTIE: Fast Transition IE. -*/ -typedef struct GNU_PACKED _FT_FTIE { - FT_MIC_CTR_FIELD MICCtr; /* 2 Octects. */ - UINT8 MIC[FT_MIC_LEN]; /* 16 Octects. */ - UINT8 ANonce[FT_NONCE_LEN]; /* 32 Octects. */ - UINT8 SNonce[FT_NONCE_LEN]; /* 32 Octects. */ - UINT8 Option[0]; /* 1:R1KHID, 2:GTK, 3:ROKHId, else:Res */ -} FT_FTIE, *PFT_FTIE; - -enum tdls_operation { - TDLS_DISCOVERY_REQ, - TDLS_SETUP, - TDLS_TEARDOWN, - TDLS_ENABLE_LINK, - TDLS_DISABLE_LINK, -}; - -enum tdls_entry_op { tdls_insert_entry = 0, tdls_delete_entry }; -#endif /* CFG_TDLS_SUPPORT */ - -#endif /* RT_CFG80211_SUPPORT */ - -#endif /* __CFG80211CMM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211extr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211extr.h deleted file mode 100644 index ef9811ffb6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cfg80211extr.h +++ /dev/null @@ -1,393 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - All CFG80211 Function Prototype. - -***************************************************************************/ - -#ifndef __CFG80211EXTR_H__ -#define __CFG80211EXTR_H__ - -#ifdef RT_CFG80211_SUPPORT - -#define CFG80211CB (pAd->pCfg80211_CB) -#define RT_CFG80211_DEBUG /* debug use */ -#ifdef RT_CFG80211_DEBUG -#define CFG80211DBG(__Flg, __pMsg) \ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, __Flg, __pMsg) -#else -#define CFG80211DBG(__Flg, __pMsg) -#endif /* RT_CFG80211_DEBUG */ - -/* CFG_TODO */ -#include "wfa_p2p.h" - -#define RT_CFG80211_REGISTER(__pDev, __pNetDev) \ - CFG80211_Register(__pDev, __pNetDev); - -#define RT_CFG80211_BEACON_CR_PARSE(__pAd, __pVIE, __LenVIE) \ - CFG80211_BeaconCountryRegionParse((VOID *)__pAd, __pVIE, __LenVIE); - -#define RT_CFG80211_BEACON_TIM_UPDATE(__pAd) \ - CFG80211_UpdateBeacon((VOID *)__pAd, NULL, 0, NULL, 0, FALSE); - -#define RT_CFG80211_CRDA_REG_HINT(__pAd, __pCountryIe, __CountryIeLen) \ - CFG80211_RegHint((VOID *)__pAd, __pCountryIe, __CountryIeLen); - -#define RT_CFG80211_CRDA_REG_HINT11D(__pAd, __pCountryIe, __CountryIeLen) \ - CFG80211_RegHint11D((VOID *)__pAd, __pCountryIe, __CountryIeLen); - -#define RT_CFG80211_CRDA_REG_RULE_APPLY(__pAd) \ - CFG80211_RegRuleApply((VOID *)__pAd, NULL, \ - __pAd->cfg80211_ctrl.Cfg80211_Alpha2); - -#define RT_CFG80211_CONN_RESULT_INFORM(__pAd, __pBSSID, __pReqIe, __ReqIeLen, \ - __pRspIe, __RspIeLen, __FlgIsSuccess) \ - CFG80211_ConnectResultInform((VOID *)__pAd, __pBSSID, __pReqIe, \ - __ReqIeLen, __pRspIe, __RspIeLen, \ - __FlgIsSuccess); - -#define RT_CFG80211_SCANNING_INFORM(__pAd, __BssIdx, __ChanId, __pFrame, \ - __FrameLen, __RSSI) \ - CFG80211_Scaning((VOID *)__pAd, __BssIdx, __ChanId, __pFrame, \ - __FrameLen, __RSSI); - -#define RT_CFG80211_SCAN_END(__pAd, __FlgIsAborted) \ - CFG80211_ScanEnd((VOID *)__pAd, __FlgIsAborted); -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) -#define RT_CFG80211_LOST_AP_INFORM(__pAd) CFG80211_LostApInform((VOID *)__pAd); -#endif /*CONFIG_STA_SUPPORT || APCLI_CFG80211_SUPPORT */ -#define RT_CFG80211_REINIT(__pAd, __wdev) \ - CFG80211_SupBandReInit((VOID *)__pAd, (VOID *)__wdev); - -#define RT_CFG80211_RFKILL_STATUS_UPDATE(_pAd, _active) \ - CFG80211_RFKillStatusUpdate(_pAd, _active); - -#ifdef APCLI_CFG80211_SUPPORT -#define RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(__pAd, __pBSSID, __pReqIe, \ - __ReqIeLen, __pRspIe, \ - __RspIeLen, __FlgIsSuccess) \ - CFG80211_ApClientConnectResultInform(__pAd, __pBSSID, __pReqIe, \ - __ReqIeLen, __pRspIe, __RspIeLen, \ - __FlgIsSuccess); -#else -#define RT_CFG80211_P2P_CLI_CONN_RESULT_INFORM(__pAd, __pBSSID, __pReqIe, \ - __ReqIeLen, __pRspIe, \ - __RspIeLen, __FlgIsSuccess) \ - CFG80211_P2pClientConnectResultInform(__pAd, __pBSSID, __pReqIe, \ - __ReqIeLen, __pRspIe, \ - __RspIeLen, __FlgIsSuccess); -#endif /* APCLI_CFG80211_SUPPORT */ -#define RT_CFG80211_P2P_CLI_SEND_NULL_FRAME(_pAd, _PwrMgmt) \ - CFG80211_P2pClientSendNullFrame(_pAd, _PwrMgmt); - -#define RT_CFG80211_JOIN_IBSS(_pAd, _pBssid) CFG80211_JoinIBSS(_pAd, _pBssid); - -#define CFG80211_BANDINFO_FILL(__pAd, __wdev, __pBandInfo) \ - { \ - do { \ - (__pBandInfo)->RFICType = HcGetRadioRfIC(__pAd); \ - (__pBandInfo)->MpduDensity = \ - __pAd->CommonCfg.BACapability.field \ - .MpduDensity; \ - (__pBandInfo)->TxStream = \ - ((__wdev == NULL) || \ - (__wdev->wpf_op == NULL)) ? \ - 1 : \ - wlan_operate_get_tx_stream(__wdev); \ - (__pBandInfo)->RxStream = \ - ((__wdev == NULL) || \ - (__wdev->wpf_op == NULL)) ? \ - 1 : \ - wlan_operate_get_rx_stream(__wdev); \ - (__pBandInfo)->MaxTxPwr = 0; \ - if (WMODE_EQUAL(HcGetRadioPhyMode(__pAd), WMODE_B)) \ - (__pBandInfo)->FlgIsBMode = TRUE; \ - else \ - (__pBandInfo)->FlgIsBMode = FALSE; \ - (__pBandInfo)->MaxBssTable = MAX_LEN_OF_BSS_TABLE; \ - (__pBandInfo)->RtsThreshold = \ - (__wdev == NULL) ? \ - DEFAULT_RTS_LEN_THLD : \ - wlan_operate_get_rts_len_thld(__wdev); \ - (__pBandInfo)->FragmentThreshold = \ - (__wdev == NULL) ? \ - DEFAULT_FRAG_THLD : \ - wlan_operate_get_frag_thld(__wdev); \ - (__pBandInfo)->RetryMaxCnt = 0; \ - } while (0); \ - } - -/* NoA Command Parm */ -#define P2P_NOA_DISABLED 0x00 -#define P2P_NOA_TX_ON 0x01 -#define P2P_NOA_RX_ON 0x02 - -#define WLAN_AKM_SUITE_8021X 0x000FAC01 -#define WDEV_NOT_FOUND -1 - -/* Scan Releated */ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) -BOOLEAN CFG80211DRV_OpsScanRunning(VOID *pAdOrg); -#endif /*CONFIG_STA_SUPPORT || APCLI_CFG80211_SUPPORT*/ - -BOOLEAN CFG80211DRV_OpsScanSetSpecifyChannel(VOID *pAdOrg, VOID *pData, - UINT8 dataLen); - -BOOLEAN CFG80211DRV_OpsScanCheckStatus(VOID *pAdOrg, UINT8 IfType); - -BOOLEAN CFG80211DRV_OpsScanExtraIesSet(VOID *pAdOrg); - -VOID CFG80211DRV_OpsScanInLinkDownAction(VOID *pAdOrg); - -#ifdef APCLI_CFG80211_SUPPORT -VOID CFG80211DRV_ApcliSiteSurvey(VOID *pAdOrg, VOID *pData); - -VOID CFG80211DRV_SetApCliAssocIe(VOID *pAdOrg, VOID *pData, UINT ie_len); - -VOID CFG80211DRV_ApClientKeyAdd(VOID *pAdOrg, VOID *pData); - -#endif /* APCLI_CFG80211_SUPPORT */ - -#ifdef CONFIG_MULTI_CHANNEL -VOID CFG80211DRV_Set_NOA(VOID *pAdOrg, VOID *pData); -#endif /* CONFIG_MULTI_CHANNEL */ - -INT CFG80211DRV_OpsScanGetNextChannel(VOID *pAdOrg); - -VOID CFG80211_ScanStatusLockInit(VOID *pAdCB, UINT init); - -VOID CFG80211_Scaning(VOID *pAdCB, UINT32 BssIdx, UINT32 ChanId, UCHAR *pFrame, - UINT32 FrameLen, INT32 RSSI); - -VOID CFG80211_ScanEnd(VOID *pAdCB, BOOLEAN FlgIsAborted); - -/* Connect Releated */ -BOOLEAN CFG80211DRV_OpsJoinIbss(VOID *pAdOrg, VOID *pData); -BOOLEAN CFG80211DRV_OpsLeave(VOID *pAdOrg, PNET_DEV pNetDev); -BOOLEAN CFG80211DRV_Connect(VOID *pAdOrg, VOID *pData); -VOID CFG80211_P2pClientConnectResultInform(IN VOID *pAdCB, IN UCHAR *pBSSID, - IN UCHAR *pReqIe, IN UINT32 ReqIeLen, - IN UCHAR *pRspIe, IN UINT32 RspIeLen, - IN UCHAR FlgIsSuccess); - -#ifdef APCLI_CFG80211_SUPPORT -VOID CFG80211_ApClientConnectResultInform(IN VOID *pAdCB, IN UCHAR *pBSSID, - IN UCHAR *pReqIe, IN UINT32 ReqIeLen, - IN UCHAR *pRspIe, IN UINT32 RspIeLen, - IN UCHAR FlgIsSuccess); -#endif /* APCLI_CFG80211_SUPPORT */ - -VOID CFG80211_ConnectResultInform(VOID *pAdCB, UCHAR *pBSSID, UCHAR *pReqIe, - UINT32 ReqIeLen, UCHAR *pRspIe, - UINT32 RspIeLen, UCHAR FlgIsSuccess); -VOID CFG80211DRV_PmkidConfig(VOID *pAdOrg, VOID *pData); -VOID CFG80211_LostApInform(VOID *pAdCB); - -INT CFG80211_StaPortSecured(VOID *pAdCB, UCHAR *pMac, UINT flag); - -/* AP Related*/ -#ifdef HOSTAPD_MAP_SUPPORT /* This could be a generic fix*/ -INT CFG80211_ApStaDel(VOID *pAdCB, VOID *pData, UINT reason); -#else -INT CFG80211_ApStaDel(VOID *pAdCB, UCHAR *pMac, UINT reason); -#endif /* HOSTAPD_MAP_SUPPORT */ - -VOID CFG80211_UpdateBeacon(VOID *pAdOrg, UCHAR *beacon_head_buf, - UINT32 beacon_head_len, UCHAR *beacon_tail_buf, - UINT32 beacon_tail_len, BOOLEAN isAllUpdate, - UINT32 apidx); - -INT CFG80211_ApStaDelSendEvent(PRTMP_ADAPTER pAd, const PUCHAR mac_addr, - IN PNET_DEV pNetDevIn); -INT CFG80211_FindMbssApIdxByNetDevice(RTMP_ADAPTER *pAd, PNET_DEV pNetDev); - -/* Information Releated */ -BOOLEAN CFG80211DRV_StaGet(VOID *pAdOrg, VOID *pData); - -VOID CFG80211DRV_SurveyGet(VOID *pAdOrg, VOID *pData); - -INT CFG80211_reSetToDefault(VOID *pAdCB); - -/* Key Releated */ -BOOLEAN CFG80211DRV_StaKeyAdd(VOID *pAdOrg, VOID *pData); - -BOOLEAN CFG80211DRV_ApKeyAdd(VOID *pAdOrg, VOID *pData); - -VOID CFG80211DRV_RtsThresholdAdd(VOID *pAdOrg, struct wifi_dev *wdev, - UINT threshold); - -VOID CFG80211DRV_FragThresholdAdd(VOID *pAdOrg, struct wifi_dev *wdev, - UINT threshold); - -BOOLEAN CFG80211DRV_ApKeyDel(VOID *pAdOrg, VOID *pData); - -INT CFG80211_setApDefaultKey(IN VOID *pAdCB, IN struct net_device *pNetdev, - IN UINT Data); - -#ifdef DOT11W_PMF_SUPPORT -INT CFG80211_setApDefaultMgmtKey(IN VOID *pAdCB, IN struct net_device *pNetdev, - IN UINT Data); -#endif /*DOT11W_PMF_SUPPORT*/ - -INT CFG80211_setPowerMgmt(VOID *pAdCB, UINT Enable); - -/* General Releated */ -BOOLEAN CFG80211DRV_OpsSetChannel(RTMP_ADAPTER *pAd, VOID *pData); - -BOOLEAN CFG80211DRV_OpsChgVirtualInf(RTMP_ADAPTER *pAd, VOID *pData); - -VOID CFG80211DRV_OpsChangeBssParm(VOID *pAdOrg, VOID *pData); - -VOID CFG80211_UnRegister(VOID *pAdOrg, VOID *pNetDev); - -INT CFG80211DRV_IoctlHandle(VOID *pAdSrc, RTMP_IOCTL_INPUT_STRUCT *wrq, INT cmd, - USHORT subcmd, VOID *pData, ULONG Data); - -UCHAR CFG80211_getCenCh(RTMP_ADAPTER *pAd, UCHAR prim_ch); - -/* CRDA Releatd */ -VOID CFG80211DRV_RegNotify(VOID *pAdOrg, VOID *pData); - -VOID CFG80211_RegHint(VOID *pAdCB, UCHAR *pCountryIe, ULONG CountryIeLen); - -VOID CFG80211_RegHint11D(VOID *pAdCB, UCHAR *pCountryIe, ULONG CountryIeLen); - -VOID CFG80211_RegRuleApply(VOID *pAdCB, VOID *pWiphy, UCHAR *pAlpha2); - -BOOLEAN CFG80211_SupBandReInit(VOID *pAdCB, VOID *wdev); - -#ifdef RFKILL_HW_SUPPORT -VOID CFG80211_RFKillStatusUpdate(PVOID pAd, BOOLEAN active); -#endif /* RFKILL_HW_SUPPORT */ - -/* P2P Related */ -VOID CFG80211DRV_SetP2pCliAssocIe(VOID *pAdOrg, VOID *pData, UINT ie_len); - -VOID CFG80211DRV_P2pClientKeyAdd(VOID *pAdOrg, VOID *pData); - -BOOLEAN CFG80211DRV_P2pClientConnect(VOID *pAdOrg, VOID *pData); - -BOOLEAN CFG80211_checkScanTable(IN VOID *pAdCB); - -VOID CFG80211_P2pClientSendNullFrame(VOID *pAdCB, INT PwrMgmt); - -VOID CFG80211RemainOnChannelTimeout(PVOID SystemSpecific1, - PVOID FunctionContext, - PVOID SystemSpecific2, - PVOID SystemSpecific3); - -BOOLEAN CFG80211DRV_OpsRemainOnChannel(VOID *pAdOrg, VOID *pData, - UINT32 duration); - -BOOLEAN CFG80211DRV_OpsCancelRemainOnChannel(VOID *pAdOrg, UINT32 cookie); - -VOID CFG80211DRV_OpsMgmtFrameProbeRegister(VOID *pAdOrg, VOID *pData, - BOOLEAN isReg); - -VOID CFG80211DRV_OpsMgmtFrameActionRegister(VOID *pAdOrg, VOID *pData, - BOOLEAN isReg); - -BOOLEAN CFG80211_CheckActionFrameType(IN RTMP_ADAPTER *pAd, IN PUCHAR preStr, - IN PUCHAR pData, IN UINT32 length); - -BOOLEAN CFG80211_SyncPacketWmmIe(RTMP_ADAPTER *pAd, VOID *pData, ULONG dataLen); -BOOLEAN CFG80211_HandleP2pMgmtFrame(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - UCHAR OpMode); -INT CFG80211_SendMgmtFrame(RTMP_ADAPTER *pAd, VOID *pData, ULONG Data); - -/* -------------------------------- */ -/* VOID CFG80211_Convert802_3Packet(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR *pHeader802_3); */ -VOID CFG80211_Announce802_3Packet(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - UCHAR FromWhichBSSID); -VOID CFG80211_SendMgmtFrameDone(RTMP_ADAPTER *pAd, USHORT Sequence, - BOOLEAN ack); -#ifdef CONFIG_AP_SUPPORT -VOID CFG80211_ParseBeaconIE(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, - struct wifi_dev *wdev, UCHAR *wpa_ie, - UCHAR *rsn_ie); -#endif /*CONFIG_AP_SUPPORT*/ -VOID CFG80211_SwitchTxChannel(RTMP_ADAPTER *pAd, ULONG Data); - -BOOLEAN CFG80211DRV_OpsBeaconSet(VOID *pAdOrg, VOID *pData); - -BOOLEAN CFG80211DRV_OpsBeaconAdd(VOID *pAdOrg, VOID *pData); - -INT CFG80211_setStaDefaultKey(IN VOID *pAdCB, IN UINT Data); - -VOID CFG80211DRV_DisableApInterface(PRTMP_ADAPTER pAd); - -BOOLEAN CFG80211DRV_OpsVifAdd(VOID *pAdOrg, VOID *pData); - -#ifdef CFG_TDLS_SUPPORT -BOOLEAN CFG80211DRV_StaTdlsInsertDeletepEntry(VOID *pAdOrg, VOID *pData, - UINT Data); -BOOLEAN CFG80211DRV_StaTdlsSetKeyCopyFlag(VOID *pAdOrg); -BOOLEAN CFG80211_HandleTdlsDiscoverRespFrame(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - UCHAR OpMode); - -VOID cfg_tdls_send_PeerTrafficIndication(PRTMP_ADAPTER pAd, u8 *peer); -VOID cfg_tdls_rcv_PeerTrafficIndication(PRTMP_ADAPTER pAd, u8 dialog_token, - u8 *peer); -VOID cfg_tdls_rcv_PeerTrafficResponse(PRTMP_ADAPTER pAd, u8 *peer); -INT cfg_tdls_search_wcid(PRTMP_ADAPTER pAd, u8 *peer); -INT cfg_tdls_search_ValidLinkIndex(PRTMP_ADAPTER pAd, u8 *peer); -INT cfg_tdls_build_frame(PRTMP_ADAPTER pAd, u8 *peer, u8 dialog_token, - u8 action_code, u16 status_code, const u8 *extra_ies, - size_t extra_ies_len, BOOLEAN send_by_tdls_link, - u8 tdls_entry_wcid, u8 reason_code); -VOID cfg_tdls_UAPSDP_PsmModeChange(PRTMP_ADAPTER pAd, USHORT PsmOld, - USHORT PsmNew); -BOOLEAN cfg_tdls_UAPSDP_AsicCanSleep(PRTMP_ADAPTER pAd); -INT cfg_tdls_EntryInfo_Display_Proc(PRTMP_ADAPTER pAd, PUCHAR arg); -VOID cfg_tdls_TimerInit(PRTMP_ADAPTER pAd); -VOID cfg_tdls_PTITimeoutAction(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); -VOID cfg_tdls_BaseChannelTimeoutAction(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); -VOID cfg_tdls_rx_parsing(PRTMP_ADAPTER pAd, RX_BLK *pRxBlk); -INT cfg_tdls_chsw_req(PRTMP_ADAPTER pAd, u8 *peer, u8 target_channel, - u8 target_bw); -INT cfg_tdls_chsw_resp(PRTMP_ADAPTER pAd, u8 *peer, UINT32 ch_sw_time, - UINT32 ch_sw_timeout, u16 reason_code); -VOID cfg_tdls_prepare_null_frame(PRTMP_ADAPTER pAd, BOOLEAN powersave, - UCHAR dir, UCHAR *peerAddr); -VOID cfg_tdls_TunneledProbeRequest(PRTMP_ADAPTER pAd, PUCHAR pMacAddr, - const u8 *extra_ies, size_t extra_ies_len); -VOID cfg_tdls_TunneledProbeResponse(PRTMP_ADAPTER pAd, PUCHAR pMacAddr, - const u8 *extra_ies, size_t extra_ies_len); -VOID cfg_tdls_auto_teardown(PRTMP_ADAPTER pAd, PMAC_TABLE_ENTRY pEntry); -INT cfg_tdls_send_CH_SW_SETUP(RTMP_ADAPTER *ad, UCHAR cmd, UCHAR offch_prim, - UCHAR offch_center, UCHAR bw_off, UCHAR role, - UINT16 stay_time, UINT32 start_time_tsf, - UINT16 switch_time, UINT16 switch_timeout); - -#endif /*CFG_TDLS_SUPPORT*/ -#endif /* RT_CFG80211_SUPPORT */ - -VOID CFG80211_JoinIBSS(IN VOID *pAdCB, IN UCHAR *pBSSID); - -#ifdef MT_MAC -VOID CFG80211_InitTxSCallBack(RTMP_ADAPTER *pAd); -#endif /* MT_MAC */ - -#endif /* __CFG80211EXTR_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/chlist.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/chlist.h deleted file mode 100644 index 4c950cbb90..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/chlist.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - chlist.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __CHLIST_H__ -#define __CHLIST_H__ - -#include "rtmp_type.h" -#include "rtmp_def.h" - -#define CH_GROUP_BAND0 (1 << 0) -#define CH_GROUP_BAND1 (1 << 1) -#define CH_GROUP_BAND2 (1 << 2) -#define CH_GROUP_BAND3 (1 << 3) - -typedef struct _CH_GROUP_DESC { - UCHAR FirstChannel; - UCHAR NumOfCh; -} CH_GROUP_DESC, *PCH_GROUP_DESC; - -typedef struct _CH_DESC { - UCHAR FirstChannel; - UCHAR NumOfCh; - UCHAR ChannelProp; -} CH_DESC, *PCH_DESC; - -typedef struct _COUNTRY_REGION_CH_DESC { - UCHAR RegionIndex; - PCH_DESC pChDesc; -} COUNTRY_REGION_CH_DESC, *PCOUNTRY_REGION_CH_DESC; - -#define ODOR 0 -#define IDOR 1 -#define BOTH 2 - -typedef struct _CH_DESP { - UCHAR FirstChannel; - UCHAR NumOfCh; - CHAR MaxTxPwr; /* dBm */ - UCHAR Geography; /* 0:out door, 1:in door, 2:both */ - BOOLEAN DfsReq; /* Dfs require, 0: No, 1: yes. */ -} CH_DESP, *PCH_DESP; - -typedef struct _CH_REGION { - UCHAR CountReg[3]; - UCHAR op_class_region; /* 0: CE, 1: FCC, 2: JAP, 3:JAP_W53, JAP_W56 5:CHN*/ - BOOLEAN edcca_on; - CH_DESP *pChDesp; -} CH_REGION, *PCH_REGION; - -extern CH_REGION ChRegion[]; - -typedef struct _CH_FREQ_MAP_ { - UINT16 channel; - UINT16 freqKHz; -} CH_FREQ_MAP; - -extern CH_FREQ_MAP CH_HZ_ID_MAP[]; -extern int CH_HZ_ID_MAP_NUM; - -#define MAP_CHANNEL_ID_TO_KHZ(_ch, _khz) \ - RTMP_MapChannelID2KHZ(_ch, (UINT32 *)&(_khz)) -#define MAP_KHZ_TO_CHANNEL_ID(_khz, _ch) \ - RTMP_MapKHZ2ChannelID(_khz, (INT *)&(_ch)) - -/* Check if it is Japan W53(ch52,56,60,64) channel. */ -#define JapanChannelCheck(_ch) \ - ((_ch == 52) || (_ch == 56) || (_ch == 60) || (_ch == 64)) - -PCH_REGION GetChRegion(IN PUCHAR CountryCode); - -#ifdef EXT_BUILD_CHANNEL_LIST -VOID BuildChannelListEx(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev); - -VOID BuildBeaconChList(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - OUT PUCHAR pBuf, OUT PULONG pBufLen); -#endif /* EXT_BUILD_CHANNEL_LIST */ - -UCHAR GetCountryRegionFromCountryCode(UCHAR *country_code); - -#ifdef DOT11_N_SUPPORT -BOOLEAN ExtChCheck(PRTMP_ADAPTER pAd, UCHAR Channel, UCHAR Direction, - struct wifi_dev *wdev); -UCHAR N_SetCenCh(RTMP_ADAPTER *pAd, UCHAR channel, UCHAR ht_bw); -BOOLEAN N_ChannelGroupCheck(RTMP_ADAPTER *pAd, UCHAR channel, - struct wifi_dev *wdev); -VOID ht_ext_cha_adjust(struct _RTMP_ADAPTER *pAd, UCHAR prim_ch, UCHAR *ht_bw, - UCHAR *ext_cha, struct wifi_dev *wdev); - -#endif /* DOT11_N_SUPPORT */ - -UINT8 GetCuntryMaxTxPwr(IN PRTMP_ADAPTER pAd, IN UCHAR PhyMode, - IN struct wifi_dev *wdev, IN UCHAR ht_bw); - -VOID RTMP_MapChannelID2KHZ(IN UCHAR Ch, OUT UINT32 *pFreq); - -VOID RTMP_MapKHZ2ChannelID(IN ULONG Freq, OUT INT *pCh); - -UCHAR GetChannel_5GHZ(IN PCH_DESC pChDesc, IN UCHAR index); - -UCHAR GetChannel_2GHZ(IN PCH_DESC pChDesc, IN UCHAR index); - -UCHAR GetChannelFlag(IN PCH_DESC pChDesc, IN UCHAR index); - -UINT16 TotalChNum(IN PCH_DESC pChDesc); - -UCHAR get_channel_bw_cap(struct wifi_dev *wdev, UCHAR channel); - -INT32 ChannelFreqToGroup(IN UINT32 ChannelFreq); - -BOOLEAN MTChGrpValid(IN CHANNEL_CTRL *ChCtrl); - -void MTSetChGrp(RTMP_ADAPTER *pAd, RTMP_STRING *buf); - -BOOLEAN MTChGrpChannelChk(IN CHANNEL_CTRL *pChCtrl, IN UCHAR ch); -#endif /* __CHLIST_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/client_wds.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/client_wds.h deleted file mode 100644 index 55273b6a32..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/client_wds.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - client_wds.h - - Abstract: -*/ - -#ifndef __CLIENT_WDS_H__ -#define __CLIENT_WDS_H__ - -#include "client_wds_cmm.h" - -VOID CliWds_ProxyTabInit(IN PRTMP_ADAPTER pAd); - -VOID CliWds_ProxyTabDestory(IN PRTMP_ADAPTER pAd); - -PCLIWDS_PROXY_ENTRY CliWdsEntyAlloc(IN PRTMP_ADAPTER pAd); - -VOID CliWdsEntyFree(IN PRTMP_ADAPTER pAd, IN PCLIWDS_PROXY_ENTRY pCliWdsEntry); - -VOID CliWdsEnryFreeAid(IN PRTMP_ADAPTER pAd, IN SHORT Aid); - -UCHAR *CliWds_ProxyLookup(RTMP_ADAPTER *pAd, UCHAR *pMac); - -VOID CliWds_ProxyTabUpdate(IN PRTMP_ADAPTER pAd, IN SHORT Aid, IN PUCHAR pMac); - -VOID CliWds_ProxyTabMaintain(IN PRTMP_ADAPTER pAd); -#ifndef WDS_SUPPORT -MAC_TABLE_ENTRY *FindWdsEntry(IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk); - -MAC_TABLE_ENTRY *WdsTableLookupByWcid(IN PRTMP_ADAPTER pAd, IN UCHAR wcid, - IN PUCHAR pAddr, - IN BOOLEAN bResetIdelCount); - -MAC_TABLE_ENTRY *WdsTableLookup(RTMP_ADAPTER *pAd, UCHAR *addr, - BOOLEAN bResetIdelCount); -#endif -#endif /* __CLIENT_WDS_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/client_wds_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/client_wds_cmm.h deleted file mode 100644 index 427d2dc306..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/client_wds_cmm.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - client_wds_cmm.h - - Abstract: -*/ - -#ifndef __CLIENT_WDS_CMM_H__ -#define __CLIENT_WDS_CMM_H__ - -#include "rtmp_def.h" - -#ifdef CLIENT_WDS - -#ifdef MBSS_AS_WDS_AP_SUPPORT -#define CLI_WDS_ENTRY_AGEOUT 300000 /* 300 seconds */ -#else -#define CLI_WDS_ENTRY_AGEOUT 5000 /* seconds */ -#endif - -#define CLIWDS_POOL_SIZE 128 -#define CLIWDS_HASH_TAB_SIZE \ - 64 /* the legth of hash table must be power of 2. */ -typedef struct _CLIWDS_PROXY_ENTRY { - struct _CLIWDS_PROXY_ENTRY *pNext; - ULONG LastRefTime; - SHORT Aid; - UCHAR Addr[MAC_ADDR_LEN]; -} CLIWDS_PROXY_ENTRY, *PCLIWDS_PROXY_ENTRY; - -#endif /* CLIENT_WDS */ - -#endif /* __CLIENT_WDS_CMM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_cmd.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_cmd.h deleted file mode 100644 index 3e4466baa5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_cmd.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - hw_ctrl.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __CMM_CMD_H__ -#define __CMM_CMD_H__ - -#include "rtmp_type.h" -#include "security/wpa_cmm.h" - -#define MAX_LEN_OF_CMD_QUEUE 256 - -typedef struct _CmdQElmt { - UINT command; - PVOID buffer; - ULONG bufferlength; - BOOLEAN CmdFromNdis; - BOOLEAN SetOperation; -#ifdef DBG_STARVATION - struct starv_dbg starv; -#endif /*DBG_STARVATION*/ - struct _CmdQElmt *next; -} CmdQElmt, *PCmdQElmt; - -typedef struct _CmdQ { - UINT size; - CmdQElmt *head; - CmdQElmt *tail; - UINT32 CmdQState; -#ifdef DBG_STARVATION - struct starv_dbg_block block; -#endif /*DBG_STARVATION*/ -} CmdQ, *PCmdQ; - -#define EnqueueCmd(cmdq, cmdqelmt) \ - { \ - if (cmdq->size == 0) \ - cmdq->head = cmdqelmt; \ - else \ - cmdq->tail->next = cmdqelmt; \ - cmdq->tail = cmdqelmt; \ - cmdqelmt->next = NULL; \ - cmdq->size++; \ - } - -#define NDIS_OID UINT - -enum { - CMDTHREAD_FIRST_CMD_ID = 0, - /*STA related*/ - CMDTHREAD_SET_PSM_BIT = CMDTHREAD_FIRST_CMD_ID, - CMDTHREAD_QKERIODIC_EXECUT, - CMDTHREAD_SET_PORT_SECURED, - /*AP related*/ - CMDTHREAD_CHAN_RESCAN, - CMDTHREAD_802_11_COUNTER_MEASURE, - CMDTHREAD_AP_RESTART, - CMDTHREAD_APCLI_PBC_TIMEOUT, - CMDTHREAD_APCLI_IF_DOWN, - CMDTHREAD_WSC_APCLI_LINK_DOWN, - /*CFG 802.11*/ - CMDTHREAD_REG_HINT, - CMDTHREAD_REG_HINT_11D, - CMDTHREAD_SCAN_END, - CMDTHREAD_CONNECT_RESULT_INFORM, - /*P2P*/ - CMDTHREAD_SET_P2P_LINK_DOWN, - /*RT3593 related*/ - CMDTHREAD_UPDATE_TX_CHAIN_ADDRESS, - /*TDLS related*/ - CMDTHREAD_TDLS_SEND_CH_SW_SETUP, - CMDTHREAD_TDLS_AUTO_TEARDOWN, - CMDTHREAD_TDLS_RECV_NOTIFY, - /*Not usable*/ - CMDTHREAD_RESPONSE_EVENT_CALLBACK, - /*BT Coexistence related*/ - RT_CMD_COEXISTENCE_DETECTION, -#ifdef WIFI_SPECTRUM_SUPPORT - /* WIFI-SPECTRUM */ - CMDTHRED_WIFISPECTRUM_DUMP_RAW_DATA, -#endif /* WIFI_SPECTRUM_SUPPORT */ -#ifdef INTERNAL_CAPTURE_SUPPORT - /* INTERNAL CAPTURE */ - CMDTHRED_ICAP_DUMP_RAW_DATA, -#endif /* INTERNAL_CAPTURE_SUPPORT */ - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) - CMDTHRED_PRECAL_TXLPF, - CMDTHRED_PRECAL_TXIQ, - CMDTHRED_PRECAL_TXDC, - CMDTHRED_PRECAL_RXFI, - CMDTHRED_PRECAL_RXFD, -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - - CMDTHRED_DOT11H_SWITCH_CHANNEL, - CMDTREAD_AP_SWITCH_CHANNEL, - CMDTHRED_MAC_TABLE_DEL, -#ifdef MT_DFS_SUPPORT - CMDTHRED_DFS_CAC_TIMEOUT, - CMDTHRED_DFS_AP_RESTART, - CMDTHRED_DFS_RADAR_DETECTED_SW_CH, -#endif - CMDTHRED_STA_DEAUTH_ACT, - CMDTHRED_RXV_WRITE_IN_FILE, - CMDTHREAD_END_CMD_ID, -}; - -typedef struct _CMDHandler_TLV { - USHORT Offset; - USHORT Length; - UCHAR DataFirst; -} CMDHandler_TLV, *PCMDHandler_TLV; - -/*Tempral define before hwctrl ready*/ -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - -/* ----------------- MLME Related MACRO ----------------- */ -/* #define RTMP_MLME_PRE_SANITY_CHECK(pAd) */ - -#define RTMP_MLME_RESET_STATE_MACHINE(pAd, _wdev) \ - MlmeRestartStateMachine(pAd, _wdev) - -#define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry) \ - HandleCounterMeasure(_pAd, _pEntry) - -/* ----------------- Power Save Related MACRO ----------------- */ -#define RTMP_PS_POLL_ENQUEUE(pAd, pStaCfg) EnqueuePsPoll(pAd, pStaCfg) - -#else - -#define RTMP_MLME_RESET_STATE_MACHINE(pAd, _wdev) \ - do { \ - MlmeEnqueueWithWdev(pAd, MLME_CNTL_STATE_MACHINE, \ - MT2_RESET_CONF, 0, NULL, 0, _wdev); \ - RTMP_MLME_HANDLER(pAd); \ - } while (0) - -#define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry) \ - { \ - RTEnqueueInternalCmd(_pAd, CMDTHREAD_802_11_COUNTER_MEASURE, \ - _pEntry, sizeof(MAC_TABLE_ENTRY)); \ - RTMP_MLME_HANDLER(_pAd); \ - } - -#endif - -/*HIF related*/ - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_rvr_dbg.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_rvr_dbg.h deleted file mode 100644 index 51bf562e31..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_rvr_dbg.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_rvr_dbg.h -*/ - -#ifndef __CMM_RVR_DBG_H__ -#define __CMM_RVR_DBG_H__ - -#include "rt_config.h" - -#define VIEW_ERROR -1 -#define VIEW_BASICINFO 1 /*bit0*/ -#define VIEW_WCID 2 /*bit1*/ -#define VIEW_MACCOUNTER 4 /*bit2*/ -#define VIEW_PHYCOUNTER 8 /*bit3*/ -#define VIEW_NOISE 16 /*bit4*/ -#define VIEW_CNNUMBER 32 /*bit5*/ -#define VIEW_6 64 /*bit6*/ -#define VIEW_OTHERS 128 /*bit7*/ - -#define Case_ERROR -1 -#define Case_SHOW 0 -#define Case_SET 1 - -#define BF_MASK 0x0000FFFF -#define BF_OFSET 16 - -typedef struct _RvR_Debug_CTRL { - UINT8 ucViewLevel; - UINT8 ucWcid; - UINT8 ucCNcnt; - UINT32 uiiBFTxcnt; - UINT32 uieBFTxcnt; -} RvR_Debug_CTRL, *PRvR_Debug_CTRL; - -INT RTMPIoctlRvRDebug(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *pRDCmdStr); -VOID RTMPIoctlRvRDebug_Init(RTMP_ADAPTER *pAd); -INT rd_dashboard(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq); -/*rd sub-command */ -INT rd_view(RTMP_ADAPTER *pAd, RTMP_STRING *arg, RTMP_IOCTL_INPUT_STRUCT *wrq); -INT rd_view_plus(RTMP_ADAPTER *pAd, RTMP_STRING *arg, - RTMP_IOCTL_INPUT_STRUCT *wrq); -INT rd_view_minus(RTMP_ADAPTER *pAd, RTMP_STRING *arg, - RTMP_IOCTL_INPUT_STRUCT *wrq); -INT rd_wcid(RTMP_ADAPTER *pAd, RTMP_STRING *arg, RTMP_IOCTL_INPUT_STRUCT *wrq); -INT rd_reset(RTMP_ADAPTER *pAd, RTMP_STRING *arg, RTMP_IOCTL_INPUT_STRUCT *wrq); -INT rd_help(RTMP_ADAPTER *pAd, RTMP_STRING *arg, RTMP_IOCTL_INPUT_STRUCT *wrq); -/* print log */ -INT printBasicinfo(RTMP_ADAPTER *pAd, RTMP_STRING *msg); -VOID printView(RTMP_ADAPTER *pAd, RTMP_STRING *msg); -INT printWcid(RTMP_ADAPTER *pAd, RTMP_STRING *msg); -INT printMacCounter(RTMP_ADAPTER *pAd, RTMP_STRING *msg); -INT printPhyCounter(RTMP_ADAPTER *pAd, RTMP_STRING *msg); -INT printNoise(RTMP_ADAPTER *pAd, RTMP_STRING *msg); -INT printOthers(RTMP_ADAPTER *pAd, RTMP_STRING *msg); -INT printCNNum(RTMP_ADAPTER *pAd, RTMP_STRING *msg); -/*Update */ -INT updateBFTxCnt(RTMP_ADAPTER *pAd); -INT updateCNNum(RTMP_ADAPTER *pAd, BOOLEAN Is_Enable); -/*Set */ -INT setRXV2(RTMP_ADAPTER *pAd, BOOLEAN Is_Enable); -INT setCNNum(RTMP_ADAPTER *pAd, BOOLEAN Is_Enable); - -INT getViewLevelValue(RTMP_STRING *msg); -#endif /* __CMM_RVR_DBG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_tcprack.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_tcprack.h deleted file mode 100644 index 24fa1d4421..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cmm_tcprack.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2015, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - - Module Name: reduce_tcpack.h - - Abstract: - The corresponding defines and data structure for RACK (Reduce TCP ACK) - engine. - - Revision History: - Who When What - Hank Huang 2015/07/13 initial version - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __REDUCE_TCPACK_H__ -#define __REDUCE_TCPACK_H__ - -#define REDUCE_ACK_MAX_HASH_BUCKETS 2048 -#define MAX_REDUCE_ACK_CNX_ENTRY 256 /* 256 connections at max */ -#define MAX_CONSECUTIVE_DROP_CNT 5 -#define MAX_CONSECUTIVE_DATA_CNT 10 -#define MAX_SUPPORTED_ACK_RATIO 5 /* max ack ratio we supported */ -#define REDUCE_PROB_INC_TH 1 -#define REDUCE_PROB_INC_STEP 20 -#define REDUCE_ACK_CNX_POLLING_INTERVAL (10 * HZ) /* 10 seconds */ -#define REDUCE_ACK_POLLING_INTERVAL (20 * HZ / 1000) /* 20ms */ -#define REDUCE_ACK_TIMEOUT (250 * HZ / 1000) /* 250ms */ -#define REDUCE_ACK_CNX_TIMEOUT (180 * HZ) /* 180 seconds */ -#define REDUCE_ACK_FIN_CNX_TIMEOUT (10 * HZ) /* 10 seconds */ -#define REDUCE_ACK_ONE_PERCENT (0x80000000 / 100) -#define DEFAULT_REDUCE_PERCENT (REDUCE_ACK_ONE_PERCENT * 100) -#define REDUCE_ACK_IGNORE_CNT (126) -#define REDUCE_ACK_UINT32_MAX 4294967295U -#define REDUCE_ACK_PERCENTAGE(prob) \ - ({ \ - UINT32 i = 0, percentage = 0; \ - for (percentage = 0; percentage < 100; percentage++) { \ - if (i >= prob) { \ - break; \ - } else { \ - i += REDUCE_ACK_ONE_PERCENT; \ - } \ - } \ - percentage; \ - }) -/* 0813 */ -#define REDUCE_ACK_PKT_CACHE 0 - -enum { - TCP_ACK = 0, - TCP_DATA = 1, -}; - -enum { - STATE_INIT = 0, - STATE_SS = 1, - STATE_REDUCTION = 2, - STATE_CONGESTION = 3, - STATE_TERMINATION = 4, -}; - -enum { - REDUCE_ACK_DISABLE = 0, - REDUCE_ACK_ENALBE = 1, - REDUCE_ACK_ENABLE_WITOUT_DEL_CNX = 2, - REDUCE_ACK_ENABLE_NO_DROP_MODE = - 3, /* for testing only, check algorithm CPU cost */ - REDUCE_ACK_ENABLE_LAST = 3, -}; - -typedef struct _rack_packet { - UINT32 sip; - UINT32 dip; - UINT16 sport; - UINT16 dport; - UINT32 type; /* TCP_ACK or TCP_DATA */ - UINT32 ack; - UINT32 seq; - UINT32 wsize; - UINT16 opt_len; - UINT32 data_len; - UINT8 wscale; - UINT8 flags; - UINT16 mss; - ULONG timestamp; /* timestamp that incoming TCP packet is parsed */ - UINT32 opt_have_sack; -} rack_packet; - -/* Each rack_cnx may be linked to two tables: - 1. Hash table by (sip, dip, sport, dport): pAd->ackCnxHashTbl - 2. Link list for all connections for flushing purpose: pApd->ackCnxList - */ -typedef struct _rack_cnx { - /* - * Parameters which retrieved from TCP data/ack packets - */ - struct { - UINT32 sip; - UINT32 dip; - UINT16 sport; - UINT16 dport; - } tuple; /* 4-tuple */ - UINT32 ack; /* acknowledgement # of last ACK packet */ - UINT32 seq; /* sequence # of last DATA packet */ - UINT8 wscale; /* window scale (WS) parsed from TCP option of SYN packet */ - UINT32 wsize; /* window size inside last ACK packet (RWND) */ - UINT32 mss; /* Max Segment Size parsed from TCP option of SYN packet */ - - /* - * Parameters which derived from TCP header and connection tracking - */ - UINT32 ref_ack; /* reference ack# used to calcualte relative ack# */ - UINT32 rel_ack; /* relative ack# calculated from ref_ack */ - INT32 ss_countdown; /* The number of ack packets we should not reduce for slow start */ - UINT32 sent_ack; /* the last ack# we ever sent to air */ - UINT32 next_seq; /* {seq# of DATA packet} + {data length of DATA packet}, used to calculate BIF. */ - UINT32 ref_seq; /* reference seq# used to calculate relative seq# */ - UINT32 rel_seq; /* relative seq# */ - UINT8 state; /* Connection state, INIT/SS/REDUCTION/CONGESTION */ - ULONG last_tstamp; /* The timestamp of last incoming ACK which is declared as a reduction candidate */ - ULONG fin_tstamp; /* The timestamp of last received ACK with FIN flag. */ - - /* - * Statistics which is used for reduction decision - */ - UINT32 consecutive_data; /* consecutive TCP DATA count, reset while ACK received */ - UINT32 consecutive_ack; /* consecutive TCP ACK count, reset while data received */ - UINT32 consecutive_drop; /* consecutive TCP ACK which is dropped by us. */ - UINT32 bif; /* Bytes In Flight, calculated based on our connection tracking info */ - UINT32 pushack; /* the expected ack# of data segment with PSH flag */ - UINT32 wsize_changed; /* the flag to indicate window size changed */ - UINT32 avg_bif; /* the average of local max BIF */ - UINT32 max_bif; /* max. BIF we ever calculated */ - UINT32 ack_ratio; /* calculated ACK ratio before REDUCTION state */ - - /* - * Statistics which is used for debugging - */ - struct { - UINT32 dropped; /* total ACK packets dropped by us */ - UINT32 total; /* total ACK packets received by us */ - UINT32 total_data; /* total DATA packets received by us */ - UINT32 timeout; /* total ACK packets which are dropped but timeout */ - UINT32 retrans; /* total DATA packets which are detected as retransmission */ - UINT32 dupack; /* total duplicate ACKs detected by us */ - UINT32 rwnd_full; /* total number of times which we detect receive window full */ - UINT32 max_consecutive_data; /* the max number of consecutive DATA packets */ - UINT32 max_consecutive_ack; /* the max number of consecutive ACK packets */ - UINT32 pass_state; /* the number of ACK which is ignored reduction because state is not STATE_REDUCTION */ - UINT32 pass_con_drop; /* the number of ACK which is ignored reduction because exceed MAX_CONSECUTIVE_DROP_CNT */ - UINT32 pass_con_data; /* the number of ACK which is ignored reduction because exceed MAX_CONSECUTIVE_DATA_CNT */ - UINT32 pass_win_warning; /* the number of ACK which is ignored reduction because of receive window warnning */ - UINT32 pass_sack; /* the number of ACK which is ignored reduction because of SACK included */ - UINT32 pass_push_data; /* the number of ACK which is ignored reduction because of DATA with PSH flag */ - UINT32 pass_push_data3; - UINT32 pass_bif_warning; /* the number of ACK which is ignored reduction because of approaching avg_bif */ - UINT32 pass_ack_ratio; /* the number of ACK which is ignored reduction because of exceed MAX_ACK_RATIO */ - UINT32 pass_wsize_change; /* the number of ACK which is ignored reduction because of window size changed */ - UINT32 drop_prob; /* the number of ACK which is dropped because of consecutve ACKs */ - UINT32 data_jump; /* the number of DATA which seq# is not equal to next_seq */ - UINT32 oldack; /* the number of ACK which ack# is less than last ack# we ever received */ - UINT32 timeout_acks - [10]; /* the ack# which is timeout and flushed by RACK engine */ - } stats; - - /* - * MISC - */ -#if REDUCE_ACK_PKT_CACHE - struct { - PNDIS_PACKET raw_pkt; - rack_packet rack; - } cache; -#endif /* REDUCE_ACK_PKT_CACHE */ - - struct hlist_node hnode; - struct list_head list; -} rack_cnx; - -/* External APIs */ -BOOLEAN ReduceTcpAck(RTMP_ADAPTER *pAd, PNDIS_PACKET pPacket); -BOOLEAN ReduceAckUpdateDataCnx(RTMP_ADAPTER *pAd, PNDIS_PACKET pPacket); -VOID ReduceAckInit(RTMP_ADAPTER *pAd); -VOID ReduceAckExit(RTMP_ADAPTER *pAd); -VOID ReduceAckShow(RTMP_ADAPTER *pAd); -VOID ReduceAckSetEnable(RTMP_ADAPTER *pAd, UINT32 enable); -VOID ReduceAckSetProbability(RTMP_ADAPTER *pAd, UINT32 prob); - -#endif /* __REDUCE_TCPACK_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cs.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cs.h deleted file mode 100644 index e8bd36992f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cs.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef __CS_H__ -#define __CS_H__ - -#ifdef CARRIER_DETECTION_SUPPORT -#define CARRIER_DETECT_RECHECK_TIME 3 -#define CARRIER_GONE_TRESHOLD 10 /* Radar tone count in 1 sec */ -#define CARRIER_DETECT_THRESHOLD 0x0fffffff -#define CARRIER_DETECT_STOP_RATIO 2 -#define CARRIER_DETECT_STOP_RECHECK_TIME 4 -#define CARRIER_DETECT_DEFAULT_MASK 20 -#define CARRIER_DETECT_DELTA 7 -#define CARRIER_DETECT_DIV_FLAG 0 -#define CD_INT_POLLING_CMD 0x67 -#define CARRIER_DETECT_CRITIRIA_COMMON 7000 -#define CARRIER_DETECT_CRITIRIA_RBUS 280 -#if defined(RTMP_PCI_SUPPORT) && defined(RTMP_RBUS_SUPPORT) -#define CARRIER_DETECT_CRITIRIA(_pAd) \ - ((IS_RBUS_INF(_pAd)) ? CARRIER_DETECT_CRITIRIA_RBUS : \ - CARRIER_DETECT_CRITIRIA_COMMON) -#else -#ifdef RTMP_RBUS_SUPPORT -#define CARRIER_DETECT_CRITIRIA(_pAd) CARRIER_DETECT_CRITIRIA_RBUS -#else -#define CARRIER_DETECT_CRITIRIA(_pAd) CARRIER_DETECT_CRITIRIA_COMMON -#endif /* RTMP_RBUS_SUPPORT */ -#endif /* defined(RTMP_PCI_SUPPORT) && defined(RTMP_RBUS_SUPPORT) */ - -typedef enum CD_STATE_n { CD_NORMAL, CD_SILENCE, CD_MAX_STATE } CD_STATE; - -typedef enum _TONE_RADAR_VERSION { - DISABLE_TONE_RADAR = 0, - TONE_RADAR_V1, - TONE_RADAR_V2, - TONE_RADAR_V3 -} TONE_RADAR_VERSION; - -typedef struct CARRIER_DETECTION_s { - BOOLEAN Enable; - BOOLEAN bCsInit; - UINT8 CDSessionTime; - UINT8 CDPeriod; - CD_STATE CD_State; - UINT8 delta; - UINT8 SymRund; - UINT8 div_flag; - UINT32 threshold; - UINT8 recheck; - UINT8 recheck1; - UINT32 TimeStamp; /*unit:16us*/ - UINT32 criteria; - ULONG idle_time; - ULONG busy_time; - ULONG Debug; - ULONG OneSecIntCount; - UINT8 CarrierGoneThreshold; - UCHAR VGA_Mask; - UCHAR Packet_End_Mask; - UCHAR Rx_PE_Mask; -} CARRIER_DETECTION_STRUCT, *PCARRIER_DETECTION_STRUCT; - -INT isCarrierDetectExist(IN PRTMP_ADAPTER pAd); - -INT CarrierDetectReset(IN PRTMP_ADAPTER pAd); - -extern VOID RtmpOsMsDelay(IN ULONG msec); - -INT Set_CarrierCriteria_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CarrierReCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CarrierGoneThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CarrierStopCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CarrierDebug_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CarrierDelta_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CarrierDivFlag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CarrierThrd_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* v2 functions */ -INT Set_CarrierSymRund_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CarrierMask_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID CSInit(IN PRTMP_ADAPTER pAd); - -VOID CarrierDetectionStart(IN PRTMP_ADAPTER pAd); - -VOID RTMPHandleRadarInterrupt(IN PRTMP_ADAPTER pAd); - -VOID CarrierDetectionStop(IN PRTMP_ADAPTER pAd); - -VOID ToneRadarProgram_v1(IN PRTMP_ADAPTER pAd, IN ULONG threshold); - -VOID ToneRadarProgram_v2(IN PRTMP_ADAPTER pAd, IN ULONG threshold); - -VOID ToneRadarProgram_v3(IN PRTMP_ADAPTER pAd, IN ULONG threshold); - -VOID CarrierDetectionPeriodicStateCtrl(IN PRTMP_ADAPTER pAd); - -#ifdef CONFIG_AP_SUPPORT -INT Set_CarrierDetect_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*CONFIG_AP_SUPPORT*/ -#endif /* CARRIER_DETECTION_SUPPORT */ - -#endif /*__CS_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cut_through.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cut_through.h deleted file mode 100644 index 251cee13f4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/cut_through.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rtmp.h - - Abstract: - Miniport generic portion header file - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - -*/ - -#include "rtmp_type.h" -#include "rtmp_os.h" -#include "mac/mac_mt/dmac/mt_dmac.h" -#include "rtmp_timer.h" - -#ifndef ___CUT_THROUGH_H__ -#define ___CUT_THROUGH_H__ - -typedef enum _CT_MSDU_INFO_FLAG { - CT_INFO_APPLY_TXD = BIT(0), - HIF_PKT_FLAGS_COPY_HOST_TXD_ALL = BIT(1), - CT_INFO_MGN_FRAME = BIT(2), - CT_INFO_NONE_CIPHER_FRAME = BIT(3), - CT_INFO_HSR2_TX = BIT(4), -} CT_MSDU_INFO_FLAG; - -typedef struct GNU_PACKED _CR4_TXP_MSDU_INFO { -#define MAX_BUF_NUM_PER_PKT 6 - UINT16 type_and_flags; - UINT16 msdu_token; - UINT8 bss_index; - UINT8 rept_wds_wcid; /* if not rept/wds entry, leave to 0xff. 2015-June3 discussion. */ - UINT8 reserved; - UINT8 buf_num; - UINT32 buf_ptr[MAX_BUF_NUM_PER_PKT]; - UINT16 buf_len[MAX_BUF_NUM_PER_PKT]; -} CR4_TXP_MSDU_INFO; - -#define CUT_THROUGH_TYPE_TX 1 -#define CUT_THROUGH_TYPE_RX 2 -#define CUT_THROUGH_TYPE_BOTH (CUT_THROUGH_TYPE_TX | CUT_THROUGH_TYPE_RX) - -#define DEFAUT_PKT_TX_TOKEN_ID_MAX 4095 /* token ID in range of 0~4095 */ -#ifdef WHNAT_SUPPORT -#define DEFAUT_WHNAT_PKT_TX_TOKEN_ID_MAX \ - 1023 /* token ID in range of 0~2047 for SW path */ -#endif -#define CUT_THROUGH_TX_ENABL(_ptr) \ - ((((PKT_TOKEN_CB *)(_ptr))->cut_through_type & CUT_THROUGH_TYPE_TX) == \ - CUT_THROUGH_TYPE_TX) -#define CUT_THROUGH_RX_ENABL(_ptr) \ - ((((PKT_TOKEN_CB *)(_ptr))->cut_through_type & CUT_THROUGH_TYPE_RX) == \ - CUT_THROUGH_TYPE_RX) - -enum { - TOKEN_NONE, - TOKEN_TX_DATA, - TOKEN_TX_MGT, - TOKEN_RX, -}; - -typedef struct _PKT_TOKEN_ENTRY { - PNDIS_PACKET pkt_buf; - UINT32 rxDone; - UINT32 InOrder; - UINT32 Drop; - LONG startTime; - LONG endTime; -#ifdef EAP_STATS_SUPPORT - struct timeval startTimeTv; -#endif - NDIS_PHYSICAL_ADDRESS pkt_phy_addr; - size_t pkt_len; - UCHAR wcid; - UINT8 Type; -#ifdef CONFIG_HOTSPOT_R2 - BOOLEAN Reprocessed; -#endif /* CONFIG_HOTSPOT_R2 */ -} PKT_TOKEN_ENTRY ____cacheline_aligned; - -/* - queue operation behavior: - 1. If id_head != id_tail - has free token - 2. if id_head == id_tail - empty and no free token -*/ -typedef struct _PKT_TOKEN_LIST { - INT16 id_head; /* Index for first use-able token in free_id[] */ - INT16 id_tail; /* Index for first free_id[] to store recycled token */ - UINT16 *free_id; - PKT_TOKEN_ENTRY *pkt_token; - UINT32 FreeTokenCnt; - UINT32 TotalTxUsedTokenCnt; - UINT32 TotalTxBackTokenCnt; - UINT32 TotalTxTokenEventCnt; - UINT32 TotalTxTokenCnt; -#ifdef CUT_THROUGH_DBG - UINT32 UsedTokenCntRec[TIME_SLOT_NUMS]; - UINT32 UsedTokenCnt; - UINT32 BackTokenCntRec[TIME_SLOT_NUMS]; - UINT32 BackTokenCnt; - UINT32 DropPktCnt; - UINT32 DropPktCntRec[TIME_SLOT_NUMS]; - UINT32 FreeAgg0_31; - UINT32 FreeAgg0_31Rec[TIME_SLOT_NUMS]; - UINT32 FreeAgg32_63; - UINT32 FreeAgg32_63Rec[TIME_SLOT_NUMS]; - UINT32 FreeAgg64_95; - UINT32 FreeAgg64_95Rec[TIME_SLOT_NUMS]; - UINT32 FreeAgg96_127; - UINT32 FreeAgg96_127Rec[TIME_SLOT_NUMS]; -#endif -} PKT_TOKEN_LIST; - -typedef struct _PKT_TOKEN_QUEUE { - BOOLEAN token_inited; - PKT_TOKEN_LIST *list; - NDIS_SPIN_LOCK token_id_lock; -} PKT_TOKEN_QUEUE; - -enum { - NO_ENOUGH_FREE_TX_TOKEN = (1 << 0), - NO_ENOUGH_FREE_TX_RING = (1 << 1), -}; - -enum { - NO_ENOUGH_FREE_RX_TOKEN = (1 << 0), -}; - -enum { - TX_TOKEN_LOW, - TX_TOKEN_HIGH, -}; - -enum { - TX_TOKEN_HIGH_TO_HIGH, - TX_TOKEN_HIGH_TO_LOW, - TX_TOKEN_LOW_TO_LOW, - TX_TOKEN_LOW_TO_HIGH, - TX_TOKEN_UNKNOW_CHANGE, -}; - -typedef struct _PKT_TOKEN_CB { - INT cut_through_type; - VOID *pAd; - PKT_TOKEN_QUEUE tx_id_list; - NDIS_SPIN_LOCK rx_order_notify_lock; - PKT_TOKEN_QUEUE rx_id_list; - UINT32 TxTokenLowWaterMark; - UINT32 TxTokenHighWaterMark; - BOOLEAN tx_token_state; - UINT32 RxTokenLowWaterMark; - UINT32 RxTokenHighWaterMark; - UINT32 TxTokenFullCnt; -#ifdef CUT_THROUGH_DBG - RALINK_TIMER_STRUCT TokenHistoryTimer; - UINT8 TimeSlot; -#endif - UINT32 pkt_tx_tkid_max; - UINT32 pkt_tkid_invalid; - UINT32 pkt_tx_tkid_cnt; - UINT32 pkt_tx_tkid_aray; -} PKT_TOKEN_CB; - -typedef struct _TX_BLOCK_DEV { - DL_LIST list; - PNET_DEV NetDev; -} TX_BLOCK_DEV; - -PNDIS_PACKET cut_through_rx_deq(PKT_TOKEN_CB *pktTokenCb, UINT16 token, - UINT8 *Type); -UINT16 cut_through_rx_enq(PKT_TOKEN_CB *pktTokenCb, PNDIS_PACKET pkt, - UINT8 Type); -VOID cut_through_rx_pkt_assign(PKT_TOKEN_CB *pktTokenCb, UINT16 token, - PNDIS_PACKET pkt); -PNDIS_PACKET cut_through_tx_deq(PKT_TOKEN_CB *pktTokenCb, UINT16 token, - UINT8 *Type); -UINT16 cut_through_tx_enq(PKT_TOKEN_CB *pktTokenCb, PNDIS_PACKET pkt, - UCHAR type, UINT8 wcid, - NDIS_PHYSICAL_ADDRESS pkt_phy_addr, size_t pkt_len); -UINT cut_through_rx_in_order(PKT_TOKEN_CB *pktTokenCb, UINT16 token); -UINT cut_through_rx_drop(PKT_TOKEN_CB *pktTokenCb, UINT16 token); -UINT cut_through_rx_rxdone(PKT_TOKEN_CB *pktTokenCb, UINT16 token); -INT cut_through_rx_mark_token_info(PKT_TOKEN_CB *pktTokenCb, UINT16 token, - UINT8 drop); -INT cut_through_rx_mark_rxdone(PKT_TOKEN_CB *pktTokenCb, UINT16 token); -BOOLEAN cut_through_get_token_state(struct _RTMP_ADAPTER *pAd); -INT cut_through_set_token_state(struct _RTMP_ADAPTER *pAd, BOOLEAN state); -VOID cut_through_inc_token_full_cnt(struct _RTMP_ADAPTER *pAd); -UINT32 cut_through_check_token_state(struct _RTMP_ADAPTER *pAd); -LONG cut_through_inorder_time(PKT_TOKEN_CB *pktTokenCb, UINT16 token); -INT cut_through_deinit(PKT_TOKEN_CB **ppktTokenCb); -INT cut_through_init(VOID **ppktTokenCb, VOID *pAd); -INT cut_through_set_mode(PKT_TOKEN_CB *pktTokenCb, UINT mode); -INT cut_through_get_mode(PKT_TOKEN_CB *pktTokenCb); -VOID dump_ct_token_list(PKT_TOKEN_CB *tokenCb, INT type); - -#endif /* ___CUT_THROUGH_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11_base.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11_base.h deleted file mode 100644 index de4f7b5422..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11_base.h +++ /dev/null @@ -1,161 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - dot11_base.h - - Abstract: - Defined IE/frame structures of 802.11 base line - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- -*/ - -#ifndef _DOT11_BASE_H_ -#define _DOT11_BASE_H_ - -#include "rtmp_type.h" - -/* value domain of 802.11 header FC.Tyte, which is b3..b2 of the 1st-byte of MAC header */ -#define FC_TYPE_MGMT 0 -#define FC_TYPE_CNTL 1 -#define FC_TYPE_DATA 2 -#define FC_TYPE_RSVED 3 - -/* value domain of 802.11 MGMT frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header */ -#define SUBTYPE_ASSOC_REQ 0 -#define SUBTYPE_ASSOC_RSP 1 -#define SUBTYPE_REASSOC_REQ 2 -#define SUBTYPE_REASSOC_RSP 3 -#define SUBTYPE_PROBE_REQ 4 -#define SUBTYPE_PROBE_RSP 5 -#define SUBTYPE_TIMING_ADV 6 -#define SUBTYPE_BEACON 8 -#define SUBTYPE_ATIM 9 -#define SUBTYPE_DISASSOC 10 -#define SUBTYPE_AUTH 11 -#define SUBTYPE_DEAUTH 12 -#define SUBTYPE_ACTION 13 -#define SUBTYPE_ACTION_NO_ACK 14 - -/* value domain of 802.11 CNTL frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header */ -#define SUBTYPE_VHT_NDPA 5 -#define SUBTYPE_WRAPPER 7 -#define SUBTYPE_BLOCK_ACK_REQ 8 -#define SUBTYPE_BLOCK_ACK 9 -#define SUBTYPE_PS_POLL 10 -#define SUBTYPE_RTS 11 -#define SUBTYPE_CTS 12 -#define SUBTYPE_ACK 13 -#define SUBTYPE_CFEND 14 -#define SUBTYPE_CFEND_CFACK 15 -/* TODO: shiang-MT7615, remove this because SUBTYPE_XXX only used for SPEC defined!! */ -#define SUBTYPE_ALL 16 - -/* value domain of 802.11 DATA frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header */ -#define SUBTYPE_DATA 0 -#define SUBTYPE_DATA_CFACK 1 -#define SUBTYPE_DATA_CFPOLL 2 -#define SUBTYPE_DATA_CFACK_CFPOLL 3 -#define SUBTYPE_DATA_NULL 4 -#define SUBTYPE_CFACK 5 -#define SUBTYPE_CFPOLL 6 -#define SUBTYPE_CFACK_CFPOLL 7 -#define SUBTYPE_QDATA 8 -#define SUBTYPE_QDATA_CFACK 9 -#define SUBTYPE_QDATA_CFPOLL 10 -#define SUBTYPE_QDATA_CFACK_CFPOLL 11 -#define SUBTYPE_QOS_NULL 12 -#define SUBTYPE_QOS_CFACK 13 -#define SUBTYPE_QOS_CFPOLL 14 -#define SUBTYPE_QOS_CFACK_CFPOLL 15 - -/* 2-byte Frame control field */ -typedef struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT16 Order : 1; /* Strict order expected */ - UINT16 Wep : 1; /* Wep data */ - UINT16 MoreData : 1; /* More data bit */ - UINT16 PwrMgmt : 1; /* Power management bit */ - UINT16 Retry : 1; /* Retry status bit */ - UINT16 MoreFrag : 1; /* More fragment bit */ - UINT16 FrDs : 1; /* From DS indication */ - UINT16 ToDs : 1; /* To DS indication */ - UINT16 SubType : 4; /* MSDU subtype */ - UINT16 Type : 2; /* MSDU type */ - UINT16 Ver : 2; /* Protocol version */ -#else - UINT16 Ver : 2; /* Protocol version */ - UINT16 Type : 2; /* MSDU type, refer to FC_TYPE_XX */ - UINT16 SubType : 4; /* MSDU subtype, refer to SUBTYPE_XXX */ - UINT16 ToDs : 1; /* To DS indication */ - UINT16 FrDs : 1; /* From DS indication */ - UINT16 MoreFrag : 1; /* More fragment bit */ - UINT16 Retry : 1; /* Retry status bit */ - UINT16 PwrMgmt : 1; /* Power management bit */ - UINT16 MoreData : 1; /* More data bit */ - UINT16 Wep : 1; /* Wep data */ - UINT16 Order : 1; /* Strict order expected */ -#endif /* !RT_BIG_ENDIAN */ -} FRAME_CONTROL, *PFRAME_CONTROL; - -typedef struct GNU_PACKED _HEADER_802_11 { - FRAME_CONTROL FC; - UINT16 Duration; - UCHAR Addr1[6]; - UCHAR Addr2[6]; - UCHAR Addr3[6]; -#ifdef RT_BIG_ENDIAN - UINT16 Sequence : 12; - UINT16 Frag : 4; -#else - UINT16 Frag : 4; - UINT16 Sequence : 12; -#endif /* !RT_BIG_ENDIAN */ - UCHAR Octet[0]; -} HEADER_802_11, *PHEADER_802_11; - -typedef struct GNU_PACKED _HEADER_PS_POLL { - FRAME_CONTROL FC; - UINT16 AID; - UCHAR Addr1[6]; - UCHAR Addr2[6]; -} HEADER_PS_POLL; - -/* 7.3.1.3 Beacon Interval field */ -#define BEACON_INTERVAL_FIELD_LEN 2 -/* 7.3.1.4 Capability Information field */ -#define CAP_INFO_FIELD_LEN 2 -/* 7.3.1.10 Timestamp field */ -#define TIMESTAMP_FIELD_LEN 8 - -/* - just a default assume value, - if Bcn length has so many IEs, shall enlarge the value. -*/ -#define MAX_IE_LENGTH 600 - -#define SLOT_TIME_24G_LONG 20 /* 802.11b (DS), 802.11g (ERP), 802.11n */ -#define SLOT_TIME_24G_SHORT 9 /* 802.11g, 802.11n */ -#define SLOT_TIME_5G 9 /* 802.11a, 802.11n, 802.11ac */ - -#define SIFS_TIME_24G 10 -#define SIFS_TIME_5G 16 - -#define RIFS_TIME 2 /* 802.11n */ -#define EIFS_TIME 360 - -#endif /* _DOT11_BASE_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11ac_vht.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11ac_vht.h deleted file mode 100644 index 9fef8f62ee..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11ac_vht.h +++ /dev/null @@ -1,660 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - dot11ac_vht.h - - Abstract: - Defined IE/frame structures of 802.11ac (D1.2). - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - Shiang Tu 01-11-2012 created for 11ac - */ - -#ifdef DOT11_VHT_AC - -#ifndef __DOT11AC_VHT_H -#define __DOT11AC_VHT_H - -#include "rtmp_type.h" -#include "dot11_base.h" - -#define IE_VHT_CAP 191 -#define IE_VHT_OP 192 -#define IE_EXT_BSS_LOAD 193 -#define IE_WIDE_BW_CH_SWITCH 194 -#define IE_VHT_TXPWR_ENV 195 -#define IE_CH_SWITCH_WRAPPER 196 -#define IE_AID 197 -#define IE_QUIET_CHANNEL 198 - -#define BW_SIGNALING_DISABLE 0 -#define BW_SIGNALING_STATIC 1 -#define BW_SIGNALING_DYNAMIC 2 - -/* - IEEE 802.11AC D3.0 sec 8.4.1.50 - Operating Mode field - - ch_width: Channel width - -> 0: 20MHz - 1: 40MHz - 2: 80MHz - 3: 160 or 80+80MHz - Reserved if Rx Nss subfield is 1 - rx_nss: Rx Nss - If the Rx Nss Type subfield is 0, indicate the max number of SS STA can rx. - If the Rx Nss Type subfield is 1, indicate the max number of SS that the STA can receive as a - beamformee in a SU PPDU using a beamforming steering matrix derived from a VHT - compressed beamforming report with Feedback Type subfield indicating MU in the VHT - Compressed Beamforming frames - -> 0: Nss=1 - 1: Nss=2 - ... - 7: Nss=8 - - rx_nss_type: - -> 0: indicate the rx_nss subfield carries the max number of SS that the STA can receive - 1: indicate the rx_nss subfield carries the max number of SS that the STA can receive - as an SU PPDU using a beamforming steering matrix derived from a VHT compressed - Beamforming frame with the Feedback Type subfield indicating MU in the VHT compressed - Beamforming frames. -*/ -typedef struct GNU_PACKED _OPERATING_MODE { -#ifdef RT_BIG_ENDIAN - UCHAR rx_nss_type : 1; - UCHAR rx_nss : 3; - UCHAR rsv2 : 2; - UCHAR ch_width : 2; -#else - UCHAR ch_width : 2; - UCHAR rsv2 : 2; - UCHAR rx_nss : 3; - UCHAR rx_nss_type : 1; -#endif /* RT_BIG_ENDIAN */ -} OPERATING_MODE; - -/* - IEEE 802.11AC D3.0 sec 8.4.2.168 - Operating Mode Notification element - - Element ID: 199 (IE_OPERATING_MODE_NOTIFY) - Length: 1 -*/ -typedef struct GNU_PACKED _OPERATING_MODE_NOTIFICATION { - OPERATING_MODE operating_mode; -} OPERATING_MODE_NOTIFICATION; - -#define DOT11_VHT_MAX_MPDU_LEN_3895 0 -#define DOT11_VHT_MAX_MPDU_LEN_7991 1 -#define DOT11_VHT_MAX_MPDU_LEN_11454 2 - -/* - IEEE 802.11AC D2.0, sec 8.4.2.160.2 - VHT Capabilities Info field - - max_mpdu_len: MAximun MPDU Length - ->Indicate the max MPDU length. - 0: 3895 octets(Max A-MSDU length in HT Cap set to 3839) - 1: 7991 octets(Max A-MSDU length in HT Cap set to 7935) - 2: 11454 octets(Max A-MSDU length in HT Cap set to 7935) - 3: reserved - ->refer to "DOT11_VHT_MAX_MPDU_LEN_xxxx" - ch_width: Supported Channel Width Set - ->Indicates the channel widths supported by the STA. - 0: the STA does not support either 160 or 80+80 MHz - 1: the STA support 160 MHz - 2: the STA support 160 MHz and 80 + 80 MHz - 3: reserved - rx_ldpc: Rx LDPC - -> Indicates support of receiving LDPC coded packets - 0: not support - 1: support - sgi_80M: Short GI for 80 MHz - -> Indicates short GI support for the reception of VHT+CBW80 packet - 0: not support - 1: support - sgi_160M: Short GI for 160 and 80 + 80 MHz - ->Indicates rx short GI for VHT+(CBW160 and CBW80+80) packet - 0: not support - 1: support - tx_stbc: Tx STBC - -> Indicates support for tx of at least 2x1 STBC - 0: not support - 1: support - rx_stbc: Rx STBC - -> Indicates support for rx of PPDUs using STBC - 0: not support - 1: support 1SS - 2: support 1SS and 2SS - 3: support 1SS, 2SS and 3SS - 4: support 1SS, 2SS, 3SS and 4SS - 5,6,7: reserved - bfer_cap_su: SU Beamformer Capable - ->Indicates support for operation as a single user beamformer - 0: not support - 1: support - bfee_cap_su: SU Beamformee Capable - -> Indicates support for operation as a single user beamformee - 0: not support - 1: support - cmp_st_num_bfer: Compressed Steering Number of Beamformer Antenna Supported - -> Beamformee's capability indicateing the max number of beamformer - antennas the beamformee can support when sending compressed - beamforming feedback - If SU beamformee capable, set to the max value minus 1. - otehrwise, reserved. - num_snd_dimension: Number of Sounding Dimensions - -> Beamformer's capability indicating the number of antennas used for - beamformed transmissions. - If SU beamformer capable, set to value minus 1. - otehrwise, reserved. - bfer_cap_mu: MU Beamformer Capable - -> Indicates support for operation as an MU beamformer - 0: if not supported or if sent by a non-AP STA - 1: supported - bfee_cap_mu: MU Beamformee Capable - -> Indicates support for operation as an MU beamformer - 0: if not supported or if snet by an AP - 1: supported - vht_txop_ps: VHT TXOP PS - -> Indicates whether or not the AP supports VHT TXOP Power Save Mode or - whether or not the STA is in VHT TXOP Power Save Mode - ->When tx by a VHT AP in the VHT Capabilities element included in Beacon, - ProbeResp, AssocResp, and ReassocResp, frames: - 0: if the VHT AP does not support VHT TXOP PS in the BSS. - 1: if the VHT AP support TXOP PS in the BSS. - ->When tx by a VHT non-AP STA in the VHT Capabilities element included - in AssocReq, ReassocReq and ProbReq frames: - 0: if the VHT STA is not in TXOP Power Save Mode. - 1: if the VHT STA is in TXOP Power Save Mode. - htc_vht_cap: +HTC-VHT Capable - -> Indicates whether or not the STA supports receiving an HT Control - field in the VHT format - 0: if not support - 1: if support - max_ampdu_exp: Maximum A-MPDU Length Exponent - -> Indicates the maximum length of A-MPDU pre-EOF padding that the STA - can receive. - ->The length defined by this field is equal to 2^(13 + max_ampdu_exp) -1 - 0~7 : integer in the range of 0 to 7. - vht_link_adapt: VHT Link Adaptation Capable - -> Indicates whether or not the STA support link adaptation using VHT - variant HT Control field. - -> This field is ignored if the _HTC-VHT Capble field is set to 0. - 0: (No Feedback), if the STA does not provide VHT MFB - 2: (Unsolicited), if the STA provides only unsolicited VHT MFB - 3: (Both), if the STA can provide VHT MFB in response to VHT MRQ - and if the STA provides unsolicited VHT MFB. - 1: reserved - rx_ant_consistency: Rx Antenna Pattern Consistency - ->Indicates the possibility of Rx antenna pattern change - 0: if Rx antenna pattern might change during association - 1: if Rx antenna pattern does not change during association - tx_ant_consistency: Tx Antenna Pattern Consistency - ->Indicates the possibility of Tx antenna pattern change - 0: if Tx antenna pattern might change during association - 1: if Tx antenna pattern does not change during association -*/ -typedef struct GNU_PACKED _VHT_CAP_INFO { -#ifdef RT_BIG_ENDIAN - UINT32 rsv : 2; - UINT32 tx_ant_consistency : 1; - UINT32 rx_ant_consistency : 1; - UINT32 vht_link_adapt : 2; - UINT32 max_ampdu_exp : 3; - UINT32 htc_vht_cap : 1; - UINT32 vht_txop_ps : 1; - UINT32 bfee_cap_mu : 1; - UINT32 bfer_cap_mu : 1; - UINT32 num_snd_dimension : 3; - - UINT32 bfee_sts_cap : 3; - UINT32 bfee_cap_su : 1; - UINT32 bfer_cap_su : 1; - UINT32 rx_stbc : 3; - - UINT32 tx_stbc : 1; - UINT32 sgi_160M : 1; - UINT32 sgi_80M : 1; - UINT32 rx_ldpc : 1; - UINT32 ch_width : 2; - UINT32 max_mpdu_len : 2; -#else - UINT32 max_mpdu_len : 2; /* 0: 3895, 1: 7991, 2: 11454, 3: rsv */ - UINT32 ch_width : 2; /* */ - UINT32 rx_ldpc : 1; - UINT32 sgi_80M : 1; - UINT32 sgi_160M : 1; - UINT32 tx_stbc : 1; - - UINT32 rx_stbc : 3; - UINT32 bfer_cap_su : 1; - UINT32 bfee_cap_su : 1; - UINT32 bfee_sts_cap : 3; - - UINT32 num_snd_dimension : 3; - UINT32 bfer_cap_mu : 1; - UINT32 bfee_cap_mu : 1; - UINT32 vht_txop_ps : 1; - UINT32 htc_vht_cap : 1; - UINT32 max_ampdu_exp : 3; - UINT32 vht_link_adapt : 2; - UINT32 rx_ant_consistency : 1; - UINT32 tx_ant_consistency : 1; - UINT32 rsv : 2; -#endif /* RT_BIG_ENDIAN */ -} VHT_CAP_INFO; - -/* - IEEE 802.11AC D2.0, sec 8.4.2.160.3 - Rx MCS Map and Tx MCS map, figure 8-401bt - - mcs_ss1: Max MCS for 1SS - mcs_ss2: Max MCS for 2SS - mcs_ss3: Max MCS for 3SS - mcs_ss4: Max MCS for 4SS - mcs_ss5: Max MCS for 5SS - mcs_ss6: Max MCS for 6SS - mcs_ss7: Max MCS for 7SS - mcs_ss8: Max MCS for 8SS - - The 2-bit MAx MCS for n SS field for each number of spatial streams n = 1~8 - is encoded as following: - 0: indicates support for MCS 0~7 - 1: indicates support for MCS 0~8 - 2: indicates support for MCS 0~9 - 3: indicates that n spatial streams is not supported. - Note: some MCSs are not be valid for particular bandwidth and number of - spatial stream combinations. -*/ -#define VHT_MCS_CAP_7 0 -#define VHT_MCS_CAP_8 1 -#define VHT_MCS_CAP_9 2 -#define VHT_MCS_CAP_NA 3 - -typedef struct GNU_PACKED _VHT_MCS_MAP { -#ifdef RT_BIG_ENDIAN - UINT16 mcs_ss8 : 2; - UINT16 mcs_ss7 : 2; - UINT16 mcs_ss6 : 2; - UINT16 mcs_ss5 : 2; - UINT16 mcs_ss4 : 2; - UINT16 mcs_ss3 : 2; - UINT16 mcs_ss2 : 2; - UINT16 mcs_ss1 : 2; -#else - UINT16 mcs_ss1 : 2; - UINT16 mcs_ss2 : 2; - UINT16 mcs_ss3 : 2; - UINT16 mcs_ss4 : 2; - UINT16 mcs_ss5 : 2; - UINT16 mcs_ss6 : 2; - UINT16 mcs_ss7 : 2; - UINT16 mcs_ss8 : 2; -#endif /* RT_BIG_ENDIAN */ -} VHT_MCS_MAP; - -/* - IEEE 802.11AC D2.0, sec 8.4.2.160.3 - VHT Supported MCS Set field, figure 8-401bs - - rx_mcs_map: Rx MCS Map - -> Indicates the maximum MCS that can be received for each number of - spatial streams - See "VHT_MCS_MAP" - rx_high_rate: Rx Highest Supported Data Rate - -> Indicates the maximum data rate that the STA can receive - -> In unit of 1Mb/s where 1 represents 1Mb/s, and incrementing in steps - of 1 Mb/s. - -> If the maximum data rate expressed in Mb/s is not an integer, then - the value is rounded up to the next integer. - tx_mcs_map: Tx MCS Map - tx_high_rate: Tx Highest Supported Data Rate - -> Indicates the maximum data rate that the STA will transmit - -> In unit of 1Mb/s where 1 represents 1Mb/s, and incrementing in steps - of 1 Mb/s. - -> If the maximum data rate expressed in Mb/s is not an integer, then - the value is rounded up to the next integer. -*/ - -/* TODO: shiang-6590, check the layout of this data structure!!!! */ -typedef struct GNU_PACKED _VHT_MCS_SET { -#ifdef RT_BIG_ENDIAN - UINT16 rsv2 : 3; - UINT16 tx_high_rate : 13; - struct _VHT_MCS_MAP tx_mcs_map; - - UINT16 rsv : 3; - UINT16 rx_high_rate : 13; - struct _VHT_MCS_MAP rx_mcs_map; -#else - struct _VHT_MCS_MAP rx_mcs_map; - - UINT16 rx_high_rate : 13; - UINT16 rsv : 3; - struct _VHT_MCS_MAP tx_mcs_map; - - UINT16 tx_high_rate : 13; - UINT16 rsv2 : 3; -#endif /* RT_BIG_ENDIAN */ -} VHT_MCS_SET; - -/* - IEEE 802.11AC D2.0, sec 8.4.2.160.1 - VHT Capabilities Element structure - - eid: Element ID - 191 (IE_VHT_CAP) - len: Length - 12 - vht_cap: VHT Capabilities Info - ->contains a numner of fields that are used to advertise VHT capabilities - of a VHT STA - mcs_set: VHT supported MCS Set - ->Used to convey the combinations of MCSs and spatial streams a STA - supports for both reception and transmission. -*/ -typedef struct GNU_PACKED _VHT_CAP_IE { - VHT_CAP_INFO vht_cap; - VHT_MCS_SET mcs_set; -} VHT_CAP_IE; - -// -// Size of VHT capabilities IE, excluding element ID and length fields -// -#define SIZE_OF_VHT_CAP_IE (sizeof(VHT_CAP_IE)) - -/* - IEEE 802.11AC D2.0, sec 8.4.2.161 - VHT Operation Information field, figure 8-401bv - - The operation of VHT STAs in the BSS is controlled by the HT Operation - element and the VHT Operation element. - - ch_width: Channel Width - -> This field, together with the HT Operation element STA Channel Width - field, defines the BSS operating channel width. - 0: for 20MHz or 40MHz operating channel width - 1: for 80MHz operating channel width - 2: for 160MHz operating channel width - 3: for 80+80MHz operating channel width - 4~255: reserved - center_freq_1: Channel Center Frequency Segment 1 - -> Defines the channel center frequency for an 80 and 160MHz VHT BSS - and the segment 1 channel center frequency for an 80+90MHz VHT BSS. - -> For 80MHZ or 160MHz operating channel width, indicates the channel - center frequency index for the 80MHz or 160MHz channel on which the - VHT BSS operates. - ->For 80+80MHz operating channel width, indicates the channel center - frequency index for the 80MHz channel of frequency segment 1 on - which the VHT BSS operates. - ->Set 0 for 20MHz or 40MHz operating channel width. - - center_freq_2: Channel Center Frequency Segment 2 - -> Defines the seg 2 channel center frequency for an 80+80MHz VHT BSS - ->For a 80+80MHz operating channel width, indicates the channel center - frequency index of the 80MHz channel of frequency segment 2 on - which the VHT BSS operates. Reserved otherwise. -*/ -typedef struct GNU_PACKED _VHT_OP_INFO { - UINT8 ch_width; - UINT8 center_freq_1; - UINT8 center_freq_2; -} VHT_OP_INFO; - -/* - IEEE 802.11AC D2.0, sec 8.4.2.161 - VHT Operation element, figure 8-401bu - - The operation of VHT STAs in the BSS is controlled by the HT Operation - element and the VHT Operation element. - - eid: Element ID - 192 (IE_VHT_OP) - len: Length - 5 - vht_op_info: VHT Operation Information - basic_mcs_set: VHT Basic MCS Set -*/ -typedef struct GNU_PACKED _VHT_OP_IE { - VHT_OP_INFO vht_op_info; - VHT_MCS_MAP basic_mcs_set; -} VHT_OP_IE; - -/* - IEEE 802.11AC D2.0, sec 8.4.2.163 - Wide Bandwidth Channel Switch element, figure 8-401bx - - included in the Channel Switch Announcement frames. - - new_ch_width: New STA Channel Width - center_freq_1: New Channel Center Frequency Segment 1 - center_freq_2: New Channel Center Frequency Segment 2 - - The definition of upper subfields is the same as "VHT_OP_INFO" -*/ -typedef struct GNU_PACKED _WIDE_BW_CH_SWITCH_ELEMENT { - UINT8 new_ch_width; - UINT8 center_freq_1; - UINT8 center_freq_2; -} WIDE_BW_CH_SWITCH_ELEMENT; - -/* - IEEE 802.11AC D2.0, sec 8.4.2.164 - VHT Transmit Power Envelope element -*/ -typedef struct GNU_PACKED _CH_SEG_PAIR { - UINT8 ch_center_freq; - UINT8 seg_ch_width; -} CH_SEG_PAIR; - -/* - max_tx_pwr_cnt: - 0: Local Maximum Transmit Power For 20 MHz. - 1: Local Maximum Transmit Power For 20, 40MHz - 2: Local Maximum Transmit Power For 20, 40, 80MHz - 3: Local Maximum Transmit Power For 20, 40, 80, 160/80+80MHz - 4~7: rsv - - max_tx_pwr_interpretation: - 0: EIRP - 1~7: rsv -*/ -#define TX_PWR_INTERPRET_EIRP 0 -typedef struct GNU_PACKED _VHT_TX_PWR_INFO_ { -#ifdef RT_BIG_ENDIAN - UINT8 rsv6 : 2; - UINT8 max_tx_pwr_interpretation : 3; - UINT8 max_tx_pwr_cnt : 3; -#else - UINT8 max_tx_pwr_cnt : 3; - UINT8 max_tx_pwr_interpretation : 3; - UINT8 rsv6 : 2; -#endif -} VHT_TX_PWR_INFO; - -/* - IEEE 802.11AC D2.0, sec 8.4.2.164 - VHT Transmit Power Envelope element - - max_txpwr: Maximum Transmit Power - -> Define the maximum transmit power limit of the tx bandwidth defined - by the VHT Transmit Power Envelop element. The Maximum Transmit - Power field is a 8 bit 2's complement signed integer in the range of - -64 dBm to 63.5 dBm with a 0.5 dB step. - - NOTE: The following two subfields may repeated as needed. - center_freq_1: Channel Center Frequency Segment - ch_seg_width: Segment Channel Width -*/ -typedef struct GNU_PACKED _VHT_TXPWR_ENV_IE { - VHT_TX_PWR_INFO tx_pwr_info; - UINT8 tx_pwr_bw[4]; -} VHT_TXPWR_ENV_IE; - -typedef struct GNU_PACKED _VHT_CONTROL { -#ifdef RT_BIG_ENDIAN - UINT32 RDG : 1; - UINT32 ACConstraint : 1; - UINT32 unso_mfb : 1; - UINT32 fb_tx_type : 1; - UINT32 coding : 1; - UINT32 gid_h : 3; - UINT32 mfb_snr : 6; - UINT32 mfb_bw : 2; - UINT32 mfb_mcs : 4; - UINT32 mfb_n_sts : 3; - UINT32 mfsi_gidl : 3; - UINT32 stbc_ind : 1; - UINT32 comp_msi : 2; - UINT32 mrq : 1; - UINT32 rsv : 1; - UINT32 vht : 1; -#else - UINT32 vht : 1; - UINT32 rsv : 1; - UINT32 mrq : 1; - UINT32 comp_msi : 2; - UINT32 stbc_ind : 1; - UINT32 mfsi_gidl : 3; - UINT32 mfb_n_sts : 3; - UINT32 mfb_mcs : 4; - UINT32 mfb_bw : 2; - UINT32 mfb_snr : 6; - UINT32 gid_h : 3; - UINT32 coding : 1; - UINT32 fb_tx_type : 1; - UINT32 unso_mfb : 1; - UINT32 ACConstraint : 1; - UINT32 RDG : 1; -#endif -} VHT_CONTROL; - -/* - 802.11 AC Draft3.1 - Section 8.3.1.19, Figure 8-29j - - token_num: Sounding Dialog Token Number - Contains a value selected by the beamformer to identify the VHT NDP - Announcment frame. -*/ -typedef struct GNU_PACKED _SNDING_DIALOG_TOKEN { -#ifdef RT_BIG_ENDIAN - UINT8 token_num : 6; - UINT8 rsv : 2; -#else - UINT8 rsv : 2; - UINT8 token_num : 6; -#endif /* RT_BIG_ENDIAN */ -} SNDING_DIALOG_TOKEN; - -/* - 802.11 AC Draft3.1 - Section 8.3.1.19, Figure 8-29k - - aid12: AID12 - the 12 least significiant bits of the AID of a STA expected to - process the following VHT NDP and prepare the sounding - feedback. Equal to 0 if the STA is the AP, mesh STA or STA - that is a member of an IBSS - fb_type: Feedback Type - Indicates the type of feedback requested - 0: SU, 1: MU - nc_idx: Nc_Index - If the fb_type field indicates MU, then Nc Index indicates the - number of columns, Nc, in the compressed Beamforming - Feedback Matrix subfield minus one: - Set to 0 to request Nc=1, - Set to 1 to request Nc=2, - ... - Set to 7 to request Nc=8, - Reserved if the Feedback Type Field indicates SU. -*/ -typedef enum _SNDING_FB_TYPE { - SNDING_FB_SU = 0, - SNDING_FB_MU = 1, -} SNDING_FB_TYPE; - -typedef struct GNU_PACKED _SNDING_STA_INFO { -#ifdef RT_BIG_ENDIAN - UINT16 nc_idx : 3; - UINT16 fb_type : 1; - UINT16 aid12 : 12; -#else - UINT16 aid12 : 12; - UINT16 fb_type : 1; - UINT16 nc_idx : 3; -#endif /* RT_BIG_ENDIAN */ -} SNDING_STA_INFO; - -/* - 802.11 AC Draft3.1 - Section 8.3.1.19, Figure 8-29i - - VHT NDP Announcment frame format - - fc: Frame Control - - duration: Duration - - ra: RA - If the VHT NDPA frame contains only one STA Info field - => the RA field is set to the address of the STA - identified by the AID in the STA info field. - If the VHT NDPA frame contains more than one STA Info field, - => the RA field is set to the broadcast address. - ta: TA - The address of the STA transmitting the VHT NDPA frame. - - token: Sounding Dialog Token, refer to "SNDING_DIALOG_TOKEN" - - sta_info: STA Info 1, ..., STA Info n, refer to "SNDING_STA_INFO" - The VHT NDPA frame contains at least one STA Info field. - -*/ -typedef struct GNU_PACKED _VHT_NDPA_FRAME { - FRAME_CONTROL fc; - USHORT duration; - UCHAR ra[MAC_ADDR_LEN]; - UCHAR ta[MAC_ADDR_LEN]; - SNDING_DIALOG_TOKEN token; - SNDING_STA_INFO sta_info[0]; -} VHT_NDPA_FRAME; - -typedef struct GNU_PACKED _NDPA_PKT { - USHORT frm_ctrl; - USHORT duration; - UINT8 ra[MAC_ADDR_LEN]; - UINT8 ta[MAC_ADDR_LEN]; - UINT8 snd_seq; -} DNPA_PKT; - -typedef struct GNU_PACKED _PLCP_SERVICE_FIELD { -#ifdef RT_BIG_ENDIAN - UINT8 rsv7 : 1; - UINT8 cbw_in_non_ht : 2; - UINT8 dyn_bw : 1; - UINT8 rsv03 : 4; -#else - UINT8 rsv03 : 4; - UINT8 dyn_bw : 1; - UINT8 cbw_in_non_ht : 2; - UINT8 rsv7 : 1; -#endif /* RT_BIG_ENDIAN */ -} PLCP_SERVICE_FIELD; - -#endif /* __DOT11AC_VHT_H */ - -#endif /* DOT11_VHT_AC */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11k_rrm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11k_rrm.h deleted file mode 100644 index bc14051e67..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11k_rrm.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Abstract: - -***************************************************************************/ - -#ifndef __DOT11K_RRM_H -#define __DOT11K_RRM_H - -#ifdef DOT11K_RRM_SUPPORT -#include "rtmp_type.h" - -#define RRM_CAP_BIT (1 << 12) /* Bit 12 in Capability information field. */ - -#define RRM_PHY_FHSS 1 -#define RRM_PHY_DSSS 2 -#define RRM_PHY_IRBASEBAND 3 -#define RRM_PHY_OFDM 4 -#define RRM_PHY_HRDSSS 5 -#define RRM_PHY_ERP 6 -#define RRM_PHY_HT 7 - -#define IE_RRM_NEIGHBOR_REP 52 -#define IE_BSS_AVAILABLE_AC 67 -#define IE_BSS_AC_DELAY 68 /* Bss Ac Access Dealy Element, Same as WAPI IE. */ -#define IE_RRM_EN_CAP 70 /* 802.11k. RRM Enable Capability element. */ - -#define RRM_MEASURE_REQ 0 -#define RRM_MEASURE_REP 1 -#define RRM_LNK_MEASURE_REQ 2 -#define RRM_LNK_MEASURE_RSP 3 -#define RRM_NEIGHTBOR_REQ 4 -#define RRM_NEIGHTBOR_RSP 5 - -#define RRM_MEASURE_SUBTYPE_BASIC 0 -#define RRM_MEASURE_SUBTYPE_CCA 1 -#define RRM_MEASURE_SUBTYPE_RPI_HISTOGRAM 2 -#define RRM_MEASURE_SUBTYPE_CH_LOAD 3 -#define RRM_MEASURE_SUBTYPE_NOISE_HISTOGRAM 4 -#define RRM_MEASURE_SUBTYPE_BEACON 5 -#define RRM_MEASURE_SUBTYPE_LCI 8 /*location add*/ -#define RRM_MEASURE_SUBTYPE_TX_STREAM 9 -#define RRM_MEASURE_SUBTYPE_LOCATION_CIVIC 11 /*location add*/ -#define RRM_MEASURE_SUBTYPE_LOCATION_ID 12 /*location add*/ - -#define RRM_NEIGHBOR_REQ_SSID_SUB_ID 0 -#define RRM_NEIGHBOR_REQ_VENDOR_SUB_ID 221 -#define RRM_NEIGHBOR_REQ_MEASUREMENT_REQUEST_SUB_ID 38 /*location add*/ - -#define RRM_NEIGHBOR_REP_TSF_INFO_SUB_ID 1 -#define RRM_NEIGHBOR_REP_COUNTRY_STRING_SUB_ID 2 -#define RRM_NEIGHBOR_REP_MEASUREMENT_REPORT_SUB_ID 39 /*location add*/ -#define RRM_NEIGHBOR_REP_MEASURE_PILOT_TX_SUB_ID 66 -#define RRM_ENABLE_CAPABILTY_SUB_ID 70 -#define RRM_MULTIPLE_BSSID_SUB_ID 71 -#define RRM_VENDOR_SUB_ID 221 - -#define RRM_BCN_REQ_MODE_PASSIVE 0 -#define RRM_BCN_REQ_MODE_ACTIVE 1 -#define RRM_BCN_REQ_MODE_BCNTAB 2 - -#define RRM_BCN_REQ_SUBID_SSID 0 -#define RRM_BCN_REQ_SUBID_BCN_REP_INFO 1 -#define RRM_BCN_REQ_SUBID_RET_DETAIL 2 -#define RRM_BCN_REQ_SUBID_REQUEST 10 -#define RRM_BCN_REQ_SUBID_AP_CH_REP 51 -#define RRM_BCN_REQ_SUBID_VENDOR 221 - -#define RRM_BCN_REP_SUBID_REPORT_FRAME_BODY 1 -#define RRM_BCN_REP_SUBID_VENDOR 221 - -#define RRM_TX_STREAM_SUBID_TRIGGER_REPORT 1 -#define RRM_TX_STREAM_SUBID_VENDOR 221 - -typedef struct GNU_PACKED _RRM_SUBFRAME_INFO { - UINT8 SubId; - UINT8 Length; - UINT8 Oct[0]; -} RRM_SUBFRAME_INFO, *PRRM_SUBFRAME_INFO; - -typedef struct GNU_PACKED _RRM_BEACON_REQ_INFO { - UINT8 RegulatoryClass; - UINT8 ChNumber; - UINT16 RandomInterval; - UINT16 MeasureDuration; - UINT8 MeasureMode; - UINT8 Bssid[MAC_ADDR_LEN]; - UINT8 Option[0]; -} RRM_BEACON_REQ_INFO, *PRRM_BEACON_REQ_INFO; - -typedef union GNU_PACKED _RRM_BEACON_REP_INFO_FIELD { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT8 ReportFrameType : 1; - UINT8 CondensePhyType : 7; -#else - UINT8 CondensePhyType : 7; - UINT8 ReportFrameType : 1; -#endif - } field; - UINT8 word; -} RRM_BEACON_REP_INFO_FIELD, *PRRM_BEACON_REP_INFO_FIELD; - -typedef struct GNU_PACKED _RRM_BEACON_REP_INFO { - UINT8 RegulatoryClass; - UINT8 ChNumber; - UINT64 ActualMeasureStartTime; - UINT16 MeasureDuration; - UINT8 RepFrameInfo; - UINT8 RCPI; - UINT8 RSNI; - UINT8 Bssid[MAC_ADDR_LEN]; - UINT8 AnntaId; - UINT32 ParentTSF; - UINT8 Option[0]; -} RRM_BEACON_REP_INFO, *PRRM_BEACON_REP_INFO; -#ifndef WAPP_SUPPORT -typedef union GNU_PACKED _RRM_BSSID_INFO { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT32 Reserved : 18; - UINT32 FTM : 1; - UINT32 VHT : 1; - UINT32 HT : 1; - UINT32 MobilityDomain : 1; - UINT32 ImmediateBA : 1; - UINT32 DelayBlockAck : 1; - UINT32 RRM : 1; - UINT32 APSD : 1; - UINT32 Qos : 1; - UINT32 SpectrumMng : 1; - UINT32 KeyScope : 1; - UINT32 Security : 1; - UINT32 APReachAble : 2; -#else - UINT32 APReachAble : 2; - UINT32 Security : 1; - UINT32 KeyScope : 1; - UINT32 SpectrumMng : 1; - UINT32 Qos : 1; - UINT32 APSD : 1; - UINT32 RRM : 1; - UINT32 DelayBlockAck : 1; - UINT32 ImmediateBA : 1; - UINT32 MobilityDomain : 1; - UINT32 HT : 1; - UINT32 VHT : 1; - UINT32 FTM : 1; - UINT32 Reserved : 18; -#endif - } field; - UINT32 word; -} RRM_BSSID_INFO, *PRRM_BSSID_INFO; -#endif -typedef struct GNU_PACKED _RRM_NEIGHBOR_REP_INFO { - UINT8 Bssid[MAC_ADDR_LEN]; - UINT32 BssidInfo; - UINT8 RegulatoryClass; - UINT8 ChNum; - UINT8 PhyType; - UINT8 Oct[0]; -} RRM_NEIGHBOR_REP_INFO, *RRM_PNEIGHBOR_REP_INFO; - -typedef union GNU_PACKED __RRM_EN_CAP_IE { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT64 Reserved : 28; - UINT64 CIVICMeasureCap : 1; - UINT64 FTMRangeReportCapability : 1; - UINT64 AntennaInfoCap : 1; - UINT64 BssAvaiableAcmCap : 1; - UINT64 BssAvgAccessDelayCap : 1; - UINT64 RSNIMeasureCap : 1; - UINT64 RCPIMeasureCap : 1; - UINT64 NeighReportTSFOffsetCap : 1; - UINT64 MeasurePilotTxInfoCap : 1; - UINT64 MeasurePilotCap : 3; - UINT64 NotOperatingChMaxMeasureDuration : 3; - /*UINT64 RRMMibCap:1; */ - UINT64 OperatingChMaxMeasureDuration : 3; - UINT64 RRMMibCap : 1; - UINT64 APChannelReportCap : 1; - UINT64 TriggeredTransmitStreamCap : 1; - UINT64 TransmitStreamCap : 1; - UINT64 LCIAzimuthCap : 1; - UINT64 LCIMeasureCap : 1; - UINT64 StatisticMeasureCap : 1; - UINT64 NoiseHistogramMeasureCap : 1; - UINT64 ChannelLoadMeasureCap : 1; - UINT64 FrameMeasureCap : 1; - UINT64 BeaconMeasureReportCndCap : 1; - UINT64 BeaconTabMeasureCap : 1; - UINT64 BeaconActiveMeasureCap : 1; - UINT64 BeaconPassiveMeasureCap : 1; - UINT64 RepeatMeasureCap : 1; - UINT64 ParallelMeasureCap : 1; - UINT64 NeighborRepCap : 1; - UINT64 LinkMeasureCap : 1; -#else - UINT64 LinkMeasureCap : 1; - UINT64 NeighborRepCap : 1; - UINT64 ParallelMeasureCap : 1; - UINT64 RepeatMeasureCap : 1; - UINT64 BeaconPassiveMeasureCap : 1; - UINT64 BeaconActiveMeasureCap : 1; - UINT64 BeaconTabMeasureCap : 1; - UINT64 BeaconMeasureReportCndCap : 1; - UINT64 FrameMeasureCap : 1; - UINT64 ChannelLoadMeasureCap : 1; - UINT64 NoiseHistogramMeasureCap : 1; - UINT64 StatisticMeasureCap : 1; - UINT64 LCIMeasureCap : 1; - UINT64 LCIAzimuthCap : 1; - UINT64 TransmitStreamCap : 1; - UINT64 TriggeredTransmitStreamCap : 1; - UINT64 APChannelReportCap : 1; - UINT64 RRMMibCap : 1; - UINT64 OperatingChMaxMeasureDuration : 3; - UINT64 NotOperatingChMaxMeasureDuration : 3; - UINT64 MeasurePilotCap : 3; - UINT64 MeasurePilotTxInfoCap : 1; - UINT64 NeighReportTSFOffsetCap : 1; - UINT64 RCPIMeasureCap : 1; - UINT64 RSNIMeasureCap : 1; - UINT64 BssAvgAccessDelayCap : 1; - UINT64 BssAvaiableAcmCap : 1; - UINT64 AntennaInfoCap : 1; - UINT64 FTMRangeReportCapability : 1; - UINT64 CIVICMeasureCap : 1; - UINT64 Reserved : 28; -#endif - } field; - UINT64 word; -} RRM_EN_CAP_IE, *PRRM_EN_CAP_IE; - -typedef union GNU_PACKED _RRM_BSS_AVAILABLE_AC_BITMAP { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT16 Reserved : 4; - UINT16 AC3 : 1; - UINT16 AC2 : 1; - UINT16 AC1 : 1; - UINT16 AC0 : 1; - UINT16 UP7 : 1; - UINT16 UP6 : 1; - UINT16 UP5 : 1; - UINT16 UP4 : 1; - UINT16 UP3 : 1; - UINT16 UP2 : 1; - UINT16 UP1 : 1; - UINT16 UP0 : 1; -#else - UINT16 UP0 : 1; - UINT16 UP1 : 1; - UINT16 UP2 : 1; - UINT16 UP3 : 1; - UINT16 UP4 : 1; - UINT16 UP5 : 1; - UINT16 UP6 : 1; - UINT16 UP7 : 1; - UINT16 AC0 : 1; - UINT16 AC1 : 1; - UINT16 AC2 : 1; - UINT16 AC3 : 1; - UINT16 Reserved : 4; -#endif - } field; - UINT16 word; -} RRM_BSS_AVAILABLE_AC_BITMAP, *PRRM_BSS_AVAILABLE_AC_BITMAP; - -typedef struct GNU_PACKED _RRM_BSS_AVAILABLE_AC_INFO { - UINT16 AvailableAcBitMap; - UINT8 Oct[0]; -} RRM_BSS_AVAILABLE_AC_INFO, *PRRM_BSS_AVAILABLE_AC_INFO; - -typedef struct GNU_PACKED _RRM_BSS_AC_DELAY_INFO { - UINT8 BE_ACDelay; - UINT8 BK_ACDelay; - UINT8 VI_ACDelay; - UINT8 VO_ACDelay; -} RRM_BSS_AC_DELAY_INFO, *PRRM_BSS_AC_DELAY_INFO; - -typedef union GNU_PACKED _RRM_TRANSMIT_MEASURE_TRIGGER_CONDITION { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT8 Reserved : 5; - UINT8 Delay : 1; - UINT8 Consecutive : 1; - UINT8 Average : 1; -#else - UINT8 Average : 1; - UINT8 Consecutive : 1; - UINT8 Delay : 1; - UINT8 Reserved : 5; -#endif - } field; - UINT8 word; -} RRM_TRANSMIT_MEASURE_TRIGGER_CONDITION, - *PRRM_TRANSMIT_MEASURE_TRIGGER_CONDITION; - -typedef struct GNU_PACKED _RRM_TRANSMIT_MEASURE_DELAY_THRESHOLD { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT8 DealyMsduCnt : 6; - UINT8 DealyMsduRange : 2; -#else - UINT8 DealyMsduRange : 2; - UINT8 DealyMsduCnt : 6; -#endif - } field; - UINT8 word; -} RRM_TRANSMIT_MEASURE_DELAY_THRESHOLD, *PRRM_TRANSMIT_MEASURE_DELAY_THRESHOLD; - -typedef struct GNU_PACKED _RRM_TRANSMIT_MEASURE_TRIGGER_REPORT { - UINT8 TriggerCondition; - UINT8 AvrErrorThreshold; - UINT8 ConsecutiveErrorThreshold; - UINT8 DelayThreshold; - UINT8 MeasurementCnt; - UINT8 TriggerTimeout; -} RRM_TRANSMIT_MEASURE_TRIGGER_REPORT, *PRRM_TRANSMIT_MEASURE_TRIGGER_REPORT; - -typedef struct GNU_PACKED _RRM_TID { -} RRM_TID, *PRRM_TID; - -typedef struct GNU_PACKED _RRM_TRANSMIT_MEASURE_INFO { - UINT16 RandomInterval; - UINT16 MeasureDuration; - UINT8 PeerStaMac[MAC_ADDR_LEN]; - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT8 TID : 4; - UINT8 Rev : 4; -#else - UINT8 Rev : 4; - UINT8 TID : 4; -#endif - } TIDField; - UINT8 Bin0Range; - UINT8 Oct[0]; -} RRM_TRANSMIT_MEASURE_INFO, *PRRM_TRANSMIT_MEASURE_INFO; - -#endif /* DOT11K_RRM_SUPPORT */ - -#endif /* __DOT11K_RRM_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11n_ht.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11n_ht.h deleted file mode 100644 index 12c38dc8e0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11n_ht.h +++ /dev/null @@ -1,347 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - dot11n_ht.h - - Abstract: - Defined IE/frame structures of 802.11n - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- -*/ - -#ifdef DOT11_N_SUPPORT - -#ifndef _DOT11N_HT_H_ -#define _DOT11N_HT_H_ - -#include "rtmp_type.h" -#include "dot11_base.h" - -/* HT Capability INFO field in HT Cap IE . */ -typedef struct GNU_PACKED _HT_CAP_INFO { -#ifdef RT_BIG_ENDIAN - UINT16 LSIGTxopProSup : 1; - UINT16 Forty_Mhz_Intolerant : 1; - UINT16 PSMP : 1; - UINT16 CCKmodein40 : 1; - UINT16 AMsduSize : 1; - UINT16 DelayedBA : 1; - UINT16 RxSTBC : 2; - UINT16 TxSTBC : 1; - UINT16 ShortGIfor40 : 1; - UINT16 ShortGIfor20 : 1; - UINT16 GF : 1; - UINT16 MimoPs : 2; - UINT16 ChannelWidth : 1; - UINT16 ht_rx_ldpc : 1; -#else - UINT16 ht_rx_ldpc : 1; - UINT16 ChannelWidth : 1; - UINT16 MimoPs : 2; /* mimo power safe */ - UINT16 GF : 1; /* green field */ - UINT16 ShortGIfor20 : 1; - UINT16 ShortGIfor40 : 1; /* for40MHz */ - UINT16 TxSTBC : 1; /* 0:not supported, 1:if supported */ - UINT16 RxSTBC : 2; - UINT16 DelayedBA : 1; - UINT16 AMsduSize : 1; /* only support as zero */ - UINT16 CCKmodein40 : 1; - UINT16 PSMP : 1; - UINT16 Forty_Mhz_Intolerant : 1; - UINT16 LSIGTxopProSup : 1; -#endif /* RT_BIG_ENDIAN */ -} HT_CAP_INFO; - -/* HT Capability INFO field in HT Cap IE . */ -typedef struct GNU_PACKED _HT_CAP_PARM { -#ifdef RT_BIG_ENDIAN - UINT8 rsv : 3; /*momi power safe */ - UINT8 MpduDensity : 3; - UINT8 MaxRAmpduFactor : 2; -#else - UINT8 MaxRAmpduFactor : 2; - UINT8 MpduDensity : 3; - UINT8 rsv : 3; /*momi power safe */ -#endif /* RT_BIG_ENDIAN */ -} HT_CAP_PARM, *PHT_CAP_PARM; - -typedef struct GNU_PACKED _HT_MCS_SET_TX_SUBFIELD { -#ifdef RT_BIG_ENDIAN - UINT8 TxMCSSetDefined : 1; - UINT8 TxRxNotEqual : 1; - UINT8 TxMaxStream : 2; - UINT8 TxUnqualModulation : 1; - UINT8 rsv : 3; -#else - UINT8 rsv : 3; - UINT8 TxUnqualModulation : 1; - UINT8 TxMaxStream : 2; - UINT8 TxRxNotEqual : 1; - UINT8 TxMCSSetDefined : 1; -#endif /* RT_BIG_ENDIAN */ -} HT_MCS_SET_TX_SUBFIELD, *PHT_MCS_SET_TX_SUBFIELD; - -/* HT Capability INFO field in HT Cap IE . */ -typedef struct GNU_PACKED _HT_MCS_SET { - UINT8 MCSSet[10]; - UINT8 SupRate[2]; /* unit : 1Mbps */ -#ifdef RT_BIG_ENDIAN - UINT8 rsv : 3; - UINT8 MpduDensity : 1; - UINT8 TxStream : 2; - UINT8 TxRxNotEqual : 1; - UINT8 TxMCSSetDefined : 1; -#else - UINT8 TxMCSSetDefined : 1; - UINT8 TxRxNotEqual : 1; - UINT8 TxStream : 2; - UINT8 MpduDensity : 1; - UINT8 rsv : 3; -#endif /* RT_BIG_ENDIAN */ - UINT8 rsv3[3]; -} HT_MCS_SET, *PHT_MCS_SET; - -/* HT Capability INFO field in HT Cap IE . */ -typedef struct GNU_PACKED _EXT_HT_CAP_INFO { -#ifdef RT_BIG_ENDIAN - UINT16 rsv2 : 4; - UINT16 RDGSupport : 1; /*reverse Direction Grant support */ - UINT16 PlusHTC : 1; /*+HTC control field support */ - UINT16 MCSFeedback : 2; /*0:no MCS feedback, 2:unsolicited MCS feedback, 3:Full MCS feedback, 1:rsv. */ - UINT16 rsv : 5; /*momi power safe */ - UINT16 TranTime : 2; - UINT16 Pco : 1; -#else - UINT16 Pco : 1; - UINT16 TranTime : 2; - UINT16 rsv : 5; /*momi power safe */ - UINT16 MCSFeedback : 2; /*0:no MCS feedback, 2:unsolicited MCS feedback, 3:Full MCS feedback, 1:rsv. */ - UINT16 PlusHTC : 1; /*+HTC control field support */ - UINT16 RDGSupport : 1; /*reverse Direction Grant support */ - UINT16 rsv2 : 4; -#endif /* RT_BIG_ENDIAN */ -} EXT_HT_CAP_INFO, *PEXT_HT_CAP_INFO; - -/* HT Explicit Beamforming Feedback Capable */ -#define HT_ExBF_FB_CAP_NONE 0 -#define HT_ExBF_FB_CAP_DELAYED 1 -#define HT_ExBF_FB_CAP_IMMEDIATE 2 -#define HT_ExBF_FB_CAP_BOTH 3 - -/* HT Beamforming field in HT Cap IE */ -typedef struct GNU_PACKED _HT_BF_CAP { -#ifdef RT_BIG_ENDIAN - UINT32 rsv : 3; - UINT32 ChanEstimation : 2; - UINT32 CSIRowBFSup : 2; - UINT32 ComSteerBFAntSup : 2; - UINT32 NoComSteerBFAntSup : 2; - UINT32 CSIBFAntSup : 2; - UINT32 MinGrouping : 2; - UINT32 ExpComBF : 2; - UINT32 ExpNoComBF : 2; - UINT32 ExpCSIFbk : 2; - UINT32 ExpComSteerCapable : 1; - UINT32 ExpNoComSteerCapable : 1; - UINT32 ExpCSICapable : 1; - UINT32 Calibration : 2; - UINT32 ImpTxBFCapable : 1; - UINT32 TxNDPCapable : 1; - UINT32 RxNDPCapable : 1; - UINT32 TxSoundCapable : 1; - UINT32 RxSoundCapable : 1; - UINT32 TxBFRecCapable : 1; -#else - UINT32 TxBFRecCapable : 1; - UINT32 RxSoundCapable : 1; - UINT32 TxSoundCapable : 1; - UINT32 RxNDPCapable : 1; - UINT32 TxNDPCapable : 1; - UINT32 ImpTxBFCapable : 1; - UINT32 Calibration : 2; - UINT32 ExpCSICapable : 1; - UINT32 ExpNoComSteerCapable : 1; - UINT32 ExpComSteerCapable : 1; - UINT32 ExpCSIFbk : 2; - UINT32 ExpNoComBF : 2; - UINT32 ExpComBF : 2; - UINT32 MinGrouping : 2; - UINT32 CSIBFAntSup : 2; - UINT32 NoComSteerBFAntSup : 2; - UINT32 ComSteerBFAntSup : 2; - UINT32 CSIRowBFSup : 2; - UINT32 ChanEstimation : 2; - UINT32 rsv : 3; -#endif /* RT_BIG_ENDIAN */ -} HT_BF_CAP, *PHT_BF_CAP; - -/* HT antenna selection field in HT Cap IE . */ -typedef struct GNU_PACKED _HT_AS_CAP { -#ifdef RT_BIG_ENDIAN - UINT8 rsv : 1; - UINT8 TxSoundPPDU : 1; - UINT8 RxASel : 1; - UINT8 AntIndFbk : 1; - UINT8 ExpCSIFbk : 1; - UINT8 AntIndFbkTxASEL : 1; - UINT8 ExpCSIFbkTxASEL : 1; - UINT8 AntSelect : 1; -#else - UINT8 AntSelect : 1; - UINT8 ExpCSIFbkTxASEL : 1; - UINT8 AntIndFbkTxASEL : 1; - UINT8 ExpCSIFbk : 1; - UINT8 AntIndFbk : 1; - UINT8 RxASel : 1; - UINT8 TxSoundPPDU : 1; - UINT8 rsv : 1; -#endif /* RT_BIG_ENDIAN */ -} HT_AS_CAP, *PHT_AS_CAP; - -/* Draft 1.0 set IE length 26, but is extensible.. */ -#define SIZE_HT_CAP_IE 26 -/* The structure for HT Capability IE. */ -typedef struct GNU_PACKED _HT_CAPABILITY_IE { - HT_CAP_INFO HtCapInfo; - HT_CAP_PARM HtCapParm; - /* HT_MCS_SET HtMCSSet; */ - UCHAR MCSSet[16]; - EXT_HT_CAP_INFO ExtHtCapInfo; - HT_BF_CAP TxBFCap; /* beamforming cap. rt2860c not support beamforming. */ - HT_AS_CAP ASCap; /*antenna selection. */ -} HT_CAPABILITY_IE, *PHT_CAPABILITY_IE; - -/* field in Addtional HT Information IE . */ -typedef struct GNU_PACKED _ADD_HTINFO { -#ifdef RT_BIG_ENDIAN - UCHAR SerInterGranu : 3; - UCHAR S_PSMPSup : 1; - UCHAR RifsMode : 1; - UCHAR RecomWidth : 1; - UCHAR ExtChanOffset : 2; -#else - UCHAR ExtChanOffset : 2; - UCHAR RecomWidth : 1; - UCHAR RifsMode : 1; - UCHAR S_PSMPSup : 1; /*Indicate support for scheduled PSMP */ - UCHAR SerInterGranu : 3; /*service interval granularity */ -#endif -} ADD_HTINFO, *PADD_HTINFO; - -typedef struct GNU_PACKED _ADD_HTINFO2 { -#ifdef RT_BIG_ENDIAN - USHORT rsv2 : 11; - USHORT OBSS_NonHTExist : 1; - USHORT rsv : 1; - USHORT NonGfPresent : 1; - USHORT OperaionMode : 2; -#else - USHORT OperaionMode : 2; - USHORT NonGfPresent : 1; - USHORT rsv : 1; - USHORT OBSS_NonHTExist : 1; - USHORT rsv2 : 11; -#endif -} ADD_HTINFO2, *PADD_HTINFO2; - -/* TODO: Need sync with spec about the definition of StbcMcs. In Draft 3.03, it's reserved. */ -typedef struct GNU_PACKED _ADD_HTINFO3 { -#ifdef RT_BIG_ENDIAN - USHORT rsv : 4; - USHORT PcoPhase : 1; - USHORT PcoActive : 1; - USHORT LsigTxopProt : 1; - USHORT STBCBeacon : 1; - USHORT DualCTSProtect : 1; - USHORT DualBeacon : 1; - USHORT StbcMcs : 6; -#else - USHORT StbcMcs : 6; - USHORT DualBeacon : 1; - USHORT DualCTSProtect : 1; - USHORT STBCBeacon : 1; - USHORT LsigTxopProt : 1; /* L-SIG TXOP protection full support */ - USHORT PcoActive : 1; - USHORT PcoPhase : 1; - USHORT rsv : 4; -#endif /* RT_BIG_ENDIAN */ -} ADD_HTINFO3, *PADD_HTINFO3; - -#define SIZE_ADD_HT_INFO_IE 22 -typedef struct GNU_PACKED _ADD_HT_INFO_IE { - UCHAR ControlChan; - ADD_HTINFO AddHtInfo; - ADD_HTINFO2 AddHtInfo2; - ADD_HTINFO3 AddHtInfo3; - UCHAR MCSSet[16]; /* Basic MCS set */ -} ADD_HT_INFO_IE, *PADD_HT_INFO_IE; - -/* 802.11n draft3 related structure definitions. */ -/* 7.3.2.60 */ -#define dot11OBSSScanPassiveDwell \ - 20 /* in TU. min amount of time that the STA continously scans each channel when performing an active OBSS scan. */ -#define dot11OBSSScanActiveDwell \ - 10 /* in TU.min amount of time that the STA continously scans each channel when performing an passive OBSS scan. */ -#define dot11BSSWidthTriggerScanInterval \ - 300 /* in sec. max interval between scan operations to be performed to detect BSS channel width trigger events. */ -#define dot11OBSSScanPassiveTotalPerChannel \ - 200 /* in TU. min total amount of time that the STA scans each channel when performing a passive OBSS scan. */ -#define dot11OBSSScanActiveTotalPerChannel \ - 20 /*in TU. min total amount of time that the STA scans each channel when performing a active OBSS scan */ -#define dot11BSSWidthChannelTransactionDelayFactor \ - 5 /* min ratio between the delay time in performing a switch from 20MHz BSS to 20/40 BSS operation and the maximum */ -/* interval between overlapping BSS scan operations. */ -#define dot11BSSScanActivityThreshold \ - 25 /* in %%, max total time that a STA may be active on the medium during a period of */ -/* (dot11BSSWidthChannelTransactionDelayFactor * dot11BSSWidthTriggerScanInterval) seconds without */ -/* being obligated to perform OBSS Scan operations. default is 25(== 0.25%) */ - -typedef struct GNU_PACKED _OVERLAP_BSS_SCAN_IE { - USHORT ScanPassiveDwell; - USHORT ScanActiveDwell; - USHORT TriggerScanInt; /* Trigger scan interval */ - USHORT PassiveTalPerChannel; /* passive total per channel */ - USHORT ActiveTalPerChannel; /* active total per channel */ - USHORT DelayFactor; /* BSS width channel transition delay factor */ - USHORT ScanActThre; /* Scan Activity threshold */ -} OVERLAP_BSS_SCAN_IE, *POVERLAP_BSS_SCAN_IE; - -/* 7.3.2.56. 20/40 Coexistence element used in Element ID = 72 = IE_2040_BSS_COEXIST */ -typedef union GNU_PACKED _BSS_2040_COEXIST_IE { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UCHAR rsv : 3; - UCHAR ObssScanExempGrant : 1; - UCHAR ObssScanExempReq : 1; - UCHAR BSS20WidthReq : 1; - UCHAR Intolerant40 : 1; - UCHAR InfoReq : 1; -#else - UCHAR InfoReq : 1; - UCHAR Intolerant40 : 1; /* Inter-BSS. set 1 when prohibits a receiving BSS from operating as a 20/40 Mhz BSS. */ - UCHAR BSS20WidthReq : 1; /* Intra-BSS set 1 when prohibits a receiving AP from operating its BSS as a 20/40MHz BSS. */ - UCHAR ObssScanExempReq : 1; - UCHAR ObssScanExempGrant : 1; - UCHAR rsv : 3; -#endif /* RT_BIG_ENDIAN */ - } field; - UCHAR word; -} BSS_2040_COEXIST_IE, *PBSS_2040_COEXIST_IE; - -#endif /* _DOT11N_HT_H_ */ -#endif /* DOT11_N_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11r_ft.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11r_ft.h deleted file mode 100644 index 742bb27cb4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11r_ft.h +++ /dev/null @@ -1,323 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - dot11r_ft.h - - Abstract: - Defined status code, IE and frame structures that FT (802.11rD9.0) needed. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - Fonchi Wu 12-02-2008 created for 11r soft-AP - */ - -#ifndef __DOT11R_FT_H -#define __DOT11R_FT_H - -#include "rtmp_type.h" - -#if defined(DOT11R_FT_SUPPORT) || defined(DOT11K_RRM_SUPPORT) -/* - Fast BSS transition auth algorithm in 802.11rD9.0 specification. - All other algorithms are defined in rtmp_def.h -*/ -#define FT_MDID_LEN 2 -#define FT_ROKH_ID_LEN 48 -#define FT_R1KH_ID_LEN 6 -#endif /* DOT11R_FT_SUPPORT || DOT11K_RRM_SUPPORT */ - -#if defined(DOT11R_FT_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT) -#define FT_MIC_LEN 16 -#define FT_NONCE_LEN 32 -#endif - -#ifdef DOT11R_FT_SUPPORT -#define FT_CATEGORY_BSS_TRANSITION 6 -#define FT_ACTION_BT_REQ 1 -#define FT_ACTION_BT_RSP 2 -#define FT_ACTION_BT_CONFIRM 3 -#define FT_ACTION_BT_ACK 4 - -/* Status codes defined in 802.11rD9.0 specification. */ -#define FT_STATUS_CODE_RESERVED 27 -#define FT_STATUS_CODE_R0KH_UNREACHABLE 28 -#define FT_STATUS_CODE_INVALID_FME_COUNT 52 -#define FT_STATUS_CODE_INVALID_PMKID 53 -#define FT_STATUS_CODE_INVALID_MDIE 54 -#define FT_STATUS_CODE_INVALID_FTIE 55 -#endif /* DOT11R_FT_SUPPORT */ - -#if defined(DOT11R_FT_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT) || \ - defined(DOT11K_RRM_SUPPORT) -/* Information element ID defined in 802.11rD9.0 specification. */ -#define IE_FT_MDIE 54 -#define IE_FT_FTIE 55 -#define IE_FT_TIMEOUT_INTERVAL 56 -#define IE_FT_RIC_DATA 57 -#define IE_FT_RIC_DESCRIPTOR 75 - -/* RIC Type */ -#define FT_RIC_TYPE_BA 1 - -/* AKM SUITE */ -#define FT_AKM_SUITE_1X 3 -#define FT_AKM_SUITE_PSK 4 -#endif - -#if defined(DOT11R_FT_SUPPORT) || defined(DOT11K_RRM_SUPPORT) -/* -** MDIE: Mobile Domain IE. -*/ -typedef union GNU_PACKED _FT_CAP_AND_POLICY { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT8 Reserved : 6; - UINT8 RsrReqCap : 1; - UINT8 FtOverDs : 1; -#else - UINT8 FtOverDs : 1; - UINT8 RsrReqCap : 1; - UINT8 Reserved : 6; -#endif - } field; - UINT8 word; -} FT_CAP_AND_POLICY, *PFT_CAP_AND_POLICY; - -typedef struct GNU_PACKED _FT_MDIE { - UINT8 MdId[FT_MDID_LEN]; - FT_CAP_AND_POLICY FtCapPlc; -} FT_MDIE, *PFT_MDIE; -#endif /* DOT11R_FT_SUPPORT || DOT11K_RRM_SUPPORT */ - -#if defined(DOT11R_FT_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT) -typedef union GNU_PACKED _FT_MIC_CTR_FIELD { - /* - IECnt: contains the number of IEs - that are included int eht MIC calculation. - */ - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT16 IECnt : 8; - UINT16 Reserved : 8; -#else - UINT16 Reserved : 8; - UINT16 IECnt : 8; -#endif - } field; - UINT16 word; -} FT_MIC_CTR_FIELD, *PFT_MIC_CTR_FIELD; - -/* -** FTIE: Fast Transition IE. -*/ -typedef struct GNU_PACKED _FT_FTIE { - FT_MIC_CTR_FIELD MICCtr; /* 2 Octects. */ - UINT8 MIC[FT_MIC_LEN]; /* 16 Octects. */ - UINT8 ANonce[FT_NONCE_LEN]; /* 32 Octects. */ - UINT8 SNonce[FT_NONCE_LEN]; /* 32 Octects. */ - UINT8 Option[0]; /* 1:R1KHID, 2:GTK, 3:ROKHId, else:Res */ -} FT_FTIE, *PFT_FTIE; -#endif - -#ifdef DOT11R_FT_SUPPORT -/* Sub-element IDs */ -typedef enum _FT_SUB_ELEMENT_ID { - FT_R1KH_ID = 1, - FT_GTK, - FT_R0KH_ID, -#ifdef DOT11W_PMF_SUPPORT - FT_IGTK_ID, -#endif /* DOT11W_PMF_SUPPORT */ - FT_RESERVED_ID -} FT_SUB_ELEMENT_ID, - *PFT_SUB_ELEMENT_ID; - -typedef struct GNU_PACKED _FT_OPTION_FIELD { - UINT8 SubElementId; - UINT8 Len; - UINT8 Oct[0]; -} FT_OPTION_FIELD, *PFT_OPTION_FIELD; - -/* Sub element frame of FTIE. */ -typedef union GNU_PACKED _FT_GTK_KEY_INFO { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT16 Reserved : 14; - UINT16 KeyId : 2; -#else - UINT16 KeyId : 2; - UINT16 Reserved : 14; -#endif - } field; - UINT16 word; -} FT_GTK_KEY_INFO, *PFT_GTK_KEY_INFO; - -typedef struct GNU_PACKED _FT_GTK_SUB_ELEMENT { - FT_GTK_KEY_INFO KeyInfo; /* 2 octects. */ - UINT8 KeyLen; - UINT8 RSC[8]; /* Receive seq counter. */ - UINT8 Key[0]; /* 5 to 32 octects. */ -} FT_GTK_SUB_ELEMENT, *PFT_GTK_SUB_ELEMENT; -#endif /* DOT11R_FT_SUPPORT */ - -#if defined(DOT11R_FT_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT) -/* -** Timeout Interval IE. -*/ -typedef enum _FT_TIMEOUT_INTERVAL_TYPE { - REASSOC_DEADLINE_INTERVAL = 1, /* TUs */ - KEY_LIFETIME_INTERVAL, /* seconds. */ -#ifdef DOT11W_PMF_SUPPORT - ASSOC_COMEBACK_TIME, /* TUs */ -#endif /* DOT11W_PMF_SUPPORT */ - RESERVED_INTERVAL -} FT_TIMEOUT_INTERVAL_TYPE, - *PFT_TIMEOUT_INTERVAL_TYPE; - -typedef struct GNU_PACKED _FT_TIMEOUT_INTERVAL_IE { - UINT8 TimeoutIntervalType; - UINT32 TimeoutIntervalValue; -} FT_TIMEOUT_INTERVAL_IE, *PFT_TIMEOUT_INTERVAL_IE; -#endif - -#ifdef DOT11R_FT_SUPPORT -/* ----- Fast BSS Transition Action ----- */ -#define FT_OVER_DS_CATEGORY 0x06 - -typedef struct _FT_OVER_DS_ACTION_REQ_CONFIRM { - /* must be 6 */ - UCHAR Category; - -#define FT_OVER_DS_ACTION_REQ 0x01 -#define FT_OVER_DS_ACTION_CON 0x03 - /* must be 1 or 3 */ - UCHAR Action; - - /* the STA¡¦s MAC address */ - UCHAR STA_Addr[ETH_ALEN]; - - /* the BSSID value of the target AP */ - UCHAR TargetAP_Addr[ETH_ALEN]; - - /* REQ: RSN, Mobility Domain, or Fast BSS Transition element */ - /* CONFIRM: RSN, Mobility Domain, Fast BSS Transition, or RIC element */ - UCHAR InfoElm[0]; /*[1024 - 14]; */ -} GNU_PACKED FT_OVER_DS_ACTION_REQ_FONFIRM; - -typedef struct _FT_OVER_DS_ACTION_RSP_ACK { - /* must be 6 */ - UCHAR Category; - -#define FT_OVER_DS_ACTION_RSP 0x02 -#define FT_OVER_DS_ACTION_ACK 0x04 - /* must be 2 or 4 */ - UCHAR Action; - - /* the STA¡¦s MAC address */ - UCHAR STA_Addr[ETH_ALEN]; - - /* the BSSID value of the target AP */ - UCHAR TargetAP_Addr[ETH_ALEN]; - - /* FT_STATUS_CODE_R0KH_UNREACHABLE ~ FT_STATUS_CODE_INVALID_FTIE */ - UINT16 StatusCode; - - /* RSP: RSN, Mobility Domain, or Fast BSS Transition element */ - /* ACK: RSN, Mobility Domain, Fast BSS Transition, Timeout, or RIC element */ - UCHAR InfoElm[0]; /*[1024 - 16]; */ -} GNU_PACKED FT_OVER_DS_ACTION_RSP_ACK; - -/* ----- RIC(Resource Information Container) ----- */ - -/* element ID and element length */ -#define FT_ELM_HDR_LEN 2 - -/* Resource Information Container Data information element */ -typedef struct _FT_ELM_RIC_DATA_INFO { -#define FT_ELM_ID_RIC_DATA_INFO 57 - UCHAR ElmID; - -#define FT_ELM_LEN_RIC_DATA_INFO 4 - UCHAR ElmLen; - - /* - RDIE: RIC Data information Element - An arbitrary 8-bit value, chosen by the resource requestor to - uniquely identify the RDIE within the RIC. - */ - UCHAR RDIE_Identifier; - - /* - Resource Descriptor Count - Number of alternative Resource Descriptors that follow this RDIE. - */ - UCHAR RD_Count; - - /* the result of the request */ - /* FT_STATUS_CODE_R0KH_UNREACHABLE ~ FT_STATUS_CODE_INVALID_FTIE */ - UINT16 StatusCode; - -} GNU_PACKED FT_ELM_RIC_DATA_INFO; - -/* Resource Information Container descriptor information element */ -#define FT_ELM_RIC_DESCP_INFO_LEN (FT_ELM_HDR_LEN + 7) - -typedef struct GNU_PACKED _FT_RIC_DESCP_BLOCK_ACK { - UINT16 BaParm; /* Block Ack Parameter Set */ - UINT16 TimeOutValue; /* Block Ack Timeout Value */ - UINT16 BaStartSeq; /* Block Ack Starting Sequence Control */ -} FT_RIC_DESCP_BLOCK_ACK; - -typedef struct GNU_PACKED _FT_ELM_RIC_DESCP_INFO { -#define FT_ELM_ID_RIC_DESCP_INFO 75 - UCHAR ElmID; - -#define FT_ELM_LEN_RIC_DESCP_INFO_RSC_BLOCK_ACK 7 - UCHAR ElmLen; - -#define FT_ELM_RIC_DESCP_INFO_RSC_TYPE_BLOCK_ACK 1 - UCHAR ResourceType; - - /* negotiated resources */ - /* - For FT_ELM_RIC_DESCP_INFO_RSC_TYPE_BLOCK_ACK: - Block Ack Parameter Set (2B), - Block Ack Timeout Value (2B), and - Block Ack Starting Sequence Control (2B) - */ - UCHAR Container[6]; - -} FT_ELM_RIC_DESCP_INFO; - -typedef struct GNU_PACKED __FT_ACTION { - UINT8 Category; - UINT8 Action; - UINT8 StaMac[MAC_ADDR_LEN]; - UINT8 TargetApAddr[MAC_ADDR_LEN]; - UINT8 Oct[0]; -} FT_ACTION, *PFT_ACTION; - -typedef struct GNU_PACKED __FT_RRB { - UINT8 RemoteFrTyp; - UINT8 FTPktType; - UINT16 FTActLen; - UINT8 APAdr[MAC_ADDR_LEN]; - UINT8 Oct[0]; -} FT_RRB, *PFT_RRB; -#endif /* DOT11R_FT_SUPPORT */ - -#endif /* __DOT11R_FT_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11u_interworking.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11u_interworking.h deleted file mode 100644 index 59c93df759..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11u_interworking.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 5F., No.36 Taiyuan St., Jhubei City, - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2011, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - dot11u_hotspot.h - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - -*/ - -#ifndef __DOT11U_HOTSPOT_H__ -#define __DOT11U_HOTSPOT_H__ - -#include "rtmp_type.h" - -/* unit ms */ -#define dot11GASResponseTimeout 5120 -#define dotGASResponseBufferingTime 5120 - -enum GAS_ACTION_FIELD { - ACTION_GAS_INIT_REQ = 10, - ACTION_GAS_INIT_RSP = 11, - ACTION_GAS_CB_REQ = 12, - ACTION_GAS_CB_RSP = 13, -}; - -typedef struct GNU_PACKED _GAS_FRAME { - HEADER_802_11 Hdr; - UCHAR Category; - union { - struct { - UCHAR Action; - UCHAR DialogToken; - /* - * Following are advertisement protocol element, - * query request length, and query request - */ - UCHAR Variable[0]; - } GNU_PACKED GAS_INIT_REQ; - struct { - UCHAR Action; - UCHAR DialogToken; - UINT16 StatusCode; - UINT16 GASComebackDelay; - /* - * Following are advertisement protocol element, - * query response length, and query response(optional) - */ - UCHAR Variable[0]; - } GNU_PACKED GAS_INIT_RSP; - struct { - UCHAR Action; - UCHAR DialogToken; - } GNU_PACKED GAS_CB_REQ; - struct { - UCHAR Action; - UCHAR DialogToken; - UINT16 StatusCode; - UCHAR GASRspFragID; - UINT16 GASComebackDelay; - /* - * Following are advertisment protocol element, - * query response length, and query response(optional) - */ - UCHAR Variable[0]; - } GNU_PACKED GAS_CB_RSP; - } u; -} GAS_FRAME, *PGAS_FRAME; - -/* Status Code */ -enum DOT11U_STATUS_CODE { - ADVERTISEMENT_PROTOCOL_NOT_SUPPORTED = 59, - UNSPECIFIED_FAILURE = 60, - RESPONSE_NOT_RECEIVED_FROM_SERVER = 61, - TIMEOUT = 62, - QUERY_RESPONSE_TOO_LARGE = 63, - REQUEST_REFUSED_HOME_NETWORK_NOT_SUPPORT = 64, - SERVER_UNREACHABLE = 65, - REQUEST_REFUSED_PERMISSIONS_RECEIVED_FROM_SSPN = 67, - REQUEST_REFUSED_AP_NOT_SUPPORT_UNAUTH_ACCESS = 68, - TRANSMISSION_FAILURE = 79, -}; - -/* Advertismenet Protocol ID definitions */ -enum DOT11U_ADVERTISMENT_PROTOCOL_ID { - ACCESS_NETWORK_QUERY_PROTOCOL = 0, - MIH_INFORMATION_SERVICE = 1, - MIH_COMMAND_AND_EVENT_SERVICES_CAPBILITY_DISCOVERY = 2, - EMERGENCY_ALERT_SYSTEM = 3, - VENDOR_SPECIFIC = 221 -}; - -struct anqp_frame { - UINT16 info_id; - UINT16 length; - char variable[0]; -} __attribute__((packed)); - -#endif /* __DOT11U_HOTSPOT_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11v_wnm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11v_wnm.h deleted file mode 100644 index 2409ae80d7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/dot11v_wnm.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 5F., No.36 Taiyuan St., Jhubei City, - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2011, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - dot11v_wnm.h - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - -*/ - -#ifndef __DOT11V_WNM_H__ -#define __DOT11V_WNM_H__ - -#define WNM_BSS_PERFERENCE_SUBIE 3 -#define WNM_BSS_TERMINATION_SUBIE 4 - -enum WNM_ACTION_FIELD { - EVENT_REQUEST, - EVENT_REPORT, - DIAGNOSTIC_REQ, - DIAGNOSTIC_REPORT, - LOCATION_CONF_REQ, - LOCATION_CONF_RSP, - BSS_TRANSITION_QUERY, - BSS_TRANSITION_REQ, - BSS_TRANSITION_RSP, - FMS_REQ, - FMS_RSP, - COLLOCATED_INTERFERENCE_REQ, - COLLOCATED_INTERFERENCE_REPORT, - TFS_REQ, - TFS_RSP, - TFS_NOTIFY, - WNM_SLEEP_MODE_REQ, - WNM_SLEEP_MODE_RSP, - TIM_BROADCAST_REQ, - TIM_BROADCAST_RSP, - QOS_TRAFFIC_CAPABILITY_UPDATE, - CHANNEL_USAGE_REQ, - CHANNEL_USAGE_RSP, - DMS_REQ, - DMS_RSP, - TIMING_MEASUREMENT_REQ, - WNM_NOTIFICATION_REQ, - WNM_NOTIFICATION_RSP, -}; - -typedef struct GNU_PACKED _WNM_FRAME { - HEADER_802_11 Hdr; - UCHAR Category; - union { - struct { - UCHAR Action; - UCHAR DialogToken; - UCHAR Variable[0]; - } GNU_PACKED BTM_QUERY; - - struct { - UCHAR Action; - UCHAR DialogToken; - UCHAR Variable[0]; - } GNU_PACKED BTM_REQ; - - struct { - UCHAR Action; - UCHAR DialogToken; - UCHAR Variable[0]; - } GNU_PACKED BTM_RSP; - - struct { - UCHAR Action; - UCHAR DialogToken; - UCHAR Type; - UCHAR Variable[0]; - } GNU_PACKED WNM_NOTIFY_REQ; - - struct { - UCHAR Action; - UCHAR DialogToken; - UCHAR RespStatus; - UCHAR Variable[0]; - } GNU_PACKED WNM_NOTIFY_RSP; - } u; -} WNM_FRAME, *PWNM_FRAME; - -void PeerWNMAction(IN struct _RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -#endif /* __DOT11V_WNM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom.h deleted file mode 100644 index 5e6a6dd585..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom.h +++ /dev/null @@ -1,839 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - eeprom.h - - Abstract: - Miniport header file for eeprom related information - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __EEPROM_H__ -#define __EEPROM_H__ - -#include "eeprom/mt_dmac_e2p_def.h" - -/* For ioctl check usage */ -#define EEPROM_IS_PROGRAMMED 0x80 - -#define E2P_NONE 0x00 -#define E2P_EFUSE_MODE 0x01 -#define E2P_FLASH_MODE 0x02 -#define E2P_EEPROM_MODE 0x03 -#define E2P_BIN_MODE 0x04 -#define NUM_OF_E2P_MODE 0x05 - -#define E2P_SRC_FROM_EFUSE BIT(0) -#define E2P_SRC_FROM_FLASH BIT(1) -#define E2P_SRC_FROM_EEPROM BIT(2) -#define E2P_SRC_FROM_BIN BIT(3) -#define E2P_SRC_FROM_FLASH_AND_EFUSE (BIT(1) | BIT(3)) /* merge mode */ -#define E2P_SRC_FROM_BIN_AND_EFUSE (BIT(0) | BIT(3)) /* merge mode */ - -#ifdef RTMP_MAC_PCI -#ifdef MT7615 -#define PA_TRIM_START_ADDR1 0x338 -#define PA_TRIM_START_ADDR2 0x3B3 -#define PA_TRIM_BLOCK_SIZE 4 - -#define MAX_EEPROM_BIN_FILE_SIZE 1024 -#else -#define MAX_EEPROM_BIN_FILE_SIZE 512 -#endif -#else -#define MAX_EEPROM_BIN_FILE_SIZE 1024 -#endif /* !RTMP_MAC_PCI */ - -#if defined(RTMP_MAC_USB) || defined(RT3883) -#define EEPROM_SIZE 0x400 -#else -/* #define EEPROM_SIZE 0x200 */ -#define EEPROM_SIZE 0x400 -#endif /* defined(RTMP_MAC_USB) || defined(RT3883) */ - -#define EEPROM_DEFULT_BIN_FILE "RT30xxEEPROM.bin" -#ifdef BB_SOC -#define BIN_FILE_PATH "/etc/RT30xxEEPROM.bin" -#if defined(PRE_CAL_TRX_SET1_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) || \ - defined(RLM_CAL_CACHE_SUPPORT) -#define CAL_FILE_PATH "/etc/CALDATA_default.bin" -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -#define CAL_BIN_FILE_PATH "/etc/CALIBRATION_DATA.bin" -#endif /* CAL_BIN_FILE_SUPPORT */ -#else -/* #define BIN_FILE_PATH "/tmp/RT30xxEEPROM.bin" */ -#ifdef WCX_SUPPORT -#define BIN_FILE_PATH "/data/nvram/APCFG/APRDEB/WIFI" -#else -#define BIN_FILE_PATH "/etc/RT30xxEEPROM.bin" -#if defined(PRE_CAL_TRX_SET1_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) || \ - defined(RLM_CAL_CACHE_SUPPORT) -#define CAL_FILE_PATH "/etc/CALDATA_default.bin" -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -#define CAL_BIN_FILE_PATH "/etc/CALIBRATION_DATA.bin" -#endif /* CAL_BIN_FILE_SUPPORT */ -#endif /* WCX_SUPPORT */ -#endif /* BB_SOC */ - -#define EEPROM_DFT_FILE_DIR "/etc_ro/wlan/" -#define EEPROM_1ST_FILE_DIR "/etc_ro/Wireless/RT2860/" -#define EEPROM_2ND_FILE_DIR "/etc_ro/Wireless/iNIC/" - -#ifndef EEPROM_DEFAULT_FILE_PATH -/* RFIC 2820 */ -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT2880_RT2820_AP_2T3R_V1_6.bin" - -#ifdef MT7615 -#undef EEPROM_DEFAULT_FILE_PATH -#define EEPROM_DEFAULT_FILE_PATH "/dev/mtdblock2" -#endif /* MT7615 */ - -#endif /* EEPROM_DEFAULT_FILE_PATH */ - -typedef struct eeprom_flash_info_t { - UINT offset; - UINT size; - RTMP_STRING bin_name[L1PROFILE_ATTRNAME_LEN]; -} eeprom_flash_info; - -#define NVRAM_OFFSET 0x30000 - -#if defined(CONFIG_RT2880_FLASH_32M) -#define DEFAULT_RF_OFFSET 0x1FE0000 -#else -#define DEFAULT_RF_OFFSET 0x40000 -#endif - -#define SECOND_RF_OFFSET 0x48000 - -#ifdef RT_BIG_ENDIAN -typedef union _EEPROM_WORD_STRUC { - struct { - UCHAR Byte1; /* High Byte */ - UCHAR Byte0; /* Low Byte */ - } field; - USHORT word; -} EEPROM_WORD_STRUC; -#else -typedef union _EEPROM_WORD_STRUC { - struct { - UCHAR Byte0; - UCHAR Byte1; - } field; - USHORT word; -} EEPROM_WORD_STRUC; -#endif - -/* ------------------------------------------------------------------- */ -/* E2PROM data layout */ -/* ------------------------------------------------------------------- */ - -/* Board type */ - -#define BOARD_TYPE_MINI_CARD 0 /* Mini card */ -#define BOARD_TYPE_USB_PEN 1 /* USB pen */ - -/* - EEPROM antenna select format -*/ - -#ifdef RT_BIG_ENDIAN -typedef union _EEPROM_NIC_CINFIG2_STRUC { - struct { - USHORT DACTestBit : 1; /* control if driver should patch the DAC issue */ - USHORT CoexBit : 1; - USHORT bInternalTxALC : 1; /* Internal Tx ALC */ - USHORT AntOpt : 1; /* Fix Antenna Option: 0:Main; 1: Aux */ - USHORT AntDiversity : 1; /* Antenna diversity */ - USHORT Rsv1 : 1; /* must be 0 */ - USHORT BW40MAvailForA : 1; /* 0:enable, 1:disable */ - USHORT BW40MAvailForG : 1; /* 0:enable, 1:disable */ - USHORT EnableWPSPBC : 1; /* WPS PBC Control bit */ - USHORT BW40MSidebandForA : 1; - USHORT BW40MSidebandForG : 1; - USHORT CardbusAcceleration : 1; /* !!! NOTE: 0 - enable, 1 - disable */ - USHORT ExternalLNAForA : 1; /* external LNA enable for 5G */ - USHORT ExternalLNAForG : 1; /* external LNA enable for 2.4G */ - USHORT DynamicTxAgcControl : 1; /* */ - USHORT HardwareRadioControl : 1; /* Whether RF is controlled by driver or HW. 1:enable hw control, 0:disable */ - } field; - USHORT word; -} EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC; -#else -typedef union _EEPROM_NIC_CINFIG2_STRUC { - struct { - USHORT HardwareRadioControl : 1; /* 1:enable, 0:disable */ - USHORT DynamicTxAgcControl : 1; /* */ - USHORT ExternalLNAForG : 1; /* external LNA enable for 2.4G */ - USHORT ExternalLNAForA : 1; /* external LNA enable for 5G */ - USHORT CardbusAcceleration : 1; /* !!! NOTE: 0 - enable, 1 - disable */ - USHORT BW40MSidebandForG : 1; - USHORT BW40MSidebandForA : 1; - USHORT EnableWPSPBC : 1; /* WPS PBC Control bit */ - USHORT BW40MAvailForG : 1; /* 0:enable, 1:disable */ - USHORT BW40MAvailForA : 1; /* 0:enable, 1:disable */ - USHORT Rsv1 : 1; /* must be 0 */ - USHORT AntDiversity : 1; /* Antenna diversity */ - USHORT AntOpt : 1; /* Fix Antenna Option: 0:Main; 1: Aux */ - USHORT bInternalTxALC : 1; /* Internal Tx ALC */ - USHORT CoexBit : 1; - USHORT DACTestBit : 1; /* control if driver should patch the DAC issue */ - } field; - USHORT word; -} EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC; -#endif - -/* - TX_PWR Value valid range 0xFA(-6) ~ 0x24(36) -*/ -#ifdef RT_BIG_ENDIAN -typedef union _EEPROM_TX_PWR_STRUC { - struct { - signed char Byte1; /* High Byte */ - signed char Byte0; /* Low Byte */ - } field; - USHORT word; -} EEPROM_TX_PWR_STRUC, *PEEPROM_TX_PWR_STRUC; -#else -typedef union _EEPROM_TX_PWR_STRUC { - struct { - signed char Byte0; /* Low Byte */ - signed char Byte1; /* High Byte */ - } field; - USHORT word; -} EEPROM_TX_PWR_STRUC, *PEEPROM_TX_PWR_STRUC; -#endif - -#ifdef RT_BIG_ENDIAN -typedef union _EEPROM_VERSION_STRUC { - struct { - UCHAR Version; /* High Byte */ - UCHAR FaeReleaseNumber; /* Low Byte */ - } field; - USHORT word; -} EEPROM_VERSION_STRUC, *PEEPROM_VERSION_STRUC; -#else -typedef union _EEPROM_VERSION_STRUC { - struct { - UCHAR FaeReleaseNumber; /* Low Byte */ - UCHAR Version; /* High Byte */ - } field; - USHORT word; -} EEPROM_VERSION_STRUC, *PEEPROM_VERSION_STRUC; -#endif - -#ifdef RT_BIG_ENDIAN -typedef union _EEPROM_LED_STRUC { - struct { - USHORT Rsvd : 3; /* Reserved */ - USHORT LedMode : 5; /* Led mode. */ - USHORT PolarityGPIO_4 : 1; /* Polarity GPIO#4 setting. */ - USHORT PolarityGPIO_3 : 1; /* Polarity GPIO#3 setting. */ - USHORT PolarityGPIO_2 : 1; /* Polarity GPIO#2 setting. */ - USHORT PolarityGPIO_1 : 1; /* Polarity GPIO#1 setting. */ - USHORT PolarityGPIO_0 : 1; /* Polarity GPIO#0 setting. */ - USHORT PolarityACT : 1; /* Polarity ACT setting. */ - USHORT PolarityRDY_A : 1; /* Polarity RDY_A setting. */ - USHORT PolarityRDY_G : 1; /* Polarity RDY_G setting. */ - } field; - USHORT word; -} EEPROM_LED_STRUC, *PEEPROM_LED_STRUC; -#else -typedef union _EEPROM_LED_STRUC { - struct { - USHORT PolarityRDY_G : 1; /* Polarity RDY_G setting. */ - USHORT PolarityRDY_A : 1; /* Polarity RDY_A setting. */ - USHORT PolarityACT : 1; /* Polarity ACT setting. */ - USHORT PolarityGPIO_0 : 1; /* Polarity GPIO#0 setting. */ - USHORT PolarityGPIO_1 : 1; /* Polarity GPIO#1 setting. */ - USHORT PolarityGPIO_2 : 1; /* Polarity GPIO#2 setting. */ - USHORT PolarityGPIO_3 : 1; /* Polarity GPIO#3 setting. */ - USHORT PolarityGPIO_4 : 1; /* Polarity GPIO#4 setting. */ - USHORT LedMode : 5; /* Led mode. */ - USHORT Rsvd : 3; /* Reserved */ - } field; - USHORT word; -} EEPROM_LED_STRUC, *PEEPROM_LED_STRUC; -#endif - -#ifdef RT_BIG_ENDIAN -typedef union _EEPROM_TXPOWER_DELTA_STRUC { - struct { - UCHAR TxPowerEnable : 1; /* Enable */ - UCHAR Type : 1; /* 1: plus the delta value, 0: minus the delta value */ - UCHAR DeltaValue : 6; /* Tx Power dalta value (MAX=4) */ - } field; - UCHAR value; -} EEPROM_TXPOWER_DELTA_STRUC, *PEEPROM_TXPOWER_DELTA_STRUC; -#else -typedef union _EEPROM_TXPOWER_DELTA_STRUC { - struct { - UCHAR DeltaValue : 6; /* Tx Power dalta value (MAX=4) */ - UCHAR Type : 1; /* 1: plus the delta value, 0: minus the delta value */ - UCHAR TxPowerEnable : 1; /* Enable */ - } field; - UCHAR value; -} EEPROM_TXPOWER_DELTA_STRUC, *PEEPROM_TXPOWER_DELTA_STRUC; -#endif - -#ifdef RT_BIG_ENDIAN -typedef union _EEPROM_TX_PWR_OFFSET_STRUC { - struct { - UCHAR Byte1; /* High Byte */ - UCHAR Byte0; /* Low Byte */ - } field; - - USHORT word; -} EEPROM_TX_PWR_OFFSET_STRUC, *PEEPROM_TX_PWR_OFFSET_STRUC; -#else -typedef union _EEPROM_TX_PWR_OFFSET_STRUC { - struct { - UCHAR Byte0; /* Low Byte */ - UCHAR Byte1; /* High Byte */ - } field; - - USHORT word; -} EEPROM_TX_PWR_OFFSET_STRUC, *PEEPROM_TX_PWR_OFFSET_STRUC; -#endif /* RT_BIG_ENDIAN */ - -typedef struct _EEPROM_CONTROL { - UCHAR e2pCurMode; - UCHAR e2pSource; - RTMP_STRING *BinSource; -} EEPROM_CONTROL, *PEEPROM_CONTROL; - -#ifdef RF_LOCKDOWN -typedef struct _EPPROM_PROPERTY_TYPE { - USHORT Offset; - BOOLEAN RFlcok; - BOOLEAN CalFree; -} EPPROM_PROPERTY_TYPE, *P_EPPROM_PROPERTY_TYPE; -#endif /* RF_LOCKDOWN */ - -#define NIC_CONFIGURE_0 0x34 -#define EXTERNAL_PA_MASK (0x3 << 8) -#define GET_PA_TYPE(p) (((p)&EXTERNAL_PA_MASK) >> 8) - -#define NIC_CONFIGURE_1 0x36 -#define INTERNAL_TX_ALC_EN (1 << 13) - -#define XTAL_TRIM1 0x3A -#define XTAL_TRIM1_DIP_SELECTION (1 << 7) -#define XTAL_TRIM1_MASK (0x7F) - -#define G_BAND_20_40_BW_PWR_DELTA 0x50 -#define G_BAND_20_40_BW_PWR_DELTA_MASK (0x3f) -#define G_BAND_20_40_BW_PWR_DELTA_SIGN (1 << 6) -#define G_BAND_20_40_BW_PWR_DELTA_EN (1 << 7) -#define A_BAND_20_40_BW_PWR_DELTA_MASK (0x3f << 8) -#define A_BAND_20_40_BW_PWR_DELTA_SIGN (1 << 14) -#define A_BAND_20_40_BW_PWR_DELTA_EN (1 << 15) - -#define A_BAND_20_80_BW_PWR_DELTA 0x52 -#define A_BAND_20_80_BW_PWR_DELTA_MASK (0x3f) -#define A_BAND_20_80_BW_PWR_DELTA_SIGN (1 << 6) -#define A_BAND_20_80_BW_PWR_DELTA_EN (1 << 7) -#define G_BAND_EXT_PA_SETTING_MASK (0x7f << 8) -#define G_BAND_EXT_PA_SETTING_EN (1 << 15) - -#define A_BAND_EXT_PA_SETTING 0x54 -#define A_BAND_EXT_PA_SETTING_MASK (0x7f) -#define A_BAND_EXT_PA_SETTING_EN (1 << 7) -#define TEMP_SENSOR_CAL_MASK (0x7f << 8) -#define TEMP_SENSOR_CAL_EN (1 << 15) - -#define TX0_G_BAND_TSSI_SLOPE 0x56 -#define TX0_G_BAND_TSSI_SLOPE_MASK (0xff) -#define TX0_G_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define TX0_G_BAND_TARGET_PWR 0x58 -#define TX0_G_BAND_TARGET_PWR_MASK (0xff) -#define TX0_G_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define TX0_G_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define TX0_G_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define TX0_G_BAND_CHL_PWR_DELTA_MID 0x5A -#define TX0_G_BAND_CHL_PWR_DELTA_MID_MASK (0x3f) -#define TX0_G_BAND_CHL_PWR_DELTA_MID_SIGN (1 << 6) -#define TX0_G_BAND_CHL_PWR_DELTA_MID_EN (1 << 7) -#define TX0_G_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define TX0_G_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define TX0_G_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define TX1_G_BAND_TSSI_SLOPE 0x5C -#define TX1_G_BAND_TSSI_SLOPE_MASK (0xff) -#define TX1_G_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define TX1_G_BAND_TARGET_PWR 0x5E -#define TX1_G_BAND_TARGET_PWR_MASK (0xff) -#define TX1_G_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define TX1_G_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define TX1_G_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define TX1_G_BAND_CHL_PWR_DELTA_MID 0x60 -#define TX1_G_BAND_CHL_PWR_DELTA_MID_MASK (0x3f) -#define TX1_G_BAND_CHL_PWR_DELTA_MID_SIGN (1 << 6) -#define TX1_G_BAND_CHL_PWR_DELTA_MID_EN (1 << 7) -#define TX1_G_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define TX1_G_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define TX1_G_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP0_TX0_A_BAND_TSSI_SLOPE 0x62 -#define GRP0_TX0_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP0_TX0_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP0_TX0_A_BAND_TARGET_PWR 0x64 -#define GRP0_TX0_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_HI 0x66 -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP1_TX0_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP1_TX0_A_BAND_TSSI_OFFSET 0x68 -#define GRP1_TX0_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP1_TX0_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_LOW 0x6A -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP2_TX0_A_BAND_TSSI_SLOPE 0x6C -#define GRP2_TX0_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP2_TX0_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP2_TX0_A_BAND_TARGET_PWR 0x6E -#define GRP2_TX0_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_HI 0x70 -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP3_TX0_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP3_TX0_A_BAND_TSSI_OFFSET 0x72 -#define GRP3_TX0_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP3_TX0_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_LOW 0x74 -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP4_TX0_A_BAND_TSSI_SLOPE 0x76 -#define GRP4_TX0_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP4_TX0_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP4_TX0_A_BAND_TARGET_PWR 0x78 -#define GRP4_TX0_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_HI 0x7A -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP5_TX0_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP5_TX0_A_BAND_TSSI_OFFSET 0x7C -#define GRP5_TX0_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP5_TX0_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_LOW 0X7E -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP0_TX1_A_BAND_TSSI_SLOPE 0x80 -#define GRP0_TX1_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP0_TX1_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP0_TX1_A_BAND_TARGET_PWR 0x82 -#define GRP0_TX1_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_HI 0x84 -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP1_TX1_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP1_TX1_A_BAND_TSSI_OFFSET 0x86 -#define GRP1_TX1_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP1_TX1_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_LOW 0x88 -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP2_TX1_A_BAND_TSSI_SLOPE 0x8A -#define GRP2_TX1_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP2_TX1_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP2_TX1_A_BAND_TARGET_PWR 0x8C -#define GRP2_TX1_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_HI 0x8E -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP3_TX1_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP3_TX1_A_BAND_TSSI_OFFSET 0x90 -#define GRP3_TX1_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP3_TX1_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_LOW 0x92 -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP4_TX1_A_BAND_TSSI_SLOPE 0x94 -#define GRP4_TX1_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP4_TX1_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP4_TX1_A_BAND_TARGET_PWR 0x96 -#define GRP4_TX1_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_HI 0x98 -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP5_TX1_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP5_TX1_A_BAND_TSSI_OFFSET 0x9A -#define GRP5_TX1_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP5_TX1_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_LOW 0x9C -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define G_BAND_BANDEDGE_PWR_BACK_OFF 0x9E -#define G_BAND_BANDEDGE_PWR_BACK_OFF_MASK (0x7f) -#define G_BAND_BANDEDGE_PWR_BACK_OFF_EN (1 << 7) -#define XTAL_TRIM2_MASK (0x7f << 8) -#define XTAL_TRIM2_DIP_SELECTION (1 << 15) - -#define TX_PWR_CCK_1_2M 0xA0 -#define TX_PWR_CCK_1_2M_MASK (0x3f) -#define TX_PWR_CCK_1_2M_SIGN (1 << 6) -#define TX_PWR_CCK_1_2M_EN (1 << 7) -#define TX_PWR_CCK_5_11M_MASK (0x3f << 8) -#define TX_PWR_CCK_5_11M_SIGN (1 << 14) -#define TX_PWR_CCK_5_11M_EN (1 << 15) - -#define TX_PWR_G_BAND_OFDM_6_9M 0xA2 -#define TX_PWR_G_BAND_OFDM_6_9M_MASK (0x3f) -#define TX_PWR_G_BAND_OFDM_6_9M_SIGN (1 << 6) -#define TX_PWR_G_BAND_OFDM_6_9M_EN (1 << 7) -#define TX_PWR_G_BAND_OFDM_12_18M_MASK (0x3f << 8) -#define TX_PWR_G_BAND_OFDM_12_18M_SIGN (1 << 14) -#define TX_PWR_G_BAND_OFDM_12_18M_EN (1 << 15) - -#define TX_PWR_G_BAND_OFDM_24_36M 0xA4 -#define TX_PWR_G_BAND_OFDM_24_36M_MASK (0x3f) -#define TX_PWR_G_BAND_OFDM_24_36M_SIGN (1 << 6) -#define TX_PWR_G_BAND_OFDM_24_36M_EN (1 << 7) -#define TX_PWR_G_BAND_OFDM_48_54M_MASK (0x3f << 8) -#define TX_PWR_G_BAND_OFDM_48_54M_SIGN (1 << 14) -#define TX_PWR_G_BAND_OFDM_48_54M_EN (1 << 15) - -#define TX_PWR_HT_MCS_0_1 0xA6 -#define TX_PWR_HT_MCS_0_1_MASK (0x3f) -#define TX_PWR_HT_MCS_0_1_SIGN (1 << 6) -#define TX_PWR_HT_MCS_0_1_EN (1 << 7) -#define TX_PWR_HT_MCS_2_3_MASK (0x3f << 8) -#define TX_PWR_HT_MCS_2_3_SIGN (1 << 14) -#define TX_PWR_HT_MCS_2_3_EN (1 << 15) - -#define TX_PWR_HT_MCS_4_5 0xA8 -#define TX_PWR_HT_MCS_4_5_MASK (0x3f) -#define TX_PWR_HT_MCS_4_5_SIGN (1 << 6) -#define TX_PWR_HT_MCS_4_5_EN (1 << 7) -#define TX_PWR_HT_MCS_6_7_MASK (0x3f << 8) -#define TX_PWR_HT_MCS_6_7_SIGN (1 << 14) -#define TX_PWR_HT_MCS_6_7_EN (1 << 15) - -#define TX_PWR_HT_MCS_8_9 0xAA -#define TX_PWR_HT_MCS_8_9_MASK (0x3f) -#define TX_PWR_HT_MCS_8_9_SIGN (1 << 6) -#define TX_PWR_HT_MCS_8_9_EN (1 << 7) -#define TX_PWR_HT_MCS_10_11_MASK (0x3f << 8) -#define TX_PWR_HT_MCS_10_11_SIGN (1 << 14) -#define TX_PWR_HT_MCS_10_11_EN (1 << 15) - -#define TX_PWR_HT_MCS_12_13 0xAC -#define TX_PWR_HT_MCS_12_13_MASK (0x3f) -#define TX_PWR_HT_MCS_12_13_SIGN (1 << 6) -#define TX_PWR_HT_MCS_12_13_EN (1 << 7) -#define TX_PWR_HT_MCS_14_15_MASK (0x3f << 8) -#define TX_PWR_HT_MCS_14_15_SIGN (1 << 14) -#define TX_PWR_HT_MCS_14_15_EN (1 << 15) - -#define CONFIG_G_BAND_CHL 0xB0 -#define CONFIG_G_BAND_CHL_GRP1_MASK (0xff) -#define CONFIG_G_BAND_CHL_GRP2_MASK (0xff << 8) - -#define TX_PWR_A_BAND_OFDM_6_9M 0xB2 -#define TX_PWR_A_BAND_OFDM_6_9M_MASK (0x3f) -#define TX_PWR_A_BAND_OFDM_6_9M_SIGN (1 << 6) -#define TX_PWR_A_BAND_OFDM_6_9M_EN (1 << 7) -#define TX_PWR_A_BAND_OFDM_12_18M_MASK (0x3f << 8) -#define TX_PWR_A_BAND_OFDM_12_18M_SIGN (1 << 14) -#define TX_PWR_A_BAND_OFDM_12_18M_EN (1 << 15) - -#define TX_PWR_A_BAND_OFDM_24_36M 0xB4 -#define TX_PWR_A_BAND_OFDM_24_36M_MASK (0x3f) -#define TX_PWR_A_BAND_OFDM_24_36M_SIGN (1 << 6) -#define TX_PWR_A_BAND_OFDM_24_36M_EN (1 << 7) -#define TX_PWR_A_BAND_OFDM_48_54M_MASK (0x3f << 8) -#define TX_PWR_A_BAND_OFDM_48_54M_SIGN (1 << 14) -#define TX_PWR_A_BAND_OFDM_48_54M_EN (1 << 15) - -#define CONFIG1_A_BAND_CHL 0xB6 -#define CONFIG1_A_BAND_CHL_GRP1_MASK 0xff -#define CONFIG1_A_BAND_CHL_GRP2_MASK (0xff << 8) - -#define CONFIG2_A_BAND_CHL 0xB8 -#define CONFIG2_A_BAND_CHL_GRP1_MASK (0xff) -#define CONFIG2_A_BAND_CHL_GRP2_MASK (0xff << 8) - -#define TX_PWR_VHT_MCS_0_1 0xBA -#define TX_PWR_VHT_MCS_0_1_MASK (0x3f) -#define TX_PWR_VHT_MCS_0_1_SIGN (1 << 6) -#define TX_PWR_VHT_MCS_0_1_EN (1 << 7) -#define TX_PWR_VHT_MCS_2_3_MASK (0x3f << 8) -#define TX_PWR_VHT_MCS_2_3_SIGN (1 << 14) -#define TX_PWR_VHT_MCS_2_3_EN (1 << 15) - -#define TX_PWR_VHT_MCS_4_5 0xBC -#define TX_PWR_VHT_MCS_4_5_MASK (0x3f) -#define TX_PWR_VHT_MCS_4_5_SIGN (1 << 6) -#define TX_PWR_VHT_MCS_4_5_EN (1 << 7) -#define TX_PWR_VHT_MCS_6_7_MASK (0x3f << 8) -#define TX_PWR_VHT_MCS_6_7_SIGN (1 << 14) -#define TX_PWR_VHT_MCS_6_7_EN (1 << 15) - -#define TX_PWR_5G_VHT_MCS_8_9 0xBE -#define TX_PWR_5G_VHT_MCS_8_9_MASK (0x3f) -#define TX_PWR_5G_VHT_MCS_8_9_SIGN (1 << 6) -#define TX_PWR_5G_VHT_MCS_8_9_EN (1 << 7) -#define TX_PWR_2G_VHT_MCS_8_9_MASK (0x3f << 8) -#define TX_PWR_2G_VHT_MCS_8_9_SIGN (1 << 14) -#define TX_PWR_2G_VHT_MCS_8_9_EN (1 << 15) - -#ifndef MT_MAC -#define CP_FT_VERSION 0xF6 -#endif /* ! MT_MAC */ -#define CP_FT_VERSION_MASK 0xFF - -#define RF_2G_RX_HIGH_GAIN 0xF8 -#define RF0_2G_RX_HIGH_GAIN_MASK (0x07 << 8) -#define RF0_2G_RX_HIGH_GAIN_SIGN (1 << 11) -#define RF1_2G_RX_HIGH_GAIN_MASK (0x07 << 12) -#define RF1_2G_RX_HIGH_GAIN_SIGN (1 << 15) - -#define RF_5G_GRP0_1_RX_HIGH_GAIN 0xFA -#define RF0_5G_GRP0_RX_HIGH_GAIN_MASK (0x07) -#define RF0_5G_GRP0_RX_HIGH_GAIN_SIGN (1 << 3) -#define RF1_5G_GRP0_RX_HIGH_GAIN_MASK (0x07 << 4) -#define RF1_5G_GRP0_RX_HIGH_GAIN_SIGN (1 << 7) -#define RF0_5G_GRP1_RX_HIGH_GAIN_MASK (0x07 << 8) -#define RF0_5G_GRP1_RX_HIGH_GAIN_SIGN (1 << 11) -#define RF1_5G_GRP1_RX_HIGH_GAIN_MASK (0x07 << 12) -#define RF1_5G_GRP1_RX_HIGH_GAIN_SIGN (1 << 15) - -#define RF_5G_GRP2_3_RX_HIGH_GAIN 0xFC -#define RF0_5G_GRP2_RX_HIGH_GAIN_MASK (0x07) -#define RF0_5G_GRP2_RX_HIGH_GAIN_SIGN (1 << 3) -#define RF1_5G_GRP2_RX_HIGH_GAIN_MASK (0x07 << 4) -#define RF1_5G_GRP2_RX_HIGH_GAIN_SIGN (1 << 7) -#define RF0_5G_GRP3_RX_HIGH_GAIN_MASK (0x07 << 8) -#define RF0_5G_GRP3_RX_HIGH_GAIN_SIGN (1 << 11) -#define RF1_5G_GRP3_RX_HIGH_GAIN_MASK (0x07 << 12) -#define RF1_5G_GRP3_RX_HIGH_GAIN_SIGN (1 << 15) - -#define RF_5G_GRP4_5_RX_HIGH_GAIN 0xFE -#define RF0_5G_GRP4_RX_HIGH_GAIN_MASK (0x07) -#define RF0_5G_GRP4_RX_HIGH_GAIN_SIGN (1 << 3) -#define RF1_5G_GRP4_RX_HIGH_GAIN_MASK (0x07 << 4) -#define RF1_5G_GRP4_RX_HIGH_GAIN_SIGN (1 << 7) -#define RF0_5G_GRP5_RX_HIGH_GAIN_MASK (0x07 << 8) -#define RF0_5G_GRP5_RX_HIGH_GAIN_SIGN (1 << 11) -#define RF1_5G_GRP5_RX_HIGH_GAIN_MASK (0x07 << 12) -#define RF1_5G_GRP5_RX_HIGH_GAIN_SIGN (1 << 15) - -#define BT_RCAL_RESULT 0x138 -#define BT_VCDL_CALIBRATION 0x13C -#define BT_PMUCFG 0x13E - -struct _RTMP_ADAPTER; - -#ifdef RTMP_PCI_SUPPORT -/************************************************************************* - * Public function declarations for prom-based chipset - ************************************************************************/ -BOOLEAN rtmp_ee_prom_read16(struct _RTMP_ADAPTER *pAd, UINT16 Offset, - UINT16 *pVal); -int rtmp_ee_prom_write16(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT val); -#endif /* RTMP_PCI_SUPPORT */ - -#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) -/************************************************************************* - * Public function declarations for flash-based chipset - ************************************************************************/ -NDIS_STATUS rtmp_nv_init(struct _RTMP_ADAPTER *pAd); -RTMP_STRING *get_dev_eeprom_binary(VOID *pvAd); -UINT get_dev_eeprom_offset(VOID *pvAd); -UINT get_dev_eeprom_size(VOID *pvAd); -BOOLEAN rtmp_ee_flash_read(struct _RTMP_ADAPTER *pAd, USHORT Offset, - USHORT *pVal); -int rtmp_ee_flash_write(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT data); -BOOLEAN rtmp_ee_flash_read_with_range(struct _RTMP_ADAPTER *pAd, UINT16 start, - UINT16 Length, UCHAR *pbuf); -int rtmp_ee_flash_write_with_range(struct _RTMP_ADAPTER *pAd, USHORT start, - USHORT Length, UCHAR *pbuf); -VOID rtmp_ee_flash_read_all(struct _RTMP_ADAPTER *pAd, USHORT *Data); -VOID rtmp_ee_flash_write_all(struct _RTMP_ADAPTER *pAd); -#endif /* defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) */ - -#ifdef RTMP_EFUSE_SUPPORT -/************************************************************************* - * Public function declarations for efuse-based chipset - ************************************************************************/ -BOOLEAN rtmp_ee_efuse_read16(struct _RTMP_ADAPTER *pAd, USHORT Offset, - USHORT *pVal); -int rtmp_ee_efuse_write16(struct _RTMP_ADAPTER *pAd, USHORT Offset, - USHORT data); -INT rtmp_ee_write_to_efuse(struct _RTMP_ADAPTER *pAd); - -NTSTATUS eFuseRead(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT *pData, - USHORT len); -NTSTATUS eFuseWrite(struct _RTMP_ADAPTER *pAd, USHORT Offset, USHORT *pData, - USHORT len); - -VOID eFuseGetFreeBlockCount(struct _RTMP_ADAPTER *pAd, UINT *EfuseFreeBlock); - -INT eFuse_init(struct _RTMP_ADAPTER *pAd); -INT efuse_probe(struct _RTMP_ADAPTER *pAd); -#endif /* RTMP_EFUSE_SUPPORT */ - -/************************************************************************* - * Public function declarations for using BIN buffer mode to access eeprom contents - ************************************************************************/ -BOOLEAN rtmp_ee_bin_read16(struct _RTMP_ADAPTER *pAd, UINT16 Offset, - UINT16 *pValue); - -INT rtmp_ee_bin_write16(IN struct _RTMP_ADAPTER *pAd, IN USHORT Offset, - IN USHORT data); - -INT rtmp_ee_load_from_bin(IN struct _RTMP_ADAPTER *pAd); - -INT rtmp_ee_write_to_bin(IN struct _RTMP_ADAPTER *pAd); - -#ifdef BB_SOC -BOOLEAN rtmp_ee_bin_read_with_range(struct _RTMP_ADAPTER *pAd, UINT16 start, - UINT16 Length, UCHAR *pbuf); -int rtmp_ee_bin_write_with_range(struct _RTMP_ADAPTER *pAd, USHORT start, - USHORT Length, UCHAR *pbuf); -#endif - -INT rtmp_ee_write_to_prom(struct _RTMP_ADAPTER *pAd); - -INT Set_LoadEepromBufferFromBin_Proc(struct _RTMP_ADAPTER *pAd, - RTMP_STRING *arg); - -INT Set_EepromBufferWriteBack_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_bufferMode_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT show_e2pinfo_proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#if defined(PRE_CAL_TRX_SET1_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) || \ - defined(RLM_CAL_CACHE_SUPPORT) -NDIS_STATUS rtmp_cal_load_from_bin(IN struct _RTMP_ADAPTER *pAd, IN UCHAR *buf, - IN ULONG offset, IN ULONG len); - -NDIS_STATUS rtmp_cal_write_to_bin(IN struct _RTMP_ADAPTER *pAd, IN UCHAR *buf, - IN ULONG offset, IN ULONG len); -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -INT Cal_Data_Write_To_Bin(IN struct _RTMP_ADAPTER *pAd, IN UINT8 *Buf, - IN UINT32 Offset, IN UINT32 Len); - -INT Cal_Data_Load_From_Bin(IN struct _RTMP_ADAPTER *pAd, IN UINT8 *Buf, - IN UINT32 Offset, IN UINT32 Len); -#endif /* CAL_BIN_FILE_SUPPORT */ - -#ifdef CAL_FREE_IC_SUPPORT -INT Set_LoadCalFreeData_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CheckCalFree_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -/************************************************************************* - * Public function declarations for prom operation callback functions setting - ************************************************************************/ -INT RtmpChipOpsEepromHook(struct _RTMP_ADAPTER *pAd, INT infType, - INT forceMode); - -INT NICReadEEPROMParameters(struct _RTMP_ADAPTER *pAd, RTMP_STRING *mac_addr); - -#endif /* __EEPROM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_ePAeLNA.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_ePAeLNA.h deleted file mode 100644 index 54c9c5b73c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_ePAeLNA.h +++ /dev/null @@ -1,105 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7615_E2PImage1_ePAeLNA[] = { - 0x15, 0x76, 0xa0, 0x00, 0x00, 0x0c, 0x43, 0x28, 0x05, 0xab, 0x15, 0x76, - 0xc3, 0x14, 0x00, 0x80, 0x02, 0x00, 0xc3, 0x14, 0x15, 0x76, 0x03, 0x22, - 0xff, 0xff, 0x23, 0x04, 0x0d, 0x02, 0x8f, 0x02, 0x00, 0x80, 0x0a, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x44, 0x00, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, - 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0xe0, 0x01, 0x20, 0x20, 0x00, 0xb3, - 0x40, 0xb6, 0x00, 0x00, 0x1e, 0xca, 0xc9, 0xca, 0x00, 0x00, 0x1e, 0xc5, - 0xc4, 0xc3, 0x00, 0x00, 0x1e, 0xc4, 0xc5, 0xc8, 0x00, 0x00, 0x1e, 0xc7, - 0xc6, 0xc7, 0x00, 0x00, 0x0f, 0xc6, 0xc3, 0x00, 0x00, 0x0f, 0xc4, 0xc3, - 0x00, 0x00, 0x0f, 0xc5, 0xc4, 0x00, 0x00, 0x0f, 0xc3, 0xc3, 0x00, 0x00, - 0x0f, 0xc3, 0xc4, 0x00, 0x00, 0x0f, 0xc5, 0xc5, 0x00, 0x00, 0x0f, 0xc5, - 0xc4, 0x00, 0x00, 0x0f, 0xc5, 0xc5, 0x00, 0x00, 0x0f, 0xc3, 0xc3, 0x00, - 0x00, 0x0f, 0xc2, 0xc2, 0x00, 0x00, 0x0f, 0xc3, 0xc2, 0x00, 0x00, 0x0f, - 0xc2, 0xc2, 0x00, 0x00, 0x0f, 0xc2, 0xc3, 0x00, 0x00, 0x0f, 0xc4, 0xc4, - 0x00, 0x00, 0x0f, 0xc4, 0xc2, 0x00, 0x00, 0x0f, 0xc2, 0xc1, 0xc7, 0xc7, - 0xc7, 0xc7, 0xc6, 0x00, 0x00, 0xc7, 0x00, 0xc7, 0xc6, 0x00, 0x00, 0x00, - 0x82, 0xc7, 0xc7, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xc7, 0xc5, - 0x00, 0x00, 0xc7, 0x00, 0xc7, 0xc5, 0x00, 0x00, 0x00, 0x82, 0x82, 0xc7, - 0xc7, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc4, - 0xc2, 0x00, 0x00, 0x0f, 0x80, 0x80, 0x00, 0x00, 0x0f, 0xc2, 0xc1, 0x00, - 0x00, 0x0f, 0x80, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x80, 0x00, 0x00, 0x0f, - 0xc2, 0xc1, 0x00, 0x00, 0x0f, 0x81, 0x82, 0x00, 0x00, 0x0f, 0x82, 0x82, - 0x00, 0x00, 0x0f, 0xc4, 0xc2, 0x81, 0x00, 0x0f, 0xc2, 0xc2, 0x00, 0x00, - 0x0f, 0xc2, 0xc2, 0x00, 0x00, 0x0f, 0xc1, 0x80, 0x00, 0x00, 0x0f, 0x80, - 0xc1, 0x00, 0x00, 0x0f, 0xc2, 0xc1, 0x00, 0x00, 0x0f, 0x80, 0x82, 0x00, - 0x00, 0x0f, 0x82, 0x82, 0x00, 0x00, 0x00, 0x1b, 0x24, 0x2e, 0x38, 0x40, - 0x01, 0x42, 0x4a, 0x50, 0x58, 0x5d, 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, - 0x00, 0x1e, 0x29, 0x30, 0x38, 0x3e, 0x01, 0x40, 0x44, 0x49, 0x4e, 0x53, - 0x58, 0x5d, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_ePAiLNA.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_ePAiLNA.h deleted file mode 100644 index 8ade1a8d18..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_ePAiLNA.h +++ /dev/null @@ -1,105 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7615_E2PImage1_ePAiLNA[] = { - 0x15, 0x76, 0xa0, 0x00, 0x00, 0x0c, 0x43, 0x28, 0x05, 0xab, 0x15, 0x76, - 0xc3, 0x14, 0x00, 0x80, 0x02, 0x00, 0xc3, 0x14, 0x15, 0x76, 0x03, 0x22, - 0xff, 0xff, 0x23, 0x04, 0x0d, 0x02, 0x8f, 0x02, 0x00, 0x80, 0x0a, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x44, 0x00, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0xe0, 0x01, 0x20, 0x20, 0x00, 0xb3, - 0x40, 0xb6, 0x00, 0x00, 0x1e, 0xca, 0xc9, 0xca, 0x00, 0x00, 0x1e, 0xc5, - 0xc4, 0xc3, 0x00, 0x00, 0x1e, 0xc4, 0xc5, 0xc8, 0x00, 0x00, 0x1e, 0xc7, - 0xc6, 0xc7, 0x00, 0x00, 0x0f, 0xc6, 0xc3, 0x00, 0x00, 0x0f, 0xc4, 0xc3, - 0x00, 0x00, 0x0f, 0xc5, 0xc4, 0x00, 0x00, 0x0f, 0xc3, 0xc3, 0x00, 0x00, - 0x0f, 0xc3, 0xc4, 0x00, 0x00, 0x0f, 0xc5, 0xc5, 0x00, 0x00, 0x0f, 0xc5, - 0xc4, 0x00, 0x00, 0x0f, 0xc5, 0xc5, 0x00, 0x00, 0x0f, 0xc3, 0xc3, 0x00, - 0x00, 0x0f, 0xc2, 0xc2, 0x00, 0x00, 0x0f, 0xc3, 0xc2, 0x00, 0x00, 0x0f, - 0xc2, 0xc2, 0x00, 0x00, 0x0f, 0xc2, 0xc3, 0x00, 0x00, 0x0f, 0xc4, 0xc4, - 0x00, 0x00, 0x0f, 0xc4, 0xc2, 0x00, 0x00, 0x0f, 0xc2, 0xc1, 0xc7, 0xc7, - 0xc7, 0xc7, 0xc6, 0x00, 0x00, 0xc7, 0x00, 0xc7, 0xc6, 0x00, 0x00, 0x00, - 0x82, 0xc7, 0xc7, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xc7, 0xc5, - 0x00, 0x00, 0xc7, 0x00, 0xc7, 0xc5, 0x00, 0x00, 0x00, 0x82, 0x82, 0xc7, - 0xc7, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc4, - 0xc2, 0x00, 0x00, 0x0f, 0x80, 0x80, 0x00, 0x00, 0x0f, 0xc2, 0xc1, 0x00, - 0x00, 0x0f, 0x80, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x80, 0x00, 0x00, 0x0f, - 0xc2, 0xc1, 0x00, 0x00, 0x0f, 0x81, 0x82, 0x00, 0x00, 0x0f, 0x82, 0x82, - 0x00, 0x00, 0x0f, 0xc4, 0xc2, 0x81, 0x00, 0x0f, 0xc2, 0xc2, 0x00, 0x00, - 0x0f, 0xc2, 0xc2, 0x00, 0x00, 0x0f, 0xc1, 0x80, 0x00, 0x00, 0x0f, 0x80, - 0xc1, 0x00, 0x00, 0x0f, 0xc2, 0xc1, 0x00, 0x00, 0x0f, 0x80, 0x82, 0x00, - 0x00, 0x0f, 0x82, 0x82, 0x00, 0x00, 0x00, 0x1b, 0x24, 0x2e, 0x38, 0x40, - 0x01, 0x42, 0x4a, 0x50, 0x58, 0x5d, 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, - 0x00, 0x1e, 0x29, 0x30, 0x38, 0x3e, 0x01, 0x40, 0x44, 0x49, 0x4e, 0x53, - 0x58, 0x5d, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_iPAeLNA.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_iPAeLNA.h deleted file mode 100644 index e6a8df272a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_iPAeLNA.h +++ /dev/null @@ -1,91 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7615_E2PImage1_iPAeLNA[] = { - 0x15, 0x76, 0xa0, 0x00, 0x00, 0x0c, 0x43, 0x26, 0x60, 0x00, 0x15, 0x76, - 0xc3, 0x14, 0x00, 0x80, 0x02, 0x00, 0xc3, 0x14, 0x15, 0x76, 0x03, 0x22, - 0xff, 0xff, 0x23, 0x04, 0x0d, 0x02, 0x8f, 0x02, 0x00, 0x80, 0x0a, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x60, 0x01, 0x01, 0x00, 0x00, - 0x14, 0x00, 0x05, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x20, 0x20, 0x00, 0xb3, - 0x40, 0xb6, 0x40, 0xc4, 0x14, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x14, 0x00, - 0x00, 0x00, 0xc0, 0xc4, 0x14, 0x00, 0x00, 0x00, 0x40, 0xc4, 0x14, 0x00, - 0x00, 0x00, 0x40, 0xc5, 0x14, 0x00, 0x00, 0xc0, 0xc4, 0x14, 0x00, 0x00, - 0xc0, 0xc3, 0x14, 0x00, 0x00, 0x40, 0xc3, 0x14, 0x00, 0x00, 0x40, 0xc2, - 0x14, 0x00, 0x00, 0x40, 0xc2, 0x14, 0x00, 0x00, 0x40, 0xc2, 0x14, 0x00, - 0x00, 0xc0, 0xc2, 0x14, 0x00, 0x00, 0x40, 0xc3, 0x14, 0x00, 0x00, 0x40, - 0xc3, 0x14, 0x00, 0x00, 0x40, 0xc3, 0x14, 0x00, 0x00, 0xc0, 0xc2, 0x14, - 0x00, 0x00, 0x40, 0xc2, 0x14, 0x00, 0x00, 0xc0, 0xc1, 0x14, 0x00, 0x00, - 0x40, 0xc1, 0x14, 0x00, 0x00, 0xc0, 0xc0, 0x14, 0x00, 0x00, 0xc6, 0xc6, - 0xc4, 0xc4, 0xc4, 0x00, 0x00, 0xc2, 0x00, 0xc2, 0xc1, 0x81, 0x81, 0x81, - 0x85, 0xc2, 0xc2, 0x00, 0x82, 0x82, 0x82, 0x81, 0x00, 0xc5, 0xc5, 0xc5, - 0x00, 0x00, 0xc3, 0x00, 0xc3, 0xc3, 0x82, 0x82, 0x82, 0x83, 0x84, 0xc3, - 0xc3, 0xc3, 0x82, 0x82, 0x82, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc1, 0x14, 0x00, - 0x00, 0xc0, 0xc1, 0x14, 0x00, 0x00, 0x40, 0xc1, 0x14, 0x00, 0x00, 0x40, - 0xc1, 0x14, 0x00, 0x00, 0x40, 0xc1, 0x14, 0x00, 0x00, 0xc0, 0xc0, 0x14, - 0x00, 0x00, 0xc0, 0xc0, 0x14, 0x00, 0x00, 0xc0, 0xc0, 0x14, 0x00, 0x00, - 0xc0, 0xc5, 0x14, 0x00, 0x00, 0x40, 0xc5, 0x14, 0x00, 0x00, 0x40, 0xc4, - 0x14, 0x00, 0x00, 0xc0, 0xc3, 0x14, 0x00, 0x00, 0x40, 0xc3, 0x14, 0x00, - 0x00, 0xc0, 0xc2, 0x14, 0x00, 0x00, 0xc0, 0xc2, 0x14, 0x00, 0x00, 0xc0, - 0xc2, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_iPAiLNA.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_iPAiLNA.h deleted file mode 100644 index 8f5758ab7e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7615_e2p_iPAiLNA.h +++ /dev/null @@ -1,91 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7615_E2PImage1_iPAiLNA[] = { - 0x15, 0x76, 0xa0, 0x00, 0x00, 0x0c, 0x43, 0x26, 0x60, 0x00, 0x15, 0x76, - 0xc3, 0x14, 0x00, 0x80, 0x02, 0x00, 0xc3, 0x14, 0x15, 0x76, 0x03, 0x22, - 0xff, 0xff, 0x23, 0x04, 0x0d, 0x02, 0x8f, 0x02, 0x00, 0x80, 0x0a, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x60, 0x01, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x20, 0x20, 0x00, 0xb3, - 0x40, 0xb6, 0x40, 0xc4, 0x14, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x14, 0x00, - 0x00, 0x00, 0xc0, 0xc4, 0x14, 0x00, 0x00, 0x00, 0x40, 0xc4, 0x14, 0x00, - 0x00, 0x00, 0x40, 0xc5, 0x14, 0x00, 0x00, 0xc0, 0xc4, 0x14, 0x00, 0x00, - 0xc0, 0xc3, 0x14, 0x00, 0x00, 0x40, 0xc3, 0x14, 0x00, 0x00, 0x40, 0xc2, - 0x14, 0x00, 0x00, 0x40, 0xc2, 0x14, 0x00, 0x00, 0x40, 0xc2, 0x14, 0x00, - 0x00, 0xc0, 0xc2, 0x14, 0x00, 0x00, 0x40, 0xc3, 0x14, 0x00, 0x00, 0x40, - 0xc3, 0x14, 0x00, 0x00, 0x40, 0xc3, 0x14, 0x00, 0x00, 0xc0, 0xc2, 0x14, - 0x00, 0x00, 0x40, 0xc2, 0x14, 0x00, 0x00, 0xc0, 0xc1, 0x14, 0x00, 0x00, - 0x40, 0xc1, 0x14, 0x00, 0x00, 0xc0, 0xc0, 0x14, 0x00, 0x00, 0xc6, 0xc6, - 0xc4, 0xc4, 0xc4, 0x00, 0x00, 0xc2, 0x00, 0xc2, 0xc1, 0x81, 0x81, 0x81, - 0x85, 0xc2, 0xc2, 0x00, 0x82, 0x82, 0x82, 0x81, 0x00, 0xc5, 0xc5, 0xc5, - 0x00, 0x00, 0xc3, 0x00, 0xc3, 0xc3, 0x82, 0x82, 0x82, 0x83, 0x84, 0xc3, - 0xc3, 0xc3, 0x82, 0x82, 0x82, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc1, 0x14, 0x00, - 0x00, 0xc0, 0xc1, 0x14, 0x00, 0x00, 0x40, 0xc1, 0x14, 0x00, 0x00, 0x40, - 0xc1, 0x14, 0x00, 0x00, 0x40, 0xc1, 0x14, 0x00, 0x00, 0xc0, 0xc0, 0x14, - 0x00, 0x00, 0xc0, 0xc0, 0x14, 0x00, 0x00, 0xc0, 0xc0, 0x14, 0x00, 0x00, - 0xc0, 0xc5, 0x14, 0x00, 0x00, 0x40, 0xc5, 0x14, 0x00, 0x00, 0x40, 0xc4, - 0x14, 0x00, 0x00, 0xc0, 0xc3, 0x14, 0x00, 0x00, 0x40, 0xc3, 0x14, 0x00, - 0x00, 0xc0, 0xc2, 0x14, 0x00, 0x00, 0xc0, 0xc2, 0x14, 0x00, 0x00, 0xc0, - 0xc2, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_ePAeLNA.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_ePAeLNA.h deleted file mode 100644 index 9c93166e04..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_ePAeLNA.h +++ /dev/null @@ -1,91 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7622_E2PImage_ePAeLNA[] = { - 0x22, 0x76, 0x02, 0x00, 0x00, 0x0c, 0x43, 0x26, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x28, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xb3, - 0x40, 0xb6, 0x2a, 0xd0, 0x14, 0x00, 0x00, 0x00, 0x29, 0xd0, 0x14, 0x00, - 0x00, 0x00, 0x2a, 0xd0, 0x14, 0x00, 0x00, 0x00, 0xaa, 0xd0, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, - 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0x84, 0x84, 0x84, - 0x86, 0xc6, 0xc6, 0xc6, 0x84, 0x84, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x2e, 0x00, 0xa0, 0x00, 0x00, 0x87, 0x8b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x1a, 0x22, 0x29, 0x2f, - 0x00, 0x2f, 0x36, 0x3c, 0x42, 0x48, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_iPAeLNA.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_iPAeLNA.h deleted file mode 100644 index edc2e86ff3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_iPAeLNA.h +++ /dev/null @@ -1,91 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7622_E2PImage_iPAeLNA[] = { - 0x22, 0x76, 0x02, 0x00, 0x00, 0x0c, 0x43, 0x26, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x24, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xb3, - 0x40, 0xb6, 0xc3, 0xc3, 0x26, 0x00, 0x00, 0x00, 0x41, 0xc4, 0x26, 0x00, - 0x00, 0x00, 0x41, 0xc4, 0x26, 0x00, 0x00, 0x00, 0xc0, 0xc5, 0x26, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, - 0xc3, 0xc3, 0xc2, 0xc1, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x83, 0x83, 0x83, - 0x85, 0xc1, 0xc1, 0x82, 0x85, 0x85, 0x85, 0x82, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x87, 0x8b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_iPAiLNA.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_iPAiLNA.h deleted file mode 100644 index f7caadb2c4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt7622_e2p_iPAiLNA.h +++ /dev/null @@ -1,91 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7622_E2PImage_iPAiLNA[] = { - 0x22, 0x76, 0x02, 0x00, 0x00, 0x0c, 0x43, 0x26, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xb3, - 0x40, 0xb6, 0xc3, 0xc3, 0x26, 0x00, 0x00, 0x00, 0x41, 0xc4, 0x26, 0x00, - 0x00, 0x00, 0x41, 0xc4, 0x26, 0x00, 0x00, 0x00, 0xc0, 0xc5, 0x26, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, - 0xc3, 0xc3, 0xc2, 0xc1, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x83, 0x83, 0x83, - 0x85, 0xc1, 0xc1, 0x82, 0x85, 0x85, 0x85, 0x82, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x2e, 0x00, 0xa0, 0x00, 0x00, 0x87, 0x8b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt_dmac_e2p_def.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt_dmac_e2p_def.h deleted file mode 100644 index 004175f159..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt_dmac_e2p_def.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_dmac_e2p_def.h -*/ - -#ifndef __MT_DMAC_E2P_DEF_H__ -#define __MT_DMAC_E2P_DEF_H__ - -#define DMAC_TX0_G_BAND_TARGET_PWR 0x58 -#define DMAC_TX1_G_BAND_TARGET_PWR 0x5E -#define DMAC_TX2_G_BAND_TARGET_PWR 0x64 -#define DMAC_TX3_G_BAND_TARGET_PWR 0x6A - -#define DMAC_GRP0_TX0_A_BAND_TARGET_PWR 0x70 -#define DMAC_GRP1_TX0_A_BAND_TARGET_PWR 0x75 -#define DMAC_GRP2_TX0_A_BAND_TARGET_PWR 0x7A -#define DMAC_GRP3_TX0_A_BAND_TARGET_PWR 0x7F -#define DMAC_GRP4_TX0_A_BAND_TARGET_PWR 0x84 -#define DMAC_GRP5_TX0_A_BAND_TARGET_PWR 0x89 -#define DMAC_GRP6_TX0_A_BAND_TARGET_PWR 0x8E -#define DMAC_GRP7_TX0_A_BAND_TARGET_PWR 0x93 - -#define DMAC_GRP0_TX1_A_BAND_TARGET_PWR 0x98 -#define DMAC_GRP1_TX1_A_BAND_TARGET_PWR 0x9D -#define DMAC_GRP2_TX1_A_BAND_TARGET_PWR 0xA2 -#define DMAC_GRP3_TX1_A_BAND_TARGET_PWR 0xA7 -#define DMAC_GRP4_TX1_A_BAND_TARGET_PWR 0xAC -#define DMAC_GRP5_TX1_A_BAND_TARGET_PWR 0xB1 -#define DMAC_GRP6_TX1_A_BAND_TARGET_PWR 0xB6 -#define DMAC_GRP7_TX1_A_BAND_TARGET_PWR 0xBB - -#define DMAC_GRP0_TX2_A_BAND_TARGET_PWR 0x142 -#define DMAC_GRP1_TX2_A_BAND_TARGET_PWR 0x147 -#define DMAC_GRP2_TX2_A_BAND_TARGET_PWR 0x14C -#define DMAC_GRP3_TX2_A_BAND_TARGET_PWR 0x151 -#define DMAC_GRP4_TX2_A_BAND_TARGET_PWR 0x156 -#define DMAC_GRP5_TX2_A_BAND_TARGET_PWR 0x15B -#define DMAC_GRP6_TX2_A_BAND_TARGET_PWR 0x160 -#define DMAC_GRP7_TX2_A_BAND_TARGET_PWR 0x165 - -#define DMAC_GRP0_TX3_A_BAND_TARGET_PWR 0x16A -#define DMAC_GRP1_TX3_A_BAND_TARGET_PWR 0x16F -#define DMAC_GRP2_TX3_A_BAND_TARGET_PWR 0x174 -#define DMAC_GRP3_TX3_A_BAND_TARGET_PWR 0x179 -#define DMAC_GRP4_TX3_A_BAND_TARGET_PWR 0x17E -#define DMAC_GRP5_TX3_A_BAND_TARGET_PWR 0x183 -#define DMAC_GRP6_TX3_A_BAND_TARGET_PWR 0x188 -#define DMAC_GRP7_TX3_A_BAND_TARGET_PWR 0x18D - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt_e2p_def.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt_e2p_def.h deleted file mode 100644 index ce69d7a290..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/eeprom/mt_e2p_def.h +++ /dev/null @@ -1,426 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_e2p_def.h -*/ - -#ifndef __MT_E2P_DEF_H__ -#define __MT_E2P_DEF_H__ - -#define NIC_CONFIGURE_0 0x34 -#define EXTERNAL_PA_MASK (0x3 << 8) -#define GET_PA_TYPE(p) (((p)&EXTERNAL_PA_MASK) >> 8) - -#define NIC_CONFIGURE_0_TOP 0x35 - -#define NIC_CONFIGURE_1 0x36 -#define INTERNAL_TX_ALC_EN (1 << 13) - -#define NIC_CONFIGURE_1_TOP 0x37 - -#define XTAL_TRIM1 0x3A -#define XTAL_TRIM1_DIP_SELECTION (1 << 7) -#define XTAL_TRIM1_MASK (0x7F) - -#define WIFI_RF_SETTING 0x48 - -#define G_BAND_20_40_BW_PWR_DELTA 0x50 -#define G_BAND_20_40_BW_PWR_DELTA_MASK (0x3f) -#define G_BAND_20_40_BW_PWR_DELTA_SIGN (1 << 6) -#define G_BAND_20_40_BW_PWR_DELTA_EN (1 << 7) -#define A_BAND_20_40_BW_PWR_DELTA_MASK (0x3f << 8) -#define A_BAND_20_40_BW_PWR_DELTA_SIGN (1 << 14) -#define A_BAND_20_40_BW_PWR_DELTA_EN (1 << 15) - -#define A_BAND_20_80_BW_PWR_DELTA 0x52 -#define A_BAND_20_80_BW_PWR_DELTA_MASK (0x3f) -#define A_BAND_20_80_BW_PWR_DELTA_SIGN (1 << 6) -#define A_BAND_20_80_BW_PWR_DELTA_EN (1 << 7) -#define G_BAND_EXT_PA_SETTING_MASK (0x7f << 8) -#define G_BAND_EXT_PA_SETTING_EN (1 << 15) - -#define A_BAND_20_80_BW_PWR_DELTA_ANALOG 0x53 - -#define THADC_ANALOG_PART 0x53 -#define THADC_SLOP 0x54 -#define THERMO_SLOPE_VARIATION_MASK (0x1f) -#define A_BAND_EXT_PA_SETTING 0x54 -#define A_BAND_EXT_PA_SETTING_MASK (0x7f) -#define A_BAND_EXT_PA_SETTING_EN (1 << 7) -#define TEMP_SENSOR_CAL_MASK (0x7f << 8) -#define TEMP_SENSOR_CAL_EN (1 << 15) - -#define TEMP_SENSOR_CAL 0x55 -#define TEMPERATURE_SENSOR_CALIBRATION 0x55 -#define THERMO_REF_ADC_VARIATION_MASK (0x7f) - -#define TX0_G_BAND_TSSI_SLOPE 0x56 -#define TX0_G_BAND_TSSI_SLOPE_MASK (0xff) -#define TX0_G_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define TX0_G_BAND_TSSI_SLOPE_TOP 0x57 - -#define TX0_G_BAND_TARGET_PWR 0x58 -#define TX0_G_BAND_TARGET_PWR_MASK (0xff) -#define TX0_G_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define TX0_G_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define TX0_G_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define TX0_G_BAND_OFFSET_LOW 0x59 - -#define TX0_G_BAND_CHL_PWR_DELTA_MID 0x5A -#define TX0_G_BAND_CHL_PWR_DELTA_MID_MASK (0x3f) -#define TX0_G_BAND_CHL_PWR_DELTA_MID_SIGN (1 << 6) -#define TX0_G_BAND_CHL_PWR_DELTA_MID_EN (1 << 7) -#define TX0_G_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define TX0_G_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define TX0_G_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define TX0_G_BAND_OFFSET_HIGH 0x5B - -#define TX1_G_BAND_TSSI_SLOPE 0x5C -#define TX1_G_BAND_TSSI_SLOPE_MASK (0xff) -#define TX1_G_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define TX1_G_BAND_TSSI_SLOPE_TOP 0x5D - -#define TX1_G_BAND_TARGET_PWR 0x5E -#define TX1_G_BAND_TARGET_PWR_MASK (0xff) -#define TX1_G_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define TX1_G_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define TX1_G_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define TX1_G_BAND_CHL_PWR_DELATE_LOW 0x5F - -#define TX1_G_BAND_CHL_PWR_DELTA_MID 0x60 -#define TX1_G_BAND_CHL_PWR_DELTA_MID_MASK (0x3f) -#define TX1_G_BAND_CHL_PWR_DELTA_MID_SIGN (1 << 6) -#define TX1_G_BAND_CHL_PWR_DELTA_MID_EN (1 << 7) -#define TX1_G_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define TX1_G_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define TX1_G_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define TX1_G_BAND_CHL_PWR_DELTA_HIGH 0x61 - -#define GRP0_TX0_A_BAND_TSSI_SLOPE 0x62 -#define GRP0_TX0_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP0_TX0_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP0_TX0_A_BAND_TARGET_PWR 0x64 -#define GRP0_TX0_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_HI 0x66 -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP0_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP1_TX0_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP1_TX0_A_BAND_TSSI_OFFSET 0x68 -#define GRP1_TX0_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP1_TX0_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_LOW 0x6A -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP1_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP2_TX0_A_BAND_TSSI_SLOPE 0x6C -#define GRP2_TX0_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP2_TX0_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP2_TX0_A_BAND_TARGET_PWR 0x6E -#define GRP2_TX0_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_HI 0x70 -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP2_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP3_TX0_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP3_TX0_A_BAND_TSSI_OFFSET 0x72 -#define GRP3_TX0_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP3_TX0_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_LOW 0x74 -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP3_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP4_TX0_A_BAND_TSSI_SLOPE 0x76 -#define GRP4_TX0_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP4_TX0_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP4_TX0_A_BAND_TARGET_PWR 0x78 -#define GRP4_TX0_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_HI 0x7A -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP4_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP5_TX0_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP5_TX0_A_BAND_TSSI_OFFSET 0x7C -#define GRP5_TX0_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP5_TX0_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_LOW 0X7E -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP5_TX0_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP0_TX1_A_BAND_TSSI_SLOPE 0x80 -#define GRP0_TX1_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP0_TX1_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP0_TX1_A_BAND_TARGET_PWR 0x82 -#define GRP0_TX1_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_HI 0x84 -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP0_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP1_TX1_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP1_TX1_A_BAND_TSSI_OFFSET 0x86 -#define GRP1_TX1_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP1_TX1_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_LOW 0x88 -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP1_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP2_TX1_A_BAND_TSSI_SLOPE 0x8A -#define GRP2_TX1_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP2_TX1_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP2_TX1_A_BAND_TARGET_PWR 0x8C -#define GRP2_TX1_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_HI 0x8E -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP2_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP3_TX1_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP3_TX1_A_BAND_TSSI_OFFSET 0x90 -#define GRP3_TX1_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP3_TX1_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_LOW 0x92 -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP3_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define GRP4_TX1_A_BAND_TSSI_SLOPE 0x94 -#define GRP4_TX1_A_BAND_TSSI_SLOPE_MASK (0xff) -#define GRP4_TX1_A_BAND_TSSI_OFFSET_MASK (0xff << 8) - -#define GRP4_TX1_A_BAND_TARGET_PWR 0x96 -#define GRP4_TX1_A_BAND_TARGET_PWR_MASK (0xff) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f << 8) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 14) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 15) - -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_HI 0x98 -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 6) -#define GRP4_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 7) -#define GRP5_TX1_A_BAND_TSSI_SLOPE_MASK (0xff << 8) - -#define GRP5_TX1_A_BAND_TSSI_OFFSET 0x9A -#define GRP5_TX1_A_BAND_TSSI_OFFSET_MASK (0xff) -#define GRP5_TX1_A_BAND_TARGET_PWR_MASK (0xff << 8) - -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_LOW 0x9C -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_LOW_MASK (0x3f) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_LOW_SIGN (1 << 6) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_LOW_EN (1 << 7) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_HI_MASK (0x3f << 8) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_HI_SIGN (1 << 14) -#define GRP5_TX1_A_BAND_CHL_PWR_DELTA_HI_EN (1 << 15) - -#define G_BAND_BANDEDGE_PWR_BACK_OFF 0x9E -#define G_BAND_BANDEDGE_PWR_BACK_OFF_MASK (0x7f) -#define G_BAND_BANDEDGE_PWR_BACK_OFF_EN (1 << 7) -#define XTAL_TRIM2_MASK (0x7f << 8) -#define XTAL_TRIM2_DIP_SELECTION (1 << 15) - -#define TX_PWR_CCK_1_2M 0xA0 -#define TX_PWR_CCK_1_2M_MASK (0x3f) -#define TX_PWR_CCK_1_2M_SIGN (1 << 6) -#define TX_PWR_CCK_1_2M_EN (1 << 7) -#define TX_PWR_CCK_5_11M_MASK (0x3f << 8) -#define TX_PWR_CCK_5_11M_SIGN (1 << 14) -#define TX_PWR_CCK_5_11M_EN (1 << 15) - -#define TX_PWR_CCK_5_11M 0xA1 - -#define TX_PWR_G_BAND_OFDM_6_9M 0xA2 -#define TX_PWR_G_BAND_OFDM_6_9M_MASK (0x3f) -#define TX_PWR_G_BAND_OFDM_6_9M_SIGN (1 << 6) -#define TX_PWR_G_BAND_OFDM_6_9M_EN (1 << 7) -#define TX_PWR_G_BAND_OFDM_12_18M_MASK (0x3f << 8) -#define TX_PWR_G_BAND_OFDM_12_18M_SIGN (1 << 14) -#define TX_PWR_G_BAND_OFDM_12_18M_EN (1 << 15) - -#define TX_PWR_OFDM_12_18M 0xA3 - -#define TX_PWR_G_BAND_OFDM_24_36M 0xA4 -#define TX_PWR_G_BAND_OFDM_24_36M_MASK (0x3f) -#define TX_PWR_G_BAND_OFDM_24_36M_SIGN (1 << 6) -#define TX_PWR_G_BAND_OFDM_24_36M_EN (1 << 7) -#define TX_PWR_G_BAND_OFDM_48M_MASK (0x3f << 8) -#define TX_PWR_G_BAND_OFDM_48M_SIGN (1 << 14) -#define TX_PWR_G_BAND_OFDM_48M_EN (1 << 15) - -#define TX_PWR_G_BNAD_OFDM_48 0xA5 - -#ifdef MT_MAC -#define TX_PWR_G_BAND_OFDM_54M 0xA6 -#define TX_PWR_G_BAND_OFDM_54M_MASK (0x3f) -#define TX_PWR_G_BAND_OFDM_54M_SIGN (1 << 6) -#define TX_PWR_G_BAND_OFDM_54M_EN (1 << 7) -#define TX_PWR_HT_BPSK_MCS_0_8_MASK (0x3f << 8) -#define TX_PWR_HT_BPSK_MCS_0_8_SIGN (1 << 14) -#define TX_PWR_HT_BPSK_MCS_0_8_EN (1 << 15) - -#define TX_PWR_HT_BPSK_MCS_0_8 0xA7 - -#define TX_PWR_HT_BPSK_MCS_32 0xA8 -#define TX_PWR_HT_BPSK_MCS_32_MASK (0x3f) -#define TX_PWR_HT_BPSK_MCS_32_SIGN (1 << 6) -#define TX_PWR_HT_BPSK_MCS_32_EN (1 << 7) -#define TX_PWR_HT_QPSK_MCS_1_2_9_10_MASK (0x3f << 8) -#define TX_PWR_HT_QPSK_MCS_1_2_9_10_SIGN (1 << 14) -#define TX_PWR_HT_QPSK_MCS_1_2_9_10_EN (1 << 15) - -#define TX_PWR_HT_QPSK_MCS_1_2_9_10 0xA9 - -#define TX_PWR_HT_16QAM_MCS_3_4_11_12 0xAA -#define TX_PWR_HT_16QAM_MCS_3_4_11_12_MASK (0x3f) -#define TX_PWR_HT_16QAM_MCS_3_4_11_12_SIGN (1 << 6) -#define TX_PWR_HT_16QAM_MCS_3_4_11_12_EN (1 << 7) -#define TX_PWR_HT_64QAM_MCS_5_13_MASK (0x3f << 8) -#define TX_PWR_HT_64QAM_MCS_5_13_SIGN (1 << 14) -#define TX_PWR_HT_64QAM_MCS_5_13_EN (1 << 15) - -#define TX_PWR_HT_64QAM_MCS_5_13 0xAB - -#define TX_PWR_HT_64QAM_MCS_6_14 0xAC -#define TX_PWR_HT_64QAM_MCS_6_14_MASK (0x3f) -#define TX_PWR_HT_64QAM_MCS_6_14_SIGN (1 << 6) -#define TX_PWR_HT_64QAM_MCS_6_14_EN (1 << 7) -#define TX_PWR_HT_64QAM_MCS_7_15_MASK (0x3f << 8) -#define TX_PWR_HT_64QAM_MCS_7_15_SIGN (1 << 14) -#define TX_PWR_HT_64QAM_MCS_7_15_EN (1 << 15) - -#define TX_PWR_HT_64QAM_MCS_7_15 0xAD - -#endif - -#define CONFIG_G_BAND_CHL 0xB0 -#define CONFIG_G_BAND_CHL_GRP1_MASK (0xff) -#define CONFIG_G_BAND_CHL_GRP2_MASK (0xff << 8) - -#define TX_PWR_A_BAND_OFDM_6_9M 0xB2 -#define TX_PWR_A_BAND_OFDM_6_9M_MASK (0x3f) -#define TX_PWR_A_BAND_OFDM_6_9M_SIGN (1 << 6) -#define TX_PWR_A_BAND_OFDM_6_9M_EN (1 << 7) -#define TX_PWR_A_BAND_OFDM_12_18M_MASK (0x3f << 8) -#define TX_PWR_A_BAND_OFDM_12_18M_SIGN (1 << 14) -#define TX_PWR_A_BAND_OFDM_12_18M_EN (1 << 15) - -#define TX_PWR_A_BAND_OFDM_24_36M 0xB4 -#define TX_PWR_A_BAND_OFDM_24_36M_MASK (0x3f) -#define TX_PWR_A_BAND_OFDM_24_36M_SIGN (1 << 6) -#define TX_PWR_A_BAND_OFDM_24_36M_EN (1 << 7) -#define TX_PWR_A_BAND_OFDM_48_54M_MASK (0x3f << 8) -#define TX_PWR_A_BAND_OFDM_48_54M_SIGN (1 << 14) -#define TX_PWR_A_BAND_OFDM_48_54M_EN (1 << 15) - -#define CONFIG1_A_BAND_CHL 0xB6 -#define CONFIG1_A_BAND_CHL_GRP1_MASK 0xff -#define CONFIG1_A_BAND_CHL_GRP2_MASK (0xff << 8) - -#define CONFIG2_A_BAND_CHL 0xB8 -#define CONFIG2_A_BAND_CHL_GRP1_MASK (0xff) -#define CONFIG2_A_BAND_CHL_GRP2_MASK (0xff << 8) - -#define ELAN_RX_MODE_GAIN 0xC0 -#define ELAN_RX_MODE_NF 0xC1 -#define ELAN_RX_MODE_P1DB 0xC2 -#define ELAN_BYPASS_MODE_GAIN 0xC3 -#define ELAN_BYPASS_MODE_NF 0xC4 -#define ELAN_BYPASS_MODE_P1DB 0xC5 - -#define STEP_NUM_NEG_7 0xC6 -#define STEP_NUM_NEG_6 0xC7 -#define STEP_NUM_NEG_5 0xC8 -#define STEP_NUM_NEG_4 0xC9 -#define STEP_NUM_NEG_3 0xCA -#define STEP_NUM_NEG_2 0xCB -#define STEP_NUM_NEG_1 0xCC -#define STEP_NUM_NEG_0 0xCD - -#define REF_STEP_24G 0xCE -#define REF_TEMP_24G 0xCF - -#define STEP_NUM_PLUS_1 0xD0 -#define STEP_NUM_PLUS_2 0xD1 -#define STEP_NUM_PLUS_3 0xD2 -#define STEP_NUM_PLUS_4 0xD3 -#define STEP_NUM_PLUS_5 0xD4 -#define STEP_NUM_PLUS_6 0xD5 -#define STEP_NUM_PLUS_7 0xD6 - -#define CP_FT_VERSION 0xF0 -#define XTAL_CALIB_FREQ_OFFSET 0xF4 -#define XTAL_TRIM_2_COMP 0xF5 -#define XTAL_TRIM_3_COMP 0xF6 -#define WF_RCAL 0xF7 -#define PCIE_RECAL 0xF8 - -#define THERMAL_COMPENSATION_OFFSET 0xF8 - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/efuse.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/efuse.h deleted file mode 100644 index 27b660124a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/efuse.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - efuse.h -*/ -#ifndef __EFUSE_H__ -#define __EFUSE_H__ - -/* eFuse registers */ -#define EFUSE_CTRL 0x0580 -#define EFUSE_DATA0 0x0590 -#define EFUSE_DATA1 0x0594 -#define EFUSE_DATA2 0x0598 -#define EFUSE_DATA3 0x059c - -#define EFUSE_CTRL_3290 0x24 -#define EFUSE_DATA0_3290 0x28 -#define EFUSE_DATA1_3290 0x2c -#define EFUSE_DATA2_3290 0x30 -#define EFUSE_DATA3_3290 0x34 - -#define EFUSE_TAG 0x2fe - -#define MT_EEF_BASE 0x81070000 -#define MT_EE_CTRL (MT_EEF_BASE) -#define MT_EFUSE_CTRL (MT_EEF_BASE + 0x8) -#define MT_EFUSE_WDATA0 (MT_EEF_BASE + 0x10) -#define MT_EFUSE_WDATA1 (MT_EEF_BASE + 0x14) -#define MT_EFUSE_WDATA2 (MT_EEF_BASE + 0x18) -#define MT_EFUSE_WDATA3 (MT_EEF_BASE + 0x1C) -#define MT_EFUSE_RDATA0 (MT_EEF_BASE + 0x30) -#define MT_EFUSE_RDATA1 (MT_EEF_BASE + 0x34) -#define MT_EFUSE_RDATA2 (MT_EEF_BASE + 0x38) -#define MT_EFUSE_RDATA3 (MT_EEF_BASE + 0x3C) - -#ifdef RT_BIG_ENDIAN -typedef union _EFUSE_CTRL_STRUC { - struct { - UINT32 SEL_EFUSE : 1; - UINT32 EFSROM_KICK : 1; - UINT32 EFSROM_DOUT_VLD : 1; - UINT32 RESERVED : 3; - UINT32 EFSROM_AIN : 10; - UINT32 EFSROM_LDO_ON_TIME : 2; - UINT32 EFSROM_LDO_OFF_TIME : 6; - UINT32 EFSROM_MODE : 2; - UINT32 EFSROM_AOUT : 6; - } field; - UINT32 word; -} EFUSE_CTRL_STRUC, *PEFUSE_CTRL_STRUC; -#else -typedef union _EFUSE_CTRL_STRUC { - struct { - UINT32 EFSROM_AOUT : 6; - UINT32 EFSROM_MODE : 2; - UINT32 EFSROM_LDO_OFF_TIME : 6; - UINT32 EFSROM_LDO_ON_TIME : 2; - UINT32 EFSROM_AIN : 10; - UINT32 RESERVED : 3; - UINT32 EFSROM_DOUT_VLD : 1; - UINT32 EFSROM_KICK : 1; - UINT32 SEL_EFUSE : 1; - } field; - UINT32 word; -} EFUSE_CTRL_STRUC, *PEFUSE_CTRL_STRUC; -#endif /* RT_BIG_ENDIAN */ - -VOID eFuseReadPhysical(IN PRTMP_ADAPTER pAd, IN PUSHORT lpInBuffer, - IN ULONG nInBufferSize, OUT PUSHORT lpOutBuffer, - IN ULONG nOutBufferSize); - -#endif /* __EFUSE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/event_common.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/event_common.h deleted file mode 100644 index cae772c3a6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/event_common.h +++ /dev/null @@ -1,169 +0,0 @@ -#ifdef VENDOR_FEATURE7_SUPPORT -#ifndef __EVENT_COMMON_API__ -#define __EVENT_COMMON_API__ - -#include -#ifdef ARRIS_EVENT_USERSPACE -#include -#include -#include -#include -#endif - -/******************************************************************** - * COMMON * - ********************************************************************/ -#define ARRIS_EVENT_ETHERTYPE 0x88B6 /* Public use ethertype */ -#define ARRIS_EVENT_PROC_ENTRY "/proc/arris_event" - -#define OK 0 -#define ERROR -1 -#define WIFI_24_RADIO 1 -#define WIFI_5_RADIO 9 - -/* #define DEBUG 1 */ - -#define int8 char -#define uint8 unsigned char -#define uint unsigned int - -#define MYSELF \ - ATOM_HOST /* This needs to be defined per system. See enum below. */ -/* #define ETH_SRC_DEV "l2sd0.4093" This needs to be defined per system (ARM)*/ -#define ETH_SRC_DEV "eth0.4093" /* This needs to be defined per system (ATOM) */ -/* #define ETH_SRC_DEV "pcie.4093" This needs to be defined per system (QTN) */ -#define ETH_RCV_DEV "eth0.4093" /* Default listening interface */ - -#define MAX_VALUE_LENGTH 1450 - -/* rev_rpc parameters - copied from rev_rpc_api.h (this enum should stay in sync with rev rpc) */ -enum { - E_WIFI_CONFIGURATION = - 0, /* request ARM to send /tmp/wifi_defaults.dat */ - E_STATUS_EVENT, /* report current Wi-Fi status to ARM, for LGI project */ - E_STA_ASSOCIATION, /* E_STA_ASSOCIATE */ - E_STA_DISSOCIATION, /* E_STA_DISSOCIATION */ - E_WPS_AP_CONFIGURED_EVENT, /* E_WPS_AP_CONFIGURED_EVENT, // report WP AP Configured event */ - E_WIFI_RELOAD /* request ARM to perform a full WIFI hardware/software reload */ -}; - -/* eventd host */ -enum { - ARM_HOST = 0, /* ARM */ - ATOM_HOST = 1, /* ATOM */ - OTHER_HOST = 2, - MAIN_HOST = ATOM_HOST, /* Host where circular NVRAM log file resides */ - MAX_HOST = OTHER_HOST -}; - -/* event types */ -enum { - SOLICIT = 0, - /* WLAN event types */ - WLAN_LOG_CONSOLE = 1, - WLAN_LOG_SAVE = 2, - WLAN_LOG_SAVE_CONSOLE = 3, - WLAN_EVENT = 4, /* This event type directly calls ARRIS Rev rpc */ - /* Other event types */ - GENERIC, - SET_DESTINATION_ADDR = 50, - MAX_TYPE -}; - -/* event subtypes - solicit */ -enum { SOLICIT_REQUEST = 0, SOLICIT_RESPONSE = 1 }; - -/* event subtypes - wlan_event */ -enum { - FIRST_WLAN_EVENT_SUBTYPE = 0, - WLAN_STATUS1, - STA_ASSOC = E_STA_ASSOCIATION, - STA_DISSOC = E_STA_DISSOCIATION, - WPS_AP_CONFIGURED = E_WPS_AP_CONFIGURED_EVENT, - ASIC_RELOAD_EVENT = E_WIFI_RELOAD, - WPS_FAIL, - WPS_OOB, - MAX_WLAN_EVENT_SUBTYPE -}; - -typedef struct __attribute__((__packed__)) { - uint8 bssIdx; - uint8 bssid[6]; - uint8 sta_mac[6]; -} STA_DATA_T; - -typedef struct __attribute__((__packed__)) { - uint8 bssIdx; - char SSID[32]; - uint8 authMode; - uint8 encMod; - char key[64]; -} BSS_DATA_T; - -/* Event packet data structure */ -typedef struct __attribute__((__packed__)) { - struct ethhdr eth; - uint8 host; - uint8 type; - uint8 subtype; - int len; - union { - int imsg; - char cmsg[MAX_VALUE_LENGTH]; /* generic msg */ - BSS_DATA_T bss_data; - STA_DATA_T sta_data; - } u; -} EVENT_T; - -/******************************************************************** - * KERNEL * - ********************************************************************/ -#ifdef ARRIS_EVENT_KERNEL -#define dump_mac(x) \ - printk("%02X:%02X:%02X:%02X:%02X:%02X\n", x[0], x[1], x[2], x[3], \ - x[4], x[5]) -int k_xmit_event(uint8 host, uint8 *dmac, uint8 type, uint8 subtype, void *data, - int len); -int find_listener(uint8 host, uint8 *dmac); -void event_handler(uint8 host, uint8 type, uint8 subtype, void *data, int len); -#endif /* ARRIS_EVENT_KERNEL */ - -/******************************************************************** - * USERSPACE * - ********************************************************************/ -#ifdef ARRIS_EVENT_USERSPACE -#undef dbg_print -#define dbg_print(fmt, args...) \ - ({ \ - if ((access("/tmp/arris_event", F_OK) != -1)) \ - fprintf(stdout, "[ARRIS_EVENT] \e[1;40m%s\e[0m " fmt, \ - __func__, ##args); \ - fflush(stdout); \ - }) -#define print_console(fmt, args...) \ - ({ \ - fprintf(stdout, fmt, ##args); \ - fflush(stdout); \ - }) -#undef print_err -#define print_err(fmt, args...) \ - ({ \ - fprintf(stderr, \ - "[ARRIS_EVENT] \e[1;40m**ERROR**\e[0m %s " fmt, \ - __func__, ##args); \ - fflush(stderr); \ - }) -#define dump_mac(x) \ - printf("%02X:%02X:%02X:%02X:%02X:%02X\n", x[0], x[1], x[2], x[3], \ - x[4], x[5]) -int setup_sock(char *interface); -int sendPacket(int *sock, uint8 host, uint8 *dmac, uint8 type, uint8 subtype, - void *data, int len); -int send_arris_event(uint8 host, uint8 type, uint8 subtype, void *data, - int len); -int u_xmit_event(uint8 host, uint8 *dmac, uint8 type, uint8 subtype, void *data, - int len); -#endif /* ARRIS_EVENT_USERSPACE */ - -#endif /* __EVENT_COMMON_API__ */ -#endif /* VENDOR_FEATURE7_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/firmware.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/firmware.h deleted file mode 100644 index 23a124f83e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/firmware.h +++ /dev/null @@ -1,688 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR FirmwareImage[] = { - 0x02, 0x02, 0xa3, 0x02, 0x02, 0x2e, 0x22, 0xff, 0xff, 0xff, 0xff, 0x02, - 0x01, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x02, 0x00, 0xdd, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, - 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18, 0xc2, 0xaf, 0x30, 0x45, 0x03, - 0x12, 0x10, 0x09, 0x90, 0x04, 0x16, 0xe0, 0x30, 0xe3, 0x03, 0x74, 0x08, - 0xf0, 0x90, 0x04, 0x14, 0xe0, 0x20, 0xe7, 0x03, 0x02, 0x00, 0xcb, 0x74, - 0x80, 0xf0, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x24, 0x90, 0x04, 0x04, 0xe0, - 0x24, 0xcf, 0x60, 0x30, 0x14, 0x60, 0x42, 0x24, 0xe2, 0x60, 0x47, 0x14, - 0x60, 0x55, 0x24, 0x21, 0x70, 0x60, 0xe5, 0x55, 0x24, 0xfe, 0x60, 0x07, - 0x14, 0x60, 0x08, 0x24, 0x02, 0x70, 0x08, 0x7d, 0x01, 0x80, 0x28, 0x7d, - 0x02, 0x80, 0x24, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x50, 0x85, 0x24, 0x40, - 0xd2, 0x01, 0x80, 0x3e, 0xe5, 0x55, 0x64, 0x03, 0x60, 0x04, 0xe5, 0x55, - 0x70, 0x04, 0x7d, 0x02, 0x80, 0x09, 0x85, 0x24, 0x41, 0xd2, 0x02, 0x80, - 0x29, 0xad, 0x55, 0xaf, 0x24, 0x12, 0x02, 0x0a, 0x80, 0x20, 0x90, 0x70, - 0x10, 0xe0, 0xf5, 0x47, 0x90, 0x70, 0x11, 0xe0, 0xf5, 0x44, 0x12, 0x10, - 0x25, 0x80, 0x06, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x45, 0xe4, 0xfd, 0xaf, - 0x24, 0x12, 0x02, 0x0a, 0xd2, 0x04, 0x90, 0x70, 0x13, 0xe4, 0xf0, 0x90, - 0x70, 0x13, 0xe4, 0xf0, 0xd2, 0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, - 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, - 0x82, 0xc0, 0xd0, 0xe8, 0xc0, 0xe0, 0xe9, 0xc0, 0xe0, 0xea, 0xc0, 0xe0, - 0xeb, 0xc0, 0xe0, 0xec, 0xc0, 0xe0, 0xed, 0xc0, 0xe0, 0xee, 0xc0, 0xe0, - 0xef, 0xc0, 0xe0, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x12, 0xd2, - 0xaf, 0xd0, 0xe0, 0xff, 0xd0, 0xe0, 0xfe, 0xd0, 0xe0, 0xfd, 0xd0, 0xe0, - 0xfc, 0xd0, 0xe0, 0xfb, 0xd0, 0xe0, 0xfa, 0xd0, 0xe0, 0xf9, 0xd0, 0xe0, - 0xf8, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, - 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, - 0x10, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x0c, 0x30, 0x58, 0x0a, - 0xe5, 0x54, 0x60, 0x04, 0x15, 0x54, 0x80, 0x02, 0xc2, 0x58, 0x30, 0x59, - 0x0a, 0xe5, 0x50, 0x60, 0x04, 0x15, 0x50, 0x80, 0x02, 0xc2, 0x59, 0xd5, - 0x53, 0x07, 0x30, 0x60, 0x04, 0x15, 0x46, 0xd2, 0x04, 0x30, 0x45, 0x03, - 0x12, 0x10, 0x0f, 0xc2, 0x8d, 0xd2, 0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, - 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x12, 0x02, 0x50, 0x30, 0x45, 0x03, - 0x12, 0x10, 0x03, 0x30, 0x01, 0x06, 0x20, 0x09, 0x03, 0x12, 0x10, 0x1c, - 0x30, 0x02, 0x06, 0x20, 0x0a, 0x03, 0x12, 0x10, 0x1f, 0x30, 0x03, 0x06, - 0x20, 0x0b, 0x03, 0x12, 0x10, 0x1f, 0x30, 0x04, 0x06, 0x20, 0x0c, 0x03, - 0x12, 0x10, 0x22, 0x20, 0x13, 0x09, 0x20, 0x11, 0x06, 0xe5, 0x2b, 0x45, - 0x2c, 0x60, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0xa9, 0x12, 0x02, 0x80, - 0x80, 0xbf, 0xc2, 0x43, 0xd2, 0x45, 0xe4, 0xf5, 0x20, 0xf5, 0x21, 0xf5, - 0x53, 0xf5, 0x46, 0xf5, 0x2b, 0xf5, 0x2c, 0xc2, 0x42, 0xf5, 0x51, 0xf5, - 0x52, 0xf5, 0x55, 0x90, 0x04, 0x18, 0x74, 0x80, 0xf0, 0x90, 0x04, 0x1a, - 0x74, 0x08, 0xf0, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70, - 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, - 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, - 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0xef, 0xf4, 0x60, 0x1f, 0xe4, 0xfe, - 0x12, 0x02, 0xaf, 0xe0, 0xb4, 0xff, 0x12, 0x12, 0x02, 0xaf, 0xef, 0xf0, - 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0, - 0x22, 0x0e, 0xbe, 0x04, 0xe3, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, - 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x08, 0xc2, 0xaf, 0x30, 0x45, 0x03, - 0x12, 0x10, 0x06, 0xd2, 0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, - 0xf0, 0xd0, 0xe0, 0x32, 0xc2, 0xaf, 0x12, 0x00, 0x06, 0x12, 0x01, 0xbe, - 0x12, 0x02, 0x69, 0xe4, 0xf5, 0x22, 0xf5, 0x47, 0x90, 0x04, 0x00, 0x74, - 0x80, 0xf0, 0xd2, 0xaf, 0x22, 0x75, 0x89, 0x02, 0xe4, 0xf5, 0x8c, 0xf5, - 0x8a, 0xf5, 0x88, 0xf5, 0xb8, 0xf5, 0xe8, 0x75, 0x90, 0x18, 0xd2, 0x8c, - 0x75, 0xa8, 0x05, 0x22, 0x30, 0x45, 0x03, 0x12, 0x10, 0x15, 0xe5, 0x20, - 0x70, 0x03, 0x20, 0x10, 0x03, 0x30, 0x11, 0x03, 0x43, 0x87, 0x01, 0x22, - 0xce, 0xef, 0xce, 0xee, 0x60, 0x08, 0x7f, 0xff, 0x12, 0x02, 0xc5, 0x1e, - 0x80, 0xf5, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x5f, - 0x02, 0x01, 0x7a, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, - 0x83, 0x22, 0xef, 0x90, 0x02, 0xc3, 0x93, 0x90, 0x03, 0x00, 0x73, 0x0a, - 0x18, 0xef, 0x60, 0x03, 0x1f, 0x80, 0xfa, 0x22, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x26, 0x74, 0x03, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83, 0x75, 0x26, - 0x0a, 0x22, 0xc0, 0x26, 0x74, 0x03, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83, - 0x75, 0x26, 0x18, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x10, 0x28, 0x02, 0x10, - 0x32, 0x02, 0x10, 0x33, 0x02, 0x14, 0xc2, 0x02, 0x14, 0xc3, 0x02, 0x15, - 0x8f, 0x02, 0x15, 0x90, 0xc3, 0x22, 0xff, 0xff, 0x02, 0x1a, 0x6f, 0x02, - 0x1b, 0xec, 0x02, 0x16, 0xbc, 0x02, 0x15, 0xf7, 0x30, 0x05, 0x06, 0x20, - 0x0d, 0x03, 0x12, 0x1d, 0x19, 0x22, 0x22, 0x90, 0x04, 0x14, 0xe0, 0x20, - 0xe7, 0x03, 0x02, 0x14, 0xc1, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x56, 0x90, - 0x04, 0x04, 0xe0, 0x12, 0x01, 0xe4, 0x10, 0xda, 0x30, 0x10, 0xb1, 0x31, - 0x10, 0x93, 0x35, 0x10, 0x8a, 0x36, 0x10, 0xe7, 0x40, 0x10, 0xfe, 0x41, - 0x11, 0x15, 0x50, 0x11, 0x5a, 0x51, 0x11, 0x63, 0x52, 0x11, 0x63, 0x53, - 0x11, 0x63, 0x54, 0x11, 0x9f, 0x55, 0x11, 0xfc, 0x56, 0x12, 0x4f, 0x64, - 0x12, 0x6a, 0x72, 0x13, 0x1e, 0x73, 0x13, 0x42, 0x74, 0x14, 0x35, 0x80, - 0x14, 0xa5, 0x83, 0x14, 0x5c, 0x91, 0x00, 0x00, 0x14, 0xc1, 0x90, 0x70, - 0x11, 0xe0, 0xf5, 0x3c, 0x02, 0x14, 0xbb, 0xe5, 0x55, 0xb4, 0x02, 0x0f, - 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0x74, 0x08, 0xf0, 0x7d, - 0x01, 0x80, 0x02, 0x7d, 0x02, 0xaf, 0x56, 0x12, 0x02, 0x0a, 0x02, 0x14, - 0xbb, 0x20, 0x02, 0x03, 0x30, 0x03, 0x0a, 0x7d, 0x02, 0xaf, 0x56, 0x12, - 0x02, 0x0a, 0x02, 0x14, 0xbb, 0xe5, 0x30, 0xd3, 0x94, 0x01, 0x40, 0x0c, - 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x02, 0xf0, 0xa3, 0xe0, 0x44, 0x04, 0xf0, - 0x85, 0x56, 0x41, 0xd2, 0x02, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xb4, 0x5a, - 0x03, 0xc2, 0x4f, 0x22, 0xd2, 0x4f, 0x22, 0xe5, 0x30, 0xd3, 0x94, 0x01, - 0x50, 0x03, 0x02, 0x14, 0xc1, 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x02, 0xf0, - 0xa3, 0xe0, 0x44, 0x04, 0xf0, 0x22, 0xe5, 0x30, 0xd3, 0x94, 0x01, 0x50, - 0x03, 0x02, 0x14, 0xc1, 0x90, 0x01, 0x0c, 0xe0, 0x54, 0xfd, 0xf0, 0xa3, - 0xe0, 0x54, 0xfb, 0xf0, 0x22, 0xe5, 0x30, 0xd3, 0x94, 0x01, 0x40, 0x07, - 0xe5, 0x55, 0x60, 0x03, 0x02, 0x14, 0xc1, 0x90, 0x70, 0x10, 0xe0, 0x54, - 0x7f, 0xff, 0xbf, 0x0a, 0x0d, 0x90, 0x70, 0x11, 0xe0, 0xb4, 0x08, 0x06, - 0x75, 0x4e, 0x01, 0x75, 0x4f, 0x84, 0x90, 0x70, 0x10, 0xe0, 0x54, 0x7f, - 0xff, 0xbf, 0x02, 0x12, 0x90, 0x70, 0x11, 0xe0, 0x64, 0x08, 0x60, 0x04, - 0xe0, 0xb4, 0x20, 0x06, 0x75, 0x4e, 0x03, 0x75, 0x4f, 0x20, 0xe4, 0xf5, - 0x3f, 0x22, 0x90, 0x70, 0x11, 0xe0, 0x24, 0xff, 0x92, 0x47, 0x22, 0xe5, - 0x30, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, - 0x29, 0x90, 0x04, 0x04, 0xe0, 0x25, 0xe0, 0x24, 0x5d, 0xf5, 0x57, 0x90, - 0x70, 0x10, 0xe0, 0xff, 0x74, 0x47, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, - 0x90, 0x70, 0x11, 0xe0, 0xff, 0x74, 0x48, 0x25, 0x57, 0xf8, 0xc6, 0xef, - 0xc6, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x0a, 0x02, 0x14, 0xbb, 0xe5, - 0x30, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, - 0x29, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x1d, 0xe5, 0x47, 0x64, 0x08, 0x60, - 0x17, 0xe5, 0x47, 0x64, 0x09, 0x60, 0x11, 0xe5, 0x47, 0x64, 0x0a, 0x60, - 0x0b, 0xe5, 0x47, 0x64, 0x0b, 0x60, 0x05, 0xe5, 0x47, 0xb4, 0x0c, 0x08, - 0x90, 0x70, 0x11, 0xe0, 0x54, 0x0f, 0xf5, 0x3a, 0xe5, 0x47, 0xb4, 0x09, - 0x08, 0xe5, 0x3a, 0xb4, 0x03, 0x03, 0xe4, 0xf5, 0x46, 0xe5, 0x47, 0xb4, - 0x0a, 0x08, 0xe5, 0x3a, 0xb4, 0x01, 0x03, 0xe4, 0xf5, 0x46, 0xe4, 0xfd, - 0xaf, 0x56, 0x12, 0x02, 0x0a, 0xd2, 0x04, 0x22, 0x90, 0x70, 0x11, 0xe0, - 0xf4, 0xff, 0x90, 0x70, 0x10, 0xe0, 0x5f, 0xff, 0x90, 0x70, 0x11, 0xe0, - 0x55, 0x3f, 0x4f, 0x90, 0x70, 0x18, 0xf0, 0x90, 0x70, 0x11, 0xe0, 0x90, - 0x70, 0x19, 0xf0, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x0a, 0x30, 0x15, - 0x03, 0xd2, 0x14, 0x22, 0x90, 0x70, 0x18, 0xe0, 0xf5, 0x3f, 0x90, 0x02, - 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e, 0x90, 0x02, - 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x3f, 0x80, 0x04, 0xe5, 0x3f, 0xf4, - 0xff, 0x90, 0x02, 0x28, 0xef, 0xf0, 0x22, 0x90, 0x70, 0x10, 0xe0, 0x24, - 0xff, 0x92, 0x1a, 0x75, 0x32, 0x03, 0x75, 0x33, 0x1f, 0xe4, 0xf5, 0x31, - 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0x0a, 0x02, 0x14, 0xbb, 0x90, 0x10, - 0x00, 0xe0, 0xf5, 0x57, 0xe4, 0xf5, 0x58, 0xf5, 0x59, 0x90, 0x10, 0x03, - 0xe0, 0xb4, 0x28, 0x05, 0x75, 0x58, 0x01, 0x80, 0x3c, 0x90, 0x10, 0x03, - 0xe0, 0xb4, 0x30, 0x05, 0x75, 0x58, 0x02, 0x80, 0x30, 0x90, 0x10, 0x03, - 0xe0, 0xb4, 0x33, 0x05, 0x75, 0x58, 0x04, 0x80, 0x24, 0x90, 0x10, 0x03, - 0xe0, 0xb4, 0x35, 0x0c, 0x90, 0x10, 0x02, 0xe0, 0xb4, 0x72, 0x05, 0x75, - 0x58, 0x08, 0x80, 0x11, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x35, 0x0a, 0x90, - 0x10, 0x02, 0xe0, 0xb4, 0x93, 0x03, 0x75, 0x58, 0x10, 0xe5, 0x58, 0x30, - 0xe1, 0x19, 0x90, 0x05, 0x08, 0xe0, 0x44, 0x01, 0xf0, 0xfd, 0x90, 0x05, - 0x05, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x04, 0xf0, 0xed, 0x54, 0xfe, 0x90, - 0x05, 0x08, 0xf0, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x75, 0x3a, 0xff, 0xf5, - 0x30, 0x90, 0x05, 0xa4, 0x74, 0x11, 0xf0, 0xa3, 0x74, 0xff, 0xf0, 0xa3, - 0x74, 0x03, 0xf0, 0xd2, 0x4f, 0x90, 0x01, 0x0d, 0xe0, 0x44, 0x40, 0xf0, - 0x75, 0x3c, 0xff, 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0x0a, 0x90, 0x70, - 0x36, 0x74, 0x37, 0xf0, 0xa3, 0x74, 0x32, 0xf0, 0x90, 0x04, 0x01, 0xe0, - 0x44, 0x01, 0xf0, 0xc2, 0x1a, 0xc2, 0x17, 0x02, 0x14, 0xbb, 0xe5, 0x30, - 0xd3, 0x94, 0x01, 0x40, 0x0b, 0xe5, 0x55, 0x60, 0x07, 0x7d, 0x03, 0xaf, - 0x56, 0x02, 0x02, 0x0a, 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x93, - 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x0a, 0x02, 0x14, 0xbb, 0x90, 0x10, - 0x00, 0xe0, 0x90, 0x10, 0x2c, 0xf0, 0x90, 0x10, 0x2f, 0x74, 0x40, 0xf0, - 0x90, 0x70, 0x11, 0xe0, 0x54, 0x7f, 0xf5, 0x57, 0xe0, 0x54, 0x80, 0x90, - 0x70, 0x32, 0xf0, 0x90, 0x70, 0x10, 0xe0, 0xff, 0xe5, 0x57, 0xd3, 0x9f, - 0x40, 0x43, 0x90, 0x70, 0x33, 0xe5, 0x57, 0xf0, 0x90, 0x70, 0x10, 0xe0, - 0xff, 0x90, 0x70, 0x33, 0xe0, 0xc3, 0x9f, 0xd3, 0x94, 0x04, 0x40, 0x73, - 0xe0, 0x24, 0xfc, 0xf0, 0xe0, 0xff, 0x90, 0x70, 0x32, 0xe0, 0x4f, 0x90, - 0x05, 0x00, 0xf0, 0xe5, 0x58, 0x54, 0x0f, 0x60, 0x04, 0x7f, 0x17, 0x80, - 0x02, 0x7f, 0x11, 0x90, 0x05, 0x01, 0xef, 0xf0, 0xa3, 0x74, 0x01, 0xf0, - 0x74, 0x03, 0xf0, 0xff, 0x12, 0x02, 0x94, 0x80, 0xc3, 0x90, 0x70, 0x33, - 0xe5, 0x57, 0xf0, 0x90, 0x70, 0x33, 0xe0, 0xff, 0x90, 0x70, 0x10, 0xe0, - 0xc3, 0x9f, 0xd3, 0x94, 0x04, 0x40, 0x30, 0x90, 0x70, 0x33, 0xe0, 0x24, - 0x04, 0xf0, 0xe0, 0xff, 0x90, 0x70, 0x32, 0xe0, 0x4f, 0x90, 0x05, 0x00, - 0xf0, 0xe5, 0x58, 0x54, 0x0f, 0x60, 0x04, 0x7f, 0x17, 0x80, 0x02, 0x7f, - 0x11, 0x90, 0x05, 0x01, 0xef, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, - 0xf0, 0xff, 0x12, 0x02, 0x94, 0x80, 0xc0, 0x90, 0x70, 0x10, 0xe0, 0xff, - 0x90, 0x70, 0x32, 0xe0, 0x4f, 0x90, 0x05, 0x00, 0xf0, 0xe5, 0x58, 0x54, - 0x0f, 0x60, 0x04, 0x7f, 0x17, 0x80, 0x02, 0x7f, 0x11, 0x90, 0x05, 0x01, - 0xef, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0, 0xff, 0x12, 0x02, - 0x94, 0x90, 0x10, 0x00, 0xe0, 0x90, 0x10, 0x2c, 0xf0, 0x90, 0x10, 0x2f, - 0x74, 0x7f, 0xf0, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x0a, 0x02, 0x14, - 0xbb, 0xe5, 0x30, 0xd3, 0x94, 0x01, 0x40, 0x0d, 0xe5, 0x55, 0x60, 0x09, - 0x7d, 0x03, 0xaf, 0x56, 0x12, 0x02, 0x0a, 0x80, 0x72, 0x90, 0x70, 0x10, - 0xe0, 0x24, 0xff, 0x92, 0x4a, 0xd2, 0x05, 0xad, 0x57, 0xaf, 0x56, 0x12, - 0x02, 0x0a, 0x80, 0x5f, 0x90, 0x70, 0x11, 0xe0, 0x24, 0xff, 0x92, 0x17, - 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x5d, 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, - 0x0a, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0x30, 0x17, 0x13, 0x90, 0x10, - 0x00, 0xe0, 0x90, 0x10, 0x2c, 0xf0, 0x90, 0x10, 0x2f, 0xe0, 0x54, 0xf0, - 0xf5, 0x57, 0x45, 0x5d, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, - 0xf4, 0x60, 0x2a, 0x90, 0x70, 0x25, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x02, - 0x2c, 0x74, 0xff, 0xf0, 0x22, 0xe4, 0xf5, 0x30, 0xd2, 0x4f, 0x90, 0x70, - 0x10, 0xe0, 0xf4, 0x60, 0x03, 0xe0, 0xf5, 0x30, 0xad, 0x57, 0xaf, 0x56, - 0x12, 0x02, 0x0a, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0x22, 0x22, 0xe5, - 0x33, 0x45, 0x32, 0x60, 0x0a, 0xe5, 0x33, 0x15, 0x33, 0x70, 0x0a, 0x15, - 0x32, 0x80, 0x06, 0x75, 0x32, 0x03, 0x75, 0x33, 0x1f, 0xe5, 0x33, 0x45, - 0x32, 0x60, 0x03, 0x02, 0x15, 0x70, 0x20, 0x1a, 0x03, 0x02, 0x15, 0x70, - 0x74, 0xa0, 0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34, 0x4c, 0xf5, 0x83, 0xe0, - 0x60, 0x7a, 0x7f, 0x7e, 0x12, 0x15, 0xde, 0xef, 0x54, 0xfe, 0x44, 0x02, - 0xfd, 0x7f, 0x7e, 0x12, 0x15, 0xc4, 0xe5, 0x31, 0x7f, 0x00, 0x25, 0xe0, - 0xfe, 0xef, 0x24, 0x00, 0xf5, 0x82, 0x74, 0x4d, 0x3e, 0xaf, 0x82, 0x90, - 0x4c, 0xa8, 0xf0, 0xa3, 0xef, 0xf0, 0xe4, 0xf5, 0x56, 0xf5, 0x57, 0x7f, - 0x7f, 0x12, 0x15, 0xde, 0x90, 0x4c, 0xa8, 0xe0, 0xfa, 0xa3, 0xe0, 0x25, - 0x57, 0xf5, 0x82, 0xea, 0x35, 0x56, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x57, - 0xe5, 0x57, 0x70, 0x02, 0x05, 0x56, 0xc3, 0x94, 0x80, 0xe5, 0x56, 0x94, - 0x01, 0x40, 0xd8, 0x7f, 0x7e, 0x12, 0x15, 0xde, 0xef, 0x44, 0x03, 0xfd, - 0x7f, 0x7e, 0x12, 0x15, 0xc4, 0x74, 0xa0, 0x25, 0x31, 0xf5, 0x82, 0xe4, - 0x34, 0x4c, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0xb4, 0x08, - 0x03, 0xe4, 0xf5, 0x31, 0xe5, 0x53, 0x70, 0x1a, 0x30, 0x60, 0x09, 0xb2, - 0x4d, 0x30, 0x4d, 0x04, 0x05, 0x46, 0xc2, 0x04, 0xe5, 0x4f, 0x45, 0x4e, - 0x60, 0x08, 0xe5, 0x4f, 0x15, 0x4f, 0x70, 0x02, 0x15, 0x4e, 0x22, 0x22, - 0x30, 0x14, 0x30, 0x90, 0x70, 0x19, 0xe0, 0x55, 0x3f, 0xff, 0x90, 0x70, - 0x18, 0xe0, 0x4f, 0xf5, 0x3f, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, - 0x19, 0xe0, 0xfe, 0xef, 0x5e, 0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, - 0xaf, 0x3f, 0x80, 0x04, 0xe5, 0x3f, 0xf4, 0xff, 0x90, 0x02, 0x28, 0xef, - 0xf0, 0xc2, 0x14, 0x22, 0x90, 0x10, 0x1c, 0xed, 0xf0, 0xa3, 0xef, 0xf0, - 0xa3, 0x74, 0x0a, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, 0x58, 0x90, 0x10, - 0x1e, 0xe0, 0x20, 0xe1, 0xf3, 0x22, 0x90, 0x10, 0x1d, 0xef, 0xf0, 0xa3, - 0x74, 0x0b, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, 0x58, 0x90, 0x10, 0x1e, - 0xe0, 0x20, 0xe1, 0xf3, 0xaf, 0x58, 0x22, 0xc2, 0x4b, 0xc2, 0x4c, 0xe5, - 0x44, 0x12, 0x01, 0xe4, 0x16, 0x19, 0x00, 0x16, 0xa7, 0x04, 0x16, 0xa3, - 0x08, 0x16, 0x83, 0x10, 0x16, 0x2d, 0x20, 0x16, 0x4d, 0x60, 0x16, 0x5e, - 0xa0, 0x00, 0x00, 0x16, 0xa9, 0x85, 0x48, 0x43, 0x85, 0x4a, 0x42, 0x85, - 0x4c, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x60, 0x03, 0x02, 0x16, 0xa9, 0x80, - 0x1b, 0xe5, 0x48, 0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4a, 0xc4, 0x54, - 0x0f, 0xf5, 0x42, 0xe5, 0x4c, 0xc4, 0x54, 0x0f, 0xf5, 0x5e, 0xe5, 0x47, - 0x64, 0x06, 0x70, 0x61, 0x53, 0x43, 0x0f, 0x80, 0x5c, 0x85, 0x49, 0x43, - 0x85, 0x4b, 0x42, 0x85, 0x4d, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x4d, - 0x80, 0x1b, 0xe5, 0x49, 0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4b, 0xc4, - 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4d, 0xc4, 0x54, 0x0f, 0xf5, 0x5e, 0xe5, - 0x47, 0x64, 0x06, 0x70, 0x30, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x10, 0xf5, - 0x43, 0x80, 0x26, 0xe5, 0x47, 0x64, 0x04, 0x60, 0x05, 0xe5, 0x47, 0xb4, - 0x05, 0x06, 0x43, 0x5e, 0x04, 0x75, 0x42, 0x09, 0xe5, 0x47, 0xb4, 0x06, - 0x10, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x30, 0xf5, 0x43, 0x80, 0x06, 0xd2, - 0x4b, 0x80, 0x02, 0xd2, 0x4c, 0xe4, 0xf5, 0x27, 0xe5, 0x42, 0xc4, 0x54, - 0xf0, 0xff, 0xe5, 0x43, 0x54, 0x0f, 0x4f, 0xf5, 0x5f, 0xd2, 0x60, 0x22, - 0xd2, 0x15, 0xe5, 0x47, 0x24, 0xf5, 0x60, 0x0b, 0x24, 0xcb, 0x60, 0x07, - 0x24, 0x40, 0x70, 0x06, 0xc2, 0x15, 0x22, 0x12, 0x1a, 0x3a, 0x12, 0x16, - 0xde, 0xc2, 0x15, 0xc2, 0xaf, 0xc2, 0x04, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, - 0x90, 0x04, 0x14, 0xe0, 0x54, 0x0e, 0x60, 0x04, 0xd2, 0x18, 0x80, 0x08, - 0xe5, 0x4e, 0x45, 0x4f, 0x24, 0xff, 0x92, 0x18, 0xd2, 0xaf, 0x90, 0x04, - 0x14, 0xe0, 0xa2, 0xe4, 0x92, 0x19, 0x74, 0x1e, 0xf0, 0xe5, 0x5f, 0x54, - 0x0f, 0xf5, 0x2d, 0xe5, 0x27, 0x70, 0x13, 0x30, 0x18, 0x05, 0xe5, 0x5f, - 0x20, 0xe5, 0x0b, 0x30, 0x19, 0x19, 0xe5, 0x5f, 0x54, 0x30, 0xff, 0xbf, - 0x30, 0x11, 0xe5, 0x27, 0x70, 0x05, 0x75, 0x27, 0x0c, 0x80, 0x02, 0x15, - 0x27, 0xd2, 0x6c, 0xd2, 0x6d, 0x80, 0x0f, 0xe5, 0x5f, 0x30, 0xe6, 0x06, - 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0xe5, 0x47, - 0x64, 0x03, 0x70, 0x21, 0x30, 0x4b, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, - 0x18, 0xe5, 0x27, 0x70, 0x03, 0x30, 0x4c, 0x11, 0xc2, 0x4c, 0xe5, 0x27, - 0x70, 0x05, 0x75, 0x27, 0x07, 0x80, 0x02, 0x15, 0x27, 0xd2, 0x6c, 0xd2, - 0x6d, 0xe5, 0x47, 0xb4, 0x09, 0x14, 0xe5, 0x44, 0x20, 0xe3, 0x0b, 0xe5, - 0x3a, 0x64, 0x02, 0x60, 0x05, 0xe5, 0x3a, 0xb4, 0x03, 0x04, 0xc2, 0x6c, - 0xd2, 0x6d, 0xe5, 0x47, 0xb4, 0x0a, 0x13, 0xe5, 0x3a, 0xb4, 0x01, 0x06, - 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x08, 0xe5, 0x3a, 0x70, 0x04, 0xd2, 0x6c, - 0xc2, 0x6d, 0x20, 0x69, 0x07, 0xe5, 0x5e, 0x20, 0xe0, 0x02, 0xb2, 0x68, - 0x20, 0x6b, 0x07, 0xe5, 0x5e, 0x20, 0xe1, 0x02, 0xb2, 0x6a, 0x20, 0x6d, - 0x07, 0xe5, 0x5e, 0x20, 0xe2, 0x02, 0xb2, 0x6c, 0x75, 0x2e, 0x40, 0x20, - 0x69, 0x04, 0xa2, 0x68, 0x80, 0x26, 0x30, 0x68, 0x06, 0xe5, 0x46, 0xa2, - 0xe2, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f, 0x01, 0x80, 0x02, - 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, - 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x73, 0x92, 0x72, - 0x20, 0x6b, 0x04, 0xa2, 0x6a, 0x80, 0x26, 0x30, 0x6a, 0x06, 0xe5, 0x46, - 0xa2, 0xe2, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f, 0x01, 0x80, - 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, - 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x75, 0x92, - 0x74, 0x20, 0x6d, 0x04, 0xa2, 0x6c, 0x80, 0x26, 0xe5, 0x47, 0x64, 0x0a, - 0x70, 0x22, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x17, 0xe5, - 0x3a, 0xb4, 0x01, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x34, 0xe5, 0x46, - 0x20, 0xe4, 0x03, 0x30, 0xe5, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x80, 0x26, - 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x1d, 0xe5, 0x5e, 0x20, - 0xe2, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, - 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, - 0x24, 0xff, 0x92, 0x71, 0x92, 0x70, 0x90, 0x10, 0x00, 0xe0, 0x90, 0x10, - 0x2c, 0xf0, 0x90, 0x10, 0x03, 0xe0, 0xc3, 0x94, 0x30, 0x40, 0x19, 0xe0, - 0x64, 0x32, 0x60, 0x14, 0xa2, 0x71, 0x92, 0x77, 0xa2, 0x70, 0x92, 0x76, - 0xe5, 0x2e, 0x13, 0x13, 0x54, 0x3f, 0xf5, 0x2e, 0xc2, 0x77, 0xd2, 0x76, - 0x30, 0x17, 0x0d, 0x53, 0x2e, 0xf0, 0xe5, 0x2e, 0x45, 0x5d, 0x90, 0x10, - 0x2f, 0xf0, 0x80, 0x06, 0x90, 0x10, 0x2f, 0xe5, 0x2e, 0xf0, 0xe5, 0x47, - 0x64, 0x06, 0x70, 0x47, 0x90, 0x02, 0x28, 0xe0, 0x30, 0x47, 0x03, 0xff, - 0x80, 0x02, 0xf4, 0xff, 0x8f, 0x3f, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfe, - 0xf0, 0xe5, 0x43, 0xc4, 0x54, 0x0f, 0x14, 0x60, 0x0c, 0x24, 0xfe, 0x60, - 0x0c, 0x24, 0x03, 0x70, 0x13, 0xc2, 0xf8, 0x80, 0x0f, 0xd2, 0xf8, 0x80, - 0x0b, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0xf8, - 0x30, 0x47, 0x05, 0xaf, 0x3f, 0x02, 0x1a, 0x34, 0xe5, 0x3f, 0xf4, 0xff, - 0x02, 0x1a, 0x34, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x0f, 0xe5, 0x47, 0x64, - 0x08, 0x60, 0x09, 0xe5, 0x47, 0x64, 0x09, 0x60, 0x03, 0x02, 0x19, 0xa2, - 0x90, 0x02, 0x28, 0xe0, 0x30, 0x47, 0x03, 0xff, 0x80, 0x02, 0xf4, 0xff, - 0x8f, 0x3f, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x3a, 0x14, - 0x60, 0x22, 0x14, 0x60, 0x25, 0x14, 0x60, 0x2d, 0x24, 0xfc, 0x60, 0x49, - 0x24, 0xf9, 0x60, 0x14, 0x24, 0x0e, 0x70, 0x50, 0xe5, 0x46, 0x13, 0x13, - 0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x24, 0xff, 0x80, 0x3a, - 0xd2, 0xf9, 0xc2, 0xf8, 0x80, 0x3e, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, - 0x80, 0x1d, 0xc3, 0x80, 0x1a, 0xe5, 0x46, 0x30, 0xe2, 0x0d, 0x54, 0x38, - 0xc3, 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, - 0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0xf8, 0xc2, 0xf9, 0x80, - 0x13, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0xf9, - 0xc2, 0xf8, 0x80, 0x04, 0xc2, 0xf8, 0xc2, 0xf9, 0x30, 0x47, 0x04, 0xaf, - 0x3f, 0x80, 0x04, 0xe5, 0x3f, 0xf4, 0xff, 0x02, 0x1a, 0x34, 0xe5, 0x47, - 0x64, 0x0c, 0x60, 0x09, 0xe5, 0x47, 0x64, 0x0b, 0x60, 0x03, 0x02, 0x1a, - 0x39, 0x90, 0x02, 0x28, 0xe0, 0x30, 0x47, 0x03, 0xff, 0x80, 0x02, 0xf4, - 0xff, 0x8f, 0x3f, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x3a, - 0x14, 0x60, 0x20, 0x14, 0x60, 0x21, 0x14, 0x60, 0x2b, 0x24, 0xfc, 0x60, - 0x45, 0x24, 0xf9, 0x60, 0x12, 0x24, 0x0e, 0x70, 0x4a, 0xe5, 0x46, 0x13, - 0x13, 0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x80, 0x29, 0xd2, - 0xf9, 0x80, 0x3a, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, - 0x92, 0xf9, 0x80, 0x2d, 0xe5, 0x46, 0x30, 0xe2, 0x0d, 0x54, 0x38, 0xc3, - 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, 0x00, - 0x7f, 0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0xf9, 0x80, 0x0f, 0xe5, 0x46, - 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0xf9, 0x80, 0x02, 0xc2, - 0xf9, 0x30, 0x47, 0x04, 0xaf, 0x3f, 0x80, 0x04, 0xe5, 0x3f, 0xf4, 0xff, - 0x90, 0x02, 0x28, 0xef, 0xf0, 0x22, 0xe5, 0x47, 0xb4, 0x0b, 0x10, 0x90, - 0x02, 0x29, 0xe0, 0x54, 0xeb, 0xf0, 0xe5, 0x3f, 0x54, 0xeb, 0x45, 0x45, - 0xf5, 0x3f, 0x22, 0xe4, 0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, - 0x45, 0x80, 0x04, 0xe5, 0x45, 0xf4, 0xff, 0x90, 0x02, 0x28, 0xef, 0xf0, - 0x22, 0x8f, 0x50, 0xd2, 0x59, 0x22, 0x8f, 0x54, 0xd2, 0x58, 0x22, 0xe4, - 0xf5, 0x25, 0xc2, 0xaf, 0xe5, 0x51, 0x14, 0x60, 0x4a, 0x14, 0x60, 0x6b, - 0x24, 0x02, 0x60, 0x03, 0x02, 0x1b, 0xd0, 0xd2, 0x59, 0x75, 0x55, 0x01, - 0x90, 0x02, 0x08, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x20, 0xe1, 0x23, 0x90, - 0x04, 0x34, 0xe0, 0xb4, 0x02, 0x1c, 0xa3, 0xe0, 0xb4, 0x02, 0x17, 0xa3, - 0xe0, 0xb4, 0x02, 0x12, 0x7f, 0x20, 0x12, 0x1a, 0x65, 0x90, 0x10, 0x04, - 0xe0, 0x54, 0xf3, 0xf0, 0x75, 0x51, 0x01, 0x02, 0x1b, 0xd0, 0xe5, 0x50, - 0x60, 0x03, 0x02, 0x1b, 0xd0, 0x75, 0x25, 0x03, 0x02, 0x1b, 0xd0, 0x90, - 0x12, 0x00, 0xe0, 0x54, 0x03, 0x70, 0x12, 0x7f, 0x20, 0x12, 0x1a, 0x65, - 0x90, 0x02, 0x08, 0xe0, 0x54, 0xfb, 0xf0, 0x75, 0x51, 0x02, 0x02, 0x1b, - 0xd0, 0xe5, 0x50, 0x60, 0x03, 0x02, 0x1b, 0xd0, 0x02, 0x1b, 0xcb, 0x90, - 0x02, 0x08, 0xe0, 0x30, 0xe3, 0x03, 0x02, 0x1b, 0xc7, 0x90, 0x04, 0x37, - 0xe0, 0x64, 0x22, 0x60, 0x03, 0x02, 0x1b, 0xc7, 0x90, 0x12, 0x04, 0x74, - 0x0a, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x1c, 0x90, 0x00, 0x02, 0xe0, 0x30, - 0xe0, 0x15, 0xe4, 0x90, 0x05, 0x00, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0xa3, - 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12, 0x02, 0x94, 0x90, - 0x13, 0x28, 0xe0, 0x90, 0x70, 0x1a, 0xf0, 0x90, 0x13, 0x29, 0xe0, 0x90, - 0x70, 0x1b, 0xf0, 0x90, 0x13, 0x2b, 0xe0, 0x90, 0x70, 0x22, 0xf0, 0x90, - 0x13, 0x28, 0xe0, 0x54, 0xf0, 0xf0, 0xa3, 0xe0, 0x54, 0xf0, 0xf0, 0x90, - 0x13, 0x2b, 0xe0, 0x54, 0xcc, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x17, 0xe5, - 0x30, 0x70, 0x13, 0xe5, 0x3c, 0xf4, 0x90, 0x13, 0x2a, 0x60, 0x05, 0xe0, - 0x54, 0xf3, 0x80, 0x11, 0xe0, 0x54, 0xfb, 0xf0, 0x80, 0x14, 0xe5, 0x3c, - 0xf4, 0x90, 0x13, 0x2a, 0x60, 0x08, 0xe0, 0x54, 0xf2, 0x45, 0x3c, 0xf0, - 0x80, 0x04, 0xe0, 0x54, 0xfa, 0xf0, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x10, - 0xf0, 0x75, 0x8c, 0x80, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x12, 0x04, 0xe0, - 0x44, 0x04, 0xf0, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0xe0, - 0xf5, 0x2f, 0xe5, 0x30, 0xd3, 0x94, 0x01, 0x40, 0x17, 0x20, 0x02, 0x14, - 0x20, 0x03, 0x11, 0x30, 0x4f, 0x0e, 0x90, 0x01, 0x0d, 0xe0, 0x54, 0xfb, - 0xf0, 0x90, 0x01, 0x0c, 0xe0, 0x54, 0xfd, 0xf0, 0x75, 0x25, 0x01, 0x75, - 0x55, 0x02, 0xe4, 0xf5, 0x51, 0x80, 0x09, 0xe5, 0x50, 0x70, 0x05, 0x75, - 0x25, 0x03, 0xf5, 0x51, 0xe5, 0x25, 0x60, 0x15, 0xc2, 0x01, 0xe4, 0xf5, - 0x51, 0xc2, 0x59, 0xad, 0x25, 0xaf, 0x40, 0x12, 0x1c, 0xe5, 0xe5, 0x25, - 0xb4, 0x03, 0x02, 0xd2, 0x03, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, 0x30, 0x01, - 0x0e, 0xe4, 0xf5, 0x51, 0xc2, 0x59, 0xc2, 0x01, 0x7d, 0x02, 0xaf, 0x40, - 0x12, 0x1c, 0xe5, 0xe5, 0x52, 0x14, 0x60, 0x48, 0x14, 0x60, 0x25, 0x24, - 0x02, 0x60, 0x03, 0x02, 0x1c, 0xe2, 0xe5, 0x30, 0xd3, 0x94, 0x01, 0x40, - 0x11, 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x02, 0xf0, 0xa3, 0xe0, 0x44, 0x04, - 0xf0, 0x7f, 0x0a, 0x12, 0x02, 0x94, 0x75, 0x52, 0x02, 0x75, 0x55, 0x03, - 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0xe5, 0x2f, 0xf0, 0x90, - 0x12, 0x04, 0xe0, 0x54, 0xfb, 0xf0, 0x7f, 0x20, 0x12, 0x1a, 0x6a, 0x75, - 0x52, 0x01, 0x75, 0x55, 0x03, 0x02, 0x1c, 0xe2, 0xe5, 0x54, 0x60, 0x03, - 0x02, 0x1c, 0xe2, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x0e, 0xf0, 0xe0, 0x54, - 0xef, 0xf0, 0xe4, 0xf5, 0x8c, 0xe5, 0x58, 0x54, 0x18, 0x60, 0x1e, 0x90, - 0x70, 0x1a, 0xe0, 0x90, 0x13, 0x28, 0xf0, 0x90, 0x70, 0x1b, 0xe0, 0x90, - 0x13, 0x29, 0xf0, 0xa3, 0x74, 0x05, 0xf0, 0x90, 0x70, 0x22, 0xe0, 0x90, - 0x13, 0x2b, 0xf0, 0x80, 0x11, 0x90, 0x13, 0x28, 0xe0, 0x44, 0x0f, 0xf0, - 0xa3, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x05, 0xf0, 0x90, 0x12, - 0x04, 0x74, 0x03, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x1d, 0x90, 0x00, 0x02, - 0xe0, 0x30, 0xe0, 0x16, 0x90, 0x05, 0x00, 0x74, 0xe2, 0xf0, 0xa3, 0x74, - 0x08, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12, - 0x02, 0x94, 0x90, 0x02, 0x08, 0xe0, 0x44, 0x05, 0xf0, 0x90, 0x10, 0x04, - 0xe0, 0x44, 0x0c, 0xf0, 0xe4, 0xf5, 0x52, 0xf5, 0x55, 0x30, 0x02, 0x09, - 0xc2, 0x02, 0x7d, 0x01, 0xaf, 0x41, 0x12, 0x1c, 0xe5, 0x30, 0x03, 0x02, - 0xc2, 0x03, 0xd2, 0xaf, 0x22, 0xef, 0xf4, 0x60, 0x2d, 0xe4, 0xfe, 0x74, - 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xe0, 0xb4, 0xff, - 0x19, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xef, - 0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xed, - 0xf0, 0x22, 0x0e, 0xbe, 0x04, 0xd5, 0x22, 0x22, 0x22, 0x90, 0x70, 0x2a, - 0xe0, 0x30, 0xe1, 0x43, 0xc2, 0xaf, 0x90, 0x70, 0x28, 0xe0, 0x90, 0x10, - 0x1c, 0xf0, 0x90, 0x70, 0x29, 0xe0, 0x90, 0x10, 0x1d, 0xf0, 0x90, 0x70, - 0x2a, 0xe0, 0x90, 0x10, 0x1e, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, 0x25, - 0x90, 0x10, 0x1e, 0xe0, 0x20, 0xe1, 0xf3, 0x90, 0x10, 0x1c, 0xe0, 0x90, - 0x70, 0x28, 0xf0, 0x90, 0x10, 0x1d, 0xe0, 0x90, 0x70, 0x29, 0xf0, 0x90, - 0x10, 0x1e, 0xe0, 0x90, 0x70, 0x2a, 0xf0, 0xc2, 0x05, 0xd2, 0xaf, 0x22, - 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x5b, 0xd2, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fp_qm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fp_qm.h deleted file mode 100644 index e8872da92a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fp_qm.h +++ /dev/null @@ -1,30 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __FP_QM_H__ - -struct FastPathTxQueElement { - DL_LIST List; - CHAR QueIdx; - CHAR que_type; - PNDIS_PACKET pPacket; -}; - -VOID fp_tx_pkt_deq_func(struct _RTMP_ADAPTER *pAd); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fq_qm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fq_qm.h deleted file mode 100644 index 116218c6b0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fq_qm.h +++ /dev/null @@ -1,152 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ -#include "rt_config.h" - -#ifndef __FQ_QM_H__ -#define __FQ_QM_H__ - -#if defined(MT7615) -#define FQ_PLE_SIZE 4096 -#else -#define FQ_PLE_SIZE 2048 -#endif -#define FQ_SCH_DBG_SUPPORT 1 -#define DEFAULT_THMAX (16) -#define MAX_VHT_THMAX (256) -#define MAX_FQ_VHT_AMPDU_NUM (256) -#define MAX_FQ_VHT_AMPDU_LEN (1 * 1024 * 1024 - 1) -#define MAX_HT_THMAX (42) -#define MIN_HT_THMAX (4) -#define MAX_FQ_HT_AMPDU_NUM (64) -#define MAX_FQ_HT_AMPDU_LEN (65535) -#define MAX_FQ_PPDU_TIME (5484) /* 5484 usec */ - -#define FQ_DBG_DUMP_STA_LOG (0x1) -#define FQ_DBG_DUMP_PLE_EMPTY (0x2) -#define FQ_DBG_DUMP_FQLIST (0x4) -#define FQ_DBG_LOG_ON (0x8) -#define FQ_DBG_MASK (0xff) - -#define FQ_EN (0x1) -#define FQ_SKIP_SINGLE_STA_CASE (0x2) -#define FQ_SKIP_RED (0x4) -#define FQ_NO_PKT_STA_KEEP_IN_LIST (0x8) -#define FQ_LONGEST_DROP (0x10) -#define FQ_ARRAY_SCH (0x1000) -#define FQ_EN_MASK (0x01ffffff) -#define FQ_READY (0x02000000) -#define FQ_NEED_ON (0x04000000) - -#define FQ_PER_AC_LIMIT 4096 -#define FQ_EMPTY_STA 0 -#define FQ_UN_CLEAN_STA 1 -#define FQ_IN_LIST_STA 2 - -#define FQ_BITMAP_MASK (0x1F) -#define FQ_BITMAP_SHIFT (5) -#define FQ_BITMAP_DWORD (MAX_LEN_OF_MAC_TABLE / (sizeof(UINT32) * 8)) - -#define UMAC_DRR_TABLE_RDATA0 (PLE_BASE + 0x350) -#define UMAC_AIRTIME_QUANTUM_SETTING0 (PLE_BASE + 0x380) -#define UMAC_DRR_TABLE_CTRL0_FQ (PLE_BASE + 0x388) -#define UMAC_VOW_DBG_SEL (PLE_BASE + 0x3A0) -#define UMAC_AIRTIME_DBG_INFO0 (PLE_BASE + 0x3A4) -#define UMAC_AIRTIME_DBG_INFO1 (PLE_BASE + 0x3A8) - -#define UMAX_AIRTIME_QUANTUM_OFFSET 8 -#define UMAX_AIRTIME_QUANTUM_MASK BITS(0, 7) -#define UMAC_STA_ID_MASK BITS(0, 7) -#define UMAC_STALINK_CUR_STA_ID_OFFSET 22 -#define UMAC_STALINK_HEAD_STA_ID_OFFSET 2 -#define UMAC_STALINK_TAIL_STA_ID_OFFSET 12 -#define UMAC_STALINK_STA_NUM_OFFSET 16 -#define UMAC_STALINK_STA_NUM_MASK BITS(0, 10) -#define UMAC_STALINK_STA_LOCK_MASK BITS(0, 8) -#define UMAC_QUEUE_ID_MASK BITS(0, 1) -#define UMAC_FORWARD_LINK_STA_ID_OFFSET 2 -#define UMAC_DRR_TABLE_CTRL0_EXE (1 << 31) -#define UMAC_DRR_TABLE_CTRL0_MODE_MASK BITS(16, 23) - -struct fq_stainfo_type { - QUEUE_ENTRY Entry[WMM_NUM_OF_AC]; - UINT16 macInQLen[WMM_NUM_OF_AC]; - UINT16 macOutQLen[WMM_NUM_OF_AC]; - UINT8 wcid; - UINT8 kickPktCnt[WMM_NUM_OF_AC]; - UINT8 thMax[WMM_NUM_OF_AC]; - UINT16 mpduTime; - UINT16 KMAX; - UINT32 drop_cnt[WMM_NUM_OF_AC]; - UINT32 qlen_max_cnt[WMM_NUM_OF_AC]; - INT32 tx_msdu_cnt; - INT32 macQPktLen[WMM_NUM_OF_AC]; - UINT8 status[WMM_NUM_OF_AC]; - NDIS_SPIN_LOCK lock[WMM_NUM_OF_AC]; -}; - -struct fq_ctrl_type { - UINT32 list_map[WMM_NUM_OF_AC][FQ_BITMAP_DWORD]; - UINT32 no_packet_chk_map[WMM_NUM_OF_AC][FQ_BITMAP_DWORD]; - UINT32 staInUseBitmap[FQ_BITMAP_DWORD]; - QUEUE_HEADER fq[WMM_NUM_OF_AC]; - UINT32 frm_cnt[WMM_NUM_OF_AC]; - UINT32 drop_cnt[WMM_NUM_OF_AC]; - UINT8 factor; - UINT32 enable; - UCHAR prev_qm; - UINT8 dbg_en; - UINT8 nactive; - UINT8 nbcmc_active; - UINT8 npow_save; - QUEUE_ENTRY *pPrevEntry[WMM_NUM_OF_AC]; -#ifdef FQ_SCH_DBG_SUPPORT - INT prev_wcid[WMM_NUM_OF_AC]; - INT prev_qidx; - INT prev_kick_cnt[WMM_NUM_OF_AC]; - UINT32 sta_in_head[WMM_NUM_OF_AC][MAX_LEN_OF_MAC_TABLE]; - UINT32 frm_max_cnt[WMM_NUM_OF_AC]; -#endif - UINT16 msdu_out_hw; - UINT16 msdu_in_hw; - UINT16 msdu_threshold; - INT16 srch_pos[WMM_NUM_OF_AC]; -}; - -INT set_fq_enable(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT set_fq_debug_enable(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_fq_dbg_listmap(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT set_fq_dbg_linklist(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT show_fq_info(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -void app_show_fq_dbgmsg(struct _RTMP_ADAPTER *pAd); -void fq_tx_free_per_packet(struct _RTMP_ADAPTER *pAd, UINT8 ucAC, - UINT8 ucWlanIdx, NDIS_PACKET *pkt); -void fq_tx_free_event_handler(UINT32 *dataPtr, UINT8 ucMsduIdCnt, UINT8 version, - struct _RTMP_ADAPTER *pAd); -void fp_fair_tx_pkt_deq_func(struct _RTMP_ADAPTER *pAd); -INT fq_clean_list(struct _RTMP_ADAPTER *pAd, UCHAR qidx); -UINT16 fq_del_list(struct _RTMP_ADAPTER *pAd, struct dequeue_info *info, - CHAR deq_qid, UINT32 *tx_quota); -INT fq_init(struct _RTMP_ADAPTER *pAd); -INT fq_exit(struct _RTMP_ADAPTER *pAd); -INT fq_update_thMax(struct _RTMP_ADAPTER *pAd, struct _STA_TR_ENTRY *tr_entry, - UINT8 wcid, INT32 mpduTime, UINT32 dwrr_quantum, - UINT32 *Value); -INT fq_enq_req(struct _RTMP_ADAPTER *pAd, NDIS_PACKET *pkt, UCHAR qidx, - struct _STA_TR_ENTRY *tr_entry, struct _QUEUE_HEADER *pPktQueue); -INT fq_del_report(struct _RTMP_ADAPTER *pAd, struct dequeue_info *info); -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/frame_hdr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/frame_hdr.h deleted file mode 100644 index 7c4e736f6c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/frame_hdr.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef __FRAME_HDR_H__ -#define __FRAME_HDR_H__ - -#define HDR_TRANS_LEN 50 - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _WIFI_INFO_STRUCT { - UINT32 more_data : 1; - UINT32 wep : 1; - UINT32 ps : 1; - UINT32 rdg : 1; - UINT32 qos : 1; - UINT32 eosp : 1; - UINT32 tid : 4; - UINT32 mode : 2; - UINT32 vlan : 1; - UINT32 rev : 3; - UINT32 bssidx : 4; - UINT32 seq_num : 12; -} WIFI_INFO_STRUCT; -#else -typedef struct GNU_PACKED _WIFI_INFO_STRUCT { - UINT32 seq_num : 12; - UINT32 bssidx : 4; - UINT32 rev : 3; - UINT32 vlan : 1; - UINT32 mode : 2; - UINT32 tid : 4; - UINT32 eosp : 1; - UINT32 qos : 1; - UINT32 rdg : 1; - UINT32 ps : 1; - UINT32 wep : 1; - UINT32 more_data : 1; -} WIFI_INFO_STRUCT; -#endif /* RT_BIG_ENDIAN */ - -WIFI_INFO_STRUCT wifi_info[] = { - /* mode 1 -> AP, mode 2 --> STA */ - /* seq_num, bssidx, rsv, vlan, mode, tid, eosp, qos, rdg, ps, wep, more_data*/ - { 0xff, 5, 0, 1, 1, 3, 0, 1, 0, 0, 0, 0 }, -}; - -UINT8 Input_Frame_Hdr[][HDR_TRANS_LEN] = { - /*type, len, vlan, wcid */ - /************************************ AP LLC/SNAP *********************************/ - /************************************ WDS LLC/SNAP ******************************/ - { 0, 34, 0, 1, 0x08, 0x03, 0x00, 0x00, 0x33, 0x33, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x22, 0x33, 0x44, 0x50, - 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x50, 0x02, 0x00, 0xee, - 0xee, 0xee, 0xee, 0xee, 0x00, 0x00, 0x08, 0x00 }, /* AP w/o LLC - Ether II*/ - -}; - -UINT8 Hdr_Bssid[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 }; - -UINT8 Hdr_Wcid[][6] = { - { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, /* 0 */ - { 0x00, 0x77, 0x77, 0x77, 0x77, 0x77 }, /* 1 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x01 }, /* 2 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x02 }, /* 3 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x03 }, /* 4 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x04 }, /* 5 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x05 }, /* 6 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x06 }, /* 7 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x07 }, /* 8 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x08 }, /* 9 */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x09 }, /* a */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x0a }, /* b */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x0b }, /* c */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x0c }, /* d */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x0d }, /* e */ - { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x0e }, /* f */ -}; -UINT8 MAC_WCID[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - -/* UINT32 RX_Black_List[] = {0x0d898e88}; */ /* EAPOL 888E, TDLS 890D */ -/* UINT32 RX_Black_List[] = {0x888e0800}; */ /* EAPOL 888E, TDLS 890D */ -UINT32 RX_Black_List[] = {}; /* EAPOL 888E, TDLS 890D */ -UINT32 TCI[] = { 0x10021001, 0x10041003, 0x10061005, 0x10081007 }; -UINT32 RX_WCID_En[] = { 0xFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/frq_cal.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/frq_cal.h deleted file mode 100644 index dc6a621d44..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/frq_cal.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - eeprom.h - - Abstract: - Miniport header file for eeprom related information - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __FRQCAL_H__ -#define __FRQCAL_H__ - -/* The frequency calibration control */ -typedef struct _FREQUENCY_CALIBRATION_CONTROL { - BOOLEAN bEnableFrequencyCalibration; /* Enable the frequency calibration algorithm */ - BOOLEAN bSkipFirstFrequencyCalibration; /* Avoid calibrating frequency at the time the STA is just link-up */ - BOOLEAN bApproachFrequency; /* Approach the frequency */ - CHAR AdaptiveFreqOffset; /* Adaptive frequency offset */ - CHAR LatestFreqOffsetOverBeacon; /* Latest frequency offset from the beacon */ - CHAR BeaconPhyMode; /* Latest frequency offset from the beacon */ - -} FREQUENCY_CALIBRATION_CONTROL, *PFREQUENCY_CALIBRATION_CONTROL; - -#define RTMP_FREQ_CAL_DISABLE(__pAd) \ - __pAd->FreqCalibrationCtrl.bEnableFrequencyCalibration = FALSE; - -/* Invalid frequency offset */ -#define INVALID_FREQUENCY_OFFSET -128 - -/* The upperbound/lowerbound of the frequency offset */ -#define UPPERBOUND_OF_FREQUENCY_OFFSET 127 -#define LOWERBOUND_OF_FREQUENCY_OFFSET -127 - -/* The trigger point of the high/low frequency */ -#define HIGH_FREQUENCY_TRIGGER_POINT_OFDM 20 -#define LOW_FREQUENCY_TRIGGER_POINT_OFDM -20 -#define HIGH_FREQUENCY_TRIGGER_POINT_CCK 4 -#define LOW_FREQUENCY_TRIGGER_POINT_CCK -4 - -/* The trigger point of decreasng/increasing the frequency offset */ -#define DECREASE_FREQUENCY_OFFSET_OFDM 10 -#define INCREASE_FREQUENCY_OFFSET_OFDM -10 -#define DECREASE_FREQUENCY_OFFSET_CCK 2 -#define INCREASE_FREQUENCY_OFFSET_CCK -2 - -/* The trigger point of decreasng/increasing the frequency offset */ -#define DECREASE_FREQUENCY_OFFSET 3 -#define INCREASE_FREQUENCY_OFFSET -3 - -/* Frequency calibration period */ -#define FREQUENCY_CALIBRATION_PERIOD 100 - -#endif /* __FRQCAL_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fsm/fsm_sync.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fsm/fsm_sync.h deleted file mode 100644 index f62462f427..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/fsm/fsm_sync.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - fsm_sync.h - - Abstract: - - Revision History: - Who When What - -------- ---------- -------------------------------------------- - 2016-08-18 AP/APCLI/STA SYNC FSM Integration -*/ - -typedef struct _SCAN_INFO_ { - UCHAR SyncCurrState; - ULONG LastScanTime; /* Record last scan time for issue BSSID_SCAN_LIST */ - /* ULONG LastBeaconRxTime;*/ /*OS's timestamp of the last BEACON RX time */ - - BOOLEAN bImprovedScan; - UCHAR ScanChannelCnt; /* 0 at the beginning of scan, stop at 7 */ - UCHAR LastScanChannel; - - UINT32 *ChanList; /* the channel list from from wpa_supplicant */ - UCHAR ChanListLen; /* channel list length */ - UCHAR ChanListIdx; /* current index in channel list when driver in scanning */ - - UCHAR *ExtraIe; /* Carry on Scan action from supplicant */ - UINT ExtraIeLen; - - BOOLEAN bFastConnect; - BOOLEAN bNotFirstScan; /* Sam add for ADHOC flag to do first scan when do initialization */ -} SCAN_INFO; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ft.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ft.h deleted file mode 100644 index 51fd53d094..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ft.h +++ /dev/null @@ -1,1132 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Abstract: - - - */ - -#ifdef DOT11R_FT_SUPPORT - -#ifndef __FT_H -#define __FT_H - -#include "common/link_list.h" -#include "ft_cmm.h" - -#define IN -#define OUT -#define INOUT - -/* Macro */ -#define IS_FT_STA(__A) \ - (((__A) && ((__A)->MdIeInfo.Len != 0) && \ - IS_AKM_OPEN(__A->SecConfig.AKMMap)) || \ - IS_FT_RSN_STA(__A)) - -#define IS_FT_ACTION_FRAME(__A) ((*(__A + 13) == 0x89) && (*(__A + 14) == 0x0d)) - -/* ASCII to Integer */ -#define FT_ARG_ATOI(__pArgv) simple_strtol((RTMP_STRING *)__pArgv, 0, 10) - -extern UINT32 FT_KDP_MemAllocNum, FT_KDP_MemFreeNum; -#define FT_MEM_ALLOC(__pAd, __pMem, __Size) \ - do { \ - os_alloc_mem(__pAd, (UCHAR **)(__pMem), __Size); \ - FT_KDP_MemAllocNum++; \ - } while (0) - -#define FT_MEM_FREE(__pAd, __Mem) \ - do { \ - os_free_mem(__Mem); \ - FT_KDP_MemFreeNum++; \ - } while (0) - -/* atoi & atoh */ -#define FT_ARG_ATOI(__pArgv) simple_strtol((RTMP_STRING *)__pArgv, 0, 10) -#define FT_ARG_ATOH(__Buf, __Hex) AtoH((RTMP_STRING *)__Buf, __Hex, 1) - -#ifdef CONFIG_AP_SUPPORT -/* linked list, please reference to link_list.h */ -#define FT_KDP_SIGNAL RT_SIGNAL_STRUC - -#define FT_KDP_IOCTL_KEY_REQ(__pAd, __pInfo, __InfoLen) \ - { \ - UINT32 __PeerIP; \ - memcpy(&__PeerIP, __pInfo, FT_IP_ADDRESS_SIZE); \ - FT_KDP_KeyRequestToUs( \ - __pAd, __PeerIP, (__pInfo) + FT_IP_ADDRESS_SIZE, \ - (FT_KDP_EVT_KEY_ELM *)((__pInfo) + \ - FT_IP_ADDRESS_SIZE + \ - FT_NONCE_SIZE)); \ - } - -/* Macros relative to R1KH Table. */ -#define FT_R1NAME_HASH(_Data) \ - (_Data[0] ^ _Data[1] ^ _Data[2] ^ _Data[3] ^ _Data[4] ^ _Data[5] ^ \ - _Data[6] ^ _Data[7] ^ _Data[8] ^ _Data[9] ^ _Data[10] ^ _Data[11] ^ \ - _Data[12] ^ _Data[13] ^ _Data[14] ^ _Data[15]) -#define FT_R1KH_HASH_INDEX(_Data) \ - (FT_R1NAME_HASH(_Data) % (FT_R1KH_ENTRY_HASH_TABLE_SIZE)) -/* YF_FT */ -enum _FT_FSM_STATUS { - TX_AUTH_RSP = 1, - TX_AUTH_ACK, - TX_ASSOC_RSP, - TX_EAPOL_3, -}; - -typedef struct GNU_PACKED _FT_KDP_PMK_KEY_INFO { - UCHAR R0KHID[FT_KDP_R0KHID_MAX_SIZE]; - UCHAR R0KHIDLen; - UCHAR PMKR0Name[FT_KDP_WPA_NAME_MAX_SIZE]; /* an ID that names the PMK-R0 */ - - UCHAR R1KHID[FT_KDP_R1KHID_MAX_SIZE]; - UCHAR S1KHID[FT_KDP_S1KHID_MAX_SIZE]; - - /* reserved field */ - UCHAR RSV[4]; - -} FT_KDP_PMK_KEY_INFO; - -#ifdef IAPP_SUPPORT -typedef struct GNU_PACKED _RT_SIGNAL_STRUC { - /* IEEE80211R_SUPPORT */ - VOID *pNext; /* point to next signal */ - - UINT16 Sequence; - UCHAR MacAddr[ETH_ALEN]; - UCHAR CurrAPAddr[ETH_ALEN]; - -/* YF_FT */ -#ifdef R1KH_HARD_RETRY -/* sw retry counts */ -#define FT_R1KH_CACHE_MISS_THRESHOLD 1 -/* hard retry counts */ -#define FT_R1KH_CACHE_MISS_HARD_RETRY_THRESHOLD 1 -#else /* R1KH_HARD_RETRY */ -#define FT_R1KH_CACHE_MISS_THRESHOLD 7 -#endif /* !R1KH_HARD_RETRY */ - -#define FT_KDP_SIG_NOTHING 0x00 /* no signal */ -#define FT_KDP_SIG_IAPP_ASSOCIATION 0x01 /* a station has associated */ -#define FT_KDP_SIG_IAPP_REASSOCIATION 0x02 /* a station has re-associated */ -#define FT_KDP_SIG_TERMINATE 0x03 /* terminate the daemon */ - -#define FT_KDP_SIG_FT_ASSOCIATION 0x50 /* a FT station has associated */ -#define FT_KDP_SIG_FT_REASSOCIATION 0x51 /* a FT station has re-associated */ -#define FT_KDP_SIG_KEY_TIMEOUT 0x52 /* PMK-R1 KEY Timeout */ -#define FT_KDP_SIG_KEY_REQ 0x53 /* request PMK-R1 KEY from R0KH */ -#define FT_KDP_SIG_ACTION 0x54 /* forward FT Action frame to DS */ - -#define FT_KDP_SIG_AP_INFO_REQ 0x70 /* request neighbor AP info. */ -#define FT_KDP_SIG_AP_INFO_RSP 0x71 /* response my AP info. */ - - /* FT KDP internal use */ -#define FT_KDP_SIG_KEY_REQ_AUTO 0xA0 /* request PMK-R1 KEY from R0KH */ -#define FT_KDP_SIG_KEY_RSP_AUTO 0xA1 /* response PMK-R1 KEY to R1KH */ -#define FT_KDP_SIG_INFO_BROADCAST 0xB0 /* broadcast our AP information */ - -#define FT_KSP_SIG_DEBUG_TRACE 0xC0 /* enable debug flag to TRACE */ - UCHAR Sig; - - UCHAR MacAddrSa[ETH_ALEN]; - - /* IEEE80211R_SUPPORT */ - /* the first 6B are FT_KDP_EVT_HEADER */ - /* - For FT_KDP_SIG_NOTHING: nothing - For FT_KDP_SIG_IAPP_ASSOCIATION:nothing - For FT_KDP_SIG_REASSOCIATION: nothing - For FT_KDP_SIG_TERMINATE: nothing - For FT_KDP_SIG_FT_ASSOCIATION: nothing - FT_KDP_SIG_FT_REASSOCIATION: nothing - For FT_KDP_SIG_KEY_TIMEOUT: it is - For FT_KDP_SIG_KEY_REQ_AUTO: it is FT_KDP_EVT_KEY_REQ - For FT_KDP_SIG_KEY_RSP_AUTO: it is FT_KDP_SIG_KEY_RSP - */ - UCHAR Reserved[3]; /* let address of Content[] 4B align */ - UCHAR Content[1024]; /* signal content */ - - /* 1024 means size of Content[] */ -#define RT_SIGNAL_STRUC_HDR_SIZE (sizeof(RT_SIGNAL_STRUC) - 1024) -} RT_SIGNAL_STRUC, *PRT_SIGNAL_STRUC; - -/* definition of signal */ -#define SIG_NONE 0 /* same as FT_KDP_SIG_NOTHING */ -#define SIG_ASSOCIATION 1 /* same as FT_KDP_SIG_ASSOCIATION */ -#define SIG_REASSOCIATION 2 /* same as FT_KDP_SIG_REASSOCIATION */ -#endif /* IAPP_SUPPORT */ - -/* event */ -#define FT_KDP_EVENT_INFORM(__pAd, __ApIdx, __EventId, __pEvent, __EventLen, \ - __CB) \ - FT_KDP_EventInform(__pAd, __ApIdx, __EventId, (VOID *)__pEvent, \ - __EventLen, 0, __CB) - -/* ----- KDP Linked List ----- */ -#define FT_KDP_EVT_LIST_INSERT_TAIL(__pAd, __pList, __pEntry) \ - { \ - RTMP_SEM_LOCK(&(__pAd)->ApCfg.FtTab.FT_KdpLock); \ - insertTailList((__pList), (RT_LIST_ENTRY *)(__pEntry)); \ - RTMP_SEM_UNLOCK(&(__pAd)->ApCfg.FtTab.FT_KdpLock); \ - } - -#define FT_KDP_EVT_LIST_REMOVE_HEAD(__pAd, __pList, __pEntry) \ - { \ - RTMP_SEM_LOCK(&(__pAd)->ApCfg.FtTab.FT_KdpLock); \ - __pEntry = (FT_KDP_SIGNAL *)removeHeadList((__pList)); \ - RTMP_SEM_UNLOCK(&(__pAd)->ApCfg.FtTab.FT_KdpLock); \ - } - -#define FT_KDP_EVT_LIST_SIZE_GET(__pAd, __pList, __Size) \ - { \ - RTMP_SEM_LOCK(&(__pAd)->ApCfg.FtTab.FT_KdpLock); \ - __Size = getListSize((__pList)); \ - RTMP_SEM_UNLOCK(&(__pAd)->ApCfg.FtTab.FT_KdpLock); \ - } - -#define FT_KDP_EVT_LIST_EMPTY(__pAd, __pList) \ - { \ - FT_KDP_SIGNAL *__pEntry; \ - RTMP_SEM_LOCK(&(__pAd)->ApCfg.FtTab.FT_KdpLock); \ - __pEntry = (FT_KDP_SIGNAL *)removeHeadList((__pList)); \ - while (__pEntry != NULL) { \ - FT_MEM_FREE(__pAd, __pEntry); \ - __pEntry = (FT_KDP_SIGNAL *)removeHeadList((__pList)); \ - } \ - RTMP_SEM_UNLOCK(&(__pAd)->ApCfg.FtTab.FT_KdpLock); \ - } - -/* general */ -#define FT_KDP_CB ((FT_KDP_CTRL_BLOCK *)pAd->ApCfg.FtTab.pFT_KDP_Ctrl_BK) - -typedef struct GNU_PACKED _FT_KDP_EVT_HEADER { - UINT32 EventLen; - UINT32 PeerIpAddr; /* used in daemon, open TCP/IP socket to the IP */ -} FT_KDP_EVT_HEADER; - -typedef struct GNU_PACKED _FT_KDP_EVT_ASSOC { - /* same as IEEE802.11f IAPP */ - UINT16 SeqNum; - UCHAR MacAddr[ETH_ALEN]; -} FT_KDP_EVT_ASSOC; - -typedef struct GNU_PACKED _FT_KDP_EVT_REASSOC { - UINT16 SeqNum; - UCHAR MacAddr[ETH_ALEN]; - UCHAR OldApMacAddr[ETH_ALEN]; -} FT_KDP_EVT_REASSOC; - -typedef struct GNU_PACKED _FT_KDP_EVT_KEY_ELM { - /* must be 65535, Proprietary Information */ -#define FT_KDP_ELM_ID_PRI 65535 - UINT16 ElmId; - -#define FT_KDP_ELM_PRI_LEN (sizeof(FT_KDP_EVT_KEY_ELM) - 4) - UINT16 ElmLen; - - /* must be 0x00 0x0E 0x2E, RALINK */ -#define FT_KDP_ELM_PRI_OUI_0 0x00 -#define FT_KDP_ELM_PRI_OUI_1 0x0E -#define FT_KDP_ELM_PRI_OUI_2 0x2E -#define FT_KDP_ELM_PRI_OUI_SIZE 3 - UCHAR OUI[3]; - - /* station MAC */ - UCHAR MacAddr[ETH_ALEN]; - UCHAR RSV[3]; - - /* used in request */ - FT_KDP_PMK_KEY_INFO KeyInfo; - - /* used in response */ - UCHAR PMKR1Name[FT_KDP_WPA_NAME_MAX_SIZE]; /* an ID that names the PMK-R1 */ - UCHAR PMKR1[FT_KDP_PMKR1_MAX_SIZE]; /* PMK R1 Key */ - UCHAR R0KH_MAC[ETH_ALEN]; /* MAC of R0KH */ - - /* - During a Fast BSS Transition a non-AP STA shall negotiate the same - pairwise cipher suite with Target APs as was negotiated in the FT - Initial Mobility Domain association. The target AP shall verify - that the same pairwise cipher suite selector is used, using the - pairwise cipher suite selector value in the PMK-R1 SA received from - the R0KH. - */ - UCHAR PairwisChipher[4]; - UCHAR AkmSuite[4]; - - UINT32 KeyLifeTime; - UINT32 ReassocDeadline; -} FT_KDP_EVT_KEY_ELM; - -typedef struct _FT_KDP_EVT_ACTION { - UCHAR RequestType; - UCHAR MacDa[ETH_ALEN]; - UCHAR MacSa[ETH_ALEN]; - UCHAR MacAp[ETH_ALEN]; -} FT_KDP_EVT_ACTION; - -/* global function prototype for non-11r modules */ -/* -======================================================================== -Routine Description: - Initialize FT KDP Module. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID FT_KDP_Init(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - Release FT KDP Module. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID FT_KDP_Release(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - Get a event. - -Arguments: - pAd - WLAN control block pointer - **pFtKdp - the queued event; if NULL, no event is queued. - -Return Value: - None - -Note: - Used in IOCTL from FT KDP daemon. -======================================================================== -*/ -VOID FT_KDP_EventGet(IN PRTMP_ADAPTER pAd, OUT FT_KDP_SIGNAL **pFtKdp); - -/* -======================================================================== -Routine Description: - Inform us a event occurs. - -Arguments: - pAd - WLAN control block pointer - ApIdx - MBSS ID - EventId - which event, such as FT_KDP_SIG_FT_ASSOCIATION - *pEvent - event body - EventLen - event body length - PeerIP - peer IP address - pCB - for special use (such as FT_KDP_SIG_ACTION) - -Return Value: - None - -Note: - EventId *pEvent - -------------------------------------------------------------------- - FT_KDP_SIG_FT_ASSOCIATION FT_KDP_EVT_ASSOC - FT_KDP_SIG_FT_REASSOCIATION FT_KDP_EVT_REASSOC - FT_KDP_SIG_KEY_TIMEOUT yet implement - FT_KDP_SIG_KEY_REQ FT_KDP_EVT_KEY_ELM - FT_KDP_SIG_ACTION WLAN Frame Body (Start from Category field) - pCB == FT_KDP_EVT_ACTION - -======================================================================== -*/ -VOID FT_KDP_EventInform(IN PRTMP_ADAPTER pAd, IN UINT32 ApIdx, IN UCHAR EventId, - IN VOID *pEvent, IN UINT16 EventLen, IN UINT32 PeerIP, - IN VOID *pCB); - -/* -======================================================================== -Routine Description: - Inform us a AP request the key. - -Arguments: - pAd - WLAN control block pointer - PeerIP - the IP of R0KH - *pNonce - the nonce for key request - *pEvtKeyReq - information for key request - -Return Value: - TRUE - request ok - FALSE - can not find the IP of R0KH - -Note: - If PeerIP == 0, search its IP from our information record. -======================================================================== -*/ -BOOLEAN FT_KDP_KeyRequestToUs(IN PRTMP_ADAPTER pAd, IN UINT32 PeerIP, - IN UCHAR *pNonce, - IN FT_KDP_EVT_KEY_ELM *pEvtKeyReq); - -/* -======================================================================== -Routine Description: - Inform us a AP response the key. - -Arguments: - pAd - WLAN control block pointer - *pInfo - key information - InfoLen - information length - -Return Value: - None - -Note: - pInfo format is PeerIP (4B) + Nonce (8B) + FT_KDP_EVT_KEY_ELM structure -======================================================================== -*/ -VOID FT_KDP_KeyResponseToUs(IN PRTMP_ADAPTER pAd, IN UINT8 *pInfo, - IN INT32 InfoLen); - -/* -======================================================================== -Routine Description: - Inform us a FT station joins the BSS domain. - -Arguments: - pAd - WLAN control block pointer - *pInfo - station information - InfoLen - information length - -Return Value: - None - -Note: - pInfo format is PeerIP (4B) + Station MAC (6B) -======================================================================== -*/ -VOID FT_KDP_StationInform(IN PRTMP_ADAPTER pAd, IN UINT8 *pInfo, - IN INT32 InfoLen); - -/* -======================================================================== -Routine Description: - Set the encryption/decryption key. - -Arguments: - pAd - WLAN control block pointer - *pKey - the key - KeyLen - the key length - -Return Value: - None - -Note: - Key length can be 8B ~ 64B. -======================================================================== -*/ -VOID FT_KDP_CryptKeySet(IN PRTMP_ADAPTER pAd, IN UCHAR *pKey, IN INT32 KeyLen); - -/* -======================================================================== -Routine Description: - Encrypt the data. - -Arguments: - pAd - WLAN control block pointer - *pData - data buffer - *pDataLen - data buffer length - -Return Value: - None - -Note: -======================================================================== -*/ -VOID FT_KDP_DataEncrypt(IN PRTMP_ADAPTER pAd, INOUT UCHAR *pData, - IN UINT32 *pDataLen); - -/* -======================================================================== -Routine Description: - Decrypt the data. - -Arguments: - pAd - WLAN control block pointer - *pData - data buffer - *pDataLen - data buffer length - -Return Value: - None - -Note: -======================================================================== -*/ -VOID FT_KDP_DataDecrypt(IN PRTMP_ADAPTER pAd, IN UCHAR *pData, - IN UINT32 *pDataLen); - -/* -======================================================================== -Routine Description: - Broadcast our AP information. - -Arguments: - SystemSpecific1 - no use - FunctionContext - WLAN control block pointer - SystemSpecific2 - no use - SystemSpecific3 - no use - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID FT_KDP_InfoBroadcast(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -#ifdef FT_KDP_FUNC_INFO_BROADCAST -/* -======================================================================== -Routine Description: - Receive a neighbor report from another AP. - -Arguments: - pAd - WLAN control block pointer - *pInfo - report information - InfoLen - information length - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID TYPE_FUNC FT_KDP_NeighborReportHandle(IN PRTMP_ADAPTER pAd, - IN UCHAR *pInfo, IN INT32 InfoLen); -#endif /* FT_KDP_FUNC_INFO_BROADCAST */ - -/* -======================================================================== -Routine Description: - Receive a neighbor request from another AP. - -Arguments: - pAd - WLAN control block pointer - *pInfo - report information - InfoLen - information length - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID FT_KDP_NeighborRequestHandle(IN PRTMP_ADAPTER pAd, IN UCHAR *pInfo, - IN INT32 InfoLen); - -/* -======================================================================== -Routine Description: - Receive a neighbor response from another AP. - -Arguments: - pAd - WLAN control block pointer - *pInfo - report information - InfoLen - information length - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID FT_KDP_NeighborResponseHandle(IN PRTMP_ADAPTER pAd, IN UCHAR *pInfo, - IN INT32 InfoLen); - -/* -======================================================================== -Routine Description: - Handle a RRB frame from DS. - -Arguments: - pAd - WLAN control block pointer - *pInfo - report information - InfoLen - information length - -Return Value: - NONE - -Note: -======================================================================== -*/ -VOID FT_RRB_ActionHandle(IN PRTMP_ADAPTER pAd, IN INT32 ApIdx, IN UCHAR *pInfo, - IN INT32 InfoLen); - -BOOLEAN FT_QueryKeyInfoForKDP(IN PRTMP_ADAPTER pAd, IN UINT32 ApIdx, - OUT FT_KDP_EVT_KEY_ELM *pEvtKeyReq); - -#endif /* CONFIG_AP_SUPPORT */ - -/* -======================================================================== -Routine Description: - Initialize FT RIC Module. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID FT_RIC_Init(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - Release FT RIC Module. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: -======================================================================== -*/ -VOID FT_RIC_Release(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - IO control handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - pArgvIn - the data flow information - -Return Value: - None - -Note: - All test commands are listed as follows: - iwpriv ra0 set ft=[cmd id]_[arg1]_[arg2]_......_[argn] - [cmd id] = xx, such as 00, 01, 02, 03, ... -======================================================================== -*/ -INT FT_Ioctl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* -======================================================================== -Routine Description: - FT insert MDIE to packet frame for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_InsertMdIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN PUINT8 pMdId, - IN FT_CAP_AND_POLICY FtCapPlc); - -/* -======================================================================== -Routine Description: - FT configuration handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_CfgInitial(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - FT function initialization for IEEE802.11r. - FT_Init'll allocate tables, control blocks that FT needed. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_Init(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - FT function release for IEEE802.11r. - Free all tables, control blocks which FT_Init allocated. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_Release(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - FT Peer Auth-Req handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -USHORT FT_AuthReqHandler(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PFT_INFO pFtInfo, OUT PFT_INFO pFtInfoBuf); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_EnqueueAuthReply(IN PRTMP_ADAPTER pAd, IN PHEADER_802_11 pRcvHdr, - IN USHORT Alg, IN USHORT Seq, IN USHORT StatusCode, - IN PFT_MDIE_INFO pMdIeInfo, IN PFT_FTIE_INFO pFtIeInfo, - IN PFT_RIC_INFO pRicInfo, IN PUCHAR pRsnIe, - IN UCHAR RsnIeLen); - -/* -======================================================================== -Routine Description: - FT Peer Auth-Confirm handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -USHORT FT_AuthConfirmHandler(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PFT_INFO pFtInfo, OUT PFT_INFO pFtInfoBuf); - -/* -======================================================================== -Routine Description: - FT Peer Association Request handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -USHORT FT_AssocReqHandler(IN PRTMP_ADAPTER pAd, IN BOOLEAN isReassoc, - IN PFT_CFG pFtCfg, IN PMAC_TABLE_ENTRY pEntry, - IN PFT_INFO pPeer_FtInfo, OUT PFT_INFO pFtInfoBuf); - -/* -======================================================================== -Routine Description: - FT Peer Auth-Confirm handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_KDP_KeyResponse(IN PRTMP_ADAPTER pAd, IN UCHAR *pInfo, - IN INT32 InfoLen); - -/* -======================================================================== -Routine Description: - FT Peer Resource Request handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -UINT32 FT_RIC_ResourceRequestHandle(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pCdb, IN UCHAR *pBufReq, - IN UINT32 ReqLen, OUT UCHAR *pBufRsp, - OUT UINT32 *pRspLen); - -/* -======================================================================== -Routine Description: - FT Peer Resource Request handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -UINT32 BA_ResourceAllocate(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pMacEntry, - IN UCHAR *pBufRscReq, OUT UCHAR *pBufRscRsp, - OUT ULONG *pBufRspLen); - -/* -======================================================================== -Routine Description: - FT Peer Auth-Confirm handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_InsertFTIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 Length, - IN FT_MIC_CTR_FIELD MICCtr, IN PUINT8 pMic, - IN PUINT8 pANonce, IN PUINT8 pSNonce); - -/* -======================================================================== -Routine Description: - FT Peer Auth-Confirm handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_FTIE_InsertKhIdSubIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN FT_SUB_ELEMENT_ID SubId, - IN PUINT8 pKhId, IN UINT8 KhIdLen); - -/* -======================================================================== -Routine Description: - FT Peer Auth-Confirm handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_FTIE_InsertGTKSubIE(IN PRTMP_ADAPTER pAd, IN PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN PUINT8 pGtkSubIe, - IN UINT8 GtkSubIe_len); - -VOID FT_FTIE_InsertIGTKSubIE(IN PRTMP_ADAPTER pAd, IN PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN PUINT8 pGtkSubIe, - IN UINT8 GtkSubIe_len); - -/* -======================================================================== -Routine Description: - FT Peer Auth-Confirm handler for IEEE802.11r. - -Arguments: - pAd - WLAN control block pointer - -Return Value: - None - -Note: - -======================================================================== -*/ -VOID FT_InsertTimeoutIntervalIE(OUT PUCHAR pFrameBuf, OUT PULONG pFrameLen, - IN FT_TIMEOUT_INTERVAL_TYPE Type, - IN UINT32 TimeOutValue); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -VOID FT_R1khEntryTabInit(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -INT FT_R1khEntryInsert(IN PRTMP_ADAPTER pAd, IN PUINT8 pPmkR0Name, - IN PUINT8 pPmkR1Name, IN PUINT8 pPmkR1Key, - IN PUINT8 pPairwisChipher, IN PUINT8 pAkmSuite, - IN UINT32 KeyLifeTime, IN UINT32 RassocDeadline, - IN PUINT8 pR0khId, IN UINT8 R0khIdLen, - IN PUINT8 pStaMac); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -VOID FT_R1khEntryDelete(IN PRTMP_ADAPTER pAd, IN PFT_R1HK_ENTRY pEntry); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -VOID FT_R1khEntryTabDestroy(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -PFT_R1HK_ENTRY FT_R1khEntryTabLookup(IN PRTMP_ADAPTER pAd, - IN PUINT8 pPMKR1Name); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -VOID FT_FillMdIeInfo(PEID_STRUCT eid_ptr, PFT_MDIE_INFO pMdIeInfo); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -VOID FT_FillFtIeInfo(PEID_STRUCT eid_ptr, PFT_FTIE_INFO pFtIeInfo); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -VOID FT_FtAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -VOID FT_RrbHandler(IN PRTMP_ADAPTER pAd, IN INT32 ApIdx, IN PUCHAR pPktSrc, - IN INT32 PktLen); - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -VOID FT_R1KHInfoMaintenance(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - Display all R0KH information. - -Arguments: - pAd - WLAN control block pointer - *pArgv - input parameters - -Return Value: - TRUE - -Note: -======================================================================== -*/ -INT FT_KDP_CMD_R0KH_InfoShow(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID FT_MakeFtActFrame(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 ActType, - IN PUCHAR pStaMac, IN PUCHAR pTargetApMac, - IN UINT16 StatusCode, IN PFT_INFO pFtInfo); - -VOID FT_DerivePMKR0(IN PUINT8 xxkey, IN INT xxkey_len, IN PUINT8 ssid, - IN INT ssid_len, IN PUINT8 mdid, IN PUINT8 r0khid, - IN INT r0khid_len, IN PUINT8 s0khid, OUT PUINT8 pmkr0, - OUT PUINT8 pmkr0_name); - -VOID FT_DerivePMKR1Name(IN PUINT8 pmkr0_name, IN PUINT8 r1khid, - IN PUINT8 s1khid, OUT PUINT8 pmkr1_name); - -VOID FT_DerivePMKR1(IN PUINT8 pmkr0, IN PUINT8 pmkr0_name, IN PUINT8 r1khid, - IN PUINT8 s1khid, OUT PUINT8 pmkr1, OUT PUINT8 pmkr1_name); - -VOID FT_DerivePTK(IN PUINT8 pmkr1, IN PUINT8 pmkr1_name, IN PUINT8 a_nonce, - IN PUINT8 s_nonce, IN PUINT8 bssid, IN PUINT8 sta_mac, - IN UINT key_len, OUT PUINT8 ptk, OUT PUINT8 ptk_name); - -VOID FT_CalculateMIC(IN PUINT8 sta_addr, IN PUINT8 ap_addr, IN PUINT8 kck, - IN UINT8 seq, IN PUINT8 rsnie, IN UINT8 rsnie_len, - IN PUINT8 mdie, IN UINT8 mdie_len, IN PUINT8 ftie, - IN UINT8 ftie_len, IN PUINT8 ric, IN UINT8 ric_len, - OUT PUINT8 mic); - -void FT_rtmp_read_parameters_from_file(IN PRTMP_ADAPTER pAd, - RTMP_STRING *tmpbuf, - RTMP_STRING *pBuffer); - -INT Set_FT_Enable(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_FT_Mdid(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_FT_R0khid(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_FT_RIC(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_FT_OTD(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Show_FTConfig_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#endif /* __FT_H */ -#endif /* DOT11R_FT_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ft_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ft_cmm.h deleted file mode 100644 index b10e450fd0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ft_cmm.h +++ /dev/null @@ -1,244 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - Define all structures, data types that rtmp.h needed in this file. Don't - put any sturctures and functions definition which refer to RTMP_ADAPTER - Here. - - -***************************************************************************/ - -#ifdef DOT11R_FT_SUPPORT - -#ifndef __FT_CMM_H__ -#define __FT_CMM_H__ - -#include "dot11r_ft.h" -#include "security/dot11i_wpa.h" - -/* ========================================================================== */ -/* Definition */ -#define IS_FT_RSN_STA(_pEntry) \ - ((_pEntry) && IS_ENTRY_CLIENT(_pEntry) && \ - (_pEntry->MdIeInfo.Len != 0) && (_pEntry->RSNIE_Len > 0) && \ - (IS_AKM_FT_WPA2(_pEntry->SecConfig.AKMMap) || \ - IS_AKM_FT_WPA2PSK(_pEntry->SecConfig.AKMMap) || \ - IS_AKM_FT_SAE_SHA256(_pEntry->SecConfig.AKMMap) || \ - IS_AKM_FT_WPA2_SHA384(_pEntry->SecConfig.AKMMap))) - -#define FT_SET_MDID(__D, __S) \ - NdisMoveMemory((PUCHAR)(__D), (PUCHAR)(__S), FT_MDID_LEN) - -#define FT_MDID_EQU(__D, __S) (memcmp((__D), (__S), FT_MDID_LEN) == 0) - -/* ----- General ----- */ -#define FT_KDP_FUNC_SOCK_COMM /* used socket to communicate with driver */ -#define FT_KDP_FUNC_R0KH_IP_RECORD /* used to keep IP of any R0KH */ -/*#define FT_KDP_FUNC_INFO_BROADCAST broadcast my AP information periodically */ -#define FT_KDP_TEST - -#define FT_KDP_RALINK_PASSPHRASE "Ralink" -#define FT_KDP_KEY_DEFAULT "12345678" -#define FT_KDP_KEY_ENCRYPTION_EXTEND 8 /* 8B for AES encryption extend size */ -#define FT_DEFAULT_MDID "RT" - -#define FT_REASSOC_DEADLINE 20 - -#define FT_KDP_INFO_BC_PERIOD_TIME 1000 /* 1s */ - -#define IAPP_ETH_PRO 0xEEEE - -/* key information */ -#define FT_IP_ADDRESS_SIZE 4 -#define FT_NONCE_SIZE 8 - -#define FT_KDP_WPA_NAME_MAX_SIZE 16 -#define FT_KDP_R0KHID_MAX_SIZE 48 -#define FT_KDP_R1KHID_MAX_SIZE 6 -#define FT_KDP_S1KHID_MAX_SIZE 6 -#define FT_KDP_PMKR1_MAX_SIZE 32 /* 256-bit key */ - -#define FT_R1KH_ENTRY_TABLE_SIZE 64 -#define FT_R1KH_ENTRY_HASH_TABLE_SIZE FT_R1KH_ENTRY_TABLE_SIZE - -/* ----- FT KDP ----- */ -#define FT_KDP_EVENT_MAX 10 /* queue max 10 events */ - -/* ----- FT RIC ----- */ -#define MAX_RICIES_LEN 255 - -/* ========================================================================== */ -/* FT user configuration. */ - -/* ethernet header */ -typedef struct _FT_DRV_ETH_HEADER { - UCHAR DA[ETH_ALEN]; - UCHAR SA[ETH_ALEN]; - UINT16 Len; - -} GNU_PACKED FT_DRV_ETH_HEADER; - -/* R0KH information record */ -typedef struct _FT_KDP_R0KH_INFO { - struct _FT_KDP_R0KH_INFO *pNext; - - UCHAR R0KHID[FT_KDP_R0KHID_MAX_SIZE]; - UCHAR MAC[ETH_ALEN]; - UINT32 IP; - - ULONG TimeUpdate; - -} FT_KDP_R0KH_INFO; - -/* FT KDP Control Block */ -typedef struct _FT_KDP_CTRL_BLOCK { - /* used to record all known R0KH information in the DS */ -#ifdef FT_KDP_FUNC_R0KH_IP_RECORD -#define FT_KDP_R0KH_INFO_MAX_SIZE 256 - FT_KDP_R0KH_INFO *R0KH_InfoHead; - FT_KDP_R0KH_INFO *R0KH_InfoTail; - UINT32 R0KH_Size; -#endif /* FT_KDP_FUNC_R0KH_IP_RECORD */ - -#ifndef FT_KDP_FUNC_SOCK_COMM - /* if the signal context is got from FT KDP daemon */ - struct _LIST_HEADER EventList; -#endif /* FT_KDP_SOCK_COMM */ - -#ifdef FT_KDP_FUNC_INFO_BROADCAST - RALINK_TIMER_STRUCT TimerReport; -#endif /* FT_KDP_FUNC_INFO_BROADCAST */ - - /* used to encrypt/decrypt the DS packet */ - UCHAR CryptKey[100]; -} FT_KDP_CTRL_BLOCK; - -/* FT RIC Control Block */ - -typedef struct _FT_CAP_CFG { - UINT8 FtOverDs : 1; /* 1: Enable FT over the DS. */ - UINT8 RsrReqCap : 1; /* 1: Enable FT resource request. */ - UINT8 Dot11rFtEnable : 1; /* 1: FT enable , 0: FT disable. */ - UINT8 Reserved : 5; /* reserve. */ -} FT_CAP_CFG, *PFT_CAP_CFG; - -typedef struct GNU_PACKED _FT_CFG { - UINT8 FtMdId[FT_MDID_LEN]; /* Mobility domain ID of Fast Bss. */ - UINT32 AssocDeadLine; /* 100ms */ - UINT8 FtR0khId[FT_ROKH_ID_LEN + - 1]; /* Lenght of ROKHID can be 1 to 48 chars. */ - UINT8 FtR0khIdLen; -#ifdef HOSTAPD_11R_SUPPORT - UINT8 FtR1khId[ETH_ALEN]; -#endif - FT_CAP_CFG FtCapFlag; /* FT capability Configuration. */ -} FT_CFG, *PFT_CFG; - -typedef struct __FT_R1KH_ENTRY { - struct __FT_R1KH_ENTRY *pNext; - UINT32 KeyLifeTime; - UINT32 RassocDeadline; - UINT32 AKMMap; - UINT8 PmkR0Name[16]; - UINT8 PmkR1Name[16]; - UINT8 PmkR1Key[32]; - UINT8 PairwisChipher[4]; - UINT8 AkmSuite[4]; - UINT8 R0khId[FT_ROKH_ID_LEN + 1]; - UINT8 R0khIdLen; - UINT8 StaMac[6]; -} FT_R1HK_ENTRY, *PFT_R1HK_ENTRY; - -typedef struct __FT_TAB { - /* KDP. */ - PVOID pFT_KDP_Ctrl_BK; - NDIS_SPIN_LOCK FT_KdpLock; - BOOLEAN FlgIsFtKdpInit; - - /* R1KH. */ - LIST_HEADER FT_R1khEntryTab[FT_R1KH_ENTRY_HASH_TABLE_SIZE]; - NDIS_SPIN_LOCK FT_R1khEntryTabLock; - ULONG FT_R1khEntryTabSize; - - BOOLEAN FT_R1khEntryTabReady; - -#ifdef FT_R1KH_KEEP - /* - Keep the R1KH catch table on Radio Off state for MBO-4.2.6(E) case to meet the R1KH miss case. - */ - BOOLEAN FT_RadioOff; -#endif /* FT_R1KH_KEEP */ - -} FT_TAB, *PFT_TAB; - -typedef struct __FT_MDIE_INFO { - INT Len; - UINT8 MdId[FT_MDID_LEN]; - FT_CAP_AND_POLICY FtCapPlc; - - PVOID pMdIe; -} FT_MDIE_INFO, *PFT_MDIE_INFO; - -typedef struct __FT_FTIE_INFO { - INT Len; - FT_MIC_CTR_FIELD MICCtr; - UINT8 MIC[16]; - UINT8 ANonce[32]; - UINT8 SNonce[32]; - UINT8 R0khIdLen; - UINT8 R0khId[FT_ROKH_ID_LEN + 1]; - UINT8 R1khIdLen; - UINT8 R1khId[FT_R1KH_ID_LEN + 1]; - UINT8 GtkLen; - UINT8 GtkSubIE[64]; - UINT8 IGtkLen; - UINT8 IGtkSubIE[64]; - - PVOID pFtIe; -} FT_FTIE_INFO, *PFT_FTIE_INFO; - -typedef struct __FT_RIC_INFO { - INT Len; - VOID *pRicInfo; - UINT8 RicIEs[MAX_RICIES_LEN]; - UINT8 RicIEsLen; -} FT_RIC_INFO, *PFT_RIC_INFO; - -typedef struct __FT_INFO { - FT_MDIE_INFO MdIeInfo; - FT_FTIE_INFO FtIeInfo; - FT_RIC_INFO RicInfo; - UCHAR RSNIE_Len; - UCHAR RSN_IE[MAX_LEN_OF_RSNIE]; -} FT_INFO, *PFT_INFO; - -typedef struct __FT_MIC_CONTENT { - PUINT8 rsnie_ptr; - UINT rsnie_len; - PUINT8 mdie_ptr; - UINT mdie_len; - PUINT8 ftie_ptr; - UINT ftie_len; - PUINT8 ric_ptr; - UINT ric_len; -} FT_MIC_CONTENT, *PFT_MIC_CONTENT; - -#endif /* __FT_CMM_H__ */ -#endif /* DOT11R_FT_SUPPORT */ - -/* End of ft_cmm.h */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ftm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ftm.h deleted file mode 100644 index c197b48269..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ftm.h +++ /dev/null @@ -1,170 +0,0 @@ -/**************************************************************************** -* Mediatek Inc. -* 5F., No.5, Taiyuan 1st St., Zhubei City, -* Hsinchu County 302, Taiwan, R.O.C. -* (c) Copyright 2014, Mediatek, Inc. -* -* All rights reserved. Mediatek's source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of Mediatek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of Mediatek, Inc. is obtained. -**************************************************************************** - - Module Name: - ftm.h - - Abstract: - 802.11mc FTM protocol function prototype declaration. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - annie 2014.11.22 Initial version. -*/ - -#ifndef __FTM_H__ -#define __FTM_H__ - -BOOLEAN FtmEntryDump(IN PRTMP_ADAPTER pAd, IN PFTM_PEER_ENTRY pEntry, - IN UINT32 DbgLvl); - -VOID FtmPidPendingQDump(IN PRTMP_ADAPTER pAd, IN UINT32 DbgLvl); - -UINT32 FtmMinDeltaToMS(IN UINT32 MinDelta); - -UINT32 FtmBurstDurationToMS(IN UINT8 BurstDuration); - -BOOLEAN FtmConvertTodToa(IN PRTMP_ADAPTER pAd, IN UINT64 *pTOD, - IN UINT64 *pTOA); - -inline UINT8 FtmGetNewPid(IN PRTMP_ADAPTER pAd); - -VOID FtmAddPidPendingNode(IN PRTMP_ADAPTER pAd, IN PFTM_PEER_ENTRY pEntry, - IN UINT8 PID); - -INT FtmDeqPidPendingNode(IN PRTMP_ADAPTER pAd, IN PFTM_PEER_ENTRY pEntry); - -PFTM_PEER_ENTRY FtmGetPidPendingNode(IN PRTMP_ADAPTER pAd, IN UINT8 PID); - -VOID FtmMgmtInit(IN PRTMP_ADAPTER pAd); - -VOID FtmMgmtExit(IN PRTMP_ADAPTER pAd); - -VOID FtmPeerTableInit(IN PRTMP_ADAPTER pAd); - -PFTM_PEER_ENTRY FtmEntrySearch(IN PRTMP_ADAPTER pAd, IN UINT8 *Addr); - -PFTM_PEER_ENTRY FtmEntryGet(IN PRTMP_ADAPTER pAd, IN UINT8 *Addr); - -VOID FtmEntryNegoDoneAction(IN PRTMP_ADAPTER pAd, IN PFTM_PEER_ENTRY pEntry); - -BOOLEAN FtmEntryCntDownAction(IN PRTMP_ADAPTER pAd, IN PFTM_PEER_ENTRY pEntry); - -BOOLEAN FtmEntryTerminate(IN PRTMP_ADAPTER pAd, IN PFTM_PEER_ENTRY pEntry, - IN BOOLEAN bTxFTM); - -VOID SendFTM(IN PRTMP_ADAPTER pAd, IN UINT8 *Addr, IN CHAR Reason); - -VOID ReceiveFTMReq(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID ReceiveFTM(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID FtmTimerCallback(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID FtmTxTimerCallback(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -#ifdef FTM_INITIATOR -VOID FtmRxTmrQDump(IN PRTMP_ADAPTER pAd, IN PFTM_PEER_ENTRY pEntry, - IN UINT32 DbgLvl); - -PFTM_MAPPING FtmSearchRxMappingNodeBySN(IN PRTMP_ADAPTER pAd, - IN PFTM_PEER_ENTRY pEntry, - IN UINT16 sn); - -PFTM_MAPPING FtmGetRxMappingNodeByToken(IN PRTMP_ADAPTER pAd, - IN PFTM_PEER_ENTRY pEntry, - IN UINT8 DialogToken); - -INT32 FtmRTTCalculate(IN UINT64 *pT1, IN UINT64 *pT2, IN UINT64 *pT3, - IN UINT64 *pT4); - -INT Show_FtmRxTmrQ_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -#endif /* FTM_INITIATOR */ - -VOID FtmReqTxTimerCallback(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID SendFTMRequest(IN PRTMP_ADAPTER pAd, IN UINT8 *Addr, IN BOOLEAN bSetLci, - IN BOOLEAN bSetCivic, IN BOOLEAN bSetParm); - -INT Set_FtmReqTx_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmAsapReq_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmMinDelta_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmNum_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmBurstExp_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmLciValue_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmLciLat_ThisAP_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmLciLng_ThisAP_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmLciAlt_ThisAP_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmLciLat_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg, - IN PLCI_FIELD pLci); - -INT Set_FtmLciLng_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg, - IN PLCI_FIELD pLci); - -INT Set_FtmLciAlt_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg, - IN PLCI_FIELD pLci); - -INT Set_FtmLciKnown_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmLciFlag_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmCivicKnown_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmCivicFlag_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmZFlag_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmBurstDuration_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_FtmBurstPeriod_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Show_FtmEntry_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Show_FtmPidList_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Show_FtmLciValue_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -VOID FtmMapSigmaCmdToLocLCI(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *tmpbuf, - IN PLCI_FIELD pLci); - -VOID FtmProfileNeighborApParse(IN RTMP_ADAPTER *pAd, IN UINT NeighborIdx, - IN RTMP_STRING *tmpbuf); - -INT Send_ANQP_Req_For_Test(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Send_NeighborReq_For_Test(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_FtmRMRandomizationInterval_Proc(IN RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT Set_FtmRMMinimumApCount_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Send_RadioMeasurement_Req_For_Test(IN PRTMP_ADAPTER pAd, - IN RTMP_STRING *arg); - -#endif /* __FTM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ftm_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ftm_cmm.h deleted file mode 100644 index 1bab8af541..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ftm_cmm.h +++ /dev/null @@ -1,558 +0,0 @@ -/**************************************************************************** -* Mediatek Inc. -* 5F., No.5, Taiyuan 1st St., Zhubei City, -* Hsinchu County 302, Taiwan, R.O.C. -* (c) Copyright 2014, Mediatek, Inc. -* -* All rights reserved. Mediatek's source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of Mediatek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of Mediatek, Inc. is obtained. -**************************************************************************** - - Module Name: - ftm_cmm.h - - Abstract: - 802.11mc FTM protocol struct, enum, and macro declaration. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - annie 2014.11.22 Initial version. -*/ - -#ifndef __FTM_CMM_H__ -#define __FTM_CMM_H__ - -#define NUMBER_PID_FTM (PID_FTM_MAX - PID_FTM_MIN + 1) /* 32: 0x21~0x40 */ -#define MASK_PID_FTM (NUMBER_PID_FTM - 1) /* 0x1F: 5 bits */ -#define FTMPID_NOT_WAITING 0 - -#define MAX_FTM_TBL_EXPONENT 4 -#define MAX_FTM_TBL_SIZE (1 << MAX_FTM_TBL_EXPONENT) /* 16 = 2^4 */ -#define FTM_TBL_HASH_INDEX(Addr) (MAC_ADDR_HASH(Addr) & (MAX_FTM_TBL_SIZE - 1)) - -#define INVALID_FTM_ENTRY_IDX 0xFF -#define VALIDATE_FTM_ENTRY_IDX(idx) (idx < MAX_FTM_TBL_SIZE) - -#define INCREASE_IDX(var, min, max) \ - { \ - if ((var) == (max - 1)) \ - (var) = (min); \ - else \ - (var)++; \ - } - -#define DECREASE_IDX(var, min, max) \ - { \ - if ((var) == (min)) \ - (var) = (max - 1); \ - else \ - (var)--; \ - } - -#define GET_FTM_PEER_IDX(pAd, ptr) ((ptr) - (pAd)->pFtmCtrl->FtmPeer) - -#define CNT_DOWN_DECREASE(var) \ - { \ - if (var) \ - (var)--; \ - else \ - MTWF_LOG( \ - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, \ - ("%s()#%d: CAUSION!! Before CntDown the value is zero!!\n", \ - __func__, __LINE__)); \ - } - -#define FTM_DEFAULT_ASAP FALSE -#define FTM_DEFAULT_MIN_DELTA_FTM 80 -#define FTM_DEFAULT_FTMS_PER_BURST 5 -#define FTM_DEFAULT_NUM_BURST_EXP 0 /* follow up testplan: single burst */ -#define FTM_DEFAULT_BURST_DURATION FTMBST_128MS -#define FTM_DEFAULT_BURST_PERIOD 2 -#define FTM_DEFAULT_PTSF_DELTA 15 /* unit: ms */ -#define FTM_MAX_NUM_OF_RETRY 15 -#define FTM_EACH_TMR_WAITING_TIME 1 /* unit: 1 ms, follows RTMPSetTimer */ -#define FTM_TRGGER_TIMEOUT 5000 /* unit: ms */ - -/* 802.11mc D3.0: 8.4.2.20.10 (p.743): - Figure 8-162, Measurement Request field format for LCI request -*/ -typedef struct _MSMT_REQ_LCI { - UINT8 LocationSubj; -} MSMT_REQ_LCI, *PMSMT_REQ_LCI; - -/* 802.11mc D3.0: 8.4.2.20.10 (p.744): - Figure 8-164, Azimuth Request field -*/ -typedef union GNU_PACKED _AZIMUTH_REQUEST { -#ifdef RT_BIG_ENDIAN - struct GNU_PACKED { - UINT8 Reserved : 3; - UINT8 AzType : 1; /* Azimuth Type */ - UINT8 AzResReq : 4; /* Azimuth Resolution Requested */ - } field; -#else - struct GNU_PACKED { - UINT8 AzResReq : 4; /* Azimuth Resolution Requested */ - UINT8 AzType : 1; /* Azimuth Type */ - UINT8 Reserved : 3; - } field; -#endif /* RT_BIG_ENDIAN */ - UINT8 word; -} AZIMUTH_REQUEST, *PAZIMUTH_REQUEST; - -/* 802.11mc D3.0: 8.4.2.20.14 (p.751): - Figure 8-178, Location Civic Request field format -*/ -typedef struct GNU_PACKED _MSMT_REQ_CIVIC { - UINT8 LocationSubj; - UINT8 CivicLocType; - UINT8 ServiceIntvUnits; - UINT16 ServiceInterval; -} MSMT_REQ_CIVIC, *PMSMT_REQ_CIVIC; - -/* 802.11mc D3.0: 8.4.2.21.10 (p.780): - Figure 8-210, LCI subelement format -*/ -typedef struct GNU_PACKED _MSMT_RPT_SUBELEMENT { - UINT8 SubElement; - UINT8 Length; -} MSMT_RPT_SUBELEMENT, *PMSMT_RPT_SUBELEMENT; - -/* 802.11mc D3.0: (p.781): - Figure 8-211, LCI field format -*/ -typedef union GNU_PACKED _LCI_FIELD { -#ifdef RT_BIG_ENDIAN - struct GNU_PACKED { - UINT8 STAVersion : 2; - UINT8 Dependent : 1; - UINT8 RegLocDSE : 1; - UINT8 RegLocAgreement : 1; - UINT8 Datum : 3; - - /* Altitude: 5 bytes */ - UINT8 Altitude_b22_b29; - - UINT32 Altitude_b0_b21 : 22; - UINT32 AltitudeUncertainty : 6; - UINT32 AltitudeType : 4; - - /* Longitude: 5 bytes */ - UINT32 Longitude_b2_b33; - UINT8 Longitude_b0_b1 : 2; - UINT8 LongitudeUncertainty : 6; - - /* Latitude: 5 bytes */ - UINT32 Latitude_b2_b33; - UINT8 Latitude_b0_b1 : 2; - UINT8 LatitudeUncertainty : 6; - } field; -#else - struct GNU_PACKED { - /* Latitude: 5 bytes = 1+4 */ - UINT8 LatitudeUncertainty : 6; - UINT8 Latitude_b0_b1 : 2; - UINT32 Latitude_b2_b33; - - /* Longitude: 5 bytes = 1+4 */ - UINT8 LongitudeUncertainty : 6; - UINT8 Longitude_b0_b1 : 2; - UINT32 Longitude_b2_b33; - - /* Altitude: 5 bytes = 4+1 */ - UINT32 AltitudeType : 4; - UINT32 AltitudeUncertainty : 6; - UINT32 Altitude_b0_b21 : 22; - UINT8 Altitude_b22_b29; - - UINT8 Datum : 3; - UINT8 RegLocAgreement : 1; - UINT8 RegLocDSE : 1; - UINT8 Dependent : 1; - UINT8 STAVersion : 2; - } field; -#endif /* RT_BIG_ENDIAN */ - - UINT8 byte[16]; -} LCI_FIELD, *PLCI_FIELD; - -/* 802.11mc D3.0: 8.4.2.21.10 (p.784): - Figure 8-215, STA Floor Info field format -*/ -typedef union GNU_PACKED _STA_FLOOR_INFO { -#ifdef RT_BIG_ENDIAN - struct GNU_PACKED { - UINT16 LocationPolicy : 1; - UINT16 FloorNum : 14; - UINT16 ExpectedToMove : 1; - } field; -#else - struct GNU_PACKED { - UINT16 ExpectedToMove : 1; - UINT16 FloorNum : 14; - UINT16 LocationPolicy : 1; - } field; -#endif /* RT_BIG_ENDIAN */ - - UINT16 word; -} STA_FLOOR_INFO, *PSTA_FLOOR_INFO; - -/* 802.11mc D3.0: (p.783): - Figure 8-214, Z subelement format -*/ -typedef struct GNU_PACKED _Z_ELEMENT { - UINT8 SubElement; - UINT8 Length; - STA_FLOOR_INFO Floor; - UINT16 HeightAboveFloor; - UINT8 HeightUncertainty; -} Z_ELEMENT, *PZ_ELEMENT; - -/* 802.11mc D4.0: (p.794) - Usage Rules/Policy Parameters field format -*/ -typedef union GNU_PACKED _LCI_USAGE_RULES_POLICY { -#ifdef RT_BIG_ENDIAN - struct GNU_PACKED { - UINT8 Reserved : 5; - UINT8 LocationPolicy : 1; - UINT8 RetExpiresPresent : 1; - UINT8 RetransAllowed : 1; - } field; -#else - struct GNU_PACKED { - UINT8 RetransAllowed : 1; - UINT8 RetExpiresPresent : 1; - UINT8 LocationPolicy : 1; - UINT8 Reserved : 5; - } field; -#endif /* RT_BIG_ENDIAN */ - - UINT8 word; -} LCI_USAGE_RULES_POLICY, *PLCI_USAGE_RULES_POLICY; - -/* - D4.0: (P793) - Usage Rules/Policy subelement -*/ -typedef struct GNU_PACKED _USAGE_SUBELEMENT { - UINT8 SubElement; - UINT8 Length; - LCI_USAGE_RULES_POLICY RulesAndPolicy; - UINT16 RetExpires; -} USAGE_SUBELEMENT, *PUSAGE_SUBELEMENT; - -#define MAX_CIVIC_CA_VALUE_LENGTH 0xF5 -typedef struct GNU_PACKED _LOCATION_CIVIC { - char CountryCode[2]; - UINT8 CA_Type; - UINT8 CA_Length; - UINT8 CA_Value[0]; -} LOCATION_CIVIC, *PLOCATION_CIVIC; - -typedef struct GNU_PACKED _FTM_REQUEST_FRAME { - UINT8 Category; - UINT8 Action; - UINT8 Trigger; - UINT8 Variable[0]; -} FTM_REQUEST_FRAME, *PFTM_REQUEST_FRAME; - -typedef struct GNU_PACKED _FTM_ERROR_FIELD { - UINT16 MaxError : 15; - UINT16 NotConti : 1; -} FTM_ERROR_FIELD, *PFTM_ERROR_FIELD; - -typedef struct GNU_PACKED _FTM_FRAME { - UINT8 Category; - UINT8 Action; - UINT8 DialogToken; - UINT8 FollowUpDialogToken; - UINT8 TOD[6]; - UINT8 TOA[6]; - FTM_ERROR_FIELD TODError; - FTM_ERROR_FIELD TOAError; - UINT8 Variable[0]; -} FTM_FRAME, *PFTM_FRAME; - -typedef struct _TMR_NODE { - TMR_FRM_STRUC HwReport; - UINT64 toa; - UINT64 tod; -} TMR_NODE, *PTMR_NODE; - -#ifdef FTM_INITIATOR -typedef struct _FTM_MAPPING { - DL_LIST list; /* queue head: RxTmrQ in FTM_PEER_ENTRY */ - TMR_NODE tmr; - UINT16 sn; - - /* Rx information */ - UINT8 DialogToken; - UINT8 FollowUpToken; - UINT64 PeerTOA; - UINT64 PeerTOD; -} FTM_MAPPING, *PFTM_MAPPING; -#endif /* FTM_INITIATOR */ - -typedef struct _FTM_PEER_ENTRY { - /* FTM Timer related */ - RALINK_TIMER_STRUCT FtmTimer; - RALINK_TIMER_STRUCT FtmTxTimer; - PVOID pAd; /* for timer callback */ - - /* FTM initiator info maintain */ - UINT8 State; - UINT8 Addr[MAC_ADDR_LEN]; - BOOLEAN bLciMsmtReq; - BOOLEAN bCivicMsmtReq; - BOOLEAN bLciMsmtReport; - BOOLEAN bCivicMsmtReport; - FTM_PARAMETER PeerReqParm; - FTM_PARAMETER VerdictParm; - UINT8 DialogToken; - UINT8 LciToken; - UINT8 CivicToken; - UINT8 BurstCntDown; - UINT8 FtmCntDown; - - /* For Software Retry */ - UINT8 FollowUpToken; - TMR_NODE FollowUpTmr; - - /* Hardware report */ - TMR_NODE Tmr; - BOOLEAN bNeedTmr; - DL_LIST PidList; /* queue head: PidPendingQ in FTM_CTRL */ - UINT8 PendingPid; /* valid value: 0x21~0x40, valid period: after Tx, before TMR inetrrupt */ - UINT8 TransAndRetrans; /* Num of FTM (of the same follow up token) transmission and retransmission times */ - BOOLEAN bGotTmr; - BOOLEAN bTxOK; - BOOLEAN bTxSCallbackCheck; /* 1: FtmTxTimer is used for TxS check, 0: FtmTxTimer is used for min_delta */ - -#ifdef FTM_INITIATOR - /* FTM initiator control */ - DL_LIST RxTmrQ; - NDIS_SPIN_LOCK RxTmrQLock; -#endif /* FTM_INITIATOR */ -} FTM_PEER_ENTRY, *PFTM_PEER_ENTRY; - -typedef struct _FTM_NEIGHBORS { - /* FTM Neighbor info maintain */ - BOOLEAN NeighborValid; - UINT8 NeighborBSSID[MAC_ADDR_LEN]; - UINT8 NeighborPhyType; - UINT8 NeighborFTMrespCap; - UINT8 NeighborOpClass; - UINT8 NeighborChannel; - BOOLEAN NeighborFTMCap; - - /* Neighbor LCI/CIVIC info*/ - MSMT_RPT_SUBELEMENT LciHdr; - LCI_FIELD LciField; - Z_ELEMENT LciZ; - USAGE_SUBELEMENT LciUsage; - MSMT_RPT_SUBELEMENT CivicHdr; - LOCATION_CIVIC Civic; - UINT8 CA_Value[MAX_CIVIC_CA_VALUE_LENGTH]; - BOOLEAN bSetNeighbotZRpt; - -} FTM_NEIGHBORS, *PFTM_NEIGHBORS; - -typedef struct _FTM_CTRL { - UINT8 DialogToken; - UINT8 LatestJoinPeer; - DL_LIST PidPendingQ; - NDIS_SPIN_LOCK PidPendingQLock; - - /* FTM Parameters */ - BOOLEAN asap; - UINT8 min_delta_ftm; - UINT8 ftms_per_burst; - UINT8 num_burst_exponent; - UINT8 burst_duration; - UINT16 burst_period; - MSMT_RPT_SUBELEMENT LciHdr; - LCI_FIELD LciField; - Z_ELEMENT LciZ; - USAGE_SUBELEMENT LciUsage; - MSMT_RPT_SUBELEMENT CivicHdr; - LOCATION_CIVIC Civic; - UINT8 CA_Value[MAX_CIVIC_CA_VALUE_LENGTH]; - - /* FTM initiator peers */ - FTM_PEER_ENTRY FtmPeer[MAX_FTM_TBL_SIZE]; - - UINT32 BurstCntDown; - UINT8 Responder[MAC_ADDR_LEN]; - BOOLEAN WaitForNego; - RALINK_TIMER_STRUCT FtmReqTimer; - BOOLEAN bSetLciReq; - BOOLEAN bSetCivicReq; - BOOLEAN bSetLciRpt; - BOOLEAN bSetZRpt; - BOOLEAN bSetCivicRpt; - UINT8 TokenLCI; - UINT8 TokenCivic; - /* FTM Neighbors */ - UINT8 FtmNeighborIdx; - FTM_NEIGHBORS FtmNeighbor[MAX_FTM_TBL_SIZE]; - - /*PF2 4.2.6 manual test*/ - UINT16 RandomizationInterval; - UINT8 MinimumApCount; - -} FTM_CTRL, *PFTM_CTRL; - -enum FTM_PEER_STATE { - FTMPEER_UNUSED, - FTMPEER_IDLE, - FTMPEER_NEGO, - FTMPEER_MEASURING_IN_BURST, - FTMPEER_MEASURING_WAIT_TRIGGER -}; - -/* 802.11mc D3.0: 8.4.2.20 (p.726): - Table 8-90, Measurement Type definitions for measurement requests -*/ -enum MEASUREMENT_TYPE_REQUEST { - MSMT_LCI_REQ = 8, - MSMT_LOCATION_CIVIC_REQ = 11, - MSMT_FTM_RANGE_REQ = 16, -}; - -/* 802.11mc D3.0: 8.4.2.20.10 (p.743): - Table 8-102, Location subject definition -*/ -enum LOCATION_SUBJECT { - LSUBJ_LOCAL = 0, - LSUBJ_REMOTE = 1, - LSUBJ_THIRD_PARTY = 2 -}; - -/* 802.11mc D3.0: 8.4.2.20.10 (p.743): - Table 8-103, Optional subelement IDs for LCI request -*/ -enum LCI_REQUEST_ID { - LCI_REQID_AZIMUTH = 1, - LCI_REQID_ORI_REQ_MAC_ADDR = 2, - LCI_REQID_TARGET_MAC_ADDR = 3, - LCI_REQID_MAX_AGE = 4 -}; - -/* 802.11mc D3.0: 8.4.2.20.10 (p.744) */ -enum AZIMUTH_TYPE { AZTYPE_RADIO_RECEPTION = 0, AZTYPE_FRONT_SURFACE = 1 }; - -/* 802.11mc D3.0: 8.4.2.20.14 (p.751): - Table 8-108, Civic Location Type -*/ -enum CIVIC_LOCATION_TYPE { - CIVIC_TYPE_IETF_RFC4776_2006 = 0, - /* IETF RFC 4776-2006 starting at the country code field (i.e., excluding the - GEOCONF_CIVIC/ OPTION_GEOCONF_CIVIC, N/option-len and what - fields); includes all subsequent RFCs that define additional civic address Types */ - - CIVIC_TYPE_VENDOR_SPECIFIC = 1 -}; - -/* 802.11mc D3.0: 8.4.2.20.14 (p.751): - Table 8-109, Location Service Interval Units -*/ -enum CIVIC_LOCATION_SERVICE_INTERVAL_UNITS { - CIVIC_UNIT_SECOND = 0, - CIVIC_UNIT_MINUTE = 1, - CIVIC_UNIT_HOURS = 2 -}; - -/* 802.11mc D3.0: 8.4.2.21 (p.759): - Table 8-115, Measurement Type definitions for measurement reports -*/ -enum MEASUREMENT_TYPE_REPORT { MSMT_LCI_RPT = 8, MSMT_LOCATION_CIVIC_RPT = 11 }; - -/* 802.11mc D3.0: 8.4.2.21.10 (p.780): - Table 8-124, Subelement IDs for Location Configuration Information Report -*/ -enum LCI_REPORT_ID { - LCI_RPTID_LCI = 0, - LCI_RPTID_AZIMUTH = 1, - LCI_RPTID_ORI_REQ_MAC_ADDR = 2, - LCI_RPTID_TARGET_MAC_ADDR = 3, - LCI_RPTID_Z = 4, - LCI_RPTID_LOCATION_ERROR = 5, - LCI_RPTID_USAGE_RULES = 6 -}; - -/* 802.11mc D3.0: 8.4.2.21.13 (p.793): - Table 8-129, Subelement IDs for Location Civic report -*/ -enum CIVIC_REPORT_ID { - CIVIC_RPTID_CIVIC = 0, - CIVIC_RPTID_ORI_REQ_MAC_ADDR = 1, - CIVIC_RPTID_TARGET_MAC_ADDR = 2, - CIVIC_RPTID_LOCATION_REF = 3, - CIVIC_RPTID_LOCATION_SHAPE = 4, - CIVIC_RPTID_MAP_IMAGE = 5, - CIVIC_RPTID_VENDOR_SPECIFIC = 221 -}; - -#define FTM_NUM_NO_PREFERENCE 0 -#define FTM_DELTA_NO_PREFERENCE 0 - -/* 802.11mc D4.0: 8.4.2.166 (p.1051): - Table 8-245, Statue indication field values -*/ -enum FTM_STATUS_CODE { - FTMSTATUS_RSVD, - FTMSTATUS_SUCCESS, - FTMSTATUS_REQ_INCAPABLE, - FTMSTATUS_REQ_FAILED, -}; - -/* 802.11mc D4.3: 8.4.2.166 (p.1077): - Table 8-250, Burst Duration field encoding -*/ -enum FTM_BURST_DURATION_ENCODING { - FTMBST_250US = 2, - FTMBST_500US = 3, - FTMBST_1MS = 4, - FTMBST_2MS = 5, - FTMBST_4MS = 6, - FTMBST_8MS = 7, - FTMBST_16MS = 8, - FTMBST_32MS = 9, - FTMBST_64MS = 10, - FTMBST_128MS = 11, - FTMBST_NO_PREFERENCE = 15 -}; - -/* 802.11mc D4.0: 8.4.2.166 (p.1053): - Table 8-247, FTM Format and Bandwidth field -*/ -enum FTM_CHANNEL_SPACING { - FTM_BW_NO_PREFERENCE = 0, - FTM_BW_NONHT_BW5 = 4, - FTM_BW_NONHT_BW10 = 6, - FTM_BW_NONHT_BW20 = 8, - FTM_BW_HT_BW20 = 9, - FTM_BW_VHT_BW20 = 10, - FTM_BW_HT_BW40 = 11, - FTM_BW_VHT_BW40 = 12, - FTM_BW_VHT_BW80 = 13, - FTM_BW_VHT_BW80_80 = 14, - FTM_BW_VHT_BW160_2RFLO = 15, - FTM_BW_VHT_BW160_1RFLO = 16, - FTM_BW_DMG_BW2160 = 31, -}; - -/* 802.11mc D3.0: 8.6.8.32 (p.1121): - FTM Request Trigger Code -*/ -enum FTM_REQ_TRIGGER_CODE { FTM_TRIGGER_STOP, FTM_TRIGGER_START_OR_CONTI }; - -enum FTM_TX_REASON { FTMTX_START, FTMTX_ONGOING, FTMTX_STOP }; - -#endif /* __FTM_CMM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/gas.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/gas.h deleted file mode 100644 index 3c15aa483b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/gas.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2011, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - gas.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __GAS_H__ -#define __GAS_H__ - -#include "common/link_list.h" - -#define GAS_MACHINE_BASE 0 - -#ifdef DPP_SUPPORT -#define GAS_OUI_Index 5 -#define GAS_WFA_DPP_Subtype_Index 8 -#define GAS_WFA_DPP_Length_Index 1 -#define GAS_WFA_DPP_Min_Length 5 -#endif /* DPP_SUPPORT */ - -/* gas states */ -enum GAS_STATE { - WAIT_GAS_REQ, - WAIT_GAS_RSP, - WAIT_PEER_GAS_REQ, - WAIT_PEER_GAS_RSP, - WAIT_GAS_CB_REQ, - WAIT_GAS_CB_RSP, - GAS_UNKNOWN, - MAX_GAS_STATE, -}; - -/* gas events */ -enum GAS_EVENT { - GAS_REQ, - GAS_RSP, - GAS_RSP_MORE, - PEER_GAS_REQ, - PEER_GAS_RSP, - PEER_GAS_RSP_MORE, - GAS_CB_REQ, - GAS_CB_REQ_MORE, - GAS_CB_RSP, - GAS_CB_RSP_MORE, - MAX_GAS_MSG, -}; - -/* ANQP Info ID definitions */ -enum { - ANQP_QUERY_LIST = 256, - ANQP_CAPABILITY, - VENUE_NAME_INFO, - EMERGENCY_CALL_NUMBER_INFO, - NETWORK_AUTH_TYPE_INFO, - ROAMING_CONSORTIUM_LIST, - IP_ADDRESS_TYPE_AVAILABILITY_INFO, - NAI_REALM_LIST, - ThirdGPP_CELLULAR_NETWORK_INFO, - AP_GEOSPATIAL_LOCATION, - AP_CIVIC_LOCATION, - AP_LOCATION_PUBLIC_IDENTIFIER_URI, - DOMAIN_NAME_LIST, - EMERGENCY_ALERT_IDENTIFIER_URI, - EMERGENCY_NAI = 271, - ACCESS_NETWORK_QUERY_PROTO_VENDOR_SPECIFIC_LIST = 56797, -}; - -#define GAS_FUNC_SIZE (MAX_GAS_STATE * MAX_GAS_MSG) - -typedef struct _GAS_QUERY_RSP_FRAGMENT { - DL_LIST List; - UCHAR GASRspFragID; - UINT16 FragQueryRspLen; - UCHAR *FragQueryRsp; -} GAS_QUERY_RSP_FRAGMENT, *PGAS_QUERY_RSP_FRAGMENT; - -typedef struct _GAS_PEER_ENTRY { - DL_LIST List; - enum GAS_STATE CurrentState; - UCHAR ControlIndex; - UCHAR PeerMACAddr[MAC_ADDR_LEN]; - UCHAR DialogToken; - UCHAR AdvertisementProID; - void *Priv; -#ifdef CONFIG_AP_SUPPORT - RALINK_TIMER_STRUCT PostReplyTimer; - BOOLEAN PostReplyTimerRunning; - RALINK_TIMER_STRUCT GASRspBufferingTimer; - BOOLEAN GASRspBufferingTimerRunning; -#endif /* CONFIG_AP_SUPPORT */ - - UCHAR GASRspFragNum; - UCHAR CurrentGASFragNum; - UINT32 AllocResource; - UINT32 FreeResource; - UCHAR QueryNum; - DL_LIST GASQueryRspFragList; -} GAS_PEER_ENTRY, *PGAS_PEER_ENTRY; - -typedef struct _GAS_CTRL { - DL_LIST GASPeerList; - NDIS_SPIN_LOCK GASPeerListLock; - UINT8 ExternalANQPServerTest; - UINT32 cb_delay; /* Come Back Delay */ - UINT32 MMPDUSize; - BOOLEAN b11U_enable; - UINT32 InterWorkingIELen; - UINT32 AdvertisementProtoIELen; - PUCHAR InterWorkingIE; - PUCHAR AdvertisementProtoIE; -} GAS_CTRL, *PGAS_CTRL; - -/* - * gas events data - * GASComebackDelay : unit(TU) - */ -typedef struct GNU_PACKED _GAS_EVENT_DATA { - UCHAR ControlIndex; - UCHAR PeerMACAddr[MAC_ADDR_LEN]; - UINT16 EventType; - union { -#ifdef CONFIG_AP_SUPPORT - struct { - UCHAR DialogToken; - UINT16 StatusCode; - UINT16 GASComebackDelay; - UCHAR AdvertisementProID; - UINT16 QueryRspLen; - UCHAR QueryRsp[0]; - } GNU_PACKED GAS_RSP_DATA; - struct { - UCHAR DialogToken; - UINT16 StatusCode; - UINT16 GASComebackDelay; - UCHAR AdvertisementProID; - } GNU_PACKED GAS_RSP_MORE_DATA; - struct { - UCHAR DialogToken; - UCHAR AdvertisementProID; - UINT16 QueryReqLen; - UCHAR QueryReq[0]; - } GNU_PACKED PEER_GAS_REQ_DATA; - struct { - UCHAR DialogToken; - UCHAR AdvertisementProID; - UINT16 StatusCode; - } GNU_PACKED GAS_CB_REQ_DATA; - struct { - UCHAR DialogToken; - UCHAR AdvertisementProID; - UINT16 StatusCode; - } GNU_PACKED GAS_CB_REQ_MORE_DATA; -#endif /* CONFIG_AP_SUPPORT */ - } u; -} GAS_EVENT_DATA, *PGAS_EVENT_DATA; - -VOID GASStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -enum GAS_STATE GASPeerCurrentState(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem); - -VOID GASSetPeerCurrentState(IN PRTMP_ADAPTER pAd, - /* IN MLME_QUEUE_ELEM *Elem, */ - PGAS_EVENT_DATA Event, IN enum GAS_STATE State); - -VOID SendGASRsp(IN PRTMP_ADAPTER pAd, GAS_EVENT_DATA *Event); - -VOID GASCtrlExit(IN PRTMP_ADAPTER pAd); - -#ifdef CONFIG_AP_SUPPORT -DECLARE_TIMER_FUNCTION(PostReplyTimeout); -DECLARE_TIMER_FUNCTION(GASRspBufferingTimeout); - -void SendAnqpReqEvent(PNET_DEV net_dev, const char *peer_mac_addr, - const char *anqp_req, UINT16 anqp_req_len); - -void SendLocationElementEvent(PNET_DEV net_dev, const char *location_buf, - UINT16 location_buf_len, UINT16 info_id); - -VOID ReceiveGASInitReq(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); -#ifdef DPP_SUPPORT -VOID DPP_ReceiveGASInitRsp(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); -#endif /* DPP_SUPPORT */ -VOID ReceiveGASCBReq(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); -#endif /* CONFIG_AP_SUPPORT */ - -INT Send_ANQP_Rsp(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *ANQPRsp, IN UINT32 ANQPRspLen); - -BOOLEAN GasEnable(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -#endif /* __GAS_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev/hdev.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev/hdev.h deleted file mode 100644 index 013e6d7d61..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev/hdev.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __HDEV_H -#define __HDEV_H - -#include "hdev/hdev_basic.h" - -/*Radio Control*/ -VOID RcRadioInit(struct hdev_ctrl *ctrl, UCHAR RfIC, UCHAR DbdcMode); -struct radio_dev *RcInit(struct hdev_ctrl *ctrl); -VOID RcRadioShow(HD_RESOURCE_CFG *pHwResourceCfg); - -struct radio_dev *RcAcquiredBandForObj(struct hdev_ctrl *ctrl, - struct hdev_obj *obj, UCHAR ObjIdx, - UCHAR PhyMode, UCHAR Channel, - UCHAR ObjType); - -VOID RcReleaseBandForObj(struct hdev_ctrl *ctrl, struct hdev_obj *obj); - -INT32 RcUpdateChannel(struct radio_dev *rdev, UCHAR Channel, - BOOLEAN scan_state); -INT32 RcUpdatePhyMode(struct radio_dev *rdev, UCHAR Wmode); -struct radio_dev *RcGetHdevByChannel(struct hdev_ctrl *ctrl, UCHAR Channel); -struct radio_dev *RcGetHdevByPhyMode(struct hdev_ctrl *ctrl, UCHAR PhyMode, - UCHAR channel); -UCHAR RcGetBandIdxByRf(struct hdev_ctrl *ctrl, UCHAR RfIC); - -INT32 RcUpdateBandCtrl(struct hdev_ctrl *ctrl); -INT32 RcUpdateWmmEntry(struct radio_dev *rdev, struct hdev_obj *obj, - UINT32 WmmIdx); -INT32 RcUpdateRepeaterEntry(struct radio_dev *rdev, UINT32 ReptIdx); -UCHAR RcUpdateBw(struct radio_dev *rdev, UCHAR Bw); -INT32 RcUpdateRadio(struct radio_dev *rdev, UCHAR bw, UCHAR central_ch1, - UCHAR control_ch2, UCHAR ext_cha); -INT32 RcUpdateExtCha(struct radio_dev *rdev, UCHAR ExtCha); -UCHAR RcGetExtCha(struct radio_dev *rdev); -UINT32 RcGetMgmtQueueIdx(struct hdev_obj *obj, enum PACKET_TYPE pkt_type); -UINT32 RcGetBcnQueueIdx(struct hdev_obj *obj); -UINT32 RcGetTxRingIdx(struct hdev_obj *obj); -UINT32 RcGetWmmIdx(struct hdev_obj *obj); -UINT32 RcGetBandIdxByChannel(struct hdev_ctrl *ctrl, UCHAR Channel); -UCHAR RcGetPhyMode(struct radio_dev *rdev); -UCHAR RcGetChannel(struct radio_dev *rdev); -UCHAR RcGetCentralCh(struct radio_dev *rdev); -UCHAR RcGetBandIdx(struct radio_dev *rdev); -PHY_STATUS RcGetRadioCurStat(struct radio_dev *rdev); -VOID RcSetRadioCurStat(struct radio_dev *rdev, PHY_STATUS CurStat); -UCHAR RcGetBw(struct radio_dev *rdev); -struct radio_dev *RcGetBandIdxByBf(struct hdev_ctrl *ctrl); -BOOLEAN RcIsBfCapSupport(struct hdev_obj *obj); -BOOLEAN rc_radio_equal(struct radio_dev *rdev, struct freq_oper *oper); -BOOLEAN rc_radio_res_acquire(struct radio_dev *rdev, struct radio_res *res); -UINT32 MAPRcGetBandIdxByChannelCheck(struct hdev_ctrl *ctrl, UCHAR Channel); - -/*WMM Control*/ -VOID WcReleaseEdca(struct hdev_obj *obj); -VOID WcAcquiredEdca(struct hdev_obj *obj, EDCA_PARM *pEdcaParm); -INT32 WcInit(struct hdev_ctrl *ctrl, WMM_CTRL_T *pWmmCtrl); -INT32 WcExit(WMM_CTRL_T *pWmmCtrl); -VOID WcShowEdca(struct hdev_ctrl *ctrl); -UINT32 WcGetWmmNum(struct hdev_ctrl *ctrl); -EDCA_PARM *WcGetWmmByIdx(struct hdev_ctrl *ctrl, UINT32 Idx); -VOID WcSetEdca(struct hdev_obj *obj); - -/*Omac Control*/ -INT32 GetOmacIdx(struct hdev_ctrl *ctrl, UINT32 OmacType, INT8 Idx); -VOID ReleaseOmacIdx(struct hdev_ctrl *ctrl, UINT32 OmacType, UINT32 Idx); -VOID OcDelRepeaterEntry(struct hdev_obj *obj, UCHAR ReptIdx); -INT32 OcAddRepeaterEntry(struct hdev_obj *obj, UCHAR ReptIdx); -HD_REPT_ENRTY *OcGetRepeaterEntry(struct hdev_obj *obj, UCHAR ReptIdx); - -/*Wctl Control*/ -VOID WtcInit(struct hdev_ctrl *ctrl); -VOID WtcExit(struct hdev_ctrl *ctrl); -UCHAR WtcSetMaxStaNum(struct hdev_ctrl *ctrl, UCHAR BssidNum, UCHAR MSTANum); -UCHAR WtcGetMaxStaNum(struct hdev_ctrl *ctrl); -UCHAR WtcAcquireGroupKeyWcid(struct hdev_ctrl *ctrl, struct hdev_obj *obj); -UCHAR WtcReleaseGroupKeyWcid(struct hdev_ctrl *ctrl, struct hdev_obj *obj, - UCHAR idx); -UCHAR WtcGetWcidLinkType(struct hdev_ctrl *ctrl, UCHAR idx); -UCHAR WtcAcquireUcastWcid(struct hdev_ctrl *ctrl, struct hdev_obj *obj); -UCHAR WtcReleaseUcastWcid(struct hdev_ctrl *ctrl, struct hdev_obj *obj, - UCHAR idx); -VOID WtcRecDump(struct hdev_ctrl *ctrl); -UCHAR WtcHwAcquireWcid(struct hdev_ctrl *ctrl, UCHAR idx); -UCHAR WtcHwReleaseWcid(struct hdev_ctrl *ctrl, UCHAR idx); - -#define INVAILD_WCID 0xff - -#endif /*__HDEV_H*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev/hdev_basic.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev/hdev_basic.h deleted file mode 100644 index cca4fc4c87..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev/hdev_basic.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __HDEV_BASIC_H -#define __HDEV_BASIC_H - -#ifdef RTMP_MAC_PCI -struct _PCI_HIF_T; -#endif /*RTMP_MAC_PCI*/ - -#include "common/link_list.h" - -struct _RTMP_CHIP_CAP; -struct _RTMP_CHIP_OP; -struct _EDCA_PARM; -struct MCU_CTRL; -struct _BCTRL_INFO_T; -struct _BCTRL_ENTRY; -struct freq_oper; - -struct radio_res { - UCHAR reason; - struct freq_oper *oper; -}; - -enum { - REASON_NORMAL_SW, - REASON_NORMAL_SCAN, -}; - -/* -* state machine: -* case1: NONE_OCCUPIED ->SW_OCCUPIED->NONE_OCCUPIED -*/ - -enum { - WTBL_STATE_NONE_OCCUPIED = 0, - WTBL_STATE_SW_OCCUPIED, -}; - -enum { - WTBL_TYPE_NONE = 0, - WTBL_TYPE_UCAST, - WTBL_TYPE_MCAST, -}; - -typedef struct _WTBL_IDX_PARAMETER { - UCHAR State; - UCHAR LinkToOmacIdx; - UCHAR LinkToWdevType; - UCHAR WtblIdx; - UCHAR type; - DL_LIST list; -} WTBL_IDX_PARAMETER, *PWTBL_IDX_PARAMETER; - -typedef struct _WTBL_CFG { - UCHAR MaxUcastEntryNum; - UCHAR MinMcastWcid; - BOOLEAN mcast_wait; - WTBL_IDX_PARAMETER WtblIdxRec[MAX_LEN_OF_MAC_TABLE]; - NDIS_SPIN_LOCK WtblIdxRecLock; -} WTBL_CFG; - -#define WTC_WAIT_TIMEOUT CMD_MSG_TIMEOUT - -typedef struct _OMAC_BSS_CTRL { - UINT32 OmacBitMap; - UINT32 HwMbssBitMap; - UINT32 RepeaterBitMap; -} OMAC_BSS_CTRL, *POMAC_BSS_CTRL; - -typedef struct _WMM_CTRL { - EDCA_PARM *pWmmSet; -} MT_WMMCTRL_T, WMM_CTRL_T; - -typedef struct _HD_RESOURCE_CFG { - struct rtmp_phy_ctrl PhyCtrl[DBDC_BAND_NUM]; - struct _WMM_CTRL WmmCtrl; - struct _OMAC_BSS_CTRL OmacBssCtl; - /* struct _REPEATER_CFG RepeaterCfg; */ - struct _WTBL_CFG WtblCfg; - UCHAR concurrent_bands; -} HD_RESOURCE_CFG; - -struct radio_dev { - UCHAR Idx; - RADIO_CTRL *pRadioCtrl; - DL_LIST DevObjList; - UCHAR DevNum; - /*implicit point to hdev_ctrl for sharing resource*/ - VOID *priv; -}; - -enum { - HOBJ_STATE_NONE = 0, - HOBJ_STATE_USED, -}; - -struct hdev_obj { - UCHAR Idx; - UCHAR Type; - UCHAR OmacIdx; - UCHAR WmmIdx; - BOOLEAN bWmmAcquired; - struct radio_dev *rdev; - DL_LIST RepeaterList; - DL_LIST list; - UCHAR state; - UCHAR RefCnt; - NDIS_SPIN_LOCK RefCntLock; -}; - -struct hdev_ctrl { - struct radio_dev rdev[DBDC_BAND_NUM]; - CHANNEL_CTRL ChCtrl[DBDC_BAND_NUM]; - /* PSE_CFG PseCfg; */ - /* HIF_CFG HifCfg; */ - struct _RTMP_CHIP_CAP chip_cap; - struct _RTMP_CHIP_OP chip_ops; - struct _RTMP_ARCH_OP *arch_ops; - struct _RTMP_CHIP_DBG chip_dbg; - HD_RESOURCE_CFG HwResourceCfg; - struct hdev_obj HObjList[WDEV_NUM_MAX]; - VOID *mcu_ctrl; - VOID *hif; - VOID *cookie; -#ifdef CUT_THROUGH - VOID *PktTokenCb; -#endif /* CUT_THROUGH */ - VOID *priv; /*implicit point to pAd*/ -}; - -typedef struct _HD_REPT_ENRTY { - UCHAR CliIdx; - UCHAR ReptOmacIdx; - DL_LIST list; -} HD_REPT_ENRTY; - -/*for hdev base functions*/ -VOID HdevObjAdd(struct radio_dev *rdev, struct hdev_obj *obj); -VOID HdevObjDel(struct radio_dev *rdev, struct hdev_obj *obj); -BOOLEAN hdev_obj_state_ready(struct hdev_obj *obj); - -INT32 HdevInit(struct hdev_ctrl *hdev_ctrl, UCHAR HdevIdx, - RADIO_CTRL *pRadioCtrl); -INT32 HdevExit(struct hdev_ctrl *hdev_ctrl, UCHAR HdevIdx); -VOID HdevCfgShow(struct hdev_ctrl *hdev_ctrl); -VOID HdevObjShow(struct hdev_obj *obj); -VOID HdevHwResourceExit(struct hdev_ctrl *ctrl); -VOID HdevHwResourceInit(struct hdev_ctrl *ctrl); - -#endif /*__HDEV_BASIC_H*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev_ctrl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev_ctrl.h deleted file mode 100644 index 44eddf3d5c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hdev_ctrl.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - hdev_ctrl.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __HDEV_CTRL_H__ -#define __HDEV_CTRL_H__ - -struct _RTMP_ADAPTER; -struct _EDCA_PARM; -struct _QLOAD_CTRL; -struct _AUTO_CH_CTRL; -struct wifi_dev; -struct _OMAC_BSS_CTRL; -struct _REPEATER_CLIENT_ENTRY; -struct radio_res; -struct freq_oper; - -enum { HC_STATUS_OK, HC_STATUS_FAIL }; - -#define INVAILD_WCID 0xff - -INT32 HcRadioInit(struct _RTMP_ADAPTER *pAd, UCHAR RfIC, UCHAR DbdcMode); -INT32 HcAcquireRadioForWdev(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -INT32 HcReleaseRadioForWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -#ifdef CUSTOMER_DCC_FEATURE -INT32 HcUpdateChannel(struct _RTMP_ADAPTER *pAd, UCHAR Channel); -UCHAR HcGetExtCha(struct _RTMP_ADAPTER *pAd, UCHAR Channel); -#endif -INT32 HcUpdateCsaCntByChannel(struct _RTMP_ADAPTER *pAd, UCHAR Channel); -UCHAR HcGetBandByWdev(struct wifi_dev *wdev); -VOID HcSetRadioCurStatByWdev(struct wifi_dev *wdev, PHY_STATUS CurStat); -VOID HcSetRadioCurStatByChannel(RTMP_ADAPTER *pAd, UCHAR Channel, - PHY_STATUS CurStat); -VOID HcSetAllSupportedBandsRadioOff(RTMP_ADAPTER *pAd); -VOID HcSetAllSupportedBandsRadioOn(RTMP_ADAPTER *pAd); -BOOLEAN IsHcRadioCurStatOffByWdev(struct wifi_dev *wdev); -BOOLEAN IsHcRadioCurStatOffByChannel(RTMP_ADAPTER *pAd, UCHAR Channel); -BOOLEAN IsHcAllSupportedBandsRadioOff(RTMP_ADAPTER *pAd); -#ifdef GREENAP_SUPPORT -VOID HcSetGreenAPActiveByBand(struct _RTMP_ADAPTER *pAd, UCHAR BandIdx, - BOOLEAN bGreenAPActive); -BOOLEAN IsHcGreenAPActiveByBand(struct _RTMP_ADAPTER *pAd, UCHAR BandIdx); -BOOLEAN IsHcGreenAPActiveByWdev(struct wifi_dev *wdev); -#endif /* GREENAP_SUPPORT */ -UCHAR HcGetChannelByBf(struct _RTMP_ADAPTER *pAd); -BOOLEAN HcIsRadioAcq(struct wifi_dev *wdev); -BOOLEAN HcIsBfCapSupport(struct wifi_dev *wdev); - -/*Wtable Ctrl*/ -UCHAR HcAcquireGroupKeyWcid(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID HcReleaseGroupKeyWcid(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR idx); -UCHAR HcGetMaxStaNum(struct _RTMP_ADAPTER *pAd); -UCHAR HcSetMaxStaNum(struct _RTMP_ADAPTER *pAd); - -UCHAR HcGetWcidLinkType(struct _RTMP_ADAPTER *pAd, UCHAR Wcid); -UCHAR HcAcquireUcastWcid(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -UCHAR HcReleaseUcastWcid(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR idx); -VOID HcWtblRecDump(struct _RTMP_ADAPTER *pAd); - -#ifdef DBDC_MODE -VOID HcShowBandInfo(struct _RTMP_ADAPTER *pAd); -#endif /*DBDC_MODE*/ - -VOID HcShowChCtrlInfo(struct _RTMP_ADAPTER *pAd); -#ifdef GREENAP_SUPPORT -VOID HcShowGreenAPInfo(RTMP_ADAPTER *pAd); -#endif /* GREENAP_SUPPORT */ - -INT32 hdev_ctrl_init(struct _RTMP_ADAPTER *pAd); -VOID hdev_ctrl_exit(struct _RTMP_ADAPTER *pAd); -VOID hdev_resource_init(void *hdev_ctrl); - -/* -WMM -*/ -VOID HcAcquiredEdca(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _EDCA_PARM *pEdca); -VOID HcReleaseEdca(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -/* -* OmacCtrl -*/ -UCHAR HcGetOmacIdx(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -/*Should remove it*/ -UCHAR HcGetChannelByRf(struct _RTMP_ADAPTER *pAd, UCHAR RfIC); -UCHAR HcGetRadioPhyMode(struct _RTMP_ADAPTER *pAd); -UCHAR HcGetRadioPhyModeByBandIdx(RTMP_ADAPTER *pAd, UCHAR BandIdx); -UCHAR HcGetRadioChannel(struct _RTMP_ADAPTER *pAd); -BOOLEAN HcIsRfSupport(struct _RTMP_ADAPTER *pAd, UCHAR RfIC); -BOOLEAN HcIsRfRun(struct _RTMP_ADAPTER *pAd, UCHAR RfIC); - -UCHAR HcGetBw(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -UCHAR HcGetRadioRfIC(struct _RTMP_ADAPTER *pAd); - -struct _QLOAD_CTRL *HcGetQloadCtrlByRf(struct _RTMP_ADAPTER *pAd, UINT32 RfIC); -struct _QLOAD_CTRL *HcGetQloadCtrl(struct _RTMP_ADAPTER *pAd); -struct _AUTO_CH_CTRL *HcGetAutoChCtrl(struct _RTMP_ADAPTER *pAd); - -struct ch_switch_cfg *HcGetChanSwitchMonbyBandIdx(RTMP_ADAPTER *pAd, - UCHAR BandIdx); -struct _AUTO_CH_CTRL *HcGetAutoChCtrlbyBandIdx(RTMP_ADAPTER *pAd, - UCHAR BandIdx); -UINT32 HcGetMgmtQueueIdx(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - enum PACKET_TYPE pkt_type); -UINT32 HcGetBcnQueueIdx(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -UINT32 HcGetTxRingIdx(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - enum PACKET_TYPE, UCHAR q_idx); -UINT32 HcGetWmmIdx(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -UCHAR HcGetBandByChannel(struct _RTMP_ADAPTER *pAd, UCHAR Channel); -EDCA_PARM *HcGetEdca(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID HcSetEdca(struct wifi_dev *wdev); -VOID HcCrossChannelCheck(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR Channel); - -#ifdef MAC_REPEATER_SUPPORT -INT32 HcAddRepeaterEntry(struct wifi_dev *wdev, UINT32 ReptIdx); -INT32 HcDelRepeaterEntry(struct wifi_dev *wdev, UINT32 ReptIdx); -UCHAR HcGetRepeaterOmac(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); -#endif /*#MAC_REPEATER_SUPPORT*/ -UCHAR HcGetAmountOfBand(struct _RTMP_ADAPTER *pAd); -INT32 HcUpdateMSDUTxAllowByChannel(RTMP_ADAPTER *pAd, UCHAR Channel); -INT32 HcSuspendMSDUTxByChannel(RTMP_ADAPTER *pAd, UCHAR Channel); - -/*radio resource mgmt*/ -BOOLEAN hc_radio_res_request(struct wifi_dev *wdev, struct radio_res *res); -UCHAR hc_reset_radio(struct _RTMP_ADAPTER *ad); -VOID hc_set_rrm_init(struct wifi_dev *wdev); -INT hc_radio_query_by_wdev(struct wifi_dev *wdev, struct freq_oper *oper); -INT hc_radio_query_by_channel(struct _RTMP_ADAPTER *ad, UCHAR channel, - struct freq_oper *oper); -INT hc_radio_query_by_index(struct _RTMP_ADAPTER *ad, UCHAR index, - struct freq_oper *oper); -/*temporally use*/ -INT hc_radio_query_by_rf(struct _RTMP_ADAPTER *ad, UCHAR rfic, - struct freq_oper *oper); - -INT hc_obj_init(struct wifi_dev *wdev, INT idx); -VOID hc_obj_exit(struct wifi_dev *wdev); - -CHANNEL_CTRL *hc_get_channel_ctrl(void *hdev_ctrl, UCHAR BandIdx); -UCHAR hc_init_ChCtrl(RTMP_ADAPTER *pAd); -UCHAR hc_init_ACSChCtrl(RTMP_ADAPTER *pAd); -UCHAR hc_init_ACSChCtrlByBandIdx(RTMP_ADAPTER *pAd, UCHAR BandIdx); -UCHAR hc_set_ChCtrl(CHANNEL_CTRL *ChCtrl, RTMP_ADAPTER *pAd, UCHAR ChIdx, - UCHAR ChIdx2); -UCHAR hc_set_ChCtrlFlags_CAP(CHANNEL_CTRL *ChCtrl, UINT ChannelListFlag, - UCHAR ChIdx); -UCHAR hc_set_ChCtrlChListStat(CHANNEL_CTRL *ChCtrl, CH_LIST_STATE ChListStat); -UCHAR hc_check_ChCtrlChListStat(CHANNEL_CTRL *ChCtrl, CH_LIST_STATE ChListStat); -/*chipcap & chipop related*/ -struct _RTMP_CHIP_CAP *hc_get_chip_cap(void *hdev_ctrl); -struct _RTMP_CHIP_OP *hc_get_chip_ops(void *hdev_ctrl); -void hc_register_chip_ops(void *hdev_ctrl, struct _RTMP_CHIP_OP *ops); -struct _RTMP_ARCH_OP *hc_get_asic_ops(void *hdev_ctrl); -struct _RTMP_CHIP_DBG *hc_get_chip_dbg(void *hdev_ctrl); -UINT32 hc_get_hif_type(void *hdev_ctrl); -VOID hc_clear_asic_cap(void *hdev_ctrl, UINT32 caps); -VOID hc_set_asic_cap(void *hdev_ctrl, UINT32 caps); -UINT32 hc_get_asic_cap(void *hdev_ctrl); -UINT8 hc_get_chip_bcn_max_num(void *hdev_ctrl); -UINT8 hc_get_chip_bcn_hw_num(void *hdev_ctrl); -BOOLEAN hc_get_chip_wapi_sup(void *hdev_ctrl); -VOID *hc_get_hif_ctrl(void *hdev_ctrl); -VOID *hc_get_os_cookie(void *hdev_ctrl); -VOID *hc_get_mcu_ctrl(void *hdev_ctrl); - -#endif /*__HDEV_CTRL_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hotspot.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hotspot.h deleted file mode 100644 index 3b79930de7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hotspot.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2011, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - hotspot.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __HOTSPOT_H__ -#define __HOTSPOT_H__ - -#ifndef CONFIG_DOT11V_WNM -#error "For HOTSPOT2.0 feature, you must define the compile flag -DCONFIG_DOT11V_WNM" -#endif - -#ifndef CONFIG_DOT11U_INTERWORKING -#error "For HOTSPOT2.0 feature, you must define the compile flag -DCONFIG_DOT11U_INTERWORKING" -#endif - -#include "rtmp.h" - -#define HSCTRL_MACHINE_BASE 0 - -enum HSCTRL_STATE { - WAIT_HSCTRL_OFF, - WAIT_HSCTRL_ON, - HSCTRL_IDLE, - MAX_HSCTRL_STATE, -}; - -enum HSCTRL_EVENT { - HSCTRL_OFF, - HSCTRL_ON, - MAX_HSCTRL_MSG, -}; - -typedef struct GNU_PACKED _HSCTRL_EVENT_DATA { - UCHAR ControlIndex; - UCHAR EventTrigger; - UCHAR EventType; -} HSCTRL_EVENT_DATA, *PHSCTRL_EVENT_DATA; - -#define MAX_QOS_MAP_TABLE_SIZE 8 - -typedef struct _QOS_MAP_TABLE_T { - UINT8 ucPoolValid; - UINT8 ucDscpExceptionCount; - UINT16 au2DscpRange[8]; - UINT16 au2DscpException[21]; -} QOS_MAP_TABLE_T, *P_QOS_MAP_TABLE_T; - -typedef struct _HOTSPOT_CTRL { - UINT32 HSIndicationIELen; - UINT32 P2PIELen; - UINT32 QosMapSetIELen; - UINT32 RoamingConsortiumIELen; - PUCHAR QosMapSetIE; - USHORT DscpRange[8]; - USHORT DscpException[21]; - PUCHAR RoamingConsortiumIE; - PUCHAR HSIndicationIE; - PUCHAR P2PIE; - BOOLEAN HSDaemonReady; - BOOLEAN HotSpotEnable; - enum HSCTRL_STATE HSCtrlState; - BOOLEAN IsHessid; - UCHAR Hessid[MAC_ADDR_LEN]; - UINT8 AccessNetWorkType; - BOOLEAN DGAFDisable; - UINT8 L2Filter; - BOOLEAN ICMPv4Deny; - BOOLEAN QosMapEnable; - /* BOOLEAN bNonTX; */ /* 0:enable TX, 1:disable TX*/ - BOOLEAN bASANEnable; /* 1:enable ASAN IE, 1:disable ASAN IE*/ - UCHAR QLoadTestEnable; /* for BSS Load IE Test */ - UCHAR QLoadCU; /* for BSS Load IE Test */ - USHORT QLoadStaCnt; /* for BSS Load IE Test */ - UINT8 HotspotBSSFlags; /* for 7615 offload to CR4 */ - BOOLEAN QosMapAddToPool; - UINT8 QosMapPoolID; /* per BSS default DSCP pool map ID */ - BOOLEAN bHSOnOff; /* for recording wdev HS on/off status, to prevent HSCtrlOn or HSCtrlOff gets insanly called repeatedly */ -} HOTSPOT_CTRL, *PHOTSPOT_CTRL; - -/* for 7615 offload to CR4 */ -enum HS_R2_CAPABILITY_FLAGS { - fgHotspotEnable = (1 << 0), - fgProxyArpEnable = (1 << 1), - fgASANEnable = (1 << 2), - fgDGAFDisable = (1 << 3), - fgQosMapEnable = (1 << 4), -}; -enum HS_R2_UPDATE_TYPE { - fgUpdateBssCapability = (1 << 0), - fgUpdateStaDSCP = (1 << 1), - fgUpdateDSCPPool = (1 << 2), -}; -#define IS_HOTSPOT_ENABLE(ucHotspotBssFlags) \ - ((ucHotspotBssFlags & fgHotspotEnable) != 0) -#define IS_PROXYARP_ENABLE(ucHotspotBssFlags) \ - ((ucHotspotBssFlags & fgProxyArpEnable) != 0) -#define IS_ASAN_ENABLE(ucHotspotBssFlags) \ - ((ucHotspotBssFlags & fgASANEnable) != 0) -#define IS_DGAF_DISABLE(ucHotspotBssFlags) \ - ((ucHotspotBssFlags & fgDGAFDisable) != 0) -#define IS_QOSMAP_ENABLE(ucHotspotBssFlags) \ - ((ucHotspotBssFlags & fgQosMapEnable) != 0) -#define IS_PROXYARP_ASAN_ENABLE(ucHotspotBssFlags) \ - ((ucHotspotBssFlags & (fgHotspotEnable | fgProxyArpEnable | \ - fgASANEnable | fgDGAFDisable)) != 0) - -enum { - L2FilterDisable, - L2FilterBuiltIn, - L2FilterExternal, -}; - -BOOLEAN L2FilterInspection(IN PRTMP_ADAPTER pAd, IN PHOTSPOT_CTRL pHSCtrl, - IN PUCHAR pData); - -VOID HSCtrlStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -INT Set_STAHotSpot_OnOff(IN PRTMP_ADAPTER pAd, IN UINT8 OnOff); - -enum HSCTRL_STATE HSCtrlCurrentState(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem); - -BOOLEAN HotSpotEnable(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem, - IN INT Type); - -VOID HSCtrlExit(IN PRTMP_ADAPTER pAd); - -VOID HSCtrlHalt(IN PRTMP_ADAPTER pAd); - -INT Set_HotSpot_OnOff(IN PRTMP_ADAPTER pAd, IN UINT8 OnOff, - IN UINT8 EventTrigger, IN UINT8 EventType); - -struct _PEER_PROBE_REQ_PARAM; - -BOOLEAN ProbeReqforHSAP(IN PRTMP_ADAPTER pAd, IN UCHAR APIndex, - IN struct _PEER_PROBE_REQ_PARAM *ProbeReqParam); - -VOID Clear_Hotspot_All_IE(IN PRTMP_ADAPTER PAd); - -#define isBcastEtherAddr(addr) \ - ((addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff) - -#define GAS_STATE_MESSAGES 0 -#define ACTION_STATE_MESSAGES 1 - -VOID HotspotOnOffEvent(IN PNET_DEV net_dev, IN int onoff); - -VOID HotspotAPReload(IN PNET_DEV net_dev); - -VOID hotspot_update_ap_qload_to_bcn(IN RTMP_ADAPTER *pAd); - -BOOLEAN hotspot_check_dhcp_arp(IN RTMP_ADAPTER *pAd, IN PNDIS_PACKET pPacket); - -INT Set_HotSpot_Param(IN PRTMP_ADAPTER pAd, UINT32 Param, UINT32 Value); - -VOID hotspot_bssflag_dump(UINT8 ucHotspotBSSFlags); - -VOID hotspot_update_bssflag(RTMP_ADAPTER *pAd, UINT8 flag, UINT8 value, - PHOTSPOT_CTRL pHSCtrl); - -VOID hotspot_update_bss_info_to_cr4(RTMP_ADAPTER *pAd, UCHAR APIndex); - -VOID hotspot_add_qos_map_pool_to_cr4(RTMP_ADAPTER *pAd, UINT8 PoolID); - -VOID hotspot_qosmap_update_sta_mapping_to_cr4(RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry, - UINT8 PoolID); - -UINT8 hotspot_qosmap_add_pool(RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); - -enum { - HS_ON_OFF_BASE, - HS_AP_RELOAD, -}; - -#ifdef CONFIG_AP_SUPPORT -BOOLEAN HSIPv4Check(IN PRTMP_ADAPTER pAd, PUSHORT pWcid, PNDIS_PACKET pPacket, - PUCHAR pSrcBUf, UINT16 srcPort, UINT16 dscPort); -#endif - -#ifdef CONFIG_HOTSPOT_R2 -struct _sta_hs_info { - /* UCHAR addr[6]; */ - UCHAR version; - UCHAR ppsmo_exist; - USHORT ppsmo_id; -}; -#endif -#endif /* __HOTSPOT_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hw_ctrl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hw_ctrl.h deleted file mode 100644 index 092b5ffbe2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hw_ctrl.h +++ /dev/null @@ -1,718 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - hw_ctrl.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __HW_CTRL_H__ -#define __HW_CTRL_H__ -#include "rtmp_type.h" -#include "rtmp_os.h" -#include "security/wpa_cmm.h" - -struct _RTMP_ADAPTER; -struct _MAC_TABLE_ENTRY; -struct _EDCA_PARM; -struct _WMM_CFG; -struct wifi_dev; -struct _BSS_INFO_ARGUMENT_T; -struct _MAC_TABLE_ENTRY; -struct WIFI_SYS_CTRL; -struct _STA_ADMIN_CONFIG; - -typedef NTSTATUS (*HwCmdCb)(struct _RTMP_ADAPTER *pAd, VOID *Args); - -#define HWCTRL_CMD_TIMEOUT 100 -#define HWCTRL_CMD_WAITTIME 2000 -#define ETSI_RXBLOCKER4R 4 -#define ETSI_RXBLOCKER1R 1 - -#define MAX_LEN_OF_HWCTRL_QUEUE (MAX_LEN_OF_MAC_TABLE << 1) - -/*for command classify*/ -enum { - HWCMD_TYPE_FIRST = 0, - HWCMD_TYPE_RADIO = - HWCMD_TYPE_FIRST, /*Need Radio Resource Mgmt Related*/ - HWCMD_TYPE_SECURITY, /*Security related*/ - HWCMD_TYPE_PERIPHERAL, /*Peripheral related*/ - HWCMD_TYPE_HT_CAP, /*HT related*/ - HWCMD_TYPE_PS, /*Power Saving related*/ - HWCMD_TYPE_WIFISYS, - HWCMD_TYPE_WMM, - HWCMD_TYPE_PROTECT, - HWCMD_TYPE_END -}; - -/*for command ID*/ -enum { - HWCMD_ID_FIRST = 0, - /*Peripheral*/ - HWCMD_ID_GPIO_CHECK = HWCMD_ID_FIRST, - /*USB related*/ - HWCMD_ID_RESET_BULK_OUT = 1, - HWCMD_ID_RESET_BULK_IN = 2, - /*WSC & LED related*/ - HWCMD_ID_SET_LED_STATUS = 3, - HWCMD_ID_LED_WPS_MODE10 = 4, - /*Security related*/ - HWCMD_ID_DEL_ASIC_WCID = 7, -#ifdef HTC_DECRYPT_IOT - HWCMD_ID_SET_ASIC_AAD_OM = 8, -#endif /* HTC_DECRYPT_IOT */ - HWCMD_ID_ADDREMOVE_ASIC_KEY = 9, - /*MT_MAC */ - HWCMD_ID_SET_CLIENT_MAC_ENTRY = 10, - HWCMD_ID_PS_CLEAR = 11, - HWCMD_ID_PS_RETRIEVE_START = 12, - HWCMD_ID_SET_TR_ENTRY = 13, - HWCMD_ID_UPDATE_DAW_COUNTER = 14, - HWCMD_ID_UPDATE_BEACON = 15, - HWCMD_ID_GET_TEMPERATURE = 16, - HWCMD_ID_SET_SLOTTIME = 17, - HWCMD_ID_SET_TX_BURST = 18, -#ifdef TXBF_SUPPORT - HWCMD_ID_SET_APCLI_BF_CAP = 19, - HWCMD_ID_SET_APCLI_BF_REPEATER = 20, - HWCMD_ID_ADJUST_STA_BF_SOUNDING = 21, - HWCMD_ID_TXBF_TX_APPLY_CTRL = 22, -#endif /* TXBF_SUPPORT */ -#ifdef ERR_RECOVERY - HWCMD_ID_MAC_ERROR_DETECT = 23, -#endif /* ERR_RECOVERY */ - /*AP realted*/ - HWCMD_ID_AP_ADJUST_EXP_ACK_TIME = 24, - HWCMD_ID_AP_RECOVER_EXP_ACK_TIME = 25, - HWCMD_ID_UPDATE_BSSINFO = 26, - HWCMD_ID_SET_BA_REC = 27, - /*STA related*/ - HWCMD_ID_PWR_MGT_BIT_WIFI = 28, - HWCMD_ID_FORCE_WAKE_UP = 29, - HWCMD_ID_FORCE_SLEEP_AUTO_WAKEUP = 30, - HWCMD_ID_MAKE_FW_OWN = 31, - HWCMD_ID_ENTER_PS_NULL = 32, -#ifdef VOW_SUPPORT - HWCMD_ID_SET_STA_DWRR = 33, -#endif /* VOW_SUPPORT */ - HWCMD_ID_UPDATE_RSSI = 34, - HWCMD_ID_SET_STA_DWRR_QUANTUM = 35, - HWCMD_ID_PERODIC_CR_ACCESS_NIC_UPDATE_RAW_COUNTERS = 37, - HWCMD_ID_SET_BCN_OFFLOAD = 38, - HWCMD_ID_ADD_REPT_ENTRY = 39, - HWCMD_ID_REMOVE_REPT_ENTRY = 40, - HWCMD_ID_WIFISYS_LINKDOWN = 41, - HWCMD_ID_WIFISYS_LINKUP = 42, - HWCMD_ID_WIFISYS_OPEN = 43, - HWCMD_ID_WIFISYS_CLOSE = 44, - HWCMD_ID_WIFISYS_PEER_LINKUP = 45, - HWCMD_ID_WIFISYS_PEER_LINKDOWN = 46, - HWCMD_ID_WIFISYS_PEER_UPDATE = 47, -#ifdef THERMAL_PROTECT_SUPPORT - HWCMD_ID_THERMAL_PROTECTION_RADIOOFF = 48, -#endif /* THERMAL_PROTECT_SUPPORT */ - HWCMD_ID_GET_TX_STATISTIC = 49, - HWCMD_ID_RADIO_ON_OFF = 50, - HWCMD_ID_PBC_CTRL = 51, -#ifdef GREENAP_SUPPORT - HWCMD_ID_GREENAP_ON_OFF = 52, -#endif /* GREENAP_SUPPORT */ - HWCMD_ID_HT_PROTECT = 54, - HWCMD_ID_RTS_THLD = 55, -#ifdef HOST_RESUME_DONE_ACK_SUPPORT - HWCMD_ID_HOST_RESUME_DONE_ACK = 56, -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ -#ifdef ETSI_RX_BLOCKER_SUPPORT - HWCMD_RX_CHECK_RSSI = 57, -#endif /* end of ETSI_RX_BLOCKER_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - HWCMD_ID_PCIE_ASPM_DYM_CTRL = 58, -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ -#ifdef MBO_SUPPORT - HWCMD_ID_BSS_TERMINATION = 59, -#endif /* MBO_SUPPORT */ - HWCMD_ID_SET_EDCA = 60, -#ifdef OCE_SUPPORT - HWCMD_ID_SET_FD_FRAME_OFFLOAD = 62, -#endif /* OCE_SUPPORT */ - -#ifdef MBSS_AS_WDS_AP_SUPPORT - HWCMD_ID_UPDATE_4ADDR_HDR_TRANS, -#endif - - HWCMD_ID_END, -}; - -/*for flag ID, is bit mask, 1/2/4/8*/ -enum { - HWFLAG_ID_FIRST = 0, - HWFLAG_ID_UPDATE_PROTECT = 1 << 0, - HWFLAG_ID_END, -}; - -/*HwCtrl CMD structure*/ -typedef struct _HwCmdQElmt { - UINT32 type; - UINT32 command; - VOID *buffer; - UINT32 bufferlength; - BOOLEAN NeedWait; - RTMP_OS_COMPLETION ack_done; - VOID *RspBuffer; - UINT32 RspBufferLen; - HwCmdCb CallbackFun; - VOID *CallbackArgs; - NDIS_SPIN_LOCK lock; - os_kref refcnt; -#ifdef DBG_STARVATION - struct starv_dbg starv; -#endif /*DBG_STARVATION*/ - struct _HwCmdQElmt *next; -} HwCmdQElmt, *PHwCmdQElmt; - -typedef struct _HwCmdQ { - UINT32 size; - HwCmdQElmt *head; - HwCmdQElmt *tail; - UINT32 CmdQState; -} HwCmdQ, *PHwCmdQ; - -typedef struct _HwFlagCtrl { - BOOLEAN IsFlagSet; - UINT32 FlagId; -} HwFlagCtrl, *PHwFlagCtrl; - -typedef struct _HW_CTRL_TXD { - UINT32 CmdType; - UINT32 CmdId; - BOOLEAN NeedWait; - UINT32 wait_time; - VOID *pInformationBuffer; - UINT32 InformationBufferLength; - VOID *pRespBuffer; - UINT32 RespBufferLength; - HwCmdCb CallbackFun; - VOID *CallbackArgs; -} HW_CTRL_TXD; - -enum { - SER_TIME_ID_T0 = 0, - SER_TIME_ID_T1, - SER_TIME_ID_T2, - SER_TIME_ID_T3, - SER_TIME_ID_T4, - SER_TIME_ID_T5, - SER_TIME_ID_T6, - SER_TIME_ID_T7, - SER_TIME_ID_END, -}; - -typedef struct _HWCTRL_OP { - NTSTATUS (*wifi_sys_open)(struct WIFI_SYS_CTRL *wsys); - NTSTATUS (*wifi_sys_close)(struct WIFI_SYS_CTRL *wsys); - NTSTATUS (*wifi_sys_link_up)(struct WIFI_SYS_CTRL *wsys); - NTSTATUS (*wifi_sys_link_down)(struct WIFI_SYS_CTRL *wsys); - NTSTATUS (*wifi_sys_connt_act)(struct WIFI_SYS_CTRL *wsys); - NTSTATUS (*wifi_sys_disconnt_act)(struct WIFI_SYS_CTRL *wsys); - NTSTATUS (*wifi_sys_peer_update)(struct WIFI_SYS_CTRL *wsys); -} HWCTRL_OP; - -typedef struct _HW_CTRL_T { - HwCmdQ HwCtrlQ; - HwFlagCtrl HwCtrlFlag; - NDIS_SPIN_LOCK HwCtrlQLock; /* CmdQLock spinlock */ - RTMP_OS_TASK HwCtrlTask; - UINT32 TotalCnt; - HWCTRL_OP hwctrl_ops; -#ifdef ERR_RECOVERY - RTMP_OS_TASK ser_task; - INT ser_func_state; - UINT32 ser_status; - NDIS_SPIN_LOCK ser_lock; - UINT32 ser_times[SER_TIME_ID_END]; -#endif /* ERR_RECOVERY */ -#ifdef DBG_STARVATION - struct starv_dbg_block block; -#endif /*DBG_STARVATION*/ -} HW_CTRL_T; - -/*CMD structure */ -typedef struct _RT_ASIC_RTS_INFO { - UINT32 PktNumThrd; - UINT32 PpduLengthThrd; -} RT_ASIC_RTS_INFO, *PRT_ASIC_RTS_INFO; - -typedef struct _RT_ASIC_PROTECT_INFO { - USHORT OperationMode; - UCHAR SetMask; - BOOLEAN bDisableBGProtect; - BOOLEAN bNonGFExist; -} RT_ASIC_PROTECT_INFO, *PRT_ASIC_PROTECT_INFO; - -typedef struct _RT_SET_ASIC_WCID { - ULONG WCID; /* mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based */ - ULONG SetTid; /* time-based: seconds, packet-based: kilo-packets */ - ULONG DeleteTid; /* time-based: seconds, packet-based: kilo-packets */ - UCHAR Addr[MAC_ADDR_LEN]; /* avoid in interrupt when write key */ - UCHAR Tid; - UINT16 SN; - UCHAR Basize; - INT Ses_type; - BOOLEAN IsAdd; - BOOLEAN IsBMC; - BOOLEAN IsReset; -} RT_SET_ASIC_WCID, *PRT_SET_ASIC_WCID; - -#ifdef HTC_DECRYPT_IOT -typedef struct _RT_SET_ASIC_AAD_OM { - ULONG WCID; - UCHAR Value; /* 0 ==> off, 1 ==> on */ -} RT_SET_ASIC_AAD_OM, *PRT_SET_ASIC_AAD_OM; -#endif /* HTC_DECRYPT_IOT */ - -#ifdef MBSS_AS_WDS_AP_SUPPORT -typedef struct _RT_ASIC_4ADDR_HDR_TRANS { - ULONG Wcid; - UCHAR Enable; -} RT_ASIC_4ADDR_HDR_TRANS, *PRT_ASIC_4ADDR_HDR_TRANS; -#endif - -typedef struct _RT_ASIC_WCID_SEC_INFO { - UCHAR BssIdx; - UCHAR KeyIdx; - UCHAR CipherAlg; - UINT8 Wcid; - UINT8 KeyTabFlag; -} RT_ASIC_WCID_SEC_INFO, *PRT_ASIC_WCID_SEC_INFO; - -typedef struct _RT_ASIC_SHARED_KEY { - UCHAR BssIndex; - UCHAR KeyIdx; - CIPHER_KEY CipherKey; -} RT_ASIC_SHARED_KEY, *PRT_ASIC_SHARED_KEY; - -typedef struct _RT_ASIC_PAIRWISE_KEY { - UINT8 WCID; - CIPHER_KEY CipherKey; -} RT_ASIC_PAIRWISE_KEY, *PRT_ASIC_PAIRWISE_KEY; - -typedef struct _RT_ASIC_WCID_IVEIV_ENTRY { - UINT8 Wcid; - UINT32 Iv; - UINT32 Eiv; -} RT_ASIC_WCID_IVEIV_ENTRY, *PRT_ASIC_WCID_IVEIV_ENTRY; - -/*MT MAC Specific*/ -typedef struct _MT_ASIC_SEC_INFO { - UCHAR AddRemove; - UCHAR BssIdx; - UCHAR KeyIdx; - UCHAR Wcid; - UCHAR KeyTabFlag; - CIPHER_KEY CipherKey; - UCHAR Addr[MAC_ADDR_LEN]; -} MT_ASIC_SEC_INFO, *PMT_ASIC_SEC_INFO; - -/*MT MAC Specific*/ -typedef enum _SEC_ASIC_KEY_OPERATION { - SEC_ASIC_ADD_PAIRWISE_KEY, - SEC_ASIC_REMOVE_PAIRWISE_KEY, - SEC_ASIC_ADD_GROUP_KEY, - SEC_ASIC_REMOVE_GROUP_KEY, -} SEC_ASIC_KEY_OPERATION; - -/*MT MAC Specific*/ -typedef enum _SEC_ASIC_KEY_DIRECTION { - SEC_ASIC_KEY_TX, - SEC_ASIC_KEY_RX, - SEC_ASIC_KEY_BOTH, -} SEC_ASIC_KEY_DIRECTION; - -typedef struct _SEC_KEY_INFO { - UCHAR Key[32]; /* TK(32) */ - UCHAR TxMic[8]; - UCHAR RxMic[8]; - UCHAR TxTsc[16]; /* TSC value. Change it from 48bit to 128bit */ - UCHAR RxTsc[16]; /* TSC value. Change it from 48bit to 128bit */ - UCHAR KeyLen; /* Key length for each key, 0: entry is invalid */ -} SEC_KEY_INFO, *PSEC_KEY_INFO; - -typedef struct _ASIC_SEC_INFO { - SEC_ASIC_KEY_OPERATION Operation; - SEC_ASIC_KEY_DIRECTION Direction; - UINT32 Cipher; - UCHAR Wcid; - UCHAR BssIndex; - UCHAR KeyIdx; - SEC_KEY_INFO Key; - UCHAR IGTK[32]; - UCHAR IGTKKeyLen; - UCHAR PeerAddr[MAC_ADDR_LEN]; -} ASIC_SEC_INFO, *PASIC_SEC_INFO; - -#define IS_ADDKEY_OPERATION(_pSecInfo) \ - ((_pSecInfo->Operation == SEC_ASIC_ADD_PAIRWISE_KEY) || \ - (_pSecInfo->Operation == SEC_ASIC_ADD_GROUP_KEY)) -#define IS_REMOVEKEY_OPERATION(_pSecInfo) \ - ((_pSecInfo->Operation == SEC_ASIC_REMOVE_PAIRWISE_KEY) || \ - (_pSecInfo->Operation == SEC_ASIC_REMOVE_GROUP_KEY)) -#define IS_PAIRWISEKEY_OPERATION(_pSecInfo) \ - ((_pSecInfo->Operation == SEC_ASIC_ADD_PAIRWISE_KEY) || \ - (_pSecInfo->Operation == SEC_ASIC_REMOVE_PAIRWISE_KEY)) -#define IS_GROUPKEY_OPERATION(_pSecInfo) \ - ((_pSecInfo->Operation == SEC_ASIC_ADD_GROUP_KEY) || \ - (_pSecInfo->Operation == SEC_ASIC_REMOVE_GROUP_KEY)) - -typedef struct _RT_ASIC_WCID_ATTR_ENTRY { - UCHAR BssIdx; - UCHAR KeyIdx; - UCHAR CipherAlg; - UINT8 Wcid; - UINT8 KeyTabFlag; -} RT_ASIC_WCID_ATTR_ENTRY, *PRT_ASIC_WCID_ATTR_ENTRY; - -typedef struct _MT_SET_BSSINFO { - UCHAR OwnMacIdx; - UINT8 ucBssIndex; - UINT8 Bssid[MAC_ADDR_LEN]; - UINT8 BcMcWlanIdx; - UINT32 NetworkType; - UINT32 u4ConnectionType; - UINT8 Active; - UINT32 u4EnableFeature; -} MT_SET_BSSINFO, *PMT_SET_BSSINFO; - -#ifdef BCN_OFFLOAD_SUPPORT -typedef struct _MT_SET_BCN_OFFLOAD { - UINT8 WdevIdx; - ULONG WholeLength; - BOOLEAN Enable; - UCHAR OffloadPktType; - ULONG TimIePos; - ULONG CsaIePos; -} MT_SET_BCN_OFFLOAD, *PMT_SET_BCN_OFFLOAD; -#endif - -#ifdef OCE_SUPPORT -typedef struct _MT_SET_FD_FRAME_OFFLOAD { - UINT8 WdevIdx; - UINT8 ucEnable; - UINT16 u2PktLength; - UINT16 u2TimestampFieldPos; - - UINT8 acPktContent[1520]; -} MT_SET_FD_FRAME_OFFLOAD, *PMT_SET_FD_FRAME_OFFLOAD; -#endif /* OCE_SUPPORT */ - -typedef struct _MT_UPDATE_BEACON { - struct wifi_dev *wdev; - UCHAR UpdateReason; -} MT_UPDATE_BEACON, *PMT_UPDATE_BEACON; - -typedef struct _MT_SET_STA_REC { - UINT8 BssIndex; - UINT8 WlanIdx; - UINT32 ConnectionType; - UINT8 ConnectionState; - UINT32 EnableFeature; -} MT_SET_STA_REC, *PMT_SET_STA_REC; - -typedef struct _RT_SET_TR_ENTRY { - ULONG WCID; - VOID *pEntry; -} RT_SET_TR_ENTRY, *PRT_SET_TR_ENTRY; - -#ifdef VOW_SUPPORT -typedef struct _MT_VOW_STA_GROUP { - UINT8 StaIdx; - UINT8 GroupIdx; -} MT_VOW_STA_GROUP, *PMT_VOW_STA_GROUP; - -typedef struct _MT_VOW_STA_QUANTUM { - BOOLEAN restore; - UINT8 quantum; -} MT_VOW_STA_QUANTUM, *PMT_VOW_STA_QUANTUM; - -#endif /* VOW_SUPPORT */ - -typedef struct _SLOT_CFG { - BOOLEAN bUseShortSlotTime; - UCHAR Channel; - struct wifi_dev *wdev; -} SLOT_CFG; - -typedef struct _REMOVE_REPT_ENTRY_STRUC { - UCHAR func_tb_idx; - UCHAR CliIdx; -} REMOVE_REPT_ENTRY_STRUC, *PREMOVE_REPT_ENTRY_STRUC; - -typedef struct _ADD_REPT_ENTRY_STRUC { - struct wifi_dev *wdev; - UCHAR arAddr[MAC_ADDR_LEN]; -} ADD_REPT_ENTRY_STRUC, *PADD_REPT_ENTRY_STRUC; - -typedef struct _TX_STAT_STRUC { - UINT32 Field; /* Tx Statistic update method from N9 (GET_TX_STAT_XXX) */ - UINT8 Wcid; - UINT8 Band; -} TX_STAT_STRUC, *PTX_STAT_STRUC; - -#ifdef TXBF_SUPPORT -typedef struct _MT_STA_BF_ADJ { - struct wifi_dev *wdev; - UCHAR ConnectionState; -} MT_STA_BF_ADJ, *PMT_STA_BF_ADJ; -#endif /* TXBF_SUPPORT */ - -/*Export API function*/ -UINT32 HwCtrlInit(struct _RTMP_ADAPTER *pAd); -VOID HwCtrlExit(struct _RTMP_ADAPTER *pAd); -UINT32 HWCtrlOpsReg(struct _RTMP_ADAPTER *pAd); - -NDIS_STATUS HwCtrlEnqueueCmd(struct _RTMP_ADAPTER *pAd, HW_CTRL_TXD HwCtrlTxd); - -NDIS_STATUS HwCtrlSetFlag(struct _RTMP_ADAPTER *pAd, INT32 FlagId); - -INT Show_HwCtrlStatistic_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/*Security*/ -VOID HW_ADDREMOVE_KEYTABLE(struct _RTMP_ADAPTER *pAd, - struct _ASIC_SEC_INFO *pInfo); - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - -#define RTMP_UPDATE_PROTECT(_pAd) AsicUpdateProtect(_pAd); - -#define RTMP_SET_TR_ENTRY(pAd, pEntry) \ - TRTableInsertEntry(pAd, pEntry->wcid, pEntry); - -#define RTMP_MLME_PRE_SANITY_CHECK(_pAd) - -#define RTMP_AP_ADJUST_EXP_ACK_TIME(_pAd) \ - RTMP_IO_WRITE32(_pAd, EXP_ACK_TIME, 0x005400ca) - -#define RTMP_AP_RECOVER_EXP_ACK_TIME(_pAd) \ - RTMP_IO_WRITE32(_pAd, EXP_ACK_TIME, 0x002400ca) - -#define RTMP_SET_LED_STATUS(_pAd, _Status) RTMPSetLEDStatus(_pAd, _Status) - -#define RTMP_SET_LED(_pAd, _Mode) RTMPSetLED(_pAd, _Mode) - -VOID RTMP_PWR_MGT_BIT_WIFI(struct _RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, - UINT8 ucPwrMgtBit); -VOID RTMP_FORCE_WAKEUP(struct _RTMP_ADAPTER *pAd, - struct _STA_ADMIN_CONFIG *pStaCfg); -VOID RTMP_SLEEP_FORCE_AUTO_WAKEUP(struct _RTMP_ADAPTER *pAd, - struct _STA_ADMIN_CONFIG *pStaCfg); - -#else -VOID RTMP_UPDATE_PROTECT(struct _RTMP_ADAPTER *pAd); -VOID RTMP_MLME_PRE_SANITY_CHECK(struct _RTMP_ADAPTER *pAd); - -/*Security*/ - -VOID RTMP_SET_TR_ENTRY(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); -VOID RTMP_AP_ADJUST_EXP_ACK_TIME(struct _RTMP_ADAPTER *pAd); -VOID RTMP_AP_RECOVER_EXP_ACK_TIME(struct _RTMP_ADAPTER *pAd); -VOID RTMP_SET_LED_STATUS(struct _RTMP_ADAPTER *pAd, UCHAR Status); -VOID RTMP_SET_LED(struct _RTMP_ADAPTER *pAd, UINT32 WPSLedMode10); - -/*STA*/ - -#endif /*defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT)*/ - -/*Common*/ -VOID RTMP_UPDATE_RAW_COUNTER(struct _RTMP_ADAPTER *pAd); -VOID RTMP_PS_RETRIVE_START(struct _RTMP_ADAPTER *pAd, UCHAR Wcid); -VOID RTMP_PS_RETRIVE_CLEAR(struct _RTMP_ADAPTER *pAd, UCHAR Wcid); -VOID RTMP_HANDLE_PRETBTT_INT_EVENT(struct _RTMP_ADAPTER *pAd); - -VOID RTMP_SET_TX_BURST(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BOOLEAN enable); - -VOID HW_SET_TX_BURST(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT8 ac_type, UINT8 prio, UINT16 level, UINT8 enable); - -VOID HW_ADD_REPT_ENTRY(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PUCHAR pAddr); - -VOID HW_REMOVE_REPT_ENTRY(struct _RTMP_ADAPTER *pAd, UCHAR func_tb_idx, - UCHAR CliIdx); - -VOID HW_UPDATE_BSSINFO(struct _RTMP_ADAPTER *pAd, - struct _BSS_INFO_ARGUMENT_T *BssInfoArgs); - -VOID RTMP_SET_BA_REC(struct _RTMP_ADAPTER *pAd, VOID *Buffer, UINT32 Len); -VOID HW_SET_BA_REC(struct _RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid, UINT16 sn, - UCHAR basize, BOOLEAN isAdd, INT ses_type); -VOID HW_SET_DEL_ASIC_WCID(struct _RTMP_ADAPTER *pAd, ULONG Wcid); - -#ifdef HTC_DECRYPT_IOT -VOID HW_SET_ASIC_WCID_AAD_OM(struct _RTMP_ADAPTER *pAd, ULONG Wcid, - UCHAR value); -#endif /* HTC_DECRYPT_IOT */ -#ifdef MBSS_AS_WDS_AP_SUPPORT -VOID HW_SET_ASIC_WCID_4ADDR_HDR_TRANS(struct _RTMP_ADAPTER *pAd, ULONG Wcid, - UCHAR IsEnable); -#endif - -#ifdef OCE_SUPPORT -VOID HW_SET_FD_FRAME_OFFLOAD(struct _RTMP_ADAPTER *pAd, UINT8 WdevIdx, - ULONG WholeLength, BOOLEAN Enable, - UINT16 TimestampPos, UCHAR *Buf); -#endif /* OCE_SUPPORT */ -VOID RTMP_GET_TEMPERATURE(struct _RTMP_ADAPTER *pAd, UINT32 *pTemperature); -VOID RTMP_RADIO_ON_OFF_CTRL(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - UINT8 ucRadio); - -#ifdef MBO_SUPPORT -VOID RTMP_BSS_TERMINATION(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -#endif /* MBO_SUPPORT */ - -#ifdef GREENAP_SUPPORT -VOID RTMP_GREENAP_ON_OFF_CTRL(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN ucGreenAP); -#endif /* GREENAP_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -VOID rtmp_pcie_aspm_dym_ctrl(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN fgL1Enable, BOOLEAN fgL0sEnable); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ -VOID HW_SET_SLOTTIME(struct _RTMP_ADAPTER *pAd, BOOLEAN bUseShortSlotTime, - UCHAR Channel, struct wifi_dev *wdev); -VOID HW_ENTER_PS_NULL(struct _RTMP_ADAPTER *pAd, - struct _STA_ADMIN_CONFIG *pStaCfg); -VOID HW_BEACON_UPDATE(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR UpdateBeacon); - -#ifdef PKT_BUDGET_CTRL_SUPPORT -VOID HW_SET_PBC_CTRL(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, UCHAR type); -#endif /*PKT_BUDGET_CTRL_SUPPORT*/ - -VOID HW_SET_EDCA(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _EDCA_PARM *pedca_param); - -VOID HW_SET_RTS_THLD(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR pkt_num, UINT32 length, UCHAR retry_limit); - -/* Insert the BA bitmap to ASIC for the Wcid entry */ -#define RTMP_ADD_BA_SESSION_TO_ASIC(_pAd, _wcid, _TID, _SN, _basize, _type) \ - HW_SET_BA_REC(_pAd, _wcid, _TID, _SN, _basize, 1, _type); - -/* Remove the BA bitmap from ASIC for the Wcid entry */ -/* bitmap field starts at 0x10000 in ASIC WCID table */ -#define RTMP_DEL_BA_SESSION_FROM_ASIC(_pAd, _wcid, _TID, _type) \ - HW_SET_BA_REC(_pAd, _wcid, _TID, 0, 0, 0, _type); - -#ifdef TXBF_SUPPORT -VOID HW_APCLI_BF_CAP_CONFIG(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); -VOID HW_APCLI_BF_REPEATER_CONFIG(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); -VOID HW_STA_BF_SOUNDING_ADJUST(struct _RTMP_ADAPTER *pAd, UCHAR connState, - struct wifi_dev *wdev); -VOID HW_AP_TXBF_TX_APPLY(struct _RTMP_ADAPTER *pAd, UCHAR enable); -#endif /* TXBF_SUPPORT */ - -#ifdef VOW_SUPPORT -VOID RTMP_SET_STA_DWRR(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); -VOID RTMP_SET_STA_DWRR_QUANTUM(struct _RTMP_ADAPTER *pAd, BOOLEAN restore, - UCHAR quantum); -#endif /* VOW_SUPPORT */ - -VOID RTMP_SET_UPDATE_RSSI(struct _RTMP_ADAPTER *pAd); - -#ifdef ETSI_RX_BLOCKER_SUPPORT /* RX Blocker Solution */ -VOID RTMP_CHECK_RSSI(struct _RTMP_ADAPTER *pAd); -#endif /* end ETSI_RX_BLOCKER_SUPPORT */ - -#ifdef THERMAL_PROTECT_SUPPORT -VOID RTMP_SET_THERMAL_RADIO_OFF(struct _RTMP_ADAPTER *pAd); -#endif /* THERMAL_PROTECT_SUPPORT */ - -VOID NICUpdateRawCountersNew(struct _RTMP_ADAPTER *pAd); - -#ifdef ERR_RECOVERY -typedef enum _ERR_RECOVERY_STATE { - ERR_RECOV_STOP_IDLE = 0, - ERR_RECOV_STOP_PDMA0, - ERR_RECOV_RESET_PDMA0, - ERR_RECOV_STOP_IDLE_DONE, - ERR_RECOV_WAIT_N9_NORMAL, - ERR_RECOV_EVENT_REENTRY, - ERR_RECOV_STATE_NUM -} ERR_RECOVERY_STATE, - *P_ERR_RECOVERY_STATE; - -typedef struct _ERR_RECOVERY_CTRL_T { - ERR_RECOVERY_STATE errRecovState; - UINT32 status; -} ERR_RECOVERY_CTRL_T; - -VOID RTMP_MAC_RECOVERY(struct _RTMP_ADAPTER *pAd, UINT32 Status); -INT IsStopingPdma(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl); -ERR_RECOVERY_STATE ErrRecoveryCurStat(ERR_RECOVERY_CTRL_T *pErrRecoveryCtl); -BOOLEAN IsErrRecoveryInIdleStat(struct _RTMP_ADAPTER *pAd); -VOID ser_sys_reset(RTMP_STRING *arg); -NTSTATUS HwRecoveryFromError(struct _RTMP_ADAPTER *pAd); -void SerTimeLogDump(struct _RTMP_ADAPTER *pAd); -#endif /* ERR_RECOVERY */ - -VOID HW_WIFISYS_OPEN(struct _RTMP_ADAPTER *ad, struct WIFI_SYS_CTRL *wsys); -VOID HW_WIFISYS_CLOSE(struct _RTMP_ADAPTER *ad, struct WIFI_SYS_CTRL *wsys); -VOID HW_WIFISYS_LINKUP(struct _RTMP_ADAPTER *ad, struct WIFI_SYS_CTRL *wsys); -VOID HW_WIFISYS_LINKDOWN(struct _RTMP_ADAPTER *ad, struct WIFI_SYS_CTRL *wsys); -VOID HW_WIFISYS_PEER_LINKUP(struct _RTMP_ADAPTER *ad, - struct WIFI_SYS_CTRL *wsys); -VOID HW_WIFISYS_PEER_LINKDOWN(struct _RTMP_ADAPTER *ad, - struct WIFI_SYS_CTRL *wsys); -VOID HW_WIFISYS_PEER_UPDATE(struct _RTMP_ADAPTER *ad, - struct WIFI_SYS_CTRL *wsys); -VOID HW_WIFISYS_RA_UPDATE(struct _RTMP_ADAPTER *ad, struct WIFI_SYS_CTRL *wsys); - -VOID HW_GET_TX_STATISTIC(struct _RTMP_ADAPTER *ad, UINT32 Field, UINT8 Wcid); - -enum { - HWCTRL_OP_TYPE_V1, - HWCTRL_OP_TYPE_V2, -}; - -void hw_set_tx_burst(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT8 ac_type, UINT8 prio, UINT16 level, UINT8 enable); - -#ifdef WIFI_SYS_FW_V1 -VOID hw_ctrl_ops_v1_register(struct _HWCTRL_OP *hwctrl_ops); -#endif /*WIFI_SYS_FW_V1*/ - -#ifdef WIFI_SYS_FW_V2 -VOID hw_ctrl_ops_v2_register(struct _HWCTRL_OP *hwctrl_ops); -#endif /*WIFI_SYS_FW_V2*/ - -#ifdef HOST_RESUME_DONE_ACK_SUPPORT -VOID rtmp_host_resume_done_ack(struct _RTMP_ADAPTER *pAd); -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hw_ctrl_basic.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hw_ctrl_basic.h deleted file mode 100644 index 7571bc10ad..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/hw_ctrl_basic.h +++ /dev/null @@ -1,19 +0,0 @@ - -/*==============================================*/ -/* Define HW Ctrl Handler and Mapping Table */ -/*==============================================*/ - -typedef NTSTATUS (*HwCmdHdlr)(RTMP_ADAPTER *pAd, HwCmdQElmt *CMDQelmt); -typedef NTSTATUS (*HwFlagHdlr)(RTMP_ADAPTER *pAd); - -typedef struct { - UINT32 CmdID; - HwCmdHdlr CmdHdlr; - UINT32 RfCnt; -} HW_CMD_TABLE_T; - -typedef struct { - UINT32 FlagId; - HwFlagHdlr FlagHdlr; - UINT32 RfCnt; -} HW_FLAG_TABLE_T; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/icap.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/icap.h deleted file mode 100644 index 53f305bde9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/icap.h +++ /dev/null @@ -1,288 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - icap.h -*/ - -#ifndef __ICAP_H_ -#define __ICAP_H_ - -/******************************************************************************* -* M A C R O S -******************************************************************************** -*/ - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) -/* RBISTCR */ -#define RBIST_BASE 0x810C0000 -#define RBISTCR0 (RBIST_BASE + 0x90) -#define RBISTCR1 (RBIST_BASE + 0x94) -#define RBISTCR2 (RBIST_BASE + 0x98) /* Start address of SYSRAM */ -#define RBISTCR3 (RBIST_BASE + 0x9c) /* End address of SYSRAM */ -#define RBISTCR4 (RBIST_BASE + 0xa0) -#define RBISTCR5 (RBIST_BASE + 0xa4) -#define RBISTCR6 (RBIST_BASE + 0xa8) -#define RBISTCR7 (RBIST_BASE + 0xac) -#define RBISTCR8 (RBIST_BASE + 0xb0) -#define RBISTCR9 (RBIST_BASE + 0xb4) /* Last write address */ -#define RBISTCR10 (RBIST_BASE + 0xb8) - -/* RBISTCR0 */ -#define ICAP_WRAP 17 -#define CR_RBIST_CAPTURE 1 - -/* RBISTCR10 */ -#define SYSRAM_INTF_SEL1 26 -#define SYSRAM_INTF_SEL2 27 -#define SYSRAM_INTF_SEL3 28 - -/* CR_DBGSGD_MODE */ -#define CR_SGD_MODE1 0 -#define CR_SGD_MODE4 3 -#define CR_SGD_DBG_SEL 15 - -/* Trigger Event */ -#define CAP_FREE_RUN 0 - -/* Ring Mode */ -#define CAP_RING_MODE_ENABLE 1 -#define CAP_RING_MODE_DISABLE 0 - -/* Capture Bit Width */ -#define CAP_96BIT 0 -#define CAP_128BIT 1 - -/* Capture Node */ -#define MT7615_CAP_WF0_ADC 0x000b -#define MT7615_CAP_WF1_ADC 0x000c -#define MT7615_CAP_WF2_ADC 0x000d -#define MT7615_CAP_WF3_ADC 0x000e -#define MT7615_CAP_WF0_FIIQ 0x200b -#define MT7615_CAP_WF1_FIIQ 0x200c -#define MT7615_CAP_WF2_FIIQ 0x200d -#define MT7615_CAP_WF3_FIIQ 0x200e -#define MT7615_CAP_WF0_FDIQ 0x300b -#define MT7615_CAP_WF1_FDIQ 0x300c -#define MT7615_CAP_WF2_FDIQ 0x300d -#define MT7615_CAP_WF3_FDIQ 0x300e -#define MT7622_CAP_FOUR_WAY_ADC 0x005d -#define MT7622_CAP_FOUR_WAY_FIIQ 0x0049 -#define MT7622_CAP_FOUR_WAY_FDIQ 0x0048 -#define MT7622_CAP_WF0_ADC 0x100b -#define MT7622_CAP_WF1_ADC 0x100c -#define MT7622_CAP_WF2_ADC 0x100d -#define MT7622_CAP_WF3_ADC 0x100e -#define MT7622_CAP_WF0_FIIQ 0x200b -#define MT7622_CAP_WF1_FIIQ 0x200c -#define MT7622_CAP_WF2_FIIQ 0x200d -#define MT7622_CAP_WF3_FIIQ 0x200e -#define MT7622_CAP_WF0_FDIQ 0x300b -#define MT7622_CAP_WF1_FDIQ 0x300c -#define MT7622_CAP_WF2_FDIQ 0x300d -#define MT7622_CAP_WF3_FDIQ 0x300e - -/* Capture Bw */ -#define CAP_BW_20 0 -#define CAP_BW_40 1 -#define CAP_BW_80 2 - -/* Capture Antenna */ -#define CAP_WF0 0 -#define CAP_WF1 1 -#define CAP_WF2 2 -#define CAP_WF3 3 - -/* I/Q Type */ -#define CAP_I_TYPE 0 -#define CAP_Q_TYPE 1 - -/* Parameter Setting */ -#define CAP_MODE 0 -#define CAP_TRIGGER 1 -#define CAP_RING_MODE 2 -#define CAP_BBP_EVENT 3 -#define CAP_NODE 4 -#define CAP_LENGTH 5 -#define CAP_STOP_CYCLE 6 -#define CAP_BW 7 -#define CAP_MAC_EVENT 8 -#define CAP_SOURCE_ADDR 9 -#define CAP_BAND 10 - -/* Capture Status */ -#define CAP_SUCCESS 0 -#define CAP_BUSY 1 -#define CAP_FAIL 2 - -/* Capture BitWidth */ -#define CAP_32BITS 32 -#define CAP_96BITS 96 - -/* Dump raw data expired time */ -#define CAP_DUMP_DATA_EXPIRE 100000 - -/* Length of file naming */ -#define CAP_FILE_MSG_LEN 64 - -/* -=================================== - WIFISPECTRUM DEFINE -=================================== -*/ -/* Wifi-Spectrum Event Data Sample Cnt */ -#define SPECTRUM_EVENT_DATA_SAMPLE 256 - -/* Wifi-Spectrum CMD Response Length */ -#define SPECTRUM_DEFAULT_RESP_LEN 0 - -/* Wifi-Spectrum Wait CMD Response Time */ -#define SPECTRUM_DEFAULT_WAIT_RESP_TIME 0 -#define SPECTRUM_WAIT_RESP_TIME 10000 - -/* MT7615 */ -#define MT7615_SPECTRUM_TOTAL_SIZE 128 /* Unit:KBytes */ -/* -=================================== - ICAP DEFINE -=================================== -*/ -/* ICap Event Data Sample Cnt */ -#define ICAP_EVENT_DATA_SAMPLE 256 - -/* MT7622 */ -#define MT7622_ICAP_BANK_SAMPLE_CNT 4096 -#define MT7622_ICAP_FOUR_WAY_ADC_IQ_DATA_CNT \ - (4096 * \ - 6) /* (4096(Samples/Bank) * 6Banks * 3(IQSamples/Sample) * 32bits)/96bits */ -#define MT7622_ICAP_FOUR_WAY_IQC_IQ_DATA_CNT \ - (4096 * \ - 2) /* (4096(Samples/Bank) * 6Banks * 1(IQSamples/Sample) * 32bits)/96bits */ - -/* MT7663 */ -#define MT7663_ICAP_BANK_SAMPLE_CNT 8192 -#define MT7663_ICAP_FOUR_WAY_ADC_IQ_DATA_CNT 8192 -#define MT7663_ICAP_FOUR_WAY_IQC_IQ_DATA_CNT 8192 - -#define MAX_ICAP_IQ_DATA_CNT MT7622_ICAP_FOUR_WAY_ADC_IQ_DATA_CNT -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - -/******************************************************************************* -* D A T A T Y P E S -******************************************************************************** -*/ - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) -typedef enum _ICAP_WIFI_SPECTRUM_MODE { - ICAP_MODE = 0, - WIFI_SPECTRUM_MODE -} ICAP_WIFI_SPECTRUM_MODE; - -typedef struct GNU_PACKED _RBIST_IQ_DATA_T { - INT32 IQ_Array[4][2]; /* IQ_Array[WF][IQ] */ -} RBIST_IQ_DATA_T, *P_RBIST_IQ_DATA_T; - -typedef struct GNU_PACKED _RBIST_CAP_START_T { - UINT32 fgTrigger; - UINT32 fgRingCapEn; - UINT32 u4TriggerEvent; - UINT32 u4CaptureNode; - UINT32 u4CaptureLen; /* Unit : IQ Sample */ - UINT32 u4CapStopCycle; /* Unit : IQ Sample */ - UINT32 u4MACTriggerEvent; - UINT32 u4SourceAddressLSB; - UINT32 u4SourceAddressMSB; - UINT32 u4BandIdx; - UINT32 u4BW; - UINT32 u4En96b128b; /* 0:96b, 1:128b */ - UINT32 u4Reserved[8]; -} RBIST_CAP_START_T, *P_RBIST_CAP_START_T; - -typedef struct GNU_PACKED _RBIST_DUMP_RAW_DATA_T { - UINT32 u4Address; - UINT32 u4AddrOffset; - UINT32 u4Bank; - UINT32 u4BankSize; /* Uint:Kbytes */ - UINT32 u4Reserved[8]; -} RBIST_DUMP_RAW_DATA_T, *P_RBIST_DUMP_RAW_DATA_T; - -typedef struct GNU_PACKED _RBIST_DESC_T { - UINT32 u4Address; - UINT32 u4AddrOffset; - UINT32 u4Bank; - UINT32 u4BankSize; /* Uint:KBytes */ - UINT8 ucBitWidth; /* Uint:Bit */ - UINT8 ucADCRes; /* Uint:Bit */ - UINT8 ucIQCRes; /* Uint:Bit */ - PUINT8 pLBank; - PUINT8 pMBank; - PUINT8 pHBank; -} RBIST_DESC_T, *P_RBIST_DESC_T; - -typedef struct GNU_PACKED _EXT_CMD_SPECTRUM_CTRL_T { - UINT32 u4FuncIndex; - RBIST_CAP_START_T rSpectrumInfo; - RBIST_DUMP_RAW_DATA_T rSpectrumDump; -} EXT_CMD_SPECTRUM_CTRL_T, *P_EXT_CMD_SPECTRUM_CTRL_T; - -typedef struct _EXT_EVENT_SPECTRUM_RESULT_T { - UINT32 u4FuncIndex; - UINT32 u4FuncLength; - UINT8 aucEvent[0]; -} EXT_EVENT_SPECTRUM_RESULT_T, *PEXT_EVENT_SPECTRUM_RESULT_T; - -typedef struct GNU_PACKED _EXT_EVENT_RBIST_ADDR_T { - UINT32 u4FuncIndex; - UINT32 u4FuncLength; - UINT32 u4StartAddr1; - UINT32 u4StartAddr2; - UINT32 u4StartAddr3; - UINT32 u4EndAddr; - UINT32 u4StopAddr; - UINT32 u4Wrap; -} EXT_EVENT_RBIST_ADDR_T, *P_EXT_EVENT_RBIST_ADDR_T; - -typedef struct GNU_PACKED _EXT_EVENT_RBIST_DUMP_RAW_DATA_T { - UINT32 u4FuncIndex; - UINT32 u4PktNum; - UINT32 u4Bank; - UINT32 u4DataLength; - UINT32 u4Reserved[8]; - UINT32 u4Data[256]; -} EXT_EVENT_RBIST_DUMP_RAW_DATA_T, *P_EXT_EVENT_RBIST_DUMP_RAW_DATA_T; - -typedef struct GNU_PACKED _EXT_EVENT_RBIST_CAP_STATUS_T { - UINT32 u4FuncIndex; - UINT32 u4CapDone; - UINT32 u4CapStartAddr; - UINT32 u4CapEndAddr; - UINT32 u4CapStopAddr; - UINT32 u4Wrap; - UINT32 u4TotalBufferSize; /* Uint:KBytes */ - UINT32 u4EMIStartAddr; - UINT32 u4EMIEndAddr; - UINT32 u4Reserved[8]; -} EXT_EVENT_RBIST_CAP_STATUS_T, *P_EXT_EVENT_RBIST_CAP_STATUS_T; - -typedef enum _ENUM_SPECTRUM_CTRL_FUNCID_T { - SPECTRUM_CTRL_FUNCID_SET_PARAMETER = 0, - SPECTRUM_CTRL_FUNCID_GET_CAPTURE_STATUS, - SPECTRUM_CTRL_FUNCID_DUMP_RAW_DATA -} ENUM_SPECTRUM_CTRL_FUNCID_T; -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - -/******************************************************************************* -* F U N C T I O N D E C L A R A T I O N S -******************************************************************************** -*/ - -#endif /* __ICAP_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/iface.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/iface.h deleted file mode 100644 index 9f7c7ac399..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/iface.h +++ /dev/null @@ -1,12 +0,0 @@ - -#ifndef __IFACE_H__ -#define __IFACE_H__ - -#ifdef MT_MAC -#if defined(RTMP_MAC_PCI) || defined(RTMP_MAC_USB) -#include "mt_hif_pci_usb.h" -#endif - -#endif - -#endif /* __IFACE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/iface_util.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/iface_util.h deleted file mode 100644 index f304c86c1a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/iface_util.h +++ /dev/null @@ -1,46 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rtmp_util.h - - Abstract: - Common for PCI/USB/RBUS. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- -*/ - -#ifndef __RTMP_UTIL_H__ -#define __RTMP_UTIL_H__ - -/* maximum of PCI, USB, or RBUS, int PCI, it is 0 but in USB, it is 11 */ -#define RTMP_PKT_TAIL_PADDING \ - 11 /* 3(max 4 byte padding) + 4 (last packet padding) + 4 (MaxBulkOutsize align padding) */ - -#define RTMP_PCI_DMA_TODEVICE 0xFF00 -#define RTMP_PCI_DMA_FROMDEVICE 0xFF01 - -#define UNLINK_TIMEOUT_MS 3 - -#define USBD_TRANSFER_DIRECTION_OUT 0 -#define USBD_TRANSFER_DIRECTION_IN 0 -#define USBD_SHORT_TRANSFER_OK 0 -#define PURB purbb_t - -#define OS_RTMP_MlmeUp RtmpOsMlmeUp - -#endif /* __RTMP_UTIL_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/mtk_hif.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/mtk_hif.h deleted file mode 100644 index 51320d4b4a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/mtk_hif.h +++ /dev/null @@ -1,72 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __MTK_HIF_H_ -#define __MTK_HIF_H_ - -struct mtk_hif_dev { - char priv[0] __aligned(NETDEV_ALIGN); -}; - -struct mtk_hif { - const struct mtk_hif_ops *ops; - struct mtk_hif_dev hif_dev __aligned(NETDEV_ALIGN); -}; - -/** - * @write_tx_resource:HIF resource arrangement for MSDU TX packet transfer. - * @write_multi_tx_resource:HIF resource arrangement for A-MSDU TX packet transfer. - * @write_final_tx_resource:HIF resource arrangement for A-MSDU TX packet transfer for total bytes - * update in tx hw header. - * @kickout_data_tx: TX data packet kick-out to HW to start transfer. - * @get_pkt_from_rx_resource: get RX packet from HIF resource. - * @get_tx_resource_free_num: get tx data HIF resource available numbers - * @get_mgmt_resource_free_num: get management HIF resource available numbers - * @get_bcn_resource_free_num: get beacon HIF resource available numbers - * @get_cmd_resource_free_num: get command HIF resource available numbers - * @get_fw_loading_resource_free_num: get fw loading HIF resource available numbers - * @is_tx_resource_empty: check if tx data HIF resource is empty or not - * @is_rx_resource_full: check if rx HIF resource is full or not - * @get_rx_resource_pending_num: get rx HIF resource pending numbers - * - */ -struct mtk_hif_ops { - u16 (*write_tx_resource)(struct mtk_hif_dev *hif_dev, - struct _TX_BLK *tx_blk, bool is_last, - u16 *free_num); - u16 (*write_multi_tx_resource)(struct mtk_hif_dev *hif_dev, - struct _TX_BLK *tx_blk, u8 frame_num, - u16 *free_num); - void (*write_final_tx_resource)(struct mtk_hif_dev *hif_dev, - struct _TX_BLK *tx_blk, - u16 total_mpdu_size, u16 first_tx_idx); - u16 (*write_frag_tx_resource)(struct mtk_hif_dev *hif_dev, - struct _TX_BLK *tx_blk, u8 frag_num, - u16 *free_num); - void (*kickout_data_tx)(struct mtk_hif_dev *hif_dev, - struct _TX_BLK *tx_blk, UCHAR que_idx); - - PNDIS_PACKET(*get_pkt_from_rx_resource) - (struct mtk_hif_dev *hif_dev, bool *re_schedule, - unsigned int *rx_pending, u8 ring_no); - UINT32(*get_tx_resource_free_num) - (struct mtk_hif_dev *hif_dev, UINT8 que_idx); - u8 *src_va, unsigned int src_buf_len); -}; - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_inf_pcirbs.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_inf_pcirbs.h deleted file mode 100644 index 474b0bce22..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_inf_pcirbs.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef __RTMP_INF_PCIRBS_H__ -#define __RTMP_INF_PCIRBS_H__ - -struct _RTMP_ADAPTER; -struct _TX_BLK; - -#define fRTMP_ADAPTER_NEED_STOP_TX 0 - -#define RTMP_OS_IRQ_RELEASE(_pAd, _NetDev) \ - { \ - POS_COOKIE pObj = (POS_COOKIE)(_pAd->OS_Cookie); \ - RtmpOSIRQRelease(_NetDev, _pAd->infType, pObj->pci_dev, NULL); \ - } - -/* ----------------- TX Related MACRO ----------------- */ -#define RTMP_START_DEQUEUE(pAd, QueIdx, irqFlags, deq_info) \ - do { \ - } while (0) -#define RTMP_STOP_DEQUEUE(pAd, QueIdx, irqFlags) \ - do { \ - } while (0) - -#define RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \ - ((freeNum) >= \ - (ULONG)(pTxBlk->TotalFragNum + RTMP_GET_PACKET_FRAGMENTS(pPacket) + \ - 3)) /* rough estimate we will use 3 more descriptor. */ -#define RTMP_RELEASE_DESC_RESOURCE(pAd, QueIdx) \ - do { \ - } while (0) - -#define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) \ - /* RtmpPCI_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)*/ - -USHORT mt_pci_write_frag_tx_resource(struct _RTMP_ADAPTER *pAd, - struct _TX_BLK *pTxBlk, UCHAR fragNum, - USHORT *FreeNumber); - -#define HAL_LastTxIdx(_pAd, _QueIdx, _LastTxIdx) \ - /*RtmpPCIDataLastTxIdx(_pAd, _QueIdx,_LastTxIdx)*/ - -#define HAL_KickOutTxBMC(_pAd, _pTxBlk, _QueIdx) \ - HIF_IO_WRITE32((_pAd), (_pAd)->TxBmcRing.hw_cidx_addr, \ - (_pAd)->TxBmcRing.TxCpuIdx) - -#define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen) \ - MiniportMMRequest(_pAd, _QueIdx, _pNullFrame, _frameLen) - -UINT32 pci_get_tx_resource_free_num_nolock(struct _RTMP_ADAPTER *pAd, - UINT8 que_idx); -UINT32 pci_get_tx_resource_free_num(struct _RTMP_ADAPTER *pAd, UINT8 que_idx); -UINT32 pci_get_rx_resource_pending_num(struct _RTMP_ADAPTER *pAd, - UINT8 que_idx); -UINT32 pci_get_tx_bcn_free_num(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); -UINT32 pci_get_tx_mgmt_free_num(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); -BOOLEAN pci_is_tx_resource_empty(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); -BOOLEAN pci_is_rx_resource_empty(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); -UINT32 pci_get_tx_ctrl_free_num(struct _RTMP_ADAPTER *pAd); - -UINT16 GET_TXRING_FREENO(struct _RTMP_ADAPTER *pAd, UCHAR QueIdx); - -/* TODO: shiang-MT7615, fix me after the cmd ring and N9 is ready for Beacon handling!! */ -#define GET_MGMTRING_FREENO(_pAd, _RingIdx) \ - pci_get_tx_mgmt_free_num(_pAd, _RingIdx) -#define GET_BCNRING_FREENO(_pAd, _RingIdx) \ - pci_get_tx_bcn_free_num(_pAd, _RingIdx) - -#define IS_TXRING_EMPTY(_pAd, _QueIdx) pci_is_tx_resource_empty(_pAd, _QueIdx) - -#define GET_RXRING_PENDINGNO(_pAd, _QueIdx) \ - pci_get_rx_resource_pending_num(_pAd, _QueIdx) - -#define IS_RXRING_FULL(_pAd, _QueIdx) pci_is_rx_resource_empty(_pAd, _QueIdx) - -#ifdef CONFIG_ANDES_SUPPORT -#define GET_CTRLRING_FREENO(_pAd) pci_get_tx_ctrl_free_num(_pAd) - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#define GET_FWDWLORING_FREENO(_Ring) \ - (((_Ring)->TxSwFreeIdx > (_Ring)->TxCpuIdx) ? \ - ((_Ring)->TxSwFreeIdx - (_Ring)->TxCpuIdx - 1) : \ - ((_Ring)->TxSwFreeIdx + (_Ring)->ring_size - \ - (_Ring)->TxCpuIdx - 1)) -#endif /* defined(MT7615) || defined(MT7622) */ -#endif /* CONFIG_ANDES_SUPPORT */ - -USHORT mtd_pci_write_tx_resource(struct _RTMP_ADAPTER *pAd, - struct _TX_BLK *pTxBlk, BOOLEAN bIsLast, - USHORT *FreeNumber); - -USHORT mt_pci_write_tx_resource(struct _RTMP_ADAPTER *pAd, - struct _TX_BLK *pTxBlk, BOOLEAN bIsLast, - USHORT *FreeNumber); - -USHORT mt_pci_write_multi_rx_resource(struct _RTMP_ADAPTER *pAd, - struct _TX_BLK *pTxBlk, UCHAR frameNum, - USHORT *FreeNumber); - -USHORT rt_pci_write_multi_rx_resource(struct _RTMP_ADAPTER *pAd, - struct _TX_BLK *pTxBlk, UCHAR frameNum, - USHORT *FreeNumber); - -VOID pci_kickout_data_tx(struct _RTMP_ADAPTER *pAd, struct _TX_BLK *tx_blk, - UCHAR que_idx); - -VOID mt_pci_write_final_tx_resource(struct _RTMP_ADAPTER *pAd, - struct _TX_BLK *pTxBlk, - USHORT totalMPDUSize, USHORT FirstTxIdx); - -USHORT RtmpPCI_WriteFragTxResource(IN struct _RTMP_ADAPTER *pAd, - IN struct _TX_BLK *pTxBlk, IN UCHAR fragNum, - OUT USHORT *FreeNumber); - -VOID RtmpPCI_FinalWriteTxResource(IN struct _RTMP_ADAPTER *pAd, - IN struct _TX_BLK *pTxBlk, - IN USHORT totalMPDUSize, - IN USHORT FirstTxIdx); - -VOID pci_inc_resource_full_cnt(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); -VOID pci_dec_resource_full_cnt(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); -BOOLEAN pci_get_resource_state(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); -INT pci_set_resource_state(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx, - BOOLEAN state); -UINT32 pci_check_resource_state(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); - -VOID tx_dma_done_func(struct _RTMP_ADAPTER *pAd); -VOID rx_done_func(struct _RTMP_ADAPTER *pAd); -VOID rx1_done_func(struct _RTMP_ADAPTER *pAd); -VOID tr_done_func(struct _RTMP_ADAPTER *pAd); -VOID mt_mac_recovery_func(struct _RTMP_ADAPTER *pAd); -VOID mt_mac_fw_own_func(struct _RTMP_ADAPTER *pAd); -VOID mt_subsys_int_func(struct _RTMP_ADAPTER *pAd); - -#endif /* __RTMP_INF_PCIRBS_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_pci.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_pci.h deleted file mode 100644 index d870917049..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_pci.h +++ /dev/null @@ -1,97 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rtmp_pci.h - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- -*/ - -#ifndef __RTMP_PCI_H__ -#define __RTMP_PCI_H__ - -#include "iface/rtmp_inf_pcirbs.h" - -/* - Device ID & Vendor ID related definitions, - NOTE: you should not add the new VendorID/DeviceID here unless you - not sure it belongs to what chip. -*/ - -#define PCIBUS_INTEL_VENDOR 0x8086 - -#if !defined(PCI_CAP_ID_EXP) -#define PCI_CAP_ID_EXP 0x10 -#endif -#if !defined(PCI_EXP_LNKCTL) -#define PCI_EXP_LNKCTL 0x10 -#endif -#if !defined(PCI_CLASS_BRIDGE_PCI) -#define PCI_CLASS_BRIDGE_PCI 0x0604 -#endif - -#define SYSCFG0 0x10 - -/* - PCI registers - base address 0x0000 -*/ -#define PCI_CFG 0x0000 -#define PCI_EECTRL 0x0004 -#define PCI_MCUCTRL 0x0008 -#define AUX_CTRL 0x10c - -#define OPT_14 0x114 - -#define RT28XX_HANDLE_DEV_ASSIGN(handle, dev_p) \ - (((POS_COOKIE)handle)->pci_dev = dev_p) - -#ifdef LINUX -/* set driver data */ -#define RT28XX_DRVDATA_SET(_a) pci_set_drvdata(_a, net_dev); - -#define RT28XX_PUT_DEVICE(dev_p) - -#define RTMP_PCI_DEV_UNMAP() \ - do { \ - if (net_dev->base_addr) { \ - iounmap((void *)(net_dev->base_addr)); \ - release_mem_region(pci_resource_start(dev_p, 0), \ - pci_resource_len(dev_p, 0)); \ - } \ - if (net_dev->irq) \ - pci_release_regions(dev_p); \ - } while (0) - -#define PCI_REG_READ_WORD(pci_dev, offset, Configuration) \ - do { \ - if (pci_read_config_word(pci_dev, offset, ®16) == 0) \ - Configuration = le2cpu16(reg16); \ - else \ - Configuration = 0; \ - } while (0) - -#define PCI_REG_WIRTE_WORD(pci_dev, offset, Configuration) \ - do { \ - reg16 = cpu2le16(Configuration); \ - pci_write_config_word(pci_dev, offset, reg16); \ - } while (0) - -#endif /* LINUX */ - -#endif /* __RTMP_PCI_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_rbs.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_rbs.h deleted file mode 100644 index 00383f5ff3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/iface/rtmp_rbs.h +++ /dev/null @@ -1,108 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rtmp_rbs.h - - Abstract: - Ralink SoC Internal Bus related definitions and data dtructures - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __RTMP_RBUS_H__ -#define __RTMP_RBUS_H__ - -#include "iface/rtmp_inf_pcirbs.h" - -/************************************************************************* - * - * Device hardware/ Interface related definitions. - * - ************************************************************************/ - -#define RTMP_MAC_IRQ_NUM 4 - -/************************************************************************* - * - * EEPROM Related definitions - * - ************************************************************************/ -#if defined(CONFIG_RALINK_RT3050_1T1R) -#if defined(CONFIG_RALINK_RT3350) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT3350_AP_1T1R_V1_0.bin" -#else -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT3050_AP_1T1R_V1_0.bin" -#endif /* CONFIG_RALINK_RT3350 */ -#endif /* CONFIG_RALINK_RT3050_1T1R */ - -#if defined(CONFIG_RALINK_RT3051_1T2R) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT3051_AP_1T2R_V1_0.bin" -#endif /* CONFIG_RALINK_RT3051_1T2R */ - -#if defined(CONFIG_RALINK_RT3052_2T2R) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT3052_AP_2T2R_V1_1.bin" -#endif /* CONFIG_RALINK_RT3052_2T2R */ - -#if defined(CONFIG_RALINK_RT3883_3T3R) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT3883_AP_3T3R_V0_1.bin" -#endif /* CONFIG_RALINK_RT3883_3T3R */ - -#if defined(CONFIG_RALINK_RT3662_2T2R) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT3662_AP_2T2R_V0_0.bin" -#endif /* CONFIG_RALINK_RT3662_2T2R */ - -#if defined(CONFIG_RALINK_RT3352_2T2R) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT3352_AP_2T2R-4L_V12.BIN" -#endif /* CONFIG_RALINK_RT3352_2T2R */ - -#if defined(CONFIG_RALINK_RT5350_1T1R) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT5350_AP_1T1R_V1_0.bin" -#endif /* CONFIG_RALINK_RT5350_1T1R */ - -#if defined(CONFIG_RT2860V2_2850) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/RT2880_RT2850_AP_2T3R_V1_6.bin" -#endif /* CONFIG_RT2860V2_2850 */ - -#if defined(CONFIG_RALINK_RT6352) || defined(CONFIG_RALINK_MT7620) -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/MT7620_AP_2T2R-4L_V15.BIN" -#endif /* defined (CONFIG_RALINK_RT6352) || defined (CONFIG_RALINK_MT7620) */ - -#if defined(CONFIG_RALINK_MT7612E) -#if defined(CONFIG_RALINK_MT7620) /* TODO: PATH */ -#undef EEPROM_DEFAULT_FILE_PATH -#endif -#define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/MT7662E2_EEPROM_20130527.bin" -/* #define EEPROM_DEFAULT_FILE_PATH "/etc_ro/wlan/MT7662E2_EEPROM_20130903_ePA.bin" */ -#endif /* CONFIG_RALINK_MT7612E */ - -#if defined(CONFIG_RT2880_FLASH_32M) -#define MTD_NUM_FACTORY 5 -#else -#define MTD_NUM_FACTORY 2 -#endif - -#ifdef LINUX -/************************************************************************* - * - * Device Tx/Rx related definitions. - * - ************************************************************************/ - -#endif /* LINUX */ - -#endif /* __RTMP_RBUS_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/igmp_snoop.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/igmp_snoop.h deleted file mode 100644 index 57c5fb6d5f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/igmp_snoop.h +++ /dev/null @@ -1,211 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - igmp_snoop.h - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __RTMP_IGMP_SNOOP_H__ -#define __RTMP_IGMP_SNOOP_H__ - -#include "common/link_list.h" -#include "ipv6.h" - -#define IPV4_ADDR_LEN 4 -#define MULTICAST_WHITE_LIST_SIZE_MAX 20 - -#define IGMP_PROTOCOL_DESCRIPTOR 0x02 -#define IGMP_MEMBERSHIP_QUERY 0x11 /*same for IGMP v1, v2 & v3*/ -#define IGMP_V1_MEMBERSHIP_REPORT 0x12 -#define IGMP_V2_MEMBERSHIP_REPORT 0x16 -#define IGMP_LEAVE_GROUP 0x17 -#define IGMP_V3_MEMBERSHIP_REPORT 0x22 - -#define MLD_LISTENER_QUERY 130 /*same for MLD v1 & v2*/ -#define MLD_V1_LISTENER_REPORT 131 -#define MLD_V1_LISTENER_DONE 132 -#define MLD_V2_LISTERNER_REPORT 143 - -#define IGMPMAC_TB_ENTRY_AGEOUT_TIME (120 * OS_HZ) - -#define MULTICAST_ADDR_HASH_INDEX(Addr) \ - (MAC_ADDR_HASH(Addr) & (MAX_LEN_OF_MULTICAST_FILTER_HASH_TABLE - 1)) - -#define IS_IPV6_MULTICAST_MAC_ADDR(Addr) \ - ((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) == 0x33)) - -#define IGMP_NONE 0 -#define IGMP_PKT 1 -#define IGMP_IN_GROUP 2 -#ifdef VENDOR_FEATURE6_SUPPORT -#ifndef ETH_TYPE_VLAN -#define ETH_TYPE_VLAN 0X8100 -#endif -#endif -#define IGMP_CFG_BAND0 (1 << 0) -#define IGMP_CFG_BAND1 (1 << 1) - -VOID MulticastFilterTableInit( - IN PRTMP_ADAPTER pAd, - IN PMULTICAST_FILTER_TABLE *ppMulticastFilterTable); - -VOID MultiCastFilterTableReset( - PRTMP_ADAPTER pAd, IN PMULTICAST_FILTER_TABLE *ppMulticastFilterTable); - -BOOLEAN MulticastFilterTableInsertEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pGrpId, - UINT8 BssIdx, IN UINT8 type, - IN PUCHAR pMemberAddr, IN PNET_DEV dev, - IN UINT8 WlanIndex); - -BOOLEAN MulticastFilterTableDeleteEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pGrpId, - UINT8 BssIdx, IN PUCHAR pMemberAddr, - IN PNET_DEV dev, IN UINT8 WlanIndex); - -PMULTICAST_FILTER_TABLE_ENTRY -MulticastFilterTableLookup(IN PMULTICAST_FILTER_TABLE pMulticastFilterTable, - IN PUCHAR pAddr, IN PNET_DEV dev); - -BOOLEAN isIgmpPkt(IN PUCHAR pDstMacAddr, IN PUCHAR pIpHeader); - -#ifdef IGMP_TVM_SUPPORT -INT IgmpSnEnableTVMode(IN RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT8 IsTVModeEnable, UINT8 TVModeType); - -VOID ConvertUnicastMacToMulticast(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *wdev, IN RX_BLK *pRxBlk); - -VOID MakeTVMIE(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN OUT PUCHAR pOutBuffer, IN OUT PULONG pFrameLen); - -INT Set_IgmpSn_BlackList_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Show_IgmpSn_BlackList_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -BOOLEAN isIgmpMldExemptPkt(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - IN PUCHAR pGroupIpAddr, IN UINT16 ProtoType); - -INT Set_IgmpSn_AgeOut_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Show_IgmpSn_McastTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -BOOLEAN IgmpSnoopingGetMulticastTable(RTMP_ADAPTER *pAd, UINT8 ucOwnMacIdx, - P_IGMP_MULTICAST_TABLE pMcastTable); - -VOID IgmpSnoopingShowMulticastTable(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -BOOLEAN MulticastFilterConfigAgeOut(RTMP_ADAPTER *pAd, UINT8 AgeOutTime, - UINT8 ucOwnMacIdx); - -BOOLEAN MulticastFilterInitMcastTable(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BOOLEAN bActive); - -BOOLEAN MulticastFilterGetMcastTable(RTMP_ADAPTER *pAd, UINT8 ucOwnMacIdx, - struct wifi_dev *wdev); - -#endif /* IGMP_TVM_SUPPORT */ - -VOID IGMPSnooping(IN PRTMP_ADAPTER pAd, IN PUCHAR pDstMacAddr, - IN PUCHAR pSrcMacAddr, IN PUCHAR pIpHeader, - IN MAC_TABLE_ENTRY *pEntry, UINT8 Wcid); - -#ifdef A4_CONN -/* Indicate if Specific Pkt is an IGMP query message*/ -BOOLEAN isIGMPquery(IN PRTMP_ADAPTER pAd, IN PUCHAR pDstMacAddr, - IN PUCHAR pIpHeader); -#endif - -BOOLEAN isMldPkt(IN PUCHAR pDstMacAddr, IN PUCHAR pIpHeader, - OUT UINT8 *pProtoType, OUT PUCHAR *pMldHeader); - -BOOLEAN IPv6MulticastFilterExcluded(IN PUCHAR pDstMacAddr, IN PUCHAR pIpHeader); - -VOID MLDSnooping(IN PRTMP_ADAPTER pAd, IN PUCHAR pDstMacAddr, - IN PUCHAR pSrcMacAddr, IN PUCHAR pIpHeader, - IN MAC_TABLE_ENTRY *pEntry, UINT8 Wcid); - -#ifdef A4_CONN -/* Indicate if Specific Pkt is an MLD query message*/ -BOOLEAN isMLDquery(IN PRTMP_ADAPTER pAd, IN PUCHAR pDstMacAddr, - IN PUCHAR pIpHeader); -#endif - -UCHAR IgmpMemberCnt(IN PLIST_HEADER pList); - -VOID IgmpGroupDelMembers(IN PRTMP_ADAPTER pAd, IN PUCHAR pMemberAddr, - IN struct wifi_dev *wdev, UINT8 Wcid); - -VOID MulticastWLTableInit( - IN PRTMP_ADAPTER pAd, - IN PMULTICAST_WHITE_LIST_FILTER_TABLE *ppMulticastWLTable); - -VOID MultiCastWLTableReset( - PRTMP_ADAPTER pAd, - IN PMULTICAST_WHITE_LIST_FILTER_TABLE *ppMulticastWLTable); - -INT Set_Igmp_Flooding_CIDR_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_Igmp_Show_Flooding_CIDR_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_IgmpSn_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_IgmpSn_AddEntry_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_IgmpSn_DelEntry_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_IgmpSn_TabDisplay_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -void rtmp_read_igmp_snoop_from_file(IN PRTMP_ADAPTER pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *buffer); - -NDIS_STATUS IgmpPktInfoQuery(IN PRTMP_ADAPTER pAd, IN PUCHAR pSrcBufVA, - IN PNDIS_PACKET pPacket, IN struct wifi_dev *wdev, - OUT INT *pInIgmpGroup, - OUT PMULTICAST_FILTER_TABLE_ENTRY *ppGroupEntry); - -NDIS_STATUS IgmpPktClone(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - PNDIS_PACKET pPacket, INT IgmpPktInGroup, - PMULTICAST_FILTER_TABLE_ENTRY pGroupEntry, - UCHAR QueIdx, UINT8 UserPriority, PNET_DEV pNetDev); - -#ifdef A4_CONN -/* Indicate if Specific Pkt is an IGMP query message*/ -BOOLEAN isIGMPquery(IN PRTMP_ADAPTER pAd, IN PUCHAR pDstMacAddr, - IN PUCHAR pIpHeader); -#endif - -#ifdef A4_CONN - -#define QUERY_SEND_PERIOD 6 /* 60 seconds */ -#define QUERY_HOLD_PERIOD 15 /* 150 seconds*/ - -/* Send an IGMP query message on particular AP interface*/ -void send_igmpv3_gen_query_pkt(IN PRTMP_ADAPTER pAd, - IN PMAC_TABLE_ENTRY pMacEntry); - -/* Send a MLD query message on particular AP interface*/ -void send_mldv2_gen_query_pkt(IN PRTMP_ADAPTER pAd, - IN PMAC_TABLE_ENTRY pMacEntry); - -/* For specifed MBSS, compute & store IPv6 format checksum for MLD query message to be sent on that interface*/ -void calc_mldv2_gen_query_chksum(IN PRTMP_ADAPTER pAd, IN BSS_STRUCT *pMbss); -#endif - -#endif /* __RTMP_IGMP_SNOOP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ipv6.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ipv6.h deleted file mode 100644 index 8a908dc1d6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ipv6.h +++ /dev/null @@ -1,180 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - ipv6.h - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __IPV6_HDR_H_ -#define __IPV6_HDR_H_ - -#define IPV6_ADDR_LEN 16 -#define IPV6_HDR_LEN 40 - -enum IP_TYPE { IP_V4, IP_V6 }; - -/* IPv6 address definition */ -#define IPV6_LINK_LOCAL_ADDR_PREFIX 0xFE8 -#define IPV6_SITE_LOCAL_ADDR_PREFIX 0xFEC -#define IPV6_LOCAL_ADDR_PREFIX 0xFE8 -#define IPV6_MULTICAST_ADDR_PREFIX 0xFF -#define IPV6_LOOPBACK_ADDR 0x1 -#define IPV6_UNSPECIFIED_ADDR 0x0 - -/* defined as sequence in IPv6 header */ -#define IPV6_NEXT_HEADER_HOP_BY_HOP 0x00 /* 0 */ -#define IPV6_NEXT_HEADER_DESTINATION 0x3c /* 60 */ -#define IPV6_NEXT_HEADER_ROUTING 0x2b /* 43 */ -#define IPV6_NEXT_HEADER_FRAGMENT 0x2c /* 44 */ -#define IPV6_NEXT_HEADER_AUTHENTICATION 0x33 /* 51 */ -#define IPV6_NEXT_HEADER_ENCAPSULATION 0x32 /* 50, RFC-2406 */ -#define IPV6_NEXT_HEADER_NONE 0x3b /* 59 */ - -#define IPV6_NEXT_HEADER_TCP 0x06 -#define IPV6_NEXT_HEADER_UDP 0x11 -#define IPV6_NEXT_HEADER_ICMPV6 0x3a -#define IPV6_NEXT_HEADER_PIM 0x67 - -/* ICMPv6 msg type definition */ -#define ICMPV6_MSG_TYPE_ROUTER_SOLICITATION 0x85 /* 133 */ -#define ROUTER_SOLICITATION_FIXED_LEN 8 - -#define ICMPV6_MSG_TYPE_ROUTER_ADVERTISEMENT 0x86 /* 134 */ -#define ROUTER_ADVERTISEMENT_FIXED_LEN 16 - -#define ICMPV6_MSG_TYPE_NEIGHBOR_SOLICITATION 0x87 /* 135 */ -#define NEIGHBOR_SOLICITATION_FIXED_LEN 24 - -#define ICMPV6_MSG_TYPE_NEIGHBOR_ADVERTISEMENT 0x88 /* 136 */ -#define NEIGHBOR_ADVERTISEMENT_FIXED_LEN 24 - -#define ICMPV6_MSG_TYPE_REDIRECT 0x89 /* 137 */ -#define REDIRECT_FIXED_LEN 40 - -/* IPv6 Address related structures */ -typedef struct rt_ipv6_addr_ { - union { - UCHAR ipv6Addr8[16]; - USHORT ipv6Addr16[8]; - UINT32 ipv6Addr32[4]; - } addr; -#define ipv6_addr addr.ipv6Addr8 -#define ipv6_addr16 addr.ipv6Addr16 -#define ipv6_addr32 addr.ipv6Addr32 -} RT_IPV6_ADDR, *PRT_IPV6_ADDR; - -/*IPv6 Header related structures */ -typedef struct GNU_PACKED _rt_ipv6_hdr_ { - UINT32 ver : 4; - UINT32 trafficClass : 8; - UINT32 flowLabel : 20; - USHORT payload_len; - UCHAR nextHdr; - UCHAR hopLimit; - RT_IPV6_ADDR srcAddr; - RT_IPV6_ADDR dstAddr; -} RT_IPV6_HDR, *PRT_IPV6_HDR; - -typedef struct GNU_PACKED _rt_ipv6_ext_hdr_ { - UCHAR nextProto; /* Indicate the protocol type of next extension header. */ - UCHAR extHdrLen; /* optional field for msg length of this extension header which didn't include the first "nextProto" field. */ - UCHAR octets[1]; /* hook to extend header message body. */ -} RT_IPV6_EXT_HDR, *PRT_IPV6_EXT_HDR; - -/* ICMPv6 related structures */ -typedef struct GNU_PACKED _rt_ipv6_icmpv6_hdr_ { - UCHAR type; - UCHAR code; - USHORT chksum; - UCHAR octets[1]; /*hook to extend header message body. */ -} RT_ICMPV6_HDR, *PRT_ICMPV6_HDR; - -typedef struct GNU_PACKED _rt_icmp6_option_hdr_ { - UCHAR type; - UCHAR len; - UCHAR octet[1]; -} RT_ICMPV6_OPTION_HDR, *PRT_ICMPV6_OPTION_HDR; - -typedef enum { - /* Defined ICMPv6 Option Types. */ - TYPE_SRC_LL_ADDR = 1, - TYPE_TGT_LL_ADDR = 2, - TYPE_PREFIX_INFO = 3, - TYPE_REDIRECTED_HDR = 4, - TYPE_MTU = 5, -} ICMPV6_OPTIONS_TYPE_DEF; - -static inline BOOLEAN IPv6ExtHdrHandle(RT_IPV6_EXT_HDR *pExtHdr, UCHAR *pProto, - UINT32 *pOffset) -{ - UCHAR nextProto = 0xff; - UINT32 extLen = 0; - BOOLEAN status = TRUE; - - /*printk("%s(): parsing the Extension Header with Protocol(0x%x):\n", __FUNCTION__, *pProto); */ - switch (*pProto) { - case IPV6_NEXT_HEADER_HOP_BY_HOP: - /* IPv6ExtHopByHopHandle(); */ - nextProto = pExtHdr->nextProto; - extLen = (pExtHdr->extHdrLen + 1) * 8; - break; - - case IPV6_NEXT_HEADER_DESTINATION: - /* IPv6ExtDestHandle(); */ - nextProto = pExtHdr->nextProto; - extLen = (pExtHdr->extHdrLen + 1) * 8; - break; - - case IPV6_NEXT_HEADER_ROUTING: - /* IPv6ExtRoutingHandle(); */ - nextProto = pExtHdr->nextProto; - extLen = (pExtHdr->extHdrLen + 1) * 8; - break; - - case IPV6_NEXT_HEADER_FRAGMENT: - /* IPv6ExtFragmentHandle(); */ - nextProto = pExtHdr->nextProto; - extLen = - 8; /* The Fragment header length is fixed to 8 bytes. */ - break; - - case IPV6_NEXT_HEADER_AUTHENTICATION: - /* IPV6_NEXT_HEADER_ENCAPSULATION: */ - /* - TODO: Not support. For encryption issue. - */ - nextProto = 0xFF; - status = FALSE; - break; - - default: - nextProto = 0xFF; - status = FALSE; - break; - } - - *pProto = nextProto; - *pOffset += extLen; - /*printk("%s(): nextProto = 0x%x!, offset=0x%x!\n", __FUNCTION__, nextProto, offset); */ - return status; -} - -#endif /* __IPV6_HDR_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/l1profile.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/l1profile.h deleted file mode 100644 index fecad7731b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/l1profile.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifdef DEFAULT_5G_PROFILE -UCHAR l1profile_default[] = { "Default\n\ -INDEX0=MT7615\n\ -INDEX0_profile_path=/etc/Wireless/RT2860/RT2860_2G.dat;/etc/Wireless/RT2860/RT2860_5G.dat\n\ -INDEX0_EEPROM_offset=0x0\n\ -INDEX0_EEPROM_size=0x4000\n\ -INDEX0_EEPROM_name=e2p\n\ -INDEX0_main_ifname=ra0;rax0\n\ -INDEX0_ext_ifname=ra;rax\n\ -INDEX0_wds_ifname=wds;wdsx\n\ -INDEX0_apcli_ifname=apcli;apclix\n\ -INDEX0_mesh_ifname=mesh;meshx\n\ -INDEX0_nvram_zone=RT2860\n\ -INDEX0_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat\n\ -INDEX0_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat\n\ -INDEX1=MT7615\n\ -INDEX1_profile_path=/etc/Wireless/iNIC/iNIC_ap.dat\n\ -INDEX1_EEPROM_offset=0x8000\n\ -INDEX1_EEPROM_size=0x4000\n\ -INDEX1_EEPROM_name=e2p\n\ -INDEX1_main_ifname=rai0\n\ -INDEX1_ext_ifname=rai\n\ -INDEX1_wds_ifname=wdsi\n\ -INDEX1_apcli_ifname=apclii\n\ -INDEX1_mesh_ifname=meshi\n\ -INDEX1_nvram_zone=RTDEV\n\ -INDEX1_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat\n\ -INDEX1_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat\n" }; - -#else -UCHAR l1profile_default[] = { "Default\n\ -INDEX0=MT7615\n\ -INDEX0_profile_path=/etc/Wireless/RT2860/RT2860.dat\n\ -INDEX0_EEPROM_offset=0x0\n\ -INDEX0_EEPROM_size=0x4000\n\ -INDEX0_EEPROM_name=e2p\n\ -INDEX0_main_ifname=ra0\n\ -INDEX0_ext_ifname=ra\n\ -INDEX0_wds_ifname=wds\n\ -INDEX0_apcli_ifname=apcli\n\ -INDEX0_mesh_ifname=mesh\n\ -INDEX0_nvram_zone=RT2860\n\ -INDEX0_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat\n\ -INDEX0_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat\n\ -INDEX1=MT7615\n\ -INDEX1_profile_path=/etc/Wireless/iNIC/iNIC_ap.dat\n\ -INDEX1_EEPROM_offset=0x8000\n\ -INDEX1_EEPROM_size=0x4000\n\ -INDEX1_EEPROM_name=e2p\n\ -INDEX1_main_ifname=rai0\n\ -INDEX1_ext_ifname=rai\n\ -INDEX1_wds_ifname=wdsi\n\ -INDEX1_apcli_ifname=apclii\n\ -INDEX1_mesh_ifname=meshi\n\ -INDEX1_nvram_zone=RTDEV\n\ -INDEX1_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat\n\ -INDEX1_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat\n\ -INDEX2=MT7615\n\ -INDEX2_profile_path=/etc/Wireless/WIFI3/RT2870AP.dat\n\ -INDEX2_EEPROM_offset=0x4000\n\ -INDEX2_EEPROM_size=0x4000\n\ -INDEX2_EEPROM_name=e2p\n\ -INDEX2_main_ifname=rae0\n\ -INDEX2_ext_ifname=rae\n\ -INDEX2_wds_ifname=wdsex\n\ -INDEX2_apcli_ifname=apclie\n\ -INDEX2_mesh_ifname=meshe\n\ -INDEX2_nvram_zone=WIFI3\n\ -INDEX2_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat\n\ -INDEX2_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat\n\ -INDEX3=MT7615A\n\ -INDEX3_profile_path=/etc/Wireless/MT7615A_B0_5G.dat;/etc/Wireless/MT7615A_B1_5G.dat\n\ -INDEX3_EEPROM_offset=0x0\n\ -INDEX3_EEPROM_size=0x4000\n\ -INDEX3_EEPROM_name=e2p\n\ -INDEX3_main_ifname=ra0;rax0\n\ -INDEX3_ext_ifname=ra;rax\n\ -INDEX3_wds_ifname=wds;wdsx\n\ -INDEX3_apcli_ifname=apcli;apclix\n\ -INDEX3_mesh_ifname=mesh;meshx\n\ -INDEX3_nvram_zone=RT2860\n\ -INDEX3_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat\n\ -INDEX3_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat\n" }; -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/map.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/map.h deleted file mode 100644 index 0c8f708d31..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/map.h +++ /dev/null @@ -1,219 +0,0 @@ - -#ifndef __MAP_H__ -#define __MAP_H__ - -#include "rtmp_type.h" -#include "rtmp.h" -#define ASSOC_REQ_LEN 154 -#define ASSOC_REQ_LEN_MAX 512 -#define BLOCK_LIST_NUM 128 -#define VENDOR_SPECIFIC_LEN 128 -#define MAX_BH_PROFILE_CNT 4 -#ifdef MAP_R2 -#define ASSOC_REQ_LEN_R2 512 -#define INVALID_VLAN_ID 4095 -#endif - -/* For rssi steering*/ -#define RCPI_TOLLENACE 8 /* 2dB */ - -#define IS_MAP_ENABLE(pAd) \ - ((pAd->MAPMode != MAP_DISABLED) && (pAd->MAPMode != MAP_BS_2_0)) - -#define IS_MAP_TURNKEY_ENABLE(pAd) ((pAd->MAPMode == MAP_TURNKEY)) - -#define IS_MAP_BS_ENABLE(pAd) ((pAd->MAPMode == MAP_BS_2_0)) - -#define VEND_IE_TYPE 221 - -#ifdef MAP_R2 -#define IS_MAP_R2_ENABLE(pAd) (pAd->bMapR2Enable == TRUE) -#endif -#ifdef MAP_TS_TRAFFIC_SUPPORT -#define IS_VALID_VID(vid) ((vid) && (vid != INVALID_VLAN_ID)) -#endif - -typedef enum { - BELOW_THRESHOLD = 0, - ABOVE_THRESHOLD, -} RSSI_STATUS; - -typedef enum { - AGENT_INIT_STEER_DISALLOW = 0, - AGENT_INIT_RSSI_STEER_MANDATE, - AGENT_INIT_RSSI_STEER_ALLOW, -} STEERING_POLICY; - -struct GNU_PACKED map_policy_setting { - unsigned char steer_policy; - unsigned char cu_thr; - unsigned char rcpi_thr; -}; - -#ifdef DFS_CAC_R2 -struct GNU_PACKED cac_opcap { - unsigned char op_class; - unsigned char ch_num; - unsigned char ch_list[16]; - USHORT cac_time[16]; - unsigned int last_cac_time[16]; - USHORT non_occupancy_remain[16]; -}; - -struct GNU_PACKED cac_capability_lib { - unsigned char country_code[2]; - unsigned char rdd_region; - unsigned char op_class_num; - struct cac_opcap opcap[16]; - unsigned char active_cac; - unsigned char ch_num; - unsigned int remain_time; - unsigned char cac_mode; -}; -#endif - -#define MAP_DISABLED 0 -#define MAP_TURNKEY 1 -#define MAP_BS_2_0 2 -#define MAP_API_MODE 3 -#define MAP_CERT_MODE 4 - -typedef struct _MAP_CONFIG { - /*Support Unassociated STA link metric report on current operating Bss*/ - BOOLEAN bUnAssocStaLinkMetricRptOpBss; - /*Support Unassociated STA link metric report on currently non operating Bss */ - BOOLEAN bUnAssocStaLinkMetricRptNonOpBss; - /*Support Agent-initiated Rssi-based steering */ - BOOLEAN bAgentInitRssiSteering; - UCHAR DevOwnRole; - UCHAR vendor_ie_buf[VENDOR_SPECIFIC_LEN]; - UCHAR vendor_ie_len; - struct scan_BH_ssids scan_bh_ssids; - BOOLEAN FireProbe_on_DFS; -#ifdef MAP_R2 - UINT16 primary_vid; - UCHAR primary_pcp; - UCHAR vid_num; - UINT32 vids[128]; - UINT16 fh_vid; - UINT32 bitmap_trans_vlan[128]; -#endif -} MAP_CONFIG, *PMAP_CONFIG; - -/* spec v171027 */ -enum MAPRole { - MAP_ROLE_TEARDOWN = 4, - MAP_ROLE_FRONTHAUL_BSS = 5, - MAP_ROLE_BACKHAUL_BSS = 6, - MAP_ROLE_BACKHAUL_STA = 7, -}; - -#define NON_PREF 0 -#define PREF_SCORE_1 BIT(4) -#define PREF_SCORE_2 BIT(5) -#define PREF_SCORE_3 (BIT(4) | BIT(5)) -#define PREF_SCORE_4 BIT(6) -#define PREF_SCORE_5 (BIT(4) | BIT(6)) -#define PREF_SCORE_6 (BIT(5) | BIT(6)) -#define PREF_SCORE_7 (BIT(4) | BIT(5) | BIT(6)) -#define PREF_SCORE_8 (BIT(7)) -#define PREF_SCORE_9 (BIT(4) | BIT(7)) -#define PREF_SCORE_10 (BIT(5) | BIT(7)) -#define PREF_SCORE_11 (BIT(4) | BIT(5) | BIT(6)) -#define PREF_SCORE_12 (BIT(6) | BIT(7)) -#define PREF_SCORE_13 (BIT(4) | BIT(6) | BIT(7)) -#define PREF_SCORE_14 (BIT(5) | BIT(6) | BIT(7)) - -#define UNSPECIFICIED 0 -#define NON80211_INTERFERER_IN_LOCAL_ENV BIT(0) -#define INTRA_NETWORK_80211_OBSS_INTERFERENCE BIT(1) -#define ENTERNAL_NETWORK_80211_OBSS_INTERFERENCE (BIT(0) | BIT(1)) -#define REDUCED_COVERAGE BIT(2) -#define REDUCED_TP (BIT(0) | BIT(2)) -#define INDEVICE_INTERFERER (BIT(1) | BIT(2)) -#define OP_DISALLOWED_DUE_TO_DFS (BIT(0) | BIT(1) | BIT(2)) -#define OP_PREVENT_BACKHAUL_OP (BIT(3)) -#define IMMEDIATE_OP_POSSIBLE_ON_DFS_CHN (BIT(0) | BIT(3)) -#define DFS_CHN_STATE_UNKNOWN (BIT(1) | BIT(3)) - -extern UCHAR multicast_mac_1905[MAC_ADDR_LEN]; - -VOID MAP_Init(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - IN IN UCHAR wdev_type); - -VOID MAP_InsertMapCapIE(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - OUT PUCHAR pFrameBuf, OUT PULONG pFrameLen); - -INT MAP_InsertMapWscAttr(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - OUT PUCHAR pFrameBuf); - -BOOLEAN map_check_cap_ie(IN PEID_STRUCT eid, OUT unsigned char *cap -#ifdef MAP_R2 - , - OUT UCHAR *profile, OUT UINT16 *vid -#endif -); - -UCHAR getNonOpChnNum(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - IN UCHAR op_class); - -VOID setNonOpChnList(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - IN PCHAR nonOpChnList, IN UCHAR op_class, - IN UCHAR nonOpChnNum); - -INT map_send_bh_sta_wps_done_event(IN PRTMP_ADAPTER adapter, - IN struct _MAC_TABLE_ENTRY *mac_entry, - IN BOOLEAN is_ap); - -VOID map_rssi_status_check(IN PRTMP_ADAPTER pAd); - -INT ReadMapParameterFromFile(PRTMP_ADAPTER pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *pBuffer); - -void FireExtraProbeReq(PRTMP_ADAPTER pAd, UCHAR OpMode, UCHAR ScanType, - struct wifi_dev *wdev, UCHAR *desSsid, UCHAR desSsidLen); - -#ifdef MAP_BL_SUPPORT -/* BS2.0 Blacklisting Support */ -typedef struct _BS_BLACKLIST_ENTRY { - struct _BS_BLACKLIST_ENTRY *pNext; - UCHAR addr[MAC_ADDR_LEN]; -} BS_BLACKLIST_ENTRY, *PBS_BLACKLIST_ENTRY; - -VOID map_blacklist_add(IN PLIST_HEADER pBlackList, IN PUCHAR pMacAddr); - -VOID map_blacklist_del(IN PLIST_HEADER pBlackList, IN PUCHAR pMacAddr); - -VOID map_blacklist_show(IN PRTMP_ADAPTER pAd, IN UCHAR apidx); - -BOOLEAN map_is_entry_bl(PRTMP_ADAPTER pAd, UCHAR *pAddr, UCHAR apidx); -#endif /* MAP_BL_SUPPORT */ - -#ifdef A4_CONN -BOOLEAN map_a4_peer_enable(IN PRTMP_ADAPTER adapter, - IN struct _MAC_TABLE_ENTRY *entry, IN BOOLEAN is_ap); - -BOOLEAN map_a4_peer_disable(IN PRTMP_ADAPTER adapter, - IN struct _MAC_TABLE_ENTRY *entry, - IN BOOLEAN is_ap); - -BOOLEAN map_a4_init(IN PRTMP_ADAPTER adapter, IN UCHAR if_index, - IN BOOLEAN is_ap); - -BOOLEAN map_a4_deinit(IN PRTMP_ADAPTER adapter, IN UCHAR if_index, - IN BOOLEAN is_ap); -#endif /*A4_CONN*/ -BOOLEAN MapNotRequestedChannel(struct wifi_dev *wdev, unsigned char channel); -int map_make_vend_ie(IN PRTMP_ADAPTER pAd, IN UCHAR ApIdx); -#ifdef MAP_TS_TRAFFIC_SUPPORT -BOOLEAN map_ts_tx_process(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt, - struct _MAC_TABLE_ENTRY *peer_entry); -BOOLEAN map_ts_rx_process(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt, - struct _MAC_TABLE_ENTRY *peer_entry); -#endif -#ifdef MAP_R2 -UINT32 is_vid_configed(UINT16 vid, UINT32 vids[]); -#endif -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mat.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mat.h deleted file mode 100644 index 40e0013ce2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mat.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mat.h - - Abstract: - Support AP-Client function. - - Revision History: - Who When What - -------------- ---------- ---------------------------------------------- - Shiang 02-26-2007 created -*/ - -#ifndef _MAT_H_ -#define _MAT_H_ - -/*#if defined(LINUX) || defined (VXWORKS) */ - -/*#else */ -/*Currently support upper layer protocols */ -#ifndef ETH_P_IP -#define ETH_P_IP 0x0800 /* Internet Protocol packet */ -#endif -#ifndef ETH_P_ARP -#define ETH_P_ARP 0x0806 /* Address Resolution packet */ -#endif -#ifndef ETH_P_PPP_DISC -#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */ -#endif -#ifndef ETH_P_PPP_SES -#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */ -#endif -#ifndef ETH_P_VLAN -#define ETH_P_VLAN 0x8100 /* VLAN packet */ -#endif - -/* ARP protocol HARDWARE identifiers. */ -#ifndef ARPHRD_ETHER -#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */ -#endif - -/* ARP protocol opcodes. */ -#ifndef ARPOP_REQUEST -#define ARPOP_REQUEST 1 /* ARP request */ -#endif -#ifndef ARPOP_REPLY -#define ARPOP_REPLY 2 /* ARP reply */ -#endif - -typedef struct _NET_PRO_ARP_HDR { - unsigned short ar_hrd; /* format of hardware address */ - unsigned short ar_pro; /* format of protocol address */ - unsigned char ar_hln; /* length of hardware address */ - unsigned char ar_pln; /* length of protocol address */ - unsigned short ar_op; /* ARP opcode (command) */ -} NET_PRO_ARP_HDR; - -typedef struct _NET_PRO_IP_HDR { -#ifndef RT_BIG_ENDIAN - UCHAR ihl : 4; - UCHAR version : 4; -#else - UCHAR version : 4; - UCHAR ihl : 4; -#endif - UCHAR tos; - UINT16 tot_len; - UINT16 id; - UINT16 frag_off; - UCHAR ttl; - UCHAR protocol; - UINT16 check; - UINT16 saddr; - UINT32 daddr; -} NET_PRO_IP_HDR; -/*#endif //endif of __LINUX__ */ - -/* #ifndef MAT_SUPPORT */ -/* #error "You should define MAT_SUPPORT if you want to compile MAT related functions!" */ -/* #endif */ - -/* MAT relate definition */ -#define MAT_MAX_HASH_ENTRY_SUPPORT 64 -#define MAT_TB_ENTRY_AGEOUT_TIME \ - (5 * 60 * \ - OS_HZ) /* 30000, 5min. MAT convert table entry age-out time interval. now set it as 5min. */ - -/* 802.3 Ethernet related definition */ -#define MAT_ETHER_HDR_LEN 14 /* dstMac(6) + srcMac(6) + protoType(2) */ -#define MAT_VLAN_ETH_HDR_LEN \ - (MAT_ETHER_HDR_LEN + \ - 4) /* 4 for h_vlan_TCI and h_vlan_encapsulated_proto */ - -#define MAT_MAC_ADDR_HASH(Addr) \ - (Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5]) -#define MAT_MAC_ADDR_HASH_INDEX(Addr) \ - (MAT_MAC_ADDR_HASH(Addr) % MAT_MAX_HASH_ENTRY_SUPPORT) - -#define isMcastEtherAddr(addr) (addr[0] & 0x1) -#define isBcastEtherAddr(addr) \ - ((addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff) -#define isZeroEtherAddr(addr) \ - (!(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5])) - -#define IS_GROUP_MAC(Addr) ((Addr[0]) & 0x01) -#define IS_UCAST_MAC(addr) \ - (!(isMcastEtherAddr(addr) || \ - isZeroEtherAddr( \ - addr))) /* isUcastMac = !(00:00:00:00:00:00 || mcastMac); */ -#define IS_EQUAL_MAC(a, b) \ - (((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3]) | \ - (a[4] ^ b[4]) | (a[5] ^ b[5])) == 0) - -#define IS_VLAN_PACKET(pkt) ((((pkt)[12] << 8) | (pkt)[13]) == 0x8100) - -/* IPv4 related definition */ -#define IPMAC_TB_HASH_ENTRY_NUM \ - (MAT_MAX_HASH_ENTRY_SUPPORT + 1) /* One entry for broadcast address */ -#define IPMAC_TB_HASH_INDEX_OF_BCAST \ - MAT_MAX_HASH_ENTRY_SUPPORT /* cause hash index start from 0. */ - -#define MAT_IP_ADDR_HASH(Addr) \ - (((Addr >> 24) & 0xff) ^ ((Addr >> 16) & 0xff) ^ \ - ((Addr >> 8) & 0xff) ^ (Addr & 0xff)) -#define MAT_IP_ADDR_HASH_INDEX(Addr) \ - (MAT_IP_ADDR_HASH(Addr) % MAT_MAX_HASH_ENTRY_SUPPORT) - -#define IS_GOOD_IP(IP) (IP != 0) -#define IS_MULTICAST_IP(IP) (((UINT32)(IP)&0xf0000000) == 0xe0000000) - -/* IPv6 related definition */ -#define IPV6MAC_TB_HASH_ENTRY_NUM \ - (MAT_MAX_HASH_ENTRY_SUPPORT + 1) /* One entry for broadcast address */ -#define IPV6MAC_TB_HASH_INDEX_OF_BCAST \ - MAT_MAX_HASH_ENTRY_SUPPORT /* cause hash index start from 0. */ - -/*We just use byte 10,13,14,15 to calculate the IPv6 hash, because the byte 11,12 usually are 0xff, 0xfe for link-local address. */ -#define MAT_IPV6_ADDR_HASH(Addr) \ - ((Addr[10] & 0xff) ^ (Addr[13] & 0xff) ^ (Addr[14] & 0xff) ^ \ - (Addr[15] & 0xff)) -#define MAT_IPV6_ADDR_HASH_INDEX(Addr) \ - (MAT_IPV6_ADDR_HASH(Addr) % MAT_MAX_HASH_ENTRY_SUPPORT) - -#define IS_UNSPECIFIED_IPV6_ADDR(_addr) \ - (!((_addr).ipv6_addr32[0] | (_addr).ipv6_addr32[1] | \ - (_addr).ipv6_addr32[2] | (_addr).ipv6_addr32[3])) - -#define IS_LOOPBACK_IPV6_ADDR(_addr) \ - (NdisEqualMemory((UCHAR *)(&((_addr).ipv6_addr[0])), \ - &IPV6_LOOPBACKADDR[0], IPV6_ADDR_LEN)) -#define IS_MULTICAST_IPV6_ADDR(_addr) (((_addr).ipv6_addr[0] & 0xff) == 0xff) - -/* The MAT_TABLE used for MacAddress <-> UpperLayer Address Translation. */ -typedef struct _MAT_TABLE_ { - VOID *IPMacTable; /* IPv4 Address, Used for IP, ARP protocol */ - VOID *IPv6MacTable; /* IPv6 Address, Used for IPv6 related protocols */ - VOID *SesMacTable; /* PPPoE Session */ - VOID *UidMacTable; /* PPPoE Discovery */ -} MAT_TABLE, *PMAT_TABLE; - -typedef enum _MAT_ENGINE_STATUS_ { - MAT_ENGINE_STAT_UNKNOWN = 0, - MAT_ENGINE_STAT_INITED = 1, - MAT_ENGINE_STAT_EXITED = 2, -} MAT_ENGINE_STATUS; - -typedef struct _MAT_STRUCT_ { - MAT_ENGINE_STATUS status; - NDIS_SPIN_LOCK MATDBLock; - MAT_TABLE MatTableSet; -#ifdef KMALLOC_BATCH - UCHAR *pMATNodeEntryPoll; -#endif -#ifdef MAC_REPEATER_SUPPORT - BOOLEAN bMACRepeaterEn; -#endif /* MAC_REPEATER_SUPPORT */ - UINT32 nodeCount; /* the number of nodes which connect to Internet via us. */ - VOID *pPriv; -} MAT_STRUCT; - -typedef struct _MATProtoOps { - NDIS_STATUS (*init)(MAT_STRUCT *pMatCfg); - PUCHAR(*tx) - (MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, - PUCHAR pMacAddr); - PUCHAR(*rx) - (MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, - PUCHAR pMacAddr); - NDIS_STATUS (*exit)(MAT_STRUCT *pMatCfg); -} MATProtoOps, *PMATProtoOps; - -typedef struct _MATProtoTable { - USHORT protocol; - MATProtoOps *pHandle; -} MATProtoTable, *PMATProtoTable; - -VOID dumpPkt(PUCHAR pHeader, int len); - -/*#define KMALLOC_BATCH */ - -PUCHAR MATDBEntryAlloc(IN MAT_STRUCT *pMatStruct, IN UINT32 size); - -NDIS_STATUS MATDBEntryFree(IN MAT_STRUCT *pMatStruct, IN PUCHAR NodeEntry); - -#endif /* _MAT_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mbo.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mbo.h deleted file mode 100644 index 7af3a58e1c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mbo.h +++ /dev/null @@ -1,281 +0,0 @@ -#ifndef __MBO_H -#define __MBO_H - -#if defined(MBO_SUPPORT) || defined(OCE_SUPPORT) -#include "rtmp_type.h" -#include "rt_config.h" - -#ifndef OCE_SUPPORT -#define IS_OCE_ENABLE(_wdev) (FALSE) -#endif /* OCE_SUPPORT */ - -#define MBO_NPC_MAX_LEN 50 /* Non Preferred Channel List Max Len */ - -#define IE_MBO_ELEMENT_ID 221 /* 0xDD */ -#define MBO_ATTR_MAX_LEN \ - 252 /* spec 0.0.23 - IE LEN is 256 = OUI 4 + ATTR 252 */ -#define MBO_NEIGHBOR_REPORT_MAX_LEN \ - 2304 /* 11v spec define BTM candidate list max len = 2304 */ -#define MBO_RRM_SUBID_BSS_TRANSITION_CANDIDATE_PREFERENCE 3 - -#define MBO_OUI_NON_PREFERRED_CHANNEL_REPORT 0x2 -#define MBO_OUI_CELLULAR_DATA_CAPABILITY 0x3 - -/* MBO Country IE Country String field definition */ -#define MBO_AP_USE_GLOBAL_OPERATING_CLASS 0x04 -#define MBO_AP_USE_LOCAL_OPERATING_CLASS 0x20 - -/* MBO Attribute Id List */ -#define MBO_ATTR_AP_CAP_INDCATION 1 -#define MBO_ATTR_STA_NOT_PREFER_CH_REP 2 -#define MBO_ATTR_STA_CDC 3 /* Cellular Data Capability */ -#define MBO_ATTR_AP_ASSOC_DISALLOW 4 -#define MBO_ATTR_AP_CDCP 5 /* Cellular Data Connection Preference */ -#define MBO_ATTR_AP_TRANS_REASON 6 -#define MBO_ATTR_STA_TRANS_REJ_REASON 7 -#define MBO_ATTR_AP_ASSOC_RETRY_DELAY 8 -#define MBO_WDEV_ATTR_MAX_NUM 8 /* Should be updated according to ID list */ -#define MBO_ATTR_STA_NOT_PREFER_CH_REP_2ND \ - 99 /* enable sta to insert 2nd NPC attr in assoc, need to mark attr id valid check for test */ - -/* MBO_ATTR_AP_CAP_INDCATION field value */ -#define MBO_AP_CAP_NOT_SUPPORT 0x0 -#define MBO_AP_CAP_CELLULAR_AWARE 0x40 /* indicates supporting MBO */ - -/* MBO_ATTR_AP_ASSOC_DISALLOW Reason field value */ -#define MBO_AP_DISALLOW_REASON_RESERVED \ - 0x0 /* allow assoc , no disallow attr in MBO IE */ -#define MBO_AP_DISALLOW_REASON_UNSPECIFIED 0x1 -#define MBO_AP_DISALLOW_MAX_STA_NUM_REACHED 0x2 -#define MBO_AP_DISALLOW_AIR_OVERLOADED 0x3 -#define MBO_AP_DISALLOW_AUTH_SERVER_OVERLOADED 0x4 -#define MBO_AP_DISALLOW_RSSI_TOO_LOW 0x5 - -/* MBO_ATTR_AP_CDCP field value */ -#define MBO_AP_CDCP_FORBID_STA_USE_CDC 0x0 -#define MBO_AP_CDCP_PREFER_STA_NOT_USE_CDC 0x1 -#define MBO_AP_CDCP_PREFER_STA_USE_CDC \ - 0xFF /* 255 - prefer cellular data connection */ - -/* MBO_ATTR_AP_TRANS_REASON field value */ -#define MBO_AP_TRANS_REASON_UNSPECIFIED 0x0 -#define MBO_AP_TRANS_REASON_TX_PER_TOO_HIGH 0x1 /* excessive frame loss rate */ -#define MBO_AP_TRANS_REASON_TRAFFIC_DELAY 0x2 -#define MBO_AP_TRANS_REASON_INSUFFICIENT_BW 0x3 -#define MBO_AP_TRANS_REASON_LOAD_BALACING 0x4 -#define MBO_AP_TRANS_REASON_RSSI_LOW 0x5 -#define MBO_AP_TRANS_REASON_TOO_MANY_RETRY \ - 0x6 /* Received excessive number of retransmissions */ -#define MBO_AP_TRANS_REASON_HIGH_INTRFERENCE 0x7 -#define MBO_AP_TRANS_REASON_GRAY_ZONE 0x8 -#define MBO_AP_TRANS_REASON_TO_PREMIUM_AP 0x9 - -#define MAX_NOT_PREFER_CH_NUM 16 -#define MAX_NOT_PREFER_CH_REG_NUM 2 - -/* A default pref value of the auto-populated NR entries */ -#define MBO_AP_DEFAULT_CAND_PREF 255 - -typedef enum { - MBO_FRAME_TYPE_BEACON, - MBO_FRAME_TYPE_PROBE_REQ, - MBO_FRAME_TYPE_PROBE_RSP, - MBO_FRAME_TYPE_ASSOC_REQ, - MBO_FRAME_TYPE_ASSOC_RSP, - MBO_FRAME_TYPE_BTM_REQ, - MBO_FRAME_TYPE_WNM_REQ, -} MBO_FRAME_TYPE, - *P_MBO_FRAME_TYPE; - -typedef enum { - MBO_SUCCESS = 0, - MBO_INVALID_ARG, - MBO_RESOURCE_ALLOC_FAIL, - MBO_NOT_INITIALIZED, - MBO_UNEXP, -} MBO_ERR_CODE; - -typedef enum { - MBO_MSG_NEIGHBOR_REPORT = 0, - MBO_MSG_STA_PREF_UPDATE, - MBO_MSG_CDC_UPDATE, - MBO_MSG_STA_STEERING, - MBO_MSG_DISASSOC_STA, - MBO_MSG_AP_TERMINATION, - MBO_MSG_BSSID_UPDATE, - MBO_MSG_REMOVE_STA, - /* MBO_MSG_STA_SEC_INFO_UPDATE, */ -} MBO_MSG_TYPE; - -typedef enum { - PARAM_MBO_AP_ASSOC_DISALLOW, - PARAM_MBO_AP_CAP, - PARAM_MBO_AP_CDCP, - PARAM_MBO_AP_BSS_TERM, -} MBO_PARAM; - -#define PER_EVENT_LIST_MAX_NUM 5 - -#ifndef WAPP_SUPPORT - -typedef struct GNU_PACKED _TBTT_INFO_SET { - UINT8 NrAPTbttOffset; - UINT32 ShortBssid; -} TBTT_INFO_SET, *P_TBTT_INFO_SET; - -typedef struct GNU_PACKED _wapp_nr_info { - u8 Bssid[MAC_ADDR_LEN]; - u32 BssidInfo; - u8 RegulatoryClass; - u8 ChNum; - u8 PhyType; - u8 CandidatePrefSubID; - u8 CandidatePrefSubLen; - u8 CandidatePref; - /* extra sec info */ - u32 akm; - u32 cipher; - UINT8 TbttInfoSetNum; - TBTT_INFO_SET TbttInfoSet; - u8 Rssi; -} wapp_nr_info; - -typedef struct GNU_PACKED daemon_neighbor_report_list { - UINT8 Newlist; - UINT8 TotalNum; - UINT8 CurrNum; - UINT8 reserved; - wapp_nr_info EvtNRInfo[PER_EVENT_LIST_MAX_NUM]; -} DAEMON_EVENT_NR_LIST, *P_DAEMON_EVENT_NR_LIST; - -typedef struct GNU_PACKED neighbor_report_msg { - DAEMON_EVENT_NR_LIST evt_nr_list; -} DAEMON_NR_MSG, *P_DAEMON_NR_MSG; - -#endif -typedef struct GNU_PACKED non_pref_ch { - UINT8 ch; - UINT8 pref; - UINT8 reason_code; - -} STA_CH_PREF, *P_STA_CH_PREF; - -typedef struct GNU_PACKED _MBO_STA_CH_PREF_CDC_INFO { - UINT8 mac_addr[MAC_ADDR_LEN]; - UINT8 bssid[MAC_ADDR_LEN]; - UINT8 cdc; /* cellular data capability */ - UINT8 npc_num; - UINT32 akm; - UINT32 cipher; - struct non_pref_ch npc[MBO_NPC_MAX_LEN]; -} MBO_STA_CH_PREF_CDC_INFO, *P_MBO_STA_CH_PREF_CDC_INFO; - -typedef struct GNU_PACKED _MBO_EVENT_STA_DISASSOC { - UINT8 mac_addr[MAC_ADDR_LEN]; -} MBO_EVENT_STA_DISASSOC, *P_MBO_EVENT_STA_DISASSOC; - -typedef struct GNU_PACKED _MBO_EVENT_STA_AKM_CIPHER { - UINT8 mac_addr[MAC_ADDR_LEN]; - UINT32 akm; - UINT32 cipher; -} MBO_EVENT_STA_AKM_CIPHER, *P_MBO_EVENT_STA_AKM_CIPHER; - -typedef struct GNU_PACKED _MBO_EVENT_BSS_TERM { - UINT32 TsfLowPart; - UINT32 TsfHighPart; -} MBO_EVENT_BSS_TERM, *P_MBO_EVENT_BSS_TERM; - -typedef union GNU_PACKED _msg_body { - MBO_STA_CH_PREF_CDC_INFO MboEvtStaInfo; - MBO_EVENT_STA_DISASSOC MboEvtStaDisassoc; - MBO_EVENT_BSS_TERM MboEvtBssTermTsf; - /* MBO_EVENT_STA_AKM_CIPHER MboEvtStaSecInfo; */ -} MBO_MSG_BODY; - -typedef struct mbo_msg { - UINT32 ifindex; - UINT8 MboMsgLen; - UINT8 MboMsgType; - MBO_MSG_BODY MboMsgBody; -} MBO_MSG, *P_MBO_MSG; - -typedef struct _MBO_CTRL { - BOOLEAN bMboEnable; - /* BOOLEAN bHaveBTMSta;*/ /* TRUE if this wdev still have STAs undergoing BTM disassoc procedure */ - UINT8 MboCapIndication; - UINT8 AssocDisallowReason; - UINT8 CellularPreference; - UINT8 TransitionReason; - UINT16 ReAssocDelay; /* second */ -} MBO_CTRL, *P_MBO_CTRL; - -typedef struct _MBO_ATTR_STRUCT { - UCHAR AttrID; - UCHAR AttrLen; - /* CHAR AttrBody[1]; */ - CHAR AttrBody[MBO_ATTR_MAX_LEN]; -} MBO_ATTR_STRUCT, *P_MBO_ATTR_STRUCT; - -#define IS_MBO_ENABLE(_wdev) ((_wdev)->MboCtrl.bMboEnable == TRUE) - -#define VALID_MBO_ATTR_ID(_I) (_I <= MBO_WDEV_ATTR_MAX_NUM) - -#define MBO_AP_ALLOW_ASSOC(_wdev) \ - ((_wdev)->MboCtrl.AssocDisallowReason == \ - MBO_AP_DISALLOW_REASON_RESERVED) - -VOID MakeMboOceIE(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *pEntry, PUINT8 pFrameBuf, - PULONG pFrameLen, UINT8 FrameType); - -MBO_ERR_CODE ReadMboParameterFromFile(PRTMP_ADAPTER pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *pBuffer); - -MBO_ERR_CODE MboInit(PRTMP_ADAPTER pAd); - -RTMP_STRING *MboAttrValueToString(UINT8 AttrID, UINT8 AttrValue); - -RTMP_STRING *MboMsgTypeToString(MBO_MSG_TYPE MsgType); - -INT32 ShowMboStatProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT MboIndicateNeighborReportToDaemon(PRTMP_ADAPTER pAd, struct wifi_dev *pWdev, - BOOLEAN AppendMode, UINT8 ReportNum); - -INT SetMboNRIndicateProc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT MBO_MsgHandle(IN PRTMP_ADAPTER pAd, UINT32 Param, UINT32 Value); - -VOID MboBssTermCountDownStart(UINT8 validity_intvl); - -VOID MboParseStaNPCElement(PRTMP_ADAPTER pAd, struct wifi_dev *pWdev, - UCHAR *PktContent, UINT8 ElementLen, - P_MBO_STA_CH_PREF_CDC_INFO pMboStaCHInfo, - MBO_FRAME_TYPE MboFrameType); - -INT MboIndicateStaInfoToDaemon(PRTMP_ADAPTER pAd, - P_MBO_STA_CH_PREF_CDC_INFO pStaInfo, - MBO_MSG_TYPE MsgType); - -VOID MboParseStaMboIE(PRTMP_ADAPTER pAd, struct wifi_dev *pWdev, - struct _MAC_TABLE_ENTRY *pEntry, UCHAR *buf, UCHAR len, - MBO_FRAME_TYPE MboFrameType); - -INT MboIndicateStaDisassocToDaemon(PRTMP_ADAPTER pAd, - P_MBO_EVENT_STA_DISASSOC pStaDisassocInfo, - MBO_MSG_TYPE MsgType); - -VOID MboWaitAllStaGone(PRTMP_ADAPTER pAd, INT apidx); - -VOID MboIndicateStaBssidInfo(PRTMP_ADAPTER pAd, struct wifi_dev *pWdev, - UCHAR *mac_addr); - -VOID MboIndicateOneNRtoDaemonByBssEntry(PRTMP_ADAPTER pAd, - struct wifi_dev *pWdev, - BSS_ENTRY *pBssEntry); - -VOID MboBssTermStart(PRTMP_ADAPTER pAd, UINT8 countdown); - -VOID MboCheckBssTermination(PRTMP_ADAPTER pAd); -#endif /* MBO_SUPPORT */ -#endif /* __MBO_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/andes_core.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/andes_core.h deleted file mode 100644 index f01a81b5c3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/andes_core.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - andes_core.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __ANDES_CORE_H__ -#define __ANDES_CORE_H__ - -#include "mcu.h" - -#ifdef LINUX -#ifndef WORKQUEUE_BH -#include -#endif -#endif /* LINUX */ - -#ifdef MT_MAC -#include "mcu/andes_mt.h" -#endif -#include "mcu/mt_cmd.h" -#include "mcu/fwdl.h" - -#include "common/link_list.h" - -struct _RTMP_ADAPTER; -struct _RXFCE_INFO; -struct _BANK_RF_REG_PAIR; -struct _R_M_W_REG; -struct _RF_R_M_W_REG; - -enum { - MCU_INIT, - MCU_TX_HALT, - MCU_RX_HALT, -}; - -enum { - CMD_ACK, -}; - -enum cmd_msg_error_type { - error_tx_kickout_fail, - error_tx_timeout_fail, - error_rx_receive_fail, -}; - -struct MCU_CTRL { - UINT8 cmd_seq; - ULONG flags; /* Use long, becasue we want to do atomic bit operation */ -#ifdef LINUX -#ifndef WORKQUEUE_BH - RTMP_NET_TASK_STRUCT cmd_msg_task; -#else - struct tasklet_struct cmd_msg_task; -#endif -#endif /* LINUX */ - NDIS_SPIN_LOCK txq_lock; - DL_LIST txq; - NDIS_SPIN_LOCK rxq_lock; - DL_LIST rxq; - NDIS_SPIN_LOCK ackq_lock; - DL_LIST ackq; - NDIS_SPIN_LOCK kickq_lock; - DL_LIST kickq; - NDIS_SPIN_LOCK tx_doneq_lock; - DL_LIST tx_doneq; - NDIS_SPIN_LOCK rx_doneq_lock; - DL_LIST rx_doneq; - NDIS_SPIN_LOCK msg_lock; - ULONG tx_kickout_fail_count; - ULONG tx_timeout_fail_count; - ULONG rx_receive_fail_count; - ULONG alloc_cmd_msg; - ULONG free_cmd_msg; - BOOLEAN power_on; - BOOLEAN dpd_on; - UINT8 RxStream0, RxStream1; - struct fwdl_ctrl fwdl_ctrl; -#ifdef DBG_STARVATION - struct starv_dbg_block block; -#endif /*DBG_STARVATION*/ - struct _RTMP_ADAPTER *ad; -}; - -struct cmd_msg; -typedef VOID (*MSG_EVENT_HANDLER)(struct _RTMP_ADAPTER *ad, char *payload, - UINT16 payload_len); - -struct cmd_msg_cb { - struct cmd_msg *msg; -}; - -#define CMD_MSG_CB(pkt) ((struct cmd_msg_cb *)(GET_OS_PKT_CB(pkt))) -#define CMD_MSG_RETRANSMIT_TIMES 3 -#define CMD_MSG_TIMEOUT 3000 - -#define MT_CMD_TX_HOOK AndesSendCmdMsg - -enum BW_SETTING { - BW20 = 1, - BW40 = 2, - BW10 = 4, - BW80 = 8, -}; - -enum mcu_skb_state { - ILLEAGAL = 0, - MCU_CMD_START, - MCU_CMD_DONE, - MCU_RSP_START, - MCU_RSP_DONE, - MCU_RSP_CLEANUP, - UNLINK_START, -}; - -#define USB_END_PADDING 4 -#define SDIO_END_PADDING 4 - -struct mcu_skb_data { - enum mcu_skb_state state; -}; - -#ifdef LED_CONTROL_SUPPORT -#ifdef RT_BIG_ENDIAN -typedef union _LED_ENHANCE { - struct { - UINT32 tx_over_blink : 1; - UINT32 reverse_polarity : 1; -#if defined(MT7615) || defined(MT7622) - UINT32 band_select : 1; - UINT32 rsv : 3; -#else - UINT32 rsv : 4; -#endif - UINT32 tx_blink : 2; - UINT32 on_time : 8; - UINT32 off_time : 8; - UINT32 idx : 8; - } field; - UINT32 word; -} LED_ENHANCE; -#else -typedef union _LED_ENHANCE { - struct { - UINT32 idx : 8; - UINT32 off_time : 8; - UINT32 on_time : 8; - UINT32 tx_blink : 2; -#if defined(MT7615) || defined(MT7622) - UINT32 rsv : 3; - UINT32 band_select : 1; -#else - UINT32 rsv : 4; -#endif - UINT32 reverse_polarity : 1; - UINT32 tx_over_blink : 1; - } field; - UINT32 word; -} LED_ENHANCE; -#endif /* RT_BIG_ENDIAN */ -#endif /*LED_CONTROL_SUPPORT*/ - -VOID AndesCtrlInit(struct _RTMP_ADAPTER *pAd); -VOID AndesCtrlExit(struct _RTMP_ADAPTER *pAd); -INT32 AndesSendCmdMsg(struct _RTMP_ADAPTER *pAd, struct cmd_msg *msg); -BOOLEAN IsInbandCmdProcessing(struct _RTMP_ADAPTER *pAd); -VOID AndesCmdMsgBh(unsigned long param); -INT32 UsbRxCmdMsgSubmit(struct _RTMP_ADAPTER *pAd); -INT32 UsbRxCmdMsgsReceive(struct _RTMP_ADAPTER *pAd); -VOID AndesBhSchedule(struct _RTMP_ADAPTER *pAd); - -struct cmd_msg *AndesAllocCmdMsg(struct _RTMP_ADAPTER *pAd, - unsigned int length); - -VOID AndesInitCmdMsg(struct cmd_msg *msg, CMD_ATTRIBUTE attr); - -VOID AndesAppendCmdMsg(struct cmd_msg *msg, char *data, unsigned int len); -VOID AndesAppendHeadCmdMsg(struct cmd_msg *msg, char *data, unsigned int len); -VOID AndesFreeCmdMsg(struct cmd_msg *msg); -VOID AndesQueueTailCmdMsg(DL_LIST *list, struct cmd_msg *msg, - enum cmd_msg_state state); -VOID AndesIncErrorCount(struct MCU_CTRL *ctl, enum cmd_msg_error_type type); -VOID _AndesUnlinkCmdMsg(struct cmd_msg *msg, DL_LIST *list); -VOID AndesUnlinkCmdMsg(struct cmd_msg *msg, DL_LIST *list); -struct cmd_msg *AndesDequeueCmdMsg(struct MCU_CTRL *ctl, DL_LIST *list); -VOID AndesQueueHeadCmdMsg(DL_LIST *list, struct cmd_msg *msg, - enum cmd_msg_state state); -VOID AndesQueueHeadCmdMsg(DL_LIST *list, struct cmd_msg *msg, - enum cmd_msg_state state); -UINT32 AndesQueueLen(struct MCU_CTRL *ctl, DL_LIST *list); - -#ifdef RTMP_PCI_SUPPORT -VOID PciKickOutCmdMsgComplete(PNDIS_PACKET net_pkt); -#endif - -VOID AndesRxProcessCmdMsg(struct _RTMP_ADAPTER *pAd, struct cmd_msg *rx_msg); - -#endif /* __ANDES_CORE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/andes_mt.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/andes_mt.h deleted file mode 100644 index 6863da9268..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/andes_mt.h +++ /dev/null @@ -1,270 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - andes_mt.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __ANDES_MT_H__ -#define __ANDES_MT_H__ - -#include "mcu.h" -#include "mcu/mt_cmd.h" - -#ifdef LINUX -#ifndef WORKQUEUE_BH -#include -#endif -#endif /* LINUX */ - -#define GET_EVENT_FW_RXD_LENGTH(event_rxd) \ - (((EVENT_RXD *)(event_rxd))->fw_rxd_0.field.length) -#define GET_EVENT_FW_RXD_PKT_TYPE_ID(event_rxd) \ - (((EVENT_RXD *)(event_rxd))->fw_rxd_0.field.pkt_type_id) -#define GET_EVENT_FW_RXD_EID(event_rxd) \ - (((EVENT_RXD *)(event_rxd))->fw_rxd_1.field.eid) - -#define GET_EVENT_FW_RXD_SEQ_NUM(event_rxd) \ - (((EVENT_RXD *)(event_rxd))->fw_rxd_1.field.seq_num) - -#define GET_EVENT_FW_RXD_EXT_EID(event_rxd) \ - (((EVENT_RXD *)(event_rxd))->fw_rxd_2.field.ext_eid) - -#define IS_IGNORE_RSP_PAYLOAD_LEN_CHECK(m) \ - ((((struct cmd_msg *)(m))->attr.ctrl.expect_size == \ - MT_IGNORE_PAYLOAD_LEN_CHECK) ? \ - TRUE : \ - FALSE) -#define GET_EVENT_HDR_ADDR(net_pkt) \ - (GET_OS_PKT_DATAPTR(net_pkt) + sizeof(EVENT_RXD)) - -#define GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd) \ - (((EVENT_RXD *)(event_rxd))->fw_rxd_0.field.length - sizeof(EVENT_RXD)) - -struct _RTMP_ADAPTER; -struct cmd_msg; - -#define BFBACKOFF_TABLE_SIZE 10 -#define BFBACKOFF_BBPCR_SIZE 6 -#define RATE_POWER_TMAC_SIZE 8 -#define CR_COLUMN_SIZE 4 - -VOID AndesMTFillCmdHeaderWithTXD(struct cmd_msg *msg, PNDIS_PACKET net_pkt); -VOID AndesMTRxEventHandler(struct _RTMP_ADAPTER *pAd, UCHAR *data); -INT32 AndesMTLoadFw(struct _RTMP_ADAPTER *pAd); -INT32 AndesMTEraseFw(struct _RTMP_ADAPTER *pAd); - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -INT32 AndesMTPciKickOutCmdMsg(struct _RTMP_ADAPTER *pAd, struct cmd_msg *msg); -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -INT32 AndesMTPciKickOutCmdMsgFwDlRing(struct _RTMP_ADAPTER *pAd, - struct cmd_msg *msg); -INT32 AndesRestartCheck(struct _RTMP_ADAPTER *pAd); -#endif /* defined(MT7615) || defined(MT7622) */ -VOID AndesMTPciFwInit(struct _RTMP_ADAPTER *pAd); -VOID AndesMTPciFwExit(struct _RTMP_ADAPTER *pAd); -#endif /* defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) */ - -#ifdef TXBF_SUPPORT -VOID ExtEventBfStatusRead(struct _RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length); -#endif - -#ifdef LED_CONTROL_SUPPORT -#if defined(MT7615) || defined(MT7622) -INT AndesLedEnhanceOP(struct _RTMP_ADAPTER *pAd, UCHAR led_idx, - UCHAR tx_over_blink, UCHAR reverse_polarity, UCHAR band, - UCHAR blink_mode, UCHAR off_time, UCHAR on_time, - UCHAR led_control_mode); -#else -INT AndesLedEnhanceOP(struct _RTMP_ADAPTER *pAd, UCHAR led_idx, - UCHAR tx_over_blink, UCHAR reverse_polarity, - UCHAR blink_mode, UCHAR off_time, UCHAR on_time, - UCHAR led_control_mode); -#endif -#endif - -INT32 AndesMTLoadRomPatch(struct _RTMP_ADAPTER *ad); -INT32 AndesMTEraseRomPatch(struct _RTMP_ADAPTER *ad); - -#ifdef WIFI_SPECTRUM_SUPPORT -NTSTATUS WifiSpectrumRawDataHandler(struct _RTMP_ADAPTER *pAd, - PCmdQElmt CMDQelmt); -VOID ExtEventWifiSpectrumRawDataHandler(struct _RTMP_ADAPTER *pAd, UINT8 *pData, - UINT32 Length); -#endif /* WIFI_SPECTRUM_SUPPORT */ - -#ifdef INTERNAL_CAPTURE_SUPPORT -NTSTATUS ICapRawDataHandler(struct _RTMP_ADAPTER *pAd, PCmdQElmt CMDQelmt); -VOID ExtEventICap96BitDataParser(struct _RTMP_ADAPTER *pAd); -VOID ExtEventICap96BitRawDataHandler(struct _RTMP_ADAPTER *pAd, UINT8 *pData, - UINT32 Length); -VOID ExtEventICapStatusHandler(struct _RTMP_ADAPTER *pAd, UINT8 *pData, - UINT32 Length); -#endif /* INTERNAL_CAPTURE_SUPPORT */ - -VOID EventTxPowerHandler(struct _RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length); -VOID EventTxPowerShowInfo(struct _RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length); -VOID EventTxPowerEPAInfo(struct _RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length); -VOID EventThermalStateShowInfo(struct _RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length); -VOID EventPowerTableShowInfo(struct _RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length); -VOID EventTxPowerCompTable(struct _RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length); -VOID EventThermalCompTableShowInfo(struct _RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length); -NTSTATUS EventTxvBbpPowerInfo(struct _RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length); - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) -NTSTATUS PreCalTxLPFStoreProcHandler(struct _RTMP_ADAPTER *pAd, - PCmdQElmt CMDQelmt); -NTSTATUS PreCalTxIQStoreProcHandler(struct _RTMP_ADAPTER *pAd, - PCmdQElmt CMDQelmt); -NTSTATUS PreCalTxDCStoreProcHandler(struct _RTMP_ADAPTER *pAd, - PCmdQElmt CMDQelmt); -NTSTATUS PreCalRxFIStoreProcHandler(struct _RTMP_ADAPTER *pAd, - PCmdQElmt CMDQelmt); -NTSTATUS PreCalRxFDStoreProcHandler(struct _RTMP_ADAPTER *pAd, - PCmdQElmt CMDQelmt); -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -#if defined(RED_SUPPORT) && (defined(MT7622) || defined(P18) || \ - defined(MT7663) || defined(MT7615)) -VOID ExtEventMpduTimeHandler(struct _RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length); -#endif -typedef struct _TX_RATE_POWER_TABLE_T { - UINT8 TxRateModulation; - UINT8 CRValue; - CHAR PowerDecimal; -} TX_RATE_POWER_TABLE_T, *P_TX_RATE_POWER_TABLE_T; - -typedef struct _TX_POWER_BOUND_TABLE_T { - UINT8 MaxMinType; - UINT8 CRValue; - CHAR PowerDecimal; -} TX_POWER_BOUND_TABLE_T, *P_TX_POWER_BOUND_TABLE_T; - -typedef enum _TX_POWER_SKU_TABLE { - CCK1M2M, - CCK5M11M, - OFDM6M9M, - OFDM12M18M, - OFDM24M36M, - OFDM48M, - OFDM54M, - HT20M0, - HT20M32, - HT20M1M2, - HT20M3M4, - HT20M5, - HT20M6, - HT20M7, - HT40M0, - HT40M32, - HT40M1M2, - HT40M3M4, - HT40M5, - HT40M6, - HT40M7, - VHT20M0, - VHT20M1M2, - VHT20M3M4, - VHT20M5M6, - VHT20M7, - VHT20M8, - VHT20M9, - VHT40M0, - VHT40M1M2, - VHT40M3M4, - VHT40M5M6, - VHT40M7, - VHT40M8, - VHT40M9, - VHT80M0, - VHT80M1M2, - VHT80M3M4, - VHT80M5M6, - VHT80M7, - VHT80M8, - VHT80M9, - VHT160M0, - VHT160M1M2, - VHT160M3M4, - VHT160M5M6, - VHT160M7, - VHT160M8, - VHT160M9, - TXPOWER_1SS_OFFSET, - TXPOWER_2SS_OFFSET, - TXPOWER_3SS_OFFSET, - TXPOWER_4SS_OFFSET -} TX_POWER_SKU_TABLE, - *P_TX_POWER_SKU_TABLE; - -typedef enum _ENUM_MAX_MIN_TYPE_T { - MAX_POWER_BAND0, - MIN_POWER_BAND0, - MAX_POWER_BAND1, - MIN_POWER_BAND1 -} ENUM_MAX_MIN_TYPE_T, - *P_ENUM_MAX_MIN_TYPE_T; - -typedef enum _ENUM_TX_RATE_MODULATION_T { - OFDM_48M, - OFDM_24M_36M, - OFDM_12M_18M, - OFDM_6M_9M, - HT20_MCS5, - HT20_MCS3_4, - HT20_MCS1_2, - HT20_MCS0, - HT40_MCS5, - HT40_MCS3_4, - HT40_MCS1_2, - HT40_MCS0, - HT40_MCS32, - CCK_5M11M, - OFDM_54M, - CCK_1M2M, - HT40_MCS7, - HT40_MCS6, - HT20_MCS7, - HT20_MCS6, - VHT20_MCS5_6, - VHT20_MCS3_4, - VHT20_MCS1_2, - VHT20_MCS0, - VHT20_MCS9, - VHT20_MCS8, - VHT20_MCS7, - VHT160, - VHT80, - VHT40 -} ENUM_TX_RATE_MODULATION_T, - *P_ENUM_TX_RATE_MODULATION_T; - -#endif /* __ANDES_MT_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/btcoex.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/btcoex.h deleted file mode 100644 index d75c076a45..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/btcoex.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mcu.h - - Abstract: - MCU related information - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __BTCOEX_H__ -#define __BTCOEX_H__ - -struct _RTMP_ADAPTER; -struct _MAC_TABLE_ENTRY; - -/* Woody add for BT COEX*/ -#define BIT0 (1 << 0) -#define BIT1 (1 << 1) -#define BIT2 (1 << 2) -#define BIT3 (1 << 3) -#define BIT4 (1 << 4) -#define BIT5 (1 << 5) -#define BIT6 (1 << 6) -#define BIT7 (1 << 7) -#define BIT8 (1 << 8) -#define BIT9 (1 << 9) -#define BIT10 (1 << 10) -#define BIT11 (1 << 11) -#define BIT12 (1 << 12) -#define BIT13 (1 << 13) -#define BIT14 (1 << 14) -#define BIT15 (1 << 15) -#define BIT16 (1 << 16) -#define BIT17 (1 << 17) -#define BIT18 (1 << 18) -#define BIT19 (1 << 19) -#define BIT20 (1 << 20) -#define BIT21 (1 << 21) -#define BIT22 (1 << 22) -#define BIT23 (1 << 23) -#define BIT24 (1 << 24) -#define BIT25 (1 << 25) -#define BIT26 (1 << 26) -#define BIT27 (1 << 27) -#define BIT28 (1 << 28) -#define BIT29 (1 << 29) -#define BIT30 (1 << 30) -#define BIT31 (1 << 31) - -#define IS_MT76XXBTCOMBO(_pAd) \ - (IS_MT7650(_pAd) || IS_MT7630(_pAd) || IS_MT7662(_pAd)) -/* Antenna mode (ANT_MODE_XXX) */ -#define ANT_MODE_DUAL (0x01) /* Chip is in dual antenna mode */ -#define ANT_MODE_SINGLE (0x02) /* Chip is in single antenna mode */ - -#define TypeTFSwitch 0x1 -#define TypeProtectionFrame 0x2 -#define TypeAFH 0x3 -#define TypeWiFiStatus 0x4 -#define TypeHostLoopBackTFSwitch 0xFFF1 -#define TypeCoexCCUForceMode 0xFFF2 - -#define COEX_MODE_RESET 0 -#define COEX_MODE_TDD 1 -#define COEX_MODE_HYBRID 2 -#define COEX_MODE_FDD 3 - -#define COEX_OPMODE_STA 1 -#define COEX_OPMODE_AP 2 -#define COEX_OPMODE_GC 3 -#define COEX_OPMODE_GO 4 -#define COEX_OPMODE_BT 5 -#define COEX_OPMODE_AD_HOC 6 - -#define COEX_BARXSIZE_A2DP 8 -#define COEX_BARXSIZE_SCO_ESCO 2 -#define COEX_BARXSIZE_OPP 32 - -#ifdef COEX_SUPPORT -#define MT76xx_COEX_MODE_RESET 0 -#define MT76xx_COEX_MODE_TDD 1 -#define MT76xx_COEX_MODE_FDD 2 - -#define MT76xx_WLAN_NO_BSSID 0x0 -#define MT76xx_WLAN_Device_OFF 0x1 -#define MT76xx_WLAN_Device_ON 0x2 -#define MT76xx_WLAN_SCANREQEST_2G 0x3 -#define MT76xx_WLAN_SCANDONE_2G 0x4 -#define MT76xx_WLAN_SCANREQEST_5G 0x5 -#define MT76xx_WLAN_SCANDONE_5G 0x6 -#define MT76xx_WLAN_LINK_START 0x7 -#define MT76xx_WLAN_LINK_DONE 0x8 - -VOID MT76xxMLMEHook(IN struct _RTMP_ADAPTER *pAd, IN UCHAR WlanStatus, - IN ULONG BssHashID); - -INT Set_MT76xxCoexBeaconLimit_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MT76xxCoexBaWinsize_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MT76xxCoexMode_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MT76xxCoexSupportMode_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MT76xxCoex_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CoexSkipFDDFix20MH_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_MT76xxCoex_Protection_Mode_Proc(struct _RTMP_ADAPTER *pAd, - RTMP_STRING *arg); -INT Set_MT76xxCoex_Protection_Rate_Proc(struct _RTMP_ADAPTER *pAd, - RTMP_STRING *arg); -#endif /* COEX_SUPPORT */ - -#define fBTSTATUS_BT_DISABLE 0x00000001 -#define fBTSTATUS_BT_INACTIVE 0x00000002 -#define fBTSTATUS_BT_SCANONLY 0x00000004 -#define fBTSTATUS_BT_HOLD 0x00000008 -#define fBTSTATUS_BT_ACTIVE 0x00000010 -#define NULLFRAMESPACE 10 -#define COEXNOZEROSHIFT 1 -#define CTSTOSELF 1 -#define CFEND 2 -#define POWERSAVE0 3 -#define POWERSAVE1 4 -#define PROTECTIONFRAMEREADY 1 -#define PROTECTIONFRAMECANCEL 2 - -#define COEX_WIFI_LINK_UP 1 -#define COEX_WIFI_LINK_DOWN 2 -#define BSSID_WCID 1 - -typedef struct PROTECTION_FRAME_STRUCT { - BOOLEAN Occupied; - ULONG Triggernumber; - ULONG Valid; - ULONG NodeType; - ULONG BssHashID; - ULONG FrameType; -} PROTECTION_FRAME_STRUCT, *PPROTECTION_FRAME_STRUCT; - -typedef struct _COEX_RX_MANUAL_AGC_GAIN { - BOOLEAN bEnable; - BOOLEAN bStopAGC; - CHAR LMthreshold; - CHAR MHthreshold; -} COEX_RX_MANUAL_AGC_GAIN, *PCOEX_RX_MANUAL_AGC_GAIN; - -typedef struct _COEX_MODE_STRUCTURE { - BOOLEAN bForce; - BOOLEAN FDDRequest; - BOOLEAN TDDRequest; - ULONG TDD_Power; - ULONG FDD_Power; - ULONG DefaultMode; - ULONG CurrentMode; - ULONG UpdateMode; - CHAR CoexTDDRSSITreshold; - CHAR CoexFDDRSSITreshold; - UCHAR RxBAWinLimit; /* 0 = not set, use original value */ - UCHAR TxBAWinLimit; /* 0 = not set, use origianl value */ -} COEX_MODE_STRUCTURE, *PCOEX_MODE_STRUCTURE; - -typedef struct _COEX_PROTECTION_FRAME_INFO { - ULONG CoexOperation; - ULONG Triggernumber; - ULONG Valid; - ULONG NodeType; - ULONG BssHashID; - ULONG FrameType; -} COEX_PROTECTION_FRAME_INFO, *PCOEX_PROTECTION_FRAME_INFO; - -typedef struct _COEX_AFH { - ULONG CoexOperation; - ULONG LinkStatus; - ULONG BW; - ULONG Channel; - ULONG BssHashID; -} COEX_AFH, *PCOEX_AFH; - -typedef struct _COEX_TF_SWITCH { - ULONG CoexOperation; - ULONG CoexMode; - -} COEX_TF_SWITCH, *PCOEX_TF_SWITCH; - -typedef struct _COEX_WLAN_STATUS { - ULONG CoexOperation; - ULONG WLANStatus; - ULONG PrivilegeTime; - ULONG BssHashID; - -} COEX_WLAN_STATUS, *PCOEX_WLAN_STATUS; - -#define PKT_CMD_TYPE_COEX_OP (17) - -#define BTCOEX_BB_BITWISE_WRITE(_BbReg, _BitLocation, _BitValue) \ - (_BbReg = (((_BbReg) & ~(_BitLocation)) | (_BitValue))) - -#define BTCOEX_BB_BITMASK_READ(_BbReg, _BitLocation) ((_BbReg) & (_BitLocation)) - -#define MAC_BITWISE_WRITE(_MacReg, _BitLocation, _BitValue) \ - (_MacReg = (((_MacReg) & ~(_BitLocation)) | (_BitValue))) - -#define MAC_BITMASK_READ(_MacReg, _BitLocation) ((_MacReg) & (_BitLocation)) -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mcu.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mcu.h deleted file mode 100644 index c878077cdf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mcu.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mcu.h - - Abstract: - MCU related information - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __MCU_H__ -#define __MCU_H__ - -#define CONFG_BASE_ADDR 0x2000 -#define CONFG_COM1_REG3 (CONFG_BASE_ADDR + 0x0000020C) -#define CONFG_COM1_REG3_FWOPMODE BIT(4) -#define CONFG_COM2_REG3 (CONFG_BASE_ADDR + 0x0000060C) -#define CONFG_COM2_REG3_FWOPMODE BIT(4) - -#define ENABLE_RXD_LOG 0 - -enum MCU_TYPE { - SWMCU = (1 << 0), - M8051 = (1 << 1), - ANDES = (1 << 2), - CR4 = (1 << 3), -}; - -/* - * Power opration - */ -enum PWR_OP { - RADIO_OFF = 0x30, - RADIO_ON, - RADIO_OFF_AUTO_WAKEUP, - RADIO_OFF_ADVANCE, - RADIO_ON_ADVANCE, -}; - -struct _RTMP_ADAPTER; - -VOID ChipOpsMCUHook(struct _RTMP_ADAPTER *pAd, enum MCU_TYPE MCUType); -VOID MCUCtrlInit(struct _RTMP_ADAPTER *pAd); -VOID MCUCtrlExit(struct _RTMP_ADAPTER *pAd); - -INT32 MCUSysPrepare(struct _RTMP_ADAPTER *pAd); - -INT32 MCUSysInit(struct _RTMP_ADAPTER *pAd); -INT32 MCUSysExit(struct _RTMP_ADAPTER *pAd); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_cr4_firmware.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_cr4_firmware.h deleted file mode 100644 index b67e34e9ee..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_cr4_firmware.h +++ /dev/null @@ -1,10226 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7615_CR4_FirmwareImage[] = { - 0x48, 0x93, 0x57, 0xe2, 0x7d, 0xdf, 0xd2, 0x3b, 0xe7, 0x23, 0x29, 0x62, - 0xa5, 0xa3, 0xf0, 0xc4, 0xfb, 0xcb, 0x36, 0x38, 0x77, 0xcf, 0x77, 0x22, - 0xcb, 0x9b, 0x6d, 0x35, 0x87, 0xd7, 0xf1, 0x74, 0xc8, 0x79, 0xa9, 0xf0, - 0x37, 0xc4, 0x1e, 0x67, 0xe2, 0x55, 0xdb, 0xe4, 0x82, 0xae, 0x34, 0x17, - 0x7a, 0x0d, 0x4d, 0x19, 0x1d, 0xf9, 0xc7, 0xff, 0x14, 0xe4, 0xd7, 0xea, - 0x88, 0xa3, 0xb5, 0x46, 0x14, 0x4b, 0x79, 0x90, 0xd9, 0x4d, 0x41, 0x89, - 0x32, 0xe7, 0x4e, 0x89, 0xce, 0x74, 0x1e, 0xbc, 0x5c, 0x8c, 0xe4, 0xa5, - 0x29, 0x47, 0x4b, 0xd0, 0x99, 0x36, 0x72, 0x33, 0xf8, 0x96, 0xe6, 0x7a, - 0x23, 0x41, 0x35, 0x35, 0x61, 0xce, 0xfe, 0x61, 0xd5, 0x90, 0x76, 0xcc, - 0xc2, 0xb9, 0x8a, 0xe0, 0x51, 0x23, 0x84, 0x2c, 0x9c, 0xa3, 0xbb, 0x1f, - 0xb5, 0x60, 0x63, 0xc6, 0x5d, 0x60, 0x7e, 0x28, 0x1d, 0x5f, 0xcc, 0x9a, - 0xe1, 0x03, 0xc3, 0xa8, 0xc7, 0x10, 0x11, 0xa3, 0x85, 0x04, 0x62, 0xb1, - 0x43, 0x74, 0x68, 0x0c, 0xf7, 0x08, 0x77, 0x28, 0x3d, 0xe2, 0x88, 0xaa, - 0x5b, 0x19, 0x7b, 0x4d, 0x1e, 0x8c, 0xff, 0xcf, 0x88, 0xd9, 0xd5, 0xee, - 0xad, 0x17, 0x68, 0x9e, 0x3f, 0xee, 0x5a, 0x75, 0x58, 0x81, 0x01, 0x56, - 0x00, 0xec, 0x81, 0x76, 0x47, 0xa0, 0xe0, 0xe5, 0x36, 0xf5, 0x99, 0xa1, - 0x5e, 0x79, 0x23, 0x12, 0xfc, 0x64, 0x43, 0x41, 0x72, 0x50, 0xf0, 0xc1, - 0x65, 0xdd, 0xad, 0xe8, 0xca, 0xa4, 0x81, 0xfe, 0x9c, 0x66, 0x0e, 0x42, - 0x31, 0x00, 0x8f, 0x67, 0x04, 0xdc, 0x68, 0xa2, 0x78, 0xdf, 0x25, 0xd9, - 0x19, 0x02, 0xd7, 0x0f, 0xde, 0x43, 0xde, 0xbb, 0x7c, 0x8d, 0x0a, 0xb4, - 0x5a, 0x1b, 0xc6, 0x1a, 0xb2, 0xb9, 0x78, 0x52, 0x7a, 0x08, 0x5b, 0xe0, - 0xf9, 0x61, 0x51, 0xf7, 0x63, 0xfd, 0x1d, 0xa0, 0xf6, 0xa1, 0xfd, 0xa5, - 0x8a, 0xc2, 0xc0, 0xdf, 0x5d, 0xb0, 0x43, 0x41, 0x11, 0x55, 0x40, 0x4b, - 0x63, 0xe9, 0xc1, 0x58, 0x33, 0xcf, 0xd1, 0x71, 0xe8, 0x31, 0x94, 0x5c, - 0x86, 0xf1, 0x7a, 0x29, 0x93, 0x02, 0xfa, 0x5d, 0x5c, 0xf7, 0x85, 0xb8, - 0xb0, 0xd2, 0x55, 0xe3, 0xb5, 0xe0, 0xea, 0x8d, 0x1a, 0xd6, 0x19, 0x3e, - 0xfb, 0x4a, 0x65, 0xfc, 0x39, 0x3f, 0x46, 0x2d, 0x1e, 0xb4, 0x4a, 0x2b, - 0x37, 0x35, 0x8f, 0x99, 0x36, 0x93, 0xe4, 0x70, 0x8b, 0x42, 0x63, 0xf3, - 0x58, 0x5e, 0x5b, 0x25, 0x67, 0x19, 0xe6, 0xf1, 0x82, 0xab, 0x75, 0x89, - 0xd9, 0x2c, 0xc7, 0x39, 0x5f, 0x19, 0x97, 0x31, 0xba, 0x7a, 0x07, 0x99, - 0x60, 0x55, 0x9c, 0xf4, 0xee, 0x26, 0x14, 0x80, 0xeb, 0xaa, 0x49, 0xc1, - 0x0d, 0x4c, 0x1b, 0x6d, 0x18, 0xe7, 0x5f, 0x0f, 0x32, 0x43, 0x77, 0xdf, - 0xe9, 0x2b, 0xb0, 0x3c, 0x41, 0x85, 0x01, 0xb7, 0xe9, 0x47, 0x1a, 0x5c, - 0x46, 0x54, 0xdc, 0xd9, 0xa0, 0x9e, 0x21, 0x39, 0x33, 0xbe, 0xd3, 0xaf, - 0xb7, 0x7f, 0x8f, 0xb8, 0x30, 0x6d, 0x1a, 0x42, 0x46, 0x30, 0x61, 0xf1, - 0xc0, 0x3f, 0xd0, 0x3e, 0xc6, 0x81, 0xd0, 0x9e, 0x9d, 0xfa, 0xd5, 0x43, - 0x2a, 0x45, 0x1e, 0xfe, 0x92, 0x61, 0x88, 0x0b, 0xb6, 0xdb, 0x6d, 0x91, - 0xb6, 0xa5, 0x54, 0x7a, 0x8c, 0x36, 0x1f, 0x65, 0x1f, 0x42, 0x09, 0x2c, - 0x76, 0xa0, 0xf4, 0xc7, 0x02, 0xa9, 0x76, 0x52, 0x20, 0x3d, 0x32, 0xfd, - 0xc5, 0x58, 0x97, 0xdc, 0x56, 0xd2, 0x7b, 0x73, 0x8d, 0x33, 0x2c, 0xb8, - 0x59, 0xd9, 0xe0, 0x29, 0xd9, 0x85, 0xa2, 0x9c, 0x55, 0xd7, 0x5a, 0x40, - 0xe9, 0x0b, 0x09, 0x66, 0x69, 0x8f, 0xc7, 0xfa, 0xa7, 0x02, 0x47, 0xcb, - 0x2b, 0x2d, 0xf7, 0xe5, 0x39, 0x4e, 0x1b, 0xea, 0x58, 0xec, 0xb8, 0x6b, - 0x15, 0x0b, 0x47, 0x9a, 0x84, 0xb7, 0xaf, 0x0b, 0x8e, 0x0f, 0xb7, 0x8b, - 0xa5, 0x52, 0x1d, 0x42, 0x5a, 0xfc, 0x7d, 0x1e, 0xe9, 0x7c, 0x96, 0xcd, - 0xd7, 0x0b, 0x1a, 0x44, 0xfb, 0x47, 0x10, 0x72, 0xff, 0x6c, 0x18, 0x7f, - 0x9a, 0x03, 0x4a, 0x2f, 0xb7, 0x4d, 0xc2, 0xc7, 0x65, 0xca, 0x40, 0xd8, - 0x33, 0xbd, 0x54, 0x5e, 0xe3, 0x6a, 0x3d, 0xdf, 0x10, 0x99, 0xa6, 0x3d, - 0x28, 0xad, 0xe3, 0xbf, 0x30, 0x75, 0xc6, 0x7d, 0x4e, 0x6b, 0xe4, 0x16, - 0x88, 0x40, 0x5c, 0x0c, 0x9a, 0x3a, 0x74, 0x96, 0xcd, 0xc6, 0x7e, 0x25, - 0x79, 0xd6, 0x93, 0xec, 0x69, 0x9e, 0x58, 0xaa, 0x8f, 0x4a, 0x05, 0x11, - 0x22, 0xd5, 0xff, 0x36, 0x7a, 0xe5, 0xd9, 0x66, 0xf7, 0xd3, 0x14, 0x42, - 0xcc, 0xa3, 0x63, 0xb1, 0x7b, 0x3d, 0x47, 0x94, 0xd0, 0x09, 0x96, 0xaa, - 0x25, 0x5c, 0x18, 0xd9, 0x82, 0x2b, 0xfc, 0xd3, 0x7c, 0x04, 0x7c, 0xf0, - 0xfb, 0xda, 0xa9, 0xe0, 0xd7, 0x00, 0x67, 0xad, 0x02, 0x35, 0x10, 0xec, - 0x73, 0xbd, 0xbc, 0x9e, 0xcf, 0xcc, 0x44, 0x6d, 0x6e, 0x37, 0x7e, 0xf6, - 0x2f, 0x8b, 0xdc, 0xcc, 0x9d, 0x02, 0x86, 0xb9, 0x10, 0x28, 0x21, 0x91, - 0x08, 0xb9, 0x34, 0x3d, 0xb1, 0x00, 0xb7, 0xaf, 0xfe, 0x82, 0x4c, 0xa0, - 0x8a, 0xaf, 0xc6, 0x12, 0xbb, 0x8e, 0xf5, 0x8e, 0xd6, 0xbc, 0x26, 0x79, - 0xaf, 0x25, 0x54, 0x23, 0xb6, 0x16, 0x06, 0x73, 0x1f, 0x1c, 0x96, 0x73, - 0x0b, 0x63, 0x5e, 0x89, 0x49, 0x90, 0xdc, 0x8e, 0x6e, 0x61, 0xec, 0x44, - 0xff, 0x9d, 0xfa, 0x86, 0xbf, 0x0d, 0x09, 0x98, 0xa4, 0x66, 0xa6, 0x30, - 0xaa, 0x15, 0x6a, 0xe5, 0xab, 0x64, 0xb3, 0x36, 0x2d, 0xf5, 0x6d, 0x5b, - 0x4f, 0x6a, 0x6c, 0x40, 0xa5, 0x9b, 0xd5, 0xd8, 0x1a, 0x99, 0xcd, 0x47, - 0x36, 0x3c, 0xf5, 0x7e, 0xe6, 0x03, 0x56, 0xb3, 0xc5, 0x5e, 0xf3, 0x86, - 0x2f, 0xeb, 0x10, 0x12, 0xcb, 0xe2, 0x4b, 0x7d, 0xbb, 0xcc, 0x03, 0x14, - 0xd8, 0xea, 0x41, 0xd4, 0x97, 0x07, 0x01, 0x33, 0xed, 0xce, 0x76, 0xf9, - 0xe2, 0x0c, 0x83, 0x61, 0x5d, 0x0a, 0x56, 0xab, 0xa7, 0xb7, 0xaf, 0x89, - 0x2f, 0x7f, 0x8f, 0x00, 0x45, 0x03, 0xc0, 0xb4, 0xc4, 0x55, 0x80, 0xf5, - 0x6c, 0x81, 0xd1, 0xc5, 0x2e, 0xe0, 0xca, 0xba, 0x7a, 0x47, 0x19, 0xb3, - 0xfc, 0xe1, 0x3f, 0xea, 0xe7, 0xc0, 0x86, 0xfd, 0x8a, 0x18, 0x44, 0x3a, - 0xda, 0xf1, 0xa7, 0xd8, 0x99, 0xe8, 0x85, 0x92, 0x11, 0x58, 0x2e, 0x1b, - 0xee, 0x9f, 0x57, 0x77, 0xbf, 0x44, 0x9f, 0xb3, 0x91, 0xa4, 0x8b, 0xce, - 0x56, 0xb1, 0xa0, 0x36, 0xe0, 0xa2, 0x2c, 0xd1, 0x8a, 0x63, 0x64, 0x69, - 0x12, 0x74, 0x08, 0xff, 0xb3, 0x81, 0xfe, 0x0c, 0xc5, 0xbd, 0x5c, 0x85, - 0x00, 0x80, 0xab, 0xd3, 0x9c, 0xcd, 0x7f, 0x3a, 0xe9, 0x27, 0xca, 0xff, - 0xde, 0x97, 0xc3, 0x78, 0x14, 0xf7, 0x84, 0xde, 0xad, 0x1a, 0x30, 0x99, - 0x73, 0x8c, 0xf4, 0x6e, 0xf1, 0x93, 0xdd, 0x3c, 0x44, 0xab, 0x80, 0x06, - 0xa6, 0xda, 0xf6, 0xd5, 0xe7, 0xaa, 0x60, 0x5b, 0x8f, 0xff, 0x4b, 0x22, - 0x25, 0x1f, 0x2f, 0x07, 0x6f, 0x3f, 0x40, 0x5f, 0x80, 0x03, 0xda, 0x82, - 0x76, 0x0b, 0xc1, 0xa9, 0xa4, 0xcd, 0x50, 0xc3, 0xc5, 0x9b, 0xf5, 0x8a, - 0x8e, 0xb6, 0x3e, 0xaf, 0x49, 0x89, 0x41, 0x79, 0x5f, 0x8a, 0x28, 0xaa, - 0xab, 0x3f, 0xa1, 0xed, 0x0a, 0xf3, 0x9a, 0x6a, 0x95, 0xb8, 0x63, 0x1b, - 0xe6, 0xca, 0xa6, 0x74, 0xf2, 0xf2, 0x9f, 0x44, 0xa1, 0x64, 0x8a, 0x79, - 0x73, 0x9f, 0xde, 0x56, 0x34, 0x82, 0x18, 0x5d, 0x08, 0x11, 0xf2, 0x16, - 0x2d, 0xca, 0xf7, 0x56, 0x5e, 0xa4, 0x7e, 0x6d, 0x03, 0x8b, 0xbf, 0xac, - 0xa7, 0x99, 0x18, 0x8d, 0x0f, 0xca, 0x99, 0x6b, 0x62, 0xe8, 0xdb, 0xb8, - 0x17, 0x9f, 0x1c, 0x6a, 0x34, 0x29, 0xa6, 0x5f, 0x47, 0x43, 0x99, 0x4b, - 0x87, 0xc8, 0x91, 0x96, 0x6a, 0x2d, 0xae, 0xae, 0xc1, 0x2c, 0xf2, 0x00, - 0x9d, 0xce, 0x9d, 0x36, 0xc5, 0x49, 0xea, 0x0f, 0x81, 0x19, 0x34, 0xfd, - 0xc6, 0x5b, 0x94, 0x57, 0x21, 0xcb, 0x18, 0x52, 0x73, 0xf0, 0x17, 0xbc, - 0x82, 0xb6, 0x35, 0xcf, 0xd3, 0xf8, 0x9c, 0x68, 0xfd, 0xef, 0x1b, 0x0b, - 0x10, 0x01, 0x52, 0xcc, 0x9f, 0xde, 0xb9, 0x6d, 0x7c, 0x25, 0x13, 0x97, - 0xdd, 0xf9, 0xb7, 0xe6, 0xfa, 0x6a, 0xb9, 0x8e, 0xa3, 0x5b, 0x81, 0x01, - 0x3f, 0x3e, 0x67, 0x3e, 0x22, 0x7a, 0x2d, 0x26, 0xe4, 0x02, 0x80, 0x57, - 0xb0, 0x5a, 0xd1, 0x7e, 0x79, 0x2c, 0xd6, 0x7e, 0x49, 0xef, 0xee, 0xc1, - 0x50, 0x98, 0x5e, 0x94, 0x5a, 0x88, 0x6e, 0x08, 0xe9, 0x35, 0x41, 0x2c, - 0x0c, 0xd1, 0xd6, 0x16, 0xb3, 0xdb, 0x2a, 0x3f, 0x01, 0x3b, 0x13, 0x46, - 0x6b, 0x1b, 0xb4, 0xa1, 0x66, 0x8b, 0x4b, 0xed, 0x28, 0x81, 0xd8, 0x93, - 0x00, 0xa7, 0x7a, 0x5c, 0x4c, 0xc6, 0xa4, 0x62, 0x21, 0xbc, 0x50, 0x0a, - 0x94, 0x4e, 0xf5, 0x33, 0xea, 0x87, 0x2f, 0xc5, 0xa5, 0xfc, 0x92, 0xe9, - 0x29, 0xf8, 0x51, 0x5f, 0xbf, 0x2e, 0x73, 0xd0, 0x86, 0xa2, 0xb5, 0x1b, - 0x05, 0xaf, 0x70, 0x35, 0x2b, 0x79, 0x63, 0xb9, 0xe0, 0xdf, 0xc1, 0xf1, - 0x63, 0xea, 0xc0, 0x1e, 0x9d, 0x6d, 0xaf, 0x13, 0x24, 0x3e, 0x99, 0x79, - 0xf0, 0x5c, 0xa7, 0x60, 0xa5, 0x91, 0xff, 0x4d, 0x38, 0x41, 0x35, 0xa3, - 0x5f, 0xb7, 0x15, 0x6c, 0x61, 0xdc, 0x4f, 0x74, 0xb0, 0x9a, 0xd3, 0xc7, - 0x2f, 0x91, 0xa9, 0x1c, 0xae, 0xea, 0xd7, 0x0b, 0xa4, 0x45, 0x8c, 0x62, - 0x70, 0x2d, 0x91, 0x87, 0xf5, 0x01, 0xfe, 0x9d, 0x32, 0xe7, 0xc0, 0x05, - 0x43, 0x47, 0x75, 0x57, 0x7c, 0x5e, 0xfc, 0xe3, 0x27, 0xc9, 0x1a, 0x00, - 0xae, 0x71, 0x91, 0x26, 0x34, 0xd1, 0xfc, 0x29, 0xe1, 0xac, 0x7a, 0x99, - 0x91, 0x43, 0x83, 0x37, 0x6d, 0xf0, 0x37, 0x80, 0x4e, 0x1c, 0xeb, 0xe8, - 0x22, 0xdb, 0xc9, 0x00, 0xfc, 0x1f, 0x5d, 0xf9, 0x0c, 0x22, 0x7d, 0xc8, - 0x78, 0x18, 0x50, 0x60, 0x49, 0x0b, 0x6e, 0x38, 0x78, 0x97, 0x29, 0xf7, - 0x12, 0xae, 0xce, 0x19, 0x9b, 0x68, 0x6f, 0xc5, 0xa8, 0x71, 0x60, 0x66, - 0xf4, 0x25, 0xd7, 0x40, 0xfd, 0x33, 0xf6, 0x67, 0x04, 0xe7, 0xf6, 0x2f, - 0x7c, 0x3d, 0xcd, 0x96, 0xab, 0x73, 0xb5, 0x6a, 0x0a, 0xaa, 0xee, 0xe7, - 0x0f, 0x3a, 0x5e, 0x4c, 0x6b, 0xd4, 0x42, 0x73, 0x6e, 0xb5, 0x4d, 0x35, - 0x6a, 0x6c, 0xb7, 0x4a, 0x86, 0xd3, 0xea, 0xa6, 0xae, 0x40, 0x42, 0xde, - 0x58, 0x78, 0x9e, 0x49, 0x52, 0xf5, 0x0d, 0x74, 0x10, 0x32, 0xf3, 0x94, - 0x49, 0xa3, 0xdf, 0x30, 0x8f, 0xc3, 0xdb, 0xe5, 0x74, 0x29, 0xc7, 0x35, - 0x63, 0x9d, 0xa7, 0x61, 0xab, 0x52, 0xf3, 0xc1, 0x1f, 0xe4, 0xbb, 0x2e, - 0x91, 0x2f, 0xf0, 0x35, 0x09, 0x68, 0x7b, 0x79, 0xcb, 0x6b, 0x07, 0x11, - 0x24, 0xf7, 0x32, 0x69, 0x3f, 0x87, 0xcf, 0xe6, 0xf4, 0x55, 0x37, 0xea, - 0x17, 0x4d, 0x29, 0x37, 0xf3, 0x8a, 0xab, 0x6c, 0x81, 0x41, 0xad, 0x1b, - 0xe2, 0x21, 0xa1, 0x7f, 0x90, 0xce, 0x4e, 0x1b, 0x74, 0xcf, 0x43, 0x9b, - 0xd5, 0x84, 0x08, 0xb5, 0x82, 0x80, 0xeb, 0x79, 0x35, 0xf6, 0xca, 0x0b, - 0x42, 0x48, 0x38, 0x4f, 0x3f, 0xe3, 0x49, 0x2b, 0xf9, 0x37, 0xce, 0x50, - 0x21, 0x4b, 0xc6, 0xf8, 0x37, 0x33, 0xa3, 0xdf, 0x9c, 0x15, 0xd8, 0x20, - 0x13, 0x2a, 0xb9, 0x52, 0xc5, 0x86, 0xa4, 0xcf, 0x1d, 0x1e, 0x3b, 0x30, - 0xce, 0xe5, 0x68, 0x6c, 0xa1, 0x02, 0xc6, 0xa2, 0x87, 0x5f, 0x31, 0x67, - 0x91, 0x9a, 0x1c, 0xca, 0x25, 0x71, 0xb7, 0xf8, 0x1d, 0x29, 0xcb, 0x27, - 0x2d, 0x28, 0x60, 0x33, 0xaa, 0xd5, 0xf9, 0x42, 0x8b, 0x92, 0x2d, 0x3a, - 0xb8, 0x86, 0xd1, 0x11, 0xce, 0x8c, 0x72, 0x72, 0xe8, 0xd2, 0x94, 0xdb, - 0xea, 0x29, 0xf8, 0xd2, 0xae, 0x9f, 0x97, 0x76, 0xfc, 0x56, 0x2d, 0xc0, - 0x96, 0x79, 0x41, 0x7f, 0x45, 0xe8, 0x8a, 0x5a, 0x16, 0xb1, 0x36, 0xa6, - 0x14, 0x42, 0x7a, 0xce, 0xad, 0x87, 0x7f, 0xd0, 0x89, 0xce, 0xf4, 0x53, - 0xb4, 0xb2, 0xdd, 0xd8, 0xf9, 0x89, 0xe1, 0xab, 0xbd, 0x74, 0xcd, 0xda, - 0xb3, 0x91, 0x00, 0x0f, 0x15, 0xed, 0xaa, 0x75, 0xd8, 0xd0, 0xba, 0xa3, - 0x18, 0x80, 0x72, 0x41, 0x84, 0xfc, 0x65, 0x61, 0x6f, 0xe2, 0xf2, 0xe9, - 0x29, 0x11, 0x6c, 0x91, 0xbe, 0x49, 0xd9, 0x66, 0x7f, 0x2e, 0xa4, 0x9d, - 0x7f, 0x00, 0x7f, 0xe9, 0x87, 0x21, 0xe3, 0x7a, 0x6a, 0xee, 0x87, 0x3a, - 0x9a, 0x36, 0x8b, 0x1a, 0x8c, 0x78, 0xc2, 0x17, 0x8e, 0x2f, 0x88, 0xc8, - 0xa9, 0xb4, 0x75, 0x0e, 0xbf, 0xfa, 0x40, 0x3e, 0x34, 0xdf, 0x71, 0x20, - 0xff, 0x18, 0x7b, 0x67, 0x66, 0x2f, 0x88, 0x56, 0xf6, 0x15, 0xd7, 0x82, - 0xa0, 0x5e, 0xdc, 0x7c, 0x52, 0xac, 0xa3, 0x7b, 0x3f, 0x44, 0x40, 0x73, - 0x7c, 0x9e, 0x78, 0x6a, 0x62, 0x63, 0x52, 0xbd, 0xa4, 0x57, 0x2f, 0x70, - 0x9f, 0xea, 0xa5, 0xa9, 0x71, 0xd0, 0x1b, 0xad, 0x8e, 0x05, 0xb4, 0x19, - 0x80, 0x94, 0x76, 0xb3, 0x05, 0x71, 0x84, 0xa9, 0x29, 0x96, 0x62, 0x53, - 0xe2, 0x37, 0x40, 0x13, 0x95, 0xf3, 0x83, 0x5b, 0x70, 0x66, 0x41, 0x22, - 0xc1, 0xef, 0xfb, 0x4e, 0xbe, 0x60, 0x26, 0x6a, 0x7b, 0xf8, 0x41, 0x01, - 0xe4, 0xbb, 0xce, 0x47, 0xd2, 0xa7, 0xab, 0xfa, 0x1c, 0xdb, 0x6b, 0x79, - 0x38, 0xfe, 0xa3, 0xe0, 0x1a, 0x98, 0xba, 0xca, 0xfd, 0x5d, 0xf4, 0xa0, - 0xfd, 0x98, 0xdb, 0x05, 0x87, 0x1b, 0x76, 0xab, 0xa7, 0xc1, 0x5c, 0x0d, - 0x54, 0xe4, 0x09, 0xea, 0x35, 0x7f, 0xa1, 0xba, 0x40, 0x78, 0xec, 0xfe, - 0x21, 0x5f, 0x38, 0x5f, 0x43, 0xfa, 0xb8, 0x55, 0xfc, 0x8a, 0xb0, 0x24, - 0xbb, 0x70, 0x41, 0xa5, 0xaf, 0xff, 0x33, 0x50, 0x4c, 0x4f, 0x99, 0xb2, - 0xac, 0x45, 0x30, 0xb0, 0xf7, 0x05, 0x4c, 0x85, 0xde, 0x4d, 0xb1, 0x76, - 0x3d, 0x93, 0x55, 0x17, 0xf9, 0x17, 0xc1, 0x40, 0x97, 0x13, 0x79, 0x51, - 0x56, 0xa4, 0xde, 0x5c, 0x25, 0x62, 0xab, 0x93, 0xd1, 0x3f, 0x63, 0x94, - 0xa8, 0xfd, 0x56, 0xbf, 0xb1, 0x4f, 0xcd, 0x81, 0x07, 0xfd, 0xf9, 0xd5, - 0x8b, 0x02, 0x90, 0xd8, 0x78, 0xd6, 0x82, 0xd3, 0x50, 0x63, 0x0e, 0x63, - 0xed, 0xb6, 0x63, 0x25, 0x82, 0x91, 0x0e, 0xf0, 0xf0, 0x51, 0x02, 0xa3, - 0x9d, 0xd5, 0xa2, 0xdd, 0xb0, 0xdd, 0x9b, 0xdf, 0x11, 0x72, 0xb4, 0x3d, - 0x3d, 0xb2, 0xe9, 0xad, 0xca, 0x40, 0xbc, 0x51, 0x34, 0xa0, 0xea, 0x99, - 0xa2, 0xf6, 0x39, 0xb9, 0x4a, 0x13, 0x76, 0x19, 0xa2, 0xa7, 0x0d, 0x3a, - 0x01, 0x16, 0x61, 0x22, 0x07, 0x3d, 0xfb, 0x45, 0x2c, 0x18, 0x0c, 0x82, - 0xe9, 0xb4, 0xaa, 0x7d, 0x47, 0xff, 0x7c, 0x9a, 0x5d, 0x40, 0x03, 0x59, - 0xa5, 0x50, 0x8d, 0xb7, 0xe5, 0x0a, 0xe3, 0x58, 0x86, 0x1b, 0x7e, 0x73, - 0x7a, 0x3d, 0xd3, 0x92, 0xc4, 0x88, 0xea, 0x6e, 0xe2, 0x78, 0xdb, 0x8b, - 0x84, 0xc2, 0x75, 0xe8, 0x66, 0xcc, 0x0f, 0xe0, 0x2a, 0xfc, 0xa9, 0xea, - 0x9a, 0x14, 0x01, 0x7f, 0xc1, 0x5e, 0x47, 0x83, 0x24, 0x9d, 0x55, 0xbd, - 0x25, 0x34, 0xd6, 0x68, 0xc5, 0x6b, 0x95, 0x7d, 0x1f, 0xda, 0x8a, 0x63, - 0x0d, 0x7e, 0xe9, 0xb0, 0xb6, 0x85, 0xbd, 0xfe, 0x03, 0x77, 0xf1, 0xed, - 0xd3, 0x16, 0x50, 0x15, 0x48, 0x75, 0x19, 0x13, 0x5d, 0x89, 0xd8, 0x9e, - 0xe3, 0x54, 0x54, 0x76, 0x1d, 0x45, 0x2d, 0x4a, 0x57, 0xfd, 0x22, 0x76, - 0xd6, 0xf6, 0x26, 0xc4, 0x73, 0xcd, 0xee, 0xd5, 0xab, 0x47, 0xf1, 0x58, - 0xea, 0x86, 0x7a, 0x58, 0x1c, 0x85, 0x0c, 0xa9, 0xb3, 0x90, 0x70, 0x6e, - 0xfe, 0x09, 0x3f, 0x3f, 0x6d, 0x2f, 0xc0, 0xf6, 0x9b, 0xb2, 0x38, 0xbc, - 0x78, 0xdf, 0x07, 0x6b, 0x69, 0x48, 0xae, 0xf9, 0xf4, 0xd1, 0x42, 0xe0, - 0xda, 0x07, 0x7e, 0x40, 0x1b, 0xd1, 0x48, 0x68, 0x53, 0xf4, 0xc9, 0xc1, - 0x37, 0xfe, 0xff, 0x01, 0xd2, 0xb3, 0x5c, 0xba, 0xe5, 0xe0, 0x81, 0x06, - 0xf9, 0xa9, 0xac, 0x4b, 0xb3, 0xe7, 0x45, 0x09, 0xa7, 0x00, 0x99, 0xfd, - 0xde, 0xf7, 0xfb, 0x98, 0xd0, 0x8a, 0xa1, 0xbb, 0x12, 0x51, 0xe9, 0x6c, - 0x03, 0xb5, 0x82, 0xe8, 0xfa, 0x34, 0x25, 0xd9, 0xe1, 0x2f, 0xaf, 0xad, - 0x44, 0xb8, 0xc7, 0x33, 0xd7, 0x6f, 0x27, 0x1e, 0xfb, 0x63, 0x8f, 0xba, - 0x70, 0xd0, 0x78, 0x68, 0x87, 0xf2, 0x0b, 0x17, 0x37, 0x78, 0xdf, 0xcc, - 0x6c, 0xe7, 0x24, 0x11, 0xcb, 0xeb, 0x5e, 0x9c, 0xe6, 0x6b, 0x64, 0x17, - 0xe4, 0x80, 0x54, 0x6a, 0x93, 0xd6, 0xd3, 0xb0, 0xf2, 0x64, 0xc3, 0x2f, - 0x82, 0x13, 0xf2, 0x6e, 0x3e, 0x8d, 0xdd, 0xe7, 0x1e, 0x53, 0x3a, 0xfa, - 0x7c, 0xf2, 0xa1, 0xb7, 0x8e, 0x89, 0x84, 0xc7, 0x18, 0x70, 0x44, 0xb3, - 0x92, 0x3f, 0xc4, 0xd8, 0x84, 0xf6, 0xc8, 0xe6, 0xe1, 0x50, 0xd6, 0xeb, - 0x6a, 0xe8, 0x7e, 0x56, 0x43, 0x57, 0x56, 0xd7, 0x7d, 0xe3, 0xb1, 0xca, - 0xa1, 0x0a, 0xdc, 0x84, 0x7e, 0x99, 0x0b, 0x64, 0xc0, 0xf9, 0x59, 0xb3, - 0xc7, 0x8d, 0x4b, 0x88, 0xf0, 0x77, 0x9e, 0xd6, 0x05, 0x9c, 0x95, 0xd9, - 0xc3, 0xe8, 0x68, 0x05, 0x75, 0xb8, 0x5d, 0x55, 0x24, 0x36, 0xcc, 0x46, - 0xc6, 0x28, 0xc6, 0x13, 0x3d, 0xad, 0xc6, 0xd6, 0xbe, 0xfa, 0xcc, 0x73, - 0xa9, 0x9b, 0xbe, 0x1e, 0xb1, 0x48, 0xa1, 0x58, 0x7e, 0xbe, 0xc3, 0xfe, - 0x6d, 0x40, 0xd0, 0x29, 0x17, 0x73, 0xdf, 0x79, 0x3a, 0xa9, 0x71, 0x55, - 0x72, 0xac, 0xf0, 0xc5, 0x49, 0x95, 0xbd, 0xe7, 0xfa, 0x29, 0xf6, 0xf1, - 0x09, 0x9a, 0xdc, 0xef, 0x3d, 0x0f, 0x34, 0x1a, 0xbb, 0x7f, 0xc7, 0x23, - 0x59, 0xa6, 0xf1, 0x0d, 0xb1, 0x25, 0xd8, 0xe9, 0x53, 0xab, 0x26, 0x25, - 0xfc, 0xd3, 0x88, 0xa9, 0xf5, 0xe4, 0xc6, 0xab, 0xef, 0x54, 0x6f, 0x7f, - 0x6b, 0xe6, 0x9e, 0x7b, 0x0b, 0xf9, 0xcd, 0xc7, 0x98, 0xf5, 0x5f, 0x8f, - 0xc1, 0xbd, 0x39, 0xa7, 0x9b, 0x7e, 0x60, 0x60, 0xf9, 0xaa, 0xc4, 0x81, - 0xd1, 0x5f, 0x7f, 0xb2, 0x14, 0x7e, 0xf4, 0x5a, 0xc7, 0xd4, 0x40, 0x4f, - 0x49, 0x9a, 0x60, 0xc8, 0x5b, 0x2d, 0x36, 0xca, 0x4e, 0xcb, 0xee, 0x6e, - 0x7a, 0x3a, 0x4c, 0xe9, 0x49, 0xe6, 0xf0, 0x2f, 0x80, 0x67, 0xb1, 0xe8, - 0x8e, 0x64, 0x4d, 0x0d, 0x73, 0x76, 0x73, 0x98, 0x05, 0x5b, 0x59, 0x9e, - 0xaf, 0x11, 0x17, 0xf1, 0xc7, 0xb9, 0x1b, 0x2b, 0xc1, 0x34, 0x3f, 0x41, - 0x28, 0x5e, 0x0c, 0x0a, 0x3d, 0x6e, 0x8e, 0x5b, 0x59, 0x3b, 0xec, 0x55, - 0x4a, 0x70, 0x8b, 0x77, 0x7c, 0x99, 0xdb, 0xa6, 0x49, 0x30, 0xf2, 0xb2, - 0x86, 0x0f, 0x1d, 0xc0, 0x91, 0x57, 0x06, 0xd5, 0xdb, 0xe4, 0x3e, 0xe9, - 0x5c, 0x74, 0xa7, 0xf6, 0x43, 0x10, 0xb5, 0x81, 0xbd, 0x9b, 0x67, 0x3d, - 0x84, 0xd9, 0xf8, 0x32, 0xb2, 0x55, 0x3c, 0x1d, 0x56, 0xb1, 0xe1, 0x8a, - 0xe8, 0x1e, 0x81, 0xf5, 0xd8, 0x70, 0xcb, 0xdd, 0xc5, 0x91, 0x05, 0x40, - 0x4c, 0xd9, 0xb3, 0x03, 0xdc, 0xe6, 0xd9, 0xe7, 0x57, 0x9e, 0xa6, 0x5a, - 0x08, 0xa7, 0xbb, 0xf0, 0x23, 0xab, 0xb6, 0x81, 0x30, 0xc9, 0xdf, 0x63, - 0x79, 0x6f, 0x2c, 0x2d, 0x74, 0xa5, 0xe6, 0x76, 0xa3, 0xe4, 0x70, 0x36, - 0x1d, 0xb8, 0x5e, 0xe6, 0x21, 0xdc, 0xc6, 0x6f, 0xbe, 0xd1, 0x48, 0xb5, - 0x1d, 0x9c, 0x67, 0xb7, 0xc4, 0x22, 0x9c, 0x3b, 0x1f, 0x68, 0x8a, 0xee, - 0xf4, 0xb9, 0xd1, 0x49, 0xc7, 0x95, 0x45, 0x42, 0xb3, 0xdf, 0x45, 0x91, - 0xf4, 0xdf, 0x39, 0xb3, 0xc1, 0x5a, 0x83, 0x64, 0x28, 0x5d, 0xa8, 0xba, - 0x79, 0xf1, 0x71, 0xaf, 0x13, 0x2b, 0x5c, 0x67, 0x03, 0x51, 0x70, 0x25, - 0xf4, 0x87, 0x99, 0xdd, 0x9a, 0xed, 0x08, 0x75, 0xe3, 0x81, 0x93, 0x3d, - 0x2c, 0xc4, 0x48, 0xef, 0xf7, 0x75, 0x66, 0x19, 0x4c, 0xec, 0x55, 0x4c, - 0x7a, 0xe4, 0xf8, 0x79, 0x51, 0xa1, 0x38, 0xd2, 0x12, 0xa3, 0xef, 0x10, - 0x03, 0x42, 0xe7, 0x5a, 0x0f, 0x09, 0xc9, 0x32, 0x3a, 0x46, 0x49, 0x06, - 0xd2, 0x6f, 0xb1, 0x43, 0x25, 0x93, 0x44, 0x6a, 0x67, 0x16, 0x48, 0xe7, - 0x22, 0xcb, 0x64, 0x47, 0xba, 0xad, 0x77, 0xad, 0xeb, 0xb3, 0x4c, 0x92, - 0x3c, 0x7e, 0xf0, 0x28, 0x9c, 0xcd, 0x4c, 0xd9, 0x39, 0x1c, 0x41, 0xed, - 0xc6, 0x4e, 0xc0, 0x09, 0xb1, 0xfd, 0xc5, 0x6d, 0x03, 0x3c, 0x50, 0x1b, - 0xf9, 0xba, 0x85, 0x13, 0x2b, 0x39, 0x91, 0xa7, 0x5c, 0x2e, 0x34, 0x58, - 0xf4, 0xd4, 0xe3, 0x24, 0x02, 0x7c, 0x86, 0xbf, 0x56, 0x3d, 0x00, 0xf7, - 0x47, 0x65, 0x69, 0xe6, 0x51, 0x4e, 0x83, 0x75, 0x6e, 0x0c, 0xa2, 0x92, - 0x6d, 0x5d, 0x84, 0x0d, 0xd4, 0xe8, 0x53, 0xa9, 0x4a, 0x7c, 0x2c, 0x31, - 0x50, 0xa8, 0x15, 0x97, 0x02, 0x8e, 0x83, 0x44, 0xdc, 0x39, 0xcc, 0x04, - 0xe3, 0x43, 0xca, 0xbe, 0xac, 0x25, 0xae, 0x9d, 0x5c, 0x2b, 0xb5, 0x3e, - 0x73, 0xe1, 0x49, 0xbd, 0xf5, 0xd4, 0xe3, 0x24, 0x32, 0x7c, 0x86, 0xbf, - 0x56, 0x3d, 0x00, 0xf7, 0x47, 0x65, 0x69, 0xe6, 0x87, 0xd4, 0x05, 0xf7, - 0xce, 0x3d, 0xde, 0x97, 0xf8, 0xec, 0xfe, 0xc7, 0x8d, 0xe4, 0x02, 0xfe, - 0xcd, 0x12, 0xcb, 0x45, 0x8d, 0x3d, 0x7f, 0x83, 0x1f, 0x6b, 0xfb, 0xd7, - 0x71, 0x45, 0x50, 0x71, 0xf3, 0x5a, 0x15, 0x37, 0x3e, 0x36, 0x4e, 0x08, - 0x06, 0x34, 0x1d, 0x60, 0xbf, 0x38, 0xad, 0x69, 0x4d, 0x7e, 0x98, 0x83, - 0xa1, 0xbf, 0xbc, 0xa6, 0x27, 0x6b, 0x2f, 0x96, 0x91, 0xf1, 0xde, 0xd7, - 0xe7, 0xdf, 0x1d, 0x62, 0x28, 0xc3, 0x09, 0x6b, 0x68, 0x99, 0x27, 0x20, - 0xfc, 0xdf, 0xa9, 0x30, 0x0b, 0x27, 0xe3, 0x4d, 0xf3, 0x79, 0x16, 0x41, - 0x65, 0x43, 0x55, 0x19, 0x16, 0x1c, 0x0b, 0xd7, 0xeb, 0x6e, 0xb7, 0x2b, - 0xd0, 0xe9, 0x0e, 0xd5, 0x69, 0x3e, 0xa8, 0x24, 0xed, 0x28, 0x40, 0x65, - 0x70, 0xf0, 0xbb, 0xdc, 0xae, 0x48, 0xc4, 0x24, 0x69, 0x5d, 0xb4, 0x7b, - 0x0b, 0x03, 0xfb, 0xd8, 0x94, 0x26, 0xfb, 0xcc, 0xe5, 0xf3, 0x6c, 0xbf, - 0xb4, 0x4d, 0x49, 0x15, 0x9b, 0x9e, 0x53, 0x43, 0x50, 0xa6, 0xd8, 0xfc, - 0x29, 0xa5, 0xe7, 0xfb, 0x73, 0x0c, 0x1d, 0x65, 0x20, 0xa2, 0xeb, 0xb6, - 0xcc, 0xfa, 0xcb, 0x3e, 0x34, 0x8d, 0x42, 0x37, 0x19, 0xf9, 0x96, 0x75, - 0x75, 0xd1, 0x41, 0xb2, 0xb2, 0xff, 0xd0, 0x0f, 0x81, 0x1c, 0x06, 0xe4, - 0xcd, 0x62, 0xa8, 0xa6, 0x8a, 0x8f, 0x7f, 0x4b, 0x40, 0xfe, 0x84, 0xe0, - 0x4d, 0x11, 0x20, 0xbc, 0x11, 0x22, 0x15, 0xfc, 0x0b, 0x24, 0xde, 0x63, - 0x12, 0x2e, 0x7b, 0x84, 0x58, 0xd3, 0xc1, 0x45, 0x84, 0xdd, 0x1f, 0x54, - 0xc2, 0x9b, 0x18, 0xae, 0x9f, 0x5e, 0xdf, 0xb3, 0x11, 0x02, 0x0e, 0x7c, - 0x5d, 0xe0, 0x1a, 0x0b, 0x7f, 0xba, 0xd9, 0x94, 0xd2, 0xd7, 0x0b, 0x17, - 0xd9, 0x05, 0x1f, 0x5b, 0xb3, 0x55, 0x87, 0x1a, 0xe1, 0x34, 0xa8, 0xb2, - 0xb9, 0xf9, 0x8a, 0xb6, 0x89, 0xa2, 0x63, 0xf4, 0x4c, 0x0b, 0xe3, 0x83, - 0x94, 0xbc, 0xde, 0x7d, 0x0d, 0x04, 0xbd, 0xf6, 0x1f, 0x0f, 0x47, 0xfd, - 0x4a, 0xda, 0x5d, 0x99, 0xc7, 0xfa, 0xa4, 0xe9, 0xb1, 0xa0, 0x29, 0x58, - 0x6d, 0x18, 0xf1, 0x3e, 0x5b, 0x68, 0xe0, 0xfa, 0x64, 0x12, 0xd9, 0x27, - 0x7c, 0x01, 0xe0, 0x29, 0xf2, 0xf6, 0xc4, 0x29, 0xe3, 0xe9, 0x69, 0xfb, - 0x00, 0xfd, 0x1d, 0xdd, 0xbe, 0x55, 0xbd, 0xff, 0x54, 0xcc, 0x75, 0x50, - 0x28, 0xe2, 0x42, 0xe8, 0xe8, 0x84, 0x51, 0x72, 0x0b, 0x94, 0x29, 0x89, - 0x7c, 0xe5, 0x2c, 0xf8, 0x5f, 0x4d, 0x3e, 0x91, 0x08, 0xce, 0x54, 0xe2, - 0x78, 0x8a, 0x48, 0xe3, 0x29, 0xd3, 0xff, 0xcc, 0xdd, 0xa5, 0xf5, 0x60, - 0x96, 0xf2, 0x2a, 0x8a, 0x34, 0x11, 0xf7, 0x70, 0x95, 0xad, 0xb7, 0x32, - 0xb2, 0x2b, 0xec, 0x16, 0x77, 0xa8, 0x23, 0x9f, 0x80, 0x8e, 0x70, 0x78, - 0x14, 0xa9, 0x60, 0x3e, 0x8e, 0x50, 0x87, 0x02, 0x4c, 0xb0, 0xd1, 0x48, - 0x19, 0xba, 0x47, 0x51, 0xe7, 0x8c, 0xed, 0x81, 0x2f, 0x60, 0x2d, 0xfa, - 0x1a, 0x9d, 0x0b, 0xc2, 0xa4, 0x36, 0xa7, 0xd5, 0x3f, 0x33, 0xd7, 0xe9, - 0xb6, 0xe3, 0x5b, 0x29, 0x63, 0x2a, 0xad, 0x27, 0x06, 0x14, 0xa9, 0x84, - 0xd8, 0x9c, 0x6a, 0x86, 0x34, 0x96, 0x62, 0x42, 0x45, 0xc9, 0xeb, 0x40, - 0xcd, 0xe1, 0xa9, 0x7c, 0x62, 0x0f, 0xfc, 0x3c, 0x74, 0xee, 0x93, 0x15, - 0xb5, 0xfe, 0x78, 0x7f, 0x15, 0x4e, 0x37, 0x96, 0x58, 0xb9, 0x74, 0x15, - 0x02, 0xfa, 0xc2, 0xb8, 0x71, 0x21, 0xbe, 0x3d, 0x53, 0x9f, 0x08, 0xd9, - 0xe5, 0xf1, 0xf3, 0x12, 0xeb, 0x3c, 0xbd, 0xcd, 0x7f, 0xbe, 0xd1, 0x0a, - 0xbd, 0xc0, 0x06, 0xa4, 0x09, 0xa3, 0x40, 0xe1, 0x6c, 0x02, 0x90, 0xa9, - 0x98, 0xe6, 0xe2, 0x84, 0x05, 0xbe, 0x75, 0xf4, 0x66, 0xf8, 0xd2, 0xde, - 0x85, 0x32, 0x74, 0x8b, 0x51, 0xaa, 0x98, 0x36, 0xbe, 0x8b, 0x98, 0x63, - 0x23, 0x30, 0x4d, 0x3f, 0xe8, 0x46, 0xdc, 0x69, 0x4c, 0x31, 0x52, 0xa2, - 0xdb, 0xd0, 0x3f, 0x49, 0xf1, 0x98, 0xa6, 0xcc, 0xac, 0x5d, 0x4d, 0x84, - 0x2f, 0x84, 0x76, 0xdb, 0x15, 0x42, 0x94, 0xe2, 0xd8, 0x2c, 0x93, 0x92, - 0xc7, 0x99, 0x18, 0x3c, 0xa0, 0x2b, 0x04, 0x5a, 0xcc, 0x2b, 0xfe, 0x18, - 0x35, 0x62, 0x9f, 0xde, 0x42, 0xe7, 0xf1, 0x0b, 0x39, 0x67, 0x28, 0x7b, - 0x61, 0x5a, 0x40, 0xa0, 0x10, 0xe2, 0x38, 0x8b, 0x2a, 0x0d, 0x3c, 0x57, - 0xa8, 0x12, 0xc1, 0xdd, 0xc3, 0xb8, 0xba, 0xb8, 0xa1, 0xbd, 0x74, 0x38, - 0x3f, 0x10, 0x99, 0x23, 0x74, 0x43, 0xa7, 0xc7, 0x59, 0x00, 0xfb, 0x44, - 0xe5, 0x68, 0xb8, 0xb9, 0x71, 0x63, 0xc5, 0x6a, 0xda, 0xe6, 0x2e, 0x94, - 0xcc, 0xb7, 0x8c, 0x69, 0x67, 0x05, 0x4a, 0x37, 0xd5, 0x34, 0x01, 0x11, - 0xe6, 0xcb, 0x8f, 0xab, 0x32, 0xf2, 0x35, 0xbd, 0x09, 0x49, 0x36, 0x32, - 0xa9, 0xb1, 0x92, 0xd9, 0x84, 0x93, 0x7f, 0xac, 0x4d, 0xb6, 0x89, 0xa2, - 0x21, 0x85, 0x97, 0xa9, 0xa2, 0x87, 0x07, 0xe4, 0x00, 0x8c, 0x30, 0xd8, - 0x79, 0x29, 0xda, 0x47, 0xc8, 0x3e, 0x38, 0x0f, 0x65, 0x9f, 0xd8, 0xe2, - 0x16, 0x7b, 0x5a, 0x7c, 0x29, 0x9e, 0x47, 0x07, 0x7b, 0x75, 0xfc, 0x1b, - 0x0b, 0xc3, 0xa7, 0xdc, 0x0d, 0x9d, 0x28, 0xff, 0x31, 0xcd, 0xa2, 0xf2, - 0x12, 0xa4, 0x8f, 0x0e, 0x6e, 0x82, 0xa0, 0x1c, 0xad, 0xbf, 0x17, 0x2f, - 0x13, 0x58, 0x41, 0x77, 0x55, 0x73, 0xca, 0x23, 0xa9, 0x28, 0xe8, 0x27, - 0x99, 0xed, 0xe7, 0x2f, 0x8c, 0x43, 0x76, 0x56, 0xf5, 0xc9, 0xf8, 0xea, - 0x71, 0x22, 0x04, 0x15, 0x01, 0x07, 0x05, 0x0c, 0x60, 0xf9, 0xa9, 0xdf, - 0x9e, 0xca, 0xe3, 0x4e, 0xf3, 0x27, 0x18, 0x9d, 0xe2, 0x1a, 0x55, 0x90, - 0x01, 0x89, 0x4f, 0xb5, 0xbe, 0x20, 0xa0, 0x8e, 0xf5, 0x14, 0x06, 0xec, - 0xb1, 0x2f, 0x2f, 0xc8, 0x6b, 0x1c, 0xc2, 0x04, 0x8e, 0xa2, 0x91, 0x68, - 0x3c, 0x63, 0x67, 0x44, 0xd7, 0x58, 0x18, 0x20, 0x4f, 0xc3, 0xd8, 0xc5, - 0xcf, 0x36, 0x8e, 0x9a, 0xac, 0xda, 0x7b, 0x1f, 0xbb, 0x84, 0x99, 0x58, - 0x0a, 0xcd, 0x0c, 0x25, 0x5e, 0x4b, 0x50, 0x19, 0x8e, 0x77, 0xc4, 0xc6, - 0x1d, 0x98, 0x97, 0xaf, 0x20, 0xda, 0x5f, 0x16, 0xb7, 0x06, 0x6c, 0x0e, - 0xc6, 0x1d, 0x6b, 0x67, 0xbb, 0x19, 0x70, 0x11, 0x9c, 0x9f, 0xdc, 0x1e, - 0xe7, 0xca, 0x88, 0x47, 0xff, 0x4d, 0xf7, 0xe8, 0xd4, 0x7c, 0xc1, 0x52, - 0xea, 0xce, 0x29, 0x91, 0x4a, 0xcf, 0xc2, 0xb0, 0x0e, 0xac, 0xbe, 0x78, - 0x1d, 0x05, 0x48, 0x98, 0x7b, 0xe8, 0x0b, 0x13, 0xda, 0x4e, 0x57, 0x08, - 0x86, 0xdd, 0xe6, 0x36, 0xca, 0x8d, 0x3f, 0xed, 0xb6, 0x9e, 0x07, 0x70, - 0x2e, 0x48, 0x23, 0xf9, 0x44, 0xc5, 0x27, 0xd0, 0xd2, 0x22, 0x72, 0x2b, - 0x79, 0xcf, 0xeb, 0x4b, 0x53, 0xfb, 0xc6, 0x72, 0x28, 0x12, 0xb2, 0x72, - 0xe5, 0xef, 0xde, 0x53, 0x98, 0x19, 0x5d, 0xf7, 0xb8, 0xf5, 0x9a, 0x3e, - 0x5c, 0x2d, 0xd4, 0x7e, 0xa1, 0xba, 0xde, 0x89, 0xd5, 0x09, 0xca, 0xbe, - 0x38, 0x1f, 0xf0, 0x0f, 0xe8, 0xd2, 0x06, 0x56, 0xef, 0x1c, 0xa0, 0xae, - 0x9a, 0x86, 0x24, 0x23, 0x1b, 0x74, 0x68, 0x86, 0x16, 0xa6, 0x85, 0xde, - 0xaa, 0x28, 0x77, 0xa9, 0x66, 0x20, 0x23, 0x9b, 0xb7, 0xf4, 0xd7, 0x26, - 0xdf, 0x70, 0x6b, 0xbf, 0x2f, 0x10, 0x2f, 0x15, 0x52, 0x35, 0x4a, 0x5f, - 0xb0, 0xb1, 0xf4, 0x74, 0x8a, 0xdd, 0x29, 0x95, 0x9f, 0x69, 0x36, 0xf7, - 0xe3, 0x75, 0x0e, 0xa1, 0xa4, 0x43, 0xc4, 0xcb, 0xd3, 0xac, 0xbb, 0x9f, - 0x5f, 0x9e, 0x02, 0xeb, 0xb4, 0x6d, 0xc5, 0x2b, 0x78, 0x81, 0x89, 0xf9, - 0xb2, 0xdf, 0xf6, 0x6b, 0x2c, 0xc4, 0x12, 0x44, 0xb8, 0x5d, 0x67, 0xd4, - 0xe0, 0xac, 0x7a, 0xf5, 0x91, 0x39, 0xcf, 0xb3, 0x77, 0x70, 0x6c, 0x5d, - 0xa0, 0xa9, 0x39, 0xd4, 0x52, 0x30, 0xcd, 0x19, 0x74, 0xdd, 0xae, 0x1d, - 0xa5, 0x8e, 0xe9, 0xca, 0x62, 0x0a, 0xa6, 0xb6, 0x1b, 0xd3, 0x98, 0xcb, - 0x74, 0x6e, 0xcd, 0x28, 0x2b, 0x07, 0x58, 0xe8, 0x38, 0x33, 0x09, 0x70, - 0xf2, 0xb0, 0x47, 0x75, 0x38, 0x94, 0xf8, 0xc8, 0x98, 0x2c, 0x72, 0xe9, - 0x01, 0x7e, 0xf6, 0x9b, 0x83, 0xda, 0x85, 0xfd, 0x42, 0x49, 0x8f, 0x8a, - 0xdb, 0xa0, 0xc5, 0x29, 0x14, 0x54, 0xc1, 0x18, 0x27, 0x19, 0x16, 0x8d, - 0x56, 0xb1, 0x97, 0x00, 0x4e, 0xa4, 0x14, 0x1d, 0x41, 0xf4, 0xdb, 0x10, - 0xc2, 0xba, 0xf9, 0xb5, 0x74, 0x15, 0xe1, 0xfa, 0xc6, 0x13, 0x05, 0xce, - 0x22, 0xf4, 0x7d, 0x21, 0x60, 0xde, 0x6f, 0x7a, 0xb6, 0xdf, 0xb6, 0xcd, - 0xd0, 0x20, 0x2f, 0x3b, 0x9b, 0x00, 0xc4, 0x99, 0x31, 0xb4, 0x75, 0x91, - 0x94, 0x19, 0xd3, 0x27, 0xda, 0xbd, 0x82, 0xc0, 0x88, 0x98, 0xda, 0x1c, - 0xe3, 0xda, 0x91, 0xc3, 0x6f, 0x56, 0x91, 0x80, 0x47, 0x60, 0xec, 0x38, - 0x86, 0xdd, 0x9b, 0x7c, 0x4c, 0xa4, 0x4a, 0x2f, 0xa8, 0xc8, 0x8b, 0x26, - 0x35, 0xfb, 0xe0, 0xea, 0xbb, 0xfc, 0x01, 0x55, 0x7f, 0x43, 0x07, 0xa0, - 0x35, 0xc2, 0xa3, 0xd5, 0xd1, 0x69, 0x83, 0x46, 0xcd, 0x1e, 0x37, 0xaf, - 0xc1, 0xe4, 0x4a, 0x09, 0x83, 0xd7, 0xed, 0x86, 0xbc, 0x62, 0x11, 0x60, - 0x79, 0x92, 0x54, 0xd4, 0xca, 0xab, 0xb8, 0xfb, 0xda, 0x8a, 0x32, 0x6c, - 0x66, 0xcc, 0x57, 0x80, 0x2d, 0xe5, 0x3f, 0x8a, 0x19, 0x9c, 0x71, 0x24, - 0xc1, 0xa2, 0x18, 0x5e, 0x2a, 0x13, 0x44, 0x1b, 0x63, 0xaf, 0xca, 0xd2, - 0x0b, 0x02, 0xa0, 0x01, 0x7a, 0x70, 0x1a, 0xa4, 0x07, 0xc6, 0xa3, 0x16, - 0x8f, 0xd7, 0xd0, 0xff, 0x6c, 0xd5, 0xb5, 0x21, 0xcd, 0x08, 0x54, 0xc1, - 0x85, 0xc7, 0x2e, 0x9e, 0x55, 0xfa, 0x4d, 0xfd, 0x86, 0x53, 0x4c, 0x94, - 0x77, 0xd8, 0x13, 0x03, 0xdc, 0x7c, 0x46, 0xdf, 0x1d, 0x31, 0x66, 0x91, - 0x1c, 0x9a, 0xd0, 0xe7, 0xbf, 0xdf, 0x2e, 0x52, 0x82, 0x7d, 0x28, 0xb4, - 0xcc, 0x16, 0x17, 0x7a, 0x40, 0x1b, 0xde, 0x4c, 0x0e, 0xe1, 0x91, 0x25, - 0x5c, 0x6b, 0x03, 0x19, 0xf0, 0xdd, 0x0c, 0xab, 0xde, 0xb2, 0xa5, 0x95, - 0x25, 0xd0, 0xde, 0x64, 0xb8, 0x21, 0x91, 0x5b, 0x80, 0xd0, 0xc8, 0x62, - 0x34, 0x33, 0x5c, 0x00, 0x5e, 0x71, 0x73, 0xe0, 0x51, 0xca, 0x2f, 0xb1, - 0x29, 0x2f, 0x0c, 0xad, 0x77, 0x56, 0x4d, 0x0d, 0x28, 0x50, 0x47, 0x1a, - 0x35, 0x8b, 0xab, 0xfb, 0x49, 0x10, 0x15, 0x49, 0x4c, 0x2c, 0x8f, 0x84, - 0x02, 0x35, 0x91, 0x08, 0x8e, 0x7e, 0xe8, 0x30, 0xed, 0xfa, 0xfe, 0x7a, - 0xa2, 0x87, 0x36, 0xcf, 0x25, 0x89, 0x22, 0xb0, 0x3d, 0x0a, 0x38, 0xbb, - 0x54, 0x62, 0x85, 0x5e, 0x96, 0xc9, 0xef, 0x2a, 0x76, 0x22, 0x70, 0x30, - 0xcb, 0x7d, 0xfc, 0xb4, 0x35, 0xdc, 0x7d, 0x86, 0x7e, 0x92, 0xbb, 0xe9, - 0x2a, 0xfa, 0x57, 0xe0, 0x99, 0xc0, 0xad, 0x16, 0x2c, 0x30, 0x5a, 0xfb, - 0xb0, 0x93, 0x90, 0x9a, 0xd6, 0x6b, 0x99, 0xfa, 0x25, 0x60, 0x3b, 0xf1, - 0x0e, 0xe1, 0x5b, 0x30, 0xf9, 0x52, 0xe9, 0x07, 0xda, 0xc4, 0x21, 0x03, - 0x58, 0x70, 0x6b, 0x0f, 0xc0, 0x1b, 0xb7, 0x44, 0xff, 0x13, 0x63, 0x0f, - 0x90, 0xb6, 0x88, 0xb4, 0x70, 0x4f, 0x59, 0xed, 0x63, 0x93, 0xa2, 0x97, - 0x82, 0xe1, 0x1d, 0x6c, 0x72, 0x0b, 0x6e, 0x0c, 0x3d, 0x24, 0x81, 0x76, - 0x11, 0x22, 0xfa, 0xba, 0x5f, 0x7e, 0x96, 0xdd, 0x9b, 0x00, 0x80, 0x91, - 0x79, 0xb2, 0xb1, 0xad, 0x64, 0x98, 0x51, 0xbf, 0xb7, 0x73, 0x96, 0x7d, - 0x42, 0xba, 0x30, 0x9f, 0x75, 0x72, 0x7b, 0xb4, 0x56, 0x88, 0x41, 0xba, - 0x5d, 0xc0, 0xa1, 0x30, 0x07, 0x1a, 0x79, 0x60, 0xb7, 0x0f, 0xd8, 0x0a, - 0x51, 0xe7, 0x89, 0xc6, 0x54, 0x6d, 0xdd, 0x01, 0x63, 0xd8, 0x92, 0x15, - 0x32, 0x03, 0xaa, 0xf0, 0x5a, 0x5e, 0x6e, 0xcd, 0x32, 0x61, 0xe7, 0x67, - 0xf4, 0x09, 0xe9, 0x8e, 0xc4, 0xd6, 0x8b, 0x65, 0x22, 0x5b, 0xe3, 0xfe, - 0xbc, 0x6e, 0xad, 0xa3, 0x20, 0x12, 0x21, 0xab, 0x49, 0xa8, 0xe7, 0x6f, - 0x9b, 0xc1, 0x5d, 0x64, 0x80, 0xd4, 0x71, 0x87, 0x49, 0xe8, 0x1a, 0x3f, - 0x8d, 0x1e, 0x03, 0xea, 0x57, 0x49, 0xfa, 0x14, 0x12, 0x98, 0xf7, 0xf3, - 0xab, 0x0b, 0xae, 0xae, 0x48, 0x7e, 0x99, 0xf1, 0x12, 0xd0, 0xee, 0x19, - 0xd4, 0x9c, 0xb9, 0xaa, 0xfc, 0x09, 0x20, 0x25, 0x80, 0xe2, 0x4e, 0x11, - 0xe2, 0x1d, 0xa2, 0x8f, 0x50, 0x82, 0x62, 0x2d, 0xe2, 0x47, 0xab, 0x4a, - 0xad, 0xf4, 0x3e, 0xae, 0xc1, 0x7d, 0x6d, 0x5f, 0xd4, 0xd9, 0xde, 0x91, - 0x55, 0xa4, 0xea, 0x16, 0x1e, 0xff, 0xad, 0x68, 0xcb, 0x38, 0x09, 0x95, - 0xc7, 0x3c, 0xcb, 0x1f, 0xd7, 0x4f, 0x9d, 0x2c, 0x0c, 0x0f, 0x8f, 0x09, - 0xc8, 0x33, 0xa7, 0x39, 0xc7, 0xa6, 0xab, 0xdb, 0x5e, 0x42, 0x20, 0x93, - 0xb1, 0xbb, 0xba, 0x70, 0x62, 0xa6, 0x49, 0x99, 0xe9, 0x4a, 0x46, 0x2a, - 0xb1, 0x1c, 0xfe, 0xcd, 0xc7, 0x36, 0x62, 0x81, 0xf6, 0xb4, 0x7d, 0x2d, - 0x86, 0x62, 0xab, 0xbc, 0xcc, 0xd5, 0x3e, 0x86, 0x26, 0xa1, 0x96, 0xda, - 0x00, 0xd0, 0x09, 0x3b, 0xe9, 0x9b, 0x09, 0xed, 0xe7, 0x53, 0xdd, 0x2f, - 0x8f, 0x5a, 0xe4, 0x37, 0xc0, 0xe6, 0x7d, 0x98, 0xa3, 0xe4, 0x2f, 0x6a, - 0x25, 0xd7, 0xaf, 0xca, 0x89, 0x29, 0x93, 0x1c, 0x30, 0x93, 0x6c, 0x01, - 0x99, 0xd4, 0xe0, 0x44, 0x75, 0x59, 0x2b, 0x3d, 0xfe, 0x64, 0x20, 0x65, - 0xf0, 0x28, 0xa4, 0x78, 0x24, 0x8b, 0xb2, 0x0d, 0x31, 0xdb, 0x59, 0xa5, - 0x02, 0xa5, 0xcb, 0xa0, 0xf9, 0x5a, 0xe6, 0x17, 0x8a, 0x22, 0xe4, 0xf5, - 0x3c, 0xca, 0xa1, 0xac, 0xb9, 0x30, 0x80, 0x03, 0x06, 0x7d, 0x2f, 0xa2, - 0x67, 0xbd, 0xc6, 0x9c, 0xa5, 0x52, 0xf8, 0x98, 0xe4, 0xb4, 0x02, 0x2e, - 0x4b, 0x9d, 0x81, 0x3c, 0x23, 0xe2, 0x0e, 0xf4, 0x11, 0x63, 0x3d, 0x00, - 0x25, 0xc5, 0x22, 0xf1, 0xa1, 0xcc, 0x13, 0xa0, 0xf0, 0xf2, 0xa8, 0x6f, - 0xbd, 0xb5, 0x26, 0x1d, 0xc8, 0xbf, 0x25, 0x8f, 0x71, 0x16, 0x87, 0x72, - 0x4c, 0xaf, 0x71, 0xe4, 0x80, 0xc3, 0x58, 0x97, 0xc4, 0x48, 0x9f, 0xa7, - 0x3d, 0x72, 0xf4, 0xd3, 0x5e, 0x30, 0xc0, 0xe6, 0x31, 0xb7, 0x22, 0x6a, - 0xe5, 0xbc, 0x37, 0x27, 0xb5, 0xad, 0xda, 0x91, 0xa8, 0xce, 0x96, 0x59, - 0xee, 0x68, 0x4a, 0xc3, 0x33, 0xc6, 0xfc, 0x21, 0x4e, 0x0d, 0xdb, 0x8c, - 0xe1, 0x0c, 0xd8, 0x39, 0xde, 0xd6, 0x16, 0xc6, 0x31, 0x8b, 0xdc, 0xd5, - 0x09, 0x78, 0xd2, 0x25, 0xf8, 0xae, 0xed, 0xf9, 0xf0, 0x22, 0xe9, 0xec, - 0xee, 0x52, 0xe9, 0x69, 0x86, 0x82, 0xae, 0xca, 0x5d, 0xc3, 0x9f, 0x96, - 0x11, 0x3f, 0x22, 0xc0, 0x2e, 0xec, 0xa6, 0x0f, 0xe6, 0x7a, 0x6c, 0x9b, - 0xfc, 0xa1, 0x1c, 0x2d, 0xa2, 0xe2, 0x91, 0x1f, 0x2d, 0x01, 0xd4, 0x62, - 0x44, 0xc2, 0x04, 0x80, 0x34, 0x88, 0x06, 0xd6, 0xa8, 0x60, 0x87, 0xc8, - 0xd1, 0x11, 0x83, 0x1b, 0x4b, 0x3e, 0xcf, 0x66, 0x78, 0xdf, 0xb6, 0x31, - 0xd3, 0xf4, 0xbe, 0xda, 0xe9, 0x83, 0x0f, 0x8b, 0xdf, 0x61, 0x91, 0x92, - 0x07, 0x11, 0x9f, 0x86, 0xe5, 0xbf, 0xca, 0x30, 0xe7, 0x07, 0x4e, 0xd2, - 0x0f, 0xab, 0x8e, 0x17, 0xb3, 0x23, 0x02, 0x53, 0x97, 0x35, 0x9d, 0x38, - 0x95, 0x65, 0x4d, 0x61, 0x25, 0xb7, 0xb1, 0x04, 0x6e, 0x66, 0xfb, 0x20, - 0x0a, 0x30, 0xe0, 0xa4, 0x95, 0x64, 0x18, 0xab, 0x3f, 0xd4, 0x66, 0x07, - 0x03, 0x38, 0x1d, 0x70, 0x0a, 0xe8, 0x36, 0x73, 0xdb, 0x38, 0x2e, 0x9e, - 0x7a, 0xb1, 0x51, 0xf2, 0x4d, 0xf0, 0xbe, 0x3f, 0xe4, 0x10, 0xa9, 0x95, - 0x44, 0x37, 0x5d, 0x9b, 0x16, 0x1d, 0x25, 0x03, 0x60, 0x70, 0x31, 0xb0, - 0x57, 0xe3, 0x02, 0xed, 0xea, 0xe5, 0xfa, 0x35, 0x31, 0xe6, 0x69, 0xae, - 0x7b, 0xc2, 0x55, 0xf2, 0x14, 0xea, 0x08, 0x27, 0x03, 0xa7, 0x9e, 0x4b, - 0x99, 0x00, 0x8e, 0xc8, 0xaa, 0x75, 0xbf, 0x0a, 0x34, 0xc0, 0x92, 0x89, - 0x9f, 0xed, 0xde, 0x94, 0x54, 0x62, 0x77, 0xf7, 0x97, 0xf6, 0xf8, 0x85, - 0x37, 0x21, 0xa2, 0x29, 0x2d, 0xb4, 0x26, 0xba, 0x4e, 0x33, 0x75, 0x3b, - 0x37, 0x95, 0x34, 0xcc, 0xb6, 0x58, 0xce, 0x6c, 0xf5, 0x59, 0xf0, 0x2a, - 0xaa, 0x13, 0x5b, 0x52, 0xf0, 0x16, 0x4b, 0xde, 0xa2, 0x9c, 0xc0, 0x66, - 0x67, 0x6b, 0xe3, 0xea, 0x2e, 0x04, 0xe8, 0xe5, 0xcc, 0x2b, 0x06, 0xb3, - 0x25, 0xa2, 0x1f, 0x67, 0xe0, 0x60, 0xc1, 0x19, 0x45, 0x6a, 0xbe, 0x6e, - 0x31, 0x6d, 0xb3, 0xad, 0x76, 0x9c, 0x24, 0x9b, 0x65, 0x91, 0x00, 0x18, - 0x4e, 0xb6, 0x2a, 0x75, 0xe6, 0x13, 0x97, 0x82, 0x92, 0x54, 0xc0, 0xfc, - 0xa8, 0x3c, 0xcb, 0x7e, 0xde, 0xba, 0x51, 0xf1, 0xc9, 0x62, 0xed, 0xb8, - 0x97, 0xf7, 0x49, 0x4b, 0x6c, 0x4c, 0x39, 0xfb, 0xff, 0x74, 0xc4, 0x6e, - 0x53, 0x11, 0xe1, 0x56, 0xa9, 0x9d, 0xf5, 0xd0, 0x35, 0x67, 0xb1, 0x24, - 0xec, 0xea, 0xd2, 0x93, 0xe2, 0x6d, 0x98, 0xb7, 0xed, 0x05, 0x26, 0x96, - 0xac, 0xc5, 0x02, 0x00, 0x37, 0xf7, 0x73, 0xa1, 0x5c, 0xb9, 0x93, 0x25, - 0x0e, 0x7a, 0x55, 0xe9, 0xec, 0x3a, 0x90, 0xd5, 0xa3, 0xe4, 0x7f, 0x0f, - 0x5b, 0x62, 0xd1, 0x20, 0xb6, 0xe7, 0xa6, 0xbc, 0x84, 0xfa, 0xb8, 0xbf, - 0x3f, 0xf9, 0x2a, 0xaf, 0x7a, 0x3c, 0xdd, 0x03, 0x81, 0x39, 0x72, 0xe4, - 0x3d, 0xfd, 0xf1, 0x1c, 0x55, 0x01, 0x4a, 0x51, 0x9a, 0x35, 0xaa, 0x20, - 0x1e, 0x60, 0xd5, 0x5e, 0xbc, 0x47, 0x7a, 0xf6, 0xfb, 0x36, 0x09, 0xc2, - 0x8a, 0x56, 0xa9, 0xbe, 0x71, 0x8b, 0x56, 0x75, 0xb5, 0x47, 0xfc, 0x75, - 0x86, 0x8f, 0x2d, 0xd2, 0x9c, 0x39, 0x71, 0x4b, 0x77, 0xd0, 0xd5, 0x93, - 0x53, 0x7d, 0x14, 0x9d, 0xe8, 0xa6, 0x5f, 0x6e, 0x51, 0x88, 0x07, 0x54, - 0x41, 0xba, 0xa4, 0x34, 0x07, 0xad, 0xfa, 0xed, 0x44, 0xe4, 0x65, 0x16, - 0x7d, 0xbf, 0xc0, 0x0d, 0x45, 0x4f, 0xea, 0xf3, 0x69, 0x92, 0x67, 0xa4, - 0x0a, 0x0f, 0x65, 0xf6, 0x8a, 0x29, 0x44, 0x97, 0xc0, 0x08, 0x2c, 0xed, - 0x16, 0x56, 0x28, 0x16, 0x2a, 0xbd, 0x8e, 0x91, 0x17, 0x45, 0x96, 0xd2, - 0xf1, 0x63, 0xe0, 0xc6, 0x2b, 0x22, 0xbb, 0x85, 0x45, 0xda, 0x7e, 0x17, - 0x48, 0x0f, 0x8e, 0xb2, 0x91, 0x49, 0xe5, 0xef, 0x85, 0x8b, 0x09, 0x2e, - 0x9d, 0x89, 0x74, 0x02, 0x61, 0x25, 0xc4, 0x42, 0x27, 0x3e, 0x0e, 0xf5, - 0x63, 0x5b, 0xda, 0xb9, 0xf4, 0xb1, 0xbb, 0x93, 0xb2, 0x54, 0x3f, 0x7c, - 0x0a, 0x44, 0x19, 0xd7, 0xb3, 0xd7, 0xa4, 0xc1, 0xca, 0x87, 0xed, 0xb5, - 0x26, 0x0a, 0xa1, 0x5f, 0x7e, 0xdd, 0x1e, 0x37, 0x89, 0xf5, 0x8e, 0x92, - 0x7c, 0x22, 0x80, 0x62, 0x23, 0x05, 0x0c, 0xdd, 0x49, 0xa7, 0x28, 0x8a, - 0x9e, 0xe9, 0xac, 0x9e, 0x98, 0x51, 0x08, 0xfc, 0xb2, 0x4d, 0xa1, 0x2d, - 0xbe, 0xef, 0xf4, 0x76, 0x7f, 0x64, 0x88, 0x63, 0xfd, 0x6d, 0x43, 0x8e, - 0x6f, 0x80, 0xb2, 0xbd, 0x88, 0x61, 0xc5, 0x8b, 0x9e, 0x7f, 0x4b, 0xaa, - 0x71, 0x66, 0x46, 0xd8, 0xba, 0x9d, 0x24, 0x72, 0xf3, 0x42, 0x79, 0x7e, - 0xe0, 0xab, 0xf9, 0x4a, 0x17, 0xaf, 0x01, 0xef, 0x18, 0x1d, 0x40, 0x61, - 0x57, 0x6f, 0x0d, 0x71, 0x4f, 0x2e, 0x37, 0x4a, 0xc4, 0x0e, 0x3c, 0x8e, - 0x4d, 0xb1, 0x94, 0xcf, 0x20, 0x0e, 0x4e, 0x8c, 0xdb, 0x65, 0x2d, 0xcb, - 0xbd, 0xf3, 0xad, 0xa5, 0xaf, 0x74, 0x5a, 0x5f, 0x03, 0x22, 0x42, 0xda, - 0xd5, 0x79, 0x5b, 0xdf, 0xb6, 0x47, 0x5d, 0x11, 0x2d, 0x66, 0x68, 0x3a, - 0x8d, 0x15, 0x14, 0x01, 0xa4, 0xb3, 0x8b, 0x74, 0x70, 0xc9, 0xbd, 0x26, - 0x0a, 0x05, 0x21, 0x0f, 0xb7, 0xdd, 0x49, 0x4b, 0x24, 0xb3, 0xb0, 0x6a, - 0x1a, 0x98, 0x17, 0x14, 0x44, 0x8f, 0x92, 0x3f, 0x1f, 0x8f, 0x96, 0x8e, - 0xa2, 0x5f, 0x7d, 0xf9, 0xae, 0x09, 0xf7, 0xcd, 0x4b, 0x1e, 0x6d, 0xf8, - 0x7a, 0x2d, 0x60, 0x70, 0x9d, 0x3c, 0xbb, 0xaa, 0x60, 0x2a, 0xcb, 0x28, - 0x8d, 0x65, 0x40, 0xd4, 0x6e, 0x62, 0x64, 0x0f, 0xad, 0x37, 0x44, 0x92, - 0x7c, 0xe9, 0x83, 0x9c, 0x52, 0x64, 0x5d, 0x79, 0x4d, 0xe7, 0x89, 0x96, - 0x8c, 0x10, 0xd1, 0x72, 0x70, 0x8b, 0x57, 0x8b, 0x60, 0xdd, 0x43, 0x76, - 0xf9, 0x8c, 0x2d, 0x5f, 0x89, 0xdb, 0xee, 0x0b, 0xa8, 0xbc, 0x13, 0x4c, - 0xf5, 0x30, 0x73, 0x3b, 0xb2, 0xe7, 0xa6, 0x49, 0xb1, 0xad, 0x66, 0xbf, - 0x29, 0x08, 0x32, 0x07, 0xf0, 0xd5, 0xab, 0xf4, 0x44, 0x81, 0x08, 0xf8, - 0x8c, 0xa6, 0x95, 0x6a, 0xe4, 0x1e, 0x59, 0xde, 0x71, 0x84, 0x4f, 0x9a, - 0xd2, 0x88, 0xe7, 0xe4, 0x0f, 0xc2, 0x57, 0x8e, 0x5c, 0xe7, 0xb2, 0x9f, - 0xb2, 0x7e, 0x46, 0x51, 0x94, 0x82, 0x42, 0xd3, 0x97, 0xfd, 0xcb, 0x9a, - 0x1f, 0xc3, 0xbf, 0xf9, 0x71, 0x58, 0x4c, 0x42, 0x0c, 0xcf, 0x54, 0x12, - 0xa9, 0xc8, 0xee, 0x2f, 0x4e, 0x07, 0x6b, 0x81, 0x97, 0xa1, 0x05, 0xd2, - 0x89, 0x48, 0xff, 0x36, 0xfd, 0xa3, 0x8b, 0xa9, 0xae, 0x4e, 0x0e, 0x74, - 0x95, 0xc9, 0x3d, 0x47, 0xf6, 0xf5, 0x72, 0xd7, 0x1b, 0x6d, 0xb5, 0x76, - 0xf0, 0xb3, 0xe3, 0xfe, 0xdd, 0x37, 0xdc, 0xa2, 0x81, 0xb6, 0x6c, 0xeb, - 0x2b, 0xb7, 0x88, 0x2a, 0x96, 0xdf, 0x04, 0xcc, 0x0c, 0x65, 0x8c, 0x7f, - 0x6c, 0x46, 0x7e, 0xc7, 0x7c, 0x8c, 0xef, 0x3b, 0x3e, 0x1a, 0x7b, 0x48, - 0x51, 0xb6, 0xa0, 0xa0, 0x2d, 0x6e, 0x3a, 0x3c, 0x44, 0x93, 0xa9, 0xce, - 0x1b, 0xde, 0x79, 0x2b, 0x3d, 0x08, 0xec, 0xa2, 0x02, 0x39, 0xc4, 0x2a, - 0xe9, 0x7e, 0xca, 0x54, 0xb6, 0x9e, 0xd1, 0xc2, 0x49, 0x49, 0x66, 0x17, - 0x4f, 0xd8, 0xf2, 0x75, 0xe8, 0x45, 0x67, 0xfd, 0x3b, 0x48, 0xbd, 0x63, - 0xc2, 0x2e, 0x0a, 0x56, 0xf0, 0x69, 0x47, 0xf2, 0x47, 0x7a, 0xba, 0x08, - 0x0c, 0xdf, 0xa1, 0xf9, 0x55, 0x81, 0x78, 0x73, 0xc7, 0x8b, 0x92, 0x3b, - 0x9c, 0x56, 0x2a, 0x2b, 0xed, 0xf5, 0x01, 0xbe, 0xe5, 0x5e, 0x2d, 0xfd, - 0xc2, 0xea, 0xbe, 0x24, 0xf8, 0x2e, 0x7e, 0x04, 0xf6, 0xec, 0x67, 0x30, - 0x41, 0x9f, 0x5d, 0xd9, 0xd2, 0x1f, 0x76, 0x7d, 0xfe, 0xee, 0x17, 0xd8, - 0x94, 0x2e, 0x2f, 0x98, 0x2e, 0xb2, 0x52, 0x43, 0xa5, 0xc0, 0xf6, 0x59, - 0xc6, 0xee, 0xd5, 0xe7, 0x74, 0x74, 0x17, 0x3b, 0xa0, 0x1f, 0xbd, 0x24, - 0x29, 0x46, 0x5f, 0xc2, 0xf0, 0x29, 0x7f, 0x58, 0x3e, 0xc1, 0x32, 0x9f, - 0x4b, 0x60, 0xfa, 0xc3, 0x8c, 0x68, 0xbf, 0x6f, 0xf8, 0x83, 0xdb, 0xa1, - 0x03, 0xf1, 0xb9, 0xbc, 0xea, 0x29, 0x27, 0xfe, 0xad, 0x2b, 0x2b, 0x48, - 0x04, 0x83, 0xf9, 0xca, 0x6a, 0xe6, 0x23, 0xb7, 0xed, 0xb8, 0xb4, 0x65, - 0x1f, 0x3d, 0xa8, 0x68, 0x94, 0x16, 0xb4, 0xe4, 0x97, 0xd1, 0xf5, 0x55, - 0x77, 0x4e, 0xf6, 0x72, 0x77, 0x0c, 0x3f, 0x21, 0xcb, 0xad, 0x9e, 0xee, - 0x1c, 0x82, 0x51, 0x89, 0x97, 0x11, 0x3b, 0x87, 0x39, 0x41, 0x7e, 0xeb, - 0x6e, 0x8d, 0xbb, 0x6d, 0x3f, 0xb8, 0x78, 0xc6, 0x5e, 0x0d, 0x42, 0xcf, - 0xad, 0xc7, 0xd3, 0xde, 0x68, 0x57, 0x15, 0xce, 0xba, 0x3e, 0xdc, 0x27, - 0xc7, 0x77, 0x5c, 0xe1, 0x85, 0xbd, 0x52, 0xc3, 0x15, 0xb9, 0xf3, 0xaa, - 0xa4, 0x3f, 0x95, 0xc8, 0x0b, 0xb9, 0xa1, 0x56, 0xab, 0x8c, 0x96, 0xc2, - 0x98, 0x93, 0xd0, 0x63, 0x7d, 0x64, 0x3e, 0x8b, 0x40, 0xdb, 0xd1, 0xce, - 0x0c, 0x4c, 0x1a, 0xf7, 0x7e, 0xe8, 0xe2, 0x26, 0xf4, 0xdd, 0x50, 0xcc, - 0x28, 0x30, 0x26, 0x8d, 0x3a, 0x9a, 0x62, 0x7f, 0xe9, 0xea, 0x25, 0xf9, - 0x11, 0x1d, 0x8c, 0x26, 0x82, 0x61, 0x85, 0x34, 0x9b, 0x66, 0x4d, 0x9c, - 0xb2, 0xee, 0x73, 0xcb, 0x53, 0x68, 0x8c, 0x97, 0xd6, 0x1e, 0x0c, 0x07, - 0x11, 0x4b, 0x71, 0x9a, 0x84, 0x57, 0x5d, 0xa8, 0xae, 0x4f, 0x8b, 0xfa, - 0x26, 0x67, 0x13, 0xd1, 0x4e, 0xd5, 0x54, 0xa2, 0x5c, 0x68, 0xfe, 0x56, - 0x14, 0x00, 0xd4, 0xd0, 0xa5, 0xc8, 0xf2, 0xb9, 0x6a, 0x4d, 0x82, 0xb7, - 0x17, 0x97, 0xb2, 0x71, 0xe8, 0xb4, 0x4a, 0x8c, 0x94, 0xf1, 0x42, 0xa6, - 0xa5, 0x57, 0x95, 0xdd, 0x57, 0xb3, 0x1e, 0x6e, 0x42, 0x29, 0x0d, 0x87, - 0x6f, 0xd8, 0xd6, 0x0a, 0x38, 0xfe, 0x0d, 0x8b, 0x79, 0xa2, 0x46, 0xad, - 0x89, 0xe8, 0x96, 0x2e, 0xf0, 0x1b, 0x56, 0x83, 0x7b, 0x05, 0x13, 0x6a, - 0xdc, 0xd6, 0xd5, 0x7a, 0xe0, 0xfb, 0xb8, 0xbf, 0x4c, 0x0a, 0x77, 0xcc, - 0xc3, 0xe6, 0xaa, 0x9a, 0x97, 0xc3, 0x20, 0xd5, 0x9f, 0x88, 0x55, 0x91, - 0x09, 0x74, 0x93, 0xb0, 0xd3, 0xd2, 0x92, 0xd9, 0xba, 0xfa, 0xaa, 0x91, - 0x9c, 0x04, 0x01, 0x21, 0x44, 0x4c, 0x3a, 0xb7, 0xe9, 0xc2, 0x90, 0x1e, - 0xb2, 0x0f, 0x0b, 0x6e, 0x94, 0x21, 0x28, 0xe1, 0xc6, 0xe1, 0xaf, 0x6c, - 0x81, 0x48, 0x97, 0x1d, 0x16, 0x78, 0x30, 0x07, 0x18, 0xf6, 0x86, 0x28, - 0x94, 0x9d, 0x0a, 0x4a, 0x27, 0xd9, 0xeb, 0x0e, 0xfe, 0x81, 0xd1, 0xe0, - 0xf0, 0x4f, 0xbe, 0x2c, 0x02, 0x3a, 0x13, 0xed, 0x8b, 0xed, 0xc4, 0x17, - 0xa8, 0xcb, 0xe7, 0x55, 0x09, 0x08, 0xb8, 0x7f, 0xd4, 0x84, 0x60, 0xb1, - 0x43, 0x30, 0x5a, 0x1a, 0x4c, 0x46, 0xb2, 0x20, 0x79, 0xbe, 0x54, 0x13, - 0x11, 0xea, 0xf9, 0xb4, 0x5b, 0x62, 0x0d, 0xb6, 0x42, 0xff, 0x86, 0x38, - 0x81, 0xc3, 0x00, 0xd5, 0x7a, 0xbb, 0x8e, 0x5c, 0x4f, 0x22, 0x79, 0x08, - 0x5f, 0x3f, 0x98, 0x20, 0xfe, 0x16, 0x5a, 0x04, 0xfb, 0x7e, 0x96, 0xce, - 0xc2, 0x7d, 0x33, 0x44, 0xf5, 0x28, 0xa6, 0xbf, 0x5c, 0x6f, 0x0e, 0x82, - 0x6d, 0x95, 0x2c, 0xae, 0x57, 0x58, 0xb9, 0x41, 0x9f, 0x47, 0xc6, 0x6f, - 0x28, 0xcc, 0xa1, 0xe3, 0x31, 0x47, 0x01, 0x9e, 0xdd, 0x26, 0xc0, 0x71, - 0x7e, 0xb5, 0xb7, 0x44, 0x3f, 0xee, 0x49, 0x2b, 0x00, 0x0e, 0x4e, 0x93, - 0x24, 0xa3, 0xcd, 0xdf, 0xe0, 0x97, 0xf7, 0xa5, 0xfb, 0xed, 0x4f, 0x8c, - 0xbb, 0xcc, 0x81, 0x2e, 0xdf, 0xc4, 0x32, 0x38, 0x4c, 0x21, 0x1a, 0x83, - 0xb9, 0xb1, 0x96, 0x13, 0x14, 0x54, 0xcd, 0xa7, 0x7e, 0xbb, 0xa5, 0xc4, - 0x96, 0x56, 0x63, 0xfc, 0xe2, 0x80, 0x70, 0x06, 0x2f, 0x28, 0xa8, 0x30, - 0x7a, 0x10, 0x96, 0xf0, 0xc4, 0x57, 0x4b, 0xf2, 0x3e, 0x98, 0xe7, 0x62, - 0xf3, 0x87, 0xab, 0x27, 0x33, 0x8a, 0x10, 0x8a, 0x56, 0x27, 0x52, 0x66, - 0xdc, 0x4c, 0xfe, 0x8c, 0xf3, 0x57, 0xf6, 0x95, 0xe6, 0x17, 0x3d, 0x91, - 0x72, 0xa3, 0xdc, 0x46, 0xdf, 0x57, 0x8c, 0x2b, 0x1a, 0x77, 0xd5, 0xd3, - 0x30, 0xae, 0x22, 0xd1, 0x5f, 0x3a, 0xfd, 0x8a, 0x74, 0x80, 0x90, 0x1d, - 0xa4, 0xac, 0xa6, 0x20, 0x5c, 0x29, 0x9c, 0x23, 0x3e, 0xd7, 0xd4, 0xa1, - 0x0d, 0xba, 0xa2, 0x66, 0x71, 0xa9, 0xbf, 0xa2, 0x52, 0xd7, 0x04, 0x5b, - 0x17, 0x82, 0xd9, 0x8f, 0x09, 0xd3, 0xbb, 0x51, 0xc0, 0x73, 0xd0, 0x43, - 0x3f, 0x61, 0x11, 0x9b, 0xbf, 0xe9, 0x9b, 0x2a, 0x4a, 0xb2, 0xd9, 0xe6, - 0x7d, 0xa6, 0xa9, 0xa3, 0xea, 0x20, 0x31, 0x0b, 0xd1, 0xd7, 0xd0, 0xe0, - 0x20, 0xdf, 0x97, 0x99, 0xa1, 0x16, 0xd5, 0x31, 0x91, 0x2f, 0xd3, 0xc5, - 0xff, 0x00, 0x95, 0xfd, 0x3c, 0x19, 0x7d, 0xcc, 0x99, 0x5d, 0x35, 0x40, - 0x79, 0x1b, 0x9d, 0xf6, 0x74, 0xd9, 0xd9, 0x53, 0x5f, 0x2e, 0x2e, 0xcc, - 0xd8, 0x5a, 0xb3, 0x9f, 0xac, 0x2a, 0x26, 0x85, 0x0a, 0x16, 0x91, 0x99, - 0x3d, 0x6c, 0xad, 0xc3, 0x34, 0x71, 0x1b, 0xbf, 0x13, 0x64, 0x1b, 0x81, - 0x63, 0xd5, 0x84, 0x3f, 0xb3, 0x17, 0x08, 0xc0, 0x30, 0xa6, 0x89, 0x29, - 0x9d, 0x3c, 0xc6, 0xdf, 0x08, 0xb0, 0xe2, 0xf4, 0xa6, 0xb7, 0xb0, 0xe8, - 0xdd, 0xa2, 0xa6, 0x28, 0x7d, 0x18, 0xb8, 0x7b, 0x83, 0x55, 0x03, 0xd9, - 0x3e, 0xe9, 0x6b, 0xbc, 0x57, 0xe1, 0x60, 0x96, 0x48, 0x49, 0x70, 0x39, - 0x29, 0xaa, 0x40, 0x0c, 0x78, 0x94, 0x83, 0x3e, 0xaa, 0xb7, 0x51, 0xb1, - 0x7a, 0x37, 0x7b, 0x31, 0xe6, 0x8c, 0xd5, 0x5f, 0x3c, 0xcd, 0x76, 0x3f, - 0xe6, 0x5a, 0x14, 0x7e, 0x55, 0x83, 0x68, 0xc8, 0x9e, 0x58, 0xe7, 0x05, - 0xab, 0xce, 0xa7, 0x58, 0xe7, 0xc3, 0x86, 0x14, 0xca, 0xab, 0x08, 0x6a, - 0x3f, 0x6b, 0xd7, 0xbe, 0x09, 0x5e, 0xce, 0x3f, 0x33, 0x0e, 0x5b, 0xee, - 0x00, 0x57, 0x33, 0x97, 0xcd, 0xa4, 0x5f, 0x39, 0xa3, 0xe6, 0xbb, 0xcc, - 0x46, 0x7f, 0x58, 0x91, 0xfd, 0x23, 0x34, 0xdd, 0x12, 0xf4, 0x4c, 0x14, - 0x42, 0x60, 0x98, 0xc1, 0xfb, 0xf3, 0xe5, 0x9c, 0xad, 0x1c, 0x02, 0x4c, - 0x43, 0xb6, 0xb6, 0x63, 0xb0, 0x58, 0x8c, 0x26, 0x69, 0x3e, 0x70, 0xa8, - 0x5c, 0xef, 0xf2, 0xf7, 0xcf, 0x31, 0x19, 0xb4, 0x79, 0x40, 0x29, 0x92, - 0x4f, 0xdc, 0x5e, 0x14, 0x65, 0x26, 0x06, 0x34, 0x0e, 0x35, 0x72, 0xe4, - 0x31, 0xb8, 0x0b, 0x2d, 0xe7, 0x23, 0x4f, 0x45, 0xea, 0x59, 0xa7, 0x17, - 0xc6, 0xa4, 0xdf, 0x2c, 0x95, 0xa8, 0xbe, 0x54, 0x0a, 0x45, 0x69, 0xd6, - 0x3b, 0x57, 0x48, 0x0b, 0x68, 0x8e, 0x42, 0xd5, 0x14, 0xa8, 0x25, 0x15, - 0x0e, 0x88, 0x24, 0xee, 0x35, 0x92, 0xe0, 0x5c, 0x22, 0xb1, 0x19, 0x71, - 0x3d, 0xa5, 0x7c, 0xc9, 0x3c, 0x49, 0x88, 0xb5, 0xa8, 0x0d, 0x37, 0xb2, - 0x68, 0xfc, 0x36, 0x82, 0xcc, 0x85, 0x35, 0xbe, 0x88, 0x5d, 0x80, 0xdf, - 0xff, 0xbc, 0xd9, 0x28, 0xa7, 0xfc, 0xcf, 0x3e, 0xe8, 0x6c, 0xb6, 0x46, - 0xb8, 0xd9, 0xbc, 0x9c, 0xd6, 0x7d, 0x0e, 0x8c, 0xda, 0x2f, 0x6f, 0x59, - 0x5f, 0x8c, 0x8e, 0x6a, 0x02, 0xdd, 0x15, 0x8c, 0x30, 0xac, 0x7e, 0x91, - 0x96, 0x99, 0x52, 0x7a, 0xa5, 0xa0, 0xd5, 0x8d, 0x39, 0xee, 0x44, 0x5a, - 0xdc, 0x75, 0x1a, 0x6a, 0x9f, 0xc8, 0x2d, 0xab, 0xfa, 0xfc, 0xb2, 0x35, - 0x18, 0x27, 0xbc, 0x93, 0x39, 0xc2, 0x50, 0xa3, 0x7b, 0xa1, 0x90, 0xcc, - 0xcc, 0xce, 0x20, 0x15, 0xee, 0x56, 0x25, 0xee, 0x35, 0x92, 0xe0, 0x5c, - 0x22, 0xb9, 0x1f, 0x71, 0x3d, 0xa5, 0x7c, 0xc9, 0x3c, 0x49, 0x88, 0xb5, - 0xa8, 0x0d, 0x37, 0xb2, 0x68, 0xfc, 0x36, 0x82, 0x41, 0x4b, 0x50, 0x04, - 0x67, 0x8f, 0x32, 0x7e, 0x75, 0x27, 0x3b, 0x58, 0x38, 0xbb, 0xf7, 0x60, - 0x09, 0xeb, 0x2d, 0x42, 0x94, 0xa4, 0xe4, 0x68, 0x16, 0x6c, 0x70, 0x47, - 0xc6, 0x57, 0x18, 0xb5, 0x5c, 0x8c, 0x8e, 0x6a, 0x02, 0xd5, 0x0b, 0x8c, - 0x30, 0xac, 0x7e, 0x91, 0x96, 0x99, 0x52, 0x7a, 0xa5, 0xa0, 0xd5, 0x8d, - 0x39, 0xee, 0x44, 0x5a, 0xdc, 0x75, 0x1a, 0x6a, 0x9f, 0xc8, 0x2d, 0xab, - 0xb7, 0x91, 0x27, 0x57, 0x22, 0x26, 0x97, 0x47, 0xc9, 0x02, 0x94, 0x26, - 0x82, 0xe5, 0x7f, 0x45, 0x10, 0xa2, 0x87, 0xf0, 0xad, 0xcf, 0x60, 0x40, - 0x32, 0xc5, 0x3f, 0x3f, 0x3a, 0x03, 0x19, 0x4f, 0xe4, 0xf8, 0x88, 0x44, - 0x41, 0xe4, 0x42, 0x19, 0xd0, 0x85, 0xa5, 0x6e, 0xf4, 0x6e, 0xa9, 0x9d, - 0xfa, 0x2b, 0x65, 0x7e, 0x02, 0x7d, 0x41, 0xf7, 0xaf, 0xf3, 0xa8, 0x2f, - 0x5b, 0xac, 0xa6, 0xd2, 0x8c, 0x9b, 0xfe, 0xc9, 0x45, 0x0a, 0x48, 0x46, - 0x90, 0xd9, 0x74, 0x78, 0xeb, 0x80, 0x93, 0x53, 0x00, 0xd6, 0x91, 0x50, - 0xe3, 0xf5, 0xac, 0xd1, 0xd5, 0xfe, 0x89, 0xe9, 0x62, 0x95, 0xe4, 0xc4, - 0x4b, 0xc8, 0x67, 0xd6, 0xba, 0x52, 0xce, 0x5a, 0x09, 0x87, 0xbe, 0xbf, - 0xb1, 0x7f, 0x26, 0x10, 0xe1, 0x19, 0x8f, 0x13, 0x70, 0xcc, 0xd9, 0x02, - 0x0d, 0xd4, 0xc1, 0x02, 0x2b, 0xde, 0x35, 0xcc, 0x74, 0x5d, 0x48, 0xe7, - 0x27, 0xa2, 0xb0, 0x2d, 0x9d, 0xb8, 0xe0, 0x01, 0x11, 0xc0, 0xa6, 0x41, - 0x0f, 0x77, 0xb2, 0x71, 0x44, 0xbd, 0x46, 0xa3, 0x1e, 0x87, 0xe2, 0x65, - 0x91, 0x1c, 0x25, 0x47, 0x19, 0x15, 0xdd, 0x8f, 0x28, 0xb7, 0xc9, 0xdf, - 0x85, 0x2c, 0x97, 0x0f, 0x43, 0x03, 0x21, 0x34, 0xd8, 0x07, 0x41, 0x72, - 0x98, 0x7b, 0x51, 0xff, 0x45, 0x2b, 0x4b, 0x9e, 0xd7, 0x41, 0x68, 0xe1, - 0x4f, 0x75, 0x9f, 0xfb, 0xb0, 0x33, 0xfe, 0x76, 0x27, 0xee, 0xf1, 0xe8, - 0xac, 0x32, 0xca, 0xfd, 0x09, 0x16, 0xcd, 0x84, 0x3a, 0xac, 0xc5, 0xc8, - 0x85, 0x2c, 0x97, 0x0f, 0x43, 0x03, 0x21, 0x34, 0x64, 0x9c, 0x1c, 0xae, - 0xb0, 0x74, 0x32, 0xb6, 0x2b, 0x85, 0xc8, 0xd0, 0x19, 0x81, 0xf6, 0xb1, - 0xce, 0x95, 0xc0, 0x49, 0x5e, 0xb9, 0x69, 0xbe, 0x7d, 0xb9, 0x0e, 0xe0, - 0xee, 0x86, 0xb9, 0x50, 0x13, 0x17, 0xcd, 0x9d, 0x3a, 0xac, 0xc5, 0xc8, - 0x85, 0x2c, 0x97, 0x0f, 0x43, 0x03, 0x21, 0x34, 0xd2, 0x57, 0x18, 0x2d, - 0x29, 0x52, 0x00, 0xd1, 0xdc, 0x2e, 0xbc, 0xa3, 0xde, 0x9e, 0x6a, 0xb4, - 0x4f, 0x75, 0x9f, 0xfb, 0xb0, 0x33, 0xfe, 0x75, 0x27, 0xee, 0xf1, 0xe8, - 0xac, 0x32, 0xca, 0xfd, 0x09, 0x16, 0xcd, 0x84, 0x3a, 0xac, 0xc5, 0xc8, - 0x85, 0x2c, 0x97, 0x0f, 0x43, 0x03, 0x21, 0x34, 0x72, 0xa8, 0xb9, 0x72, - 0x20, 0x7e, 0x7f, 0xe5, 0xab, 0x65, 0x62, 0x51, 0x65, 0xac, 0x38, 0xcf, - 0xce, 0x95, 0xc0, 0x49, 0x5e, 0xb9, 0x69, 0xbd, 0x7d, 0xb9, 0x0e, 0xe0, - 0xee, 0x86, 0xb9, 0x50, 0x0e, 0xfb, 0x2d, 0x62, 0x53, 0x2c, 0xf6, 0xfc, - 0x00, 0xea, 0xf0, 0x86, 0xc4, 0x53, 0xb6, 0xe2, 0xd9, 0xa3, 0x09, 0x26, - 0x26, 0xc1, 0x83, 0x31, 0x1d, 0xf0, 0xf4, 0xd9, 0xe5, 0xea, 0x26, 0xf3, - 0x8c, 0x71, 0x26, 0x25, 0xdb, 0x4f, 0x57, 0x0b, 0xdf, 0x79, 0x9c, 0x19, - 0xc0, 0xce, 0x61, 0x27, 0xcf, 0x46, 0x64, 0xac, 0xa1, 0x7f, 0x4d, 0x09, - 0x3f, 0x75, 0x0f, 0xb2, 0x90, 0xc5, 0x68, 0x72, 0xf5, 0x29, 0x7d, 0x18, - 0x85, 0x81, 0x8a, 0x42, 0x20, 0xf6, 0x44, 0x4d, 0x31, 0x72, 0x9f, 0x67, - 0x01, 0xde, 0x8a, 0xdb, 0xb7, 0x7a, 0x05, 0x7a, 0x8f, 0x14, 0xfe, 0xea, - 0x41, 0xc4, 0x64, 0x90, 0x6b, 0x6b, 0x8f, 0x74, 0xd2, 0x9e, 0xcd, 0x8e, - 0xc9, 0x2c, 0xfd, 0x4f, 0x51, 0x8b, 0x54, 0xbf, 0x76, 0x70, 0x6b, 0x4c, - 0x56, 0xe4, 0x5e, 0x26, 0x7f, 0x5f, 0xb7, 0x65, 0x8a, 0x42, 0xa1, 0xfb, - 0x77, 0xb6, 0xc6, 0x68, 0xbb, 0x19, 0xee, 0xee, 0xb0, 0xd0, 0x9f, 0x47, - 0xa5, 0x82, 0x40, 0x34, 0x67, 0xec, 0x23, 0x84, 0xbb, 0x81, 0x5e, 0x25, - 0xdf, 0x4c, 0x3c, 0x10, 0xdc, 0xd1, 0x22, 0xb1, 0x97, 0xf7, 0x73, 0x0f, - 0xc2, 0x83, 0x21, 0x0e, 0x1c, 0xdf, 0x17, 0xd8, 0x2f, 0x34, 0x40, 0xce, - 0x06, 0x6c, 0xfa, 0xbc, 0x79, 0x7f, 0xfc, 0x67, 0x4b, 0xd2, 0xd4, 0x91, - 0x58, 0x87, 0x83, 0x08, 0x94, 0x45, 0xea, 0x66, 0xd5, 0x7c, 0x64, 0x12, - 0x60, 0xdb, 0x7f, 0xc3, 0x7d, 0x9a, 0xcd, 0xcb, 0xf6, 0x88, 0x7e, 0x8b, - 0x75, 0x1f, 0xf5, 0x01, 0x0e, 0xf6, 0xdf, 0x59, 0x6e, 0x85, 0xe6, 0x44, - 0x5a, 0xd6, 0x5e, 0xf5, 0x8a, 0x78, 0xee, 0x04, 0xb0, 0xd0, 0x9f, 0x47, - 0xa5, 0x82, 0x40, 0x34, 0x7d, 0x8b, 0x73, 0xc6, 0x20, 0xb6, 0xe2, 0x13, - 0x80, 0x77, 0x76, 0xb9, 0xa3, 0xa5, 0xdf, 0xec, 0xba, 0xeb, 0x9b, 0x27, - 0x00, 0xd6, 0xa9, 0x0e, 0x31, 0xf5, 0x68, 0xfa, 0x07, 0xa1, 0xd3, 0x69, - 0x78, 0x20, 0xa4, 0x68, 0x73, 0x46, 0xa3, 0xed, 0xb4, 0xc5, 0x3e, 0xb9, - 0x3a, 0xd6, 0x03, 0xe5, 0xb6, 0xa8, 0x55, 0x5d, 0x94, 0xbf, 0x43, 0x65, - 0x5a, 0x84, 0x7d, 0xa2, 0x2a, 0xbf, 0xf2, 0x13, 0x78, 0x38, 0xf1, 0x47, - 0x06, 0x4c, 0xa3, 0xed, 0xb4, 0xc5, 0x3e, 0xb9, 0x3c, 0xd6, 0x03, 0xe5, - 0x93, 0xa7, 0x79, 0x17, 0xbf, 0x4d, 0x97, 0x2a, 0xcc, 0x18, 0xde, 0x12, - 0x46, 0xba, 0x4f, 0x13, 0xee, 0x76, 0xe3, 0x07, 0xcb, 0x49, 0x25, 0x97, - 0x22, 0x8c, 0x50, 0x01, 0xb7, 0xf1, 0x78, 0x96, 0x26, 0xd5, 0xc0, 0x5a, - 0x39, 0xe0, 0x44, 0x51, 0xcd, 0x06, 0x41, 0x69, 0x40, 0xda, 0x05, 0xc3, - 0xab, 0xf1, 0x3c, 0xc8, 0x86, 0xf9, 0xca, 0x2d, 0x21, 0xe9, 0xf8, 0x71, - 0x0d, 0x8b, 0xec, 0xf4, 0x4e, 0xd3, 0x17, 0xbd, 0x39, 0x65, 0xd5, 0xb7, - 0xa8, 0x24, 0x75, 0xb8, 0xc5, 0x9e, 0xd0, 0xda, 0x80, 0x65, 0x46, 0x7b, - 0x07, 0x5e, 0xd3, 0x34, 0x39, 0x2c, 0x2d, 0xc6, 0x3c, 0x8a, 0x7f, 0x26, - 0xec, 0x0f, 0xf8, 0x89, 0xe2, 0xdf, 0x46, 0x21, 0x24, 0x7e, 0x59, 0x4d, - 0x08, 0x5e, 0xd9, 0x08, 0x97, 0x42, 0x02, 0xb2, 0x9c, 0xba, 0x91, 0x66, - 0x5e, 0x68, 0xe7, 0xa3, 0x17, 0x7a, 0xe4, 0xcc, 0x21, 0x54, 0x01, 0x33, - 0x3f, 0xdb, 0xa5, 0x20, 0x98, 0x59, 0xbb, 0xfa, 0x55, 0xec, 0xa8, 0xbc, - 0xba, 0xab, 0xe7, 0xcc, 0x04, 0x08, 0xa1, 0x07, 0x7f, 0x6a, 0xc8, 0xf1, - 0xa1, 0x59, 0x20, 0xaa, 0x42, 0xe6, 0xc1, 0x1f, 0xb0, 0x27, 0x6a, 0x9e, - 0x29, 0xdb, 0x9b, 0x6b, 0x7a, 0x43, 0x4c, 0x59, 0xc1, 0xe8, 0x1e, 0x01, - 0x2d, 0xe9, 0x5e, 0x81, 0x71, 0x32, 0xe9, 0x91, 0x4c, 0x2f, 0xca, 0xb4, - 0x71, 0xd8, 0x5b, 0x74, 0x37, 0xbd, 0xee, 0x5d, 0xa3, 0xd3, 0x3c, 0x4e, - 0x0c, 0xdd, 0x65, 0x01, 0x73, 0x77, 0x1f, 0x98, 0xd4, 0x56, 0xf5, 0x7b, - 0x6a, 0x85, 0x75, 0x4d, 0xf1, 0xc6, 0xf8, 0x28, 0x44, 0x15, 0xae, 0x99, - 0x91, 0xf0, 0x15, 0x5f, 0xd4, 0x83, 0x47, 0xea, 0x6e, 0x64, 0x12, 0xc5, - 0x12, 0xbc, 0xc5, 0xe3, 0x0e, 0xcf, 0x11, 0x05, 0x24, 0xb0, 0xc7, 0x62, - 0x05, 0x77, 0xb3, 0x57, 0x3f, 0x66, 0x00, 0xd7, 0xcd, 0x69, 0x13, 0x19, - 0x9b, 0xa0, 0x94, 0x7c, 0xe9, 0xc0, 0x7f, 0x20, 0xf5, 0x1f, 0x85, 0x4d, - 0x94, 0xcb, 0x3e, 0xc8, 0x72, 0xdc, 0xcd, 0x7f, 0xf5, 0x9c, 0xe7, 0xfa, - 0x18, 0x78, 0x99, 0x61, 0x9e, 0x7f, 0x5f, 0xd9, 0xf0, 0x3b, 0x32, 0x2c, - 0x1b, 0x66, 0xa0, 0x27, 0x4f, 0x9a, 0x09, 0x97, 0xf5, 0x0e, 0xf2, 0x5c, - 0xe9, 0x06, 0x53, 0x12, 0xf3, 0x00, 0x72, 0xea, 0x7d, 0x26, 0xd3, 0x18, - 0xfa, 0xf2, 0x33, 0x73, 0x97, 0x76, 0xaf, 0xdd, 0x92, 0x85, 0xab, 0x5f, - 0xba, 0x65, 0x8f, 0x46, 0xcf, 0x4c, 0x02, 0x6e, 0x10, 0x6b, 0x34, 0xce, - 0x57, 0xa6, 0xa5, 0x79, 0x48, 0x5b, 0x94, 0x73, 0x55, 0x58, 0xe7, 0xa7, - 0x3f, 0x86, 0x39, 0x74, 0xc6, 0x68, 0x48, 0x5b, 0x5f, 0xe3, 0x09, 0x0d, - 0xff, 0x0b, 0x5a, 0x90, 0xa2, 0x1b, 0xf9, 0x36, 0x99, 0x9e, 0x23, 0xf4, - 0x0b, 0x6b, 0xb3, 0x3e, 0xc9, 0xa2, 0x0f, 0x2e, 0x14, 0x87, 0xe1, 0x4f, - 0x64, 0x84, 0xc9, 0x6e, 0x7b, 0xec, 0x94, 0x9a, 0xa1, 0x4b, 0xf2, 0x06, - 0x88, 0xcf, 0xd6, 0x38, 0x3a, 0x01, 0x4b, 0x58, 0x74, 0x57, 0x34, 0x7c, - 0xcc, 0xa0, 0x93, 0x8f, 0x42, 0x46, 0xf2, 0x3a, 0xd3, 0x64, 0xb4, 0x99, - 0x6d, 0x69, 0xdb, 0xd7, 0x12, 0xb5, 0x87, 0x9a, 0x17, 0xc4, 0x7f, 0x13, - 0x61, 0x43, 0xc2, 0xd9, 0x25, 0xed, 0x3e, 0x99, 0x12, 0xae, 0x13, 0x0d, - 0xb2, 0xb2, 0x2d, 0xc0, 0x2b, 0x0d, 0x29, 0xcf, 0x16, 0x34, 0xb4, 0x18, - 0x13, 0x0b, 0x96, 0xd1, 0x1a, 0xed, 0xcc, 0x75, 0xb0, 0xb9, 0x59, 0x05, - 0x92, 0xea, 0x1b, 0xce, 0x1d, 0x79, 0xf1, 0x1d, 0x3a, 0xdf, 0xbf, 0x9b, - 0x1f, 0x5e, 0xe1, 0x9e, 0x03, 0x63, 0x53, 0xad, 0xb7, 0x0a, 0x43, 0x52, - 0xb5, 0x3c, 0xaf, 0xa2, 0x55, 0x32, 0x13, 0xe8, 0xe0, 0xb2, 0xc2, 0xfe, - 0x29, 0x06, 0xf6, 0xe6, 0xd4, 0x4e, 0x1a, 0xb4, 0xf4, 0x9d, 0x44, 0x54, - 0x30, 0xa5, 0x8b, 0xdd, 0xcc, 0x87, 0x60, 0x5c, 0xd6, 0x59, 0x85, 0x57, - 0x2e, 0x81, 0x22, 0x69, 0x9c, 0xe3, 0x30, 0xb0, 0x63, 0xe6, 0xd8, 0x11, - 0xe3, 0x57, 0x1f, 0xf2, 0x59, 0x6c, 0x02, 0x07, 0xc7, 0xf7, 0x28, 0x3f, - 0xde, 0x4a, 0xa3, 0x7a, 0x9d, 0x03, 0xf6, 0xe2, 0x80, 0x06, 0x62, 0x13, - 0xf6, 0x2d, 0x00, 0xae, 0x16, 0x50, 0x0b, 0x1c, 0x59, 0x9a, 0x77, 0x98, - 0x40, 0x6d, 0x96, 0x55, 0x4e, 0xae, 0x4b, 0xae, 0x60, 0x12, 0xa3, 0x93, - 0x29, 0x04, 0x1d, 0x76, 0x3b, 0xf6, 0xcb, 0xe9, 0x01, 0x90, 0x28, 0x42, - 0xad, 0x9b, 0x98, 0xa8, 0x72, 0xff, 0x3a, 0x19, 0xe5, 0xbf, 0x50, 0x4a, - 0x24, 0x3e, 0xff, 0xe8, 0xb3, 0xd4, 0xf1, 0x5c, 0x4d, 0x78, 0x5a, 0x7a, - 0x44, 0xa9, 0x57, 0x33, 0x26, 0x0d, 0xf2, 0xc2, 0xa0, 0xa0, 0x03, 0x0f, - 0x00, 0x38, 0xa4, 0x51, 0xa2, 0x49, 0x1b, 0x17, 0x3a, 0x88, 0xae, 0x34, - 0x78, 0x9c, 0xc2, 0xf7, 0xae, 0xd9, 0xa5, 0xea, 0x91, 0xef, 0x72, 0xb8, - 0x90, 0x36, 0xf6, 0x3d, 0x71, 0xc7, 0xd6, 0x6f, 0x1f, 0xe6, 0x3f, 0x4c, - 0xe9, 0xef, 0x20, 0x13, 0x43, 0x1a, 0x3c, 0x6f, 0xda, 0xd6, 0x38, 0x55, - 0x81, 0xc5, 0x4e, 0x50, 0x8b, 0x90, 0xb2, 0x15, 0xef, 0x5e, 0xd2, 0xae, - 0x98, 0xe4, 0x90, 0xe4, 0xd6, 0xd3, 0x3e, 0xdd, 0xd1, 0xa7, 0x37, 0x3e, - 0xb4, 0x62, 0xcb, 0x7c, 0xe7, 0x0e, 0xa8, 0x01, 0xcd, 0x4c, 0xc1, 0x58, - 0xda, 0x3f, 0xc5, 0x7e, 0xfa, 0x6e, 0xc3, 0x74, 0xfe, 0x55, 0x08, 0x92, - 0xf6, 0xea, 0xb2, 0x1b, 0x74, 0xe6, 0x72, 0x14, 0x1e, 0xb5, 0xa5, 0x94, - 0x24, 0x9a, 0x8a, 0xb3, 0x85, 0x50, 0x33, 0xf4, 0x44, 0xb4, 0xc7, 0x30, - 0xa6, 0x0d, 0x08, 0xff, 0xa0, 0xcc, 0x59, 0x1d, 0x81, 0xa6, 0xd1, 0x6c, - 0xc2, 0x88, 0xf5, 0xdf, 0xeb, 0xf2, 0x1b, 0xce, 0xbb, 0x2d, 0xf8, 0x38, - 0x51, 0x4b, 0xd2, 0x75, 0xd8, 0xab, 0xed, 0x6a, 0x71, 0x40, 0x8b, 0x53, - 0x75, 0x1e, 0xc4, 0x07, 0x39, 0x00, 0xe0, 0x88, 0xd3, 0xd6, 0x31, 0x7a, - 0xe8, 0x85, 0x90, 0x16, 0x0b, 0x4b, 0x61, 0x2f, 0xf1, 0x0d, 0x8d, 0xfa, - 0xdb, 0xd9, 0x10, 0xb2, 0xe9, 0x77, 0xa9, 0x5b, 0x6c, 0x51, 0x55, 0x85, - 0x1d, 0x59, 0x26, 0x1b, 0xbe, 0x03, 0x07, 0x92, 0xc5, 0x3a, 0x20, 0x79, - 0x8a, 0xfe, 0x01, 0xe0, 0xc6, 0x33, 0x10, 0x88, 0x1e, 0x23, 0x63, 0x38, - 0x3a, 0x7c, 0x09, 0x86, 0xfb, 0x2b, 0xd2, 0x9d, 0x8a, 0x04, 0x0f, 0x22, - 0x1d, 0xc6, 0x5a, 0xb8, 0xf3, 0x3b, 0xda, 0xb4, 0x96, 0xd2, 0x9f, 0xfb, - 0x80, 0xa0, 0x34, 0xf7, 0xf5, 0x12, 0xea, 0x25, 0xea, 0xab, 0x25, 0xb2, - 0x3c, 0x63, 0xfa, 0x3e, 0xab, 0xc5, 0xee, 0x9b, 0x8e, 0xa6, 0x42, 0x08, - 0x73, 0x16, 0x79, 0x8a, 0x25, 0xcf, 0xe9, 0xd2, 0x4d, 0x73, 0xa3, 0x8d, - 0x55, 0xed, 0x01, 0x31, 0x61, 0x4b, 0x8b, 0x32, 0xe3, 0x5b, 0xa2, 0x8c, - 0xc3, 0xff, 0x87, 0xc8, 0x0c, 0xfa, 0x33, 0x6c, 0x55, 0x56, 0x96, 0xef, - 0xa5, 0xb3, 0x6a, 0xa8, 0x72, 0x37, 0xc0, 0xf8, 0x94, 0xec, 0xa3, 0x9a, - 0xa5, 0x00, 0x19, 0xb3, 0x8e, 0x63, 0x7a, 0x19, 0xc0, 0x96, 0xa9, 0x3a, - 0x59, 0xfa, 0xe6, 0xf7, 0x5f, 0x70, 0xed, 0x50, 0xd6, 0x0d, 0x44, 0xb8, - 0x23, 0x4d, 0x7f, 0x31, 0x33, 0xfa, 0x39, 0xdd, 0x91, 0xe4, 0xd9, 0x23, - 0xfb, 0x55, 0x0f, 0xdc, 0x8d, 0x13, 0x81, 0xf7, 0xc1, 0xb5, 0xbb, 0x2a, - 0xd0, 0xe7, 0x96, 0x34, 0xb9, 0x8d, 0x9e, 0xdc, 0x69, 0x84, 0xda, 0xff, - 0x7e, 0x64, 0x73, 0x85, 0xe1, 0x2d, 0xa9, 0x0e, 0x30, 0xdd, 0x09, 0x45, - 0x69, 0xa2, 0xf5, 0xf7, 0x6d, 0x6a, 0x0b, 0x07, 0x1d, 0xce, 0x39, 0x7f, - 0x4e, 0xdd, 0x81, 0x26, 0x9d, 0x8d, 0x19, 0xfc, 0x89, 0x2b, 0xd2, 0x29, - 0xc5, 0xf6, 0xe1, 0x1a, 0x3f, 0x96, 0xc5, 0x72, 0x05, 0xf8, 0xaf, 0xd3, - 0x49, 0x36, 0xd8, 0x71, 0x79, 0x6d, 0x2b, 0x05, 0xe7, 0x7b, 0x26, 0xa9, - 0x15, 0x32, 0x43, 0x1d, 0x67, 0x45, 0xeb, 0x86, 0xb5, 0xfe, 0x7e, 0x79, - 0x42, 0x9c, 0x7e, 0x66, 0xb0, 0xee, 0x2c, 0x40, 0x01, 0x38, 0x59, 0x62, - 0xb6, 0xa1, 0x96, 0xe2, 0x4b, 0x57, 0xab, 0xa5, 0x90, 0xfc, 0xec, 0x91, - 0xf0, 0x73, 0x01, 0x63, 0x5f, 0x83, 0xaa, 0x4c, 0x57, 0x27, 0x67, 0x5c, - 0x92, 0x1c, 0x0a, 0x02, 0xfa, 0x5f, 0x00, 0x40, 0x7f, 0x1d, 0xc8, 0x88, - 0x87, 0xef, 0x4e, 0x63, 0x65, 0xeb, 0x95, 0xd9, 0xc4, 0x96, 0xb5, 0xd4, - 0x24, 0xbd, 0xf0, 0x92, 0x7c, 0xb5, 0x9b, 0x7e, 0xae, 0xf7, 0x1b, 0xf4, - 0xcc, 0xc8, 0xcb, 0x33, 0xc6, 0xd0, 0x07, 0x0c, 0xda, 0x48, 0x24, 0x89, - 0x7d, 0x6b, 0x85, 0xf8, 0x62, 0x7c, 0xa3, 0x12, 0x52, 0x6e, 0x9b, 0x44, - 0x46, 0x47, 0x8d, 0xcf, 0xee, 0x73, 0x30, 0x1d, 0x80, 0x6d, 0x9b, 0x00, - 0xa1, 0xe1, 0x8a, 0xc7, 0x4f, 0x62, 0x7e, 0x52, 0x1b, 0x83, 0xe9, 0xe2, - 0xad, 0x0e, 0x88, 0xdc, 0xc9, 0x26, 0xbc, 0xb4, 0x87, 0xaa, 0x8c, 0x1b, - 0x92, 0x4a, 0xff, 0x43, 0x1c, 0x39, 0xca, 0x48, 0x73, 0xb6, 0x08, 0x83, - 0x66, 0x32, 0xb9, 0xd9, 0x59, 0xe5, 0xd5, 0xf4, 0xf5, 0xbf, 0x89, 0xf7, - 0x66, 0x5c, 0x4b, 0xe6, 0xf4, 0x71, 0xb8, 0xe8, 0x91, 0xb4, 0xe9, 0xc8, - 0xbe, 0x6f, 0x1b, 0x7f, 0x05, 0x0f, 0xd7, 0xd8, 0x65, 0x1e, 0x4a, 0x79, - 0x53, 0xda, 0x7a, 0x95, 0x7f, 0x74, 0x8f, 0x50, 0x37, 0x12, 0xbe, 0xa9, - 0x2c, 0x97, 0x2f, 0x89, 0xcf, 0x02, 0x5c, 0x09, 0x37, 0x70, 0x10, 0xfc, - 0x78, 0x00, 0x9e, 0x04, 0x6f, 0x72, 0xd1, 0x64, 0x91, 0x61, 0xa9, 0x0b, - 0xeb, 0x0c, 0xbf, 0x6a, 0xd0, 0x5b, 0xdc, 0x79, 0x31, 0x7e, 0x12, 0xa4, - 0x30, 0x58, 0x11, 0x17, 0x8b, 0x0a, 0x84, 0xea, 0xfa, 0x6d, 0x08, 0x71, - 0x50, 0x80, 0xd2, 0x7a, 0x3d, 0x98, 0x95, 0x04, 0xf1, 0xaf, 0x78, 0xaf, - 0x4e, 0x1c, 0xa5, 0xea, 0x66, 0x60, 0xa5, 0x7a, 0x2c, 0x69, 0x32, 0xac, - 0xd8, 0x7d, 0xdc, 0xbc, 0x18, 0x29, 0xbf, 0xde, 0x8a, 0x2a, 0xf9, 0x4c, - 0x7d, 0x9d, 0x63, 0x92, 0x16, 0x7f, 0x72, 0x65, 0xb6, 0x6d, 0xe0, 0x5c, - 0x18, 0x4e, 0x02, 0xd6, 0xfd, 0x03, 0x9e, 0xd9, 0x95, 0xac, 0xf5, 0xbe, - 0x8d, 0x9a, 0x5b, 0x26, 0x2b, 0x35, 0x55, 0x6f, 0x67, 0xa0, 0xd8, 0x4d, - 0x21, 0xe0, 0x57, 0x8a, 0x8e, 0x88, 0x83, 0x91, 0x87, 0xbf, 0x7c, 0x7f, - 0x7b, 0x31, 0x32, 0xfc, 0xf0, 0xad, 0xe9, 0xcc, 0x36, 0xc7, 0x61, 0xce, - 0xf5, 0x50, 0x43, 0x26, 0x12, 0x64, 0x49, 0x60, 0x56, 0x1a, 0x13, 0xf6, - 0x31, 0x55, 0x2e, 0x95, 0x63, 0x4d, 0x1c, 0xb7, 0x11, 0xfa, 0x87, 0x64, - 0xca, 0x75, 0xe3, 0x44, 0xa4, 0x24, 0x93, 0x31, 0x62, 0x3a, 0x34, 0xc3, - 0x38, 0xbf, 0x35, 0x34, 0x19, 0x54, 0xc2, 0x56, 0xb6, 0x1c, 0xc1, 0xed, - 0xaf, 0xbf, 0xd5, 0x89, 0xf5, 0xc5, 0xdf, 0xda, 0x4b, 0x0e, 0x02, 0x1f, - 0x66, 0xbb, 0x40, 0x04, 0x00, 0x38, 0x80, 0xf8, 0xf2, 0x05, 0x38, 0x4f, - 0x47, 0xe1, 0xa5, 0xc8, 0x8e, 0x39, 0xa7, 0x52, 0xc0, 0xc3, 0xa4, 0x86, - 0xbb, 0xa3, 0x9e, 0x17, 0xe3, 0x7a, 0x7d, 0x28, 0x84, 0xcd, 0xd5, 0x80, - 0x8c, 0x7b, 0x72, 0x62, 0x1a, 0x52, 0x00, 0xbc, 0xea, 0xfc, 0x5c, 0x1c, - 0x78, 0xdc, 0x1d, 0x79, 0xa6, 0x69, 0x51, 0xc2, 0x45, 0x6c, 0x09, 0x0b, - 0x3b, 0xaa, 0x3b, 0xbe, 0x3f, 0xc7, 0xd5, 0x3f, 0x9e, 0xd6, 0xd1, 0xff, - 0xae, 0xa8, 0xdc, 0xef, 0xbc, 0xa7, 0xf1, 0x0e, 0x29, 0x9e, 0x6e, 0xbd, - 0x14, 0x40, 0xd5, 0xcf, 0xdb, 0xde, 0x6f, 0xdd, 0x2b, 0x6e, 0x37, 0x0f, - 0xd3, 0xbc, 0x6b, 0x94, 0xb7, 0x9a, 0xf4, 0x03, 0x51, 0x7e, 0xd1, 0x67, - 0x32, 0x07, 0x6e, 0x23, 0x4d, 0x8d, 0x3c, 0x94, 0x3e, 0xfc, 0x4b, 0xec, - 0x8f, 0xd5, 0x49, 0x2c, 0x36, 0x6f, 0x3a, 0x30, 0x0e, 0xd7, 0xc8, 0x33, - 0x0b, 0xc1, 0x79, 0x93, 0x3c, 0xbb, 0x5f, 0x57, 0xb4, 0x2a, 0x7d, 0x1c, - 0xf2, 0xfa, 0x57, 0xde, 0x26, 0x65, 0x5a, 0x13, 0x9e, 0xfe, 0xcc, 0x45, - 0xa9, 0x2c, 0x18, 0x41, 0x5d, 0xb9, 0x48, 0xfc, 0x71, 0x0b, 0x34, 0x1e, - 0x6b, 0x69, 0x7e, 0xa2, 0xb4, 0xda, 0xd1, 0x37, 0xb6, 0x7c, 0x6b, 0x98, - 0x53, 0x0a, 0xc9, 0x91, 0x04, 0x2b, 0xd2, 0xe1, 0xbf, 0xf3, 0x17, 0xb0, - 0x1d, 0xc3, 0x08, 0x3b, 0x83, 0x29, 0x45, 0xb3, 0x78, 0x6b, 0x6c, 0x1c, - 0xce, 0x3b, 0x1b, 0x06, 0x59, 0x7f, 0x1a, 0x52, 0xe6, 0xa4, 0x38, 0x09, - 0x36, 0x39, 0x8e, 0x32, 0x2c, 0xdc, 0xd3, 0x02, 0xef, 0xe3, 0xff, 0x28, - 0xa1, 0x6d, 0xd1, 0xc1, 0xdc, 0x0e, 0x1f, 0xb4, 0xe7, 0xac, 0x00, 0x5e, - 0x01, 0xa7, 0x11, 0x09, 0xa5, 0xc8, 0x93, 0x2d, 0xeb, 0x9b, 0x65, 0xf9, - 0x94, 0x2f, 0x52, 0x6c, 0x78, 0x76, 0x67, 0x9a, 0xe0, 0x5b, 0xe3, 0x29, - 0x7f, 0x19, 0xd8, 0x5d, 0x05, 0xf3, 0x93, 0x0f, 0xd7, 0x0f, 0x2c, 0x23, - 0xe7, 0x63, 0x01, 0xf0, 0x41, 0xe3, 0x22, 0x6f, 0x48, 0x10, 0x58, 0xe1, - 0xa9, 0xed, 0xfa, 0xba, 0xae, 0xae, 0x52, 0x87, 0x59, 0x2f, 0x5a, 0x07, - 0x19, 0x12, 0x49, 0xe9, 0x50, 0xb4, 0xeb, 0x5c, 0x98, 0xca, 0x70, 0xf1, - 0x69, 0x98, 0x93, 0xbd, 0xf0, 0x27, 0xd6, 0xab, 0xc6, 0x1e, 0xeb, 0x89, - 0x66, 0x33, 0xb9, 0x2f, 0xc7, 0x37, 0x24, 0x82, 0x93, 0xd4, 0x1d, 0x29, - 0x03, 0x5e, 0x2f, 0x7f, 0xf2, 0x1d, 0x15, 0x64, 0xb0, 0xfe, 0x2f, 0x40, - 0x03, 0x38, 0x58, 0x62, 0x21, 0xdd, 0xbd, 0xa3, 0xb5, 0x3f, 0x90, 0xbc, - 0xde, 0x1b, 0x93, 0xcb, 0x89, 0x27, 0x11, 0xe0, 0xf7, 0xac, 0x1d, 0xa3, - 0x2d, 0x8f, 0xb3, 0x26, 0xa5, 0x3a, 0xe2, 0xf8, 0x5b, 0x76, 0xae, 0x60, - 0x40, 0x8a, 0xf4, 0x18, 0x02, 0x75, 0x4c, 0x5c, 0x8a, 0x8b, 0x27, 0xaf, - 0x06, 0xa2, 0xf6, 0x81, 0x94, 0x13, 0x22, 0x62, 0x37, 0x03, 0x81, 0x6b, - 0x9f, 0x32, 0xe3, 0x07, 0x18, 0x9f, 0x6f, 0xdc, 0xda, 0xdf, 0x20, 0x42, - 0xb2, 0xaf, 0xba, 0x78, 0xfd, 0x06, 0x94, 0x3d, 0x23, 0x13, 0xa8, 0xee, - 0x76, 0xae, 0x82, 0x74, 0x71, 0x44, 0x3f, 0xd9, 0xf5, 0x61, 0x32, 0x41, - 0x6a, 0x8f, 0x62, 0x61, 0x23, 0x18, 0x13, 0x80, 0x13, 0x02, 0x3c, 0xe4, - 0x7a, 0xd8, 0xa1, 0x51, 0x15, 0xb7, 0x7f, 0x4e, 0xe8, 0x80, 0x34, 0x6d, - 0x14, 0x44, 0xb8, 0x21, 0x7c, 0x6c, 0x18, 0xd4, 0x87, 0x44, 0x5a, 0x94, - 0xf1, 0x9d, 0x21, 0x54, 0x25, 0x67, 0x7b, 0x94, 0x0b, 0x43, 0xd0, 0x2e, - 0xfa, 0xca, 0x9b, 0x1f, 0x67, 0x03, 0x99, 0xb3, 0x35, 0xb9, 0x79, 0x44, - 0x58, 0x7e, 0x56, 0xa4, 0x6c, 0x10, 0x4a, 0x38, 0x15, 0x38, 0x0f, 0xeb, - 0x89, 0xff, 0xf2, 0x38, 0x46, 0xef, 0xf6, 0x7d, 0xcf, 0xe0, 0x6b, 0x52, - 0x94, 0x2b, 0x11, 0x8d, 0x2e, 0x00, 0x51, 0xaf, 0xb3, 0xe7, 0xb2, 0x97, - 0xd7, 0x75, 0x96, 0x09, 0x77, 0xe0, 0x64, 0x7f, 0x42, 0xc4, 0x6e, 0x83, - 0xeb, 0x4f, 0x64, 0xfe, 0x5e, 0xb1, 0x2b, 0xec, 0x0e, 0xb0, 0xc8, 0x8c, - 0xc4, 0xc2, 0x0b, 0x91, 0x26, 0xb0, 0x95, 0x7c, 0x81, 0x54, 0xd3, 0xab, - 0x58, 0xfe, 0x2f, 0xf5, 0xc8, 0x85, 0x3f, 0x61, 0xfc, 0xb5, 0x64, 0xb6, - 0x9c, 0x9c, 0x66, 0x76, 0x2a, 0x93, 0xfc, 0xfb, 0x4f, 0xda, 0x48, 0xcd, - 0x82, 0xc5, 0xa4, 0x64, 0xd6, 0x29, 0xae, 0xe1, 0xaf, 0x20, 0xc2, 0x7c, - 0xb7, 0x59, 0x76, 0x62, 0x26, 0xaf, 0x4d, 0x68, 0x02, 0xf5, 0x97, 0x8c, - 0xee, 0xa7, 0x06, 0xd6, 0x81, 0x8f, 0x07, 0x24, 0xc6, 0x1e, 0x52, 0x51, - 0xa8, 0x0c, 0x28, 0xab, 0x7c, 0xfe, 0x8e, 0x6b, 0x65, 0x29, 0xf6, 0x67, - 0xaa, 0x4d, 0x14, 0xe2, 0x5f, 0xfe, 0x86, 0x3d, 0x9e, 0x23, 0x58, 0xdd, - 0x0b, 0x5a, 0x6f, 0x5e, 0x77, 0x59, 0x67, 0x30, 0x62, 0xa9, 0xd5, 0x4e, - 0x3d, 0xef, 0xc2, 0x29, 0x8d, 0xb2, 0xba, 0x52, 0x0f, 0x3a, 0x36, 0x43, - 0xee, 0x0d, 0xa5, 0x06, 0x21, 0x88, 0x3c, 0x45, 0x24, 0xa0, 0x3c, 0x22, - 0xfd, 0x9a, 0x74, 0xb0, 0x23, 0x4c, 0x0e, 0x98, 0x0f, 0xa9, 0x62, 0xe1, - 0xad, 0xe4, 0x1c, 0xbb, 0x48, 0xb4, 0x76, 0xa7, 0x71, 0xae, 0x32, 0xb8, - 0xac, 0x62, 0xc6, 0x2b, 0xb5, 0x4f, 0x53, 0xec, 0x32, 0x00, 0x5b, 0xfa, - 0xec, 0xea, 0x26, 0x7b, 0x77, 0xcc, 0xc1, 0x53, 0x5c, 0xe2, 0xe8, 0xde, - 0xeb, 0x6e, 0x08, 0x66, 0x91, 0x96, 0xfd, 0x09, 0x37, 0xfc, 0x63, 0x01, - 0xec, 0x23, 0x8c, 0x29, 0xb0, 0xc9, 0xb7, 0x05, 0xd3, 0xc3, 0x16, 0x6d, - 0x3c, 0xee, 0x86, 0x6c, 0xff, 0xc2, 0xcb, 0xb6, 0x87, 0xb2, 0x9c, 0xfa, - 0x6a, 0x6b, 0x3f, 0x07, 0x77, 0x97, 0x6b, 0xc7, 0x57, 0xce, 0xe4, 0x88, - 0x35, 0xfc, 0x7d, 0x2b, 0x64, 0x11, 0xa5, 0xb9, 0xce, 0x27, 0x26, 0x74, - 0x7f, 0x81, 0xbc, 0x4f, 0xbd, 0xa7, 0x77, 0x6a, 0x44, 0xeb, 0x40, 0x2d, - 0xb8, 0xa6, 0xb9, 0xe8, 0x86, 0x2b, 0x79, 0x08, 0xdd, 0x6a, 0xe9, 0xc3, - 0x44, 0x40, 0x34, 0x29, 0x9e, 0xaf, 0xde, 0x16, 0x4a, 0x4a, 0xd5, 0x08, - 0x6f, 0x56, 0x3b, 0xb8, 0x97, 0xf6, 0xec, 0xbd, 0xee, 0x7e, 0x6b, 0x51, - 0xc3, 0x5e, 0xdd, 0xdc, 0x4e, 0x4d, 0x83, 0xdd, 0xf7, 0x61, 0xef, 0x9b, - 0xa1, 0x56, 0x2d, 0x68, 0x2a, 0x74, 0x99, 0xa6, 0xf3, 0xfa, 0x9f, 0xe8, - 0xa4, 0xa9, 0x96, 0xd8, 0x09, 0xe7, 0x99, 0x50, 0x42, 0xa3, 0x7d, 0xa1, - 0x33, 0x74, 0xa5, 0x8c, 0xb3, 0xab, 0x83, 0x40, 0xe8, 0xc8, 0xb0, 0xa1, - 0xb1, 0x25, 0xed, 0x84, 0x3e, 0x64, 0xc6, 0xe7, 0xc5, 0x88, 0x86, 0x4b, - 0x9e, 0x87, 0x32, 0x18, 0x04, 0xa9, 0x39, 0x98, 0x36, 0xc6, 0x4f, 0xb2, - 0xdd, 0x57, 0x5d, 0x7c, 0x82, 0x43, 0x7b, 0x89, 0x6c, 0xea, 0xcb, 0x21, - 0xce, 0x6e, 0xfc, 0xe8, 0xa9, 0x91, 0xbd, 0x84, 0x4c, 0xff, 0x60, 0x13, - 0xde, 0xd8, 0x37, 0x7c, 0xee, 0x6c, 0xcd, 0x4d, 0x1b, 0x01, 0xd3, 0xba, - 0x26, 0x9a, 0xdc, 0x19, 0x5c, 0x74, 0x4b, 0xd3, 0xdb, 0x44, 0xf2, 0x4f, - 0x5f, 0x85, 0x69, 0x42, 0x7c, 0x36, 0xe3, 0x06, 0x29, 0xfe, 0x09, 0x04, - 0xbd, 0x06, 0x0e, 0x41, 0xda, 0x29, 0x89, 0xe0, 0xe5, 0x1f, 0x0e, 0x3c, - 0xd5, 0x71, 0xa9, 0xad, 0x3e, 0xaf, 0x81, 0x17, 0x07, 0xf5, 0xf2, 0x50, - 0xa2, 0x0d, 0xee, 0xfc, 0x9e, 0x0a, 0xe7, 0xb7, 0xfb, 0xe3, 0x6b, 0xd3, - 0x99, 0x6c, 0xa7, 0x18, 0x4f, 0x6b, 0x1c, 0x3a, 0xf9, 0xdc, 0xb6, 0xc0, - 0x39, 0x26, 0x52, 0x6e, 0xcb, 0x1d, 0xa9, 0xf8, 0xd7, 0x66, 0x33, 0x15, - 0xc7, 0x46, 0xee, 0xf7, 0x3f, 0x32, 0x88, 0x56, 0xdc, 0xaa, 0x65, 0xce, - 0x2f, 0x4f, 0xaf, 0xad, 0x7b, 0x38, 0xad, 0x83, 0xc6, 0x06, 0x3b, 0x8e, - 0x7e, 0xa1, 0x59, 0x2a, 0xbb, 0x52, 0xc8, 0xff, 0xf4, 0x09, 0x6f, 0x6e, - 0xcf, 0x9f, 0xad, 0x25, 0xdc, 0x29, 0x7b, 0x65, 0x21, 0x58, 0xff, 0x78, - 0xaa, 0xcf, 0xe1, 0x4d, 0x98, 0x12, 0xe8, 0x24, 0x0e, 0x5e, 0x79, 0x35, - 0x26, 0x5d, 0xf5, 0xd2, 0x87, 0xb2, 0xb2, 0xd1, 0x19, 0xdb, 0x6f, 0x59, - 0xf7, 0xc2, 0x4d, 0xb1, 0x91, 0xf5, 0xe1, 0x1e, 0x7d, 0xf7, 0xa5, 0xb5, - 0x3f, 0x98, 0x44, 0xd8, 0xcd, 0x6f, 0xce, 0x42, 0x06, 0x26, 0x59, 0x32, - 0x6e, 0xa6, 0xc1, 0x80, 0x0a, 0xc1, 0xfc, 0x20, 0x23, 0x5e, 0x8b, 0x89, - 0xa1, 0xa8, 0xb3, 0xc9, 0x91, 0xa8, 0xf8, 0x28, 0x27, 0x90, 0xec, 0x3e, - 0x43, 0x4f, 0xde, 0x46, 0xd7, 0x4f, 0xf4, 0x1c, 0xf2, 0x5e, 0x07, 0x1f, - 0x2b, 0xa6, 0x9b, 0x56, 0xd2, 0x3c, 0xf4, 0xcb, 0x4b, 0xbb, 0x24, 0x55, - 0x96, 0x63, 0x02, 0xe9, 0xbb, 0x77, 0xb4, 0x81, 0x65, 0x9e, 0x8e, 0x63, - 0xa4, 0x8d, 0x2d, 0x59, 0x95, 0x7c, 0xca, 0x7f, 0xfb, 0x4e, 0x19, 0x74, - 0x77, 0x4e, 0xf8, 0x69, 0x2c, 0x7c, 0x1e, 0xd2, 0x0c, 0xbf, 0xf9, 0x56, - 0xad, 0x99, 0x4e, 0x2b, 0x3f, 0xea, 0x08, 0xea, 0xc1, 0xa5, 0x65, 0x97, - 0xc2, 0x9e, 0x59, 0xfe, 0xad, 0x2e, 0xec, 0xd5, 0x9a, 0x3c, 0x8e, 0xc3, - 0x67, 0x9c, 0xae, 0xf5, 0xbb, 0xe9, 0x4b, 0x1d, 0x11, 0x74, 0x1c, 0xe1, - 0xac, 0x30, 0xe3, 0x23, 0x10, 0x34, 0x96, 0x19, 0x8c, 0x8d, 0x82, 0xfb, - 0xcd, 0x66, 0xa4, 0x4d, 0xd6, 0xde, 0x8d, 0xd8, 0x7a, 0x2d, 0x8d, 0xd2, - 0xe3, 0x6c, 0xef, 0xaa, 0x23, 0x58, 0x62, 0x71, 0xb1, 0xa7, 0xa2, 0x9e, - 0x62, 0x49, 0xe6, 0xa4, 0x3b, 0x94, 0xaa, 0xfd, 0xfd, 0x8b, 0x66, 0x0b, - 0x6d, 0xf7, 0xd4, 0x0b, 0x1f, 0xd7, 0x79, 0x1c, 0x31, 0x5b, 0x2c, 0x86, - 0xd4, 0x1b, 0x25, 0x23, 0x20, 0x67, 0x94, 0x52, 0xa7, 0xee, 0x76, 0x94, - 0x65, 0x5f, 0x7a, 0xb4, 0x24, 0xb6, 0x15, 0x17, 0x1d, 0xed, 0xd3, 0x64, - 0x71, 0xa9, 0x70, 0x3f, 0x99, 0x78, 0x42, 0x0f, 0x61, 0x3f, 0xee, 0xa7, - 0x4b, 0x50, 0xb0, 0x9b, 0x77, 0x02, 0x65, 0x4f, 0xbf, 0x80, 0xc4, 0x30, - 0xcf, 0x79, 0xae, 0x3d, 0x16, 0x1c, 0xd9, 0x2b, 0xaa, 0xfe, 0xf2, 0x20, - 0x6b, 0xf3, 0xd8, 0xb8, 0x14, 0x4c, 0xdc, 0x30, 0xbc, 0xdb, 0xc8, 0xa6, - 0x09, 0x39, 0xf4, 0x8c, 0xfd, 0x46, 0xe6, 0x28, 0x22, 0x37, 0x1a, 0x49, - 0x4e, 0xd4, 0xd6, 0x40, 0xe9, 0xe4, 0x86, 0xad, 0x5c, 0x13, 0x7e, 0x43, - 0x30, 0x51, 0x3b, 0x7b, 0xac, 0xa7, 0xc6, 0xcc, 0x93, 0x4c, 0xed, 0xb9, - 0x84, 0xb6, 0x5a, 0x6b, 0x28, 0xd2, 0x33, 0x60, 0x9f, 0x1b, 0xce, 0x66, - 0x3b, 0xa0, 0x1f, 0x85, 0x45, 0xeb, 0x2a, 0x91, 0xf3, 0xb6, 0x56, 0x50, - 0x62, 0x45, 0x84, 0x2f, 0xb0, 0xe7, 0x24, 0x8b, 0x61, 0x75, 0x65, 0xbf, - 0x28, 0x71, 0xfb, 0xb2, 0x83, 0x7f, 0x2c, 0x52, 0xb2, 0xc1, 0x36, 0x25, - 0xcb, 0x4a, 0x2d, 0x85, 0x41, 0x54, 0xf3, 0xa1, 0x36, 0x72, 0x5c, 0xa9, - 0x86, 0xef, 0x7f, 0x96, 0xa3, 0xfe, 0xe9, 0xbe, 0xc2, 0x7b, 0xc0, 0x65, - 0x76, 0xee, 0xda, 0x31, 0x89, 0x58, 0x93, 0xae, 0x3e, 0x7d, 0xa7, 0x16, - 0x29, 0x94, 0xb5, 0x78, 0x39, 0xd7, 0x6b, 0xde, 0x35, 0x52, 0xb4, 0x08, - 0x53, 0xac, 0x9c, 0x55, 0xf3, 0x28, 0xe0, 0x72, 0x66, 0x5f, 0x39, 0xf4, - 0xfa, 0x84, 0x73, 0xe3, 0x67, 0x4c, 0x3b, 0xd3, 0x28, 0xc3, 0xd2, 0x60, - 0x58, 0x38, 0x02, 0x60, 0x8f, 0x88, 0x4c, 0x78, 0xc7, 0x90, 0x4b, 0x05, - 0x71, 0xbe, 0xa5, 0xcb, 0xd3, 0x3f, 0x24, 0x74, 0x5d, 0x40, 0xd3, 0xbc, - 0x10, 0xbe, 0xd9, 0x39, 0x58, 0x62, 0xd3, 0xe1, 0x36, 0x2a, 0x42, 0xb8, - 0xb1, 0x9f, 0x8f, 0x2c, 0x90, 0x97, 0x63, 0xcd, 0x78, 0xa3, 0xb8, 0xc9, - 0x8e, 0x75, 0xd9, 0x33, 0x77, 0x86, 0x65, 0x52, 0xb5, 0xca, 0x16, 0xcb, - 0x87, 0xf8, 0xbf, 0x25, 0x46, 0xb5, 0x15, 0x11, 0x62, 0xb9, 0xf4, 0x55, - 0x3b, 0x8c, 0xb7, 0x00, 0xc1, 0xd4, 0xf2, 0x37, 0xb2, 0xb1, 0x31, 0x0b, - 0xd2, 0x57, 0x14, 0x69, 0x73, 0x28, 0xbb, 0x51, 0x5d, 0x5c, 0xb3, 0x9e, - 0x4b, 0xab, 0xba, 0x94, 0xf3, 0x21, 0x52, 0xfb, 0x54, 0xf7, 0x7c, 0x61, - 0x04, 0x11, 0xaf, 0x1c, 0x6e, 0x48, 0x6b, 0xc0, 0xec, 0xb7, 0x9e, 0x8c, - 0xb6, 0x85, 0xc6, 0xbc, 0xe4, 0x5d, 0x60, 0xe7, 0xf8, 0x6d, 0x01, 0xca, - 0xb1, 0xc9, 0x89, 0xf0, 0x82, 0x92, 0x8e, 0x4a, 0x53, 0xf0, 0x25, 0x30, - 0xd9, 0xd4, 0xb7, 0x3d, 0x65, 0x80, 0x03, 0x3d, 0x25, 0x01, 0xfd, 0xe3, - 0x74, 0x16, 0x00, 0x42, 0xd7, 0x34, 0x64, 0x65, 0xac, 0xfa, 0x4a, 0xab, - 0x80, 0x21, 0xc8, 0x88, 0x03, 0x91, 0x27, 0x14, 0x34, 0x36, 0xc4, 0xbe, - 0xc7, 0xcf, 0x3d, 0x2b, 0xa2, 0x88, 0xfe, 0xf9, 0x94, 0x11, 0xd9, 0x7c, - 0x29, 0x4b, 0x5e, 0x0c, 0xff, 0x9e, 0xf2, 0x27, 0x2b, 0x85, 0x86, 0x92, - 0x7e, 0xa9, 0x66, 0x5e, 0xe3, 0xf5, 0x13, 0x6b, 0x7e, 0x86, 0x19, 0x2c, - 0x34, 0x0d, 0xab, 0x90, 0xd7, 0x84, 0x47, 0x3c, 0x6f, 0xbf, 0x18, 0xbe, - 0x2b, 0xc3, 0xf8, 0xdc, 0x0f, 0x29, 0xf0, 0xf2, 0xaa, 0x99, 0xab, 0x95, - 0x6e, 0x20, 0x60, 0x34, 0x78, 0x7b, 0xef, 0x8c, 0x98, 0x39, 0xcf, 0x56, - 0x5d, 0xc5, 0x10, 0x84, 0xb1, 0xbe, 0xae, 0xc7, 0x02, 0x4f, 0x47, 0x79, - 0x24, 0xf9, 0x73, 0x1a, 0x36, 0xa6, 0x02, 0xff, 0x29, 0x41, 0xb5, 0x14, - 0xb0, 0x3d, 0x23, 0x3f, 0xc9, 0xed, 0xd1, 0x0f, 0x01, 0xc1, 0x04, 0xc6, - 0x2a, 0x6b, 0x1e, 0x98, 0xc0, 0x36, 0xd7, 0x43, 0x56, 0xb7, 0x5f, 0x00, - 0xa0, 0xf1, 0xe3, 0x42, 0x0c, 0x3b, 0xd6, 0xc0, 0xe4, 0xde, 0xdb, 0x71, - 0xae, 0xe1, 0x15, 0x4b, 0x3e, 0x0e, 0x7f, 0x80, 0x4c, 0xf9, 0xda, 0xdd, - 0x6f, 0x09, 0x24, 0x2a, 0x9b, 0x78, 0x70, 0xad, 0x29, 0x7e, 0x8c, 0x20, - 0x69, 0x1e, 0x1e, 0x20, 0x35, 0xe4, 0x1f, 0xdd, 0xc8, 0x2f, 0x0a, 0xaa, - 0x18, 0xe1, 0x61, 0x88, 0x3b, 0xf6, 0x64, 0xc1, 0x50, 0xae, 0xbc, 0x19, - 0xa4, 0x54, 0x21, 0x1d, 0x5f, 0x3c, 0x22, 0xe2, 0x95, 0x75, 0xbc, 0xed, - 0xf1, 0x73, 0x52, 0x78, 0xd7, 0x0e, 0xd1, 0x27, 0x42, 0x7f, 0xe5, 0x11, - 0x59, 0xcf, 0xd6, 0xce, 0xbe, 0x23, 0xdf, 0x7a, 0x35, 0x86, 0xa9, 0xd6, - 0x4d, 0x51, 0xf0, 0x2a, 0xf4, 0x2f, 0xcf, 0x07, 0xed, 0x6a, 0xc2, 0x26, - 0x6b, 0xcf, 0xfd, 0x9d, 0x15, 0x4c, 0xaf, 0x64, 0xba, 0x3b, 0xf8, 0x3a, - 0x2d, 0x3c, 0x19, 0x88, 0xc3, 0x7d, 0x06, 0xb2, 0x4c, 0x83, 0x6c, 0x5b, - 0x8f, 0xdf, 0xee, 0x56, 0x4d, 0xba, 0xc4, 0xc4, 0x16, 0x15, 0xfb, 0xcc, - 0x9a, 0x40, 0x69, 0x2b, 0x10, 0x56, 0xcb, 0x09, 0xed, 0x78, 0xee, 0x19, - 0x12, 0xc2, 0xa4, 0x11, 0x63, 0x59, 0x28, 0xed, 0x2e, 0x86, 0x9b, 0x0a, - 0xc0, 0xf1, 0xac, 0x86, 0x91, 0x40, 0x91, 0x05, 0xfb, 0x61, 0x6e, 0x28, - 0x3c, 0xcf, 0xb9, 0x4d, 0x9c, 0xcc, 0x9c, 0x5c, 0x2d, 0x32, 0x6f, 0xd6, - 0xf2, 0x2e, 0x77, 0x99, 0x7b, 0xf6, 0x43, 0x91, 0xb3, 0x1c, 0x71, 0x1c, - 0x27, 0xf2, 0x24, 0x4e, 0x90, 0xee, 0x00, 0x1c, 0xb7, 0xf6, 0x50, 0x5e, - 0xf4, 0xc7, 0x84, 0x2e, 0x24, 0xf9, 0x8b, 0x9c, 0x6a, 0x1d, 0x96, 0xb9, - 0xfe, 0xd2, 0x89, 0xb3, 0xbc, 0x5d, 0x17, 0x27, 0x02, 0x47, 0xe4, 0xef, - 0x31, 0x43, 0xf4, 0x7d, 0x98, 0xce, 0x6f, 0xa2, 0x67, 0x6c, 0xbb, 0x91, - 0xba, 0xa8, 0x63, 0x2b, 0x9e, 0x99, 0xbd, 0x7f, 0x15, 0xa9, 0xd6, 0xa6, - 0xdb, 0x84, 0x1b, 0x49, 0xf7, 0x35, 0x4b, 0x95, 0x82, 0xa2, 0x45, 0x5d, - 0xc7, 0x55, 0xa0, 0x71, 0x45, 0x8b, 0x9c, 0x3a, 0x1b, 0xda, 0xa8, 0x9e, - 0x2d, 0x3f, 0x98, 0x5e, 0x6c, 0xd9, 0x2e, 0xcf, 0x81, 0x00, 0x23, 0xd7, - 0x1e, 0x13, 0x30, 0xc7, 0xd5, 0xc4, 0x07, 0x7a, 0x17, 0x61, 0x7a, 0x98, - 0x95, 0x0b, 0x41, 0x81, 0xe2, 0xe3, 0xa5, 0x43, 0xd4, 0xc2, 0x24, 0x02, - 0x95, 0x31, 0x9a, 0x9e, 0x43, 0xe6, 0x69, 0x41, 0xc1, 0x57, 0x53, 0x41, - 0xf4, 0x7d, 0x19, 0xd8, 0x43, 0x9f, 0x6a, 0xbf, 0xf1, 0x74, 0x96, 0x79, - 0x07, 0x49, 0xcf, 0x4f, 0x34, 0x4e, 0x0b, 0xf0, 0xa5, 0xca, 0x60, 0x38, - 0x87, 0x28, 0x56, 0x9f, 0xe2, 0xb8, 0x88, 0x9e, 0x00, 0x24, 0xc6, 0xe6, - 0x74, 0xfa, 0xa4, 0xd7, 0x04, 0xb8, 0xa9, 0x1a, 0x1b, 0x18, 0xf9, 0xcf, - 0x3a, 0xa1, 0x46, 0x11, 0xd4, 0x19, 0x7a, 0x06, 0xb0, 0x3a, 0xc2, 0xa5, - 0x8c, 0x8b, 0x51, 0x60, 0xea, 0xd4, 0x3a, 0xf4, 0x65, 0x19, 0xa0, 0xc8, - 0x97, 0x68, 0x80, 0x9f, 0xb8, 0x4d, 0x6e, 0xc8, 0x0d, 0x9b, 0xa2, 0xeb, - 0x71, 0x8a, 0x62, 0x15, 0xf8, 0xa4, 0x9f, 0x14, 0x9e, 0x41, 0x2a, 0x97, - 0x65, 0x30, 0x7a, 0x67, 0x43, 0x82, 0x9d, 0xc4, 0x9a, 0x2a, 0x2d, 0xc6, - 0x18, 0x8b, 0x4f, 0x7c, 0x77, 0x82, 0x9c, 0x37, 0xc3, 0x39, 0x12, 0x60, - 0x2b, 0x8c, 0xd3, 0x2a, 0xd7, 0xa3, 0xd5, 0xa7, 0xe0, 0x04, 0xed, 0xa0, - 0xe1, 0x08, 0xce, 0x7b, 0xc7, 0x23, 0x41, 0x32, 0x74, 0xdd, 0x09, 0xc7, - 0x42, 0x73, 0xaa, 0x34, 0x36, 0x14, 0xe1, 0xc0, 0x7d, 0x77, 0x21, 0x8b, - 0x84, 0x3c, 0x01, 0xc9, 0x19, 0x21, 0xf0, 0x88, 0x1b, 0x9f, 0x64, 0x9b, - 0x3e, 0x6b, 0x8b, 0x09, 0xad, 0x51, 0x2c, 0x0a, 0x66, 0xbe, 0x98, 0x55, - 0xfd, 0x2b, 0x3a, 0x28, 0x59, 0x78, 0x89, 0x50, 0x6f, 0xb5, 0x07, 0xcc, - 0x79, 0x22, 0x36, 0x46, 0x7f, 0xce, 0x8a, 0xc1, 0x87, 0x98, 0x43, 0x96, - 0x9b, 0xc1, 0xbc, 0xd6, 0x64, 0x66, 0x80, 0xbe, 0x6f, 0x0d, 0x01, 0x81, - 0x17, 0x69, 0x5f, 0x1b, 0x5c, 0x88, 0x7b, 0x57, 0x06, 0x57, 0xfe, 0x6c, - 0xe8, 0xec, 0x9f, 0x9d, 0xe6, 0x36, 0xa6, 0x6d, 0xe1, 0x5c, 0xaa, 0x5a, - 0x9f, 0xcf, 0xe5, 0xb4, 0xc1, 0x70, 0xfc, 0x6c, 0xf1, 0xd1, 0x93, 0xa0, - 0xae, 0xfe, 0x38, 0xb3, 0x3d, 0x16, 0xb5, 0xbf, 0x45, 0x50, 0x1e, 0x05, - 0xe6, 0x88, 0x7a, 0x01, 0x6f, 0x58, 0x63, 0x9b, 0x82, 0x48, 0xc0, 0x11, - 0xb1, 0x77, 0xeb, 0x24, 0x57, 0x87, 0x78, 0xbe, 0x87, 0x6a, 0x3b, 0xa5, - 0x0d, 0xf9, 0xe1, 0x1e, 0x21, 0xf2, 0xc7, 0x49, 0x93, 0x44, 0xfc, 0x85, - 0xd6, 0xeb, 0xf9, 0x3d, 0x0b, 0x02, 0x8e, 0xae, 0x5e, 0x11, 0x94, 0x18, - 0xfa, 0xac, 0xcd, 0xcd, 0xe2, 0x59, 0x0f, 0x25, 0x39, 0xa7, 0x6b, 0xec, - 0x5e, 0x28, 0x00, 0x38, 0xd1, 0x37, 0x62, 0x06, 0x9e, 0x47, 0x50, 0xce, - 0xa3, 0x7d, 0xc6, 0x8b, 0x17, 0xf8, 0x21, 0x99, 0x89, 0x3a, 0x16, 0xe1, - 0x60, 0x5b, 0x5f, 0xf7, 0x1e, 0x34, 0x65, 0x2c, 0x5a, 0xb2, 0x8d, 0x6e, - 0xb6, 0x77, 0xff, 0x54, 0xb4, 0x4e, 0x08, 0x75, 0x15, 0xeb, 0x1a, 0xa6, - 0x0e, 0xb9, 0x7d, 0x55, 0xa2, 0x87, 0x4e, 0x4f, 0xc7, 0xe2, 0xce, 0xcd, - 0x59, 0x67, 0x13, 0xd5, 0xc2, 0xb1, 0xb8, 0xa0, 0xa2, 0xbf, 0x94, 0xa6, - 0x69, 0x73, 0x1d, 0xb7, 0x2b, 0x15, 0x66, 0xbc, 0xf0, 0x39, 0xd6, 0x93, - 0xb6, 0xb9, 0x5e, 0xd6, 0xe9, 0x55, 0xba, 0x32, 0xe9, 0x89, 0xfa, 0x87, - 0x7f, 0x5b, 0xb3, 0x25, 0xcb, 0x39, 0xb5, 0x0b, 0x32, 0x9f, 0x79, 0x02, - 0xfd, 0xe6, 0xaa, 0x59, 0x72, 0x1d, 0x46, 0x86, 0x8c, 0xae, 0x62, 0x61, - 0x68, 0x70, 0xea, 0x89, 0x02, 0xfc, 0x9e, 0x36, 0x81, 0x5f, 0xda, 0xdb, - 0xac, 0x06, 0xc4, 0xe9, 0xb4, 0x18, 0x28, 0xb4, 0x82, 0xa9, 0xf9, 0x10, - 0x19, 0xe2, 0x6c, 0xfd, 0x7d, 0xec, 0x38, 0x9c, 0x65, 0xf7, 0xbf, 0xca, - 0x0d, 0xe5, 0xda, 0x6a, 0x0d, 0x23, 0xf3, 0x9c, 0x79, 0x18, 0x32, 0x0d, - 0x5e, 0x7e, 0x8c, 0x71, 0x52, 0xa7, 0x5a, 0x26, 0x38, 0x43, 0x1f, 0xf1, - 0x3a, 0x0e, 0xc9, 0x33, 0x0e, 0x7f, 0x23, 0x70, 0xcf, 0x03, 0x04, 0x26, - 0x66, 0x07, 0x55, 0x4b, 0x94, 0x2c, 0x18, 0x88, 0xfc, 0xff, 0x77, 0x76, - 0x94, 0x19, 0x0d, 0x27, 0x9c, 0xf4, 0xcd, 0x3e, 0x48, 0x8c, 0x5a, 0xc4, - 0x0c, 0x61, 0x8a, 0x96, 0x8c, 0xc2, 0xa3, 0xd9, 0xa1, 0xbb, 0x97, 0xa1, - 0xec, 0x26, 0x2c, 0x4d, 0xa0, 0xa6, 0xd2, 0x4c, 0x56, 0x2d, 0xb9, 0xa8, - 0xa4, 0x21, 0x29, 0x0a, 0x57, 0xa6, 0x07, 0x15, 0x97, 0x4a, 0x29, 0x64, - 0x8d, 0x9c, 0xa3, 0x35, 0xef, 0x8c, 0x63, 0xfd, 0x6a, 0xf6, 0x4c, 0xb6, - 0xb8, 0x9f, 0x01, 0x50, 0x34, 0xc8, 0xb8, 0xbc, 0x4c, 0xd0, 0xa3, 0x0a, - 0xc8, 0xe8, 0xbc, 0x67, 0x24, 0x97, 0x8c, 0xe9, 0xca, 0x1b, 0x8c, 0x40, - 0xe3, 0x4f, 0x10, 0xef, 0x6e, 0x28, 0x1e, 0xa4, 0xe7, 0x2c, 0xf7, 0x67, - 0x94, 0x24, 0x38, 0xff, 0x16, 0x21, 0x31, 0x20, 0x4f, 0x9b, 0xe0, 0xf9, - 0xf0, 0xfe, 0x2c, 0xbd, 0x8a, 0x34, 0xcf, 0xca, 0x25, 0x4f, 0x63, 0x04, - 0xf8, 0xbd, 0x2b, 0xc5, 0x2b, 0x8b, 0xbe, 0x04, 0xc2, 0xdd, 0xf9, 0x16, - 0x8e, 0x23, 0x03, 0xfa, 0x75, 0xc4, 0x9d, 0xf2, 0x53, 0xda, 0x60, 0x5e, - 0xc2, 0x43, 0x72, 0xa9, 0x60, 0xb4, 0x9a, 0x36, 0xde, 0x18, 0x14, 0x4c, - 0x7e, 0xf0, 0xcb, 0x10, 0xdc, 0x73, 0xa0, 0xe9, 0x9e, 0x0f, 0x55, 0x00, - 0x9a, 0x9c, 0x0e, 0xcd, 0x5d, 0x62, 0xa2, 0xde, 0xc9, 0x9c, 0x13, 0x41, - 0xdc, 0x90, 0xbc, 0xea, 0x46, 0x54, 0x79, 0x0f, 0xd8, 0x41, 0x5c, 0xa0, - 0x15, 0x7d, 0x7d, 0x40, 0x77, 0x8d, 0x82, 0x02, 0x7e, 0x16, 0x06, 0xaf, - 0x47, 0x3e, 0x3c, 0x47, 0x59, 0xa3, 0xb2, 0x26, 0x76, 0x8a, 0xb2, 0x85, - 0xaa, 0xe5, 0xe0, 0xe8, 0x54, 0x30, 0x9c, 0x0c, 0xed, 0x4e, 0x4b, 0x45, - 0x25, 0x87, 0xbb, 0xbc, 0xf5, 0xb6, 0x7e, 0x23, 0xc1, 0x03, 0xf0, 0x28, - 0x89, 0xe6, 0xed, 0x10, 0x5f, 0xc6, 0x57, 0x6e, 0x4b, 0x65, 0xd3, 0x51, - 0x1c, 0xd6, 0x8f, 0x7b, 0xeb, 0xda, 0x35, 0x73, 0xe1, 0x63, 0xcd, 0x98, - 0x17, 0x2c, 0x89, 0xe2, 0xa2, 0x3b, 0x7d, 0xf7, 0xba, 0x1f, 0x5d, 0x1b, - 0x85, 0xeb, 0x77, 0x25, 0xca, 0x28, 0x02, 0xe1, 0x2e, 0x6a, 0x4c, 0x48, - 0x0b, 0x39, 0x7e, 0xc2, 0x21, 0xcf, 0x64, 0x45, 0xf0, 0x7f, 0x9e, 0x9b, - 0xb3, 0xf6, 0x8e, 0x53, 0x6f, 0x36, 0x8e, 0x11, 0xbd, 0x91, 0xad, 0xda, - 0xdb, 0x85, 0xcd, 0xc5, 0x57, 0x30, 0xac, 0x08, 0x01, 0x9c, 0x37, 0x4e, - 0x9b, 0x7b, 0x8e, 0x5d, 0xf8, 0x22, 0x4e, 0xdd, 0x8c, 0xaa, 0xeb, 0x74, - 0x11, 0x81, 0x2c, 0x18, 0x0b, 0x7b, 0xc7, 0xbc, 0x1c, 0xfb, 0x49, 0xc8, - 0x87, 0xb6, 0x76, 0x02, 0xd7, 0xd3, 0x72, 0x94, 0x05, 0x55, 0x35, 0x91, - 0x6b, 0x1e, 0x52, 0x3f, 0x4c, 0x7c, 0xbf, 0x4d, 0x0b, 0x2f, 0xa1, 0x42, - 0x1e, 0x5a, 0xfe, 0xe7, 0x1a, 0x51, 0x2a, 0x99, 0x0f, 0xdf, 0xb8, 0xb7, - 0x05, 0xc2, 0x75, 0x46, 0x0f, 0x6f, 0x74, 0x39, 0x3b, 0x33, 0x0c, 0x8b, - 0x39, 0xad, 0x5b, 0x0d, 0xad, 0xb1, 0xc0, 0xeb, 0x78, 0x06, 0x94, 0x62, - 0x76, 0xab, 0xa7, 0xff, 0x0b, 0xf8, 0xa8, 0x40, 0xb6, 0x9d, 0x36, 0xef, - 0x46, 0x63, 0xfa, 0x06, 0xb4, 0x30, 0x15, 0x22, 0xb2, 0xce, 0x8b, 0x7b, - 0x9f, 0x96, 0x0d, 0xcf, 0x55, 0xe2, 0xe3, 0xab, 0x98, 0x67, 0xae, 0x29, - 0x68, 0x00, 0x9a, 0x1e, 0x53, 0x9c, 0xa3, 0x74, 0xb2, 0xa6, 0x2e, 0x67, - 0x7a, 0x95, 0xd0, 0xa3, 0xf9, 0xbd, 0x1a, 0x6a, 0xd6, 0x7b, 0x75, 0xc1, - 0xaf, 0xbb, 0x7b, 0x43, 0xaf, 0x24, 0x21, 0x2e, 0x29, 0x68, 0x0e, 0x59, - 0xb4, 0x48, 0x42, 0x3d, 0x72, 0xe3, 0xa5, 0x58, 0xf9, 0xbb, 0x51, 0x55, - 0x78, 0x81, 0xf8, 0x73, 0x45, 0x4d, 0x76, 0x16, 0x61, 0x52, 0x70, 0xe0, - 0x5f, 0xd7, 0x5e, 0x43, 0x78, 0xa2, 0xa9, 0x2e, 0xda, 0x24, 0x5e, 0xad, - 0x19, 0x74, 0xbf, 0x93, 0xac, 0x89, 0xaf, 0xae, 0x76, 0x23, 0x0b, 0xe6, - 0xa4, 0x3b, 0xac, 0x98, 0xe5, 0x68, 0x6c, 0x5d, 0x7f, 0x4a, 0xa3, 0x3f, - 0xa5, 0x40, 0x1c, 0x1b, 0xb7, 0xb5, 0x58, 0x62, 0xaf, 0x74, 0xc1, 0x6f, - 0xba, 0x1c, 0xba, 0x10, 0x24, 0xb7, 0x8b, 0x49, 0xc1, 0xf8, 0xf5, 0xb2, - 0xa9, 0x91, 0xdd, 0xf1, 0xe3, 0x99, 0x85, 0x8b, 0x71, 0x61, 0xd7, 0x96, - 0xa6, 0x2f, 0xa9, 0xef, 0x6e, 0x25, 0xb2, 0x9b, 0x60, 0x33, 0xbc, 0x3a, - 0x3a, 0x2f, 0x23, 0x5b, 0x90, 0x17, 0xb2, 0x80, 0xa8, 0x93, 0x49, 0x52, - 0x26, 0xfd, 0xd2, 0xb7, 0x08, 0xfc, 0x5d, 0x31, 0xb6, 0xa6, 0xb0, 0x27, - 0x54, 0x35, 0xf7, 0x68, 0x9b, 0x45, 0xe5, 0xca, 0x80, 0x05, 0xc4, 0x52, - 0x51, 0xe9, 0x55, 0x99, 0xf4, 0x56, 0x79, 0x03, 0xae, 0xea, 0xec, 0x45, - 0x93, 0x64, 0x00, 0xde, 0x0f, 0x2c, 0xf9, 0xbf, 0xa7, 0x70, 0xf9, 0x6d, - 0x65, 0x84, 0x3c, 0x11, 0xc6, 0x05, 0x00, 0xf4, 0x24, 0xb9, 0xd8, 0xce, - 0xc3, 0x93, 0xd3, 0xf8, 0xab, 0x7d, 0x80, 0xd0, 0x27, 0xc4, 0xe0, 0x44, - 0xa6, 0x3b, 0xef, 0xc2, 0x8b, 0xcf, 0x96, 0xe8, 0x6c, 0x54, 0x74, 0x2f, - 0xed, 0x63, 0x9d, 0x82, 0xf3, 0x1e, 0x58, 0xec, 0xb8, 0x87, 0x27, 0x3a, - 0xed, 0x81, 0x2b, 0xf8, 0x0a, 0x21, 0x4c, 0xe0, 0x24, 0x68, 0x64, 0x30, - 0x65, 0x3d, 0x62, 0xe3, 0x7f, 0x21, 0x80, 0xd7, 0x68, 0xca, 0xa6, 0xfd, - 0x8e, 0x9e, 0xd9, 0xd9, 0x11, 0x80, 0xdd, 0x45, 0x10, 0x37, 0x28, 0xb6, - 0xa1, 0xdd, 0xea, 0xea, 0x40, 0x7e, 0x1c, 0xa5, 0x41, 0xf7, 0xa1, 0xed, - 0xf9, 0x4e, 0x7f, 0xd0, 0xdd, 0xd8, 0x4c, 0xca, 0x21, 0x26, 0x27, 0x80, - 0xcc, 0x2d, 0x6c, 0x6a, 0xee, 0xb3, 0x5d, 0x68, 0x85, 0xc5, 0x0b, 0x10, - 0x5a, 0x9f, 0xc1, 0xda, 0xb4, 0xbc, 0x98, 0x5f, 0x4e, 0x32, 0x9b, 0xe7, - 0xcf, 0xee, 0xcf, 0x02, 0x0a, 0xe0, 0x34, 0xa0, 0xf1, 0x40, 0x65, 0xb6, - 0x5d, 0x81, 0x0f, 0x47, 0xaf, 0xbb, 0x49, 0x0f, 0x45, 0x7b, 0x34, 0x1c, - 0xe1, 0x3e, 0xa9, 0xd2, 0xa4, 0xa9, 0x52, 0xef, 0x17, 0x90, 0xef, 0x69, - 0xe5, 0x31, 0x0f, 0xd5, 0x56, 0x42, 0xa2, 0x62, 0xc2, 0x05, 0xdd, 0x93, - 0x2f, 0x77, 0x21, 0x04, 0x5e, 0x12, 0x05, 0x99, 0x1e, 0xf3, 0xf3, 0x85, - 0xc7, 0xc6, 0x21, 0xb7, 0xb5, 0x3e, 0x86, 0x23, 0x34, 0xda, 0x98, 0x3a, - 0x86, 0xab, 0xbe, 0xc5, 0x36, 0xbc, 0xbe, 0x96, 0x49, 0x1b, 0x78, 0x8f, - 0x5c, 0x05, 0xa1, 0x98, 0x7b, 0xd7, 0xc0, 0x20, 0x95, 0x7d, 0x2e, 0x08, - 0x77, 0x36, 0xea, 0x77, 0x54, 0x6f, 0x9c, 0x39, 0x64, 0x61, 0xb1, 0x10, - 0x2d, 0xe1, 0x25, 0x74, 0xf2, 0xff, 0xfc, 0xff, 0x48, 0x07, 0xb3, 0x34, - 0x65, 0xdc, 0x72, 0xf8, 0xa7, 0x7f, 0x27, 0x4c, 0x02, 0x36, 0x43, 0xa6, - 0x0c, 0x63, 0x47, 0x9c, 0xcc, 0xf5, 0xc6, 0x75, 0x3d, 0xc0, 0xa8, 0x53, - 0x6a, 0x20, 0x00, 0xc0, 0xef, 0xcf, 0x79, 0x3b, 0x3b, 0x44, 0x8c, 0x8c, - 0x65, 0xd0, 0xc5, 0x77, 0x0d, 0x09, 0x02, 0xe1, 0xd4, 0x23, 0xe3, 0xf9, - 0xe9, 0x18, 0x9a, 0x64, 0x8c, 0x15, 0xcc, 0xbe, 0x1f, 0xae, 0x4d, 0xf1, - 0xfa, 0x12, 0x92, 0xe6, 0x7f, 0x4c, 0x12, 0xd4, 0xcc, 0x93, 0x95, 0x4d, - 0xe4, 0x59, 0x9c, 0xc3, 0x56, 0x6f, 0x4a, 0x21, 0xff, 0xbf, 0x80, 0x43, - 0x7a, 0xc1, 0x9f, 0x39, 0xed, 0xca, 0x76, 0x0a, 0xeb, 0x0a, 0x86, 0x72, - 0x60, 0x45, 0x61, 0xa4, 0xdc, 0x9b, 0xd9, 0x2a, 0x49, 0xe0, 0xce, 0xd0, - 0xbb, 0x86, 0xd0, 0xdb, 0xbf, 0xef, 0xe4, 0x46, 0x2b, 0x6e, 0xb0, 0x16, - 0x15, 0xc9, 0x2b, 0x37, 0xd9, 0x4c, 0xb0, 0x89, 0x30, 0xd7, 0x1a, 0x02, - 0x6e, 0x39, 0x30, 0x34, 0x62, 0xa8, 0xc4, 0xc1, 0x98, 0xee, 0x99, 0x2c, - 0x18, 0xbe, 0x1b, 0x04, 0xbf, 0xa2, 0x8a, 0x71, 0xc5, 0x1c, 0x4a, 0xb3, - 0x22, 0xd6, 0xff, 0x8e, 0x3a, 0x39, 0x7c, 0xf4, 0x7d, 0xa0, 0x28, 0x35, - 0xb6, 0xf3, 0xc3, 0x9a, 0x30, 0x28, 0x56, 0xfc, 0xa5, 0x2a, 0x0f, 0x60, - 0xf6, 0x23, 0xb6, 0x80, 0x7f, 0x26, 0xee, 0xd0, 0x78, 0xc6, 0xad, 0xf4, - 0xbc, 0xc3, 0x70, 0xbd, 0x17, 0x3d, 0x60, 0x04, 0x09, 0xb0, 0x9f, 0x53, - 0xee, 0x79, 0xe3, 0x28, 0x21, 0x55, 0xad, 0xd9, 0x66, 0xf1, 0xdb, 0x73, - 0x18, 0x25, 0x2b, 0xc1, 0x0d, 0x47, 0xb8, 0x9f, 0xb1, 0x6e, 0x0b, 0x29, - 0xd0, 0xc8, 0xc3, 0x9a, 0xf7, 0xa7, 0xb6, 0xc7, 0xcc, 0xa4, 0x85, 0xc2, - 0x90, 0x73, 0x0c, 0xad, 0x6f, 0xdc, 0xd5, 0x3f, 0x46, 0xfe, 0xd2, 0xff, - 0xae, 0xa8, 0xdc, 0xef, 0xbc, 0xa7, 0xf1, 0x0e, 0x29, 0x9e, 0x6e, 0xbd, - 0x14, 0x40, 0xd5, 0xcf, 0xdb, 0xde, 0x6f, 0xdd, 0x2b, 0x6e, 0x37, 0x0f, - 0x38, 0x00, 0x5b, 0xe7, 0xbf, 0x32, 0xc0, 0x45, 0x2d, 0xe3, 0x65, 0x61, - 0x79, 0x34, 0x7a, 0x23, 0xae, 0xef, 0x2b, 0x9f, 0x2c, 0x24, 0xb0, 0xdb, - 0xd9, 0xe1, 0x85, 0xae, 0x6f, 0x2a, 0xb1, 0x0f, 0x61, 0x12, 0x53, 0x6c, - 0x3d, 0x7f, 0xe0, 0x63, 0xa6, 0xf8, 0x20, 0x13, 0xb3, 0xa4, 0xeb, 0xca, - 0xe9, 0x7b, 0x0e, 0x2f, 0x93, 0xd6, 0x03, 0x7c, 0x8f, 0xd8, 0x3f, 0xc2, - 0x85, 0x82, 0x8b, 0x65, 0x50, 0x43, 0xdd, 0x1c, 0x59, 0x63, 0xf0, 0x82, - 0xb8, 0x39, 0xa8, 0xa0, 0x0e, 0x6f, 0x88, 0x2b, 0x24, 0x73, 0x6c, 0x57, - 0xd7, 0xc9, 0x57, 0xf9, 0x5e, 0x1a, 0xb8, 0xd8, 0x04, 0xbe, 0x35, 0x0b, - 0x9a, 0x9e, 0xbd, 0xc0, 0x84, 0x9a, 0x93, 0xe9, 0xb2, 0xc2, 0x50, 0x7b, - 0x22, 0x9e, 0x31, 0x8d, 0xbe, 0xaf, 0x37, 0xfb, 0x59, 0x68, 0x7e, 0x3f, - 0x4d, 0x08, 0xd5, 0x5b, 0x60, 0x43, 0xcc, 0xe1, 0xe8, 0xca, 0xda, 0x76, - 0x91, 0x01, 0x21, 0x2f, 0x4c, 0xc5, 0x0e, 0xb5, 0x7b, 0x79, 0x16, 0x7b, - 0x66, 0xa8, 0x1d, 0x8c, 0xc4, 0x5d, 0xf5, 0xf0, 0xf3, 0x2e, 0xe6, 0xd6, - 0x3a, 0x29, 0x2a, 0xf8, 0xec, 0xa9, 0x78, 0x98, 0xbf, 0x06, 0x08, 0xee, - 0x79, 0x4f, 0xc7, 0xad, 0xe7, 0x71, 0xa1, 0x7f, 0x84, 0xda, 0x8d, 0x4b, - 0x41, 0x6f, 0xe1, 0xaf, 0x32, 0x92, 0x39, 0xb7, 0x40, 0x96, 0xe7, 0x6f, - 0x0a, 0x07, 0xca, 0xcb, 0x1c, 0x7f, 0x3a, 0x12, 0x28, 0xe2, 0x81, 0x11, - 0xe0, 0x3d, 0xd5, 0x27, 0xa6, 0xbb, 0x17, 0xf5, 0xf8, 0x3e, 0x00, 0xd9, - 0x4e, 0xd8, 0x03, 0xeb, 0xd7, 0xf6, 0x01, 0xbb, 0x95, 0x41, 0x1e, 0xf3, - 0xae, 0xde, 0x7d, 0x34, 0xff, 0x95, 0x19, 0x4e, 0x70, 0xcd, 0xf8, 0x14, - 0x95, 0xa0, 0xf7, 0x04, 0xd8, 0x85, 0x5b, 0xbd, 0x27, 0xae, 0x79, 0x5f, - 0xa7, 0x13, 0x34, 0xec, 0x8e, 0xd5, 0x8a, 0x7b, 0x8d, 0xb6, 0x3c, 0x9b, - 0x74, 0xfb, 0x04, 0xc4, 0x5f, 0xb8, 0x53, 0x3f, 0xe2, 0x5c, 0xfd, 0x09, - 0xd4, 0x02, 0xc7, 0xa5, 0xbb, 0xf8, 0xd9, 0xef, 0x1c, 0x74, 0xf7, 0xe6, - 0x35, 0x89, 0xd9, 0x5f, 0x05, 0xd7, 0xc9, 0xfd, 0x20, 0xee, 0x3c, 0x12, - 0xb8, 0xeb, 0x72, 0x6d, 0xda, 0x8d, 0x3c, 0x2b, 0x5a, 0x28, 0x82, 0xaf, - 0x37, 0xfe, 0x8d, 0x04, 0x05, 0x5e, 0x5a, 0x09, 0x21, 0xb7, 0x5f, 0xf4, - 0xe8, 0x05, 0x14, 0x26, 0xe5, 0x88, 0x66, 0xb1, 0xde, 0xb2, 0x5e, 0x61, - 0xaf, 0x96, 0x2d, 0x1a, 0x8e, 0xf0, 0xb9, 0xc1, 0x01, 0xf2, 0x30, 0x09, - 0x2c, 0xd9, 0x6d, 0x48, 0xdb, 0xca, 0xe5, 0xc5, 0x94, 0x54, 0x4d, 0xc4, - 0x65, 0x1c, 0x3d, 0xef, 0x7b, 0x80, 0x34, 0xc3, 0xc9, 0xe2, 0x8a, 0x73, - 0x13, 0x60, 0x6e, 0x3f, 0x5a, 0x16, 0x29, 0x0b, 0x48, 0xf9, 0x85, 0x41, - 0x1d, 0xdf, 0xc8, 0x33, 0x96, 0x3a, 0xc9, 0xa9, 0xab, 0x11, 0x89, 0x01, - 0x07, 0x90, 0xd3, 0x77, 0xfc, 0x55, 0x34, 0x3e, 0x73, 0xbb, 0xa2, 0xe9, - 0x15, 0xfc, 0x4d, 0x52, 0x8a, 0x15, 0xcc, 0x35, 0x9f, 0x6d, 0xc8, 0x43, - 0x5a, 0xf0, 0x56, 0xad, 0x28, 0x24, 0x50, 0xed, 0x45, 0xc3, 0xc4, 0x8d, - 0x09, 0xbc, 0x03, 0xf4, 0x7b, 0x51, 0x91, 0xc5, 0x94, 0xa8, 0x6c, 0x5e, - 0xfd, 0xea, 0x5b, 0xe5, 0xe9, 0x25, 0x39, 0x15, 0x2f, 0x64, 0xcb, 0x71, - 0x97, 0x7a, 0xd4, 0x83, 0x6c, 0x76, 0xce, 0xd5, 0x6e, 0x49, 0xbe, 0xdf, - 0x2b, 0x25, 0xb2, 0xe8, 0xd3, 0x0e, 0xa1, 0xf8, 0x11, 0x00, 0x06, 0x74, - 0xee, 0x51, 0x90, 0x7f, 0xa3, 0x9f, 0x56, 0xab, 0x92, 0x5d, 0xc6, 0xdb, - 0x12, 0xc9, 0xd0, 0x6f, 0xaa, 0xbb, 0xb6, 0xc9, 0xf7, 0xc9, 0x29, 0xdd, - 0x8c, 0x22, 0x26, 0x28, 0xe2, 0xab, 0x02, 0xbd, 0xaf, 0x8e, 0x38, 0xc0, - 0xd7, 0x42, 0xa1, 0x8a, 0xd8, 0xcf, 0x3a, 0x1c, 0x46, 0x9f, 0x6c, 0x8e, - 0x4b, 0x29, 0xfa, 0xd0, 0x59, 0x55, 0xed, 0x62, 0x77, 0xbd, 0x70, 0x67, - 0xd3, 0x33, 0x03, 0x9f, 0xd0, 0xd8, 0xbd, 0x6b, 0x38, 0x2d, 0x8a, 0xb1, - 0xfc, 0x6d, 0x08, 0xe0, 0x50, 0x0f, 0xb3, 0x9a, 0x40, 0x70, 0x72, 0x90, - 0xea, 0x2a, 0x6a, 0x8b, 0xd4, 0xc0, 0x4e, 0xaf, 0x34, 0xde, 0xf1, 0xa8, - 0x8a, 0xaf, 0xb8, 0xc8, 0xd7, 0x4c, 0xbf, 0x11, 0x7c, 0x58, 0x8a, 0x9f, - 0xbb, 0xf8, 0x22, 0xdf, 0x75, 0x22, 0x0e, 0x1a, 0x32, 0xdf, 0xaf, 0xfc, - 0xd7, 0xbb, 0x1f, 0xd7, 0xee, 0xf9, 0x9d, 0xfb, 0x5d, 0x74, 0x3c, 0x05, - 0x7d, 0xc1, 0x59, 0x4c, 0x4b, 0xf5, 0x5e, 0x93, 0x12, 0x3e, 0x8b, 0x94, - 0x0c, 0x2c, 0x56, 0x12, 0xba, 0x87, 0x0f, 0x59, 0x3a, 0x77, 0x64, 0x81, - 0xa5, 0x17, 0xdf, 0xe7, 0x21, 0x39, 0xeb, 0x96, 0x36, 0x94, 0xb1, 0x28, - 0x7a, 0xb4, 0x8f, 0x1d, 0x37, 0xe1, 0x8a, 0x83, 0xf2, 0x4b, 0xdd, 0x93, - 0x73, 0x77, 0x37, 0x0e, 0xfa, 0x7e, 0x8c, 0xaa, 0xf5, 0xb7, 0x73, 0xc1, - 0x15, 0x64, 0x93, 0xe0, 0x3d, 0x66, 0x6f, 0x06, 0xaa, 0xb2, 0x8c, 0x9d, - 0x72, 0xa6, 0x8e, 0xdd, 0x5f, 0xea, 0x02, 0x06, 0xb9, 0x56, 0xcc, 0xf6, - 0x52, 0x00, 0xe4, 0xf7, 0xa1, 0xd9, 0x4e, 0xf6, 0x1a, 0x98, 0xef, 0xcd, - 0xcc, 0x2c, 0x10, 0xa8, 0x35, 0xfa, 0xed, 0xee, 0x3d, 0x4c, 0x2d, 0x8d, - 0x51, 0xf3, 0x73, 0x2a, 0xb0, 0xf2, 0xd1, 0x5d, 0xd5, 0xd8, 0xf6, 0x99, - 0x86, 0x13, 0x44, 0x25, 0x0e, 0xec, 0x05, 0xff, 0x90, 0x1e, 0xde, 0xb6, - 0xb6, 0x35, 0x5c, 0xec, 0xb5, 0x60, 0x1f, 0x9d, 0xa1, 0x62, 0x25, 0x76, - 0xb3, 0x10, 0x5d, 0xf7, 0x7b, 0xae, 0x2c, 0xdc, 0xb0, 0xd3, 0x59, 0x31, - 0xdc, 0x9f, 0x0f, 0x4b, 0x93, 0x3d, 0x58, 0x90, 0x8d, 0x21, 0x28, 0xa4, - 0x4d, 0xdb, 0xda, 0x56, 0x06, 0x8c, 0x8c, 0xb3, 0xab, 0x7f, 0x53, 0x25, - 0x20, 0x2d, 0x92, 0xe7, 0x92, 0xd3, 0x84, 0x1d, 0xf3, 0xae, 0x17, 0x2d, - 0xfd, 0x99, 0x37, 0x02, 0x8e, 0x73, 0x8a, 0x74, 0x80, 0xe4, 0x9a, 0xf8, - 0x92, 0x55, 0x44, 0x1f, 0xb2, 0x7a, 0x04, 0x2d, 0x37, 0x26, 0x73, 0x67, - 0xd1, 0x37, 0x15, 0xf8, 0x8e, 0x27, 0x76, 0xb0, 0x15, 0x24, 0x39, 0x8d, - 0xa6, 0xe9, 0x18, 0x0d, 0x8b, 0x5b, 0xbf, 0x01, 0x85, 0x85, 0xa6, 0x06, - 0xae, 0x93, 0xd4, 0x06, 0xd5, 0xf1, 0xa0, 0x06, 0xc1, 0xf9, 0x4d, 0xa1, - 0xbe, 0xc2, 0x19, 0x61, 0x09, 0x3e, 0x0a, 0x05, 0xbe, 0x6d, 0xaf, 0x70, - 0x06, 0x86, 0xfd, 0x86, 0xe3, 0xe0, 0x25, 0x33, 0xfb, 0xda, 0xbe, 0x85, - 0x39, 0x82, 0xdb, 0xc4, 0xc8, 0x26, 0x06, 0x26, 0x41, 0x06, 0xe3, 0xfb, - 0x85, 0x3b, 0xd9, 0x97, 0x17, 0xe4, 0xea, 0xe6, 0x94, 0x9d, 0x78, 0x3a, - 0x3b, 0xca, 0xcb, 0x91, 0x3a, 0x8b, 0x5c, 0x6e, 0xe5, 0xc1, 0xd6, 0x49, - 0x93, 0x81, 0x80, 0x0e, 0x0c, 0x25, 0x9f, 0x00, 0x05, 0x8a, 0x11, 0xbb, - 0x8d, 0x08, 0x83, 0x73, 0x0e, 0x15, 0x81, 0xff, 0xa8, 0x35, 0xf0, 0xd9, - 0x69, 0x9e, 0x26, 0x3f, 0x7a, 0xc3, 0x40, 0xac, 0xda, 0x91, 0xf3, 0x62, - 0x59, 0x7d, 0x80, 0x14, 0xad, 0xd7, 0x20, 0xce, 0xe7, 0x93, 0x02, 0x28, - 0x83, 0x89, 0x94, 0x67, 0x4b, 0x26, 0x15, 0x13, 0xd1, 0x32, 0xf1, 0xa7, - 0x0e, 0xf0, 0xc4, 0xf1, 0xf0, 0xef, 0xa9, 0x30, 0xb8, 0xbd, 0x78, 0xee, - 0xb6, 0x40, 0x50, 0x7a, 0xe5, 0xe2, 0x90, 0xaf, 0x0c, 0x5c, 0xde, 0xb1, - 0x01, 0x36, 0x79, 0xf3, 0xfe, 0x31, 0x53, 0xf9, 0xff, 0x1b, 0x31, 0x14, - 0x8c, 0xff, 0xee, 0x1f, 0x1d, 0xd6, 0x02, 0xda, 0x2b, 0xa0, 0xdd, 0xc4, - 0x7c, 0xd2, 0xbe, 0x1c, 0xdd, 0x9b, 0xfa, 0xe9, 0x4d, 0x88, 0x06, 0xfd, - 0x51, 0x1e, 0x6c, 0xe2, 0x83, 0x9c, 0x82, 0xd3, 0xfd, 0xc4, 0x20, 0xd0, - 0x18, 0x8d, 0x04, 0xaa, 0x5d, 0x23, 0x8f, 0xeb, 0xa0, 0x9e, 0x9c, 0x28, - 0x27, 0x58, 0xed, 0x20, 0xf8, 0xd8, 0x93, 0xce, 0x1e, 0xcf, 0xe9, 0xce, - 0x42, 0xe5, 0x45, 0x1f, 0xcc, 0x4b, 0x5d, 0x08, 0x30, 0x66, 0xa2, 0x8c, - 0x01, 0x81, 0x44, 0xfe, 0xcc, 0x7d, 0x3c, 0xef, 0xe7, 0x51, 0x6d, 0x54, - 0xab, 0x7a, 0xc4, 0x9c, 0x27, 0x1b, 0x8c, 0xe4, 0x5d, 0xe4, 0xb2, 0xeb, - 0xbd, 0xaa, 0xcc, 0x19, 0x0d, 0xaf, 0x8e, 0x3a, 0xe9, 0x36, 0x81, 0xc8, - 0xc2, 0x28, 0x2f, 0x95, 0xa6, 0xa0, 0x03, 0x13, 0x15, 0x58, 0x27, 0x11, - 0x27, 0xa8, 0x3c, 0x23, 0xbd, 0x49, 0x38, 0x38, 0xc6, 0x99, 0xd5, 0x7a, - 0xe3, 0x49, 0x7d, 0x6f, 0x3c, 0xfe, 0x6e, 0x42, 0x4d, 0x9b, 0xa6, 0x01, - 0xe4, 0xe6, 0x4b, 0xe9, 0x54, 0x36, 0x4f, 0xb7, 0x1b, 0xa0, 0xe5, 0x0d, - 0xa4, 0x6a, 0x92, 0xb4, 0xc6, 0x1a, 0x52, 0x04, 0xad, 0xe4, 0xeb, 0xef, - 0xe3, 0xcb, 0xaa, 0xc8, 0xf9, 0x4a, 0xff, 0xa6, 0xd0, 0x12, 0x12, 0x0c, - 0x32, 0x38, 0xf6, 0x2e, 0xc9, 0x5d, 0xd2, 0xc4, 0xb3, 0x14, 0xe1, 0x33, - 0x5a, 0xf9, 0x4d, 0x8f, 0x5b, 0x38, 0xb3, 0xc0, 0x84, 0x49, 0xbf, 0xd0, - 0x39, 0x52, 0xce, 0xa2, 0x6e, 0x4b, 0x84, 0xf5, 0x77, 0x51, 0x22, 0x0e, - 0x6e, 0xe0, 0x05, 0x92, 0x9f, 0x2d, 0x00, 0x42, 0x03, 0x43, 0x59, 0xe3, - 0x65, 0xdf, 0x6e, 0x25, 0x38, 0x1f, 0xd8, 0x26, 0x8e, 0xf6, 0x68, 0x04, - 0xc9, 0xa2, 0x18, 0x0b, 0x85, 0xea, 0x79, 0x84, 0xd2, 0x6a, 0xd2, 0x11, - 0xdf, 0xaa, 0xda, 0xd8, 0xfd, 0x84, 0x65, 0x83, 0x89, 0x8b, 0x4d, 0x3b, - 0x8f, 0x08, 0x65, 0x44, 0x5a, 0xc4, 0x77, 0xae, 0xc0, 0xab, 0xc6, 0xca, - 0x1a, 0xc7, 0x23, 0x71, 0x5f, 0x86, 0xe2, 0xa3, 0xe0, 0x0e, 0x5a, 0x22, - 0x3a, 0xa3, 0x3b, 0x92, 0x01, 0xc3, 0x49, 0xa7, 0x30, 0x23, 0x52, 0x35, - 0x75, 0x53, 0xb4, 0xe7, 0x8f, 0x2c, 0x2c, 0x09, 0x29, 0x5f, 0x58, 0x40, - 0xba, 0xdd, 0xde, 0x0e, 0x77, 0x89, 0x9c, 0x2b, 0x7c, 0x63, 0x49, 0x43, - 0x78, 0x34, 0x06, 0x1d, 0xd1, 0x72, 0xfc, 0xbf, 0x82, 0x4e, 0x20, 0x3d, - 0x72, 0xe1, 0x1b, 0x4f, 0x41, 0x56, 0xda, 0xaf, 0xc5, 0x4b, 0xf8, 0x1b, - 0xbc, 0x59, 0x13, 0x05, 0x29, 0x15, 0x92, 0x07, 0x9f, 0xa6, 0x4f, 0xe5, - 0x7e, 0x2c, 0xcb, 0x2e, 0xbf, 0x5b, 0x73, 0x66, 0xf8, 0x0a, 0x61, 0x25, - 0xc6, 0x09, 0x9d, 0xfb, 0x7d, 0xde, 0x68, 0xf3, 0xba, 0x8b, 0x23, 0x5b, - 0x05, 0xbd, 0x66, 0xf4, 0x32, 0x2a, 0xc1, 0xd8, 0x24, 0xae, 0x4a, 0xbd, - 0xbe, 0x6e, 0xe5, 0x04, 0x7c, 0x8a, 0x12, 0x60, 0xdf, 0x12, 0x26, 0xd8, - 0x8e, 0xcf, 0x4d, 0x0b, 0x12, 0xe3, 0x60, 0x3e, 0xf2, 0x12, 0xcd, 0x5c, - 0x51, 0x82, 0x5d, 0xf4, 0x54, 0x75, 0xfc, 0x17, 0xcc, 0x73, 0x28, 0xc9, - 0x64, 0xec, 0x09, 0x98, 0xf0, 0x7e, 0xc5, 0xa4, 0xb3, 0x96, 0xef, 0xc9, - 0x78, 0x6d, 0xe9, 0xf9, 0xc7, 0x39, 0x84, 0x33, 0xf3, 0x37, 0xe3, 0xe0, - 0x66, 0xa6, 0x12, 0xba, 0xe4, 0x4b, 0x98, 0xd4, 0xad, 0x6e, 0x4c, 0xca, - 0x81, 0x79, 0x81, 0xf8, 0x37, 0xb2, 0xce, 0xee, 0x26, 0x2b, 0xf5, 0x87, - 0xcd, 0x3e, 0x84, 0x7a, 0x2f, 0x41, 0xdd, 0xa3, 0xe5, 0x9d, 0x10, 0x33, - 0x60, 0xfd, 0x9f, 0xbd, 0xe7, 0x67, 0x1a, 0x91, 0xf0, 0x4a, 0x48, 0xfd, - 0x97, 0x0b, 0x89, 0xb3, 0x22, 0x2d, 0x83, 0xa5, 0xb3, 0x3d, 0x28, 0xa4, - 0xd3, 0x79, 0x43, 0x04, 0x48, 0x0f, 0x55, 0xa8, 0x73, 0x64, 0xfc, 0xbf, - 0xb8, 0x46, 0x97, 0xcc, 0x53, 0x0f, 0xe0, 0x87, 0x4e, 0x2d, 0x41, 0x82, - 0x2b, 0x00, 0x29, 0xc1, 0x07, 0xb0, 0x1f, 0xfe, 0xa3, 0x67, 0x5f, 0x64, - 0x17, 0x92, 0x79, 0xab, 0xfa, 0xda, 0x3e, 0x26, 0x91, 0xed, 0x0f, 0xd0, - 0x84, 0x5b, 0x4b, 0xc6, 0xcf, 0x81, 0x6f, 0x6c, 0x08, 0xc5, 0x10, 0x00, - 0x0a, 0x71, 0x2f, 0x6d, 0x6a, 0x7b, 0x38, 0xec, 0x51, 0xa6, 0x48, 0x15, - 0x13, 0x7d, 0xcf, 0x87, 0x83, 0x8d, 0xc8, 0xf4, 0xc1, 0xd2, 0x5e, 0x20, - 0xe9, 0xa5, 0xbf, 0x29, 0x52, 0xb7, 0xd4, 0xf1, 0x41, 0x98, 0x1d, 0x9d, - 0xed, 0xd1, 0x36, 0x9b, 0x93, 0x53, 0x7b, 0xf7, 0x5e, 0xb9, 0xed, 0x21, - 0xd8, 0x62, 0x43, 0xae, 0x61, 0xa3, 0xc2, 0xc2, 0x0d, 0x51, 0xd8, 0x2d, - 0x20, 0xb5, 0xe1, 0x74, 0x94, 0xfd, 0x12, 0x97, 0x62, 0xe2, 0xe4, 0x0b, - 0x9c, 0xe4, 0xce, 0x98, 0x7f, 0xb5, 0x82, 0xb1, 0xf8, 0xbd, 0x2d, 0xaf, - 0x86, 0xbd, 0x3f, 0xbf, 0x1f, 0xa3, 0x20, 0x35, 0x01, 0xd7, 0xc1, 0x6e, - 0xab, 0x88, 0xc2, 0x39, 0x29, 0x09, 0x9f, 0x48, 0x0e, 0x5c, 0x7a, 0xb6, - 0x32, 0x75, 0x17, 0x4c, 0xe9, 0x50, 0x02, 0x90, 0x66, 0xf4, 0xb7, 0xa9, - 0xe0, 0xc8, 0x36, 0x5f, 0xae, 0x32, 0x5b, 0xf2, 0x00, 0xd5, 0x41, 0x4e, - 0x0f, 0xba, 0x1c, 0xf7, 0x76, 0x3c, 0x60, 0xd5, 0xd2, 0xa5, 0xbe, 0xac, - 0xda, 0x99, 0x42, 0x4b, 0xed, 0x3a, 0x6a, 0x5c, 0x8c, 0x73, 0xaf, 0x58, - 0x99, 0x0b, 0x1e, 0xbf, 0xfa, 0x95, 0x57, 0x0a, 0x12, 0xb8, 0xd4, 0x58, - 0xed, 0xf7, 0x77, 0x3b, 0x40, 0x9a, 0x16, 0x22, 0x60, 0x2f, 0x93, 0xa6, - 0x1c, 0xa2, 0x6f, 0x91, 0x89, 0x74, 0x48, 0xc8, 0xc0, 0x7b, 0xe9, 0xba, - 0x6b, 0x97, 0x0f, 0x47, 0xb9, 0xb1, 0x19, 0xda, 0x3f, 0x0d, 0x68, 0xc0, - 0xd0, 0xf8, 0x56, 0x82, 0xcf, 0xf9, 0x38, 0x1d, 0xe7, 0xc1, 0x6b, 0x69, - 0x08, 0xb7, 0x9f, 0xfd, 0x79, 0x86, 0xeb, 0x7c, 0xee, 0xe2, 0x2b, 0xc5, - 0xf2, 0x78, 0x73, 0xfb, 0x02, 0x6a, 0xd5, 0x84, 0x00, 0x3f, 0x48, 0x3e, - 0xf5, 0xa8, 0x25, 0x52, 0xac, 0x68, 0x70, 0x72, 0xf6, 0x67, 0xca, 0xa6, - 0x47, 0xb0, 0xfa, 0xa9, 0x24, 0xde, 0x1a, 0xea, 0xfe, 0x28, 0x05, 0xd5, - 0x04, 0xe8, 0x54, 0x74, 0xe3, 0xe1, 0x9e, 0x0e, 0x19, 0xa8, 0x30, 0x2c, - 0x77, 0xff, 0x1f, 0x91, 0x47, 0xda, 0xc6, 0x9f, 0x80, 0xe0, 0x07, 0xbf, - 0x68, 0xf8, 0x14, 0x1d, 0x4b, 0xd8, 0xd7, 0xf2, 0xc1, 0x27, 0x94, 0x09, - 0xe7, 0xf5, 0xb6, 0x7e, 0x91, 0x55, 0x1b, 0x65, 0x9a, 0xa6, 0x3f, 0x38, - 0x4f, 0x23, 0xaf, 0x42, 0x1e, 0x17, 0xb7, 0x8f, 0xdb, 0x00, 0x2f, 0xe7, - 0x60, 0x7f, 0x97, 0x7d, 0xcc, 0xf7, 0x13, 0xc6, 0x9d, 0x7e, 0xc6, 0x3b, - 0x2d, 0xda, 0x8a, 0xd1, 0xd4, 0x8a, 0x3c, 0xaa, 0xc8, 0xdd, 0x1e, 0x88, - 0xd3, 0xa1, 0xb5, 0x34, 0xf6, 0x39, 0x25, 0xe7, 0xfe, 0xff, 0x90, 0x4f, - 0xe8, 0xb5, 0x65, 0x64, 0x5a, 0x6c, 0x61, 0xb0, 0xcb, 0x09, 0x76, 0x04, - 0x31, 0xc0, 0x78, 0x3c, 0x91, 0x57, 0x63, 0x65, 0x7f, 0xeb, 0x0b, 0x8c, - 0xb1, 0xdd, 0xb3, 0x83, 0xb1, 0x46, 0x3a, 0x11, 0x38, 0x65, 0x4a, 0xcd, - 0x00, 0xbb, 0xdd, 0x81, 0x7a, 0xfb, 0x8d, 0x23, 0xd0, 0xf8, 0x6b, 0xcd, - 0xe8, 0xa9, 0x70, 0x1d, 0x6e, 0xe3, 0xbf, 0x22, 0x98, 0x5d, 0xf0, 0xc2, - 0xb2, 0x30, 0x97, 0x5f, 0x37, 0xb4, 0x45, 0x76, 0x19, 0x7c, 0xe1, 0xd7, - 0x8d, 0x2b, 0x8e, 0xe0, 0x55, 0xd6, 0x48, 0xab, 0xa7, 0xf6, 0x1b, 0xb8, - 0xb6, 0xfe, 0xad, 0x0b, 0xd7, 0x35, 0xb8, 0x20, 0x38, 0x00, 0x4f, 0xee, - 0x8e, 0x68, 0x08, 0xbf, 0x0b, 0xc9, 0x53, 0x2f, 0xe2, 0x5b, 0xe6, 0x38, - 0xea, 0xb1, 0x68, 0x0f, 0xcf, 0x5d, 0x79, 0xfc, 0x0d, 0xfd, 0xd2, 0xdd, - 0x79, 0xba, 0x9e, 0xb7, 0xa0, 0x53, 0xf4, 0x68, 0x63, 0x03, 0xf3, 0x2c, - 0xc5, 0x32, 0x94, 0xfc, 0xb3, 0xac, 0xb1, 0x60, 0x78, 0x7c, 0x8c, 0x46, - 0xbe, 0x93, 0xfc, 0x25, 0x7c, 0x8e, 0x78, 0x0f, 0xd7, 0xe9, 0xca, 0x8b, - 0x32, 0x0d, 0x5e, 0xbd, 0x80, 0x83, 0xa6, 0x87, 0x30, 0xf0, 0x79, 0xc0, - 0x38, 0xbd, 0xf2, 0x79, 0xd4, 0x60, 0xad, 0x6d, 0x44, 0xc7, 0x27, 0x53, - 0x5e, 0x41, 0xdb, 0x4f, 0x0b, 0xc2, 0x16, 0x9f, 0x92, 0xb9, 0x10, 0x02, - 0xae, 0xcb, 0xc8, 0xd8, 0x1d, 0xa9, 0x72, 0xc1, 0x78, 0x11, 0x47, 0xe3, - 0xe4, 0x77, 0x0c, 0xab, 0xa1, 0xf8, 0x3a, 0x39, 0x5c, 0xdb, 0x6e, 0x8c, - 0xc1, 0xa0, 0x96, 0x06, 0xa7, 0xda, 0xca, 0xd4, 0xaa, 0x7d, 0x9d, 0x54, - 0xf7, 0xca, 0x62, 0xfb, 0xb8, 0x36, 0xdf, 0xf8, 0x3c, 0xbc, 0x5e, 0xe2, - 0x36, 0x63, 0x90, 0xda, 0x6e, 0x6a, 0x29, 0x2e, 0xbc, 0x6b, 0xf8, 0x4a, - 0x8e, 0x2a, 0x87, 0x2e, 0x56, 0xd3, 0x91, 0x46, 0x32, 0xe3, 0x5e, 0x91, - 0xa8, 0xbb, 0x44, 0x70, 0xd6, 0xc0, 0x39, 0x5b, 0x9e, 0x8d, 0x2d, 0x5b, - 0xbb, 0xd7, 0x1f, 0x5b, 0x1a, 0x11, 0x9a, 0x6a, 0xd3, 0x66, 0xb3, 0xb2, - 0xf9, 0x22, 0xfe, 0x62, 0xd1, 0x89, 0x8b, 0xbc, 0x15, 0xf7, 0x91, 0x9a, - 0xb4, 0x20, 0xc0, 0xfc, 0x77, 0x9f, 0xf6, 0x99, 0xce, 0x92, 0x0b, 0x90, - 0x8d, 0x35, 0x2e, 0x2a, 0xf9, 0x6c, 0x23, 0x60, 0x43, 0x5c, 0xaa, 0xc1, - 0xe8, 0x05, 0x1d, 0x3c, 0x99, 0xc4, 0x14, 0x2a, 0xe2, 0x29, 0xf5, 0x46, - 0xd8, 0x53, 0xb3, 0x81, 0x01, 0x10, 0x55, 0x1c, 0x56, 0x5b, 0x6b, 0xe7, - 0xb0, 0x4c, 0xff, 0xf5, 0xde, 0x03, 0x39, 0x2c, 0x72, 0x2a, 0x05, 0xfb, - 0xda, 0xd0, 0xa8, 0xa1, 0xe9, 0x08, 0x3d, 0x06, 0x2b, 0xbc, 0xd9, 0xba, - 0x9d, 0x2b, 0xed, 0x78, 0x41, 0xcf, 0x20, 0x6c, 0xcb, 0xce, 0x1a, 0x2d, - 0xaf, 0xb2, 0xb0, 0xe3, 0x93, 0x3b, 0x3c, 0x66, 0x2e, 0x81, 0x02, 0xc6, - 0xc4, 0x3c, 0x6b, 0x66, 0x6d, 0xed, 0x6f, 0x56, 0xf4, 0xc9, 0xf8, 0x87, - 0xeb, 0x9d, 0xaf, 0x51, 0x72, 0x6d, 0x11, 0x53, 0x58, 0x24, 0x6d, 0xa4, - 0x17, 0x2a, 0x5e, 0x5d, 0x4f, 0xbd, 0x3a, 0x58, 0x0e, 0x8c, 0x24, 0x65, - 0x14, 0x2f, 0x1c, 0x04, 0x07, 0x95, 0xcb, 0xa9, 0x9b, 0xcd, 0xcd, 0xe4, - 0x39, 0x49, 0xd9, 0x0e, 0x9d, 0x4a, 0x41, 0x88, 0x64, 0xd7, 0xca, 0x42, - 0xe7, 0xb0, 0x80, 0xeb, 0x3f, 0xb5, 0x18, 0xfd, 0xf3, 0x89, 0x03, 0x9a, - 0x08, 0x4a, 0x4b, 0x55, 0x69, 0xec, 0x2f, 0x1a, 0xb8, 0xdf, 0x75, 0xd1, - 0xd0, 0xb3, 0x56, 0x37, 0x6a, 0xbb, 0xd2, 0x0e, 0xb6, 0x98, 0xd6, 0xb6, - 0xf9, 0x41, 0x41, 0x82, 0xdd, 0x78, 0x3c, 0x34, 0x2c, 0x9d, 0x60, 0xf4, - 0x60, 0xc2, 0x1e, 0xfb, 0x96, 0x06, 0x7a, 0x12, 0x87, 0x3e, 0x81, 0xfb, - 0xbe, 0x87, 0x09, 0xad, 0x64, 0xee, 0x3b, 0x33, 0xee, 0x3b, 0x50, 0x8c, - 0xfc, 0xcd, 0x2d, 0x19, 0xdb, 0x83, 0x95, 0xd6, 0xeb, 0x36, 0x06, 0x23, - 0x12, 0x2b, 0x3a, 0x21, 0xdf, 0xc1, 0x96, 0x48, 0xfe, 0xc2, 0xd4, 0x04, - 0xe6, 0x52, 0xf9, 0x23, 0x2b, 0x50, 0xac, 0xe8, 0x30, 0xa3, 0xd5, 0xd3, - 0xd2, 0x68, 0xaf, 0xfb, 0x2f, 0x77, 0xac, 0xc8, 0x00, 0xd1, 0x6a, 0x1f, - 0x8f, 0x69, 0xe9, 0xc9, 0xe9, 0x59, 0x72, 0x90, 0xa2, 0xb1, 0xfe, 0x1a, - 0x60, 0x96, 0x75, 0xce, 0xb8, 0x44, 0xe1, 0x67, 0x75, 0x0b, 0x57, 0x6a, - 0x0c, 0x76, 0xb8, 0xe9, 0xd6, 0xd4, 0x14, 0x22, 0x0b, 0x4d, 0xc3, 0xcd, - 0xa3, 0x8f, 0x74, 0x9e, 0x4a, 0x91, 0xf8, 0xf9, 0xdb, 0xd4, 0xc3, 0x41, - 0x77, 0x20, 0x60, 0xcf, 0x2b, 0x9d, 0x8c, 0xfb, 0x78, 0x80, 0x01, 0xab, - 0x1f, 0x04, 0xe0, 0x9f, 0xe4, 0x66, 0x05, 0x50, 0x5b, 0x32, 0xba, 0xf6, - 0x35, 0x91, 0x6e, 0x99, 0xfc, 0x84, 0x3a, 0xce, 0x77, 0xb2, 0x4a, 0x95, - 0xa6, 0xd9, 0x9b, 0xce, 0x8f, 0x29, 0x7a, 0xd1, 0x3d, 0xd7, 0x65, 0x9b, - 0x65, 0x87, 0xda, 0x2d, 0x46, 0x2c, 0x6e, 0x58, 0x6b, 0x97, 0x0f, 0x47, - 0x11, 0x7d, 0xd7, 0x7c, 0x21, 0xd0, 0xfd, 0x2f, 0xed, 0xc6, 0x3b, 0x76, - 0x3f, 0xaa, 0x41, 0x32, 0x2c, 0xf9, 0x80, 0xdf, 0xe8, 0xa7, 0x72, 0x2b, - 0x32, 0x8d, 0x19, 0xdd, 0xf8, 0xcc, 0x26, 0x16, 0x42, 0xc2, 0x90, 0x04, - 0xde, 0x48, 0x03, 0x39, 0xb6, 0x03, 0xe7, 0xd8, 0xe4, 0xad, 0xb9, 0xd2, - 0xe8, 0xdc, 0x12, 0xde, 0x95, 0x25, 0x6c, 0x25, 0x5e, 0xd1, 0xe8, 0x42, - 0x83, 0x2f, 0xe6, 0x62, 0x81, 0x0a, 0x52, 0x9e, 0x2f, 0x98, 0xad, 0x1c, - 0x65, 0x8c, 0xf0, 0x87, 0xc0, 0xae, 0x71, 0x7a, 0x6e, 0xcd, 0x31, 0x1a, - 0xd4, 0x67, 0xa5, 0xee, 0xd5, 0x78, 0x1c, 0xba, 0xa0, 0x7c, 0xd3, 0x19, - 0x29, 0x5c, 0x1f, 0x50, 0x92, 0xf0, 0x14, 0xa3, 0xb5, 0x16, 0x63, 0xe9, - 0x49, 0x59, 0x37, 0xf1, 0x55, 0xea, 0x87, 0x56, 0x1f, 0xfb, 0x66, 0x2d, - 0xf8, 0x4a, 0x09, 0x03, 0xff, 0xcf, 0xd5, 0x5b, 0xf4, 0x9a, 0x1e, 0xca, - 0x88, 0xad, 0xc0, 0x58, 0x41, 0xc0, 0x51, 0xf1, 0xfb, 0x99, 0x0b, 0xd8, - 0x22, 0xd9, 0x07, 0xb0, 0x6c, 0xfb, 0x9d, 0xa6, 0x7e, 0xf4, 0xd3, 0xb0, - 0xe7, 0x73, 0xfe, 0xef, 0xac, 0x1e, 0x8d, 0x20, 0x6b, 0xd7, 0x9a, 0x51, - 0xdd, 0xfb, 0xf8, 0x71, 0x64, 0x28, 0x0a, 0x53, 0x5c, 0xfe, 0x24, 0xee, - 0xce, 0x6a, 0x3a, 0x85, 0x85, 0x64, 0xfc, 0xf2, 0x7f, 0xed, 0x1f, 0x79, - 0x2e, 0x6e, 0x34, 0x26, 0xab, 0x80, 0x47, 0x17, 0x52, 0xd2, 0xfa, 0x61, - 0x98, 0xa1, 0xa7, 0x96, 0xb7, 0x68, 0xcd, 0xbc, 0xcd, 0x4a, 0x5a, 0x55, - 0xd3, 0xe7, 0xfa, 0x5b, 0x1d, 0x17, 0xa0, 0xdb, 0x23, 0x8a, 0x8a, 0x21, - 0x24, 0x73, 0x13, 0x09, 0xea, 0xf0, 0x61, 0xa6, 0x70, 0x12, 0xce, 0x66, - 0x50, 0x44, 0x7e, 0x70, 0xd8, 0x1a, 0x9f, 0xf5, 0xc7, 0x39, 0x3c, 0xb5, - 0x72, 0x55, 0x61, 0xed, 0xdd, 0xc2, 0xa7, 0xb5, 0x40, 0x88, 0x62, 0xe6, - 0xff, 0x74, 0x22, 0x4b, 0xf3, 0xd9, 0xdc, 0x72, 0x9e, 0x48, 0x51, 0xed, - 0x1b, 0x4b, 0xe2, 0x06, 0x4f, 0x27, 0x43, 0x47, 0xd8, 0xbc, 0xbc, 0x4f, - 0x48, 0xc1, 0x34, 0x86, 0x24, 0x4e, 0xb9, 0x2b, 0x04, 0x1e, 0x18, 0x2a, - 0xba, 0x05, 0x0c, 0x3b, 0xb1, 0x89, 0x88, 0x06, 0x9d, 0x9a, 0x0f, 0x0b, - 0x2c, 0xc6, 0x11, 0x70, 0xea, 0x08, 0xde, 0xd4, 0x72, 0xb2, 0xe2, 0x53, - 0x5f, 0xe7, 0x09, 0xcf, 0x26, 0x45, 0x7c, 0x3a, 0xf0, 0x47, 0x24, 0x08, - 0x0b, 0xde, 0xbb, 0xa6, 0x58, 0xa0, 0xb8, 0x06, 0x8f, 0x3a, 0xff, 0x51, - 0xd1, 0xfe, 0x2c, 0x9a, 0x7e, 0xc0, 0xc6, 0x2a, 0xb2, 0xb1, 0xd8, 0xd5, - 0xba, 0x09, 0x76, 0x92, 0x89, 0x70, 0x01, 0x73, 0x7b, 0xbb, 0xa4, 0xea, - 0xbc, 0x22, 0x35, 0x30, 0x98, 0xb9, 0x3a, 0x32, 0x72, 0x5f, 0xf5, 0x78, - 0x57, 0xcf, 0x4a, 0x19, 0x07, 0xa9, 0x7e, 0xd6, 0xd2, 0x92, 0x4d, 0xbf, - 0x43, 0xf3, 0x10, 0xb7, 0x7e, 0xc1, 0xa7, 0x10, 0x8f, 0x65, 0x1b, 0xef, - 0x7d, 0x65, 0x14, 0x6f, 0xc7, 0xfe, 0x05, 0xa5, 0xa3, 0xda, 0xb2, 0xd5, - 0xa9, 0xb2, 0x16, 0x12, 0xf6, 0x6d, 0x96, 0xfb, 0xbf, 0x4b, 0x00, 0x09, - 0xa6, 0xf6, 0x82, 0xd1, 0xf8, 0x23, 0x5d, 0x64, 0xb6, 0x0a, 0x53, 0xa0, - 0xd2, 0x79, 0x2a, 0xbb, 0x67, 0x9f, 0x98, 0xdc, 0xc6, 0x99, 0xa6, 0xf0, - 0x81, 0x6d, 0xed, 0x25, 0x59, 0x60, 0xcf, 0x8a, 0x71, 0x40, 0xe8, 0x8b, - 0x87, 0xce, 0x68, 0x28, 0xaa, 0x72, 0x08, 0x8a, 0xfe, 0xef, 0xb4, 0x84, - 0xeb, 0xb1, 0x9f, 0xe7, 0xde, 0x00, 0xfb, 0x30, 0x52, 0x0d, 0xb2, 0x7d, - 0xdc, 0x41, 0xca, 0xe4, 0xb5, 0x50, 0x14, 0xe5, 0xbf, 0x47, 0x1c, 0xc1, - 0xf5, 0xfa, 0x27, 0x1f, 0x7b, 0x71, 0x52, 0xbe, 0x88, 0x4f, 0x36, 0xfa, - 0xc0, 0x6f, 0x7d, 0x52, 0x1d, 0x92, 0x29, 0x9f, 0xb3, 0x12, 0x0f, 0x75, - 0xb5, 0x72, 0x93, 0x01, 0x93, 0xa4, 0xe2, 0xaf, 0x48, 0x34, 0x41, 0x22, - 0xfc, 0xd5, 0x72, 0xf1, 0x6e, 0xcb, 0x0d, 0x44, 0x7d, 0x0c, 0xfd, 0x60, - 0x0f, 0xc4, 0xe4, 0xfe, 0x14, 0x98, 0xa8, 0xe3, 0x16, 0xe1, 0xd4, 0xe3, - 0xea, 0xa8, 0x30, 0x36, 0x95, 0x94, 0x98, 0x25, 0x3f, 0x27, 0x58, 0x21, - 0x74, 0x9d, 0x37, 0x7f, 0xd8, 0x65, 0x48, 0x82, 0xc1, 0xd8, 0x43, 0xcb, - 0xb3, 0xd0, 0x0f, 0xe7, 0xd2, 0xea, 0x57, 0xd8, 0xd8, 0x08, 0x81, 0xb4, - 0x8d, 0xad, 0xeb, 0xa9, 0xe4, 0x76, 0x67, 0xd5, 0x36, 0x6e, 0x6e, 0x37, - 0xa1, 0x9f, 0xe0, 0x15, 0x91, 0xf6, 0x3a, 0x36, 0x57, 0x7f, 0x9a, 0x03, - 0x7c, 0x2f, 0x8d, 0x04, 0x61, 0xe6, 0xf5, 0xb4, 0x86, 0x74, 0x77, 0xbd, - 0x89, 0x4d, 0x26, 0x57, 0x5c, 0xc7, 0x3b, 0x13, 0x89, 0x1e, 0xb7, 0x76, - 0xd1, 0x37, 0xae, 0x7e, 0xa8, 0x13, 0x29, 0x40, 0x64, 0xa3, 0xd2, 0x3f, - 0x26, 0x38, 0x6b, 0x62, 0xcf, 0x3d, 0x06, 0xb1, 0x81, 0xed, 0x8a, 0xfa, - 0x5f, 0x3e, 0x3c, 0xec, 0xe8, 0x46, 0x4a, 0x17, 0x3f, 0xff, 0x38, 0xf0, - 0x8d, 0x6d, 0x97, 0xe9, 0x6d, 0x4c, 0x65, 0x85, 0x12, 0xde, 0x8b, 0x15, - 0xdb, 0x47, 0xe9, 0xdb, 0xe7, 0xdf, 0x4a, 0x9a, 0x70, 0x18, 0x3d, 0xe1, - 0xd3, 0x07, 0xf2, 0xfd, 0xb5, 0x3d, 0xac, 0x31, 0xdf, 0xfe, 0xde, 0x4a, - 0xfd, 0x9b, 0xc0, 0x0f, 0x11, 0xea, 0x43, 0xb4, 0xf9, 0x86, 0x6f, 0xec, - 0xd7, 0x7d, 0x5f, 0x3d, 0x3a, 0x4b, 0x40, 0x8e, 0x2d, 0x5b, 0xf1, 0x43, - 0xfe, 0x52, 0x59, 0xcf, 0x35, 0xbf, 0x06, 0xfe, 0x6b, 0xaf, 0x0f, 0xfa, - 0xc6, 0xf7, 0x2e, 0x18, 0x3b, 0xae, 0x15, 0xe8, 0xa4, 0xed, 0x95, 0xbf, - 0xca, 0xfe, 0x50, 0x25, 0x31, 0x5b, 0x33, 0x9a, 0x8c, 0xdf, 0xea, 0xfc, - 0x9b, 0x37, 0xb4, 0x6a, 0xf3, 0x3f, 0x01, 0x55, 0x56, 0xc9, 0xf4, 0xb8, - 0xbf, 0x48, 0xec, 0xfd, 0x29, 0x0d, 0x4a, 0x72, 0x97, 0x03, 0xa6, 0x0b, - 0xa9, 0x71, 0x8e, 0x39, 0xc2, 0x73, 0x43, 0xff, 0xd4, 0xb6, 0xd8, 0x84, - 0x5e, 0xe8, 0xa2, 0x1e, 0x22, 0xb4, 0x3d, 0x09, 0x76, 0x79, 0xce, 0xc8, - 0x8a, 0x93, 0x3e, 0x47, 0x6d, 0x0c, 0x5d, 0xe7, 0x8b, 0x0a, 0xf6, 0x96, - 0xcb, 0xa1, 0xe0, 0xb8, 0xbd, 0x41, 0xe2, 0xd5, 0x05, 0xc0, 0x57, 0x65, - 0x13, 0x4e, 0x80, 0x3b, 0x2e, 0x9b, 0x91, 0x79, 0x3b, 0x15, 0xee, 0x2e, - 0x46, 0x5b, 0xd9, 0x1a, 0x60, 0x6e, 0xf4, 0x1c, 0xeb, 0xc6, 0xa5, 0x00, - 0x17, 0xe8, 0x22, 0xe0, 0x3e, 0x93, 0x17, 0x3b, 0x5a, 0x3f, 0xf8, 0xca, - 0x9d, 0x1b, 0xab, 0xaa, 0xdb, 0xd0, 0x0e, 0x26, 0x32, 0xc0, 0xea, 0x04, - 0xfe, 0x17, 0x6f, 0xc4, 0x6b, 0x3a, 0x65, 0x5f, 0x40, 0x23, 0xe4, 0xe3, - 0x46, 0xdd, 0x6c, 0xa4, 0x52, 0xc5, 0x48, 0xc3, 0xc2, 0x04, 0x68, 0xa6, - 0x2d, 0xe5, 0x20, 0x40, 0xb3, 0x05, 0x01, 0x46, 0xa5, 0x7e, 0x8c, 0x28, - 0xa6, 0xcd, 0xed, 0x00, 0x47, 0x91, 0x38, 0xd2, 0xfd, 0x32, 0x44, 0xe0, - 0xfc, 0xba, 0x0b, 0x71, 0x20, 0x5b, 0x4f, 0xd8, 0xe2, 0xd6, 0x37, 0x7a, - 0x92, 0x72, 0xe8, 0xf2, 0xa7, 0x9d, 0xfb, 0xb0, 0xf0, 0xe7, 0x51, 0x00, - 0x9b, 0xb1, 0x5d, 0xb0, 0xa7, 0x72, 0xeb, 0xa4, 0xa1, 0x21, 0x9c, 0x5e, - 0x6b, 0xdc, 0x9c, 0x5d, 0xcb, 0xbe, 0xb3, 0x81, 0x6a, 0x70, 0x68, 0x0d, - 0x31, 0xe6, 0x85, 0x87, 0x72, 0xed, 0xbe, 0x2f, 0xeb, 0x86, 0x65, 0x3c, - 0x17, 0x91, 0x78, 0x7b, 0x07, 0xbc, 0x13, 0x8e, 0x7d, 0x6f, 0x4e, 0x57, - 0xae, 0xb2, 0x58, 0xcc, 0x29, 0xf0, 0xdd, 0x96, 0x41, 0x5f, 0x4e, 0x66, - 0x7b, 0x68, 0xd8, 0x9c, 0xca, 0xbe, 0xce, 0x2c, 0xbe, 0xfe, 0x7d, 0x47, - 0xce, 0x74, 0x87, 0x69, 0xbc, 0x72, 0x46, 0xf9, 0x44, 0x45, 0xff, 0x91, - 0x80, 0xc1, 0x98, 0x84, 0xbc, 0x48, 0x0e, 0xa9, 0x76, 0x72, 0xae, 0xdb, - 0x41, 0xa7, 0x8b, 0xab, 0x2c, 0xa7, 0xed, 0x56, 0xa7, 0xab, 0x6f, 0x3f, - 0x92, 0x35, 0xbb, 0x1f, 0x8e, 0xb5, 0x04, 0x08, 0xbc, 0x42, 0xb0, 0x5d, - 0x75, 0x14, 0x24, 0xd4, 0x9d, 0x3f, 0xc3, 0x7f, 0x59, 0xf2, 0xad, 0xa0, - 0xc7, 0x05, 0x5f, 0x1c, 0xa8, 0x42, 0xf8, 0x27, 0x6a, 0x9b, 0x80, 0x98, - 0xdc, 0x2a, 0x4e, 0xc0, 0x26, 0x93, 0x9c, 0x2f, 0x8b, 0xa6, 0x52, 0xc0, - 0xa4, 0xfc, 0x43, 0x19, 0xc6, 0x6d, 0xa3, 0x2e, 0xeb, 0x35, 0x64, 0x8f, - 0xc9, 0x81, 0x02, 0x6a, 0xda, 0x68, 0x63, 0x6b, 0x14, 0x07, 0x6a, 0x74, - 0x1f, 0x84, 0x18, 0x2a, 0x02, 0x37, 0x03, 0xc9, 0x38, 0x19, 0x79, 0xaa, - 0x59, 0x13, 0x01, 0x63, 0xda, 0x60, 0x11, 0x01, 0x75, 0x99, 0x4c, 0xe0, - 0x80, 0xfb, 0x5f, 0xf7, 0x9c, 0x49, 0x1a, 0x88, 0x3d, 0x08, 0xe1, 0x92, - 0xa1, 0xe9, 0x8e, 0x6c, 0x2a, 0x3a, 0x1b, 0xea, 0xe2, 0x7f, 0xa6, 0x98, - 0xaf, 0xff, 0x84, 0x8c, 0x2d, 0xeb, 0xb9, 0xdf, 0x2e, 0x67, 0xac, 0x0f, - 0xe6, 0xd1, 0x5a, 0x0a, 0x3b, 0xe0, 0x8b, 0xba, 0x32, 0x25, 0x43, 0x22, - 0x2b, 0x71, 0x8c, 0x4a, 0xfe, 0x90, 0xa7, 0x08, 0x2e, 0xb8, 0x9a, 0x40, - 0x7f, 0xb6, 0x22, 0x1c, 0xcf, 0xdc, 0x1c, 0xbe, 0xcd, 0x33, 0xdd, 0x96, - 0x2b, 0xff, 0x26, 0x55, 0xd1, 0x7c, 0x50, 0xf0, 0xdd, 0x9f, 0xbc, 0xb4, - 0xf6, 0x02, 0x2f, 0xa9, 0xc8, 0xfa, 0x85, 0xbe, 0x04, 0x27, 0x84, 0xdd, - 0x34, 0x30, 0x0a, 0xb5, 0x4e, 0xde, 0x6b, 0x98, 0x70, 0x12, 0xaa, 0x80, - 0x60, 0x87, 0x47, 0x54, 0x00, 0xae, 0xba, 0xdf, 0x80, 0xbe, 0x9a, 0x56, - 0x4f, 0x33, 0xd1, 0xda, 0x91, 0x39, 0xaf, 0xf8, 0x15, 0xc4, 0xef, 0x9b, - 0xf4, 0x71, 0xc9, 0x5d, 0xce, 0x28, 0x93, 0x69, 0x4f, 0x6c, 0x63, 0x8b, - 0xd5, 0xa1, 0x95, 0xbc, 0xd3, 0x09, 0x60, 0xaf, 0x5f, 0xeb, 0x07, 0x89, - 0x1d, 0x07, 0x46, 0xdf, 0x2f, 0xf9, 0x0a, 0xf7, 0x28, 0x1b, 0xb7, 0x40, - 0xe0, 0x0d, 0xf2, 0x22, 0x18, 0xc4, 0xf1, 0x58, 0x8d, 0x9c, 0x73, 0xe1, - 0x9d, 0xad, 0x10, 0x3b, 0x45, 0x7f, 0xb5, 0x4c, 0x09, 0x11, 0xd1, 0xdf, - 0xb6, 0xe5, 0xae, 0x32, 0xaa, 0x11, 0x4a, 0x5f, 0xe0, 0xc1, 0x09, 0xaf, - 0x66, 0x65, 0x9f, 0x38, 0x26, 0x2e, 0xdc, 0x77, 0x74, 0x12, 0x3f, 0xe0, - 0xc7, 0xe4, 0x99, 0x13, 0x73, 0x46, 0xcd, 0xa3, 0x98, 0x22, 0xd6, 0xed, - 0x1c, 0x5e, 0x21, 0x60, 0x75, 0xef, 0xb9, 0x6c, 0xf7, 0x3e, 0x18, 0xa4, - 0x7a, 0xc4, 0xb7, 0x98, 0xc6, 0x53, 0x7b, 0x92, 0xb7, 0x3c, 0xac, 0x56, - 0xd1, 0xc5, 0x80, 0x48, 0x48, 0x0f, 0x2b, 0x43, 0xfc, 0x57, 0x78, 0xdf, - 0x5a, 0x2a, 0xff, 0xf7, 0xfc, 0x3b, 0x3e, 0x9b, 0xd4, 0x53, 0xde, 0x42, - 0xe8, 0x43, 0xb3, 0xd9, 0x1e, 0xb0, 0x26, 0xf4, 0x05, 0x5e, 0x5f, 0xae, - 0xcb, 0x68, 0x60, 0x2b, 0x4f, 0x94, 0x13, 0xcd, 0xf6, 0xb9, 0x2e, 0x52, - 0x07, 0x62, 0xa6, 0x81, 0xf0, 0x42, 0x1d, 0xf7, 0xf9, 0x97, 0x15, 0xad, - 0x15, 0x05, 0xfa, 0x99, 0xe2, 0x14, 0xdf, 0x0f, 0x2c, 0xb1, 0xa9, 0x4a, - 0x80, 0x25, 0xd6, 0x6a, 0xe4, 0xce, 0xd1, 0xa1, 0x96, 0xa9, 0x94, 0x5d, - 0xb2, 0x50, 0x69, 0xf7, 0xa5, 0x7d, 0xa2, 0xc6, 0x80, 0xb6, 0x36, 0x8d, - 0x22, 0x15, 0xe1, 0xda, 0xdf, 0x04, 0xe7, 0x47, 0x26, 0x25, 0x4c, 0xf9, - 0x8f, 0x11, 0x94, 0x9b, 0x88, 0xb7, 0xdd, 0x87, 0xd9, 0x80, 0xa8, 0x71, - 0x67, 0xd6, 0x0c, 0x22, 0x46, 0xd6, 0xa6, 0xca, 0xe2, 0x22, 0xb5, 0x34, - 0xc6, 0xc6, 0x4e, 0x07, 0x80, 0xf4, 0xe4, 0x9b, 0x10, 0x36, 0x42, 0x83, - 0x21, 0xe8, 0x0a, 0xe0, 0x22, 0x39, 0x41, 0xba, 0x7c, 0xae, 0x02, 0xcc, - 0x84, 0x54, 0xa0, 0x13, 0xe2, 0x00, 0xbe, 0xb1, 0x12, 0x03, 0x73, 0xba, - 0x1f, 0x3d, 0x60, 0xe1, 0xaf, 0x94, 0xeb, 0x21, 0xa7, 0x50, 0xfb, 0x2e, - 0x09, 0xfc, 0x02, 0xd4, 0x52, 0xf6, 0x6a, 0xc3, 0x72, 0x64, 0xbb, 0x0b, - 0xb1, 0x7a, 0x92, 0x6d, 0x42, 0xfc, 0xc3, 0xd0, 0x39, 0x49, 0x0a, 0xc5, - 0x37, 0xd9, 0x4a, 0x0a, 0x8b, 0x94, 0xe9, 0x9d, 0x87, 0xb2, 0x8b, 0x83, - 0xa8, 0x82, 0xd6, 0xf8, 0x18, 0x40, 0xc0, 0x66, 0x61, 0x4e, 0xcb, 0x43, - 0x91, 0x7b, 0x01, 0xa1, 0x02, 0x11, 0xf2, 0x33, 0xfb, 0x22, 0x37, 0x0d, - 0x07, 0x27, 0x75, 0xfc, 0xe8, 0x6a, 0xe0, 0xdb, 0x95, 0x29, 0x8e, 0xba, - 0x66, 0xb7, 0xd5, 0xa7, 0x5b, 0x94, 0x6b, 0xaa, 0xaf, 0x77, 0xe2, 0x70, - 0x17, 0x4a, 0xd7, 0xed, 0x92, 0x55, 0x4c, 0x52, 0xb6, 0x0c, 0xb6, 0x07, - 0xa4, 0xa1, 0x80, 0x42, 0xb8, 0x05, 0xb4, 0xeb, 0xd1, 0xee, 0x47, 0x99, - 0x34, 0x6a, 0x67, 0x9f, 0x89, 0x63, 0xea, 0x20, 0x1a, 0x2a, 0x30, 0xc7, - 0xd3, 0x71, 0x0f, 0xb9, 0x6e, 0x54, 0xf3, 0x7d, 0x83, 0xa2, 0x4e, 0xc0, - 0x0b, 0x15, 0x49, 0xc0, 0x94, 0x13, 0x97, 0xae, 0xc0, 0xfb, 0xc3, 0xe2, - 0x1a, 0x50, 0xb3, 0x4d, 0x2e, 0x2b, 0x52, 0xd6, 0x2f, 0xda, 0xae, 0x9d, - 0x27, 0x2f, 0xab, 0x56, 0x4f, 0xa2, 0xc5, 0xb4, 0xed, 0x50, 0x20, 0xb1, - 0xef, 0xf6, 0xe1, 0x68, 0x0a, 0x77, 0x15, 0xe7, 0x69, 0x93, 0x22, 0x08, - 0xf2, 0xdc, 0xd7, 0x97, 0xfe, 0x02, 0x27, 0xca, 0xff, 0xb2, 0x1a, 0xcb, - 0x31, 0x85, 0x49, 0xc2, 0xaa, 0x1c, 0x41, 0x7b, 0x5c, 0x18, 0x73, 0x26, - 0xfe, 0xfe, 0x06, 0x62, 0x86, 0x7d, 0xe4, 0xb1, 0x6b, 0xcf, 0x20, 0x6d, - 0x71, 0xe9, 0x20, 0x60, 0x92, 0x26, 0x51, 0x87, 0xb7, 0x98, 0x43, 0x11, - 0xff, 0xdc, 0xae, 0xb3, 0x34, 0x03, 0xdd, 0x3e, 0xf9, 0x44, 0x25, 0x41, - 0xc8, 0x18, 0x52, 0x2b, 0x6f, 0xc2, 0xc7, 0x95, 0xe5, 0xe1, 0x30, 0x41, - 0x49, 0x53, 0x02, 0x72, 0x45, 0x22, 0x61, 0xa9, 0x57, 0xc5, 0xa1, 0x8c, - 0x0e, 0x41, 0xa6, 0xb5, 0x68, 0x22, 0x58, 0x7a, 0x69, 0xc0, 0x76, 0xe8, - 0xfd, 0x4f, 0xb3, 0xf2, 0xd5, 0x15, 0x3f, 0x0c, 0x64, 0x86, 0xb1, 0x3f, - 0xc9, 0x0c, 0xb3, 0x78, 0xf9, 0x5d, 0xe7, 0x3d, 0x6f, 0x10, 0x67, 0x72, - 0x84, 0x2a, 0xc2, 0x6d, 0xd0, 0x56, 0x9b, 0xec, 0xec, 0xca, 0x72, 0x8f, - 0xa9, 0x78, 0x7f, 0xd6, 0xce, 0xba, 0xd4, 0x7b, 0x2a, 0x05, 0xc1, 0x51, - 0x6b, 0x6b, 0xcd, 0x75, 0xb2, 0xbc, 0x8e, 0xa7, 0xd2, 0xda, 0xc8, 0x72, - 0x3e, 0xe6, 0x12, 0xb0, 0x9e, 0x5b, 0x44, 0xcb, 0x2d, 0x1d, 0x9e, 0xea, - 0xbd, 0x9f, 0xea, 0xed, 0x1f, 0xbc, 0x61, 0xd5, 0x60, 0x37, 0xa5, 0x12, - 0x12, 0xea, 0xbb, 0x6b, 0xba, 0xa9, 0x11, 0xe4, 0xf0, 0x60, 0xe4, 0x99, - 0x0b, 0x93, 0x39, 0x43, 0x69, 0x84, 0xda, 0x69, 0x01, 0x34, 0x71, 0x27, - 0xc9, 0xb9, 0xe4, 0x97, 0xed, 0x07, 0x7e, 0xdb, 0xa2, 0xf5, 0x18, 0xae, - 0x58, 0xfe, 0x6a, 0x29, 0xd4, 0x3e, 0x75, 0xca, 0x47, 0x0a, 0x6b, 0xe1, - 0x29, 0x0b, 0x79, 0x93, 0x9b, 0x77, 0x9c, 0x37, 0x0d, 0xea, 0xb2, 0xef, - 0xb7, 0xd8, 0x0d, 0xd0, 0x76, 0x99, 0x20, 0xae, 0x52, 0x49, 0xbc, 0x8f, - 0x47, 0x31, 0xaa, 0x8b, 0xaf, 0x97, 0x59, 0x14, 0xc7, 0xee, 0x78, 0x3a, - 0x88, 0x26, 0xa7, 0x45, 0x28, 0xe4, 0x68, 0xce, 0x1c, 0xa5, 0xc9, 0xa7, - 0x1d, 0x2e, 0xe5, 0x01, 0xfb, 0xfb, 0x88, 0xb7, 0x1a, 0x2c, 0xab, 0xb2, - 0x26, 0x23, 0x25, 0x93, 0x13, 0x40, 0x48, 0x79, 0x65, 0x08, 0xa4, 0x48, - 0x59, 0xb8, 0xf3, 0x06, 0x09, 0x18, 0x12, 0xed, 0xf8, 0xa4, 0xf9, 0x95, - 0x0b, 0x54, 0x8a, 0xea, 0x60, 0xae, 0x9e, 0x8f, 0xd5, 0x08, 0x92, 0x8d, - 0xeb, 0x66, 0x3c, 0x0b, 0x0e, 0x1b, 0xea, 0xe8, 0xa0, 0x44, 0x9f, 0xb1, - 0x2b, 0xfe, 0xe2, 0xf9, 0xa8, 0x83, 0xdf, 0x7a, 0x5d, 0x02, 0x86, 0x1d, - 0x12, 0x92, 0x84, 0x7e, 0xa8, 0xb4, 0x9b, 0x9f, 0xe4, 0xd3, 0x2f, 0xa7, - 0x45, 0xe3, 0xd5, 0x2b, 0xc1, 0x24, 0x2d, 0x27, 0x44, 0x5c, 0xcb, 0xf7, - 0xb2, 0xf1, 0xfa, 0x45, 0x68, 0xbf, 0x41, 0x19, 0x0c, 0xbd, 0xdc, 0x4f, - 0xe5, 0x3e, 0xc1, 0x53, 0x4c, 0xe8, 0x5b, 0x18, 0x30, 0x71, 0x2a, 0x98, - 0xc8, 0x5a, 0x4b, 0xca, 0x05, 0x88, 0x2c, 0x51, 0xb4, 0x4b, 0x4d, 0x53, - 0x9b, 0x5b, 0x09, 0x30, 0x0f, 0x1d, 0x3f, 0xf9, 0x32, 0xa6, 0x00, 0x2d, - 0xb7, 0xc6, 0x17, 0xc1, 0x1d, 0xe4, 0x03, 0x19, 0xce, 0x86, 0xe8, 0xaf, - 0x55, 0x6c, 0x51, 0xc8, 0x3f, 0x12, 0xf5, 0xc3, 0x2f, 0x7e, 0x02, 0xad, - 0xd3, 0xa1, 0x42, 0x81, 0x55, 0x49, 0xf2, 0xe3, 0xa5, 0xa8, 0x47, 0x1b, - 0xc1, 0x1c, 0x0d, 0xb2, 0xfe, 0xc9, 0x84, 0x09, 0x5a, 0xe2, 0xfa, 0x55, - 0xd1, 0x0a, 0xe9, 0xdc, 0x30, 0x9c, 0x78, 0xee, 0xec, 0x84, 0x1c, 0x5f, - 0x97, 0x04, 0x31, 0x33, 0x4d, 0x0b, 0xe1, 0xc1, 0x31, 0xbb, 0xed, 0xa8, - 0xf9, 0x71, 0x85, 0xd8, 0x0f, 0x55, 0xb8, 0xca, 0x2a, 0xa2, 0x11, 0xab, - 0x28, 0xda, 0x09, 0x54, 0xf1, 0x88, 0xcc, 0xb8, 0xaf, 0x70, 0x30, 0xb5, - 0x9b, 0x2c, 0xdf, 0x1d, 0x14, 0x43, 0x83, 0xf9, 0x0a, 0x41, 0x5c, 0x04, - 0x36, 0x9f, 0x34, 0x71, 0x83, 0x78, 0xda, 0x59, 0x00, 0xa2, 0x54, 0x00, - 0x25, 0xfa, 0xb5, 0x4b, 0xa6, 0x88, 0x99, 0x71, 0x36, 0xe5, 0x18, 0x92, - 0x4d, 0x05, 0xe0, 0xc4, 0xfd, 0x40, 0x84, 0x5a, 0x75, 0x0e, 0x17, 0x43, - 0x91, 0xab, 0xa7, 0xc4, 0xa9, 0xe5, 0x45, 0xdb, 0x3e, 0x87, 0x2a, 0x1f, - 0xf5, 0x44, 0x4e, 0x85, 0x69, 0x88, 0xbd, 0x18, 0x64, 0x55, 0x8b, 0x1e, - 0x09, 0x26, 0x54, 0x93, 0xcc, 0xdb, 0x84, 0xe0, 0x00, 0xf8, 0x9a, 0xdb, - 0x1e, 0x4a, 0x28, 0x46, 0xee, 0x5c, 0x33, 0x1d, 0xa4, 0xc0, 0x2d, 0x2f, - 0x1e, 0x16, 0x64, 0x1f, 0x08, 0xbd, 0x3d, 0xcb, 0xac, 0xa8, 0xed, 0xe4, - 0x1b, 0xd9, 0xae, 0x01, 0xe8, 0x43, 0xba, 0x39, 0xfc, 0xd9, 0xe7, 0xcb, - 0x58, 0x9b, 0xa6, 0xce, 0x81, 0xd7, 0x15, 0xce, 0x5e, 0xa7, 0x7c, 0xa0, - 0xe4, 0xf6, 0xa7, 0x60, 0xf5, 0x28, 0xa3, 0x77, 0x0f, 0xeb, 0x5a, 0x3f, - 0xae, 0x3a, 0x49, 0xe5, 0xa7, 0xe4, 0xac, 0xcc, 0xa0, 0xa0, 0xc3, 0x9b, - 0x5f, 0xa2, 0x95, 0x37, 0xcf, 0x26, 0x9a, 0x2a, 0x0c, 0x3c, 0x1f, 0x56, - 0x92, 0xbe, 0xfc, 0x93, 0xc3, 0x95, 0x5a, 0xda, 0x9a, 0x1f, 0xc7, 0x84, - 0x0d, 0x3d, 0x87, 0x50, 0xcd, 0x5d, 0xba, 0x42, 0x5f, 0x4b, 0x2a, 0x2f, - 0xe0, 0xc1, 0x51, 0x0c, 0xac, 0xe9, 0x68, 0x0d, 0x5d, 0xad, 0xbc, 0x4b, - 0x6e, 0x9a, 0xab, 0x05, 0xd2, 0xae, 0xdf, 0x29, 0xdc, 0x7f, 0x71, 0x5b, - 0x22, 0xf9, 0x4b, 0x12, 0xa5, 0x25, 0x05, 0xbd, 0x74, 0x73, 0x27, 0xce, - 0x9b, 0x5a, 0xeb, 0x1c, 0xfa, 0x5d, 0xe0, 0x72, 0xcf, 0x20, 0x3f, 0xd2, - 0xd6, 0x59, 0xc2, 0x9e, 0xb4, 0xde, 0xfe, 0x69, 0x5b, 0x13, 0x5c, 0x34, - 0x69, 0x21, 0x6d, 0x78, 0x5b, 0xe1, 0x49, 0xa4, 0x86, 0xc5, 0x28, 0xd7, - 0x65, 0x64, 0x70, 0x0a, 0xf2, 0x91, 0x69, 0x1a, 0x6b, 0x67, 0xc6, 0xf2, - 0x18, 0x7f, 0xbc, 0x8d, 0x4e, 0xa2, 0xa5, 0x8e, 0x68, 0x3b, 0x9b, 0x53, - 0xc3, 0xbc, 0xb4, 0xc4, 0x4d, 0x20, 0x28, 0x42, 0x5c, 0x26, 0xf4, 0xa3, - 0xdc, 0x4c, 0xc3, 0xbf, 0x16, 0xdf, 0x56, 0x1c, 0x79, 0xea, 0x7c, 0x9f, - 0x91, 0xe4, 0x36, 0x15, 0x3a, 0x00, 0x66, 0xf4, 0xc2, 0xa0, 0xec, 0xcd, - 0x9f, 0x3f, 0xe0, 0xad, 0x26, 0xa6, 0x24, 0xf7, 0x49, 0x43, 0xb6, 0x3a, - 0x60, 0xbb, 0x94, 0x16, 0x03, 0xf1, 0x63, 0x7f, 0x7d, 0xf3, 0x7f, 0xe9, - 0x57, 0x97, 0xf1, 0xe7, 0x64, 0xe4, 0x62, 0x2a, 0xe3, 0xfe, 0xef, 0x48, - 0xa6, 0xda, 0xca, 0xe4, 0xc5, 0x62, 0xc9, 0xa0, 0x9e, 0x28, 0x3a, 0x2d, - 0xc1, 0x42, 0x2a, 0x9f, 0xe5, 0x26, 0xcc, 0xc9, 0x8f, 0xe3, 0xce, 0x1c, - 0x8c, 0x53, 0xa3, 0xc4, 0x2c, 0x55, 0xe8, 0x65, 0x9f, 0x7d, 0xe8, 0x81, - 0x89, 0x5b, 0xe3, 0xa5, 0x32, 0x01, 0xe1, 0xa6, 0xda, 0x8b, 0xb1, 0xc2, - 0xd3, 0x9a, 0x29, 0x5c, 0x82, 0x92, 0xd2, 0xf9, 0x84, 0x28, 0xde, 0xd6, - 0xc8, 0x46, 0xfe, 0x4a, 0x83, 0x09, 0x9c, 0xfa, 0x82, 0x4e, 0x5a, 0x44, - 0xcf, 0x38, 0x50, 0x98, 0x57, 0xe9, 0x95, 0xdd, 0xaf, 0x7e, 0xe0, 0x18, - 0x49, 0xbf, 0x5e, 0x1e, 0x9a, 0x7c, 0x7f, 0xb6, 0x0a, 0x9a, 0x17, 0xb7, - 0xda, 0x38, 0x6e, 0x72, 0x13, 0xbd, 0x99, 0xe3, 0x70, 0xfc, 0x8b, 0x15, - 0x0b, 0x12, 0xcb, 0x71, 0xcc, 0x58, 0x30, 0x73, 0x15, 0x98, 0xd7, 0xe1, - 0x0c, 0xc9, 0xa5, 0xf2, 0x74, 0xb2, 0xf0, 0x5f, 0x9c, 0x95, 0xbe, 0xbf, - 0xa3, 0xb5, 0x40, 0x68, 0xce, 0xa2, 0x1f, 0xf4, 0xeb, 0x71, 0x82, 0xe0, - 0xf0, 0xcc, 0x8c, 0x27, 0xf6, 0x14, 0x47, 0x7c, 0x77, 0x94, 0xe1, 0xf0, - 0x2a, 0xf2, 0xec, 0x20, 0xf8, 0xef, 0x65, 0x97, 0x29, 0x5d, 0xfc, 0x29, - 0x1b, 0x09, 0xf8, 0xd5, 0xe7, 0xe8, 0xdf, 0x8d, 0x15, 0x94, 0x34, 0x55, - 0xd1, 0x63, 0x49, 0xbc, 0xc1, 0xcd, 0xa0, 0x0e, 0xbd, 0x16, 0xbe, 0xf4, - 0xe6, 0x8d, 0xb1, 0x13, 0x29, 0xc6, 0xbe, 0x6c, 0x10, 0x5c, 0xa2, 0x64, - 0x17, 0x78, 0xf4, 0x00, 0x07, 0xe8, 0x61, 0xa1, 0x8c, 0x78, 0xb3, 0x72, - 0x12, 0x25, 0xe4, 0x2c, 0xed, 0x97, 0x21, 0x32, 0x0e, 0x62, 0x3f, 0xf1, - 0x54, 0xbb, 0x09, 0x30, 0xba, 0x0d, 0xed, 0x2a, 0x92, 0xd2, 0x83, 0xf6, - 0x9f, 0xf0, 0x6a, 0xdd, 0xc5, 0x04, 0xcd, 0xc5, 0x9b, 0x1b, 0x30, 0x74, - 0x5f, 0x9c, 0xad, 0x6f, 0x9a, 0xe9, 0xa8, 0xd2, 0x25, 0xec, 0x8d, 0xbe, - 0x63, 0x3d, 0xc8, 0x53, 0x80, 0x7f, 0xe3, 0xfa, 0x47, 0x46, 0x1a, 0xa6, - 0x63, 0xf8, 0x08, 0x44, 0x1e, 0x33, 0x13, 0x79, 0x0c, 0xe9, 0xc5, 0x09, - 0x90, 0x13, 0x97, 0xf6, 0x97, 0xda, 0xc8, 0xc0, 0xc0, 0x42, 0x7a, 0xfd, - 0x9c, 0x55, 0x6c, 0x2d, 0x33, 0xeb, 0x31, 0xe0, 0x6e, 0xac, 0x70, 0x6a, - 0xc0, 0x1a, 0xc9, 0xba, 0x12, 0x98, 0x19, 0xf0, 0xcd, 0x1d, 0xcd, 0xaa, - 0x18, 0x89, 0x25, 0x88, 0x5f, 0x46, 0xbf, 0x3c, 0xd6, 0x97, 0xd0, 0xf9, - 0x81, 0x6a, 0xcc, 0x21, 0x8e, 0x34, 0x04, 0xea, 0x86, 0x9e, 0xe3, 0x66, - 0x51, 0x45, 0xfe, 0x26, 0xbf, 0x43, 0xd2, 0x25, 0x3e, 0x05, 0x35, 0xf3, - 0x81, 0x6b, 0x3b, 0x31, 0x60, 0xf9, 0xa3, 0x6b, 0x26, 0x2b, 0xc2, 0x3e, - 0x7b, 0x6f, 0x42, 0xf4, 0x80, 0x35, 0x48, 0xb3, 0x0d, 0x48, 0x52, 0xa1, - 0xba, 0xc7, 0x5f, 0x38, 0xbc, 0xa3, 0xd3, 0x31, 0x75, 0xab, 0x9c, 0x51, - 0x69, 0x05, 0x23, 0xe6, 0x32, 0xb1, 0x2d, 0x46, 0x80, 0x76, 0x1c, 0x0b, - 0xca, 0x34, 0xe3, 0x6c, 0x06, 0x44, 0x3a, 0x1b, 0xf8, 0x77, 0x41, 0xba, - 0x4f, 0x4d, 0x89, 0x54, 0x1c, 0x82, 0x7c, 0x1b, 0x01, 0xe0, 0x97, 0x5c, - 0xbd, 0x0b, 0xf2, 0xc6, 0x0b, 0xdc, 0x5e, 0x60, 0xeb, 0x86, 0x03, 0xfb, - 0xcf, 0x00, 0x36, 0xef, 0x8b, 0x2f, 0xb9, 0x3d, 0x7a, 0xb3, 0x5b, 0xe7, - 0x7f, 0x57, 0x38, 0xf5, 0xe3, 0xe2, 0x66, 0x0b, 0xb8, 0x98, 0xfe, 0xdd, - 0x63, 0xdf, 0xb6, 0x10, 0xc4, 0x4e, 0x86, 0x46, 0x55, 0x17, 0x83, 0x5c, - 0xf2, 0x33, 0x77, 0x9c, 0xb0, 0x07, 0x9a, 0x03, 0x59, 0x9c, 0x38, 0x63, - 0xfd, 0x21, 0xed, 0x0a, 0x6c, 0x65, 0x13, 0x3c, 0xce, 0x2f, 0xb6, 0xf2, - 0xc5, 0x12, 0xc1, 0x64, 0x94, 0x21, 0xc4, 0x09, 0xd8, 0x5d, 0x04, 0x35, - 0x9c, 0xca, 0x67, 0xb9, 0x85, 0xa3, 0x37, 0x50, 0xa9, 0xcd, 0x5d, 0xdd, - 0x42, 0xc8, 0x06, 0x0f, 0x30, 0xbb, 0x4b, 0xa3, 0xf5, 0x89, 0x17, 0x70, - 0x00, 0x12, 0x1b, 0x72, 0x79, 0x5e, 0x2a, 0x5e, 0xed, 0xa9, 0x21, 0x44, - 0x9b, 0xdf, 0x08, 0xd8, 0xee, 0xcc, 0x1b, 0xe4, 0xe9, 0x21, 0xf5, 0x52, - 0xc8, 0xe5, 0x7e, 0x9d, 0x7a, 0xbc, 0xff, 0x25, 0x1d, 0xae, 0xdb, 0x2f, - 0xbf, 0x23, 0x48, 0xb3, 0xdf, 0x53, 0x8d, 0x70, 0xd5, 0x13, 0x95, 0x84, - 0x88, 0xf6, 0xa5, 0x71, 0xe3, 0x0d, 0xd6, 0x47, 0xb6, 0x96, 0x1f, 0x79, - 0x0a, 0x6c, 0xcc, 0x29, 0xa5, 0xc3, 0x9b, 0x85, 0x92, 0x1b, 0xb2, 0xcc, - 0x6f, 0xfe, 0x21, 0x32, 0x14, 0xe8, 0x82, 0xc6, 0xd5, 0xf5, 0xbb, 0x15, - 0x2b, 0x22, 0xd4, 0x5b, 0xc5, 0x1c, 0xd9, 0xfb, 0x13, 0xee, 0x1c, 0x67, - 0x3d, 0x8f, 0xf3, 0x2c, 0x71, 0x3e, 0xfc, 0x22, 0x6d, 0x10, 0x16, 0xf0, - 0x3c, 0x16, 0xbe, 0xee, 0xd3, 0x17, 0x95, 0xce, 0x0b, 0xc0, 0x86, 0xeb, - 0x07, 0x2c, 0x63, 0xc0, 0xa6, 0x2d, 0x47, 0x66, 0x87, 0xdc, 0xe7, 0xfa, - 0xca, 0xbf, 0x16, 0xee, 0xab, 0x22, 0x7d, 0xa1, 0x94, 0xd9, 0x36, 0xb9, - 0xb5, 0x66, 0x88, 0xeb, 0x4f, 0xe9, 0xa0, 0xa9, 0x76, 0x3d, 0x63, 0xd0, - 0x92, 0x5c, 0xdd, 0x6f, 0xd2, 0xc2, 0x9d, 0x75, 0x1d, 0x51, 0x4c, 0x6c, - 0xc1, 0x92, 0x2d, 0xc1, 0x6e, 0xd8, 0xec, 0x2a, 0x2f, 0xf1, 0x9d, 0xc3, - 0xea, 0x72, 0x3f, 0x79, 0xfc, 0x7a, 0xe2, 0x50, 0x8a, 0xa3, 0x9c, 0x16, - 0xa6, 0xb1, 0x86, 0xb2, 0x97, 0x88, 0x19, 0x4c, 0xb7, 0x94, 0xd7, 0x93, - 0x3c, 0x53, 0x50, 0xb5, 0xc1, 0x86, 0x71, 0x04, 0xbb, 0xd7, 0x91, 0x3e, - 0x7c, 0xc7, 0xbb, 0xd6, 0xe7, 0xa1, 0x3f, 0x49, 0x38, 0x58, 0xa4, 0xa3, - 0x1a, 0xfe, 0x95, 0x07, 0xbd, 0x29, 0xdd, 0x87, 0x77, 0x00, 0x18, 0x1e, - 0x26, 0x0c, 0xa4, 0x60, 0xd8, 0x7a, 0x37, 0x26, 0xc8, 0x46, 0x53, 0x3b, - 0x8a, 0x6f, 0x78, 0xec, 0x6a, 0xaf, 0xfd, 0x14, 0xc9, 0x62, 0xdc, 0x7a, - 0x23, 0x49, 0xb3, 0x89, 0x90, 0x24, 0x04, 0x06, 0x61, 0x74, 0xa2, 0xb2, - 0xc6, 0x5d, 0x9a, 0x6a, 0xa8, 0x0b, 0x92, 0x97, 0xf3, 0x5b, 0xc1, 0x40, - 0x0f, 0xc1, 0x96, 0x4c, 0xff, 0xeb, 0x04, 0xd0, 0x75, 0x19, 0xa8, 0xdf, - 0xda, 0x97, 0x67, 0xd7, 0x13, 0x35, 0x75, 0x72, 0x2c, 0xf4, 0xee, 0x0c, - 0xda, 0x19, 0xa4, 0xd7, 0x00, 0x21, 0xca, 0xf8, 0xa7, 0x4e, 0x1b, 0x37, - 0x38, 0xa3, 0x19, 0x3d, 0x90, 0x36, 0x15, 0x71, 0x6b, 0xcd, 0x1c, 0x41, - 0xfd, 0xda, 0x61, 0x97, 0x7c, 0xa0, 0x53, 0xa8, 0xc8, 0x6e, 0x53, 0x00, - 0xa6, 0x96, 0xb0, 0xc0, 0xda, 0xab, 0xdb, 0xa6, 0xf3, 0x3c, 0xe0, 0x6e, - 0x12, 0x13, 0x67, 0x63, 0x77, 0x31, 0xcd, 0xc1, 0x9e, 0x45, 0x24, 0xb9, - 0xa5, 0xb3, 0x32, 0xfe, 0x4c, 0x29, 0x40, 0x23, 0x36, 0x44, 0x4d, 0xcd, - 0xe2, 0xfe, 0x92, 0xc4, 0x24, 0xb0, 0xa1, 0xb2, 0xa3, 0xb2, 0x7d, 0x58, - 0x8a, 0x0f, 0xa7, 0xbc, 0xe0, 0x7f, 0xcb, 0x1b, 0xc9, 0xbd, 0x32, 0x24, - 0xe8, 0xea, 0x69, 0x13, 0x53, 0x2b, 0x90, 0x0d, 0xee, 0xaa, 0x51, 0xae, - 0xd9, 0xe0, 0x3b, 0x15, 0xba, 0xbc, 0xf9, 0x64, 0xa9, 0x56, 0x90, 0x88, - 0x43, 0xe6, 0x59, 0xce, 0x64, 0xba, 0x09, 0xb2, 0x9c, 0x6f, 0x86, 0x65, - 0xa3, 0x11, 0x92, 0x36, 0xf9, 0x43, 0xe9, 0x32, 0x60, 0x92, 0xe5, 0x3b, - 0xfd, 0x53, 0x50, 0xa4, 0x04, 0x1c, 0x89, 0xad, 0x93, 0x50, 0x6b, 0xfe, - 0xce, 0x17, 0x8f, 0xf4, 0x22, 0xaf, 0x4f, 0x4f, 0x46, 0x32, 0x9d, 0x3e, - 0x87, 0xec, 0x6a, 0xc5, 0xc9, 0x82, 0x06, 0xdc, 0xcb, 0xf3, 0x7a, 0x84, - 0x6b, 0x44, 0xde, 0x95, 0x3e, 0xf2, 0xdf, 0xa9, 0x35, 0x51, 0x50, 0x9f, - 0x57, 0xdd, 0xbc, 0x2e, 0x1b, 0x4b, 0x2e, 0x3b, 0x75, 0x3a, 0x9b, 0x29, - 0x59, 0x2b, 0x30, 0x2d, 0xb6, 0x68, 0x60, 0x2b, 0xd8, 0x27, 0xfb, 0xaf, - 0x73, 0xb6, 0xb5, 0x3c, 0xdb, 0x45, 0x9e, 0x36, 0xd8, 0x81, 0x91, 0x1a, - 0x35, 0xdc, 0xa6, 0xd1, 0x7d, 0xc0, 0x91, 0x1f, 0x31, 0xe2, 0xf0, 0x55, - 0x58, 0xf0, 0x52, 0x97, 0x46, 0x2e, 0xf0, 0x2a, 0xfd, 0x13, 0x48, 0x52, - 0xe9, 0x3c, 0x79, 0x14, 0xbf, 0xc1, 0x3b, 0xf6, 0xbf, 0x67, 0xfc, 0x5a, - 0x25, 0xba, 0xeb, 0xd6, 0x44, 0xd8, 0x10, 0x45, 0xbd, 0xa6, 0x47, 0xea, - 0x7d, 0x1f, 0x55, 0x54, 0x46, 0x87, 0x80, 0x39, 0x52, 0x47, 0x0d, 0xa0, - 0xe1, 0xe4, 0x82, 0x3f, 0x0b, 0x36, 0x8f, 0xf6, 0x51, 0x4d, 0xbb, 0x16, - 0x0f, 0xb6, 0x96, 0x90, 0xb1, 0xd1, 0x66, 0x6c, 0xce, 0x98, 0xb4, 0x7b, - 0xe2, 0xb5, 0x33, 0x68, 0xd1, 0x78, 0xaa, 0x9d, 0x29, 0xab, 0x3b, 0xda, - 0xe5, 0x64, 0xeb, 0x51, 0x5b, 0xfc, 0x8f, 0xdd, 0xf5, 0xde, 0xf9, 0x43, - 0x67, 0xe3, 0x9d, 0xa0, 0xbc, 0xd3, 0x32, 0x3b, 0xe1, 0xb9, 0xd6, 0x38, - 0x19, 0x83, 0x2d, 0xb0, 0x78, 0x41, 0xc1, 0xc0, 0xaf, 0x81, 0x4c, 0x51, - 0x94, 0x57, 0xec, 0xb2, 0x5d, 0x8e, 0xfc, 0xf0, 0x78, 0x2d, 0x33, 0x6f, - 0xd9, 0xe1, 0xa2, 0xab, 0xbf, 0x98, 0xc0, 0x18, 0xba, 0xfe, 0xe1, 0xa3, - 0x6f, 0xe3, 0x4d, 0x10, 0x4a, 0xc9, 0x35, 0x73, 0xd2, 0x62, 0x86, 0xdd, - 0x26, 0xad, 0xdc, 0x68, 0x40, 0xef, 0x45, 0x29, 0x96, 0x57, 0x09, 0x74, - 0x74, 0x64, 0x1c, 0x06, 0x3c, 0x1b, 0xf0, 0x98, 0xf4, 0x89, 0xae, 0x2e, - 0xbe, 0x4e, 0xcf, 0x51, 0xe0, 0x42, 0xb0, 0x00, 0x70, 0x53, 0x21, 0x8c, - 0xaf, 0xe0, 0x43, 0x05, 0xb8, 0x6f, 0x56, 0x4b, 0xbc, 0x9d, 0x3d, 0x9f, - 0x3e, 0x72, 0xb2, 0x31, 0xb0, 0x90, 0xa7, 0x46, 0x03, 0x5e, 0x2f, 0x7f, - 0xf2, 0x2d, 0x15, 0x64, 0xb0, 0xfe, 0x2f, 0x40, 0x03, 0x38, 0x58, 0x62, - 0x21, 0xdd, 0xbd, 0xa3, 0xb5, 0x3f, 0x90, 0xbc, 0xde, 0x1b, 0x93, 0xcb, - 0x89, 0x27, 0x11, 0xe0, 0x4d, 0x3a, 0xf3, 0xb5, 0xaa, 0x58, 0x63, 0x6f, - 0x22, 0xa9, 0x0f, 0x5e, 0x4a, 0xac, 0x4d, 0xe0, 0x94, 0x81, 0x72, 0xde, - 0x46, 0x40, 0xef, 0x5d, 0x86, 0x25, 0x87, 0x99, 0x8b, 0x2e, 0xc2, 0xc2, - 0x7a, 0x78, 0x59, 0xd0, 0xce, 0x01, 0x22, 0xa1, 0x66, 0xf7, 0x33, 0xd0, - 0x99, 0x6d, 0x46, 0x45, 0x63, 0x95, 0x8f, 0x5a, 0x24, 0x32, 0xcf, 0xd3, - 0xa6, 0xcb, 0x2d, 0x22, 0xe6, 0x45, 0x08, 0x88, 0xf4, 0x57, 0x41, 0x31, - 0x4e, 0x65, 0xac, 0x59, 0xed, 0xbf, 0x81, 0x14, 0xb9, 0xb2, 0xaf, 0xeb, - 0x31, 0xed, 0xd1, 0x2c, 0xef, 0xaf, 0x75, 0xf7, 0x2c, 0x59, 0xcc, 0x01, - 0xc8, 0x76, 0x16, 0xeb, 0xb3, 0xe5, 0xc7, 0x17, 0xe7, 0xec, 0xa2, 0x20, - 0x94, 0x4f, 0xa1, 0x93, 0xc5, 0x56, 0xb0, 0x75, 0x2f, 0x33, 0xcc, 0x8a, - 0x89, 0x17, 0x01, 0x8c, 0x26, 0xd5, 0x9c, 0xa9, 0x26, 0x61, 0xb1, 0x2e, - 0xd1, 0xbb, 0xbb, 0x3f, 0xf7, 0xfd, 0xb7, 0x0a, 0x5c, 0x61, 0x61, 0x94, - 0x3d, 0x24, 0x06, 0x66, 0x56, 0x86, 0x8c, 0x75, 0x8d, 0xee, 0x46, 0x4c, - 0xe1, 0x87, 0x13, 0xf6, 0x90, 0xe2, 0xed, 0x51, 0xa8, 0x34, 0x85, 0x93, - 0xa7, 0x8d, 0x86, 0x08, 0x0e, 0xf0, 0x95, 0x67, 0xb0, 0xa9, 0x2e, 0x40, - 0x3e, 0xc2, 0x7d, 0xe6, 0x0d, 0xc5, 0xb2, 0xb8, 0x76, 0x16, 0x02, 0x51, - 0x57, 0xf0, 0x9c, 0xd7, 0xd9, 0x1c, 0xd8, 0x7c, 0xf4, 0x29, 0xff, 0xeb, - 0xdd, 0xdb, 0x44, 0x33, 0xe8, 0x87, 0x4a, 0xfd, 0xed, 0x75, 0x3f, 0x1e, - 0x60, 0x89, 0x50, 0x57, 0x9c, 0x20, 0x75, 0xc0, 0xce, 0xd7, 0x46, 0xd1, - 0x12, 0x43, 0x76, 0x6b, 0xdc, 0x95, 0x1e, 0x72, 0x42, 0xef, 0xfe, 0x80, - 0x84, 0x95, 0x88, 0x87, 0x03, 0xe6, 0xc4, 0x69, 0x51, 0x8a, 0x8a, 0x6c, - 0xf9, 0xa0, 0x75, 0x51, 0xbf, 0x9d, 0x44, 0x26, 0x59, 0x92, 0x63, 0xb0, - 0xbd, 0x6d, 0x96, 0x5b, 0x55, 0x09, 0x96, 0x11, 0xaf, 0x9d, 0xee, 0x38, - 0xb4, 0x79, 0x9d, 0x14, 0xe5, 0x46, 0x0b, 0xe3, 0x01, 0x03, 0xf8, 0x31, - 0xa0, 0x1b, 0xe8, 0xf3, 0x98, 0x6e, 0x17, 0x82, 0xdf, 0x8a, 0x07, 0x69, - 0xfc, 0xa5, 0xcf, 0xc0, 0xd9, 0x30, 0x99, 0x56, 0x0e, 0xd7, 0xc8, 0x30, - 0x0b, 0xc1, 0x79, 0x93, 0x3c, 0xbb, 0x5f, 0x57, 0xb4, 0x2a, 0x7d, 0x1c, - 0xf2, 0xfa, 0x57, 0xde, 0x26, 0x65, 0x5a, 0x13, 0x9e, 0xfe, 0xcc, 0x45, - 0xa9, 0x2c, 0x18, 0x41, 0x61, 0xa4, 0xda, 0x65, 0x14, 0x0c, 0x6f, 0x51, - 0x25, 0xcf, 0x15, 0xc5, 0x25, 0x09, 0xdc, 0xb4, 0x95, 0xa5, 0xc5, 0x16, - 0x1a, 0xc5, 0xa7, 0xe8, 0x20, 0xed, 0x3e, 0x53, 0x6a, 0xce, 0xbc, 0x22, - 0xe8, 0x07, 0x71, 0x05, 0x9e, 0x1c, 0xac, 0x77, 0x75, 0xd8, 0xb9, 0xa7, - 0x72, 0xc0, 0x1a, 0xb9, 0x95, 0xa3, 0x25, 0xb1, 0x5e, 0x16, 0x7b, 0x10, - 0x3b, 0x1c, 0x16, 0x0c, 0xc0, 0x74, 0x8f, 0xfe, 0x13, 0xf1, 0xf5, 0x08, - 0xbe, 0x7d, 0xe3, 0xbf, 0x6b, 0x41, 0x88, 0x5d, 0x9f, 0x9b, 0x09, 0xcf, - 0xd0, 0xe6, 0x25, 0x7d, 0xbc, 0xd4, 0xf5, 0x3f, 0x1b, 0xcd, 0x83, 0x9f, - 0xe3, 0xe3, 0x12, 0x26, 0x87, 0x5c, 0xc9, 0x52, 0xef, 0x59, 0xa4, 0x8a, - 0x70, 0x34, 0xf1, 0xaf, 0xd5, 0xa8, 0x9f, 0x50, 0xf5, 0xaa, 0x73, 0x22, - 0x0b, 0x08, 0x6c, 0xf8, 0x91, 0x12, 0x68, 0x49, 0x8b, 0x74, 0x25, 0x8e, - 0xd9, 0xb5, 0x92, 0x67, 0x92, 0x82, 0x46, 0x8c, 0x24, 0xb8, 0x58, 0x44, - 0xc3, 0xe6, 0xb0, 0xf1, 0xc9, 0xac, 0x99, 0xd1, 0x94, 0x93, 0x60, 0xa4, - 0x37, 0x90, 0x3e, 0x2a, 0x82, 0x64, 0x2f, 0x31, 0xd3, 0x43, 0x52, 0xa3, - 0x9b, 0x3e, 0xe1, 0x82, 0xdb, 0x0d, 0xa3, 0xb2, 0x17, 0xc6, 0x16, 0xfc, - 0x62, 0xc4, 0x29, 0x46, 0x45, 0xce, 0x80, 0xd7, 0x02, 0xb1, 0xae, 0x57, - 0x74, 0x1b, 0x63, 0x9c, 0xe1, 0x18, 0x69, 0x8b, 0x5b, 0x7c, 0xbf, 0xe6, - 0xf3, 0xf8, 0xfd, 0x3b, 0x99, 0x4a, 0x1c, 0x85, 0xef, 0xa1, 0xf4, 0xe7, - 0x95, 0x00, 0x35, 0xcf, 0x3b, 0xf6, 0xd0, 0x51, 0x1d, 0x3a, 0xfa, 0x22, - 0x85, 0xed, 0x3e, 0x7e, 0x77, 0xb4, 0x4a, 0xec, 0x86, 0xe8, 0x84, 0x35, - 0x67, 0xf1, 0xd4, 0x03, 0xb3, 0x37, 0x45, 0xdd, 0xdb, 0xab, 0x61, 0x4f, - 0x10, 0x49, 0xa7, 0xa3, 0x1a, 0x4d, 0xda, 0x5d, 0x45, 0x0e, 0xa4, 0xb5, - 0x6c, 0x8b, 0xd8, 0x75, 0x90, 0xfe, 0xa8, 0xb6, 0xf7, 0x3a, 0x92, 0x5d, - 0xcb, 0x0e, 0xd0, 0xbf, 0x2f, 0xb3, 0xc6, 0xdf, 0x4f, 0x7c, 0x33, 0x50, - 0x1c, 0x7f, 0x0e, 0xa5, 0xab, 0xdf, 0x52, 0x16, 0x41, 0x63, 0x57, 0x76, - 0xe2, 0x65, 0x21, 0x0c, 0x54, 0xf2, 0x11, 0x7b, 0x94, 0x9c, 0xb5, 0x38, - 0x12, 0x3a, 0x27, 0xe1, 0xa0, 0x1b, 0xe3, 0x71, 0x9a, 0xee, 0x6f, 0x89, - 0x87, 0xec, 0x3c, 0x8a, 0x74, 0x50, 0x9b, 0x95, 0xd8, 0x0f, 0xe9, 0x08, - 0xf2, 0x9f, 0xd7, 0xb2, 0xca, 0x21, 0x03, 0x09, 0xca, 0x30, 0xfb, 0x5c, - 0xdf, 0x20, 0x63, 0xf5, 0xe2, 0x54, 0x51, 0x43, 0xcc, 0xdf, 0x2a, 0x1c, - 0x01, 0x9b, 0xbd, 0xf9, 0x9a, 0xad, 0x22, 0x66, 0xbd, 0x01, 0xa2, 0x45, - 0x53, 0x49, 0x89, 0x88, 0xfc, 0xdc, 0x3a, 0x36, 0x6c, 0xd6, 0x9b, 0xc1, - 0x4f, 0xde, 0xa4, 0x7d, 0x87, 0x1e, 0xd4, 0xb4, 0xa2, 0x86, 0x20, 0xa7, - 0xd4, 0xc4, 0xde, 0xf7, 0x97, 0x0f, 0x24, 0x7d, 0x0c, 0x49, 0xec, 0x90, - 0x61, 0xba, 0xfc, 0xc7, 0x12, 0xa6, 0x18, 0x8a, 0xa0, 0xf6, 0x60, 0x1d, - 0x47, 0xbc, 0xd0, 0x44, 0x7c, 0x47, 0xe2, 0x78, 0xab, 0x19, 0x2a, 0xff, - 0xb5, 0x9b, 0x67, 0xa6, 0xf3, 0x0c, 0x09, 0x35, 0x02, 0x4c, 0x6a, 0x15, - 0x4b, 0x4f, 0xd8, 0x60, 0x74, 0xb3, 0x3a, 0x68, 0xec, 0xd0, 0x2b, 0x9a, - 0xfb, 0x1d, 0x66, 0x6f, 0x81, 0x56, 0x76, 0xde, 0xd6, 0x23, 0xd0, 0x8c, - 0xb2, 0x68, 0x37, 0x03, 0x8f, 0x9a, 0xfd, 0x38, 0xbc, 0xec, 0xad, 0x73, - 0x2f, 0x45, 0x09, 0x75, 0xce, 0xb3, 0x5d, 0x36, 0x8c, 0x0d, 0x5a, 0x0f, - 0x65, 0x59, 0x87, 0xc3, 0x70, 0x27, 0xc7, 0x00, 0x88, 0x74, 0x11, 0x52, - 0x9b, 0x8e, 0x40, 0x52, 0xda, 0x2b, 0xec, 0x0e, 0x3d, 0x22, 0xef, 0x4f, - 0xcd, 0xee, 0x33, 0xef, 0x2e, 0xd1, 0x78, 0xa1, 0x92, 0xea, 0x07, 0x7b, - 0x1d, 0xc6, 0x6e, 0xd2, 0x2f, 0x40, 0x49, 0x02, 0x24, 0xae, 0xbf, 0xf0, - 0x0a, 0x4c, 0x59, 0x54, 0x61, 0xa2, 0xec, 0x06, 0x0c, 0x77, 0x63, 0x5f, - 0xd5, 0xe9, 0xc4, 0xd3, 0x6b, 0x73, 0x7e, 0xa9, 0x01, 0xdf, 0x15, 0x46, - 0xc3, 0xb7, 0x9d, 0xca, 0xda, 0x4d, 0x71, 0xe4, 0x0d, 0x93, 0xcc, 0xb3, - 0xcd, 0x9a, 0x10, 0x1b, 0x48, 0x6a, 0x3f, 0x36, 0x5a, 0xf7, 0x1f, 0x7d, - 0x0c, 0x22, 0xdf, 0x9c, 0xee, 0x36, 0x1b, 0xdb, 0x58, 0x8e, 0x05, 0xa0, - 0x84, 0x94, 0x24, 0x26, 0x06, 0xd4, 0x54, 0x61, 0x6d, 0xe2, 0x9f, 0x9a, - 0xb9, 0xe2, 0xfd, 0x72, 0xc6, 0xa3, 0x07, 0xed, 0x68, 0xfa, 0x6c, 0x80, - 0x64, 0xa2, 0x75, 0x06, 0x85, 0xbc, 0x48, 0xbe, 0x77, 0xe8, 0xa8, 0x22, - 0x00, 0xec, 0x83, 0x3c, 0x05, 0x63, 0x81, 0xa1, 0xe0, 0x33, 0xea, 0x75, - 0xd9, 0x36, 0xee, 0x23, 0x58, 0xa1, 0xcb, 0x81, 0xc5, 0x8b, 0x1b, 0xce, - 0xfb, 0x04, 0x43, 0x02, 0x6d, 0x62, 0xe6, 0x4d, 0xc6, 0x86, 0xcf, 0xa9, - 0x21, 0xa2, 0x31, 0xd8, 0x58, 0x44, 0x1c, 0x1e, 0x72, 0xdb, 0x05, 0xf6, - 0x71, 0xc1, 0x65, 0x72, 0x30, 0x7c, 0x5e, 0x2a, 0x01, 0x0c, 0x59, 0x10, - 0x57, 0xad, 0xc9, 0x0c, 0x5f, 0x2f, 0xc9, 0xfc, 0xd0, 0xfd, 0xfe, 0x26, - 0xcc, 0xda, 0xdb, 0x08, 0x8d, 0xf7, 0xe1, 0x12, 0x8f, 0xe2, 0xb3, 0x02, - 0xaa, 0x6d, 0x28, 0xb3, 0x5d, 0x26, 0x44, 0x3d, 0xd3, 0x58, 0x07, 0xee, - 0x81, 0xf0, 0xc3, 0x92, 0x9e, 0x8c, 0x94, 0xb5, 0x4c, 0x25, 0x43, 0xaf, - 0xd4, 0xfa, 0x0e, 0x14, 0x38, 0xae, 0x45, 0x7c, 0x90, 0xe5, 0xf7, 0x10, - 0xbd, 0x7e, 0x5d, 0x29, 0x39, 0x81, 0xf3, 0x56, 0xf3, 0x0d, 0x1a, 0xd6, - 0x18, 0xe7, 0xac, 0x73, 0xc6, 0xa2, 0x72, 0x5f, 0x85, 0x2c, 0x74, 0x32, - 0x74, 0x0e, 0x92, 0x81, 0xf2, 0xd9, 0xec, 0x8c, 0x53, 0x9e, 0x30, 0x7c, - 0xcb, 0x98, 0xa7, 0x96, 0x24, 0x67, 0x4e, 0xbe, 0x9b, 0x6f, 0x2c, 0x64, - 0xec, 0xb7, 0x92, 0x9a, 0xcd, 0x91, 0xd6, 0x43, 0xdb, 0xfb, 0x66, 0xe8, - 0x43, 0x01, 0x17, 0xa0, 0x1c, 0x44, 0x20, 0x2a, 0xbe, 0x1a, 0xb2, 0x33, - 0x55, 0x0e, 0xa0, 0x4c, 0xf2, 0x5e, 0xaf, 0x75, 0x04, 0xc7, 0xb1, 0x31, - 0x5f, 0x54, 0x01, 0xfc, 0x33, 0x85, 0xdd, 0x72, 0x9e, 0x83, 0xf6, 0x2f, - 0xcf, 0x0d, 0x35, 0x8b, 0xc6, 0x1d, 0x95, 0xa0, 0xc8, 0xb6, 0x21, 0x4e, - 0xd9, 0x53, 0x11, 0x9e, 0xbd, 0x7e, 0x3e, 0x6e, 0x44, 0xe4, 0x64, 0xca, - 0x73, 0x47, 0x05, 0x99, 0x53, 0x73, 0x7c, 0xaa, 0xc1, 0x69, 0x8f, 0xaf, - 0xa3, 0x99, 0x4e, 0x44, 0xc8, 0x37, 0xbe, 0x2b, 0xa2, 0x32, 0x7e, 0xf5, - 0x16, 0x6b, 0xba, 0xa5, 0xa5, 0xda, 0xc5, 0xc4, 0x79, 0x04, 0x3f, 0x8c, - 0xf0, 0x6b, 0x79, 0xbb, 0x32, 0x0e, 0x09, 0xd9, 0x67, 0x0d, 0x3d, 0xdd, - 0x4d, 0x0c, 0xf3, 0x62, 0x81, 0xa7, 0xc4, 0xe8, 0x52, 0xb9, 0x3a, 0xcf, - 0xb6, 0xff, 0x57, 0x4f, 0x4d, 0x83, 0x0d, 0x34, 0xc0, 0x6d, 0x42, 0x1d, - 0x2f, 0xa8, 0xc2, 0xc8, 0xb9, 0x90, 0x49, 0xea, 0x92, 0xbb, 0x2f, 0x40, - 0x1c, 0xb4, 0x49, 0xf9, 0xfc, 0x30, 0x33, 0x84, 0xdc, 0xe5, 0xe5, 0xf7, - 0x52, 0xbc, 0x3c, 0x04, 0xf6, 0x3b, 0xcc, 0xae, 0x7e, 0x3c, 0x4a, 0xda, - 0xe2, 0xdb, 0x8f, 0x02, 0xee, 0x4a, 0xc6, 0xae, 0x45, 0x79, 0x18, 0xb9, - 0xf3, 0x4e, 0x88, 0x01, 0xdd, 0x61, 0x63, 0xbf, 0xeb, 0x9d, 0xe7, 0x9a, - 0x28, 0x46, 0x8c, 0x78, 0xb3, 0x40, 0xe9, 0x14, 0x50, 0xa3, 0xa2, 0x8d, - 0xfe, 0xb3, 0x09, 0xe7, 0x0d, 0x03, 0x00, 0x3c, 0x3f, 0xbd, 0x98, 0x36, - 0xdf, 0xc3, 0x88, 0x66, 0x21, 0x6f, 0x4c, 0x56, 0x71, 0xcf, 0xe5, 0x77, - 0xbc, 0xbd, 0x7c, 0xee, 0x66, 0xbf, 0xaf, 0x4a, 0x91, 0xe6, 0x10, 0xaf, - 0x0c, 0x5c, 0xde, 0xb1, 0xd2, 0xcf, 0x5b, 0xd9, 0x3a, 0x7a, 0x2b, 0x9d, - 0xc8, 0xa1, 0x7a, 0xa3, 0x9a, 0xb1, 0xdf, 0x22, 0x2f, 0xe4, 0xff, 0x15, - 0xd8, 0x5e, 0xe4, 0x05, 0xad, 0x87, 0xf3, 0xa2, 0x20, 0xbc, 0x9f, 0x87, - 0xfb, 0x95, 0xee, 0xca, 0xed, 0x7a, 0x4b, 0xda, 0xc9, 0x58, 0xc4, 0x05, - 0xf8, 0x9f, 0xa0, 0x5d, 0xbf, 0x39, 0xe1, 0x3c, 0x21, 0x5e, 0x3d, 0xb1, - 0x6f, 0x9f, 0xe0, 0x6f, 0xee, 0x02, 0xab, 0xda, 0x02, 0x15, 0x78, 0x36, - 0x83, 0x57, 0xc6, 0x1c, 0x7f, 0xc7, 0xc7, 0x3c, 0x46, 0x3b, 0x94, 0xb9, - 0xe5, 0x2b, 0x50, 0x8c, 0xfc, 0xcd, 0x2d, 0x19, 0xdb, 0x83, 0x95, 0xd6, - 0xeb, 0x36, 0x06, 0x23, 0xa5, 0x4c, 0xc2, 0xbc, 0xca, 0xcd, 0x1b, 0xbf, - 0x55, 0x2a, 0x92, 0x90, 0x1e, 0x8e, 0xe6, 0x29, 0xda, 0x8c, 0xb8, 0x1e, - 0x0c, 0xb9, 0xd1, 0x14, 0xee, 0x2a, 0x57, 0xcb, 0xd1, 0xa5, 0xcb, 0xb8, - 0x42, 0x30, 0x54, 0xdb, 0x2d, 0x52, 0x54, 0xfe, 0x85, 0x56, 0x01, 0x49, - 0xcc, 0x30, 0xde, 0x9a, 0x85, 0x5e, 0x09, 0x5c, 0x99, 0xb0, 0x7b, 0x3c, - 0x53, 0xa6, 0x84, 0x71, 0x59, 0x64, 0x5b, 0xe7, 0xd7, 0xba, 0x85, 0x21, - 0x52, 0xb7, 0x45, 0xb7, 0xcd, 0x43, 0xfb, 0x1f, 0xe2, 0x2d, 0x2c, 0x4e, - 0x25, 0x8d, 0x9a, 0x89, 0x6a, 0x1a, 0x9c, 0x7b, 0x09, 0x1f, 0x44, 0x6d, - 0xd8, 0x8d, 0x73, 0xca, 0x24, 0x59, 0xae, 0xdd, 0xb5, 0x5c, 0xc4, 0x8d, - 0x3c, 0x58, 0xa9, 0xd9, 0x5d, 0xf4, 0x34, 0x92, 0x54, 0x3f, 0xc9, 0x41, - 0x16, 0x81, 0x3b, 0x00, 0xd7, 0x34, 0x9d, 0x54, 0xfb, 0xa6, 0xea, 0x5f, - 0x95, 0x16, 0xc5, 0x7f, 0x36, 0x1e, 0xd0, 0x90, 0x7b, 0x43, 0xea, 0x05, - 0xe2, 0xf6, 0x89, 0xd2, 0x19, 0xe0, 0x45, 0x71, 0x99, 0xd8, 0x9b, 0xae, - 0x43, 0xba, 0x54, 0x89, 0xb3, 0xdc, 0xe2, 0x77, 0xfa, 0x1e, 0x6b, 0xf8, - 0x80, 0x4d, 0xbf, 0xf2, 0xb1, 0xd5, 0xd8, 0xac, 0x58, 0x04, 0xb1, 0xbd, - 0xf0, 0x42, 0xcb, 0x42, 0x67, 0x83, 0x3c, 0x62, 0xf7, 0x75, 0x4c, 0x3b, - 0xc8, 0x0c, 0xcf, 0x64, 0x64, 0x9a, 0x58, 0x6b, 0xa4, 0xd0, 0x63, 0x4e, - 0x0c, 0x3f, 0x77, 0x93, 0xe0, 0x66, 0xd6, 0x9a, 0xdd, 0x0a, 0x0c, 0xfa, - 0xe6, 0x32, 0xcc, 0x36, 0x0f, 0xe1, 0x28, 0x95, 0x6b, 0x6e, 0xd5, 0xac, - 0x42, 0xec, 0x08, 0xe0, 0x84, 0x85, 0x49, 0x26, 0xb9, 0x61, 0x7d, 0x26, - 0x7c, 0x1f, 0xab, 0xb7, 0x34, 0xa5, 0x0d, 0x5d, 0x51, 0xac, 0x9f, 0x5d, - 0x25, 0x9b, 0x5d, 0x2f, 0xce, 0xce, 0x53, 0xbd, 0x4b, 0x0c, 0x08, 0xfb, - 0xec, 0x25, 0x6b, 0xc6, 0x47, 0x04, 0x17, 0x59, 0xd8, 0x45, 0xfb, 0x01, - 0x28, 0xcf, 0x11, 0x87, 0xed, 0x87, 0x7f, 0xf2, 0x2f, 0x27, 0xde, 0xfe, - 0x94, 0x1b, 0xdb, 0xfe, 0x8d, 0xb7, 0x86, 0x92, 0xf6, 0x8c, 0xaa, 0x4e, - 0x4f, 0x58, 0x78, 0x17, 0xc2, 0x4b, 0x48, 0x3f, 0xe7, 0xc0, 0xb9, 0x28, - 0x1c, 0xdc, 0xf4, 0xde, 0xd8, 0xfa, 0xfa, 0x3d, 0x72, 0xac, 0x61, 0x2f, - 0xa4, 0x45, 0x73, 0x13, 0x1c, 0x58, 0xf3, 0xfb, 0xfe, 0xf7, 0x6b, 0xa1, - 0xd9, 0x2e, 0xb8, 0xe8, 0xdc, 0x59, 0x03, 0x0b, 0x8f, 0xdd, 0x05, 0x1f, - 0xe0, 0xc1, 0x66, 0x41, 0xbc, 0x9d, 0x85, 0xdf, 0x59, 0x53, 0x6b, 0x6d, - 0xba, 0xba, 0xf8, 0x46, 0xfa, 0x5f, 0x40, 0x51, 0xa4, 0x1d, 0x27, 0x3a, - 0x3e, 0xbd, 0x5b, 0x50, 0x65, 0x5d, 0x48, 0xcd, 0xca, 0x0a, 0x0f, 0xa5, - 0x43, 0x38, 0x76, 0xfc, 0x13, 0x60, 0xbf, 0x31, 0x8d, 0xa6, 0x2e, 0xe0, - 0x9b, 0xc0, 0xf7, 0x74, 0x75, 0x06, 0x2a, 0xb8, 0xed, 0x5a, 0x5a, 0x82, - 0xb1, 0x12, 0xf7, 0x56, 0x07, 0x1d, 0xf3, 0xf6, 0xab, 0x3b, 0x6e, 0xf4, - 0xf3, 0x89, 0x5e, 0x55, 0x87, 0x4c, 0x6a, 0xd7, 0xb5, 0xd5, 0x63, 0xfa, - 0x0f, 0x9c, 0x1d, 0x02, 0x55, 0xc7, 0xf5, 0x91, 0xdc, 0xae, 0x56, 0x34, - 0x01, 0xa0, 0xb3, 0x36, 0x7a, 0x88, 0x62, 0x77, 0xd3, 0xd4, 0x26, 0xa4, - 0x0b, 0x4f, 0x0c, 0x1d, 0x0f, 0xfc, 0x86, 0x01, 0x07, 0xa9, 0xab, 0xa4, - 0xcf, 0x58, 0xcd, 0xc4, 0x27, 0xfd, 0xaa, 0x2f, 0x59, 0x76, 0xd2, 0xfc, - 0x65, 0x7e, 0x1b, 0x2b, 0x26, 0x02, 0x9b, 0xbf, 0xd8, 0xe8, 0x9a, 0x4a, - 0x19, 0x99, 0xde, 0x4a, 0xab, 0xd1, 0xe5, 0x71, 0x2a, 0xde, 0x09, 0x46, - 0x31, 0x82, 0xd3, 0x34, 0x8e, 0xa8, 0x9a, 0x14, 0x41, 0x32, 0xfb, 0xb8, - 0xac, 0xaf, 0x7c, 0x6e, 0x45, 0xf9, 0x4f, 0xb1, 0x98, 0x05, 0x7d, 0xbc, - 0xae, 0x07, 0xf3, 0x40, 0xaf, 0x1d, 0xd0, 0x88, 0x6f, 0xb8, 0xf4, 0x78, - 0x82, 0x06, 0xa0, 0xb3, 0x0c, 0x71, 0xd3, 0xa5, 0x60, 0x1a, 0x9b, 0x0f, - 0xe2, 0xaa, 0x91, 0xe2, 0x3c, 0x86, 0x2a, 0x25, 0x9a, 0x1e, 0xca, 0xcc, - 0x93, 0x32, 0x4a, 0x88, 0x8a, 0x67, 0x7f, 0x8a, 0x4c, 0x46, 0x25, 0xf4, - 0x10, 0xb3, 0x64, 0x8c, 0x7e, 0x5b, 0x1a, 0x8b, 0x1d, 0x2d, 0x08, 0x9c, - 0xdd, 0xae, 0x28, 0xf7, 0x85, 0x1a, 0xe2, 0x97, 0x3b, 0x7d, 0xe9, 0x36, - 0x6f, 0xfa, 0xff, 0x9e, 0x3f, 0xd8, 0xb8, 0x28, 0x1f, 0x87, 0x7c, 0x47, - 0x59, 0xad, 0x5c, 0x3a, 0x9e, 0x00, 0xce, 0x08, 0x75, 0x47, 0x45, 0x4a, - 0xc1, 0x16, 0xa5, 0x6f, 0xbf, 0x72, 0xd8, 0x28, 0x00, 0x87, 0x50, 0xa4, - 0x02, 0xf2, 0x15, 0xbe, 0x4d, 0x97, 0xec, 0x18, 0x76, 0x6f, 0xdd, 0x3a, - 0xd0, 0xeb, 0x56, 0x66, 0xb1, 0x91, 0xc8, 0x13, 0xdc, 0x67, 0x2c, 0x75, - 0x8a, 0xd5, 0xe3, 0xe7, 0x48, 0xe1, 0xa7, 0x2b, 0xc8, 0x9e, 0x06, 0x08, - 0x6b, 0x0f, 0xb6, 0x9d, 0x01, 0x11, 0x78, 0xd4, 0x7e, 0xa4, 0xad, 0x18, - 0xec, 0xb8, 0x6c, 0x18, 0x0a, 0xf6, 0x4a, 0x32, 0xfc, 0x80, 0xba, 0x1e, - 0xcb, 0x82, 0x96, 0x33, 0xbe, 0xc6, 0x9f, 0x07, 0x56, 0xdd, 0x52, 0xc8, - 0xc5, 0x37, 0x30, 0x8d, 0xfe, 0xaa, 0x24, 0x1d, 0x44, 0x88, 0x18, 0x5d, - 0x8f, 0x87, 0x84, 0x9c, 0x44, 0xca, 0xda, 0x17, 0xc9, 0x6c, 0xc8, 0x0f, - 0xa9, 0xeb, 0x38, 0x39, 0xc9, 0x11, 0xa4, 0xf2, 0x3a, 0x79, 0x01, 0x17, - 0x65, 0xab, 0x52, 0xf8, 0x93, 0xf6, 0x1e, 0x3e, 0xa6, 0xa8, 0x99, 0x3d, - 0x0e, 0xfa, 0xab, 0xcd, 0x46, 0x4a, 0x4b, 0xbf, 0x0a, 0x6e, 0xf6, 0x52, - 0xef, 0x8c, 0xe1, 0x90, 0xb5, 0x54, 0x21, 0xe5, 0x2d, 0x0c, 0x22, 0x70, - 0xa7, 0x07, 0xfb, 0xcf, 0xaa, 0x5c, 0x54, 0x94, 0xbc, 0x9c, 0x11, 0x34, - 0x0c, 0x8d, 0x57, 0x3c, 0x40, 0x91, 0x69, 0x88, 0xc4, 0x6c, 0x2e, 0xd7, - 0x01, 0xcd, 0x3a, 0x06, 0x76, 0x7c, 0x01, 0xaa, 0xe2, 0x9c, 0x73, 0x28, - 0xd1, 0x14, 0x21, 0x5e, 0xee, 0x66, 0x06, 0xbf, 0x2a, 0x72, 0xe7, 0xdd, - 0x84, 0xc7, 0xab, 0x6d, 0xd6, 0x64, 0x74, 0x5d, 0x6a, 0x04, 0x52, 0xcc, - 0xb9, 0xdc, 0x8a, 0xcd, 0xd8, 0x3b, 0x02, 0x77, 0x3e, 0xcb, 0x04, 0x08, - 0x3b, 0x7e, 0x38, 0x36, 0x4a, 0x1c, 0x6e, 0x9f, 0x3e, 0x9d, 0xb2, 0xca, - 0x9b, 0x03, 0x20, 0xcd, 0x32, 0xa1, 0x07, 0xc4, 0x9b, 0xd5, 0x69, 0xa3, - 0x85, 0x20, 0x2e, 0x35, 0x87, 0x14, 0xd3, 0xa2, 0xc8, 0x04, 0x5d, 0xe8, - 0x67, 0x17, 0xfc, 0x36, 0x81, 0xd4, 0xdc, 0x10, 0x65, 0xbf, 0xe0, 0xde, - 0xbc, 0x9e, 0x56, 0xda, 0xf7, 0x70, 0x97, 0xf9, 0xda, 0xf4, 0xd9, 0x34, - 0x5a, 0x46, 0x99, 0x95, 0x8e, 0xdb, 0x2a, 0x57, 0x63, 0x91, 0xd7, 0x2b, - 0xcd, 0x88, 0x9a, 0x9d, 0xf2, 0x5d, 0xd6, 0xd4, 0x59, 0xfd, 0x23, 0xbf, - 0x7f, 0xd0, 0x1a, 0x34, 0x30, 0xaa, 0xef, 0x6c, 0x2b, 0x7c, 0x1c, 0x3f, - 0xc5, 0x4c, 0xa4, 0x54, 0x57, 0x5a, 0x4e, 0xfa, 0x57, 0x6a, 0xb0, 0x50, - 0x84, 0x5d, 0x95, 0xd1, 0x18, 0x94, 0x0a, 0xcf, 0x24, 0xc1, 0x29, 0x69, - 0x5f, 0x6e, 0xd9, 0xaa, 0x3d, 0xf6, 0x5e, 0x85, 0x5d, 0xf7, 0xdb, 0xcd, - 0x1e, 0xca, 0x32, 0x0f, 0x92, 0x2b, 0x55, 0xcc, 0xef, 0x05, 0xe7, 0x61, - 0xff, 0x4c, 0x23, 0xb8, 0xe6, 0x10, 0x01, 0xfb, 0xab, 0x3a, 0x60, 0x0b, - 0xa5, 0xe3, 0xfe, 0x3d, 0x01, 0x6f, 0xf2, 0x39, 0x97, 0xff, 0x69, 0xae, - 0x42, 0x0e, 0x39, 0x50, 0x65, 0x6f, 0xfb, 0xb1, 0xcb, 0xf1, 0xa9, 0x08, - 0x44, 0x7f, 0xcb, 0x39, 0x91, 0xc6, 0x54, 0x57, 0x92, 0xf0, 0xc7, 0x37, - 0xbc, 0x48, 0xd1, 0x60, 0xb3, 0x64, 0x0b, 0x6b, 0x9a, 0xbe, 0xce, 0x36, - 0x7d, 0x2b, 0x4e, 0x95, 0xb7, 0xd7, 0x19, 0xd3, 0x8d, 0x4b, 0x38, 0xf1, - 0x52, 0x5b, 0x34, 0x3d, 0x8f, 0x30, 0xc8, 0x51, 0xba, 0x90, 0xcb, 0xd1, - 0xb5, 0xe9, 0xf5, 0xcd, 0xb1, 0xca, 0x49, 0xc8, 0x60, 0xb3, 0x89, 0xc6, - 0x7d, 0x03, 0xb2, 0x42, 0xef, 0xa0, 0x6d, 0x1e, 0x47, 0xd1, 0x96, 0x6d, - 0x88, 0xb3, 0x91, 0xd8, 0xee, 0x73, 0xd7, 0xcf, 0xd1, 0x4f, 0x5c, 0xbd, - 0xb0, 0x4e, 0xc0, 0xdd, 0x96, 0x87, 0x21, 0x76, 0xc8, 0x39, 0x67, 0x2f, - 0x29, 0xca, 0x9e, 0x30, 0xb7, 0x37, 0x03, 0x6c, 0x4e, 0x9c, 0x85, 0x1d, - 0xf1, 0xe2, 0x7c, 0x50, 0xe5, 0xb4, 0x1e, 0x8f, 0x91, 0x52, 0x87, 0xef, - 0x17, 0x31, 0x3f, 0x29, 0xc8, 0x87, 0xfd, 0x31, 0xf0, 0xae, 0x9c, 0xbf, - 0xaf, 0xe5, 0xb7, 0x25, 0x26, 0x44, 0x3f, 0x05, 0x1b, 0xc5, 0xe8, 0x15, - 0x92, 0x02, 0x80, 0x28, 0x05, 0x35, 0x06, 0xd3, 0x05, 0x8f, 0xf1, 0x35, - 0x19, 0x7e, 0x71, 0x3d, 0x94, 0xe0, 0x63, 0x39, 0xb0, 0x14, 0xf5, 0x9b, - 0xb1, 0xdc, 0xba, 0xbb, 0x7c, 0x4b, 0x32, 0x24, 0x89, 0x6a, 0x43, 0xa5, - 0x55, 0x52, 0x40, 0x3b, 0x90, 0xb4, 0xf1, 0x76, 0xf9, 0x50, 0x8c, 0x33, - 0x20, 0x3f, 0xc9, 0x35, 0xea, 0x03, 0x2d, 0xed, 0xa5, 0xf6, 0xbd, 0x55, - 0x0c, 0x16, 0x19, 0x2e, 0xc4, 0x5e, 0x50, 0x09, 0x80, 0x28, 0xf1, 0xf3, - 0xdd, 0xe8, 0x81, 0x47, 0x2e, 0x35, 0xb0, 0x3e, 0xab, 0x25, 0x3c, 0xc4, - 0xca, 0x61, 0x51, 0x2a, 0x21, 0x83, 0x34, 0xf9, 0xeb, 0xb8, 0xe9, 0xec, - 0x67, 0xe0, 0x47, 0xc2, 0xb7, 0x0a, 0xfd, 0x85, 0x26, 0x72, 0x92, 0x89, - 0xac, 0x4d, 0x3d, 0x57, 0x40, 0x59, 0x58, 0xd4, 0xe2, 0xd7, 0x3d, 0xb7, - 0xa3, 0x38, 0x79, 0x04, 0x29, 0x9e, 0x6e, 0xbd, 0x14, 0x40, 0xd5, 0xcc, - 0xdb, 0xdf, 0x6f, 0xdd, 0x2b, 0x6e, 0x37, 0x0f, 0x3c, 0x46, 0xfc, 0xcc, - 0xa0, 0xaf, 0x49, 0xf4, 0x9e, 0xd6, 0x0b, 0x2f, 0xd1, 0x6c, 0x1d, 0x66, - 0x24, 0x5d, 0xf0, 0xdf, 0x39, 0x4f, 0x32, 0x95, 0x5b, 0x9a, 0x52, 0xed, - 0xa2, 0x90, 0x8f, 0x05, 0x94, 0xd6, 0x95, 0xe0, 0xe8, 0xe0, 0xf5, 0xd5, - 0x26, 0x33, 0x52, 0x87, 0x67, 0x87, 0x4f, 0x88, 0xd9, 0x0a, 0xed, 0xa7, - 0x8b, 0x04, 0xa1, 0x98, 0x70, 0x8a, 0x5f, 0x9f, 0x2d, 0x70, 0x6d, 0xc2, - 0x29, 0x58, 0xb8, 0x4c, 0x50, 0x11, 0xd1, 0x7f, 0x95, 0xdb, 0x29, 0x38, - 0x34, 0x5d, 0x56, 0x76, 0xae, 0x22, 0xfd, 0xe9, 0x1b, 0x85, 0x1b, 0x9c, - 0x8a, 0x7e, 0xb1, 0x83, 0x3c, 0xc1, 0x3a, 0x25, 0x22, 0xd3, 0x16, 0xda, - 0x80, 0x15, 0xb4, 0xbc, 0x42, 0xb2, 0xe5, 0xfa, 0xab, 0xe1, 0xd7, 0xe7, - 0x28, 0x29, 0x88, 0xda, 0x65, 0x76, 0x4a, 0x9f, 0x05, 0x61, 0x02, 0xa3, - 0x92, 0xfe, 0x66, 0x50, 0x5c, 0xc0, 0x86, 0xf6, 0xed, 0xfa, 0x6f, 0xf1, - 0x2e, 0x04, 0x45, 0x01, 0x39, 0xb6, 0x86, 0x63, 0x19, 0x9d, 0x20, 0x94, - 0xba, 0xc8, 0x0e, 0x5e, 0x58, 0xb5, 0xb1, 0x30, 0xb5, 0xb6, 0xf5, 0x1b, - 0xee, 0xe4, 0x73, 0x83, 0x20, 0x19, 0x5a, 0x16, 0x65, 0x8c, 0x06, 0x5a, - 0xe5, 0xc7, 0xb6, 0x0f, 0xe2, 0x61, 0x5a, 0x2e, 0xae, 0x1b, 0xba, 0x25, - 0xf3, 0x4b, 0xbe, 0xf8, 0x02, 0x6b, 0xbd, 0x79, 0x1e, 0x6a, 0xd7, 0x8a, - 0x33, 0xb9, 0x81, 0x79, 0x5e, 0xad, 0x4f, 0x8c, 0xea, 0x09, 0x8d, 0xa5, - 0x1f, 0x32, 0x24, 0xc8, 0x54, 0x45, 0x93, 0x57, 0x80, 0x77, 0xce, 0x96, - 0x32, 0x4f, 0xa2, 0xf3, 0xdd, 0xc7, 0xee, 0xcf, 0x42, 0xa3, 0x8f, 0xcb, - 0x73, 0x22, 0x32, 0xd2, 0x0d, 0x9b, 0x2c, 0xf8, 0x5c, 0xf7, 0x37, 0x05, - 0x3d, 0x10, 0xfb, 0x75, 0x36, 0xea, 0x76, 0x23, 0x2a, 0x31, 0x8b, 0xbc, - 0x87, 0xfc, 0x71, 0x70, 0xbc, 0x6d, 0x74, 0x43, 0x85, 0x1a, 0x0f, 0xa3, - 0x8c, 0xf3, 0xea, 0x8e, 0x37, 0x88, 0x13, 0xda, 0x3b, 0x20, 0x48, 0x35, - 0x3a, 0x34, 0x90, 0xad, 0x67, 0x9a, 0x83, 0x9c, 0xc3, 0xec, 0x55, 0x6f, - 0xe4, 0xc7, 0x50, 0x3b, 0xf7, 0x83, 0xbc, 0x0d, 0x26, 0xba, 0xf3, 0x00, - 0x39, 0xa7, 0x37, 0x4f, 0xb7, 0x0e, 0x0b, 0x96, 0x42, 0xb6, 0xbf, 0xdc, - 0x3b, 0x87, 0xbe, 0x89, 0x5f, 0x9c, 0x65, 0x51, 0xa3, 0xe4, 0x73, 0x02, - 0xb9, 0x34, 0x6b, 0x94, 0xae, 0x4a, 0xbc, 0x91, 0xd2, 0xbc, 0x89, 0xdc, - 0x54, 0x2a, 0x48, 0xec, 0xca, 0x3e, 0x9b, 0xb6, 0xf4, 0x91, 0x50, 0x18, - 0x00, 0xdd, 0xf2, 0x3d, 0xfe, 0xcb, 0x4a, 0xea, 0x79, 0x9a, 0x32, 0xa5, - 0x95, 0x50, 0x13, 0x92, 0x88, 0x2d, 0xcb, 0x21, 0xff, 0x54, 0x1f, 0x3a, - 0xc7, 0xeb, 0x4e, 0x27, 0x65, 0xd5, 0x5f, 0xa5, 0x93, 0x89, 0x53, 0xa1, - 0x22, 0x8d, 0xcf, 0xeb, 0x0d, 0x1e, 0x94, 0x70, 0xf3, 0xaa, 0xda, 0x97, - 0x57, 0xfe, 0x6e, 0x1c, 0xfc, 0x53, 0x16, 0x80, 0x56, 0x8d, 0x92, 0x68, - 0xd3, 0x1b, 0xe2, 0xe6, 0xe0, 0xbb, 0x56, 0x84, 0x5d, 0x3d, 0x3d, 0x1c, - 0x4a, 0x62, 0xc2, 0xd0, 0x9f, 0xc8, 0x26, 0xc0, 0x36, 0x1a, 0x7b, 0x10, - 0x9d, 0x29, 0x5e, 0xa9, 0xf2, 0x06, 0x59, 0x0c, 0xe5, 0xe9, 0x2e, 0x38, - 0x67, 0x98, 0x51, 0xc8, 0x86, 0xb4, 0x21, 0x95, 0x72, 0xf4, 0xf1, 0x40, - 0x37, 0x21, 0x1c, 0x54, 0x47, 0xf3, 0xe9, 0xf7, 0xfa, 0x1e, 0x53, 0xf5, - 0x32, 0xbf, 0x30, 0xcb, 0x7d, 0x88, 0x58, 0x59, 0x0a, 0x25, 0xf0, 0x7c, - 0x39, 0x0a, 0x29, 0x77, 0x4d, 0xaa, 0xd8, 0x24, 0x05, 0x13, 0xb9, 0x47, - 0x7f, 0x92, 0x70, 0x1c, 0x1e, 0x76, 0xae, 0x98, 0xf0, 0x16, 0x44, 0x3d, - 0x65, 0xf4, 0x16, 0xba, 0x0c, 0x7c, 0xda, 0x97, 0xac, 0x7e, 0x97, 0xec, - 0x3a, 0x76, 0x88, 0xe6, 0xe9, 0x27, 0xfd, 0xa0, 0xb8, 0x6b, 0x8f, 0xa2, - 0x23, 0x82, 0x32, 0x35, 0x37, 0x05, 0x84, 0x2d, 0xb8, 0x36, 0xc2, 0x7d, - 0x01, 0x72, 0x93, 0xc5, 0xe4, 0xef, 0x20, 0x0c, 0x80, 0xc2, 0x8f, 0x4d, - 0x2e, 0x98, 0xfc, 0x7f, 0x32, 0x04, 0xbe, 0x9a, 0x8e, 0x7e, 0x9c, 0x83, - 0x88, 0x5d, 0x3b, 0x0a, 0x9e, 0xc7, 0x84, 0x9f, 0x23, 0xc3, 0x91, 0x82, - 0x30, 0x7e, 0x5f, 0x77, 0x7f, 0x3d, 0x81, 0x0a, 0x6d, 0x86, 0xb3, 0x6c, - 0x03, 0xe1, 0x30, 0x67, 0x0a, 0x62, 0x64, 0x3b, 0xb8, 0xc8, 0x41, 0x9b, - 0xbe, 0x69, 0x53, 0xb1, 0x52, 0xc8, 0xd5, 0xc7, 0x93, 0xfd, 0xb3, 0xf2, - 0x70, 0x3c, 0x6e, 0x47, 0x18, 0x90, 0xc7, 0x27, 0x8c, 0x60, 0x28, 0x32, - 0x6a, 0x92, 0xeb, 0x6c, 0x49, 0x56, 0x63, 0xf2, 0xeb, 0x1c, 0x55, 0x67, - 0x29, 0x01, 0x9e, 0x0a, 0x61, 0x90, 0x0d, 0x86, 0xb6, 0x44, 0xa7, 0xe2, - 0x05, 0x02, 0xee, 0x5c, 0xe8, 0xf1, 0x88, 0xf4, 0xc2, 0xfb, 0x70, 0xf0, - 0x0c, 0xc9, 0xc3, 0x53, 0xbe, 0x5f, 0x7f, 0x64, 0xfb, 0xfd, 0xe9, 0x73, - 0x2e, 0x50, 0xd3, 0xd5, 0x51, 0xc3, 0x06, 0xdb, 0xc3, 0x33, 0xd3, 0x55, - 0x32, 0xce, 0x93, 0x29, 0x95, 0x75, 0x0d, 0xfa, 0x97, 0xc7, 0xff, 0x41, - 0x51, 0x09, 0xfa, 0xaf, 0xf7, 0x7f, 0xfb, 0x78, 0x38, 0xab, 0x5a, 0xdd, - 0x36, 0x32, 0xde, 0x3f, 0x05, 0xc6, 0xac, 0x19, 0x19, 0x9e, 0x59, 0xad, - 0x16, 0x06, 0xcf, 0x47, 0xce, 0xf2, 0x1b, 0xef, 0x84, 0xfd, 0x10, 0xf6, - 0xad, 0xab, 0x0a, 0xfd, 0x2c, 0xba, 0x9a, 0xe7, 0x48, 0x48, 0x8b, 0xe8, - 0xc8, 0xb1, 0x90, 0x51, 0x18, 0x40, 0x66, 0x9e, 0x2d, 0x1f, 0xe7, 0xe4, - 0x8c, 0xfa, 0xbf, 0x76, 0x7b, 0xc4, 0xf9, 0x7e, 0x1c, 0x43, 0x0c, 0xa2, - 0x56, 0xd4, 0x47, 0x5b, 0x45, 0x5b, 0xc8, 0xba, 0x45, 0x5f, 0xa1, 0xf4, - 0x1b, 0x93, 0x4c, 0xdb, 0x73, 0x1f, 0x2c, 0x10, 0xac, 0xf9, 0xc4, 0xfe, - 0x46, 0x18, 0x8e, 0x09, 0xc8, 0xbf, 0x62, 0x3c, 0x64, 0x6e, 0x7c, 0xd1, - 0x86, 0x03, 0x40, 0xb5, 0x6f, 0xf7, 0x9c, 0xc2, 0xcf, 0x07, 0x5c, 0x5f, - 0x3b, 0x7e, 0x81, 0x43, 0x77, 0x78, 0xa5, 0x8d, 0x89, 0xa7, 0x20, 0xc5, - 0x3c, 0x23, 0xbe, 0x1d, 0xd6, 0x53, 0xcc, 0xdf, 0x7e, 0x9d, 0x9b, 0x21, - 0xd2, 0xd6, 0x30, 0xa4, 0xdc, 0xd9, 0xc1, 0xa8, 0xbe, 0x2a, 0x2f, 0xe5, - 0x2a, 0x0c, 0x78, 0x09, 0xb6, 0xda, 0x20, 0xf7, 0x45, 0x18, 0xb2, 0xaa, - 0x1e, 0x06, 0x00, 0x69, 0xf3, 0xe4, 0x75, 0xb5, 0x6a, 0xb9, 0x7c, 0x24, - 0x3f, 0xc0, 0x2a, 0xa1, 0x3e, 0xd9, 0x0e, 0x65, 0x70, 0xcb, 0xc6, 0xee, - 0x66, 0x0b, 0x80, 0x4b, 0xcc, 0x60, 0xc1, 0x49, 0x26, 0xc9, 0x05, 0xe0, - 0x01, 0xbf, 0x44, 0xf1, 0xb5, 0x31, 0xe3, 0xbe, 0xad, 0x91, 0xd2, 0x98, - 0xff, 0x84, 0xa0, 0x95, 0xd2, 0xf2, 0x2b, 0x4b, 0xfa, 0x4c, 0x27, 0x32, - 0x05, 0x50, 0x3a, 0xa3, 0x6e, 0x9e, 0x66, 0x9f, 0xc8, 0xe6, 0x7e, 0x88, - 0x6f, 0xb2, 0x03, 0x3d, 0x7d, 0x64, 0x03, 0x2a, 0x02, 0xdd, 0x16, 0xc6, - 0x05, 0x91, 0xef, 0x9c, 0x60, 0xe0, 0x1f, 0x64, 0xda, 0x95, 0x3d, 0x61, - 0xe6, 0x1f, 0x7f, 0x53, 0x16, 0x40, 0xbf, 0x5b, 0x09, 0x35, 0x88, 0x2d, - 0x92, 0xe3, 0xcd, 0xba, 0xe6, 0xd0, 0x46, 0xcc, 0x70, 0xd6, 0x8a, 0x17, - 0x81, 0x76, 0x56, 0x5f, 0x71, 0xfb, 0x4b, 0xcf, 0x88, 0xd5, 0x6c, 0x1f, - 0xbc, 0x4c, 0x02, 0x37, 0xeb, 0xda, 0x63, 0x91, 0xfa, 0x3d, 0x46, 0xfd, - 0xa5, 0x88, 0x43, 0xa6, 0xc8, 0xf5, 0xc9, 0x67, 0x6e, 0xbf, 0x84, 0x76, - 0x1c, 0x28, 0x5e, 0x9f, 0x9f, 0x97, 0x31, 0x2e, 0x1e, 0x3c, 0xe2, 0xdd, - 0x3e, 0x46, 0x61, 0x42, 0x21, 0x59, 0x76, 0x20, 0x5a, 0x9a, 0xba, 0xb6, - 0x29, 0x9d, 0x9d, 0xb1, 0xab, 0x57, 0x54, 0x5d, 0xa9, 0x79, 0x8d, 0xc9, - 0xd2, 0x05, 0xaa, 0xbb, 0xeb, 0xd4, 0xff, 0x41, 0xd7, 0x58, 0xd1, 0x95, - 0x22, 0x51, 0x4c, 0x06, 0xdd, 0x04, 0xc6, 0x1b, 0xbc, 0xc0, 0x82, 0x14, - 0xcc, 0xea, 0x11, 0x81, 0x87, 0xa0, 0x7c, 0x3c, 0x95, 0x3e, 0x43, 0xc6, - 0xc1, 0x0b, 0x4c, 0x20, 0x4f, 0x40, 0xa6, 0x32, 0x6d, 0xe1, 0xd9, 0x8c, - 0x06, 0x74, 0x1d, 0xb9, 0x83, 0x32, 0x8c, 0xc2, 0x41, 0xb5, 0x16, 0x1c, - 0x5d, 0xfb, 0x34, 0x8b, 0x13, 0xd2, 0xfe, 0xf0, 0xd1, 0x01, 0x41, 0x75, - 0xf7, 0x69, 0x01, 0xe0, 0x9d, 0x1d, 0x2c, 0x6b, 0xe7, 0xa1, 0x2d, 0x0d, - 0x77, 0xe1, 0x0a, 0x98, 0x75, 0xcc, 0xd5, 0x44, 0xf5, 0xd5, 0x17, 0x83, - 0x2a, 0xf4, 0xc1, 0x6e, 0x9c, 0xae, 0x88, 0x59, 0x86, 0x3b, 0x0e, 0xf5, - 0x91, 0xb6, 0x6d, 0x25, 0x42, 0x6c, 0x39, 0xd4, 0xbe, 0xb5, 0x05, 0xe2, - 0xad, 0xb0, 0x44, 0x3b, 0xaf, 0xb2, 0x5f, 0xeb, 0x0e, 0x50, 0xbc, 0x48, - 0x82, 0xa0, 0x9f, 0x1d, 0xa2, 0x31, 0x1d, 0xa5, 0x5d, 0x81, 0x52, 0x38, - 0x47, 0x5e, 0xde, 0xaf, 0x60, 0x2b, 0x8e, 0x54, 0xfa, 0x69, 0x83, 0x6e, - 0x38, 0x68, 0xb1, 0xdd, 0xd5, 0xbc, 0x70, 0x8a, 0x26, 0xc6, 0xc2, 0x50, - 0xcd, 0x7a, 0xbb, 0x65, 0x92, 0x81, 0xff, 0x74, 0xa9, 0x2a, 0xcd, 0xaa, - 0x4e, 0xa8, 0x6d, 0x30, 0x37, 0xd6, 0x9f, 0x9d, 0xbc, 0xcf, 0xb8, 0x25, - 0x52, 0xee, 0x5d, 0x74, 0x20, 0xc2, 0xc5, 0xe5, 0x8f, 0xfb, 0x65, 0xfd, - 0xa5, 0x3f, 0x9d, 0xc8, 0xe0, 0xc0, 0x3d, 0xa0, 0x41, 0x70, 0x1a, 0x1a, - 0xe6, 0x19, 0xf5, 0xf1, 0xe4, 0x95, 0x3a, 0x0a, 0x9b, 0xfa, 0x54, 0x66, - 0xa8, 0xdf, 0xe1, 0x15, 0x34, 0x57, 0x0d, 0x4d, 0xd6, 0x2c, 0x05, 0x48, - 0x72, 0xbb, 0xc0, 0xbf, 0x17, 0xb0, 0xda, 0xea, 0x15, 0x25, 0x33, 0x5b, - 0x7c, 0x17, 0x3f, 0x04, 0xc4, 0xaa, 0x1d, 0x1e, 0x77, 0xa3, 0x22, 0xf8, - 0xd1, 0xa9, 0x9e, 0xb7, 0x1d, 0x70, 0x50, 0x4c, 0xb5, 0xa7, 0xec, 0xdb, - 0x88, 0xa9, 0xa8, 0x55, 0xd8, 0x12, 0x8f, 0xc5, 0xd2, 0x55, 0xaf, 0xe5, - 0x48, 0x7e, 0xb2, 0xf4, 0x70, 0x2a, 0x36, 0x93, 0x4c, 0xc0, 0x65, 0x70, - 0xa5, 0xdc, 0x9b, 0x57, 0xcc, 0x60, 0x22, 0x0f, 0xbc, 0x8c, 0xfb, 0xc7, - 0xf4, 0xd1, 0xf0, 0x08, 0xb5, 0x5e, 0xce, 0x2e, 0x11, 0x27, 0x76, 0xaa, - 0xc4, 0xde, 0x0c, 0x65, 0x81, 0xc5, 0xe5, 0x29, 0x39, 0x88, 0xfc, 0xb4, - 0xb9, 0xbe, 0x12, 0x29, 0x8d, 0xec, 0x3c, 0xa5, 0x2f, 0xb8, 0x08, 0xa1, - 0xd0, 0x6b, 0xe3, 0x13, 0xb9, 0x0f, 0x63, 0x6a, 0x6b, 0x37, 0xfa, 0xbf, - 0x84, 0x7c, 0xbd, 0xe6, 0xe0, 0xfc, 0x49, 0xe4, 0x0b, 0xe4, 0xc9, 0x1f, - 0xa9, 0xb1, 0xc4, 0x97, 0x31, 0xbd, 0x99, 0x93, 0x6c, 0x33, 0x96, 0xd2, - 0x7f, 0x46, 0xcc, 0x5f, 0x45, 0xd5, 0x44, 0x58, 0x30, 0xf8, 0xff, 0x7c, - 0x4a, 0xe6, 0x79, 0x74, 0xb8, 0xa0, 0xf6, 0xcc, 0xfa, 0x6c, 0xde, 0x45, - 0x43, 0xca, 0x5f, 0xfb, 0x5d, 0xb8, 0x55, 0x3f, 0xbc, 0x08, 0x84, 0xf7, - 0x1a, 0x67, 0x6b, 0xc5, 0x72, 0x22, 0xf4, 0xdc, 0xf1, 0x69, 0x2c, 0xd4, - 0x59, 0x2a, 0x1f, 0x00, 0x3b, 0x6c, 0x27, 0x96, 0x57, 0x9e, 0x9b, 0x00, - 0x1e, 0xab, 0x6a, 0x31, 0xf5, 0xdc, 0xe5, 0xdb, 0xf7, 0x79, 0x2f, 0x60, - 0x98, 0xa2, 0x9a, 0x3e, 0x26, 0x31, 0x53, 0xe0, 0xa0, 0x3c, 0x48, 0x20, - 0x3b, 0x8c, 0x7e, 0x08, 0x3f, 0xdb, 0xcf, 0xdd, 0xb3, 0x7a, 0x3e, 0x9f, - 0xa4, 0xca, 0x9b, 0xe4, 0x91, 0xc0, 0xa1, 0x29, 0x86, 0xd0, 0x3e, 0x46, - 0x92, 0xf4, 0x7f, 0xe7, 0x4e, 0xde, 0x12, 0xa1, 0x2e, 0x29, 0x24, 0xc2, - 0x7f, 0xdf, 0x9f, 0x2c, 0xf9, 0x04, 0x2d, 0x74, 0xba, 0x3f, 0x10, 0xa2, - 0xde, 0xc7, 0x2a, 0xc0, 0x9e, 0x13, 0x00, 0xa7, 0x1b, 0xf0, 0xfb, 0x91, - 0xa4, 0x71, 0xb5, 0xa9, 0xdb, 0xcf, 0x11, 0xad, 0x82, 0xf7, 0xbf, 0x0a, - 0x4c, 0xe6, 0xb3, 0xe6, 0x7f, 0x7a, 0x22, 0xc8, 0xec, 0x01, 0x77, 0xb5, - 0xcd, 0xe8, 0x17, 0x74, 0xaf, 0x20, 0x30, 0x59, 0xa8, 0xfa, 0xdf, 0xd2, - 0xd1, 0x1c, 0xb4, 0x5a, 0x5b, 0x42, 0x36, 0x65, 0x02, 0xdb, 0xf0, 0x47, - 0x61, 0xeb, 0xd8, 0xb5, 0x8c, 0xb5, 0x92, 0xb8, 0x80, 0x55, 0xed, 0x90, - 0x75, 0xca, 0xf2, 0x44, 0x79, 0xfb, 0x93, 0x7e, 0xaa, 0x8a, 0xa9, 0x69, - 0x85, 0x12, 0x5c, 0xed, 0xcd, 0xfe, 0x7c, 0xc8, 0x36, 0x5c, 0x78, 0xe8, - 0x25, 0x78, 0x02, 0x4b, 0xed, 0x03, 0xe3, 0xc9, 0x3a, 0x15, 0x1c, 0xcb, - 0xbd, 0x64, 0xd8, 0xc0, 0x17, 0xe9, 0x34, 0x02, 0xee, 0x75, 0x61, 0xae, - 0x67, 0x0f, 0x53, 0x24, 0x59, 0xf3, 0xf2, 0x5d, 0x70, 0x10, 0x6d, 0xdb, - 0x91, 0x50, 0x52, 0x11, 0xa7, 0x1a, 0xe1, 0x63, 0x57, 0x95, 0x88, 0x6e, - 0x93, 0x7b, 0xd4, 0xb4, 0xfe, 0x5d, 0xf6, 0x17, 0x6a, 0x90, 0x61, 0x1e, - 0x82, 0x04, 0x98, 0xd4, 0xb0, 0x69, 0x72, 0x92, 0x39, 0x28, 0xee, 0x90, - 0xba, 0xcf, 0xd8, 0x80, 0x4a, 0xc9, 0x1b, 0x0b, 0xdd, 0xc7, 0xd0, 0x8d, - 0x27, 0x67, 0x93, 0xbb, 0x74, 0x76, 0x99, 0x59, 0x6c, 0x35, 0x3b, 0x41, - 0x2e, 0x90, 0x12, 0x7c, 0xe6, 0x96, 0x91, 0xcd, 0x3b, 0xff, 0xd3, 0xc3, - 0xeb, 0x52, 0x2e, 0x73, 0x9f, 0x63, 0x7f, 0x9a, 0x08, 0xde, 0xd8, 0x3a, - 0x6a, 0x51, 0xc4, 0x0e, 0x08, 0x72, 0x8f, 0xf6, 0x65, 0xd7, 0x01, 0x69, - 0xb2, 0x3d, 0x62, 0xdd, 0x0b, 0x41, 0x80, 0x32, 0x05, 0xde, 0x03, 0x69, - 0xcd, 0x18, 0x1f, 0xc5, 0x5c, 0x17, 0x87, 0xdd, 0xb9, 0xae, 0xf8, 0xb0, - 0x1b, 0x86, 0x36, 0x93, 0xb8, 0x74, 0x59, 0x0a, 0xb1, 0xfd, 0xc9, 0x31, - 0x29, 0x28, 0x80, 0xba, 0xef, 0x90, 0xe7, 0x2d, 0x73, 0x4f, 0xe9, 0x0b, - 0x66, 0x95, 0xca, 0xa9, 0xec, 0xf1, 0xaa, 0x39, 0x31, 0xca, 0x2f, 0xe0, - 0xbf, 0xd5, 0xf1, 0x47, 0xe6, 0xe1, 0xde, 0xb3, 0xc7, 0x4d, 0x16, 0x4b, - 0xd9, 0x85, 0xc1, 0xde, 0x10, 0x7d, 0x1c, 0xa6, 0x95, 0x70, 0x93, 0x82, - 0xb4, 0xb6, 0xa9, 0xa5, 0x50, 0x64, 0x4b, 0x28, 0xaf, 0x65, 0x30, 0xde, - 0x1e, 0x72, 0xa6, 0x8d, 0xa4, 0x06, 0x28, 0x57, 0xd7, 0x27, 0x86, 0x0a, - 0xb8, 0xf1, 0x53, 0x79, 0x2b, 0xd0, 0xcb, 0x2f, 0xf0, 0x88, 0x0b, 0x99, - 0x9a, 0xd5, 0x56, 0x6a, 0x06, 0x96, 0xc0, 0xd8, 0x39, 0xdd, 0x05, 0x25, - 0x00, 0x58, 0x99, 0x83, 0x07, 0x7a, 0x76, 0xf4, 0xcc, 0xd6, 0x3c, 0xc5, - 0x14, 0xfb, 0xe8, 0x00, 0x87, 0xc3, 0x14, 0x19, 0x46, 0xb9, 0x12, 0x5e, - 0x1d, 0xc3, 0xfa, 0xb7, 0x76, 0x15, 0xd2, 0xd7, 0xcd, 0x34, 0x28, 0xba, - 0x7b, 0x83, 0x82, 0x47, 0xbe, 0xdf, 0x91, 0x16, 0x66, 0x6d, 0x18, 0x6a, - 0xa9, 0xf7, 0xe2, 0x18, 0xab, 0x53, 0x6b, 0x38, 0x53, 0x18, 0x34, 0xd8, - 0xe1, 0xab, 0xf4, 0x9c, 0x34, 0x56, 0x7c, 0x17, 0x77, 0xa9, 0xb2, 0x36, - 0x6e, 0x93, 0xe0, 0xb5, 0x6d, 0x86, 0x11, 0x6a, 0x92, 0xe4, 0x69, 0x2e, - 0x1f, 0x1f, 0xf7, 0xdf, 0x4f, 0x5e, 0x95, 0x78, 0xd2, 0x4e, 0x9b, 0xfc, - 0xb4, 0xfe, 0x64, 0x62, 0x32, 0x6c, 0x74, 0x6c, 0x42, 0xee, 0x5e, 0xa9, - 0x0f, 0x49, 0xef, 0xad, 0x74, 0x53, 0x32, 0x00, 0xc7, 0x45, 0x1d, 0x1c, - 0xe1, 0x18, 0x4b, 0xd1, 0x5c, 0x71, 0x19, 0x55, 0xa2, 0x38, 0xa8, 0xc2, - 0x11, 0x30, 0xb5, 0xf3, 0x7d, 0x06, 0xd5, 0x15, 0x4c, 0x59, 0x3c, 0xea, - 0x4a, 0x7a, 0xa2, 0x06, 0x43, 0xf9, 0x13, 0xcf, 0x3b, 0x08, 0x18, 0xc6, - 0x05, 0x2e, 0xa6, 0x30, 0x45, 0x0d, 0x6c, 0x81, 0x1f, 0x81, 0x8c, 0x41, - 0x06, 0xe4, 0xf6, 0xb4, 0x70, 0xba, 0x8a, 0x4b, 0x46, 0x33, 0xb6, 0x32, - 0x3d, 0x03, 0x5a, 0x0a, 0x52, 0x68, 0xcc, 0x9e, 0xa5, 0xc6, 0xbb, 0x09, - 0x7c, 0x1d, 0xb3, 0xd2, 0xf7, 0xec, 0xa1, 0x65, 0xfd, 0xca, 0xec, 0xa2, - 0x51, 0xfa, 0xe7, 0x9f, 0x23, 0x82, 0xc2, 0x8b, 0x5a, 0x8b, 0xf2, 0x2a, - 0xea, 0x71, 0xa4, 0xbd, 0xfd, 0xf9, 0x94, 0x4e, 0x8a, 0xe0, 0x69, 0x71, - 0x95, 0xc9, 0x6e, 0x2b, 0xad, 0x4f, 0x25, 0xaa, 0x08, 0x88, 0xcf, 0x3f, - 0x0c, 0xa8, 0xe2, 0x93, 0xea, 0xc7, 0xc7, 0x2f, 0x96, 0xe6, 0x2b, 0x6c, - 0x92, 0xc2, 0xa4, 0xd2, 0x7c, 0xa9, 0x8a, 0x22, 0xb0, 0x03, 0x3d, 0xb6, - 0xed, 0x03, 0x2e, 0x64, 0x9c, 0x73, 0x52, 0xe6, 0x0a, 0xd4, 0xe6, 0x32, - 0xff, 0x4c, 0x2b, 0xc8, 0x44, 0xe6, 0xdf, 0x6b, 0x9c, 0x56, 0xc6, 0x6a, - 0x5b, 0x52, 0x48, 0x0d, 0x8c, 0xba, 0x9a, 0x17, 0x52, 0x09, 0x67, 0xaa, - 0x47, 0x7a, 0xdc, 0x80, 0x6b, 0x42, 0xf0, 0xb7, 0x15, 0x77, 0x75, 0xc7, - 0x07, 0xa1, 0x5a, 0xb5, 0x94, 0x98, 0x03, 0x1b, 0x90, 0x15, 0x6b, 0xdc, - 0x5c, 0x4a, 0x63, 0x86, 0xd4, 0xa4, 0xe4, 0xd9, 0xd4, 0xdd, 0x25, 0xcf, - 0x41, 0x87, 0x6f, 0x01, 0x4b, 0xa9, 0x32, 0xc4, 0x63, 0xfc, 0xa8, 0x45, - 0x18, 0xe2, 0x1f, 0x46, 0x02, 0x08, 0x9f, 0x73, 0x8d, 0x5e, 0xf9, 0x4b, - 0x35, 0x94, 0x97, 0xb7, 0x6a, 0xef, 0x2a, 0xd0, 0x4f, 0x68, 0x69, 0x2e, - 0x35, 0x43, 0x0f, 0xaf, 0x51, 0x58, 0x80, 0xf5, 0x69, 0x5f, 0xb3, 0x75, - 0xd1, 0x53, 0x9c, 0xff, 0x27, 0x01, 0x51, 0x20, 0x3e, 0x7f, 0x16, 0xa8, - 0xaa, 0xa4, 0x4a, 0x13, 0x97, 0x2f, 0xb7, 0x35, 0xe9, 0x01, 0x48, 0x54, - 0x54, 0x0e, 0xa3, 0x69, 0xe9, 0x5e, 0x70, 0x1c, 0x7b, 0xf7, 0xa9, 0xeb, - 0x12, 0x93, 0x58, 0x5d, 0xb0, 0xb0, 0x4f, 0x5f, 0x2d, 0x2f, 0xa0, 0x19, - 0x57, 0x46, 0xa0, 0x52, 0x66, 0xb8, 0x50, 0xeb, 0x5f, 0xb0, 0x04, 0x18, - 0x9b, 0xa8, 0xb7, 0xf6, 0xec, 0xbb, 0x35, 0xdb, 0x90, 0xbc, 0xd2, 0x87, - 0xc4, 0xe7, 0xc6, 0xe9, 0x5f, 0x5f, 0x2f, 0x5f, 0x55, 0x99, 0x21, 0x47, - 0xf8, 0xf5, 0x21, 0xa1, 0x6f, 0xcb, 0xf4, 0x18, 0xfc, 0xaa, 0x76, 0x69, - 0x71, 0xd8, 0x71, 0x3f, 0x73, 0x32, 0x15, 0x34, 0x1c, 0xa6, 0xaa, 0x4d, - 0x26, 0xd3, 0x06, 0xe1, 0xf1, 0xa2, 0x0e, 0xf8, 0x12, 0xaa, 0x85, 0xde, - 0xc0, 0x84, 0x4d, 0x10, 0x8a, 0xc4, 0xd8, 0x75, 0x2a, 0x27, 0x31, 0x90, - 0xf6, 0xcd, 0x34, 0xf1, 0x22, 0x25, 0x3c, 0x76, 0x73, 0x71, 0xc4, 0x49, - 0xeb, 0x34, 0x5e, 0x31, 0x7e, 0x4b, 0x88, 0x8c, 0xa6, 0xf7, 0x2f, 0x12, - 0xe8, 0x8b, 0x31, 0xc2, 0xa4, 0x34, 0xd1, 0xea, 0x99, 0xa5, 0xfc, 0x7a, - 0x04, 0xa6, 0x6e, 0x9d, 0x2d, 0x83, 0x2a, 0x66, 0x47, 0x23, 0xba, 0x0a, - 0xf2, 0x9b, 0x7c, 0x51, 0x08, 0xec, 0xad, 0xdd, 0x07, 0x8f, 0x2d, 0x99, - 0xda, 0xe4, 0xaa, 0x3f, 0x01, 0x79, 0x77, 0xd0, 0x58, 0x63, 0x8f, 0x2c, - 0x75, 0x78, 0x98, 0x4b, 0xc4, 0x02, 0x8d, 0x06, 0x7c, 0x79, 0xe1, 0x84, - 0x39, 0x67, 0x02, 0xb2, 0x49, 0xfb, 0x9e, 0x63, 0x7c, 0xa1, 0x23, 0xea, - 0xe3, 0xe6, 0xb0, 0x19, 0x07, 0x5c, 0x26, 0x7b, 0x25, 0x85, 0x62, 0x68, - 0x9c, 0x54, 0x03, 0x95, 0x7e, 0x75, 0x87, 0x7b, 0x02, 0xb8, 0xb4, 0xe2, - 0x3c, 0xd1, 0x44, 0x9f, 0x48, 0xd0, 0xd5, 0x25, 0xea, 0x67, 0x46, 0xc0, - 0x88, 0x91, 0xda, 0xbb, 0x66, 0x55, 0x3a, 0xc4, 0x02, 0xec, 0xdf, 0xeb, - 0xad, 0x3b, 0x06, 0x79, 0x4a, 0x75, 0x4d, 0xfa, 0xe3, 0x7a, 0x82, 0x7c, - 0x9b, 0xf0, 0xf8, 0x2f, 0x96, 0xce, 0x4d, 0x29, 0x80, 0xab, 0x28, 0x93, - 0x1d, 0x09, 0x1d, 0x49, 0x40, 0x17, 0xc5, 0x3d, 0x34, 0x3a, 0xdf, 0xd5, - 0xe3, 0xcd, 0x69, 0xef, 0x2d, 0x17, 0xe6, 0xab, 0x43, 0x60, 0xa4, 0x7c, - 0xfe, 0x69, 0x55, 0xd9, 0x5c, 0xb7, 0xad, 0x5a, 0x28, 0x60, 0xf4, 0x30, - 0xe0, 0xb2, 0xac, 0xa2, 0x1b, 0x70, 0x82, 0x8b, 0x43, 0x9d, 0xaf, 0x96, - 0x99, 0xd2, 0xb9, 0xd3, 0x58, 0x49, 0xba, 0xa9, 0x4b, 0x10, 0x1d, 0xbe, - 0x39, 0x35, 0x55, 0x13, 0xa5, 0x95, 0xf2, 0x38, 0x40, 0xa8, 0xc5, 0x75, - 0xb4, 0x36, 0xe6, 0x7a, 0x0c, 0x5c, 0x11, 0x6a, 0x0a, 0xb6, 0xbd, 0x3c, - 0x6f, 0x00, 0xb7, 0x1b, 0x17, 0xc8, 0x97, 0x16, 0x7e, 0x02, 0xad, 0x9e, - 0xa3, 0xd4, 0x58, 0xee, 0x05, 0xbe, 0xbc, 0x35, 0xda, 0x69, 0xeb, 0x91, - 0xab, 0xf1, 0x2d, 0xc2, 0x45, 0xe8, 0x88, 0xcc, 0x9d, 0x50, 0xed, 0x12, - 0xe0, 0x93, 0x5a, 0xab, 0x2b, 0x6d, 0x99, 0x40, 0xa6, 0x4b, 0x67, 0xd1, - 0xdb, 0x60, 0x3d, 0x7e, 0xad, 0xf2, 0xff, 0xac, 0xb9, 0x87, 0x1f, 0x5d, - 0x77, 0x8d, 0xa9, 0x5c, 0x07, 0x01, 0x34, 0x0a, 0xd9, 0x09, 0x76, 0x2c, - 0xf3, 0x7f, 0x68, 0xc9, 0xf7, 0x78, 0xd3, 0xd4, 0x63, 0x81, 0xf2, 0x48, - 0x63, 0x02, 0x8c, 0x58, 0x47, 0xb0, 0xbd, 0x4e, 0x75, 0xe1, 0xf6, 0xf1, - 0x53, 0xee, 0xae, 0xf6, 0x23, 0x94, 0xe5, 0xd4, 0xb5, 0xd6, 0xc6, 0x3e, - 0x09, 0xc6, 0x33, 0x35, 0x52, 0xb4, 0x35, 0x3f, 0xfd, 0x8b, 0xb9, 0xb2, - 0x1e, 0xac, 0x1c, 0x05, 0x5f, 0xc1, 0xb9, 0xc7, 0x26, 0x4a, 0x81, 0x91, - 0xe6, 0xc2, 0xb6, 0xd0, 0x00, 0x25, 0x9e, 0x8d, 0xc2, 0x18, 0xc0, 0x29, - 0x6e, 0x10, 0x74, 0x00, 0x3f, 0xe0, 0x56, 0xb5, 0x8d, 0xad, 0xab, 0x31, - 0x47, 0x32, 0xa3, 0x63, 0xaf, 0x09, 0x69, 0x5b, 0x7c, 0x95, 0xa9, 0xa3, - 0x5c, 0xff, 0x84, 0x54, 0xec, 0x7f, 0xca, 0xc6, 0xcf, 0x81, 0x3c, 0xa4, - 0x5a, 0x9d, 0xd7, 0x68, 0x70, 0x1f, 0x78, 0xc9, 0xbc, 0x15, 0x43, 0x52, - 0xbf, 0x0b, 0xab, 0xe3, 0x50, 0xbe, 0x3b, 0xb2, 0x0a, 0x53, 0x20, 0x55, - 0x34, 0x97, 0x57, 0x5c, 0xc7, 0x39, 0x61, 0xb0, 0xdc, 0x9f, 0x5b, 0x9a, - 0xe6, 0x3f, 0xd3, 0x27, 0xcd, 0x04, 0x59, 0x7e, 0xa5, 0xee, 0xa5, 0x52, - 0x55, 0x6a, 0x8b, 0x55, 0x8b, 0x86, 0x36, 0x35, 0x9c, 0x15, 0x8d, 0x1e, - 0x9a, 0xad, 0x07, 0x54, 0x41, 0xb9, 0x11, 0x49, 0xf2, 0xdd, 0x68, 0xa1, - 0x69, 0x03, 0x85, 0xd5, 0x41, 0xc8, 0x12, 0x13, 0x87, 0x80, 0x88, 0xd4, - 0xaf, 0x60, 0x8d, 0xd8, 0xfa, 0x88, 0x7e, 0xf7, 0x2d, 0xbe, 0x23, 0x14, - 0x16, 0xcf, 0x38, 0xca, 0xf3, 0x06, 0xd0, 0xa6, 0x60, 0x9b, 0x0b, 0xe2, - 0x37, 0xdc, 0x02, 0xae, 0xb8, 0xdc, 0x67, 0x37, 0xa8, 0xac, 0xd6, 0x64, - 0x76, 0xb8, 0xe3, 0x4f, 0x59, 0xb2, 0xa3, 0xdf, 0xb9, 0xc8, 0x68, 0x5c, - 0xe3, 0xee, 0x4d, 0xf7, 0x21, 0x3f, 0x7e, 0xcc, 0x59, 0x52, 0xfd, 0x37, - 0x1f, 0x50, 0x3d, 0x1f, 0xfe, 0xce, 0x85, 0xb4, 0xa9, 0x83, 0x65, 0x3d, - 0x66, 0x9f, 0x52, 0x3e, 0x28, 0x6d, 0x50, 0xf7, 0x62, 0x17, 0x6f, 0xb1, - 0xa2, 0xb5, 0x07, 0xbd, 0xc6, 0x53, 0xc1, 0x11, 0xac, 0x06, 0x9b, 0xaf, - 0x96, 0x65, 0xd0, 0xea, 0x6b, 0x61, 0x4f, 0xc5, 0xc0, 0x2e, 0xeb, 0x35, - 0xd7, 0xce, 0x4f, 0x2d, 0xdd, 0xa8, 0x26, 0xfb, 0x70, 0x37, 0x03, 0x82, - 0x14, 0x54, 0x71, 0x95, 0xa5, 0x19, 0x7b, 0xaf, 0x25, 0x15, 0x90, 0x60, - 0x6b, 0xa8, 0xea, 0x60, 0x75, 0x8e, 0x7f, 0x03, 0xf7, 0x92, 0xdf, 0x90, - 0xf3, 0x21, 0x9f, 0xdb, 0x8c, 0xb2, 0xf9, 0x40, 0xd4, 0x07, 0xef, 0xf8, - 0x4d, 0x29, 0xf9, 0x7b, 0xc9, 0x5b, 0x34, 0x2b, 0xdf, 0x7c, 0x0a, 0xfb, - 0x89, 0x9f, 0x0f, 0x93, 0xff, 0x55, 0xeb, 0x08, 0xf6, 0xdf, 0xdd, 0x0d, - 0x6f, 0x2a, 0x51, 0xb4, 0xb2, 0x6d, 0xa7, 0x9c, 0xeb, 0x9b, 0xf1, 0x4c, - 0xce, 0x99, 0xae, 0xfc, 0xa1, 0xb0, 0xb7, 0x20, 0xee, 0x59, 0x18, 0xc8, - 0x52, 0xcb, 0x1e, 0xf8, 0x6f, 0x85, 0x46, 0x56, 0x3a, 0x14, 0x28, 0x33, - 0xd1, 0x40, 0xcf, 0x25, 0x4a, 0x51, 0xed, 0xba, 0x8c, 0xb0, 0x49, 0x01, - 0xab, 0x45, 0x0c, 0xbb, 0xc0, 0x0a, 0xc1, 0xc3, 0xf2, 0x1d, 0x1f, 0x43, - 0x40, 0x48, 0xaf, 0xd5, 0x0e, 0x6b, 0xe1, 0x39, 0x28, 0xa3, 0xab, 0x2d, - 0x3a, 0x2a, 0x5a, 0x3b, 0xb2, 0xe5, 0xf5, 0x5a, 0x2c, 0xb0, 0x73, 0x7b, - 0x66, 0xe1, 0x36, 0x9f, 0xe6, 0x81, 0xf8, 0x46, 0x31, 0xb0, 0xd1, 0xd5, - 0xf9, 0x84, 0x80, 0xa3, 0x8a, 0x66, 0x6d, 0x06, 0xf6, 0x5b, 0x70, 0x53, - 0x7c, 0x91, 0x8b, 0xd1, 0x58, 0x01, 0x8e, 0xb1, 0x22, 0xe2, 0x53, 0x60, - 0xe6, 0xf9, 0xdc, 0x90, 0x75, 0xd0, 0x63, 0x42, 0xb2, 0x11, 0x8b, 0xd6, - 0x83, 0xdd, 0x5d, 0xb8, 0x17, 0x33, 0x20, 0x54, 0x69, 0xb9, 0x7f, 0xc6, - 0x19, 0x44, 0x97, 0x90, 0x63, 0x10, 0xff, 0xc6, 0x16, 0x0a, 0x8e, 0xc6, - 0xb2, 0xa8, 0x39, 0x63, 0x92, 0x5d, 0x0b, 0xce, 0xb5, 0x50, 0x0a, 0xa8, - 0xb3, 0x83, 0x9e, 0x47, 0x73, 0x5b, 0x29, 0x24, 0x43, 0x42, 0xd3, 0x93, - 0xf2, 0xea, 0x55, 0x58, 0x5f, 0x33, 0x0a, 0xc6, 0x72, 0xcf, 0xa4, 0x1d, - 0x21, 0x83, 0x5a, 0xaa, 0xcc, 0x9e, 0xee, 0x40, 0x19, 0xd9, 0xc7, 0x43, - 0x0f, 0x29, 0xa9, 0x3c, 0xac, 0x50, 0x83, 0xa9, 0x1e, 0xaa, 0x2c, 0x11, - 0x55, 0x13, 0xcd, 0xbf, 0x0b, 0x99, 0xa8, 0xee, 0x86, 0x23, 0x11, 0x40, - 0x51, 0xd4, 0xf0, 0xe3, 0x79, 0xa1, 0x00, 0x1d, 0x10, 0x90, 0x8e, 0x52, - 0xad, 0xf0, 0x41, 0x27, 0x72, 0x1c, 0x59, 0xc7, 0xa2, 0x26, 0xd3, 0x59, - 0x62, 0x31, 0xbf, 0xc6, 0x92, 0x85, 0x43, 0x14, 0x20, 0xbb, 0x7c, 0x56, - 0x58, 0xfb, 0x48, 0x31, 0x83, 0xb4, 0x20, 0xd7, 0x7d, 0x89, 0x7c, 0x55, - 0x1d, 0x24, 0x7c, 0xc6, 0x01, 0x98, 0x14, 0x37, 0xef, 0x04, 0xb2, 0x23, - 0xc1, 0xf8, 0xb0, 0x2e, 0x14, 0xeb, 0x0c, 0x9e, 0x87, 0x38, 0xe6, 0xeb, - 0x44, 0xa6, 0x60, 0x87, 0xd2, 0x22, 0xe6, 0x79, 0xee, 0x72, 0x86, 0x34, - 0xed, 0x01, 0xf2, 0xde, 0xc0, 0x5e, 0xaa, 0x77, 0xde, 0x3d, 0xe4, 0xb3, - 0x69, 0x5f, 0x9e, 0x00, 0x17, 0x2c, 0xd3, 0xf6, 0x76, 0x32, 0x97, 0x0f, - 0x66, 0x47, 0xac, 0xfa, 0x50, 0xe0, 0x66, 0x43, 0x5f, 0xb1, 0x8b, 0xee, - 0x08, 0x1a, 0x4f, 0x33, 0x9f, 0xd1, 0x35, 0x99, 0x1c, 0x0b, 0x22, 0xf7, - 0x8c, 0x45, 0xc5, 0x1b, 0x3a, 0xf2, 0x15, 0x8d, 0x70, 0xde, 0xbb, 0x61, - 0x07, 0xf0, 0x90, 0xb2, 0x79, 0x4b, 0xe3, 0xf8, 0x01, 0x55, 0x2a, 0xbd, - 0x49, 0xaf, 0x5c, 0x35, 0xfc, 0xc1, 0xcb, 0x82, 0x0b, 0x04, 0x21, 0xcc, - 0x2a, 0x2a, 0xb3, 0xb2, 0x23, 0x2d, 0x03, 0xd4, 0x9d, 0x1e, 0xf4, 0xd9, - 0x5e, 0xd2, 0x26, 0x89, 0x0d, 0x66, 0xa2, 0x7e, 0xe3, 0x50, 0x50, 0x27, - 0x4a, 0x97, 0x98, 0x98, 0xfe, 0x40, 0x00, 0xe6, 0x80, 0x5d, 0xf2, 0xa9, - 0x51, 0xdb, 0x19, 0x5c, 0x07, 0xd3, 0xf7, 0x5c, 0x90, 0x29, 0xdd, 0x11, - 0x01, 0xf7, 0x50, 0xd8, 0x3a, 0xa6, 0x2e, 0x6d, 0x79, 0xda, 0x67, 0xa1, - 0x36, 0x5c, 0xba, 0x5e, 0x47, 0xda, 0x15, 0x31, 0x45, 0xd9, 0x94, 0x03, - 0xc3, 0xf0, 0xaf, 0x69, 0x2d, 0x35, 0xec, 0x59, 0x5d, 0xee, 0xa9, 0xfb, - 0x3e, 0x05, 0x0a, 0xd9, 0x42, 0x1f, 0xcb, 0x80, 0xb6, 0x7d, 0x47, 0xf1, - 0x0a, 0xeb, 0xb7, 0x8e, 0x6e, 0x44, 0x75, 0xef, 0x16, 0x93, 0xa6, 0x95, - 0x73, 0x2e, 0xce, 0x89, 0xc9, 0x21, 0xa2, 0x14, 0xe7, 0xae, 0x69, 0x22, - 0xc9, 0x38, 0x19, 0x3a, 0x23, 0x1d, 0xfd, 0x06, 0x79, 0xae, 0x5c, 0xf7, - 0x1d, 0x8b, 0x4f, 0xb0, 0xd2, 0xab, 0x2b, 0xd1, 0xf3, 0xd8, 0x66, 0x94, - 0x30, 0x8c, 0x13, 0x3e, 0x2c, 0xe0, 0x1d, 0x71, 0x7f, 0x77, 0xa1, 0xb0, - 0xa1, 0x05, 0x0b, 0xd2, 0x03, 0x63, 0xe4, 0x18, 0x5e, 0x1a, 0x00, 0xfa, - 0x7f, 0x28, 0x69, 0x87, 0x4a, 0x56, 0xfa, 0x98, 0x16, 0x89, 0x07, 0xad, - 0x2b, 0x35, 0x56, 0xb2, 0x84, 0x33, 0x19, 0x7e, 0x9e, 0x75, 0x63, 0xda, - 0x63, 0x52, 0x5b, 0x4d, 0xbc, 0xcb, 0x4f, 0xca, 0xb6, 0x03, 0xc0, 0x3e, - 0x9f, 0xa9, 0x86, 0xee, 0xdd, 0x6c, 0x20, 0x84, 0x12, 0x11, 0x81, 0x0d, - 0x93, 0x4e, 0x57, 0x78, 0x6d, 0x06, 0x71, 0x6a, 0xa8, 0x0b, 0x32, 0x67, - 0x7a, 0xd5, 0x00, 0xf2, 0xc0, 0xd0, 0xe7, 0xc9, 0xf9, 0x2b, 0x15, 0x41, - 0x97, 0x81, 0xbd, 0x63, 0xec, 0xde, 0x70, 0x6f, 0x88, 0xf1, 0xd2, 0xf4, - 0xc1, 0xce, 0xb2, 0x34, 0x20, 0x69, 0x4e, 0x61, 0x10, 0xec, 0x07, 0xce, - 0x43, 0x54, 0x54, 0x12, 0x85, 0xd8, 0xdd, 0x49, 0x31, 0x9f, 0x4b, 0xc9, - 0x48, 0xa3, 0x5c, 0xe0, 0xbf, 0x62, 0xfe, 0xea, 0xaf, 0xd5, 0x63, 0x6a, - 0xf3, 0xe2, 0x0b, 0x0d, 0x88, 0x3d, 0x14, 0x25, 0x53, 0x81, 0x5a, 0x1d, - 0x97, 0xc7, 0xb8, 0x07, 0x9f, 0x74, 0xf6, 0x8e, 0x48, 0x57, 0xbf, 0x74, - 0x22, 0x7e, 0xb2, 0x20, 0x9d, 0x83, 0x9e, 0xfa, 0x6e, 0x3b, 0x67, 0x38, - 0x38, 0xa8, 0x52, 0x13, 0x49, 0xbf, 0x24, 0x26, 0x93, 0x06, 0x31, 0x49, - 0xa5, 0xad, 0x51, 0x99, 0x9d, 0xdc, 0x47, 0x78, 0x60, 0x8a, 0xc2, 0x2e, - 0x05, 0xda, 0xc9, 0x1a, 0x88, 0xa3, 0x32, 0x74, 0xcc, 0xcf, 0x56, 0xe3, - 0x7a, 0xc1, 0x00, 0xe6, 0x4d, 0xd4, 0x79, 0xbd, 0x3f, 0xa2, 0x4a, 0x89, - 0xa3, 0xf6, 0x52, 0xf7, 0x0e, 0x16, 0x3f, 0x39, 0x64, 0x10, 0xc2, 0x37, - 0xf0, 0x03, 0x2c, 0x02, 0x30, 0x7c, 0x1a, 0x9f, 0x7e, 0x8e, 0x01, 0xb1, - 0xce, 0x20, 0x00, 0x40, 0x59, 0x52, 0x73, 0x33, 0xd4, 0x5b, 0xa6, 0x0b, - 0x06, 0x04, 0xff, 0xf6, 0x67, 0x51, 0x32, 0x4e, 0x0a, 0xf0, 0x36, 0x8b, - 0x88, 0x8a, 0x2d, 0xad, 0x45, 0xb7, 0xa9, 0xa5, 0x08, 0x9e, 0xb5, 0xc3, - 0x90, 0x83, 0x1f, 0xd8, 0x58, 0x8e, 0x6d, 0x8c, 0x91, 0x73, 0xd1, 0x9f, - 0x0a, 0xf5, 0x6c, 0x67, 0x20, 0x66, 0xa8, 0x59, 0xb7, 0x08, 0x2c, 0x3a, - 0x9a, 0x77, 0xe7, 0x4b, 0x05, 0x58, 0x8e, 0x08, 0x80, 0x39, 0x7c, 0x9e, - 0xaa, 0xb9, 0x36, 0xde, 0x25, 0xda, 0x86, 0x81, 0x6b, 0x88, 0x8a, 0x35, - 0x21, 0x60, 0xa3, 0x31, 0x96, 0x8c, 0x5c, 0x12, 0x81, 0xee, 0xee, 0xf6, - 0x22, 0xd8, 0xb5, 0x72, 0xb2, 0x36, 0xd3, 0xf1, 0xce, 0x0f, 0x5e, 0xcc, - 0x05, 0x8a, 0x77, 0x4f, 0x91, 0xa4, 0xbe, 0x9a, 0x92, 0x1f, 0x5c, 0xdc, - 0xc8, 0x00, 0x99, 0xf9, 0xe2, 0x7f, 0x3e, 0x9a, 0x2e, 0xec, 0xf8, 0x08, - 0x36, 0x57, 0x73, 0xdc, 0xbf, 0x54, 0x42, 0xf6, 0x85, 0x79, 0xe6, 0x1a, - 0x52, 0x4c, 0x3f, 0x03, 0xeb, 0x5c, 0x68, 0x2a, 0x5a, 0xa4, 0x5b, 0xd2, - 0x59, 0x7c, 0xa9, 0xdc, 0xca, 0x60, 0x17, 0xf4, 0x2b, 0xd6, 0xd5, 0x6d, - 0x21, 0x4a, 0x21, 0xa2, 0x6c, 0x76, 0xa6, 0xa7, 0xff, 0x17, 0xab, 0x92, - 0x91, 0x6f, 0x63, 0x5f, 0xc6, 0xdf, 0x7b, 0xc9, 0x5a, 0xa7, 0x73, 0x34, - 0x56, 0xfc, 0x66, 0x12, 0xba, 0x8b, 0x95, 0x79, 0x82, 0xb9, 0x14, 0x82, - 0x51, 0xbf, 0x82, 0x1a, 0x62, 0x7a, 0x85, 0x32, 0x0b, 0x2f, 0x2e, 0xd6, - 0x0d, 0x9f, 0xe2, 0xf8, 0xde, 0x3c, 0x64, 0x36, 0x65, 0x6e, 0x1d, 0x7d, - 0x78, 0xb6, 0x74, 0x7b, 0x38, 0xb5, 0x8b, 0xe6, 0x02, 0x59, 0xbf, 0x57, - 0xd6, 0xc4, 0x24, 0x2f, 0x81, 0x92, 0x93, 0xa5, 0xe9, 0x83, 0xa3, 0x7b, - 0x78, 0x53, 0x6c, 0x84, 0x6e, 0x73, 0x06, 0x42, 0xea, 0x6c, 0x8a, 0x19, - 0x89, 0x65, 0xb7, 0x56, 0xe3, 0x09, 0x3a, 0x2e, 0x8e, 0xe8, 0x1f, 0x97, - 0x91, 0x5b, 0xfb, 0x17, 0x8c, 0x0c, 0x53, 0x9d, 0x17, 0x47, 0x27, 0xc3, - 0x15, 0xd7, 0x02, 0x21, 0x20, 0xf5, 0x0d, 0x7e, 0xd0, 0x4d, 0x9b, 0xce, - 0xea, 0x4f, 0x57, 0x20, 0x81, 0x2a, 0x0f, 0x74, 0x45, 0x70, 0x6b, 0xdb, - 0xee, 0x1c, 0x39, 0x57, 0xd2, 0x8c, 0xe1, 0x4e, 0xc2, 0xfe, 0x06, 0x0d, - 0xaf, 0x47, 0xe8, 0x5e, 0x59, 0x6b, 0xd1, 0x0b, 0x31, 0xc6, 0xb7, 0xc3, - 0x7c, 0xcf, 0x63, 0x7b, 0xdd, 0xbb, 0x6c, 0x87, 0xba, 0x06, 0x36, 0x31, - 0x69, 0xed, 0xc3, 0x56, 0x11, 0xe8, 0xf9, 0x8d, 0x8e, 0xff, 0xbc, 0xd6, - 0xcd, 0xb4, 0x59, 0x66, 0x90, 0xe4, 0x88, 0x49, 0x80, 0xb8, 0x6f, 0x06, - 0xcb, 0xc7, 0xaf, 0xb3, 0x05, 0x6a, 0x81, 0x3f, 0x23, 0xd5, 0x1f, 0xd2, - 0xdc, 0x22, 0x75, 0x80, 0x93, 0x07, 0x31, 0x62, 0x40, 0x2f, 0xb3, 0xee, - 0x7b, 0x5e, 0x7f, 0xb5, 0x6c, 0xe4, 0xe1, 0x26, 0x2f, 0x40, 0xfd, 0x7c, - 0xc3, 0x9a, 0xb5, 0x60, 0xe0, 0xe1, 0x75, 0x5e, 0x7a, 0xc2, 0xbe, 0xc3, - 0x81, 0x0a, 0x76, 0x6b, 0x8e, 0xba, 0x45, 0xa5, 0x9f, 0x2a, 0x40, 0x90, - 0x2b, 0x3d, 0x31, 0xbe, 0x88, 0x66, 0x08, 0xe6, 0x77, 0xc8, 0x96, 0x71, - 0x12, 0x0b, 0x1c, 0x71, 0x89, 0x05, 0x15, 0xe3, 0x42, 0xb1, 0xf9, 0xb6, - 0xab, 0xb4, 0x6e, 0x5c, 0xb4, 0x1c, 0xe1, 0xef, 0xd2, 0x09, 0x95, 0x04, - 0x67, 0x52, 0x58, 0x0d, 0xd3, 0x91, 0xd0, 0x33, 0xcd, 0x58, 0x66, 0xc6, - 0x2b, 0x15, 0xdc, 0xb3, 0x1f, 0x14, 0xf5, 0xc3, 0x6b, 0x92, 0x2e, 0x46, - 0x0f, 0xdf, 0xa0, 0x32, 0xa8, 0x18, 0x92, 0x6d, 0x51, 0xe6, 0xc3, 0xc3, - 0xd2, 0x0e, 0x27, 0x67, 0xef, 0xe8, 0x46, 0x2a, 0xd9, 0x29, 0xfa, 0x92, - 0x7c, 0xec, 0xa3, 0x80, 0x88, 0x0b, 0x76, 0xeb, 0x1e, 0x8a, 0x7e, 0x4d, - 0x83, 0x84, 0xd2, 0x98, 0x87, 0x5b, 0x69, 0x13, 0x5a, 0x36, 0x6d, 0x7f, - 0x05, 0xf2, 0x9b, 0x38, 0x91, 0x7c, 0x7a, 0xb9, 0xfb, 0x85, 0x64, 0xb3, - 0x7c, 0x07, 0xcc, 0xb2, 0xcb, 0x40, 0x01, 0xff, 0x1f, 0xbd, 0xf9, 0x87, - 0x2e, 0x07, 0x46, 0x74, 0x53, 0xc5, 0xe6, 0xe8, 0xaf, 0xb7, 0x05, 0x53, - 0x98, 0x57, 0xfa, 0x3a, 0x70, 0xb7, 0xec, 0xe4, 0xe1, 0x1c, 0x0a, 0xa2, - 0xba, 0x8d, 0x5d, 0xbc, 0xc0, 0xf2, 0x74, 0x9e, 0x1f, 0x19, 0x82, 0x4b, - 0x6e, 0xd1, 0x37, 0x6c, 0x67, 0x5b, 0xe7, 0x72, 0xbc, 0x46, 0xab, 0x54, - 0x0f, 0x26, 0x70, 0xce, 0x15, 0x63, 0x37, 0x19, 0x2d, 0xa0, 0x53, 0xa0, - 0x65, 0x34, 0xcb, 0xa0, 0x30, 0x4a, 0x3e, 0x40, 0x73, 0x7e, 0x5c, 0x09, - 0xca, 0x82, 0xf9, 0x5f, 0x4b, 0x76, 0xcb, 0x4d, 0xe5, 0x5c, 0x9d, 0xad, - 0xc2, 0xda, 0x5a, 0xd8, 0xae, 0x47, 0x2f, 0x03, 0xca, 0x04, 0x93, 0x98, - 0x98, 0xcc, 0x72, 0xa9, 0x1d, 0xc1, 0x67, 0xd1, 0x2c, 0x8e, 0x01, 0xe3, - 0xe5, 0x7d, 0xa4, 0x41, 0x7b, 0xb0, 0x61, 0x07, 0x67, 0xb9, 0x62, 0x6e, - 0x6e, 0xef, 0x5d, 0x82, 0x7b, 0xdb, 0x6c, 0xe4, 0xf7, 0x80, 0x48, 0xdb, - 0x01, 0x73, 0x4d, 0x2d, 0xd7, 0xff, 0xe8, 0x88, 0xe6, 0x7a, 0xdd, 0x86, - 0xf5, 0x25, 0x94, 0x89, 0xde, 0x87, 0xca, 0xc7, 0x5f, 0x98, 0x9b, 0xaf, - 0xfe, 0x96, 0x28, 0x76, 0xb9, 0x2a, 0x4d, 0x39, 0x13, 0x0f, 0xdc, 0x62, - 0xb1, 0xc8, 0xf3, 0xcd, 0xdf, 0xca, 0x0f, 0x74, 0x8c, 0x8b, 0xb2, 0xba, - 0x82, 0xe7, 0x90, 0x12, 0x1f, 0xd7, 0x0b, 0x04, 0x77, 0x75, 0xed, 0x6b, - 0x2f, 0xa0, 0x8a, 0xa7, 0x98, 0xc7, 0x3c, 0x11, 0xb7, 0xc5, 0x8a, 0x34, - 0xc3, 0x51, 0xc7, 0x5c, 0xbb, 0xba, 0x6f, 0xb4, 0x21, 0x20, 0xbd, 0x72, - 0x5e, 0xa3, 0x76, 0xbd, 0x63, 0xc7, 0xe2, 0x25, 0x67, 0xe2, 0xde, 0xb8, - 0xd8, 0x3f, 0x69, 0xf9, 0x97, 0x5e, 0x7c, 0x4c, 0xd5, 0x5d, 0x64, 0x50, - 0xac, 0x6c, 0xb8, 0xd1, 0xd8, 0x53, 0x66, 0x38, 0xe2, 0xc3, 0xa2, 0x34, - 0xe7, 0xca, 0x4b, 0x71, 0xf9, 0x1c, 0x21, 0xe9, 0xc5, 0x16, 0xf0, 0xe7, - 0xf1, 0xa5, 0xf0, 0x71, 0xbd, 0xec, 0x8a, 0x05, 0xca, 0x83, 0xdf, 0x1f, - 0xe3, 0x18, 0x3b, 0xae, 0xd7, 0x1f, 0xbf, 0xb8, 0x44, 0xc9, 0xd4, 0xa8, - 0xa0, 0x78, 0xcc, 0xa9, 0xa3, 0x69, 0xc6, 0x11, 0x77, 0x2d, 0x81, 0xb5, - 0x89, 0x50, 0x88, 0x5a, 0xb8, 0xbf, 0xd7, 0xb7, 0xe0, 0x94, 0x7f, 0xc4, - 0xbc, 0x1a, 0x4f, 0xd7, 0x95, 0x0c, 0x00, 0xbd, 0xdb, 0x5b, 0xc5, 0x24, - 0x27, 0xf6, 0x11, 0xed, 0x5f, 0x23, 0x40, 0x11, 0x94, 0xcc, 0xe4, 0xd0, - 0x70, 0xd2, 0xd3, 0xea, 0x7f, 0x7f, 0x86, 0x17, 0x22, 0x5e, 0x55, 0xfb, - 0xb4, 0x01, 0xa5, 0x91, 0x02, 0xac, 0x8f, 0xb0, 0x2d, 0x8d, 0xdf, 0x2f, - 0xf3, 0x73, 0xb3, 0xe0, 0x3f, 0xbc, 0xeb, 0x11, 0xa1, 0xcc, 0x4b, 0xf9, - 0x32, 0x13, 0x95, 0x29, 0x51, 0xcc, 0xc5, 0xd7, 0xd1, 0x28, 0x56, 0xc0, - 0x35, 0xde, 0x05, 0x47, 0x75, 0xa4, 0xae, 0x85, 0x25, 0xc4, 0x07, 0x0d, - 0x1f, 0x79, 0x20, 0x5a, 0x28, 0x14, 0x38, 0xb5, 0xdc, 0x31, 0x55, 0x6a, - 0x00, 0xb2, 0x55, 0xc7, 0x4d, 0x7e, 0x0d, 0xe8, 0xd2, 0xa9, 0x0e, 0xdd, - 0x55, 0x45, 0x31, 0x36, 0xdf, 0x52, 0xcc, 0xfc, 0xca, 0x4b, 0x01, 0x63, - 0xf0, 0xe1, 0x29, 0x7b, 0x40, 0xde, 0x85, 0x32, 0xdc, 0x43, 0x9c, 0x23, - 0x74, 0x7f, 0x93, 0x5d, 0x89, 0x0a, 0x83, 0xff, 0x46, 0xcb, 0x15, 0x74, - 0x67, 0x22, 0xf6, 0x12, 0x85, 0x25, 0x9d, 0x4c, 0x3d, 0x89, 0xdd, 0x7f, - 0x27, 0xb3, 0x46, 0x77, 0x2e, 0x21, 0xea, 0x80, 0x69, 0xbd, 0x2c, 0xd6, - 0x74, 0x53, 0xae, 0xe3, 0x5c, 0x8b, 0x45, 0x45, 0x34, 0xda, 0x94, 0x6f, - 0x24, 0xa3, 0x42, 0xef, 0x06, 0xbd, 0x24, 0x88, 0x80, 0xb5, 0xd6, 0xf9, - 0x73, 0x94, 0x48, 0xaf, 0x8e, 0x48, 0x54, 0x08, 0x39, 0x7e, 0xf2, 0xe1, - 0xd6, 0x3d, 0x77, 0x41, 0x20, 0xe2, 0x51, 0x3a, 0x88, 0x09, 0x3d, 0xc9, - 0xd6, 0xec, 0x7a, 0x14, 0xb0, 0xf8, 0x23, 0x51, 0x54, 0xdb, 0x63, 0x2f, - 0x1e, 0xba, 0x70, 0x8a, 0x63, 0x77, 0xf6, 0xc0, 0xb7, 0xab, 0xd8, 0x9a, - 0x3c, 0x04, 0xf9, 0xd7, 0x0b, 0x11, 0xac, 0xd8, 0xa2, 0x54, 0xd6, 0xb2, - 0x9f, 0xe7, 0x97, 0xf4, 0xce, 0x20, 0x39, 0x71, 0x92, 0xb7, 0xe7, 0xfb, - 0x43, 0x63, 0x28, 0x26, 0x63, 0xc7, 0xbc, 0xf7, 0x39, 0x5a, 0x41, 0xd0, - 0x25, 0x6d, 0x1d, 0x1b, 0x49, 0xb8, 0x34, 0x90, 0x57, 0x35, 0xb8, 0x32, - 0x6d, 0x74, 0x16, 0x71, 0x42, 0x5a, 0xdc, 0x74, 0x78, 0x85, 0xb2, 0xfd, - 0x13, 0x59, 0xee, 0x26, 0x3b, 0x7d, 0x4d, 0x12, 0x3d, 0x14, 0x88, 0xc1, - 0xcc, 0xaf, 0x0d, 0x65, 0xb4, 0x42, 0x19, 0x23, 0xa2, 0x90, 0x49, 0x31, - 0xc3, 0xcc, 0x43, 0x09, 0x4c, 0x47, 0x84, 0xdb, 0xd5, 0xb8, 0x08, 0xbd, - 0x39, 0x6a, 0xe7, 0x46, 0x0a, 0x98, 0xfc, 0xe7, 0xea, 0xb7, 0x3c, 0x6e, - 0xd2, 0x3d, 0xb5, 0x84, 0xb0, 0x7c, 0x84, 0xfe, 0xd0, 0xeb, 0x07, 0x2f, - 0x70, 0x47, 0x95, 0x7a, 0x3b, 0x64, 0xbb, 0xb8, 0x5b, 0x83, 0xce, 0xa8, - 0x49, 0x0f, 0x2d, 0x01, 0xd8, 0x45, 0xa9, 0x59, 0x04, 0xc4, 0x0c, 0xac, - 0x6b, 0x39, 0x6a, 0xd0, 0x78, 0xf4, 0x81, 0xa7, 0xb9, 0xa6, 0x23, 0xb2, - 0xff, 0x93, 0x6c, 0x44, 0x85, 0xf5, 0x1c, 0x60, 0xcd, 0x95, 0xa3, 0x22, - 0x80, 0x9d, 0x90, 0x19, 0xf9, 0x8a, 0xc8, 0x9a, 0x31, 0xcd, 0x0d, 0xa2, - 0x09, 0x3f, 0x4c, 0x2c, 0x2f, 0x3f, 0x20, 0xbb, 0x44, 0xba, 0x8f, 0x73, - 0x5f, 0x40, 0x34, 0x58, 0x1e, 0xda, 0x89, 0x73, 0x48, 0xd3, 0x0a, 0x2c, - 0x8f, 0xa4, 0x02, 0xac, 0xd4, 0x65, 0x76, 0xc2, 0xe7, 0x40, 0x56, 0x68, - 0xf9, 0xe4, 0x67, 0xf3, 0x0a, 0xa2, 0x12, 0x38, 0x6f, 0x26, 0xaf, 0x94, - 0x1b, 0x1e, 0x4c, 0xab, 0x9a, 0x1b, 0x1c, 0xee, 0x60, 0xf6, 0xc8, 0x02, - 0xbe, 0xed, 0xa5, 0x80, 0x4e, 0x43, 0x23, 0xb1, 0xaa, 0x0b, 0xd9, 0xb9, - 0xb9, 0xdd, 0xa5, 0x80, 0xf4, 0x59, 0x33, 0x69, 0x11, 0x11, 0xa2, 0xb2, - 0x72, 0x9e, 0xe0, 0x95, 0x96, 0x9a, 0xfe, 0x62, 0x64, 0x72, 0x9a, 0x2b, - 0x6b, 0xbf, 0x41, 0x11, 0xc0, 0x4a, 0x7b, 0x44, 0xaf, 0xc4, 0x76, 0xb0, - 0x44, 0x94, 0xd4, 0xf7, 0x81, 0xaa, 0xd2, 0x24, 0x73, 0x85, 0x93, 0x6b, - 0xb6, 0xc2, 0x13, 0xff, 0x80, 0x6b, 0xd3, 0x0a, 0x50, 0x02, 0x9c, 0x47, - 0xec, 0xaf, 0x90, 0x27, 0x93, 0x0f, 0x9d, 0x5e, 0xdb, 0xec, 0xbe, 0xe1, - 0xd1, 0x45, 0x67, 0x4b, 0x1a, 0x79, 0xc4, 0xeb, 0xc3, 0x48, 0xe1, 0x69, - 0x1a, 0x26, 0x35, 0x0b, 0xd1, 0xd8, 0xeb, 0x15, 0xb7, 0x99, 0x1e, 0x90, - 0x00, 0x25, 0x34, 0x68, 0xb4, 0x7f, 0xbb, 0x72, 0x3d, 0x4a, 0x6b, 0xaa, - 0x4a, 0x0a, 0xe4, 0x0b, 0x86, 0x5a, 0x21, 0xe6, 0x04, 0x1f, 0xad, 0xee, - 0xc1, 0x55, 0xb0, 0xc9, 0x2b, 0xdd, 0xd2, 0x9a, 0x91, 0xa2, 0x5d, 0x22, - 0xaa, 0x65, 0xf7, 0xbf, 0x00, 0xbb, 0x37, 0x48, 0x97, 0xbb, 0x43, 0x0a, - 0x17, 0xd4, 0x40, 0xe8, 0xb4, 0x5b, 0xcb, 0x6f, 0x5e, 0x50, 0x83, 0x57, - 0x0d, 0x75, 0xed, 0x3a, 0x04, 0x7b, 0x05, 0x93, 0x0c, 0xb1, 0x67, 0xc2, - 0x5f, 0x10, 0x8a, 0x50, 0xe6, 0xd8, 0xd7, 0x16, 0x0c, 0x15, 0x52, 0xa2, - 0x60, 0x1a, 0x87, 0x7a, 0x81, 0xbc, 0x84, 0xb5, 0x4b, 0x05, 0xcc, 0x51, - 0x99, 0x9c, 0xd5, 0x13, 0xcb, 0x5c, 0x18, 0x8e, 0x08, 0x42, 0x86, 0xdb, - 0x9f, 0xa7, 0xb7, 0x7d, 0xc2, 0x96, 0xb8, 0x73, 0x4d, 0xb6, 0xf8, 0x17, - 0x55, 0x74, 0xd5, 0xd7, 0xde, 0x00, 0x5c, 0xc0, 0x66, 0x5a, 0xe4, 0xa8, - 0xb7, 0x09, 0x1a, 0xcd, 0xb1, 0x7e, 0xfc, 0x1f, 0x4d, 0x93, 0x77, 0xb3, - 0x67, 0x3b, 0xe4, 0x89, 0xa2, 0x56, 0xc0, 0x35, 0xd3, 0xee, 0x4b, 0x49, - 0xc7, 0x1d, 0x1b, 0x6f, 0x98, 0x7a, 0xf5, 0xc8, 0xac, 0xbe, 0x0b, 0xaf, - 0x05, 0x9b, 0xc9, 0xe4, 0xfa, 0x7e, 0x48, 0x30, 0x70, 0xef, 0xed, 0xe3, - 0x67, 0x8a, 0x80, 0x2e, 0x46, 0x19, 0x6d, 0x04, 0x5e, 0x15, 0x86, 0xb9, - 0x36, 0xf3, 0x82, 0x87, 0x0c, 0x79, 0xe1, 0x45, 0x95, 0x35, 0x44, 0xd4, - 0x25, 0xb9, 0xeb, 0xf0, 0x08, 0xfb, 0xa8, 0x80, 0xc7, 0x72, 0x07, 0xb1, - 0x65, 0xc2, 0x35, 0xd2, 0x0f, 0x1c, 0x68, 0x28, 0xbf, 0xc0, 0x69, 0xd5, - 0xc7, 0xdf, 0x91, 0x62, 0x5a, 0x2c, 0x4e, 0x0c, 0xd7, 0xdb, 0xc8, 0x3a, - 0xd7, 0xdf, 0x45, 0x66, 0xe9, 0x9c, 0x61, 0x7f, 0xfc, 0x91, 0xee, 0x0e, - 0x02, 0x98, 0x9a, 0xbb, 0xb3, 0xd5, 0x88, 0x63, 0x6b, 0x62, 0x58, 0x39, - 0xe8, 0xb8, 0x6d, 0x5a, 0x51, 0x20, 0x4d, 0xf7, 0x3a, 0x22, 0xd0, 0x90, - 0x5f, 0x73, 0x6b, 0x71, 0xd2, 0xbb, 0x6b, 0xaf, 0x25, 0x5a, 0xef, 0x87, - 0xc3, 0xe6, 0x5a, 0x26, 0xa1, 0x73, 0xee, 0x7c, 0xe2, 0xe5, 0x24, 0x41, - 0x3a, 0x53, 0x50, 0x49, 0x42, 0x27, 0x9c, 0x07, 0xf2, 0xe3, 0x99, 0xfd, - 0xc5, 0x0a, 0xd4, 0x39, 0xa2, 0x1b, 0xfc, 0xe7, 0x9b, 0x7d, 0x04, 0xf0, - 0x0c, 0xb4, 0x64, 0xa4, 0xa8, 0x40, 0x4b, 0xb1, 0x78, 0x52, 0x36, 0x81, - 0x0a, 0xd6, 0x25, 0x00, 0xcb, 0xd9, 0x68, 0x4f, 0x6f, 0xcb, 0x29, 0x33, - 0x89, 0x7c, 0x97, 0x69, 0x6f, 0x03, 0x8d, 0xa0, 0x19, 0x47, 0xe5, 0x55, - 0x9a, 0xf4, 0xb7, 0xf2, 0xcc, 0x4c, 0x2e, 0x64, 0x10, 0xd5, 0x06, 0xa7, - 0x0f, 0x2f, 0x5e, 0xc6, 0xc5, 0xb3, 0x99, 0xc8, 0x37, 0x78, 0xa4, 0xc4, - 0xb6, 0x30, 0xf6, 0x37, 0x68, 0x77, 0x9b, 0xa1, 0x56, 0x29, 0xdb, 0xe4, - 0x96, 0x68, 0x73, 0x79, 0xd2, 0x25, 0x03, 0x46, 0x16, 0x95, 0x03, 0xc2, - 0xba, 0x35, 0xe4, 0xfc, 0x9a, 0xec, 0x7e, 0x81, 0xa5, 0x7f, 0x24, 0x56, - 0x29, 0x25, 0x9b, 0xd3, 0x9c, 0x51, 0x57, 0xf5, 0xb4, 0x3f, 0xd8, 0x57, - 0xcc, 0x98, 0x71, 0xe7, 0xf6, 0x0a, 0x27, 0x3f, 0x4c, 0x86, 0x00, 0xd7, - 0x6e, 0xb2, 0xe9, 0x88, 0x6c, 0x5e, 0x1d, 0x49, 0x06, 0xeb, 0x37, 0xeb, - 0xc8, 0x85, 0x44, 0xea, 0x7a, 0x04, 0x75, 0x12, 0xc6, 0xb3, 0x5c, 0x0f, - 0x29, 0x6e, 0x34, 0xdd, 0xee, 0x05, 0x87, 0x93, 0x5b, 0x96, 0xd9, 0x21, - 0x52, 0xd0, 0x18, 0x85, 0x72, 0xda, 0x03, 0x67, 0x1a, 0x5e, 0x6c, 0xae, - 0x78, 0x6b, 0xb7, 0x4b, 0x99, 0xf3, 0x67, 0xe8, 0x9b, 0xae, 0xe5, 0xb3, - 0x65, 0x2e, 0x50, 0x45, 0x7d, 0xd3, 0x79, 0xff, 0x78, 0x50, 0x70, 0xe8, - 0x34, 0xd1, 0x3e, 0x66, 0xef, 0x37, 0x52, 0xfa, 0xd6, 0xfb, 0xb3, 0x40, - 0x64, 0xe3, 0xbf, 0x42, 0x4c, 0x7b, 0xf8, 0xda, 0x3f, 0xc9, 0xb0, 0x98, - 0x08, 0x0e, 0x31, 0xa9, 0x31, 0x71, 0x25, 0x99, 0xe9, 0x86, 0x8f, 0x04, - 0x27, 0xef, 0x0d, 0x7b, 0x99, 0xa6, 0x55, 0xda, 0x9f, 0x4c, 0x9c, 0xb7, - 0x57, 0x36, 0x39, 0x35, 0x26, 0x30, 0x36, 0xe4, 0xff, 0x0a, 0x1f, 0x02, - 0x1e, 0x6e, 0x7e, 0xb0, 0xdd, 0x27, 0x50, 0xa0, 0xdf, 0xcc, 0x41, 0xe1, - 0x40, 0x50, 0xec, 0x19, 0x8a, 0x3b, 0x5d, 0xfc, 0xb5, 0xb8, 0xc5, 0xb6, - 0x37, 0x76, 0xe8, 0xc5, 0xc8, 0xaa, 0x36, 0x72, 0x74, 0x77, 0xe2, 0x5e, - 0xd2, 0x1e, 0x3e, 0xce, 0x18, 0x9b, 0xfd, 0x9b, 0x32, 0x37, 0x85, 0xad, - 0x2b, 0x34, 0x94, 0x88, 0x3b, 0xf0, 0x1d, 0x99, 0x7e, 0xda, 0xc0, 0xdd, - 0xfc, 0x9c, 0x6b, 0x2b, 0x9d, 0x05, 0xfa, 0x8e, 0xfb, 0xd8, 0x6a, 0x8d, - 0x06, 0x17, 0x94, 0xc6, 0x0c, 0x3e, 0xe3, 0x7f, 0x99, 0x64, 0x61, 0x52, - 0x41, 0x0e, 0xf1, 0x5c, 0x4c, 0x9e, 0x62, 0x4a, 0x9e, 0x42, 0x44, 0x00, - 0xaa, 0x96, 0xf9, 0x6f, 0xe5, 0xc8, 0x7d, 0x44, 0x14, 0x53, 0xb3, 0x13, - 0xa2, 0xd5, 0x45, 0x17, 0xda, 0xeb, 0x7f, 0x9f, 0x93, 0x1f, 0xd3, 0x8e, - 0x6d, 0xf0, 0x53, 0xf3, 0xda, 0x2e, 0xe7, 0x68, 0xa0, 0x8b, 0xa7, 0x1f, - 0x88, 0xf8, 0xb4, 0x2c, 0x54, 0x86, 0x0f, 0x86, 0xbe, 0x2a, 0xf9, 0x1e, - 0x2c, 0x3e, 0x25, 0xa7, 0xd7, 0xb7, 0xf0, 0x60, 0xc0, 0x5e, 0x39, 0x5c, - 0x28, 0xf6, 0x07, 0x7c, 0xfd, 0x4f, 0xa4, 0xcc, 0x19, 0x67, 0xd7, 0x5d, - 0xa9, 0xfd, 0x9a, 0x85, 0x79, 0xa8, 0xef, 0xe3, 0x9d, 0x07, 0xa6, 0x27, - 0x83, 0x6c, 0x9f, 0x0e, 0x70, 0x06, 0x3b, 0x9f, 0x90, 0x88, 0x88, 0x25, - 0x32, 0xc1, 0xa6, 0x6e, 0x22, 0x51, 0x38, 0xe4, 0xbf, 0x3f, 0xc3, 0x4b, - 0x75, 0x17, 0x66, 0x5f, 0x4d, 0x82, 0xd3, 0xfc, 0x3a, 0x89, 0x93, 0x49, - 0x94, 0x1e, 0xec, 0x1b, 0x79, 0xf7, 0x03, 0x78, 0x45, 0xf9, 0x5e, 0xe7, - 0x9d, 0x22, 0x1e, 0x70, 0xf0, 0xae, 0xae, 0xe2, 0x42, 0xb7, 0xdc, 0x22, - 0xdf, 0xb9, 0x3d, 0x64, 0x8d, 0x0c, 0x6d, 0x89, 0xce, 0xfb, 0xe7, 0xd6, - 0xb7, 0xae, 0xe5, 0x00, 0xc5, 0x69, 0xbb, 0xfb, 0x22, 0xb0, 0x32, 0xf0, - 0x9e, 0xa5, 0x94, 0xb3, 0xe0, 0x5a, 0x28, 0xf3, 0x3b, 0x26, 0x44, 0x42, - 0xf0, 0x66, 0x81, 0xca, 0xdb, 0x0c, 0xbb, 0xd4, 0x69, 0x57, 0x99, 0x66, - 0x3a, 0xaa, 0x87, 0x72, 0x40, 0x89, 0xf4, 0xfb, 0x06, 0xe8, 0x7a, 0x4c, - 0x00, 0x3c, 0xf2, 0xa7, 0x24, 0x3b, 0xfd, 0xe7, 0x90, 0x41, 0x62, 0xdc, - 0x1d, 0x3d, 0x04, 0x93, 0x8f, 0xc8, 0xde, 0x3d, 0x04, 0xa6, 0xca, 0x1d, - 0xde, 0xcc, 0x25, 0x6e, 0xf3, 0x02, 0x4e, 0x53, 0x43, 0xba, 0xc0, 0x55, - 0x63, 0x9a, 0x0a, 0x91, 0x44, 0xa7, 0xc0, 0xf7, 0x79, 0x16, 0xc5, 0x6e, - 0x55, 0xea, 0xd1, 0xba, 0x3c, 0xbd, 0xe9, 0xb1, 0x76, 0x98, 0xef, 0xf7, - 0x25, 0x50, 0x6f, 0x52, 0xcf, 0xe5, 0x7a, 0x1a, 0xe7, 0x9e, 0x75, 0x3e, - 0xb2, 0x25, 0x0d, 0x89, 0xf1, 0xf8, 0x5e, 0xc7, 0x61, 0x03, 0x16, 0x2f, - 0x2c, 0x3c, 0x49, 0x05, 0x22, 0x5a, 0x08, 0xdb, 0x0e, 0x4c, 0x8e, 0x7f, - 0xa2, 0xa9, 0xf0, 0x2d, 0x6c, 0x48, 0x41, 0xb0, 0xf9, 0xd0, 0xa4, 0x5a, - 0x0d, 0xd0, 0x9d, 0xa8, 0x76, 0x3d, 0xec, 0x14, 0x30, 0x61, 0xed, 0x82, - 0x58, 0x0d, 0x8b, 0x62, 0xbe, 0x62, 0xd1, 0x0c, 0xe2, 0xd8, 0x45, 0x1b, - 0xd1, 0xe2, 0x21, 0xe9, 0xd3, 0x2b, 0x08, 0x80, 0x80, 0x07, 0x1f, 0x97, - 0xc4, 0xb8, 0x4b, 0x76, 0xcb, 0x83, 0x30, 0x08, 0x20, 0x9b, 0x08, 0xf4, - 0x1a, 0x22, 0x2a, 0x0d, 0x7e, 0x09, 0x53, 0x63, 0x59, 0x77, 0xfd, 0xd5, - 0x7c, 0x18, 0x68, 0xbc, 0xbc, 0x8e, 0x03, 0xc6, 0x7e, 0x7b, 0x23, 0x4e, - 0x6b, 0x48, 0xbb, 0xd7, 0xba, 0x53, 0x02, 0x5f, 0x59, 0xde, 0x08, 0x14, - 0x11, 0x0b, 0x4b, 0x3a, 0x2c, 0x12, 0x18, 0x21, 0x8a, 0xe8, 0x48, 0x9a, - 0x3f, 0xad, 0x2b, 0x83, 0xe4, 0xba, 0x88, 0x58, 0xfc, 0xb5, 0x6c, 0xb0, - 0xe2, 0xe9, 0xe4, 0x33, 0xe9, 0x1c, 0x47, 0x50, 0x85, 0x80, 0xd7, 0x77, - 0x49, 0xfe, 0x5c, 0x0d, 0x0f, 0x93, 0xe8, 0x66, 0x12, 0xef, 0xf3, 0x4e, - 0xe6, 0x21, 0x29, 0x2d, 0xe8, 0x6d, 0x7c, 0xc5, 0xad, 0xf0, 0xeb, 0x9f, - 0x43, 0xdb, 0xe1, 0x01, 0x83, 0x89, 0xf5, 0x32, 0x2d, 0x2b, 0x21, 0xcd, - 0xce, 0xbd, 0x9c, 0x31, 0x00, 0xb6, 0x97, 0x8f, 0x58, 0xe4, 0xf4, 0xe1, - 0x39, 0xfd, 0xaa, 0x61, 0x89, 0x14, 0x49, 0x76, 0x14, 0xa6, 0x6b, 0x47, - 0x75, 0x6e, 0x41, 0xd1, 0x54, 0xe9, 0x59, 0x7f, 0xd1, 0xa4, 0x72, 0x54, - 0x3d, 0x8c, 0xa6, 0x3c, 0x12, 0x2f, 0x6e, 0x09, 0xcc, 0x08, 0xbe, 0x27, - 0x48, 0x6a, 0xbb, 0x3b, 0xbf, 0x67, 0x88, 0xfd, 0x5b, 0x9d, 0x37, 0x69, - 0x1c, 0x42, 0xeb, 0x89, 0x94, 0x80, 0x7a, 0x68, 0x91, 0xbc, 0xd0, 0xe2, - 0x81, 0x92, 0x12, 0x17, 0x0f, 0x21, 0x8f, 0x7b, 0xe5, 0xf6, 0x0d, 0x81, - 0xbe, 0xb2, 0x7c, 0x7f, 0xaf, 0xd9, 0x49, 0x02, 0xf1, 0x8a, 0x0e, 0x73, - 0x4c, 0x17, 0x35, 0x4b, 0xfe, 0x4a, 0x9a, 0x0b, 0x5e, 0x3d, 0x7b, 0x3c, - 0x77, 0x4b, 0x4c, 0x6c, 0x7e, 0x35, 0x1d, 0xcc, 0x88, 0x73, 0x41, 0x71, - 0x44, 0x06, 0x6c, 0x85, 0xae, 0xda, 0x3b, 0xa6, 0x13, 0xcd, 0xd4, 0xa9, - 0xbc, 0x88, 0x12, 0x0d, 0x78, 0x94, 0xfc, 0x9b, 0x91, 0xaa, 0xd1, 0xf7, - 0xf1, 0x16, 0x0e, 0x6c, 0x29, 0x2e, 0x4b, 0x9a, 0xec, 0xe1, 0xc5, 0x0c, - 0x8c, 0x31, 0x60, 0x15, 0xb8, 0x1d, 0xd9, 0x9d, 0x2f, 0x60, 0xe9, 0xf6, - 0x74, 0x19, 0xb6, 0xc3, 0x2b, 0x28, 0xbb, 0x97, 0x41, 0x28, 0x9b, 0x74, - 0x8e, 0x14, 0x9a, 0xca, 0xcc, 0xf9, 0x30, 0x98, 0x3b, 0x64, 0xf3, 0xb4, - 0x5e, 0xed, 0x89, 0xf6, 0xea, 0xfa, 0xea, 0x39, 0x0b, 0x9a, 0x77, 0x4b, - 0xd3, 0x93, 0x97, 0x74, 0xc3, 0x54, 0xbc, 0x0c, 0xaa, 0xb0, 0xaf, 0x64, - 0x2f, 0x7d, 0x55, 0x54, 0x85, 0x19, 0xdc, 0xbd, 0x6d, 0x83, 0xc1, 0xd4, - 0xab, 0xc6, 0x06, 0x3f, 0x4c, 0xc9, 0x21, 0x44, 0x48, 0x4a, 0xfe, 0xd3, - 0xcc, 0x80, 0x1b, 0x37, 0xf6, 0x32, 0x4d, 0x17, 0xf3, 0x82, 0x68, 0xb2, - 0x75, 0x2b, 0x6c, 0xf7, 0x9e, 0x32, 0x5e, 0x29, 0x18, 0xa9, 0x79, 0x2f, - 0x56, 0x84, 0xc0, 0xb6, 0x9e, 0xcc, 0x34, 0xe8, 0xa2, 0xb2, 0xf7, 0x7d, - 0x59, 0x67, 0x90, 0x8d, 0x1a, 0x5b, 0x73, 0x26, 0x61, 0xd5, 0xc1, 0x9f, - 0x28, 0x1f, 0x98, 0x07, 0x3a, 0x70, 0xc1, 0x25, 0x7a, 0x83, 0x12, 0x3b, - 0x3c, 0xb3, 0xe5, 0x4d, 0x1f, 0x91, 0xba, 0x78, 0x3c, 0xe4, 0x93, 0xd7, - 0xb7, 0x2c, 0x4f, 0x69, 0x02, 0x6c, 0xb8, 0x6f, 0xef, 0xe3, 0x4f, 0x03, - 0x92, 0xaa, 0x95, 0x74, 0x65, 0xe2, 0xf6, 0x77, 0x2b, 0xa7, 0xa5, 0x45, - 0x56, 0x4c, 0x88, 0x7b, 0x04, 0x63, 0xed, 0xc2, 0x56, 0xe4, 0x1a, 0xbe, - 0x8b, 0x40, 0xe3, 0x2b, 0xb3, 0x7d, 0xe3, 0x49, 0x9e, 0xf6, 0x1c, 0xf0, - 0x78, 0x99, 0x43, 0xb7, 0x8d, 0x5e, 0x47, 0xc6, 0xa5, 0x7f, 0xc2, 0xcc, - 0x54, 0x3d, 0x59, 0x80, 0x2c, 0xcd, 0x6d, 0x30, 0xb2, 0x40, 0xb5, 0x18, - 0x62, 0x45, 0x36, 0xdc, 0xc6, 0x5e, 0x5a, 0x1f, 0xb4, 0x6d, 0x2f, 0x27, - 0xa6, 0xec, 0x87, 0x96, 0xb7, 0x73, 0x61, 0xce, 0xf5, 0x34, 0x42, 0x2b, - 0xb3, 0x9f, 0xb7, 0x65, 0x86, 0x4b, 0x2b, 0x21, 0x63, 0x36, 0x4d, 0x4f, - 0x0a, 0x73, 0xbb, 0x67, 0xeb, 0xc8, 0xe2, 0x2c, 0xf3, 0x21, 0x25, 0xf8, - 0x37, 0xab, 0x60, 0xe9, 0xce, 0x7b, 0x7b, 0xd0, 0xbb, 0x79, 0x2d, 0x08, - 0xcf, 0xc7, 0xe9, 0xd6, 0xf9, 0x4b, 0x41, 0xa5, 0xd1, 0xa2, 0xbc, 0xa5, - 0x7d, 0x2c, 0x93, 0x5c, 0x50, 0xc8, 0xf3, 0x9a, 0x2b, 0xbe, 0xf4, 0x7e, - 0x62, 0xad, 0x26, 0xbe, 0x39, 0x5b, 0x6e, 0xe2, 0xf2, 0x90, 0x17, 0x70, - 0xe2, 0xf6, 0xbd, 0x37, 0x5c, 0x86, 0x93, 0x0a, 0xd7, 0x87, 0xd1, 0x96, - 0xf6, 0xae, 0x11, 0xb8, 0x69, 0xf9, 0x51, 0x8a, 0x6d, 0x07, 0x97, 0x86, - 0xc4, 0xf5, 0xef, 0xc2, 0x5e, 0x1b, 0x68, 0xde, 0xd7, 0x86, 0x5b, 0x56, - 0x93, 0x89, 0x10, 0xa4, 0xf9, 0x36, 0xeb, 0x6b, 0x16, 0x05, 0x42, 0xde, - 0x90, 0xdb, 0xe3, 0xa3, 0x26, 0x27, 0xf4, 0xce, 0x81, 0xd7, 0xc4, 0xbf, - 0x15, 0x6d, 0x72, 0xd0, 0x26, 0x9b, 0x39, 0x13, 0x4a, 0x04, 0xe6, 0xcc, - 0xec, 0xfd, 0x90, 0x4d, 0xc1, 0x45, 0x75, 0x1f, 0x30, 0xee, 0x5e, 0x0a, - 0x57, 0x60, 0x63, 0xd2, 0x67, 0x33, 0x5c, 0x61, 0xc4, 0xf4, 0x57, 0xf9, - 0x2d, 0x87, 0x5f, 0x6b, 0xbb, 0xe2, 0x18, 0xe3, 0x16, 0x7c, 0x6a, 0x11, - 0x8d, 0x22, 0x03, 0xb0, 0x6f, 0x1b, 0xd8, 0x6b, 0x6d, 0x5e, 0xab, 0x13, - 0xe9, 0xda, 0xf6, 0xbe, 0x5d, 0x13, 0x55, 0x51, 0xe0, 0xf9, 0x0b, 0x5e, - 0x13, 0xcc, 0xbd, 0xf8, 0x08, 0xe3, 0xe8, 0x06, 0xad, 0x8b, 0xa4, 0x7d, - 0x81, 0x01, 0x03, 0xa5, 0xc7, 0xbb, 0xea, 0x4d, 0xb0, 0xd8, 0xc2, 0xd2, - 0x94, 0x40, 0x15, 0xaa, 0x91, 0xa4, 0x3b, 0x13, 0xeb, 0xf2, 0xde, 0x7c, - 0xcf, 0x78, 0x80, 0xf5, 0xa2, 0x8b, 0x8a, 0x26, 0x0e, 0x18, 0xc9, 0x49, - 0xf4, 0x6a, 0x2e, 0x8a, 0xc6, 0x36, 0xfc, 0x85, 0x20, 0x13, 0xe5, 0x40, - 0x12, 0x52, 0x52, 0x83, 0x8c, 0x2e, 0xb9, 0x12, 0x5f, 0xb9, 0x3b, 0x3a, - 0xca, 0xc8, 0xa3, 0xea, 0x2d, 0x6d, 0x5b, 0xcd, 0x4d, 0x94, 0xcf, 0x7a, - 0x04, 0xb7, 0xb0, 0x87, 0xa8, 0x44, 0xfb, 0xc9, 0x91, 0x7e, 0x78, 0x99, - 0x8a, 0xe1, 0x91, 0xff, 0x05, 0x4b, 0x0b, 0xca, 0x1c, 0x99, 0xdf, 0x5a, - 0xea, 0xc5, 0x83, 0x38, 0xd9, 0xd5, 0x03, 0xec, 0xc4, 0xb5, 0xf0, 0xf0, - 0x39, 0x89, 0x27, 0x87, 0x79, 0xb9, 0x63, 0xee, 0x2c, 0xf6, 0xf3, 0xf6, - 0xa8, 0x0c, 0x81, 0x86, 0x04, 0xd7, 0x16, 0x44, 0x1c, 0xc8, 0x14, 0x5c, - 0x79, 0x16, 0x80, 0x0a, 0xa2, 0xc4, 0xfd, 0x38, 0x3d, 0x8f, 0x8c, 0x45, - 0x55, 0xab, 0x60, 0x63, 0x7e, 0x88, 0x74, 0xcd, 0x83, 0x73, 0x6f, 0xcf, - 0xbc, 0xb7, 0x59, 0x0b, 0x36, 0x1e, 0x70, 0x4a, 0xe4, 0x32, 0x3f, 0x3f, - 0x99, 0x38, 0x1f, 0x7a, 0x40, 0xe5, 0xc6, 0xb0, 0x16, 0x49, 0x95, 0xc1, - 0x64, 0x6e, 0x52, 0xa9, 0x4c, 0x48, 0x5a, 0x91, 0x34, 0xd1, 0x35, 0x89, - 0x6a, 0x46, 0x1e, 0xba, 0x1c, 0x1b, 0x59, 0x4f, 0x2c, 0x67, 0xe4, 0x59, - 0x18, 0xad, 0xd7, 0xc5, 0x93, 0xfa, 0xb8, 0xf9, 0x78, 0x7e, 0xd3, 0xa5, - 0x81, 0x98, 0xe5, 0x3d, 0xe7, 0x45, 0xa7, 0x9f, 0x1a, 0x73, 0xf0, 0x1e, - 0xa5, 0xe4, 0x77, 0xd1, 0x1f, 0x94, 0x48, 0x91, 0x50, 0xbb, 0xba, 0x84, - 0x0c, 0xd9, 0x87, 0x37, 0xf8, 0x08, 0x7b, 0xcb, 0x0e, 0xe9, 0xf2, 0x9a, - 0xb8, 0x79, 0x33, 0x9d, 0x45, 0xc3, 0x6a, 0x55, 0x51, 0x16, 0x64, 0xaa, - 0x5a, 0xbe, 0x7d, 0x17, 0xe8, 0x65, 0x55, 0x44, 0xf5, 0xa3, 0xdf, 0x0b, - 0x68, 0xc8, 0xda, 0x80, 0xb2, 0xb1, 0x6c, 0xe9, 0x68, 0xd8, 0x14, 0x70, - 0x67, 0x25, 0x02, 0xe3, 0xe9, 0x0a, 0xa2, 0xbb, 0xa4, 0x5a, 0x2c, 0x60, - 0xf7, 0x94, 0x43, 0xf2, 0xb7, 0x85, 0x4a, 0x9a, 0x9b, 0x66, 0x68, 0x8e, - 0x39, 0xa9, 0x08, 0xdb, 0x7d, 0x69, 0x4c, 0x1f, 0x08, 0xac, 0xd0, 0xa8, - 0xa5, 0x04, 0x2b, 0x13, 0x18, 0x81, 0x2c, 0x58, 0xe7, 0x07, 0xad, 0xd0, - 0xc4, 0xf1, 0xf6, 0xfd, 0x2c, 0x59, 0xa3, 0x0d, 0x75, 0x7e, 0xe0, 0x08, - 0x1b, 0xc5, 0xde, 0xbe, 0xb1, 0x40, 0xb9, 0x69, 0x50, 0xce, 0x20, 0x72, - 0x8b, 0xe5, 0xe0, 0x39, 0x21, 0x6c, 0xd4, 0x7e, 0x59, 0x09, 0x2d, 0x9f, - 0x48, 0x2e, 0x64, 0x47, 0xf6, 0xbc, 0x9a, 0x19, 0x0c, 0xb0, 0xee, 0x5c, - 0x7c, 0xe0, 0xd1, 0xf2, 0xe0, 0xff, 0xe8, 0x45, 0x90, 0xf5, 0xc7, 0x79, - 0x99, 0x38, 0xc4, 0x9d, 0xfb, 0x29, 0xef, 0x58, 0x74, 0x23, 0xfe, 0x4c, - 0x6a, 0xee, 0xd7, 0xa8, 0x43, 0x8d, 0xf5, 0xce, 0xc4, 0x51, 0x07, 0xda, - 0x1a, 0xac, 0x27, 0x5a, 0x30, 0xaf, 0x63, 0x33, 0x2b, 0xf1, 0x0d, 0x7d, - 0xa4, 0xb1, 0x2d, 0xee, 0xdd, 0xce, 0xa1, 0x22, 0x72, 0xb1, 0x16, 0xef, - 0x24, 0xfc, 0xbc, 0x73, 0x89, 0xd9, 0xbe, 0x2a, 0x90, 0xe2, 0xfb, 0x01, - 0x84, 0xb5, 0xaa, 0x33, 0x4e, 0xd6, 0x7d, 0x0a, 0x4d, 0xb5, 0x5a, 0x14, - 0x72, 0x85, 0x97, 0x2a, 0x46, 0x87, 0xf6, 0x89, 0xbb, 0xfb, 0xcf, 0x5f, - 0x01, 0xa0, 0xc1, 0x66, 0xde, 0x2b, 0x1a, 0xbf, 0xf5, 0x9c, 0xe1, 0x3c, - 0x63, 0x9f, 0x6f, 0xf2, 0xc7, 0x2d, 0xf4, 0x60, 0x51, 0x53, 0xbd, 0xc2, - 0x2a, 0xc7, 0x19, 0x45, 0x62, 0xc2, 0x2d, 0xe0, 0x84, 0x75, 0xb9, 0x91, - 0x06, 0x85, 0x70, 0xa1, 0xc5, 0xf6, 0x56, 0x62, 0xfd, 0xe6, 0x2e, 0x6a, - 0xa6, 0xe1, 0x8e, 0x73, 0xcb, 0xd5, 0xf3, 0x1d, 0x68, 0x3f, 0xea, 0xf9, - 0x0c, 0xd8, 0x76, 0x81, 0x73, 0x3d, 0x97, 0x85, 0x79, 0xf4, 0xbf, 0xf6, - 0x37, 0x42, 0xdc, 0xe6, 0x64, 0x54, 0x32, 0x33, 0x96, 0x16, 0x61, 0xe2, - 0xb4, 0x34, 0x59, 0x38, 0x5b, 0x96, 0xc6, 0xb7, 0x34, 0xbe, 0x3c, 0xd7, - 0x5a, 0x75, 0x3f, 0x43, 0xd5, 0x7e, 0x39, 0x32, 0xa2, 0x7f, 0xa2, 0xb6, - 0x26, 0xc1, 0x84, 0xde, 0xd4, 0xc0, 0x93, 0xad, 0x29, 0xad, 0x18, 0x2d, - 0x04, 0xea, 0x7d, 0x43, 0xae, 0x22, 0x9f, 0xa4, 0x8b, 0xbf, 0x9b, 0xf9, - 0xf3, 0x03, 0xec, 0xa6, 0xd8, 0x90, 0x4f, 0x3c, 0xbb, 0xc7, 0x0b, 0x7f, - 0xda, 0x28, 0xbc, 0xb2, 0x04, 0xbd, 0x68, 0x6b, 0x94, 0xfd, 0x9f, 0x58, - 0x50, 0xd5, 0x4d, 0x05, 0x91, 0x93, 0xd3, 0x6e, 0xdf, 0xe7, 0xb1, 0x39, - 0x4f, 0x77, 0x61, 0x37, 0x76, 0x7c, 0x46, 0x09, 0xca, 0x00, 0xda, 0x78, - 0x09, 0x92, 0x8f, 0x24, 0xb3, 0x68, 0x5f, 0x69, 0x68, 0x54, 0x03, 0x9d, - 0x3d, 0xcd, 0x0b, 0xcd, 0x1f, 0xc8, 0xb8, 0x18, 0xd3, 0xd9, 0x84, 0x65, - 0xbd, 0x9f, 0xd0, 0x02, 0x53, 0x43, 0x7d, 0x46, 0x98, 0x69, 0x91, 0x55, - 0x5e, 0xad, 0x8a, 0x50, 0x50, 0x98, 0xd0, 0xef, 0xa8, 0xb6, 0x08, 0x98, - 0x87, 0xc9, 0x9a, 0xcb, 0x6f, 0x2a, 0xd9, 0x49, 0x88, 0x00, 0x9c, 0xe8, - 0x08, 0xc6, 0x92, 0x8b, 0xf9, 0x59, 0x73, 0x9e, 0xb1, 0xfd, 0x1d, 0xed, - 0x94, 0x92, 0x94, 0xab, 0x17, 0xcb, 0x8a, 0xad, 0xae, 0x07, 0xd1, 0x9c, - 0x2f, 0xb1, 0xfa, 0xff, 0xec, 0x38, 0x30, 0xa7, 0x34, 0xc1, 0x21, 0x95, - 0x41, 0xe0, 0xbc, 0x6f, 0xdb, 0x6d, 0x31, 0xe5, 0xd7, 0x52, 0x67, 0xb5, - 0x21, 0xb9, 0x46, 0x3a, 0xcb, 0xde, 0x95, 0x6f, 0x94, 0x15, 0xba, 0x65, - 0x01, 0x56, 0xd3, 0x47, 0x42, 0xe6, 0x8f, 0xc2, 0x4d, 0x9f, 0x6e, 0x3a, - 0x4f, 0x9a, 0xe2, 0x86, 0x31, 0xb5, 0x77, 0x74, 0x49, 0x19, 0x16, 0x96, - 0x83, 0x3c, 0x5d, 0x91, 0x09, 0xd2, 0x07, 0xe8, 0x8d, 0x30, 0x04, 0xc8, - 0x0f, 0xec, 0x09, 0x10, 0x1d, 0x2b, 0xd7, 0x5c, 0xc5, 0x82, 0x5e, 0x77, - 0x0c, 0x57, 0x4e, 0x2e, 0xae, 0xf0, 0x39, 0x23, 0x12, 0xd7, 0x27, 0x90, - 0xaa, 0x1f, 0x32, 0x29, 0xe9, 0x5d, 0xff, 0xa4, 0x30, 0x9d, 0x76, 0x73, - 0x50, 0xed, 0x55, 0xf3, 0x0e, 0x71, 0x1e, 0x7c, 0x16, 0x13, 0xb2, 0xc7, - 0x76, 0x1d, 0x3c, 0x33, 0x70, 0x74, 0x73, 0xf5, 0x31, 0x74, 0xf9, 0x36, - 0x45, 0xb2, 0xe8, 0x7e, 0xdb, 0xfe, 0xf8, 0x9a, 0xaa, 0xac, 0xb1, 0x1f, - 0xcf, 0x5b, 0x80, 0xe4, 0xf2, 0xa1, 0xbd, 0x34, 0xd5, 0x30, 0xa2, 0x53, - 0x6a, 0x2f, 0xec, 0x5b, 0x3b, 0x6e, 0xfb, 0xfd, 0xf8, 0x1f, 0x2e, 0xa4, - 0x8b, 0xd6, 0x54, 0x62, 0xfb, 0xa6, 0x73, 0xbd, 0x58, 0x54, 0x7c, 0xd7, - 0x6d, 0x3f, 0x99, 0xc7, 0xf7, 0x19, 0x4a, 0x3e, 0x55, 0x1a, 0xbd, 0xd5, - 0x20, 0xff, 0xe3, 0x66, 0x34, 0x56, 0x00, 0x32, 0xc3, 0x89, 0x84, 0x69, - 0xd7, 0xb2, 0x36, 0x3f, 0xd0, 0x01, 0xdd, 0x95, 0x76, 0x0a, 0xc1, 0xfe, - 0xef, 0xbd, 0xfb, 0xc9, 0x24, 0x4c, 0xf9, 0xa1, 0x96, 0x35, 0x64, 0x73, - 0x57, 0x8a, 0x7a, 0x6e, 0x94, 0x34, 0x89, 0x5b, 0x81, 0x11, 0x9e, 0x0a, - 0xa0, 0x7d, 0x34, 0xd5, 0x7c, 0x33, 0x41, 0xea, 0x49, 0x53, 0x66, 0x9a, - 0x27, 0xa2, 0xa0, 0xb8, 0xeb, 0x97, 0xd4, 0xdb, 0x0a, 0xc8, 0x42, 0x3c, - 0xc7, 0x0f, 0x0d, 0x4d, 0x34, 0xfc, 0x5e, 0x78, 0x3b, 0xea, 0xf3, 0xc6, - 0x00, 0x87, 0xc5, 0x88, 0xa9, 0x62, 0x44, 0xc0, 0xbc, 0x12, 0x99, 0x47, - 0x37, 0x0a, 0x22, 0x9e, 0xe6, 0xd1, 0xe5, 0xa6, 0x61, 0x05, 0x49, 0x46, - 0x10, 0x02, 0xec, 0xd4, 0x33, 0x4d, 0x16, 0x0a, 0x28, 0xeb, 0x7c, 0xb7, - 0x25, 0x0d, 0x1b, 0x10, 0x21, 0xe6, 0x78, 0x7b, 0x57, 0x96, 0xae, 0x83, - 0xa5, 0x84, 0x95, 0xf3, 0x77, 0xe4, 0x23, 0x81, 0x6e, 0x62, 0x60, 0x70, - 0xaa, 0x54, 0x9c, 0x40, 0xb2, 0x08, 0x8d, 0x26, 0xb0, 0x04, 0xdb, 0x64, - 0x8d, 0xbe, 0x65, 0x90, 0x78, 0xb2, 0x6e, 0xbd, 0xc0, 0xa6, 0xb0, 0x92, - 0x66, 0x80, 0xe9, 0x94, 0x6b, 0x21, 0x6f, 0x44, 0x34, 0x82, 0x5a, 0x5b, - 0xe0, 0xfe, 0x88, 0xb3, 0xee, 0x5a, 0x86, 0x44, 0xbd, 0xa8, 0xa2, 0xd2, - 0x62, 0x7d, 0x90, 0xcd, 0x52, 0x9a, 0x5d, 0xfd, 0xf6, 0xd1, 0xdf, 0x2f, - 0x97, 0xc1, 0xff, 0x41, 0x8b, 0x28, 0x47, 0x61, 0x0c, 0x3b, 0xfd, 0xae, - 0x08, 0xb7, 0xe4, 0xae, 0xa8, 0x2e, 0x03, 0x0b, 0x92, 0xfc, 0x95, 0x53, - 0x51, 0x74, 0xe2, 0xba, 0x16, 0x7c, 0x9f, 0xc3, 0xf8, 0xab, 0x55, 0x25, - 0xcf, 0x89, 0x32, 0xb2, 0x74, 0xda, 0xec, 0xab, 0x4f, 0x63, 0x8a, 0xfd, - 0xbe, 0x8d, 0xc4, 0xf9, 0x79, 0x56, 0xd0, 0xe3, 0xcc, 0x2a, 0xb6, 0xdf, - 0x16, 0xf5, 0x2e, 0xa1, 0xb4, 0x09, 0xae, 0xc8, 0xab, 0x85, 0xb3, 0x98, - 0x07, 0xcd, 0x98, 0x07, 0x10, 0x23, 0xe4, 0x17, 0x98, 0x37, 0xe4, 0x75, - 0xc4, 0x03, 0xb2, 0xdb, 0xf0, 0xb4, 0x5f, 0x1b, 0xc7, 0x13, 0xb4, 0xdc, - 0x3c, 0x69, 0x79, 0xb6, 0xff, 0xe9, 0x70, 0x2e, 0xcf, 0x6b, 0xdb, 0xb8, - 0x26, 0xb1, 0x2b, 0x24, 0x74, 0x8d, 0x07, 0x74, 0xa2, 0xf2, 0x7c, 0x35, - 0xbc, 0xca, 0x9d, 0x00, 0xcb, 0x5c, 0xe1, 0x47, 0x7c, 0x1e, 0x6b, 0xea, - 0xf0, 0x68, 0xfb, 0xec, 0x42, 0xde, 0x78, 0x64, 0x49, 0xd7, 0xc5, 0xf2, - 0x50, 0xb1, 0x1b, 0x9d, 0xe8, 0xf3, 0xb4, 0x7f, 0x1d, 0xe5, 0x3c, 0xf1, - 0x36, 0xc9, 0xa5, 0xe3, 0x66, 0x17, 0x01, 0x44, 0x41, 0x65, 0xd4, 0xe0, - 0x38, 0x5e, 0x06, 0x4c, 0xde, 0x40, 0xcb, 0x16, 0x84, 0xf4, 0x41, 0x47, - 0x60, 0xe8, 0x4a, 0xa6, 0x75, 0xbe, 0x9d, 0xf1, 0x40, 0x3f, 0x4f, 0x28, - 0x9c, 0x10, 0xee, 0x47, 0x8e, 0x0d, 0x61, 0x0c, 0x2a, 0x93, 0xb7, 0xf8, - 0x77, 0x08, 0xa0, 0xb5, 0x21, 0x4d, 0x97, 0x29, 0x36, 0x6b, 0x80, 0xb5, - 0x4f, 0x36, 0x33, 0xd3, 0xa3, 0x98, 0x48, 0xda, 0xcc, 0x4d, 0x3e, 0x14, - 0x82, 0xa9, 0x4d, 0xe0, 0xf8, 0x1a, 0xd5, 0x22, 0x7a, 0xd9, 0x2a, 0x52, - 0xa3, 0xcd, 0x80, 0xb6, 0x36, 0xb8, 0x12, 0x27, 0x29, 0x55, 0x5c, 0x6a, - 0x53, 0x62, 0xd7, 0x9f, 0xc4, 0x82, 0x79, 0x3b, 0x3e, 0x17, 0x8f, 0x8b, - 0xf1, 0x48, 0x56, 0xe7, 0x3d, 0x1d, 0x36, 0xda, 0x4c, 0xfe, 0x0f, 0xcd, - 0x71, 0x05, 0x9d, 0xa2, 0x05, 0x53, 0x73, 0x56, 0x86, 0x92, 0xcf, 0x17, - 0x4a, 0xd1, 0xe1, 0x8a, 0x04, 0x72, 0xb2, 0xd3, 0x13, 0x94, 0x0c, 0xe8, - 0x80, 0x09, 0xc0, 0x9c, 0xa6, 0x56, 0x99, 0x86, 0xb5, 0xd8, 0x00, 0x7e, - 0x64, 0xe9, 0x47, 0x0c, 0x69, 0x51, 0xd3, 0xea, 0xc8, 0x8e, 0x88, 0x64, - 0x3a, 0x40, 0x2c, 0xa2, 0xf6, 0x63, 0x86, 0xbf, 0x7b, 0xc9, 0x19, 0xc3, - 0x14, 0x90, 0x3a, 0x1c, 0x04, 0x76, 0xfa, 0x19, 0x1d, 0x5d, 0xc3, 0xb5, - 0x7a, 0xb5, 0xe2, 0xa7, 0x68, 0x5e, 0x51, 0xe9, 0xdc, 0x32, 0x2d, 0x15, - 0x6a, 0xd5, 0x76, 0xe4, 0x5a, 0x22, 0x36, 0x57, 0xc5, 0xb4, 0x2b, 0xf2, - 0x93, 0x87, 0x5d, 0xd4, 0xdf, 0x35, 0xa3, 0x85, 0xf5, 0x90, 0x78, 0x65, - 0xca, 0xb2, 0x79, 0xb9, 0xb6, 0x30, 0x09, 0x6f, 0x09, 0xc4, 0xb0, 0xf9, - 0xbd, 0x28, 0xb5, 0x89, 0xd8, 0x3b, 0xb7, 0x38, 0x53, 0xda, 0x76, 0x5f, - 0x4b, 0x6f, 0xaf, 0xcd, 0xd7, 0xe7, 0x45, 0xff, 0x98, 0xb2, 0xc7, 0xe7, - 0x3a, 0x0f, 0xcc, 0x86, 0xce, 0x28, 0x5b, 0xa7, 0x3b, 0xd5, 0x71, 0x10, - 0x51, 0x67, 0x36, 0xb9, 0x07, 0x77, 0xea, 0xc8, 0x21, 0xbe, 0xaa, 0x00, - 0xd7, 0xf1, 0xa1, 0xc8, 0x82, 0x4e, 0xbb, 0x43, 0x74, 0x32, 0x49, 0x19, - 0x3e, 0x12, 0x4f, 0xf1, 0x41, 0x2f, 0x74, 0xb0, 0xc6, 0x39, 0xbd, 0x6a, - 0x8d, 0x3c, 0x28, 0x52, 0x69, 0xb5, 0x94, 0xe8, 0x6d, 0x7e, 0x9e, 0xdc, - 0xcc, 0x3f, 0x2f, 0x1e, 0x0a, 0x90, 0x0c, 0x0f, 0x8f, 0x88, 0xbc, 0xa1, - 0xa0, 0x1c, 0x2f, 0x72, 0xdb, 0x96, 0xfa, 0x5d, 0x0b, 0x7d, 0xfd, 0x98, - 0x40, 0xd9, 0x0c, 0x0b, 0xd2, 0xa1, 0xf2, 0xe1, 0x54, 0x24, 0xa1, 0xb2, - 0x8f, 0xd1, 0x08, 0x95, 0xfa, 0x0b, 0x6a, 0x96, 0x19, 0x6f, 0xc5, 0xe8, - 0x1e, 0x5e, 0xc1, 0x79, 0x49, 0x42, 0x0b, 0x06, 0xba, 0xcd, 0xd6, 0xc9, - 0x00, 0x6e, 0x97, 0x86, 0x0b, 0x8d, 0x59, 0x0a, 0xc3, 0xb5, 0xb0, 0xa5, - 0x45, 0xd4, 0xd5, 0xda, 0x34, 0x05, 0x5a, 0xd8, 0x5d, 0x9c, 0x73, 0x45, - 0x6e, 0x3e, 0xde, 0x39, 0x72, 0xf1, 0x75, 0x4c, 0xa9, 0x2e, 0x58, 0x04, - 0xe4, 0x08, 0x02, 0x6f, 0x7d, 0xfc, 0x38, 0x63, 0xd6, 0x49, 0x11, 0xd8, - 0x12, 0x24, 0x71, 0xf4, 0xd8, 0x8d, 0x15, 0xbb, 0xf7, 0x8c, 0xec, 0xdf, - 0x39, 0xe7, 0xfc, 0x55, 0x82, 0xd6, 0xb9, 0xa8, 0xa7, 0xa4, 0x52, 0xdb, - 0x6c, 0xe9, 0x98, 0x2d, 0x86, 0xfa, 0x73, 0xdb, 0x9c, 0xd1, 0x83, 0x78, - 0x7d, 0x7b, 0x1a, 0x06, 0xa9, 0x1d, 0xf6, 0xb2, 0x4f, 0x10, 0x3b, 0xe6, - 0x45, 0xa0, 0x8d, 0x48, 0xe5, 0x5e, 0xcc, 0x93, 0xe4, 0x69, 0xaf, 0x1c, - 0x7c, 0x6e, 0xb0, 0xd2, 0x54, 0xa6, 0xb7, 0xe1, 0xe8, 0x40, 0x5d, 0x82, - 0x95, 0x9c, 0x1d, 0xc9, 0x96, 0xfa, 0x05, 0xf7, 0x4d, 0xec, 0x0c, 0x04, - 0x10, 0x8b, 0x33, 0x64, 0x23, 0x85, 0xfa, 0x90, 0x66, 0x9d, 0x9a, 0xe7, - 0xa8, 0xc7, 0x1c, 0xd6, 0x97, 0x41, 0x76, 0xbb, 0x41, 0x93, 0x8b, 0x25, - 0xba, 0x55, 0x82, 0x31, 0x59, 0x5d, 0x02, 0x50, 0xdb, 0x55, 0x22, 0xdc, - 0xf5, 0xed, 0xc9, 0x69, 0xc0, 0x6c, 0x51, 0x66, 0x90, 0x13, 0xf3, 0x3f, - 0x11, 0x90, 0x82, 0xdf, 0xe4, 0xaa, 0x47, 0x69, 0x61, 0x78, 0x80, 0x29, - 0xd7, 0x4b, 0x0b, 0x83, 0x89, 0xb6, 0x4e, 0x9b, 0x28, 0xea, 0x07, 0x3b, - 0x16, 0x45, 0x98, 0xbc, 0x97, 0xfb, 0xef, 0x5d, 0x93, 0xa6, 0xbd, 0x98, - 0x17, 0xb8, 0x38, 0xa2, 0xcd, 0xac, 0x0f, 0x82, 0xfb, 0xe2, 0xb2, 0x10, - 0x2f, 0xee, 0x53, 0x7b, 0x58, 0x30, 0x43, 0xaf, 0xe9, 0xea, 0xd1, 0x27, - 0xe3, 0x4f, 0x10, 0x0a, 0xd0, 0x0e, 0x80, 0x0d, 0xd0, 0xfb, 0x96, 0x00, - 0xc6, 0x09, 0xb5, 0xf4, 0x24, 0x2c, 0x67, 0xa2, 0xf6, 0x47, 0xa7, 0x68, - 0x1f, 0x84, 0xab, 0x33, 0x44, 0xc8, 0xb5, 0xc5, 0x89, 0x50, 0xf8, 0x8a, - 0xc5, 0xe9, 0x74, 0xbd, 0x45, 0xad, 0x7b, 0xa5, 0x72, 0x7f, 0x2c, 0x5d, - 0xe0, 0x01, 0xda, 0x0c, 0x96, 0xec, 0x14, 0xb8, 0x55, 0x35, 0x1d, 0xdb, - 0x9a, 0xda, 0x4e, 0x68, 0x51, 0xc7, 0xe4, 0x9c, 0x02, 0xa1, 0x3e, 0xb5, - 0x96, 0x59, 0x22, 0xf2, 0x72, 0x0b, 0x27, 0x38, 0xad, 0x3e, 0x64, 0x8a, - 0xe9, 0xf7, 0x88, 0xfe, 0x9c, 0x26, 0xf7, 0x73, 0x34, 0x23, 0x50, 0x09, - 0x7c, 0x5d, 0x02, 0xc6, 0x8a, 0xe4, 0x0a, 0x23, 0x44, 0x70, 0xe9, 0x79, - 0xdf, 0xe0, 0x95, 0x1a, 0xdc, 0x82, 0xd4, 0x14, 0x7a, 0x43, 0x5a, 0x71, - 0xd9, 0xd8, 0x5f, 0xaa, 0x9f, 0x24, 0xcb, 0xc7, 0x3f, 0x6b, 0x22, 0x2c, - 0xe6, 0x3c, 0xac, 0x14, 0x70, 0xc8, 0xc7, 0x3d, 0x1e, 0x8a, 0x26, 0x8a, - 0xf9, 0x95, 0x73, 0x31, 0x1c, 0x63, 0xef, 0x91, 0x6f, 0x1c, 0xe1, 0x4d, - 0xf1, 0xe4, 0xb6, 0x5e, 0x9c, 0x9e, 0x91, 0x16, 0xac, 0x22, 0x04, 0xfe, - 0xe7, 0x1f, 0x62, 0x2a, 0x84, 0x8d, 0xda, 0x33, 0xc8, 0xbe, 0x4d, 0xab, - 0x44, 0x1a, 0xce, 0xc4, 0xe6, 0x6c, 0x42, 0x9a, 0xda, 0xa8, 0x7c, 0xee, - 0x26, 0x93, 0x17, 0x39, 0xac, 0xdd, 0xff, 0x48, 0xc2, 0x21, 0xbf, 0xe4, - 0x46, 0x0f, 0x61, 0xdf, 0x09, 0xab, 0x8c, 0xf8, 0x58, 0xe8, 0x02, 0xd5, - 0xf7, 0xb2, 0x51, 0x9d, 0x62, 0x13, 0xa4, 0xba, 0x80, 0x39, 0x9a, 0x26, - 0xd4, 0xa6, 0xbb, 0x8f, 0x47, 0xd2, 0x8a, 0x40, 0x6b, 0x67, 0xf1, 0x9e, - 0xb8, 0x48, 0x2a, 0xc9, 0x5c, 0xfe, 0x36, 0x14, 0xeb, 0x8d, 0x53, 0x72, - 0xc3, 0x55, 0xcb, 0xcb, 0xb3, 0x17, 0xfa, 0xbb, 0x5f, 0x00, 0x6a, 0xe5, - 0x9e, 0x27, 0xfd, 0x69, 0x42, 0xdb, 0x00, 0xd8, 0xa5, 0x05, 0xb7, 0xcc, - 0x18, 0x44, 0xe8, 0x68, 0x33, 0x88, 0x25, 0x51, 0x26, 0x47, 0xc3, 0x4e, - 0xdb, 0xe8, 0xc3, 0x62, 0x0b, 0xc7, 0x2f, 0xb7, 0xf2, 0x40, 0xf5, 0x29, - 0x8e, 0x13, 0x36, 0x5b, 0x72, 0x2f, 0xbd, 0xbd, 0x59, 0xcc, 0x2b, 0x31, - 0x1d, 0xb4, 0x05, 0xbb, 0xa1, 0x82, 0x3b, 0x22, 0xb8, 0x37, 0x1e, 0x3d, - 0xa1, 0x68, 0xd4, 0xcd, 0x63, 0xa2, 0xd9, 0x40, 0xfa, 0x8a, 0x9e, 0x51, - 0x87, 0x82, 0x4a, 0x59, 0x2a, 0x3f, 0xaa, 0xa3, 0x7e, 0x9d, 0x75, 0x47, - 0x33, 0x76, 0x4b, 0x16, 0x0c, 0x70, 0xb7, 0x18, 0x85, 0x39, 0x48, 0x9a, - 0x81, 0x69, 0x2c, 0x10, 0xd5, 0x23, 0x82, 0xae, 0x54, 0xfb, 0x68, 0x05, - 0x9d, 0xf1, 0x4e, 0xbc, 0xaa, 0x04, 0xc8, 0xcf, 0xe3, 0xbd, 0xb3, 0x33, - 0x4e, 0xc8, 0x12, 0x6f, 0xb3, 0x7c, 0xc1, 0x1b, 0xc4, 0x94, 0x1f, 0x19, - 0xb6, 0x18, 0x44, 0x35, 0x33, 0x25, 0x25, 0x39, 0xe5, 0x62, 0x20, 0x83, - 0x40, 0x8c, 0x48, 0xe9, 0xd7, 0xe1, 0xa7, 0x5c, 0x8b, 0x53, 0x9d, 0x2e, - 0x74, 0x3b, 0x0b, 0xd1, 0xc2, 0xe1, 0x57, 0xc8, 0xae, 0x9a, 0x26, 0xb1, - 0xe9, 0xc7, 0x94, 0x83, 0x47, 0x55, 0x13, 0xa1, 0x87, 0x68, 0x46, 0xe8, - 0xeb, 0xd3, 0x5e, 0x41, 0xbb, 0xa3, 0x48, 0xcc, 0x7c, 0xb8, 0x7c, 0xbe, - 0xab, 0x26, 0x4c, 0x12, 0xaf, 0x4c, 0x91, 0xc6, 0x07, 0x6f, 0x4d, 0xc2, - 0xde, 0x5c, 0xf4, 0xb2, 0x95, 0xf7, 0x59, 0x16, 0x3c, 0x70, 0x42, 0x0c, - 0x7c, 0xc9, 0x65, 0x7f, 0xfb, 0x9c, 0xe3, 0xa5, 0x44, 0x2a, 0x2a, 0x08, - 0xa7, 0x28, 0xd6, 0x89, 0x77, 0x1d, 0x34, 0xca, 0xba, 0xc6, 0xf3, 0xc5, - 0x30, 0x00, 0xa4, 0xe3, 0x9c, 0x5f, 0xb6, 0x4d, 0xcc, 0x06, 0xf8, 0x5d, - 0x92, 0xfb, 0x5e, 0x05, 0x4b, 0x36, 0xa6, 0xa5, 0x5f, 0x5e, 0x9d, 0x8d, - 0x1e, 0xb8, 0x71, 0x23, 0x56, 0x37, 0x02, 0x88, 0x49, 0xaf, 0x55, 0x67, - 0x0b, 0xba, 0x53, 0x27, 0xf8, 0xf9, 0x51, 0x55, 0x2d, 0xf0, 0xf9, 0x60, - 0xd5, 0x2e, 0x07, 0x73, 0x2b, 0x06, 0x93, 0x1e, 0xd6, 0x8b, 0xbe, 0x8e, - 0x0e, 0xd2, 0xec, 0x7b, 0xdf, 0x32, 0xbe, 0x46, 0xfd, 0xca, 0xfd, 0xf0, - 0xdb, 0x0d, 0x5f, 0x29, 0xcb, 0xc5, 0x78, 0x4f, 0x43, 0xf4, 0xc8, 0xde, - 0x67, 0xab, 0xed, 0x86, 0x1e, 0x99, 0xa0, 0x47, 0x8d, 0x4d, 0x06, 0xf0, - 0x60, 0x48, 0x67, 0xce, 0xc2, 0xf4, 0x70, 0x99, 0x0b, 0x86, 0x30, 0xfd, - 0xa3, 0x5f, 0x82, 0xe9, 0xa5, 0x25, 0xd1, 0x5f, 0xbc, 0xf1, 0x40, 0xfc, - 0x94, 0x32, 0xdb, 0x9e, 0xe9, 0xd2, 0x2a, 0x95, 0x4f, 0x22, 0x74, 0x58, - 0x81, 0xad, 0xe2, 0xb2, 0xe0, 0x88, 0x4c, 0x91, 0x43, 0x59, 0xa6, 0x55, - 0xbb, 0x99, 0x7e, 0xbd, 0x59, 0xdc, 0x04, 0x26, 0x93, 0x51, 0x03, 0x01, - 0x74, 0x63, 0x75, 0x80, 0xbb, 0xe5, 0x5d, 0x3f, 0xa4, 0x33, 0xc4, 0x65, - 0x67, 0xbb, 0x35, 0x35, 0xbb, 0x60, 0x98, 0x17, 0x9c, 0xa5, 0x8a, 0x00, - 0x38, 0x51, 0xa4, 0x55, 0xbf, 0xe1, 0x4b, 0xc7, 0x8a, 0x2e, 0x66, 0xe9, - 0x73, 0x70, 0x07, 0x33, 0xee, 0x92, 0xb7, 0x82, 0x17, 0x66, 0x5b, 0x88, - 0x50, 0x0e, 0x5d, 0x69, 0x9d, 0xab, 0x0c, 0xe7, 0x7b, 0x8c, 0x71, 0x25, - 0xa5, 0x33, 0xc4, 0xcd, 0x0e, 0x54, 0xe0, 0xfb, 0x8b, 0xdd, 0xc8, 0xa0, - 0x40, 0xab, 0x9c, 0x61, 0xaa, 0xfa, 0xf0, 0xb6, 0xa4, 0x17, 0x60, 0xd8, - 0x2d, 0xff, 0x18, 0xf6, 0x10, 0xdd, 0x98, 0x50, 0x3c, 0x42, 0x1c, 0x5d, - 0x1d, 0x12, 0xae, 0x84, 0x6f, 0x5f, 0x93, 0x04, 0x16, 0x16, 0xd0, 0x17, - 0x9f, 0x88, 0xbc, 0xed, 0x3b, 0x71, 0x92, 0x98, 0xd0, 0x17, 0xdb, 0x8d, - 0x81, 0x00, 0xb8, 0xf4, 0xdf, 0x2a, 0xfe, 0x73, 0x5b, 0xe4, 0xdd, 0x9b, - 0x2b, 0xce, 0x87, 0x6a, 0x0e, 0x36, 0xc1, 0xd7, 0xe4, 0x00, 0x91, 0xaf, - 0x58, 0xff, 0x07, 0x7b, 0xc4, 0x33, 0x93, 0xd8, 0x5a, 0x6c, 0xe3, 0xbb, - 0x31, 0x6e, 0xf2, 0x7b, 0x13, 0x9e, 0xd3, 0xdf, 0xc2, 0x14, 0xef, 0xb1, - 0x37, 0xdf, 0xe1, 0xb7, 0xc7, 0xb4, 0x4a, 0x05, 0x21, 0xcc, 0xc9, 0xd2, - 0xfe, 0xc1, 0x11, 0x4b, 0x2c, 0x03, 0x2a, 0x05, 0x8d, 0x30, 0x11, 0xa5, - 0xd2, 0xfd, 0x0b, 0x80, 0x76, 0x21, 0x7e, 0xe3, 0xcb, 0x76, 0xc4, 0xca, - 0x9b, 0x78, 0x8b, 0xfe, 0x42, 0xb1, 0x59, 0x1b, 0x67, 0xe8, 0xb8, 0xa9, - 0x4f, 0x94, 0x4f, 0x7e, 0x1d, 0x92, 0x92, 0x4c, 0x85, 0x5c, 0x0f, 0xc6, - 0xb6, 0xac, 0xa2, 0xb2, 0x99, 0xec, 0xa0, 0x60, 0x41, 0xd1, 0xdb, 0xe2, - 0x76, 0xd5, 0xd3, 0xc5, 0x68, 0x6a, 0x2a, 0xf4, 0x64, 0xed, 0x5f, 0x48, - 0x44, 0xad, 0x7a, 0x9e, 0x6f, 0x96, 0xaf, 0xde, 0x00, 0xa7, 0xdf, 0xb6, - 0xe1, 0x48, 0xbc, 0x25, 0x82, 0x63, 0x2b, 0x98, 0x07, 0x2a, 0x4e, 0x56, - 0x89, 0xe1, 0x4a, 0x8b, 0xc0, 0x4e, 0x9f, 0xea, 0xed, 0x06, 0xcd, 0xb1, - 0x59, 0xc8, 0x19, 0x9f, 0x78, 0x9a, 0xd7, 0x5e, 0x01, 0x71, 0xd7, 0xb1, - 0x31, 0x36, 0x4c, 0x6e, 0x96, 0xd2, 0xea, 0xe4, 0x25, 0x11, 0x05, 0x0a, - 0x61, 0x18, 0xe3, 0x17, 0x2e, 0xcc, 0x24, 0x87, 0x82, 0x33, 0xa6, 0x51, - 0x75, 0x28, 0xf4, 0xee, 0xd2, 0x43, 0x53, 0xf7, 0x21, 0xfd, 0x48, 0x4b, - 0x2d, 0xbe, 0x34, 0xad, 0x16, 0xcc, 0xeb, 0xa9, 0xf0, 0x31, 0xc0, 0x01, - 0x36, 0xeb, 0x4f, 0xbc, 0x6d, 0x8c, 0x63, 0xf2, 0xbf, 0x35, 0xd7, 0x75, - 0x05, 0xa5, 0xfb, 0xe3, 0x44, 0x75, 0x06, 0x96, 0xc0, 0xea, 0xbb, 0xaf, - 0xfe, 0xc4, 0x0f, 0x5f, 0x17, 0x83, 0x85, 0x5b, 0x9b, 0x42, 0x83, 0xdf, - 0x64, 0x6c, 0x26, 0x09, 0x27, 0xc9, 0xa7, 0xc7, 0x97, 0x9e, 0xe7, 0x2f, - 0xc5, 0xac, 0x5d, 0x7e, 0x8f, 0x4e, 0xb7, 0x94, 0x2f, 0xec, 0x12, 0x13, - 0xc7, 0x6a, 0x86, 0xbe, 0x9c, 0x40, 0xf3, 0xd7, 0x8a, 0x6e, 0xa4, 0x0c, - 0x16, 0xd8, 0x4b, 0xe3, 0x73, 0x81, 0x3b, 0x44, 0x88, 0x31, 0x3f, 0x1b, - 0x5e, 0x3c, 0xfb, 0xca, 0xcb, 0x6d, 0xfe, 0xf1, 0x7f, 0x91, 0xb0, 0x64, - 0x9f, 0x3d, 0x1a, 0xca, 0xed, 0x42, 0x5e, 0xd4, 0xda, 0x2b, 0x18, 0x1b, - 0x1a, 0xa8, 0xea, 0xb8, 0x14, 0xfa, 0x83, 0x5c, 0x22, 0xc9, 0x2f, 0x76, - 0x3a, 0xc1, 0xb1, 0xd1, 0x4e, 0x82, 0xc6, 0x08, 0xbe, 0x96, 0x3d, 0xd1, - 0x26, 0x3f, 0xa5, 0xba, 0x0b, 0x8c, 0x66, 0xa8, 0x50, 0xad, 0x0e, 0xc6, - 0x58, 0xaa, 0x9d, 0x8d, 0xe4, 0x6e, 0x28, 0x8e, 0x51, 0x22, 0x05, 0x4d, - 0xc6, 0xe6, 0x85, 0x5a, 0x27, 0x37, 0x3d, 0x0e, 0x3e, 0xe6, 0x76, 0x95, - 0x7b, 0x62, 0x40, 0x91, 0x22, 0x20, 0xf4, 0xaf, 0xf0, 0x2e, 0x25, 0x05, - 0xf2, 0xcb, 0x6d, 0xcd, 0x5e, 0x08, 0x04, 0x4b, 0xc1, 0x7e, 0x9e, 0x1f, - 0xc0, 0x77, 0x7c, 0x9e, 0x2c, 0xf9, 0x5f, 0x37, 0x7a, 0x3d, 0xd4, 0xbd, - 0x74, 0x15, 0xaf, 0xcb, 0xaf, 0xf0, 0x73, 0x5a, 0xfa, 0x7d, 0x6d, 0xb8, - 0xfa, 0x05, 0x41, 0x18, 0xad, 0x9b, 0xa5, 0x18, 0xae, 0x70, 0xc5, 0x7f, - 0x41, 0xcc, 0x8a, 0x17, 0x8e, 0x9c, 0x3f, 0x8c, 0xd5, 0x5f, 0xba, 0x82, - 0xc9, 0x98, 0xf7, 0x10, 0x30, 0x51, 0x18, 0x02, 0xa0, 0xd3, 0xad, 0x9a, - 0x85, 0xf7, 0x7f, 0x15, 0x57, 0xec, 0x23, 0x22, 0x51, 0x8f, 0xb3, 0xf8, - 0x09, 0xe5, 0x55, 0xe3, 0x1a, 0xef, 0x84, 0xbe, 0xbf, 0xb5, 0x18, 0xcb, - 0xae, 0x53, 0x21, 0xb8, 0xbd, 0x35, 0x0c, 0x41, 0xaf, 0xd9, 0x90, 0x81, - 0x4f, 0xf3, 0xd3, 0x82, 0xc3, 0x79, 0xeb, 0x26, 0xcc, 0xc2, 0xfb, 0x6f, - 0x02, 0x45, 0xac, 0xe8, 0x74, 0xbb, 0x9d, 0x63, 0x3d, 0x58, 0x16, 0x00, - 0xc4, 0xe4, 0x7e, 0xcb, 0x6d, 0x2c, 0xdd, 0x74, 0xb9, 0xd6, 0x74, 0x17, - 0x5b, 0xe1, 0x84, 0xc1, 0x85, 0x43, 0x28, 0x67, 0x3d, 0xad, 0xbd, 0xf0, - 0xaa, 0x8e, 0x1e, 0xe6, 0x2f, 0xb2, 0x11, 0xae, 0xc6, 0x76, 0x84, 0xef, - 0x16, 0xaf, 0x54, 0x73, 0x02, 0x60, 0xdc, 0x49, 0xd1, 0x06, 0x9d, 0xcb, - 0xae, 0x89, 0x40, 0xa1, 0x3a, 0x76, 0x4b, 0x8b, 0x2b, 0x37, 0x4b, 0x19, - 0x22, 0x38, 0x99, 0x90, 0xf8, 0xc7, 0xae, 0x01, 0x36, 0x89, 0x30, 0xa0, - 0xcf, 0xcc, 0x83, 0xc7, 0xad, 0xd0, 0xb5, 0x7a, 0xdf, 0x6a, 0xc1, 0x0c, - 0x53, 0x05, 0x72, 0x8f, 0x7c, 0x3c, 0xd7, 0x2d, 0x09, 0x26, 0xf6, 0xe6, - 0x9f, 0xaa, 0x0d, 0xbe, 0x52, 0x42, 0xfd, 0xf9, 0xda, 0x72, 0x79, 0x43, - 0xe6, 0xcb, 0xbe, 0x99, 0xca, 0x8a, 0xac, 0x69, 0x9d, 0x03, 0x0f, 0xe7, - 0x6b, 0x29, 0x95, 0xf6, 0xdf, 0xde, 0x27, 0x22, 0x47, 0x61, 0x7f, 0xae, - 0xac, 0x40, 0xe9, 0xc4, 0x17, 0x22, 0x90, 0x1d, 0x61, 0xbf, 0xe6, 0x10, - 0xee, 0x88, 0x3e, 0x68, 0x35, 0x91, 0xcd, 0x22, 0x9c, 0x40, 0x64, 0x85, - 0x3a, 0x2a, 0xd0, 0x93, 0x2d, 0xf7, 0xe2, 0x63, 0x3f, 0xff, 0xb5, 0xa7, - 0x2f, 0x48, 0x0f, 0x68, 0xce, 0xde, 0xf6, 0x44, 0x03, 0xb0, 0x92, 0xe6, - 0xea, 0xa0, 0x67, 0x1f, 0xc0, 0x3e, 0x0e, 0x69, 0x99, 0xc9, 0x97, 0x4d, - 0x50, 0x03, 0x0c, 0x72, 0xee, 0x90, 0x0c, 0x20, 0x1e, 0x1a, 0x82, 0xd6, - 0xa1, 0x99, 0x40, 0xf0, 0xe6, 0x2f, 0x3d, 0x26, 0x1e, 0xd9, 0xe6, 0x41, - 0x03, 0xc8, 0xa5, 0x85, 0x67, 0xd6, 0xfb, 0x37, 0xd5, 0x35, 0x66, 0xfc, - 0x50, 0x63, 0xb8, 0x76, 0x83, 0x6e, 0x5c, 0xb6, 0x3e, 0xdd, 0xfb, 0xca, - 0xc1, 0x96, 0x56, 0x66, 0xed, 0x9a, 0x4a, 0x90, 0x8b, 0x1c, 0x82, 0x9b, - 0xe8, 0x8d, 0x22, 0x43, 0x89, 0x54, 0x70, 0x18, 0x8a, 0x84, 0x47, 0x7e, - 0xcd, 0x0c, 0x3d, 0x91, 0x7e, 0xce, 0xe8, 0xbe, 0xdb, 0xb1, 0x65, 0xf8, - 0xb9, 0x78, 0x52, 0xef, 0x95, 0xcb, 0x7c, 0x11, 0xd4, 0x52, 0x4f, 0x75, - 0xcc, 0x8c, 0x9a, 0x17, 0xdb, 0x2f, 0x2a, 0x35, 0x10, 0x64, 0xb6, 0xc5, - 0x42, 0x75, 0x83, 0x15, 0x1e, 0x87, 0x07, 0xfe, 0x5f, 0xa8, 0x4c, 0xaf, - 0x86, 0xb4, 0x81, 0x21, 0xb3, 0x16, 0x76, 0x75, 0x91, 0x6d, 0x19, 0xac, - 0xea, 0x4c, 0x59, 0x8b, 0xdb, 0xb5, 0xc7, 0x78, 0xa9, 0xd6, 0x48, 0x29, - 0x11, 0x4d, 0x57, 0x27, 0x14, 0x67, 0x05, 0x71, 0x48, 0x47, 0xbd, 0xfa, - 0xd8, 0x4d, 0x49, 0x69, 0xb6, 0x75, 0x04, 0xbf, 0xf6, 0xfd, 0x27, 0x62, - 0x82, 0xda, 0x1d, 0xad, 0xef, 0x45, 0x20, 0xeb, 0x7e, 0x55, 0xe9, 0x92, - 0x1a, 0x58, 0x3d, 0x02, 0xa8, 0xb6, 0x7a, 0x2e, 0x5d, 0xf8, 0xb1, 0x98, - 0xcc, 0xcf, 0xda, 0x8a, 0x0b, 0x29, 0x65, 0xd5, 0x95, 0x4a, 0x3a, 0xab, - 0x5c, 0x04, 0x95, 0x1f, 0xbe, 0x68, 0x1a, 0x12, 0xf4, 0x03, 0x29, 0x66, - 0xbd, 0xbc, 0x90, 0xd2, 0xd5, 0xa5, 0x49, 0x08, 0x5b, 0x52, 0x59, 0x83, - 0x92, 0x18, 0xbf, 0xbf, 0x08, 0x60, 0x78, 0xc5, 0x40, 0x04, 0xd6, 0x10, - 0x9e, 0x87, 0x06, 0xfe, 0x5f, 0xa8, 0x4c, 0x8f, 0x3c, 0xd4, 0x08, 0xaa, - 0x90, 0x06, 0x10, 0x25, 0x1c, 0x67, 0xd9, 0x3f, 0x18, 0x85, 0x1d, 0x6c, - 0x29, 0xb6, 0xf1, 0xf8, 0x0f, 0x29, 0x63, 0x1e, 0xcf, 0x7f, 0x2b, 0x68, - 0xc6, 0x82, 0xe3, 0xd7, 0xfa, 0x08, 0x28, 0x5a, 0xc5, 0xf9, 0xef, 0xa7, - 0x24, 0x51, 0x80, 0x79, 0x1f, 0x86, 0x1a, 0x46, 0x7e, 0xb3, 0xe1, 0x32, - 0xbc, 0xa1, 0x5d, 0x81, 0x5d, 0x72, 0x17, 0x92, 0x92, 0xfc, 0x6a, 0x9a, - 0x38, 0xb6, 0x9d, 0x30, 0x51, 0x8b, 0xb5, 0x70, 0xe0, 0xd7, 0x4e, 0x7c, - 0x37, 0x6b, 0x18, 0x44, 0x9a, 0xf0, 0x55, 0xde, 0x25, 0x91, 0x2c, 0x6d, - 0x88, 0x78, 0xf7, 0x35, 0xd3, 0x37, 0x06, 0x81, 0xa3, 0xa3, 0x6d, 0x43, - 0x6f, 0x53, 0x68, 0x62, 0xe0, 0xe0, 0x2d, 0xdd, 0x0e, 0x56, 0xee, 0x6d, - 0xc4, 0xb3, 0x5a, 0x87, 0xf6, 0xe3, 0x6b, 0x55, 0xb5, 0x91, 0x1e, 0x00, - 0x48, 0x86, 0xd5, 0x77, 0xa6, 0xbf, 0xc0, 0xea, 0x1b, 0xb7, 0x50, 0x31, - 0x9f, 0xb3, 0xe6, 0xca, 0xe1, 0xc2, 0x37, 0xe5, 0x6e, 0x78, 0xe1, 0xd6, - 0x9e, 0xa7, 0xeb, 0x22, 0xfc, 0x4f, 0x5e, 0xe2, 0xa4, 0x53, 0x1a, 0x01, - 0xff, 0x97, 0xe0, 0x81, 0x4a, 0x44, 0x1d, 0x93, 0x76, 0xa7, 0xa8, 0x25, - 0x4d, 0x8d, 0x61, 0x1c, 0xad, 0x78, 0x0a, 0xeb, 0xed, 0xc9, 0x3f, 0x9a, - 0x72, 0x60, 0x29, 0x40, 0x26, 0x6c, 0x27, 0x62, 0x5b, 0x71, 0x10, 0x30, - 0x28, 0xa0, 0x77, 0x36, 0x4f, 0x74, 0xd8, 0x6e, 0x10, 0x08, 0x32, 0x7b, - 0x84, 0x92, 0x5b, 0x86, 0x37, 0x44, 0xde, 0x90, 0xa1, 0x2b, 0x2f, 0x81, - 0x29, 0x4b, 0x38, 0xb7, 0x66, 0x8f, 0xa7, 0x19, 0x4e, 0x80, 0xa6, 0x9b, - 0x40, 0xd8, 0xee, 0xea, 0xa4, 0x44, 0xce, 0x2c, 0xa4, 0x9e, 0x04, 0x75, - 0xee, 0xf0, 0x3b, 0x30, 0x83, 0x64, 0x63, 0xb6, 0xf0, 0x22, 0xa4, 0x99, - 0x46, 0x17, 0xcc, 0xd2, 0x4e, 0xd0, 0x03, 0xe1, 0xc6, 0x5c, 0x25, 0x62, - 0x21, 0x43, 0x20, 0xf8, 0x9f, 0x33, 0xbc, 0x04, 0xc9, 0x40, 0x7f, 0x79, - 0x18, 0x58, 0x92, 0xac, 0x4a, 0xef, 0x05, 0xf2, 0x63, 0x46, 0x3d, 0x83, - 0x22, 0xe8, 0x97, 0x98, 0x7c, 0x6f, 0x28, 0xc8, 0x4a, 0x31, 0x9e, 0x94, - 0x73, 0x9b, 0xf3, 0x9d, 0xd0, 0xbc, 0xc2, 0x75, 0xf6, 0x9b, 0xbc, 0x4c, - 0x61, 0xfb, 0xe9, 0x67, 0x2a, 0x0c, 0x42, 0xfc, 0xc1, 0x6d, 0x7e, 0x7d, - 0x88, 0x75, 0x4d, 0x06, 0x5a, 0xf7, 0xff, 0xc7, 0x77, 0x51, 0x6a, 0xad, - 0x6e, 0x5c, 0xdb, 0xa5, 0xb0, 0xd6, 0x0b, 0xb7, 0x20, 0x83, 0x14, 0x24, - 0xb1, 0x93, 0x92, 0x1c, 0x00, 0xb1, 0x81, 0xec, 0xdf, 0x78, 0xbc, 0xbb, - 0x71, 0xba, 0x81, 0x32, 0x06, 0xca, 0x57, 0x5a, 0x43, 0x10, 0x23, 0x9c, - 0x90, 0xd6, 0x57, 0x4e, 0xac, 0xd7, 0x79, 0xc4, 0x36, 0xeb, 0x4b, 0x0e, - 0x32, 0x65, 0xd5, 0x9e, 0x70, 0x63, 0xdf, 0xe6, 0xfc, 0x3f, 0x1c, 0xfb, - 0x67, 0x98, 0xcd, 0x28, 0x2e, 0x93, 0x89, 0x0b, 0x55, 0xfa, 0x2d, 0xaf, - 0x65, 0x75, 0x82, 0x58, 0x17, 0xd5, 0xa3, 0x2c, 0xa5, 0x49, 0xa5, 0xd8, - 0xb9, 0x03, 0x92, 0xf6, 0x95, 0x90, 0x6c, 0x37, 0xe7, 0x7f, 0xdb, 0x00, - 0x52, 0xba, 0xef, 0x9a, 0x41, 0xd1, 0xda, 0xc1, 0xdc, 0x92, 0xdf, 0xee, - 0xfb, 0xaa, 0xdb, 0x10, 0xd0, 0xf7, 0xd8, 0x4b, 0x4c, 0xb1, 0xa3, 0x57, - 0xd1, 0xd2, 0x68, 0x14, 0x99, 0xf1, 0xa2, 0x4d, 0xd8, 0x91, 0x3c, 0xfa, - 0xc8, 0x53, 0xc3, 0x4e, 0x8f, 0xb9, 0x35, 0x61, 0x6f, 0xfe, 0x4e, 0x71, - 0x1b, 0x84, 0x6d, 0x84, 0xeb, 0xda, 0x98, 0x37, 0x25, 0x58, 0x84, 0xa1, - 0x07, 0x59, 0x4f, 0x62, 0xec, 0xb9, 0x99, 0x17, 0xff, 0x78, 0xe5, 0xf5, - 0x3b, 0xfc, 0xfc, 0x7d, 0x7d, 0xe0, 0xf4, 0x04, 0x5c, 0x6f, 0x02, 0x31, - 0xfb, 0xe1, 0xd8, 0x8a, 0x89, 0x88, 0x38, 0x52, 0x1b, 0xcb, 0x6c, 0x62, - 0xee, 0xc3, 0xc6, 0xf2, 0x6c, 0x65, 0x70, 0x55, 0xc9, 0xd2, 0xac, 0x8f, - 0x17, 0x60, 0xd2, 0xe5, 0x29, 0x9b, 0x16, 0xa4, 0x71, 0x6f, 0x9e, 0xdf, - 0xa1, 0xc3, 0xa2, 0xc8, 0x36, 0xef, 0x0f, 0x58, 0x89, 0x48, 0xf0, 0x08, - 0x90, 0xc6, 0xe8, 0x5b, 0x3c, 0x1a, 0x04, 0xa2, 0xbb, 0xe2, 0x35, 0x34, - 0xad, 0x14, 0xc1, 0xaa, 0x68, 0x17, 0x6c, 0xb7, 0x66, 0xf7, 0x05, 0x77, - 0x3b, 0xfd, 0x16, 0x62, 0x64, 0x7d, 0xe9, 0x4a, 0x0d, 0x48, 0xf4, 0x30, - 0x45, 0xc8, 0x94, 0xd2, 0x98, 0xb1, 0x19, 0x62, 0x18, 0x7a, 0x8e, 0xfb, - 0xf0, 0x34, 0xca, 0xfb, 0xa6, 0xfd, 0x41, 0x19, 0xcc, 0xe5, 0xc6, 0x54, - 0x80, 0x10, 0x17, 0x54, 0xc5, 0x28, 0x3f, 0x03, 0x55, 0xb5, 0xc8, 0xbf, - 0x18, 0xb6, 0x49, 0x9e, 0xdc, 0x68, 0xeb, 0x81, 0x12, 0x71, 0x3f, 0xba, - 0x52, 0x38, 0xf7, 0x01, 0xea, 0x7f, 0xcb, 0xa6, 0xa4, 0xd0, 0x7b, 0x84, - 0xbe, 0x45, 0x63, 0x3c, 0x2d, 0x5b, 0x2a, 0x5c, 0xcc, 0xe7, 0x28, 0x37, - 0x93, 0xf2, 0x95, 0xcf, 0x21, 0x43, 0x4b, 0xd3, 0xde, 0xc0, 0x1f, 0x6b, - 0x5b, 0xd4, 0x06, 0x98, 0x2a, 0x38, 0xd2, 0xc4, 0x55, 0x8e, 0xd6, 0x50, - 0xd8, 0x9b, 0xc9, 0x58, 0x43, 0xdf, 0x77, 0xf9, 0x23, 0x2d, 0xfb, 0x10, - 0x05, 0x2f, 0x7e, 0x61, 0x21, 0x0c, 0x42, 0x00, 0x5c, 0x8f, 0xe9, 0xb3, - 0xd3, 0x2a, 0x49, 0x19, 0xc8, 0x78, 0x62, 0xe4, 0xc4, 0x2e, 0x00, 0x0c, - 0x50, 0xc5, 0x5e, 0x45, 0x97, 0xe6, 0xbe, 0x4d, 0x8e, 0x4b, 0x27, 0xce, - 0x03, 0x1e, 0xeb, 0x05, 0x1f, 0xdd, 0xd6, 0x5c, 0xbf, 0x4a, 0x30, 0xad, - 0x84, 0xe0, 0x3d, 0xd3, 0x55, 0x91, 0x11, 0x76, 0x6b, 0xd2, 0x4a, 0x8c, - 0x41, 0xfc, 0x49, 0xcc, 0x9d, 0x61, 0xd3, 0x68, 0xc2, 0xf9, 0x28, 0x58, - 0x9d, 0x4b, 0x97, 0x51, 0xd3, 0x7a, 0x28, 0xb6, 0x43, 0x83, 0x62, 0x5c, - 0xb4, 0xb2, 0x63, 0x0b, 0x30, 0xd3, 0x52, 0x80, 0x2d, 0x7f, 0x64, 0x34, - 0x90, 0x70, 0x54, 0x60, 0x54, 0xc5, 0x3d, 0x0d, 0xdd, 0xaa, 0xf6, 0x11, - 0x58, 0xc1, 0xa2, 0x19, 0x99, 0x48, 0xa9, 0x7d, 0xa6, 0x59, 0xc9, 0x6e, - 0x6d, 0x69, 0x05, 0xf2, 0x21, 0x22, 0xef, 0xbc, 0x19, 0x31, 0x0d, 0xad, - 0xe5, 0xd8, 0x79, 0xf1, 0x52, 0x4b, 0xed, 0xd4, 0x48, 0x59, 0x69, 0x76, - 0xec, 0xad, 0xf3, 0xf8, 0x13, 0x30, 0x5d, 0xd3, 0xc1, 0x48, 0xab, 0x07, - 0x6d, 0x9d, 0x10, 0x66, 0xf7, 0x7c, 0x7b, 0xa6, 0x93, 0x75, 0xe1, 0xc6, - 0xda, 0xca, 0x73, 0x57, 0x48, 0x25, 0xd5, 0xc0, 0x2e, 0x0f, 0xbc, 0xec, - 0x91, 0x6c, 0x77, 0xc8, 0xc9, 0xbd, 0x62, 0xcc, 0x37, 0xbd, 0x01, 0xe0, - 0x41, 0x3d, 0x40, 0xec, 0xf4, 0xbc, 0x4b, 0x17, 0x58, 0x24, 0xe1, 0x31, - 0x5d, 0xc8, 0xdb, 0x1c, 0x0d, 0xd9, 0xa0, 0x84, 0x9e, 0x3a, 0xdf, 0xb7, - 0xe9, 0x58, 0xad, 0x00, 0x94, 0x60, 0x9e, 0x10, 0xe7, 0x0c, 0x1e, 0x2b, - 0xca, 0x81, 0xaf, 0xa0, 0xe6, 0xfb, 0x62, 0x40, 0xd5, 0xc6, 0x18, 0x63, - 0xae, 0x41, 0x5e, 0x02, 0x0d, 0x44, 0xd4, 0x61, 0x6e, 0x1f, 0xfa, 0x83, - 0x99, 0xd8, 0x54, 0x04, 0x14, 0x73, 0xdc, 0xaa, 0xe2, 0x74, 0x28, 0x7d, - 0x50, 0x7d, 0xa5, 0x8d, 0x30, 0x72, 0x5f, 0x62, 0xfb, 0xd6, 0x00, 0x6f, - 0xec, 0x35, 0x68, 0x43, 0x90, 0xef, 0x3f, 0x76, 0xaf, 0x35, 0xc4, 0xa8, - 0xcf, 0xc6, 0x2b, 0x5b, 0xf5, 0x09, 0xfa, 0xd2, 0x81, 0x5c, 0x3d, 0xa2, - 0xdf, 0xf4, 0x93, 0xe4, 0x67, 0xa8, 0x2e, 0x6d, 0xcd, 0xa3, 0xe6, 0x15, - 0x0a, 0x6e, 0x2b, 0x2d, 0x84, 0xe8, 0xb1, 0xac, 0xaf, 0xb2, 0x76, 0xc9, - 0xbc, 0xb8, 0xa6, 0x8a, 0xe1, 0x6a, 0x6f, 0x95, 0x97, 0xb3, 0x3a, 0xc7, - 0x1c, 0x82, 0xee, 0x04, 0xa1, 0xd3, 0xd9, 0xd3, 0x68, 0x8d, 0x0f, 0xc7, - 0x3f, 0xfc, 0x43, 0x4f, 0xc8, 0x23, 0x8e, 0xc1, 0x13, 0x6b, 0x2a, 0xf5, - 0x3b, 0xa1, 0x16, 0x3e, 0x6d, 0xc7, 0x65, 0x80, 0x90, 0x6d, 0x17, 0x66, - 0x09, 0xac, 0xff, 0xcb, 0xd1, 0x8f, 0xd1, 0xe6, 0x88, 0x39, 0xde, 0x86, - 0xba, 0xbb, 0xbf, 0x60, 0xe4, 0x73, 0x7c, 0x89, 0xf7, 0x53, 0x42, 0x2a, - 0x31, 0x67, 0x0f, 0x52, 0x62, 0xef, 0xa3, 0x3f, 0x8c, 0x0e, 0x5c, 0xfd, - 0x22, 0xcf, 0x14, 0x56, 0xfa, 0x67, 0x3a, 0x3a, 0x31, 0x7f, 0x70, 0xfa, - 0xbf, 0xb2, 0xd1, 0x30, 0x33, 0x47, 0x8a, 0x37, 0x94, 0x21, 0x1c, 0x0e, - 0x59, 0x64, 0x81, 0xdd, 0xb4, 0x8b, 0x1e, 0x99, 0x5e, 0x9a, 0xdf, 0x66, - 0xe3, 0xe2, 0x8e, 0xb5, 0xb4, 0x43, 0x33, 0x12, 0x27, 0x21, 0x4b, 0xe8, - 0x6b, 0x23, 0x29, 0x4d, 0xb7, 0x53, 0xb6, 0x0c, 0xc4, 0xef, 0xd7, 0x7a, - 0xab, 0x21, 0x32, 0xf0, 0xe0, 0x9d, 0x24, 0xb4, 0xb5, 0x02, 0xb6, 0x5e, - 0xb2, 0x0b, 0xb4, 0xcb, 0xfc, 0x09, 0x56, 0x03, 0x32, 0xd2, 0xe4, 0xd2, - 0xe4, 0xda, 0x43, 0xf4, 0xeb, 0x2a, 0x9a, 0xd2, 0x26, 0xfa, 0x08, 0x0a, - 0x1f, 0x58, 0x88, 0x91, 0x6e, 0x4b, 0x7e, 0xbc, 0x42, 0x9b, 0x53, 0x24, - 0x47, 0x67, 0x23, 0x72, 0x61, 0x81, 0x37, 0x17, 0x60, 0x2c, 0x80, 0xc8, - 0x7a, 0xdc, 0xa4, 0xc4, 0x6d, 0x20, 0x71, 0x63, 0x1e, 0xdf, 0x54, 0xf8, - 0xfb, 0x3d, 0xda, 0x0a, 0xcc, 0x57, 0xc4, 0xf6, 0x9c, 0x8e, 0x12, 0xb6, - 0xb6, 0xb0, 0x7d, 0x57, 0x9c, 0x28, 0x9a, 0xe1, 0x2f, 0x2e, 0xa9, 0x86, - 0x9f, 0x1f, 0xf0, 0xdb, 0xde, 0x7d, 0x5f, 0xd6, 0xed, 0xc7, 0xb9, 0xb0, - 0xb7, 0x4f, 0x8b, 0x88, 0xf8, 0x19, 0x0f, 0x72, 0x45, 0x96, 0x32, 0x7f, - 0x4e, 0xd0, 0xda, 0x77, 0xb4, 0xa8, 0x14, 0xeb, 0x2c, 0x01, 0xd1, 0xa1, - 0x90, 0x44, 0x52, 0x64, 0x15, 0x72, 0x8b, 0x23, 0xc9, 0x8b, 0x6b, 0xd7, - 0x78, 0xa7, 0x20, 0x18, 0x9b, 0x5e, 0xe6, 0x58, 0xeb, 0x4a, 0x97, 0x38, - 0xcf, 0xaf, 0x3b, 0xdf, 0xb8, 0xaa, 0x08, 0xad, 0x9a, 0x6a, 0x07, 0xcb, - 0xfb, 0xdb, 0xbf, 0x1f, 0x28, 0x03, 0x14, 0xb3, 0x0e, 0xdb, 0xae, 0x13, - 0x0c, 0xdf, 0x71, 0xc6, 0x7d, 0xba, 0x71, 0x5b, 0xbe, 0x61, 0xbb, 0x78, - 0xd6, 0xcb, 0x06, 0x74, 0xf6, 0xa4, 0x25, 0x79, 0xe0, 0x88, 0xb3, 0xca, - 0x64, 0x5c, 0x8e, 0xcf, 0x45, 0x5b, 0xa3, 0x31, 0x0f, 0x06, 0xa9, 0xc9, - 0xce, 0xef, 0xd4, 0x15, 0x2b, 0x06, 0x5c, 0x29, 0x7c, 0x8c, 0x4e, 0xde, - 0xae, 0xa5, 0xd4, 0xd8, 0xe6, 0x76, 0x0a, 0xc1, 0xb5, 0x68, 0x45, 0x53, - 0xe2, 0x2e, 0x6a, 0xfe, 0xea, 0xaa, 0x40, 0x29, 0x6a, 0x38, 0x5d, 0xef, - 0x00, 0x6c, 0x8f, 0x40, 0xb6, 0x89, 0xe2, 0xde, 0xe8, 0x38, 0xa7, 0xdb, - 0x34, 0xec, 0x7a, 0xeb, 0xf6, 0xa6, 0x54, 0x98, 0x0b, 0xd2, 0x41, 0x44, - 0x5d, 0xa0, 0x54, 0x15, 0xde, 0x41, 0xab, 0x88, 0xb9, 0x7a, 0x5a, 0x0b, - 0x45, 0xf0, 0x9a, 0x97, 0x5c, 0xa0, 0x04, 0xf4, 0xab, 0xad, 0x38, 0x96, - 0x63, 0x81, 0x32, 0xb1, 0x1e, 0x83, 0xfe, 0x2d, 0x0d, 0xe8, 0xae, 0xe1, - 0x70, 0x92, 0x55, 0x86, 0x1b, 0xf6, 0xfd, 0xe7, 0x1f, 0x81, 0x48, 0x37, - 0x6c, 0x13, 0x51, 0x0d, 0x08, 0xe4, 0x86, 0x93, 0xad, 0x69, 0xa1, 0xe8, - 0x03, 0x71, 0xd1, 0xc8, 0x55, 0x30, 0x51, 0xf8, 0x89, 0xdf, 0xb0, 0x9d, - 0x08, 0xe0, 0x55, 0x4c, 0xa3, 0x09, 0xcf, 0x2d, 0x4d, 0xcb, 0xb6, 0x3f, - 0xeb, 0x27, 0x6c, 0xaf, 0xf1, 0xde, 0xc9, 0x18, 0xbb, 0xbf, 0xce, 0xd4, - 0x78, 0x68, 0x2e, 0x39, 0xb5, 0x31, 0x4e, 0x9b, 0xe5, 0x08, 0x1b, 0x05, - 0x24, 0x14, 0x8f, 0x1a, 0x7e, 0x3c, 0xfb, 0xca, 0xd1, 0x41, 0xc0, 0xcd, - 0xef, 0x65, 0x08, 0xeb, 0xcc, 0x8d, 0xeb, 0x50, 0xde, 0x4a, 0x99, 0x66, - 0x0f, 0xfb, 0x49, 0xbc, 0x2b, 0x8e, 0x78, 0xc7, 0x72, 0xbf, 0xef, 0x68, - 0x99, 0x07, 0x99, 0xcc, 0xf0, 0xc6, 0x86, 0x8a, 0xa8, 0xca, 0x08, 0xe0, - 0x77, 0x50, 0x2b, 0xbd, 0x58, 0x95, 0xcd, 0x3f, 0x1a, 0x05, 0xb9, 0x37, - 0x79, 0x00, 0xb4, 0x80, 0x4e, 0xdf, 0x8c, 0xc8, 0xed, 0xd1, 0x56, 0x41, - 0xea, 0x4b, 0x9e, 0x1b, 0x9c, 0xe6, 0xf4, 0xd7, 0xd9, 0x49, 0x7d, 0xe6, - 0x9c, 0xd3, 0xb8, 0xfb, 0x1f, 0x53, 0x56, 0x08, 0x5b, 0x1b, 0x3b, 0x14, - 0x7a, 0x8d, 0x06, 0x9a, 0xfc, 0x9b, 0xc9, 0xb9, 0x2b, 0x5c, 0x3d, 0x1a, - 0x48, 0x43, 0x07, 0x6e, 0xa9, 0x76, 0x25, 0x5e, 0xd6, 0x5c, 0x2f, 0xa0, - 0x25, 0x40, 0x4a, 0x49, 0x21, 0x93, 0x47, 0x10, 0x95, 0x98, 0x8c, 0xa0, - 0x69, 0x42, 0x49, 0xd7, 0xc0, 0xe3, 0xd8, 0xc2, 0xa4, 0xe8, 0x9d, 0xb1, - 0xed, 0xcb, 0x4b, 0x67, 0xde, 0xde, 0x4e, 0x99, 0x20, 0xa5, 0xe3, 0x49, - 0xa5, 0xa3, 0xf8, 0xe7, 0x90, 0x8c, 0xcb, 0x9f, 0xda, 0x99, 0x57, 0x9b, - 0x6e, 0x7f, 0x9e, 0x29, 0xa3, 0xc5, 0xf0, 0xcd, 0xe8, 0xd3, 0xa6, 0xf0, - 0x3a, 0x2f, 0xa4, 0xac, 0xd8, 0x35, 0xdb, 0x39, 0x46, 0x53, 0x62, 0x3d, - 0x75, 0x93, 0x08, 0x40, 0x94, 0x92, 0x87, 0x50, 0x5f, 0xb4, 0x9c, 0x6e, - 0xab, 0x89, 0x1c, 0x83, 0xdc, 0x04, 0x42, 0x3c, 0x29, 0x87, 0x84, 0x24, - 0xb5, 0x36, 0x95, 0xdc, 0x15, 0xc3, 0x8a, 0x7b, 0xf4, 0x7f, 0x32, 0xc8, - 0x2b, 0x68, 0xce, 0xb9, 0xd3, 0x82, 0xac, 0xa1, 0xdc, 0x5f, 0x0f, 0x59, - 0xd1, 0xa8, 0xa7, 0xae, 0xd7, 0x79, 0xba, 0xd0, 0xa1, 0x1d, 0x13, 0xc5, - 0x0e, 0x65, 0x6d, 0x27, 0xa3, 0x24, 0x08, 0x37, 0xb6, 0x74, 0xd0, 0x44, - 0xb9, 0x55, 0x9d, 0xe2, 0xaa, 0xb3, 0x1d, 0x7e, 0xf1, 0x11, 0xf6, 0xe2, - 0xcd, 0x55, 0xe4, 0x44, 0xf6, 0x09, 0x41, 0x6f, 0x85, 0xb3, 0xca, 0x71, - 0x5d, 0x72, 0x9c, 0x7e, 0x61, 0xf2, 0x69, 0x27, 0xaf, 0xb1, 0xc7, 0x04, - 0x96, 0x8b, 0xa2, 0x85, 0x9a, 0x29, 0xd4, 0x4a, 0xcd, 0x57, 0x5b, 0x1d, - 0xfe, 0x43, 0x99, 0x27, 0x3e, 0x83, 0xef, 0xc6, 0xcf, 0x41, 0xdd, 0x19, - 0x13, 0x4b, 0xe6, 0x7a, 0x70, 0xbd, 0x79, 0x25, 0x48, 0xab, 0x82, 0x1f, - 0xec, 0x6f, 0x9c, 0xb8, 0xe6, 0x70, 0xa1, 0x82, 0x39, 0x0e, 0x4f, 0x80, - 0xd3, 0x07, 0x1a, 0x90, 0x9d, 0x42, 0x86, 0x0d, 0x34, 0x7a, 0x69, 0xaf, - 0xf2, 0x46, 0x93, 0x20, 0xe7, 0xb0, 0xc0, 0x46, 0xc0, 0xae, 0x87, 0x95, - 0x22, 0xda, 0xa6, 0xa2, 0x71, 0x39, 0x14, 0xf1, 0xb6, 0xa9, 0x17, 0x4a, - 0xab, 0xe0, 0xd9, 0x74, 0x7d, 0x16, 0xd2, 0x42, 0x53, 0xf5, 0x24, 0x3e, - 0x3d, 0x12, 0x3b, 0x73, 0x05, 0xf7, 0x40, 0x32, 0x4a, 0x02, 0x87, 0x45, - 0x0c, 0x4a, 0x9d, 0x6b, 0x1f, 0xab, 0x6c, 0x79, 0x24, 0xde, 0x1d, 0xa7, - 0xbd, 0xb3, 0x49, 0x92, 0xc7, 0x1e, 0x28, 0xd9, 0xda, 0xd8, 0xbb, 0x2d, - 0xc2, 0x93, 0x6b, 0x65, 0x8d, 0xbc, 0xd7, 0x69, 0x22, 0xc7, 0xc7, 0x7e, - 0x1f, 0x6d, 0xa1, 0x87, 0xe8, 0xd6, 0x87, 0xf6, 0x35, 0xb0, 0x14, 0x38, - 0x1f, 0xce, 0x52, 0xd6, 0x9a, 0x89, 0x14, 0x8a, 0xf2, 0xb8, 0xf9, 0xda, - 0x12, 0x3f, 0xbc, 0x2e, 0x5c, 0x07, 0xc0, 0x6d, 0x2f, 0x78, 0x39, 0xbb, - 0x66, 0x96, 0xc9, 0x5b, 0xe2, 0x9a, 0x2f, 0x4e, 0x5e, 0x07, 0x32, 0xc9, - 0xfc, 0x5f, 0x5d, 0xd1, 0x47, 0xf5, 0xa2, 0xa3, 0x1d, 0x8b, 0x6f, 0x2b, - 0x67, 0x2d, 0x72, 0xd3, 0x07, 0x24, 0x23, 0x5c, 0x35, 0xc8, 0x5e, 0xdc, - 0xdf, 0xdb, 0xe5, 0xa0, 0x6e, 0xe7, 0xa8, 0x9e, 0xb7, 0x91, 0xe0, 0x90, - 0xb8, 0x22, 0xed, 0x96, 0x0b, 0x4a, 0x3c, 0xc7, 0xef, 0x89, 0x73, 0xed, - 0x30, 0x81, 0x6c, 0xce, 0x67, 0x4c, 0x02, 0xcc, 0x25, 0x04, 0xfb, 0xf0, - 0x36, 0x33, 0x79, 0x4c, 0xce, 0x42, 0x0d, 0x6a, 0xd2, 0x22, 0x15, 0x0e, - 0x3d, 0x75, 0x19, 0x79, 0xb4, 0x5c, 0xa8, 0xbf, 0xd8, 0x2f, 0xf2, 0x43, - 0x2c, 0x61, 0xb0, 0xf8, 0x31, 0x8e, 0xd2, 0xf1, 0x31, 0x0c, 0xa7, 0x7e, - 0xbd, 0xb2, 0x21, 0x36, 0x2a, 0xa4, 0x83, 0xbc, 0x06, 0xbd, 0x55, 0x69, - 0x38, 0x87, 0x07, 0xb1, 0xd5, 0xa7, 0x38, 0x99, 0x10, 0x28, 0x10, 0x0e, - 0x6e, 0xfd, 0x8c, 0xbb, 0x88, 0x02, 0x9e, 0xa8, 0xa5, 0xcc, 0xd9, 0x48, - 0x89, 0x8d, 0xa5, 0xbe, 0x3b, 0x96, 0x0b, 0xf9, 0x56, 0xb8, 0x48, 0x7f, - 0x6a, 0x2b, 0x79, 0x35, 0x2e, 0x93, 0xd5, 0x56, 0xa5, 0x23, 0x95, 0xde, - 0x9e, 0x2c, 0xd3, 0xfb, 0x9a, 0x17, 0xa5, 0x73, 0x05, 0x12, 0x01, 0xc2, - 0xf0, 0x28, 0xc7, 0xb3, 0xd0, 0x25, 0xcf, 0xc1, 0x6d, 0xe1, 0x3d, 0xa6, - 0xdd, 0x3c, 0x1b, 0xae, 0x48, 0x94, 0x99, 0x3b, 0xd4, 0x0d, 0x45, 0xd1, - 0x73, 0x39, 0x43, 0x06, 0x1a, 0x0e, 0xef, 0xef, 0x3c, 0x54, 0xbd, 0x6e, - 0x33, 0xb4, 0x4f, 0xc1, 0x8f, 0x29, 0xa8, 0x03, 0x1a, 0xc4, 0xdb, 0x67, - 0x17, 0x21, 0x59, 0xd2, 0x9a, 0xb1, 0x90, 0x26, 0xe0, 0xa4, 0x91, 0x5d, - 0x80, 0xc5, 0xa8, 0x37, 0x9b, 0x0c, 0x74, 0x79, 0x27, 0x54, 0x1b, 0xda, - 0x9d, 0xbd, 0xec, 0x9c, 0xb2, 0x67, 0xec, 0x8e, 0xfa, 0x7c, 0x77, 0x21, - 0x40, 0xbe, 0xe3, 0xbb, 0xca, 0xc0, 0x48, 0xe6, 0x34, 0x0d, 0xf4, 0xb7, - 0x2d, 0x7a, 0x8e, 0x9b, 0x9d, 0x71, 0x00, 0xf1, 0x96, 0x89, 0xe0, 0xfe, - 0xf5, 0x6f, 0x79, 0x84, 0xb0, 0x42, 0xcd, 0x88, 0x63, 0x27, 0x51, 0xd4, - 0xad, 0x5f, 0xf4, 0xd0, 0x10, 0xfc, 0xd2, 0x8c, 0x36, 0xe1, 0xd3, 0xdb, - 0x58, 0x14, 0x37, 0x87, 0xd5, 0x2b, 0xa4, 0xb8, 0x5d, 0x42, 0x0c, 0x7d, - 0x1a, 0x5e, 0xa0, 0x3c, 0x00, 0xa0, 0xc8, 0xe8, 0xd2, 0x6f, 0x34, 0x48, - 0x39, 0x90, 0x64, 0x55, 0x46, 0x92, 0x58, 0xac, 0xcd, 0xa5, 0x9d, 0x28, - 0x47, 0xec, 0xf0, 0xf9, 0x83, 0x5e, 0x44, 0x04, 0xb7, 0x37, 0x7f, 0x55, - 0x29, 0xe7, 0x82, 0x51, 0x81, 0x90, 0x28, 0x57, 0xa7, 0x13, 0x0c, 0x0d, - 0x56, 0xad, 0x0a, 0xee, 0x34, 0x30, 0x8d, 0xb8, 0x0c, 0xed, 0xab, 0xd6, - 0x16, 0x26, 0x35, 0xdb, 0x40, 0x84, 0x64, 0x76, 0x2d, 0x2a, 0x01, 0x60, - 0xde, 0x42, 0xb9, 0x16, 0xb3, 0x04, 0xf0, 0x20, 0x4e, 0xc0, 0x88, 0x8f, - 0xbb, 0x4c, 0x7f, 0x06, 0x46, 0x7b, 0xae, 0x09, 0x67, 0x3e, 0x1a, 0x32, - 0xc3, 0xf6, 0xda, 0x17, 0x3e, 0x25, 0x01, 0xc6, 0x64, 0xdf, 0x01, 0x82, - 0x92, 0x50, 0xdc, 0x73, 0x68, 0x77, 0x74, 0x64, 0xd0, 0x87, 0x12, 0x73, - 0x39, 0x60, 0xb8, 0x6f, 0x4c, 0x9c, 0xcb, 0xb4, 0x6d, 0x2d, 0x53, 0xb6, - 0xee, 0x7f, 0x1a, 0x48, 0x65, 0x09, 0x86, 0x3b, 0x49, 0xda, 0x54, 0xd3, - 0xd8, 0x08, 0x9e, 0x70, 0x43, 0x28, 0x64, 0x8f, 0x50, 0xbe, 0x33, 0x74, - 0x35, 0xaa, 0xea, 0x2a, 0x12, 0x84, 0xcb, 0x52, 0x27, 0x97, 0xce, 0xfc, - 0x2f, 0xdf, 0xf7, 0x76, 0x5c, 0xc1, 0x60, 0x3f, 0xd6, 0x6f, 0x3d, 0x57, - 0xd3, 0x1a, 0x52, 0x17, 0x33, 0xa1, 0x61, 0x91, 0xce, 0xed, 0x48, 0x8b, - 0x61, 0x3f, 0x1d, 0xf4, 0xdb, 0x7a, 0x00, 0x4e, 0x3e, 0xd4, 0xde, 0x52, - 0x85, 0xfc, 0xb8, 0x79, 0x94, 0xbe, 0x2d, 0x70, 0x25, 0x6c, 0x7c, 0x0d, - 0x49, 0xb6, 0x93, 0x67, 0xae, 0x7d, 0xa9, 0xd9, 0x6a, 0x49, 0x1e, 0x33, - 0x98, 0xc8, 0x24, 0xd3, 0x44, 0xcc, 0x25, 0x7b, 0xab, 0x35, 0x31, 0xc6, - 0x8e, 0xf0, 0xef, 0x31, 0xc9, 0xb1, 0xa9, 0x61, 0xd3, 0x2a, 0x29, 0x22, - 0x84, 0xc1, 0x09, 0xec, 0x08, 0xc9, 0x57, 0x1d, 0xdc, 0xef, 0x59, 0xe9, - 0xb1, 0xef, 0x32, 0x53, 0x26, 0x2d, 0x2d, 0x9d, 0x4b, 0x65, 0xe4, 0x9c, - 0xd4, 0xdd, 0x42, 0x9d, 0xc0, 0x0a, 0xfc, 0x69, 0x49, 0x1d, 0xf0, 0xb1, - 0xd3, 0x23, 0xa6, 0x02, 0x3f, 0x5f, 0x49, 0x45, 0x12, 0xea, 0xc1, 0x4d, - 0xf2, 0x00, 0x67, 0xae, 0xf2, 0x7a, 0xef, 0x85, 0x94, 0x2e, 0xb5, 0x90, - 0x79, 0xc7, 0x31, 0xd4, 0x77, 0xd5, 0xfc, 0x40, 0xe8, 0xc3, 0xf3, 0x6e, - 0x3c, 0x57, 0xeb, 0xd9, 0xfe, 0xd8, 0x58, 0xcb, 0xd9, 0x5a, 0x52, 0x93, - 0x32, 0xc2, 0xba, 0xb2, 0xda, 0xeb, 0x2a, 0x55, 0x5a, 0xfa, 0x3e, 0x5d, - 0x08, 0xe6, 0x12, 0xc1, 0x92, 0x92, 0xb4, 0x74, 0xde, 0x85, 0x18, 0x25, - 0x4f, 0x37, 0x5d, 0x02, 0xfc, 0xcc, 0x58, 0x14, 0x7d, 0xb3, 0x49, 0xac, - 0xad, 0x24, 0xec, 0x99, 0xac, 0x52, 0x64, 0x77, 0x43, 0x0e, 0x92, 0x1d, - 0xa7, 0x18, 0x1e, 0x63, 0x2a, 0xca, 0x87, 0x71, 0xa0, 0x46, 0x10, 0x30, - 0xd4, 0x2f, 0x65, 0x3f, 0x58, 0x0f, 0x5e, 0xf8, 0x9d, 0x13, 0xa9, 0x1e, - 0x46, 0x17, 0xba, 0xac, 0x82, 0x4c, 0x66, 0x77, 0x3d, 0xc2, 0xee, 0x16, - 0x2a, 0xea, 0xa0, 0x41, 0xd1, 0xaf, 0xe4, 0xa0, 0x34, 0xea, 0xb2, 0x37, - 0x51, 0x2c, 0x2c, 0x62, 0x0f, 0x3f, 0x46, 0xfb, 0x6b, 0xcf, 0x58, 0x71, - 0xb4, 0x0a, 0xbd, 0xa1, 0xdc, 0xc2, 0x92, 0x86, 0xf1, 0x20, 0xbe, 0x35, - 0x9d, 0x7a, 0x8d, 0x47, 0x64, 0x06, 0xe0, 0x93, 0x09, 0x5b, 0x28, 0x51, - 0xaf, 0x62, 0x8b, 0xca, 0x36, 0x3a, 0xee, 0xdc, 0x70, 0x2a, 0x33, 0xda, - 0xa6, 0x3b, 0x7c, 0x47, 0xf8, 0xf7, 0x98, 0x78, 0xd1, 0xcd, 0x23, 0xce, - 0xed, 0x59, 0x2c, 0xd8, 0x71, 0xf2, 0xc7, 0x57, 0x88, 0x45, 0x04, 0x0f, - 0x78, 0x7b, 0xe3, 0x50, 0x6e, 0xa1, 0xf0, 0x4f, 0xae, 0x06, 0xc5, 0xf0, - 0xb8, 0x3d, 0x7e, 0x27, 0x76, 0x87, 0x72, 0xd8, 0x9f, 0xc2, 0xbb, 0x45, - 0xa7, 0xaf, 0xbf, 0x5e, 0x4a, 0x72, 0x50, 0xc5, 0xc1, 0x0a, 0x49, 0x7b, - 0x53, 0x66, 0x5e, 0x40, 0x7c, 0x27, 0x9a, 0x20, 0xce, 0xdf, 0x08, 0xd6, - 0x14, 0x15, 0xfa, 0x1e, 0x78, 0x6d, 0x24, 0xc3, 0x4d, 0xba, 0x36, 0x5b, - 0x3c, 0x38, 0xa7, 0x02, 0x8c, 0xc8, 0x4e, 0x82, 0x9b, 0xbb, 0xdc, 0x5c, - 0x6c, 0x0c, 0xf5, 0x50, 0xbb, 0x41, 0xaf, 0x72, 0x33, 0x44, 0x5f, 0xd7, - 0xa5, 0x8a, 0x9d, 0x80, 0x20, 0xae, 0xe1, 0x34, 0x1d, 0x50, 0xf2, 0x73, - 0xb2, 0x46, 0xc7, 0x72, 0x25, 0x4b, 0x3e, 0x56, 0x8f, 0x93, 0xba, 0x2b, - 0xc6, 0xc7, 0xdd, 0x8c, 0xa1, 0xda, 0x38, 0x38, 0xc9, 0xfe, 0x6b, 0xbd, - 0xe1, 0x88, 0x33, 0x7f, 0x56, 0xc9, 0x92, 0x60, 0x72, 0x78, 0xc2, 0x06, - 0xda, 0x61, 0xf0, 0x8d, 0x41, 0x0f, 0xc4, 0x80, 0x67, 0xe0, 0x8a, 0xaa, - 0x35, 0xc7, 0xa4, 0xef, 0xbe, 0x31, 0xd2, 0xaa, 0xfb, 0x72, 0x10, 0x7f, - 0x7d, 0xe8, 0x81, 0xdc, 0x0e, 0xca, 0x24, 0xa4, 0x85, 0xd8, 0x9d, 0x01, - 0xe2, 0x2a, 0xeb, 0x8b, 0x46, 0x11, 0x7b, 0xce, 0x02, 0x44, 0x3a, 0xd1, - 0x36, 0xd4, 0xee, 0xf7, 0x12, 0xe0, 0x13, 0x4e, 0xa5, 0xc7, 0xac, 0xa3, - 0x55, 0x1b, 0x7e, 0x7b, 0x1e, 0x26, 0x46, 0xd3, 0x49, 0xeb, 0x1b, 0xd4, - 0x19, 0xb0, 0x55, 0xee, 0x9c, 0x7b, 0xc5, 0xeb, 0x8d, 0x58, 0x33, 0x6c, - 0xa8, 0xb9, 0x63, 0x0f, 0xce, 0x0e, 0x0e, 0xe3, 0x98, 0xde, 0x84, 0x45, - 0xce, 0x0b, 0xfa, 0x09, 0xaa, 0x48, 0x93, 0xe1, 0x05, 0x63, 0x97, 0x0c, - 0x90, 0x7f, 0xaa, 0x96, 0x65, 0x40, 0x99, 0x96, 0xc8, 0x01, 0xe8, 0x14, - 0xb3, 0x94, 0x62, 0x6c, 0x8e, 0x33, 0x9d, 0xd1, 0xea, 0x04, 0x56, 0x0d, - 0x05, 0xad, 0xc5, 0x45, 0x10, 0x7d, 0xfa, 0x21, 0x78, 0x8d, 0xb2, 0x13, - 0x94, 0x68, 0xf8, 0x32, 0x49, 0xdb, 0x55, 0xc8, 0xd3, 0x6a, 0x8e, 0xe6, - 0xa7, 0x14, 0x19, 0x5a, 0x82, 0xaf, 0x76, 0xa7, 0x9e, 0xa7, 0x1b, 0x8f, - 0x8b, 0x35, 0xe1, 0xd2, 0x7b, 0x4c, 0xa9, 0xf2, 0x2e, 0x7a, 0x55, 0xef, - 0x2e, 0x40, 0x2a, 0x02, 0xde, 0xaa, 0x6c, 0xa9, 0x17, 0x51, 0xd7, 0x27, - 0xca, 0x2f, 0xb0, 0xdd, 0xb1, 0xda, 0xac, 0x5a, 0x86, 0x57, 0xee, 0x85, - 0x86, 0xc6, 0xd2, 0xb9, 0x4f, 0x83, 0xdd, 0xc7, 0x37, 0x04, 0x1b, 0xc4, - 0x0e, 0x1e, 0x2a, 0x6a, 0x3e, 0xaf, 0x22, 0xaa, 0xd6, 0xb2, 0xdf, 0xe3, - 0x9a, 0x27, 0x93, 0x2d, 0xb4, 0x24, 0x24, 0x0f, 0x75, 0x5e, 0x39, 0xf4, - 0x6b, 0x0c, 0x21, 0x7c, 0xbb, 0x31, 0x8b, 0x03, 0xd0, 0x6f, 0x79, 0x94, - 0xdd, 0x49, 0xd6, 0x24, 0x94, 0x28, 0xab, 0xf1, 0xf9, 0xb2, 0x21, 0xe8, - 0x63, 0xd4, 0x65, 0x7d, 0x74, 0xf0, 0xf4, 0x45, 0xfa, 0x9d, 0x0f, 0x48, - 0xd4, 0x71, 0x23, 0x0b, 0xcd, 0xd5, 0xf9, 0xbb, 0x0d, 0x0c, 0x6d, 0x4c, - 0xf4, 0xe6, 0xf3, 0xae, 0xa3, 0xe4, 0xa1, 0x20, 0x19, 0xf4, 0x59, 0xab, - 0x9d, 0xf7, 0xdb, 0x91, 0x0e, 0x63, 0x45, 0xaf, 0x21, 0xd6, 0x25, 0x3e, - 0xb0, 0x9b, 0x3a, 0xa8, 0x4c, 0x99, 0xcb, 0xe1, 0xf3, 0xed, 0x10, 0x87, - 0xed, 0x1c, 0x5e, 0x7c, 0x6a, 0xfc, 0x8c, 0x06, 0xda, 0x76, 0xc2, 0x1c, - 0xa9, 0x34, 0x16, 0x33, 0xb2, 0x99, 0xbb, 0x94, 0xf8, 0xd8, 0xbd, 0xf3, - 0x89, 0x11, 0x95, 0x3a, 0xb7, 0x2a, 0x8d, 0x04, 0x18, 0x4c, 0xcf, 0xfe, - 0xe5, 0x18, 0xb4, 0xd8, 0x86, 0xf4, 0x61, 0x2e, 0x99, 0xc2, 0xd4, 0x5e, - 0x9b, 0xc4, 0x78, 0xad, 0x4d, 0x53, 0x48, 0xc7, 0x4a, 0x24, 0x04, 0x34, - 0xb5, 0x3b, 0x48, 0xd7, 0x0c, 0xd7, 0xe6, 0xcd, 0x87, 0x9d, 0x8e, 0x18, - 0x91, 0xf4, 0xf7, 0xac, 0x1b, 0xcc, 0x00, 0x0f, 0x39, 0xd0, 0xbc, 0x13, - 0x0f, 0x10, 0x89, 0x8e, 0x1c, 0x28, 0xd3, 0xb7, 0xaa, 0x01, 0x63, 0x3d, - 0x11, 0xfc, 0x98, 0x09, 0x10, 0xea, 0x96, 0x40, 0x45, 0xb3, 0x9f, 0x97, - 0x0d, 0xf6, 0x06, 0x5e, 0xae, 0xb1, 0xf9, 0x8c, 0x89, 0x42, 0x7a, 0x4b, - 0xce, 0x86, 0xc6, 0xeb, 0xaa, 0x16, 0x20, 0x97, 0x4f, 0xc4, 0xa4, 0x67, - 0xf2, 0xae, 0x6f, 0x01, 0x5e, 0x7d, 0xc7, 0x0f, 0xb7, 0xd2, 0xc9, 0x32, - 0x1d, 0xb5, 0xa5, 0x6d, 0x10, 0x8f, 0x59, 0x1e, 0x22, 0x3c, 0xce, 0x27, - 0xb4, 0xe3, 0xe0, 0xc6, 0x5d, 0xf1, 0xfa, 0x68, 0xa4, 0x5b, 0xa4, 0x15, - 0x0e, 0xe7, 0xad, 0x7b, 0x30, 0x43, 0x7b, 0x6a, 0x18, 0x27, 0xf4, 0x1d, - 0xfe, 0xcf, 0xd4, 0x29, 0x48, 0x67, 0xd3, 0x41, 0x7f, 0x4c, 0xf3, 0x39, - 0x7a, 0xcb, 0xf8, 0x2e, 0xa1, 0x96, 0x40, 0xfc, 0x02, 0xe7, 0x3c, 0xfa, - 0xaf, 0x0a, 0xe1, 0x7f, 0x57, 0xb6, 0xcf, 0x61, 0xd1, 0x1e, 0x25, 0xef, - 0xb7, 0xe3, 0xe4, 0x42, 0x78, 0xc9, 0x3f, 0x7e, 0xb4, 0x75, 0xf2, 0xf8, - 0xd3, 0x7a, 0xbb, 0x9b, 0x23, 0x8b, 0x64, 0x58, 0x0b, 0xc6, 0x8b, 0x80, - 0xdb, 0x88, 0xeb, 0xcb, 0x79, 0x3c, 0x0a, 0xe4, 0x37, 0xac, 0x3f, 0xf9, - 0xa8, 0xb6, 0xe0, 0x98, 0x98, 0x8b, 0x4f, 0x2e, 0x6a, 0x7c, 0x3b, 0x5f, - 0xb0, 0x63, 0xe3, 0xcd, 0xb2, 0x23, 0x98, 0xd8, 0x19, 0x29, 0x96, 0xd2, - 0xc5, 0xdb, 0xfc, 0xa9, 0xfc, 0xf5, 0x07, 0x87, 0x66, 0xea, 0x8e, 0x2f, - 0x72, 0x83, 0x17, 0xda, 0x00, 0xa4, 0x78, 0x7d, 0x3d, 0xe1, 0xb8, 0x10, - 0x7d, 0xf4, 0x82, 0x6e, 0xf5, 0x23, 0x74, 0x1c, 0xd1, 0xb9, 0x53, 0xe6, - 0xc1, 0x40, 0xc5, 0xcd, 0xfa, 0x6a, 0xe5, 0xe7, 0x9a, 0x6b, 0xa3, 0x29, - 0xdb, 0xac, 0x13, 0x74, 0x9e, 0x66, 0x8b, 0xe1, 0x81, 0x50, 0xf7, 0xc8, - 0x66, 0x0e, 0x45, 0xe3, 0x72, 0xae, 0x8f, 0x1c, 0x3e, 0x51, 0xb3, 0xe0, - 0xc1, 0xbb, 0x37, 0x86, 0x74, 0x54, 0xe9, 0x9d, 0xad, 0x99, 0x7a, 0x83, - 0xd8, 0x95, 0x2c, 0x15, 0xc1, 0x77, 0x1e, 0x41, 0x89, 0x4b, 0x18, 0xc2, - 0x84, 0x3d, 0xb9, 0xff, 0x41, 0x05, 0x10, 0x63, 0x9b, 0x05, 0x3f, 0x76, - 0x95, 0xe7, 0xa7, 0x36, 0x19, 0x6b, 0x1c, 0xe7, 0x9b, 0xe7, 0xe5, 0x0d, - 0x5e, 0xfd, 0xc6, 0x3b, 0x46, 0x01, 0x17, 0x8f, 0x7e, 0x59, 0x7b, 0x77, - 0x9b, 0x19, 0xc2, 0x49, 0xe9, 0x78, 0xcb, 0xab, 0xfc, 0x2d, 0x2a, 0xfa, - 0x52, 0xc0, 0x4c, 0xc1, 0x61, 0x9a, 0x67, 0xe4, 0x95, 0xa4, 0x0b, 0x4a, - 0xbe, 0xc3, 0xbe, 0xd5, 0xf4, 0x10, 0xde, 0xc6, 0x6d, 0xe3, 0xcd, 0x00, - 0xb0, 0x79, 0xc2, 0x47, 0x29, 0x6d, 0x40, 0x70, 0xfe, 0x82, 0x91, 0x12, - 0x55, 0x92, 0x0d, 0xbe, 0x7c, 0x64, 0x9c, 0x9b, 0x0d, 0x05, 0xdb, 0xa0, - 0xfe, 0xf3, 0xe4, 0xc9, 0x16, 0x2c, 0x1c, 0x0d, 0x7d, 0x92, 0xde, 0x3c, - 0xd8, 0x18, 0x5b, 0xaa, 0xd4, 0xbc, 0x54, 0xcb, 0x57, 0xb1, 0x4c, 0x3b, - 0xf1, 0xeb, 0xe6, 0xe4, 0xc0, 0x66, 0x05, 0x8b, 0xee, 0xe8, 0xf2, 0xd4, - 0xf8, 0x51, 0x78, 0xee, 0x9e, 0xb0, 0xc7, 0x42, 0x1e, 0xae, 0x23, 0xcb, - 0xfd, 0xa5, 0xd9, 0x6e, 0x62, 0xa7, 0xf4, 0xb4, 0x2d, 0xf7, 0x04, 0x22, - 0x37, 0xc8, 0x4d, 0xfd, 0x8e, 0x21, 0xc8, 0x8f, 0x4c, 0x7f, 0xa1, 0x54, - 0xbc, 0x35, 0x30, 0x59, 0xbd, 0xca, 0x3e, 0x14, 0x8c, 0x99, 0xa5, 0x70, - 0x1c, 0x2d, 0x48, 0xdc, 0x4c, 0x94, 0x39, 0x92, 0x64, 0x89, 0xad, 0x83, - 0x03, 0x81, 0x26, 0xc2, 0x9e, 0x07, 0x21, 0x99, 0xd1, 0x66, 0x03, 0xbc, - 0x11, 0xee, 0x05, 0x04, 0xec, 0x5f, 0x0b, 0x5a, 0x49, 0xaf, 0xe8, 0xf0, - 0x08, 0xee, 0xe7, 0x92, 0xec, 0xa3, 0xd1, 0x56, 0x27, 0x01, 0xbb, 0xc8, - 0x05, 0xd4, 0x66, 0x27, 0xf9, 0x5e, 0x39, 0x77, 0x09, 0x59, 0x1d, 0x5d, - 0x61, 0x12, 0x0e, 0x8a, 0xf1, 0x0d, 0x77, 0x07, 0x55, 0xf5, 0x3b, 0x54, - 0x51, 0xd8, 0x5b, 0xe5, 0x00, 0x15, 0x3e, 0x08, 0x5e, 0xdf, 0x79, 0xb8, - 0x53, 0x9c, 0xc6, 0x8d, 0x55, 0xf8, 0xff, 0x8c, 0x94, 0xba, 0x8b, 0x34, - 0x07, 0xe8, 0x98, 0x24, 0xa8, 0x68, 0xcc, 0xa3, 0x4b, 0xc3, 0xa8, 0xc0, - 0xcf, 0x0f, 0xb5, 0x86, 0xe5, 0xcd, 0x90, 0x98, 0x41, 0x70, 0xcc, 0xe3, - 0x28, 0xb8, 0x16, 0x83, 0x40, 0x57, 0xc8, 0x89, 0xf5, 0x8d, 0x26, 0x65, - 0x03, 0xbd, 0x8f, 0xdf, 0x38, 0x1f, 0x4d, 0x7a, 0x49, 0xa0, 0x39, 0xa3, - 0xdc, 0x26, 0x92, 0x8d, 0x44, 0x90, 0x2c, 0x10, 0x68, 0xf0, 0x47, 0xe6, - 0x40, 0x1e, 0x9f, 0xc7, 0xe1, 0xb4, 0xa3, 0x4c, 0x65, 0xc4, 0x93, 0xcf, - 0x03, 0xa3, 0x60, 0xb9, 0x97, 0x1f, 0x29, 0x1f, 0x26, 0x57, 0x9e, 0x6b, - 0x67, 0x4f, 0x99, 0xd6, 0xb1, 0x7f, 0x53, 0x6f, 0x8f, 0xcc, 0xc6, 0x84, - 0xa9, 0xbc, 0x12, 0x05, 0x47, 0x7b, 0xc0, 0xe2, 0x28, 0xa4, 0x54, 0x0c, - 0xd5, 0x38, 0x51, 0xc1, 0x91, 0xbc, 0x63, 0xc9, 0xf0, 0x5d, 0x8a, 0xb8, - 0x85, 0x09, 0xfb, 0x06, 0x80, 0x66, 0x35, 0x4c, 0x78, 0xfb, 0xab, 0x22, - 0x59, 0x35, 0x7e, 0x84, 0xcc, 0x65, 0xf1, 0xc0, 0x16, 0x9a, 0x34, 0xcd, - 0xef, 0x74, 0x9f, 0xf0, 0xf5, 0x93, 0x32, 0x68, 0xe9, 0x86, 0x79, 0xaa, - 0x9f, 0x55, 0xa1, 0x52, 0xf4, 0xb7, 0x08, 0x41, 0x9c, 0xa4, 0xff, 0xb8, - 0x0b, 0x7f, 0xbd, 0x87, 0xbc, 0x93, 0xe6, 0xd0, 0x5a, 0x41, 0xc1, 0xc3, - 0x9c, 0xfe, 0x7a, 0xb7, 0x9c, 0x42, 0x92, 0xec, 0x67, 0x88, 0x70, 0x69, - 0x1b, 0x8f, 0xe8, 0xe9, 0x11, 0x0f, 0x18, 0x6d, 0x55, 0xb3, 0xa3, 0x1d, - 0x0f, 0xb9, 0x97, 0x11, 0x06, 0xa7, 0x2b, 0xe9, 0x0a, 0x7c, 0x81, 0xab, - 0x0e, 0x8e, 0xbf, 0xc7, 0x38, 0xe4, 0xe5, 0x6c, 0xc8, 0x5d, 0x4b, 0x60, - 0x3b, 0xf0, 0xaf, 0xf4, 0x9c, 0xa3, 0x48, 0x25, 0x75, 0x77, 0x1b, 0x42, - 0x4f, 0x63, 0x39, 0x29, 0x25, 0xf6, 0x80, 0xeb, 0x6e, 0xc9, 0x07, 0x65, - 0x21, 0x1b, 0x82, 0x87, 0xc8, 0x6e, 0x7c, 0x7f, 0x4c, 0x93, 0x99, 0xc4, - 0x85, 0xe8, 0x81, 0x88, 0x0a, 0x58, 0xbf, 0x48, 0x4f, 0x14, 0x04, 0x9f, - 0x7a, 0x1e, 0xc7, 0xcc, 0x89, 0x97, 0x2a, 0x0b, 0x7d, 0xde, 0x3c, 0x4c, - 0x3f, 0x72, 0xae, 0x8a, 0x35, 0x90, 0xe6, 0x50, 0x15, 0xfd, 0xe1, 0x73, - 0xd4, 0x22, 0x31, 0x05, 0xdb, 0x47, 0x3a, 0x63, 0xf9, 0xd6, 0xd7, 0x13, - 0x9c, 0xa2, 0x06, 0xfa, 0x28, 0x1a, 0x53, 0x2b, 0x3f, 0x96, 0x57, 0x08, - 0x30, 0xa9, 0x29, 0xf7, 0x06, 0x54, 0x02, 0x95, 0x5a, 0xcd, 0xa2, 0x2d, - 0x3d, 0x7a, 0x95, 0xa7, 0xa5, 0x09, 0x4c, 0x41, 0x44, 0x63, 0x3a, 0x71, - 0x3d, 0x87, 0x70, 0xb4, 0x44, 0xb3, 0x48, 0xc3, 0x77, 0x70, 0x7e, 0x87, - 0x90, 0x2b, 0xd8, 0x63, 0xeb, 0x65, 0x55, 0xc0, 0xcf, 0xfb, 0x00, 0xf0, - 0x4c, 0x0d, 0x30, 0x1c, 0x59, 0xfe, 0xb3, 0x8b, 0xb0, 0x75, 0x84, 0xa0, - 0x94, 0x13, 0xa9, 0x16, 0xe9, 0xca, 0xa8, 0x44, 0xfd, 0xbe, 0xa5, 0x6d, - 0x98, 0x1f, 0x0c, 0xf2, 0x13, 0x50, 0x10, 0x14, 0x05, 0xc3, 0x1f, 0x64, - 0x83, 0x34, 0xf0, 0x5e, 0xa7, 0xcd, 0x9f, 0x5d, 0xff, 0xfe, 0xc7, 0x93, - 0x4d, 0xfb, 0xf0, 0x6a, 0x3f, 0x3c, 0x21, 0x21, 0x65, 0xef, 0xea, 0xea, - 0x4d, 0x1a, 0x89, 0x7e, 0xbc, 0xc1, 0xda, 0x5a, 0xbb, 0xf9, 0xf2, 0xa0, - 0x59, 0x68, 0x85, 0x59, 0x3f, 0x23, 0x8a, 0x18, 0x78, 0x62, 0xd8, 0x24, - 0x19, 0x18, 0xc4, 0x17, 0xf4, 0xf9, 0x67, 0xf6, 0x0b, 0x36, 0x0a, 0xbd, - 0x05, 0xec, 0xe0, 0x12, 0xf0, 0x6a, 0x54, 0x01, 0x07, 0x61, 0xaa, 0xf7, - 0x5c, 0x6c, 0x78, 0x98, 0xdd, 0x26, 0x91, 0xab, 0xe7, 0x49, 0x64, 0x09, - 0x11, 0x59, 0xdb, 0x04, 0x8d, 0xbe, 0xc3, 0xa6, 0x6d, 0x2b, 0xaf, 0x0d, - 0x83, 0xda, 0x64, 0x74, 0xed, 0xb1, 0x23, 0xd3, 0x4a, 0x70, 0xf8, 0x78, - 0x78, 0x34, 0x4c, 0x0a, 0xb1, 0x8b, 0xdd, 0x01, 0x89, 0xcf, 0x3f, 0xea, - 0x71, 0xba, 0x0d, 0x38, 0x76, 0x03, 0x66, 0x72, 0xdc, 0xe5, 0xc3, 0x61, - 0x69, 0x2d, 0xc6, 0xc2, 0xa1, 0x6f, 0xa5, 0xda, 0x79, 0xae, 0x47, 0x7b, - 0x5b, 0xe8, 0x25, 0x46, 0x14, 0x05, 0xdf, 0x5f, 0x17, 0x76, 0xeb, 0x10, - 0x4f, 0x29, 0x9c, 0xa5, 0x58, 0x40, 0x65, 0x3f, 0x48, 0x3c, 0x61, 0xde, - 0xb2, 0xa4, 0xbc, 0xa3, 0xeb, 0x97, 0x9a, 0xc9, 0x65, 0x4e, 0xf3, 0x41, - 0xa5, 0x65, 0x23, 0x4f, 0xb9, 0xf9, 0x7f, 0xd1, 0x15, 0xcc, 0xec, 0xa1, - 0x6b, 0x1e, 0x67, 0xa6, 0xc3, 0x1b, 0x0e, 0x57, 0x22, 0x7a, 0x48, 0x86, - 0xf6, 0x61, 0x67, 0x2c, 0xbf, 0x57, 0x78, 0x57, 0x91, 0xfb, 0xe3, 0xf2, - 0x1d, 0xf1, 0xdb, 0x61, 0xd2, 0x01, 0x17, 0x3f, 0x57, 0x20, 0xb1, 0xd7, - 0xf0, 0x9b, 0x39, 0x78, 0x20, 0x1a, 0xe8, 0xdd, 0x63, 0xd5, 0x96, 0xe8, - 0xcd, 0x92, 0x5e, 0x57, 0x89, 0x80, 0x19, 0xe2, 0x08, 0x27, 0x3e, 0xa3, - 0x49, 0x56, 0x83, 0xa4, 0x6e, 0x19, 0x03, 0x3a, 0x73, 0xb9, 0x1b, 0x48, - 0x0f, 0xe3, 0x42, 0x76, 0xd7, 0xf9, 0xa8, 0x1c, 0x85, 0x26, 0xab, 0x32, - 0x17, 0xc8, 0xae, 0x60, 0x0e, 0xb5, 0x28, 0x95, 0x3c, 0x35, 0xa0, 0xfc, - 0x6b, 0x7a, 0x22, 0xfd, 0x06, 0x81, 0x2a, 0x0b, 0x4c, 0x8e, 0xf5, 0xbe, - 0x3b, 0xde, 0x30, 0x77, 0x51, 0xe3, 0x0f, 0xc9, 0x60, 0x17, 0xac, 0xbb, - 0xb7, 0x93, 0x40, 0xe7, 0xa6, 0x7d, 0x12, 0x68, 0xc0, 0xec, 0xac, 0xa3, - 0x30, 0xa4, 0x19, 0x29, 0x2e, 0xbd, 0xb6, 0x40, 0xbb, 0xba, 0x5d, 0xcf, - 0x52, 0xcd, 0xaf, 0xee, 0xf4, 0xec, 0xf0, 0x30, 0xe9, 0x96, 0x34, 0x2e, - 0x66, 0xfc, 0x75, 0x45, 0x7b, 0x5b, 0x7b, 0x99, 0x7d, 0xfd, 0x7f, 0x75, - 0x2e, 0xb4, 0x82, 0x6c, 0x03, 0x87, 0xae, 0x98, 0xcf, 0x6e, 0x5f, 0xb4, - 0xeb, 0xc4, 0xb5, 0x28, 0x22, 0xf6, 0xb8, 0x77, 0x0d, 0x56, 0x94, 0xa0, - 0xe2, 0xb9, 0xc4, 0xc8, 0xe9, 0x15, 0x9f, 0x0b, 0x1c, 0x1c, 0xd6, 0x3b, - 0x12, 0x65, 0x6c, 0x8b, 0x04, 0x6d, 0x49, 0x89, 0x2c, 0xae, 0xca, 0x75, - 0x88, 0x3a, 0x89, 0x55, 0x06, 0x77, 0x46, 0x69, 0x59, 0x4e, 0xb1, 0x52, - 0x5e, 0xad, 0x21, 0x00, 0x7b, 0x15, 0x75, 0xf9, 0x7f, 0x40, 0x71, 0xb3, - 0xdf, 0x8f, 0xd5, 0x52, 0x11, 0xb3, 0xd2, 0xde, 0xfa, 0x59, 0xc7, 0xbd, - 0x79, 0xaf, 0x64, 0x90, 0x01, 0x2a, 0x5b, 0x86, 0x4f, 0xb4, 0x43, 0x61, - 0x32, 0x4b, 0xd4, 0x5c, 0x50, 0xbe, 0x6c, 0x59, 0xc5, 0xde, 0x6e, 0xaa, - 0x92, 0xe2, 0x56, 0xfc, 0x43, 0x96, 0xc2, 0x3a, 0x94, 0xad, 0xfa, 0xc6, - 0x78, 0x7f, 0xde, 0xbe, 0xc6, 0x04, 0x14, 0x2e, 0x06, 0xbe, 0xa1, 0x0a, - 0x7a, 0x4e, 0x50, 0xf9, 0x4c, 0x33, 0xf5, 0x82, 0x5a, 0x80, 0x04, 0x3b, - 0x97, 0xdb, 0xb3, 0xb2, 0x0b, 0x1e, 0x5e, 0x91, 0x0e, 0xbf, 0x87, 0x14, - 0x2c, 0x1b, 0xb3, 0x30, 0xb0, 0x1d, 0xcf, 0x47, 0x14, 0xb2, 0xb1, 0x72, - 0x2b, 0xd9, 0xac, 0x86, 0xae, 0xcb, 0x8f, 0x68, 0x6e, 0x03, 0xff, 0x9f, - 0xa9, 0x13, 0xaa, 0x1f, 0x01, 0xb6, 0xf2, 0x76, 0xf3, 0x33, 0x86, 0xc0, - 0x16, 0x74, 0x42, 0x5f, 0x6a, 0x3b, 0x65, 0x56, 0x3e, 0xf1, 0x8d, 0x31, - 0x05, 0x5a, 0x8a, 0xc5, 0x29, 0xf2, 0xe7, 0x5a, 0x14, 0x0c, 0xb1, 0xc9, - 0xc7, 0xc5, 0xb5, 0xca, 0x30, 0x9e, 0xdd, 0x96, 0xc5, 0x95, 0xbd, 0x02, - 0xbc, 0xfa, 0x5f, 0xc0, 0x7f, 0x69, 0xb9, 0xd7, 0x09, 0x8a, 0x79, 0xde, - 0x3d, 0xff, 0xf7, 0xa7, 0x52, 0x4a, 0xf4, 0xce, 0x3a, 0x55, 0x04, 0x4b, - 0x76, 0xbe, 0x07, 0xb1, 0x03, 0xed, 0xf3, 0x03, 0x74, 0x04, 0x73, 0xdd, - 0xef, 0xa3, 0x8d, 0x2e, 0xbb, 0x32, 0xfe, 0x40, 0xcb, 0xc2, 0x40, 0x58, - 0x75, 0x01, 0xe7, 0x41, 0x3d, 0xfa, 0x57, 0x36, 0x5b, 0x85, 0x94, 0x4f, - 0x32, 0xc1, 0x2c, 0xdc, 0xc8, 0xf9, 0xdd, 0xa1, 0x29, 0xb8, 0xef, 0x88, - 0xf2, 0xe4, 0x8f, 0x9c, 0xbe, 0xbe, 0xea, 0x45, 0x2e, 0x92, 0xa7, 0x72, - 0x40, 0x0e, 0x9b, 0x8a, 0x6f, 0x70, 0xd8, 0x60, 0xb1, 0x8a, 0x46, 0x24, - 0x94, 0x12, 0x91, 0xaa, 0xc0, 0x4e, 0x4f, 0xcf, 0x89, 0x41, 0x8b, 0xe3, - 0xc7, 0xb1, 0x06, 0xf3, 0x63, 0xeb, 0xc2, 0x69, 0x86, 0xb2, 0x39, 0xc3, - 0x45, 0xea, 0xa5, 0xd7, 0x87, 0x81, 0x3f, 0xd6, 0xbc, 0x94, 0x45, 0x90, - 0x96, 0xa5, 0x02, 0x03, 0x3d, 0xd1, 0x3b, 0xf2, 0x56, 0xdb, 0x46, 0x15, - 0x3b, 0x3b, 0xd5, 0x82, 0x8a, 0x7c, 0x3d, 0xdf, 0xf7, 0x3d, 0xf1, 0xf1, - 0x1c, 0xfb, 0xe8, 0x3a, 0x8d, 0x0b, 0x35, 0xe6, 0x11, 0xfb, 0xd6, 0x77, - 0xe9, 0xa8, 0xfd, 0x74, 0x67, 0xcd, 0xb6, 0x01, 0xad, 0x66, 0x8c, 0xcc, - 0x39, 0x45, 0x12, 0x79, 0x13, 0xee, 0x0c, 0x00, 0xa7, 0x6b, 0x23, 0x43, - 0x5b, 0x96, 0xd2, 0x61, 0xa2, 0x92, 0x48, 0x7b, 0x58, 0xfc, 0x0f, 0x8b, - 0x84, 0xec, 0x52, 0x3c, 0x9d, 0xd9, 0x07, 0xc9, 0xdd, 0x08, 0x65, 0x8a, - 0x16, 0xd1, 0x82, 0x99, 0x6a, 0xe0, 0x96, 0xd7, 0xe6, 0xf7, 0x1e, 0x62, - 0xfc, 0x1d, 0xa0, 0x83, 0x44, 0x93, 0xf0, 0xee, 0xa3, 0xb6, 0x1a, 0xca, - 0xb7, 0xe6, 0xaa, 0x5f, 0xea, 0x54, 0xbe, 0x4f, 0x83, 0xd3, 0xb0, 0x65, - 0x97, 0xd6, 0x2d, 0xbb, 0x9f, 0x31, 0x0e, 0xea, 0x5a, 0x50, 0x51, 0x22, - 0xa1, 0x49, 0xc8, 0x8b, 0x47, 0xa3, 0xb5, 0x76, 0x91, 0x84, 0x42, 0xc2, - 0x8a, 0x69, 0xcf, 0xa1, 0xb6, 0x4f, 0x65, 0xf6, 0x07, 0x29, 0x2d, 0x12, - 0xff, 0x01, 0xec, 0xe4, 0x8e, 0x42, 0x1b, 0xca, 0x82, 0xbb, 0x33, 0x86, - 0x70, 0x02, 0x4a, 0x70, 0xee, 0xe0, 0x78, 0xcd, 0x86, 0xd0, 0xe8, 0x12, - 0xba, 0xd6, 0x3f, 0x1a, 0xd2, 0xc5, 0x04, 0x21, 0x87, 0x31, 0xa6, 0xfb, - 0x0b, 0xf1, 0x4d, 0xd1, 0xdf, 0xf8, 0x6b, 0xca, 0x7c, 0xbd, 0x00, 0x68, - 0x25, 0x87, 0xb6, 0x41, 0xcf, 0x85, 0x84, 0x71, 0xc8, 0x8f, 0xb0, 0x5b, - 0xfe, 0xcc, 0xad, 0xc6, 0xf2, 0xec, 0x1f, 0xbb, 0x2e, 0x66, 0x81, 0xdd, - 0x8e, 0xfe, 0xa2, 0x50, 0xaf, 0x5b, 0xef, 0x25, 0xe5, 0x7f, 0x06, 0x80, - 0x8e, 0x11, 0xe4, 0x25, 0x23, 0xc6, 0xd8, 0x8a, 0x21, 0x7d, 0xd6, 0x2c, - 0x69, 0x64, 0x49, 0x1f, 0x8d, 0x23, 0x96, 0x3a, 0xbb, 0xdb, 0x28, 0x45, - 0x2c, 0x14, 0x56, 0x52, 0x4e, 0x75, 0xa2, 0x97, 0x0c, 0xba, 0x61, 0x0a, - 0x2e, 0x74, 0xf0, 0x9d, 0x62, 0xe7, 0xc4, 0x26, 0xd5, 0x45, 0x93, 0x24, - 0x53, 0xe6, 0x15, 0xc9, 0x48, 0xf0, 0xec, 0x12, 0x19, 0x38, 0xeb, 0xd5, - 0x49, 0x90, 0x36, 0x8a, 0x6f, 0xa8, 0x1f, 0x65, 0x63, 0x87, 0x71, 0x30, - 0x24, 0x84, 0x34, 0x87, 0xe3, 0x47, 0x1a, 0x4b, 0x81, 0x3f, 0x0d, 0x94, - 0xb3, 0x1d, 0xc9, 0x20, 0xf8, 0x3e, 0x69, 0x91, 0x4d, 0xe6, 0x4c, 0x39, - 0x32, 0xd5, 0xab, 0x19, 0x86, 0x12, 0xea, 0x6c, 0xd3, 0x73, 0x1b, 0x1b, - 0xd3, 0x08, 0x87, 0xd6, 0x6b, 0xec, 0x22, 0x8b, 0xf6, 0x0e, 0x52, 0x15, - 0x26, 0x1e, 0x8a, 0xbd, 0x86, 0xab, 0x47, 0x18, 0x3a, 0x41, 0xe1, 0x89, - 0x9c, 0xa9, 0xd8, 0x8b, 0xf4, 0xa5, 0xea, 0x22, 0xa7, 0xc1, 0xa4, 0xfc, - 0xc9, 0x56, 0x6b, 0xa1, 0x16, 0x0c, 0x38, 0xed, 0x39, 0x83, 0x8b, 0x5d, - 0xd2, 0x16, 0xe8, 0xa6, 0x9d, 0x98, 0x86, 0xa4, 0xff, 0x43, 0x00, 0xa9, - 0xa7, 0xb2, 0x93, 0x65, 0x55, 0xc7, 0x8b, 0xf8, 0x1d, 0xea, 0x2f, 0xc2, - 0x6a, 0x2a, 0x93, 0x1b, 0xaf, 0x29, 0xcc, 0x81, 0xc1, 0xb1, 0x0a, 0xee, - 0xe7, 0xaa, 0xf4, 0x68, 0xb2, 0x05, 0x06, 0x3b, 0x9b, 0x85, 0xb6, 0x30, - 0x25, 0x1e, 0x5e, 0x91, 0x0e, 0xbf, 0x87, 0x14, 0x2c, 0x1b, 0xb3, 0x30, - 0xb0, 0x1d, 0xcf, 0x47, 0x14, 0xb2, 0xb1, 0x72, 0x58, 0xf8, 0x59, 0x66, - 0x2f, 0xc6, 0xea, 0x6f, 0xb6, 0xaa, 0xc1, 0x6f, 0x4b, 0x86, 0x52, 0xff, - 0xbd, 0x68, 0xc1, 0xad, 0x7c, 0x61, 0x70, 0x45, 0xee, 0xc4, 0x91, 0x54, - 0xa2, 0x22, 0xe8, 0xe0, 0x85, 0xd9, 0xa4, 0x63, 0xc8, 0x10, 0x8b, 0x35, - 0xc1, 0xa7, 0xf9, 0xf2, 0xb5, 0xc1, 0xb6, 0x96, 0x84, 0x76, 0x36, 0x7e, - 0xc6, 0x3b, 0xe3, 0x40, 0xd3, 0x6d, 0x8f, 0x28, 0xa9, 0x8f, 0x2e, 0x30, - 0x00, 0xf5, 0x4d, 0xae, 0xe6, 0x3e, 0xde, 0x36, 0x8d, 0xa7, 0xdd, 0x09, - 0xdd, 0x87, 0x83, 0x50, 0xe2, 0xdf, 0x3a, 0x4c, 0xfe, 0xd2, 0xf4, 0x6a, - 0x82, 0xc5, 0x9f, 0x9b, 0x56, 0xe1, 0x59, 0xad, 0x47, 0xdd, 0x30, 0x69, - 0x7c, 0x17, 0x4d, 0x7e, 0x13, 0x99, 0x9f, 0xa1, 0x88, 0x20, 0x1a, 0xfe, - 0x89, 0xaa, 0xf2, 0x03, 0x9c, 0x92, 0xe5, 0xab, 0x69, 0xb9, 0xe3, 0x93, - 0xfc, 0x3e, 0xeb, 0x29, 0x4a, 0xf6, 0x41, 0xc7, 0x45, 0x59, 0x82, 0x46, - 0xd0, 0xc0, 0xf2, 0x58, 0x50, 0x22, 0x46, 0xfb, 0x23, 0x4b, 0xa0, 0x41, - 0xba, 0x6c, 0x68, 0x9c, 0x4d, 0xb9, 0xb9, 0x5d, 0x87, 0x69, 0x83, 0x7c, - 0x59, 0x2b, 0x5d, 0x54, 0x8f, 0x29, 0x41, 0xac, 0xe7, 0xb2, 0x7e, 0xcb, - 0x1f, 0xf0, 0x28, 0xb6, 0x34, 0xad, 0xa2, 0x8a, 0x71, 0x0f, 0x7e, 0xf7, - 0xca, 0x39, 0xd7, 0x27, 0xd9, 0x71, 0x93, 0xd7, 0x0e, 0x8f, 0x51, 0x9d, - 0x63, 0xed, 0x8f, 0xb0, 0xc1, 0x4c, 0x77, 0x48, 0x1f, 0xb7, 0x39, 0x44, - 0xfd, 0xa9, 0x54, 0x17, 0x20, 0x67, 0xa1, 0x79, 0xdd, 0xd7, 0x67, 0x13, - 0xd3, 0x29, 0x02, 0xa5, 0x2c, 0xa1, 0x31, 0x8e, 0xb0, 0xf2, 0xe1, 0x47, - 0xe5, 0x26, 0xcd, 0xef, 0x0d, 0x8d, 0x4d, 0x0f, 0xc2, 0xd7, 0xd3, 0x98, - 0xf2, 0x31, 0xe3, 0x91, 0x6a, 0x58, 0xec, 0x7c, 0xae, 0xbd, 0x9b, 0x10, - 0x1e, 0x08, 0xad, 0x17, 0x77, 0x1e, 0x6f, 0x37, 0x82, 0x1f, 0xf5, 0xa3, - 0x45, 0xc8, 0x61, 0xbc, 0x91, 0xb7, 0x40, 0xbb, 0x16, 0x2d, 0xdb, 0x0c, - 0xb6, 0xbe, 0xd7, 0x71, 0x21, 0x47, 0x60, 0xd7, 0xb5, 0xe5, 0xba, 0xa8, - 0xb3, 0xb6, 0xe5, 0x86, 0xe7, 0xfd, 0xc8, 0xff, 0xba, 0x02, 0xff, 0xfc, - 0x6c, 0xb1, 0x61, 0x9f, 0x77, 0x5b, 0x37, 0x67, 0xf3, 0x24, 0x49, 0x0d, - 0xa8, 0x6f, 0xf5, 0x55, 0x3a, 0xf4, 0xcc, 0xf3, 0xc8, 0x2c, 0x78, 0x70, - 0x3a, 0xf9, 0x60, 0x08, 0xcb, 0x36, 0xc0, 0x26, 0x32, 0xdf, 0x90, 0xfa, - 0x19, 0xc1, 0xc0, 0x9e, 0xfa, 0x96, 0xff, 0x31, 0x64, 0x55, 0xdf, 0x19, - 0xe3, 0x9c, 0x86, 0x1b, 0xc8, 0x2a, 0xa5, 0xe8, 0xa9, 0x7a, 0x01, 0x25, - 0xce, 0x83, 0x28, 0x40, 0x48, 0x55, 0x49, 0x0d, 0x6a, 0x9d, 0x2d, 0x46, - 0x32, 0xae, 0xed, 0xa4, 0xe7, 0x21, 0x19, 0xd3, 0xfb, 0xea, 0x01, 0x83, - 0xd8, 0xdd, 0x94, 0x03, 0x05, 0x5a, 0xe4, 0x17, 0xfb, 0x26, 0xf0, 0x9e, - 0x46, 0xc8, 0x7b, 0x58, 0x9c, 0xb6, 0x2b, 0x4a, 0x0e, 0x8b, 0xcc, 0x7a, - 0x64, 0x52, 0x56, 0xc6, 0xc8, 0xe3, 0xc7, 0x2f, 0x04, 0x97, 0x3c, 0xbb, - 0x31, 0x2e, 0x46, 0x1e, 0x16, 0x84, 0x3d, 0x82, 0x75, 0x30, 0xb9, 0x8c, - 0x96, 0x34, 0x35, 0x6c, 0x8c, 0x45, 0x3f, 0xf8, 0x24, 0x73, 0xc9, 0x24, - 0xff, 0x07, 0xae, 0xd9, 0xa7, 0xfe, 0xad, 0xc7, 0xf5, 0x11, 0x72, 0x06, - 0x4c, 0x8c, 0xe2, 0xf9, 0x19, 0x70, 0xb9, 0x2b, 0x61, 0x8c, 0x36, 0x51, - 0x3c, 0x47, 0x44, 0x45, 0x68, 0x5d, 0x83, 0x88, 0xdd, 0x7c, 0xcb, 0xa5, - 0x02, 0x5e, 0xfa, 0xd1, 0xe8, 0x1c, 0x90, 0x4f, 0x33, 0x68, 0xa9, 0x8b, - 0x0e, 0xc7, 0xbc, 0xf0, 0x3f, 0x10, 0xa8, 0x89, 0xe7, 0xb3, 0x23, 0xa1, - 0xde, 0x26, 0x68, 0xf8, 0x98, 0x78, 0x33, 0x21, 0xe6, 0x52, 0xc9, 0xbf, - 0xf4, 0x46, 0x56, 0xe6, 0x6c, 0x55, 0xe3, 0x86, 0xeb, 0x00, 0x5b, 0x40, - 0xcb, 0xe3, 0x3a, 0x1a, 0x80, 0x46, 0xba, 0x25, 0xcc, 0xab, 0x73, 0xbd, - 0x71, 0xaa, 0x7f, 0x58, 0xd3, 0x0a, 0xce, 0xd0, 0xf7, 0x6d, 0x9d, 0x83, - 0xf9, 0xe6, 0x01, 0xc4, 0xc4, 0xb6, 0xf2, 0xeb, 0x80, 0xb9, 0x6e, 0x2a, - 0x7f, 0x21, 0x9a, 0x47, 0xa7, 0x6f, 0x6c, 0xe0, 0x25, 0x94, 0x52, 0x6a, - 0xe4, 0x2a, 0x44, 0xd1, 0x25, 0xe8, 0x9e, 0x7f, 0x67, 0x87, 0xff, 0xd2, - 0xb4, 0xab, 0x4a, 0x49, 0x78, 0x67, 0xc8, 0x71, 0x66, 0x95, 0xc0, 0xad, - 0xb1, 0xcc, 0xf0, 0xc2, 0x8b, 0x95, 0x42, 0xee, 0x30, 0x34, 0x0d, 0xba, - 0xad, 0x44, 0x29, 0xb0, 0xbf, 0xe6, 0xbd, 0xff, 0x48, 0xae, 0x94, 0x42, - 0xbd, 0xda, 0x05, 0x52, 0xd1, 0x0e, 0xa7, 0x10, 0x5d, 0xdd, 0x44, 0x7d, - 0x52, 0x8c, 0x55, 0x22, 0xc2, 0xd3, 0x22, 0x0a, 0x84, 0x53, 0xf1, 0x3e, - 0x6d, 0xcf, 0x43, 0x73, 0x64, 0x7c, 0x3b, 0x05, 0x6b, 0x40, 0x96, 0x64, - 0x04, 0xbc, 0x64, 0xde, 0x73, 0x4c, 0x18, 0x4b, 0xeb, 0x64, 0x41, 0x61, - 0x59, 0xbf, 0xba, 0xc9, 0xbd, 0xf4, 0x74, 0x9e, 0x13, 0x0e, 0x66, 0x7a, - 0xda, 0x29, 0x13, 0x9e, 0x47, 0xd8, 0x38, 0xba, 0x03, 0x0a, 0xf7, 0x82, - 0x6d, 0x90, 0x06, 0x08, 0x8f, 0x44, 0xf0, 0xca, 0x3b, 0x4e, 0x03, 0x66, - 0xe6, 0x99, 0xd9, 0xec, 0x8e, 0xa5, 0xa2, 0x82, 0x72, 0x40, 0x0c, 0x1b, - 0x22, 0x15, 0x7b, 0xf0, 0x31, 0x78, 0xe7, 0x5e, 0x47, 0x64, 0x11, 0x64, - 0xa8, 0xc1, 0xda, 0xa0, 0x08, 0x9a, 0x84, 0x7d, 0x91, 0xbc, 0xf0, 0x73, - 0x6f, 0xe9, 0x83, 0xc3, 0xa5, 0xbd, 0x28, 0xc1, 0x85, 0x7f, 0x70, 0x86, - 0xe0, 0xd8, 0x87, 0x9f, 0x77, 0x48, 0x76, 0x5c, 0x3f, 0x09, 0xc0, 0x3f, - 0xa3, 0xc0, 0x46, 0x03, 0xf1, 0x4a, 0x18, 0x22, 0x46, 0xdd, 0x7f, 0x8d, - 0xdf, 0xab, 0x22, 0x78, 0x1b, 0x6d, 0x96, 0xa1, 0xbd, 0xc9, 0xf7, 0x5c, - 0x4f, 0xa6, 0x57, 0x56, 0x91, 0x94, 0x9f, 0x51, 0x65, 0xe6, 0x71, 0x9c, - 0xd7, 0x36, 0x47, 0xd7, 0x67, 0x1b, 0xa1, 0x37, 0x30, 0x7c, 0x2d, 0x79, - 0xcc, 0xe0, 0x5c, 0xfd, 0x4c, 0xc2, 0x33, 0xa3, 0xbc, 0xd3, 0xf2, 0xa4, - 0xa9, 0x46, 0x06, 0x69, 0xe4, 0x5d, 0xf7, 0xdc, 0x2d, 0xa1, 0x34, 0x49, - 0x8f, 0xf1, 0x0c, 0xb8, 0x61, 0x0c, 0xbe, 0x00, 0x0b, 0x82, 0x4d, 0x86, - 0xda, 0x02, 0x3b, 0xec, 0x56, 0xfe, 0x43, 0x78, 0x3b, 0x25, 0xe2, 0x2b, - 0x84, 0x5b, 0x16, 0x97, 0xa3, 0xd4, 0x07, 0x3d, 0x7f, 0x4c, 0x2a, 0x9f, - 0xcd, 0xbb, 0x9b, 0xd9, 0x9e, 0x3a, 0xa8, 0x74, 0x24, 0x38, 0x6b, 0xc9, - 0xf1, 0xd1, 0x62, 0x00, 0xff, 0x00, 0x2e, 0xff, 0x3d, 0xd1, 0xcc, 0x9a, - 0x29, 0xce, 0xb8, 0x61, 0xd7, 0xad, 0x7b, 0x81, 0x3b, 0xcf, 0x22, 0x21, - 0x0d, 0xb2, 0x1a, 0x6b, 0x47, 0x7d, 0x6c, 0x88, 0x08, 0x32, 0x04, 0xa8, - 0x50, 0xad, 0x78, 0x1a, 0x4f, 0xf1, 0x42, 0x3c, 0xaf, 0xb9, 0x16, 0xa1, - 0xb8, 0x64, 0x8e, 0xc3, 0xab, 0x4b, 0x8f, 0x14, 0x34, 0x72, 0xe3, 0x0e, - 0xae, 0x57, 0x07, 0x16, 0xa9, 0xf8, 0xbc, 0x32, 0x53, 0x9a, 0xab, 0x26, - 0xc1, 0x04, 0x5b, 0x25, 0x25, 0xdf, 0x26, 0x95, 0x15, 0x24, 0x1d, 0xf0, - 0x73, 0x06, 0x6b, 0x2f, 0xe3, 0xb5, 0xa5, 0x99, 0xa7, 0x16, 0x61, 0x9f, - 0x47, 0x5a, 0xcb, 0x22, 0x0e, 0x78, 0xc1, 0xa5, 0x33, 0x1c, 0x8b, 0x67, - 0x09, 0xc8, 0xe9, 0xd6, 0xfb, 0x44, 0xb4, 0x23, 0xe9, 0xb0, 0x81, 0x85, - 0xff, 0x11, 0x93, 0xa6, 0xa1, 0xdf, 0xec, 0xf4, 0x4c, 0x7b, 0xe1, 0x8b, - 0x16, 0xe7, 0x19, 0x3a, 0x79, 0x34, 0xef, 0x21, 0x8e, 0xd1, 0x06, 0xe7, - 0x73, 0xc9, 0xf0, 0x68, 0x6a, 0x76, 0x1c, 0x00, 0xe2, 0xe7, 0x04, 0x29, - 0xf1, 0x7e, 0x17, 0x73, 0x23, 0x4a, 0x56, 0x33, 0xa5, 0x43, 0xe4, 0xb4, - 0x2c, 0xeb, 0xba, 0x02, 0x43, 0x91, 0x17, 0xf2, 0x3e, 0x09, 0xaf, 0x1f, - 0xc2, 0x09, 0xe1, 0xbc, 0xa5, 0x37, 0x00, 0x5a, 0xe5, 0x33, 0x69, 0xb8, - 0x03, 0xa4, 0xaa, 0xae, 0xad, 0x8d, 0xad, 0x03, 0xc2, 0x6a, 0xd2, 0x42, - 0x9a, 0x10, 0xcb, 0x48, 0x59, 0x32, 0xf3, 0x13, 0x80, 0x8a, 0x2e, 0x98, - 0xbe, 0xaf, 0x1b, 0xf7, 0x39, 0xbd, 0x4d, 0xc7, 0x54, 0xa4, 0xd7, 0x90, - 0x78, 0x4b, 0x5a, 0x56, 0x4e, 0x31, 0xde, 0xb1, 0xdf, 0xb2, 0x9b, 0x1a, - 0x91, 0xcd, 0xb3, 0xec, 0xdf, 0x93, 0xe4, 0x45, 0xee, 0x08, 0x6b, 0x8f, - 0xae, 0x89, 0x25, 0xee, 0xe5, 0x28, 0x61, 0x3b, 0x4a, 0xbf, 0x4f, 0xc0, - 0xcf, 0xd3, 0xb8, 0xde, 0x88, 0x40, 0x11, 0x56, 0x08, 0xa9, 0x4d, 0xdd, - 0xca, 0xec, 0x73, 0xb7, 0x9d, 0x16, 0x8b, 0x3c, 0xcb, 0x57, 0xe2, 0xd7, - 0xfe, 0x29, 0x60, 0x5f, 0x19, 0x70, 0x85, 0x35, 0x97, 0x69, 0xfa, 0x7d, - 0xf8, 0x72, 0xcf, 0xaa, 0x56, 0xe0, 0xff, 0x8e, 0x9e, 0xcf, 0x10, 0x13, - 0xca, 0x2f, 0xe8, 0xd9, 0x4f, 0x29, 0xc7, 0x14, 0xad, 0xde, 0x0f, 0x9b, - 0xb5, 0x7f, 0x05, 0x1b, 0x21, 0xaf, 0x50, 0x01, 0x4f, 0x3c, 0x6b, 0x15, - 0x21, 0x4b, 0xc9, 0x16, 0x36, 0x9b, 0x69, 0x03, 0xf5, 0xa1, 0x80, 0xa8, - 0x44, 0x39, 0x0c, 0x0e, 0xda, 0xf0, 0xda, 0x85, 0x6b, 0xc2, 0x04, 0x90, - 0xc4, 0x59, 0x5b, 0xed, 0xee, 0x36, 0x1a, 0x5a, 0x13, 0x6f, 0x70, 0x9e, - 0x1f, 0x7b, 0x97, 0x29, 0xe1, 0x00, 0x0b, 0xcc, 0xd5, 0xd3, 0xa4, 0x83, - 0xe6, 0x26, 0xda, 0xca, 0x39, 0xa2, 0xdd, 0x63, 0xac, 0xd8, 0xed, 0xa4, - 0x0b, 0x07, 0xa8, 0xca, 0x5b, 0x1f, 0x26, 0x0d, 0x8d, 0x65, 0xf5, 0xac, - 0xad, 0x19, 0xdc, 0x67, 0x64, 0x58, 0xc7, 0x15, 0x43, 0x7f, 0xfc, 0x12, - 0xf9, 0x8a, 0x82, 0x18, 0xa9, 0x5a, 0x14, 0xff, 0xca, 0xfb, 0xe8, 0x9a, - 0x58, 0x5f, 0xbd, 0xd3, 0x2e, 0xc3, 0x48, 0x7b, 0x9e, 0xf1, 0x8e, 0xff, - 0xe7, 0xc0, 0x98, 0x88, 0x60, 0x79, 0xec, 0x06, 0x10, 0x36, 0x3b, 0x62, - 0xfe, 0x38, 0x4d, 0x17, 0x86, 0x19, 0x42, 0x5f, 0x1e, 0x86, 0xde, 0xcb, - 0xa7, 0x3a, 0x81, 0x34, 0xba, 0x6d, 0xa9, 0x71, 0x25, 0x60, 0x41, 0xa0, - 0x47, 0x2c, 0xe6, 0xe9, 0xe4, 0x07, 0xd2, 0x6f, 0x41, 0xd6, 0x8d, 0x92, - 0xd0, 0xbe, 0xcf, 0x57, 0x6e, 0x77, 0x38, 0xa4, 0x85, 0xbb, 0x87, 0x10, - 0x71, 0x1e, 0x2e, 0xdf, 0x81, 0x2a, 0xc5, 0xf8, 0xcf, 0x58, 0x06, 0xef, - 0x1c, 0xd2, 0x1f, 0x47, 0xb7, 0x2f, 0x4d, 0x23, 0x61, 0x20, 0x6b, 0x13, - 0x40, 0x26, 0xe1, 0x67, 0x62, 0xd6, 0xde, 0xa5, 0xe7, 0xbd, 0xda, 0x94, - 0x4a, 0xec, 0x7e, 0x2e, 0xb0, 0x6f, 0x1b, 0x84, 0xb2, 0x47, 0x6d, 0xa2, - 0x53, 0x07, 0xf0, 0xb8, 0x41, 0x7c, 0xfe, 0x6c, 0x68, 0xb8, 0x9e, 0xa6, - 0xed, 0x64, 0xed, 0x6e, 0xf0, 0x46, 0x01, 0x7d, 0x29, 0x5c, 0xd8, 0x2b, - 0x63, 0xc3, 0x32, 0xf8, 0xd8, 0xe1, 0xb9, 0xc9, 0xb1, 0xc7, 0x84, 0xa3, - 0xc6, 0xa3, 0x01, 0xc3, 0x2e, 0xba, 0x43, 0xa9, 0x36, 0xf4, 0x9e, 0x0b, - 0x74, 0xed, 0x8b, 0xa5, 0x6f, 0xa9, 0x51, 0x92, 0x7a, 0x91, 0x60, 0x2a, - 0x79, 0x65, 0x4a, 0x38, 0xb8, 0xe1, 0x63, 0x7f, 0x5e, 0x32, 0x62, 0x99, - 0x82, 0x96, 0x0b, 0x17, 0x7c, 0x9c, 0x20, 0x05, 0xcd, 0x25, 0xb8, 0x93, - 0xec, 0xb1, 0xcc, 0xbb, 0x4c, 0xe6, 0x47, 0x7f, 0x68, 0x74, 0x29, 0xbf, - 0xf4, 0xb4, 0xd9, 0x13, 0x4a, 0x9f, 0xd6, 0x8a, 0xe9, 0x55, 0x55, 0x25, - 0x10, 0x0a, 0x36, 0xd9, 0x55, 0xf2, 0x76, 0x11, 0x32, 0x80, 0xaa, 0x1c, - 0x81, 0x51, 0x7f, 0xbd, 0xa2, 0x74, 0x11, 0xf9, 0xee, 0x71, 0xcb, 0x8a, - 0xc1, 0xdd, 0xcc, 0x28, 0xe5, 0x5b, 0xc0, 0x51, 0xc1, 0x5c, 0x2b, 0x52, - 0x1d, 0xb6, 0x8d, 0xe7, 0xb9, 0xd4, 0x6f, 0x49, 0xc7, 0x91, 0xad, 0x69, - 0x01, 0x3a, 0x85, 0xa7, 0xec, 0xdb, 0x7d, 0xa1, 0x7b, 0x52, 0xdd, 0xda, - 0xde, 0x76, 0x6c, 0xcf, 0xee, 0x9e, 0x71, 0xc1, 0x2d, 0x72, 0xc8, 0x1e, - 0x77, 0x3c, 0x9c, 0x1b, 0xeb, 0x62, 0xd3, 0x45, 0x99, 0xdd, 0x9d, 0x2c, - 0xf1, 0xea, 0x7c, 0x9b, 0x5e, 0xb3, 0xe6, 0x6d, 0x72, 0xf5, 0xc6, 0xec, - 0x1a, 0x08, 0x9f, 0x42, 0xc2, 0x4b, 0xe2, 0x21, 0x8e, 0x7d, 0x19, 0xbe, - 0x1f, 0x02, 0xb0, 0x4f, 0xb6, 0x67, 0x76, 0xcd, 0x7c, 0x9d, 0x1b, 0xd8, - 0x22, 0x78, 0x6f, 0x03, 0xfe, 0xaf, 0x71, 0xc8, 0x5c, 0x2c, 0xc5, 0x27, - 0xd9, 0x50, 0x3c, 0xf0, 0x5e, 0x8c, 0x5e, 0xa4, 0x97, 0xe5, 0x03, 0xec, - 0x97, 0x92, 0xeb, 0x45, 0xb7, 0x22, 0x6b, 0x8a, 0x8f, 0x8b, 0x32, 0x32, - 0xb0, 0xc4, 0xf7, 0x29, 0x2d, 0x38, 0xcb, 0xaa, 0xcf, 0x78, 0x13, 0x6e, - 0xf3, 0x8f, 0x9e, 0x58, 0x5f, 0xad, 0xbf, 0xc9, 0x85, 0x4b, 0x07, 0x15, - 0xcd, 0xe0, 0x27, 0x3d, 0x62, 0x3b, 0x92, 0xe6, 0x96, 0xbd, 0x2a, 0x29, - 0x4b, 0x18, 0xb5, 0x39, 0x9a, 0xf8, 0x9a, 0x4b, 0xf1, 0x6e, 0x0b, 0x38, - 0x08, 0xb1, 0x5e, 0x9d, 0x61, 0x33, 0x9f, 0xf9, 0xec, 0x1e, 0xb1, 0x61, - 0xd1, 0x44, 0x21, 0x12, 0x08, 0xb1, 0x5e, 0x9d, 0x61, 0x33, 0x9f, 0xf9, - 0xec, 0x1e, 0xb1, 0x61, 0xd1, 0x44, 0x21, 0x12, 0x08, 0xb1, 0x5e, 0x9d, - 0x3c, 0x91, 0x04, 0xb1, 0x32, 0xc9, 0xa4, 0x96, 0xcd, 0x51, 0xbf, 0x56, - 0xcf, 0x27, 0xd8, 0x2d, 0x8a, 0x15, 0x29, 0x9d, 0x03, 0x93, 0xaf, 0x1a, - 0xc1, 0xf8, 0xbe, 0x3b, 0x34, 0xe8, 0x06, 0x88, 0x20, 0x18, 0x75, 0x6a, - 0xbb, 0xfc, 0x78, 0x90, 0xc7, 0x6e, 0x5c, 0x68, 0xb6, 0x11, 0xa1, 0xa3, - 0x56, 0x8e, 0xe5, 0x3e, 0x10, 0x3b, 0xfd, 0x85, 0x9a, 0xf9, 0xeb, 0xd6, - 0x35, 0x04, 0xc2, 0x95, 0x47, 0xe9, 0xf5, 0xe3, 0x3e, 0x66, 0xf3, 0x85, - 0x4b, 0x22, 0x3e, 0xb0, 0x7d, 0xb7, 0xdc, 0x78, 0xfa, 0x7c, 0xa7, 0xa1, - 0x28, 0x75, 0xa3, 0xf7, 0xb5, 0x15, 0xec, 0x32, 0x61, 0x9f, 0xcb, 0x9f, - 0x8f, 0xf4, 0x3f, 0xa8, 0x4e, 0xc9, 0x17, 0x5b, 0x8b, 0xe2, 0xa1, 0x90, - 0xa3, 0xda, 0xa0, 0x62, 0xab, 0x15, 0x90, 0x60, 0x20, 0x3b, 0xb9, 0xc4, - 0xf8, 0x60, 0xd7, 0x67, 0x19, 0xf9, 0xac, 0x61, 0x75, 0x98, 0x03, 0xc7, - 0xa6, 0xbe, 0x46, 0xe0, 0xec, 0x00, 0x2c, 0x90, 0xc9, 0xea, 0xb3, 0x7f, - 0xee, 0xd8, 0x1a, 0x07, 0xcf, 0x15, 0x3f, 0x26, 0xae, 0xbe, 0x38, 0xc4, - 0xc0, 0x60, 0x68, 0xcd, 0x8d, 0xba, 0x5b, 0x94, 0x52, 0xd6, 0x8f, 0x7b, - 0xb7, 0xb1, 0xb2, 0xc5, 0x96, 0xb2, 0xfa, 0xd4, 0xe4, 0xad, 0x76, 0x99, - 0xf2, 0x1d, 0xdf, 0x90, 0xf5, 0x90, 0xe2, 0xe9, 0xe2, 0x6a, 0x65, 0xdc, - 0xdc, 0xb7, 0xe0, 0x6b, 0x9f, 0x4f, 0x5d, 0xf3, 0x42, 0xfc, 0x81, 0x4a, - 0x57, 0xf0, 0x7e, 0xcf, 0x05, 0xd1, 0x0c, 0x82, 0x41, 0xc3, 0xb8, 0xf1, - 0x34, 0x5d, 0x3f, 0x8d, 0x70, 0x3a, 0xae, 0xfd, 0x5a, 0xa2, 0x15, 0xcc, - 0x80, 0x09, 0x00, 0x3d, 0x6b, 0xdc, 0x76, 0x9f, 0xbd, 0x5c, 0xde, 0x33, - 0x0b, 0xec, 0x8b, 0x35, 0xdf, 0x43, 0xfe, 0xf2, 0xca, 0x35, 0x55, 0x20, - 0x8a, 0x11, 0xe2, 0x7f, 0x14, 0xe5, 0x56, 0x88, 0x32, 0x48, 0x74, 0x26, - 0x4f, 0x6e, 0x50, 0xab, 0x97, 0x36, 0xa3, 0x8e, 0xb5, 0x25, 0x78, 0xbb, - 0xec, 0xdd, 0xe2, 0x87, 0x3a, 0xd1, 0xa1, 0x29, 0xff, 0x9b, 0xa7, 0xbd, - 0x6b, 0xc4, 0x44, 0xa6, 0x2c, 0x57, 0xc9, 0xba, 0xb9, 0x34, 0xd5, 0x8e, - 0xed, 0x17, 0xab, 0x6f, 0xcf, 0x87, 0x66, 0x46, 0x78, 0x38, 0xef, 0x90, - 0x77, 0x0b, 0xd6, 0x41, 0xa9, 0xe6, 0x9b, 0x20, 0xa0, 0x3e, 0x22, 0xd4, - 0xc9, 0x45, 0xe5, 0x05, 0xaf, 0x9c, 0x35, 0x9c, 0xbb, 0xb1, 0x78, 0x93, - 0x26, 0x08, 0x41, 0x62, 0x62, 0x72, 0x95, 0x2f, 0x47, 0xe8, 0x64, 0xc7, - 0x5c, 0x09, 0x10, 0xc6, 0x51, 0xa5, 0x08, 0xc3, 0x4b, 0x77, 0xc3, 0xba, - 0xbb, 0x34, 0xd5, 0x8e, 0xed, 0x17, 0xab, 0x6f, 0x22, 0xed, 0xf7, 0xe6, - 0xae, 0xb6, 0x5e, 0xb7, 0x05, 0x5f, 0xbf, 0xd5, 0xde, 0x38, 0xf6, 0x56, - 0x7d, 0x80, 0x4b, 0x3a, 0xa5, 0x06, 0x6a, 0xd6, 0xde, 0xa6, 0xa6, 0x88, - 0xfe, 0x14, 0xdb, 0x95, 0x17, 0x9c, 0x23, 0x44, 0xa0, 0x80, 0x36, 0x23, - 0xe5, 0x6f, 0xfe, 0xf5, 0xad, 0x7e, 0x63, 0x70, 0x22, 0x92, 0x95, 0x89, - 0x48, 0x00, 0xbd, 0x1d, 0xd6, 0x76, 0x23, 0xb6, 0xf9, 0x87, 0xc6, 0xfa, - 0x0f, 0xf5, 0x28, 0xfa, 0x07, 0xf7, 0x38, 0xc0, 0x46, 0xb0, 0x8f, 0xe2, - 0xcf, 0x8a, 0xce, 0x53, 0xc1, 0xe0, 0x39, 0x10, 0xcd, 0xac, 0x7e, 0x8c, - 0x2d, 0x50, 0xdb, 0xbf, 0x85, 0xdd, 0x0b, 0xde, 0xff, 0x2e, 0x83, 0x39, - 0xc2, 0xc1, 0x9c, 0x7a, 0x5f, 0xc1, 0x0b, 0x49, 0x36, 0x66, 0xe7, 0x4e, - 0xed, 0xda, 0x95, 0x9b, 0x20, 0x28, 0x2f, 0xdb, 0x76, 0xf0, 0x27, 0x39, - 0x26, 0x9e, 0x44, 0x37, 0x90, 0xa5, 0xcf, 0x37, 0x51, 0x4f, 0xa1, 0x3b, - 0x23, 0x81, 0x8f, 0x7f, 0x85, 0x42, 0x17, 0x4b, 0x31, 0x71, 0xa9, 0x8e, - 0xb6, 0x2d, 0x0d, 0x71, 0xfd, 0x08, 0x2a, 0x06, 0xa8, 0x12, 0x66, 0x0b, - 0xd1, 0x10, 0x2c, 0x23, 0x12, 0x4a, 0xb1, 0x34, 0x0e, 0xab, 0x42, 0x85, - 0x1c, 0x9b, 0x85, 0x43, 0x9d, 0x1d, 0x04, 0xa3, 0x04, 0x0f, 0x6e, 0xac, - 0x79, 0xbd, 0x19, 0x88, 0xf2, 0xf9, 0xdb, 0xc3, 0xf4, 0xb9, 0x99, 0x2d, - 0xc9, 0x6d, 0xd9, 0x05, 0x11, 0xd5, 0x91, 0x5b, 0xcb, 0x9a, 0x59, 0x20, - 0x8b, 0xe5, 0xcc, 0xd3, 0x16, 0x37, 0x71, 0x72, 0x5d, 0xcb, 0xd9, 0x01, - 0x61, 0xb9, 0x0d, 0xc0, 0x84, 0xdc, 0xdc, 0x15, 0x6f, 0x25, 0xa1, 0xce, - 0xed, 0x7b, 0x63, 0x8b, 0x4f, 0xa5, 0x5d, 0x69, 0x61, 0x8d, 0x3f, 0x8e, - 0x31, 0x3a, 0xb7, 0x00, 0x46, 0x99, 0x58, 0xb5, 0x4c, 0x98, 0x61, 0x04, - 0xec, 0xcb, 0x97, 0xfd, 0x44, 0x21, 0x93, 0x21, 0x0a, 0xb7, 0x4a, 0x5b, - 0x21, 0x30, 0x36, 0x64, 0xe3, 0xd0, 0x23, 0x96, 0x99, 0xc6, 0xdf, 0x32, - 0x27, 0xbc, 0x76, 0x39, 0xbf, 0x0f, 0x5f, 0x05, 0x30, 0x35, 0x98, 0x61, - 0xd0, 0xbd, 0x1a, 0x6c, 0xce, 0x72, 0x9c, 0xb3, 0x61, 0xba, 0xd2, 0xd9, - 0xfa, 0xf9, 0x14, 0xea, 0x38, 0x73, 0x99, 0xd9, 0x0c, 0x99, 0x70, 0x0e, - 0x23, 0x3d, 0xa1, 0x52, 0x43, 0x71, 0x50, 0x17, 0x69, 0xe4, 0x32, 0xfa, - 0xba, 0x28, 0x5d, 0xd0, 0xd6, 0xbd, 0xd4, 0x0d, 0x4f, 0x5f, 0x83, 0x33, - 0xa2, 0x4b, 0x43, 0xa8, 0x9c, 0x75, 0x8d, 0xd7, 0x7d, 0xb6, 0x77, 0xa2, - 0xa7, 0xe4, 0x20, 0xb0, 0xa1, 0xa2, 0x8b, 0x57, 0x07, 0x88, 0x7c, 0x39, - 0xbf, 0x0c, 0x5f, 0x05, 0x30, 0x35, 0x98, 0x61, 0xd0, 0xbd, 0x1a, 0x6c, - 0xce, 0x72, 0x9c, 0xb3, 0x61, 0xba, 0xd2, 0xd9, 0xfa, 0xf9, 0x14, 0xea, - 0x38, 0x73, 0x99, 0xd9, 0x0c, 0x99, 0x70, 0x0e, 0x23, 0x3d, 0xa1, 0x52, - 0x43, 0x71, 0x50, 0x17, 0x69, 0xe4, 0x32, 0xfa, 0xba, 0x28, 0x5d, 0xd0, - 0xd6, 0xbd, 0xd4, 0x0d, 0x8a, 0xd1, 0xed, 0xf5, 0x4a, 0x70, 0x64, 0xaf, - 0x03, 0xa8, 0x9d, 0x44, 0x4d, 0xf8, 0x18, 0x0a, 0xa7, 0xe4, 0x20, 0xb0, - 0xa1, 0xa2, 0x8b, 0x57, 0x07, 0x8e, 0x7c, 0x39, 0xbf, 0x0d, 0x5f, 0x05, - 0x30, 0x35, 0x98, 0x61, 0xd0, 0xbd, 0x1a, 0x6c, 0xce, 0x72, 0x9c, 0xb3, - 0x61, 0xba, 0xd2, 0xd9, 0xfa, 0xf9, 0x14, 0xea, 0x38, 0x73, 0x99, 0xd9, - 0x0c, 0x99, 0x70, 0x0e, 0x23, 0x3d, 0xa1, 0x52, 0x43, 0x71, 0x50, 0x17, - 0x69, 0xe4, 0x32, 0xfa, 0xba, 0x28, 0x5d, 0xd0, 0xd6, 0xbd, 0xd4, 0x0d, - 0x37, 0xac, 0xce, 0x56, 0xe0, 0x31, 0x1a, 0x1d, 0x07, 0xf2, 0x5b, 0x0c, - 0xe7, 0xaa, 0x18, 0xc0, 0x92, 0x12, 0xbc, 0x83, 0x21, 0x8b, 0x92, 0x21, - 0xb5, 0xfb, 0x24, 0x66, 0x20, 0x91, 0x88, 0xe6, 0x3f, 0x2f, 0x8e, 0x00, - 0xcd, 0xfd, 0x4d, 0xc5, 0x54, 0x7f, 0x31, 0x53, 0x2c, 0x10, 0xe6, 0x0c, - 0x31, 0x35, 0x91, 0xda, 0xe6, 0x44, 0xbb, 0xcb, 0xb4, 0x4e, 0xf1, 0xed, - 0x7f, 0xc5, 0xae, 0x32, 0x85, 0x7f, 0x4f, 0xcb, 0x30, 0xd9, 0x78, 0x3e, - 0x3e, 0x17, 0x43, 0x5c, 0xae, 0x22, 0x22, 0x88, 0xeb, 0xdd, 0x40, 0x3f, - 0xe2, 0x98, 0x63, 0xa9, 0xa2, 0x65, 0x62, 0xe4, 0x2e, 0x49, 0xa1, 0xb7, - 0xc8, 0x26, 0x23, 0xa5, 0x58, 0xc2, 0xa0, 0x6b, 0xaa, 0x96, 0xf5, 0x8d, - 0xb2, 0x41, 0x87, 0xc7, 0x3f, 0x43, 0xd3, 0x73, 0x58, 0x51, 0x9c, 0x99, - 0x77, 0x1a, 0xa7, 0xe1, 0xaa, 0xd6, 0xb6, 0x9c, 0x04, 0xaf, 0x96, 0xdf, - 0xb8, 0xa0, 0x12, 0xdd, 0x5f, 0x90, 0xfe, 0xd2, 0x39, 0x23, 0x35, 0xf5, - 0xa6, 0x27, 0x3a, 0xdf, 0xc8, 0x59, 0x6d, 0x74, 0xe5, 0xf2, 0x9d, 0x12, - 0x62, 0xbe, 0xd6, 0xb6, 0x49, 0xdd, 0xc5, 0xef, 0x5e, 0xb9, 0xa9, 0x68, - 0x9c, 0x77, 0x76, 0x88, 0xcf, 0xe8, 0x35, 0x58, 0xf4, 0xee, 0x4e, 0xe0, - 0xda, 0x09, 0x4d, 0xe1, 0x44, 0x63, 0x49, 0xfc, 0xd6, 0xb0, 0x53, 0x74, - 0x7b, 0xd9, 0xd7, 0x04, 0xc7, 0xcd, 0xf0, 0x01, 0x71, 0xba, 0xb8, 0xc2, - 0xeb, 0x25, 0x8c, 0xf3, 0xfd, 0x3a, 0xf6, 0xdb, 0xa9, 0x70, 0xcb, 0x37, - 0xa7, 0x12, 0xa7, 0x04, 0x37, 0x50, 0xac, 0xc5, 0xb2, 0x49, 0xa7, 0xb5, - 0xae, 0xe2, 0x99, 0x06, 0x31, 0x37, 0xf7, 0x7a, 0x49, 0x3d, 0xc0, 0x80, - 0x76, 0x7b, 0x6e, 0x55, 0xc5, 0x6b, 0x18, 0xa9, 0x30, 0x27, 0x4c, 0x36, - 0xd2, 0xa9, 0xb7, 0xcf, 0xf0, 0xfc, 0x1b, 0x63, 0x1b, 0x35, 0x5c, 0x50, - 0x56, 0x9c, 0x11, 0xa7, 0xb3, 0x7d, 0x45, 0xe4, 0x04, 0xac, 0x9d, 0x73, - 0x11, 0x83, 0x12, 0x04, 0x7a, 0x62, 0xec, 0x0f, 0x6e, 0xd4, 0x84, 0x5d, - 0x48, 0x15, 0x34, 0x09, 0x3f, 0x7d, 0x66, 0xbb, 0xf8, 0xcd, 0x8c, 0x94, - 0xce, 0x32, 0x4b, 0xda, 0x94, 0xf8, 0xa3, 0x0a, 0x66, 0x8f, 0x3a, 0x14, - 0x23, 0x02, 0xf6, 0x2a, 0x38, 0x98, 0x26, 0xc3, 0xe7, 0xe2, 0x05, 0x38, - 0x3f, 0x9b, 0x95, 0xf9, 0xf3, 0x4b, 0x80, 0x5b, 0x90, 0xf0, 0x9e, 0x35, - 0xce, 0x52, 0x0b, 0x5f, 0x1a, 0x1e, 0xa7, 0x0e, 0x78, 0xef, 0x88, 0x84, - 0x8f, 0x2c, 0xef, 0x3f, 0xf0, 0x1c, 0x8a, 0xf1, 0xfe, 0xfd, 0xc3, 0x47, - 0x48, 0xfa, 0xa0, 0xe3, 0x34, 0xa5, 0x8e, 0xcb, 0x66, 0x99, 0xe1, 0x0e, - 0xe6, 0xda, 0x96, 0x9e, 0x01, 0x44, 0x6a, 0x2b, 0xe7, 0xea, 0xe8, 0x16, - 0xd5, 0x97, 0x9d, 0x3c, 0xe6, 0xab, 0x88, 0x19, 0xed, 0xea, 0x1d, 0xd3, - 0xd2, 0xa2, 0x10, 0x5b, 0x1b, 0xcb, 0xed, 0x41, 0x0f, 0xe9, 0x90, 0x9a, - 0x4d, 0x4f, 0x92, 0x8a, 0x09, 0x52, 0xb2, 0x87, 0x6e, 0xab, 0x73, 0x2f, - 0xc3, 0x22, 0x15, 0xb1, 0xfe, 0x65, 0x22, 0x47, 0xcb, 0x7b, 0x6f, 0x2f, - 0xf7, 0x76, 0x13, 0x7a, 0xda, 0xe6, 0xb8, 0xbf, 0x4d, 0xa5, 0xc0, 0x95, - 0x77, 0x2a, 0x83, 0xa3, 0x5d, 0x59, 0x44, 0x89, 0x9a, 0xfa, 0xa4, 0xe3, - 0x39, 0x6e, 0x8f, 0xbf, 0x57, 0xab, 0x09, 0x22, 0x60, 0x7a, 0x58, 0x34, - 0x6a, 0xd4, 0x34, 0x94, 0xed, 0xe3, 0x01, 0xdc, 0xa3, 0xef, 0x4b, 0xcd, - 0x1e, 0x20, 0x14, 0x3a, 0x89, 0xa3, 0x98, 0x23, 0xbc, 0x4f, 0xfc, 0xcd, - 0x34, 0xfa, 0x93, 0x2b, 0xcf, 0x4c, 0x69, 0x34, 0x39, 0xbc, 0x2b, 0x5a, - 0x0a, 0xf4, 0x50, 0x2d, 0xbd, 0x05, 0xd5, 0x2e, 0x7e, 0x9c, 0x97, 0x04, - 0xab, 0x82, 0x9a, 0x0a, 0x6b, 0x07, 0xd6, 0x29, 0xe3, 0xfc, 0x7e, 0xc4, - 0xda, 0xcc, 0x18, 0x87, 0x0d, 0xa6, 0x8b, 0x20, 0x7a, 0x11, 0xd9, 0xc2, - 0x80, 0x98, 0x6e, 0x72, 0x3c, 0x87, 0x7f, 0x77, 0x20, 0x9e, 0x38, 0x1b, - 0x0f, 0x58, 0x55, 0xcf, 0xce, 0x7c, 0x35, 0xfa, 0x11, 0xba, 0xed, 0xbf, - 0xd0, 0xd3, 0xd9, 0x1e, 0x31, 0xea, 0x67, 0x57, 0xea, 0x19, 0xcf, 0xf1, - 0xbd, 0x58, 0xda, 0xa1, 0x29, 0x44, 0xb7, 0xc1, 0x43, 0xf5, 0x0e, 0x56, - 0xd8, 0x9f, 0xe9, 0x02, 0xca, 0xc5, 0xf3, 0xc4, 0xe9, 0x00, 0x8c, 0xd2, - 0x62, 0xad, 0xed, 0xe1, 0x93, 0xe6, 0xff, 0xb9, 0x49, 0x1a, 0x5c, 0xcb, - 0x95, 0x77, 0x10, 0xef, 0x27, 0x2e, 0xd8, 0xde, 0xb7, 0x2b, 0xe3, 0xb2, - 0x78, 0x96, 0x64, 0x31, 0xb3, 0xc6, 0xf1, 0x6e, 0xf4, 0xa8, 0x26, 0xa1, - 0x69, 0x36, 0x21, 0x62, 0x54, 0x97, 0x38, 0x61, 0x84, 0xb3, 0x61, 0xa9, - 0x07, 0x91, 0xd2, 0x73, 0xec, 0x9b, 0x8d, 0x7d, 0x0b, 0xcd, 0x71, 0x32, - 0x92, 0x29, 0x79, 0x8b, 0x4a, 0x79, 0x59, 0xed, 0xd6, 0x32, 0x09, 0x9b, - 0xfa, 0xcc, 0x52, 0x46, 0xb1, 0x10, 0xfc, 0x2c, 0x8e, 0x20, 0xcf, 0x6f, - 0x82, 0xe7, 0xeb, 0x37, 0x23, 0x91, 0x22, 0xd1, 0x49, 0x18, 0x5f, 0x20, - 0x94, 0x6a, 0xf7, 0x8d, 0x55, 0x84, 0xbf, 0x8e, 0x3b, 0x9f, 0xae, 0xbd, - 0x6d, 0xcc, 0xcd, 0x13, 0xbb, 0x71, 0xf7, 0x4f, 0xa3, 0x95, 0x1f, 0xda, - 0xc7, 0xf2, 0x3a, 0x2a, 0xb2, 0x25, 0x6b, 0xd9, 0x59, 0x04, 0xc3, 0xed, - 0x30, 0x7c, 0x5d, 0x8c, 0xaf, 0xab, 0x20, 0xde, 0xbd, 0x59, 0x6f, 0x0a, - 0x78, 0xe5, 0xcc, 0x0b, 0x1e, 0xaf, 0x99, 0xb6, 0x4e, 0x8d, 0x9e, 0x46, - 0xde, 0xf9, 0x00, 0xe3, 0x2f, 0xbe, 0x69, 0x4e, 0x5e, 0x56, 0x6b, 0x62, - 0x1b, 0x77, 0xd4, 0xee, 0x0e, 0x22, 0x4b, 0x52, 0xd9, 0x27, 0xb1, 0xf9, - 0xfb, 0xce, 0x83, 0x79, 0x37, 0x27, 0x69, 0xd6, 0x6e, 0xa4, 0x9c, 0x8b, - 0xe6, 0x43, 0x3f, 0xce, 0x43, 0x6b, 0x9e, 0x15, 0x1e, 0xef, 0x19, 0x3c, - 0x55, 0x14, 0x9e, 0x44, 0xc9, 0xeb, 0xa1, 0x3c, 0xca, 0xb2, 0xcf, 0x83, - 0x03, 0x14, 0xda, 0x56, 0x95, 0xc4, 0xcc, 0xcf, 0x0f, 0xa3, 0xed, 0x09, - 0x11, 0x75, 0x44, 0x48, 0x53, 0x08, 0x24, 0x2e, 0x39, 0x8e, 0x0e, 0xf5, - 0x17, 0x2c, 0x41, 0x72, 0x96, 0x33, 0xd2, 0x31, 0x69, 0xb1, 0x0b, 0x2a, - 0xc9, 0xe3, 0x6b, 0xa9, 0x07, 0x91, 0xd4, 0x73, 0xec, 0x9b, 0x8d, 0x7d, - 0x11, 0x1f, 0x24, 0xbc, 0x2f, 0x4c, 0x29, 0x16, 0x3e, 0xbf, 0x49, 0x9f, - 0x05, 0xc9, 0x7a, 0x64, 0x02, 0x0c, 0x43, 0xb4, 0xc3, 0xba, 0xe8, 0x92, - 0x8c, 0xd3, 0xc8, 0x75, 0x0a, 0xdc, 0x11, 0x1e, 0x40, 0x5d, 0x8e, 0x44, - 0x2f, 0xf2, 0xb3, 0xb5, 0x12, 0x89, 0xd1, 0xff, 0x83, 0xfe, 0xf8, 0x25, - 0x9f, 0xf3, 0xf1, 0x45, 0x8d, 0x26, 0xce, 0x86, 0x1c, 0xe9, 0x86, 0x29, - 0xb6, 0xcd, 0xf7, 0x7f, 0x74, 0xa3, 0x1c, 0x20, 0x8e, 0xb3, 0x61, 0xa9, - 0x07, 0x91, 0xda, 0x73, 0xec, 0x9b, 0x8d, 0x7d, 0x1a, 0x2d, 0x23, 0x0c, - 0x3d, 0x6d, 0x25, 0xe1, 0x5d, 0x9a, 0xbf, 0xce, 0xdb, 0xda, 0x1c, 0x7f, - 0xba, 0xd8, 0x4b, 0x4d, 0xf5, 0xff, 0x68, 0x0b, 0x14, 0x10, 0x05, 0x95, - 0x45, 0x29, 0x75, 0x5d, 0xe4, 0x22, 0x55, 0x5e, 0xba, 0x89, 0x91, 0x9a, - 0x1c, 0x93, 0x54, 0x62, 0xfb, 0x36, 0xc8, 0x3d, 0x23, 0x0b, 0x3a, 0xd2, - 0xe0, 0xb0, 0xa7, 0xa8, 0x36, 0xc9, 0x99, 0xa2, 0xf4, 0xcf, 0x77, 0xa0, - 0x32, 0xc3, 0x5e, 0xea, 0xcc, 0xdc, 0x81, 0xc6, 0xd7, 0xb1, 0x88, 0x18, - 0x90, 0xeb, 0xd6, 0xdc, 0x80, 0x83, 0x42, 0x36, 0xc5, 0x35, 0x3a, 0x85, - 0x2b, 0x0c, 0xf8, 0xd1, 0xeb, 0x2b, 0xe4, 0xad, 0xf0, 0x88, 0x2e, 0x57, - 0x10, 0xef, 0xdb, 0xaf, 0x24, 0xff, 0x65, 0x3a, 0x72, 0x39, 0xab, 0x2b, - 0x59, 0xfe, 0x25, 0xd7, 0x74, 0xd6, 0xcd, 0x76, 0x04, 0x33, 0xd0, 0xaf, - 0x50, 0x7c, 0x83, 0x74, 0x7d, 0x3c, 0x35, 0xf9, 0x24, 0xda, 0x20, 0x60, - 0xab, 0xc0, 0xea, 0x82, 0xc8, 0x7d, 0x20, 0x7d, 0xff, 0x3b, 0x47, 0x8d, - 0x6a, 0xbc, 0xd4, 0x34, 0xcc, 0xcf, 0x0d, 0x9a, 0x3e, 0xb6, 0x01, 0xf0, - 0x31, 0x6d, 0xa3, 0xc8, 0x5d, 0x9e, 0x95, 0xb5, 0x56, 0xfd, 0x23, 0x0e, - 0xf6, 0x33, 0x8a, 0x31, 0xf7, 0x73, 0xba, 0x96, 0x11, 0xa0, 0x7e, 0x31, - 0x5d, 0x7f, 0x47, 0xdd, 0xaa, 0xbf, 0x33, 0xe1, 0x80, 0x8e, 0x37, 0x71, - 0x8d, 0x49, 0xdf, 0xb5, 0xd5, 0xbb, 0x23, 0xd0, 0x97, 0xc0, 0x6d, 0xfb, - 0x47, 0xb3, 0x3a, 0x25, 0x66, 0x0c, 0x97, 0x7d, 0xa0, 0x00, 0x42, 0x78, - 0x07, 0x3d, 0xa6, 0xaf, 0x50, 0x6c, 0x82, 0x0c, 0x2e, 0xc7, 0x2d, 0xba, - 0x4f, 0x19, 0x98, 0x75, 0x78, 0xa6, 0x38, 0x81, 0xea, 0x1e, 0x18, 0x52, - 0x23, 0x97, 0x23, 0x9c, 0xbc, 0xfd, 0x3f, 0x36, 0x1d, 0x27, 0x9a, 0x38, - 0xcd, 0x0a, 0x1e, 0xf2, 0xe7, 0x5f, 0x5e, 0xaa, 0x4b, 0x15, 0x3a, 0xcd, - 0xd7, 0xc6, 0x46, 0x56, 0x41, 0x2e, 0x48, 0x30, 0x7a, 0xfc, 0xcd, 0xf8, - 0x07, 0x52, 0x88, 0x62, 0x39, 0xb4, 0x7b, 0x8a, 0x3e, 0xbf, 0xca, 0x08, - 0x25, 0xbe, 0x44, 0x4c, 0xbb, 0x95, 0xde, 0x31, 0x82, 0xab, 0xec, 0x90, - 0x54, 0x0e, 0x73, 0x73, 0xdc, 0xf3, 0xcf, 0xda, 0x50, 0xe6, 0xa6, 0x3e, - 0x7f, 0xbe, 0x59, 0xbb, 0xf6, 0x58, 0xe2, 0xe1, 0x36, 0x2e, 0x00, 0xfb, - 0x41, 0x59, 0x7b, 0x1e, 0xcd, 0x7d, 0x57, 0x46, 0x4b, 0x37, 0xb9, 0x9f, - 0xd7, 0xc7, 0x60, 0x10, 0x86, 0xe2, 0xf5, 0x40, 0xa1, 0x03, 0xd0, 0x99, - 0x0e, 0xaa, 0xda, 0x9f, 0xf7, 0xaa, 0x90, 0x17, 0x51, 0xfd, 0x7f, 0x10, - 0xf2, 0xe9, 0x65, 0x77, 0x02, 0x91, 0x0d, 0x0d, 0x5d, 0x34, 0x4b, 0xf4, - 0x2e, 0x2d, 0xad, 0x9a, 0x8b, 0x29, 0x9d, 0x99, 0xd0, 0x66, 0xfd, 0x93, - 0xb7, 0xd1, 0x7e, 0xaa, 0xc7, 0x00, 0x85, 0x29, 0x58, 0x7e, 0x48, 0x6b, - 0x36, 0xed, 0x87, 0x44, 0x29, 0x4d, 0xdc, 0x54, 0x57, 0x73, 0xf0, 0xe4, - 0x8e, 0x09, 0xf8, 0x46, 0xd7, 0xfa, 0x64, 0xcc, 0xad, 0xcc, 0x03, 0x8d, - 0xd4, 0x04, 0x85, 0x55, 0xd4, 0x2d, 0x16, 0x54, 0xcc, 0x88, 0x26, 0x94, - 0x30, 0x82, 0x11, 0x50, 0x12, 0xd8, 0x6f, 0xe1, 0x2f, 0x4f, 0x55, 0x7a, - 0x08, 0x9d, 0xed, 0xdd, 0xd7, 0xec, 0x97, 0xe7, 0xb2, 0x1b, 0x09, 0xdf, - 0x8c, 0x31, 0xdc, 0xa9, 0xbf, 0x6b, 0x49, 0x93, 0x22, 0xd0, 0x49, 0x8d, - 0xe8, 0x9d, 0x9a, 0x91, 0x03, 0xd3, 0x7d, 0xcd, 0x2c, 0x1c, 0x67, 0x84, - 0x95, 0x39, 0x65, 0x7e, 0xa2, 0x17, 0xfa, 0x4f, 0xc0, 0x2d, 0x2c, 0xe0, - 0x90, 0xe8, 0xb0, 0xff, 0xe8, 0x3d, 0xa4, 0x91, 0xb2, 0x19, 0x7e, 0x11, - 0xc5, 0x0d, 0x2e, 0x86, 0x4c, 0x6b, 0x79, 0xee, 0x6c, 0x62, 0x62, 0x0c, - 0x17, 0x5d, 0x6c, 0x7c, 0x82, 0x06, 0xfc, 0x52, 0x77, 0xdd, 0xb9, 0x2d, - 0x31, 0x27, 0x1b, 0x31, 0xa9, 0x2f, 0xd2, 0x92, 0x3b, 0xc2, 0x91, 0xc0, - 0x7e, 0xf2, 0xd6, 0xb1, 0xe6, 0xea, 0xf2, 0x29, 0x69, 0x48, 0x97, 0x04, - 0xa3, 0x34, 0xd2, 0xa1, 0x70, 0x56, 0x26, 0x38, 0xf1, 0x08, 0x7b, 0x0f, - 0xcd, 0xaa, 0xa6, 0xa3, 0x1f, 0x07, 0x4b, 0xf3, 0xe6, 0x4c, 0xb6, 0x57, - 0x27, 0x42, 0xa0, 0xd9, 0xfb, 0x22, 0x8f, 0x6b, 0x43, 0xed, 0xf9, 0x2f, - 0x96, 0x32, 0xa2, 0xd7, 0x61, 0xf0, 0xbd, 0xb2, 0x32, 0x22, 0x4f, 0x57, - 0xc2, 0xe9, 0x6c, 0x0b, 0x1a, 0x62, 0x65, 0xce, 0xab, 0x67, 0x4e, 0xe4, - 0x6d, 0x38, 0xf6, 0x05, 0xfe, 0x62, 0xab, 0xe0, 0x8a, 0x37, 0xce, 0x01, - 0x3b, 0xa1, 0xa9, 0x91, 0x0c, 0x78, 0x27, 0x48, 0x4f, 0xa6, 0xac, 0x10, - 0x0b, 0xaa, 0x6f, 0x5e, 0x72, 0xb0, 0x67, 0x83, 0x28, 0x78, 0x72, 0x25, - 0x94, 0x97, 0x81, 0xa1, 0xe8, 0x77, 0x85, 0x5b, 0x99, 0x02, 0xdf, 0xd8, - 0xfe, 0x69, 0x55, 0xad, 0xa4, 0x51, 0xcf, 0x9c, 0x5b, 0x27, 0x02, 0x5d, - 0x78, 0xa2, 0x9f, 0xf0, 0xeb, 0xf7, 0x69, 0xf9, 0x6b, 0x4e, 0xdf, 0x65, - 0x59, 0x23, 0x03, 0xda, 0x36, 0xad, 0xf2, 0x7b, 0x97, 0xcf, 0x73, 0x84, - 0xf3, 0xbb, 0xb7, 0xc5, 0xe8, 0xab, 0x8a, 0xb2, 0x9c, 0xf1, 0x19, 0xc0, - 0xce, 0x8c, 0xac, 0x2c, 0x14, 0xd2, 0x33, 0x68, 0x71, 0x5d, 0xf7, 0xdf, - 0x73, 0xde, 0x67, 0xfc, 0xec, 0xbb, 0x05, 0x7f, 0x04, 0x41, 0xa5, 0x88, - 0x19, 0xc8, 0x2c, 0x1e, 0x96, 0x59, 0x9f, 0xe7, 0x10, 0xf2, 0x24, 0x2d, - 0x36, 0x67, 0x77, 0x63, 0x10, 0xce, 0x51, 0xb4, 0x0a, 0x10, 0x86, 0xe6, - 0xc8, 0x24, 0xe2, 0xf5, 0x21, 0xa4, 0xc6, 0x8f, 0x73, 0x8a, 0x84, 0x1b, - 0xe8, 0xd4, 0x92, 0x39, 0x1c, 0x9b, 0xdf, 0x7d, 0x02, 0x28, 0xac, 0xa1, - 0x02, 0x42, 0x92, 0xe5, 0xed, 0xd0, 0x77, 0xb7, 0x99, 0xd7, 0xb9, 0xac, - 0x67, 0x08, 0xf9, 0xac, 0x51, 0x6c, 0x25, 0xa2, 0x68, 0xc8, 0x87, 0xe9, - 0x48, 0x0d, 0x4b, 0x2e, 0xcc, 0xaf, 0x96, 0xe1, 0x5a, 0x23, 0x02, 0x81, - 0x89, 0x6b, 0xd8, 0x4d, 0xcc, 0xdc, 0x99, 0xdf, 0xd5, 0x83, 0xc5, 0x97, - 0x67, 0xe6, 0x2e, 0x48, 0xaf, 0x09, 0xd1, 0x9c, 0xc1, 0x79, 0x70, 0x6c, - 0x06, 0x15, 0xf9, 0x17, 0x25, 0xb1, 0x77, 0xb0, 0xc1, 0x35, 0x2a, 0xaa, - 0x91, 0x6e, 0x08, 0xc1, 0x06, 0x03, 0x87, 0xbd, 0x78, 0x5c, 0xea, 0xa0, - 0xd2, 0x2c, 0x35, 0x6c, 0xa9, 0xc0, 0x97, 0x26, 0x5c, 0xc7, 0xbb, 0xfd, - 0x58, 0x54, 0x47, 0xce, 0x65, 0x52, 0xe6, 0x80, 0x1f, 0x6b, 0x31, 0xa4, - 0x0c, 0xb9, 0x3d, 0xc4, 0x63, 0x7a, 0xd1, 0x9f, 0xe9, 0xe4, 0x02, 0x86, - 0x50, 0xb0, 0x83, 0x50, 0xbf, 0x3a, 0x55, 0x58, 0xd3, 0xef, 0x63, 0x77, - 0x27, 0x89, 0xec, 0x6a, 0x0c, 0xc2, 0xe3, 0xe9, 0x43, 0x5c, 0x17, 0x5e, - 0xa4, 0x28, 0xaa, 0x8f, 0x98, 0x0e, 0x71, 0xd2, 0x47, 0x8b, 0x47, 0x17, - 0x43, 0x95, 0xbe, 0x66, 0x60, 0xda, 0x75, 0xb5, 0xef, 0x1c, 0xf2, 0x10, - 0x09, 0xed, 0xdc, 0x14, 0x9e, 0xa9, 0x48, 0xe2, 0xf0, 0x54, 0xbf, 0x1d, - 0x6f, 0x1d, 0xd3, 0x37, 0xaf, 0xf5, 0xf0, 0x5a, 0x24, 0xdd, 0x43, 0x5d, - 0xc4, 0x23, 0x95, 0x7c, 0x26, 0xb4, 0x5b, 0x64, 0xe8, 0x37, 0x77, 0xa2, - 0x75, 0x89, 0x34, 0x82, 0x98, 0x60, 0xb4, 0x92, 0x58, 0x81, 0x66, 0xb6, - 0x0e, 0x67, 0xa0, 0x16, 0x73, 0x20, 0x08, 0x48, 0x88, 0x71, 0x00, 0x04, - 0x39, 0x19, 0x22, 0xa7, 0xe7, 0x5b, 0x2d, 0xde, 0x71, 0xbe, 0x4d, 0x04, - 0x91, 0xe0, 0xa2, 0x4b, 0xa6, 0x5a, 0x23, 0xb2, 0x1f, 0x63, 0xa9, 0xe8, - 0xe2, 0x0f, 0x77, 0xe7, 0x99, 0xe2, 0x7c, 0x63, 0xa7, 0x3c, 0x38, 0x4d, - 0xc1, 0x33, 0x35, 0x38, 0x4d, 0x71, 0x78, 0x9d, 0x81, 0xd6, 0xf9, 0xe6, - 0x4f, 0xfd, 0x6e, 0xb2, 0x2d, 0x16, 0x88, 0xb7, 0xf3, 0xad, 0xb3, 0x15, - 0xd3, 0x34, 0x0f, 0x11, 0x9e, 0x4c, 0xc5, 0xde, 0xec, 0x9e, 0xf3, 0xb2, - 0xea, 0xcd, 0xc9, 0x0e, 0x1d, 0x66, 0x20, 0xf5, 0xe1, 0xc6, 0xe9, 0xf9, - 0xd3, 0xf5, 0xbe, 0xe0, 0x98, 0xda, 0xeb, 0x9f, 0x46, 0x89, 0x1b, 0x8e, - 0x30, 0xb0, 0x0d, 0xec, 0xd9, 0x6c, 0x89, 0xe5, 0x15, 0x39, 0x3e, 0x0e, - 0xa8, 0x15, 0xeb, 0x2f, 0xff, 0xd8, 0x2b, 0x51, 0x32, 0xce, 0x8b, 0x6a, - 0x14, 0x38, 0xbb, 0x4b, 0x97, 0x51, 0xc9, 0x17, 0x04, 0x11, 0x51, 0x1f, - 0x32, 0x0e, 0x13, 0x5c, 0xc6, 0x2d, 0xc5, 0x06, 0xed, 0x3d, 0xe3, 0xfb, - 0x06, 0xca, 0x83, 0xf2, 0x7c, 0xad, 0xb1, 0xf2, 0xda, 0x54, 0x4a, 0x9c, - 0xc9, 0xed, 0x27, 0xa0, 0xfd, 0xc1, 0xf2, 0x56, 0xe7, 0x7a, 0x27, 0xf6, - 0xc7, 0x52, 0x7d, 0x8d, 0x38, 0x89, 0x4d, 0xe8, 0x0c, 0xaa, 0x2c, 0xca, - 0x29, 0xee, 0xaf, 0xff, 0x03, 0xc9, 0x8e, 0xc6, 0x4c, 0xad, 0x7b, 0x82, - 0xb4, 0x7a, 0xed, 0x64, 0x37, 0x5a, 0x80, 0xd8, 0xd5, 0xd0, 0x51, 0xaa, - 0xfd, 0x8a, 0x58, 0x70, 0xfb, 0xa6, 0xd2, 0x5d, 0x19, 0xeb, 0x8b, 0x89, - 0x37, 0x1c, 0x6a, 0x5c, 0xa9, 0x31, 0x91, 0x81, 0x1b, 0x33, 0xd9, 0xf2, - 0xf4, 0xa6, 0x26, 0x75, 0x62, 0xcf, 0xd2, 0x86, 0xff, 0x8f, 0x42, 0xc6, - 0x8c, 0xaf, 0xe1, 0xe0, 0xf3, 0xff, 0x31, 0xbf, 0x21, 0xd8, 0x7b, 0x26, - 0xef, 0x1d, 0xd4, 0x02, 0x54, 0x92, 0x97, 0xc8, 0x39, 0xb9, 0x95, 0x9f, - 0x03, 0xca, 0xa1, 0x0b, 0xe0, 0xbf, 0xb1, 0x42, 0x1a, 0xd6, 0x63, 0xb1, - 0xbc, 0x35, 0xea, 0xe8, 0xe0, 0x9d, 0xc3, 0xc8, 0xf9, 0x05, 0x8a, 0x7f, - 0x05, 0xd2, 0x09, 0x95, 0x8a, 0x43, 0x2c, 0xad, 0x81, 0x03, 0xe8, 0xfd, - 0x9e, 0xa6, 0x12, 0x47, 0x08, 0xf6, 0x37, 0xf5, 0xed, 0xff, 0x93, 0x14, - 0x8a, 0xa0, 0x92, 0xa7, 0x37, 0xbf, 0x27, 0x21, 0xd1, 0x47, 0x29, 0x0c, - 0xc2, 0xad, 0x42, 0x58, 0xe5, 0xe0, 0x64, 0xb9, 0x10, 0x02, 0x12, 0x96, - 0xb5, 0x1b, 0x8e, 0x03, 0x21, 0x08, 0x11, 0xcc, 0xc6, 0x37, 0x78, 0x44, - 0x22, 0x35, 0x00, 0x12, 0x98, 0x8e, 0x74, 0x1b, 0xd1, 0xa8, 0x35, 0x0c, - 0x1f, 0x66, 0x20, 0x56, 0x39, 0x2a, 0x09, 0x29, 0xd1, 0x2b, 0xea, 0x22, - 0x3f, 0x3f, 0x5a, 0x41, 0x72, 0x15, 0xd5, 0xf0, 0xef, 0x58, 0xaf, 0xbe, - 0xa3, 0xf7, 0x70, 0x0f, 0xba, 0xf1, 0x1c, 0x5b, 0x00, 0xe9, 0xd1, 0x76, - 0x8c, 0x3c, 0x02, 0xff, 0x6d, 0x30, 0x91, 0x81, 0x9d, 0x8b, 0xa2, 0x03, - 0xb3, 0xa0, 0x5d, 0x28, 0x58, 0x94, 0x05, 0x33, 0x5b, 0x2f, 0x65, 0xb2, - 0x62, 0x4f, 0x3c, 0xa5, 0x7e, 0xbe, 0xe2, 0x4d, 0x10, 0x42, 0x0e, 0x27, - 0x56, 0x84, 0xd2, 0x11, 0x4b, 0xcb, 0x63, 0xf2, 0xb2, 0x1a, 0x6c, 0xd5, - 0x84, 0x37, 0xfc, 0xcf, 0x52, 0x22, 0x9b, 0xb7, 0xf1, 0x04, 0xba, 0xb0, - 0x13, 0x90, 0x13, 0xd4, 0x00, 0x18, 0xc0, 0x95, 0xc4, 0xd2, 0x4e, 0xe2, - 0x5d, 0x8c, 0x6d, 0xca, 0x9d, 0xd3, 0x26, 0xba, 0x45, 0x29, 0xeb, 0xdd, - 0x1c, 0x61, 0x65, 0x08, 0xb0, 0x3a, 0xcd, 0x3c, 0xaa, 0x26, 0x14, 0x6a, - 0x0d, 0x1c, 0x33, 0x64, 0x66, 0x61, 0x78, 0x60, 0x13, 0x4a, 0xc1, 0x60, - 0xfa, 0x2f, 0x5c, 0xfc, 0xe8, 0x49, 0x7f, 0x23, 0x89, 0x53, 0xdb, 0x8e, - 0x65, 0xaf, 0x8e, 0xda, 0xde, 0x42, 0x92, 0xd7, 0x52, 0x15, 0xec, 0x61, - 0x43, 0xba, 0x5e, 0xd0, 0x1a, 0xf1, 0xdb, 0x60, 0xd1, 0xb5, 0x55, 0x6b, - 0xb2, 0x8b, 0x8e, 0xea, 0xa0, 0xd2, 0xe4, 0xa9, 0xb5, 0x67, 0x91, 0xcb, - 0x21, 0x6b, 0x1b, 0x09, 0x3f, 0x03, 0x21, 0xc4, 0x01, 0x64, 0x79, 0xcf, - 0x6c, 0x82, 0x5f, 0xa0, 0x44, 0x57, 0x2c, 0x4e, 0xf7, 0xd7, 0x9c, 0xd6, - 0xc8, 0xa3, 0xd9, 0xf3, 0x84, 0xcc, 0x82, 0x4c, 0xd3, 0x4d, 0x25, 0x14, - 0xb8, 0xe4, 0x6b, 0xd6, 0xe8, 0xa5, 0xa5, 0x3b, 0x07, 0xf5, 0xd3, 0xac, - 0x89, 0x31, 0xa4, 0x24, 0x8a, 0xa8, 0x62, 0x57, 0xe2, 0x7c, 0x6d, 0x2a, - 0x24, 0x07, 0xba, 0x20, 0x52, 0xf6, 0x9a, 0x8f, 0x9e, 0x49, 0xc5, 0x80, - 0xdd, 0x91, 0x20, 0x73, 0x7d, 0xbf, 0xa0, 0x83, 0x18, 0x6c, 0xed, 0x7c, - 0x2f, 0xf3, 0xfc, 0xaf, 0x50, 0x8f, 0x51, 0xb2, 0x33, 0xdb, 0x38, 0xf5, - 0x74, 0x1f, 0xbf, 0xb5, 0x4f, 0xe0, 0x8c, 0xef, 0x16, 0xe2, 0xe5, 0x33, - 0x64, 0xa2, 0xc0, 0x13, 0x83, 0xe1, 0x6d, 0x6f, 0xbd, 0x09, 0x5d, 0xd7, - 0xa5, 0xa6, 0x5e, 0xe4, 0x03, 0x9b, 0x28, 0x75, 0x3a, 0xde, 0x95, 0x61, - 0x80, 0x94, 0x66, 0x1d, 0x19, 0x09, 0x14, 0x1e, 0x10, 0x71, 0x3b, 0xec, - 0x16, 0x78, 0x82, 0xf9, 0xb0, 0xaf, 0x79, 0x4c, 0x38, 0x2d, 0xfc, 0x64, - 0x67, 0x04, 0x36, 0x00, 0x4f, 0x63, 0x52, 0x2e, 0xd2, 0xdb, 0x58, 0xc1, - 0x1a, 0x57, 0xe0, 0x9d, 0x04, 0x49, 0x5a, 0x2f, 0x4d, 0x35, 0x20, 0x34, - 0xf5, 0x80, 0x20, 0x7e, 0x94, 0xf9, 0xbf, 0x33, 0x16, 0xc2, 0x35, 0xd9, - 0x34, 0x27, 0xeb, 0xf7, 0x36, 0xdf, 0x3e, 0xb1, 0xd8, 0x26, 0xa0, 0xf0, - 0xf9, 0xb5, 0xbf, 0x20, 0x9a, 0xcc, 0x6b, 0x6e, 0x95, 0xbe, 0xf2, 0xd1, - 0xbd, 0x2b, 0xd5, 0x61, 0x4e, 0x27, 0x85, 0x6c, 0xcf, 0xb1, 0xdc, 0x11, - 0x96, 0x66, 0xe8, 0x4e, 0x59, 0xca, 0xa9, 0x3c, 0xa7, 0x4c, 0xe5, 0x00, - 0xab, 0xb0, 0x9f, 0x51, 0xdf, 0x98, 0xce, 0x73, 0xa8, 0xf3, 0xb5, 0x7a, - 0x32, 0x4d, 0xf8, 0x3d, 0xb0, 0xa4, 0x3a, 0xee, 0xff, 0xda, 0x50, 0x01, - 0x8c, 0x6c, 0x62, 0x28, 0x36, 0xca, 0xeb, 0xea, 0xd6, 0x40, 0x0e, 0xcd, - 0x11, 0x7e, 0x32, 0xd6, 0x96, 0x76, 0x10, 0x54, 0x26, 0x6c, 0x7a, 0x41, - 0x54, 0x45, 0x77, 0xe1, 0x3d, 0x5e, 0x05, 0x1c, 0x02, 0x8d, 0xbf, 0x87, - 0xc6, 0x10, 0x04, 0xff, 0x5f, 0x31, 0xab, 0x62, 0x1b, 0x54, 0xab, 0xab, - 0xbe, 0x12, 0x58, 0xc7, 0x7b, 0x4f, 0xef, 0x9a, 0x40, 0xba, 0x73, 0x65, - 0xe8, 0xdf, 0x73, 0xa4, 0x14, 0x3a, 0x93, 0xbe, 0x08, 0xfd, 0xd3, 0x21, - 0xcb, 0x8d, 0x9e, 0x6e, 0x21, 0x0d, 0x9e, 0xc4, 0x37, 0x77, 0x84, 0xf0, - 0x57, 0xc3, 0x28, 0x40, 0x35, 0x6d, 0xe5, 0x0c, 0xf3, 0x11, 0x61, 0xbb, - 0xd0, 0x62, 0xfd, 0x1e, 0xb9, 0xae, 0xf0, 0x89, 0xdc, 0x74, 0x27, 0x40, - 0x90, 0x9c, 0xeb, 0x13, 0x86, 0x65, 0x1e, 0x1f, 0x09, 0x94, 0xbd, 0x33, - 0xd5, 0x15, 0xaf, 0xa7, 0xce, 0x66, 0xa7, 0x68, 0x89, 0x5f, 0xbc, 0x2c, - 0x41, 0x8d, 0x2e, 0xc4, 0xce, 0xb1, 0x94, 0xcf, 0xeb, 0xd5, 0x9a, 0xe7, - 0x9a, 0x1d, 0xd7, 0x00, 0x58, 0x8e, 0x9a, 0x01, 0xf5, 0xc7, 0xd9, 0x57, - 0xd5, 0x7b, 0x94, 0x5b, 0x72, 0x82, 0xeb, 0xca, 0xd7, 0xff, 0x01, 0x37, - 0xaf, 0x5e, 0x5b, 0xd6, 0x33, 0xce, 0x9f, 0x34, 0xbc, 0x24, 0x4e, 0xf7, - 0xbd, 0x61, 0x47, 0xf1, 0x60, 0xd5, 0xfe, 0xe8, 0x14, 0x04, 0x46, 0x85, - 0x27, 0x71, 0xd1, 0x1d, 0x36, 0xfb, 0xf4, 0x7b, 0xaa, 0xeb, 0x18, 0xf2, - 0x65, 0x6b, 0x7f, 0x96, 0x43, 0x3f, 0x4f, 0xdd, 0x76, 0xaf, 0x1c, 0xb6, - 0x02, 0xc8, 0x56, 0x69, 0x73, 0xfc, 0x15, 0x26, 0x8d, 0x73, 0xdd, 0xc7, - 0x40, 0x5f, 0xf5, 0x68, 0xa7, 0x0a, 0x78, 0xdb, 0xa9, 0xfc, 0x5f, 0x16, - 0xab, 0x31, 0x0a, 0xb9, 0x5c, 0xf1, 0xf3, 0x74, 0x6c, 0x5c, 0x95, 0xe3, - 0x93, 0x02, 0x14, 0xf2, 0x07, 0xd5, 0xc4, 0x87, 0x29, 0xe6, 0x5e, 0x75, - 0x9a, 0x69, 0x61, 0xc1, 0x23, 0x77, 0x3b, 0x96, 0x9c, 0x38, 0xe7, 0xfa, - 0x8f, 0x14, 0x64, 0x40, 0xa4, 0x40, 0x7a, 0xf2, 0x76, 0xff, 0x94, 0xd2, - 0x6d, 0x42, 0x48, 0xf2, 0x95, 0x1e, 0xf8, 0x2d, 0xa6, 0xe7, 0x33, 0x07, - 0x20, 0x9e, 0xfe, 0x0e, 0xf6, 0xa7, 0xb4, 0x48, 0xa5, 0x14, 0xc3, 0x9a, - 0xad, 0xbd, 0xc6, 0x41, 0x4f, 0xea, 0xc5, 0x6e, 0xed, 0xee, 0x33, 0x47, - 0x13, 0x2e, 0xee, 0x61, 0xf2, 0x05, 0xf2, 0x5e, 0xde, 0x9b, 0xfd, 0xbc, - 0xd6, 0xb5, 0xe5, 0x7a, 0x0d, 0x0f, 0x13, 0xbb, 0x53, 0x91, 0x60, 0x01, - 0xfe, 0xa4, 0xe7, 0xed, 0xe1, 0x78, 0xe2, 0x4f, 0x91, 0x86, 0x06, 0xc9, - 0xa6, 0x30, 0x85, 0xda, 0xb6, 0x06, 0x5d, 0x9f, 0xc9, 0xa5, 0x29, 0x86, - 0x2a, 0x3a, 0x7f, 0x84, 0x7a, 0xe5, 0x17, 0x1c, 0x57, 0xe8, 0xc6, 0x3b, - 0x99, 0x0c, 0xf2, 0x8b, 0x6c, 0x8e, 0x29, 0xe5, 0xfa, 0x1a, 0xa5, 0xf2, - 0xb4, 0x8d, 0xe7, 0x96, 0xd6, 0x72, 0x08, 0xdf, 0x99, 0x16, 0x3e, 0xd5, - 0xde, 0x8d, 0xff, 0x8d, 0x6a, 0x91, 0x7d, 0x29, 0x54, 0x5e, 0x44, 0x90, - 0xe7, 0x01, 0x18, 0x3a, 0x6f, 0xff, 0xeb, 0xaa, 0x80, 0x13, 0xd6, 0x1a, - 0x4b, 0xd0, 0x5e, 0x5d, 0x42, 0x65, 0xc9, 0x43, 0x3f, 0x08, 0x29, 0xbd, - 0x31, 0x2e, 0x02, 0x3e, 0x0c, 0xc2, 0x76, 0xf1, 0x40, 0xd9, 0xb3, 0x24, - 0xf9, 0x6f, 0x5d, 0xea, 0xfb, 0x53, 0x4b, 0x7b, 0x20, 0x1d, 0x75, 0x67, - 0x7a, 0x47, 0xe5, 0x01, 0x6f, 0x7c, 0x80, 0x2f, 0x15, 0x76, 0x31, 0xc2, - 0xe2, 0x89, 0xb9, 0x73, 0x57, 0x50, 0x57, 0x28, 0x76, 0x64, 0x0c, 0x31, - 0x2c, 0xbd, 0x0a, 0x14, 0x91, 0x21, 0xf2, 0x8a, 0xec, 0x68, 0x38, 0x09, - 0x9e, 0x1d, 0xbe, 0x13, 0x4e, 0x52, 0xc9, 0x5e, 0x03, 0x60, 0x25, 0xe2, - 0xd3, 0xfc, 0x98, 0x0e, 0xe0, 0xb2, 0x17, 0x37, 0x71, 0x45, 0x77, 0xa5, - 0x60, 0x6c, 0x50, 0x8b, 0x03, 0x84, 0x90, 0x17, 0x33, 0x04, 0x4e, 0x29, - 0x34, 0x2e, 0x21, 0x13, 0x12, 0xe0, 0x7d, 0xf2, 0x41, 0x0e, 0xe5, 0x56, - 0x89, 0x2a, 0x9d, 0x1f, 0xe7, 0x81, 0x3f, 0x40, 0x54, 0x9b, 0x03, 0xf5, - 0xc6, 0xfc, 0x8d, 0x0c, 0x05, 0x7a, 0xea, 0xec, 0x4c, 0x65, 0x35, 0xf0, - 0x9d, 0xe2, 0x0d, 0x0c, 0x12, 0x0c, 0xc7, 0x53, 0x0d, 0x40, 0x01, 0x35, - 0x7b, 0xdb, 0x74, 0xe0, 0x8c, 0x4f, 0x8d, 0xff, 0x23, 0x06, 0xef, 0xf0, - 0xd6, 0x4e, 0x52, 0x75, 0x6e, 0x5d, 0x7f, 0xc4, 0x9a, 0xaa, 0x2c, 0xb5, - 0x89, 0x08, 0x6c, 0x5f, 0xcb, 0x89, 0xb1, 0xee, 0x9a, 0xf8, 0xc8, 0x5b, - 0x9f, 0xc4, 0x00, 0xa0, 0x10, 0xb3, 0x19, 0x12, 0x27, 0x7a, 0x3d, 0x82, - 0x00, 0xb7, 0x80, 0x26, 0x75, 0x41, 0xda, 0x67, 0xd9, 0x83, 0xfa, 0xcb, - 0xed, 0x98, 0x97, 0xb7, 0x72, 0xb1, 0x1a, 0x8d, 0x9d, 0x1a, 0x71, 0x9e, - 0xae, 0x62, 0xe6, 0xa7, 0xda, 0xd7, 0x62, 0xb8, 0xf9, 0x18, 0x0d, 0x04, - 0x9c, 0xc3, 0xa8, 0xd2, 0x15, 0xb7, 0xc9, 0x8e, 0xa5, 0x6e, 0xd4, 0xd9, - 0x09, 0xd2, 0xfc, 0xfb, 0xae, 0x5c, 0xf7, 0x10, 0x00, 0x88, 0x57, 0x61, - 0x15, 0xf3, 0x7b, 0x8b, 0x2c, 0xdd, 0x9b, 0xaa, 0x5b, 0x29, 0xdc, 0xbc, - 0xb4, 0x00, 0xd4, 0x16, 0x83, 0xf5, 0x35, 0xf7, 0x23, 0x4a, 0x25, 0xdb, - 0x8d, 0xde, 0xdb, 0xae, 0xad, 0x0a, 0x7f, 0xa9, 0xfd, 0x23, 0xd4, 0xb5, - 0xe8, 0x6a, 0x18, 0x17, 0x36, 0xa3, 0x48, 0x2c, 0x69, 0xe4, 0x6b, 0x8e, - 0x4c, 0xbe, 0x08, 0x75, 0x80, 0xde, 0x6f, 0x1b, 0x4d, 0xb5, 0x3f, 0xf7, - 0x45, 0xdf, 0x41, 0xd7, 0x9b, 0xdc, 0x9e, 0x53, 0xc6, 0xe6, 0xab, 0x9d, - 0x3a, 0xb4, 0x2d, 0x51, 0xc5, 0x9c, 0x9a, 0xa9, 0x1d, 0x33, 0x64, 0x09, - 0x0d, 0xcb, 0x07, 0xe6, 0x37, 0xbc, 0xb7, 0x3b, 0xe1, 0xa9, 0x78, 0x4c, - 0xee, 0xb2, 0xa4, 0xc9, 0x9b, 0xc5, 0xde, 0xe0, 0x7d, 0xf2, 0x4e, 0xcc, - 0x2c, 0xf3, 0xce, 0x11, 0x0f, 0xe7, 0xc5, 0xe4, 0x9c, 0x6c, 0xe5, 0xc2, - 0xfc, 0x32, 0x47, 0x42, 0x54, 0xf1, 0x8b, 0xff, 0x4f, 0xcb, 0x4a, 0x95, - 0xd8, 0x7c, 0xe7, 0x72, 0xe1, 0xa8, 0x03, 0x06, 0xd8, 0xbe, 0x78, 0x42, - 0x8a, 0x6e, 0xfb, 0xde, 0x7e, 0x94, 0xc5, 0x6d, 0x7a, 0x56, 0x15, 0x0c, - 0xac, 0x6c, 0x62, 0x08, 0x9d, 0xcb, 0xc6, 0x76, 0xc3, 0x5d, 0x41, 0xca, - 0x03, 0xd5, 0xb5, 0x10, 0x28, 0x95, 0x8f, 0x65, 0x73, 0x64, 0xc3, 0x9f, - 0xc8, 0xf5, 0xe2, 0x3b, 0xc1, 0x3b, 0x45, 0x1c, 0x71, 0x7f, 0xfa, 0x7c, - 0x9a, 0x13, 0x08, 0xa9, 0xbe, 0x70, 0xfc, 0xc1, 0x18, 0x68, 0x3a, 0x86, - 0x15, 0x3a, 0x8c, 0xdc, 0xeb, 0x00, 0x7e, 0xa8, 0x25, 0x0e, 0xb2, 0x50, - 0x9e, 0x82, 0xa5, 0xfb, 0x89, 0x72, 0x3d, 0x68, 0x01, 0xcc, 0xc5, 0xe9, - 0x7e, 0x94, 0xc5, 0x6d, 0x7a, 0x56, 0x15, 0x0c, 0xb9, 0x60, 0x7e, 0x09, - 0x9a, 0xc1, 0xc6, 0x76, 0x53, 0x5b, 0x05, 0x35, 0xe4, 0x92, 0x87, 0x71, - 0x20, 0x50, 0x22, 0x15, 0xe0, 0xe5, 0x1e, 0x77, 0xaf, 0x62, 0xad, 0xfb, - 0x62, 0xdc, 0x22, 0x41, 0x86, 0xa3, 0x0f, 0xac, 0x36, 0x94, 0xc1, 0x36, - 0x3c, 0xd3, 0xd2, 0x36, 0x57, 0x10, 0xc8, 0x19, 0x74, 0xab, 0x57, 0x5d, - 0xad, 0xf2, 0x59, 0x5c, 0x49, 0xb6, 0x02, 0x05, 0xe9, 0xcf, 0xb3, 0x46, - 0x46, 0x84, 0x05, 0x01, 0x26, 0x8e, 0xdf, 0x91, 0xb1, 0xd4, 0xf6, 0x5a, - 0x73, 0x50, 0x1c, 0x85, 0xc3, 0xe9, 0x40, 0x67, 0x8e, 0x18, 0x6e, 0xb6, - 0xee, 0x6d, 0x46, 0x55, 0xdd, 0xb8, 0x43, 0x0e, 0x84, 0x98, 0x0b, 0x3e, - 0x4f, 0x23, 0x6a, 0xbc, 0x8e, 0xa1, 0xa2, 0x8b, 0xb3, 0x83, 0x45, 0x72, - 0x16, 0x67, 0x74, 0x70, 0x1d, 0xc8, 0xff, 0xe4, 0xd6, 0xb5, 0x2f, 0xc8, - 0x3b, 0x7c, 0x51, 0xb4, 0xff, 0xa7, 0x91, 0x23, 0x14, 0x42, 0x38, 0x3b, - 0x90, 0x5e, 0x0d, 0x76, 0x38, 0xf4, 0x6b, 0x1b, 0x3c, 0x35, 0xca, 0x3c, - 0xb8, 0x9c, 0x0d, 0x4a, 0x9f, 0xe2, 0x3e, 0x51, 0x88, 0xc2, 0x02, 0x66, - 0xbb, 0x05, 0xc7, 0x19, 0xd3, 0x86, 0xa3, 0x3d, 0xaa, 0x7b, 0x72, 0xb5, - 0x9d, 0x03, 0x0e, 0x20, 0x7c, 0x3e, 0xa0, 0x60, 0xa4, 0x20, 0xbc, 0x24, - 0x1d, 0x1e, 0x46, 0x5a, 0x08, 0x73, 0x92, 0xca, 0xf5, 0xb6, 0xc6, 0x9a, - 0xa0, 0x3f, 0x71, 0x23, 0xac, 0x4f, 0x48, 0x7b, 0x25, 0x8f, 0x50, 0xdd, - 0xef, 0xca, 0xeb, 0x2f, 0xaf, 0x26, 0xf7, 0x15, 0x81, 0x25, 0x58, 0x33, - 0x27, 0x65, 0xbd, 0x73, 0xc3, 0xa8, 0x46, 0x2e, 0x68, 0x93, 0xfd, 0x83, - 0xd1, 0xfe, 0xbb, 0x1c, 0xc2, 0xb9, 0x26, 0xbd, 0x4b, 0x52, 0xbd, 0xe2, - 0x60, 0x9d, 0xe5, 0x4d, 0xeb, 0xde, 0x96, 0xea, 0xd1, 0x29, 0xff, 0xef, - 0x19, 0xa0, 0xa2, 0xa6, 0x76, 0xfc, 0x38, 0xd5, 0x02, 0x81, 0xab, 0x14, - 0xfc, 0x84, 0x83, 0xcc, 0x04, 0xfd, 0x5c, 0x33, 0x9a, 0x69, 0xad, 0xd7, - 0x1e, 0xba, 0x98, 0x50, 0xda, 0x99, 0x4e, 0xd6, 0x9b, 0xd4, 0x2e, 0xc7, - 0x2d, 0x0a, 0xbf, 0xa9, 0x85, 0x46, 0xe9, 0x28, 0x34, 0x1d, 0x36, 0x0b, - 0x69, 0x25, 0x63, 0xdf, 0xaa, 0x74, 0xfd, 0x81, 0x39, 0xb6, 0xc6, 0x6f, - 0xf3, 0xcc, 0x0a, 0x77, 0xa4, 0x49, 0xdb, 0xac, 0x1c, 0xb1, 0xeb, 0x99, - 0xb2, 0x21, 0x26, 0x7a, 0x0e, 0x44, 0x3e, 0xf1, 0x15, 0x28, 0x23, 0x6e, - 0x76, 0x83, 0xb0, 0x73, 0x5a, 0xc8, 0x6f, 0x0e, 0x3f, 0x0a, 0x71, 0x22, - 0xbe, 0x2e, 0x0f, 0xef, 0x24, 0x5d, 0x43, 0x85, 0x55, 0xf5, 0x81, 0x4e, - 0x37, 0x9f, 0xba, 0xd2, 0x6b, 0x07, 0xad, 0x11, 0xb2, 0xf0, 0xd7, 0x96, - 0x4f, 0x3b, 0x1c, 0x46, 0x43, 0x87, 0x64, 0x12, 0x9e, 0x25, 0x67, 0xa9, - 0xbc, 0x0d, 0xd6, 0x27, 0xb4, 0xa3, 0x35, 0xa8, 0x2e, 0x81, 0x76, 0xb8, - 0x42, 0x79, 0x35, 0x40, 0xad, 0xe7, 0xa4, 0xec, 0x3e, 0x28, 0x03, 0x1e, - 0x9d, 0x95, 0xc5, 0xd7, 0xc0, 0x79, 0xcc, 0xcd, 0x07, 0xb5, 0x59, 0x41, - 0x32, 0x88, 0x96, 0x1f, 0x77, 0xba, 0x92, 0x2a, 0xd4, 0xd9, 0xe3, 0x39, - 0x0d, 0x75, 0xa3, 0x46, 0x41, 0x17, 0x64, 0x9c, 0xb6, 0x93, 0x9f, 0xa6, - 0x9b, 0xab, 0xfd, 0x9f, 0xb2, 0xce, 0xd6, 0xa1, 0xdd, 0x4b, 0xa2, 0xa4, - 0x9a, 0x6b, 0x79, 0x1e, 0x46, 0x21, 0x68, 0x3d, 0x54, 0x57, 0xea, 0xb6, - 0xb9, 0xa0, 0x10, 0x7a, 0x28, 0xd7, 0x1f, 0xce, 0xb0, 0x42, 0xe8, 0xde, - 0x57, 0x65, 0x2a, 0x62, 0xab, 0xed, 0x51, 0xe7, 0xac, 0x05, 0x19, 0xf6, - 0xc8, 0x20, 0x15, 0x34, 0x86, 0x82, 0x0b, 0x22, 0xe2, 0xae, 0xf4, 0x4e, - 0xb4, 0xe2, 0xfd, 0x15, 0x57, 0xd0, 0x68, 0x2e, 0x2a, 0x42, 0xc4, 0x56, - 0xdd, 0x87, 0x3f, 0x68, 0xdd, 0x6b, 0x3e, 0x1e, 0xc9, 0xf6, 0x6b, 0x8e, - 0xb7, 0x23, 0x33, 0x59, 0xeb, 0xc3, 0x74, 0x4e, 0x7b, 0xe9, 0xaa, 0xeb, - 0x4f, 0x58, 0x3c, 0xc1, 0x8c, 0x65, 0x57, 0x16, 0xa3, 0x20, 0x75, 0xfd, - 0x32, 0x0d, 0x21, 0x9c, 0x6a, 0xd2, 0xb8, 0x2d, 0x8e, 0x0e, 0x0a, 0x02, - 0x31, 0xc2, 0x5e, 0xee, 0x90, 0x86, 0x9a, 0xd1, 0xd1, 0x4d, 0x06, 0x21, - 0x3e, 0x94, 0xb1, 0x1c, 0xfd, 0xff, 0xa5, 0xed, 0x41, 0x68, 0x0c, 0xb8, - 0xf7, 0x3c, 0x00, 0x02, 0xce, 0x02, 0xc6, 0x82, 0xc6, 0x78, 0x6e, 0x99, - 0x2d, 0x22, 0x15, 0x48, 0xbe, 0xc9, 0x08, 0x6a, 0xec, 0xdc, 0xd1, 0x34, - 0x0d, 0x17, 0xa6, 0x98, 0xa9, 0xd5, 0xa7, 0x9c, 0xd6, 0xa5, 0xb2, 0xdb, - 0xc3, 0x04, 0xe4, 0x61, 0x4e, 0x79, 0xb0, 0x40, 0xb0, 0x0c, 0x46, 0xc8, - 0xf3, 0x5c, 0xd1, 0x30, 0x53, 0x3d, 0xd0, 0xe0, 0x63, 0x32, 0xbb, 0x9f, - 0x79, 0x8c, 0x65, 0x43, 0x95, 0xe5, 0x26, 0x8e, 0x90, 0xe6, 0xcc, 0x0f, - 0xca, 0x34, 0x0c, 0x6c, 0xba, 0xef, 0x2c, 0xa7, 0x89, 0x2f, 0xbe, 0xce, - 0x46, 0x40, 0x2a, 0x33, 0x59, 0xf8, 0x99, 0xfd, 0x74, 0x2c, 0x61, 0x2a, - 0x0a, 0x58, 0xf1, 0x2b, 0x31, 0x5d, 0xcd, 0x82, 0xab, 0x09, 0x9a, 0xed, - 0xb7, 0x73, 0x81, 0x25, 0xae, 0x84, 0xc9, 0x7f, 0x38, 0x1d, 0x51, 0x1f, - 0x6e, 0x9e, 0x0b, 0x30, 0x29, 0x73, 0xcb, 0x8a, 0xec, 0x7b, 0x21, 0x46, - 0x80, 0xd5, 0xfa, 0x94, 0xe1, 0x25, 0x1f, 0x02, 0x2b, 0x9f, 0xb5, 0x9b, - 0xce, 0x05, 0x57, 0xe5, 0xc2, 0x74, 0xeb, 0xab, 0xc2, 0x31, 0xc9, 0xa4, - 0x31, 0x81, 0x6c, 0xfd, 0x55, 0x77, 0xb2, 0xaa, 0x88, 0x6b, 0x1f, 0xec, - 0xbb, 0x1a, 0x4c, 0x75, 0x4f, 0x99, 0xbc, 0x23, 0xbb, 0x01, 0x3b, 0xa3, - 0xeb, 0x4b, 0x74, 0x6c, 0x06, 0xf2, 0x31, 0x76, 0x6f, 0x68, 0x5f, 0xa1, - 0xdc, 0x34, 0x58, 0x73, 0xb6, 0x87, 0x05, 0x24, 0x21, 0x6e, 0x5d, 0x57, - 0x0e, 0xdd, 0x29, 0x5c, 0x3d, 0x19, 0x97, 0xed, 0xbc, 0x88, 0x79, 0x96, - 0xfd, 0xf5, 0xc9, 0x1b, 0xad, 0x24, 0x41, 0xc3, 0xa8, 0x9e, 0x25, 0xaf, - 0x3e, 0x63, 0x49, 0x2f, 0x62, 0x09, 0x32, 0xbf, 0xc2, 0x27, 0xd9, 0x2d, - 0x4e, 0xdf, 0x7b, 0x2a, 0x20, 0xd5, 0x5d, 0xc3, 0xfe, 0x4d, 0xcd, 0xa4, - 0xcb, 0x6c, 0xfd, 0xe4, 0xb6, 0x5b, 0xcc, 0x2f, 0xef, 0x83, 0x38, 0xd1, - 0x8c, 0x5a, 0x82, 0x0b, 0x19, 0xe0, 0x76, 0x5a, 0x00, 0x48, 0x7c, 0xf3, - 0x72, 0x15, 0xdb, 0x07, 0x28, 0xe1, 0x12, 0xf1, 0x92, 0x1c, 0x61, 0x99, - 0x90, 0xa0, 0x62, 0xea, 0xc0, 0x58, 0x27, 0x16, 0x31, 0x0e, 0xbc, 0x72, - 0x41, 0x2b, 0x3a, 0xad, 0x0f, 0xb0, 0xad, 0xd5, 0xd5, 0xfa, 0xc1, 0x6f, - 0x48, 0xf4, 0x0a, 0xca, 0x76, 0xfa, 0x83, 0xa9, 0xcb, 0xf1, 0xaa, 0xdf, - 0x1b, 0x7b, 0x90, 0x13, 0x24, 0x98, 0x3e, 0xfd, 0x3e, 0xb3, 0xf9, 0x60, - 0x94, 0xee, 0x70, 0x9b, 0x68, 0x20, 0xf3, 0x48, 0x74, 0x58, 0x61, 0x05, - 0x10, 0xb6, 0xfa, 0xd2, 0x44, 0x95, 0x88, 0x95, 0x49, 0x39, 0x0a, 0xfe, - 0xdd, 0x82, 0x0d, 0xec, 0xb2, 0x45, 0xd5, 0xdc, 0x7e, 0x80, 0xa7, 0x83, - 0x21, 0xee, 0xba, 0x97, 0x55, 0x06, 0xa2, 0xda, 0x5a, 0x4e, 0x78, 0x1d, - 0xe6, 0x34, 0xd7, 0xe2, 0x26, 0x94, 0x51, 0x1b, 0x11, 0xb5, 0x19, 0x9e, - 0x1c, 0x9c, 0x2e, 0xe6, 0xa2, 0xb5, 0x2c, 0x39, 0xdd, 0xb9, 0x7c, 0x98, - 0x5a, 0x1a, 0xc1, 0x79, 0x47, 0x4c, 0x21, 0x1d, 0xc5, 0x71, 0xa2, 0x99, - 0x86, 0x8f, 0xba, 0x1e, 0xe4, 0xd7, 0x68, 0x1c, 0x95, 0xa1, 0xdf, 0x09, - 0x1b, 0x1f, 0x28, 0x5f, 0x2c, 0x78, 0x43, 0xa7, 0x97, 0x2a, 0x87, 0xce, - 0xd6, 0x1e, 0x20, 0xf1, 0x04, 0x43, 0x96, 0x75, 0xb8, 0x66, 0x31, 0xe3, - 0xfc, 0x82, 0x9b, 0xf7, 0x09, 0xe5, 0x96, 0x4a, 0x9f, 0x76, 0x6f, 0xc5, - 0x02, 0x6f, 0xd8, 0x3c, 0x66, 0x61, 0x9b, 0x0e, 0xd4, 0x4f, 0xc4, 0x52, - 0x52, 0x81, 0xda, 0x6a, 0xca, 0xea, 0x26, 0x6a, 0xce, 0x8c, 0x3c, 0x42, - 0xd6, 0x4a, 0x13, 0x6d, 0x38, 0x36, 0x4b, 0xa8, 0xa2, 0x47, 0x81, 0x2c, - 0x6b, 0xe7, 0x7f, 0xfb, 0xaf, 0xd6, 0x0c, 0xb0, 0xc7, 0x1c, 0x0d, 0x13, - 0xce, 0x43, 0x27, 0x9c, 0x6b, 0x6f, 0xd5, 0x94, 0xfb, 0xf6, 0x10, 0x8d, - 0x9b, 0x2d, 0xac, 0x65, 0xb6, 0xdc, 0xc7, 0xba, 0x1b, 0xa9, 0x8d, 0xd7, - 0xb6, 0xff, 0xfd, 0x9e, 0x85, 0x40, 0x30, 0x2c, 0xce, 0x58, 0x3a, 0xe4, - 0xaa, 0xd6, 0x5e, 0x23, 0xa1, 0xd5, 0xbb, 0xf9, 0xaf, 0x00, 0x37, 0x30, - 0x04, 0x52, 0xb8, 0xaf, 0xae, 0xda, 0x4a, 0x50, 0x06, 0xb4, 0x1f, 0xad, - 0x91, 0xf2, 0xaa, 0xfe, 0xe7, 0xbc, 0xbd, 0x19, 0x5d, 0x8e, 0xd9, 0xd1, - 0x27, 0x32, 0xd6, 0x1d, 0xc6, 0x97, 0xfb, 0x72, 0x7d, 0x25, 0x01, 0x88, - 0xbe, 0xce, 0x71, 0xb0, 0xcd, 0xe0, 0xa1, 0x30, 0x42, 0x9a, 0xf6, 0xed, - 0xce, 0x2c, 0xf1, 0xcd, 0x2f, 0xeb, 0x1a, 0xf0, 0x5a, 0x4c, 0x18, 0x5a, - 0x84, 0x0a, 0x27, 0x09, 0x68, 0x12, 0xac, 0x54, 0x3e, 0xc2, 0xd4, 0x89, - 0x14, 0xa3, 0x4d, 0xb0, 0x67, 0x61, 0xb2, 0x59, 0x93, 0x72, 0x23, 0x1c, - 0x05, 0xdd, 0xf9, 0xc5, 0xf4, 0x8e, 0xc6, 0xb8, 0x4b, 0x73, 0x5f, 0xd5, - 0x7a, 0x33, 0x63, 0x68, 0x68, 0xd4, 0xf8, 0x4e, 0x28, 0x0e, 0x36, 0x69, - 0x77, 0xe7, 0xd0, 0xaf, 0xa9, 0xe5, 0x59, 0xd4, 0x15, 0x02, 0xda, 0x11, - 0xa8, 0x26, 0xa8, 0xa1, 0x76, 0x16, 0xf6, 0x9d, 0xb0, 0xe5, 0xd6, 0xbd, - 0x4e, 0x05, 0x5b, 0x1f, 0xec, 0x19, 0x78, 0xa7, 0xde, 0x54, 0xad, 0x5e, - 0xdb, 0x9e, 0x49, 0x73, 0xeb, 0x98, 0xb9, 0x99, 0xda, 0x2e, 0xf5, 0x5e, - 0xc4, 0xd5, 0x49, 0xc6, 0xa3, 0x07, 0xcc, 0xbf, 0x91, 0x1b, 0x63, 0xf8, - 0x63, 0x47, 0xc5, 0x86, 0xc3, 0xf3, 0x29, 0xa7, 0x8d, 0xfb, 0x8f, 0xcd, - 0x17, 0xb9, 0xc9, 0x4d, 0x00, 0x81, 0xd2, 0x74, 0x21, 0xa8, 0x4a, 0x65, - 0x3d, 0x63, 0xba, 0x3d, 0xae, 0x63, 0x85, 0xa7, 0x0b, 0xed, 0x3f, 0xc9, - 0xec, 0x06, 0x9a, 0x93, 0x2b, 0xd6, 0x5c, 0xf4, 0x37, 0xa5, 0x1b, 0xda, - 0xdf, 0x2c, 0x8b, 0xf4, 0xe6, 0x06, 0x3d, 0x99, 0x92, 0xfa, 0x40, 0x87, - 0x9c, 0x6c, 0x2f, 0x60, 0x97, 0xe8, 0x35, 0x24, 0x8e, 0x98, 0x7b, 0x60, - 0x3d, 0x15, 0xa5, 0xeb, 0x84, 0x69, 0xb6, 0xf3, 0x71, 0xb5, 0xae, 0xbf, - 0x42, 0x1d, 0x8c, 0x59, 0xe8, 0x34, 0x80, 0x24, 0xfa, 0x3f, 0x37, 0x52, - 0x21, 0x90, 0x0e, 0x2c, 0x83, 0x33, 0x80, 0x7f, 0xcd, 0x86, 0x2e, 0x09, - 0x1d, 0xb2, 0xd0, 0xd4, 0x5d, 0xdd, 0x69, 0x7a, 0xba, 0x71, 0x05, 0x37, - 0xdc, 0x33, 0x2a, 0xba, 0x88, 0xb1, 0xaf, 0xb2, 0xa3, 0x38, 0x10, 0x64, - 0xc0, 0x5f, 0xb0, 0x3c, 0x34, 0x9f, 0x25, 0x73, 0xd5, 0x3e, 0xc3, 0xb3, - 0x9b, 0x8d, 0xbc, 0x45, 0x8e, 0xb6, 0xde, 0x02, 0xc0, 0x01, 0xa1, 0x27, - 0x90, 0xb3, 0x34, 0xd7, 0xae, 0xe8, 0xce, 0x5b, 0x6b, 0xf3, 0x47, 0x71, - 0x94, 0x3f, 0x36, 0x2c, 0x86, 0x45, 0x63, 0x59, 0x55, 0xa5, 0xba, 0xcf, - 0x22, 0x30, 0x72, 0xa7, 0xab, 0xbf, 0x56, 0x16, 0xf2, 0x08, 0x4a, 0x9b, - 0x29, 0xc1, 0x1a, 0x59, 0x09, 0x9b, 0x7b, 0xbd, 0x2f, 0xb7, 0x96, 0x45, - 0xb7, 0x2b, 0x37, 0x48, 0xca, 0xcd, 0x3b, 0x8a, 0x70, 0xe6, 0x27, 0x9b, - 0xd9, 0xd7, 0xe6, 0x24, 0xb6, 0xb1, 0x7d, 0xe1, 0x0d, 0xfd, 0x9a, 0x1f, - 0x35, 0x58, 0xa1, 0xd0, 0x18, 0x5d, 0x53, 0xeb, 0xac, 0x42, 0x3f, 0xc9, - 0x40, 0xb5, 0xdd, 0x32, 0x44, 0x28, 0xa4, 0x9b, 0x85, 0x62, 0xe3, 0x56, - 0xff, 0xa3, 0x68, 0x94, 0x34, 0x95, 0xd2, 0x3a, 0x5d, 0xf7, 0xb5, 0x20, - 0xeb, 0x0a, 0x0f, 0xca, 0xee, 0xd2, 0x99, 0x8d, 0x77, 0xe4, 0xc4, 0x8d, - 0xa3, 0xb5, 0x13, 0xf5, 0xf9, 0x4c, 0x5f, 0x5b, 0xa6, 0x32, 0xee, 0x7b, - 0x1a, 0x76, 0xa5, 0x83, 0xb3, 0x28, 0xec, 0x97, 0xba, 0xd0, 0x79, 0xa7, - 0x8a, 0x6f, 0x2c, 0xb2, 0x6e, 0xd0, 0xc0, 0x5c, 0x66, 0x24, 0x72, 0x26, - 0x2b, 0xe1, 0x60, 0x7d, 0x8d, 0xff, 0x64, 0x43, 0x87, 0x40, 0x86, 0x58, - 0xb4, 0x6e, 0x78, 0x49, 0xa4, 0x12, 0x85, 0xe8, 0xbe, 0x0f, 0xb2, 0xd1, - 0x1d, 0x2e, 0x87, 0xd0, 0xcd, 0x8a, 0x9b, 0x12, 0x94, 0x98, 0x46, 0xa6, - 0x62, 0x86, 0x7a, 0x82, 0x3b, 0x3d, 0x76, 0x59, 0xc0, 0xaf, 0x61, 0xa2, - 0x2f, 0x20, 0xc1, 0xe5, 0x0d, 0x43, 0xee, 0x48, 0x9c, 0xee, 0xf7, 0x8f, - 0xcc, 0x40, 0xfd, 0xe5, 0x7e, 0xf1, 0x4a, 0x71, 0xd9, 0x26, 0xfe, 0xf0, - 0xbd, 0x79, 0x3a, 0xca, 0x12, 0xa9, 0x95, 0x6a, 0xf6, 0x7a, 0x28, 0xfb, - 0xf5, 0x2f, 0x07, 0x6c, 0x80, 0x1b, 0x3d, 0xc3, 0x0c, 0x08, 0xc5, 0xee, - 0x89, 0x63, 0x85, 0x9d, 0x51, 0x62, 0xc2, 0x07, 0x85, 0xb1, 0x13, 0x6c, - 0x7c, 0x04, 0x27, 0xbf, 0x41, 0xb6, 0xcb, 0xcc, 0xe1, 0xa4, 0x91, 0xc3, - 0x57, 0xa8, 0xe3, 0xfd, 0xf2, 0x3a, 0x24, 0xaf, 0x63, 0x7e, 0x85, 0xf5, - 0xc5, 0xcd, 0xf3, 0xd0, 0x79, 0x16, 0x81, 0xaf, 0x44, 0xd5, 0x6e, 0x43, - 0xda, 0x88, 0x10, 0x7c, 0x86, 0xc3, 0x45, 0x56, 0xb3, 0x14, 0x00, 0x51, - 0x20, 0xc2, 0x1c, 0x21, 0x71, 0xbf, 0xd0, 0xa8, 0xeb, 0xd8, 0x33, 0x69, - 0xb3, 0x81, 0x52, 0xa4, 0x01, 0x2e, 0xcb, 0x1d, 0xaa, 0xa8, 0xdf, 0xed, - 0xcd, 0xaf, 0x9f, 0x04, 0x52, 0xe5, 0x42, 0x60, 0xb9, 0x90, 0xd3, 0xb8, - 0x56, 0x9d, 0x90, 0x63, 0x7a, 0x91, 0x3a, 0xa4, 0x46, 0x8c, 0x40, 0x07, - 0x90, 0x2a, 0x3c, 0xb8, 0x3a, 0x99, 0x63, 0xd1, 0x54, 0x78, 0xc4, 0xf2, - 0xe5, 0x0d, 0x48, 0x6e, 0xcf, 0x71, 0x25, 0x5e, 0x79, 0xd1, 0x35, 0xe8, - 0xfc, 0x2c, 0xf2, 0x40, 0x50, 0xe5, 0x7b, 0x92, 0x70, 0x0c, 0xe8, 0xee, - 0x0d, 0xd7, 0xe1, 0x31, 0xd8, 0x2b, 0x01, 0x47, 0xa4, 0x33, 0x4d, 0x2c, - 0xce, 0x77, 0xdb, 0xbd, 0x56, 0x60, 0x8d, 0xee, 0x7e, 0x6c, 0x9c, 0x2c, - 0x46, 0x0a, 0x26, 0x28, 0x3f, 0x7e, 0x9d, 0x4f, 0xbf, 0xbb, 0x15, 0x0e, - 0x45, 0x27, 0xb3, 0x05, 0x00, 0x14, 0xce, 0x06, 0x4d, 0x51, 0x9a, 0x04, - 0x42, 0xaf, 0x96, 0x64, 0xdd, 0xcc, 0x2a, 0x98, 0x36, 0x3a, 0x0a, 0xef, - 0x6a, 0x52, 0xc6, 0xdb, 0xb6, 0xbc, 0x37, 0x44, 0xc8, 0x48, 0xaa, 0x72, - 0x13, 0xd2, 0xf8, 0x1c, 0xb4, 0x42, 0xb4, 0xff, 0xb8, 0x80, 0xde, 0x74, - 0x21, 0xad, 0x8a, 0xd1, 0x54, 0x41, 0x97, 0xd1, 0x3e, 0x36, 0x38, 0x1d, - 0x38, 0x83, 0xdd, 0xf2, 0xff, 0x06, 0xea, 0x72, 0x8f, 0x01, 0x8f, 0xaa, - 0x8a, 0xdd, 0x7c, 0xa8, 0x5d, 0xf7, 0xac, 0x16, 0x03, 0x2c, 0x35, 0x46, - 0x52, 0xaf, 0x49, 0xc1, 0x8f, 0xa0, 0xba, 0xc9, 0x50, 0x43, 0x2c, 0x56, - 0x04, 0xa9, 0x50, 0x64, 0x7a, 0x0e, 0x65, 0xfe, 0xfa, 0x33, 0x22, 0x43, - 0x5a, 0x34, 0x87, 0x5f, 0x6a, 0xa6, 0x8d, 0x08, 0x0f, 0x25, 0x8f, 0xd0, - 0xe3, 0xcc, 0x95, 0xfd, 0xf6, 0x1d, 0x63, 0xbb, 0x10, 0xfb, 0x94, 0xfc, - 0x81, 0x30, 0x35, 0x22, 0xaf, 0xa3, 0xe4, 0x27, 0x01, 0x21, 0x67, 0x3f, - 0x2e, 0x90, 0x27, 0x6e, 0x99, 0x1e, 0x58, 0x8b, 0xf7, 0x14, 0xb6, 0xb2, - 0x9b, 0x78, 0x78, 0x30, 0x7f, 0x91, 0x5d, 0xac, 0x1d, 0x10, 0x04, 0xbc, - 0xde, 0x24, 0x19, 0xc0, 0x1f, 0x64, 0x9a, 0x17, 0x28, 0x47, 0xfe, 0x80, - 0xd7, 0xf1, 0x34, 0x19, 0x27, 0x29, 0x23, 0xd1, 0x29, 0x89, 0xac, 0x1a, - 0x27, 0x56, 0xe5, 0x27, 0x37, 0x2d, 0xd2, 0xc8, 0xbf, 0xa0, 0x43, 0xfd, - 0x6f, 0x9c, 0xed, 0xdd, 0xcc, 0xe9, 0x54, 0x23, 0xf0, 0x58, 0x33, 0x56, - 0x05, 0xb7, 0x46, 0x9c, 0x10, 0xcc, 0x80, 0x9d, 0xa5, 0x34, 0xeb, 0x94, - 0xfc, 0x5f, 0xb9, 0x20, 0xa9, 0x27, 0xc3, 0x35, 0xb0, 0x7a, 0xc3, 0x9c, - 0x58, 0xa5, 0xb5, 0x53, 0x14, 0x8d, 0x38, 0xc0, 0x38, 0x93, 0x03, 0x61, - 0x6e, 0x28, 0xb2, 0xb1, 0x1b, 0x87, 0xe6, 0xae, 0xbc, 0x70, 0x8f, 0x3e, - 0x5e, 0x94, 0xe0, 0x04, 0x17, 0x93, 0x77, 0x56, 0xf3, 0x41, 0x5c, 0x56, - 0x5e, 0x4a, 0x22, 0xe8, 0xdb, 0x6a, 0xd5, 0x35, 0x3a, 0x54, 0x0c, 0x6c, - 0xaa, 0xaa, 0xd2, 0x46, 0x40, 0xe9, 0xc4, 0xb1, 0xf8, 0xdd, 0x76, 0xd1, - 0xe1, 0xbd, 0xce, 0x1c, 0xb6, 0xc7, 0xe7, 0x99, 0x12, 0x7d, 0x04, 0x0a, - 0xd2, 0xdd, 0x3d, 0x67, 0x95, 0x3f, 0xf2, 0x03, 0xac, 0x30, 0x87, 0x48, - 0x1b, 0x07, 0x38, 0xd5, 0x78, 0x13, 0xad, 0xee, 0x2c, 0xa4, 0x86, 0xa0, - 0xb8, 0x08, 0x60, 0x93, 0xdb, 0xb3, 0xcd, 0x63, 0x14, 0x39, 0x80, 0x83, - 0x4c, 0x18, 0x9d, 0x06, 0x9c, 0x3d, 0x79, 0xec, 0xb0, 0xe1, 0x0f, 0xbc, - 0x58, 0x84, 0x58, 0x68, 0x34, 0x30, 0x1d, 0xbf, 0xd8, 0xdd, 0xbc, 0xcd, - 0x57, 0x92, 0xe1, 0xc4, 0x33, 0x0e, 0x46, 0x6e, 0x89, 0xbd, 0x2f, 0x3d, - 0xdb, 0x12, 0x46, 0x93, 0xbb, 0x9e, 0xf2, 0x7d, 0xd4, 0x77, 0xda, 0x77, - 0xb2, 0x1d, 0x13, 0x0b, 0x07, 0x64, 0x63, 0x57, 0x42, 0xef, 0x1e, 0x03, - 0x9b, 0xa6, 0xc0, 0x63, 0x86, 0xb4, 0x8c, 0x19, 0xee, 0x73, 0xdb, 0x0d, - 0x23, 0x06, 0x0c, 0xda, 0x24, 0xda, 0xc8, 0xe9, 0x9a, 0xb7, 0x26, 0x8f, - 0x94, 0xe0, 0x37, 0x0e, 0x05, 0xdd, 0x32, 0x43, 0x49, 0x7b, 0x21, 0x0f, - 0x70, 0x2a, 0x92, 0x4b, 0xef, 0xfc, 0x21, 0x8a, 0x45, 0xf3, 0xa7, 0x5b, - 0x59, 0x16, 0x79, 0x19, 0x0a, 0xe6, 0xfb, 0x10, 0xb6, 0x2e, 0x90, 0x72, - 0x6c, 0xe0, 0x9b, 0x04, 0x30, 0xc6, 0x63, 0x2c, 0x14, 0x2f, 0x90, 0x0c, - 0xda, 0xfb, 0xc2, 0xef, 0x13, 0xeb, 0x55, 0x8f, 0xfb, 0x2a, 0x7d, 0xe5, - 0x11, 0x7d, 0x8e, 0x18, 0xd2, 0xfe, 0xb6, 0xfa, 0x3f, 0x8d, 0x8a, 0x25, - 0xb3, 0xf6, 0x00, 0x5e, 0xe2, 0x10, 0xaf, 0xec, 0xb8, 0x38, 0xeb, 0x6e, - 0x9b, 0x14, 0xd2, 0xcc, 0xc6, 0x54, 0xa4, 0x20, 0xd8, 0x39, 0x24, 0xcc, - 0x1e, 0x13, 0xcf, 0x05, 0x42, 0x62, 0x8f, 0xb8, 0x44, 0xa4, 0x28, 0x66, - 0xa3, 0xc1, 0x0d, 0xbd, 0x03, 0x9f, 0xc5, 0x98, 0x80, 0xbf, 0x02, 0x51, - 0x78, 0x02, 0x01, 0x86, 0x01, 0xca, 0x21, 0x8d, 0x5f, 0xce, 0x34, 0xb2, - 0xa8, 0x77, 0x04, 0x8c, 0x08, 0x37, 0x62, 0xe0, 0x8e, 0x91, 0x98, 0xc6, - 0x1b, 0xd7, 0x1a, 0x10, 0xc5, 0x5f, 0x9b, 0xe8, 0x02, 0xc6, 0xc9, 0xb7, - 0xc9, 0x2a, 0x2f, 0xa2, 0x6f, 0xf7, 0x1d, 0x37, 0x61, 0xbc, 0x25, 0x3a, - 0x72, 0x57, 0xb8, 0xa1, 0xaf, 0x62, 0x9e, 0xdc, 0xc6, 0x9f, 0xe4, 0x43, - 0x07, 0x55, 0xa5, 0x21, 0xe6, 0xd3, 0x1d, 0x1e, 0xd9, 0x34, 0x90, 0x1d, - 0x4c, 0xe0, 0x5f, 0xd4, 0xcb, 0xf0, 0x47, 0x5a, 0x16, 0x06, 0xb8, 0x26, - 0x67, 0x68, 0x77, 0xd8, 0x44, 0xc1, 0x76, 0xe1, 0x76, 0x73, 0xce, 0x0a, - 0x7a, 0x17, 0xce, 0xdd, 0xb7, 0x51, 0x0a, 0xa3, 0xa6, 0xf3, 0xfb, 0x8a, - 0x2f, 0xa2, 0x73, 0x13, 0xc5, 0x01, 0x0e, 0x25, 0x6f, 0x33, 0x55, 0xff, - 0xd0, 0xec, 0x2b, 0xbb, 0x0d, 0xb0, 0xab, 0xe3, 0xf8, 0x83, 0xd0, 0x22, - 0x4d, 0xcd, 0x17, 0xaa, 0xae, 0x95, 0xa1, 0xc4, 0x46, 0xbe, 0x05, 0xcb, - 0xcf, 0x4c, 0x6c, 0xa6, 0x45, 0x69, 0xd6, 0x18, 0x34, 0xcc, 0xa0, 0x4f, - 0x10, 0x85, 0x97, 0x52, 0xfb, 0x6d, 0xde, 0x22, 0x20, 0x7a, 0x25, 0xcb, - 0x01, 0xd3, 0xab, 0xda, 0x23, 0xe5, 0x2c, 0x3b, 0x1e, 0x15, 0xeb, 0x18, - 0x4e, 0x00, 0xf6, 0xa4, 0x28, 0x14, 0x52, 0x50, 0xc3, 0x13, 0xb4, 0x79, - 0x2d, 0x79, 0xb9, 0x0e, 0xd5, 0x78, 0xb6, 0x50, 0x14, 0x13, 0xcf, 0x05, - 0x44, 0x74, 0x8a, 0xb8, 0x44, 0xa4, 0x28, 0x66, 0xa3, 0xc1, 0x0d, 0xbd, - 0xa4, 0xc0, 0x36, 0xb0, 0x10, 0xa3, 0x4d, 0x81, 0x11, 0xd5, 0xcb, 0xd5, - 0xa4, 0xcb, 0x0e, 0x34, 0x81, 0x22, 0x3e, 0x24, 0x08, 0xb8, 0x59, 0x6e, - 0x35, 0x1f, 0xd0, 0x7b, 0x5d, 0x49, 0x67, 0x34, 0x96, 0x43, 0x0b, 0xfe, - 0x8b, 0x44, 0x95, 0x80, 0x5e, 0x2d, 0x36, 0x95, 0x65, 0xf3, 0x78, 0xf0, - 0xa9, 0x8b, 0xf0, 0xd6, 0x5c, 0x95, 0x0a, 0x5e, 0xa1, 0x28, 0xfe, 0x00, - 0xf4, 0x83, 0xbe, 0x68, 0x76, 0xb7, 0x33, 0x5e, 0xdd, 0x3a, 0x79, 0xec, - 0x8c, 0x02, 0x34, 0xd0, 0xaf, 0xef, 0xc8, 0xd1, 0xd6, 0xba, 0xfa, 0x1c, - 0x01, 0xb0, 0x97, 0x35, 0x8a, 0xa2, 0x23, 0x6b, 0xd5, 0x7d, 0x7f, 0x2d, - 0xbe, 0xf5, 0xcc, 0x70, 0xa7, 0x99, 0x22, 0x65, 0x5d, 0xa1, 0xe6, 0xb4, - 0x74, 0x58, 0x38, 0x21, 0x7a, 0xd8, 0xb1, 0xf0, 0x5a, 0x6c, 0x7d, 0x29, - 0x76, 0xaa, 0x69, 0x1b, 0x40, 0x4e, 0x83, 0xfe, 0x4e, 0x7f, 0x2e, 0x29, - 0x66, 0x77, 0x33, 0x41, 0x4d, 0xe8, 0xa3, 0x3f, 0xf6, 0x5a, 0xf9, 0xa5, - 0x66, 0xac, 0x05, 0xf8, 0x85, 0x7f, 0xfa, 0xff, 0x4d, 0x8d, 0xe4, 0xc3, - 0xbf, 0x3e, 0xae, 0xa4, 0x95, 0x46, 0x86, 0x2e, 0x31, 0x03, 0xde, 0xc0, - 0x02, 0x5b, 0x47, 0xff, 0xa2, 0x9e, 0x07, 0x3e, 0xfc, 0xa7, 0x4d, 0x96, - 0x65, 0xf9, 0xfd, 0x0e, 0x1c, 0xc6, 0xca, 0x61, 0x49, 0xf9, 0x4f, 0x32, - 0x17, 0xaa, 0xb0, 0x92, 0x14, 0xfc, 0x75, 0x53, 0x2f, 0x66, 0xa6, 0xbf, - 0x16, 0x24, 0x16, 0x28, 0x6e, 0xe2, 0x10, 0x5a, 0xe0, 0xbe, 0x96, 0x8e, - 0x41, 0xff, 0x85, 0x14, 0xb9, 0xdd, 0x10, 0x44, 0x56, 0x9a, 0x97, 0xd8, - 0x98, 0xa6, 0xe2, 0x98, 0xf3, 0x7d, 0x2a, 0x68, 0x13, 0x4d, 0x7f, 0xfd, - 0xc4, 0xe2, 0x87, 0xb3, 0xa5, 0x9a, 0x0a, 0xb7, 0x4e, 0x3b, 0x8d, 0x8d, - 0xe3, 0xc0, 0xf8, 0xb7, 0x2a, 0xca, 0x55, 0x62, 0x8f, 0xb7, 0x5e, 0x92, - 0xea, 0x0f, 0xb7, 0x2a, 0xda, 0x03, 0x67, 0xee, 0x7a, 0x81, 0x1d, 0xaa, - 0x65, 0xf0, 0x55, 0xe1, 0x44, 0x75, 0x9d, 0x02, 0xb4, 0x57, 0x4a, 0x62, - 0x05, 0x02, 0xf5, 0x48, 0x6d, 0xad, 0xbe, 0xf9, 0x3f, 0x0d, 0xc2, 0xfa, - 0x4b, 0x8c, 0x9a, 0x6c, 0xce, 0x1a, 0xea, 0x30, 0xce, 0xc7, 0x56, 0xdd, - 0xff, 0x50, 0xc7, 0x2e, 0x55, 0xbf, 0xe4, 0x0d, 0x17, 0x85, 0x14, 0xef, - 0x62, 0x0f, 0x68, 0x33, 0x4f, 0x93, 0x55, 0x7f, 0x6d, 0xb9, 0x56, 0xaa, - 0x1c, 0xac, 0xe8, 0x8c, 0x59, 0x7d, 0x26, 0x41, 0x47, 0xc2, 0x5c, 0xba, - 0x9d, 0x72, 0x6d, 0x6f, 0xd2, 0x99, 0x32, 0xd2, 0xa5, 0x2b, 0x2a, 0x13, - 0xc2, 0xee, 0xa7, 0xf4, 0x92, 0xa9, 0xc5, 0xde, 0x29, 0x6a, 0x5e, 0x14, - 0x43, 0x63, 0x57, 0x2c, 0x18, 0xd8, 0x8e, 0x47, 0x45, 0x0e, 0x89, 0x47, - 0x7a, 0x0a, 0x86, 0x1c, 0xa6, 0xa2, 0x2b, 0xd6, 0x0f, 0xae, 0x8d, 0x24, - 0x87, 0x0b, 0x7c, 0x21, 0x5d, 0x6d, 0x56, 0xb9, 0x51, 0x8f, 0x09, 0xdf, - 0x59, 0x70, 0x98, 0xcf, 0xc2, 0x7f, 0xf7, 0x36, 0xdf, 0x92, 0xd8, 0x47, - 0xea, 0x4a, 0x53, 0x56, 0x13, 0x44, 0xc3, 0xa6, 0x59, 0xf7, 0x38, 0x42, - 0x7c, 0x26, 0xd5, 0x39, 0xd3, 0xd6, 0xe8, 0xea, 0x69, 0x40, 0x25, 0xa8, - 0x8e, 0xd1, 0x9e, 0xf3, 0xe0, 0x49, 0x38, 0x30, 0x61, 0x63, 0xfd, 0x9b, - 0xbc, 0x8b, 0x53, 0x2f, 0xe8, 0x4d, 0x4a, 0x80, 0x8a, 0x2d, 0x47, 0x64, - 0xaa, 0x21, 0xd4, 0x47, 0x76, 0x39, 0xdd, 0x2a, 0x33, 0xa7, 0x84, 0x29, - 0x2c, 0xfa, 0x8a, 0x25, 0xf3, 0x03, 0x2a, 0x7c, 0x3c, 0x5c, 0xee, 0xba, - 0x2a, 0x8c, 0x2e, 0xd2, 0x75, 0xa6, 0x23, 0xd1, 0x48, 0x7e, 0x3f, 0x92, - 0x27, 0xb1, 0x9d, 0x6b, 0x22, 0xfc, 0xde, 0x1d, 0xc2, 0x7b, 0xa3, 0x21, - 0xac, 0xe6, 0x70, 0xf7, 0xef, 0x6b, 0x6f, 0xdd, 0x2f, 0x5c, 0x6c, 0xe7, - 0xf6, 0x24, 0x3e, 0x1c, 0x26, 0x60, 0xd2, 0x0e, 0xfd, 0x86, 0xed, 0x31, - 0xf5, 0x66, 0xda, 0xb5, 0x23, 0x75, 0xb5, 0x77, 0x11, 0x41, 0x2e, 0xd8, - 0x99, 0x28, 0x86, 0xe1, 0x85, 0x6a, 0xfd, 0x4d, 0x80, 0x55, 0x1b, 0x91, - 0x6f, 0x14, 0x79, 0x98, 0x97, 0x72, 0x53, 0x7d, 0x51, 0x22, 0xe9, 0x5a, - 0x76, 0xea, 0x9a, 0xf1, 0xd3, 0x25, 0x64, 0x9b, 0xfa, 0xd5, 0x32, 0x53, - 0xcd, 0x69, 0x3d, 0xe4, 0xc6, 0xc6, 0xe4, 0x3f, 0x5e, 0x4b, 0xf4, 0x05, - 0x2f, 0x3a, 0xb0, 0x02, 0xb3, 0xa9, 0x70, 0xa0, 0x9f, 0xff, 0x0a, 0xc2, - 0x31, 0x6a, 0xb0, 0x04, 0x64, 0x86, 0x58, 0x31, 0x65, 0x02, 0xb6, 0xef, - 0xbb, 0xf6, 0x84, 0x1b, 0x5b, 0x4f, 0x9f, 0x55, 0xf6, 0xcb, 0xcf, 0xbd, - 0x10, 0xe1, 0x0d, 0x22, 0xa9, 0x41, 0x42, 0xe3, 0x1c, 0xfe, 0xdd, 0x72, - 0x2f, 0xb5, 0xae, 0x87, 0xf4, 0x54, 0xff, 0x6e, 0x8a, 0xfd, 0xab, 0x69, - 0x95, 0x96, 0x69, 0x2b, 0x82, 0x90, 0x94, 0x45, 0x4b, 0x93, 0x44, 0x46, - 0x97, 0x2e, 0x2e, 0x25, 0x64, 0x93, 0x26, 0x73, 0xa7, 0x6f, 0x04, 0xdc, - 0x8f, 0x9d, 0xc6, 0xcf, 0xe7, 0x5b, 0x27, 0x18, 0x95, 0x75, 0xbf, 0x46, - 0x58, 0x41, 0xc6, 0x17, 0x26, 0x97, 0xcc, 0xa1, 0x4c, 0xb0, 0xca, 0x8c, - 0x9c, 0x70, 0x8f, 0x9c, 0xc3, 0x4b, 0xcf, 0x8a, 0xe1, 0x4b, 0x2d, 0xe6, - 0x49, 0x7e, 0xab, 0x85, 0x8f, 0x5e, 0xdf, 0x29, 0xe8, 0x62, 0x5f, 0xa8, - 0xfd, 0xd4, 0x74, 0xe9, 0x05, 0xbd, 0x6e, 0xe8, 0x61, 0x19, 0xa6, 0xa0, - 0xac, 0x28, 0x99, 0x83, 0x59, 0xb9, 0x16, 0x0e, 0x1f, 0x30, 0xd9, 0x94, - 0x6c, 0x0d, 0x2b, 0x96, 0x8e, 0x10, 0xca, 0xa9, 0xb4, 0x97, 0xbb, 0xd5, - 0xbe, 0xd7, 0xf2, 0x94, 0xb7, 0x8a, 0xd3, 0xe3, 0xe9, 0x17, 0xd8, 0x69, - 0xc3, 0xcd, 0x6b, 0x6a, 0x23, 0x84, 0xc7, 0xa4, 0x18, 0x55, 0x09, 0x1d, - 0x66, 0x2f, 0x64, 0x9c, 0x81, 0x1f, 0x3a, 0x30, 0xe1, 0x81, 0x00, 0x05, - 0x97, 0xfe, 0x72, 0xfa, 0x0d, 0x03, 0x99, 0x82, 0x95, 0x88, 0xdf, 0xaf, - 0x0f, 0xf5, 0x5d, 0x8a, 0x6c, 0x20, 0xf8, 0x0d, 0x95, 0x6c, 0x1a, 0x50, - 0x20, 0x44, 0x56, 0xd3, 0x52, 0x6c, 0x0f, 0x55, 0x91, 0x1d, 0x46, 0x1b, - 0xda, 0x81, 0x89, 0x54, 0x94, 0x98, 0x5c, 0x17, 0x3f, 0x7d, 0x5d, 0x31, - 0xcc, 0x4c, 0xf1, 0xf2, 0x3a, 0xd0, 0xe6, 0x98, 0xa8, 0xd1, 0xbe, 0x39, - 0x41, 0x64, 0x9d, 0x31, 0x34, 0x12, 0xdf, 0xf7, 0x0e, 0x30, 0xb2, 0x11, - 0xc2, 0x9e, 0x5b, 0x69, 0xa5, 0xdb, 0x49, 0xf8, 0x94, 0x2a, 0xf5, 0x48, - 0x0f, 0xad, 0x57, 0x79, 0x90, 0xf6, 0x4b, 0x48, 0x57, 0x88, 0xfd, 0xe6, - 0xbc, 0x39, 0x77, 0xfb, 0xc3, 0x36, 0x8e, 0x0b, 0x67, 0x51, 0x67, 0xb4, - 0x9d, 0xa5, 0x2f, 0x76, 0x4c, 0x11, 0x87, 0xd1, 0xcd, 0x94, 0xee, 0x6b, - 0x4f, 0xa4, 0xa7, 0xee, 0x6d, 0x47, 0xc9, 0x47, 0x5a, 0xef, 0x87, 0x1f, - 0xf0, 0xa4, 0x24, 0x7e, 0x83, 0xaa, 0x9a, 0x87, 0x5c, 0xbb, 0x61, 0x02, - 0x52, 0x44, 0xcf, 0x4e, 0x36, 0x8b, 0x2f, 0xf6, 0xa1, 0x54, 0x2f, 0xe9, - 0x60, 0x36, 0x41, 0xcf, 0x9b, 0x2b, 0xd1, 0xc1, 0x1f, 0xe0, 0x04, 0x8a, - 0xf3, 0x03, 0x39, 0xb7, 0x62, 0xc9, 0x6a, 0x26, 0x29, 0xd7, 0x45, 0x59, - 0xae, 0x72, 0xcf, 0xb8, 0xa7, 0xfe, 0xfa, 0xab, 0x0d, 0xe4, 0x75, 0x8f, - 0x41, 0x51, 0xd2, 0x21, 0x30, 0x38, 0x9c, 0x04, 0x4a, 0xd4, 0x82, 0x78, - 0x41, 0xd3, 0x3c, 0x6d, 0x84, 0x9e, 0xc3, 0x24, 0xf3, 0x08, 0xa5, 0xfa, - 0xe2, 0x11, 0x2c, 0x8f, 0xd4, 0xe8, 0x1d, 0x66, 0xd2, 0xb4, 0x89, 0xac, - 0x98, 0x6a, 0x30, 0xa7, 0x21, 0x7d, 0x5d, 0xc6, 0x9d, 0xc5, 0x13, 0x57, - 0xd1, 0x1b, 0x13, 0x42, 0x3d, 0x2a, 0x44, 0x55, 0xfe, 0x98, 0xc8, 0x4c, - 0x3d, 0x0f, 0x24, 0xeb, 0xb4, 0x0c, 0x96, 0x62, 0xf6, 0x2b, 0x94, 0x81, - 0x16, 0x2e, 0xa5, 0x9e, 0xe9, 0x91, 0xf8, 0xe3, 0x03, 0x90, 0xa1, 0xc6, - 0x19, 0xee, 0xeb, 0x3f, 0x9d, 0x37, 0x1d, 0xad, 0x02, 0xde, 0xb3, 0xb1, - 0x9e, 0x54, 0x22, 0xbd, 0xaf, 0xa5, 0x51, 0x76, 0x24, 0xc0, 0xfa, 0xe7, - 0x70, 0x2a, 0xc9, 0x74, 0x8c, 0x3d, 0xf4, 0xaf, 0xd1, 0x86, 0x87, 0xfc, - 0x8d, 0xcd, 0x30, 0x8d, 0x27, 0x79, 0x1a, 0x2c, 0x7e, 0x67, 0x1d, 0x47, - 0xb3, 0x78, 0x21, 0x5b, 0x7a, 0xdd, 0x1b, 0x1e, 0x86, 0x79, 0xcf, 0x0a, - 0x68, 0xa3, 0x56, 0xf8, 0x0f, 0xab, 0x18, 0xd9, 0x1e, 0x3a, 0x3a, 0xf8, - 0x83, 0x01, 0xbe, 0x92, 0xd7, 0xbb, 0xb8, 0xd2, 0xb1, 0xbf, 0xfb, 0x00, - 0x6e, 0x48, 0x19, 0xd0, 0x5b, 0xf0, 0xd4, 0x00, 0xb2, 0x3b, 0x53, 0xad, - 0x6c, 0x25, 0xba, 0x62, 0xe2, 0x7b, 0x7f, 0xd0, 0x3a, 0x92, 0x6b, 0xa5, - 0x95, 0xbf, 0x1f, 0xc9, 0x06, 0x29, 0x6b, 0x34, 0x68, 0xac, 0x1f, 0xcf, - 0x0c, 0x77, 0x1e, 0x2d, 0xd1, 0x5f, 0xcf, 0xe4, 0xdc, 0xe7, 0x6d, 0xd2, - 0x34, 0xd4, 0x3a, 0x57, 0x6a, 0x46, 0x10, 0xfd, 0x37, 0x14, 0xad, 0x83, - 0xcf, 0xd1, 0x8d, 0xd9, 0xba, 0x15, 0x76, 0x2d, 0xf6, 0x24, 0xe7, 0x21, - 0x11, 0x1c, 0x1b, 0x1b, 0x68, 0x00, 0x23, 0x3e, 0x16, 0xba, 0x12, 0x6b, - 0x04, 0x57, 0x82, 0x38, 0x6b, 0x3a, 0x3c, 0x54, 0xf9, 0xff, 0x80, 0x0e, - 0xb4, 0x33, 0xff, 0x7d, 0x11, 0xfd, 0x7e, 0xaf, 0xe1, 0x1b, 0x71, 0xd8, - 0xda, 0x2a, 0x0f, 0xc3, 0xca, 0xab, 0xed, 0x84, 0x91, 0x18, 0x97, 0x67, - 0x9a, 0x59, 0xee, 0x45, 0xda, 0xad, 0xa1, 0xb7, 0x24, 0xa2, 0x64, 0x05, - 0x01, 0x0e, 0x24, 0x58, 0xec, 0xac, 0x63, 0xde, 0xda, 0xdc, 0x09, 0xfa, - 0xb6, 0xf1, 0x48, 0x44, 0xe9, 0xe5, 0x40, 0xaa, 0x19, 0x71, 0x5b, 0x01, - 0xc2, 0x7c, 0xb2, 0x43, 0xf8, 0xbe, 0xf5, 0xd7, 0x14, 0x02, 0xcf, 0xff, - 0x78, 0x79, 0xb0, 0x28, 0xcf, 0x58, 0xe4, 0xd7, 0xe2, 0xb3, 0xd7, 0x04, - 0xcb, 0x9f, 0xf5, 0x41, 0x3d, 0xd7, 0x4d, 0x5e, 0xc5, 0x0c, 0x2c, 0x19, - 0x05, 0xc7, 0x98, 0xe9, 0x47, 0xcd, 0x4b, 0x76, 0xb8, 0x59, 0x0c, 0x90, - 0x4d, 0xdb, 0xc6, 0xe3, 0xbb, 0xd1, 0xe0, 0x54, 0x3f, 0xee, 0x80, 0x48, - 0x66, 0x53, 0x9d, 0xe8, 0x80, 0xa6, 0xe8, 0x3b, 0x36, 0x4c, 0xd4, 0x85, - 0x3e, 0x4a, 0xf7, 0x46, 0x9f, 0xfa, 0xd1, 0xee, 0x56, 0x3e, 0x27, 0x6b, - 0xd2, 0x0d, 0x62, 0x47, 0x68, 0x53, 0x6a, 0x1a, 0x5e, 0x7c, 0xee, 0x15, - 0xea, 0x43, 0x4d, 0x94, 0x9c, 0x95, 0x19, 0xb4, 0xd6, 0xf2, 0x09, 0x99, - 0x38, 0xaa, 0x13, 0x9a, 0x2f, 0xc8, 0xae, 0x54, 0x06, 0x4c, 0x2a, 0x78, - 0x16, 0x84, 0x0a, 0xfc, 0xd1, 0xe5, 0x12, 0xdc, 0x44, 0x78, 0x6c, 0x34, - 0x68, 0xac, 0x1f, 0xcf, 0xbb, 0x25, 0x0d, 0x2c, 0x70, 0x2d, 0x1d, 0xa1, - 0x04, 0x65, 0xfb, 0x65, 0xc1, 0xe4, 0xd0, 0x64, 0x83, 0x12, 0xcd, 0xce, - 0x50, 0x09, 0x52, 0xce, 0x0d, 0xec, 0x4a, 0xdc, 0xf0, 0xff, 0x63, 0x9a, - 0x4c, 0xb9, 0x1a, 0xbb, 0x49, 0xf1, 0x00, 0x17, 0x08, 0x5b, 0x85, 0x6a, - 0xdc, 0x0c, 0xf1, 0x8d, 0xff, 0x40, 0x25, 0xa2, 0xe7, 0x2f, 0x95, 0x90, - 0x59, 0xe7, 0x3c, 0xa3, 0x2a, 0x05, 0xd0, 0x6b, 0xeb, 0x03, 0xa9, 0x5d, - 0xc6, 0xbd, 0x4a, 0x77, 0x03, 0x07, 0xcc, 0x60, 0xc8, 0x06, 0x33, 0xb2, - 0xf8, 0xb7, 0x01, 0x2a, 0xe1, 0x64, 0x41, 0x8e, 0xe9, 0x0a, 0xe6, 0x49, - 0x0d, 0xda, 0xff, 0x9b, 0xa3, 0x15, 0xce, 0x4d, 0x8f, 0x0b, 0xb0, 0x34, - 0x78, 0x9e, 0xb1, 0x45, 0xfb, 0x69, 0x60, 0x1b, 0x2c, 0xb4, 0x5c, 0xf0, - 0x4d, 0xa6, 0x6f, 0x4b, 0x2c, 0xce, 0x07, 0x4a, 0xba, 0x88, 0x4b, 0x3d, - 0xa2, 0xe9, 0x5d, 0x77, 0x9a, 0x28, 0x25, 0x45, 0xf7, 0xfa, 0xac, 0x1b, - 0x0f, 0x97, 0x9a, 0x77, 0x8b, 0x24, 0x4d, 0x74, 0x03, 0x3c, 0x65, 0x86, - 0x28, 0x0a, 0x98, 0xba, 0xf0, 0x22, 0xcd, 0xb3, 0x2e, 0x11, 0x8e, 0xf6, - 0x74, 0xf3, 0x03, 0xec, 0x46, 0xda, 0x9b, 0x61, 0x13, 0x01, 0xd4, 0xc2, - 0xde, 0x8c, 0x75, 0x8e, 0x48, 0xbb, 0xa5, 0x17, 0x5b, 0x57, 0x78, 0x8d, - 0xe3, 0xd4, 0x60, 0xa9, 0xe7, 0x5b, 0x27, 0x18, 0x85, 0x74, 0xbf, 0x46, - 0x57, 0x41, 0xc6, 0x17, 0x22, 0x97, 0xcc, 0xa1, 0x4c, 0xb0, 0xca, 0x8c, - 0x9c, 0x70, 0x8f, 0x9c, 0xc3, 0x4b, 0xcf, 0x8a, 0xe1, 0x4b, 0x2d, 0xe6, - 0x49, 0x7e, 0xab, 0x85, 0x8f, 0x5e, 0xdf, 0x29, 0xe8, 0x62, 0x5f, 0xa8, - 0xfd, 0xd4, 0x74, 0xe9, 0xc0, 0xf7, 0x31, 0x1f, 0x5e, 0x3e, 0x22, 0x15, - 0x83, 0xc7, 0x89, 0x51, 0x15, 0x93, 0x27, 0xb0, 0x5d, 0xb9, 0x88, 0x2f, - 0x06, 0xfd, 0xbf, 0xb6, 0x12, 0x53, 0xba, 0x4f, 0xa7, 0x62, 0x91, 0xa3, - 0x3a, 0x55, 0x89, 0xbd, 0x7f, 0x75, 0xfa, 0x9c, 0x99, 0xdf, 0xfa, 0x05, - 0xf0, 0xb7, 0x29, 0x2b, 0x2e, 0x89, 0x23, 0x30, 0xe4, 0x9b, 0x6c, 0x01, - 0x36, 0x3a, 0x6a, 0x8e, 0x8d, 0x24, 0xa1, 0xaf, 0x28, 0x6f, 0xee, 0x13, - 0x44, 0xa2, 0xa7, 0x63, 0x54, 0x4f, 0x6f, 0x4d, 0x31, 0x42, 0x24, 0x19, - 0x6c, 0x1b, 0x40, 0xe9, 0x02, 0x66, 0x73, 0xb4, 0xfc, 0xac, 0x36, 0x8b, - 0x47, 0x37, 0xbd, 0x15, 0x6f, 0xcb, 0xf9, 0xa3, 0xd4, 0x04, 0x4c, 0x3f, - 0x1f, 0x92, 0x65, 0xcb, 0x0f, 0x56, 0x53, 0x1b, 0x54, 0x52, 0xc7, 0x36, - 0xc0, 0x7e, 0xbb, 0xf2, 0xdd, 0xf9, 0x79, 0x96, 0x66, 0x26, 0x33, 0x30, - 0xac, 0x7c, 0xe6, 0xf0, 0xb5, 0x60, 0x88, 0xf0, 0x59, 0x1c, 0x0e, 0xdc, - 0xe9, 0x18, 0xf5, 0x2f, 0x15, 0x92, 0xf0, 0xa6, 0x42, 0x47, 0x39, 0xaa, - 0x93, 0xa5, 0xa3, 0xc5, 0xee, 0x80, 0x0f, 0x80, 0xc9, 0x58, 0xd3, 0x64, - 0x86, 0xb0, 0x61, 0x58, 0xfd, 0xb9, 0x52, 0x91, 0x7c, 0xaf, 0xa2, 0x58, - 0x3b, 0x5d, 0xde, 0x84, 0xb6, 0x32, 0x7a, 0x29, 0x06, 0xbc, 0x93, 0xb6, - 0x03, 0x40, 0x0c, 0xa8, 0x9c, 0xd7, 0xfe, 0x10, 0xea, 0x51, 0xda, 0x1f, - 0xf2, 0x1f, 0x8a, 0x80, 0x75, 0xb2, 0x8d, 0x6c, 0x66, 0x2d, 0x53, 0x0e, - 0x65, 0x3e, 0x11, 0x0f, 0x6a, 0x73, 0x0a, 0xf1, 0x35, 0x66, 0x4f, 0x44, - 0x3c, 0xd6, 0xeb, 0xfe, 0xeb, 0x02, 0xfe, 0xe4, 0x63, 0xdf, 0x0f, 0x64, - 0xa6, 0x6e, 0xe1, 0xed, 0x28, 0x55, 0xf8, 0xe6, 0x26, 0xe7, 0x6f, 0xf7, - 0xd8, 0x98, 0xc3, 0x34, 0x9a, 0x59, 0x65, 0x30, 0x5b, 0x43, 0xe3, 0xa6, - 0xcf, 0xb7, 0xcc, 0x64, 0x1c, 0x20, 0x0d, 0x90, 0xb3, 0xf8, 0x13, 0xa7, - 0xa5, 0x22, 0x78, 0xec, 0xd1, 0x2d, 0xe3, 0x8c, 0x46, 0x52, 0xad, 0x93, - 0x05, 0xa6, 0xac, 0xc1, 0xdc, 0x3e, 0xf4, 0xd0, 0x47, 0xdf, 0x71, 0xe6, - 0x8b, 0x31, 0x0e, 0xc0, 0x99, 0x25, 0xc8, 0x94, 0x04, 0x98, 0x28, 0xb6, - 0xd2, 0x5f, 0x45, 0x5d, 0x41, 0xb6, 0x12, 0x00, 0x11, 0xa5, 0x5f, 0x52, - 0x01, 0x21, 0x22, 0x8b, 0x98, 0x38, 0xef, 0x89, 0xdd, 0x00, 0xf0, 0xf1, - 0x39, 0x12, 0xb4, 0x02, 0x62, 0xbc, 0x4f, 0x1f, 0xd1, 0x4c, 0x2a, 0x1b, - 0xc5, 0xf0, 0xff, 0x91, 0x47, 0x0c, 0x24, 0x29, 0xdb, 0x4b, 0xd4, 0x18, - 0x21, 0x69, 0xc1, 0xc8, 0x44, 0xab, 0x62, 0xbf, 0x8e, 0x65, 0xfa, 0x99, - 0x15, 0xac, 0x9f, 0xc5, 0x83, 0xe4, 0x31, 0x72, 0xc5, 0x4a, 0xba, 0x5f, - 0x3b, 0x08, 0x6b, 0x80, 0x45, 0xa1, 0x70, 0x24, 0x19, 0x1a, 0xf4, 0x39, - 0xfa, 0x8d, 0x0d, 0xdb, 0xc1, 0x64, 0xaf, 0x52, 0x18, 0x42, 0x0d, 0x2c, - 0xe5, 0x42, 0x5d, 0x0d, 0xc3, 0xd1, 0xf9, 0xcb, 0x77, 0xb0, 0xd9, 0x39, - 0x7a, 0xca, 0x4c, 0xd1, 0xda, 0x2e, 0x18, 0x55, 0x76, 0xec, 0xbc, 0x0d, - 0xfb, 0x4c, 0x31, 0xb3, 0x44, 0x8e, 0xc8, 0x72, 0x1f, 0x5d, 0x36, 0xfe, - 0x2a, 0x1d, 0xae, 0x13, 0xe4, 0x89, 0x84, 0xfa, 0x19, 0x8e, 0xc0, 0xbd, - 0xd9, 0x37, 0x15, 0x3e, 0xc4, 0xdf, 0xb7, 0x22, 0x65, 0x8c, 0x37, 0x0f, - 0x22, 0x72, 0xbc, 0xcc, 0x35, 0x78, 0x30, 0xa7, 0x59, 0xd5, 0x55, 0x82, - 0xdf, 0x0e, 0x97, 0xf3, 0xa0, 0x1e, 0xc7, 0x87, 0x42, 0x40, 0xc2, 0xda, - 0x98, 0xf7, 0xa9, 0x7c, 0xb8, 0x63, 0x91, 0x2f, 0xc9, 0xaf, 0x72, 0xe2, - 0x6f, 0x82, 0x6e, 0xb4, 0xb5, 0xc6, 0x12, 0xc7, 0x2f, 0xfe, 0x0a, 0x30, - 0x56, 0x4d, 0x6f, 0x47, 0x0b, 0x0a, 0x31, 0x5d, 0xab, 0x68, 0x36, 0x56, - 0x7a, 0xdd, 0x1b, 0x1e, 0x68, 0x19, 0x95, 0xd3, 0xe4, 0x5a, 0x51, 0x28, - 0x88, 0xec, 0x06, 0x05, 0xdf, 0x39, 0xbe, 0x77, 0x80, 0x91, 0xac, 0xc3, - 0xac, 0x44, 0xe0, 0x2f, 0x8c, 0x9b, 0x68, 0x4c, 0x5f, 0xf6, 0xda, 0x50, - 0x2a, 0xca, 0x9b, 0x3f, 0xfd, 0x98, 0xd4, 0x9d, 0x36, 0x83, 0x3b, 0x39, - 0x27, 0x0a, 0x7f, 0xb0, 0x5a, 0x83, 0x29, 0x7a, 0x26, 0xf8, 0xfc, 0x39, - 0xb7, 0x5e, 0xd7, 0x9b, 0x05, 0x5d, 0xd2, 0x0a, 0x7b, 0x69, 0x2d, 0xee, - 0x9b, 0x83, 0xe7, 0xe3, 0x96, 0x23, 0x68, 0xef, 0x66, 0x11, 0x66, 0x3a, - 0x1e, 0xdf, 0x8c, 0xe8, 0x64, 0xcf, 0x67, 0x51, 0x91, 0x64, 0x94, 0x59, - 0x3d, 0xe0, 0xa1, 0x3d, 0x37, 0x63, 0xcb, 0xe1, 0xf1, 0x38, 0xce, 0x9b, - 0x58, 0xfa, 0xd0, 0x76, 0x49, 0xde, 0x01, 0xc8, 0xc8, 0xfe, 0x7c, 0x34, - 0x5f, 0x6f, 0xb1, 0xcf, 0x2e, 0x65, 0x37, 0xfe, 0xca, 0xf0, 0x16, 0xe0, - 0x0e, 0xb9, 0x02, 0x00, 0xc5, 0x2b, 0xea, 0x0d, 0xd6, 0x00, 0x38, 0x05, - 0x91, 0xa1, 0xd3, 0xc9, 0x21, 0xb4, 0xc7, 0xbc, 0x92, 0xc6, 0xf9, 0xaa, - 0x18, 0xc1, 0x83, 0x33, 0xda, 0x3d, 0xe0, 0x58, 0x53, 0x62, 0x64, 0x43, - 0x98, 0xe7, 0x7b, 0x81, 0xd3, 0x44, 0xe7, 0x88, 0x0a, 0xc9, 0x25, 0xa2, - 0x62, 0x98, 0x80, 0xcc, 0x2a, 0x25, 0xe7, 0xef, 0x5c, 0x88, 0x89, 0xe5, - 0x44, 0xd2, 0xcb, 0xe7, 0xcc, 0x63, 0x31, 0xe7, 0xe7, 0x42, 0xaa, 0xf3, - 0xdf, 0x66, 0x92, 0x69, 0xcf, 0x60, 0xfc, 0xa9, 0x41, 0xb2, 0xb2, 0xca, - 0x79, 0x46, 0xab, 0xad, 0x24, 0x8d, 0x8f, 0x0f, 0x5f, 0xed, 0x4e, 0xab, - 0x6b, 0xd8, 0x57, 0x14, 0x4e, 0xf9, 0x32, 0xc3, 0x36, 0xf6, 0x3e, 0xba, - 0xc6, 0xb6, 0x25, 0x91, 0x3b, 0x03, 0xef, 0xd2, 0xb7, 0x8d, 0xec, 0xc9, - 0x7f, 0x39, 0x06, 0x13, 0xd4, 0x11, 0x04, 0xd2, 0x6e, 0x33, 0xf8, 0x98, - 0x03, 0xbf, 0x35, 0x38, 0xe5, 0x9b, 0x10, 0x42, 0x19, 0x2d, 0x74, 0x46, - 0x57, 0x9f, 0x79, 0x3e, 0x6e, 0x74, 0x96, 0x6b, 0xa1, 0xda, 0xcf, 0x5c, - 0x49, 0x30, 0xe5, 0x62, 0x80, 0xff, 0x92, 0x98, 0xc8, 0x3b, 0x58, 0x9a, - 0x32, 0x40, 0xc9, 0xf5, 0x4b, 0x79, 0x06, 0x68, 0x11, 0x6b, 0x0c, 0x73, - 0x08, 0x9b, 0x56, 0x9d, 0x72, 0x49, 0x56, 0x52, 0x3b, 0x77, 0xa9, 0x87, - 0x47, 0xef, 0x78, 0xf9, 0xad, 0x88, 0xa0, 0xf1, 0xfd, 0x4d, 0x3f, 0xa9, - 0xeb, 0x90, 0x2d, 0x3a, 0x3f, 0x5d, 0x7a, 0x86, 0x68, 0x82, 0x3e, 0xaf, - 0x4a, 0x11, 0x61, 0xcc, 0x04, 0x02, 0x1a, 0xab, 0x31, 0x8b, 0xe7, 0x4a, - 0x62, 0x3c, 0xa7, 0x58, 0x36, 0x29, 0x53, 0xe6, 0x05, 0x34, 0xc2, 0x2a, - 0x84, 0xcc, 0xc0, 0xd8, 0x8a, 0xd1, 0x27, 0xe1, 0x0d, 0x05, 0xae, 0xd6, - 0x26, 0xcd, 0x2a, 0xdd, 0x72, 0x6b, 0x6f, 0x1e, 0xb9, 0x74, 0x69, 0x1f, - 0xe4, 0x23, 0xad, 0x32, 0x5a, 0x15, 0x17, 0xec, 0x55, 0x2d, 0xaa, 0xe1, - 0x9c, 0x6c, 0xdc, 0x45, 0x50, 0xa1, 0xb1, 0xf4, 0xb8, 0x06, 0x8a, 0x04, - 0x3f, 0xd5, 0xea, 0x3c, 0xe3, 0x5e, 0xbc, 0xd3, 0x3b, 0x28, 0x83, 0xa6, - 0xdb, 0x11, 0x68, 0xba, 0x43, 0x6d, 0x2b, 0xc3, 0xad, 0x26, 0xae, 0xf1, - 0xca, 0x96, 0x8a, 0x7f, 0x8d, 0xc1, 0x9e, 0x16, 0x2e, 0xc5, 0xff, 0xce, - 0xf7, 0x2c, 0xf2, 0x6e, 0x19, 0xad, 0x60, 0x19, 0x7b, 0x75, 0x09, 0xd5, - 0x2f, 0x95, 0xeb, 0xe7, 0x87, 0xbb, 0x46, 0x8c, 0x15, 0x3d, 0x3d, 0x42, - 0x7f, 0x2f, 0x1f, 0x02, 0x86, 0xa3, 0x91, 0xa5, 0x9d, 0xaa, 0xfb, 0x9b, - 0xd9, 0x90, 0xba, 0x46, 0xed, 0x05, 0x61, 0x24, 0xb4, 0x7d, 0x07, 0x8b, - 0x05, 0x93, 0xd5, 0x61, 0x14, 0xc3, 0x7f, 0x38, 0xf0, 0xee, 0xb3, 0x28, - 0xa1, 0x3d, 0xdf, 0x63, 0x65, 0x56, 0x93, 0x9b, 0x76, 0xe1, 0xa0, 0xbf, - 0xb7, 0xff, 0x68, 0x7e, 0x87, 0x8f, 0x29, 0x43, 0x04, 0x6e, 0xbf, 0x7c, - 0x74, 0x40, 0x9b, 0xda, 0xbb, 0xb9, 0xa7, 0xb9, 0x2c, 0x3c, 0x88, 0x29, - 0x0f, 0x1d, 0xa4, 0xbb, 0x6a, 0xfc, 0x71, 0xb0, 0xa9, 0x3b, 0xea, 0x13, - 0x01, 0x26, 0x1b, 0xdd, 0x3d, 0x27, 0x7c, 0x7e, 0xe6, 0x85, 0xdc, 0xcb, - 0x94, 0x3a, 0xcc, 0x48, 0x96, 0x06, 0xe9, 0xf7, 0x85, 0x7e, 0xb3, 0x99, - 0x0d, 0x69, 0xbe, 0x64, 0xfb, 0xa9, 0x54, 0x53, 0x0c, 0x7b, 0xc3, 0x75, - 0xd4, 0xe4, 0x59, 0x44, 0x41, 0xe3, 0x16, 0x0b, 0x9a, 0x4f, 0xcb, 0x93, - 0x87, 0xee, 0xdb, 0x5c, 0xd2, 0xe3, 0x02, 0xd4, 0x84, 0xe7, 0x67, 0xad, - 0x30, 0x0c, 0x82, 0x77, 0x19, 0xc7, 0x03, 0x48, 0x26, 0xd4, 0xff, 0x36, - 0x89, 0x5b, 0x9f, 0xe6, 0x2a, 0x28, 0xd8, 0x0a, 0x19, 0x30, 0xd0, 0x78, - 0x8b, 0x47, 0x3a, 0x1f, 0x27, 0xd9, 0x25, 0x7c, 0xcc, 0x02, 0x29, 0x20, - 0x75, 0xe3, 0x37, 0x2c, 0x0c, 0xba, 0x48, 0xa3, 0x67, 0xfd, 0x30, 0x3c, - 0x2c, 0xb4, 0xcf, 0x53, 0x43, 0x53, 0x48, 0x55, 0x08, 0x78, 0xa2, 0x57, - 0xf5, 0x13, 0xf9, 0xcd, 0x0f, 0x56, 0x52, 0x1f, 0x0a, 0x8c, 0x7c, 0xa1, - 0x38, 0x09, 0x55, 0x45, 0x3f, 0x4f, 0xd5, 0xab, 0xf5, 0xbb, 0x67, 0x25, - 0xfe, 0x12, 0x44, 0x31, 0x09, 0x0e, 0xa6, 0xe6, 0x35, 0xa3, 0xfd, 0xed, - 0xa7, 0x68, 0xcc, 0x1d, 0xe8, 0xac, 0x51, 0xdd, 0x75, 0x2c, 0x49, 0x34, - 0xe2, 0xa2, 0x26, 0xa3, 0x77, 0x90, 0x94, 0x02, 0xaa, 0x52, 0x9e, 0xc1, - 0xab, 0xaa, 0xd0, 0x94, 0x36, 0xeb, 0x02, 0xda, 0x34, 0xdf, 0x7c, 0x4a, - 0x74, 0x48, 0xc7, 0xc8, 0x4e, 0xa1, 0x3f, 0x3d, 0xc2, 0x3e, 0x5f, 0xfc, - 0x5e, 0xea, 0x2c, 0x07, 0x99, 0xdb, 0x7c, 0x2a, 0xc0, 0x31, 0x77, 0x58, - 0xa9, 0xd5, 0xd7, 0xc1, 0xc0, 0x54, 0xb1, 0x7d, 0x3b, 0x7f, 0x3c, 0x63, - 0xb6, 0x1c, 0x90, 0xa5, 0x81, 0x5b, 0xcf, 0xf3, 0xb4, 0xcf, 0x58, 0xf5, - 0xd4, 0x8d, 0xb5, 0xca, 0x87, 0x57, 0x6c, 0x5e, 0xed, 0x27, 0xfb, 0x55, - 0xf1, 0xca, 0x4c, 0xbc, 0x12, 0xca, 0xbd, 0x2f, 0xa0, 0xcc, 0xb4, 0xf4, - 0x0f, 0xda, 0x74, 0x5e, 0x35, 0x58, 0x17, 0x8f, 0xf0, 0x7b, 0x7e, 0x7b, - 0x2a, 0x9c, 0x3c, 0xa6, 0xbc, 0x32, 0x6c, 0x12, 0xe1, 0xb1, 0xb8, 0x4e, - 0xe1, 0xf3, 0xcc, 0xd1, 0xbe, 0xa7, 0x08, 0x00, 0x9c, 0x3b, 0xeb, 0x21, - 0x05, 0xb9, 0x72, 0x59, 0xd7, 0xc2, 0x4f, 0x09, 0x9d, 0xc1, 0x58, 0xd8, - 0xe5, 0x1b, 0xad, 0xe8, 0xde, 0x78, 0x58, 0x39, 0x31, 0x7b, 0xa8, 0xaa, - 0x41, 0x03, 0xe9, 0x03, 0x80, 0xbb, 0xf1, 0xce, 0x3c, 0x66, 0x09, 0x87, - 0x06, 0x59, 0x6d, 0x0e, 0x84, 0xec, 0xf3, 0x4a, 0xaa, 0x04, 0x9b, 0xd3, - 0xc8, 0x30, 0x79, 0x57, 0x57, 0x68, 0xd4, 0xb7, 0x6e, 0xcc, 0x30, 0x55, - 0xcf, 0x56, 0x9e, 0x96, 0xd7, 0x64, 0x43, 0xf6, 0x69, 0xa4, 0x3c, 0x77, - 0x42, 0x7a, 0x6e, 0x49, 0xa3, 0x64, 0x5c, 0x2f, 0xbe, 0xee, 0xc9, 0x61, - 0xee, 0xaa, 0xfe, 0xd9, 0x75, 0xa0, 0x5f, 0x09, 0xfd, 0xa6, 0xd7, 0x66, - 0xaf, 0xb6, 0xd1, 0x3a, 0xe6, 0xee, 0x09, 0x80, 0x89, 0x4e, 0x66, 0x17, - 0x8a, 0x47, 0x03, 0xd0, 0xea, 0x23, 0x41, 0x52, 0xa1, 0x8d, 0x94, 0x73, - 0x92, 0xc3, 0x47, 0xdb, 0x59, 0xdf, 0x4e, 0x31, 0xa4, 0x47, 0xe0, 0x66, - 0x6a, 0xd4, 0x59, 0x7e, 0xf0, 0x80, 0x88, 0xa6, 0x6c, 0x15, 0xf3, 0x72, - 0x25, 0xa4, 0x68, 0xf5, 0xbf, 0xbb, 0x4d, 0x37, 0x05, 0xd1, 0x0b, 0x65, - 0x02, 0x09, 0x1e, 0x81, 0x1f, 0x86, 0x19, 0x67, 0x14, 0x96, 0xd5, 0x0a, - 0x96, 0x4f, 0x34, 0xff, 0x7d, 0xaf, 0x7e, 0xb5, 0xb0, 0x11, 0x6e, 0xda, - 0xc4, 0x42, 0xfb, 0x1a, 0xa4, 0xc7, 0xca, 0x2b, 0x4a, 0xf4, 0x0a, 0x46, - 0xd1, 0x89, 0x50, 0x78, 0x63, 0xeb, 0xb8, 0x6b, 0x10, 0xe3, 0x1c, 0xcf, - 0x8d, 0x6b, 0xa8, 0xfb, 0xdd, 0xac, 0x8c, 0x02, 0x22, 0x23, 0xc7, 0x88, - 0xa1, 0x50, 0x2b, 0xd7, 0x35, 0x91, 0xb6, 0xbb, 0x07, 0x44, 0x0f, 0x0d, - 0x10, 0xb3, 0x13, 0x28, 0x73, 0x7f, 0xa8, 0xfd, 0xac, 0x95, 0x23, 0xa0, - 0x27, 0x0d, 0xa2, 0x06, 0xe3, 0xba, 0x95, 0x32, 0xcc, 0x0c, 0xb3, 0x47, - 0x48, 0x20, 0x52, 0xb0, 0xfe, 0x69, 0xd7, 0x61, 0x98, 0x37, 0x35, 0xf3, - 0x62, 0xbe, 0xd2, 0xd5, 0xd7, 0x1b, 0xcd, 0x4d, 0xdc, 0xe1, 0x89, 0x21, - 0x9b, 0xb9, 0x64, 0x47, 0x85, 0x72, 0x3b, 0xaf, 0xdc, 0x52, 0x65, 0x4b, - 0xd3, 0x53, 0xdf, 0xeb, 0x00, 0xf4, 0x57, 0xb6, 0x72, 0xfe, 0xf4, 0x2f, - 0x7a, 0xad, 0x15, 0x5f, 0x3b, 0xb3, 0x0f, 0x9d, 0xba, 0x52, 0xfb, 0x3d, - 0xa7, 0x57, 0x2b, 0x23, 0x19, 0x3c, 0x74, 0x37, 0x99, 0xce, 0xae, 0x0a, - 0xa6, 0x39, 0x61, 0x89, 0x8d, 0x92, 0x43, 0x27, 0xaa, 0x9a, 0x66, 0x4e, - 0xdd, 0x7e, 0xc3, 0x94, 0x49, 0x98, 0x74, 0xb6, 0x2f, 0x52, 0xcf, 0x73, - 0xf3, 0xbc, 0x04, 0xc6, 0xeb, 0xd6, 0x65, 0x89, 0x1a, 0x52, 0xfa, 0x9e, - 0x34, 0xa8, 0x21, 0xc7, 0x3e, 0x8e, 0xd9, 0xc5, 0x38, 0x33, 0x49, 0xeb, - 0x86, 0xb9, 0x8f, 0xa2, 0x8c, 0xfc, 0x05, 0x46, 0x39, 0x96, 0x5e, 0xf5, - 0xef, 0x65, 0xfb, 0x28, 0x19, 0x21, 0x3e, 0x83, 0x6b, 0x5a, 0x40, 0x4a, - 0x85, 0xaf, 0xaf, 0xb9, 0x38, 0xec, 0x8f, 0x10, 0x5c, 0xc8, 0x59, 0x8f, - 0xe2, 0x48, 0x39, 0x48, 0x2b, 0xf9, 0x1b, 0xb8, 0xd9, 0x8a, 0xa6, 0x67, - 0xf9, 0x03, 0x5a, 0xdd, 0x2b, 0x55, 0x50, 0xf6, 0x55, 0xea, 0xf4, 0x8b, - 0x4e, 0x14, 0xd9, 0x2d, 0xff, 0x16, 0x4f, 0x4c, 0x4e, 0x32, 0xbf, 0x62, - 0xcc, 0x9e, 0xb7, 0x16, 0x78, 0x3c, 0x3a, 0xd9, 0x6e, 0xa1, 0xfe, 0x2f, - 0x57, 0xd0, 0xd4, 0xf2, 0x8e, 0xf5, 0x7c, 0xf9, 0xd8, 0x0b, 0x15, 0xf5, - 0xb4, 0x7d, 0x1a, 0xaf, 0x30, 0x95, 0xf5, 0x7a, 0x10, 0xe8, 0x7d, 0x3e, - 0xf0, 0xee, 0xb3, 0x28, 0xa7, 0x12, 0xb7, 0xcd, 0x7f, 0xdd, 0xb4, 0xbe, - 0xa4, 0xcb, 0xf6, 0x5a, 0x02, 0xac, 0x8f, 0x91, 0x9f, 0x6f, 0x5a, 0x13, - 0x6e, 0x41, 0x01, 0x2b, 0x63, 0x9d, 0x76, 0x60, 0x03, 0xf6, 0xe4, 0x9d, - 0xd1, 0xca, 0xf1, 0x53, 0x94, 0xb0, 0x27, 0x95, 0xb9, 0xe2, 0x79, 0x5e, - 0x9e, 0x6e, 0x27, 0x41, 0x65, 0x48, 0xd3, 0xda, 0x1c, 0x3b, 0xf5, 0x2b, - 0x99, 0x19, 0x21, 0xd6, 0x87, 0xf1, 0x06, 0xa8, 0x41, 0xd6, 0xb3, 0x1d, - 0x49, 0xef, 0x3f, 0x1d, 0xfc, 0xfa, 0x1f, 0x94, 0xb3, 0x60, 0x93, 0xd4, - 0x03, 0xe2, 0x17, 0x96, 0xb9, 0x4b, 0xb7, 0x7e, 0x2f, 0x8f, 0x49, 0x85, - 0x37, 0xdb, 0xb3, 0x5d, 0x5a, 0x2a, 0xc7, 0x4f, 0x9e, 0x2a, 0x66, 0x76, - 0x54, 0xd1, 0x9d, 0x6d, 0xba, 0xae, 0xc4, 0x34, 0xc1, 0x08, 0x3c, 0xa2, - 0x08, 0xf9, 0xee, 0xd9, 0xa0, 0x07, 0x70, 0x87, 0xc2, 0xd0, 0xbb, 0x33, - 0x17, 0x1e, 0x2a, 0xf0, 0xe0, 0x2a, 0x67, 0x95, 0xb0, 0xd7, 0x38, 0xe2, - 0x88, 0x48, 0xd8, 0xd2, 0x10, 0x89, 0x1a, 0x12, 0x77, 0xe9, 0x02, 0x07, - 0x34, 0x16, 0x1b, 0xd1, 0x27, 0x5f, 0x24, 0x26, 0x95, 0x5f, 0x4f, 0x6a, - 0xbd, 0x2c, 0x5a, 0x2e, 0x2e, 0x6a, 0x52, 0x69, 0xf8, 0xe0, 0x19, 0xfe, - 0x60, 0x16, 0xbc, 0x63, 0x6a, 0xa1, 0xcb, 0x57, 0xa9, 0x5f, 0xd7, 0xc6, - 0x0d, 0x8c, 0x81, 0x71, 0x42, 0xcf, 0x32, 0x8b, 0xb6, 0xc3, 0xe0, 0x80, - 0x77, 0x09, 0x91, 0x68, 0xad, 0xff, 0x53, 0x31, 0xd6, 0x40, 0x1e, 0x73, - 0xb7, 0x96, 0x1e, 0x6e, 0xcf, 0x1e, 0xc9, 0xa6, 0xfb, 0xaa, 0x19, 0x26, - 0xc9, 0x8e, 0xb7, 0xfe, 0x28, 0xe1, 0xf4, 0xc6, 0x14, 0x95, 0xf1, 0xf8, - 0xcd, 0x9a, 0x2a, 0x2d, 0xee, 0x3c, 0xe4, 0x4b, 0xf6, 0x8a, 0xee, 0xd1, - 0x88, 0x00, 0x37, 0xbe, 0x6b, 0xf4, 0xa9, 0x6f, 0xec, 0x19, 0xfe, 0x3d, - 0xc2, 0xac, 0x12, 0x32, 0x4c, 0xdc, 0x1b, 0xa9, 0x20, 0x0e, 0xfe, 0x63, - 0x0c, 0x70, 0xc3, 0x54, 0x0e, 0x06, 0x05, 0x74, 0x4b, 0x62, 0x88, 0xb5, - 0x40, 0xa7, 0x35, 0x32, 0xa6, 0xee, 0x07, 0x85, 0xd6, 0x51, 0x45, 0xb5, - 0xb0, 0x90, 0x1a, 0xe5, 0x34, 0x58, 0x60, 0x2a, 0x95, 0x87, 0x96, 0x10, - 0x5d, 0x0a, 0x0c, 0x81, 0xa6, 0x64, 0x9f, 0xaf, 0x48, 0xb7, 0x2e, 0xa6, - 0xd5, 0x1a, 0x44, 0xb0, 0xc1, 0x7a, 0x70, 0x0c, 0x4a, 0xc0, 0xb3, 0x3e, - 0xd4, 0x62, 0x28, 0xa5, 0x77, 0x58, 0xb4, 0x52, 0xc3, 0x97, 0x0b, 0xad, - 0x00, 0x89, 0x87, 0x3d, 0x55, 0x93, 0xaa, 0x58, 0x64, 0xb9, 0xd8, 0x52, - 0x6a, 0x7a, 0x3d, 0x4e, 0xf1, 0xd9, 0xc7, 0x5b, 0x5c, 0xef, 0x3f, 0x25, - 0x90, 0x6f, 0xce, 0x6f, 0xef, 0x13, 0xe2, 0x67, 0x1a, 0xa3, 0xca, 0xa3, - 0x2a, 0x29, 0x0a, 0xf3, 0x31, 0xce, 0x6c, 0x29, 0x84, 0xc1, 0x51, 0x2d, - 0x8d, 0x3b, 0xb7, 0xab, 0x00, 0xc2, 0xb6, 0xa2, 0xc7, 0x21, 0xf9, 0xc5, - 0x0a, 0x9b, 0x79, 0x17, 0x32, 0x17, 0x32, 0xe3, 0x71, 0x0c, 0x12, 0x36, - 0x7e, 0xbc, 0x8d, 0x88, 0xc1, 0x5f, 0xed, 0x4c, 0xec, 0x77, 0xde, 0xb2, - 0xf2, 0x76, 0x66, 0x72, 0x25, 0x69, 0xae, 0x9d, 0x14, 0xc1, 0x31, 0xbb, - 0xcf, 0xe1, 0x2e, 0x30, 0xd8, 0x5f, 0x89, 0x49, 0x1b, 0xd4, 0x9e, 0x43, - 0x7c, 0xbc, 0xaa, 0xea, 0x13, 0x21, 0xb7, 0x10, 0x3b, 0x03, 0x5f, 0x31, - 0xed, 0xf5, 0x66, 0x3d, 0xad, 0x58, 0x95, 0x8c, 0x52, 0x1e, 0x50, 0xe7, - 0xfc, 0xbc, 0x66, 0xae, 0x9d, 0x14, 0xa1, 0xa0, 0x15, 0x89, 0x54, 0xe1, - 0xe6, 0x7d, 0xf4, 0x32, 0x43, 0x52, 0x58, 0x80, 0xf6, 0xba, 0x96, 0x5c, - 0xbe, 0x58, 0x71, 0xae, 0x1a, 0xb0, 0x23, 0x92, 0x89, 0x33, 0x20, 0x2b, - 0x88, 0x42, 0x19, 0xe1, 0x5f, 0x1e, 0xa0, 0xe0, 0x7b, 0x18, 0x1a, 0xf2, - 0xb9, 0x7a, 0x81, 0x64, 0xea, 0xca, 0x2c, 0x65, 0x7b, 0xcc, 0xfc, 0xe0, - 0xad, 0x06, 0x53, 0x8e, 0xa4, 0xce, 0x99, 0x9f, 0xf9, 0x5e, 0xdb, 0x9e, - 0x05, 0x23, 0x5a, 0x31, 0xc2, 0x36, 0x10, 0x5f, 0xc1, 0x68, 0x49, 0xe2, - 0xd9, 0x2e, 0xb6, 0x18, 0x0b, 0x50, 0xe2, 0x0b, 0x46, 0x42, 0x3d, 0x15, - 0xcf, 0xe3, 0xbe, 0xe8, 0xf1, 0x3a, 0x15, 0x69, 0xa9, 0x8c, 0x98, 0xe6, - 0x57, 0x3c, 0x76, 0xd4, 0x12, 0xc3, 0xa3, 0x72, 0x75, 0x6c, 0x46, 0xfb, - 0x8d, 0x43, 0xfd, 0x2d, 0xe0, 0xe3, 0xeb, 0x5f, 0xdb, 0xee, 0xd4, 0xbe, - 0xb0, 0xc1, 0x94, 0x67, 0x21, 0x33, 0x19, 0xfd, 0xe7, 0xc0, 0xe9, 0x89, - 0x6f, 0xa6, 0x0e, 0xf2, 0x0f, 0xec, 0x66, 0x92, 0x15, 0xe4, 0xdd, 0x39, - 0x98, 0xa1, 0x07, 0x08, 0xb3, 0x47, 0x31, 0x47, 0xd5, 0xa4, 0xed, 0x1a, - 0x04, 0xb7, 0x76, 0x65, 0xf8, 0x1f, 0x76, 0x65, 0x76, 0x3f, 0xde, 0x05, - 0x54, 0x20, 0x6c, 0x09, 0xf9, 0x44, 0xd0, 0x85, 0x1c, 0x5b, 0x81, 0xe8, - 0x78, 0x6a, 0x9e, 0x15, 0x0d, 0x6d, 0x4f, 0x07, 0x49, 0x55, 0x15, 0xde, - 0xec, 0x3b, 0x35, 0x2c, 0xd3, 0x73, 0x14, 0xbe, 0x49, 0x2f, 0xc1, 0xb6, - 0x02, 0xc9, 0x4b, 0x39, 0x40, 0xb8, 0x18, 0x3d, 0xc2, 0x3b, 0xba, 0x22, - 0xe8, 0x57, 0x41, 0xd9, 0xe6, 0x1f, 0x45, 0xb4, 0xc1, 0x08, 0xb9, 0xbe, - 0xfd, 0x19, 0xbc, 0x2a, 0x99, 0x17, 0x65, 0xb3, 0x26, 0xd4, 0x8b, 0x41, - 0x03, 0x7b, 0x6f, 0x6a, 0x1d, 0xdb, 0x35, 0x81, 0x50, 0x9a, 0x68, 0xd3, - 0x3c, 0x4a, 0x05, 0x08, 0x08, 0xad, 0x5f, 0x2a, 0x05, 0x8c, 0xed, 0xb1, - 0x35, 0x71, 0x50, 0x0d, 0x10, 0x35, 0x3d, 0xbd, 0x27, 0xcd, 0xee, 0x85, - 0x88, 0xa1, 0xc2, 0xce, 0x56, 0xc8, 0xae, 0xa6, 0x18, 0xde, 0xc4, 0x80, - 0x32, 0x57, 0x57, 0x00, 0x60, 0x56, 0xc3, 0x8d, 0xd7, 0x98, 0xee, 0x9c, - 0xac, 0x37, 0x92, 0x60, 0x32, 0xcd, 0x39, 0x30, 0x1c, 0xc2, 0xe1, 0xcf, - 0x66, 0xce, 0xc2, 0xfc, 0xcc, 0x42, 0x98, 0xf0, 0x2e, 0xbd, 0xd2, 0xec, - 0x26, 0xb8, 0x10, 0xfd, 0x7a, 0x77, 0x83, 0x5d, 0x6c, 0x78, 0x99, 0x9d, - 0x03, 0x1c, 0xbb, 0xdc, 0x96, 0xb3, 0x11, 0xa8, 0x49, 0x09, 0xf2, 0xf9, - 0xe9, 0xee, 0x8e, 0x66, 0xc7, 0xc6, 0xcd, 0x89, 0x29, 0x7e, 0x36, 0xd6, - 0x5a, 0x3b, 0xd0, 0x93, 0xf4, 0xf8, 0x00, 0xf6, 0xf3, 0x0a, 0x2f, 0x34, - 0x16, 0x0b, 0xdd, 0xe0, 0x37, 0x9c, 0x3b, 0xba, 0x31, 0x2f, 0xd0, 0xc2, - 0xda, 0x2d, 0xcc, 0xbf, 0xf4, 0xd9, 0x20, 0xab, 0x11, 0x94, 0x8b, 0x05, - 0xb7, 0xa1, 0xfc, 0x68, 0x51, 0x1d, 0x4d, 0xcd, 0xda, 0xd8, 0x27, 0x5e, - 0xbb, 0x21, 0xe5, 0x5d, 0xb3, 0x74, 0xc3, 0xa1, 0x10, 0xbb, 0x26, 0x78, - 0x43, 0x96, 0xef, 0xab, 0x38, 0xc2, 0x7b, 0x34, 0x49, 0x0e, 0x73, 0x14, - 0x42, 0xf4, 0x2c, 0xa2, 0xe5, 0xdf, 0x58, 0x53, 0xcb, 0x9b, 0xdd, 0x69, - 0xab, 0xeb, 0xb8, 0xfe, 0x6f, 0x89, 0x70, 0x7a, 0x8c, 0x0c, 0x3d, 0xc7, - 0x41, 0xaa, 0x71, 0x93, 0xc5, 0x2d, 0x7e, 0x95, 0xbc, 0x39, 0x44, 0x60, - 0xa5, 0xb4, 0xa8, 0x8d, 0xb0, 0xa8, 0xa8, 0xb3, 0xcf, 0xac, 0x60, 0xec, - 0x40, 0x73, 0x37, 0x52, 0x4b, 0x21, 0x9a, 0x57, 0xb1, 0x07, 0xac, 0xe8, - 0x4f, 0xf3, 0xb1, 0x22, 0x48, 0x99, 0x09, 0xf1, 0xf0, 0x67, 0xf5, 0x33, - 0x26, 0x5d, 0x72, 0x9a, 0xfd, 0x1d, 0x30, 0xb3, 0x53, 0xe0, 0x7e, 0xa3, - 0x36, 0x79, 0x85, 0xa6, 0xe5, 0x90, 0xa9, 0x21, 0xef, 0xe5, 0x44, 0xb9, - 0x24, 0x11, 0x02, 0x0c, 0x06, 0x43, 0x3f, 0x6e, 0x96, 0x44, 0x2b, 0xd6, - 0xa1, 0x7d, 0x21, 0xa1, 0x2a, 0xd1, 0x66, 0x1e, 0x8a, 0x74, 0x07, 0xce, - 0x3c, 0x14, 0xee, 0x64, 0x8f, 0x7a, 0xc4, 0x6f, 0x35, 0xda, 0x0c, 0x7a, - 0xa1, 0xa7, 0x51, 0x71, 0x3a, 0xc3, 0x4d, 0x5c, 0xc2, 0xaa, 0x18, 0x78, - 0xa9, 0x74, 0xf9, 0x5c, 0x48, 0x14, 0x26, 0xba, 0xf5, 0xde, 0x81, 0xff, - 0x3a, 0xfa, 0xf0, 0x70, 0x31, 0x29, 0x8b, 0x85, 0x0d, 0x65, 0x17, 0x3f, - 0xbd, 0x03, 0x79, 0xf2, 0x76, 0xf6, 0x5d, 0x9d, 0x9f, 0x34, 0x99, 0xe9, - 0xeb, 0x35, 0x6d, 0xbe, 0x43, 0xc2, 0x6a, 0x8c, 0xc5, 0xe2, 0x63, 0xec, - 0x0a, 0xa6, 0x96, 0xaf, 0x61, 0xae, 0xe9, 0xcb, 0xe4, 0x0a, 0xe8, 0xd0, - 0xc3, 0xc1, 0xc1, 0x9f, 0x87, 0x0d, 0x3e, 0x5b, 0xee, 0x98, 0xca, 0xf6, - 0xfc, 0xc5, 0x63, 0xe5, 0xc6, 0xa1, 0x0e, 0xe8, 0xf5, 0xe2, 0xcc, 0x7b, - 0x21, 0x30, 0x58, 0xf5, 0xaa, 0x1b, 0x14, 0xfd, 0xbf, 0xf0, 0x81, 0x9c, - 0x4b, 0xcd, 0x89, 0xff, 0x96, 0x31, 0xbe, 0xbd, 0xb5, 0x5a, 0x60, 0x05, - 0x93, 0x24, 0xb3, 0xde, 0x77, 0x70, 0x1f, 0xe3, 0x39, 0x82, 0xb0, 0xfb, - 0xd6, 0x28, 0x13, 0x15, 0x52, 0x78, 0xd9, 0x27, 0x4c, 0x1c, 0x67, 0x3d, - 0x93, 0x1c, 0x7d, 0xa7, 0x01, 0xc2, 0x23, 0xec, 0x94, 0xaa, 0x34, 0xff, - 0xc6, 0xa2, 0xd6, 0xfa, 0xf9, 0xca, 0x3a, 0x69, 0xed, 0x04, 0x9e, 0xac, - 0x18, 0xac, 0xa3, 0x17, 0xb4, 0xfd, 0xd4, 0x68, 0x57, 0x95, 0xd7, 0xba, - 0x3d, 0x02, 0x38, 0x51, 0xab, 0x71, 0xee, 0xdc, 0x97, 0xee, 0x0d, 0xd0, - 0x9a, 0xb8, 0x47, 0x8a, 0x26, 0x95, 0x71, 0xdf, 0x54, 0x5d, 0x7d, 0x89, - 0xa6, 0x07, 0x53, 0xdb, 0x43, 0x7a, 0x58, 0x69, 0xdf, 0x39, 0x31, 0x68, - 0xdf, 0x02, 0x3d, 0xc7, 0x45, 0x5e, 0x1d, 0x97, 0x74, 0xb0, 0x0a, 0xb4, - 0xdc, 0x67, 0x9b, 0x63, 0x91, 0x91, 0xf3, 0xed, 0x5c, 0x8a, 0x70, 0x9b, - 0xa4, 0x47, 0x30, 0x2a, 0x3f, 0x87, 0x8f, 0x6f, 0x42, 0xfc, 0xf6, 0x21, - 0x3d, 0x44, 0x2f, 0x51, 0xec, 0x26, 0xd7, 0x5d, 0x7c, 0x1f, 0xff, 0xa0, - 0x49, 0xa8, 0xa2, 0xa1, 0x0e, 0xda, 0x85, 0x84, 0x22, 0xb2, 0x2b, 0xd2, - 0x34, 0xbc, 0xab, 0xd1, 0x9b, 0x3d, 0x61, 0x64, 0xe3, 0xb9, 0xf1, 0x42, - 0xbc, 0xab, 0x15, 0xf9, 0xcd, 0x5c, 0x99, 0xb2, 0x61, 0x5f, 0x51, 0xc1, - 0xd3, 0x88, 0x2b, 0xcb, 0xe0, 0xf7, 0xea, 0xee, 0x83, 0xa2, 0xf6, 0xa2, - 0x1b, 0x3d, 0x13, 0x77, 0xc6, 0x7b, 0xb0, 0x25, 0xbf, 0xf1, 0x42, 0x20, - 0xb1, 0xfa, 0xc1, 0xbf, 0x09, 0xd2, 0x05, 0xcb, 0x04, 0x3c, 0x03, 0x60, - 0x9d, 0xc3, 0x60, 0x99, 0x9c, 0x3e, 0x30, 0x52, 0xe3, 0xa2, 0x2d, 0x75, - 0x47, 0xb2, 0xe4, 0x4e, 0x33, 0x43, 0x58, 0x89, 0xcd, 0xf8, 0x94, 0x57, - 0xde, 0x81, 0x66, 0x46, 0x6c, 0x3c, 0x10, 0x54, 0x66, 0x82, 0x64, 0x09, - 0x4d, 0xe6, 0xb8, 0x5d, 0x27, 0x20, 0x49, 0x90, 0x3f, 0x54, 0xb6, 0xbc, - 0xaf, 0x37, 0x65, 0x6b, 0x96, 0xf6, 0x7f, 0x77, 0x04, 0xa7, 0xd9, 0x19, - 0x1a, 0x1c, 0xe3, 0x02, 0x68, 0x54, 0x93, 0x26, 0xae, 0xaf, 0x24, 0xff, - 0x73, 0x2a, 0x43, 0x8a, 0xff, 0xad, 0x6d, 0x47, 0xbc, 0xc9, 0x3c, 0x6b, - 0xab, 0x88, 0xa0, 0xd2, 0x26, 0x77, 0x3d, 0xd2, 0xef, 0x8f, 0xcd, 0x6d, - 0x3a, 0x10, 0x63, 0xcc, 0x6b, 0x6f, 0x2b, 0x3f, 0x63, 0x17, 0xa1, 0x0f, - 0xe2, 0x14, 0xdc, 0xf3, 0xb7, 0x5b, 0x12, 0xda, 0xbc, 0x06, 0x6c, 0x32, - 0x9e, 0x7a, 0xda, 0x17, 0x2d, 0x05, 0x2d, 0x6c, 0x9c, 0x32, 0x1c, 0x65, - 0x6e, 0x81, 0xd4, 0x0e, 0x83, 0x34, 0xf0, 0xf8, 0xa7, 0xae, 0x06, 0xc3, - 0x85, 0x3f, 0x3b, 0xec, 0x06, 0xb0, 0xba, 0x0a, 0xfa, 0xcc, 0xfa, 0xd9, - 0xb8, 0x6f, 0xd0, 0x3d, 0xd1, 0xfa, 0x27, 0x51, 0xe6, 0x5d, 0xd7, 0xee, - 0xad, 0xeb, 0x5d, 0x00, 0x7d, 0x48, 0x95, 0xb2, 0x41, 0xc2, 0x8b, 0x0d, - 0xa0, 0xdf, 0x45, 0x58, 0xe8, 0x2a, 0xe5, 0x5d, 0x25, 0x53, 0x87, 0xec, - 0x92, 0x33, 0x96, 0x18, 0x74, 0x22, 0xdf, 0x82, 0x8c, 0x43, 0x2e, 0xaa, - 0xab, 0x1a, 0xe2, 0x5e, 0x7b, 0x15, 0xb0, 0x25, 0x9d, 0x76, 0x90, 0x82, - 0xfb, 0x86, 0x25, 0x5c, 0x06, 0x97, 0x58, 0x3e, 0x1b, 0x53, 0x68, 0x5c, - 0xec, 0xe4, 0x32, 0x28, 0x31, 0x60, 0x80, 0xf9, 0x7c, 0xb8, 0x6c, 0xd0, - 0x22, 0x97, 0xd4, 0xf8, 0x59, 0xd1, 0xe4, 0x03, 0x3a, 0x6c, 0x61, 0xfc, - 0x12, 0x10, 0x5c, 0xb3, 0x14, 0x6d, 0x09, 0x04, 0x07, 0x76, 0x15, 0xa4, - 0xb5, 0x7b, 0x8f, 0xb7, 0x05, 0x00, 0xd9, 0x10, 0xf9, 0x80, 0xb2, 0x0b, - 0x6e, 0xe9, 0xc2, 0x80, 0xc1, 0xd3, 0x8f, 0x73, 0x14, 0xac, 0xb0, 0x6b, - 0x7d, 0x10, 0xe1, 0xdc, 0x89, 0x56, 0xec, 0xed, 0x6a, 0x4d, 0xdc, 0x2f, - 0xd5, 0x71, 0xef, 0xc2, 0x4a, 0x01, 0x09, 0x25, 0x80, 0xf1, 0x9c, 0xd4, - 0xcc, 0x78, 0xb9, 0xd1, 0x94, 0x97, 0x5f, 0x9c, 0xca, 0xbd, 0xa6, 0x89, - 0xab, 0x6f, 0xc7, 0x8b, 0xc5, 0xd7, 0xc8, 0x25, 0x1f, 0x0e, 0x10, 0x13, - 0xee, 0x65, 0x63, 0x38, 0x38, 0x37, 0x40, 0x58, 0x00, 0xef, 0xe2, 0x5f, - 0x7a, 0xcb, 0x51, 0xe8, 0xef, 0x5c, 0x65, 0x56, 0x23, 0x1d, 0x8c, 0x45, - 0xca, 0x36, 0x11, 0xc6, 0x90, 0x84, 0xc9, 0x41, 0xc3, 0x40, 0x1f, 0xb3, - 0x79, 0x48, 0x59, 0x30, 0x87, 0x51, 0x5f, 0x15, 0x9b, 0x39, 0x1d, 0xe4, - 0xed, 0x0a, 0x53, 0xef, 0x81, 0x81, 0x08, 0x10, 0xb6, 0x4b, 0x15, 0xc5, - 0x26, 0x4d, 0xef, 0x8e, 0x82, 0x83, 0x12, 0xb5, 0x7d, 0x7e, 0xe9, 0xc4, - 0xcf, 0x05, 0x91, 0xb4, 0xe0, 0x07, 0x22, 0xed, 0x62, 0x72, 0xd1, 0x40, - 0xe8, 0x3d, 0x07, 0x71, 0x8f, 0x5f, 0xd3, 0xb9, 0x73, 0x92, 0xd9, 0x2c, - 0xc2, 0x1a, 0x03, 0x50, 0x65, 0xd1, 0xe9, 0x1b, 0x1c, 0xbc, 0xe7, 0xb7, - 0x91, 0x21, 0xcc, 0xad, 0xfe, 0x7c, 0xd6, 0x79, 0xc3, 0xf3, 0xf4, 0xe6, - 0x4a, 0x6b, 0xbe, 0x63, 0xfe, 0x52, 0x49, 0x2e, 0x4e, 0x38, 0xb4, 0xa6, - 0xc4, 0x33, 0x4d, 0x5a, 0x05, 0x22, 0x0b, 0xec, 0x58, 0xdf, 0x44, 0xf0, - 0xd6, 0xe7, 0xcf, 0xb6, 0xec, 0x57, 0x86, 0x65, 0x11, 0xe3, 0x14, 0xc1, - 0x8a, 0x5b, 0xc6, 0x0f, 0xd1, 0xb8, 0x62, 0x6b, 0x1e, 0xa0, 0xa7, 0xfa, - 0x35, 0x78, 0x65, 0x8a, 0xf3, 0x21, 0x9f, 0xfd, 0x63, 0x8a, 0x49, 0x35, - 0x64, 0x7e, 0xb8, 0xa8, 0x49, 0xfe, 0x8f, 0xf1, 0x31, 0x68, 0x69, 0xaf, - 0xbe, 0x43, 0x9b, 0xa2, 0x4c, 0xa9, 0x38, 0x0b, 0x31, 0x56, 0xe3, 0x1a, - 0xd7, 0x21, 0x66, 0xc9, 0x4d, 0x41, 0x7e, 0xd7, 0xb8, 0x45, 0x63, 0x2b, - 0xee, 0xe9, 0xa3, 0xa7, 0xae, 0x38, 0x1f, 0xf6, 0x2e, 0x5a, 0x18, 0xdf, - 0xe4, 0x2d, 0x28, 0xa9, 0xd7, 0xa4, 0x67, 0x3e, 0x7e, 0x95, 0x45, 0xc2, - 0x1b, 0xe9, 0xbd, 0xd1, 0xca, 0x47, 0x10, 0x22, 0x42, 0x06, 0xcf, 0x48, - 0xb8, 0xe5, 0x68, 0x8a, 0xe2, 0xd5, 0x28, 0x94, 0xd2, 0x06, 0x78, 0xb0, - 0x0e, 0xdf, 0x16, 0xd3, 0x30, 0xd9, 0x80, 0xa1, 0x02, 0x2d, 0x88, 0x18, - 0x40, 0x78, 0xe5, 0xaf, 0x92, 0xfd, 0x20, 0xd3, 0xfb, 0x18, 0x33, 0xde, - 0xad, 0x61, 0xc5, 0x6e, 0x0d, 0xca, 0x7b, 0x6f, 0x8b, 0x0c, 0x7c, 0x31, - 0xde, 0xbe, 0xa2, 0x65, 0x3a, 0x12, 0x5c, 0xda, 0x08, 0x2f, 0xe6, 0x17, - 0x7f, 0x38, 0x07, 0x7c, 0xa4, 0x78, 0x1e, 0xe4, 0x76, 0x8b, 0x8b, 0xae, - 0x83, 0xbc, 0x2a, 0xe0, 0xd7, 0x99, 0x65, 0xa5, 0x94, 0x12, 0x57, 0x35, - 0xce, 0x87, 0xda, 0xe9, 0x15, 0xd7, 0xc1, 0xe7, 0x84, 0x63, 0xfb, 0x36, - 0x72, 0xc3, 0x9d, 0x77, 0x30, 0xf0, 0x33, 0xde, 0x5f, 0xf3, 0x1c, 0xb7, - 0x7d, 0x83, 0xd9, 0x17, 0xed, 0x9c, 0xd7, 0xd8, 0x36, 0x08, 0x6f, 0xa3, - 0xaa, 0x69, 0xc2, 0xd4, 0x8e, 0xd1, 0xd5, 0xc7, 0x12, 0xb9, 0x3f, 0x0e, - 0xb3, 0x31, 0x35, 0x1f, 0x5c, 0x43, 0xaf, 0x51, 0x1f, 0x82, 0x97, 0xa2, - 0x39, 0xbc, 0x4c, 0x9c, 0x75, 0x63, 0x7e, 0xd6, 0xa3, 0xae, 0xc0, 0xd8, - 0x71, 0xd0, 0x3b, 0x69, 0x4f, 0x52, 0xe8, 0x58, 0xca, 0x7a, 0xca, 0x0b, - 0xf8, 0x0f, 0x48, 0x65, 0x4a, 0xe9, 0x09, 0xab, 0xf1, 0xc8, 0xaf, 0xea, - 0x9f, 0xbb, 0xf7, 0x2f, 0xcc, 0x24, 0xc2, 0x3c, 0xcf, 0x44, 0x51, 0xdb, - 0xa5, 0x56, 0x57, 0x1f, 0x43, 0xa8, 0x53, 0xd7, 0x89, 0x1d, 0xe8, 0xba, - 0x98, 0x6a, 0x0b, 0x42, 0x37, 0xd1, 0xee, 0x6c, 0x71, 0x2f, 0x30, 0x06, - 0x00, 0x25, 0xad, 0x1b, 0x45, 0x3e, 0x5f, 0xe9, 0xc6, 0x87, 0xff, 0x13, - 0x79, 0x66, 0x63, 0x08, 0xe9, 0x30, 0x31, 0xf1, 0x91, 0x23, 0xde, 0x96, - 0x8d, 0x38, 0xbb, 0x09, 0xf5, 0x7f, 0xcf, 0x6e, 0x2a, 0xd8, 0x82, 0x27, - 0x62, 0xb2, 0x58, 0x2e, 0x09, 0x27, 0xe1, 0xc7, 0x74, 0x8c, 0x1b, 0x44, - 0xb2, 0xa1, 0xac, 0x8a, 0xbd, 0x5a, 0xf3, 0xdd, 0x45, 0x99, 0xdf, 0x10, - 0x47, 0xf5, 0xab, 0x44, 0xd9, 0xc1, 0x1d, 0x68, 0xa0, 0x8c, 0x43, 0x87, - 0xac, 0x4c, 0x81, 0x8b, 0xf7, 0x5d, 0x14, 0x57, 0x30, 0x4c, 0x8b, 0x6b, - 0x89, 0x70, 0x49, 0x7f, 0x6d, 0x30, 0xaf, 0x70, 0xd0, 0xa8, 0x19, 0x8d, - 0x85, 0x1e, 0x7f, 0x34, 0xd0, 0xd2, 0x55, 0x58, 0x97, 0x94, 0x40, 0x18, - 0x3a, 0xb6, 0x17, 0x07, 0xbe, 0xe1, 0x86, 0xe5, 0x00, 0x32, 0x2e, 0x21, - 0xf4, 0xe3, 0xba, 0x47, 0xf1, 0xdf, 0x27, 0x56, 0x03, 0xc9, 0x06, 0xe7, - 0xb1, 0x1a, 0x7d, 0x58, 0x1e, 0x07, 0x74, 0xdd, 0x46, 0x53, 0x34, 0x82, - 0x25, 0x90, 0x28, 0x62, 0x29, 0x1f, 0x2a, 0x0c, 0xd6, 0xca, 0x52, 0xc1, - 0x8b, 0x6c, 0x72, 0xfc, 0x4d, 0xe1, 0x73, 0x41, 0xa7, 0xbe, 0xd5, 0x3f, - 0x3c, 0x24, 0xc7, 0xfc, 0xf2, 0x8c, 0x32, 0x5f, 0xdc, 0xdb, 0xa5, 0xfd, - 0xeb, 0x59, 0x97, 0xd4, 0xda, 0xfe, 0x21, 0x37, 0x1e, 0xf7, 0x91, 0xef, - 0x1f, 0xfc, 0x24, 0x71, 0x14, 0xaf, 0x10, 0x50, 0x61, 0xb9, 0xe6, 0x11, - 0x6b, 0x4d, 0x5f, 0x6e, 0x70, 0x68, 0xc6, 0x07, 0x31, 0x20, 0x95, 0x95, - 0x21, 0x29, 0x06, 0xde, 0x12, 0x62, 0xcc, 0xa3, 0x63, 0xee, 0xa6, 0xfb, - 0x35, 0xf8, 0x92, 0x86, 0xdd, 0xed, 0x5a, 0x82, 0x70, 0x78, 0x77, 0x40, - 0x93, 0x03, 0x30, 0x49, 0xda, 0xab, 0x61, 0x86, 0x6e, 0x11, 0x69, 0xed, - 0xe9, 0x2d, 0xbd, 0xbb, 0x46, 0x00, 0x59, 0xb2, 0xdf, 0x3f, 0x27, 0x79, - 0xc5, 0x38, 0xd9, 0x5a, 0x02, 0x2c, 0x49, 0x2d, 0x7e, 0x83, 0x99, 0xd1, - 0xda, 0xeb, 0x70, 0xfc, 0x26, 0x4b, 0x4f, 0x26, 0xcf, 0xad, 0x1b, 0x3c, - 0x9b, 0x30, 0x8b, 0xa1, 0xc6, 0x54, 0xc8, 0xa6, 0x1b, 0xbe, 0x9c, 0xdd, - 0x6e, 0xe5, 0x30, 0xfa, 0xaf, 0x43, 0x33, 0x93, 0xf4, 0x81, 0x77, 0xed, - 0xb1, 0x1a, 0xb1, 0x86, 0xe3, 0x0a, 0xa2, 0xce, 0x52, 0x38, 0x9d, 0x66, - 0x14, 0x35, 0x14, 0xf3, 0x19, 0x17, 0xbb, 0x5e, 0xac, 0x5d, 0x53, 0xf8, - 0xc4, 0xf7, 0xc4, 0xc7, 0x6e, 0xff, 0xab, 0x43, 0xaa, 0x6c, 0x13, 0x48, - 0x32, 0xa0, 0x6e, 0x85, 0x37, 0x6a, 0xe3, 0x5c, 0x60, 0xf7, 0x6d, 0x41, - 0xc9, 0x4c, 0x7c, 0xc6, 0xc3, 0xf6, 0xb5, 0x17, 0xbd, 0xfa, 0xa5, 0xb7, - 0x32, 0xc8, 0xd0, 0x9a, 0xd9, 0x9c, 0xbb, 0x45, 0x19, 0x71, 0x38, 0x2a, - 0xa2, 0xe8, 0xa0, 0x41, 0x12, 0x63, 0x07, 0xdf, 0xc7, 0x27, 0x0e, 0x8d, - 0x0d, 0xeb, 0xab, 0x33, 0x73, 0xd6, 0xc6, 0x3b, 0xcd, 0xe7, 0x6c, 0xbb, - 0x06, 0x6e, 0x1c, 0xc4, 0x4c, 0x57, 0x90, 0x47, 0x63, 0x4d, 0x3b, 0x7e, - 0x48, 0x83, 0x17, 0x8d, 0x59, 0x91, 0x8a, 0x09, 0x5f, 0xb5, 0xae, 0xc7, - 0xad, 0x8f, 0xcc, 0x2f, 0x84, 0xfe, 0xaa, 0x0f, 0x8d, 0x52, 0xcd, 0xc2, - 0x29, 0x79, 0xf2, 0x00, 0xab, 0xae, 0xd2, 0xce, 0x34, 0xf0, 0xab, 0xfd, - 0x58, 0xf7, 0xb3, 0xba, 0xd2, 0x07, 0x45, 0x19, 0x44, 0x7a, 0x9a, 0x3a, - 0x6e, 0x5f, 0x0d, 0x6c, 0x7b, 0x39, 0x94, 0x9f, 0x53, 0x11, 0xb4, 0x36, - 0x80, 0x17, 0x7d, 0xc1, 0x19, 0x6a, 0xa4, 0xb4, 0xfd, 0x6b, 0x22, 0xe8, - 0x9f, 0xbf, 0x06, 0x14, 0xf6, 0x38, 0x5a, 0xe5, 0x06, 0x42, 0x89, 0x82, - 0xb9, 0x1a, 0x45, 0x6a, 0xbc, 0xb0, 0x4b, 0xca, 0x69, 0x0c, 0x5c, 0x5b, - 0x42, 0xb1, 0x4a, 0xdb, 0xcb, 0x4c, 0x73, 0x0e, 0x49, 0x67, 0x3e, 0x40, - 0x80, 0xbe, 0xd0, 0x79, 0x41, 0x80, 0x2b, 0xfb, 0x95, 0xd9, 0xd2, 0x3f, - 0x30, 0xff, 0x2e, 0x83, 0x8d, 0x66, 0xf4, 0xef, 0x86, 0x85, 0x96, 0xba, - 0x7f, 0xc0, 0xb9, 0x48, 0x03, 0x4e, 0x00, 0x6e, 0x2b, 0x23, 0x62, 0x62, - 0xcf, 0x97, 0x7e, 0x70, 0x72, 0x94, 0x91, 0x0e, 0xaa, 0x40, 0xcc, 0x32, - 0x70, 0x5e, 0x79, 0xdf, 0xb3, 0xeb, 0xb1, 0x9c, 0x91, 0x6d, 0xdc, 0x2e, - 0x2b, 0x0d, 0x94, 0x2f, 0x28, 0x50, 0x3a, 0x98, 0xe9, 0xb8, 0x8e, 0xf5, - 0x85, 0x92, 0x00, 0x48, 0x3e, 0x36, 0xe9, 0xf3, 0xe7, 0x27, 0xa9, 0xe8, - 0xed, 0x38, 0x76, 0x06, 0x45, 0x59, 0x59, 0x18, 0xbb, 0x32, 0xd7, 0xda, - 0x17, 0xef, 0x86, 0x52, 0xa2, 0x2b, 0x9a, 0xac, 0x22, 0x3c, 0xc3, 0xcb, - 0xe3, 0x13, 0x7e, 0x5c, 0x99, 0xc1, 0x0c, 0xbb, 0x09, 0x7d, 0x31, 0x1c, - 0x01, 0x53, 0x45, 0xca, 0x66, 0x5a, 0xdf, 0xfe, 0x51, 0x9d, 0x29, 0x56, - 0x59, 0xaa, 0xbe, 0x42, 0xeb, 0xf4, 0xf3, 0x2a, 0xdc, 0xe8, 0xc5, 0xee, - 0x08, 0xdc, 0xd4, 0xfc, 0xd2, 0xa2, 0x88, 0xe7, 0xc8, 0x45, 0xd8, 0x4c, - 0x0f, 0x1a, 0xf6, 0x1f, 0x8c, 0x36, 0x98, 0xa2, 0xae, 0x5e, 0xd2, 0xea, - 0x4f, 0xa0, 0x4b, 0x52, 0xd8, 0x21, 0x6c, 0xae, 0x5e, 0xb5, 0x5f, 0xaa, - 0x3d, 0x53, 0xc8, 0xd2, 0x4c, 0x3c, 0x53, 0xe5, 0x2a, 0xbf, 0x16, 0x74, - 0x8e, 0x43, 0xa7, 0x63, 0x72, 0x3d, 0x5f, 0x49, 0x35, 0x9b, 0xa8, 0xe9, - 0xd4, 0x82, 0x2d, 0x72, 0x19, 0xed, 0x16, 0x51, 0x55, 0xf8, 0x13, 0xca, - 0x2a, 0xef, 0x72, 0x65, 0xf4, 0x49, 0x92, 0x43, 0xb5, 0x53, 0xea, 0x97, - 0xe9, 0x67, 0x6e, 0x56, 0xaf, 0x64, 0x58, 0x26, 0x20, 0xf3, 0x29, 0x64, - 0x6b, 0x67, 0xc2, 0x77, 0x32, 0xaf, 0x8b, 0xfc, 0x55, 0xfd, 0xb6, 0x77, - 0x22, 0xd6, 0x2b, 0xa3, 0xdf, 0xdc, 0xa9, 0x92, 0x19, 0x12, 0x08, 0x50, - 0x5a, 0x2d, 0xc4, 0x82, 0x90, 0xc8, 0xee, 0xd9, 0x20, 0xb0, 0xc5, 0x4d, - 0xf7, 0x04, 0xef, 0xa6, 0xee, 0xcf, 0xc1, 0xcb, 0xe3, 0x13, 0x7e, 0x5c, - 0x0c, 0x6c, 0x02, 0xee, 0xac, 0x61, 0x58, 0x94, 0xa7, 0x7b, 0xbe, 0xcd, - 0x49, 0x60, 0xad, 0x00, 0x68, 0xf2, 0x00, 0xc1, 0xdf, 0x84, 0xd8, 0x93, - 0x44, 0xab, 0xd4, 0xa6, 0x47, 0xf4, 0x17, 0xf6, 0x17, 0xef, 0x86, 0x52, - 0xa2, 0x2b, 0x9a, 0xac, 0xfe, 0x35, 0xc3, 0xcb, 0xe3, 0x13, 0x7e, 0x5c, - 0x40, 0xb1, 0x1f, 0x35, 0x02, 0xe2, 0xb3, 0x8f, 0x56, 0x50, 0xe7, 0x0a, - 0x96, 0x23, 0xe9, 0x20, 0x5e, 0xbb, 0xbe, 0x50, 0x27, 0xb7, 0x02, 0x46, - 0x50, 0x69, 0x9a, 0x09, 0x07, 0x0c, 0xbd, 0x71, 0xf8, 0x03, 0x84, 0x18, - 0x7f, 0x0b, 0xb7, 0x70, 0x37, 0x03, 0xd2, 0x86, 0xc2, 0x7a, 0xfd, 0x9d, - 0xb8, 0x0d, 0x11, 0x9e, 0x1f, 0x88, 0x7b, 0x01, 0xdd, 0xf0, 0x87, 0xcd, - 0x59, 0x09, 0x74, 0xe2, 0x0f, 0x48, 0xca, 0x21, 0x0f, 0xce, 0x58, 0x2a, - 0x73, 0x60, 0x25, 0x4c, 0x51, 0x04, 0xc2, 0xb8, 0xda, 0xa0, 0xfa, 0x4b, - 0xba, 0x9f, 0xa4, 0x8b, 0x9e, 0x32, 0xfe, 0xe0, 0xef, 0xf3, 0xb6, 0xf8, - 0xd7, 0x19, 0xb7, 0x91, 0xdd, 0x6e, 0xc7, 0xe9, 0x6f, 0x0c, 0x31, 0xf2, - 0xf9, 0xc8, 0xdd, 0xa7, 0x08, 0x44, 0x75, 0x25, 0x0e, 0xa7, 0xd8, 0xcb, - 0xfd, 0x5a, 0x9d, 0x39, 0xd9, 0xd1, 0x93, 0x04, 0x36, 0xa2, 0x7d, 0xaa, - 0x1b, 0x2a, 0x89, 0x81, 0x99, 0x5a, 0x99, 0x9c, 0x66, 0x10, 0x95, 0xaf, - 0xff, 0x7a, 0x05, 0x06, 0xbc, 0xb9, 0x05, 0x8e, 0x52, 0x08, 0x42, 0x26, - 0x7f, 0x0d, 0xe4, 0x2b, 0xbc, 0xe0, 0x55, 0x2f, 0xf3, 0x56, 0x38, 0x0d, - 0x29, 0x1a, 0x82, 0xb5, 0x94, 0x67, 0x4b, 0xc4, 0xb4, 0xbe, 0x8d, 0xa3, - 0x05, 0x2b, 0x38, 0x8f, 0xa6, 0x5a, 0xe9, 0x17, 0x03, 0xed, 0x07, 0xd3, - 0xa1, 0x1e, 0x72, 0x6c, 0x4c, 0x04, 0xc1, 0x14, 0xf9, 0x4b, 0x4c, 0x21, - 0xa1, 0xb8, 0x0d, 0x56, 0x09, 0x55, 0x4b, 0x2f, 0xaa, 0xda, 0x54, 0x92, - 0x48, 0xe4, 0xe3, 0x42, 0x4a, 0xef, 0x4c, 0x85, 0xee, 0xf0, 0x02, 0x6c, - 0xe8, 0xcb, 0xae, 0x40, 0x15, 0x5b, 0x43, 0x1a, 0xce, 0x41, 0xf2, 0x40, - 0x71, 0x05, 0x1a, 0x7d, 0x59, 0xf9, 0x38, 0x8b, 0x05, 0xf3, 0x24, 0xf2, - 0x3e, 0x5d, 0xc9, 0x5e, 0x2a, 0x0c, 0x21, 0x03, 0x7e, 0x8a, 0x25, 0x35, - 0x03, 0x62, 0xda, 0xb6, 0x77, 0xae, 0x9a, 0xb0, 0xa8, 0x2c, 0xea, 0x0b, - 0x54, 0x5a, 0x77, 0x87, 0xb8, 0x6a, 0xab, 0x31, 0xe1, 0x34, 0xbc, 0xcb, - 0x5c, 0xff, 0x86, 0x79, 0xd8, 0x1d, 0xb6, 0xa7, 0xdb, 0x8c, 0x48, 0xac, - 0x30, 0xbb, 0x9a, 0x10, 0x98, 0x6b, 0x17, 0xa2, 0x01, 0x43, 0xa0, 0x7e, - 0xa4, 0x79, 0x94, 0x79, 0xd0, 0xb6, 0x1b, 0x26, 0x00, 0xc6, 0xfe, 0xfc, - 0x0c, 0xcc, 0xa1, 0xb2, 0x43, 0x6d, 0x33, 0x58, 0xb3, 0x29, 0x0b, 0x18, - 0x46, 0xe5, 0x44, 0x31, 0xab, 0x41, 0xb1, 0x54, 0xe1, 0xc3, 0xff, 0x1d, - 0xe3, 0x4a, 0xca, 0xa3, 0xe1, 0x43, 0x8c, 0x0f, 0xd3, 0xd3, 0xeb, 0xf3, - 0x82, 0xad, 0x0b, 0xea, 0xf7, 0x1a, 0x30, 0xa4, 0xb1, 0x7e, 0xaf, 0x7d, - 0xa9, 0x1b, 0x80, 0xf7, 0x26, 0x9b, 0x6f, 0x24, 0x5b, 0x15, 0x00, 0xb7, - 0x39, 0x0d, 0x4d, 0x66, 0x0e, 0xb6, 0x44, 0xb1, 0x47, 0x58, 0xda, 0xf1, - 0x67, 0xea, 0x79, 0xbc, 0x68, 0x8c, 0x70, 0x1f, 0x1c, 0xa7, 0xe1, 0x37, - 0xe5, 0x3d, 0x18, 0x2c, 0x35, 0x17, 0xed, 0x33, 0x17, 0x45, 0x24, 0x65, - 0x17, 0xde, 0x38, 0xcc, 0x4b, 0x62, 0x9f, 0x6c, 0x3b, 0x6a, 0xf1, 0x95, - 0x50, 0xd5, 0x03, 0xf5, 0x5e, 0xc3, 0x1f, 0x25, 0xc5, 0x7e, 0x22, 0xfe, - 0x83, 0xb1, 0xda, 0xbf, 0xb0, 0x35, 0x29, 0x93, 0x85, 0x38, 0x3f, 0x3f, - 0xd7, 0x53, 0xcc, 0x40, 0x8c, 0xfd, 0x29, 0x34, 0x2c, 0x9f, 0x2e, 0xa6, - 0xbb, 0xc8, 0x42, 0x49, 0xe3, 0xc4, 0x4f, 0x1d, 0xec, 0xc6, 0xe9, 0x4e, - 0xff, 0x32, 0x86, 0x91, 0xe3, 0xdc, 0xe9, 0x91, 0x8e, 0x80, 0xa5, 0x9d, - 0xbd, 0x71, 0x01, 0xc1, 0x33, 0xef, 0x4e, 0xdb, 0xcc, 0xa6, 0x99, 0x44, - 0xce, 0x4f, 0xf2, 0x6f, 0x43, 0xae, 0xef, 0x51, 0x2c, 0x88, 0xeb, 0xac, - 0x4a, 0x83, 0x12, 0xb3, 0x52, 0x7a, 0x83, 0x87, 0xe0, 0x4d, 0xec, 0x65, - 0xcb, 0x9c, 0xc9, 0xea, 0x2c, 0x1d, 0x08, 0x43, 0xda, 0xea, 0x01, 0x9c, - 0x2e, 0x14, 0x0b, 0xd4, 0x77, 0xb6, 0xd1, 0x8b, 0x2b, 0xa8, 0xd7, 0xcc, - 0x54, 0xda, 0xe6, 0x75, 0x96, 0x5f, 0x91, 0x44, 0x0d, 0xc8, 0x2f, 0x30, - 0x4b, 0x86, 0xc9, 0x59, 0x8d, 0xf6, 0xa4, 0x31, 0x67, 0xc7, 0x7b, 0x94, - 0x11, 0xbf, 0x51, 0x71, 0x08, 0x7a, 0x81, 0xb8, 0x67, 0xe7, 0xd3, 0x1e, - 0xb4, 0x36, 0x40, 0xac, 0xd8, 0xb3, 0x11, 0x03, 0x1e, 0xfa, 0x80, 0x6d, - 0x53, 0xad, 0x55, 0xda, 0x0c, 0x5e, 0x67, 0x35, 0x62, 0xce, 0x23, 0x99, - 0xeb, 0x0b, 0xe7, 0x9f, 0x24, 0x36, 0x62, 0x54, 0xc1, 0x06, 0xe6, 0x96, - 0x88, 0xfd, 0xe4, 0x49, 0xd5, 0xab, 0x7d, 0xc1, 0x89, 0x8d, 0xcc, 0x09, - 0x5f, 0xd9, 0x9c, 0x6f, 0x0a, 0x2e, 0x71, 0x0b, 0x17, 0x20, 0x3f, 0xd6, - 0xaa, 0xe6, 0x55, 0xe8, 0x04, 0x6f, 0x98, 0xe8, 0xea, 0xf7, 0xbd, 0x91, - 0x31, 0x5c, 0x5f, 0x32, 0x22, 0x55, 0x31, 0x9d, 0x8b, 0x71, 0xe8, 0xd6, - 0x4f, 0xf7, 0x7d, 0x28, 0x98, 0xd2, 0x42, 0x9d, 0x37, 0x67, 0xa1, 0x28, - 0xea, 0x3d, 0x6a, 0xec, 0xa4, 0xd0, 0xe4, 0x35, 0x5f, 0x52, 0x63, 0x65, - 0xb2, 0xcb, 0x8d, 0x1c, 0x51, 0x8d, 0xf1, 0x7f, 0xad, 0x54, 0x87, 0x49, - 0x19, 0x8f, 0x40, 0xbe, 0xb3, 0xda, 0x38, 0x58, 0xb1, 0x63, 0x97, 0x22, - 0x2b, 0x7f, 0xb4, 0xd4, 0x23, 0xc3, 0xaa, 0xcf, 0x3a, 0x5a, 0xfe, 0xea, - 0x26, 0xcb, 0x4f, 0xc6, 0x10, 0xbe, 0xa5, 0x7a, 0x87, 0x4d, 0xe8, 0xe7, - 0x2d, 0x49, 0x63, 0x27, 0xf9, 0xbb, 0x9f, 0xc1, 0x72, 0x3d, 0x12, 0x39, - 0xbb, 0x84, 0x09, 0xf2, 0x6b, 0xc7, 0x7a, 0x27, 0x3f, 0x34, 0xee, 0x9d, - 0xcc, 0x27, 0x5d, 0xd1, 0x87, 0x23, 0xda, 0x81, 0x86, 0xcb, 0x82, 0xb5, - 0x57, 0x4e, 0x95, 0x49, 0x27, 0x41, 0xec, 0x91, 0xb3, 0x1d, 0x6a, 0x9b, - 0xc6, 0x20, 0xfb, 0x45, 0x46, 0x35, 0x71, 0x71, 0x05, 0xbf, 0x2e, 0x15, - 0x86, 0x9a, 0x59, 0x6d, 0x46, 0xf5, 0xc1, 0x5b, 0xca, 0xf1, 0x43, 0x42, - 0x36, 0xf0, 0x8f, 0x5a, 0xae, 0xf6, 0x37, 0xa4, 0x43, 0xa4, 0xe8, 0x0a, - 0xfd, 0xce, 0xf4, 0x23, 0xab, 0x33, 0x24, 0xc1, 0x56, 0xfd, 0x34, 0x15, - 0x86, 0x52, 0xdc, 0x32, 0x27, 0xc0, 0x2b, 0x90, 0x5d, 0x85, 0xee, 0x52, - 0x4a, 0xdd, 0x83, 0xea, 0xed, 0xdc, 0x25, 0x9e, 0x8f, 0x63, 0x3c, 0x01, - 0xd2, 0xbf, 0x36, 0x1d, 0x99, 0xf2, 0xec, 0xfa, 0x77, 0x10, 0xeb, 0x7e, - 0xea, 0x37, 0x20, 0xf0, 0x5d, 0x03, 0x29, 0xe3, 0xee, 0x4d, 0x96, 0x1a, - 0xc6, 0xad, 0x91, 0x3f, 0x6b, 0x28, 0x53, 0x01, 0x25, 0x9e, 0x41, 0x6c, - 0xb6, 0x97, 0xe6, 0x5f, 0xb3, 0x4e, 0x87, 0xa3, 0xe3, 0x6e, 0xcf, 0x23, - 0xdd, 0x79, 0x8f, 0xd8, 0x29, 0xa9, 0x3e, 0xa2, 0xca, 0x6d, 0x6a, 0xbc, - 0x96, 0x77, 0x25, 0x91, 0x21, 0xbe, 0x1d, 0x30, 0x3b, 0x17, 0x8c, 0x6a, - 0xb5, 0xee, 0x62, 0x73, 0x5d, 0x3c, 0x23, 0x8f, 0x02, 0xe5, 0x92, 0x78, - 0x8a, 0x55, 0x5c, 0xee, 0x4e, 0xfa, 0xe9, 0x46, 0x40, 0xe0, 0xd7, 0xfa, - 0x5f, 0xc2, 0x22, 0x1f, 0x02, 0x3e, 0x8c, 0x8a, 0x49, 0x8d, 0x7f, 0x8a, - 0xfc, 0xad, 0xef, 0x99, 0xa3, 0x3e, 0xdc, 0x54, 0x50, 0x65, 0xfd, 0xbc, - 0x51, 0x91, 0x47, 0x7c, 0xfe, 0xe1, 0xfd, 0x51, 0x20, 0xaa, 0x11, 0xfd, - 0x77, 0x10, 0x32, 0x08, 0xf6, 0x1c, 0x69, 0x3c, 0x03, 0x57, 0x56, 0xa9, - 0xe4, 0x65, 0x8c, 0x8f, 0x7d, 0x5a, 0x86, 0x56, 0x7c, 0xbf, 0x9c, 0x52, - 0xbd, 0x65, 0xcb, 0xaa, 0xe4, 0x7f, 0xa7, 0x3a, 0xde, 0x8d, 0x26, 0x7e, - 0xe4, 0xf4, 0xa8, 0xc0, 0x69, 0x30, 0x57, 0x0f, 0x4c, 0x68, 0x93, 0x12, - 0x23, 0x6a, 0x2a, 0x98, 0x18, 0xc8, 0xd0, 0xd1, 0xce, 0x75, 0x7d, 0xae, - 0xbc, 0x4d, 0x15, 0xa6, 0x34, 0x04, 0x1e, 0x1f, 0x3d, 0x52, 0x47, 0x89, - 0x05, 0xfc, 0x33, 0x96, 0x7b, 0x9b, 0x41, 0x81, 0xeb, 0xae, 0x8e, 0x89, - 0x36, 0x9d, 0x64, 0xdc, 0xa0, 0xc5, 0x07, 0xde, 0xec, 0x9a, 0x54, 0x2b, - 0x6b, 0xa3, 0x78, 0x68, 0x6d, 0xca, 0xb6, 0x2e, 0x6f, 0x6f, 0xe6, 0xda, - 0xc6, 0xfd, 0xa2, 0x90, 0x15, 0xb0, 0x2c, 0xd1, 0x21, 0x4e, 0xa3, 0x44, - 0x08, 0x13, 0x34, 0x17, 0xc0, 0xe9, 0x67, 0x0d, 0x71, 0x07, 0xee, 0x0e, - 0x39, 0x15, 0xbc, 0xd5, 0xe3, 0xee, 0x95, 0xfd, 0xcf, 0xa5, 0xa7, 0xbe, - 0x4a, 0x6a, 0xa3, 0x66, 0xf3, 0xf4, 0xe9, 0xde, 0xb7, 0x08, 0x4f, 0xa0, - 0xe4, 0x85, 0xa5, 0x49, 0xc9, 0xe6, 0x37, 0xbc, 0x8c, 0x2d, 0x74, 0x87, - 0x4f, 0x6f, 0x12, 0xc5, 0x41, 0x58, 0x47, 0x1c, 0x0f, 0xcc, 0x51, 0x83, - 0xd8, 0xec, 0x01, 0x87, 0x7f, 0x8e, 0xb0, 0xb4, 0xd1, 0xd1, 0x5f, 0x5f, - 0x9b, 0xdd, 0xae, 0x2e, 0x5b, 0x8d, 0x26, 0x80, 0x9a, 0xb0, 0x45, 0xab, - 0xf7, 0x35, 0x21, 0xa5, 0x5d, 0xff, 0x17, 0xc3, 0x8c, 0x70, 0xec, 0xbc, - 0x4f, 0x96, 0x38, 0x1e, 0x46, 0xd4, 0xd3, 0x9c, 0x7c, 0xab, 0x25, 0x8e, - 0x39, 0x05, 0xa3, 0x77, 0xe3, 0x84, 0x96, 0x74, 0x4f, 0xae, 0x6c, 0xb7, - 0x0e, 0x8e, 0xad, 0x04, 0x39, 0x08, 0xea, 0x1e, 0x37, 0xd5, 0x33, 0x3b, - 0xbf, 0xed, 0x74, 0x26, 0x3e, 0x5c, 0xab, 0xe6, 0x82, 0x3d, 0xcd, 0xf7, - 0xa2, 0x84, 0x65, 0xbd, 0x41, 0x0e, 0x46, 0x21, 0x8d, 0xfe, 0xd7, 0x86, - 0xc9, 0xb5, 0x62, 0xcf, 0xd0, 0xdb, 0x98, 0x71, 0x9d, 0xbd, 0x12, 0x9c, - 0x54, 0xe6, 0x78, 0xa4, 0x00, 0xa1, 0x43, 0x5f, 0xcd, 0xd0, 0xc9, 0x74, - 0xef, 0xc6, 0xf8, 0xbb, 0x02, 0x77, 0xda, 0xfe, 0x26, 0xe2, 0xcb, 0x0d, - 0xd3, 0x8f, 0xd0, 0x29, 0x07, 0x2b, 0x2d, 0x28, 0xac, 0xd1, 0x17, 0x83, - 0x35, 0xd7, 0x73, 0xd5, 0x19, 0x1c, 0x7e, 0xf1, 0x2d, 0xc1, 0xb5, 0x13, - 0xb7, 0xb0, 0xd6, 0x24, 0x99, 0x49, 0xee, 0xcb, 0x9d, 0xa1, 0x6d, 0x3f, - 0x1b, 0x3f, 0xdb, 0x70, 0x89, 0xb7, 0xdf, 0xb2, 0x0f, 0x64, 0x89, 0xb0, - 0xc0, 0x12, 0x49, 0x38, 0x09, 0xdd, 0x19, 0x3c, 0xcb, 0x30, 0xd7, 0xf3, - 0xe7, 0x4c, 0x6a, 0xa7, 0x05, 0x33, 0x35, 0x81, 0x16, 0x50, 0x68, 0xbe, - 0x17, 0x52, 0xcb, 0x64, 0x37, 0x00, 0x7d, 0xcd, 0xa4, 0xae, 0x57, 0x34, - 0x6d, 0xe0, 0x7d, 0x69, 0xb3, 0x13, 0x5c, 0xbb, 0x1c, 0x30, 0x2d, 0xaa, - 0x5a, 0x76, 0xe6, 0xd0, 0x7a, 0x0b, 0x4d, 0xe3, 0x01, 0xe6, 0x38, 0x15, - 0xc7, 0xb2, 0x30, 0xbb, 0xc4, 0xef, 0xa3, 0x0e, 0x57, 0x42, 0x56, 0x23, - 0x0a, 0x80, 0x92, 0x3a, 0xfa, 0xe4, 0xbb, 0x51, 0xfa, 0x57, 0x98, 0x06, - 0xbb, 0x6f, 0x05, 0xac, 0xbf, 0x3c, 0xef, 0x43, 0x71, 0x37, 0x22, 0x95, - 0x58, 0xb2, 0x22, 0x85, 0x16, 0x03, 0x7c, 0x05, 0x02, 0xa2, 0x74, 0xdd, - 0x11, 0x50, 0x42, 0xfd, 0x56, 0xe1, 0xc5, 0xe8, 0xfc, 0x21, 0xe2, 0xde, - 0x63, 0xa2, 0xe3, 0x26, 0x86, 0x22, 0xd0, 0xdb, 0x31, 0x51, 0x85, 0xfb, - 0xbc, 0x23, 0xa6, 0xcf, 0xb1, 0x3e, 0xb0, 0xcb, 0xa6, 0xb3, 0x7a, 0x40, - 0x93, 0x73, 0x7a, 0x6a, 0xd5, 0xf1, 0x5b, 0x3b, 0xe3, 0xf3, 0xe1, 0x70, - 0x01, 0x6f, 0xc3, 0xbb, 0x5e, 0xe2, 0x68, 0xf4, 0xda, 0x12, 0x41, 0xae, - 0x9e, 0xb1, 0x9d, 0x8d, 0x98, 0x9e, 0x50, 0xb1, 0x50, 0x96, 0x37, 0xb7, - 0x40, 0xed, 0xcf, 0x97, 0x12, 0xa9, 0xc0, 0x55, 0x6f, 0x87, 0x50, 0xd1, - 0x37, 0x80, 0x61, 0x89, 0xbc, 0x01, 0x2e, 0x80, 0xb4, 0xc7, 0xd8, 0xa8, - 0x41, 0xc5, 0x69, 0xd2, 0xb3, 0x1b, 0xee, 0xae, 0x8d, 0x92, 0xe3, 0xc6, - 0xbe, 0x78, 0x12, 0x9a, 0x10, 0x49, 0xfb, 0xaf, 0x5a, 0xec, 0x87, 0x83, - 0xca, 0x56, 0x4c, 0x09, 0xfe, 0xe5, 0x29, 0x9a, 0x0f, 0x21, 0x9b, 0x1f, - 0x84, 0xa0, 0x84, 0x5d, 0x8b, 0x55, 0xb3, 0x8b, 0x92, 0xa3, 0x53, 0xe4, - 0xbd, 0x2a, 0x6d, 0xe5, 0x5b, 0xd9, 0x63, 0x0b, 0xe4, 0xff, 0xc8, 0x53, - 0xa0, 0x7c, 0xfb, 0xeb, 0x93, 0x81, 0x25, 0x3a, 0x1b, 0x68, 0x67, 0xd2, - 0x84, 0x1c, 0xa6, 0xcf, 0xb1, 0x3e, 0xb0, 0xcb, 0xa6, 0xb3, 0x7a, 0x40, - 0x93, 0x73, 0x7a, 0x6a, 0x74, 0xaa, 0x33, 0xba, 0x6a, 0x72, 0x88, 0x28, - 0x6c, 0xe5, 0xb6, 0xc4, 0x6e, 0x8c, 0x74, 0x39, 0xdf, 0xa6, 0xda, 0xde, - 0xdf, 0xd5, 0xaa, 0x9a, 0xd5, 0x10, 0xb4, 0xc0, 0x86, 0x41, 0xf2, 0x40, - 0xb0, 0xf1, 0xfb, 0xe0, 0xc5, 0x64, 0xf4, 0xff, 0x5c, 0xa9, 0x94, 0xcb, - 0xd1, 0xda, 0xa8, 0x01, 0xb1, 0x73, 0x40, 0x99, 0x33, 0x0b, 0x3b, 0x4d, - 0x64, 0x72, 0x97, 0x75, 0x18, 0x93, 0x6e, 0x2d, 0x6b, 0xc5, 0xa2, 0x2f, - 0x50, 0x0a, 0xff, 0x78, 0x43, 0x93, 0x7f, 0x94, 0x75, 0x9b, 0x45, 0x21, - 0xe5, 0xcd, 0x19, 0xf4, 0x57, 0x86, 0x1c, 0xa7, 0xfd, 0x4a, 0xe3, 0x0c, - 0x51, 0x5f, 0xe4, 0xb9, 0x8f, 0x6c, 0x03, 0x82, 0xc4, 0xc9, 0xb9, 0xd3, - 0x42, 0x0b, 0x28, 0x40, 0xdf, 0xc9, 0x1d, 0x38, 0xa2, 0xa9, 0x96, 0xc5, - 0x28, 0xc0, 0x39, 0xb4, 0x03, 0xce, 0x79, 0xe3, 0x93, 0x9d, 0x91, 0xbb, - 0x2d, 0x85, 0x9a, 0xa3, 0x50, 0x95, 0xc4, 0x47, 0xcf, 0xe0, 0xb6, 0xae, - 0x5a, 0x8d, 0x78, 0x4c, 0xd3, 0x4a, 0xac, 0x0d, 0x71, 0xe3, 0x2d, 0xda, - 0x89, 0x81, 0x70, 0x6f, 0x9a, 0x7b, 0x45, 0xcd, 0xa4, 0x9c, 0x2c, 0xbb, - 0xcc, 0x15, 0xc6, 0x57, 0x16, 0xe2, 0x49, 0x6d, 0xf8, 0xe8, 0xc7, 0xfa, - 0x46, 0x43, 0x46, 0x86, 0x13, 0x02, 0xaf, 0x0e, 0x81, 0xdc, 0xe5, 0x81, - 0x24, 0x0d, 0xe9, 0x3b, 0x51, 0x61, 0x31, 0x06, 0x58, 0xc8, 0x18, 0xe7, - 0x98, 0x82, 0x68, 0xdf, 0xc8, 0xa2, 0x30, 0xab, 0x02, 0x6f, 0xa1, 0x3b, - 0x99, 0x2f, 0xb6, 0xc9, 0x72, 0x6c, 0x20, 0xfe, 0x1c, 0xec, 0x97, 0x70, - 0x70, 0xa9, 0x45, 0x9f, 0x18, 0xa5, 0x8a, 0xc6, 0x40, 0x87, 0xc2, 0x7f, - 0x9a, 0x4a, 0x94, 0xea, 0x10, 0x17, 0xd7, 0xf1, 0xe0, 0xb9, 0xd6, 0x6d, - 0xb8, 0xd7, 0x7b, 0xd4, 0x81, 0xde, 0xa9, 0xab, 0xd2, 0x52, 0x42, 0xe3, - 0xd6, 0xbf, 0xd9, 0xc1, 0x7f, 0x2d, 0x00, 0x36, 0xe2, 0xb1, 0x9c, 0xae, - 0xab, 0xcd, 0xa1, 0xcc, 0xa5, 0x85, 0x78, 0x93, 0x9e, 0xd0, 0xb4, 0xde, - 0xac, 0x5f, 0x5d, 0x9c, 0x32, 0xae, 0x2b, 0xba, 0xa1, 0x03, 0xc5, 0xf8, - 0x71, 0x11, 0x81, 0x67, 0x3b, 0x0f, 0x42, 0x34, 0x86, 0xee, 0xa3, 0x1a, - 0x33, 0x28, 0x89, 0x2d, 0x2c, 0x7e, 0x4a, 0x01, 0xf4, 0x75, 0x5b, 0x09, - 0x40, 0x0f, 0xc0, 0xf9, 0x49, 0x50, 0x1a, 0x72, 0xe6, 0xa0, 0x85, 0x32, - 0xfe, 0xd1, 0x07, 0xb8, 0xc9, 0x07, 0x68, 0xed, 0xc4, 0xbc, 0xf5, 0x6c, - 0xda, 0xd5, 0xc4, 0xbd, 0xbf, 0x59, 0x79, 0xea, 0x37, 0xc4, 0xd6, 0xf2, - 0x4b, 0x4a, 0x89, 0xed, 0x33, 0xa4, 0x43, 0xd7, 0x9d, 0xb9, 0x63, 0x36, - 0x12, 0x39, 0x8b, 0x9e, 0x6a, 0xee, 0x95, 0x35, 0xde, 0x57, 0xf5, 0xb1, - 0x92, 0x30, 0x18, 0xaa, 0xee, 0x85, 0xb3, 0xe0, 0x73, 0x8d, 0xcf, 0xf8, - 0x8d, 0xe1, 0x89, 0xc1, 0xa6, 0xbb, 0xfb, 0x52, 0x71, 0x73, 0x19, 0x82, - 0xa8, 0x31, 0x82, 0xdb, 0x3b, 0xde, 0x12, 0xd6, 0x04, 0x68, 0x27, 0xbc, - 0xf3, 0x5d, 0x7a, 0x50, 0xb4, 0xfc, 0x80, 0xb2, 0x38, 0xeb, 0xef, 0x22, - 0x8d, 0xac, 0x14, 0x71, 0xe7, 0x13, 0x7f, 0x89, 0xfd, 0x08, 0x4f, 0x3f, - 0xc0, 0xf4, 0xc7, 0x47, 0x12, 0xaf, 0x34, 0x88, 0x70, 0x85, 0xe4, 0xd8, - 0xa3, 0x4a, 0x95, 0x73, 0x6f, 0xec, 0x1b, 0x53, 0x9a, 0x6f, 0x59, 0x08, - 0xb7, 0x93, 0x63, 0x27, 0xe8, 0xaa, 0x97, 0xf8, 0xaa, 0xe7, 0xe5, 0x85, - 0x15, 0x42, 0xb3, 0xf7, 0x7e, 0x5d, 0xaa, 0xeb, 0x99, 0x48, 0xb3, 0xd8, - 0xff, 0x41, 0x1e, 0xcf, 0xbb, 0xd7, 0x49, 0x73, 0x2d, 0x3b, 0x06, 0x25, - 0x88, 0x74, 0xf9, 0xe5, 0x23, 0xe7, 0xf9, 0x47, 0x2b, 0x05, 0x52, 0x2b, - 0x3f, 0xcc, 0x62, 0xe5, 0x87, 0xd9, 0x38, 0x6b, 0x2f, 0x68, 0x0c, 0x83, - 0x55, 0x9e, 0x16, 0x0e, 0xf5, 0xf7, 0x35, 0x56, 0xae, 0x81, 0xf5, 0xd2, - 0xe8, 0x41, 0x85, 0x05, 0x27, 0x30, 0x1a, 0xd5, 0x78, 0xeb, 0xba, 0xea, - 0x38, 0x35, 0xd2, 0xc6, 0x04, 0x12, 0xdc, 0x1e, 0x47, 0xf9, 0x4c, 0x19, - 0x7a, 0x4f, 0xcb, 0xde, 0x6e, 0xf7, 0xf2, 0x56, 0x14, 0xf1, 0x61, 0xf9, - 0x8c, 0xea, 0xc6, 0xd2, 0x82, 0xcc, 0x01, 0xaa, 0xda, 0xfd, 0x6e, 0x90, - 0x2c, 0xd1, 0x6f, 0x6b, 0xae, 0x9d, 0xdc, 0x44, 0xcd, 0xe0, 0xd9, 0xf3, - 0x4b, 0x28, 0xff, 0x63, 0x74, 0x20, 0x36, 0x32, 0x7f, 0xaf, 0x45, 0xb2, - 0x19, 0xd1, 0xbb, 0xd2, 0xc4, 0x23, 0x88, 0x61, 0x51, 0xf2, 0xb4, 0xbe, - 0xcc, 0x18, 0x00, 0x6c, 0x00, 0x33, 0xd4, 0x9d, 0x17, 0x8d, 0x9a, 0x43, - 0x8c, 0x1d, 0x34, 0xc3, 0xad, 0xd5, 0x4d, 0x47, 0x21, 0xfe, 0x2d, 0x32, - 0xa7, 0xf9, 0xd6, 0x21, 0xf0, 0x1c, 0x72, 0x1e, 0x90, 0x28, 0x29, 0x57, - 0xe8, 0xca, 0x43, 0x6c, 0x61, 0x41, 0x16, 0xdf, 0x3a, 0x37, 0x4b, 0xd8, - 0xa4, 0x60, 0xde, 0x13, 0x61, 0xdd, 0xd6, 0x39, 0x4f, 0xce, 0xe4, 0x78, - 0xc3, 0x68, 0x18, 0x3f, 0xd6, 0x9a, 0xe5, 0x33, 0x24, 0x5b, 0xff, 0x29, - 0x41, 0x36, 0xf8, 0x95, 0xb5, 0x1e, 0x0f, 0x79, 0x52, 0xaa, 0xc5, 0x40, - 0xed, 0xec, 0x2a, 0xe8, 0x11, 0x5d, 0x84, 0xd1, 0x00, 0x99, 0xae, 0x06, - 0xd8, 0x02, 0xf1, 0xe7, 0x30, 0x25, 0x4e, 0x1c, 0xfe, 0x0a, 0x13, 0x21, - 0x6a, 0x02, 0xbc, 0x4e, 0x7b, 0x7d, 0x86, 0xb8, 0x0e, 0x08, 0x0c, 0xbb, - 0x19, 0xd6, 0xae, 0xf8, 0x73, 0xe5, 0xdc, 0x73, 0xb3, 0x31, 0x5e, 0xb2, - 0xce, 0xe3, 0x27, 0x4f, 0x49, 0xc9, 0x72, 0xfe, 0xfd, 0x82, 0xc6, 0xf2, - 0xd1, 0xbc, 0x34, 0x47, 0x98, 0x8e, 0x95, 0x31, 0xce, 0x88, 0x72, 0xc3, - 0x5a, 0xaf, 0x87, 0x2a, 0x82, 0xe0, 0xea, 0xe4, 0xf6, 0x1a, 0x7b, 0xf9, - 0xeb, 0x68, 0x92, 0x27, 0x0c, 0x83, 0x9c, 0x8f, 0x15, 0xfa, 0x34, 0x99, - 0xed, 0x3e, 0xe3, 0x1e, 0x77, 0x5e, 0x12, 0x8d, 0x70, 0xb4, 0x59, 0x26, - 0x15, 0xa1, 0xd8, 0xa3, 0x0f, 0x4c, 0x87, 0xae, 0x82, 0x0f, 0x12, 0x52, - 0x82, 0x60, 0xdd, 0xf4, 0x06, 0x66, 0x1b, 0x38, 0xa6, 0xfc, 0xff, 0xd8, - 0x9b, 0x33, 0x23, 0x62, 0x03, 0x6e, 0x8f, 0xd1, 0x43, 0x1b, 0x6a, 0x72, - 0x40, 0x54, 0xb1, 0x16, 0x5e, 0xd2, 0xdc, 0xc4, 0xf1, 0xe0, 0x10, 0x8f, - 0xd1, 0x28, 0xb7, 0x32, 0x1f, 0x9e, 0x9d, 0xe9, 0x3b, 0xfe, 0x53, 0x9e, - 0xac, 0x57, 0x8f, 0xa1, 0x74, 0x44, 0x6e, 0xe3, 0x69, 0xed, 0xe2, 0xcb, - 0x6c, 0xe7, 0x9b, 0xf1, 0x1a, 0xa4, 0x74, 0xba, 0x9a, 0xa9, 0x9c, 0x7a, - 0x5f, 0x1f, 0xff, 0x8c, 0xf8, 0x41, 0x47, 0x6d, 0xf9, 0x4e, 0xcf, 0xb3, - 0xa9, 0xc3, 0x1e, 0xe2, 0xd8, 0xc4, 0xf8, 0xf2, 0xc9, 0x1e, 0x9a, 0x67, - 0xc7, 0x9d, 0xb8, 0x14, 0x22, 0x6f, 0xed, 0x05, 0x82, 0x3e, 0x52, 0x63, - 0x82, 0xed, 0xe9, 0x20, 0x1a, 0xac, 0x16, 0x74, 0x83, 0xc8, 0xc6, 0xda, - 0x64, 0x5f, 0x1d, 0x8f, 0x42, 0xce, 0x18, 0x63, 0x7d, 0x1e, 0x05, 0xdb, - 0xb5, 0xc9, 0x46, 0x3d, 0xff, 0xf6, 0x45, 0x81, 0x74, 0xfc, 0xfe, 0x6c, - 0x64, 0x0a, 0x99, 0xe5, 0x56, 0x4c, 0x4e, 0xea, 0x81, 0x51, 0x20, 0x6f, - 0x4d, 0x0b, 0x4a, 0x07, 0x6e, 0xb7, 0x6e, 0xd3, 0xd5, 0x84, 0x05, 0x5b, - 0xc8, 0x61, 0x86, 0x02, 0x06, 0x8b, 0x32, 0x8a, 0xb9, 0xdf, 0x3a, 0x2f, - 0xb8, 0x0d, 0x79, 0x31, 0xe9, 0x90, 0x6c, 0x8f, 0x0c, 0x05, 0xae, 0x28, - 0x92, 0xd9, 0x12, 0xb6, 0xfe, 0xbc, 0x88, 0x1a, 0xe9, 0x21, 0x7d, 0x62, - 0xd4, 0xd2, 0xc6, 0x21, 0x73, 0xeb, 0x1a, 0x77, 0x83, 0xc8, 0xc6, 0xda, - 0x2d, 0xbf, 0x85, 0xb0, 0xdc, 0x73, 0x78, 0x12, 0xf9, 0x7c, 0xe9, 0xb7, - 0x83, 0x84, 0x5d, 0xd2, 0x78, 0x0a, 0xea, 0x98, 0x7e, 0xd7, 0xe8, 0xa6, - 0x25, 0x92, 0x27, 0xfc, 0xfa, 0x6c, 0x3e, 0x55, 0xe5, 0xe3, 0xd6, 0x4b, - 0xe5, 0x1e, 0x07, 0x4a, 0xd3, 0xc5, 0x85, 0xc2, 0x09, 0x0c, 0xb0, 0xb9, - 0x79, 0x64, 0xaa, 0x0c, 0x69, 0x0b, 0xf6, 0xbe, 0x62, 0xf6, 0xfd, 0xd1, - 0xe2, 0x15, 0x75, 0x7d, 0x49, 0x66, 0x62, 0x0f, 0x91, 0x3c, 0xeb, 0x46, - 0x82, 0x87, 0x15, 0xfa, 0x12, 0xf5, 0x3e, 0xbc, 0x39, 0xaf, 0x28, 0x80, - 0x22, 0xb2, 0x13, 0x7a, 0x7f, 0x70, 0x9b, 0xb1, 0xeb, 0x0e, 0x22, 0x87, - 0xf1, 0x9f, 0x98, 0xb7, 0xdc, 0x73, 0x78, 0x12, 0xf9, 0x7c, 0xe9, 0xb7, - 0x83, 0x84, 0x5d, 0xd2, 0x75, 0x89, 0x48, 0x67, 0xf9, 0x58, 0xea, 0x23, - 0x32, 0x79, 0xb4, 0x0d, 0x1a, 0x54, 0x16, 0xa5, 0x88, 0x7c, 0x21, 0xcb, - 0xcd, 0xba, 0x83, 0xbb, 0xec, 0x8e, 0xf6, 0x46, 0xa1, 0x6c, 0xe4, 0x2f, - 0x65, 0xc6, 0xbb, 0xd9, 0x4d, 0x7a, 0xc5, 0x56, 0x19, 0xf0, 0xa3, 0x07, - 0x4d, 0x2a, 0x32, 0x2a, 0x8a, 0x96, 0x86, 0x35, 0xdc, 0xaf, 0x9d, 0x76, - 0x96, 0x87, 0x21, 0xae, 0x48, 0x96, 0x95, 0x67, 0x64, 0x27, 0x11, 0xa5, - 0x88, 0x74, 0x87, 0xe2, 0x99, 0x31, 0xfc, 0x13, 0x92, 0x4c, 0x1a, 0xea, - 0x3a, 0xb7, 0x6f, 0xbf, 0xa0, 0x6d, 0x9d, 0xc9, 0xe2, 0x6c, 0x93, 0x5a, - 0x14, 0x60, 0x87, 0xbe, 0x37, 0x0d, 0x25, 0x7e, 0x76, 0x51, 0x22, 0xdb, - 0x59, 0x03, 0x49, 0x7e, 0xe7, 0x75, 0xc1, 0x58, 0xfc, 0xdd, 0x64, 0x5b, - 0x1b, 0x8d, 0x04, 0x47, 0xae, 0x1a, 0xd0, 0xbb, 0xe6, 0xd4, 0x56, 0x5e, - 0xa3, 0x62, 0x9d, 0x22, 0xeb, 0x4c, 0x88, 0x5a, 0xd6, 0x17, 0x66, 0x3b, - 0xe7, 0x5e, 0x49, 0xe5, 0xbc, 0x8d, 0x86, 0x84, 0xad, 0x23, 0xcd, 0xac, - 0x30, 0xda, 0xbc, 0xd8, 0x45, 0x2d, 0x82, 0x05, 0xaa, 0x58, 0xd2, 0xd1, - 0x4c, 0xe2, 0x33, 0x68, 0xf9, 0x0c, 0x97, 0x1d, 0x46, 0xb4, 0x7f, 0x21, - 0x43, 0x70, 0x95, 0x80, 0xb6, 0xc9, 0xfc, 0xd9, 0xf5, 0x4a, 0x08, 0x92, - 0xd4, 0xba, 0xbc, 0x9c, 0xcd, 0xf5, 0xd6, 0xe6, 0x2e, 0xba, 0x0f, 0x72, - 0xb7, 0x5c, 0x6d, 0xf8, 0x71, 0xb3, 0x6f, 0x1b, 0x4e, 0xed, 0x7c, 0x01, - 0xd5, 0xa9, 0x00, 0xc1, 0x3a, 0x7b, 0x78, 0x73, 0xd9, 0x5c, 0xba, 0x1b, - 0xf3, 0x78, 0x12, 0xb6, 0x60, 0x61, 0x32, 0x03, 0x25, 0x3c, 0x6a, 0x53, - 0x8c, 0x96, 0xfc, 0x3e, 0xa9, 0x26, 0x01, 0xdd, 0x0f, 0x59, 0x04, 0x3a, - 0x9a, 0xa8, 0x48, 0x4f, 0x4a, 0xc7, 0x7e, 0x86, 0xdb, 0xbd, 0x75, 0x56, - 0x72, 0xd8, 0x4e, 0xfe, 0xc5, 0x3e, 0xa6, 0xc7, 0x17, 0x7d, 0x5e, 0x6b, - 0x49, 0x01, 0x5d, 0xf5, 0x64, 0x9e, 0x5b, 0xcf, 0x82, 0xbe, 0x1d, 0x35, - 0x1a, 0x6a, 0x6f, 0x48, 0x96, 0x59, 0xd5, 0x7c, 0x7a, 0x63, 0x39, 0x8e, - 0x42, 0x08, 0x5e, 0xed, 0xd0, 0xa2, 0x14, 0x98, 0xce, 0xb4, 0x86, 0x43, - 0x38, 0x96, 0x52, 0xf3, 0x5e, 0xf4, 0xd0, 0xf7, 0xa4, 0x57, 0x0b, 0xd4, - 0x43, 0x0c, 0xa0, 0xc1, 0xba, 0xd8, 0x49, 0x2d, 0x0d, 0x73, 0x17, 0xee, - 0x42, 0x4d, 0xda, 0x6e, 0x4f, 0x93, 0x26, 0xc1, 0x79, 0x91, 0x0f, 0x99, - 0x94, 0xaf, 0x50, 0xf4, 0x83, 0x3c, 0xda, 0xdf, 0xea, 0x47, 0x8d, 0x8f, - 0x09, 0xb8, 0xed, 0x93, 0x83, 0x7e, 0xdc, 0x52, 0x15, 0x97, 0x6c, 0x33, - 0x55, 0x7c, 0x1f, 0xf0, 0x30, 0x41, 0xab, 0x2e, 0x40, 0x44, 0x13, 0x28, - 0xa8, 0x80, 0x33, 0xb2, 0xc3, 0x93, 0x88, 0x1d, 0x2e, 0xd4, 0xf9, 0x4c, - 0xdf, 0xc6, 0x81, 0x3f, 0xdc, 0x80, 0x59, 0x7e, 0xd2, 0x6b, 0xe0, 0x3c, - 0x33, 0x79, 0x61, 0xd2, 0x14, 0xa7, 0xf5, 0x5f, 0x2b, 0x95, 0xba, 0xf6, - 0xc9, 0xa2, 0xbd, 0x08, 0x3a, 0x69, 0x1e, 0x64, 0x81, 0xfd, 0xc9, 0xeb, - 0x8d, 0x7a, 0xe5, 0xc8, 0xbd, 0xa1, 0x62, 0x86, 0xfe, 0xe7, 0xe0, 0xa6, - 0x0b, 0x79, 0x71, 0x52, 0x62, 0x26, 0x4c, 0x49, 0xdb, 0x57, 0xc7, 0x2d, - 0xf6, 0xe8, 0x0c, 0x7c, 0xb6, 0x7c, 0x2f, 0xbd, 0x8f, 0x41, 0x83, 0x74, - 0x2a, 0xbf, 0x89, 0xd3, 0x80, 0x29, 0x3b, 0x3a, 0xd4, 0x2d, 0x66, 0xe1, - 0x9a, 0xae, 0x84, 0xa5, 0x92, 0x0d, 0x36, 0xea, 0xe5, 0x07, 0xc0, 0xa7, - 0x25, 0xc2, 0x89, 0xbe, 0x85, 0xd7, 0xb1, 0xbf, 0x9d, 0x75, 0x72, 0xba, - 0x34, 0xcb, 0x73, 0xbc, 0xf5, 0xc1, 0x5f, 0x18, 0x02, 0x2e, 0x41, 0xb7, - 0x6b, 0x4b, 0xf8, 0x02, 0xbc, 0x36, 0x85, 0x26, 0x7c, 0x2b, 0x3a, 0x4d, - 0x9a, 0xe8, 0x59, 0xbb, 0x50, 0xc9, 0x3b, 0x42, 0x79, 0x36, 0x65, 0xa4, - 0xd2, 0x1b, 0x5d, 0x34, 0x68, 0x67, 0x8b, 0x30, 0x9c, 0x48, 0xee, 0xb6, - 0xf7, 0x01, 0x49, 0x30, 0xe2, 0x5f, 0x92, 0x47, 0xb2, 0x90, 0x12, 0xb3, - 0x68, 0x83, 0x03, 0xa6, 0x90, 0x49, 0xc5, 0xa4, 0x72, 0x4c, 0x32, 0x97, - 0x91, 0xff, 0x8d, 0xcb, 0x45, 0x78, 0xb3, 0xf2, 0x93, 0x35, 0xfd, 0x69, - 0x44, 0x2f, 0x75, 0x6e, 0xad, 0x93, 0x09, 0xb2, 0x24, 0xe5, 0x51, 0x87, - 0x55, 0x04, 0xe6, 0x94, 0xd1, 0xeb, 0x59, 0xff, 0x23, 0x31, 0x8d, 0xe2, - 0xc9, 0xa7, 0x36, 0x46, 0x23, 0x73, 0x5e, 0xae, 0xef, 0xee, 0x27, 0x22, - 0x24, 0xcf, 0x5f, 0xee, 0x47, 0xe1, 0x0a, 0xeb, 0xa8, 0xad, 0x1c, 0x54, - 0x14, 0x16, 0x3e, 0xa6, 0xfb, 0x3a, 0x5a, 0xae, 0xa0, 0xc8, 0xbf, 0xe0, - 0x40, 0x0e, 0xc0, 0x82, 0x39, 0xeb, 0x41, 0x4e, 0x23, 0xe7, 0x0e, 0xd3, - 0x08, 0x8d, 0x94, 0xb3, 0x93, 0xd9, 0x7c, 0xce, 0x23, 0xdd, 0x55, 0xf5, - 0xf5, 0xab, 0xd2, 0x33, 0x6e, 0x19, 0xf8, 0x72, 0x3d, 0x88, 0xb1, 0xc4, - 0xbe, 0x6c, 0x3f, 0xc1, 0x6b, 0xc8, 0x76, 0xbc, 0x61, 0x46, 0x67, 0x85, - 0xd6, 0xf3, 0xa8, 0x30, 0x3f, 0x11, 0x52, 0xab, 0xd8, 0x6b, 0xfc, 0x2d, - 0x62, 0x86, 0x74, 0x9c, 0xea, 0xc8, 0xc7, 0x60, 0xe9, 0x11, 0x4d, 0x53, - 0xcd, 0x3c, 0xf0, 0xbc, 0x45, 0xd4, 0x1c, 0x21, 0x9f, 0xa2, 0xaa, 0xcd, - 0xd9, 0xfb, 0xe8, 0x5b, 0xc7, 0xde, 0xd1, 0x9a, 0xb2, 0x21, 0xa5, 0xcd, - 0x6e, 0xaa, 0xb4, 0x44, 0xc2, 0xbc, 0x77, 0x13, 0xf3, 0x3d, 0x59, 0x3d, - 0x01, 0xad, 0xc7, 0xdd, 0xd8, 0x27, 0x33, 0x20, 0xa7, 0x26, 0x75, 0x05, - 0x7f, 0x19, 0x87, 0x42, 0x05, 0x46, 0xcf, 0xb8, 0xf3, 0x65, 0x56, 0x50, - 0x72, 0xa2, 0xfc, 0x9c, 0x8e, 0x1d, 0x7b, 0x3a, 0xbd, 0xc4, 0xe9, 0x1e, - 0x50, 0x62, 0x58, 0x9c, 0xe3, 0xa8, 0x22, 0x20, 0x08, 0x8a, 0xfd, 0xb2, - 0x7f, 0x53, 0x45, 0xe4, 0x2c, 0x16, 0xfc, 0xb7, 0x4a, 0x74, 0x04, 0xc4, - 0x0c, 0xc3, 0x74, 0xe3, 0x63, 0x61, 0xcd, 0xcd, 0x19, 0xaf, 0x56, 0xc8, - 0x0c, 0xde, 0x81, 0x5b, 0xd1, 0xd5, 0xa1, 0x91, 0x17, 0xc7, 0x22, 0xce, - 0xee, 0x18, 0x2d, 0x74, 0x1a, 0xc6, 0x30, 0xb4, 0x27, 0x81, 0xdc, 0xa1, - 0x52, 0xd5, 0x34, 0x8c, 0xd2, 0xb4, 0xa5, 0x91, 0x5b, 0xf4, 0x3d, 0x3c, - 0xaa, 0x38, 0x4c, 0x3e, 0xa2, 0x43, 0x5a, 0x3d, 0xe7, 0x36, 0x28, 0x55, - 0xa7, 0x44, 0xf2, 0x54, 0x98, 0x46, 0xe6, 0xa0, 0x41, 0xb4, 0xbd, 0x69, - 0x9a, 0x58, 0x3f, 0xb8, 0x8b, 0x01, 0xde, 0xb4, 0x6c, 0x4c, 0xbe, 0x4a, - 0xbb, 0x9f, 0x0e, 0xcd, 0x92, 0x81, 0x43, 0x74, 0x68, 0x71, 0x6b, 0x46, - 0x21, 0xe7, 0xdd, 0xd8, 0xec, 0x2a, 0x9b, 0xc0, 0xa9, 0x89, 0x27, 0xf3, - 0xb6, 0xfd, 0x9c, 0x58, 0x53, 0x97, 0xb5, 0xdc, 0xbd, 0xb1, 0xf7, 0x08, - 0x96, 0xc3, 0x9c, 0xba, 0x92, 0x1d, 0xb0, 0x26, 0xf0, 0xc5, 0x42, 0xcd, - 0xe6, 0x97, 0x36, 0x46, 0x23, 0x73, 0x5e, 0xae, 0xef, 0xee, 0x27, 0x22, - 0x24, 0xcf, 0x5f, 0xee, 0x20, 0xbb, 0xd4, 0xea, 0x28, 0x0a, 0x0f, 0x17, - 0xff, 0x30, 0x26, 0xd6, 0xcb, 0xc8, 0x79, 0x25, 0xfd, 0xed, 0x9c, 0x7b, - 0x49, 0x2e, 0xe1, 0xbe, 0x4b, 0x69, 0x69, 0xde, 0xae, 0x51, 0x6f, 0x8c, - 0xaa, 0x23, 0xdc, 0x03, 0x22, 0x24, 0x6a, 0xce, 0xfd, 0x16, 0x5d, 0xab, - 0x75, 0x48, 0xb2, 0x57, 0x3f, 0x03, 0xa0, 0xb6, 0x06, 0xad, 0x56, 0x42, - 0x85, 0x99, 0xb3, 0x53, 0xab, 0xa8, 0x25, 0x4f, 0xfe, 0xe5, 0xc8, 0x87, - 0xd2, 0x5a, 0x1a, 0x43, 0x89, 0xd2, 0x99, 0xc8, 0xfb, 0x69, 0x30, 0x63, - 0x59, 0x66, 0x84, 0x0e, 0xb7, 0x85, 0x14, 0x60, 0x69, 0xf0, 0x2a, 0x02, - 0x57, 0x60, 0x69, 0xf5, 0x7d, 0xd5, 0xe4, 0x49, 0x27, 0x93, 0x0a, 0xe2, - 0x21, 0xe4, 0x74, 0x3c, 0x7f, 0xd6, 0x1c, 0x44, 0x12, 0x4b, 0x9b, 0x33, - 0x91, 0xe9, 0x42, 0xa7, 0x30, 0x88, 0xcb, 0xaf, 0x8a, 0x3d, 0x4a, 0xa5, - 0xc4, 0xae, 0x9e, 0x23, 0x1e, 0xbd, 0xc1, 0xe8, 0xe0, 0x8f, 0x94, 0x4a, - 0x9e, 0x25, 0x9e, 0x69, 0x74, 0x1c, 0x40, 0x4c, 0xeb, 0x0b, 0xcd, 0x63, - 0xe6, 0xf6, 0x1d, 0x34, 0x28, 0x5f, 0xc9, 0x91, 0x07, 0x5d, 0x62, 0xcf, - 0x2a, 0xa4, 0x2b, 0xd2, 0x4b, 0x9f, 0xc2, 0x94, 0xcb, 0x68, 0x7c, 0x63, - 0x40, 0x50, 0xd4, 0x39, 0x66, 0xbd, 0x2b, 0x1a, 0xd0, 0xb7, 0x7f, 0x6e, - 0x67, 0x98, 0xb9, 0x27, 0xb7, 0x79, 0x99, 0xed, 0x5d, 0x29, 0x94, 0xca, - 0xf3, 0x2b, 0x52, 0x76, 0x3d, 0x8d, 0x80, 0x74, 0xab, 0x8d, 0x7c, 0xed, - 0xac, 0xf7, 0x4f, 0x4b, 0xa5, 0x3c, 0x5e, 0xc3, 0x7d, 0xd4, 0x7d, 0xe4, - 0xcb, 0x68, 0x91, 0xe4, 0xc0, 0x57, 0xdc, 0xcf, 0x34, 0x38, 0x0c, 0x78, - 0xdd, 0x62, 0x92, 0xca, 0xda, 0x86, 0x09, 0x7c, 0x20, 0x77, 0x02, 0x7b, - 0xc8, 0x5b, 0x44, 0x40, 0x59, 0xcd, 0x5e, 0x0e, 0x2d, 0x2e, 0x01, 0x9d, - 0xc3, 0xe1, 0xa7, 0xdf, 0x2f, 0x2c, 0x04, 0xe2, 0x85, 0xb8, 0x99, 0x1a, - 0x6b, 0xac, 0x28, 0x39, 0x54, 0x27, 0xd9, 0xf7, 0x02, 0x26, 0x62, 0x13, - 0x78, 0x96, 0xa8, 0xb2, 0xed, 0xfc, 0x37, 0x8a, 0x41, 0x41, 0x06, 0x00, - 0x94, 0x5e, 0x97, 0x29, 0xe9, 0x3d, 0xbb, 0x94, 0x42, 0x97, 0x07, 0x4b, - 0x1d, 0xe8, 0xd5, 0x38, 0xa3, 0x53, 0x59, 0x62, 0xdd, 0xd3, 0xc5, 0xcd, - 0x15, 0x04, 0xab, 0xfe, 0x81, 0xb5, 0xf6, 0xa4, 0x46, 0x51, 0xb7, 0x29, - 0xa8, 0x73, 0x33, 0x5d, 0xfa, 0x10, 0x76, 0xc6, 0x58, 0xb5, 0x75, 0xbc, - 0x7c, 0x65, 0x37, 0x8c, 0x80, 0xd5, 0x78, 0x51, 0x36, 0xf8, 0xd3, 0x16, - 0x17, 0x43, 0x81, 0x0f, 0x9c, 0xed, 0xd5, 0xe8, 0xa8, 0xa9, 0xa1, 0x79, - 0x6b, 0xe2, 0x1d, 0x16, 0xc9, 0xf4, 0x28, 0x7b, 0x06, 0xa6, 0xcb, 0x1f, - 0x21, 0xa6, 0x50, 0xa2, 0x35, 0xfa, 0xc2, 0x10, 0x58, 0x07, 0x8b, 0x0f, - 0x9c, 0xed, 0xd5, 0xe8, 0xa8, 0xa9, 0xa1, 0x79, 0x09, 0x60, 0xd6, 0x61, - 0xad, 0x1b, 0x72, 0x91, 0x8d, 0xe4, 0x48, 0x8f, 0x2c, 0x29, 0xa0, 0x3f, - 0x37, 0x76, 0x00, 0xb0, 0x4e, 0x92, 0x4c, 0xd2, 0x4b, 0x9f, 0xc2, 0x94, - 0xcb, 0x68, 0x7c, 0x63, 0xb3, 0xda, 0xbd, 0xeb, 0xb8, 0x24, 0x83, 0x73, - 0x06, 0x69, 0x56, 0xed, 0x09, 0x75, 0x33, 0x4e, 0xe2, 0xc3, 0xc3, 0xea, - 0x48, 0xbf, 0x0c, 0x8a, 0x02, 0x15, 0x9f, 0xdf, 0xdc, 0x89, 0xcf, 0x27, - 0x94, 0x71, 0x0c, 0xe1, 0x9a, 0x53, 0x71, 0x70, 0x58, 0xbf, 0x15, 0x43, - 0xcb, 0x61, 0x2b, 0x7f, 0xa7, 0xfa, 0xe9, 0xe0, 0x16, 0x25, 0x47, 0x3e, - 0xbc, 0x27, 0xae, 0x78, 0xa3, 0x4a, 0xae, 0x8c, 0x33, 0xe9, 0xdc, 0x0f, - 0x4d, 0x49, 0x81, 0x0f, 0x9c, 0xed, 0xd5, 0xe8, 0xa8, 0xa9, 0xa1, 0x79, - 0x2f, 0x66, 0xc7, 0xbe, 0x33, 0x98, 0xd5, 0x62, 0xd2, 0xab, 0x4f, 0x5e, - 0xff, 0xf1, 0xe2, 0xa5, 0xac, 0xa4, 0x13, 0x5a, 0xeb, 0x4f, 0x73, 0x55, - 0x25, 0xdc, 0x1c, 0xf4, 0x0e, 0x0e, 0x33, 0x95, 0x25, 0xeb, 0xd8, 0x0c, - 0x49, 0x49, 0x81, 0x0f, 0x9c, 0xed, 0xd5, 0xe8, 0xa8, 0xa9, 0xa1, 0x79, - 0xc2, 0x7b, 0x58, 0xff, 0x4b, 0xa5, 0x35, 0xe2, 0xdb, 0x77, 0x55, 0x76, - 0x3d, 0xed, 0xd8, 0x1c, 0xf3, 0x34, 0x2d, 0x43, 0x76, 0x93, 0xf8, 0x7c, - 0x40, 0xde, 0xb2, 0x0c, 0x0a, 0x54, 0xf0, 0x6a, 0xad, 0xc5, 0x61, 0x95, - 0xdd, 0xce, 0xf8, 0x48, 0x5b, 0xa6, 0x20, 0x86, 0x0a, 0x7a, 0x17, 0xe2, - 0x8f, 0xe7, 0x9a, 0x95, 0xfa, 0x31, 0x05, 0x75, 0x0a, 0xe8, 0x27, 0xfd, - 0xf9, 0xc7, 0xf6, 0xb3, 0x3c, 0xbe, 0xf8, 0x36, 0x14, 0x89, 0xb8, 0xbe, - 0x27, 0x21, 0xbf, 0xb3, 0x93, 0x48, 0xd8, 0xda, 0x67, 0x83, 0xa4, 0x39, - 0xfb, 0x35, 0xf8, 0xb8, 0x93, 0x9e, 0x61, 0x26, 0xa0, 0x39, 0x07, 0x05, - 0x02, 0x6b, 0x7b, 0x8a, 0xfc, 0x8e, 0xde, 0xe7, 0xdc, 0x46, 0x91, 0xd1, - 0x19, 0x13, 0x28, 0xc4, 0x88, 0x1b, 0xea, 0xfc, 0x4b, 0xeb, 0xd5, 0x80, - 0xea, 0xb5, 0x47, 0x09, 0x2a, 0x11, 0xad, 0x45, 0x29, 0x9f, 0x30, 0x4b, - 0x44, 0x83, 0xfc, 0x5d, 0x62, 0x19, 0xc2, 0x67, 0x07, 0xdf, 0xc9, 0x47, - 0x1e, 0x42, 0xdd, 0xd5, 0xb7, 0xf7, 0x9b, 0x73, 0x64, 0x4f, 0x72, 0x47, - 0xf5, 0x57, 0x67, 0x23, 0xb9, 0x83, 0x44, 0x57, 0xe9, 0x78, 0x27, 0x91, - 0x11, 0xca, 0x62, 0x76, 0x14, 0xc9, 0x62, 0x35, 0xcb, 0x3a, 0x70, 0x0f, - 0x0e, 0xf8, 0x55, 0x5a, 0xd4, 0xa5, 0xee, 0x59, 0x99, 0x13, 0xa4, 0xa9, - 0x2d, 0x11, 0x13, 0x3d, 0x58, 0x2a, 0x2a, 0x56, 0x28, 0x5b, 0xe1, 0x52, - 0xcd, 0xec, 0x58, 0x56, 0xf6, 0x2f, 0x3a, 0x81, 0xbc, 0x90, 0x37, 0x64, - 0xcd, 0x6f, 0x9e, 0x7e, 0x4a, 0xb1, 0x41, 0x8c, 0x76, 0xca, 0xd0, 0x36, - 0x2b, 0x7d, 0xa2, 0xf6, 0x76, 0x65, 0x6a, 0x97, 0x09, 0x9e, 0xa2, 0x3f, - 0xd0, 0xc7, 0x12, 0x4c, 0x0f, 0x2a, 0x60, 0x1c, 0xf9, 0xcb, 0x5e, 0xe7, - 0xd7, 0x6b, 0x3d, 0x2c, 0xdb, 0xeb, 0xa2, 0xc3, 0xdc, 0xe6, 0xd7, 0x11, - 0xb6, 0xc0, 0x73, 0xbb, 0x5f, 0xf5, 0x4c, 0x74, 0x7c, 0x80, 0x56, 0x1d, - 0x48, 0xaa, 0xd6, 0x0e, 0xa9, 0xf1, 0x39, 0xf4, 0x7d, 0xd8, 0xc5, 0x8d, - 0x44, 0xcb, 0x46, 0x56, 0x55, 0x57, 0xba, 0x43, 0xc5, 0x8f, 0x9d, 0xd4, - 0x52, 0x2b, 0x6b, 0x3d, 0x24, 0xa6, 0x25, 0xad, 0x64, 0x5a, 0x3d, 0x5a, - 0x02, 0x83, 0x66, 0x66, 0x38, 0xba, 0xd3, 0xf1, 0x6c, 0x78, 0xaf, 0x7b, - 0x1a, 0xdc, 0xb3, 0x17, 0xa6, 0x73, 0xd3, 0x13, 0x6f, 0x6d, 0xcf, 0x1c, - 0x3a, 0x27, 0x0a, 0x56, 0x91, 0xfb, 0x75, 0x11, 0x27, 0x07, 0xcc, 0x7f, - 0xdb, 0x98, 0x21, 0x0c, 0xb5, 0xce, 0xfd, 0x2d, 0x33, 0xfb, 0x16, 0x2a, - 0xb2, 0x15, 0xf9, 0xfa, 0x52, 0xb6, 0x54, 0xe0, 0xc8, 0x89, 0x5b, 0x77, - 0x4d, 0x1b, 0x68, 0x9c, 0x2b, 0xb2, 0x83, 0x2c, 0x52, 0x7b, 0xa5, 0x18, - 0x80, 0x86, 0xb0, 0xfd, 0x98, 0x0a, 0xd0, 0x40, 0xcf, 0x2e, 0x55, 0x60, - 0x59, 0xed, 0xf2, 0xf9, 0xeb, 0xa5, 0x2d, 0x68, 0x3e, 0xb2, 0xe6, 0xa7, - 0x8a, 0xa3, 0x64, 0x19, 0x53, 0xe0, 0xbb, 0x3b, 0x75, 0x42, 0x6a, 0x97, - 0x3b, 0x74, 0x75, 0x5e, 0x22, 0x97, 0x35, 0xad, 0xbf, 0x28, 0xbd, 0xc4, - 0x5b, 0x1e, 0x7f, 0x28, 0x74, 0xdc, 0x1e, 0x52, 0x32, 0x37, 0x06, 0x9c, - 0xc2, 0x52, 0xeb, 0xed, 0x68, 0x31, 0x09, 0xa4, 0xf9, 0xe1, 0x64, 0x17, - 0xfc, 0x91, 0xbe, 0xac, 0x3c, 0xa9, 0x2e, 0x94, 0x5d, 0x8e, 0x03, 0xeb, - 0x44, 0x45, 0x5c, 0xab, 0x0a, 0x28, 0x2a, 0xb8, 0xcc, 0xc1, 0x3b, 0x28, - 0xf3, 0x43, 0x67, 0x14, 0xf5, 0x84, 0xd2, 0xab, 0xd3, 0x6b, 0xe9, 0xb2, - 0xea, 0x38, 0xea, 0x8d, 0xe4, 0x0a, 0x6e, 0x4e, 0xc8, 0x52, 0x7e, 0xbd, - 0xff, 0xb2, 0xf8, 0x25, 0xab, 0x02, 0xca, 0x2f, 0x77, 0xd5, 0x06, 0x26, - 0xfb, 0xd1, 0xa9, 0xc6, 0x5d, 0x61, 0xf2, 0xb0, 0x63, 0xcc, 0xd8, 0xb0, - 0x21, 0xb1, 0xe5, 0x29, 0xd1, 0x12, 0xdd, 0xdc, 0x35, 0xa8, 0xa6, 0x89, - 0xdf, 0x23, 0x46, 0x27, 0x31, 0xb2, 0x69, 0x99, 0x30, 0x7e, 0x1c, 0x23, - 0xf7, 0x71, 0xd0, 0xe9, 0x08, 0x62, 0x39, 0x50, 0x37, 0xb7, 0x5d, 0xf6, - 0xab, 0x5d, 0x07, 0x42, 0xda, 0xab, 0xb8, 0x47, 0x1d, 0x13, 0xfa, 0x24, - 0x7c, 0xa5, 0xc5, 0xae, 0xd2, 0xa6, 0x29, 0x2d, 0xfc, 0x86, 0x6f, 0x07, - 0xcd, 0x59, 0xf8, 0x80, 0x73, 0x86, 0x6c, 0xc1, 0x17, 0x8f, 0x0a, 0x9f, - 0x99, 0xbc, 0x38, 0xa1, 0xa5, 0x19, 0x33, 0xac, 0xbe, 0x08, 0x00, 0x50, - 0xe6, 0x39, 0xf5, 0x4f, 0x80, 0x3f, 0x8b, 0xa5, 0x42, 0x95, 0xaa, 0xcf, - 0xc9, 0x47, 0xc9, 0x02, 0x78, 0x8f, 0xa7, 0x73, 0x99, 0x2b, 0xd2, 0x90, - 0xa8, 0x69, 0x62, 0x32, 0x3d, 0x4f, 0xb3, 0xec, 0xb4, 0x9f, 0x53, 0x64, - 0xbb, 0x56, 0x97, 0x61, 0x7c, 0x39, 0xba, 0x6a, 0x67, 0x46, 0x94, 0x0f, - 0xc9, 0xbf, 0x03, 0x0c, 0xcb, 0x8c, 0xb1, 0x93, 0x6e, 0x42, 0x38, 0x99, - 0xed, 0x1f, 0x6f, 0x10, 0x2e, 0xfb, 0x22, 0x24, 0xb0, 0x7c, 0xc1, 0x5d, - 0x56, 0xcd, 0xeb, 0xb8, 0x35, 0x2c, 0x18, 0x97, 0xdd, 0x52, 0x47, 0x64, - 0xef, 0x72, 0x27, 0x84, 0x7b, 0xe3, 0x4c, 0x1e, 0x86, 0x81, 0xff, 0xfb, - 0x8f, 0xea, 0xe5, 0xed, 0x1f, 0x62, 0x15, 0x87, 0xfa, 0xfb, 0x7d, 0x52, - 0x36, 0x83, 0xf9, 0xb1, 0xad, 0x9a, 0xf9, 0x0b, 0x02, 0x54, 0x64, 0x32, - 0xb9, 0x47, 0x1f, 0xfe, 0x14, 0xd0, 0x8d, 0xa2, 0x25, 0x3d, 0xee, 0x88, - 0xef, 0x59, 0xf4, 0x92, 0x80, 0x6b, 0xb4, 0xd6, 0xb6, 0x4d, 0x75, 0xb7, - 0xc6, 0x77, 0xcb, 0x8e, 0x0c, 0x09, 0xa4, 0x42, 0x94, 0x25, 0xfe, 0xce, - 0x62, 0xe8, 0x8d, 0xd5, 0xd9, 0x1c, 0xe0, 0xab, 0x5b, 0x0d, 0xdd, 0x38, - 0xd3, 0x3c, 0x6a, 0x81, 0xe7, 0xd0, 0x04, 0x47, 0x7a, 0x47, 0x3e, 0x4a, - 0x5d, 0xfa, 0x37, 0x16, 0xe0, 0x14, 0xef, 0x3a, 0xe7, 0x11, 0x00, 0x9c, - 0x67, 0xc1, 0xab, 0xf8, 0x6d, 0xad, 0x60, 0x39, 0x2a, 0xf1, 0x95, 0x02, - 0x43, 0x7c, 0x14, 0x3f, 0xf4, 0xa2, 0x54, 0x73, 0xf8, 0xe2, 0x35, 0xed, - 0x2c, 0xf3, 0x49, 0xd8, 0x6a, 0x15, 0x23, 0xf0, 0x42, 0xaa, 0xdc, 0xf1, - 0x6f, 0xe5, 0x78, 0xd0, 0xfd, 0x54, 0xd9, 0xa9, 0x2f, 0xc2, 0xbf, 0x73, - 0x2f, 0xce, 0x3a, 0x43, 0x04, 0xbb, 0x4a, 0x70, 0x69, 0x87, 0xa9, 0x99, - 0x8e, 0x95, 0x95, 0xeb, 0x5e, 0xa0, 0xd8, 0x5d, 0xc7, 0x52, 0xeb, 0x56, - 0x1f, 0xa7, 0xd2, 0x54, 0xed, 0x1f, 0x67, 0xbf, 0xca, 0x22, 0xd5, 0x01, - 0xab, 0x92, 0x06, 0x6f, 0x44, 0x35, 0x9a, 0x57, 0x1a, 0x12, 0x41, 0xbd, - 0x70, 0x8b, 0x62, 0xbd, 0x52, 0xe9, 0x5a, 0xa5, 0x31, 0xa3, 0xf5, 0x06, - 0x75, 0x6c, 0x5a, 0xa4, 0x92, 0x72, 0x80, 0xe3, 0xdd, 0x52, 0x4e, 0x32, - 0x28, 0x01, 0xb2, 0x7b, 0x16, 0x23, 0x62, 0xe3, 0x2b, 0xde, 0x56, 0xb2, - 0x8f, 0x85, 0xb6, 0xdd, 0xe6, 0x5c, 0x42, 0x7e, 0x6d, 0xf6, 0xee, 0x7a, - 0x7e, 0x88, 0x15, 0x83, 0x32, 0xcb, 0xac, 0x76, 0xdb, 0x00, 0x41, 0x13, - 0x1c, 0x8f, 0xa4, 0x8e, 0x97, 0x93, 0xb7, 0x77, 0x24, 0xce, 0x90, 0x15, - 0x60, 0x8e, 0xbc, 0xe8, 0xb5, 0x12, 0x2f, 0x33, 0xcb, 0xbd, 0x5a, 0x31, - 0x22, 0x7c, 0xb2, 0xfb, 0xbf, 0x0c, 0x17, 0x48, 0xff, 0xf8, 0x6e, 0x87, - 0xbe, 0xd6, 0xf0, 0x52, 0x14, 0xc3, 0xed, 0x70, 0x8b, 0x40, 0x73, 0xad, - 0x6d, 0x94, 0xeb, 0x0a, 0x85, 0x34, 0x50, 0xb9, 0xc6, 0x5f, 0x97, 0x89, - 0x3d, 0x44, 0xdc, 0x69, 0x66, 0xc0, 0x2e, 0x2c, 0xd6, 0x8d, 0xd0, 0xaf, - 0xc8, 0xca, 0x14, 0xb8, 0x5d, 0x0e, 0x07, 0x45, 0x50, 0xbf, 0xc6, 0x62, - 0xf7, 0x01, 0x00, 0x9e, 0xb7, 0x3c, 0xc1, 0xc1, 0xc5, 0xad, 0x65, 0xa0, - 0x33, 0x1c, 0x09, 0x30, 0xbd, 0xb4, 0xc1, 0x41, 0x40, 0x90, 0x5b, 0x64, - 0x74, 0x3b, 0x2e, 0xc1, 0xa3, 0xe6, 0xab, 0x7e, 0xb2, 0x74, 0x13, 0x19, - 0x0b, 0x47, 0x21, 0x71, 0xd6, 0x4b, 0x4d, 0xdb, 0x09, 0x21, 0x21, 0x55, - 0xdb, 0x01, 0xbc, 0x06, 0x9b, 0x97, 0xd0, 0x0a, 0x7f, 0xc9, 0x14, 0x85, - 0x1b, 0xfb, 0x8a, 0xcd, 0x7c, 0xdf, 0x87, 0x27, 0x26, 0x8d, 0xb1, 0x37, - 0x9f, 0x18, 0x80, 0x69, 0x07, 0xac, 0xb1, 0x9f, 0x17, 0xb1, 0x5c, 0xaf, - 0x23, 0xf2, 0x52, 0xfb, 0xdf, 0x7f, 0x43, 0x00, 0x93, 0xbc, 0x49, 0x0f, - 0x6c, 0x45, 0xfa, 0x12, 0x25, 0x35, 0xcd, 0x46, 0xaf, 0xbb, 0x25, 0xf7, - 0xb5, 0x54, 0x98, 0x63, 0x01, 0xbd, 0x2d, 0x50, 0x1d, 0x7b, 0x52, 0x5b, - 0x48, 0x4d, 0xb0, 0xab, 0x5c, 0x09, 0x5d, 0xb2, 0x58, 0x1a, 0xed, 0x48, - 0x29, 0xfb, 0xb4, 0xf2, 0xd3, 0xa3, 0xd6, 0xd3, 0xbc, 0xcc, 0x76, 0xc5, - 0xf3, 0x89, 0x3c, 0x66, 0x2c, 0xe6, 0x3c, 0x7b, 0x8e, 0xf1, 0x0c, 0xaa, - 0xb0, 0x2d, 0x25, 0xcc, 0x86, 0x7a, 0x7d, 0x56, 0xa0, 0x4e, 0xb6, 0xf7, - 0xdf, 0xde, 0x2a, 0x85, 0x5b, 0x0f, 0x73, 0xb7, 0xcd, 0x83, 0xe7, 0xbf, - 0x0f, 0xaf, 0x96, 0xa9, 0x79, 0x6b, 0x41, 0x87, 0x14, 0xce, 0xfe, 0x70, - 0x33, 0xba, 0xec, 0x50, 0xdf, 0xec, 0x4c, 0xe5, 0x46, 0x75, 0x49, 0x17, - 0xd0, 0xbd, 0x1a, 0x80, 0x2f, 0xd5, 0xb5, 0xfc, 0x2e, 0xcd, 0x9b, 0x53, - 0x6f, 0xab, 0x2f, 0x79, 0x16, 0xb5, 0x59, 0x32, 0x46, 0x82, 0xc5, 0x93, - 0xce, 0xb8, 0x71, 0x5b, 0x33, 0xc5, 0xa0, 0xee, 0xf3, 0x2f, 0x63, 0x5c, - 0xf5, 0xd2, 0x19, 0x66, 0xdc, 0x40, 0x4f, 0x79, 0x5f, 0x1c, 0xf1, 0x1e, - 0xdc, 0xeb, 0x53, 0xb6, 0xa5, 0x8f, 0x37, 0x69, 0x71, 0xc9, 0xa4, 0xe5, - 0x8a, 0x83, 0x9d, 0x63, 0x43, 0xf4, 0xe4, 0x22, 0xc4, 0x00, 0xba, 0x92, - 0x5e, 0xd6, 0xea, 0x01, 0xdd, 0x23, 0x92, 0xe2, 0x04, 0xb1, 0x6f, 0xa0, - 0x39, 0xe5, 0x84, 0xf4, 0xea, 0x16, 0xf3, 0xf2, 0x81, 0x8e, 0x55, 0x74, - 0x65, 0xe1, 0x80, 0xf9, 0xd3, 0x67, 0x4e, 0x45, 0xe4, 0x49, 0x05, 0xba, - 0x41, 0xc7, 0x20, 0x03, 0xba, 0x1a, 0x4c, 0xc0, 0x2a, 0x33, 0x00, 0x35, - 0xb8, 0xb5, 0x82, 0x01, 0x09, 0x4c, 0xe9, 0x7a, 0x83, 0x7c, 0x0e, 0x86, - 0xb9, 0x55, 0x5e, 0xa1, 0x0d, 0x85, 0x8d, 0xe1, 0x6c, 0xe2, 0x8c, 0xaa, - 0x23, 0x2b, 0xcd, 0x8f, 0x09, 0x9a, 0xb4, 0x73, 0xda, 0x6c, 0xfd, 0x1c, - 0x5b, 0xa2, 0xe4, 0x15, 0x7c, 0xbc, 0xf1, 0xc6, 0xfb, 0x63, 0x9f, 0xb8, - 0xd8, 0x75, 0xf4, 0x1f, 0xba, 0x32, 0x77, 0xdd, 0xd9, 0xe7, 0xb2, 0x60, - 0x83, 0x6a, 0x44, 0x62, 0x80, 0x65, 0x10, 0x92, 0x70, 0xda, 0xa6, 0xa1, - 0x41, 0x4f, 0xad, 0x13, 0xe7, 0x34, 0x56, 0x15, 0x53, 0xfd, 0x9c, 0xe7, - 0x46, 0xdf, 0x98, 0x15, 0x67, 0x9b, 0x6e, 0xc9, 0x40, 0xa8, 0x37, 0x5f, - 0x40, 0xf9, 0xfb, 0xe6, 0xd2, 0xc5, 0x94, 0xcb, 0x8a, 0x73, 0x93, 0x64, - 0xe1, 0xfb, 0xc7, 0x19, 0x12, 0x0c, 0x00, 0xc2, 0x57, 0x13, 0xed, 0x49, - 0x01, 0x5c, 0x0d, 0x70, 0xe1, 0x3a, 0x72, 0x0e, 0x7b, 0x8c, 0xcb, 0xb2, - 0x80, 0xca, 0x41, 0xad, 0x71, 0x66, 0xf3, 0x2c, 0xb4, 0x3a, 0x52, 0x84, - 0x92, 0x90, 0x99, 0x33, 0x38, 0x47, 0x15, 0xec, 0x52, 0x75, 0xb3, 0x36, - 0x01, 0x14, 0x17, 0xdc, 0x1d, 0x87, 0xfc, 0x47, 0x75, 0xa7, 0x1e, 0x63, - 0x66, 0x71, 0x00, 0x3d, 0x2e, 0x7b, 0x14, 0xe1, 0x3c, 0x7b, 0x14, 0x51, - 0x8d, 0x60, 0xbc, 0x8f, 0x85, 0xb5, 0xa9, 0x2b, 0x7d, 0xbe, 0x70, 0xe6, - 0xec, 0x54, 0x7d, 0xd8, 0x03, 0x97, 0x05, 0x74, 0x88, 0x09, 0x1c, 0x88, - 0x18, 0x57, 0x57, 0x2c, 0x04, 0x62, 0xd3, 0x50, 0x93, 0x85, 0x91, 0xbe, - 0xc5, 0x14, 0x34, 0xce, 0xd4, 0xdb, 0x20, 0xcc, 0x7e, 0x24, 0x63, 0x6d, - 0xe2, 0x09, 0x54, 0x8b, 0x02, 0x8b, 0x2b, 0x5e, 0xef, 0xc5, 0x12, 0x96, - 0x00, 0xf7, 0x35, 0xa8, 0x9e, 0xfb, 0xa4, 0xfb, 0x14, 0x2b, 0x33, 0xce, - 0x47, 0x87, 0x2e, 0xed, 0x84, 0xa8, 0xf4, 0x2d, 0x44, 0xdc, 0x34, 0x6a, - 0x38, 0x48, 0xbf, 0x3e, 0xde, 0xa2, 0xbd, 0xbb, 0x44, 0xb0, 0x38, 0x9b, - 0x66, 0xba, 0xab, 0xbe, 0xc2, 0xf0, 0xa4, 0x9d, 0xc8, 0x71, 0x9d, 0x99, - 0x5f, 0xcd, 0x73, 0x8e, 0x8b, 0xfb, 0x4f, 0x2f, 0xcd, 0x57, 0x3a, 0x19, - 0x28, 0xd0, 0x15, 0x7f, 0xb4, 0xed, 0x72, 0x3c, 0xe4, 0xa9, 0x71, 0xff, - 0xc3, 0x3b, 0x67, 0x1c, 0xbb, 0x39, 0x06, 0x28, 0x1c, 0x06, 0x52, 0xf5, - 0xf5, 0x7f, 0xea, 0x6c, 0x8c, 0xe7, 0x6f, 0x24, 0x65, 0xd9, 0x99, 0xda, - 0x53, 0x74, 0x24, 0xf2, 0x7f, 0x19, 0xc4, 0x74, 0x60, 0x60, 0x2b, 0x9d, - 0x65, 0x03, 0xdf, 0xd9, 0x0d, 0x7c, 0xb1, 0x1f, 0x34, 0xc3, 0xb4, 0xa9, - 0xe5, 0xd3, 0xac, 0xc4, 0x57, 0x78, 0x22, 0x3e, 0x6d, 0xef, 0xdd, 0x87, - 0x8f, 0xfc, 0xc2, 0x45, 0xda, 0x6b, 0x72, 0x33, 0x38, 0x1b, 0x6a, 0xaf, - 0x40, 0x67, 0xfc, 0xa0, 0xaa, 0xd8, 0xcf, 0xd8, 0xfd, 0x06, 0x14, 0xca, - 0x3d, 0x10, 0x9e, 0x4b, 0xb3, 0x9e, 0xde, 0xaf, 0x3e, 0xbe, 0x6e, 0x64, - 0xe1, 0x6c, 0x36, 0xba, 0x24, 0x74, 0x81, 0x33, 0xd0, 0x14, 0x9f, 0xb9, - 0x01, 0x8b, 0xfd, 0x7e, 0x3a, 0x24, 0x91, 0xaf, 0x4b, 0x87, 0xe6, 0x51, - 0x53, 0x75, 0x53, 0x6d, 0xc2, 0x29, 0x6a, 0xcb, 0x00, 0x0c, 0x59, 0x95, - 0xf7, 0x67, 0xe0, 0x03, 0xf1, 0x2f, 0x8e, 0x82, 0xd8, 0xcd, 0xf4, 0x53, - 0x0a, 0xa0, 0xd7, 0xc7, 0xe6, 0xef, 0xca, 0x9f, 0xb7, 0x76, 0x56, 0x58, - 0xda, 0x97, 0xfe, 0x52, 0x1f, 0x1b, 0xbb, 0xb4, 0x5d, 0x1d, 0xe0, 0xf4, - 0x4c, 0x82, 0x65, 0x65, 0xd6, 0x53, 0xd1, 0xfa, 0xa4, 0xde, 0x1c, 0xc5, - 0x94, 0xf7, 0xc8, 0xd6, 0x9c, 0xe5, 0xc4, 0x20, 0x72, 0x5c, 0x67, 0xfd, - 0xcc, 0xa9, 0x5c, 0x3a, 0x2d, 0xab, 0xb1, 0x40, 0x3a, 0x3e, 0x94, 0x22, - 0x81, 0xe5, 0x25, 0x7b, 0xb1, 0xe5, 0x63, 0xc1, 0x18, 0xd4, 0xfc, 0xe6, - 0xba, 0xf8, 0x32, 0x2a, 0x72, 0xbf, 0xf1, 0x28, 0x0d, 0xe3, 0x73, 0x15, - 0x13, 0xc4, 0x6e, 0x83, 0xeb, 0x4f, 0x64, 0xfe, 0x5e, 0xb1, 0x2b, 0xec, - 0xf2, 0xa3, 0xbf, 0x93, 0x58, 0xc1, 0xb9, 0x85, 0x15, 0x82, 0x0c, 0xe2, - 0x69, 0x74, 0xbe, 0xb3, 0x87, 0xfb, 0x32, 0x04, 0x92, 0x7e, 0xad, 0x90, - 0xde, 0xd7, 0x88, 0xa5, 0xcb, 0x91, 0x73, 0x22, 0x8c, 0x22, 0x53, 0x58, - 0x3e, 0xc2, 0x23, 0x9c, 0x73, 0xfe, 0x07, 0x75, 0x15, 0xb0, 0x40, 0x3a, - 0xfb, 0x4c, 0xc6, 0x59, 0xd2, 0xea, 0x9f, 0x0c, 0x7b, 0x22, 0xac, 0x1a, - 0x7e, 0x26, 0x5f, 0x18, 0xfc, 0xa4, 0x6c, 0x37, 0x85, 0x0e, 0x4a, 0xd6, - 0x0a, 0xbd, 0x52, 0x5d, 0x77, 0xb3, 0xe1, 0xc8, 0xee, 0x94, 0xe3, 0xa4, - 0x32, 0x25, 0x80, 0xbe, 0xf8, 0x73, 0x84, 0x8d, 0x04, 0x61, 0x6c, 0xaf, - 0x37, 0x92, 0xfd, 0xf0, 0xc1, 0xa6, 0x83, 0xf7, 0xb3, 0x90, 0xd2, 0x8e, - 0x02, 0xe4, 0x69, 0x71, 0x3b, 0x8b, 0xe9, 0x1c, 0xdb, 0x7b, 0x37, 0xb8, - 0x89, 0x5d, 0xf8, 0xdd, 0x84, 0xcc, 0x6c, 0xb5, 0x1d, 0xe9, 0xa7, 0xd2, - 0x42, 0xda, 0xd1, 0xbf, 0x14, 0x7e, 0x6e, 0x0d, 0x35, 0x5e, 0x34, 0x2a, - 0x59, 0x92, 0x96, 0xe2, 0x54, 0xd7, 0x72, 0xd6, 0x32, 0x98, 0xe7, 0x01, - 0x9b, 0x77, 0x57, 0x94, 0x56, 0x76, 0xe4, 0x36, 0x83, 0xbd, 0xf5, 0x52, - 0x16, 0xd0, 0x17, 0x24, 0x2c, 0xf3, 0xb6, 0xb3, 0xcd, 0xc3, 0xb9, 0x04, - 0x93, 0x08, 0x12, 0x4b, 0x2b, 0xf7, 0xdd, 0xd8, 0x5e, 0xb1, 0x41, 0x2f, - 0xcf, 0xaf, 0x28, 0x9d, 0x4c, 0x87, 0xa7, 0x85, 0xec, 0xeb, 0x51, 0xc9, - 0x4d, 0x9e, 0xbb, 0xdf, 0x44, 0xb2, 0xe9, 0x87, 0xc4, 0xe1, 0x3b, 0xf3, - 0xf4, 0xca, 0x87, 0xe7, 0x1e, 0xd4, 0xa9, 0x10, 0x15, 0xa5, 0x5e, 0xf5, - 0x62, 0x13, 0x0a, 0x40, 0x76, 0x76, 0x0b, 0x86, 0xdf, 0x9e, 0x0e, 0xac, - 0x9e, 0xa3, 0x0c, 0x53, 0x39, 0xd1, 0xaa, 0x81, 0x59, 0x13, 0xff, 0x3a, - 0x3f, 0x2f, 0x22, 0x54, 0x93, 0xce, 0x42, 0x3e, 0xed, 0x87, 0x6b, 0x08, - 0xf1, 0x25, 0x20, 0x4e, 0x5d, 0x27, 0x2f, 0xaf, 0xa5, 0x73, 0x52, 0xfb, - 0xd3, 0x4c, 0xf4, 0x77, 0xcc, 0x6d, 0xcc, 0x4d, 0x84, 0xef, 0xc5, 0x3f, - 0xb9, 0xaa, 0xb0, 0x97, 0x0c, 0xea, 0xf1, 0x69, 0x20, 0xc2, 0xb4, 0x68, - 0x0e, 0xd1, 0x02, 0x10, 0x71, 0x98, 0x0d, 0x2e, 0xe5, 0xc2, 0xa6, 0xf6, - 0x57, 0xc6, 0xd3, 0xb8, 0x20, 0x1d, 0x46, 0xc0, 0x1a, 0x76, 0x6b, 0x6f, - 0x7a, 0xae, 0x19, 0x75, 0x57, 0x77, 0x6d, 0xdd, 0xae, 0xbf, 0xbd, 0xb2, - 0x5a, 0x70, 0x5a, 0x13, 0x89, 0x20, 0x72, 0x59, 0x2d, 0x2f, 0x9d, 0xa7, - 0xe7, 0xec, 0x3c, 0x39, 0x34, 0x25, 0x2e, 0xee, 0x86, 0x41, 0x62, 0x67, - 0xb2, 0x7b, 0x81, 0x74, 0xce, 0x42, 0xe2, 0x9a, 0xc0, 0x33, 0x3f, 0x6d, - 0xd2, 0xbe, 0x05, 0xab, 0x13, 0x81, 0x48, 0x3e, 0xf5, 0x5b, 0xa5, 0xe8, - 0x8e, 0xda, 0x95, 0x40, 0xe2, 0x16, 0x11, 0x14, 0x73, 0xb7, 0x70, 0x1d, - 0x6a, 0xad, 0x63, 0x50, 0xa7, 0x99, 0x99, 0x8b, 0xa6, 0x20, 0x6f, 0x2f, - 0x90, 0x44, 0x95, 0x65, 0x3f, 0x0a, 0xb9, 0x1f, 0x0a, 0x8d, 0xa4, 0x83, - 0xe6, 0x1f, 0xf6, 0xae, 0xbd, 0x74, 0xf2, 0xac, 0x00, 0xda, 0x0e, 0x89, - 0x2f, 0xcf, 0xac, 0x3f, 0x8b, 0xca, 0x55, 0x03, 0xb5, 0x7c, 0x2f, 0x61, - 0x15, 0x9a, 0xf8, 0x04, 0x1b, 0x95, 0x8d, 0x9b, 0xcc, 0x51, 0x03, 0x6d, - 0x19, 0x06, 0x82, 0xf5, 0x08, 0xb0, 0xd2, 0x73, 0x90, 0x5b, 0x58, 0x3b, - 0xa6, 0x0f, 0x1a, 0xde, 0xe2, 0x71, 0x46, 0x7d, 0x9a, 0x2b, 0xbc, 0x62, - 0x2b, 0x3e, 0xe0, 0x05, 0x4b, 0x67, 0x93, 0xfa, 0xff, 0xb3, 0xc8, 0xcc, - 0xff, 0xe1, 0xfb, 0xff, 0x10, 0xea, 0x67, 0x4e, 0x25, 0x59, 0x32, 0xf2, - 0x76, 0x58, 0x7e, 0x8e, 0x48, 0xe3, 0xff, 0x12, 0x45, 0x24, 0xa5, 0x92, - 0x4a, 0x36, 0xda, 0x55, 0x89, 0xe5, 0x4e, 0x78, 0x22, 0x5f, 0xd1, 0xca, - 0xd8, 0xfc, 0x29, 0x92, 0xff, 0x56, 0x5b, 0x19, 0x77, 0x58, 0x94, 0x8c, - 0x4d, 0x9b, 0x58, 0x03, 0xd8, 0x45, 0xaf, 0x95, 0xfc, 0x43, 0x2c, 0x7c, - 0x5e, 0x92, 0x3c, 0x7e, 0x15, 0x89, 0x36, 0x30, 0x73, 0x7b, 0x53, 0xe9, - 0x63, 0xa7, 0xf7, 0x56, 0x6d, 0x48, 0x45, 0x9e, 0x7d, 0x3e, 0x60, 0xfc, - 0x52, 0xaf, 0x28, 0xed, 0xd7, 0x08, 0x4e, 0xe5, 0x7d, 0xa9, 0x08, 0xfd, - 0x7b, 0xe4, 0x98, 0x85, 0x96, 0x41, 0xfd, 0x9d, 0xe3, 0x23, 0x77, 0xcd, - 0x9b, 0x5f, 0x73, 0x7d, 0x78, 0x27, 0x6f, 0x91, 0xb6, 0x82, 0x21, 0x94, - 0x96, 0xe2, 0x2b, 0x69, 0xc8, 0x32, 0xaa, 0x6a, 0x4e, 0x2f, 0x72, 0xbc, - 0x48, 0x2f, 0x9c, 0xff, 0xfe, 0xae, 0x2e, 0xd6, 0x4a, 0x18, 0x30, 0xe6, - 0x79, 0x6a, 0xf8, 0xb0, 0x75, 0xf2, 0x3f, 0x98, 0xf8, 0x74, 0xf4, 0x50, - 0x74, 0x90, 0x5c, 0x00, 0xc4, 0xe0, 0x1c, 0xd1, 0x04, 0x28, 0xf7, 0x82, - 0x82, 0xcd, 0xe0, 0x2a, 0xf9, 0x9c, 0xf8, 0xd2, 0xa0, 0x36, 0x63, 0xe9, - 0x53, 0xca, 0xd8, 0xe8, 0x7c, 0xd4, 0xbc, 0x44, 0x8d, 0xf3, 0x50, 0x38, - 0xe7, 0x2b, 0xba, 0xd6, 0x1d, 0xeb, 0x17, 0xbd, 0x26, 0x26, 0xf3, 0x9c, - 0xc8, 0xeb, 0xdd, 0x1e, 0x4f, 0x8b, 0xcb, 0x5c, 0x1b, 0xa6, 0x99, 0x58, - 0xf1, 0x34, 0x41, 0xe0, 0xc8, 0x84, 0x03, 0xbc, 0xab, 0x17, 0x9d, 0xd9, - 0x2a, 0xe3, 0x93, 0x1d, 0x4b, 0xf3, 0x0e, 0x97, 0xb1, 0xe0, 0xd6, 0x28, - 0x11, 0xf8, 0x62, 0x94, 0x58, 0xf8, 0xc0, 0x91, 0x81, 0x7d, 0x7b, 0x51, - 0x48, 0xf2, 0xfd, 0x06, 0xfb, 0xd6, 0xda, 0x9b, 0xd1, 0xda, 0xa9, 0x1a, - 0x1f, 0xae, 0x39, 0xd9, 0x6e, 0xf2, 0x5d, 0xe1, 0xb0, 0x5c, 0x68, 0x13, - 0xe6, 0x21, 0x41, 0xc7, 0x6a, 0xbe, 0x53, 0x6b, 0x05, 0x6a, 0xb5, 0x34, - 0x4f, 0x56, 0x20, 0xcc, 0x07, 0x0c, 0xa9, 0x75, 0xd5, 0x75, 0xc0, 0x19, - 0xa9, 0xc5, 0x17, 0xea, 0xd7, 0x78, 0x39, 0x23, 0xaf, 0x88, 0xf9, 0x34, - 0x1d, 0x42, 0x70, 0x44, 0xf9, 0xea, 0x76, 0xe4, 0xf7, 0x5e, 0x41, 0xd6, - 0xe4, 0xfc, 0x85, 0x9c, 0x73, 0x75, 0x58, 0x84, 0xaa, 0x87, 0xa3, 0xf0, - 0x36, 0x3e, 0xc3, 0xcc, 0x80, 0x17, 0x97, 0xcf, 0x7f, 0x84, 0x07, 0xf1, - 0x55, 0x98, 0x77, 0x30, 0x05, 0x68, 0x15, 0xbd, 0xdf, 0x56, 0xfe, 0x03, - 0xeb, 0x44, 0x30, 0x01, 0x80, 0x10, 0x75, 0x7d, 0x5e, 0xa5, 0xb8, 0x26, - 0x11, 0x87, 0xaf, 0xa5, 0x47, 0xb1, 0x4a, 0x6f, 0xea, 0xda, 0x5d, 0x6c, - 0x87, 0x28, 0x50, 0xc1, 0x7d, 0xe6, 0x2c, 0xd5, 0x1c, 0xcc, 0x1c, 0xa0, - 0x54, 0x25, 0x41, 0xa9, 0xc9, 0x43, 0x7a, 0x55, 0x58, 0x89, 0xaf, 0xb0, - 0xa2, 0xff, 0x66, 0x5b, 0x6b, 0x2a, 0x27, 0x16, 0xad, 0x58, 0xa9, 0xdc, - 0x2d, 0xcd, 0x2e, 0xb7, 0x9f, 0xa0, 0xe0, 0x03, 0x6b, 0xda, 0xd6, 0x86, - 0x26, 0x82, 0x6a, 0x90, 0xda, 0xb7, 0xb6, 0xc8, 0xbf, 0x5e, 0xa0, 0x95, - 0xb5, 0xb9, 0x52, 0x35, 0x5f, 0xfc, 0x17, 0x75, 0x95, 0x93, 0x8d, 0x57, - 0xf0, 0xfb, 0x5a, 0xed, 0x97, 0x42, 0xb5, 0xb9, 0x95, 0xfb, 0x8b, 0x00, - 0x76, 0xe5, 0x1f, 0x83, 0x3d, 0xb7, 0xa3, 0xfb, 0xbe, 0xbb, 0x01, 0x4e, - 0x46, 0xf6, 0x1a, 0xc7, 0xad, 0x43, 0x80, 0x61, 0x37, 0x52, 0xc9, 0x28, - 0x3c, 0x7e, 0xfd, 0x1d, 0x9d, 0x1e, 0x4f, 0x87, 0x21, 0x6e, 0xd6, 0xf9, - 0x10, 0x8b, 0x67, 0x29, 0x40, 0x9a, 0x58, 0xa8, 0xa1, 0xe0, 0xc7, 0x3c, - 0x16, 0xbf, 0xa4, 0xd4, 0xae, 0x5f, 0xf9, 0xaa, 0x01, 0x54, 0xe9, 0x43, - 0x87, 0xa7, 0xb5, 0x76, 0x0c, 0x07, 0x62, 0x85, 0x44, 0x60, 0xe8, 0xe5, - 0x84, 0xed, 0xc2, 0x0c, 0x7c, 0xf2, 0x74, 0xe5, 0xd3, 0x9e, 0x03, 0x78, - 0xa3, 0xd2, 0xb3, 0xc7, 0x1a, 0xb1, 0xbe, 0xd5, 0x9b, 0x0b, 0x91, 0xb2, - 0x93, 0x66, 0xd2, 0x0a, 0x43, 0x69, 0x72, 0x2d, 0xdc, 0x0c, 0x61, 0xf3, - 0x58, 0xff, 0xe8, 0x1e, 0x70, 0xdc, 0x88, 0x09, 0xb0, 0x0a, 0x18, 0xfb, - 0xfb, 0xa2, 0x36, 0xf6, 0xa6, 0x20, 0x9b, 0xea, 0xae, 0x21, 0xa5, 0x37, - 0x05, 0x3e, 0x7a, 0x59, 0xb3, 0x2f, 0x9e, 0x6a, 0x86, 0x6e, 0xa1, 0x2b, - 0x43, 0x63, 0xec, 0xea, 0x0b, 0x45, 0xc5, 0xcc, 0x3e, 0x50, 0xba, 0xdc, - 0x9d, 0x0f, 0x97, 0x04, 0x54, 0x00, 0x99, 0x84, 0x42, 0x9d, 0xa8, 0xe2, - 0x76, 0x7e, 0x57, 0xa4, 0x6c, 0x99, 0x30, 0x2a, 0xce, 0x50, 0xb7, 0x29, - 0xd4, 0x8d, 0x0d, 0x81, 0xa0, 0x64, 0xe3, 0x2b, 0xb9, 0xf2, 0xc1, 0x72, - 0x56, 0xba, 0x02, 0x5f, 0x95, 0xa4, 0xce, 0x13, 0xfe, 0x9f, 0x76, 0xb6, - 0xe4, 0x57, 0xe6, 0x70, 0xed, 0xdf, 0xf6, 0x29, 0x34, 0xd0, 0xba, 0xa1, - 0x32, 0xf2, 0xeb, 0x5a, 0xa5, 0xcd, 0x3c, 0xa1, 0xab, 0x1a, 0x8f, 0x84, - 0xdf, 0x72, 0x66, 0xc2, 0x12, 0xa2, 0x80, 0x78, 0xd1, 0x57, 0xaf, 0x92, - 0x28, 0x16, 0xb1, 0x98, 0x2a, 0xf8, 0xf6, 0x8c, 0xa7, 0xf5, 0x74, 0x77, - 0x55, 0xeb, 0x3e, 0x2c, 0x90, 0x5f, 0xb3, 0x2c, 0x53, 0xa0, 0x22, 0x76, - 0x40, 0x98, 0x14, 0x1a, 0x58, 0x16, 0x63, 0x55, 0x90, 0x34, 0x66, 0xb3, - 0x90, 0xe0, 0x4c, 0xc5, 0x0b, 0x00, 0x4a, 0x86, 0x90, 0x5f, 0xc6, 0xce, - 0xaa, 0x72, 0x32, 0x76, 0xc6, 0x94, 0xb0, 0xf5, 0xcb, 0xe9, 0xbb, 0x18, - 0x55, 0xcf, 0x1c, 0x7a, 0x77, 0x97, 0x18, 0x7a, 0xcd, 0xe3, 0xe2, 0xc6, - 0x77, 0xcd, 0x52, 0x84, 0xa8, 0x26, 0x64, 0xc2, 0x9e, 0xd0, 0xb1, 0xca, - 0xc2, 0x0c, 0xd6, 0x24, 0xea, 0xda, 0x6a, 0xa8, 0x6f, 0xe6, 0x81, 0x42, - 0xff, 0xd2, 0xfd, 0xbe, 0x28, 0xd6, 0x9e, 0x00, 0x41, 0x94, 0x02, 0x5d, - 0xa4, 0xe5, 0x40, 0x15, 0x95, 0xdc, 0x9b, 0x16, 0x2e, 0x46, 0xaa, 0x81, - 0x6f, 0x01, 0xb2, 0x58, 0x66, 0x65, 0x3b, 0x39, 0x21, 0xa5, 0xd5, 0xad, - 0x34, 0x4d, 0x8f, 0xdf, 0xf9, 0xca, 0x87, 0xfa, 0xac, 0x2a, 0x0b, 0x58, - 0x95, 0xfa, 0x6c, 0x40, 0x8f, 0x9d, 0x55, 0x7d, 0x1c, 0xcb, 0x88, 0x9d, - 0x8a, 0x11, 0x12, 0xcf, 0xed, 0x8c, 0x1c, 0xbc, 0x98, 0xcc, 0x53, 0x89, - 0x5e, 0x69, 0xb5, 0x3c, 0x05, 0x6c, 0x43, 0xbb, 0x5c, 0xc6, 0x7f, 0x45, - 0x78, 0xf8, 0xbb, 0x59, 0x41, 0xcc, 0x06, 0x15, 0x4a, 0xcc, 0xfc, 0xee, - 0x63, 0xac, 0xbe, 0xae, 0x6f, 0x2a, 0x72, 0xad, 0x4e, 0xb5, 0xc4, 0x31, - 0x87, 0xbc, 0xe8, 0xf0, 0x00, 0x31, 0x00, 0x32, 0x8c, 0xd1, 0x9a, 0xc4, - 0xe7, 0x5c, 0x4f, 0x9e, 0x25, 0x76, 0xa2, 0x57, 0x9e, 0xbd, 0x0e, 0xca, - 0x7b, 0xb0, 0x79, 0x3f, 0x62, 0x40, 0x19, 0x19, 0x08, 0x65, 0x5c, 0x28, - 0xa2, 0x5d, 0xe6, 0x27, 0x2e, 0x26, 0x29, 0xb1, 0x68, 0x9b, 0xd3, 0x41, - 0x15, 0xd2, 0xdc, 0x3e, 0x8a, 0x48, 0x21, 0x7b, 0xe0, 0x54, 0x27, 0x4d, - 0xdd, 0x00, 0x06, 0xf9, 0xbd, 0x6d, 0xb0, 0x3f, 0x15, 0x52, 0xff, 0x66, - 0x37, 0x51, 0x88, 0xce, 0xbe, 0x88, 0x39, 0x86, 0xd9, 0xc0, 0x72, 0x06, - 0xf4, 0x55, 0xeb, 0x87, 0xc7, 0x1b, 0xc6, 0x44, 0x39, 0x6b, 0x2c, 0xe6, - 0xec, 0x7c, 0x59, 0x83, 0xa6, 0x99, 0x45, 0x15, 0x1e, 0x5c, 0x42, 0x73, - 0xbf, 0x59, 0x6d, 0x78, 0x95, 0xbc, 0x03, 0x17, 0x41, 0x27, 0x4f, 0x46, - 0xb0, 0xaa, 0x66, 0xfa, 0x5c, 0x16, 0xc1, 0x5c, 0x84, 0x69, 0x64, 0x44, - 0x52, 0x4c, 0x9d, 0x6a, 0x52, 0x83, 0x34, 0xa9, 0xbf, 0xce, 0x4d, 0x36, - 0xfc, 0x23, 0xf7, 0xb0, 0x4e, 0x6f, 0x2c, 0x91, 0xed, 0x5f, 0xfd, 0xcd, - 0x90, 0x8d, 0x98, 0xf3, 0xdb, 0x8e, 0x89, 0x82, 0xbf, 0x71, 0xc1, 0x5e, - 0xcc, 0x0f, 0x2f, 0x3f, 0x60, 0x2d, 0xaa, 0x81, 0xb1, 0x77, 0x8c, 0xe2, - 0xc3, 0x2c, 0x25, 0x7f, 0xc9, 0x51, 0x3e, 0x4b, 0xc0, 0xa2, 0x6d, 0x09, - 0xd9, 0xda, 0x5d, 0xe1, 0x46, 0x45, 0x5d, 0x38, 0x19, 0x16, 0x16, 0x1d, - 0x00, 0x19, 0x98, 0x58, 0x81, 0x18, 0xd2, 0xd5, 0xb6, 0x12, 0x23, 0x87, - 0x8e, 0x4d, 0x2a, 0x4a, 0xf0, 0xdc, 0xd2, 0xb4, 0x76, 0x53, 0xcb, 0x84, - 0x8e, 0xbd, 0x39, 0xdb, 0x86, 0x5d, 0x5f, 0xc7, 0x3a, 0xdb, 0xe2, 0x41, - 0xaa, 0x31, 0x25, 0xc4, 0x4e, 0xb0, 0xa6, 0x69, 0x63, 0x13, 0x8c, 0x70, - 0x1a, 0xf0, 0x7f, 0xf5, 0x56, 0x56, 0x3b, 0x7e, 0xd4, 0x9f, 0xd2, 0x99, - 0x38, 0x69, 0xa3, 0x15, 0x12, 0x75, 0x72, 0x4c, 0x1e, 0xc6, 0xb3, 0xf3, - 0x1d, 0xf5, 0xfe, 0x99, 0xe6, 0x81, 0xad, 0xea, 0xb6, 0xc4, 0xca, 0x28, - 0x42, 0x3d, 0x84, 0xeb, 0x88, 0x89, 0x6d, 0x1d, 0x23, 0x1a, 0x59, 0x93, - 0x30, 0x57, 0xda, 0x19, 0x27, 0xfb, 0x07, 0xaa, 0xa0, 0xac, 0xb3, 0xda, - 0x52, 0x15, 0xf2, 0xb3, 0xd6, 0x5e, 0x7f, 0x08, 0xba, 0xe4, 0xac, 0x48, - 0xaf, 0x40, 0x31, 0xb0, 0x90, 0x12, 0x6b, 0x22, 0xd1, 0x49, 0xe2, 0x7a, - 0x88, 0x0d, 0x5d, 0x9d, 0x0e, 0x41, 0xae, 0x12, 0x28, 0x89, 0xb0, 0xcc, - 0xfb, 0x1d, 0x77, 0x52, 0xb6, 0x2c, 0x24, 0x56, 0xbc, 0x35, 0x22, 0x29, - 0x77, 0x97, 0x90, 0x08, 0x99, 0x75, 0x59, 0xe9, 0x63, 0x7a, 0x37, 0xd2, - 0x12, 0x65, 0x4d, 0xa8, 0x74, 0x5f, 0xfa, 0xcd, 0x15, 0xef, 0xc6, 0x0b, - 0x68, 0xd7, 0x94, 0xf3, 0x34, 0x2d, 0xb7, 0x60, 0x3b, 0x88, 0xec, 0xf7, - 0x1f, 0xf4, 0x07, 0xd0, 0x9a, 0x39, 0x3a, 0x70, 0x27, 0x0f, 0xdb, 0x0a, - 0x8d, 0xb4, 0xc5, 0x92, 0x26, 0x6f, 0x5c, 0xcb, 0xdf, 0xe8, 0x37, 0x73, - 0x1f, 0x1f, 0x0f, 0xe5, 0x4f, 0x25, 0x1b, 0x3a, 0x12, 0xdf, 0x0e, 0x8b, - 0x8c, 0x8e, 0x25, 0x23, 0xf7, 0xec, 0x9c, 0xca, 0xea, 0xa2, 0x58, 0x54, - 0xd7, 0xa1, 0x38, 0x07, 0x84, 0x64, 0x54, 0xf9, 0x64, 0x47, 0x2d, 0x64, - 0x42, 0xaa, 0x62, 0x11, 0x8e, 0xc0, 0x06, 0xaa, 0xb5, 0xe3, 0xcb, 0x4b, - 0x43, 0x87, 0x29, 0xd0, 0xef, 0x1b, 0xbe, 0xca, 0x45, 0x51, 0x87, 0xcc, - 0xca, 0x1b, 0xc0, 0x12, 0x7a, 0xed, 0x56, 0xa7, 0x03, 0x01, 0x3f, 0x6a, - 0x40, 0xc7, 0xb9, 0x4f, 0xea, 0xa5, 0x22, 0x9c, 0x72, 0xdd, 0x14, 0x1e, - 0x84, 0xcf, 0xb7, 0x9d, 0x2a, 0xe1, 0xff, 0x71, 0x7a, 0x9b, 0x94, 0x6b, - 0xc9, 0xf5, 0x5f, 0x18, 0xfd, 0x6f, 0x61, 0x3a, 0x16, 0x47, 0x1d, 0x4d, - 0x34, 0x09, 0x02, 0x3c, 0xcd, 0xb6, 0x19, 0xd3, 0xac, 0xaa, 0xdb, 0x52, - 0xba, 0xdf, 0x1b, 0xee, 0xc3, 0x4d, 0x02, 0xe3, 0x3e, 0xcb, 0x91, 0x22, - 0xd4, 0xdf, 0xc6, 0xef, 0x97, 0x97, 0x8b, 0x73, 0x57, 0x3f, 0xa9, 0xd5, - 0x1e, 0xc2, 0x37, 0x08, 0xc0, 0xc5, 0x80, 0x88, 0xe6, 0xbe, 0xfc, 0x8b, - 0xfe, 0x71, 0x96, 0x50, 0xb7, 0x60, 0x70, 0x05, 0xf4, 0x15, 0xaa, 0x9a, - 0xd3, 0x5f, 0x7a, 0xc5, 0x59, 0x2f, 0x81, 0x23, 0x20, 0xf0, 0xa2, 0x83, - 0x34, 0xc7, 0xd2, 0x3c, 0x41, 0x18, 0xce, 0xb6, 0x96, 0x40, 0x35, 0xea, - 0x43, 0x36, 0x8b, 0x7b, 0x87, 0x96, 0x99, 0x75, 0xa6, 0xad, 0xa8, 0xb2, - 0xe2, 0xbb, 0x43, 0x08, 0xe7, 0x72, 0xfe, 0x76, 0x88, 0x4b, 0x5c, 0x2b, - 0xd8, 0x97, 0xfd, 0x97, 0xcc, 0xc3, 0x1f, 0xc7, 0xa5, 0xdf, 0x9e, 0x0e, - 0xf6, 0xbe, 0xdb, 0x6d, 0x83, 0x27, 0x3a, 0x5f, 0x44, 0x61, 0x68, 0xc9, - 0xb9, 0xeb, 0x6d, 0xb5, 0x11, 0xde, 0x49, 0xee, 0x55, 0x53, 0xd3, 0xba, - 0xef, 0xd7, 0xf8, 0x29, 0xd0, 0x3a, 0x66, 0x6f, 0x45, 0xd6, 0xb6, 0x46, - 0x6a, 0x0c, 0xec, 0x5a, 0x01, 0x5d, 0x31, 0x24, 0x05, 0xda, 0x90, 0x69, - 0x92, 0x5e, 0x38, 0x5a, 0xa3, 0xf1, 0x0e, 0x31, 0x6c, 0xa5, 0x01, 0xd5, - 0x87, 0xb7, 0xa9, 0x82, 0xd7, 0xb2, 0x9f, 0xf9, 0xcb, 0x81, 0x0a, 0xd0, - 0x26, 0x51, 0x2a, 0xea, 0x9a, 0x1c, 0x01, 0xf4, 0x12, 0x2d, 0xd8, 0x19, - 0x45, 0x90, 0x35, 0xe0, 0xbf, 0x99, 0x87, 0x77, 0x1f, 0xc5, 0xb1, 0xf8, - 0xef, 0xa6, 0x06, 0xea, 0x4d, 0x20, 0xe4, 0x73, 0x47, 0x7d, 0x72, 0x0a, - 0x51, 0x11, 0xdd, 0x60, 0x83, 0x82, 0xc3, 0xc7, 0x18, 0x42, 0xfb, 0x6c, - 0xc0, 0xf1, 0x4c, 0x0c, 0x31, 0x6f, 0xe5, 0x60, 0xca, 0x4c, 0xd7, 0x65, - 0x9c, 0x63, 0x92, 0xce, 0xb4, 0x85, 0x5b, 0x52, 0x5d, 0x76, 0x6e, 0x8d, - 0x73, 0x18, 0x16, 0x2f, 0x07, 0xc1, 0xbf, 0xe4, 0x09, 0x39, 0x28, 0xfd, - 0x79, 0x65, 0x7d, 0x9e, 0xbc, 0x28, 0x76, 0xdf, 0x2f, 0x11, 0x5d, 0x37, - 0x90, 0xfc, 0x67, 0x07, 0x87, 0xaa, 0x7f, 0x8a, 0xe6, 0xbf, 0x06, 0x75, - 0xea, 0xa7, 0xd7, 0xf1, 0xa3, 0xb4, 0xe6, 0x57, 0xd3, 0xc5, 0x44, 0x88, - 0xd1, 0xcb, 0x24, 0x34, 0x98, 0x74, 0x23, 0x4e, 0x0e, 0x96, 0x29, 0x7c, - 0x29, 0x6c, 0x71, 0x3b, 0x3e, 0x7c, 0x51, 0x4f, 0xd9, 0x4f, 0xb5, 0x6d, - 0xc6, 0x87, 0x97, 0xe9, 0x01, 0x00, 0x7b, 0x83, 0xb1, 0x04, 0x22, 0x8e, - 0xa7, 0x46, 0x1c, 0xa4, 0xc6, 0xd3, 0xa1, 0xe4, 0x57, 0xe3, 0x78, 0x91, - 0xdb, 0x1a, 0x8c, 0xba, 0x97, 0x2f, 0x05, 0x3d, 0x34, 0x1e, 0x10, 0x11, - 0x67, 0x91, 0xf8, 0x41, 0xf7, 0x3c, 0x47, 0xaa, 0xf1, 0x0c, 0x87, 0xcb, - 0x10, 0x52, 0x7d, 0x72, 0x40, 0xfb, 0x37, 0xe6, 0x80, 0x5b, 0x55, 0xbe, - 0x90, 0xc4, 0x99, 0x4b, 0xaa, 0x6c, 0x9c, 0x1f, 0x1e, 0xb6, 0x29, 0xef, - 0xbf, 0x57, 0x6f, 0xf5, 0x6b, 0x80, 0x4d, 0x62, 0x84, 0x96, 0x6e, 0x59, - 0x27, 0x57, 0xd9, 0xf2, 0xde, 0x0d, 0xcc, 0x72, 0xb6, 0xa0, 0x99, 0x56, - 0xba, 0xb8, 0xac, 0x3d, 0x0d, 0x8d, 0x4b, 0x9b, 0x93, 0xe0, 0x9b, 0xaf, - 0xa4, 0x5c, 0x86, 0xa4, 0x34, 0xb8, 0x14, 0xba, 0x54, 0xb0, 0x06, 0x52, - 0x99, 0xa7, 0x32, 0x41, 0x65, 0x65, 0xc9, 0x6f, 0x56, 0x03, 0x56, 0xe2, - 0x34, 0x5e, 0x47, 0x0e, 0xad, 0x55, 0x41, 0x0f, 0x84, 0x08, 0x0c, 0x67, - 0x29, 0x0c, 0x2d, 0xa9, 0x6d, 0x70, 0xe4, 0x9d, 0x28, 0x8d, 0xcd, 0xe7, - 0x9e, 0x5c, 0x1c, 0x2e, 0x4c, 0x7c, 0x7d, 0x6a, 0x1a, 0x23, 0xba, 0xbc, - 0x76, 0x8d, 0x08, 0x4c, 0x76, 0xb1, 0x8e, 0xa5, 0x1f, 0x3e, 0x78, 0xd8, - 0x67, 0x82, 0x73, 0x28, 0x49, 0xa4, 0xd3, 0x75, 0xec, 0xe0, 0xac, 0xf6, - 0xff, 0x43, 0xd2, 0x14, 0x95, 0xc7, 0x7a, 0x14, 0x51, 0x97, 0x27, 0xe4, - 0xcb, 0x4d, 0xcd, 0x43, 0x24, 0x4f, 0x63, 0xe8, 0x6c, 0xd6, 0x3a, 0x8c, - 0xfc, 0xae, 0xc5, 0x2b, 0xc8, 0xfc, 0x42, 0xae, 0x39, 0x62, 0xf4, 0x73, - 0xc4, 0x53, 0xb7, 0x1e, 0xb8, 0xb9, 0x9a, 0x4c, 0x29, 0x50, 0xc4, 0x55, - 0x26, 0x70, 0x62, 0x8b, 0xdf, 0x56, 0x29, 0x14, 0x57, 0xb4, 0x45, 0xcd, - 0x24, 0x33, 0x07, 0x82, 0x71, 0xae, 0x79, 0x27, 0x77, 0xc5, 0x55, 0xdc, - 0xdb, 0x4d, 0x06, 0xb4, 0x16, 0xfe, 0x26, 0xc7, 0x1b, 0xf1, 0xbf, 0x56, - 0x7c, 0x5f, 0xa4, 0x61, 0xee, 0xbc, 0xc4, 0x72, 0x92, 0x3d, 0x80, 0xb9, - 0xb6, 0x68, 0x9f, 0xfb, 0x83, 0xa8, 0x3e, 0x3a, 0x7f, 0x74, 0x23, 0x50, - 0x3b, 0x07, 0xc3, 0x7e, 0x57, 0x01, 0x8b, 0x89, 0x26, 0x28, 0x8c, 0xf5, - 0x70, 0xd8, 0x5c, 0xb1, 0x69, 0x44, 0xb9, 0x88, 0x77, 0xd8, 0x15, 0x48, - 0x1d, 0x37, 0xdf, 0x8e, 0xc2, 0x3c, 0xc9, 0xd6, 0x8b, 0xd5, 0x4b, 0x49, - 0x7e, 0xe9, 0x23, 0xf2, 0x9d, 0x23, 0x47, 0x42, 0x61, 0x74, 0x2f, 0x31, - 0xe2, 0x2f, 0x4e, 0xf5, 0x8e, 0xd7, 0x8c, 0x04, 0x0d, 0xef, 0xfe, 0xed, - 0x79, 0xc1, 0x23, 0xab, 0x82, 0xc1, 0xad, 0xe2, 0x06, 0x7e, 0x2e, 0x24, - 0xeb, 0x40, 0x58, 0x64, 0x73, 0x61, 0x61, 0xc0, 0x85, 0x2c, 0x28, 0x5c, - 0xd7, 0xb8, 0xe1, 0x1c, 0xb2, 0x87, 0x7d, 0x82, 0xc0, 0x3f, 0x5e, 0xa0, - 0x8e, 0xa2, 0xe4, 0xa3, 0x17, 0x72, 0x0d, 0x16, 0x11, 0x24, 0xde, 0xa4, - 0x8c, 0xae, 0x75, 0xc5, 0xe4, 0xf7, 0x41, 0x90, 0xe7, 0xb3, 0xe8, 0x06, - 0xc8, 0x3d, 0x9c, 0x77, 0x8d, 0x58, 0x56, 0xb7, 0x05, 0x8d, 0x7d, 0xcd, - 0x45, 0x0b, 0xcf, 0xd4, 0x66, 0x46, 0xca, 0xe6, 0xc2, 0x08, 0x00, 0x13, - 0x5c, 0xf8, 0x69, 0xc6, 0xca, 0xaa, 0xb9, 0xfc, 0x05, 0x17, 0x1d, 0xfd, - 0x52, 0x86, 0x42, 0xe1, 0x41, 0x2e, 0xc0, 0x03, 0xf7, 0x1b, 0xd2, 0xba, - 0xb7, 0x93, 0x95, 0xfb, 0x7f, 0x83, 0xe2, 0xca, 0x61, 0xc3, 0xb9, 0xb9, - 0x99, 0x12, 0x7a, 0x08, 0x56, 0x2f, 0x1f, 0x10, 0xd0, 0x35, 0x8d, 0x47, - 0xdd, 0x00, 0xe9, 0xc8, 0xa8, 0x05, 0xad, 0xbc, 0x15, 0xee, 0xcb, 0x1d, - 0xff, 0xdc, 0xbc, 0x0a, 0xee, 0xde, 0xb2, 0xe2, 0xc2, 0x69, 0x4f, 0x8c, - 0xea, 0x9d, 0x85, 0x44, 0x7a, 0xcd, 0xc8, 0xc3, 0xff, 0x89, 0x53, 0x70, - 0x16, 0x72, 0x68, 0xcc, 0xc6, 0xfd, 0xfc, 0xed, 0xd2, 0xf0, 0x1c, 0xb5, - 0x21, 0xc2, 0x7e, 0xf3, 0xef, 0x21, 0x54, 0x23, 0x31, 0x9f, 0x24, 0x36, - 0x33, 0x70, 0xad, 0xe1, 0xe7, 0x9e, 0x7f, 0x27, 0xa9, 0xaf, 0xb3, 0xda, - 0x0a, 0x8d, 0x1c, 0xd8, 0x4a, 0xde, 0x65, 0x73, 0x51, 0xe9, 0x79, 0x51, - 0x66, 0x5c, 0xb0, 0x0c, 0x05, 0xa0, 0x1a, 0xbe, 0xc9, 0x9b, 0xab, 0x90, - 0x7e, 0x20, 0x92, 0xda, 0x2c, 0xd6, 0x15, 0xf2, 0x53, 0xb5, 0x15, 0x23, - 0x91, 0xe8, 0x05, 0x5f, 0xf5, 0x75, 0x1d, 0x8a, 0x90, 0x6c, 0x95, 0x38, - 0xd0, 0xd6, 0x81, 0xc4, 0x09, 0x54, 0x3d, 0x99, 0x06, 0xe8, 0xd4, 0x7d, - 0x85, 0x63, 0xf4, 0x50, 0x74, 0xe5, 0xc4, 0xb6, 0x87, 0x59, 0xfd, 0x84, - 0x12, 0x53, 0x4c, 0x59, 0x63, 0x63, 0x2d, 0x2d, 0xf0, 0x1e, 0xbe, 0x52, - 0x95, 0x08, 0xb7, 0x76, 0x08, 0x64, 0x5b, 0x61, 0x1f, 0x4a, 0x3c, 0xa2, - 0xad, 0x66, 0xfb, 0x54, 0x8d, 0x97, 0xbe, 0x46, 0x1e, 0xd6, 0x9a, 0xbb, - 0x4e, 0xcb, 0x14, 0x48, 0x83, 0xee, 0x21, 0x95, 0xd1, 0x74, 0x26, 0x4c, - 0x7a, 0xb2, 0xf0, 0xb8, 0x8e, 0x74, 0xa7, 0x84, 0xb0, 0xa1, 0xf7, 0x5f, - 0xf4, 0x59, 0x38, 0x3d, 0x43, 0x35, 0x9a, 0xec, 0x7c, 0x61, 0xe8, 0xa6, - 0x4c, 0xc5, 0xe9, 0x21, 0xd1, 0x31, 0xa5, 0x35, 0x78, 0x8c, 0x8b, 0xd5, - 0x9b, 0x0f, 0xbc, 0x8e, 0xc4, 0x14, 0x7f, 0xeb, 0x8e, 0x2e, 0x66, 0xc9, - 0x8d, 0xcd, 0xac, 0xc7, 0xa2, 0x28, 0xd4, 0x67, 0xab, 0x03, 0x29, 0xff, - 0xd0, 0x16, 0xc2, 0xf4, 0x41, 0x73, 0x70, 0x23, 0xf0, 0xfe, 0x3d, 0x2f, - 0xbd, 0x26, 0xbd, 0x51, 0xaf, 0x01, 0x78, 0xa4, 0x13, 0x36, 0xc2, 0xfe, - 0x0d, 0x02, 0xe0, 0xd2, 0x47, 0x18, 0xb3, 0x76, 0x7d, 0x47, 0x82, 0xf0, - 0xc2, 0xd9, 0x91, 0x7d, 0xaf, 0x3f, 0x1d, 0x03, 0x86, 0x39, 0x1d, 0x4b, - 0xf8, 0x5f, 0x7f, 0xa0, 0x8e, 0xfd, 0xa6, 0x18, 0xb9, 0xc4, 0xa7, 0xd7, - 0xb0, 0x86, 0x78, 0xd4, 0xda, 0x00, 0x4e, 0x97, 0x0c, 0x44, 0x7f, 0xac, - 0x31, 0xa5, 0xad, 0x9a, 0x11, 0xa9, 0xdd, 0x43, 0x16, 0x52, 0x22, 0x66, - 0x8a, 0xa7, 0xf7, 0x09, 0x71, 0x4c, 0x3a, 0x8a, 0xe5, 0x82, 0x53, 0x9b, - 0x0f, 0xd4, 0x2b, 0x66, 0xc0, 0xc4, 0x4f, 0x79, 0x52, 0x37, 0x41, 0x9c, - 0x3e, 0x8c, 0x2f, 0x2a, 0xd3, 0xe4, 0x5a, 0xcd, 0xf7, 0x38, 0xb7, 0x7e, - 0x35, 0x99, 0x1a, 0x41, 0x84, 0x8f, 0x67, 0x57, 0xb4, 0xb0, 0xde, 0xa1, - 0xec, 0x3a, 0x92, 0x37, 0xf8, 0x3f, 0x31, 0x34, 0x51, 0x40, 0x76, 0xe2, - 0xc1, 0xa2, 0x65, 0x90, 0xde, 0xa6, 0xb4, 0xf5, 0xc8, 0x79, 0xf1, 0xb7, - 0x47, 0x3b, 0x47, 0x21, 0x33, 0xb2, 0xad, 0xe8, 0x43, 0xe1, 0x59, 0x60, - 0x14, 0x86, 0x25, 0x4b, 0x66, 0x56, 0x36, 0x2b, 0x54, 0xc5, 0x9d, 0x74, - 0x85, 0xf4, 0x3d, 0x5d, 0x03, 0x60, 0xa5, 0xa3, 0x54, 0xed, 0xc4, 0xf8, - 0x63, 0xb7, 0x6b, 0xe6, 0xe6, 0xb0, 0x1e, 0x4e, 0xeb, 0x16, 0xf8, 0xcd, - 0x08, 0xef, 0x67, 0xa3, 0xf3, 0x24, 0x68, 0x21, 0x8f, 0x43, 0xae, 0x47, - 0x78, 0x32, 0xa3, 0xd7, 0xed, 0x45, 0x33, 0x63, 0x9b, 0x49, 0x6d, 0x4f, - 0xa4, 0x8d, 0xf7, 0x55, 0x41, 0xe8, 0xd3, 0x3c, 0x18, 0x17, 0xdd, 0x9f, - 0xd9, 0x8a, 0xaa, 0xc7, 0xb3, 0xff, 0xc9, 0xc2, 0x41, 0x1a, 0x1c, 0xf0, - 0xc9, 0x27, 0x6d, 0x3f, 0xdb, 0x52, 0xac, 0xca, 0xdf, 0xac, 0x83, 0xa8, - 0x7a, 0x77, 0xe3, 0xeb, 0xb4, 0x5f, 0xc2, 0x88, 0x54, 0x8d, 0x65, 0x22, - 0x73, 0x1a, 0xb1, 0x08, 0xd1, 0xda, 0xf7, 0x13, 0x2b, 0x31, 0xfc, 0xf7, - 0x24, 0x64, 0x99, 0x38, 0x94, 0x0c, 0x06, 0x9d, 0x1a, 0x3e, 0x90, 0xd2, - 0x97, 0xd4, 0x4c, 0xa3, 0x90, 0xe0, 0x41, 0x51, 0x81, 0xb9, 0xa7, 0x8d, - 0x02, 0x2b, 0xe3, 0xbe, 0x92, 0xe5, 0x8e, 0xc0, 0xd6, 0x8f, 0xce, 0x3b, - 0x90, 0x22, 0xfb, 0xf3, 0xdb, 0x70, 0x95, 0xf5, 0xc6, 0xde, 0x6e, 0xcb, - 0x5e, 0x93, 0xfc, 0x8d, 0x17, 0xfd, 0xce, 0x02, 0x05, 0x1d, 0x57, 0xd1, - 0xaa, 0x48, 0x15, 0xa1, 0x69, 0xef, 0xc8, 0x96, 0xe0, 0x37, 0x60, 0x6a, - 0xae, 0xc8, 0xe7, 0x08, 0xd2, 0xa3, 0x5d, 0xd2, 0x2b, 0x36, 0x52, 0x8f, - 0x40, 0x80, 0xa6, 0x76, 0x59, 0x09, 0xad, 0x0e, 0x03, 0x7c, 0xd7, 0x8f, - 0xfd, 0x2a, 0x1b, 0x9d, 0xa3, 0x3b, 0x0a, 0xac, 0xac, 0xbb, 0x45, 0x73, - 0x34, 0xa5, 0xff, 0x8e, 0xb0, 0x2a, 0x06, 0x37, 0x32, 0x85, 0xcb, 0x93, - 0x3b, 0x65, 0xbc, 0xa4, 0x38, 0x6e, 0x9b, 0xb0, 0xf0, 0x19, 0x65, 0x6b, - 0xf1, 0xcd, 0x25, 0xf9, 0xa3, 0xcd, 0xb0, 0x63, 0x02, 0xd0, 0x87, 0x18, - 0x6c, 0xd6, 0x37, 0xf7, 0xcb, 0xe2, 0x97, 0xc8, 0x82, 0xe0, 0x07, 0x67, - 0x55, 0xac, 0x67, 0xdd, 0xb3, 0x3b, 0x7d, 0xc8, 0x6a, 0x33, 0x71, 0xc4, - 0xea, 0x5b, 0x23, 0xcc, 0x3b, 0x3c, 0xd6, 0x2c, 0xab, 0x7f, 0xce, 0xd3, - 0x9b, 0x60, 0x86, 0xc2, 0x35, 0x88, 0x8e, 0x4b, 0x36, 0xa7, 0x9a, 0x5c, - 0x4f, 0xa9, 0x73, 0x4e, 0xd6, 0x7b, 0xcc, 0x9a, 0x14, 0xf9, 0xfc, 0x92, - 0x38, 0x14, 0x9b, 0x0b, 0x98, 0x47, 0xb1, 0xf7, 0x64, 0xb8, 0x90, 0xe2, - 0x3d, 0x9c, 0x65, 0xe2, 0x84, 0xf8, 0x72, 0x4a, 0x94, 0x2e, 0x4d, 0x07, - 0xb7, 0x10, 0x67, 0x54, 0x23, 0xad, 0x52, 0x46, 0x71, 0xa9, 0x3f, 0x2d, - 0x2e, 0x55, 0xfd, 0x82, 0x7e, 0x4e, 0x98, 0x4e, 0xe7, 0x21, 0xc1, 0xb5, - 0x85, 0xe3, 0x88, 0x88, 0xe1, 0xc5, 0x0e, 0xdc, 0xda, 0x17, 0x4f, 0x65, - 0x92, 0x65, 0xe0, 0x67, 0x3e, 0x9c, 0x86, 0x81, 0x37, 0x33, 0x3a, 0x56, - 0x60, 0x17, 0xf9, 0x8f, 0x1e, 0x49, 0xae, 0x0a, 0x02, 0x65, 0x59, 0xb3, - 0x88, 0x52, 0xa4, 0xb6, 0xbc, 0x88, 0x8a, 0x54, 0xf0, 0x1f, 0x97, 0x50, - 0x2c, 0x51, 0x1b, 0x36, 0xbd, 0xbf, 0x0c, 0xc4, 0xf0, 0xf9, 0x84, 0x02, - 0x9f, 0x67, 0xad, 0xcb, 0x73, 0x23, 0x0d, 0x99, 0x25, 0x5e, 0xd8, 0xb4, - 0xeb, 0x89, 0x47, 0x43, 0x51, 0xf1, 0x68, 0xc8, 0x2c, 0x2a, 0x8d, 0xeb, - 0xc6, 0x12, 0x9d, 0x0f, 0x35, 0xa4, 0xe0, 0x6e, 0x6a, 0x6e, 0xc4, 0x57, - 0x61, 0x23, 0x10, 0x0b, 0xd5, 0x08, 0xf6, 0x50, 0x83, 0x29, 0x40, 0xdc, - 0x59, 0xc9, 0x40, 0xf4, 0x6b, 0xa8, 0xe4, 0x28, 0x54, 0x49, 0x62, 0xf1, - 0xd7, 0xa0, 0xe3, 0x06, 0x9e, 0x43, 0x4a, 0xc3, 0x0f, 0x7a, 0x1b, 0xcf, - 0xea, 0x60, 0x42, 0xef, 0xb1, 0x8a, 0x7b, 0x08, 0xe8, 0x05, 0xa1, 0x7a, - 0x79, 0xfa, 0xe6, 0x15, 0xce, 0x87, 0x57, 0x43, 0x90, 0xc1, 0x62, 0xa1, - 0x89, 0xe8, 0xb2, 0x5b, 0x26, 0xfb, 0x80, 0x75, 0x7d, 0x89, 0x79, 0x5a, - 0xf4, 0xdc, 0xa5, 0x3d, 0x1f, 0x95, 0x5f, 0x05, 0xcd, 0x07, 0xfe, 0x67, - 0x64, 0x41, 0xed, 0x6e, 0x35, 0x32, 0x30, 0xbe, 0x64, 0x7a, 0xf2, 0x8b, - 0x92, 0x89, 0xfa, 0x18, 0x70, 0xbd, 0xef, 0xd4, 0x13, 0x42, 0x2e, 0x6d, - 0xe8, 0xda, 0x10, 0x2c, 0xc6, 0x56, 0x48, 0x75, 0x7e, 0x68, 0xde, 0xf6, - 0xe2, 0xec, 0x60, 0xb6, 0x83, 0x8d, 0xa8, 0xd6, 0x48, 0xcf, 0x0c, 0x0c, - 0x3c, 0x7e, 0x80, 0x91, 0x5c, 0x9b, 0x10, 0x34, 0x5e, 0xf4, 0x39, 0xbb, - 0x63, 0x87, 0x56, 0x53, 0x05, 0xd8, 0xbe, 0xbb, 0x05, 0xe7, 0x1b, 0x04, - 0x10, 0x70, 0x82, 0xac, 0x02, 0xfc, 0x03, 0x6e, 0xdb, 0xc0, 0x1d, 0x5a, - 0xa0, 0xd5, 0x3a, 0x52, 0x2c, 0x3f, 0xf4, 0x00, 0xd3, 0x88, 0x19, 0x33, - 0xe6, 0x8a, 0x57, 0x4e, 0xbf, 0xf7, 0x46, 0xa7, 0x95, 0x84, 0xcf, 0xb0, - 0x3a, 0x51, 0x63, 0xc0, 0x24, 0x78, 0xbd, 0xc4, 0xb5, 0xc5, 0xce, 0xa9, - 0x0a, 0x52, 0xa1, 0xa4, 0x71, 0x7d, 0x87, 0x5f, 0x0d, 0x63, 0xca, 0x46, - 0xd0, 0xc3, 0x72, 0x10, 0xcf, 0x03, 0x0e, 0x0c, 0x17, 0x96, 0x4f, 0xda, - 0xda, 0x63, 0x74, 0x5d, 0xbf, 0xbc, 0x86, 0x78, 0x43, 0x7b, 0x2a, 0x34, - 0xce, 0x6f, 0x5b, 0xa6, 0xcc, 0x79, 0xdf, 0x90, 0x41, 0xe6, 0x40, 0xa8, - 0x6b, 0x8f, 0x3d, 0xa4, 0x99, 0xf6, 0x3a, 0xc9, 0x0b, 0x1d, 0x98, 0xc7, - 0xee, 0xf2, 0xd4, 0xd7, 0x4a, 0x00, 0x20, 0x2f, 0x69, 0x30, 0x95, 0x88, - 0xf5, 0x5f, 0x79, 0x30, 0x15, 0xf7, 0x76, 0xf9, 0x51, 0x13, 0x5d, 0x31, - 0x98, 0x28, 0x64, 0x9f, 0x96, 0x0d, 0xa8, 0x41, 0x5f, 0x9e, 0x73, 0x0f, - 0x7a, 0xe2, 0x18, 0xb5, 0x72, 0x05, 0x93, 0x88, 0x30, 0xae, 0xa5, 0xac, - 0xee, 0xfc, 0x74, 0xe4, 0x65, 0x78, 0x4b, 0x5d, 0x3b, 0x95, 0x82, 0x3d, - 0xfe, 0xbe, 0xac, 0x6e, 0xd8, 0xaa, 0x9f, 0xa1, 0xe5, 0x68, 0xe9, 0xc6, - 0x2c, 0x5c, 0xc1, 0x41, 0xee, 0x1f, 0x13, 0x48, 0x05, 0xd5, 0x00, 0x12, - 0x1d, 0x1d, 0x5e, 0xc0, 0x45, 0x0f, 0xa9, 0xf4, 0x58, 0x53, 0x4b, 0x4a, - 0xde, 0x7c, 0xbd, 0x71, 0x59, 0xae, 0x0c, 0x36, 0x98, 0xa2, 0x69, 0x4e, - 0x71, 0x3d, 0x39, 0x5d, 0xed, 0x8b, 0x07, 0x02, 0x94, 0x89, 0xe8, 0xcd, - 0x47, 0x74, 0x8d, 0x1e, 0x36, 0xf6, 0xe7, 0xb8, 0xcf, 0xca, 0x9c, 0xc0, - 0x61, 0x8b, 0xb0, 0x71, 0x35, 0xe7, 0x75, 0x68, 0x41, 0x15, 0x86, 0xea, - 0xb5, 0x02, 0xb9, 0x9a, 0xa0, 0x33, 0x58, 0x4e, 0x03, 0xb4, 0x34, 0x80, - 0xbc, 0xb5, 0x61, 0xe0, 0xf4, 0xac, 0x4a, 0x2d, 0xa2, 0x7d, 0x75, 0x39, - 0xa6, 0x9d, 0x1b, 0x01, 0x0a, 0x08, 0x9e, 0xed, 0x0a, 0x25, 0xba, 0xb6, - 0xc2, 0xb7, 0x37, 0x73, 0xcb, 0x75, 0x5e, 0x4d, 0x17, 0xb5, 0x60, 0xd9, - 0xb1, 0xe8, 0xfa, 0x44, 0xfe, 0xc2, 0xde, 0xfc, 0x3c, 0x6c, 0x7c, 0x34, - 0xd7, 0x2d, 0xe9, 0x37, 0x01, 0x8a, 0xfb, 0xfb, 0x04, 0xcf, 0x2b, 0xd1, - 0x3f, 0x79, 0x12, 0xfb, 0x76, 0x95, 0x8d, 0xe8, 0x02, 0xa7, 0xff, 0xfe, - 0xab, 0xc7, 0x82, 0x16, 0x2f, 0xe8, 0xd2, 0x98, 0x87, 0xbd, 0xe6, 0xdd, - 0x78, 0xef, 0x76, 0x85, 0x6a, 0x90, 0x2a, 0x38, 0x20, 0xf5, 0xcc, 0x5e, - 0x8c, 0xa6, 0x72, 0xf8, 0x5c, 0xf5, 0xf8, 0xe5, 0xd6, 0x81, 0xc8, 0x7b, - 0xcd, 0xd3, 0x15, 0x42, 0xde, 0xae, 0xcd, 0xd3, 0x3c, 0x24, 0xbc, 0x10, - 0x44, 0x44, 0x4e, 0xd9, 0x2a, 0x49, 0x87, 0xc0, 0x2b, 0xda, 0x36, 0xdd, - 0x09, 0x58, 0xb3, 0x79, 0xca, 0xee, 0xfe, 0xd6, 0xe7, 0x59, 0x3a, 0x3f, - 0xad, 0x88, 0xe6, 0x3c, 0x41, 0xd2, 0xb7, 0x27, 0x58, 0x68, 0xce, 0x6c, - 0x20, 0xdf, 0xdd, 0xb3, 0xe7, 0x9e, 0xf5, 0x32, 0xc9, 0x8d, 0x20, 0xfc, - 0x4c, 0xf6, 0x44, 0xdb, 0x58, 0xe0, 0xe0, 0x2e, 0xb2, 0x5a, 0xb4, 0x0c, - 0x2d, 0x5c, 0x8b, 0x43, 0xeb, 0xec, 0xfd, 0x18, 0x9b, 0x2e, 0xe0, 0xae, - 0x27, 0xd9, 0x82, 0x99, 0x64, 0xac, 0x43, 0x9f, 0x3b, 0xa6, 0xd6, 0x94, - 0x22, 0xd3, 0x23, 0x4f, 0xb0, 0xb6, 0x9a, 0xc6, 0xc4, 0xf6, 0x13, 0x8f, - 0xa3, 0x3d, 0x10, 0xf6, 0x98, 0xca, 0xf5, 0x05, 0xea, 0x00, 0x1e, 0xea, - 0x34, 0x68, 0xff, 0x64, 0x91, 0xa0, 0x30, 0x1a, 0x5e, 0x9b, 0x8a, 0x85, - 0x2a, 0xca, 0xed, 0x94, 0x91, 0x0a, 0xb5, 0x79, 0xfa, 0x1a, 0x55, 0x0e, - 0x15, 0xda, 0xe7, 0xba, 0xc4, 0xa7, 0x11, 0x69, 0x36, 0x0c, 0x92, 0x43, - 0xe0, 0x04, 0x03, 0xda, 0x50, 0xa9, 0xc9, 0x96, 0x53, 0xfd, 0x05, 0xa0, - 0x7d, 0x7f, 0x12, 0xab, 0xb6, 0x5c, 0x16, 0x40, 0xe7, 0xce, 0xc4, 0xbb, - 0x86, 0x58, 0xb6, 0x48, 0x58, 0xa3, 0xee, 0x98, 0x9f, 0x28, 0x39, 0x9b, - 0x88, 0x4e, 0x1d, 0xde, 0x34, 0x05, 0xc4, 0x63, 0x10, 0x9f, 0xf3, 0x76, - 0x85, 0x9f, 0x24, 0x89, 0x9a, 0x72, 0x6b, 0xde, 0x12, 0x61, 0xc8, 0x1e, - 0xf2, 0x08, 0x1c, 0xaf, 0xe0, 0xe9, 0x63, 0xd9, 0x4a, 0xac, 0x9a, 0xfc, - 0x2c, 0x8f, 0x80, 0xe7, 0xd4, 0x47, 0xa3, 0x04, 0x90, 0x9d, 0xaa, 0x60, - 0x6a, 0x8a, 0x7d, 0x57, 0xde, 0xc2, 0x60, 0x0f, 0x45, 0x21, 0x0f, 0x6f, - 0x35, 0x22, 0x75, 0x14, 0x8d, 0xc2, 0xb9, 0x63, 0x13, 0x2d, 0x76, 0x4d, - 0x09, 0xbe, 0xe9, 0x96, 0x0f, 0xcf, 0xd1, 0x4f, 0xec, 0xe0, 0x54, 0xf3, - 0xfb, 0x18, 0xec, 0x62, 0x15, 0x7f, 0x4c, 0x75, 0x11, 0x2c, 0x6f, 0x26, - 0x0e, 0x56, 0x02, 0x96, 0x18, 0xd0, 0xff, 0xd8, 0x57, 0x1c, 0x6e, 0xb2, - 0x22, 0x37, 0xec, 0xf6, 0x2c, 0x68, 0x93, 0x2c, 0xdf, 0x91, 0x03, 0xbb, - 0x98, 0xa7, 0xd1, 0xb7, 0xe2, 0x17, 0x5f, 0x9e, 0x49, 0x0d, 0xf8, 0x01, - 0x3f, 0x06, 0xd1, 0xf1, 0x7a, 0x7a, 0xeb, 0x23, 0x5d, 0x6d, 0xeb, 0x10, - 0xcc, 0xbc, 0x5c, 0x13, 0xaf, 0xb5, 0xed, 0x9c, 0xed, 0x47, 0xff, 0x16, - 0x1e, 0x35, 0x7e, 0xd6, 0x61, 0x29, 0xe2, 0x7c, 0x3e, 0xc2, 0x89, 0xb6, - 0x6c, 0xc8, 0x8c, 0xfa, 0xf7, 0xed, 0xbb, 0xda, 0xec, 0x23, 0x63, 0x76, - 0x65, 0x08, 0xa8, 0xf6, 0x27, 0x97, 0xef, 0x6a, 0x93, 0xfd, 0x05, 0xb2, - 0x4d, 0x3c, 0xcc, 0x70, 0x03, 0x1c, 0x5e, 0x14, 0x04, 0xfa, 0xc6, 0x33, - 0xf8, 0x92, 0x4f, 0x95, 0x0b, 0xf9, 0xda, 0x2e, 0xf4, 0x13, 0xce, 0xc0, - 0x4a, 0xe9, 0x67, 0xf1, 0xe9, 0x65, 0xe3, 0x47, 0x20, 0x0d, 0x44, 0xd8, - 0xf2, 0xb3, 0x26, 0x64, 0xf4, 0xf6, 0x17, 0x5f, 0xcc, 0xbb, 0xc7, 0xf3, - 0x42, 0xa6, 0xd4, 0xe1, 0x2e, 0xab, 0x2b, 0x9e, 0x1e, 0xfa, 0x48, 0xf0, - 0x27, 0xbe, 0xf8, 0x65, 0xcd, 0xc6, 0x2c, 0xb3, 0x79, 0xd2, 0xa2, 0xc2, - 0x51, 0xcf, 0x44, 0xec, 0xfe, 0xd4, 0x2f, 0xfe, 0x8d, 0x40, 0xe8, 0x0c, - 0xe1, 0xe7, 0x94, 0x4a, 0x5b, 0xee, 0x1c, 0x1f, 0x4f, 0xdc, 0x3c, 0xba, - 0x4d, 0x56, 0xf1, 0xff, 0xfe, 0xb4, 0xb3, 0x8f, 0x06, 0xb6, 0x20, 0xf8, - 0x00, 0x00, 0xd0, 0xad, 0xa4, 0x6d, 0x46, 0x54, 0x2e, 0x01, 0x81, 0x7a, - 0x1b, 0x93, 0x29, 0x3c, 0x50, 0x44, 0x85, 0xc6, 0x1b, 0x00, 0x20, 0x6c, - 0x87, 0x40, 0xfe, 0x65, 0xf9, 0x21, 0x05, 0xe0, 0xf3, 0x78, 0xe9, 0x6b, - 0x2c, 0x2d, 0xaf, 0x59, 0x44, 0x99, 0xa1, 0x75, 0x31, 0x53, 0xd5, 0x0c, - 0x36, 0x44, 0x41, 0x49, 0x38, 0xbe, 0x54, 0x4f, 0x61, 0x72, 0x4c, 0x74, - 0x39, 0xa9, 0x58, 0x06, 0x69, 0xb4, 0x80, 0x36, 0x3c, 0xfe, 0x8f, 0xc6, - 0x7f, 0x5a, 0x09, 0x62, 0x62, 0x66, 0x3b, 0xbe, 0x8f, 0x31, 0xbe, 0xb6, - 0x12, 0xe9, 0x5c, 0x41, 0xab, 0x4c, 0x3f, 0x0c, 0xc6, 0x0d, 0x8c, 0x9c, - 0xa2, 0x89, 0x52, 0x49, 0xcf, 0xec, 0x29, 0xfa, 0x1b, 0xaa, 0x50, 0x80, - 0x49, 0x38, 0xb9, 0x0a, 0x39, 0x85, 0xc7, 0xa8, 0xbb, 0x7c, 0x65, 0xb8, - 0x11, 0xa9, 0x60, 0xc6, 0xc4, 0x8b, 0x2a, 0x5c, 0x9d, 0x48, 0x9a, 0x8c, - 0xc4, 0xa9, 0x41, 0x0d, 0x7b, 0xf6, 0xe0, 0x59, 0xae, 0xf8, 0xa8, 0x2e, - 0xd4, 0x93, 0x6e, 0xfd, 0xe8, 0x16, 0x3d, 0x5b, 0x61, 0x7f, 0x2b, 0xfb, - 0x4c, 0x2e, 0x60, 0x38, 0xae, 0xca, 0x50, 0xef, 0x1d, 0xb7, 0x1a, 0xb7, - 0xc0, 0x8f, 0x32, 0xdd, 0x48, 0x96, 0x5d, 0x69, 0x34, 0xfd, 0x2c, 0x82, - 0xab, 0xf8, 0x09, 0x6b, 0xbb, 0x95, 0xb9, 0x0b, 0x47, 0x3b, 0x42, 0x76, - 0xe5, 0x15, 0xee, 0xbd, 0xc3, 0x90, 0x6e, 0xac, 0x34, 0xcf, 0xe0, 0x89, - 0x0d, 0xaf, 0x8c, 0x5f, 0x65, 0xa4, 0x20, 0x7b, 0x4c, 0xee, 0x59, 0x46, - 0xcd, 0xc0, 0x39, 0xbf, 0x8f, 0x9e, 0x74, 0xeb, 0xaa, 0xef, 0x8c, 0x7f, - 0xa7, 0xcb, 0xff, 0xe0, 0x0f, 0x12, 0xd1, 0xfa, 0xc0, 0x62, 0x94, 0x55, - 0x5f, 0x95, 0x32, 0x7c, 0x90, 0x36, 0x34, 0x5d, 0x52, 0x2b, 0xeb, 0xc0, - 0x6c, 0xcd, 0xcd, 0x33, 0x99, 0x23, 0x68, 0x2a, 0x96, 0xc5, 0xbd, 0x03, - 0xc2, 0xf2, 0x3c, 0xe0, 0xe4, 0x62, 0x18, 0xe2, 0x8b, 0x79, 0xfa, 0x13, - 0x7e, 0x0b, 0x7e, 0xba, 0x0b, 0xf8, 0x47, 0x74, 0x1b, 0xb9, 0xca, 0x69, - 0xc0, 0xd5, 0x87, 0x7e, 0x3b, 0xee, 0x94, 0x61, 0x10, 0x16, 0xa6, 0x40, - 0xfd, 0x53, 0xb3, 0x48, 0xfc, 0xe9, 0x2f, 0x1e, 0x5b, 0x83, 0x04, 0xfc, - 0x0e, 0x36, 0x61, 0x50, 0xa0, 0xf4, 0x14, 0xcc, 0x4e, 0x4d, 0x52, 0xc5, - 0xa8, 0x56, 0x79, 0xef, 0x29, 0x11, 0x61, 0xb0, 0xe0, 0xc2, 0x20, 0xc6, - 0xab, 0xe1, 0x30, 0xe5, 0xca, 0x15, 0xa5, 0x18, 0xc7, 0x03, 0x07, 0x01, - 0x8c, 0xd3, 0x66, 0x85, 0x9d, 0x6e, 0x87, 0x9d, 0xcb, 0x45, 0x01, 0xdc, - 0xa4, 0xf5, 0xee, 0xc6, 0xa8, 0x8e, 0x49, 0x4d, 0xf7, 0x93, 0x98, 0x6e, - 0xed, 0x1c, 0x9c, 0x5c, 0x49, 0xcd, 0xd8, 0xe8, 0x61, 0xae, 0x8b, 0x98, - 0x21, 0xc5, 0x79, 0xc7, 0x0d, 0x7d, 0x62, 0xba, 0x6e, 0x5a, 0xb6, 0x4d, - 0x8e, 0x5b, 0x52, 0x41, 0x89, 0x49, 0x6d, 0x60, 0x86, 0x97, 0xd3, 0x7a, - 0x8f, 0xa7, 0x9a, 0x0c, 0xba, 0x05, 0x89, 0xcf, 0x15, 0xe3, 0x99, 0xf0, - 0x3f, 0xfd, 0x4a, 0xb2, 0xd5, 0xa4, 0x00, 0xd7, 0xe1, 0x48, 0x0c, 0xcb, - 0xde, 0x7b, 0x65, 0x05, 0x10, 0x95, 0x20, 0x24, 0x6f, 0x37, 0x41, 0xaf, - 0x83, 0xe6, 0x86, 0x11, 0xd7, 0x9b, 0xbb, 0x9e, 0x18, 0xaa, 0x66, 0xb7, - 0xcc, 0x02, 0x5e, 0xbd, 0x46, 0x59, 0x55, 0xde, 0x8e, 0xbc, 0xb3, 0x26, - 0x28, 0x71, 0xcc, 0xe4, 0x16, 0x79, 0x2d, 0xa7, 0x4d, 0xce, 0x9e, 0x10, - 0x7f, 0x84, 0xe9, 0x26, 0xdf, 0x7e, 0x56, 0x42, 0x75, 0xfe, 0xf7, 0xcb, - 0x1e, 0x72, 0x5e, 0x6b, 0x94, 0xae, 0xd9, 0x52, 0x4b, 0xf7, 0xcf, 0x6f, - 0x6a, 0xf8, 0xbf, 0xb7, 0x8c, 0x1a, 0x68, 0xdb, 0xd4, 0xe6, 0x89, 0x6f, - 0x00, 0xa0, 0xaa, 0x94, 0xeb, 0x68, 0xaa, 0x88, 0xfe, 0x4e, 0x8f, 0xbf, - 0x10, 0xc2, 0x15, 0x17, 0x65, 0x9a, 0x07, 0x58, 0x8a, 0x15, 0xaf, 0xf2, - 0x5e, 0xa4, 0x2c, 0xb7, 0xcf, 0x4c, 0x8c, 0xd7, 0xcc, 0x57, 0x9e, 0xa0, - 0x33, 0x3b, 0xd7, 0xac, 0xf5, 0xcc, 0x9a, 0xcb, 0x6e, 0xaf, 0x77, 0x31, - 0x8f, 0x31, 0xb8, 0xc4, 0x86, 0x85, 0xc7, 0x26, 0xad, 0x40, 0x61, 0xa2, - 0x03, 0xb7, 0x7a, 0xb3, 0xcb, 0xde, 0xc1, 0x78, 0xea, 0x02, 0xae, 0x81, - 0xf9, 0x2a, 0xb2, 0x8f, 0xec, 0x51, 0x7a, 0x8d, 0x99, 0xfd, 0x73, 0x07, - 0x99, 0x7e, 0xed, 0xe2, 0x2d, 0x2a, 0x57, 0x84, 0xae, 0x24, 0x1e, 0x24, - 0x32, 0x9a, 0x25, 0x34, 0x74, 0xae, 0x98, 0x3c, 0xcf, 0xe3, 0xa2, 0x29, - 0xcc, 0x22, 0x3d, 0xb0, 0x1e, 0x6d, 0x77, 0x1e, 0x89, 0x7f, 0x65, 0x6b, - 0x33, 0x75, 0x50, 0x1d, 0x98, 0x9c, 0xf0, 0xb7, 0x74, 0xc7, 0x03, 0x8b, - 0xa5, 0x87, 0xfb, 0xa0, 0x6c, 0x8a, 0x71, 0x35, 0x31, 0xc1, 0x02, 0x24, - 0x19, 0x5d, 0xbe, 0x14, 0x3e, 0x92, 0x4e, 0xb3, 0x54, 0xd8, 0x4f, 0x90, - 0xdd, 0x3a, 0x7f, 0xd0, 0xc1, 0x0b, 0x6a, 0xdf, 0xee, 0xd1, 0x53, 0xba, - 0xb1, 0x49, 0xf3, 0xdf, 0x69, 0x6c, 0xfb, 0xc9, 0x7a, 0x14, 0x47, 0x19, - 0x29, 0x8d, 0x57, 0xd9, 0x56, 0x28, 0x00, 0x3f, 0x38, 0x88, 0xc4, 0x99, - 0x84, 0x3d, 0x3e, 0x69, 0xcf, 0x16, 0xa6, 0xfc, 0x01, 0x9b, 0xe1, 0x48, - 0x21, 0xf3, 0xef, 0xb7, 0x17, 0x27, 0xb1, 0x0d, 0xbd, 0x2a, 0x53, 0x93, - 0x2a, 0xbe, 0x19, 0x90, 0xd7, 0xbc, 0xec, 0x50, 0x50, 0x65, 0x0b, 0xda, - 0x18, 0x49, 0x60, 0xc8, 0x20, 0xe0, 0x16, 0xf2, 0x8d, 0x69, 0x63, 0x4d, - 0xd0, 0x44, 0xf4, 0xb8, 0x1d, 0x88, 0xe9, 0x47, 0xb2, 0x04, 0xbc, 0xd2, - 0xbb, 0x98, 0x3a, 0x39, 0x73, 0x6b, 0x1b, 0xe8, 0xec, 0x86, 0xe1, 0xc2, - 0xbd, 0x10, 0x41, 0xd1, 0xd6, 0x10, 0x14, 0xae, 0x8c, 0x51, 0xdd, 0x07, - 0x64, 0xfe, 0x90, 0x91, 0x0d, 0x91, 0x67, 0xff, 0xc2, 0xac, 0xc8, 0x63, - 0xa9, 0x20, 0x74, 0xb7, 0x1b, 0x46, 0x3c, 0x8f, 0xb3, 0x9b, 0xca, 0x04, - 0x2a, 0x67, 0x05, 0x2a, 0x4b, 0xcb, 0x9c, 0xcb, 0xa6, 0x46, 0x1a, 0xfd, - 0x57, 0xb2, 0xac, 0x91, 0xcf, 0x55, 0xfb, 0x65, 0x15, 0xf5, 0xf5, 0xf6, - 0xcd, 0xc4, 0xed, 0xf4, 0xa2, 0xb6, 0x34, 0x6b, 0xe9, 0xcd, 0xd2, 0xa6, - 0x21, 0x43, 0xed, 0xe2, 0xca, 0x7f, 0x0f, 0x29, 0xf3, 0x0a, 0x41, 0x79, - 0xdc, 0xad, 0xe2, 0xd5, 0x84, 0xea, 0xc7, 0x34, 0x24, 0x39, 0x8f, 0xc5, - 0xff, 0x8d, 0xf4, 0x09, 0x62, 0x0a, 0x41, 0xc2, 0x39, 0x77, 0xbd, 0x6f, - 0xa9, 0x6f, 0xae, 0x1c, 0x90, 0xd1, 0x05, 0x60, 0xfa, 0x82, 0x0a, 0x4a, - 0x3e, 0x0f, 0x8b, 0x28, 0x6d, 0x78, 0x76, 0x25, 0xcf, 0xf4, 0x2e, 0x19, - 0x13, 0xbe, 0x01, 0xb7, 0x2c, 0x37, 0x7d, 0x8f, 0xd9, 0xe5, 0xb0, 0xa1, - 0xb9, 0xed, 0x8e, 0x23, 0xde, 0xbc, 0x96, 0x95, 0x81, 0xd9, 0xa8, 0xab, - 0x95, 0x2b, 0x4e, 0x45, 0x24, 0x9d, 0x95, 0xac, 0xc3, 0xef, 0xb5, 0x36, - 0xf9, 0xb5, 0x3b, 0x0a, 0x95, 0xe3, 0x65, 0xd7, 0x3c, 0xa6, 0x3b, 0x15, - 0x42, 0x20, 0x81, 0x99, 0x28, 0x22, 0xf9, 0xe4, 0x0c, 0xe0, 0x27, 0x28, - 0xa8, 0x90, 0x1f, 0xee, 0x25, 0xd9, 0x44, 0xd6, 0xfa, 0xca, 0xc8, 0x71, - 0x50, 0xc9, 0x95, 0xec, 0xd6, 0x2b, 0x57, 0xbc, 0x8a, 0x8d, 0xe0, 0xd6, - 0x72, 0x28, 0xb2, 0x5b, 0xbd, 0xf0, 0x09, 0x19, 0xb0, 0x6d, 0x60, 0x68, - 0x69, 0xc6, 0xed, 0xe1, 0x5c, 0x05, 0x6d, 0x01, 0x0d, 0x3c, 0xbc, 0x4b, - 0x60, 0xbb, 0xfb, 0xfb, 0xe5, 0x44, 0x87, 0xbe, 0xdd, 0x77, 0x19, 0x57, - 0xcd, 0x56, 0x9e, 0xb7, 0xa5, 0xf2, 0xf9, 0xbc, 0x54, 0xb1, 0x14, 0xf1, - 0x3f, 0x9b, 0x7c, 0x6b, 0xe2, 0xdb, 0x2c, 0x2b, 0x08, 0x9d, 0x5d, 0x38, - 0x6d, 0x5a, 0x4f, 0x55, 0x64, 0x56, 0x7e, 0xe8, 0x9f, 0x4c, 0x5c, 0x1a, - 0x20, 0xd5, 0xc0, 0xd4, 0x3d, 0x1c, 0xf1, 0xe0, 0xae, 0x46, 0xf7, 0xb5, - 0x90, 0x0b, 0xb1, 0xc9, 0xab, 0xd5, 0xbc, 0x8b, 0xa0, 0x9f, 0x07, 0x5c, - 0x7e, 0x91, 0xbf, 0x43, 0x1f, 0x8b, 0x8f, 0x20, 0xa2, 0x2e, 0x73, 0xbb, - 0x7c, 0xcc, 0xdd, 0xf0, 0x3e, 0x4f, 0x53, 0xad, 0x0a, 0xac, 0x6f, 0x79, - 0xf6, 0xf9, 0xa2, 0xd1, 0x55, 0xa1, 0x7b, 0xe0, 0xca, 0x94, 0xcb, 0x47, - 0x6d, 0x1e, 0x68, 0x3a, 0x6b, 0xd9, 0x0d, 0x20, 0xab, 0xde, 0x86, 0x31, - 0xc2, 0x18, 0xea, 0x60, 0xf4, 0xe1, 0x70, 0x32, 0xec, 0xdb, 0x3e, 0xb6, - 0x32, 0x9f, 0xb2, 0x5b, 0xcb, 0x9d, 0x4b, 0x71, 0x6e, 0xd8, 0xd3, 0x22, - 0x54, 0x32, 0xfb, 0x7b, 0x57, 0x2d, 0x99, 0x79, 0xea, 0xcc, 0x0c, 0x37, - 0xc8, 0x32, 0xec, 0xe2, 0x43, 0x10, 0x07, 0x5a, 0x15, 0xaf, 0x58, 0x2a, - 0x40, 0x48, 0x3e, 0x9f, 0x00, 0x1d, 0x5e, 0x52, 0x38, 0xfc, 0x73, 0x24, - 0xbe, 0x7f, 0xe5, 0xb3, 0x71, 0x50, 0x1b, 0xc1, 0xae, 0x02, 0x01, 0x10, - 0x09, 0x0c, 0xe2, 0x3e, 0x41, 0x89, 0x52, 0x74, 0x10, 0x6b, 0xa6, 0x0c, - 0x8a, 0x56, 0xe6, 0xb3, 0x4f, 0x27, 0xe9, 0x06, 0x2f, 0xaa, 0x0d, 0xe4, - 0xeb, 0x4d, 0xfa, 0x58, 0x3c, 0xc4, 0xee, 0x1d, 0x3d, 0x08, 0x8a, 0x7a, - 0xfd, 0x38, 0x42, 0x77, 0x5b, 0xbf, 0x44, 0x98, 0x95, 0xf2, 0x77, 0x3c, - 0x62, 0x18, 0x66, 0x8b, 0x35, 0x41, 0x69, 0x85, 0x79, 0xa1, 0xd7, 0x1f, - 0x08, 0x8f, 0x5b, 0x50, 0x07, 0xe1, 0xdd, 0xe9, 0x94, 0x41, 0x92, 0x9b, - 0xbf, 0x65, 0x32, 0x5b, 0x82, 0x75, 0x75, 0x0d, 0x01, 0x45, 0x56, 0xb3, - 0xcd, 0xb7, 0x6d, 0xe3, 0x5b, 0x19, 0xe3, 0xb4, 0xa6, 0x87, 0x8a, 0x78, - 0x68, 0x50, 0xa1, 0xaf, 0x67, 0x2a, 0x9e, 0x23, 0x7c, 0x3a, 0x89, 0x4f, - 0x94, 0xaa, 0x5b, 0xe7, 0xbd, 0x65, 0xed, 0x72, 0xeb, 0x2e, 0x56, 0xe7, - 0x8c, 0x52, 0xaa, 0x7a, 0xe1, 0x1d, 0x65, 0xd8, 0x42, 0xb1, 0x97, 0xe5, - 0x7c, 0x75, 0xa3, 0xe2, 0x6f, 0xb4, 0xc0, 0x06, 0x19, 0xf6, 0x6f, 0x4e, - 0x4c, 0xb7, 0xc8, 0x35, 0xd1, 0xb3, 0xda, 0x6b, 0x7e, 0x22, 0x9a, 0xf7, - 0xf4, 0x40, 0x05, 0x9e, 0x7c, 0x3a, 0x28, 0xb7, 0xc0, 0x09, 0x3a, 0x59, - 0x04, 0x39, 0x5e, 0xd7, 0x0b, 0x2d, 0x96, 0xfe, 0xc8, 0x7e, 0x2e, 0x85, - 0xb8, 0x47, 0xb8, 0x52, 0x59, 0x2f, 0xdb, 0xf4, 0x39, 0xaa, 0x88, 0x13, - 0xe7, 0x38, 0xbd, 0x2a, 0x9f, 0xb2, 0xc3, 0xfc, 0x59, 0x18, 0xb4, 0x74, - 0x7c, 0x8f, 0x75, 0x14, 0x20, 0xea, 0xec, 0x9b, 0xc5, 0xfa, 0x51, 0xba, - 0x96, 0xb1, 0x0d, 0xdc, 0xbd, 0x24, 0xbd, 0x4d, 0x6a, 0x18, 0xac, 0x10, - 0x5e, 0x1d, 0x09, 0x58, 0xf4, 0x0d, 0xa0, 0xb2, 0xe0, 0x57, 0x68, 0x26, - 0xc7, 0x1d, 0xb8, 0x3c, 0x83, 0x1f, 0xc7, 0x34, 0x29, 0xac, 0x91, 0x6d, - 0x77, 0x8c, 0x12, 0x18, 0x5f, 0x24, 0x62, 0x91, 0xc5, 0x86, 0xea, 0x54, - 0xf6, 0xca, 0xd7, 0x5c, 0xa5, 0x7c, 0xc9, 0xab, 0xac, 0xa2, 0x9b, 0x75, - 0x61, 0xcf, 0xe0, 0x52, 0x78, 0x00, 0x09, 0x01, 0x74, 0x2e, 0xb2, 0xf4, - 0x35, 0x07, 0x76, 0x70, 0xaf, 0x07, 0xec, 0x19, 0x77, 0x2d, 0x8e, 0x72, - 0x42, 0x52, 0x70, 0x7c, 0x36, 0x6f, 0x48, 0x3a, 0x55, 0x6b, 0xbd, 0xda, - 0x31, 0xe0, 0xba, 0xb7, 0x01, 0x7e, 0xbf, 0xab, 0x19, 0x01, 0x21, 0xde, - 0x19, 0x2e, 0x3b, 0x8c, 0x4d, 0x2b, 0xcb, 0x03, 0x2b, 0x48, 0x9d, 0x5f, - 0xdd, 0xa4, 0xfc, 0x0c, 0xee, 0xa6, 0x2e, 0x23, 0x2a, 0xdf, 0xc0, 0x48, - 0x19, 0x3c, 0x24, 0x06, 0xc3, 0x67, 0x35, 0x2b, 0x74, 0xb6, 0x3a, 0xa1, - 0x2e, 0xea, 0x79, 0x19, 0x96, 0xcc, 0x39, 0xda, 0xe8, 0x68, 0x1f, 0x3d, - 0x95, 0x21, 0x87, 0xc3, 0xae, 0x59, 0xc3, 0x23, 0x11, 0xbe, 0x79, 0xbb, - 0xd7, 0x47, 0x49, 0x88, 0x0e, 0x4c, 0x16, 0x45, 0xc6, 0x21, 0x24, 0x50, - 0xb5, 0x3a, 0xb3, 0xfd, 0xd5, 0x32, 0x91, 0x07, 0x5b, 0x0f, 0xff, 0x57, - 0xba, 0x19, 0xd9, 0x7a, 0x7c, 0x18, 0xcc, 0xa8, 0x95, 0x13, 0xa3, 0x05, - 0xed, 0x61, 0xca, 0x0b, 0x74, 0xd2, 0x93, 0xaf, 0xd6, 0x04, 0x21, 0x6f, - 0x39, 0xa2, 0x4a, 0x8e, 0xce, 0x8c, 0x68, 0xe0, 0xa4, 0x21, 0xef, 0x96, - 0xab, 0x91, 0x87, 0x64, 0x72, 0xd4, 0xcf, 0x59, 0x70, 0x15, 0x84, 0x69, - 0x85, 0x56, 0xbb, 0x1e, 0xee, 0x12, 0xf8, 0x5e, 0xf6, 0xa0, 0x07, 0x17, - 0xd6, 0x3f, 0x27, 0xb4, 0xd2, 0x1c, 0xa9, 0x64, 0x59, 0x92, 0xde, 0x1b, - 0x57, 0x40, 0x76, 0x66, 0xcd, 0x42, 0x92, 0xa2, 0x18, 0x7d, 0xac, 0x43, - 0xe0, 0x20, 0xa4, 0xa2, 0x2b, 0xfa, 0xfe, 0xd6, 0x3e, 0xaa, 0xa4, 0xdb, - 0x69, 0xf9, 0x16, 0x98, 0xc8, 0xea, 0x51, 0x03, 0xb8, 0x9d, 0x37, 0x2b, - 0x73, 0x90, 0x96, 0xeb, 0x89, 0xa9, 0xc0, 0xce, 0x00, 0xbe, 0x6a, 0xf3, - 0xc5, 0x3e, 0xa6, 0xb9, 0xe1, 0x9b, 0x01, 0xc2, 0x72, 0x1e, 0xa0, 0xb0, - 0xe4, 0xa8, 0x4d, 0xa8, 0x67, 0x24, 0x38, 0x0d, 0x43, 0xf0, 0x12, 0x7b, - 0xef, 0x03, 0xc4, 0xf4, 0x47, 0x17, 0xd6, 0x19, 0x6f, 0x5b, 0xef, 0xa1, - 0x7d, 0xf1, 0xc4, 0x06, 0x72, 0x35, 0x1f, 0x2d, 0x94, 0x94, 0x1a, 0xde, - 0xf3, 0x7d, 0x53, 0x76, 0x09, 0xd7, 0x22, 0xbc, 0xd1, 0x26, 0xde, 0x5b, - 0xe3, 0xc1, 0x84, 0xaf, 0x31, 0x81, 0xaa, 0xb9, 0x2d, 0xc0, 0x75, 0xd2, - 0xed, 0x92, 0xbc, 0xa6, 0x56, 0x9b, 0x25, 0x3c, 0x25, 0x4a, 0x55, 0x11, - 0x65, 0x18, 0xed, 0x79, 0x4b, 0xb2, 0xd0, 0x38, 0x10, 0x7a, 0xd6, 0x50, - 0x01, 0xe2, 0xe9, 0x05, 0x9a, 0xce, 0xf5, 0xc3, 0x3b, 0xdf, 0x79, 0xd9, - 0x5e, 0xd7, 0xec, 0x74, 0x13, 0x31, 0x36, 0x37, 0x62, 0xb5, 0x86, 0x8f, - 0x52, 0x61, 0x8b, 0xd9, 0xe2, 0xcd, 0x51, 0x70, 0x84, 0x43, 0x3f, 0x66, - 0xf2, 0xb1, 0xed, 0x75, 0x82, 0xf4, 0xb2, 0x5f, 0x88, 0x86, 0xb7, 0x4f, - 0xbf, 0xeb, 0x91, 0x45, 0x23, 0xc4, 0xd0, 0x5e, 0xe4, 0xec, 0xb4, 0xdb, - 0x58, 0x4e, 0x82, 0x11, 0xea, 0x5a, 0x2d, 0xb4, 0x1a, 0x55, 0x74, 0x7a, - 0x94, 0x2a, 0x10, 0xdd, 0x76, 0x96, 0xaf, 0x5f, 0x32, 0x8f, 0xe6, 0x61, - 0xb4, 0x1a, 0x91, 0xb4, 0x9a, 0xe2, 0xac, 0x0f, 0x95, 0x7f, 0x01, 0x69, - 0xf4, 0xa2, 0x1e, 0xe1, 0xb3, 0x03, 0x4f, 0xcb, 0xce, 0x04, 0x3a, 0xaa, - 0xa5, 0xe1, 0x0f, 0xd2, 0xd4, 0x12, 0x58, 0xed, 0x79, 0xb7, 0xbf, 0xae, - 0xa0, 0xa9, 0xa7, 0xb2, 0x76, 0x25, 0x27, 0x0b, 0xac, 0xc3, 0xc3, 0x4f, - 0x2b, 0xea, 0x1c, 0x20, 0x3b, 0xa9, 0x75, 0x1e, 0x95, 0x3a, 0x8b, 0x50, - 0x86, 0x87, 0x8f, 0xbb, 0x24, 0x60, 0xc1, 0xef, 0x6a, 0x19, 0x0c, 0x49, - 0x90, 0xf9, 0xe7, 0x7b, 0xfd, 0xcb, 0x8f, 0x1e, 0xf7, 0xd7, 0xe4, 0x95, - 0x59, 0x37, 0x86, 0xf8, 0x2a, 0x12, 0xf4, 0x69, 0xbb, 0xbe, 0x06, 0x4a, - 0x9d, 0xdb, 0x53, 0x83, 0x11, 0x6f, 0x65, 0x61, 0xca, 0x51, 0x99, 0xb2, - 0xca, 0x50, 0x4d, 0xa3, 0x5b, 0xfd, 0x40, 0x9b, 0xe5, 0x24, 0x2e, 0xe5, - 0x20, 0xf5, 0xc9, 0x97, 0x6b, 0x30, 0xa0, 0x48, 0xa3, 0x69, 0x46, 0x01, - 0x24, 0x90, 0x78, 0xa7, 0x38, 0x4e, 0xd1, 0xdf, 0x00, 0x6c, 0x58, 0xec, - 0xb2, 0xeb, 0x3a, 0x16, 0x5f, 0xee, 0x75, 0xdc, 0x18, 0x70, 0xb0, 0x43, - 0xb9, 0x67, 0x8f, 0xb5, 0x95, 0x8c, 0x08, 0x19, 0x10, 0x7c, 0x45, 0x10, - 0xe4, 0xad, 0xa8, 0x38, 0xdd, 0x29, 0x0d, 0xf2, 0x16, 0x66, 0xb6, 0x15, - 0x32, 0x06, 0x77, 0xcd, 0xc4, 0x77, 0xae, 0x02, 0xd2, 0xdc, 0x8e, 0xde, - 0x28, 0x08, 0x35, 0x2b, 0x94, 0x1d, 0x43, 0x98, 0x81, 0x59, 0x1a, 0x5b, - 0xe7, 0xce, 0x6a, 0xca, 0x4e, 0xa1, 0x5b, 0xcc, 0x71, 0xcd, 0x77, 0x01, - 0xb1, 0x71, 0x45, 0xa3, 0xd6, 0x17, 0xa4, 0xe6, 0x94, 0xe8, 0xdc, 0x70, - 0xc7, 0x88, 0x55, 0xf8, 0xbb, 0xb7, 0x31, 0x62, 0x77, 0xdf, 0x97, 0x16, - 0x6b, 0x87, 0xd1, 0x36, 0x3c, 0xc9, 0xb7, 0xd7, 0xc3, 0x59, 0x8e, 0xc1, - 0x8e, 0xb8, 0xa3, 0xfa, 0x8a, 0x91, 0xd9, 0x04, 0xbe, 0x69, 0xde, 0x0b, - 0x55, 0x6c, 0x50, 0x0a, 0xcf, 0x52, 0x82, 0x5f, 0x04, 0x28, 0x96, 0xf1, - 0xa4, 0x46, 0x6c, 0x19, 0x62, 0xe3, 0xa3, 0xc5, 0xba, 0xff, 0xfd, 0x46, - 0x8b, 0xda, 0x0b, 0x98, 0xd6, 0x3f, 0xf1, 0xef, 0xbd, 0xc4, 0xdc, 0x7a, - 0xf8, 0x49, 0x56, 0x2f, 0xd2, 0xf2, 0x7a, 0xe3, 0xba, 0x23, 0xc3, 0xa7, - 0x81, 0xd8, 0x08, 0x45, 0xd6, 0xb3, 0xcf, 0x52, 0x49, 0x63, 0xab, 0xc0, - 0xd9, 0x85, 0x7b, 0x68, 0xf8, 0xe0, 0x93, 0x7b, 0x97, 0xd3, 0x01, 0x43, - 0x92, 0xa0, 0x92, 0x60, 0x24, 0xb7, 0x85, 0xb6, 0x43, 0x64, 0x59, 0x99, - 0x8c, 0xf0, 0x77, 0x2d, 0x27, 0x8a, 0x67, 0xbd, 0x16, 0x51, 0x09, 0xda, - 0x97, 0xe0, 0x27, 0x31, 0x90, 0x6a, 0xc6, 0xd4, 0x72, 0xac, 0x0e, 0xec, - 0x02, 0xba, 0xed, 0xe3, 0xc8, 0x1c, 0xdf, 0x1f, 0xd3, 0x81, 0xd9, 0xc0, - 0x42, 0x33, 0x5d, 0x8a, 0xfc, 0x29, 0x61, 0xd2, 0xcf, 0xdb, 0xa3, 0x10, - 0xe3, 0xcb, 0xed, 0xcc, 0x05, 0xd3, 0xf2, 0x88, 0x1c, 0x44, 0xa0, 0x01, - 0x61, 0x87, 0x76, 0x00, 0x3c, 0xaa, 0x65, 0x84, 0x09, 0x89, 0x35, 0xb2, - 0x10, 0x83, 0x2d, 0x7a, 0xd9, 0xae, 0x36, 0x61, 0xb9, 0x72, 0x92, 0x94, - 0xe5, 0x8c, 0x3e, 0xea, 0x22, 0xa9, 0xe5, 0xea, 0x27, 0x5d, 0x08, 0xc3, - 0x7d, 0xb5, 0x31, 0xa7, 0x9e, 0x98, 0x36, 0xaf, 0x69, 0xc2, 0x3e, 0x37, - 0x83, 0x87, 0xa1, 0x36, 0x0e, 0x1e, 0x52, 0x5f, 0xdd, 0x5c, 0x29, 0x0c, - 0x37, 0x97, 0x7a, 0x9c, 0xd1, 0x8b, 0xa7, 0x0e, 0x0d, 0x29, 0x06, 0x29, - 0x30, 0xb7, 0x88, 0x76, 0x32, 0x5a, 0xe2, 0x60, 0x4b, 0x79, 0x93, 0x84, - 0x22, 0x0d, 0x04, 0x80, 0xfb, 0x85, 0x3a, 0xd5, 0xcf, 0x76, 0x21, 0xb2, - 0x13, 0x21, 0x58, 0x07, 0xbb, 0xad, 0x3a, 0xb1, 0x5e, 0x9d, 0xad, 0xed, - 0x45, 0x97, 0xd9, 0x06, 0x60, 0x9a, 0x3f, 0x4f, 0x58, 0x17, 0x4a, 0xb0, - 0xc6, 0xc2, 0xb2, 0xe4, 0xa3, 0x20, 0x7f, 0xa6, 0x57, 0xe3, 0xc9, 0x18, - 0x55, 0xa8, 0x1f, 0x59, 0xbc, 0x9b, 0x97, 0x5c, 0xf5, 0x53, 0x10, 0xa2, - 0x28, 0x7a, 0x2c, 0x10, 0xc2, 0x60, 0x6a, 0x1d, 0x69, 0x51, 0xea, 0xd4, - 0xcc, 0x74, 0xa8, 0xf4, 0x80, 0x4c, 0x33, 0xb6, 0xe0, 0xc4, 0x1f, 0xf7, - 0x41, 0x6a, 0xa8, 0xbd, 0xec, 0x9f, 0x55, 0x71, 0x6c, 0x01, 0xcf, 0x6b, - 0xc1, 0x77, 0xa3, 0xbd, 0xb4, 0x09, 0x68, 0x25, 0x61, 0x6f, 0x96, 0x0f, - 0x42, 0x6c, 0x1a, 0x29, 0x49, 0xa9, 0x79, 0x00, 0x0e, 0xbe, 0x24, 0x7c, - 0x58, 0x8d, 0x8b, 0x69, 0x37, 0x2f, 0x72, 0x51, 0x59, 0x10, 0x56, 0x9e, - 0xf0, 0xde, 0x72, 0xa0, 0x18, 0xa1, 0xc5, 0x75, 0x64, 0xee, 0x94, 0x6b, - 0x4b, 0x3a, 0x85, 0xb6, 0x16, 0xcb, 0x3b, 0x2c, 0x60, 0x79, 0x22, 0x11, - 0x06, 0x4f, 0x96, 0x64, 0x28, 0x40, 0x16, 0x54, 0x5d, 0x36, 0xa3, 0x83, - 0x04, 0x57, 0x51, 0x66, 0x27, 0x63, 0xb0, 0x79, 0x58, 0x65, 0x89, 0xde, - 0x6c, 0xef, 0x50, 0x23, 0x0c, 0x0b, 0xc9, 0xfa, 0x97, 0x5a, 0x26, 0x8c, - 0x70, 0x91, 0x7d, 0xb2, 0x19, 0x6f, 0xb9, 0xb4, 0x04, 0x62, 0xa9, 0x37, - 0x9f, 0xd1, 0xee, 0x69, 0x20, 0xd6, 0x98, 0x34, 0x45, 0x0f, 0x0c, 0x34, - 0x7b, 0x34, 0xa3, 0xcf, 0x2a, 0xea, 0x98, 0x98, 0xb1, 0x7a, 0x80, 0x95, - 0x1b, 0x65, 0x9b, 0xa2, 0x70, 0x92, 0x79, 0x93, 0xdf, 0x7a, 0x53, 0x90, - 0xa0, 0xef, 0x8e, 0x32, 0xad, 0x65, 0x99, 0x8b, 0x79, 0x20, 0x47, 0xd4, - 0xc9, 0xb2, 0x5d, 0xf7, 0xa3, 0xb0, 0xe3, 0x17, 0xfa, 0xbf, 0x4d, 0x5d, - 0xd7, 0x70, 0x1f, 0x5b, 0x78, 0x71, 0x6e, 0xd8, 0xc2, 0xa3, 0x15, 0x0b, - 0x78, 0x46, 0xaa, 0xfd, 0xbe, 0xb3, 0x01, 0x97, 0x5c, 0xb5, 0x8b, 0x62, - 0x25, 0xdc, 0xd5, 0x1f, 0x71, 0x6b, 0x92, 0x43, 0xc1, 0x50, 0xc6, 0xaf, - 0xaf, 0xd2, 0xe3, 0x24, 0xb1, 0xa6, 0x20, 0xc5, 0x32, 0xd0, 0x00, 0xec, - 0xe3, 0x87, 0xad, 0xe1, 0xbe, 0x1c, 0x67, 0x51, 0xbb, 0x72, 0xaa, 0x6e, - 0xea, 0x05, 0xae, 0x8b, 0x88, 0xa2, 0x35, 0x6c, 0x29, 0x63, 0xd0, 0xe5, - 0x83, 0x42, 0x7b, 0x97, 0xfb, 0xf8, 0x00, 0xd2, 0xd1, 0x1a, 0x16, 0x05, - 0x36, 0x15, 0x1c, 0xaa, 0x35, 0x50, 0xec, 0x73, 0x28, 0xdf, 0xbf, 0x4f, - 0x88, 0x15, 0xe2, 0xe9, 0xa5, 0x4d, 0xd0, 0x84, 0xcb, 0x91, 0x20, 0x53, - 0xf7, 0x34, 0xe5, 0xd9, 0xfd, 0x3d, 0x55, 0x75, 0xeb, 0x72, 0x59, 0xd5, - 0x99, 0x98, 0xf0, 0x33, 0xfb, 0xca, 0xa4, 0x8f, 0xdd, 0x70, 0xae, 0xed, - 0x06, 0x24, 0x3f, 0x9b, 0x0d, 0x01, 0xaf, 0xe0, 0x88, 0x3a, 0x7e, 0xe4, - 0x11, 0x6f, 0xc0, 0x99, 0xbc, 0xb6, 0x26, 0x27, 0xeb, 0xf1, 0x12, 0x9d, - 0x92, 0x86, 0xb1, 0x46, 0x12, 0xf6, 0x33, 0x78, 0x72, 0xbd, 0x13, 0x63, - 0x6f, 0xa0, 0xac, 0x2c, 0xd7, 0xcf, 0xc8, 0x7f, 0x57, 0x50, 0x99, 0xa4, - 0xd2, 0x1c, 0x3a, 0x91, 0xe1, 0x61, 0xde, 0xf1, 0xd3, 0x5e, 0xeb, 0x41, - 0x8e, 0x25, 0x45, 0x79, 0x11, 0x47, 0x5d, 0x1c, 0x97, 0xa3, 0x42, 0x00, - 0xc4, 0x5c, 0x64, 0xe2, 0x42, 0xc3, 0x0b, 0xd8, 0x9a, 0x31, 0xf6, 0x35, - 0xc2, 0xee, 0xe4, 0xda, 0x11, 0xdd, 0xc9, 0x87, 0xb6, 0x56, 0xe1, 0xef, - 0x59, 0x69, 0x5a, 0xc2, 0x04, 0x2e, 0xaa, 0xa1, 0x23, 0xfe, 0x57, 0x54, - 0x5e, 0x17, 0xcc, 0xef, 0xfa, 0x69, 0x20, 0x7c, 0xc9, 0x43, 0x68, 0x8b, - 0xd3, 0x3a, 0x91, 0x50, 0x81, 0xd2, 0xd7, 0x32, 0xa7, 0x80, 0x26, 0xac, - 0xd3, 0xc8, 0x5d, 0x9f, 0x00, 0x29, 0x2d, 0xa3, 0x60, 0x41, 0x1d, 0x65, - 0x03, 0x3a, 0xe3, 0xb7, 0xc2, 0xde, 0x94, 0x79, 0xe8, 0xbc, 0x36, 0xcf, - 0x74, 0xd3, 0x21, 0x5d, 0xbd, 0xb7, 0xd3, 0xfb, 0x77, 0xb1, 0x00, 0x63, - 0x00, 0x27, 0x1d, 0xe5, 0xe1, 0xbf, 0x75, 0x4f, 0x48, 0xab, 0x1e, 0xbf, - 0x36, 0xb0, 0x03, 0x50, 0xf7, 0x18, 0xb5, 0xcb, 0x22, 0x94, 0xc6, 0x77, - 0x24, 0xf8, 0x66, 0x0a, 0x92, 0x10, 0xac, 0xcc, 0x55, 0xc9, 0x52, 0x46, - 0xb1, 0x7c, 0x5b, 0xc3, 0xf6, 0x30, 0xea, 0x21, 0x1a, 0x19, 0x66, 0xe1, - 0xbd, 0xfe, 0x1a, 0xff, 0xa1, 0xd6, 0x23, 0x89, 0x16, 0x17, 0xa8, 0x4b, - 0xbd, 0x5e, 0x77, 0x75, 0x3b, 0x29, 0x78, 0x7e, 0x2e, 0xd2, 0xdd, 0x4a, - 0xb1, 0xf6, 0x23, 0x41, 0x4c, 0x89, 0xa8, 0x67, 0x3f, 0xfb, 0x14, 0xd1, - 0xfe, 0xc9, 0x57, 0xbd, 0x1e, 0x21, 0xb0, 0xe9, 0xf0, 0x47, 0x5b, 0xa5, - 0x96, 0x88, 0x87, 0x66, 0xf3, 0x38, 0x09, 0x8a, 0xf1, 0x84, 0x39, 0xde, - 0x33, 0x36, 0x5c, 0x8f, 0x0e, 0xf8, 0x57, 0x16, 0xa0, 0x95, 0xa6, 0x3c, - 0x85, 0x02, 0x79, 0xdc, 0xda, 0x43, 0x99, 0x40, 0x13, 0x6b, 0xf2, 0xe7, - 0x1f, 0x5d, 0x55, 0x97, 0x57, 0x86, 0xe4, 0x9e, 0x4c, 0xb7, 0x9d, 0xcd, - 0x6d, 0x55, 0xad, 0x66, 0x28, 0xd6, 0xd2, 0x67, 0xa2, 0x3f, 0xf2, 0x2c, - 0x30, 0x61, 0xf3, 0x7c, 0x12, 0xa5, 0xe4, 0xaa, 0xeb, 0xfa, 0xa4, 0xb4, - 0x33, 0xb8, 0xbd, 0xd2, 0x47, 0x5c, 0xd2, 0x7d, 0x43, 0xb7, 0xe3, 0x05, - 0x34, 0xfe, 0xe1, 0x79, 0xbf, 0xb5, 0x89, 0x49, 0x3d, 0xde, 0xdf, 0x86, - 0x6a, 0x76, 0x1f, 0x4e, 0xe9, 0xa8, 0x2c, 0x93, 0xfa, 0x25, 0xfc, 0x8a, - 0x4a, 0xc2, 0x53, 0x1e, 0xd3, 0xdc, 0x2b, 0x67, 0x9f, 0xeb, 0x6f, 0xe2, - 0x8a, 0x8e, 0x10, 0x3b, 0x85, 0x5e, 0x93, 0x9e, 0xa7, 0x59, 0xbc, 0x72, - 0xf3, 0x2b, 0xfa, 0x7a, 0x19, 0x9e, 0x18, 0x81, 0xab, 0x2d, 0x37, 0x2f, - 0x2e, 0xb0, 0x1f, 0x2d, 0x55, 0x9a, 0x5e, 0x61, 0xde, 0x51, 0x62, 0xe6, - 0x64, 0x25, 0xd5, 0xf9, 0xd1, 0xe9, 0x09, 0xd4, 0xc0, 0x76, 0x3e, 0x4c, - 0x53, 0xf2, 0x21, 0x2d, 0xd3, 0xf6, 0xc9, 0x93, 0xcd, 0x73, 0xbf, 0x65, - 0xe3, 0x39, 0x31, 0x37, 0x2d, 0x20, 0x25, 0x9e, 0x77, 0x39, 0xee, 0xb6, - 0x8f, 0x61, 0x65, 0xa9, 0x78, 0x86, 0x02, 0xf1, 0xc4, 0x90, 0x36, 0x5b, - 0x28, 0xc6, 0x56, 0xb5, 0x57, 0x53, 0x54, 0xd6, 0x45, 0xa3, 0xff, 0xb0, - 0xd1, 0x68, 0x2f, 0x06, 0x28, 0x5f, 0x87, 0x17, 0x06, 0x2a, 0x7a, 0xb7, - 0x74, 0xa9, 0xd5, 0x2e, 0x8c, 0xcd, 0x45, 0x8e, 0xb8, 0x97, 0xb6, 0xe8, - 0xf8, 0x64, 0xc4, 0xcd, 0x67, 0x19, 0xd9, 0x7c, 0x2d, 0xae, 0x25, 0x02, - 0x1c, 0x0b, 0xe0, 0xad, 0x59, 0xb2, 0x1e, 0x0c, 0x99, 0x0b, 0x3f, 0xc7, - 0xa7, 0xd9, 0x5e, 0x37, 0xf8, 0x39, 0x1d, 0x61, 0x7d, 0x36, 0x8b, 0x0d, - 0xfe, 0x93, 0x6c, 0xde, 0x57, 0xab, 0xef, 0xbe, 0x54, 0x8d, 0x3e, 0x35, - 0xc9, 0xef, 0x90, 0x3d, 0x40, 0xc3, 0x58, 0xa4, 0x02, 0x16, 0x93, 0x53, - 0x2b, 0xd4, 0xa2, 0xd8, 0x4c, 0xe8, 0x84, 0x29, 0xbb, 0x08, 0xe4, 0x49, - 0x77, 0x92, 0x74, 0xed, 0xbf, 0x27, 0x7c, 0xc0, 0xfe, 0xf3, 0x10, 0xc9, - 0xa7, 0xf6, 0x59, 0xa3, 0x54, 0x1f, 0xd5, 0xb9, 0xeb, 0x6c, 0x16, 0x92, - 0x6f, 0xa4, 0x1a, 0x4c, 0xff, 0xcd, 0xbb, 0x25, 0x8c, 0x37, 0x27, 0xbe, - 0x70, 0x18, 0x8b, 0xf6, 0xac, 0x8c, 0xc5, 0xa1, 0x60, 0x3f, 0x79, 0x79, - 0x75, 0x05, 0xe9, 0x25, 0xd0, 0x52, 0x32, 0x35, 0xc3, 0x9e, 0x55, 0xb4, - 0xa8, 0x55, 0xec, 0x2f, 0x03, 0x39, 0x3d, 0x1c, 0x9a, 0xb3, 0xe1, 0xee, - 0xf4, 0x54, 0x1c, 0x0a, 0xe4, 0xff, 0xb4, 0x99, 0x86, 0xd0, 0xfe, 0xaa, - 0x49, 0x36, 0xf9, 0x9e, 0x34, 0xa3, 0x0b, 0x7b, 0x9d, 0xb9, 0x67, 0x69, - 0xe1, 0xd3, 0xc6, 0xf0, 0xfd, 0xbf, 0x32, 0xb2, 0x74, 0xb8, 0x18, 0x4d, - 0x2d, 0x66, 0x85, 0x4f, 0x0e, 0xcd, 0xbc, 0x3a, 0xc3, 0x8e, 0xa5, 0xc1, - 0x8e, 0x68, 0x20, 0x00, 0xe6, 0xdb, 0xec, 0x99, 0x4d, 0x27, 0x0d, 0x30, - 0x1c, 0x02, 0x16, 0x2c, 0xfc, 0x2c, 0x86, 0x8b, 0x88, 0x8a, 0x68, 0x8a, - 0x52, 0x76, 0x52, 0x54, 0x81, 0xc5, 0xc1, 0xf1, 0xd7, 0xba, 0x35, 0xd5, - 0xe4, 0x36, 0x5c, 0xbf, 0x1f, 0xa8, 0x60, 0xee, 0x3d, 0x5b, 0xa3, 0x34, - 0x69, 0x97, 0x9c, 0xcf, 0x40, 0x3b, 0xf5, 0x5a, 0x3f, 0x4f, 0x6a, 0xa2, - 0xa9, 0x38, 0x66, 0x7e, 0x3c, 0x80, 0x3b, 0x97, 0x7d, 0x55, 0x3d, 0x12, - 0x9d, 0x45, 0xb3, 0x48, 0x45, 0xf7, 0x61, 0x74, 0x29, 0x4f, 0xcd, 0x66, - 0x1f, 0xc5, 0x49, 0xed, 0xd7, 0xc0, 0xc1, 0x75, 0x05, 0x6a, 0x8b, 0x8a, - 0x02, 0xc9, 0xa6, 0x5e, 0x30, 0x7a, 0x78, 0x7a, 0xae, 0x25, 0xe2, 0x11, - 0xdc, 0xc9, 0xfe, 0x32, 0xfa, 0x96, 0x83, 0x6f, 0x0e, 0xec, 0x7c, 0x13, - 0x53, 0x1f, 0x7e, 0x71, 0x84, 0xd0, 0x68, 0x75, 0x24, 0xb4, 0x16, 0x9b, - 0x44, 0xc5, 0xe6, 0x1c, 0x0e, 0x43, 0xd6, 0x86, 0x94, 0x24, 0x75, 0x81, - 0x29, 0x60, 0xeb, 0xca, 0x0a, 0x29, 0x46, 0x90, 0x25, 0x79, 0x5d, 0xc8, - 0xd6, 0x9a, 0xc1, 0xa9, 0x35, 0xa0, 0x30, 0xfc, 0xdb, 0x47, 0x8c, 0xfd, - 0xe0, 0x16, 0x9f, 0x67, 0xb3, 0xa9, 0xeb, 0x7c, 0x54, 0xab, 0x7e, 0xef, - 0xef, 0x20, 0x49, 0x44, 0xea, 0x00, 0xfc, 0x4f, 0xbe, 0x91, 0x62, 0xa4, - 0x99, 0xc5, 0x23, 0x7f, 0xa1, 0x1f, 0x6a, 0x54, 0x13, 0xd3, 0xb4, 0xb0, - 0x48, 0xc1, 0x88, 0x41, 0x84, 0xce, 0xe7, 0xdd, 0xc7, 0xcc, 0x7b, 0x75, - 0x8b, 0xe1, 0x89, 0xff, 0x3b, 0x37, 0x0a, 0x03, 0x7a, 0x22, 0xe6, 0xc2, - 0x4b, 0x3a, 0x28, 0x50, 0x7c, 0x8c, 0x6c, 0xe8, 0x36, 0x90, 0x6b, 0xff, - 0xcf, 0x87, 0x73, 0xb9, 0x1a, 0xc2, 0x16, 0x8f, 0x11, 0x54, 0xf9, 0x91, - 0xa1, 0x55, 0x4c, 0x6f, 0xa2, 0x21, 0x2c, 0x23, 0xe0, 0xdb, 0x3f, 0x6f, - 0xf6, 0x84, 0x3d, 0xa7, 0x8f, 0x7a, 0x7e, 0x4d, 0xd5, 0x7d, 0x0d, 0xaa, - 0x0d, 0x03, 0x1a, 0x41, 0x11, 0x05, 0xc1, 0x82, 0xd0, 0x75, 0xee, 0xdf, - 0x44, 0x94, 0x67, 0xdd, 0x91, 0x80, 0xd9, 0x77, 0x87, 0xb2, 0xe7, 0x6b, - 0xff, 0x24, 0x82, 0x46, 0xe7, 0x41, 0x70, 0xe5, 0x7d, 0x60, 0xd5, 0x47, - 0xed, 0x3d, 0xfa, 0x38, 0x70, 0xff, 0xe2, 0x00, 0x38, 0x5d, 0x4c, 0x54, - 0x0c, 0x18, 0x20, 0xba, 0x55, 0x71, 0x68, 0x4a, 0x7e, 0x66, 0xf5, 0x88, - 0xa9, 0xed, 0x1d, 0xbc, 0xd8, 0xa8, 0x48, 0x54, 0x82, 0x74, 0x00, 0xe8, - 0x84, 0x8d, 0x5a, 0x0c, 0xd2, 0x64, 0x34, 0x97, 0x80, 0x2d, 0x45, 0x85, - 0xba, 0x82, 0x94, 0x29, 0x12, 0xc7, 0x18, 0x11, 0xa8, 0xbc, 0x9d, 0xd3, - 0x62, 0x28, 0x6f, 0x21, 0xfb, 0xa5, 0x24, 0x01, 0x86, 0xd0, 0x20, 0xf6, - 0xb4, 0xa5, 0xd4, 0x9f, 0x3d, 0x60, 0x51, 0x85, 0x98, 0x1d, 0x76, 0x2e, - 0x09, 0xae, 0x1b, 0x65, 0x99, 0x4c, 0x16, 0x05, 0x8f, 0x8a, 0xc4, 0xd5, - 0x8a, 0xb6, 0xe6, 0xfc, 0xfb, 0xb3, 0x20, 0x0a, 0x99, 0xf4, 0xcb, 0x9e, - 0x32, 0x25, 0x43, 0xd6, 0x9a, 0xf8, 0xac, 0xa9, 0xbc, 0xc9, 0x42, 0x43, - 0xa1, 0xf0, 0x81, 0xcc, 0xc3, 0xcf, 0xaf, 0xcc, 0x4e, 0xb7, 0xec, 0x78, - 0xb4, 0x6a, 0x28, 0x34, 0xe6, 0x64, 0xbf, 0x9e, 0x5e, 0x51, 0x0f, 0xe4, - 0xfa, 0xd3, 0xc2, 0x67, 0x80, 0xa7, 0x5a, 0x51, 0x07, 0x22, 0xa3, 0xbe, - 0xc2, 0x06, 0xec, 0xa7, 0x8b, 0x04, 0xa1, 0x98, 0x70, 0x8a, 0x5f, 0x9f, - 0x2d, 0x70, 0x6d, 0xc2, 0x00, 0x7c, 0xd9, 0xc5, 0xf7, 0x82, 0xb4, 0x5b, - 0x7f, 0x09, 0x85, 0x70, 0x1a, 0x01, 0xe6, 0x23, 0x4f, 0xa9, 0xd1, 0xa1, - 0x25, 0x1b, 0x87, 0xd3, 0x81, 0xb0, 0xb7, 0x03, 0x75, 0x5c, 0x77, 0x86, - 0x38, 0xae, 0x95, 0x86, 0x5e, 0x3a, 0xc2, 0xe9, 0xb3, 0xd0, 0xb2, 0x35, - 0x73, 0x38, 0x20, 0x01, 0xb4, 0x0d, 0xaf, 0xf9, 0xf2, 0xf2, 0x7b, 0x94, - 0x71, 0x92, 0x23, 0x31, 0x4d, 0x9c, 0x58, 0xe4, 0x52, 0xc1, 0xfc, 0xcc, - 0xd9, 0xda, 0x8d, 0xa9, 0x51, 0x78, 0x2b, 0x53, 0x72, 0x31, 0x2b, 0x3d, - 0x27, 0x00, 0xa9, 0x9d, 0x4a, 0xac, 0x53, 0x40, 0xae, 0xec, 0x55, 0x95, - 0x4a, 0x4b, 0xaf, 0xcd, 0x73, 0x15, 0x34, 0xd8, 0x5a, 0xb4, 0x42, 0xac, - 0x46, 0x9c, 0x42, 0x1d, 0x88, 0x97, 0xc3, 0x32, 0x8a, 0xef, 0x66, 0xd2, - 0x7e, 0x80, 0x48, 0x31, 0x92, 0x96, 0x30, 0x94, 0x04, 0x8a, 0x00, 0xce, - 0xa5, 0x7a, 0xfd, 0xc1, 0x7b, 0xe4, 0x41, 0x87, 0x6b, 0xeb, 0xeb, 0xd1, - 0x5c, 0x0e, 0x09, 0x6b, 0xe4, 0xf8, 0x25, 0x27, 0x2e, 0xa2, 0x04, 0x1e, - 0x46, 0x46, 0x16, 0xc5, 0xa6, 0x62, 0x54, 0xc3, 0x01, 0x7f, 0xd3, 0x0c, - 0xd5, 0x18, 0x82, 0x9c, 0xd8, 0x96, 0x6b, 0x18, 0xe9, 0x74, 0x87, 0x7a, - 0xa7, 0xee, 0x5e, 0x16, 0x27, 0x75, 0xd5, 0xa6, 0x19, 0x88, 0x6c, 0x98, - 0x62, 0x0d, 0x25, 0x38, 0xec, 0x52, 0xc0, 0x03, 0x81, 0x95, 0x17, 0x01, - 0x0f, 0xd0, 0xf2, 0xef, 0x05, 0x10, 0xbd, 0x86, 0xc6, 0x54, 0x12, 0xa9, - 0x5a, 0x7c, 0x46, 0x20, 0xe6, 0xb4, 0x0f, 0xbf, 0xe2, 0x1a, 0x1f, 0x83, - 0x84, 0x4c, 0x2b, 0xf6, 0x4b, 0x49, 0x2c, 0x5e, 0x64, 0x0d, 0x55, 0xa3, - 0x3c, 0x06, 0xeb, 0x6c, 0x57, 0x7d, 0x5e, 0xed, 0x53, 0x71, 0xa4, 0x8a, - 0x24, 0x5f, 0xa8, 0x29, 0x03, 0xba, 0x32, 0x7f, 0xdd, 0x81, 0x89, 0xb1, - 0x0b, 0xe7, 0xc7, 0x41, 0x28, 0x43, 0x23, 0x2a, 0x53, 0x22, 0xc3, 0xcb, - 0x88, 0x24, 0xdf, 0x7b, 0x8c, 0x65, 0x30, 0x4c, 0x88, 0x6b, 0x85, 0x1d, - 0xb4, 0xfb, 0x69, 0xae, 0xe5, 0x6c, 0x9d, 0x07, 0x0a, 0x86, 0x36, 0xf8, - 0x25, 0x03, 0x21, 0xe4, 0xe7, 0xd8, 0xee, 0x85, 0xa8, 0xc2, 0x0f, 0x3f, - 0x1a, 0xc7, 0xe4, 0x32, 0x9c, 0x11, 0x34, 0xcd, 0x3f, 0xe9, 0x6e, 0xd7, - 0x6d, 0x84, 0x9b, 0xd0, 0xeb, 0x0a, 0x08, 0xcb, 0x7b, 0x20, 0x54, 0xd7, - 0x22, 0xb4, 0xf7, 0x2a, 0x06, 0xe2, 0x72, 0x34, 0x40, 0x06, 0xe6, 0x91, - 0x80, 0xea, 0x86, 0x50, 0xeb, 0x65, 0x13, 0xba, 0xb7, 0x42, 0xf0, 0xda, - 0x12, 0x5d, 0x86, 0x5e, 0x4a, 0x66, 0x7c, 0xe5, 0xe6, 0x88, 0x3a, 0xb7, - 0xc1, 0xbf, 0x05, 0x4e, 0x68, 0xf3, 0xfe, 0xd0, 0x77, 0x39, 0x75, 0x8e, - 0x09, 0x7f, 0x9d, 0xfd, 0x9b, 0x64, 0xe1, 0x18, 0x8b, 0x29, 0x6f, 0xae, - 0x63, 0x0e, 0x63, 0x15, 0x04, 0xb8, 0x00, 0xb5, 0x81, 0xe6, 0x67, 0x30, - 0x9c, 0x3f, 0xcc, 0x8c, 0xa5, 0x2b, 0x5e, 0x63, 0x52, 0x68, 0x52, 0xc8, - 0x8e, 0x45, 0x08, 0x15, 0xb2, 0x5c, 0xf6, 0xd7, 0x28, 0x4e, 0xf6, 0x83, - 0xe3, 0x56, 0x1e, 0xc3, 0xb2, 0xab, 0x70, 0x99, 0x1c, 0xb1, 0x52, 0xc5, - 0xdf, 0x0b, 0x99, 0x50, 0xa7, 0xb4, 0x7a, 0x8d, 0x57, 0x74, 0x4c, 0x8d, - 0x4c, 0xd7, 0xfd, 0x24, 0x8c, 0xff, 0x44, 0x49, 0x3d, 0xd2, 0xc3, 0xf0, - 0xfe, 0xc3, 0x88, 0x47, 0xe5, 0x72, 0xac, 0x96, 0x97, 0x1f, 0xf2, 0x2b, - 0x00, 0x3d, 0x91, 0x32, 0xa5, 0x14, 0x88, 0x08, 0x99, 0x60, 0x35, 0xcd, - 0x86, 0x28, 0xd7, 0x42, 0xc4, 0x0b, 0x66, 0x42, 0x47, 0x74, 0x4c, 0x8d, - 0x4c, 0xd7, 0xfd, 0x24, 0x8c, 0xfe, 0x44, 0x49, 0x3d, 0xd2, 0xc3, 0xf0, - 0xd4, 0xf6, 0x6e, 0x25, 0x2d, 0xa1, 0x49, 0xf4, 0xb3, 0xa0, 0x50, 0xf2, - 0x70, 0x09, 0xa5, 0x5c, 0x88, 0x83, 0xad, 0xbd, 0x7b, 0x2f, 0x9f, 0xe2, - 0x3a, 0x5b, 0xb6, 0x30, 0x21, 0xf8, 0x84, 0x87, 0x5c, 0xe2, 0x13, 0x42, - 0x00, 0x6c, 0x24, 0xee, 0x29, 0xc2, 0x23, 0x45, 0x64, 0x1b, 0xd2, 0x06, - 0xaf, 0x3e, 0xd9, 0x73, 0xaf, 0xab, 0x2b, 0x2b, 0xba, 0x93, 0x23, 0x7e, - 0xb4, 0xb9, 0xff, 0x58, 0xd3, 0x86, 0x44, 0x0f, 0x90, 0xa1, 0x2c, 0xec, - 0x53, 0x06, 0x94, 0x48, 0x30, 0xce, 0x64, 0xfe, 0xf7, 0x5d, 0xb5, 0xf7, - 0xb7, 0x5e, 0xe1, 0x91, 0xac, 0xad, 0x83, 0x5a, 0xc2, 0xdd, 0x72, 0x86, - 0xb2, 0x9b, 0x13, 0xf2, 0x9f, 0xfe, 0xa7, 0xd1, 0x61, 0x79, 0x40, 0xc9, - 0xfa, 0x23, 0xbc, 0x83, 0x07, 0xf3, 0x49, 0xc9, 0x6a, 0x46, 0x43, 0x98, - 0x3a, 0xdd, 0xea, 0x7e, 0xab, 0xa3, 0x4a, 0x4a, 0x71, 0xae, 0xdf, 0xdf, - 0xd3, 0x64, 0xda, 0xd6, 0xf9, 0x24, 0xcb, 0x49, 0x0a, 0x60, 0xcf, 0x24, - 0x13, 0x99, 0xf6, 0xcf, 0x77, 0x87, 0xb9, 0x72, 0x6f, 0x5c, 0xb8, 0xe8, - 0x76, 0x71, 0x97, 0xd7, 0x0e, 0x8e, 0x16, 0xc7, 0x07, 0x54, 0x0e, 0x1c, - 0x29, 0x2d, 0xbe, 0x94, 0x5f, 0xd7, 0xdd, 0x75, 0x90, 0x57, 0x2f, 0x35, - 0x96, 0x60, 0x36, 0x73, 0xb9, 0x14, 0x4e, 0xf6, 0xe0, 0xe7, 0xdd, 0x6b, - 0x03, 0x2a, 0xc8, 0x9b, 0x49, 0xb6, 0xde, 0x15, 0x5b, 0xe9, 0xe3, 0x19, - 0x03, 0xbe, 0xb0, 0x0c, 0xd8, 0x6f, 0x99, 0xd5, 0x5b, 0x4a, 0x2a, 0xb4, - 0x38, 0xe3, 0x6d, 0xa8, 0x4f, 0xc6, 0x1c, 0x81, 0x9a, 0x30, 0x3b, 0xdf, - 0x98, 0xba, 0x88, 0x16, 0x61, 0xd6, 0xe4, 0x5f, 0xea, 0x75, 0x48, 0x11, - 0x7c, 0x03, 0x82, 0xf5, 0x76, 0xd1, 0x9d, 0x40, 0xf7, 0xcf, 0x66, 0x72, - 0xd6, 0xf1, 0xe2, 0xa5, 0x62, 0xeb, 0x5c, 0xdb, 0x25, 0x63, 0x31, 0x03, - 0xef, 0x28, 0x47, 0xdf, 0x85, 0xf8, 0x9e, 0x97, 0x62, 0xa8, 0xba, 0x38, - 0x29, 0xc9, 0x93, 0xd5, 0x66, 0x52, 0x6e, 0x8d, 0xdf, 0x2d, 0xeb, 0xca, - 0xf9, 0x7d, 0xfd, 0x63, 0x93, 0x60, 0x65, 0x8b, 0x09, 0x70, 0x1f, 0xd7, - 0xb9, 0xa2, 0x2d, 0x2b, 0x12, 0xdb, 0xd2, 0x1a, 0x37, 0x13, 0x5f, 0xb9, - 0x35, 0x6c, 0x13, 0x1f, 0x4b, 0x7e, 0x56, 0xd3, 0x14, 0x49, 0xbd, 0x60, - 0x43, 0xe6, 0x4f, 0x6b, 0xc0, 0x57, 0x8b, 0x98, 0x1d, 0xa4, 0x7b, 0x8c, - 0xfe, 0xcb, 0x3a, 0xf1, 0xdb, 0x12, 0x3f, 0x25, 0x81, 0x51, 0x2b, 0xb2, - 0xc2, 0xef, 0x4b, 0x90, 0x75, 0xb9, 0x5d, 0xc4, 0xd2, 0x5d, 0x6d, 0x3f, - 0x8b, 0x84, 0xe2, 0xb5, 0x80, 0x6e, 0xd9, 0x44, 0x14, 0x89, 0xcf, 0x6b, - 0x5a, 0x7d, 0xca, 0xcb, 0x62, 0x1e, 0xd0, 0x14, 0xeb, 0xb1, 0x8f, 0xdf, - 0xf1, 0x9e, 0xc9, 0x09, 0xd9, 0xed, 0x4c, 0xd4, 0x0d, 0x79, 0x14, 0x55, - 0x49, 0x72, 0x7b, 0x8c, 0x4c, 0xe7, 0x7d, 0x65, 0x5b, 0x7b, 0x88, 0x62, - 0xeb, 0x36, 0x0a, 0xaa, 0xc3, 0x14, 0x2a, 0x5a, 0x1d, 0x5f, 0x61, 0xde, - 0xb2, 0x56, 0xcb, 0x19, 0x5e, 0x0e, 0x2c, 0x05, 0x45, 0x5c, 0x56, 0x20, - 0x60, 0x00, 0xcf, 0x61, 0x50, 0x47, 0x1a, 0x0f, 0x54, 0x35, 0x5f, 0x8f, - 0x76, 0x3d, 0x59, 0xed, 0x87, 0x1c, 0x29, 0xb4, 0xef, 0xc9, 0x8c, 0x6d, - 0x1c, 0x2f, 0xc5, 0xef, 0xfe, 0x43, 0xf9, 0x2b, 0x5f, 0xcc, 0x33, 0xa7, - 0xda, 0xae, 0xa9, 0x9b, 0xbb, 0x73, 0x08, 0xca, 0x27, 0x23, 0x8b, 0x08, - 0xca, 0xc7, 0xa7, 0x44, 0x4c, 0x53, 0xa7, 0x52, 0x39, 0x52, 0x6e, 0x98, - 0xb1, 0xe2, 0x6a, 0x72, 0xd0, 0xc0, 0x07, 0xb2, 0x71, 0xb7, 0xa2, 0x86, - 0xa1, 0x11, 0x73, 0xf3, 0x26, 0x26, 0x23, 0x56, 0x31, 0xc9, 0x3a, 0xc6, - 0xe9, 0x23, 0x3e, 0x02, 0x4b, 0x26, 0x2e, 0x4a, 0x93, 0x6e, 0x35, 0xb6, - 0xe5, 0xae, 0x44, 0xe6, 0xcb, 0x99, 0x24, 0x19, 0xdd, 0xdb, 0xa6, 0x81, - 0xcc, 0x0e, 0xec, 0x67, 0x64, 0xfb, 0xec, 0xb2, 0x3c, 0x53, 0x5a, 0x88, - 0x80, 0xd6, 0x67, 0xff, 0xf9, 0xe1, 0xc2, 0x21, 0xb7, 0x37, 0x1c, 0xc3, - 0x50, 0x5f, 0x76, 0x6a, 0xec, 0x7c, 0x4c, 0x44, 0x59, 0xaf, 0xb1, 0x5e, - 0xef, 0xe6, 0xd2, 0x46, 0xeb, 0x98, 0x3e, 0xb7, 0x44, 0xc6, 0xf0, 0xfd, - 0x3c, 0x42, 0x42, 0x86, 0xf6, 0xe2, 0xf8, 0x0c, 0xa8, 0xdd, 0x38, 0xea, - 0x73, 0x6b, 0x7a, 0x63, 0x72, 0xec, 0xe1, 0x3e, 0xdd, 0x89, 0x12, 0xa8, - 0xc8, 0x04, 0x5b, 0x75, 0x3b, 0x05, 0x7b, 0xdb, 0x28, 0x7e, 0xdb, 0xf0, - 0xe6, 0x09, 0x98, 0x42, 0xd0, 0x20, 0xb8, 0x43, 0xc3, 0xa0, 0x96, 0x34, - 0xbd, 0x8d, 0xb6, 0x4a, 0x88, 0x18, 0x1c, 0x28, 0xd8, 0x54, 0xfb, 0xae, - 0x2f, 0xcf, 0x34, 0x37, 0x51, 0x8a, 0x5c, 0xf2, 0x70, 0x35, 0x7d, 0x7c, - 0x11, 0x0a, 0x6b, 0x0e, 0xa6, 0x99, 0xd1, 0xdd, 0xa3, 0x0a, 0x4b, 0xb8, - 0xa3, 0x40, 0x46, 0xd5, 0x00, 0x79, 0x96, 0x03, 0x6d, 0x87, 0x32, 0x5a, - 0x59, 0x22, 0xe0, 0x91, 0xa9, 0xcb, 0xe3, 0xdd, 0xde, 0xb2, 0xc4, 0xf5, - 0xe1, 0x88, 0x6f, 0x1d, 0xe8, 0x70, 0xa2, 0xa1, 0xe2, 0xd1, 0x0a, 0x77, - 0x55, 0xfc, 0x75, 0x1e, 0x00, 0xd6, 0x8a, 0xab, 0x8e, 0x2a, 0x8b, 0xe3, - 0x64, 0x02, 0x13, 0xe8, 0x34, 0x5d, 0x9b, 0x17, 0x3d, 0xf3, 0x4e, 0xa9, - 0x79, 0x5c, 0x8e, 0x2a, 0x54, 0x59, 0xc9, 0x78, 0xfd, 0xd6, 0xbc, 0x2c, - 0xf7, 0x66, 0x5a, 0x4a, 0xb3, 0xc8, 0x60, 0x11, 0xd5, 0x7d, 0xcb, 0x4a, - 0xf6, 0x32, 0xa6, 0x6d, 0x6b, 0xf7, 0xd1, 0x59, 0xe3, 0xa5, 0x1a, 0x42, - 0x09, 0x64, 0xb3, 0x06, 0x9a, 0x81, 0x7f, 0xa0, 0xcb, 0x02, 0x92, 0x76, - 0x34, 0x8f, 0x1d, 0x64, 0xf7, 0x64, 0x1a, 0x1c, 0xe7, 0x0f, 0x03, 0x05, - 0xc3, 0x88, 0x38, 0x79, 0xef, 0x02, 0x33, 0x69, 0xa4, 0x33, 0xfb, 0x2e, - 0x83, 0x70, 0x7e, 0x69, 0x1e, 0xe3, 0xaf, 0x5a, 0x4f, 0xbc, 0x42, 0xec, - 0x44, 0x5a, 0x4f, 0xd7, 0x5a, 0x96, 0x5d, 0x7a, 0x9b, 0xf1, 0x71, 0x58, - 0x9f, 0x7b, 0xee, 0xb1, 0xac, 0xcb, 0xe3, 0x9b, 0x5d, 0x1b, 0x9b, 0xfc, - 0x69, 0xa9, 0x66, 0x19, 0xbd, 0x47, 0x87, 0x1e, 0xb9, 0xdc, 0xd1, 0xa2, - 0xdd, 0x3d, 0x2d, 0x76, 0x1d, 0xb0, 0xb6, 0x69, 0xc1, 0x27, 0x4a, 0x55, - 0x21, 0xdb, 0x66, 0x20, 0x9c, 0x41, 0x97, 0xc5, 0xb7, 0x86, 0x6e, 0x65, - 0xdd, 0xeb, 0xc1, 0xec, 0x62, 0x64, 0xa3, 0x85, 0x6a, 0xd9, 0x50, 0xfc, - 0xec, 0x13, 0x26, 0xf8, 0x3c, 0x4e, 0x2b, 0x49, 0x7c, 0xfa, 0x15, 0x1f, - 0x6b, 0x72, 0x08, 0x12, 0xcf, 0x27, 0xef, 0x67, 0x34, 0xd2, 0x8a, 0x64, - 0xf0, 0x49, 0x26, 0x46, 0x8f, 0x49, 0x02, 0xcf, 0x86, 0x27, 0x54, 0xe2, - 0x90, 0x9c, 0xf2, 0x76, 0x7d, 0x25, 0x7a, 0x47, 0x43, 0x07, 0xc6, 0x7c, - 0x2e, 0xcb, 0xe5, 0xc8, 0x45, 0xb8, 0x77, 0x82, 0xd1, 0x27, 0x33, 0x6a, - 0xb4, 0x29, 0xf9, 0x41, 0xdf, 0x94, 0x6f, 0xf6, 0x58, 0xc4, 0x02, 0x3c, - 0x6b, 0x0d, 0x7d, 0x2f, 0x01, 0x56, 0x37, 0x8e, 0xbe, 0xb6, 0x42, 0x34, - 0xc2, 0xdf, 0x9d, 0xc3, 0x09, 0x39, 0xe0, 0xf7, 0x2e, 0xd6, 0xf7, 0x10, - 0x21, 0x15, 0x9f, 0x73, 0xf9, 0xc5, 0xda, 0x86, 0x42, 0x2c, 0xf1, 0xf0, - 0xc6, 0xd3, 0xb3, 0x03, 0xd8, 0x0d, 0x83, 0x41, 0xa2, 0xb3, 0x62, 0xc8, - 0xc5, 0x97, 0x60, 0x13, 0xc0, 0xf9, 0xd0, 0x80, 0x18, 0xf8, 0x2b, 0xbf, - 0x3f, 0xa1, 0xf9, 0x19, 0xf5, 0x4a, 0x0e, 0xfd, 0xb7, 0x83, 0x11, 0x05, - 0xbc, 0x11, 0x2d, 0x6a, 0xc5, 0x18, 0x9c, 0x54, 0x7b, 0xb4, 0xb0, 0x02, - 0xd3, 0x1c, 0x4c, 0x35, 0xe2, 0xe4, 0x13, 0xf7, 0x94, 0x20, 0xee, 0xee, - 0x60, 0x37, 0xa5, 0xb1, 0xce, 0x5d, 0x1d, 0x49, 0x28, 0xfe, 0xe0, 0x12, - 0x57, 0xa1, 0x5f, 0x3a, 0xf9, 0x8c, 0x13, 0xe7, 0x13, 0x88, 0x14, 0xd8, - 0xfc, 0xd8, 0x62, 0xbd, 0x43, 0xf4, 0xb3, 0xb3, 0xd2, 0x72, 0xf8, 0x04, - 0xa2, 0xc1, 0x0e, 0x8c, 0xc6, 0x47, 0x5c, 0xb7, 0x56, 0xcf, 0x43, 0x2d, - 0x12, 0x0b, 0x76, 0x41, 0x4a, 0xa8, 0x1a, 0xbe, 0xd6, 0x4d, 0x82, 0xf0, - 0xe7, 0x67, 0x1a, 0x9b, 0x73, 0xfa, 0x91, 0xc3, 0xee, 0x5f, 0xf1, 0x3c, - 0x94, 0x03, 0xac, 0xcd, 0x3f, 0x6c, 0x71, 0x2d, 0x12, 0xed, 0xa2, 0x0b, - 0x4e, 0x76, 0x0b, 0xf7, 0x4d, 0x78, 0x85, 0x21, 0x3f, 0x39, 0x2d, 0x35, - 0x98, 0x24, 0xf5, 0xe7, 0xac, 0xcd, 0x7e, 0x90, 0x73, 0xab, 0x82, 0x12, - 0x91, 0x6f, 0x6b, 0xce, 0x16, 0x4c, 0x9f, 0x2e, 0x40, 0x6d, 0xc6, 0x9a, - 0xd0, 0xfe, 0x4c, 0x68, 0x69, 0xc5, 0xec, 0xf8, 0x02, 0xba, 0x8f, 0x64, - 0xc4, 0x94, 0x90, 0x98, 0xbd, 0x8f, 0xe2, 0xa1, 0xb3, 0xf9, 0xc5, 0xb0, - 0x83, 0x87, 0x36, 0x10, 0x53, 0x5f, 0xe7, 0x46, 0x86, 0x7a, 0xd2, 0x5b, - 0x2a, 0xc0, 0x32, 0x49, 0x66, 0x78, 0xcc, 0x80, 0xa4, 0x49, 0xf7, 0x93, - 0x9f, 0x6d, 0x52, 0xd1, 0x97, 0xa7, 0xbc, 0x8f, 0x81, 0xbd, 0x89, 0x40, - 0x46, 0x0e, 0xa3, 0xc6, 0x91, 0xe0, 0xd1, 0x86, 0xf3, 0x0e, 0x83, 0xb6, - 0xb4, 0xba, 0x3c, 0x39, 0x70, 0xab, 0x45, 0x0e, 0x14, 0xfe, 0x89, 0x69, - 0xc0, 0xc4, 0x12, 0x2b, 0x47, 0x58, 0xbb, 0xaa, 0xe1, 0x9c, 0x4b, 0x96, - 0xe9, 0xdf, 0x0d, 0x8c, 0x7c, 0xc6, 0x72, 0x14, 0x6c, 0xab, 0xc2, 0xdd, - 0x17, 0xa5, 0x25, 0x46, 0x60, 0xeb, 0xb2, 0x20, 0x26, 0xfe, 0x7b, 0x6d, - 0x06, 0x6b, 0x87, 0x7e, 0x6b, 0xa0, 0x18, 0xe8, 0xc8, 0xc2, 0x8a, 0xc1, - 0x26, 0x65, 0xce, 0xc4, 0x30, 0x32, 0xba, 0x29, 0x2e, 0xc4, 0x2e, 0xc2, - 0xf4, 0x30, 0x48, 0x8d, 0x17, 0xe3, 0xb7, 0x3b, 0x5b, 0x3b, 0x66, 0xc6, - 0x01, 0x2c, 0x96, 0x5f, 0xa5, 0x90, 0x65, 0xed, 0xdf, 0x0d, 0xc3, 0xe0, - 0x49, 0x08, 0xe9, 0x1a, 0x16, 0x8a, 0x3e, 0x21, 0xbc, 0xa5, 0xc2, 0x7b, - 0x49, 0xdf, 0x7b, 0x9c, 0xaa, 0x01, 0x4a, 0x91, 0x87, 0x98, 0xbe, 0x3c, - 0xc5, 0xdd, 0xa9, 0xb4, 0xe8, 0x13, 0xd4, 0xb6, 0x84, 0x3f, 0x9f, 0x8b, - 0xe6, 0x2b, 0x01, 0xf0, 0xbd, 0xa9, 0x75, 0xdc, 0x9a, 0x05, 0x73, 0x07, - 0x34, 0x75, 0x18, 0x60, 0x18, 0x3f, 0x1f, 0xee, 0xe8, 0x9e, 0xd4, 0x8e, - 0xb4, 0xe3, 0xb0, 0x37, 0x55, 0x3c, 0x93, 0x64, 0x26, 0xa3, 0x41, 0x93, - 0xd3, 0xbb, 0x11, 0x32, 0xcf, 0xd9, 0xae, 0xd9, 0x62, 0xff, 0x82, 0x10, - 0x74, 0xc9, 0x6e, 0xd4, 0xe7, 0xf2, 0x22, 0x0f, 0x72, 0x99, 0xb3, 0x54, - 0x8e, 0xce, 0xdb, 0xbb, 0x57, 0xe4, 0x1c, 0x35, 0x9b, 0xe8, 0x0f, 0xe3, - 0x45, 0x2c, 0x4f, 0x41, 0x9a, 0x33, 0x73, 0x88, 0xe7, 0x08, 0x32, 0xb4, - 0x8a, 0x73, 0xdd, 0xd9, 0xd9, 0x72, 0x23, 0xb8, 0xac, 0x91, 0xc8, 0x22, - 0x87, 0xba, 0xa3, 0x07, 0x2e, 0x22, 0x51, 0x59, 0x0a, 0x32, 0x25, 0x34, - 0x68, 0x95, 0xd7, 0x0e, 0x26, 0x96, 0xb4, 0xac, 0x5c, 0xe5, 0x1c, 0xe3, - 0xbe, 0x57, 0xa8, 0xb7, 0x6f, 0xc7, 0xce, 0xda, 0xf5, 0x3f, 0xad, 0x46, - 0x10, 0x29, 0x44, 0x18, 0x32, 0x8b, 0x0e, 0xef, 0x71, 0x9a, 0xd6, 0x21, - 0xe3, 0x8e, 0x48, 0x98, 0x72, 0xa2, 0x0f, 0x31, 0xb3, 0x93, 0x93, 0xa4, - 0x74, 0x4b, 0x3b, 0x33, 0xe6, 0xb9, 0xdc, 0x03, 0x7a, 0x30, 0xae, 0x6d, - 0x1a, 0x38, 0x66, 0x3c, 0x35, 0x88, 0xac, 0xb2, 0x53, 0xb6, 0xdd, 0x30, - 0x24, 0x5e, 0xf6, 0xa7, 0x69, 0x9b, 0xe8, 0xaa, 0x3a, 0xa9, 0xbd, 0x81, - 0xd4, 0xb5, 0xf7, 0x0a, 0xb6, 0x83, 0x55, 0x19, 0xd6, 0x4f, 0x90, 0x91, - 0xe2, 0xe8, 0x4a, 0x9f, 0xb3, 0x44, 0x11, 0x3c, 0xc4, 0xda, 0x8e, 0x56, - 0xf1, 0x6f, 0x98, 0x7a, 0xe3, 0x9c, 0xbf, 0xc8, 0x98, 0x4b, 0x6c, 0x63, - 0x7c, 0x38, 0xfc, 0x5c, 0xd0, 0x00, 0xcc, 0x4d, 0xd3, 0xc9, 0x9d, 0xee, - 0xc2, 0x2e, 0x06, 0x70, 0x28, 0x24, 0x29, 0xe3, 0x35, 0x46, 0x29, 0xa2, - 0x5d, 0xb5, 0x41, 0xa4, 0xcb, 0x01, 0x77, 0x45, 0x96, 0xd3, 0x27, 0x47, - 0xb7, 0x52, 0x7e, 0x7a, 0xdd, 0x2e, 0x3a, 0x7a, 0x53, 0xb9, 0xa7, 0xc8, - 0x8c, 0x1c, 0xe9, 0xfe, 0x6f, 0x6d, 0x27, 0xf2, 0x89, 0x21, 0xd1, 0x57, - 0x58, 0xdf, 0xd2, 0x66, 0xf8, 0xc0, 0xf1, 0xaa, 0x5a, 0x9a, 0x5d, 0xdf, - 0x09, 0xb1, 0xe8, 0x57, 0x45, 0x94, 0x45, 0xed, 0x29, 0x2d, 0x71, 0x13, - 0x27, 0xfe, 0x1e, 0xc9, 0x4d, 0x22, 0xf6, 0x32, 0x64, 0xf3, 0xc8, 0x36, - 0xa3, 0xb1, 0x5f, 0xf6, 0x25, 0xf8, 0xd1, 0xe4, 0x9a, 0xac, 0x47, 0xd7, - 0x27, 0x93, 0xa8, 0xb8, 0x07, 0xf9, 0xa2, 0x62, 0xad, 0xe4, 0x67, 0x41, - 0x92, 0xfd, 0x4e, 0x5d, 0xd7, 0x84, 0x10, 0x77, 0xaa, 0xbe, 0xb7, 0x1e, - 0xeb, 0x25, 0xcf, 0xfd, 0x7d, 0x03, 0x17, 0x86, 0x7d, 0x7e, 0x4e, 0x0a, - 0x72, 0x6c, 0x8f, 0x77, 0x0d, 0x5d, 0x09, 0x7a, 0x30, 0x77, 0x0b, 0xb1, - 0x0d, 0x2e, 0x85, 0x46, 0x03, 0x1e, 0xb1, 0x88, 0xf2, 0x24, 0xe9, 0xa1, - 0xc9, 0x5f, 0xfe, 0xe1, 0xeb, 0xaa, 0x13, 0xb9, 0xf3, 0xeb, 0x89, 0xcf, - 0xa5, 0xe6, 0xe2, 0xf9, 0x16, 0x42, 0xa5, 0xd8, 0x2f, 0x32, 0x34, 0xa3, - 0x72, 0x4c, 0xa5, 0x6b, 0x60, 0x2f, 0xdb, 0x77, 0x9f, 0xe5, 0xd4, 0x19, - 0xd5, 0xc2, 0x47, 0xfc, 0xf4, 0x13, 0x9d, 0xf2, 0x11, 0xe1, 0x97, 0x35, - 0x4f, 0xc0, 0xcb, 0xf0, 0x3f, 0x0c, 0x12, 0x31, 0xc2, 0xb1, 0xcb, 0xf8, - 0x55, 0x69, 0x74, 0x0d, 0x4f, 0x9b, 0xfa, 0x3d, 0x60, 0x19, 0x2e, 0x2b, - 0x3a, 0xcd, 0x7b, 0xe5, 0x66, 0x58, 0xd7, 0x22, 0x16, 0xfb, 0x8c, 0x19, - 0x62, 0x44, 0x82, 0xad, 0xa5, 0x0d, 0x2a, 0x41, 0x22, 0xb8, 0xac, 0xba, - 0x58, 0x4c, 0x9d, 0x9e, 0xba, 0x90, 0x09, 0x30, 0xea, 0xd6, 0x8f, 0x4a, - 0xc1, 0x80, 0xcd, 0x0d, 0xd1, 0x18, 0x4c, 0x48, 0xa2, 0x28, 0xd2, 0xd9, - 0x68, 0xb2, 0x3e, 0xa1, 0xe1, 0xbe, 0x01, 0xad, 0x25, 0x9b, 0xc7, 0xaf, - 0x4b, 0xd7, 0x9a, 0xb2, 0xda, 0xea, 0x09, 0x09, 0x68, 0xfc, 0xb5, 0x36, - 0x88, 0x78, 0x60, 0x8f, 0xb3, 0x5e, 0x68, 0xd3, 0x14, 0x13, 0x06, 0xdb, - 0x6c, 0x78, 0xd8, 0xf4, 0x74, 0xf7, 0x5e, 0x78, 0xf9, 0x2c, 0xb5, 0xb0, - 0x9f, 0xb3, 0x1f, 0x65, 0xee, 0x07, 0x5e, 0xf3, 0x17, 0xbf, 0xcf, 0x36, - 0xe0, 0x80, 0xe9, 0x71, 0x1d, 0x09, 0x95, 0x1e, 0x16, 0x88, 0x4e, 0xeb, - 0x78, 0x34, 0xdd, 0xd3, 0x2f, 0x83, 0xb9, 0x05, 0xc4, 0x03, 0xd1, 0xed, - 0x5f, 0x7b, 0x56, 0x67, 0x76, 0xf9, 0xfc, 0xfe, 0x23, 0x0f, 0x31, 0x67, - 0x67, 0x09, 0xcc, 0xe4, 0xc2, 0x02, 0xcf, 0x24, 0xfc, 0xe8, 0x11, 0xa4, - 0x06, 0x2c, 0xba, 0xd2, 0x58, 0x03, 0x0d, 0xd8, 0x5d, 0x97, 0x3d, 0x5b, - 0xfd, 0x33, 0xf8, 0xa1, 0x35, 0x88, 0x32, 0xb6, 0x77, 0x92, 0x3e, 0x64, - 0x13, 0x41, 0xa7, 0x9b, 0x44, 0x61, 0xf7, 0xae, 0x16, 0x6a, 0x3f, 0x3f, - 0xe2, 0x01, 0x5b, 0x10, 0xd7, 0x8d, 0x19, 0xaa, 0xad, 0x4c, 0x97, 0x8b, - 0x7d, 0xac, 0x62, 0xfd, 0xf3, 0x60, 0x2a, 0x42, 0xdb, 0xca, 0x3c, 0x13, - 0xf3, 0x35, 0xc3, 0x3f, 0x78, 0x1a, 0x13, 0x96, 0xa4, 0xfc, 0x44, 0xfe, - 0x0b, 0x59, 0xde, 0xe1, 0x3f, 0xc4, 0xd6, 0xa7, 0x5f, 0x04, 0x7b, 0x67, - 0x71, 0x6f, 0x3a, 0x46, 0x86, 0x8e, 0x50, 0xd4, 0xb2, 0xdf, 0xcb, 0x86, - 0xf7, 0xef, 0x32, 0x0a, 0xfc, 0xb3, 0x99, 0x52, 0x2f, 0x9d, 0x7d, 0x3d, - 0xec, 0xc9, 0x3e, 0xb0, 0xed, 0xd7, 0xdc, 0x94, 0x3a, 0x0b, 0xf5, 0x29, - 0xb1, 0x3a, 0xf6, 0x11, 0x2c, 0x7b, 0xcf, 0xa8, 0xfa, 0x5e, 0xbb, 0xfc, - 0x09, 0x54, 0x5d, 0xf7, 0xa5, 0xde, 0x91, 0xa9, 0x7b, 0x7b, 0xde, 0x2f, - 0x0b, 0x0b, 0x0f, 0xfd, 0x11, 0x19, 0x2f, 0x51, 0x21, 0x93, 0xac, 0xed, - 0xbc, 0x18, 0x03, 0x2d, 0xcd, 0xa0, 0x88, 0xfd, 0x3d, 0x2f, 0xe2, 0xc9, - 0x47, 0x9b, 0x25, 0x9f, 0xe3, 0x58, 0xf5, 0xcf, 0x2a, 0x40, 0x02, 0x44, - 0x71, 0xbd, 0x7b, 0xdf, 0x73, 0xd2, 0xde, 0x46, 0x10, 0x05, 0xa1, 0xd2, - 0xac, 0x79, 0x80, 0xf7, 0xc9, 0x70, 0x81, 0xdc, 0x19, 0xcf, 0xbe, 0x10, - 0x1a, 0x3e, 0x14, 0xa7, 0x7a, 0x59, 0xef, 0xc9, 0x03, 0xd4, 0x21, 0x39, - 0xeb, 0x58, 0x7e, 0x96, 0x4e, 0x78, 0x48, 0x90, 0xf9, 0x54, 0x9c, 0x63, - 0xf7, 0xca, 0x4a, 0x64, 0x0c, 0xa8, 0xbd, 0xd3, 0xa5, 0x9b, 0xec, 0x72, - 0xc4, 0x54, 0x6f, 0x3d, 0x04, 0x49, 0x88, 0xb0, 0x3e, 0x64, 0x98, 0x3e, - 0xe3, 0x9f, 0x12, 0x6e, 0xa5, 0x58, 0x42, 0x88, 0xe8, 0x14, 0xa0, 0xa6, - 0xab, 0xfb, 0x31, 0x00, 0xdf, 0x2e, 0xe3, 0x16, 0x76, 0x79, 0xa3, 0x60, - 0x49, 0xa4, 0x60, 0x51, 0x47, 0xb8, 0xe2, 0x94, 0x56, 0x5e, 0x4b, 0x7b, - 0xe3, 0x41, 0x77, 0xee, 0x22, 0xcb, 0x42, 0x56, 0x04, 0xc7, 0xce, 0xab, - 0x94, 0xf5, 0x79, 0xf7, 0xdb, 0x4c, 0x24, 0xe5, 0x61, 0x12, 0x89, 0xad, - 0x32, 0x84, 0xa9, 0x14, 0x5b, 0x05, 0x10, 0x88, 0x94, 0x16, 0x65, 0x21, - 0xdd, 0x5b, 0x5e, 0x0c, 0x38, 0x84, 0x3d, 0xd8, 0xba, 0x33, 0x6a, 0x96, - 0x13, 0x02, 0x5f, 0x2c, 0xae, 0x66, 0x87, 0x05, 0xc2, 0xab, 0x2b, 0x20, - 0x0a, 0x94, 0xdc, 0x54, 0x5a, 0xc4, 0x83, 0x98, 0x64, 0xc6, 0x66, 0x59, - 0x27, 0xa8, 0x5b, 0x2a, 0x29, 0x91, 0xf1, 0xdf, 0xf9, 0xd0, 0x34, 0xf9, - 0x7f, 0x20, 0x96, 0x36, 0x1c, 0xc2, 0xbc, 0xcf, 0xc1, 0x6b, 0x73, 0x79, - 0xe6, 0x85, 0x7a, 0x0a, 0xc0, 0x70, 0x1d, 0x1a, 0x2d, 0xcc, 0x76, 0xbb, - 0xc4, 0x96, 0x3f, 0x85, 0x8e, 0xdb, 0x95, 0x91, 0x69, 0xbe, 0xdb, 0x86, - 0xfb, 0x79, 0x0b, 0xd9, 0xa4, 0x51, 0xb0, 0x22, 0x9b, 0xd6, 0x04, 0xef, - 0x55, 0x26, 0x11, 0x9f, 0x5e, 0x9d, 0x70, 0x75, 0x9f, 0xdd, 0xba, 0xb2, - 0xe0, 0x7c, 0x92, 0x55, 0xf1, 0x5c, 0x47, 0x23, 0xc2, 0xb0, 0x27, 0x58, - 0xde, 0x42, 0x2f, 0x01, 0x3a, 0x5f, 0x67, 0xa8, 0x48, 0xf5, 0x57, 0x10, - 0x18, 0xfc, 0x0c, 0xb7, 0xee, 0xa5, 0xc0, 0x5b, 0xf7, 0x98, 0x08, 0x4e, - 0xdf, 0x24, 0xa0, 0x33, 0x46, 0x89, 0x31, 0xfc, 0x1f, 0x53, 0xae, 0xcc, - 0xe3, 0xf0, 0xb1, 0x0b, 0xb4, 0x18, 0xb6, 0x6e, 0xaa, 0xbf, 0xf3, 0xc3, - 0xb0, 0x92, 0xc5, 0x38, 0x44, 0xe9, 0xa3, 0x1f, 0x66, 0xcb, 0x8b, 0xb6, - 0x2f, 0x4f, 0xe1, 0xa5, 0x69, 0x67, 0x74, 0x55, 0x1b, 0xc3, 0x02, 0xc9, - 0xdd, 0xee, 0x4b, 0x22, 0xc3, 0x69, 0xee, 0xd3, 0x89, 0xe2, 0x69, 0xfe, - 0x8d, 0x19, 0x04, 0xab, 0x4e, 0xb1, 0x96, 0x54, 0x8e, 0x78, 0xb0, 0x29, - 0x3f, 0x35, 0x53, 0xf4, 0x4a, 0x5b, 0x31, 0x6b, 0xaf, 0x66, 0xa1, 0x65, - 0xcd, 0x1a, 0xc9, 0xd0, 0xce, 0x0e, 0x97, 0x9d, 0x52, 0xe2, 0x1d, 0x39, - 0x55, 0x9a, 0xa6, 0xfc, 0x64, 0x68, 0x56, 0x49, 0xac, 0xce, 0x9b, 0x4c, - 0x1c, 0xb3, 0x87, 0x6b, 0x16, 0x7b, 0xb3, 0xd0, 0xae, 0x89, 0x1a, 0x40, - 0x80, 0x78, 0x48, 0xdc, 0xeb, 0xf7, 0xb9, 0xe5, 0x7f, 0x33, 0xc9, 0xea, - 0xf0, 0x65, 0xe6, 0x18, 0xbe, 0x55, 0xb5, 0x05, 0x50, 0x5b, 0xb9, 0x36, - 0x26, 0xdd, 0xb2, 0xc4, 0x1d, 0x86, 0x1d, 0xbf, 0x3c, 0x5f, 0x08, 0xee, - 0x15, 0x5b, 0x61, 0xe3, 0x18, 0xaf, 0x1d, 0x38, 0xe7, 0x5e, 0xeb, 0x2f, - 0x50, 0x2f, 0x35, 0xa9, 0xb9, 0x45, 0x35, 0x63, 0x15, 0xfb, 0x2e, 0xc8, - 0xdb, 0xd8, 0x3d, 0x32, 0xcb, 0xf1, 0x1e, 0x93, 0xce, 0x42, 0xad, 0xef, - 0xb2, 0x6c, 0x7f, 0x58, 0xc9, 0xda, 0x97, 0x75, 0x33, 0xc0, 0xc7, 0x84, - 0xdc, 0x5b, 0xb4, 0x1e, 0xa7, 0x7d, 0x81, 0x1d, 0x1a, 0x7a, 0xbc, 0x19, - 0xd8, 0x0a, 0xee, 0xa7, 0x55, 0x73, 0x61, 0x2b, 0x01, 0xe2, 0xa2, 0x25, - 0xfe, 0x28, 0xef, 0x2b, 0x07, 0xc6, 0x18, 0x00, 0xc5, 0xc1, 0x3d, 0xf0, - 0xe2, 0x60, 0xbd, 0x0d, 0x4e, 0xe4, 0x1c, 0xf4, 0x87, 0xce, 0x6f, 0xe1, - 0x4f, 0xc8, 0x2d, 0xa9, 0xbd, 0x6f, 0xb4, 0x30, 0x12, 0x16, 0xd6, 0x11, - 0x16, 0x6c, 0xb7, 0x21, 0x15, 0x9f, 0x2c, 0xe6, 0x1b, 0x53, 0xa5, 0x7f, - 0x40, 0xb6, 0x7e, 0x9b, 0x9f, 0x55, 0x44, 0x3f, 0xfa, 0x23, 0xe4, 0xaa, - 0xb4, 0x41, 0x33, 0x9e, 0x3e, 0xa0, 0x6e, 0x7d, 0x90, 0x81, 0xd1, 0xaa, - 0x3b, 0x74, 0xd9, 0xe8, 0x0c, 0xf0, 0x4e, 0xe6, 0x10, 0x73, 0x7b, 0x36, - 0x9b, 0x40, 0x2e, 0xfa, 0xf6, 0x58, 0x6a, 0xd4, 0x1e, 0xc3, 0xe9, 0x75, - 0x90, 0xf0, 0x21, 0x8a, 0x0a, 0x40, 0x71, 0x31, 0x9c, 0xaf, 0x94, 0x8f, - 0x08, 0x03, 0xc4, 0x2a, 0xdd, 0xf5, 0x7b, 0x70, 0x78, 0x4a, 0x49, 0x80, - 0x7d, 0xdd, 0x42, 0x31, 0xed, 0x39, 0xe8, 0xf4, 0x27, 0xbb, 0x0a, 0x34, - 0xf5, 0x97, 0x86, 0xa7, 0xed, 0xc3, 0xeb, 0x6d, 0x90, 0x8d, 0x9c, 0x8e, - 0x8a, 0x81, 0x57, 0x9d, 0x9e, 0x75, 0x54, 0x91, 0x6e, 0x42, 0x5b, 0x52, - 0xb9, 0x7f, 0x85, 0xbc, 0x98, 0x9d, 0x35, 0xdf, 0x7d, 0x81, 0xc0, 0x18, - 0xf0, 0x8a, 0x36, 0xc8, 0xe9, 0x97, 0x82, 0x0f, 0xbf, 0x2d, 0x3f, 0xca, - 0x83, 0xe1, 0x2d, 0x24, 0x17, 0x8e, 0xe3, 0xb3, 0x3a, 0x6e, 0xc0, 0xab, - 0x6e, 0x0c, 0x78, 0xe5, 0xa8, 0x44, 0x2b, 0x58, 0x63, 0xfe, 0x57, 0x6c, - 0xb1, 0x3b, 0x81, 0x5a, 0x75, 0xc8, 0x60, 0x40, 0x04, 0x44, 0xad, 0x76, - 0x45, 0xf2, 0xa1, 0x1e, 0x17, 0xc0, 0x67, 0x2b, 0x01, 0x43, 0x75, 0xd1, - 0x9d, 0xfe, 0x90, 0x8a, 0x67, 0x84, 0x12, 0x6b, 0x95, 0x9f, 0xc0, 0xf9, - 0x54, 0x20, 0x05, 0xb5, 0x86, 0x4d, 0x0c, 0x12, 0x7b, 0x12, 0x6f, 0x15, - 0x62, 0xc0, 0xf3, 0x09, 0xdd, 0xdd, 0xd2, 0xb3, 0x37, 0x4e, 0x33, 0x3d, - 0x7e, 0xe4, 0x1f, 0x74, 0x00, 0x53, 0x91, 0x17, 0x26, 0xf1, 0xdc, 0x95, - 0x0a, 0x49, 0xae, 0x68, 0x93, 0x65, 0x12, 0x6d, 0xc5, 0xc3, 0x63, 0xa3, - 0x53, 0x32, 0x97, 0xbf, 0x4d, 0x72, 0x6f, 0xea, 0x55, 0xd6, 0xd5, 0x7d, - 0xe8, 0x00, 0x57, 0xa0, 0x76, 0x9e, 0xb0, 0x9f, 0x17, 0xd9, 0xd1, 0x33, - 0xf1, 0x79, 0x9b, 0xbf, 0x80, 0x54, 0xfc, 0x38, 0xb8, 0x08, 0x3e, 0x60, - 0x87, 0x51, 0xfc, 0x0f, 0xe7, 0xb8, 0xc3, 0xe0, 0x9a, 0x74, 0xb9, 0xc0, - 0xb6, 0x2c, 0x61, 0x8c, 0x0d, 0xa0, 0xe1, 0x0a, 0xda, 0x30, 0x80, 0xde, - 0xd3, 0x5b, 0xb7, 0xd5, 0x43, 0x37, 0x2d, 0x22, 0xbd, 0x8f, 0xfd, 0x2e, - 0x46, 0x6d, 0xd5, 0xb5, 0x19, 0x55, 0x79, 0xbd, 0x37, 0x9a, 0x8a, 0xc5, - 0x74, 0xba, 0x8f, 0xc1, 0xdb, 0x21, 0xba, 0xbc, 0x4d, 0x2e, 0x27, 0x2c, - 0x65, 0x17, 0x68, 0xb1, 0x40, 0x06, 0xd4, 0x93, 0x4c, 0xa0, 0x77, 0xc5, - 0x59, 0x74, 0x30, 0x39, 0x19, 0x2d, 0x3f, 0x8d, 0x69, 0x79, 0x08, 0x1a, - 0x0a, 0x63, 0xc5, 0xc1, 0x40, 0x54, 0x87, 0x2a, 0xc0, 0xfd, 0xf8, 0xa8, - 0xca, 0x5d, 0x27, 0x0c, 0x57, 0x58, 0x76, 0x4c, 0x92, 0x9c, 0x20, 0xb4, - 0x2b, 0xc3, 0x55, 0x89, 0x17, 0x73, 0xcb, 0x65, 0x5b, 0x65, 0x59, 0x64, - 0xc1, 0x1f, 0x7b, 0x57, 0x32, 0x88, 0x82, 0xfd, 0x73, 0xf8, 0x96, 0xed, - 0x4b, 0x9e, 0xf6, 0x58, 0x0f, 0x95, 0x7f, 0x8f, 0x19, 0x52, 0xd9, 0x0d, - 0x73, 0x40, 0x8d, 0x84, 0xd5, 0x17, 0xb7, 0x48, 0x1e, 0x42, 0xfe, 0xa2, - 0x91, 0x43, 0xb8, 0x9f, 0x60, 0x08, 0x03, 0xe4, 0xa0, 0xe0, 0x9c, 0xaa, - 0xa6, 0xb9, 0xc3, 0x4c, 0x7d, 0x31, 0xd3, 0x1e, 0x1d, 0xa1, 0x97, 0xe7, - 0x94, 0x77, 0x0e, 0xca, 0x7b, 0xc9, 0xfb, 0x37, 0xb4, 0xbd, 0xf2, 0xe2, - 0xc6, 0xe7, 0x01, 0x2b, 0x7e, 0x69, 0x31, 0xdd, 0x2c, 0xd7, 0xf5, 0x3e, - 0x6e, 0x36, 0x01, 0x8a, 0x35, 0x6c, 0xa0, 0x1a, 0x07, 0x62, 0x50, 0x46, - 0xf5, 0x91, 0x8c, 0x19, 0xcc, 0x40, 0x18, 0xf9, 0xd7, 0xbb, 0xcd, 0x9e, - 0x6e, 0xc8, 0xfb, 0x6d, 0x10, 0x30, 0xaa, 0xa9, 0x1d, 0x0f, 0x93, 0xcf, - 0x00, 0xf7, 0x84, 0x88, 0x2a, 0xd8, 0xe4, 0x45, 0x80, 0x7d, 0xdd, 0xb8, - 0x80, 0xf0, 0x9f, 0xa4, 0xd9, 0xd7, 0x8a, 0x98, 0x8c, 0xe6, 0xf9, 0x30, - 0xb3, 0xa1, 0x58, 0x43, 0xef, 0xf0, 0x3d, 0x84, 0xcf, 0xbc, 0x53, 0x7e, - 0x0b, 0xd0, 0x30, 0x12, 0x7d, 0xdf, 0xe6, 0xa1, 0x98, 0xa7, 0x6d, 0x5d, - 0x7a, 0xd4, 0x84, 0x57, 0x73, 0x61, 0x5b, 0x57, 0x86, 0xc8, 0x78, 0x3d, - 0xdc, 0x9f, 0x43, 0xd4, 0xca, 0xf2, 0xa1, 0xcd, 0xc9, 0x83, 0x7a, 0x89, - 0x77, 0x4b, 0x1d, 0xbd, 0x9c, 0x67, 0xf2, 0x19, 0x77, 0xff, 0x77, 0xa2, - 0xc5, 0x45, 0x05, 0x3b, 0x22, 0xd4, 0xcf, 0xf8, 0x5d, 0x72, 0x84, 0x1e, - 0x3b, 0x5d, 0xfc, 0x85, 0x16, 0xf7, 0x98, 0xb7, 0x46, 0x5b, 0xb8, 0x7c, - 0x1e, 0xc4, 0x3b, 0x85, 0xee, 0x99, 0x6f, 0x98, 0x3f, 0x71, 0x4e, 0x23, - 0x75, 0x57, 0xfb, 0x63, 0xd9, 0xf6, 0xc9, 0x1b, 0x39, 0xc8, 0x15, 0xbe, - 0xd6, 0xc0, 0x18, 0xf6, 0x59, 0x7c, 0x42, 0x44, 0xe3, 0x46, 0x0a, 0x5d, - 0xf3, 0xd8, 0x1c, 0x0d, 0x79, 0x5b, 0xb6, 0x02, 0x20, 0x31, 0x1a, 0xeb, - 0xdd, 0x59, 0xea, 0xb0, 0x29, 0x23, 0x21, 0xd8, 0xf0, 0xf1, 0xc1, 0xda, - 0xe6, 0xd4, 0x32, 0x38, 0x90, 0x1a, 0x58, 0x0e, 0x8e, 0x9d, 0x31, 0x34, - 0x18, 0xf0, 0x53, 0x72, 0x5a, 0xe0, 0xe0, 0xa1, 0x5a, 0xb9, 0x32, 0x3c, - 0x36, 0x78, 0x1c, 0x97, 0xfd, 0x9c, 0xd1, 0xfa, 0x63, 0xdd, 0x58, 0xb9, - 0x23, 0x07, 0x21, 0xd3, 0x52, 0xb2, 0x70, 0x25, 0x29, 0xa7, 0x70, 0xfa, - 0x28, 0x14, 0xe1, 0x70, 0x55, 0x08, 0xaa, 0xd8, 0x0c, 0x7c, 0xa9, 0x10, - 0xba, 0x66, 0x68, 0x90, 0xe0, 0x7d, 0x68, 0x61, 0x1c, 0x1e, 0x87, 0xca, - 0xfd, 0xb0, 0xbd, 0x40, 0xdb, 0xe8, 0xd0, 0x3b, 0x46, 0x22, 0xbf, 0xd6, - 0x85, 0xb2, 0x70, 0x76, 0x67, 0xab, 0x20, 0xdd, 0x2b, 0xc0, 0x0f, 0x6c, - 0x71, 0x23, 0xbc, 0xa6, 0x74, 0xde, 0x2d, 0x41, 0x51, 0xba, 0x9e, 0x29, - 0x84, 0xe5, 0xfb, 0x89, 0xfd, 0x12, 0x5e, 0x6f, 0x79, 0xaf, 0x50, 0xbd, - 0x7a, 0x57, 0xf8, 0x65, 0x12, 0x9f, 0x37, 0x92, 0x8e, 0x1b, 0x5d, 0x6c, - 0xa3, 0x52, 0x88, 0xb4, 0x49, 0x67, 0xfb, 0x13, 0xd7, 0x33, 0x20, 0x8a, - 0x5b, 0x66, 0xeb, 0x6b, 0x67, 0xa6, 0x99, 0x9e, 0xa7, 0xa3, 0xfb, 0x7d, - 0x4b, 0x23, 0xe3, 0x41, 0x4f, 0x82, 0x2e, 0x9a, 0x09, 0x74, 0x4c, 0xa4, - 0xf5, 0xb6, 0x3d, 0xaf, 0x5d, 0x76, 0xfe, 0x39, 0x10, 0x3d, 0x8a, 0xb1, - 0x19, 0x05, 0x63, 0xd7, 0x1f, 0x28, 0x53, 0x1a, 0x16, 0x4c, 0x61, 0xa5, - 0x55, 0x67, 0x08, 0xe5, 0xdc, 0xe9, 0x63, 0x89, 0x98, 0xa5, 0xc1, 0xff, - 0x50, 0x2d, 0x7b, 0xf2, 0x12, 0x3a, 0xae, 0x8b, 0x73, 0xa6, 0xeb, 0x46, - 0x09, 0x52, 0x9c, 0xfa, 0x9e, 0x93, 0x51, 0x98, 0x5e, 0xce, 0x5d, 0xe8, - 0xdb, 0x63, 0xde, 0xe6, 0x9f, 0xbf, 0x7e, 0xfd, 0xcd, 0x7d, 0x85, 0xe7, - 0xc2, 0xf7, 0x30, 0xdc, 0x81, 0xe5, 0x92, 0x76, 0xf0, 0x93, 0x12, 0xe6, - 0x6d, 0x70, 0xb5, 0x5b, 0x5e, 0xcf, 0xaf, 0x81, 0xd8, 0x1b, 0x18, 0xed, - 0x0a, 0xf5, 0xf5, 0xcb, 0x66, 0x66, 0x92, 0xe1, 0x2e, 0xe8, 0x6e, 0x4b, - 0x4a, 0x83, 0x9d, 0xcb, 0x63, 0xbc, 0xe1, 0x02, 0xcd, 0x7d, 0xc5, 0xe7, - 0xd6, 0xf7, 0x30, 0xdc, 0x81, 0xe5, 0x92, 0x76, 0xf0, 0x93, 0x12, 0xe6, - 0x6d, 0x70, 0xb5, 0x5b, 0x5e, 0xcf, 0xaf, 0x81, 0xd8, 0x1b, 0x18, 0xed, - 0xdc, 0x31, 0xbf, 0x45, 0x25, 0x5c, 0x0b, 0x9e, 0x29, 0x10, 0xe4, 0x1f, - 0x4d, 0x7c, 0x0c, 0xd6, 0x1b, 0x3c, 0xcc, 0x8b, 0x05, 0x94, 0x90, 0xb9, - 0xe2, 0xa7, 0xd2, 0x0c, 0x4a, 0x52, 0x45, 0xdb, 0xab, 0xf0, 0xd6, 0xae, - 0xe6, 0xe9, 0xc1, 0xb8, 0x17, 0x43, 0x2d, 0xd7, 0x8c, 0x9d, 0xc3, 0x75, - 0xd3, 0x6d, 0x3b, 0xcf, 0x5c, 0x6a, 0x42, 0x5a, 0x27, 0xc6, 0x9a, 0x8b, - 0x71, 0x17, 0x88, 0x3e, 0x32, 0x48, 0x66, 0x72, 0xc7, 0x55, 0xea, 0x50, - 0x44, 0xd1, 0xdd, 0x5d, 0x70, 0x93, 0x4f, 0x89, 0x9c, 0x57, 0x59, 0xc6, - 0xc9, 0x5e, 0xd2, 0xf0, 0x14, 0x80, 0xa8, 0x3a, 0xcc, 0x8b, 0xb3, 0x90, - 0xc9, 0xb3, 0x15, 0xac, 0xc1, 0x32, 0x55, 0x6f, 0xc8, 0x35, 0x3a, 0x5a, - 0xf2, 0xf7, 0xb3, 0x67, 0xce, 0xa9, 0x94, 0xa1, 0x6e, 0x34, 0xe3, 0xc1, - 0xc8, 0x61, 0x6b, 0xba, 0x88, 0x10, 0x49, 0x73, 0xd0, 0x1c, 0xd2, 0x3a, - 0x2f, 0x45, 0x1f, 0x70, 0x82, 0x3a, 0xf5, 0xd5, 0x59, 0x75, 0x22, 0x62, - 0x52, 0x3b, 0x36, 0x7c, 0x84, 0xc0, 0xa5, 0x4c, 0x2f, 0x47, 0xec, 0x24, - 0x90, 0x0e, 0x06, 0x1f, 0xaa, 0xf9, 0xe5, 0x06, 0x68, 0x0d, 0xaa, 0xed, - 0x44, 0x2e, 0x65, 0xa1, 0xfd, 0xe9, 0x59, 0x2e, 0xf1, 0x4a, 0xd3, 0xf5, - 0xed, 0x4d, 0x81, 0xc9, 0xdf, 0x0a, 0xd2, 0x5b, 0xad, 0x64, 0x09, 0xe6, - 0x31, 0xc1, 0xc9, 0xdd, 0x6d, 0x0a, 0x31, 0x42, 0x3d, 0x11, 0x9a, 0x7f, - 0x78, 0x03, 0x15, 0xe4, 0xdc, 0x7d, 0xd5, 0x42, 0xb6, 0x6e, 0xfe, 0xf3, - 0xf7, 0xf5, 0x65, 0x65, 0x0f, 0xc6, 0x86, 0x4d, 0xd8, 0xd4, 0x60, 0x67, - 0x62, 0x86, 0xa2, 0x2b, 0xa2, 0x24, 0xd8, 0xe4, 0x51, 0xdb, 0x6d, 0x78, - 0x4f, 0x59, 0xf5, 0x8d, 0x04, 0x4a, 0x5a, 0xd9, 0xa8, 0xf7, 0xb4, 0x41, - 0x65, 0x25, 0xd6, 0x7c, 0xd4, 0x8a, 0xbd, 0x29, 0xda, 0x82, 0x4c, 0x31, - 0xd9, 0xc6, 0xc6, 0xd8, 0xda, 0xa8, 0x6b, 0x04, 0x22, 0x81, 0xe5, 0xc6, - 0xcf, 0x6c, 0x25, 0x82, 0x01, 0xfc, 0xab, 0x93, 0x2e, 0xe2, 0xc8, 0x4a, - 0xa5, 0x5e, 0xca, 0x3d, 0x28, 0x34, 0xdc, 0x64, 0xf4, 0x54, 0xb3, 0x08, - 0x1f, 0x88, 0x06, 0x5b, 0x76, 0x70, 0x4d, 0x94, 0xe6, 0x0d, 0x52, 0x90, - 0x8d, 0x0f, 0x44, 0x9f, 0x2d, 0x88, 0x46, 0x14, 0x1a, 0x4c, 0xeb, 0x65, - 0x54, 0x61, 0x28, 0xf7, 0xfe, 0x67, 0xa2, 0x39, 0xac, 0x42, 0x9b, 0xfe, - 0xc4, 0x39, 0xd9, 0x57, 0x2c, 0x43, 0xaa, 0xb1, 0x78, 0x2c, 0x20, 0x69, - 0x61, 0x86, 0x60, 0x6e, 0xe2, 0xb4, 0x96, 0xc6, 0x2e, 0xce, 0xf5, 0x13, - 0x7d, 0x3b, 0x35, 0x94, 0x53, 0xb9, 0x82, 0x75, 0xce, 0xe0, 0xa2, 0xd7, - 0x0a, 0x52, 0xc8, 0xf7, 0x80, 0x05, 0xc2, 0xa2, 0xda, 0x10, 0x1a, 0xf2, - 0xab, 0x1d, 0xd1, 0xd2, 0x00, 0xf3, 0x00, 0x62, 0xfc, 0xc5, 0x15, 0x49, - 0x72, 0xa2, 0x8a, 0xf9, 0x68, 0x32, 0x40, 0x30, 0xb1, 0xf0, 0x0a, 0x6b, - 0x17, 0x09, 0x15, 0x7f, 0x93, 0x79, 0x31, 0xb2, 0x8d, 0xda, 0x60, 0xc2, - 0xf1, 0xca, 0xbb, 0x11, 0x98, 0x72, 0x4d, 0x2d, 0xca, 0x32, 0xdd, 0x32, - 0xc5, 0x20, 0x39, 0x00, 0xb6, 0x0a, 0xd6, 0x32, 0x9f, 0xfa, 0x85, 0x75, - 0xf4, 0xcb, 0x44, 0x53, 0x30, 0xbe, 0x92, 0x1f, 0x70, 0x7a, 0xbe, 0xcb, - 0xe7, 0x68, 0x07, 0x1d, 0x8e, 0xa9, 0x62, 0x0d, 0x44, 0xf3, 0x05, 0x52, - 0x84, 0x03, 0xcd, 0xbf, 0x40, 0x3e, 0xa5, 0x46, 0x9b, 0x85, 0x25, 0x0a, - 0x84, 0x47, 0x2b, 0x6c, 0xcc, 0x41, 0x59, 0x2f, 0xb2, 0x1b, 0xf6, 0xec, - 0x29, 0xee, 0xb0, 0x9e, 0xe1, 0x89, 0x89, 0x64, 0x5a, 0x1e, 0x63, 0x75, - 0x7e, 0x90, 0x80, 0xff, 0x98, 0x6e, 0x66, 0x3c, 0x80, 0x0f, 0x35, 0xc0, - 0x83, 0x31, 0x82, 0x03, 0x1f, 0xd0, 0xf0, 0xd0, 0x86, 0x29, 0x77, 0xc9, - 0x09, 0x94, 0x17, 0x9f, 0xa3, 0x87, 0x0c, 0xe9, 0x89, 0x94, 0x75, 0x7a, - 0xb2, 0x8f, 0x5e, 0x90, 0x78, 0xc8, 0xd1, 0x2c, 0x5f, 0xbd, 0xc5, 0xf9, - 0x83, 0x78, 0xd1, 0x00, 0x75, 0x22, 0xe3, 0xb1, 0x54, 0x5e, 0x88, 0x55, - 0x9b, 0x60, 0x92, 0xe3, 0xe9, 0x37, 0x17, 0x00, 0x0d, 0xc1, 0x7e, 0x1f, - 0x8d, 0xa4, 0x37, 0xc8, 0xde, 0x25, 0x36, 0x8a, 0x4c, 0xff, 0x03, 0x74, - 0xf6, 0x5f, 0x5e, 0xe0, 0x0e, 0x26, 0x85, 0x3e, 0x4f, 0xb8, 0xf5, 0xb8, - 0xa6, 0x3f, 0x7f, 0xd7, 0xbd, 0xe5, 0xfa, 0xc6, 0x79, 0x6d, 0x56, 0x56, - 0x3a, 0x8f, 0x25, 0x41, 0x60, 0x33, 0x07, 0xa2, 0x8b, 0x2b, 0x1d, 0x09, - 0xd0, 0xb4, 0x52, 0x1c, 0x64, 0x31, 0x97, 0xa0, 0x40, 0x68, 0xdc, 0xce, - 0xc4, 0x6d, 0x6c, 0x8d, 0xb8, 0x4c, 0x0c, 0x9e, 0xc3, 0x87, 0xc6, 0xac, - 0x78, 0x73, 0x82, 0xab, 0x9e, 0xc4, 0xb7, 0xa1, 0x50, 0xbd, 0x66, 0x5c, - 0x2f, 0xf6, 0xc3, 0x98, 0xed, 0x81, 0x07, 0x99, 0x24, 0x2a, 0x2d, 0x7b, - 0xa7, 0x63, 0x1e, 0x85, 0x8a, 0x08, 0x21, 0x5d, 0x77, 0x68, 0x54, 0x38, - 0xad, 0x06, 0x2c, 0x88, 0xb2, 0xf0, 0xd2, 0x96, 0xb9, 0x91, 0x70, 0x34, - 0x1c, 0x7f, 0x36, 0x28, 0x52, 0x64, 0xf4, 0xad, 0x84, 0x89, 0x0c, 0x67, - 0x3e, 0x40, 0x6b, 0xbe, 0xa2, 0x5b, 0x0a, 0x46, 0x43, 0xc9, 0x00, 0xa9, - 0x4d, 0xdd, 0x04, 0xb3, 0x49, 0x92, 0x73, 0x76, 0x2c, 0x25, 0x2b, 0x16, - 0x5d, 0x18, 0x89, 0x76, 0xc9, 0x43, 0xb0, 0x71, 0x2b, 0x0a, 0x06, 0xe6, - 0x62, 0xa4, 0x01, 0x06, 0xbd, 0x69, 0x3a, 0x4a, 0xb1, 0xd1, 0x0d, 0x37, - 0xd1, 0xf5, 0xa2, 0x8a, 0x4c, 0x4b, 0x7f, 0x5b, 0x96, 0x64, 0x69, 0x5b, - 0x3b, 0x9a, 0x35, 0x3d, 0xa3, 0xa1, 0xa3, 0x63, 0x5f, 0x78, 0x14, 0x4e, - 0x2d, 0x23, 0x8c, 0xd3, 0x55, 0xc4, 0xee, 0x3d, 0x79, 0x0e, 0xdc, 0x1d, - 0x43, 0xd4, 0xbf, 0xc8, 0x25, 0xe3, 0xb7, 0x2d, 0x68, 0xf3, 0x48, 0x90, - 0xd9, 0x5a, 0x98, 0x55, 0xea, 0xc9, 0xce, 0xc5, 0xf0, 0x63, 0xc0, 0x87, - 0xf6, 0x4f, 0x05, 0xb4, 0xbb, 0x50, 0x62, 0x09, 0x5f, 0x32, 0x85, 0xee, - 0x98, 0x90, 0xea, 0x3e, 0x02, 0x71, 0x98, 0x39, 0x05, 0x11, 0xee, 0x57, - 0x81, 0xf9, 0x3a, 0xe5, 0xfa, 0xde, 0x19, 0x84, 0x20, 0xe4, 0x9f, 0xef, - 0x4d, 0xf8, 0x28, 0x64, 0xaf, 0xcf, 0x49, 0x2d, 0xff, 0x9f, 0xb6, 0x61, - 0x6c, 0x02, 0x18, 0xae, 0xe5, 0x07, 0x6a, 0xe9, 0xcc, 0x28, 0xad, 0x6c, - 0x66, 0xf5, 0x3b, 0x31, 0xc2, 0x4a, 0xcc, 0xaf, 0x12, 0xd7, 0xaa, 0xba, - 0x19, 0xc2, 0xc8, 0x26, 0xb0, 0x78, 0x49, 0xf3, 0xd4, 0xb8, 0x47, 0xf0, - 0x73, 0x5a, 0x3b, 0xf8, 0x21, 0xfd, 0x00, 0x6a, 0x82, 0x3e, 0x99, 0x8c, - 0xca, 0xb3, 0x51, 0xe2, 0xf5, 0x4d, 0xd3, 0x25, 0x71, 0x73, 0x73, 0xf5, - 0x48, 0xf0, 0x94, 0xe5, 0xb0, 0x06, 0xa5, 0xf1, 0x8d, 0x51, 0xc3, 0x49, - 0x75, 0xe3, 0xb9, 0xf1, 0x0f, 0x0d, 0xf0, 0xd4, 0x19, 0x3a, 0x70, 0x9a, - 0x73, 0xbe, 0x3c, 0xec, 0x8d, 0x99, 0xe9, 0x81, 0x51, 0xac, 0x0d, 0x19, - 0xbb, 0x48, 0xc3, 0x59, 0x86, 0xd6, 0xa9, 0x86, 0x8f, 0x4a, 0xdd, 0x05, - 0x85, 0xb8, 0x35, 0x6f, 0x90, 0x21, 0x29, 0x3c, 0xbd, 0xd9, 0x2a, 0x1f, - 0xc4, 0xa1, 0xf3, 0xae, 0xf0, 0x5d, 0x26, 0x95, 0xee, 0x79, 0xe9, 0xab, - 0x03, 0x91, 0x0a, 0x72, 0xfa, 0x0f, 0xc9, 0xa3, 0xed, 0x95, 0x54, 0x5b, - 0xc2, 0x86, 0xb9, 0x36, 0x6d, 0x30, 0x38, 0x0d, 0x23, 0x2e, 0xb6, 0xe4, - 0x86, 0xca, 0xa4, 0xd5, 0xc5, 0x79, 0x10, 0xdb, 0x6a, 0xa1, 0xd4, 0x83, - 0x84, 0x87, 0xf2, 0xa1, 0xec, 0x8f, 0xb7, 0x00, 0xa0, 0x23, 0x29, 0x57, - 0x38, 0x78, 0x75, 0xf8, 0x9d, 0xee, 0x92, 0xf2, 0x09, 0x29, 0x71, 0xb9, - 0x41, 0xbe, 0x3c, 0x9a, 0x73, 0x4c, 0xf5, 0x32, 0x54, 0x6a, 0x54, 0x62, - 0x8a, 0x74, 0xff, 0x8a, 0xc6, 0x6d, 0x52, 0x6b, 0xa6, 0x56, 0x31, 0xee, - 0xa7, 0xd4, 0xe1, 0x60, 0xc6, 0x4b, 0xf8, 0xb6, 0xce, 0xec, 0xb0, 0xf1, - 0x30, 0x45, 0x74, 0xd1, 0xd3, 0x79, 0x9a, 0x92, 0x31, 0x45, 0x0a, 0x00, - 0xca, 0xde, 0xd2, 0x4a, 0xec, 0x8b, 0x96, 0xe0, 0x32, 0x83, 0x9d, 0x14, - 0x68, 0x12, 0x4e, 0x34, 0x17, 0x4a, 0x55, 0x85, 0x8b, 0xb5, 0x96, 0xa0, - 0xb7, 0xd8, 0xe1, 0x20, 0x7c, 0x81, 0x53, 0xfe, 0xba, 0x58, 0x31, 0xfe, - 0x3e, 0x4a, 0x39, 0x33, 0x37, 0x7c, 0x1b, 0x30, 0xd5, 0xbb, 0xe1, 0x24, - 0x4e, 0x0a, 0xda, 0x8c, 0xd2, 0x9c, 0xad, 0x54, 0x41, 0xe4, 0xa1, 0x76, - 0x02, 0x50, 0x2b, 0x9a, 0x34, 0x3c, 0x7e, 0x7a, 0x27, 0xbe, 0xdb, 0x2b, - 0x4a, 0xc5, 0x5b, 0x8b, 0x8a, 0x3f, 0x5c, 0x73, 0x85, 0x4e, 0xd5, 0x2d, - 0xec, 0x6c, 0x7e, 0x75, 0x49, 0x5e, 0xb2, 0xa6, 0x35, 0x0b, 0x05, 0xeb, - 0x20, 0x14, 0x8a, 0xe1, 0x60, 0x43, 0x6a, 0xe8, 0x0c, 0x37, 0x6e, 0xa5, - 0xca, 0xa7, 0x29, 0xbd, 0x1d, 0xd4, 0x75, 0x6b, 0x6e, 0xd9, 0x62, 0x53, - 0x78, 0x03, 0x76, 0x12, 0x03, 0x31, 0xd1, 0x8a, 0x79, 0x28, 0xf9, 0x0b, - 0xb2, 0x87, 0xb5, 0x8b, 0xe3, 0xf1, 0x61, 0x56, 0xa2, 0x75, 0xe4, 0xf0, - 0x37, 0x8c, 0x52, 0xf8, 0xac, 0xa3, 0xa0, 0x39, 0xd3, 0xee, 0x38, 0xe9, - 0x3a, 0xfa, 0xec, 0xb5, 0xdb, 0x4b, 0xca, 0xaf, 0xef, 0x7f, 0x12, 0xbb, - 0x88, 0xe4, 0xcd, 0x62, 0x69, 0x47, 0x06, 0x6e, 0x13, 0x86, 0xa8, 0x19, - 0x74, 0x20, 0x6b, 0x75, 0x2c, 0x51, 0x5b, 0x79, 0xfc, 0x37, 0x73, 0xe0, - 0xce, 0xdd, 0x86, 0x9a, 0xac, 0xc8, 0x5d, 0xfd, 0xd8, 0xb8, 0xe6, 0x73, - 0x86, 0x20, 0xe0, 0xae, 0xe4, 0x03, 0x79, 0x2f, 0x44, 0xd3, 0xaf, 0x78, - 0x7a, 0x59, 0x35, 0xac, 0x2d, 0xc7, 0x35, 0x5d, 0x6e, 0xd7, 0x8a, 0x21, - 0x4a, 0xb2, 0x91, 0x5d, 0xa7, 0x02, 0x39, 0x5e, 0x28, 0x10, 0xc8, 0x6a, - 0xcd, 0xcb, 0x66, 0x4e, 0xbd, 0x2e, 0xdc, 0x17, 0xb8, 0x79, 0x07, 0x81, - 0xdd, 0x04, 0xba, 0x62, 0x29, 0x87, 0xe3, 0xde, 0x78, 0xde, 0x80, 0x67, - 0x2f, 0x7d, 0x14, 0xfb, 0xcd, 0x78, 0x23, 0x1f, 0x8e, 0x04, 0x73, 0xa9, - 0x38, 0xf0, 0xed, 0x91, 0xaa, 0x58, 0x50, 0x7e, 0x74, 0x0a, 0xb0, 0x91, - 0xe9, 0x0a, 0x0d, 0xb5, 0x47, 0x71, 0xa4, 0xd8, 0x45, 0x22, 0xfb, 0x96, - 0x7c, 0xf9, 0xef, 0xd7, 0xf8, 0xd9, 0xa2, 0x15, 0x10, 0x86, 0xac, 0xce, - 0x18, 0x91, 0xd8, 0x45, 0x15, 0x43, 0x6f, 0x44, 0x61, 0x70, 0x60, 0x90, - 0xe8, 0x06, 0xbc, 0x20, 0x97, 0xef, 0xfd, 0xe6, 0xb7, 0xca, 0x26, 0xe5, - 0x6e, 0xd7, 0x91, 0xf7, 0x04, 0x16, 0x65, 0x02, 0x98, 0x0d, 0x0f, 0xde, - 0xb1, 0x63, 0xad, 0x94, 0x33, 0xd9, 0xf0, 0xe8, 0xee, 0xfd, 0xb1, 0x55, - 0x84, 0xbb, 0xce, 0xb1, 0x54, 0x3f, 0x97, 0x6d, 0x24, 0x2c, 0xa3, 0xd2, - 0x61, 0x12, 0xc1, 0xd6, 0xb9, 0x54, 0xa0, 0x4c, 0x0b, 0x0f, 0x6b, 0x18, - 0xfc, 0x72, 0xfb, 0x45, 0x94, 0xa4, 0x98, 0xe7, 0xee, 0x90, 0x5f, 0x1e, - 0xd3, 0x4e, 0x93, 0xc5, 0xea, 0x8f, 0xf8, 0xa2, 0xa2, 0xfe, 0xde, 0x60, - 0x6a, 0x1e, 0xf7, 0xc3, 0x2d, 0x84, 0xb7, 0x18, 0x42, 0xa6, 0x63, 0xd9, - 0x34, 0x35, 0x2e, 0xc0, 0xbb, 0x91, 0xf3, 0x6f, 0xd4, 0x8e, 0xa0, 0x94, - 0xc0, 0xfa, 0x9b, 0x8b, 0xd5, 0xe9, 0x5f, 0x8d, 0x33, 0xeb, 0x32, 0x2b, - 0x18, 0xe9, 0xdb, 0xa2, 0x01, 0xa7, 0xf8, 0xee, 0x56, 0x5d, 0x61, 0x28, - 0xfd, 0xe0, 0xa0, 0xf7, 0xae, 0x0e, 0xd6, 0x28, 0x5e, 0x21, 0xf5, 0x43, - 0x4b, 0xcb, 0x8e, 0xea, 0x4a, 0x00, 0x2d, 0x37, 0xf3, 0x1d, 0x99, 0xc1, - 0x98, 0x2a, 0x22, 0x98, 0x1e, 0x87, 0x17, 0x57, 0x62, 0xe9, 0x5a, 0x3a, - 0xcc, 0x26, 0xbd, 0xd4, 0x8d, 0x2f, 0x08, 0x7c, 0x10, 0x17, 0xc9, 0xfe, - 0x4d, 0x3e, 0x00, 0xa3, 0x8b, 0xb7, 0x77, 0xcd, 0xa7, 0xd6, 0x69, 0x59, - 0xd3, 0x2c, 0x79, 0x11, 0xdf, 0x14, 0x28, 0x30, 0xb7, 0x40, 0x03, 0xc1, - 0xb3, 0x53, 0xe0, 0xb4, 0x04, 0xca, 0x3a, 0x84, 0xf7, 0x6a, 0x87, 0x24, - 0x39, 0x1c, 0xbc, 0xc8, 0xc2, 0x0d, 0xa7, 0xc5, 0xa0, 0xd4, 0xf6, 0xee, - 0x5c, 0x7f, 0x95, 0xad, 0x09, 0x27, 0x31, 0xdb, 0x0c, 0x71, 0xb0, 0x87, - 0xdd, 0x16, 0x74, 0x97, 0xa4, 0x12, 0x8d, 0x37, 0x45, 0x3f, 0xb9, 0xe3, - 0xc5, 0x51, 0x0c, 0x9f, 0xdf, 0x7a, 0x40, 0xd7, 0xf5, 0x0b, 0x1a, 0x6f, - 0x8e, 0xf7, 0xed, 0x6a, 0x96, 0x53, 0xcf, 0x6c, 0x28, 0x1c, 0x61, 0x2c, - 0x4b, 0x90, 0xe4, 0x69, 0xb6, 0x8c, 0x52, 0x9e, 0xe2, 0x4e, 0x3f, 0x1c, - 0x6b, 0x65, 0x1b, 0xf0, 0x63, 0x29, 0xfc, 0xb1, 0xb3, 0x6e, 0xbd, 0x77, - 0x87, 0x06, 0x66, 0xd1, 0x1b, 0x3b, 0x30, 0x96, 0xc5, 0xce, 0xa6, 0x71, - 0x1d, 0x1f, 0x7f, 0x13, 0x5f, 0xf2, 0x94, 0xb8, 0xc2, 0x23, 0xe4, 0x7c, - 0xbf, 0xc5, 0xd4, 0x9d, 0x09, 0x8a, 0x1e, 0x0d, 0x32, 0xd0, 0x1b, 0x37, - 0xec, 0xf9, 0x89, 0xe9, 0x0f, 0x7e, 0x52, 0x9d, 0x02, 0x0a, 0x67, 0x4a, - 0xcc, 0xa4, 0x94, 0x89, 0x43, 0x1e, 0x0d, 0x52, 0x55, 0x08, 0x93, 0xd3, - 0x81, 0x3e, 0x58, 0xe8, 0xac, 0x88, 0x48, 0xbc, 0xf3, 0xbe, 0x0a, 0xe6, - 0xe5, 0x0d, 0x83, 0x5b, 0x62, 0x7b, 0x7a, 0x78, 0xf1, 0x0f, 0x2c, 0x70, - 0x47, 0x8e, 0x25, 0xf6, 0x27, 0x7b, 0x78, 0xac, 0x79, 0x8d, 0xc4, 0x68, - 0xaa, 0x9c, 0x58, 0xf4, 0xb5, 0x47, 0xcd, 0x2c, 0x8b, 0xad, 0x82, 0xd0, - 0xc2, 0xaf, 0x64, 0x80, 0xd4, 0xe2, 0x8a, 0x67, 0x5d, 0xc2, 0x99, 0x46, - 0x14, 0x3b, 0xf0, 0x91, 0x22, 0xec, 0xa8, 0xd4, 0x42, 0xfb, 0xec, 0x59, - 0x19, 0xf6, 0x5e, 0xca, 0x55, 0x3d, 0x34, 0x04, 0xc7, 0xef, 0x60, 0x88, - 0x40, 0x36, 0x48, 0xf4, 0xaf, 0x5f, 0x85, 0x7a, 0x8b, 0x76, 0x58, 0xe1, - 0x2e, 0x78, 0x9e, 0x51, 0x33, 0x51, 0x5d, 0x4f, 0xad, 0x3e, 0xe5, 0x15, - 0x33, 0xa5, 0x7e, 0x27, 0x2d, 0x3a, 0xed, 0xc1, 0x35, 0x68, 0xc5, 0x3f, - 0x1f, 0x4d, 0x93, 0xcd, 0xe3, 0x08, 0xed, 0x6f, 0x7d, 0xa3, 0x27, 0xef, - 0xe5, 0x90, 0x2b, 0x64, 0xd4, 0x04, 0x02, 0xb2, 0xe2, 0x61, 0x7c, 0x0a, - 0x00, 0x10, 0x34, 0x2b, 0x85, 0xa3, 0xdd, 0xe3, 0xfa, 0x2a, 0xc9, 0x73, - 0xce, 0x8b, 0x8c, 0xcc, 0xa5, 0xe2, 0xd1, 0x14, 0xc5, 0xc6, 0xa9, 0x0a, - 0x8f, 0x91, 0x33, 0x27, 0x5d, 0x42, 0xa5, 0x67, 0x3c, 0x75, 0xfb, 0x3a, - 0x96, 0x81, 0xe4, 0x8d, 0xf6, 0xda, 0xfa, 0x25, 0x2c, 0x56, 0xa2, 0x04, - 0x37, 0x69, 0x6b, 0xcd, 0x8e, 0xe3, 0xd3, 0xf4, 0xf0, 0x6d, 0x5f, 0x70, - 0x35, 0xfe, 0xe7, 0xb9, 0xaf, 0x4b, 0xb5, 0x82, 0xd4, 0x81, 0x13, 0xe0, - 0x65, 0x0d, 0xd1, 0xda, 0xdc, 0xf9, 0x29, 0xe2, 0x09, 0x5a, 0xf5, 0x30, - 0x68, 0xe8, 0x4a, 0xaa, 0x17, 0x01, 0xd6, 0xd4, 0x58, 0x38, 0x9b, 0xfd, - 0xa2, 0x5e, 0x16, 0x72, 0x3c, 0x9e, 0xb8, 0xf8, 0x3f, 0x7c, 0x5f, 0xc8, - 0x2c, 0x72, 0xa4, 0xa6, 0xa2, 0xa4, 0xb5, 0x09, 0x3b, 0xda, 0x3b, 0x7c, - 0x2d, 0x7f, 0xd0, 0xff, 0xa2, 0x59, 0x7c, 0xa9, 0x47, 0x5d, 0x53, 0x76, - 0x1c, 0xb5, 0x2b, 0x18, 0xbb, 0x3c, 0x51, 0xa4, 0x3c, 0xd0, 0xee, 0x04, - 0xf8, 0xf6, 0x44, 0xc5, 0x06, 0x91, 0xc4, 0x37, 0x8b, 0x4b, 0xbf, 0xe4, - 0x43, 0xdb, 0x0e, 0xae, 0xd0, 0x35, 0xd3, 0xb3, 0xb9, 0x3d, 0x28, 0x02, - 0x66, 0x56, 0xd6, 0xf4, 0x00, 0x07, 0xf1, 0x04, 0xe4, 0xd0, 0x23, 0x11, - 0x8f, 0xe9, 0x48, 0xfa, 0x5f, 0xf8, 0x15, 0x4b, 0xae, 0x46, 0xcc, 0x7b, - 0x22, 0x0e, 0x52, 0x96, 0x30, 0xaa, 0xa2, 0x2f, 0x41, 0x0b, 0xa7, 0xb9, - 0x3a, 0x07, 0xa3, 0xdf, 0x7d, 0x4b, 0x27, 0x26, 0x85, 0x1b, 0x1a, 0xa7, - 0x8d, 0x09, 0x8e, 0x0d, 0xc2, 0x2a, 0xd7, 0x4f, 0x50, 0xf1, 0x12, 0x3a, - 0x00, 0xb8, 0x5f, 0x1e, 0xb8, 0xdf, 0x32, 0xa9, 0xf3, 0x8a, 0x85, 0x7a, - 0x17, 0x1b, 0x34, 0xc0, 0xd8, 0x56, 0x68, 0x49, 0xd4, 0x98, 0x3f, 0xdd, - 0x75, 0xea, 0x44, 0x11, 0x2a, 0x7f, 0x08, 0xd5, 0x31, 0xba, 0xee, 0xb9, - 0xe9, 0xae, 0xfd, 0xc3, 0x78, 0xbb, 0x58, 0x4f, 0xfc, 0x85, 0x9e, 0xc3, - 0x14, 0xa1, 0x74, 0xd7, 0xaf, 0x24, 0x0a, 0x38, 0x4a, 0xf4, 0xbd, 0x0f, - 0x2d, 0xdd, 0x77, 0x84, 0xaa, 0x98, 0x3b, 0x1b, 0xdd, 0x74, 0xd7, 0x3b, - 0x5e, 0xf5, 0x4f, 0xca, 0x15, 0x40, 0xaf, 0xd9, 0xe4, 0xda, 0x2d, 0xb3, - 0x65, 0xb1, 0x18, 0xa8, 0x28, 0xd5, 0x72, 0xa7, 0x4b, 0x16, 0xbc, 0xd6, - 0x6b, 0x07, 0x03, 0xbd, 0x5f, 0x6f, 0x82, 0x32, 0x28, 0xb1, 0x59, 0xa8, - 0x16, 0x59, 0xf6, 0x95, 0xd5, 0x93, 0x8d, 0x8c, 0xd3, 0x23, 0x04, 0x62, - 0x39, 0x8b, 0x5e, 0x7d, 0x26, 0xc8, 0x2e, 0xac, 0x0a, 0xb7, 0x70, 0x11, - 0xf5, 0xc3, 0xdd, 0xf2, 0x1e, 0xd0, 0xfc, 0x21, 0xde, 0xc6, 0x73, 0x0e, - 0x01, 0xc7, 0xf4, 0x24, 0xea, 0xee, 0xbd, 0x37, 0xfe, 0x0e, 0x63, 0x5c, - 0xaf, 0x52, 0xfd, 0x15, 0x11, 0x11, 0xa1, 0x4e, 0x8d, 0xc9, 0xdc, 0xf6, - 0x47, 0x85, 0xea, 0x10, 0x48, 0x64, 0x1c, 0x84, 0xc7, 0x23, 0x97, 0xb8, - 0x3c, 0x15, 0x12, 0x03, 0x24, 0xe2, 0x63, 0x90, 0xc7, 0x2b, 0x12, 0x04, - 0xa3, 0x64, 0xa2, 0xb8, 0xce, 0x75, 0x62, 0x26, 0x9b, 0x11, 0xf1, 0x75, - 0x8a, 0x9c, 0x22, 0xe1, 0x43, 0x5e, 0x49, 0x84, 0x87, 0xca, 0xde, 0xb3, - 0x3f, 0xdd, 0xd6, 0x93, 0x4e, 0x81, 0x52, 0x99, 0x37, 0x57, 0xce, 0x26, - 0x1c, 0xf8, 0x4e, 0x07, 0xde, 0x41, 0x1c, 0xa8, 0x6b, 0xb3, 0x84, 0xd0, - 0x44, 0xb2, 0x29, 0x55, 0xad, 0x52, 0x5a, 0x6e, 0x56, 0x5a, 0x32, 0x1c, - 0x8e, 0x9e, 0x12, 0xb6, 0x1e, 0x49, 0x89, 0x43, 0x2e, 0x4f, 0x10, 0x1f, - 0x01, 0x99, 0x83, 0x55, 0xe1, 0x69, 0xcb, 0x4a, 0x95, 0x9a, 0x7a, 0xb0, - 0xe5, 0x60, 0x65, 0xf6, 0x87, 0xc4, 0x01, 0x75, 0x95, 0xc5, 0x1f, 0x31, - 0xcb, 0x70, 0x6d, 0xa6, 0xc9, 0x3e, 0xb6, 0x31, 0x58, 0xff, 0xef, 0xab, - 0x6f, 0x01, 0x90, 0x92, 0x02, 0xb2, 0x67, 0x71, 0x5b, 0x10, 0xea, 0xf7, - 0xfc, 0xb2, 0x62, 0xa1, 0x1d, 0xf9, 0x35, 0x78, 0x8d, 0xbc, 0xe1, 0xae, - 0x56, 0x9e, 0x96, 0x39, 0x52, 0xc5, 0x35, 0x1c, 0xf5, 0xa2, 0xd9, 0x09, - 0x1c, 0x72, 0xf4, 0x19, 0x39, 0x4c, 0x15, 0xf8, 0x86, 0x66, 0xd1, 0xa0, - 0x7f, 0xbd, 0x89, 0xfa, 0xeb, 0xbf, 0x6d, 0x56, 0xce, 0xbf, 0x19, 0x0a, - 0xb9, 0xb1, 0x3f, 0x34, 0x4d, 0x09, 0x46, 0xbb, 0x2d, 0xd7, 0xff, 0xd7, - 0x7c, 0x95, 0xe5, 0x0b, 0xb4, 0x93, 0xd5, 0xae, 0x76, 0x78, 0x9a, 0xc3, - 0x38, 0x63, 0xb4, 0xd3, 0xd4, 0x03, 0x3b, 0xd1, 0x23, 0xaf, 0x18, 0xc5, - 0xad, 0x6f, 0xd8, 0xe4, 0xa3, 0x72, 0x98, 0x45, 0xb5, 0xee, 0x74, 0x7a, - 0x43, 0x4a, 0x2e, 0x4b, 0xe6, 0x51, 0xd9, 0xb1, 0x80, 0xd4, 0x7a, 0x74, - 0x47, 0x7e, 0x74, 0x10, 0xca, 0x64, 0xba, 0x0b, 0x2a, 0x29, 0xf8, 0xc3, - 0xc9, 0x61, 0x44, 0x0a, 0x72, 0xd7, 0x05, 0xe6, 0xcb, 0xd5, 0xb3, 0xb1, - 0x85, 0x97, 0x1e, 0xc0, 0x99, 0xf6, 0x55, 0x31, 0x67, 0x30, 0x07, 0x0d, - 0x1c, 0x9d, 0x74, 0xc6, 0x60, 0x33, 0x7a, 0xfc, 0xe0, 0xe1, 0x29, 0x96, - 0x0b, 0x65, 0xdb, 0x89, 0x14, 0x86, 0xae, 0x27, 0x24, 0x72, 0xf6, 0x33, - 0x9c, 0xa2, 0x17, 0x74, 0xaf, 0x6e, 0xb4, 0x00, 0x04, 0x14, 0x50, 0x70, - 0x6e, 0x65, 0x0b, 0x50, 0xa9, 0xa8, 0xbd, 0xfb, 0x1b, 0x51, 0x0c, 0xcb, - 0xb5, 0xad, 0x3f, 0x01, 0x9f, 0x6f, 0x25, 0x49, 0x9f, 0xee, 0x32, 0x3c, - 0x71, 0xe4, 0xce, 0x3c, 0x46, 0x72, 0xa7, 0xeb, 0x90, 0x8a, 0x44, 0x77, - 0xd1, 0x39, 0xd1, 0xc4, 0x25, 0x19, 0xb5, 0x41, 0x49, 0xdc, 0xff, 0xf8, - 0x52, 0xd4, 0xd3, 0xf3, 0xd7, 0xa9, 0x0c, 0x52, 0xaf, 0xe7, 0x1f, 0x9c, - 0x6d, 0xa1, 0x1d, 0xd4, 0x47, 0x39, 0xa8, 0xaa, 0x2d, 0xdc, 0xaa, 0x1d, - 0xb5, 0xa1, 0x35, 0x9f, 0xe4, 0x98, 0x8b, 0x79, 0x57, 0xf3, 0x0d, 0x3d, - 0x5e, 0x76, 0x78, 0xf0, 0x15, 0x52, 0x5b, 0x5e, 0xa6, 0xe9, 0x2a, 0x71, - 0x78, 0x3a, 0x1e, 0xc0, 0x3a, 0xff, 0xa3, 0x5b, 0x8c, 0xf3, 0x19, 0xd2, - 0xc9, 0x3f, 0x85, 0xf1, 0x3d, 0xc0, 0x44, 0x4e, 0x7c, 0xc2, 0x32, 0x3f, - 0x63, 0x29, 0x47, 0x00, 0x75, 0x37, 0xc3, 0xec, 0x8b, 0x00, 0x9b, 0xa0, - 0x63, 0x95, 0xe7, 0x33, 0x62, 0xc1, 0x32, 0x7c, 0x85, 0xce, 0xa6, 0x71, - 0x1d, 0x1f, 0x7f, 0x13, 0x6f, 0xc4, 0x94, 0xae, 0xd8, 0x1f, 0x6a, 0xcb, - 0x44, 0xb3, 0xa9, 0xd4, 0x55, 0x2e, 0x25, 0xbd, 0x49, 0xd1, 0x7c, 0x0b, - 0xe5, 0x12, 0xe3, 0x1a, 0xb4, 0xdf, 0x92, 0x4f, 0xd7, 0xb1, 0x20, 0x11, - 0xf2, 0xbd, 0xc4, 0xbb, 0xea, 0x80, 0x10, 0xda, 0xa5, 0x7c, 0x4a, 0x5c, - 0xac, 0x0d, 0xb3, 0xad, 0xf1, 0xe3, 0xcb, 0xb3, 0x46, 0x2f, 0xd5, 0x37, - 0x48, 0x98, 0x9a, 0x6f, 0xf4, 0x90, 0xed, 0x19, 0x08, 0x3c, 0x0a, 0xc9, - 0x45, 0x50, 0x32, 0x8a, 0xd2, 0xe7, 0xbc, 0x40, 0xbd, 0x17, 0x1b, 0x28, - 0x58, 0xa7, 0xd6, 0xea, 0x76, 0x81, 0x0f, 0x85, 0xf1, 0x27, 0xa8, 0xb1, - 0xa3, 0xd6, 0xe3, 0xf8, 0x43, 0x7e, 0x7a, 0x95, 0x21, 0xbf, 0xc3, 0x30, - 0x59, 0x88, 0x98, 0x79, 0x9d, 0xbd, 0x2d, 0x43, 0x8b, 0x66, 0x45, 0xd4, - 0x72, 0xf1, 0xc3, 0x52, 0xc2, 0x3c, 0x65, 0xe8, 0xbd, 0xb9, 0x66, 0x63, - 0xd3, 0xa8, 0xb2, 0xb5, 0x9c, 0xb1, 0x60, 0x8b, 0xa9, 0x71, 0x6d, 0x19, - 0x43, 0xe8, 0xf9, 0x03, 0xa9, 0xdd, 0x28, 0x5c, 0x3a, 0xc5, 0x83, 0xf6, - 0x5f, 0x55, 0x2f, 0x26, 0xae, 0x39, 0x9f, 0xb2, 0x2c, 0xcb, 0xe4, 0x91, - 0xa1, 0xa7, 0x8b, 0x15, 0x99, 0x3f, 0x0e, 0xb0, 0x5b, 0xcf, 0x83, 0x35, - 0x89, 0x92, 0x72, 0x66, 0xf0, 0xd7, 0x2a, 0x51, 0x68, 0xc6, 0x84, 0x75, - 0x05, 0xd0, 0xa6, 0x00, 0xe7, 0xf9, 0xe3, 0x9c, 0x77, 0x26, 0xe9, 0x9e, - 0x4c, 0x91, 0x7d, 0x34, 0xb1, 0x2e, 0x44, 0x28, 0x46, 0x1e, 0xa5, 0x3a, - 0x9f, 0x66, 0x59, 0x3b, 0x73, 0x43, 0xf2, 0x02, 0x32, 0x19, 0x33, 0xb7, - 0x92, 0x21, 0xff, 0x34, 0xf0, 0xf0, 0x13, 0xb2, 0x62, 0x30, 0x07, 0xce, - 0x3c, 0x2a, 0x1b, 0x44, 0x7d, 0x81, 0xb8, 0xdf, 0xc7, 0x78, 0x50, 0xc7, - 0xbd, 0xfe, 0x7d, 0xed, 0x89, 0x7e, 0x55, 0xda, 0xad, 0x48, 0x84, 0x78, - 0xd5, 0x7a, 0x32, 0x19, 0x0f, 0x98, 0x3f, 0x05, 0xe4, 0xf3, 0x2f, 0xff, - 0x87, 0x2f, 0xb6, 0xfe, 0x73, 0x58, 0xd8, 0x86, 0x41, 0x79, 0xec, 0x08, - 0x3e, 0xce, 0x05, 0xa7, 0xbf, 0x77, 0xce, 0xf1, 0x17, 0xa7, 0x2b, 0x4b, - 0x35, 0x9b, 0x04, 0xee, 0x41, 0x93, 0x14, 0xa7, 0x47, 0x07, 0x99, 0x36, - 0xb6, 0xa3, 0x71, 0x92, 0x20, 0xd2, 0xba, 0x11, 0x67, 0xfe, 0x6a, 0x78, - 0x42, 0xc6, 0x11, 0xe6, 0x75, 0x60, 0x75, 0xf0, 0x33, 0x30, 0x00, 0xad, - 0x66, 0x50, 0x9d, 0x29, 0x30, 0xc4, 0xf5, 0x4c, 0x48, 0x1d, 0xad, 0x30, - 0x79, 0xb7, 0xaa, 0xc5, 0x86, 0x95, 0x8f, 0xc5, 0x9c, 0xb3, 0x3c, 0x44, - 0xbc, 0xe9, 0x29, 0x74, 0xc4, 0xb0, 0x81, 0xc7, 0x81, 0x80, 0xa8, 0x33, - 0x74, 0x47, 0xa4, 0x7e, 0x3a, 0x81, 0xc6, 0x2f, 0x2e, 0x20, 0xe2, 0x2c, - 0x7c, 0x78, 0xeb, 0x69, 0x2d, 0xaa, 0x49, 0x0b, 0xff, 0xa4, 0xdc, 0x5e, - 0x22, 0x4f, 0x26, 0x1e, 0x75, 0x5a, 0x81, 0xfb, 0x01, 0xd6, 0x06, 0xf9, - 0xd6, 0xaa, 0x1f, 0xc9, 0x06, 0x29, 0x6b, 0x34, 0x68, 0xac, 0x1f, 0xcf, - 0x24, 0xa0, 0x60, 0x9e, 0x06, 0x1d, 0xf2, 0xb5, 0x02, 0x6f, 0xa7, 0x9d, - 0x3f, 0x48, 0x6a, 0xbb, 0x2b, 0x5a, 0x4e, 0x0c, 0x1c, 0x6b, 0xd8, 0x8c, - 0xcf, 0xaa, 0x22, 0xce, 0xe0, 0x4f, 0x81, 0xd4, 0x70, 0x63, 0xf0, 0x20, - 0xff, 0xdc, 0xa6, 0x0e, 0xc0, 0xfd, 0x46, 0x64, 0x74, 0x22, 0xa1, 0xa0, - 0x6c, 0x8e, 0x2b, 0x2f, 0x81, 0x42, 0xf2, 0x07, 0xdd, 0xf1, 0xf9, 0x19, - 0x52, 0xe5, 0x10, 0xb4, 0x33, 0x6b, 0xe2, 0x7c, 0x05, 0xd9, 0x50, 0x64, - 0x80, 0x3a, 0xe2, 0x07, 0x06, 0xae, 0xc4, 0x5a, 0x62, 0xad, 0xc7, 0xc5, - 0x88, 0x23, 0x79, 0x6f, 0x4a, 0x57, 0xb7, 0x7e, 0x4a, 0xff, 0x46, 0x44, - 0x50, 0x8f, 0xca, 0xe8, 0xd2, 0x0e, 0x4f, 0x07, 0xbc, 0xfb, 0x0d, 0x40, - 0x68, 0xd1, 0xb1, 0x79, 0x4f, 0x03, 0xe8, 0x8e, 0x82, 0xa5, 0xfc, 0x9a, - 0xe4, 0xb1, 0x6a, 0xa9, 0x67, 0x77, 0x1d, 0x79, 0x75, 0x16, 0x36, 0xd3, - 0x30, 0x6f, 0x99, 0x67, 0x90, 0x51, 0x6e, 0x58, 0x66, 0x96, 0x9b, 0x9f, - 0x57, 0xa3, 0xca, 0xc6, 0x8e, 0xa4, 0x03, 0xa9, 0xee, 0xfa, 0x6b, 0xf8, - 0x96, 0x00, 0x20, 0x13, 0x5d, 0x21, 0xaa, 0x32, 0xd4, 0x5f, 0xa5, 0xf8, - 0x6a, 0xd7, 0xcf, 0x93, 0x5c, 0x21, 0xdd, 0x07, 0x05, 0xcb, 0x71, 0x1b, - 0x52, 0x55, 0x18, 0x1e, 0x05, 0xa9, 0x39, 0x61, 0xae, 0x9d, 0xf2, 0x4f, - 0x3d, 0x30, 0xef, 0x1c, 0x69, 0x1b, 0x8f, 0xf8, 0x2e, 0xb9, 0x1a, 0x0b, - 0x7c, 0x63, 0xff, 0xce, 0x7c, 0x30, 0x65, 0xcf, 0xa6, 0xa2, 0x59, 0x12, - 0xd8, 0xbd, 0xd7, 0xfa, 0xae, 0xb4, 0xfe, 0x73, 0xc1, 0x4b, 0x93, 0xb6, - 0xd1, 0x06, 0x66, 0xb6, 0x34, 0x39, 0x1f, 0x25, 0x87, 0x3e, 0x3c, 0xd1, - 0xb3, 0xca, 0x4a, 0x22, 0x44, 0x3a, 0xf5, 0x0d, 0xa4, 0xa2, 0xf7, 0x4d, - 0xe8, 0xc4, 0xfe, 0x96, 0xa1, 0xe9, 0xba, 0xac, 0xf7, 0x17, 0x36, 0xe2, - 0x9c, 0x5f, 0xb6, 0xcc, 0xef, 0x30, 0xc9, 0x3c, 0x47, 0x3c, 0x38, 0x00, - 0xff, 0x9d, 0x85, 0xfd, 0x95, 0xe7, 0x09, 0xcf, 0x7a, 0xb0, 0x6b, 0xb8, - 0xac, 0x69, 0xec, 0x3d, 0x00, 0xef, 0x69, 0x7c, 0x9c, 0xcd, 0xd8, 0x28, - 0x71, 0xe6, 0xe8, 0x6a, 0x95, 0x1f, 0x86, 0xd3, 0x8b, 0x76, 0xa5, 0x78, - 0x7d, 0x96, 0x0d, 0xc6, 0x29, 0x4f, 0x72, 0x25, 0xb7, 0x81, 0xac, 0x70, - 0xa4, 0xe7, 0x2d, 0xa9, 0x12, 0xd0, 0x07, 0xe0, 0xde, 0xb0, 0xd2, 0x7d, - 0xbd, 0xea, 0x9c, 0x4a, 0x04, 0xfb, 0x68, 0x42, 0x3c, 0x59, 0x6c, 0x6d, - 0x85, 0x3a, 0x4c, 0xa9, 0xa1, 0xe9, 0xba, 0xac, 0xd3, 0x17, 0x39, 0xe2, - 0x9c, 0x5f, 0xb6, 0xcc, 0x17, 0x30, 0xc9, 0x3c, 0x47, 0x3c, 0x38, 0x00, - 0xff, 0x9d, 0x85, 0xfd, 0x95, 0xe7, 0x09, 0xcf, 0x7a, 0xb0, 0x6b, 0xb8, - 0xac, 0x69, 0xec, 0x3d, 0x00, 0xef, 0x69, 0x7c, 0x9c, 0xcd, 0xd8, 0x28, - 0x71, 0xe6, 0xe8, 0x6a, 0x4b, 0xd2, 0x64, 0x5c, 0x99, 0x9e, 0x3c, 0x62, - 0xcc, 0x93, 0x10, 0xa5, 0x4d, 0x4d, 0x72, 0xcd, 0x91, 0xc0, 0x49, 0x9b, - 0x95, 0x3d, 0xac, 0xc6, 0xd6, 0x3e, 0x5a, 0x07, 0x60, 0x23, 0x1e, 0xd2, - 0x94, 0x4a, 0x4f, 0xad, 0x49, 0xef, 0xf6, 0xce, 0xae, 0xa2, 0x00, 0xa0, - 0xa5, 0x10, 0xba, 0x50, 0xd3, 0xfa, 0x00, 0xf4, 0x99, 0x6e, 0xef, 0xaa, - 0x76, 0x1f, 0xb2, 0x54, 0x61, 0xe7, 0x23, 0x2a, 0x33, 0xb5, 0x60, 0x4b, - 0xb5, 0xf9, 0x1f, 0xa1, 0xc8, 0x24, 0x3a, 0x1c, 0xe0, 0x7c, 0x31, 0x40, - 0xc5, 0x48, 0xc5, 0xfa, 0x9a, 0xc5, 0x23, 0xa0, 0x4c, 0x2e, 0x73, 0xcb, - 0xb1, 0xda, 0x61, 0x23, 0x14, 0xf8, 0xed, 0xd4, 0x17, 0xa1, 0xe3, 0x48, - 0xce, 0x6f, 0xa4, 0x67, 0x40, 0xa5, 0x60, 0x15, 0x42, 0xe2, 0xec, 0xe4, - 0x7b, 0xe4, 0xf9, 0xf0, 0x8a, 0xf1, 0x9e, 0x70, 0x1f, 0x6a, 0xaa, 0xef, - 0xd0, 0x76, 0x6f, 0x56, 0x60, 0xbb, 0x3c, 0x1d, 0x50, 0xc6, 0x09, 0xf3, - 0xac, 0x74, 0xc9, 0xaf, 0xfc, 0x78, 0xe8, 0x86, 0x90, 0x7e, 0xef, 0xbf, - 0x32, 0x92, 0x26, 0x90, 0x4d, 0xf0, 0xb3, 0x1a, 0x1f, 0x0a, 0x21, 0x3e, - 0x35, 0x6b, 0x32, 0x75, 0xb2, 0x2f, 0x22, 0x3f, 0x04, 0x03, 0x74, 0xb1, - 0x33, 0x30, 0xac, 0x43, 0x8c, 0x4b, 0x77, 0xb0, 0x38, 0xd5, 0x7c, 0x45, - 0x48, 0x7f, 0x2c, 0xba, 0xa0, 0xc1, 0x75, 0x62, 0xee, 0x02, 0x3f, 0xc3, - 0x5d, 0x28, 0x24, 0x8e, 0xbc, 0x28, 0x59, 0x0f, 0xc3, 0x77, 0x1a, 0x2e, - 0x7a, 0xd1, 0x49, 0x78, 0x47, 0x52, 0x48, 0x8c, 0xa6, 0x50, 0xf7, 0xf1, - 0xd4, 0x30, 0xc1, 0x49, 0x70, 0x22, 0xb8, 0x50, 0x84, 0x8a, 0x41, 0x88, - 0x62, 0x30, 0x9f, 0xb8, 0xcc, 0xcf, 0x08, 0x80, 0x94, 0x5b, 0x32, 0xd2, - 0xd5, 0xbf, 0x38, 0x8f, 0xb2, 0xdd, 0xf8, 0xa4, 0x9d, 0x20, 0xad, 0x00, - 0x01, 0x8a, 0x87, 0xe4, 0xf7, 0x9c, 0x8d, 0xc3, 0x75, 0x7f, 0x9a, 0xa4, - 0x6e, 0x78, 0x1a, 0xf2, 0xaa, 0x72, 0x85, 0xa0, 0x29, 0xdd, 0x95, 0x3b, - 0xe1, 0xa9, 0xc5, 0xaf, 0x22, 0xf8, 0x75, 0xe9, 0x2a, 0x68, 0x80, 0x85, - 0x7c, 0x34, 0x53, 0x76, 0xf2, 0x30, 0x0a, 0xd7, 0x7c, 0x4f, 0x23, 0x94, - 0x17, 0xfb, 0x35, 0x1f, 0x8b, 0x2e, 0xe5, 0x28, 0x08, 0x10, 0x3e, 0x40, - 0xba, 0xb2, 0x44, 0xfd, 0x2c, 0x99, 0xf1, 0x11, 0xe3, 0x8f, 0xd5, 0x4a, - 0xba, 0x3c, 0x01, 0x44, 0xa2, 0x77, 0xc2, 0x60, 0x51, 0x61, 0xf6, 0xcd, - 0x1c, 0x67, 0x8c, 0x0b, 0x09, 0x85, 0x7c, 0x23, 0x93, 0x88, 0xd5, 0x36, - 0x21, 0x26, 0x7e, 0x1b, 0xf1, 0x7b, 0x33, 0xf8, 0x9d, 0x2e, 0x78, 0x66, - 0x41, 0xaa, 0x71, 0xe9, 0x48, 0xb8, 0x63, 0xd6, 0xe1, 0x47, 0x92, 0x45, - 0x0a, 0x50, 0x3e, 0xbb, 0xca, 0xdc, 0x3b, 0x4f, 0x5f, 0x94, 0x26, 0x65, - 0x1a, 0xf6, 0x3a, 0x5b, 0x25, 0x7a, 0x6c, 0x72, 0xe3, 0x62, 0xb3, 0xac, - 0x15, 0x54, 0xc1, 0x5c, 0xa6, 0x7a, 0x37, 0x90, 0x9b, 0x9a, 0x37, 0x38, - 0x10, 0x72, 0xc2, 0x2a, 0x0b, 0xa3, 0x62, 0xb9, 0x17, 0x5a, 0xb5, 0xca, - 0x95, 0x93, 0xc2, 0x84, 0x29, 0xaf, 0xef, 0x64, 0xa8, 0x2a, 0x30, 0xbb, - 0x2b, 0xcc, 0xb7, 0xe8, 0xcb, 0x40, 0x93, 0x49, 0x35, 0xb0, 0xbe, 0xfb, - 0xa5, 0xc5, 0x4e, 0x17, 0xe0, 0xd4, 0x2d, 0xc2, 0x45, 0xde, 0x5b, 0xe9, - 0xe1, 0xe8, 0x5f, 0x7b, 0x23, 0x3b, 0x8d, 0x27, 0x31, 0x88, 0xa5, 0x49, - 0x6e, 0xd0, 0x94, 0x70, 0xde, 0x0a, 0x8b, 0xbc, 0x25, 0x24, 0xad, 0x7f, - 0xc4, 0x0b, 0x8f, 0x35, 0x53, 0x9e, 0xc1, 0xbd, 0xb3, 0x61, 0x33, 0xcb, - 0xa9, 0x19, 0x6d, 0x11, 0x70, 0x87, 0x4a, 0xad, 0xb9, 0xc7, 0x28, 0x3a, - 0x21, 0xb9, 0x60, 0x71, 0x98, 0x4f, 0xf4, 0x91, 0xaf, 0xf0, 0xea, 0x04, - 0x16, 0x02, 0x11, 0x6c, 0x47, 0x80, 0x7f, 0xe4, 0x35, 0x43, 0xce, 0x95, - 0xbd, 0x99, 0xab, 0x35, 0xf1, 0x18, 0x0c, 0x40, 0x6c, 0x6c, 0x49, 0x65, - 0x8a, 0x70, 0xfd, 0x3a, 0xd5, 0xf8, 0xcb, 0xdd, 0x75, 0xaa, 0xfe, 0x7b, - 0x8c, 0x9d, 0x69, 0x45, 0x97, 0xa2, 0xa2, 0x8e, 0x35, 0x50, 0x95, 0x6e, - 0xb8, 0x56, 0xdd, 0x8d, 0x39, 0x91, 0x01, 0xcc, 0x16, 0x39, 0xbf, 0x15, - 0x36, 0x03, 0xb8, 0x55, 0x7e, 0x18, 0xf3, 0x88, 0xcd, 0x94, 0x7b, 0xd1, - 0x0b, 0x11, 0xaa, 0x0c, 0x53, 0xd6, 0x48, 0x36, 0xdd, 0x25, 0xac, 0x5d, - 0x1d, 0xe4, 0xd4, 0xd2, 0xd6, 0x90, 0xa0, 0x6f, 0xd3, 0x4b, 0x85, 0x79, - 0xf7, 0x70, 0xc9, 0x98, 0x82, 0x45, 0x98, 0xa1, 0xbc, 0x30, 0x13, 0x33, - 0x92, 0x88, 0x92, 0xc4, 0x4c, 0x2b, 0xdb, 0x3c, 0x0c, 0xd5, 0xca, 0xa1, - 0xc3, 0xca, 0x76, 0x87, 0xee, 0x69, 0x2a, 0xd7, 0x28, 0xb7, 0x9e, 0xa5, - 0x7e, 0x78, 0x27, 0x21, 0x2c, 0xa5, 0x4c, 0x17, 0x6b, 0xee, 0x13, 0xb5, - 0x50, 0x73, 0x2d, 0x85, 0x6e, 0xcf, 0x6d, 0x36, 0xaa, 0x70, 0x91, 0xf3, - 0x8c, 0xe7, 0x28, 0x43, 0x00, 0x94, 0xc1, 0x05, 0x71, 0x53, 0xa0, 0x79, - 0xa8, 0x2f, 0x98, 0xab, 0xd0, 0x7b, 0x0e, 0x05, 0xa4, 0xd2, 0xaa, 0xb4, - 0x27, 0xf0, 0x12, 0x6b, 0x49, 0x52, 0x68, 0xbe, 0xbb, 0xac, 0x3f, 0x27, - 0xa1, 0x50, 0x85, 0x39, 0xe5, 0x6e, 0xbe, 0xd4, 0x2e, 0x52, 0x36, 0x00, - 0xc2, 0xa0, 0x5e, 0x5d, 0x0b, 0xa1, 0x30, 0xe0, 0x4a, 0x6d, 0x06, 0x41, - 0x6f, 0x1e, 0x9d, 0x65, 0x9d, 0xd9, 0x9f, 0xa1, 0x99, 0x2e, 0x7e, 0xe9, - 0xed, 0x31, 0xe0, 0x27, 0xff, 0x6a, 0x55, 0x51, 0x1e, 0x85, 0x57, 0x07, - 0x2a, 0xb0, 0xd4, 0xd6, 0xfd, 0x72, 0xa8, 0xbf, 0x78, 0x73, 0xbb, 0x73, - 0x7e, 0xa4, 0x09, 0x50, 0xe3, 0xda, 0x51, 0x22, 0x4d, 0x58, 0x28, 0xef, - 0xf2, 0x08, 0x6f, 0x48, 0x7a, 0x76, 0x52, 0x90, 0x56, 0xb7, 0x34, 0x16, - 0x78, 0x34, 0x26, 0xb6, 0x6a, 0xed, 0x6c, 0x1f, 0xeb, 0xc5, 0x9c, 0x32, - 0x6d, 0x42, 0xb9, 0x6c, 0xf0, 0x0d, 0xec, 0xd0, 0x84, 0x81, 0x31, 0x8f, - 0x86, 0x30, 0x35, 0x83, 0x1d, 0x3b, 0x98, 0x17, 0x27, 0x21, 0x58, 0xfc, - 0xaa, 0x53, 0xc7, 0x5e, 0x20, 0x04, 0x88, 0x02, 0xe1, 0xb2, 0xe0, 0x3f, - 0x42, 0x87, 0x41, 0x94, 0x94, 0x35, 0xe4, 0xd3, 0x54, 0x17, 0x14, 0x57, - 0x3e, 0x5b, 0x7b, 0x69, 0x2e, 0xea, 0x6f, 0x82, 0x73, 0x84, 0x23, 0xa8, - 0x62, 0xf5, 0x21, 0x13, 0x42, 0x1f, 0x88, 0x7d, 0x57, 0x9f, 0x17, 0x68, - 0x34, 0x85, 0xac, 0xd3, 0x73, 0xab, 0x34, 0x25, 0xc1, 0x74, 0x78, 0x8b, - 0x75, 0x44, 0xa9, 0x1a, 0x36, 0x54, 0x09, 0x1e, 0x12, 0x21, 0x01, 0xff, - 0xcd, 0x89, 0x73, 0x16, 0xbf, 0x04, 0x56, 0xbe, 0x07, 0x04, 0xf8, 0x15, - 0x89, 0xa9, 0x85, 0x3e, 0xb4, 0x4c, 0x3a, 0xd6, 0xd6, 0x18, 0xd4, 0xa9, - 0x24, 0x02, 0xc0, 0xcc, 0xdf, 0x2f, 0x25, 0x31, 0x42, 0xee, 0x34, 0xa8, - 0x9c, 0x6c, 0x00, 0x1d, 0xb9, 0xb4, 0x13, 0x87, 0x7c, 0xb8, 0x46, 0x4b, - 0x26, 0xd3, 0xd5, 0x60, 0xfe, 0xb9, 0x0e, 0x31, 0x0c, 0xd6, 0xbd, 0xde, - 0x99, 0xfd, 0x5b, 0x6f, 0x55, 0x42, 0xc2, 0xe6, 0x9b, 0x28, 0x98, 0x87, - 0x38, 0x50, 0x90, 0xf5, 0xe1, 0xb8, 0xca, 0x81, 0x65, 0x55, 0x94, 0x18, - 0xdb, 0x83, 0x85, 0x47, 0x36, 0xa7, 0xf2, 0x10, 0x4d, 0x96, 0x46, 0xd2, - 0xf3, 0xf0, 0xe0, 0xc3, 0x41, 0x62, 0x9e, 0x22, 0xd4, 0xab, 0x4b, 0xac, - 0x24, 0x11, 0x62, 0xbb, 0x1b, 0x53, 0x23, 0x2e, 0x09, 0x78, 0xc1, 0xd9, - 0xdb, 0xa9, 0xf0, 0x96, 0xa3, 0x17, 0xad, 0xfe, 0x6b, 0x4a, 0xc8, 0x1b, - 0x5a, 0x9e, 0xee, 0x42, 0xcb, 0xdb, 0xb2, 0x5d, 0xa4, 0x55, 0x87, 0x3e, - 0xb2, 0x72, 0x61, 0xb6, 0x01, 0x4d, 0x81, 0xc2, 0xd2, 0xf2, 0x63, 0x0c, - 0x2b, 0x0b, 0x9d, 0x99, 0x4f, 0x87, 0xa0, 0x24, 0x5c, 0x06, 0x37, 0xdd, - 0x3f, 0x44, 0x18, 0x48, 0xb6, 0xb8, 0x88, 0x35, 0x8e, 0x8d, 0xf8, 0x70, - 0x93, 0x65, 0x5b, 0x10, 0x72, 0xf5, 0xc5, 0xe4, 0xbc, 0xcb, 0x09, 0xce, - 0x76, 0x19, 0x2e, 0x0e, 0xe3, 0x02, 0x4e, 0x03, 0x43, 0xbb, 0xd3, 0xed, - 0xa6, 0xcc, 0x56, 0x90, 0xe3, 0x0b, 0xdd, 0xfb, 0xe9, 0xb0, 0xf8, 0xf4, - 0x4b, 0x89, 0x80, 0xd0, 0x22, 0xaf, 0x44, 0x49, 0x70, 0x4f, 0x09, 0x55, - 0xe8, 0xa6, 0xb1, 0x02, 0xc8, 0x07, 0xdd, 0x5e, 0xca, 0x8f, 0xc8, 0xe7, - 0x13, 0xd2, 0x47, 0xd1, 0x34, 0xe8, 0xb4, 0x0e, 0x99, 0x23, 0x8c, 0xa6, - 0x0f, 0xa8, 0x02, 0xce, 0x16, 0x03, 0x48, 0x96, 0xa0, 0x73, 0x28, 0x76, - 0x86, 0xb9, 0x45, 0x21, 0x75, 0xbf, 0x3a, 0x39, 0x1a, 0x1e, 0xd4, 0x02, - 0xe3, 0xf9, 0xfd, 0x74, 0xac, 0x5c, 0x47, 0xf4, 0xdd, 0xaa, 0x91, 0x25, - 0x81, 0xd9, 0x7f, 0xcb, 0xfb, 0x07, 0x9d, 0x95, 0x4f, 0x5b, 0xa0, 0x04, - 0x32, 0x05, 0x81, 0x00, 0xac, 0x2a, 0x91, 0x86, 0xff, 0x34, 0x45, 0x0b, - 0xc9, 0x2d, 0x1d, 0xc9, 0xc8, 0xed, 0x4b, 0x8e, 0xb6, 0x94, 0x6c, 0x3c, - 0x9c, 0x87, 0x3d, 0x49, 0xf0, 0x24, 0xe8, 0x8d, 0xee, 0xb6, 0x96, 0xc7, - 0x80, 0x34, 0xf4, 0xbc, 0x6b, 0x42, 0x01, 0x4a, 0xfd, 0x0a, 0x5d, 0xb0, - 0xf2, 0xd1, 0x7a, 0xf7, 0xdf, 0x0a, 0x87, 0xc0, 0x9d, 0x6a, 0x40, 0x1f, - 0xd9, 0xde, 0x60, 0xc6, 0x8f, 0x37, 0x00, 0x50, 0x84, 0x4c, 0x41, 0xf0, - 0x58, 0x8e, 0xe9, 0x04, 0x87, 0x03, 0x45, 0x00, 0x14, 0x5f, 0x60, 0x6c, - 0x38, 0x01, 0x76, 0x97, 0x18, 0xde, 0xc2, 0xa0, 0x83, 0x82, 0xa5, 0x3f, - 0xd2, 0xa2, 0xf8, 0xf6, 0x78, 0xf4, 0x59, 0x77, 0xc0, 0xc7, 0x59, 0xb4, - 0x42, 0x5d, 0x70, 0x51, 0xbb, 0x3c, 0xc4, 0x36, 0x8d, 0xe4, 0x07, 0xa2, - 0x28, 0x54, 0xd7, 0xe2, 0xde, 0x8b, 0x8e, 0xf0, 0x8d, 0xca, 0xae, 0xf4, - 0x3b, 0x6b, 0xff, 0xe2, 0xa0, 0xf7, 0xbf, 0x53, 0x89, 0x0a, 0x3e, 0xdc, - 0x41, 0xce, 0x93, 0x62, 0x2d, 0xb4, 0x09, 0x37, 0xc7, 0x59, 0x4c, 0x80, - 0xb4, 0xd4, 0x0e, 0x3d, 0x69, 0xb5, 0x76, 0x5a, 0xa8, 0x89, 0xaa, 0x08, - 0xa6, 0x5d, 0x9a, 0x46, 0xc6, 0x3f, 0xe7, 0x9c, 0x5f, 0x23, 0x0c, 0x24, - 0xef, 0x25, 0x2e, 0x37, 0x84, 0xe1, 0x43, 0x93, 0x9a, 0x3e, 0xe3, 0x72, - 0x8f, 0x9e, 0xe2, 0xa7, 0xc1, 0x4e, 0x45, 0xc0, 0x0f, 0xeb, 0x9d, 0xc3, - 0xf0, 0x4b, 0xdc, 0xe9, 0x35, 0x31, 0x3c, 0xe4, 0x9f, 0x85, 0x13, 0xbf, - 0x76, 0xd0, 0x35, 0x98, 0x73, 0x6e, 0xe0, 0x8c, 0xb1, 0x70, 0xbb, 0x76, - 0xf6, 0x0d, 0x8c, 0xb9, 0x45, 0x1b, 0x2b, 0x4f, 0xb9, 0xe7, 0xc0, 0x44, - 0xe7, 0x22, 0xeb, 0x20, 0xb7, 0x48, 0xc7, 0x35, 0xbe, 0xa1, 0x18, 0x45, - 0x17, 0x67, 0x2e, 0x83, 0xf8, 0x47, 0xe2, 0xc4, 0x85, 0x4a, 0x11, 0xe6, - 0x43, 0x48, 0x09, 0x4a, 0xf2, 0xdc, 0xd5, 0xfa, 0xc3, 0x3a, 0x6a, 0x6c, - 0x7e, 0x96, 0x9a, 0x9e, 0x15, 0xdf, 0xbc, 0xd5, 0x6d, 0xf0, 0x2a, 0xd5, - 0x4f, 0xd5, 0x42, 0xac, 0x78, 0xe3, 0x0c, 0xc0, 0xe2, 0xaf, 0xb7, 0xd1, - 0xeb, 0xf6, 0x84, 0xb7, 0x65, 0x2e, 0x27, 0xbe, 0x96, 0x37, 0x3c, 0x4b, - 0xf3, 0x22, 0x01, 0x01, 0xe9, 0x30, 0x5c, 0x4c, 0xbb, 0xda, 0x77, 0xc5, - 0xf2, 0xb1, 0x38, 0xa3, 0xf7, 0x03, 0x56, 0x6e, 0xc2, 0xab, 0x12, 0xd3, - 0xe7, 0x82, 0x7a, 0x12, 0xbc, 0x22, 0x7a, 0x5d, 0x23, 0x83, 0x10, 0xd8, - 0xe6, 0xab, 0xa4, 0x35, 0x77, 0x0d, 0x2c, 0xa4, 0x56, 0x4f, 0x2d, 0x64, - 0xe7, 0x13, 0x9b, 0x0f, 0x3d, 0xda, 0x1b, 0x82, 0xde, 0x5b, 0x15, 0xba, - 0x21, 0xde, 0x68, 0x34, 0x18, 0x40, 0xc6, 0x5d, 0x48, 0x9a, 0xa1, 0x6b, - 0x58, 0x7f, 0x3a, 0x46, 0x89, 0x7c, 0xbc, 0x4b, 0x9d, 0xb6, 0xe2, 0x59, - 0x63, 0x8a, 0x75, 0x59, 0x87, 0xb4, 0x31, 0x37, 0x81, 0x25, 0x59, 0x73, - 0x71, 0x1d, 0x97, 0x84, 0xa9, 0x5e, 0x9f, 0x38, 0x0f, 0x44, 0x2f, 0xde, - 0x41, 0x5f, 0x95, 0xb2, 0x71, 0x34, 0xcb, 0xfc, 0x25, 0xc6, 0x4e, 0xf6, - 0xf8, 0x0a, 0xfb, 0x01, 0x18, 0x18, 0x66, 0x9f, 0x6a, 0x62, 0x68, 0x7a, - 0xb2, 0x77, 0x1b, 0x6c, 0x13, 0x72, 0xe9, 0xd0, 0x6f, 0x3e, 0x6c, 0xf6, - 0xbd, 0x6d, 0x27, 0x95, 0x9c, 0x5c, 0x95, 0xf2, 0x6b, 0xc8, 0x39, 0xfe, - 0x6f, 0xcd, 0xbe, 0x0b, 0xe4, 0x16, 0x30, 0x01, 0xa9, 0x49, 0x12, 0xc5, - 0x78, 0xa7, 0x2f, 0x69, 0xc3, 0xc5, 0x4f, 0x16, 0xd4, 0xbc, 0x2a, 0x7d, - 0x71, 0xbf, 0x5a, 0x12, 0x8a, 0x55, 0x4c, 0xf7, 0xb9, 0x1e, 0x75, 0x04, - 0xaa, 0xdf, 0x0d, 0xf5, 0x20, 0x88, 0xa7, 0xbe, 0x8c, 0x5a, 0xdc, 0x3b, - 0x40, 0x91, 0xaf, 0x99, 0x9b, 0x9f, 0xb4, 0x1a, 0x6d, 0x67, 0xd0, 0xdd, - 0x0a, 0x34, 0x09, 0xa9, 0xba, 0x08, 0x23, 0x15, 0x55, 0x26, 0x95, 0xb8, - 0x13, 0x28, 0xdc, 0xdb, 0xe2, 0x79, 0x51, 0x3d, 0xa1, 0x2e, 0xba, 0x38, - 0xd3, 0x05, 0xd7, 0x74, 0xe1, 0x78, 0x9c, 0x41, 0xbf, 0xa0, 0x82, 0x6b, - 0xbc, 0x96, 0x11, 0xcb, 0x0f, 0xcd, 0xe4, 0xdf, 0xdc, 0x75, 0x93, 0x97, - 0x66, 0x96, 0xf1, 0x6d, 0xed, 0x5d, 0x99, 0x07, 0xf1, 0x9e, 0x81, 0x4f, - 0x10, 0x12, 0x21, 0xd6, 0x7a, 0x50, 0x06, 0x06, 0xbd, 0x81, 0x99, 0x99, - 0x03, 0xe8, 0x4b, 0x91, 0xe6, 0x4d, 0xf2, 0xe8, 0x7a, 0x10, 0xb9, 0x80, - 0xc1, 0x69, 0x10, 0x3e, 0x93, 0x76, 0xe7, 0xdd, 0x34, 0x2a, 0xbe, 0xb5, - 0x58, 0xb8, 0x9f, 0x56, 0xbc, 0x0a, 0xd8, 0x00, 0x32, 0xd5, 0xa9, 0xdb, - 0x8a, 0xf9, 0xfc, 0x01, 0xf2, 0x7c, 0x70, 0x84, 0x15, 0xcb, 0xd6, 0x5f, - 0x1b, 0x6d, 0xf8, 0x93, 0x60, 0x0e, 0x71, 0xe4, 0x01, 0x38, 0xe7, 0x01, - 0xe2, 0x68, 0x92, 0xd8, 0x1b, 0x28, 0x12, 0xac, 0x78, 0x97, 0x4c, 0x2e, - 0x0f, 0xed, 0x62, 0x55, 0x2e, 0x27, 0xf1, 0xe1, 0x94, 0x53, 0x85, 0xc4, - 0x97, 0x0c, 0x55, 0xce, 0x50, 0x56, 0xf1, 0x74, 0xc2, 0x9d, 0x6a, 0x9b, - 0x72, 0x5f, 0xd5, 0x92, 0xa3, 0xcf, 0x4d, 0xd0, 0xa5, 0xc2, 0xdb, 0xd3, - 0xc1, 0x27, 0xab, 0x01, 0x09, 0xdd, 0x4b, 0xf8, 0x2f, 0x26, 0xc1, 0x4e, - 0x4a, 0x85, 0xfd, 0xbf, 0xfa, 0xc2, 0x49, 0x37, 0x94, 0x6a, 0x7f, 0x76, - 0x90, 0x40, 0x64, 0x94, 0xf7, 0xc9, 0x3c, 0x76, 0x7e, 0x1b, 0xcd, 0xf3, - 0x75, 0x34, 0x81, 0x07, 0x46, 0xec, 0x66, 0x80, 0x1a, 0x4f, 0xfd, 0xc2, - 0x1f, 0x51, 0xaa, 0x43, 0xd4, 0x10, 0x40, 0xb9, 0x8b, 0x59, 0x42, 0x95, - 0xbf, 0x6d, 0x18, 0xa2, 0x0f, 0x0b, 0x74, 0x44, 0xd6, 0x97, 0x5b, 0x79, - 0x77, 0xa5, 0x1d, 0xc0, 0x16, 0x14, 0x74, 0x20, 0x2a, 0xc1, 0x2b, 0xbd, - 0x2b, 0x76, 0xf3, 0x1c, 0x3a, 0x33, 0xb0, 0xcd, 0xcf, 0xb4, 0x60, 0x27, - 0xb0, 0x8e, 0xef, 0xcc, 0xae, 0x9b, 0xe6, 0xbc, 0x10, 0x2e, 0xf2, 0xb2, - 0x51, 0x39, 0xbe, 0xab, 0x66, 0x90, 0xf6, 0x97, 0xd9, 0xf4, 0xc9, 0x6f, - 0xc5, 0xcc, 0x52, 0xed, 0x3e, 0x53, 0xe5, 0xb7, 0x1d, 0x03, 0x2c, 0x78, - 0x39, 0xc2, 0xc4, 0x1c, 0x0b, 0x63, 0xc3, 0xdc, 0xe2, 0xda, 0x97, 0x98, - 0xd9, 0x38, 0x22, 0x7f, 0xf8, 0x43, 0xd8, 0xa9, 0x56, 0xd0, 0x27, 0xcb, - 0x9d, 0x37, 0x04, 0x17, 0x59, 0x39, 0xc0, 0x75, 0x49, 0xb3, 0x6e, 0xa6, - 0xb2, 0x7b, 0x29, 0x24, 0x9e, 0xa8, 0xe0, 0xef, 0x5e, 0x0c, 0x17, 0xbe, - 0xf0, 0x7e, 0x22, 0x5b, 0x8d, 0x8b, 0xfc, 0x5c, 0x80, 0x80, 0xd3, 0x9b, - 0x6b, 0x90, 0xea, 0xff, 0xad, 0xfa, 0xc9, 0x31, 0x49, 0x82, 0x32, 0xcb, - 0xc8, 0xa6, 0xba, 0x78, 0xca, 0x37, 0x5f, 0xdf, 0xb8, 0x1a, 0x92, 0xc7, - 0x8b, 0x93, 0xbe, 0x9a, 0xb6, 0x96, 0xa6, 0x48, 0xf6, 0x4a, 0xd9, 0x7d, - 0xbf, 0x8f, 0x47, 0xb8, 0x69, 0x6a, 0xc7, 0x07, 0xc5, 0x87, 0x43, 0xc8, - 0x85, 0x84, 0x1f, 0x7f, 0x98, 0xfd, 0x6f, 0x27, 0x7b, 0x6b, 0xcf, 0xf7, - 0x7d, 0xdc, 0xf4, 0x71, 0xcc, 0xb3, 0x0d, 0xfa, 0x38, 0x88, 0xfd, 0xa1, - 0xea, 0x34, 0x67, 0x99, 0xdb, 0x7f, 0xe7, 0x4d, 0x70, 0x45, 0x95, 0x20, - 0x12, 0xa6, 0xb1, 0xa9, 0x81, 0x91, 0x46, 0xd9, 0x99, 0x73, 0x46, 0x23, - 0xa0, 0x20, 0x59, 0xf8, 0xaa, 0x82, 0xc0, 0xb5, 0xa8, 0xef, 0x26, 0xef, - 0xff, 0xf7, 0x1f, 0x5c, 0xb4, 0x43, 0xbc, 0x3c, 0xa8, 0x10, 0xac, 0xeb, - 0x87, 0x5f, 0x92, 0x96, 0xbe, 0xda, 0x6b, 0xd1, 0xe0, 0x06, 0x45, 0xd5, - 0x41, 0x5e, 0x7e, 0x01, 0xec, 0x4c, 0x7d, 0x21, 0x46, 0xbd, 0x57, 0x9a, - 0x50, 0xf3, 0x8e, 0x27, 0x01, 0xcf, 0x06, 0x41, 0xcd, 0x1b, 0x4d, 0x64, - 0x1d, 0xde, 0x8d, 0x74, 0x1c, 0x6d, 0xd3, 0x88, 0x58, 0x44, 0xa6, 0xb9, - 0x6a, 0x9a, 0x5d, 0x18, 0x1c, 0x07, 0xbd, 0x4f, 0x34, 0xb9, 0xaa, 0x9d, - 0x3c, 0x02, 0xe1, 0xfb, 0xbc, 0x78, 0x7e, 0x55, 0x17, 0x27, 0x1d, 0xf1, - 0x9c, 0xc8, 0x9b, 0x2b, 0x29, 0x91, 0x9a, 0x96, 0x22, 0x8b, 0xd5, 0xf2, - 0x10, 0xbb, 0xf1, 0xdb, 0x03, 0x89, 0x52, 0xcf, 0x9a, 0xd9, 0x18, 0xc6, - 0xfc, 0x54, 0x2d, 0x6f, 0x1a, 0xdd, 0x35, 0x69, 0x47, 0x22, 0x05, 0x7b, - 0xb5, 0xaa, 0xed, 0xa5, 0x16, 0xd4, 0xe1, 0x70, 0xe5, 0x25, 0xd3, 0xf3, - 0xcb, 0xea, 0xca, 0xa2, 0x4c, 0x1e, 0xe9, 0x8a, 0xd6, 0x9c, 0x75, 0xf3, - 0x61, 0x2e, 0x02, 0xe7, 0x4e, 0xad, 0x08, 0xb8, 0x75, 0x88, 0x1a, 0xa0, - 0xec, 0x65, 0xa7, 0x06, 0x57, 0xde, 0x17, 0x9d, 0x3f, 0x0d, 0xbd, 0x3d, - 0xf9, 0xa8, 0x42, 0x27, 0x65, 0x99, 0xbb, 0x5f, 0xf6, 0xab, 0x8b, 0xb9, - 0xc7, 0x9c, 0x1d, 0xc2, 0x3a, 0x3c, 0xf1, 0x04, 0x00, 0x51, 0x32, 0xee, - 0x23, 0xf1, 0x2a, 0xed, 0x59, 0x94, 0x84, 0x8e, 0x5a, 0xc0, 0xf9, 0xcf, - 0x6f, 0xd4, 0xf5, 0x97, 0x10, 0x42, 0xed, 0xca, 0x25, 0xf3, 0x12, 0xff, - 0x69, 0xce, 0xf6, 0xe7, 0x9a, 0xbc, 0xff, 0x8e, 0xd0, 0xff, 0xb9, 0x1e, - 0x56, 0xdd, 0x09, 0x75, 0x99, 0x5a, 0x9d, 0x4f, 0x6e, 0xc6, 0x31, 0xb2, - 0x91, 0xda, 0x10, 0xfb, 0xb5, 0x42, 0x6d, 0xb7, 0xae, 0x92, 0xaf, 0xbb, - 0xc2, 0x5a, 0x13, 0x28, 0x43, 0xb4, 0xce, 0xbe, 0xc6, 0x2f, 0xf6, 0x40, - 0x6b, 0x45, 0x8c, 0x40, 0x88, 0x5b, 0xb3, 0xe3, 0x68, 0x82, 0x0f, 0x50, - 0x3d, 0xc5, 0x1f, 0x6f, 0x3d, 0xe9, 0x51, 0xb9, 0x1f, 0xe3, 0x09, 0x65, - 0x41, 0x75, 0x92, 0x8c, 0x40, 0x4c, 0x06, 0xc6, 0xe1, 0xea, 0x15, 0x2d, - 0x43, 0x9d, 0x6e, 0x83, 0x86, 0x31, 0x36, 0x35, 0x90, 0x54, 0x6e, 0xd0, - 0xed, 0x44, 0x44, 0x5a, 0x3e, 0x76, 0x82, 0xe9, 0x74, 0x55, 0xa4, 0x69, - 0x84, 0xdd, 0x6b, 0x21, 0xf7, 0xd7, 0x37, 0xe7, 0xd3, 0xd8, 0x31, 0x34, - 0x87, 0x5e, 0xc1, 0x03, 0x3a, 0x2a, 0x95, 0x7a, 0xfa, 0xbf, 0x79, 0xcd, - 0x87, 0x40, 0xe5, 0x01, 0x23, 0xf0, 0x9d, 0x1d, 0xda, 0x56, 0xf4, 0xb1, - 0x50, 0x31, 0x34, 0x53, 0x1b, 0x47, 0xe3, 0x19, 0xce, 0x33, 0x31, 0xc0, - 0xc2, 0xf3, 0xcd, 0x68, 0xab, 0x54, 0x72, 0x82, 0xbd, 0x4b, 0x17, 0x5a, - 0x7a, 0x8f, 0x5c, 0xe8, 0xde, 0x64, 0x66, 0x64, 0x45, 0x3f, 0x44, 0xc2, - 0x9c, 0x37, 0xc2, 0x19, 0x06, 0xb3, 0x53, 0x39, 0xe1, 0x86, 0xbe, 0x96, - 0xe6, 0x5b, 0x8f, 0x05, 0x0c, 0xed, 0xf3, 0x47, 0xbf, 0x3b, 0xed, 0xdf, - 0xe6, 0xd1, 0xdb, 0xd6, 0x81, 0x24, 0xc1, 0xb2, 0xce, 0x29, 0x69, 0x77, - 0x83, 0x52, 0x43, 0x96, 0xe6, 0x1e, 0xe7, 0x4f, 0xd6, 0x5e, 0xb7, 0x2f, - 0x1f, 0x25, 0x84, 0xdf, 0xd9, 0x89, 0x19, 0x7d, 0x48, 0xb1, 0x9b, 0xc7, - 0xc9, 0x8c, 0x04, 0x0d, 0xbc, 0x3a, 0x2e, 0x13, 0x60, 0x73, 0x00, 0x58, - 0x52, 0x76, 0xed, 0x39, 0x39, 0x8c, 0xce, 0x3a, 0xd2, 0x8c, 0xe4, 0x49, - 0x85, 0xe2, 0xcb, 0xa2, 0x6e, 0xe3, 0x07, 0x86, 0x08, 0x19, 0x7d, 0x3e, - 0x72, 0xde, 0x07, 0xde, 0xe4, 0xc7, 0x4d, 0x96, 0x82, 0x7c, 0x59, 0xbd, - 0xba, 0xeb, 0x3e, 0x39, 0x36, 0x2f, 0xf1, 0xfb, 0xde, 0x3b, 0xeb, 0xbe, - 0x28, 0x3d, 0x23, 0xd7, 0x52, 0x63, 0xf0, 0xbd, 0x07, 0x32, 0x79, 0x50, - 0xa0, 0xea, 0x65, 0x16, 0xe7, 0x3f, 0x9c, 0xb0, 0xe0, 0xbc, 0xa8, 0xfe, - 0xd4, 0xdd, 0x30, 0x98, 0xd7, 0xa6, 0xea, 0x47, 0xb9, 0x06, 0x73, 0x89, - 0x78, 0xf6, 0x85, 0xf2, 0x3f, 0xc5, 0x0f, 0x23, 0xcb, 0x61, 0x6f, 0xeb, - 0x96, 0xcf, 0xce, 0x06, 0x2c, 0x9d, 0xe5, 0xc7, 0x66, 0x7b, 0xec, 0x9f, - 0x41, 0x7c, 0x29, 0xa2, 0xf2, 0x4b, 0x09, 0x3c, 0xb4, 0x29, 0xf3, 0xc3, - 0xbf, 0x67, 0x84, 0x37, 0xbe, 0x8b, 0xb6, 0xd4, 0xef, 0x8f, 0x0b, 0xf1, - 0x2f, 0x30, 0x8d, 0x25, 0x6a, 0xbd, 0x71, 0x4e, 0x04, 0xaf, 0x5a, 0xd3, - 0x70, 0x23, 0x2d, 0xdf, 0x87, 0x9c, 0xbb, 0xb5, 0xab, 0x44, 0x64, 0x0b, - 0x7c, 0xda, 0xfd, 0x8f, 0x0a, 0x17, 0x2d, 0x9e, 0x7b, 0x27, 0xbb, 0x48, - 0xe0, 0x53, 0x56, 0x9b, 0x82, 0x4b, 0x48, 0xef, 0xe7, 0x99, 0xc6, 0x1f, - 0x30, 0x24, 0x16, 0xc2, 0x26, 0xe7, 0x42, 0xad, 0x75, 0x1e, 0xfb, 0xc0, - 0x93, 0xb4, 0x92, 0x3d, 0x60, 0x44, 0xe3, 0x1e, 0xbf, 0x9a, 0xf4, 0x4e, - 0x6e, 0x10, 0x27, 0x5a, 0x3a, 0x00, 0xf3, 0xaf, 0x9a, 0xc2, 0x93, 0x70, - 0xa3, 0xc8, 0x88, 0xb4, 0x7e, 0x10, 0xe2, 0x1f, 0x06, 0x5e, 0xd4, 0xd4, - 0x2d, 0x35, 0xed, 0x2c, 0xa3, 0xc4, 0x35, 0xc2, 0x3d, 0x7d, 0x0b, 0x7f, - 0x66, 0xe8, 0x54, 0x14, 0x6f, 0x79, 0xde, 0x3a, 0x22, 0xba, 0xe8, 0x6f, - 0x45, 0xc6, 0xa5, 0xa2, 0x3e, 0x90, 0x57, 0xef, 0x8b, 0xf4, 0x5e, 0x5d, - 0xdb, 0x9a, 0x81, 0x4d, 0x31, 0xa5, 0xbf, 0x2a, 0x45, 0x8b, 0xb9, 0xe2, - 0xbe, 0x4e, 0xf3, 0x0a, 0x7e, 0x77, 0xa5, 0xab, 0xf0, 0x54, 0x46, 0x15, - 0xd9, 0xdc, 0xb3, 0x24, 0x24, 0x79, 0x5d, 0xca, 0x46, 0x25, 0xda, 0xed, - 0xe8, 0x98, 0x0d, 0xd0, 0xca, 0x86, 0xdb, 0xfd, 0x49, 0x94, 0x3d, 0x1e, - 0xcb, 0x6a, 0xc1, 0xf6, 0x7d, 0x0e, 0x52, 0x52, 0x2a, 0xcb, 0xc3, 0x9e, - 0x51, 0xd3, 0x18, 0x7c, 0x70, 0xd9, 0x26, 0x41, 0x5b, 0xb3, 0xa7, 0x94, - 0xe2, 0x32, 0x7f, 0x5c, 0xa9, 0x10, 0x27, 0xfe, 0xcd, 0x9b, 0x00, 0x9a, - 0xbe, 0x59, 0xd4, 0x7e, 0xa8, 0x5f, 0x11, 0x91, 0x76, 0x71, 0x3e, 0xed, - 0x40, 0xe8, 0xbb, 0xe0, 0xc7, 0x1d, 0xbb, 0xf9, 0x8f, 0x99, 0x8c, 0x38, - 0x39, 0x23, 0x75, 0x88, 0x57, 0xac, 0x9e, 0x55, 0x5f, 0x85, 0xdc, 0xb3, - 0xec, 0x51, 0x39, 0x71, 0xd5, 0xac, 0x74, 0xd9, 0xa8, 0x74, 0x04, 0xee, - 0x7d, 0x5b, 0x81, 0xa4, 0xdd, 0x8b, 0x8b, 0xb4, 0xd3, 0x55, 0xfa, 0x51, - 0xb1, 0x29, 0xff, 0x8d, 0x43, 0xc3, 0xd7, 0x89, 0x88, 0xdf, 0x85, 0x5f, - 0x17, 0x84, 0x4c, 0xa3, 0x0a, 0xa5, 0x34, 0x6f, 0x15, 0x2e, 0xc7, 0xb0, - 0x95, 0x96, 0xec, 0x81, 0x9c, 0xbe, 0xe8, 0x00, 0x57, 0x4b, 0xbe, 0x10, - 0x12, 0x01, 0x98, 0x37, 0x92, 0x34, 0x64, 0x9d, 0x9b, 0x79, 0xfa, 0x3e, - 0x75, 0xbe, 0xfd, 0x95, 0x01, 0x19, 0xa7, 0x6c, 0xfd, 0x03, 0xea, 0xb5, - 0x4b, 0x05, 0xb9, 0x9e, 0xbb, 0x06, 0x12, 0x09, 0xf0, 0xb0, 0xc5, 0xb1, - 0x2b, 0x33, 0x3e, 0xc8, 0xbc, 0x9a, 0xf4, 0x26, 0x63, 0xf2, 0x4d, 0x78, - 0xf4, 0xbc, 0x43, 0xb8, 0x3c, 0x18, 0xd7, 0x92, 0x93, 0x93, 0x01, 0x2c, - 0xc7, 0xb2, 0xd9, 0x6f, 0x0c, 0xe1, 0x2d, 0x90, 0xe5, 0x62, 0x80, 0xb6, - 0x46, 0x60, 0xd9, 0x4b, 0x5f, 0xbc, 0x41, 0x42, 0x73, 0x9c, 0xbb, 0x79, - 0x00, 0x25, 0x8a, 0x0e, 0xd1, 0x51, 0x06, 0x61, 0x7f, 0x93, 0x89, 0xe6, - 0x54, 0xf8, 0xcf, 0x1f, 0xd6, 0x1f, 0xf0, 0xdf, 0x9c, 0xea, 0xa2, 0x16, - 0x1b, 0x10, 0xcd, 0xff, 0xef, 0x5a, 0x07, 0x36, 0x6e, 0xcb, 0xf7, 0x8b, - 0x28, 0xbe, 0x25, 0x6b, 0xa2, 0xa3, 0x08, 0x86, 0x65, 0xc7, 0x8a, 0xbb, - 0x39, 0xb3, 0x9b, 0xd7, 0x10, 0x3d, 0xde, 0xb0, 0x8f, 0x36, 0xc0, 0x05, - 0x41, 0xbd, 0xf5, 0x0e, 0x64, 0x28, 0xa1, 0x48, 0xb5, 0x59, 0x26, 0xeb, - 0x19, 0x66, 0xa2, 0xc6, 0x2f, 0x65, 0xeb, 0xdf, 0x6c, 0x03, 0x01, 0x4c, - 0x22, 0x3a, 0xea, 0x39, 0x4c, 0x8d, 0x05, 0xcf, 0x1b, 0x39, 0x21, 0x0c, - 0x9c, 0xc4, 0xd1, 0xf5, 0xee, 0xd4, 0x36, 0x86, 0x48, 0x60, 0xcc, 0xd4, - 0x29, 0x5b, 0x8d, 0x80, 0x8f, 0x4f, 0x6b, 0xe8, 0x7a, 0xe5, 0xdb, 0x57, - 0xc9, 0x7a, 0x60, 0xaa, 0x8e, 0x62, 0x7b, 0x52, 0x98, 0xb3, 0x76, 0xaa, - 0x5e, 0xdf, 0x0c, 0x1d, 0x80, 0x53, 0xbe, 0x99, 0x7d, 0xf5, 0xd0, 0x64, - 0xeb, 0x62, 0xcb, 0x79, 0x08, 0x14, 0x4b, 0x3e, 0xb0, 0x4c, 0x05, 0xbc, - 0x64, 0xff, 0x79, 0x4e, 0xcf, 0xa3, 0xe8, 0x0c, 0x6a, 0x32, 0xb8, 0x1d, - 0x6a, 0x1c, 0x27, 0xa3, 0xe4, 0x21, 0x39, 0xc8, 0x05, 0xee, 0x6d, 0xa3, - 0x93, 0xdd, 0xae, 0x68, 0xd2, 0x8c, 0x4b, 0x62, 0x3c, 0x57, 0xac, 0xd6, - 0x24, 0xe7, 0x09, 0x3c, 0x9a, 0x95, 0xf9, 0xcb, 0x77, 0xde, 0xc1, 0xb0, - 0x97, 0x5b, 0xeb, 0xa9, 0x10, 0xd2, 0xd5, 0xc3, 0xd8, 0x43, 0xf6, 0x01, - 0xeb, 0xfd, 0x6e, 0x84, 0xd6, 0x5f, 0xe5, 0x79, 0x3c, 0x5b, 0xd8, 0x5c, - 0x3d, 0x54, 0x7b, 0xa4, 0xba, 0x0f, 0xd5, 0x1d, 0x4d, 0xbe, 0xb0, 0x89, - 0x05, 0x24, 0xb7, 0x88, 0x8a, 0x01, 0x86, 0x20, 0xea, 0xd1, 0xd0, 0x64, - 0xb2, 0x0c, 0x16, 0x51, 0x34, 0x54, 0x72, 0x68, 0x8e, 0xcb, 0xab, 0x9f, - 0x8c, 0x27, 0x00, 0xe1, 0xb4, 0x0e, 0x59, 0x16, 0x6b, 0xfe, 0xeb, 0x16, - 0x65, 0x7c, 0x5e, 0xc7, 0x0e, 0x18, 0xc0, 0xda, 0xc0, 0x99, 0x9f, 0x61, - 0x5e, 0x9d, 0x80, 0xba, 0x2a, 0x67, 0x3a, 0x91, 0xcd, 0x9f, 0xa9, 0x1d, - 0xb3, 0x3a, 0x79, 0x51, 0x03, 0x94, 0xad, 0xdd, 0x72, 0x13, 0x3c, 0x93, - 0x2d, 0xae, 0xa4, 0x58, 0x7c, 0x37, 0x81, 0x21, 0xd8, 0x59, 0x5e, 0x98, - 0xdd, 0x70, 0x0e, 0x36, 0xb4, 0x3d, 0x43, 0xeb, 0xb1, 0x47, 0x1d, 0xf1, - 0xec, 0xa9, 0xfe, 0xd7, 0xe0, 0xed, 0x3a, 0x5f, 0x1e, 0xeb, 0x88, 0x2d, - 0x55, 0xe8, 0xeb, 0xf3, 0x5f, 0xb6, 0xa7, 0xf7, 0xa0, 0xd0, 0x10, 0xee, - 0x58, 0x63, 0xc7, 0x58, 0x1e, 0xa0, 0x9a, 0xf4, 0x29, 0x29, 0x3b, 0x59, - 0x24, 0xdc, 0xf7, 0x52, 0x7a, 0x96, 0x50, 0x1b, 0x1f, 0xa2, 0xdc, 0xbe, - 0xbe, 0xc9, 0x34, 0x23, 0xa8, 0x85, 0xd5, 0x23, 0x53, 0x9d, 0xbf, 0x5a, - 0xb0, 0x9a, 0xb6, 0x1a, 0xa5, 0x69, 0xc3, 0x5f, 0x8d, 0x90, 0xf0, 0xc1, - 0x7c, 0x14, 0x16, 0xb0, 0x3c, 0xe4, 0x36, 0x68, 0x47, 0xed, 0x32, 0xa3, - 0xb4, 0x49, 0x79, 0xcd, 0x71, 0x4c, 0xce, 0xb6, 0x72, 0x67, 0xab, 0x03, - 0x5e, 0xa3, 0x39, 0x85, 0x2a, 0xbb, 0x43, 0xeb, 0x75, 0x08, 0x7c, 0x0a, - 0xb5, 0xd2, 0xbe, 0x16, 0xb5, 0x06, 0x76, 0x09, 0x97, 0x4b, 0x3a, 0x00, - 0xa4, 0xd9, 0xb9, 0x19, 0xc6, 0xf6, 0x16, 0x3b, 0x14, 0x0c, 0x0f, 0x7a, - 0xd3, 0x8d, 0x76, 0xbe, 0xfd, 0xdf, 0x71, 0x5b, 0x1c, 0xd5, 0x9b, 0xac, - 0xb5, 0xd0, 0xe3, 0xa3, 0x50, 0xb5, 0xa1, 0xce, 0xc4, 0x61, 0xbd, 0xb3, - 0x15, 0xbb, 0xbe, 0x25, 0x55, 0xa4, 0x86, 0xb9, 0x0c, 0x20, 0x32, 0x9d, - 0x55, 0x78, 0x55, 0xc5, 0x6b, 0x23, 0x7c, 0xfb, 0x3d, 0x24, 0x4f, 0x2b, - 0xb8, 0x80, 0xc2, 0xc8, 0xa2, 0x83, 0x6d, 0x21, 0xa3, 0xd6, 0xd9, 0x50, - 0x24, 0x35, 0x84, 0xef, 0x44, 0xa9, 0x3a, 0x00, 0xc3, 0x5a, 0xfa, 0x53, - 0xaa, 0x37, 0x1d, 0xfc, 0xf3, 0x03, 0x61, 0x4c, 0x5c, 0xf1, 0xb7, 0x38, - 0x68, 0xb2, 0x15, 0x9d, 0x8c, 0x89, 0xdd, 0x66, 0x31, 0xf3, 0x04, 0x29, - 0x04, 0xd1, 0x70, 0x8c, 0x07, 0x3f, 0xd7, 0xee, 0xd5, 0x3f, 0xec, 0xe7, - 0xfe, 0xb0, 0x9b, 0x5c, 0x30, 0x21, 0x37, 0xdc, 0x88, 0xd8, 0x8b, 0x1e, - 0xb7, 0xcd, 0xad, 0x16, 0xeb, 0xef, 0x91, 0x21, 0xb6, 0xe7, 0xcd, 0x20, - 0x38, 0x33, 0xe5, 0xa8, 0x8f, 0xf2, 0xa1, 0x90, 0x99, 0x2d, 0xf6, 0x34, - 0x27, 0x0a, 0x04, 0x9b, 0xab, 0x45, 0x6e, 0xd3, 0xfb, 0x62, 0xab, 0x6b, - 0x2a, 0xc7, 0x55, 0x26, 0xd6, 0x7f, 0xca, 0xb3, 0x97, 0x70, 0xa1, 0x5f, - 0xc2, 0x03, 0x84, 0x9b, 0x3e, 0x4c, 0x2c, 0x91, 0x85, 0x20, 0x8b, 0xc8, - 0x9b, 0x07, 0xe2, 0x27, 0x9b, 0x6a, 0x39, 0x61, 0x64, 0xbc, 0x07, 0x95, - 0x1f, 0x7d, 0x99, 0xf7, 0x17, 0x2e, 0x55, 0xb2, 0x0d, 0x17, 0x02, 0xfb, - 0x88, 0xb8, 0x78, 0x4f, 0x21, 0x7b, 0x70, 0x87, 0x5b, 0xba, 0x10, 0x3b, - 0x6b, 0x25, 0x61, 0xa4, 0x9d, 0xbe, 0x2e, 0xdb, 0xcb, 0xbe, 0xf7, 0x3a, - 0xfa, 0x5d, 0x6d, 0xdb, 0xb2, 0x6b, 0x3f, 0x20, 0x1b, 0xb0, 0x69, 0xe8, - 0x40, 0x31, 0xc1, 0xa1, 0x2e, 0x65, 0x8a, 0x49, 0x74, 0xa6, 0xf7, 0xbb, - 0xb0, 0x3d, 0xb2, 0x2c, 0x71, 0xa2, 0x9c, 0x40, 0xc2, 0x8b, 0xab, 0x83, - 0xa8, 0x79, 0x83, 0xbf, 0x0c, 0xfa, 0x26, 0xed, 0x18, 0x4e, 0x47, 0xcc, - 0x00, 0x23, 0x15, 0x8a, 0x22, 0xcf, 0x46, 0x52, 0x65, 0x1b, 0xd0, 0x8b, - 0x97, 0x07, 0xaa, 0x10, 0x50, 0x85, 0x1a, 0xfa, 0x94, 0xec, 0xd1, 0x60, - 0xa9, 0xb1, 0x06, 0xa0, 0x6a, 0xed, 0xdf, 0x71, 0x5b, 0xb2, 0x15, 0x21, - 0x69, 0x6f, 0x0c, 0xea, 0xc9, 0x67, 0xd9, 0x56, 0xc5, 0x62, 0xc3, 0xee, - 0xd1, 0x5d, 0x90, 0xfb, 0x0f, 0x1c, 0xd2, 0xe4, 0x49, 0xf9, 0x45, 0x2c, - 0xfb, 0x59, 0x1a, 0x73, 0xfc, 0x4b, 0x6d, 0x3b, 0x24, 0xd8, 0x59, 0x53, - 0x29, 0xb8, 0x78, 0xe2, 0xfc, 0x79, 0x5e, 0x15, 0x91, 0x9c, 0x4a, 0x98, - 0x62, 0xb5, 0x33, 0x71, 0x0d, 0x72, 0xf8, 0xf6, 0x26, 0xc1, 0xc8, 0x0a, - 0xb0, 0xa3, 0x66, 0x65, 0x68, 0xc4, 0xbf, 0x81, 0x48, 0x82, 0x53, 0x23, - 0x8e, 0xbd, 0x81, 0x9c, 0x1c, 0xd6, 0xfd, 0x1a, 0xf8, 0x43, 0x6b, 0xc2, - 0x5d, 0xbf, 0x73, 0xe5, 0xd3, 0x95, 0x1e, 0xe3, 0x28, 0x62, 0xd3, 0x34, - 0x5e, 0xb4, 0xfc, 0xcf, 0xb3, 0x3d, 0xe3, 0xa9, 0x42, 0xe9, 0x4d, 0x9f, - 0xf9, 0xa1, 0x36, 0x41, 0x80, 0x8d, 0xc6, 0xeb, 0x77, 0xda, 0x58, 0x3c, - 0x2f, 0x56, 0xe5, 0x07, 0x46, 0xda, 0x7a, 0x04, 0xd6, 0x27, 0x13, 0xc0, - 0xad, 0xfc, 0x03, 0xe2, 0x42, 0xd0, 0x83, 0x73, 0x49, 0xe5, 0x0f, 0x61, - 0x19, 0xe9, 0xba, 0x07, 0xb4, 0x54, 0x10, 0xc8, 0x45, 0xfb, 0x03, 0x73, - 0x5d, 0x3d, 0xab, 0x6b, 0x30, 0x1c, 0x72, 0x97, 0x56, 0xbb, 0x79, 0x93, - 0xb4, 0x8f, 0x1d, 0x9e, 0x78, 0xa3, 0x85, 0x51, 0x81, 0xec, 0x15, 0xd9, - 0x0d, 0xc8, 0x25, 0x83, 0x08, 0x35, 0xef, 0xdc, 0xb4, 0x6d, 0xe7, 0x22, - 0x11, 0xe7, 0x48, 0x2a, 0x43, 0xd3, 0xb1, 0x1b, 0xda, 0x83, 0x41, 0xb3, - 0xc2, 0x27, 0xa0, 0x63, 0xb1, 0x71, 0x33, 0x95, 0x76, 0xd9, 0x71, 0xcf, - 0x16, 0x7f, 0x8e, 0x51, 0xcd, 0x6a, 0xd3, 0x3e, 0x51, 0xe9, 0xea, 0x53, - 0x4d, 0x4d, 0x34, 0xc6, 0x82, 0x38, 0xcc, 0x5c, 0x09, 0x08, 0x46, 0x18, - 0x57, 0xf6, 0xa8, 0x66, 0x84, 0x95, 0x94, 0xd3, 0x20, 0xb3, 0x74, 0xf8, - 0x63, 0x89, 0x39, 0xf1, 0xfb, 0x59, 0x17, 0x67, 0x4c, 0x8f, 0x6a, 0x59, - 0x71, 0x4a, 0xa0, 0x55, 0xe4, 0x16, 0xab, 0x60, 0x77, 0x82, 0x16, 0x14, - 0xc4, 0xed, 0x81, 0x0b, 0xcb, 0x7c, 0xd8, 0x06, 0x9f, 0x78, 0xc9, 0x0f, - 0xee, 0xe8, 0xf0, 0x18, 0x44, 0x0f, 0x7e, 0x00, 0x54, 0x5f, 0x18, 0xa3, - 0x25, 0x3c, 0x0a, 0x87, 0x9a, 0xf7, 0x6f, 0xa0, 0x17, 0x03, 0xcd, 0xe0, - 0xc2, 0x9e, 0xea, 0x03, 0x65, 0x85, 0x45, 0x16, 0x94, 0x5d, 0x69, 0x0b, - 0x05, 0xc7, 0x98, 0xe9, 0x16, 0x5b, 0x74, 0x66, 0x0f, 0x61, 0x9b, 0xcd, - 0x60, 0xd4, 0x21, 0x10, 0xcf, 0x90, 0xc6, 0x76, 0x54, 0xef, 0xa3, 0xe2, - 0xc1, 0x9c, 0xbe, 0x7d, 0x90, 0x3c, 0x49, 0x92, 0x8e, 0xb6, 0xa0, 0x57, - 0xcb, 0xf6, 0x41, 0x04, 0xa5, 0x25, 0x81, 0xef, 0x63, 0xb6, 0x1c, 0x4a, - 0x43, 0xf7, 0x3b, 0x4c, 0x9f, 0xd2, 0x4a, 0x98, 0xd8, 0xf2, 0x57, 0x9b, - 0x51, 0x23, 0x71, 0x7c, 0x39, 0xfd, 0x5a, 0xdd, 0xb2, 0x41, 0x9f, 0x3e, - 0x0c, 0xcf, 0x56, 0x10, 0x54, 0x87, 0x7a, 0x44, 0x82, 0xf5, 0xba, 0x8b, - 0xd4, 0x71, 0x5e, 0x9e, 0xaf, 0xd0, 0x69, 0xba, 0x57, 0x70, 0xb7, 0xd8, - 0x90, 0xdc, 0x34, 0xcd, 0x18, 0xa6, 0x4c, 0x18, 0x85, 0x94, 0xdb, 0xee, - 0x49, 0xcb, 0x25, 0x88, 0xb2, 0x7d, 0x1f, 0x3e, 0x25, 0x16, 0x85, 0x4b, - 0x7f, 0xe0, 0x4b, 0x1b, 0xab, 0x2f, 0x4e, 0xaf, 0xf4, 0xa8, 0xc9, 0x99, - 0xe9, 0xda, 0x8b, 0x63, 0x8e, 0x60, 0x6d, 0x9e, 0xc3, 0x4b, 0xfd, 0x74, - 0x99, 0x23, 0xf9, 0x27, 0xea, 0xcf, 0xe7, 0xca, 0xb7, 0xb1, 0x3c, 0xe8, - 0x6b, 0x10, 0x08, 0x11, 0xc0, 0x26, 0x03, 0x06, 0x66, 0x44, 0xed, 0xeb, - 0x5b, 0xb3, 0xb4, 0x2b, 0xf2, 0xc3, 0x96, 0x3e, 0x57, 0x5f, 0xa1, 0xd2, - 0x3f, 0x7e, 0xb9, 0x1d, 0x5a, 0x1e, 0xa7, 0xc0, 0x16, 0x9f, 0xe2, 0x87, - 0x84, 0x98, 0x79, 0xea, 0xc5, 0x8f, 0xb7, 0x1f, 0xcf, 0xa8, 0x43, 0x94, - 0x67, 0x2d, 0xfb, 0x39, 0xe5, 0x03, 0x83, 0xbb, 0x52, 0xb3, 0x72, 0x6e, - 0x6a, 0xee, 0x06, 0xf7, 0x38, 0xdf, 0xc3, 0x5f, 0xee, 0x22, 0x40, 0x75, - 0x3c, 0x56, 0x40, 0x28, 0x54, 0x06, 0x56, 0xe8, 0x1a, 0x9d, 0x08, 0xea, - 0x53, 0x52, 0x12, 0x92, 0xdc, 0x85, 0xf7, 0x24, 0xae, 0xaa, 0x0a, 0xad, - 0x68, 0x95, 0x24, 0x59, 0x5b, 0x5a, 0x03, 0x5f, 0x7c, 0xa0, 0x15, 0x91, - 0x4c, 0xbb, 0xec, 0x30, 0x4e, 0xe1, 0xde, 0x88, 0xa8, 0x17, 0x2f, 0x2d, - 0xb5, 0xe9, 0x03, 0x20, 0x7f, 0xc7, 0xa7, 0x2e, 0xf2, 0xe2, 0xba, 0x5b, - 0x23, 0x15, 0x3b, 0x80, 0xaa, 0xcc, 0xca, 0x9d, 0xfc, 0x1a, 0xc9, 0x82, - 0x3e, 0xff, 0xdb, 0x0f, 0x2c, 0x83, 0x88, 0x07, 0x4c, 0xeb, 0x6e, 0x6c, - 0x93, 0x6f, 0xfc, 0x13, 0xe8, 0x13, 0x75, 0x21, 0x44, 0x5e, 0xb7, 0x76, - 0x83, 0xa1, 0x9c, 0x36, 0x9a, 0xdf, 0xdc, 0x78, 0x24, 0x4c, 0xf0, 0xdf, - 0x71, 0x1b, 0x41, 0x95, 0xa1, 0xda, 0x97, 0x04, 0xc1, 0x25, 0x59, 0x11, - 0x4b, 0xbc, 0xa5, 0xbb, 0x1b, 0x9b, 0x30, 0x4f, 0xd7, 0x26, 0x86, 0x34, - 0xc0, 0xf7, 0x91, 0x98, 0x00, 0xc4, 0x5e, 0x1c, 0x92, 0x38, 0x9d, 0xdd, - 0xc4, 0x7d, 0x01, 0xd9, 0xfc, 0x14, 0xf8, 0x6d, 0x84, 0xcc, 0xd5, 0x08, - 0xec, 0xff, 0xbd, 0x33, 0x63, 0x1b, 0x24, 0x4b, 0xd7, 0xff, 0x82, 0x41, - 0x36, 0x8b, 0x4c, 0xee, 0x73, 0x21, 0x4a, 0x36, 0x9d, 0x59, 0xb6, 0xb7, - 0x60, 0x2b, 0x5a, 0x38, 0x8a, 0x77, 0x2d, 0x63, 0xcf, 0x39, 0x4e, 0xa8, - 0x82, 0x7e, 0x82, 0x3a, 0xb1, 0x90, 0x36, 0x0d, 0xa9, 0xa6, 0x8f, 0x99, - 0xab, 0x8d, 0x4e, 0x01, 0x74, 0x9f, 0x1e, 0xc8, 0x5c, 0x58, 0x9c, 0xca, - 0x0a, 0x19, 0xe2, 0x96, 0x2c, 0xa0, 0x58, 0x30, 0x63, 0x8f, 0xa3, 0x7c, - 0xaa, 0xca, 0xc3, 0x67, 0xea, 0x96, 0x68, 0x2c, 0x59, 0x60, 0x90, 0x4d, - 0xee, 0xa8, 0xd3, 0x0f, 0x45, 0xe2, 0xcd, 0x3b, 0xf3, 0x62, 0xff, 0x15, - 0xba, 0x85, 0xb5, 0x0e, 0x78, 0x9f, 0x18, 0xa4, 0xaf, 0x69, 0x34, 0x46, - 0x11, 0x4e, 0x32, 0x06, 0xda, 0x2f, 0x21, 0x46, 0x0a, 0xf2, 0x67, 0xc1, - 0xeb, 0x45, 0x3f, 0x60, 0xa8, 0x77, 0x9a, 0x04, 0xac, 0xa4, 0x1c, 0xba, - 0x3f, 0xa2, 0xf0, 0x04, 0x1e, 0xb1, 0xef, 0x23, 0xab, 0xa1, 0x01, 0x71, - 0xc4, 0x1f, 0x2a, 0xbc, 0x43, 0x18, 0x0c, 0xb9, 0xc3, 0xba, 0xcd, 0x08, - 0xa8, 0xaa, 0x9e, 0x85, 0x92, 0xaf, 0x60, 0x7e, 0x3b, 0xe1, 0xf4, 0x7f, - 0x2f, 0x33, 0x2f, 0xd4, 0xf3, 0xb6, 0x96, 0x2c, 0x25, 0x60, 0x84, 0x75, - 0x55, 0x49, 0x98, 0x72, 0x94, 0x03, 0xe8, 0xac, 0x59, 0xf8, 0x68, 0x93, - 0x2e, 0xe1, 0xa3, 0xe9, 0x21, 0x31, 0x95, 0x84, 0xb2, 0xad, 0x2c, 0x82, - 0xcd, 0x22, 0x64, 0x8b, 0x0d, 0x05, 0xc4, 0xe0, 0x45, 0x82, 0x90, 0x2a, - 0xc3, 0x83, 0xf1, 0x72, 0x0a, 0x60, 0x0c, 0x67, 0x79, 0x83, 0xe1, 0x69, - 0xfc, 0xf3, 0x9b, 0xdc, 0x96, 0x5d, 0x60, 0x45, 0xf2, 0x29, 0x6c, 0x33, - 0xc1, 0xbe, 0xbf, 0xe0, 0x1b, 0x17, 0x60, 0x06, 0x74, 0x7a, 0xf3, 0x84, - 0x58, 0x01, 0x70, 0x39, 0x75, 0xc0, 0x19, 0xbb, 0x21, 0xe6, 0xfe, 0xd3, - 0x27, 0xd4, 0xa9, 0x39, 0xbf, 0x94, 0x50, 0xe5, 0xd1, 0xe4, 0xb4, 0x42, - 0xc2, 0x19, 0xdf, 0x9d, 0xad, 0x12, 0x75, 0x17, 0x6e, 0x54, 0xdc, 0xef, - 0xc7, 0x11, 0x4d, 0x9c, 0xab, 0x7a, 0xe1, 0x7a, 0x5b, 0xe8, 0x41, 0x48, - 0x1a, 0x92, 0x00, 0x38, 0xbb, 0x8b, 0x0b, 0xaf, 0xbb, 0x51, 0x3e, 0x56, - 0x7f, 0x1d, 0x5a, 0x30, 0x85, 0xbd, 0xf4, 0x1f, 0x1a, 0x29, 0x24, 0x3f, - 0x1e, 0xcc, 0x0a, 0x76, 0x07, 0x87, 0x2e, 0xab, 0x0a, 0xce, 0x6e, 0x2b, - 0x9a, 0x40, 0x51, 0xc3, 0x29, 0x26, 0x6e, 0x67, 0x3e, 0xe7, 0xab, 0x5f, - 0x5e, 0xb7, 0x82, 0x39, 0x52, 0xcc, 0x55, 0x3c, 0x07, 0xf7, 0x3d, 0xe2, - 0xac, 0x1f, 0x4b, 0xeb, 0x47, 0xfe, 0x45, 0xcf, 0x89, 0xc3, 0x63, 0x3c, - 0xb2, 0xb5, 0x9a, 0x27, 0x2d, 0x44, 0xf3, 0xb0, 0xbd, 0xa4, 0x01, 0x26, - 0x91, 0xba, 0xfa, 0x3e, 0xea, 0x19, 0x5f, 0xd3, 0x35, 0xa4, 0x3d, 0x2b, - 0x2f, 0x90, 0xb5, 0x7d, 0x68, 0x0a, 0xbd, 0xae, 0x22, 0x7e, 0x87, 0x0f, - 0x90, 0x0d, 0x10, 0x43, 0x87, 0x39, 0x40, 0xa2, 0x31, 0x51, 0xad, 0xd7, - 0xe8, 0x41, 0xe1, 0x9c, 0xde, 0x8b, 0x5a, 0x45, 0x20, 0x0e, 0x28, 0xda, - 0x9b, 0xeb, 0x4f, 0xc4, 0x94, 0xba, 0x51, 0xe9, 0xbe, 0x1c, 0xb6, 0x4f, - 0x78, 0xd1, 0x60, 0xd3, 0x52, 0x61, 0x66, 0x73, 0x0c, 0x84, 0x71, 0x07, - 0x78, 0x9f, 0xcf, 0x88, 0x93, 0x4c, 0x1d, 0x75, 0xe8, 0x9a, 0x26, 0x27, - 0xc1, 0xb4, 0x3d, 0xf5, 0x3d, 0x38, 0x41, 0x09, 0x59, 0xdf, 0xc4, 0x98, - 0x53, 0x3f, 0xc0, 0x99, 0xc1, 0x04, 0x3f, 0x67, 0xdf, 0xc6, 0xb7, 0x4a, - 0x10, 0x12, 0xf5, 0xe1, 0x45, 0x1a, 0xe8, 0xa2, 0xce, 0xec, 0x3f, 0x50, - 0x8b, 0x6c, 0x73, 0x8e, 0xac, 0xe0, 0x7f, 0x88, 0x38, 0x6f, 0x94, 0x5e, - 0xce, 0x9e, 0x78, 0x06, 0xfc, 0x6b, 0xd3, 0xca, 0x29, 0x08, 0x29, 0x1c, - 0xc7, 0x71, 0xee, 0xcd, 0x66, 0x21, 0x06, 0x55, 0x11, 0x61, 0x4c, 0xc0, - 0x8f, 0xc7, 0xc4, 0x20, 0x2b, 0x12, 0x41, 0xd4, 0x35, 0x39, 0xd0, 0x37, - 0x2c, 0x3d, 0xa5, 0x98, 0x27, 0x5b, 0x48, 0xc9, 0x15, 0x2d, 0x39, 0x28, - 0x2b, 0x2c, 0xd0, 0xc5, 0x63, 0x46, 0xab, 0xaa, 0x85, 0x72, 0xfc, 0x33, - 0xb0, 0xb8, 0xa3, 0x01, 0x49, 0x3c, 0x3f, 0x54, 0x98, 0xa7, 0x69, 0x20, - 0x4a, 0x22, 0xfd, 0x0f, 0xbb, 0x65, 0xdc, 0x16, 0xd2, 0xf3, 0x66, 0x81, - 0x4b, 0xaf, 0x35, 0x3f, 0xc5, 0x1a, 0xdc, 0x0e, 0xc6, 0x85, 0x48, 0x42, - 0xe8, 0x19, 0xff, 0x48, 0x7b, 0xde, 0xaa, 0xf3, 0x74, 0x7c, 0x4d, 0x6c, - 0x74, 0xaa, 0xae, 0xf9, 0x81, 0x39, 0x10, 0x80, 0xf3, 0xe5, 0x04, 0xca, - 0xd5, 0xcd, 0x30, 0xf3, 0xe5, 0x2a, 0xb1, 0xb6, 0x79, 0x6f, 0xa3, 0xb6, - 0x25, 0xfb, 0xa2, 0xd2, 0xe6, 0x0b, 0x23, 0x06, 0x86, 0x00, 0xcb, 0xae, - 0x82, 0x9a, 0xcb, 0xa3, 0xbd, 0x79, 0x09, 0x91, 0x01, 0x37, 0xbe, 0xc7, - 0x8c, 0x6d, 0x14, 0xef, 0x95, 0x55, 0xf9, 0x95, 0x95, 0x2a, 0x9c, 0xe8, - 0x19, 0x88, 0xba, 0xae, 0x87, 0x21, 0x3d, 0x61, 0xc5, 0x22, 0xbb, 0x1d, - 0x8c, 0xcf, 0x65, 0x19, 0xd8, 0x82, 0x29, 0x94, 0xcb, 0x63, 0x3f, 0x13, - 0xcd, 0x13, 0x74, 0x70, 0x10, 0x26, 0x28, 0xb7, 0x79, 0x23, 0x86, 0x67, - 0x99, 0x90, 0x71, 0xf2, 0x8a, 0xe2, 0x5a, 0x7a, 0x83, 0x23, 0xd5, 0x37, - 0xb2, 0x92, 0xed, 0x88, 0xe6, 0xbb, 0x0f, 0xb4, 0x45, 0x85, 0x81, 0xd1, - 0xa7, 0x0d, 0x1c, 0x60, 0xfd, 0x4c, 0x2a, 0xb7, 0x37, 0x83, 0xc3, 0xec, - 0xd6, 0xee, 0x4a, 0x1a, 0x25, 0x7a, 0x10, 0x35, 0x74, 0x3b, 0x6b, 0xed, - 0x66, 0x4e, 0x17, 0xfe, 0x5c, 0x82, 0xc7, 0x47, 0x2e, 0xbe, 0x2e, 0xfc, - 0x7c, 0x76, 0x3e, 0x8c, 0x99, 0x53, 0xe5, 0x51, 0x7a, 0x99, 0x0f, 0x30, - 0xa4, 0x84, 0xdd, 0x5d, 0x30, 0x98, 0x48, 0x7c, 0x30, 0x45, 0x0b, 0x90, - 0x37, 0xbb, 0x2b, 0x0c, 0xbf, 0xba, 0x66, 0x4b, 0x76, 0x8f, 0x6f, 0x8d, - 0x7b, 0x3d, 0xb7, 0x4a, 0x81, 0xd7, 0x3c, 0x87, 0x8b, 0x23, 0xe8, 0x2e, - 0xd7, 0x0b, 0x0a, 0x2c, 0x56, 0xcb, 0x18, 0xa4, 0xcd, 0x19, 0xb4, 0x01, - 0xa5, 0x72, 0xe3, 0xa6, 0xe3, 0xe1, 0x72, 0x0c, 0x54, 0x60, 0x52, 0x87, - 0x95, 0xc1, 0x57, 0xa1, 0x47, 0x96, 0xb2, 0xda, 0x26, 0x48, 0xd7, 0xeb, - 0x77, 0xbd, 0x0e, 0x86, 0x70, 0xee, 0xa5, 0x0e, 0x83, 0xfb, 0xaa, 0x83, - 0xac, 0x2e, 0xe6, 0x9b, 0x32, 0x97, 0x3b, 0xac, 0xd2, 0x7f, 0x97, 0xfd, - 0xca, 0xf9, 0x7c, 0x4e, 0x89, 0xf5, 0x66, 0x54, 0x64, 0xf9, 0x8c, 0xf8, - 0xd7, 0x14, 0x23, 0xe3, 0xe5, 0x7a, 0x20, 0x26, 0x74, 0x9d, 0x55, 0xf5, - 0x41, 0xbc, 0xeb, 0xb6, 0x0d, 0x0e, 0xe5, 0xde, 0xfc, 0xb8, 0xe9, 0x32, - 0x8c, 0x78, 0x33, 0x10, 0xf8, 0x8a, 0x1d, 0xc0, 0x98, 0xd6, 0x90, 0x86, - 0xd7, 0x47, 0x10, 0x14, 0xbf, 0x57, 0x31, 0xcd, 0x02, 0x1b, 0xa9, 0xee, - 0x79, 0x68, 0x8e, 0x41, 0x95, 0x6f, 0x7c, 0x75, 0xfa, 0x31, 0x93, 0x8d, - 0x2c, 0x10, 0x92, 0x5b, 0x08, 0xf5, 0xc7, 0x19, 0x34, 0x3b, 0x30, 0x25, - 0xa1, 0x76, 0x55, 0x6e, 0x91, 0xeb, 0x61, 0xb2, 0xfd, 0x02, 0x01, 0x85, - 0xe1, 0x54, 0xcf, 0xe8, 0x3b, 0x1b, 0xc6, 0x77, 0x6d, 0x8d, 0xf8, 0xb1, - 0xeb, 0xb8, 0xb9, 0x1c, 0x60, 0x78, 0x43, 0x88, 0x5c, 0xcf, 0x83, 0xb5, - 0x98, 0xf2, 0xdc, 0x06, 0x94, 0xa9, 0x16, 0xc1, 0xbe, 0x3d, 0xcb, 0xce, - 0x72, 0x6f, 0x5a, 0x48, 0x8f, 0x1d, 0x53, 0xad, 0x1d, 0x2d, 0xca, 0x0c, - 0x74, 0x8f, 0x69, 0x35, 0x66, 0xcc, 0xac, 0x1d, 0x69, 0x52, 0x5d, 0x06, - 0xc7, 0x66, 0x8a, 0xfb, 0xec, 0x2b, 0xba, 0x8a, 0x40, 0x7f, 0x2c, 0xeb, - 0x26, 0x70, 0xf7, 0xc6, 0xc3, 0x12, 0xab, 0xec, 0x5f, 0xc4, 0xf7, 0x9e, - 0x99, 0xda, 0x0f, 0x1e, 0x9d, 0xc3, 0xa8, 0x11, 0x48, 0xe6, 0x8c, 0x02, - 0xb2, 0x2d, 0xb2, 0x75, 0xe1, 0x19, 0x41, 0x55, 0xb8, 0xbf, 0x3b, 0xb6, - 0x7b, 0x44, 0xc0, 0x27, 0xec, 0xd8, 0xd5, 0x0a, 0x78, 0x1e, 0x5a, 0x5c, - 0xe0, 0x01, 0x18, 0x68, 0x6f, 0x7e, 0x35, 0xa0, 0x07, 0x8d, 0xa9, 0x35, - 0xdc, 0x93, 0x84, 0x8d, 0x98, 0x4b, 0x53, 0x53, 0x8b, 0xe3, 0x4c, 0x30, - 0x54, 0x17, 0x21, 0x88, 0xdb, 0x1b, 0x8e, 0x9f, 0xdd, 0x6c, 0x26, 0x81, - 0x11, 0x92, 0x0e, 0xde, 0xe0, 0x52, 0xe3, 0x00, 0xfe, 0x6b, 0x41, 0x67, - 0x74, 0x1a, 0x3a, 0x45, 0x76, 0x04, 0x0b, 0x65, 0xcb, 0xdb, 0xc0, 0x24, - 0xe6, 0x71, 0xf7, 0xef, 0xc3, 0xca, 0xfb, 0xdb, 0x33, 0x5b, 0xb1, 0x68, - 0xc7, 0x6c, 0xbd, 0xc0, 0xed, 0xd9, 0x20, 0xf3, 0x70, 0xfc, 0xf1, 0x88, - 0xf0, 0xe0, 0x53, 0xdc, 0x65, 0x8d, 0x8d, 0xa9, 0x95, 0xe7, 0x7d, 0x33, - 0xaa, 0xa8, 0x12, 0x13, 0x42, 0x12, 0xbe, 0x1c, 0x93, 0x41, 0x18, 0x43, - 0xbe, 0xb7, 0x35, 0xf0, 0xa8, 0xa4, 0x5e, 0xe8, 0xed, 0x87, 0x87, 0xa3, - 0xd3, 0xc0, 0x22, 0x60, 0x14, 0xdf, 0x39, 0xf0, 0x0f, 0xf7, 0x82, 0xce, - 0xaf, 0x02, 0x8d, 0x6c, 0x0d, 0x31, 0x54, 0x09, 0xe9, 0xde, 0x3a, 0x49, - 0x66, 0xd8, 0x58, 0xa5, 0xa9, 0x14, 0x5f, 0xea, 0xd9, 0x8f, 0xfa, 0x57, - 0x18, 0x50, 0xf6, 0xee, 0x18, 0x88, 0xe6, 0x02, 0x00, 0xe4, 0xff, 0xbb, - 0xf9, 0xf6, 0x06, 0x31, 0x03, 0xd6, 0x4e, 0x16, 0xb7, 0x77, 0x76, 0xa1, - 0x61, 0x1a, 0x8a, 0xc9, 0xfe, 0xe1, 0x67, 0x55, 0xb9, 0x19, 0x44, 0xa4, - 0xfe, 0x51, 0xd3, 0x9c, 0xd8, 0x06, 0x45, 0xa7, 0xe1, 0xfa, 0x7e, 0xed, - 0xbc, 0x67, 0xd8, 0x86, 0x4a, 0x77, 0x47, 0x09, 0x97, 0x7b, 0xcb, 0xd3, - 0x33, 0xe6, 0x8c, 0x26, 0x05, 0x36, 0x16, 0xdf, 0x05, 0x39, 0x09, 0x0e, - 0x0a, 0x79, 0xf2, 0xd3, 0xa4, 0x09, 0xc1, 0x59, 0xaf, 0xa0, 0xa5, 0x52, - 0x61, 0xb2, 0xea, 0x4d, 0xc0, 0xa2, 0x91, 0xfb, 0xf0, 0x44, 0x7e, 0x01, - 0xbd, 0x46, 0x86, 0xe8, 0xcf, 0x7c, 0xc8, 0x9e, 0x8a, 0x33, 0x2a, 0x37, - 0x39, 0xcd, 0x2d, 0x34, 0x30, 0x58, 0x91, 0xb5, 0xf2, 0x78, 0x77, 0x21, - 0x83, 0x22, 0xd0, 0x45, 0x77, 0xe0, 0xf2, 0x86, 0x5a, 0xba, 0x50, 0x42, - 0x45, 0x73, 0x13, 0xe8, 0x74, 0xf1, 0x41, 0xd5, 0x18, 0xd6, 0x3a, 0x6a, - 0x84, 0x22, 0x8f, 0xb8, 0x75, 0x9e, 0xf8, 0x59, 0xc4, 0x87, 0x8b, 0x53, - 0xb6, 0x60, 0x26, 0x33, 0x07, 0x5c, 0x60, 0x43, 0x53, 0x6e, 0x59, 0xdc, - 0xf3, 0xc8, 0x38, 0x7a, 0xae, 0xf6, 0x2d, 0xef, 0x7d, 0x9b, 0xb0, 0x94, - 0x5a, 0xbe, 0x15, 0x6f, 0xdd, 0xe0, 0x4c, 0xd7, 0x98, 0x52, 0xaf, 0xaa, - 0x79, 0x28, 0x96, 0xf7, 0x7e, 0x9f, 0x06, 0xd6, 0x1f, 0x22, 0x79, 0xac, - 0x5a, 0x30, 0x78, 0xf9, 0x36, 0xd7, 0x0d, 0x9f, 0x8f, 0x3a, 0xdb, 0xd2, - 0x8a, 0x40, 0x5d, 0x8b, 0x54, 0x5a, 0x63, 0x15, 0xf8, 0x4b, 0x1c, 0xfd, - 0x09, 0xcb, 0x99, 0x11, 0x15, 0x6c, 0xd3, 0xbb, 0xc5, 0xa8, 0x0e, 0xdb, - 0x67, 0x9d, 0xd8, 0x96, 0xa0, 0x91, 0xf9, 0xd8, 0xf1, 0x24, 0xad, 0xf9, - 0xf4, 0x4a, 0xb3, 0xc0, 0x12, 0x21, 0x1d, 0x1b, 0x81, 0x55, 0xba, 0x69, - 0x4e, 0x04, 0x6b, 0xee, 0x0b, 0x7e, 0xae, 0xb5, 0x93, 0xde, 0xc9, 0xb3, - 0xc3, 0xd9, 0xee, 0x35, 0x3d, 0xe8, 0x6b, 0xa0, 0xb0, 0x0f, 0x79, 0xa5, - 0x5d, 0x5f, 0x77, 0xf1, 0x88, 0x51, 0x55, 0x3c, 0xcc, 0xf7, 0x1e, 0xb3, - 0xd9, 0xe5, 0x77, 0xa2, 0xd9, 0xc5, 0xfb, 0x54, 0x71, 0xcc, 0x44, 0x3b, - 0x9a, 0xa3, 0xfa, 0x33, 0xf4, 0xbd, 0x19, 0x37, 0x35, 0x10, 0x99, 0x69, - 0xfd, 0x74, 0x7d, 0x31, 0xe4, 0x9b, 0xb1, 0xf5, 0x36, 0xa9, 0x8d, 0x69, - 0x76, 0x94, 0xff, 0x9d, 0x73, 0xae, 0x9c, 0x8a, 0x29, 0x44, 0x8d, 0x4e, - 0xd3, 0xb7, 0x7f, 0x5b, 0x19, 0xc8, 0x3b, 0x33, 0xb5, 0x37, 0xee, 0x5a, - 0xa1, 0x2a, 0x26, 0x15, 0x51, 0x94, 0x86, 0x52, 0x49, 0x6e, 0x7d, 0xbb, - 0x0b, 0x59, 0xcf, 0xaa, 0x68, 0x58, 0x7c, 0x18, 0x88, 0x09, 0x6c, 0x07, - 0x9a, 0x9a, 0xd4, 0x06, 0x0b, 0xa3, 0x50, 0x7c, 0x80, 0xd6, 0x1f, 0x0f, - 0x58, 0x6f, 0x7b, 0xbc, 0x9a, 0xef, 0x33, 0xfa, 0x43, 0xc3, 0x61, 0xba, - 0x63, 0x45, 0x5f, 0xcb, 0x37, 0xe5, 0x5c, 0x0e, 0x3d, 0x27, 0x84, 0x65, - 0xd1, 0xce, 0xe1, 0x84, 0xd2, 0xaa, 0xa7, 0x66, 0xa4, 0x22, 0x11, 0x3f, - 0x8e, 0x2f, 0x9a, 0xc1, 0x31, 0xca, 0x94, 0xa9, 0x4f, 0x87, 0x31, 0xb9, - 0xda, 0xb3, 0xdf, 0x2e, 0x8e, 0x58, 0xc4, 0xf3, 0xd9, 0xa1, 0x65, 0x66, - 0x22, 0x3d, 0x0a, 0x54, 0xf0, 0xae, 0xa4, 0xe1, 0x7e, 0x54, 0xe4, 0x7e, - 0xe5, 0x5b, 0x9a, 0x7c, 0x87, 0xa0, 0xfb, 0x1e, 0x5b, 0xc1, 0x26, 0x17, - 0xe3, 0x0d, 0xa8, 0x54, 0x21, 0x82, 0xa5, 0x3f, 0xcb, 0x23, 0xdd, 0xbb, - 0x85, 0xa1, 0x86, 0x51, 0xd4, 0x5b, 0xdc, 0xa4, 0x8a, 0xbe, 0x52, 0x98, - 0xe6, 0x6d, 0xd6, 0xb1, 0xb3, 0x71, 0x3c, 0xca, 0x9a, 0xef, 0xcd, 0xdc, - 0x6d, 0x14, 0xa3, 0xa9, 0xb5, 0xef, 0x91, 0x31, 0xe4, 0x17, 0x27, 0x2a, - 0x99, 0x89, 0x04, 0x5c, 0xec, 0x19, 0x50, 0xf9, 0xcc, 0x41, 0xe0, 0x35, - 0xd5, 0x93, 0x37, 0x83, 0x7b, 0xb8, 0x79, 0x2b, 0x74, 0xd1, 0x5c, 0x25, - 0xeb, 0xe3, 0xdb, 0xf3, 0xf4, 0xdc, 0x70, 0xc1, 0x8c, 0xd7, 0x87, 0xe3, - 0x16, 0xae, 0xc8, 0x3d, 0x15, 0x42, 0x38, 0x6a, 0x4b, 0x71, 0xff, 0xdb, - 0xd8, 0xa9, 0xe1, 0x90, 0xee, 0x30, 0x66, 0x76, 0x78, 0x92, 0x56, 0x62, - 0x41, 0x2e, 0x0b, 0x09, 0x24, 0xe1, 0x9c, 0x28, 0x12, 0x16, 0x8f, 0x08, - 0x87, 0x54, 0xfb, 0x37, 0x04, 0xad, 0xa6, 0x3f, 0xcd, 0xb6, 0xf5, 0xad, - 0x09, 0x3d, 0x32, 0x0d, 0x59, 0x1c, 0x01, 0x45, 0x08, 0xe6, 0xb3, 0x93, - 0xb9, 0xd1, 0x70, 0xbf, 0x86, 0x94, 0xe6, 0x3e, 0xb3, 0xb0, 0xf6, 0x49, - 0x71, 0x4b, 0x03, 0x90, 0x30, 0x00, 0xc0, 0xc5, 0x99, 0x87, 0xc0, 0x71, - 0x15, 0x7f, 0x16, 0xdd, 0xdd, 0xb2, 0x3b, 0x2d, 0xca, 0xb3, 0xfc, 0xbf, - 0x8b, 0xba, 0x47, 0x12, 0xb8, 0x68, 0xef, 0x3a, 0xcd, 0x21, 0xf9, 0xe0, - 0x58, 0x3e, 0x62, 0x5a, 0x03, 0xb2, 0xe0, 0x32, 0x83, 0x78, 0xd4, 0x3c, - 0x56, 0xd8, 0xc0, 0x3e, 0x8b, 0x2f, 0x81, 0xbd, 0xdc, 0xee, 0x12, 0xe3, - 0x52, 0xae, 0xdd, 0x40, 0x3f, 0xa5, 0xec, 0xd0, 0xd1, 0x98, 0x9f, 0xec, - 0x04, 0x90, 0xca, 0xa1, 0xb7, 0xde, 0xa0, 0x75, 0x87, 0x92, 0x60, 0x4a, - 0x0f, 0x9d, 0xd6, 0x78, 0x5a, 0x37, 0xb9, 0x28, 0x39, 0xef, 0x00, 0x07, - 0x7b, 0xd5, 0x85, 0x93, 0x65, 0xdb, 0xc9, 0x80, 0xb4, 0x33, 0x9b, 0x1c, - 0x3d, 0x17, 0x16, 0xa5, 0x89, 0xf1, 0x05, 0x9b, 0xe3, 0xa2, 0x57, 0x3b, - 0x0f, 0x4d, 0x84, 0x61, 0xdb, 0x11, 0xed, 0xef, 0xe6, 0x54, 0xd0, 0xb9, - 0xaa, 0x69, 0x57, 0x80, 0x05, 0x9a, 0x36, 0x89, 0x12, 0x66, 0x29, 0xdb, - 0x85, 0x2a, 0x57, 0x00, 0xb4, 0xdf, 0x42, 0xe1, 0x54, 0xcb, 0x63, 0xb1, - 0x40, 0xba, 0xd3, 0x20, 0x37, 0x8e, 0x68, 0x56, 0x34, 0x53, 0xa3, 0x25, - 0x31, 0xcb, 0x0e, 0x27, 0xfe, 0x47, 0x05, 0x60, 0xe4, 0xe3, 0x12, 0xb5, - 0x83, 0xc6, 0x1d, 0xd7, 0x80, 0x64, 0x50, 0x96, 0x9c, 0xe3, 0x9b, 0x66, - 0x55, 0xd4, 0x07, 0xf8, 0xaf, 0x4e, 0x2b, 0x01, 0x42, 0x49, 0x24, 0xe0, - 0xf5, 0xbc, 0x91, 0x88, 0xae, 0x8a, 0x14, 0x7d, 0x25, 0x3f, 0xb1, 0xe8, - 0x24, 0xc0, 0x16, 0xf7, 0x63, 0x6b, 0xd5, 0x4c, 0xcf, 0x29, 0xe4, 0xbf, - 0xf2, 0x6c, 0x6d, 0x54, 0xbb, 0x7a, 0xe9, 0x81, 0x57, 0x5f, 0xd1, 0x56, - 0xf1, 0x36, 0xbd, 0x15, 0xd3, 0x45, 0x1a, 0xc7, 0x0c, 0x87, 0xd2, 0x78, - 0xcf, 0x6f, 0x55, 0x3f, 0x54, 0xa2, 0x62, 0x22, 0xd8, 0xf6, 0x76, 0x61, - 0x0d, 0xf8, 0xc8, 0x4b, 0x26, 0xf2, 0x39, 0xe6, 0xba, 0xa4, 0x76, 0x24, - 0xb8, 0x64, 0xa8, 0x2f, 0x46, 0xad, 0x3f, 0x20, 0x7b, 0x80, 0xa6, 0xaa, - 0xc7, 0xdf, 0x38, 0xd3, 0x4d, 0xfe, 0xc2, 0x7e, 0x9a, 0x82, 0xab, 0x0c, - 0x0e, 0xb1, 0x37, 0xf5, 0xac, 0xf5, 0xed, 0xb3, 0xc4, 0x23, 0x37, 0x08, - 0x6b, 0x12, 0x23, 0x50, 0x75, 0x9b, 0xe3, 0xe2, 0xac, 0xf6, 0xc6, 0xa1, - 0x50, 0x67, 0x75, 0xa7, 0xb9, 0xc2, 0x1b, 0x9c, 0x03, 0x74, 0xeb, 0x9b, - 0xc0, 0x19, 0x87, 0x1d, 0xec, 0xda, 0x0f, 0xb2, 0xb6, 0xe9, 0xe1, 0x7a, - 0xe2, 0xd4, 0x74, 0xd2, 0xe8, 0x2c, 0xcb, 0xef, 0x00, 0x59, 0x2f, 0x3d, - 0xe9, 0x41, 0x0c, 0x6e, 0xe5, 0xb3, 0xe9, 0xe4, 0x82, 0x24, 0xcf, 0x30, - 0xcb, 0x0d, 0x74, 0x7c, 0x4e, 0x27, 0x45, 0x05, 0x4d, 0xdc, 0xbd, 0xa9, - 0xb7, 0x50, 0xe3, 0xa3, 0xf4, 0xdc, 0x0b, 0x41, 0xc7, 0xec, 0x6d, 0x30, - 0xfb, 0x53, 0x41, 0xb1, 0x20, 0x47, 0x1a, 0x42, 0xf8, 0x95, 0x0c, 0x21, - 0x73, 0x8e, 0x23, 0x8b, 0x96, 0x66, 0x4c, 0xb3, 0xfb, 0x0e, 0xaf, 0xc4, - 0x6e, 0xea, 0xf5, 0x6b, 0x8a, 0xd4, 0x31, 0x7a, 0x17, 0x52, 0xa3, 0x0f, - 0xd3, 0x24, 0x2f, 0x35, 0x9a, 0xda, 0x66, 0x9a, 0x11, 0xee, 0x9b, 0x24, - 0x97, 0xa4, 0x13, 0xa0, 0xd1, 0xa4, 0x24, 0xe4, 0x7a, 0x89, 0xc2, 0x25, - 0x9d, 0x5c, 0x72, 0xad, 0x75, 0x68, 0xa8, 0x0c, 0x98, 0xef, 0x0b, 0x38, - 0x76, 0x29, 0x59, 0x56, 0xf2, 0x66, 0xb7, 0xc1, 0x2c, 0xd4, 0xc7, 0xdc, - 0x54, 0x26, 0x1d, 0x03, 0x6f, 0x6c, 0xbd, 0x6d, 0xc9, 0x63, 0x2d, 0xd1, - 0xb4, 0xb9, 0x2d, 0x32, 0xbd, 0x6e, 0xa7, 0x13, 0x7e, 0x2a, 0x15, 0xaa, - 0x7c, 0xb2, 0x4c, 0x3b, 0x45, 0x10, 0xd0, 0x92, 0x29, 0x03, 0x96, 0xe6, - 0x7c, 0x06, 0x5f, 0x2c, 0x74, 0x4a, 0x9a, 0xeb, 0x54, 0x62, 0xe4, 0xf4, - 0x18, 0x85, 0xcf, 0x1d, 0x2c, 0xa0, 0x2c, 0xed, 0xee, 0x9b, 0xd5, 0x10, - 0x87, 0x2b, 0xbd, 0x07, 0x32, 0x59, 0x00, 0xa4, 0x5d, 0xab, 0x3a, 0x68, - 0x31, 0xdd, 0xba, 0xa1, 0x99, 0x61, 0xec, 0xeb, 0x81, 0x24, 0x20, 0x76, - 0x7a, 0x45, 0xa1, 0x18, 0x8e, 0x09, 0xaa, 0xc5, 0x29, 0xcf, 0x13, 0x72, - 0x71, 0x48, 0x0c, 0xed, 0x9c, 0x89, 0x5c, 0xcf, 0xf4, 0x67, 0x8e, 0xb1, - 0x1a, 0x6a, 0x56, 0x78, 0x4a, 0xfe, 0x96, 0x8f, 0xe4, 0xeb, 0x85, 0x39, - 0x3d, 0x08, 0x47, 0x50, 0xe8, 0xfe, 0x29, 0x45, 0x5a, 0xda, 0x70, 0x6d, - 0xe4, 0x93, 0x15, 0x8d, 0x71, 0xd4, 0x20, 0x18, 0x1f, 0xa9, 0x57, 0x40, - 0x7d, 0x24, 0xd9, 0x47, 0x71, 0x67, 0x59, 0x8c, 0xa9, 0xad, 0x7b, 0xa2, - 0x71, 0x00, 0x40, 0x4d, 0x90, 0xe9, 0xcf, 0x84, 0xfb, 0xd6, 0x57, 0x95, - 0x28, 0xb6, 0xdc, 0xd6, 0x22, 0xc5, 0x7d, 0xb9, 0x27, 0x3d, 0x32, 0x9a, - 0x05, 0x3c, 0x91, 0x31, 0x3d, 0xaa, 0xb0, 0xa8, 0x4b, 0xdb, 0x39, 0x03, - 0xa8, 0x80, 0xa4, 0x20, 0x08, 0x78, 0xc1, 0x45, 0x61, 0x87, 0x87, 0x10, - 0x17, 0x24, 0xe0, 0x0a, 0x7b, 0x59, 0x7d, 0x99, 0x76, 0xf2, 0x58, 0x34, - 0x97, 0x4f, 0x77, 0x13, 0xb8, 0x0f, 0x45, 0xa6, 0xcd, 0xfb, 0xa8, 0x2d, - 0x02, 0xd9, 0x14, 0xc6, 0x56, 0x29, 0x44, 0xb4, 0x8a, 0x4e, 0xce, 0x59, - 0x86, 0x8b, 0x0f, 0xe8, 0xc8, 0xf4, 0x8a, 0xb7, 0xe1, 0xd8, 0x87, 0xbd, - 0x93, 0x7c, 0x7f, 0x70, 0xec, 0xbd, 0xe2, 0x70, 0xf8, 0x6b, 0xad, 0x52, - 0x3f, 0x04, 0x2f, 0x16, 0x96, 0xa2, 0x94, 0xf4, 0xd6, 0x86, 0x94, 0xf0, - 0x72, 0xd5, 0x47, 0x40, 0xb2, 0x6c, 0x46, 0xeb, 0x71, 0xbc, 0x68, 0x40, - 0xf4, 0xe2, 0x54, 0xf1, 0xfd, 0xde, 0x1b, 0xef, 0x3b, 0x46, 0x97, 0x36, - 0xf7, 0x7f, 0x9e, 0x3b, 0xb6, 0x0a, 0xb5, 0x42, 0x75, 0x41, 0x60, 0xff, - 0xfe, 0x5a, 0x34, 0x1e, 0x21, 0x32, 0x3c, 0xbe, 0x98, 0xf7, 0x5a, 0x74, - 0x3b, 0x51, 0xc3, 0x97, 0x9e, 0x3c, 0x75, 0xfb, 0x17, 0x0f, 0xb0, 0xcf, - 0xbc, 0xbd, 0xd1, 0x7a, 0x19, 0xb6, 0xb6, 0x56, 0xba, 0xac, 0xad, 0x5d, - 0x46, 0xfd, 0x0e, 0xf8, 0xa2, 0xfe, 0xe7, 0xcd, 0x0e, 0xb4, 0x5a, 0x4d, - 0xdb, 0xee, 0x6f, 0x9b, 0xbd, 0xb6, 0x3d, 0xa7, 0xab, 0xbb, 0x16, 0x89, - 0xdc, 0x14, 0xa2, 0x0a, 0xec, 0xb7, 0xef, 0xf6, 0xb2, 0xa6, 0xa4, 0x7d, - 0x8a, 0xef, 0x21, 0xa0, 0x3c, 0xa6, 0x38, 0xf8, 0x0d, 0x36, 0xc4, 0x44, - 0x21, 0xd2, 0x5b, 0x4f, 0xc2, 0x36, 0xc8, 0xec, 0xbd, 0x67, 0x5e, 0xe5, - 0x64, 0x0d, 0x49, 0x53, 0xab, 0xa1, 0x85, 0x77, 0x94, 0x78, 0x8d, 0xe8, - 0xa8, 0x83, 0x73, 0x40, 0xd6, 0x20, 0x5f, 0xa8, 0xca, 0x89, 0xe6, 0x7c, - 0xf6, 0xbf, 0x57, 0x33, 0x70, 0xa0, 0xc2, 0xe5, 0x7a, 0xcb, 0x4c, 0x2e, - 0x08, 0xd2, 0x28, 0xe7, 0x18, 0x81, 0x58, 0x8e, 0x51, 0x90, 0xb6, 0x98, - 0xd5, 0x73, 0x20, 0x26, 0x91, 0x8e, 0xce, 0x7e, 0x89, 0x4b, 0x01, 0x96, - 0xe3, 0x5b, 0xcd, 0x2c, 0xe0, 0xae, 0x1e, 0xf1, 0xbb, 0xfc, 0xba, 0x03, - 0xad, 0x4b, 0x57, 0x3e, 0x79, 0x02, 0x70, 0x29, 0xb1, 0x31, 0xfb, 0x47, - 0x70, 0x36, 0x0b, 0xb9, 0xec, 0x8c, 0x3a, 0x4d, 0x5c, 0x70, 0x54, 0x10, - 0x97, 0x73, 0xe6, 0x78, 0x08, 0x0c, 0xf3, 0xe5, 0xa4, 0x1b, 0x84, 0x98, - 0x81, 0x47, 0x72, 0xfa, 0x67, 0x03, 0x7e, 0xc9, 0xbf, 0x78, 0x2c, 0xc2, - 0xbe, 0x3f, 0x51, 0x29, 0x57, 0xcb, 0x5a, 0xcc, 0xc6, 0xda, 0xbd, 0xb4, - 0xb9, 0x60, 0x67, 0x4b, 0x69, 0x7e, 0x57, 0x7c, 0x18, 0x2f, 0x9b, 0x0e, - 0xa8, 0x21, 0xcb, 0x0b, 0xb3, 0x07, 0xec, 0xf0, 0xf5, 0x15, 0xf4, 0x00, - 0x88, 0xcb, 0x2c, 0x73, 0x16, 0xad, 0x88, 0xc9, 0x0f, 0x36, 0x9e, 0xa7, - 0xc4, 0x2c, 0x69, 0x4b, 0x3c, 0x97, 0x34, 0xf0, 0xf3, 0xd8, 0x84, 0x65, - 0x8d, 0xed, 0xa6, 0xa3, 0x88, 0x5a, 0x0b, 0x88, 0x38, 0x5f, 0x48, 0x98, - 0x5d, 0xf6, 0xd8, 0x4d, 0x66, 0x40, 0xf6, 0xae, 0x86, 0xde, 0x18, 0xbf, - 0x92, 0xdf, 0x4d, 0x1f, 0xce, 0x74, 0x3b, 0xdc, 0x33, 0xff, 0x4f, 0x5c, - 0x8c, 0x10, 0xe1, 0x1e, 0xea, 0x16, 0x05, 0x42, 0xfa, 0x46, 0x85, 0xab, - 0x09, 0xa2, 0xd5, 0xde, 0x95, 0xa4, 0xf1, 0x32, 0x4b, 0xab, 0xc6, 0x3b, - 0x67, 0xb6, 0xdb, 0x86, 0x02, 0xe6, 0x56, 0x0c, 0xfd, 0x02, 0x13, 0x89, - 0xbf, 0x06, 0xc9, 0x4c, 0xdb, 0xb9, 0x05, 0x86, 0x82, 0x41, 0x97, 0x30, - 0xad, 0x9c, 0x62, 0x38, 0x9a, 0xb4, 0xf2, 0x28, 0xfb, 0x64, 0x5d, 0x07, - 0xb1, 0xdf, 0x5d, 0x06, 0xd3, 0x8e, 0xcb, 0x7c, 0x2a, 0x17, 0xa3, 0x76, - 0x90, 0x0a, 0x53, 0x0f, 0x79, 0xc7, 0xc2, 0xac, 0x59, 0xe2, 0x39, 0xc9, - 0x31, 0x73, 0xf0, 0xe0, 0x9e, 0x2e, 0xfb, 0xb5, 0xdb, 0x44, 0xa1, 0xb4, - 0x82, 0xf7, 0x08, 0xec, 0x39, 0x7d, 0xec, 0x56, 0x53, 0x30, 0x3b, 0x3c, - 0x77, 0xb6, 0xa1, 0x5e, 0xf6, 0xff, 0x2a, 0x37, 0x96, 0xbd, 0x52, 0x89, - 0xe2, 0x7a, 0x6c, 0x75, 0x3c, 0xf5, 0xbb, 0xb1, 0x0f, 0x26, 0x31, 0x67, - 0x14, 0xa7, 0x7a, 0xe5, 0x4d, 0xec, 0x02, 0x1e, 0x72, 0x63, 0xce, 0x9e, - 0x46, 0x56, 0x5e, 0x5f, 0x86, 0x69, 0x38, 0x85, 0x78, 0x49, 0xf2, 0x4b, - 0xb0, 0xd0, 0x8b, 0x99, 0x33, 0xd9, 0x9a, 0x58, 0x73, 0x6d, 0x95, 0x97, - 0x6d, 0xbe, 0x21, 0x8d, 0xa3, 0x31, 0x0c, 0x10, 0xc3, 0xd3, 0xae, 0x42, - 0xa7, 0xd0, 0x64, 0xe2, 0x9c, 0xdd, 0x58, 0x28, 0x0c, 0x5b, 0xd8, 0x1d, - 0x63, 0xcc, 0x16, 0xa0, 0x2a, 0x48, 0x80, 0xee, 0x73, 0x3a, 0x94, 0x2b, - 0x66, 0x46, 0x44, 0x7d, 0xa2, 0xfd, 0xac, 0x5c, 0xf5, 0xeb, 0x15, 0xfc, - 0x8f, 0x39, 0x33, 0xcf, 0xa7, 0xdf, 0x43, 0xcf, 0xd0, 0xb2, 0xd1, 0x3a, - 0xf0, 0x2f, 0x5b, 0x25, 0x1e, 0x91, 0x19, 0xde, 0xba, 0xa2, 0xed, 0x93, - 0x17, 0xf5, 0xf5, 0x5f, 0xf2, 0xe7, 0x9d, 0xac, 0xe1, 0x76, 0x84, 0x4d, - 0x72, 0x64, 0xd5, 0x4a, 0x59, 0xe1, 0xae, 0xa4, 0xf9, 0xaa, 0x42, 0xb2, - 0x23, 0x7b, 0xf8, 0x85, 0x63, 0x1a, 0x5c, 0xa5, 0x34, 0x98, 0x21, 0x52, - 0x99, 0xe9, 0xd8, 0xfd, 0x36, 0x0c, 0x39, 0xeb, 0xb5, 0x5b, 0xc6, 0xb3, - 0x7b, 0x9e, 0x32, 0xc4, 0xc4, 0x1a, 0x79, 0x55, 0xd2, 0x4c, 0xbd, 0x34, - 0xe2, 0x61, 0x50, 0x08, 0x10, 0x8d, 0x29, 0x7d, 0x9a, 0x54, 0x67, 0x97, - 0xf3, 0x43, 0xb3, 0xdc, 0xec, 0xc6, 0xab, 0x11, 0xd0, 0x9a, 0x9b, 0xd6, - 0x50, 0xc8, 0x37, 0xfd, 0x4c, 0xdb, 0x70, 0x28, 0xd4, 0x74, 0xb1, 0x1e, - 0x4b, 0x12, 0x68, 0xb8, 0xf0, 0xf5, 0xe3, 0xb6, 0xe7, 0x83, 0x5d, 0x1b, - 0x08, 0x51, 0xcb, 0xf9, 0xdc, 0xc4, 0xf1, 0x89, 0x75, 0xd5, 0x54, 0xde, - 0xaa, 0x59, 0xa4, 0x1c, 0xcc, 0xea, 0x5a, 0x31, 0xb3, 0xaa, 0x67, 0xf4, - 0x49, 0x53, 0xa1, 0x6c, 0xaa, 0xb8, 0x8d, 0x8b, 0x5c, 0xe8, 0x84, 0x27, - 0xec, 0xa1, 0xd6, 0x26, 0x5c, 0x4b, 0x90, 0xa9, 0x12, 0x9b, 0x01, 0x78, - 0xe4, 0x46, 0x73, 0x1a, 0xca, 0x8b, 0xd2, 0xf4, 0xba, 0x12, 0xbc, 0x2d, - 0x18, 0xbd, 0xec, 0x0e, 0xe7, 0x59, 0x85, 0x07, 0xf2, 0x96, 0x12, 0x18, - 0x1d, 0x94, 0xc5, 0xb7, 0x4f, 0xce, 0xaa, 0x90, 0x29, 0x3d, 0x41, 0x18, - 0xa5, 0xda, 0xde, 0xfb, 0xc1, 0x39, 0x42, 0x3b, 0xf1, 0x7d, 0x76, 0x71, - 0xd5, 0x78, 0x65, 0x40, 0xc4, 0x42, 0x1b, 0xa8, 0x38, 0xd5, 0xdb, 0x9b, - 0xaa, 0x92, 0x46, 0xd0, 0x33, 0xb5, 0x30, 0xa4, 0x39, 0xe1, 0x49, 0xea, - 0x2e, 0x33, 0x86, 0x25, 0xbc, 0x72, 0xb9, 0xf1, 0xff, 0x7c, 0xea, 0x51, - 0x97, 0x95, 0x08, 0x48, 0x3d, 0xf7, 0x10, 0x51, 0xc6, 0x3b, 0x62, 0xac, - 0xd2, 0xec, 0xa1, 0xcd, 0xa8, 0x80, 0x63, 0x98, 0xf6, 0x30, 0x5c, 0x11, - 0xdf, 0x5a, 0x51, 0xa5, 0xc8, 0x13, 0x1b, 0xa7, 0xa4, 0x66, 0xcb, 0x6b, - 0x21, 0xab, 0x72, 0x23, 0x83, 0x07, 0xb9, 0xda, 0xfa, 0x7c, 0xd5, 0xb0, - 0x48, 0xaf, 0xc2, 0x29, 0x57, 0x3a, 0xac, 0xb4, 0x1d, 0x39, 0x15, 0x17, - 0xb8, 0x7d, 0x86, 0xdf, 0x1d, 0xab, 0x78, 0xe5, 0x0a, 0xcb, 0x70, 0x5f, - 0x60, 0xb2, 0x6e, 0xef, 0x84, 0x8d, 0x6c, 0x26, 0x83, 0x72, 0xa0, 0xcd, - 0xc9, 0x64, 0xb3, 0xb0, 0x75, 0x98, 0xf6, 0xc0, 0x8d, 0x16, 0xb0, 0xac, - 0xa4, 0x7e, 0xad, 0xf8, 0xef, 0x29, 0xe5, 0xaa, 0x30, 0xda, 0xe9, 0x52, - 0x80, 0x13, 0x7e, 0x50, 0x26, 0xd0, 0xbd, 0x4e, 0x52, 0x61, 0xb2, 0xf3, - 0x9a, 0xdd, 0xa3, 0x1f, 0xaf, 0x88, 0xae, 0x3a, 0xa4, 0xb9, 0xcb, 0x7a, - 0x54, 0x70, 0xf9, 0x03, 0x58, 0xcc, 0x63, 0x6f, 0xdb, 0xac, 0x7e, 0x76, - 0x30, 0x54, 0x3c, 0x21, 0x3f, 0xa0, 0x7f, 0x18, 0xfa, 0xf6, 0x3e, 0xfd, - 0xa6, 0xf2, 0xaa, 0xe7, 0x78, 0xf0, 0xa9, 0x02, 0x83, 0xa5, 0x35, 0x45, - 0x6f, 0x65, 0x02, 0xef, 0xe2, 0xd0, 0xd7, 0x9a, 0x19, 0x77, 0xfe, 0x10, - 0x34, 0xeb, 0xaf, 0xe3, 0xbf, 0x63, 0xa9, 0x66, 0xb7, 0x05, 0x80, 0x7d, - 0xef, 0xe9, 0x3d, 0xa1, 0x0d, 0x71, 0xb0, 0x28, 0x36, 0xe4, 0x9d, 0x32, - 0x15, 0x55, 0xf3, 0x83, 0x70, 0xcb, 0x5d, 0x37, 0xc0, 0x51, 0x5d, 0x83, - 0x77, 0xaa, 0xf2, 0x14, 0x6b, 0x88, 0x15, 0x5e, 0x30, 0x9a, 0xc8, 0xcc, - 0x66, 0x8a, 0x71, 0x7c, 0x54, 0xf9, 0x91, 0x3e, 0x39, 0x2a, 0xc8, 0x07, - 0x23, 0x77, 0xb1, 0xaf, 0x3b, 0x19, 0xc8, 0xd0, 0x7e, 0xc9, 0x8c, 0x49, - 0x56, 0xe7, 0x4e, 0x53, 0xb9, 0x41, 0xdd, 0xba, 0xf5, 0x81, 0x63, 0xde, - 0x0d, 0xe5, 0xad, 0x7d, 0xb7, 0xef, 0x24, 0x97, 0x08, 0x21, 0xa1, 0x2a, - 0xe6, 0x97, 0xfa, 0xbf, 0x58, 0xce, 0xb2, 0x58, 0xb5, 0xc6, 0x4c, 0xc7, - 0x8d, 0x9c, 0x70, 0x04, 0xeb, 0x44, 0x8e, 0x5d, 0xcb, 0x3c, 0x87, 0xf3, - 0x44, 0x32, 0x58, 0xfc, 0x43, 0xef, 0x63, 0xf2, 0x0a, 0x48, 0x55, 0xf8, - 0xc1, 0x1c, 0x85, 0xc0, 0x33, 0xe0, 0x5f, 0x10, 0xc5, 0xc7, 0x7f, 0x8d, - 0x46, 0x2f, 0x35, 0x71, 0x5e, 0xed, 0xcc, 0x0d, 0xcb, 0xd9, 0x4d, 0xa3, - 0x49, 0x6e, 0x44, 0xbc, 0x0e, 0x72, 0x33, 0xfd, 0xeb, 0x17, 0xb6, 0x54, - 0x56, 0xf2, 0x27, 0xaf, 0xaf, 0xc9, 0xd0, 0x84, 0xd8, 0x73, 0xf0, 0x1a, - 0xbd, 0xfa, 0x77, 0xe8, 0x6b, 0xd1, 0x45, 0x47, 0x93, 0xd5, 0x7f, 0x99, - 0x3b, 0x0a, 0x4d, 0x70, 0xd0, 0xbd, 0x94, 0xf5, 0x02, 0x8c, 0x59, 0x93, - 0x93, 0x64, 0xf5, 0x0d, 0xd7, 0x3c, 0xd1, 0x33, 0xd7, 0x5a, 0x21, 0x89, - 0x0e, 0x3d, 0x5d, 0x75, 0xd0, 0x8c, 0x4d, 0xea, 0xf7, 0xf0, 0x25, 0xed, - 0xf7, 0xea, 0x1f, 0x0b, 0x8f, 0x31, 0xbe, 0xcc, 0x37, 0xe0, 0x21, 0x05, - 0x19, 0xba, 0xf4, 0x22, 0x35, 0xef, 0x2c, 0x40, 0x2a, 0x57, 0xf1, 0x06, - 0x96, 0xb1, 0x61, 0x00, 0xd9, 0xe6, 0x26, 0x20, 0xb0, 0xef, 0x89, 0x4e, - 0x03, 0x05, 0xe7, 0x18, 0x24, 0x16, 0xcc, 0x20, 0x8d, 0x72, 0x05, 0xe7, - 0x1b, 0x2e, 0xae, 0x0d, 0xab, 0x49, 0x66, 0xf7, 0xa5, 0xa0, 0x70, 0x71, - 0x5e, 0x29, 0x9a, 0x12, 0x2f, 0xb5, 0x9e, 0x44, 0x3d, 0x22, 0xf6, 0x16, - 0x94, 0x7b, 0xd5, 0x0d, 0x4a, 0x97, 0x7a, 0xa4, 0xec, 0x6c, 0x47, 0x9d, - 0xb7, 0x20, 0x72, 0xb2, 0xe2, 0x7c, 0x2e, 0x4e, 0x58, 0x99, 0x35, 0x8a, - 0xeb, 0x44, 0x23, 0xcd, 0xac, 0x7e, 0x9b, 0x8a, 0x37, 0x8b, 0xd6, 0xc4, - 0xfa, 0xf0, 0x37, 0x2c, 0x7b, 0x91, 0x0e, 0x24, 0x41, 0x94, 0x98, 0xb5, - 0xdc, 0x5d, 0x66, 0x8d, 0x5d, 0x2e, 0xd2, 0xd4, 0xb3, 0x61, 0x12, 0xe2, - 0xda, 0x4e, 0x69, 0x32, 0xca, 0x86, 0x5d, 0x0c, 0xc9, 0x70, 0x6f, 0xc7, - 0xbf, 0x34, 0x42, 0x63, 0x56, 0x2e, 0x59, 0x38, 0x95, 0x7e, 0x59, 0x47, - 0xf5, 0xd5, 0xdf, 0xf4, 0xa8, 0xd5, 0x0f, 0x8d, 0x6f, 0xac, 0xe9, 0x09, - 0x75, 0xa0, 0x9c, 0xe8, 0x3a, 0xfe, 0x53, 0xb6, 0x38, 0x46, 0x54, 0x80, - 0x83, 0xc4, 0x4e, 0xdd, 0xf0, 0xa3, 0x21, 0x1e, 0x3a, 0x02, 0x72, 0x6f, - 0x34, 0x12, 0xd6, 0x36, 0x42, 0x71, 0x30, 0xdc, 0x48, 0x85, 0xa7, 0xf4, - 0x20, 0x00, 0xd5, 0xdd, 0x21, 0x3a, 0x94, 0xa1, 0xef, 0xb9, 0x8b, 0x11, - 0x7a, 0x39, 0xdc, 0xad, 0xc3, 0xa5, 0x94, 0x3f, 0x3d, 0x56, 0xf5, 0x4f, - 0x62, 0xef, 0x80, 0xe7, 0xed, 0x8f, 0x5f, 0xae, 0xd3, 0x7d, 0xd0, 0xb1, - 0xd1, 0x13, 0xce, 0xa7, 0x21, 0x9e, 0x1b, 0x89, 0xe7, 0x40, 0x13, 0xa6, - 0x5c, 0x2c, 0x79, 0xe6, 0x3f, 0x1a, 0x8d, 0x2d, 0xb8, 0x87, 0xd5, 0x0d, - 0x0b, 0xee, 0x64, 0xcf, 0x65, 0x9f, 0xc6, 0x04, 0x30, 0xc8, 0xf8, 0x26, - 0x03, 0x5d, 0xa4, 0xf4, 0xad, 0x5a, 0x7e, 0x35, 0x38, 0x13, 0x44, 0x4d, - 0xe6, 0xba, 0x52, 0x05, 0x17, 0x55, 0xc0, 0xf2, 0x31, 0xc8, 0x9f, 0x60, - 0x3d, 0xf8, 0x23, 0xc5, 0x6c, 0x2d, 0x6d, 0xde, 0x88, 0xe2, 0xd1, 0x4d, - 0x1c, 0x9a, 0xd4, 0x44, 0x35, 0x30, 0x53, 0x7e, 0x66, 0x82, 0x0a, 0xb5, - 0x3a, 0x53, 0xeb, 0xf2, 0xa1, 0x19, 0x25, 0xd9, 0xb0, 0x9f, 0x95, 0xfe, - 0x3d, 0xf2, 0x26, 0x99, 0x4a, 0x79, 0x47, 0xfd, 0xb4, 0xdb, 0x0a, 0x4d, - 0x90, 0xfa, 0x23, 0xec, 0xb6, 0x0d, 0x13, 0x5a, 0x8a, 0x57, 0xd1, 0x42, - 0x57, 0x8c, 0x8e, 0x43, 0x9a, 0x08, 0x06, 0x65, 0xb8, 0x4b, 0x58, 0xd5, - 0x29, 0xb6, 0xb5, 0xd4, 0x77, 0xef, 0xdc, 0x32, 0xe7, 0x45, 0x11, 0x18, - 0xfa, 0x3f, 0x96, 0x5e, 0x1d, 0x57, 0xd5, 0xd5, 0xd0, 0x41, 0x29, 0xc0, - 0x5f, 0xa0, 0xea, 0x82, 0xca, 0x50, 0xbe, 0x3e, 0xd9, 0x57, 0xb8, 0xb7, - 0xfa, 0xf9, 0x34, 0x8e, 0xd1, 0x52, 0xc4, 0xca, 0x81, 0x4a, 0x95, 0x73, - 0x9f, 0x9d, 0x18, 0x42, 0xbb, 0xf2, 0xce, 0xc0, 0xba, 0xdc, 0x15, 0xb2, - 0x07, 0x76, 0xef, 0x70, 0xf6, 0x5d, 0xff, 0x7c, 0x21, 0xa9, 0x48, 0xd8, - 0xc0, 0xbe, 0x6a, 0x14, 0xd6, 0x17, 0x72, 0xbf, 0xe1, 0x3c, 0x8f, 0xd8, - 0x64, 0x58, 0xc3, 0x40, 0x56, 0x99, 0xa7, 0x90, 0x99, 0xe4, 0x2b, 0xd4, - 0x18, 0x0d, 0x77, 0xeb, 0x2a, 0x19, 0x5d, 0x2c, 0xd8, 0xa4, 0x2a, 0xee, - 0xa2, 0x55, 0x50, 0x9b, 0xf0, 0xfe, 0xb1, 0xef, 0x30, 0x3b, 0xc6, 0x51, - 0x58, 0xfb, 0x0f, 0x9a, 0xa8, 0x23, 0xd2, 0xc0, 0xa7, 0x1b, 0x75, 0x34, - 0x0f, 0xdd, 0xef, 0x76, 0x54, 0x97, 0xd0, 0x8b, 0x5b, 0xce, 0x61, 0x3e, - 0xaf, 0x11, 0x8e, 0x5e, 0x40, 0x21, 0x28, 0x9e, 0x97, 0x58, 0xc2, 0xca, - 0x29, 0xdb, 0x57, 0x58, 0x7c, 0x44, 0xeb, 0xa5, 0xa1, 0xa7, 0x4e, 0x93, - 0xea, 0x50, 0x26, 0x48, 0xd8, 0xbf, 0x98, 0x88, 0x21, 0x2a, 0xe1, 0x41, - 0xc0, 0xaf, 0x69, 0xf9, 0xc4, 0x5f, 0x46, 0xb4, 0x38, 0xf8, 0xb7, 0xb7, - 0x05, 0xc3, 0x1d, 0x85, 0x51, 0x48, 0xe2, 0x5c, 0x7d, 0xce, 0x62, 0xc3, - 0x37, 0x64, 0x14, 0x0d, 0xa3, 0xdc, 0x0f, 0x2f, 0x37, 0x36, 0x75, 0x3a, - 0x7c, 0xe1, 0x16, 0x11, 0x55, 0xf7, 0x32, 0x34, 0x8b, 0x0a, 0xea, 0x9d, - 0x98, 0x9f, 0x99, 0xb7, 0xfe, 0xa6, 0x4e, 0x4f, 0x8f, 0x16, 0xb7, 0x11, - 0xc1, 0x8c, 0x4f, 0xa0, 0x96, 0xc0, 0xda, 0xc3, 0x7e, 0x8e, 0x08, 0xa9, - 0xe0, 0x42, 0xb1, 0x51, 0xf6, 0x06, 0x91, 0x77, 0x9c, 0xd8, 0x5d, 0x0f, - 0x8f, 0x8d, 0x30, 0xc9, 0xb3, 0x2a, 0xc1, 0xb0, 0x25, 0xc1, 0xef, 0x94, - 0xa4, 0x84, 0xc9, 0x58, 0xe8, 0xb7, 0xcb, 0x25, 0xe6, 0xb0, 0x22, 0x14, - 0x7d, 0x0c, 0x25, 0xf8, 0x7b, 0xc9, 0x7c, 0xe9, 0x26, 0x42, 0x96, 0x7e, - 0xa6, 0x76, 0x4e, 0x9a, 0xa1, 0xc7, 0x5b, 0x09, 0x77, 0xfd, 0xe7, 0x9a, - 0xfc, 0xf6, 0x52, 0xe5, 0xeb, 0xb2, 0x7b, 0x6a, 0x0d, 0xeb, 0xdd, 0xf0, - 0x16, 0x5c, 0x21, 0x11, 0x37, 0xdf, 0x1f, 0x7f, 0xfb, 0x8c, 0xbe, 0xef, - 0xd7, 0x9a, 0x64, 0x25, 0x6f, 0x8b, 0x6a, 0x53, 0xe0, 0x4f, 0x86, 0x02, - 0xca, 0x8b, 0xff, 0xbe, 0xae, 0xe3, 0x6f, 0x88, 0x29, 0x9c, 0xe2, 0x93, - 0xfb, 0x49, 0xae, 0x52, 0x05, 0xcc, 0x78, 0x2a, 0xc1, 0xc5, 0xdd, 0xd5, - 0xa7, 0xfc, 0x8f, 0xa1, 0x90, 0xbe, 0x95, 0x28, 0x35, 0xa9, 0xe9, 0xb7, - 0xd3, 0x10, 0x50, 0x5d, 0x8e, 0x65, 0x72, 0x7a, 0xba, 0xa1, 0x6e, 0x66, - 0xa0, 0x61, 0x9e, 0x73, 0x6e, 0xca, 0x18, 0xde, 0xe8, 0x8d, 0xb5, 0xde, - 0xdb, 0xde, 0x3c, 0x7e, 0xaf, 0x15, 0x6a, 0xb9, 0x52, 0xd3, 0xa6, 0xe0, - 0x88, 0x82, 0x27, 0xe6, 0x4b, 0xce, 0xde, 0xb3, 0xe7, 0x8f, 0xad, 0x0a, - 0xff, 0x8d, 0x03, 0x5e, 0xb5, 0x76, 0xa9, 0x1b, 0x4b, 0x81, 0x41, 0x2f, - 0x15, 0x6f, 0x59, 0xbb, 0xbe, 0x6f, 0x8e, 0xca, 0xd6, 0xf4, 0x2d, 0x40, - 0x05, 0x5f, 0x5e, 0x93, 0xf6, 0xfd, 0xb5, 0xe9, 0x9b, 0x70, 0x29, 0x40, - 0x54, 0x71, 0x69, 0xdb, 0x2d, 0x75, 0xfb, 0x3d, 0x00, 0x78, 0x79, 0xa9, - 0x93, 0xe3, 0xcd, 0xc7, 0x61, 0xad, 0x03, 0x94, 0xcd, 0xbf, 0xc8, 0xe0, - 0x35, 0xb5, 0xda, 0x5a, 0x58, 0x58, 0xe1, 0x72, 0x23, 0x05, 0xa9, 0x31, - 0xca, 0xd8, 0x85, 0x19, 0x02, 0x04, 0x2a, 0x3f, 0xbc, 0x34, 0x8a, 0x39, - 0x0e, 0x58, 0x15, 0x74, 0x5d, 0x2c, 0x34, 0x37, 0x8a, 0xf8, 0xee, 0x4a, - 0xc0, 0x6f, 0xc7, 0x3e, 0x65, 0xc4, 0xdc, 0x09, 0xd9, 0x98, 0x4f, 0xa5, - 0xd2, 0xfa, 0x31, 0x25, 0x6a, 0x13, 0x51, 0xef, 0x11, 0xb1, 0x8a, 0x53, - 0x34, 0x5b, 0x13, 0xfd, 0xf6, 0x00, 0xd2, 0x05, 0x2f, 0xdf, 0x9e, 0x1c, - 0x9e, 0x38, 0x25, 0xbe, 0x45, 0x67, 0xca, 0x43, 0x4a, 0x35, 0x8a, 0x33, - 0x3e, 0x85, 0x0b, 0xe7, 0xf3, 0x8c, 0xd5, 0xce, 0x36, 0x61, 0x2a, 0x38, - 0xb7, 0x28, 0x8a, 0xa8, 0xa5, 0x85, 0x21, 0x10, 0x30, 0x9e, 0xb1, 0xf1, - 0xe4, 0xf0, 0xf0, 0x5a, 0xb2, 0xa8, 0x4a, 0x4e, 0x73, 0x07, 0x09, 0xeb, - 0x47, 0xd3, 0xc0, 0x7f, 0x5e, 0xa9, 0xc1, 0xbc, 0x7a, 0x5e, 0xb3, 0x13, - 0xd9, 0x57, 0xe0, 0x76, 0xd0, 0xbd, 0x9f, 0x3d, 0xb5, 0x80, 0x5c, 0x4d, - 0x43, 0xe0, 0xcb, 0x31, 0xf1, 0x98, 0x3f, 0xb8, 0xac, 0x35, 0x1d, 0xe4, - 0x40, 0x8f, 0xde, 0xc3, 0x00, 0x4f, 0x18, 0x9f, 0x63, 0x23, 0xec, 0x79, - 0xd7, 0x50, 0x0b, 0x8c, 0xf4, 0x79, 0x74, 0xc3, 0xae, 0xa2, 0x41, 0x82, - 0xcc, 0x97, 0xbe, 0xdf, 0xac, 0x1c, 0x54, 0x0d, 0x0c, 0x10, 0x5a, 0x50, - 0x74, 0x4e, 0x8e, 0xca, 0x5d, 0xf9, 0x65, 0x2f, 0x9d, 0xe5, 0x6c, 0x8f, - 0x1a, 0x4f, 0xb7, 0x2f, 0x10, 0x3d, 0x0c, 0xff, 0x5d, 0x2e, 0xf9, 0xd2, - 0x77, 0xcc, 0x9b, 0xb5, 0xf0, 0xce, 0x2e, 0x78, 0x17, 0xe7, 0x9d, 0x15, - 0x3a, 0xc7, 0x95, 0x78, 0x9a, 0x85, 0x55, 0x44, 0x01, 0x4a, 0x97, 0x22, - 0xc5, 0xb8, 0xa9, 0xb9, 0x4b, 0xf4, 0x23, 0x1f, 0x1a, 0x52, 0x44, 0x2b, - 0xc5, 0x1a, 0xcb, 0xde, 0x0c, 0x35, 0x00, 0x47, 0x57, 0x82, 0xff, 0x6f, - 0xfa, 0xba, 0x35, 0x39, 0x4e, 0xe4, 0xd7, 0x71, 0x95, 0x68, 0x4f, 0x9f, - 0xdf, 0x98, 0x4c, 0x26, 0xea, 0x1b, 0xf1, 0x32, 0xf6, 0x20, 0x9a, 0xff, - 0x11, 0xdf, 0x05, 0x27, 0xd9, 0x95, 0x3c, 0xb0, 0x74, 0xd6, 0x43, 0x9b, - 0xcd, 0x5c, 0x04, 0x74, 0x73, 0xf1, 0xc7, 0xb1, 0xe5, 0x3c, 0x25, 0x59, - 0xdd, 0x24, 0x41, 0x2e, 0x96, 0x66, 0x98, 0x55, 0x8f, 0x6b, 0x52, 0x25, - 0x5e, 0x00, 0xf4, 0x4f, 0xe8, 0x38, 0x57, 0x24, 0x3a, 0x94, 0x80, 0x2e, - 0xf2, 0xcd, 0xd1, 0xc0, 0x43, 0x87, 0x94, 0xac, 0x49, 0x22, 0xe5, 0xdd, - 0x9c, 0xc6, 0x9b, 0x8e, 0x9a, 0x80, 0x10, 0x10, 0x97, 0xe9, 0x4d, 0xf6, - 0x4c, 0xa7, 0x2a, 0x54, 0x7c, 0xd9, 0x9f, 0x7f, 0x25, 0x31, 0x80, 0x3f, - 0x6e, 0x5f, 0x1b, 0xc9, 0x7c, 0x8a, 0x37, 0x83, 0x82, 0x55, 0xab, 0xed, - 0x2e, 0xa7, 0xab, 0x67, 0x81, 0x02, 0xbe, 0xfc, 0x13, 0x2a, 0x08, 0xdd, - 0x2d, 0xfb, 0x06, 0x23, 0x3c, 0x2b, 0x0c, 0x6e, 0xd3, 0x01, 0x67, 0xfb, - 0xa1, 0x6d, 0xad, 0xb6, 0x87, 0x88, 0xf6, 0x62, 0x76, 0x92, 0x4a, 0x91, - 0x66, 0xbf, 0xd9, 0xde, 0xba, 0x37, 0x50, 0x2c, 0x8f, 0xf7, 0x47, 0xfa, - 0x6b, 0x8f, 0xdf, 0xd0, 0x91, 0x01, 0xf2, 0x7a, 0xa4, 0x5a, 0x5f, 0xd4, - 0x8d, 0xd4, 0x82, 0xf7, 0x9d, 0xc6, 0xf2, 0xaf, 0x16, 0x08, 0xd2, 0x6c, - 0x5a, 0x24, 0xa4, 0x9b, 0x5c, 0xb0, 0xe6, 0xe9, 0xe8, 0xe8, 0xba, 0x5e, - 0x46, 0xd3, 0x5a, 0x3d, 0x90, 0x30, 0xcb, 0xab, 0xfb, 0x38, 0xac, 0xed, - 0xd9, 0x3e, 0xd4, 0xad, 0xe7, 0x87, 0x0d, 0x4c, 0x02, 0xbd, 0x62, 0xc8, - 0x5b, 0x76, 0x20, 0xb4, 0xed, 0x39, 0xe7, 0x59, 0x67, 0xc5, 0xa9, 0x21, - 0xc7, 0x38, 0x59, 0x51, 0x7e, 0x0f, 0x84, 0x9e, 0x45, 0x41, 0x29, 0xf0, - 0x96, 0xb5, 0x7d, 0xe2, 0xfe, 0xf7, 0xa8, 0xd9, 0x76, 0xc9, 0x86, 0xc3, - 0x77, 0xa1, 0x04, 0xa8, 0x59, 0x69, 0x0f, 0x20, 0xc3, 0xbe, 0xc9, 0x33, - 0x86, 0x13, 0x24, 0x68, 0xfa, 0x0d, 0x51, 0xea, 0x6e, 0xfd, 0xfc, 0x3f, - 0xb6, 0x10, 0xe4, 0x6b, 0x59, 0x3a, 0xc3, 0x04, 0x00, 0xa3, 0x49, 0x64, - 0x22, 0xd7, 0x46, 0xc7, 0x94, 0xc9, 0x1a, 0x04, 0x50, 0x55, 0xb9, 0x5c, - 0xc3, 0x45, 0xb8, 0x88, 0x6a, 0xe4, 0x11, 0xdc, 0x0d, 0xa0, 0xb9, 0x86, - 0x78, 0xc7, 0xc9, 0x93, 0x01, 0x1f, 0xc9, 0x0c, 0x4c, 0xaf, 0x9c, 0x66, - 0x92, 0xa2, 0x19, 0xd3, 0xc3, 0xed, 0x90, 0x75, 0x05, 0xbf, 0x95, 0x75, - 0x1a, 0x96, 0xd0, 0x43, 0x7e, 0x45, 0x33, 0x81, 0xa9, 0x8d, 0x96, 0x19, - 0xc9, 0xad, 0xbf, 0x76, 0x54, 0xe0, 0x02, 0x8d, 0x17, 0x39, 0xf3, 0xa2, - 0x78, 0xc5, 0xe7, 0xda, 0xaf, 0x29, 0xb4, 0x6c, 0x47, 0xaf, 0xe3, 0x2f, - 0x18, 0x35, 0x86, 0xa7, 0x46, 0x5e, 0x50, 0x12, 0xc0, 0x5c, 0xa0, 0xf7, - 0x0c, 0x09, 0xe9, 0xee, 0x15, 0xcd, 0x3e, 0xe4, 0xb4, 0x38, 0x37, 0x3d, - 0xf6, 0xa4, 0x8b, 0x53, 0x7b, 0x17, 0xa4, 0x38, 0x33, 0xc0, 0xe7, 0x05, - 0x68, 0xbe, 0xf6, 0x42, 0xde, 0xd0, 0xa8, 0x3a, 0x6f, 0x58, 0x23, 0x36, - 0xfa, 0xf2, 0x7d, 0xe2, 0x80, 0x1f, 0x1c, 0x1c, 0xf4, 0x23, 0xbf, 0x03, - 0xd2, 0xd0, 0xc9, 0x74, 0x64, 0xbc, 0x25, 0x0a, 0xb1, 0x41, 0x61, 0x6b, - 0xbd, 0xcf, 0xf1, 0xcc, 0xdd, 0x50, 0x57, 0xda, 0xe2, 0x7e, 0xe4, 0x17, - 0x2f, 0x84, 0x7b, 0x6f, 0xa9, 0x49, 0xd2, 0xc1, 0x31, 0xc0, 0xa1, 0x34, - 0xee, 0xa2, 0x52, 0x37, 0xba, 0xc3, 0x8f, 0x2b, 0x13, 0x47, 0xcf, 0x6f, - 0x09, 0xa9, 0xf1, 0x22, 0x21, 0x6f, 0x7b, 0x20, 0x46, 0x43, 0x6f, 0x6f, - 0x2a, 0xf6, 0xad, 0x1c, 0x7f, 0x01, 0xca, 0xf8, 0x12, 0x82, 0x37, 0x0e, - 0x09, 0x36, 0xd5, 0x9e, 0x02, 0x73, 0x36, 0x6a, 0x64, 0x75, 0x8d, 0x98, - 0x39, 0xdb, 0xd5, 0xd8, 0x10, 0x11, 0xf4, 0x20, 0x33, 0x53, 0x7c, 0xbb, - 0xf7, 0x91, 0x40, 0x62, 0x8e, 0x42, 0x27, 0x11, 0xd1, 0xef, 0x63, 0x24, - 0xfe, 0x24, 0x9a, 0x76, 0x04, 0xbf, 0x48, 0xdf, 0x28, 0x65, 0x4e, 0xe7, - 0xc0, 0x03, 0xdb, 0xe9, 0x2f, 0x1d, 0xcb, 0x0c, 0xb8, 0x0d, 0x72, 0x7f, - 0x57, 0x18, 0x98, 0x8d, 0x73, 0xfb, 0x46, 0x45, 0x84, 0x2b, 0x1a, 0xb3, - 0x71, 0x10, 0xa3, 0xb0, 0xd0, 0x34, 0x91, 0x27, 0xbe, 0xdf, 0x24, 0x88, - 0xaa, 0x41, 0x1d, 0xd2, 0x58, 0x0f, 0x67, 0x66, 0xec, 0xff, 0x14, 0xd0, - 0x56, 0x72, 0xbc, 0x25, 0xd6, 0xa7, 0x76, 0x10, 0xf6, 0x5a, 0xf5, 0x8a, - 0x06, 0x6f, 0xed, 0x5b, 0x13, 0x07, 0x8c, 0xcd, 0xfc, 0xd9, 0x90, 0xfb, - 0x8e, 0x82, 0x56, 0x29, 0xec, 0x46, 0x4b, 0x10, 0x33, 0x42, 0x80, 0x16, - 0xd2, 0x83, 0xa8, 0x74, 0x2a, 0x81, 0x53, 0x58, 0x7d, 0x20, 0x71, 0x7c, - 0xba, 0x6c, 0x62, 0x81, 0x9c, 0x2b, 0xcb, 0x82, 0xe3, 0xd8, 0xca, 0x40, - 0xab, 0x25, 0xbc, 0xe0, 0xce, 0xbc, 0x77, 0x53, 0x4f, 0x2a, 0xc2, 0x25, - 0x7c, 0xb4, 0x49, 0x9d, 0x6d, 0x51, 0x08, 0x9b, 0x8f, 0x7f, 0xe4, 0x8f, - 0x30, 0x27, 0xfb, 0x79, 0xd8, 0x2e, 0x12, 0x8f, 0x21, 0xe0, 0xd3, 0x88, - 0x62, 0x72, 0x30, 0x2f, 0x71, 0xcb, 0x6c, 0x81, 0xf6, 0x34, 0x34, 0xcf, - 0x2d, 0x83, 0x71, 0x7d, 0x88, 0xe2, 0x40, 0xe9, 0x61, 0x85, 0xf8, 0x8a, - 0x91, 0xde, 0x76, 0x2d, 0xba, 0x30, 0x40, 0x11, 0x34, 0xeb, 0x29, 0xcd, - 0x05, 0x26, 0x8a, 0xf2, 0x2f, 0x36, 0x82, 0x3e, 0xbf, 0x1b, 0xca, 0x35, - 0xc8, 0x2d, 0x2a, 0x09, 0x2a, 0xa2, 0x0f, 0x9c, 0xbc, 0xec, 0x44, 0xfa, - 0x00, 0xa5, 0x0b, 0x0c, 0x80, 0x3e, 0x40, 0x71, 0xc8, 0x3b, 0xfe, 0xfd, - 0x73, 0x8c, 0x2c, 0xd1, 0x9b, 0x0d, 0xca, 0x24, 0x22, 0xb1, 0x70, 0x7b, - 0x9b, 0xf1, 0x82, 0xb6, 0x71, 0x2d, 0xd5, 0xbf, 0x49, 0x8f, 0x67, 0xe8, - 0xe6, 0xaf, 0xe3, 0x66, 0xb2, 0x9b, 0xe0, 0xa5, 0x92, 0x45, 0x69, 0x4e, - 0x64, 0xeb, 0x96, 0x89, 0x88, 0x7f, 0x92, 0x66, 0x8c, 0x35, 0x8c, 0xa4, - 0x95, 0x91, 0xcc, 0xee, 0x59, 0x35, 0xfe, 0x69, 0x18, 0x61, 0x07, 0xb7, - 0xd4, 0x45, 0x57, 0xed, 0xc1, 0xa4, 0x37, 0x8c, 0xca, 0xda, 0xf3, 0x41, - 0x92, 0x5a, 0x52, 0x8f, 0x29, 0xa0, 0x75, 0x88, 0x2a, 0x32, 0x1c, 0x0b, - 0x2b, 0x80, 0x7d, 0x3a, 0x38, 0xa8, 0x08, 0x18, 0x23, 0x76, 0x00, 0x72, - 0x3a, 0x63, 0xad, 0x2c, 0xa7, 0x8f, 0x73, 0x81, 0xc5, 0xf4, 0xed, 0xfc, - 0x1a, 0x24, 0x47, 0xf5, 0x3f, 0xe5, 0x84, 0x5e, 0x1c, 0xec, 0x74, 0xd9, - 0xb9, 0x99, 0x3c, 0xe3, 0x0f, 0x19, 0x51, 0x34, 0x46, 0x4b, 0x03, 0x9a, - 0xf5, 0xc6, 0x2a, 0xde, 0x36, 0x6e, 0xbc, 0x17, 0x08, 0x16, 0xd9, 0xb5, - 0xf2, 0xc1, 0xac, 0xd2, 0xe1, 0x39, 0x68, 0xa5, 0xfc, 0x25, 0x4a, 0x94, - 0x06, 0xec, 0x05, 0x77, 0xb8, 0xde, 0xea, 0x36, 0x0f, 0xef, 0x7c, 0x7b, - 0x75, 0x13, 0x7a, 0xb1, 0x42, 0xe9, 0x32, 0xe3, 0x15, 0xf9, 0x67, 0x46, - 0xd2, 0x59, 0x05, 0x11, 0xac, 0xbd, 0x1c, 0xf8, 0x5e, 0xe9, 0x49, 0x65, - 0xac, 0xa6, 0x5e, 0xb5, 0x5e, 0x00, 0x98, 0xdc, 0xa1, 0x9e, 0x7b, 0xda, - 0xcc, 0x31, 0x7e, 0x34, 0x20, 0xd9, 0x4e, 0x15, 0x74, 0x88, 0xd8, 0x8d, - 0x02, 0xf9, 0x45, 0xa0, 0xcb, 0xba, 0xa1, 0x0b, 0xb4, 0x2a, 0x25, 0x6a, - 0x77, 0x8e, 0xae, 0x20, 0xa0, 0x40, 0x50, 0x3a, 0xbc, 0xf0, 0xd5, 0xb2, - 0x49, 0x5f, 0xc2, 0x89, 0xd4, 0xcf, 0x48, 0xdd, 0x3c, 0xe7, 0x43, 0x16, - 0x1a, 0x2e, 0xf9, 0xb6, 0x7b, 0xf5, 0x89, 0xe7, 0xdd, 0x11, 0x16, 0x6b, - 0xd7, 0x5f, 0xc2, 0x18, 0x89, 0x75, 0xf6, 0x01, 0x59, 0x48, 0x20, 0x6b, - 0xf7, 0x94, 0x28, 0x3e, 0x69, 0x9b, 0xcc, 0x97, 0x2d, 0xe1, 0x80, 0xd3, - 0x61, 0x8d, 0x24, 0x5c, 0x93, 0x82, 0xa9, 0x85, 0x0e, 0x3f, 0x51, 0x2d, - 0x4e, 0xf6, 0x9d, 0x8d, 0x81, 0xc2, 0xfd, 0x3d, 0xf3, 0x3c, 0xbf, 0xc7, - 0x78, 0xe7, 0xc7, 0x6f, 0xbe, 0x4f, 0x9e, 0x23, 0x8d, 0xcc, 0x29, 0x2a, - 0x65, 0xe3, 0x11, 0xe3, 0x01, 0x68, 0x7f, 0x07, 0x9e, 0xde, 0xc5, 0x97, - 0xc0, 0xd8, 0xfc, 0x4d, 0x54, 0x60, 0x14, 0xe2, 0x89, 0xe0, 0xd4, 0xdb, - 0xd4, 0x0c, 0x3c, 0x29, 0xb5, 0x95, 0xc0, 0xfe, 0x81, 0xbb, 0x10, 0xab, - 0xb6, 0xcf, 0xaa, 0xc5, 0xc7, 0x6a, 0xc0, 0x11, 0xa8, 0x4e, 0xdb, 0x47, - 0x2c, 0x70, 0x5c, 0xb1, 0x80, 0xf5, 0xc2, 0xf7, 0xe0, 0x23, 0x42, 0x8e, - 0xa6, 0xcf, 0x0a, 0x03, 0xd1, 0xf3, 0x10, 0xb3, 0xbd, 0xd7, 0x62, 0x9d, - 0x7c, 0xe8, 0x8a, 0x06, 0xfc, 0x19, 0x16, 0x07, 0x3e, 0xaf, 0xa6, 0xff, - 0xa0, 0xa0, 0x69, 0x03, 0xf3, 0x5a, 0x7e, 0x40, 0x02, 0x0d, 0xc8, 0x8c, - 0x9e, 0x11, 0xb3, 0xa9, 0xd3, 0xb0, 0xff, 0x3d, 0x70, 0xa1, 0xd3, 0x33, - 0x84, 0x41, 0x96, 0x75, 0xc9, 0x68, 0x15, 0xcf, 0xb4, 0xce, 0xc4, 0xdc, - 0x62, 0xa6, 0x9c, 0xb2, 0x2d, 0x7a, 0x3f, 0x92, 0x12, 0x23, 0xe3, 0x39, - 0xbd, 0xfe, 0x03, 0x5f, 0x44, 0x24, 0xc4, 0xb3, 0x32, 0xff, 0x06, 0xd5, - 0x8d, 0xd8, 0x88, 0xdf, 0xd0, 0x14, 0x07, 0xd2, 0x7b, 0x06, 0xc9, 0xb3, - 0x36, 0x63, 0xc8, 0x57, 0xe3, 0x58, 0x93, 0x21, 0x3a, 0x28, 0xd2, 0x26, - 0xc6, 0x87, 0x15, 0x85, 0xc6, 0x3b, 0xf8, 0xe6, 0x6b, 0x97, 0x03, 0x46, - 0x20, 0x2b, 0x6f, 0x4b, 0x79, 0x69, 0x80, 0x11, 0x6d, 0xe7, 0x31, 0x48, - 0xdc, 0x13, 0x6f, 0x1f, 0x30, 0xb3, 0x6d, 0x9d, 0x53, 0xb5, 0xad, 0x70, - 0x1d, 0x5f, 0xcd, 0x27, 0x0b, 0x06, 0x15, 0x52, 0xad, 0x39, 0xcc, 0xa9, - 0x8a, 0x30, 0xf3, 0xd8, 0xfa, 0x19, 0xc2, 0x68, 0x9f, 0xfd, 0xfe, 0x8f, - 0x01, 0x6c, 0xa0, 0x1e, 0x2d, 0xeb, 0x9d, 0x70, 0x2f, 0x8d, 0x77, 0x30, - 0xe2, 0xbb, 0x9d, 0x43, 0xbf, 0xd4, 0xf8, 0x70, 0xff, 0xd1, 0x17, 0x97, - 0x45, 0x4b, 0x12, 0xb3, 0x22, 0x91, 0x36, 0x95, 0x27, 0x5c, 0x30, 0xc2, - 0x36, 0x94, 0x59, 0xc9, 0x9a, 0x91, 0xe9, 0x1c, 0x81, 0xaa, 0x83, 0xca, - 0x51, 0xc2, 0xae, 0xfa, 0xb2, 0x66, 0xad, 0xc5, 0x34, 0xe9, 0xe8, 0x07, - 0xbb, 0x2d, 0x80, 0x85, 0x71, 0xa1, 0xdc, 0x1f, 0x69, 0x7b, 0xd2, 0x10, - 0xa1, 0x23, 0x16, 0xaf, 0x0f, 0x12, 0x13, 0xfb, 0x53, 0x2f, 0x7e, 0xe1, - 0x43, 0x36, 0x40, 0xf9, 0x73, 0xd4, 0xe2, 0x41, 0x1d, 0x7b, 0xa9, 0x6e, - 0xa4, 0x71, 0x18, 0xb7, 0xba, 0xff, 0x94, 0xbb, 0x96, 0x30, 0x68, 0xec, - 0x5a, 0x17, 0xb1, 0x9c, 0xe4, 0xb9, 0xf1, 0x7c, 0xc0, 0xa9, 0x83, 0xc9, - 0x6b, 0x68, 0x58, 0xf1, 0x34, 0xec, 0xa9, 0x43, 0x10, 0x62, 0x59, 0x15, - 0x44, 0x68, 0xfe, 0xa2, 0x9f, 0x01, 0xed, 0xc5, 0xc9, 0x64, 0xe3, 0x55, - 0xc7, 0xdd, 0xb8, 0x23, 0xe0, 0x07, 0x59, 0xac, 0x85, 0x72, 0x80, 0x5a, - 0x17, 0x1d, 0xef, 0xd9, 0xbd, 0xda, 0x63, 0xac, 0x75, 0x38, 0x61, 0xc1, - 0x5d, 0x0b, 0xd5, 0x44, 0xe4, 0xfb, 0xb0, 0xba, 0x66, 0xf4, 0xab, 0x40, - 0x21, 0xd3, 0x8e, 0xc7, 0x31, 0xed, 0x29, 0xeb, 0xc0, 0x12, 0x4f, 0x98, - 0x26, 0x59, 0xaa, 0x9f, 0xc1, 0x44, 0x1d, 0x85, 0xd5, 0x0c, 0x4c, 0x5c, - 0x14, 0x45, 0x19, 0x3f, 0x53, 0x8d, 0x27, 0x73, 0xd3, 0xac, 0x84, 0x07, - 0x30, 0x50, 0x57, 0xd4, 0x02, 0x63, 0xa5, 0xa2, 0xf5, 0x4d, 0x2b, 0xbe, - 0x6b, 0xd7, 0xf5, 0x1f, 0xec, 0xe8, 0xb9, 0x43, 0x48, 0xd9, 0x95, 0x41, - 0xa5, 0x24, 0x79, 0x6d, 0x82, 0xc7, 0x07, 0x6a, 0x51, 0x84, 0xea, 0x42, - 0xbc, 0xb2, 0xe7, 0x10, 0xae, 0xaf, 0xaf, 0x24, 0x78, 0x94, 0xa8, 0x30, - 0x18, 0xf9, 0xf2, 0x9d, 0x80, 0xf4, 0x52, 0x21, 0x5d, 0xad, 0x4d, 0x0d, - 0x14, 0xb0, 0x4d, 0xea, 0x06, 0x83, 0xb3, 0xd5, 0x96, 0x23, 0x8c, 0xf7, - 0xd8, 0x75, 0x1c, 0x9c, 0xb9, 0x60, 0xff, 0x35, 0xe4, 0x35, 0x85, 0x90, - 0x4e, 0x5d, 0x0e, 0x5c, 0x9f, 0x4b, 0xdb, 0xdd, 0xd0, 0xde, 0x1d, 0x50, - 0x6a, 0xf3, 0xe6, 0xaa, 0x2c, 0xdc, 0x1e, 0x2d, 0xbe, 0xc3, 0x2c, 0x24, - 0x77, 0xb3, 0xcf, 0x7f, 0x08, 0x86, 0x18, 0xf9, 0x22, 0x5a, 0x0a, 0x62, - 0x84, 0xa5, 0xb1, 0x91, 0x0e, 0x1a, 0x1a, 0x29, 0xf8, 0x39, 0x62, 0xa3, - 0xa1, 0xe3, 0x73, 0xf6, 0x82, 0x6c, 0xe9, 0x62, 0xd7, 0xc0, 0xed, 0x07, - 0xe7, 0xf3, 0x7a, 0x51, 0xc1, 0x95, 0x68, 0xbc, 0xe0, 0x87, 0x60, 0x66, - 0x22, 0x89, 0x0a, 0x8b, 0xc4, 0x9f, 0x87, 0xa9, 0x66, 0x16, 0xb4, 0xda, - 0x16, 0x46, 0xba, 0x3b, 0x7c, 0x76, 0x5f, 0xc6, 0x31, 0xd2, 0xfe, 0x97, - 0x8b, 0xab, 0x60, 0x84, 0x13, 0xc1, 0x19, 0x83, 0x99, 0x1b, 0xb1, 0x5b, - 0x8e, 0x66, 0xf8, 0x1d, 0x3a, 0x72, 0x52, 0x2b, 0x88, 0xd9, 0xac, 0x5c, - 0x99, 0x7c, 0x13, 0x18, 0x5e, 0x85, 0x9c, 0xdc, 0x6a, 0x80, 0x99, 0x3a, - 0xcf, 0x4e, 0x0b, 0xa5, 0xdb, 0xef, 0x55, 0x0b, 0xdb, 0x69, 0xdf, 0x45, - 0x7d, 0x88, 0xb7, 0x31, 0xd3, 0x7f, 0x49, 0xe4, 0xc4, 0xd3, 0xd6, 0xec, - 0x30, 0x47, 0x63, 0xca, 0x55, 0xb3, 0x4e, 0x4d, 0x04, 0xff, 0x43, 0x7a, - 0x66, 0xf2, 0x21, 0xeb, 0x29, 0x51, 0xd7, 0x5a, 0xd9, 0x17, 0x3d, 0xad, - 0xee, 0x42, 0x89, 0xf8, 0xbc, 0xae, 0x5d, 0x1d, 0x88, 0x5e, 0xa3, 0x45, - 0x11, 0xc7, 0xa8, 0x25, 0x89, 0x47, 0x97, 0x21, 0x1d, 0x55, 0x80, 0xe6, - 0xde, 0x07, 0xd7, 0x30, 0xf4, 0x3e, 0x3f, 0x5d, 0x4b, 0xac, 0x68, 0x06, - 0x94, 0x1d, 0x49, 0x2d, 0x87, 0xed, 0x93, 0xa4, 0x46, 0x84, 0x04, 0xf3, - 0x93, 0x06, 0x82, 0xda, 0x92, 0xef, 0x43, 0x80, 0xb7, 0x3e, 0x1e, 0x9e, - 0x3b, 0xa2, 0x9d, 0x12, 0xcc, 0x2b, 0xbb, 0x3b, 0xf5, 0x00, 0x97, 0x67, - 0x67, 0x67, 0xb0, 0xdb, 0x05, 0x72, 0x6e, 0xba, 0x93, 0x22, 0x10, 0xe6, - 0xfd, 0xe6, 0x95, 0xdc, 0x65, 0xb6, 0xea, 0x27, 0x0a, 0x24, 0xa7, 0x00, - 0x10, 0x1f, 0x0d, 0x32, 0xf9, 0x52, 0x71, 0xd6, 0x88, 0x12, 0x27, 0xd4, - 0x42, 0x61, 0xbd, 0x8e, 0x11, 0x4f, 0xae, 0xc6, 0x1d, 0x5d, 0x2c, 0x3e, - 0x3e, 0x20, 0x62, 0x9c, 0x67, 0x89, 0x2e, 0x76, 0xdd, 0x22, 0x04, 0x87, - 0xde, 0x79, 0x37, 0x6b, 0xf5, 0xe0, 0xf7, 0x70, 0x81, 0xf2, 0xe4, 0x63, - 0x7e, 0x60, 0x5b, 0x54, 0xa9, 0x92, 0x4b, 0x38, 0x8a, 0x43, 0x72, 0x05, - 0x46, 0x3f, 0xce, 0x96, 0xb3, 0x3a, 0x02, 0x41, 0x58, 0xea, 0x2a, 0x2c, - 0x20, 0x5d, 0xa5, 0xf0, 0x3e, 0x94, 0xf3, 0x18, 0xff, 0xa0, 0x9f, 0xa4, - 0x1b, 0x2e, 0x25, 0x5d, 0x1b, 0x8c, 0x7c, 0x44, 0x92, 0xbb, 0xcd, 0x5f, - 0x92, 0x1f, 0x3c, 0x75, 0x5e, 0xcf, 0xd3, 0xb8, 0xef, 0x80, 0xfc, 0x6e, - 0xbf, 0x6d, 0x56, 0x6c, 0x56, 0x68, 0xe5, 0x76, 0x55, 0xa0, 0x50, 0x4a, - 0x1b, 0x17, 0x0d, 0xd4, 0xb4, 0x1c, 0xae, 0x51, 0x37, 0x61, 0xb9, 0x25, - 0x7b, 0x91, 0x31, 0x51, 0xf2, 0x39, 0xac, 0xe0, 0xac, 0x94, 0x79, 0x71, - 0xea, 0xd7, 0xbd, 0xc1, 0x74, 0x26, 0x48, 0xc6, 0x9b, 0x33, 0x53, 0x45, - 0xb6, 0x8a, 0x9b, 0x46, 0x5c, 0xe8, 0xa4, 0x55, 0x2b, 0x04, 0xad, 0xea, - 0x56, 0xc2, 0xb2, 0xc3, 0x8e, 0xff, 0x14, 0x54, 0x4a, 0x4b, 0x38, 0xa9, - 0x23, 0xae, 0xfa, 0x71, 0x68, 0xd8, 0x36, 0xd6, 0x1d, 0x0e, 0x3a, 0x92, - 0x94, 0x7f, 0x57, 0x1f, 0xa2, 0x3a, 0x77, 0x93, 0x31, 0x1a, 0x86, 0x1f, - 0x97, 0x00, 0xd2, 0x2d, 0x8b, 0xfd, 0x65, 0xfe, 0xa6, 0xf1, 0x26, 0x32, - 0x65, 0x59, 0xe3, 0x59, 0x26, 0x51, 0xfd, 0x0f, 0xfd, 0x4c, 0xe9, 0xec, - 0x35, 0x8b, 0xd8, 0x24, 0xef, 0x7c, 0xd3, 0xfe, 0x26, 0x90, 0x87, 0x78, - 0xac, 0x16, 0x3e, 0x47, 0x40, 0x1f, 0x57, 0xaa, 0xbf, 0x75, 0x27, 0xda, - 0x7a, 0x25, 0xd3, 0x80, 0x8f, 0xc6, 0x5c, 0xcc, 0xc0, 0x5a, 0x9b, 0x11, - 0x0d, 0xbe, 0x9e, 0xe6, 0x9a, 0x29, 0x47, 0x91, 0x2c, 0x2e, 0x8e, 0xa8, - 0x6a, 0x6c, 0x15, 0xc1, 0xc8, 0x23, 0xd5, 0x19, 0x4f, 0x57, 0x5f, 0xdb, - 0x5f, 0xd1, 0x7b, 0xe6, 0xdb, 0x7d, 0xe9, 0x41, 0x7f, 0x64, 0x59, 0xa4, - 0xce, 0xcd, 0x60, 0xff, 0x98, 0xad, 0x29, 0xf1, 0x46, 0x13, 0xbb, 0x35, - 0xf3, 0x4a, 0xc2, 0x81, 0x9f, 0x0c, 0x54, 0xb0, 0x40, 0xd3, 0xb7, 0x01, - 0x0b, 0xcd, 0x32, 0xf2, 0x5f, 0x9c, 0x97, 0x0d, 0xca, 0x50, 0x12, 0xf7, - 0x2e, 0x08, 0x2d, 0x0a, 0x2b, 0xe6, 0x31, 0x5a, 0x4c, 0xb5, 0x48, 0xe3, - 0x47, 0x89, 0x49, 0xac, 0x85, 0x81, 0xa7, 0x11, 0x3b, 0x6d, 0x58, 0x86, - 0x34, 0x77, 0x73, 0xef, 0xf5, 0xb6, 0xc2, 0x9c, 0x64, 0xe7, 0x7d, 0xdb, - 0x0c, 0xd1, 0xb5, 0xb8, 0x6f, 0x3a, 0x29, 0x4c, 0xdd, 0xcb, 0xc3, 0x16, - 0xcd, 0xb5, 0x44, 0xce, 0xf4, 0x86, 0xf0, 0xa7, 0x0d, 0x64, 0x60, 0x88, - 0xb5, 0xda, 0x03, 0x69, 0x59, 0xe8, 0xf8, 0x88, 0x3d, 0x30, 0x6a, 0xde, - 0x05, 0xa0, 0xb2, 0x2e, 0x86, 0x90, 0x72, 0x78, 0x40, 0x30, 0xeb, 0xdb, - 0x44, 0x75, 0xee, 0x1e, 0x74, 0x41, 0xcb, 0x53, 0x71, 0x3e, 0x2b, 0xf5, - 0xb2, 0x94, 0x6c, 0xf8, 0x50, 0x30, 0x6d, 0x4b, 0x3f, 0x82, 0xb2, 0x9c, - 0x63, 0xe3, 0xae, 0x92, 0x23, 0xda, 0x92, 0x40, 0xb9, 0x59, 0xb6, 0x35, - 0x34, 0xb7, 0x6e, 0xda, 0xb6, 0x82, 0xa6, 0x6e, 0x2a, 0x15, 0xfb, 0x5a, - 0x88, 0xc4, 0x22, 0x91, 0x72, 0xe3, 0xc8, 0x48, 0xf5, 0x14, 0x7f, 0xbd, - 0xee, 0xee, 0x01, 0x6a, 0xc7, 0xe7, 0x3f, 0x2e, 0x88, 0xaa, 0x2a, 0xc7, - 0x5c, 0xe6, 0x50, 0x46, 0x48, 0xd6, 0x34, 0xf4, 0x1e, 0x94, 0xc9, 0xad, - 0xd5, 0x41, 0xb0, 0x7f, 0xa5, 0x0e, 0x79, 0x0d, 0x66, 0xc8, 0x7a, 0xff, - 0xc8, 0x0e, 0x93, 0x70, 0x31, 0x1b, 0xb0, 0xe7, 0x95, 0xfc, 0x4c, 0x75, - 0x8d, 0x1a, 0x79, 0x81, 0xe0, 0x6b, 0x58, 0xb6, 0xfd, 0x30, 0x69, 0xf6, - 0x11, 0xfa, 0x08, 0x2b, 0xc7, 0xf6, 0x5c, 0x16, 0xc1, 0x56, 0x7a, 0x4b, - 0x95, 0x16, 0xa0, 0x23, 0xa0, 0xf2, 0x1b, 0xb9, 0x77, 0x1f, 0x8b, 0x1e, - 0xf8, 0xd3, 0x49, 0xa1, 0xd3, 0x07, 0xbd, 0xa7, 0xba, 0xf4, 0xe6, 0x91, - 0x05, 0xae, 0x39, 0xf2, 0x5d, 0x8d, 0x2b, 0xfe, 0xf0, 0xb7, 0x19, 0xd5, - 0xa0, 0xae, 0x18, 0xf4, 0x4a, 0x3a, 0x2f, 0x44, 0x76, 0x29, 0xd5, 0x77, - 0xad, 0x5f, 0x31, 0xe3, 0xbc, 0xe0, 0x23, 0x8a, 0xbb, 0x43, 0x5b, 0xba, - 0x8b, 0xf4, 0xfe, 0xd0, 0xee, 0xcf, 0xdb, 0x2d, 0x3e, 0xa2, 0xc9, 0x9c, - 0x49, 0x4f, 0x94, 0x54, 0xf3, 0x4e, 0x26, 0x16, 0x1e, 0x48, 0x61, 0xd7, - 0x73, 0xe2, 0x9f, 0xdb, 0xde, 0xf7, 0xc5, 0x74, 0x66, 0x7f, 0xdf, 0x02, - 0x4d, 0x98, 0xf6, 0xfd, 0x05, 0x41, 0xf7, 0x11, 0x86, 0xd2, 0x37, 0x09, - 0xfa, 0xa8, 0xc3, 0x80, 0xab, 0x49, 0x8d, 0xde, 0x6e, 0x38, 0x55, 0x11, - 0xbb, 0x2d, 0x41, 0x62, 0x71, 0x9f, 0x53, 0x03, 0xee, 0x99, 0x79, 0xde, - 0x73, 0x45, 0xf5, 0x2c, 0x1e, 0xe1, 0xdd, 0x41, 0x75, 0xf1, 0x19, 0x64, - 0x4e, 0xb8, 0x73, 0x89, 0x88, 0x3a, 0xc5, 0x87, 0x1e, 0xa4, 0xcc, 0xb4, - 0x76, 0x09, 0x22, 0xc3, 0x63, 0x03, 0xe5, 0xc7, 0x5f, 0x4b, 0x96, 0x86, - 0xa9, 0xac, 0x09, 0x63, 0x4f, 0x66, 0xba, 0xac, 0x3d, 0x1e, 0x90, 0x4d, - 0x84, 0x10, 0xc7, 0xa2, 0x02, 0xd0, 0x60, 0x7a, 0x34, 0xca, 0xa3, 0xc8, - 0xdd, 0x7d, 0xd8, 0xa5, 0x4e, 0x11, 0x7d, 0xee, 0xca, 0x81, 0x62, 0x18, - 0xd0, 0x56, 0xfb, 0xe9, 0x8b, 0x1b, 0x2f, 0x3a, 0x0b, 0xcb, 0x3d, 0x63, - 0x4a, 0xbd, 0xb1, 0x17, 0xe4, 0xe6, 0x4b, 0xe9, 0xb1, 0xe7, 0xe5, 0x05, - 0xe6, 0x8e, 0x32, 0xe1, 0xfa, 0x42, 0xf4, 0x2a, 0x8b, 0x8d, 0x62, 0x30, - 0x05, 0xdf, 0xfb, 0xd2, 0xed, 0x86, 0x9c, 0xcf, 0x0d, 0x80, 0x64, 0xc9, - 0x67, 0x11, 0x58, 0x60, 0xfe, 0xd8, 0xb1, 0x38, 0xaa, 0x47, 0x88, 0x6e, - 0x95, 0x81, 0xca, 0xbf, 0x16, 0xf9, 0x6f, 0x4c, 0x3d, 0x44, 0xd1, 0x0d, - 0xbd, 0xed, 0x43, 0xc5, 0x79, 0x6d, 0xaa, 0xd9, 0xcf, 0x90, 0x44, 0x98, - 0x8b, 0xc7, 0x2e, 0xc3, 0x08, 0x62, 0x4c, 0xf5, 0x6c, 0x9d, 0xa7, 0x1e, - 0xac, 0x21, 0x98, 0x7b, 0x43, 0x0a, 0xed, 0x72, 0xd7, 0xbf, 0xbc, 0xf7, - 0x7c, 0xd3, 0x63, 0x2c, 0xbd, 0x0d, 0xb4, 0xae, 0x5f, 0xed, 0xca, 0xe7, - 0x6f, 0x89, 0x5f, 0xca, 0x6b, 0x16, 0xee, 0xb2, 0x22, 0xf7, 0x10, 0xf4, - 0x3e, 0x8b, 0x2f, 0x94, 0x15, 0xfb, 0x05, 0x36, 0x2d, 0x16, 0x25, 0xd1, - 0x58, 0xcc, 0xe7, 0x48, 0x4e, 0x22, 0xfd, 0xef, 0x11, 0x22, 0x57, 0x87, - 0x28, 0xd9, 0xe0, 0x4a, 0x9a, 0xf6, 0xc7, 0xe2, 0xcd, 0xf3, 0xf6, 0xcf, - 0x5a, 0x97, 0x3e, 0x8b, 0x3c, 0x11, 0x34, 0x04, 0x46, 0x34, 0x09, 0x34, - 0xc0, 0x31, 0xf4, 0xc5, 0xac, 0xf5, 0xb1, 0x59, 0xc4, 0x84, 0xec, 0xfb, - 0xad, 0xc6, 0xbe, 0xc5, 0x47, 0x54, 0x4e, 0xce, 0xc2, 0xf4, 0xf7, 0xe2, - 0xce, 0x08, 0x7a, 0x90, 0x55, 0x32, 0x44, 0x04, 0x9f, 0x39, 0x8e, 0x4e, - 0x7f, 0x0c, 0x64, 0x45, 0xe5, 0x8d, 0xf4, 0x7f, 0x8c, 0x5b, 0x48, 0x8e, - 0x12, 0x4c, 0xe6, 0x33, 0x31, 0xab, 0x9a, 0x9c, 0xd3, 0x5f, 0xfa, 0xca, - 0xb9, 0xdd, 0xbb, 0x35, 0x61, 0x1a, 0xa4, 0x79, 0x40, 0x93, 0x40, 0x19, - 0x71, 0x47, 0x69, 0x73, 0xe0, 0xee, 0xb1, 0x6c, 0x64, 0xcb, 0xab, 0xd2, - 0x02, 0x3c, 0xf5, 0xf5, 0x55, 0xe9, 0x7e, 0xf2, 0xd0, 0xac, 0xc1, 0x62, - 0xb0, 0x2f, 0xe2, 0x67, 0x4f, 0x4b, 0xb4, 0xa6, 0xfd, 0x64, 0x71, 0xaf, - 0xcf, 0x4b, 0x05, 0x55, 0x70, 0xca, 0xeb, 0x57, 0xea, 0xd8, 0x0a, 0x51, - 0x50, 0xb1, 0x4b, 0xaf, 0xc7, 0x1a, 0xf9, 0xfc, 0x36, 0x4d, 0xa6, 0x99, - 0x61, 0xbc, 0xe5, 0x11, 0x28, 0x3e, 0x74, 0x7d, 0xbf, 0xd0, 0x30, 0xf4, - 0xcf, 0xea, 0xed, 0x9e, 0xb1, 0x6e, 0x53, 0x01, 0x06, 0xee, 0x5d, 0x6c, - 0xc7, 0xb4, 0x47, 0x0a, 0xf5, 0x64, 0xba, 0x3f, 0xb3, 0xed, 0x07, 0x9b, - 0x95, 0x7c, 0x0e, 0x4a, 0x67, 0xc1, 0xf2, 0xcd, 0x2b, 0xa2, 0x5b, 0x36, - 0x09, 0x2d, 0x37, 0x36, 0xf3, 0xe0, 0x9a, 0x8d, 0xe4, 0xc5, 0x2c, 0xdc, - 0xf5, 0x7a, 0x22, 0x2d, 0xc8, 0x57, 0x3b, 0x6a, 0x17, 0xc2, 0x1a, 0x44, - 0x48, 0xfd, 0xa2, 0xd8, 0x15, 0x97, 0x7a, 0x15, 0x79, 0x75, 0xc3, 0x4a, - 0x53, 0x1e, 0xdd, 0xd0, 0x40, 0xb4, 0x62, 0xaa, 0x6d, 0x5e, 0xdc, 0xcd, - 0x70, 0x88, 0xc0, 0x42, 0x7e, 0x89, 0x72, 0x10, 0xfa, 0x49, 0xe6, 0x7a, - 0x3f, 0xf9, 0x94, 0x48, 0x6f, 0x20, 0x1e, 0x46, 0xf2, 0x38, 0xfe, 0x7b, - 0x57, 0x9c, 0x46, 0x53, 0xef, 0x40, 0x36, 0x20, 0x13, 0x42, 0xd5, 0xb2, - 0xd3, 0x73, 0xdb, 0x5d, 0xdd, 0x2a, 0x5e, 0xa8, 0x81, 0x13, 0x5e, 0xe2, - 0x6d, 0x10, 0x53, 0xaa, 0x0b, 0xe6, 0xf0, 0x34, 0x53, 0x3c, 0xb6, 0x9c, - 0xb7, 0x11, 0x9b, 0x41, 0xf0, 0xf1, 0x04, 0xc4, 0x57, 0xa8, 0x00, 0xb6, - 0xc3, 0x09, 0x4d, 0x79, 0xab, 0x74, 0x3e, 0xd6, 0x8a, 0x25, 0xb2, 0x38, - 0xd2, 0x79, 0x46, 0xb3, 0xda, 0x14, 0xc5, 0xf1, 0xb5, 0x45, 0xa1, 0xe0, - 0x0e, 0xcb, 0x7c, 0x12, 0x2a, 0x0d, 0x46, 0x8c, 0x1f, 0xc0, 0xfa, 0xf0, - 0x7d, 0xd1, 0xcc, 0x2f, 0xfc, 0x4f, 0x03, 0x94, 0x8d, 0xd2, 0xe7, 0x2c, - 0xc8, 0xf0, 0x6e, 0x8a, 0x44, 0x34, 0x92, 0xa3, 0xc0, 0xd0, 0xd8, 0x65, - 0xdc, 0xed, 0x42, 0x13, 0x47, 0x2a, 0xa5, 0x17, 0x33, 0xb5, 0x1b, 0xc1, - 0x7c, 0x7d, 0x0e, 0xb9, 0x97, 0x65, 0x50, 0xed, 0x3d, 0x89, 0x59, 0x8d, - 0xad, 0xf3, 0x3d, 0x86, 0x51, 0x05, 0xa9, 0xc8, 0xf5, 0x39, 0xae, 0x1c, - 0xd3, 0x6c, 0xae, 0x84, 0x29, 0x66, 0x3a, 0xbd, 0x45, 0x98, 0x39, 0x35, - 0x3c, 0xfd, 0xc4, 0xd6, 0x57, 0xd6, 0x83, 0x6b, 0xc3, 0x81, 0x5c, 0xb0, - 0x35, 0x8f, 0xfd, 0x65, 0x08, 0xc2, 0x82, 0xca, 0x15, 0xe1, 0x9d, 0x75, - 0xec, 0x14, 0x36, 0x28, 0xce, 0x94, 0xf4, 0x9d, 0x10, 0x42, 0x16, 0xd6, - 0x1e, 0x80, 0x77, 0x95, 0xc2, 0x2e, 0xf7, 0x0e, 0x8f, 0x95, 0x9c, 0xa8, - 0x2b, 0xa8, 0x51, 0x26, 0x38, 0x2e, 0xa5, 0x25, 0x6f, 0x34, 0xf1, 0x9f, - 0x0c, 0x82, 0x95, 0x9c, 0x77, 0xe3, 0xec, 0xf1, 0x2c, 0x34, 0xa7, 0x34, - 0x6c, 0x71, 0x89, 0xad, 0x99, 0xe1, 0x52, 0x00, 0x3e, 0x97, 0x89, 0xe4, - 0xb8, 0x24, 0x54, 0x28, 0x14, 0x12, 0x44, 0x15, 0x80, 0x2f, 0xe3, 0xb2, - 0xd2, 0xe4, 0x6f, 0xda, 0x63, 0x37, 0x34, 0x7e, 0xa3, 0xde, 0xb1, 0xdd, - 0xd9, 0x4b, 0x82, 0x57, 0x49, 0x60, 0x10, 0x08, 0x0e, 0x74, 0xd0, 0xdc, - 0x4a, 0x63, 0x14, 0x89, 0x06, 0x3d, 0x12, 0xf2, 0x64, 0x8a, 0x85, 0xde, - 0x21, 0xbc, 0xb7, 0x9b, 0x2e, 0xc6, 0x14, 0xcd, 0x1f, 0x42, 0x15, 0x82, - 0x3f, 0x02, 0xc4, 0x43, 0x1b, 0xf5, 0xab, 0x89, 0xd0, 0xbd, 0x1e, 0x18, - 0x2e, 0x3e, 0x2e, 0x78, 0x11, 0x47, 0x4d, 0x07, 0x95, 0xea, 0x10, 0x87, - 0x7b, 0x05, 0xa7, 0xe5, 0xb2, 0xad, 0xb6, 0xec, 0x9e, 0xde, 0x9c, 0x37, - 0xa0, 0xf4, 0x2c, 0xf2, 0xbb, 0x77, 0x38, 0xa4, 0x43, 0xe6, 0x9d, 0x41, - 0x25, 0xf3, 0xcb, 0x5c, 0x85, 0xb9, 0x76, 0x2b, 0x77, 0xc0, 0x84, 0x89, - 0xcb, 0x9d, 0xd9, 0x01, 0xa9, 0x65, 0xd0, 0x0b, 0xd8, 0x83, 0x0d, 0xc8, - 0x85, 0x34, 0x11, 0x30, 0x1e, 0xde, 0xb8, 0x66, 0x47, 0x94, 0x3f, 0x79, - 0xd3, 0x12, 0x02, 0x1b, 0xba, 0x54, 0xfa, 0x29, 0x74, 0x4c, 0xe7, 0x14, - 0x14, 0x46, 0x8e, 0x53, 0xcb, 0xa8, 0xbb, 0x2e, 0xf5, 0x50, 0x92, 0x6c, - 0xb1, 0xa3, 0x69, 0x7a, 0x59, 0xb2, 0xa2, 0xdb, 0x55, 0x78, 0xff, 0x20, - 0x9f, 0x47, 0x8a, 0x63, 0xdd, 0x2e, 0xad, 0xfa, 0xcc, 0x7d, 0x66, 0x25, - 0xf6, 0x8f, 0x8a, 0x20, 0x14, 0xb1, 0xfa, 0x24, 0x9b, 0x02, 0x75, 0x70, - 0xb5, 0x35, 0xfd, 0xea, 0x65, 0x3b, 0xc0, 0x99, 0x3d, 0x31, 0x73, 0xeb, - 0x2e, 0x61, 0x0d, 0xc1, 0x19, 0x29, 0x30, 0x39, 0x83, 0x34, 0x84, 0x94, - 0x77, 0x8f, 0x12, 0x08, 0x11, 0x38, 0x6f, 0xfc, 0xb4, 0xee, 0xda, 0xe9, - 0x35, 0x13, 0x00, 0xa5, 0x02, 0xfd, 0x82, 0x9b, 0xc5, 0x55, 0x89, 0x1e, - 0x0f, 0x23, 0x0c, 0xd7, 0x69, 0x8b, 0xcf, 0x3a, 0x88, 0x78, 0x10, 0xbf, - 0x6c, 0xdf, 0xb0, 0x39, 0x49, 0xd8, 0xf9, 0xae, 0x24, 0x6b, 0xf1, 0x79, - 0x12, 0x7c, 0x1f, 0x68, 0x8a, 0x3d, 0x54, 0x7b, 0x1c, 0xf7, 0x87, 0x6c, - 0x2b, 0x28, 0xb1, 0xf1, 0x4f, 0xaf, 0x66, 0xf9, 0x89, 0x4d, 0x5e, 0xb7, - 0x0b, 0x2a, 0x8b, 0xea, 0x1e, 0x9b, 0x95, 0xd9, 0x81, 0xff, 0xc3, 0x44, - 0xae, 0xf7, 0xb9, 0x94, 0x0a, 0xdd, 0x67, 0xbd, 0x09, 0xc0, 0x31, 0x1c, - 0xfd, 0x9d, 0xc0, 0xfd, 0xb0, 0xd0, 0xd9, 0x73, 0xbf, 0x46, 0x4f, 0xf0, - 0x53, 0x94, 0x7b, 0x77, 0x7d, 0x20, 0x00, 0x5b, 0xed, 0xea, 0x13, 0x89, - 0x9f, 0x23, 0x5f, 0x63, 0x7a, 0xb3, 0x89, 0x3d, 0x4b, 0x9a, 0x57, 0xf6, - 0x22, 0xe1, 0x1d, 0xcd, 0x86, 0xd0, 0x9e, 0x69, 0x08, 0xb7, 0xe5, 0xbe, - 0xb8, 0x16, 0x8f, 0xed, 0x72, 0xda, 0x51, 0xf7, 0x71, 0xe7, 0xc7, 0x5d, - 0x8e, 0xdd, 0x3f, 0x32, 0xe2, 0x7b, 0x40, 0x86, 0x8a, 0x9c, 0x39, 0x88, - 0x7d, 0x1e, 0x0c, 0xde, 0x9d, 0xf4, 0xf3, 0x3f, 0xd1, 0x30, 0xd4, 0x57, - 0x1c, 0x4e, 0x29, 0x6b, 0x46, 0x80, 0x87, 0x5c, 0xd2, 0x88, 0xb8, 0x64, - 0x8a, 0x26, 0x6b, 0x75, 0xf2, 0x79, 0xee, 0x5f, 0xf6, 0x21, 0xf3, 0x26, - 0x63, 0xb4, 0x38, 0xc0, 0xfb, 0x24, 0x28, 0x33, 0x28, 0xc7, 0x87, 0x53, - 0x85, 0x69, 0xe6, 0x36, 0x86, 0x0b, 0xca, 0x9c, 0x7b, 0xab, 0xd3, 0x40, - 0xc8, 0xa4, 0xae, 0xb4, 0xb9, 0x4e, 0xdf, 0xd3, 0x6f, 0x46, 0x5f, 0x85, - 0xf2, 0xd6, 0x38, 0xa1, 0xfa, 0xbd, 0x9e, 0xaa, 0x79, 0x39, 0x57, 0x84, - 0xb4, 0xb8, 0x58, 0x67, 0x24, 0x94, 0x2f, 0xc4, 0x6e, 0x8c, 0xb9, 0x91, - 0xe4, 0xfe, 0xaf, 0x61, 0x7d, 0x27, 0x4c, 0x8b, 0xa8, 0x57, 0xf2, 0x4a, - 0x6c, 0xc0, 0x15, 0x35, 0x25, 0xf6, 0xf2, 0x75, 0xb6, 0xcc, 0xaf, 0x45, - 0x7c, 0x86, 0xd5, 0xda, 0xde, 0x55, 0x0a, 0xe6, 0x89, 0xdf, 0x38, 0x7b, - 0x5f, 0x59, 0x6a, 0xd4, 0x85, 0xdf, 0xc7, 0xc7, 0xc9, 0x50, 0xf5, 0xe9, - 0xee, 0x44, 0xe8, 0xa0, 0x41, 0x39, 0x6c, 0xf9, 0x8c, 0xc4, 0xb6, 0x7a, - 0x50, 0x5c, 0xb9, 0xc9, 0x10, 0xa8, 0x24, 0xf9, 0xe7, 0x1c, 0xd8, 0xa5, - 0x95, 0x55, 0xa3, 0x91, 0x18, 0x01, 0xa9, 0x08, 0x51, 0x72, 0x1c, 0xe3, - 0xa2, 0xe9, 0x55, 0x68, 0x4c, 0xd3, 0xd9, 0xdf, 0xef, 0xec, 0xcb, 0xba, - 0x39, 0x81, 0x26, 0x4f, 0xb0, 0xd2, 0xd1, 0x68, 0xa3, 0x6d, 0x49, 0x78, - 0x81, 0x75, 0x97, 0xf9, 0x41, 0xa6, 0x69, 0x50, 0x1b, 0xe6, 0xfa, 0x04, - 0x35, 0x08, 0x13, 0x84, 0x1b, 0xfb, 0x6c, 0xa0, 0x9d, 0x64, 0xe5, 0x26, - 0x75, 0x8d, 0xa3, 0xcd, 0x0b, 0x79, 0x30, 0xd4, 0x3b, 0xac, 0x4e, 0xac, - 0x54, 0x59, 0x5f, 0xb9, 0x76, 0x14, 0x2e, 0x1d, 0xdc, 0x6e, 0x30, 0xc8, - 0x83, 0xf9, 0x92, 0x5c, 0x92, 0xc7, 0x75, 0x3c, 0x49, 0xd5, 0x60, 0x12, - 0xf5, 0x02, 0x59, 0xe5, 0x11, 0x44, 0xa2, 0x83, 0x6a, 0x02, 0x47, 0x05, - 0x3d, 0xba, 0x11, 0x3f, 0x20, 0x9a, 0x76, 0x91, 0x6c, 0xf3, 0xac, 0x07, - 0xb6, 0xf2, 0xa9, 0x41, 0x86, 0xd5, 0xb7, 0xa3, 0xaf, 0x1d, 0xd0, 0xfb, - 0x30, 0xfb, 0xa3, 0x6c, 0x92, 0x40, 0x70, 0xff, 0xe1, 0xb3, 0xb1, 0xd4, - 0xfc, 0xa6, 0x21, 0x6f, 0x2d, 0x98, 0x9d, 0x72, 0x7d, 0xad, 0xcc, 0x83, - 0xe8, 0x54, 0xe3, 0x38, 0x07, 0x2e, 0xb3, 0x0f, 0x22, 0xc2, 0x04, 0xff, - 0x5b, 0x18, 0x57, 0x65, 0xef, 0x20, 0xdb, 0x14, 0x00, 0xd2, 0xd3, 0x6b, - 0x5e, 0x8e, 0x5f, 0xdf, 0xa5, 0xd3, 0xbe, 0x26, 0xa6, 0xf9, 0x13, 0x12, - 0x7b, 0x7e, 0xcd, 0x3a, 0x09, 0x97, 0xd4, 0xdc, 0x29, 0x93, 0x17, 0xba, - 0x14, 0xe2, 0xd0, 0x2b, 0xf4, 0x5d, 0x7f, 0x10, 0x3b, 0xb6, 0x77, 0x26, - 0xc7, 0x6e, 0x6c, 0x6f, 0x8c, 0x8a, 0x0d, 0x7f, 0x76, 0xa3, 0x78, 0x44, - 0x48, 0x32, 0xe4, 0x8f, 0x15, 0x74, 0x9a, 0xb3, 0xf8, 0x42, 0xd1, 0xb4, - 0x8e, 0x7b, 0x0e, 0x4b, 0x67, 0x39, 0x26, 0x52, 0x43, 0x11, 0x3c, 0xbf, - 0x26, 0x27, 0xa7, 0x31, 0xb5, 0x3e, 0x58, 0x57, 0x8e, 0x0f, 0xcc, 0x59, - 0xd1, 0x05, 0xde, 0x5f, 0x89, 0xc8, 0x93, 0x3c, 0xe7, 0xf1, 0xed, 0x07, - 0x76, 0x8f, 0x2b, 0xcc, 0x5f, 0x45, 0xcf, 0x7b, 0xb4, 0xed, 0x0a, 0xce, - 0x9a, 0x5c, 0xd0, 0xa7, 0x91, 0xb3, 0x75, 0xfe, 0x59, 0x84, 0x0d, 0xb3, - 0x56, 0x4a, 0x95, 0xeb, 0x17, 0x3b, 0x04, 0x73, 0xf2, 0x6e, 0x5f, 0x92, - 0x4f, 0x93, 0xe0, 0x3a, 0x56, 0x57, 0x83, 0x83, 0x9e, 0x50, 0x22, 0x8c, - 0x39, 0x64, 0xa6, 0x33, 0x14, 0x4e, 0xe8, 0xdf, 0x1f, 0x37, 0x66, 0x25, - 0xb6, 0xe9, 0x40, 0xbd, 0x8a, 0xa6, 0x42, 0xdf, 0x54, 0x2b, 0xb1, 0x05, - 0xd6, 0x6d, 0x9f, 0x5f, 0x84, 0xaf, 0x9c, 0x62, 0x52, 0xea, 0x3f, 0xa7, - 0xdd, 0xf7, 0x72, 0x29, 0x29, 0x04, 0x04, 0xd0, 0xf3, 0xdd, 0x6b, 0x4c, - 0x47, 0x2e, 0x0c, 0xbe, 0xed, 0x6d, 0xf6, 0xef, 0x6b, 0x60, 0x96, 0xec, - 0xb7, 0x03, 0x1f, 0xf9, 0x22, 0x40, 0x64, 0x01, 0xb0, 0x47, 0x40, 0xb0, - 0x07, 0x65, 0x57, 0x3a, 0x97, 0xd2, 0x4c, 0x4d, 0x4d, 0x36, 0xe6, 0x6f, - 0x5d, 0x3b, 0xef, 0xa6, 0x1a, 0xee, 0xc7, 0x53, 0xb3, 0xd1, 0x34, 0xf4, - 0xf0, 0x4d, 0x37, 0xdb, 0x7f, 0xeb, 0x14, 0x04, 0xd5, 0xd1, 0x0e, 0x1b, - 0x1a, 0xe9, 0x6e, 0x28, 0x18, 0xec, 0xb0, 0x84, 0xbb, 0x41, 0xb8, 0x4f, - 0xd4, 0xbe, 0x69, 0x98, 0x2d, 0x63, 0x7f, 0x70, 0x2b, 0x6f, 0xe2, 0xb2, - 0x10, 0x8d, 0x64, 0x29, 0xa5, 0x84, 0x62, 0xfc, 0x17, 0xa5, 0x80, 0x3f, - 0xd7, 0xe3, 0x12, 0xca, 0x72, 0x5b, 0xb0, 0xab, 0xde, 0x09, 0xbf, 0x21, - 0x78, 0xbf, 0xdc, 0x64, 0xfb, 0xbf, 0x6c, 0x73, 0x08, 0x96, 0xb8, 0x89, - 0xdc, 0xf7, 0x43, 0xda, 0x26, 0x75, 0x5b, 0x75, 0x8b, 0x20, 0x6f, 0xbc, - 0x59, 0x14, 0x26, 0xd6, 0x3c, 0xb0, 0xa4, 0xc5, 0x83, 0xe8, 0xb0, 0xda, - 0xb7, 0x40, 0xf8, 0xc0, 0x81, 0x3a, 0x2d, 0x65, 0xee, 0xa4, 0xf7, 0x2c, - 0x63, 0x88, 0xa3, 0x47, 0x81, 0x8e, 0xf8, 0x48, 0x95, 0xe1, 0xc0, 0x87, - 0xc4, 0x91, 0x1a, 0xd3, 0xc8, 0xca, 0xc4, 0x35, 0x98, 0x70, 0xdd, 0xc0, - 0x75, 0x7f, 0xac, 0x0a, 0xe5, 0xdd, 0xfa, 0x88, 0x25, 0xe0, 0x98, 0x03, - 0x13, 0x92, 0x3e, 0x58, 0x99, 0x23, 0x6c, 0x9a, 0x0b, 0x0b, 0x3f, 0xe6, - 0x3a, 0x70, 0x3e, 0xb6, 0x86, 0x1d, 0x06, 0x74, 0x0f, 0x06, 0xbc, 0x83, - 0x44, 0x52, 0xaf, 0x30, 0x54, 0xf6, 0xd8, 0x3f, 0x83, 0x24, 0x25, 0x1d, - 0x41, 0xca, 0x0e, 0x22, 0x66, 0x21, 0xa1, 0x8d, 0x1d, 0x94, 0xb4, 0x14, - 0xf4, 0xc0, 0x61, 0x51, 0x62, 0x88, 0xe1, 0xa0, 0xdb, 0xaa, 0xed, 0x8c, - 0xc4, 0x9d, 0xdf, 0x54, 0xf8, 0x19, 0x31, 0xae, 0xb5, 0x6a, 0x43, 0xa6, - 0xf2, 0x2c, 0x2c, 0xb3, 0x3c, 0x4a, 0x0a, 0x5a, 0xcd, 0xac, 0x1d, 0xd0, - 0x32, 0x15, 0xc9, 0x36, 0xd7, 0x52, 0x1a, 0xa1, 0x14, 0x96, 0xaa, 0x6f, - 0xb5, 0x74, 0x8e, 0x76, 0xcb, 0x4e, 0x4c, 0x5b, 0x19, 0x38, 0xb3, 0x2d, - 0x9b, 0xf0, 0x87, 0x16, 0x94, 0xac, 0x2a, 0xd0, 0xfa, 0xde, 0x0d, 0xa7, - 0xce, 0x1f, 0xa3, 0x8e, 0xb0, 0xda, 0x5b, 0xe8, 0x5a, 0x3d, 0x02, 0xc1, - 0x07, 0x23, 0x6c, 0x62, 0xf1, 0x0f, 0x52, 0x8b, 0xa5, 0x9e, 0xb6, 0x4d, - 0x32, 0xe3, 0x69, 0x16, 0x55, 0x76, 0x85, 0x35, 0xdc, 0x20, 0x93, 0xf3, - 0x72, 0x13, 0x53, 0x77, 0xd8, 0x96, 0x8b, 0x01, 0xdd, 0xde, 0x6a, 0x15, - 0x6b, 0x8c, 0xa4, 0x7d, 0xc7, 0xbb, 0x54, 0x54, 0x4b, 0x83, 0x08, 0x48, - 0x63, 0xaf, 0x28, 0x42, 0x40, 0x56, 0xe8, 0xdd, 0x62, 0x35, 0x5c, 0x6a, - 0x0b, 0x09, 0x61, 0x68, 0x4b, 0xa8, 0xd8, 0xec, 0x2c, 0x3c, 0x54, 0xee, - 0x29, 0x58, 0xd1, 0x6b, 0x26, 0xe0, 0x5c, 0x30, 0x58, 0xb0, 0x4e, 0x22, - 0xd9, 0x7f, 0xf6, 0x7a, 0x0e, 0x91, 0xd5, 0x23, 0x9e, 0xac, 0x75, 0x2b, - 0x65, 0x31, 0xe1, 0x97, 0xcc, 0x31, 0xd7, 0xfe, 0x68, 0x70, 0xab, 0x2c, - 0x57, 0x12, 0xc9, 0xa3, 0x95, 0x6a, 0xf0, 0x8a, 0x80, 0x7c, 0x54, 0xcf, - 0x45, 0xa4, 0xa9, 0x64, 0x4a, 0xf0, 0xe5, 0xb5, 0x9d, 0xce, 0xb5, 0x3e, - 0xe8, 0xb3, 0x16, 0xf5, 0x8f, 0xb5, 0xf8, 0x6c, 0xb8, 0xf7, 0xf9, 0x82, - 0x85, 0x54, 0x3d, 0x4b, 0xf7, 0x9e, 0x92, 0x59, 0xdf, 0x2c, 0xc9, 0x40, - 0x0a, 0xd3, 0x33, 0x59, 0xad, 0x3e, 0x9c, 0x74, 0x44, 0x7f, 0xce, 0x2c, - 0xdf, 0xb3, 0xfa, 0x97, 0x3b, 0xe2, 0xa1, 0xa0, 0x68, 0x07, 0x08, 0x3c, - 0x1c, 0x79, 0xfc, 0x7f, 0xfe, 0xfa, 0x1d, 0x47, 0xc0, 0x50, 0x6d, 0xb6, - 0xc8, 0x3c, 0xda, 0x84, 0x95, 0x1d, 0xd3, 0x43, 0x85, 0x4c, 0x05, 0x5a, - 0x75, 0x9d, 0xef, 0x58, 0xf0, 0x91, 0xb7, 0x26, 0xd2, 0xaa, 0xe7, 0xc2, - 0xf9, 0xe6, 0x5e, 0x9c, 0x91, 0x41, 0xcf, 0xbc, 0x7a, 0x78, 0x93, 0x94, - 0x07, 0x20, 0xff, 0xcc, 0x8f, 0x50, 0x22, 0xaf, 0xcf, 0xe5, 0xea, 0x4f, - 0x82, 0x02, 0xcf, 0xfa, 0x14, 0xc3, 0x28, 0x91, 0xc3, 0x06, 0x3b, 0xbd, - 0x36, 0x9b, 0xbb, 0xba, 0x82, 0x6d, 0x95, 0xe1, 0x86, 0x02, 0x71, 0x01, - 0x32, 0xed, 0x69, 0x77, 0x73, 0x0c, 0xeb, 0xb0, 0x8f, 0x02, 0xa0, 0xf5, - 0x1a, 0xcb, 0xda, 0x4b, 0x9b, 0x7e, 0x11, 0x5c, 0x50, 0xfe, 0x15, 0x95, - 0x7b, 0x58, 0x7e, 0x31, 0xf2, 0x88, 0x85, 0xa2, 0xc6, 0x1b, 0xfd, 0x4a, - 0xb4, 0xab, 0x30, 0x24, 0x7c, 0x7b, 0x42, 0x21, 0xab, 0x18, 0x40, 0x2a, - 0x81, 0xef, 0x5d, 0xca, 0x87, 0xcc, 0x6f, 0x47, 0x4e, 0xef, 0xd5, 0xe7, - 0x26, 0xf3, 0xbd, 0x29, 0xa9, 0xd7, 0x5d, 0xd4, 0x16, 0x75, 0x37, 0x87, - 0x83, 0x7e, 0xb9, 0x84, 0x1c, 0x54, 0x72, 0x15, 0xd8, 0x89, 0x63, 0xe1, - 0x73, 0x4c, 0x5e, 0x86, 0x52, 0x6d, 0xd7, 0x56, 0x0e, 0x1a, 0x6f, 0x01, - 0x7a, 0x9b, 0x15, 0x2e, 0xd9, 0x34, 0xa5, 0x25, 0xcc, 0xce, 0xf0, 0xf4, - 0xfe, 0x1c, 0xee, 0x09, 0x7f, 0xd5, 0xf6, 0xd8, 0x9b, 0x20, 0xd8, 0x7d, - 0x96, 0xe8, 0xec, 0x67, 0xda, 0x00, 0x3d, 0x2f, 0xe4, 0x42, 0xb8, 0x70, - 0x7d, 0x5c, 0xb3, 0x6f, 0x9d, 0xef, 0x23, 0x07, 0x47, 0x6a, 0x3d, 0x9d, - 0x80, 0x97, 0x7a, 0xa2, 0xc9, 0x9f, 0x14, 0x70, 0x95, 0xa7, 0xf5, 0x94, - 0xab, 0x29, 0xda, 0x22, 0x01, 0x95, 0x82, 0x52, 0x7f, 0x44, 0xd4, 0x6a, - 0x80, 0x95, 0xf9, 0x62, 0x81, 0x06, 0x52, 0xb1, 0xa7, 0x02, 0xbe, 0x57, - 0x80, 0xfe, 0x54, 0x43, 0x3c, 0xae, 0x75, 0xab, 0x1c, 0x39, 0xa4, 0xca, - 0x26, 0x88, 0xf1, 0x00, 0x6b, 0x23, 0x59, 0x90, 0xdd, 0x55, 0xb0, 0x06, - 0x39, 0x21, 0xc8, 0x7b, 0xf2, 0xc0, 0xc0, 0x1f, 0x1e, 0xa4, 0x0e, 0x91, - 0xe3, 0x3e, 0x6b, 0x96, 0xa0, 0xe8, 0x3a, 0xec, 0xbd, 0xa4, 0x8e, 0xaf, - 0x93, 0x2f, 0x5d, 0x7e, 0xe2, 0xda, 0x77, 0xd2, 0xd6, 0x1f, 0x8b, 0xcf, - 0x7f, 0x06, 0x8c, 0x01, 0xc5, 0xf9, 0x6a, 0x13, 0x8c, 0xbd, 0xa9, 0x55, - 0x51, 0x56, 0x16, 0xd1, 0xd4, 0xc6, 0xce, 0xb4, 0x56, 0x65, 0xa1, 0xf7, - 0xcb, 0x88, 0x82, 0x2f, 0x30, 0x93, 0x19, 0xc4, 0x3c, 0x2d, 0x85, 0x9b, - 0x35, 0x0e, 0xd9, 0x9e, 0x47, 0xc3, 0xff, 0xad, 0x2e, 0x9b, 0xbc, 0x7d, - 0x9b, 0x40, 0x44, 0x09, 0x85, 0xa8, 0x2d, 0x2d, 0xaf, 0x9c, 0x49, 0xd3, - 0x70, 0xb9, 0x62, 0x52, 0xbc, 0x57, 0xb7, 0x23, 0xb2, 0xef, 0xda, 0xda, - 0xbd, 0x97, 0xbf, 0xd0, 0x80, 0x08, 0x91, 0xe8, 0xed, 0x2d, 0xad, 0x75, - 0x37, 0x70, 0x35, 0xd4, 0x16, 0xb7, 0xd8, 0x4b, 0xff, 0x32, 0xe6, 0x2b, - 0xa6, 0x7c, 0x32, 0xc9, 0xb4, 0x72, 0x9d, 0x84, 0x69, 0x89, 0x00, 0xf3, - 0x08, 0xa5, 0x25, 0xe4, 0x15, 0x1a, 0xdb, 0xf6, 0xc0, 0x3c, 0x88, 0x81, - 0x48, 0x75, 0x5f, 0x43, 0x19, 0xcb, 0x84, 0xb6, 0x92, 0x6e, 0x3f, 0x82, - 0x2e, 0xce, 0xcc, 0x42, 0xc7, 0xa2, 0x5a, 0x7d, 0x69, 0x81, 0x13, 0x7a, - 0xb3, 0x2f, 0x07, 0x80, 0x94, 0x5f, 0x13, 0x07, 0xef, 0x2a, 0xc0, 0xbd, - 0x5b, 0xf9, 0x45, 0xe5, 0x87, 0xfe, 0x4e, 0x76, 0x42, 0x2c, 0x92, 0x1c, - 0x22, 0xae, 0x94, 0x0e, 0x78, 0xcd, 0x95, 0x7d, 0x26, 0xef, 0x18, 0x4a, - 0x18, 0x7d, 0x88, 0xc5, 0x9a, 0x44, 0x7c, 0x79, 0x85, 0x67, 0x0f, 0x97, - 0xb5, 0x13, 0x0f, 0x53, 0xf6, 0xeb, 0x8e, 0x6a, 0x3e, 0x5f, 0xd9, 0x2d, - 0xec, 0x12, 0xad, 0xfe, 0xe2, 0x95, 0x00, 0xe9, 0x7f, 0x44, 0xb5, 0x51, - 0x8c, 0x08, 0xc2, 0x77, 0xac, 0x2c, 0xf4, 0x9f, 0xd8, 0x5b, 0x46, 0x7c, - 0x78, 0x58, 0xb3, 0x71, 0xcc, 0xcd, 0xc7, 0x27, 0xef, 0x5f, 0x93, 0x55, - 0xfe, 0x14, 0xc8, 0x22, 0xde, 0xca, 0x05, 0x4d, 0x95, 0x39, 0x25, 0x88, - 0x26, 0xd6, 0xcd, 0x25, 0xa6, 0xda, 0x88, 0xc1, 0x1a, 0x7f, 0xb9, 0xdc, - 0x07, 0x28, 0x8d, 0xb9, 0xc5, 0x9a, 0x75, 0xd2, 0x9a, 0x53, 0x06, 0x6c, - 0x50, 0xf9, 0x34, 0x93, 0xce, 0xfc, 0xe0, 0x66, 0x9c, 0xa9, 0x43, 0x73, - 0x40, 0x44, 0xbb, 0x98, 0xea, 0xfb, 0x5f, 0x3f, 0x65, 0x4d, 0x76, 0xc5, - 0xff, 0x3c, 0x75, 0xa7, 0x29, 0xec, 0xfd, 0xe9, 0x9e, 0xa5, 0x2d, 0x03, - 0x09, 0x0f, 0x62, 0xdb, 0x51, 0x7f, 0x3f, 0x25, 0xd6, 0xb7, 0x97, 0xe3, - 0x4e, 0x41, 0x86, 0xe4, 0xbe, 0x3e, 0xaf, 0x2c, 0xbe, 0x35, 0xf4, 0xa5, - 0x79, 0x15, 0x4b, 0x12, 0xd3, 0x5b, 0x66, 0xdf, 0xa2, 0x8d, 0xa5, 0x61, - 0x13, 0xda, 0x60, 0x99, 0xed, 0xf0, 0x3e, 0xd6, 0xb0, 0x28, 0xd4, 0xb7, - 0x99, 0xa9, 0x6f, 0x6f, 0x59, 0x06, 0x01, 0x9c, 0x56, 0x52, 0xe5, 0x82, - 0x05, 0xb1, 0x01, 0xf3, 0xa9, 0xce, 0xd4, 0x0a, 0x4f, 0x91, 0x7e, 0xa4, - 0x1c, 0x11, 0x89, 0xcc, 0xf0, 0xc7, 0x5b, 0x7d, 0xc8, 0x26, 0x37, 0x23, - 0x52, 0x23, 0x97, 0xf9, 0x3f, 0x9a, 0x98, 0x0d, 0xc6, 0x47, 0xfb, 0x86, - 0x9e, 0xca, 0x8c, 0x66, 0xad, 0x75, 0x44, 0x55, 0xea, 0xb7, 0x5a, 0xbd, - 0xf4, 0x45, 0x7a, 0xdb, 0x4d, 0x99, 0x20, 0x24, 0x33, 0x7e, 0x83, 0x06, - 0xc6, 0xc1, 0xf1, 0xe2, 0x0a, 0xcf, 0x0e, 0x41, 0xce, 0x20, 0xf5, 0xaa, - 0x59, 0x9b, 0x9e, 0x7f, 0x08, 0x7d, 0xd9, 0xec, 0x9d, 0xa8, 0xba, 0x53, - 0xe1, 0x3a, 0x14, 0xea, 0x71, 0x6c, 0x17, 0x4d, 0xb1, 0x37, 0x2c, 0x58, - 0x6b, 0x4f, 0x46, 0xc7, 0x32, 0xfa, 0x61, 0xc6, 0x31, 0x90, 0x99, 0x4f, - 0x51, 0x22, 0xc7, 0x23, 0x7d, 0xe8, 0xef, 0xa2, 0xc2, 0xc1, 0x4d, 0x1c, - 0xb2, 0xb8, 0xee, 0x1c, 0x4a, 0xf0, 0xa6, 0x07, 0x3b, 0x69, 0xe0, 0x33, - 0xc5, 0x41, 0x17, 0xeb, 0xd1, 0x33, 0xf3, 0xf8, 0x97, 0xb7, 0x91, 0x72, - 0x01, 0x8b, 0xeb, 0x9f, 0x77, 0x2d, 0x13, 0xa9, 0xb3, 0x1c, 0x72, 0xe6, - 0x87, 0x3a, 0xbf, 0xfd, 0x99, 0x74, 0x7b, 0x9c, 0x50, 0x1d, 0xd6, 0x4a, - 0x8b, 0xad, 0x86, 0x9a, 0x78, 0xa7, 0x41, 0x2b, 0x77, 0x05, 0x14, 0x8d, - 0xeb, 0x37, 0xbb, 0x13, 0xa3, 0x59, 0x3f, 0xd1, 0xa5, 0x83, 0xeb, 0xf1, - 0x6c, 0xf0, 0x53, 0xb0, 0x6d, 0x45, 0x4b, 0x78, 0xb3, 0xea, 0x45, 0x4b, - 0x38, 0x8d, 0x72, 0xe4, 0x8a, 0x42, 0x46, 0x8e, 0x00, 0x42, 0xcd, 0x68, - 0x2e, 0xf7, 0x15, 0x68, 0xff, 0xec, 0x22, 0x24, 0x32, 0x0a, 0xd6, 0x21, - 0x08, 0x1c, 0x0f, 0x08, 0x0f, 0x9c, 0x38, 0x98, 0xaa, 0x6e, 0xb2, 0xf2, - 0x01, 0xaa, 0x13, 0xe7, 0x10, 0xfc, 0xda, 0xe4, 0x90, 0x53, 0x32, 0x92, - 0xf5, 0x68, 0xdb, 0xd8, 0xdf, 0xf7, 0xc0, 0x93, 0x99, 0x5c, 0x96, 0x5b, - 0xd6, 0x55, 0xf5, 0x27, 0xc2, 0xd3, 0x3f, 0xfc, 0x3d, 0x18, 0x49, 0x0a, - 0xfe, 0x89, 0x15, 0x69, 0xee, 0x08, 0x5b, 0x4a, 0x5b, 0x26, 0x06, 0xa7, - 0x22, 0x9f, 0xb9, 0x88, 0x7f, 0xf5, 0x2c, 0x8d, 0x8f, 0xe2, 0xb7, 0x0c, - 0xdb, 0xa1, 0x2c, 0x18, 0x2d, 0x64, 0x75, 0x3d, 0xaa, 0xe4, 0xba, 0xf1, - 0x8b, 0x6a, 0x2d, 0x55, 0x75, 0xb0, 0xa3, 0xbf, 0x5f, 0x57, 0x6b, 0xac, - 0x99, 0x30, 0x09, 0x2c, 0x16, 0x23, 0x77, 0xdd, 0x13, 0x88, 0xb5, 0xf5, - 0xe4, 0x9a, 0x23, 0x14, 0xbf, 0xfc, 0x82, 0xc9, 0x23, 0x95, 0x77, 0xf6, - 0x73, 0x09, 0x17, 0x04, 0x09, 0xaa, 0x96, 0x6a, 0x90, 0x92, 0x15, 0x87, - 0x5f, 0x8a, 0xb5, 0x14, 0x10, 0x95, 0xa1, 0xbb, 0x65, 0x98, 0x09, 0x35, - 0x3d, 0x15, 0x27, 0x62, 0xb0, 0x53, 0xf6, 0xfa, 0x57, 0x8f, 0x37, 0xb9, - 0xac, 0x08, 0xd7, 0xe5, 0x0c, 0x8e, 0x06, 0xe9, 0x85, 0x33, 0x71, 0x11, - 0x30, 0xe8, 0x09, 0x37, 0xa0, 0xea, 0x5b, 0xed, 0x9d, 0x48, 0x61, 0x19, - 0x27, 0xf8, 0x02, 0x3e, 0x5d, 0x40, 0x82, 0x7f, 0x8a, 0x52, 0x1a, 0x94, - 0x20, 0xa0, 0x5e, 0x25, 0x8a, 0xef, 0x65, 0x6e, 0x62, 0x05, 0x97, 0xb9, - 0xd7, 0x65, 0xd2, 0x01, 0x31, 0xfc, 0xc9, 0x38, 0x25, 0xcc, 0xa6, 0x62, - 0x89, 0xff, 0xb9, 0x0a, 0x1f, 0xd7, 0x04, 0x78, 0xe4, 0x8a, 0xf6, 0x0a, - 0xdf, 0xbb, 0xf4, 0x8b, 0xcf, 0xe7, 0x47, 0x36, 0x61, 0x95, 0xaa, 0xbc, - 0x43, 0x27, 0x0d, 0xe8, 0x39, 0x08, 0x7f, 0xb0, 0xb0, 0x57, 0xc0, 0xef, - 0xef, 0xea, 0xf8, 0x92, 0x10, 0xb8, 0xc5, 0x9a, 0x24, 0x22, 0x0a, 0x1c, - 0xe5, 0x7a, 0x9e, 0xc9, 0x3c, 0xd3, 0xe7, 0x2e, 0x1e, 0x54, 0x41, 0x6b, - 0x1f, 0x99, 0x10, 0xeb, 0xc2, 0xff, 0xea, 0x8d, 0x72, 0x7b, 0xdf, 0xa4, - 0x42, 0xb5, 0xee, 0x6c, 0x84, 0xd1, 0x9e, 0xaa, 0x56, 0xe4, 0x2c, 0xec, - 0x06, 0x4c, 0x11, 0x00, 0x32, 0xd3, 0x2d, 0x7b, 0x11, 0x8c, 0x1a, 0xb4, - 0x41, 0xf5, 0xd6, 0xe0, 0xf2, 0x67, 0xde, 0x75, 0x7a, 0x3b, 0x6f, 0x08, - 0xba, 0xfb, 0x02, 0x8a, 0x6d, 0x94, 0xf7, 0x58, 0xf9, 0x8c, 0x0b, 0x68, - 0x7e, 0x23, 0x57, 0xeb, 0xb5, 0xe9, 0x5f, 0x66, 0x6f, 0xa1, 0x81, 0x4b, - 0x27, 0x80, 0xde, 0x7e, 0x37, 0x74, 0xf7, 0x94, 0xfd, 0x3e, 0x50, 0x3b, - 0x59, 0x8a, 0xea, 0xc8, 0x0b, 0x4d, 0x92, 0x3e, 0xeb, 0x2b, 0x92, 0x6b, - 0xa7, 0xcb, 0x9a, 0xd1, 0x67, 0x3a, 0xbb, 0x1e, 0xf9, 0x97, 0x28, 0x0f, - 0x9b, 0x8d, 0xfd, 0x66, 0xa3, 0x97, 0x70, 0x92, 0x66, 0x0d, 0x50, 0x34, - 0x81, 0xe1, 0x15, 0xe9, 0x21, 0x22, 0x6c, 0x54, 0x4f, 0x72, 0x08, 0xff, - 0x17, 0xd5, 0x56, 0x4e, 0x5f, 0x84, 0x65, 0x5b, 0x30, 0xb2, 0x78, 0xed, - 0x46, 0xf8, 0xea, 0x28, 0x65, 0x0b, 0xc3, 0x44, 0x24, 0x1f, 0x9c, 0x91, - 0xbf, 0x1e, 0x0a, 0x93, 0x19, 0xe2, 0x2f, 0xb8, 0x99, 0xb0, 0x19, 0x92, - 0xfa, 0x03, 0x87, 0x18, 0x36, 0x93, 0x4b, 0x10, 0x72, 0x03, 0xf2, 0x1a, - 0x06, 0x8d, 0x93, 0x1e, 0xf6, 0xad, 0xa5, 0x36, 0xee, 0x73, 0xc6, 0x58, - 0x6c, 0x73, 0xde, 0xb7, 0x4c, 0x9c, 0x63, 0x52, 0xc8, 0x68, 0xce, 0x66, - 0xd6, 0x12, 0xb1, 0xee, 0xee, 0x95, 0x73, 0x76, 0x23, 0xd2, 0xec, 0x91, - 0x8e, 0x0e, 0xcc, 0x60, 0xbb, 0x8c, 0x04, 0xca, 0x2e, 0x5c, 0x0b, 0x73, - 0xee, 0x89, 0x07, 0xb3, 0x30, 0xa7, 0xe6, 0x01, 0xb4, 0x4f, 0xa4, 0x22, - 0xb3, 0xa1, 0x72, 0xdc, 0xbd, 0x96, 0x02, 0xc3, 0x74, 0xf3, 0x0c, 0x32, - 0xce, 0x9d, 0x7c, 0x73, 0x3b, 0x05, 0x17, 0xa7, 0x75, 0x8f, 0x89, 0xe3, - 0x4b, 0x8c, 0x81, 0xda, 0xa7, 0xfc, 0xc2, 0x26, 0x5e, 0xd0, 0x95, 0x81, - 0x12, 0x1b, 0x54, 0xc8, 0xc9, 0xc3, 0x20, 0x97, 0x77, 0x44, 0xd4, 0xd0, - 0x5f, 0xa5, 0x60, 0xf0, 0x5b, 0xf6, 0xc7, 0x49, 0x5a, 0x5c, 0xdc, 0x4f, - 0x88, 0x75, 0x3d, 0x7c, 0xcf, 0xb3, 0x7a, 0x2b, 0x61, 0x70, 0x5b, 0xcd, - 0xd5, 0x41, 0x8b, 0xca, 0xfe, 0xb4, 0x63, 0x19, 0xbe, 0xea, 0x3e, 0xe8, - 0x96, 0xda, 0x37, 0x49, 0x15, 0x4a, 0x29, 0xdd, 0x09, 0x0c, 0x8f, 0xe7, - 0x11, 0xbe, 0x1c, 0x2e, 0x79, 0xdb, 0x01, 0x00, 0x1d, 0x17, 0xa9, 0x4e, - 0x86, 0xb7, 0x1e, 0x30, 0x6c, 0x81, 0x4b, 0xf6, 0x5d, 0x52, 0x64, 0x33, - 0xd4, 0x66, 0xeb, 0xdc, 0xa4, 0x37, 0x1a, 0x73, 0x94, 0x45, 0x6d, 0x86, - 0x37, 0x79, 0xbf, 0x9e, 0x6b, 0xe8, 0x17, 0xad, 0xe2, 0x74, 0xbf, 0x0e, - 0xd5, 0x8f, 0x28, 0x42, 0xe1, 0x2e, 0x4f, 0x12, 0xe4, 0x83, 0xcb, 0xcc, - 0xfb, 0xd4, 0x46, 0x41, 0x12, 0xa7, 0x41, 0x72, 0x33, 0xec, 0xa4, 0xfd, - 0x03, 0x61, 0x67, 0x4a, 0xe5, 0xff, 0xf2, 0x5f, 0x27, 0xd9, 0xc8, 0x1b, - 0x91, 0x7c, 0xa9, 0x88, 0x0e, 0x0a, 0xc0, 0x16, 0x8a, 0xce, 0x8d, 0x71, - 0x41, 0x27, 0x9e, 0x82, 0xc1, 0x28, 0xe3, 0xbc, 0x2a, 0x77, 0x04, 0x0a, - 0xf3, 0x31, 0xd1, 0x05, 0x69, 0xda, 0x8c, 0xd8, 0x34, 0x12, 0x2b, 0x72, - 0x95, 0x4c, 0x61, 0x1a, 0xca, 0x37, 0x93, 0x20, 0x1e, 0xd9, 0xb3, 0x0c, - 0xff, 0x7b, 0xb9, 0x8e, 0x8d, 0x2c, 0xf6, 0xf5, 0xd7, 0x0a, 0x7b, 0xc5, - 0x43, 0x48, 0x35, 0xdb, 0xff, 0x7b, 0xd5, 0x28, 0x84, 0x1d, 0x66, 0x00, - 0x95, 0xa5, 0x17, 0x22, 0x5a, 0x5d, 0x26, 0x2d, 0x53, 0x0a, 0xc2, 0x42, - 0x81, 0x08, 0x27, 0xbd, 0x02, 0xa1, 0x59, 0x86, 0x3a, 0x89, 0x2d, 0xef, - 0x3d, 0xf8, 0x31, 0x31, 0x32, 0x57, 0x81, 0xd1, 0x0a, 0x9c, 0x9a, 0x6a, - 0x7e, 0xaa, 0x92, 0x78, 0x84, 0x20, 0xb2, 0xde, 0x5b, 0xd3, 0xd1, 0x97, - 0x24, 0xef, 0x02, 0x07, 0x66, 0x94, 0x54, 0x89, 0xc0, 0xa4, 0xa0, 0xf6, - 0xdf, 0x6e, 0xc1, 0x04, 0xd4, 0x66, 0xf9, 0x1f, 0x48, 0x99, 0x2a, 0xad, - 0xc6, 0xca, 0x1f, 0x71, 0x3e, 0x43, 0x86, 0xa0, 0x20, 0x8a, 0x5b, 0x21, - 0xe0, 0x25, 0x2d, 0xdd, 0x8b, 0xd1, 0x95, 0x4f, 0x54, 0xe7, 0x12, 0x49, - 0x0a, 0xc1, 0xa5, 0x92, 0xee, 0x65, 0xa8, 0x9a, 0x5d, 0x4d, 0x74, 0x75, - 0x22, 0x7a, 0x42, 0x89, 0x39, 0xca, 0xca, 0xfe, 0x36, 0x99, 0xb2, 0x5d, - 0x6c, 0x54, 0xc7, 0x1e, 0x3a, 0x0a, 0xfa, 0x4b, 0x8d, 0xde, 0xf0, 0x48, - 0x7f, 0x93, 0xfb, 0xb8, 0x0e, 0x2e, 0x7e, 0xdc, 0x68, 0xb0, 0x51, 0x19, - 0x58, 0xed, 0x49, 0xfd, 0xad, 0xcb, 0x4f, 0x20, 0x03, 0x20, 0xe5, 0x8d, - 0x3c, 0x6f, 0x6b, 0xbf, 0xc8, 0xfd, 0x09, 0xda, 0x99, 0x43, 0x47, 0x30, - 0x52, 0x7d, 0x93, 0x27, 0x0a, 0x32, 0x29, 0x75, 0x6a, 0x7c, 0xbc, 0x2b, - 0x74, 0x35, 0x4b, 0x31, 0x51, 0x99, 0x29, 0x76, 0x4a, 0xac, 0x46, 0x73, - 0x64, 0x78, 0xe2, 0x2e, 0x41, 0x19, 0xb5, 0x1a, 0x21, 0xed, 0x5a, 0x34, - 0x6c, 0x79, 0x72, 0xcc, 0x24, 0xf3, 0x7a, 0xcc, 0xc1, 0xdd, 0x2b, 0x19, - 0x3d, 0x4d, 0xb5, 0x88, 0x08, 0xb2, 0x61, 0x4b, 0x77, 0xd2, 0x1a, 0x01, - 0x4e, 0x9e, 0xd8, 0x5f, 0x04, 0xaf, 0x1c, 0x27, 0x60, 0xc8, 0xf3, 0x99, - 0x94, 0x8e, 0xca, 0xfc, 0x40, 0x98, 0xb3, 0x5c, 0xe5, 0xf6, 0xbe, 0x4a, - 0xbc, 0x75, 0x91, 0x18, 0x1a, 0xf7, 0xe0, 0xbc, 0x46, 0xd2, 0xfc, 0x0e, - 0x58, 0xb6, 0xf8, 0xc4, 0x53, 0xaa, 0x48, 0x54, 0xae, 0x99, 0xf0, 0xbc, - 0xd1, 0xcb, 0x60, 0xde, 0x26, 0xe5, 0xfd, 0x28, 0xc3, 0xbf, 0x06, 0x6b, - 0xa8, 0x8f, 0x45, 0x6a, 0x46, 0x75, 0x4e, 0xbf, 0x48, 0x81, 0x78, 0xb3, - 0x77, 0x0a, 0x61, 0xba, 0xf1, 0x16, 0x03, 0xee, 0x2a, 0xc8, 0xf5, 0x30, - 0xdb, 0xbd, 0x7f, 0xb2, 0xa3, 0x23, 0x62, 0x92, 0x04, 0xf1, 0x8d, 0x50, - 0x9f, 0xda, 0xaf, 0x56, 0x0a, 0x03, 0x2a, 0x7a, 0x74, 0x49, 0xbb, 0xc6, - 0x83, 0xf2, 0x78, 0xb3, 0x53, 0xf0, 0x7b, 0x83, 0xf7, 0xdd, 0xb9, 0x3d, - 0xa3, 0x3d, 0x59, 0x96, 0x89, 0x16, 0xd1, 0x99, 0x1c, 0x2c, 0x95, 0x9e, - 0xeb, 0x17, 0x42, 0xa6, 0x4c, 0x84, 0x1b, 0xa2, 0x76, 0xbd, 0xd6, 0xb9, - 0xb0, 0xc0, 0x66, 0x7f, 0x19, 0xc5, 0x89, 0xba, 0x45, 0x58, 0x68, 0xff, - 0x67, 0x64, 0x15, 0xfd, 0xba, 0xba, 0xbb, 0x3e, 0xb2, 0x9f, 0x85, 0x35, - 0x41, 0x66, 0x41, 0xd9, 0xee, 0x64, 0x15, 0xda, 0x25, 0xa6, 0xf3, 0x0e, - 0xd6, 0x41, 0xa5, 0xaa, 0x7f, 0x4d, 0x7a, 0xe5, 0x3c, 0x77, 0xed, 0x4c, - 0x60, 0xbc, 0x4d, 0x37, 0xb5, 0x12, 0x8b, 0x14, 0xcd, 0x44, 0x9f, 0x8b, - 0x49, 0x74, 0x8d, 0x7a, 0xd0, 0xe2, 0xba, 0x5f, 0x89, 0x34, 0x27, 0x77, - 0x5d, 0xc0, 0x2f, 0x3d, 0xb3, 0x97, 0x83, 0xfb, 0x4f, 0xbb, 0xde, 0xf5, - 0x85, 0xec, 0x66, 0x33, 0x59, 0x71, 0x29, 0x8c, 0xcd, 0xfe, 0xee, 0x26, - 0x6d, 0x36, 0x33, 0x65, 0xce, 0x49, 0xe0, 0x38, 0x50, 0xb7, 0xe6, 0xdb, - 0x3a, 0xe3, 0x6c, 0x3f, 0x19, 0xaf, 0x2d, 0x74, 0xe4, 0x0e, 0x72, 0x65, - 0xfd, 0xc0, 0x0b, 0xbd, 0xf3, 0x2d, 0xd9, 0x96, 0x9f, 0x0c, 0x88, 0x41, - 0x41, 0x65, 0x8d, 0x1c, 0x89, 0x8a, 0x7a, 0x63, 0x78, 0xe4, 0x1f, 0x8e, - 0xd5, 0xb3, 0x8e, 0x28, 0xb3, 0x0c, 0xd8, 0x16, 0x84, 0xa4, 0xa1, 0x88, - 0xf5, 0x1c, 0xef, 0x28, 0xd7, 0x42, 0x09, 0x9a, 0x28, 0x87, 0x29, 0x55, - 0xd0, 0x8a, 0x8e, 0x65, 0xd7, 0xb7, 0xd2, 0x0d, 0xaa, 0x25, 0x74, 0xd5, - 0x53, 0x64, 0x3c, 0xeb, 0xcb, 0x1c, 0x76, 0xe5, 0x61, 0xb5, 0xa8, 0x1c, - 0xd9, 0xbb, 0xa6, 0x1e, 0xbd, 0xba, 0x3d, 0xee, 0x9f, 0xa8, 0xe4, 0x89, - 0x87, 0x81, 0x1d, 0x51, 0xb1, 0x89, 0x62, 0x32, 0x75, 0x7a, 0xdd, 0xf5, - 0x73, 0x0d, 0x97, 0x5b, 0x91, 0x4b, 0x76, 0xdd, 0x28, 0xc2, 0xd7, 0x9b, - 0xf1, 0x3b, 0x0a, 0xda, 0x4e, 0x29, 0x13, 0x2c, 0xc5, 0x6c, 0x00, 0x15, - 0x4d, 0xd5, 0xf5, 0xed, 0x3c, 0xb8, 0x27, 0xa8, 0x5a, 0x7a, 0xbe, 0x7c, - 0xf0, 0x0e, 0x6d, 0x43, 0xba, 0xaf, 0x9b, 0x75, 0x97, 0xff, 0xe7, 0xc8, - 0xb1, 0x3f, 0xd9, 0x00, 0x1c, 0x29, 0xd3, 0xb5, 0x39, 0xf7, 0xc3, 0xa0, - 0x85, 0x9f, 0xfa, 0x63, 0x01, 0x03, 0xde, 0xf8, 0xa3, 0x2c, 0xab, 0x2e, - 0xd4, 0xeb, 0x2c, 0xac, 0x6f, 0x7f, 0x77, 0x72, 0x11, 0xea, 0x24, 0xad, - 0x28, 0xc0, 0xf5, 0xab, 0x99, 0x4c, 0xaf, 0x03, 0x4f, 0xf1, 0x01, 0x75, - 0x59, 0x84, 0xab, 0x82, 0x68, 0xff, 0x28, 0x6f, 0xa3, 0x8d, 0x81, 0x69, - 0x4e, 0x95, 0x4d, 0x2f, 0x5e, 0x2d, 0xba, 0x19, 0x33, 0x38, 0x37, 0x14, - 0x05, 0x1f, 0x8c, 0xba, 0xbc, 0x8f, 0xa3, 0xb2, 0x39, 0x83, 0x0f, 0x1d, - 0xbf, 0x52, 0xa0, 0xee, 0xfb, 0x25, 0xe6, 0x3e, 0x65, 0x9e, 0x2a, 0x4a, - 0xf0, 0xdf, 0x82, 0x22, 0xa4, 0x18, 0x09, 0x4f, 0xec, 0xda, 0x71, 0xed, - 0x79, 0x46, 0x0b, 0x0e, 0x46, 0x1a, 0x4f, 0xda, 0x39, 0xa9, 0x24, 0x54, - 0x6a, 0x67, 0xac, 0xeb, 0xeb, 0x06, 0x0b, 0xaa, 0xbd, 0xc9, 0x9f, 0x4d, - 0x2c, 0xe6, 0xf6, 0xe0, 0xe5, 0xb2, 0x72, 0x98, 0x65, 0xc3, 0x3c, 0x45, - 0xdb, 0x71, 0xd0, 0x39, 0xc7, 0x25, 0xb5, 0x39, 0xe1, 0x71, 0x14, 0xa1, - 0x8d, 0x30, 0x84, 0xc6, 0x63, 0x05, 0x6e, 0xf0, 0x83, 0xb4, 0x9f, 0xc8, - 0x7d, 0xd7, 0x65, 0xac, 0x30, 0x26, 0x52, 0xec, 0xd4, 0x89, 0x11, 0xa7, - 0x31, 0xf4, 0x31, 0xae, 0x65, 0xe9, 0x4a, 0x74, 0xa5, 0xf3, 0xce, 0x1e, - 0x0b, 0x35, 0xdd, 0xad, 0x4e, 0xa6, 0x97, 0x7e, 0x01, 0xa7, 0x86, 0x11, - 0x9c, 0x98, 0x48, 0xb3, 0x30, 0x02, 0xf8, 0x6c, 0x37, 0x0f, 0x83, 0x3b, - 0xf5, 0x05, 0x55, 0x5b, 0x77, 0x90, 0x80, 0xfa, 0x58, 0x0d, 0xaa, 0xec, - 0xa0, 0x35, 0xa0, 0x52, 0x4c, 0x3e, 0x36, 0x50, 0x6f, 0xae, 0x9a, 0x84, - 0x4f, 0x30, 0x62, 0xf9, 0xef, 0x8f, 0x5d, 0xc1, 0x18, 0x42, 0x42, 0x48, - 0xc1, 0xb6, 0xf4, 0x20, 0x2a, 0x35, 0x05, 0x04, 0x8f, 0x6a, 0xf1, 0x93, - 0x5c, 0x26, 0x9c, 0x48, 0x87, 0xc5, 0x43, 0x85, 0x38, 0x37, 0x78, 0xf0, - 0x34, 0x88, 0x16, 0xe9, 0x6a, 0xfe, 0xef, 0x05, 0x33, 0x44, 0xb9, 0xfc, - 0x1e, 0x1d, 0xb5, 0x8c, 0x1f, 0x3e, 0x2b, 0x13, 0xb9, 0x23, 0xc3, 0xaa, - 0xc0, 0x7d, 0x22, 0xc2, 0xdf, 0x2e, 0x6e, 0xc8, 0xc2, 0xe1, 0xd6, 0x01, - 0x07, 0xd3, 0x48, 0xad, 0x89, 0x2e, 0x4f, 0x2b, 0xe3, 0x6e, 0xe4, 0x32, - 0xfe, 0x85, 0x9a, 0x6d, 0x20, 0x06, 0x1a, 0x9e, 0x68, 0xf5, 0xab, 0x57, - 0xf3, 0xaa, 0x2d, 0x1f, 0x86, 0x52, 0x11, 0xd4, 0xed, 0x1e, 0x27, 0xb5, - 0x22, 0xbe, 0x81, 0x88, 0x7c, 0x3d, 0xe8, 0x28, 0xa5, 0x7a, 0xad, 0x1b, - 0x64, 0x62, 0x30, 0xd0, 0xd5, 0x3a, 0xa3, 0x38, 0x9c, 0x21, 0x3e, 0x89, - 0xdb, 0xdc, 0x5a, 0x27, 0xf5, 0x55, 0x8f, 0xc1, 0x89, 0x1d, 0xb9, 0x8e, - 0xab, 0x43, 0x72, 0xea, 0xe6, 0xf4, 0xde, 0x5b, 0x5f, 0x88, 0xca, 0x2f, - 0x0c, 0x57, 0x23, 0xa0, 0x96, 0x46, 0x84, 0xd5, 0xac, 0xa4, 0xc8, 0x9c, - 0x2e, 0x39, 0xbf, 0x2b, 0xd0, 0xbd, 0xb2, 0xa1, 0xd4, 0x2d, 0xa1, 0x0c, - 0x5b, 0xb8, 0x8d, 0x33, 0x4b, 0xd4, 0x83, 0xa1, 0xe3, 0x27, 0xcf, 0x41, - 0x59, 0xfb, 0xd4, 0x84, 0xa5, 0x66, 0x98, 0x75, 0x49, 0xd9, 0xc5, 0xbe, - 0x91, 0x8a, 0x01, 0x9e, 0x72, 0x3f, 0x0b, 0x18, 0x14, 0x46, 0x1f, 0x92, - 0xdc, 0x76, 0x9b, 0x3e, 0x8f, 0xd9, 0x60, 0xc1, 0x8b, 0x1e, 0xe2, 0x9f, - 0xf1, 0x42, 0xc8, 0x75, 0xf7, 0x0d, 0x46, 0xf1, 0xe1, 0xf6, 0xff, 0xef, - 0xac, 0x65, 0x2f, 0xb0, 0x04, 0xa9, 0x93, 0xf2, 0x15, 0x81, 0x34, 0xb3, - 0x90, 0x2f, 0x8e, 0xbf, 0x94, 0x81, 0xfb, 0x33, 0xee, 0xd1, 0xe5, 0xe5, - 0x56, 0x24, 0x56, 0x00, 0x16, 0xf6, 0xd7, 0xfb, 0x30, 0xde, 0x44, 0x45, - 0xfa, 0x38, 0x4d, 0x6a, 0xf6, 0x64, 0xde, 0xf0, 0x53, 0x5e, 0x2b, 0xa3, - 0xc1, 0xac, 0x03, 0x72, 0xe5, 0x26, 0xc6, 0xdd, 0x05, 0xb3, 0xe3, 0x9c, - 0x37, 0x68, 0xbf, 0xd2, 0x8e, 0x8d, 0x96, 0xf9, 0xa8, 0xdf, 0xec, 0xf6, - 0xcc, 0x08, 0x1a, 0xc8, 0xe6, 0x50, 0x82, 0x9b, 0x56, 0x9c, 0x82, 0xc4, - 0x3f, 0x8b, 0xd4, 0xfe, 0x3a, 0xc1, 0x10, 0x11, 0x5e, 0xf7, 0x76, 0x50, - 0xd7, 0xc9, 0x73, 0x03, 0x72, 0x68, 0x2b, 0x79, 0xf0, 0xed, 0xc7, 0x8f, - 0xbe, 0x89, 0x72, 0x1d, 0x34, 0xbe, 0xe7, 0x1e, 0x72, 0xb8, 0x52, 0x38, - 0x7a, 0x0c, 0xd8, 0x3c, 0x16, 0xe9, 0x87, 0x66, 0xe1, 0xf3, 0x36, 0x43, - 0x46, 0xbc, 0x87, 0x0d, 0xc8, 0x64, 0x59, 0x16, 0xb6, 0x82, 0x35, 0xad, - 0x8f, 0xff, 0x53, 0x2a, 0xda, 0x08, 0x64, 0x0c, 0x29, 0xd7, 0xe1, 0x17, - 0x33, 0x0d, 0x43, 0xb3, 0x5a, 0x5d, 0xe0, 0xb2, 0x9f, 0x8e, 0xc5, 0x9f, - 0x75, 0x4a, 0x25, 0x0f, 0xe8, 0xe7, 0xea, 0xb6, 0x3f, 0xc0, 0x03, 0x69, - 0x7e, 0xeb, 0x6d, 0xe6, 0x03, 0x06, 0x0b, 0x04, 0x21, 0x45, 0x18, 0xd2, - 0xa4, 0xc5, 0xf1, 0x03, 0xc5, 0x0e, 0x21, 0x68, 0x55, 0xcf, 0x14, 0xef, - 0xe2, 0x0f, 0x68, 0x14, 0xf0, 0x77, 0x63, 0x6e, 0x07, 0x68, 0x44, 0x2e, - 0x98, 0xe1, 0xb7, 0xab, 0x46, 0xd9, 0x4a, 0x6c, 0xda, 0x95, 0x19, 0xdc, - 0x0c, 0x11, 0x02, 0xf4, 0xf3, 0x3a, 0x3a, 0x30, 0x18, 0x29, 0x0b, 0x91, - 0x3d, 0xdb, 0xdb, 0x67, 0x98, 0x89, 0xfb, 0x57, 0xe3, 0xb9, 0xbc, 0xad, - 0x25, 0xa6, 0x58, 0x94, 0x8e, 0x70, 0x2f, 0x1c, 0x3c, 0x52, 0xe1, 0x18, - 0xd8, 0x57, 0x83, 0x5c, 0xb2, 0x1b, 0x3d, 0xc7, 0xb7, 0x2c, 0x6a, 0xd5, - 0x41, 0xd0, 0xe0, 0xc3, 0x00, 0x7b, 0xa4, 0xa9, 0xcd, 0x53, 0xb4, 0x76, - 0xb0, 0xc6, 0xb4, 0xb5, 0x19, 0x4c, 0x83, 0x39, 0xb9, 0x0e, 0x9d, 0x25, - 0x12, 0xcb, 0x3d, 0xcc, 0x31, 0x91, 0x23, 0x9d, 0xee, 0x1a, 0x5b, 0xf9, - 0x7d, 0x73, 0x48, 0xe9, 0x89, 0xfb, 0xa6, 0xa7, 0x0a, 0xb0, 0x8e, 0xa0, - 0xa9, 0xd2, 0x04, 0xe5, 0xae, 0x82, 0xeb, 0x75, 0x09, 0x1c, 0x47, 0x43, - 0x5b, 0x77, 0x99, 0x87, 0x35, 0x84, 0xef, 0x0f, 0x6b, 0x4b, 0x0c, 0xd2, - 0xe8, 0x31, 0x85, 0x89, 0xb4, 0x6f, 0xe2, 0xab, 0x62, 0x29, 0x63, 0x14, - 0x86, 0x57, 0xea, 0xf3, 0xf0, 0xe8, 0x42, 0x15, 0xd0, 0x81, 0x3e, 0xca, - 0xf8, 0x50, 0xf7, 0xd1, 0xc5, 0x5b, 0x48, 0x38, 0x20, 0x34, 0x03, 0xbd, - 0xfd, 0xbd, 0x4b, 0x7c, 0xfd, 0xba, 0xf2, 0x98, 0xe4, 0xf7, 0x45, 0x4f, - 0xd6, 0x60, 0xae, 0x01, 0x95, 0x6d, 0x1c, 0x10, 0x75, 0x56, 0x38, 0x8c, - 0x53, 0x9f, 0x81, 0xe4, 0xe1, 0x7f, 0x8b, 0xb4, 0x76, 0x78, 0xb8, 0xe6, - 0x15, 0xde, 0x0b, 0x5a, 0xfb, 0x60, 0x14, 0x34, 0x02, 0xcb, 0x18, 0xd8, - 0x69, 0x4b, 0x7c, 0x8c, 0x5c, 0xd5, 0x17, 0x96, 0xef, 0x3f, 0x6f, 0xc4, - 0xee, 0x69, 0xe5, 0xc7, 0x79, 0x66, 0x79, 0x3c, 0xed, 0xe6, 0xeb, 0xc5, - 0xf8, 0xf0, 0xcf, 0xab, 0xe3, 0xb4, 0x91, 0x9e, 0xf5, 0xfa, 0xdb, 0x2d, - 0x09, 0x50, 0xe6, 0x03, 0x3e, 0x3a, 0xe8, 0xe1, 0x0e, 0xf8, 0x1a, 0xb4, - 0x57, 0x80, 0xfc, 0x50, 0x6d, 0x86, 0xd9, 0x98, 0x88, 0x64, 0x0b, 0xfc, - 0xdd, 0x00, 0x3a, 0x2c, 0xa6, 0x73, 0x49, 0x65, 0x67, 0xc1, 0x12, 0xe8, - 0x05, 0x2f, 0x58, 0xa7, 0x59, 0x61, 0x45, 0x20, 0xf8, 0xe6, 0x3a, 0xe8, - 0xfb, 0x0f, 0xed, 0xae, 0x23, 0x87, 0x2b, 0xf6, 0xfb, 0xc9, 0xb1, 0x15, - 0x6d, 0x78, 0x08, 0x12, 0xd3, 0xca, 0x8b, 0xc2, 0x58, 0xfc, 0xcc, 0xd7, - 0x7b, 0xeb, 0x0f, 0x82, 0x2b, 0x6d, 0x83, 0x18, 0x0a, 0x4b, 0x8b, 0xa8, - 0xdd, 0x2a, 0xf1, 0x97, 0xb5, 0xca, 0x73, 0x40, 0xcf, 0x9c, 0x12, 0xeb, - 0xd6, 0xa9, 0x5e, 0x20, 0x9c, 0x6c, 0x8c, 0xef, 0x57, 0x71, 0x16, 0x1f, - 0xa5, 0x30, 0xe1, 0xb3, 0x46, 0x67, 0x74, 0xd0, 0x37, 0x20, 0xe7, 0x9e, - 0x50, 0x27, 0xc7, 0x97, 0x14, 0x2f, 0xac, 0xb6, 0xfa, 0x7c, 0x24, 0x85, - 0xc2, 0xf8, 0x4f, 0x01, 0xbe, 0x12, 0x62, 0xcb, 0x32, 0xfa, 0xa5, 0x62, - 0x6f, 0x21, 0x44, 0xce, 0x6d, 0x2c, 0x40, 0x65, 0xd9, 0xfc, 0xa5, 0x0b, - 0x81, 0xbf, 0xa9, 0x1b, 0x84, 0xcf, 0x66, 0xcc, 0xfb, 0x08, 0xc0, 0x85, - 0x97, 0x53, 0x8c, 0xcf, 0x9a, 0x73, 0x81, 0x76, 0x92, 0x77, 0x8c, 0xd5, - 0xfb, 0xcb, 0x52, 0xaa, 0x3b, 0x92, 0xd5, 0x44, 0x66, 0xd1, 0xd3, 0x11, - 0x52, 0x89, 0x83, 0x75, 0x5a, 0x56, 0xc9, 0xa4, 0x62, 0x55, 0x50, 0x5a, - 0x37, 0x63, 0xa6, 0xd5, 0xeb, 0x1a, 0x96, 0x5b, 0xc2, 0x3b, 0x25, 0x6c, - 0x45, 0xbd, 0x56, 0xa9, 0xdb, 0x38, 0x18, 0x23, 0xa1, 0xd6, 0x46, 0x0f, - 0x09, 0x50, 0x77, 0x84, 0x32, 0x70, 0x5d, 0x62, 0x0a, 0xce, 0xb6, 0xd1, - 0xfd, 0x71, 0x5f, 0x54, 0xb7, 0x16, 0x84, 0x71, 0x46, 0x11, 0xbf, 0xf4, - 0x6e, 0x4b, 0x6b, 0x46, 0x30, 0x24, 0x0a, 0x5a, 0x84, 0x1c, 0x28, 0xa4, - 0x3b, 0xca, 0xd4, 0xc4, 0x42, 0xdb, 0x17, 0xbe, 0xbf, 0x39, 0x30, 0xb2, - 0x67, 0xa1, 0xe7, 0xd3, 0xcf, 0x84, 0xe9, 0x0a, 0x95, 0xa3, 0x68, 0xff, - 0x57, 0x8c, 0xce, 0x15, 0x7c, 0x21, 0x31, 0x8f, 0x61, 0xe1, 0xac, 0x83, - 0x63, 0xfd, 0x04, 0x93, 0x51, 0x50, 0xe6, 0xc7, 0x7f, 0xa2, 0x7a, 0xa2, - 0xd0, 0x44, 0xb4, 0x73, 0x5f, 0x46, 0xcd, 0xc8, 0x76, 0x38, 0x02, 0x6d, - 0x3c, 0xde, 0xea, 0x6f, 0x53, 0x47, 0x53, 0x82, 0x35, 0xec, 0xec, 0xea, - 0x4e, 0x86, 0x26, 0xd8, 0xe4, 0x1d, 0xe6, 0x7c, 0x0b, 0x4d, 0x6f, 0x5d, - 0xee, 0xa0, 0x27, 0x4b, 0x27, 0xc6, 0xb2, 0xcd, 0x5c, 0x8d, 0x02, 0x3a, - 0xcc, 0x70, 0x49, 0x0a, 0x98, 0x65, 0x2f, 0xfe, 0xf4, 0x4a, 0x4a, 0x17, - 0x7c, 0x21, 0x31, 0x8f, 0xc8, 0x34, 0xb0, 0x86, 0xd5, 0x1d, 0xd3, 0xe6, - 0x45, 0x2f, 0x2f, 0x74, 0x12, 0xf1, 0x04, 0x70, 0xea, 0xfc, 0x76, 0x72, - 0x58, 0x1f, 0x71, 0x1f, 0x3f, 0x63, 0x13, 0x50, 0x0a, 0x8f, 0xd2, 0x14, - 0x15, 0xa4, 0xe1, 0x0e, 0x64, 0x8e, 0x1b, 0x2f, 0x1c, 0xe2, 0xc8, 0xc9, - 0xf7, 0x76, 0xb6, 0x57, 0x14, 0x63, 0xc9, 0x2e, 0xf7, 0x37, 0x9e, 0xfe, - 0xa9, 0x25, 0x30, 0x28, 0x6e, 0x78, 0xd5, 0xc1, 0xd0, 0x6c, 0x60, 0x0e, - 0xe6, 0x43, 0x29, 0xc8, 0xdb, 0x12, 0x23, 0x87, 0xcf, 0x41, 0x2f, 0xc8, - 0x07, 0x07, 0xd7, 0x09, 0x7f, 0xd2, 0x4a, 0x4b, 0xa6, 0xc1, 0x55, 0xdd, - 0xb8, 0x07, 0xd0, 0x39, 0x88, 0xba, 0x86, 0x91, 0x66, 0x22, 0x12, 0xe4, - 0xbd, 0x83, 0x32, 0x55, 0x5e, 0x08, 0x50, 0xf2, 0x7b, 0xf2, 0xc5, 0xc4, - 0xf9, 0x72, 0x1b, 0x34, 0xe1, 0x19, 0x64, 0x48, 0xde, 0x3c, 0x7f, 0x9e, - 0xb5, 0xd4, 0x05, 0xaf, 0xce, 0x76, 0xf2, 0xc7, 0xe8, 0x3a, 0xc1, 0x9b, - 0xeb, 0xeb, 0x74, 0x5c, 0x91, 0xbf, 0xf9, 0xdc, 0x1c, 0x01, 0x16, 0xe4, - 0x71, 0xfa, 0x5a, 0x23, 0x98, 0xc2, 0x9b, 0x65, 0x1a, 0xe0, 0xae, 0x1e, - 0xbc, 0x1f, 0xf6, 0xab, 0xfd, 0xed, 0x16, 0xdc, 0xf1, 0x81, 0x21, 0x4a, - 0xe0, 0xc0, 0xa3, 0x58, 0x88, 0x81, 0x21, 0xfe, 0xab, 0x21, 0xdc, 0x64, - 0x24, 0x03, 0x52, 0x68, 0x55, 0x84, 0x18, 0xb6, 0xc2, 0x4c, 0xd8, 0x55, - 0xa6, 0x70, 0x64, 0xbb, 0x7d, 0xe3, 0xee, 0x38, 0xdb, 0xe9, 0xcb, 0x0a, - 0x9a, 0x6d, 0x3c, 0x13, 0x6c, 0x91, 0x35, 0x1a, 0xba, 0xc0, 0xe4, 0x65, - 0x7a, 0x1a, 0x8d, 0x2e, 0x53, 0xbb, 0x8d, 0xc1, 0x08, 0x9e, 0x09, 0x1e, - 0xbc, 0x46, 0xe4, 0xbb, 0x74, 0x38, 0x84, 0x3f, 0x85, 0x07, 0x37, 0x67, - 0xb8, 0x48, 0x53, 0xdc, 0x40, 0x0e, 0xd3, 0x79, 0xe4, 0xce, 0x25, 0x28, - 0xa4, 0x9c, 0x0b, 0x52, 0xaa, 0x85, 0x80, 0x0b, 0x50, 0x02, 0x2c, 0xf9, - 0x26, 0x21, 0x42, 0x59, 0x83, 0xff, 0x82, 0x4e, 0xb5, 0x20, 0x05, 0x23, - 0x07, 0x9f, 0x41, 0x2e, 0x29, 0x92, 0xfd, 0x1c, 0x6c, 0xdf, 0x67, 0xc6, - 0x9d, 0x62, 0x3c, 0x11, 0x1c, 0xb1, 0xc3, 0x6a, 0x53, 0x74, 0x4d, 0x0a, - 0x81, 0x6b, 0x5a, 0x27, 0x1c, 0x01, 0x50, 0x1d, 0x64, 0x2a, 0x30, 0x8d, - 0xfa, 0x7a, 0xe3, 0x45, 0x62, 0xf8, 0xb8, 0x42, 0xd9, 0xb0, 0xb9, 0x94, - 0xa2, 0x39, 0x31, 0x9d, 0x49, 0xed, 0x28, 0x2a, 0xd0, 0x5f, 0xe0, 0x1b, - 0x1f, 0x98, 0x17, 0xbc, 0x8a, 0x64, 0xdc, 0x08, 0xc2, 0x3e, 0x1d, 0xe4, - 0x73, 0xfb, 0x61, 0x35, 0x7d, 0x7c, 0x3f, 0x3c, 0xee, 0x43, 0x91, 0x27, - 0x18, 0x94, 0x18, 0x11, 0xb5, 0xb1, 0x90, 0x84, 0xa6, 0xd4, 0x4c, 0xd7, - 0x39, 0x34, 0x74, 0xb8, 0x4c, 0xd0, 0xa5, 0x3d, 0x43, 0x35, 0xa0, 0x14, - 0x28, 0x39, 0x67, 0xd2, 0x6a, 0x2b, 0x76, 0xce, 0x52, 0xe9, 0x55, 0x73, - 0x24, 0xb1, 0x23, 0x69, 0x18, 0x03, 0x45, 0x47, 0x3f, 0x44, 0xd8, 0x18, - 0x27, 0x1e, 0x50, 0xe1, 0xec, 0xa8, 0x58, 0x44, 0x3a, 0xf4, 0x3e, 0xeb, - 0xd5, 0xa0, 0x4b, 0xe0, 0x74, 0xb8, 0x42, 0x60, 0x68, 0x02, 0xa7, 0x7a, - 0x97, 0x10, 0x28, 0x81, 0x67, 0x13, 0x7c, 0xb1, 0x4c, 0x93, 0xef, 0xea, - 0xe8, 0x7a, 0xff, 0xa5, 0x62, 0xd3, 0xc1, 0xdf, 0x5a, 0xb9, 0xb6, 0xfa, - 0x8c, 0x0d, 0xe9, 0x7e, 0x8c, 0xe3, 0x90, 0x7a, 0x4d, 0xaf, 0xba, 0xed, - 0x90, 0x65, 0x88, 0xd2, 0x9c, 0xbb, 0xc2, 0xd9, 0x89, 0xb4, 0x07, 0x99, - 0x0b, 0x21, 0xba, 0x79, 0x8f, 0x46, 0x56, 0x25, 0x78, 0x5b, 0x55, 0x2a, - 0xbe, 0x1c, 0xb3, 0xdb, 0x50, 0x92, 0x69, 0xe3, 0x36, 0x8a, 0x39, 0x1e, - 0xf9, 0x77, 0x32, 0xeb, 0x74, 0x91, 0x9f, 0x33, 0x48, 0xd0, 0x80, 0xa6, - 0x23, 0x4e, 0x6f, 0x29, 0x66, 0x6a, 0x15, 0xfc, 0xca, 0x67, 0xa9, 0xb9, - 0x53, 0xbc, 0x5d, 0x0e, 0xe3, 0xe0, 0x8b, 0x85, 0x76, 0x42, 0x10, 0xfc, - 0x59, 0xd9, 0x67, 0x7f, 0x16, 0xcd, 0xfd, 0x73, 0x2b, 0x44, 0xe5, 0x10, - 0xb1, 0xe3, 0x85, 0x14, 0xfe, 0x42, 0x13, 0x54, 0x2c, 0x56, 0xdf, 0xa4, - 0xfd, 0x2a, 0x7a, 0xf3, 0xef, 0x7c, 0x87, 0x8b, 0xce, 0xda, 0x4b, 0xb9, - 0xb7, 0x4e, 0xf0, 0x9a, 0x04, 0xcc, 0x03, 0x6a, 0x5c, 0x24, 0xe7, 0xbf, - 0x4c, 0x50, 0x64, 0x21, 0xf6, 0xcd, 0x15, 0xb0, 0x80, 0x19, 0x0c, 0x5e, - 0x82, 0x9c, 0x81, 0xaf, 0xbc, 0xbe, 0x87, 0x3e, 0x3a, 0xd6, 0xfc, 0x3c, - 0x5f, 0xf9, 0xf9, 0xe7, 0x51, 0x17, 0x90, 0xa7, 0x44, 0xbc, 0x6e, 0x1b, - 0xd0, 0x6a, 0xba, 0x42, 0xa1, 0x28, 0xc2, 0x37, 0xe2, 0xbb, 0x54, 0x34, - 0x8f, 0xb5, 0x09, 0xa9, 0x05, 0x92, 0x75, 0xf8, 0x56, 0xea, 0xb0, 0x71, - 0x52, 0xad, 0xfb, 0xf8, 0x48, 0x99, 0x8b, 0x74, 0xf8, 0x23, 0x02, 0x13, - 0x25, 0x3b, 0x77, 0x19, 0xd2, 0xbc, 0x9a, 0x64, 0x08, 0xf5, 0x3a, 0xa4, - 0x21, 0x60, 0x03, 0xb3, 0x55, 0x0f, 0x07, 0x1a, 0xef, 0x7c, 0x87, 0x8b, - 0x7e, 0xdb, 0x4b, 0xb9, 0xb7, 0x4e, 0xf0, 0x9a, 0x04, 0xcc, 0x03, 0x6a, - 0x5c, 0x24, 0xe7, 0xbf, 0x4c, 0x50, 0x64, 0x21, 0xf6, 0xcd, 0x15, 0xb0, - 0x80, 0x19, 0x0c, 0x5e, 0x82, 0x9c, 0x81, 0xaf, 0xbc, 0xbe, 0x87, 0x3e, - 0x3a, 0xd6, 0xfc, 0x3c, 0x5f, 0xf9, 0xf9, 0xe7, 0xab, 0xbf, 0x61, 0x6b, - 0x06, 0x74, 0xfd, 0xb9, 0x43, 0x4e, 0xb4, 0x94, 0x66, 0xaf, 0xfe, 0xdb, - 0xd0, 0xac, 0xc4, 0x33, 0xee, 0x9f, 0x07, 0x28, 0xeb, 0xf8, 0xdc, 0x31, - 0xf7, 0x47, 0xdf, 0x68, 0xde, 0x3c, 0x4c, 0x50, 0xfe, 0x4a, 0x4a, 0x88, - 0x9a, 0x10, 0x1c, 0xbf, 0x93, 0x7f, 0x49, 0x8a, 0x38, 0x7f, 0xc4, 0xeb, - 0x8f, 0xa3, 0x65, 0x59, 0x1a, 0xec, 0xab, 0xdf, 0xbb, 0x5e, 0x30, 0x37, - 0x9f, 0x52, 0x8d, 0x13, 0x47, 0xfd, 0xe8, 0x5a, 0xef, 0xf5, 0x87, 0x15, - 0x08, 0x9c, 0xbe, 0xb6, 0x63, 0x85, 0x87, 0x89, 0x7e, 0x75, 0xac, 0xaf, - 0x50, 0x68, 0xd4, 0x2d, 0xae, 0x32, 0xc0, 0xac, 0x66, 0xcd, 0xb7, 0x7a, - 0x20, 0x7a, 0x6b, 0xbd, 0x16, 0xe3, 0x91, 0xab, 0xff, 0xfd, 0x4d, 0x67, - 0x0f, 0xab, 0xc2, 0x36, 0x1f, 0x49, 0x1f, 0x5f, 0xa0, 0x15, 0xa8, 0xed, - 0xff, 0xba, 0xad, 0xe5, 0x38, 0xba, 0x30, 0x0c, 0x30, 0x94, 0xdf, 0x03, - 0xe7, 0x2d, 0x85, 0x79, 0x14, 0xa4, 0x78, 0x3d, 0xd5, 0xfc, 0x53, 0x3e, - 0x49, 0xaf, 0x29, 0x8f, 0x91, 0xe8, 0x3f, 0x4d, 0x73, 0x32, 0x9d, 0xba, - 0x49, 0x4b, 0x38, 0x39, 0x6f, 0x91, 0xd2, 0x0b, 0x66, 0x22, 0xa0, 0x86, - 0xc5, 0x1a, 0x6d, 0xf1, 0xbd, 0xde, 0xb2, 0x35, 0x63, 0x57, 0x74, 0x3e, - 0x5b, 0x02, 0xf6, 0xb4, 0x36, 0xb7, 0xe7, 0xea, 0xd4, 0x8f, 0x52, 0x4b, - 0x2d, 0xb8, 0xb8, 0x9b, 0x22, 0x9e, 0x6e, 0x9b, 0x63, 0xa4, 0x08, 0x6e, - 0xca, 0x92, 0x40, 0x0d, 0xb9, 0x03, 0xde, 0x14, 0xe3, 0xdc, 0xcc, 0xd1, - 0xf7, 0x2e, 0x20, 0xbe, 0xaf, 0x14, 0x7b, 0xae, 0xb2, 0x68, 0x6a, 0x63, - 0x11, 0x9b, 0x46, 0xc7, 0x7b, 0xd4, 0x83, 0xa5, 0xf8, 0xe2, 0xc6, 0xc7, - 0xff, 0x54, 0x6e, 0x34, 0xd2, 0x75, 0x1f, 0x3c, 0x50, 0x62, 0x97, 0x73, - 0x87, 0x98, 0x7d, 0x39, 0x8b, 0xa2, 0x8f, 0x85, 0x59, 0x46, 0xf7, 0xed, - 0xf6, 0xe7, 0x34, 0x4d, 0xc9, 0x0c, 0x7e, 0x02, 0xe1, 0xb3, 0xe8, 0x5c, - 0x2d, 0xd0, 0x80, 0xa1, 0x0f, 0x84, 0x9d, 0x90, 0xf0, 0xb7, 0x18, 0xd5, - 0xa0, 0xae, 0x19, 0xf4, 0x4a, 0x3a, 0x2e, 0x44, 0x76, 0x29, 0xd4, 0x77, - 0x60, 0xcd, 0xf0, 0x72, 0xb3, 0x91, 0x0b, 0xc3, 0x31, 0x77, 0x37, 0x4f, - 0xf3, 0x18, 0x72, 0x25, 0x34, 0xf4, 0x04, 0x63, 0x0d, 0x92, 0x6c, 0x79, - 0x9c, 0xd4, 0xcc, 0xfd, 0xf4, 0xcf, 0xfb, 0xd5, 0x2d, 0xa2, 0x14, 0x06, - 0x15, 0x80, 0x03, 0x9f, 0xa3, 0xac, 0x3d, 0xdc, 0xa5, 0xbf, 0xe3, 0x5c, - 0x32, 0x58, 0x6f, 0x77, 0x78, 0x11, 0x97, 0x1c, 0xf3, 0xf6, 0x12, 0xd9, - 0x13, 0xdd, 0x19, 0x67, 0xb2, 0x71, 0xed, 0xfa, 0x83, 0x19, 0x35, 0x74, - 0xc6, 0x1b, 0xae, 0x0d, 0xdb, 0x6f, 0xac, 0xa6, 0x14, 0x14, 0x09, 0x49, - 0xd4, 0xe6, 0x6f, 0x20, 0x27, 0xc8, 0x87, 0x44, 0xba, 0xc2, 0xa4, 0x9c, - 0x62, 0xeb, 0x21, 0xdf, 0x36, 0x1c, 0x08, 0xdb, 0x38, 0x5c, 0xa8, 0x85, - 0xf8, 0x46, 0x4b, 0x9f, 0x9c, 0x82, 0x63, 0x16, 0x8a, 0x96, 0xcf, 0x35, - 0xbe, 0xdf, 0x78, 0xfb, 0x63, 0x45, 0xf0, 0x9a, 0x26, 0x76, 0x5c, 0xd3, - 0x55, 0x75, 0x4c, 0x26, 0x00, 0x1a, 0xfd, 0x27, 0xbf, 0x95, 0x40, 0xc5, - 0xf6, 0x98, 0xec, 0x2f, 0x47, 0xb0, 0xfe, 0xc5, 0xbf, 0x3d, 0xe6, 0xbf, - 0x92, 0x2a, 0xf4, 0xa8, 0x59, 0x5b, 0x31, 0x76, 0xbe, 0x53, 0x34, 0xa0, - 0x17, 0x6d, 0x9d, 0xa3, 0xc4, 0x4e, 0x18, 0xa6, 0xb0, 0x0b, 0xba, 0xa8, - 0x1f, 0xb0, 0xb9, 0x60, 0x5e, 0x4a, 0x36, 0xd6, 0xce, 0xbd, 0xb2, 0x10, - 0xca, 0x16, 0xd0, 0xa1, 0xa1, 0x48, 0x7d, 0xb7, 0x4a, 0xa3, 0x6a, 0x04, - 0x49, 0xcf, 0x09, 0x9f, 0x01, 0x76, 0x2d, 0x6e, 0x42, 0x25, 0xe4, 0xdd, - 0xcb, 0x67, 0xbf, 0x14, 0xa9, 0x02, 0x3e, 0xdc, 0x83, 0x86, 0xc8, 0x12, - 0xd7, 0x0a, 0xfe, 0x15, 0x7d, 0x98, 0xa6, 0x4e, 0xff, 0x05, 0x01, 0x76, - 0x6f, 0xd6, 0xd8, 0xe8, 0x7c, 0xd4, 0xbc, 0x44, 0x8d, 0xf3, 0x50, 0x38, - 0xe7, 0x2b, 0xba, 0xd6, 0x2c, 0xde, 0xc8, 0x54, 0x18, 0xc0, 0x02, 0x34, - 0x4b, 0xd0, 0x6f, 0x45, 0x73, 0xdf, 0x72, 0x80, 0xa0, 0x6a, 0xfa, 0x2b, - 0x54, 0xcd, 0x06, 0x21, 0x2a, 0xb3, 0x1c, 0xd1, 0x62, 0xf6, 0x92, 0xab, - 0x86, 0x7d, 0xa4, 0x53, 0x98, 0x81, 0xa9, 0x72, 0xdc, 0x59, 0xf8, 0x83, - 0x16, 0xa6, 0x42, 0xc4, 0x5c, 0x40, 0x46, 0x24, 0xe7, 0x50, 0x12, 0x9c, - 0x0c, 0x1b, 0xaa, 0x44, 0x84, 0xc2, 0xb0, 0xdc, 0x93, 0x00, 0x87, 0x0e, - 0x43, 0x5c, 0x6f, 0x2a, 0x60, 0x26, 0xe2, 0x2f, 0x57, 0xfb, 0xb0, 0xbd, - 0xed, 0xea, 0x23, 0x17, 0x23, 0xdb, 0xe7, 0x86, 0xfa, 0xe7, 0x21, 0xf4, - 0x14, 0xaf, 0xcf, 0x7a, 0x5e, 0xf7, 0x9e, 0x36, 0x72, 0x37, 0x4f, 0xa4, - 0x87, 0x9f, 0x3a, 0x70, 0x5d, 0x72, 0xd5, 0x23, 0x98, 0xf4, 0x53, 0xf1, - 0xc7, 0x5b, 0x8b, 0x0d, 0x21, 0x34, 0x9c, 0xd2, 0x24, 0x72, 0x29, 0x1a, - 0x78, 0x9b, 0x19, 0xb1, 0xf9, 0x1e, 0x08, 0xc7, 0xa9, 0xa2, 0xf1, 0xe0, - 0xb4, 0xd5, 0xb1, 0xea, 0x50, 0xa3, 0xfa, 0x00, 0xad, 0xc2, 0xd6, 0xd7, - 0x84, 0x1f, 0x68, 0x73, 0x17, 0x8d, 0xde, 0xec, 0x6f, 0x34, 0x8e, 0xdf, - 0x53, 0x3a, 0x80, 0x88, 0x6e, 0xa3, 0x3c, 0x87, 0x73, 0x59, 0x3b, 0x68, - 0x57, 0x41, 0x2b, 0xb9, 0x02, 0x5b, 0x5b, 0x7b, 0xe4, 0xfa, 0x57, 0xd8, - 0x01, 0x5e, 0xee, 0x9b, 0xe0, 0x28, 0xc4, 0x54, 0xb1, 0x68, 0x4e, 0x0f, - 0xa9, 0x94, 0x20, 0xe2, 0x92, 0x07, 0x56, 0xca, 0x7c, 0x7f, 0x03, 0x82, - 0x96, 0x49, 0x60, 0x95, 0x12, 0xae, 0x10, 0xd1, 0x6d, 0x2b, 0x36, 0x7f, - 0xbd, 0xc8, 0x08, 0x93, 0x2f, 0xd1, 0x32, 0x07, 0xc3, 0x46, 0x05, 0x90, - 0x16, 0xdc, 0x2f, 0x9a, 0xd4, 0xf0, 0x8e, 0x7c, 0x86, 0x0c, 0xdc, 0xf2, - 0x2e, 0x93, 0x37, 0x3f, 0x0c, 0x4c, 0x00, 0xe3, 0xf9, 0x0d, 0xc7, 0x5b, - 0x4b, 0x06, 0xe2, 0x9f, 0x63, 0x99, 0x8f, 0x85, 0x7d, 0x77, 0x65, 0x9c, - 0x6a, 0xe8, 0x2f, 0xec, 0xd3, 0x85, 0xf7, 0x2a, 0x92, 0x97, 0x66, 0xd9, - 0xcd, 0x20, 0xbd, 0x7e, 0xaa, 0xd6, 0xa0, 0x01, 0x36, 0x07, 0x85, 0x90, - 0xe6, 0x5c, 0x2f, 0x4a, 0xe6, 0x35, 0xd6, 0x41, 0xe5, 0xf5, 0xae, 0x8f, - 0x2b, 0x27, 0xf6, 0xa5, 0x4b, 0xa7, 0xe0, 0xff, 0xce, 0x90, 0xe1, 0xef, - 0x62, 0xe3, 0x20, 0xf5, 0xc0, 0xda, 0x7b, 0xfb, 0x63, 0xc4, 0x75, 0x40, - 0x33, 0x23, 0xe7, 0xf0, 0x09, 0xdc, 0x5c, 0xf1, 0x4f, 0x4f, 0x29, 0x5f, - 0xf7, 0x47, 0xd9, 0x28, 0x36, 0x79, 0x36, 0xfa, 0x94, 0x20, 0x54, 0x23, - 0x07, 0x61, 0xa0, 0x88, 0x9e, 0xd9, 0x49, 0x97, 0x60, 0x02, 0x94, 0x89, - 0x07, 0x41, 0x1c, 0x30, 0x80, 0x39, 0xa6, 0xff, 0xce, 0x3e, 0x5c, 0xc6, - 0x76, 0xbe, 0x19, 0x35, 0x12, 0x04, 0x8c, 0xfa, 0xee, 0xbb, 0xf3, 0x7e, - 0xc0, 0xd4, 0x74, 0x6f, 0xe7, 0xa9, 0x65, 0x58, 0x4f, 0x83, 0x4d, 0x21, - 0xbb, 0xf5, 0x35, 0xc0, 0xce, 0xcd, 0x0e, 0xde, 0xfe, 0x05, 0xa4, 0xf8, - 0x67, 0x47, 0xb3, 0xea, 0xbc, 0x8d, 0x6c, 0x17, 0x97, 0xc6, 0xa2, 0xec, - 0x2d, 0x97, 0x25, 0x66, 0xab, 0xd7, 0x02, 0xe4, 0x8a, 0x14, 0xea, 0xfc, - 0x20, 0xb1, 0x8f, 0x45, 0x07, 0x71, 0xb8, 0x6b, 0x89, 0xd7, 0x85, 0x40, - 0x14, 0xdb, 0xb9, 0xb5, 0xf0, 0x8d, 0x7c, 0xa0, 0x4a, 0x39, 0xaf, 0x91, - 0xed, 0x8a, 0x3e, 0x4b, 0xe0, 0x51, 0x2b, 0x07, 0xfc, 0xe3, 0x6d, 0x97, - 0x4c, 0x43, 0xed, 0x6d, 0x90, 0xdc, 0xd8, 0xb9, 0x88, 0x21, 0x46, 0x11, - 0xd2, 0x72, 0xb8, 0xcb, 0x4b, 0xa1, 0x6a, 0x92, 0x56, 0x05, 0x43, 0x65, - 0xb0, 0xee, 0x44, 0x5b, 0x40, 0x35, 0xdf, 0xa4, 0x25, 0x2a, 0x5c, 0xf5, - 0xa1, 0x55, 0xfe, 0x6b, 0xa2, 0x8e, 0xe6, 0xb6, 0x70, 0xa7, 0x88, 0x49, - 0xdb, 0xbd, 0xa1, 0xc9, 0x31, 0xbe, 0xd9, 0xdd, 0x82, 0xa0, 0x06, 0x81, - 0xbd, 0x11, 0x13, 0xe0, 0xca, 0x8e, 0x37, 0xf2, 0x9e, 0x52, 0x51, 0x84, - 0xb0, 0xee, 0xf8, 0xf2, 0xb3, 0x50, 0xfe, 0x1c, 0x76, 0xdf, 0x72, 0xcf, - 0x69, 0x53, 0x0d, 0x6b, 0x86, 0xc1, 0xb0, 0x57, 0xda, 0xaa, 0xcc, 0xbb, - 0xd2, 0x51, 0x26, 0x94, 0x8b, 0x77, 0xa8, 0xc7, 0xbf, 0x29, 0x48, 0xf2, - 0xcb, 0x0d, 0x01, 0x5d, 0xda, 0xc1, 0xeb, 0xed, 0x5a, 0x11, 0xd0, 0xe1, - 0x92, 0x53, 0x74, 0x72, 0x84, 0x91, 0x78, 0xfb, 0xdf, 0x3b, 0x80, 0xf5, - 0x28, 0x9b, 0x5b, 0xe2, 0xbc, 0xd5, 0x7b, 0x4e, 0x60, 0x85, 0xb9, 0xb9, - 0xad, 0x1b, 0x3e, 0x57, 0xcc, 0x27, 0xf4, 0xe9, 0xac, 0x3e, 0xae, 0x2d, - 0x6d, 0x03, 0xcf, 0x93, 0x3f, 0x9c, 0x1d, 0xfe, 0xec, 0x70, 0x8e, 0x36, - 0x84, 0xd3, 0x5d, 0x91, 0x7f, 0xed, 0xd2, 0x75, 0x8a, 0x8a, 0x95, 0x2c, - 0x40, 0x13, 0x46, 0x73, 0xce, 0x69, 0xc5, 0x5e, 0x68, 0x21, 0x36, 0xaa, - 0xf7, 0x21, 0x8d, 0xf9, 0x40, 0x0b, 0x32, 0x05, 0xd4, 0x86, 0x0e, 0xca, - 0x60, 0x99, 0x85, 0xa5, 0x8c, 0xc0, 0x47, 0x6f, 0x39, 0x17, 0x5b, 0x45, - 0xce, 0xe0, 0x2c, 0x37, 0x3a, 0xeb, 0xde, 0x20, 0x0c, 0x11, 0xc0, 0xdb, - 0x93, 0xb0, 0xae, 0xb8, 0x86, 0x35, 0xf9, 0x9d, 0xdf, 0xfb, 0x96, 0x5e, - 0xd4, 0xc4, 0x40, 0xdc, 0xeb, 0x99, 0xa1, 0x9f, 0xd0, 0xae, 0xbd, 0x77, - 0x0a, 0xa5, 0x9e, 0xb6, 0x55, 0x6f, 0xb5, 0x4a, 0x6b, 0x80, 0x92, 0x98, - 0xf9, 0x5f, 0x4b, 0xc8, 0x47, 0xab, 0xb7, 0xd1, 0xd9, 0x7f, 0x99, 0x93, - 0x5f, 0xd8, 0xe2, 0xde, 0x84, 0x4f, 0x46, 0x96, 0x57, 0x77, 0x19, 0x21, - 0xbc, 0x93, 0x98, 0x1b, 0x65, 0x04, 0xae, 0x2d, 0x86, 0x22, 0xde, 0x27, - 0x21, 0x9b, 0x56, 0x95, 0x02, 0x7f, 0x53, 0xa2, 0xe0, 0xed, 0x9a, 0x8a, - 0xc0, 0xba, 0x43, 0xe0, 0x8f, 0x94, 0x21, 0x32, 0x71, 0xa6, 0x9f, 0xd4, - 0x50, 0x93, 0x83, 0xf8, 0x63, 0xa5, 0x42, 0x26, 0x0f, 0xfe, 0xb6, 0x0b, - 0x35, 0xe9, 0x7f, 0xfc, 0xc5, 0x8b, 0x18, 0xeb, 0xdb, 0xb2, 0xa2, 0xac, - 0x53, 0x65, 0xf4, 0xc9, 0x60, 0x8c, 0x82, 0x44, 0xc7, 0xf9, 0x6a, 0xa7, - 0x52, 0xae, 0xbd, 0x88, 0x0d, 0x7c, 0x09, 0xa0, 0xf4, 0xff, 0x0c, 0xe0, - 0xda, 0x2b, 0x91, 0x28, 0x8d, 0xa2, 0x98, 0xf7, 0x87, 0x3c, 0xe8, 0x77, - 0x8a, 0x59, 0x76, 0xf1, 0x7b, 0x35, 0xed, 0xba, 0xc0, 0x82, 0xcd, 0xfb, - 0x4f, 0x06, 0x67, 0x7e, 0xf5, 0xef, 0xa5, 0xe5, 0x54, 0xf4, 0xef, 0x97, - 0x01, 0x60, 0xd1, 0xd7, 0xd0, 0x76, 0x84, 0x45, 0x49, 0xce, 0x54, 0xd6, - 0x70, 0x8f, 0x86, 0x3d, 0x63, 0xb4, 0x95, 0xc5, 0x73, 0x08, 0x02, 0x9c, - 0xf2, 0x3e, 0xe3, 0x80, 0x84, 0xe1, 0x4a, 0xed, 0x7a, 0xb8, 0xd6, 0x47, - 0x0a, 0x07, 0xcc, 0x0a, 0x3b, 0xc6, 0xc1, 0x78, 0xb3, 0x9c, 0x5c, 0x4d, - 0x35, 0xfd, 0x75, 0x3e, 0xc7, 0x62, 0xcc, 0x08, 0xe8, 0x67, 0xe6, 0xf5, - 0xc6, 0xf7, 0x2d, 0xfb, 0x60, 0xe1, 0xdb, 0xed, 0x45, 0x64, 0x3a, 0x53, - 0x92, 0xb5, 0x99, 0xb9, 0xb4, 0x9e, 0x20, 0xf3, 0xc5, 0xa4, 0xe1, 0xb2, - 0x6d, 0x90, 0x23, 0xa9, 0xc7, 0xc7, 0x06, 0xd3, 0xd5, 0x6e, 0x97, 0x28, - 0x9b, 0x1f, 0x62, 0x5c, 0x01, 0xbd, 0xea, 0x0d, 0x9d, 0x7c, 0x13, 0x5a, - 0xbd, 0x54, 0x0b, 0xfc, 0xf6, 0x05, 0x5d, 0x4d, 0x2a, 0x37, 0x4f, 0x86, - 0x8a, 0xd0, 0x1d, 0xc0, 0xc6, 0x2e, 0xed, 0x4a, 0x3c, 0x63, 0x94, 0xb7, - 0x75, 0x38, 0xa2, 0x33, 0x40, 0x16, 0xfa, 0x29, 0xf6, 0xb9, 0xd0, 0x6b, - 0xac, 0x0d, 0x5c, 0xb8, 0xce, 0xee, 0x72, 0x16, 0x6e, 0x44, 0x79, 0xb1, - 0x15, 0xf8, 0x75, 0x3f, 0x9b, 0xd7, 0x01, 0xb7, 0xa9, 0x28, 0xc8, 0x2d, - 0x48, 0xbb, 0x8c, 0x25, 0xb3, 0xfa, 0xbd, 0x53, 0xaa, 0x33, 0x3e, 0x70, - 0xfe, 0xa6, 0x6f, 0xf5, 0xb0, 0xf2, 0x9e, 0xb2, 0xd4, 0xb3, 0x2a, 0xf9, - 0xf7, 0xa9, 0x80, 0xd9, 0x48, 0x71, 0x8b, 0xa1, 0x2f, 0xe7, 0xe6, 0xa2, - 0x4e, 0xe5, 0x91, 0xee, 0x60, 0x78, 0xb4, 0x1b, 0x99, 0x7b, 0x19, 0xc5, - 0x5c, 0xe1, 0x7d, 0x4d, 0xa3, 0x89, 0x08, 0xee, 0x94, 0xcb, 0x6a, 0x59, - 0x7a, 0x79, 0x53, 0xde, 0x72, 0x1b, 0x4d, 0xb8, 0xe3, 0x2c, 0xdb, 0xfe, - 0xd8, 0x11, 0x5f, 0x0f, 0xf5, 0xb6, 0x07, 0x61, 0x3e, 0x8f, 0x7b, 0x7b, - 0x71, 0x9e, 0x31, 0xfa, 0xb8, 0x64, 0xc1, 0xeb, 0xd9, 0xb6, 0xfa, 0xe2, - 0xfa, 0x41, 0x99, 0xd9, 0x87, 0x48, 0xb0, 0xda, 0xb9, 0x41, 0x08, 0x2e, - 0x77, 0xda, 0xe8, 0x37, 0xe6, 0x50, 0xea, 0x0f, 0x35, 0x9d, 0x85, 0x9e, - 0xe0, 0x77, 0xec, 0xd8, 0xe2, 0x28, 0x70, 0x61, 0x7d, 0x2a, 0x02, 0x00, - 0x24, 0x62, 0xe7, 0xaa, 0xfa, 0x21, 0x78, 0xdd, 0xd8, 0x45, 0x74, 0x56, - 0xaf, 0x4e, 0x52, 0xea, 0xd5, 0x87, 0x4d, 0xb8, 0x02, 0x8a, 0xaa, 0xd9, - 0xc0, 0xd4, 0xe8, 0x9d, 0xfe, 0x72, 0xbb, 0x1b, 0xd4, 0x33, 0x04, 0x16, - 0xf0, 0xa8, 0xb1, 0xb1, 0xc1, 0xa3, 0xca, 0xac, 0xd2, 0x62, 0x41, 0x0e, - 0x80, 0x31, 0xe7, 0x44, 0xdd, 0x9b, 0x08, 0x58, 0x49, 0x17, 0x90, 0x80, - 0xb9, 0x3e, 0x62, 0x6e, 0x07, 0xb0, 0x00, 0xbd, 0x32, 0x20, 0xc1, 0xbd, - 0xdd, 0x7b, 0x28, 0xff, 0x55, 0x8a, 0x11, 0x4e, 0x0c, 0x17, 0x98, 0xb5, - 0x58, 0xd9, 0xf9, 0x8c, 0xf1, 0x6d, 0x13, 0xb8, 0x58, 0x09, 0x88, 0x01, - 0x53, 0x07, 0x16, 0x5a, 0x84, 0xe1, 0x04, 0x59, 0x3d, 0x14, 0x0b, 0x31, - 0xf2, 0x45, 0x01, 0x4f, 0xaf, 0x0d, 0x0d, 0x54, 0x5c, 0x6a, 0x23, 0xad, - 0xd5, 0x1d, 0x03, 0xbc, 0x2b, 0xa3, 0x5e, 0xbc, 0x6e, 0x96, 0xb6, 0x1a, - 0xaa, 0x52, 0x47, 0x0d, 0x0a, 0x61, 0x5f, 0xfb, 0x7c, 0x6a, 0x21, 0x5d, - 0x30, 0xd3, 0xae, 0x70, 0xbe, 0xfe, 0x20, 0x61, 0xfb, 0xe3, 0xe4, 0x9c, - 0xc8, 0x9c, 0xc0, 0xa8, 0x4d, 0x55, 0x21, 0xf4, 0x4a, 0x20, 0xc2, 0x91, - 0xcc, 0xe8, 0xf2, 0xad, 0xcb, 0x45, 0xb8, 0x11, 0x0a, 0xa1, 0xfa, 0x6b, - 0x61, 0xa1, 0xee, 0xac, 0x1e, 0x04, 0xe3, 0xfe, 0xfc, 0xd8, 0x73, 0xa4, - 0x64, 0x19, 0x2d, 0x23, 0xe4, 0x19, 0xa6, 0xd6, 0x2e, 0x7b, 0x10, 0x93, - 0x2c, 0xbb, 0xde, 0x46, 0xc9, 0x25, 0x98, 0x5f, 0xc0, 0x7c, 0xaa, 0xad, - 0x85, 0x24, 0x9f, 0xa3, 0xd5, 0xc1, 0x7e, 0xc0, 0x53, 0x45, 0x68, 0x1e, - 0x36, 0xad, 0x11, 0xa7, 0x31, 0x85, 0x07, 0x24, 0xfc, 0xf1, 0x37, 0x9c, - 0x6a, 0x27, 0x2e, 0xf4, 0xe9, 0x63, 0xd0, 0x5f, 0x4d, 0x57, 0x72, 0xf6, - 0x61, 0xec, 0x22, 0x6e, 0x20, 0x19, 0x6d, 0xb3, 0x08, 0xd0, 0xb7, 0x67, - 0xe9, 0x26, 0x67, 0x4a, 0x61, 0xe5, 0xd9, 0xa7, 0x8e, 0xda, 0x88, 0xab, - 0x39, 0xd4, 0x56, 0x6a, 0xae, 0xf5, 0xf8, 0x91, 0x12, 0x94, 0x08, 0x1d, - 0x73, 0xf3, 0xb1, 0x11, 0x03, 0xcc, 0xbb, 0x31, 0x02, 0x08, 0x83, 0xdf, - 0x51, 0xe9, 0x0f, 0x3f, 0xf9, 0x28, 0x64, 0x78, 0xfd, 0xeb, 0xfd, 0x6b, - 0xeb, 0x96, 0x72, 0xe1, 0x06, 0x8a, 0x40, 0x43, 0x05, 0xd1, 0x35, 0x7e, - 0x4b, 0xce, 0x0d, 0xa7, 0x05, 0x87, 0xf6, 0xe6, 0x22, 0x99, 0x09, 0x90, - 0xe6, 0x6c, 0x9c, 0x58, 0x91, 0x34, 0xfa, 0x5a, 0x53, 0x66, 0x4f, 0xe9, - 0x47, 0x8a, 0xb2, 0xba, 0xfb, 0xba, 0x5e, 0xae, 0x9f, 0x70, 0x6e, 0xac, - 0xee, 0x28, 0x6b, 0xeb, 0x14, 0xfb, 0x13, 0xfd, 0xdf, 0x20, 0x2e, 0xb6, - 0xeb, 0x50, 0x4c, 0x9c, 0xe1, 0xd2, 0x7f, 0x03, 0x1f, 0x3b, 0x2a, 0xc3, - 0x78, 0xfb, 0xb1, 0x63, 0x0f, 0x23, 0xe9, 0x96, 0x59, 0xc1, 0x30, 0x11, - 0x66, 0x06, 0x47, 0xf0, 0x2b, 0xf3, 0xfb, 0xc6, 0x31, 0xc9, 0xba, 0x18, - 0xec, 0xb1, 0x03, 0x6a, 0xf5, 0x50, 0xcd, 0x51, 0x1c, 0x4f, 0xb5, 0xe0, - 0x54, 0xa0, 0x12, 0x08, 0x91, 0xac, 0x2a, 0x10, 0x7d, 0xfe, 0x2c, 0x57, - 0xce, 0xee, 0x30, 0x36, 0xa3, 0xa7, 0xc2, 0x33, 0x26, 0x83, 0xd8, 0x5d, - 0xf2, 0x49, 0xc7, 0xa8, 0xf3, 0xca, 0x27, 0x55, 0xfd, 0xcb, 0xfb, 0x11, - 0xca, 0x66, 0xb9, 0x24, 0xcd, 0xc3, 0x45, 0x87, 0x02, 0xd5, 0x3b, 0x01, - 0x41, 0xc0, 0xa6, 0x0d, 0x53, 0xbf, 0x04, 0xa5, 0xee, 0xc7, 0xbf, 0x3c, - 0x91, 0x88, 0xc4, 0x67, 0xf3, 0x54, 0x23, 0x1b, 0x6e, 0xfb, 0xb2, 0xbb, - 0x2c, 0x92, 0xbe, 0x75, 0x54, 0xbe, 0xa6, 0xb6, 0xb4, 0x19, 0x95, 0xe0, - 0x65, 0x2e, 0x36, 0xb5, 0x2e, 0x95, 0x05, 0x88, 0x42, 0x23, 0x4c, 0xd5, - 0xe8, 0x4a, 0x9d, 0x54, 0xf8, 0x14, 0x8f, 0x56, 0x1b, 0x58, 0xda, 0xdd, - 0x86, 0xfd, 0xc7, 0x17, 0xd2, 0x41, 0x07, 0xae, 0x03, 0x39, 0x54, 0x4c, - 0x56, 0xdd, 0xdf, 0x28, 0x61, 0x85, 0x23, 0x34, 0xdc, 0x3f, 0x3d, 0x93, - 0x73, 0x62, 0x9a, 0xe8, 0x1e, 0xc9, 0xd1, 0x9d, 0x94, 0x67, 0xa9, 0x9d, - 0x46, 0xdf, 0x31, 0x51, 0xe3, 0x32, 0x99, 0xa0, 0x42, 0x15, 0x85, 0x0e, - 0x58, 0xdf, 0x1a, 0x7c, 0x05, 0xee, 0xe2, 0xaf, 0xd1, 0xc8, 0xd2, 0x0e, - 0x26, 0xd7, 0xbc, 0xc4, 0xaf, 0xeb, 0x86, 0x3c, 0x62, 0xda, 0xeb, 0x2e, - 0x2f, 0x98, 0x7d, 0xd4, 0x88, 0x82, 0x70, 0xa5, 0xea, 0xf8, 0x9c, 0x1b, - 0xba, 0x9f, 0xeb, 0xf5, 0x08, 0xb9, 0xee, 0xe0, 0xae, 0xec, 0x00, 0xed, - 0xbb, 0x24, 0xee, 0x1a, 0xdf, 0x83, 0x29, 0xe8, 0x2a, 0x57, 0x33, 0xa7, - 0x58, 0x78, 0x3b, 0x89, 0x93, 0xc3, 0x7a, 0xd4, 0x35, 0xd8, 0x6c, 0xdb, - 0x81, 0x62, 0x2c, 0xe0, 0x8e, 0xc8, 0x75, 0xe3, 0x4e, 0x64, 0x1e, 0x89, - 0x44, 0x4a, 0x87, 0x98, 0xc8, 0xa4, 0xe8, 0x67, 0xfc, 0x7d, 0xbf, 0xd5, - 0x24, 0xc9, 0x0b, 0xdf, 0xe7, 0x49, 0x01, 0xa4, 0x80, 0xa9, 0xd9, 0x7a, - 0x69, 0x55, 0x68, 0x66, 0x58, 0xb8, 0x35, 0x86, 0x67, 0x98, 0x5c, 0x2c, - 0x5d, 0x74, 0x91, 0x9b, 0x65, 0x78, 0x2c, 0x6c, 0x51, 0x97, 0xdf, 0x42, - 0x49, 0xda, 0xe6, 0x2d, 0x03, 0x7e, 0x3b, 0xdf, 0x5e, 0x87, 0x0f, 0x20, - 0x1d, 0xb7, 0x9f, 0xbe, 0x94, 0x79, 0x59, 0xc5, 0x8d, 0xeb, 0x31, 0xcd, - 0x08, 0x9c, 0x17, 0xbe, 0x11, 0x65, 0x81, 0x9f, 0x22, 0xf2, 0xf9, 0x86, - 0xe3, 0xec, 0xee, 0xd1, 0x9b, 0xfc, 0xe7, 0x02, 0x54, 0xf9, 0x20, 0xa2, - 0x7b, 0x4c, 0x70, 0xbc, 0x80, 0x11, 0xac, 0x7f, 0xd4, 0x8a, 0x49, 0x26, - 0x9e, 0x26, 0x9b, 0xcd, 0x70, 0xe1, 0x1d, 0xa0, 0xa0, 0x98, 0xfd, 0x91, - 0xb4, 0x48, 0xbd, 0x89, 0x0d, 0x6f, 0x68, 0xdf, 0x4d, 0x73, 0x00, 0x51, - 0xc5, 0x4b, 0x18, 0xec, 0xd6, 0x02, 0xff, 0x9d, 0x1a, 0xe7, 0xed, 0xeb, - 0xe1, 0x05, 0xa2, 0xd8, 0xb3, 0x38, 0xc0, 0x5f, 0x75, 0x99, 0x71, 0x31, - 0xb2, 0x48, 0x21, 0x6a, 0x42, 0x34, 0x47, 0x9b, 0xe5, 0xa4, 0x5a, 0x28, - 0x9b, 0x49, 0x2f, 0xa7, 0x21, 0x30, 0xfa, 0x57, 0x06, 0x99, 0xf6, 0x62, - 0x11, 0x1d, 0x03, 0x8e, 0xb6, 0x70, 0x45, 0x20, 0x85, 0x5f, 0x32, 0x12, - 0x55, 0x8f, 0x87, 0xd9, 0x2e, 0x90, 0x1b, 0x6a, 0x3d, 0x22, 0x0f, 0x2b, - 0x93, 0x6a, 0x06, 0xaf, 0x62, 0xe2, 0xdb, 0x43, 0x75, 0xeb, 0x6a, 0xcf, - 0xc1, 0x7a, 0x25, 0xcf, 0x65, 0x42, 0x09, 0x77, 0xa9, 0x3e, 0x54, 0xe7, - 0x8c, 0x89, 0x4f, 0xb5, 0x9b, 0x0d, 0xa6, 0x5f, 0xd1, 0xf8, 0x22, 0xf1, - 0x59, 0x6b, 0x6b, 0x4a, 0xd9, 0xaf, 0xd7, 0x51, 0xdc, 0x6c, 0x92, 0x54, - 0x38, 0x0e, 0xc6, 0x11, 0x06, 0xab, 0xc0, 0x9c, 0xdd, 0x05, 0x73, 0x9e, - 0x95, 0x08, 0x1b, 0xfe, 0x1e, 0xd0, 0x45, 0x3f, 0xd4, 0x16, 0x6c, 0x9a, - 0x1f, 0x2c, 0x97, 0x10, 0x95, 0x97, 0xcf, 0x39, 0xb4, 0x39, 0x3a, 0x30, - 0xf1, 0x60, 0x06, 0x90, 0x1c, 0x05, 0x75, 0xd0, 0x25, 0x22, 0xc1, 0x1f, - 0x2c, 0x09, 0x7c, 0x82, 0xe7, 0xbb, 0x43, 0xd6, 0x7b, 0xe8, 0x6c, 0x03, - 0x62, 0x8f, 0x0b, 0x92, 0x80, 0x05, 0x94, 0xc7, 0x2d, 0x22, 0x59, 0x52, - 0x47, 0xf8, 0xed, 0x4e, 0x29, 0xe1, 0x50, 0x04, 0x00, 0x8e, 0x68, 0x54, - 0x42, 0x03, 0x88, 0x41, 0x53, 0x81, 0x04, 0x92, 0x98, 0x88, 0x16, 0x00, - 0x88, 0x45, 0xf1, 0xaf, 0xee, 0xdd, 0xf7, 0x20, 0x2b, 0xf8, 0x05, 0x97, - 0x31, 0xe9, 0x43, 0x74, 0x20, 0x20, 0x37, 0xa2, 0xcb, 0x72, 0x70, 0xc1, - 0xfd, 0x57, 0x2d, 0x3c, 0x97, 0x86, 0x92, 0x9b, 0xa8, 0x53, 0x1c, 0x32, - 0xbb, 0xec, 0x2a, 0x56, 0x0a, 0xf6, 0xbd, 0xfd, 0x20, 0x80, 0x4c, 0xdf, - 0xa0, 0x69, 0xc5, 0x5e, 0x9e, 0x2a, 0x71, 0x91, 0x8f, 0x96, 0xe2, 0xd6, - 0x77, 0x4c, 0x12, 0xee, 0x39, 0xee, 0x45, 0x97, 0x19, 0x78, 0x78, 0xb3, - 0x7f, 0x19, 0xc6, 0xe6, 0x23, 0x14, 0xe1, 0x23, 0xd9, 0xc2, 0xe1, 0x51, - 0x86, 0x9d, 0x9a, 0xa2, 0x15, 0xc6, 0x88, 0xc7, 0x45, 0xdc, 0x05, 0x4c, - 0x8f, 0xa7, 0x03, 0x66, 0xd7, 0x40, 0x95, 0xb8, 0x44, 0x45, 0xe2, 0x81, - 0x79, 0x85, 0x7e, 0x52, 0xc2, 0xe4, 0x88, 0xd3, 0x49, 0xf4, 0xdc, 0xda, - 0x02, 0x6b, 0x7c, 0xf4, 0xfa, 0x2e, 0x76, 0xb0, 0xd1, 0x0c, 0x84, 0x9e, - 0x82, 0xca, 0xd6, 0x13, 0xe1, 0x8c, 0x23, 0xa2, 0xc5, 0xae, 0x97, 0x0a, - 0x01, 0xae, 0xfe, 0xa0, 0xf0, 0x0b, 0xb9, 0x84, 0x55, 0xd3, 0x43, 0x98, - 0xed, 0xda, 0x79, 0x76, 0x9d, 0x4f, 0x25, 0xc8, 0x65, 0xba, 0xd2, 0x81, - 0xae, 0x1a, 0x83, 0x9d, 0x79, 0x57, 0xb9, 0x90, 0xab, 0x14, 0x41, 0x0c, - 0xcf, 0xfb, 0x12, 0xde, 0x9b, 0xd2, 0xb7, 0x6a, 0x2a, 0x7c, 0x79, 0x55, - 0x62, 0x8a, 0xbe, 0xca, 0xf6, 0x78, 0x26, 0x8c, 0xd2, 0xfa, 0x08, 0xb5, - 0x7a, 0x01, 0x35, 0xc4, 0x8b, 0x62, 0x47, 0x2e, 0x3e, 0x0e, 0x58, 0x0e, - 0xc3, 0xd9, 0x08, 0x96, 0xb7, 0x86, 0x06, 0x99, 0x75, 0xa2, 0x4f, 0xe8, - 0xf8, 0x83, 0x91, 0xfb, 0x69, 0x90, 0x81, 0x41, 0x9c, 0x44, 0xe6, 0x19, - 0x5a, 0x85, 0xc0, 0x64, 0xf9, 0xb6, 0x89, 0x70, 0xa3, 0xf1, 0x5a, 0x9b, - 0xf6, 0xd5, 0xb0, 0x7b, 0x5e, 0xdd, 0xf1, 0xa4, 0x6a, 0xe6, 0xa9, 0x8c, - 0x35, 0xa7, 0x5b, 0x6c, 0xc7, 0x55, 0xd5, 0xae, 0x88, 0x9b, 0xd9, 0x9c, - 0x4e, 0xfc, 0x0f, 0x93, 0x6a, 0x64, 0x58, 0xa2, 0xc2, 0x09, 0x8a, 0x71, - 0x99, 0xc8, 0x60, 0x7f, 0x32, 0x3f, 0xc7, 0xed, 0x8c, 0xe9, 0x69, 0xe9, - 0x2f, 0xf8, 0xdf, 0x04, 0x9a, 0xf1, 0x2d, 0x34, 0x01, 0x5d, 0x74, 0x23, - 0x07, 0x28, 0xd9, 0x3c, 0x9b, 0xf6, 0x56, 0xb0, 0xc4, 0x44, 0x53, 0x3e, - 0x61, 0x28, 0x18, 0x2b, 0xf3, 0x7c, 0x02, 0x36, 0x14, 0x34, 0x00, 0x73, - 0x6c, 0xe9, 0x8c, 0xd8, 0xc1, 0xf5, 0x30, 0x50, 0x25, 0x36, 0x72, 0x69, - 0xec, 0xd7, 0xb2, 0x61, 0x86, 0xe1, 0xce, 0x42, 0xf5, 0xb6, 0x1b, 0xc9, - 0xfd, 0xb2, 0x90, 0xc5, 0xac, 0xb4, 0x4f, 0x90, 0x7f, 0x59, 0xa2, 0xbd, - 0x46, 0x8b, 0xce, 0xa7, 0xf5, 0x29, 0xf4, 0x92, 0x49, 0x6b, 0x9a, 0xeb, - 0x33, 0x97, 0xdb, 0x81, 0x3c, 0x2f, 0x3b, 0xd7, 0x2d, 0xf2, 0xea, 0xc8, - 0x7d, 0xb1, 0x2d, 0xb9, 0x35, 0x28, 0xf3, 0x22, 0x41, 0x52, 0x1c, 0x34, - 0x55, 0x12, 0x88, 0x57, 0x36, 0xc7, 0xeb, 0xf1, 0x3c, 0x69, 0x46, 0x4e, - 0xb2, 0x63, 0x1c, 0xbe, 0x41, 0xf9, 0xcf, 0x61, 0x4e, 0xf4, 0xa4, 0x98, - 0x36, 0x1f, 0xfd, 0xc0, 0x4d, 0x94, 0xb9, 0x46, 0x0a, 0xc2, 0x7e, 0xe7, - 0xfc, 0xa2, 0x48, 0x18, 0xd9, 0x73, 0x74, 0x73, 0x8a, 0x08, 0x65, 0x8d, - 0x5b, 0xa5, 0xbc, 0x8d, 0xb0, 0x55, 0x36, 0x61, 0x52, 0xf8, 0xa6, 0x16, - 0x2b, 0xd0, 0x2f, 0x08, 0x2f, 0xa3, 0xef, 0xc7, 0xa5, 0xd9, 0xae, 0xf9, - 0xe8, 0xd3, 0xa3, 0xd7, 0x7b, 0x9c, 0x72, 0x59, 0x19, 0xa7, 0xcb, 0x64, - 0x62, 0xf6, 0x29, 0xca, 0x10, 0x67, 0x07, 0x10, 0xb0, 0x51, 0x82, 0x7e, - 0xda, 0x9f, 0x8b, 0x9f, 0xf6, 0xf5, 0x2c, 0x11, 0x81, 0x0c, 0xd5, 0x41, - 0xe0, 0xc1, 0x10, 0xaa, 0xf9, 0x9f, 0x0f, 0x30, 0x0f, 0xc4, 0x62, 0x66, - 0x27, 0x4a, 0x68, 0xb3, 0x04, 0x15, 0x1b, 0xd2, 0x78, 0x24, 0x96, 0xa3, - 0x02, 0xa0, 0x7b, 0x4d, 0xff, 0x64, 0xcb, 0xd0, 0xa4, 0x72, 0x3f, 0xcc, - 0xe6, 0x8f, 0x25, 0x60, 0x2f, 0xdf, 0xb8, 0xbd, 0xa0, 0x7f, 0xe6, 0xff, - 0x08, 0x8a, 0xc9, 0x1d, 0x9c, 0x0d, 0xa6, 0xa8, 0x6d, 0x1b, 0x1d, 0x96, - 0x7d, 0xe5, 0xa4, 0xe9, 0xf9, 0x65, 0x33, 0xcc, 0xe7, 0x56, 0xf4, 0x41, - 0x1b, 0xf2, 0xc9, 0xb4, 0xb0, 0xdc, 0xe7, 0xfd, 0x48, 0x4d, 0xff, 0x1d, - 0x97, 0x33, 0x48, 0x4f, 0x62, 0x68, 0xc5, 0x74, 0xb1, 0xac, 0x1c, 0xca, - 0x5d, 0x86, 0xa0, 0xb9, 0x2b, 0x7f, 0x77, 0x8d, 0x2c, 0xd9, 0x4b, 0xc5, - 0x8e, 0xe7, 0xf2, 0xe8, 0x44, 0xc8, 0x4f, 0x9d, 0x16, 0x17, 0xf9, 0x79, - 0xbb, 0x2b, 0x3a, 0xa3, 0x43, 0x02, 0x74, 0x50, 0x65, 0xec, 0xa7, 0xd0, - 0x74, 0xeb, 0x6c, 0x5b, 0xad, 0x00, 0x0e, 0x0d, 0xaa, 0x20, 0xd2, 0x27, - 0xe3, 0x6d, 0xe6, 0x42, 0x81, 0xfc, 0xfa, 0x2f, 0xe9, 0x67, 0x13, 0x76, - 0x09, 0xfe, 0x54, 0x19, 0xf5, 0x26, 0x7b, 0xef, 0x31, 0xe5, 0x2b, 0x19, - 0xd6, 0xff, 0x71, 0x7b, 0xc1, 0x84, 0xce, 0x36, 0x83, 0x09, 0xdc, 0x1f, - 0xa7, 0x5b, 0x35, 0xca, 0x64, 0xe0, 0x60, 0xdd, 0x00, 0x55, 0x01, 0xa2, - 0x41, 0x24, 0x11, 0x26, 0xd4, 0xda, 0x59, 0x79, 0xf3, 0xba, 0xeb, 0xda, - 0x70, 0x75, 0xed, 0xee, 0x80, 0x38, 0x48, 0x2f, 0xdb, 0xff, 0x95, 0x10, - 0x13, 0x94, 0x27, 0x65, 0xd1, 0x45, 0x88, 0x03, 0xca, 0x22, 0x8b, 0x2f, - 0x2b, 0xc2, 0xa7, 0xe5, 0xd3, 0x33, 0x2f, 0x6a, 0x6e, 0x3d, 0x7b, 0xbb, - 0x63, 0x30, 0xc6, 0x89, 0x33, 0x1c, 0xd6, 0x57, 0xd6, 0x13, 0xca, 0x51, - 0xcb, 0x44, 0x2c, 0xc3, 0xf9, 0xda, 0x61, 0xd1, 0x16, 0x0e, 0x55, 0x72, - 0xd2, 0x7d, 0x5e, 0xeb, 0x88, 0x50, 0xb6, 0x43, 0x48, 0x9e, 0x16, 0x5b, - 0xa6, 0x80, 0x6e, 0xf3, 0x0d, 0x92, 0x51, 0x70, 0xa1, 0x11, 0xd3, 0xde, - 0x08, 0x27, 0x6f, 0xcd, 0x5c, 0xd5, 0x65, 0xf9, 0x70, 0x91, 0xd1, 0xa6, - 0xa9, 0xac, 0xbe, 0xaa, 0x79, 0x65, 0x0d, 0x37, 0x29, 0x62, 0x76, 0xc8, - 0x78, 0xcf, 0xde, 0x57, 0x0f, 0xb2, 0xdb, 0xb7, 0x82, 0x76, 0x5c, 0xc3, - 0xe6, 0xaa, 0x91, 0xec, 0x43, 0x51, 0x4e, 0xea, 0x31, 0x61, 0x45, 0x45, - 0xb0, 0x2a, 0x8e, 0xde, 0xd4, 0xae, 0x7d, 0x82, 0x59, 0x96, 0x31, 0x5c, - 0xb8, 0xab, 0x4a, 0xb4, 0x72, 0x65, 0xee, 0x56, 0xd5, 0x94, 0x95, 0xdf, - 0xb1, 0x12, 0x8d, 0xe1, 0x92, 0x70, 0x5d, 0xb2, 0x7f, 0x37, 0xcd, 0x18, - 0x65, 0xd4, 0x31, 0xbb, 0xe3, 0x91, 0x37, 0x40, 0x40, 0xf3, 0x51, 0xf4, - 0x77, 0x51, 0xd6, 0x71, 0xab, 0x41, 0x3f, 0x4e, 0x78, 0x75, 0x0d, 0x78, - 0x94, 0x72, 0x45, 0x0c, 0xf0, 0x0d, 0xc8, 0x01, 0x07, 0x5f, 0xee, 0x6a, - 0x72, 0x5b, 0x18, 0x58, 0x1b, 0x97, 0x97, 0xf5, 0x7a, 0xee, 0x8a, 0xa6, - 0x0c, 0x77, 0x18, 0x9e, 0x8c, 0xe5, 0xf6, 0xa4, 0x38, 0xd6, 0x47, 0xc1, - 0x6f, 0x32, 0x3a, 0x2e, 0xda, 0x04, 0x21, 0x71, 0xdf, 0x0c, 0x8d, 0x69, - 0x61, 0x0a, 0x92, 0x89, 0x24, 0x5e, 0x61, 0x47, 0xd7, 0x87, 0xf1, 0xd4, - 0x27, 0xab, 0x51, 0x50, 0x48, 0xbd, 0x5e, 0x70, 0x69, 0x72, 0x53, 0xd6, - 0x90, 0x3a, 0xed, 0xf4, 0xeb, 0x0a, 0xc4, 0xf1, 0xc5, 0x28, 0xbc, 0xa1, - 0x84, 0x76, 0xa9, 0x74, 0x62, 0x98, 0x65, 0x49, 0xc8, 0xfa, 0x8a, 0x58, - 0x37, 0x8c, 0x21, 0x4d, 0x7a, 0x2d, 0x22, 0xd5, 0xcf, 0xc5, 0x08, 0xac, - 0x81, 0x64, 0x0c, 0xc4, 0x69, 0x2c, 0x6c, 0x3c, 0xec, 0x53, 0xe7, 0x40, - 0x3a, 0xef, 0x91, 0x5d, 0x98, 0x60, 0xe7, 0xd7, 0xd7, 0x7b, 0x29, 0x7a, - 0x8e, 0xbc, 0xa4, 0x81, 0xf2, 0xe9, 0x95, 0x43, 0x30, 0x4d, 0x2b, 0x98, - 0x9a, 0xd7, 0x5a, 0xe5, 0x5c, 0xff, 0x1d, 0x0c, 0x02, 0x78, 0x4f, 0x0c, - 0xff, 0xb1, 0x66, 0xbc, 0x82, 0x19, 0xb6, 0xe9, 0x3c, 0xfa, 0xb1, 0xae, - 0x29, 0x1e, 0xd9, 0xb0, 0x34, 0xeb, 0x2b, 0x23, 0xa0, 0xc2, 0x8e, 0xcc, - 0xaf, 0x54, 0x4f, 0x35, 0x2b, 0x83, 0x76, 0x1d, 0xfe, 0x7c, 0xa6, 0x10, - 0xaa, 0x88, 0xee, 0xfe, 0x69, 0xd8, 0x19, 0x30, 0x58, 0x1a, 0xe9, 0x5d, - 0xbd, 0xe5, 0xf3, 0x82, 0x17, 0x95, 0x44, 0xb0, 0xf6, 0x8e, 0xb1, 0x8d, - 0x29, 0xa2, 0x25, 0x29, 0x02, 0x66, 0xa0, 0x6e, 0xc3, 0x1a, 0x4e, 0xd5, - 0xf8, 0x50, 0x5c, 0x22, 0xcc, 0x56, 0x6c, 0x32, 0x0e, 0xc8, 0x65, 0xe0, - 0x13, 0xbe, 0x21, 0xae, 0xa1, 0xbf, 0x6b, 0xa6, 0x2b, 0xaa, 0x65, 0x74, - 0x1c, 0xcb, 0x18, 0xb8, 0xc9, 0x50, 0x7e, 0x86, 0xeb, 0xfc, 0xcb, 0xb5, - 0xfd, 0x7e, 0x8c, 0x33, 0x7c, 0x35, 0x49, 0xdb, 0x9f, 0xd9, 0x43, 0xc5, - 0x2f, 0xa7, 0x6c, 0x22, 0x59, 0xcf, 0x5c, 0x9d, 0x74, 0xc3, 0xdf, 0xff, - 0xc0, 0x5f, 0xd5, 0xc5, 0x9f, 0xb9, 0xb7, 0x0b, 0x90, 0xdd, 0x30, 0x2e, - 0x96, 0x45, 0xb5, 0x4d, 0x09, 0x40, 0xf2, 0x01, 0x3c, 0xad, 0x37, 0xf6, - 0xbc, 0xb2, 0x76, 0x10, 0x12, 0xe4, 0x61, 0x41, 0x00, 0xc0, 0x65, 0xaf, - 0x38, 0x76, 0x41, 0x90, 0x0d, 0x1a, 0xa6, 0xeb, 0x78, 0x93, 0xd1, 0xbf, - 0x59, 0x9e, 0x09, 0x5f, 0x58, 0x1c, 0x13, 0x81, 0x43, 0x15, 0x71, 0x6d, - 0x64, 0x0d, 0x83, 0x88, 0x24, 0x46, 0x35, 0x1b, 0xf3, 0x0c, 0x77, 0x6f, - 0xd6, 0x8a, 0x7e, 0x1e, 0x26, 0x13, 0xd7, 0x7c, 0x3e, 0x85, 0x27, 0xce, - 0xfb, 0xe5, 0x2b, 0x17, 0x43, 0xd8, 0x1e, 0xae, 0x26, 0xd3, 0x1b, 0x00, - 0xc5, 0xd7, 0xbf, 0x75, 0x6d, 0xff, 0x34, 0x6b, 0xf3, 0x36, 0x47, 0x3e, - 0x4b, 0x6b, 0x5e, 0x13, 0x00, 0x7e, 0x43, 0xbb, 0x63, 0x8d, 0x55, 0xde, - 0xfd, 0x76, 0x47, 0x8d, 0xd2, 0xcb, 0x59, 0xe6, 0x23, 0xe8, 0x5e, 0x81, - 0x7d, 0x7e, 0xbb, 0x76, 0x6e, 0x5f, 0x21, 0xa4, 0x3c, 0x76, 0xe7, 0x50, - 0x67, 0xf6, 0xf8, 0x14, 0xb5, 0xc7, 0xb7, 0x15, 0x55, 0x8c, 0xf8, 0xd5, - 0x32, 0x91, 0x22, 0x8c, 0x88, 0xa5, 0xc2, 0x22, 0xf8, 0x12, 0x4c, 0x1c, - 0x2e, 0xbc, 0x98, 0x68, 0x46, 0xb4, 0xef, 0x8c, 0x7d, 0x52, 0x39, 0xb2, - 0xbe, 0x44, 0xa2, 0x20, 0x20, 0x4e, 0xf9, 0xb4, 0xe3, 0xae, 0x8c, 0x12, - 0xe0, 0x30, 0xed, 0xf7, 0x46, 0x29, 0x16, 0x13, 0xf1, 0x59, 0x08, 0x89, - 0x9c, 0xcc, 0x3a, 0xc1, 0xbd, 0x55, 0xce, 0xf7, 0x6f, 0x47, 0xb6, 0xaf, - 0xfe, 0x9c, 0x33, 0xa6, 0xd5, 0xf5, 0xe9, 0xa4, 0x0c, 0xea, 0xe5, 0xe8, - 0x20, 0x06, 0x28, 0xab, 0x4a, 0x2d, 0x86, 0x31, 0xe8, 0x66, 0x8e, 0x0a, - 0xc6, 0x12, 0x6c, 0xe5, 0xfb, 0x10, 0x6b, 0x3c, 0x11, 0x19, 0x19, 0x97, - 0x7b, 0xfa, 0xf9, 0xf6, 0xf9, 0xbf, 0xad, 0x41, 0x76, 0xd2, 0x67, 0x38, - 0xc9, 0xee, 0x72, 0xfa, 0xa6, 0xb5, 0xd2, 0x0e, 0x57, 0xda, 0x31, 0x61, - 0x21, 0x06, 0xef, 0xfe, 0x49, 0xa4, 0xba, 0x64, 0x7f, 0xf4, 0x62, 0xaf, - 0x7e, 0xa6, 0xc5, 0x5d, 0x6c, 0x6d, 0xac, 0xc3, 0xdf, 0xa9, 0x46, 0x77, - 0xbd, 0x81, 0x90, 0xac, 0xc2, 0x1c, 0x21, 0xfe, 0x46, 0x2e, 0xad, 0xf3, - 0xac, 0x4d, 0x5b, 0x69, 0x01, 0x01, 0x28, 0x79, 0xa5, 0x7d, 0xbc, 0x07, - 0x56, 0x10, 0xc6, 0x3d, 0x36, 0xee, 0xc7, 0xee, 0x89, 0x72, 0x05, 0x56, - 0x37, 0x2a, 0x38, 0xa2, 0x62, 0x71, 0x2b, 0x8d, 0x33, 0x3d, 0x55, 0xdb, - 0x8e, 0x6a, 0xc0, 0x4d, 0x68, 0x8a, 0xe1, 0x7a, 0xbc, 0x08, 0x7c, 0x6d, - 0x2b, 0x56, 0x89, 0xa2, 0x75, 0xd6, 0x70, 0x5c, 0x5c, 0x08, 0x77, 0xaf, - 0x59, 0x2f, 0xc8, 0x51, 0xa0, 0xf4, 0xf3, 0xf8, 0x98, 0x7d, 0x61, 0xd9, - 0xd3, 0xcc, 0x7e, 0x25, 0x78, 0x52, 0x6c, 0xa1, 0xa6, 0xac, 0xae, 0xa6, - 0x59, 0xd0, 0x18, 0x97, 0xd4, 0x3c, 0x3d, 0x4f, 0xc8, 0x95, 0xb4, 0x70, - 0xa2, 0x18, 0xb1, 0x32, 0xd5, 0x49, 0xcf, 0xa4, 0xab, 0x18, 0x15, 0xc6, - 0x2a, 0xd8, 0x6f, 0xe4, 0x91, 0x93, 0x52, 0x4a, 0x8c, 0x7d, 0xd3, 0x5f, - 0xd6, 0x63, 0x05, 0xdf, 0x62, 0xe8, 0xd1, 0xaf, 0x1c, 0x88, 0xa8, 0x8a, - 0x48, 0x01, 0x19, 0x26, 0xf1, 0x55, 0x9f, 0x7b, 0x5e, 0x5d, 0x51, 0xf4, - 0x4b, 0x02, 0x6d, 0x16, 0x9a, 0xea, 0xcb, 0x96, 0xe1, 0xdb, 0xf2, 0x29, - 0xe2, 0xf7, 0xd6, 0xaf, 0xa4, 0x3d, 0x19, 0x8f, 0xa4, 0xe6, 0x52, 0x72, - 0xb1, 0xee, 0x8f, 0x9a, 0x82, 0x1d, 0xbd, 0x8a, 0xf2, 0x91, 0x87, 0x78, - 0x19, 0x89, 0x05, 0x9f, 0x50, 0x9b, 0x0c, 0xe4, 0x8e, 0xef, 0xa7, 0x05, - 0x52, 0x8a, 0x46, 0x41, 0x56, 0x01, 0x4e, 0xa8, 0xbe, 0xa0, 0xfa, 0xb7, - 0xff, 0x14, 0x5b, 0x63, 0x37, 0x85, 0xf3, 0xf4, 0x6c, 0x20, 0x5d, 0x75, - 0x93, 0x26, 0xfd, 0xb4, 0xfc, 0xfd, 0x82, 0x7a, 0x6d, 0xda, 0x42, 0xf2, - 0x43, 0xf9, 0xea, 0xe6, 0x05, 0xb1, 0x79, 0xab, 0x19, 0x21, 0x07, 0xcc, - 0x35, 0x80, 0xac, 0x6c, 0x7c, 0x70, 0x4e, 0xf5, 0xb7, 0xf7, 0x96, 0xf0, - 0x05, 0x3e, 0xcb, 0x5f, 0x30, 0x60, 0x33, 0x51, 0x7b, 0x81, 0x3c, 0xdf, - 0xd1, 0xf6, 0xde, 0x01, 0x80, 0x93, 0xed, 0xc1, 0xd3, 0x15, 0x16, 0x97, - 0xea, 0x94, 0xb0, 0x6f, 0x28, 0xf7, 0xfc, 0x9c, 0x76, 0xa0, 0x41, 0xa8, - 0xc5, 0xb6, 0x93, 0x2b, 0x86, 0xf8, 0x43, 0x87, 0x3f, 0xbb, 0x0d, 0xa8, - 0x9c, 0x12, 0x78, 0xd8, 0x0d, 0xc0, 0x80, 0x95, 0xa6, 0x1e, 0x30, 0x69, - 0x44, 0x17, 0x76, 0xa4, 0x9f, 0x2f, 0xf3, 0x1f, 0xe8, 0xb0, 0x7d, 0xd4, - 0xd1, 0x8e, 0xc8, 0xef, 0xf1, 0x7c, 0xc5, 0x81, 0x27, 0xbd, 0x73, 0xcf, - 0x14, 0xb0, 0x9e, 0xba, 0x36, 0x1c, 0x37, 0xd9, 0x19, 0x0b, 0x8c, 0x81, - 0xb0, 0xc3, 0x8f, 0xae, 0xa7, 0x0e, 0xbf, 0xc0, 0xc6, 0xe8, 0x2e, 0x49, - 0x6e, 0x67, 0xbd, 0x20, 0x30, 0x1d, 0xd8, 0x80, 0x12, 0xfe, 0xa6, 0x34, - 0x6e, 0x66, 0x94, 0x8f, 0xed, 0x46, 0x41, 0xf9, 0x29, 0xde, 0x72, 0xfc, - 0x6c, 0x7a, 0xce, 0x94, 0x3d, 0x02, 0x52, 0x5d, 0xac, 0x7f, 0x2b, 0xc7, - 0x46, 0xc4, 0x8c, 0x01, 0xa9, 0xb2, 0x01, 0xa1, 0xdf, 0x11, 0xb2, 0x5a, - 0x8c, 0x2c, 0xbb, 0x02, 0xb8, 0x64, 0x8a, 0x67, 0x38, 0x74, 0x63, 0x09, - 0x16, 0xc2, 0x7e, 0x27, 0x95, 0xc6, 0xbb, 0x6d, 0xa0, 0x39, 0x1d, 0x64, - 0x2e, 0x2c, 0xf8, 0x20, 0xad, 0xb9, 0xef, 0x68, 0x58, 0x75, 0xfe, 0xec, - 0xf0, 0xd7, 0xeb, 0xcb, 0xc7, 0xc7, 0xaa, 0x97, 0xbd, 0xbf, 0x38, 0x80, - 0x94, 0x38, 0x1e, 0xac, 0xb8, 0xeb, 0xd7, 0x71, 0x23, 0x44, 0x4e, 0x37, - 0xbd, 0x89, 0xda, 0x8c, 0x40, 0x5c, 0x2a, 0xd2, 0xb6, 0xe5, 0x7a, 0xf9, - 0xb7, 0x60, 0xf1, 0xc4, 0x42, 0x06, 0xda, 0x13, 0xc9, 0x98, 0x63, 0x09, - 0x18, 0x32, 0x75, 0xc6, 0x38, 0x56, 0xde, 0x61, 0x84, 0x73, 0x78, 0x31, - 0xc7, 0x03, 0xf5, 0xac, 0x49, 0xf4, 0x84, 0xb7, 0x70, 0x14, 0xa9, 0x80, - 0x27, 0x07, 0x65, 0x1c, 0xc2, 0x50, 0x3b, 0xb6, 0x95, 0x7d, 0xf6, 0x74, - 0x5a, 0x5b, 0x64, 0x89, 0x95, 0x49, 0xef, 0xaf, 0xc3, 0x42, 0xd8, 0x66, - 0x2a, 0x62, 0xd3, 0xc1, 0x94, 0x02, 0x39, 0x16, 0xf8, 0x8d, 0x66, 0x60, - 0xe6, 0x91, 0xaf, 0x77, 0x8a, 0x2e, 0x81, 0x10, 0x42, 0x24, 0x14, 0x92, - 0xbc, 0xad, 0x1a, 0xbc, 0x87, 0x43, 0x9e, 0xd8, 0x1e, 0x6d, 0xc0, 0xa8, - 0x61, 0x35, 0xd3, 0xca, 0x2e, 0xba, 0x6f, 0x12, 0x91, 0x25, 0xe4, 0xc5, - 0xf4, 0xcf, 0x03, 0x50, 0x51, 0xa4, 0x7c, 0xb6, 0x1d, 0x56, 0x98, 0x34, - 0xf5, 0x3b, 0x57, 0x88, 0x9a, 0xdc, 0x8b, 0x88, 0xe5, 0x50, 0x95, 0x07, - 0xec, 0x17, 0x51, 0x40, 0xff, 0x15, 0x7a, 0x39, 0x67, 0x36, 0xa5, 0xc8, - 0x46, 0xd8, 0xbc, 0xd3, 0x57, 0x38, 0xa8, 0x5d, 0xc4, 0x67, 0x27, 0x5e, - 0x2e, 0x7c, 0x50, 0x3e, 0xc0, 0x66, 0xa6, 0xe5, 0x2f, 0xd2, 0xe1, 0xb5, - 0x55, 0xe6, 0xa5, 0x98, 0xa2, 0x0d, 0xbe, 0x97, 0x61, 0xe9, 0x3d, 0x24, - 0x13, 0x75, 0xbd, 0x5c, 0xf3, 0xae, 0x3c, 0x6f, 0xbf, 0xdb, 0x2f, 0xc7, - 0xed, 0xae, 0x17, 0x55, 0xa0, 0x0e, 0xfa, 0xe6, 0x9b, 0xf4, 0xcd, 0x89, - 0x39, 0x8a, 0x58, 0x25, 0xd4, 0x1e, 0x9e, 0x00, 0x64, 0xe7, 0xa1, 0x31, - 0xe1, 0xcd, 0x43, 0x2d, 0x93, 0xcb, 0x69, 0x3b, 0x3c, 0xb6, 0x24, 0xb0, - 0x8b, 0x65, 0xf5, 0x88, 0x46, 0x77, 0x16, 0x65, 0x69, 0xea, 0x38, 0xd6, - 0xd0, 0x90, 0xaf, 0x9f, 0xd8, 0x86, 0x16, 0x8c, 0x23, 0xfe, 0xf8, 0xf5, - 0x38, 0xb6, 0x01, 0xf5, 0xa4, 0x6d, 0x28, 0x14, 0x35, 0xc9, 0xd1, 0xc5, - 0xa5, 0xd1, 0x31, 0x4b, 0xfc, 0x41, 0x23, 0xa6, 0xe7, 0x33, 0x9f, 0xdb, - 0xf2, 0x1f, 0xf0, 0xb8, 0x1e, 0x02, 0x7a, 0x2c, 0xf2, 0x57, 0x00, 0xfc, - 0xf6, 0x0b, 0x2e, 0xed, 0x2c, 0x42, 0xca, 0x62, 0x0c, 0x04, 0x2e, 0x3b, - 0x46, 0x15, 0xec, 0xd7, 0x44, 0xbc, 0xc1, 0x52, 0xa9, 0x56, 0x54, 0xab, - 0x89, 0x2a, 0xe4, 0x59, 0x5c, 0x3a, 0xd7, 0xc0, 0x57, 0xcd, 0x32, 0x07, - 0x5e, 0xf8, 0xd7, 0x0e, 0x63, 0x93, 0xd2, 0xca, 0xaa, 0x0d, 0x2e, 0x32, - 0xb6, 0x86, 0x31, 0x7a, 0x69, 0xe3, 0xda, 0xd2, 0x50, 0x5d, 0xce, 0xf3, - 0x1b, 0xf2, 0xa9, 0xd0, 0xa6, 0xac, 0x62, 0x56, 0x70, 0x00, 0x13, 0xe5, - 0xd3, 0xc7, 0x1f, 0xe3, 0x7c, 0x7f, 0xe3, 0xf0, 0xb4, 0x05, 0x10, 0x6b, - 0xdc, 0xb7, 0x40, 0xb8, 0xdb, 0x8d, 0x02, 0xca, 0x26, 0x7c, 0x8d, 0xb7, - 0x0e, 0x47, 0xc7, 0xab, 0xa5, 0x82, 0x46, 0x3c, 0x31, 0xa1, 0x1e, 0x25, - 0xd7, 0xd4, 0x54, 0x46, 0xe7, 0xc1, 0xbb, 0xd4, 0x5a, 0x6d, 0x06, 0xde, - 0xce, 0x97, 0x31, 0x1a, 0x39, 0x5f, 0xcf, 0x6a, 0x77, 0x4e, 0xec, 0xfa, - 0xc2, 0xe6, 0xbc, 0xc0, 0xe7, 0x2c, 0xab, 0xca, 0x02, 0xe6, 0x42, 0x8d, - 0xde, 0x0a, 0x33, 0x69, 0xc2, 0x27, 0x14, 0x43, 0xf9, 0xc3, 0xaa, 0x9d, - 0x3a, 0xf8, 0x35, 0x05, 0x00, 0xfa, 0x04, 0x90, 0xaa, 0x53, 0xd8, 0xc7, - 0x77, 0x13, 0x37, 0x47, 0xac, 0x14, 0x34, 0x81, 0x3d, 0xd4, 0x2b, 0xc7, - 0xe4, 0x81, 0x42, 0x6f, 0x5a, 0x13, 0x38, 0x32, 0x70, 0x07, 0x40, 0x1d, - 0x3c, 0x65, 0x05, 0x8b, 0x3e, 0xee, 0x62, 0x8d, 0xd5, 0x34, 0x02, 0x67, - 0xaf, 0x17, 0xec, 0xe4, 0x57, 0xe9, 0xbd, 0x6a, 0x59, 0x1d, 0x55, 0x41, - 0xf2, 0x6c, 0x45, 0xf9, 0x00, 0xbe, 0x72, 0x31, 0xd0, 0xbb, 0xb9, 0x30, - 0xa0, 0x99, 0x04, 0xf0, 0x43, 0x69, 0xfa, 0x8f, 0x3d, 0x5b, 0xed, 0x12, - 0xaa, 0x51, 0x61, 0x0d, 0x6d, 0x57, 0xed, 0x2d, 0x02, 0xdd, 0xfc, 0xef, - 0x45, 0x85, 0x65, 0xe0, 0x09, 0xa2, 0xda, 0x94, 0x11, 0x92, 0xca, 0x64, - 0xfe, 0x55, 0x81, 0x7a, 0x2c, 0x31, 0x7d, 0x63, 0x31, 0x35, 0x96, 0xce, - 0x9a, 0x7b, 0x6a, 0x15, 0xfd, 0xa0, 0x4c, 0x8c, 0x63, 0x7b, 0x45, 0xe7, - 0x21, 0x7e, 0xf4, 0x4f, 0x52, 0xb7, 0xda, 0x23, 0xff, 0xa7, 0xca, 0x9e, - 0xec, 0x4b, 0x5d, 0x6f, 0x0a, 0xa3, 0x15, 0x04, 0x3e, 0x1a, 0x19, 0x91, - 0xa0, 0x79, 0xa8, 0x5a, 0x08, 0xfc, 0x57, 0xf4, 0x08, 0xea, 0x45, 0xba, - 0xe9, 0xfd, 0x58, 0xe8, 0xfa, 0xd4, 0x42, 0x43, 0xdb, 0x47, 0xb1, 0x85, - 0x2a, 0x65, 0x77, 0xb8, 0x6e, 0x94, 0xa4, 0x17, 0xc8, 0xfe, 0x0d, 0x3a, - 0x1f, 0x17, 0xa9, 0x07, 0xef, 0x40, 0xc2, 0x4f, 0xb8, 0xa6, 0x7d, 0xe8, - 0x06, 0x38, 0x4e, 0x4a, 0xdd, 0x54, 0x86, 0xf8, 0x80, 0x73, 0xa2, 0xaa, - 0x8c, 0x41, 0x19, 0x6e, 0x38, 0x1b, 0x82, 0x4f, 0xb7, 0x56, 0x5f, 0x80, - 0xad, 0xfc, 0xbf, 0xea, 0x3a, 0xf1, 0x19, 0xf2, 0x11, 0x2a, 0x9a, 0xda, - 0x47, 0x81, 0x6d, 0x07, 0x13, 0xbc, 0x03, 0x40, 0x40, 0xa3, 0x8f, 0x42, - 0x33, 0x8e, 0x4c, 0x5b, 0xf0, 0x68, 0xde, 0xb5, 0x35, 0x9e, 0x5e, 0xa5, - 0xcc, 0x26, 0x11, 0xf4, 0x55, 0x4a, 0x28, 0xbf, 0xcc, 0x01, 0xb7, 0xde, - 0x6a, 0x64, 0x0c, 0x25, 0xcf, 0xee, 0xe1, 0x40, 0x03, 0x35, 0x47, 0xd6, - 0xe0, 0x41, 0xd1, 0x4c, 0x81, 0xcf, 0xb3, 0x77, 0xc1, 0x5a, 0x31, 0x27, - 0xb1, 0x79, 0x08, 0x8b, 0x40, 0xa2, 0xc2, 0xb6, 0x1b, 0x92, 0x54, 0xb8, - 0x37, 0x0d, 0xde, 0x5a, 0x85, 0xcc, 0xca, 0x6c, 0x80, 0x90, 0xc7, 0xe8, - 0x8f, 0x12, 0x28, 0xf7, 0xda, 0xb4, 0x9c, 0x54, 0x58, 0x00, 0xf5, 0x5a, - 0x89, 0x62, 0xb7, 0x69, 0x70, 0x0e, 0xac, 0x07, 0x77, 0x5b, 0xf1, 0x08, - 0x43, 0xa1, 0x50, 0x84, 0xac, 0x7f, 0x57, 0x93, 0x68, 0x7e, 0xa2, 0x91, - 0x66, 0x15, 0x3c, 0x64, 0x93, 0x57, 0x5c, 0x04, 0x67, 0x82, 0x11, 0x38, - 0x56, 0x4c, 0x18, 0x3d, 0x8d, 0xbf, 0x85, 0x05, 0x8c, 0x67, 0xf1, 0x40, - 0x55, 0x7d, 0x65, 0x8d, 0x95, 0x8a, 0x32, 0xf7, 0xa2, 0x2c, 0x6b, 0x98, - 0x32, 0x6f, 0xec, 0x0d, 0x85, 0x4e, 0xd1, 0x95, 0xe1, 0x7b, 0xb5, 0x10, - 0xf1, 0x87, 0x35, 0x05, 0xe6, 0x91, 0x2a, 0xec, 0xa7, 0xed, 0xf1, 0x18, - 0xad, 0x08, 0xc4, 0x74, 0x33, 0x5a, 0xa2, 0x2c, 0x3e, 0xec, 0xf3, 0x96, - 0xe4, 0xad, 0x74, 0x75, 0x6d, 0x2c, 0x35, 0x78, 0x09, 0x30, 0xb4, 0x0a, - 0x38, 0x8e, 0xed, 0x81, 0x78, 0x28, 0x5b, 0x86, 0x41, 0x84, 0x35, 0xa7, - 0x2d, 0x10, 0x2c, 0x5f, 0xae, 0xed, 0x72, 0xfd, 0x20, 0x9b, 0x7d, 0x9d, - 0x9b, 0x72, 0xaa, 0x4a, 0xab, 0x32, 0x6d, 0x62, 0x69, 0xa8, 0x68, 0x80, - 0x1b, 0x74, 0x5f, 0x33, 0x35, 0x32, 0xda, 0x08, 0xa5, 0xd3, 0xa3, 0xab, - 0xfd, 0x8d, 0xae, 0x1e, 0x45, 0x11, 0x5c, 0x71, 0xee, 0x44, 0x98, 0xe5, - 0xc4, 0xdc, 0xf2, 0x2d, 0x5a, 0x81, 0xc9, 0x3a, 0x41, 0x77, 0x48, 0x84, - 0xdf, 0xb6, 0x01, 0xa4, 0xe5, 0x1a, 0xae, 0xa5, 0xce, 0x07, 0xd8, 0xce, - 0x21, 0xd6, 0x1b, 0xb8, 0x67, 0xd1, 0xbf, 0x51, 0x60, 0xc9, 0x16, 0xf8, - 0xe4, 0x06, 0x14, 0x85, 0x7c, 0x99, 0x3e, 0x19, 0xd1, 0xc4, 0xfe, 0x96, - 0x61, 0x33, 0x65, 0x98, 0xbe, 0x3c, 0xa5, 0x38, 0x0e, 0xff, 0x4a, 0x84, - 0x4b, 0xe8, 0x87, 0x51, 0x12, 0xa0, 0xfc, 0xd4, 0xc7, 0x1c, 0xdf, 0x13, - 0xff, 0x78, 0xff, 0x04, 0x77, 0xc6, 0x27, 0xf5, 0x04, 0x96, 0x71, 0x47, - 0x61, 0x3d, 0x16, 0x77, 0x04, 0x92, 0x2e, 0xd6, 0x10, 0xa5, 0x4f, 0x6c, - 0x37, 0xe7, 0xc0, 0x06, 0xcf, 0x23, 0x3e, 0xf7, 0x3c, 0x97, 0xb3, 0xc1, - 0xe5, 0x85, 0xc3, 0xcd, 0x32, 0x91, 0x50, 0x3c, 0x01, 0xfe, 0x8e, 0x8f, - 0x8d, 0x98, 0x00, 0x8f, 0xb3, 0x6a, 0xca, 0x38, 0xcc, 0x18, 0x9b, 0x64, - 0xc3, 0x5d, 0x34, 0x20, 0x7a, 0xd6, 0x7d, 0xff, 0xf3, 0x35, 0x19, 0x90, - 0x1a, 0xe4, 0xf0, 0xd0, 0x40, 0x7a, 0x37, 0xd6, 0x3f, 0xd5, 0xb4, 0x16, - 0xb2, 0x2b, 0x13, 0x88, 0x84, 0x54, 0x1f, 0x36, 0xb6, 0x0c, 0x7a, 0xd4, - 0x05, 0x03, 0xff, 0xdc, 0x42, 0xf4, 0x1d, 0xdf, 0x8a, 0xa0, 0xa0, 0xb2, - 0xff, 0x9d, 0x1a, 0x6f, 0x53, 0xcb, 0xb9, 0xc5, 0xdb, 0xb5, 0xc4, 0xde, - 0xe8, 0xf4, 0x33, 0x4f, 0xc0, 0x50, 0x15, 0x95, 0xc1, 0xc7, 0x45, 0x72, - 0x20, 0x25, 0x1d, 0x8e, 0x00, 0x50, 0x2a, 0xe9, 0xd4, 0x97, 0x6c, 0x6b, - 0x29, 0x38, 0x7b, 0xfc, 0x4b, 0x89, 0x9c, 0xdf, 0x27, 0xef, 0x91, 0xd4, - 0xbf, 0x8f, 0xa9, 0xa0, 0x3c, 0x2a, 0x45, 0x25, 0x24, 0x2c, 0x6f, 0x38, - 0x64, 0xf9, 0x5a, 0xf5, 0x58, 0xbe, 0x59, 0x0f, 0x5f, 0x5b, 0x80, 0x7f, - 0x5b, 0xa6, 0x8d, 0x36, 0xb3, 0x82, 0x36, 0x3e, 0xdb, 0x0c, 0x52, 0xaf, - 0x80, 0xd2, 0xba, 0x6f, 0xb0, 0xa0, 0xc9, 0x05, 0x7a, 0x5b, 0xc1, 0x5f, - 0x1e, 0x20, 0xfa, 0xb3, 0xc7, 0x8f, 0xbc, 0x3e, 0xe0, 0xe8, 0xd7, 0x23, - 0xd3, 0x85, 0xa9, 0x5f, 0xed, 0x2b, 0x48, 0x54, 0x28, 0xd7, 0x5f, 0xce, - 0x65, 0x9a, 0x65, 0xb9, 0x6e, 0x5d, 0xb1, 0x35, 0x95, 0x9f, 0x16, 0x5d, - 0xf9, 0xa5, 0xf4, 0xc5, 0xb7, 0x19, 0x5c, 0x76, 0x48, 0xa7, 0xda, 0x8e, - 0x85, 0xa7, 0x42, 0xfb, 0x2d, 0x5f, 0xc9, 0x4f, 0xdf, 0x56, 0x36, 0xbf, - 0xff, 0x84, 0xf4, 0x2f, 0xbf, 0x1e, 0xf0, 0x23, 0x11, 0x95, 0x0b, 0xf5, - 0x23, 0x3b, 0x42, 0x66, 0xab, 0x84, 0xfa, 0xc2, 0xa5, 0xf4, 0x53, 0xad, - 0x05, 0x66, 0xfd, 0x9e, 0x7a, 0x39, 0x9c, 0x5e, 0x04, 0xab, 0x2a, 0x82, - 0xe1, 0x40, 0x48, 0xcb, 0x46, 0xc8, 0x90, 0xd1, 0x34, 0x4c, 0x8e, 0x5f, - 0xc1, 0x67, 0x6f, 0x7d, 0xf9, 0x90, 0x29, 0x6a, 0x10, 0x15, 0x20, 0x9d, - 0xc8, 0x44, 0xaa, 0x8f, 0x03, 0x40, 0xe8, 0xef, 0x26, 0x7f, 0xcb, 0x94, - 0xda, 0x10, 0x57, 0xb8, 0x07, 0x92, 0xb8, 0xc8, 0x93, 0x54, 0x24, 0x42, - 0x8d, 0xc0, 0xe3, 0xa3, 0xa1, 0x4d, 0x80, 0x5c, 0xb7, 0x06, 0x15, 0x51, - 0xd5, 0x6f, 0x0d, 0x1e, 0x5e, 0x98, 0x09, 0x76, 0x0c, 0xd0, 0x08, 0xe4, - 0x91, 0x62, 0x86, 0xc1, 0x2d, 0x4b, 0xaf, 0xfd, 0x7a, 0x10, 0x52, 0xde, - 0x98, 0x57, 0x05, 0x24, 0xaa, 0x3f, 0x2a, 0xc9, 0x55, 0x7f, 0xbe, 0x24, - 0x63, 0xff, 0x18, 0xb1, 0xbb, 0x7d, 0x90, 0xcc, 0xa2, 0xf0, 0x89, 0x70, - 0x72, 0x69, 0x91, 0x57, 0x56, 0x13, 0xd0, 0x67, 0x36, 0xe0, 0xcf, 0x89, - 0xde, 0xeb, 0xaa, 0x17, 0x99, 0x72, 0x0f, 0x65, 0x5a, 0x58, 0xd5, 0xa8, - 0xd4, 0xd1, 0x9c, 0xf2, 0xb8, 0xbd, 0x4d, 0xd4, 0xc4, 0xf9, 0x94, 0x26, - 0xfa, 0x7f, 0x41, 0xc7, 0x94, 0xa2, 0x5f, 0xa8, 0xfb, 0xec, 0x97, 0x99, - 0xa2, 0x09, 0xb0, 0x29, 0xc6, 0x73, 0xd7, 0x4f, 0xb5, 0x87, 0xf3, 0xb3, - 0x85, 0x9c, 0xa1, 0xac, 0xa2, 0x02, 0x8a, 0x5a, 0x42, 0x94, 0xb9, 0x5c, - 0x74, 0xfb, 0xda, 0x9f, 0x58, 0x4e, 0x40, 0x67, 0xfa, 0xd7, 0x98, 0x90, - 0x06, 0x7e, 0x4f, 0x1d, 0xd2, 0x04, 0x47, 0xe0, 0xd7, 0xf8, 0x92, 0x6d, - 0xed, 0xdd, 0x18, 0xb9, 0x8d, 0xb1, 0xe0, 0xa0, 0x4c, 0xf1, 0x7e, 0xbc, - 0x82, 0x69, 0xe2, 0x03, 0x07, 0xac, 0x55, 0x5e, 0xd6, 0x85, 0xdb, 0x5a, - 0x17, 0xec, 0x20, 0xf3, 0x71, 0xd1, 0xe5, 0xd7, 0xac, 0x36, 0x78, 0xbf, - 0x89, 0xe9, 0x74, 0xd2, 0x2f, 0x8f, 0x47, 0xe0, 0x5c, 0x06, 0x5b, 0x01, - 0xd1, 0x1c, 0x2c, 0xdb, 0x42, 0xbc, 0x58, 0xdf, 0xaf, 0x0a, 0xd4, 0x58, - 0x78, 0xfa, 0x8f, 0x3f, 0xde, 0xcb, 0x6f, 0x8f, 0xf9, 0x14, 0xf3, 0x3f, - 0x98, 0xc4, 0x37, 0xdd, 0xeb, 0x0d, 0xd8, 0x4b, 0x44, 0xbe, 0x39, 0x05, - 0x45, 0x0d, 0x5d, 0x2e, 0x0d, 0x20, 0xc0, 0x96, 0x71, 0xb4, 0x2d, 0xff, - 0xe5, 0x14, 0x0a, 0x28, 0x53, 0x28, 0x81, 0x4d, 0x02, 0x15, 0xb9, 0x78, - 0xc5, 0x61, 0x4a, 0xe8, 0x1c, 0x68, 0xf3, 0x0b, 0x9f, 0x41, 0x52, 0x69, - 0x56, 0x8d, 0x54, 0x7c, 0x23, 0xda, 0x2f, 0xe0, 0x82, 0x9e, 0x04, 0x1e, - 0xfe, 0x9b, 0xcb, 0x57, 0x7b, 0x62, 0xb0, 0x8a, 0x36, 0xc5, 0xb3, 0x3a, - 0x21, 0xa4, 0x18, 0x84, 0x5b, 0x38, 0x26, 0x4e, 0xf4, 0x61, 0x9c, 0xa4, - 0x26, 0x9d, 0x18, 0xd2, 0x34, 0x26, 0xe5, 0x00, 0x51, 0xa0, 0x13, 0x11, - 0x40, 0xf9, 0x02, 0xb1, 0x66, 0x49, 0x5d, 0x01, 0xa5, 0xde, 0x7a, 0x8b, - 0x20, 0xcc, 0x44, 0x64, 0x80, 0x27, 0x8e, 0xc6, 0x32, 0x06, 0x88, 0x4d, - 0x68, 0xbc, 0x7d, 0x32, 0x6f, 0x18, 0xa5, 0xe6, 0x04, 0xac, 0x3c, 0xed, - 0xa5, 0x9c, 0xfd, 0x5b, 0x8f, 0xf2, 0x78, 0x43, 0xc2, 0xf9, 0xe8, 0xc0, - 0xae, 0x44, 0xe3, 0xf6, 0xe2, 0x2d, 0x9e, 0x34, 0xea, 0x9d, 0x2e, 0x51, - 0x95, 0x6d, 0x69, 0xd2, 0xfb, 0xf8, 0x09, 0x45, 0xa5, 0x99, 0x8b, 0x8f, - 0x0d, 0xa7, 0x5c, 0xed, 0x5b, 0xa9, 0xe6, 0x30, 0x70, 0xa9, 0x82, 0xd7, - 0xa7, 0x89, 0xbf, 0xbf, 0xca, 0x6b, 0xb1, 0x11, 0xff, 0x26, 0xd1, 0x7e, - 0x97, 0x5a, 0xa4, 0xb8, 0x2b, 0x7a, 0x65, 0x64, 0x8b, 0xe0, 0xf0, 0xd3, - 0xd9, 0xe8, 0xe6, 0x2e, 0xa4, 0x23, 0x25, 0x6d, 0x92, 0x67, 0x6c, 0xf1, - 0x2d, 0xea, 0xe5, 0x48, 0x71, 0xa4, 0x46, 0x15, 0x38, 0xfe, 0x8d, 0x2f, - 0xac, 0x2f, 0x7e, 0xd9, 0x2c, 0x80, 0xe6, 0x36, 0xe9, 0x86, 0xb5, 0x58, - 0xb6, 0xc7, 0x01, 0x97, 0xd3, 0x23, 0x92, 0x57, 0x9c, 0x72, 0xd9, 0x61, - 0x83, 0xd8, 0x32, 0xde, 0x7a, 0xa5, 0x7f, 0x81, 0xfa, 0xb3, 0x0e, 0x9a, - 0x10, 0x91, 0x41, 0x02, 0x2d, 0x23, 0x08, 0xae, 0x32, 0x8c, 0xb2, 0xe0, - 0x7b, 0x88, 0xc4, 0x66, 0x6e, 0x97, 0x24, 0xa7, 0x0e, 0x55, 0x98, 0x21, - 0xc8, 0x7d, 0x26, 0x0e, 0x3b, 0x8d, 0xec, 0x89, 0x84, 0xa3, 0xf5, 0x9f, - 0x94, 0xf9, 0xed, 0x8f, 0x31, 0xfb, 0x26, 0x85, 0x88, 0x4c, 0xd6, 0x04, - 0xee, 0x42, 0x9e, 0x25, 0xa4, 0xa1, 0x48, 0x03, 0xf4, 0x91, 0x3a, 0xea, - 0xfd, 0x59, 0xd7, 0xde, 0xfc, 0xde, 0xc5, 0x59, 0xc3, 0x9a, 0x93, 0x54, - 0xd2, 0xe2, 0xc4, 0x7a, 0x3d, 0x66, 0x20, 0x7b, 0xd7, 0x81, 0xfe, 0x3e, - 0xc1, 0x97, 0xa6, 0xf6, 0x94, 0x42, 0xda, 0xcd, 0xcd, 0xd6, 0xf2, 0x98, - 0xcc, 0xdb, 0x9b, 0x25, 0xa5, 0x98, 0xcf, 0xcb, 0x55, 0x54, 0xed, 0x27, - 0x16, 0x46, 0x6c, 0xf1, 0x4c, 0x78, 0x4c, 0x9e, 0x52, 0x79, 0xa1, 0x9f, - 0xa0, 0xec, 0xd3, 0xf7, 0x95, 0xfd, 0xda, 0x21, 0xd5, 0x06, 0x60, 0x69, - 0xad, 0x5d, 0xf2, 0x22, 0xfa, 0xa8, 0x7b, 0x04, 0x0e, 0x74, 0xed, 0x03, - 0x9d, 0x7b, 0x8a, 0x80, 0x97, 0x21, 0x70, 0x83, 0x1e, 0x22, 0x9b, 0x8d, - 0xc4, 0x59, 0xbe, 0x7c, 0x95, 0x45, 0xb0, 0xa1, 0xd2, 0x80, 0xf7, 0x3f, - 0xf2, 0x6f, 0x36, 0xcf, 0x65, 0x1f, 0xdd, 0x25, 0xbf, 0x2d, 0x10, 0x6e, - 0xd9, 0xad, 0xa5, 0xc9, 0xb5, 0xf9, 0x77, 0x8e, 0xdd, 0xd5, 0xc2, 0xb0, - 0x96, 0x33, 0x0c, 0xcb, 0x45, 0x56, 0x49, 0xbc, 0xd9, 0x95, 0xf8, 0x30, - 0x3e, 0xf4, 0xcd, 0x10, 0x56, 0xbd, 0x94, 0x23, 0xa4, 0x5a, 0x70, 0xe7, - 0x56, 0xe7, 0xdc, 0x5f, 0x2f, 0xd4, 0x56, 0x63, 0xe4, 0xab, 0x06, 0x66, - 0xc1, 0x2f, 0x2c, 0x66, 0x4c, 0x98, 0x85, 0xb7, 0x3c, 0x67, 0xa0, 0x85, - 0x10, 0x99, 0x40, 0x5e, 0x0a, 0xd4, 0x19, 0xd5, 0xa7, 0x50, 0x68, 0xb3, - 0xff, 0xb1, 0x3d, 0x6d, 0xdb, 0x71, 0xc7, 0xe5, 0x5e, 0x9b, 0x47, 0x4f, - 0x51, 0x0d, 0x47, 0x75, 0x14, 0xd2, 0x14, 0x66, 0xe8, 0x32, 0xdd, 0x74, - 0xc0, 0x82, 0x5a, 0xad, 0x85, 0x30, 0x2e, 0xba, 0x64, 0x21, 0xeb, 0x12, - 0x02, 0xc6, 0x87, 0x8b, 0x7e, 0xeb, 0x08, 0x3b, 0xc2, 0x1f, 0xb7, 0x5a, - 0xde, 0xb5, 0x45, 0x20, 0x37, 0x1f, 0x02, 0x41, 0xc0, 0x71, 0x51, 0xba, - 0xb5, 0x2e, 0x05, 0xb4, 0x5a, 0x1a, 0xb1, 0xa3, 0xf9, 0x05, 0x45, 0x1f, - 0xe6, 0xf9, 0xb4, 0xfb, 0x3d, 0x48, 0xf0, 0x34, 0xf0, 0xa1, 0x22, 0xb4, - 0xc8, 0x2a, 0x03, 0x28, 0x0f, 0xdd, 0xea, 0x9d, 0x70, 0x9e, 0xdb, 0x03, - 0x8a, 0x34, 0x26, 0xaa, 0xef, 0x50, 0x5c, 0x05, 0x7a, 0xda, 0x36, 0x25, - 0x8f, 0x27, 0xff, 0x84, 0x92, 0xc6, 0x31, 0x9a, 0xcb, 0x4d, 0xf1, 0x2f, - 0xcb, 0x25, 0x62, 0xe9, 0x8d, 0xc2, 0x17, 0x2e, 0x1c, 0x2d, 0x07, 0xdc, - 0x7a, 0xbc, 0xed, 0x32, 0x0e, 0x39, 0xc9, 0xeb, 0xfa, 0x64, 0x3c, 0x3a, - 0x9e, 0xc8, 0x35, 0x3c, 0x9e, 0x0d, 0xad, 0x76, 0xdc, 0xa9, 0xdb, 0x1e, - 0xb3, 0x89, 0x1a, 0x2d, 0xd5, 0x2f, 0x45, 0xdb, 0xcd, 0xf2, 0x22, 0xa4, - 0xf0, 0xab, 0x68, 0x74, 0x08, 0xd0, 0x2f, 0x7c, 0x94, 0x3a, 0x0d, 0x78, - 0xe7, 0x7f, 0xf5, 0xa7, 0xf1, 0x30, 0x3f, 0x5e, 0x2e, 0x20, 0xbd, 0xa0, - 0x4a, 0x58, 0xd5, 0xed, 0xfd, 0x36, 0xcc, 0x7a, 0x68, 0x46, 0x47, 0x2a, - 0xdf, 0xfb, 0x30, 0xa5, 0x1b, 0x67, 0xc5, 0x58, 0xfa, 0x8e, 0xee, 0x1e, - 0x33, 0x75, 0x44, 0xf8, 0x86, 0xbf, 0x3d, 0x41, 0xec, 0xd7, 0x34, 0x5a, - 0x19, 0xda, 0x10, 0x91, 0x05, 0xd0, 0xe2, 0x98, 0x5c, 0xfa, 0x5c, 0x1f, - 0x93, 0xe9, 0x33, 0x4a, 0x28, 0x27, 0x75, 0xb4, 0xb1, 0x4b, 0xf4, 0xa3, - 0xba, 0xa5, 0x98, 0x64, 0x9c, 0x06, 0x41, 0x91, 0x80, 0x82, 0x40, 0xdf, - 0x0b, 0xb4, 0x09, 0x46, 0x96, 0xf9, 0xda, 0xac, 0xfb, 0x27, 0xa6, 0xc3, - 0x75, 0xad, 0xfc, 0x5d, 0x21, 0xc6, 0x9c, 0x15, 0x0b, 0x3b, 0xe2, 0x59, - 0xce, 0x51, 0x93, 0xbf, 0xbe, 0x59, 0x3f, 0xd9, 0x3e, 0x5d, 0x67, 0xef, - 0x1d, 0x07, 0x06, 0xa2, 0xe1, 0xc2, 0xff, 0xe1, 0x48, 0x43, 0xfd, 0xf6, - 0x1c, 0xb1, 0xae, 0xe9, 0x30, 0x36, 0xba, 0xe0, 0x07, 0x73, 0x92, 0xf1, - 0x04, 0x2e, 0xaa, 0x49, 0x7f, 0x8d, 0xad, 0xff, 0xf1, 0x6d, 0xaa, 0x6a, - 0x12, 0x3b, 0x3f, 0x2f, 0x7d, 0x33, 0x6b, 0x1e, 0x50, 0x6a, 0xc3, 0xb3, - 0xf2, 0x5c, 0x71, 0x81, 0x3c, 0x4f, 0xad, 0xae, 0x1b, 0x55, 0xb1, 0xb2, - 0xad, 0xbc, 0x76, 0x13, 0x5e, 0xcd, 0xdc, 0xd8, 0x52, 0x83, 0x22, 0xa6, - 0xfa, 0x69, 0x2e, 0x69, 0x2b, 0x67, 0xcd, 0x39, 0xfb, 0x83, 0xb0, 0xd0, - 0x77, 0xe9, 0x96, 0xfa, 0x4a, 0xfe, 0xb7, 0xac, 0x0d, 0xdd, 0x8f, 0xb4, - 0x77, 0x4c, 0x26, 0x59, 0xe6, 0xcf, 0xef, 0x13, 0x20, 0xec, 0xd2, 0x55, - 0x81, 0x49, 0x2c, 0x0f, 0x8c, 0xb4, 0x49, 0xc0, 0x80, 0x14, 0xff, 0xe9, - 0xd0, 0x85, 0x6f, 0x62, 0x2a, 0x3c, 0x01, 0x65, 0xfa, 0x5d, 0x0a, 0xab, - 0xa8, 0xc2, 0xfd, 0x0f, 0x38, 0x96, 0x41, 0x9f, 0x51, 0x59, 0x12, 0x39, - 0x97, 0x83, 0x0f, 0x49, 0xcc, 0xa6, 0xa9, 0x25, 0x5e, 0xe9, 0x3a, 0x1b, - 0xb8, 0x5c, 0x59, 0x56, 0xd6, 0x68, 0xa8, 0x25, 0x68, 0xaa, 0xc1, 0xf7, - 0x38, 0x1f, 0x2b, 0x2d, 0xb3, 0x0d, 0xab, 0xb2, 0xd1, 0xc3, 0xcd, 0x59, - 0xfe, 0xa9, 0xdb, 0x8b, 0xad, 0x31, 0x03, 0xc4, 0xa3, 0x03, 0x7b, 0x71, - 0xd9, 0x80, 0x07, 0x89, 0x00, 0xb9, 0x44, 0x7e, 0x1b, 0x3e, 0x1a, 0x16, - 0xf3, 0xcb, 0xf4, 0x15, 0x67, 0x21, 0xdf, 0x82, 0xd5, 0xf4, 0x39, 0xb3, - 0x84, 0x76, 0xa0, 0xab, 0x05, 0xb4, 0x95, 0x45, 0xf7, 0xc3, 0x20, 0x96, - 0x70, 0x4a, 0x14, 0xd6, 0xa6, 0x30, 0x08, 0x0a, 0x6b, 0x67, 0xee, 0x5d, - 0xba, 0x45, 0x85, 0x8f, 0x43, 0x9f, 0x93, 0x15, 0x20, 0xd1, 0xf2, 0x40, - 0x3c, 0xbb, 0xc6, 0x61, 0xfc, 0x3a, 0x2b, 0x1b, 0x82, 0xf0, 0x36, 0xcd, - 0x07, 0xca, 0x73, 0x03, 0x1a, 0x66, 0x94, 0x85, 0xda, 0x75, 0x4f, 0xa7, - 0x11, 0x3f, 0x39, 0xa8, 0xb4, 0x9f, 0xd3, 0xae, 0x0b, 0x41, 0xf5, 0xb4, - 0x98, 0x6d, 0x7b, 0xfa, 0xcd, 0xe1, 0xeb, 0xc6, 0xeb, 0xfb, 0x8d, 0x76, - 0x59, 0x00, 0x06, 0xbe, 0x41, 0x1d, 0x4a, 0xb9, 0x27, 0xa4, 0x27, 0x2c, - 0xb1, 0x4e, 0xf1, 0xbc, 0xe8, 0x86, 0x1e, 0x9e, 0x8e, 0x82, 0xf0, 0xb9, - 0xad, 0x37, 0x05, 0xe3, 0x3b, 0x26, 0x21, 0x42, 0x9d, 0x04, 0x2a, 0x1d, - 0x1f, 0x07, 0x38, 0xfc, 0x45, 0x7c, 0x9e, 0xaa, 0x36, 0xbc, 0x46, 0xb9, - 0x2a, 0x8e, 0x3f, 0xaf, 0xe2, 0xfc, 0x9d, 0xd3, 0x6f, 0x9e, 0xc6, 0x7a, - 0x38, 0x56, 0x63, 0xdd, 0x4c, 0x3a, 0x40, 0x32, 0xe0, 0x61, 0xca, 0xa0, - 0xfb, 0xef, 0x94, 0x0c, 0xfc, 0x85, 0x6a, 0xbd, 0x08, 0x4f, 0xf1, 0xdd, - 0x76, 0x1e, 0xe2, 0x76, 0x3f, 0x58, 0x7b, 0x30, 0x9a, 0xe7, 0x56, 0x32, - 0x3a, 0x4c, 0x2c, 0xc6, 0x24, 0x47, 0xa0, 0x24, 0xc4, 0x74, 0x75, 0xd2, - 0x5f, 0x9b, 0x2e, 0x43, 0xf1, 0x19, 0xff, 0xda, 0x93, 0x4d, 0xcc, 0x9b, - 0x5d, 0xfc, 0xad, 0xac, 0xd1, 0x07, 0x69, 0xa8, 0x4c, 0xbe, 0x58, 0xe0, - 0xfe, 0xc3, 0x2d, 0x62, 0x48, 0x59, 0x70, 0x70, 0xce, 0xcc, 0x1a, 0x58, - 0x15, 0xbf, 0xf3, 0x20, 0x0f, 0x40, 0xe3, 0x56, 0xfc, 0xa1, 0x5f, 0xef, - 0xb8, 0x63, 0x6e, 0x6a, 0x27, 0x5f, 0x62, 0x26, 0xee, 0x8d, 0x63, 0x89, - 0x4b, 0xcf, 0xcd, 0xcc, 0x04, 0x3e, 0x5c, 0xdc, 0x04, 0xb7, 0xd4, 0x41, - 0xc0, 0x76, 0x1c, 0x26, 0x15, 0xc1, 0x7f, 0x15, 0xa2, 0x4e, 0x40, 0xa1, - 0x42, 0x07, 0x7d, 0xc6, 0x7f, 0x0a, 0x56, 0xdc, 0xe5, 0x8f, 0xb2, 0x39, - 0xd6, 0xab, 0xec, 0xf5, 0x88, 0x0e, 0xd1, 0xa7, 0x35, 0xb9, 0x16, 0x71, - 0xa0, 0xfe, 0xc6, 0x2c, 0xc8, 0x95, 0x3b, 0xb5, 0xf8, 0x4e, 0xfa, 0x3b, - 0x19, 0x74, 0xeb, 0xb8, 0x38, 0xbc, 0xc2, 0xe6, 0xf6, 0x5b, 0x7d, 0x9c, - 0x2b, 0xa7, 0x70, 0xcb, 0x8d, 0x81, 0xe6, 0xbd, 0x3c, 0xbd, 0x94, 0x4f, - 0x9e, 0x9f, 0xec, 0x4c, 0x22, 0xaa, 0xf4, 0x24, 0x90, 0x9a, 0x36, 0xa7, - 0x54, 0x2c, 0x5f, 0x95, 0x56, 0x98, 0x5e, 0xe9, 0xac, 0x3d, 0x1e, 0x1f, - 0x2d, 0x9b, 0x71, 0x51, 0x43, 0xf4, 0x6f, 0xfc, 0x36, 0x38, 0xba, 0x30, - 0xcf, 0xa2, 0xc8, 0x13, 0x83, 0x1f, 0x48, 0x47, 0x72, 0xd5, 0x8f, 0x9e, - 0x37, 0xd4, 0x70, 0xad, 0x1e, 0x08, 0xb9, 0x16, 0x5b, 0xc3, 0x27, 0xd0, - 0x61, 0x6c, 0x32, 0x25, 0xcb, 0x4d, 0xe6, 0x61, 0x9f, 0x30, 0x49, 0xe6, - 0xc0, 0xdf, 0xfa, 0xa3, 0x58, 0x74, 0x7f, 0xff, 0xbc, 0x28, 0xd7, 0x19, - 0x04, 0x1e, 0x2b, 0x57, 0xc1, 0x01, 0x9a, 0x6f, 0xff, 0xbc, 0x79, 0x67, - 0x84, 0x45, 0xb5, 0xff, 0x8f, 0x19, 0x5e, 0x49, 0xef, 0x70, 0x70, 0xad, - 0x90, 0x37, 0x6d, 0x94, 0xe5, 0x73, 0x1e, 0x45, 0x94, 0x16, 0xf4, 0x1a, - 0xad, 0xc3, 0xe3, 0xca, 0x80, 0xf3, 0xb6, 0x5e, 0x17, 0xaa, 0xff, 0x57, - 0x95, 0x3d, 0x1f, 0xc0, 0x97, 0x1c, 0xef, 0x61, 0xf2, 0x13, 0x5d, 0xd0, - 0x90, 0x50, 0xf7, 0x60, 0xf2, 0x11, 0xdf, 0xa6, 0x4c, 0xa4, 0x0b, 0xba, - 0x23, 0xa1, 0x78, 0x5c, 0xc0, 0x41, 0x50, 0x33, 0xfd, 0x62, 0x26, 0xd1, - 0x5b, 0x3b, 0xde, 0x6d, 0x51, 0xa4, 0x5b, 0x47, 0x1b, 0xb6, 0x3a, 0x36, - 0xda, 0x03, 0x5d, 0xfc, 0x03, 0x05, 0xc4, 0xd3, 0x52, 0x7f, 0x0d, 0x15, - 0x02, 0x4b, 0xd2, 0x7f, 0x52, 0x53, 0x97, 0x74, 0x84, 0xd6, 0x85, 0x7f, - 0x46, 0x08, 0x74, 0x50, 0xd7, 0x50, 0x55, 0xe4, 0xce, 0xa1, 0x5d, 0x2e, - 0x78, 0x06, 0xbd, 0x4d, 0xd5, 0x2a, 0xc7, 0x16, 0x32, 0x1a, 0x7d, 0x5e, - 0x76, 0x36, 0xcd, 0x88, 0x87, 0x39, 0x63, 0xb8, 0xad, 0x7f, 0xb1, 0xeb, - 0x76, 0x8f, 0xab, 0x80, 0xd9, 0xd1, 0xca, 0x56, 0x7e, 0xb3, 0x98, 0xa3, - 0x3f, 0x15, 0xe2, 0xc4, 0x9a, 0x57, 0x9d, 0xe4, 0x37, 0x7d, 0x04, 0x11, - 0xc3, 0xd5, 0x1d, 0x8f, 0x6f, 0xde, 0xcd, 0xe7, 0x16, 0xa7, 0x45, 0xd0, - 0x36, 0x68, 0xd5, 0xdf, 0x14, 0xe1, 0x52, 0xe4, 0x81, 0x64, 0x7d, 0x57, - 0x69, 0xbe, 0x39, 0x5a, 0x66, 0x11, 0x5d, 0xd4, 0x6f, 0xf1, 0x92, 0x86, - 0xc6, 0x32, 0xcf, 0x5f, 0x02, 0xd2, 0x0f, 0x39, 0x78, 0x05, 0x4a, 0x35, - 0xa7, 0x18, 0x76, 0x6a, 0xd7, 0x0d, 0x7b, 0xb2, 0xc0, 0x82, 0x67, 0xb4, - 0x3d, 0x47, 0x04, 0xce, 0x51, 0xe7, 0x44, 0xac, 0xb2, 0xba, 0x1f, 0x82, - 0xd2, 0x0d, 0x9a, 0x3a, 0xfb, 0xfb, 0xa7, 0x73, 0x5a, 0xa3, 0xdb, 0xad, - 0x77, 0x0a, 0x2f, 0xbf, 0x56, 0x13, 0x7a, 0xb6, 0x4e, 0xd4, 0x40, 0x63, - 0x94, 0x37, 0x71, 0x41, 0x7b, 0x19, 0x4c, 0x08, 0xc0, 0x93, 0xa3, 0x76, - 0x8b, 0xad, 0xfe, 0xc1, 0xe8, 0x28, 0xf4, 0xe3, 0x54, 0xf7, 0xda, 0x58, - 0x81, 0x58, 0x61, 0x4a, 0x82, 0x57, 0x52, 0x8c, 0xa7, 0xcb, 0x56, 0x9c, - 0xcf, 0xd6, 0xc6, 0x07, 0xb5, 0x45, 0x81, 0x24, 0x05, 0x14, 0xc0, 0xa1, - 0x35, 0xcc, 0x67, 0x57, 0x07, 0xc9, 0x02, 0x0b, 0x02, 0xe1, 0x4b, 0xa3, - 0x04, 0x82, 0xcf, 0x75, 0x1f, 0xda, 0x34, 0x71, 0x20, 0xaf, 0xd8, 0x7a, - 0x58, 0x39, 0x15, 0xca, 0xd7, 0xd1, 0xab, 0x73, 0x77, 0x36, 0x32, 0x33, - 0x4d, 0x89, 0xd6, 0x5d, 0x6a, 0xec, 0x2d, 0x0c, 0xf4, 0x8a, 0x50, 0xb9, - 0xf4, 0x26, 0x9a, 0x69, 0x54, 0x70, 0x9d, 0x03, 0xc7, 0x84, 0x11, 0x24, - 0xbe, 0xb8, 0x11, 0xb2, 0xa5, 0xb7, 0xed, 0x90, 0x4f, 0xc3, 0x05, 0x9e, - 0xd9, 0x6f, 0xf5, 0x1a, 0xe9, 0xd4, 0xae, 0xa7, 0x74, 0x0d, 0x78, 0x90, - 0x70, 0x7d, 0xcd, 0xc7, 0x67, 0xa0, 0x46, 0x85, 0x27, 0x36, 0x50, 0xd1, - 0xc6, 0xeb, 0x5a, 0x80, 0xd7, 0x4f, 0x20, 0x1d, 0xd0, 0x08, 0x18, 0x81, - 0x37, 0x28, 0x37, 0xd2, 0x66, 0xf1, 0x57, 0x3e, 0x23, 0xdc, 0xe3, 0x8e, - 0xb8, 0xd8, 0x76, 0xee, 0x80, 0x94, 0x64, 0xe4, 0xe8, 0x9e, 0x06, 0x43, - 0x63, 0x13, 0x3a, 0xce, 0xd9, 0xf9, 0x68, 0x6c, 0x1b, 0xc5, 0x3e, 0xe7, - 0x56, 0xa7, 0x79, 0xe3, 0x82, 0x32, 0x74, 0xd1, 0xe1, 0xc6, 0x30, 0x0f, - 0x87, 0x3e, 0xa6, 0xb3, 0x1a, 0x60, 0x6d, 0x9d, 0x79, 0xde, 0xd5, 0x40, - 0x94, 0x08, 0x74, 0x6c, 0x3e, 0xce, 0x5b, 0x62, 0xbd, 0xc0, 0xe3, 0x40, - 0x02, 0x16, 0xe7, 0xc7, 0x20, 0xf2, 0x4c, 0xba, 0x16, 0x9e, 0x7d, 0xa4, - 0xc3, 0x28, 0xaa, 0x8d, 0xfe, 0x47, 0x42, 0x8a, 0x52, 0xd8, 0x5e, 0x1f, - 0x9c, 0xed, 0x56, 0x3c, 0x69, 0xa5, 0xa9, 0x51, 0x2b, 0xa6, 0x7f, 0x61, - 0x1b, 0x2c, 0x01, 0x0f, 0xad, 0x4c, 0x6c, 0x27, 0x3a, 0x53, 0xcd, 0xde, - 0x59, 0x0e, 0x37, 0x41, 0xe4, 0x09, 0x86, 0x4a, 0x12, 0x5d, 0xdd, 0x01, - 0x59, 0x37, 0xb9, 0x52, 0xf5, 0x4a, 0xd5, 0xea, 0xee, 0x78, 0xb5, 0x5e, - 0x43, 0x6d, 0x36, 0xb1, 0xf2, 0x90, 0xe2, 0xaf, 0xdb, 0xbf, 0x5e, 0x1d, - 0x85, 0x3d, 0xc5, 0x2d, 0xab, 0xa1, 0xb4, 0x9a, 0x8b, 0x0e, 0x53, 0x6a, - 0xe7, 0xcb, 0x24, 0x48, 0xa3, 0xde, 0xdf, 0xa6, 0xa5, 0x6c, 0x0b, 0xc2, - 0xf5, 0x32, 0xd8, 0xd2, 0xd8, 0x86, 0xf2, 0x5a, 0x0b, 0x4e, 0x74, 0x82, - 0x85, 0x63, 0xa8, 0xeb, 0x1d, 0xb3, 0x9d, 0xdc, 0x19, 0x82, 0x5d, 0x2f, - 0xa0, 0xbf, 0x1a, 0x62, 0x8e, 0x63, 0xe9, 0xd5, 0x5a, 0x8f, 0x69, 0xdb, - 0x28, 0x67, 0xe7, 0x84, 0xfa, 0x15, 0xa7, 0x7f, 0x85, 0xe6, 0x81, 0xbc, - 0xbc, 0x87, 0x4d, 0x1a, 0x0a, 0x63, 0x99, 0xd6, 0x14, 0x52, 0x4d, 0xad, - 0x40, 0x87, 0xd9, 0x9c, 0x3e, 0x0b, 0x72, 0x93, 0xa3, 0xd2, 0xd4, 0x1a, - 0x08, 0x38, 0x19, 0xd6, 0x20, 0x0c, 0xeb, 0x05, 0xf1, 0xd4, 0xbc, 0xdc, - 0x24, 0x48, 0x21, 0xf2, 0xac, 0x9c, 0x4c, 0x6e, 0x4d, 0x2f, 0x30, 0x00, - 0xfe, 0xd4, 0x08, 0xf7, 0xba, 0xc5, 0xaa, 0x09, 0xaf, 0x0d, 0x97, 0x8e, - 0x35, 0x79, 0xe6, 0x29, 0xb9, 0x14, 0x00, 0xa4, 0x0a, 0x3f, 0x5b, 0xf6, - 0x6b, 0x70, 0xa2, 0xae, 0xac, 0xa8, 0x69, 0xe4, 0x71, 0x97, 0x7c, 0x5e, - 0x54, 0xf7, 0xb3, 0x1f, 0xb9, 0x22, 0x66, 0xdd, 0xbb, 0x23, 0xfd, 0x6b, - 0x68, 0x03, 0x42, 0xbb, 0x42, 0xff, 0x2b, 0x45, 0xc4, 0xcd, 0x40, 0xbb, - 0x7b, 0x4c, 0x03, 0x0c, 0x0e, 0xfd, 0x36, 0xcd, 0xa2, 0x2f, 0xe9, 0x63, - 0xba, 0x40, 0xc4, 0x3d, 0xff, 0xa0, 0xb5, 0x27, 0xc2, 0xee, 0x39, 0x7d, - 0xa1, 0x0e, 0x71, 0x3d, 0xc8, 0x0d, 0xda, 0x18, 0xe9, 0xe0, 0x92, 0x0c, - 0x49, 0xc2, 0xce, 0x6c, 0x69, 0x63, 0x39, 0x30, 0xb9, 0xda, 0x17, 0x19, - 0xa2, 0xff, 0x0a, 0x27, 0x7d, 0x59, 0x67, 0x6f, 0x93, 0x8e, 0xf4, 0xd6, - 0xbf, 0x1a, 0x08, 0xe5, 0xc3, 0xdf, 0xb6, 0xdf, 0x1e, 0xc9, 0x58, 0x16, - 0xf8, 0xf9, 0x75, 0x73, 0x96, 0x25, 0x3a, 0x56, 0x1e, 0xa7, 0x7a, 0xbd, - 0xbd, 0x91, 0x43, 0xd0, 0x36, 0x79, 0x18, 0xcd, 0x13, 0xdf, 0x4e, 0x3e, - 0x95, 0x79, 0xe6, 0x29, 0x09, 0x16, 0x40, 0xa0, 0x0a, 0x3f, 0x5b, 0xf6, - 0x0f, 0x70, 0xa2, 0xae, 0x8f, 0xba, 0x6f, 0x27, 0x7f, 0x15, 0x88, 0x03, - 0x72, 0x03, 0x85, 0xbc, 0x38, 0xfa, 0x1b, 0xfe, 0x91, 0x57, 0xc1, 0xb2, - 0xcd, 0x9e, 0xb8, 0x4b, 0xe6, 0x21, 0xb0, 0xd8, 0x4e, 0xa3, 0xfe, 0x8a, - 0x86, 0xb1, 0xe9, 0x4b, 0x95, 0x3d, 0x48, 0x8f, 0x23, 0x4e, 0x01, 0xb1, - 0x4b, 0xbf, 0x60, 0xe0, 0xda, 0x8e, 0x94, 0xd4, 0xbd, 0x4c, 0x92, 0xba, - 0xd0, 0x38, 0x6b, 0x19, 0x51, 0x6e, 0x25, 0x25, 0x8a, 0x7e, 0x63, 0x0f, - 0x1d, 0xf0, 0x38, 0xbc, 0xe0, 0x34, 0x37, 0x05, 0xd7, 0xe8, 0x68, 0xa5, - 0x57, 0x23, 0x82, 0x89, 0xef, 0x9d, 0x98, 0x74, 0xf0, 0x22, 0xa7, 0xb6, - 0x7d, 0xd6, 0xd7, 0xe0, 0xd7, 0x53, 0xf0, 0x4b, 0x03, 0xbb, 0x1e, 0xf4, - 0xea, 0xe3, 0x29, 0xb5, 0x8d, 0x2a, 0xfb, 0xa7, 0x23, 0x56, 0x03, 0x6c, - 0xce, 0xd0, 0x12, 0xee, 0x5a, 0x7a, 0x40, 0x0a, 0xcf, 0x4e, 0x6b, 0x87, - 0xfd, 0x54, 0xa8, 0x62, 0x12, 0x38, 0xc5, 0x63, 0x0c, 0xdc, 0x49, 0xb8, - 0x5d, 0xfc, 0x35, 0x05, 0xd4, 0xb0, 0xe0, 0x29, 0x63, 0x57, 0x03, 0x75, - 0x40, 0x72, 0xe5, 0xc4, 0x25, 0xe0, 0xf5, 0x4b, 0x93, 0x4a, 0x80, 0x89, - 0xef, 0x9d, 0x98, 0x74, 0xf0, 0x22, 0xa7, 0xb6, 0x7d, 0xd6, 0xd7, 0xe0, - 0x61, 0x2f, 0x24, 0xb1, 0xde, 0xfd, 0xc8, 0xe3, 0xf4, 0x1b, 0xcb, 0xea, - 0x6f, 0x42, 0x65, 0xfd, 0x49, 0x14, 0x8f, 0xb7, 0x9a, 0x3c, 0x46, 0xbc, - 0x1e, 0xb7, 0x43, 0x87, 0x9d, 0xfe, 0x6a, 0x2d, 0xda, 0x26, 0xaa, 0xc2, - 0x67, 0x2b, 0x31, 0xbb, 0x68, 0xdf, 0x24, 0xde, 0x51, 0x4b, 0x93, 0x26, - 0x2b, 0x5f, 0x96, 0xb0, 0xb3, 0xf7, 0x7d, 0xda, 0x12, 0xa7, 0x04, 0x58, - 0x83, 0xbc, 0xdb, 0xfd, 0xb2, 0x16, 0x44, 0xc6, 0x5a, 0xb8, 0xba, 0xb7, - 0x5a, 0x90, 0xb0, 0x3e, 0x8e, 0xe2, 0x77, 0xec, 0x8d, 0x99, 0xc6, 0xd9, - 0xb5, 0x09, 0x2e, 0x41, 0x7a, 0x4b, 0x20, 0x95, 0x9d, 0x00, 0xd6, 0x7e, - 0xcc, 0x2d, 0xdd, 0x61, 0x5e, 0xc0, 0xfe, 0xe6, 0xdd, 0xd7, 0x84, 0x5f, - 0xd2, 0x27, 0xf7, 0x0f, 0xaa, 0xf3, 0x53, 0x97, 0x67, 0x0f, 0x4d, 0xb6, - 0x8c, 0xcb, 0xbe, 0x2a, 0xb7, 0x11, 0xa0, 0x13, 0x9d, 0x98, 0x0c, 0x8a, - 0xd5, 0x48, 0xc6, 0x51, 0x0e, 0x7b, 0x4f, 0xbd, 0xbd, 0x8e, 0x26, 0xa1, - 0xf5, 0x81, 0x90, 0x62, 0x41, 0x46, 0xb3, 0xe1, 0x2d, 0x59, 0x77, 0xe3, - 0x0a, 0x49, 0x52, 0xaf, 0xc5, 0xdf, 0xbe, 0x3e, 0xaa, 0x62, 0xeb, 0x46, - 0x28, 0x9b, 0x94, 0x70, 0x9b, 0xa3, 0x13, 0x4b, 0xa2, 0x44, 0xc6, 0xe0, - 0x3a, 0xd7, 0xd1, 0x49, 0xc1, 0xd2, 0x9c, 0x90, 0xfd, 0x14, 0x08, 0x24, - 0x1c, 0xd1, 0x68, 0xc5, 0x03, 0x88, 0xd4, 0x44, 0x68, 0xdf, 0x72, 0xe9, - 0xdb, 0xec, 0xf7, 0xe7, 0x22, 0x39, 0xfd, 0xc6, 0xed, 0xe6, 0x30, 0x59, - 0x8a, 0x62, 0x13, 0x8e, 0x44, 0x49, 0x98, 0x17, 0x45, 0x7c, 0xfd, 0xdc, - 0x6d, 0x9b, 0x82, 0xaa, 0x2f, 0x69, 0x44, 0xfe, 0xe0, 0xb7, 0xa5, 0xab, - 0x21, 0xca, 0xcc, 0x70, 0x04, 0x46, 0xfb, 0x1f, 0xbb, 0xba, 0x58, 0x69, - 0xfa, 0xa7, 0xe4, 0x77, 0x7a, 0x82, 0xa9, 0x0e, 0xa6, 0x37, 0xe4, 0x03, - 0x8c, 0x7a, 0xf1, 0x17, 0x4a, 0xc1, 0x8a, 0xc3, 0x3f, 0xf8, 0xa7, 0xd3, - 0x5a, 0x5f, 0x55, 0x5e, 0xae, 0x28, 0x0b, 0x8a, 0x24, 0x89, 0x62, 0x71, - 0xa9, 0x09, 0xcf, 0xca, 0xf1, 0x5d, 0x1f, 0xa8, 0x5c, 0x12, 0xc5, 0x71, - 0x5c, 0xa0, 0xb0, 0x00, 0x9b, 0x1f, 0xdc, 0x33, 0x07, 0xf6, 0x02, 0x82, - 0xc2, 0x8f, 0x93, 0x16, 0xe9, 0xb0, 0x0a, 0x90, 0xee, 0xa9, 0xf3, 0x5c, - 0x13, 0xfb, 0xef, 0xe8, 0xb7, 0x0f, 0xbc, 0x21, 0x5c, 0x97, 0xa7, 0x40, - 0x3e, 0x88, 0xff, 0xb1, 0x3f, 0xb7, 0x7d, 0x0a, 0xa7, 0xcc, 0x81, 0xc3, - 0xb4, 0xdb, 0x1e, 0xd7, 0x12, 0x90, 0xba, 0xba, 0xaa, 0xe2, 0xdf, 0x69, - 0x91, 0x1f, 0x88, 0xb4, 0xc1, 0x05, 0xb3, 0x26, 0x41, 0x69, 0x89, 0x06, - 0x27, 0xb5, 0x3d, 0x92, 0xfc, 0xa0, 0x02, 0xa3, 0x2b, 0xf7, 0x3d, 0xb6, - 0xfc, 0x4f, 0xc0, 0x4c, 0x30, 0x5f, 0xd3, 0xf8, 0x7b, 0xc1, 0xc4, 0x49, - 0x04, 0x46, 0xca, 0xf7, 0xdc, 0x95, 0x1d, 0x9c, 0xcd, 0x62, 0x98, 0x8b, - 0x52, 0x28, 0x75, 0xff, 0x28, 0xb7, 0x6f, 0x6b, 0xe1, 0x25, 0xb9, 0x77, - 0xf2, 0x91, 0x9c, 0xe8, 0xed, 0x83, 0x92, 0xeb, 0x03, 0x72, 0x9b, 0xaa, - 0xb4, 0xe2, 0x9f, 0x05, 0x9a, 0xfc, 0xed, 0xd7, 0x59, 0x4e, 0x5c, 0xe5, - 0x83, 0x61, 0xc9, 0x06, 0x3f, 0xb8, 0xa1, 0x5f, 0xe8, 0x49, 0x8e, 0x65, - 0xa6, 0xe8, 0xce, 0x99, 0xd7, 0xda, 0x0d, 0xb0, 0x0c, 0xc1, 0x75, 0x59, - 0xb4, 0x63, 0x68, 0xb4, 0xe6, 0x76, 0x38, 0x57, 0xce, 0x1f, 0x79, 0x08, - 0x24, 0x2c, 0x6d, 0x41, 0xca, 0xc1, 0xc0, 0x10, 0x28, 0xbf, 0x69, 0x67, - 0x08, 0xfd, 0x76, 0xa4, 0x4f, 0xc5, 0x38, 0x21, 0x3b, 0xe0, 0x33, 0x0e, - 0xe6, 0x6c, 0x9e, 0xab, 0xc7, 0x29, 0xa4, 0x57, 0x40, 0xda, 0xa9, 0x66, - 0xce, 0x78, 0xe7, 0xe4, 0xb5, 0x7b, 0x84, 0xcd, 0x51, 0x8c, 0x70, 0xc4, - 0x7c, 0x4d, 0x10, 0xba, 0xe4, 0x6a, 0x88, 0xca, 0x6e, 0x34, 0x29, 0x18, - 0xdb, 0x28, 0x37, 0x5e, 0x63, 0x82, 0x28, 0x6c, 0x5a, 0x06, 0x4b, 0xe2, - 0x22, 0xcd, 0x83, 0xd6, 0xea, 0xee, 0x30, 0xe4, 0xf5, 0x9c, 0x61, 0xff, - 0xa3, 0x58, 0xf2, 0x95, 0xf7, 0x3f, 0xb2, 0x0d, 0x78, 0xff, 0x20, 0xbe, - 0xfb, 0x67, 0x23, 0xf7, 0x45, 0xc8, 0xde, 0x6c, 0x60, 0x8c, 0xe5, 0x96, - 0x8c, 0xde, 0x18, 0xda, 0x7d, 0x28, 0xcd, 0x8c, 0x7e, 0x60, 0xf2, 0xab, - 0x33, 0x5a, 0xff, 0xff, 0x1c, 0xee, 0x51, 0x2d, 0x10, 0xd5, 0xd0, 0x1b, - 0x74, 0x4c, 0x42, 0x6b, 0x9a, 0x3a, 0xe4, 0xe1, 0xdd, 0x7f, 0xdb, 0x94, - 0x16, 0x8b, 0x85, 0x4e, 0x5b, 0x3d, 0xde, 0xca, 0x49, 0x7a, 0xfa, 0x7c, - 0x48, 0x6d, 0xa2, 0x57, 0xff, 0x5c, 0x1d, 0x98, 0x04, 0xb0, 0x5c, 0xeb, - 0xbb, 0xc2, 0x6c, 0x9d, 0x41, 0xe5, 0x69, 0x39, 0xec, 0x48, 0xc4, 0xd7, - 0x1b, 0xc3, 0x23, 0x13, 0xf3, 0x31, 0x7a, 0x91, 0x97, 0x07, 0x02, 0x6a, - 0x53, 0x05, 0x63, 0xa0, 0xac, 0x1a, 0x7c, 0xf8, 0xc8, 0xbe, 0xf2, 0x8d, - 0x13, 0xe5, 0xff, 0xcc, 0x87, 0x99, 0x93, 0xc9, 0x0f, 0x79, 0x92, 0x12, - 0x01, 0xb4, 0xfb, 0xda, 0xaf, 0x84, 0xda, 0x5a, 0x37, 0x62, 0xea, 0xe6, - 0xb3, 0x4e, 0x07, 0xca, 0x88, 0x17, 0x32, 0xaa, 0xfa, 0x31, 0x5b, 0x39, - 0x64, 0x2b, 0xf3, 0x89, 0x6c, 0x79, 0x9f, 0xf7, 0x4b, 0xb7, 0x51, 0x1d, - 0xa0, 0xa5, 0xef, 0x64, 0xa5, 0x38, 0xfc, 0x0c, 0x2f, 0x40, 0x75, 0xc1, - 0x17, 0xab, 0x75, 0xe5, 0x23, 0x08, 0x88, 0xde, 0xd6, 0x4b, 0x60, 0x98, - 0xfa, 0xe4, 0xd1, 0x88, 0x6d, 0xb9, 0x87, 0x81, 0x5b, 0x39, 0x87, 0x9e, - 0xe0, 0x9d, 0x67, 0x68, 0x67, 0x3f, 0x2c, 0x11, 0xdf, 0x4d, 0x25, 0x08, - 0x8e, 0x6a, 0x53, 0xa1, 0xbe, 0x73, 0x10, 0x42, 0x36, 0x1c, 0xa0, 0x7d, - 0x79, 0x23, 0x53, 0x80, 0x08, 0x21, 0xb0, 0xd4, 0x2c, 0x02, 0xad, 0x80, - 0x14, 0x8b, 0x50, 0x38, 0x89, 0x14, 0x7b, 0x3c, 0x61, 0x22, 0x72, 0x76, - 0x32, 0x15, 0x68, 0xf5, 0x5d, 0x1b, 0x55, 0x13, 0xf6, 0xbb, 0x58, 0xba, - 0xcd, 0x0f, 0x62, 0xf2, 0x0f, 0x5b, 0x37, 0xb3, 0x62, 0x9d, 0xe8, 0x37, - 0x8c, 0xbf, 0xfb, 0x73, 0x1d, 0x6d, 0x8b, 0xa5, 0x5f, 0x43, 0xfd, 0xc4, - 0x53, 0x9a, 0x52, 0x15, 0xc9, 0x70, 0x74, 0x23, 0xa6, 0x06, 0xd3, 0x5e, - 0x7b, 0x16, 0x4e, 0x1e, 0x1c, 0xc8, 0xcf, 0xf5, 0x9f, 0x22, 0x3f, 0x5d, - 0x4a, 0xed, 0xb7, 0x0e, 0x94, 0x13, 0x81, 0x7d, 0x98, 0xe7, 0x0d, 0xc0, - 0x59, 0xa1, 0x9e, 0x24, 0x42, 0xf2, 0xef, 0xe5, 0x66, 0xfd, 0xc1, 0xd8, - 0xff, 0x36, 0x30, 0x48, 0x98, 0xde, 0xb6, 0x42, 0x7d, 0xe6, 0x74, 0x22, - 0xf0, 0x50, 0x38, 0x2a, 0xf4, 0xd4, 0xe6, 0x1b, 0xc9, 0x7a, 0xa2, 0x78, - 0xc4, 0x61, 0x8a, 0x45, 0x19, 0x4b, 0xdb, 0xaf, 0x00, 0xa4, 0xc0, 0x84, - 0x57, 0xe6, 0xda, 0x28, 0x03, 0x99, 0x71, 0x3a, 0x4f, 0xc0, 0x28, 0xcd, - 0x92, 0x84, 0x0f, 0x87, 0x20, 0xa0, 0xb0, 0xc9, 0xf6, 0xe4, 0xbe, 0x07, - 0xd4, 0xbd, 0xff, 0x5a, 0x69, 0xb1, 0x3f, 0xf1, 0x5e, 0xec, 0xcb, 0xcc, - 0xef, 0x0c, 0x51, 0x50, 0xdb, 0xe8, 0xee, 0x70, 0x24, 0xcf, 0x5a, 0xca, - 0x5f, 0x7a, 0x6f, 0x60, 0xeb, 0xc6, 0xce, 0xc6, 0x18, 0x6c, 0xaa, 0x1d, - 0x12, 0x61, 0xae, 0x14, 0xc9, 0x3d, 0x4a, 0xa0, 0x91, 0x7a, 0x9f, 0xf4, - 0xdd, 0xed, 0x0d, 0x37, 0x62, 0x4c, 0xbb, 0xe1, 0x9a, 0x4e, 0xd8, 0x35, - 0xfb, 0x68, 0xa2, 0x62, 0xa6, 0xd4, 0x65, 0x15, 0x20, 0x29, 0x3a, 0x1c, - 0x28, 0x09, 0x5c, 0xe9, 0x28, 0x3c, 0xdf, 0xf5, 0xae, 0x80, 0x6c, 0xc4, - 0x69, 0x5d, 0x98, 0x5a, 0x18, 0x46, 0x73, 0xc6, 0x87, 0x5b, 0x32, 0xf1, - 0xea, 0x86, 0xa0, 0x28, 0xb1, 0x08, 0xab, 0xe2, 0x70, 0xef, 0x17, 0x0a, - 0xcf, 0x85, 0x75, 0x47, 0xc9, 0xb7, 0x3b, 0x2e, 0x59, 0x8e, 0xc7, 0x84, - 0xd8, 0x08, 0xf7, 0x7b, 0xe2, 0xfe, 0x19, 0xff, 0xa5, 0x04, 0xa8, 0x6c, - 0xbb, 0x17, 0xa0, 0x96, 0xd5, 0x36, 0x0c, 0x23, 0xd2, 0x0e, 0x4c, 0x90, - 0x24, 0x82, 0x6c, 0xa2, 0xdd, 0x6a, 0xbf, 0xbe, 0x5e, 0x0d, 0x1b, 0xf8, - 0xdf, 0x8d, 0x56, 0xf7, 0x43, 0xb3, 0xf1, 0x29, 0x3f, 0x4b, 0x13, 0x51, - 0xa8, 0x03, 0x42, 0x08, 0x4d, 0x7d, 0xa0, 0xae, 0xb1, 0x72, 0x94, 0x49, - 0xc3, 0x2a, 0x93, 0x6b, 0xc3, 0x8d, 0x41, 0x17, 0x44, 0x6a, 0xed, 0x74, - 0x91, 0x14, 0xd3, 0xd7, 0x12, 0xf2, 0x3d, 0x54, 0x9f, 0xb6, 0x86, 0x72, - 0xe9, 0xb3, 0xa6, 0xe5, 0x68, 0x78, 0x12, 0x68, 0x75, 0xf6, 0x09, 0xd0, - 0x78, 0x9e, 0x8c, 0x69, 0x94, 0x0e, 0xe7, 0x8c, 0xbe, 0x3d, 0xf2, 0x9a, - 0x37, 0xfc, 0x38, 0x09, 0x0e, 0xb8, 0xdf, 0x7e, 0x7c, 0x4f, 0x16, 0xb3, - 0x7f, 0xc3, 0x97, 0x9d, 0x46, 0x9a, 0x63, 0x17, 0x97, 0xa0, 0x9b, 0xf4, - 0x5f, 0xa8, 0x8a, 0x27, 0x43, 0x64, 0x3d, 0x7f, 0x85, 0x95, 0x48, 0x0d, - 0x36, 0x14, 0xd3, 0x79, 0x54, 0x98, 0x15, 0x7b, 0x7e, 0xac, 0x7f, 0xfc, - 0x75, 0x9a, 0x15, 0x99, 0x29, 0x56, 0xf0, 0xfe, 0xd8, 0x7f, 0x4a, 0xaf, - 0x02, 0x34, 0x4a, 0x13, 0x77, 0x00, 0x9a, 0x19, 0xcb, 0xb1, 0xc8, 0xd1, - 0x5d, 0x60, 0xa4, 0xcb, 0xd3, 0xe2, 0xe3, 0x56, 0x07, 0xe0, 0x5b, 0x50, - 0xc6, 0x31, 0x45, 0x2a, 0x4a, 0x15, 0x31, 0x43, 0xfd, 0xf8, 0x94, 0xef, - 0x20, 0x47, 0x77, 0xa2, 0xae, 0xf8, 0x9b, 0x5a, 0x3e, 0x98, 0x6b, 0x7f, - 0x79, 0x91, 0x79, 0x1c, 0xa8, 0xca, 0xd7, 0x7e, 0x9a, 0xd0, 0x7f, 0xae, - 0x89, 0xb3, 0x4d, 0xb0, 0x4d, 0x00, 0x93, 0xb8, 0xd9, 0x0e, 0xd6, 0x6f, - 0x99, 0x49, 0xf2, 0xcb, 0x01, 0xb7, 0xf7, 0x50, 0x3a, 0x8b, 0xe1, 0xfd, - 0x68, 0x0c, 0x79, 0x33, 0x0c, 0xbb, 0x6e, 0x94, 0x45, 0xaf, 0xe9, 0x81, - 0x5a, 0xe0, 0xdb, 0x68, 0x8b, 0x51, 0xee, 0x93, 0xa7, 0x74, 0xa6, 0xfd, - 0x27, 0xc4, 0x50, 0x7f, 0x6a, 0x77, 0x3c, 0x31, 0xe4, 0x54, 0x6f, 0xd8, - 0x6a, 0x07, 0xeb, 0x21, 0x69, 0xdc, 0x9a, 0x37, 0x3e, 0x80, 0xca, 0xb6, - 0x4c, 0x4d, 0x65, 0x6d, 0x9c, 0x19, 0x04, 0xda, 0xf9, 0x3b, 0xf0, 0xbc, - 0x4c, 0x40, 0x0e, 0x99, 0x91, 0x18, 0xaf, 0xe8, 0x23, 0xc2, 0x53, 0xc4, - 0x8b, 0x4e, 0x42, 0x02, 0x12, 0xb5, 0xae, 0x28, 0x28, 0x41, 0xf9, 0xc5, - 0x50, 0xe2, 0xf9, 0xd6, 0x3c, 0xc8, 0xdc, 0x83, 0xc7, 0x24, 0xbf, 0x42, - 0x5b, 0x89, 0xa3, 0xc6, 0x08, 0x2b, 0xef, 0x1a, 0x85, 0x01, 0x40, 0x0f, - 0x52, 0x79, 0x55, 0x15, 0x92, 0x2b, 0x75, 0xfa, 0xb7, 0x9b, 0x77, 0x6d, - 0x88, 0xc5, 0x51, 0xe3, 0x06, 0x99, 0x84, 0xc6, 0x2e, 0x23, 0x52, 0x4f, - 0xc1, 0x1f, 0x1a, 0x90, 0x58, 0xe1, 0xa8, 0x4b, 0x74, 0xf2, 0xeb, 0x36, - 0xff, 0x7c, 0xba, 0x9f, 0x9e, 0x37, 0x66, 0x05, 0xd8, 0x10, 0xec, 0x3b, - 0x68, 0x5e, 0xf9, 0xe7, 0x67, 0xe5, 0x7b, 0xe2, 0x0b, 0xeb, 0x8c, 0x72, - 0xe8, 0x0a, 0x9c, 0xbd, 0x36, 0x71, 0xb1, 0x93, 0x96, 0xc6, 0xd9, 0x38, - 0x89, 0x0e, 0xa3, 0xf7, 0x21, 0xc5, 0x9e, 0x93, 0x71, 0xbe, 0x7a, 0xc9, - 0xe4, 0x24, 0xb2, 0xf6, 0x56, 0xa4, 0xe3, 0xd2, 0x07, 0xdd, 0x97, 0xa0, - 0x54, 0x07, 0x90, 0x0b, 0x2c, 0x9a, 0xeb, 0xb8, 0x38, 0xe5, 0xee, 0x85, - 0x9e, 0xdb, 0x34, 0x4b, 0xa0, 0x39, 0x78, 0x65, 0xb4, 0x1c, 0x3f, 0x5e, - 0x7d, 0x6c, 0xf7, 0xbc, 0x51, 0x7b, 0x7c, 0x7c, 0x5e, 0x91, 0x26, 0x10, - 0x04, 0xb5, 0x40, 0xb2, 0x84, 0x2f, 0x3b, 0x29, 0x4c, 0x18, 0xd0, 0xf2, - 0xd8, 0xb2, 0xfd, 0xba, 0xca, 0xe8, 0xc1, 0xb5, 0xc2, 0xf4, 0xb5, 0xe6, - 0xd8, 0x09, 0xe6, 0x8c, 0x1f, 0x9b, 0xb2, 0x01, 0xee, 0xa1, 0x3d, 0x3e, - 0x56, 0xa4, 0x55, 0xd4, 0xd0, 0xb7, 0x6c, 0xef, 0xde, 0xbb, 0x26, 0x4a, - 0x3f, 0xa7, 0x6e, 0x40, 0x81, 0xca, 0xca, 0x8b, 0x16, 0x49, 0x77, 0xb0, - 0x8a, 0x2d, 0xd4, 0xb6, 0x94, 0x5a, 0x09, 0x34, 0x16, 0x37, 0xd2, 0xc6, - 0x2f, 0xdf, 0x0e, 0x46, 0x16, 0x82, 0xf7, 0x55, 0x0f, 0xe4, 0x89, 0x02, - 0x69, 0x6a, 0x7d, 0xab, 0x30, 0x95, 0x3a, 0x9d, 0x4e, 0x9f, 0x0e, 0x71, - 0xff, 0x68, 0x5f, 0x3c, 0xf8, 0xe7, 0x01, 0xa2, 0x56, 0x5f, 0xed, 0xcb, - 0x61, 0x26, 0x91, 0x08, 0xc0, 0xfb, 0xad, 0x56, 0xe8, 0x13, 0x70, 0x11, - 0xcd, 0xe4, 0x02, 0xa7, 0x15, 0x02, 0x31, 0x93, 0x6d, 0x92, 0x6e, 0x5f, - 0xa2, 0x70, 0x33, 0xfb, 0x85, 0xc0, 0xdf, 0xb7, 0xbb, 0xa9, 0x05, 0x22, - 0x62, 0xc8, 0xa2, 0x93, 0x0d, 0x0c, 0xe5, 0x13, 0x5c, 0x98, 0x5f, 0x9c, - 0x2b, 0x9a, 0xc4, 0xb1, 0x1c, 0x3d, 0x7f, 0x65, 0x2f, 0xcc, 0x67, 0x62, - 0x22, 0x9c, 0xc8, 0xf6, 0xb2, 0x8f, 0x80, 0x45, 0x61, 0x03, 0xfb, 0x4d, - 0x1a, 0x7d, 0xa2, 0x21, 0x40, 0x8b, 0xbb, 0x4c, 0x80, 0x1f, 0x6c, 0x90, - 0x29, 0x36, 0xb4, 0xe2, 0x2a, 0x9e, 0x95, 0x59, 0xeb, 0xf7, 0xaf, 0xb6, - 0xc9, 0x36, 0xc6, 0x6f, 0x03, 0xa0, 0x0d, 0x47, 0xaf, 0xe2, 0x6e, 0xb0, - 0xcd, 0x2e, 0x28, 0x7c, 0x45, 0x99, 0x15, 0x93, 0x30, 0x4e, 0xf3, 0xc1, - 0x7b, 0xa0, 0xb4, 0x5e, 0xdf, 0x59, 0x23, 0xe9, 0x08, 0x18, 0x01, 0x26, - 0xe0, 0xa4, 0x0d, 0xb2, 0x2a, 0xa6, 0x8c, 0x58, 0xc2, 0x4a, 0xb2, 0x0d, - 0xbb, 0x23, 0x4c, 0xe3, 0x74, 0xb8, 0x24, 0x05, 0x66, 0x24, 0x51, 0x87, - 0x59, 0xdc, 0x6a, 0x54, 0x39, 0xc0, 0x8b, 0xb9, 0xfc, 0x9b, 0x1f, 0xd9, - 0x7a, 0x88, 0x26, 0xa8, 0x74, 0x4b, 0x97, 0xcf, 0x2d, 0xe1, 0xcf, 0x74, - 0xa8, 0x5e, 0x6d, 0x69, 0x4c, 0x92, 0xe3, 0x07, 0xe6, 0xc6, 0xdc, 0xbb, - 0xf9, 0x23, 0x0d, 0x1a, 0x35, 0xf1, 0x82, 0xf6, 0x58, 0xb8, 0xf9, 0xb4, - 0x94, 0x6d, 0x75, 0x2e, 0x81, 0xe5, 0xc4, 0x5b, 0x6c, 0xa3, 0x34, 0xb1, - 0x3e, 0x4c, 0x35, 0xed, 0xd4, 0x30, 0x16, 0xaf, 0xbe, 0x82, 0x7d, 0xba, - 0x82, 0xdb, 0x52, 0xf1, 0x05, 0x55, 0x19, 0x30, 0xb0, 0x9e, 0x56, 0x9a, - 0x79, 0x0f, 0xf7, 0xf8, 0x7e, 0x39, 0x04, 0x01, 0x39, 0x97, 0x4e, 0xca, - 0x0f, 0xc1, 0x79, 0x1c, 0x98, 0x6c, 0x64, 0x9f, 0x90, 0xb0, 0x7c, 0x16, - 0x56, 0x46, 0xe4, 0xac, 0x4e, 0x83, 0xff, 0x0a, 0x2f, 0x98, 0x90, 0xf3, - 0x17, 0x75, 0x00, 0xf3, 0xcd, 0x42, 0x6c, 0x18, 0x77, 0xf1, 0xb9, 0xfa, - 0x0c, 0x10, 0x35, 0x2a, 0x4c, 0x06, 0xa6, 0x5f, 0x9d, 0x53, 0x09, 0x91, - 0x5c, 0xe4, 0x73, 0x10, 0x63, 0x2f, 0x10, 0xbc, 0xef, 0x1d, 0xd5, 0xb0, - 0x8e, 0xe0, 0xe2, 0xc0, 0xa5, 0x1b, 0xfa, 0xe2, 0x51, 0x71, 0x46, 0xc9, - 0xc9, 0x74, 0x69, 0x80, 0x73, 0x11, 0xa1, 0xa5, 0x9c, 0x16, 0x73, 0x16, - 0x02, 0x7d, 0x92, 0x0b, 0xfe, 0x45, 0x9c, 0x30, 0xe2, 0x64, 0xfa, 0x00, - 0x77, 0xae, 0xdc, 0x48, 0x52, 0x21, 0x16, 0x9d, 0x47, 0x6a, 0x7b, 0x7d, - 0xc3, 0xb4, 0x78, 0x21, 0x93, 0xdb, 0xfc, 0xac, 0x69, 0x57, 0x2f, 0x96, - 0x50, 0x2d, 0xb7, 0x1d, 0xe3, 0x96, 0x83, 0xcf, 0x16, 0x85, 0x69, 0xc9, - 0xb3, 0x58, 0xd4, 0xec, 0x55, 0x64, 0xd4, 0xf6, 0x8b, 0xf1, 0x99, 0xc0, - 0x43, 0x3e, 0x98, 0xb7, 0x6c, 0x61, 0x61, 0x22, 0xd0, 0x95, 0xf0, 0x0d, - 0xc4, 0x4c, 0x98, 0x1b, 0x02, 0x20, 0x7c, 0x6e, 0x05, 0x84, 0x98, 0x7d, - 0xb6, 0x21, 0x1f, 0x6e, 0x63, 0xc8, 0x94, 0x62, 0x05, 0x02, 0x1f, 0x97, - 0x90, 0x02, 0xe3, 0x29, 0x15, 0xcd, 0x07, 0x3a, 0x20, 0x01, 0xb5, 0x90, - 0x01, 0xa2, 0x46, 0x8c, 0x1f, 0x59, 0x24, 0x15, 0xf4, 0x84, 0xf8, 0xa0, - 0x24, 0xd8, 0x03, 0x0b, 0x70, 0x62, 0xe6, 0xed, 0x00, 0x64, 0x4d, 0xf7, - 0x6e, 0xf7, 0x08, 0xb3, 0x4d, 0x26, 0xa3, 0x73, 0x43, 0xeb, 0xf0, 0x9a, - 0x56, 0xe3, 0x85, 0x90, 0x49, 0x1b, 0x43, 0x9d, 0x25, 0x53, 0x46, 0xc9, - 0x48, 0xeb, 0x34, 0xce, 0x05, 0x39, 0xc2, 0x7f, 0x70, 0x89, 0x48, 0xd4, - 0x1d, 0xb9, 0x67, 0xed, 0x68, 0x54, 0xb7, 0x36, 0x47, 0x44, 0x78, 0x7d, - 0xf7, 0x87, 0xc2, 0x0a, 0xbc, 0x7f, 0x48, 0xda, 0xdc, 0xbf, 0xe1, 0x88, - 0x5f, 0x40, 0xfe, 0x3a, 0x92, 0x35, 0xe7, 0xa5, 0x9e, 0xb1, 0x5c, 0xe4, - 0x2a, 0xd5, 0x38, 0x0e, 0xf8, 0x8f, 0x08, 0xa1, 0x2d, 0x6d, 0x29, 0x50, - 0x2c, 0xec, 0x87, 0x45, 0x0e, 0xaa, 0x6f, 0x7c, 0xb3, 0xb5, 0x25, 0x9d, - 0x39, 0xb0, 0x74, 0x6f, 0x81, 0x85, 0xd5, 0x58, 0x41, 0xa0, 0x0a, 0x39, - 0xf1, 0x0a, 0x13, 0x9b, 0x4f, 0x7b, 0x2d, 0x44, 0xff, 0x86, 0x58, 0xcd, - 0x40, 0x69, 0xec, 0xb1, 0x89, 0x47, 0x84, 0x37, 0x47, 0xb2, 0x36, 0x79, - 0x28, 0x97, 0xa6, 0x04, 0xda, 0x24, 0x22, 0xd7, 0x6f, 0x35, 0xe6, 0x2f, - 0x61, 0x64, 0x61, 0xcc, 0xb3, 0xfd, 0xe4, 0x89, 0x74, 0x91, 0x26, 0x6f, - 0x9e, 0x72, 0x7b, 0xa4, 0x61, 0x6a, 0x17, 0xcd, 0x3b, 0x37, 0xe0, 0x67, - 0x99, 0x37, 0xfb, 0x7b, 0x10, 0x2b, 0xbc, 0x98, 0xe4, 0x60, 0x38, 0x58, - 0x4d, 0x98, 0x83, 0xdd, 0x9f, 0x02, 0xbc, 0xf9, 0xbd, 0x01, 0x7c, 0x0d, - 0x4a, 0x74, 0xbc, 0xb0, 0x29, 0x74, 0x88, 0xb5, 0x02, 0xd0, 0x99, 0x91, - 0x75, 0xa0, 0x83, 0x62, 0xc0, 0x1e, 0x9e, 0xa6, 0xac, 0xda, 0xe1, 0xcd, - 0x6b, 0x47, 0x64, 0x86, 0x07, 0x10, 0x93, 0xf7, 0x9e, 0x78, 0x29, 0x08, - 0xe2, 0x6d, 0xf9, 0xc4, 0xb2, 0x91, 0x81, 0xc0, 0x0c, 0x2d, 0xa9, 0xba, - 0x51, 0x4d, 0x5f, 0x11, 0x4b, 0x16, 0x4e, 0xda, 0x0e, 0x6d, 0x8d, 0x84, - 0x91, 0x5c, 0xe8, 0x3b, 0xdd, 0x1c, 0x91, 0xed, 0x34, 0xc7, 0xae, 0x27, - 0x15, 0x7a, 0x6f, 0x0a, 0x5c, 0xdb, 0x55, 0x82, 0x3d, 0x70, 0x58, 0x02, - 0x95, 0xe4, 0xb0, 0x3a, 0xba, 0xb3, 0xab, 0xe2, 0x4d, 0x35, 0x08, 0x1c, - 0xff, 0x1f, 0x04, 0xdf, 0x09, 0x00, 0xfa, 0x0e, 0x6d, 0xe9, 0x4f, 0x5d, - 0xb5, 0xb8, 0x64, 0xd4, 0x49, 0x9c, 0xcf, 0xae, 0x5e, 0x85, 0x6a, 0xc2, - 0x7c, 0xcb, 0xf5, 0x98, 0x90, 0x27, 0x8b, 0xa8, 0x4b, 0x2c, 0xf3, 0x0b, - 0x93, 0xda, 0x37, 0xda, 0x38, 0x07, 0x64, 0xec, 0xb2, 0xf9, 0xad, 0xb6, - 0xe3, 0x7e, 0x0b, 0xec, 0xe1, 0xdb, 0x94, 0x8d, 0x83, 0x5e, 0x24, 0x38, - 0x97, 0xa2, 0x04, 0xff, 0xb2, 0x60, 0x4d, 0x26, 0xad, 0xa3, 0xd6, 0x17, - 0x64, 0x2d, 0x93, 0x59, 0xb2, 0x74, 0x1c, 0xfb, 0xba, 0xaa, 0x29, 0xb9, - 0xa0, 0x34, 0xb6, 0x74, 0x15, 0xae, 0xba, 0xd3, 0x86, 0xed, 0xf4, 0x13, - 0x71, 0xa2, 0x1e, 0x9f, 0xe7, 0xa4, 0x6d, 0x96, 0x9d, 0x94, 0x8f, 0xea, - 0x5d, 0x3a, 0xfd, 0x2b, 0x4f, 0x3d, 0x20, 0x59, 0xbd, 0x56, 0xa3, 0xe6, - 0x8a, 0x3f, 0xf8, 0x4b, 0x0c, 0xc3, 0x7d, 0x49, 0x71, 0x8f, 0x11, 0xb9, - 0x63, 0x03, 0x8d, 0xea, 0x13, 0xab, 0xbf, 0x81, 0x17, 0x30, 0x5b, 0xde, - 0xe0, 0x7a, 0x6e, 0xac, 0x58, 0x7d, 0x5b, 0xc7, 0x17, 0x34, 0x7e, 0xdb, - 0xb5, 0x70, 0x55, 0xaf, 0xf1, 0xf3, 0x3d, 0x14, 0xcf, 0xed, 0xfc, 0xf8, - 0xfe, 0x45, 0x57, 0xb8, 0xea, 0x16, 0x78, 0x35, 0x62, 0xe8, 0x0c, 0xa4, - 0xef, 0x39, 0x68, 0xc1, 0x2a, 0x58, 0x17, 0xb0, 0x21, 0xb5, 0xf8, 0x12, - 0xf7, 0x8f, 0xdb, 0xa3, 0x04, 0x64, 0xe3, 0x86, 0xd5, 0x3f, 0xee, 0x5e, - 0xe5, 0xf5, 0x8e, 0xc1, 0xe9, 0x4f, 0x50, 0xb3, 0x53, 0x3a, 0x1f, 0x71, - 0x75, 0x91, 0x0e, 0xc4, 0xba, 0x81, 0xcb, 0x87, 0x78, 0x6c, 0xc2, 0xcc, - 0x02, 0x53, 0x20, 0x2e, 0x26, 0x3b, 0xc3, 0x80, 0x8f, 0xac, 0xa3, 0x9d, - 0x60, 0x82, 0xb7, 0x05, 0xc9, 0x18, 0xac, 0x39, 0xd4, 0x1a, 0xaf, 0x12, - 0xb4, 0x4a, 0x24, 0x58, 0xda, 0xa4, 0x8b, 0xff, 0x9a, 0xc5, 0xc7, 0xba, - 0x7c, 0x98, 0x8f, 0x6b, 0xf9, 0x0e, 0xf6, 0xf6, 0x06, 0x71, 0x74, 0x96, - 0xd7, 0xb3, 0xeb, 0xc0, 0xba, 0x85, 0xd4, 0x0a, 0xf3, 0x58, 0x7b, 0x1c, - 0x26, 0x70, 0xdc, 0xf8, 0xdb, 0x8d, 0xfb, 0x6d, 0xd9, 0xd3, 0xf7, 0x0e, - 0x91, 0x91, 0x5d, 0x54, 0x8c, 0xac, 0x3f, 0xee, 0x11, 0x7c, 0xd0, 0xa2, - 0xc3, 0x91, 0x2b, 0xb5, 0x52, 0xfd, 0x33, 0xf6, 0x40, 0xf1, 0xb2, 0x22, - 0xd2, 0xb6, 0x3c, 0x59, 0x1e, 0xed, 0x7c, 0x89, 0xd3, 0xcb, 0x0b, 0x70, - 0xab, 0x20, 0xbf, 0xa6, 0xf4, 0x51, 0x59, 0x1a, 0x4f, 0x92, 0x7a, 0x00, - 0xa9, 0x3c, 0x1a, 0xa9, 0x1a, 0x39, 0xbb, 0x3b, 0x10, 0x0a, 0x6a, 0x67, - 0x11, 0x7b, 0xdc, 0x7a, 0xba, 0x1d, 0x78, 0x52, 0x80, 0x6e, 0x5e, 0xee, - 0x5c, 0x39, 0xaa, 0x51, 0xa2, 0x89, 0xb5, 0x80, 0xda, 0x49, 0x80, 0x59, - 0x92, 0x68, 0xd0, 0x8a, 0x69, 0xc8, 0x42, 0xc5, 0x50, 0xea, 0x1e, 0xf3, - 0x3f, 0x88, 0xe8, 0x61, 0x11, 0x51, 0xf3, 0xc1, 0x7f, 0xec, 0x23, 0x0c, - 0xd7, 0x72, 0xda, 0x37, 0x3c, 0x07, 0x29, 0x81, 0x21, 0x1b, 0xf3, 0xde, - 0x78, 0x30, 0x0f, 0x29, 0xe9, 0xb0, 0x83, 0x26, 0xd0, 0x07, 0xe6, 0xa2, - 0x27, 0xe5, 0x55, 0xd5, 0x09, 0xb3, 0x1e, 0xd8, 0xe1, 0xdf, 0x17, 0xee, - 0xb8, 0x64, 0xcb, 0x8b, 0xb1, 0x26, 0xac, 0xf4, 0xb8, 0x88, 0xcf, 0x43, - 0x91, 0x20, 0x95, 0x06, 0x57, 0xd4, 0x21, 0x4a, 0x7e, 0x84, 0x72, 0x9b, - 0xb6, 0x41, 0x83, 0x05, 0x00, 0xf6, 0x36, 0x8a, 0xab, 0xf1, 0x22, 0xe4, - 0x9d, 0xe9, 0xee, 0x87, 0x8d, 0xf8, 0x8c, 0x2e, 0xe0, 0xb9, 0x8c, 0xbe, - 0x88, 0x83, 0x33, 0x78, 0xeb, 0x68, 0x8d, 0x53, 0x77, 0x02, 0x54, 0x1d, - 0xa5, 0x5d, 0x45, 0xb7, 0xf5, 0x05, 0xc6, 0xe2, 0x9c, 0xee, 0xbe, 0x8d, - 0x92, 0x4e, 0x7e, 0x6c, 0xe5, 0x8e, 0x0e, 0x20, 0x12, 0x65, 0x41, 0x3b, - 0xa3, 0x3a, 0xff, 0x52, 0x40, 0x9f, 0x90, 0xd1, 0x17, 0xbc, 0xc3, 0x30, - 0xf0, 0xda, 0xb8, 0xaa, 0xcb, 0xe9, 0x2e, 0xd0, 0x6d, 0x10, 0x77, 0xf6, - 0x06, 0xdc, 0x80, 0xc8, 0x09, 0xf8, 0xe8, 0x20, 0x10, 0x04, 0xf9, 0x78, - 0x2b, 0x6a, 0xa2, 0xb4, 0xc6, 0xfe, 0x72, 0x94, 0xcd, 0x55, 0xbf, 0xa5, - 0xd7, 0x99, 0x3e, 0x42, 0xaa, 0xb9, 0x26, 0x84, 0x43, 0xe6, 0x71, 0x4b, - 0x5e, 0xf2, 0x60, 0x87, 0xeb, 0xd1, 0x9a, 0x55, 0xa2, 0x9b, 0x84, 0x33, - 0x29, 0x04, 0xaf, 0x56, 0x09, 0x16, 0x93, 0x70, 0x12, 0xdc, 0xb5, 0xfb, - 0xce, 0xc1, 0xd3, 0x11, 0x90, 0xa2, 0x31, 0xcc, 0x02, 0xfc, 0xbc, 0xa2, - 0xe7, 0xc2, 0xda, 0x46, 0x94, 0x6a, 0x82, 0x69, 0x0e, 0xc2, 0x4f, 0xe1, - 0x4f, 0xf2, 0xb7, 0xfb, 0xbb, 0x65, 0xa1, 0xf2, 0xf9, 0xfe, 0x92, 0xc8, - 0x25, 0x37, 0xd4, 0x6e, 0x2e, 0x76, 0xa6, 0x04, 0x87, 0x16, 0xda, 0x6f, - 0x88, 0xa6, 0x3e, 0x0d, 0x39, 0x24, 0x92, 0x1b, 0x5a, 0x24, 0x4f, 0x1d, - 0xe5, 0xc7, 0xfd, 0x63, 0x8b, 0x14, 0x1e, 0x07, 0xd5, 0xe8, 0x78, 0xd8, - 0x17, 0xe4, 0x35, 0xe9, 0x13, 0x77, 0xf1, 0xdf, 0xe4, 0xe5, 0x05, 0xce, - 0xf9, 0xca, 0x09, 0x8c, 0xba, 0x53, 0x6c, 0x3e, 0xd0, 0x37, 0x92, 0x98, - 0xb8, 0xbe, 0x9c, 0xbe, 0xbb, 0xd4, 0xc7, 0xae, 0xa3, 0x73, 0xbd, 0xc4, - 0xb5, 0x38, 0xfb, 0x08, 0x49, 0xde, 0x1d, 0x15, 0xd3, 0x9c, 0x2f, 0x3b, - 0x00, 0x86, 0xeb, 0xf0, 0xba, 0x86, 0x38, 0xbd, 0xb7, 0xf8, 0x87, 0x7c, - 0x55, 0x43, 0x0a, 0x09, 0x2b, 0x44, 0x2f, 0x23, 0x5b, 0x47, 0xc1, 0x93, - 0xfd, 0x18, 0xd6, 0x9e, 0xa0, 0x27, 0xcb, 0x93, 0xaf, 0x56, 0x3e, 0x79, - 0x88, 0x2f, 0x71, 0x62, 0x0b, 0x71, 0xd9, 0x4f, 0x93, 0xd5, 0xa9, 0xb9, - 0xc6, 0x71, 0x40, 0x91, 0x69, 0x6f, 0x82, 0x6e, 0x46, 0xdf, 0x98, 0x79, - 0x2e, 0xb6, 0x74, 0x7c, 0xed, 0x57, 0xdc, 0x67, 0x9a, 0x33, 0x7d, 0x5b, - 0xe2, 0x55, 0xa3, 0x53, 0x78, 0x17, 0x54, 0x88, 0x27, 0xda, 0xf1, 0x99, - 0x22, 0xa6, 0xf7, 0x1d, 0xb4, 0xdc, 0xe9, 0x29, 0x5d, 0xcf, 0xb8, 0x6e, - 0x6e, 0x28, 0xe3, 0x72, 0x4e, 0x8b, 0x70, 0x27, 0xd9, 0xf3, 0x6e, 0xca, - 0xa4, 0xa7, 0x59, 0x65, 0x96, 0x41, 0x78, 0x97, 0xd6, 0xf9, 0x41, 0x19, - 0xa8, 0xb9, 0x13, 0x2f, 0x23, 0xbc, 0x21, 0x30, 0x76, 0x21, 0xc7, 0x85, - 0xdb, 0xf6, 0x19, 0x5f, 0x33, 0x64, 0xe2, 0x84, 0x7a, 0x1e, 0x57, 0x42, - 0xa0, 0xe8, 0xba, 0xae, 0x61, 0xdb, 0x4c, 0x67, 0x32, 0x2d, 0x6f, 0xbf, - 0x23, 0xbd, 0xa2, 0xd0, 0xf6, 0x1f, 0x44, 0xa4, 0x8e, 0x77, 0x48, 0xf0, - 0xc0, 0x9c, 0x9d, 0x98, 0xd2, 0xa1, 0x8c, 0xae, 0x46, 0x91, 0xd0, 0xff, - 0x25, 0x2f, 0x99, 0x5b, 0xf3, 0xd3, 0xe2, 0x92, 0x7a, 0x53, 0x58, 0xa3, - 0xb2, 0x8b, 0x65, 0x20, 0x46, 0x41, 0xb5, 0x0e, 0x00, 0x20, 0xe8, 0x4e, - 0x85, 0x65, 0x9e, 0xdc, 0xae, 0x2e, 0xeb, 0xd3, 0xfd, 0x52, 0x10, 0x83, - 0x6e, 0x0a, 0xe8, 0x7f, 0x1e, 0xc4, 0x97, 0x04, 0xa8, 0x9f, 0xf2, 0xfc, - 0xa9, 0x8b, 0x5f, 0x76, 0xe8, 0xfc, 0xba, 0xba, 0xc9, 0x80, 0xe1, 0xc0, - 0x1b, 0x93, 0x2b, 0xd3, 0x4f, 0x66, 0x6b, 0xfb, 0x39, 0x98, 0x78, 0x4b, - 0x88, 0x12, 0xc0, 0x0e, 0xa0, 0x6d, 0x38, 0x53, 0x69, 0x9b, 0xe2, 0x0b, - 0xe3, 0x2a, 0x6e, 0xbe, 0x8f, 0x44, 0xa6, 0x61, 0x8f, 0x7e, 0xa9, 0x56, - 0xdf, 0xbb, 0x59, 0x04, 0x0f, 0x2a, 0xbc, 0x3f, 0x43, 0x87, 0xb1, 0x8e, - 0xe5, 0xb9, 0xce, 0x2f, 0x81, 0x25, 0xd2, 0xa1, 0xe5, 0x54, 0xc9, 0x1e, - 0xb6, 0x63, 0x5a, 0xf1, 0xdc, 0x17, 0x51, 0x31, 0x12, 0xf0, 0x0b, 0x58, - 0x3a, 0xe9, 0x5b, 0x69, 0x27, 0x97, 0x1a, 0x4e, 0x17, 0xb2, 0x42, 0x22, - 0x72, 0xdd, 0xe4, 0xda, 0x16, 0x0d, 0xa7, 0x38, 0x2c, 0x5c, 0xeb, 0x4e, - 0x09, 0x9c, 0xe6, 0x6e, 0x69, 0x8e, 0x7e, 0x42, 0x99, 0x4d, 0xf1, 0x46, - 0x4f, 0x3f, 0x4c, 0x7e, 0xad, 0xd8, 0xdb, 0x99, 0x21, 0x4f, 0x4b, 0xbf, - 0xbf, 0x29, 0x89, 0xeb, 0x8d, 0x04, 0xbc, 0x66, 0xf3, 0xd4, 0xb1, 0x63, - 0x65, 0xb0, 0x9d, 0xad, 0x96, 0x0e, 0x4b, 0x6a, 0x86, 0xbb, 0x32, 0x21, - 0xec, 0xaa, 0x18, 0x23, 0xe3, 0x2a, 0x7a, 0x03, 0x9c, 0xd2, 0x10, 0x55, - 0xd6, 0x5b, 0x53, 0xdd, 0x98, 0x38, 0xd0, 0x3d, 0x50, 0xda, 0x4d, 0x6b, - 0x5e, 0xd7, 0x4b, 0x92, 0xc7, 0x71, 0x97, 0x66, 0x2b, 0x67, 0x64, 0x6f, - 0x27, 0x6c, 0xe4, 0x9b, 0xe5, 0xca, 0xa1, 0x4e, 0x00, 0x13, 0xc9, 0x0f, - 0xea, 0xf2, 0x68, 0x17, 0xd8, 0x2e, 0xc6, 0x23, 0xc5, 0x91, 0x35, 0x68, - 0xd2, 0xc9, 0x5d, 0x07, 0x97, 0xb9, 0x59, 0x8e, 0xc1, 0x14, 0xfa, 0xf1, - 0x38, 0xe8, 0x2a, 0x5f, 0x67, 0x53, 0x9f, 0xe8, 0x4d, 0xf9, 0xf2, 0x5d, - 0x0a, 0x64, 0x21, 0x9c, 0x69, 0xdf, 0x07, 0xb0, 0x56, 0x1a, 0xda, 0xe9, - 0x06, 0x67, 0xca, 0x54, 0xbc, 0x3c, 0x79, 0x0a, 0x7f, 0x8d, 0x09, 0xe0, - 0xeb, 0x9a, 0xde, 0x42, 0x3f, 0xf3, 0x87, 0xf6, 0x64, 0xa6, 0x20, 0xca, - 0x75, 0x43, 0xd0, 0xa4, 0x16, 0xde, 0x67, 0xfd, 0xe9, 0x54, 0x11, 0x83, - 0x0a, 0xe6, 0x57, 0xa3, 0xad, 0x26, 0x17, 0x16, 0x38, 0x8f, 0xf9, 0xc6, - 0x0b, 0x39, 0x41, 0xdb, 0xe0, 0x79, 0x5f, 0x42, 0x8d, 0xe8, 0xf7, 0x19, - 0xc5, 0xf5, 0x90, 0xee, 0x92, 0x0f, 0x0b, 0x00, 0x6c, 0x1d, 0xf7, 0xea, - 0xb2, 0x06, 0x4c, 0x6a, 0x0f, 0x44, 0xf2, 0xd8, 0xb1, 0x19, 0xb7, 0xcb, - 0xa3, 0x8d, 0x18, 0x70, 0x22, 0xb4, 0x16, 0x49, 0x4e, 0x38, 0xb3, 0x79, - 0xa5, 0x50, 0x9e, 0xf7, 0x41, 0x65, 0x97, 0xb8, 0x1c, 0xb5, 0xe9, 0x5e, - 0x6d, 0xba, 0x12, 0x53, 0xaa, 0xf6, 0x21, 0xd0, 0x82, 0x7d, 0xbe, 0xdf, - 0x5d, 0xd4, 0x6d, 0x64, 0x23, 0x01, 0xb5, 0xd5, 0xb0, 0x0d, 0x72, 0xcf, - 0x05, 0xa3, 0xf7, 0x03, 0xb9, 0x57, 0x78, 0x4a, 0xe1, 0x04, 0x72, 0x5f, - 0x92, 0x20, 0xcb, 0x30, 0xec, 0x17, 0xaf, 0xa0, 0xab, 0xd6, 0xae, 0x06, - 0xd4, 0x7f, 0xf0, 0x39, 0x4d, 0xc9, 0xb2, 0x9c, 0x62, 0xe5, 0xba, 0xd2, - 0x1a, 0xb6, 0xc3, 0x32, 0x6b, 0xb0, 0x01, 0xbc, 0x5b, 0xe3, 0x76, 0x2c, - 0xa6, 0x1d, 0x2a, 0x69, 0x58, 0x99, 0x57, 0x7a, 0x65, 0x07, 0x58, 0x13, - 0x84, 0x56, 0x70, 0x11, 0xe4, 0x15, 0x6a, 0x7f, 0xc3, 0x59, 0xb0, 0x85, - 0xcc, 0xee, 0xfd, 0xdd, 0x7e, 0x30, 0x21, 0x4a, 0xbc, 0xe6, 0xf5, 0xc6, - 0xee, 0xff, 0x32, 0x37, 0x8f, 0x03, 0x76, 0xac, 0xa5, 0xfc, 0x0f, 0x4c, - 0xd5, 0x76, 0xd5, 0xfd, 0x82, 0xb4, 0x29, 0x79, 0xb6, 0x8f, 0xca, 0x7f, - 0x5a, 0xcb, 0xa5, 0x4f, 0xae, 0x50, 0x07, 0x83, 0x8f, 0x18, 0x25, 0xae, - 0xb6, 0xbd, 0xdc, 0x59, 0xe7, 0x1f, 0xf4, 0xa9, 0xad, 0xa8, 0x6e, 0x8b, - 0xfe, 0x4f, 0x5c, 0x90, 0x4b, 0xd1, 0xe8, 0x7e, 0xa7, 0x2c, 0x64, 0xaf, - 0x28, 0xaa, 0xdd, 0xd7, 0x0e, 0xf2, 0xa2, 0x7e, 0x50, 0xc3, 0xee, 0x8d, - 0xc7, 0xda, 0xb1, 0xbb, 0x0f, 0x40, 0x91, 0x1f, 0xba, 0x1a, 0x41, 0x05, - 0xdb, 0x53, 0xf5, 0x90, 0xc9, 0x73, 0x8b, 0x52, 0x83, 0xb7, 0x9f, 0x5b, - 0xb3, 0x3f, 0x94, 0x82, 0x47, 0x56, 0x07, 0xde, 0x4c, 0xa7, 0x41, 0xcb, - 0x48, 0x03, 0x92, 0xdc, 0x68, 0x1a, 0xe5, 0x5e, 0xb0, 0x9c, 0x27, 0xdf, - 0xff, 0xe1, 0x9b, 0xd2, 0x62, 0xea, 0x56, 0x51, 0x8d, 0x70, 0x73, 0xcf, - 0x93, 0x4e, 0x0e, 0x2e, 0x02, 0x56, 0xe5, 0xdf, 0x43, 0xd9, 0xc3, 0x90, - 0x0b, 0x8f, 0xc5, 0x08, 0xd7, 0xb3, 0x54, 0x9f, 0x94, 0xa6, 0x20, 0xc5, - 0x22, 0x7a, 0xbd, 0xf7, 0xaf, 0x9d, 0xa2, 0xad, 0x4b, 0x1e, 0xd0, 0x7a, - 0x07, 0xe3, 0x22, 0xa4, 0x5f, 0x47, 0xc6, 0x93, 0x62, 0xa7, 0x5c, 0x88, - 0xb9, 0x43, 0x3a, 0x55, 0x90, 0x4a, 0xc9, 0x77, 0x0c, 0x10, 0xf5, 0xd5, - 0x3f, 0x6f, 0xca, 0xf3, 0xe9, 0xa1, 0x3b, 0x10, 0x1e, 0x55, 0xa5, 0x86, - 0x37, 0xef, 0x86, 0xc4, 0x13, 0xd4, 0x68, 0x77, 0x5c, 0x39, 0x43, 0xee, - 0x38, 0x5d, 0x6f, 0x15, 0x81, 0xd4, 0x01, 0x09, 0xc4, 0xc1, 0x06, 0xb5, - 0x17, 0x3e, 0x87, 0xd4, 0x47, 0xb2, 0xe3, 0x4a, 0x87, 0x2e, 0xce, 0xf9, - 0x49, 0xb6, 0xb3, 0xc9, 0x0e, 0x36, 0xbf, 0x74, 0x93, 0x48, 0xaa, 0x32, - 0xfc, 0x28, 0x2a, 0xa4, 0x45, 0x1b, 0xf9, 0x81, 0xce, 0xc2, 0xc3, 0xe3, - 0x95, 0x87, 0x29, 0x5c, 0x13, 0xe5, 0xeb, 0x78, 0x7a, 0x8c, 0xfa, 0x86, - 0x64, 0x3d, 0x31, 0x9f, 0x73, 0x08, 0xe1, 0x42, 0x39, 0xb4, 0x15, 0x83, - 0x2a, 0x97, 0x60, 0x84, 0x0d, 0x2f, 0x4f, 0xcb, 0x8c, 0xb4, 0xdb, 0x14, - 0xd1, 0xb0, 0x18, 0xd9, 0xf1, 0x8c, 0xc2, 0xc1, 0xf0, 0x08, 0xde, 0x9c, - 0x71, 0x53, 0x9c, 0xf0, 0xcf, 0xdc, 0x9c, 0x7d, 0x4e, 0x21, 0xec, 0xdf, - 0x98, 0xa9, 0xa5, 0xf4, 0x6f, 0x21, 0x67, 0x9a, 0xac, 0xb0, 0x17, 0xf1, - 0x84, 0x12, 0x30, 0xbd, 0xfd, 0xe0, 0x70, 0x9b, 0x77, 0xe5, 0xfe, 0xbb, - 0x9c, 0xca, 0xdd, 0xcb, 0x21, 0xbe, 0xde, 0x54, 0x2d, 0x0b, 0x18, 0x31, - 0x4f, 0x8b, 0xa6, 0xba, 0x3b, 0x52, 0x4e, 0x47, 0xec, 0x13, 0xee, 0xe5, - 0x82, 0x50, 0x04, 0x3d, 0x01, 0xca, 0xf0, 0x81, 0xc4, 0x66, 0x66, 0x78, - 0x28, 0xdf, 0x5b, 0x1a, 0x9c, 0x37, 0x00, 0xdd, 0x0a, 0xe8, 0xe2, 0x0c, - 0x3b, 0x0e, 0x53, 0xc7, 0xc7, 0x3c, 0xcd, 0x54, 0xdb, 0x82, 0x49, 0x6a, - 0x38, 0xb2, 0xa3, 0x63, 0xa6, 0xf6, 0x55, 0xa5, 0x48, 0xc2, 0x31, 0xa6, - 0x86, 0xdd, 0xcc, 0xc2, 0x3c, 0x0e, 0xa8, 0xa3, 0x3e, 0xb2, 0x62, 0xc2, - 0x78, 0x52, 0xad, 0x40, 0xca, 0x43, 0x1f, 0x22, 0x0b, 0x89, 0x9b, 0xb7, - 0xdf, 0x58, 0x32, 0xd1, 0x07, 0xed, 0x15, 0xac, 0x9b, 0x26, 0xf3, 0x96, - 0xa4, 0xf6, 0x5a, 0x2e, 0x85, 0xe2, 0x70, 0xb0, 0x4d, 0x1d, 0xa6, 0xc4, - 0xc9, 0x58, 0xed, 0xf1, 0x8e, 0xc1, 0x94, 0xe7, 0x9b, 0xb0, 0x27, 0x6a, - 0xd9, 0xf0, 0x48, 0x7b, 0x5c, 0x82, 0xf8, 0x68, 0x00, 0x9d, 0xd2, 0x08, - 0x93, 0xf5, 0x87, 0x5a, 0xf6, 0xdc, 0xde, 0x28, 0xab, 0x3b, 0x71, 0x74, - 0x73, 0x9b, 0x74, 0xd6, 0x71, 0xcb, 0x3c, 0x11, 0x9c, 0xeb, 0x4d, 0x5f, - 0x1f, 0x5c, 0x6e, 0x55, 0xa5, 0x34, 0x6c, 0x58, 0x86, 0x75, 0xaa, 0x7a, - 0x15, 0x87, 0x95, 0xe3, 0x14, 0x62, 0xfd, 0x97, 0x60, 0x3a, 0x1a, 0xc6, - 0x7a, 0xa6, 0xd3, 0x3d, 0x38, 0x6a, 0x27, 0x55, 0x5c, 0xfd, 0x5f, 0xc0, - 0x2f, 0x5d, 0xcf, 0x91, 0xc3, 0x01, 0xcd, 0xc3, 0x1a, 0x72, 0x38, 0x2a, - 0x00, 0x4b, 0x9c, 0x57, 0x43, 0x7d, 0x8a, 0x27, 0xe2, 0x84, 0xc3, 0x67, - 0x51, 0xfd, 0x65, 0xd9, 0x5f, 0x70, 0xb4, 0x93, 0xf6, 0xe1, 0xa5, 0x1d, - 0x9e, 0x01, 0x27, 0x61, 0x38, 0x61, 0xf7, 0xbe, 0x70, 0xe0, 0x89, 0xc0, - 0xd4, 0x51, 0xf6, 0xd7, 0xb2, 0x71, 0xa1, 0xe1, 0x36, 0x09, 0x6a, 0xec, - 0x07, 0x35, 0x6a, 0x4a, 0x96, 0x49, 0xb5, 0x6c, 0x7a, 0x52, 0x8b, 0x35, - 0x1a, 0x69, 0x48, 0x34, 0xa9, 0x9f, 0x5a, 0x68, 0x6b, 0x4f, 0x63, 0x63, - 0x17, 0xeb, 0x62, 0xfd, 0x0a, 0xdc, 0x6c, 0xab, 0x7a, 0xbb, 0x62, 0x8e, - 0xd8, 0x58, 0xe8, 0x23, 0x1b, 0xa9, 0x1c, 0x09, 0xb8, 0x1b, 0x38, 0x18, - 0x88, 0xe7, 0x3b, 0xdd, 0x52, 0x81, 0xbe, 0x48, 0xd1, 0x68, 0xf9, 0xc7, - 0xc9, 0xf1, 0x2d, 0x3d, 0xc5, 0x23, 0x82, 0x92, 0xc2, 0xbb, 0xd5, 0xa9, - 0xf0, 0x9a, 0xcd, 0xf0, 0xc4, 0xa0, 0xe7, 0x94, 0xe5, 0xfd, 0x98, 0x3d, - 0xa4, 0xda, 0x34, 0x24, 0x22, 0x4d, 0xdf, 0x04, 0x32, 0xcc, 0x2b, 0x5c, - 0x24, 0x7a, 0xb9, 0xc5, 0xad, 0x58, 0x19, 0xdc, 0x31, 0xf7, 0xde, 0x6e, - 0x60, 0xed, 0xce, 0x19, 0x72, 0x89, 0xea, 0xb0, 0x5d, 0xab, 0x8f, 0x99, - 0x45, 0xdb, 0x32, 0x57, 0x37, 0x01, 0x4b, 0x88, 0xf2, 0x34, 0x34, 0xe3, - 0x29, 0x2a, 0xf0, 0x3a, 0xe6, 0xda, 0xca, 0x82, 0x26, 0xc2, 0x86, 0x19, - 0xf8, 0x06, 0x6a, 0x75, 0xbb, 0xc8, 0x23, 0xca, 0x86, 0x20, 0x44, 0x93, - 0x58, 0x70, 0xcd, 0x1e, 0x1f, 0xf2, 0x9f, 0xc5, 0x68, 0x8e, 0x30, 0x5d, - 0xae, 0x77, 0x24, 0x26, 0x4a, 0x5f, 0xf3, 0x56, 0x33, 0xf5, 0x12, 0x4a, - 0x60, 0x29, 0x6b, 0x61, 0xa6, 0xb4, 0x74, 0xc3, 0x69, 0x80, 0xdb, 0x18, - 0x8b, 0xba, 0x72, 0x25, 0x69, 0xfe, 0x4b, 0x69, 0xca, 0x3c, 0x3c, 0xd1, - 0x1f, 0x73, 0x41, 0x98, 0xde, 0x80, 0xa6, 0x13, 0xcd, 0x6b, 0x0f, 0x1e, - 0x33, 0xf0, 0x38, 0xbd, 0xad, 0x12, 0x75, 0x98, 0xc9, 0x2c, 0x75, 0x0f, - 0x02, 0x92, 0x9b, 0xd3, 0xe6, 0xf3, 0xf5, 0x45, 0xd3, 0xb8, 0x0a, 0x47, - 0x05, 0x03, 0xe0, 0x54, 0xa3, 0x76, 0x71, 0x82, 0x61, 0xc8, 0x12, 0x54, - 0x35, 0x60, 0x8f, 0x90, 0xa0, 0xc6, 0xaf, 0x11, 0xda, 0x1e, 0x4f, 0x66, - 0x40, 0x80, 0xee, 0x45, 0x3b, 0x77, 0xf2, 0xca, 0xde, 0xb7, 0x8b, 0xcf, - 0xa9, 0xa6, 0x23, 0xa4, 0x6a, 0x4f, 0xcc, 0x4f, 0xe4, 0x06, 0xac, 0x2d, - 0xe4, 0x77, 0x52, 0x66, 0x9e, 0x5e, 0xce, 0x4a, 0xa9, 0x33, 0x90, 0xce, - 0x08, 0x1e, 0xe3, 0x88, 0x03, 0xfe, 0x69, 0x22, 0xf4, 0x07, 0x72, 0x66, - 0xc7, 0x22, 0x0e, 0x3c, 0x7f, 0x15, 0x1c, 0xfc, 0x48, 0xa9, 0xef, 0xfc, - 0x45, 0x84, 0x9a, 0x2c, 0x8f, 0x08, 0xe3, 0x78, 0xfe, 0x3e, 0xd1, 0x35, - 0x75, 0xa2, 0xfa, 0x2d, 0x7a, 0x62, 0xa2, 0xae, 0xef, 0x9a, 0x02, 0x7f, - 0x90, 0x2d, 0x70, 0xce, 0xdf, 0xbc, 0xae, 0xbe, 0xb6, 0xa6, 0xda, 0x41, - 0xfe, 0x75, 0x7f, 0xf2, 0xd1, 0x44, 0x11, 0x9f, 0x0c, 0x7e, 0xc2, 0xba, - 0x90, 0x09, 0xe7, 0x18, 0x3f, 0xb0, 0x0e, 0xd5, 0xc5, 0x5e, 0x26, 0x0e, - 0x64, 0x9a, 0x29, 0xbd, 0x6e, 0x69, 0x15, 0x1d, 0xc3, 0xc5, 0xe6, 0x49, - 0xbd, 0xfd, 0x66, 0x1a, 0x5f, 0xa4, 0xc1, 0xed, 0x5a, 0x3d, 0xb2, 0x74, - 0x1a, 0xd1, 0xac, 0x83, 0xf1, 0x90, 0x0e, 0x85, 0xcb, 0x47, 0x06, 0x8c, - 0x21, 0xe1, 0xdd, 0x78, 0xc1, 0xe2, 0x3c, 0x9f, 0xe8, 0x29, 0x4c, 0xa6, - 0x8a, 0xa5, 0xd2, 0x70, 0x47, 0xed, 0xf1, 0x53, 0xd6, 0x05, 0x81, 0xe1, - 0xf6, 0x70, 0x7e, 0x83, 0x02, 0xe4, 0x89, 0xe4, 0x34, 0xbd, 0xb2, 0x69, - 0xdf, 0x6d, 0xb7, 0x07, 0x60, 0x34, 0xe0, 0x95, 0x90, 0x78, 0x68, 0xea, - 0xc3, 0x15, 0xa6, 0x42, 0x93, 0xfe, 0x23, 0x2d, 0x3d, 0x28, 0xc1, 0x10, - 0x99, 0x6b, 0x34, 0x3c, 0xcc, 0xb4, 0xb8, 0x65, 0xe7, 0x56, 0xb8, 0xf7, - 0xd3, 0xb3, 0x49, 0x60, 0x43, 0x5d, 0xc8, 0xb9, 0x34, 0x3f, 0xfe, 0x1a, - 0xf3, 0xd6, 0x37, 0x27, 0x05, 0x57, 0x7c, 0x27, 0xaa, 0x6c, 0x45, 0xd2, - 0x36, 0x28, 0xd7, 0x87, 0x8a, 0x26, 0x2e, 0x66, 0x66, 0xf1, 0x71, 0xee, - 0xdf, 0x7a, 0x5b, 0x73, 0x91, 0x5e, 0xce, 0xa9, 0xd2, 0x5e, 0x62, 0x5e, - 0x00, 0x9f, 0xd0, 0x4b, 0x76, 0x12, 0xd9, 0xd5, 0xd5, 0xbd, 0x89, 0xb6, - 0x3c, 0x5f, 0x1c, 0x06, 0x37, 0x60, 0x5c, 0x0a, 0xe5, 0x2e, 0x31, 0xaa, - 0x99, 0xc7, 0xb2, 0xc8, 0xf7, 0xc6, 0x82, 0xee, 0x19, 0xbc, 0xca, 0x4d, - 0x88, 0xd3, 0xa6, 0x44, 0xad, 0x8d, 0xc7, 0xcd, 0x79, 0xa6, 0x15, 0x54, - 0xee, 0x71, 0xad, 0xbf, 0x69, 0x36, 0x24, 0xfa, 0x75, 0xb0, 0x51, 0xca, - 0x70, 0x9a, 0x90, 0xf8, 0xb2, 0x5a, 0xb3, 0xf7, 0xff, 0x1a, 0xac, 0x41, - 0xf9, 0x71, 0x70, 0x3c, 0xdf, 0x6b, 0xbf, 0x08, 0x74, 0x4a, 0x5c, 0xad, - 0x42, 0x7b, 0x30, 0x37, 0x6b, 0x9e, 0x07, 0x8f, 0x41, 0xa4, 0x1c, 0x8e, - 0xe0, 0x6f, 0xd0, 0x31, 0x02, 0x92, 0x7a, 0x79, 0x77, 0xc5, 0x0e, 0x61, - 0x72, 0x4f, 0x21, 0xc5, 0x9c, 0x48, 0xbd, 0x2f, 0xde, 0xf8, 0x7f, 0xba, - 0x9d, 0x1e, 0x15, 0x29, 0xd6, 0xc3, 0x39, 0x1a, 0x0e, 0x10, 0x0f, 0x8d, - 0x11, 0xb4, 0xef, 0x99, 0xfb, 0x95, 0xe6, 0x22, 0x83, 0x4b, 0xbf, 0x99, - 0x99, 0x63, 0x24, 0x75, 0x57, 0xf0, 0x1b, 0x6c, 0x06, 0x5b, 0x04, 0x07, - 0x27, 0x77, 0x95, 0x39, 0x70, 0x7f, 0x56, 0xcb, 0xdd, 0x3b, 0x57, 0xf1, - 0x75, 0x05, 0x2e, 0xf7, 0xea, 0x05, 0xdf, 0x15, 0xb5, 0x5f, 0x82, 0x38, - 0xe9, 0x29, 0xac, 0xc9, 0x69, 0x43, 0x55, 0x69, 0x39, 0xca, 0x6d, 0x6d, - 0xc0, 0xc8, 0xed, 0x28, 0x4f, 0xb8, 0x76, 0xb7, 0x8b, 0x83, 0x0f, 0xa3, - 0x55, 0x8b, 0x17, 0x76, 0x16, 0x02, 0x17, 0x54, 0x28, 0x9a, 0x6f, 0x1a, - 0x78, 0xa1, 0xfc, 0x14, 0x8f, 0xcd, 0x76, 0xd9, 0xc6, 0x60, 0x67, 0x0a, - 0x72, 0xa6, 0xcc, 0x60, 0xe2, 0x6a, 0xbd, 0x17, 0xae, 0xa3, 0xe6, 0x75, - 0x17, 0xf7, 0xd6, 0x33, 0xc8, 0x0f, 0xc3, 0xd2, 0x4c, 0xaa, 0xbe, 0x45, - 0x4b, 0x3b, 0xcd, 0x32, 0x5e, 0x9b, 0xd7, 0x38, 0x54, 0x82, 0xa8, 0x74, - 0x77, 0xb1, 0x59, 0xf3, 0xba, 0xce, 0xb1, 0x6c, 0x2f, 0x4a, 0xf5, 0xf6, - 0x35, 0x40, 0x13, 0xdd, 0xf2, 0xf7, 0xfe, 0x4c, 0xc5, 0x00, 0xa2, 0x34, - 0x97, 0x20, 0x3d, 0x6d, 0xb7, 0x4d, 0xe4, 0x6e, 0xe1, 0x16, 0x96, 0xeb, - 0xbb, 0x48, 0x5b, 0x53, 0xf2, 0xbc, 0x5e, 0x2a, 0x18, 0x3c, 0x0e, 0xdd, - 0xb9, 0xf5, 0x19, 0x84, 0xd5, 0x3b, 0x15, 0x35, 0x72, 0x92, 0xdf, 0x73, - 0x10, 0xdb, 0x8a, 0x43, 0xf9, 0x69, 0x16, 0xc2, 0x3e, 0x47, 0xc5, 0x5b, - 0xe7, 0x5d, 0x1f, 0xfa, 0x71, 0x13, 0x46, 0x22, 0x7e, 0x5b, 0x0f, 0x2b, - 0xc6, 0xad, 0x73, 0x7b, 0x5e, 0xd2, 0x12, 0x02, 0x42, 0x24, 0x9c, 0x40, - 0x41, 0x32, 0x59, 0xa9, 0x33, 0xb9, 0x5b, 0x0f, 0xf8, 0x7f, 0xa1, 0xe6, - 0xb7, 0x08, 0xdf, 0xd1, 0xa9, 0x24, 0x7b, 0x09, 0xa8, 0xcf, 0xb3, 0xa1, - 0x44, 0x6a, 0x6b, 0x22, 0xd3, 0x49, 0x6f, 0x02, 0x26, 0x24, 0xdf, 0xf2, - 0xfd, 0xae, 0x77, 0xeb, 0x0c, 0x29, 0x5a, 0x1e, 0x17, 0x54, 0x8b, 0x7b, - 0xaa, 0x89, 0x56, 0x1f, 0x54, 0xea, 0x96, 0x3b, 0x9c, 0x4d, 0xa2, 0x88, - 0x6c, 0xe5, 0xc6, 0xca, 0xf5, 0x95, 0x79, 0x2e, 0xe5, 0x79, 0x2e, 0x64, - 0xeb, 0xa5, 0xac, 0x52, 0x43, 0x48, 0xfc, 0xd6, 0x9d, 0x1a, 0xb0, 0xb5, - 0x04, 0xde, 0xc3, 0x92, 0xca, 0xe9, 0xd0, 0x0b, 0xbd, 0x97, 0x7c, 0xbf, - 0x02, 0x89, 0xb1, 0xb9, 0x92, 0x66, 0x50, 0x92, 0x39, 0x3c, 0xd9, 0x74, - 0x19, 0xc6, 0xb3, 0x5d, 0x97, 0x23, 0x58, 0x50, 0x37, 0x5b, 0xd4, 0xdd, - 0xb5, 0xaf, 0x48, 0xf0, 0xbd, 0x49, 0xef, 0x80, 0xd6, 0x48, 0x1f, 0x59, - 0xf3, 0x15, 0x5c, 0xd3, 0x1e, 0xa7, 0x4a, 0xe6, 0x14, 0xec, 0xb5, 0x71, - 0x64, 0x8b, 0x74, 0x7d, 0x29, 0x0e, 0xf6, 0xa9, 0xfc, 0xf6, 0xa5, 0xdc, - 0x11, 0x66, 0xf1, 0xb8, 0x3a, 0x49, 0x0c, 0x33, 0x93, 0xb3, 0x3b, 0x3d, - 0x18, 0x55, 0x93, 0xe4, 0xb0, 0x6d, 0x56, 0xf9, 0x50, 0x0e, 0xf9, 0xf1, - 0x38, 0xf9, 0x63, 0x02, 0x1c, 0x2e, 0xfa, 0xe6, 0x1a, 0xae, 0x9e, 0x39, - 0xf8, 0x32, 0x2b, 0x43, 0xe8, 0xa6, 0xfe, 0xb5, 0x19, 0xea, 0xca, 0x56, - 0x6f, 0x9e, 0x79, 0x03, 0x90, 0x58, 0x80, 0xf6, 0xaf, 0xe9, 0xa8, 0xe6, - 0xaa, 0xd8, 0xb4, 0x44, 0xa8, 0x63, 0xe6, 0xe5, 0x73, 0xf0, 0xc1, 0xba, - 0x86, 0x0c, 0x43, 0xd0, 0x70, 0x1f, 0x29, 0xcc, 0x5d, 0xd9, 0x2c, 0xff, - 0xa2, 0x02, 0x2b, 0x2e, 0x13, 0x06, 0xfa, 0xa9, 0xd4, 0x41, 0xb2, 0x54, - 0x8e, 0x33, 0x77, 0x8a, 0x09, 0x14, 0xc1, 0xfc, 0xcd, 0xa4, 0xf3, 0xa9, - 0xb7, 0x2f, 0x37, 0x11, 0xa7, 0x85, 0xbd, 0x90, 0x7f, 0xfe, 0xa0, 0xdd, - 0xd4, 0x91, 0x14, 0xaa, 0x33, 0x47, 0xd8, 0x11, 0x7b, 0xdd, 0xa9, 0x29, - 0xb2, 0x43, 0x56, 0xff, 0xb7, 0xfd, 0x37, 0x2c, 0x34, 0x52, 0xa5, 0x87, - 0xa1, 0x9f, 0xae, 0x9f, 0xda, 0x4f, 0x8f, 0x4b, 0x88, 0x00, 0xaa, 0x7b, - 0x65, 0xac, 0x2d, 0x68, 0xd6, 0x21, 0xe6, 0x7f, 0xc2, 0x47, 0x88, 0x1c, - 0x6c, 0x37, 0x2a, 0x07, 0x2e, 0x08, 0xdd, 0x11, 0xcd, 0xf9, 0xe3, 0xa5, - 0xa4, 0x98, 0xed, 0xf0, 0x12, 0x5c, 0x93, 0xb0, 0x13, 0x56, 0x77, 0x15, - 0x06, 0xd5, 0x47, 0xa1, 0xab, 0xce, 0xb5, 0xd2, 0x10, 0xe2, 0x53, 0xdd, - 0x16, 0x21, 0x2c, 0x7a, 0x5c, 0x15, 0x3a, 0x89, 0x49, 0xc2, 0x45, 0xa5, - 0x09, 0x3f, 0x11, 0x49, 0x99, 0xaa, 0x4a, 0x86, 0x8f, 0x9a, 0x24, 0x5e, - 0x5c, 0x60, 0x7f, 0x9b, 0x8b, 0x10, 0xa3, 0x60, 0x10, 0x9b, 0x17, 0xe2, - 0xbd, 0x51, 0x1c, 0x79, 0xf6, 0x44, 0xde, 0xa9, 0x7b, 0x3d, 0x7b, 0xd5, - 0xb9, 0x74, 0x1a, 0x13, 0x2c, 0xd5, 0x5b, 0xc4, 0x77, 0x2f, 0x76, 0x20, - 0xc0, 0x7b, 0x64, 0xd2, 0xe6, 0x15, 0xef, 0x4b, 0x04, 0xc7, 0x25, 0x69, - 0xbf, 0xd6, 0x15, 0xfd, 0x68, 0xdc, 0x33, 0xba, 0xab, 0xc2, 0xcc, 0x02, - 0x5b, 0x00, 0xf2, 0x63, 0x0c, 0x17, 0xa7, 0xab, 0xaf, 0xf6, 0x8b, 0xd8, - 0xe7, 0xb4, 0x01, 0xfb, 0x8b, 0x36, 0x77, 0x66, 0x62, 0x6b, 0x9b, 0x6e, - 0x02, 0xdd, 0xa7, 0x11, 0x42, 0xad, 0x27, 0xcc, 0x73, 0x5f, 0xee, 0x0f, - 0x89, 0x76, 0xef, 0xf8, 0x6d, 0xee, 0x77, 0xfe, 0xcb, 0xed, 0xfb, 0x51, - 0x69, 0xbd, 0xd6, 0x85, 0xea, 0xad, 0xd7, 0x63, 0x2e, 0xa7, 0xb7, 0x7c, - 0x73, 0x24, 0xf7, 0xcc, 0x98, 0x68, 0x3b, 0x92, 0x00, 0xbb, 0xb3, 0xce, - 0xee, 0xb8, 0xab, 0xbc, 0x29, 0xdf, 0x10, 0x87, 0xa2, 0x1d, 0x02, 0x7b, - 0xad, 0xd7, 0x47, 0x03, 0x41, 0x12, 0x6d, 0xd5, 0x4d, 0x87, 0x46, 0xc4, - 0x08, 0x00, 0x6d, 0xac, 0x6b, 0x2e, 0xee, 0x02, 0x06, 0xbb, 0x8e, 0xf0, - 0x0c, 0x7f, 0x7f, 0x92, 0x1a, 0x9f, 0xde, 0x3d, 0xfb, 0xac, 0x48, 0x57, - 0x75, 0xa1, 0xe1, 0xe5, 0xb4, 0xe8, 0x4a, 0xcd, 0x55, 0xcb, 0x2e, 0x10, - 0x5e, 0xab, 0xc3, 0x41, 0x14, 0xb5, 0xba, 0xe8, 0xbe, 0x4f, 0xad, 0xf8, - 0x98, 0x14, 0x20, 0xb0, 0x0a, 0x45, 0xfc, 0xe7, 0x35, 0xfb, 0xf4, 0x57, - 0x16, 0xa0, 0xf5, 0xaf, 0x99, 0xab, 0xe1, 0x2a, 0x74, 0xf8, 0x6c, 0x29, - 0x9f, 0xac, 0xa4, 0x0f, 0x9c, 0x44, 0x1a, 0xdb, 0xae, 0xe9, 0xf5, 0x33, - 0x06, 0x37, 0xe6, 0x15, 0x59, 0x1d, 0xc4, 0x1c, 0x15, 0xe9, 0xb7, 0x1d, - 0xe6, 0x0c, 0x35, 0xa4, 0x5e, 0x22, 0x59, 0x6a, 0x97, 0xb8, 0xf2, 0x3a, - 0xb0, 0xec, 0x73, 0xa4, 0x8e, 0xe7, 0x66, 0x67, 0x9c, 0x2c, 0x17, 0x6a, - 0x82, 0xce, 0x91, 0x74, 0xca, 0x8c, 0xf5, 0xa7, 0xbc, 0x0e, 0xa5, 0x78, - 0x39, 0xde, 0xf6, 0x61, 0x3e, 0x9f, 0x1d, 0xe0, 0x63, 0x7e, 0x3f, 0x4e, - 0xe9, 0xdb, 0x79, 0xa4, 0x7a, 0x56, 0x76, 0x2b, 0xaa, 0x37, 0xe6, 0xd8, - 0x32, 0xbd, 0x6e, 0xca, 0x50, 0x6d, 0x02, 0x89, 0x5f, 0xb4, 0x0d, 0x51, - 0xa0, 0x66, 0x6e, 0xe9, 0xdc, 0x23, 0x98, 0xe5, 0x58, 0xa7, 0xd7, 0xd7, - 0x43, 0x37, 0x98, 0x4a, 0x70, 0x6c, 0x90, 0x3f, 0xa7, 0xa4, 0x04, 0x1e, - 0x9d, 0x50, 0x9f, 0x39, 0xe5, 0xa0, 0xd5, 0x9a, 0x79, 0x6b, 0x80, 0xf2, - 0xa0, 0xf9, 0xdd, 0xea, 0xb4, 0x79, 0xa0, 0x4b, 0xe4, 0xf7, 0x9b, 0xaf, - 0x0a, 0x0d, 0x32, 0x55, 0x55, 0x7c, 0xb5, 0x97, 0xbb, 0x51, 0x9b, 0xeb, - 0xb9, 0x31, 0x7d, 0x66, 0xde, 0x26, 0x27, 0x88, 0x22, 0xf7, 0x80, 0x74, - 0xa5, 0x1e, 0x5e, 0x8b, 0xa7, 0xa1, 0x9a, 0xbe, 0x82, 0x37, 0x7c, 0x62, - 0xc6, 0xdb, 0xe5, 0x9f, 0xc2, 0x10, 0xf8, 0x8e, 0xb2, 0xd0, 0xdc, 0x56, - 0xd6, 0x32, 0xff, 0x5e, 0xc0, 0x3c, 0x0d, 0x95, 0x3f, 0x8e, 0x90, 0x30, - 0xcd, 0x72, 0x86, 0x9b, 0x3f, 0x38, 0x6f, 0x8f, 0x41, 0xfd, 0x07, 0x2c, - 0x09, 0xfb, 0x79, 0x1c, 0xd2, 0x53, 0x42, 0x4d, 0x91, 0x46, 0xcb, 0x73, - 0xac, 0xf6, 0x6a, 0xac, 0xf8, 0x24, 0x36, 0x94, 0x49, 0x10, 0x9f, 0xd8, - 0x50, 0xf6, 0x1e, 0xb9, 0xd0, 0x2c, 0x56, 0x1a, 0xa0, 0x30, 0x55, 0xb6, - 0xfd, 0x76, 0x2c, 0x54, 0x6a, 0xb5, 0x3a, 0x9a, 0x91, 0x7b, 0xcc, 0xde, - 0x8b, 0x2a, 0x62, 0x1d, 0xf0, 0x5a, 0x16, 0x5e, 0xe6, 0x34, 0x6f, 0x98, - 0xbc, 0x0f, 0xdd, 0xa0, 0xd6, 0xa6, 0x69, 0xf9, 0x00, 0x9b, 0x44, 0x8a, - 0x2f, 0xcb, 0xa0, 0xc6, 0xf5, 0x84, 0x9d, 0xcc, 0xc5, 0xe1, 0x77, 0xc2, - 0x90, 0xbc, 0xe2, 0x64, 0x87, 0x48, 0x44, 0xe1, 0x85, 0x7c, 0x49, 0xfd, - 0xbc, 0x59, 0xa3, 0x88, 0x63, 0x53, 0xaa, 0x65, 0xb8, 0x84, 0xf9, 0xab, - 0x98, 0x66, 0x2e, 0x15, 0xbe, 0xed, 0x8c, 0xf5, 0x88, 0x99, 0xd4, 0xa1, - 0xea, 0x1f, 0x87, 0xa9, 0x50, 0x91, 0x40, 0x67, 0x47, 0xeb, 0x87, 0x9f, - 0xb0, 0x8e, 0xe8, 0x68, 0x48, 0x75, 0xe5, 0x61, 0xd6, 0x15, 0x64, 0x6b, - 0x8b, 0x21, 0x20, 0x53, 0x87, 0x3c, 0x8f, 0x10, 0x55, 0x39, 0xa0, 0xac, - 0xc0, 0xff, 0x4b, 0xce, 0x5a, 0xaf, 0xa9, 0xb5, 0x0a, 0xc7, 0x9e, 0x67, - 0xe3, 0x49, 0x12, 0x97, 0x8e, 0x9d, 0x27, 0xbc, 0x95, 0x88, 0x50, 0x20, - 0x42, 0x4b, 0x81, 0xf4, 0xa5, 0xfb, 0x4a, 0x58, 0x59, 0x57, 0x1e, 0x98, - 0x62, 0xbe, 0xef, 0xa2, 0xc5, 0x6b, 0xd1, 0xb1, 0xcf, 0x2b, 0xc4, 0xe8, - 0x65, 0xb9, 0xa7, 0xc0, 0xe2, 0xa5, 0x96, 0x92, 0x81, 0x30, 0x2c, 0x32, - 0x32, 0xf9, 0x82, 0xe4, 0x81, 0x9d, 0x45, 0x5a, 0x38, 0x27, 0x1a, 0xb5, - 0x49, 0xc0, 0x67, 0x6d, 0xd8, 0x3e, 0x21, 0x9c, 0xd3, 0xd1, 0x68, 0x5b, - 0x1c, 0xe7, 0x8f, 0x90, 0xf9, 0x70, 0x82, 0x4e, 0x8e, 0xf1, 0x5e, 0x92, - 0x86, 0xcc, 0x0f, 0xe4, 0x0f, 0x10, 0xfd, 0x2e, 0x1b, 0x4a, 0x87, 0x84, - 0xf0, 0x46, 0x8b, 0x90, 0xb5, 0x60, 0x76, 0x5d, 0x00, 0x61, 0x0b, 0xe9, - 0x2f, 0xf1, 0x81, 0xe8, 0x66, 0x69, 0x8e, 0xc3, 0xbc, 0xda, 0x0a, 0x44, - 0x67, 0x6d, 0x4f, 0x96, 0x3a, 0x7d, 0x41, 0x38, 0xe8, 0xa2, 0xb4, 0x41, - 0x3b, 0xd7, 0xf6, 0xde, 0x02, 0x89, 0x32, 0x13, 0x0b, 0x48, 0xb4, 0x27, - 0x13, 0xca, 0x53, 0x1f, 0xbd, 0x3f, 0xb2, 0x2a, 0x4e, 0xa5, 0xb6, 0x9e, - 0xfc, 0x17, 0x20, 0xdf, 0xdb, 0xdf, 0xd3, 0x9c, 0x25, 0xc5, 0x55, 0x2b, - 0xb7, 0xdd, 0xab, 0x1a, 0x35, 0x93, 0xfe, 0x30, 0xdf, 0xc0, 0x23, 0xed, - 0x0e, 0x5e, 0x63, 0xec, 0x57, 0xaa, 0x4d, 0xe2, 0x98, 0x09, 0xc0, 0xc4, - 0x41, 0x5e, 0x61, 0x87, 0xe8, 0xa7, 0x9d, 0x30, 0xe2, 0x43, 0x3a, 0xc1, - 0x6d, 0x22, 0xe6, 0x1a, 0x0b, 0x11, 0x33, 0x31, 0xee, 0x7c, 0x55, 0xc4, - 0x29, 0x44, 0x46, 0xd1, 0x86, 0x92, 0x79, 0x27, 0xd5, 0x0f, 0x06, 0xfc, - 0xf0, 0x72, 0x22, 0x65, 0x08, 0xe9, 0x7b, 0x40, 0x33, 0x7e, 0x58, 0x9e, - 0x5c, 0xd4, 0xc4, 0xac, 0x74, 0x60, 0x8b, 0x34, 0xea, 0xc7, 0xcb, 0xa2, - 0x16, 0x18, 0xc1, 0x7c, 0xa6, 0x84, 0x40, 0xfe, 0x9c, 0x64, 0x4d, 0x31, - 0xd0, 0x01, 0xc4, 0xe6, 0x90, 0xaa, 0x72, 0x3b, 0x1d, 0x75, 0x41, 0xa7, - 0xae, 0x21, 0x05, 0xaf, 0x5e, 0x2b, 0xd6, 0x8a, 0x4b, 0xee, 0xe4, 0x3c, - 0x36, 0xf1, 0x6f, 0x8f, 0x39, 0x31, 0x33, 0xae, 0x9a, 0x97, 0x82, 0xcf, - 0x35, 0x39, 0x6e, 0x2b, 0xb7, 0x66, 0x67, 0x9c, 0x2d, 0x9f, 0x87, 0x10, - 0xdb, 0xc0, 0x89, 0xca, 0x49, 0xe5, 0xc4, 0xb0, 0xd8, 0x55, 0x2a, 0x70, - 0x82, 0xa0, 0x6e, 0x3a, 0xbb, 0xd9, 0x9d, 0xc4, 0x70, 0x95, 0xde, 0x52, - 0x13, 0xb5, 0x5e, 0x23, 0x2d, 0xfe, 0x28, 0x28, 0xcc, 0x74, 0x5e, 0x65, - 0xa5, 0xad, 0x53, 0x10, 0xf1, 0xe8, 0x46, 0xbb, 0x41, 0x4b, 0x24, 0xfb, - 0x17, 0x52, 0x26, 0x67, 0xea, 0xf7, 0xa5, 0x31, 0xf4, 0x5a, 0xe6, 0x44, - 0x50, 0xbb, 0xb1, 0xe5, 0xbd, 0xd6, 0x79, 0x05, 0x2d, 0xa5, 0x46, 0x65, - 0x59, 0x93, 0xc5, 0x98, 0x63, 0xe8, 0x4d, 0x58, 0xb2, 0x52, 0xee, 0x23, - 0xeb, 0x9b, 0x26, 0x63, 0xb3, 0x8d, 0x8c, 0x74, 0x42, 0x8f, 0x00, 0x2e, - 0xb7, 0x42, 0x51, 0x2d, 0xf2, 0xdd, 0x26, 0xe4, 0xd9, 0x3a, 0x97, 0x26, - 0x34, 0xa0, 0x86, 0x35, 0x5c, 0x77, 0x36, 0x8a, 0xc6, 0x83, 0x2a, 0xb4, - 0xb4, 0x26, 0x26, 0x29, 0xd1, 0x34, 0xd6, 0xc4, 0xee, 0x2e, 0x07, 0x50, - 0x55, 0x03, 0x06, 0xc9, 0x6b, 0x70, 0x1a, 0xc6, 0x86, 0x1a, 0xb0, 0x48, - 0x41, 0x4f, 0xf1, 0x58, 0xf4, 0xce, 0xc5, 0x1b, 0x04, 0x29, 0x8b, 0xe5, - 0x4e, 0xf1, 0x85, 0x1a, 0xff, 0xc5, 0xde, 0xd3, 0xa2, 0x66, 0x21, 0x76, - 0xdf, 0xbb, 0x51, 0x7c, 0x48, 0x66, 0x24, 0x3d, 0x61, 0x0c, 0x72, 0x21, - 0x2a, 0xe4, 0xc0, 0x3c, 0xc1, 0xbb, 0xd6, 0x4b, 0xef, 0x06, 0x21, 0x8f, - 0x65, 0x76, 0x9a, 0x6f, 0xd7, 0x76, 0x4c, 0xe7, 0x63, 0x72, 0x16, 0x29, - 0x74, 0x14, 0x1f, 0xc7, 0x3a, 0x06, 0xe7, 0xdb, 0xd4, 0xba, 0x53, 0xe6, - 0x2c, 0x9c, 0x4e, 0x3b, 0xe0, 0x7e, 0x7a, 0x64, 0x2b, 0x6e, 0xfd, 0x1a, - 0x98, 0x6e, 0x2c, 0xdd, 0xe1, 0x71, 0x0a, 0xa6, 0xa4, 0xbc, 0x7e, 0x40, - 0x43, 0xd4, 0xd8, 0xa7, 0x3a, 0x30, 0x85, 0xb0, 0x61, 0xbc, 0xdb, 0x28, - 0xb7, 0x8b, 0xcc, 0x07, 0xe1, 0x8a, 0xfb, 0x1d, 0x44, 0xcf, 0xd0, 0x40, - 0x18, 0x8b, 0xb0, 0xea, 0xf2, 0x79, 0x31, 0x3e, 0xf5, 0x7b, 0x9c, 0xac, - 0xb1, 0x49, 0x35, 0x09, 0x90, 0xde, 0x71, 0x04, 0x73, 0xa6, 0x68, 0x00, - 0x21, 0x85, 0x4f, 0xa4, 0x33, 0x45, 0x06, 0x23, 0x39, 0xf4, 0xd2, 0x53, - 0x81, 0x5c, 0x86, 0x10, 0x98, 0x32, 0x13, 0xc4, 0xae, 0x1a, 0xf4, 0x4d, - 0x94, 0x13, 0xad, 0x2d, 0x8a, 0x5b, 0x5f, 0xb4, 0xf6, 0xc3, 0x49, 0x74, - 0xd9, 0x0e, 0x11, 0xf5, 0x06, 0x1a, 0x39, 0xda, 0xbd, 0x06, 0x24, 0x78, - 0x7c, 0x82, 0xb3, 0xae, 0x69, 0x27, 0xf2, 0x99, 0xc8, 0xca, 0x3a, 0xf2, - 0x44, 0x44, 0xa8, 0xfd, 0x06, 0x24, 0x46, 0xcb, 0xe7, 0x8c, 0x90, 0x01, - 0x8a, 0x82, 0xf4, 0xdf, 0x77, 0x49, 0x68, 0x00, 0x57, 0x4c, 0xf2, 0xc1, - 0xd1, 0xfc, 0xff, 0xf3, 0xcd, 0xb5, 0xe6, 0xb8, 0xf5, 0x7b, 0x74, 0x3e, - 0x73, 0xdb, 0x86, 0x52, 0x3b, 0x32, 0x3a, 0x5d, 0x03, 0xb9, 0xbf, 0x2e, - 0x4c, 0x64, 0x6d, 0xe7, 0xf1, 0x55, 0xf6, 0x92, 0xf1, 0xd9, 0xbd, 0x5e, - 0x57, 0x66, 0x50, 0x35, 0x9c, 0x2b, 0x90, 0xdf, 0xed, 0xfa, 0x1f, 0xf0, - 0x06, 0x77, 0xa8, 0x64, 0x56, 0xc0, 0xce, 0xa9, 0xd0, 0xc7, 0xed, 0xcc, - 0x8a, 0xba, 0xfa, 0x3a, 0x93, 0x83, 0x8d, 0x6c, 0x8c, 0x9d, 0x70, 0x7f, - 0x88, 0x29, 0x29, 0x90, 0xa7, 0xf6, 0xef, 0x89, 0x29, 0x84, 0x2e, 0x62, - 0xa5, 0x4a, 0x2f, 0xd7, 0x00, 0xaf, 0xc8, 0x7f, 0x25, 0xa6, 0xdd, 0x44, - 0x21, 0x93, 0x83, 0x68, 0x49, 0xc0, 0x75, 0xed, 0x1f, 0x16, 0x62, 0xad, - 0xb8, 0x2a, 0xe9, 0x1f, 0x73, 0xc2, 0x42, 0xd1, 0x57, 0x3b, 0xfa, 0xb8, - 0x74, 0xff, 0xe2, 0x98, 0x9e, 0x98, 0x7f, 0x02, 0xd2, 0xf2, 0xf8, 0x21, - 0x0b, 0x6a, 0xaf, 0x00, 0xe0, 0x5b, 0xd7, 0x35, 0x24, 0xb5, 0x7e, 0x74, - 0x1e, 0x0c, 0x41, 0x17, 0xa3, 0xbf, 0x43, 0xcd, 0xae, 0x7e, 0x0e, 0x72, - 0xff, 0xab, 0x58, 0x50, 0x24, 0xcf, 0xb4, 0x80, 0xa5, 0x5f, 0xcb, 0x36, - 0x48, 0xb1, 0xfd, 0xe2, 0xd6, 0x8f, 0x38, 0x33, 0x4f, 0x4e, 0xe4, 0xcb, - 0x10, 0xcd, 0xb3, 0x31, 0x69, 0x4a, 0xbb, 0x2a, 0xc2, 0x53, 0x7b, 0xa0, - 0xc8, 0x1d, 0xe3, 0x15, 0xd9, 0xa8, 0xc3, 0x5a, 0x6c, 0x39, 0x31, 0xcb, - 0x21, 0x83, 0x01, 0x20, 0xf6, 0xdf, 0x6b, 0x14, 0x02, 0xd6, 0xce, 0x16, - 0x3f, 0x31, 0x1b, 0x61, 0xd5, 0x85, 0xee, 0x54, 0x69, 0x4c, 0x01, 0xc7, - 0x89, 0x2e, 0x43, 0xfb, 0x69, 0x3f, 0xa0, 0xe1, 0xbe, 0xc0, 0x32, 0xbf, - 0xc2, 0xb5, 0x3d, 0xb0, 0x1d, 0x2d, 0xef, 0x66, 0xa0, 0x62, 0xc0, 0xca, - 0xb3, 0x59, 0x68, 0x44, 0x16, 0xa7, 0xe6, 0xd5, 0xd6, 0xe8, 0x86, 0x1b, - 0x38, 0xf7, 0xbc, 0x21, 0xaf, 0xc0, 0x85, 0x11, 0x48, 0xe3, 0x17, 0x1b, - 0xd2, 0x0f, 0x03, 0x68, 0xd7, 0x77, 0xb9, 0xcf, 0x62, 0xe4, 0x5a, 0x1e, - 0xa2, 0xf8, 0x58, 0x56, 0x6c, 0xc7, 0xfa, 0xd0, 0x13, 0xb8, 0x02, 0x04, - 0x01, 0x6f, 0xcc, 0x19, 0xd6, 0x22, 0xf4, 0xea, 0x1b, 0xf6, 0xab, 0x51, - 0x8a, 0x89, 0x02, 0xc2, 0xe2, 0x18, 0x16, 0xb0, 0x4b, 0x12, 0x60, 0x9d, - 0x5b, 0xfe, 0x7b, 0xa4, 0xde, 0xaf, 0x87, 0xc5, 0xd8, 0xf9, 0x73, 0x2d, - 0x3a, 0xfc, 0x17, 0x75, 0xb4, 0xc9, 0x0e, 0x86, 0xfa, 0xaa, 0xa0, 0x31, - 0xd5, 0xd4, 0x9b, 0xaa, 0x43, 0xab, 0xad, 0x75, 0x51, 0xb2, 0x16, 0x3a, - 0x56, 0x3e, 0x24, 0x46, 0xcc, 0x50, 0xf4, 0xe6, 0xc5, 0x9c, 0x39, 0xaf, - 0x84, 0x88, 0x7e, 0xe8, 0xc9, 0x5b, 0x8c, 0x9b, 0x99, 0x9b, 0xdc, 0x41, - 0x16, 0x3a, 0xb9, 0x88, 0x44, 0x73, 0xd4, 0x8e, 0x68, 0x99, 0x15, 0xbd, - 0x8b, 0x4d, 0xf9, 0x64, 0x8d, 0xd3, 0xc2, 0x9e, 0xed, 0x7d, 0xd8, 0x82, - 0xd1, 0xf2, 0x7c, 0xcc, 0xdd, 0x6e, 0x2e, 0x78, 0xc1, 0x6d, 0xa1, 0x3d, - 0xd6, 0x84, 0x4f, 0x96, 0x21, 0x51, 0xa9, 0x98, 0x3d, 0x0b, 0x71, 0x55, - 0x6f, 0xa4, 0xf7, 0x44, 0x9c, 0xff, 0xaf, 0x80, 0x3c, 0x3f, 0x7e, 0xac, - 0xa7, 0xd7, 0x43, 0xb7, 0xbf, 0x34, 0x3a, 0x44, 0x02, 0x4c, 0x5c, 0x4d, - 0x7b, 0xa4, 0xe1, 0x9b, 0xbe, 0x0f, 0x79, 0x8b, 0x33, 0x3c, 0xe0, 0x20, - 0x7f, 0xf0, 0x30, 0x82, 0x86, 0xd4, 0x69, 0xe3, 0x43, 0x18, 0xe4, 0xb2, - 0x56, 0x33, 0x22, 0x6f, 0x34, 0xcf, 0x6d, 0xb3, 0xfe, 0x09, 0x89, 0x1d, - 0x0b, 0x9e, 0xdc, 0x04, 0x90, 0x7d, 0x07, 0x5f, 0x26, 0xdf, 0xfd, 0x00, - 0xb4, 0xe8, 0x29, 0xab, 0x03, 0xa3, 0x30, 0x5a, 0x53, 0xce, 0x3e, 0xe4, - 0xe1, 0x6b, 0x94, 0x4a, 0xb7, 0xc6, 0x7c, 0x56, 0x1f, 0xc8, 0xd2, 0xac, - 0x15, 0xe5, 0x1d, 0x75, 0x42, 0x95, 0xd4, 0xff, 0x41, 0x17, 0xf0, 0x5c, - 0xf1, 0x43, 0x87, 0x00, 0xe9, 0x34, 0x3f, 0x2e, 0x0e, 0xdb, 0x93, 0x53, - 0xf8, 0x4f, 0x61, 0x20, 0x66, 0x23, 0x1c, 0x22, 0x16, 0x45, 0xaf, 0xd1, - 0xe1, 0x22, 0xcb, 0x57, 0xc1, 0x9e, 0x70, 0x5f, 0xa8, 0xe0, 0x94, 0xb0, - 0xa8, 0xc0, 0x57, 0xf1, 0x62, 0x27, 0xb5, 0xbe, 0x9d, 0xfd, 0x46, 0x69, - 0x84, 0x10, 0xff, 0x66, 0xb5, 0xc8, 0x66, 0x09, 0x91, 0x48, 0x8f, 0x81, - 0xf8, 0xb3, 0x9f, 0xfa, 0x8a, 0x39, 0x30, 0x45, 0xd2, 0x3c, 0xd8, 0x41, - 0xf3, 0x66, 0x5b, 0xf2, 0xb7, 0x44, 0x20, 0xd4, 0xc8, 0xc0, 0x6b, 0xd9, - 0x05, 0x6e, 0x94, 0xd0, 0xcd, 0x86, 0x08, 0x54, 0xf9, 0xbd, 0xc8, 0x18, - 0xca, 0x6c, 0xaf, 0xc2, 0xe3, 0x53, 0x68, 0x45, 0xd1, 0x7c, 0xbd, 0xe6, - 0xb7, 0x26, 0x47, 0x88, 0xd6, 0xd7, 0x03, 0xdd, 0x61, 0x12, 0xd2, 0xe1, - 0xe6, 0xd1, 0xf4, 0x1d, 0x10, 0x43, 0xf2, 0x2d, 0xe6, 0xa1, 0x8c, 0xa0, - 0x8b, 0x7e, 0xb0, 0x7e, 0x63, 0xc0, 0x60, 0xe6, 0xda, 0x6a, 0x5f, 0x3a, - 0x80, 0x8a, 0xf3, 0x1f, 0x23, 0x4c, 0xeb, 0xb9, 0x14, 0x28, 0x9d, 0x95, - 0xb7, 0xab, 0x40, 0x8e, 0xf0, 0x0d, 0xfc, 0xfe, 0x2e, 0xce, 0x9d, 0x7a, - 0x60, 0xcf, 0x2d, 0x9f, 0xd8, 0x5a, 0x45, 0x71, 0x28, 0x4f, 0xc8, 0x90, - 0x47, 0xaf, 0xc1, 0x00, 0x8b, 0x9b, 0xcf, 0x8a, 0x8e, 0x55, 0xb0, 0xd8, - 0x94, 0x6e, 0x63, 0x32, 0xe7, 0x84, 0x55, 0x3e, 0xa7, 0x7c, 0xf7, 0x00, - 0x1a, 0x33, 0x1f, 0x03, 0xf2, 0xb5, 0xe0, 0xba, 0x7d, 0x59, 0xe6, 0x54, - 0x61, 0x60, 0x01, 0xf6, 0x2e, 0x9c, 0x1d, 0x4c, 0xae, 0xa9, 0x8f, 0x1a, - 0x6b, 0xf1, 0x6b, 0x37, 0x3d, 0x60, 0xce, 0x6f, 0x14, 0x85, 0x93, 0xc9, - 0x93, 0x7b, 0x0b, 0xbe, 0x5b, 0xac, 0x9d, 0x1e, 0x9d, 0x55, 0x05, 0x01, - 0xc6, 0xbe, 0x76, 0x9c, 0xec, 0x9d, 0xc2, 0xff, 0x6b, 0x17, 0xbe, 0x20, - 0x26, 0xac, 0x2f, 0x27, 0xcc, 0x73, 0xb4, 0xf0, 0xe4, 0xff, 0x18, 0x37, - 0x3f, 0x5f, 0x04, 0xdb, 0x23, 0xaa, 0x84, 0xdd, 0x84, 0xda, 0x87, 0xbd, - 0xb7, 0x6b, 0x82, 0xb0, 0x4c, 0xbe, 0xb7, 0xfe, 0x0c, 0xeb, 0xf9, 0x9a, - 0x55, 0x73, 0xc6, 0x27, 0x48, 0xb1, 0xb8, 0x1e, 0xf8, 0x5e, 0xa0, 0x40, - 0x9c, 0x2f, 0xfe, 0xc6, 0x8e, 0x98, 0x3d, 0xf9, 0xc4, 0x6b, 0x71, 0x37, - 0x7b, 0xc9, 0xb3, 0xc0, 0x9f, 0x42, 0xc5, 0x45, 0xb0, 0x51, 0x47, 0x02, - 0x86, 0xdf, 0xcc, 0x48, 0x80, 0xe9, 0xf3, 0xa9, 0xa5, 0xdf, 0x7a, 0x99, - 0xf8, 0x59, 0xa6, 0x5d, 0x4c, 0x84, 0x42, 0x36, 0x69, 0x5e, 0x65, 0x4b, - 0xfb, 0xaf, 0x21, 0xc2, 0x55, 0x83, 0x8a, 0x4e, 0x4e, 0x34, 0x43, 0xc0, - 0xc1, 0xa8, 0x47, 0xa9, 0x56, 0x3f, 0xfc, 0xa1, 0x91, 0x39, 0xc5, 0xbc, - 0x7e, 0xd0, 0xca, 0x49, 0xfe, 0x17, 0xc3, 0x20, 0x50, 0x41, 0x2f, 0x74, - 0xb1, 0x2e, 0x01, 0x13, 0xd9, 0x14, 0x92, 0x76, 0xb6, 0xb6, 0x8f, 0xbc, - 0x04, 0x7d, 0x0c, 0x15, 0x2f, 0x4e, 0x87, 0x03, 0x5b, 0x90, 0xa1, 0xe0, - 0x41, 0x60, 0x11, 0x6c, 0xa5, 0x76, 0x60, 0x5f, 0x85, 0xb2, 0xfa, 0xd0, - 0x91, 0x2f, 0xd7, 0x06, 0x24, 0xb3, 0x19, 0xbc, 0x89, 0x7e, 0x27, 0xd0, - 0xe5, 0xae, 0xfe, 0xff, 0xe7, 0x44, 0x88, 0x5e, 0xd6, 0xeb, 0x9c, 0x23, - 0x62, 0x35, 0x78, 0x7f, 0xde, 0x18, 0xb7, 0x19, 0xe3, 0x6c, 0xdf, 0xde, - 0x79, 0x41, 0xa2, 0xba, 0x4b, 0xc9, 0x00, 0x8d, 0xf5, 0x62, 0x9b, 0x58, - 0xfc, 0x08, 0xac, 0x99, 0xab, 0xa3, 0x18, 0xa7, 0x7f, 0x31, 0x81, 0x76, - 0xbf, 0xeb, 0x10, 0x38, 0x88, 0xd6, 0x1c, 0xf3, 0x0f, 0x6f, 0x54, 0x2f, - 0xe4, 0x09, 0x2f, 0x87, 0xe1, 0xe3, 0x8b, 0x08, 0x77, 0x56, 0x58, 0xa9, - 0x6b, 0xb4, 0x3b, 0x0b, 0x93, 0xa9, 0xc9, 0xe3, 0xab, 0xeb, 0x49, 0x80, - 0x5e, 0xca, 0x59, 0x22, 0x31, 0x0a, 0x15, 0x02, 0x89, 0x06, 0x20, 0xda, - 0x6b, 0x63, 0x01, 0x65, 0x06, 0xce, 0x15, 0x0a, 0x51, 0xb4, 0xbb, 0xa6, - 0xe5, 0xfc, 0xed, 0x32, 0x83, 0xc4, 0xba, 0xa0, 0x81, 0x70, 0x46, 0xf5, - 0x2d, 0xbd, 0x99, 0xe0, 0x13, 0xb3, 0x9b, 0x56, 0x71, 0x12, 0x57, 0x53, - 0xf0, 0x24, 0x84, 0xea, 0x98, 0x43, 0x41, 0x45, 0x80, 0x31, 0x5b, 0x99, - 0x96, 0x8c, 0x1b, 0x7d, 0x28, 0x7b, 0x6a, 0x2c, 0xff, 0xcf, 0xb4, 0xc6, - 0x33, 0x46, 0xcb, 0xe8, 0xdb, 0xa6, 0xfe, 0xfb, 0x2b, 0x6a, 0xd2, 0x1b, - 0x7f, 0xb0, 0x1d, 0xd2, 0x60, 0xe9, 0xc1, 0x34, 0x92, 0xd7, 0x88, 0x5f, - 0xaf, 0xcc, 0x9e, 0x4a, 0x2a, 0xa0, 0xbb, 0x9f, 0xa5, 0x0c, 0x74, 0x3a, - 0x07, 0x11, 0x47, 0xab, 0x34, 0xc5, 0x7f, 0xeb, 0xa4, 0xe1, 0x92, 0x33, - 0x74, 0x13, 0xb0, 0x4a, 0x7d, 0xfa, 0x7b, 0xc7, 0xef, 0x49, 0xfd, 0xc7, - 0x96, 0x75, 0xb7, 0x33, 0x7d, 0x35, 0x16, 0xf4, 0x95, 0x8a, 0x64, 0x72, - 0x0e, 0x0d, 0x88, 0x82, 0xff, 0x6a, 0x03, 0xee, 0x82, 0x5d, 0xc3, 0xb1, - 0x1c, 0xd1, 0xbd, 0x75, 0x8d, 0x4f, 0xf2, 0x1a, 0xe0, 0xe4, 0x9f, 0xc5, - 0x2f, 0x14, 0x1c, 0x2b, 0x9a, 0x58, 0xef, 0xa9, 0x88, 0xf9, 0x18, 0xfd, - 0x66, 0xf3, 0xaa, 0xbe, 0x34, 0x2e, 0xae, 0xb7, 0x34, 0x70, 0xb6, 0x0e, - 0x14, 0x6b, 0xbb, 0xf4, 0xf4, 0xed, 0x21, 0x81, 0xb8, 0x47, 0xed, 0x40, - 0xeb, 0x03, 0xf0, 0x40, 0x2d, 0xf7, 0xe0, 0x69, 0xe3, 0xb6, 0x76, 0xda, - 0x75, 0x0b, 0x3c, 0xeb, 0xd5, 0xf5, 0x59, 0x9d, 0x00, 0x37, 0xe5, 0x1b, - 0x47, 0xd0, 0x49, 0x7e, 0x16, 0x2d, 0x91, 0x46, 0x5a, 0x10, 0xcc, 0xac, - 0x8d, 0x46, 0xf8, 0xce, 0x70, 0xde, 0xda, 0xd2, 0x8e, 0x15, 0x94, 0x10, - 0xa5, 0xb1, 0x8b, 0x47, 0x4e, 0x3f, 0x18, 0x69, 0x2a, 0x36, 0x3c, 0xda, - 0x56, 0x2d, 0xab, 0xa6, 0xa4, 0xa3, 0x02, 0x74, 0x59, 0xb2, 0x08, 0x85, - 0x5d, 0x31, 0xa1, 0x11, 0x61, 0xb3, 0x99, 0x4d, 0x6e, 0x03, 0x42, 0xb7, - 0x38, 0x51, 0x87, 0xb4, 0xe9, 0x1b, 0xe0, 0x3a, 0x33, 0x4f, 0xc7, 0xee, - 0xc3, 0x57, 0x9e, 0xb5, 0x13, 0x9a, 0xf4, 0x0c, 0x28, 0xb7, 0x98, 0x4b, - 0x5c, 0xe3, 0x6e, 0x7a, 0x89, 0x98, 0x48, 0xed, 0xda, 0xb8, 0x2a, 0x65, - 0xdf, 0x44, 0x57, 0x66, 0x31, 0x2a, 0x78, 0x14, 0xbb, 0x55, 0xc0, 0xa1, - 0x47, 0xe5, 0x9c, 0x28, 0x2d, 0xab, 0x4f, 0xc5, 0xb0, 0x3e, 0x54, 0xb4, - 0x93, 0xf2, 0x30, 0xee, 0x55, 0x29, 0xc3, 0x4f, 0xe4, 0x15, 0xd8, 0xf0, - 0xa4, 0x61, 0xdb, 0x0d, 0x17, 0x6e, 0xe7, 0x39, 0x16, 0x8f, 0xd1, 0x6d, - 0xca, 0x6f, 0xa8, 0x1a, 0x74, 0xf8, 0x25, 0x85, 0x02, 0x21, 0x82, 0x37, - 0xbf, 0x6e, 0x9a, 0x9b, 0x94, 0x05, 0x8a, 0x73, 0x7c, 0x85, 0x9a, 0xce, - 0x57, 0x04, 0x44, 0x39, 0xd8, 0x96, 0xd3, 0xc0, 0x9b, 0x17, 0x38, 0xac, - 0xf4, 0x5f, 0x76, 0x1d, 0xc6, 0x22, 0x61, 0x49, 0xf9, 0xe0, 0xda, 0xf2, - 0xc5, 0x08, 0x37, 0x1a, 0x3f, 0x28, 0xbb, 0xb7, 0xac, 0x45, 0xf6, 0xb9, - 0x40, 0x21, 0xec, 0x6d, 0xe6, 0x6c, 0x8d, 0x7b, 0x0c, 0xdd, 0x7f, 0x73, - 0x95, 0xd9, 0x7c, 0xdd, 0x77, 0x61, 0x29, 0xed, 0x6f, 0x6f, 0x32, 0x91, - 0x49, 0xb5, 0x24, 0x42, 0x00, 0x52, 0x32, 0xe5, 0x05, 0x2a, 0xa7, 0xcf, - 0x0c, 0x83, 0x36, 0xec, 0xb5, 0x55, 0xef, 0x9a, 0xf2, 0x24, 0xcf, 0xdb, - 0x23, 0x77, 0x24, 0x0f, 0x0f, 0x5f, 0xbb, 0xde, 0x72, 0x23, 0xd9, 0x40, - 0xe8, 0x93, 0xdb, 0x18, 0x0a, 0x6e, 0x6d, 0xf0, 0x0e, 0x34, 0xe0, 0x5b, - 0x2f, 0x73, 0x06, 0x88, 0xce, 0x0b, 0xc5, 0x56, 0xa2, 0x5d, 0x44, 0x2c, - 0xdc, 0x87, 0x39, 0x37, 0xf6, 0x30, 0x93, 0x05, 0x10, 0xe0, 0x8d, 0xbc, - 0x88, 0x09, 0x5b, 0x5e, 0x51, 0x62, 0xd1, 0x0e, 0x8e, 0x5a, 0xcb, 0xe4, - 0xca, 0x48, 0x15, 0x38, 0x0a, 0x75, 0x39, 0xa2, 0x29, 0x69, 0xdc, 0xfe, - 0x01, 0xa3, 0x84, 0x6b, 0xb7, 0x25, 0x2b, 0x31, 0x78, 0x9b, 0x89, 0x21, - 0xc2, 0xe2, 0x64, 0xe0, 0x78, 0xf5, 0x20, 0xdb, 0xeb, 0x44, 0x0b, 0x1d, - 0x19, 0xb3, 0x2f, 0x92, 0x8f, 0x1a, 0xf6, 0xb8, 0x49, 0x7a, 0xcd, 0xd6, - 0xc2, 0xb8, 0x20, 0x70, 0x17, 0x47, 0x04, 0x06, 0xe2, 0x05, 0x81, 0xbd, - 0x6c, 0x58, 0x0e, 0xc4, 0xff, 0x9c, 0xe9, 0x3e, 0x4e, 0x5d, 0xeb, 0xe6, - 0xed, 0x5d, 0x36, 0x6f, 0x89, 0x1a, 0x00, 0x6f, 0xbc, 0xfa, 0xf1, 0xfd, - 0x74, 0xbc, 0xc2, 0xcb, 0x49, 0x19, 0x3f, 0xf1, 0xdf, 0xe9, 0x64, 0x00, - 0x11, 0x78, 0xf8, 0x2c, 0x0b, 0x9e, 0x05, 0xb6, 0x7a, 0xaf, 0x52, 0x44, - 0x3d, 0x39, 0xaf, 0xdd, 0x67, 0x4c, 0x04, 0xfe, 0xea, 0xf0, 0xca, 0x88, - 0xba, 0x99, 0x7d, 0xd2, 0xc1, 0xc8, 0x9c, 0xf0, 0x0c, 0x12, 0x61, 0xda, - 0x84, 0xd4, 0x26, 0xc8, 0xcc, 0x3d, 0x7c, 0x57, 0x7e, 0x9f, 0xd1, 0xc9, - 0xe2, 0xff, 0x9c, 0xbc, 0xe2, 0x44, 0x5b, 0xc2, 0x24, 0xe9, 0x25, 0xb4, - 0x43, 0xa8, 0x10, 0x12, 0x04, 0x3c, 0x51, 0xdb, 0xac, 0x9d, 0x25, 0x9c, - 0x31, 0x7b, 0x12, 0x77, 0x7f, 0x19, 0xff, 0xbf, 0x7c, 0x6c, 0x77, 0x26, - 0xfb, 0x80, 0x8d, 0x2d, 0xdb, 0xd9, 0x66, 0xb6, 0xfe, 0x97, 0x9b, 0x1d, - 0x64, 0x1c, 0x41, 0xdb, 0xac, 0x9d, 0x25, 0x9c, 0xb2, 0x8d, 0xce, 0x87, - 0x71, 0xcf, 0x4e, 0xa6, 0xe4, 0xc4, 0x30, 0x07, 0x97, 0x08, 0x17, 0x78, - 0xd0, 0x3f, 0xba, 0x3c, 0xd7, 0x05, 0x7f, 0x14, 0x9c, 0x3e, 0xdb, 0x2c, - 0x6c, 0x44, 0x65, 0x28, 0x9f, 0x5a, 0x7f, 0xc0, 0x57, 0x86, 0x34, 0x16, - 0x8d, 0xdb, 0xaf, 0x44, 0xb2, 0x05, 0x48, 0x55, 0x22, 0x43, 0x41, 0x07, - 0x61, 0x72, 0x68, 0x33, 0x84, 0xd9, 0xa8, 0x7e, 0x1c, 0x3f, 0xb0, 0x1a, - 0xda, 0xa5, 0x8a, 0x5d, 0x95, 0x92, 0xcb, 0x67, 0x3e, 0xf0, 0x54, 0xf3, - 0x5c, 0x64, 0xde, 0x6a, 0x65, 0x89, 0x62, 0xfa, 0x72, 0x45, 0x98, 0xc7, - 0x6a, 0xa7, 0x40, 0x6a, 0xc7, 0xd1, 0x59, 0xd9, 0x0b, 0xf5, 0xed, 0x52, - 0xe7, 0x4c, 0xab, 0x20, 0xc0, 0xfa, 0x82, 0x4d, 0xbf, 0x68, 0xe6, 0x9c, - 0x1f, 0xb9, 0x49, 0x40, 0x42, 0xa7, 0x00, 0xff, 0xc2, 0xb1, 0xac, 0x57, - 0x8b, 0xae, 0xea, 0xdf, 0xd5, 0x5e, 0xc2, 0x0e, 0x6f, 0x89, 0xfb, 0xfc, - 0xb6, 0x44, 0x8c, 0x21, 0x32, 0x66, 0x4d, 0xc1, 0xfd, 0x96, 0x44, 0x31, - 0x57, 0x97, 0x53, 0x0d, 0x07, 0xe5, 0x10, 0x82, 0xa7, 0xeb, 0x10, 0x34, - 0x79, 0xc7, 0xcc, 0x60, 0x8a, 0xcd, 0x5d, 0x76, 0x26, 0xcd, 0xad, 0x08, - 0xd5, 0xf3, 0x5a, 0xef, 0x40, 0xd0, 0x88, 0x9d, 0xc5, 0x43, 0x16, 0x0e, - 0x56, 0xfa, 0xb6, 0xe1, 0x84, 0xdb, 0xf2, 0xfa, 0xad, 0x4d, 0xa0, 0xe2, - 0x74, 0x18, 0x9b, 0x1b, 0x7f, 0xff, 0xca, 0xcc, 0x01, 0x25, 0x05, 0xee, - 0x80, 0xda, 0x02, 0x51, 0x1c, 0x13, 0x8c, 0x91, 0x6a, 0x11, 0x11, 0xeb, - 0xd8, 0x6c, 0x3b, 0x39, 0xce, 0x09, 0x10, 0xbe, 0x00, 0x3e, 0x49, 0xad, - 0xd8, 0x08, 0x00, 0x42, 0xb6, 0x1f, 0x52, 0x98, 0x8a, 0x73, 0xec, 0xc5, - 0x9f, 0xe5, 0x6c, 0xf6, 0xec, 0x78, 0x2e, 0x1e, 0x87, 0x96, 0x01, 0x6f, - 0xca, 0x73, 0xc8, 0x36, 0x88, 0x3b, 0x84, 0xf7, 0x9b, 0x7d, 0x64, 0x8b, - 0x42, 0xf0, 0x2a, 0x3c, 0xfd, 0xc6, 0x46, 0x5c, 0x45, 0xfe, 0x7e, 0x6b, - 0x51, 0xcd, 0xe2, 0x94, 0xf8, 0x1e, 0x02, 0x28, 0xe3, 0xac, 0x89, 0x44, - 0x06, 0x05, 0x93, 0x1e, 0x5c, 0x8b, 0xff, 0x85, 0x81, 0x10, 0xf8, 0x98, - 0xd6, 0x79, 0x7b, 0x94, 0xc7, 0xee, 0xa8, 0x88, 0xe2, 0x66, 0xd4, 0xc4, - 0x2a, 0xda, 0xe7, 0x84, 0xb4, 0xa2, 0x1d, 0x89, 0x92, 0x25, 0x67, 0x3c, - 0xdd, 0x1b, 0x9f, 0x12, 0xcb, 0x96, 0x1c, 0x06, 0xe8, 0x19, 0x82, 0x97, - 0x48, 0xbe, 0x4e, 0x27, 0x78, 0xfd, 0xa1, 0xf0, 0xd2, 0x1d, 0xff, 0x32, - 0x3f, 0x6a, 0x12, 0xda, 0xc7, 0x66, 0xd1, 0x02, 0xe9, 0x0f, 0x98, 0xef, - 0x0b, 0x03, 0x7e, 0xf5, 0x7d, 0x3b, 0x65, 0x9c, 0x43, 0x99, 0xa2, 0x0d, - 0xdf, 0x26, 0x41, 0x04, 0xc5, 0xf6, 0x9f, 0x11, 0x3b, 0x5d, 0x2d, 0x64, - 0x52, 0x02, 0xd0, 0x94, 0x54, 0x3f, 0x2f, 0x9d, 0x81, 0x81, 0x0a, 0x43, - 0x7d, 0x37, 0x3c, 0xa3, 0x93, 0xf2, 0x4d, 0x7c, 0xd1, 0x3b, 0x0a, 0x4c, - 0xc3, 0xde, 0xce, 0x86, 0x0d, 0x75, 0xb2, 0xe4, 0x86, 0x2d, 0x88, 0x83, - 0x51, 0xe9, 0x5d, 0xe3, 0xf1, 0x92, 0xe3, 0x4a, 0x4c, 0x4e, 0xcb, 0x90, - 0x2f, 0x64, 0x4f, 0xa5, 0x3b, 0x72, 0xed, 0x1f, 0x3a, 0xe8, 0x19, 0xe1, - 0x0b, 0xfa, 0xb2, 0xba, 0xe6, 0xc2, 0x9b, 0xd2, 0x69, 0xaa, 0xa2, 0x86, - 0x5c, 0x49, 0x44, 0xff, 0xdd, 0xb0, 0x26, 0x67, 0xd0, 0x74, 0xcf, 0xe5, - 0xec, 0xb6, 0xef, 0xc8, 0xe3, 0x1b, 0x5d, 0xdb, 0xd2, 0xa4, 0xf7, 0x18, - 0x1a, 0x77, 0x5e, 0x23, 0x21, 0xdc, 0x75, 0xb1, 0x49, 0xf3, 0x42, 0x17, - 0xba, 0x86, 0xc9, 0x3a, 0x26, 0x2c, 0xb1, 0xce, 0x24, 0xa3, 0x88, 0x45, - 0x9f, 0xd6, 0xea, 0x19, 0xdc, 0x40, 0xb9, 0x63, 0xc5, 0x6e, 0x4c, 0x60, - 0xd3, 0xf8, 0xee, 0xfd, 0x57, 0xda, 0x40, 0x3f, 0x63, 0xed, 0xe4, 0xdf, - 0x10, 0x4c, 0xab, 0x93, 0x4d, 0x9c, 0xad, 0xe7, 0xcd, 0x7c, 0x97, 0x40, - 0xce, 0xf3, 0x55, 0x23, 0xa0, 0x22, 0x19, 0x51, 0x10, 0x76, 0x35, 0x3d, - 0x99, 0xad, 0xef, 0xa9, 0x1f, 0xec, 0x2f, 0xdb, 0x4e, 0x06, 0x57, 0x14, - 0x6e, 0x8a, 0xbb, 0xd6, 0xb1, 0x86, 0xa4, 0x21, 0xd5, 0xd7, 0x31, 0x4d, - 0xe0, 0x47, 0xe9, 0xc6, 0xbc, 0xd8, 0x40, 0x58, 0x56, 0x05, 0xf3, 0xc4, - 0x3b, 0xa4, 0xa0, 0x85, 0x31, 0x00, 0x42, 0xce, 0x02, 0xee, 0xab, 0xcb, - 0x5b, 0xb4, 0x98, 0xc0, 0x14, 0x10, 0xc5, 0xbd, 0xfe, 0xa1, 0x84, 0x37, - 0xf3, 0x87, 0xea, 0x82, 0x42, 0x86, 0xdf, 0xf4, 0xd0, 0xd3, 0x4c, 0x44, - 0x7a, 0x4e, 0x23, 0xe5, 0x69, 0xd9, 0x5e, 0xaa, 0xc0, 0x0d, 0xab, 0x60, - 0xc7, 0x29, 0xd2, 0xe0, 0x1c, 0x51, 0x6c, 0x7b, 0x8a, 0x30, 0x10, 0x05, - 0x02, 0xa7, 0x3e, 0xfc, 0x4d, 0x46, 0xb2, 0x20, 0x8f, 0x6f, 0x8b, 0x2c, - 0x96, 0x65, 0xa9, 0x7b, 0x20, 0xc4, 0x2f, 0x37, 0xf8, 0xf6, 0xb3, 0x6d, - 0xad, 0x67, 0xa3, 0x70, 0x8e, 0x80, 0x55, 0xc5, 0xe2, 0x1a, 0xdf, 0x76, - 0xf9, 0x52, 0x8e, 0xf4, 0x40, 0xcd, 0xd3, 0x98, 0xd8, 0x41, 0x1a, 0x56, - 0xdd, 0x97, 0xf7, 0xaa, 0x23, 0x40, 0xb7, 0x77, 0x5d, 0xab, 0x2a, 0xe3, - 0xd9, 0x38, 0x4d, 0xb9, 0xd6, 0xb1, 0xe1, 0xa1, 0x56, 0x2d, 0x58, 0x72, - 0x3a, 0x6b, 0xa8, 0x20, 0x93, 0xdd, 0x77, 0x17, 0x7b, 0xf0, 0xe4, 0x1e, - 0x96, 0x26, 0x91, 0xa1, 0x1b, 0x63, 0xbc, 0xda, 0x5b, 0xe0, 0xac, 0xc4, - 0x69, 0xa5, 0xc7, 0x32, 0xde, 0x85, 0x66, 0x96, 0xc5, 0xbf, 0x44, 0xf4, - 0x1a, 0x71, 0xee, 0x8c, 0x97, 0xb8, 0x41, 0xe6, 0x53, 0x6c, 0x94, 0xdc, - 0xaa, 0x13, 0x15, 0xab, 0x0f, 0x15, 0x51, 0x29, 0x32, 0x45, 0xf3, 0x58, - 0xee, 0xb0, 0x77, 0x11, 0xdd, 0x95, 0x31, 0x18, 0xfe, 0x1d, 0x94, 0x81, - 0x9d, 0x55, 0x35, 0x8f, 0x68, 0x20, 0xcd, 0xf8, 0x87, 0x61, 0xb6, 0xca, - 0xba, 0xfc, 0x5a, 0xae, 0x85, 0x03, 0x32, 0x38, 0x68, 0x8c, 0x03, 0xe4, - 0xae, 0xae, 0x99, 0x84, 0xa9, 0x16, 0x1b, 0x3e, 0x97, 0x00, 0x05, 0xbc, - 0xbf, 0x11, 0x65, 0x99, 0x63, 0x6a, 0xe3, 0xea, 0xff, 0x3b, 0xec, 0xa9, - 0xc5, 0xeb, 0xba, 0xcc, 0x52, 0x17, 0x65, 0x09, 0x9e, 0x88, 0xfd, 0xa9, - 0xe0, 0x5e, 0x7a, 0xb0, 0x82, 0xbb, 0x12, 0x7e, 0x6e, 0x03, 0xca, 0x4d, - 0xe2, 0x1e, 0x38, 0x6e, 0x90, 0x20, 0x16, 0xb6, 0x1f, 0x96, 0x8f, 0x6a, - 0xf2, 0x40, 0xb9, 0x2b, 0xac, 0x6f, 0x5e, 0x99, 0xdb, 0x23, 0xef, 0x1c, - 0x47, 0x7b, 0x62, 0x57, 0x05, 0xec, 0xab, 0xeb, 0x69, 0x53, 0x5c, 0xad, - 0xda, 0x52, 0x8d, 0x84, 0x08, 0xca, 0x81, 0xc6, 0x04, 0xcb, 0x19, 0x8a, - 0x27, 0x3d, 0x25, 0x56, 0xde, 0xac, 0xd4, 0x3c, 0x8d, 0x47, 0x21, 0x5a, - 0x19, 0x22, 0x6d, 0xfe, 0xab, 0xa5, 0xbe, 0x9b, 0x7e, 0xa2, 0x51, 0xeb, - 0xf4, 0x7d, 0xe3, 0xdb, 0x4c, 0x24, 0x80, 0x63, 0xc6, 0x64, 0xed, 0x09, - 0x39, 0xb5, 0x42, 0x83, 0xde, 0xf8, 0x61, 0x54, 0x69, 0xe7, 0xf7, 0x33, - 0xda, 0xb0, 0xbf, 0x79, 0xb3, 0xb7, 0x3f, 0xad, 0xe3, 0x0d, 0xbd, 0x0c, - 0x5b, 0xdc, 0xdc, 0xce, 0xba, 0x07, 0xac, 0xe6, 0x9b, 0x56, 0x91, 0xeb, - 0x72, 0xdd, 0xf4, 0x51, 0x1e, 0x7e, 0x94, 0xe9, 0xce, 0x7e, 0x93, 0x46, - 0x98, 0x07, 0xfb, 0x06, 0x16, 0x10, 0x9e, 0x03, 0xd2, 0x4b, 0x9b, 0x7d, - 0x46, 0xb0, 0x48, 0xf1, 0xd6, 0x09, 0xd5, 0x75, 0xea, 0xb4, 0x6d, 0xae, - 0xf8, 0x4e, 0x22, 0xca, 0xa8, 0x2e, 0xad, 0x1a, 0xe0, 0x20, 0x52, 0xd8, - 0x5d, 0xcd, 0x1e, 0x51, 0xde, 0x56, 0x85, 0x88, 0xb6, 0x09, 0x1c, 0xda, - 0x8c, 0xfe, 0xc6, 0x7d, 0x44, 0xcd, 0xcf, 0xd0, 0xec, 0x85, 0x78, 0xd2, - 0xa3, 0x19, 0x19, 0x99, 0xef, 0x8e, 0x15, 0x19, 0x04, 0x2c, 0xcb, 0xc7, - 0xdb, 0x67, 0x81, 0x58, 0x7a, 0x72, 0x58, 0xef, 0xbe, 0xf6, 0x07, 0xff, - 0x5a, 0x3c, 0x18, 0x43, 0x4b, 0xbb, 0xf8, 0xb3, 0x75, 0x38, 0x8c, 0xa7, - 0xe1, 0xe7, 0x2d, 0x03, 0xd6, 0xae, 0x6f, 0x54, 0x2f, 0x46, 0xec, 0x91, - 0xa5, 0x03, 0x73, 0x98, 0x96, 0x7d, 0x7b, 0xdc, 0xac, 0x74, 0xc5, 0xd8, - 0x5c, 0x24, 0x1a, 0x32, 0x9f, 0xb6, 0xc7, 0x8e, 0x63, 0x84, 0x56, 0xf3, - 0x48, 0x6f, 0x58, 0x9d, 0x82, 0xc3, 0xa7, 0x99, 0x91, 0xb2, 0x81, 0x6f, - 0x68, 0x49, 0xe2, 0x47, 0x96, 0x0f, 0x99, 0xaf, 0xd6, 0xf3, 0xf6, 0xe2, - 0xc2, 0x8d, 0x91, 0xb3, 0xad, 0xe6, 0x18, 0xc0, 0xd1, 0x86, 0x5a, 0xd0, - 0x9d, 0xed, 0x40, 0x7f, 0x91, 0x19, 0x1c, 0x2f, 0xba, 0xa8, 0x82, 0x75, - 0xd1, 0x53, 0x8b, 0x79, 0xda, 0xe7, 0x61, 0x1a, 0xa7, 0x1f, 0xfb, 0xee, - 0xda, 0xef, 0xfe, 0x5a, 0xef, 0x13, 0x90, 0x04, 0xb6, 0xc2, 0x18, 0x4b, - 0xce, 0x67, 0xb4, 0xa3, 0x1c, 0x6e, 0x8f, 0xf6, 0xa8, 0xbf, 0xb9, 0xdf, - 0x92, 0x71, 0x54, 0xc7, 0x93, 0x1f, 0xde, 0xe0, 0x5f, 0x2d, 0x99, 0x9e, - 0x2f, 0x1e, 0x85, 0x81, 0x44, 0xe6, 0x47, 0xf6, 0x30, 0xd9, 0xd5, 0xfb, - 0x8e, 0xca, 0x74, 0xff, 0xd7, 0xa2, 0xff, 0x67, 0x55, 0xd9, 0xf1, 0x9c, - 0x26, 0x2b, 0xc0, 0xa8, 0xf4, 0x97, 0x3b, 0x89, 0xf7, 0x5b, 0xbe, 0x6b, - 0xed, 0x0e, 0xa8, 0x5e, 0xe4, 0xf3, 0xaf, 0x6c, 0xd0, 0xbc, 0xa9, 0xdb, - 0xc0, 0x5e, 0x3e, 0x4f, 0x3e, 0x59, 0x92, 0xf6, 0x95, 0xa4, 0xad, 0x03, - 0xf5, 0xbe, 0x2a, 0x71, 0x5e, 0xde, 0x56, 0xdd, 0xcc, 0x20, 0x17, 0x4c, - 0xa9, 0xb9, 0xfa, 0x8a, 0xcd, 0x07, 0x25, 0xee, 0xb0, 0xff, 0x8a, 0xa0, - 0xd8, 0x8f, 0x91, 0xf2, 0x61, 0x07, 0x71, 0x40, 0x95, 0x9c, 0x4d, 0x40, - 0x50, 0x20, 0x8f, 0xea, 0x9b, 0x69, 0xc1, 0xe3, 0x02, 0x34, 0xaf, 0x85, - 0xcb, 0xcf, 0xd9, 0xed, 0xc7, 0xde, 0x26, 0x70, 0xfe, 0x14, 0x8a, 0x4f, - 0x8c, 0x0b, 0xf9, 0x56, 0x32, 0xfe, 0xf2, 0x02, 0x28, 0xbd, 0x24, 0x0c, - 0x7c, 0xe1, 0x87, 0x7e, 0x3c, 0xa1, 0x38, 0x72, 0xff, 0x1c, 0x26, 0x39, - 0xf4, 0xc0, 0xab, 0xf4, 0xe0, 0x27, 0xcf, 0xa4, 0xd4, 0x47, 0x7f, 0x3f, - 0x40, 0x76, 0x5c, 0xff, 0xbd, 0xa5, 0x88, 0x93, 0xcf, 0x3e, 0xda, 0x96, - 0xae, 0x74, 0xbd, 0x37, 0x29, 0x94, 0x4e, 0xd2, 0x35, 0x58, 0xae, 0x48, - 0x23, 0x19, 0x17, 0x21, 0x90, 0xff, 0xfb, 0x29, 0x32, 0x47, 0x79, 0xc8, - 0x12, 0xc7, 0xc6, 0x7f, 0x28, 0x8f, 0xcd, 0x87, 0xdb, 0xa1, 0x26, 0xa7, - 0x05, 0x4f, 0x46, 0x8f, 0x2d, 0xb5, 0x88, 0x73, 0xe4, 0xb9, 0x9c, 0xd5, - 0xb7, 0x48, 0xd1, 0xc2, 0x7b, 0xbc, 0x14, 0x47, 0xf2, 0xa5, 0xbe, 0x85, - 0x94, 0xbd, 0x67, 0x27, 0x0e, 0xdd, 0xa8, 0x0c, 0x34, 0xf2, 0x0e, 0x91, - 0xbe, 0x2a, 0x85, 0x26, 0x4f, 0xee, 0x75, 0x68, 0x33, 0xb1, 0x8f, 0xf8, - 0xa1, 0x11, 0xa2, 0xb4, 0xc8, 0xea, 0xd4, 0x2d, 0xbc, 0x6f, 0xaf, 0xfa, - 0xb2, 0xca, 0xa0, 0xef, 0x77, 0xf5, 0x8d, 0xdd, 0x86, 0x6a, 0xa7, 0x81, - 0x11, 0xd4, 0xbf, 0x6f, 0xe7, 0x93, 0x94, 0xca, 0x86, 0x6c, 0x48, 0x4d, - 0x78, 0xa0, 0x60, 0xef, 0xd0, 0xf7, 0x0d, 0xd8, 0x13, 0xd6, 0x57, 0x86, - 0xad, 0x5c, 0x48, 0x8e, 0x92, 0xed, 0xbc, 0xda, 0x97, 0xe0, 0x2d, 0x01, - 0xac, 0xc3, 0x07, 0xc4, 0x0d, 0x90, 0xeb, 0x52, 0x34, 0x2f, 0xd0, 0x40, - 0x30, 0x00, 0xbb, 0x9b, 0xf0, 0x81, 0x87, 0xbc, 0x07, 0x78, 0x90, 0xb3, - 0xda, 0x70, 0x2f, 0x7a, 0x3d, 0x58, 0x4b, 0x86, 0x7a, 0xaf, 0x3a, 0x0b, - 0x87, 0xc8, 0x74, 0x8f, 0xc3, 0x60, 0x65, 0xe7, 0x70, 0x3c, 0x4b, 0xf5, - 0x2f, 0xcc, 0xd0, 0xdc, 0x70, 0xd7, 0x04, 0x67, 0xf7, 0x8e, 0xcf, 0xcf, - 0x21, 0x90, 0x94, 0xd9, 0x0d, 0x93, 0xdc, 0x75, 0xeb, 0x7a, 0xd3, 0xac, - 0x24, 0xea, 0x06, 0x6d, 0x8a, 0xb0, 0x23, 0x13, 0xc9, 0x60, 0x96, 0x12, - 0x35, 0xcd, 0x11, 0x11, 0x3f, 0x1a, 0x81, 0xe0, 0xf1, 0x7a, 0x85, 0x68, - 0x0b, 0xe6, 0x30, 0xf6, 0xcb, 0xd3, 0xea, 0x48, 0x5d, 0xe1, 0xc2, 0x33, - 0x26, 0x6d, 0x0b, 0xd4, 0x47, 0xcd, 0x75, 0xbb, 0xfa, 0x64, 0xe8, 0x2f, - 0x37, 0x89, 0xba, 0xd6, 0x2b, 0xb4, 0x6a, 0x78, 0x9e, 0x66, 0x71, 0x0c, - 0x7d, 0x40, 0xd4, 0xc0, 0x1c, 0xe5, 0x52, 0x01, 0x4b, 0x31, 0x38, 0x80, - 0x89, 0x75, 0x25, 0x32, 0x49, 0x8c, 0x00, 0x2b, 0x2d, 0x18, 0x1a, 0x97, - 0xaa, 0x28, 0xc2, 0xac, 0x02, 0x8b, 0x85, 0xff, 0x21, 0x87, 0xaa, 0x73, - 0x6f, 0x45, 0x3c, 0xc0, 0x85, 0xd8, 0xd6, 0x72, 0x3d, 0x2e, 0x0c, 0xca, - 0xfc, 0x76, 0x70, 0x0b, 0x6b, 0x56, 0x6a, 0xdf, 0x22, 0xb9, 0xfb, 0x5f, - 0xf8, 0x5f, 0x2f, 0x58, 0x44, 0xf2, 0x7c, 0x2b, 0xab, 0x6b, 0x11, 0xa7, - 0x9c, 0xf5, 0x67, 0x93, 0xeb, 0x51, 0xc6, 0x6e, 0x71, 0x83, 0xc0, 0x72, - 0xc8, 0x6d, 0x9e, 0xf0, 0xf2, 0x83, 0x04, 0x65, 0x3d, 0xa5, 0x78, 0xc7, - 0xe4, 0x83, 0xff, 0xeb, 0x40, 0x1b, 0xa3, 0x02, 0x21, 0xbe, 0x1d, 0x30, - 0x39, 0x0a, 0x98, 0x7b, 0xa2, 0xf8, 0x67, 0x54, 0x7d, 0x38, 0x22, 0x8f, - 0x02, 0xe5, 0x92, 0x78, 0x8a, 0x55, 0x5c, 0xee, 0x4e, 0xfa, 0xe9, 0x46, - 0x40, 0xe0, 0xd7, 0xfa, 0xf5, 0xb7, 0xa6, 0xc5, 0x45, 0x38, 0x9c, 0x89, - 0x8f, 0xee, 0xe5, 0x86, 0x58, 0x6b, 0xad, 0xd6, 0x26, 0xd4, 0xa4, 0xc3, - 0xb9, 0x51, 0x56, 0xec, 0xf0, 0xde, 0x60, 0x0a, 0xd8, 0xb1, 0xec, 0x8e, - 0x94, 0x06, 0x31, 0xb5, 0x18, 0x84, 0x18, 0x4a, 0xd8, 0xaf, 0xfb, 0x04, - 0xeb, 0x6c, 0x59, 0x32, 0x74, 0x36, 0x5f, 0xf1, 0x1a, 0xbe, 0x01, 0x37, - 0xe6, 0xd4, 0xb1, 0xc8, 0xa8, 0x9e, 0xf7, 0xa1, 0x1b, 0xf3, 0x50, 0xe3, - 0x24, 0x8a, 0x3d, 0x09, 0x66, 0xeb, 0x9e, 0x78, 0x4f, 0xcf, 0x7f, 0x4c, - 0x89, 0xc3, 0x2d, 0x20, 0xa1, 0x12, 0x91, 0xe9, 0x74, 0xce, 0xb8, 0xdb, - 0x47, 0x54, 0x50, 0x26, 0x0b, 0x12, 0xf2, 0x83, 0x78, 0x7e, 0x61, 0xfd, - 0xda, 0x92, 0xa0, 0xcf, 0xc3, 0x6d, 0x91, 0xca, 0x6b, 0xa4, 0x29, 0x2e, - 0x32, 0xcd, 0xf1, 0xcd, 0xfb, 0x7a, 0x48, 0x20, 0xf1, 0x82, 0x90, 0x23, - 0x03, 0xf9, 0x51, 0x6b, 0x9d, 0xa9, 0x76, 0x40, 0x4b, 0xea, 0x4d, 0x64, - 0x0a, 0x5f, 0x47, 0xc0, 0xd5, 0x13, 0x57, 0xe0, 0xbc, 0x3f, 0x16, 0x2a, - 0xf0, 0xd1, 0x81, 0x8d, 0xc3, 0xf5, 0x56, 0x19, 0x6f, 0x80, 0xcc, 0x02, - 0xc3, 0x64, 0x7f, 0x75, 0x83, 0x73, 0xab, 0x36, 0x41, 0xaf, 0xf5, 0xb2, - 0x34, 0x66, 0xba, 0xe9, 0xb2, 0x35, 0x3b, 0x38, 0x83, 0xd6, 0xf7, 0xc2, - 0xd0, 0x4e, 0x50, 0x13, 0x8a, 0x20, 0x3f, 0xd4, 0x16, 0x43, 0x13, 0xd4, - 0xe0, 0x4c, 0xbd, 0xfb, 0x5b, 0x1a, 0x31, 0x98, 0x7d, 0x4f, 0x80, 0x0d, - 0xeb, 0xe8, 0x20, 0xf6, 0x13, 0x7b, 0x2f, 0x11, 0x00, 0x65, 0x26, 0xab, - 0x8d, 0xaf, 0x2a, 0xb2, 0x81, 0x9f, 0x36, 0x67, 0x95, 0xd1, 0xcd, 0xee, - 0x95, 0x5a, 0x49, 0x44, 0xe4, 0xe4, 0x09, 0xfe, 0x06, 0xe2, 0x60, 0x5d, - 0x7b, 0x99, 0x97, 0x6f, 0x14, 0x47, 0xa4, 0x81, 0xd9, 0x0b, 0xad, 0x50, - 0x1c, 0x61, 0xc0, 0xf0, 0x59, 0xae, 0xd6, 0x44, 0x9f, 0xbc, 0x16, 0xf0, - 0xdb, 0xe9, 0x5e, 0xe2, 0x7c, 0xe8, 0xc0, 0x3d, 0x9d, 0x2b, 0xbf, 0xfb, - 0x10, 0x1b, 0xc7, 0x9d, 0x2c, 0x85, 0x01, 0xf5, 0x08, 0x08, 0x0a, 0x0d, - 0x7e, 0x09, 0x53, 0x63, 0x59, 0x77, 0xdb, 0xdc, 0x65, 0x1f, 0xe3, 0x0d, - 0x8f, 0x75, 0x4e, 0xdb, 0x94, 0x8f, 0xf1, 0xac, 0x26, 0x8e, 0xe6, 0xc3, - 0xac, 0x9e, 0xfd, 0x78, 0x27, 0x7a, 0x41, 0xdd, 0x08, 0x6c, 0x23, 0x2f, - 0x27, 0x0b, 0x3e, 0x26, 0x6a, 0x7d, 0x04, 0x54, 0x21, 0x31, 0x33, 0x10, - 0x2a, 0x64, 0xbb, 0x5f, 0xb7, 0xaf, 0x48, 0xbc, 0x24, 0x70, 0x91, 0xf9, - 0x13, 0x79, 0x91, 0xc4, 0x3a, 0x83, 0xf3, 0xa5, 0xc7, 0x96, 0xea, 0x8f, - 0x25, 0x06, 0x60, 0x7d, 0xd5, 0xdb, 0x35, 0x57, 0x3c, 0xac, 0x71, 0x79, - 0x86, 0xa9, 0x6b, 0x29, 0xae, 0x1b, 0x4c, 0xde, 0xb5, 0xc8, 0x6e, 0x88, - 0x23, 0xd8, 0x84, 0x87, 0x85, 0x70, 0x3d, 0x51, 0xc5, 0xa3, 0x3e, 0x87, - 0x71, 0x33, 0x71, 0x9e, 0xce, 0xe1, 0xc9, 0xa8, 0xc0, 0x86, 0x6d, 0x6b, - 0x5e, 0x61, 0xd2, 0x64, 0xc9, 0x2b, 0x75, 0xe6, 0x74, 0x8c, 0xd5, 0x0e, - 0xbf, 0xf9, 0x18, 0xf2, 0xe7, 0x53, 0x9e, 0x96, 0x86, 0x44, 0xba, 0xb6, - 0x29, 0x10, 0xbe, 0xee, 0xed, 0x90, 0xe4, 0x2a, 0xa8, 0x67, 0x9b, 0xe4, - 0x20, 0x24, 0x80, 0x44, 0x11, 0xc4, 0x14, 0x80, 0xd4, 0x77, 0x2f, 0x07, - 0x8b, 0x1f, 0x83, 0x28, 0x1b, 0xd7, 0x86, 0xf7, 0x49, 0x53, 0x03, 0x16, - 0x0a, 0x35, 0x82, 0xf7, 0xf9, 0x68, 0xc1, 0x23, 0x31, 0x1e, 0x78, 0x27, - 0x6e, 0x5b, 0x74, 0x12, 0xb9, 0x41, 0x9b, 0xa6, 0x7a, 0xf7, 0x36, 0x17, - 0x9d, 0xc5, 0xf1, 0xe8, 0xd9, 0x55, 0x20, 0xa0, 0x6b, 0x7e, 0x40, 0x69, - 0x4a, 0x20, 0x22, 0x33, 0xe7, 0x7a, 0xa0, 0x07, 0x0f, 0x34, 0x10, 0x34, - 0xe3, 0xf0, 0xab, 0xd6, 0x2b, 0x77, 0xae, 0xe9, 0xfb, 0xa5, 0x5f, 0xae, - 0x2d, 0x4a, 0x43, 0xf5, 0x97, 0x2a, 0x0b, 0x80, 0x20, 0x73, 0x33, 0x5c, - 0x98, 0xf7, 0x9e, 0xa7, 0x76, 0x51, 0x7d, 0x02, 0x11, 0x52, 0x66, 0x33, - 0x1d, 0x94, 0x23, 0x95, 0xe6, 0x96, 0x95, 0xd9, 0x0a, 0x31, 0x24, 0xa9, - 0x97, 0xe8, 0xfd, 0x0a, 0xc3, 0x40, 0x0c, 0xf3, 0xea, 0x28, 0x42, 0xb8, - 0x84, 0x02, 0xd6, 0x2f, 0xe2, 0xea, 0xf3, 0xc7, 0xb8, 0xfa, 0xde, 0x9f, - 0x49, 0x08, 0x7c, 0x1e, 0xad, 0xc3, 0x64, 0xc0, 0x7b, 0xe2, 0x25, 0x95, - 0xdb, 0x9c, 0xd5, 0xb5, 0x89, 0xd4, 0x7b, 0xf5, 0x6d, 0x1e, 0x62, 0x31, - 0xed, 0x67, 0x59, 0x63, 0x6c, 0xdd, 0xeb, 0x2a, 0xe9, 0x91, 0x75, 0xda, - 0xc4, 0x4d, 0xbc, 0x8b, 0xb2, 0x04, 0x88, 0xca, 0xe5, 0xfa, 0x22, 0x49, - 0xeb, 0xcb, 0x21, 0xde, 0xfa, 0x49, 0x81, 0x1b, 0xde, 0x44, 0x90, 0x95, - 0xab, 0x83, 0xa7, 0xb0, 0x37, 0x81, 0x4f, 0x6f, 0xb3, 0xfe, 0x52, 0x44, - 0xed, 0xbe, 0x97, 0xed, 0x77, 0x00, 0xd1, 0xd9, 0x81, 0x09, 0xfc, 0xb8, - 0x47, 0x6e, 0x1d, 0x88, 0x0c, 0xe3, 0xdc, 0xb4, 0xed, 0x23, 0xc7, 0xd2, - 0x1f, 0xb3, 0x62, 0x59, 0xe4, 0xf1, 0x76, 0x50, 0x0a, 0xfb, 0x5a, 0xc0, - 0x0f, 0x06, 0xf8, 0x20, 0x5a, 0x2c, 0x61, 0x76, 0x36, 0x6f, 0x17, 0xad, - 0x74, 0x7f, 0xf5, 0x01, 0xc3, 0x4b, 0x27, 0x76, 0xc6, 0xda, 0xb6, 0x4a, - 0xaf, 0xdc, 0xd4, 0x40, 0x04, 0xb1, 0x1a, 0xd2, 0x85, 0x97, 0xd3, 0x9c, - 0x3b, 0x1a, 0xde, 0x5b, 0xab, 0x80, 0x09, 0xf9, 0x15, 0x91, 0xcd, 0xb1, - 0x3f, 0xfb, 0x12, 0x67, 0xb9, 0x7b, 0x27, 0x5f, 0x81, 0xc3, 0x24, 0x23, - 0x9d, 0xf6, 0xe2, 0xde, 0xb3, 0x18, 0xdf, 0x21, 0x00, 0xc4, 0xf1, 0x6c, - 0xff, 0xa5, 0x51, 0x2f, 0x45, 0x34, 0x0b, 0x1f, 0x75, 0xd4, 0x5f, 0x14, - 0xd6, 0x3e, 0x07, 0x1b, 0xa6, 0x96, 0xa5, 0x3b, 0xbd, 0xe6, 0xa3, 0x8d, - 0x86, 0xc1, 0x34, 0x76, 0x68, 0xf9, 0x9d, 0x4a, 0x45, 0x7c, 0x97, 0x91, - 0x0e, 0xb9, 0x17, 0x56, 0xfd, 0x99, 0xfa, 0x36, 0x41, 0xf7, 0x23, 0x74, - 0x75, 0x5d, 0x6a, 0x17, 0xdf, 0xb0, 0xd4, 0x97, 0x56, 0x36, 0x9d, 0xaf, - 0x2a, 0x0c, 0xf8, 0x24, 0xcf, 0x63, 0x81, 0xd7, 0x2d, 0x50, 0x81, 0x00, - 0xf9, 0x96, 0xad, 0x8a, 0x94, 0x5a, 0xb3, 0xfb, 0x54, 0x93, 0x04, 0x8b, - 0xba, 0x0b, 0xcb, 0x77, 0xb5, 0x58, 0x68, 0xc3, 0xaa, 0x83, 0xc3, 0xed, - 0x7e, 0x5c, 0xdf, 0x3e, 0xc9, 0x72, 0x70, 0x17, 0x49, 0x0e, 0x80, 0x5a, - 0x09, 0xb4, 0xc8, 0x24, 0x04, 0x94, 0x97, 0x8a, 0x0b, 0xf1, 0xb8, 0x54, - 0x49, 0xbc, 0xe6, 0xb2, 0xc2, 0x80, 0x58, 0x3f, 0xbe, 0x49, 0x17, 0x72, - 0x1c, 0x37, 0x1a, 0x45, 0xcb, 0x3e, 0xbe, 0xf6, 0x6d, 0xd0, 0xc7, 0xb3, - 0xd4, 0xf2, 0xf8, 0x9e, 0x88, 0x9b, 0x74, 0xa9, 0x3a, 0xa3, 0x58, 0x2d, - 0x87, 0x9a, 0x1f, 0x67, 0x8b, 0xcf, 0x19, 0x35, 0x52, 0x11, 0xb8, 0x1e, - 0x0a, 0x0b, 0x0e, 0xa9, 0xd8, 0x1a, 0xf1, 0x7f, 0x5f, 0x77, 0x49, 0x4d, - 0x9d, 0xa4, 0xd5, 0x17, 0xea, 0x2c, 0xf0, 0x5c, 0xbd, 0x0d, 0x9b, 0x61, - 0x6f, 0x4d, 0x0e, 0xb7, 0x97, 0x43, 0xb0, 0xfa, 0xfc, 0xde, 0x3d, 0x97, - 0xc7, 0xf0, 0x88, 0x61, 0xa1, 0x86, 0x60, 0x5f, 0x5d, 0x19, 0x0c, 0x8e, - 0x58, 0xaa, 0x62, 0x3e, 0x92, 0xa7, 0x8e, 0x23, 0xad, 0x4f, 0xe3, 0x97, - 0x47, 0x47, 0x19, 0x6d, 0xde, 0x89, 0xca, 0xa6, 0x9f, 0xb4, 0x91, 0xdd, - 0xa9, 0x4e, 0x7c, 0x5d, 0x14, 0xd5, 0xca, 0xba, 0xca, 0x39, 0x62, 0x55, - 0xff, 0x3e, 0xac, 0xa0, 0xe0, 0xe5, 0x6d, 0xa6, 0xbc, 0xb6, 0x3f, 0x72, - 0xb8, 0x5a, 0x42, 0x14, 0xf9, 0xcb, 0x1d, 0xd5, 0x98, 0xfe, 0xec, 0x70, - 0x02, 0x63, 0x36, 0xd6, 0x21, 0x3a, 0x12, 0x52, 0x78, 0xed, 0xdb, 0xd8, - 0xaa, 0x74, 0xd9, 0xcf, 0xb2, 0x4f, 0xdb, 0xf8, 0x16, 0xa9, 0x93, 0xb2, - 0x36, 0x6e, 0x8c, 0x31, 0x64, 0x8b, 0x7e, 0x6e, 0xa7, 0x5e, 0x45, 0x3a, - 0xf8, 0x27, 0x58, 0x8f, 0xba, 0x46, 0x17, 0x86, 0x65, 0x5f, 0x26, 0x49, - 0x08, 0x46, 0x50, 0x45, 0x52, 0xe4, 0xe4, 0xe6, 0xa3, 0x56, 0x22, 0xce, - 0xbd, 0x88, 0x43, 0x1f, 0x64, 0x1b, 0x5b, 0xe8, 0x69, 0x72, 0xc4, 0x27, - 0xfa, 0xc9, 0x32, 0x38, 0x3d, 0xb9, 0x2b, 0x1b, 0x56, 0x0a, 0x97, 0xb5, - 0x32, 0x6c, 0x07, 0x75, 0x2a, 0x5f, 0xf2, 0x0a, 0xf2, 0xba, 0x8a, 0x0b, - 0x59, 0x3c, 0xa6, 0xc0, 0x16, 0xaa, 0x93, 0xbb, 0x26, 0x25, 0x8c, 0x31, - 0x64, 0x8b, 0x7e, 0x6e, 0xa7, 0x5e, 0x45, 0x3a, 0xbd, 0xea, 0xdb, 0xe7, - 0x05, 0x22, 0x4f, 0x6d, 0xf6, 0x06, 0x3a, 0x5c, 0x30, 0x47, 0x30, 0xe8, - 0xf8, 0xb6, 0xc5, 0x23, 0xfb, 0xc9, 0x50, 0xf0, 0x50, 0xa2, 0x72, 0x33, - 0x33, 0x79, 0xb1, 0x3c, 0x4b, 0xba, 0x2e, 0xf5, 0xb8, 0x2a, 0xd4, 0x5d, - 0x90, 0x93, 0x9b, 0x9a, 0x8f, 0x8b, 0x2f, 0x6d, 0x64, 0x4f, 0x36, 0x04, - 0x68, 0xfc, 0xe7, 0x7b, 0xb0, 0xf9, 0xa3, 0x08, 0x5b, 0xe8, 0x85, 0xa0, - 0x21, 0xd2, 0x55, 0x4f, 0x9b, 0xeb, 0x15, 0xe9, 0x28, 0x69, 0x47, 0xb7, - 0xba, 0xb1, 0xbc, 0x34, 0x08, 0x2c, 0x23, 0x27, 0x63, 0x01, 0x3b, 0x3b, - 0x86, 0x0e, 0x78, 0x57, 0x43, 0x19, 0xb4, 0xd7, 0x46, 0x4c, 0x34, 0x9c, - 0xc1, 0xea, 0x17, 0xb6, 0x30, 0x00, 0x93, 0x65, 0xd8, 0x2b, 0x10, 0xe6, - 0xcf, 0x93, 0x59, 0x07, 0xb9, 0x5d, 0x3b, 0xa3, 0x8f, 0xe0, 0xbd, 0x33, - 0x19, 0x0a, 0x99, 0x77, 0x7c, 0xda, 0xcc, 0x1b, 0x1e, 0xde, 0x23, 0xbb, - 0xe9, 0x7d, 0x55, 0x3a, 0x9c, 0x61, 0x52, 0x8b, 0xbe, 0x71, 0xc5, 0x93, - 0x10, 0xde, 0x9e, 0x8a, 0x99, 0x8c, 0xc6, 0xef, 0x6f, 0xe4, 0x90, 0xfe, - 0x21, 0xa6, 0x38, 0xea, 0x83, 0x7b, 0x75, 0x1d, 0x18, 0xb5, 0xd6, 0xae, - 0xcf, 0x31, 0xa1, 0xc6, 0x5e, 0x64, 0x3d, 0x04, 0xeb, 0xbf, 0x1d, 0x28, - 0xa5, 0xec, 0xb8, 0x97, 0xbb, 0x13, 0xf3, 0x91, 0x19, 0xd6, 0x3a, 0x07, - 0x64, 0xb9, 0x68, 0x9d, 0x04, 0xda, 0xb2, 0x67, 0xef, 0xb8, 0x18, 0x7e, - 0x83, 0x79, 0x76, 0x71, 0xfa, 0x8e, 0x43, 0xf6, 0xc2, 0xd2, 0xea, 0x03, - 0x0f, 0x0f, 0xcf, 0xfc, 0xde, 0x81, 0x68, 0xc6, 0x1f, 0x46, 0xcd, 0x73, - 0x3a, 0x18, 0x3b, 0x19, 0x07, 0x9b, 0x14, 0x63, 0x23, 0x15, 0xf1, 0x2d, - 0x06, 0x1d, 0x42, 0xf1, 0x80, 0x3e, 0xcb, 0x7e, 0xbd, 0xfa, 0x50, 0xc3, - 0x2a, 0x79, 0x77, 0x79, 0xa1, 0x10, 0x87, 0x20, 0x55, 0xe5, 0x8e, 0xfa, - 0xb1, 0x9f, 0xba, 0x2b, 0x0f, 0x24, 0xb7, 0x7e, 0xfe, 0x58, 0x39, 0xba, - 0x72, 0xd7, 0x80, 0x81, 0x8a, 0xa6, 0x75, 0x19, 0xc6, 0xd8, 0xf7, 0x47, - 0xd5, 0xf4, 0x74, 0x52, 0xdb, 0x1e, 0xf4, 0x96, 0x9e, 0x70, 0x8b, 0x96, - 0x15, 0xb6, 0x4d, 0x45, 0x18, 0x3c, 0x5b, 0x68, 0xcf, 0xeb, 0xda, 0x73, - 0x08, 0x2f, 0x95, 0x9b, 0x05, 0x86, 0xe6, 0x59, 0xd0, 0xa0, 0x46, 0x19, - 0xda, 0x3c, 0xc2, 0xbe, 0xe3, 0xdc, 0xa3, 0x80, 0xd2, 0x2d, 0x2d, 0x61, - 0x47, 0x1f, 0xf4, 0xe3, 0x15, 0x6f, 0xe5, 0xa0, 0xcb, 0xb6, 0x46, 0x1a, - 0x22, 0x6f, 0xc8, 0x71, 0xcd, 0x1a, 0x4a, 0x67, 0x57, 0xaf, 0x66, 0x3b, - 0x8d, 0xd4, 0xee, 0x7e, 0xce, 0xd6, 0x37, 0x24, 0xa0, 0x20, 0xea, 0x7b, - 0x8d, 0x43, 0xb6, 0x3f, 0x9b, 0xfc, 0x21, 0x0b, 0xa8, 0xf1, 0xe8, 0x6c, - 0x30, 0xa0, 0xd1, 0x54, 0x61, 0x60, 0x1a, 0xc7, 0xa2, 0xf8, 0x8d, 0xfb, - 0x6f, 0x98, 0xcf, 0xd6, 0x2c, 0x1a, 0xb0, 0x3a, 0x47, 0x1d, 0xc8, 0x3a, - 0x34, 0xbc, 0x25, 0x7f, 0xdf, 0xea, 0x6a, 0x4d, 0xd3, 0x0b, 0x0e, 0x1c, - 0x66, 0xd1, 0xb8, 0xd6, 0xe3, 0x0d, 0xf4, 0x79, 0x22, 0x49, 0x44, 0x63, - 0xf8, 0x1f, 0xf7, 0x59, 0x8b, 0x05, 0xe7, 0x0f, 0xc6, 0xef, 0x5b, 0x5e, - 0xb1, 0xe0, 0x4b, 0x22, 0x6d, 0xed, 0x6d, 0xb7, 0xba, 0xb6, 0xdd, 0x9e, - 0x18, 0x99, 0xd1, 0xe3, 0xb3, 0x31, 0x99, 0xb9, 0xa6, 0x61, 0x9d, 0xce, - 0x99, 0xba, 0x06, 0x52, 0xa1, 0x29, 0x2f, 0x3f, 0x52, 0x7a, 0xe4, 0xab, - 0xed, 0xa1, 0x2c, 0x5a, 0x88, 0xd6, 0x93, 0x86, 0xd9, 0xb9, 0x91, 0x8b, - 0x8c, 0x20, 0x07, 0x3f, 0xde, 0x5e, 0x45, 0x34, 0x29, 0xd3, 0xe4, 0x1f, - 0xff, 0x20, 0x23, 0x34, 0xa7, 0xe3, 0xc0, 0x0f, 0xd6, 0xee, 0xc5, 0x95, - 0x71, 0x58, 0x84, 0x28, 0x99, 0x2d, 0xce, 0xc0, 0x6c, 0x8e, 0x4a, 0x28, - 0x83, 0x81, 0xc1, 0xf3, 0x25, 0xd4, 0xc2, 0x3c, 0xd1, 0x63, 0xaf, 0xc3, - 0x4e, 0x49, 0x62, 0xf1, 0x06, 0x87, 0xd4, 0x82, 0xea, 0xae, 0x05, 0xf2, - 0x5d, 0x95, 0x3e, 0x48, 0xfd, 0xa7, 0xdd, 0xc3, 0xc0, 0x98, 0x96, 0xa1, - 0x60, 0xaf, 0x5c, 0x4b, 0x56, 0xc5, 0xab, 0xba, 0x64, 0x8c, 0x05, 0x4e, - 0x41, 0x22, 0x5b, 0xe5, 0xae, 0x88, 0x0b, 0xc2, 0xc0, 0xbf, 0xb1, 0x7d, - 0x37, 0xfa, 0xef, 0x3b, 0xbe, 0x01, 0xca, 0x53, 0x0a, 0x65, 0xe0, 0x7c, - 0x3e, 0xec, 0x14, 0xd9, 0x8b, 0xb7, 0x63, 0xd0, 0x33, 0xac, 0x51, 0x38, - 0x3e, 0x1d, 0xd9, 0xf9, 0xb8, 0xea, 0x2c, 0xdd, 0x86, 0xc5, 0x51, 0x71, - 0xbf, 0xa7, 0xa5, 0xd1, 0x1f, 0xa2, 0xd0, 0xe5, 0x54, 0xaa, 0x41, 0xdf, - 0x67, 0x6d, 0x83, 0x7e, 0x2f, 0x47, 0x8c, 0xf2, 0x7d, 0xa0, 0xd7, 0xef, - 0x11, 0x7f, 0x66, 0x5e, 0x63, 0xe5, 0xc5, 0x24, 0xa8, 0x63, 0x85, 0x02, - 0x05, 0x85, 0x87, 0xfe, 0x16, 0x6d, 0xe0, 0x97, 0xdc, 0x0c, 0xc1, 0x07, - 0x7b, 0x2d, 0x8a, 0x4a, 0x1d, 0xa6, 0x13, 0x9e, 0xf8, 0x9c, 0xc5, 0x94, - 0xf0, 0xcb, 0xd7, 0x2c, 0x8a, 0xcf, 0xe7, 0x72, 0x10, 0x23, 0xe7, 0x98, - 0x92, 0x1e, 0xc0, 0xf7, 0x50, 0xbc, 0x99, 0x3e, 0x9b, 0x7a, 0x4d, 0x11, - 0xe2, 0x8b, 0xe4, 0x16, 0xeb, 0x4d, 0x2e, 0x5b, 0x6a, 0xfd, 0x8b, 0x1e, - 0xbf, 0xea, 0x9e, 0x6b, 0x4b, 0xdd, 0x93, 0xb8, 0x51, 0x14, 0x28, 0x87, - 0x02, 0x1d, 0xd6, 0xaa, 0xef, 0x56, 0xef, 0x2f, 0xfb, 0x55, 0x1b, 0xcc, - 0x0e, 0xf9, 0x31, 0x1b, 0xdb, 0xee, 0x3a, 0xe9, 0x36, 0x7a, 0x35, 0x77, - 0x55, 0xbe, 0xd5, 0x61, 0xb2, 0x53, 0xb3, 0x97, 0x71, 0x15, 0xca, 0xd4, - 0x2a, 0xe2, 0xb4, 0x0d, 0x89, 0x03, 0x05, 0x2d, 0xb4, 0xf2, 0x78, 0x9b, - 0x6d, 0x49, 0x38, 0x1d, 0xed, 0x36, 0xbe, 0xae, 0xa0, 0x66, 0x60, 0x9a, - 0x07, 0x7a, 0xee, 0x34, 0x88, 0xcf, 0x59, 0x65, 0x21, 0x77, 0xab, 0xcb, - 0x3c, 0xc6, 0xcc, 0x4b, 0x01, 0x52, 0x21, 0x80, 0xc8, 0xba, 0x3c, 0x4e, - 0xde, 0xa3, 0xb8, 0xf1, 0xf8, 0x16, 0xeb, 0x11, 0x9d, 0xd8, 0xbe, 0x67, - 0xf5, 0xde, 0xd5, 0x81, 0x88, 0x29, 0x47, 0xb4, 0x02, 0x43, 0xbc, 0x28, - 0x8d, 0x66, 0xdb, 0x23, 0x57, 0x52, 0x71, 0x0b, 0x4a, 0x86, 0xfc, 0x6c, - 0x28, 0xcb, 0x78, 0x3b, 0x15, 0x3e, 0x77, 0x69, 0x39, 0xe3, 0xad, 0xa3, - 0x82, 0x1f, 0x85, 0xbb, 0x4b, 0x36, 0x5b, 0xe8, 0x71, 0x22, 0x61, 0xcf, - 0x2f, 0xf6, 0x6a, 0x61, 0x6c, 0xfe, 0x53, 0x3d, 0xdf, 0xbf, 0x71, 0x9e, - 0xaa, 0x8f, 0x86, 0x61, 0xe5, 0x1e, 0xaa, 0x43, 0xd1, 0x7c, 0x9b, 0xb1, - 0xd2, 0x7b, 0xd5, 0x34, 0x57, 0x72, 0xdf, 0x2d, 0x6b, 0x56, 0x5e, 0x4f, - 0x6f, 0xab, 0x58, 0x37, 0x7e, 0x7c, 0xc6, 0x20, 0x15, 0x4a, 0xde, 0xfe, - 0x1d, 0x02, 0x12, 0x9d, 0x4c, 0x1b, 0x89, 0x14, 0xfe, 0xc9, 0x49, 0x64, - 0xeb, 0x7e, 0x1d, 0xa8, 0x72, 0x4c, 0x33, 0xcd, 0xb9, 0xc5, 0xef, 0x78, - 0x39, 0x2a, 0xd6, 0x1a, 0xfc, 0x8a, 0x1a, 0x26, 0xf9, 0x2e, 0x71, 0xdc, - 0x4d, 0x43, 0x1e, 0x2b, 0x8f, 0x1b, 0x5f, 0xf9, 0x70, 0x22, 0xb1, 0x20, - 0xfb, 0x93, 0x0a, 0x8f, 0x64, 0xd3, 0x56, 0xcf, 0x07, 0xd2, 0x74, 0x85, - 0xff, 0x04, 0x0a, 0x3b, 0x4d, 0xd2, 0xb8, 0x92, 0xae, 0x20, 0x74, 0x38, - 0x31, 0x41, 0x9a, 0xd2, 0xa7, 0x25, 0xa6, 0xad, 0xc0, 0xcf, 0xb4, 0x50, - 0xe8, 0xc4, 0xab, 0x2a, 0x8e, 0x77, 0x7f, 0x7b, 0xde, 0x9e, 0x9f, 0x10, - 0x7a, 0x97, 0x16, 0x32, 0xff, 0x93, 0x7f, 0x0a, 0x8f, 0xeb, 0xd7, 0x7d, - 0x0b, 0x92, 0x1e, 0x0f, 0xaf, 0x15, 0x69, 0x01, 0xd0, 0x51, 0x44, 0x70, - 0xc0, 0x91, 0x84, 0x8e, 0x3c, 0xaa, 0x64, 0x57, 0xf6, 0xbe, 0x15, 0xb5, - 0x1c, 0x76, 0x2b, 0x32, 0x33, 0xa5, 0xc5, 0x63, 0x14, 0xce, 0xad, 0x4f, - 0x7d, 0x65, 0xb2, 0x8e, 0x87, 0x0d, 0x0b, 0xa8, 0x91, 0xa3, 0xda, 0x2f, - 0x26, 0x2f, 0xab, 0x13, 0x28, 0xee, 0x3a, 0xaf, 0xd2, 0x1e, 0x1a, 0xaa, - 0xac, 0x3e, 0xc6, 0x90, 0x66, 0x4a, 0x57, 0xea, 0x78, 0x04, 0x9f, 0xe7, - 0x28, 0x75, 0xaa, 0x50, 0x7b, 0x27, 0xd4, 0xb7, 0x77, 0x69, 0xbc, 0xbb, - 0x60, 0xf9, 0x00, 0xfc, 0x30, 0xe2, 0x08, 0xb2, 0xb7, 0x5b, 0xbb, 0x08, - 0x20, 0x6c, 0x17, 0xdf, 0x20, 0x4b, 0xb1, 0xa5, 0xca, 0xa0, 0xa2, 0x1c, - 0xaa, 0x6a, 0x8d, 0x3c, 0x19, 0x76, 0xdc, 0x8b, 0xa8, 0x30, 0x3a, 0x59, - 0xfb, 0x1d, 0x5d, 0xf9, 0x49, 0x9b, 0xca, 0xae, 0xc4, 0x4e, 0x87, 0x03, - 0xf0, 0xb5, 0xa6, 0x3c, 0x1d, 0xf6, 0x3f, 0x2c, 0xe3, 0x8b, 0x6d, 0x97, - 0x75, 0x92, 0x3f, 0xa0, 0xa4, 0x64, 0xc2, 0xf7, 0x4c, 0xf8, 0x3c, 0x0f, - 0xc0, 0x44, 0x21, 0x27, 0x86, 0xb4, 0x7c, 0x09, 0xed, 0xe3, 0x6a, 0x58, - 0x94, 0xe7, 0x2d, 0xf0, 0x1d, 0x22, 0x41, 0xfe, 0x14, 0x2d, 0xbf, 0xb5, - 0x47, 0xbe, 0x70, 0x4f, 0xa2, 0x83, 0x95, 0xf9, 0x68, 0xec, 0x64, 0x4c, - 0xf1, 0x9e, 0x20, 0xad, 0xc4, 0x63, 0x22, 0x68, 0xaf, 0x71, 0x8f, 0xde, - 0x37, 0xbb, 0x37, 0xbf, 0xf1, 0x26, 0x59, 0xb7, 0xb5, 0xef, 0x69, 0x55, - 0x3f, 0x60, 0xd0, 0x9a, 0x9e, 0x97, 0x96, 0x56, 0xa0, 0x10, 0x52, 0x12, - 0x49, 0x5c, 0xea, 0x5f, 0x1b, 0x09, 0xd7, 0x3e, 0x54, 0x51, 0x29, 0xe7, - 0x68, 0x22, 0xa2, 0x35, 0xf7, 0xae, 0x96, 0x79, 0xfa, 0xd0, 0x4f, 0xbe, - 0x2b, 0x87, 0xfd, 0xf8, 0xc7, 0x71, 0xfb, 0xfc, 0xda, 0x20, 0x28, 0xbe, - 0xa4, 0xe8, 0xb5, 0xdd, 0x4f, 0x7b, 0xe6, 0x3d, 0xfd, 0x29, 0x7d, 0x1d, - 0x68, 0x69, 0xc4, 0x73, 0x4b, 0xc1, 0xba, 0xfd, 0x55, 0xa2, 0xea, 0xca, - 0xd8, 0x39, 0xeb, 0x98, 0xe9, 0x46, 0x16, 0xf8, 0x60, 0x6c, 0x43, 0x32, - 0x8f, 0x50, 0xf8, 0xaa, 0xe8, 0xbe, 0x5e, 0xa7, 0xf5, 0xc6, 0x7a, 0x84, - 0xca, 0x92, 0x90, 0xd0, 0xc9, 0x73, 0xe1, 0x11, 0x1c, 0x09, 0xaf, 0xa3, - 0x93, 0xb2, 0x27, 0xbf, 0x0d, 0xba, 0x9d, 0x15, 0xd4, 0xd5, 0x19, 0xf0, - 0x37, 0xe7, 0x76, 0xb6, 0xf4, 0x7a, 0xa5, 0x5b, 0x14, 0x20, 0x8b, 0x61, - 0x63, 0xb1, 0x9d, 0x90, 0x90, 0xc4, 0x2d, 0xee, 0x58, 0xf3, 0x7f, 0x57, - 0x27, 0xf9, 0xb5, 0x70, 0x77, 0x6d, 0x25, 0x7d, 0x92, 0x12, 0xdb, 0x0e, - 0x74, 0x7a, 0x8e, 0x82, 0xa8, 0x85, 0x17, 0x1d, 0x69, 0xdb, 0xc4, 0x39, - 0xcd, 0x7e, 0x20, 0x38, 0x1c, 0x2f, 0xca, 0x31, 0x9d, 0xee, 0xda, 0xf1, - 0xf3, 0xe0, 0x86, 0xf4, 0x09, 0x8c, 0x4f, 0xf5, 0x59, 0x1c, 0x3d, 0x30, - 0x21, 0xa1, 0xed, 0xbe, 0x48, 0x96, 0x38, 0xc3, 0x95, 0x93, 0xce, 0xf9, - 0xe2, 0xa3, 0xb5, 0x98, 0xb5, 0x7d, 0x6a, 0x9d, 0xa4, 0xcd, 0xa0, 0xf7, - 0x3f, 0x7c, 0x1b, 0x5e, 0x23, 0x8a, 0x6b, 0x99, 0x24, 0x22, 0x3a, 0x27, - 0xa0, 0x94, 0xe3, 0xdc, 0xf6, 0x5c, 0xb3, 0x30, 0xd5, 0xad, 0xec, 0x7c, - 0xc3, 0x11, 0xe0, 0x17, 0x6d, 0xbd, 0x04, 0xb1, 0x88, 0x88, 0x0a, 0x10, - 0x77, 0x86, 0xc1, 0x31, 0xb5, 0x3f, 0x35, 0x2b, 0x40, 0xde, 0xb6, 0xd1, - 0x2d, 0x14, 0x60, 0x19, 0x84, 0x58, 0xe1, 0x68, 0x01, 0xc5, 0x9f, 0x12, - 0xf9, 0xbb, 0x8d, 0xfe, 0x4a, 0x32, 0xc6, 0x43, 0xc6, 0xd3, 0x0b, 0x0e, - 0xd1, 0x1a, 0xc5, 0x77, 0x5c, 0x5a, 0x1a, 0xe9, 0xca, 0xcd, 0x59, 0xb3, - 0x29, 0xc8, 0x20, 0xca, 0xea, 0x56, 0xf9, 0x93, 0x26, 0xac, 0xc4, 0x45, - 0x69, 0x7b, 0x87, 0x8a, 0x11, 0x45, 0x40, 0xcb, 0xb4, 0xce, 0x7d, 0x23, - 0x5e, 0x08, 0x7e, 0xf4, 0x78, 0xf0, 0x9e, 0x69, 0xeb, 0xd4, 0xf5, 0x57, - 0xb4, 0x7c, 0xac, 0xcb, 0x34, 0x75, 0xa7, 0x23, 0x84, 0xb5, 0x75, 0x7d, - 0x0d, 0xeb, 0x94, 0xd6, 0x8a, 0xf6, 0x6b, 0x49, 0xde, 0xc6, 0x1d, 0x27, - 0xcf, 0x28, 0xf9, 0x48, 0x1f, 0xea, 0xb1, 0xc9, 0xeb, 0x27, 0x53, 0x4f, - 0x50, 0xea, 0xaa, 0x80, 0x38, 0x45, 0x0d, 0x33, 0xf3, 0xd7, 0x88, 0x26, - 0x1e, 0xbb, 0x91, 0x2f, 0x54, 0xcf, 0x99, 0xc9, 0x4d, 0x19, 0xe7, 0x8a, - 0xc5, 0x59, 0xd3, 0xc3, 0xf3, 0x9e, 0xb3, 0x22, 0x66, 0xcc, 0x60, 0xb0, - 0x7a, 0x8b, 0xdb, 0xc2, 0xb1, 0x05, 0xf5, 0x66, 0x56, 0x6a, 0x7e, 0xef, - 0x25, 0xef, 0xf9, 0x34, 0x6b, 0xa8, 0x9e, 0x36, 0x25, 0xce, 0x66, 0x31, - 0x0b, 0xe1, 0xe4, 0xa3, 0x10, 0xf1, 0x82, 0xa9, 0x5d, 0x74, 0x8b, 0x4b, - 0xbc, 0xb2, 0x39, 0x2c, 0xe4, 0x4d, 0xe1, 0xb4, 0xfc, 0x31, 0x27, 0xaf, - 0xd8, 0x2d, 0x30, 0x94, 0x56, 0x7a, 0x09, 0x2f, 0x26, 0xb5, 0xa2, 0xf4, - 0x43, 0xe9, 0x6d, 0x93, 0xb6, 0xfe, 0xe2, 0x05, 0x45, 0xe1, 0x2d, 0xac, - 0x8a, 0x42, 0xeb, 0x2c, 0x86, 0xc7, 0xc1, 0xd1, 0x61, 0x8c, 0x5c, 0xcb, - 0x5b, 0x3f, 0x34, 0xa5, 0x3f, 0x9a, 0x0d, 0x0d, 0x6a, 0xf6, 0x9d, 0x76, - 0x17, 0x97, 0x47, 0x38, 0x63, 0xe3, 0xdc, 0xbb, 0x85, 0x34, 0xa8, 0x04, - 0x20, 0x68, 0x82, 0x2b, 0x75, 0xd7, 0x28, 0xaa, 0x52, 0x4e, 0xcb, 0xa6, - 0x28, 0x81, 0x37, 0x36, 0xce, 0x61, 0xe4, 0x27, 0x2e, 0x64, 0x37, 0x31, - 0x04, 0x9f, 0x4a, 0xe4, 0xc3, 0xff, 0xaf, 0xf4, 0xb1, 0x11, 0x88, 0xac, - 0xd9, 0x50, 0x89, 0xbe, 0x2d, 0xdf, 0xdd, 0x55, 0x21, 0xa3, 0x2d, 0xa0, - 0x30, 0xf2, 0x69, 0x51, 0xaf, 0x26, 0x7c, 0x1c, 0xf2, 0xfa, 0x57, 0xde, - 0x26, 0x65, 0x5a, 0x13, 0x9e, 0xfe, 0xcc, 0x45, 0xa9, 0x2c, 0x18, 0x41, - 0xf7, 0xc7, 0x3c, 0xab, 0x03, 0xe9, 0x7c, 0x96, 0xbc, 0xd9, 0x50, 0x50, - 0xa3, 0x81, 0xd9, 0xcb, 0x89, 0x68, 0xf2, 0x00, 0x61, 0x45, 0xd4, 0x34, - 0xf6, 0x99, 0x18, 0x9e, 0xb7, 0x21, 0x41, 0x58, 0x5e, 0x9c, 0x79, 0xb4, - 0x9a, 0xe6, 0x16, 0xa2, 0x9b, 0xb8, 0x1b, 0x06, 0x11, 0x57, 0xcf, 0xd1, - 0x60, 0xeb, 0xab, 0x83, 0xc9, 0x30, 0x0b, 0x39, 0xd2, 0x0c, 0xc7, 0x09, - 0x1b, 0x74, 0x6e, 0x4a, 0x4d, 0xcf, 0x9a, 0xc4, 0x62, 0xcf, 0xa7, 0x4f, - 0x8d, 0xf3, 0x50, 0x38, 0xe7, 0x2b, 0xba, 0xd6, 0x92, 0x46, 0x86, 0x1b, - 0x8d, 0x9d, 0x12, 0x76, 0x63, 0xa2, 0xd9, 0x56, 0xa0, 0xc5, 0x02, 0xdc, - 0x08, 0xfb, 0x24, 0x9a, 0x90, 0x11, 0x02, 0x0e, 0x23, 0x69, 0xe7, 0x7c, - 0xa5, 0xa6, 0xd5, 0xa8, 0x54, 0xc9, 0x62, 0xc5, 0x10, 0x4f, 0x59, 0xa2, - 0xa2, 0xed, 0x50, 0x01, 0x40, 0x92, 0xc0, 0x83, 0x6e, 0x66, 0x82, 0x36, - 0xfe, 0xde, 0x86, 0x5f, 0xf9, 0x0a, 0xec, 0xa8, 0x7b, 0xc1, 0x0e, 0x54, - 0x61, 0x6a, 0xf4, 0x98, 0x53, 0x4d, 0x4e, 0x6e, 0x95, 0xc7, 0x3f, 0x3c, - 0xdc, 0x63, 0xac, 0x9f, 0x6f, 0x21, 0x14, 0x21, 0xec, 0xb0, 0xba, 0x6a, - 0x16, 0x57, 0xcb, 0xa5, 0x04, 0x8b, 0xbf, 0x4f, 0x1f, 0xe7, 0x53, 0xa0, - 0x75, 0x71, 0x5f, 0x3c, 0x27, 0xef, 0xb9, 0x0d, 0x3c, 0xf2, 0xef, 0xfc, - 0x19, 0xfd, 0x17, 0x30, 0x75, 0x21, 0xd4, 0xcd, 0x32, 0x5a, 0xc7, 0x45, - 0x29, 0x1b, 0x59, 0x47, 0xae, 0x71, 0x90, 0x7f, 0x2b, 0x43, 0x91, 0xd8, - 0x12, 0x72, 0xce, 0x1a, 0x3c, 0x09, 0x34, 0x3e, 0xc1, 0x25, 0xd4, 0xdc, - 0xa9, 0x09, 0x4b, 0x44, 0xbc, 0xa6, 0xdf, 0xc9, 0x6c, 0x8a, 0x38, 0x13, - 0xf4, 0x82, 0xbe, 0xa2, 0x91, 0xe7, 0x7d, 0x73, 0x3d, 0x36, 0x32, 0x77, - 0x8e, 0xe3, 0x7e, 0x4e, 0xbe, 0xa4, 0x5f, 0x10, 0x60, 0xa2, 0x79, 0x04, - 0xe9, 0xb5, 0xf5, 0xff, 0xb9, 0x20, 0x03, 0x2e, 0xff, 0x0c, 0x2c, 0x59, - 0x61, 0x0e, 0xc0, 0x53, 0x6f, 0x4a, 0x6b, 0x23, 0x45, 0x86, 0x39, 0x86, - 0x15, 0x81, 0x92, 0xa1, 0x92, 0xd4, 0x67, 0xd5, 0x34, 0xde, 0x41, 0xeb, - 0xf1, 0xa9, 0xc2, 0x33, 0x6e, 0x19, 0xf8, 0x72, 0x3d, 0x88, 0xb1, 0xc4, - 0xbe, 0x6c, 0x3f, 0xc1, 0x6b, 0xc8, 0x76, 0xbc, 0xd6, 0xe6, 0xfb, 0x57, - 0xb2, 0xac, 0xe5, 0xa1, 0xcc, 0x54, 0x9c, 0xae, 0x8e, 0xe5, 0xdd, 0x32, - 0x39, 0x33, 0xa7, 0x2d, 0x2f, 0x09, 0xd3, 0xb0, 0xfb, 0x76, 0x64, 0x8e, - 0x99, 0x07, 0x3b, 0x68, 0x51, 0x9d, 0xf2, 0x29, 0xb0, 0x4f, 0x65, 0xdd, - 0x84, 0xd9, 0x7b, 0xe1, 0xdc, 0x3d, 0xf9, 0xca, 0x23, 0x41, 0x54, 0x4a, - 0x39, 0xef, 0x3e, 0x34, 0xbb, 0x89, 0x75, 0x16, 0xf7, 0xe9, 0x58, 0xb8, - 0x41, 0x0a, 0xf9, 0xa1, 0x35, 0xac, 0x2c, 0x25, 0x87, 0x61, 0xe4, 0x27, - 0x2e, 0x64, 0x37, 0x31, 0x69, 0x82, 0xa4, 0xfd, 0x6e, 0xed, 0x86, 0x79, - 0x74, 0x70, 0xfe, 0x20, 0xb0, 0xf5, 0xba, 0xe3, 0x2f, 0x04, 0x0d, 0x8c, - 0x7f, 0x01, 0xa9, 0x32, 0xf6, 0xd7, 0x68, 0x20, 0xc6, 0x79, 0x0f, 0xa8, - 0x72, 0x4c, 0x33, 0xcd, 0xb9, 0xc5, 0xef, 0x78, 0x39, 0x2a, 0xd6, 0x1a, - 0xfc, 0x8a, 0x1a, 0x26, 0xc7, 0xf2, 0x6c, 0xb6, 0xe3, 0x36, 0x5f, 0x82, - 0xf2, 0x01, 0xcc, 0x3a, 0x85, 0xb6, 0x4b, 0xe0, 0xde, 0x3d, 0x51, 0x2e, - 0x9f, 0x4c, 0x24, 0x1d, 0x01, 0x74, 0x01, 0x82, 0xa6, 0x80, 0xff, 0x89, - 0xd4, 0xc8, 0x9d, 0x00, 0xda, 0xdb, 0xff, 0xdf, 0x52, 0xae, 0x28, 0xde, - 0xd9, 0xd9, 0xbe, 0xf9, 0x8f, 0x4d, 0x9b, 0x59, 0x5c, 0x54, 0x53, 0xa5, - 0x96, 0x01, 0xd7, 0x34, 0xcc, 0x79, 0x24, 0x19, 0xa2, 0xe2, 0x04, 0x85, - 0x8d, 0xb2, 0xf9, 0x9f, 0xfe, 0x69, 0xe8, 0x99, 0x26, 0xf0, 0x86, 0x8d, - 0xb5, 0x2d, 0x6c, 0x06, 0x52, 0xe6, 0x92, 0x79, 0x32, 0x76, 0x81, 0xfc, - 0x3a, 0x78, 0x79, 0x11, 0x04, 0x9d, 0x4f, 0x07, 0xf3, 0xf7, 0xa4, 0x4c, - 0x12, 0x9c, 0x6e, 0x15, 0x6b, 0xe6, 0xeb, 0xed, 0xa6, 0x22, 0x1f, 0x07, - 0x0c, 0x77, 0x97, 0x55, 0xa9, 0xab, 0x37, 0x3d, 0x26, 0x7d, 0xd4, 0x1b, - 0x9a, 0x3c, 0x4d, 0x04, 0xba, 0x39, 0x08, 0x3d, 0x01, 0x74, 0x01, 0x82, - 0xa6, 0x80, 0xff, 0x89, 0x84, 0x4c, 0x68, 0x0c, 0x0c, 0x35, 0x92, 0xd7, - 0x83, 0xec, 0xd5, 0x86, 0x3e, 0x9b, 0x17, 0x17, 0xb6, 0xdb, 0xe0, 0xc0, - 0x2a, 0x26, 0x37, 0x4a, 0xb0, 0x3b, 0x44, 0x70, 0x5b, 0xe0, 0x52, 0xc9, - 0x67, 0x1a, 0xdb, 0xa1, 0x7e, 0xad, 0x18, 0x68, 0xb2, 0xd7, 0x87, 0x57, - 0xcb, 0x2a, 0x6c, 0x0e, 0x0a, 0x10, 0x9f, 0x57, 0x16, 0x9c, 0xbe, 0x07, - 0x59, 0xd5, 0x48, 0xf8, 0xee, 0xf2, 0x81, 0x5f, 0x1c, 0x3e, 0xbd, 0xdf, - 0xef, 0xa3, 0x72, 0x11, 0x54, 0xc8, 0x94, 0xe6, 0x16, 0x96, 0x19, 0x2e, - 0x0e, 0x0d, 0x9e, 0xf4, 0x36, 0x04, 0x2c, 0x82, 0x2d, 0x4d, 0xf2, 0xce, - 0xf4, 0x7f, 0x6c, 0x2f, 0x5b, 0xc4, 0x43, 0xe5, 0xc6, 0x3c, 0x8c, 0xb3, - 0xb1, 0xc0, 0xba, 0x54, 0x0b, 0xc0, 0x31, 0xef, 0x1e, 0x77, 0xb7, 0xcd, - 0x52, 0x3e, 0x3c, 0x4a, 0xb5, 0xa2, 0x08, 0xa7, 0x6c, 0x79, 0x39, 0xc5, - 0x7d, 0xb5, 0x00, 0xf0, 0xeb, 0xbb, 0x2d, 0x16, 0xc5, 0x64, 0x0e, 0x67, - 0xff, 0xba, 0x7c, 0x0e, 0x1f, 0x72, 0xbf, 0x39, 0xb8, 0xb4, 0x8c, 0x00, - 0x2b, 0x33, 0x5b, 0xfb, 0x6d, 0x2e, 0x36, 0xc3, 0x90, 0xbc, 0x2d, 0xc8, - 0x31, 0xcb, 0xd5, 0x60, 0x16, 0x5a, 0xd0, 0x65, 0x6d, 0xb8, 0xee, 0x36, - 0xd8, 0x2e, 0x4f, 0x42, 0xc1, 0x41, 0x1c, 0x8e, 0x18, 0xdd, 0x53, 0x5e, - 0x65, 0x92, 0x5d, 0x04, 0x2e, 0x94, 0x26, 0xf5, 0x0d, 0x88, 0x41, 0x51, - 0x77, 0x8a, 0x5c, 0x74, 0xe9, 0xbd, 0xab, 0x85, 0x3c, 0xfa, 0x8a, 0xaf, - 0x1c, 0x80, 0x8d, 0xdc, 0x07, 0x51, 0x97, 0xbc, 0x13, 0x79, 0x08, 0x37, - 0xd2, 0x03, 0x6d, 0x7e, 0xe4, 0x9f, 0xd4, 0x3b, 0x85, 0xa3, 0x34, 0x26, - 0x3d, 0x36, 0x6b, 0x5e, 0x58, 0x82, 0x49, 0x6a, 0x10, 0x23, 0xfd, 0xfa, - 0x3a, 0x6e, 0xd4, 0xb9, 0x94, 0x7f, 0x05, 0x3d, 0xa0, 0x68, 0x6d, 0x3d, - 0xc7, 0xc2, 0xd3, 0x2a, 0xce, 0x99, 0x88, 0x43, 0xea, 0x1f, 0x3d, 0x1c, - 0x95, 0x09, 0xbf, 0x16, 0xa5, 0xbf, 0xeb, 0x86, 0x3e, 0xd6, 0x21, 0x68, - 0x3e, 0x6a, 0x51, 0x60, 0x47, 0xcf, 0xff, 0x86, 0x4c, 0xfd, 0xb3, 0x83, - 0xa5, 0xa6, 0x25, 0x5c, 0xbf, 0x8b, 0x1a, 0xe4, 0xf7, 0xb9, 0xe3, 0x89, - 0xd1, 0xcc, 0xa3, 0x64, 0x6a, 0x7e, 0xb7, 0x60, 0x11, 0x6e, 0xc9, 0xf5, - 0xca, 0x39, 0x75, 0x56, 0x4e, 0xf9, 0x8c, 0xb3, 0xa6, 0x78, 0xde, 0xe3, - 0x90, 0x8b, 0xb7, 0x52, 0x98, 0xe6, 0xb6, 0xf8, 0xe8, 0xcb, 0xb7, 0x9f, - 0xa2, 0x08, 0x75, 0x91, 0x2d, 0x3e, 0xe5, 0x9c, 0xd2, 0x10, 0x4f, 0xa6, - 0x08, 0xaa, 0x77, 0xbc, 0x3d, 0x5f, 0xb4, 0x35, 0x6f, 0x97, 0x9c, 0xcf, - 0x40, 0x3b, 0xf5, 0x5a, 0x3f, 0x4f, 0x6a, 0xa2, 0xa9, 0x38, 0x66, 0x7e, - 0x3c, 0x80, 0x3b, 0x97, 0x92, 0x7e, 0xec, 0xbe, 0x2d, 0x45, 0x5a, 0xfe, - 0xb0, 0x20, 0xb8, 0x20, 0x85, 0xcc, 0x43, 0x01, 0x18, 0x7b, 0xe6, 0x0b, - 0xb3, 0x18, 0x79, 0xb1, 0xbe, 0x5f, 0x26, 0x84, 0xf5, 0xc0, 0x51, 0x58, - 0x15, 0xd3, 0x7c, 0xba, 0x69, 0x39, 0x8b, 0x85, 0xba, 0x80, 0x33, 0x96, - 0x94, 0x45, 0x7b, 0xf2, 0xfd, 0x2b, 0x50, 0x8c, 0xfc, 0xcd, 0x2d, 0x19, - 0xdb, 0x83, 0x95, 0xd6, 0xeb, 0x36, 0x06, 0x23, 0xa4, 0x8f, 0xe7, 0x00, - 0x63, 0x0f, 0x01, 0x83, 0xcb, 0x2b, 0x1a, 0x50, 0xe5, 0xe3, 0x91, 0x35, - 0x33, 0x5a, 0xc7, 0x2b, 0xb3, 0x18, 0x79, 0xb1, 0xbe, 0x5f, 0x26, 0x84, - 0xf5, 0xc0, 0x51, 0x58, 0xd5, 0x6d, 0x13, 0x6e, 0x25, 0x05, 0x29, 0x27, - 0xda, 0x12, 0xdd, 0x17, 0xa4, 0x88, 0xa2, 0x8a, 0xb4, 0x23, 0xfd, 0x72, - 0x54, 0x3e, 0xa0, 0xdb, 0x1d, 0x67, 0xb8, 0xd2, 0x68, 0xd7, 0xcb, 0xf3, - 0x6e, 0xc4, 0x15, 0xcd, 0xca, 0x2f, 0x07, 0x9d, 0x25, 0x2f, 0x10, 0xae, - 0x31, 0xa5, 0x46, 0x04, 0x13, 0x06, 0x88, 0x93, 0x08, 0x2e, 0x9e, 0x3d, - 0x28, 0x50, 0xa5, 0x0d, 0x66, 0x4c, 0x70, 0xe7, 0x95, 0xcb, 0x6d, 0xfe, - 0xec, 0x83, 0x10, 0x22, 0x9b, 0xa1, 0xdd, 0x69, 0xad, 0x55, 0xb0, 0xfa, - 0xd9, 0xd8, 0x41, 0xfe, 0xd0, 0xdd, 0xe1, 0xec, 0xcb, 0xc4, 0x58, 0xd0, - 0xf0, 0x2a, 0xe4, 0x91, 0xbe, 0x54, 0x4b, 0x59, 0x50, 0xa4, 0x2d, 0x8e, - 0x72, 0x80, 0x68, 0xf7, 0xbb, 0xa6, 0x2e, 0x86, 0xe9, 0x8b, 0x45, 0x4d, - 0x89, 0x49, 0xa4, 0xd6, 0x1b, 0x1e, 0x14, 0x72, 0xd4, 0x53, 0x26, 0xee, - 0x75, 0x2a, 0x0e, 0x59, 0xf9, 0xfb, 0x03, 0x5b, 0x2a, 0xf6, 0xe2, 0x3b, - 0xaa, 0xc6, 0xcd, 0xb8, 0xc1, 0x87, 0x5a, 0x4d, 0xbf, 0x54, 0x92, 0xc8, - 0x03, 0x0d, 0x14, 0x72, 0xd4, 0x53, 0x26, 0xee, 0x56, 0xf7, 0x09, 0x17, - 0xb3, 0xb9, 0x04, 0xc7, 0x3a, 0x99, 0x77, 0x54, 0x0f, 0x2f, 0x48, 0x5d, - 0xcc, 0x8c, 0x45, 0x4d, 0xb9, 0x45, 0x92, 0xc8, 0x03, 0x0d, 0x14, 0x72, - 0xd4, 0x53, 0x26, 0xee, 0x72, 0xe3, 0x1e, 0xff, 0xa0, 0x2e, 0x1b, 0x98, - 0x56, 0xaa, 0xc8, 0xa8, 0x8f, 0x0b, 0x54, 0x25, 0x25, 0x28, 0x28, 0x88, - 0x0b, 0x24, 0x44, 0x9a, 0x18, 0x03, 0x6b, 0xe3, 0x87, 0x0a, 0x98, 0xf0, - 0xd3, 0xb1, 0xe9, 0x55, 0x48, 0x82, 0x31, 0x57, 0x08, 0xe0, 0x55, 0xa2, - 0x5c, 0x97, 0xe4, 0xbb, 0x44, 0x37, 0xe9, 0x06, 0xde, 0x08, 0x07, 0xc2, - 0xac, 0x5f, 0x74, 0xfe, 0x4c, 0x52, 0x63, 0x7d, 0x13, 0x64, 0x60, 0x69, - 0x49, 0x52, 0x79, 0xe2, 0x4a, 0xc2, 0x9d, 0xfb, 0x03, 0xbe, 0x9c, 0x01, - 0x6d, 0x45, 0x5c, 0x98, 0x40, 0xd2, 0x15, 0xcf, 0x94, 0x9a, 0x00, 0x01, - 0x6d, 0x00, 0x1e, 0xb5, 0x52, 0x46, 0x54, 0x43, 0xcd, 0x3a, 0x4a, 0x19, - 0x93, 0x68, 0xbe, 0xca, 0xd5, 0x2e, 0x0d, 0xcb, 0xfd, 0xe6, 0x86, 0x6d, - 0x37, 0x2b, 0x98, 0xf6, 0xf5, 0x46, 0x58, 0xe0, 0x87, 0x11, 0xef, 0x2e, - 0xf0, 0x24, 0x87, 0xc0, 0x3a, 0xc7, 0xe0, 0x91, 0xda, 0xd2, 0xc9, 0xa4, - 0x0e, 0x2b, 0xb1, 0xd7, 0xbf, 0x9d, 0x6b, 0x4a, 0xa4, 0xad, 0x2e, 0x1d, - 0xc0, 0xe0, 0x68, 0xba, 0x63, 0xdb, 0x89, 0xbf, 0x17, 0x6e, 0xc7, 0x76, - 0x0a, 0xcd, 0x63, 0x64, 0x58, 0x76, 0x03, 0xb2, 0xb9, 0xb5, 0xcf, 0x7d, - 0xbb, 0x8a, 0xa8, 0xb2, 0x26, 0x95, 0x0f, 0xb2, 0x05, 0xaa, 0x9b, 0xce, - 0x95, 0x23, 0xc2, 0x69, 0x81, 0x74, 0x1e, 0xa1, 0x2e, 0x8d, 0x5d, 0x75, - 0xca, 0x95, 0x5b, 0xda, 0xdd, 0x7a, 0x88, 0xac, 0x84, 0x0b, 0x1f, 0x5e, - 0x65, 0x47, 0x89, 0xd2, 0x10, 0x43, 0x11, 0x74, 0x69, 0x19, 0x56, 0x05, - 0xea, 0x21, 0xce, 0x4f, 0xa6, 0xf5, 0xa8, 0x6b, 0x71, 0xd5, 0x46, 0x43, - 0xbd, 0x3c, 0xa2, 0x12, 0xe8, 0xa4, 0x7c, 0x41, 0x1c, 0xd9, 0x39, 0x6a, - 0x38, 0x11, 0x33, 0xf4, 0x86, 0x37, 0x91, 0xf1, 0x87, 0xc7, 0x10, 0x5f, - 0x18, 0x6c, 0x6c, 0xd2, 0x74, 0x9f, 0xa3, 0x0f, 0x92, 0x69, 0x02, 0x13, - 0xfc, 0x1d, 0x98, 0x9a, 0x2a, 0x56, 0x83, 0x98, 0xba, 0xf7, 0x98, 0x51, - 0xb8, 0x2c, 0x84, 0x2f, 0x00, 0x0d, 0x09, 0xbe, 0x9b, 0xe3, 0xda, 0xf1, - 0x7b, 0x4f, 0x78, 0x9b, 0xfd, 0x89, 0x5c, 0x42, 0xcf, 0x64, 0x4b, 0x49, - 0x26, 0xc9, 0x1e, 0x12, 0x7f, 0x3e, 0x40, 0x4e, 0xd8, 0x52, 0x1d, 0xf9, - 0xe5, 0x8b, 0x4c, 0x5a, 0x8e, 0x4e, 0xa3, 0x9b, 0x52, 0x1b, 0x67, 0x72, - 0xd4, 0x53, 0x26, 0xee, 0xf7, 0x47, 0x60, 0x48, 0x90, 0x8d, 0x43, 0xcc, - 0x9b, 0x09, 0x9c, 0x1a, 0xb7, 0x46, 0xe2, 0x2e, 0x0a, 0xa7, 0xcc, 0x0c, - 0xe7, 0xb2, 0x75, 0xea, 0x51, 0x38, 0x59, 0x55, 0x44, 0x5e, 0x26, 0x64, - 0x24, 0x0e, 0x06, 0x1b, 0xd5, 0xcf, 0x12, 0x26, 0xe3, 0xe2, 0x3d, 0x84, - 0xe4, 0x06, 0x25, 0x24, 0x2b, 0x43, 0x45, 0xdc, 0xa2, 0x19, 0xc7, 0x79, - 0x09, 0xed, 0x9b, 0x4e, 0x4c, 0x07, 0x6b, 0x06, 0x2d, 0x22, 0xd1, 0x19, - 0x98, 0xe4, 0xc6, 0xd0, 0x78, 0xc4, 0x50, 0x2e, 0x4b, 0x93, 0x5e, 0x90, - 0x0d, 0x8b, 0x21, 0x5f, 0xab, 0xaf, 0xb2, 0x2f, 0x13, 0xab, 0xb8, 0x32, - 0x1d, 0xb1, 0xfc, 0x4e, 0x79, 0x60, 0x8c, 0x24, 0x15, 0x56, 0x77, 0xa4, - 0xd5, 0x22, 0xa0, 0xa3, 0x30, 0x7c, 0x78, 0x7d, 0x1d, 0x05, 0xb0, 0x16, - 0xdf, 0x81, 0xcd, 0xe9, 0x56, 0x3e, 0x27, 0x6b, 0xd2, 0x0d, 0x62, 0x47, - 0xa4, 0x07, 0x42, 0xfc, 0xf5, 0x1f, 0x9e, 0xf0, 0x8a, 0x1a, 0x60, 0x37, - 0xcd, 0x47, 0xe7, 0xd3, 0x20, 0x9e, 0x9a, 0x19, 0xc5, 0x63, 0xbd, 0xaf, - 0x55, 0x86, 0x5a, 0x9d, 0x69, 0xd6, 0xb0, 0x1d, 0xb9, 0x8e, 0xac, 0x5b, - 0xc8, 0xdd, 0x98, 0x3d, 0x5f, 0x8f, 0x4d, 0x68, 0xc6, 0x7e, 0xd9, 0x6b, - 0x2f, 0x16, 0xc7, 0xf0, 0xaf, 0x12, 0x4c, 0x93, 0xe4, 0xb3, 0x83, 0xca, - 0x41, 0x2a, 0xdf, 0x0f, 0xcd, 0xe1, 0xa9, 0xcf, 0xc4, 0x43, 0xeb, 0xe4, - 0x37, 0x97, 0x41, 0xa5, 0xcb, 0xeb, 0xc0, 0x8b, 0x08, 0x04, 0xa0, 0x71, - 0x97, 0x59, 0x11, 0xb2, 0x13, 0x7c, 0xb4, 0x31, 0x01, 0xc7, 0xca, 0x7b, - 0x39, 0x79, 0x61, 0x0f, 0x16, 0x78, 0x4d, 0x37, 0xc0, 0xa1, 0x77, 0x0a, - 0x50, 0xf7, 0x80, 0x72, 0x0a, 0xb1, 0xf8, 0xcc, 0x04, 0x99, 0x9b, 0x29, - 0xce, 0x96, 0x61, 0x6a, 0x2d, 0x62, 0x67, 0xf3, 0x1a, 0x52, 0xdd, 0x07, - 0x8e, 0xd1, 0x5b, 0x44, 0xad, 0xd4, 0x1f, 0x34, 0x79, 0x3f, 0x2d, 0xf6, - 0xbb, 0xcc, 0xe3, 0x79, 0x58, 0xb9, 0x6c, 0x9a, 0xc6, 0x5d, 0xff, 0x6e, - 0xb3, 0x91, 0x48, 0xf2, 0x81, 0xaf, 0x67, 0x85, 0x7b, 0x2e, 0x73, 0x5b, - 0x35, 0xe7, 0x0c, 0xe8, 0x3e, 0x3a, 0x50, 0x01, 0x10, 0x89, 0x5a, 0xb5, - 0xeb, 0x08, 0x4d, 0xbd, 0x2c, 0xde, 0xe3, 0xcd, 0xbe, 0xfe, 0x25, 0x5f, - 0x1f, 0xb8, 0x41, 0x26, 0x84, 0x39, 0x63, 0x6f, 0x99, 0xce, 0x45, 0xac, - 0xbb, 0x24, 0x88, 0x03, 0x42, 0xaa, 0x61, 0xf8, 0x14, 0xa0, 0x4a, 0x3b, - 0x13, 0x40, 0x43, 0xb6, 0x7f, 0x49, 0x06, 0x9a, 0x2b, 0x69, 0xc1, 0xff, - 0xe7, 0x30, 0x35, 0xe5, 0x4a, 0xe8, 0x12, 0xfc, 0xc2, 0xef, 0x9e, 0xc8, - 0x32, 0xc6, 0xe4, 0xbf, 0x1d, 0x91, 0xef, 0x56, 0xa7, 0x31, 0xb2, 0xce, - 0xd2, 0xd9, 0xaa, 0x16, 0x64, 0xcb, 0x8b, 0x99, 0xbd, 0xd9, 0xf9, 0x70, - 0xaf, 0xeb, 0xc0, 0x07, 0xf0, 0x44, 0x83, 0xb4, 0xcd, 0xd1, 0x91, 0xfa, - 0x68, 0x84, 0x5f, 0x02, 0x01, 0x29, 0x52, 0xb5, 0x92, 0xcb, 0x31, 0x56, - 0xae, 0x59, 0xf8, 0x43, 0x2b, 0xc5, 0xaa, 0xea, 0x57, 0x8d, 0xc0, 0x2f, - 0x91, 0xcd, 0xac, 0x87, 0x24, 0x62, 0x22, 0xbe, 0xce, 0x6c, 0x4c, 0x54, - 0x64, 0x90, 0xbb, 0x9b, 0x13, 0x41, 0x0b, 0xc0, 0x85, 0x2b, 0xf1, 0xff, - 0xa8, 0xa1, 0x2f, 0xa8, 0x68, 0xcd, 0x41, 0xe5, 0xae, 0xab, 0x5a, 0x70, - 0xd1, 0x68, 0xbb, 0x5a, 0x26, 0xad, 0xef, 0x38, 0xe0, 0x85, 0xc7, 0x09, - 0x5a, 0x31, 0xa5, 0x08, 0x7e, 0x87, 0x3e, 0xee, 0xf0, 0xf6, 0x3a, 0xaf, - 0x88, 0xb4, 0xd6, 0xa3, 0xc0, 0x50, 0x71, 0x61, 0xd2, 0xeb, 0xbe, 0xb6, - 0x49, 0x74, 0xf3, 0x07, 0xfa, 0xd6, 0x7d, 0x38, 0xc5, 0xcc, 0xa8, 0x16, - 0xc8, 0xf4, 0xbd, 0xe8, 0xff, 0x9d, 0x17, 0x4f, 0x06, 0x01, 0x4e, 0x17, - 0xcb, 0xb6, 0x55, 0x1b, 0xf4, 0x67, 0x70, 0x68, 0x1a, 0x4c, 0xd6, 0x3f, - 0xc0, 0x80, 0x97, 0x45, 0xc9, 0x44, 0x6b, 0x76, 0x08, 0xcb, 0x6f, 0xe9, - 0x5c, 0x4f, 0xe5, 0x20, 0x51, 0x9d, 0x7e, 0x30, 0x8c, 0x22, 0x8f, 0x50, - 0x06, 0xd5, 0xf6, 0xe7, 0xd2, 0x5b, 0x93, 0x28, 0xb1, 0xdf, 0x05, 0x14, - 0xdc, 0xd3, 0x16, 0xd4, 0x4a, 0x3c, 0xb1, 0x0b, 0x6c, 0xcf, 0x23, 0x6f, - 0xc2, 0x72, 0x29, 0x07, 0xf5, 0xbe, 0xb8, 0x2e, 0x16, 0x86, 0xbf, 0x04, - 0x45, 0xcf, 0x89, 0x28, 0xc7, 0x18, 0x17, 0xbc, 0x3b, 0x32, 0x03, 0x10, - 0x07, 0xb2, 0x1e, 0xab, 0x3b, 0xd4, 0x11, 0x09, 0x5f, 0xce, 0x32, 0x40, - 0xef, 0x4b, 0xda, 0x7b, 0x7b, 0xef, 0xba, 0x51, 0xbe, 0x9a, 0x43, 0x4a, - 0x6e, 0x37, 0xbc, 0x76, 0x27, 0x93, 0x73, 0xcc, 0x53, 0x77, 0xa9, 0xe7, - 0x10, 0xce, 0x56, 0xe9, 0x45, 0x7d, 0xe7, 0x7f, 0x8e, 0xda, 0xb4, 0x0b, - 0x52, 0xd0, 0x52, 0x4b, 0xbb, 0x49, 0xe8, 0xf2, 0xf5, 0x42, 0xfc, 0x60, - 0x25, 0x60, 0xe4, 0x76, 0x2b, 0x74, 0x53, 0x66, 0x44, 0xdf, 0xac, 0xdc, - 0x52, 0xf0, 0x93, 0x96, 0x98, 0x65, 0x79, 0xe5, 0xcb, 0xe9, 0x3b, 0x21, - 0x84, 0x64, 0xdf, 0x81, 0xbd, 0xd1, 0x0e, 0x8e, 0x0e, 0xf1, 0xac, 0xc1, - 0xcd, 0xa0, 0x52, 0x19, 0x0c, 0x41, 0x89, 0x33, 0x4a, 0x02, 0xca, 0x26, - 0x0e, 0xb2, 0xa2, 0xc2, 0x8d, 0x49, 0xae, 0x53, 0x6a, 0xde, 0xf6, 0x98, - 0xbe, 0x99, 0x84, 0xf8, 0xed, 0x8d, 0xcb, 0xf1, 0x56, 0x96, 0x3a, 0xff, - 0x1c, 0x40, 0xfc, 0xde, 0x53, 0xae, 0x1b, 0x94, 0xdb, 0x96, 0x7b, 0x43, - 0x94, 0x1d, 0x82, 0x08, 0x34, 0x00, 0xa7, 0xcd, 0xeb, 0xe1, 0x51, 0x63, - 0xb6, 0xa3, 0xb2, 0x5d, 0x5f, 0xca, 0x5a, 0x4d, 0x83, 0xc3, 0xc3, 0x2b, - 0x76, 0x65, 0x17, 0x9d, 0x8f, 0xde, 0x78, 0x70, 0xf3, 0xd9, 0xab, 0x60, - 0x91, 0xec, 0x5b, 0x52, 0x69, 0xfb, 0xee, 0xe7, 0xf6, 0x7b, 0xd8, 0x04, - 0xe0, 0x74, 0x80, 0xef, 0xde, 0x9c, 0x51, 0x25, 0xcc, 0xbe, 0x87, 0x5b, - 0x97, 0xa2, 0x78, 0x80, 0xfd, 0x19, 0x67, 0xf9, 0xe1, 0xfc, 0x80, 0x16, - 0xbe, 0x53, 0xf3, 0x27, 0x54, 0xad, 0xe2, 0xe2, 0x6e, 0x91, 0x43, 0x06, - 0x88, 0xa2, 0x59, 0x00, 0x1c, 0x92, 0xf6, 0x4d, 0x3d, 0x2f, 0x4e, 0x72, - 0x24, 0xc4, 0x58, 0x51, 0xbd, 0xb9, 0x51, 0x5f, 0x1c, 0x92, 0xf6, 0x4d, - 0x3d, 0x2f, 0x4e, 0x72, 0x24, 0xc4, 0x58, 0x51, 0xbd, 0xb9, 0x51, 0x5f, - 0x1c, 0x92, 0xf6, 0x4d, 0x3d, 0x2f, 0x4e, 0x72, 0x26, 0xcf, 0x1e, 0x6d, - 0xeb, 0xeb, 0x65, 0xc7, 0x5d, 0x57, 0x15, 0x48, 0x83, 0x03, 0x33, 0x38, - 0x69, 0xde, 0x81, 0x89, 0xef, 0x9d, 0x98, 0x74, 0xf0, 0x22, 0xa7, 0xb6, - 0x7d, 0xd6, 0xd7, 0xe0, 0x89, 0x11, 0x99, 0xa6, 0xe1, 0x93, 0xf4, 0x38, - 0xf9, 0x16, 0x0d, 0xa5, 0x60, 0x13, 0x28, 0xa1, 0xe0, 0x33, 0xcf, 0x08, - 0x73, 0x9e, 0x28, 0xc4, 0xa9, 0xd7, 0xa7, 0x2f, 0x06, 0xda, 0x48, 0x05, - 0xd6, 0xe0, 0x29, 0x5d, 0x2d, 0xc5, 0x0c, 0x22, 0x7b, 0x8d, 0x44, 0x75, - 0xa9, 0xe8, 0x1f, 0x4f, 0x59, 0x83, 0xfd, 0x44, 0x30, 0x7d, 0xa0, 0xdc, - 0xe8, 0x8f, 0xe4, 0x78, 0xd4, 0xf7, 0x88, 0xd0, 0x47, 0x08, 0xf2, 0x21, - 0x4c, 0xc7, 0xc8, 0xb8, 0xb0, 0x01, 0x5e, 0x7c, 0x93, 0x73, 0x98, 0x85, - 0x37, 0xeb, 0x92, 0xfb, 0x35, 0x43, 0xd7, 0x40, 0x59, 0x5d, 0x02, 0x6e, - 0x25, 0x6d, 0x0a, 0x11, 0x2c, 0xbc, 0xa7, 0xe0, 0x3d, 0x1c, 0xd7, 0x40, - 0x59, 0x5d, 0x02, 0x6e, 0x25, 0x6d, 0x0a, 0x11, 0x7b, 0x2c, 0x7f, 0xb8, - 0xb6, 0x26, 0x11, 0xc4, 0x85, 0xd8, 0x03, 0xf8, 0x90, 0x3d, 0x84, 0x47, - 0xba, 0x74, 0x69, 0x9b, 0xb6, 0xa6, 0xb4, 0x5d, 0x6b, 0xc6, 0xf8, 0xc1, - 0x45, 0xd8, 0x2c, 0x42, 0xda, 0x6a, 0xc2, 0x26, 0x6b, 0xcf, 0xfd, 0x9d, - 0x15, 0x4c, 0xaf, 0x64, 0xba, 0x3b, 0xf8, 0x3a, 0xed, 0x6a, 0xc2, 0x26, - 0x6b, 0xcf, 0xfd, 0x9d, 0x15, 0x4c, 0xaf, 0x64, 0xba, 0x3b, 0xf8, 0x3a, - 0xed, 0x6a, 0xc2, 0x26, 0x6b, 0xcf, 0xfd, 0x9d, 0x15, 0x4c, 0xaf, 0x64, - 0xba, 0x3b, 0xf8, 0x3a, 0xb7, 0x5e, 0x6d, 0x85, 0x79, 0xfb, 0x41, 0xac, - 0xb9, 0x6c, 0xaa, 0x21, 0xb2, 0xed, 0xfc, 0x24, 0x34, 0x37, 0x8c, 0xbc, - 0xc3, 0x1c, 0x45, 0xc3, 0xcb, 0x0b, 0xe6, 0x64, 0x92, 0xe8, 0x6c, 0x18, - 0x9d, 0xb5, 0xe0, 0xd8, 0xc2, 0xe1, 0x15, 0xf0, 0xcf, 0xb6, 0x02, 0x6b, - 0x24, 0x36, 0x76, 0x97, 0xca, 0x77, 0x4a, 0x1d, 0xca, 0xb2, 0x0e, 0xf5, - 0x17, 0x94, 0x6d, 0x53, 0x72, 0x32, 0x7a, 0x01, 0xce, 0xbd, 0x39, 0x8e, - 0x57, 0x3d, 0x39, 0x72, 0x8a, 0x28, 0x54, 0x4a, 0xc2, 0xc8, 0xeb, 0x1a, - 0x48, 0xf0, 0x79, 0xa4, 0x7c, 0x5d, 0xb9, 0x67, 0x94, 0x04, 0x35, 0xd6, - 0x38, 0x29, 0x52, 0x10, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x7d, 0xb1, 0x88, 0x15, 0x63, 0x34, 0x31, 0x1d, - 0x17, 0x05, 0x05, 0xe0, 0xe3, 0xf0, 0x16, 0x1d, 0x52, 0x94, 0x19, 0xec, - 0xe3, 0x06, 0xdd, 0x64, 0xb1, 0xdd, 0x48, 0x92, 0xcc, 0x07, 0x6e, 0x17, - 0xf1, 0x5a, 0xdf, 0xc3, 0x21, 0xf3, 0xd2, 0xb9, 0x03, 0xb4, 0xdf, 0x25, - 0xea, 0xc6, 0x19, 0xa8, 0x53, 0x80, 0xd4, 0xd9, 0x9b, 0x84, 0xc2, 0x35, - 0xca, 0x5a, 0xc4, 0x6d, 0xfa, 0x33, 0x7d, 0xb0, 0x1a, 0x96, 0x7a, 0xee, - 0xf7, 0x1b, 0x4e, 0xb3, 0x00, 0x71, 0x71, 0xdd, 0xd8, 0x75, 0xfe, 0xf4, - 0xd4, 0x3e, 0x2f, 0xc4, 0xff, 0x43, 0xda, 0x99, 0xa8, 0x05, 0xe2, 0x42, - 0x0f, 0x57, 0x71, 0x52, 0x8e, 0x30, 0xe3, 0x80, 0xd1, 0x12, 0xa5, 0x31, - 0xb5, 0xb8, 0x6b, 0x53, 0xc7, 0xd9, 0x47, 0x93, 0x17, 0x3d, 0x81, 0x9f, - 0x46, 0x23, 0xde, 0x54, 0xcc, 0xa4, 0xc8, 0xd8, 0x72, 0x3a, 0xd4, 0x89, - 0x3e, 0x75, 0xaf, 0xf6, 0x97, 0x75, 0x45, 0x68, 0x62, 0x65, 0xfa, 0xeb, - 0x47, 0xae, 0x5e, 0x09, 0x2a, 0x71, 0x06, 0x9a, 0x3a, 0x79, 0x1d, 0x9a, - 0x77, 0x5a, 0x28, 0x64, 0xad, 0x33, 0x00, 0x02, 0x5e, 0xf3, 0x92, 0x6d, - 0x4f, 0x2c, 0x1e, 0x7c, 0xfe, 0x79, 0x8c, 0xc4, 0x59, 0x1f, 0x5f, 0xf8, - 0xdb, 0x0a, 0x29, 0x1d, 0x12, 0xf3, 0x50, 0x54, 0x79, 0x5a, 0x12, 0xf1, - 0xf8, 0x8e, 0x36, 0x92, 0x84, 0x4b, 0x88, 0x16, 0xdc, 0xdd, 0x81, 0x51, - 0x3f, 0xac, 0xda, 0x44, 0xae, 0xf0, 0x89, 0x26, 0x26, 0xbf, 0x5d, 0xcb, - 0xdc, 0xc4, 0xe7, 0xbf, 0x75, 0xfd, 0x26, 0x4a, 0x00, 0xc9, 0xd7, 0x42, - 0x5a, 0xd7, 0x9c, 0xbe, 0x67, 0xc9, 0x80, 0x42, 0xfd, 0x5c, 0xe7, 0x65, - 0x02, 0xef, 0x06, 0xdd, 0xe6, 0xf7, 0x2b, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x6f, 0xb2, 0x99, 0x08, 0xb3, 0x9e, 0xfe, 0xce, 0xcf, 0x13, 0x15, 0xd4, - 0x5f, 0x05, 0xdf, 0xea, 0x30, 0x86, 0x6a, 0xa4, 0xdc, 0x8e, 0x20, 0xdf, - 0x21, 0x4e, 0xbb, 0xc5, 0x1f, 0xa6, 0x4f, 0x4c, 0xc9, 0x5d, 0x83, 0x98, - 0x7e, 0x2c, 0xc2, 0xa4, 0x1a, 0xf0, 0x2a, 0xf4, 0x15, 0x0f, 0xde, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x52, 0x45, 0xbc, 0xb1, - 0x84, 0x24, 0x38, 0x62, 0x13, 0x40, 0x95, 0x49, 0xe0, 0xdc, 0xac, 0x32, - 0x1a, 0xf0, 0x2a, 0xf4, 0x9b, 0x20, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x77, 0xb9, 0x4c, 0x51, - 0x94, 0xf8, 0xd5, 0xcf, 0x9b, 0x77, 0x10, 0x86, 0x4b, 0x14, 0xd4, 0x39, - 0xdb, 0xfc, 0xd3, 0xc4, 0xc1, 0xf6, 0xf4, 0x81, 0xe8, 0x5a, 0xc0, 0x2f, - 0x6d, 0x38, 0x91, 0xd8, 0xdd, 0x0a, 0x2b, 0xe2, 0xfd, 0x0c, 0x60, 0x7b, - 0xbe, 0x80, 0xc0, 0xc1, 0x16, 0x7c, 0x6e, 0x51, 0x1b, 0xd9, 0x47, 0x60, - 0x71, 0x17, 0x15, 0x8f, 0x82, 0x20, 0x07, 0x69, 0x02, 0x69, 0x1f, 0x71, - 0x02, 0x46, 0x9b, 0x5c, 0xf6, 0xbf, 0x5b, 0xc7, 0xea, 0x6f, 0xe2, 0xee, - 0xb0, 0x1b, 0xc0, 0x19, 0x38, 0xed, 0xb7, 0x98, 0x45, 0x00, 0x59, 0xec, - 0x3e, 0xac, 0x2c, 0xaa, 0x99, 0x9a, 0x8f, 0xec, 0x13, 0xdc, 0x99, 0x32, - 0x69, 0x4c, 0x29, 0x5f, 0xa2, 0x31, 0xfc, 0x30, 0x25, 0xfa, 0x6c, 0xc1, - 0x70, 0x01, 0xf0, 0xdb, 0xa7, 0x04, 0x7c, 0x7d, 0xab, 0x00, 0xf3, 0xa5, - 0x4f, 0x03, 0xc7, 0x0e, 0xb7, 0x2a, 0x2b, 0xf4, 0x9b, 0xd5, 0xb8, 0x67, - 0xc0, 0x60, 0x99, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x09, 0x0e, 0xcf, 0x16, - 0xbe, 0x6b, 0xb2, 0x19, 0x8c, 0x77, 0x04, 0x82, 0x56, 0xa3, 0xa0, 0x7d, - 0xa6, 0x30, 0x49, 0x37, 0x72, 0x15, 0x5b, 0x26, 0xa2, 0xa0, 0xd8, 0x04, - 0x72, 0xbc, 0x33, 0xea, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0x95, 0x97, 0xff, 0xce, 0x7f, 0xc5, 0x17, 0x24, - 0xa6, 0xc8, 0x54, 0xd7, 0x3a, 0xb2, 0x47, 0x77, 0x1e, 0x12, 0x9e, 0x3e, - 0x20, 0x98, 0xe7, 0xbc, 0x60, 0xa3, 0x39, 0xd7, 0xf9, 0x1c, 0xf5, 0xb9, - 0xf1, 0x87, 0x63, 0x43, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xff, 0x97, 0xff, 0xce, 0x2e, 0x04, 0xb9, 0x9f, - 0xa7, 0x4f, 0x8b, 0xf5, 0x85, 0xbb, 0x8e, 0xe3, 0x89, 0xd4, 0xf5, 0xd7, - 0x30, 0x9a, 0xda, 0xfc, 0xd7, 0xa9, 0xd7, 0x4f, 0x48, 0x31, 0x62, 0xaf, - 0x7f, 0xe1, 0x30, 0x67, 0xaa, 0x1c, 0xa2, 0x2f, 0xf9, 0x66, 0xea, 0x57, - 0x75, 0xf2, 0x67, 0xdd, 0x8b, 0xee, 0xb7, 0x9a, 0xd4, 0x84, 0xe8, 0x0e, - 0x3d, 0xb6, 0xd4, 0x72, 0xc3, 0x6d, 0x8a, 0xa6, 0x8e, 0x37, 0x76, 0x2d, - 0x43, 0x3b, 0x37, 0xc5, 0x48, 0x40, 0xcc, 0x05, 0x0c, 0x1b, 0x15, 0x29, - 0x17, 0x33, 0x3b, 0x61, 0xcb, 0xf3, 0x89, 0xaa, 0x1c, 0x45, 0xeb, 0xe5, - 0x75, 0xf8, 0x14, 0x3c, 0xc3, 0x9a, 0x2f, 0x95, 0x0c, 0x12, 0x3a, 0x81, - 0x04, 0x97, 0xd2, 0x55, 0x71, 0xa2, 0x55, 0x38, 0xf0, 0xfb, 0x82, 0x0e, - 0x6f, 0x3d, 0xfd, 0x53, 0x51, 0x5a, 0x04, 0x86, 0x5a, 0x84, 0x41, 0x7c, - 0xee, 0x16, 0x0f, 0x06, 0x1c, 0x77, 0xd5, 0xff, 0xad, 0x5b, 0x86, 0x1c, - 0x8a, 0xdc, 0x7a, 0x31, 0x1a, 0x91, 0x88, 0xd7, 0x93, 0xe7, 0x49, 0xac, - 0x03, 0x1f, 0x52, 0x9e, 0x84, 0xa6, 0xdd, 0x52, 0x1b, 0xcb, 0xfe, 0xcb, - 0x84, 0xd1, 0xa3, 0xd4, 0x8b, 0x10, 0x0b, 0xed, 0x32, 0x98, 0x25, 0x38, - 0x1c, 0x2e, 0x39, 0x3e, 0x0a, 0xe0, 0x3a, 0xfc, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x21, 0xcc, 0xe9, 0x41, - 0x57, 0xeb, 0x63, 0x56, 0xe9, 0xd4, 0x46, 0xf5, 0x09, 0xe9, 0x8e, 0x1c, - 0x55, 0xf6, 0x26, 0x82, 0x8e, 0x17, 0x56, 0xfd, 0xb5, 0x6f, 0x8d, 0xba, - 0xed, 0x21, 0x78, 0x83, 0xa3, 0xe1, 0xcf, 0xd2, 0xcb, 0x8f, 0x17, 0xf9, - 0x28, 0x1e, 0xa8, 0x13, 0x82, 0x53, 0x5d, 0xd0, 0x06, 0x40, 0xbc, 0x9a, - 0xd1, 0x5a, 0x2b, 0x73, 0x94, 0x5d, 0x58, 0x6d, 0xa5, 0xb4, 0xdc, 0x14, - 0xa1, 0xf6, 0x4c, 0x8e, 0xf9, 0x5f, 0xe4, 0x80, 0x53, 0x4f, 0x32, 0x72, - 0x21, 0x63, 0xe4, 0xa5, 0x0b, 0x58, 0x62, 0xed, 0x3b, 0x7d, 0xae, 0x2e, - 0x84, 0x63, 0x67, 0x70, 0x52, 0x34, 0x82, 0xfe, 0xbb, 0x0d, 0xe6, 0x77, - 0x92, 0xfb, 0xa7, 0xdd, 0x7c, 0x2e, 0xd7, 0x69, 0x02, 0x17, 0x96, 0x14, - 0x7a, 0x1b, 0x58, 0xb9, 0x65, 0x3b, 0x88, 0x9f, 0x61, 0xc5, 0x83, 0x0d, - 0x91, 0xaa, 0x91, 0x49, 0x00, 0x00, 0x00, 0x90, 0x04, 0x01, 0x00, 0x5f, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x32, 0x30, 0x31, - 0x39, 0x30, 0x34, 0x31, 0x35, 0x31, 0x35, 0x34, 0x31, 0x34, 0x39, 0x00, - 0xec, 0xde, 0x01, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_firmware.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_firmware.h deleted file mode 100644 index 468d046917..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_firmware.h +++ /dev/null @@ -1,38171 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7615_FirmwareImage[] = { - 0x1d, 0x1b, 0x24, 0x01, 0x79, 0x21, 0x5f, 0x2e, 0x2d, 0x88, 0xf7, 0x0c, - 0x5d, 0x05, 0xb7, 0x2a, 0xad, 0xa2, 0x27, 0x31, 0x94, 0x6e, 0x52, 0x7a, - 0x96, 0xf9, 0x71, 0xf0, 0x69, 0x3b, 0xb5, 0x3f, 0x5a, 0x0c, 0xf4, 0x67, - 0x23, 0x06, 0xc9, 0xd1, 0xc4, 0xc6, 0x77, 0xa3, 0x37, 0xa0, 0xb7, 0x91, - 0x3b, 0xc1, 0xfe, 0x5e, 0x92, 0x36, 0xff, 0x8f, 0xc8, 0x88, 0x60, 0xa4, - 0x5f, 0x65, 0x21, 0x6f, 0x48, 0xe1, 0x57, 0xb8, 0x6b, 0xc8, 0x19, 0x3b, - 0xaa, 0x06, 0xd7, 0x0f, 0xea, 0xc0, 0x36, 0x38, 0x92, 0x02, 0x35, 0xcf, - 0xd9, 0x0f, 0x8f, 0x07, 0x8b, 0xf3, 0xa7, 0x73, 0xc1, 0x82, 0x60, 0x85, - 0x1f, 0x1e, 0xf2, 0x9c, 0x3a, 0x7e, 0xd3, 0x89, 0x10, 0x46, 0xd5, 0x27, - 0x0f, 0x75, 0x28, 0xbe, 0xfd, 0xb6, 0xf7, 0x3d, 0x2a, 0x3e, 0x45, 0x9d, - 0x66, 0xcc, 0x58, 0x2d, 0xaa, 0x65, 0x75, 0x1f, 0x48, 0x6f, 0xe6, 0x1d, - 0x55, 0x3e, 0x36, 0x40, 0x87, 0xec, 0xf9, 0x8c, 0xc3, 0xa6, 0x16, 0x52, - 0x21, 0x64, 0x38, 0x38, 0xbf, 0x9d, 0xf3, 0x35, 0xe9, 0x42, 0x99, 0xa6, - 0x73, 0xdd, 0x34, 0xd0, 0x08, 0xf2, 0xf3, 0xb8, 0xa4, 0x20, 0xb5, 0x0a, - 0xcb, 0x3c, 0x57, 0x6c, 0x50, 0x64, 0xe1, 0xe4, 0xe9, 0x02, 0x8c, 0xf3, - 0x82, 0xc7, 0xbe, 0xef, 0xc2, 0x37, 0xd1, 0x72, 0x6e, 0xad, 0x88, 0x58, - 0xb0, 0xe6, 0xc3, 0x39, 0xf6, 0x59, 0xc6, 0x57, 0x86, 0x5d, 0x73, 0xef, - 0xb9, 0x78, 0xe1, 0x77, 0xe6, 0x61, 0xe0, 0x90, 0x62, 0x79, 0xa5, 0x32, - 0x57, 0xde, 0xd7, 0x00, 0xf4, 0xe3, 0xf5, 0x66, 0xd0, 0x44, 0x6b, 0xf7, - 0x1a, 0x94, 0x06, 0xe0, 0x3c, 0xf7, 0x56, 0x0c, 0x60, 0x38, 0x8d, 0x3d, - 0x6d, 0xbb, 0x26, 0xc2, 0x19, 0x37, 0xa7, 0xc8, 0x56, 0x6c, 0xec, 0xe9, - 0xe6, 0x39, 0x02, 0x27, 0x37, 0x5f, 0x6b, 0x9f, 0x79, 0x07, 0x4a, 0x45, - 0xd2, 0xeb, 0x65, 0xb2, 0x67, 0xf4, 0x0d, 0x4d, 0x4f, 0x18, 0xb1, 0xbf, - 0xf6, 0xe7, 0x94, 0xfe, 0x73, 0x32, 0x27, 0xd2, 0x45, 0x93, 0xaa, 0xab, - 0x73, 0x68, 0x86, 0x8a, 0x8d, 0x25, 0x0c, 0x18, 0x26, 0x3d, 0x88, 0x4b, - 0xff, 0xfd, 0xfa, 0x59, 0x14, 0xc5, 0x7d, 0x9f, 0x55, 0x01, 0x35, 0x72, - 0x41, 0x95, 0x16, 0xbe, 0xb5, 0x33, 0xdb, 0xb4, 0x54, 0x1f, 0xdc, 0xa7, - 0x11, 0xbf, 0xdb, 0x5d, 0x1b, 0x67, 0xca, 0xe7, 0x57, 0xbe, 0x19, 0x77, - 0x66, 0x20, 0x51, 0x4b, 0xaf, 0x36, 0x56, 0x56, 0x16, 0x45, 0x43, 0xdd, - 0xda, 0xd2, 0x70, 0xe3, 0x73, 0xee, 0x13, 0xa7, 0x68, 0xd4, 0xc4, 0x33, - 0x38, 0x02, 0xf1, 0xd9, 0x09, 0x76, 0x92, 0x96, 0x53, 0x87, 0xf1, 0x36, - 0x5f, 0x29, 0x63, 0x66, 0x5c, 0xdc, 0x46, 0x3e, 0xab, 0x59, 0xb9, 0xb6, - 0xb4, 0x1f, 0x9e, 0x1e, 0x08, 0xfc, 0xd8, 0x6a, 0x72, 0xb1, 0xec, 0xe1, - 0xe2, 0xbe, 0xf7, 0xc6, 0x88, 0x0d, 0x9f, 0xf0, 0x81, 0x40, 0x29, 0xb4, - 0xb4, 0xf9, 0xd4, 0x8e, 0xe1, 0x06, 0xc6, 0x51, 0xde, 0x64, 0x2b, 0x76, - 0xc5, 0xb9, 0xd5, 0xe4, 0x93, 0x89, 0xc3, 0x31, 0x8d, 0x6b, 0x94, 0x15, - 0x3a, 0x0e, 0xd4, 0xe0, 0xb1, 0xbd, 0xa9, 0x87, 0x48, 0xb6, 0xac, 0x68, - 0x86, 0x90, 0x63, 0xa1, 0x8d, 0x8c, 0xbe, 0x9e, 0xdc, 0xe5, 0xb9, 0xc9, - 0x81, 0xee, 0x8e, 0x91, 0xad, 0x7f, 0x44, 0x16, 0xab, 0xba, 0x99, 0x21, - 0x42, 0x1d, 0x73, 0x7c, 0x98, 0x1b, 0x1a, 0x0a, 0x39, 0x02, 0x82, 0xa7, - 0x47, 0xbf, 0x78, 0xef, 0x27, 0x7e, 0x22, 0x45, 0x72, 0x06, 0x6c, 0xe7, - 0xf4, 0x30, 0x72, 0x20, 0x85, 0x3c, 0x69, 0x96, 0xc9, 0x9e, 0xe3, 0x12, - 0x15, 0x93, 0xe3, 0xf0, 0x07, 0xd7, 0x15, 0x72, 0x02, 0x26, 0x87, 0x94, - 0xad, 0x73, 0x35, 0x8e, 0xcd, 0x93, 0x62, 0x8f, 0x27, 0x8f, 0x5e, 0xf9, - 0x60, 0xaa, 0xd0, 0xcc, 0xa9, 0x85, 0xa4, 0x48, 0xa9, 0xe0, 0x20, 0x65, - 0x76, 0xa6, 0xef, 0x49, 0xd6, 0x65, 0xbb, 0xf1, 0xb4, 0xdd, 0xa6, 0x45, - 0x0d, 0x22, 0x3a, 0x38, 0x9d, 0xc6, 0xbc, 0x94, 0xda, 0x07, 0xfe, 0x53, - 0xce, 0xb9, 0x7b, 0xf3, 0x55, 0x00, 0x4b, 0x88, 0xd5, 0x14, 0xc3, 0xc7, - 0x0e, 0xff, 0x86, 0xee, 0xe7, 0x64, 0xde, 0x54, 0x53, 0xad, 0x02, 0xf3, - 0xe8, 0x8f, 0x11, 0x1a, 0xc9, 0x68, 0xc5, 0x38, 0x3b, 0x71, 0xdd, 0x56, - 0xb3, 0x4c, 0x34, 0x65, 0xd3, 0x87, 0x76, 0x30, 0x42, 0xc8, 0x29, 0xd0, - 0x02, 0x07, 0x9b, 0xc2, 0xa1, 0x65, 0x29, 0x9d, 0x18, 0x37, 0xd3, 0xe4, - 0xe0, 0x87, 0x63, 0x9c, 0x59, 0xb3, 0x40, 0x2f, 0x16, 0xa3, 0xb2, 0x53, - 0x81, 0x99, 0xbe, 0x1f, 0x09, 0x50, 0xc0, 0x4f, 0x7e, 0x8a, 0x02, 0x03, - 0x7c, 0x32, 0x29, 0x7c, 0xc7, 0x8a, 0xf2, 0x31, 0x1a, 0xc4, 0x56, 0xe9, - 0x80, 0x17, 0xce, 0x9b, 0x99, 0x0f, 0x3b, 0x83, 0x49, 0xfd, 0xf5, 0x7b, - 0x1f, 0xd3, 0xff, 0x87, 0x30, 0x93, 0xf4, 0xc6, 0x74, 0xec, 0x52, 0xed, - 0x28, 0x03, 0xd0, 0xee, 0x8f, 0x38, 0xbb, 0xe7, 0xa9, 0x08, 0x64, 0xb0, - 0xc4, 0x28, 0x9e, 0x5a, 0x3c, 0xda, 0x38, 0xf6, 0x59, 0x3f, 0x48, 0xb8, - 0xd9, 0xda, 0x87, 0x91, 0x08, 0xb5, 0x51, 0x01, 0x34, 0x65, 0x56, 0x1e, - 0xd1, 0x23, 0x78, 0x6f, 0xd7, 0xf4, 0x9a, 0x13, 0xe1, 0x58, 0x09, 0x2b, - 0x66, 0x24, 0xb8, 0xdd, 0x31, 0xe1, 0x86, 0xde, 0x0f, 0x32, 0x24, 0xa2, - 0xb0, 0xb5, 0x68, 0x33, 0xf8, 0x57, 0xcc, 0x07, 0xfe, 0x9b, 0x63, 0x58, - 0x86, 0x9f, 0xed, 0x1b, 0x44, 0x1c, 0x13, 0x6e, 0xef, 0x75, 0x0b, 0xea, - 0x3d, 0x7c, 0x8d, 0xcd, 0x19, 0x16, 0x96, 0xdf, 0x8a, 0x5f, 0x9d, 0x59, - 0x3b, 0x95, 0x14, 0x69, 0x2f, 0x19, 0xd0, 0x85, 0xfb, 0x76, 0x00, 0x99, - 0x39, 0xef, 0x28, 0x83, 0x2e, 0xf4, 0x8f, 0xf1, 0x12, 0x45, 0x69, 0xa7, - 0xa6, 0xca, 0xfe, 0xf0, 0xf3, 0xf0, 0xff, 0xfc, 0xa7, 0xde, 0xba, 0xfe, - 0xdf, 0xa9, 0x06, 0x18, 0x9e, 0xf2, 0x28, 0x20, 0xb0, 0x02, 0x2f, 0xdd, - 0xba, 0xe2, 0x62, 0xe2, 0x42, 0xf6, 0xfc, 0x30, 0xad, 0x32, 0x51, 0x19, - 0x2a, 0x25, 0x38, 0x97, 0xc5, 0xa0, 0xed, 0xff, 0xa4, 0x1a, 0x49, 0x73, - 0x7b, 0xe5, 0x6c, 0x0a, 0xf0, 0xdf, 0xe9, 0xc0, 0x0f, 0xfa, 0xa4, 0xce, - 0xce, 0x9e, 0x7d, 0xa1, 0x8f, 0xae, 0x6e, 0xad, 0x59, 0xa7, 0x8f, 0xfa, - 0xe4, 0xa0, 0xf4, 0xc3, 0x35, 0x40, 0x6d, 0xec, 0xd2, 0xd2, 0xb6, 0xdc, - 0x9f, 0x0d, 0xe7, 0x54, 0x62, 0x15, 0xd8, 0xc6, 0x4d, 0x37, 0xf8, 0x00, - 0x1e, 0x82, 0xa0, 0x4f, 0x48, 0x08, 0x5e, 0xc1, 0x43, 0x0f, 0x55, 0x9b, - 0xb3, 0xa8, 0xc0, 0xf5, 0x76, 0x58, 0x47, 0xa1, 0x40, 0xea, 0x8f, 0x8a, - 0x8e, 0xb6, 0x66, 0xf2, 0x04, 0x27, 0xb3, 0xae, 0xf5, 0xc5, 0xd7, 0xa0, - 0xe7, 0x28, 0xe1, 0xbc, 0x5c, 0x0c, 0xf8, 0x7c, 0x02, 0xc2, 0xdd, 0x1f, - 0x80, 0x07, 0x4e, 0x9d, 0x99, 0x0f, 0x3b, 0x83, 0x49, 0xfd, 0xf5, 0x7b, - 0x55, 0x2a, 0x2b, 0x88, 0x0a, 0x38, 0x46, 0xc1, 0xf3, 0xfe, 0xea, 0x7f, - 0x5e, 0x99, 0x6d, 0x0d, 0xc5, 0xce, 0x74, 0x62, 0x21, 0x1a, 0x83, 0x9d, - 0x16, 0xa8, 0x23, 0x0c, 0xbc, 0x9d, 0xb8, 0x51, 0x92, 0x92, 0x2e, 0x40, - 0xad, 0x32, 0x78, 0x1b, 0x76, 0x68, 0x95, 0xa4, 0x60, 0x1f, 0xd4, 0xa3, - 0x48, 0x5e, 0x09, 0x37, 0x59, 0x63, 0x02, 0x78, 0x9c, 0x9e, 0x49, 0x77, - 0x97, 0xa3, 0x24, 0x5a, 0x02, 0xc4, 0xfa, 0x03, 0xae, 0xce, 0x8a, 0x01, - 0x94, 0xe8, 0xf8, 0x52, 0x37, 0xde, 0xfd, 0x13, 0xaf, 0x0f, 0xff, 0x75, - 0xa9, 0x95, 0x45, 0xe0, 0xd0, 0xf1, 0xd9, 0x72, 0x37, 0x03, 0x6e, 0x3a, - 0xa5, 0xe9, 0x2c, 0x04, 0xbc, 0x38, 0x0c, 0xbf, 0xe8, 0x26, 0x68, 0x73, - 0x95, 0x93, 0x11, 0xce, 0xf6, 0x7a, 0xe4, 0xad, 0xb0, 0x71, 0x5b, 0x0b, - 0x98, 0x69, 0xc0, 0x05, 0xd2, 0x7b, 0x4d, 0xfa, 0x1b, 0x6f, 0x09, 0xd8, - 0x44, 0xf5, 0x2a, 0x81, 0xb6, 0xd3, 0x27, 0x56, 0x97, 0xab, 0x34, 0x08, - 0xfe, 0x8b, 0xe3, 0x58, 0x86, 0x9f, 0xed, 0x1b, 0x44, 0x1c, 0x13, 0x6e, - 0xef, 0x75, 0x0b, 0xea, 0x1c, 0xbd, 0xd7, 0x6d, 0x68, 0x98, 0x0b, 0x2d, - 0x01, 0x40, 0x44, 0x8a, 0xda, 0x7e, 0x00, 0x01, 0x27, 0xb1, 0x41, 0x4d, - 0x55, 0x93, 0x65, 0xb9, 0x69, 0x96, 0x88, 0xee, 0x36, 0xf8, 0xaf, 0xb5, - 0x6b, 0x5e, 0xd8, 0xdd, 0x77, 0xdd, 0xa0, 0x60, 0x69, 0x38, 0x98, 0x02, - 0x58, 0x4a, 0x1b, 0x64, 0xc1, 0x5d, 0xa7, 0xa2, 0x0c, 0xb5, 0xc6, 0xa3, - 0xa2, 0xbf, 0xf1, 0x08, 0x0a, 0xb9, 0xcd, 0xb1, 0x17, 0xfa, 0x8e, 0x86, - 0x42, 0x1b, 0x8e, 0x77, 0xb1, 0x5c, 0x6c, 0x4e, 0xaa, 0x0b, 0x02, 0x1a, - 0xe6, 0x3b, 0x70, 0xc4, 0x24, 0x96, 0x57, 0x58, 0xda, 0x39, 0x7f, 0x57, - 0x25, 0xdd, 0xa3, 0xc0, 0x91, 0xa0, 0xd2, 0x45, 0x1c, 0x4b, 0xf3, 0xfa, - 0xa3, 0xb5, 0x18, 0xda, 0xa5, 0x67, 0xf8, 0xfd, 0x0a, 0x7e, 0x19, 0x69, - 0x49, 0xcd, 0x87, 0x14, 0xf8, 0x2d, 0xbc, 0x99, 0x29, 0xf9, 0xa8, 0xa5, - 0x33, 0x62, 0xeb, 0x18, 0xa8, 0x88, 0xbd, 0x15, 0x8b, 0xab, 0xd5, 0x58, - 0xa6, 0x19, 0x84, 0x9a, 0x1b, 0x6a, 0x25, 0xd8, 0x44, 0xf5, 0x2a, 0x81, - 0xb6, 0xd3, 0x27, 0x56, 0x97, 0xab, 0x34, 0x08, 0xfe, 0x8b, 0xe3, 0x58, - 0x86, 0x9f, 0xed, 0x1b, 0x44, 0x1c, 0x13, 0x6e, 0xef, 0x75, 0x0b, 0xea, - 0x99, 0xac, 0x03, 0xf4, 0x24, 0xd4, 0x74, 0x4a, 0xee, 0x9d, 0xfb, 0xcc, - 0x19, 0x72, 0xa2, 0x6b, 0x07, 0xa9, 0xa6, 0x60, 0xf7, 0xa0, 0x35, 0xc0, - 0xd0, 0x44, 0x48, 0x7d, 0xfa, 0x79, 0x45, 0xb0, 0x4a, 0x6c, 0xa5, 0x32, - 0xe5, 0xc9, 0x6c, 0x18, 0xc9, 0xa3, 0x73, 0xeb, 0x7d, 0xd4, 0xbc, 0x2a, - 0x04, 0x37, 0x50, 0x18, 0xaf, 0xc0, 0x14, 0x41, 0x2a, 0x84, 0x4a, 0xf7, - 0x14, 0xf0, 0x2e, 0x7b, 0xd6, 0x03, 0xcc, 0x66, 0xeb, 0x68, 0x4d, 0x92, - 0x24, 0x07, 0xb4, 0xa3, 0x03, 0x96, 0x01, 0x6b, 0xb3, 0x3c, 0x8e, 0xcf, - 0x21, 0x20, 0x62, 0xb8, 0xc6, 0x1a, 0x99, 0xd5, 0x9a, 0xf6, 0x13, 0x77, - 0x0e, 0x31, 0x7b, 0x55, 0x27, 0x18, 0xfa, 0x11, 0x4d, 0x99, 0x9c, 0x1e, - 0xa7, 0xd5, 0xa6, 0xc6, 0x72, 0x3d, 0xbc, 0x8b, 0x10, 0x79, 0xaa, 0x25, - 0xe6, 0xe7, 0x40, 0x61, 0x08, 0xf6, 0xaa, 0x7f, 0x9f, 0x49, 0x7d, 0x02, - 0x72, 0xb5, 0xbd, 0xbd, 0x18, 0x8f, 0x4d, 0x73, 0x5a, 0x05, 0x24, 0x76, - 0xac, 0x63, 0xee, 0x3f, 0x80, 0x44, 0x48, 0x66, 0x92, 0x8a, 0x1a, 0x9e, - 0x9d, 0x4f, 0x9a, 0x95, 0xab, 0x16, 0xe0, 0xf9, 0x2b, 0xc0, 0xd0, 0xd1, - 0x53, 0xab, 0xcb, 0x67, 0x46, 0x44, 0xad, 0x3e, 0x97, 0xe9, 0x8c, 0x99, - 0x81, 0xa3, 0xca, 0x85, 0x95, 0xef, 0x3f, 0x05, 0x46, 0x78, 0x72, 0x81, - 0xde, 0xff, 0xf6, 0x0b, 0x41, 0x30, 0xe9, 0x14, 0x7a, 0xd4, 0x08, 0xa2, - 0xf5, 0xee, 0xa8, 0x18, 0xb8, 0xa7, 0x6f, 0x1f, 0x47, 0x2a, 0x3f, 0x9b, - 0xad, 0x64, 0x7e, 0x5b, 0x4e, 0x59, 0x5a, 0xf9, 0x94, 0x8f, 0xcf, 0x98, - 0x77, 0xd7, 0xd0, 0x68, 0x28, 0x7b, 0xae, 0x1c, 0x11, 0x8c, 0xc9, 0xdc, - 0x0b, 0x68, 0xe3, 0xf5, 0x91, 0xbd, 0x2f, 0x29, 0xfb, 0xf5, 0xac, 0x1d, - 0x9d, 0xa2, 0xc3, 0xb8, 0x3e, 0xe7, 0x68, 0xc9, 0x28, 0x27, 0x2b, 0x8b, - 0x37, 0x48, 0x9e, 0xec, 0x21, 0x8d, 0xb3, 0xea, 0xe1, 0xc9, 0x4c, 0x1f, - 0x80, 0x52, 0xb4, 0x81, 0x62, 0x01, 0xd4, 0xd2, 0x43, 0x6b, 0x7f, 0xef, - 0x81, 0xeb, 0x6e, 0x97, 0xd5, 0xfc, 0x57, 0xbf, 0xf8, 0x4d, 0x2b, 0xb2, - 0x43, 0xc5, 0x8d, 0xb5, 0xeb, 0x6e, 0x2c, 0xf1, 0xb8, 0x47, 0x2b, 0x2b, - 0xfe, 0x0d, 0xa8, 0x16, 0x08, 0x53, 0x4c, 0xea, 0x8d, 0xe5, 0xe3, 0x15, - 0x38, 0x5f, 0x88, 0x55, 0x9f, 0x04, 0xb0, 0x28, 0x3f, 0x68, 0x8c, 0x30, - 0xf9, 0xb7, 0x0a, 0xf5, 0xf4, 0xa3, 0xdb, 0xd0, 0x6a, 0x8a, 0x79, 0xe6, - 0x7e, 0xfe, 0xdc, 0x3d, 0x66, 0x66, 0x2a, 0x0c, 0x35, 0xb2, 0xbb, 0x59, - 0x87, 0x25, 0x58, 0x58, 0x8a, 0xbb, 0x1c, 0xfd, 0xa9, 0xad, 0xc0, 0xb4, - 0x58, 0xf5, 0x27, 0xbe, 0x66, 0x2d, 0x79, 0x7e, 0x35, 0x49, 0xea, 0xb6, - 0xbb, 0x91, 0x61, 0xbc, 0x1d, 0x5d, 0xdb, 0x52, 0xf2, 0x0c, 0xc6, 0x51, - 0x8c, 0xac, 0x10, 0x20, 0x58, 0x41, 0xf8, 0xcc, 0x87, 0x91, 0x4d, 0x6c, - 0x43, 0xa1, 0x23, 0x32, 0x74, 0x4e, 0x91, 0xc0, 0x41, 0xfa, 0x39, 0x68, - 0x09, 0x1b, 0x56, 0x07, 0x77, 0xea, 0xb3, 0x1e, 0x7c, 0x49, 0xdc, 0xf5, - 0x61, 0x91, 0xcf, 0x82, 0x14, 0xe3, 0x3f, 0xa8, 0x0d, 0x4e, 0x9e, 0xd4, - 0x14, 0x0a, 0x55, 0xe4, 0x65, 0x93, 0xa9, 0xcc, 0xaa, 0x71, 0x49, 0x7b, - 0xb8, 0xb2, 0x79, 0xfb, 0x1b, 0x7d, 0x75, 0x06, 0xf1, 0x6b, 0x52, 0x29, - 0x10, 0x3a, 0x53, 0xc2, 0x25, 0x2e, 0xf0, 0xa4, 0xc1, 0xea, 0xaf, 0xf3, - 0x25, 0xd1, 0xe2, 0x75, 0x75, 0x3c, 0xca, 0xc4, 0xd0, 0x27, 0xe4, 0xc3, - 0x78, 0xdd, 0xa8, 0xd9, 0xf5, 0x05, 0x92, 0xf5, 0xb8, 0x93, 0xe3, 0x1a, - 0xb2, 0x6c, 0x82, 0x8a, 0x64, 0x88, 0x5a, 0xe4, 0xe8, 0x47, 0xa8, 0x95, - 0x08, 0xbd, 0xf3, 0x9f, 0xc7, 0xf6, 0x31, 0x18, 0x7e, 0xc5, 0x3b, 0xd3, - 0xce, 0xc2, 0x1f, 0x9a, 0xf3, 0x66, 0xcf, 0xab, 0xdc, 0xbf, 0x5a, 0x5e, - 0x32, 0x54, 0x2a, 0xb8, 0x3b, 0x46, 0xe7, 0x87, 0x81, 0xee, 0xaa, 0x75, - 0xdf, 0xa0, 0x56, 0x18, 0x4b, 0xe3, 0xa3, 0xc5, 0x94, 0x6e, 0x84, 0x43, - 0xae, 0x85, 0xc8, 0xfb, 0xc8, 0xa0, 0x47, 0x12, 0x37, 0x13, 0x3e, 0xea, - 0xb8, 0xb0, 0x81, 0x99, 0xca, 0x33, 0x2f, 0x9b, 0x39, 0xba, 0x6c, 0x31, - 0xaf, 0x91, 0x70, 0xcd, 0xc0, 0xec, 0xa9, 0xe1, 0x35, 0x5b, 0x15, 0x68, - 0xb0, 0x0e, 0x56, 0x35, 0x73, 0x7e, 0x9b, 0x5f, 0xdd, 0xcf, 0xb0, 0x11, - 0x9f, 0x21, 0xac, 0x04, 0x4f, 0xfb, 0x1b, 0x49, 0xc8, 0x5e, 0xcd, 0x88, - 0xb9, 0x42, 0xb8, 0xbf, 0xe9, 0xad, 0x60, 0x1d, 0x88, 0xd5, 0x48, 0xc5, - 0x91, 0x5e, 0x3a, 0x9e, 0xe1, 0x50, 0xee, 0xf9, 0x34, 0x64, 0xf7, 0xde, - 0x96, 0x96, 0xf0, 0xb3, 0xb3, 0x2b, 0x2a, 0xb8, 0xf7, 0xf6, 0x4b, 0xae, - 0x09, 0xa4, 0x2a, 0x8f, 0xc8, 0xf5, 0x13, 0x95, 0xd9, 0x67, 0x42, 0x4c, - 0x24, 0xe9, 0x53, 0xd2, 0xf1, 0x1a, 0x3d, 0x15, 0x39, 0xb4, 0xf6, 0x0d, - 0x13, 0xbc, 0x1a, 0xed, 0x51, 0x05, 0x69, 0xe6, 0x40, 0x03, 0x87, 0x7f, - 0x7e, 0x72, 0x08, 0x3b, 0xc8, 0xde, 0xff, 0x58, 0xb4, 0xb0, 0x89, 0x89, - 0x9a, 0x07, 0x51, 0xa9, 0xdf, 0x37, 0x16, 0x2a, 0xdc, 0xf6, 0x24, 0x1d, - 0x4b, 0x3d, 0xf6, 0xc5, 0x42, 0x59, 0x9b, 0x46, 0xd0, 0x4a, 0xf2, 0x64, - 0x00, 0xa6, 0xbb, 0x02, 0xb0, 0xc1, 0x2e, 0x93, 0xe1, 0x3d, 0xa5, 0x9c, - 0x3a, 0xa1, 0x4c, 0x37, 0x08, 0xfd, 0xe0, 0x7f, 0xe9, 0x68, 0x50, 0x53, - 0x29, 0x85, 0x56, 0x22, 0xb0, 0xc4, 0xab, 0xbe, 0x3b, 0x3b, 0x8e, 0xf4, - 0x60, 0x86, 0x67, 0xb2, 0xdd, 0x92, 0x46, 0xa6, 0x4c, 0xbc, 0x7e, 0x68, - 0x56, 0x21, 0xb4, 0xff, 0xce, 0x0a, 0x57, 0x5c, 0xc5, 0x96, 0xf7, 0x47, - 0xdd, 0xb4, 0x52, 0xf1, 0x13, 0xca, 0xe9, 0x4a, 0xa1, 0x25, 0xf2, 0x9d, - 0x33, 0xde, 0xdb, 0x3f, 0xf6, 0x3a, 0x23, 0x07, 0xd6, 0x35, 0x79, 0xd7, - 0x9a, 0x01, 0x8f, 0x78, 0x14, 0x6a, 0xcd, 0x6f, 0x77, 0xb6, 0xa3, 0x0e, - 0x26, 0xec, 0x7b, 0xb8, 0x53, 0xea, 0x7f, 0xc5, 0xab, 0x2f, 0x5d, 0x5b, - 0x83, 0x90, 0x89, 0x5e, 0xe3, 0x5a, 0x05, 0xc7, 0xa8, 0x27, 0xfe, 0x2b, - 0x68, 0x03, 0x0a, 0x2c, 0x96, 0x0b, 0x70, 0xe9, 0xb7, 0xa0, 0x55, 0x85, - 0x62, 0xcc, 0x0d, 0xe1, 0x60, 0x98, 0xbd, 0x6f, 0x14, 0x53, 0x46, 0x0e, - 0xa0, 0x2e, 0xd7, 0xb4, 0x18, 0x50, 0x80, 0x97, 0x3f, 0xbb, 0x58, 0x64, - 0x7e, 0xe8, 0xc3, 0x84, 0x0a, 0xe1, 0x3a, 0xc7, 0xb6, 0x8c, 0xe2, 0xa3, - 0x61, 0x29, 0x18, 0x6c, 0xf2, 0xcf, 0x3d, 0x39, 0x35, 0x3a, 0x79, 0x59, - 0xab, 0xbf, 0x3d, 0x84, 0xea, 0x37, 0x92, 0x2e, 0xb5, 0x54, 0x48, 0x8b, - 0x0b, 0x2c, 0x7e, 0x13, 0x58, 0x0b, 0xb3, 0x48, 0x11, 0xa3, 0x70, 0x49, - 0xd3, 0x50, 0x90, 0x89, 0x9f, 0x8b, 0x4d, 0xd0, 0x99, 0xd5, 0x2a, 0xf3, - 0x0f, 0x51, 0xe2, 0x6f, 0x73, 0xbe, 0xfe, 0x7f, 0xf3, 0x6c, 0x86, 0x3a, - 0x10, 0xfb, 0x31, 0xf8, 0x1e, 0x86, 0xcc, 0xc4, 0x7e, 0x50, 0x5a, 0xc3, - 0xbf, 0x4a, 0xba, 0xb0, 0xbc, 0x82, 0x68, 0x91, 0x1c, 0xe6, 0xf5, 0x76, - 0x23, 0x6a, 0x12, 0x80, 0x15, 0xf9, 0x09, 0x9d, 0x1e, 0x25, 0x56, 0xfe, - 0xca, 0xc5, 0xc9, 0xb6, 0xb6, 0x3c, 0x60, 0x74, 0x42, 0xa0, 0x02, 0x32, - 0x1a, 0xcd, 0x46, 0x3e, 0x87, 0x4c, 0x13, 0x55, 0xcf, 0xbc, 0xd7, 0xcb, - 0xb4, 0x54, 0xb2, 0x92, 0x0a, 0x9d, 0x65, 0xa2, 0x04, 0xc3, 0x0e, 0x02, - 0x0a, 0xe5, 0xf0, 0x7e, 0xd3, 0x7b, 0x07, 0x9b, 0x85, 0xb7, 0x3b, 0xac, - 0x3f, 0xa7, 0x7f, 0x66, 0x0a, 0x1f, 0xd3, 0x43, 0xc4, 0x51, 0xcf, 0xa2, - 0xe7, 0x33, 0xe7, 0x36, 0x11, 0x46, 0x1e, 0x49, 0x53, 0xc9, 0x41, 0x10, - 0x33, 0xfe, 0x89, 0x73, 0xa5, 0x9e, 0x9c, 0x0e, 0x8b, 0x12, 0x95, 0x9e, - 0xdd, 0xe8, 0x1d, 0xa6, 0x50, 0x41, 0x19, 0x79, 0x2c, 0xee, 0x3f, 0xb5, - 0xb7, 0x48, 0xe5, 0x9e, 0xbd, 0x8a, 0xad, 0xc5, 0x19, 0x70, 0xc7, 0x48, - 0x69, 0x48, 0x23, 0x1b, 0xee, 0x62, 0x89, 0x90, 0xcb, 0xaa, 0xd3, 0x73, - 0x84, 0x3d, 0xad, 0x83, 0x14, 0x85, 0x56, 0x6e, 0xca, 0x7a, 0x57, 0x7f, - 0xe9, 0xed, 0x26, 0x1a, 0x22, 0xc1, 0xbf, 0x4e, 0xba, 0xc8, 0x73, 0x32, - 0x42, 0xd8, 0x72, 0xce, 0x78, 0x16, 0x30, 0x03, 0x54, 0x1e, 0x69, 0x09, - 0x05, 0x7e, 0x9a, 0x7d, 0x7f, 0x5e, 0x96, 0xab, 0x31, 0xb1, 0x45, 0xed, - 0x8a, 0x00, 0x74, 0x2d, 0x61, 0xb2, 0xaa, 0x33, 0x2f, 0x3d, 0x4b, 0x78, - 0xff, 0x1f, 0x16, 0xff, 0xc3, 0x00, 0x3e, 0x1b, 0x75, 0xeb, 0x00, 0x9f, - 0xc3, 0xbd, 0xe6, 0x46, 0x52, 0xa5, 0x6c, 0xff, 0x93, 0xa3, 0x40, 0x79, - 0x73, 0x8f, 0x30, 0xe8, 0xcf, 0x5d, 0xa7, 0x17, 0xac, 0x83, 0x78, 0x38, - 0x68, 0xf6, 0xd8, 0x9b, 0x74, 0x95, 0x62, 0xbf, 0x53, 0x20, 0x31, 0xfe, - 0x6e, 0x2b, 0x51, 0x59, 0x3c, 0x96, 0x2d, 0x82, 0x56, 0x5f, 0x72, 0x9d, - 0x46, 0x59, 0x40, 0x79, 0x14, 0xe3, 0x5f, 0xa3, 0x61, 0x46, 0xf0, 0x32, - 0x6d, 0xe9, 0x81, 0x28, 0xba, 0xfe, 0x11, 0x1f, 0x82, 0xb1, 0x3a, 0x0c, - 0xdb, 0xc6, 0xe1, 0x33, 0x6d, 0x2f, 0x35, 0xf1, 0xb1, 0x5c, 0x71, 0x08, - 0x4d, 0x29, 0x2b, 0xd3, 0x30, 0x81, 0x9e, 0x60, 0x8b, 0x93, 0xd6, 0x04, - 0x50, 0xfe, 0x42, 0x40, 0x75, 0xd3, 0xd0, 0x7d, 0x53, 0x7d, 0xc7, 0x31, - 0x57, 0x5c, 0x8a, 0x60, 0xb0, 0x8b, 0x33, 0xaf, 0x33, 0xf3, 0x22, 0xf3, - 0x47, 0x90, 0x7b, 0xcd, 0x91, 0xd9, 0xf8, 0x07, 0x23, 0xed, 0x07, 0xd9, - 0x82, 0x51, 0x9b, 0x3a, 0x66, 0x5a, 0x57, 0x4d, 0x4b, 0x4b, 0xd7, 0x6a, - 0xd5, 0xb4, 0x60, 0x1d, 0x93, 0x6f, 0x55, 0xd8, 0x31, 0x1d, 0xf3, 0xd2, - 0x2e, 0xdc, 0x3a, 0xff, 0x20, 0xf4, 0x31, 0x5b, 0x5d, 0x0f, 0xbc, 0x7c, - 0x50, 0x67, 0x6f, 0x3c, 0x2b, 0x1d, 0xf5, 0xea, 0x95, 0x5f, 0xa1, 0x30, - 0x45, 0x5e, 0x88, 0xce, 0x26, 0xef, 0xbf, 0xad, 0x60, 0x62, 0x3f, 0x46, - 0xe4, 0x9c, 0xf1, 0xae, 0xcb, 0x48, 0xbb, 0xa1, 0xd5, 0xb5, 0xd9, 0x66, - 0x0a, 0xa9, 0x79, 0x88, 0x3b, 0x14, 0xed, 0xdb, 0x99, 0xdc, 0x1d, 0xb3, - 0x91, 0xa9, 0x1e, 0xf7, 0xe2, 0xc9, 0x83, 0x03, 0xcf, 0xe2, 0x4f, 0x2c, - 0xca, 0x2a, 0x1f, 0x5a, 0x41, 0x52, 0x33, 0xbf, 0x4f, 0x48, 0xa2, 0x56, - 0x2a, 0x1d, 0xc3, 0x0e, 0xb7, 0x73, 0xee, 0xd6, 0x65, 0xb2, 0xb5, 0xba, - 0x50, 0x22, 0x8f, 0xf7, 0xb3, 0xba, 0x4c, 0xbb, 0x9a, 0x85, 0xa5, 0x0c, - 0xc0, 0x44, 0xf1, 0xc4, 0x6b, 0x17, 0x01, 0xf5, 0x7a, 0x38, 0x9d, 0x6d, - 0x6f, 0xf6, 0x6c, 0x5b, 0xba, 0x9b, 0x7b, 0xea, 0x7d, 0xd7, 0x2d, 0x72, - 0x57, 0x88, 0xb2, 0x57, 0xe1, 0xd9, 0xc4, 0xc3, 0xe1, 0x95, 0x5c, 0x46, - 0xe2, 0xbd, 0xe8, 0xf8, 0x6f, 0x8e, 0x0a, 0x22, 0x98, 0xe1, 0x85, 0x81, - 0x36, 0x3b, 0x26, 0x5c, 0xd2, 0x34, 0x06, 0x51, 0xff, 0x93, 0x5d, 0xca, - 0xe8, 0x34, 0x65, 0x40, 0xdd, 0x8f, 0x25, 0x0c, 0xbd, 0x3d, 0x6e, 0x9f, - 0x22, 0x6e, 0x37, 0xda, 0xcf, 0x2b, 0x7c, 0xcc, 0x98, 0xff, 0x65, 0xef, - 0x27, 0x99, 0xbf, 0x81, 0x23, 0x12, 0x9f, 0x84, 0x3c, 0xbc, 0xe5, 0xa3, - 0x2a, 0x4c, 0x0b, 0xd5, 0x1b, 0x07, 0x3f, 0x70, 0x8c, 0x66, 0x9a, 0x96, - 0x54, 0x64, 0x88, 0xa7, 0xa5, 0x38, 0xae, 0xe2, 0xb7, 0xd4, 0xaf, 0xac, - 0x1c, 0xb0, 0x6d, 0x41, 0x29, 0x9c, 0x96, 0xd3, 0xd7, 0xdc, 0x9c, 0x24, - 0xb2, 0x77, 0x65, 0xab, 0xc7, 0x04, 0xb0, 0x99, 0x95, 0x7c, 0xbe, 0xf8, - 0x6c, 0x52, 0x7e, 0x8a, 0xf3, 0x5b, 0x2b, 0x46, 0xc9, 0x7a, 0x4e, 0xe5, - 0xe1, 0x06, 0x9d, 0x39, 0x82, 0xe2, 0x40, 0xc4, 0xa0, 0x94, 0x7b, 0xfc, - 0xc7, 0x1e, 0xe4, 0xd3, 0xb2, 0x21, 0x28, 0xee, 0xfe, 0x18, 0x63, 0x06, - 0x8b, 0x8e, 0x43, 0xfe, 0xfa, 0x08, 0x89, 0xe9, 0xbd, 0x2d, 0xc9, 0x76, - 0x1d, 0x05, 0x7d, 0xc1, 0x99, 0x59, 0x17, 0xaa, 0x9c, 0x40, 0x2e, 0x99, - 0xa1, 0x17, 0xb0, 0x43, 0x3a, 0x5f, 0xcc, 0x73, 0x38, 0x7f, 0x75, 0x31, - 0x16, 0xa0, 0x2a, 0xe7, 0x61, 0x5a, 0xa8, 0xf9, 0x27, 0xe1, 0xb5, 0x1a, - 0x75, 0x4f, 0xca, 0x42, 0x9d, 0x2c, 0x9a, 0xd2, 0x5d, 0xff, 0x7f, 0x22, - 0x18, 0x0b, 0x49, 0x36, 0x18, 0x34, 0xa9, 0x23, 0xad, 0x41, 0xdf, 0xd1, - 0xa0, 0xb1, 0x37, 0xf1, 0xe5, 0x3a, 0xc1, 0xdc, 0x26, 0x66, 0x29, 0x28, - 0x18, 0x55, 0xf5, 0x68, 0x10, 0xf3, 0x8f, 0x4b, 0x5e, 0xff, 0x1b, 0x01, - 0x41, 0x6c, 0xca, 0xaa, 0xb8, 0xcd, 0x8f, 0x4c, 0x8d, 0x02, 0x15, 0xa1, - 0xcf, 0xe8, 0x93, 0xaa, 0xd3, 0x43, 0xec, 0xae, 0x55, 0x59, 0x82, 0xd3, - 0x73, 0xf3, 0xef, 0xd5, 0x1a, 0x26, 0xcb, 0xf4, 0xf4, 0xb9, 0x91, 0x95, - 0x32, 0x6c, 0xeb, 0x42, 0x5b, 0xf2, 0xf2, 0x00, 0xa3, 0xf5, 0x10, 0x5c, - 0x20, 0x16, 0x9e, 0x86, 0x49, 0x01, 0xc5, 0xd6, 0xbd, 0x18, 0x0f, 0xc4, - 0xf1, 0x6f, 0xbe, 0x03, 0x82, 0xb4, 0xcf, 0xda, 0x8c, 0x01, 0xf3, 0x9e, - 0x57, 0xf9, 0xb2, 0xc7, 0x28, 0x80, 0x57, 0x07, 0x39, 0x53, 0xea, 0xd9, - 0xbf, 0x15, 0xba, 0x82, 0x50, 0x9b, 0xdd, 0xe7, 0xf0, 0x7f, 0xac, 0x39, - 0x8d, 0xb7, 0x0d, 0x74, 0xe4, 0x70, 0x70, 0x11, 0x99, 0x5f, 0x42, 0xfa, - 0x1f, 0x79, 0xbe, 0x9c, 0x84, 0x5b, 0x7a, 0x7a, 0x99, 0xef, 0x4a, 0x6b, - 0x55, 0x9d, 0xd0, 0x4f, 0x21, 0x5d, 0xcd, 0x25, 0xa4, 0xd5, 0x6f, 0xd3, - 0x97, 0x48, 0x03, 0xb6, 0xba, 0x41, 0xab, 0xc9, 0xd9, 0xa3, 0x56, 0x5e, - 0x2f, 0xfd, 0x9f, 0xaf, 0x2e, 0x8d, 0xaf, 0x51, 0x7e, 0xf9, 0x56, 0x54, - 0x2f, 0x35, 0x8d, 0x60, 0x34, 0xbb, 0xb0, 0x89, 0x3b, 0xae, 0x2d, 0xa3, - 0x75, 0x19, 0x02, 0x1c, 0x64, 0x3e, 0x40, 0xa9, 0x0f, 0xfa, 0x02, 0x7b, - 0xb7, 0x8a, 0x23, 0xa0, 0x98, 0xd2, 0x92, 0x8d, 0xb5, 0x9b, 0x7b, 0x45, - 0x22, 0x9a, 0x99, 0x01, 0xc5, 0xb8, 0xb9, 0x9c, 0xbe, 0x0e, 0x04, 0x8a, - 0x73, 0xb7, 0xcd, 0x6f, 0x2f, 0xe4, 0x3c, 0x0e, 0xfb, 0x16, 0xc6, 0x47, - 0x73, 0xcb, 0xc7, 0x86, 0x9a, 0x0a, 0xf6, 0x9d, 0x45, 0x21, 0xdb, 0xf1, - 0x43, 0x25, 0x62, 0x10, 0x0a, 0x0e, 0x88, 0xc3, 0x88, 0xed, 0xf1, 0x14, - 0xe2, 0x83, 0xbe, 0x48, 0xe7, 0x02, 0x17, 0x7d, 0x01, 0x33, 0xba, 0x9a, - 0x4c, 0x4a, 0xd9, 0xce, 0x23, 0x78, 0x2f, 0x5d, 0x61, 0x5a, 0x69, 0xcb, - 0x18, 0x83, 0x83, 0xc8, 0x10, 0x30, 0x5a, 0xa6, 0xbe, 0x9a, 0xde, 0x92, - 0x81, 0x9f, 0x83, 0x3b, 0xb0, 0x99, 0x71, 0xd1, 0x72, 0x0f, 0x94, 0xac, - 0xd8, 0xaf, 0x36, 0x0d, 0xc2, 0x35, 0xb5, 0xbe, 0x84, 0x75, 0x56, 0x03, - 0xed, 0xa9, 0x51, 0x70, 0x17, 0x3c, 0xd9, 0xb5, 0xe1, 0x97, 0xc8, 0x3c, - 0x69, 0xc6, 0x69, 0x4a, 0xf1, 0x22, 0xee, 0x72, 0xa6, 0x6a, 0x02, 0x72, - 0x72, 0x7f, 0x5a, 0x69, 0x41, 0x20, 0x2b, 0xfa, 0xe7, 0x0f, 0x35, 0x6c, - 0x49, 0xb3, 0xdd, 0x35, 0xaa, 0x1a, 0xa1, 0x5e, 0x5f, 0x09, 0x7e, 0x06, - 0x9e, 0x6b, 0xc9, 0xed, 0x98, 0x76, 0x32, 0x10, 0x72, 0x90, 0x7a, 0xd4, - 0xd1, 0x5a, 0xa4, 0x67, 0xcc, 0xf6, 0xf9, 0x36, 0x7a, 0x6e, 0xa1, 0x02, - 0xdb, 0x25, 0x12, 0x9f, 0xb3, 0xa5, 0x96, 0xd2, 0x7f, 0x4c, 0xcb, 0xf2, - 0xf3, 0x47, 0x04, 0x09, 0xa5, 0xb9, 0xc8, 0xe6, 0x09, 0x34, 0x23, 0x81, - 0x8b, 0x3e, 0xf0, 0xac, 0x9f, 0x9c, 0xfc, 0xe7, 0x1a, 0xdb, 0xa8, 0x06, - 0x7e, 0x28, 0x2d, 0x64, 0x5e, 0x22, 0x85, 0xa9, 0x13, 0x8f, 0x54, 0xe2, - 0x6e, 0xb6, 0x1b, 0x19, 0xad, 0x5e, 0x52, 0xef, 0x4c, 0x44, 0x1a, 0x49, - 0x4a, 0x55, 0xae, 0x6d, 0x45, 0x88, 0x1a, 0x59, 0xe2, 0xeb, 0xef, 0x1b, - 0x54, 0xcc, 0x7d, 0xd8, 0x4d, 0xdb, 0x5c, 0xee, 0xcc, 0xd1, 0x04, 0xa5, - 0x85, 0x53, 0x44, 0x01, 0xc9, 0x09, 0x3b, 0xf9, 0x7c, 0x39, 0xe9, 0xb7, - 0xe4, 0xf9, 0xb1, 0xba, 0x03, 0x9e, 0x1d, 0xd5, 0xc5, 0x39, 0x71, 0x11, - 0xd6, 0x98, 0x86, 0xd5, 0xe9, 0x37, 0xfc, 0x3b, 0x23, 0x72, 0x96, 0x2a, - 0x3b, 0x93, 0xc5, 0x4f, 0x8b, 0x5c, 0xb9, 0x3c, 0x43, 0xea, 0xd2, 0x95, - 0xba, 0xbb, 0xfe, 0x96, 0x9c, 0x99, 0x6a, 0x4b, 0x0c, 0x63, 0xb2, 0x2e, - 0x3b, 0x33, 0x37, 0x11, 0xd7, 0x70, 0x5e, 0x55, 0x70, 0x23, 0x85, 0x5d, - 0x4e, 0xd9, 0xce, 0x0f, 0xef, 0xad, 0xe6, 0xc5, 0x9c, 0xf9, 0x53, 0xf4, - 0x78, 0x3f, 0xa1, 0xf1, 0x8c, 0xe5, 0xc7, 0xb0, 0xb5, 0x5f, 0x70, 0x13, - 0xaa, 0xbc, 0x33, 0x7a, 0x5c, 0x4c, 0x10, 0x4f, 0xe5, 0x57, 0xde, 0x5d, - 0x3b, 0x53, 0x53, 0x6b, 0x99, 0x75, 0x34, 0x94, 0xc2, 0x93, 0xb8, 0x46, - 0xd0, 0xe4, 0xba, 0x1f, 0x20, 0x32, 0x20, 0x3c, 0xc2, 0xf9, 0x46, 0x92, - 0x41, 0x02, 0x61, 0xed, 0x50, 0x61, 0xf4, 0x0e, 0x03, 0x49, 0x0a, 0x79, - 0x93, 0xd3, 0x2c, 0x22, 0x6f, 0x90, 0x7f, 0x86, 0xe0, 0xaa, 0xe5, 0x8b, - 0xec, 0x1e, 0xd9, 0xae, 0xb2, 0x69, 0x2c, 0x12, 0xa6, 0xef, 0xb9, 0x0a, - 0xad, 0x5a, 0xac, 0x4e, 0xa5, 0xbe, 0xae, 0x32, 0xec, 0xb7, 0x6d, 0x7b, - 0xc4, 0x2e, 0x00, 0x78, 0x7b, 0x1d, 0xe1, 0xe7, 0x7f, 0x2c, 0xd6, 0x71, - 0x3d, 0x21, 0xc2, 0x91, 0x98, 0xf0, 0xa3, 0xb9, 0x98, 0xad, 0x82, 0x36, - 0x79, 0xc5, 0x61, 0x7f, 0x7e, 0xdb, 0xfc, 0x60, 0xd6, 0x66, 0xb9, 0x42, - 0x5d, 0xb7, 0xe1, 0x92, 0x90, 0xe7, 0x8c, 0xf7, 0x37, 0x0f, 0x42, 0xa2, - 0x4f, 0x4b, 0x7e, 0x76, 0xcf, 0x5e, 0x27, 0xc3, 0x4f, 0x72, 0xca, 0x62, - 0x05, 0xee, 0xd3, 0x19, 0x04, 0x06, 0xf9, 0x1b, 0x19, 0x1f, 0x5d, 0x51, - 0x74, 0x50, 0x8c, 0x3e, 0x1b, 0x05, 0x77, 0x55, 0x2c, 0xf2, 0x00, 0x16, - 0xcc, 0x85, 0x90, 0x9d, 0x64, 0x9f, 0xd8, 0xaa, 0xc0, 0xbd, 0x3d, 0x95, - 0x24, 0xf9, 0x52, 0xc9, 0x27, 0x41, 0xb4, 0xbd, 0xdc, 0x54, 0xfc, 0xa9, - 0xa9, 0x0e, 0xe2, 0xf6, 0x5c, 0x20, 0xb4, 0x92, 0xe0, 0xc6, 0x8d, 0xcf, - 0xb3, 0x66, 0xf2, 0x1d, 0xa8, 0x2a, 0xcb, 0xf3, 0x4d, 0x78, 0x00, 0x02, - 0xa4, 0xf1, 0x97, 0x74, 0xbd, 0xe3, 0x90, 0x67, 0x16, 0x35, 0xf8, 0x21, - 0x33, 0x0a, 0x71, 0x41, 0x35, 0xfd, 0x25, 0x69, 0xc8, 0xf7, 0x27, 0x7a, - 0xec, 0x60, 0x48, 0x15, 0x3b, 0xe5, 0xbf, 0xae, 0xfe, 0xb4, 0xa3, 0xa1, - 0xad, 0xb0, 0x00, 0x78, 0xeb, 0xd7, 0xbe, 0x6a, 0x5a, 0x51, 0x5f, 0xf7, - 0x81, 0xc6, 0x7d, 0x1e, 0x25, 0x22, 0x6b, 0x0c, 0xe5, 0xc4, 0x9a, 0xa2, - 0xb3, 0x4e, 0xcd, 0x03, 0xf0, 0xec, 0xc9, 0x62, 0xa5, 0x99, 0x1f, 0x9d, - 0x06, 0xa2, 0xed, 0xb7, 0x77, 0x9f, 0x85, 0x7d, 0xce, 0x91, 0x14, 0x24, - 0x34, 0xda, 0xd1, 0x45, 0x1c, 0x3e, 0x36, 0x42, 0x48, 0xf5, 0xc5, 0xb8, - 0x8f, 0xf6, 0x2a, 0xbd, 0x6f, 0xf2, 0x33, 0xb9, 0x13, 0xe4, 0x42, 0x40, - 0x4d, 0x2b, 0x51, 0xc5, 0xf4, 0xb4, 0x24, 0x7e, 0xc3, 0x2c, 0xca, 0xf0, - 0xba, 0x94, 0xc4, 0x42, 0x89, 0xbd, 0x56, 0x96, 0xb6, 0x20, 0x56, 0x56, - 0x88, 0x30, 0x5f, 0xbb, 0x21, 0xc3, 0x87, 0x7b, 0xa3, 0x37, 0x5f, 0xfe, - 0x04, 0x33, 0xcf, 0x7f, 0xe8, 0xd1, 0xbb, 0xd5, 0x8b, 0xe4, 0xed, 0xb8, - 0x10, 0x0b, 0xf3, 0xb3, 0x23, 0x8e, 0x33, 0x0c, 0xb2, 0x2b, 0x8f, 0xb9, - 0x00, 0x72, 0xd9, 0xc4, 0xa8, 0x82, 0xb0, 0x55, 0xef, 0x04, 0x3e, 0xd3, - 0x0f, 0xc4, 0xd2, 0x61, 0x01, 0xae, 0x60, 0xac, 0x91, 0x3a, 0x49, 0x5e, - 0xd6, 0xa9, 0xca, 0xea, 0x1e, 0x92, 0xe7, 0x71, 0x78, 0x15, 0xd9, 0x79, - 0x8f, 0x63, 0xfb, 0x40, 0x4e, 0xeb, 0x97, 0x67, 0x13, 0x6d, 0x73, 0x7b, - 0xf4, 0xf3, 0x73, 0xf7, 0x56, 0x0b, 0xb4, 0x9b, 0x12, 0x27, 0x64, 0xa2, - 0x6d, 0x14, 0xa1, 0x0e, 0x91, 0x32, 0x5b, 0x0b, 0x52, 0x1e, 0xe6, 0xfb, - 0xba, 0xc4, 0xcd, 0x08, 0xc7, 0x5f, 0x1d, 0x96, 0x73, 0xdc, 0xfc, 0x12, - 0xdf, 0x28, 0x8e, 0xc1, 0x02, 0x46, 0xf3, 0x0e, 0x00, 0x7e, 0x22, 0xf3, - 0xe6, 0xcf, 0xa1, 0x7e, 0x0b, 0xaf, 0xcb, 0x81, 0x99, 0xb3, 0xdb, 0xdc, - 0x04, 0x2b, 0x6a, 0x4d, 0xc8, 0xe2, 0x42, 0xcf, 0x1d, 0x4c, 0x87, 0x36, - 0x82, 0xc5, 0xcf, 0xe8, 0x24, 0x0b, 0x81, 0x9f, 0x2a, 0x7c, 0xae, 0xea, - 0xdf, 0x27, 0xd1, 0x2b, 0x31, 0x5c, 0xbc, 0x92, 0x4f, 0x50, 0xed, 0x3e, - 0x58, 0x2c, 0xea, 0x2e, 0x2d, 0x5e, 0xb1, 0x8e, 0x43, 0x85, 0xa9, 0xf3, - 0xab, 0x2a, 0xa2, 0x1a, 0x58, 0x67, 0xd4, 0x12, 0x9a, 0xc1, 0x9b, 0x30, - 0x4e, 0x7f, 0xbf, 0x6d, 0x00, 0x47, 0x74, 0x40, 0xd5, 0xf0, 0x8a, 0xd6, - 0x6d, 0xff, 0xab, 0x35, 0xf0, 0x95, 0x62, 0xb2, 0xea, 0xcf, 0x7f, 0x0a, - 0xc8, 0x27, 0xa8, 0x41, 0xd2, 0x62, 0x89, 0xf9, 0x70, 0x57, 0x7b, 0x91, - 0xb2, 0x40, 0x47, 0xf1, 0xec, 0x69, 0xa1, 0xa2, 0xe8, 0x62, 0xb1, 0x19, - 0x74, 0xcb, 0xb8, 0x05, 0x64, 0x14, 0x0f, 0xf0, 0xa0, 0x44, 0xce, 0x90, - 0x11, 0x28, 0x7e, 0x4f, 0x62, 0x66, 0xce, 0xbc, 0x2c, 0x2b, 0x8b, 0x81, - 0x5f, 0xbd, 0x8d, 0xb5, 0x09, 0xe9, 0x38, 0xaf, 0x02, 0xfe, 0x8a, 0x1f, - 0x02, 0x7d, 0xcc, 0xd5, 0x37, 0xd0, 0x14, 0xbb, 0x6d, 0x0e, 0x53, 0xdc, - 0x12, 0x25, 0x65, 0x27, 0x05, 0xe9, 0xec, 0xff, 0xea, 0x78, 0xd2, 0xee, - 0xd0, 0x85, 0x76, 0xec, 0x1f, 0x29, 0xc2, 0x95, 0x02, 0x4e, 0x7f, 0x93, - 0x1d, 0xed, 0x47, 0xc9, 0x01, 0xa0, 0xc3, 0x70, 0x48, 0x23, 0x45, 0x64, - 0x66, 0x87, 0xa4, 0x62, 0x5e, 0xfd, 0xd0, 0x7a, 0x01, 0x09, 0xa8, 0x3f, - 0xb7, 0x7a, 0xc6, 0xc0, 0xc4, 0x6c, 0xbd, 0xa8, 0xe8, 0x37, 0xfc, 0xc5, - 0x4a, 0xdd, 0x46, 0x0c, 0x9c, 0x44, 0x03, 0x0e, 0xd8, 0x54, 0x88, 0x07, - 0x7e, 0x18, 0x6d, 0xfd, 0x0f, 0xd3, 0x24, 0x3b, 0x55, 0x7c, 0x23, 0x39, - 0xf3, 0x4d, 0xc8, 0xb1, 0xc5, 0x91, 0x72, 0xa8, 0x56, 0xc1, 0x7c, 0x55, - 0x3f, 0x3c, 0xba, 0x23, 0x64, 0xef, 0x1b, 0x97, 0x6a, 0x66, 0xee, 0x75, - 0x2c, 0x9c, 0xfe, 0xb1, 0xa0, 0x27, 0x2a, 0xce, 0x85, 0xb2, 0xc2, 0x94, - 0x15, 0x44, 0xd9, 0x7f, 0x33, 0xe2, 0x8d, 0x6b, 0xfa, 0x39, 0x49, 0x48, - 0x0c, 0x93, 0x15, 0x27, 0x16, 0x05, 0xd2, 0x50, 0xd0, 0x0c, 0xdf, 0x5d, - 0xb9, 0xc0, 0xfc, 0xa2, 0x3a, 0x57, 0x53, 0x74, 0xcd, 0x61, 0x9d, 0x28, - 0xeb, 0xfc, 0x4a, 0x35, 0x6f, 0x3e, 0x1c, 0xc9, 0x2c, 0xb5, 0x60, 0xb4, - 0x08, 0x3e, 0xd2, 0xd6, 0x72, 0x9a, 0x76, 0xf9, 0x00, 0xc4, 0xff, 0xbd, - 0x7c, 0xdc, 0xbb, 0x4d, 0x7a, 0x65, 0x2a, 0x32, 0x28, 0x08, 0x88, 0x69, - 0x0d, 0x55, 0x34, 0x4d, 0xb8, 0x41, 0xca, 0x39, 0x67, 0x9e, 0x07, 0xc4, - 0x61, 0x25, 0x63, 0x47, 0x2d, 0xeb, 0xd9, 0xb3, 0xb0, 0x1e, 0x91, 0x9e, - 0x84, 0x3f, 0x24, 0xa4, 0xd6, 0xcc, 0x8c, 0x49, 0x4d, 0x61, 0xfc, 0x2f, - 0x92, 0x37, 0xc2, 0xe8, 0x55, 0x25, 0x04, 0x5d, 0x13, 0xf6, 0x6e, 0x2c, - 0x68, 0xad, 0xfc, 0xea, 0x5d, 0xa3, 0x9c, 0x94, 0x88, 0x74, 0xc1, 0xc5, - 0x21, 0x65, 0x2d, 0xa6, 0x9d, 0x03, 0xe2, 0x05, 0x4d, 0x6d, 0x1e, 0x0b, - 0xa8, 0x1a, 0xa2, 0xbd, 0x1b, 0xd7, 0x41, 0xeb, 0x57, 0x79, 0x71, 0xa0, - 0x67, 0x90, 0x4f, 0x85, 0xb9, 0xcd, 0xaf, 0xcd, 0xda, 0x79, 0x29, 0x55, - 0xb1, 0x23, 0xe4, 0x64, 0xc8, 0xca, 0x2b, 0xcb, 0x7e, 0x6d, 0x37, 0x7d, - 0x20, 0x27, 0x0f, 0x1e, 0x24, 0xef, 0xc9, 0x9d, 0x44, 0x21, 0xfa, 0x02, - 0x2e, 0x7b, 0xb2, 0x18, 0x42, 0x3d, 0xae, 0x3c, 0x19, 0x6d, 0x4d, 0x6e, - 0x08, 0x8d, 0x45, 0x41, 0xa8, 0x36, 0xd9, 0xf5, 0x65, 0x58, 0xfb, 0xe7, - 0x87, 0x3c, 0x97, 0xcd, 0xa6, 0x67, 0x6d, 0xf6, 0xcf, 0x32, 0xad, 0x9f, - 0xac, 0x5d, 0x7a, 0x01, 0x6b, 0x19, 0x3c, 0xe7, 0xdc, 0x6a, 0x83, 0x09, - 0xcf, 0xde, 0xdc, 0xea, 0x26, 0x75, 0xfb, 0xec, 0x75, 0x3e, 0x25, 0xd0, - 0x98, 0x50, 0x63, 0xe2, 0x37, 0x3c, 0xb4, 0x34, 0x50, 0xda, 0x5f, 0xe6, - 0xb4, 0xbd, 0xe2, 0x51, 0x07, 0x29, 0xc2, 0x27, 0x36, 0xaf, 0xfa, 0x34, - 0xf8, 0xf2, 0x70, 0xce, 0x02, 0xd7, 0x6f, 0x1c, 0xc2, 0x33, 0xb7, 0x1a, - 0xcc, 0x68, 0x0f, 0x88, 0x37, 0x12, 0xea, 0x56, 0x2e, 0x3e, 0x0a, 0xb5, - 0x44, 0x59, 0x17, 0x64, 0xff, 0x77, 0x64, 0x30, 0xc7, 0x6e, 0x3f, 0x5a, - 0x4e, 0x48, 0x03, 0x50, 0xc8, 0xf0, 0xc0, 0xf1, 0xbd, 0x21, 0xe0, 0x04, - 0xdc, 0x92, 0x90, 0x1e, 0x6b, 0x07, 0x99, 0x93, 0xba, 0x38, 0x44, 0x6c, - 0x4f, 0x23, 0x4a, 0x17, 0xc2, 0x1c, 0xba, 0x69, 0x1e, 0x80, 0x23, 0x15, - 0x10, 0x5e, 0x0e, 0xe5, 0x3d, 0x32, 0x3b, 0x20, 0x59, 0x30, 0x2d, 0x67, - 0xca, 0x30, 0xaa, 0xff, 0xf2, 0x3c, 0xaa, 0x61, 0x28, 0xd5, 0xb5, 0x66, - 0xdb, 0xfc, 0x8a, 0xe0, 0x2f, 0x9a, 0x22, 0x7a, 0x18, 0x1f, 0x0c, 0x2b, - 0xab, 0x20, 0xc9, 0x39, 0xbf, 0xe5, 0x34, 0x35, 0x72, 0xc6, 0x82, 0xae, - 0x62, 0xc7, 0xd2, 0x4a, 0xba, 0x57, 0x1c, 0xee, 0x80, 0xbe, 0xc2, 0xce, - 0x1f, 0xfa, 0xdd, 0x89, 0xe2, 0x2c, 0x08, 0xc0, 0xdb, 0x6b, 0xdb, 0x8e, - 0x76, 0xdb, 0x13, 0xec, 0x44, 0x52, 0xce, 0x0d, 0xdb, 0x78, 0x79, 0x02, - 0x2b, 0x2c, 0x91, 0xd5, 0xa8, 0xd5, 0x58, 0xb1, 0x48, 0x78, 0xea, 0xf9, - 0xd2, 0x59, 0x25, 0x50, 0x6d, 0xfd, 0x62, 0x0e, 0x67, 0x71, 0xba, 0x6e, - 0x19, 0xd5, 0x00, 0x46, 0x7c, 0x86, 0xee, 0xc3, 0xb4, 0xc6, 0x0f, 0xcf, - 0xaa, 0x54, 0x8b, 0x97, 0xc4, 0xed, 0x73, 0x18, 0xf9, 0xaa, 0x26, 0x98, - 0xd1, 0x81, 0x44, 0x8e, 0x3c, 0xc8, 0xaa, 0xaa, 0x1f, 0x8d, 0xe2, 0x2c, - 0x6f, 0x09, 0x93, 0x55, 0x6f, 0xf8, 0xba, 0xbb, 0xd6, 0x23, 0x44, 0x3d, - 0x7c, 0x05, 0x15, 0x0c, 0x4e, 0xc2, 0xf9, 0xc7, 0x7e, 0x00, 0x6a, 0xcc, - 0xa3, 0xf8, 0xf8, 0x30, 0x00, 0xc6, 0x7d, 0x38, 0xc9, 0x0b, 0x12, 0xd5, - 0xbb, 0x30, 0xa1, 0x3a, 0x67, 0x4d, 0xb5, 0x26, 0xb7, 0xfe, 0xcb, 0xb7, - 0xa1, 0xd5, 0x0f, 0xac, 0x3d, 0x2f, 0x46, 0xbc, 0xad, 0xbb, 0x41, 0xc8, - 0x8a, 0x9a, 0x58, 0x64, 0x86, 0x58, 0x68, 0x5d, 0x42, 0xf8, 0x8d, 0xa9, - 0xdb, 0xab, 0xeb, 0xc0, 0xdc, 0x0e, 0xbc, 0xef, 0x60, 0x8b, 0x76, 0x91, - 0x58, 0x2f, 0x48, 0x99, 0x59, 0xe7, 0x7b, 0xff, 0x2e, 0x5e, 0x92, 0x0c, - 0x99, 0x79, 0x73, 0x68, 0x7f, 0x0f, 0xc2, 0xeb, 0x73, 0xd8, 0xc4, 0x4f, - 0xba, 0x50, 0xbf, 0xbd, 0xa2, 0xcf, 0x4c, 0xe1, 0xdd, 0x7f, 0x2d, 0xb0, - 0x84, 0x8c, 0xa8, 0x54, 0xbb, 0x5c, 0x56, 0x6f, 0xd9, 0x15, 0x0c, 0x22, - 0x25, 0x36, 0x5d, 0x87, 0xad, 0x3c, 0x4e, 0x0d, 0xc3, 0x0b, 0x09, 0x85, - 0xf9, 0xd4, 0xd5, 0xbf, 0x08, 0x5e, 0x6f, 0xd9, 0x8d, 0x83, 0x56, 0x21, - 0x03, 0xe4, 0xe2, 0x05, 0x31, 0x67, 0x48, 0x23, 0xcb, 0x4e, 0xd9, 0x35, - 0xea, 0x19, 0xf2, 0xde, 0xaf, 0xdd, 0x40, 0xb8, 0x63, 0x00, 0x1c, 0x1b, - 0x35, 0xef, 0x5b, 0x47, 0xad, 0xdd, 0x3b, 0x01, 0x99, 0xd0, 0x40, 0xe8, - 0x4f, 0xb1, 0x66, 0xe4, 0xe6, 0x1b, 0xfb, 0x69, 0xe5, 0x8e, 0x9e, 0xeb, - 0x05, 0xf1, 0xea, 0xfe, 0x21, 0x10, 0x76, 0x42, 0xde, 0xff, 0x94, 0xfc, - 0xea, 0xb4, 0xd3, 0x29, 0xde, 0xa1, 0x1f, 0x9a, 0xa9, 0x2b, 0x51, 0x1c, - 0x98, 0x8b, 0x03, 0xd3, 0x28, 0xb1, 0x73, 0xe4, 0x74, 0xf8, 0x6c, 0x7f, - 0xfa, 0x5c, 0x81, 0x05, 0x32, 0xe4, 0x9f, 0x21, 0x06, 0x78, 0xda, 0xae, - 0x23, 0xdf, 0x63, 0x55, 0x4b, 0x72, 0x96, 0x71, 0x28, 0x0d, 0x9b, 0x44, - 0x85, 0xb1, 0xa2, 0x80, 0x6b, 0xc3, 0xc5, 0x44, 0x69, 0x67, 0x60, 0xcd, - 0x90, 0xdf, 0xe9, 0x8b, 0xf5, 0xec, 0x02, 0x43, 0x9c, 0x74, 0x0b, 0x89, - 0x9e, 0xf3, 0xb9, 0x8b, 0x1c, 0x4b, 0x4c, 0x47, 0xd1, 0x39, 0x6d, 0x47, - 0x2f, 0xa1, 0xbb, 0x1f, 0xd9, 0x1f, 0x3c, 0xe0, 0x4e, 0x6e, 0x65, 0xfa, - 0xeb, 0x65, 0xe5, 0x3f, 0x35, 0xc0, 0xdf, 0x78, 0xfb, 0xf4, 0x26, 0xdf, - 0x80, 0xbc, 0x17, 0x2b, 0x46, 0x7d, 0x8a, 0x50, 0x0c, 0x40, 0x5f, 0xdd, - 0x9d, 0x0b, 0x8a, 0x2c, 0x6a, 0xa9, 0x83, 0xc9, 0x12, 0xc2, 0x7d, 0xde, - 0x2c, 0x75, 0xb7, 0x33, 0x94, 0x83, 0x1b, 0x60, 0xb8, 0xc1, 0xe2, 0xb2, - 0xcf, 0xb2, 0x64, 0x20, 0xae, 0x01, 0xa1, 0x83, 0x5d, 0x02, 0x64, 0xda, - 0x2b, 0xd1, 0x95, 0x19, 0x7a, 0xa3, 0x19, 0x33, 0x1e, 0xcc, 0x46, 0xc4, - 0xec, 0xee, 0xca, 0x93, 0xec, 0x7d, 0x8d, 0x73, 0x11, 0x55, 0x2a, 0xd3, - 0xaa, 0xfa, 0x09, 0x2a, 0x57, 0xc7, 0x62, 0xd5, 0xb3, 0xd3, 0x77, 0x3e, - 0x94, 0xec, 0x15, 0xba, 0xfc, 0xc1, 0x7f, 0x7c, 0xf7, 0x60, 0x9c, 0x84, - 0xc5, 0x8c, 0xe5, 0x1f, 0x73, 0xc7, 0x35, 0x70, 0x0f, 0x04, 0xfd, 0x1a, - 0x93, 0xe8, 0x78, 0x4a, 0xc1, 0x94, 0x59, 0xad, 0x77, 0xb4, 0xaf, 0xb2, - 0xe4, 0xbb, 0x20, 0x65, 0x5e, 0x37, 0xef, 0x3c, 0xab, 0x56, 0x88, 0x35, - 0x56, 0xec, 0x16, 0xdc, 0xf2, 0xe3, 0x62, 0x5d, 0x25, 0x13, 0xa4, 0x63, - 0x37, 0x95, 0xd4, 0x54, 0xbb, 0xd8, 0x89, 0x1a, 0x3b, 0x05, 0x74, 0x0f, - 0xcd, 0xe2, 0x51, 0x47, 0x23, 0x38, 0xf6, 0xa0, 0x46, 0x67, 0xba, 0x29, - 0x83, 0x02, 0x6d, 0xae, 0x75, 0x81, 0x7e, 0x44, 0x19, 0xcf, 0x5d, 0x12, - 0x26, 0xd9, 0x59, 0x6a, 0xb8, 0x82, 0xe1, 0x32, 0x3d, 0xb1, 0xdb, 0x86, - 0x5a, 0xd3, 0x81, 0x9d, 0xc5, 0x6f, 0xa6, 0x2f, 0x37, 0xd6, 0x20, 0xb7, - 0x19, 0xe4, 0x78, 0x54, 0x06, 0xa8, 0xed, 0x8b, 0xbb, 0x3a, 0x8e, 0x95, - 0x68, 0x8e, 0x3b, 0xb5, 0x18, 0x70, 0x93, 0x6f, 0x11, 0xff, 0x39, 0x69, - 0x0a, 0x41, 0x86, 0xd8, 0x6d, 0x11, 0xba, 0x0a, 0x03, 0xb6, 0x50, 0x15, - 0x7e, 0x29, 0xa5, 0x19, 0xcb, 0x03, 0x22, 0xe6, 0xe6, 0xed, 0x53, 0x62, - 0xfa, 0x5a, 0x8a, 0xdd, 0xf1, 0x95, 0x62, 0x79, 0xb0, 0xb2, 0x13, 0xf4, - 0x07, 0x9b, 0x70, 0x32, 0x1d, 0x9a, 0xe3, 0xeb, 0x0b, 0x48, 0x4e, 0xb7, - 0x3d, 0xdd, 0x33, 0x5c, 0x48, 0x46, 0x39, 0x97, 0x01, 0x32, 0x13, 0xad, - 0xf3, 0x39, 0xbd, 0x01, 0x00, 0x0e, 0x04, 0xd3, 0x35, 0x8e, 0x04, 0xb4, - 0x43, 0x87, 0xe8, 0xa5, 0x0a, 0x91, 0xce, 0x63, 0xf1, 0xc4, 0x8d, 0x7e, - 0x16, 0x01, 0xc0, 0xe4, 0xe6, 0x42, 0x96, 0xfe, 0xa1, 0x14, 0xf3, 0x62, - 0x65, 0xbf, 0xa8, 0x43, 0x30, 0x9a, 0xae, 0x9d, 0xa0, 0xb8, 0x8f, 0x28, - 0x60, 0x8d, 0x84, 0xba, 0x74, 0x6b, 0x72, 0x9b, 0x83, 0x22, 0x46, 0xfe, - 0xd6, 0x00, 0x7f, 0x61, 0xaa, 0x54, 0x64, 0xb3, 0xaf, 0xae, 0x84, 0xc4, - 0xf4, 0x98, 0x56, 0xf0, 0x75, 0x2a, 0x6c, 0xae, 0xf3, 0xbb, 0x2a, 0x56, - 0x67, 0x34, 0x2c, 0x18, 0x27, 0x0b, 0x90, 0x7c, 0xb1, 0x13, 0xbc, 0xa1, - 0x35, 0x43, 0x6b, 0x37, 0x83, 0x70, 0x6f, 0x99, 0x13, 0x27, 0x01, 0x8d, - 0xd8, 0xa1, 0xde, 0xa6, 0xa1, 0xee, 0x13, 0x37, 0x00, 0xad, 0xfb, 0xb0, - 0xb3, 0xfc, 0x47, 0xca, 0x1c, 0x09, 0x09, 0x3a, 0x0c, 0xa0, 0x00, 0x4e, - 0x30, 0xc8, 0xe8, 0x49, 0x76, 0x54, 0x95, 0xa3, 0xa2, 0xaf, 0x3a, 0xc8, - 0x2a, 0x18, 0xb8, 0x57, 0xf8, 0x46, 0x59, 0x01, 0xbd, 0x70, 0xf5, 0x2a, - 0x1e, 0x71, 0xb0, 0x90, 0x1d, 0x3c, 0x7a, 0x44, 0x32, 0x7f, 0x3f, 0xe8, - 0xf0, 0x79, 0x34, 0xb5, 0x48, 0x6f, 0x9a, 0x97, 0xbd, 0xd5, 0x95, 0x6f, - 0xde, 0x12, 0x88, 0x6b, 0x16, 0x71, 0x99, 0x94, 0x83, 0x82, 0x08, 0x1b, - 0x00, 0x43, 0x4b, 0x1e, 0x3e, 0xdb, 0xad, 0x89, 0x01, 0x16, 0xff, 0xe8, - 0xd1, 0x1a, 0x02, 0x17, 0xc3, 0x7f, 0xe3, 0x39, 0xfe, 0xfe, 0xd3, 0xa0, - 0xe2, 0x54, 0x10, 0xd1, 0x2c, 0x1d, 0x5d, 0x01, 0xde, 0xec, 0x58, 0xa9, - 0x57, 0xc0, 0xc5, 0xa5, 0x56, 0x19, 0x8c, 0xb3, 0x75, 0xa2, 0x4f, 0xf5, - 0x5a, 0xeb, 0x1e, 0x8e, 0x9f, 0x34, 0x81, 0xbb, 0xe9, 0x86, 0x0a, 0x3e, - 0x66, 0xac, 0x7e, 0x83, 0x1a, 0x5c, 0xfd, 0x5c, 0xf9, 0xf9, 0x2f, 0xf8, - 0xa7, 0x75, 0x77, 0xfa, 0xe3, 0x16, 0xc1, 0x63, 0x9e, 0x7e, 0xce, 0x1f, - 0x55, 0xa6, 0x98, 0x95, 0xe0, 0x30, 0xa0, 0x6e, 0x97, 0xab, 0xa8, 0x78, - 0x09, 0x00, 0x8a, 0x1d, 0x22, 0xc1, 0x21, 0x1c, 0x43, 0x7c, 0x71, 0x23, - 0xea, 0xae, 0xb0, 0x12, 0x43, 0x38, 0x2f, 0x3e, 0xd7, 0x2f, 0x98, 0xe4, - 0x61, 0xb1, 0x1c, 0xeb, 0xa9, 0xc8, 0x7c, 0x99, 0x02, 0xfa, 0x44, 0xb5, - 0xe5, 0x7e, 0x37, 0x37, 0x47, 0xf4, 0x3a, 0x07, 0xa9, 0xc6, 0x1c, 0x55, - 0xe9, 0x49, 0x4a, 0xc9, 0x83, 0x67, 0xf1, 0xf7, 0x59, 0x26, 0x8b, 0xac, - 0x06, 0xe1, 0x83, 0xf6, 0xb8, 0xc7, 0xab, 0x59, 0x1d, 0x64, 0x43, 0x18, - 0xe9, 0x4b, 0x93, 0xf9, 0x32, 0x13, 0xe1, 0x63, 0x25, 0x63, 0x58, 0x01, - 0xd5, 0xa9, 0xcb, 0x2e, 0xa7, 0x95, 0x45, 0x0f, 0xfb, 0x76, 0xb0, 0x2e, - 0x8d, 0xd1, 0xc1, 0xcb, 0x3c, 0x0e, 0xa4, 0xa2, 0x62, 0xb1, 0xa6, 0x52, - 0x27, 0x10, 0xd2, 0x9a, 0xb8, 0x75, 0xee, 0xde, 0xc1, 0xb9, 0xb6, 0xd2, - 0xe8, 0xac, 0xba, 0x27, 0x18, 0xe8, 0xb2, 0x50, 0xf6, 0x4b, 0x93, 0x9c, - 0x6d, 0xe7, 0xf2, 0xae, 0x22, 0xe5, 0x81, 0x7c, 0x9d, 0x5a, 0x7a, 0x43, - 0x4b, 0x82, 0x80, 0x7b, 0xc6, 0x66, 0x6e, 0x80, 0xb8, 0xd1, 0x49, 0x2b, - 0x99, 0x66, 0x86, 0xf7, 0x1a, 0x40, 0x54, 0x67, 0x3f, 0xf3, 0xde, 0xf3, - 0xe1, 0x95, 0x03, 0x09, 0xca, 0x2c, 0x2b, 0x6e, 0x21, 0x21, 0xb9, 0x25, - 0x78, 0x56, 0xcc, 0xf4, 0x4c, 0x5c, 0xf2, 0xa8, 0x4e, 0xf6, 0xd2, 0xc5, - 0xd3, 0x15, 0xc5, 0x34, 0x46, 0x8f, 0x8e, 0xad, 0x58, 0xcf, 0x3f, 0xa9, - 0x74, 0x53, 0x61, 0x23, 0xec, 0xac, 0x5e, 0x8b, 0x55, 0x92, 0x29, 0xcc, - 0x2c, 0x9d, 0x26, 0x78, 0x34, 0x0f, 0xb5, 0x02, 0x58, 0xce, 0x2a, 0x12, - 0x7b, 0x95, 0x17, 0x50, 0x2f, 0x6a, 0x5f, 0x31, 0xe2, 0x8a, 0x0a, 0xa6, - 0xeb, 0x77, 0x1a, 0x58, 0xfb, 0x0d, 0xe2, 0x0e, 0xbd, 0x30, 0xa6, 0x45, - 0xca, 0xdd, 0x38, 0xa3, 0x2a, 0x02, 0x99, 0x07, 0xcb, 0x94, 0xf9, 0x13, - 0x4a, 0xc7, 0x7c, 0xb4, 0x19, 0xd2, 0xbc, 0x66, 0xd7, 0x57, 0xa0, 0xda, - 0xd7, 0xbb, 0x5e, 0xc7, 0x8c, 0x6e, 0xa5, 0xab, 0xf4, 0xee, 0x04, 0xd7, - 0x52, 0x75, 0x1b, 0x72, 0x8d, 0xea, 0x54, 0x14, 0xbc, 0x0f, 0xd9, 0x19, - 0xfc, 0xd7, 0x8f, 0xbf, 0xc0, 0xc9, 0x40, 0xc3, 0xa4, 0x34, 0x9b, 0x3b, - 0xdb, 0x1a, 0x36, 0x4a, 0x8c, 0x05, 0x62, 0xe9, 0x43, 0x42, 0x65, 0x4a, - 0x5d, 0xc2, 0x5c, 0x07, 0x54, 0x1b, 0x7b, 0x61, 0x6a, 0x2d, 0x94, 0x72, - 0x6e, 0x6f, 0x17, 0xeb, 0x5d, 0xd8, 0x50, 0xea, 0xf9, 0x34, 0xb6, 0xc2, - 0xf7, 0x57, 0x5e, 0xa5, 0xcf, 0x25, 0xda, 0x46, 0xa2, 0x5c, 0x2d, 0x73, - 0x85, 0x90, 0xaf, 0x11, 0x3e, 0x4b, 0x10, 0xba, 0x50, 0x18, 0x1c, 0x0d, - 0xcb, 0x8a, 0xb1, 0x41, 0xa2, 0x3c, 0xf6, 0xa7, 0xdd, 0xba, 0xc2, 0xff, - 0xb1, 0x9c, 0x94, 0x5f, 0x3d, 0x05, 0xa9, 0xde, 0x45, 0xcc, 0x0d, 0x15, - 0x5b, 0x99, 0x67, 0xc5, 0x6c, 0xcd, 0xd4, 0xfb, 0x32, 0xf5, 0xc9, 0xc2, - 0xa7, 0x85, 0xd4, 0x40, 0xa6, 0x10, 0x8a, 0x0f, 0xd5, 0x8f, 0x7f, 0x1b, - 0x85, 0x02, 0x23, 0xef, 0xec, 0x36, 0x9a, 0x34, 0x0c, 0x48, 0x12, 0x7a, - 0x01, 0x96, 0x7b, 0xfd, 0x2c, 0xe8, 0x6f, 0xbc, 0x56, 0x06, 0xce, 0x8c, - 0xfa, 0x8e, 0xea, 0xf3, 0xd6, 0xd0, 0x7d, 0x27, 0x63, 0xf0, 0xce, 0x83, - 0xa8, 0x59, 0x81, 0x7b, 0x0e, 0xdf, 0x3f, 0x69, 0x4f, 0x98, 0x9c, 0x52, - 0x6c, 0x8c, 0x07, 0xf0, 0x50, 0x0b, 0xa4, 0x05, 0x49, 0xbe, 0xb2, 0x9c, - 0xfb, 0x74, 0x05, 0x0e, 0x63, 0xfd, 0x6d, 0x26, 0xe1, 0xbe, 0x28, 0x30, - 0x82, 0x6e, 0x52, 0xe0, 0x3b, 0x07, 0xfe, 0xa5, 0x88, 0x48, 0xfe, 0x81, - 0xec, 0x7e, 0xc1, 0xf0, 0xce, 0xd7, 0x98, 0xf0, 0x31, 0x74, 0x04, 0x2e, - 0x87, 0xe0, 0x91, 0x54, 0xad, 0x58, 0x5a, 0x41, 0x3a, 0x78, 0x7f, 0xa0, - 0x75, 0x1f, 0x06, 0x7b, 0xa2, 0x5e, 0xeb, 0x33, 0x56, 0x9d, 0x45, 0x2a, - 0x9c, 0xec, 0x54, 0xb3, 0xc5, 0x46, 0xa2, 0x2a, 0x7e, 0xa8, 0x44, 0x30, - 0xf1, 0x1c, 0x9e, 0x15, 0x93, 0x6b, 0x0f, 0x7f, 0x58, 0xb3, 0xfe, 0xde, - 0xf4, 0x95, 0x78, 0x82, 0xb7, 0xaa, 0xe3, 0x61, 0x11, 0xcf, 0xa4, 0x7f, - 0x85, 0x65, 0xd6, 0x0d, 0xe4, 0x64, 0x3e, 0xc2, 0xb1, 0x00, 0x7c, 0x53, - 0x3e, 0x3f, 0xfd, 0xbb, 0x21, 0x07, 0x14, 0x9a, 0x84, 0xe2, 0x16, 0x6a, - 0x5f, 0x7a, 0x2f, 0x5f, 0xf3, 0x52, 0x04, 0xc7, 0xf1, 0xc6, 0x47, 0xd5, - 0x50, 0xb9, 0x8b, 0x5d, 0x2a, 0x70, 0xae, 0xd5, 0x11, 0x1f, 0x78, 0x19, - 0x97, 0xbe, 0xa3, 0xf7, 0x2b, 0x13, 0x22, 0x50, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0xdb, 0xc3, 0xbb, 0xbe, 0xc6, 0xdb, 0xb8, 0x5a, - 0x6e, 0x3e, 0xc4, 0xdb, 0x09, 0x38, 0x0c, 0x16, 0x0c, 0x4e, 0xa7, 0x76, - 0xb6, 0xf9, 0x26, 0x3c, 0x23, 0xa3, 0x61, 0xcd, 0xbc, 0x71, 0x13, 0x6e, - 0x5c, 0x32, 0x09, 0xc1, 0xcb, 0xec, 0x84, 0xf6, 0xf7, 0x72, 0x35, 0x48, - 0x63, 0xde, 0xe2, 0x67, 0x7e, 0x85, 0x12, 0x0a, 0xa7, 0xf3, 0xd1, 0x23, - 0xb5, 0xf2, 0xca, 0xec, 0x1c, 0xcc, 0x82, 0x75, 0x11, 0xb6, 0xd2, 0x18, - 0x48, 0xa8, 0x9f, 0x71, 0xed, 0x64, 0x13, 0x9b, 0x6c, 0x35, 0x35, 0x2d, - 0xc0, 0xa1, 0x92, 0x66, 0xf1, 0xc8, 0x90, 0x57, 0x12, 0xe9, 0xd8, 0xa9, - 0xbc, 0x6a, 0x0e, 0xd5, 0xcd, 0x2a, 0x13, 0x5e, 0x20, 0xb6, 0x44, 0xd5, - 0xd6, 0x49, 0x3a, 0x29, 0x74, 0xe1, 0xbc, 0x83, 0xbb, 0xde, 0x3f, 0x6f, - 0xc5, 0x5d, 0x9f, 0xbf, 0xc0, 0x9b, 0x03, 0xf4, 0xa1, 0x37, 0xe0, 0x28, - 0xb9, 0x52, 0x69, 0xf5, 0xf5, 0xdd, 0x8c, 0x41, 0x59, 0xca, 0xec, 0x3c, - 0x90, 0x04, 0x85, 0xa8, 0x05, 0x38, 0x8e, 0x9f, 0x78, 0xa2, 0x3c, 0x35, - 0x88, 0xff, 0x72, 0x6f, 0x9d, 0x8c, 0x17, 0xc6, 0x21, 0xbe, 0x00, 0xc8, - 0x5c, 0x88, 0x4c, 0x04, 0x46, 0xc7, 0x0c, 0x7c, 0x4e, 0xac, 0xd0, 0x38, - 0xd3, 0xeb, 0xa5, 0x17, 0x6b, 0xb9, 0xad, 0xd8, 0x09, 0x30, 0xd3, 0x77, - 0x69, 0xcd, 0x3d, 0x53, 0x8f, 0x08, 0xc2, 0x8a, 0xf9, 0x7e, 0x58, 0x81, - 0x7d, 0xc6, 0x60, 0xd0, 0xf4, 0x34, 0x88, 0xb7, 0xfa, 0x2e, 0x4d, 0x75, - 0x79, 0xcf, 0xb6, 0x28, 0xcf, 0x1c, 0x91, 0xef, 0xe5, 0x38, 0x34, 0x20, - 0x35, 0x8f, 0xc2, 0x21, 0x92, 0x4a, 0x5a, 0x52, 0x98, 0x65, 0x52, 0x3a, - 0x46, 0xfe, 0x79, 0x5d, 0x94, 0xc6, 0x16, 0x40, 0x71, 0xe2, 0xa1, 0xa5, - 0xf0, 0xfc, 0xc6, 0x9a, 0x9e, 0x92, 0x40, 0x44, 0x29, 0xcf, 0x2b, 0xeb, - 0x05, 0xe4, 0x72, 0x89, 0xcf, 0x03, 0x84, 0xf5, 0xa1, 0x56, 0x74, 0xfe, - 0xe1, 0x03, 0xcc, 0xb9, 0xb4, 0x76, 0xba, 0x32, 0xb3, 0x16, 0xb3, 0xa6, - 0x91, 0x71, 0x80, 0x0c, 0x51, 0xb4, 0x00, 0x71, 0x8b, 0x83, 0x39, 0x8a, - 0x7e, 0x96, 0x2e, 0x61, 0x00, 0x73, 0xbe, 0x54, 0xc9, 0x6c, 0x24, 0x68, - 0x81, 0x6f, 0x28, 0x33, 0x65, 0x60, 0x28, 0xa7, 0xe0, 0x09, 0x3d, 0xef, - 0xf1, 0x0b, 0x84, 0x21, 0xc4, 0xf9, 0x07, 0x30, 0x69, 0x56, 0x24, 0xca, - 0x2b, 0x3f, 0x68, 0xf9, 0x34, 0x3b, 0x34, 0xe9, 0x0d, 0x49, 0x8d, 0xb6, - 0x98, 0x6c, 0x5a, 0xe1, 0x0d, 0x75, 0x05, 0x5a, 0x6c, 0xad, 0xc8, 0x0f, - 0x99, 0xa0, 0x87, 0x2e, 0xc9, 0x71, 0xb5, 0xbf, 0xd0, 0x02, 0xbd, 0x2a, - 0xe2, 0x27, 0x0b, 0x87, 0x55, 0x5e, 0xaa, 0x42, 0x47, 0xaa, 0x02, 0x2b, - 0x62, 0x70, 0xba, 0x70, 0x34, 0xd5, 0xb1, 0x9a, 0x43, 0x92, 0xdc, 0xf4, - 0x8f, 0x33, 0x1d, 0x44, 0xf8, 0xc7, 0x00, 0x38, 0x56, 0x1e, 0x0b, 0x12, - 0xd4, 0xa4, 0x03, 0xea, 0xa6, 0xd1, 0xad, 0x20, 0xd0, 0x88, 0xb6, 0x97, - 0x91, 0x77, 0x8b, 0x21, 0x76, 0x68, 0xc9, 0x0b, 0x87, 0xbf, 0x65, 0xc9, - 0x22, 0x30, 0xf7, 0xfd, 0x3d, 0x67, 0x14, 0x37, 0x77, 0x19, 0x99, 0xef, - 0xb1, 0xb4, 0x05, 0xc0, 0xa6, 0x4e, 0x8f, 0xf2, 0x8b, 0xcf, 0x71, 0xbd, - 0x16, 0x34, 0x8e, 0x05, 0x1a, 0x84, 0x71, 0xa8, 0x24, 0x22, 0x55, 0xdc, - 0xfb, 0x70, 0xdd, 0x4c, 0x2b, 0xa4, 0xcd, 0xb6, 0xf4, 0xda, 0x0d, 0x0e, - 0xaf, 0x65, 0xb5, 0x84, 0x9c, 0x48, 0x81, 0x2b, 0x44, 0x63, 0xc7, 0xbf, - 0x56, 0xcd, 0xcf, 0x5f, 0x9d, 0xfa, 0xca, 0xaa, 0x65, 0xb0, 0xab, 0xbb, - 0xa8, 0x83, 0xd2, 0xbb, 0xc9, 0x43, 0x9c, 0x5a, 0x5e, 0xbd, 0x1e, 0x40, - 0x18, 0x9e, 0xb8, 0xae, 0xee, 0x6f, 0x0f, 0x24, 0xb5, 0x1b, 0x53, 0x54, - 0x8f, 0xc2, 0xd4, 0x61, 0x25, 0xac, 0x6a, 0x6c, 0x7f, 0x81, 0xd0, 0x3a, - 0x51, 0x6d, 0x36, 0xf6, 0xf1, 0x87, 0x93, 0x28, 0x2f, 0xf7, 0x00, 0xc6, - 0xd4, 0x7e, 0x97, 0xe3, 0x0f, 0x3a, 0xed, 0xcb, 0x07, 0x10, 0x93, 0xef, - 0xa5, 0xe4, 0x3f, 0x8d, 0x34, 0x28, 0xf3, 0xd8, 0x48, 0x87, 0xd2, 0xc9, - 0xa8, 0x65, 0xe3, 0xcf, 0xb1, 0x85, 0x79, 0x86, 0xf1, 0x22, 0x1c, 0x68, - 0xc3, 0x77, 0x1b, 0x78, 0xb6, 0xb7, 0x9d, 0x99, 0xc4, 0x2a, 0x92, 0xcd, - 0x47, 0xe8, 0xdc, 0x79, 0x6f, 0x6c, 0xe4, 0x29, 0xf0, 0x1d, 0x8e, 0x86, - 0x0b, 0x36, 0x4b, 0x3a, 0x3a, 0x93, 0xd0, 0xa4, 0x23, 0x1f, 0x63, 0x3b, - 0x6e, 0x21, 0xbf, 0xdc, 0x2e, 0xdc, 0xb3, 0x31, 0x55, 0x9c, 0x8a, 0xa7, - 0x2f, 0x83, 0xa4, 0x54, 0x9b, 0xd3, 0x27, 0xdb, 0x8f, 0xd3, 0x6b, 0xfe, - 0x39, 0x01, 0x7d, 0x10, 0xd9, 0x5e, 0x84, 0x7d, 0xa3, 0xd1, 0x84, 0xb8, - 0x80, 0xfb, 0x4e, 0xed, 0x40, 0xa4, 0xf2, 0x7e, 0x04, 0xfb, 0x48, 0x43, - 0xbf, 0x1a, 0xd6, 0x83, 0xbb, 0x55, 0x0b, 0x7b, 0xc7, 0xef, 0x12, 0x8c, - 0xe1, 0x12, 0xbd, 0xbd, 0x11, 0xfa, 0x5c, 0x19, 0xe8, 0x70, 0xc1, 0x0d, - 0x1d, 0xe9, 0xe7, 0xa3, 0xf4, 0x5a, 0x91, 0x2d, 0x07, 0x85, 0x33, 0x04, - 0x61, 0x60, 0xd5, 0x2f, 0x42, 0x64, 0xdb, 0x17, 0xc3, 0x5f, 0xce, 0x5f, - 0xa7, 0x72, 0xe6, 0xb9, 0xf7, 0x8a, 0x25, 0x50, 0xa1, 0xdf, 0x8b, 0x41, - 0xc9, 0x2a, 0xee, 0xe4, 0x8b, 0x41, 0x60, 0x56, 0xff, 0x3c, 0xd2, 0x44, - 0x2f, 0x92, 0x9c, 0x24, 0x2e, 0x09, 0x62, 0xa7, 0x53, 0x18, 0x66, 0x3e, - 0xf3, 0xc9, 0xa8, 0x65, 0xb8, 0xc8, 0x5e, 0xc7, 0xbf, 0x03, 0xed, 0x32, - 0xdd, 0x1a, 0xdf, 0xd6, 0x86, 0x3e, 0x74, 0xf5, 0x7e, 0x89, 0x7e, 0x44, - 0x91, 0xc6, 0x71, 0x0b, 0xdb, 0x6f, 0x8b, 0x5b, 0xd2, 0x0e, 0xab, 0x1b, - 0x34, 0x4d, 0x95, 0x00, 0x40, 0xe9, 0x7a, 0xcb, 0xef, 0x4e, 0xa5, 0xc0, - 0x07, 0x49, 0x78, 0xaa, 0x26, 0xdf, 0x90, 0x69, 0x18, 0x3e, 0xd0, 0xa2, - 0x89, 0xe5, 0xb0, 0xd1, 0x0e, 0x5f, 0xf6, 0xa9, 0xe9, 0xf2, 0x9a, 0xc7, - 0x13, 0x60, 0xd2, 0x14, 0xfa, 0x14, 0x2c, 0xe4, 0x9c, 0x7e, 0x5b, 0x88, - 0x78, 0x1e, 0xd8, 0x22, 0xe8, 0xac, 0xc7, 0xce, 0x45, 0x0f, 0x66, 0xe5, - 0x83, 0xe4, 0x9d, 0xd1, 0xfe, 0x37, 0xe6, 0x15, 0x41, 0x24, 0x82, 0x16, - 0xca, 0x8f, 0x6e, 0x00, 0xa0, 0xdb, 0x7b, 0xcf, 0xd7, 0x94, 0x52, 0x03, - 0xf8, 0x45, 0xc9, 0x64, 0x9b, 0x25, 0x97, 0x18, 0x46, 0x82, 0xbe, 0x6d, - 0xd8, 0x0d, 0x7e, 0xcf, 0xef, 0x70, 0xd8, 0x62, 0x42, 0xe8, 0xd8, 0x17, - 0x86, 0xdd, 0x4f, 0xa1, 0xea, 0xb6, 0x09, 0x05, 0x2c, 0x69, 0x63, 0x4b, - 0x49, 0x50, 0xb0, 0x68, 0xab, 0xee, 0xf3, 0xf6, 0xb4, 0x8d, 0x48, 0xf0, - 0x24, 0x37, 0x0e, 0xe3, 0x08, 0x4e, 0xcb, 0x31, 0x57, 0x31, 0x39, 0x20, - 0x16, 0x77, 0xcf, 0xe6, 0x05, 0x08, 0x43, 0xf7, 0x62, 0x95, 0x31, 0x66, - 0x34, 0x3b, 0x34, 0xe9, 0x0d, 0x43, 0x8a, 0xb6, 0x98, 0x69, 0x44, 0xe1, - 0x0d, 0x77, 0x0a, 0x5a, 0x01, 0x38, 0x85, 0x4b, 0xf4, 0xda, 0x08, 0xe5, - 0x72, 0xa6, 0xe6, 0xd1, 0x16, 0x4b, 0x26, 0x1e, 0x33, 0x89, 0x21, 0xea, - 0xe4, 0x76, 0xb0, 0x12, 0xd6, 0x54, 0x85, 0xd6, 0x12, 0x15, 0x8d, 0x80, - 0x1b, 0x87, 0xbd, 0xed, 0x10, 0xe9, 0xc8, 0xf5, 0x5b, 0x7d, 0xdf, 0x66, - 0xe2, 0xb2, 0x31, 0xbb, 0xe6, 0x17, 0x3d, 0x63, 0x98, 0x62, 0xcf, 0x79, - 0xf0, 0x99, 0xee, 0xd3, 0x26, 0x7e, 0x8a, 0x98, 0xbb, 0xde, 0x38, 0x68, - 0xc5, 0x5d, 0x81, 0xa1, 0xc0, 0x9b, 0x0c, 0xfb, 0xa1, 0x37, 0xe0, 0x28, - 0xc2, 0xe6, 0x99, 0x50, 0x56, 0x50, 0x8b, 0x1f, 0x52, 0x38, 0x76, 0xe9, - 0x14, 0x91, 0xf9, 0xbf, 0x1a, 0xd1, 0x1a, 0xb4, 0xbb, 0xf0, 0xb9, 0x1a, - 0x84, 0x99, 0xc3, 0x0a, 0x61, 0x30, 0xad, 0xb5, 0xca, 0xfe, 0x19, 0xe4, - 0xbb, 0x6a, 0xe9, 0xe8, 0x13, 0xfe, 0xe8, 0xa4, 0x4f, 0x48, 0x70, 0xbf, - 0xd3, 0xeb, 0xa5, 0x67, 0x7b, 0xa9, 0xac, 0xd8, 0x19, 0x30, 0xd2, 0x84, - 0x69, 0xcd, 0x3d, 0x53, 0x75, 0xfa, 0x9b, 0xca, 0x50, 0x6c, 0x44, 0x88, - 0x7c, 0x25, 0xa9, 0x51, 0xd6, 0x9d, 0x8e, 0x4d, 0x1a, 0xef, 0x1e, 0xc2, - 0x84, 0xe6, 0xdf, 0x46, 0x1f, 0x18, 0x3b, 0x3a, 0x7c, 0xc9, 0x4c, 0x80, - 0x4b, 0x43, 0x24, 0x83, 0x98, 0x2d, 0x96, 0x61, 0x69, 0x23, 0x50, 0xce, - 0x90, 0x8f, 0x27, 0x36, 0x61, 0xe1, 0x7b, 0x78, 0xf5, 0x41, 0x85, 0xa6, - 0x27, 0x4b, 0xe5, 0xba, 0x73, 0xd7, 0xbb, 0x20, 0xa5, 0xe4, 0x3e, 0x8c, - 0x34, 0x28, 0xf2, 0xd9, 0x48, 0x87, 0xd2, 0xc9, 0xa8, 0x65, 0xe3, 0xcf, - 0xb1, 0x85, 0x79, 0x86, 0xf1, 0x22, 0x1c, 0x68, 0xc3, 0x77, 0x1b, 0x78, - 0xb6, 0xb7, 0x9d, 0x99, 0x23, 0xba, 0xf0, 0xcd, 0x6a, 0x98, 0x98, 0x7d, - 0x1e, 0x9a, 0xa1, 0x3d, 0xf9, 0x53, 0xd8, 0x97, 0x7f, 0x57, 0x1b, 0xc2, - 0x6f, 0xa4, 0x5f, 0xfc, 0x8d, 0x62, 0xd4, 0xcb, 0xa4, 0xd0, 0xa1, 0x7f, - 0x04, 0x60, 0x8d, 0x8f, 0x5f, 0x78, 0xff, 0x14, 0xd0, 0xc0, 0x3d, 0x9d, - 0x69, 0xe6, 0x14, 0x5d, 0xed, 0x28, 0x75, 0x06, 0x15, 0xb9, 0x69, 0x3a, - 0xe7, 0xa0, 0x8a, 0x2e, 0x22, 0x08, 0x3e, 0x59, 0xaf, 0x90, 0x13, 0x45, - 0x31, 0x9f, 0x8d, 0xeb, 0xc2, 0x5d, 0x36, 0x5e, 0x4f, 0xf1, 0x41, 0x99, - 0x30, 0x17, 0xb5, 0xfd, 0x62, 0x8b, 0x1a, 0x3b, 0xc3, 0x80, 0x5f, 0xf2, - 0xf9, 0xfe, 0x19, 0x2f, 0x19, 0x81, 0x6c, 0x82, 0x34, 0x52, 0xc1, 0x47, - 0x5e, 0xd1, 0x9a, 0x66, 0x7b, 0x8e, 0x16, 0xd9, 0xc1, 0xe2, 0x87, 0x09, - 0x2b, 0x40, 0x5b, 0x1d, 0xdc, 0x51, 0x37, 0xb9, 0x7d, 0xd6, 0x0f, 0x7e, - 0xde, 0x8c, 0x7e, 0x52, 0x21, 0x8f, 0x38, 0xb9, 0x1b, 0x8f, 0xee, 0x5b, - 0x7a, 0xe6, 0x2c, 0x4b, 0x57, 0x6b, 0x5a, 0x91, 0xcd, 0x5d, 0x7c, 0xba, - 0x14, 0x14, 0x03, 0xff, 0xd0, 0x05, 0xa7, 0x07, 0xf6, 0x71, 0x65, 0x14, - 0x9c, 0x16, 0xa0, 0xd1, 0xc2, 0x09, 0x0a, 0xc7, 0x3c, 0xf2, 0x7a, 0x01, - 0x24, 0xad, 0xb9, 0xb5, 0x24, 0x2f, 0xcd, 0x2f, 0x06, 0xed, 0x0d, 0x2b, - 0x00, 0x99, 0xec, 0x02, 0xc3, 0x91, 0xc0, 0x35, 0xe1, 0x0a, 0x36, 0x77, - 0x8b, 0x04, 0xb0, 0x9e, 0x97, 0xc5, 0x55, 0x34, 0xb7, 0x03, 0x59, 0x62, - 0xc2, 0x58, 0x70, 0x0f, 0x63, 0x1e, 0x82, 0x4f, 0x76, 0x65, 0xe5, 0x8d, - 0x56, 0xb0, 0xc7, 0xce, 0xb5, 0xe6, 0x5d, 0x68, 0xd5, 0x01, 0x10, 0xe0, - 0x5b, 0x31, 0x11, 0xd8, 0xcc, 0xe4, 0xf2, 0x45, 0xa4, 0x25, 0x92, 0x99, - 0x9b, 0xd6, 0x90, 0x76, 0x62, 0xd1, 0xaf, 0x41, 0x35, 0x99, 0x61, 0x6f, - 0x01, 0xf7, 0x9e, 0x12, 0xfe, 0x70, 0x5f, 0xde, 0xd7, 0xe4, 0xe9, 0x95, - 0x58, 0x9c, 0x0d, 0x6f, 0x6d, 0xa1, 0x2f, 0xd8, 0xe7, 0x22, 0x13, 0x8b, - 0x1a, 0x05, 0xc4, 0xe9, 0xe1, 0x01, 0xcc, 0xb9, 0xb4, 0x7c, 0xba, 0x32, - 0xb3, 0x13, 0xb3, 0xa6, 0x91, 0x73, 0x80, 0x0c, 0xd5, 0x1d, 0xf2, 0xdf, - 0xc8, 0xc1, 0xe1, 0xe9, 0xe5, 0x2c, 0x39, 0xa9, 0x65, 0xf6, 0x9c, 0x8c, - 0xa9, 0x19, 0xaa, 0xa6, 0xa9, 0x88, 0x4f, 0x85, 0x56, 0x88, 0xe0, 0x1c, - 0xe2, 0x6c, 0xe0, 0x87, 0xfc, 0xe4, 0x53, 0x35, 0x95, 0x4c, 0xc2, 0x1f, - 0xc6, 0x93, 0x91, 0x55, 0xa8, 0x9b, 0x45, 0x4e, 0x34, 0x3b, 0x35, 0xe9, - 0x0d, 0x49, 0x8d, 0xb6, 0x98, 0x6c, 0x5a, 0xe1, 0x0d, 0x75, 0x05, 0x5a, - 0x47, 0x31, 0xa8, 0x4d, 0xee, 0x98, 0x44, 0xae, 0x35, 0xba, 0xd2, 0x78, - 0x98, 0x5a, 0x0c, 0x76, 0x33, 0x89, 0x21, 0xea, 0xe4, 0x76, 0xb0, 0x12, - 0xd6, 0x54, 0x85, 0xd6, 0x15, 0x15, 0x87, 0x80, 0xb1, 0x84, 0x72, 0x32, - 0x3c, 0xb2, 0x21, 0xfe, 0x83, 0x5b, 0x3b, 0x2f, 0x14, 0xec, 0xb1, 0x27, - 0xc1, 0xe2, 0xf0, 0x7e, 0x2b, 0x40, 0x5b, 0x6d, 0xdc, 0x51, 0x36, 0xa8, - 0x7d, 0xd6, 0x0e, 0x6e, 0xde, 0x8c, 0x7e, 0x52, 0x21, 0x8f, 0x38, 0xb9, - 0x1b, 0x8f, 0xee, 0x5b, 0x7a, 0xe6, 0x2c, 0x4b, 0x77, 0xa0, 0xe1, 0xda, - 0x6f, 0x48, 0x3c, 0x94, 0x04, 0x7f, 0xb3, 0x86, 0x75, 0x48, 0x57, 0xa9, - 0xdc, 0x1b, 0x58, 0x25, 0x88, 0x85, 0x9b, 0xa4, 0x86, 0x20, 0xd0, 0x79, - 0xc1, 0xcf, 0x38, 0x6d, 0x1e, 0xee, 0xe7, 0x22, 0x23, 0x08, 0xc3, 0xb8, - 0xc2, 0x8b, 0x37, 0xe1, 0xf0, 0xbb, 0x49, 0xcc, 0xd3, 0xeb, 0xa5, 0x67, - 0x6b, 0xa9, 0xac, 0xd8, 0x09, 0x30, 0xd2, 0x87, 0x69, 0xcd, 0x3d, 0x53, - 0x8f, 0x08, 0xc2, 0x8a, 0xf9, 0x7e, 0x58, 0x81, 0x7d, 0xc6, 0x60, 0xd0, - 0xf4, 0x34, 0x88, 0xb7, 0x42, 0xed, 0xf1, 0xe9, 0xb4, 0x53, 0x05, 0x51, - 0xa1, 0xdc, 0xc6, 0xc5, 0x17, 0xd4, 0x8f, 0x0b, 0x8d, 0x60, 0x49, 0x1e, - 0x9c, 0xfa, 0x41, 0xc3, 0xf4, 0x47, 0x5f, 0x68, 0x6d, 0x12, 0x1e, 0x6b, - 0x93, 0xd7, 0x98, 0x72, 0xda, 0x18, 0x92, 0x9a, 0x27, 0xaf, 0xda, 0xc2, - 0x59, 0x8c, 0xab, 0x69, 0x29, 0xdf, 0x2a, 0xea, 0x05, 0xe4, 0x73, 0x79, - 0xcf, 0x03, 0x84, 0xf5, 0xa1, 0x56, 0x74, 0xfe, 0x07, 0x7e, 0xfe, 0xfa, - 0x8e, 0xb1, 0xaf, 0xbb, 0xd8, 0x93, 0xb8, 0x14, 0x2b, 0x91, 0x3d, 0xde, - 0x4f, 0xc3, 0x03, 0xdf, 0xc7, 0xfa, 0x15, 0x4e, 0x8a, 0x2f, 0x6d, 0x4a, - 0x7a, 0x37, 0x3d, 0xce, 0x0d, 0x8d, 0x52, 0x8b, 0x10, 0xff, 0x6f, 0x20, - 0xd0, 0xc3, 0xed, 0xe8, 0x2b, 0x45, 0x55, 0x49, 0x75, 0x4a, 0x9d, 0xbf, - 0x3b, 0xbf, 0x68, 0xaa, 0xad, 0x1c, 0xb6, 0x02, 0xf1, 0x4b, 0x9b, 0xfe, - 0xed, 0x28, 0x74, 0x04, 0x15, 0xb9, 0x69, 0x3d, 0xe7, 0xa0, 0x8a, 0x30, - 0x22, 0x08, 0x3e, 0x56, 0xf0, 0xc6, 0x2f, 0x51, 0xd2, 0x7d, 0x1b, 0xd4, - 0x9e, 0x00, 0x71, 0x79, 0xbb, 0x99, 0x6b, 0xe9, 0x33, 0x8c, 0x21, 0xe8, - 0xe4, 0x74, 0xb0, 0x13, 0xd6, 0x5e, 0x85, 0xd2, 0x15, 0x15, 0x8d, 0x80, - 0x3a, 0x79, 0x94, 0xe1, 0x25, 0xcb, 0xda, 0xdb, 0x15, 0x0b, 0x41, 0xe7, - 0x1f, 0xae, 0x62, 0x59, 0x44, 0x99, 0x76, 0xb4, 0xb7, 0x87, 0x33, 0x45, - 0x82, 0x87, 0x7b, 0xfb, 0x38, 0x23, 0xd9, 0x69, 0xb4, 0xd0, 0xf3, 0xbb, - 0xb7, 0xd6, 0x70, 0xf4, 0x20, 0x12, 0x46, 0x4e, 0x61, 0xf4, 0xc4, 0x0a, - 0xb5, 0xdc, 0x40, 0x55, 0x60, 0x18, 0xc4, 0x23, 0xaa, 0x34, 0xc3, 0x92, - 0xc1, 0x6d, 0x7a, 0x41, 0xf5, 0x84, 0xb8, 0xf8, 0x6a, 0xa6, 0xd9, 0xe5, - 0x8a, 0x00, 0xaa, 0x6f, 0xcc, 0x76, 0x7b, 0x7d, 0x7b, 0xe8, 0x57, 0x54, - 0x80, 0x14, 0xc8, 0xf3, 0xf6, 0xb6, 0x3c, 0x00, 0xf7, 0x17, 0x50, 0x09, - 0x19, 0xa8, 0x64, 0x62, 0xa5, 0x83, 0xb9, 0x04, 0xc7, 0xee, 0x5b, 0x5f, - 0xc2, 0x77, 0xad, 0x02, 0x65, 0xb0, 0xb5, 0xbb, 0xa8, 0x83, 0xdd, 0xbb, - 0xc9, 0x43, 0x9c, 0x5a, 0x5e, 0xbd, 0x1e, 0x40, 0xe4, 0x8c, 0x36, 0xf6, - 0x4d, 0x75, 0xde, 0xeb, 0xb9, 0xbc, 0x13, 0x95, 0x9b, 0xe5, 0x6a, 0xcc, - 0x6b, 0x61, 0xd9, 0xe1, 0x9d, 0xc0, 0x0d, 0xf4, 0xfe, 0x9d, 0xcf, 0xf8, - 0x4d, 0xc1, 0xbd, 0x58, 0xbe, 0x39, 0xba, 0x25, 0x61, 0xaf, 0xf5, 0xc1, - 0x63, 0x96, 0xf5, 0xbe, 0x1d, 0x14, 0xe2, 0xc8, 0xf5, 0xc8, 0x07, 0x20, - 0x9d, 0xbe, 0xb2, 0x64, 0xe5, 0x88, 0x83, 0xf7, 0x04, 0x40, 0xa8, 0x1a, - 0x95, 0x54, 0x96, 0x2c, 0x07, 0x36, 0x08, 0xb7, 0x65, 0x4a, 0xc4, 0xf9, - 0x3c, 0x76, 0x18, 0x96, 0xee, 0x9c, 0x9a, 0x0a, 0x7d, 0x9a, 0x98, 0x11, - 0xf4, 0xc4, 0x38, 0x84, 0x38, 0x17, 0xf9, 0xc7, 0x1a, 0xef, 0x08, 0x55, - 0x35, 0xa1, 0xc9, 0x31, 0x7f, 0x41, 0xb8, 0x69, 0xef, 0x24, 0x52, 0x8c, - 0xd9, 0xbf, 0x49, 0xac, 0x0e, 0x62, 0xca, 0xd6, 0x6e, 0x3f, 0xe9, 0x85, - 0xac, 0xda, 0xe8, 0x13, 0x34, 0x3b, 0x34, 0xe9, 0x0d, 0x43, 0x8d, 0xb6, - 0x98, 0x69, 0x5a, 0xe1, 0x0d, 0x77, 0x05, 0x5a, 0x5d, 0x21, 0xf4, 0xba, - 0xe8, 0x99, 0xad, 0x51, 0x03, 0x3e, 0x88, 0xb9, 0xa8, 0x35, 0x65, 0x69, - 0xa5, 0x55, 0x0b, 0x79, 0xc8, 0xef, 0x12, 0x8d, 0xe6, 0x12, 0xbd, 0xb9, - 0x16, 0xf0, 0x5c, 0x1d, 0x48, 0x05, 0x1c, 0x75, 0x9a, 0x30, 0x93, 0xca, - 0x2b, 0x80, 0x1e, 0x24, 0xa6, 0xd2, 0x2b, 0xe4, 0xc1, 0xe2, 0xf0, 0x7e, - 0x2b, 0x40, 0x5b, 0x6d, 0xcc, 0x41, 0x37, 0xa8, 0x6d, 0xc6, 0x0f, 0x6e, - 0xbb, 0xd4, 0x3f, 0x68, 0xc5, 0x58, 0x9f, 0xa1, 0xc0, 0x99, 0x03, 0xfb, - 0xa1, 0x37, 0xe0, 0x28, 0x7f, 0x60, 0xf8, 0xe9, 0x57, 0xf4, 0xaf, 0xc4, - 0xde, 0x6a, 0x15, 0x28, 0x3b, 0xd1, 0x11, 0x5e, 0xdc, 0x19, 0x58, 0x24, - 0x88, 0x8f, 0x9b, 0xa0, 0x81, 0x20, 0xd0, 0x79, 0xc1, 0xcf, 0x38, 0x6d, - 0x23, 0xbe, 0xba, 0xca, 0x4b, 0x28, 0x68, 0x2c, 0xa1, 0xa1, 0x61, 0xb0, - 0x24, 0x9c, 0xe4, 0xd3, 0xee, 0x84, 0xb5, 0x70, 0x2d, 0x63, 0xbf, 0x98, - 0xb1, 0x14, 0x83, 0x38, 0xc6, 0xd0, 0x3a, 0x6a, 0x56, 0x35, 0xdd, 0xbd, - 0x2b, 0xd0, 0xe3, 0x51, 0x35, 0x4f, 0xbe, 0x4f, 0x6b, 0xa9, 0x81, 0x36, - 0xf5, 0x2e, 0x4d, 0x75, 0x79, 0xcf, 0xb6, 0x28, 0xcf, 0x1c, 0x91, 0xef, - 0xe5, 0x38, 0x34, 0x20, 0x81, 0x03, 0x9a, 0x32, 0x87, 0x59, 0xcb, 0xc6, - 0x2e, 0x94, 0x91, 0xfa, 0xa5, 0x9b, 0xb0, 0x1a, 0x5d, 0xcc, 0x6e, 0x59, - 0x38, 0xd8, 0xf2, 0x3a, 0x79, 0xbc, 0x9e, 0xb6, 0x83, 0xed, 0x85, 0x6d, - 0x4b, 0xb4, 0x2c, 0x85, 0x0d, 0xfc, 0xae, 0xd2, 0x18, 0x37, 0x2c, 0xaf, - 0x0e, 0xe0, 0x91, 0x16, 0x07, 0x7e, 0xfe, 0xfa, 0x89, 0xb1, 0xaf, 0xbb, - 0xc6, 0x93, 0xb8, 0x14, 0x24, 0x91, 0x3d, 0xde, 0x08, 0x32, 0x49, 0x55, - 0xa0, 0xa5, 0x8f, 0xe2, 0xf8, 0x53, 0xb1, 0x85, 0x5b, 0x6e, 0xd7, 0x25, - 0x55, 0x2d, 0x4b, 0x25, 0x9e, 0xd3, 0xdb, 0xbc, 0x59, 0xd6, 0x19, 0xee, - 0xce, 0x05, 0xc8, 0x3e, 0x99, 0x70, 0xa8, 0xe2, 0x80, 0xdd, 0xd0, 0x34, - 0x71, 0x69, 0x0d, 0x30, 0x73, 0x9c, 0xad, 0xba, 0x43, 0x61, 0x9b, 0xb1, - 0x98, 0x35, 0xeb, 0x2e, 0xef, 0x33, 0xe0, 0x70, 0x63, 0x77, 0x55, 0x62, - 0xf1, 0xfe, 0x3e, 0x1a, 0x51, 0x90, 0x2f, 0x5e, 0xee, 0xe7, 0x96, 0x2a, - 0xde, 0xac, 0x3c, 0xe7, 0x33, 0x89, 0x21, 0xea, 0xe4, 0x76, 0xb0, 0x12, - 0xd6, 0x54, 0x85, 0xd2, 0x12, 0x15, 0x8d, 0x80, 0x87, 0x5e, 0x9b, 0x5f, - 0x42, 0x5d, 0x2d, 0xf2, 0xeb, 0x97, 0xcf, 0x15, 0x90, 0xde, 0x78, 0xca, - 0xe6, 0x17, 0x2c, 0x14, 0x98, 0x62, 0xcf, 0x79, 0xf0, 0x99, 0xef, 0xd3, - 0x26, 0x7e, 0x8b, 0x99, 0xbb, 0xde, 0x38, 0x68, 0xc5, 0x5d, 0x81, 0xa1, - 0xc0, 0x9b, 0x0c, 0xfb, 0xa1, 0x37, 0xe0, 0x28, 0x97, 0x00, 0x99, 0xd1, - 0x7f, 0x2d, 0x8d, 0xfe, 0x1b, 0xc8, 0x7e, 0xf1, 0x9e, 0x4f, 0x46, 0x50, - 0xf5, 0x86, 0xb8, 0xf9, 0x6a, 0xac, 0xd9, 0xe5, 0x8d, 0x00, 0xa0, 0x6f, - 0xcc, 0x76, 0x7b, 0x7d, 0xf5, 0x0b, 0x4e, 0x14, 0x42, 0xc4, 0xfb, 0x60, - 0xf3, 0xf4, 0x0d, 0x8c, 0x38, 0x57, 0xc9, 0xcc, 0x64, 0x76, 0x81, 0x9e, - 0x94, 0x81, 0x9b, 0x3c, 0x84, 0x03, 0x8c, 0xc6, 0x8a, 0xe0, 0x6d, 0xbc, - 0x11, 0x18, 0x1a, 0xda, 0xc6, 0x20, 0x2c, 0x94, 0x15, 0x9b, 0xfc, 0xc2, - 0x1c, 0x16, 0x1d, 0xad, 0xcc, 0x27, 0xbe, 0x21, 0x95, 0xbb, 0xc8, 0xd8, - 0x3a, 0x36, 0x55, 0x1d, 0x25, 0xcf, 0x44, 0xd7, 0x44, 0x07, 0x54, 0x9e, - 0xb1, 0x12, 0x34, 0x25, 0x59, 0x85, 0xe1, 0x7d, 0x8f, 0x62, 0x62, 0xbc, - 0xb1, 0xaa, 0x12, 0x9a, 0xb9, 0xcf, 0x88, 0x50, 0x3b, 0x5c, 0xce, 0xa3, - 0xcb, 0x78, 0x8a, 0xeb, 0x44, 0xcc, 0x18, 0x17, 0xb7, 0xd6, 0x63, 0x5b, - 0xe2, 0xa3, 0xe3, 0xb5, 0x22, 0x28, 0xf7, 0x18, 0xab, 0x76, 0x6f, 0x9b, - 0x23, 0x49, 0x27, 0xa7, 0xd5, 0x58, 0x29, 0x73, 0xd7, 0x07, 0x92, 0x80, - 0xda, 0xdf, 0x1d, 0xad, 0x40, 0xe1, 0x05, 0xcc, 0x4f, 0xb4, 0x86, 0xa7, - 0x1b, 0x9b, 0x46, 0x05, 0xa3, 0x8d, 0x46, 0x26, 0x53, 0xf2, 0xaa, 0x3f, - 0xa7, 0x7c, 0x2b, 0xaa, 0xd2, 0xaf, 0x8a, 0x02, 0xbc, 0x43, 0x52, 0x69, - 0xba, 0x60, 0xbe, 0x94, 0x66, 0x37, 0xa0, 0x87, 0x41, 0x39, 0xa1, 0x14, - 0x2d, 0xa7, 0xab, 0xa3, 0xd5, 0x34, 0x6e, 0x39, 0x31, 0xbe, 0x1f, 0xdb, - 0x14, 0x12, 0x0a, 0xa4, 0x52, 0xd4, 0x62, 0xe6, 0x2f, 0x27, 0x49, 0xf0, - 0x7b, 0xcd, 0x9f, 0x78, 0xd7, 0x97, 0xff, 0xce, 0xac, 0x96, 0xac, 0x79, - 0x48, 0xd0, 0x12, 0x34, 0xf1, 0xa6, 0x7b, 0x81, 0x2f, 0xf8, 0x8d, 0xae, - 0x0f, 0x23, 0xe8, 0xbd, 0x32, 0xfe, 0xbc, 0x8a, 0x0e, 0x02, 0xce, 0xde, - 0xae, 0x48, 0xbd, 0x21, 0xec, 0xb7, 0x44, 0x87, 0x92, 0x8c, 0x73, 0x6a, - 0xeb, 0x1d, 0xd7, 0xc7, 0x30, 0x49, 0x5e, 0x1f, 0x45, 0xe7, 0x56, 0x48, - 0xeb, 0xb8, 0xf1, 0xc1, 0xbc, 0x0b, 0xb1, 0x89, 0x7c, 0xbd, 0xe6, 0x3b, - 0x29, 0xa1, 0x98, 0xdc, 0xd9, 0x0d, 0xc6, 0xe3, 0xdc, 0xf3, 0xaf, 0xce, - 0xa0, 0xae, 0xcb, 0xbc, 0xbe, 0x9e, 0xa8, 0xeb, 0x2e, 0xb1, 0xe9, 0x1e, - 0xf9, 0x1d, 0x83, 0xdd, 0xeb, 0xdc, 0x90, 0x8c, 0x29, 0x2b, 0xac, 0xf6, - 0xe5, 0x8e, 0x5d, 0x09, 0x1a, 0x73, 0x3e, 0xd4, 0x3a, 0xd0, 0x14, 0xec, - 0x2a, 0x55, 0xa0, 0x15, 0x16, 0x11, 0xc1, 0xd0, 0x9e, 0x0c, 0x15, 0x8e, - 0xd3, 0xc5, 0x92, 0x18, 0x97, 0xa9, 0x4b, 0xac, 0xb5, 0x6b, 0x8a, 0xae, - 0xea, 0x16, 0x40, 0x8f, 0xae, 0xe3, 0x58, 0xd6, 0xd5, 0x88, 0x69, 0xb0, - 0x71, 0x95, 0x04, 0x81, 0x80, 0x04, 0x36, 0x9b, 0x83, 0x12, 0xed, 0xd7, - 0x79, 0x90, 0x16, 0x97, 0xcb, 0xd4, 0x88, 0xbe, 0xf7, 0x27, 0x4d, 0x4c, - 0x44, 0x6e, 0x67, 0xce, 0x0b, 0xa9, 0xf7, 0x60, 0xa5, 0x56, 0x21, 0x4b, - 0xcd, 0xdd, 0xb4, 0xf6, 0x61, 0x64, 0xa3, 0xd7, 0x11, 0x34, 0x20, 0xaf, - 0xd4, 0xb0, 0x21, 0xfd, 0xb1, 0x26, 0xba, 0x2b, 0xa5, 0xd5, 0x62, 0x7f, - 0x10, 0xa3, 0xe9, 0xe7, 0x2b, 0xee, 0xf7, 0x30, 0x79, 0x97, 0xd7, 0x39, - 0x2c, 0x41, 0x3f, 0x66, 0x98, 0xc0, 0xc2, 0x90, 0xaf, 0x9d, 0x35, 0xf9, - 0x0e, 0xf9, 0x87, 0x45, 0xbe, 0x34, 0xe1, 0x1f, 0xfe, 0xae, 0xb1, 0x58, - 0xdc, 0xc6, 0xfc, 0xcf, 0x3c, 0xf2, 0x31, 0xb4, 0xa1, 0xe4, 0x9d, 0xba, - 0x0f, 0x35, 0xe8, 0xa5, 0x32, 0xfe, 0xbc, 0x0a, 0x0e, 0x02, 0xee, 0xdf, - 0xae, 0x48, 0xbd, 0x21, 0x02, 0x88, 0xdc, 0x87, 0x12, 0x6d, 0x0b, 0x69, - 0xdc, 0x7e, 0x87, 0xcb, 0xd5, 0x05, 0xbc, 0x56, 0x48, 0x75, 0xdf, 0x8e, - 0xe6, 0x99, 0xf1, 0xdb, 0xec, 0xdf, 0xcc, 0x2e, 0xac, 0x37, 0x05, 0xfa, - 0x29, 0xab, 0x9c, 0xc2, 0xd9, 0x08, 0xc4, 0xec, 0xdc, 0xf1, 0xae, 0xc9, - 0xa0, 0xa6, 0xcb, 0xb7, 0xbe, 0x9e, 0xa8, 0xeb, 0x2e, 0xb1, 0xe9, 0x1e, - 0xf9, 0x1d, 0x83, 0xdd, 0xeb, 0xdc, 0x90, 0x8c, 0xf9, 0x6d, 0xc5, 0xec, - 0xce, 0xbe, 0xfe, 0x98, 0xf4, 0x97, 0x51, 0x1e, 0x39, 0xb0, 0xe4, 0x8b, - 0xc8, 0x8d, 0x71, 0x86, 0x9e, 0x46, 0x0a, 0x18, 0x90, 0xa8, 0x95, 0x6f, - 0x8a, 0x4a, 0x4a, 0xfb, 0x59, 0x8f, 0x45, 0x1a, 0x8f, 0x29, 0x47, 0xb2, - 0x80, 0x14, 0xf4, 0x9f, 0xc3, 0xe9, 0xe3, 0xf7, 0x2e, 0x4c, 0x63, 0x62, - 0xe1, 0x67, 0x3b, 0x57, 0x30, 0x65, 0xc5, 0x1c, 0x64, 0x02, 0x4d, 0xe2, - 0x0e, 0x0a, 0xc6, 0x10, 0x34, 0x77, 0x62, 0xa0, 0xf1, 0x01, 0x2b, 0xd9, - 0x26, 0x31, 0xa5, 0xef, 0xbb, 0x53, 0xcc, 0x8b, 0x60, 0x72, 0x3c, 0x90, - 0x58, 0x87, 0xde, 0x6f, 0x60, 0x5e, 0x50, 0xdf, 0x11, 0x34, 0x20, 0xad, - 0xd4, 0xb5, 0x21, 0xf0, 0xb1, 0x26, 0xba, 0xab, 0xa5, 0xf5, 0x60, 0x7f, - 0x92, 0xe6, 0xea, 0xe9, 0xf4, 0x05, 0x98, 0xc2, 0xb7, 0x79, 0x47, 0xe4, - 0x8b, 0xc5, 0x2d, 0x47, 0x0b, 0x87, 0x13, 0x26, 0x14, 0x90, 0x27, 0x50, - 0x75, 0x78, 0xee, 0x66, 0x65, 0xa2, 0xb5, 0xc7, 0x35, 0xec, 0xc1, 0xed, - 0x8c, 0x2a, 0x3b, 0x43, 0x85, 0x0e, 0x72, 0x46, 0x16, 0xf3, 0xac, 0xfe, - 0x47, 0x74, 0x00, 0x9a, 0x9f, 0xb7, 0xa4, 0x5e, 0x07, 0xff, 0x54, 0x12, - 0xe3, 0x05, 0x13, 0x25, 0x3a, 0x6a, 0x4c, 0xb4, 0xae, 0x59, 0xb0, 0x1c, - 0x92, 0x5f, 0x43, 0x22, 0x32, 0x92, 0xb2, 0x09, 0x1a, 0xd8, 0xda, 0x83, - 0x2f, 0x78, 0xbe, 0x17, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x32, 0x28, 0x5b, 0x58, 0xac, 0xa4, 0x8e, 0xf3, 0xd6, 0x28, 0xae, 0xe7, - 0x10, 0xba, 0x88, 0x02, 0xae, 0xb8, 0x5f, 0x5e, 0x04, 0x34, 0xcd, 0x52, - 0x71, 0xc7, 0xfd, 0x91, 0x24, 0x81, 0x0f, 0xe6, 0x1a, 0x4e, 0x00, 0x05, - 0xa0, 0xb4, 0x5d, 0x5f, 0x70, 0xbf, 0x3b, 0xec, 0x86, 0x78, 0xb6, 0x17, - 0x3b, 0x85, 0xdd, 0x89, 0xc4, 0x1e, 0x02, 0x0e, 0x46, 0x44, 0xde, 0x4e, - 0x73, 0x99, 0xcf, 0xad, 0x1b, 0x46, 0x50, 0x8a, 0x84, 0xce, 0x8e, 0xd7, - 0x38, 0xfb, 0xf3, 0xa1, 0x32, 0x01, 0xd2, 0x9c, 0x2f, 0xe5, 0xb5, 0x8e, - 0x9b, 0x5f, 0xc4, 0x25, 0x2a, 0x05, 0xd9, 0x44, 0xf6, 0x33, 0x3d, 0x23, - 0x51, 0xb7, 0xa4, 0x38, 0xee, 0x84, 0x54, 0x48, 0xf2, 0xde, 0xa4, 0xcd, - 0x0e, 0x6e, 0xea, 0xcd, 0x12, 0xa4, 0x59, 0xaa, 0x1b, 0x29, 0x1d, 0xe7, - 0x2b, 0xc3, 0xb9, 0x6c, 0xcd, 0xd8, 0x98, 0x5f, 0xc4, 0xc2, 0x67, 0x50, - 0x88, 0x61, 0x36, 0xf5, 0x74, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0x98, 0x90, - 0xcd, 0xe7, 0xf2, 0xeb, 0x5d, 0x39, 0x6d, 0x38, 0x5c, 0x20, 0xd6, 0x70, - 0x6d, 0x6d, 0xe7, 0x00, 0xca, 0x35, 0xd5, 0x2d, 0x2b, 0x39, 0xb7, 0xf6, - 0xf7, 0xb0, 0xb5, 0x5c, 0x6d, 0xc4, 0xc7, 0x54, 0xc5, 0x00, 0x12, 0x1c, - 0x60, 0xc9, 0xd8, 0x67, 0xed, 0x4e, 0x37, 0x55, 0x39, 0x8c, 0x50, 0x97, - 0x92, 0x9d, 0x0e, 0x1b, 0x47, 0xef, 0x69, 0xc5, 0xac, 0xe2, 0x28, 0x5c, - 0xa8, 0xb4, 0x97, 0x40, 0xec, 0x66, 0xdc, 0x87, 0x12, 0x4f, 0x0b, 0x69, - 0xdc, 0x7e, 0x87, 0xcb, 0xd5, 0x05, 0xbc, 0x56, 0x12, 0x77, 0x20, 0xbb, - 0xd1, 0x4e, 0xef, 0xbf, 0x1c, 0x68, 0x37, 0x21, 0x05, 0xb4, 0xd1, 0x59, - 0x29, 0x62, 0x40, 0x9a, 0x13, 0xc4, 0xd0, 0x64, 0x8b, 0xa5, 0xec, 0x8c, - 0xae, 0x10, 0x18, 0x4f, 0x16, 0x2a, 0x27, 0xe9, 0x89, 0x57, 0x6d, 0x35, - 0x95, 0x30, 0x59, 0x15, 0xfb, 0x8f, 0x1b, 0x8a, 0x87, 0xf0, 0x2a, 0x0f, - 0x93, 0x4b, 0x91, 0x59, 0x7b, 0xe7, 0xae, 0xd7, 0x50, 0x12, 0x99, 0xb6, - 0x12, 0xad, 0x58, 0x73, 0x32, 0x05, 0x2e, 0x73, 0x3f, 0x96, 0x61, 0xb8, - 0x1e, 0x40, 0xa1, 0xd4, 0x05, 0x46, 0x50, 0x8f, 0x8b, 0xce, 0x8e, 0xd5, - 0x38, 0xf3, 0xf3, 0xaa, 0x32, 0x01, 0xd2, 0x9c, 0x87, 0x62, 0xc3, 0xfa, - 0xeb, 0xf5, 0x55, 0x4e, 0x3c, 0xaa, 0x91, 0xd9, 0xbc, 0x26, 0xc8, 0x5b, - 0x30, 0x84, 0x0b, 0x1c, 0x08, 0xb5, 0xe5, 0x3e, 0xb8, 0xdb, 0x62, 0x2b, - 0x43, 0x8b, 0xd9, 0xd6, 0xc2, 0x4b, 0x6e, 0x5b, 0x3f, 0x91, 0x4d, 0x4e, - 0xab, 0xc7, 0x9f, 0xd7, 0x30, 0x62, 0xb9, 0x8e, 0xc4, 0xc2, 0x60, 0x50, - 0x88, 0x68, 0x36, 0xfa, 0x74, 0xd8, 0x11, 0x4e, 0x6e, 0xe6, 0x98, 0x90, - 0x2d, 0x1d, 0xc2, 0x29, 0x21, 0x48, 0xca, 0x99, 0x22, 0x25, 0xd1, 0x81, - 0x26, 0xc3, 0xef, 0xaf, 0x7f, 0x84, 0x08, 0x5d, 0xdd, 0xb7, 0x2b, 0x7a, - 0x77, 0xf5, 0x07, 0x7e, 0xba, 0x57, 0x86, 0x8a, 0x64, 0x17, 0xdf, 0x68, - 0x95, 0xe7, 0xa1, 0x12, 0xdd, 0x98, 0xa4, 0x46, 0xca, 0x86, 0xe8, 0xb2, - 0x92, 0x98, 0x0e, 0x16, 0x47, 0xef, 0x69, 0x45, 0xac, 0xe2, 0x28, 0x5c, - 0xa8, 0xb4, 0x97, 0x40, 0x8d, 0xd3, 0xd4, 0x94, 0xe8, 0xd0, 0x91, 0xaf, - 0x48, 0x5f, 0x1b, 0x78, 0xa1, 0x47, 0x60, 0x35, 0x68, 0xef, 0xb1, 0x90, - 0x27, 0x1d, 0xe0, 0x6d, 0x93, 0x8a, 0x07, 0x6f, 0xd5, 0x1f, 0x29, 0x24, - 0x89, 0xcb, 0x79, 0x71, 0x85, 0x8b, 0xd8, 0xbc, 0xe9, 0xa7, 0xfd, 0x31, - 0x17, 0xea, 0x1d, 0xe4, 0x5b, 0x9e, 0xb9, 0x59, 0x13, 0x0f, 0xe4, 0x63, - 0x8c, 0x83, 0x3b, 0xd0, 0x95, 0x26, 0xe8, 0xc0, 0x78, 0xf7, 0xa9, 0x51, - 0x12, 0x61, 0x16, 0x56, 0xb3, 0xd8, 0x6f, 0x20, 0xd3, 0x47, 0xf4, 0x47, - 0x18, 0x1d, 0x17, 0xaf, 0xed, 0x2c, 0x71, 0xf8, 0x58, 0xea, 0xf2, 0x4e, - 0x78, 0x7b, 0xa7, 0x65, 0xfb, 0xa4, 0x19, 0x81, 0x51, 0x28, 0x42, 0x5d, - 0x85, 0xbd, 0x71, 0x81, 0xb8, 0x15, 0x9a, 0x4b, 0x2f, 0xe5, 0x95, 0x8f, - 0x9b, 0x5f, 0xc4, 0x25, 0x2a, 0x05, 0xd9, 0x44, 0xf6, 0x33, 0x3d, 0x23, - 0xf0, 0xdf, 0x8a, 0xbf, 0x35, 0x2f, 0xc3, 0xf4, 0xae, 0xe3, 0x2d, 0x05, - 0x77, 0xae, 0xb9, 0xc6, 0xe3, 0x72, 0xd7, 0x7a, 0x19, 0xdf, 0xb8, 0x90, - 0x71, 0xa4, 0x38, 0xa4, 0x61, 0xf1, 0x5d, 0x85, 0xcb, 0xc2, 0x66, 0x52, - 0x88, 0x66, 0x36, 0xf3, 0x74, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0x98, 0x90, - 0xcd, 0xe7, 0xf2, 0xeb, 0x5d, 0x39, 0x6d, 0x38, 0x5c, 0x20, 0xd6, 0x70, - 0x6d, 0x6d, 0xe7, 0x00, 0xdd, 0xe6, 0x64, 0x80, 0xa3, 0x94, 0xf5, 0x68, - 0xfe, 0xaa, 0xd4, 0x82, 0xf5, 0x3d, 0x64, 0xf5, 0x7a, 0x51, 0x64, 0xf0, - 0x58, 0x71, 0xd0, 0x4f, 0x26, 0x9f, 0xbe, 0x85, 0x1b, 0x7f, 0x25, 0xac, - 0x92, 0x90, 0x0e, 0x18, 0x47, 0xef, 0x69, 0xc5, 0xae, 0xe2, 0x28, 0x5c, - 0xa8, 0xb4, 0x97, 0x40, 0x88, 0x06, 0xd9, 0x57, 0xe9, 0x7b, 0x51, 0xe2, - 0xfc, 0x8b, 0xfc, 0xf5, 0xaf, 0x48, 0xc4, 0x24, 0x7e, 0xda, 0x3c, 0x5e, - 0xa2, 0x5a, 0xb9, 0xdd, 0x5c, 0x22, 0xe5, 0xd7, 0xd2, 0xb5, 0x59, 0x05, - 0x6f, 0x2a, 0x00, 0xc2, 0xb1, 0x69, 0x17, 0x6e, 0x89, 0x89, 0xdf, 0x43, - 0x7a, 0x2d, 0xde, 0x89, 0xae, 0xb8, 0x5f, 0x5e, 0x06, 0x34, 0xed, 0x53, - 0x71, 0xc7, 0xfd, 0x91, 0x24, 0x81, 0x0f, 0xe6, 0x7c, 0x54, 0x16, 0xce, - 0x98, 0xe9, 0x10, 0xfd, 0xd2, 0x9a, 0x0d, 0x9e, 0xaf, 0x2c, 0x10, 0x59, - 0xa9, 0xcd, 0x63, 0x58, 0x0b, 0x3d, 0x50, 0xbf, 0xcd, 0xe8, 0xd8, 0x83, - 0xcc, 0x35, 0x6d, 0x98, 0x74, 0x17, 0x2a, 0xe0, 0x5b, 0x07, 0xfb, 0x81, - 0x1d, 0x04, 0x64, 0x67, 0x6e, 0xfc, 0x3b, 0x78, 0xfc, 0x6d, 0x8b, 0xdc, - 0x8e, 0xf3, 0xf5, 0x9c, 0xc1, 0x3e, 0xb8, 0x06, 0x31, 0x94, 0x0c, 0x92, - 0xe4, 0x04, 0x2a, 0x24, 0xc8, 0x20, 0xc4, 0x2e, 0x25, 0x8f, 0x63, 0x67, - 0x8c, 0x40, 0xa1, 0xdf, 0x6c, 0x15, 0x7c, 0x97, 0x43, 0x24, 0xb1, 0xfc, - 0x05, 0x97, 0x60, 0xdd, 0xfe, 0xf1, 0x94, 0xb5, 0xc4, 0xc2, 0x67, 0x52, - 0x88, 0x6e, 0x36, 0xf8, 0x74, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0x98, 0x90, - 0x76, 0x46, 0xa1, 0x3e, 0x6b, 0xd4, 0x84, 0xef, 0xda, 0x5e, 0x02, 0x81, - 0x66, 0x11, 0xa4, 0x47, 0xec, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x18, - 0xb7, 0x8e, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, 0xb1, 0xe4, 0x19, 0xcd, - 0x4b, 0x72, 0xa0, 0x82, 0x93, 0xd2, 0x71, 0xe4, 0x0d, 0xe4, 0xbb, 0xa2, - 0x92, 0x99, 0x0e, 0x17, 0x47, 0xef, 0x69, 0x45, 0xae, 0xe2, 0x28, 0x5c, - 0xa8, 0xb4, 0x97, 0x40, 0xe0, 0xb7, 0xe6, 0x43, 0x89, 0x1a, 0xac, 0x78, - 0xc6, 0x7b, 0xc7, 0x48, 0xd6, 0x8e, 0x51, 0xec, 0xfe, 0xa0, 0x8d, 0xe9, - 0x29, 0xfe, 0xa8, 0xc4, 0xa9, 0x57, 0x69, 0xd8, 0xb3, 0x91, 0x9b, 0xbb, - 0x86, 0xb5, 0x61, 0x6f, 0x7b, 0xbc, 0x18, 0x83, 0x5a, 0x37, 0x5d, 0xf5, - 0xe8, 0x8c, 0xc8, 0x45, 0xe5, 0xa7, 0x14, 0xea, 0x0a, 0xb2, 0xd6, 0x85, - 0xcc, 0x73, 0x10, 0x72, 0xb3, 0xff, 0xe5, 0x91, 0x6f, 0x28, 0xb7, 0x92, - 0xc3, 0x33, 0xd8, 0x3c, 0x6b, 0x7e, 0xa5, 0xc7, 0x55, 0x1c, 0x47, 0x02, - 0x27, 0xcd, 0xea, 0xc5, 0xf0, 0x11, 0x25, 0xb2, 0x1f, 0x39, 0xb9, 0x1c, - 0x77, 0xa8, 0xac, 0x1a, 0x1d, 0x41, 0xb1, 0x67, 0x7c, 0x77, 0x0d, 0x2a, - 0x9c, 0x5e, 0xd7, 0x84, 0x51, 0xaf, 0x65, 0x99, 0x1a, 0x59, 0x20, 0xe5, - 0x43, 0x13, 0xdb, 0x0f, 0xd4, 0x1e, 0x51, 0xaf, 0x55, 0x1a, 0xdb, 0xda, - 0x1a, 0x5a, 0xce, 0x60, 0x67, 0x2b, 0xf1, 0x75, 0x7b, 0x92, 0x68, 0x77, - 0xd7, 0xe0, 0xf8, 0xbe, 0x38, 0xfd, 0xa2, 0x4f, 0xe4, 0x1c, 0x57, 0xb8, - 0x98, 0x19, 0x58, 0x11, 0xa9, 0x67, 0x1d, 0x18, 0xcd, 0xc4, 0x64, 0x56, - 0x88, 0x7b, 0x36, 0xef, 0x72, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0xb8, 0x91, - 0x14, 0x18, 0x82, 0x65, 0xb2, 0xff, 0xb1, 0xbc, 0xdc, 0x77, 0x78, 0xeb, - 0x03, 0xcb, 0x92, 0x63, 0xb9, 0x38, 0x5e, 0xf8, 0x77, 0x2e, 0x4d, 0x96, - 0x39, 0x8b, 0xf5, 0x6c, 0xca, 0x53, 0xef, 0x36, 0xb8, 0x64, 0xc5, 0xc5, - 0x4a, 0x99, 0x95, 0x31, 0x48, 0xf0, 0x7d, 0xea, 0xa2, 0x0f, 0xc5, 0xf6, - 0x92, 0x97, 0x0e, 0x1e, 0x41, 0xef, 0x69, 0xc5, 0xac, 0xe2, 0x28, 0x5c, - 0xa8, 0xb4, 0x97, 0x40, 0x14, 0x54, 0x69, 0x7d, 0x08, 0x67, 0x1b, 0xfc, - 0x24, 0x3d, 0x02, 0xcb, 0xf2, 0x4d, 0x37, 0xa8, 0x84, 0xf4, 0xb9, 0x77, - 0x4b, 0xb1, 0xa0, 0x1c, 0x62, 0x82, 0x60, 0x25, 0x55, 0x2b, 0xe2, 0x61, - 0xed, 0x65, 0x7f, 0xfd, 0xad, 0x42, 0x00, 0x00, 0x06, 0x9e, 0xd1, 0xa4, - 0x4f, 0xf9, 0xf8, 0x7c, 0xaf, 0x9a, 0xd2, 0xe0, 0x3d, 0x2d, 0x16, 0xf9, - 0xb8, 0xd0, 0xcf, 0xb5, 0x13, 0xc4, 0x67, 0x3b, 0x75, 0xc0, 0xc3, 0xa4, - 0x81, 0xb1, 0x8e, 0x8e, 0x07, 0xba, 0x95, 0xd1, 0x00, 0x61, 0x58, 0x85, - 0xfa, 0x12, 0x00, 0xa4, 0x95, 0x75, 0xf2, 0x25, 0xe2, 0xba, 0x48, 0x14, - 0x07, 0xa4, 0x10, 0xea, 0x05, 0x46, 0x50, 0x8f, 0x8b, 0xce, 0x8e, 0xd5, - 0x38, 0xf1, 0xf3, 0xa4, 0x34, 0x01, 0xd2, 0x9c, 0xb2, 0x67, 0xb7, 0x75, - 0x39, 0x8c, 0x5e, 0x9a, 0xcb, 0xa2, 0x04, 0x3f, 0x24, 0x74, 0xdc, 0x5a, - 0x15, 0xca, 0x3f, 0x6b, 0x23, 0x44, 0x63, 0x3a, 0x2a, 0x7c, 0x8b, 0xaa, - 0x44, 0xf5, 0x32, 0xd8, 0x9a, 0xd4, 0x9b, 0x8f, 0x3f, 0xb7, 0xa6, 0x3d, - 0x87, 0x85, 0x47, 0x13, 0x65, 0xa0, 0x0e, 0x73, 0xcb, 0xc2, 0x67, 0x50, - 0x88, 0x6d, 0x36, 0xf7, 0x72, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0x98, 0x90, - 0xba, 0xaa, 0x97, 0xac, 0x16, 0xc5, 0x06, 0xf7, 0x43, 0x56, 0xec, 0xb5, - 0xce, 0x97, 0xa0, 0x0a, 0x0b, 0x87, 0x13, 0x26, 0x14, 0x90, 0x27, 0x40, - 0x75, 0x1e, 0xee, 0x66, 0x65, 0xa2, 0xb5, 0xc7, 0xc8, 0xab, 0xb3, 0x87, - 0xb6, 0x72, 0x5b, 0x1f, 0x7a, 0xcd, 0x9e, 0xb0, 0x8e, 0x2f, 0x6b, 0x45, - 0x92, 0x9f, 0x0e, 0x15, 0x41, 0xef, 0x69, 0xc5, 0xac, 0xe2, 0x28, 0x5c, - 0xa8, 0xb4, 0x97, 0x40, 0x0e, 0x46, 0xca, 0x9e, 0xf1, 0x4c, 0xcf, 0x6b, - 0x7e, 0x0e, 0x20, 0xd4, 0x12, 0xd6, 0x44, 0xae, 0x63, 0xb4, 0x2e, 0x38, - 0xd0, 0xdb, 0xc2, 0xd2, 0xb4, 0x2f, 0x9b, 0x29, 0x52, 0x4f, 0x1d, 0x32, - 0x1d, 0xf8, 0xab, 0xb7, 0x0e, 0x1a, 0xe7, 0xe6, 0xb9, 0x83, 0x19, 0x46, - 0xbd, 0x43, 0x87, 0x09, 0x10, 0x2a, 0x27, 0x69, 0x89, 0x57, 0x6d, 0x35, - 0x95, 0x30, 0x59, 0x15, 0xfb, 0x8f, 0x1b, 0x8a, 0xbe, 0x42, 0xce, 0x67, - 0x00, 0xbe, 0x54, 0x92, 0xe1, 0xb5, 0x3d, 0xbd, 0x24, 0x84, 0x20, 0xfa, - 0xa2, 0xb0, 0xc9, 0x53, 0xfc, 0x67, 0x68, 0x04, 0x66, 0x0a, 0x85, 0x88, - 0x49, 0x00, 0x8e, 0x96, 0xb4, 0x08, 0x1c, 0x1c, 0x9b, 0x9c, 0x22, 0xf0, - 0x31, 0xde, 0x1d, 0x69, 0xa7, 0x2e, 0xdc, 0x60, 0x87, 0x62, 0xc1, 0xfa, - 0xeb, 0xf5, 0x55, 0x4e, 0x3c, 0xaa, 0x91, 0xd9, 0xbc, 0x26, 0xc8, 0x5b, - 0x79, 0x90, 0x16, 0x97, 0xcb, 0xd4, 0x88, 0xbe, 0xf7, 0x27, 0x4d, 0x4c, - 0x44, 0x19, 0x60, 0xbe, 0x46, 0xb6, 0x98, 0x82, 0x19, 0xcb, 0x0a, 0x19, - 0x4a, 0x37, 0x9a, 0xad, 0x2f, 0xf6, 0x8b, 0x65, 0xba, 0x45, 0x51, 0xc8, - 0xba, 0x71, 0xbe, 0x87, 0x66, 0x37, 0xa0, 0x87, 0x41, 0x39, 0xa1, 0x14, - 0x78, 0xfb, 0x02, 0x5a, 0x52, 0xe0, 0x08, 0x19, 0x01, 0xd4, 0x28, 0x19, - 0x48, 0x2b, 0x33, 0x1c, 0x52, 0xd4, 0x62, 0xe6, 0x2f, 0x27, 0x49, 0xf0, - 0x7b, 0xcd, 0x98, 0x7f, 0xd7, 0x97, 0xff, 0xce, 0x81, 0x7f, 0x1b, 0xa4, - 0x13, 0x66, 0x2b, 0x83, 0x16, 0x01, 0x94, 0x3e, 0x06, 0x5f, 0x6a, 0x46, - 0xbe, 0x9e, 0xa8, 0x6b, 0x2e, 0xb1, 0xc9, 0x1f, 0xf9, 0x1d, 0x83, 0xdd, - 0xeb, 0xdc, 0x90, 0x8c, 0xe8, 0x65, 0xb6, 0x51, 0x0f, 0x08, 0x12, 0x25, - 0x82, 0x7b, 0x8e, 0xb8, 0xa9, 0x11, 0x7e, 0x9e, 0x56, 0xff, 0x7d, 0x55, - 0xdf, 0xc4, 0x3d, 0x5b, 0xc7, 0x4d, 0xb3, 0x7d, 0x64, 0xfb, 0x1d, 0x9f, - 0x1b, 0x3b, 0x27, 0xad, 0xd2, 0xa3, 0x23, 0xe7, 0xb1, 0x26, 0xba, 0x2b, - 0xa5, 0xd5, 0x62, 0x7f, 0xf7, 0x16, 0x13, 0x8b, 0x9d, 0x54, 0xcf, 0x9e, - 0xed, 0x4e, 0xfa, 0x91, 0xee, 0x38, 0x40, 0x95, 0xc0, 0xf9, 0x77, 0xb8, - 0x97, 0x57, 0xdf, 0x35, 0x9d, 0xe5, 0x55, 0x06, 0x48, 0x96, 0x84, 0xf3, - 0x2a, 0xa8, 0x8a, 0xcc, 0xcd, 0x1c, 0xce, 0xf7, 0xd6, 0xfb, 0xab, 0xc4, - 0xa6, 0xb5, 0xc8, 0xa4, 0xbe, 0x9e, 0xa8, 0xeb, 0x2e, 0xb1, 0xe9, 0x1e, - 0xf9, 0x1d, 0x83, 0xdd, 0xeb, 0xdc, 0x90, 0x8c, 0x8e, 0xc0, 0xa7, 0x4c, - 0x12, 0x92, 0x48, 0x74, 0x79, 0xdb, 0x44, 0xa9, 0xf1, 0xc3, 0xb5, 0xbc, - 0x94, 0x93, 0x89, 0x03, 0x8a, 0x4a, 0x3b, 0x06, 0x64, 0x30, 0x06, 0x0c, - 0xa5, 0xd4, 0x9f, 0xfd, 0x1b, 0x3e, 0x25, 0xa2, 0xd2, 0xa1, 0x22, 0xe0, - 0xb1, 0x26, 0xba, 0x2b, 0xa5, 0xd5, 0x62, 0x7f, 0x10, 0xa3, 0xe9, 0xe7, - 0x2b, 0xee, 0xf7, 0x30, 0x79, 0x97, 0xd7, 0x39, 0x2c, 0x41, 0x3f, 0x66, - 0x98, 0xc0, 0xc2, 0x90, 0xaf, 0x9d, 0x35, 0xf9, 0x0e, 0xf9, 0x87, 0x45, - 0xbe, 0x34, 0xe1, 0x1f, 0x2a, 0xaf, 0x8a, 0xcc, 0xca, 0x1c, 0xd0, 0xf7, - 0xc8, 0xfb, 0xa4, 0xc4, 0xa9, 0xb5, 0xcf, 0xa4, 0xbe, 0x9e, 0xa8, 0xeb, - 0x2e, 0xb1, 0xe9, 0x1e, 0xf9, 0x1d, 0x83, 0xdd, 0xeb, 0xdc, 0x90, 0x8c, - 0xb3, 0x79, 0x0a, 0x20, 0xdb, 0xc3, 0xd8, 0x83, 0xdd, 0x9f, 0x67, 0x05, - 0x4b, 0x78, 0x58, 0x34, 0x94, 0x82, 0x89, 0x74, 0x8a, 0x4a, 0x3b, 0x06, - 0x64, 0x30, 0x06, 0x0c, 0xa5, 0xd4, 0x9f, 0xfd, 0x1b, 0x3e, 0x25, 0xa2, - 0xd2, 0xa1, 0x22, 0xe0, 0xb1, 0x26, 0xba, 0x2b, 0xa5, 0xd5, 0x62, 0x7f, - 0x2d, 0x1d, 0xc2, 0x29, 0xcf, 0xa6, 0xca, 0x99, 0x22, 0x07, 0xd1, 0x81, - 0x26, 0xc3, 0xef, 0xaf, 0x98, 0xc0, 0xc2, 0x90, 0xaf, 0x9d, 0x35, 0xf9, - 0x0e, 0x9f, 0x87, 0x45, 0xbe, 0x34, 0xe1, 0x1f, 0x1d, 0x17, 0xae, 0x12, - 0x36, 0xf7, 0xd0, 0x02, 0x83, 0xfe, 0x7b, 0xc8, 0x09, 0x3d, 0x5b, 0xd0, - 0x10, 0x39, 0x1c, 0xa3, 0x45, 0x53, 0x82, 0x33, 0xd1, 0x8c, 0x73, 0x68, - 0x3c, 0x11, 0x8a, 0x0f, 0xbe, 0x60, 0xce, 0x67, 0x00, 0xbe, 0x54, 0x92, - 0xe1, 0xb5, 0x3d, 0xbd, 0x24, 0x84, 0x20, 0xf2, 0x1e, 0xa4, 0x55, 0x65, - 0x59, 0xf6, 0x38, 0x38, 0x28, 0x71, 0x05, 0x8c, 0x3b, 0x39, 0xdb, 0x85, - 0x1b, 0x3e, 0x25, 0xa7, 0xd2, 0xa1, 0x22, 0xe2, 0xb1, 0x26, 0xba, 0xab, - 0xa5, 0xf5, 0x60, 0x7f, 0x92, 0xe6, 0xea, 0xe9, 0xf4, 0x05, 0x98, 0xc2, - 0xb7, 0x79, 0x47, 0xe4, 0x8b, 0xc5, 0x2d, 0x47, 0x0b, 0x87, 0x13, 0x26, - 0x14, 0x90, 0x27, 0x50, 0x75, 0x78, 0xee, 0x66, 0x65, 0xa2, 0xb5, 0xc7, - 0x8a, 0xcf, 0x6f, 0x75, 0x91, 0x9f, 0xd2, 0xa2, 0xe3, 0xad, 0xf8, 0x3e, - 0x11, 0xfd, 0x1e, 0xf3, 0xb5, 0xe9, 0xdb, 0x49, 0xf1, 0x8c, 0xa3, 0xbc, - 0x9e, 0xac, 0x71, 0xaa, 0x57, 0x79, 0x48, 0x7c, 0x62, 0x7a, 0x2e, 0x0c, - 0x6a, 0x67, 0xe9, 0xd6, 0x87, 0x60, 0xb6, 0xe8, 0x75, 0xbd, 0xcb, 0xeb, - 0x5f, 0xdb, 0x51, 0xb2, 0xea, 0x9c, 0xa1, 0x64, 0xa9, 0x80, 0xad, 0xe8, - 0x57, 0xce, 0xfa, 0xf0, 0xcd, 0xc4, 0x64, 0x56, 0x88, 0x7b, 0x36, 0xef, - 0x74, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0xb8, 0x91, 0xcd, 0x6b, 0xed, 0xe8, - 0x5a, 0x05, 0x05, 0x59, 0xff, 0xaa, 0x7b, 0x53, 0x7e, 0x07, 0x16, 0xf3, - 0x42, 0xaa, 0x59, 0x5b, 0x95, 0x45, 0x16, 0x5f, 0x0b, 0x8a, 0x88, 0x46, - 0xfd, 0x8d, 0x9d, 0x8e, 0x28, 0x61, 0x56, 0x9e, 0x00, 0xd0, 0xda, 0x7a, - 0x9f, 0xaf, 0xe9, 0x83, 0xa7, 0x00, 0x1b, 0x53, 0xae, 0xb8, 0x5f, 0x5e, - 0x04, 0x34, 0xed, 0x53, 0x71, 0xc7, 0xfd, 0x91, 0x24, 0x81, 0x0f, 0xe6, - 0xdf, 0xa2, 0x3b, 0x95, 0x61, 0xa2, 0x01, 0x42, 0x87, 0x7e, 0xd8, 0x9f, - 0x2d, 0x59, 0x89, 0xaa, 0x92, 0x2e, 0xb2, 0x50, 0x89, 0xc2, 0x15, 0x37, - 0xfe, 0xdc, 0x17, 0x17, 0x72, 0xaf, 0xcb, 0xd9, 0xdf, 0xc8, 0x62, 0x5a, - 0x81, 0x7d, 0x35, 0xe9, 0x74, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0x98, 0x90, - 0xcd, 0x6b, 0xed, 0xe8, 0x5a, 0x05, 0x05, 0x59, 0xff, 0xaa, 0x7b, 0x53, - 0x7e, 0x07, 0x16, 0xf3, 0xca, 0x35, 0xd5, 0x2d, 0x2b, 0x39, 0xb7, 0xf6, - 0xf7, 0xb0, 0xb2, 0x5b, 0x6d, 0xc4, 0xc7, 0x54, 0x2a, 0x66, 0x56, 0x9e, - 0x00, 0xd0, 0xc4, 0x70, 0x9f, 0xaf, 0xe6, 0x86, 0xa7, 0x00, 0x1c, 0x51, - 0x16, 0x2a, 0x27, 0xe9, 0x89, 0x57, 0x6d, 0x35, 0x95, 0x30, 0x59, 0x15, - 0xfb, 0x8f, 0x1b, 0x8a, 0x87, 0xf0, 0x2a, 0x0f, 0x93, 0x4b, 0x91, 0x59, - 0x7b, 0xe7, 0xae, 0xd7, 0x50, 0x12, 0x99, 0xb6, 0x12, 0xfc, 0x67, 0x26, - 0xd9, 0x5c, 0x19, 0x0d, 0xe5, 0x7b, 0xed, 0x3f, 0x44, 0xf8, 0x5a, 0xce, - 0xc1, 0xc8, 0x62, 0x5a, 0x8e, 0x7d, 0x35, 0xe9, 0x74, 0xd8, 0x11, 0xce, - 0x6e, 0xe6, 0x98, 0x90, 0x10, 0xa3, 0xe9, 0xe7, 0xc5, 0x00, 0xf7, 0x30, - 0x79, 0xb5, 0xd7, 0x39, 0x2c, 0x41, 0x3f, 0x66, 0xec, 0x55, 0xb8, 0x72, - 0x7d, 0x86, 0x3c, 0x00, 0xb7, 0xe8, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, - 0x2a, 0x66, 0x56, 0x9e, 0x07, 0xd0, 0xda, 0x70, 0x81, 0xaf, 0xe9, 0x86, - 0xa8, 0x00, 0x1b, 0x51, 0x16, 0x2a, 0x27, 0xe9, 0x89, 0x57, 0x6d, 0x35, - 0x95, 0x30, 0x59, 0x15, 0xfb, 0x8f, 0x1b, 0x8a, 0x90, 0xcf, 0x9e, 0xb1, - 0x64, 0x2c, 0xa5, 0x87, 0xed, 0x4b, 0x04, 0xb7, 0xfc, 0x78, 0x24, 0xc1, - 0x54, 0x56, 0x91, 0xea, 0xb9, 0xc4, 0x0c, 0xb7, 0xf5, 0xa2, 0xfc, 0x65, - 0x4c, 0xe1, 0xb9, 0x2a, 0xdf, 0xc8, 0x6d, 0x5a, 0x81, 0x7d, 0x32, 0xe9, - 0x74, 0xd8, 0x11, 0x4e, 0x6e, 0xe6, 0x98, 0x90, 0x2d, 0x1d, 0xc2, 0x29, - 0x21, 0x48, 0xca, 0x99, 0x22, 0x25, 0xd1, 0x81, 0x26, 0xc3, 0xef, 0xaf, - 0x7f, 0x84, 0x08, 0x5d, 0xdd, 0xb7, 0x2b, 0x7a, 0x77, 0xf5, 0x07, 0x7e, - 0xba, 0x57, 0x86, 0x8a, 0x41, 0x62, 0x29, 0x31, 0x96, 0xcc, 0xe1, 0x9a, - 0xa7, 0x3f, 0xb3, 0x0b, 0x88, 0xcd, 0x78, 0x9c, 0x16, 0x2a, 0x27, 0x69, - 0x89, 0x57, 0x6d, 0x35, 0x95, 0x30, 0x59, 0x15, 0xfb, 0x8f, 0x1b, 0x8a, - 0xfb, 0x05, 0xd5, 0x7b, 0xab, 0x98, 0x3d, 0xfc, 0x83, 0x5e, 0xbf, 0x7c, - 0x46, 0xfd, 0xb1, 0x28, 0xfd, 0x75, 0x16, 0xfb, 0x70, 0x36, 0x69, 0x74, - 0x95, 0xb5, 0x61, 0x61, 0x37, 0xd3, 0x56, 0x79, 0xb0, 0x4f, 0x54, 0xc0, - 0xbc, 0x66, 0xbd, 0x92, 0x66, 0x37, 0xa0, 0x87, 0x40, 0x99, 0xd9, 0x14, - 0x58, 0x8f, 0x0d, 0xf6, 0xfa, 0x1c, 0xaa, 0x6e, 0xd0, 0x65, 0x4c, 0x50, - 0x50, 0x44, 0x80, 0x6b, 0x52, 0xd4, 0x62, 0xe6, 0x2f, 0x27, 0x49, 0xc0, - 0x7b, 0xcd, 0x98, 0x7f, 0xd7, 0x97, 0xff, 0xce, 0x32, 0x28, 0x5b, 0x58, - 0xac, 0xa4, 0x8e, 0xf3, 0xd6, 0x28, 0xae, 0xe7, 0x10, 0xba, 0x88, 0x02, - 0xae, 0xb8, 0x5f, 0x5e, 0x04, 0x34, 0xcd, 0x52, 0x71, 0xc7, 0xfd, 0x91, - 0x24, 0x81, 0x0f, 0xe6, 0x5e, 0x26, 0x0c, 0x5e, 0xec, 0x54, 0xa6, 0x82, - 0xa6, 0xad, 0x8c, 0xa7, 0x3a, 0x3a, 0xc8, 0xa0, 0x9b, 0x0f, 0x23, 0x04, - 0x72, 0xf0, 0xd2, 0x51, 0x32, 0xde, 0x0b, 0xbd, 0x38, 0x37, 0x9f, 0xd0, - 0xc1, 0xc8, 0x60, 0x5f, 0x8e, 0x7d, 0x34, 0xeb, 0x74, 0xd8, 0x11, 0xce, - 0x6e, 0xe6, 0x98, 0x90, 0xcd, 0x6b, 0xed, 0xe8, 0x5a, 0x05, 0x05, 0x59, - 0xff, 0xaa, 0x7b, 0x53, 0x7e, 0x07, 0x16, 0xf3, 0xdd, 0xe6, 0x64, 0x80, - 0xa3, 0x94, 0xf5, 0x68, 0xfe, 0xaa, 0xd3, 0x85, 0xf5, 0x3d, 0x64, 0xf5, - 0x6b, 0x29, 0x16, 0xc6, 0xb9, 0x7d, 0x1d, 0x7a, 0x8d, 0x83, 0xda, 0x49, - 0x7c, 0x3c, 0xdd, 0x96, 0xae, 0xb8, 0x5f, 0x5e, 0x06, 0x34, 0xed, 0x53, - 0x71, 0xc7, 0xfd, 0x91, 0x24, 0x81, 0x0f, 0xe6, 0xd4, 0x98, 0x07, 0x6f, - 0xb2, 0x29, 0x14, 0xbc, 0xe5, 0x63, 0x23, 0x73, 0x2d, 0xfd, 0xa6, 0x5f, - 0xc7, 0xba, 0x38, 0x3e, 0x23, 0x59, 0xdf, 0xc1, 0xef, 0x41, 0xe7, 0xfd, - 0xd9, 0x68, 0x14, 0xd3, 0xdd, 0xc8, 0x62, 0x5a, 0x80, 0x7d, 0x35, 0xe9, - 0x74, 0xd8, 0x11, 0xce, 0x6c, 0xe6, 0x98, 0x90, 0x78, 0x51, 0x81, 0xd2, - 0xa7, 0x63, 0x9d, 0x9f, 0xf3, 0xf7, 0xd3, 0xf3, 0x1c, 0x30, 0xe0, 0xa4, - 0x72, 0x00, 0x95, 0x2a, 0x43, 0x19, 0xa0, 0x3c, 0x00, 0xc7, 0x99, 0x8b, - 0x47, 0x5a, 0x08, 0x5c, 0x6b, 0x2e, 0x16, 0xc6, 0xbe, 0x7d, 0x1d, 0x70, - 0x93, 0x83, 0xda, 0x4c, 0x73, 0x3c, 0xdd, 0x94, 0xae, 0xb8, 0x5f, 0x5e, - 0x06, 0x34, 0xed, 0x53, 0x71, 0xc7, 0xfd, 0x91, 0x24, 0x81, 0x0f, 0xe6, - 0x7c, 0x54, 0x16, 0xce, 0x98, 0xe9, 0x10, 0xfd, 0xd2, 0x9a, 0x0d, 0x9e, - 0xaf, 0x2c, 0x10, 0x59, 0x31, 0x67, 0x09, 0x4a, 0xe5, 0x8c, 0xea, 0x5c, - 0x68, 0x8e, 0x80, 0xec, 0xbe, 0x6a, 0x78, 0x46, 0xdf, 0xc8, 0x62, 0x5f, - 0x81, 0x7d, 0x35, 0xeb, 0x74, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0x98, 0x90, - 0x76, 0x46, 0xa1, 0x3e, 0x6b, 0xd4, 0x84, 0xef, 0xda, 0x5e, 0x02, 0x81, - 0x66, 0x11, 0xa4, 0x47, 0xec, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x18, - 0xb7, 0x8e, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, 0x82, 0xb1, 0x77, 0x6b, - 0x71, 0xa8, 0x12, 0x97, 0x5f, 0x3d, 0x58, 0xff, 0xee, 0x98, 0xcb, 0x57, - 0xe5, 0xa7, 0x14, 0xea, 0x0a, 0xb2, 0xd6, 0x85, 0xcc, 0x73, 0x10, 0x72, - 0xb3, 0xff, 0xe5, 0x91, 0xa7, 0x35, 0x8e, 0xbc, 0xc3, 0xd3, 0x22, 0x5e, - 0x43, 0xee, 0xa9, 0xfb, 0x76, 0x47, 0x2f, 0xe7, 0x8c, 0xb3, 0xcc, 0x22, - 0x81, 0x9d, 0xd8, 0x75, 0x58, 0x30, 0x67, 0xac, 0x83, 0x05, 0xd3, 0x35, - 0xdf, 0xc8, 0x62, 0x5a, 0x81, 0x7d, 0x35, 0xe9, 0x74, 0xd8, 0x11, 0x4e, - 0x6c, 0xe6, 0x98, 0x90, 0xf3, 0x76, 0xa6, 0x67, 0x19, 0x95, 0x86, 0x84, - 0xa1, 0xfa, 0x78, 0x00, 0x92, 0x67, 0xd4, 0xb3, 0xe5, 0x4b, 0x1e, 0x84, - 0x99, 0xea, 0x9f, 0x91, 0x1c, 0x81, 0x42, 0xee, 0x5f, 0x72, 0x35, 0x7d, - 0x8a, 0xcf, 0x6f, 0x75, 0x96, 0x9f, 0xd2, 0xa8, 0xfd, 0xad, 0xf8, 0x3b, - 0x1e, 0xfd, 0x1e, 0xf1, 0x39, 0xc5, 0x77, 0xa9, 0x43, 0x1c, 0x77, 0xde, - 0xcc, 0x30, 0xb8, 0x7f, 0xb8, 0xd1, 0xb2, 0x4d, 0x62, 0x7a, 0x2e, 0x0c, - 0x6a, 0x67, 0xe9, 0xd6, 0x87, 0x60, 0xb6, 0xe8, 0x75, 0xbd, 0xcb, 0xe3, - 0x38, 0x8a, 0xa2, 0x38, 0xe4, 0x1c, 0x57, 0xb8, 0x98, 0x19, 0x58, 0x11, - 0xa9, 0x67, 0x1d, 0x18, 0xcd, 0xc4, 0x64, 0x56, 0x88, 0x7b, 0x36, 0xef, - 0x72, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0xb8, 0x91, 0x8e, 0x7f, 0x78, 0x3b, - 0xd2, 0xdd, 0x7e, 0xa2, 0xf9, 0xf2, 0xc5, 0xd6, 0x51, 0xef, 0xbc, 0x6e, - 0xb9, 0x38, 0x5e, 0xf8, 0x77, 0x2e, 0x4d, 0x96, 0x39, 0x8b, 0xf2, 0x6b, - 0xca, 0x53, 0xef, 0x36, 0xec, 0x66, 0x6a, 0xfe, 0xb9, 0x5c, 0x0e, 0x1e, - 0x0c, 0x91, 0xd6, 0xab, 0x49, 0xe7, 0xfa, 0x62, 0xaf, 0x9a, 0xd2, 0xe0, - 0x3d, 0x2d, 0x16, 0xf9, 0xb8, 0xd0, 0xcf, 0xb5, 0x13, 0xc4, 0x67, 0x3b, - 0x6f, 0x49, 0xff, 0x21, 0x98, 0xf7, 0x02, 0x02, 0x11, 0xcc, 0xd6, 0xd2, - 0x38, 0xfa, 0x32, 0xc3, 0xb6, 0x97, 0x47, 0xf4, 0x14, 0x2a, 0xc2, 0x17, - 0x4c, 0xe9, 0x42, 0x1e, 0x50, 0x1b, 0xee, 0x66, 0xc1, 0xc8, 0x62, 0x5a, - 0x8e, 0x7d, 0x35, 0xe9, 0x72, 0xd8, 0x11, 0xce, 0x6e, 0xe6, 0x98, 0x90, - 0x8e, 0x7f, 0x78, 0x3b, 0xd2, 0xdd, 0x7e, 0xa2, 0xf9, 0xf2, 0xc5, 0xd6, - 0x51, 0xef, 0xbc, 0x6e, 0xec, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x18, - 0xb7, 0xf9, 0x5d, 0x3f, 0x0f, 0xbc, 0xc6, 0x12, 0xee, 0x61, 0x69, 0xf9, - 0xb9, 0x56, 0x0a, 0x14, 0x0c, 0x94, 0xd4, 0xae, 0x49, 0xe5, 0xfb, 0x60, - 0xaf, 0x9a, 0xd2, 0xe0, 0x3d, 0x2d, 0x16, 0xf9, 0xb8, 0xd0, 0xcf, 0xb5, - 0x13, 0xc4, 0x67, 0x3b, 0x87, 0xf0, 0x2a, 0x0f, 0x93, 0x4b, 0x91, 0x59, - 0x7b, 0xe7, 0xae, 0xd7, 0x50, 0x12, 0x99, 0xae, 0xb6, 0x86, 0x47, 0x83, - 0x14, 0x2a, 0xc2, 0x17, 0x4c, 0xee, 0x42, 0x1e, 0x50, 0x1b, 0xee, 0x66, - 0xc1, 0xc8, 0x62, 0x5a, 0x8e, 0x7d, 0x35, 0xe9, 0x72, 0xd8, 0x11, 0xce, - 0x6e, 0xe6, 0x98, 0x90, 0xba, 0xaa, 0x97, 0xac, 0x16, 0xc5, 0x06, 0xf7, - 0x43, 0x56, 0xec, 0xb5, 0xce, 0x97, 0xa0, 0x0a, 0x0b, 0x87, 0x13, 0x26, - 0x14, 0x90, 0x27, 0x40, 0x75, 0x1e, 0xee, 0x66, 0x65, 0xa2, 0xb5, 0xc7, - 0xee, 0x61, 0x69, 0xf9, 0xb9, 0x56, 0x0a, 0x1e, 0x0c, 0x94, 0xd4, 0xab, - 0x49, 0xe5, 0xfb, 0x62, 0xaf, 0x9a, 0xd2, 0xe0, 0x3d, 0x2d, 0x16, 0xf9, - 0xb8, 0xd0, 0xcf, 0xb5, 0x13, 0xc4, 0x67, 0x3b, 0xfb, 0x05, 0xd5, 0x7b, - 0xab, 0x98, 0x3d, 0xfc, 0x83, 0x5e, 0xbf, 0x7c, 0x46, 0xfd, 0xb1, 0x30, - 0xd8, 0x9b, 0x6f, 0x42, 0xad, 0x2d, 0x82, 0xf8, 0x56, 0x54, 0xf6, 0x07, - 0x9e, 0x1f, 0x6a, 0xe6, 0xc1, 0xc8, 0x62, 0x5a, 0x8e, 0x7d, 0x35, 0xe9, - 0x72, 0xd8, 0x11, 0x4e, 0x6e, 0xe6, 0x98, 0x90, 0x2d, 0x1d, 0xc2, 0x29, - 0x21, 0x48, 0xca, 0x99, 0x22, 0x25, 0xd1, 0x81, 0x26, 0xc3, 0xef, 0xaf, - 0xe3, 0xce, 0xc0, 0xd8, 0x63, 0x91, 0x64, 0x56, 0x41, 0x9c, 0xd0, 0x7e, - 0x67, 0xef, 0xbb, 0x7f, 0x4e, 0x69, 0x10, 0xd0, 0xcc, 0x80, 0x5f, 0xa0, - 0x6a, 0xb1, 0x4b, 0xfc, 0xbf, 0x2a, 0x05, 0x13, 0x10, 0x2a, 0x27, 0x69, - 0x89, 0x57, 0x6f, 0x35, 0x95, 0x30, 0x59, 0x15, 0xfb, 0x8f, 0x1b, 0x8a, - 0x66, 0xc0, 0xc8, 0x67, 0x3e, 0x79, 0x0f, 0xc0, 0x02, 0x6d, 0x7b, 0x82, - 0x17, 0x15, 0xe7, 0x83, 0xb0, 0x60, 0x55, 0x90, 0xf8, 0xce, 0x9b, 0x61, - 0xb8, 0xe1, 0x9f, 0x2b, 0x09, 0x9d, 0x69, 0xa9, 0x00, 0x42, 0xa1, 0x7f, - 0xb0, 0xff, 0x25, 0x38, 0x23, 0x92, 0x72, 0x98, 0xbc, 0x71, 0x13, 0x6e, - 0x92, 0xc3, 0x2e, 0xb0, 0x82, 0x2f, 0x8e, 0x68, 0x36, 0x9a, 0x97, 0x3a, - 0xc1, 0x12, 0x88, 0x06, 0x6b, 0x88, 0x0c, 0x14, 0xac, 0xf4, 0xde, 0x2c, - 0xb0, 0xf5, 0xc6, 0xe0, 0x1c, 0xcc, 0x82, 0x75, 0x11, 0xb6, 0xd2, 0x18, - 0x48, 0xa8, 0x9f, 0x71, 0xed, 0x64, 0x13, 0x9b, 0x6c, 0x35, 0x35, 0x2d, - 0xa8, 0xf4, 0xd9, 0x88, 0xbc, 0x98, 0x44, 0x91, 0x20, 0x4e, 0x59, 0xd4, - 0x73, 0x38, 0xc3, 0xca, 0x68, 0x5a, 0xbe, 0x43, 0x09, 0x3b, 0xfb, 0x9f, - 0x87, 0xcd, 0x26, 0xfe, 0x84, 0xd6, 0xa8, 0xcf, 0xb7, 0x64, 0x4f, 0x15, - 0x0c, 0xb5, 0x3d, 0xd4, 0x68, 0xf2, 0xad, 0xe3, 0x10, 0x9b, 0xf3, 0x02, - 0xde, 0xa0, 0xc4, 0x78, 0xdb, 0x0e, 0x8c, 0x38, 0xe1, 0x8d, 0xba, 0x3e, - 0xdc, 0xb5, 0x40, 0xf4, 0xa2, 0xe7, 0xb2, 0x55, 0xd9, 0x51, 0x1d, 0xcf, - 0xcc, 0xcf, 0xdb, 0xd6, 0x28, 0xe1, 0xf1, 0x48, 0xf2, 0x51, 0x2a, 0x66, - 0x12, 0x0a, 0xea, 0x90, 0x40, 0xbd, 0x2e, 0xc9, 0xf6, 0xe5, 0x5e, 0xec, - 0x80, 0x23, 0x35, 0xe2, 0x85, 0x7c, 0x7e, 0x95, 0xc5, 0xd4, 0x32, 0x86, - 0x16, 0x64, 0x4c, 0xa3, 0x89, 0x47, 0x60, 0x57, 0x5b, 0x0e, 0xbc, 0x97, - 0xca, 0x82, 0x49, 0xdb, 0xab, 0x13, 0xb8, 0x62, 0xba, 0x3c, 0x3a, 0x70, - 0xd0, 0xd5, 0x28, 0x31, 0xf3, 0x5c, 0x0e, 0x24, 0x74, 0xd5, 0x13, 0xf7, - 0x90, 0xd7, 0x0b, 0x31, 0x7d, 0x9a, 0xed, 0xa4, 0xb6, 0x8a, 0x7f, 0xff, - 0xbe, 0x97, 0x5f, 0x3d, 0x66, 0x84, 0x31, 0xef, 0x11, 0x12, 0x2f, 0x59, - 0xae, 0x9b, 0xe1, 0x0a, 0x51, 0xbf, 0x9d, 0x67, 0xc8, 0x86, 0x26, 0xeb, - 0xbe, 0xaa, 0x17, 0x4b, 0xfb, 0xc4, 0xa4, 0x83, 0xd1, 0x1a, 0x30, 0x47, - 0xe1, 0x03, 0xcc, 0xb9, 0xb4, 0x71, 0xbd, 0x35, 0xb3, 0x08, 0xad, 0xb8, - 0x91, 0x7e, 0x8f, 0x03, 0xe6, 0x6d, 0x2b, 0xd2, 0xfd, 0x7b, 0x24, 0x70, - 0x79, 0x7e, 0x45, 0x3a, 0x8a, 0x8c, 0x39, 0x09, 0xbb, 0x60, 0x2f, 0xe5, - 0x90, 0x83, 0x8c, 0x37, 0x78, 0xe2, 0x4e, 0xd3, 0xcb, 0x10, 0xd8, 0xe4, - 0xeb, 0x0f, 0xd1, 0xea, 0xba, 0x08, 0xf3, 0xff, 0x09, 0x0d, 0xdd, 0x08, - 0x94, 0xc4, 0x01, 0x33, 0xdc, 0xd0, 0x34, 0x72, 0x65, 0xc0, 0x5d, 0xa9, - 0xc7, 0x8d, 0x22, 0xef, 0x5e, 0xd9, 0x71, 0xfc, 0x15, 0xa3, 0x85, 0xdb, - 0x2c, 0x54, 0x11, 0xb4, 0x5e, 0x2a, 0x12, 0xd1, 0xdd, 0xd5, 0x0b, 0x2a, - 0xe2, 0x27, 0x0b, 0x87, 0x55, 0x5e, 0xaa, 0x42, 0x47, 0xaa, 0x02, 0x2b, - 0x65, 0x77, 0xa4, 0x6e, 0x44, 0x6b, 0x92, 0xf3, 0xc1, 0x3d, 0x57, 0x54, - 0x73, 0xa8, 0xe5, 0x1d, 0x61, 0xc6, 0xce, 0x37, 0x8c, 0xed, 0x4b, 0xde, - 0xda, 0xfa, 0x16, 0x16, 0x00, 0xc8, 0xd9, 0xc3, 0xcb, 0xd3, 0xcb, 0x5a, - 0x72, 0x0f, 0xd9, 0x83, 0xe9, 0x71, 0xf3, 0xf3, 0xed, 0x2c, 0x2c, 0x1f, - 0x66, 0x70, 0x2a, 0x0c, 0x5a, 0x61, 0xb0, 0x9b, 0xd1, 0xcd, 0x66, 0x43, - 0xc7, 0x96, 0xfe, 0x05, 0xc1, 0x03, 0x2f, 0x01, 0x61, 0x21, 0xc9, 0xa0, - 0x48, 0x51, 0xb1, 0x5c, 0xae, 0xe0, 0xd2, 0xdd, 0x56, 0x52, 0x3f, 0xb8, - 0x4e, 0x4e, 0xd9, 0x0d, 0x60, 0x66, 0xa2, 0xb2, 0x53, 0xfe, 0x3e, 0x0c, - 0xb9, 0x78, 0xe9, 0xc8, 0x08, 0x54, 0xcf, 0x94, 0x46, 0xf4, 0x2b, 0xbb, - 0x4b, 0x72, 0xd0, 0xa6, 0xdd, 0xac, 0x6f, 0xee, 0x30, 0x81, 0x90, 0x7e, - 0xff, 0xca, 0xc5, 0x24, 0x6d, 0xd8, 0x74, 0x52, 0xf1, 0x98, 0x9d, 0x74, - 0xb1, 0x46, 0x1e, 0x80, 0xf1, 0x47, 0x6b, 0x0a, 0xb0, 0x18, 0xa2, 0xfc, - 0x85, 0xe1, 0x2d, 0xb6, 0x2d, 0x45, 0x19, 0xfc, 0xad, 0xa4, 0x9a, 0x47, - 0x94, 0xd0, 0xc3, 0xf5, 0x68, 0x66, 0x7b, 0x21, 0x5e, 0x58, 0x22, 0x15, - 0xb1, 0x78, 0xde, 0x27, 0x19, 0xcf, 0xed, 0x4e, 0xdd, 0x8f, 0x29, 0xf2, - 0xa5, 0x00, 0x23, 0xfa, 0x85, 0x34, 0xee, 0x8c, 0x5d, 0x85, 0x7e, 0x95, - 0x73, 0xfb, 0x40, 0x78, 0xb1, 0x85, 0x79, 0x86, 0xf1, 0x25, 0x1b, 0x6f, - 0xc3, 0x69, 0x05, 0x66, 0xb6, 0xb8, 0x92, 0x96, 0xe8, 0x38, 0x34, 0xcb, - 0x37, 0x66, 0xa2, 0x87, 0xcb, 0x19, 0x5a, 0x97, 0x33, 0xc1, 0x1e, 0xd3, - 0x98, 0xf0, 0xe8, 0x75, 0xdc, 0xb7, 0x2d, 0x8a, 0x4b, 0x8e, 0x0f, 0x41, - 0xb8, 0x75, 0x35, 0xcc, 0x17, 0x45, 0x77, 0x46, 0x22, 0x38, 0x3a, 0xb2, - 0x45, 0x1f, 0x2e, 0xa7, 0xf2, 0xa8, 0x2c, 0xed, 0x99, 0xa4, 0x63, 0x01, - 0x40, 0x2c, 0x08, 0x34, 0xbd, 0x9b, 0x48, 0xd2, 0x51, 0xf1, 0x57, 0xf8, - 0xe7, 0x97, 0x5e, 0x85, 0x39, 0x92, 0xa8, 0xe1, 0x95, 0x19, 0x5f, 0xc3, - 0x3a, 0xe4, 0xca, 0x31, 0xfc, 0x27, 0x0b, 0x85, 0x5a, 0x5e, 0xaa, 0x43, - 0x40, 0xaa, 0x02, 0x2b, 0x62, 0x70, 0xa0, 0x6e, 0x5e, 0xfd, 0x3c, 0x18, - 0x2e, 0x26, 0x16, 0x69, 0xa1, 0x1d, 0xb1, 0x1e, 0xfd, 0xec, 0x94, 0x02, - 0x60, 0x30, 0x61, 0x1c, 0xf0, 0x9a, 0x36, 0x72, 0xae, 0x27, 0x8b, 0x63, - 0x2d, 0x5b, 0xc8, 0x72, 0x3f, 0xf4, 0xba, 0x7f, 0x7f, 0x85, 0x84, 0xd1, - 0xe8, 0x07, 0x4f, 0x39, 0xf6, 0x47, 0x86, 0xb2, 0xf4, 0x3b, 0xdd, 0x4b, - 0x2a, 0x95, 0x90, 0x28, 0x2e, 0x09, 0x62, 0xa7, 0x53, 0x18, 0x66, 0x3e, - 0xf3, 0xc9, 0xa8, 0x65, 0xb8, 0xc8, 0x5e, 0xc7, 0xbf, 0x03, 0xed, 0x32, - 0xdd, 0x1a, 0xdf, 0xd6, 0xb4, 0x5c, 0xdb, 0xd8, 0x9e, 0x86, 0x80, 0x2d, - 0xcf, 0x8d, 0x40, 0xa9, 0x16, 0x22, 0x9e, 0x52, 0x83, 0xed, 0x54, 0xeb, - 0x43, 0xa1, 0xb3, 0x67, 0x7c, 0x2b, 0x10, 0xe6, 0x15, 0xa4, 0xaa, 0x63, - 0x89, 0x42, 0x60, 0x57, 0x5b, 0x0c, 0xbc, 0x97, 0xca, 0x82, 0x49, 0xdb, - 0xab, 0x13, 0xb8, 0x62, 0x7d, 0x19, 0xb9, 0x85, 0x93, 0x70, 0xca, 0x16, - 0xc9, 0x22, 0xb3, 0xc1, 0xe4, 0x63, 0xb8, 0xba, 0x8f, 0xb1, 0xcc, 0x3f, - 0x7c, 0xe6, 0xaf, 0x59, 0x05, 0x13, 0x61, 0xbe, 0xd8, 0x70, 0x4a, 0x45, - 0x76, 0xd6, 0xec, 0x74, 0x16, 0xc6, 0x0e, 0xad, 0xa9, 0x99, 0xd2, 0x1e, - 0x24, 0x38, 0xad, 0x6f, 0xd8, 0x86, 0x37, 0xfb, 0xbe, 0xaa, 0x06, 0x5b, - 0xfb, 0xc4, 0xa4, 0x83, 0xd1, 0x1a, 0x30, 0x47, 0x46, 0x82, 0xbe, 0x6d, - 0xd8, 0x0a, 0x79, 0xcf, 0xef, 0x6e, 0xc6, 0x62, 0x42, 0xe7, 0xd7, 0x17, - 0xd8, 0x20, 0xd5, 0xfb, 0xa5, 0x13, 0x35, 0x3b, 0x67, 0x66, 0xd3, 0xfd, - 0x66, 0x7f, 0x0e, 0x60, 0xc7, 0x8d, 0xe1, 0xd8, 0x1c, 0xb5, 0x8b, 0x5f, - 0x15, 0xf5, 0xdd, 0xb1, 0xd3, 0x7c, 0x1c, 0xd0, 0x12, 0xfe, 0x60, 0x8c, - 0x70, 0x1c, 0xf2, 0x23, 0x3e, 0x1d, 0x2d, 0xa9, 0x89, 0xcb, 0x38, 0x4d, - 0xdc, 0xd0, 0x34, 0x62, 0x65, 0xca, 0x5a, 0xa9, 0xc7, 0x88, 0x3c, 0xef, - 0x5e, 0xdb, 0x7e, 0xfc, 0x41, 0x08, 0xd5, 0x95, 0xb3, 0xb6, 0x43, 0x6c, - 0xfe, 0x9b, 0x07, 0x68, 0x22, 0x4f, 0x74, 0x6e, 0xa5, 0x5c, 0x3a, 0xd2, - 0xbd, 0x3e, 0x7d, 0x2d, 0xe2, 0x99, 0x13, 0x59, 0x77, 0xe3, 0xc6, 0x11, - 0x37, 0xce, 0xab, 0xcb, 0x3f, 0x0e, 0x3c, 0x00, 0x2b, 0x8d, 0x2a, 0x44, - 0x47, 0x13, 0x30, 0x24, 0xd2, 0xb8, 0x74, 0x82, 0x43, 0x88, 0x8b, 0xa1, - 0xe0, 0xa4, 0x00, 0x44, 0x25, 0x48, 0xb5, 0xfc, 0xb7, 0x64, 0x48, 0x12, - 0x0c, 0xb5, 0x23, 0xca, 0x68, 0xf2, 0xa2, 0xec, 0x10, 0x9b, 0xf3, 0x02, - 0x3b, 0xa1, 0xaa, 0x9d, 0xc1, 0xae, 0x88, 0x75, 0xdf, 0xdd, 0x9e, 0x31, - 0xe6, 0xfc, 0xb9, 0x8d, 0xb2, 0x4f, 0xb6, 0xff, 0x85, 0x09, 0x56, 0xaf, - 0xf8, 0x4e, 0xbb, 0x1c, 0x31, 0x90, 0xbe, 0x3f, 0x1c, 0x9a, 0x43, 0xe5, - 0x44, 0x82, 0x71, 0x17, 0xa8, 0x20, 0x05, 0xc5, 0x5e, 0xc1, 0x68, 0x9f, - 0xc1, 0x98, 0xa4, 0xa1, 0x2a, 0xda, 0x52, 0xd0, 0x3d, 0x06, 0xa8, 0x77, - 0x45, 0x07, 0x14, 0x71, 0x12, 0x69, 0x49, 0xc0, 0x6f, 0x35, 0x2c, 0x4a, - 0x84, 0x78, 0x3c, 0x5c, 0x0c, 0x43, 0x21, 0xcf, 0xbd, 0x98, 0x73, 0xbc, - 0xa9, 0xbc, 0x79, 0xda, 0x79, 0xb3, 0x75, 0x0c, 0x14, 0xe6, 0x2b, 0x59, - 0x06, 0x50, 0x74, 0xa2, 0x94, 0x1e, 0x1e, 0xce, 0x63, 0x95, 0xb0, 0x70, - 0xfb, 0x5d, 0xf9, 0xbf, 0x8c, 0xc0, 0xfe, 0x66, 0xc1, 0x17, 0xe1, 0x7c, - 0x60, 0x5b, 0x43, 0x7d, 0xd8, 0xe3, 0xe3, 0xe3, 0xa5, 0x00, 0x32, 0xfb, - 0x85, 0x34, 0xff, 0x8f, 0x5d, 0x85, 0x7e, 0x95, 0x73, 0xfb, 0x40, 0x78, - 0xb1, 0x85, 0x79, 0x86, 0xf1, 0x25, 0x1b, 0x6f, 0xc3, 0x69, 0x05, 0x66, - 0xb6, 0xb8, 0x92, 0x96, 0x59, 0x7b, 0x37, 0x12, 0x55, 0x62, 0xb0, 0xca, - 0xdf, 0x8d, 0x01, 0x37, 0x66, 0x96, 0x62, 0x34, 0x04, 0x2e, 0xc1, 0xa8, - 0x13, 0x8b, 0xb7, 0x7a, 0x03, 0x54, 0xb2, 0x25, 0x9c, 0x34, 0x1b, 0x9a, - 0x71, 0xfe, 0xbd, 0x3a, 0xfc, 0xe3, 0x07, 0x93, 0x2f, 0x85, 0x4d, 0x7c, - 0xa3, 0xcc, 0xbf, 0x51, 0x41, 0xaf, 0x55, 0xb0, 0x5f, 0x16, 0x71, 0x5b, - 0x7a, 0x4e, 0x1c, 0x82, 0xf0, 0xbd, 0xa5, 0xef, 0x1a, 0x2b, 0x40, 0x60, - 0x90, 0x75, 0xb3, 0x6e, 0xed, 0x8c, 0x32, 0x41, 0x15, 0x41, 0x57, 0x9d, - 0xa5, 0x59, 0x3a, 0xd0, 0xbd, 0x3c, 0x7d, 0x2c, 0xe2, 0x93, 0x13, 0x5d, - 0x77, 0xe3, 0xc6, 0x11, 0x84, 0x36, 0xb0, 0x26, 0x7f, 0x5c, 0xec, 0xaf, - 0x9f, 0x3c, 0xd9, 0x9b, 0x4f, 0xe3, 0xbe, 0x60, 0x4d, 0xd9, 0xe5, 0x87, - 0x08, 0x62, 0x93, 0xf4, 0x1c, 0x07, 0xab, 0xd7, 0x12, 0x01, 0x72, 0xc4, - 0x25, 0x8c, 0x81, 0x0d, 0xed, 0x43, 0xa6, 0x91, 0x58, 0x33, 0x0d, 0x45, - 0x4e, 0x52, 0x37, 0xcd, 0xb3, 0x91, 0x8e, 0x0a, 0xa2, 0xb6, 0xbf, 0xda, - 0xfc, 0xc6, 0x37, 0x06, 0xe9, 0x49, 0x18, 0x47, 0xa1, 0xdc, 0xa1, 0xbf, - 0xf8, 0x8b, 0xa7, 0x16, 0xbb, 0x4a, 0xcc, 0xc3, 0x0a, 0xbf, 0x08, 0x22, - 0x74, 0x0f, 0xb3, 0xd8, 0x21, 0x93, 0x2a, 0xbf, 0x20, 0x37, 0xdb, 0xf0, - 0xcb, 0xbe, 0xd6, 0x19, 0xde, 0x48, 0x05, 0x89, 0x9a, 0xe7, 0xbe, 0xaf, - 0xc8, 0x54, 0x5e, 0xc3, 0xe9, 0x39, 0x08, 0xdc, 0x18, 0x2f, 0x76, 0xa8, - 0x23, 0x6c, 0x84, 0x97, 0x9d, 0x19, 0x05, 0x5e, 0x59, 0x5e, 0x3c, 0x82, - 0x53, 0xb7, 0xcb, 0xc2, 0xb5, 0xe6, 0x5d, 0x68, 0xd5, 0x01, 0x10, 0xe0, - 0x5b, 0x31, 0x11, 0xd8, 0x1a, 0x63, 0x8d, 0x13, 0xe7, 0x4b, 0xfc, 0x67, - 0xdb, 0xe4, 0x80, 0xa9, 0x3c, 0x9f, 0x4b, 0x94, 0xfd, 0x7d, 0x1c, 0xc2, - 0xa7, 0xfe, 0xb7, 0xff, 0xf8, 0x3d, 0xa5, 0x51, 0x16, 0x30, 0xf5, 0x54, - 0xc6, 0x1e, 0x6a, 0x0d, 0xdb, 0xc7, 0x11, 0xfe, 0xe5, 0xd1, 0xd9, 0xd9, - 0x96, 0x17, 0xf9, 0xe4, 0xe1, 0x01, 0xcc, 0xb9, 0xb4, 0x71, 0xb7, 0x35, - 0xb3, 0x08, 0xa8, 0xb8, 0x91, 0x7e, 0x8d, 0x03, 0xd8, 0x96, 0x52, 0xb8, - 0xaa, 0x74, 0x1d, 0x0f, 0xef, 0x97, 0x59, 0x20, 0x0b, 0xf3, 0x3d, 0xca, - 0xb2, 0x97, 0xa8, 0x69, 0x2f, 0x47, 0xea, 0xfc, 0x9d, 0xdc, 0x95, 0x5b, - 0x6f, 0x4e, 0xa6, 0xea, 0x23, 0x8f, 0xcf, 0x0d, 0xf2, 0x36, 0x63, 0x90, - 0x20, 0x90, 0xa8, 0x29, 0x1f, 0x32, 0x07, 0x52, 0xdc, 0xd0, 0x25, 0x61, - 0x65, 0xc0, 0x5d, 0xa9, 0xc7, 0x8d, 0x22, 0xef, 0x5e, 0xd9, 0x71, 0xfc, - 0x2c, 0xcc, 0x37, 0xec, 0x7d, 0xf1, 0x35, 0x05, 0x2d, 0x0d, 0x49, 0x1c, - 0xb5, 0x11, 0xd5, 0x3f, 0xa5, 0x5c, 0x3a, 0xd2, 0xbd, 0x3e, 0x7d, 0x2d, - 0xe2, 0x99, 0x13, 0x59, 0x70, 0xe4, 0xc2, 0x11, 0x69, 0x12, 0xff, 0x10, - 0x93, 0x1c, 0x11, 0xed, 0x45, 0x1b, 0x71, 0xee, 0x36, 0xde, 0x4b, 0x2a, - 0x4d, 0xd9, 0x92, 0xf0, 0x08, 0x62, 0x93, 0xf4, 0x1c, 0x07, 0x89, 0xd7, - 0x12, 0x01, 0x50, 0xc4, 0x25, 0x8c, 0x81, 0x0d, 0xed, 0x43, 0xa6, 0x91, - 0x58, 0x33, 0x0d, 0x45, 0x4e, 0x52, 0x37, 0xcd, 0xe8, 0x53, 0xab, 0x04, - 0x73, 0x2b, 0xfe, 0x49, 0x0f, 0x3f, 0xec, 0x41, 0x72, 0xd7, 0x63, 0x63, - 0xa2, 0xe5, 0xb2, 0x54, 0xd9, 0x5b, 0x1d, 0xcb, 0xcb, 0xc8, 0xdf, 0xc2, - 0x28, 0xe1, 0xf1, 0x48, 0xae, 0x1b, 0x54, 0xbe, 0x32, 0xdc, 0x05, 0xd3, - 0xf7, 0x62, 0x44, 0x24, 0x7e, 0xf8, 0x5b, 0x4f, 0x80, 0x23, 0x35, 0xe5, - 0x85, 0x6c, 0x6f, 0x95, 0xc5, 0xd4, 0x23, 0x86, 0x16, 0x64, 0x4c, 0xa3, - 0x89, 0x47, 0x60, 0x57, 0x5b, 0x0e, 0xbc, 0x97, 0xca, 0x82, 0x49, 0xdb, - 0xab, 0x13, 0xb8, 0x62, 0x31, 0xb6, 0x34, 0x35, 0xc6, 0x2d, 0x26, 0x35, - 0xff, 0xc5, 0xdb, 0x25, 0x92, 0x0b, 0x0d, 0xe8, 0x3f, 0x8b, 0xc6, 0x01, - 0xad, 0x65, 0x71, 0xfe, 0x37, 0xa0, 0x71, 0x41, 0x14, 0x7e, 0x3a, 0xab, - 0xd5, 0x81, 0x04, 0x76, 0x6c, 0x3f, 0x6a, 0x7c, 0xe6, 0x52, 0x7d, 0xde, - 0xb3, 0x78, 0xcd, 0x26, 0xc8, 0x96, 0x37, 0xea, 0xbe, 0xaa, 0x06, 0x4b, - 0xfb, 0xc4, 0xa4, 0x83, 0xd1, 0x1a, 0x30, 0x47, 0x07, 0x7e, 0xfe, 0xfa, - 0x8e, 0xb6, 0xa8, 0xbc, 0xd8, 0x8d, 0xa6, 0x0a, 0x2b, 0x9e, 0x32, 0xd1, - 0x4a, 0xf7, 0x46, 0xd0, 0xbf, 0xfa, 0xc3, 0x01, 0x04, 0xa2, 0xd9, 0x89, - 0x1e, 0x47, 0xf3, 0x2d, 0x0a, 0x2f, 0x4d, 0xab, 0x42, 0x9f, 0xd4, 0xed, - 0x12, 0x5e, 0xec, 0x51, 0x0d, 0x2b, 0xa1, 0x53, 0x7d, 0x1d, 0x0d, 0xcb, - 0x61, 0x64, 0xf6, 0x3d, 0x29, 0xa6, 0xce, 0x8e, 0xb7, 0x0e, 0x6b, 0x2c, - 0x41, 0xaf, 0x44, 0xb3, 0x5f, 0x16, 0x71, 0x5c, 0x7a, 0x4e, 0x1c, 0x9c, - 0xf0, 0xbd, 0xa5, 0xe0, 0xd4, 0x4c, 0x72, 0xa4, 0xbc, 0x63, 0xd7, 0x4e, - 0xc1, 0xed, 0x50, 0x05, 0x8d, 0x0a, 0xd6, 0x3c, 0xa5, 0x59, 0x3a, 0xd0, - 0xbd, 0x3c, 0x7d, 0x2c, 0xe2, 0x93, 0x13, 0x5d, 0x70, 0xe4, 0xc6, 0x11, - 0x9f, 0x4d, 0xa3, 0x34, 0xaf, 0x1f, 0x48, 0xe9, 0x1b, 0x84, 0xec, 0xdd, - 0x55, 0xeb, 0x1a, 0xaf, 0x56, 0xf2, 0xd7, 0x72, 0x36, 0x4c, 0xe9, 0xb0, - 0x41, 0x19, 0xd5, 0x95, 0x12, 0x4d, 0x4d, 0xbe, 0x25, 0x8c, 0x81, 0x0a, - 0xed, 0x43, 0xa6, 0x8f, 0x58, 0x33, 0x0d, 0x4a, 0x4e, 0x52, 0x37, 0xcd, - 0xe8, 0x53, 0xab, 0x04, 0x73, 0x2b, 0xfe, 0x49, 0x0f, 0x3f, 0xec, 0x41, - 0x72, 0xd7, 0x63, 0x63, 0xa1, 0xdc, 0xa1, 0xbf, 0xf8, 0x8b, 0xa7, 0x16, - 0xbc, 0x4d, 0xcc, 0xc3, 0x0a, 0xbf, 0x08, 0x22, 0x50, 0xbd, 0x60, 0x40, - 0xf4, 0x6a, 0x6e, 0x01, 0xe9, 0x97, 0xc7, 0x73, 0x18, 0x8c, 0x7e, 0xb9, - 0x83, 0xed, 0x54, 0xeb, 0x53, 0xb1, 0xb3, 0x67, 0x6c, 0x3b, 0x10, 0xf6, - 0x15, 0xa4, 0xaa, 0x63, 0x30, 0x81, 0x8e, 0x7e, 0xff, 0xca, 0xca, 0x24, - 0x6d, 0xd8, 0x74, 0x52, 0xf1, 0x98, 0x9d, 0x74, 0xf4, 0x2f, 0x2d, 0x0c, - 0xb4, 0xe6, 0x61, 0x61, 0x44, 0xce, 0xb7, 0xb1, 0xa1, 0xef, 0x80, 0xbc, - 0xbc, 0x32, 0xa7, 0x46, 0x1d, 0xcd, 0x84, 0xc5, 0x70, 0x96, 0xf2, 0xfb, - 0xb2, 0x6b, 0xa5, 0xd3, 0xbe, 0x9d, 0x46, 0x71, 0x61, 0xaf, 0xf5, 0xc1, - 0x63, 0x96, 0xf5, 0xbe, 0x1d, 0x25, 0xf1, 0x9d, 0x8b, 0x0d, 0x98, 0x42, - 0xf9, 0x3c, 0x3e, 0xfe, 0xad, 0x8f, 0xd8, 0xfd, 0x8d, 0x5d, 0x25, 0x7f, - 0x95, 0x54, 0x96, 0x2c, 0x12, 0x3b, 0x16, 0xa9, 0x6e, 0x4d, 0xcb, 0xf6, - 0x39, 0x71, 0x14, 0x9a, 0xee, 0x9c, 0x9a, 0x0a, 0x7d, 0x9a, 0x98, 0x11, - 0xf4, 0xc4, 0x38, 0x84, 0x38, 0x17, 0xf9, 0xc7, 0xba, 0x68, 0x4a, 0xc4, - 0xf3, 0x64, 0x46, 0xc7, 0x30, 0x79, 0x56, 0x73, 0x69, 0x90, 0x5f, 0x02, - 0x6b, 0x67, 0xa1, 0x18, 0xca, 0xe7, 0xc5, 0xda, 0x93, 0x12, 0xdb, 0xb6, - 0x3f, 0xec, 0x49, 0xae, 0xdc, 0xd0, 0x25, 0x70, 0x65, 0xca, 0x5d, 0xa9, - 0xc7, 0x88, 0x22, 0xef, 0x5e, 0xdb, 0x71, 0xfc, 0xe3, 0xf4, 0x97, 0x9c, - 0x5e, 0x4f, 0x06, 0xd3, 0xe3, 0xe5, 0x7a, 0x35, 0x25, 0x30, 0xca, 0xa1, - 0xa5, 0x5c, 0x3a, 0xd2, 0xbd, 0x3e, 0x7d, 0x2d, 0xe2, 0x99, 0x17, 0x43, - 0x70, 0xe4, 0xc2, 0x1b, 0x85, 0x10, 0x71, 0x39, 0xa7, 0xac, 0xea, 0xf6, - 0xde, 0x65, 0x78, 0x34, 0xb9, 0x0b, 0x3d, 0x69, 0x4d, 0xd9, 0x92, 0xf0, - 0x08, 0x62, 0x93, 0xf4, 0x0c, 0x17, 0xab, 0xd6, 0x02, 0x11, 0x72, 0xc4, - 0xb7, 0x6e, 0x4f, 0x12, 0x0c, 0xb0, 0x3d, 0xca, 0x68, 0xf0, 0xad, 0xec, - 0x10, 0x9b, 0xf3, 0x02, 0x88, 0xb4, 0xf7, 0xc9, 0x06, 0x4e, 0x63, 0x4d, - 0x8d, 0x38, 0x52, 0x7d, 0xa2, 0x8b, 0x53, 0x65, 0xa2, 0xe7, 0xb2, 0x55, - 0xd9, 0x5b, 0x19, 0xdf, 0xcc, 0xcf, 0xdb, 0xc2, 0x28, 0xe1, 0xf1, 0x48, - 0x38, 0xfe, 0x42, 0xee, 0xf4, 0x08, 0x0f, 0x63, 0x09, 0xe8, 0x4f, 0x74, - 0x6c, 0x74, 0xfe, 0xc2, 0x83, 0x3c, 0xa4, 0x8e, 0x34, 0xb9, 0xb2, 0xfd, - 0x4a, 0x14, 0x20, 0x02, 0xb7, 0xb2, 0x8e, 0x67, 0xf2, 0xae, 0x2b, 0x8a, - 0xeb, 0xe9, 0xff, 0x29, 0x4b, 0xe4, 0x51, 0x1c, 0x9b, 0xf4, 0xa4, 0x84, - 0x98, 0xdf, 0xd7, 0x8d, 0x09, 0x85, 0x99, 0xa7, 0x04, 0x4d, 0x25, 0xe3, - 0x9c, 0x09, 0x91, 0xbe, 0xff, 0xfc, 0xeb, 0x65, 0xa9, 0xd3, 0xb9, 0x63, - 0x05, 0xbb, 0xd1, 0x6a, 0xee, 0x61, 0xe0, 0x0b, 0x26, 0x69, 0x8e, 0xbe, - 0xad, 0xfe, 0xd1, 0x67, 0x7f, 0x7f, 0x96, 0x4f, 0x89, 0xd6, 0x8c, 0x34, - 0xc3, 0xc9, 0xf4, 0x5e, 0xd5, 0x53, 0xf5, 0xfd, 0x87, 0x57, 0x11, 0xfd, - 0x1a, 0x2e, 0x90, 0x75, 0xac, 0x11, 0x48, 0x07, 0x47, 0xc4, 0x97, 0xc6, - 0xe4, 0x73, 0x13, 0x9a, 0xd4, 0x7c, 0xd7, 0xfc, 0xb5, 0xca, 0x1a, 0x07, - 0xb9, 0x61, 0xe5, 0x2d, 0xbd, 0xbb, 0x71, 0x32, 0xad, 0x64, 0x17, 0x83, - 0x56, 0x71, 0x30, 0x8c, 0x78, 0xf8, 0xd1, 0xb6, 0xeb, 0x35, 0xbc, 0xac, - 0x5b, 0xd8, 0x21, 0xc1, 0x18, 0xe2, 0x43, 0xe3, 0x55, 0xb6, 0xf6, 0x1b, - 0x28, 0xb9, 0xfb, 0x0a, 0x1a, 0x16, 0x0e, 0x4f, 0x3d, 0xbe, 0x80, 0x89, - 0x65, 0x7d, 0x5a, 0xd5, 0x55, 0x0c, 0xae, 0xa9, 0xae, 0x01, 0x44, 0x4f, - 0xd9, 0x79, 0x29, 0xc9, 0x06, 0x8d, 0x01, 0x70, 0x9c, 0xc9, 0xbd, 0xbe, - 0xe8, 0x4b, 0x85, 0x36, 0xa5, 0x5c, 0x3a, 0xd2, 0xbd, 0x3e, 0x7d, 0x2d, - 0xe2, 0x93, 0x17, 0x43, 0x70, 0xe4, 0xc2, 0x11, 0x06, 0xb6, 0x66, 0x53, - 0x3d, 0x59, 0x12, 0xa3, 0x38, 0xf0, 0x85, 0xfd, 0x1e, 0x76, 0x31, 0xd5, - 0xd2, 0xb8, 0x65, 0xf5, 0x43, 0x88, 0x8b, 0xa1, 0xe0, 0xa4, 0x00, 0x45, - 0x25, 0x48, 0xb5, 0xfc, 0xb7, 0x64, 0x48, 0x12, 0x0c, 0xb5, 0x23, 0xca, - 0x68, 0xf2, 0xa2, 0xec, 0x10, 0x9b, 0xf3, 0x02, 0x88, 0xb4, 0xf7, 0xc9, - 0x06, 0x4e, 0x63, 0x4d, 0x8d, 0x38, 0x52, 0x7d, 0xa2, 0x8b, 0x53, 0x65, - 0xa1, 0xde, 0xa1, 0xbe, 0xf8, 0x8b, 0xa3, 0x02, 0xbb, 0x4a, 0xc8, 0xc3, - 0x0a, 0xbf, 0x08, 0x22, 0x7b, 0x5a, 0x3f, 0xb0, 0x3a, 0xbf, 0x6a, 0xd6, - 0xcc, 0x9c, 0xd4, 0xb0, 0x5b, 0x9f, 0x03, 0x5d, 0x83, 0x3c, 0xa4, 0x8e, - 0x34, 0xa9, 0xb2, 0xfd, 0x4a, 0x14, 0x20, 0x02, 0xb7, 0xb2, 0x8e, 0x67, - 0xf2, 0xae, 0x2b, 0x8a, 0xeb, 0xe9, 0xff, 0x29, 0x4b, 0xe4, 0x51, 0x1c, - 0x9b, 0xf4, 0xa4, 0x84, 0x98, 0xdf, 0xd7, 0x8d, 0x09, 0x85, 0x99, 0xa7, - 0x04, 0x4d, 0x25, 0xe3, 0x9c, 0x09, 0x91, 0xbe, 0xae, 0x06, 0x51, 0x98, - 0x08, 0xf3, 0x74, 0x63, 0xdd, 0x1e, 0x0e, 0x5d, 0x7a, 0x50, 0x72, 0xdf, - 0xf5, 0x14, 0x1a, 0xd1, 0xa2, 0xf5, 0x80, 0xa6, 0xb5, 0x8a, 0x9a, 0xe1, - 0xe5, 0x15, 0x20, 0xa5, 0x3f, 0x56, 0x5a, 0x44, 0xcf, 0x42, 0xc3, 0x1b, - 0x15, 0x52, 0xe4, 0x0c, 0xf0, 0x62, 0xb7, 0xc3, 0x5e, 0x44, 0x18, 0xd0, - 0x89, 0xbb, 0x8c, 0xfc, 0xd5, 0x07, 0x16, 0xd4, 0x9a, 0x13, 0x43, 0xe6, - 0x8b, 0x4c, 0x61, 0x8c, 0x3e, 0xf8, 0x73, 0x42, 0x40, 0x1a, 0xfd, 0x7e, - 0xa6, 0x7c, 0xf0, 0x9c, 0xa3, 0x8d, 0x5c, 0x38, 0x53, 0xf2, 0xaa, 0x3f, - 0xa7, 0x7c, 0x2b, 0xaa, 0xd2, 0x0b, 0x76, 0x56, 0x66, 0xc0, 0x2c, 0xfd, - 0xd2, 0x04, 0xe1, 0xd8, 0x9e, 0x57, 0x0c, 0x26, 0xb7, 0x4d, 0xce, 0x56, - 0x95, 0x88, 0x49, 0xb1, 0xf9, 0x7b, 0x36, 0x5a, 0x7f, 0xb4, 0xb0, 0x2a, - 0x38, 0x26, 0x75, 0x64, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x27, 0x49, 0xf0, - 0x7b, 0xcd, 0x98, 0x7f, 0xd7, 0x97, 0xff, 0xce, 0xe9, 0x34, 0xe8, 0x82, - 0x73, 0x33, 0xd1, 0xb7, 0x86, 0x37, 0x6c, 0xd3, 0x34, 0x5a, 0xdb, 0x73, - 0x10, 0xe8, 0x62, 0x56, 0xfd, 0xf8, 0x7c, 0xe5, 0x0f, 0xa0, 0xb7, 0xda, - 0xc0, 0xc0, 0xa2, 0xb3, 0xce, 0x9d, 0x12, 0x03, 0xf6, 0x57, 0xfa, 0x86, - 0x7a, 0x40, 0x1a, 0x38, 0xe5, 0xc2, 0x2d, 0x65, 0x2d, 0x64, 0xcc, 0x6a, - 0xe8, 0xa5, 0xba, 0x92, 0x2b, 0xd2, 0xd5, 0x1d, 0xfd, 0x51, 0xc1, 0xb3, - 0x1b, 0x3e, 0x27, 0xad, 0xd2, 0xa1, 0x23, 0xe7, 0xa1, 0x26, 0xba, 0x2b, - 0x75, 0xd5, 0x62, 0x7f, 0xc4, 0x0f, 0xa7, 0xfe, 0xba, 0x4d, 0xca, 0x36, - 0x8f, 0xba, 0x14, 0xba, 0x80, 0x90, 0xee, 0x83, 0x00, 0xf9, 0x77, 0xb8, - 0x97, 0x57, 0xdf, 0x35, 0x9d, 0xe5, 0x55, 0x06, 0x48, 0x96, 0x84, 0xf3, - 0x7d, 0xd9, 0x8a, 0x9b, 0xfb, 0x38, 0x0b, 0xba, 0x49, 0xa1, 0xc9, 0x9d, - 0x11, 0xd2, 0x8b, 0x1a, 0x10, 0xe8, 0x62, 0xd6, 0xfd, 0xf8, 0x5c, 0xe4, - 0x0f, 0xa0, 0xb7, 0xda, 0xc0, 0xc0, 0xa2, 0xb3, 0x8e, 0xc0, 0xa7, 0x4c, - 0x12, 0x92, 0x48, 0x74, 0xb9, 0xdb, 0x44, 0xa9, 0xf1, 0xc3, 0xb5, 0xbc, - 0xf0, 0x8b, 0xb7, 0x87, 0x58, 0x9c, 0x37, 0xe1, 0x6f, 0x27, 0x59, 0xa5, - 0x4b, 0x32, 0x81, 0x1b, 0x1b, 0x3e, 0x25, 0xa2, 0xd2, 0xa1, 0x22, 0xe0, - 0xa1, 0x26, 0xba, 0x2b, 0x75, 0xd5, 0x62, 0x7f, 0xd4, 0x70, 0xa5, 0xcc, - 0x77, 0x25, 0x42, 0x13, 0x97, 0x18, 0xbb, 0xed, 0x1a, 0xb7, 0xce, 0xd0, - 0x3d, 0x17, 0xfa, 0x20, 0xe3, 0xaf, 0x3c, 0x1c, 0xd3, 0x85, 0x70, 0x11, - 0x55, 0x5d, 0xbb, 0x3f, 0x7d, 0xde, 0x8a, 0x9b, 0xfc, 0x3f, 0x15, 0xba, - 0x57, 0xbf, 0xc6, 0x9d, 0x1e, 0xdd, 0x8c, 0x1a, 0x10, 0xe8, 0x62, 0xd6, - 0xfd, 0xf8, 0x5c, 0xe4, 0x0f, 0xa0, 0xb7, 0xda, 0xc0, 0xc0, 0xa2, 0xb3, - 0xb3, 0x79, 0x0a, 0x20, 0xdb, 0xc3, 0xd8, 0x83, 0x1d, 0x9f, 0x67, 0x05, - 0x4b, 0x78, 0x58, 0x34, 0xf0, 0x9a, 0xb7, 0xf0, 0x58, 0x9c, 0x37, 0xe1, - 0x6f, 0x27, 0x59, 0xa5, 0x4b, 0x32, 0x81, 0x1b, 0x1b, 0x3e, 0x25, 0xa2, - 0xd2, 0xa1, 0x22, 0xe0, 0xa1, 0x26, 0xba, 0x2b, 0x75, 0xd5, 0x62, 0x7f, - 0xd3, 0x73, 0x3d, 0x6b, 0x76, 0x86, 0x91, 0x93, 0xda, 0xe7, 0x51, 0x09, - 0x0e, 0x31, 0xc7, 0xd9, 0x3d, 0x17, 0xfa, 0x20, 0xe3, 0xaf, 0x3c, 0x1c, - 0xd3, 0xe3, 0x70, 0x11, 0x55, 0x5d, 0xbb, 0x3f, 0xe2, 0x2c, 0x07, 0xcf, - 0x95, 0x7d, 0x01, 0xe7, 0x54, 0x1a, 0xc0, 0xb0, 0x28, 0xc4, 0x4c, 0xba, - 0xd7, 0x09, 0x8d, 0xce, 0x4d, 0xf4, 0x21, 0x50, 0x48, 0xfc, 0x27, 0x11, - 0x38, 0x11, 0x2b, 0xd5, 0xbe, 0x60, 0xce, 0x67, 0x00, 0xbe, 0x54, 0x92, - 0x21, 0xb5, 0x3d, 0xbd, 0x24, 0x84, 0x20, 0xf2, 0xcc, 0xf5, 0xda, 0x19, - 0x80, 0xfa, 0x92, 0x38, 0x5e, 0xf8, 0x6f, 0x54, 0x9b, 0x23, 0xf8, 0x2f, - 0x1b, 0x3e, 0x25, 0xa7, 0xd2, 0xa1, 0x22, 0xe2, 0xa1, 0x26, 0xba, 0xab, - 0x75, 0xf5, 0x60, 0x7f, 0xa3, 0x31, 0xc2, 0xb2, 0x3d, 0x7a, 0x00, 0x50, - 0xce, 0xeb, 0xe6, 0xef, 0x15, 0xc7, 0x31, 0x47, 0xcb, 0x87, 0x13, 0x26, - 0x14, 0x90, 0x27, 0x50, 0x75, 0x78, 0xee, 0x66, 0x65, 0xa2, 0xb5, 0xc7, - 0x8a, 0xcf, 0x6f, 0x75, 0x91, 0x9f, 0xd2, 0xa2, 0xe3, 0xad, 0xf8, 0x3e, - 0x11, 0xfd, 0x1e, 0xf3, 0x35, 0x42, 0x30, 0x68, 0x51, 0x30, 0x75, 0x6f, - 0xfa, 0xa8, 0x20, 0x7d, 0x0f, 0x2c, 0xed, 0xe9, 0x62, 0x7a, 0x2e, 0x0c, - 0x6a, 0x67, 0xe9, 0xd2, 0xcf, 0x44, 0xfe, 0xfa, 0x75, 0xbd, 0xcb, 0xeb, - 0xa4, 0xce, 0x4c, 0x12, 0x85, 0x56, 0xe9, 0x4d, 0xc6, 0x42, 0xb3, 0xbb, - 0x34, 0x22, 0x4a, 0x91, 0xcd, 0xc4, 0x64, 0x56, 0x88, 0x7b, 0x36, 0xef, - 0x64, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0xb8, 0x91, 0xb3, 0x7f, 0xa2, 0x41, - 0x1f, 0x1a, 0x83, 0x61, 0x5d, 0x4d, 0x5c, 0x8e, 0x25, 0x3b, 0x48, 0xb4, - 0x79, 0x9d, 0x12, 0x60, 0x67, 0x08, 0x40, 0xf2, 0x84, 0xa1, 0x82, 0x22, - 0x28, 0xd7, 0xbd, 0x01, 0x78, 0x76, 0xdd, 0xa6, 0xf1, 0x62, 0x4d, 0x48, - 0x68, 0x78, 0x38, 0x03, 0x44, 0xd8, 0x12, 0xda, 0x7f, 0x2b, 0x91, 0xba, - 0xe5, 0xb4, 0xed, 0xe3, 0x24, 0xc3, 0xca, 0x51, 0x49, 0x95, 0xf4, 0xa8, - 0xc9, 0xe6, 0x7c, 0x69, 0x9d, 0xda, 0xc0, 0xa4, 0xf0, 0xbf, 0xf4, 0xbf, - 0xf0, 0xb5, 0xc5, 0xba, 0x00, 0xb5, 0x04, 0x3b, 0x50, 0x72, 0x96, 0xbf, - 0x71, 0x7a, 0x45, 0xcd, 0x72, 0x7f, 0x40, 0x03, 0xdf, 0xd6, 0x62, 0x5a, - 0x81, 0x72, 0x35, 0xe9, 0x64, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0x98, 0x90, - 0xb3, 0x7f, 0xa2, 0x41, 0x1f, 0x1a, 0x83, 0x61, 0x5d, 0x4d, 0x5c, 0x8e, - 0x25, 0x3b, 0x48, 0xb4, 0xfa, 0x7e, 0x37, 0x7f, 0x43, 0xa3, 0x67, 0x7a, - 0x24, 0xec, 0x2c, 0xc0, 0xae, 0xe2, 0x76, 0x99, 0x7a, 0x71, 0xdd, 0xa6, - 0xf1, 0x62, 0x53, 0x42, 0x68, 0x78, 0x37, 0x06, 0x44, 0xd8, 0x15, 0xd8, - 0x2c, 0x2a, 0xb5, 0x65, 0x49, 0x0e, 0xcc, 0x2d, 0x59, 0xfa, 0xb4, 0xd6, - 0xdf, 0x58, 0xe0, 0x94, 0x87, 0xf0, 0x2a, 0x0f, 0x93, 0x4b, 0x91, 0x59, - 0xbb, 0xe7, 0xae, 0xd7, 0x50, 0x12, 0x99, 0xb6, 0x38, 0x77, 0xa6, 0x5b, - 0x65, 0x14, 0xb2, 0xc4, 0x50, 0x52, 0x22, 0x06, 0x3d, 0xb3, 0x27, 0xdb, - 0xc1, 0xc8, 0x62, 0x5a, 0x8e, 0x7d, 0x35, 0xe9, 0x64, 0xd8, 0x11, 0xce, - 0xbe, 0xe6, 0x98, 0x90, 0xd4, 0x70, 0xa5, 0xcc, 0x99, 0xcb, 0x42, 0x13, - 0x97, 0x3a, 0xbb, 0xed, 0x1a, 0xb7, 0xce, 0xd0, 0x2c, 0x55, 0xb8, 0x72, - 0x7d, 0x86, 0x3c, 0x00, 0xb7, 0xe8, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, - 0x7a, 0x71, 0xdd, 0xa6, 0xf6, 0x65, 0x4d, 0x42, 0x76, 0x66, 0x38, 0x06, - 0x4b, 0xd7, 0x12, 0xd8, 0x2c, 0x2a, 0xb5, 0x65, 0x49, 0x0e, 0xcc, 0x2d, - 0x59, 0xfa, 0xb4, 0xd6, 0xdf, 0x58, 0xe0, 0x94, 0x02, 0xe0, 0x84, 0x1b, - 0x27, 0x0e, 0x95, 0x21, 0x1a, 0x0a, 0x1b, 0xe9, 0x6d, 0xab, 0xe7, 0x51, - 0x14, 0x08, 0xfd, 0x67, 0x63, 0xfc, 0x7d, 0xc1, 0x88, 0xbd, 0x63, 0x1b, - 0xd5, 0x4d, 0x60, 0x44, 0xdf, 0xd6, 0x6d, 0x5a, 0x81, 0x72, 0x32, 0xe9, - 0x64, 0xd8, 0x11, 0x4e, 0xbe, 0xe6, 0x98, 0x90, 0xd3, 0x73, 0x3d, 0x6b, - 0x98, 0x68, 0x91, 0x93, 0xda, 0xc5, 0x51, 0x09, 0x0e, 0x31, 0xc7, 0xd9, - 0x87, 0x10, 0x5d, 0xe6, 0x36, 0xd5, 0x35, 0x99, 0xb9, 0x71, 0xe6, 0x8e, - 0x1c, 0x33, 0xc3, 0x8b, 0xc5, 0x37, 0xda, 0xf3, 0x71, 0x7e, 0xf5, 0x44, - 0x4a, 0x18, 0x5f, 0x3d, 0xaa, 0x18, 0x4b, 0xb5, 0x2c, 0x2a, 0xb5, 0xe5, - 0x49, 0x0e, 0xcc, 0x2d, 0x59, 0xfa, 0xb4, 0xd6, 0xdf, 0x58, 0xe0, 0x94, - 0xfb, 0x05, 0xd5, 0x7b, 0xab, 0x98, 0x3d, 0xfc, 0x43, 0x5e, 0xbf, 0x7c, - 0x46, 0xfd, 0xb1, 0x28, 0xfd, 0x75, 0x16, 0xfb, 0x70, 0x36, 0x69, 0x74, - 0x95, 0xb5, 0x61, 0x61, 0x37, 0xd3, 0x56, 0x79, 0x6a, 0xcc, 0x2a, 0x54, - 0xd4, 0x02, 0xe2, 0xde, 0x9e, 0x57, 0x0c, 0x26, 0xb6, 0xed, 0xb6, 0x56, - 0xdb, 0x9b, 0xca, 0x53, 0x68, 0xf6, 0xea, 0x38, 0xe4, 0x7e, 0x98, 0x0b, - 0xca, 0x6f, 0x74, 0xa1, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x27, 0x49, 0xc0, - 0x7b, 0xcd, 0x98, 0x7f, 0xd7, 0x97, 0xff, 0xce, 0x59, 0x53, 0x41, 0x7e, - 0x8a, 0xaf, 0x6e, 0x97, 0xdb, 0xf7, 0xcc, 0x1e, 0x38, 0x68, 0x8f, 0xb1, - 0x7f, 0x2b, 0x91, 0xba, 0xe5, 0xb4, 0xcd, 0xe2, 0x24, 0xc3, 0xca, 0x51, - 0x49, 0x95, 0xf4, 0xa8, 0x5e, 0x26, 0x0c, 0x5e, 0xec, 0x54, 0xa6, 0x82, - 0x66, 0xad, 0x8c, 0xa7, 0x3a, 0x3a, 0xc8, 0xa0, 0x9e, 0xca, 0x0a, 0x92, - 0x14, 0xe7, 0x0a, 0x75, 0x47, 0x5c, 0xe7, 0xb3, 0x70, 0xa3, 0x34, 0x5c, - 0xc1, 0xc8, 0x60, 0x5f, 0x8e, 0x7d, 0x34, 0xeb, 0x64, 0xd8, 0x11, 0xce, - 0xbe, 0xe6, 0x98, 0x90, 0xb3, 0x7f, 0xa2, 0x41, 0x1f, 0x1a, 0x83, 0x61, - 0x5d, 0x4d, 0x5c, 0x8e, 0x25, 0x3b, 0x48, 0xb4, 0x1d, 0xe6, 0x64, 0x80, - 0xa3, 0x94, 0xf5, 0x68, 0xfe, 0xaa, 0xd3, 0x85, 0xf5, 0x3d, 0x64, 0xf5, - 0x1f, 0xec, 0x50, 0x05, 0x7a, 0x60, 0xcf, 0x33, 0x77, 0x94, 0xbd, 0x42, - 0x88, 0xe3, 0xe4, 0x25, 0x7f, 0x2b, 0x91, 0xba, 0xc7, 0xb4, 0xed, 0xe3, - 0x24, 0xc3, 0xca, 0x51, 0x49, 0x95, 0xf4, 0xa8, 0x9a, 0x2b, 0xd1, 0x37, - 0x92, 0x0d, 0x4e, 0x96, 0xaa, 0x1e, 0xff, 0x42, 0xfc, 0xd9, 0xb1, 0xf5, - 0x66, 0xe2, 0x35, 0x00, 0xc7, 0xfc, 0xc2, 0x90, 0x7b, 0x50, 0x6a, 0x57, - 0xfd, 0x49, 0x04, 0x6d, 0xdd, 0xd4, 0x62, 0x5a, 0x80, 0x73, 0x35, 0xe9, - 0x64, 0xd8, 0x11, 0xce, 0x9c, 0xe6, 0x98, 0x90, 0x4f, 0x25, 0xef, 0x63, - 0xd0, 0x12, 0xc8, 0x43, 0x6e, 0xef, 0x30, 0xf8, 0xe8, 0x1f, 0xa1, 0x81, - 0x89, 0x3b, 0x57, 0x22, 0x7a, 0x61, 0x99, 0xa6, 0x08, 0xaf, 0x9e, 0x26, - 0x5b, 0xd7, 0x1e, 0x4f, 0x1f, 0xeb, 0x50, 0x05, 0x7d, 0x67, 0xcf, 0x39, - 0x69, 0x8a, 0xbd, 0x47, 0x87, 0xec, 0xe4, 0x27, 0x7f, 0x2b, 0x91, 0xba, - 0xc7, 0xb4, 0xed, 0xe3, 0x24, 0xc3, 0xca, 0x51, 0x49, 0x95, 0xf4, 0xa8, - 0xc8, 0x83, 0x8b, 0x91, 0x66, 0x3a, 0xa9, 0xab, 0xe9, 0x07, 0x85, 0x2d, - 0xae, 0x62, 0xc2, 0xff, 0xd4, 0x78, 0x62, 0xf3, 0x66, 0xdb, 0x38, 0xf8, - 0x03, 0x6e, 0x8c, 0x1b, 0x7c, 0x07, 0xc0, 0x74, 0xdf, 0xd6, 0x62, 0x5f, - 0x81, 0x72, 0x35, 0xeb, 0x64, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0x98, 0x90, - 0xbe, 0xfd, 0xab, 0x46, 0x2c, 0x0f, 0x1b, 0x68, 0x76, 0x7d, 0x05, 0x77, - 0x79, 0xbb, 0x78, 0x79, 0x2c, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x18, - 0xb7, 0x8e, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, 0x0f, 0x92, 0xf2, 0x39, - 0x38, 0x90, 0x29, 0x2b, 0x29, 0xda, 0x72, 0x37, 0xd8, 0xdc, 0x35, 0x42, - 0x1e, 0xb1, 0x25, 0xb0, 0x98, 0x1b, 0xd2, 0xb8, 0xb2, 0x75, 0x6e, 0x63, - 0xfc, 0x69, 0xc8, 0x05, 0x3f, 0xcc, 0xbe, 0x90, 0xd2, 0xfc, 0xe7, 0x43, - 0xd1, 0x77, 0xc8, 0x93, 0x44, 0xaf, 0x7b, 0x67, 0xe5, 0xf8, 0xe7, 0xd1, - 0x76, 0xfa, 0xb1, 0xd6, 0xf9, 0x2a, 0x42, 0x7f, 0x50, 0xa9, 0x04, 0xe0, - 0xdf, 0xd6, 0x62, 0x5a, 0x81, 0x72, 0x35, 0xe9, 0x64, 0xd8, 0x11, 0x4e, - 0x9c, 0xe6, 0x98, 0x90, 0x1d, 0x46, 0x11, 0x30, 0xe4, 0x11, 0x89, 0x57, - 0x91, 0x87, 0xc7, 0x8b, 0xf0, 0xb9, 0x07, 0xea, 0x17, 0xcd, 0x48, 0xad, - 0x89, 0x0a, 0x41, 0xfa, 0xb4, 0x81, 0x8d, 0xa4, 0xe7, 0x8a, 0x57, 0xdd, - 0x8a, 0xcf, 0x6f, 0x75, 0x96, 0x98, 0xd2, 0xa8, 0xfd, 0xb3, 0xf8, 0x3b, - 0x1e, 0xf2, 0x1e, 0xf1, 0x1d, 0x92, 0xa6, 0x99, 0xac, 0xa3, 0xac, 0xc4, - 0xf6, 0x4d, 0xdc, 0xca, 0xf0, 0x83, 0x55, 0x02, 0x62, 0x7a, 0x2e, 0x0c, - 0x6a, 0x67, 0xe9, 0xd2, 0xcf, 0x44, 0xfe, 0xfa, 0x75, 0xbd, 0xcb, 0xe3, - 0xf1, 0x30, 0x12, 0xeb, 0xc6, 0xbf, 0x39, 0xbe, 0xd5, 0x08, 0xc2, 0xdd, - 0xfe, 0x07, 0xbb, 0x0c, 0xcd, 0xc4, 0x64, 0x56, 0x88, 0x7b, 0x36, 0xef, - 0x02, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0xb8, 0x91, 0x77, 0x32, 0xa2, 0x89, - 0x1a, 0x56, 0x5f, 0x24, 0x28, 0xdd, 0x70, 0x01, 0xe9, 0x9f, 0x70, 0x15, - 0x9b, 0x97, 0x22, 0x7e, 0xa7, 0xbd, 0xd1, 0x05, 0x3f, 0x70, 0xb0, 0xd1, - 0x7b, 0x7a, 0x23, 0xe4, 0x97, 0x09, 0xbc, 0x18, 0xe1, 0xc8, 0x08, 0xad, - 0xd8, 0xe1, 0xde, 0xce, 0xc4, 0x86, 0x01, 0x19, 0xe1, 0x8c, 0x9b, 0xd1, - 0x41, 0xc2, 0x15, 0x44, 0x64, 0x04, 0x8f, 0x6b, 0x7d, 0xb8, 0x98, 0x80, - 0x6f, 0x49, 0xff, 0x21, 0x98, 0xf7, 0x02, 0x02, 0xd1, 0xcc, 0xd6, 0xd2, - 0x38, 0xfa, 0x32, 0xc3, 0x53, 0xde, 0xfd, 0xe9, 0xe4, 0x2f, 0x8a, 0x25, - 0xda, 0x27, 0xa3, 0x9a, 0xdb, 0x9a, 0x04, 0x26, 0xc1, 0xc8, 0x62, 0x5a, - 0x8e, 0x7d, 0x35, 0xe9, 0x02, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0x98, 0x90, - 0x77, 0x32, 0xa2, 0x89, 0x1a, 0x56, 0x5f, 0x24, 0x28, 0xdd, 0x70, 0x01, - 0xe9, 0x9f, 0x70, 0x15, 0x2c, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x18, - 0xb7, 0xf9, 0x5d, 0x3f, 0x0f, 0xbc, 0xc6, 0x12, 0x95, 0x0e, 0xbf, 0x1f, - 0xe1, 0xc8, 0x0c, 0xa7, 0xd8, 0xe1, 0xdc, 0xcb, 0xc4, 0x86, 0x00, 0x1b, - 0xe1, 0x8c, 0x9b, 0xd1, 0x41, 0xc2, 0x15, 0x44, 0x64, 0x04, 0x8f, 0x6b, - 0x7d, 0xb8, 0x98, 0x80, 0x87, 0xf0, 0x2a, 0x0f, 0x93, 0x4b, 0x91, 0x59, - 0xbb, 0xe7, 0xae, 0xd7, 0x50, 0x12, 0x99, 0xae, 0x53, 0xcf, 0xfd, 0x9e, - 0xe4, 0x2f, 0x8a, 0x25, 0xda, 0x20, 0xa3, 0x9a, 0xdb, 0x9a, 0x04, 0x26, - 0xc1, 0xc8, 0x62, 0x5a, 0x8e, 0x7d, 0x35, 0xe9, 0x02, 0xd8, 0x11, 0xce, - 0xbe, 0xe6, 0x98, 0x90, 0x73, 0xda, 0x77, 0x17, 0x7b, 0x67, 0x1a, 0x1d, - 0x45, 0x28, 0x0f, 0xa7, 0xa3, 0x3c, 0xcd, 0x78, 0xcb, 0x87, 0x13, 0x26, - 0x14, 0x90, 0x27, 0x40, 0x75, 0x1e, 0xee, 0x66, 0x65, 0xa2, 0xb5, 0xc7, - 0x95, 0x0e, 0xbf, 0x1f, 0xe1, 0xc8, 0x0c, 0xad, 0xd8, 0xe1, 0xdc, 0xce, - 0xc4, 0x86, 0x00, 0x19, 0xe1, 0x8c, 0x9b, 0xd1, 0x41, 0xc2, 0x15, 0x44, - 0x64, 0x04, 0x8f, 0x6b, 0x7d, 0xb8, 0x98, 0x80, 0xfb, 0x05, 0xd5, 0x7b, - 0xab, 0x98, 0x3d, 0xfc, 0x43, 0x5e, 0xbf, 0x7c, 0x46, 0xfd, 0xb1, 0x30, - 0x87, 0xef, 0x1e, 0xa5, 0xc3, 0xf1, 0x30, 0x56, 0x7a, 0xf4, 0x79, 0xfc, - 0x85, 0xb8, 0x61, 0x0f, 0xc1, 0xc8, 0x62, 0x5a, 0x8e, 0x7d, 0x35, 0xe9, - 0x02, 0xd8, 0x11, 0x4e, 0xbe, 0xe6, 0x98, 0x90, 0xd3, 0x73, 0x3d, 0x6b, - 0x98, 0x68, 0x91, 0x93, 0xda, 0xc5, 0x51, 0x09, 0x0e, 0x31, 0xc7, 0xd9, - 0x23, 0xce, 0xc0, 0xd8, 0x63, 0x91, 0x64, 0x56, 0x41, 0x9c, 0xd0, 0x7e, - 0x67, 0xef, 0xbb, 0x7f, 0x2b, 0xb4, 0x73, 0x5b, 0x7f, 0x9f, 0xc5, 0x42, - 0x7c, 0x69, 0xcd, 0x62, 0x16, 0x5e, 0x2a, 0xda, 0x4a, 0x2a, 0xb5, 0xe5, - 0x49, 0x0e, 0xce, 0x2d, 0x59, 0xfa, 0xb4, 0xd6, 0xdf, 0x58, 0xe0, 0x94, - 0x66, 0xc0, 0xc8, 0x67, 0x3e, 0x79, 0x0f, 0xc0, 0xc2, 0x6d, 0x7b, 0x82, - 0x17, 0x15, 0xe7, 0x83, 0x79, 0xf5, 0x13, 0xad, 0xbd, 0x4b, 0xf9, 0x96, - 0x17, 0xaa, 0xba, 0xc0, 0x1d, 0xc6, 0x71, 0x80, 0x00, 0x42, 0xa1, 0x7f, - 0xb0, 0xff, 0x25, 0x38, 0x23, 0x92, 0x73, 0x98, 0xbc, 0x71, 0x13, 0x6e, - 0x9b, 0xb3, 0xd7, 0x06, 0x44, 0x23, 0x5d, 0x49, 0xa5, 0xfc, 0xce, 0x6a, - 0x89, 0x93, 0xda, 0x24, 0x66, 0x88, 0x0c, 0x14, 0xab, 0xf4, 0xde, 0x2c, - 0xb7, 0xf5, 0xc6, 0xe0, 0x1c, 0xcc, 0x82, 0x75, 0x11, 0xb6, 0xd2, 0x18, - 0x48, 0xa8, 0x9f, 0x71, 0xed, 0x64, 0x13, 0x9b, 0x6c, 0x35, 0x35, 0x2d, - 0x2a, 0xe1, 0x9b, 0xf5, 0x9b, 0xd6, 0x6b, 0x8f, 0xdb, 0x49, 0x92, 0xd0, - 0x9c, 0x7b, 0xd6, 0x16, 0x06, 0xf8, 0x90, 0xe1, 0x04, 0x37, 0x60, 0x80, - 0x7a, 0x8e, 0xb9, 0x2c, 0x1d, 0x43, 0x5a, 0xea, 0xd1, 0x6d, 0x46, 0x60, - 0x55, 0x9b, 0x5e, 0x7a, 0x0d, 0x2e, 0x41, 0xbb, 0xa6, 0x55, 0xbf, 0x08, - 0xcb, 0x5a, 0x06, 0x5b, 0xb5, 0x46, 0x04, 0xeb, 0x58, 0x15, 0x09, 0x3b, - 0x78, 0xc3, 0x29, 0xaf, 0x26, 0x3a, 0x23, 0x6f, 0x81, 0x10, 0x7e, 0x00, - 0xeb, 0x2b, 0xa0, 0x11, 0xe3, 0xdb, 0xf6, 0xf5, 0x13, 0xf3, 0x60, 0xfa, - 0x08, 0xff, 0x52, 0xb5, 0xfc, 0x3f, 0x60, 0x13, 0xcc, 0x81, 0x79, 0x92, - 0x08, 0xc1, 0x68, 0x34, 0x79, 0x24, 0x42, 0x1f, 0x82, 0x33, 0x9c, 0x6f, - 0xa8, 0x8e, 0x39, 0x25, 0x0a, 0x2d, 0x24, 0x7e, 0xc4, 0x97, 0xb1, 0x96, - 0x93, 0x48, 0xa2, 0x04, 0x05, 0xc2, 0x83, 0xfd, 0xb5, 0x3c, 0x3a, 0x70, - 0xd0, 0xd5, 0x28, 0x31, 0xf3, 0x5c, 0x0e, 0x24, 0x74, 0xd5, 0x13, 0xf7, - 0x4e, 0xff, 0xc2, 0x13, 0x70, 0xb0, 0x96, 0xdd, 0x54, 0xf1, 0x5c, 0x2a, - 0x52, 0x1f, 0x5e, 0x95, 0x11, 0x79, 0xa9, 0xdd, 0x54, 0x1d, 0x5a, 0xa3, - 0x21, 0x8d, 0x5e, 0x5e, 0xff, 0xec, 0x49, 0x49, 0x9f, 0xae, 0xae, 0xae, - 0x2a, 0x92, 0x43, 0xf6, 0xfb, 0xd5, 0x15, 0x2d, 0x53, 0xfe, 0x7b, 0x90, - 0xe1, 0x03, 0xcc, 0xb9, 0xb3, 0x71, 0xbd, 0x35, 0xad, 0x08, 0xad, 0xb8, - 0x9e, 0x7e, 0x8f, 0x03, 0xe6, 0x6d, 0x2b, 0xd2, 0xfd, 0x7b, 0x24, 0x70, - 0x79, 0x7e, 0x45, 0x3a, 0x8a, 0x8c, 0x39, 0x09, 0x02, 0x96, 0xf1, 0xa2, - 0xa3, 0x44, 0x66, 0xc6, 0x9e, 0xaa, 0x0e, 0x3a, 0x10, 0xe1, 0x4d, 0x06, - 0xd6, 0x67, 0xb4, 0x25, 0xb2, 0x42, 0xd0, 0xde, 0xdd, 0x24, 0x54, 0xdb, - 0x88, 0x5c, 0xbe, 0xea, 0x86, 0xd0, 0x39, 0xd2, 0x80, 0xe5, 0xf2, 0x4c, - 0x8f, 0xc7, 0x57, 0xe8, 0x55, 0x04, 0xe6, 0x2c, 0xb4, 0xec, 0xd8, 0x4c, - 0x64, 0x33, 0xb9, 0x7d, 0x3f, 0x2c, 0x23, 0x77, 0xff, 0x3b, 0xc8, 0xb4, - 0xe2, 0x27, 0x0b, 0x87, 0x55, 0x5e, 0xaa, 0x42, 0x47, 0xaa, 0x02, 0x2b, - 0x62, 0x77, 0xa4, 0x6e, 0x1f, 0x15, 0x10, 0x76, 0xda, 0xa8, 0x2b, 0xb1, - 0x34, 0xfa, 0xa1, 0x98, 0x5f, 0xf7, 0xb7, 0x57, 0x14, 0xba, 0x68, 0x16, - 0x88, 0x48, 0x64, 0xee, 0xdf, 0x3a, 0x95, 0xc1, 0x4a, 0x73, 0xd1, 0x27, - 0xd5, 0xda, 0xfc, 0xb2, 0xa0, 0xd2, 0x01, 0x56, 0x82, 0x49, 0x15, 0xea, - 0x15, 0xca, 0x71, 0x98, 0x44, 0x61, 0xb0, 0x9b, 0xde, 0xcd, 0x66, 0x43, - 0xc7, 0x96, 0xfe, 0x05, 0xc1, 0x03, 0x2f, 0x01, 0x61, 0x21, 0xc9, 0xa0, - 0x48, 0x51, 0xb1, 0x5c, 0xae, 0xe0, 0xd2, 0xdd, 0x56, 0x52, 0x3f, 0xb8, - 0xba, 0x41, 0x4f, 0xa2, 0xd3, 0x3f, 0x97, 0xc7, 0x2a, 0xf2, 0x33, 0xfb, - 0x3b, 0x9d, 0x73, 0x13, 0x56, 0x0e, 0x21, 0x8b, 0x07, 0x29, 0x12, 0x19, - 0x16, 0xd3, 0xad, 0x8c, 0xff, 0x65, 0x3e, 0x0a, 0xcd, 0x3f, 0xa6, 0x78, - 0xe8, 0x72, 0xd2, 0x10, 0x77, 0xec, 0xf4, 0x6c, 0x6c, 0xc7, 0x8b, 0x2b, - 0xd0, 0xcd, 0x61, 0x25, 0x0d, 0xe0, 0x64, 0xf8, 0x0e, 0xbd, 0x5f, 0xe5, - 0x3e, 0xd2, 0xa1, 0xef, 0x2f, 0x74, 0x84, 0xa8, 0x5d, 0xdb, 0xb1, 0x04, - 0x7d, 0x08, 0x09, 0x41, 0x19, 0xb5, 0x2a, 0x28, 0x97, 0xf9, 0x95, 0xac, - 0x99, 0x07, 0x25, 0x16, 0xc1, 0x6b, 0x10, 0xa4, 0xb2, 0xe5, 0x38, 0x8e, - 0xa8, 0x80, 0xae, 0x10, 0x28, 0xee, 0x36, 0xaf, 0x46, 0xac, 0xab, 0x16, - 0x5e, 0x38, 0x29, 0x85, 0xb1, 0x85, 0x79, 0x86, 0xf6, 0x25, 0x1b, 0x6f, - 0xdd, 0x69, 0x05, 0x66, 0xb9, 0xb8, 0x92, 0x96, 0xe8, 0x38, 0x34, 0xcb, - 0x37, 0x66, 0xa2, 0x87, 0xcb, 0x19, 0x5a, 0x97, 0x33, 0xc1, 0x1e, 0xd3, - 0xb7, 0x96, 0x88, 0x16, 0x69, 0xd2, 0x7a, 0x83, 0x72, 0x99, 0x1d, 0xc0, - 0x8c, 0xfa, 0xd7, 0x5f, 0xa6, 0x3f, 0xbd, 0x0b, 0x93, 0x36, 0x4f, 0x6a, - 0x71, 0x13, 0x5f, 0x2c, 0x3a, 0x04, 0x56, 0xc5, 0xf6, 0xd2, 0xaa, 0xa5, - 0xbf, 0x15, 0xd3, 0xf8, 0x93, 0x1f, 0xc0, 0x97, 0x11, 0x5e, 0x8d, 0xa3, - 0xe0, 0x97, 0x5e, 0x85, 0x27, 0x92, 0xa8, 0xe1, 0x9a, 0x19, 0x5f, 0xc3, - 0x3a, 0xe4, 0xca, 0x31, 0xfc, 0x27, 0x0b, 0x85, 0x5a, 0x5e, 0xaa, 0x43, - 0x40, 0xaa, 0x02, 0x2b, 0x62, 0x70, 0xa0, 0x6e, 0xcc, 0x61, 0x73, 0x7f, - 0x0d, 0x93, 0x33, 0x16, 0x02, 0x88, 0x3c, 0x59, 0x70, 0x33, 0x79, 0xd7, - 0x81, 0x6f, 0xc4, 0x41, 0x2a, 0x25, 0x8f, 0x8a, 0xfe, 0x6a, 0xa1, 0x18, - 0xcc, 0xb9, 0xdf, 0x4d, 0x99, 0x68, 0x74, 0x6b, 0x63, 0xa9, 0xe1, 0x96, - 0x16, 0x7d, 0xab, 0x54, 0xd2, 0x84, 0xc8, 0xb4, 0xf3, 0x3b, 0xdd, 0x4b, - 0x2d, 0x95, 0x90, 0x28, 0x2e, 0x09, 0x62, 0xa7, 0x53, 0x18, 0x66, 0x3e, - 0xf3, 0xc9, 0xa8, 0x65, 0xb8, 0xc8, 0x5e, 0xc7, 0xbf, 0x03, 0xed, 0x32, - 0xdd, 0x1a, 0xdf, 0xd6, 0x03, 0xa8, 0xbe, 0x87, 0x81, 0x8e, 0x89, 0x2d, - 0x88, 0x81, 0x9f, 0xf7, 0x60, 0x29, 0x49, 0x31, 0x57, 0xea, 0x2a, 0x2a, - 0x13, 0xe6, 0xb5, 0xef, 0x72, 0x87, 0xee, 0x39, 0x76, 0x0d, 0xd7, 0xf8, - 0x0a, 0x28, 0x24, 0x7e, 0xc4, 0x95, 0xb1, 0x96, 0x93, 0x48, 0xa2, 0x04, - 0x05, 0xc2, 0x83, 0xfd, 0x71, 0x57, 0x19, 0xab, 0x8e, 0x84, 0xc5, 0x70, - 0xe8, 0xb7, 0x33, 0x98, 0x89, 0x17, 0x0e, 0xa3, 0x68, 0x20, 0x7a, 0xbf, - 0xc9, 0x05, 0x5f, 0x72, 0x85, 0x95, 0x32, 0xe5, 0xab, 0x4c, 0xc2, 0xbb, - 0x84, 0xf6, 0xae, 0xeb, 0x49, 0x12, 0xb9, 0x29, 0xdd, 0x6c, 0xea, 0x2a, - 0x53, 0x66, 0x4c, 0x52, 0x8f, 0xae, 0xbe, 0xbe, 0x2a, 0x92, 0x53, 0xe6, - 0xfb, 0xd5, 0x15, 0x2d, 0x53, 0xfe, 0x7b, 0x90, 0x46, 0x82, 0xbe, 0x6d, - 0xdf, 0x0a, 0x79, 0xcf, 0xf1, 0x6e, 0xc6, 0x62, 0x4d, 0xe7, 0xd7, 0x17, - 0x36, 0xb0, 0x43, 0x53, 0x64, 0x81, 0x47, 0x89, 0xff, 0xc4, 0x94, 0x6f, - 0xa6, 0x23, 0xf5, 0x13, 0xbc, 0x3c, 0x47, 0x58, 0x20, 0xc1, 0x4b, 0x3e, - 0x01, 0x13, 0x0e, 0x90, 0x0e, 0x6a, 0x46, 0x3b, 0x41, 0xe6, 0x03, 0x80, - 0x1f, 0xc5, 0x0a, 0xcc, 0xa4, 0x4a, 0x33, 0xcb, 0x9f, 0xd9, 0x1d, 0xe9, - 0x86, 0xd0, 0x39, 0xc2, 0x80, 0xef, 0xf5, 0x4c, 0x8f, 0xc2, 0x49, 0xe8, - 0x55, 0x06, 0xe9, 0x2c, 0xda, 0x4e, 0x65, 0x5d, 0x8c, 0xbf, 0x5a, 0x23, - 0xbb, 0x2c, 0xa4, 0xb7, 0x69, 0x8a, 0xd2, 0xdf, 0xfd, 0x03, 0xb8, 0xbf, - 0x51, 0x66, 0x1f, 0x81, 0x1e, 0x57, 0x6c, 0x5c, 0x5a, 0x4b, 0x6d, 0x5c, - 0x20, 0x47, 0x68, 0x32, 0x69, 0x57, 0xc6, 0xfe, 0x45, 0xd2, 0x7d, 0xb5, - 0x72, 0xea, 0x1a, 0x97, 0x75, 0x2e, 0x51, 0x65, 0x8d, 0x2d, 0xc2, 0x0d, - 0x13, 0xf4, 0x69, 0xd9, 0x06, 0xad, 0x87, 0x42, 0xd1, 0x6d, 0x41, 0x67, - 0x55, 0x9b, 0x40, 0x64, 0x0d, 0x2e, 0x4e, 0xb4, 0xa6, 0x55, 0xbf, 0x08, - 0x25, 0xa1, 0xaa, 0x9d, 0xce, 0xae, 0x88, 0x75, 0xdf, 0xdd, 0x9e, 0x31, - 0xe6, 0xfc, 0xb9, 0x8d, 0x0b, 0x3a, 0xea, 0x95, 0x20, 0x66, 0xd4, 0x18, - 0xaf, 0x81, 0xc6, 0xce, 0x83, 0xad, 0x10, 0xae, 0x77, 0x63, 0x72, 0x81, - 0x8a, 0xcf, 0x8f, 0x64, 0x85, 0xcb, 0xa6, 0xc3, 0x1f, 0xcf, 0x2a, 0xeb, - 0xc1, 0x98, 0xa3, 0xa1, 0x2a, 0xda, 0x55, 0xd0, 0x3d, 0x06, 0xaf, 0x77, - 0x45, 0x07, 0x14, 0x71, 0x12, 0x69, 0x49, 0xc0, 0x6f, 0x35, 0x2c, 0x4a, - 0x84, 0x78, 0x3c, 0x5c, 0x0c, 0x43, 0x21, 0xcf, 0xbd, 0x98, 0x73, 0xbc, - 0xa9, 0xbc, 0x79, 0xda, 0x79, 0xb3, 0x75, 0x0c, 0x14, 0xe6, 0x2b, 0x59, - 0xe7, 0x13, 0x50, 0x9d, 0x2c, 0x9a, 0xd0, 0x81, 0xe5, 0x5d, 0x7d, 0xec, - 0x8c, 0x97, 0x7e, 0xc1, 0xc4, 0x1f, 0x84, 0x30, 0xed, 0x08, 0x80, 0x2e, - 0xc6, 0x70, 0x43, 0x5f, 0xdd, 0x3c, 0x81, 0x9a, 0xa8, 0x80, 0xb9, 0x11, - 0x28, 0xee, 0x21, 0xac, 0x46, 0xac, 0xab, 0x16, 0x5e, 0x38, 0x29, 0x85, - 0xb1, 0x85, 0x79, 0x86, 0xf6, 0x25, 0x1b, 0x6f, 0xdd, 0x69, 0x05, 0x66, - 0xb9, 0xb8, 0x92, 0x96, 0x91, 0x49, 0x4a, 0x8b, 0x25, 0xd8, 0x2d, 0xd2, - 0x65, 0x21, 0x58, 0x62, 0x7e, 0xe5, 0xe5, 0xd7, 0x43, 0x7d, 0x5a, 0xdd, - 0xb9, 0x1f, 0x5c, 0x47, 0x14, 0xf0, 0x8a, 0xaf, 0x12, 0x4f, 0xab, 0x49, - 0x9b, 0x28, 0x8a, 0xe9, 0x53, 0xe7, 0xbf, 0x75, 0x42, 0xf1, 0xc8, 0x69, - 0xd9, 0xa8, 0x6b, 0x06, 0x96, 0x9e, 0x9e, 0x57, 0x78, 0x69, 0x3e, 0x30, - 0x1a, 0x95, 0xd6, 0x26, 0x1b, 0x62, 0x21, 0x9e, 0x1a, 0x81, 0x51, 0xe7, - 0xab, 0xc9, 0x4c, 0x9f, 0x4d, 0x1b, 0xde, 0xf3, 0xc3, 0xba, 0xa2, 0xaa, - 0xfd, 0x06, 0xb8, 0xbd, 0x51, 0x64, 0x1f, 0x80, 0x1e, 0x5d, 0x6c, 0x58, - 0x5a, 0x4b, 0x6d, 0x5c, 0xa0, 0xb5, 0xc5, 0xd4, 0x4b, 0x2a, 0x84, 0x10, - 0xd2, 0x2f, 0xb8, 0xc9, 0x93, 0x2a, 0x80, 0xea, 0x5b, 0x22, 0x9b, 0x85, - 0x42, 0x45, 0x83, 0x6b, 0x00, 0x8e, 0x70, 0xf5, 0xf0, 0xb1, 0x2b, 0x2d, - 0x7f, 0xe8, 0x61, 0x52, 0x05, 0xac, 0xb2, 0x42, 0x31, 0x26, 0x6c, 0xd4, - 0x40, 0xc5, 0xca, 0x6e, 0xad, 0x91, 0x8e, 0x0a, 0xad, 0xb6, 0xbf, 0xda, - 0xfc, 0xc6, 0x37, 0x06, 0xe9, 0x49, 0x18, 0x47, 0x83, 0x40, 0x78, 0xf5, - 0xd7, 0x93, 0x5d, 0x12, 0xf0, 0x3d, 0x4b, 0x26, 0x61, 0x68, 0xcc, 0x15, - 0x43, 0xc3, 0x02, 0x8c, 0xc4, 0x95, 0x8e, 0xdb, 0x1b, 0x52, 0x6c, 0xdc, - 0xc5, 0x5f, 0x17, 0xbf, 0xd1, 0xf0, 0xe2, 0x96, 0x5e, 0x3f, 0x12, 0x85, - 0x62, 0xeb, 0x3d, 0x65, 0xa5, 0x73, 0x06, 0xd2, 0x7e, 0x0b, 0xfd, 0xbe, - 0x20, 0x2d, 0x25, 0xa3, 0x6b, 0x40, 0x8e, 0x08, 0xa9, 0x51, 0x81, 0x52, - 0x54, 0xb7, 0xcb, 0xc2, 0xb5, 0xe6, 0x5d, 0x68, 0xd5, 0x01, 0x10, 0xe0, - 0x5b, 0x31, 0x11, 0xd8, 0xe9, 0x75, 0x3c, 0x12, 0x85, 0x54, 0x35, 0x5d, - 0x20, 0x74, 0x89, 0xa4, 0x9d, 0x28, 0x04, 0x35, 0x82, 0x04, 0x1a, 0x2c, - 0x16, 0xf2, 0x71, 0x28, 0xbc, 0xcf, 0xad, 0x89, 0x98, 0x07, 0x54, 0x00, - 0xac, 0x70, 0x49, 0xe6, 0x19, 0x46, 0x04, 0xf9, 0xb9, 0x56, 0xf7, 0xc2, - 0xf8, 0xd8, 0x03, 0xea, 0xe1, 0x01, 0xcc, 0xb9, 0xb9, 0x71, 0xb7, 0x35, - 0xa8, 0x08, 0xa8, 0xb8, 0x9c, 0x7e, 0x8d, 0x03, 0x5e, 0x24, 0x11, 0x71, - 0x56, 0xa0, 0x36, 0xe9, 0x12, 0xaa, 0x4a, 0x84, 0xbf, 0xbd, 0xa8, 0x36, - 0x6f, 0x92, 0x4a, 0xa0, 0xd1, 0x95, 0xc6, 0x19, 0x2c, 0x13, 0x15, 0x5e, - 0xfd, 0xc7, 0xb1, 0x29, 0x5b, 0xb8, 0xb6, 0x09, 0x9f, 0x3d, 0xda, 0xf9, - 0x29, 0xe4, 0xc3, 0xdc, 0x7a, 0x48, 0x70, 0x7d, 0x86, 0xd0, 0x2e, 0xc1, - 0x80, 0xe5, 0xf2, 0x4c, 0x8f, 0xc7, 0x57, 0xe8, 0x55, 0x04, 0xe6, 0x2c, - 0x2b, 0xcc, 0x37, 0xec, 0x63, 0xf1, 0x35, 0x05, 0x22, 0x0d, 0x49, 0x1c, - 0xb5, 0x11, 0xd5, 0x3f, 0xfd, 0x03, 0xb8, 0xbf, 0x51, 0x66, 0x1f, 0x81, - 0x1e, 0x57, 0x6c, 0x5c, 0x5a, 0x4c, 0x69, 0x5c, 0x73, 0x11, 0xbe, 0xec, - 0x07, 0x20, 0x4f, 0xd7, 0x36, 0x2d, 0x35, 0x56, 0xe1, 0xc7, 0x44, 0x14, - 0x5b, 0x22, 0xec, 0xf2, 0x42, 0x45, 0x83, 0x6b, 0x00, 0x8e, 0x50, 0xf5, - 0xf0, 0xb1, 0x0b, 0x2d, 0x7f, 0xe8, 0x61, 0x52, 0x05, 0xac, 0xb2, 0x42, - 0x31, 0x26, 0x6c, 0xd4, 0x40, 0xc5, 0xca, 0x6e, 0x9d, 0x85, 0x83, 0x3d, - 0x59, 0x0a, 0x01, 0x29, 0xc8, 0x3d, 0xf0, 0x13, 0x43, 0x1d, 0x86, 0x29, - 0x26, 0x38, 0x23, 0x6e, 0x81, 0x1a, 0x7e, 0x04, 0xe1, 0x2c, 0xa4, 0x05, - 0xe3, 0xdb, 0xf6, 0xf5, 0xdf, 0xa8, 0x28, 0xc2, 0xe7, 0x73, 0x52, 0x5b, - 0x6a, 0xb1, 0x88, 0x01, 0x4a, 0x3e, 0x2d, 0x7d, 0x08, 0xc1, 0x6f, 0x33, - 0x79, 0x34, 0x52, 0x1f, 0x82, 0x33, 0x8c, 0x6f, 0xa8, 0x8e, 0x39, 0x25, - 0x0a, 0x2d, 0x24, 0x7e, 0xc4, 0x97, 0xb1, 0x96, 0x93, 0x48, 0xa2, 0x04, - 0x05, 0xc2, 0x83, 0xfd, 0xdc, 0x44, 0xc0, 0x05, 0x79, 0xf6, 0x33, 0x36, - 0x0e, 0xd8, 0xaf, 0xa8, 0x96, 0x4c, 0x2e, 0x69, 0xcf, 0x80, 0x9e, 0xa1, - 0xe4, 0xd9, 0xca, 0x49, 0xf4, 0x37, 0x8b, 0x4c, 0x9b, 0x9d, 0x0a, 0x3c, - 0x58, 0x7e, 0x3d, 0xe8, 0x95, 0xac, 0xa8, 0xed, 0xa7, 0x3b, 0xd6, 0x58, - 0x93, 0x3f, 0x64, 0x06, 0x9f, 0xbe, 0xbe, 0xaf, 0x2a, 0x92, 0x53, 0xf6, - 0xfb, 0xd5, 0x15, 0x2d, 0x53, 0xfe, 0x7b, 0x90, 0x07, 0x7e, 0xfe, 0xfa, - 0x89, 0xb6, 0xa8, 0xbc, 0xc6, 0x8d, 0xa6, 0x0a, 0x24, 0x9e, 0x32, 0xd1, - 0x42, 0xf9, 0xb9, 0x85, 0x1f, 0x72, 0xfd, 0xdd, 0x18, 0xa7, 0xfd, 0x8d, - 0x4e, 0xa0, 0xd9, 0xd1, 0x78, 0x1b, 0xe8, 0xa7, 0xdc, 0x2f, 0x39, 0x56, - 0xc8, 0xca, 0x18, 0x1e, 0xf0, 0x83, 0x52, 0x14, 0xd0, 0x2e, 0xe0, 0x5a, - 0x6e, 0xe9, 0x52, 0x60, 0x58, 0x1b, 0xb6, 0x5b, 0xfc, 0x0d, 0x2c, 0x7e, - 0x96, 0x9e, 0x89, 0x54, 0x78, 0x69, 0x3e, 0x37, 0x1a, 0x95, 0xd6, 0x38, - 0x1b, 0x62, 0x21, 0x91, 0xd3, 0x4c, 0x72, 0xa4, 0xa2, 0x63, 0xd7, 0x4e, - 0xce, 0xed, 0x50, 0x05, 0x8d, 0x0a, 0xd6, 0x3c, 0xfd, 0x06, 0xb8, 0xbd, - 0x51, 0x64, 0x1f, 0x80, 0x1e, 0x5d, 0x6c, 0x58, 0x5a, 0x4c, 0x6d, 0x5c, - 0x0a, 0x41, 0xa5, 0xbf, 0xfe, 0x42, 0x76, 0x33, 0x3e, 0xa5, 0xce, 0xed, - 0x3d, 0x42, 0xc6, 0xa9, 0x16, 0x59, 0x70, 0xf9, 0xf2, 0x46, 0xf9, 0xfb, - 0x65, 0x51, 0x25, 0x43, 0xb6, 0x66, 0xed, 0xc9, 0x7f, 0xe8, 0x61, 0x55, - 0x05, 0xac, 0xb2, 0x5c, 0x31, 0x26, 0x6c, 0xdb, 0x40, 0xc5, 0xca, 0x6e, - 0x9d, 0x85, 0x83, 0x3d, 0x59, 0x0a, 0x01, 0x29, 0xc8, 0x3d, 0xf0, 0x13, - 0x43, 0x1d, 0x86, 0x29, 0x83, 0x40, 0x78, 0xf5, 0xd7, 0x93, 0x5d, 0x12, - 0xf0, 0x3a, 0x4b, 0x26, 0x61, 0x68, 0xcc, 0x15, 0x0a, 0x65, 0x7d, 0x53, - 0xc6, 0x66, 0x76, 0x68, 0xde, 0x10, 0x3c, 0x3a, 0x3a, 0x50, 0x05, 0xf2, - 0x57, 0xea, 0x2a, 0x2a, 0x03, 0xf6, 0xb5, 0xef, 0x62, 0x97, 0xee, 0x29, - 0x76, 0x0d, 0xd7, 0xf8, 0xcd, 0x3f, 0xb8, 0x78, 0xe8, 0x72, 0xdd, 0x10, - 0x77, 0xec, 0xf4, 0x6c, 0x6c, 0xc7, 0x8b, 0x2b, 0x10, 0x81, 0xc4, 0xdf, - 0x28, 0xf9, 0xa4, 0x4a, 0x01, 0xb0, 0x8e, 0x78, 0xd0, 0x9b, 0x98, 0x58, - 0x24, 0x04, 0x9c, 0x9f, 0x0f, 0x58, 0x5d, 0xad, 0x22, 0x64, 0x96, 0x3e, - 0x80, 0xaf, 0x2f, 0x24, 0xbe, 0x6c, 0x45, 0x70, 0x61, 0xaf, 0xf5, 0xc1, - 0x63, 0x96, 0xf5, 0xbe, 0x1d, 0x25, 0xf0, 0x9d, 0xdb, 0x44, 0x40, 0x0b, - 0x10, 0x3f, 0xb9, 0xbe, 0x2d, 0x1e, 0x61, 0xd2, 0x14, 0x07, 0x60, 0x77, - 0x95, 0x54, 0x96, 0x2c, 0x1f, 0x3b, 0x16, 0xa9, 0x69, 0x4d, 0xcb, 0xf6, - 0x3e, 0x71, 0x14, 0x9a, 0xee, 0x9c, 0x9a, 0x0a, 0x7d, 0x9a, 0x98, 0x11, - 0xf4, 0xc4, 0x38, 0x84, 0x38, 0x17, 0xf9, 0xc7, 0xec, 0x27, 0x46, 0x03, - 0x24, 0x6c, 0x94, 0x80, 0xf0, 0xa6, 0xc5, 0xba, 0x7b, 0xe8, 0x78, 0xa3, - 0xbf, 0x01, 0xfc, 0xf5, 0xe8, 0xb7, 0x5c, 0xcc, 0x1b, 0xe6, 0xe0, 0x6f, - 0x9a, 0x0e, 0x62, 0x0f, 0x86, 0xd0, 0x2f, 0xd0, 0x80, 0xef, 0xf2, 0x4c, - 0x8f, 0xc2, 0x57, 0xe8, 0x55, 0x06, 0xe6, 0x2c, 0xed, 0xd9, 0xe2, 0xa3, - 0x4c, 0xc7, 0xca, 0x1a, 0xe0, 0xf1, 0x20, 0x83, 0x80, 0x6b, 0xda, 0x55, - 0xfd, 0x03, 0xb8, 0xbf, 0x51, 0x66, 0x1f, 0x81, 0x1e, 0x57, 0x68, 0x46, - 0x50, 0x4c, 0x69, 0x56, 0xc0, 0x97, 0xe2, 0x0c, 0x7c, 0xbc, 0xbc, 0x5a, - 0xbe, 0x63, 0x7c, 0x72, 0x06, 0x35, 0x32, 0xb7, 0x5b, 0x22, 0xec, 0xf2, - 0x42, 0x45, 0x83, 0x6b, 0x10, 0x9e, 0x71, 0xf4, 0xe0, 0xa1, 0x2a, 0x2d, - 0xd1, 0x67, 0x46, 0x67, 0x55, 0x9e, 0x5e, 0x64, 0x0d, 0x2c, 0x41, 0xb4, - 0xa6, 0x55, 0xbf, 0x08, 0xe7, 0x7f, 0x59, 0xd5, 0x42, 0x4a, 0x0e, 0x37, - 0x31, 0x0f, 0x9d, 0xd9, 0xdf, 0x66, 0x3b, 0x9e, 0x26, 0x3a, 0x23, 0x6f, - 0x81, 0x1a, 0x7a, 0x10, 0xeb, 0x2b, 0xa0, 0x05, 0xe3, 0xdb, 0xf6, 0xf5, - 0x50, 0x4f, 0x90, 0x48, 0x32, 0xc8, 0x02, 0xe7, 0x6d, 0x12, 0xa9, 0xa7, - 0x8a, 0x27, 0x72, 0xd4, 0x83, 0x3c, 0xa3, 0x8e, 0x34, 0xb9, 0xb4, 0xfd, - 0x4a, 0x14, 0x26, 0x02, 0xb7, 0xb2, 0x8e, 0x67, 0xf2, 0xae, 0x2b, 0x8a, - 0xeb, 0xe9, 0xff, 0x29, 0x4b, 0xe4, 0x51, 0x1c, 0x9b, 0xf4, 0xa4, 0x84, - 0xe1, 0xfb, 0x5c, 0xbf, 0x63, 0x4c, 0xec, 0xc5, 0x2d, 0x4b, 0xb4, 0x00, - 0xaa, 0x8f, 0x9a, 0xd5, 0x9e, 0x3d, 0x12, 0xfe, 0x92, 0x12, 0xec, 0x6e, - 0xcd, 0x79, 0x5d, 0xeb, 0x68, 0x09, 0x49, 0xc4, 0x8c, 0x41, 0x6b, 0x6d, - 0xe2, 0x82, 0x67, 0x7b, 0xbc, 0x64, 0xf8, 0x8e, 0x67, 0xbb, 0x76, 0x78, - 0xc3, 0xc9, 0xf2, 0x5e, 0xd5, 0x53, 0xf3, 0xfd, 0x87, 0x57, 0x11, 0xfd, - 0x1a, 0x2e, 0x90, 0x75, 0xac, 0x11, 0x48, 0x07, 0x47, 0xc4, 0x97, 0xc6, - 0xe4, 0x73, 0x13, 0x9a, 0xd4, 0x7c, 0xd7, 0xfc, 0xab, 0xf7, 0x0f, 0x33, - 0xbd, 0x63, 0x94, 0xf7, 0x6b, 0x22, 0xc3, 0xc9, 0x6d, 0x9f, 0x58, 0x4d, - 0x9d, 0x9f, 0xca, 0x3e, 0x8e, 0xf6, 0xdf, 0xdf, 0xc2, 0x23, 0x0c, 0x21, - 0xe8, 0x7e, 0x73, 0x18, 0x85, 0xd5, 0xf8, 0xad, 0x93, 0xac, 0x64, 0xa9, - 0xa5, 0xb1, 0x7e, 0x7f, 0xf1, 0x38, 0x27, 0x16, 0x3d, 0xbe, 0x86, 0x89, - 0x65, 0x7d, 0x5a, 0xd5, 0x55, 0x0c, 0xae, 0xa9, 0xae, 0x01, 0x44, 0x4f, - 0x1d, 0xf2, 0x8a, 0x9e, 0xf9, 0xce, 0xc1, 0xc8, 0x3b, 0xaf, 0x76, 0x0a, - 0xff, 0x2f, 0xd6, 0x35, 0xfd, 0x03, 0xb8, 0xbf, 0x51, 0x66, 0x1f, 0x81, - 0x1e, 0x5d, 0x68, 0x46, 0x50, 0x4c, 0x69, 0x5c, 0xd7, 0x9f, 0x8b, 0x8e, - 0x9f, 0x30, 0xf1, 0x80, 0x2b, 0xd5, 0xee, 0x97, 0x40, 0x0a, 0x6a, 0x25, - 0x75, 0x2e, 0x40, 0x12, 0x8d, 0x2d, 0xc2, 0x0d, 0x13, 0xf4, 0x68, 0xd8, - 0x06, 0xad, 0x86, 0x42, 0xd1, 0x6d, 0x41, 0x67, 0x55, 0x9b, 0x40, 0x64, - 0x0d, 0x2e, 0x4e, 0xb4, 0xa6, 0x55, 0xbf, 0x08, 0xe7, 0x7f, 0x59, 0xd5, - 0x42, 0x4a, 0x0e, 0x37, 0x31, 0x0f, 0x9d, 0xd9, 0xdf, 0x66, 0x3b, 0x9e, - 0x83, 0x42, 0x78, 0xf4, 0xd7, 0x93, 0x59, 0x06, 0xfa, 0x3d, 0x4f, 0x26, - 0x61, 0x68, 0xcc, 0x15, 0x38, 0x86, 0x43, 0x18, 0xcd, 0xa1, 0x95, 0x92, - 0xd4, 0x90, 0x50, 0x30, 0x7a, 0x88, 0xaf, 0x9f, 0x83, 0x3c, 0xa3, 0x8e, - 0x34, 0xa9, 0xb4, 0xfd, 0x4a, 0x14, 0x26, 0x02, 0xb7, 0xb2, 0x8e, 0x67, - 0xf2, 0xae, 0x2b, 0x8a, 0xeb, 0xe9, 0xff, 0x29, 0x4b, 0xe4, 0x51, 0x1c, - 0x9b, 0xf4, 0xa4, 0x84, 0xe1, 0xfb, 0x5c, 0xbf, 0x63, 0x4c, 0xec, 0xc5, - 0x2d, 0x4b, 0xb4, 0x00, 0xaa, 0x8f, 0x9a, 0xd5, 0x5f, 0x5d, 0xde, 0x8f, - 0xd0, 0xcb, 0x61, 0x9e, 0xf4, 0xc5, 0x6d, 0x19, 0x0b, 0x46, 0x46, 0x6b, - 0x75, 0xdf, 0x26, 0x4a, 0xa6, 0x59, 0x66, 0x79, 0xa4, 0x75, 0xcb, 0x8a, - 0x41, 0x6a, 0xc9, 0xf8, 0x3f, 0x56, 0x5c, 0x44, 0xcf, 0x42, 0xc5, 0x1b, - 0x15, 0x52, 0xe4, 0x0c, 0xf0, 0x62, 0xb7, 0xc3, 0x5e, 0x44, 0x18, 0xd0, - 0x89, 0xbb, 0x8c, 0xfc, 0xd5, 0x07, 0x16, 0xd4, 0x9a, 0x13, 0x43, 0xe6, - 0x29, 0x84, 0x60, 0x6e, 0xe8, 0x15, 0x36, 0x50, 0x0b, 0x88, 0xeb, 0x3f, - 0xe7, 0xe2, 0x16, 0x8d, 0xa9, 0x8d, 0x5c, 0x38, 0x53, 0xf2, 0xaa, 0x3f, - 0xa7, 0x7c, 0x2b, 0xaa, 0xd2, 0xfa, 0x75, 0x57, 0x00, 0x66, 0xbe, 0x4c, - 0xab, 0x77, 0x6f, 0x54, 0x91, 0x22, 0x9e, 0x3d, 0xf6, 0xf9, 0xa4, 0x6e, - 0x99, 0xbb, 0xc4, 0x6e, 0xf3, 0x3a, 0x51, 0x01, 0xb7, 0xea, 0xe6, 0x9c, - 0x86, 0x05, 0x9a, 0x15, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x27, 0x49, 0xf0, - 0x7b, 0xcd, 0x9f, 0x78, 0xd7, 0x97, 0xff, 0xce, 0x7f, 0x43, 0x1b, 0xf9, - 0x87, 0x10, 0x8f, 0xff, 0x43, 0x17, 0x2b, 0x7a, 0xd4, 0xbb, 0xef, 0x22, - 0x8b, 0x90, 0x47, 0x22, 0xbc, 0x1f, 0xb5, 0xa6, 0x7c, 0x48, 0x9e, 0x29, - 0x4f, 0x7f, 0xe4, 0xa9, 0xec, 0xb7, 0x44, 0x87, 0x92, 0x8c, 0x73, 0x6a, - 0xeb, 0x1d, 0xd7, 0xc7, 0xfc, 0x49, 0x5e, 0x1f, 0xc1, 0x68, 0xbc, 0xca, - 0x3e, 0x3c, 0xba, 0xdc, 0xfa, 0xaa, 0xdd, 0x48, 0xbc, 0xd0, 0x96, 0x47, - 0xfb, 0x58, 0x0c, 0x81, 0x00, 0x0d, 0x65, 0x5f, 0x07, 0xc5, 0x23, 0x71, - 0xd9, 0x4c, 0x6a, 0x01, 0xca, 0x9f, 0x09, 0xf3, 0x7f, 0x9b, 0xf7, 0x7d, - 0x0f, 0x4b, 0x5c, 0xb0, 0xcd, 0xe9, 0xb4, 0xd3, 0x29, 0x2b, 0xac, 0xf6, - 0xe5, 0x8e, 0x5d, 0x09, 0xd6, 0x73, 0x3e, 0xd4, 0x3a, 0xd0, 0x14, 0xec, - 0xc4, 0xf3, 0xe0, 0x62, 0x08, 0xf0, 0xbf, 0x44, 0xb3, 0x42, 0x78, 0x7f, - 0x6e, 0x64, 0xdd, 0xa8, 0x03, 0x21, 0x3f, 0xf4, 0x76, 0x81, 0x2f, 0x49, - 0xf6, 0xe6, 0x39, 0x11, 0x02, 0xdb, 0xad, 0x50, 0x8e, 0x80, 0xf6, 0x8f, - 0xc3, 0xca, 0xd2, 0x25, 0xe9, 0x70, 0x89, 0x03, 0x40, 0x91, 0x8a, 0x42, - 0x79, 0x90, 0x16, 0x97, 0x07, 0xd4, 0x88, 0xbe, 0xf7, 0x27, 0x4d, 0x4c, - 0x44, 0x6e, 0x67, 0xce, 0xba, 0x69, 0xd3, 0x59, 0xbc, 0x64, 0x88, 0x50, - 0x63, 0x8c, 0xe5, 0x77, 0x90, 0x4b, 0x9a, 0x23, 0x11, 0x34, 0x20, 0xaf, - 0xd4, 0xb0, 0x21, 0xfd, 0xa0, 0x26, 0xba, 0x2b, 0x78, 0xd5, 0x62, 0x7f, - 0x1c, 0xb0, 0x6b, 0xc1, 0x78, 0xba, 0xbf, 0x69, 0x18, 0x5e, 0xc8, 0x0f, - 0x9f, 0x83, 0x91, 0xef, 0x3b, 0xd9, 0xba, 0xf9, 0x65, 0x18, 0x0c, 0xab, - 0x8a, 0x4e, 0x34, 0x59, 0x37, 0x9f, 0xbb, 0x29, 0xd3, 0xf2, 0x41, 0x90, - 0xda, 0xf1, 0x20, 0x60, 0x0f, 0x89, 0xba, 0x95, 0xb9, 0xfc, 0xd4, 0x3f, - 0x8b, 0x86, 0x47, 0x3a, 0xbc, 0x1f, 0xb5, 0x26, 0x7c, 0x48, 0xbe, 0x28, - 0x4f, 0x7f, 0xe4, 0xa9, 0x02, 0x88, 0xdc, 0x87, 0x12, 0x6d, 0x0b, 0x69, - 0xdc, 0x7e, 0x87, 0xcb, 0x19, 0x05, 0xbc, 0x56, 0x48, 0x75, 0xdf, 0x8e, - 0xe6, 0x99, 0xf1, 0xdb, 0xec, 0xdf, 0xcc, 0x2e, 0xac, 0x37, 0x05, 0xfa, - 0xf1, 0x58, 0x08, 0x9f, 0x05, 0x0d, 0x67, 0x50, 0x05, 0xc5, 0x22, 0x76, - 0xd9, 0x44, 0x6a, 0x0a, 0xca, 0x9f, 0x09, 0xf3, 0x7f, 0x9b, 0xf7, 0x7d, - 0x0f, 0x4b, 0x5c, 0xb0, 0xcd, 0xe9, 0xb4, 0xd3, 0x36, 0xa7, 0x7e, 0x16, - 0xa8, 0x54, 0xf1, 0xa2, 0x5e, 0xe0, 0xbf, 0xd3, 0x14, 0xd6, 0x22, 0x1b, - 0x12, 0x44, 0x93, 0xae, 0xb7, 0x89, 0x15, 0x5a, 0xf8, 0x1d, 0xf5, 0xd3, - 0xac, 0x34, 0xf7, 0x56, 0x3a, 0x10, 0xbb, 0xfe, 0xc1, 0x75, 0xc3, 0x3a, - 0xff, 0xe3, 0x99, 0x2a, 0xc7, 0xd6, 0x7e, 0x93, 0x65, 0x61, 0x4a, 0xd1, - 0xb1, 0xe5, 0xe9, 0x92, 0xb4, 0xf0, 0xad, 0x32, 0x89, 0x98, 0x75, 0x12, - 0x0e, 0x0a, 0xc6, 0x10, 0xf8, 0x77, 0x62, 0xa0, 0xf1, 0x01, 0x2b, 0xd9, - 0x26, 0x31, 0xa5, 0xef, 0x82, 0x80, 0x75, 0xa7, 0x3e, 0xf8, 0xff, 0x56, - 0xd3, 0x30, 0xa5, 0x9a, 0x84, 0x8a, 0xbe, 0xaa, 0x11, 0x34, 0x20, 0xad, - 0xd4, 0xb5, 0x21, 0xf0, 0xa0, 0x26, 0xba, 0xab, 0x78, 0xf5, 0x60, 0x7f, - 0xa8, 0x73, 0x59, 0x09, 0x77, 0xc5, 0xdb, 0x6d, 0x52, 0x95, 0x6d, 0xbe, - 0xcf, 0x73, 0xbd, 0x6b, 0xc7, 0x87, 0x13, 0x26, 0x14, 0x90, 0x27, 0x50, - 0x75, 0x78, 0xee, 0x66, 0x65, 0xa2, 0xb5, 0xc7, 0x35, 0xec, 0xc1, 0xed, - 0x8c, 0x2a, 0x3b, 0x43, 0x85, 0x0e, 0x72, 0x46, 0x16, 0xf3, 0xac, 0xfe, - 0x40, 0xda, 0x66, 0x0a, 0xe3, 0xcb, 0x82, 0xa6, 0xc9, 0x5a, 0x98, 0xb7, - 0x5f, 0x00, 0x5d, 0xab, 0x3a, 0x6a, 0x4c, 0xb4, 0xae, 0x59, 0xb0, 0x1c, - 0x92, 0x5f, 0x43, 0x27, 0x7a, 0xb6, 0xfa, 0x1b, 0x1a, 0xd8, 0xda, 0x83, - 0x2f, 0x78, 0xbe, 0x17, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x91, 0x16, 0x48, 0xc6, 0x21, 0x61, 0x8c, 0xcf, 0xf7, 0xc1, 0xe3, 0x0e, - 0x8f, 0xaf, 0xd2, 0x44, 0x81, 0xe5, 0x92, 0x68, 0xf3, 0xe2, 0xdd, 0x00, - 0xb2, 0x52, 0x94, 0x4a, 0x26, 0x85, 0x37, 0x22, 0x81, 0xc2, 0xa8, 0x51, - 0xfc, 0xf9, 0x98, 0x94, 0x94, 0x5d, 0x39, 0x39, 0xa0, 0x60, 0x5e, 0x77, - 0x6d, 0x3c, 0x0e, 0x26, 0x7f, 0x69, 0xfe, 0x5b, 0xa0, 0xcc, 0xdd, 0xed, - 0x96, 0x25, 0x2e, 0xfb, 0x70, 0x33, 0x51, 0xb0, 0x63, 0x88, 0x04, 0xdf, - 0x3e, 0xdd, 0x58, 0x8f, 0xa2, 0xaf, 0xac, 0x35, 0x21, 0x38, 0xbb, 0xd8, - 0x72, 0x14, 0xab, 0x0d, 0x8d, 0x84, 0x79, 0x80, 0xe5, 0xd4, 0xd2, 0xa1, - 0xa3, 0x4e, 0x27, 0xe5, 0x10, 0xc8, 0x15, 0x64, 0x55, 0x5b, 0xe9, 0xba, - 0x7e, 0x04, 0x90, 0x89, 0x81, 0x6f, 0xa5, 0x8d, 0x04, 0x7d, 0x76, 0x15, - 0x7b, 0x65, 0xae, 0x1b, 0x88, 0xb9, 0xb9, 0xd7, 0xcb, 0xcd, 0x67, 0x50, - 0x88, 0x61, 0x36, 0xf5, 0x65, 0xd8, 0x11, 0xce, 0xb3, 0xe6, 0x98, 0x90, - 0xd2, 0x7d, 0x78, 0xad, 0x1f, 0x85, 0x84, 0x8d, 0x37, 0xf7, 0x06, 0x8f, - 0xf7, 0x94, 0x9a, 0xe2, 0x4b, 0xc9, 0x8f, 0x00, 0x5a, 0xfc, 0x24, 0xea, - 0x0e, 0xc7, 0xa4, 0x3b, 0x0e, 0x05, 0xd4, 0x7c, 0xbc, 0x78, 0xab, 0x51, - 0x85, 0x56, 0xbc, 0x7e, 0xa0, 0xcb, 0xe0, 0x0e, 0xff, 0x31, 0xc6, 0x12, - 0x4b, 0xb6, 0xaa, 0x40, 0x71, 0xce, 0x06, 0x76, 0x94, 0x9a, 0xc7, 0x48, - 0x32, 0xd2, 0xd6, 0x3e, 0xec, 0x66, 0xdc, 0x87, 0x12, 0x4f, 0x0b, 0x69, - 0xdc, 0x7e, 0x87, 0xcb, 0x19, 0x05, 0xbc, 0x56, 0x12, 0x77, 0x20, 0xbb, - 0xd1, 0x4e, 0xef, 0xbf, 0x1c, 0x68, 0x37, 0x21, 0x05, 0xb4, 0xd1, 0x59, - 0xaa, 0x70, 0xf0, 0xb8, 0x59, 0x80, 0xfa, 0xf6, 0x72, 0xf6, 0xce, 0xe0, - 0x57, 0x08, 0x43, 0x30, 0x0d, 0xf1, 0x90, 0xca, 0x29, 0x84, 0xbb, 0xe2, - 0x62, 0x79, 0xc3, 0xc3, 0x47, 0xac, 0xd7, 0xba, 0x87, 0xf0, 0x2a, 0x0f, - 0x93, 0x4b, 0x91, 0x59, 0xb7, 0xe7, 0xae, 0xd7, 0x50, 0x12, 0x99, 0xb6, - 0x94, 0x2d, 0x4c, 0x5e, 0xd2, 0xec, 0x52, 0x45, 0x39, 0x10, 0xf7, 0x0c, - 0x57, 0x06, 0xc1, 0x69, 0x70, 0x2d, 0x51, 0xb5, 0x63, 0x87, 0x04, 0xdd, - 0x3e, 0xd5, 0x58, 0x84, 0xa2, 0xaf, 0xac, 0x35, 0xf0, 0xbe, 0xfa, 0xea, - 0x87, 0xf5, 0x81, 0xd3, 0xfc, 0xee, 0x48, 0x19, 0xb3, 0x76, 0xb8, 0x0b, - 0x31, 0x85, 0x69, 0x11, 0xad, 0xfd, 0xd5, 0x5b, 0x2a, 0x38, 0x39, 0x80, - 0x6a, 0x4c, 0xa8, 0x7b, 0xe2, 0x93, 0xa5, 0x56, 0x77, 0x78, 0x9e, 0x01, - 0xc9, 0x0c, 0x46, 0x81, 0x60, 0x4e, 0xe0, 0x39, 0xcb, 0xcd, 0x60, 0x50, - 0x88, 0x68, 0x36, 0xfa, 0x65, 0xd8, 0x11, 0x4e, 0xb3, 0xe6, 0x98, 0x90, - 0x79, 0x76, 0x3d, 0xa5, 0x20, 0xd0, 0x0f, 0xbe, 0x4a, 0x44, 0xe9, 0x9f, - 0xba, 0x64, 0xcb, 0xf5, 0x6b, 0xb3, 0xd8, 0xa4, 0x7a, 0x81, 0x97, 0x78, - 0x42, 0x5c, 0xf4, 0x7b, 0x0c, 0xf8, 0x18, 0x02, 0xae, 0xa4, 0x42, 0x75, - 0x61, 0x43, 0x51, 0xa9, 0x65, 0xc0, 0x3e, 0x30, 0x20, 0x6b, 0x44, 0x38, - 0x4b, 0xb3, 0xaa, 0x4d, 0x71, 0xce, 0x06, 0xf6, 0x94, 0x9a, 0xc7, 0x48, - 0x32, 0xd2, 0xd6, 0x3e, 0x8d, 0xd3, 0xd4, 0x94, 0xe8, 0xd0, 0x91, 0xaf, - 0x48, 0x5f, 0x1b, 0x78, 0x6d, 0x47, 0x60, 0x35, 0x68, 0xef, 0xb1, 0x90, - 0x27, 0x1d, 0xe0, 0x6d, 0x93, 0x8a, 0x07, 0x6f, 0xd5, 0x1f, 0x29, 0x24, - 0x89, 0xcb, 0x79, 0x71, 0x85, 0x8b, 0xd8, 0xbc, 0xe9, 0xa7, 0xfd, 0x31, - 0x17, 0xea, 0x1d, 0xe4, 0xde, 0xd2, 0x8f, 0x43, 0xf4, 0x37, 0x51, 0x7d, - 0x4e, 0x17, 0x3e, 0x07, 0xaa, 0xb2, 0xfe, 0x19, 0x78, 0xf7, 0xa9, 0x51, - 0x12, 0x61, 0x16, 0x53, 0xfb, 0xfc, 0x27, 0x32, 0xd3, 0x47, 0xf4, 0x47, - 0x58, 0x45, 0x9d, 0x3e, 0x54, 0xe0, 0x9b, 0x67, 0x1e, 0x55, 0xe2, 0x12, - 0x24, 0x41, 0xd8, 0xab, 0x46, 0x31, 0x19, 0xa9, 0x5a, 0x34, 0xd8, 0x21, - 0x6e, 0xd3, 0x8f, 0x74, 0x2f, 0xce, 0x3c, 0x13, 0x21, 0x38, 0x9b, 0xd9, - 0x72, 0x14, 0xab, 0x0d, 0x8d, 0x84, 0x79, 0x80, 0xe5, 0xd4, 0xd2, 0xa1, - 0xf0, 0xdf, 0x8a, 0xbf, 0xf9, 0x2f, 0xc3, 0xf4, 0xae, 0xe3, 0x2d, 0x05, - 0x77, 0xae, 0xb9, 0xc6, 0xcb, 0x25, 0x1d, 0x97, 0x7a, 0x8d, 0x4e, 0xb5, - 0xca, 0xbb, 0xb3, 0x10, 0x6f, 0xff, 0x4c, 0x55, 0xcb, 0xc2, 0x66, 0x52, - 0x88, 0x66, 0x36, 0xf3, 0x65, 0xd8, 0x11, 0xce, 0xb3, 0xe6, 0x98, 0x90, - 0xd2, 0x7d, 0x78, 0xad, 0x1f, 0x85, 0x84, 0x8d, 0x37, 0xf7, 0x06, 0x8f, - 0xf7, 0x94, 0x9a, 0xe2, 0x11, 0xe6, 0x64, 0x80, 0xa3, 0x94, 0xf5, 0x68, - 0xfe, 0xaa, 0xd4, 0x82, 0xf5, 0x3d, 0x64, 0xf5, 0xc3, 0xd3, 0xb2, 0x39, - 0x54, 0xc4, 0xad, 0xa4, 0xdc, 0x94, 0x2f, 0x2c, 0x2f, 0xa6, 0xa8, 0xa8, - 0x4b, 0xbb, 0xaa, 0x43, 0x71, 0xce, 0x06, 0x76, 0xb4, 0x9a, 0xc7, 0x48, - 0x32, 0xd2, 0xd6, 0x3e, 0x88, 0x06, 0xd9, 0x57, 0xe9, 0x7b, 0x51, 0xe2, - 0xfc, 0x8b, 0xfc, 0xf5, 0x63, 0x48, 0xc4, 0x24, 0x84, 0x19, 0x8c, 0x56, - 0x4c, 0xbd, 0x98, 0x94, 0x5d, 0x23, 0x0c, 0x91, 0x4f, 0x23, 0x44, 0x63, - 0xc8, 0x47, 0x71, 0x2d, 0xac, 0xbb, 0x77, 0x66, 0x9d, 0xe0, 0xda, 0x01, - 0xca, 0x4a, 0x66, 0x35, 0x81, 0xe5, 0x92, 0x68, 0xd3, 0xe2, 0xfd, 0x01, - 0xb2, 0x52, 0x94, 0x4a, 0x26, 0x85, 0x37, 0x22, 0x17, 0xae, 0xcc, 0xf9, - 0x76, 0xe1, 0x96, 0xf8, 0x79, 0x79, 0x61, 0x4f, 0x55, 0xc9, 0x01, 0xe9, - 0xb6, 0x2a, 0x18, 0x88, 0x51, 0x52, 0x4e, 0xb6, 0x1a, 0x2a, 0x94, 0xd3, - 0xd2, 0x49, 0x7d, 0x8c, 0x69, 0x5a, 0xe1, 0x02, 0xbc, 0x4a, 0xdc, 0x18, - 0x95, 0xac, 0xbf, 0xd6, 0x19, 0x40, 0x03, 0xef, 0x64, 0x19, 0xde, 0x7e, - 0x6c, 0xe6, 0x42, 0x5c, 0x70, 0x07, 0xa0, 0x88, 0xf4, 0x16, 0x45, 0x4c, - 0x20, 0x29, 0x7d, 0xce, 0xcc, 0xaf, 0x66, 0xd9, 0x1e, 0xb1, 0xf7, 0x81, - 0x19, 0x94, 0xbd, 0x6b, 0xca, 0x63, 0x11, 0x7e, 0xe1, 0xea, 0x5c, 0xd3, - 0xff, 0xd1, 0x16, 0xee, 0xe5, 0x74, 0xe7, 0x49, 0xcb, 0xcd, 0x67, 0x52, - 0x88, 0x6e, 0x36, 0xf8, 0x65, 0xd8, 0x11, 0xce, 0xb3, 0xe6, 0x98, 0x90, - 0xd2, 0x01, 0xc6, 0x7b, 0x69, 0xc9, 0x21, 0x3a, 0x70, 0x29, 0x79, 0x07, - 0x9d, 0x1c, 0x51, 0x0a, 0x20, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x18, - 0xb7, 0x8e, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, 0x0f, 0x9c, 0xbe, 0x08, - 0x87, 0x80, 0x19, 0xf6, 0x55, 0x22, 0xed, 0xba, 0xeb, 0x49, 0x07, 0xa3, - 0x4b, 0xb2, 0xaa, 0x4c, 0x71, 0xce, 0x06, 0xf6, 0xb4, 0x9a, 0xc7, 0x48, - 0x32, 0xd2, 0xd6, 0x3e, 0xe0, 0xb7, 0xe6, 0x43, 0x89, 0x1a, 0xac, 0x78, - 0xc6, 0x7b, 0xc7, 0x48, 0x1a, 0x8e, 0x51, 0xec, 0xf8, 0x34, 0xd1, 0x25, - 0x4f, 0x07, 0xf0, 0x5e, 0xd2, 0xab, 0x31, 0xdb, 0x1c, 0x65, 0xf4, 0x70, - 0x98, 0x4f, 0x60, 0xeb, 0xfb, 0x69, 0x91, 0x80, 0xa8, 0xb9, 0xc2, 0x31, - 0x31, 0x9e, 0xe1, 0x3f, 0xb1, 0xe1, 0xb5, 0x8d, 0x11, 0xfb, 0xd8, 0xae, - 0x01, 0x5a, 0x4a, 0xc5, 0x52, 0xc4, 0xf8, 0x7a, 0x5f, 0x36, 0xda, 0xf8, - 0x5f, 0xe7, 0x29, 0x01, 0x94, 0xdb, 0xa2, 0x87, 0xb8, 0xc9, 0xb9, 0x28, - 0xee, 0x26, 0x5d, 0xa8, 0xd5, 0xc2, 0xb3, 0x57, 0xc5, 0x03, 0x57, 0x51, - 0xfa, 0x84, 0x6a, 0xb3, 0x03, 0x5f, 0xb1, 0x67, 0x73, 0x78, 0x0d, 0x2a, - 0x9c, 0x5e, 0xd7, 0x84, 0x51, 0xaf, 0x65, 0x99, 0x9f, 0xc1, 0x4a, 0x99, - 0x74, 0x28, 0x12, 0x23, 0x60, 0x7c, 0xb0, 0x83, 0x2c, 0xeb, 0x62, 0xf3, - 0x1a, 0x5a, 0xce, 0x65, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0x92, 0x68, 0x77, - 0xd7, 0xe0, 0xf8, 0xbe, 0xf1, 0x47, 0x12, 0x9c, 0xc6, 0xbf, 0x39, 0xbe, - 0xd5, 0x08, 0xc2, 0xdd, 0xfe, 0x07, 0xbb, 0x0c, 0xcd, 0xc4, 0x64, 0x56, - 0x88, 0x7b, 0x36, 0xef, 0x02, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0xb8, 0x91, - 0xd7, 0xf4, 0xe6, 0x29, 0x86, 0xec, 0x0f, 0xae, 0x81, 0x53, 0x43, 0x49, - 0xef, 0xaf, 0x9f, 0x3d, 0x43, 0x55, 0x8e, 0x75, 0x29, 0x4c, 0xfe, 0xe0, - 0xfe, 0x2f, 0xc4, 0x50, 0x0f, 0xbb, 0x19, 0xbd, 0x7c, 0x23, 0x32, 0x5e, - 0xb4, 0xbd, 0x81, 0xaa, 0x05, 0x0c, 0x46, 0x42, 0x67, 0xef, 0x31, 0xdc, - 0x4b, 0xbc, 0xaa, 0x45, 0x16, 0xce, 0x06, 0x76, 0x99, 0x9a, 0xc7, 0x48, - 0x32, 0xd2, 0xd6, 0x3e, 0x14, 0x54, 0x69, 0x7d, 0x08, 0x67, 0x1b, 0xfc, - 0x24, 0x3d, 0x02, 0xcb, 0x3e, 0x4d, 0x37, 0xa8, 0x04, 0x22, 0xa4, 0xbc, - 0x11, 0xc9, 0x19, 0x2a, 0x16, 0xaf, 0x15, 0x74, 0x7c, 0x2e, 0x4f, 0x72, - 0x9c, 0x0a, 0xa9, 0x1b, 0xf0, 0xdc, 0x06, 0xb3, 0xd0, 0xeb, 0xd9, 0xc1, - 0xc2, 0x9a, 0x03, 0x07, 0x4a, 0x09, 0x0c, 0x5a, 0x38, 0x4f, 0xd9, 0x1a, - 0xd0, 0xed, 0x3e, 0x99, 0x26, 0xa1, 0x99, 0x68, 0xa1, 0x69, 0x16, 0xea, - 0x3f, 0xe3, 0x6a, 0xd1, 0x0e, 0x9d, 0xfa, 0x6a, 0x40, 0x7f, 0xac, 0x1e, - 0x85, 0x97, 0xb5, 0x26, 0x39, 0x6b, 0x9e, 0xf2, 0x6a, 0x4e, 0x1c, 0xa9, - 0x3d, 0x7f, 0xe3, 0x5d, 0xa0, 0x44, 0xfb, 0x93, 0xa3, 0xe5, 0x89, 0x4d, - 0xa4, 0x63, 0x9f, 0x88, 0x57, 0x55, 0xac, 0x0a, 0xfc, 0xdd, 0x73, 0x66, - 0x5b, 0x5f, 0x08, 0x13, 0x90, 0xf4, 0x3f, 0x5d, 0xb8, 0xa3, 0xd3, 0x8e, - 0x20, 0x1f, 0x2b, 0x94, 0x9b, 0x0f, 0x63, 0xd6, 0x19, 0xef, 0x7d, 0xd7, - 0xc6, 0x21, 0xfc, 0x00, 0xa3, 0x52, 0xbd, 0xd1, 0xe6, 0xea, 0xfe, 0xbb, - 0x4f, 0x70, 0x64, 0x42, 0xd1, 0xc4, 0xba, 0xdf, 0xc9, 0xc2, 0x67, 0x50, - 0x88, 0x6d, 0x36, 0xf7, 0x02, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0x98, 0x90, - 0x6b, 0xd4, 0xed, 0xf7, 0x2e, 0xb8, 0x58, 0x9b, 0x29, 0x86, 0x43, 0xfb, - 0x41, 0x37, 0x69, 0x2c, 0x3b, 0x94, 0x5e, 0x5f, 0xc5, 0x75, 0x06, 0x80, - 0x4b, 0x9f, 0x0c, 0xb4, 0xa2, 0x53, 0xb4, 0xf7, 0x7c, 0x1b, 0x6d, 0x9d, - 0x13, 0xb2, 0x8d, 0xff, 0xc4, 0xe1, 0x0d, 0xcd, 0xfb, 0xc0, 0x76, 0x27, - 0x4b, 0xb4, 0xaa, 0x4e, 0x16, 0xce, 0x06, 0x76, 0x99, 0x9a, 0xc7, 0x48, - 0x32, 0xd2, 0xd6, 0x3e, 0x0e, 0x46, 0xca, 0x9e, 0xf1, 0x4c, 0xcf, 0x6b, - 0x7e, 0x0e, 0x20, 0xd4, 0xde, 0xd6, 0x44, 0xae, 0xe8, 0xeb, 0xd4, 0x91, - 0x05, 0x1c, 0x2b, 0x50, 0x17, 0xd6, 0x4d, 0x76, 0xd9, 0xfb, 0xe5, 0x25, - 0xe3, 0x52, 0x2f, 0xd4, 0xbe, 0xc7, 0x18, 0x5c, 0x56, 0x40, 0x50, 0x9d, - 0x98, 0xad, 0x36, 0xe8, 0x6a, 0xf1, 0x90, 0x4a, 0x24, 0x84, 0xbb, 0xe2, - 0x62, 0x79, 0xc3, 0xc3, 0x47, 0xac, 0xd7, 0xba, 0xd1, 0x46, 0x46, 0xea, - 0x5e, 0xa3, 0x85, 0x33, 0xa2, 0x40, 0x1b, 0xd1, 0x86, 0x33, 0xed, 0xba, - 0xac, 0xb8, 0x65, 0x9a, 0x43, 0xd9, 0x7f, 0x09, 0x16, 0xbb, 0x81, 0x83, - 0x2a, 0xef, 0xed, 0x35, 0xb7, 0xf0, 0x79, 0x4e, 0x71, 0x09, 0xbb, 0xb4, - 0x9f, 0x0c, 0xd2, 0x28, 0x0d, 0xe2, 0x61, 0x1f, 0xfd, 0xbe, 0xf8, 0xea, - 0x87, 0xf5, 0x81, 0xd3, 0xfc, 0xee, 0x48, 0x19, 0xb3, 0x76, 0xb8, 0x0b, - 0x1f, 0xb7, 0xa6, 0x7b, 0x3e, 0x90, 0x64, 0x68, 0x60, 0x95, 0x25, 0xf6, - 0x7e, 0x9e, 0xc6, 0x43, 0x97, 0x40, 0xda, 0xda, 0x40, 0x56, 0x8b, 0xd5, - 0xef, 0x83, 0x3c, 0xe7, 0x94, 0x26, 0xc2, 0x5d, 0x04, 0x60, 0xbd, 0xed, - 0xab, 0x66, 0x6f, 0x47, 0x91, 0x22, 0x9e, 0x3d, 0xf6, 0xf9, 0xa4, 0x6e, - 0x95, 0x88, 0x49, 0xb1, 0xf9, 0x7b, 0x36, 0x5a, 0x7f, 0xb4, 0xb0, 0x2a, - 0x38, 0x26, 0x75, 0x65, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x27, 0x49, 0xf0, - 0x7b, 0xcd, 0x98, 0x7f, 0xd7, 0x97, 0xff, 0xce, 0xa4, 0x26, 0x5b, 0xdc, - 0x38, 0x88, 0x2f, 0xc3, 0xa9, 0x52, 0xc7, 0x00, 0x75, 0x9a, 0xdb, 0x05, - 0xca, 0x9f, 0x09, 0x73, 0x7f, 0x9b, 0xd7, 0x7c, 0x0f, 0x4b, 0x5c, 0xb0, - 0xcd, 0xe9, 0xb4, 0xd3, 0x8f, 0x5e, 0x15, 0x10, 0x7c, 0xee, 0x5a, 0x17, - 0x28, 0x95, 0x2d, 0xd2, 0x9a, 0x22, 0x24, 0x4f, 0x8b, 0x60, 0xd1, 0x77, - 0x08, 0x78, 0x3e, 0x4e, 0x84, 0x90, 0xda, 0x95, 0xfa, 0x6a, 0x5a, 0x15, - 0x1e, 0x3e, 0x27, 0xad, 0xd0, 0xa1, 0x23, 0xe7, 0xa0, 0x26, 0xba, 0x2b, - 0x78, 0xd5, 0x62, 0x7f, 0xfe, 0x8a, 0xd0, 0xd3, 0x8b, 0xdd, 0x85, 0x15, - 0xeb, 0x3f, 0x1a, 0xfb, 0x04, 0x67, 0x0d, 0x2e, 0x0c, 0xf9, 0x77, 0xb8, - 0x97, 0x57, 0xdf, 0x35, 0x9d, 0xe5, 0x55, 0x06, 0x48, 0x96, 0x84, 0xf3, - 0xf2, 0x5b, 0x1e, 0x91, 0x11, 0x19, 0x6d, 0x4b, 0x0f, 0xcf, 0x27, 0x7b, - 0xdf, 0x57, 0x69, 0x19, 0xca, 0x9f, 0x09, 0xf3, 0x7f, 0x9b, 0xf7, 0x7d, - 0x0f, 0x4b, 0x5c, 0xb0, 0xcd, 0xe9, 0xb4, 0xd3, 0x8e, 0xc0, 0xa7, 0x4c, - 0x12, 0x92, 0x48, 0x74, 0xb5, 0xdb, 0x44, 0xa9, 0xf1, 0xc3, 0xb5, 0xbc, - 0x4b, 0x4f, 0x46, 0xd4, 0xef, 0x1f, 0x43, 0x15, 0x26, 0xbb, 0xcc, 0x7c, - 0x91, 0xae, 0x90, 0x13, 0x1b, 0x3e, 0x25, 0xa2, 0xd2, 0xa1, 0x22, 0xe0, - 0xa0, 0x26, 0xba, 0x2b, 0x78, 0xd5, 0x62, 0x7f, 0x1c, 0xb0, 0x6b, 0xc1, - 0x78, 0xba, 0xbf, 0x69, 0x18, 0x5e, 0xc8, 0x0f, 0x9f, 0x83, 0x91, 0xef, - 0x3b, 0xd9, 0xba, 0xf9, 0x65, 0x18, 0x0c, 0xab, 0x8a, 0x4e, 0x34, 0x59, - 0x37, 0x9f, 0xbb, 0x29, 0xf2, 0x5c, 0x1e, 0x91, 0x11, 0x1e, 0x73, 0x4b, - 0x0f, 0xd1, 0x28, 0x7b, 0xdf, 0x58, 0x6e, 0x19, 0xca, 0x9f, 0x09, 0xf3, - 0x7f, 0x9b, 0xf7, 0x7d, 0x0f, 0x4b, 0x5c, 0xb0, 0xcd, 0xe9, 0xb4, 0xd3, - 0xb3, 0x79, 0x0a, 0x20, 0xdb, 0xc3, 0xd8, 0x83, 0x11, 0x9f, 0x67, 0x05, - 0x4b, 0x78, 0x58, 0x34, 0x4b, 0x5e, 0x46, 0xa3, 0xef, 0x1f, 0x43, 0x15, - 0x26, 0xbb, 0xcc, 0x7c, 0x91, 0xae, 0x90, 0x13, 0x1b, 0x3e, 0x25, 0xa2, - 0xd2, 0xa1, 0x22, 0xe0, 0xa0, 0x26, 0xba, 0x2b, 0x78, 0xd5, 0x62, 0x7f, - 0x79, 0x76, 0x3d, 0xa5, 0xce, 0x3e, 0x0f, 0xbe, 0x4a, 0x66, 0xe9, 0x9f, - 0xba, 0x64, 0xcb, 0xf5, 0x3b, 0xd9, 0xba, 0xf9, 0x65, 0x18, 0x0c, 0xab, - 0x8a, 0x28, 0x34, 0x59, 0x37, 0x9f, 0xbb, 0x29, 0x4a, 0xd8, 0xca, 0xb8, - 0xf6, 0x80, 0xbb, 0xf3, 0x32, 0x71, 0xf5, 0xaa, 0xb0, 0x51, 0x52, 0xb2, - 0x9a, 0xe3, 0x01, 0x51, 0x39, 0x29, 0x42, 0xb2, 0xab, 0x11, 0x2c, 0xfc, - 0xba, 0xbf, 0xeb, 0x36, 0xbe, 0x60, 0xce, 0x67, 0x00, 0xbe, 0x54, 0x92, - 0x2d, 0xb5, 0x3d, 0xbd, 0x24, 0x84, 0x20, 0xf2, 0x94, 0x59, 0x36, 0xc7, - 0x42, 0xc2, 0x64, 0x2f, 0xd9, 0x84, 0xed, 0x62, 0xc2, 0xf6, 0x03, 0x6a, - 0x1b, 0x3e, 0x25, 0xa7, 0xd2, 0xa1, 0x22, 0xe2, 0xa0, 0x26, 0xba, 0xab, - 0x78, 0xf5, 0x60, 0x7f, 0xa8, 0x73, 0x59, 0x09, 0x77, 0xc5, 0xdb, 0x6d, - 0x52, 0x95, 0x6d, 0xbe, 0xcf, 0x73, 0xbd, 0x6b, 0xc7, 0x87, 0x13, 0x26, - 0x14, 0x90, 0x27, 0x50, 0x75, 0x78, 0xee, 0x66, 0x65, 0xa2, 0xb5, 0xc7, - 0x8a, 0xcf, 0x6f, 0x75, 0x91, 0x9f, 0xd2, 0xa2, 0xe3, 0xad, 0xf8, 0x3e, - 0x11, 0xfd, 0x1e, 0xf3, 0x67, 0x46, 0x50, 0x99, 0xa6, 0x04, 0x1d, 0x57, - 0x89, 0xcc, 0xc6, 0xd4, 0x92, 0xb7, 0xcf, 0x61, 0x62, 0x7a, 0x2e, 0x0c, - 0x6a, 0x67, 0xe9, 0xd3, 0xcf, 0x44, 0xfe, 0xfa, 0x75, 0xbd, 0xcb, 0xeb, - 0xb4, 0xbd, 0x46, 0x86, 0x02, 0x4d, 0x6e, 0x9e, 0xa9, 0x6e, 0xdd, 0x05, - 0xff, 0x08, 0x55, 0xd5, 0xcd, 0xc4, 0x64, 0x56, 0x88, 0x7b, 0x36, 0xef, - 0x65, 0xd8, 0x11, 0xce, 0xb3, 0xe6, 0xb8, 0x91, 0xeb, 0xb4, 0x7d, 0xea, - 0xc4, 0x82, 0x29, 0x7b, 0x3d, 0x2f, 0x36, 0x49, 0x26, 0x14, 0x05, 0x73, - 0x1f, 0x5c, 0xcf, 0x48, 0x3e, 0x6a, 0x07, 0x74, 0x60, 0x59, 0x56, 0xbe, - 0xdd, 0xeb, 0x33, 0xfe, 0xab, 0x73, 0xe6, 0xbc, 0x4d, 0x93, 0xf0, 0xe8, - 0x78, 0xe2, 0xcb, 0xef, 0x51, 0x17, 0x40, 0x2c, 0x81, 0xe5, 0x92, 0x68, - 0xf3, 0xe2, 0xfd, 0x01, 0xb2, 0x52, 0x94, 0x4a, 0x26, 0x85, 0x37, 0x22, - 0xea, 0xa0, 0x2a, 0x1f, 0x01, 0xf7, 0xb4, 0xda, 0x66, 0x59, 0x7f, 0x8d, - 0xdc, 0xeb, 0xd9, 0x58, 0x54, 0xca, 0x8c, 0x34, 0x0b, 0xb9, 0xd6, 0x05, - 0x49, 0x2e, 0x23, 0xf2, 0x58, 0xe8, 0x46, 0x22, 0xc1, 0xd6, 0x62, 0x5a, - 0x8e, 0x72, 0x35, 0xe9, 0x65, 0xd8, 0x11, 0xce, 0xb3, 0xe6, 0x98, 0x90, - 0xeb, 0xb4, 0x7d, 0xea, 0xc4, 0x82, 0x29, 0x7b, 0x3d, 0x2f, 0x36, 0x49, - 0x26, 0x14, 0x05, 0x73, 0x4b, 0xc9, 0x8f, 0x00, 0x5a, 0xfc, 0x24, 0xea, - 0x0e, 0xc7, 0xa3, 0x3c, 0x0e, 0x05, 0xd4, 0x7c, 0xa9, 0x74, 0xe6, 0xbc, - 0x4d, 0x93, 0xee, 0xe2, 0x78, 0xe2, 0xc4, 0xea, 0x51, 0x17, 0x47, 0x2e, - 0x0d, 0xf1, 0x90, 0xca, 0x29, 0x84, 0xbb, 0xe2, 0x62, 0x79, 0xc3, 0xc3, - 0x47, 0xac, 0xd7, 0xba, 0x87, 0xf0, 0x2a, 0x0f, 0x93, 0x4b, 0x91, 0x59, - 0xb7, 0xe7, 0xae, 0xd7, 0x50, 0x12, 0x99, 0xb6, 0x31, 0x0f, 0x44, 0x67, - 0x43, 0x57, 0x5d, 0xde, 0xf0, 0x8e, 0x30, 0x42, 0x7e, 0x8e, 0x90, 0xa8, - 0xc1, 0xc8, 0x62, 0x5a, 0x8e, 0x7d, 0x35, 0xe9, 0x65, 0xd8, 0x11, 0xce, - 0xb3, 0xe6, 0x98, 0x90, 0x1c, 0xb0, 0x6b, 0xc1, 0x96, 0x54, 0xbf, 0x69, - 0x18, 0x7c, 0xc8, 0x0f, 0x9f, 0x83, 0x91, 0xef, 0x20, 0x55, 0xb8, 0x72, - 0x7d, 0x86, 0x3c, 0x00, 0xb7, 0xe8, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, - 0xa9, 0x74, 0xe6, 0xbc, 0x4d, 0x94, 0xf0, 0xe2, 0x78, 0xfc, 0xcb, 0xea, - 0x51, 0x18, 0x40, 0x2e, 0x0d, 0xf1, 0x90, 0xca, 0x29, 0x84, 0xbb, 0xe2, - 0x62, 0x79, 0xc3, 0xc3, 0x47, 0xac, 0xd7, 0xba, 0xa6, 0x77, 0x92, 0x5c, - 0x80, 0xd7, 0xe7, 0x90, 0xca, 0x04, 0x91, 0x82, 0x53, 0x7c, 0x15, 0x42, - 0x0b, 0x1d, 0xb8, 0x39, 0x7b, 0x70, 0x32, 0x40, 0xe3, 0x0f, 0x84, 0xa8, - 0x63, 0xde, 0x2b, 0x91, 0xc1, 0xd6, 0x6d, 0x5a, 0x8e, 0x72, 0x32, 0xe9, - 0x65, 0xd8, 0x11, 0x4e, 0xb3, 0xe6, 0x98, 0x90, 0x79, 0x76, 0x3d, 0xa5, - 0x20, 0xd0, 0x0f, 0xbe, 0x4a, 0x44, 0xe9, 0x9f, 0xba, 0x64, 0xcb, 0xf5, - 0x6b, 0xb3, 0xd8, 0xa4, 0x7a, 0x81, 0x97, 0x78, 0x42, 0x5c, 0xf4, 0x7b, - 0x0c, 0xf8, 0x18, 0x02, 0xbb, 0xa1, 0x8e, 0xde, 0x3b, 0xbb, 0x9b, 0x90, - 0x93, 0x3a, 0x6f, 0x2d, 0x64, 0xe5, 0x02, 0x5d, 0x0d, 0xf1, 0x90, 0x4a, - 0x29, 0x84, 0xbb, 0xe2, 0x62, 0x79, 0xc3, 0xc3, 0x47, 0xac, 0xd7, 0xba, - 0xfb, 0x05, 0xd5, 0x7b, 0xab, 0x98, 0x3d, 0xfc, 0x4f, 0x5e, 0xbf, 0x7c, - 0x46, 0xfd, 0xb1, 0x28, 0xfd, 0x75, 0x16, 0xfb, 0x70, 0x36, 0x69, 0x74, - 0x95, 0xb5, 0x61, 0x61, 0x37, 0xd3, 0x56, 0x79, 0x0c, 0x6a, 0xb8, 0xe5, - 0xad, 0x71, 0x6c, 0x52, 0x91, 0x22, 0x9e, 0x3d, 0xf7, 0x59, 0xdc, 0x6e, - 0xdb, 0x9b, 0xca, 0x53, 0x68, 0xf6, 0xea, 0x38, 0xe4, 0x7e, 0x98, 0x0b, - 0xca, 0x6f, 0x74, 0xa0, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x27, 0x49, 0xc0, - 0x7b, 0xcd, 0x98, 0x7f, 0xd7, 0x97, 0xff, 0xce, 0x91, 0x16, 0x48, 0xc6, - 0x21, 0x61, 0x8c, 0xcf, 0xf7, 0xc1, 0xe3, 0x0e, 0x8f, 0xaf, 0xd2, 0x44, - 0x81, 0xe5, 0x92, 0x68, 0xf3, 0xe2, 0xdd, 0x00, 0xb2, 0x52, 0x94, 0x4a, - 0x26, 0x85, 0x37, 0x22, 0x5e, 0x26, 0x0c, 0x5e, 0xec, 0x54, 0xa6, 0x82, - 0x6a, 0xad, 0x8c, 0xa7, 0x3a, 0x3a, 0xc8, 0xa0, 0x6b, 0xed, 0x7d, 0x02, - 0x3f, 0xa1, 0xd8, 0x2e, 0x91, 0x7f, 0x28, 0x0f, 0x4e, 0x74, 0x0e, 0x8e, - 0xc1, 0xc8, 0x60, 0x5f, 0x8e, 0x7d, 0x34, 0xeb, 0x65, 0xd8, 0x11, 0xce, - 0xb3, 0xe6, 0x98, 0x90, 0xeb, 0xb4, 0x7d, 0xea, 0xc4, 0x82, 0x29, 0x7b, - 0x3d, 0x2f, 0x36, 0x49, 0x26, 0x14, 0x05, 0x73, 0x11, 0xe6, 0x64, 0x80, - 0xa3, 0x94, 0xf5, 0x68, 0xfe, 0xaa, 0xd3, 0x85, 0xf5, 0x3d, 0x64, 0xf5, - 0xcb, 0x43, 0x67, 0x29, 0xb8, 0xb3, 0x7d, 0x72, 0x97, 0xe4, 0xdf, 0x0b, - 0xcc, 0x5b, 0x65, 0x2a, 0x81, 0xe5, 0x92, 0x68, 0xd3, 0xe2, 0xfd, 0x01, - 0xb2, 0x52, 0x94, 0x4a, 0x26, 0x85, 0x37, 0x22, 0xa5, 0x31, 0x02, 0x20, - 0xdb, 0x36, 0x83, 0xc9, 0xa7, 0x0f, 0xf2, 0xf9, 0x72, 0x4f, 0xec, 0xb9, - 0x3b, 0x16, 0x81, 0x8e, 0xc5, 0xc7, 0xee, 0x1f, 0x06, 0x58, 0x81, 0xfe, - 0x7c, 0xa4, 0x12, 0xce, 0xc1, 0xd4, 0x62, 0x5a, 0x8e, 0x73, 0x35, 0xe9, - 0x65, 0xd8, 0x11, 0xce, 0x93, 0xe6, 0x98, 0x90, 0x47, 0x5a, 0xac, 0x37, - 0x84, 0xf6, 0xa7, 0x55, 0x1c, 0x1a, 0xf9, 0x0e, 0x7b, 0x20, 0x2a, 0x4c, - 0xd7, 0x3d, 0x3a, 0x7a, 0x6a, 0x10, 0x61, 0x0d, 0x91, 0x9f, 0xcb, 0x14, - 0x39, 0x49, 0xeb, 0x13, 0xcb, 0x44, 0x67, 0x29, 0xb8, 0xb4, 0x7d, 0x78, - 0x97, 0xfa, 0xdf, 0x0e, 0xcc, 0x54, 0x65, 0x28, 0x81, 0xe5, 0x92, 0x68, - 0xd3, 0xe2, 0xfd, 0x01, 0xb2, 0x52, 0x94, 0x4a, 0x26, 0x85, 0x37, 0x22, - 0x17, 0xae, 0xcc, 0xf9, 0x76, 0xe1, 0x96, 0xf8, 0x79, 0x79, 0x61, 0x4f, - 0x55, 0xc9, 0x01, 0xe9, 0xd5, 0xa5, 0xa0, 0x33, 0xaa, 0xe3, 0x3e, 0x60, - 0x5e, 0x2c, 0x9c, 0xff, 0x90, 0x19, 0x70, 0x63, 0xc1, 0xd6, 0x62, 0x5f, - 0x8e, 0x72, 0x35, 0xeb, 0x65, 0xd8, 0x11, 0xce, 0xb3, 0xe6, 0x98, 0x90, - 0xd2, 0x01, 0xc6, 0x7b, 0x69, 0xc9, 0x21, 0x3a, 0x70, 0x29, 0x79, 0x07, - 0x9d, 0x1c, 0x51, 0x0a, 0x20, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x18, - 0xb7, 0x8e, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, 0x9b, 0x4c, 0x76, 0xef, - 0xef, 0x63, 0x9b, 0x94, 0xa2, 0xbc, 0xc7, 0x3b, 0x37, 0x8a, 0xe2, 0x2d, - 0xb1, 0xe1, 0xb5, 0x8d, 0x11, 0xfb, 0xd8, 0xae, 0x01, 0x5a, 0x4a, 0xc5, - 0x52, 0xc4, 0xf8, 0x7a, 0xb8, 0xfe, 0x10, 0xb4, 0x17, 0x0f, 0x56, 0xdb, - 0x7d, 0xc2, 0xdb, 0xea, 0xcb, 0x66, 0x9a, 0xc1, 0xe9, 0xa1, 0x2a, 0x3f, - 0xc7, 0xa5, 0xe4, 0x52, 0x97, 0x77, 0x14, 0x29, 0xaa, 0xef, 0x38, 0xb9, - 0xc1, 0xd6, 0x62, 0x5a, 0x8e, 0x72, 0x35, 0xe9, 0x65, 0xd8, 0x11, 0x4e, - 0x93, 0xe6, 0x98, 0x90, 0x3a, 0x70, 0xb5, 0x94, 0xef, 0xac, 0xb0, 0x84, - 0xfd, 0xcf, 0xed, 0x8d, 0x85, 0xcb, 0xac, 0x08, 0x95, 0x66, 0x5e, 0xeb, - 0x06, 0xd0, 0x3b, 0xb7, 0x93, 0x62, 0x00, 0x1b, 0x03, 0x30, 0x6b, 0xb4, - 0x8a, 0xcf, 0x6f, 0x75, 0x91, 0x98, 0xd2, 0xa8, 0xe3, 0xb3, 0xf8, 0x3b, - 0x11, 0xf2, 0x1e, 0xf1, 0xd9, 0xe1, 0x26, 0xbc, 0xb1, 0xe8, 0x49, 0x0d, - 0x67, 0xcf, 0xde, 0x69, 0xdc, 0xcd, 0xa6, 0xa5, 0x62, 0x7a, 0x2e, 0x0c, - 0x6a, 0x67, 0xe9, 0xd3, 0xcf, 0x44, 0xfe, 0xfa, 0x75, 0xbd, 0xcb, 0xe3, - 0xf1, 0x30, 0x12, 0xeb, 0xc6, 0xbf, 0x39, 0xbe, 0xd5, 0x08, 0xc2, 0xdd, - 0xfe, 0x07, 0xbb, 0x0c, 0xcd, 0xc4, 0x64, 0x56, 0x88, 0x7b, 0x36, 0xef, - 0x02, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0xb8, 0x91, 0x89, 0xe6, 0x25, 0x41, - 0xc5, 0x43, 0xdc, 0x5e, 0x9e, 0xd2, 0x82, 0x4c, 0xe7, 0xfb, 0x1f, 0x24, - 0x43, 0x55, 0x8e, 0x75, 0x29, 0x4c, 0xfe, 0xe0, 0xfe, 0x2f, 0xc3, 0x57, - 0x0f, 0xbb, 0x19, 0xbd, 0x97, 0x09, 0xbc, 0x18, 0xeb, 0xc8, 0x08, 0xad, - 0xdd, 0xe1, 0xde, 0xce, 0xc6, 0x86, 0x01, 0x19, 0x4a, 0x09, 0x0c, 0x5a, - 0x38, 0x4f, 0xd9, 0x1a, 0xd0, 0xed, 0x3e, 0x99, 0x26, 0xa1, 0x99, 0x68, - 0x87, 0xe5, 0x4c, 0xb3, 0x42, 0x91, 0xca, 0x81, 0x7a, 0x56, 0xc9, 0xd9, - 0xcb, 0x7a, 0xa0, 0x01, 0x73, 0xd4, 0xc0, 0x2f, 0x57, 0x6a, 0x97, 0xea, - 0x6f, 0x29, 0x94, 0x0a, 0xac, 0x9d, 0xd8, 0x29, 0xc4, 0xc8, 0x62, 0x5a, - 0x8c, 0x7d, 0x35, 0xe9, 0x02, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0x98, 0x90, - 0x89, 0xe6, 0x25, 0x41, 0xc5, 0x43, 0xdc, 0x5e, 0x9e, 0xd2, 0x82, 0x4c, - 0xe7, 0xfb, 0x1f, 0x24, 0x63, 0xb3, 0x24, 0x75, 0x95, 0xc6, 0xf8, 0xdb, - 0x6f, 0x39, 0xd5, 0xae, 0x33, 0xb0, 0x64, 0x3a, 0x95, 0x0e, 0xbf, 0x1f, - 0xeb, 0xc8, 0x0c, 0xa7, 0xdd, 0xe1, 0xdc, 0xcb, 0xc6, 0x86, 0x00, 0x1b, - 0x4a, 0x09, 0x0c, 0x5a, 0x38, 0x4f, 0xd9, 0x1a, 0xd0, 0xed, 0x3e, 0x99, - 0x26, 0xa1, 0x99, 0x68, 0x02, 0x49, 0x86, 0xf7, 0xe9, 0xbf, 0xd9, 0x24, - 0xa9, 0x91, 0x4a, 0xa7, 0x1a, 0xc9, 0xc2, 0xb2, 0x73, 0xc5, 0xc0, 0x58, - 0x57, 0x6a, 0x97, 0xea, 0x6f, 0x2e, 0x94, 0x0a, 0xac, 0x9d, 0xd8, 0x29, - 0xc4, 0xc8, 0x62, 0x5a, 0x8c, 0x7d, 0x35, 0xe9, 0x02, 0xd8, 0x11, 0xce, - 0xbe, 0xe6, 0x98, 0x90, 0x6b, 0xd4, 0xed, 0xf7, 0x2e, 0xb8, 0x58, 0x9b, - 0x29, 0x86, 0x43, 0xfb, 0x41, 0x37, 0x69, 0x2c, 0x3b, 0x94, 0x5e, 0x5f, - 0xc5, 0x75, 0x06, 0x80, 0x4b, 0x9f, 0x0c, 0xb4, 0xa2, 0x53, 0xb4, 0xf7, - 0x95, 0x0e, 0xbf, 0x1f, 0xeb, 0xc8, 0x0c, 0xad, 0xdd, 0xe1, 0xdc, 0xce, - 0xc6, 0x86, 0x00, 0x19, 0x4a, 0x09, 0x0c, 0x5a, 0x38, 0x4f, 0xd9, 0x1a, - 0xd0, 0xed, 0x3e, 0x99, 0x26, 0xa1, 0x99, 0x68, 0x18, 0xf2, 0x77, 0x2a, - 0x3b, 0x7c, 0xdd, 0xae, 0x5d, 0x53, 0x51, 0x0d, 0x00, 0x27, 0xb6, 0x9c, - 0x9d, 0x66, 0x14, 0xb8, 0xae, 0x7d, 0x94, 0xff, 0x31, 0xff, 0xf2, 0x53, - 0x81, 0xdb, 0x2e, 0xbb, 0xc4, 0xc8, 0x62, 0x5a, 0x8c, 0x7d, 0x35, 0xe9, - 0x02, 0xd8, 0x11, 0x4e, 0xbe, 0xe6, 0x98, 0x90, 0x79, 0x76, 0x3d, 0xa5, - 0x20, 0xd0, 0x0f, 0xbe, 0x4a, 0x44, 0xe9, 0x9f, 0xba, 0x64, 0xcb, 0xf5, - 0xc8, 0x34, 0xe3, 0x37, 0xb8, 0x6b, 0x1a, 0x43, 0xff, 0x9a, 0x35, 0x0f, - 0x3f, 0x66, 0xbe, 0x3b, 0x2b, 0xb4, 0x73, 0x5b, 0x75, 0x9f, 0xc5, 0x42, - 0x79, 0x69, 0xcd, 0x62, 0x14, 0x5e, 0x2a, 0xda, 0x6a, 0xf1, 0x90, 0x4a, - 0x24, 0x84, 0xb9, 0xe2, 0x62, 0x79, 0xc3, 0xc3, 0x47, 0xac, 0xd7, 0xba, - 0xdc, 0x83, 0x80, 0xcd, 0xcd, 0xdd, 0xf2, 0x8a, 0xa8, 0xbc, 0xa4, 0x4d, - 0x8c, 0x63, 0xc1, 0x04, 0xa3, 0x40, 0xdd, 0x7b, 0x40, 0x52, 0x2c, 0xb6, - 0x24, 0x94, 0x77, 0x93, 0xa4, 0x0b, 0x1b, 0x4e, 0x0c, 0x24, 0x83, 0x22, - 0x83, 0x37, 0xa2, 0xb7, 0x00, 0xe0, 0x7c, 0x37, 0xeb, 0xbd, 0x47, 0x75, - 0x34, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0xcc, 0x45, 0x0a, 0x37, 0xc4, 0xcb, 0x09, 0xca, 0xb8, 0x9e, 0x0f, 0x81, - 0xc9, 0xf1, 0xf5, 0xfc, 0x33, 0xc1, 0x51, 0x1e, 0x04, 0x42, 0xe9, 0x09, - 0x2e, 0x73, 0x2f, 0xde, 0x64, 0x9c, 0x79, 0x5a, 0xcc, 0x85, 0x2b, 0x9b, - 0xca, 0x32, 0x51, 0x4c, 0x39, 0x40, 0xe8, 0x4c, 0x60, 0x92, 0x14, 0x93, - 0xa4, 0x9f, 0x86, 0xab, 0x24, 0x36, 0x44, 0x66, 0x97, 0x36, 0xdb, 0x59, - 0x2b, 0x89, 0x72, 0x80, 0x8e, 0xcc, 0xe0, 0xba, 0xea, 0xbc, 0x90, 0xec, - 0x89, 0xcd, 0x21, 0x6e, 0xd8, 0xf5, 0xc1, 0x0e, 0x15, 0x31, 0x50, 0x47, - 0xd9, 0xaf, 0xea, 0x86, 0x06, 0x2c, 0x13, 0x94, 0xdb, 0xa8, 0xf4, 0x2e, - 0x1b, 0xf0, 0x08, 0xcb, 0x85, 0x60, 0xd4, 0x27, 0xc3, 0xb0, 0xad, 0x8e, - 0x64, 0xee, 0xf8, 0xf7, 0xd8, 0xc0, 0x2e, 0xd0, 0x79, 0x40, 0x14, 0xb4, - 0x7d, 0xd0, 0x5d, 0xb0, 0xbf, 0x13, 0x39, 0xee, 0xd2, 0x98, 0xbd, 0x44, - 0xa8, 0x12, 0xdd, 0x16, 0x9e, 0x82, 0xd9, 0x86, 0xce, 0xac, 0x4f, 0x52, - 0xae, 0xfc, 0xb2, 0xba, 0x6c, 0x27, 0x6b, 0xbf, 0x8e, 0x42, 0xd6, 0x93, - 0xd5, 0x09, 0xe4, 0xf7, 0x0e, 0x78, 0xd1, 0xb3, 0x10, 0xf9, 0xe4, 0x32, - 0x5e, 0x98, 0xfd, 0x8b, 0xc8, 0x12, 0x60, 0x78, 0xb4, 0xd1, 0x84, 0xad, - 0x51, 0x1a, 0x37, 0xb0, 0x3b, 0xc6, 0xb6, 0xf5, 0xe4, 0x40, 0xcc, 0xd7, - 0x78, 0xb4, 0xe7, 0x38, 0xdd, 0x66, 0xe7, 0x14, 0x44, 0x6d, 0x05, 0x20, - 0xcf, 0xa7, 0x27, 0xf5, 0xde, 0x0f, 0xb3, 0x12, 0xec, 0xef, 0x1a, 0xa9, - 0xfc, 0xb1, 0x5a, 0xaf, 0xbc, 0x5f, 0x91, 0x12, 0x96, 0xc1, 0xd3, 0xff, - 0x64, 0x89, 0x29, 0xf4, 0xd8, 0xcf, 0x20, 0xff, 0x77, 0x2b, 0x81, 0xd9, - 0x78, 0xdb, 0xb7, 0xe4, 0xd0, 0xd0, 0x48, 0xab, 0x15, 0x14, 0xb3, 0x75, - 0x47, 0x8d, 0xd2, 0x4d, 0x95, 0x6d, 0xfa, 0x9a, 0xdf, 0x68, 0x79, 0xc2, - 0x76, 0x1f, 0xe1, 0x58, 0x62, 0x75, 0xc4, 0x67, 0xff, 0x64, 0x45, 0xbc, - 0x28, 0x05, 0x2b, 0x8f, 0x9a, 0x1e, 0x89, 0x60, 0x02, 0x66, 0xd7, 0x4d, - 0x76, 0xe4, 0x17, 0xe9, 0xd8, 0xe1, 0xdc, 0x8f, 0xd5, 0x72, 0x2d, 0x87, - 0xc0, 0x93, 0xd0, 0x4a, 0x3e, 0xf7, 0x1d, 0x7f, 0x76, 0x28, 0x9a, 0x13, - 0xd7, 0xe0, 0x55, 0xea, 0xa9, 0x5e, 0x39, 0x58, 0xa2, 0x7a, 0x35, 0xd8, - 0xe8, 0x69, 0x91, 0xb6, 0x11, 0x72, 0x34, 0x82, 0xb7, 0x2c, 0xbd, 0x98, - 0x94, 0x4b, 0xc0, 0xf5, 0x3a, 0x9b, 0x02, 0x09, 0x94, 0x21, 0xa6, 0x12, - 0xf6, 0x3e, 0x97, 0x5f, 0xe6, 0x9b, 0x69, 0x9b, 0x7a, 0x09, 0x6c, 0x9a, - 0x20, 0x90, 0xe0, 0x00, 0x90, 0x55, 0xe8, 0xe8, 0xdd, 0x86, 0x49, 0xb3, - 0x61, 0xfa, 0x23, 0x27, 0x91, 0x32, 0xcd, 0x83, 0xbe, 0xa6, 0x98, 0x5e, - 0xdd, 0x57, 0xb1, 0x56, 0x79, 0x34, 0xa9, 0x19, 0xc5, 0x39, 0xfc, 0x9b, - 0x9d, 0x82, 0x9b, 0x18, 0x65, 0xee, 0xba, 0x2e, 0x23, 0xb3, 0xb8, 0x5a, - 0x83, 0x67, 0x04, 0x95, 0xc1, 0x0b, 0xfa, 0x05, 0xd4, 0x0b, 0xab, 0x75, - 0xa2, 0xde, 0x6f, 0xfe, 0x3b, 0x34, 0xba, 0xce, 0xc7, 0xaf, 0xd1, 0x2a, - 0x25, 0x8d, 0x33, 0xb4, 0xba, 0xad, 0xf9, 0x1f, 0xa4, 0xb6, 0x99, 0x39, - 0x49, 0x17, 0xc7, 0xea, 0xad, 0xa2, 0x4c, 0xb4, 0xf9, 0x5e, 0xd2, 0x73, - 0x5c, 0xf8, 0x16, 0x8c, 0x1d, 0x3f, 0x3f, 0xa8, 0xbf, 0x11, 0x1a, 0x35, - 0x92, 0xc0, 0x08, 0x83, 0xc3, 0x27, 0xa4, 0xad, 0x78, 0xc6, 0x39, 0xd3, - 0x80, 0xb0, 0xd2, 0x87, 0x0c, 0x3a, 0x3f, 0x5a, 0x4f, 0x6a, 0x96, 0xe4, - 0x69, 0x4b, 0x47, 0x1a, 0xea, 0x09, 0xab, 0xd6, 0xcb, 0xbd, 0x18, 0xd4, - 0xfb, 0xd1, 0x1a, 0xda, 0xed, 0x78, 0x5e, 0x6f, 0x3b, 0xa2, 0xaa, 0x47, - 0x24, 0x8e, 0x90, 0xce, 0x57, 0x6c, 0xac, 0x48, 0xd6, 0xe7, 0x8e, 0x35, - 0x26, 0x26, 0xa4, 0x39, 0x45, 0x2f, 0x8c, 0xe1, 0xb4, 0xce, 0x06, 0xf2, - 0x92, 0x27, 0xd1, 0x02, 0x10, 0xdb, 0x6f, 0xa5, 0x7f, 0xa1, 0x80, 0x7f, - 0xc7, 0x52, 0x15, 0x1b, 0x92, 0xda, 0xaf, 0xc1, 0x49, 0xe2, 0x85, 0x8b, - 0xa9, 0x7e, 0x3e, 0x69, 0xae, 0xb1, 0xaa, 0x0e, 0x00, 0x81, 0xbc, 0xc0, - 0xb1, 0x9e, 0x2c, 0x48, 0x4b, 0xc6, 0xf0, 0x76, 0x0e, 0x10, 0x64, 0x85, - 0xf2, 0x1e, 0xd7, 0x3e, 0x31, 0x71, 0x78, 0x44, 0xf6, 0x58, 0xbe, 0x2c, - 0x9a, 0x2f, 0xbf, 0x5b, 0x74, 0x13, 0xdb, 0x32, 0x29, 0xc7, 0x18, 0xc3, - 0x1b, 0x52, 0xdd, 0xcc, 0xed, 0xc8, 0x92, 0x10, 0xa3, 0x18, 0x31, 0x39, - 0xeb, 0x4b, 0x3d, 0x61, 0x67, 0x9a, 0x21, 0xbe, 0xba, 0x18, 0x39, 0x0d, - 0x1d, 0xa3, 0xef, 0xb9, 0xc2, 0xcc, 0x45, 0x11, 0xc8, 0x91, 0xcf, 0x16, - 0x81, 0x6f, 0x82, 0x1d, 0x46, 0x1f, 0x9e, 0x09, 0x41, 0x34, 0xb0, 0xab, - 0x7a, 0x81, 0x4b, 0x4d, 0x5b, 0xde, 0xf8, 0xd4, 0x32, 0x67, 0x76, 0xf3, - 0xb8, 0xf7, 0xd0, 0xcd, 0x5c, 0x23, 0x34, 0xca, 0xf6, 0xd7, 0x66, 0x11, - 0x68, 0x64, 0x4e, 0xaa, 0xfa, 0x9c, 0x77, 0xf6, 0x18, 0x6c, 0x16, 0x83, - 0xa6, 0xe0, 0x47, 0x82, 0x6f, 0xc7, 0x79, 0x98, 0xf5, 0x21, 0x9d, 0x8a, - 0x1f, 0x5c, 0xa4, 0x4a, 0x12, 0x95, 0xbd, 0x6b, 0x79, 0x1b, 0x4f, 0xb5, - 0x28, 0x17, 0x1a, 0x86, 0x00, 0x99, 0x4e, 0xec, 0xc8, 0x5d, 0x97, 0x2c, - 0x03, 0x81, 0x7a, 0x0c, 0xa0, 0x18, 0xe5, 0x94, 0xbd, 0xfd, 0xf1, 0xcb, - 0x77, 0xbd, 0x39, 0x0d, 0xc5, 0x92, 0x43, 0x31, 0xbc, 0x63, 0x16, 0xcc, - 0x6b, 0x39, 0x48, 0xf9, 0x81, 0x92, 0xa8, 0x65, 0x75, 0x4f, 0x53, 0x19, - 0x8c, 0x3d, 0x5c, 0x3a, 0x96, 0x69, 0xf2, 0xed, 0x3d, 0xe4, 0xf2, 0x67, - 0xdc, 0x60, 0x44, 0x60, 0xe3, 0x8b, 0xf8, 0x61, 0xa9, 0x7b, 0x36, 0x22, - 0x22, 0x18, 0x50, 0x60, 0x4d, 0xfa, 0xec, 0x5c, 0x80, 0xc7, 0x66, 0x2b, - 0xc1, 0xcc, 0x5d, 0x66, 0x52, 0x64, 0x0a, 0xd6, 0x7f, 0x43, 0x29, 0x61, - 0x0a, 0x74, 0xc1, 0xfe, 0xda, 0x68, 0x2c, 0xae, 0xc7, 0x42, 0xbc, 0xe6, - 0x38, 0xd7, 0x56, 0xbc, 0x68, 0x74, 0x1a, 0x14, 0x79, 0x56, 0xfd, 0x0a, - 0x09, 0x15, 0x61, 0x14, 0x18, 0x01, 0xf4, 0x41, 0xad, 0xef, 0xb5, 0x0a, - 0xb3, 0x18, 0x5b, 0xeb, 0x00, 0xb6, 0xcc, 0x61, 0xe2, 0x3e, 0x36, 0x52, - 0xa4, 0x9e, 0x08, 0x86, 0x58, 0x00, 0xbd, 0xdb, 0x06, 0x68, 0xec, 0x2c, - 0xe5, 0xc6, 0x3e, 0xb2, 0x86, 0x66, 0xaa, 0xfd, 0xb6, 0xcc, 0x32, 0x2c, - 0xab, 0x9a, 0x4c, 0x2a, 0x33, 0x6f, 0x1b, 0xa7, 0x45, 0x94, 0x29, 0x26, - 0xe0, 0xe6, 0x88, 0xc8, 0xac, 0xc1, 0x9e, 0x31, 0x58, 0xa5, 0xd5, 0x45, - 0xbb, 0x4c, 0x05, 0xbb, 0x65, 0xbe, 0x35, 0x52, 0x48, 0x82, 0x9d, 0xd3, - 0x64, 0xcf, 0x41, 0x93, 0xf0, 0x71, 0xf2, 0xce, 0xc4, 0x43, 0x39, 0x48, - 0xda, 0xd0, 0xe7, 0xaf, 0x26, 0xda, 0x84, 0x4b, 0x5b, 0x8b, 0x94, 0xa6, - 0x27, 0x19, 0x36, 0xf0, 0x93, 0x32, 0x63, 0x5f, 0x36, 0xac, 0x68, 0x20, - 0x96, 0x12, 0xbf, 0x80, 0xb2, 0x3a, 0xa6, 0x72, 0xd5, 0xeb, 0x4b, 0x9d, - 0xe1, 0x49, 0x17, 0xc0, 0x3c, 0x38, 0x0e, 0x27, 0x4f, 0x6b, 0x4a, 0x30, - 0x51, 0x7f, 0xf0, 0x6a, 0xda, 0xd6, 0x83, 0xd7, 0xfb, 0x4f, 0x6a, 0x2f, - 0x53, 0x2c, 0x0d, 0x6c, 0xdb, 0xb0, 0x51, 0x63, 0x0a, 0x05, 0xdb, 0xc5, - 0xc0, 0x0c, 0x5d, 0x3e, 0x77, 0xc3, 0x44, 0xe6, 0x63, 0x06, 0xab, 0xb6, - 0x0a, 0xf9, 0x92, 0x88, 0xb7, 0x0e, 0x91, 0x92, 0xe8, 0xba, 0x09, 0xc8, - 0x6c, 0x5d, 0xfe, 0x0f, 0xe6, 0x15, 0xec, 0xf8, 0x3c, 0x1a, 0xde, 0xcf, - 0xa9, 0xdd, 0x82, 0xb3, 0x23, 0x1a, 0xb5, 0x6d, 0xb4, 0xac, 0xdf, 0x0f, - 0x34, 0x20, 0x26, 0x4e, 0xc9, 0x7d, 0x8f, 0xb5, 0xf2, 0x73, 0x49, 0x61, - 0x7c, 0xf0, 0x47, 0xf2, 0x61, 0xc2, 0x73, 0x82, 0x28, 0x07, 0x77, 0xe0, - 0xb5, 0xfb, 0x3a, 0x83, 0x92, 0xe4, 0xfb, 0xd5, 0xa7, 0xdd, 0xde, 0x19, - 0x85, 0x7e, 0x87, 0xdf, 0x3e, 0xba, 0x4b, 0x93, 0x3e, 0xb1, 0xea, 0xba, - 0x38, 0x03, 0x20, 0x4b, 0xee, 0xc8, 0xfa, 0x86, 0x4a, 0xb0, 0x34, 0x8a, - 0x57, 0x75, 0xd4, 0x3c, 0x2c, 0x16, 0x9b, 0x42, 0xee, 0x51, 0xc5, 0xeb, - 0x19, 0x39, 0x3b, 0x46, 0x9f, 0xee, 0x20, 0x7b, 0x95, 0x60, 0xc1, 0xa7, - 0x74, 0x40, 0xe2, 0x2d, 0xe2, 0xc0, 0x2e, 0x71, 0x04, 0x6f, 0x58, 0xd3, - 0x42, 0x7c, 0x77, 0x96, 0x08, 0xaf, 0xb6, 0x47, 0xf9, 0xed, 0x71, 0xde, - 0xfc, 0xd5, 0x62, 0xe4, 0xb2, 0xab, 0xed, 0xd6, 0xa7, 0xd0, 0xd0, 0x03, - 0x58, 0xdf, 0xf8, 0x3f, 0xb2, 0xea, 0x25, 0xdd, 0x2a, 0xb0, 0x89, 0x5f, - 0xd0, 0xf9, 0x07, 0x82, 0xa6, 0x70, 0x80, 0x52, 0xe0, 0x24, 0x00, 0xae, - 0x78, 0x73, 0xd8, 0x0c, 0xfd, 0x8c, 0xce, 0xa9, 0xa0, 0x8b, 0x70, 0x4c, - 0xd3, 0x86, 0xcf, 0xd4, 0x5e, 0x40, 0x63, 0x6b, 0xe6, 0xee, 0x1b, 0x50, - 0xaf, 0x33, 0x3c, 0x7f, 0x85, 0x75, 0x6d, 0x15, 0x39, 0x38, 0xc5, 0xb1, - 0x1b, 0xb6, 0xdf, 0x5b, 0x0a, 0xe3, 0x44, 0x9c, 0x72, 0x7b, 0x3d, 0x12, - 0x2b, 0x42, 0x98, 0xf2, 0x2a, 0xe4, 0xd5, 0x64, 0xb4, 0xd3, 0x2a, 0xcf, - 0xd7, 0x71, 0xd0, 0x4f, 0x6e, 0xd5, 0xb6, 0x56, 0x3b, 0x94, 0x4e, 0xca, - 0x87, 0x25, 0x0b, 0xf2, 0x03, 0x55, 0xb9, 0xe5, 0x1d, 0x8e, 0xea, 0x79, - 0x4a, 0xe9, 0x08, 0xcf, 0xd1, 0x8f, 0xe5, 0x3d, 0x43, 0x9a, 0x76, 0xdc, - 0x26, 0x45, 0xe8, 0xdb, 0xfc, 0x3d, 0x59, 0xce, 0xd4, 0x5b, 0x2d, 0x59, - 0x0d, 0xfb, 0xe5, 0x45, 0xb7, 0x60, 0xe0, 0x9d, 0xea, 0x46, 0xa0, 0xa7, - 0x30, 0xad, 0x8a, 0x6f, 0x08, 0x9d, 0xc8, 0x9d, 0x0b, 0x42, 0xfd, 0xb7, - 0xb7, 0x46, 0x2e, 0xb3, 0x3e, 0xe4, 0xe5, 0x32, 0xda, 0xca, 0x09, 0xd2, - 0x97, 0xc2, 0x3f, 0xc8, 0x12, 0x76, 0xcf, 0x3a, 0x39, 0xbf, 0x00, 0x20, - 0x87, 0x9d, 0xc9, 0x65, 0xfc, 0x64, 0x56, 0xab, 0xd8, 0x30, 0xee, 0x6e, - 0x87, 0x66, 0xa4, 0xca, 0x3b, 0x44, 0xd7, 0xe9, 0x7b, 0x2d, 0xbb, 0x0f, - 0x9d, 0x79, 0x26, 0xdd, 0x10, 0x64, 0xfe, 0x26, 0xe1, 0x84, 0x77, 0x5f, - 0xbd, 0x47, 0x8b, 0xc6, 0x6d, 0xaa, 0x2d, 0xbb, 0xba, 0x73, 0x6c, 0xb2, - 0xbd, 0x1c, 0xd9, 0x6e, 0x22, 0xac, 0x05, 0x27, 0xeb, 0xbe, 0x62, 0x9a, - 0x03, 0x76, 0x50, 0x80, 0x09, 0xf9, 0xb8, 0x1f, 0x2d, 0x1b, 0xfe, 0xa6, - 0x1f, 0xe1, 0xe8, 0x56, 0x25, 0x4d, 0x0c, 0xf9, 0x39, 0x4f, 0x1a, 0x0a, - 0x75, 0x6d, 0xec, 0xd5, 0x6e, 0x45, 0x10, 0x48, 0x41, 0x2f, 0x33, 0x2e, - 0xb9, 0xc9, 0x35, 0x97, 0xf0, 0x4f, 0xa6, 0xf5, 0x2c, 0x10, 0xf9, 0x62, - 0x01, 0x46, 0xbc, 0xb2, 0x7a, 0x99, 0xf9, 0xe3, 0xb8, 0x54, 0xf2, 0xd0, - 0xdd, 0x4e, 0x91, 0x12, 0x37, 0xdd, 0xb3, 0xff, 0x91, 0x54, 0xd1, 0xe7, - 0xb3, 0xff, 0x7b, 0x98, 0xbd, 0x44, 0x98, 0x02, 0x56, 0xae, 0x5f, 0x8d, - 0xd1, 0xdb, 0x4e, 0xa3, 0x6d, 0xb5, 0x6c, 0x85, 0xd6, 0x34, 0xe7, 0xe2, - 0x7c, 0x8f, 0xc4, 0x7d, 0x09, 0xbd, 0xb7, 0xd6, 0xe3, 0x1a, 0xf5, 0xd4, - 0xd5, 0xf3, 0x1c, 0x24, 0x26, 0x43, 0x47, 0x76, 0xce, 0xe2, 0xb8, 0xa4, - 0xfb, 0x47, 0xbf, 0x1e, 0x1d, 0x7b, 0xe9, 0xfd, 0x2e, 0x63, 0x1f, 0xd8, - 0xef, 0x03, 0x9b, 0x9b, 0x54, 0xc7, 0x92, 0xd2, 0x0b, 0x1b, 0x8b, 0xd5, - 0xb6, 0x71, 0xe4, 0x94, 0x4b, 0xa7, 0x48, 0x94, 0x61, 0x56, 0xa0, 0x35, - 0xd1, 0x4e, 0x17, 0xbe, 0xe4, 0x5b, 0x84, 0xcb, 0x9d, 0x61, 0xb6, 0x36, - 0x93, 0xbb, 0xdf, 0xd3, 0x80, 0x6c, 0xa7, 0x36, 0x08, 0xeb, 0x3c, 0x8e, - 0xc8, 0x39, 0x8a, 0xc5, 0x3c, 0x2e, 0x49, 0x5c, 0xcd, 0x36, 0xdd, 0xdc, - 0xc5, 0xc9, 0x28, 0x83, 0xaa, 0x7e, 0xd2, 0xb4, 0x7d, 0xa4, 0xa3, 0x1b, - 0xd7, 0x89, 0x94, 0x2e, 0x12, 0x28, 0xca, 0x87, 0x79, 0x87, 0x06, 0x74, - 0x01, 0x68, 0x1b, 0xd0, 0xd4, 0x22, 0xf6, 0xac, 0xa4, 0xf8, 0xab, 0x6f, - 0x8d, 0x4a, 0xd6, 0x5f, 0xe9, 0x06, 0x83, 0xe6, 0x1d, 0xea, 0x58, 0x16, - 0xe6, 0x4b, 0xa8, 0x69, 0x93, 0x69, 0x39, 0xa2, 0x28, 0x52, 0x4d, 0xc0, - 0xa9, 0x5e, 0xe3, 0xc7, 0xbc, 0x72, 0x36, 0x29, 0x98, 0x56, 0x02, 0xe8, - 0x70, 0xa2, 0xdd, 0x78, 0x64, 0xe7, 0xc1, 0x23, 0x8f, 0x96, 0x1d, 0x42, - 0xe3, 0x60, 0x5e, 0x81, 0x80, 0x1d, 0xa1, 0x02, 0x8e, 0x57, 0x8d, 0xd5, - 0x7f, 0x6d, 0x58, 0x62, 0x9e, 0x1f, 0x1f, 0xd8, 0x70, 0x46, 0x70, 0x73, - 0x3a, 0x20, 0x03, 0x81, 0xc4, 0xaf, 0x47, 0xf8, 0xeb, 0x30, 0xd2, 0x71, - 0x99, 0x14, 0xf9, 0x78, 0xaf, 0x87, 0x69, 0xc4, 0x57, 0x1a, 0x3f, 0xca, - 0xf7, 0x7f, 0x75, 0x09, 0xe5, 0xb6, 0x04, 0xca, 0x94, 0xbc, 0x20, 0x68, - 0x10, 0x91, 0xda, 0xe6, 0xe2, 0xd3, 0x74, 0x31, 0x1d, 0x27, 0x7f, 0x2b, - 0x13, 0x4b, 0xc8, 0x6a, 0x2f, 0xf9, 0xa9, 0x92, 0x24, 0x46, 0x99, 0x78, - 0x91, 0x47, 0xdc, 0xd2, 0xf0, 0xd5, 0x21, 0x02, 0x1a, 0xdd, 0xd7, 0xa3, - 0x5b, 0xc2, 0xbd, 0x85, 0x0e, 0x64, 0x31, 0xec, 0x76, 0x40, 0xb8, 0x65, - 0xc5, 0xf2, 0x99, 0xeb, 0xb5, 0x42, 0xa4, 0xc0, 0xb3, 0xb6, 0xa4, 0xda, - 0xce, 0x2c, 0x41, 0xc1, 0x96, 0x3c, 0xfd, 0x66, 0xd4, 0xeb, 0xbb, 0xf8, - 0x87, 0x99, 0x48, 0x41, 0x4e, 0x86, 0x97, 0x45, 0x7b, 0x58, 0xdd, 0xc2, - 0x49, 0xed, 0xd4, 0xe0, 0xcc, 0xb3, 0xe4, 0x6e, 0xd7, 0xe7, 0x75, 0x37, - 0x8b, 0x0a, 0x6c, 0x7a, 0x5a, 0x53, 0x82, 0x0d, 0x0b, 0xb5, 0xff, 0x3e, - 0x6e, 0x5a, 0xdf, 0x83, 0x9f, 0x83, 0xe4, 0x85, 0x1e, 0x77, 0x78, 0x88, - 0x78, 0xda, 0x49, 0xd0, 0x0e, 0xf0, 0x5a, 0x33, 0x44, 0xeb, 0x4f, 0x7f, - 0xc1, 0xe4, 0x94, 0xd5, 0x72, 0xfe, 0x94, 0x89, 0x67, 0x0f, 0xce, 0xd7, - 0xb9, 0x6a, 0xce, 0x98, 0x88, 0xc6, 0x09, 0xf0, 0xf0, 0x14, 0xbd, 0x80, - 0x36, 0x8b, 0x2e, 0xe0, 0x3b, 0x22, 0xb0, 0xa0, 0x29, 0xe0, 0xcb, 0x58, - 0xbb, 0xbc, 0xda, 0xb7, 0x33, 0xc4, 0x7a, 0x18, 0x39, 0x20, 0x20, 0x24, - 0xc5, 0x53, 0x41, 0x48, 0x17, 0x00, 0xf6, 0x6f, 0x65, 0xc2, 0x58, 0xc6, - 0xff, 0x1e, 0x73, 0xec, 0xde, 0xba, 0x83, 0x58, 0x00, 0x0f, 0x1d, 0x1e, - 0x63, 0x92, 0x50, 0xca, 0x89, 0xfb, 0xc5, 0x12, 0x95, 0x0d, 0x60, 0xb8, - 0xef, 0x34, 0xa4, 0x47, 0x00, 0x17, 0x96, 0xee, 0xb7, 0x37, 0xe0, 0xbf, - 0xb9, 0x0f, 0x5d, 0xb9, 0xd2, 0xcf, 0x46, 0x87, 0xe7, 0x9b, 0xa8, 0xea, - 0x79, 0x85, 0x61, 0x95, 0x48, 0x20, 0xec, 0x8e, 0xba, 0x97, 0x1e, 0x16, - 0x09, 0xe0, 0xd9, 0xc2, 0x1c, 0x22, 0x71, 0x22, 0x07, 0x31, 0x77, 0xdf, - 0x10, 0x8b, 0x1c, 0x6e, 0x87, 0x93, 0x6d, 0xc4, 0xa5, 0x84, 0xfb, 0x9d, - 0x7e, 0xf6, 0x94, 0x54, 0x20, 0xe0, 0x8a, 0x30, 0xbd, 0xe1, 0x6e, 0xee, - 0xd4, 0x66, 0x01, 0xdb, 0x57, 0x46, 0x33, 0xaa, 0xa7, 0x2b, 0x63, 0x83, - 0xfe, 0x07, 0x29, 0xe9, 0xe6, 0xb7, 0x28, 0x90, 0xa6, 0x5f, 0xd3, 0xc2, - 0x0e, 0x3c, 0xb1, 0xe1, 0x03, 0xfe, 0xd8, 0xf9, 0xb1, 0xad, 0xcc, 0x85, - 0xcc, 0x5c, 0x87, 0xc0, 0xdc, 0x3a, 0x16, 0x6c, 0x19, 0x97, 0xea, 0x14, - 0xb6, 0xd1, 0x81, 0x92, 0x7d, 0xdb, 0x24, 0x1d, 0x4b, 0xf6, 0xd4, 0x2f, - 0x0d, 0x67, 0xf1, 0x6f, 0x5f, 0xc4, 0x4d, 0x75, 0x69, 0x91, 0x18, 0x91, - 0x25, 0xe8, 0x29, 0x3b, 0xbd, 0x38, 0x6a, 0xf4, 0xb3, 0xf1, 0xdd, 0xc2, - 0x2a, 0x2d, 0x6c, 0x73, 0xf0, 0x73, 0xa4, 0x08, 0xd2, 0x78, 0xd6, 0x07, - 0x70, 0x7b, 0x64, 0x61, 0xbc, 0xbd, 0xdc, 0x16, 0x0f, 0x26, 0x66, 0x22, - 0x7e, 0xea, 0x4e, 0xc5, 0xe4, 0x1c, 0x8d, 0x0d, 0x46, 0x17, 0xc3, 0xc0, - 0xd7, 0x84, 0x63, 0xfc, 0xae, 0x99, 0x87, 0xa4, 0xec, 0x52, 0xb7, 0xb8, - 0x67, 0x4b, 0x82, 0xa4, 0x5e, 0x3e, 0xf2, 0x6f, 0xa0, 0x07, 0xd4, 0x49, - 0xb6, 0xda, 0x71, 0x43, 0x64, 0x68, 0x7a, 0xff, 0x4e, 0xef, 0x03, 0x76, - 0x3a, 0x0c, 0xb1, 0xa3, 0xab, 0x20, 0x68, 0x55, 0x0f, 0xd2, 0x1f, 0x93, - 0x9c, 0x18, 0xb0, 0xff, 0x26, 0x85, 0x8b, 0x5f, 0xcd, 0x81, 0xb2, 0x2c, - 0xa5, 0xec, 0x80, 0x11, 0xc5, 0xa6, 0x4e, 0xd0, 0x06, 0xb3, 0x9b, 0xaa, - 0x58, 0x7a, 0x6b, 0xac, 0xe5, 0x5f, 0xc6, 0xa9, 0x3c, 0x8f, 0xeb, 0x4d, - 0x78, 0xf3, 0xa2, 0x45, 0xec, 0x36, 0x7c, 0x24, 0xf0, 0x31, 0x84, 0xc1, - 0xb4, 0x39, 0x8a, 0x9a, 0xb4, 0x28, 0x00, 0xaa, 0xdd, 0xbf, 0xe0, 0x1f, - 0x49, 0x78, 0x0c, 0xb4, 0xb2, 0x9f, 0xcf, 0xca, 0x4e, 0x47, 0x0f, 0x45, - 0xb9, 0xf0, 0x7b, 0x36, 0x65, 0x4c, 0xa4, 0x2b, 0x7f, 0x18, 0xe8, 0x22, - 0x70, 0x1c, 0xae, 0xb4, 0x8b, 0xb7, 0x25, 0x78, 0x07, 0x53, 0x92, 0x8a, - 0x1f, 0x74, 0x4f, 0xb5, 0x6a, 0xfa, 0xbc, 0x61, 0x28, 0xa4, 0xdb, 0x82, - 0x91, 0x75, 0x4b, 0xbc, 0x45, 0x13, 0x4f, 0xa4, 0x65, 0xad, 0x7a, 0x39, - 0xd1, 0x9d, 0x0e, 0x50, 0x03, 0xc0, 0x2b, 0xc5, 0xb0, 0xd6, 0xc3, 0x8f, - 0x4d, 0xda, 0xa8, 0x56, 0xf6, 0xf2, 0x94, 0x17, 0xe9, 0x09, 0xf9, 0xd9, - 0x46, 0x0c, 0x2f, 0x8d, 0x63, 0xad, 0x02, 0xcc, 0x6f, 0x66, 0xdd, 0xcb, - 0xc2, 0x67, 0xa3, 0x91, 0x9e, 0xdd, 0xe8, 0xfb, 0x07, 0xca, 0x1c, 0x4d, - 0x89, 0x15, 0x1f, 0x17, 0xdd, 0x9e, 0xfe, 0xca, 0x09, 0x47, 0xbc, 0x56, - 0x68, 0x89, 0x02, 0xfb, 0x2f, 0x4c, 0xd2, 0x28, 0x0a, 0x63, 0xcb, 0x84, - 0x58, 0xd1, 0xa0, 0xcd, 0x0d, 0xfd, 0x16, 0xf9, 0x41, 0x1d, 0xb9, 0x0a, - 0x15, 0xe4, 0x20, 0x37, 0x2b, 0xcd, 0x13, 0xfe, 0xfd, 0x3c, 0x9c, 0x13, - 0x3b, 0xbf, 0xc7, 0xd2, 0xb9, 0xfc, 0xf6, 0xac, 0x7b, 0x2d, 0xb7, 0xe5, - 0xc9, 0x36, 0xfc, 0x0a, 0x8c, 0x80, 0x63, 0x37, 0xd4, 0x66, 0x88, 0x93, - 0xac, 0xc0, 0x69, 0xbc, 0x44, 0xdd, 0xf7, 0xd3, 0x25, 0x76, 0xd7, 0x76, - 0x80, 0x45, 0x90, 0xe6, 0x62, 0x6c, 0xfd, 0xde, 0xbe, 0x9c, 0x86, 0x06, - 0xb2, 0x0b, 0x80, 0xd6, 0x44, 0xf6, 0x11, 0xb7, 0x81, 0x69, 0xbe, 0x4f, - 0x25, 0x77, 0xc5, 0x07, 0x96, 0x25, 0x00, 0xe5, 0x6b, 0xdd, 0xfb, 0x9b, - 0x5e, 0x5c, 0x79, 0xd2, 0xfb, 0xd3, 0xd1, 0x2e, 0xfa, 0x7e, 0x18, 0x4d, - 0x09, 0x46, 0x62, 0xda, 0x95, 0xa5, 0x38, 0x6d, 0xc9, 0x49, 0x79, 0xa9, - 0x17, 0xd1, 0x6f, 0x19, 0xfe, 0xae, 0xeb, 0xb8, 0x27, 0xde, 0x57, 0xf6, - 0x3a, 0xca, 0xf3, 0xc8, 0xc4, 0x61, 0x33, 0x54, 0x6f, 0xb0, 0x5c, 0x12, - 0x3c, 0x3f, 0xa6, 0xe4, 0xf3, 0x52, 0x84, 0xc8, 0xba, 0xc3, 0x3f, 0x69, - 0x8a, 0x8b, 0x99, 0x96, 0x09, 0xfb, 0x7b, 0x61, 0x21, 0xd3, 0x3a, 0x3e, - 0xad, 0xb6, 0x90, 0xfd, 0xfd, 0x5b, 0x8c, 0xe2, 0x52, 0xad, 0xd6, 0x63, - 0xa8, 0xc2, 0xbb, 0x02, 0x42, 0x5f, 0x63, 0x7f, 0xfe, 0xf0, 0x19, 0x7b, - 0xc6, 0x7f, 0xd2, 0x15, 0x8f, 0x49, 0x40, 0xee, 0x3c, 0x13, 0xf6, 0x4c, - 0x4a, 0xa2, 0x3d, 0x78, 0x45, 0x9c, 0xae, 0xe5, 0x5d, 0xc2, 0xd8, 0x93, - 0xe3, 0x96, 0x43, 0x14, 0x11, 0xb1, 0x8a, 0xf2, 0x1a, 0x9e, 0xf5, 0x68, - 0x2a, 0x52, 0xe1, 0x53, 0x7f, 0x1e, 0x63, 0x77, 0x7e, 0x03, 0x26, 0xc7, - 0xeb, 0xb5, 0xf1, 0x13, 0x8b, 0x8b, 0x6b, 0x32, 0xf3, 0x6e, 0x56, 0xab, - 0xbd, 0x54, 0x4b, 0x21, 0x36, 0xbb, 0xa5, 0x0d, 0x87, 0x81, 0x27, 0x09, - 0xa3, 0x23, 0x56, 0x6b, 0xd0, 0x47, 0x02, 0x05, 0x84, 0x1d, 0xce, 0xca, - 0xa6, 0xa2, 0x79, 0x99, 0x8d, 0x8a, 0x0c, 0x17, 0xfb, 0xe9, 0x44, 0x90, - 0x3a, 0x17, 0xcd, 0x69, 0xac, 0x77, 0x14, 0x68, 0xf0, 0x68, 0x74, 0xb9, - 0x84, 0xb2, 0x7e, 0xe4, 0xf8, 0x07, 0xd1, 0xc1, 0x84, 0xa9, 0x44, 0x84, - 0xd9, 0x8b, 0x9a, 0xcb, 0x9a, 0x04, 0x1a, 0x77, 0x9b, 0x65, 0x55, 0xf2, - 0x96, 0x22, 0xe3, 0xc7, 0xc1, 0x8a, 0x9d, 0x8e, 0xf5, 0xea, 0x06, 0x8e, - 0x2f, 0xfd, 0x45, 0xab, 0xe1, 0x5b, 0x8a, 0x01, 0x18, 0xaf, 0x2a, 0x79, - 0xf3, 0x05, 0xaf, 0x33, 0x5e, 0x59, 0x46, 0xd0, 0x55, 0x53, 0x9a, 0xad, - 0x92, 0x32, 0x5e, 0x1a, 0xf2, 0x06, 0xd9, 0xcb, 0x3c, 0xbc, 0xf9, 0x86, - 0x06, 0x33, 0x25, 0x50, 0xe4, 0x9d, 0x75, 0xe1, 0x2e, 0xa7, 0x7d, 0x9e, - 0x53, 0xfa, 0xde, 0x64, 0xd4, 0x1a, 0x68, 0x32, 0x93, 0xe2, 0x71, 0x86, - 0x35, 0xbf, 0x47, 0x56, 0x15, 0xc5, 0x44, 0xc7, 0x34, 0xba, 0x3a, 0xa8, - 0x9a, 0x03, 0x53, 0xa0, 0xa8, 0x1c, 0xc5, 0x86, 0xa8, 0x29, 0xb7, 0x3a, - 0x86, 0xd2, 0xb9, 0x0d, 0x12, 0x51, 0x1d, 0x8e, 0x73, 0x1f, 0xe7, 0xf2, - 0x3e, 0xe2, 0x23, 0xd9, 0x59, 0xed, 0x7d, 0xf0, 0xa7, 0x29, 0xcf, 0xa6, - 0x93, 0x99, 0xf7, 0x04, 0x07, 0x0f, 0xbe, 0xaa, 0x28, 0x8f, 0x1e, 0xed, - 0x89, 0x83, 0xd0, 0x21, 0xb6, 0x42, 0xf4, 0xb3, 0x2e, 0x24, 0x25, 0x31, - 0xb9, 0x65, 0xf3, 0x82, 0x8f, 0xbd, 0x69, 0x47, 0x18, 0x14, 0x12, 0x2d, - 0x52, 0x56, 0x23, 0xa3, 0xa3, 0xef, 0x93, 0x9e, 0x09, 0xf6, 0x91, 0x97, - 0xef, 0x11, 0x39, 0x9a, 0xd1, 0x0d, 0x02, 0x6c, 0x3f, 0x51, 0xbf, 0xe1, - 0x1c, 0xfb, 0xd7, 0xc2, 0x14, 0x96, 0x0e, 0x24, 0xbe, 0x90, 0x59, 0x1c, - 0x7c, 0x11, 0x40, 0xa6, 0xb4, 0x07, 0x48, 0x2f, 0xb3, 0xb5, 0xef, 0xea, - 0x51, 0x57, 0xb6, 0xcb, 0x66, 0xe0, 0xc5, 0x69, 0xb1, 0x8e, 0x68, 0x46, - 0x5d, 0x15, 0x52, 0x63, 0x04, 0xd6, 0xfa, 0x13, 0x89, 0x7a, 0x53, 0x44, - 0x54, 0x4b, 0x21, 0x2d, 0xf1, 0x2c, 0x80, 0x07, 0xfd, 0x61, 0x96, 0x76, - 0x84, 0x73, 0x75, 0xbf, 0x38, 0x8f, 0x75, 0x04, 0xbd, 0x0e, 0x89, 0x48, - 0x73, 0x44, 0x96, 0x99, 0xa7, 0x0a, 0x02, 0xa9, 0xf2, 0x8d, 0xcd, 0x13, - 0x08, 0x0c, 0xb8, 0x13, 0xa2, 0x43, 0x9d, 0x0d, 0x5a, 0x51, 0x34, 0x98, - 0x9e, 0x95, 0x2c, 0x7b, 0x0f, 0xf0, 0x15, 0x46, 0xf4, 0xb1, 0x8e, 0x82, - 0xcd, 0xb8, 0x57, 0x52, 0x4f, 0x38, 0xa1, 0x8d, 0x19, 0x9d, 0x0b, 0xe9, - 0x8c, 0xf0, 0x03, 0xc6, 0x55, 0xa3, 0xff, 0xdf, 0xb2, 0x95, 0xca, 0xbd, - 0x2a, 0x8f, 0x3c, 0xcc, 0xbe, 0x55, 0x4b, 0x0f, 0x5b, 0xc8, 0xf9, 0xde, - 0xa0, 0xa3, 0x52, 0xab, 0xed, 0xd3, 0x09, 0xcd, 0x96, 0x11, 0xe5, 0x20, - 0x6e, 0xd1, 0x72, 0xab, 0x9e, 0x23, 0xff, 0xa2, 0x73, 0xbe, 0x74, 0x49, - 0x89, 0xa1, 0xca, 0xf2, 0x58, 0xcd, 0x12, 0x51, 0xb0, 0xd2, 0x06, 0x0a, - 0x84, 0x22, 0x4a, 0x21, 0x1e, 0x20, 0x8d, 0x18, 0x1d, 0xa6, 0x4d, 0x70, - 0xdb, 0x89, 0x59, 0x48, 0x36, 0x9e, 0x73, 0xdc, 0x21, 0xc9, 0xed, 0x57, - 0x25, 0xc4, 0xd4, 0xa8, 0x9f, 0x4b, 0x2e, 0x0e, 0x18, 0xdf, 0x54, 0x92, - 0x80, 0x21, 0xc0, 0x7f, 0x49, 0x80, 0x44, 0xee, 0x99, 0x9e, 0xc0, 0x93, - 0xbf, 0x30, 0x7f, 0x56, 0x7e, 0x63, 0x6b, 0xfa, 0xe9, 0xc8, 0x6a, 0x0c, - 0x71, 0x23, 0xa1, 0x0c, 0xb4, 0xdf, 0x42, 0xf7, 0x56, 0xf2, 0x56, 0x87, - 0x78, 0xf9, 0x43, 0x0a, 0x9d, 0xee, 0xa1, 0x0d, 0xbe, 0x13, 0x47, 0x5d, - 0xb4, 0xf0, 0x17, 0xd3, 0xb2, 0x5e, 0x63, 0x5c, 0x58, 0x0e, 0xfc, 0xfa, - 0x9c, 0x5e, 0x5b, 0x81, 0x40, 0xa5, 0xe1, 0x41, 0xa9, 0xbf, 0x75, 0xdc, - 0xda, 0xa2, 0xcf, 0xa8, 0x58, 0xea, 0xe2, 0xad, 0x63, 0x68, 0x35, 0x77, - 0xbe, 0x7b, 0x34, 0x5f, 0xf7, 0x65, 0x86, 0x78, 0xfb, 0xcb, 0xc2, 0x31, - 0x6e, 0xcd, 0x2d, 0x8c, 0xa9, 0x50, 0x76, 0xed, 0x8c, 0x4a, 0x92, 0xcd, - 0x67, 0x98, 0x49, 0xff, 0x6e, 0xc1, 0x69, 0x04, 0x54, 0x5a, 0xab, 0x52, - 0x3f, 0xd6, 0x1b, 0x36, 0x76, 0x4b, 0xfb, 0x9b, 0x75, 0xb4, 0x2b, 0xc6, - 0x7b, 0x9c, 0x0a, 0xcb, 0xe1, 0xc9, 0x39, 0xd7, 0xad, 0xd4, 0x7d, 0x2b, - 0xcf, 0x61, 0x55, 0x17, 0x03, 0x31, 0xaf, 0xc0, 0x1c, 0x48, 0xbb, 0x4f, - 0x7c, 0xec, 0x4a, 0xf3, 0xd1, 0x1e, 0x13, 0xa2, 0xee, 0x70, 0x22, 0xa1, - 0x1d, 0xe8, 0x78, 0xe9, 0xb1, 0xc4, 0xeb, 0x9e, 0xe7, 0x0a, 0x9a, 0x30, - 0x2f, 0x59, 0x37, 0x84, 0x00, 0xf8, 0x83, 0x9f, 0x3a, 0x9d, 0x5c, 0xc1, - 0x59, 0x16, 0xe5, 0xa3, 0xe9, 0x37, 0x15, 0x88, 0x5e, 0x80, 0x5b, 0xc1, - 0x7a, 0xf0, 0x9a, 0x38, 0x9b, 0x5c, 0x60, 0x66, 0x73, 0x43, 0xf5, 0x83, - 0xaf, 0x8f, 0x4d, 0xbe, 0x5d, 0x08, 0xe8, 0x67, 0xc3, 0xcc, 0xf4, 0x01, - 0xae, 0x27, 0xca, 0x0f, 0x4f, 0x81, 0x77, 0x45, 0x14, 0xe1, 0xe2, 0xcd, - 0xa8, 0x8a, 0x9a, 0x0a, 0x37, 0xb5, 0x27, 0x5a, 0x90, 0x6d, 0x21, 0x39, - 0xac, 0x35, 0xa1, 0xcb, 0x72, 0x4c, 0x60, 0x71, 0xa6, 0x53, 0x41, 0x5f, - 0x43, 0xe1, 0x9c, 0xf5, 0x94, 0xa3, 0xa0, 0xc0, 0xa5, 0x5f, 0x55, 0xad, - 0x44, 0xae, 0x7a, 0x00, 0x11, 0x5f, 0xeb, 0x45, 0x20, 0xa3, 0xab, 0x87, - 0x2d, 0xbb, 0x83, 0x1c, 0xe8, 0x9d, 0xbc, 0xed, 0xad, 0x22, 0x2a, 0xef, - 0xaa, 0xb4, 0xef, 0x1d, 0x98, 0xb5, 0x38, 0xb3, 0x06, 0xae, 0x3e, 0x15, - 0x38, 0xe5, 0x15, 0xa4, 0x49, 0x33, 0x5d, 0xb1, 0xa9, 0x5e, 0xd7, 0xaa, - 0xa0, 0x6e, 0x81, 0x0f, 0xa7, 0xa9, 0x91, 0xa5, 0xc3, 0xa3, 0x94, 0x8f, - 0x8c, 0x56, 0x71, 0xbe, 0x91, 0x3d, 0xa4, 0x52, 0xae, 0x59, 0xed, 0xd1, - 0x27, 0xac, 0x54, 0x19, 0x13, 0xf8, 0x1a, 0xc7, 0xdc, 0x92, 0x30, 0x86, - 0x3b, 0xf8, 0x3d, 0x2c, 0x0f, 0xa7, 0x63, 0xe4, 0xbf, 0xe5, 0x11, 0x15, - 0x5d, 0xa5, 0x98, 0xb4, 0x56, 0x9b, 0x6b, 0xc7, 0x3c, 0x72, 0x9c, 0x01, - 0xef, 0xea, 0xe0, 0x53, 0x9c, 0xcf, 0x87, 0xd9, 0x6d, 0xca, 0xf6, 0xc3, - 0xdc, 0x7e, 0x12, 0xd7, 0x75, 0x5a, 0x6b, 0xf0, 0x43, 0xe2, 0xfa, 0xb2, - 0xf5, 0xa9, 0x41, 0x62, 0x9d, 0xe5, 0x7f, 0xff, 0x37, 0xb5, 0x9d, 0x7b, - 0x8e, 0x01, 0xc7, 0x5d, 0xda, 0x56, 0xf8, 0x48, 0x34, 0xe6, 0xa4, 0x8a, - 0xc7, 0xc4, 0xde, 0x03, 0x74, 0x3c, 0x25, 0x43, 0x8d, 0x80, 0xb4, 0xbb, - 0xac, 0x82, 0xe5, 0xdb, 0xd3, 0x0a, 0xaf, 0x67, 0x9d, 0x1b, 0x82, 0x52, - 0x2f, 0x2e, 0x85, 0x95, 0x99, 0x53, 0x12, 0x1f, 0x75, 0x0a, 0x81, 0xdf, - 0xe3, 0x14, 0xa3, 0x9f, 0xd1, 0x2f, 0xc9, 0x86, 0x28, 0x30, 0x69, 0x6d, - 0x66, 0x6d, 0x90, 0x62, 0xa7, 0x26, 0xf0, 0x8c, 0xb5, 0x36, 0xc4, 0xdf, - 0xd7, 0x06, 0x3d, 0xef, 0xe5, 0x49, 0xea, 0xc8, 0xf8, 0x18, 0xf0, 0xb8, - 0x72, 0x72, 0xf6, 0x27, 0x48, 0xb9, 0xf8, 0x56, 0x5f, 0xea, 0x0b, 0x40, - 0x60, 0x18, 0x09, 0xe3, 0x25, 0xb3, 0x61, 0x2e, 0x44, 0x4a, 0x8c, 0x41, - 0xad, 0xce, 0xdb, 0xe1, 0x85, 0x05, 0xe7, 0x70, 0xe0, 0xe8, 0x8c, 0xfd, - 0xc6, 0xc3, 0xec, 0xa6, 0x47, 0x10, 0xd3, 0xe7, 0xd3, 0x8f, 0x00, 0x6a, - 0x98, 0x56, 0x7f, 0x24, 0xa8, 0x84, 0x07, 0x01, 0xb9, 0xfc, 0x8b, 0x0e, - 0x9e, 0x17, 0xc0, 0x8f, 0x10, 0x34, 0x53, 0x60, 0x59, 0xaa, 0x77, 0x96, - 0xf6, 0xc5, 0xb8, 0x7d, 0x88, 0xbe, 0xf9, 0x74, 0xda, 0x28, 0x86, 0xc5, - 0xf5, 0x66, 0xb7, 0x10, 0x57, 0x65, 0x22, 0x13, 0xe9, 0xe9, 0x5f, 0x83, - 0x99, 0xdf, 0xc7, 0x83, 0x08, 0xae, 0xa8, 0xcb, 0x63, 0xc8, 0xdc, 0x15, - 0x61, 0xe0, 0x57, 0xda, 0x1d, 0x32, 0x83, 0x10, 0x3f, 0xdd, 0xb6, 0x69, - 0x6d, 0x8d, 0x41, 0x45, 0x03, 0x72, 0x7f, 0xc0, 0x81, 0xec, 0x19, 0x85, - 0x82, 0x51, 0xed, 0x87, 0x51, 0x78, 0xa7, 0xa6, 0xed, 0x80, 0x17, 0x16, - 0xc7, 0x2c, 0xda, 0x19, 0xe4, 0x8e, 0x0b, 0x1f, 0xe4, 0xcb, 0x9d, 0x10, - 0x15, 0x1f, 0xdf, 0xf0, 0xa5, 0x7a, 0xe0, 0x3a, 0xce, 0x03, 0xbb, 0x76, - 0xd7, 0xac, 0x5a, 0x64, 0xfc, 0x92, 0x3c, 0x40, 0x56, 0x29, 0xd1, 0x07, - 0x67, 0x5d, 0x20, 0x2f, 0xa1, 0x7f, 0xf2, 0x13, 0x8d, 0x5c, 0x1b, 0x4e, - 0xbb, 0x6c, 0x55, 0x3a, 0x2b, 0x0b, 0x71, 0xf9, 0xcb, 0x26, 0x5c, 0x20, - 0xc9, 0x2d, 0x13, 0x74, 0x72, 0x59, 0x31, 0xf2, 0x81, 0x83, 0xf4, 0xfd, - 0x9d, 0xfe, 0x05, 0x97, 0x4e, 0xc2, 0x24, 0xaa, 0x13, 0x38, 0xd0, 0x65, - 0x1e, 0x61, 0x36, 0x7d, 0x94, 0x79, 0xe8, 0x78, 0x4f, 0x34, 0xe2, 0xfc, - 0xc5, 0xc1, 0x91, 0xd2, 0xa8, 0x19, 0x7e, 0x96, 0x1c, 0xf1, 0xe1, 0x39, - 0x85, 0xfd, 0xfa, 0xca, 0xcd, 0x76, 0x47, 0x17, 0xa9, 0xa0, 0x96, 0x45, - 0x9e, 0x59, 0x1a, 0xa0, 0x31, 0xfb, 0x0b, 0x66, 0x4c, 0x34, 0xa4, 0x2e, - 0x1b, 0x85, 0xd5, 0x0f, 0xf4, 0x5c, 0x70, 0x11, 0xce, 0xfa, 0xe3, 0x4b, - 0x28, 0x74, 0x7f, 0x66, 0xfe, 0x99, 0x13, 0xd7, 0x9b, 0x98, 0x7e, 0x53, - 0x82, 0xd0, 0x1e, 0xd2, 0xfc, 0x86, 0x72, 0x49, 0x8a, 0xfb, 0xef, 0x50, - 0x37, 0xe4, 0x08, 0x44, 0x14, 0x18, 0xf3, 0xd6, 0x88, 0x94, 0xb7, 0xda, - 0x78, 0xf2, 0x9c, 0xf5, 0x4a, 0xcf, 0xc2, 0xdf, 0x99, 0x16, 0xef, 0xd2, - 0x76, 0x93, 0xa0, 0x8e, 0xcf, 0x15, 0x50, 0x7d, 0xe3, 0xa4, 0x87, 0x69, - 0x1f, 0xac, 0x5b, 0x4b, 0x69, 0x3c, 0xc5, 0xda, 0x4f, 0x50, 0x3f, 0x88, - 0xbf, 0x9b, 0x3e, 0x9c, 0xd7, 0x23, 0x88, 0x1f, 0x18, 0xb2, 0x3d, 0xdd, - 0x84, 0xce, 0xf9, 0x64, 0xb3, 0xba, 0xe8, 0xb0, 0x7f, 0xc8, 0xaf, 0x5e, - 0x15, 0x22, 0xb9, 0x00, 0x46, 0xf8, 0x54, 0xf6, 0xb4, 0xed, 0x3e, 0x2b, - 0xc5, 0x3d, 0x5c, 0xde, 0x6d, 0x4c, 0x0f, 0x3d, 0x2e, 0xe2, 0xe5, 0x8c, - 0x68, 0x42, 0xe5, 0x30, 0xc6, 0x93, 0x82, 0x7d, 0xf1, 0x03, 0x78, 0x25, - 0xf4, 0xb6, 0x2d, 0x40, 0xbe, 0x87, 0x85, 0x31, 0xc6, 0x79, 0x22, 0x1b, - 0xbe, 0xa3, 0x66, 0x50, 0xfc, 0xf6, 0xeb, 0xcc, 0xfd, 0x7b, 0x49, 0xf9, - 0xa1, 0x18, 0xe3, 0x54, 0x11, 0xfe, 0xf1, 0xc9, 0xd3, 0x58, 0xec, 0x48, - 0x42, 0xd2, 0xab, 0x0d, 0x77, 0x79, 0xc4, 0xf5, 0x5d, 0xd4, 0x93, 0x34, - 0x66, 0x1b, 0x5b, 0x9d, 0x8e, 0xc0, 0x21, 0x83, 0xcb, 0xfa, 0xd1, 0xc3, - 0x21, 0x85, 0x0b, 0xe0, 0x0e, 0xc6, 0x7d, 0x49, 0xdf, 0x2f, 0xfc, 0x20, - 0x1a, 0xe2, 0x7c, 0x6b, 0x45, 0xa4, 0x82, 0xba, 0xfb, 0x8e, 0x4c, 0x10, - 0xe5, 0xde, 0x01, 0xe3, 0x3e, 0xa8, 0x90, 0x2a, 0x7f, 0x8a, 0x13, 0x42, - 0x23, 0x76, 0x0f, 0x9c, 0xfb, 0xb6, 0x2e, 0xc5, 0x15, 0x0f, 0x6a, 0xc3, - 0x7f, 0x3f, 0xa2, 0xad, 0xd8, 0xd2, 0x88, 0x47, 0x76, 0x43, 0xda, 0x02, - 0x90, 0xf4, 0xc2, 0x75, 0xc3, 0xcd, 0x7d, 0xda, 0x1e, 0x85, 0x4e, 0xe6, - 0xa9, 0x65, 0xe7, 0xe9, 0x8b, 0xa7, 0x78, 0x7e, 0xf7, 0x7e, 0x53, 0x6d, - 0x92, 0x93, 0xdc, 0x31, 0xda, 0x47, 0x3e, 0xf3, 0x47, 0x7c, 0x07, 0xff, - 0x24, 0x6e, 0x78, 0xef, 0x74, 0xcb, 0x93, 0x8c, 0x2c, 0xaa, 0xb7, 0x5a, - 0xf3, 0x9c, 0xd1, 0xb5, 0x74, 0xff, 0x94, 0x06, 0x22, 0x0e, 0x7a, 0x5c, - 0x88, 0x71, 0x56, 0x1a, 0x47, 0x24, 0x58, 0xf0, 0xe1, 0x8f, 0xe5, 0xc1, - 0xbd, 0x1b, 0x67, 0x4c, 0x19, 0xc7, 0x4a, 0x62, 0x3d, 0x3c, 0xf2, 0x5a, - 0x5e, 0xb2, 0xbe, 0x7c, 0x13, 0xf6, 0x66, 0x58, 0xfd, 0x71, 0x2d, 0x1b, - 0xbc, 0x39, 0x30, 0x78, 0x54, 0xe5, 0x65, 0x65, 0x83, 0x5c, 0xd8, 0x0d, - 0x79, 0x8b, 0x27, 0xe2, 0x17, 0x26, 0x78, 0xcb, 0x2d, 0xed, 0x85, 0x46, - 0x2b, 0x61, 0x75, 0x3f, 0xa5, 0x68, 0xbc, 0x83, 0x43, 0xb9, 0x11, 0xa5, - 0x6c, 0x4d, 0x33, 0x92, 0xf4, 0x91, 0x65, 0x3a, 0x58, 0x7f, 0x36, 0x0b, - 0x7a, 0x22, 0x24, 0x31, 0x6a, 0x1e, 0x5c, 0xb6, 0x44, 0xe4, 0xed, 0x24, - 0x2d, 0x92, 0x44, 0x86, 0xad, 0x7e, 0xc8, 0xd6, 0x98, 0xc8, 0x4c, 0xe4, - 0x72, 0x08, 0x4d, 0xcd, 0x18, 0xd6, 0x44, 0x19, 0x0a, 0x0d, 0x34, 0x8f, - 0xc9, 0x5f, 0xe1, 0xf6, 0xaa, 0x16, 0x62, 0x8c, 0x18, 0xde, 0xae, 0x3b, - 0x68, 0x43, 0x7f, 0x30, 0xd7, 0x25, 0x4e, 0x33, 0xcf, 0x92, 0x47, 0x7d, - 0x8d, 0x19, 0xbd, 0x95, 0x05, 0xe5, 0x7a, 0xe8, 0x53, 0x78, 0x0f, 0xbb, - 0x8c, 0x53, 0xb8, 0x24, 0x17, 0x73, 0x25, 0x6e, 0x55, 0x0b, 0x6d, 0x1b, - 0xce, 0xd8, 0x1c, 0x85, 0x4d, 0x34, 0xee, 0x6d, 0xe2, 0x19, 0x5c, 0x10, - 0x0c, 0xb9, 0xc9, 0xb9, 0x5e, 0x63, 0x54, 0xc2, 0xef, 0xc9, 0x0e, 0x3a, - 0xbb, 0x75, 0xdd, 0x0b, 0x9a, 0x2d, 0x26, 0xc7, 0x63, 0xc6, 0xb0, 0x59, - 0xdc, 0x02, 0x47, 0x1d, 0x64, 0xef, 0xa4, 0x25, 0x3d, 0x1e, 0xc0, 0xd4, - 0x86, 0xde, 0xd6, 0xc3, 0x97, 0x88, 0xb5, 0x5a, 0xc8, 0x60, 0xe1, 0xa7, - 0x3f, 0x90, 0x0a, 0x63, 0xde, 0xe2, 0xdd, 0x77, 0x7f, 0x03, 0x05, 0xa9, - 0xd9, 0x2f, 0x7d, 0x73, 0xf6, 0x0b, 0x15, 0x5a, 0x38, 0x8c, 0x94, 0x8e, - 0x2d, 0x9e, 0xf0, 0xbc, 0x5d, 0x75, 0x19, 0x08, 0xd0, 0x06, 0xc0, 0xa4, - 0x8a, 0x99, 0x8a, 0x0e, 0xa6, 0xfa, 0x1f, 0xc1, 0x01, 0x44, 0x95, 0x24, - 0x7f, 0x76, 0x59, 0x6b, 0xf2, 0x61, 0xe7, 0x9e, 0x5e, 0x71, 0x22, 0x57, - 0x48, 0xfc, 0x98, 0x99, 0xa2, 0xa9, 0xa8, 0xf3, 0x0f, 0xa3, 0x20, 0xfa, - 0xa9, 0x9a, 0x72, 0x56, 0x12, 0x4a, 0xb9, 0xc4, 0x0e, 0x85, 0x94, 0x58, - 0x13, 0x18, 0xaa, 0xbc, 0x86, 0xd5, 0x94, 0x30, 0xae, 0x8a, 0x12, 0x86, - 0xc5, 0x3a, 0x38, 0x54, 0xef, 0xe6, 0xb6, 0x12, 0x88, 0x6f, 0xc0, 0x07, - 0xe5, 0xa5, 0x0a, 0xdd, 0xc3, 0x31, 0x76, 0x92, 0xd6, 0x5c, 0x80, 0x15, - 0xef, 0x53, 0x8d, 0xfd, 0x9e, 0x92, 0x52, 0xda, 0xbf, 0x91, 0x6b, 0x56, - 0x98, 0xd5, 0x89, 0xa7, 0x39, 0xf3, 0x42, 0x8f, 0xe8, 0xbd, 0x34, 0x30, - 0x32, 0xe4, 0x6d, 0xa5, 0xec, 0x94, 0xea, 0x86, 0xa9, 0xb8, 0x93, 0xbf, - 0x1e, 0x3c, 0x49, 0x6f, 0xaf, 0xbd, 0x08, 0x73, 0x46, 0x37, 0x28, 0xde, - 0xce, 0x42, 0xa9, 0x08, 0x84, 0xc3, 0x2f, 0xac, 0x29, 0xb3, 0xa8, 0x94, - 0x18, 0xf7, 0xca, 0x34, 0x66, 0x49, 0x7f, 0xea, 0x08, 0x2e, 0x6d, 0x54, - 0xe1, 0x80, 0xc4, 0x12, 0xaa, 0xa9, 0xcb, 0xd0, 0xcd, 0x9e, 0xad, 0x57, - 0xdc, 0x7d, 0x47, 0xa5, 0x83, 0x28, 0x3a, 0xb1, 0x97, 0x0c, 0x8f, 0x66, - 0xbe, 0xa1, 0x17, 0x69, 0xbe, 0x2e, 0x27, 0xc9, 0xff, 0xe4, 0x8e, 0xa3, - 0x7c, 0x2f, 0x29, 0xc2, 0xfa, 0x5c, 0x4b, 0x81, 0x01, 0xd4, 0xe7, 0x0a, - 0x97, 0xf5, 0xea, 0xbe, 0x12, 0xfe, 0xf6, 0x78, 0xfc, 0x52, 0xeb, 0xcb, - 0x3d, 0x60, 0xa0, 0xd1, 0xa8, 0x64, 0x52, 0xc8, 0xca, 0xb8, 0x5e, 0x17, - 0x25, 0x45, 0xbc, 0xcd, 0xb5, 0xcc, 0x1e, 0x0b, 0xf0, 0xb0, 0xf9, 0x2f, - 0x97, 0x81, 0x1f, 0x0b, 0x82, 0xf7, 0xe9, 0xa4, 0xc2, 0x9d, 0x96, 0xe0, - 0xa2, 0x33, 0x64, 0x83, 0x2f, 0x2b, 0x4e, 0xd3, 0xf9, 0x22, 0x8b, 0xb5, - 0x3f, 0xed, 0x95, 0x1b, 0x94, 0x27, 0x4d, 0x32, 0x95, 0x61, 0x7a, 0x12, - 0xe8, 0x4e, 0xce, 0xf5, 0xb0, 0x94, 0x67, 0x95, 0xa9, 0xa8, 0xa5, 0xa1, - 0x7b, 0xca, 0x0b, 0x45, 0xde, 0xca, 0xa0, 0x82, 0x8d, 0xf8, 0xb0, 0xbf, - 0x24, 0x0c, 0x79, 0x46, 0x89, 0xd1, 0x86, 0x09, 0x59, 0xbf, 0x19, 0x5d, - 0xae, 0xe5, 0x1c, 0x4d, 0xa5, 0x4c, 0x01, 0x81, 0xb8, 0x14, 0x76, 0xab, - 0xc7, 0x26, 0x66, 0xd1, 0x5d, 0x09, 0xdb, 0x97, 0x7d, 0xfe, 0x90, 0x3f, - 0xdc, 0x46, 0xa5, 0x4b, 0xbf, 0x33, 0x83, 0xa1, 0xbe, 0x4b, 0x35, 0x21, - 0xbc, 0x10, 0x98, 0x38, 0x1e, 0xac, 0x34, 0x57, 0xfd, 0x2c, 0x05, 0x46, - 0xe5, 0x34, 0x63, 0xcd, 0x3c, 0x08, 0x01, 0x7e, 0x12, 0x13, 0x67, 0x3c, - 0x92, 0x7b, 0x9c, 0x13, 0x9f, 0xc9, 0xcf, 0x09, 0x49, 0x8f, 0x57, 0x1d, - 0x33, 0xb8, 0xc1, 0x90, 0xbc, 0xf2, 0x24, 0xc8, 0x0c, 0x40, 0x90, 0x0c, - 0xce, 0x65, 0x9f, 0x19, 0xcf, 0x55, 0x8f, 0x1f, 0x32, 0xc5, 0x99, 0xfe, - 0x95, 0x82, 0x2a, 0xcf, 0x9d, 0xf6, 0x9b, 0xeb, 0xa2, 0xf7, 0x13, 0x1c, - 0x90, 0x22, 0x15, 0x28, 0x6a, 0xae, 0x6d, 0xa1, 0x38, 0xca, 0xee, 0xa0, - 0x61, 0xeb, 0x55, 0x3c, 0xbb, 0x22, 0x29, 0x47, 0x31, 0x2d, 0x2e, 0x54, - 0x66, 0x10, 0x35, 0x00, 0xa3, 0xf3, 0xd1, 0x0b, 0xcf, 0xfc, 0x23, 0x40, - 0xed, 0xa1, 0xf3, 0x9f, 0x7c, 0x52, 0xa7, 0x0b, 0x06, 0xde, 0x54, 0xbe, - 0x37, 0xed, 0xbc, 0x94, 0x29, 0x15, 0x81, 0x30, 0x64, 0x52, 0x1b, 0x70, - 0xb8, 0x5e, 0xd1, 0xd7, 0xc4, 0xaf, 0xa9, 0x86, 0x5d, 0xeb, 0x26, 0x50, - 0x21, 0x50, 0x8a, 0xbe, 0xae, 0xd3, 0xeb, 0xaa, 0x5d, 0x4a, 0xea, 0x5b, - 0x59, 0xe8, 0x66, 0xeb, 0xe2, 0x3a, 0xed, 0xd9, 0xdb, 0x83, 0x39, 0x87, - 0x97, 0x23, 0x9a, 0x97, 0x70, 0xee, 0x5c, 0x83, 0x01, 0x3a, 0xe6, 0x3c, - 0xf2, 0x5a, 0xf2, 0x3e, 0xe6, 0x37, 0x75, 0xdf, 0x29, 0x93, 0xb7, 0x40, - 0x1f, 0x67, 0xf5, 0xc6, 0xc7, 0x8e, 0x52, 0xe3, 0x89, 0xd7, 0x9b, 0x33, - 0xda, 0xe8, 0xb9, 0xe1, 0xe3, 0xa9, 0xf4, 0x9e, 0x8b, 0x66, 0x4b, 0x48, - 0x31, 0xe5, 0xfb, 0x88, 0xa5, 0x23, 0x38, 0xd3, 0x5a, 0x50, 0x3b, 0xb7, - 0x80, 0xe6, 0xd0, 0xac, 0x54, 0x58, 0x1e, 0xae, 0x46, 0x0b, 0xbc, 0x14, - 0xc0, 0x61, 0x94, 0x3d, 0x78, 0x8b, 0xe3, 0x94, 0x37, 0xc0, 0xf4, 0xf7, - 0x9e, 0x11, 0x4f, 0xfb, 0x9e, 0xb2, 0x93, 0x85, 0x99, 0x21, 0xff, 0x70, - 0xb9, 0x32, 0x6a, 0xa9, 0x2a, 0xf0, 0xf9, 0x9f, 0x5e, 0xa1, 0x6e, 0xe8, - 0x33, 0xb0, 0x1c, 0xe6, 0xe3, 0xfb, 0xcc, 0x14, 0x62, 0x5b, 0x60, 0xfc, - 0xa8, 0xc1, 0xc1, 0xe2, 0xd7, 0xe0, 0x97, 0x59, 0x05, 0xb0, 0xea, 0x62, - 0xcc, 0xc7, 0x9f, 0x8f, 0xac, 0x33, 0x3e, 0xbe, 0x0e, 0x6a, 0x87, 0xea, - 0x08, 0xf0, 0x08, 0x97, 0x47, 0xae, 0x0a, 0xc8, 0x49, 0x0a, 0x3f, 0x3a, - 0x47, 0xad, 0x34, 0xf3, 0x2a, 0x1a, 0x5e, 0xfa, 0x3b, 0x0c, 0x08, 0xc7, - 0x60, 0x32, 0x2d, 0x38, 0x7a, 0x53, 0x3b, 0xff, 0x90, 0xd3, 0x88, 0x11, - 0x64, 0x06, 0x28, 0x5d, 0xa3, 0x1b, 0x02, 0xa9, 0x43, 0x24, 0xeb, 0x72, - 0x8c, 0xae, 0x89, 0x01, 0x10, 0x49, 0xf0, 0xd0, 0x4a, 0x4f, 0xb9, 0xf3, - 0xe3, 0xfd, 0x24, 0xbe, 0x4d, 0xf9, 0x4d, 0x35, 0xeb, 0xf3, 0x7a, 0x1a, - 0x48, 0x61, 0x3c, 0xd7, 0x54, 0x00, 0xc5, 0xb9, 0x34, 0xd0, 0x15, 0x82, - 0x7b, 0xcb, 0xa1, 0x03, 0x77, 0x87, 0x91, 0xa4, 0xce, 0x9f, 0x33, 0x3a, - 0xee, 0xb3, 0xfd, 0x36, 0xa4, 0xa3, 0xe6, 0xb3, 0xa5, 0x68, 0xeb, 0xad, - 0xa3, 0x8c, 0xa6, 0x12, 0x2e, 0x0b, 0x9b, 0xf5, 0x27, 0x94, 0x17, 0xbd, - 0x76, 0x01, 0xd7, 0x4a, 0xb5, 0x5f, 0xdd, 0x42, 0x07, 0xcd, 0x63, 0x89, - 0xdc, 0x1a, 0xa2, 0xb9, 0xf2, 0x3f, 0xe4, 0xf3, 0xe6, 0x6d, 0x38, 0xe6, - 0xe5, 0xc5, 0x62, 0xc8, 0x27, 0xe3, 0x2a, 0xc6, 0x97, 0x4a, 0xbb, 0xf3, - 0xf6, 0x9e, 0xf2, 0xc3, 0xab, 0xf3, 0x8c, 0x7a, 0x93, 0x1b, 0xfc, 0x9b, - 0x1d, 0xac, 0x61, 0x5c, 0x9a, 0x40, 0x17, 0x8f, 0xba, 0xe7, 0x63, 0x7d, - 0x42, 0x04, 0xd7, 0x89, 0xbb, 0xb5, 0xbe, 0x44, 0x8d, 0x2c, 0xe3, 0xde, - 0xcf, 0xce, 0x50, 0xbe, 0x28, 0x37, 0xf6, 0xd0, 0xba, 0x0c, 0xce, 0x9f, - 0xa3, 0xeb, 0xe8, 0x7d, 0xe9, 0x1f, 0x3b, 0x98, 0x6a, 0x81, 0x29, 0xd2, - 0x5e, 0x5e, 0x3b, 0xe1, 0x76, 0xde, 0xc8, 0x39, 0x9e, 0x05, 0xbb, 0x95, - 0xc9, 0xfe, 0x49, 0x1c, 0x37, 0xf5, 0xa0, 0x84, 0xc9, 0x99, 0xd5, 0x07, - 0xab, 0x92, 0x61, 0x35, 0xf6, 0x10, 0x3d, 0x47, 0xce, 0x77, 0xa2, 0x00, - 0x9c, 0xbe, 0x6c, 0x4d, 0xf3, 0x5f, 0x67, 0xa0, 0xeb, 0x43, 0xcc, 0xbe, - 0x70, 0x08, 0xa4, 0x66, 0x4e, 0x2c, 0x2b, 0x22, 0xcb, 0x1b, 0x77, 0x71, - 0x5b, 0x15, 0x54, 0x09, 0x95, 0x3e, 0xb4, 0x88, 0xa0, 0x20, 0xa4, 0x52, - 0xb4, 0xb2, 0x45, 0x5e, 0xef, 0xff, 0x76, 0x41, 0xbe, 0xcc, 0xd3, 0x39, - 0x17, 0xeb, 0x83, 0x50, 0x4c, 0x76, 0x61, 0xcc, 0xc7, 0x8c, 0x71, 0xe9, - 0x90, 0x82, 0x1c, 0x8e, 0x5d, 0x4a, 0x21, 0x00, 0x97, 0x59, 0xb7, 0x41, - 0x82, 0x9a, 0x7c, 0x99, 0xb2, 0x08, 0x02, 0x8c, 0xf9, 0xd1, 0x02, 0xde, - 0x44, 0x3e, 0x7f, 0xa3, 0x71, 0x75, 0x1b, 0x3b, 0x2e, 0x04, 0x7f, 0x5f, - 0x9f, 0x1e, 0x8c, 0x8f, 0x65, 0xf1, 0x1a, 0x99, 0xf4, 0x10, 0x90, 0x1f, - 0x11, 0xb5, 0xaf, 0x96, 0x9b, 0x97, 0xd9, 0x76, 0x7d, 0x8c, 0x2c, 0x33, - 0x40, 0xc9, 0xb8, 0x04, 0x6d, 0x99, 0x05, 0xf5, 0xae, 0x56, 0xb8, 0x19, - 0x82, 0xbd, 0xe6, 0x62, 0x03, 0xf0, 0xfc, 0xfa, 0x0a, 0x7c, 0x6e, 0xac, - 0x2a, 0xd7, 0x76, 0x73, 0x7b, 0xee, 0x29, 0x6b, 0xad, 0x30, 0x1d, 0xb4, - 0x7f, 0x3f, 0x69, 0xfc, 0xa4, 0x7a, 0x05, 0xdc, 0xf3, 0x0b, 0x3b, 0xc3, - 0x47, 0xcf, 0x5f, 0x03, 0xdb, 0x23, 0x5d, 0x2c, 0xa9, 0x4b, 0xda, 0x1a, - 0x2f, 0xb6, 0xa9, 0x7b, 0x7d, 0x1b, 0x1b, 0x94, 0xb2, 0x7b, 0xbe, 0xba, - 0x87, 0x88, 0x96, 0xd9, 0x27, 0xcd, 0xf1, 0xe8, 0x9d, 0x84, 0xb8, 0x6f, - 0x28, 0x31, 0x8d, 0x97, 0x9f, 0x05, 0xaa, 0xee, 0x8a, 0x1c, 0xbb, 0x7e, - 0x8a, 0xf9, 0x47, 0xcb, 0xf6, 0x79, 0x8e, 0xe2, 0x81, 0xac, 0x4e, 0x9e, - 0x41, 0xa6, 0x24, 0x4e, 0x24, 0xe8, 0x54, 0xa5, 0x61, 0x33, 0xf9, 0x3c, - 0xf5, 0x57, 0xf6, 0xdb, 0x2d, 0x39, 0x40, 0x4f, 0x02, 0xfa, 0xe3, 0xd9, - 0x3a, 0x80, 0x45, 0x49, 0xca, 0x1c, 0xbf, 0xb7, 0x7f, 0xe9, 0x0c, 0x84, - 0x57, 0x86, 0x64, 0xef, 0xad, 0x5e, 0x46, 0x32, 0x66, 0x90, 0x9c, 0xb1, - 0x8b, 0xe6, 0x19, 0x67, 0x8c, 0x03, 0xb7, 0x23, 0xce, 0x5b, 0x96, 0xfa, - 0xd6, 0xf4, 0xf3, 0x54, 0x04, 0x26, 0x61, 0xa2, 0x74, 0xc9, 0xf9, 0x87, - 0x6f, 0x9e, 0x4c, 0xec, 0x51, 0x3f, 0x31, 0x4d, 0x6d, 0x5c, 0x89, 0x9a, - 0xd1, 0x72, 0x6b, 0x5b, 0x27, 0x46, 0x5b, 0x0c, 0x08, 0xcc, 0x21, 0x83, - 0x71, 0x8d, 0xbc, 0xb0, 0xc5, 0x86, 0xc6, 0xae, 0xbf, 0xfc, 0x94, 0x14, - 0xb0, 0xa0, 0x95, 0x56, 0xd4, 0xa0, 0xed, 0xea, 0xfb, 0x3d, 0xbd, 0x92, - 0x5a, 0x95, 0xbf, 0x41, 0x64, 0xbb, 0xe6, 0x33, 0x22, 0xc3, 0x27, 0xd9, - 0x8a, 0x7a, 0x11, 0xed, 0x3a, 0x1f, 0xcf, 0x0f, 0x58, 0x0b, 0x2e, 0x21, - 0xe0, 0xcc, 0x3e, 0x8f, 0xe7, 0xde, 0x2c, 0x09, 0xda, 0x38, 0x8e, 0x23, - 0xd6, 0x1f, 0x94, 0x03, 0x0e, 0x1e, 0x4a, 0xdb, 0xe9, 0xe1, 0x71, 0x85, - 0x66, 0x16, 0x50, 0xba, 0x94, 0xc3, 0xeb, 0x4a, 0x09, 0x71, 0x9e, 0xd0, - 0x68, 0x01, 0xd3, 0xb2, 0xe4, 0x2d, 0x31, 0x97, 0xb1, 0x18, 0x29, 0x2d, - 0xc2, 0xf5, 0x0c, 0x5d, 0x81, 0xe0, 0x68, 0x1e, 0xe0, 0xd5, 0xeb, 0x8d, - 0xee, 0xa2, 0xce, 0x5b, 0x35, 0x2e, 0xaa, 0xd1, 0x76, 0x9f, 0x81, 0x20, - 0x99, 0x47, 0xd1, 0xde, 0x46, 0x9d, 0x64, 0xd3, 0x6a, 0xb8, 0x93, 0x95, - 0x60, 0xb8, 0xf0, 0x57, 0x73, 0x2e, 0x76, 0xba, 0xa4, 0x1e, 0x6e, 0x3f, - 0xab, 0x49, 0x2f, 0x9b, 0x31, 0xbb, 0xcd, 0xc1, 0x96, 0xe8, 0x97, 0xb9, - 0x49, 0x40, 0x9d, 0xdf, 0x30, 0xa4, 0x55, 0x41, 0x06, 0xb6, 0xad, 0xab, - 0x23, 0x2b, 0x8c, 0xee, 0xc0, 0xbd, 0x46, 0xad, 0x55, 0x17, 0x3d, 0x17, - 0x3e, 0xfc, 0x1d, 0x83, 0xb4, 0x45, 0xfa, 0x75, 0xf0, 0x80, 0x4b, 0xb4, - 0x36, 0x70, 0xc0, 0xd9, 0x23, 0x33, 0x17, 0x60, 0xf3, 0x93, 0x11, 0x5a, - 0x81, 0x4f, 0x2d, 0x84, 0xaf, 0x59, 0xb8, 0x5c, 0x05, 0x66, 0xc7, 0x13, - 0x21, 0x5c, 0x47, 0x05, 0xf1, 0x14, 0x43, 0xeb, 0x69, 0x30, 0x1c, 0x26, - 0x87, 0x41, 0x15, 0x8a, 0xc0, 0x5c, 0xb2, 0x01, 0xa0, 0x21, 0x92, 0x68, - 0xb3, 0x57, 0x7b, 0x15, 0x08, 0x17, 0x79, 0x5d, 0x5c, 0x64, 0xd6, 0x01, - 0x58, 0xa3, 0x04, 0x3d, 0xd8, 0x2d, 0xb6, 0xe9, 0x3f, 0xce, 0xf0, 0xa4, - 0x0c, 0x22, 0x1d, 0x2d, 0x8c, 0x87, 0x2d, 0xbe, 0x5c, 0x27, 0x9b, 0x57, - 0xd2, 0x13, 0x66, 0x46, 0x43, 0x40, 0x67, 0xb2, 0x61, 0x76, 0x2e, 0xa5, - 0x04, 0xb5, 0x83, 0xea, 0xe0, 0x37, 0x8c, 0x60, 0x4f, 0x08, 0xf8, 0x8d, - 0x2c, 0x79, 0x1e, 0xc2, 0x27, 0x30, 0xee, 0x20, 0x0f, 0xf9, 0xe4, 0xb6, - 0x00, 0x14, 0x42, 0x15, 0x93, 0x65, 0x96, 0x4b, 0x8e, 0xe0, 0xb7, 0x65, - 0xdb, 0x4f, 0xd0, 0xd4, 0xa1, 0x03, 0xd2, 0x37, 0xb9, 0x76, 0x23, 0x79, - 0xbd, 0xa4, 0x89, 0x45, 0x88, 0x9f, 0xcb, 0x51, 0x98, 0x47, 0xdb, 0xea, - 0xa7, 0xf5, 0xe1, 0xb1, 0xe1, 0xb5, 0x30, 0x6b, 0x76, 0x6e, 0x20, 0xa2, - 0x88, 0xf7, 0xe5, 0xe2, 0x9f, 0xbb, 0x01, 0xfd, 0x9c, 0xae, 0xd3, 0x85, - 0x5c, 0xa2, 0xc0, 0x32, 0x72, 0x54, 0x21, 0x9f, 0x0c, 0xce, 0x58, 0x93, - 0xd9, 0x72, 0x91, 0xd6, 0x2f, 0x33, 0x88, 0x35, 0xee, 0x2f, 0x2c, 0xf3, - 0x78, 0x18, 0xdc, 0x6c, 0x1c, 0x76, 0xe5, 0x5a, 0x37, 0x83, 0x9b, 0x9c, - 0x83, 0x90, 0x47, 0xbc, 0xf2, 0x58, 0xf7, 0xde, 0xe4, 0x14, 0xc3, 0x3d, - 0x0b, 0x54, 0xa6, 0x44, 0xe8, 0x08, 0x4e, 0x00, 0x4e, 0xc4, 0xbd, 0x5c, - 0xf2, 0xa7, 0x42, 0x77, 0x19, 0x61, 0xa7, 0x21, 0x8c, 0x7d, 0xe7, 0x88, - 0x31, 0x51, 0xfb, 0x65, 0x71, 0x21, 0x94, 0x92, 0x43, 0xac, 0x6c, 0x40, - 0x2b, 0x88, 0xac, 0x03, 0x90, 0x31, 0x19, 0x15, 0x57, 0x82, 0x97, 0x09, - 0x6a, 0x8b, 0x4f, 0x91, 0x83, 0x6d, 0x58, 0x3c, 0x66, 0xb9, 0x20, 0xb4, - 0x06, 0xc4, 0x52, 0x00, 0x7c, 0xd1, 0xf2, 0x4b, 0xe9, 0xab, 0xe7, 0xe7, - 0x74, 0x42, 0x39, 0xb5, 0x06, 0x47, 0xad, 0x1d, 0x40, 0x43, 0x09, 0x50, - 0xe0, 0x74, 0x26, 0xed, 0xec, 0x48, 0xee, 0x76, 0xb3, 0x72, 0x25, 0xf0, - 0x05, 0x2e, 0x8c, 0x14, 0xa6, 0x92, 0xa3, 0x02, 0x0a, 0x55, 0xf1, 0x0a, - 0x39, 0x1f, 0x0c, 0xb7, 0xdf, 0x1a, 0x41, 0x37, 0x7f, 0x2c, 0xad, 0xe4, - 0x8a, 0xae, 0x08, 0x7a, 0x29, 0xcb, 0xde, 0xc9, 0x5a, 0x01, 0x93, 0x52, - 0xca, 0xcd, 0x63, 0x66, 0xdf, 0xfe, 0x00, 0x6e, 0xb8, 0x11, 0xe7, 0x65, - 0xee, 0xbe, 0xb9, 0xd9, 0xcd, 0x8f, 0x3b, 0xe4, 0xe9, 0xb2, 0xae, 0x14, - 0x51, 0xa8, 0x3b, 0x70, 0xb1, 0xff, 0xa2, 0x2f, 0xf0, 0x28, 0xfb, 0x7d, - 0xe0, 0x20, 0x79, 0x5c, 0x14, 0xb1, 0x4b, 0x77, 0x13, 0x53, 0xd8, 0xb1, - 0x1c, 0xc3, 0xf2, 0xe4, 0x4b, 0x43, 0xce, 0xa2, 0x56, 0x78, 0x67, 0xba, - 0x30, 0xc6, 0xf6, 0x51, 0xf4, 0x5e, 0x62, 0xc6, 0x49, 0x0d, 0xa2, 0x59, - 0x35, 0xac, 0x56, 0x00, 0x27, 0xa2, 0xfc, 0x9f, 0xfc, 0xb7, 0x65, 0x19, - 0x45, 0x48, 0x07, 0x56, 0x0b, 0xb5, 0x18, 0x7c, 0xdb, 0x5f, 0xcc, 0x49, - 0x3e, 0xcd, 0xf8, 0x00, 0xb5, 0x16, 0x35, 0x57, 0xbe, 0x6f, 0x08, 0x9d, - 0x74, 0x8d, 0x30, 0x22, 0xba, 0x07, 0xea, 0x3f, 0xcc, 0xb0, 0x94, 0x77, - 0x61, 0xcf, 0x41, 0x6f, 0xd0, 0xf6, 0xee, 0x0c, 0xe3, 0x1b, 0xeb, 0x3d, - 0x39, 0x7e, 0x8d, 0x02, 0x4c, 0x70, 0xac, 0xd9, 0xd9, 0xcf, 0x01, 0x3a, - 0x45, 0x15, 0x5a, 0xff, 0x8c, 0x7b, 0xc4, 0xc0, 0x40, 0x28, 0xf9, 0x8d, - 0x21, 0xdd, 0xef, 0xb0, 0x58, 0xb3, 0x1a, 0x32, 0x1e, 0x7b, 0xeb, 0x09, - 0x70, 0x54, 0x33, 0x93, 0x4a, 0x51, 0x3b, 0x72, 0x65, 0x85, 0xf6, 0xa0, - 0x0d, 0x98, 0x40, 0x31, 0xfa, 0x0d, 0x3b, 0x95, 0x7c, 0xd5, 0xbe, 0x69, - 0x3b, 0xf8, 0xfa, 0x92, 0xec, 0x3f, 0x66, 0x2c, 0xfe, 0x44, 0xed, 0x50, - 0x60, 0x39, 0x7a, 0x36, 0x0d, 0x4d, 0xc1, 0x0e, 0xba, 0xbf, 0xb8, 0xba, - 0x60, 0x3a, 0x7a, 0x65, 0x1d, 0x26, 0x8a, 0x76, 0xf2, 0x53, 0x02, 0xb0, - 0x7a, 0x3b, 0x01, 0x41, 0xb5, 0x7b, 0x39, 0x90, 0x02, 0x6d, 0x06, 0x20, - 0x67, 0xe0, 0xd1, 0xeb, 0x9a, 0x3b, 0x4e, 0xdd, 0x9a, 0x13, 0x08, 0x9f, - 0x42, 0x78, 0x8d, 0x6a, 0x54, 0x6d, 0x08, 0x03, 0x4a, 0x06, 0xe5, 0x9a, - 0x88, 0xc0, 0x42, 0xd3, 0x53, 0x77, 0x1c, 0xe7, 0xfc, 0xff, 0x4e, 0xec, - 0xe1, 0xbb, 0x37, 0xd6, 0x4f, 0xa8, 0xfb, 0x46, 0xa1, 0x17, 0xd1, 0xc1, - 0x0b, 0x98, 0x40, 0x82, 0x32, 0xce, 0x1c, 0x1f, 0x47, 0x1d, 0x87, 0x1f, - 0x1b, 0xfb, 0x96, 0x7e, 0xf5, 0x0a, 0xd9, 0x9c, 0xcb, 0xc8, 0xaf, 0x65, - 0x23, 0x8f, 0xc2, 0x54, 0xbe, 0x33, 0x27, 0x24, 0x73, 0x3c, 0xe3, 0xef, - 0xce, 0x70, 0xb1, 0x50, 0xc8, 0x35, 0x0f, 0x14, 0xd7, 0x17, 0xd9, 0xff, - 0x9f, 0x9e, 0x5f, 0x53, 0x84, 0xfb, 0x9d, 0xcc, 0xaf, 0xf6, 0x16, 0x84, - 0x8e, 0x75, 0x3a, 0xa0, 0x51, 0x8d, 0x86, 0xc2, 0x05, 0x15, 0xa4, 0x6c, - 0x36, 0x0b, 0xca, 0x70, 0x30, 0x66, 0xba, 0x76, 0x8b, 0x63, 0x50, 0xc1, - 0xa3, 0x26, 0x73, 0x8c, 0x0c, 0x53, 0x95, 0xf8, 0xaf, 0xb2, 0x97, 0x34, - 0xd5, 0x1d, 0x8f, 0xd6, 0x63, 0x8a, 0x55, 0xf4, 0x5c, 0x68, 0x06, 0x8a, - 0xbe, 0x61, 0x1f, 0x77, 0x69, 0xd9, 0xec, 0x98, 0x29, 0xe5, 0x62, 0xe3, - 0xee, 0x3e, 0xe0, 0x4a, 0xb3, 0xc3, 0x87, 0xae, 0x6e, 0x63, 0x93, 0x64, - 0xa7, 0x1a, 0xab, 0x14, 0x82, 0x8e, 0xa2, 0x30, 0xb6, 0x8f, 0xcc, 0x8e, - 0x16, 0xf7, 0x22, 0xd2, 0xef, 0x49, 0x87, 0xa5, 0x22, 0xa0, 0x70, 0x6b, - 0xed, 0x2e, 0x07, 0xde, 0xfe, 0x1c, 0xca, 0xbd, 0x64, 0xca, 0xa5, 0xcc, - 0x89, 0x62, 0x9b, 0x03, 0x53, 0x54, 0x59, 0xd4, 0xec, 0xe6, 0x08, 0x15, - 0xaf, 0x7a, 0xb7, 0xff, 0x4c, 0x26, 0x8a, 0xf5, 0xa5, 0x5f, 0xd6, 0xae, - 0x2b, 0x0e, 0x8b, 0x74, 0xe8, 0xb1, 0xca, 0xa6, 0x0c, 0xd5, 0x60, 0xe9, - 0x39, 0xa4, 0x11, 0xcb, 0x26, 0x10, 0xbf, 0x93, 0xb8, 0xa5, 0x2c, 0x3e, - 0xc9, 0xac, 0xa1, 0x58, 0xe2, 0x5b, 0x06, 0x57, 0x3e, 0x8d, 0xda, 0x39, - 0x78, 0x1f, 0x42, 0x06, 0xe2, 0x8b, 0x50, 0x06, 0x03, 0x5b, 0x69, 0x00, - 0x04, 0xa8, 0x00, 0x7b, 0x95, 0x6b, 0xad, 0x06, 0x48, 0x68, 0x24, 0x3d, - 0xd9, 0xd9, 0x72, 0x17, 0x32, 0xaf, 0xe7, 0x26, 0x4f, 0x14, 0xd3, 0xcf, - 0xf5, 0x72, 0x3d, 0x21, 0xc2, 0x66, 0xdf, 0x51, 0xb4, 0x6c, 0x86, 0xd8, - 0x49, 0x40, 0xfc, 0x89, 0x46, 0xa7, 0x9a, 0xd9, 0x88, 0x25, 0x07, 0x82, - 0x0e, 0xc7, 0xb4, 0x2f, 0x4c, 0x5c, 0xf3, 0x79, 0x1e, 0xe0, 0x17, 0x0e, - 0xf2, 0x61, 0x55, 0x6d, 0x88, 0x9c, 0x15, 0xfd, 0x2d, 0x26, 0xd2, 0x5c, - 0xa5, 0x6f, 0xc0, 0x2b, 0xb2, 0xe6, 0xe9, 0xa9, 0x08, 0x04, 0x8d, 0x50, - 0x01, 0xd1, 0x35, 0x80, 0x12, 0x95, 0xec, 0xaa, 0xab, 0x50, 0xf7, 0xb7, - 0xc6, 0xb1, 0xb2, 0x0a, 0xee, 0x59, 0x15, 0x82, 0x17, 0x37, 0x2c, 0x86, - 0x6b, 0x8d, 0x7c, 0xb6, 0xe8, 0x9e, 0xf4, 0x2b, 0x8a, 0x0c, 0x28, 0x83, - 0x7d, 0x05, 0x1c, 0x69, 0x66, 0x07, 0x2c, 0x79, 0x05, 0xb6, 0xd4, 0xe0, - 0xbc, 0xc0, 0x76, 0x7d, 0xa2, 0x68, 0xb6, 0x0f, 0x78, 0x8b, 0x47, 0xd1, - 0x77, 0x26, 0xd0, 0x28, 0x34, 0x2b, 0x20, 0xd0, 0xb0, 0x3e, 0x86, 0x12, - 0x2c, 0x4b, 0x09, 0x4a, 0x08, 0xbc, 0x4e, 0x19, 0xf1, 0x65, 0x65, 0x36, - 0x86, 0x2a, 0x96, 0xf1, 0x18, 0xe0, 0x0d, 0xd6, 0x0e, 0x4d, 0xd5, 0x5b, - 0x36, 0x43, 0x53, 0x11, 0xa1, 0xcc, 0x22, 0x40, 0x81, 0xb5, 0xce, 0x67, - 0x0d, 0xfd, 0xe0, 0xda, 0xeb, 0xba, 0x62, 0xc9, 0xb0, 0xa7, 0x8d, 0xec, - 0x44, 0xa1, 0x4b, 0x17, 0xce, 0x0d, 0xe3, 0x95, 0x54, 0xe3, 0x07, 0x8b, - 0xe5, 0x77, 0x52, 0xcf, 0xd1, 0x7c, 0x92, 0xd9, 0x75, 0x1c, 0x78, 0xd5, - 0x3b, 0xc7, 0xe2, 0x9b, 0xdb, 0x58, 0x1e, 0xe6, 0xda, 0x47, 0xba, 0xea, - 0x10, 0xac, 0xdc, 0x99, 0x81, 0x5b, 0x72, 0x10, 0xc3, 0x8c, 0xe8, 0x7e, - 0x17, 0x2a, 0x0f, 0x45, 0x2c, 0xcc, 0x33, 0xdd, 0xe3, 0x01, 0x51, 0x1a, - 0x4c, 0x70, 0x52, 0xd8, 0x8b, 0xa3, 0x92, 0x22, 0x58, 0x68, 0x1c, 0xb4, - 0x31, 0xed, 0x99, 0x07, 0x90, 0x35, 0x0b, 0x3d, 0x41, 0x91, 0x6d, 0xe5, - 0x6a, 0xe9, 0x1b, 0x3a, 0x2f, 0x0d, 0xe8, 0xb5, 0x56, 0xf1, 0x49, 0xd8, - 0xb1, 0xa8, 0xf3, 0x4b, 0xdf, 0xd2, 0x3c, 0x0d, 0xd8, 0x36, 0x73, 0xb3, - 0xa5, 0x03, 0xac, 0x81, 0x0e, 0xb9, 0xcc, 0x37, 0x7b, 0x8a, 0xf6, 0xf8, - 0x9a, 0x24, 0x15, 0xab, 0xf6, 0x02, 0x7c, 0x79, 0x1b, 0x3e, 0x40, 0x23, - 0xdb, 0x53, 0xcc, 0x34, 0x96, 0x27, 0x74, 0xdf, 0x85, 0x2d, 0xee, 0x1e, - 0x3c, 0xf3, 0xab, 0xb3, 0x1f, 0x99, 0xd7, 0x75, 0xa1, 0x88, 0x41, 0xf7, - 0x28, 0x98, 0x93, 0x5f, 0x49, 0xc3, 0x28, 0x3d, 0xad, 0x23, 0x57, 0xb1, - 0xa0, 0x4c, 0x4a, 0x25, 0x3c, 0xef, 0xaa, 0xd0, 0x57, 0xc1, 0x0e, 0x4e, - 0x8f, 0xa7, 0xd2, 0x7e, 0x95, 0xb6, 0x50, 0x0e, 0x7f, 0x00, 0x49, 0xb0, - 0x78, 0x62, 0x2d, 0x5b, 0xf1, 0xc4, 0xa8, 0xc7, 0x25, 0x25, 0x1a, 0x3b, - 0x0c, 0xdc, 0xe7, 0xc9, 0x45, 0xf8, 0xfa, 0xd2, 0x49, 0x1c, 0x4d, 0x6a, - 0xc7, 0xc3, 0x75, 0x19, 0x39, 0x58, 0xe1, 0xfd, 0xfd, 0x5e, 0xb9, 0xb8, - 0xda, 0xc0, 0xd0, 0x3b, 0x89, 0xf7, 0xfd, 0x98, 0xc1, 0x67, 0x35, 0x71, - 0x97, 0x26, 0x7b, 0xd0, 0xd6, 0x49, 0x9a, 0xf8, 0xb6, 0xe7, 0xe8, 0x76, - 0x4b, 0xa4, 0x3a, 0xf6, 0x45, 0x43, 0x50, 0xf9, 0x55, 0xda, 0xfd, 0xdb, - 0xd4, 0x39, 0x13, 0x5b, 0x94, 0x37, 0xac, 0x86, 0xa8, 0x80, 0x83, 0x32, - 0x92, 0x00, 0xa7, 0x32, 0x7f, 0xb3, 0x06, 0xe4, 0xb5, 0x70, 0x3c, 0xd5, - 0xfd, 0xbf, 0xb6, 0x51, 0x94, 0x8e, 0x03, 0x62, 0x09, 0x31, 0x65, 0x89, - 0x3b, 0x3d, 0x83, 0xc2, 0xd9, 0x8c, 0x2a, 0x73, 0x97, 0xb6, 0x64, 0x49, - 0x00, 0xa9, 0xe8, 0x9b, 0xdd, 0xd0, 0x5b, 0xc5, 0xa7, 0x00, 0xa2, 0x7d, - 0x56, 0x10, 0x32, 0xd4, 0x5f, 0x07, 0x81, 0x11, 0xd1, 0x50, 0x74, 0x53, - 0x00, 0xf0, 0x5e, 0x2f, 0xb3, 0xe3, 0xa5, 0x77, 0xaf, 0xa7, 0x2e, 0xd0, - 0xb7, 0xcb, 0x1a, 0x95, 0x5f, 0x6c, 0xe1, 0xa3, 0x3a, 0x90, 0x3c, 0x19, - 0x6f, 0x1c, 0xbe, 0x64, 0xd8, 0xcc, 0x58, 0xb1, 0x11, 0x8e, 0xf8, 0x19, - 0x1d, 0x35, 0x62, 0xe2, 0x1f, 0x91, 0x01, 0x8d, 0x50, 0xc1, 0x0b, 0x10, - 0xec, 0x68, 0xf6, 0x6f, 0xc6, 0x8d, 0xb4, 0xa4, 0xb7, 0xc0, 0x1a, 0xa0, - 0x3c, 0x39, 0x8d, 0x57, 0x50, 0xc0, 0xf4, 0xd8, 0x80, 0x7b, 0x4e, 0x27, - 0xec, 0xf1, 0xc4, 0x38, 0x47, 0xd9, 0xfd, 0x2e, 0x44, 0x41, 0xf4, 0xc6, - 0x3c, 0xd9, 0xbb, 0x2d, 0xab, 0x62, 0x9e, 0x4e, 0x0d, 0x21, 0x9c, 0x31, - 0x2c, 0x75, 0x44, 0xe4, 0x25, 0xe1, 0x8f, 0xf8, 0x72, 0x75, 0x73, 0x50, - 0xbc, 0x9a, 0xab, 0x66, 0x71, 0x0a, 0x69, 0x85, 0x4f, 0x0d, 0x2f, 0x3d, - 0x61, 0x87, 0x80, 0x8f, 0xec, 0x7f, 0xdf, 0xdb, 0xdf, 0x9b, 0xd5, 0xa3, - 0x18, 0xad, 0x2e, 0xe1, 0x02, 0xe1, 0x06, 0x2c, 0x3b, 0x87, 0x12, 0x15, - 0x72, 0xde, 0xfb, 0x3a, 0xd5, 0xad, 0x61, 0xef, 0x95, 0x10, 0x07, 0xb9, - 0xf9, 0x68, 0x26, 0x98, 0x0a, 0x70, 0xea, 0x06, 0x2e, 0x37, 0xa6, 0x95, - 0x54, 0xec, 0x87, 0xab, 0x5a, 0x1d, 0xc2, 0xf1, 0xaa, 0x45, 0xd7, 0x65, - 0x2e, 0x3d, 0xd2, 0x85, 0xbe, 0x7b, 0x75, 0xe2, 0x79, 0x78, 0xed, 0xe4, - 0x81, 0xc3, 0x31, 0xc8, 0x04, 0x58, 0x01, 0x87, 0x8c, 0xe7, 0xf0, 0xfc, - 0xae, 0x00, 0xb0, 0x6d, 0x64, 0x05, 0x76, 0x52, 0xc8, 0x7d, 0xaa, 0xaf, - 0xcf, 0x00, 0x22, 0xc7, 0x61, 0x56, 0x76, 0x81, 0xdb, 0x6b, 0xae, 0xd6, - 0x9c, 0x7a, 0xf9, 0xe3, 0xed, 0xa3, 0x12, 0x0a, 0x4f, 0xc4, 0x82, 0x8b, - 0x2f, 0xa6, 0x0e, 0x3b, 0xcc, 0xee, 0xb5, 0xa5, 0xa7, 0x6b, 0xbd, 0x85, - 0xb2, 0x8a, 0x4d, 0x8e, 0xc4, 0xa3, 0x0b, 0xf1, 0xa6, 0x88, 0xd8, 0x42, - 0x7d, 0xf2, 0xdb, 0x7d, 0xfd, 0xea, 0xfb, 0x74, 0x55, 0x96, 0x9a, 0x41, - 0x37, 0x2d, 0xbf, 0x09, 0xc0, 0xa3, 0xd4, 0x14, 0xff, 0x25, 0x7a, 0x2c, - 0x53, 0xc6, 0xb0, 0x5d, 0xdd, 0x2c, 0xea, 0xc1, 0x38, 0x53, 0x90, 0xc2, - 0x5c, 0x30, 0x86, 0x19, 0xf5, 0xc2, 0x2d, 0xc2, 0x40, 0x7e, 0x62, 0xfb, - 0xe4, 0xc6, 0xe5, 0xa8, 0x45, 0xb9, 0x97, 0x96, 0x6d, 0x60, 0x15, 0xf3, - 0xd3, 0xb7, 0x9b, 0x0b, 0x3c, 0x04, 0xdb, 0xc6, 0x0e, 0xdd, 0xc0, 0xf3, - 0xb3, 0xfd, 0x1f, 0x83, 0xc7, 0x02, 0xe6, 0xf6, 0x4b, 0x3c, 0x67, 0x72, - 0xf6, 0x67, 0xba, 0xef, 0x8c, 0x2d, 0xdb, 0xe2, 0x9b, 0x04, 0x1e, 0xab, - 0x31, 0xd8, 0xf0, 0xd6, 0xe8, 0xe0, 0xbb, 0x0a, 0xb7, 0xca, 0xe3, 0xe1, - 0x80, 0xaa, 0x6e, 0xba, 0x8d, 0xdd, 0xb6, 0x15, 0x5f, 0xa8, 0x99, 0x25, - 0xa6, 0x1f, 0x61, 0xa0, 0x0d, 0x1a, 0x7d, 0xc5, 0x9c, 0x78, 0x9f, 0xcd, - 0x89, 0x19, 0x91, 0x7e, 0xf4, 0x66, 0x13, 0xf6, 0x49, 0xb2, 0x03, 0x0a, - 0xcf, 0x09, 0xc4, 0x16, 0xa9, 0x42, 0xec, 0x78, 0x52, 0x0b, 0x91, 0x18, - 0x32, 0xc8, 0xb3, 0xe6, 0xb1, 0x11, 0xe1, 0xb1, 0x7e, 0x77, 0x95, 0x99, - 0xad, 0xab, 0x92, 0x63, 0x92, 0xaf, 0x2a, 0xe4, 0x28, 0xd4, 0x79, 0xbc, - 0x59, 0x28, 0xc8, 0xcf, 0x2c, 0x74, 0xf3, 0xca, 0x6c, 0xfe, 0xd9, 0x74, - 0x2d, 0xd4, 0x9a, 0xc9, 0x19, 0xc2, 0x5e, 0xa2, 0x13, 0x39, 0x49, 0x44, - 0x45, 0x2c, 0x19, 0x7e, 0xeb, 0x7f, 0xf9, 0xa8, 0x40, 0xda, 0x63, 0x61, - 0x49, 0x3f, 0x79, 0xc0, 0xa7, 0x1c, 0xe1, 0x69, 0xfa, 0xea, 0x20, 0xc6, - 0x62, 0x5b, 0x3f, 0x44, 0xaa, 0x69, 0x65, 0x62, 0x9b, 0x35, 0x2c, 0xb4, - 0x26, 0x4f, 0x2d, 0xb4, 0x12, 0x83, 0xc2, 0x0b, 0xaa, 0x86, 0x10, 0x22, - 0x30, 0xd2, 0xb0, 0x40, 0x0f, 0x49, 0x42, 0xad, 0xef, 0xac, 0xbd, 0x0e, - 0x41, 0x66, 0xff, 0x83, 0x74, 0x1b, 0xc4, 0x03, 0xba, 0x59, 0x82, 0xe1, - 0xf7, 0xc0, 0x46, 0xe9, 0xe3, 0xcf, 0x5e, 0xf9, 0x81, 0xa6, 0x54, 0xf8, - 0x5b, 0xf9, 0x3a, 0x43, 0x79, 0x21, 0x79, 0xa5, 0x1a, 0xb5, 0xec, 0x35, - 0x38, 0xed, 0x60, 0x21, 0xd3, 0xdb, 0x48, 0x39, 0x8a, 0x27, 0x23, 0x81, - 0x91, 0xa4, 0x3f, 0xc5, 0x39, 0x48, 0xf9, 0xaa, 0xa4, 0x91, 0x97, 0xfa, - 0x78, 0xc1, 0xee, 0x76, 0x7c, 0x5f, 0x5a, 0x5c, 0x71, 0xa5, 0x05, 0x33, - 0x0a, 0x73, 0x5c, 0xc3, 0xcc, 0xa2, 0x31, 0xd0, 0x61, 0xe4, 0xf0, 0x48, - 0xa2, 0xbb, 0xd3, 0x3f, 0xdf, 0xd1, 0xce, 0x63, 0x65, 0x74, 0x3d, 0x98, - 0xc1, 0x0b, 0xf7, 0xfc, 0x8f, 0x27, 0x6f, 0xae, 0x3c, 0x73, 0x97, 0x46, - 0xfd, 0x8f, 0x1f, 0xc3, 0x96, 0x09, 0xfe, 0x2b, 0xbe, 0xb2, 0xe9, 0x21, - 0xb2, 0xca, 0x08, 0x12, 0x8a, 0x4a, 0x0a, 0x29, 0x91, 0x29, 0x60, 0x1f, - 0x7b, 0x5e, 0xe5, 0x02, 0x85, 0xed, 0x83, 0xae, 0x52, 0x10, 0x6a, 0xa9, - 0x51, 0x7e, 0x8c, 0x1f, 0xd2, 0xfd, 0x66, 0x32, 0xc6, 0x48, 0x7b, 0x87, - 0x39, 0xb4, 0xba, 0x47, 0x51, 0x09, 0xf9, 0x8f, 0x03, 0xda, 0x54, 0x71, - 0x39, 0x85, 0x02, 0x9a, 0x3a, 0x96, 0x1b, 0xe5, 0x1d, 0xa8, 0x01, 0xc1, - 0xb4, 0x3a, 0x57, 0x7d, 0x50, 0x62, 0x80, 0x48, 0x6c, 0x67, 0x09, 0xe6, - 0x81, 0x32, 0x15, 0xec, 0xe6, 0xcd, 0x77, 0x5c, 0x9c, 0x62, 0x66, 0x89, - 0xc9, 0x9c, 0x79, 0xeb, 0x71, 0x8c, 0xe1, 0xc7, 0x63, 0xae, 0x21, 0xe8, - 0xbd, 0x1a, 0x2c, 0x28, 0xd9, 0xf5, 0xd3, 0xc2, 0xf5, 0x15, 0xd4, 0x98, - 0x64, 0xbb, 0x41, 0x5e, 0x98, 0x48, 0x77, 0xaa, 0x6b, 0x0c, 0x3d, 0x96, - 0x17, 0x50, 0xfb, 0xa1, 0x9b, 0x3a, 0x98, 0xaa, 0x46, 0x36, 0xd7, 0x99, - 0xac, 0xf7, 0x84, 0xee, 0xcd, 0xac, 0x8d, 0xf9, 0x1f, 0x3d, 0x7e, 0x56, - 0x10, 0xef, 0x73, 0x08, 0xdc, 0x6f, 0xc1, 0xc9, 0x13, 0x37, 0xe3, 0x7e, - 0x9b, 0x8d, 0xd9, 0x73, 0x2c, 0xa0, 0xf4, 0x40, 0x80, 0x5e, 0xc5, 0xc2, - 0xa4, 0x27, 0xcf, 0xaa, 0xa9, 0x5a, 0xcb, 0x5c, 0x04, 0x06, 0x68, 0xc1, - 0x5d, 0x18, 0x12, 0x54, 0xa4, 0x13, 0x74, 0x26, 0xc4, 0x1b, 0x5f, 0x2e, - 0x3a, 0xa0, 0x06, 0x8d, 0x02, 0xcf, 0x16, 0xbb, 0x2b, 0xac, 0xc6, 0xa6, - 0x98, 0x79, 0xb1, 0x78, 0x82, 0xce, 0x4d, 0x19, 0xa8, 0x76, 0x6b, 0x94, - 0x67, 0xb8, 0x50, 0x52, 0xfc, 0xa4, 0xb0, 0x75, 0x3d, 0x40, 0xd5, 0x91, - 0x1e, 0x74, 0xdb, 0x69, 0x0d, 0x89, 0xbe, 0xbc, 0xb4, 0x95, 0xb1, 0x5e, - 0x15, 0x3e, 0xa4, 0x6e, 0x35, 0x67, 0xa6, 0x88, 0x6a, 0x13, 0x30, 0xe8, - 0xcf, 0xa0, 0x6d, 0x07, 0x7b, 0x8d, 0x00, 0xd7, 0xba, 0x55, 0xd0, 0x78, - 0xf8, 0x3b, 0xec, 0xe6, 0xeb, 0xb4, 0x3f, 0x72, 0xde, 0xcd, 0x88, 0x2f, - 0x6b, 0xcf, 0xdb, 0xd5, 0xac, 0x20, 0x7c, 0x47, 0x54, 0x8a, 0x95, 0x02, - 0x64, 0x55, 0x45, 0x1c, 0x61, 0xfc, 0xba, 0xbd, 0x54, 0x44, 0x1d, 0xdd, - 0xfb, 0x69, 0x7f, 0x49, 0xb2, 0x70, 0x04, 0xa3, 0x40, 0x0f, 0xa8, 0xf0, - 0x27, 0x71, 0x92, 0x84, 0xc8, 0x33, 0xf9, 0x11, 0xa0, 0x14, 0x8c, 0x32, - 0x5c, 0x4f, 0x27, 0x67, 0x72, 0xf2, 0xbd, 0xb4, 0xd1, 0xf4, 0xe7, 0xeb, - 0x01, 0x21, 0x1e, 0x3d, 0x5d, 0x09, 0xfc, 0x4c, 0x91, 0x75, 0xb1, 0x5f, - 0x80, 0x8d, 0xb2, 0x3e, 0x61, 0x52, 0x22, 0x6d, 0x0c, 0x16, 0x1f, 0xdd, - 0x1f, 0xf2, 0xe8, 0x2e, 0xdf, 0x97, 0xa8, 0x64, 0x8b, 0x25, 0x3b, 0x16, - 0x65, 0x61, 0xcc, 0x54, 0x8d, 0x61, 0x63, 0x7b, 0x2f, 0x5c, 0x42, 0xe9, - 0xe7, 0x0a, 0x6e, 0xe0, 0x9f, 0x7f, 0x75, 0x7d, 0xf7, 0xc3, 0xac, 0x3e, - 0x68, 0x24, 0xa5, 0xc8, 0xc5, 0x08, 0x6e, 0x76, 0xb1, 0x82, 0x55, 0xe6, - 0x0b, 0xa8, 0x99, 0x0f, 0xc1, 0x7f, 0xe6, 0x6f, 0x79, 0xde, 0x30, 0xa6, - 0x19, 0xb8, 0xb4, 0x83, 0xd5, 0xa3, 0x9a, 0x1d, 0x11, 0x41, 0x93, 0x95, - 0x19, 0x2d, 0x13, 0xf8, 0x87, 0x12, 0x0c, 0xbf, 0x6a, 0xd5, 0xf1, 0xa7, - 0x30, 0x13, 0xca, 0x9f, 0x28, 0x22, 0xee, 0x14, 0xc4, 0x01, 0x8e, 0xed, - 0x07, 0x44, 0x6d, 0xb8, 0xcc, 0xdd, 0x31, 0x80, 0x71, 0x4f, 0xc2, 0xf6, - 0x35, 0xa9, 0x51, 0x90, 0xe6, 0x26, 0x10, 0x2c, 0x2d, 0xe4, 0x60, 0x7d, - 0xd0, 0x47, 0xc4, 0xca, 0xba, 0x09, 0x77, 0xe6, 0x56, 0x03, 0x83, 0x87, - 0x46, 0xad, 0x19, 0x25, 0xe6, 0x1d, 0xbf, 0x7c, 0x9c, 0x07, 0x8b, 0x47, - 0x67, 0x19, 0x81, 0xe4, 0x75, 0x39, 0xfd, 0x7c, 0x72, 0xc4, 0xdc, 0x97, - 0x8b, 0xcb, 0x56, 0x71, 0x3c, 0xc5, 0x55, 0xb5, 0xe6, 0xf1, 0x31, 0x78, - 0x85, 0xa9, 0xbc, 0xf1, 0xf5, 0x1d, 0x55, 0xde, 0x7b, 0x0a, 0x34, 0x33, - 0x4f, 0x77, 0xdb, 0x20, 0x38, 0xc4, 0x99, 0xf9, 0x90, 0x28, 0xd3, 0x7d, - 0xc2, 0x8a, 0x74, 0xa5, 0x4b, 0xa7, 0xe5, 0x68, 0x4c, 0x50, 0x57, 0x3d, - 0x76, 0x04, 0x6c, 0x60, 0xc7, 0xb3, 0x7e, 0xff, 0x08, 0x09, 0x3a, 0x1e, - 0x78, 0x0b, 0xb7, 0xd7, 0x4a, 0xdc, 0xf6, 0x13, 0xc6, 0x99, 0x8f, 0xb9, - 0x85, 0x51, 0x46, 0xfd, 0xc6, 0x75, 0x81, 0xa5, 0x82, 0xdb, 0xbf, 0xf2, - 0x02, 0x4f, 0xc1, 0x47, 0x3e, 0x33, 0xcf, 0xec, 0x4e, 0x28, 0x1b, 0xac, - 0xdb, 0xf1, 0x25, 0xc3, 0x6b, 0xc9, 0xdb, 0x6e, 0xba, 0x9b, 0x10, 0xff, - 0x79, 0x5f, 0xc3, 0xf9, 0x1c, 0xd5, 0x53, 0xad, 0xaa, 0x13, 0xe1, 0xf0, - 0xda, 0xed, 0x73, 0x40, 0xd8, 0x05, 0x87, 0x04, 0x52, 0xe6, 0x9e, 0x2e, - 0x8e, 0x26, 0x0e, 0x30, 0x1f, 0x4b, 0xc4, 0x40, 0xc8, 0x2c, 0x76, 0x13, - 0xdb, 0x86, 0x8c, 0x95, 0x8a, 0x0a, 0x2e, 0x60, 0x8a, 0x76, 0xc1, 0x64, - 0x59, 0xb8, 0x02, 0x9e, 0x5b, 0x2b, 0x1a, 0x8d, 0xb2, 0x9d, 0xef, 0xc4, - 0xbf, 0x89, 0x16, 0x78, 0x12, 0x39, 0x4f, 0x30, 0x8e, 0x8b, 0x6e, 0x79, - 0xdf, 0x15, 0xc0, 0xb5, 0xcd, 0xf7, 0x29, 0xd1, 0xd8, 0xb4, 0x96, 0xe6, - 0x69, 0x3c, 0x03, 0x8d, 0xf1, 0xed, 0xb0, 0x27, 0x4e, 0x60, 0x4f, 0x1c, - 0x5f, 0x42, 0x29, 0xd0, 0x63, 0x5e, 0xb9, 0x72, 0x4f, 0xff, 0x9f, 0x9b, - 0x0c, 0x46, 0xc1, 0x95, 0x41, 0x56, 0x6a, 0xf0, 0xdd, 0x69, 0x91, 0xef, - 0x94, 0xca, 0xac, 0x1b, 0x8d, 0x77, 0x22, 0xdc, 0x4a, 0x0e, 0x47, 0x33, - 0x50, 0xa2, 0x72, 0xcc, 0x11, 0x05, 0x5c, 0x1c, 0xa2, 0x9b, 0xd9, 0xc8, - 0x64, 0xa7, 0x69, 0xbe, 0xce, 0xa5, 0xba, 0xb5, 0x39, 0x84, 0x77, 0x79, - 0x2d, 0xd4, 0x12, 0xc9, 0x12, 0xdd, 0x33, 0x89, 0x1e, 0x26, 0xcb, 0x2e, - 0x08, 0xc9, 0xc5, 0x5e, 0x18, 0x40, 0x3b, 0x90, 0x11, 0x69, 0x66, 0xbd, - 0xbe, 0xe3, 0xaa, 0xc3, 0x22, 0xea, 0xf6, 0x12, 0x94, 0xf9, 0x0a, 0x5d, - 0x1f, 0xaf, 0x7f, 0x31, 0x76, 0x9a, 0x7d, 0x04, 0xb3, 0x2a, 0x11, 0xd5, - 0x8e, 0x13, 0x7d, 0xf3, 0x5d, 0x2b, 0x15, 0x92, 0xa1, 0x8b, 0x04, 0x2b, - 0x02, 0xeb, 0x75, 0xaf, 0x3f, 0x96, 0x98, 0xd0, 0x1b, 0xb4, 0x2e, 0xa8, - 0x25, 0x9f, 0xec, 0x11, 0x4b, 0xa4, 0x98, 0xbb, 0xce, 0x97, 0xb5, 0xae, - 0x63, 0xca, 0xc2, 0xc9, 0x95, 0x93, 0x0d, 0xa1, 0xc4, 0x36, 0x7a, 0xcd, - 0x09, 0xa3, 0x8e, 0xca, 0x5f, 0xe7, 0x1d, 0x4c, 0xc9, 0xa9, 0x08, 0x58, - 0xf1, 0x32, 0x6b, 0x8d, 0x48, 0x58, 0x9f, 0x35, 0x9f, 0x67, 0x5d, 0xfb, - 0x8d, 0xe9, 0xd3, 0xf0, 0x80, 0xfb, 0x98, 0x74, 0x43, 0x25, 0x57, 0x73, - 0x0f, 0xdc, 0x99, 0xfe, 0x0b, 0x87, 0xa3, 0xe3, 0xaf, 0x77, 0xbb, 0x0d, - 0x80, 0xc2, 0x8f, 0x5a, 0xa7, 0x2e, 0x79, 0x22, 0x9f, 0x92, 0xb8, 0xcd, - 0xf4, 0x72, 0xf4, 0xe4, 0x89, 0x52, 0xeb, 0x2c, 0x1a, 0xaf, 0xcd, 0x9b, - 0xf8, 0xa8, 0x28, 0xbc, 0x98, 0x85, 0xbc, 0xe5, 0x46, 0x94, 0xdc, 0x07, - 0x9d, 0xbc, 0xd7, 0x5f, 0xd5, 0x23, 0x1a, 0x58, 0x66, 0x0c, 0xb6, 0x38, - 0x9b, 0x05, 0x60, 0xd8, 0x5a, 0x8e, 0x8a, 0x51, 0xc5, 0x88, 0xdc, 0x8a, - 0x4e, 0xf0, 0x60, 0x09, 0x08, 0xc5, 0x6a, 0x01, 0xd6, 0xe4, 0x28, 0x2d, - 0xc0, 0x74, 0x5b, 0x6b, 0xcc, 0x6a, 0x36, 0xe0, 0xea, 0x64, 0xd2, 0x84, - 0xd2, 0xef, 0xd8, 0xf8, 0x68, 0xad, 0xe5, 0x8d, 0x45, 0x7e, 0x22, 0x84, - 0x85, 0xd2, 0xf6, 0xd2, 0x80, 0xed, 0x7f, 0x31, 0x09, 0xce, 0xbe, 0x22, - 0xe2, 0x5a, 0x76, 0x3f, 0x99, 0x7d, 0x36, 0x33, 0xb6, 0x76, 0x08, 0x5f, - 0xf6, 0x13, 0x0f, 0xd8, 0xcd, 0x38, 0xbf, 0x06, 0xee, 0x10, 0xb4, 0xeb, - 0x83, 0xdb, 0x79, 0xc3, 0xc1, 0x6f, 0x59, 0x51, 0x20, 0xe4, 0x6c, 0x87, - 0x1b, 0x92, 0x2b, 0x5d, 0xf5, 0x88, 0xf5, 0x2f, 0x11, 0xd8, 0x33, 0x61, - 0x4a, 0x83, 0xf3, 0xf8, 0x82, 0x73, 0x54, 0x9c, 0x32, 0x18, 0xfc, 0x7e, - 0xb7, 0x5b, 0x02, 0x84, 0x04, 0x78, 0xee, 0xcc, 0x09, 0x0f, 0x4c, 0xdd, - 0x45, 0xb2, 0x9e, 0x21, 0x25, 0x71, 0xf4, 0x90, 0xa8, 0x3b, 0xb9, 0xa9, - 0xb6, 0x8c, 0x43, 0x98, 0x91, 0x49, 0xa0, 0xec, 0xf8, 0x0c, 0xd4, 0xed, - 0x25, 0xfd, 0x3d, 0x89, 0x59, 0xa3, 0xe7, 0xf0, 0xd7, 0x01, 0xe1, 0x92, - 0x28, 0x29, 0x0f, 0x6f, 0x6a, 0x8f, 0xa2, 0xe1, 0xd1, 0x42, 0x58, 0xe2, - 0x8c, 0x6a, 0x58, 0xd5, 0x0e, 0x8c, 0xef, 0xc5, 0xe1, 0xc9, 0x7c, 0xd1, - 0x4b, 0xd2, 0x36, 0x9a, 0xc9, 0xc2, 0x4b, 0xf6, 0x3c, 0x37, 0x62, 0x7e, - 0x18, 0x73, 0x3d, 0x7d, 0x56, 0x76, 0x4d, 0x8e, 0x3c, 0x2f, 0x10, 0xd2, - 0xe3, 0x65, 0xed, 0x3e, 0x1c, 0xaf, 0xa8, 0x88, 0x21, 0xa3, 0x74, 0xe5, - 0xed, 0x2b, 0x0f, 0x1c, 0x84, 0xfa, 0x09, 0x83, 0x0a, 0xf8, 0xd8, 0xfa, - 0x80, 0x87, 0x17, 0x33, 0x96, 0xd0, 0xf4, 0x82, 0x68, 0x23, 0x36, 0x8e, - 0xca, 0x65, 0xca, 0x36, 0xe9, 0xfb, 0xe6, 0x93, 0x87, 0xf6, 0x99, 0xb7, - 0xa3, 0xdb, 0xdc, 0x19, 0x48, 0xe0, 0xf3, 0x84, 0xf9, 0xd1, 0x00, 0x27, - 0x67, 0xca, 0xcc, 0x85, 0x02, 0xd4, 0xad, 0xad, 0x6c, 0x0d, 0xd6, 0x77, - 0x95, 0xf0, 0x1b, 0x96, 0x14, 0xcd, 0x34, 0x43, 0x2c, 0x50, 0xfa, 0xc1, - 0xa8, 0x3e, 0x53, 0xd9, 0x98, 0xd6, 0xb2, 0x77, 0xbd, 0xb8, 0x6d, 0x3d, - 0x0b, 0x3d, 0x6b, 0x57, 0x3e, 0x2a, 0x84, 0x71, 0x7d, 0xab, 0xcb, 0x1d, - 0x50, 0x47, 0x38, 0xdc, 0x5e, 0x0c, 0x58, 0xdc, 0xd8, 0x9f, 0xba, 0x66, - 0x90, 0x77, 0x4f, 0x00, 0x5e, 0x92, 0xab, 0xb0, 0x0f, 0xb7, 0xc3, 0xa0, - 0xcd, 0x24, 0x27, 0x67, 0x69, 0x7f, 0xd0, 0x57, 0xa7, 0x8a, 0x0c, 0x1f, - 0x3e, 0x86, 0x10, 0xfe, 0x2b, 0x33, 0x6c, 0x44, 0x53, 0xfe, 0x87, 0xbf, - 0x8f, 0xd4, 0x51, 0x65, 0x72, 0x45, 0x31, 0x5f, 0x5e, 0x60, 0x95, 0x3d, - 0x5f, 0xf1, 0xf0, 0x2c, 0x11, 0xdf, 0xc4, 0xb9, 0x90, 0xef, 0x9c, 0xf5, - 0x4e, 0x31, 0x67, 0x62, 0xdb, 0x33, 0x49, 0x39, 0x32, 0x72, 0x74, 0xea, - 0xf2, 0xe8, 0x00, 0xcc, 0x95, 0xff, 0xba, 0xdb, 0xf5, 0xcc, 0x49, 0xed, - 0xa4, 0xf9, 0x84, 0x89, 0xec, 0x61, 0x83, 0x4f, 0x05, 0xde, 0x84, 0x8d, - 0x87, 0xe6, 0x62, 0x11, 0x5b, 0xe0, 0x68, 0x33, 0x5c, 0xcc, 0xdd, 0x51, - 0x5a, 0xa9, 0x9e, 0xc5, 0x48, 0xb7, 0xf1, 0xb2, 0x8a, 0x5e, 0x85, 0x97, - 0xa3, 0x21, 0xb4, 0xa8, 0xb2, 0x64, 0x5b, 0xad, 0x8e, 0xea, 0xe6, 0x32, - 0x7c, 0x09, 0x00, 0x8f, 0xa6, 0x6d, 0x78, 0xfd, 0x30, 0xc1, 0x27, 0x87, - 0xa2, 0xe3, 0x02, 0x13, 0x7c, 0xcc, 0x59, 0x4a, 0xf3, 0x28, 0x25, 0x88, - 0x8e, 0x2f, 0x71, 0x70, 0xe4, 0x44, 0xb2, 0xec, 0x10, 0xa1, 0xe3, 0x54, - 0x3c, 0x50, 0x1b, 0x5a, 0x24, 0xa9, 0xd0, 0xf3, 0x57, 0x3b, 0x1c, 0x62, - 0xab, 0x7c, 0xea, 0x00, 0x72, 0x18, 0xba, 0x39, 0xb0, 0x25, 0x2f, 0x55, - 0x7f, 0x84, 0x34, 0x65, 0x5c, 0x15, 0xad, 0xf0, 0x43, 0x36, 0xf4, 0x8e, - 0xe7, 0xc5, 0x6f, 0x53, 0x02, 0x91, 0xd1, 0x82, 0x3b, 0x1c, 0xa7, 0x0c, - 0x40, 0x36, 0xa5, 0x24, 0xb0, 0x91, 0x0b, 0x9d, 0x3b, 0xe4, 0x95, 0xf8, - 0x09, 0xa9, 0xe3, 0xba, 0x8e, 0x39, 0x46, 0xf6, 0xe2, 0xad, 0x48, 0xe4, - 0x7c, 0x7f, 0x35, 0xb2, 0x6b, 0x1a, 0x19, 0x40, 0x97, 0x48, 0x43, 0xae, - 0xa9, 0x9b, 0xb0, 0xfc, 0x13, 0x1b, 0x49, 0x45, 0x0b, 0x24, 0x5e, 0x68, - 0xfe, 0x15, 0x8e, 0xe8, 0xe4, 0xcf, 0x24, 0xfd, 0x9d, 0x12, 0x5b, 0xc3, - 0x83, 0x11, 0x7d, 0x7c, 0xb2, 0x42, 0xea, 0x68, 0x5f, 0x7f, 0x35, 0x54, - 0x2e, 0x05, 0xc2, 0x0b, 0x23, 0xa2, 0x37, 0x11, 0xba, 0xe8, 0x18, 0x29, - 0x6a, 0x29, 0xc2, 0x90, 0x28, 0xf8, 0x71, 0xd1, 0x17, 0x2b, 0x01, 0xb5, - 0xa3, 0xa6, 0x43, 0xb4, 0xf8, 0x7a, 0x03, 0x0a, 0x3f, 0x8e, 0xb4, 0x11, - 0xbb, 0xcf, 0x58, 0x7e, 0x1b, 0x9e, 0xbb, 0x8c, 0xfb, 0x91, 0x65, 0x02, - 0xa2, 0x88, 0x59, 0xfc, 0x36, 0x7d, 0x4d, 0x19, 0xfd, 0xbb, 0x74, 0x03, - 0xe1, 0xac, 0x80, 0xd9, 0xa6, 0xf1, 0xc7, 0xb0, 0x76, 0x67, 0x97, 0x07, - 0x9d, 0x35, 0x2d, 0xe3, 0x2d, 0x10, 0x9a, 0x00, 0xc4, 0x17, 0xc8, 0xa3, - 0xc9, 0x74, 0x38, 0x5a, 0xcb, 0x08, 0x37, 0x8a, 0x46, 0xa3, 0x97, 0x75, - 0x12, 0x9e, 0xed, 0xf2, 0xfe, 0xe4, 0xb6, 0x21, 0x86, 0x3c, 0x22, 0x15, - 0x7d, 0xe7, 0x51, 0x93, 0xeb, 0x5b, 0x93, 0x32, 0xe2, 0x38, 0x2c, 0xcc, - 0xad, 0x08, 0x0a, 0x1a, 0x13, 0x24, 0x28, 0x6c, 0x81, 0xe3, 0x4b, 0x67, - 0xde, 0x7a, 0xef, 0xa7, 0xc8, 0x98, 0x46, 0x3e, 0x21, 0x14, 0x80, 0xe9, - 0x94, 0x46, 0x79, 0x1a, 0x21, 0x10, 0x4e, 0xf3, 0x81, 0xa2, 0x5a, 0xd2, - 0xad, 0x8c, 0x51, 0xab, 0x33, 0x98, 0x24, 0xa6, 0x23, 0x32, 0xa8, 0xa6, - 0xe0, 0x31, 0xfe, 0xa8, 0xde, 0xeb, 0x58, 0xe7, 0x4b, 0xcf, 0x90, 0xe8, - 0x56, 0x14, 0x27, 0x3b, 0x11, 0x4d, 0x14, 0x0b, 0x4c, 0xe8, 0x19, 0x3c, - 0x43, 0xbb, 0xc0, 0x16, 0x09, 0x4c, 0xa7, 0x32, 0x38, 0x25, 0x37, 0xf4, - 0x8e, 0xab, 0x5a, 0x64, 0x17, 0x95, 0xf5, 0x70, 0x98, 0x13, 0x8a, 0x4e, - 0xf6, 0x2d, 0x44, 0xb4, 0xb2, 0x83, 0x89, 0x16, 0xfd, 0x8a, 0x10, 0x60, - 0x67, 0xb4, 0xab, 0x5b, 0xd2, 0x45, 0x6e, 0x8b, 0xd2, 0x61, 0x01, 0x6d, - 0x7e, 0x2f, 0xc1, 0xa5, 0x5b, 0x44, 0x75, 0xc6, 0x10, 0x18, 0xbe, 0x0d, - 0x42, 0x44, 0xa6, 0xdf, 0xa3, 0xd5, 0xe4, 0x6b, 0xd9, 0xab, 0x07, 0xf2, - 0x70, 0x53, 0x5e, 0xc1, 0x13, 0x64, 0x04, 0xed, 0x35, 0x42, 0x8a, 0xc9, - 0x13, 0x78, 0xae, 0x67, 0xc8, 0x46, 0xe7, 0xf0, 0x1e, 0x93, 0x57, 0x6d, - 0xd5, 0xf5, 0xd5, 0x05, 0x25, 0xfd, 0xc1, 0x60, 0xa7, 0x78, 0xab, 0xc0, - 0xeb, 0x4b, 0x01, 0xae, 0x1b, 0x19, 0xfb, 0xaf, 0x7f, 0x87, 0x1c, 0xa4, - 0x88, 0xc8, 0xb1, 0xaa, 0xac, 0x02, 0xa6, 0xa6, 0xa5, 0xbb, 0x38, 0x64, - 0x74, 0x0f, 0xff, 0x1b, 0x1b, 0x24, 0xdc, 0x12, 0x07, 0xf5, 0x0c, 0x1d, - 0x61, 0xa0, 0x99, 0x2f, 0x24, 0xee, 0xeb, 0xc7, 0x11, 0x69, 0xd0, 0xb7, - 0xaf, 0x35, 0x3e, 0x67, 0x49, 0xc9, 0x9c, 0x7a, 0xa6, 0xb9, 0x2f, 0x39, - 0xef, 0x13, 0xdc, 0xe9, 0x16, 0x40, 0x12, 0x6e, 0xba, 0xed, 0xdf, 0x2f, - 0x2c, 0xb0, 0xad, 0x45, 0x4a, 0xc0, 0x34, 0x86, 0xb7, 0x5a, 0x5c, 0xf8, - 0xae, 0x33, 0x98, 0x6c, 0x49, 0xc8, 0xcb, 0xf8, 0x1c, 0xb0, 0x8c, 0x65, - 0xcf, 0xf8, 0x54, 0xfd, 0x9c, 0x9a, 0x96, 0x2c, 0x6c, 0xdb, 0x2e, 0x49, - 0x36, 0x33, 0xfb, 0x77, 0x61, 0xc8, 0x54, 0xd3, 0x8c, 0x8c, 0x2d, 0x72, - 0x00, 0xd0, 0x9d, 0xc8, 0x43, 0x2f, 0xbd, 0x72, 0xa3, 0x45, 0xd5, 0x3f, - 0x8a, 0x03, 0xda, 0xe0, 0x14, 0x59, 0xae, 0x25, 0xfd, 0x15, 0xd4, 0x2b, - 0x5e, 0x9f, 0x12, 0x4e, 0x76, 0x98, 0x35, 0xff, 0x12, 0x12, 0x16, 0x54, - 0xf0, 0xc3, 0x17, 0x5f, 0x5a, 0x43, 0x65, 0xdd, 0x34, 0x97, 0xba, 0xd9, - 0xb1, 0xaa, 0xca, 0xd1, 0x99, 0xba, 0x2d, 0x88, 0xa5, 0xeb, 0x9c, 0x48, - 0x75, 0x7d, 0x57, 0x5a, 0x90, 0x76, 0x1d, 0x7c, 0xcc, 0x6a, 0x97, 0xd2, - 0x82, 0x34, 0xcf, 0x88, 0x39, 0x10, 0xba, 0xeb, 0x44, 0xdd, 0x79, 0xe7, - 0x27, 0x04, 0x90, 0x5c, 0x1a, 0x14, 0x6c, 0x7a, 0x69, 0xb0, 0xb9, 0x32, - 0xa2, 0xc6, 0x3c, 0x2a, 0x45, 0x89, 0x56, 0xdd, 0x9e, 0xc4, 0x53, 0xe2, - 0x23, 0xdb, 0xea, 0x2c, 0x79, 0x90, 0x0b, 0xd9, 0x57, 0x53, 0x5c, 0xa5, - 0x8e, 0x9f, 0xad, 0x28, 0x04, 0x1b, 0xf1, 0x41, 0xad, 0x12, 0x05, 0x48, - 0x28, 0xf2, 0xea, 0xae, 0x47, 0x17, 0x3b, 0x3e, 0x86, 0xf2, 0x55, 0x5b, - 0x64, 0x5f, 0xf5, 0xee, 0x6a, 0x12, 0xc5, 0xb8, 0x14, 0xb3, 0x39, 0x8b, - 0x38, 0xcf, 0x04, 0x59, 0xa5, 0xb4, 0xf0, 0x32, 0x72, 0x86, 0x7b, 0x98, - 0x82, 0xff, 0x16, 0x11, 0xd7, 0x11, 0x7e, 0x12, 0x4a, 0x09, 0x79, 0x05, - 0xd5, 0xa0, 0x24, 0x51, 0xdf, 0xe6, 0x04, 0x4f, 0x24, 0xa4, 0x72, 0xda, - 0x62, 0x42, 0xcb, 0xda, 0xa9, 0x4a, 0xf6, 0x38, 0x33, 0x3e, 0xcd, 0x8f, - 0xe8, 0x84, 0x4a, 0x19, 0x82, 0xd4, 0xfc, 0x28, 0x39, 0xd5, 0x74, 0xb2, - 0x57, 0x10, 0x9f, 0x5f, 0x4f, 0x83, 0x4e, 0x1e, 0xf0, 0xf7, 0x2d, 0x5d, - 0xc7, 0xef, 0xa8, 0xc4, 0xbe, 0x75, 0x49, 0x1e, 0xe1, 0x2a, 0x9c, 0xfe, - 0xef, 0xd8, 0x0c, 0x71, 0xbd, 0xad, 0x70, 0xf7, 0xed, 0xa4, 0xd0, 0x53, - 0xb8, 0x30, 0x0b, 0x54, 0x4b, 0xf6, 0x6a, 0x89, 0xbe, 0xfa, 0x9a, 0xb4, - 0x2b, 0xff, 0xcd, 0x09, 0x85, 0xb0, 0xde, 0x42, 0x3d, 0xa2, 0xef, 0xe1, - 0x03, 0x3f, 0xcb, 0xe7, 0x9f, 0x8c, 0xe1, 0x7e, 0x08, 0x36, 0x89, 0x6b, - 0x62, 0x27, 0x1e, 0x2a, 0xfe, 0xa3, 0xdb, 0xfe, 0x35, 0x14, 0x08, 0x8e, - 0x7d, 0x7f, 0x96, 0xcb, 0x22, 0xf0, 0x79, 0x81, 0xa5, 0x5d, 0x83, 0x6e, - 0x63, 0x9c, 0xbb, 0x78, 0xf3, 0xdb, 0xe5, 0x38, 0x8e, 0x04, 0x78, 0xba, - 0xc5, 0xfe, 0x82, 0x93, 0x41, 0x3b, 0x93, 0xcd, 0xc8, 0x94, 0x65, 0x32, - 0x7d, 0x24, 0xfe, 0xbb, 0x10, 0xa7, 0xe9, 0x3d, 0x74, 0x29, 0x9a, 0xab, - 0x5c, 0xe8, 0xd5, 0x0e, 0x5a, 0x37, 0xf9, 0xf6, 0x36, 0x52, 0x7a, 0x95, - 0xc1, 0xd2, 0x2b, 0x2c, 0xaf, 0x8b, 0xe9, 0x01, 0x9d, 0xf9, 0xcb, 0x96, - 0xbd, 0xfa, 0x8d, 0x1e, 0x9f, 0x4c, 0x5b, 0xd1, 0x85, 0xad, 0xb7, 0xc4, - 0xd7, 0x45, 0x0a, 0x12, 0x65, 0x2f, 0x5e, 0xbb, 0x21, 0x78, 0x9c, 0x41, - 0x13, 0x35, 0x27, 0xe9, 0x10, 0x00, 0xb5, 0xa8, 0x0f, 0x26, 0x66, 0xe2, - 0x5b, 0xf0, 0x62, 0x8a, 0x99, 0xff, 0x48, 0xa8, 0xe6, 0xe0, 0x0a, 0x15, - 0xdf, 0x04, 0x71, 0x96, 0xac, 0x3d, 0xd6, 0xf6, 0x77, 0xc7, 0xbb, 0xe7, - 0xb7, 0xeb, 0x39, 0x0a, 0x53, 0xf5, 0x75, 0x4b, 0x3e, 0x83, 0x6e, 0xfb, - 0xe8, 0x61, 0x9a, 0x78, 0x34, 0xa7, 0x92, 0x47, 0x91, 0x16, 0x3f, 0xb1, - 0x0c, 0xcc, 0xbf, 0xb3, 0xa9, 0x92, 0x48, 0xa3, 0x60, 0xa0, 0xbd, 0x0a, - 0x4d, 0x45, 0x3e, 0x14, 0xbf, 0x3a, 0x82, 0x48, 0x1a, 0xa9, 0xee, 0x3c, - 0x93, 0x5a, 0xef, 0xa9, 0xb6, 0x4f, 0x6b, 0xa2, 0xb6, 0x45, 0x9c, 0xcb, - 0x23, 0xf6, 0x33, 0x1c, 0x6c, 0x29, 0xb7, 0x7b, 0x55, 0xe3, 0x09, 0x9e, - 0xd5, 0xe3, 0x87, 0x34, 0x89, 0xd1, 0x79, 0x67, 0xfd, 0xba, 0x01, 0x73, - 0xdb, 0x0e, 0x17, 0xd7, 0x29, 0xcb, 0xe2, 0x5d, 0xc9, 0x9f, 0x16, 0x50, - 0x51, 0x61, 0xac, 0x7f, 0xe6, 0x5e, 0xdf, 0x6e, 0x5a, 0x70, 0x19, 0x80, - 0x15, 0x8b, 0x21, 0xed, 0x55, 0x19, 0xdc, 0x6b, 0xba, 0x53, 0xe4, 0x01, - 0x43, 0x5a, 0xd0, 0x9c, 0x8c, 0x51, 0x80, 0x63, 0x36, 0x77, 0x8f, 0x47, - 0x20, 0x3c, 0xe8, 0xdd, 0x57, 0x99, 0x28, 0x3a, 0xd4, 0x45, 0x84, 0xec, - 0x22, 0xba, 0x9f, 0x22, 0xaf, 0x55, 0x0d, 0x7f, 0xd8, 0x9c, 0x06, 0x65, - 0x86, 0x37, 0xf9, 0xac, 0x44, 0x44, 0x07, 0xf2, 0x31, 0xa2, 0xbf, 0x24, - 0xa4, 0xc5, 0xda, 0xbe, 0x42, 0x95, 0x03, 0x28, 0xbb, 0xf8, 0x9a, 0x4d, - 0x37, 0x79, 0x30, 0x12, 0x02, 0x49, 0xea, 0x02, 0x52, 0x54, 0xd2, 0x7f, - 0x60, 0x85, 0x2e, 0xde, 0xd5, 0x4d, 0xa6, 0x4d, 0x7b, 0x3a, 0xb3, 0x7d, - 0x20, 0xf0, 0x8f, 0x7a, 0x7e, 0xa7, 0xc7, 0xf4, 0x09, 0xf3, 0x3c, 0x34, - 0xbc, 0x26, 0x2b, 0x6f, 0x53, 0x01, 0x5d, 0x35, 0x4b, 0xbe, 0xd3, 0xbc, - 0x39, 0xbb, 0xd1, 0x7f, 0xcd, 0x7e, 0xd5, 0x36, 0x22, 0xc4, 0x7d, 0x56, - 0x66, 0x5b, 0x79, 0x31, 0x21, 0x81, 0x24, 0x60, 0x58, 0x91, 0xda, 0x4f, - 0x03, 0xef, 0x22, 0x3c, 0x8a, 0x98, 0x0c, 0x9d, 0xae, 0x0a, 0x40, 0x26, - 0xc2, 0xb5, 0xef, 0x0d, 0x77, 0xeb, 0x7e, 0x49, 0x39, 0xa2, 0x3c, 0x1c, - 0x11, 0x24, 0x1d, 0xa1, 0x08, 0x1e, 0x52, 0xf2, 0x3f, 0xfe, 0x76, 0x15, - 0x83, 0x07, 0x9d, 0x66, 0xab, 0x49, 0xc9, 0xed, 0x8c, 0xf4, 0x5d, 0x00, - 0x78, 0x63, 0x13, 0xd4, 0x60, 0x5d, 0xd2, 0xad, 0x19, 0x59, 0x5e, 0x4a, - 0xe5, 0x32, 0x02, 0x6d, 0x75, 0xd2, 0x17, 0xb3, 0x08, 0x89, 0x8d, 0x5b, - 0x08, 0xc2, 0x52, 0x8a, 0xa8, 0xad, 0x13, 0xa5, 0x47, 0x48, 0xf1, 0x54, - 0x15, 0x91, 0x15, 0x8d, 0x23, 0x14, 0x1d, 0x31, 0x00, 0x4e, 0xe3, 0x89, - 0x8f, 0x35, 0x6c, 0x6f, 0xbf, 0x59, 0xd9, 0x3e, 0x65, 0x9a, 0xf8, 0xc2, - 0xe8, 0x4b, 0xaf, 0x30, 0x4b, 0x4e, 0x87, 0xe5, 0xc7, 0xc3, 0x30, 0x9d, - 0x4c, 0x17, 0xbd, 0x40, 0x08, 0xb0, 0x31, 0xae, 0x99, 0x99, 0x76, 0x37, - 0xe0, 0xe8, 0x7a, 0xa8, 0x9d, 0xf6, 0x3d, 0x4f, 0x36, 0xe2, 0x86, 0xb8, - 0xdd, 0x82, 0x7b, 0x09, 0x17, 0xf3, 0xcc, 0xc1, 0xad, 0x92, 0xf1, 0x9c, - 0xf8, 0x52, 0x56, 0x64, 0x84, 0x7e, 0xdf, 0x21, 0xcc, 0xe8, 0x32, 0x85, - 0x1d, 0x9b, 0xc3, 0x2f, 0xe5, 0x42, 0xb1, 0x4d, 0x53, 0x7f, 0xc9, 0x04, - 0xf4, 0x08, 0xc3, 0x3c, 0xdc, 0x7c, 0xcd, 0x74, 0xda, 0x79, 0x5c, 0x92, - 0x7d, 0x37, 0xe1, 0xe8, 0x6d, 0x55, 0xcd, 0x91, 0xf6, 0x2b, 0x36, 0xce, - 0x73, 0x97, 0xa5, 0x0d, 0x58, 0x77, 0x0b, 0xc5, 0xb1, 0x0d, 0xe8, 0x88, - 0x75, 0x81, 0xf7, 0xc8, 0x12, 0xe0, 0xbe, 0x5c, 0x2f, 0x6c, 0x89, 0x84, - 0x18, 0xd5, 0xb2, 0xef, 0xcd, 0xc3, 0x9b, 0xa3, 0x7d, 0x2b, 0xbf, 0xc2, - 0xb3, 0x08, 0xa5, 0xf9, 0x95, 0xfc, 0xed, 0xcc, 0x8a, 0x44, 0x6d, 0x97, - 0x1e, 0xce, 0x99, 0x67, 0x5b, 0xfc, 0x06, 0x21, 0x13, 0xf3, 0x47, 0x34, - 0x89, 0x62, 0x4a, 0x8e, 0x1b, 0x6b, 0xf5, 0xdd, 0xc5, 0x8c, 0x0d, 0x8d, - 0xf7, 0x9c, 0x7c, 0x11, 0x8b, 0xfe, 0x08, 0x9c, 0xac, 0xcf, 0x37, 0xe1, - 0xde, 0xa1, 0x2b, 0x65, 0xec, 0xc1, 0x84, 0x61, 0x3b, 0x7c, 0x64, 0xa5, - 0x3e, 0x98, 0xcd, 0xe4, 0x5d, 0x76, 0x1b, 0x36, 0x1c, 0x7c, 0xf3, 0xd9, - 0x2a, 0x56, 0xc7, 0xec, 0x53, 0x9b, 0x67, 0x0c, 0x4b, 0x26, 0xf1, 0xf9, - 0xb2, 0x08, 0x75, 0x0d, 0xf9, 0x4e, 0x02, 0x90, 0x00, 0xe7, 0x3a, 0x41, - 0x90, 0x1d, 0xb8, 0x2d, 0x5c, 0xc9, 0x40, 0x3a, 0xc7, 0x8e, 0xaf, 0x44, - 0x00, 0x7b, 0x74, 0x7c, 0xca, 0x85, 0xaf, 0x06, 0x4e, 0x36, 0xe5, 0x5e, - 0x7d, 0x25, 0x3b, 0xe7, 0x0a, 0x1a, 0xd0, 0x73, 0xfc, 0x4b, 0x99, 0x1a, - 0x0c, 0xed, 0x84, 0x77, 0xd2, 0x5c, 0x78, 0x87, 0xfd, 0x08, 0xd1, 0xd8, - 0x39, 0xd9, 0xb0, 0x57, 0x8c, 0x30, 0xd6, 0x47, 0x76, 0x68, 0xb3, 0x32, - 0x9f, 0x28, 0x36, 0xd9, 0x4c, 0x97, 0x05, 0xa2, 0x03, 0x72, 0x52, 0x69, - 0x6e, 0xc7, 0x79, 0xcc, 0xd1, 0x0a, 0x3f, 0x2d, 0xc4, 0x25, 0xc9, 0xfa, - 0x05, 0xf8, 0x97, 0xda, 0xc9, 0x72, 0x91, 0x8d, 0xd6, 0xaa, 0x79, 0xe8, - 0x41, 0xc1, 0x5a, 0x95, 0x02, 0xfa, 0x17, 0xd2, 0x01, 0x13, 0x78, 0xb7, - 0x29, 0x98, 0x3c, 0x74, 0x59, 0xa1, 0xf7, 0xe3, 0xb3, 0x13, 0x67, 0x80, - 0xdd, 0x66, 0x56, 0xf2, 0x87, 0xce, 0x80, 0x03, 0x7a, 0xd9, 0x1c, 0x91, - 0x27, 0x2d, 0xb5, 0x95, 0x0a, 0x61, 0x6f, 0xf1, 0x6f, 0xb8, 0x08, 0x2e, - 0x6c, 0xd2, 0xd9, 0x24, 0xa2, 0xb4, 0x76, 0x2a, 0xb4, 0x30, 0x99, 0x7c, - 0xd9, 0x99, 0xeb, 0x90, 0x9c, 0xd5, 0x95, 0xe3, 0xbb, 0xdf, 0xe7, 0x35, - 0x0d, 0x65, 0xb1, 0x49, 0x8a, 0xeb, 0x8a, 0xa4, 0xd3, 0xbc, 0x6e, 0x5b, - 0x6c, 0x26, 0xdf, 0xd4, 0x44, 0x52, 0x3b, 0x43, 0xad, 0xbb, 0x4d, 0x58, - 0x09, 0x2e, 0xc4, 0x58, 0x8d, 0xd4, 0xf2, 0x69, 0x8c, 0xa0, 0x71, 0xaa, - 0x60, 0x9f, 0xe8, 0xd4, 0x71, 0x34, 0x1c, 0xc0, 0x14, 0x8d, 0x17, 0x80, - 0xe1, 0xae, 0x0f, 0x43, 0x3c, 0x4a, 0x11, 0xc9, 0x5b, 0x98, 0xa4, 0xb8, - 0xb7, 0x29, 0xa1, 0xa1, 0x89, 0xc1, 0xd8, 0x66, 0x7b, 0x58, 0x75, 0x88, - 0x02, 0xf9, 0x5a, 0x21, 0xc2, 0xca, 0x50, 0x81, 0xe9, 0x1e, 0x2a, 0xf4, - 0x45, 0xd1, 0x6b, 0xd6, 0xbf, 0x4b, 0x7f, 0x37, 0x63, 0xb9, 0xdc, 0x62, - 0x2d, 0x7b, 0xb0, 0x71, 0x67, 0xa9, 0x2b, 0x8a, 0x79, 0x94, 0x0b, 0x46, - 0x35, 0x8a, 0x26, 0xd9, 0xae, 0x2d, 0xd7, 0xf8, 0x95, 0x4b, 0x7d, 0xf8, - 0x33, 0xbc, 0xba, 0xd1, 0xb8, 0xe3, 0xcd, 0xef, 0x5b, 0xc1, 0x50, 0xb9, - 0x81, 0x9b, 0x73, 0xa1, 0x5d, 0x56, 0x0e, 0xd0, 0xba, 0xe9, 0xf2, 0x6b, - 0x30, 0xdf, 0x50, 0x40, 0x2a, 0x6f, 0x0d, 0x6e, 0xec, 0xab, 0xa9, 0x30, - 0xc5, 0xc0, 0xd0, 0xbe, 0x00, 0xcb, 0x6a, 0x70, 0x84, 0x20, 0x1d, 0x76, - 0x91, 0x46, 0x8d, 0x45, 0xfe, 0xa7, 0x26, 0x9a, 0xca, 0x24, 0x84, 0x05, - 0x46, 0x41, 0xb1, 0x93, 0x83, 0x15, 0xa2, 0x25, 0xad, 0x2b, 0xea, 0x2a, - 0xb1, 0x0f, 0xc7, 0x61, 0x9d, 0x7a, 0xa3, 0xd9, 0xe8, 0x28, 0x4a, 0xc7, - 0x86, 0x6b, 0x9a, 0xf0, 0x11, 0x1a, 0x8c, 0xf6, 0x6b, 0xcc, 0x05, 0xbc, - 0x68, 0xf0, 0xeb, 0x8b, 0xd9, 0x89, 0x45, 0xc5, 0x9b, 0x1c, 0xac, 0x78, - 0xfd, 0xe1, 0x0a, 0xc7, 0x6b, 0xf5, 0xf2, 0x33, 0x8a, 0x44, 0x59, 0x45, - 0x87, 0x4f, 0x46, 0xd8, 0x0b, 0x16, 0x8f, 0x35, 0xea, 0xee, 0x49, 0x8b, - 0x69, 0x0b, 0x03, 0x52, 0xca, 0x82, 0x66, 0x25, 0x49, 0xea, 0xe5, 0x8b, - 0xc6, 0xf8, 0xf0, 0x85, 0x4e, 0x0b, 0x4c, 0x71, 0xde, 0x20, 0xab, 0xd8, - 0xa7, 0x23, 0x50, 0x19, 0x12, 0x66, 0x4b, 0xed, 0x55, 0x9a, 0xd7, 0xb7, - 0x71, 0x4e, 0xf1, 0xe8, 0x4c, 0x67, 0xd4, 0x58, 0xc3, 0x87, 0xc9, 0x63, - 0x18, 0xb0, 0x60, 0x34, 0xf4, 0x29, 0x57, 0xe0, 0xcb, 0xfc, 0xff, 0x89, - 0xe1, 0x1b, 0x67, 0x5a, 0x1a, 0x3d, 0x23, 0x33, 0xde, 0x48, 0x17, 0xe1, - 0xaf, 0xee, 0xc6, 0x34, 0x58, 0x27, 0xf4, 0xba, 0xfc, 0xdf, 0x0e, 0x92, - 0xe1, 0x9f, 0x99, 0x56, 0xaf, 0x24, 0x9a, 0x5e, 0x2c, 0x78, 0xd1, 0xed, - 0x05, 0x28, 0xfa, 0x08, 0x59, 0x0e, 0x89, 0x8b, 0x12, 0xac, 0x66, 0x38, - 0x38, 0x89, 0x80, 0x2f, 0x80, 0x13, 0x59, 0xc4, 0x89, 0x49, 0x3f, 0xd8, - 0xa2, 0x44, 0x7b, 0x5c, 0xd9, 0xf1, 0x12, 0x12, 0xd1, 0x2b, 0x1f, 0x0a, - 0x89, 0xea, 0x48, 0x99, 0x80, 0x2e, 0xc9, 0xe1, 0x63, 0xfa, 0xdc, 0xbc, - 0x16, 0x39, 0xbf, 0x62, 0xac, 0xa2, 0xbe, 0x9f, 0xb4, 0x20, 0x1d, 0xfe, - 0x6e, 0x9b, 0x4f, 0x12, 0x93, 0xb4, 0x8a, 0xd8, 0x8c, 0xa7, 0xdf, 0x0d, - 0xcd, 0x54, 0x64, 0x75, 0xea, 0xd7, 0xa2, 0x71, 0xe1, 0x4f, 0x21, 0x1d, - 0xf8, 0xcc, 0x07, 0x10, 0xc0, 0xb5, 0x95, 0x41, 0xd0, 0xa0, 0x61, 0x49, - 0xf6, 0xa7, 0xcf, 0x08, 0xf2, 0x5e, 0x0d, 0x2e, 0x9f, 0xd8, 0xef, 0xb5, - 0x7b, 0xeb, 0xd9, 0x3c, 0xad, 0xab, 0x77, 0x18, 0x48, 0x72, 0x51, 0x1f, - 0x54, 0x27, 0x31, 0x1f, 0xc3, 0xea, 0x0e, 0x56, 0x6b, 0xeb, 0x6a, 0xbb, - 0x70, 0xdb, 0x1e, 0x36, 0x51, 0x61, 0x69, 0xce, 0x06, 0xfc, 0x7b, 0x2a, - 0xfa, 0x22, 0x90, 0x50, 0xeb, 0xfa, 0x57, 0xa8, 0x87, 0xb6, 0x89, 0x34, - 0xb6, 0x58, 0x98, 0x0c, 0x83, 0x42, 0x89, 0x7a, 0xfd, 0x34, 0x16, 0xc7, - 0xe6, 0xe0, 0x34, 0xfb, 0x66, 0xa1, 0x1d, 0x03, 0xc2, 0x7b, 0x80, 0x92, - 0x4c, 0x79, 0x81, 0x68, 0x5c, 0x98, 0x49, 0xdc, 0x91, 0xe2, 0x50, 0x79, - 0x89, 0xb3, 0x94, 0xe5, 0x1c, 0xd9, 0x03, 0x8c, 0xe8, 0x7b, 0x05, 0xf0, - 0xd3, 0x43, 0xb3, 0xb0, 0xea, 0xe1, 0x66, 0x93, 0x6d, 0x92, 0x64, 0x06, - 0x30, 0xe5, 0x41, 0x0e, 0x1c, 0x1d, 0xc7, 0x2f, 0x41, 0x42, 0x42, 0x0e, - 0x83, 0x45, 0x73, 0xc5, 0x84, 0x88, 0xef, 0x1f, 0x16, 0xc1, 0x04, 0xa3, - 0xbb, 0xb9, 0x10, 0x2f, 0x57, 0x94, 0xb3, 0x96, 0x70, 0xa6, 0xc5, 0x21, - 0x8a, 0x94, 0x2f, 0xc3, 0xd8, 0xd0, 0xae, 0x2d, 0xa7, 0x0f, 0x56, 0x18, - 0x4d, 0x79, 0xfa, 0x7c, 0xbe, 0x3c, 0x38, 0x51, 0x77, 0x76, 0x11, 0xe3, - 0xf8, 0x38, 0x91, 0xad, 0xe0, 0xf3, 0x3e, 0xe0, 0x3b, 0x96, 0x52, 0x58, - 0x88, 0xc2, 0xad, 0xa1, 0x5b, 0x06, 0xc3, 0x67, 0xd7, 0x62, 0xe3, 0x27, - 0x98, 0x50, 0xb0, 0x87, 0x2a, 0x4e, 0xf0, 0x90, 0x78, 0x4b, 0x86, 0x78, - 0xe1, 0xba, 0xf9, 0x24, 0x8a, 0xab, 0x17, 0x1f, 0x2c, 0x9e, 0x0e, 0xe5, - 0xfb, 0xaf, 0x29, 0x8a, 0xe9, 0xf9, 0xc5, 0x38, 0x37, 0x7f, 0xfa, 0x46, - 0xfb, 0xa0, 0xc9, 0x29, 0xde, 0xbf, 0x34, 0x2b, 0xf0, 0x57, 0x32, 0xb1, - 0x41, 0xdd, 0x23, 0x43, 0x43, 0x62, 0x08, 0x33, 0x57, 0x32, 0x43, 0x33, - 0x1a, 0x36, 0x70, 0x79, 0xaf, 0xf8, 0xc0, 0x88, 0x1d, 0xfb, 0xff, 0xf5, - 0x08, 0xb1, 0x6a, 0xe2, 0x0c, 0x66, 0x7b, 0xb6, 0x98, 0x97, 0x5d, 0x3b, - 0x33, 0xd0, 0xc5, 0x40, 0xde, 0xc0, 0x7d, 0x32, 0x76, 0x27, 0x90, 0x9c, - 0x3d, 0xd6, 0x47, 0x7e, 0x98, 0x84, 0x1b, 0xec, 0x76, 0x1f, 0x27, 0x1a, - 0x9a, 0x9e, 0x5e, 0x4a, 0x94, 0xf7, 0x69, 0xdd, 0x9b, 0xd5, 0xf2, 0x15, - 0xdf, 0x93, 0x08, 0xd4, 0x5e, 0xfe, 0xcc, 0x61, 0x33, 0x64, 0xdf, 0xed, - 0xd7, 0x54, 0x6b, 0xfb, 0x6d, 0xad, 0x76, 0x87, 0xd4, 0xcd, 0x2c, 0x14, - 0xac, 0x00, 0xad, 0x6a, 0x70, 0x53, 0xfb, 0x94, 0x09, 0x97, 0xf6, 0xfe, - 0xd9, 0xb3, 0x1d, 0x28, 0x0b, 0xe4, 0x4d, 0xba, 0xdb, 0x87, 0x89, 0xb1, - 0x99, 0x2b, 0x07, 0xf5, 0x78, 0xdb, 0x66, 0x80, 0x67, 0x35, 0x65, 0xec, - 0x17, 0xbe, 0xbb, 0x04, 0x21, 0x2b, 0x2a, 0x8c, 0x36, 0xf1, 0x77, 0x3c, - 0xfe, 0x20, 0x57, 0xcb, 0x05, 0x52, 0xc3, 0x08, 0x05, 0xe0, 0x06, 0x9b, - 0x43, 0x50, 0xf3, 0x17, 0x2d, 0xdd, 0x0e, 0x22, 0x4a, 0xed, 0xc4, 0xc9, - 0x11, 0x23, 0x88, 0xd6, 0xfb, 0x2e, 0x66, 0xec, 0xa4, 0xeb, 0x73, 0x56, - 0xb4, 0x08, 0xb5, 0xf9, 0x94, 0x17, 0x8e, 0x59, 0xe0, 0xa7, 0x75, 0xd2, - 0xd5, 0x03, 0xa0, 0xfb, 0x62, 0x71, 0x4a, 0x17, 0x0d, 0x71, 0x78, 0xcb, - 0x94, 0x85, 0xae, 0x04, 0x4f, 0x26, 0xd3, 0xe1, 0x00, 0xc6, 0xd7, 0x86, - 0x30, 0x74, 0xdf, 0x27, 0x8b, 0x0c, 0x12, 0x4a, 0x64, 0x79, 0x69, 0xd6, - 0x11, 0x8d, 0xa2, 0x02, 0xb5, 0x4d, 0x47, 0x09, 0x7a, 0x6a, 0x15, 0x93, - 0x50, 0x07, 0x5b, 0x79, 0x72, 0x07, 0x77, 0xe0, 0x6a, 0xc1, 0x21, 0x21, - 0xb0, 0xea, 0x0b, 0x47, 0xa0, 0xe6, 0x8b, 0x6b, 0x41, 0x82, 0xd6, 0x71, - 0x2b, 0x08, 0x04, 0x40, 0x3e, 0x21, 0x3e, 0xb7, 0xb1, 0xe5, 0xef, 0xad, - 0x84, 0x65, 0x60, 0xf5, 0xb5, 0x95, 0xe9, 0x41, 0x8a, 0x43, 0x48, 0xc2, - 0x3d, 0x6b, 0xed, 0x2d, 0xb9, 0x70, 0x28, 0xc5, 0xb8, 0x47, 0xde, 0xf0, - 0xd2, 0xc7, 0x42, 0xb4, 0xe5, 0xeb, 0x27, 0xbf, 0xb2, 0x03, 0x97, 0xef, - 0x93, 0x0d, 0x94, 0x40, 0x0f, 0xbf, 0x1c, 0x4b, 0x2d, 0x82, 0x9b, 0x8b, - 0x65, 0x8d, 0xf4, 0x4a, 0xbf, 0xa4, 0x86, 0x00, 0x1b, 0x0a, 0xce, 0x1d, - 0x7f, 0x5f, 0x67, 0x50, 0xcd, 0x75, 0x06, 0x62, 0x99, 0x75, 0x5b, 0x80, - 0x95, 0xa4, 0xa7, 0x38, 0x07, 0x6b, 0x83, 0x08, 0x7b, 0xb6, 0x81, 0xb7, - 0x32, 0x6c, 0xa3, 0xf6, 0xab, 0x4b, 0xa7, 0x49, 0x95, 0xbb, 0x7a, 0x3f, - 0xd5, 0xbe, 0xc4, 0x01, 0xda, 0xcf, 0x01, 0x16, 0xa2, 0xf1, 0xc1, 0x10, - 0x28, 0x6e, 0x72, 0x64, 0x7c, 0x31, 0xf0, 0x6f, 0x7b, 0x50, 0x0f, 0x69, - 0x9c, 0x3a, 0x9c, 0xa7, 0x3b, 0x7c, 0x18, 0x1f, 0x63, 0x9d, 0x46, 0x34, - 0x06, 0x91, 0x81, 0x74, 0x1a, 0x6b, 0x37, 0x8b, 0xfb, 0xdc, 0x9d, 0xeb, - 0x64, 0xd7, 0xc6, 0x6d, 0x0b, 0x10, 0x1f, 0x9d, 0xbd, 0xee, 0xbb, 0x5c, - 0x7c, 0xc8, 0x6e, 0x45, 0x0c, 0x9e, 0x65, 0x74, 0xb1, 0xfe, 0x4a, 0x69, - 0x5f, 0x47, 0x72, 0xb5, 0x81, 0xee, 0x04, 0x79, 0x36, 0x95, 0xf1, 0x7f, - 0x44, 0x0f, 0x30, 0x07, 0xfc, 0x2e, 0xec, 0x22, 0xe8, 0xf6, 0x38, 0x46, - 0x59, 0xc1, 0x10, 0xc7, 0x32, 0xe8, 0xaf, 0xec, 0x37, 0x58, 0x9f, 0x9e, - 0x7c, 0x92, 0x3d, 0xb8, 0xbd, 0x0d, 0x00, 0xba, 0xfc, 0x33, 0x6e, 0xfc, - 0xb1, 0x50, 0x8c, 0xa1, 0x95, 0xfa, 0x3f, 0x5d, 0xc8, 0x93, 0x0f, 0xee, - 0x40, 0xf6, 0x9d, 0xbc, 0xf6, 0xd1, 0x13, 0x9e, 0xe4, 0x10, 0x5c, 0x15, - 0xdc, 0x98, 0x60, 0xc7, 0xc8, 0xd2, 0xba, 0xad, 0x96, 0x2c, 0x24, 0xfd, - 0x92, 0x32, 0x4b, 0xfe, 0x37, 0x50, 0x25, 0x81, 0x6d, 0xb9, 0x6a, 0xf8, - 0xed, 0x49, 0x40, 0x2a, 0x95, 0xfd, 0xed, 0x6b, 0xe2, 0xa9, 0xd2, 0xbf, - 0x72, 0x98, 0xc0, 0x57, 0x75, 0x7f, 0xdd, 0x20, 0x66, 0x31, 0xd2, 0xc3, - 0x06, 0x13, 0xb4, 0xf0, 0x07, 0xf6, 0x80, 0x84, 0xb4, 0x96, 0x38, 0x4a, - 0x12, 0x1b, 0x27, 0x1e, 0x0d, 0x20, 0x9d, 0x21, 0x62, 0x8a, 0xac, 0x9b, - 0x97, 0x20, 0xdf, 0x09, 0xd4, 0x07, 0xf8, 0xc7, 0x1e, 0xd6, 0x1c, 0x3f, - 0x7e, 0xff, 0xc9, 0x86, 0x19, 0xa3, 0x49, 0x60, 0x95, 0xb5, 0x59, 0xf3, - 0x19, 0x6b, 0xab, 0xff, 0x99, 0xe7, 0x8b, 0xe8, 0xc9, 0x78, 0xac, 0x78, - 0x47, 0xcc, 0x20, 0xb1, 0x7f, 0xdb, 0x6e, 0x26, 0x09, 0xe3, 0xe1, 0x2a, - 0x75, 0xd6, 0x05, 0x24, 0x7f, 0x4e, 0x4b, 0x07, 0x68, 0x73, 0xa9, 0x3a, - 0x63, 0x7d, 0x7d, 0x9f, 0xd9, 0xd4, 0x53, 0x2e, 0x8f, 0xbb, 0xc2, 0x46, - 0x83, 0x95, 0x39, 0x3b, 0xed, 0x4a, 0xef, 0x78, 0x38, 0xd3, 0xf0, 0xa6, - 0x97, 0x2b, 0xd5, 0xe5, 0xf8, 0xcb, 0x9e, 0x10, 0x26, 0xcd, 0xe4, 0x0c, - 0x99, 0x4c, 0xda, 0x15, 0xa7, 0x57, 0xa8, 0x59, 0xfd, 0xe7, 0xda, 0x20, - 0x70, 0xa4, 0x0b, 0xd8, 0xeb, 0xbb, 0x5c, 0xa2, 0x7d, 0x2a, 0x56, 0x8e, - 0xc0, 0x23, 0x59, 0x09, 0x4b, 0x37, 0x7e, 0xf9, 0x1b, 0x94, 0x5e, 0xdb, - 0x82, 0x05, 0x4b, 0xec, 0xe3, 0x64, 0x6d, 0x67, 0xbb, 0x42, 0x18, 0x44, - 0x3e, 0xd7, 0x71, 0xf8, 0x80, 0x54, 0x64, 0x95, 0x38, 0xc9, 0x94, 0x59, - 0x38, 0x3e, 0x02, 0xea, 0x1f, 0x6a, 0x83, 0x84, 0x83, 0x57, 0x28, 0x29, - 0xaf, 0x7d, 0xde, 0x05, 0xab, 0x79, 0xfd, 0xfa, 0x1c, 0x6c, 0x5c, 0xb0, - 0xc4, 0xa3, 0x01, 0x29, 0x7e, 0xa0, 0x4f, 0x8f, 0x51, 0x33, 0x07, 0xda, - 0xf8, 0x15, 0xa9, 0x8c, 0x6a, 0x94, 0x29, 0x01, 0x71, 0x17, 0x2d, 0x4a, - 0xaa, 0xd4, 0x5b, 0xaf, 0x30, 0x15, 0x53, 0xd6, 0x9a, 0xdf, 0xe7, 0x61, - 0x1b, 0x41, 0xa0, 0xf5, 0x25, 0xa7, 0x1c, 0xc0, 0xac, 0xf6, 0x84, 0x4d, - 0x40, 0x1c, 0x0b, 0x11, 0x92, 0xe8, 0xd6, 0xfe, 0x48, 0x87, 0x1e, 0x2f, - 0xcb, 0x80, 0x26, 0xe2, 0x1c, 0xc4, 0x7d, 0x8c, 0xe6, 0x74, 0x0f, 0x38, - 0x93, 0xa4, 0x14, 0xda, 0xc6, 0x0f, 0xeb, 0xce, 0x98, 0x4e, 0xcb, 0x77, - 0x92, 0xdc, 0x66, 0x88, 0xd5, 0x41, 0x62, 0x81, 0x26, 0x08, 0x40, 0x51, - 0xbb, 0x45, 0x75, 0x46, 0x5b, 0xba, 0x9d, 0xf0, 0x56, 0x7c, 0x47, 0xf6, - 0xb8, 0xdd, 0xf9, 0x6a, 0x14, 0x74, 0x3c, 0xb0, 0x4b, 0xa0, 0xb8, 0xce, - 0x43, 0xb2, 0xe8, 0x2c, 0x10, 0x84, 0x3c, 0xc4, 0x55, 0xa4, 0x6a, 0x2e, - 0xfb, 0x37, 0x8d, 0xf5, 0x14, 0x8d, 0x10, 0xe9, 0xc7, 0x72, 0xa2, 0xaf, - 0x45, 0xb4, 0x00, 0x0e, 0xe3, 0xec, 0x2c, 0x87, 0x51, 0x48, 0xa5, 0x16, - 0x35, 0xf7, 0xed, 0x3e, 0x1e, 0xeb, 0xc7, 0x27, 0x3e, 0x18, 0x93, 0x5c, - 0x80, 0x02, 0x0c, 0xd5, 0x6c, 0xe4, 0x56, 0x03, 0x1f, 0xbd, 0x9c, 0x7b, - 0xf2, 0xd0, 0xde, 0xde, 0xbc, 0x99, 0xf0, 0x1f, 0xa2, 0x44, 0x04, 0x77, - 0xc4, 0x56, 0xab, 0x01, 0xdd, 0x74, 0x38, 0xa6, 0xc5, 0xa6, 0x3f, 0x9a, - 0x74, 0x46, 0xfc, 0x23, 0x31, 0x62, 0xce, 0x8f, 0xb4, 0x72, 0x9d, 0x93, - 0x2b, 0x68, 0x1b, 0x46, 0x19, 0xf7, 0xcd, 0x32, 0xb4, 0x4a, 0x17, 0x41, - 0x55, 0x35, 0x12, 0x8a, 0x1c, 0x36, 0x8a, 0xd4, 0x5c, 0x37, 0xf1, 0x72, - 0x3d, 0x6a, 0x95, 0x5c, 0x42, 0x6c, 0x73, 0x99, 0x68, 0xe3, 0xb8, 0x97, - 0x23, 0xe2, 0x40, 0x51, 0x7c, 0x29, 0x33, 0x24, 0x87, 0x5d, 0x8d, 0xb6, - 0x6a, 0xc7, 0x06, 0x70, 0x9d, 0xe7, 0xc7, 0x44, 0xb3, 0x32, 0x1d, 0xaf, - 0x65, 0x0a, 0xe7, 0xb8, 0x4c, 0xd7, 0xe8, 0x2c, 0xd8, 0x8e, 0xb9, 0x00, - 0x96, 0xe6, 0x37, 0x86, 0x16, 0x5a, 0xd5, 0xf0, 0x17, 0x68, 0x60, 0x06, - 0x11, 0xc9, 0x1c, 0x29, 0xd6, 0x7e, 0x7f, 0x4d, 0xad, 0x60, 0x52, 0x3e, - 0x55, 0xbd, 0xa6, 0xfd, 0xea, 0x6f, 0x3a, 0x6c, 0xfb, 0x68, 0x18, 0xa6, - 0x20, 0xb4, 0x5b, 0x2b, 0x19, 0x41, 0x6c, 0x65, 0xeb, 0x8b, 0x08, 0xa1, - 0xb4, 0xb1, 0x6f, 0x24, 0x72, 0x12, 0xbb, 0x77, 0xf0, 0xac, 0xa6, 0xd1, - 0xdb, 0xb8, 0x47, 0x44, 0x2f, 0x47, 0x46, 0x9b, 0x90, 0x8b, 0x85, 0xa6, - 0x80, 0x7c, 0xb9, 0x14, 0xf0, 0x12, 0x08, 0x94, 0xaf, 0xf1, 0x56, 0x38, - 0x3f, 0x79, 0x20, 0xaf, 0xb5, 0xc8, 0xa2, 0xb5, 0x70, 0x76, 0x83, 0x55, - 0x4b, 0xa8, 0x03, 0x36, 0xb1, 0x12, 0x71, 0xe4, 0xf4, 0xa3, 0x3e, 0x54, - 0x30, 0xfe, 0x15, 0x2c, 0x4e, 0xa8, 0x6d, 0x59, 0xfa, 0x99, 0xec, 0x7e, - 0x08, 0xe8, 0x09, 0x7f, 0x48, 0x3c, 0x8b, 0xd2, 0x7b, 0x75, 0xdd, 0x0d, - 0xea, 0xe1, 0x66, 0x93, 0x6d, 0x92, 0x64, 0x06, 0x62, 0xbf, 0xc6, 0x7a, - 0xc7, 0x5f, 0xcd, 0x18, 0xb1, 0x35, 0x9d, 0x25, 0xe5, 0x88, 0xd5, 0x90, - 0x65, 0x7d, 0xb9, 0xef, 0x44, 0x28, 0x47, 0x08, 0xaa, 0xad, 0x26, 0x22, - 0x9f, 0xe5, 0xb6, 0x00, 0xea, 0x4a, 0x14, 0xf3, 0x4b, 0x6f, 0x1e, 0x85, - 0xfb, 0xd4, 0xd2, 0xfe, 0xa1, 0x19, 0x0f, 0xc4, 0xbc, 0x16, 0xa6, 0x5a, - 0x43, 0xdd, 0xc5, 0xf3, 0xd1, 0x16, 0x81, 0x0f, 0x2d, 0x56, 0xae, 0x70, - 0x3a, 0x96, 0xde, 0xa5, 0x94, 0x44, 0x10, 0x37, 0xef, 0xa1, 0xae, 0xa3, - 0xd5, 0x3d, 0xc5, 0xca, 0x45, 0x2e, 0x58, 0x84, 0x46, 0x60, 0x80, 0x65, - 0x90, 0x89, 0xa0, 0x7b, 0x19, 0xbe, 0xd9, 0x46, 0xc5, 0x0c, 0xfe, 0x90, - 0x87, 0x0f, 0x97, 0xe7, 0x81, 0x7a, 0xe8, 0x3c, 0x8b, 0x9a, 0x44, 0xc5, - 0xce, 0x63, 0x6c, 0x91, 0x11, 0xf7, 0xa9, 0x3c, 0x42, 0x1d, 0xbc, 0xa7, - 0xad, 0x82, 0xcb, 0xe9, 0xed, 0x05, 0xa3, 0x75, 0x7f, 0xf1, 0xf7, 0x6c, - 0x95, 0x4d, 0x4d, 0x00, 0xc6, 0x4b, 0x7e, 0x4a, 0xa3, 0x07, 0xa8, 0xe1, - 0x52, 0xab, 0x07, 0x5e, 0x40, 0x55, 0x17, 0xbe, 0x77, 0x08, 0xf4, 0x26, - 0xc9, 0x9e, 0x48, 0xea, 0x9b, 0xff, 0x70, 0xb6, 0x16, 0x16, 0x6e, 0x22, - 0x6f, 0x2b, 0xe2, 0xa1, 0xae, 0x9e, 0xa9, 0x60, 0x22, 0x1d, 0x68, 0x2d, - 0xc4, 0xba, 0xb3, 0xb4, 0xa8, 0x2b, 0x97, 0x2c, 0xbd, 0x7b, 0x18, 0xa4, - 0x36, 0xe6, 0x5c, 0x2e, 0xf9, 0x21, 0x38, 0x0e, 0x59, 0x79, 0xdf, 0x2b, - 0x3b, 0x0e, 0x6c, 0x47, 0x9c, 0x47, 0x3f, 0xd1, 0xcf, 0xe4, 0x50, 0x81, - 0x8c, 0x5f, 0x09, 0xc0, 0x3b, 0x0b, 0xb3, 0xe2, 0x66, 0x7c, 0x14, 0x1d, - 0xaa, 0xde, 0x01, 0x11, 0x57, 0xca, 0xec, 0x48, 0x6e, 0x3d, 0x81, 0xe0, - 0x39, 0xb5, 0xd9, 0xfe, 0x65, 0xe6, 0x4d, 0xe8, 0x43, 0xe0, 0x19, 0xfe, - 0x15, 0x45, 0x38, 0xb8, 0x3b, 0x74, 0x66, 0x6e, 0x7b, 0xec, 0x8f, 0x6b, - 0xfe, 0x65, 0xfe, 0xbf, 0xeb, 0xad, 0x85, 0xf5, 0x07, 0x03, 0xf0, 0xb9, - 0x9f, 0x15, 0x71, 0xa8, 0x22, 0x4e, 0xd1, 0xfd, 0x6a, 0x03, 0x32, 0x7b, - 0x69, 0xab, 0xb4, 0x25, 0x8f, 0x73, 0xe8, 0x26, 0xaf, 0xdf, 0x6e, 0x56, - 0xdf, 0xc3, 0x77, 0x60, 0x57, 0xe4, 0xa8, 0xc5, 0x44, 0xea, 0x49, 0xf8, - 0x9b, 0xe2, 0x3d, 0xf2, 0xb3, 0x64, 0x11, 0xdc, 0x4a, 0x6d, 0xfb, 0xc4, - 0xf7, 0xbd, 0xff, 0x5f, 0xad, 0x01, 0x8e, 0xba, 0x74, 0xac, 0x20, 0x95, - 0xbb, 0xbe, 0xe4, 0xb4, 0xcf, 0xf5, 0x63, 0xe8, 0x6e, 0xc2, 0x00, 0xeb, - 0x80, 0x33, 0x37, 0x38, 0x41, 0xe7, 0xb3, 0x31, 0xde, 0x3e, 0x59, 0xe1, - 0x0c, 0xad, 0x9b, 0xb8, 0xf6, 0xda, 0x93, 0x3f, 0xa6, 0x94, 0xcd, 0xca, - 0xf6, 0x81, 0xff, 0xa7, 0x86, 0xc4, 0x5e, 0x8a, 0xcc, 0xde, 0x68, 0xeb, - 0xcd, 0x25, 0x34, 0x5b, 0x83, 0xb5, 0x07, 0x67, 0x25, 0x73, 0x5f, 0x60, - 0xb1, 0x1c, 0x8c, 0x5a, 0xfb, 0x86, 0xd1, 0x3e, 0x54, 0x44, 0xe6, 0x31, - 0x32, 0xf2, 0x45, 0x20, 0x12, 0x03, 0xd6, 0x89, 0x0f, 0x39, 0x62, 0x17, - 0x52, 0xe0, 0xe2, 0xab, 0x0d, 0xf2, 0x2c, 0x7d, 0xd7, 0x3d, 0x33, 0x25, - 0xdf, 0x96, 0xbf, 0xcd, 0xe4, 0x1b, 0x49, 0x73, 0x31, 0xaf, 0x67, 0xbb, - 0x69, 0xe2, 0x62, 0x37, 0xf2, 0xb3, 0xdc, 0x14, 0x97, 0x77, 0xfa, 0x13, - 0x9e, 0x2b, 0xfa, 0xcf, 0x8e, 0xba, 0xc6, 0xd1, 0xc1, 0xb6, 0x46, 0xe0, - 0x52, 0x45, 0xe8, 0x77, 0x89, 0x84, 0x6a, 0x1e, 0x06, 0x49, 0x8f, 0x2a, - 0x0f, 0x98, 0xf5, 0xee, 0xec, 0x11, 0xe1, 0xc4, 0x88, 0x1d, 0x31, 0x2e, - 0xd3, 0x4e, 0x08, 0x29, 0x14, 0xa8, 0x14, 0x60, 0xff, 0x05, 0x4e, 0xb1, - 0x80, 0xfc, 0xa6, 0x15, 0x4d, 0x1d, 0x6f, 0x41, 0xbc, 0x6c, 0x21, 0xc1, - 0x0b, 0x22, 0xe4, 0xf7, 0xf8, 0x1b, 0xa9, 0x02, 0x45, 0x3c, 0x3e, 0x5b, - 0xc2, 0xef, 0xbb, 0xde, 0x16, 0xbf, 0x6b, 0x83, 0x69, 0x3f, 0xa3, 0xa4, - 0xfe, 0x83, 0x2e, 0xab, 0x55, 0x12, 0xfd, 0x02, 0xfd, 0x74, 0x26, 0xee, - 0x57, 0xad, 0x25, 0xd8, 0x3c, 0xbe, 0x5d, 0x68, 0x56, 0xb6, 0x9f, 0xd7, - 0xbd, 0xca, 0x0d, 0xf8, 0x93, 0x0c, 0x28, 0x3b, 0x33, 0x19, 0xa4, 0x46, - 0x34, 0x70, 0xce, 0x88, 0x75, 0xdf, 0xe4, 0x71, 0xa4, 0x52, 0xb5, 0x25, - 0x83, 0xde, 0x21, 0xc0, 0xfa, 0x4a, 0x6c, 0x1d, 0x88, 0xcc, 0x8b, 0x32, - 0xe5, 0xca, 0x2a, 0x80, 0xa7, 0x6d, 0xae, 0x1f, 0xf1, 0x63, 0x79, 0x0e, - 0x57, 0x89, 0xba, 0x3f, 0x58, 0x85, 0xaa, 0xcc, 0xc3, 0x30, 0x13, 0x8a, - 0x42, 0x2a, 0x49, 0x11, 0x78, 0xa8, 0xc9, 0x28, 0x4c, 0xa3, 0x7b, 0x1f, - 0x96, 0x89, 0x70, 0x26, 0xeb, 0xf2, 0xbd, 0x43, 0x58, 0xe9, 0x67, 0x33, - 0x9c, 0x28, 0x82, 0xa6, 0xf9, 0xe1, 0xa9, 0x04, 0xdc, 0x9f, 0x7e, 0xf3, - 0xbe, 0xe2, 0xcf, 0x8a, 0x29, 0xeb, 0x36, 0x3a, 0xbb, 0xeb, 0x8b, 0xd6, - 0x93, 0x12, 0x5f, 0x8f, 0xfc, 0x23, 0xba, 0xbe, 0xc1, 0x44, 0xc9, 0x6c, - 0x86, 0x7a, 0x42, 0xac, 0x7d, 0x64, 0x1e, 0x74, 0xb0, 0x91, 0x58, 0x3c, - 0xa3, 0x72, 0x05, 0x92, 0x56, 0x85, 0x28, 0xb5, 0xaf, 0xc3, 0xe2, 0x8d, - 0x3c, 0x28, 0x2b, 0xb7, 0xc0, 0xb9, 0x24, 0xec, 0xc6, 0xe7, 0x3c, 0x24, - 0x43, 0x95, 0x23, 0x99, 0x67, 0xff, 0x1f, 0x33, 0xcd, 0xfe, 0xd7, 0x8c, - 0x3c, 0x91, 0xf2, 0xfe, 0x77, 0x1f, 0xd9, 0x5b, 0x99, 0x15, 0x2c, 0x37, - 0xfd, 0x83, 0xcb, 0xe5, 0x18, 0x3b, 0x56, 0x69, 0x93, 0x7f, 0x23, 0x29, - 0xa2, 0x64, 0xbe, 0x7b, 0x2f, 0xc6, 0x66, 0x49, 0x4d, 0x55, 0x4d, 0xb9, - 0x30, 0xae, 0x84, 0xa0, 0xec, 0x3f, 0xa2, 0x27, 0xae, 0xb3, 0xd8, 0x4f, - 0xf4, 0x27, 0x0e, 0x64, 0xeb, 0xce, 0x4e, 0xdb, 0xec, 0xc5, 0xb7, 0x94, - 0x85, 0x43, 0x41, 0x01, 0x38, 0x04, 0x05, 0x82, 0x65, 0x08, 0x80, 0xad, - 0x7b, 0x62, 0xd4, 0x5f, 0x11, 0x38, 0xc0, 0x86, 0xca, 0x30, 0x04, 0x80, - 0x8e, 0xd0, 0x97, 0x3c, 0x3a, 0x3a, 0x21, 0x41, 0x26, 0x64, 0x8e, 0x1e, - 0x87, 0xfa, 0x2b, 0x76, 0xd5, 0xe3, 0x11, 0x87, 0x88, 0x81, 0x98, 0xdc, - 0x3d, 0x38, 0x6c, 0x84, 0xdd, 0xb5, 0xe5, 0x37, 0xe1, 0xbd, 0x26, 0xff, - 0xd2, 0xaa, 0x61, 0xa9, 0x02, 0x48, 0x70, 0x43, 0x75, 0x32, 0xd6, 0x68, - 0x36, 0x7c, 0x06, 0x9c, 0x3c, 0x7e, 0xa2, 0x5a, 0x83, 0x54, 0x4d, 0xdb, - 0x11, 0x87, 0xa2, 0x9a, 0x1f, 0x0a, 0x67, 0x1e, 0x60, 0xfd, 0x66, 0x44, - 0xf5, 0xed, 0x7d, 0x41, 0x60, 0x7a, 0x88, 0x54, 0x22, 0xde, 0xe1, 0x1c, - 0x28, 0x89, 0x7d, 0xb3, 0x89, 0xfd, 0x89, 0x5f, 0x55, 0x80, 0x8c, 0x6f, - 0x11, 0x80, 0xd0, 0x5c, 0x7e, 0x84, 0x90, 0xea, 0x6d, 0xe2, 0xc1, 0x39, - 0xe7, 0x76, 0x04, 0x24, 0x4e, 0xe6, 0x17, 0x41, 0x15, 0xd3, 0x0a, 0xe4, - 0x98, 0x96, 0x32, 0xb6, 0x3c, 0xb1, 0xa8, 0xb2, 0x4b, 0xb7, 0xcb, 0x96, - 0x41, 0x6c, 0x7b, 0x64, 0xe1, 0xa7, 0x4d, 0xe4, 0xdc, 0x85, 0x6f, 0x44, - 0x54, 0x37, 0xe3, 0xf2, 0xf2, 0x3c, 0x27, 0x96, 0x8b, 0x2f, 0x7c, 0x64, - 0xba, 0xbf, 0x21, 0x1e, 0xa0, 0xb8, 0x07, 0x89, 0xb2, 0x81, 0xc6, 0xa3, - 0x33, 0x2b, 0x95, 0x3a, 0xa4, 0x37, 0x32, 0x92, 0x70, 0x30, 0xfd, 0xb9, - 0x79, 0x73, 0xc3, 0xd6, 0x7e, 0x72, 0xe0, 0x70, 0x8f, 0x01, 0x13, 0x45, - 0x59, 0xfa, 0x47, 0x85, 0x32, 0xa4, 0x09, 0xe1, 0xd2, 0x64, 0x05, 0x4c, - 0xcb, 0xd7, 0xf1, 0x8e, 0x26, 0x95, 0xc1, 0xe9, 0x3e, 0xbd, 0x85, 0x40, - 0xc2, 0x07, 0xec, 0xa6, 0x0f, 0x48, 0x08, 0x86, 0xd9, 0x23, 0x35, 0xb5, - 0x73, 0xa3, 0x62, 0x08, 0x0a, 0x83, 0x3b, 0x48, 0xac, 0x66, 0xd6, 0x88, - 0x55, 0xd3, 0xc2, 0x6e, 0x25, 0x0b, 0xd5, 0x9b, 0xb4, 0x4f, 0x44, 0x73, - 0x21, 0xba, 0x98, 0x6f, 0xd8, 0xe6, 0x0f, 0xd2, 0x1d, 0x45, 0xe4, 0x6d, - 0xcf, 0x03, 0xf5, 0xcb, 0x53, 0x23, 0x3c, 0xe2, 0xe5, 0xbe, 0xeb, 0x72, - 0xb6, 0xd9, 0x51, 0xaa, 0x99, 0x2d, 0xd6, 0xc6, 0x71, 0x01, 0xb0, 0x0b, - 0x95, 0x48, 0x4f, 0xdc, 0x9b, 0x8e, 0xd8, 0xa0, 0x71, 0x97, 0xbd, 0x56, - 0x3a, 0x03, 0xe2, 0x9f, 0x12, 0x50, 0x1c, 0x28, 0x2a, 0xe2, 0x12, 0x1c, - 0xe5, 0x98, 0x7e, 0xda, 0x9c, 0xa8, 0xd0, 0x1a, 0xc5, 0xb1, 0x47, 0xda, - 0x9c, 0x87, 0x56, 0x55, 0x91, 0x44, 0xe3, 0xab, 0x8d, 0xb4, 0x80, 0xec, - 0xb5, 0x96, 0xa1, 0x99, 0x39, 0x1b, 0x67, 0x03, 0xbc, 0xac, 0x46, 0x69, - 0xd3, 0x3f, 0xa5, 0xa1, 0xf4, 0x98, 0xbb, 0x3f, 0x4c, 0x3f, 0x33, 0x8e, - 0xda, 0x6e, 0x06, 0x35, 0x2e, 0x5c, 0xb7, 0x66, 0x60, 0x5e, 0x2f, 0x42, - 0x6e, 0xa2, 0xf9, 0xf0, 0x91, 0x2f, 0x06, 0x24, 0x5c, 0x57, 0xc3, 0xce, - 0x6a, 0x92, 0xf7, 0x33, 0x76, 0x25, 0xe5, 0x02, 0xb3, 0xc0, 0x0c, 0x08, - 0xb5, 0xde, 0x42, 0x42, 0x3e, 0xd7, 0xd5, 0x1e, 0x90, 0x6e, 0x11, 0xa5, - 0xb6, 0x9c, 0x7a, 0x0d, 0x39, 0x00, 0xed, 0xb4, 0x59, 0xef, 0x2f, 0xe2, - 0xb4, 0x32, 0x4f, 0x0c, 0xbe, 0xaa, 0xd5, 0xa8, 0x09, 0xcf, 0x05, 0xa3, - 0x7d, 0x5a, 0xa0, 0x26, 0xcf, 0xa8, 0x66, 0x56, 0x63, 0xa7, 0xab, 0x2c, - 0x47, 0x69, 0x1c, 0xc6, 0x0b, 0xbd, 0xb6, 0x90, 0xdb, 0x44, 0xf0, 0xbb, - 0xc9, 0x67, 0x58, 0x98, 0xde, 0x23, 0x38, 0x37, 0x0e, 0x04, 0xf3, 0x5e, - 0xe8, 0x74, 0x12, 0xd0, 0x0c, 0x94, 0x3d, 0x75, 0xfc, 0x1c, 0xa3, 0x5a, - 0xdb, 0xc0, 0x49, 0xec, 0xdc, 0x67, 0x6c, 0x27, 0x61, 0x0d, 0x3b, 0xc8, - 0xfe, 0x46, 0xf6, 0xd9, 0xe3, 0xdf, 0x49, 0x82, 0x47, 0x25, 0x73, 0x89, - 0xaa, 0x2b, 0xc1, 0x26, 0x51, 0x61, 0x29, 0x74, 0x50, 0xcb, 0xfd, 0x3a, - 0x66, 0x95, 0xdd, 0x61, 0x23, 0xa2, 0x0c, 0x79, 0xf9, 0x78, 0xeb, 0xf4, - 0x4e, 0xe6, 0xc2, 0x30, 0x69, 0x7e, 0x7c, 0x8d, 0x83, 0x38, 0x5f, 0x1a, - 0xfb, 0x5d, 0xff, 0x8b, 0x36, 0xe5, 0x0a, 0x22, 0x73, 0x12, 0x93, 0x89, - 0x3c, 0x1e, 0xfb, 0xfe, 0x29, 0x5d, 0xf7, 0x36, 0xa5, 0xf1, 0xc9, 0xd2, - 0xea, 0x9e, 0xcb, 0x5c, 0x01, 0xef, 0x24, 0x01, 0x03, 0x1e, 0x27, 0xe8, - 0x23, 0x0c, 0xdb, 0x33, 0x22, 0x34, 0x08, 0x26, 0x7d, 0xaf, 0x4c, 0x6e, - 0x11, 0x10, 0xff, 0x06, 0xec, 0x75, 0x16, 0x4b, 0xed, 0x0e, 0x38, 0x4a, - 0x66, 0x13, 0x1f, 0x62, 0xe1, 0xeb, 0x9d, 0x84, 0x49, 0xdc, 0x80, 0x7d, - 0xcd, 0x02, 0x7d, 0x57, 0x59, 0xfc, 0x24, 0x28, 0x08, 0xc9, 0xe7, 0xc9, - 0xc7, 0x3d, 0x11, 0xfd, 0xb0, 0x3f, 0x5f, 0x2f, 0xd7, 0xa2, 0x4c, 0x30, - 0xe3, 0xd1, 0xa2, 0xed, 0x30, 0xce, 0xfd, 0x2a, 0x9c, 0x48, 0x76, 0x88, - 0x38, 0xdb, 0xd7, 0x57, 0x38, 0x7a, 0x21, 0xe4, 0x0d, 0xba, 0x70, 0x66, - 0xb0, 0x88, 0xf9, 0xdc, 0xd6, 0x28, 0x6d, 0x7e, 0xdf, 0x5b, 0x7d, 0xcf, - 0xf6, 0xdb, 0xc2, 0x0f, 0xe3, 0x93, 0xb4, 0x4a, 0xd3, 0x44, 0xaf, 0x3e, - 0x35, 0x1c, 0xf6, 0x9c, 0x5d, 0xb2, 0xa6, 0x5a, 0x04, 0x2c, 0x05, 0x02, - 0x85, 0x7d, 0xfe, 0x89, 0x74, 0x91, 0x24, 0xe1, 0x0d, 0x83, 0xd4, 0xaa, - 0x3c, 0x5f, 0xac, 0x5f, 0x2e, 0x76, 0x47, 0xb5, 0xa1, 0x2f, 0x20, 0x07, - 0xcd, 0x02, 0x26, 0x31, 0x61, 0xd4, 0x9f, 0xa9, 0x4e, 0x80, 0x4e, 0xc6, - 0xcc, 0x6a, 0xb9, 0x50, 0x21, 0x1d, 0x3a, 0xd5, 0x86, 0xba, 0x5c, 0x20, - 0x7e, 0xe2, 0x20, 0xb3, 0x42, 0x80, 0x07, 0x61, 0x3b, 0xc4, 0x6d, 0x21, - 0xb4, 0xff, 0x1c, 0x44, 0x01, 0x1d, 0x44, 0xee, 0x62, 0xa8, 0x7a, 0x80, - 0x89, 0x3a, 0x01, 0x06, 0xfe, 0xb1, 0x4a, 0xef, 0xac, 0x28, 0x61, 0xc7, - 0xc1, 0x4f, 0x96, 0xdb, 0xe4, 0xe8, 0x00, 0xac, 0x7a, 0xdd, 0x57, 0x13, - 0xb3, 0x81, 0x02, 0x28, 0x5c, 0x55, 0x7e, 0x4b, 0xe0, 0x2b, 0x3d, 0xc6, - 0xf8, 0x4a, 0x3a, 0xdf, 0x82, 0xb7, 0xb8, 0xea, 0x7b, 0xf7, 0x86, 0x1a, - 0x4f, 0xa5, 0x5e, 0xec, 0xa2, 0x01, 0xfb, 0x57, 0x64, 0x5b, 0x57, 0x9c, - 0x32, 0xac, 0x62, 0xa7, 0x9b, 0xd6, 0x5f, 0xe2, 0xc3, 0x53, 0x15, 0x1f, - 0xb8, 0xdf, 0xb7, 0x2b, 0xe8, 0xf6, 0x80, 0x90, 0x74, 0xae, 0x88, 0x47, - 0xe8, 0x76, 0x76, 0xa1, 0xf8, 0x3b, 0x00, 0x51, 0x6f, 0x69, 0x28, 0xd8, - 0x48, 0xf4, 0x1d, 0x60, 0xae, 0xd7, 0x1a, 0x5c, 0xf6, 0x70, 0x12, 0x27, - 0x9d, 0xa2, 0xbb, 0x21, 0x6d, 0x82, 0xc6, 0x69, 0x07, 0x60, 0xe3, 0x2d, - 0xdb, 0x96, 0x90, 0x68, 0xf9, 0xd6, 0xd3, 0x7c, 0xa0, 0xa4, 0x1c, 0x4c, - 0x3e, 0xf4, 0x6e, 0x55, 0xfb, 0x26, 0x91, 0xe3, 0x5c, 0x16, 0x78, 0x6c, - 0xef, 0x59, 0x93, 0x43, 0x7f, 0x48, 0x15, 0x90, 0x52, 0xf0, 0x7f, 0x2e, - 0x98, 0xff, 0xe3, 0x2e, 0x42, 0x18, 0xdf, 0x00, 0x4c, 0x26, 0x6f, 0xec, - 0x36, 0x02, 0xfb, 0x0f, 0xb2, 0x35, 0x0c, 0x43, 0xf4, 0xa5, 0x5b, 0x2f, - 0x35, 0x83, 0x37, 0x89, 0x09, 0xab, 0x6b, 0xec, 0x22, 0xa6, 0x53, 0x0a, - 0x4a, 0xab, 0x28, 0x6e, 0x77, 0x26, 0xfd, 0x71, 0xfd, 0x84, 0x10, 0xb9, - 0xa5, 0xf1, 0x33, 0x84, 0x6c, 0x80, 0x82, 0x14, 0x59, 0x96, 0x8a, 0xf0, - 0xe4, 0x49, 0x3c, 0x39, 0xe9, 0xe9, 0x95, 0xe9, 0xa9, 0x91, 0x1e, 0x60, - 0x13, 0x12, 0x26, 0x17, 0xca, 0x18, 0xaf, 0xae, 0x68, 0x43, 0xf3, 0x23, - 0xfc, 0x2b, 0x79, 0xe3, 0x8a, 0x2e, 0xe2, 0x10, 0x95, 0xa4, 0x5e, 0x92, - 0x75, 0xe3, 0x6e, 0xb4, 0x3d, 0xcc, 0x7a, 0x71, 0xdd, 0x0a, 0xb0, 0xca, - 0x9d, 0x55, 0x0d, 0x06, 0xa9, 0x8a, 0x8d, 0xee, 0x44, 0x59, 0x11, 0xf8, - 0xb0, 0x9f, 0xad, 0x30, 0x6a, 0xee, 0xf6, 0xa0, 0x2f, 0xd5, 0x07, 0x77, - 0x83, 0x21, 0x43, 0xed, 0xcb, 0x26, 0x06, 0xc0, 0xa8, 0x96, 0xfe, 0x99, - 0xfc, 0x06, 0x66, 0xec, 0xb3, 0xfe, 0xaa, 0x25, 0x01, 0xf9, 0x72, 0x7a, - 0x00, 0x32, 0xcb, 0x75, 0x37, 0x83, 0xea, 0xd5, 0x2b, 0x74, 0x4f, 0xb0, - 0xa9, 0x9e, 0x3b, 0xa6, 0xf1, 0xef, 0x7a, 0x6f, 0x57, 0xee, 0xd7, 0x66, - 0xb6, 0x56, 0x21, 0x2e, 0x35, 0xec, 0x57, 0x4e, 0x7a, 0x58, 0x96, 0x4d, - 0x96, 0x95, 0x38, 0xc5, 0xad, 0x6e, 0x35, 0x25, 0xc4, 0x6c, 0xa4, 0xcc, - 0xef, 0x8e, 0xe3, 0x67, 0x50, 0x19, 0x46, 0x28, 0x9d, 0x18, 0xdb, 0xa7, - 0xde, 0x05, 0x35, 0xb2, 0x75, 0xbb, 0xb6, 0xe4, 0xce, 0x0c, 0x18, 0xb9, - 0xa7, 0x66, 0x7f, 0x11, 0x73, 0x3e, 0x9e, 0xc2, 0xb2, 0x50, 0x11, 0x27, - 0xdc, 0xa1, 0xb3, 0x2c, 0x3c, 0x5d, 0x1b, 0xa5, 0x7e, 0x92, 0x00, 0x55, - 0xd9, 0x0c, 0x0e, 0x13, 0xf0, 0xb6, 0x52, 0x32, 0x71, 0xeb, 0x32, 0x9c, - 0xf4, 0xff, 0x43, 0x14, 0xa9, 0xe2, 0x39, 0xe8, 0xdb, 0xf5, 0x6a, 0x46, - 0x1f, 0x6f, 0xa2, 0x78, 0x15, 0x30, 0x9b, 0x49, 0x9f, 0xaa, 0xbf, 0x48, - 0xa9, 0xb9, 0x4b, 0xed, 0xe5, 0x46, 0x14, 0x8f, 0xa9, 0xbb, 0xfd, 0x2b, - 0xea, 0x0e, 0x64, 0xe7, 0x19, 0x09, 0x0a, 0x98, 0xf0, 0x56, 0x5a, 0x0a, - 0x4c, 0x49, 0x0a, 0x12, 0x3f, 0xf7, 0x2f, 0x2d, 0x23, 0xd0, 0x94, 0xd6, - 0xde, 0xd1, 0x3e, 0xbb, 0xff, 0x18, 0x53, 0x37, 0x3b, 0x9c, 0x51, 0x6a, - 0x55, 0xe3, 0x83, 0x38, 0xf8, 0x1d, 0x1d, 0x33, 0xdc, 0xc4, 0xec, 0x9e, - 0x70, 0xc7, 0x92, 0x95, 0x93, 0x22, 0xae, 0x0f, 0x6f, 0x5f, 0xf5, 0x88, - 0x4e, 0x6c, 0x81, 0x7c, 0x76, 0xea, 0x82, 0x89, 0x37, 0xf6, 0x4d, 0x35, - 0xbd, 0x66, 0x85, 0x28, 0xac, 0x7e, 0x83, 0xd1, 0x6d, 0xaa, 0x76, 0xe0, - 0xb3, 0x16, 0x5b, 0xb8, 0xd6, 0x8e, 0x0d, 0x6d, 0xa4, 0xfe, 0xea, 0xb6, - 0x9a, 0x81, 0xa9, 0xc0, 0xfc, 0xad, 0xab, 0xeb, 0x05, 0x07, 0x27, 0x4e, - 0x78, 0xe5, 0x20, 0xc2, 0x69, 0x34, 0x38, 0x40, 0x41, 0x98, 0xee, 0x6e, - 0x3c, 0x9e, 0x1a, 0xee, 0xe1, 0xaf, 0x0a, 0x1f, 0x7c, 0x1a, 0x12, 0xf4, - 0xca, 0x4e, 0x36, 0x07, 0x18, 0xf4, 0x3e, 0x72, 0xee, 0xe4, 0xa9, 0xd5, - 0x70, 0xeb, 0x33, 0x64, 0xf4, 0x8d, 0xa5, 0xfd, 0x3d, 0xf1, 0x5e, 0xf8, - 0x9e, 0x93, 0xc8, 0xcf, 0x42, 0x0f, 0x6f, 0x60, 0xf7, 0x26, 0x30, 0xba, - 0xd0, 0x76, 0xef, 0xc1, 0xf6, 0xc7, 0x3f, 0xbb, 0x8f, 0xad, 0xe1, 0xfd, - 0xf1, 0xae, 0x91, 0x5f, 0x0a, 0x93, 0xbf, 0xe1, 0xfc, 0x2b, 0x17, 0x5f, - 0x35, 0xda, 0x6b, 0x4d, 0x5e, 0x42, 0x3d, 0x87, 0x82, 0x6b, 0xb5, 0xe0, - 0x28, 0x5e, 0x83, 0xbc, 0x57, 0x93, 0x83, 0x12, 0xe9, 0xc3, 0xdb, 0x56, - 0xab, 0xb2, 0xf1, 0x53, 0xd5, 0x8d, 0x4d, 0x74, 0x31, 0xea, 0x3a, 0xeb, - 0x23, 0x04, 0xba, 0x14, 0xe1, 0x8b, 0xb4, 0xc0, 0xc1, 0x8e, 0xda, 0x91, - 0xb9, 0x32, 0x86, 0xf2, 0x08, 0xcc, 0x3f, 0xd7, 0x4f, 0xf3, 0x1c, 0xa1, - 0xa4, 0xe4, 0x58, 0xe7, 0x69, 0x30, 0x63, 0x6c, 0x36, 0xeb, 0x80, 0x8a, - 0xfe, 0xfb, 0x94, 0xdb, 0x66, 0xb0, 0x82, 0x18, 0x25, 0x8c, 0x3b, 0x9f, - 0x9d, 0x50, 0xb1, 0x06, 0xce, 0x86, 0x98, 0xcb, 0x99, 0xc1, 0x36, 0xc8, - 0x2b, 0xba, 0x65, 0x1b, 0x52, 0x38, 0x4d, 0x7b, 0x95, 0x7e, 0x6c, 0xc2, - 0x8c, 0x13, 0x5b, 0xa2, 0xc0, 0xde, 0x21, 0x8d, 0x94, 0xaf, 0x07, 0xba, - 0xc4, 0xe5, 0x2c, 0x64, 0xc3, 0xc7, 0x99, 0x7c, 0x5e, 0x7c, 0x13, 0xc7, - 0x97, 0xbe, 0x3e, 0x23, 0xad, 0x0e, 0x04, 0x75, 0xae, 0x1b, 0x7d, 0xd4, - 0x50, 0xbb, 0xf4, 0x1e, 0x5d, 0xde, 0x8c, 0x1a, 0x19, 0x66, 0x55, 0xa7, - 0x84, 0x61, 0x9a, 0x19, 0x63, 0xd9, 0x9c, 0x00, 0xd6, 0x45, 0xcd, 0x12, - 0x44, 0x66, 0x61, 0x25, 0x01, 0x7e, 0xfe, 0xd4, 0x74, 0x60, 0xf6, 0x48, - 0xba, 0x81, 0x3f, 0xab, 0x66, 0x18, 0xce, 0x24, 0x8f, 0xe5, 0xff, 0x42, - 0xba, 0xe4, 0x26, 0x2a, 0xcf, 0x81, 0xad, 0xbf, 0x3c, 0xfc, 0x04, 0xcd, - 0xf4, 0xbd, 0xe5, 0xe7, 0xbf, 0x37, 0x2a, 0x46, 0xff, 0x53, 0x87, 0xe5, - 0x64, 0xae, 0x02, 0x09, 0x4a, 0x84, 0xf4, 0x8c, 0x80, 0xc5, 0x2b, 0x68, - 0x11, 0xef, 0x55, 0x49, 0x5c, 0x6c, 0x27, 0x63, 0x5b, 0xce, 0x31, 0xcd, - 0xca, 0x41, 0xb9, 0x4c, 0x2e, 0x12, 0x09, 0xdb, 0x71, 0x60, 0xa1, 0xba, - 0x47, 0x7f, 0x30, 0x88, 0x9f, 0xae, 0x06, 0x27, 0xa1, 0x9f, 0xfc, 0xe6, - 0x89, 0x80, 0xe8, 0xe1, 0xc8, 0x67, 0x43, 0xd2, 0xf8, 0xcf, 0x72, 0xe0, - 0x7d, 0x2b, 0xb9, 0x26, 0x4f, 0x42, 0x5f, 0xef, 0x6f, 0x88, 0x54, 0x18, - 0xf7, 0x00, 0xf0, 0x85, 0x37, 0xf0, 0x10, 0xab, 0xbf, 0x07, 0x31, 0x8d, - 0x9b, 0x34, 0x7d, 0xac, 0xb3, 0x97, 0x37, 0xea, 0xf2, 0xe8, 0xbc, 0x2a, - 0x54, 0x83, 0x33, 0xaf, 0x1c, 0x2b, 0x3a, 0xa2, 0x42, 0x9a, 0x8a, 0x9c, - 0x6a, 0xdb, 0x78, 0x40, 0x0c, 0x3d, 0xea, 0xc9, 0x71, 0x36, 0xe3, 0xe1, - 0xbf, 0x70, 0x77, 0x1d, 0x1a, 0x9a, 0x86, 0x30, 0x49, 0xce, 0xb3, 0x0b, - 0xad, 0xce, 0x05, 0xef, 0xd4, 0x4d, 0x05, 0xb5, 0x59, 0x57, 0x05, 0x65, - 0xd7, 0x72, 0xe0, 0xce, 0xcf, 0xa9, 0x77, 0x39, 0xe3, 0x09, 0xb1, 0x1c, - 0x7b, 0xde, 0x5d, 0x12, 0x2e, 0x69, 0x4d, 0x74, 0xb8, 0x41, 0xf4, 0xaf, - 0xd0, 0xa5, 0xc3, 0xc0, 0xff, 0xf6, 0xe9, 0xf6, 0x5f, 0x05, 0x96, 0xa8, - 0x80, 0x73, 0xab, 0x3e, 0xdb, 0x3f, 0xed, 0x52, 0xd8, 0xef, 0x34, 0x43, - 0xc8, 0x79, 0x09, 0x5d, 0x43, 0x02, 0xf3, 0xe0, 0xd1, 0x64, 0x6f, 0x59, - 0x35, 0x6d, 0xb9, 0xf1, 0x27, 0x75, 0xf0, 0xc2, 0xc0, 0x71, 0x2e, 0x75, - 0xa3, 0x7a, 0xca, 0xf3, 0x90, 0xb9, 0x66, 0xe9, 0x5c, 0x4e, 0xf9, 0xac, - 0x8e, 0x35, 0xd9, 0x4c, 0x3d, 0x6f, 0x53, 0xa6, 0x05, 0xfa, 0x6f, 0x11, - 0xba, 0xa4, 0xab, 0xda, 0xd9, 0x16, 0x61, 0xda, 0x0e, 0x4b, 0x83, 0xa5, - 0x16, 0x72, 0x3a, 0x66, 0xe2, 0x9a, 0xa1, 0xe5, 0x6d, 0x12, 0xaa, 0x8a, - 0x78, 0x83, 0x47, 0x1c, 0x5d, 0x8f, 0x2f, 0x0e, 0x5c, 0xd1, 0xff, 0xb8, - 0x85, 0x4b, 0xdd, 0x41, 0x2a, 0xcf, 0x5f, 0x09, 0xbc, 0xcd, 0x6c, 0x8a, - 0x39, 0x7a, 0x50, 0x34, 0x96, 0x13, 0x20, 0xa3, 0xf9, 0xb7, 0x28, 0x00, - 0x9e, 0x15, 0x95, 0xfb, 0x86, 0x6c, 0x44, 0xe8, 0x79, 0x31, 0x1c, 0xff, - 0xf5, 0xa6, 0xbc, 0x3d, 0xfa, 0x44, 0xc0, 0xc6, 0xcc, 0xed, 0xb3, 0x59, - 0xe9, 0x98, 0x22, 0x28, 0xf2, 0x67, 0x8e, 0x70, 0xe1, 0xbc, 0x59, 0x3e, - 0xe8, 0x38, 0xcb, 0xfa, 0x6a, 0x65, 0xc7, 0x53, 0x4d, 0x86, 0xca, 0x78, - 0x0b, 0xc9, 0x5d, 0x94, 0x34, 0xaa, 0x39, 0xc9, 0x1b, 0xa5, 0x6d, 0x32, - 0xb4, 0xae, 0x43, 0x6b, 0xe6, 0xbc, 0x93, 0x0d, 0xf0, 0x3b, 0xce, 0x2b, - 0x7d, 0x58, 0x94, 0xd6, 0xda, 0x00, 0xe8, 0x6b, 0xf6, 0xcf, 0x9e, 0xd6, - 0xca, 0x71, 0x3c, 0x7a, 0xda, 0xff, 0xa0, 0xeb, 0x0d, 0x54, 0x3e, 0x45, - 0x1d, 0x41, 0x5c, 0xf8, 0x46, 0x8e, 0x86, 0xf4, 0x8b, 0x2f, 0x49, 0x45, - 0xc8, 0xd7, 0xa9, 0xca, 0xc1, 0x37, 0x55, 0x63, 0x92, 0x82, 0xa6, 0xc6, - 0xff, 0x66, 0xc6, 0x2b, 0x21, 0x80, 0xaf, 0x11, 0x83, 0xbb, 0xa7, 0xc8, - 0xa9, 0x42, 0xda, 0x82, 0x83, 0xdd, 0xff, 0xde, 0x91, 0xa9, 0x81, 0x01, - 0x3c, 0xa3, 0x4a, 0x95, 0xbf, 0x1a, 0x00, 0x72, 0x45, 0x9b, 0x2c, 0xf1, - 0x4b, 0x3c, 0xb9, 0xbd, 0x4f, 0xdc, 0xae, 0xd4, 0x4e, 0xec, 0xb2, 0x7f, - 0x00, 0x1b, 0xbd, 0x0c, 0x97, 0x3b, 0xc4, 0xe7, 0x3b, 0x52, 0xa6, 0x28, - 0xb4, 0x3d, 0x45, 0x09, 0x8b, 0x27, 0xce, 0x74, 0x78, 0x60, 0xc5, 0xd5, - 0x0d, 0xf8, 0x0a, 0xe1, 0xae, 0xa4, 0xda, 0x3e, 0x32, 0x56, 0xba, 0x69, - 0x60, 0xcf, 0xeb, 0x86, 0xdc, 0xf7, 0xdc, 0x2a, 0x67, 0xb7, 0x30, 0x00, - 0xe3, 0xed, 0xab, 0xc7, 0x91, 0x64, 0xb0, 0x15, 0xc2, 0x3c, 0xe8, 0x08, - 0x1c, 0xcd, 0xce, 0x23, 0x2f, 0x2f, 0x79, 0x1b, 0x1a, 0xb7, 0x96, 0xa4, - 0xbe, 0x4f, 0x0b, 0x38, 0x1f, 0x4e, 0xff, 0x9a, 0x17, 0x8f, 0x17, 0xa4, - 0xc7, 0x21, 0xf9, 0xe0, 0xf7, 0xf8, 0x21, 0x17, 0xd2, 0x48, 0x1f, 0xe2, - 0xb7, 0xb0, 0xd9, 0x5e, 0x65, 0x33, 0x61, 0xe1, 0x51, 0xc9, 0xf6, 0x64, - 0x0e, 0x87, 0x45, 0xea, 0xd1, 0xfd, 0xbd, 0x06, 0xe6, 0x19, 0x20, 0x9d, - 0xa7, 0xae, 0x09, 0x62, 0x81, 0x19, 0xd0, 0xda, 0x09, 0x42, 0xe0, 0x49, - 0x4d, 0xc7, 0x3b, 0x48, 0xa6, 0x91, 0xa9, 0x5b, 0xc7, 0xaa, 0x31, 0x13, - 0xfd, 0xa0, 0x2a, 0xb5, 0x5a, 0x24, 0x00, 0x60, 0x47, 0x7d, 0x49, 0xfd, - 0xa7, 0x33, 0xa2, 0x46, 0x00, 0xb1, 0xa5, 0xbc, 0x4c, 0xb4, 0x31, 0xe6, - 0x1f, 0x34, 0xd3, 0xe5, 0x32, 0x9b, 0xd4, 0xc2, 0x53, 0xfe, 0x6a, 0x74, - 0xde, 0x7e, 0x02, 0x05, 0xc4, 0xee, 0x19, 0x85, 0x95, 0x85, 0x49, 0xc9, - 0xf1, 0x68, 0xe6, 0x1a, 0x72, 0xb0, 0x7a, 0x62, 0x90, 0x68, 0xf5, 0x89, - 0x9c, 0xd1, 0xbe, 0x75, 0x10, 0xd2, 0x44, 0x65, 0x9d, 0xb1, 0xbd, 0x70, - 0x21, 0xe1, 0x39, 0x8f, 0xb3, 0x2c, 0x5c, 0x1d, 0x84, 0x4b, 0x8d, 0x8d, - 0x04, 0x01, 0xfa, 0x12, 0x8b, 0x78, 0x9e, 0xee, 0x4f, 0x47, 0x05, 0x84, - 0xe0, 0x1a, 0x2d, 0x97, 0x6b, 0x48, 0xc3, 0xbb, 0x1f, 0xbf, 0x96, 0x63, - 0x5c, 0x40, 0xd6, 0xc0, 0x03, 0x00, 0x82, 0x76, 0xec, 0xfb, 0x27, 0xa7, - 0x59, 0x3c, 0x2b, 0xd9, 0xf0, 0x15, 0x95, 0xcc, 0x60, 0xe8, 0x79, 0xc8, - 0x56, 0xdc, 0x33, 0xca, 0x76, 0x44, 0xb6, 0x38, 0xb9, 0xef, 0x6b, 0x1c, - 0xcd, 0xb6, 0x30, 0xca, 0x86, 0x83, 0x66, 0x12, 0xc6, 0x18, 0xef, 0xcf, - 0x87, 0x04, 0x93, 0x60, 0x90, 0x74, 0x11, 0xaf, 0x1c, 0x48, 0x76, 0x89, - 0xda, 0xc8, 0xa4, 0x58, 0x9f, 0xd1, 0x12, 0x96, 0x26, 0xec, 0x1a, 0x02, - 0xaf, 0x81, 0x29, 0x21, 0x2c, 0x4f, 0xaf, 0xe1, 0x18, 0xa7, 0xe0, 0xd4, - 0x53, 0x99, 0xf2, 0xab, 0xc2, 0x97, 0xfe, 0x6f, 0xda, 0xed, 0x64, 0xbc, - 0x7d, 0xad, 0x7f, 0xc0, 0x9b, 0xac, 0x51, 0x5a, 0xed, 0x4b, 0xc8, 0xbc, - 0x12, 0x40, 0x5c, 0x6a, 0xb1, 0x9a, 0x0e, 0x6d, 0x17, 0xf7, 0x22, 0xbb, - 0xd2, 0x64, 0xbd, 0x09, 0x3d, 0x45, 0xb4, 0xd7, 0x2d, 0x10, 0x84, 0x06, - 0x8c, 0x79, 0xa2, 0xd6, 0xca, 0x3a, 0x34, 0x80, 0xe7, 0x27, 0x31, 0x37, - 0x94, 0xe2, 0x81, 0xe4, 0x0b, 0x99, 0xe0, 0x1c, 0xbe, 0x4d, 0x8d, 0xe4, - 0x50, 0x47, 0x8c, 0x73, 0xe2, 0x3f, 0x39, 0xac, 0xd7, 0x7e, 0x44, 0xaa, - 0xe2, 0x24, 0x8c, 0x4e, 0xc6, 0xff, 0x8e, 0x13, 0x4a, 0x4b, 0xe9, 0x31, - 0x55, 0x3a, 0x9a, 0x15, 0x6d, 0xcd, 0x10, 0x60, 0x65, 0x22, 0x42, 0xd0, - 0x73, 0x8f, 0x78, 0xd9, 0x73, 0x0e, 0xd0, 0x09, 0xd0, 0xec, 0x36, 0xda, - 0x51, 0xf0, 0x38, 0xda, 0x6a, 0xf5, 0x41, 0x13, 0xd0, 0x1b, 0x39, 0x4a, - 0x75, 0xa2, 0xf6, 0xcd, 0x98, 0x6a, 0xc3, 0x30, 0xae, 0x28, 0x01, 0x81, - 0x25, 0x5f, 0x13, 0xd6, 0x02, 0x06, 0xd5, 0x09, 0x8c, 0xc7, 0x29, 0x8c, - 0xcd, 0xbc, 0xdb, 0x19, 0x95, 0xd1, 0x69, 0x2e, 0xea, 0x51, 0x26, 0x0c, - 0xff, 0xdd, 0x76, 0xce, 0x6c, 0x1f, 0x29, 0xde, 0x98, 0x30, 0x6a, 0x1c, - 0xb1, 0x16, 0x88, 0xa7, 0xb5, 0x67, 0x27, 0x47, 0x2b, 0xa6, 0x3f, 0x4a, - 0x57, 0xbc, 0xe6, 0xa0, 0xcd, 0x36, 0x5c, 0x81, 0x95, 0xbc, 0x2c, 0x51, - 0x7e, 0xa7, 0x6c, 0xd9, 0x83, 0x19, 0x19, 0xd0, 0x1a, 0x3a, 0x1f, 0x63, - 0x8a, 0xf0, 0x6d, 0x44, 0xad, 0xb4, 0xfa, 0x4f, 0x50, 0xb9, 0xb2, 0x2c, - 0x50, 0xd8, 0xbd, 0x42, 0xdf, 0x14, 0xe4, 0x47, 0x47, 0x3f, 0xda, 0x01, - 0xef, 0x1d, 0x2c, 0xa1, 0x79, 0xc9, 0x7d, 0x42, 0x74, 0xed, 0xa6, 0xbe, - 0xe3, 0x40, 0x62, 0x86, 0x87, 0x88, 0x19, 0x15, 0x89, 0x61, 0x76, 0x51, - 0xa3, 0x24, 0x13, 0xc9, 0x17, 0x3b, 0x11, 0x4e, 0xa2, 0x6d, 0xa7, 0xba, - 0xdd, 0xd1, 0xe7, 0xc2, 0xf1, 0x23, 0xac, 0xd4, 0x89, 0xa5, 0xbc, 0x60, - 0x86, 0x6c, 0x8d, 0x76, 0x19, 0x2a, 0xfe, 0xd0, 0x1e, 0x72, 0x13, 0xca, - 0x87, 0xe4, 0xe1, 0xfd, 0x64, 0x6b, 0x31, 0xe4, 0xba, 0x32, 0xcb, 0x8f, - 0x52, 0x34, 0x9d, 0x51, 0xe5, 0x7e, 0x37, 0xd5, 0x30, 0x97, 0x19, 0xb3, - 0x2a, 0x81, 0x25, 0x6d, 0x43, 0x4c, 0xc4, 0x10, 0x7c, 0xbd, 0x34, 0x09, - 0x20, 0x6e, 0xb3, 0x55, 0x4a, 0x8e, 0x2c, 0x7e, 0xd3, 0x4f, 0x0e, 0xaa, - 0x3a, 0x18, 0xf1, 0x9e, 0xa4, 0xcc, 0x71, 0xb3, 0x8b, 0x2b, 0x66, 0xbd, - 0x0d, 0x31, 0xa9, 0x58, 0xdb, 0x17, 0xac, 0xe3, 0x34, 0xe3, 0x4c, 0x1b, - 0xb9, 0x25, 0x27, 0x3d, 0x98, 0x9a, 0xd5, 0x6b, 0x2c, 0x18, 0x7b, 0x02, - 0xe3, 0xb4, 0x5b, 0x9d, 0x7c, 0xbc, 0x50, 0x26, 0x9d, 0x56, 0xa7, 0x30, - 0xd0, 0xab, 0x30, 0xc5, 0xde, 0xf0, 0x93, 0x3f, 0xe1, 0x45, 0xf4, 0x28, - 0xdb, 0x2a, 0x0c, 0x91, 0x89, 0x6c, 0x01, 0x81, 0xaf, 0x62, 0x5c, 0xd8, - 0xf8, 0x15, 0x12, 0x12, 0xc6, 0xc7, 0xdf, 0x4a, 0xa2, 0x45, 0x48, 0xe7, - 0x53, 0xb3, 0x4f, 0x98, 0x0f, 0x8c, 0x2c, 0x97, 0x4c, 0xb3, 0x54, 0x1e, - 0x89, 0xb2, 0x26, 0x50, 0xd2, 0xa6, 0x75, 0x7d, 0xf4, 0x0c, 0xc6, 0x07, - 0x6c, 0xa3, 0xb8, 0x1d, 0x44, 0x47, 0x3c, 0x69, 0x8f, 0x00, 0x7c, 0x0b, - 0xf9, 0xe2, 0x4b, 0x72, 0x2f, 0x33, 0x61, 0xb4, 0x8c, 0x15, 0x90, 0x07, - 0x55, 0xa5, 0x64, 0x99, 0x5a, 0x45, 0x6d, 0x75, 0x67, 0x9e, 0x3a, 0xb4, - 0xea, 0x5b, 0xb7, 0x57, 0xa0, 0xf4, 0xb9, 0x44, 0xc3, 0x8d, 0x63, 0x6c, - 0x2c, 0x9d, 0x13, 0x9f, 0xbb, 0xeb, 0xed, 0x7f, 0x8e, 0x05, 0xaa, 0x22, - 0x34, 0xec, 0x15, 0x64, 0xef, 0x69, 0xc0, 0x32, 0x83, 0xbf, 0xda, 0x6a, - 0x38, 0x0d, 0x94, 0x8c, 0x81, 0xee, 0xcf, 0x5f, 0xcc, 0xa5, 0xd4, 0x59, - 0x6c, 0x45, 0x83, 0xbe, 0xbe, 0x7c, 0x90, 0x8e, 0x1c, 0x51, 0x4a, 0xfb, - 0x12, 0x7b, 0x66, 0xa3, 0xa7, 0x54, 0x48, 0xe5, 0xe3, 0xe1, 0x9a, 0x3a, - 0xc3, 0xfe, 0x9b, 0x25, 0x04, 0xa8, 0x2d, 0xf3, 0xa3, 0x6a, 0x23, 0xb7, - 0x3b, 0x2a, 0x67, 0xe0, 0xd7, 0x5f, 0x98, 0x58, 0xf9, 0x9a, 0x7d, 0xa8, - 0x30, 0xee, 0x08, 0x6c, 0x08, 0x1c, 0x7d, 0x14, 0xde, 0xd0, 0x6b, 0xf9, - 0xa8, 0x2d, 0xd6, 0x1d, 0x87, 0xb7, 0x68, 0x8b, 0xbd, 0x22, 0x53, 0x2b, - 0xcb, 0x0c, 0xcd, 0x64, 0x74, 0x12, 0xcd, 0xda, 0x92, 0x2e, 0x63, 0xb6, - 0xbc, 0x9f, 0xd4, 0x25, 0x8c, 0xdc, 0xd1, 0x84, 0x8c, 0x18, 0x55, 0x10, - 0x1a, 0x87, 0xe2, 0xa3, 0x4b, 0xa3, 0xb7, 0x59, 0x35, 0x4b, 0xd2, 0x70, - 0x72, 0x12, 0x4e, 0xe6, 0xe3, 0xef, 0x18, 0x98, 0xa1, 0x5e, 0x3e, 0xef, - 0x12, 0x8f, 0xef, 0x01, 0x01, 0x2b, 0xc3, 0x02, 0x24, 0x5b, 0x49, 0xc3, - 0x47, 0xcf, 0x57, 0x07, 0xc8, 0x9a, 0x11, 0x1e, 0x78, 0xc7, 0xd1, 0x86, - 0x1a, 0x09, 0xed, 0xa2, 0x0e, 0x98, 0xa4, 0x93, 0x77, 0x72, 0xf2, 0xda, - 0xc1, 0x7e, 0x10, 0x8c, 0x86, 0xff, 0x1c, 0xdf, 0x5b, 0xf9, 0x3b, 0x90, - 0xa0, 0xf1, 0x03, 0x83, 0x5d, 0x7a, 0xda, 0x7c, 0x80, 0x53, 0xb6, 0x31, - 0x73, 0x5e, 0x46, 0xdf, 0x9a, 0x12, 0x79, 0xb8, 0x76, 0x63, 0x96, 0xe4, - 0xb1, 0x13, 0xb6, 0xa2, 0xd3, 0x7b, 0x61, 0x5e, 0x53, 0xb3, 0x2f, 0xd7, - 0x7d, 0x20, 0x18, 0x07, 0xfa, 0xaa, 0x8e, 0xe0, 0x38, 0x26, 0xb2, 0x83, - 0xf0, 0x89, 0x2b, 0x18, 0x5a, 0xb1, 0x30, 0x07, 0x9f, 0x2e, 0x73, 0x95, - 0x56, 0x27, 0xec, 0x11, 0xe2, 0x3c, 0x27, 0xfa, 0x7d, 0xbe, 0x3c, 0xe5, - 0x42, 0x91, 0x2d, 0x6b, 0x1a, 0xe1, 0xfb, 0xff, 0x54, 0x83, 0x5f, 0xad, - 0x3d, 0xe2, 0x68, 0x42, 0x5e, 0x4e, 0x89, 0xb0, 0x74, 0xf4, 0x91, 0x58, - 0x9f, 0xf4, 0x5d, 0x5b, 0x63, 0xbf, 0xc0, 0x9a, 0x0e, 0xfc, 0xed, 0x35, - 0x5b, 0x69, 0x39, 0x99, 0xb7, 0x69, 0xe9, 0xca, 0x5f, 0x27, 0xda, 0xdc, - 0x22, 0x12, 0x06, 0x95, 0x72, 0x37, 0x1d, 0x37, 0xc8, 0xf3, 0x23, 0xde, - 0xc8, 0x87, 0x5d, 0x21, 0x8f, 0xe6, 0x8a, 0xeb, 0x56, 0x1d, 0x23, 0x1d, - 0x7b, 0xf6, 0xac, 0x4b, 0x82, 0x16, 0xd2, 0x07, 0xb3, 0x45, 0xae, 0x5d, - 0xcc, 0xfe, 0xc8, 0xc9, 0xa5, 0x8f, 0xb1, 0xbe, 0xfd, 0xf8, 0x5f, 0x02, - 0x3e, 0x21, 0x46, 0x44, 0xf5, 0x58, 0xa9, 0x57, 0x42, 0xc6, 0xcd, 0x49, - 0xe8, 0xdd, 0x77, 0x95, 0x9a, 0x4f, 0x89, 0x1c, 0x75, 0x5b, 0xde, 0xaf, - 0xa6, 0xef, 0x24, 0x30, 0x2c, 0x6a, 0xf3, 0xa3, 0xdb, 0x35, 0x1c, 0xd7, - 0x93, 0xcc, 0x41, 0x47, 0x09, 0x71, 0xce, 0xbb, 0x11, 0x99, 0xaa, 0xee, - 0x47, 0x1d, 0x30, 0x5c, 0x17, 0x42, 0x2e, 0xff, 0x3c, 0x20, 0xde, 0x99, - 0xa5, 0x1c, 0x76, 0xff, 0x0f, 0xe5, 0xb8, 0x2b, 0x2b, 0x61, 0xcf, 0xce, - 0xad, 0xa3, 0x94, 0xd6, 0x10, 0xa8, 0xee, 0x32, 0x10, 0xfb, 0x9d, 0xa8, - 0xf9, 0x03, 0x35, 0x9a, 0x47, 0x24, 0xbf, 0xbd, 0x1e, 0x08, 0xcf, 0xb6, - 0x2b, 0x52, 0x24, 0x8c, 0x0d, 0x6e, 0x1e, 0xcb, 0xe3, 0xd2, 0x19, 0xdb, - 0xab, 0x41, 0xa2, 0xa0, 0xc8, 0x60, 0x79, 0x52, 0x87, 0xed, 0xf3, 0xa6, - 0xc9, 0xbc, 0xf2, 0x63, 0x98, 0xbc, 0x02, 0x7e, 0xec, 0xa7, 0x87, 0x63, - 0x94, 0x8d, 0xca, 0xf4, 0xfb, 0x45, 0xe4, 0x05, 0x99, 0xbe, 0x5c, 0xec, - 0xcd, 0x47, 0xf5, 0x16, 0xa5, 0xda, 0xab, 0x2f, 0x77, 0x13, 0x87, 0x52, - 0x0a, 0x1b, 0xf4, 0x4d, 0x79, 0x9f, 0x4f, 0xcb, 0xf4, 0x19, 0xad, 0x47, - 0xbf, 0xa3, 0x54, 0x7c, 0x48, 0x28, 0x5f, 0xb4, 0x4d, 0x68, 0xb7, 0xe3, - 0xb9, 0x12, 0xb6, 0x42, 0x51, 0xac, 0xf4, 0x5f, 0x72, 0x6b, 0x6b, 0xba, - 0x54, 0x5f, 0xcb, 0x64, 0x36, 0xc6, 0xdc, 0x8f, 0x46, 0x86, 0x00, 0x97, - 0x37, 0x5d, 0x11, 0x7a, 0xf1, 0x93, 0x47, 0x28, 0x73, 0xd9, 0xbc, 0x40, - 0x40, 0x94, 0xf1, 0xd9, 0x6e, 0xde, 0x6f, 0xb8, 0x0e, 0x40, 0x73, 0x88, - 0xbf, 0x0c, 0x53, 0x68, 0x78, 0x89, 0x25, 0xf5, 0x7f, 0x96, 0x15, 0x69, - 0xc2, 0xb0, 0x34, 0xa7, 0x63, 0x8b, 0xe9, 0x4c, 0x62, 0xd0, 0x17, 0x2d, - 0xf1, 0xab, 0x92, 0xf9, 0x6c, 0x72, 0x5a, 0x28, 0x36, 0x35, 0xc8, 0x17, - 0x4e, 0x05, 0x2f, 0x15, 0xa3, 0x3a, 0x63, 0x18, 0x34, 0x13, 0xbb, 0x01, - 0xd7, 0x03, 0x21, 0x44, 0x7e, 0xe2, 0x7f, 0x74, 0xd8, 0xd5, 0xf7, 0xc6, - 0xf5, 0x65, 0xde, 0x15, 0x5e, 0xef, 0x5f, 0x66, 0x3d, 0x12, 0x2b, 0x0b, - 0x38, 0x68, 0x15, 0x57, 0x45, 0x76, 0xe0, 0x13, 0x95, 0xe4, 0x0d, 0xa3, - 0xb7, 0x4b, 0x24, 0xd4, 0xa1, 0xa9, 0x3c, 0xe1, 0xfa, 0xdb, 0x5b, 0xe8, - 0xfc, 0x9e, 0x33, 0x78, 0xe2, 0x3d, 0xa7, 0xaa, 0x13, 0xa3, 0xe6, 0x68, - 0xbc, 0xa4, 0xbe, 0xac, 0x70, 0xa5, 0xbf, 0xee, 0x7a, 0xf1, 0xe9, 0x73, - 0x5c, 0x65, 0xd2, 0x92, 0xb3, 0xe5, 0xc2, 0x9b, 0x65, 0x98, 0x4a, 0xcb, - 0x3b, 0x2e, 0x58, 0x1d, 0x62, 0xd6, 0x01, 0xe1, 0x9f, 0xd8, 0x66, 0xed, - 0xcd, 0x56, 0xad, 0x2a, 0x92, 0xe4, 0x25, 0x96, 0xfa, 0xf8, 0x85, 0x26, - 0x0d, 0x58, 0x85, 0x2f, 0xd8, 0x01, 0xbe, 0xfa, 0x09, 0x18, 0x45, 0xcb, - 0x1d, 0x11, 0xa8, 0x57, 0x98, 0x30, 0x1c, 0x82, 0xac, 0x16, 0x8a, 0x86, - 0xed, 0x1b, 0xea, 0xe4, 0x21, 0x7f, 0x49, 0x50, 0xe6, 0xf8, 0xad, 0x69, - 0x51, 0x8f, 0x61, 0x28, 0x9c, 0xa3, 0x70, 0xee, 0xda, 0xad, 0xf1, 0xab, - 0x23, 0x5f, 0x19, 0x6d, 0x38, 0x89, 0xfc, 0x07, 0x25, 0x1f, 0x57, 0xb0, - 0x41, 0x87, 0xe8, 0x1e, 0x61, 0x38, 0x91, 0xc3, 0xa4, 0xa1, 0xf0, 0x82, - 0x6f, 0xfe, 0xf0, 0x6a, 0x5e, 0x53, 0x56, 0x2d, 0xcc, 0xc9, 0x4a, 0x8c, - 0x50, 0x17, 0xd3, 0xe2, 0xf5, 0x40, 0x4e, 0x25, 0xd6, 0x63, 0x23, 0x30, - 0x65, 0x21, 0x50, 0x72, 0x06, 0x50, 0x15, 0xc6, 0x0c, 0x46, 0x57, 0xbf, - 0x03, 0x1c, 0x07, 0xf5, 0x15, 0x61, 0xf1, 0xec, 0x00, 0xa9, 0x26, 0x6f, - 0x6f, 0x1f, 0xc5, 0x01, 0x14, 0xf8, 0x8b, 0x9c, 0x5c, 0xd4, 0x28, 0x8b, - 0xe6, 0xdf, 0x46, 0x66, 0x7b, 0xc7, 0x3a, 0x9c, 0x3e, 0xee, 0x15, 0x19, - 0x47, 0x49, 0x28, 0xcb, 0x17, 0x47, 0x20, 0xaa, 0xc8, 0x22, 0x61, 0x9c, - 0xa2, 0x67, 0x7e, 0xca, 0x6c, 0x5e, 0x05, 0x8d, 0x4f, 0xb2, 0xd9, 0x06, - 0xc5, 0xcc, 0xbb, 0xaa, 0x7d, 0xe1, 0x1a, 0xa0, 0xfd, 0xe2, 0x02, 0x96, - 0x41, 0xeb, 0x18, 0x33, 0xd8, 0x23, 0x87, 0x68, 0x28, 0x60, 0x80, 0xdd, - 0xc4, 0x3c, 0xae, 0xcb, 0x62, 0x09, 0x50, 0xdd, 0xaf, 0x55, 0x07, 0x5a, - 0xef, 0x6f, 0x39, 0xcb, 0x47, 0xa0, 0xd3, 0x3d, 0xb3, 0x7c, 0xc3, 0xc4, - 0xcc, 0x47, 0x3b, 0x50, 0x19, 0xc3, 0x60, 0x49, 0x31, 0xfd, 0x7a, 0x27, - 0x50, 0xf0, 0x23, 0x15, 0xfb, 0x79, 0xa9, 0x86, 0x6a, 0xb7, 0x1f, 0xb6, - 0x59, 0x49, 0x38, 0x3d, 0xfc, 0x6e, 0x0b, 0x50, 0x7c, 0xf0, 0x17, 0x3d, - 0x24, 0xfd, 0x1f, 0x96, 0x92, 0xca, 0x48, 0xb4, 0x32, 0x68, 0xc6, 0x79, - 0x33, 0x45, 0x17, 0xb7, 0x48, 0x6d, 0x11, 0x45, 0xa3, 0xdf, 0x5f, 0x2a, - 0x05, 0xa5, 0x40, 0x67, 0x18, 0x77, 0x5f, 0x68, 0x48, 0x29, 0xa9, 0x5b, - 0x41, 0x82, 0xb8, 0x39, 0x0c, 0xeb, 0xc9, 0x34, 0xcb, 0x20, 0xbc, 0xb2, - 0x2c, 0x10, 0xe8, 0x89, 0xac, 0x47, 0x16, 0xd5, 0x9d, 0x8f, 0xa3, 0xf1, - 0x7b, 0xcf, 0x8c, 0xb2, 0xcc, 0x99, 0x80, 0x6a, 0x00, 0x34, 0x0e, 0xb9, - 0xfa, 0x98, 0x9a, 0x06, 0x6d, 0xdc, 0xd4, 0x2f, 0x8e, 0x6c, 0x0b, 0x57, - 0x38, 0xaf, 0x99, 0xd3, 0x7b, 0xf1, 0xc7, 0x0d, 0xf4, 0x04, 0x43, 0x8d, - 0x04, 0x39, 0xd8, 0xd7, 0x42, 0x9a, 0x2c, 0xd1, 0xbd, 0x08, 0x8a, 0x73, - 0xb6, 0xb0, 0xd0, 0xe3, 0xfe, 0xfa, 0x0b, 0xa2, 0xac, 0x09, 0x81, 0x7d, - 0xd7, 0xe8, 0x5d, 0xdc, 0xf6, 0x60, 0xe9, 0x11, 0xe6, 0x80, 0xec, 0x50, - 0xa5, 0x53, 0x2a, 0xc4, 0x5e, 0x35, 0x97, 0x8f, 0xd0, 0xde, 0x57, 0xf6, - 0xed, 0xed, 0xa8, 0x37, 0x12, 0x9c, 0x23, 0xda, 0xda, 0x7f, 0x06, 0x06, - 0x81, 0xcd, 0xe3, 0x0f, 0x74, 0xd9, 0x02, 0x4e, 0x39, 0xad, 0xf6, 0xfd, - 0xf7, 0x1c, 0xb4, 0xa6, 0x3d, 0xa8, 0x11, 0x59, 0xf4, 0xd5, 0x62, 0xe2, - 0xcf, 0x73, 0x26, 0xab, 0x31, 0x0a, 0x1b, 0x2b, 0xec, 0x5f, 0xf8, 0xb5, - 0x09, 0xdd, 0x5f, 0x2d, 0x78, 0x04, 0x93, 0x17, 0x7b, 0x4c, 0xba, 0xbd, - 0xe7, 0xb5, 0xa1, 0xb6, 0x5c, 0xa4, 0xd2, 0xf8, 0x47, 0xf9, 0x20, 0x77, - 0x9f, 0x51, 0x70, 0xd3, 0xed, 0x8b, 0xdb, 0xea, 0x07, 0xcc, 0xed, 0x16, - 0xc2, 0x6d, 0x28, 0x89, 0xdc, 0x4e, 0xe9, 0x5a, 0x0f, 0xc1, 0xa3, 0x1f, - 0x1d, 0x35, 0xff, 0x90, 0x66, 0x2d, 0x35, 0x9e, 0xe7, 0xf0, 0xa8, 0x0c, - 0x8a, 0x77, 0xcb, 0x10, 0x37, 0x02, 0xb8, 0xd9, 0x59, 0x0b, 0x2c, 0xe0, - 0x6f, 0xf1, 0x58, 0x79, 0xfd, 0xa6, 0x38, 0x08, 0x29, 0xe3, 0xb0, 0x4d, - 0x53, 0x59, 0x42, 0xb0, 0xad, 0xf1, 0x79, 0xf0, 0xcc, 0x2f, 0xa1, 0x5b, - 0x82, 0xd9, 0xc4, 0xd8, 0x9a, 0x86, 0x97, 0x88, 0x1c, 0x8c, 0x07, 0xc2, - 0x7d, 0x2b, 0x18, 0x10, 0x02, 0x01, 0x53, 0xdc, 0xab, 0xb8, 0x74, 0x2e, - 0x9a, 0x22, 0x25, 0xd7, 0xca, 0x2f, 0x44, 0x01, 0x93, 0x83, 0x20, 0x3a, - 0x0d, 0xb4, 0x00, 0x90, 0xf2, 0x34, 0x45, 0x2f, 0x5a, 0xf9, 0x90, 0xef, - 0x2d, 0xe8, 0x1a, 0x26, 0xef, 0xe1, 0x91, 0x02, 0x69, 0xd4, 0xb7, 0xaa, - 0xef, 0x38, 0x13, 0x3e, 0x2f, 0xd4, 0x65, 0x5e, 0x8a, 0xc9, 0x49, 0xe8, - 0x25, 0x26, 0x1a, 0xb8, 0x90, 0x17, 0xce, 0x2a, 0x5a, 0x8b, 0x2f, 0x66, - 0x9f, 0x91, 0x65, 0xf0, 0xa3, 0x30, 0x57, 0x8f, 0x56, 0x83, 0x1f, 0xf5, - 0xa8, 0x07, 0xe9, 0x66, 0xf8, 0x62, 0x5c, 0x26, 0xd6, 0x48, 0x4a, 0xb0, - 0x8f, 0xee, 0xd5, 0xbc, 0xd9, 0x55, 0xab, 0x19, 0x0d, 0xcc, 0xf4, 0x66, - 0x35, 0x1e, 0x0c, 0x6b, 0x8b, 0x75, 0x47, 0x61, 0xec, 0x16, 0xf5, 0x7f, - 0x79, 0xf1, 0xfc, 0xd9, 0x2d, 0x32, 0x74, 0xc8, 0x47, 0xfb, 0x79, 0x8e, - 0x88, 0x0f, 0x96, 0x7c, 0xb6, 0x7e, 0x49, 0x0e, 0x57, 0x5b, 0xb5, 0x8b, - 0x10, 0xf7, 0x75, 0x00, 0xe7, 0x01, 0x2f, 0xac, 0xb0, 0xc5, 0x03, 0x5b, - 0x8a, 0xe2, 0x45, 0xcc, 0x03, 0x2b, 0xde, 0x2b, 0x22, 0x15, 0x84, 0x19, - 0x88, 0x0c, 0x33, 0x71, 0x8c, 0x3e, 0xf6, 0x21, 0x96, 0x60, 0x9f, 0x63, - 0x25, 0xd8, 0x90, 0x6d, 0x6c, 0xfb, 0x33, 0x1f, 0x48, 0xc6, 0x94, 0xd8, - 0x6f, 0xa7, 0xd2, 0x70, 0xdc, 0x72, 0x13, 0x6d, 0x86, 0x90, 0x44, 0x60, - 0x3e, 0x4e, 0x74, 0x5c, 0x66, 0xcf, 0x31, 0x11, 0x45, 0x9c, 0xa7, 0xaf, - 0x45, 0x95, 0x6e, 0x75, 0x6f, 0xfe, 0x67, 0xf1, 0xc9, 0x7b, 0xc5, 0xd5, - 0xd5, 0xdb, 0x2b, 0xd6, 0xeb, 0x20, 0xb0, 0x4d, 0xaf, 0x5c, 0xb6, 0x23, - 0x63, 0x82, 0xd5, 0xf3, 0x1a, 0xe3, 0x0b, 0x4c, 0x4c, 0x7a, 0x61, 0x7c, - 0x2d, 0xb8, 0x93, 0x5d, 0xa1, 0x17, 0x9c, 0xb3, 0x81, 0x1b, 0x77, 0xd8, - 0x85, 0xee, 0x92, 0x55, 0xe7, 0x05, 0x22, 0xd3, 0x9d, 0x07, 0x9e, 0xb7, - 0xd5, 0x0d, 0x27, 0x2c, 0x47, 0xa3, 0x84, 0xc7, 0x43, 0xd0, 0x34, 0x67, - 0x81, 0x3c, 0xf9, 0x0b, 0x2f, 0x77, 0x69, 0x53, 0xa4, 0x6e, 0xcf, 0x53, - 0xb3, 0x03, 0x3c, 0xa4, 0xe1, 0x98, 0x57, 0xc2, 0xc3, 0x3f, 0xda, 0x8f, - 0x8a, 0xb1, 0x94, 0x26, 0x38, 0x86, 0xe7, 0x7c, 0x73, 0xe3, 0xb4, 0xee, - 0xb2, 0x2f, 0xc5, 0x13, 0xb6, 0x99, 0xa5, 0x2e, 0x87, 0xdd, 0x04, 0xee, - 0xa4, 0x43, 0x8b, 0x5e, 0x9e, 0x27, 0xb5, 0x9d, 0x33, 0x39, 0x8f, 0xf3, - 0xd3, 0x5a, 0x96, 0x0d, 0x18, 0xde, 0x44, 0x3a, 0xb3, 0xaf, 0xfc, 0x7c, - 0x03, 0xb9, 0x64, 0xc5, 0xf3, 0x88, 0x64, 0x3d, 0xe3, 0xd8, 0xc7, 0x76, - 0x8b, 0x51, 0x19, 0x3f, 0x9f, 0x94, 0x82, 0x4b, 0x14, 0x53, 0x4c, 0x8b, - 0x9c, 0x8b, 0x7d, 0xdd, 0xcf, 0x78, 0x29, 0xbe, 0x24, 0x27, 0xc6, 0xca, - 0x16, 0x31, 0xa9, 0x7c, 0xfd, 0xc3, 0xb5, 0x75, 0x58, 0x9c, 0xfc, 0x39, - 0x3d, 0xb3, 0xdc, 0xb3, 0x14, 0x61, 0x35, 0xc0, 0xd0, 0xa4, 0x28, 0x58, - 0x5b, 0x32, 0x67, 0xf9, 0xdb, 0x49, 0x4e, 0x78, 0x21, 0x06, 0x97, 0xca, - 0xa6, 0x74, 0x48, 0xd7, 0x9e, 0x2a, 0xfc, 0xd8, 0xce, 0xdd, 0x2c, 0x27, - 0x3f, 0x52, 0xd1, 0xce, 0x73, 0x98, 0x39, 0x0d, 0x81, 0x81, 0x42, 0x32, - 0xb0, 0xea, 0xd0, 0xb0, 0xbb, 0xc2, 0x7c, 0x62, 0x9a, 0xe1, 0xec, 0xdc, - 0x09, 0xf0, 0xd5, 0x06, 0xc0, 0xf9, 0x8b, 0x53, 0xaa, 0x64, 0xdc, 0xb5, - 0xf7, 0x43, 0xe1, 0xe1, 0xb9, 0x66, 0x14, 0x55, 0xb3, 0xc0, 0x10, 0x29, - 0x05, 0x7e, 0x1f, 0x6f, 0x78, 0x07, 0x31, 0x61, 0xfe, 0x82, 0x79, 0x4f, - 0x28, 0x04, 0x9c, 0x25, 0xe0, 0xb8, 0xf4, 0xde, 0x92, 0x7f, 0xc7, 0xd5, - 0x9d, 0x59, 0xb9, 0x74, 0x56, 0x6d, 0xa2, 0x53, 0xf5, 0x56, 0x01, 0x3f, - 0x5f, 0xf7, 0x30, 0x8e, 0x5f, 0x46, 0xe7, 0xe8, 0x6f, 0x0e, 0xa5, 0x5e, - 0x8b, 0x88, 0x89, 0x45, 0xca, 0xb7, 0x00, 0xdc, 0xa9, 0x4b, 0x10, 0x51, - 0x64, 0x57, 0xde, 0x3e, 0x65, 0x11, 0xde, 0xc8, 0x44, 0x2f, 0xa2, 0xb0, - 0x74, 0x68, 0xeb, 0xc0, 0xa1, 0x27, 0x42, 0x73, 0xe1, 0x77, 0x13, 0x5f, - 0x3e, 0xd6, 0x17, 0x49, 0x6b, 0xaa, 0x75, 0x43, 0xab, 0x12, 0x09, 0x0f, - 0xc5, 0x8b, 0x16, 0x8c, 0xc7, 0x1d, 0x66, 0x15, 0xf5, 0x1e, 0xf7, 0x78, - 0x83, 0xfb, 0xe3, 0x0a, 0xbb, 0xc0, 0x5e, 0xfa, 0xc0, 0x6c, 0x9d, 0x55, - 0xb2, 0x1d, 0x06, 0x32, 0xb9, 0x17, 0x2e, 0xe4, 0x72, 0x03, 0xc1, 0x42, - 0x19, 0xba, 0x45, 0xbe, 0xd5, 0xab, 0xdc, 0x06, 0xb1, 0xe2, 0xe1, 0x2b, - 0x3f, 0xee, 0x21, 0x07, 0x04, 0x0e, 0x13, 0x16, 0x21, 0xef, 0x5a, 0x32, - 0x10, 0xde, 0xdf, 0x2a, 0xfd, 0xee, 0xe4, 0xe4, 0x1d, 0xba, 0xfc, 0xae, - 0xb7, 0x71, 0x36, 0x5f, 0x98, 0x79, 0x30, 0x75, 0x37, 0x03, 0xa0, 0x2b, - 0x08, 0x28, 0x90, 0x75, 0x3c, 0xeb, 0xf0, 0xde, 0x63, 0xff, 0x8c, 0xa5, - 0x63, 0x11, 0x0e, 0xd1, 0x08, 0x49, 0x85, 0x1f, 0x2e, 0xfb, 0x7c, 0x48, - 0x74, 0xd8, 0x65, 0x6e, 0xec, 0xeb, 0x2d, 0x48, 0x51, 0xb5, 0xc3, 0xe2, - 0x10, 0xe1, 0xcc, 0xed, 0xa7, 0x41, 0x66, 0xfd, 0xbb, 0x2c, 0x9a, 0x26, - 0x53, 0xb4, 0x7a, 0x90, 0x38, 0x52, 0x03, 0x35, 0x6c, 0xe1, 0x7a, 0xcb, - 0xe3, 0xc2, 0xd1, 0x7b, 0x7e, 0x67, 0x33, 0xee, 0x24, 0x1d, 0x0b, 0x00, - 0x6d, 0x54, 0xc7, 0x53, 0x35, 0x32, 0xaf, 0x74, 0x10, 0x03, 0x61, 0xd8, - 0xee, 0x25, 0x15, 0x68, 0x64, 0xd1, 0x53, 0x10, 0x6c, 0xa7, 0x1a, 0xba, - 0x0b, 0x74, 0x30, 0x34, 0xc6, 0x4c, 0xa6, 0x74, 0x1a, 0xfa, 0xd6, 0xd0, - 0x70, 0x63, 0x60, 0x1b, 0x4d, 0x6b, 0xc9, 0xe9, 0xb2, 0x64, 0xb5, 0xb6, - 0xcd, 0xb4, 0xeb, 0x48, 0xf0, 0x79, 0x43, 0x37, 0x88, 0x66, 0x4e, 0xa4, - 0xf5, 0xcc, 0xfd, 0x73, 0x29, 0xc9, 0x5f, 0x4e, 0x64, 0x1e, 0xe5, 0xdb, - 0x31, 0x5a, 0x19, 0x3e, 0xa6, 0x11, 0x55, 0x49, 0xeb, 0x7e, 0x11, 0x21, - 0x7e, 0xc2, 0x64, 0xc2, 0xac, 0x23, 0x05, 0xed, 0x17, 0x3e, 0xea, 0x01, - 0xc9, 0xe7, 0x7a, 0x82, 0x3b, 0x89, 0xa5, 0xb9, 0x12, 0xf1, 0xef, 0xe4, - 0x76, 0x5d, 0x21, 0xc3, 0xbd, 0xac, 0xa6, 0x55, 0xbe, 0x79, 0x64, 0x85, - 0xbf, 0x05, 0x30, 0x4f, 0x89, 0x60, 0x01, 0xa2, 0xd8, 0x9e, 0xdb, 0x40, - 0xc4, 0xae, 0x6a, 0x34, 0xa9, 0x21, 0x72, 0x80, 0xb5, 0x49, 0x59, 0xb7, - 0x5a, 0x92, 0xd7, 0x1d, 0x3a, 0x02, 0x0d, 0x4a, 0x16, 0x82, 0x1c, 0x4c, - 0x62, 0x0a, 0x4d, 0x9b, 0x61, 0x6c, 0x6b, 0x41, 0x47, 0x48, 0xa4, 0x97, - 0x6d, 0x2c, 0x59, 0xa9, 0x62, 0x6c, 0xff, 0x24, 0x76, 0xb2, 0xec, 0x84, - 0xed, 0xe8, 0x83, 0x48, 0x54, 0x02, 0x12, 0x1f, 0x9c, 0xd6, 0xf7, 0xa0, - 0x87, 0xd2, 0x9c, 0x83, 0x1d, 0x8f, 0x7d, 0x03, 0x60, 0x73, 0xb9, 0x9a, - 0x23, 0xea, 0x52, 0xf6, 0x1b, 0x11, 0xa2, 0xaf, 0x46, 0xbb, 0x02, 0xbf, - 0xcc, 0x45, 0x06, 0xc1, 0x85, 0xa8, 0xd4, 0x51, 0xe6, 0x9f, 0xfd, 0xf4, - 0x86, 0x6a, 0x25, 0x24, 0x8f, 0xe0, 0xb1, 0x9d, 0x5c, 0x69, 0x33, 0x73, - 0xed, 0x2f, 0x95, 0x99, 0x68, 0xa7, 0x0c, 0xca, 0x16, 0x26, 0x38, 0xc7, - 0xe6, 0x4e, 0x42, 0x57, 0x62, 0x7d, 0xdc, 0x5e, 0xc7, 0x47, 0x8a, 0x0e, - 0x4b, 0x81, 0x0c, 0x32, 0xc5, 0xab, 0xf1, 0x0b, 0xa0, 0x37, 0xf7, 0x61, - 0x52, 0xe5, 0x21, 0x93, 0x63, 0x0f, 0x89, 0x18, 0xea, 0xfd, 0x37, 0x4d, - 0xf8, 0x86, 0xcd, 0xea, 0xa9, 0x10, 0xd6, 0x7b, 0xe4, 0x91, 0x2a, 0xd3, - 0x73, 0xe5, 0x3a, 0xe2, 0x83, 0x97, 0xe3, 0x67, 0x42, 0x53, 0xf3, 0xc4, - 0x84, 0x1a, 0xa7, 0x0f, 0xcf, 0x55, 0x85, 0x47, 0xd0, 0x1a, 0x79, 0xe2, - 0x18, 0xda, 0xab, 0x7b, 0xfb, 0xac, 0x82, 0x4d, 0x01, 0x30, 0x50, 0xaf, - 0x7d, 0xe5, 0x37, 0x79, 0x52, 0xb2, 0xb6, 0x98, 0xe3, 0x30, 0x04, 0x51, - 0xe8, 0x49, 0x31, 0x48, 0x3f, 0xc9, 0xf5, 0x63, 0x16, 0xda, 0x9b, 0x35, - 0xac, 0x9f, 0xf7, 0x78, 0x37, 0x6b, 0x56, 0xa8, 0x7d, 0x39, 0xac, 0x24, - 0x64, 0xfe, 0x31, 0x1a, 0xfb, 0xdc, 0x27, 0x9c, 0x50, 0xa3, 0x6a, 0xb7, - 0x76, 0xe8, 0x1f, 0x99, 0x03, 0xbc, 0x46, 0x6b, 0x94, 0x18, 0x74, 0x5b, - 0x8c, 0xb9, 0x3a, 0x9c, 0x22, 0xa4, 0x4a, 0x84, 0x60, 0xfe, 0xf2, 0xc4, - 0xc9, 0xbe, 0xdf, 0x2d, 0xaa, 0x61, 0x45, 0x6e, 0x77, 0x04, 0xf1, 0x35, - 0x70, 0xae, 0x90, 0x10, 0x13, 0xd7, 0xda, 0x72, 0x17, 0x97, 0xa3, 0x7b, - 0xc8, 0xdb, 0x3d, 0xf0, 0xf1, 0x93, 0x41, 0x3d, 0xa5, 0x87, 0x00, 0x20, - 0x16, 0xf2, 0x0d, 0x45, 0x40, 0x98, 0x1c, 0x1f, 0x6b, 0xd4, 0x37, 0x04, - 0x50, 0xb5, 0x6a, 0x3e, 0xa9, 0xf9, 0x75, 0x1c, 0xc3, 0xf0, 0xed, 0x52, - 0x32, 0x0c, 0xab, 0x99, 0x4b, 0x32, 0xab, 0x17, 0x68, 0x68, 0xe8, 0x59, - 0x29, 0xc2, 0x7d, 0xd8, 0xaa, 0x58, 0x47, 0x2c, 0x18, 0xc2, 0x79, 0x54, - 0x3f, 0x70, 0xc5, 0x49, 0xbe, 0x77, 0xdd, 0x03, 0x9c, 0x14, 0x4b, 0x48, - 0xee, 0x08, 0x21, 0x24, 0x1a, 0x34, 0xe3, 0xc8, 0x0c, 0x5b, 0x2a, 0xf1, - 0x56, 0xe3, 0xe3, 0x5c, 0x9b, 0x97, 0xbf, 0xe1, 0xd6, 0x25, 0x87, 0xf7, - 0x7e, 0x77, 0xa5, 0xaf, 0x1c, 0x4a, 0xa6, 0x68, 0xd8, 0x50, 0x86, 0xbb, - 0x08, 0xfa, 0x25, 0xe6, 0xfc, 0xc0, 0xc7, 0x77, 0x9a, 0xf1, 0xd6, 0x09, - 0xb6, 0xe1, 0x5c, 0xf4, 0x96, 0xf5, 0x04, 0x94, 0x36, 0xfc, 0xd1, 0x5f, - 0x4e, 0x00, 0x1c, 0x07, 0x73, 0x7b, 0xca, 0xa6, 0xe5, 0x10, 0xd4, 0x5b, - 0x32, 0x9a, 0x2f, 0xeb, 0xcb, 0x75, 0x68, 0x89, 0xcb, 0xec, 0x5a, 0x75, - 0xf6, 0x40, 0x03, 0xa8, 0xa1, 0x83, 0x7a, 0x7d, 0xa0, 0x2c, 0x54, 0x20, - 0xf3, 0xf2, 0x0f, 0x8e, 0x73, 0x43, 0x67, 0x5d, 0xd2, 0xf9, 0xa0, 0x1b, - 0x5f, 0x03, 0xcb, 0xbf, 0x60, 0x44, 0x6a, 0x9b, 0x30, 0xc5, 0x90, 0xdc, - 0xda, 0x82, 0x51, 0xfa, 0x8d, 0x05, 0x7e, 0x35, 0x07, 0x64, 0xb1, 0x27, - 0xce, 0xed, 0xe1, 0x27, 0xe7, 0x4d, 0xba, 0x9f, 0x58, 0x66, 0x87, 0xe8, - 0x74, 0xdf, 0x6b, 0xfc, 0x74, 0xc1, 0x23, 0x06, 0xaf, 0xe2, 0x5b, 0x1a, - 0xd6, 0xd9, 0x28, 0xe1, 0xc5, 0x9b, 0x34, 0xbd, 0x25, 0x1e, 0x0c, 0xfc, - 0x06, 0xa2, 0x11, 0xc6, 0xca, 0xaa, 0x22, 0x57, 0xe9, 0x2e, 0xcd, 0x59, - 0xf6, 0x08, 0x31, 0xa0, 0x14, 0x1e, 0x88, 0xc3, 0xe1, 0xdd, 0x5f, 0xf7, - 0xa5, 0x95, 0x4a, 0xb2, 0xe7, 0xc2, 0xf1, 0x19, 0x9d, 0x85, 0xc8, 0x0a, - 0xda, 0xdd, 0x85, 0x28, 0x29, 0x32, 0xd1, 0x42, 0x47, 0xc5, 0x6d, 0x7c, - 0xeb, 0xbc, 0xe6, 0xd1, 0x7e, 0x34, 0x3c, 0x57, 0x30, 0x38, 0x93, 0x1c, - 0xd8, 0x45, 0x22, 0x1d, 0xbd, 0xa5, 0x6e, 0x77, 0xa2, 0xd8, 0x75, 0x23, - 0x8a, 0xfc, 0xc7, 0x9f, 0xa7, 0x6a, 0xd2, 0x0f, 0x89, 0xf3, 0x36, 0xa1, - 0x9a, 0x81, 0x63, 0xc2, 0x78, 0x63, 0x17, 0x35, 0x37, 0xc7, 0x87, 0xe9, - 0x3f, 0x04, 0xeb, 0xe5, 0x1a, 0x44, 0x51, 0xb8, 0x01, 0xaa, 0xe6, 0xee, - 0xbb, 0x13, 0x47, 0x4f, 0xe4, 0xdf, 0x11, 0xe5, 0xc0, 0x94, 0xbf, 0x27, - 0x6d, 0x73, 0x99, 0xea, 0x69, 0xf2, 0x7c, 0x3d, 0x62, 0xe0, 0x95, 0x0d, - 0xc9, 0x1a, 0x6f, 0xba, 0x03, 0x1d, 0xab, 0x52, 0xfe, 0x21, 0x8d, 0x5c, - 0x35, 0xa5, 0x84, 0x9d, 0xf5, 0x7f, 0x79, 0xb8, 0x2f, 0xf6, 0x77, 0xfe, - 0xe5, 0xd8, 0x93, 0x08, 0x22, 0x79, 0xab, 0x2e, 0x23, 0x48, 0xd0, 0x3c, - 0xa0, 0x22, 0x51, 0xda, 0x52, 0x25, 0xd2, 0xee, 0x1d, 0x60, 0xcf, 0x4d, - 0xec, 0xf5, 0x10, 0xb4, 0x6e, 0x02, 0x5b, 0x8a, 0x36, 0x13, 0xba, 0xec, - 0x1c, 0xfc, 0x3f, 0xda, 0x72, 0xc9, 0xf1, 0xa9, 0x0a, 0x2c, 0x55, 0xd3, - 0x30, 0x5c, 0x01, 0x3c, 0x2b, 0x5b, 0xf9, 0xbd, 0xc1, 0xc9, 0xbb, 0x8e, - 0xe2, 0xbd, 0x45, 0xe8, 0x6f, 0x1b, 0x60, 0x46, 0xca, 0x8f, 0xee, 0x41, - 0xd3, 0x76, 0xc3, 0x60, 0xb4, 0xcf, 0xdb, 0xb2, 0xe2, 0x26, 0x25, 0x9b, - 0x38, 0xdd, 0xa9, 0xc6, 0xa9, 0xcc, 0x3a, 0xd3, 0x4c, 0x49, 0x5a, 0x26, - 0x93, 0x9c, 0x13, 0x62, 0x3f, 0x3f, 0x43, 0x8e, 0x2c, 0x12, 0x52, 0x8f, - 0x37, 0x8d, 0xab, 0x9a, 0x0c, 0x0e, 0x83, 0x17, 0xd4, 0x9d, 0x97, 0xf3, - 0x47, 0xef, 0xa8, 0x34, 0x0c, 0x1f, 0x23, 0xdb, 0x4e, 0x1b, 0x42, 0x29, - 0x24, 0xf7, 0x03, 0xa0, 0xb8, 0x00, 0x2d, 0x8e, 0x46, 0xca, 0x8a, 0x5f, - 0xfe, 0xe0, 0xd3, 0xd4, 0x0e, 0x34, 0x1c, 0x59, 0x0b, 0xcc, 0x05, 0x5d, - 0x36, 0xea, 0xab, 0xb2, 0xbe, 0xef, 0xae, 0x0e, 0x58, 0x54, 0x56, 0x3c, - 0xe5, 0xee, 0x40, 0xe7, 0x8e, 0xe2, 0xf9, 0x01, 0x99, 0xcf, 0xba, 0xc7, - 0xf6, 0xa2, 0x19, 0xb3, 0xae, 0xdc, 0x5e, 0x22, 0xd2, 0xdf, 0xf0, 0x12, - 0x66, 0x05, 0x5d, 0xfa, 0xcb, 0xb3, 0x8e, 0xdb, 0xa3, 0x6e, 0xd0, 0xe8, - 0x3c, 0x93, 0x62, 0x75, 0x61, 0x68, 0xd4, 0xe3, 0x62, 0x82, 0xbc, 0xf6, - 0x99, 0x93, 0x75, 0x54, 0x40, 0xd9, 0xf1, 0xfe, 0xca, 0x7a, 0x4c, 0x1e, - 0x06, 0xf3, 0x75, 0x4e, 0x42, 0x21, 0xd1, 0x86, 0x23, 0xb5, 0x4a, 0x04, - 0xcf, 0x96, 0xef, 0xbe, 0xd7, 0x0b, 0x1f, 0x13, 0x11, 0x94, 0x69, 0xcd, - 0xdf, 0x90, 0x86, 0x52, 0x92, 0x8c, 0xe1, 0x95, 0x08, 0xb1, 0xa3, 0x80, - 0xe8, 0x6c, 0x36, 0x8f, 0x54, 0x2f, 0x6c, 0x9a, 0x8c, 0x57, 0x3a, 0xe6, - 0x5c, 0x76, 0x98, 0xce, 0x89, 0xcd, 0x37, 0x35, 0x76, 0x85, 0x86, 0xa6, - 0xee, 0x11, 0xda, 0xf3, 0x37, 0x97, 0xd2, 0xa0, 0x49, 0xfe, 0x4b, 0x37, - 0x82, 0xe5, 0xd3, 0x95, 0x18, 0x9a, 0x91, 0x9b, 0x64, 0x6d, 0x0d, 0xa3, - 0xbf, 0x80, 0x44, 0x8e, 0x63, 0xc7, 0x51, 0xd9, 0x4e, 0x85, 0xaa, 0x35, - 0xc3, 0x1b, 0xa3, 0xa1, 0x16, 0xf9, 0xea, 0x88, 0xff, 0x6e, 0xb6, 0x29, - 0x61, 0xe3, 0x34, 0x11, 0x13, 0xa0, 0xc8, 0xfe, 0xdc, 0xf4, 0x6a, 0xb6, - 0x96, 0xdd, 0x6b, 0x18, 0xba, 0x6a, 0xc0, 0x0e, 0xca, 0xf7, 0x19, 0x44, - 0xa0, 0xcf, 0xf4, 0xac, 0x26, 0x32, 0x12, 0xa9, 0x7f, 0x81, 0x80, 0x4f, - 0x21, 0xd4, 0x4f, 0xd0, 0x25, 0xba, 0x26, 0xfc, 0x0e, 0x4b, 0x42, 0xa6, - 0xc5, 0xd3, 0x92, 0xd9, 0x34, 0xf8, 0x4e, 0x20, 0xa0, 0x33, 0x0f, 0xce, - 0xf2, 0x84, 0xce, 0x23, 0xe9, 0x22, 0x89, 0x29, 0x7c, 0xd7, 0x92, 0x0e, - 0x07, 0x07, 0x31, 0x07, 0x06, 0x5e, 0xc8, 0xec, 0xdb, 0x63, 0x35, 0x73, - 0xbc, 0xe1, 0xf9, 0x3f, 0x6b, 0x7e, 0x94, 0xc9, 0xea, 0x40, 0x80, 0x53, - 0xa9, 0xa9, 0x8f, 0x2c, 0xa9, 0x9d, 0xa6, 0xb3, 0xd5, 0xb1, 0x17, 0x9c, - 0x24, 0x54, 0x7a, 0xd0, 0x5a, 0x77, 0x2d, 0xf9, 0x7d, 0x76, 0x8e, 0x66, - 0x3a, 0x80, 0x52, 0x95, 0x04, 0x0c, 0x1a, 0xf1, 0xab, 0x68, 0xfc, 0x15, - 0x05, 0x30, 0xec, 0x09, 0xa0, 0x62, 0x3c, 0x59, 0xdf, 0xf8, 0x00, 0xfe, - 0x93, 0x41, 0x93, 0x2d, 0x44, 0x9a, 0xe3, 0x73, 0x34, 0xc3, 0x1c, 0x03, - 0x4a, 0x9f, 0x97, 0xa3, 0x94, 0x4c, 0x86, 0x5a, 0xd5, 0xcf, 0xf9, 0x0e, - 0x72, 0x4d, 0x23, 0x50, 0xef, 0x9f, 0x3a, 0x20, 0x7d, 0xab, 0x7a, 0xa7, - 0xa7, 0xc1, 0xd0, 0x51, 0x36, 0x57, 0x38, 0x3c, 0xb8, 0x59, 0x79, 0x51, - 0x8e, 0x51, 0xdd, 0x7e, 0xdb, 0x41, 0x63, 0xb1, 0x7d, 0x11, 0xfb, 0x9f, - 0x91, 0x98, 0x99, 0xa5, 0x1d, 0x3d, 0x63, 0x2c, 0x32, 0x2e, 0x6b, 0x18, - 0xbb, 0x2e, 0x8f, 0xe0, 0xeb, 0xd7, 0x57, 0x6c, 0xff, 0x70, 0xc0, 0x5d, - 0xb6, 0x7a, 0x8b, 0x7e, 0x25, 0x76, 0x0f, 0xab, 0xbf, 0xe0, 0x0b, 0x6f, - 0x9e, 0xd6, 0x15, 0x81, 0xb1, 0x0e, 0xd1, 0xc9, 0x45, 0x2f, 0x59, 0x7f, - 0x39, 0x06, 0x34, 0x48, 0xd1, 0x04, 0x7d, 0x32, 0x75, 0xcf, 0xf8, 0x82, - 0x65, 0x66, 0x8b, 0x29, 0x74, 0x30, 0x3c, 0xaa, 0x80, 0xa6, 0xd2, 0xe5, - 0x6f, 0xb9, 0x41, 0x20, 0x02, 0xf1, 0xb6, 0xd3, 0x48, 0x53, 0x53, 0x47, - 0x8c, 0xa0, 0x35, 0x53, 0xee, 0x37, 0x37, 0x7e, 0x32, 0x6c, 0x33, 0x68, - 0xa7, 0xaa, 0x88, 0x94, 0xdb, 0x29, 0x49, 0x52, 0x62, 0x03, 0xb5, 0x1f, - 0xc7, 0x73, 0xbf, 0x19, 0x8f, 0x0e, 0xc0, 0x43, 0xfa, 0x24, 0x42, 0xfe, - 0x45, 0x5c, 0x39, 0xdd, 0x36, 0x47, 0x3f, 0x9d, 0xb1, 0x7c, 0x0a, 0x4b, - 0x50, 0x53, 0x36, 0x64, 0x7a, 0x04, 0x8f, 0x5b, 0x8c, 0x31, 0x4d, 0x98, - 0x15, 0x14, 0xd5, 0xc1, 0x28, 0xc5, 0xc4, 0x34, 0xef, 0x8b, 0x1c, 0xca, - 0x9d, 0x09, 0xb4, 0xf1, 0xcb, 0x4d, 0xa8, 0x3b, 0xea, 0x82, 0x3a, 0x32, - 0x0d, 0x91, 0xc8, 0xbe, 0xcf, 0x40, 0x11, 0x73, 0xcf, 0x9a, 0xb5, 0x6a, - 0xf5, 0x4e, 0xc3, 0xb8, 0x66, 0x22, 0x33, 0x32, 0x03, 0xc2, 0x57, 0x2c, - 0x06, 0xb5, 0x7e, 0x89, 0x69, 0xe0, 0x29, 0x65, 0x44, 0x0b, 0x7a, 0xdd, - 0x11, 0xe7, 0x77, 0xfb, 0x11, 0x00, 0x5e, 0xaa, 0xa3, 0xf3, 0x5a, 0x12, - 0x8f, 0xec, 0xf1, 0xb3, 0xf6, 0x03, 0x71, 0xd9, 0xf9, 0xd3, 0xfd, 0x57, - 0x91, 0xba, 0x25, 0xba, 0x13, 0x86, 0x90, 0x1a, 0x99, 0xf8, 0xfb, 0xfd, - 0x02, 0x36, 0x65, 0x72, 0xb7, 0x39, 0xf0, 0x0f, 0xce, 0x17, 0x94, 0xb3, - 0x22, 0x90, 0xfc, 0x4e, 0x1b, 0x64, 0x04, 0x18, 0x8d, 0x97, 0x4a, 0xbb, - 0x98, 0xcc, 0xbd, 0x2b, 0x30, 0xfb, 0xdc, 0x16, 0x52, 0xc5, 0xc3, 0xaa, - 0x4e, 0x50, 0x83, 0x7b, 0xb9, 0x03, 0x93, 0x02, 0xe8, 0xa3, 0xe0, 0x69, - 0x4a, 0x9d, 0xbd, 0x73, 0xef, 0xc0, 0xa5, 0x84, 0x51, 0xce, 0xad, 0xc0, - 0x4f, 0xaa, 0x40, 0xcb, 0xd9, 0xf2, 0xc1, 0x7e, 0xd8, 0xb9, 0x71, 0x40, - 0x93, 0x2a, 0x31, 0x16, 0xf2, 0x12, 0x01, 0xbc, 0x74, 0x50, 0xcc, 0x69, - 0xf4, 0x17, 0xc1, 0x1c, 0xba, 0x69, 0xed, 0xf3, 0x66, 0xab, 0x5a, 0x77, - 0x8d, 0xb8, 0x5b, 0x7c, 0x2e, 0xf6, 0x7a, 0x51, 0x82, 0x9c, 0xb7, 0xd7, - 0xf8, 0x41, 0xd6, 0xea, 0xbd, 0xbd, 0x06, 0x38, 0xc2, 0x85, 0xb0, 0xac, - 0xf2, 0x9c, 0xf3, 0x99, 0x35, 0xac, 0x1b, 0xb5, 0x38, 0xcf, 0x36, 0x2a, - 0xa0, 0x10, 0xbc, 0xea, 0xb3, 0x72, 0xce, 0x6c, 0x89, 0x5d, 0x88, 0x5c, - 0x0d, 0x76, 0x7a, 0xa4, 0xb5, 0xbe, 0x9b, 0x2e, 0x83, 0x5b, 0xab, 0xba, - 0x22, 0x01, 0xba, 0xd4, 0x6e, 0x66, 0xbf, 0x3c, 0x5a, 0x5c, 0xf7, 0x89, - 0xd0, 0x92, 0xb3, 0x37, 0xad, 0x6d, 0xb6, 0xe9, 0xa6, 0x80, 0xd0, 0x38, - 0xa0, 0x65, 0x3d, 0x4b, 0x62, 0xc4, 0xa3, 0xe9, 0xee, 0x16, 0xbb, 0xd4, - 0x30, 0xad, 0xa1, 0xa8, 0x23, 0xdb, 0xc4, 0x2f, 0xa4, 0xe6, 0x1d, 0xe8, - 0x7b, 0xc3, 0xe2, 0x92, 0x96, 0xcf, 0x6c, 0x29, 0x9c, 0x63, 0x10, 0x53, - 0xb4, 0x62, 0x96, 0x7a, 0x69, 0x64, 0xd3, 0xa4, 0x04, 0x4a, 0x87, 0x2f, - 0xc1, 0xc6, 0xc9, 0x83, 0x85, 0x4f, 0xfa, 0x4c, 0x9b, 0xae, 0x08, 0x56, - 0xec, 0x48, 0xc2, 0x25, 0xf8, 0x0e, 0x28, 0x7e, 0x1a, 0x4d, 0x5a, 0x5b, - 0xd8, 0x50, 0xdd, 0xa0, 0x34, 0x35, 0x25, 0xc2, 0x73, 0x6b, 0x88, 0xfb, - 0x30, 0x96, 0xca, 0xb1, 0x2b, 0x6a, 0xda, 0xd6, 0x34, 0x2f, 0xf4, 0xce, - 0x5b, 0x0e, 0x7b, 0xdf, 0x4f, 0x85, 0x40, 0xc9, 0x9d, 0xae, 0x7d, 0x61, - 0xd4, 0xa8, 0x1f, 0xbc, 0xdd, 0x66, 0x08, 0x29, 0x9a, 0x6f, 0xf8, 0x1f, - 0xcd, 0xe6, 0xb5, 0xdc, 0x78, 0x37, 0x14, 0x41, 0x86, 0x6c, 0x72, 0xe8, - 0x33, 0x4e, 0x10, 0x3b, 0x3b, 0xec, 0x0e, 0x2d, 0xd0, 0x22, 0x79, 0xaa, - 0x83, 0x08, 0xed, 0xf9, 0x92, 0x00, 0x25, 0x65, 0xb5, 0x8c, 0x78, 0x2f, - 0x12, 0x42, 0x8b, 0x94, 0x56, 0x0a, 0xa4, 0x09, 0x64, 0x00, 0x6f, 0x90, - 0x9e, 0x2a, 0x6b, 0xe5, 0x48, 0xbe, 0x74, 0xbb, 0xad, 0x89, 0x20, 0x9f, - 0x03, 0x29, 0x39, 0x3f, 0xba, 0x1d, 0xe7, 0xd6, 0xda, 0x20, 0x19, 0x60, - 0xdb, 0x91, 0x2a, 0x86, 0xb1, 0xad, 0x20, 0xfd, 0x5e, 0x5a, 0xe6, 0x43, - 0xb8, 0xd7, 0x65, 0xde, 0xfc, 0xaa, 0x68, 0x71, 0x53, 0xe3, 0xa7, 0xb6, - 0xdd, 0x73, 0xf9, 0x57, 0xed, 0x62, 0xf1, 0x10, 0x30, 0x0c, 0x14, 0x5a, - 0x71, 0x8c, 0xbc, 0x1c, 0x35, 0x50, 0x49, 0x71, 0xb5, 0xcd, 0x83, 0x55, - 0x54, 0x93, 0xe8, 0x5f, 0x97, 0xe9, 0x1e, 0x94, 0x08, 0x5c, 0x9d, 0x2e, - 0x68, 0x8c, 0x54, 0x28, 0xa6, 0x5e, 0xfa, 0xd3, 0x8d, 0x80, 0x4a, 0xad, - 0x73, 0x49, 0xc6, 0x9c, 0x34, 0x2f, 0xf4, 0xce, 0x24, 0x9f, 0xc3, 0xba, - 0xef, 0xb0, 0x2c, 0x24, 0x05, 0xea, 0x03, 0xf2, 0x95, 0x7b, 0x2e, 0x8a, - 0x1d, 0x69, 0xf4, 0xbb, 0x0f, 0x67, 0xf2, 0x68, 0x39, 0x61, 0xf0, 0xa1, - 0x84, 0x03, 0xd9, 0x27, 0x0b, 0x5c, 0xdd, 0x43, 0x52, 0x96, 0x4f, 0xb9, - 0xfc, 0xe1, 0x51, 0x42, 0x4b, 0x38, 0xc8, 0xbb, 0x57, 0x1f, 0xa0, 0x77, - 0xf5, 0xbc, 0x2f, 0xf5, 0xbc, 0x44, 0xeb, 0xad, 0xc1, 0xd9, 0x4d, 0x6f, - 0xac, 0x3c, 0x71, 0xe0, 0xcb, 0xe3, 0x81, 0xff, 0x95, 0xc3, 0x00, 0x15, - 0x3f, 0xf3, 0xe7, 0xf2, 0x4c, 0xd7, 0x50, 0xb7, 0x27, 0x44, 0xa9, 0xd0, - 0x19, 0xc6, 0xd2, 0xbc, 0xe3, 0xfe, 0x51, 0xb2, 0x68, 0xe5, 0xd7, 0x53, - 0xdf, 0x40, 0x7e, 0xb3, 0x6b, 0xfb, 0x57, 0xb9, 0x81, 0xa1, 0x62, 0x66, - 0x2c, 0xd2, 0x08, 0x7d, 0x93, 0xb8, 0x37, 0x14, 0xfe, 0x32, 0x5f, 0x72, - 0x35, 0x6e, 0x49, 0xd3, 0x69, 0xfa, 0x0a, 0xf0, 0x3a, 0x71, 0xc9, 0xfc, - 0x37, 0x0b, 0x4e, 0x53, 0x71, 0x2f, 0xff, 0xcd, 0x74, 0xdf, 0x91, 0x13, - 0xbc, 0x5c, 0x87, 0xf5, 0xaa, 0xf9, 0x15, 0xbe, 0x7f, 0x09, 0x2a, 0xc2, - 0x80, 0xf8, 0x48, 0x7f, 0x50, 0xfb, 0x0f, 0x02, 0x3a, 0xf8, 0x8d, 0x84, - 0x29, 0x65, 0xbc, 0x55, 0x8c, 0xb6, 0xe4, 0x22, 0x87, 0x5c, 0x95, 0x28, - 0x55, 0xaf, 0x1f, 0x6e, 0xc2, 0xd7, 0xf3, 0x49, 0x39, 0xd4, 0x05, 0xde, - 0xc8, 0x71, 0x55, 0x24, 0x12, 0xb1, 0x50, 0x6a, 0xdc, 0xe3, 0x5d, 0x80, - 0xeb, 0x57, 0x83, 0xad, 0x5a, 0xcb, 0x98, 0x96, 0x1b, 0x69, 0xe3, 0x0f, - 0xc1, 0x9f, 0x00, 0x4a, 0x54, 0x63, 0x31, 0xf1, 0x2d, 0x97, 0xac, 0xb0, - 0x8f, 0xe1, 0x37, 0xa1, 0x27, 0x97, 0xcd, 0x75, 0xbe, 0x27, 0xaa, 0x14, - 0x9b, 0xaf, 0x90, 0xbb, 0x1d, 0x84, 0x7a, 0x42, 0xfb, 0x05, 0xeb, 0xf0, - 0xbc, 0xfc, 0x45, 0xfe, 0x0c, 0xf1, 0x2b, 0x91, 0x64, 0x77, 0xc5, 0xb1, - 0xa3, 0xd5, 0x61, 0x80, 0xb5, 0xd1, 0x3d, 0xbb, 0xc5, 0xc3, 0x8e, 0x27, - 0xab, 0x1d, 0xfd, 0xff, 0xcb, 0xfa, 0xaa, 0xd4, 0x85, 0x81, 0x2e, 0x83, - 0x7c, 0x99, 0xe4, 0xb7, 0x93, 0x16, 0x4f, 0x6b, 0xfe, 0xfc, 0xbf, 0x1f, - 0x5e, 0x04, 0x62, 0xf2, 0xdb, 0xc2, 0x52, 0xa7, 0xa9, 0x61, 0x59, 0xf3, - 0xfe, 0xba, 0x64, 0x4e, 0xc4, 0x18, 0x19, 0x31, 0x36, 0xf4, 0x60, 0x2e, - 0x09, 0xb0, 0xe2, 0x29, 0xfc, 0xb1, 0xf3, 0xdb, 0x51, 0x52, 0x25, 0x4f, - 0xd5, 0xd6, 0x04, 0x9c, 0xc9, 0xec, 0x0d, 0x5b, 0xe3, 0x5b, 0xc4, 0x65, - 0xc2, 0x16, 0x1f, 0x06, 0x7d, 0x26, 0xc8, 0xff, 0x70, 0xa2, 0x01, 0xf1, - 0xe1, 0x69, 0x9e, 0xb9, 0x91, 0x00, 0x16, 0xcd, 0x04, 0xd9, 0xf8, 0x7e, - 0xa1, 0xc0, 0xf9, 0x71, 0xc5, 0x94, 0x6c, 0xe3, 0xdc, 0x05, 0x4f, 0x98, - 0x5c, 0x60, 0x52, 0x71, 0x8f, 0xe7, 0x71, 0x8a, 0xfd, 0xeb, 0x9e, 0xc6, - 0xe5, 0x82, 0x7a, 0xe0, 0x17, 0xde, 0xb2, 0x25, 0x95, 0x36, 0x6e, 0x3d, - 0x9e, 0x87, 0x63, 0xee, 0x3e, 0xe2, 0x93, 0xd7, 0x11, 0x5c, 0xb3, 0x16, - 0x29, 0x0e, 0x1c, 0xd1, 0xbd, 0xc0, 0xe7, 0x16, 0xcd, 0x32, 0x23, 0x60, - 0x58, 0xdd, 0x9e, 0xae, 0xa1, 0x86, 0x51, 0x98, 0x77, 0xf3, 0x46, 0xb1, - 0xb8, 0x68, 0x39, 0xd5, 0x65, 0x54, 0xa1, 0xf9, 0xa3, 0xcd, 0x74, 0x21, - 0x0e, 0x04, 0xfb, 0x05, 0xf0, 0x05, 0x73, 0x98, 0x57, 0x85, 0x36, 0xd2, - 0x76, 0xed, 0x18, 0x17, 0x14, 0x20, 0xdc, 0xb7, 0xa3, 0x80, 0x7c, 0x28, - 0x9c, 0x8d, 0xef, 0x89, 0xe5, 0x03, 0x89, 0x9c, 0xb1, 0x3f, 0x8c, 0x18, - 0x7e, 0xe4, 0xe8, 0xf9, 0x66, 0x25, 0x51, 0x5f, 0x48, 0xec, 0x71, 0x47, - 0x14, 0x0b, 0x3d, 0xbc, 0xe1, 0x9e, 0x30, 0xed, 0x95, 0x72, 0x40, 0x5b, - 0x02, 0xe0, 0xad, 0xe3, 0x0d, 0xb6, 0x68, 0x89, 0xa7, 0x09, 0x0e, 0x28, - 0x33, 0xa5, 0xf5, 0x98, 0x68, 0x2b, 0xc4, 0xeb, 0x1e, 0xca, 0x0a, 0xba, - 0x72, 0x0f, 0xcf, 0xb8, 0xcd, 0x23, 0xef, 0xb5, 0xad, 0x29, 0xdd, 0x63, - 0x50, 0x56, 0x78, 0x5a, 0x72, 0x5a, 0x4a, 0x4f, 0xa7, 0x77, 0x4e, 0x53, - 0xf5, 0xff, 0xb0, 0x5c, 0xd8, 0xb5, 0x31, 0xed, 0xef, 0x4a, 0xda, 0x6b, - 0xdd, 0xa2, 0x86, 0xb8, 0x66, 0x3b, 0xd4, 0xf7, 0xf8, 0xea, 0xfa, 0xfe, - 0x04, 0xe1, 0xaf, 0x8c, 0xfa, 0x11, 0xe8, 0x95, 0xbe, 0xdc, 0xe9, 0x1e, - 0x41, 0x70, 0xde, 0x62, 0x6b, 0xa0, 0xbf, 0x8a, 0xd0, 0xa1, 0x35, 0xe4, - 0xeb, 0x0d, 0x36, 0x1e, 0x07, 0x41, 0xf8, 0x27, 0x46, 0xec, 0xe4, 0x3f, - 0xae, 0x9f, 0x7d, 0xee, 0x6b, 0x89, 0x7c, 0x97, 0xec, 0x82, 0xb4, 0x32, - 0x4f, 0x20, 0x17, 0xa3, 0xae, 0x6d, 0x2e, 0xf5, 0x8c, 0x4f, 0x8f, 0xc7, - 0x0d, 0x2a, 0x98, 0x81, 0xc5, 0xe9, 0x5e, 0x08, 0x53, 0xc2, 0x5f, 0x90, - 0x17, 0x7a, 0xa0, 0x29, 0x41, 0xf6, 0x1d, 0x5c, 0xb4, 0xce, 0x92, 0x01, - 0xf3, 0xec, 0xe8, 0x66, 0x69, 0x30, 0x0b, 0x8a, 0x46, 0xf4, 0x35, 0x3e, - 0x27, 0xde, 0xff, 0x69, 0x86, 0xca, 0xb8, 0xf1, 0x66, 0xf4, 0xb6, 0xf4, - 0x2e, 0xdf, 0xad, 0x0f, 0xda, 0xc5, 0x91, 0x2c, 0xf9, 0x28, 0xaf, 0x9e, - 0x3b, 0x42, 0xae, 0x91, 0xc0, 0x84, 0xc4, 0xf8, 0xb4, 0x7d, 0x48, 0x92, - 0x03, 0x46, 0x1f, 0xe9, 0x0e, 0xc6, 0x61, 0x12, 0x74, 0x23, 0xd4, 0x7c, - 0x1b, 0x0c, 0xa2, 0x5c, 0xfa, 0x7e, 0xfb, 0xed, 0x04, 0x3c, 0xc4, 0x3b, - 0x58, 0x75, 0xad, 0x71, 0x79, 0xed, 0x82, 0x84, 0x95, 0x5a, 0xf2, 0x38, - 0xe5, 0xbe, 0x84, 0xa3, 0x78, 0x00, 0x44, 0xc4, 0xe5, 0x13, 0x4f, 0x04, - 0x7f, 0x74, 0x39, 0x54, 0x87, 0x01, 0x20, 0x0f, 0x00, 0xd1, 0x3e, 0xde, - 0x55, 0x85, 0x57, 0x8c, 0x66, 0x89, 0x54, 0x99, 0x04, 0xee, 0xc8, 0x71, - 0xa0, 0xa2, 0x5d, 0x30, 0x51, 0xaf, 0xa3, 0x45, 0x95, 0x9a, 0x4d, 0x9b, - 0x6d, 0x95, 0x55, 0x48, 0x41, 0x0b, 0x81, 0x18, 0xf7, 0xb0, 0xc3, 0x9e, - 0x2d, 0xdc, 0xd4, 0xff, 0x92, 0x2a, 0x9d, 0x67, 0x95, 0x56, 0xe7, 0xab, - 0x9e, 0x00, 0x93, 0x67, 0x8f, 0x20, 0xcb, 0xf8, 0x6c, 0xe0, 0xa1, 0xa8, - 0x38, 0x24, 0x32, 0xaf, 0xf0, 0xca, 0x00, 0xd8, 0xd1, 0x1b, 0x8c, 0x1f, - 0xea, 0xca, 0x28, 0xef, 0x07, 0x1f, 0xf0, 0x2c, 0xc0, 0x80, 0x35, 0x46, - 0x71, 0x19, 0x4d, 0xa5, 0x43, 0xd6, 0xd9, 0x95, 0x8c, 0x69, 0x84, 0xa4, - 0x69, 0x34, 0x80, 0xd3, 0x50, 0x16, 0xaf, 0x2a, 0xa8, 0xba, 0x56, 0xbb, - 0xb8, 0xc3, 0x80, 0xd9, 0x9e, 0xba, 0x94, 0x5e, 0x68, 0x02, 0x55, 0xaf, - 0x88, 0xbe, 0x6e, 0x2e, 0xd1, 0x5b, 0x7f, 0x6e, 0xd1, 0x7f, 0x44, 0xb3, - 0xce, 0xad, 0x79, 0xf5, 0xb7, 0x96, 0xa5, 0x65, 0x2a, 0x7b, 0xa3, 0x9c, - 0x9b, 0xb6, 0x18, 0x61, 0x9d, 0xa3, 0x10, 0xf1, 0x2c, 0xb0, 0xb7, 0x4d, - 0x53, 0x55, 0x88, 0xae, 0x30, 0x0a, 0xd7, 0xff, 0x54, 0x61, 0x40, 0x50, - 0x19, 0xce, 0xc6, 0xc1, 0x73, 0x3c, 0x70, 0x23, 0xaf, 0x94, 0x87, 0x10, - 0xcd, 0xa9, 0x41, 0x29, 0xb1, 0x9d, 0xaf, 0xff, 0xd5, 0xf6, 0xda, 0x55, - 0x53, 0xda, 0x93, 0xd9, 0xd9, 0xfe, 0x01, 0x78, 0xca, 0xf0, 0x3e, 0xb4, - 0x03, 0x80, 0x67, 0xe0, 0x3b, 0x1f, 0x5c, 0x9b, 0x68, 0xb4, 0x55, 0x43, - 0x6b, 0x33, 0x13, 0x47, 0x11, 0xf6, 0x0d, 0x5b, 0x5f, 0xe1, 0x55, 0x6d, - 0x16, 0xdb, 0x7d, 0x91, 0x8d, 0x75, 0x0d, 0x65, 0xf9, 0xde, 0xdc, 0x47, - 0x0f, 0x16, 0xdd, 0x27, 0xcd, 0x1c, 0xe8, 0x9f, 0x92, 0xa1, 0xf9, 0x50, - 0x0f, 0x1b, 0x47, 0xa3, 0xc6, 0x89, 0x32, 0xf8, 0xe8, 0x06, 0xd4, 0x72, - 0x8a, 0x3e, 0x41, 0xd2, 0xc4, 0x61, 0xca, 0xc1, 0x91, 0x79, 0xc2, 0x1f, - 0xdb, 0xda, 0x6d, 0xdd, 0x0a, 0xb0, 0x76, 0x23, 0xe7, 0x7f, 0xe5, 0x8f, - 0x7a, 0x88, 0x43, 0xac, 0x08, 0x37, 0x94, 0xda, 0xc6, 0xd4, 0xb7, 0x31, - 0x70, 0x5a, 0xf2, 0xcd, 0xab, 0x63, 0x23, 0xc4, 0xd2, 0x76, 0x9d, 0x0a, - 0xc6, 0x09, 0x60, 0x8f, 0xfa, 0x41, 0x06, 0x20, 0x7a, 0x2d, 0xa3, 0x25, - 0xbf, 0x99, 0xb6, 0xda, 0xec, 0x61, 0xff, 0x4c, 0xed, 0xb1, 0x51, 0xdd, - 0xc5, 0x02, 0x69, 0x08, 0x9a, 0x6e, 0x73, 0x1b, 0x33, 0x5c, 0x02, 0xf7, - 0x95, 0xbe, 0x87, 0x04, 0xff, 0x70, 0xa2, 0x6e, 0xe1, 0x48, 0xe0, 0x6e, - 0x35, 0x09, 0xf5, 0x03, 0x23, 0x2c, 0x88, 0x16, 0x61, 0x99, 0x07, 0x66, - 0x19, 0x04, 0xcc, 0x9c, 0x24, 0x17, 0xbc, 0xc2, 0xba, 0x46, 0xca, 0x3d, - 0xc5, 0x65, 0x6e, 0x1b, 0x96, 0xcb, 0x4d, 0xbe, 0x4e, 0x51, 0x0d, 0x10, - 0xe0, 0x05, 0xd2, 0xbe, 0x3e, 0x03, 0x4b, 0xc6, 0x52, 0x36, 0x9b, 0xef, - 0x02, 0xa5, 0xce, 0x82, 0x82, 0xd8, 0x4a, 0xf9, 0x3c, 0xfa, 0x9c, 0x8d, - 0x97, 0x51, 0x5c, 0x6b, 0x92, 0x7e, 0x11, 0x49, 0x91, 0x64, 0x72, 0x20, - 0xfe, 0xd4, 0x17, 0x92, 0x2d, 0x1c, 0xa8, 0xf6, 0x8a, 0x07, 0x39, 0xef, - 0x9e, 0x61, 0x6c, 0xb3, 0x27, 0x38, 0x26, 0x75, 0x27, 0x5f, 0x50, 0x8f, - 0x6e, 0xd6, 0x7a, 0xf4, 0x30, 0x1a, 0x03, 0x00, 0x8c, 0xd3, 0x36, 0x62, - 0x64, 0x43, 0xe6, 0xc0, 0x9f, 0xa3, 0x81, 0x21, 0x8b, 0xdc, 0xd1, 0xb2, - 0xc2, 0x44, 0x2e, 0xf9, 0xf8, 0x4f, 0x54, 0xc2, 0xc9, 0xa9, 0xfd, 0x16, - 0xf2, 0x80, 0x33, 0x94, 0x4a, 0x9c, 0x3f, 0xde, 0x6c, 0x35, 0xde, 0x7b, - 0x33, 0x80, 0x78, 0xa2, 0x0b, 0x1c, 0x0b, 0x0b, 0x97, 0x6e, 0xc2, 0xf0, - 0x2e, 0x0a, 0xac, 0x3a, 0xcd, 0x81, 0x4e, 0x49, 0x89, 0xe7, 0xc0, 0xbb, - 0x67, 0xdb, 0xe0, 0x9b, 0x6f, 0x67, 0x16, 0xf1, 0x63, 0xdb, 0xcd, 0x67, - 0xf1, 0x5e, 0x93, 0x87, 0x70, 0xc7, 0x94, 0x12, 0x01, 0x86, 0xe1, 0xa5, - 0x59, 0xbc, 0x9f, 0x3b, 0x25, 0xdb, 0xf5, 0x19, 0xab, 0xb1, 0x6f, 0xa3, - 0x5d, 0xd6, 0xb6, 0x7a, 0x1d, 0x9e, 0x1c, 0x3b, 0x9f, 0xca, 0xce, 0x67, - 0x0a, 0xca, 0xfe, 0xa6, 0xf2, 0x92, 0x25, 0x4b, 0x7f, 0x28, 0x06, 0x91, - 0x73, 0x68, 0x7a, 0x80, 0xd2, 0x8e, 0x31, 0x3c, 0x33, 0x1b, 0x10, 0xfd, - 0x09, 0xd0, 0xfc, 0x30, 0xea, 0xa9, 0xd6, 0x8d, 0xa3, 0xfb, 0xe3, 0x53, - 0x99, 0xf0, 0x15, 0x5e, 0xfb, 0x0c, 0x87, 0xe6, 0xef, 0x93, 0x93, 0xb7, - 0xdf, 0xbf, 0x77, 0xc7, 0xb0, 0x3c, 0x26, 0x64, 0x3a, 0x50, 0x88, 0x9b, - 0xd5, 0x10, 0x6a, 0x70, 0x81, 0xfc, 0xa8, 0x4a, 0x61, 0x24, 0x9a, 0x9c, - 0x1b, 0x25, 0xb5, 0x45, 0xd9, 0x80, 0xf1, 0xeb, 0x76, 0xe0, 0x3d, 0x17, - 0x75, 0xd1, 0xda, 0xfb, 0x69, 0x83, 0x4e, 0xec, 0x1b, 0x2d, 0xc5, 0x50, - 0x62, 0x86, 0x71, 0xb3, 0xd9, 0x31, 0x53, 0x3d, 0x53, 0x38, 0xc5, 0xc1, - 0x07, 0xa5, 0xb7, 0x2d, 0xd9, 0x3d, 0x12, 0xa2, 0xac, 0x2a, 0x56, 0x8d, - 0x57, 0xdd, 0x94, 0xdd, 0x5a, 0x5f, 0xca, 0xd3, 0x1c, 0x03, 0x38, 0xe4, - 0xc9, 0x84, 0x5c, 0xfe, 0x35, 0x34, 0xad, 0xb0, 0xca, 0x01, 0x5c, 0x11, - 0xd4, 0x2e, 0x15, 0x71, 0x27, 0xfa, 0x16, 0x7c, 0xa3, 0x8d, 0xc6, 0x26, - 0x0a, 0x9a, 0x08, 0x4d, 0xe1, 0x95, 0xd8, 0x0a, 0x10, 0x00, 0xf9, 0x0d, - 0xb9, 0xe7, 0x64, 0x32, 0x39, 0x26, 0xeb, 0x22, 0xd5, 0xb9, 0x2a, 0x2c, - 0x0e, 0x2d, 0xc6, 0xad, 0x05, 0x1f, 0xab, 0x15, 0x44, 0x4f, 0xa1, 0x25, - 0x14, 0xd0, 0x3b, 0x1e, 0xd1, 0xc2, 0xe6, 0x49, 0xda, 0x59, 0xe4, 0x48, - 0x76, 0x83, 0xac, 0x73, 0x9c, 0x81, 0x12, 0x71, 0x79, 0xc2, 0x72, 0x79, - 0xde, 0x1f, 0x47, 0x0d, 0x0f, 0xbd, 0x27, 0xac, 0x68, 0x20, 0x90, 0x5f, - 0x8f, 0x6c, 0x3d, 0x8b, 0xd6, 0x2c, 0x29, 0xae, 0x98, 0xe5, 0xd0, 0x1e, - 0x2b, 0xc3, 0x88, 0xd7, 0x55, 0x8d, 0xc3, 0xfb, 0x12, 0xc0, 0x1c, 0x8c, - 0x52, 0x09, 0x85, 0x83, 0x8c, 0xae, 0xd2, 0x4b, 0x68, 0x57, 0xa1, 0x02, - 0x9b, 0x23, 0x41, 0xb4, 0x23, 0x84, 0xc8, 0xed, 0x3b, 0x46, 0x54, 0xfc, - 0x42, 0xde, 0x3d, 0x23, 0xce, 0x36, 0x45, 0x29, 0xf7, 0x69, 0x5d, 0x10, - 0x41, 0x05, 0xa5, 0xea, 0xc4, 0x0e, 0x53, 0xdb, 0x5a, 0x9c, 0xea, 0xa2, - 0xdb, 0x9f, 0x4d, 0x96, 0xf0, 0x4c, 0x27, 0x4d, 0x50, 0xb8, 0xa5, 0xdc, - 0x63, 0xfb, 0xbb, 0x98, 0xd8, 0x74, 0xe5, 0x18, 0xa4, 0x84, 0xd8, 0x9e, - 0xda, 0x01, 0x82, 0x39, 0xf2, 0x33, 0x95, 0x08, 0x04, 0xd4, 0x42, 0x17, - 0xb7, 0x6d, 0x09, 0xe9, 0x22, 0xd3, 0x44, 0xc2, 0x65, 0x72, 0x03, 0xc9, - 0xfb, 0x1f, 0x08, 0x7e, 0x31, 0x88, 0xfa, 0x80, 0x49, 0xcf, 0x8c, 0xf0, - 0xc6, 0x23, 0xb5, 0x2f, 0xdc, 0xc6, 0xe7, 0xf5, 0xe1, 0xd0, 0xf7, 0xd0, - 0x59, 0x5e, 0x64, 0xd7, 0x8a, 0xf5, 0x5a, 0x9f, 0x01, 0xb4, 0xf8, 0xf3, - 0x31, 0x45, 0xfb, 0xfa, 0xb5, 0x72, 0x32, 0x08, 0x14, 0xa5, 0x89, 0x65, - 0x61, 0xc1, 0xbc, 0x72, 0x5e, 0x1a, 0xe9, 0xa3, 0x8e, 0x2c, 0xd1, 0x93, - 0x4b, 0x79, 0x26, 0x70, 0x2c, 0x90, 0xe5, 0xe3, 0xc3, 0x9a, 0x55, 0xd6, - 0xda, 0x27, 0x8e, 0xe2, 0xf3, 0x43, 0xd5, 0x87, 0x4d, 0xe8, 0xa8, 0xa1, - 0xdf, 0x45, 0xd8, 0x6c, 0x5c, 0xf9, 0xe2, 0x60, 0xd5, 0xac, 0xdc, 0xd7, - 0xcf, 0xa3, 0xa5, 0xee, 0xf8, 0x5d, 0x9a, 0xc3, 0xe7, 0xf8, 0x52, 0x1f, - 0x69, 0xe2, 0x98, 0xa1, 0xd8, 0x2f, 0x75, 0x8b, 0xdc, 0xd3, 0xe3, 0x2a, - 0x3a, 0xbe, 0xd4, 0x98, 0x64, 0x34, 0x84, 0x69, 0x54, 0x9d, 0x37, 0x1b, - 0x2d, 0x15, 0xe8, 0x54, 0xa2, 0xac, 0x7d, 0x5d, 0xe5, 0x2c, 0xb3, 0xc2, - 0x55, 0x65, 0xd3, 0xbf, 0x7d, 0xb0, 0xf2, 0x5a, 0x77, 0x1f, 0xe8, 0xe7, - 0x4c, 0x39, 0xa1, 0xe7, 0x14, 0xda, 0x3f, 0xac, 0xc7, 0x2a, 0xef, 0x2d, - 0xc9, 0x80, 0xcc, 0x95, 0xe8, 0xa6, 0xe7, 0x88, 0xd1, 0x9f, 0xe6, 0x3b, - 0xf9, 0xbd, 0x27, 0x62, 0xdd, 0xbf, 0xe9, 0xab, 0x81, 0x8d, 0x84, 0x4f, - 0xc4, 0xf1, 0x50, 0xeb, 0x76, 0x58, 0xa0, 0x40, 0xa4, 0xba, 0x71, 0x98, - 0xe8, 0x76, 0x13, 0x2d, 0xf0, 0xdf, 0xea, 0xfa, 0xd6, 0x3e, 0xe4, 0x3d, - 0xdf, 0x34, 0x78, 0xde, 0xd3, 0x63, 0xfc, 0x6b, 0x83, 0x3d, 0x2b, 0xdb, - 0x53, 0x7e, 0x4d, 0x90, 0x9b, 0x8a, 0x1e, 0x47, 0x55, 0xf3, 0xbc, 0x3d, - 0x25, 0xf1, 0x65, 0xb4, 0x35, 0x1a, 0x9d, 0x8a, 0x48, 0x61, 0x46, 0xc2, - 0x8e, 0x29, 0xe6, 0xd6, 0xdb, 0x75, 0x1a, 0x56, 0x74, 0x97, 0x43, 0x1e, - 0x43, 0xc1, 0x28, 0x4d, 0x58, 0xda, 0x1e, 0x03, 0xe0, 0xa2, 0xb3, 0x55, - 0x85, 0xbd, 0x50, 0x62, 0x2d, 0x0e, 0x91, 0x18, 0x4c, 0xe7, 0x5c, 0x66, - 0xc0, 0xff, 0xd2, 0x51, 0xd6, 0xe1, 0x50, 0x93, 0x7e, 0xf9, 0xf3, 0xa7, - 0xe5, 0x42, 0xcd, 0x73, 0x2f, 0x7c, 0xec, 0x69, 0x70, 0x4e, 0x3f, 0x69, - 0x2c, 0x13, 0xbe, 0xf9, 0xea, 0xf0, 0x36, 0x3b, 0x2d, 0x8b, 0xfe, 0x3f, - 0x62, 0x2b, 0xfb, 0x41, 0xae, 0x5c, 0x65, 0xf9, 0x78, 0xfe, 0x66, 0x2d, - 0x3e, 0xf9, 0x62, 0x84, 0x89, 0x46, 0x32, 0xde, 0x3e, 0x1f, 0x3b, 0xab, - 0xc3, 0xbb, 0x26, 0xd7, 0xce, 0xec, 0xe0, 0xd6, 0x54, 0x93, 0x22, 0xb9, - 0x05, 0x0d, 0xd2, 0x80, 0xa1, 0x31, 0x59, 0xfc, 0x9f, 0x7b, 0x15, 0xcb, - 0x38, 0x38, 0x62, 0xfd, 0x15, 0xca, 0x8b, 0x1b, 0x04, 0x29, 0x91, 0x94, - 0xa5, 0x72, 0x39, 0xed, 0x6c, 0xa4, 0x0f, 0xa4, 0xf9, 0xd5, 0xfc, 0x91, - 0x9e, 0x00, 0x2f, 0x16, 0xd3, 0x8b, 0x0a, 0x8c, 0x6b, 0xf6, 0xbf, 0x96, - 0xb3, 0x72, 0x60, 0x59, 0x00, 0xba, 0xd7, 0x7c, 0x72, 0xd6, 0x66, 0x57, - 0x94, 0x0f, 0xd3, 0xd1, 0xfe, 0x3c, 0xb7, 0x32, 0x4c, 0x02, 0xd0, 0x5f, - 0xc1, 0xab, 0xc1, 0xbe, 0xe4, 0xe3, 0x60, 0x8d, 0x92, 0x62, 0x8a, 0x7d, - 0x0c, 0xb6, 0x3f, 0x9f, 0xd3, 0x91, 0x8a, 0x52, 0xe6, 0xd8, 0x3b, 0x8b, - 0x7e, 0xdf, 0xf9, 0x46, 0xe7, 0x3e, 0x9e, 0xf9, 0x1c, 0x92, 0x81, 0xfb, - 0xcd, 0x48, 0xbd, 0x9a, 0x0e, 0xfa, 0xe1, 0x2d, 0x54, 0x10, 0xd7, 0xe4, - 0x39, 0x15, 0x0f, 0x9b, 0x07, 0x0e, 0xab, 0xbd, 0xa7, 0x86, 0x03, 0x01, - 0xa1, 0xf8, 0xf7, 0x3e, 0xbe, 0x6e, 0xc3, 0x05, 0x2a, 0x67, 0x21, 0x63, - 0x88, 0xea, 0xb1, 0x1c, 0x51, 0x50, 0x8b, 0x39, 0x03, 0x6b, 0x8b, 0xe9, - 0x87, 0x23, 0x80, 0x9d, 0x44, 0xcc, 0x63, 0x85, 0xca, 0xad, 0xee, 0x34, - 0x5d, 0xcf, 0xe9, 0xcb, 0xd3, 0x8e, 0xfe, 0xc3, 0xcc, 0x19, 0x68, 0xb7, - 0x4d, 0xf0, 0x27, 0xe1, 0x59, 0xfc, 0x20, 0x07, 0x80, 0xad, 0xe7, 0x2f, - 0x9e, 0xbd, 0x41, 0x02, 0x34, 0x6a, 0x6e, 0xce, 0x45, 0x12, 0x68, 0xda, - 0xe2, 0xd1, 0xd5, 0xfd, 0x5e, 0x8d, 0x9c, 0x98, 0x03, 0x89, 0xac, 0x5e, - 0x1b, 0x24, 0x10, 0xaf, 0x74, 0xb1, 0xf8, 0xc9, 0xf3, 0x4f, 0x09, 0xb0, - 0xed, 0xf3, 0x5a, 0x27, 0x08, 0x36, 0x1b, 0x0e, 0x40, 0x7f, 0x6b, 0x05, - 0xfe, 0x66, 0x8f, 0x88, 0x3e, 0x2e, 0xfb, 0xa2, 0x95, 0xc6, 0xbd, 0xb1, - 0xbd, 0x67, 0x47, 0xa3, 0x57, 0x13, 0x3f, 0xe3, 0x7c, 0xb2, 0x73, 0xdd, - 0xdf, 0x8c, 0x92, 0xe3, 0x28, 0x2b, 0x20, 0x20, 0x36, 0xf0, 0x3d, 0xc2, - 0x31, 0x8f, 0x1f, 0xdf, 0xcc, 0xd4, 0x28, 0xe2, 0x1e, 0xaa, 0x7d, 0xf2, - 0x91, 0xb5, 0xbc, 0xcd, 0xa0, 0x0c, 0x66, 0x79, 0x4d, 0xa8, 0xeb, 0xd2, - 0x1c, 0x84, 0x0d, 0x98, 0xc7, 0x16, 0x91, 0x20, 0x4b, 0x40, 0x8b, 0xd4, - 0x1f, 0xee, 0x1c, 0xe0, 0x5b, 0x73, 0x38, 0x01, 0xf0, 0x0f, 0xa2, 0x3b, - 0xd9, 0x44, 0x17, 0x67, 0x5a, 0xb2, 0x34, 0xb1, 0x51, 0x11, 0xcc, 0x16, - 0x47, 0xba, 0x86, 0x7f, 0xab, 0x5e, 0x23, 0x0b, 0x86, 0x86, 0x5a, 0x64, - 0xec, 0x4a, 0x65, 0x85, 0x65, 0x18, 0xd9, 0xa3, 0x85, 0x79, 0x6d, 0x0c, - 0x1d, 0xf0, 0x9a, 0xe1, 0x97, 0xa2, 0x8c, 0x6f, 0x52, 0x0d, 0xd1, 0x3d, - 0xb5, 0x4f, 0x76, 0xe4, 0x26, 0xef, 0x3e, 0x79, 0xe7, 0xe3, 0x3f, 0xcf, - 0xbf, 0xcc, 0x3f, 0xf5, 0x4a, 0xae, 0x57, 0x75, 0x26, 0x6a, 0xa2, 0x96, - 0xb5, 0x50, 0x63, 0xc3, 0x26, 0x4b, 0x42, 0x86, 0x68, 0x07, 0xae, 0x13, - 0x0c, 0x1e, 0x16, 0x7b, 0xdb, 0x3f, 0x01, 0xb4, 0x1f, 0x5e, 0xc8, 0xc8, - 0xae, 0x2b, 0xb7, 0x01, 0x43, 0xe7, 0xa9, 0xb4, 0x92, 0x23, 0x83, 0xd3, - 0x16, 0xe0, 0x83, 0x0d, 0x4a, 0xf5, 0xc3, 0xb9, 0x59, 0x9b, 0x13, 0x45, - 0x50, 0x77, 0x45, 0xb9, 0xf4, 0x7a, 0x55, 0x80, 0x93, 0xdf, 0x97, 0x87, - 0xf1, 0x45, 0x21, 0x1e, 0x6a, 0x00, 0x51, 0x1a, 0x97, 0xf2, 0xc4, 0x8e, - 0xd9, 0xac, 0x0b, 0xd1, 0x88, 0xbd, 0x27, 0x0b, 0x3a, 0x4b, 0xd2, 0xd2, - 0x0d, 0xf9, 0x22, 0x34, 0xb0, 0xe0, 0x8b, 0xe4, 0xb1, 0xb7, 0xfc, 0xad, - 0x5b, 0xd0, 0x8e, 0x1f, 0xd1, 0xe9, 0xf6, 0x37, 0xa3, 0x2d, 0x2b, 0x5a, - 0x4a, 0x10, 0x3b, 0x91, 0xf3, 0xf5, 0x3a, 0x6a, 0xf1, 0xe1, 0x3d, 0x3d, - 0x42, 0xf4, 0x55, 0xd0, 0x6c, 0xba, 0xcf, 0xc6, 0x78, 0xa8, 0x19, 0xf2, - 0x50, 0x84, 0xd6, 0x73, 0xe4, 0xa5, 0xf9, 0x25, 0x97, 0x7b, 0x50, 0x67, - 0x20, 0x0e, 0x67, 0x5c, 0x2d, 0x70, 0x90, 0x72, 0xaf, 0x31, 0x39, 0x2c, - 0x9b, 0xac, 0xc0, 0xae, 0x41, 0xf2, 0x65, 0x53, 0xf1, 0xc0, 0x04, 0x76, - 0x0c, 0x1f, 0x3c, 0xcd, 0xb1, 0xeb, 0xb9, 0x24, 0x90, 0x82, 0x1d, 0x82, - 0xec, 0x58, 0xdf, 0xa2, 0x90, 0xcb, 0x5c, 0x94, 0x19, 0x7c, 0xcb, 0x0a, - 0xd9, 0x60, 0x6c, 0xed, 0xce, 0x89, 0xfd, 0xa8, 0xd0, 0x1e, 0x83, 0xdf, - 0x05, 0xa4, 0x21, 0xc8, 0xa4, 0x83, 0xf0, 0x07, 0xcd, 0x0d, 0x4a, 0xd5, - 0x7a, 0x0d, 0xe6, 0x54, 0xf0, 0x29, 0xd2, 0x53, 0xf5, 0x1c, 0x67, 0x88, - 0xa2, 0x08, 0xe5, 0x31, 0xe8, 0x80, 0x1a, 0x64, 0xc0, 0x23, 0x49, 0x7c, - 0xe5, 0x07, 0xfe, 0x76, 0x84, 0xdd, 0xec, 0xca, 0x35, 0xf5, 0xd8, 0xd2, - 0xb9, 0x0f, 0xd1, 0xc6, 0x80, 0x84, 0xca, 0x7f, 0xc2, 0xe1, 0xa5, 0x7d, - 0x75, 0x74, 0x65, 0x21, 0xa6, 0x6d, 0xd4, 0xf8, 0x5f, 0x1b, 0x6b, 0x00, - 0x5b, 0x1b, 0x29, 0xa1, 0xc0, 0x37, 0x1c, 0x0f, 0x67, 0x9d, 0xac, 0xc2, - 0xfd, 0xc8, 0xee, 0x95, 0x7d, 0xb1, 0x15, 0x46, 0x95, 0x43, 0xcb, 0x19, - 0x9a, 0xfa, 0x6b, 0xdc, 0xe7, 0x86, 0xf4, 0x03, 0x48, 0xad, 0x64, 0xb9, - 0xb8, 0x70, 0xa2, 0x72, 0xdc, 0x8c, 0xb1, 0x17, 0xd2, 0x87, 0x9b, 0x86, - 0xcf, 0xa9, 0x24, 0x89, 0xa6, 0x52, 0x59, 0x36, 0xba, 0x82, 0xf3, 0x5b, - 0x84, 0xaa, 0xae, 0xd3, 0x5a, 0x2e, 0xd0, 0x5f, 0x23, 0xc4, 0xa3, 0x03, - 0x0e, 0x3c, 0xac, 0xce, 0x68, 0xf7, 0xdd, 0x7d, 0xfa, 0x61, 0x2c, 0x34, - 0x92, 0xa8, 0xc6, 0x13, 0x9b, 0x60, 0x53, 0x30, 0x58, 0x8e, 0x29, 0x15, - 0xc3, 0xf3, 0xe2, 0x63, 0x83, 0xf4, 0x04, 0xe7, 0x31, 0x23, 0x35, 0x58, - 0xcd, 0xc0, 0xc2, 0xbf, 0xe6, 0x24, 0x14, 0xf2, 0xea, 0x33, 0x7d, 0xeb, - 0x22, 0xb6, 0xd1, 0x45, 0xd6, 0xd7, 0x2e, 0xff, 0xf0, 0xcf, 0xe2, 0x20, - 0x31, 0x65, 0x05, 0x14, 0xbc, 0x10, 0xdd, 0x1f, 0xf3, 0x46, 0x44, 0x28, - 0xbb, 0x8f, 0x0a, 0x81, 0x45, 0xa0, 0x84, 0x01, 0xf8, 0xd3, 0x6d, 0xe1, - 0xc6, 0x19, 0x62, 0xab, 0x1d, 0x03, 0xbd, 0x39, 0x13, 0x80, 0xf4, 0x64, - 0x60, 0x33, 0xeb, 0xe9, 0x1b, 0xfd, 0x39, 0xf6, 0x6c, 0x57, 0x5c, 0x47, - 0x2e, 0x70, 0x64, 0x08, 0xb9, 0xe9, 0x31, 0x41, 0xa6, 0x83, 0xfe, 0x7a, - 0x44, 0x17, 0x44, 0x61, 0xc7, 0xe3, 0x50, 0xa7, 0x8a, 0xc5, 0xf8, 0xef, - 0x1f, 0x07, 0x03, 0xee, 0x19, 0x12, 0xa0, 0xe7, 0x51, 0xbb, 0xb9, 0x72, - 0xcc, 0xd4, 0x49, 0xc6, 0xf6, 0x27, 0xdd, 0x56, 0x86, 0xa6, 0x9a, 0xdf, - 0x61, 0x1a, 0x87, 0xe2, 0x6a, 0x15, 0x0b, 0x1d, 0xae, 0x61, 0xba, 0x35, - 0x24, 0x60, 0x3f, 0x66, 0xce, 0xf6, 0x07, 0x29, 0xc5, 0x74, 0x36, 0x24, - 0x0c, 0x23, 0x96, 0x08, 0x5a, 0x11, 0x3e, 0x6b, 0x0b, 0xb9, 0xc6, 0xc2, - 0x65, 0xcc, 0x90, 0x23, 0x76, 0xaa, 0x61, 0x23, 0x91, 0x15, 0x43, 0x5a, - 0x54, 0x2b, 0x8b, 0x1c, 0x93, 0x66, 0xd4, 0xe3, 0x0a, 0xa8, 0xc2, 0x65, - 0x49, 0xf5, 0x11, 0x40, 0x0a, 0x1d, 0x9e, 0x74, 0x4e, 0xf9, 0x58, 0xee, - 0x02, 0xf5, 0x8c, 0x86, 0x98, 0x3d, 0x82, 0x4e, 0x93, 0xb7, 0x12, 0x1f, - 0x74, 0xff, 0x48, 0xaf, 0xe3, 0x9c, 0xc5, 0xc8, 0x1f, 0xa2, 0xd9, 0x36, - 0xe7, 0xb0, 0x26, 0x24, 0x04, 0x4e, 0x7d, 0x8e, 0x97, 0x45, 0x43, 0x98, - 0x7e, 0x8d, 0x6a, 0x2a, 0xc1, 0x54, 0xf9, 0x2e, 0xb6, 0xa3, 0xb6, 0x8a, - 0x9a, 0x64, 0x16, 0x00, 0x46, 0x32, 0x15, 0x49, 0xe1, 0x4a, 0x0e, 0x5f, - 0x03, 0x2c, 0x35, 0x1e, 0x1b, 0x17, 0xf7, 0x55, 0xe6, 0xf4, 0xa5, 0x31, - 0x1c, 0xb4, 0x7d, 0xc0, 0x89, 0x08, 0xca, 0xcc, 0xd3, 0x05, 0x1a, 0x8b, - 0x50, 0x15, 0x5d, 0xfa, 0xe5, 0x34, 0x11, 0x08, 0xce, 0xb5, 0x4f, 0x92, - 0x02, 0xf4, 0x02, 0x91, 0x39, 0x90, 0xc9, 0x40, 0xd4, 0x24, 0x2d, 0xe8, - 0x1c, 0xa0, 0x2c, 0xe0, 0x54, 0xfc, 0x04, 0x38, 0xa5, 0xef, 0x71, 0x07, - 0x7c, 0x53, 0xe1, 0xab, 0x2f, 0x17, 0x8a, 0xeb, 0x1c, 0x1e, 0xa8, 0x04, - 0xbf, 0xf0, 0x9f, 0xae, 0x10, 0xa1, 0xa1, 0x9c, 0xd3, 0x7b, 0x35, 0xdc, - 0x5f, 0xbe, 0x89, 0x34, 0x17, 0xaa, 0xc6, 0x06, 0x76, 0x6d, 0x6f, 0xb1, - 0xde, 0x4f, 0x33, 0x79, 0xea, 0x04, 0x07, 0x99, 0x20, 0x7d, 0x54, 0x33, - 0xb0, 0x13, 0x6b, 0x11, 0x7c, 0x34, 0xc8, 0xf6, 0x44, 0x59, 0x02, 0xbb, - 0x94, 0x72, 0xf3, 0xfe, 0xe3, 0xf6, 0x2f, 0x73, 0xf9, 0xda, 0xf6, 0x23, - 0xe3, 0x62, 0xb2, 0x21, 0xa9, 0x21, 0x5b, 0xeb, 0xa2, 0x76, 0xee, 0xb4, - 0xe0, 0x54, 0x40, 0x76, 0xa6, 0x43, 0xcd, 0x70, 0x56, 0x93, 0xf9, 0x97, - 0x21, 0x06, 0xbb, 0xb4, 0x2b, 0x5c, 0x77, 0x05, 0x60, 0x4d, 0xe9, 0x35, - 0xda, 0xc1, 0x1d, 0xc8, 0xc7, 0x77, 0x34, 0xcf, 0x7d, 0x81, 0x49, 0x4b, - 0x36, 0x7a, 0x77, 0xf0, 0xf0, 0x53, 0x79, 0x1f, 0x78, 0x27, 0x0f, 0x29, - 0xfd, 0xd7, 0x0b, 0xc6, 0x5b, 0xd8, 0x0a, 0x23, 0x45, 0x2e, 0x9a, 0xd2, - 0x6c, 0x3b, 0xc6, 0x92, 0x83, 0xcb, 0x48, 0x07, 0x22, 0x2c, 0x14, 0x08, - 0xcb, 0x3f, 0x5a, 0x30, 0x4c, 0xca, 0x85, 0x55, 0xd4, 0x9e, 0x43, 0x9d, - 0xb3, 0xab, 0x7f, 0x54, 0x19, 0x16, 0xf8, 0x19, 0x25, 0x71, 0x33, 0x39, - 0x84, 0x20, 0xd6, 0x62, 0xd4, 0x37, 0x26, 0x05, 0xed, 0x3f, 0xac, 0xba, - 0x6a, 0x8c, 0xa0, 0xe3, 0x45, 0xea, 0x8f, 0x2b, 0x55, 0xed, 0xb9, 0x2d, - 0xb3, 0xe4, 0x28, 0xad, 0xd1, 0xf1, 0x53, 0xaa, 0xba, 0xde, 0x19, 0x70, - 0xd3, 0x1a, 0x98, 0x70, 0x72, 0xdb, 0x07, 0x3c, 0xdc, 0xa7, 0x98, 0x87, - 0x9a, 0x87, 0xf0, 0x51, 0x37, 0xa0, 0x6d, 0xcc, 0xce, 0x8e, 0x05, 0x07, - 0x1e, 0x26, 0xd6, 0xd3, 0x02, 0x35, 0xe6, 0x59, 0x5b, 0x91, 0x97, 0x6e, - 0xcc, 0x3f, 0xb8, 0xc3, 0x63, 0x29, 0xa6, 0xd0, 0x52, 0x23, 0xc8, 0x80, - 0x4b, 0x41, 0x7e, 0xc6, 0xd5, 0x00, 0x0f, 0x6d, 0xdf, 0x93, 0x4e, 0x34, - 0xa4, 0x9e, 0xb4, 0x26, 0xa1, 0x57, 0x2d, 0x59, 0x2e, 0xb7, 0x45, 0xac, - 0x9a, 0x2f, 0x52, 0x6c, 0x16, 0x30, 0xef, 0x17, 0xaf, 0x98, 0x86, 0x84, - 0x49, 0x1f, 0x7c, 0xba, 0x52, 0x8f, 0x5e, 0xf0, 0x90, 0x52, 0x37, 0xb4, - 0x79, 0xa9, 0x58, 0x14, 0x1e, 0x76, 0x48, 0xf9, 0x65, 0x9d, 0x87, 0xea, - 0x8d, 0x8d, 0x94, 0x1d, 0x1f, 0x46, 0x11, 0x08, 0x2e, 0xd4, 0x39, 0x84, - 0x20, 0x8c, 0xbe, 0x3c, 0xb6, 0x92, 0x7f, 0x43, 0xac, 0x6d, 0x82, 0x7c, - 0x78, 0xcf, 0x4b, 0x90, 0xa3, 0xdc, 0x5f, 0x02, 0x49, 0x97, 0x44, 0x7a, - 0xc4, 0x68, 0x84, 0xc6, 0xda, 0x6f, 0xf9, 0x88, 0x9f, 0x2d, 0x2b, 0x51, - 0x59, 0xd1, 0x00, 0x61, 0xed, 0xaa, 0x16, 0x1c, 0x50, 0xcc, 0xc6, 0x0b, - 0xc7, 0xd9, 0x15, 0x6d, 0xeb, 0xfa, 0xe4, 0x56, 0xe1, 0x9f, 0x6f, 0xaa, - 0x7a, 0x55, 0x1c, 0x40, 0x95, 0x8a, 0xe2, 0xcb, 0x20, 0x4d, 0x31, 0xed, - 0xed, 0xe3, 0x1d, 0x15, 0xda, 0x3a, 0x30, 0x7b, 0x77, 0x2d, 0x26, 0x36, - 0x45, 0xd9, 0x41, 0x99, 0x3e, 0x92, 0xb3, 0xf9, 0x09, 0x7b, 0x9f, 0x99, - 0xb9, 0xc1, 0xfc, 0xab, 0x10, 0x4a, 0xeb, 0x99, 0x4e, 0x5d, 0x74, 0x20, - 0xc1, 0x5c, 0xe1, 0x7f, 0x1f, 0x2b, 0xf8, 0x52, 0x7e, 0x0d, 0x57, 0xf6, - 0x03, 0x0e, 0x8a, 0xfa, 0xf9, 0xdd, 0xf4, 0xf6, 0x70, 0x1b, 0x1e, 0x9c, - 0x7c, 0x02, 0xd5, 0x2a, 0xd1, 0x66, 0xc4, 0x64, 0x9e, 0xde, 0x2c, 0xf1, - 0xdf, 0xf3, 0x95, 0x86, 0x78, 0xcb, 0x19, 0x70, 0x69, 0xe7, 0x1f, 0xea, - 0xfe, 0x0c, 0x64, 0x43, 0xcb, 0x73, 0xe6, 0xf2, 0xf1, 0xac, 0x41, 0x42, - 0xc3, 0x21, 0x96, 0xca, 0xbe, 0x6c, 0x1e, 0x7b, 0x84, 0x61, 0xd2, 0xe7, - 0x6f, 0xaa, 0x33, 0x12, 0xf2, 0xd9, 0x5d, 0x7a, 0x55, 0xa8, 0x6b, 0x04, - 0x46, 0x46, 0x03, 0xff, 0x49, 0x45, 0xbf, 0x27, 0x84, 0xef, 0x6c, 0x02, - 0xb4, 0xd2, 0xbd, 0x11, 0x01, 0x6d, 0x0b, 0xaa, 0xd2, 0x9b, 0xe3, 0xee, - 0x2a, 0xde, 0x04, 0x97, 0x32, 0x70, 0x62, 0x31, 0xff, 0x4a, 0x50, 0xa9, - 0xbc, 0xbb, 0x62, 0xd6, 0x06, 0xd8, 0x23, 0x34, 0xd7, 0x76, 0x70, 0xf8, - 0x4d, 0x58, 0x1c, 0x39, 0x14, 0xb9, 0x75, 0xf7, 0x00, 0x3d, 0x07, 0xe2, - 0x66, 0xfb, 0xf0, 0x80, 0xaa, 0x23, 0x83, 0x93, 0x84, 0xf6, 0xd0, 0xfe, - 0x74, 0x2f, 0xa0, 0x6d, 0xb0, 0xc0, 0x66, 0xa7, 0x34, 0x45, 0x5d, 0x00, - 0xa5, 0x59, 0xa4, 0x1b, 0xbb, 0x2c, 0xa7, 0xe0, 0x4f, 0x9e, 0x49, 0xdc, - 0xa2, 0x7b, 0x40, 0x65, 0x47, 0x89, 0xda, 0x8d, 0x2b, 0xaa, 0xb6, 0xbb, - 0x8d, 0x5d, 0x10, 0xa4, 0x24, 0x74, 0xba, 0xa0, 0x84, 0x30, 0xa5, 0x2f, - 0x65, 0xdb, 0x78, 0xaf, 0x08, 0x59, 0x98, 0x58, 0x55, 0x1c, 0x89, 0xab, - 0xef, 0x4d, 0x34, 0xaa, 0x35, 0xdc, 0x9f, 0xbc, 0x3b, 0xa4, 0xef, 0xf0, - 0x4f, 0xdd, 0xe4, 0x82, 0x52, 0x48, 0xf1, 0x95, 0xd2, 0xe2, 0xa6, 0x52, - 0xf1, 0x1b, 0xf1, 0x5f, 0x0e, 0x59, 0xb3, 0x7e, 0xea, 0xda, 0x03, 0x0a, - 0x11, 0xf3, 0xc8, 0x62, 0xff, 0xc8, 0x17, 0xc6, 0xb5, 0x06, 0xa6, 0x15, - 0xb3, 0x81, 0x98, 0x02, 0x71, 0xa9, 0xb2, 0x27, 0xa5, 0xf6, 0x81, 0x19, - 0xc4, 0x1d, 0x52, 0x16, 0x3c, 0x8d, 0x04, 0xdf, 0x7b, 0xf1, 0x98, 0xa4, - 0x11, 0xa8, 0x26, 0x6f, 0x46, 0x25, 0xf7, 0x64, 0x19, 0xfc, 0x5a, 0xa7, - 0x01, 0x2f, 0xac, 0x44, 0x6c, 0x8e, 0x59, 0x0f, 0xcb, 0x73, 0xce, 0x32, - 0xe1, 0xc0, 0x86, 0x7f, 0x16, 0x07, 0xb8, 0x6b, 0xd7, 0xd2, 0x76, 0xa0, - 0x15, 0xf6, 0x94, 0x0d, 0x7e, 0xbc, 0xed, 0x25, 0xeb, 0x12, 0x4f, 0x30, - 0xde, 0x9b, 0xc0, 0x52, 0x3e, 0x1f, 0x4c, 0x9b, 0x74, 0xd2, 0xa1, 0x57, - 0x1a, 0x34, 0xe7, 0x45, 0x86, 0x43, 0x82, 0xa1, 0x80, 0x70, 0xb5, 0xcc, - 0xb1, 0xe6, 0xdc, 0x01, 0xb4, 0x74, 0x42, 0x6b, 0xdd, 0xf5, 0x5b, 0x3f, - 0xb0, 0xf4, 0x18, 0x60, 0xcc, 0xd0, 0x2a, 0xae, 0x37, 0xd7, 0xac, 0x14, - 0x86, 0x10, 0x84, 0x72, 0x93, 0x3b, 0xc1, 0x3b, 0x9b, 0xed, 0x35, 0xbd, - 0x10, 0xdb, 0x17, 0x39, 0x96, 0xd2, 0xfd, 0x17, 0x5f, 0xc1, 0xb7, 0xf3, - 0x7e, 0x18, 0xc3, 0xf0, 0xcb, 0x72, 0x03, 0xec, 0xf4, 0xe8, 0x6a, 0xc7, - 0xc2, 0x8c, 0x66, 0x28, 0xf3, 0x7c, 0xd1, 0x75, 0x96, 0x4b, 0x20, 0xeb, - 0xcd, 0xa1, 0x61, 0xe8, 0xb7, 0xed, 0xb4, 0x0d, 0x9b, 0xab, 0xd9, 0x95, - 0x6f, 0x63, 0xde, 0x6e, 0x02, 0x9e, 0x00, 0xef, 0x55, 0x1a, 0xc0, 0x90, - 0xfa, 0xdc, 0xd0, 0x5e, 0x6d, 0x6d, 0x8e, 0x6c, 0x64, 0x74, 0x4a, 0xcc, - 0x92, 0x56, 0xdd, 0x20, 0xa4, 0x27, 0x45, 0x64, 0xc5, 0x01, 0x70, 0x3b, - 0x8f, 0x3c, 0xd4, 0xc9, 0x83, 0x7c, 0x4f, 0x5e, 0xa0, 0x74, 0x8b, 0xe3, - 0x3c, 0x00, 0x74, 0xf0, 0xcd, 0x90, 0x80, 0x05, 0xbc, 0xc9, 0x62, 0x91, - 0x03, 0xb9, 0xd3, 0x68, 0xbb, 0xf6, 0x8b, 0x85, 0x05, 0x74, 0x87, 0x8e, - 0x85, 0x2e, 0x53, 0xe5, 0x40, 0xd6, 0x8d, 0x01, 0xa0, 0x78, 0x71, 0xee, - 0xb4, 0x66, 0xf1, 0x86, 0xff, 0x3b, 0x48, 0x81, 0x97, 0x83, 0xc8, 0x69, - 0x52, 0xc0, 0x11, 0x09, 0xc7, 0x8b, 0xcb, 0xfc, 0x92, 0x0f, 0x77, 0x4e, - 0x2d, 0x77, 0xcf, 0x26, 0x7f, 0xa5, 0xbe, 0x1b, 0x43, 0x68, 0x1c, 0x0a, - 0xb2, 0xc9, 0x7b, 0x0d, 0xc9, 0xa7, 0x3e, 0x54, 0xec, 0x24, 0x76, 0x32, - 0xdb, 0x7a, 0xc6, 0x0f, 0x24, 0x0a, 0xf5, 0xb1, 0x49, 0x80, 0xb3, 0xd6, - 0x67, 0x0b, 0x61, 0x76, 0xee, 0x34, 0x5a, 0x8c, 0x42, 0x47, 0x4e, 0x92, - 0x3c, 0x2d, 0xd4, 0x92, 0x51, 0x6b, 0xb0, 0x0a, 0x52, 0xe8, 0xa8, 0xf6, - 0x2d, 0x3f, 0xb6, 0xc2, 0xbd, 0x4b, 0xf5, 0xa4, 0xff, 0x97, 0xf5, 0xac, - 0xf8, 0x2c, 0x97, 0x4c, 0x5f, 0x16, 0x14, 0x17, 0x3f, 0x63, 0xd0, 0xbe, - 0x99, 0x44, 0x55, 0x6d, 0xb2, 0x2f, 0x54, 0xa0, 0x38, 0x7a, 0x5b, 0x94, - 0x61, 0x85, 0x46, 0x9b, 0xf2, 0xb8, 0x00, 0x99, 0xc3, 0x76, 0x1a, 0x1b, - 0xcb, 0x7b, 0x1a, 0xdb, 0xf3, 0x7c, 0x64, 0x37, 0x2d, 0xb5, 0x57, 0xa1, - 0xe6, 0xc5, 0xec, 0xa1, 0xe4, 0xff, 0x78, 0x0b, 0x42, 0x0e, 0x1d, 0x2b, - 0xe2, 0xf8, 0x26, 0xdc, 0xad, 0x55, 0x36, 0x9a, 0x1c, 0xc9, 0x9c, 0xd9, - 0x20, 0xb4, 0xa3, 0xf6, 0xe0, 0xd8, 0x35, 0x4a, 0xa8, 0xb2, 0x2b, 0x3b, - 0x5b, 0x91, 0xfa, 0x14, 0xb5, 0x24, 0xdb, 0xd3, 0xc5, 0x3e, 0x38, 0x2f, - 0xfe, 0x3f, 0xf5, 0xea, 0xaf, 0x7c, 0xfb, 0xde, 0x79, 0xd2, 0xc6, 0xc4, - 0x2b, 0xa0, 0x8c, 0x00, 0x77, 0x3a, 0xf1, 0xb6, 0xc9, 0x2c, 0x61, 0x6e, - 0x24, 0xfc, 0xcf, 0x4f, 0xfc, 0x7c, 0x1a, 0xe1, 0x50, 0xb9, 0x2c, 0xb3, - 0xf8, 0xe9, 0x1f, 0xbf, 0xba, 0xdf, 0x13, 0xec, 0x3a, 0x5c, 0x4b, 0x70, - 0xda, 0x82, 0x14, 0xca, 0x7d, 0x00, 0x81, 0x7c, 0x8d, 0x11, 0x7b, 0xf3, - 0xb6, 0x9d, 0x33, 0x38, 0xa5, 0x75, 0xff, 0xcd, 0x9c, 0x24, 0x09, 0xca, - 0x9e, 0xb1, 0x66, 0x6e, 0xcc, 0x86, 0xaa, 0x2d, 0x06, 0x47, 0x70, 0xd6, - 0xf4, 0x80, 0x9e, 0x26, 0xd4, 0x1a, 0x8a, 0xea, 0xee, 0x8a, 0x3f, 0x33, - 0xc0, 0x87, 0xe8, 0x2e, 0x3a, 0x7c, 0xf9, 0x2d, 0x64, 0xb0, 0x03, 0x83, - 0x9a, 0x85, 0x72, 0x52, 0x1b, 0x61, 0x47, 0x70, 0x25, 0xab, 0x4a, 0xc1, - 0xc5, 0x04, 0xf1, 0x3a, 0x48, 0x44, 0x09, 0x63, 0x22, 0x7e, 0x5f, 0x1d, - 0xab, 0xf0, 0xd0, 0x9b, 0x35, 0xf9, 0x52, 0x89, 0xf3, 0x16, 0xb7, 0x63, - 0xb7, 0xca, 0x0d, 0x9f, 0x82, 0xc0, 0x71, 0xca, 0xaa, 0x79, 0x16, 0x0f, - 0x64, 0xea, 0xd3, 0x29, 0xf8, 0xa4, 0x98, 0x46, 0xa3, 0x19, 0xb8, 0x15, - 0x3d, 0x54, 0x4c, 0x67, 0x14, 0x5c, 0xb0, 0xcf, 0x38, 0x19, 0x7d, 0x32, - 0xcc, 0x36, 0x5e, 0x3d, 0x0a, 0x05, 0xfc, 0xb3, 0x59, 0x25, 0x03, 0xbe, - 0x0a, 0xf8, 0x89, 0x7f, 0x56, 0x3f, 0xdb, 0xf0, 0x0f, 0x92, 0x61, 0x0c, - 0x17, 0x1f, 0xf3, 0xae, 0x5d, 0x07, 0x54, 0xa3, 0x5a, 0x05, 0x0e, 0x8c, - 0x79, 0xe6, 0x60, 0xda, 0xd7, 0xab, 0xa5, 0xfe, 0x1b, 0x48, 0xa9, 0x30, - 0xf9, 0x18, 0x9c, 0x48, 0xbb, 0x93, 0x9a, 0x29, 0x29, 0x83, 0x8a, 0xa1, - 0x0c, 0x88, 0xb4, 0x24, 0xef, 0x0f, 0xe7, 0xd4, 0x60, 0xa9, 0xed, 0x71, - 0x4d, 0x6e, 0x43, 0x1f, 0x06, 0xc2, 0x72, 0x09, 0x03, 0x8d, 0x40, 0xcc, - 0x5b, 0xc3, 0x2c, 0x14, 0x72, 0xe5, 0x32, 0x68, 0xbd, 0x78, 0xcb, 0x3f, - 0xe0, 0x91, 0x69, 0x63, 0xb0, 0xc3, 0x8f, 0xec, 0x90, 0xae, 0xd1, 0xbb, - 0x92, 0x1f, 0x84, 0xf9, 0x0b, 0x13, 0xf9, 0xe9, 0x1f, 0x79, 0xff, 0x2c, - 0xd1, 0x39, 0xb7, 0x3b, 0x30, 0xa2, 0x20, 0xee, 0x7a, 0x50, 0x0f, 0xea, - 0xcd, 0x95, 0x53, 0xb5, 0x87, 0xd9, 0xab, 0x25, 0xbb, 0xc2, 0x04, 0xdb, - 0x76, 0x62, 0x84, 0x81, 0x69, 0xbc, 0x36, 0x75, 0xfc, 0x86, 0xa1, 0x4f, - 0x45, 0x2a, 0x23, 0xc2, 0x17, 0x27, 0x9c, 0xab, 0x3c, 0xe3, 0x9d, 0xa1, - 0x68, 0x80, 0x9c, 0x5b, 0xb1, 0x40, 0x2f, 0xc2, 0x28, 0x5c, 0x16, 0xab, - 0x3c, 0x68, 0x44, 0x1b, 0xe7, 0x83, 0x2e, 0x01, 0xbe, 0x00, 0x3a, 0xe2, - 0xbb, 0x64, 0x3a, 0x13, 0xae, 0x43, 0x1c, 0x79, 0x2c, 0x59, 0xfa, 0x30, - 0xb1, 0x0a, 0xf6, 0xf8, 0xf0, 0x24, 0x2d, 0x1c, 0x9c, 0xf6, 0xe7, 0x0f, - 0x60, 0x87, 0x9d, 0xa3, 0x68, 0x83, 0x93, 0xcc, 0x2f, 0xcb, 0xcf, 0xae, - 0x43, 0x50, 0x8a, 0x5a, 0x91, 0x0c, 0xfc, 0xdc, 0x9f, 0x1a, 0x9e, 0x11, - 0xc2, 0x6e, 0x2b, 0xb0, 0x0e, 0x10, 0xc2, 0x9b, 0x97, 0x8f, 0x81, 0xf1, - 0x58, 0x72, 0x3d, 0xf8, 0xc0, 0xf9, 0x7b, 0x89, 0x25, 0xdb, 0x29, 0x3a, - 0x25, 0xeb, 0xba, 0x0f, 0xb7, 0x6c, 0x56, 0xbc, 0x78, 0x7f, 0x7c, 0x43, - 0x0b, 0x1b, 0x8d, 0x76, 0xb3, 0x0c, 0x9e, 0x15, 0xae, 0xae, 0x3f, 0xcb, - 0x3b, 0x1b, 0x25, 0x48, 0xb7, 0x15, 0xca, 0x22, 0x53, 0x24, 0xd9, 0xed, - 0x0e, 0x1f, 0x21, 0x76, 0x2b, 0x59, 0xde, 0x5e, 0xf6, 0x0f, 0xdf, 0x2d, - 0x34, 0x84, 0x30, 0x70, 0x51, 0xf5, 0xb0, 0x03, 0x11, 0xcd, 0xda, 0x20, - 0xdc, 0xa6, 0x34, 0xab, 0x0e, 0xa7, 0x31, 0x1e, 0x21, 0xf4, 0x46, 0x00, - 0x98, 0x09, 0xad, 0xb8, 0xfb, 0xe4, 0x22, 0x7a, 0x8b, 0xdb, 0xd6, 0x7e, - 0x0d, 0x5a, 0x6d, 0x4f, 0x8b, 0x79, 0x71, 0x9e, 0xac, 0x6d, 0x98, 0x42, - 0xc6, 0xf3, 0x25, 0xf1, 0xb8, 0x3f, 0x07, 0xca, 0x01, 0x9e, 0xc5, 0x71, - 0xae, 0xf5, 0x7e, 0xdb, 0xbc, 0x43, 0xc9, 0x05, 0xe6, 0xe6, 0x53, 0xbf, - 0x7d, 0x14, 0x30, 0xce, 0xf9, 0xaf, 0x51, 0xdf, 0xb6, 0xce, 0x6e, 0x91, - 0x3f, 0x4b, 0xae, 0x8f, 0x74, 0xdf, 0x4a, 0xe3, 0x77, 0x07, 0x0b, 0x3a, - 0x13, 0xa8, 0x08, 0xce, 0x2f, 0xb6, 0xf7, 0xeb, 0x7b, 0xad, 0x22, 0x37, - 0x6f, 0xbb, 0x27, 0xbd, 0xa1, 0xad, 0x03, 0x05, 0xcc, 0xb2, 0x36, 0xe2, - 0x4c, 0x2e, 0x84, 0xb6, 0x70, 0xef, 0x56, 0xa5, 0x7e, 0x3c, 0xc8, 0x47, - 0x04, 0x01, 0x9c, 0xac, 0xc9, 0x22, 0xb1, 0x32, 0x07, 0x52, 0x5d, 0xe1, - 0x9b, 0xbe, 0xfd, 0xc7, 0xf8, 0x86, 0x6c, 0x94, 0xdc, 0x73, 0xd1, 0x9c, - 0xf2, 0x00, 0x76, 0xe6, 0xde, 0x10, 0x9b, 0xda, 0x03, 0x73, 0x58, 0xec, - 0x79, 0x64, 0xac, 0x43, 0xc5, 0x7e, 0xf9, 0x2c, 0x5f, 0xb0, 0xe7, 0xb5, - 0x1b, 0x01, 0x1f, 0xb9, 0xa5, 0xf8, 0xc3, 0xeb, 0x4a, 0x56, 0x1f, 0x4c, - 0xa0, 0x2b, 0xe3, 0x2c, 0xe0, 0x30, 0xef, 0x7f, 0xdf, 0x8b, 0x37, 0x0f, - 0xfa, 0x22, 0x7a, 0x0b, 0xbc, 0xf7, 0xb0, 0x38, 0xfb, 0x75, 0x92, 0xf0, - 0xc7, 0x8d, 0x68, 0xce, 0x6e, 0x6d, 0x3c, 0x20, 0x14, 0x95, 0x90, 0xd6, - 0x5f, 0x2b, 0xeb, 0xcf, 0x1a, 0x53, 0xc5, 0xfe, 0xaa, 0xc5, 0xf2, 0x67, - 0xaf, 0x95, 0xb0, 0x5f, 0xaf, 0x1e, 0xf6, 0xe5, 0x13, 0xb7, 0xcb, 0xd1, - 0x5a, 0xe8, 0x52, 0x54, 0xaa, 0x51, 0x67, 0x6f, 0x53, 0x76, 0x08, 0x79, - 0x1c, 0xb1, 0xba, 0xd7, 0x51, 0x84, 0x31, 0x16, 0x68, 0xcb, 0x31, 0x41, - 0x40, 0x15, 0x3e, 0xe3, 0x64, 0x02, 0xc6, 0x99, 0xa9, 0xc9, 0xb1, 0xc7, - 0x0b, 0x62, 0x03, 0xda, 0x7c, 0xc0, 0xbb, 0xcd, 0x4a, 0x69, 0x9f, 0x98, - 0xc1, 0xcc, 0x23, 0x8e, 0x68, 0x48, 0x93, 0xad, 0xab, 0x31, 0xa0, 0xfc, - 0x7c, 0x61, 0x3e, 0x65, 0x6e, 0xf8, 0x1b, 0x5a, 0x54, 0x7b, 0x8f, 0xc7, - 0x32, 0x5f, 0x27, 0xdc, 0xe2, 0x39, 0x17, 0xf8, 0x64, 0x66, 0xbc, 0x23, - 0x1c, 0xe1, 0x67, 0x61, 0x13, 0xcc, 0x84, 0x62, 0x53, 0x72, 0xec, 0x25, - 0x82, 0x70, 0x00, 0xc8, 0xb4, 0x0f, 0xc0, 0x83, 0xe5, 0xb5, 0xca, 0x18, - 0x8a, 0x03, 0xce, 0xc8, 0x46, 0x4a, 0xfa, 0xca, 0xb8, 0xbb, 0x08, 0x5a, - 0xab, 0xde, 0x40, 0xbb, 0xd7, 0x61, 0x2f, 0x97, 0x49, 0xcc, 0xd7, 0xd0, - 0x73, 0xdb, 0x86, 0xc3, 0xe2, 0x04, 0x15, 0x6e, 0x24, 0x00, 0x44, 0x0b, - 0x7e, 0xcf, 0x22, 0x85, 0xcb, 0xec, 0x8f, 0xd3, 0x42, 0x7b, 0x39, 0x69, - 0x12, 0x71, 0x93, 0xe8, 0xa8, 0xee, 0xdc, 0x96, 0x84, 0x51, 0x67, 0x9d, - 0xb5, 0xfc, 0x19, 0xd8, 0x99, 0xdd, 0x20, 0x81, 0xe3, 0x12, 0x55, 0xa5, - 0x9b, 0x72, 0x1d, 0xa5, 0xec, 0xef, 0x2c, 0xf0, 0x6b, 0x1f, 0xaa, 0xeb, - 0x2c, 0xff, 0x8d, 0x27, 0xc2, 0x14, 0x24, 0x97, 0xc6, 0x03, 0xdd, 0x53, - 0xc5, 0x38, 0x41, 0xef, 0xbc, 0xae, 0xe7, 0xb0, 0x03, 0x73, 0x49, 0x02, - 0x71, 0xeb, 0x54, 0xfd, 0x90, 0x8d, 0xf9, 0x10, 0xf6, 0xae, 0x7a, 0x1d, - 0xd5, 0xbc, 0x88, 0x08, 0xf3, 0xc1, 0x38, 0xd4, 0x87, 0xc9, 0x4b, 0x67, - 0x5d, 0x4e, 0xc9, 0xdd, 0x0a, 0x8f, 0x03, 0xf1, 0x96, 0xb1, 0x89, 0xe1, - 0x63, 0x5e, 0xa9, 0xa6, 0x19, 0xc3, 0x10, 0x90, 0x26, 0xb2, 0x89, 0x3d, - 0xa0, 0x20, 0x2a, 0x8e, 0x5d, 0xa2, 0xc2, 0xee, 0x4e, 0xe4, 0xf3, 0x5d, - 0x7d, 0xf3, 0x2c, 0x62, 0xb1, 0x25, 0x4d, 0xb4, 0xaf, 0x21, 0x84, 0x5a, - 0x53, 0xd4, 0xe9, 0x5d, 0x34, 0xa6, 0x49, 0x7e, 0xe5, 0x2f, 0x4c, 0x04, - 0x90, 0x3b, 0x34, 0x08, 0x12, 0x62, 0x11, 0x27, 0x92, 0x14, 0x9f, 0x6c, - 0x34, 0x25, 0x0a, 0x43, 0x41, 0x9a, 0x44, 0x01, 0xa9, 0x91, 0x9b, 0xf5, - 0x02, 0xb2, 0x6e, 0xc9, 0x06, 0x1d, 0xb7, 0x95, 0xf0, 0xa5, 0x84, 0xcb, - 0x9b, 0x50, 0xec, 0x55, 0x99, 0x18, 0x1f, 0x29, 0xe8, 0xf0, 0xae, 0xca, - 0x0c, 0xd9, 0x25, 0xbd, 0xa8, 0x96, 0x23, 0xa0, 0x69, 0xbf, 0xad, 0x64, - 0x38, 0xbb, 0x2c, 0x1a, 0x4c, 0x1c, 0xc2, 0xda, 0xb8, 0xec, 0x34, 0x0d, - 0xca, 0x8f, 0xba, 0xfe, 0x2f, 0x74, 0xc8, 0x3a, 0x7d, 0x96, 0xb0, 0xdf, - 0x9a, 0xce, 0xc3, 0xde, 0xcd, 0xbc, 0x7b, 0x34, 0x77, 0xf5, 0x53, 0xb9, - 0xc8, 0x05, 0x0e, 0x0e, 0x0b, 0xb8, 0x61, 0x81, 0x01, 0x06, 0xc9, 0x07, - 0x48, 0x29, 0x55, 0x07, 0xa1, 0x79, 0x1c, 0x55, 0x69, 0xf2, 0x12, 0x10, - 0x9e, 0xfd, 0x9a, 0x3d, 0x04, 0x4a, 0x3f, 0x3d, 0x58, 0xe3, 0xc9, 0x24, - 0x47, 0x05, 0xeb, 0xa0, 0x5d, 0x3d, 0x87, 0x2d, 0x9f, 0x89, 0x6f, 0x62, - 0xa5, 0x52, 0xea, 0x6c, 0x6f, 0xdd, 0x88, 0xef, 0xa4, 0x13, 0x62, 0xd3, - 0x34, 0x69, 0x02, 0xc5, 0x1d, 0x93, 0x0b, 0xa1, 0x77, 0x25, 0x73, 0x19, - 0x18, 0xd3, 0xd6, 0x97, 0xe8, 0x4d, 0xd1, 0xde, 0x6b, 0xdd, 0xa3, 0xfe, - 0xb4, 0x18, 0xaa, 0x4f, 0x49, 0x9d, 0x0b, 0xa6, 0x2e, 0x25, 0xc8, 0xac, - 0x21, 0x90, 0x3f, 0xf1, 0xe3, 0xfe, 0x6c, 0x07, 0x1e, 0x15, 0x21, 0x57, - 0xc0, 0x38, 0xa4, 0x95, 0xf6, 0xa6, 0x0d, 0xc7, 0x2e, 0x4f, 0x25, 0xd4, - 0x0d, 0x85, 0x49, 0x58, 0xb9, 0x84, 0x3f, 0xa9, 0xe7, 0xd9, 0xa0, 0xd0, - 0x33, 0xd1, 0xfa, 0xdd, 0x3e, 0xbe, 0x7a, 0x0f, 0x1d, 0x13, 0x23, 0xa2, - 0x57, 0x4d, 0x68, 0x75, 0xb8, 0xcd, 0x58, 0x22, 0xef, 0x66, 0x01, 0x96, - 0xf4, 0x88, 0xfd, 0xb2, 0x27, 0x14, 0xf8, 0x34, 0xfe, 0x68, 0x81, 0x36, - 0xbc, 0xfa, 0x62, 0x65, 0x8d, 0x47, 0xe9, 0x45, 0xf1, 0xdd, 0x7c, 0x3c, - 0xda, 0xa1, 0x4c, 0xa1, 0xc9, 0x70, 0x64, 0xf4, 0x10, 0x34, 0x74, 0x00, - 0x74, 0x95, 0xe7, 0x21, 0xb8, 0xdd, 0x91, 0xd0, 0x09, 0x06, 0xec, 0xdf, - 0x0a, 0x09, 0x97, 0x5e, 0x67, 0x98, 0xc4, 0xa2, 0xef, 0x18, 0xc9, 0x0a, - 0x71, 0x49, 0xe3, 0x61, 0x19, 0x2c, 0xe9, 0x66, 0x98, 0xb4, 0x98, 0x59, - 0x11, 0x71, 0x51, 0xe7, 0x8b, 0xea, 0xdd, 0xdb, 0xea, 0x0d, 0x47, 0xe3, - 0x4a, 0xfb, 0xe7, 0xa4, 0x16, 0x03, 0x98, 0x2b, 0xed, 0x26, 0x5e, 0xa3, - 0xab, 0x35, 0x0d, 0x16, 0xfd, 0xa3, 0xf5, 0xa9, 0x64, 0xaa, 0x6f, 0x19, - 0xa5, 0x63, 0x2b, 0xf4, 0x47, 0x81, 0x43, 0xb8, 0x6d, 0xf4, 0x43, 0xaf, - 0xc5, 0xaa, 0x5b, 0x96, 0x7b, 0x91, 0xcf, 0x10, 0x5b, 0x5a, 0x47, 0x3b, - 0x4d, 0xec, 0x50, 0xd5, 0xfd, 0x14, 0x05, 0x7c, 0x65, 0x10, 0x13, 0x64, - 0xe0, 0xed, 0x4e, 0x41, 0x5d, 0xab, 0xe3, 0x0b, 0xf6, 0x1c, 0xd0, 0xf9, - 0x28, 0x64, 0x1c, 0xf9, 0x91, 0x07, 0x1a, 0xc1, 0xb7, 0xa1, 0xac, 0xc3, - 0x05, 0x0d, 0xe2, 0x75, 0xcf, 0x67, 0x26, 0x56, 0x98, 0xf9, 0xdd, 0xc9, - 0xbb, 0x3d, 0xf3, 0x4e, 0xf6, 0x64, 0x47, 0xea, 0xf5, 0xe0, 0xe9, 0xd5, - 0x0f, 0xf5, 0x80, 0x8f, 0x2b, 0xb8, 0x1e, 0x35, 0x1c, 0x2f, 0x7f, 0x63, - 0x40, 0x36, 0xa2, 0x9a, 0x03, 0x23, 0xae, 0xfd, 0xbe, 0xf3, 0xb1, 0x24, - 0x02, 0x10, 0x40, 0x4c, 0x10, 0xf2, 0x1f, 0xbb, 0xc1, 0xca, 0xc7, 0x98, - 0xaa, 0xf2, 0x44, 0xfc, 0x44, 0x52, 0xce, 0xae, 0xeb, 0x14, 0x82, 0x3a, - 0x10, 0x6a, 0x5e, 0x4a, 0x80, 0x38, 0xb4, 0xf4, 0x2b, 0x14, 0x89, 0xab, - 0xd8, 0xc6, 0x42, 0x3d, 0x64, 0x15, 0x4b, 0xd5, 0xd5, 0x78, 0x9f, 0x2f, - 0x89, 0xaa, 0x1f, 0x1e, 0x5d, 0x82, 0x58, 0xaf, 0x50, 0xa7, 0xfa, 0xb3, - 0x24, 0x7e, 0xd2, 0x88, 0x1f, 0xf9, 0x58, 0xdc, 0xb4, 0x84, 0x46, 0xb1, - 0xf4, 0xf2, 0x72, 0xf4, 0x3f, 0xa2, 0xfb, 0x58, 0x70, 0x62, 0x42, 0xf8, - 0xb1, 0xa6, 0xce, 0x7e, 0xf2, 0x35, 0x06, 0x51, 0xc6, 0x73, 0x2f, 0x25, - 0x8d, 0x59, 0x96, 0xc0, 0xff, 0xeb, 0x75, 0x5f, 0xb8, 0x2b, 0x63, 0x8e, - 0xb9, 0x06, 0x28, 0x1f, 0x83, 0x60, 0x09, 0x44, 0x4b, 0xf7, 0x34, 0xa7, - 0xfa, 0x7e, 0x06, 0xb5, 0xf9, 0x39, 0xca, 0x1f, 0xb4, 0xf8, 0x1a, 0x31, - 0xbb, 0xa6, 0xee, 0x38, 0xd6, 0x1b, 0x0c, 0xbe, 0x19, 0xc1, 0x11, 0xc4, - 0xd7, 0xce, 0x5f, 0x76, 0x81, 0x59, 0xed, 0xde, 0x95, 0x2f, 0xb7, 0xce, - 0x06, 0x21, 0x19, 0x53, 0xea, 0x0c, 0x8a, 0x22, 0xae, 0xf0, 0x0a, 0xdf, - 0x47, 0xba, 0xc6, 0x90, 0x25, 0x72, 0x2c, 0xae, 0x63, 0xd8, 0x13, 0x1d, - 0xbe, 0xdb, 0x92, 0x8d, 0x6a, 0x68, 0xa8, 0x7b, 0x35, 0x15, 0xae, 0x75, - 0xac, 0x4b, 0x8c, 0x13, 0x3a, 0x0a, 0x6b, 0x95, 0x4b, 0xdc, 0x0d, 0xef, - 0x5b, 0x74, 0x1a, 0x92, 0xe5, 0xdd, 0xbb, 0x13, 0x31, 0x8b, 0x04, 0x8e, - 0xd2, 0xfd, 0x34, 0x95, 0xff, 0xcd, 0xc6, 0xca, 0x41, 0x82, 0x2f, 0x8e, - 0x5a, 0xa5, 0x78, 0x57, 0x95, 0x68, 0x15, 0x28, 0x40, 0x30, 0x89, 0xcc, - 0x4e, 0x69, 0xe5, 0xb7, 0x2d, 0xd8, 0x2f, 0x4a, 0x97, 0xb6, 0x47, 0x43, - 0x96, 0x34, 0x77, 0xda, 0xf5, 0x1a, 0x71, 0x6b, 0x20, 0x69, 0x16, 0x04, - 0x5d, 0x2d, 0xcb, 0x5b, 0xb1, 0x29, 0x73, 0x82, 0x4a, 0x73, 0x5e, 0xad, - 0x65, 0x1b, 0x9e, 0x6d, 0x47, 0xd2, 0xd8, 0xbb, 0x5f, 0x47, 0x5f, 0x79, - 0x22, 0xc1, 0x10, 0xd2, 0x0c, 0x60, 0xc9, 0xc2, 0x22, 0xfb, 0xaf, 0x14, - 0xa8, 0x4d, 0x86, 0x8a, 0x40, 0x69, 0xbc, 0x50, 0x59, 0x3c, 0x4c, 0x51, - 0x45, 0xae, 0x32, 0x03, 0xeb, 0x79, 0x61, 0x3d, 0x02, 0x4f, 0xaa, 0x89, - 0x84, 0x1b, 0x77, 0x7d, 0xea, 0xf9, 0xa0, 0x4c, 0x06, 0x64, 0xc1, 0x73, - 0x7d, 0xbd, 0x88, 0x22, 0xc2, 0x3e, 0x50, 0x96, 0x4a, 0x6a, 0xbd, 0xe2, - 0x24, 0x35, 0x37, 0x11, 0x32, 0x3e, 0x23, 0x4d, 0x23, 0xe1, 0xe1, 0x36, - 0x84, 0x25, 0xfc, 0x28, 0x6c, 0x93, 0x11, 0xe0, 0x1d, 0x37, 0xe2, 0x80, - 0xa3, 0x4c, 0xf6, 0x30, 0x98, 0x44, 0x31, 0xa9, 0x32, 0x98, 0x49, 0x26, - 0x2f, 0x72, 0x63, 0x7b, 0x21, 0x88, 0x2b, 0x3c, 0x1b, 0x61, 0x9d, 0xd1, - 0x4b, 0x23, 0xbc, 0x8c, 0xe7, 0xc7, 0x0c, 0xda, 0xf4, 0xc2, 0x25, 0xcc, - 0xd7, 0xae, 0xc5, 0x24, 0x6a, 0xdf, 0x94, 0x28, 0x3d, 0x68, 0xd5, 0x95, - 0x4b, 0xf7, 0xd9, 0x3b, 0xf7, 0x5e, 0x55, 0xbc, 0xf7, 0xf9, 0xf0, 0xa5, - 0xca, 0xb8, 0xe2, 0x4e, 0x37, 0xa5, 0xc6, 0xa1, 0x46, 0xce, 0x74, 0xa8, - 0xab, 0x84, 0x43, 0x29, 0x85, 0x8c, 0x45, 0xb2, 0x70, 0xbe, 0xf8, 0xea, - 0xeb, 0x21, 0xf0, 0xf8, 0xb4, 0x22, 0x01, 0x51, 0x46, 0x20, 0x34, 0xb2, - 0xdf, 0xc1, 0xa6, 0x0c, 0x65, 0xbb, 0x77, 0x37, 0xce, 0x87, 0xf6, 0xae, - 0x73, 0x94, 0x0a, 0xf9, 0x13, 0x0b, 0x15, 0x96, 0xca, 0xed, 0xe7, 0x7a, - 0x6c, 0xea, 0x91, 0x94, 0x61, 0xec, 0x4e, 0xd6, 0x57, 0xe4, 0x38, 0x11, - 0xff, 0x88, 0xff, 0x2c, 0xdb, 0x00, 0x17, 0x08, 0x5f, 0x76, 0x6f, 0x3a, - 0x30, 0x1f, 0xc0, 0x9b, 0xd5, 0xd0, 0xb1, 0x24, 0x4c, 0x63, 0x2b, 0xef, - 0xfa, 0x37, 0x36, 0x51, 0xca, 0x77, 0xcd, 0x8a, 0xdc, 0x04, 0xa9, 0x43, - 0x6b, 0xe9, 0x8d, 0x99, 0xe3, 0xaa, 0x2a, 0xfa, 0x7f, 0x14, 0x58, 0xa6, - 0xe7, 0x76, 0x91, 0x7a, 0x09, 0x6b, 0xb5, 0x87, 0x55, 0xee, 0xdb, 0x2e, - 0xc0, 0x0e, 0x47, 0xda, 0xfd, 0x50, 0x25, 0xc3, 0xe3, 0xca, 0x3c, 0x89, - 0xe2, 0xf9, 0x18, 0xb5, 0x6b, 0xe5, 0xa7, 0xa8, 0xd9, 0x4f, 0x88, 0x4a, - 0xfe, 0x66, 0xe7, 0x6a, 0xc9, 0x24, 0xe6, 0x32, 0x11, 0xa6, 0xac, 0x32, - 0x75, 0x37, 0x4e, 0x69, 0x9b, 0xc2, 0x8a, 0x99, 0x51, 0x97, 0x79, 0x12, - 0x15, 0xe3, 0x7d, 0x3d, 0xb1, 0x89, 0x63, 0x6d, 0x69, 0x79, 0x03, 0xcf, - 0x5d, 0x5a, 0x6b, 0xb1, 0xc3, 0xdc, 0xa3, 0x98, 0x42, 0xac, 0x75, 0x11, - 0xb4, 0xfd, 0xc5, 0xea, 0x8e, 0x92, 0xb0, 0xc7, 0x73, 0xc8, 0x6d, 0xf5, - 0xee, 0xda, 0x99, 0xed, 0x21, 0xbc, 0x24, 0x0c, 0x2b, 0x9a, 0xf8, 0x88, - 0x9c, 0x8c, 0x59, 0xd7, 0x29, 0x76, 0xea, 0x44, 0x72, 0xcb, 0x5a, 0x27, - 0x4f, 0x16, 0x03, 0x80, 0x6a, 0x6b, 0xf5, 0xfd, 0x19, 0x17, 0x79, 0xe8, - 0xeb, 0x98, 0xf0, 0xf4, 0xce, 0x2d, 0xf8, 0xfc, 0xad, 0x67, 0x3e, 0xf2, - 0x50, 0x6d, 0x02, 0x74, 0xa9, 0x70, 0x92, 0x41, 0x12, 0x23, 0xbf, 0xeb, - 0xfc, 0x15, 0x4e, 0x1a, 0x54, 0x9c, 0x25, 0xef, 0x33, 0xd7, 0x7c, 0xd9, - 0x81, 0xdf, 0xf2, 0x91, 0xd1, 0xef, 0xb3, 0x3c, 0xed, 0xb3, 0xf7, 0x37, - 0x4c, 0xcd, 0x1f, 0x1d, 0xdb, 0xfb, 0x56, 0x37, 0x9e, 0x61, 0x62, 0x79, - 0xe2, 0x92, 0xe1, 0xb8, 0x77, 0x20, 0xb8, 0x97, 0xd5, 0xb3, 0xb0, 0x3d, - 0x2d, 0x6d, 0x91, 0x4b, 0x3e, 0x35, 0x26, 0x47, 0xed, 0x90, 0x74, 0xee, - 0xcc, 0x2e, 0xe9, 0x96, 0x03, 0x37, 0xaf, 0x56, 0xd0, 0x7c, 0x2e, 0x93, - 0x4a, 0x8f, 0xca, 0x5b, 0x32, 0xbc, 0xb7, 0xf5, 0xe1, 0x8f, 0x3f, 0xda, - 0x13, 0xc4, 0xa4, 0xa3, 0x29, 0x06, 0xf8, 0x14, 0xb5, 0xf2, 0x56, 0x70, - 0xfe, 0x16, 0x97, 0xd5, 0x75, 0x2e, 0xa2, 0x55, 0xed, 0xc4, 0xa0, 0x0f, - 0xeb, 0x0a, 0xe5, 0xb4, 0x81, 0x5b, 0x4b, 0x14, 0xfd, 0x2a, 0x72, 0x83, - 0xff, 0x24, 0x10, 0x00, 0xe6, 0x90, 0x3a, 0xc6, 0x90, 0xb2, 0xdf, 0x9b, - 0xda, 0x4a, 0xef, 0xc5, 0x38, 0xf9, 0x6d, 0x30, 0x1b, 0xa3, 0xed, 0xec, - 0x78, 0x0b, 0xe0, 0x35, 0x82, 0x29, 0x97, 0x04, 0x78, 0x29, 0x35, 0xed, - 0x62, 0xc0, 0xd5, 0x28, 0x55, 0x4f, 0xea, 0xf5, 0x18, 0xc6, 0x13, 0x31, - 0xef, 0x77, 0x7f, 0x64, 0x31, 0x63, 0xa9, 0x50, 0xf4, 0x90, 0xb7, 0xea, - 0xe6, 0xba, 0x2b, 0x0a, 0x21, 0x81, 0xf7, 0xd7, 0x09, 0x4a, 0x05, 0x68, - 0x84, 0xd3, 0xa0, 0x38, 0x62, 0xd8, 0x2a, 0xb1, 0xcf, 0x36, 0xeb, 0xc4, - 0x8e, 0xcd, 0x98, 0x7d, 0x41, 0x00, 0x2b, 0xfe, 0x80, 0x59, 0x98, 0x6c, - 0x8a, 0x7e, 0x5b, 0x49, 0x70, 0xa6, 0xff, 0x09, 0x98, 0xbb, 0xfb, 0xd3, - 0xf2, 0x77, 0x8e, 0x25, 0xff, 0x96, 0xc7, 0xf8, 0x9c, 0x4a, 0x7d, 0xa3, - 0x98, 0xd8, 0x30, 0x75, 0x20, 0x05, 0x4a, 0x6d, 0x33, 0xa3, 0x10, 0xa6, - 0x7b, 0x52, 0x4e, 0x3f, 0xb5, 0x78, 0xda, 0xce, 0x2d, 0x56, 0xb2, 0xfc, - 0xd2, 0xd0, 0x9a, 0x9c, 0x8d, 0xde, 0x42, 0xa4, 0x54, 0xba, 0xe8, 0xa3, - 0x4d, 0x6a, 0xe6, 0xb7, 0x27, 0xe8, 0xac, 0x2e, 0x6f, 0x96, 0x02, 0x82, - 0x81, 0xfb, 0x11, 0x47, 0x50, 0x3a, 0x8f, 0xa3, 0x92, 0x99, 0xf8, 0x51, - 0xd1, 0xa9, 0x4d, 0x3a, 0x45, 0xbf, 0x95, 0xdd, 0xda, 0xcf, 0x18, 0x2d, - 0xba, 0xf8, 0x68, 0xcc, 0x00, 0x28, 0xc4, 0x54, 0xe3, 0x01, 0xa0, 0x47, - 0x64, 0x6e, 0x3d, 0xf0, 0x4a, 0xb6, 0x27, 0x0c, 0xbd, 0x95, 0xba, 0x40, - 0xc4, 0x49, 0x92, 0xaf, 0xdb, 0x04, 0x67, 0x1a, 0x5b, 0x80, 0x50, 0x09, - 0xed, 0xf0, 0xfa, 0x45, 0xa2, 0xa7, 0xa1, 0xc0, 0x98, 0x80, 0xd0, 0x79, - 0x05, 0xc3, 0x78, 0x24, 0x12, 0xe0, 0x8c, 0x08, 0x7c, 0x99, 0x6b, 0xaf, - 0xdf, 0x04, 0x1f, 0x2f, 0x24, 0x0f, 0x4c, 0x74, 0x88, 0x42, 0x66, 0x1b, - 0xab, 0x8f, 0xa6, 0x8b, 0x8c, 0x92, 0x27, 0x47, 0x24, 0x20, 0x9b, 0x8a, - 0x2b, 0x98, 0x16, 0x6a, 0xd2, 0x38, 0x5c, 0xe6, 0x6c, 0x92, 0x61, 0x41, - 0x26, 0xe8, 0xc8, 0xef, 0x74, 0x60, 0x55, 0x80, 0x04, 0x90, 0xcc, 0x87, - 0x03, 0xd0, 0xc8, 0xe4, 0xd3, 0x90, 0x2e, 0xbe, 0x5b, 0x64, 0x76, 0x47, - 0x0c, 0x0c, 0xd1, 0xf9, 0x90, 0x59, 0xf7, 0x8d, 0x5a, 0xa5, 0x3d, 0x9e, - 0x4f, 0x34, 0xcc, 0xe1, 0xbc, 0x8f, 0xde, 0xaa, 0x2e, 0x1d, 0x07, 0x32, - 0xb5, 0xf8, 0xfc, 0x8d, 0x20, 0x6e, 0x23, 0xbb, 0x91, 0x62, 0x69, 0x26, - 0xbb, 0x7e, 0x76, 0xef, 0x3e, 0x89, 0xd7, 0xaf, 0x11, 0xf5, 0x7a, 0x56, - 0x42, 0xbe, 0x66, 0xd4, 0xa6, 0xca, 0x05, 0xfc, 0x78, 0x2c, 0x3a, 0x46, - 0x96, 0xf3, 0xe9, 0x2d, 0x0c, 0x16, 0x85, 0x59, 0x56, 0xba, 0x0f, 0x2a, - 0xfb, 0xf5, 0xea, 0xc6, 0x21, 0x60, 0xb2, 0x70, 0xd7, 0x06, 0x12, 0xd6, - 0x12, 0xcf, 0xf0, 0xe1, 0xe6, 0xdf, 0x76, 0x9c, 0xb6, 0x39, 0xdb, 0xcd, - 0x17, 0x5b, 0x47, 0x96, 0x3e, 0x44, 0xc8, 0x87, 0x4f, 0x00, 0xd1, 0xa3, - 0xa7, 0x75, 0xf3, 0xf1, 0x0a, 0x38, 0xee, 0xf4, 0xf6, 0xa3, 0xbb, 0xfa, - 0x47, 0x13, 0x20, 0x12, 0x7a, 0x5b, 0x11, 0x78, 0xef, 0xf1, 0xe0, 0xed, - 0x47, 0x2e, 0x4b, 0x05, 0xe7, 0xa9, 0x4d, 0x2d, 0xb9, 0xfd, 0x04, 0xdf, - 0xe2, 0xcf, 0x25, 0xf5, 0x01, 0x20, 0x06, 0x4e, 0x3a, 0x16, 0x89, 0x96, - 0xec, 0xac, 0xb1, 0xf5, 0x22, 0xf8, 0x81, 0x5b, 0xc1, 0x92, 0x2d, 0xdb, - 0xb8, 0x4a, 0x29, 0x6e, 0xd3, 0x2e, 0x64, 0x30, 0x30, 0x81, 0x20, 0xd3, - 0x6d, 0x7c, 0x01, 0x79, 0x96, 0xa0, 0xd7, 0x6e, 0x4e, 0xb8, 0x00, 0x90, - 0x4a, 0xac, 0x3f, 0xd2, 0x96, 0x97, 0xa1, 0xdd, 0xd3, 0x1c, 0xa2, 0xd0, - 0x96, 0x37, 0x90, 0x99, 0x4d, 0xed, 0xde, 0x65, 0x13, 0x0d, 0x7b, 0xfe, - 0x7d, 0x31, 0xc9, 0x06, 0xec, 0x93, 0xd4, 0xb9, 0x8f, 0x95, 0x57, 0x6c, - 0xa7, 0x9c, 0xac, 0xb1, 0x49, 0xcf, 0x8c, 0xe7, 0x52, 0x87, 0x68, 0x9c, - 0x2d, 0x41, 0x70, 0x9b, 0xf2, 0xdb, 0x5f, 0x9e, 0x29, 0xd8, 0x0f, 0xc5, - 0xa7, 0x2d, 0x46, 0x1a, 0x09, 0x63, 0xd8, 0xc1, 0x41, 0xa7, 0x21, 0x07, - 0x86, 0x9b, 0xad, 0x13, 0xc3, 0x1f, 0xa9, 0x6e, 0xe6, 0x3e, 0xfc, 0x7e, - 0xab, 0xc4, 0x71, 0x50, 0xf5, 0x68, 0x99, 0x98, 0xae, 0xf7, 0x9a, 0xd6, - 0x1f, 0xea, 0x1b, 0xe5, 0x9d, 0xbb, 0x27, 0xc4, 0x92, 0xec, 0x13, 0xa9, - 0x33, 0x11, 0x99, 0xbf, 0x4a, 0x45, 0x59, 0x67, 0x3f, 0x6b, 0xa5, 0x34, - 0xcc, 0xef, 0x7e, 0xf3, 0x73, 0xc4, 0x5f, 0x50, 0xcb, 0xfc, 0x7d, 0x39, - 0xb8, 0xba, 0x04, 0x70, 0xfc, 0x97, 0xac, 0xac, 0x36, 0xec, 0x73, 0xfc, - 0x57, 0xab, 0xbd, 0x35, 0x2a, 0x1f, 0x2a, 0xbb, 0x39, 0x5e, 0x2c, 0xfc, - 0xe5, 0x81, 0xe3, 0xbe, 0xb0, 0x9f, 0xa2, 0x06, 0x03, 0x93, 0x0c, 0xbb, - 0xbd, 0x89, 0xb2, 0x75, 0xb1, 0x99, 0x1e, 0xef, 0xda, 0x1f, 0x2c, 0xf3, - 0x99, 0x83, 0x2f, 0xe7, 0xc1, 0x49, 0x99, 0xee, 0x64, 0x1d, 0x72, 0x26, - 0x2b, 0x27, 0x63, 0x83, 0xc4, 0xb8, 0xa8, 0x11, 0x82, 0xf2, 0xfd, 0x7c, - 0x16, 0x1c, 0xf4, 0x12, 0x24, 0xdc, 0x08, 0x20, 0x44, 0x0f, 0x83, 0x97, - 0x6c, 0xc6, 0xbd, 0x24, 0xe4, 0xbd, 0x64, 0x10, 0x4d, 0xa2, 0x71, 0x3c, - 0x96, 0x92, 0x02, 0x79, 0x8f, 0x03, 0x77, 0x1e, 0xf5, 0x87, 0x7a, 0x7d, - 0x74, 0x2f, 0x55, 0xb2, 0xa3, 0xe5, 0xb9, 0xab, 0x4e, 0xa5, 0x98, 0x7b, - 0x4c, 0xc1, 0xc2, 0xdd, 0x64, 0x7d, 0x70, 0xf5, 0x14, 0x14, 0x99, 0x19, - 0x4c, 0x99, 0x8a, 0xa4, 0x06, 0xfe, 0x17, 0xcd, 0xf7, 0xe6, 0x00, 0x2c, - 0x64, 0xc6, 0x63, 0x12, 0x95, 0x16, 0x13, 0x4f, 0xf7, 0x52, 0x26, 0xd8, - 0x10, 0x10, 0xc2, 0xfa, 0xd4, 0x15, 0xf6, 0x36, 0xc1, 0x20, 0x04, 0x6f, - 0x9f, 0xa7, 0xe8, 0x9c, 0xb1, 0xc6, 0x06, 0xd4, 0xc8, 0x19, 0xba, 0x96, - 0xc1, 0x4c, 0x46, 0x22, 0x0d, 0xab, 0xf2, 0x5a, 0x96, 0xd1, 0xfb, 0x10, - 0x50, 0x8e, 0xcf, 0x6d, 0x9b, 0xc9, 0x3d, 0x7a, 0x87, 0x22, 0xd4, 0xf1, - 0x26, 0xe4, 0xc6, 0x9e, 0x97, 0xf3, 0xa8, 0xf0, 0x39, 0xcd, 0xb9, 0x18, - 0x6c, 0x72, 0x70, 0x71, 0x72, 0xf8, 0x44, 0x98, 0xe0, 0x14, 0xe3, 0xc1, - 0x78, 0xfe, 0x47, 0xd7, 0x37, 0xec, 0x89, 0xc5, 0x23, 0x34, 0x4a, 0xc8, - 0x49, 0x45, 0x84, 0xa4, 0x03, 0xdc, 0xe1, 0xc8, 0xa5, 0x45, 0xec, 0xa9, - 0xc9, 0x5a, 0x63, 0xcc, 0x95, 0x3e, 0x7d, 0x4e, 0xd0, 0xad, 0xa7, 0x40, - 0xc3, 0x32, 0x57, 0x94, 0xbe, 0x09, 0x72, 0xc3, 0xaa, 0x24, 0x17, 0xd2, - 0x0d, 0x26, 0xfc, 0xb1, 0x76, 0xab, 0x2c, 0x3a, 0xd5, 0x17, 0x82, 0x06, - 0x3e, 0x30, 0x0a, 0xd9, 0xfd, 0x8f, 0x85, 0x9a, 0x21, 0x66, 0x9e, 0x21, - 0xaf, 0x4c, 0xbc, 0x4e, 0x93, 0x96, 0x4b, 0x85, 0x1a, 0xe9, 0x94, 0xd9, - 0x6c, 0x24, 0xdb, 0xb7, 0xa3, 0xc0, 0xdf, 0xd2, 0x5b, 0xc4, 0x0c, 0x1c, - 0xaf, 0x98, 0x1a, 0x88, 0xc3, 0xb4, 0xde, 0x72, 0xa2, 0x00, 0x4e, 0xc0, - 0x0d, 0xc1, 0xd8, 0xa2, 0x1c, 0x2b, 0x9e, 0xf6, 0xb0, 0x22, 0x76, 0xe4, - 0x41, 0x39, 0x2e, 0xd8, 0xfd, 0xa3, 0x7e, 0x87, 0x18, 0x60, 0xa6, 0x31, - 0xf3, 0x13, 0x7a, 0x12, 0x43, 0xd1, 0x9d, 0x24, 0x5a, 0x73, 0xf8, 0x00, - 0xac, 0x59, 0x96, 0xc6, 0x88, 0x7b, 0xbb, 0x9c, 0x65, 0xaa, 0xbf, 0x78, - 0x00, 0x6e, 0x48, 0xe7, 0x28, 0x71, 0xad, 0x5a, 0x77, 0x0d, 0x07, 0xeb, - 0x7d, 0x5c, 0x21, 0x50, 0xd5, 0x89, 0x12, 0x3e, 0x73, 0xb2, 0x14, 0x60, - 0x34, 0xdc, 0x00, 0x09, 0x10, 0x3e, 0xa1, 0xbd, 0xc3, 0x48, 0x24, 0xb5, - 0x2a, 0x0b, 0xde, 0x18, 0xef, 0xd0, 0x8a, 0x90, 0x08, 0x40, 0x99, 0xfe, - 0x8d, 0xe6, 0x40, 0x88, 0x68, 0xdf, 0x87, 0xfb, 0x3e, 0x4f, 0xe7, 0xef, - 0xd7, 0x35, 0x1f, 0x48, 0xc3, 0x80, 0xc7, 0xa0, 0xe2, 0x23, 0x93, 0xb2, - 0x6f, 0xdb, 0x10, 0x7d, 0x3a, 0xbd, 0x73, 0xff, 0xdd, 0x76, 0x3f, 0x76, - 0x01, 0xc0, 0xa3, 0x7c, 0x43, 0xde, 0x47, 0xe8, 0xea, 0xfc, 0xb8, 0x0c, - 0x39, 0x51, 0xff, 0x43, 0x3e, 0xcf, 0x86, 0xcb, 0x14, 0xaa, 0x07, 0x82, - 0xcd, 0xca, 0x53, 0xda, 0xf6, 0x1f, 0x9e, 0x46, 0xb9, 0xa8, 0xf4, 0x00, - 0x02, 0x37, 0x6b, 0xdc, 0x70, 0x84, 0xcb, 0x26, 0x16, 0xf3, 0xb5, 0x4c, - 0xb9, 0xc1, 0x13, 0xe4, 0x0e, 0xa9, 0xec, 0x05, 0xa8, 0x1c, 0xd9, 0xd4, - 0x49, 0x83, 0x84, 0xc7, 0x75, 0x45, 0xf5, 0xf7, 0xd8, 0x02, 0x75, 0x98, - 0x0a, 0x15, 0x06, 0x36, 0x1d, 0x2b, 0xfc, 0xdd, 0x2f, 0xa3, 0xe7, 0x5f, - 0x77, 0xe8, 0x77, 0x22, 0x05, 0xde, 0x40, 0x98, 0xb7, 0x35, 0x61, 0x0c, - 0x30, 0xf1, 0x0d, 0xad, 0x4e, 0xd7, 0x02, 0x16, 0x67, 0x65, 0x1b, 0x16, - 0x01, 0x51, 0xc1, 0x6e, 0x70, 0xb3, 0x63, 0x09, 0x7e, 0x3f, 0xf1, 0x85, - 0xa7, 0x6a, 0x04, 0x1e, 0xf1, 0x5a, 0xf3, 0x75, 0x11, 0xf5, 0x47, 0xd6, - 0x96, 0xdb, 0x45, 0x9a, 0x28, 0x1c, 0x86, 0xad, 0x4d, 0xfb, 0x41, 0x37, - 0xba, 0x55, 0xde, 0xc2, 0xc7, 0x4c, 0xc4, 0x8b, 0x15, 0x6d, 0xa5, 0x75, - 0x4f, 0x21, 0x60, 0x24, 0x35, 0x8d, 0x5e, 0x1f, 0x3f, 0x00, 0xbf, 0xb1, - 0xc0, 0xd5, 0x84, 0x3e, 0xa7, 0xa2, 0x3c, 0x7a, 0xd7, 0x78, 0x3e, 0x9e, - 0xd1, 0xa4, 0x8f, 0x76, 0x6a, 0x4b, 0x44, 0x90, 0xfb, 0x03, 0x53, 0x5b, - 0xf6, 0xf3, 0x62, 0x0d, 0x19, 0xa0, 0x7f, 0xe1, 0x89, 0xa5, 0x53, 0x08, - 0xe3, 0x4d, 0x34, 0x31, 0x69, 0x1a, 0xd3, 0x72, 0x9c, 0xe3, 0x85, 0x2c, - 0x46, 0xc9, 0xf6, 0x4d, 0x46, 0x9e, 0x6b, 0xab, 0xbd, 0xdc, 0xd7, 0x13, - 0x84, 0xe2, 0xd1, 0x8b, 0x6f, 0xd8, 0xa9, 0xc8, 0x6d, 0xfb, 0xb0, 0xec, - 0x20, 0x96, 0x0c, 0x16, 0xa9, 0x45, 0x24, 0xbe, 0xcb, 0x16, 0x83, 0x67, - 0xa5, 0xce, 0x86, 0xb9, 0x7d, 0xa1, 0x25, 0x6e, 0xc2, 0x59, 0x16, 0x7d, - 0x8a, 0xc2, 0xa6, 0x94, 0x05, 0x58, 0x5f, 0x3c, 0x4c, 0x08, 0x9a, 0xa1, - 0x7d, 0xdd, 0xa2, 0x14, 0x15, 0x00, 0xd5, 0x92, 0x03, 0x7e, 0x3b, 0x3a, - 0x58, 0xb6, 0x01, 0x87, 0xd0, 0x22, 0xef, 0x45, 0xda, 0xa1, 0x46, 0x1e, - 0x35, 0x69, 0xa5, 0x62, 0x46, 0x93, 0xdf, 0xa9, 0xbf, 0x56, 0x62, 0x93, - 0x21, 0x62, 0xa2, 0xf9, 0x73, 0x9e, 0x31, 0x23, 0x9b, 0x54, 0x0c, 0xc6, - 0x11, 0x34, 0xfc, 0x83, 0x70, 0x48, 0xd1, 0x8d, 0x31, 0xf6, 0xd0, 0xbd, - 0xad, 0x58, 0x14, 0xb1, 0xed, 0xbf, 0x0b, 0xe8, 0xca, 0x4a, 0x93, 0x58, - 0x2e, 0x55, 0x9f, 0x73, 0x8a, 0x2e, 0x0d, 0x7f, 0xde, 0xa0, 0xa0, 0xcc, - 0x04, 0x96, 0x85, 0xce, 0xbb, 0x49, 0x39, 0x85, 0xf3, 0x76, 0x12, 0x81, - 0x44, 0xff, 0x5e, 0xd9, 0x6f, 0x92, 0x49, 0xb9, 0x04, 0xcc, 0x47, 0x8f, - 0xd9, 0x73, 0x2d, 0xb8, 0x7c, 0x5d, 0x1f, 0xf7, 0x47, 0x78, 0xa7, 0x09, - 0x80, 0x1e, 0xca, 0xa7, 0x9b, 0x38, 0x88, 0xc6, 0xc3, 0x8f, 0xc3, 0x45, - 0xd3, 0x7d, 0xc1, 0xa5, 0x3f, 0x4d, 0xf8, 0xfa, 0x91, 0xdd, 0x61, 0x84, - 0x22, 0x04, 0x9d, 0x38, 0x5f, 0xea, 0x24, 0x75, 0xca, 0x61, 0x93, 0x3c, - 0xf4, 0x28, 0x8c, 0xc4, 0x5e, 0xb2, 0x04, 0xd8, 0xe4, 0x1f, 0x6d, 0x34, - 0xce, 0x7d, 0x77, 0x0a, 0x6b, 0x5e, 0x76, 0x25, 0x88, 0x35, 0x71, 0x3f, - 0xbb, 0x03, 0x50, 0x89, 0xe1, 0xf4, 0xaf, 0x61, 0x6b, 0xc0, 0x99, 0xa3, - 0x50, 0x80, 0xd5, 0x27, 0xab, 0x19, 0x29, 0x48, 0x3a, 0x15, 0x36, 0x0e, - 0xc5, 0x04, 0xea, 0x9c, 0xca, 0x7b, 0x4f, 0x0c, 0xfc, 0x4f, 0x1c, 0x0b, - 0xc8, 0xbe, 0x71, 0x89, 0x68, 0xfb, 0x61, 0x37, 0xbb, 0xb1, 0x2f, 0xe0, - 0x17, 0xb0, 0x3a, 0x64, 0x89, 0x71, 0x7c, 0x41, 0x77, 0x39, 0x0c, 0xcb, - 0x11, 0x52, 0x24, 0xc2, 0x33, 0xba, 0xea, 0xd9, 0xaa, 0xae, 0x3a, 0x99, - 0xa7, 0x86, 0xe5, 0xf5, 0x90, 0xf0, 0xbb, 0x92, 0xbc, 0x7c, 0x56, 0x21, - 0x5b, 0x5c, 0xcb, 0xf9, 0x08, 0x37, 0xd3, 0x24, 0xd8, 0xf9, 0x48, 0xea, - 0x39, 0x56, 0x88, 0x72, 0x1d, 0x29, 0xc3, 0x66, 0x5d, 0x68, 0xaa, 0x6e, - 0xea, 0xdb, 0xfb, 0xc0, 0x11, 0x43, 0x35, 0x37, 0x06, 0x22, 0x9a, 0xc9, - 0xda, 0x57, 0x76, 0xe0, 0x8e, 0xb1, 0x0e, 0x17, 0x13, 0xd3, 0x9e, 0x42, - 0x3b, 0x62, 0x4c, 0x24, 0x4c, 0x9e, 0xb9, 0x50, 0x76, 0x02, 0x15, 0xc1, - 0x13, 0x93, 0xc8, 0x74, 0x6c, 0xcd, 0x77, 0x59, 0xe6, 0x44, 0xf2, 0x6e, - 0xe3, 0x6e, 0x16, 0xa7, 0x60, 0x8f, 0xc6, 0x81, 0x5a, 0x9f, 0x51, 0x25, - 0x69, 0xce, 0x38, 0x77, 0x99, 0x3a, 0x7c, 0x0d, 0xa8, 0x39, 0xe8, 0x45, - 0x97, 0xe8, 0x78, 0x8c, 0xf3, 0x11, 0x63, 0x27, 0x08, 0x25, 0xbc, 0x0e, - 0x1a, 0x8b, 0xb3, 0x47, 0x62, 0xfe, 0x13, 0x27, 0x40, 0xf1, 0x2c, 0xc1, - 0x05, 0xe1, 0xe8, 0x48, 0x8a, 0x98, 0xd0, 0xa8, 0x61, 0x3d, 0xcc, 0xde, - 0x02, 0xdd, 0xff, 0xd8, 0xb8, 0x22, 0x32, 0x85, 0x63, 0xd4, 0xc3, 0x1a, - 0x22, 0x48, 0x18, 0x16, 0xed, 0xf4, 0x8b, 0x75, 0xa6, 0x69, 0x69, 0xd9, - 0x6f, 0xf5, 0x07, 0x7d, 0x76, 0xd6, 0xbe, 0x0a, 0x6d, 0x86, 0x8d, 0xd6, - 0xd7, 0x94, 0x05, 0x89, 0x46, 0x51, 0x4e, 0x9b, 0xb3, 0x47, 0xe7, 0xe8, - 0x8a, 0x0d, 0x95, 0x3c, 0xb8, 0x27, 0xae, 0xc8, 0x3d, 0x7f, 0xdf, 0x01, - 0xb7, 0x23, 0x57, 0x52, 0x0e, 0x6d, 0x0a, 0xef, 0x0a, 0x12, 0x9a, 0xc6, - 0x3c, 0x98, 0x95, 0xcd, 0xae, 0x99, 0xd9, 0x60, 0x54, 0x2f, 0x3b, 0x90, - 0x98, 0x0e, 0x98, 0x93, 0x42, 0x7d, 0x7a, 0x40, 0x4d, 0x38, 0x0e, 0x5c, - 0x7f, 0x6e, 0xc5, 0x9a, 0xe1, 0x81, 0xce, 0x94, 0x2a, 0x71, 0xf5, 0x3f, - 0x76, 0x01, 0xbf, 0xd7, 0x3c, 0x74, 0x43, 0xd8, 0x0c, 0x0f, 0xfb, 0x82, - 0xfe, 0x19, 0x25, 0x42, 0x28, 0x25, 0xf1, 0xd8, 0x67, 0x3f, 0x19, 0x0a, - 0x09, 0x2d, 0x4b, 0xc5, 0x7d, 0x54, 0x56, 0x09, 0x15, 0xb3, 0x15, 0x5f, - 0x22, 0x97, 0xb3, 0x76, 0x84, 0xd8, 0x93, 0xcc, 0x00, 0x36, 0x11, 0xc7, - 0xad, 0xde, 0x25, 0x02, 0xd1, 0xf2, 0x23, 0x06, 0x87, 0xec, 0x2a, 0x41, - 0x88, 0x19, 0x9b, 0x28, 0x72, 0x94, 0xd2, 0xec, 0xfa, 0x0f, 0xca, 0x19, - 0xa4, 0x54, 0x2e, 0x4b, 0x56, 0x2f, 0x39, 0xf9, 0x15, 0x41, 0x3b, 0xa2, - 0xb2, 0xf9, 0xd0, 0x2d, 0xf1, 0x2f, 0xc4, 0x30, 0x98, 0xdc, 0x9a, 0x53, - 0x1e, 0x77, 0xce, 0xc2, 0x9c, 0x67, 0x11, 0x2e, 0x49, 0x11, 0x4f, 0x26, - 0xd4, 0xb1, 0xc9, 0x6e, 0xfd, 0x9f, 0x79, 0x89, 0xe7, 0x0e, 0xfd, 0x4d, - 0xc6, 0x52, 0x04, 0x2a, 0x8f, 0x71, 0x20, 0xa8, 0xdc, 0x20, 0x20, 0x03, - 0xd5, 0x8d, 0x0a, 0xe4, 0x2f, 0x53, 0x70, 0xab, 0x9c, 0x55, 0x05, 0x1c, - 0x1f, 0x87, 0x9f, 0x17, 0x1f, 0x63, 0x54, 0xa8, 0x0e, 0xd4, 0x3e, 0x1a, - 0x50, 0x68, 0x93, 0x8f, 0xf5, 0x18, 0x06, 0x46, 0x48, 0x85, 0xc2, 0x13, - 0x3c, 0xf6, 0xcd, 0xaa, 0x5f, 0x91, 0x6c, 0x9e, 0xcd, 0x91, 0xe5, 0x1e, - 0xc7, 0x07, 0xbb, 0x65, 0xa0, 0x13, 0x6a, 0xbe, 0xed, 0x2d, 0xfd, 0x21, - 0x3a, 0x67, 0xb3, 0x14, 0xae, 0x24, 0x87, 0x47, 0xaa, 0xf5, 0xa4, 0x5d, - 0x9e, 0x3a, 0x13, 0x22, 0x8d, 0xa7, 0x93, 0x1f, 0x8d, 0x59, 0x65, 0x94, - 0xcc, 0x9f, 0xcd, 0xeb, 0x11, 0x12, 0xec, 0xd2, 0x98, 0x1b, 0x9f, 0x30, - 0x77, 0xf2, 0xf3, 0xb7, 0x76, 0x43, 0xda, 0x62, 0xde, 0x8f, 0x4c, 0xe3, - 0x2b, 0x33, 0x3f, 0x8c, 0x49, 0x66, 0xb1, 0x22, 0xc1, 0x9a, 0xf4, 0x26, - 0xc7, 0x2e, 0xd5, 0x4d, 0xc7, 0x7e, 0xcd, 0x81, 0x15, 0xd7, 0x5b, 0xa8, - 0xe0, 0x11, 0xc4, 0x75, 0x9b, 0x93, 0x1e, 0xe1, 0x00, 0x1e, 0xed, 0x25, - 0x93, 0xaf, 0x96, 0x0c, 0xe7, 0x4a, 0xd3, 0x4c, 0x80, 0xd5, 0x3a, 0x0a, - 0x90, 0x97, 0x75, 0xa6, 0x08, 0x61, 0x1e, 0xab, 0xa8, 0x64, 0xe8, 0x7d, - 0xc8, 0xf6, 0x96, 0xfc, 0x13, 0xdb, 0x39, 0xca, 0x0e, 0x4a, 0x91, 0x6a, - 0xb8, 0xf7, 0xa0, 0x7c, 0xba, 0x09, 0xea, 0x4e, 0x40, 0x45, 0xf5, 0x4c, - 0x92, 0x10, 0xf1, 0x2a, 0x25, 0x3d, 0x0c, 0x6f, 0x70, 0x91, 0x08, 0x88, - 0x57, 0x88, 0x7b, 0x7f, 0xe5, 0xf5, 0x87, 0x2a, 0x0e, 0xd7, 0x2b, 0x2e, - 0xbf, 0xd9, 0x84, 0x2c, 0x88, 0x9b, 0xf1, 0xf1, 0x1a, 0x9d, 0xa2, 0xe1, - 0x6c, 0x47, 0x6f, 0x53, 0x98, 0x1e, 0x90, 0xf6, 0x2c, 0xf2, 0x3d, 0xe5, - 0x2e, 0x51, 0x32, 0x5a, 0x9d, 0x1d, 0x66, 0x15, 0x68, 0xc6, 0xc1, 0xb4, - 0x7c, 0x99, 0xee, 0x64, 0x4e, 0xb6, 0xbd, 0x02, 0x48, 0xc2, 0xbe, 0x48, - 0xbd, 0xae, 0x64, 0x48, 0x25, 0xb8, 0x15, 0xec, 0x07, 0x27, 0xec, 0xe5, - 0xa9, 0x2c, 0xac, 0x9c, 0x66, 0x08, 0xbd, 0x09, 0x11, 0x46, 0x81, 0x5f, - 0xe8, 0x8b, 0x79, 0x62, 0x65, 0x90, 0x7b, 0x2a, 0xcd, 0xef, 0x04, 0xe3, - 0x5b, 0x89, 0x6c, 0x9f, 0x4e, 0x60, 0x0a, 0x1e, 0x2c, 0xa7, 0x2b, 0x06, - 0x52, 0x4d, 0xc9, 0x23, 0x59, 0x64, 0xcd, 0xa8, 0x58, 0x92, 0x8b, 0xe0, - 0xab, 0x05, 0x9b, 0x4c, 0x1c, 0xa5, 0x4b, 0x17, 0x25, 0x85, 0x40, 0x1e, - 0x08, 0x7b, 0x53, 0x39, 0xb9, 0xba, 0x5d, 0x9a, 0x47, 0xae, 0x5e, 0xf1, - 0x92, 0xc4, 0xea, 0x07, 0xbe, 0xed, 0x62, 0xbe, 0x30, 0xeb, 0xbd, 0x51, - 0x05, 0xb3, 0x75, 0x99, 0x30, 0x6a, 0xf0, 0xde, 0xb2, 0x70, 0xb3, 0x18, - 0x5e, 0x8f, 0xc1, 0xc9, 0x09, 0x24, 0x11, 0x6e, 0x85, 0x5b, 0xc6, 0xde, - 0x29, 0x95, 0xa0, 0xdd, 0x22, 0x6e, 0x72, 0x9d, 0xa4, 0xc7, 0x63, 0x0c, - 0xda, 0xf7, 0x55, 0x85, 0x77, 0xda, 0xa2, 0x43, 0x46, 0x3e, 0x11, 0xc6, - 0x2a, 0x9f, 0xc7, 0xd8, 0xd6, 0xf3, 0x5a, 0x46, 0xda, 0x6f, 0x01, 0xc6, - 0xc5, 0x83, 0x00, 0x5c, 0x7a, 0x0f, 0xd2, 0x49, 0xe9, 0xba, 0x11, 0x46, - 0xa2, 0xd8, 0x4c, 0xcc, 0xee, 0x4d, 0xd8, 0x00, 0x86, 0x1d, 0xf2, 0xd9, - 0x31, 0xf3, 0x92, 0xb7, 0x46, 0xda, 0x60, 0x6d, 0xa5, 0x93, 0x85, 0x9a, - 0x1a, 0xc5, 0x73, 0x99, 0x72, 0x78, 0x7c, 0x63, 0xe2, 0x28, 0x0c, 0x9d, - 0xe3, 0xe6, 0x5b, 0x40, 0x25, 0x7c, 0x63, 0x99, 0x66, 0x70, 0x42, 0x38, - 0x6e, 0xfe, 0x04, 0xe3, 0xa3, 0x85, 0xb1, 0x12, 0xe4, 0x81, 0x4e, 0xd0, - 0xcc, 0xf4, 0xd7, 0x60, 0x50, 0x4b, 0xd2, 0xc5, 0x70, 0x66, 0x46, 0xa7, - 0x05, 0x9a, 0xef, 0x2b, 0x6a, 0x6b, 0xf4, 0xa9, 0x94, 0x9c, 0xf0, 0xff, - 0x5f, 0x0a, 0x73, 0x1d, 0xfe, 0xbb, 0x74, 0x98, 0xba, 0x97, 0x06, 0xb9, - 0x49, 0x47, 0x23, 0x47, 0x40, 0x75, 0x24, 0x96, 0xac, 0x1f, 0x2a, 0xe9, - 0x84, 0x3c, 0xe2, 0xbb, 0x19, 0x08, 0x5c, 0xee, 0xa1, 0x86, 0x33, 0x25, - 0x4b, 0x59, 0x6a, 0x63, 0xde, 0xd7, 0x89, 0xd6, 0x22, 0x75, 0xe3, 0x18, - 0x23, 0x99, 0x2f, 0xa7, 0x5c, 0x50, 0x3f, 0x46, 0xe0, 0xd0, 0xc2, 0x7f, - 0x45, 0x8d, 0xaf, 0xf6, 0x76, 0x4c, 0x57, 0x4d, 0xe7, 0x0d, 0x76, 0xd1, - 0xe5, 0x15, 0x1c, 0x31, 0xb0, 0x28, 0x04, 0xab, 0xcf, 0xf1, 0x0b, 0xb1, - 0xff, 0x72, 0xc0, 0x44, 0x6a, 0x15, 0x24, 0x98, 0x60, 0xc7, 0x34, 0x21, - 0x03, 0x14, 0xd2, 0xa7, 0xb3, 0x94, 0x25, 0x7a, 0x4b, 0x91, 0x83, 0xb9, - 0xef, 0x59, 0xd8, 0x88, 0xea, 0x44, 0xd6, 0xfc, 0xed, 0x87, 0xee, 0xa2, - 0x6a, 0xc6, 0xb2, 0x84, 0x67, 0x26, 0x43, 0xe2, 0x9d, 0x16, 0xd8, 0x35, - 0x2b, 0xc5, 0x20, 0x55, 0x8b, 0x01, 0xe5, 0xcd, 0x76, 0xef, 0xd5, 0x08, - 0xca, 0x96, 0x7b, 0x14, 0x33, 0xd7, 0x8a, 0xe2, 0xd1, 0x7e, 0x2f, 0x8b, - 0x0c, 0x64, 0x64, 0x1e, 0x1f, 0xdc, 0x02, 0xec, 0xbb, 0x28, 0x53, 0xca, - 0x40, 0x50, 0x5e, 0x9d, 0x4c, 0x59, 0x65, 0xcd, 0xd7, 0x88, 0x73, 0xca, - 0xa5, 0xd5, 0xac, 0x1b, 0x3e, 0xa3, 0x8b, 0x37, 0x1f, 0x3f, 0xd4, 0xa1, - 0x6d, 0x12, 0x6a, 0x79, 0xa6, 0x7e, 0x11, 0xf6, 0x6d, 0x7a, 0x84, 0x99, - 0x14, 0xab, 0x8f, 0xd9, 0x27, 0xc9, 0x72, 0x6d, 0xd6, 0x4a, 0x74, 0xee, - 0x68, 0xd0, 0x00, 0x2b, 0xd1, 0xf2, 0x03, 0xf1, 0x1e, 0x86, 0x7b, 0xe2, - 0x86, 0xb3, 0x71, 0xd7, 0x9b, 0xe1, 0xa6, 0xb2, 0xad, 0x33, 0x95, 0x46, - 0x23, 0x5d, 0x4a, 0xad, 0x3d, 0x08, 0x28, 0x7d, 0x50, 0x70, 0x58, 0xe7, - 0xee, 0x5e, 0x77, 0x69, 0x27, 0x08, 0xa4, 0xec, 0x8c, 0xd1, 0xad, 0xdf, - 0x5a, 0x14, 0x91, 0xc4, 0x6e, 0x94, 0x9b, 0x6f, 0xb2, 0xf2, 0xb4, 0x0b, - 0xcd, 0xbd, 0xfa, 0x5a, 0x0e, 0xb0, 0x85, 0xc8, 0xc7, 0x3a, 0x8c, 0x66, - 0xb0, 0xfb, 0x9c, 0x65, 0x7a, 0x10, 0x16, 0xca, 0xe7, 0xff, 0x2c, 0xf2, - 0x57, 0x8a, 0x5f, 0xc6, 0x2c, 0x5e, 0x33, 0x6c, 0xd7, 0x6d, 0x02, 0xf6, - 0xc2, 0x02, 0x87, 0x40, 0x78, 0x3f, 0xf2, 0x27, 0x89, 0x47, 0x13, 0xf5, - 0xde, 0x9a, 0x3f, 0x97, 0x0d, 0xe6, 0xe0, 0x1d, 0x34, 0xef, 0xe9, 0x57, - 0xdb, 0xa4, 0xc6, 0x22, 0xd1, 0x54, 0xeb, 0x8a, 0xaa, 0x22, 0xc7, 0x2c, - 0x1f, 0x7d, 0x3e, 0xba, 0x31, 0x40, 0x6c, 0xd0, 0x2e, 0xc5, 0xe7, 0x53, - 0xec, 0xa5, 0x86, 0xbf, 0xce, 0x9a, 0x58, 0xfb, 0xef, 0x13, 0x48, 0x50, - 0x62, 0x5f, 0x4d, 0xeb, 0xd5, 0x1a, 0x15, 0x4b, 0x3f, 0x42, 0x6e, 0xa2, - 0xd2, 0x67, 0xac, 0x9e, 0x06, 0xf9, 0xf2, 0x1e, 0x2b, 0x60, 0x05, 0xee, - 0x3d, 0xf5, 0x03, 0xcc, 0x29, 0xba, 0x9d, 0x45, 0x23, 0xe9, 0x69, 0xe8, - 0x98, 0xd3, 0xd3, 0x34, 0x29, 0x27, 0xcc, 0x6b, 0xdd, 0xa2, 0x02, 0x78, - 0x38, 0x87, 0x56, 0xbd, 0xe5, 0x90, 0xb3, 0xd0, 0x2a, 0x1c, 0x13, 0x5e, - 0x9a, 0x2b, 0xe3, 0x5e, 0x0f, 0x30, 0xc1, 0x76, 0x9a, 0x7e, 0xe8, 0x9b, - 0x23, 0xe8, 0x9c, 0x10, 0x62, 0xda, 0x28, 0x8c, 0xe2, 0x32, 0x99, 0x11, - 0x47, 0xb8, 0xe6, 0xe3, 0x02, 0x30, 0x9a, 0x9c, 0xb3, 0xf2, 0xd8, 0xec, - 0xe2, 0x6d, 0xa0, 0xfb, 0xa5, 0x27, 0xa9, 0xf3, 0x49, 0xdd, 0x0e, 0xda, - 0x8f, 0xe6, 0x3e, 0x71, 0xb8, 0x3e, 0xc5, 0x1e, 0x47, 0x79, 0x7a, 0x99, - 0xb8, 0x75, 0x52, 0xc4, 0x85, 0xea, 0x7a, 0x76, 0x49, 0x99, 0xe5, 0x32, - 0x50, 0x68, 0x9a, 0xa1, 0xf2, 0xce, 0x15, 0xbb, 0x77, 0x6f, 0x68, 0x99, - 0xfe, 0xea, 0x93, 0x1c, 0xaf, 0x4b, 0xe3, 0xc8, 0x41, 0xb3, 0xc7, 0xb1, - 0xa9, 0x27, 0x02, 0x4a, 0xb0, 0xc5, 0x64, 0x34, 0x4f, 0x67, 0x43, 0x5a, - 0x40, 0xff, 0x83, 0x16, 0x6b, 0x79, 0x6b, 0xe4, 0x23, 0x02, 0x35, 0x1f, - 0x78, 0x7f, 0x50, 0xd3, 0x5a, 0xb6, 0x26, 0xf5, 0xc5, 0xd6, 0x67, 0x04, - 0xc9, 0x4e, 0x7b, 0x5b, 0xf8, 0x5b, 0x9b, 0xa1, 0x79, 0xf4, 0x36, 0x88, - 0x12, 0x02, 0x06, 0x83, 0x7f, 0x3e, 0x36, 0xdd, 0x11, 0x39, 0x62, 0xb0, - 0xf9, 0xb3, 0x91, 0xdd, 0x7e, 0x99, 0x2e, 0x7d, 0x4e, 0xb6, 0x15, 0x09, - 0x2c, 0x4d, 0x48, 0xc6, 0x5a, 0xc5, 0x80, 0xcf, 0xca, 0x5b, 0x1a, 0x62, - 0x26, 0xc9, 0x24, 0x05, 0xa0, 0x03, 0x98, 0xbf, 0x89, 0x6e, 0x91, 0x11, - 0xc6, 0x0b, 0xc9, 0xc8, 0x83, 0xc2, 0x85, 0xf6, 0x5e, 0x40, 0x42, 0xbf, - 0x6b, 0x54, 0xa3, 0x14, 0x6f, 0x8e, 0x30, 0xfb, 0x24, 0xba, 0xc3, 0xd9, - 0x22, 0xef, 0x46, 0x18, 0xae, 0x23, 0x49, 0xe6, 0x21, 0x9e, 0x31, 0xb4, - 0x2a, 0x8d, 0xc2, 0x0d, 0x14, 0x9d, 0xd5, 0x9b, 0xcf, 0xb6, 0xb1, 0xb1, - 0x84, 0x50, 0x46, 0x48, 0xc2, 0x40, 0x9b, 0x98, 0xf2, 0x0a, 0x4b, 0xa6, - 0x9f, 0xbb, 0xc5, 0x34, 0x6f, 0x06, 0x6f, 0x9c, 0x7b, 0x29, 0x52, 0x8e, - 0x71, 0x5d, 0x2e, 0x81, 0x95, 0xaf, 0x12, 0xb0, 0xcc, 0x68, 0x1a, 0xda, - 0xea, 0xdc, 0x71, 0x6d, 0xb5, 0x40, 0xcb, 0x4d, 0x1f, 0x44, 0xe8, 0xb1, - 0xba, 0xf8, 0xba, 0xc7, 0x2a, 0x5f, 0x84, 0x1d, 0xdd, 0x89, 0x9a, 0x7c, - 0x63, 0xcd, 0x38, 0x97, 0x75, 0xc4, 0x79, 0x9d, 0xc0, 0x30, 0xfe, 0x36, - 0x22, 0xa7, 0x3e, 0x86, 0xbf, 0xc3, 0xca, 0x6c, 0xd2, 0xe5, 0x8a, 0x6b, - 0x46, 0x08, 0x84, 0xcb, 0x88, 0xde, 0xc4, 0x0c, 0xd5, 0x1c, 0x55, 0xa7, - 0x32, 0x4a, 0xa0, 0xec, 0x95, 0x10, 0x9c, 0xba, 0xf3, 0xd0, 0xac, 0xd0, - 0x81, 0x81, 0xc1, 0x34, 0x4c, 0x78, 0xba, 0x27, 0x60, 0x19, 0xf1, 0x5f, - 0x1e, 0x2c, 0xdf, 0x8d, 0xd9, 0x13, 0x9a, 0x19, 0xa0, 0x94, 0xe0, 0xb6, - 0x51, 0x01, 0x3f, 0x13, 0xa2, 0x59, 0xd9, 0x65, 0x70, 0xad, 0x7a, 0xa1, - 0x1e, 0x83, 0x3b, 0xce, 0xcf, 0x0d, 0xe0, 0x92, 0x19, 0xb7, 0xc2, 0x6b, - 0x58, 0xf1, 0x50, 0x7c, 0x0a, 0xa3, 0xc6, 0x66, 0xe7, 0x11, 0x55, 0xb9, - 0xe3, 0xc0, 0xe0, 0xb2, 0xb0, 0xb9, 0xcc, 0xa8, 0x6a, 0x8e, 0xf8, 0x68, - 0x03, 0xda, 0xf4, 0x47, 0x0d, 0xad, 0x13, 0xcf, 0x5e, 0x6e, 0xf0, 0x90, - 0xc2, 0xce, 0x49, 0x1f, 0xb3, 0xc6, 0xad, 0x08, 0xef, 0xff, 0xab, 0x9b, - 0xcf, 0x4f, 0x9a, 0x8b, 0xeb, 0xa4, 0xba, 0xeb, 0x85, 0xd5, 0xd3, 0x4a, - 0xb3, 0x87, 0xba, 0xa3, 0x51, 0xd2, 0x47, 0x86, 0x89, 0xee, 0x87, 0xa7, - 0x5f, 0xfc, 0xe9, 0x5d, 0x0f, 0x32, 0x64, 0xfb, 0xbd, 0xd0, 0xf1, 0x01, - 0x34, 0xc6, 0x79, 0x6d, 0x55, 0xe8, 0x09, 0x6e, 0x4c, 0xbd, 0x6e, 0xdc, - 0xe3, 0xee, 0xc0, 0x3f, 0x5d, 0x8c, 0xf9, 0xca, 0x5b, 0x08, 0x6d, 0xac, - 0x4d, 0xba, 0x8f, 0xd0, 0x90, 0xb3, 0x32, 0x6b, 0x64, 0x44, 0x5d, 0xe1, - 0xcc, 0x03, 0x48, 0x1c, 0x24, 0xcd, 0xf0, 0x62, 0x1c, 0xa4, 0xc9, 0x08, - 0x6c, 0xf8, 0x11, 0xb1, 0xf5, 0xc9, 0x23, 0x54, 0xdf, 0xd6, 0xab, 0x67, - 0xab, 0x7f, 0x16, 0x10, 0x03, 0x64, 0x3f, 0xd2, 0x19, 0x8b, 0x00, 0x57, - 0x52, 0xa5, 0x17, 0xd3, 0x28, 0x50, 0xbd, 0xd2, 0xdd, 0x39, 0x2b, 0x29, - 0x0e, 0x34, 0x97, 0x9e, 0x30, 0x69, 0x66, 0x50, 0x35, 0x8c, 0xc6, 0x8a, - 0x31, 0x01, 0xe2, 0x0a, 0x42, 0xda, 0xcf, 0x53, 0x1a, 0xaf, 0x7d, 0xd9, - 0x51, 0xc7, 0x4e, 0x8d, 0x97, 0xf6, 0xa0, 0xeb, 0xf6, 0x0f, 0x87, 0x7c, - 0xe9, 0x07, 0x4e, 0xc0, 0x09, 0xff, 0xd9, 0x76, 0xfa, 0x89, 0x2b, 0x00, - 0x9b, 0x29, 0x89, 0x55, 0xe1, 0x39, 0x5d, 0x0c, 0x30, 0x33, 0xf0, 0x5c, - 0x8a, 0xc4, 0xda, 0x37, 0x5f, 0x4a, 0x6a, 0x16, 0x31, 0xad, 0x7d, 0xb4, - 0xd2, 0xab, 0x86, 0x3f, 0x29, 0x71, 0x40, 0x13, 0xdb, 0xca, 0xa8, 0x04, - 0xbf, 0xb0, 0x64, 0xb6, 0x14, 0xca, 0x9b, 0xbf, 0x81, 0x39, 0xb3, 0x12, - 0x22, 0xf9, 0x61, 0x36, 0xef, 0x46, 0xce, 0x19, 0xdd, 0x9d, 0x23, 0x53, - 0x7c, 0x57, 0xfd, 0x77, 0xf7, 0xbc, 0x23, 0x8d, 0xaa, 0x0a, 0xb8, 0x41, - 0x15, 0x1b, 0xc8, 0x5e, 0x4c, 0x77, 0x4d, 0x51, 0xc5, 0xd0, 0x2f, 0x94, - 0x16, 0x09, 0xa0, 0xe5, 0x70, 0xc3, 0x9d, 0x55, 0xbf, 0x5a, 0x6f, 0x56, - 0x52, 0x0d, 0x7c, 0x9f, 0x7b, 0xdd, 0xf3, 0xec, 0x89, 0xf3, 0x12, 0xad, - 0xf9, 0x9a, 0x2a, 0xff, 0x68, 0x8d, 0x04, 0xd6, 0xd5, 0x21, 0x49, 0xf8, - 0xfe, 0x87, 0x92, 0xde, 0xf8, 0xc2, 0x6a, 0xed, 0x8b, 0xd8, 0x0c, 0x8b, - 0xfc, 0xb6, 0xa1, 0xab, 0xa1, 0x0f, 0x0e, 0x86, 0x89, 0xaf, 0xcc, 0xf8, - 0xf5, 0xce, 0xd8, 0x03, 0x66, 0x8c, 0x38, 0x6e, 0x85, 0x24, 0xc2, 0xd7, - 0x62, 0x58, 0xcb, 0xee, 0xa1, 0xa5, 0xf1, 0xa5, 0x9f, 0xbf, 0xa8, 0xb2, - 0x3d, 0x50, 0x58, 0xfd, 0x4c, 0x5c, 0x89, 0x6a, 0xbd, 0x44, 0x7e, 0x7b, - 0x21, 0x64, 0x08, 0xba, 0xe9, 0x7f, 0x06, 0x94, 0x77, 0xb1, 0x5b, 0x54, - 0x14, 0x47, 0x9a, 0x9a, 0x17, 0xf9, 0xbf, 0x8d, 0xc2, 0x32, 0xd0, 0x88, - 0x61, 0x17, 0x01, 0xa1, 0x1e, 0x72, 0x2c, 0xd1, 0xac, 0x74, 0xcb, 0x1b, - 0x50, 0x72, 0x22, 0xec, 0x14, 0x3d, 0x94, 0x6b, 0x9d, 0xe5, 0x0c, 0x37, - 0xb5, 0xef, 0xc0, 0xdc, 0xfe, 0x19, 0x0e, 0xb5, 0x1d, 0x42, 0x99, 0xdd, - 0xaa, 0x8a, 0x76, 0xc2, 0x02, 0x08, 0x62, 0xff, 0xfa, 0x83, 0xf0, 0xc0, - 0xd5, 0xa4, 0xbf, 0xa0, 0x23, 0xdf, 0x5e, 0xa8, 0x9b, 0xed, 0xdf, 0xad, - 0xa0, 0x90, 0xbc, 0xc7, 0xba, 0xf4, 0xc4, 0xb1, 0x95, 0x99, 0x62, 0x68, - 0x97, 0x1e, 0xc4, 0x0e, 0x87, 0xd5, 0x37, 0x06, 0x54, 0xf6, 0xc0, 0x3f, - 0xbb, 0x3a, 0x29, 0x6b, 0x01, 0x37, 0x6c, 0x67, 0x14, 0x43, 0xd0, 0xad, - 0xd7, 0xb1, 0x7c, 0x8c, 0xa6, 0x4e, 0xad, 0x3b, 0x15, 0xa8, 0x8b, 0x42, - 0xc0, 0xfb, 0xd2, 0x81, 0x9d, 0x80, 0xf1, 0x4b, 0x83, 0x03, 0x23, 0x05, - 0xfb, 0xe3, 0x87, 0x74, 0x43, 0xce, 0x98, 0xc8, 0xfb, 0xc3, 0x18, 0x57, - 0xe4, 0xca, 0xb2, 0xa7, 0x9c, 0x37, 0x9b, 0x60, 0x8e, 0xb5, 0x12, 0xd8, - 0x5d, 0x25, 0x7a, 0x5f, 0xd6, 0x4b, 0x91, 0xb6, 0x97, 0xa5, 0x69, 0x82, - 0x09, 0xd6, 0xfc, 0x7f, 0x38, 0x94, 0x23, 0xab, 0x5c, 0x46, 0x8d, 0x23, - 0xa7, 0x26, 0x3c, 0xbb, 0xa7, 0xef, 0x0a, 0xe8, 0xb7, 0x2f, 0xea, 0xae, - 0x46, 0x07, 0x6a, 0x0a, 0xd1, 0x10, 0xf1, 0x36, 0x98, 0x42, 0xb6, 0x2d, - 0xb0, 0x7e, 0x3e, 0x22, 0x1a, 0x2a, 0x41, 0x02, 0x02, 0xab, 0xd7, 0xb3, - 0x4f, 0x1e, 0xe5, 0x24, 0x08, 0x6f, 0x39, 0xfa, 0xde, 0xd1, 0x34, 0x8c, - 0x84, 0x45, 0xb2, 0x44, 0x29, 0xdc, 0xf7, 0x76, 0xbe, 0x6c, 0x23, 0x8b, - 0x6c, 0x51, 0x6a, 0x5f, 0x06, 0xde, 0xb4, 0xaa, 0x91, 0x5b, 0xa2, 0x26, - 0xe5, 0x7c, 0xba, 0x42, 0x34, 0xf1, 0x49, 0x68, 0x07, 0x1a, 0x35, 0xd0, - 0xbc, 0xbf, 0x94, 0x77, 0x6f, 0xba, 0x3b, 0x9a, 0xc4, 0x88, 0x03, 0xa3, - 0x19, 0x98, 0x49, 0x96, 0x4c, 0xc9, 0x27, 0x59, 0x15, 0x78, 0x13, 0x45, - 0x69, 0x5c, 0xbd, 0x21, 0xac, 0xee, 0x4f, 0x69, 0x69, 0xfa, 0x95, 0x6e, - 0x16, 0x6b, 0xbe, 0x51, 0xf4, 0x77, 0xb8, 0x7b, 0xcf, 0xdb, 0xac, 0x26, - 0x74, 0x08, 0xec, 0xd5, 0x90, 0x29, 0x77, 0x1a, 0xfb, 0x61, 0x44, 0x73, - 0x93, 0x62, 0x41, 0x34, 0x0c, 0x7f, 0x7a, 0xc4, 0xb2, 0xbe, 0xad, 0x03, - 0xd3, 0xe4, 0x85, 0x67, 0xab, 0xa5, 0x9f, 0x18, 0x8d, 0x6a, 0xa6, 0xb7, - 0x13, 0xee, 0x15, 0xc5, 0xa5, 0x2f, 0x3b, 0x82, 0x3e, 0x95, 0x7c, 0x6a, - 0x28, 0xd4, 0x45, 0xb8, 0x27, 0x53, 0x84, 0xf1, 0xe8, 0x1c, 0xaa, 0x02, - 0xc6, 0xbb, 0x4e, 0x3b, 0x35, 0xc8, 0x87, 0x5b, 0x61, 0xfa, 0x5b, 0x51, - 0x0f, 0x77, 0x3a, 0xe0, 0x9c, 0x4a, 0x38, 0xa5, 0xfd, 0xe7, 0x73, 0xe2, - 0x09, 0x40, 0xcc, 0x3c, 0x4a, 0x48, 0xaf, 0x45, 0xa2, 0x00, 0xa9, 0x35, - 0x2a, 0xd6, 0xc1, 0xdf, 0x80, 0xbc, 0x95, 0xaa, 0x7b, 0xa1, 0x1a, 0x40, - 0x5e, 0x4d, 0xa1, 0x58, 0xe4, 0x6f, 0x1a, 0xaa, 0x29, 0xf6, 0x12, 0xe4, - 0x8b, 0x85, 0x2b, 0x43, 0x9d, 0x54, 0x0a, 0xae, 0x81, 0x57, 0x80, 0x4a, - 0x14, 0xb7, 0x5c, 0x3e, 0x36, 0x0e, 0x65, 0x25, 0xfc, 0xd1, 0x95, 0xd6, - 0x3f, 0xa4, 0x28, 0x29, 0x45, 0xbe, 0x65, 0x9f, 0xc0, 0x47, 0x1b, 0x98, - 0x3d, 0x8f, 0xd6, 0x68, 0x08, 0x43, 0x31, 0x1b, 0x04, 0xc3, 0x90, 0xde, - 0xc3, 0x66, 0x64, 0x9f, 0xd4, 0x1b, 0xfe, 0xca, 0x0e, 0x8e, 0x10, 0xaa, - 0xbd, 0x09, 0xdd, 0x0f, 0xe4, 0x77, 0x0c, 0x7a, 0xe5, 0xd6, 0xc2, 0x77, - 0xa7, 0xd5, 0xc2, 0x6e, 0x13, 0x07, 0xdb, 0xa8, 0xaf, 0x5a, 0xea, 0xb8, - 0x9b, 0xca, 0xe6, 0x18, 0x33, 0xe3, 0x28, 0x53, 0x65, 0x10, 0xb6, 0xc3, - 0xb9, 0x86, 0x67, 0xff, 0xcf, 0xba, 0x3d, 0x73, 0xef, 0x2f, 0x07, 0xe3, - 0xe2, 0x05, 0x3d, 0x1a, 0xac, 0x6e, 0xde, 0x9d, 0xef, 0x7c, 0x59, 0x3d, - 0xf6, 0x74, 0x8b, 0xcf, 0xb9, 0x41, 0xe0, 0x9c, 0xaf, 0xb1, 0xfe, 0xc3, - 0x38, 0x4d, 0xc3, 0x15, 0xb0, 0xf8, 0x0c, 0x79, 0x00, 0xfd, 0x08, 0x65, - 0x8b, 0x19, 0xa0, 0xd5, 0xab, 0x84, 0x4f, 0x19, 0x7c, 0xb0, 0x50, 0x48, - 0x91, 0x2a, 0xde, 0xbf, 0x2e, 0x54, 0x03, 0x22, 0x1f, 0x09, 0x64, 0x59, - 0x58, 0x02, 0x16, 0x30, 0x47, 0xc8, 0xae, 0x8e, 0x96, 0x79, 0x35, 0xc9, - 0x91, 0x35, 0x7e, 0x85, 0x8d, 0x85, 0x53, 0x71, 0x68, 0xff, 0x82, 0x8b, - 0xc2, 0xd6, 0xe3, 0x8c, 0xb7, 0x0f, 0xd3, 0xcb, 0x5a, 0x41, 0xa9, 0xde, - 0xdb, 0xdd, 0x7f, 0x6a, 0x22, 0x7f, 0x0f, 0x43, 0x8f, 0x68, 0x23, 0x37, - 0xf3, 0xf7, 0x5e, 0x33, 0xa7, 0x3f, 0x97, 0x50, 0x23, 0xbe, 0xdb, 0x0e, - 0x7d, 0x28, 0x9d, 0x0a, 0x8b, 0x6e, 0x56, 0x62, 0xb8, 0x58, 0xee, 0xd5, - 0x7e, 0x24, 0x35, 0x83, 0x38, 0x0c, 0xf6, 0x7c, 0x35, 0x98, 0x90, 0xaa, - 0x16, 0x13, 0xfb, 0x0c, 0x52, 0x4f, 0x4a, 0x39, 0x8d, 0xd5, 0xda, 0x0d, - 0xa0, 0x0b, 0x2b, 0xda, 0x51, 0xd1, 0xa6, 0x4c, 0x4c, 0x49, 0x32, 0xc6, - 0x5f, 0xe3, 0x0b, 0xfb, 0x68, 0x42, 0x0b, 0xea, 0x1c, 0x93, 0xa4, 0x98, - 0xe5, 0xea, 0xb1, 0xaa, 0x98, 0x8a, 0x5b, 0x23, 0xe7, 0x76, 0xfd, 0xbc, - 0xc2, 0x52, 0xe9, 0x94, 0x8c, 0xb8, 0xce, 0x0c, 0x6d, 0x7f, 0x61, 0x48, - 0x62, 0x76, 0x03, 0x7a, 0x18, 0xa1, 0x63, 0x03, 0x75, 0x2c, 0x1c, 0xa4, - 0xd3, 0xa7, 0xe2, 0x89, 0x74, 0xa8, 0xef, 0xb7, 0xbd, 0x73, 0xd0, 0x8e, - 0xa2, 0x71, 0x1c, 0x11, 0xff, 0x1f, 0x4a, 0xec, 0xde, 0xe5, 0x18, 0xd4, - 0x46, 0xa2, 0x37, 0x80, 0xa6, 0xbb, 0x4a, 0x33, 0x37, 0xfd, 0xb1, 0xf6, - 0x13, 0x81, 0xb8, 0xc9, 0xf9, 0xb6, 0x39, 0xeb, 0x82, 0x9f, 0xad, 0xc8, - 0xa3, 0x32, 0x8b, 0x9e, 0xae, 0x94, 0x1e, 0xd9, 0xe1, 0x73, 0x69, 0xe9, - 0xd4, 0xd5, 0x15, 0xce, 0x2a, 0x40, 0x0a, 0xc7, 0xda, 0xf3, 0xbb, 0x68, - 0x86, 0x6f, 0x1b, 0x48, 0x2c, 0x7e, 0x41, 0xb3, 0x48, 0xc8, 0x85, 0x57, - 0x2b, 0x30, 0x14, 0xd1, 0xbc, 0xcc, 0x61, 0xd7, 0xb9, 0x32, 0x5d, 0x53, - 0xef, 0xc9, 0xe9, 0xbf, 0x4a, 0xaf, 0x5e, 0x16, 0x7a, 0x39, 0x08, 0x41, - 0x09, 0x1f, 0xfd, 0xc5, 0x13, 0x75, 0x3c, 0x05, 0xf5, 0xf8, 0x07, 0x64, - 0xb7, 0x68, 0x18, 0xde, 0xaf, 0x04, 0x31, 0xfb, 0x0c, 0xa5, 0x59, 0x6c, - 0xa9, 0x03, 0xb2, 0x59, 0x42, 0x3f, 0x06, 0x3e, 0x95, 0x1a, 0x1e, 0xdf, - 0x09, 0xa0, 0x54, 0xfa, 0x38, 0x31, 0x15, 0xb3, 0xe3, 0x43, 0xb8, 0xfa, - 0x3b, 0xad, 0x37, 0xcf, 0x8f, 0x25, 0x37, 0xc4, 0xe3, 0xa0, 0x85, 0x00, - 0xb3, 0x1b, 0x4b, 0x26, 0x8f, 0xe3, 0x6c, 0xe1, 0x9c, 0x5c, 0xc9, 0x60, - 0x05, 0x6c, 0x95, 0xcc, 0xce, 0xd5, 0x9d, 0x20, 0xac, 0x08, 0x39, 0xcf, - 0x1e, 0x1e, 0x59, 0xf0, 0xef, 0x92, 0xba, 0x3b, 0x3f, 0x90, 0xef, 0xb4, - 0xfb, 0xdd, 0x76, 0xae, 0x5a, 0x5a, 0x64, 0xd4, 0x3d, 0x21, 0x38, 0x03, - 0x05, 0xfb, 0x20, 0x74, 0xe1, 0xd4, 0xa3, 0x24, 0x48, 0x48, 0x6c, 0x8b, - 0x7c, 0xec, 0xe6, 0x77, 0x5c, 0x96, 0x55, 0x3b, 0xfc, 0x2b, 0xea, 0xde, - 0x79, 0xda, 0x47, 0x22, 0x6b, 0xea, 0x94, 0x7f, 0xfc, 0x0c, 0xce, 0xd6, - 0x20, 0x77, 0xdb, 0x4e, 0x62, 0xa8, 0xea, 0x3d, 0x8e, 0x4a, 0x12, 0xdc, - 0x9e, 0xc5, 0xc9, 0x5d, 0x09, 0x07, 0xde, 0x7e, 0x83, 0xed, 0x46, 0xd4, - 0x47, 0x0f, 0x57, 0x00, 0x99, 0x14, 0xe5, 0xb9, 0x4d, 0x4a, 0x57, 0xd6, - 0xd1, 0x44, 0x92, 0x4b, 0x8f, 0x49, 0x17, 0x61, 0xbd, 0xfc, 0x0a, 0xd0, - 0x20, 0xc8, 0xf2, 0x0f, 0x30, 0x70, 0xb0, 0x99, 0xeb, 0xc8, 0x1e, 0x05, - 0x67, 0x6b, 0xf6, 0xf6, 0xcc, 0xc8, 0x92, 0xde, 0xcb, 0xc3, 0x2f, 0xd6, - 0x76, 0x02, 0xb1, 0xc1, 0xf9, 0xe0, 0xbd, 0xb4, 0x22, 0xa7, 0x19, 0x40, - 0x97, 0x10, 0x6e, 0x0a, 0x70, 0x5d, 0xb9, 0xb9, 0xc7, 0xd0, 0xbc, 0x4c, - 0xf9, 0x02, 0x75, 0xd0, 0xe3, 0x0d, 0x30, 0xce, 0xda, 0x7f, 0xaa, 0xd7, - 0x14, 0x02, 0x4a, 0x68, 0x50, 0x21, 0xb1, 0x7b, 0xfc, 0x27, 0x36, 0x95, - 0x46, 0xe9, 0x09, 0xa6, 0x55, 0xe0, 0x5f, 0x95, 0x3a, 0xe1, 0x3d, 0x14, - 0x8f, 0xa6, 0xe8, 0x90, 0xb5, 0x3a, 0x51, 0x41, 0xe0, 0x99, 0x36, 0x51, - 0xd5, 0x9e, 0x9c, 0xb2, 0x6e, 0x7a, 0xe2, 0x5b, 0x75, 0x44, 0xf3, 0x9e, - 0x4c, 0xf6, 0xec, 0x26, 0xfc, 0xfc, 0x5c, 0xbd, 0x49, 0x59, 0xca, 0x51, - 0x13, 0x70, 0xa5, 0x00, 0x8f, 0xe9, 0x5d, 0x73, 0x28, 0x07, 0x68, 0x57, - 0x75, 0x82, 0xa4, 0x37, 0x83, 0x82, 0xce, 0x5b, 0xab, 0x86, 0x72, 0x5e, - 0xda, 0xb5, 0xd4, 0xa3, 0x2c, 0x68, 0xc7, 0x3d, 0x80, 0x94, 0xcb, 0xb0, - 0x6d, 0x6d, 0xfb, 0x78, 0x28, 0x93, 0x4f, 0xfa, 0x11, 0x6b, 0x98, 0x69, - 0xaf, 0x1e, 0xd6, 0x0b, 0x98, 0x69, 0x50, 0xc3, 0x18, 0xb6, 0xbd, 0xe4, - 0x96, 0xad, 0x29, 0x50, 0x19, 0x13, 0xe2, 0xb6, 0x41, 0x93, 0x46, 0x40, - 0x53, 0xd5, 0x07, 0xb0, 0x01, 0x30, 0xef, 0x2c, 0x0b, 0xfd, 0xa8, 0x7b, - 0x40, 0x86, 0x3c, 0x67, 0xfc, 0x09, 0xb3, 0x85, 0xcb, 0x0c, 0xd9, 0x6f, - 0x7a, 0x84, 0x84, 0xf5, 0x56, 0x1e, 0x6e, 0x48, 0x12, 0xe6, 0xf6, 0x33, - 0x38, 0xd5, 0x8a, 0xe5, 0xee, 0xc6, 0x9d, 0x54, 0xfa, 0x49, 0x20, 0xea, - 0xa2, 0x4e, 0xf9, 0x2f, 0xaa, 0x8a, 0x8e, 0x2c, 0x84, 0x45, 0x80, 0xd7, - 0xdd, 0x8a, 0xc2, 0xc4, 0x2d, 0x20, 0xc8, 0x50, 0xfc, 0xb2, 0x8d, 0x34, - 0x5d, 0xbd, 0x31, 0x11, 0x7c, 0xcd, 0x63, 0xc7, 0xd2, 0x8e, 0x2f, 0x3f, - 0x8e, 0xb6, 0x5b, 0xd4, 0x76, 0x9a, 0xdd, 0x73, 0x7b, 0xee, 0x54, 0x97, - 0xa6, 0x35, 0x20, 0xdd, 0xf9, 0x68, 0xfe, 0xf6, 0x82, 0xe3, 0x98, 0x74, - 0x4b, 0x66, 0x08, 0x9e, 0xab, 0x0e, 0x55, 0x30, 0x41, 0xc3, 0x7c, 0xff, - 0x32, 0xca, 0x23, 0x44, 0xb9, 0x17, 0xaf, 0xca, 0x0b, 0xf7, 0x6b, 0xfc, - 0x1c, 0x5b, 0x4e, 0x8b, 0xb6, 0x08, 0x39, 0x78, 0x86, 0x8d, 0x02, 0x56, - 0xe9, 0x4d, 0x2e, 0xaf, 0xd7, 0x5d, 0xac, 0xd9, 0x80, 0x41, 0x21, 0x82, - 0xd0, 0xc2, 0x70, 0x4a, 0xc8, 0x62, 0xe1, 0xb9, 0x1f, 0x64, 0x43, 0x4d, - 0x8f, 0x55, 0x69, 0x42, 0xd7, 0xc1, 0xaf, 0x10, 0x78, 0xc4, 0x09, 0xe1, - 0x9c, 0x26, 0x9b, 0x5c, 0x88, 0x22, 0x19, 0x49, 0x1c, 0x25, 0xbd, 0x99, - 0x41, 0x70, 0x22, 0xbf, 0x62, 0xcb, 0x95, 0x8b, 0x16, 0x22, 0xdb, 0xca, - 0x67, 0x11, 0xba, 0xe8, 0xf7, 0xe1, 0x28, 0xb7, 0x60, 0xf4, 0x28, 0x10, - 0x49, 0x0e, 0x95, 0x3f, 0x1c, 0x85, 0x9f, 0x23, 0x6e, 0x77, 0xde, 0x9b, - 0x06, 0x23, 0x72, 0x93, 0x82, 0xad, 0xe4, 0xb4, 0x38, 0x12, 0x2d, 0xca, - 0x82, 0x40, 0xa3, 0x61, 0x03, 0xe2, 0x26, 0x18, 0x40, 0xfe, 0xc1, 0xc0, - 0x22, 0xda, 0x5d, 0x1d, 0x88, 0x58, 0x1e, 0x38, 0xaa, 0x99, 0x32, 0x15, - 0x94, 0x79, 0x1d, 0xf1, 0x53, 0x35, 0x44, 0x4e, 0x65, 0xd9, 0xfe, 0x26, - 0x85, 0x09, 0x6c, 0x96, 0xe1, 0x5f, 0xee, 0x7d, 0x85, 0x6e, 0xf8, 0x73, - 0x95, 0x77, 0x50, 0x4c, 0x85, 0x15, 0x2c, 0x06, 0xdb, 0xda, 0xb4, 0xd7, - 0xe9, 0xc7, 0xe1, 0x77, 0x68, 0x5b, 0x2a, 0x24, 0x39, 0x28, 0x08, 0xd8, - 0x67, 0x37, 0xdf, 0x72, 0x03, 0x37, 0x1b, 0x87, 0xd0, 0x91, 0x81, 0x47, - 0xdf, 0xf6, 0x5f, 0x95, 0x6b, 0x3a, 0x06, 0x53, 0x35, 0xfa, 0x04, 0x9a, - 0x81, 0x6b, 0xfc, 0xb3, 0x44, 0xca, 0x33, 0xce, 0x65, 0xcd, 0x70, 0xc1, - 0xcd, 0x39, 0x41, 0x01, 0x89, 0x5a, 0xe3, 0x4e, 0x3d, 0xfc, 0xb0, 0x45, - 0x43, 0x81, 0x01, 0x28, 0xe2, 0x88, 0x0a, 0x8c, 0x78, 0x50, 0xa7, 0xf2, - 0xc8, 0xa0, 0x31, 0xd2, 0xa3, 0xf2, 0xc1, 0x5a, 0x10, 0x0d, 0x29, 0xd7, - 0x3a, 0x85, 0x28, 0xac, 0xff, 0xbc, 0x9f, 0x75, 0x92, 0xf3, 0x4a, 0xe6, - 0x34, 0xb6, 0x85, 0x55, 0x32, 0x2c, 0x7d, 0xee, 0xf8, 0x6a, 0xe3, 0xac, - 0xd6, 0x36, 0x64, 0x11, 0x41, 0x70, 0xfa, 0x7f, 0xa1, 0x82, 0x89, 0xb5, - 0x2e, 0xb9, 0xae, 0xd0, 0x2a, 0x2e, 0xb0, 0x19, 0x82, 0x0f, 0x65, 0x72, - 0x66, 0xa7, 0xef, 0x06, 0x61, 0x6d, 0xa3, 0x98, 0x52, 0xbc, 0xf6, 0xf8, - 0x8c, 0xc6, 0x29, 0x50, 0x75, 0x36, 0x3e, 0x5a, 0xeb, 0x71, 0xf4, 0x12, - 0x07, 0xdd, 0x2a, 0x73, 0x8e, 0xa0, 0x7f, 0x26, 0x6c, 0x6e, 0x08, 0xe3, - 0xc6, 0xdb, 0x2c, 0xf7, 0x58, 0x09, 0xcd, 0x5a, 0xef, 0x83, 0xe8, 0x08, - 0x87, 0x20, 0xac, 0xcf, 0xa0, 0x2d, 0x14, 0x07, 0x06, 0xa8, 0xbf, 0xc7, - 0xa4, 0xa8, 0x13, 0x33, 0xf9, 0x2b, 0x32, 0xed, 0xab, 0x9a, 0x19, 0x4d, - 0xf9, 0xb3, 0x08, 0x25, 0x12, 0xff, 0x50, 0x03, 0xcb, 0xdb, 0x93, 0x3a, - 0x62, 0x65, 0x93, 0x78, 0x14, 0x8a, 0x49, 0x4f, 0x07, 0x7f, 0x35, 0x1f, - 0x63, 0x11, 0x31, 0xc8, 0x8e, 0x52, 0xad, 0x56, 0x0f, 0xd8, 0x14, 0xbc, - 0x0b, 0x27, 0x50, 0x31, 0xa8, 0x15, 0x94, 0x93, 0x1c, 0x10, 0x50, 0x9d, - 0xdc, 0x5e, 0x7f, 0x33, 0xcc, 0x1b, 0xd3, 0x49, 0x97, 0xbe, 0xdf, 0x83, - 0xd2, 0x29, 0x4a, 0xb8, 0x2d, 0xc5, 0xd1, 0x1b, 0xa1, 0x6e, 0x62, 0xea, - 0xd1, 0xda, 0xf7, 0x54, 0xb0, 0x8e, 0x98, 0x4b, 0xa6, 0x68, 0x81, 0x45, - 0xf2, 0x9f, 0xb9, 0xad, 0x31, 0xc1, 0xa2, 0x43, 0x87, 0xe9, 0x66, 0xd1, - 0x38, 0xa0, 0x31, 0x71, 0x7e, 0x38, 0x8c, 0xf2, 0x4d, 0x26, 0x4d, 0xec, - 0x3e, 0x94, 0x25, 0x0b, 0x9f, 0x05, 0xf6, 0xc0, 0x57, 0x13, 0x7f, 0x03, - 0xc8, 0xc3, 0x11, 0x8b, 0xb8, 0x49, 0x6c, 0x39, 0xd9, 0x86, 0xff, 0xfb, - 0x07, 0xad, 0xe9, 0x78, 0x41, 0x5b, 0x38, 0x94, 0x09, 0x56, 0xaf, 0x45, - 0x48, 0x79, 0x63, 0xea, 0xd6, 0xcc, 0x16, 0x3c, 0x8b, 0xb1, 0x99, 0x07, - 0xec, 0xf8, 0x34, 0xbc, 0x7d, 0xc8, 0xd5, 0x8c, 0xce, 0xaa, 0x70, 0x26, - 0x2d, 0x74, 0xec, 0xa5, 0xd8, 0x99, 0x91, 0x3f, 0xd5, 0x5a, 0xdc, 0xd1, - 0x2e, 0xfa, 0x36, 0x7b, 0x17, 0x9b, 0x40, 0xb8, 0xe3, 0x37, 0xe4, 0x2b, - 0x86, 0x5a, 0x67, 0x76, 0xce, 0x6a, 0xaa, 0x40, 0x93, 0x7d, 0x75, 0x6a, - 0x8d, 0xd6, 0xec, 0xbf, 0xea, 0x13, 0x24, 0x15, 0x22, 0xba, 0xe1, 0x5c, - 0xf2, 0x23, 0x78, 0x92, 0xf1, 0xd2, 0xe1, 0x97, 0xa1, 0x9f, 0x82, 0x4b, - 0x51, 0x8a, 0x75, 0xac, 0x23, 0x68, 0xd7, 0x94, 0xf0, 0x72, 0x96, 0x89, - 0xbd, 0xd6, 0xee, 0xfd, 0xb4, 0xd9, 0x9c, 0x65, 0xb4, 0x34, 0xaf, 0x79, - 0xa9, 0xc6, 0x2c, 0xc4, 0x4c, 0x3b, 0x34, 0xc6, 0x15, 0xf7, 0x55, 0x89, - 0xc2, 0x3d, 0x8d, 0x6a, 0x71, 0x0f, 0x78, 0x22, 0xdd, 0x48, 0xdb, 0xd4, - 0x75, 0x6e, 0xe0, 0x76, 0x43, 0xd1, 0xea, 0x6e, 0x35, 0x3f, 0x6e, 0x55, - 0x88, 0xc5, 0x5c, 0x8f, 0x19, 0x08, 0x76, 0x1f, 0xe8, 0xa1, 0x20, 0x2f, - 0x97, 0x18, 0x2c, 0x3b, 0x7e, 0x11, 0xfb, 0xad, 0xe4, 0x29, 0xbe, 0x10, - 0x16, 0x15, 0x48, 0xac, 0x06, 0xfa, 0x4e, 0xd9, 0xeb, 0xee, 0x83, 0x69, - 0x87, 0x96, 0xea, 0xe9, 0xf7, 0xce, 0x4a, 0x61, 0xf5, 0x21, 0x04, 0x0d, - 0xaf, 0x67, 0xf4, 0x6f, 0x3a, 0x8b, 0xa5, 0x99, 0x34, 0xc4, 0xa5, 0xd3, - 0x5d, 0x56, 0x1d, 0x0e, 0x81, 0x2a, 0x90, 0xd7, 0x3d, 0xdd, 0xfc, 0x97, - 0xc0, 0xe7, 0x13, 0x88, 0x40, 0x97, 0x0c, 0xe7, 0x90, 0x95, 0x22, 0xd1, - 0x42, 0x0f, 0xc5, 0x6a, 0xc6, 0xb0, 0x9c, 0x74, 0xbb, 0x29, 0xf0, 0xd9, - 0xde, 0x7e, 0x04, 0xce, 0x10, 0xc0, 0xa7, 0xb7, 0x69, 0x9a, 0xcb, 0x96, - 0x49, 0xf7, 0x96, 0x7f, 0xe8, 0x86, 0xd8, 0xea, 0xb5, 0xf7, 0x40, 0x2a, - 0x0d, 0xbb, 0xa4, 0xa8, 0xb8, 0x89, 0x2a, 0x9b, 0x08, 0xd9, 0x13, 0x33, - 0x7f, 0x2e, 0x3d, 0x3f, 0x04, 0x78, 0x46, 0x17, 0x95, 0x0b, 0xa7, 0xfd, - 0x1a, 0xa3, 0x59, 0x5f, 0x14, 0x8f, 0x6e, 0x2b, 0xba, 0xde, 0x06, 0x3c, - 0x7f, 0xd7, 0xf2, 0x8e, 0x1c, 0x9d, 0x4b, 0x3d, 0x82, 0xd5, 0x8f, 0xfd, - 0x84, 0xd1, 0x0d, 0x5e, 0x44, 0xff, 0xb2, 0x57, 0x55, 0x69, 0xfb, 0x3d, - 0x3b, 0x2c, 0x82, 0xb7, 0x3e, 0x69, 0x58, 0x20, 0xbf, 0x9c, 0x7c, 0x5d, - 0xbc, 0xbb, 0x66, 0x2a, 0xb1, 0xa4, 0x99, 0xec, 0x95, 0x5d, 0x21, 0x81, - 0x0a, 0x7e, 0x79, 0x97, 0xf3, 0x56, 0x64, 0xeb, 0xa2, 0xb3, 0x98, 0x5f, - 0x25, 0xd0, 0x89, 0x84, 0x10, 0x72, 0x99, 0xfe, 0x3f, 0xda, 0x42, 0x7e, - 0x21, 0xba, 0xa3, 0x90, 0xc7, 0x59, 0x6c, 0xd8, 0xda, 0x94, 0xe6, 0x2d, - 0x18, 0xe8, 0x70, 0x20, 0x9d, 0xeb, 0x49, 0x16, 0xac, 0x6d, 0x81, 0xa7, - 0xc7, 0x7d, 0xbb, 0x6e, 0x23, 0xe0, 0xc7, 0xbc, 0x85, 0x6f, 0xc8, 0xb8, - 0xfb, 0xe3, 0xc6, 0xb3, 0xf5, 0x92, 0xe4, 0x04, 0x18, 0x36, 0x44, 0xab, - 0x4d, 0xff, 0x2b, 0xfb, 0x4f, 0x2a, 0x21, 0xf2, 0xe8, 0xbf, 0x8e, 0x1f, - 0x1f, 0xed, 0x31, 0xc1, 0x0b, 0xe8, 0x75, 0x6b, 0xd6, 0xab, 0xe5, 0x55, - 0xe1, 0x11, 0xaa, 0x6c, 0x7e, 0x4b, 0x6a, 0xee, 0x74, 0x2c, 0xf1, 0x6d, - 0x06, 0x4c, 0xda, 0x28, 0x7f, 0x91, 0xaf, 0xab, 0x65, 0x32, 0x00, 0x8d, - 0xd6, 0x1d, 0xd3, 0x03, 0xec, 0x45, 0xb8, 0x2f, 0x5d, 0x1d, 0xd5, 0x54, - 0x3c, 0xd9, 0x9c, 0xaf, 0x9a, 0x40, 0xf0, 0x22, 0xbb, 0x1c, 0x92, 0x08, - 0xf6, 0x34, 0x78, 0x56, 0x8b, 0xcc, 0x88, 0xb9, 0x3c, 0xfe, 0xaa, 0xf6, - 0xa8, 0x0b, 0x48, 0x49, 0xed, 0x91, 0xec, 0x65, 0x0f, 0x90, 0x08, 0x3b, - 0x32, 0x8c, 0x62, 0x67, 0xc5, 0x7c, 0x14, 0x6f, 0x48, 0x50, 0x26, 0xe5, - 0x52, 0x11, 0x08, 0x2a, 0x8d, 0x22, 0x61, 0x17, 0x2a, 0x51, 0x91, 0x8f, - 0x58, 0x02, 0x8d, 0x6d, 0x12, 0x90, 0x66, 0x18, 0x67, 0xf2, 0xc0, 0x12, - 0xaf, 0xb5, 0xc6, 0xdd, 0xda, 0x40, 0xe0, 0x9c, 0xb9, 0xee, 0x47, 0xe5, - 0x06, 0xaa, 0x6c, 0xb2, 0x5e, 0x9e, 0x3a, 0x12, 0x91, 0xe4, 0x81, 0xa1, - 0x26, 0xad, 0x69, 0x35, 0x51, 0x13, 0x05, 0xe1, 0xfb, 0xb8, 0x95, 0x4f, - 0xb1, 0x73, 0xa0, 0xfa, 0xf0, 0xbd, 0xa9, 0x07, 0xf4, 0x15, 0x88, 0xd0, - 0x2e, 0x5a, 0xbe, 0xe8, 0x2b, 0x6c, 0xa5, 0x88, 0x57, 0x3e, 0x50, 0xc9, - 0xf4, 0xd1, 0x95, 0x91, 0x5b, 0x2d, 0x60, 0x1b, 0xf5, 0x60, 0xa5, 0x15, - 0xef, 0x74, 0x35, 0xbc, 0x91, 0x04, 0x39, 0x9f, 0x79, 0x89, 0x4e, 0xbf, - 0x78, 0x8c, 0xf4, 0x34, 0x73, 0x4d, 0x51, 0x78, 0x09, 0x71, 0x17, 0xac, - 0xbd, 0x38, 0x1d, 0x41, 0x34, 0xdb, 0x96, 0x62, 0x07, 0xa0, 0x88, 0x0a, - 0xa4, 0x15, 0x3b, 0x86, 0x29, 0xf1, 0xe6, 0x96, 0x19, 0xfd, 0xac, 0x8a, - 0xe8, 0xbf, 0x9b, 0x6e, 0x76, 0xf1, 0xe4, 0x6d, 0x3f, 0xa2, 0x53, 0x6c, - 0x5d, 0x0c, 0x9a, 0x0d, 0xab, 0x90, 0x98, 0x51, 0xef, 0x97, 0x37, 0x68, - 0x3e, 0xee, 0x48, 0x00, 0xd2, 0x8f, 0x4a, 0xd7, 0xb4, 0x1f, 0x82, 0xc4, - 0x82, 0x2e, 0xb7, 0xab, 0xa9, 0x20, 0xc1, 0xc7, 0x66, 0xf5, 0x3c, 0xdb, - 0x0d, 0x67, 0x51, 0x84, 0xd3, 0xbb, 0xe3, 0x4c, 0x5a, 0x50, 0xb2, 0x58, - 0xba, 0x3a, 0xf1, 0x1e, 0x92, 0x00, 0x9d, 0x3b, 0x32, 0x6f, 0xcd, 0xfd, - 0x6c, 0x5a, 0xcb, 0x68, 0xfa, 0x25, 0x33, 0x67, 0x7a, 0x47, 0x30, 0x6d, - 0x48, 0x3d, 0x31, 0xd2, 0x54, 0xdf, 0xdc, 0x2c, 0xd0, 0xf7, 0x90, 0x29, - 0xc9, 0x38, 0x90, 0xde, 0xa6, 0xd2, 0x57, 0x71, 0xe5, 0x8d, 0x63, 0x7b, - 0x41, 0x5a, 0x51, 0x1c, 0x98, 0xca, 0xe2, 0x7f, 0xa3, 0x1e, 0x88, 0x4c, - 0xfe, 0x3a, 0x94, 0x30, 0xff, 0x26, 0x41, 0xc5, 0x0f, 0x87, 0x0e, 0x14, - 0xa8, 0xc0, 0x38, 0x56, 0x4b, 0x97, 0x0d, 0x6d, 0x25, 0xdc, 0xbd, 0xae, - 0x6c, 0xd8, 0x55, 0xe7, 0xe3, 0x8a, 0xdf, 0x23, 0xe0, 0x14, 0x23, 0x20, - 0xc0, 0x2d, 0x27, 0x82, 0x1e, 0x75, 0xba, 0xee, 0x41, 0xd6, 0xc3, 0x78, - 0x2c, 0x11, 0x2b, 0xb9, 0xcf, 0xb7, 0xfe, 0xf4, 0x87, 0xd8, 0xa0, 0xf3, - 0xa6, 0x8c, 0x2e, 0x12, 0xb4, 0x1b, 0xc6, 0xf8, 0x4a, 0x8d, 0xc7, 0xdf, - 0xad, 0x86, 0x67, 0x17, 0x7c, 0xc4, 0xac, 0x0c, 0xd9, 0x5c, 0x45, 0xbd, - 0x96, 0x85, 0xb9, 0x62, 0x24, 0x22, 0x97, 0x80, 0xbc, 0xdf, 0xac, 0xe4, - 0x25, 0x23, 0x63, 0xa7, 0x4b, 0x28, 0xa5, 0x59, 0xb1, 0x13, 0x06, 0x38, - 0xea, 0xf6, 0x50, 0x6b, 0x0e, 0x0f, 0xf8, 0xfe, 0x49, 0x69, 0xc1, 0xcc, - 0x71, 0xbf, 0x45, 0x38, 0xe6, 0x9c, 0x75, 0xc7, 0x66, 0x58, 0x9b, 0x9e, - 0x68, 0xf9, 0xc4, 0x97, 0x75, 0x50, 0xa3, 0x6e, 0x9f, 0xf2, 0x6e, 0x3f, - 0xe6, 0xc3, 0xc0, 0xe6, 0x07, 0xed, 0xa1, 0x6e, 0xa3, 0xa5, 0xff, 0xda, - 0xcc, 0x26, 0xd7, 0x7c, 0xd1, 0x48, 0xae, 0x9c, 0x88, 0x05, 0x91, 0x28, - 0xf8, 0x7b, 0x70, 0x60, 0xc7, 0xd2, 0x30, 0x4d, 0x06, 0x49, 0x93, 0xa6, - 0x92, 0x71, 0x52, 0xe6, 0xad, 0xfa, 0x0c, 0xe1, 0x88, 0xf3, 0x11, 0x8a, - 0x88, 0x15, 0xa3, 0x35, 0x56, 0x6d, 0xc6, 0x0a, 0x5f, 0x6b, 0xeb, 0x31, - 0x1a, 0x23, 0x68, 0x63, 0x7f, 0x56, 0xe3, 0x6b, 0xb8, 0xce, 0xfb, 0xe6, - 0x0e, 0x40, 0x6c, 0xbc, 0x38, 0xb7, 0x2d, 0xdd, 0xc2, 0x51, 0xef, 0x46, - 0x4b, 0xa8, 0xee, 0x6a, 0x69, 0x4a, 0xb3, 0xdd, 0x4c, 0xb8, 0x97, 0x84, - 0xe2, 0xf0, 0x39, 0x5e, 0xec, 0x20, 0xd9, 0xec, 0x38, 0xcc, 0x51, 0x8a, - 0xc3, 0xff, 0xe5, 0x0b, 0x5e, 0x88, 0xea, 0xc8, 0x25, 0xe2, 0x9d, 0x1d, - 0xc3, 0x3e, 0x40, 0x01, 0x04, 0x59, 0x0e, 0x55, 0xe4, 0x90, 0xa3, 0x55, - 0xf7, 0xb0, 0x5b, 0xc6, 0x38, 0xdd, 0xb7, 0x70, 0xc8, 0xd1, 0x9b, 0x8c, - 0x4e, 0x11, 0x2f, 0xc0, 0x48, 0x5e, 0x2e, 0x47, 0xd3, 0x7f, 0xc5, 0x40, - 0x90, 0xaf, 0x30, 0x4e, 0x71, 0x70, 0xc1, 0xa4, 0x01, 0x7b, 0x74, 0x0b, - 0xfc, 0xfb, 0x40, 0xeb, 0x58, 0x80, 0xb6, 0x92, 0x8a, 0xfa, 0x59, 0x33, - 0x7d, 0x70, 0x56, 0x5a, 0x1c, 0x0b, 0x3c, 0x27, 0xe3, 0xa8, 0xf6, 0x32, - 0x32, 0x1b, 0x50, 0x75, 0x12, 0xab, 0xcf, 0xc7, 0x42, 0xc2, 0xb0, 0xaa, - 0x4c, 0x24, 0x70, 0xbf, 0x54, 0x03, 0x8d, 0xb8, 0xe6, 0xa7, 0xca, 0x87, - 0x96, 0xc7, 0x13, 0x89, 0x35, 0x99, 0x2c, 0x30, 0x5b, 0x06, 0x44, 0x70, - 0x0d, 0x4e, 0x82, 0x13, 0x9e, 0x41, 0x2c, 0x29, 0xa5, 0x27, 0xf4, 0xa7, - 0x03, 0x6b, 0x5f, 0x25, 0x41, 0x1d, 0x17, 0xe8, 0x28, 0x80, 0x7d, 0x65, - 0xff, 0xd6, 0x4a, 0xdd, 0xa6, 0xdb, 0x0a, 0x78, 0xfd, 0x07, 0xb4, 0x3e, - 0x7a, 0x33, 0xd7, 0xbd, 0xea, 0x36, 0x07, 0x8e, 0x96, 0xd4, 0xdf, 0x79, - 0x11, 0xf3, 0x85, 0x19, 0x0f, 0x0f, 0x5a, 0xf5, 0x61, 0x0f, 0x62, 0x78, - 0xb7, 0xe3, 0xe2, 0xc7, 0xbd, 0xe2, 0xb1, 0xda, 0x04, 0x3b, 0x3c, 0xbf, - 0x0c, 0x7d, 0xc1, 0x2f, 0xe0, 0xf9, 0xae, 0x0d, 0x2e, 0x8f, 0xb9, 0x52, - 0x7c, 0x1b, 0xda, 0x7a, 0x98, 0x05, 0xaa, 0xac, 0xea, 0xa2, 0xff, 0xc1, - 0x5f, 0xdb, 0x12, 0x7c, 0x37, 0xbf, 0x53, 0x7d, 0x2f, 0xeb, 0x39, 0x72, - 0x9f, 0xc3, 0xd5, 0x0b, 0x5f, 0x0d, 0x4c, 0xe8, 0x97, 0x53, 0xfc, 0x38, - 0x51, 0x22, 0x9f, 0x4d, 0x50, 0x13, 0x62, 0x68, 0xc4, 0x4b, 0xe9, 0x52, - 0x36, 0x3d, 0xc7, 0x34, 0x5c, 0xad, 0xe1, 0x7c, 0x02, 0x33, 0xb9, 0x98, - 0x93, 0x7f, 0x32, 0x5b, 0x79, 0x5e, 0x95, 0xda, 0xa7, 0xf9, 0x85, 0xf3, - 0xc0, 0x83, 0xc9, 0xa5, 0x01, 0x8e, 0x73, 0xc0, 0x81, 0x09, 0xdf, 0xf5, - 0x58, 0x23, 0x1d, 0x84, 0x73, 0x91, 0x86, 0xaf, 0x69, 0x05, 0x5b, 0xb9, - 0x1f, 0x8d, 0x67, 0x0e, 0x9c, 0xf6, 0xfb, 0xcd, 0x5a, 0xfc, 0x42, 0xeb, - 0x68, 0x5b, 0x97, 0x4e, 0x54, 0x57, 0xe0, 0x6a, 0x46, 0x8c, 0x06, 0x57, - 0x54, 0xc9, 0xc5, 0x0c, 0x10, 0x34, 0xd7, 0x7c, 0x64, 0xef, 0x21, 0x78, - 0xc0, 0x66, 0x54, 0x2a, 0xc1, 0x94, 0x19, 0x7d, 0xb1, 0x9e, 0x5d, 0x0d, - 0x7a, 0x65, 0x35, 0x9b, 0x0b, 0xb5, 0xfe, 0xff, 0x30, 0xa2, 0xfd, 0xd5, - 0xfd, 0x08, 0xd3, 0x53, 0xc4, 0x59, 0x9e, 0x44, 0xec, 0x86, 0x50, 0x06, - 0x01, 0x61, 0xef, 0xc3, 0xfb, 0x95, 0x52, 0x54, 0x93, 0x02, 0x76, 0xfd, - 0x76, 0x58, 0x47, 0x91, 0xb0, 0xf7, 0xe1, 0x98, 0x26, 0x0b, 0xec, 0xbb, - 0x07, 0x2b, 0xb7, 0x50, 0x0b, 0xd0, 0x41, 0xb7, 0x6f, 0x92, 0xe0, 0xf1, - 0x1b, 0x04, 0xbb, 0xc0, 0xbb, 0x6f, 0xff, 0x29, 0x67, 0x3e, 0x7e, 0x45, - 0x9e, 0xc9, 0xf9, 0x0c, 0xef, 0xd2, 0x88, 0x42, 0xf5, 0x48, 0xf7, 0xd8, - 0x8b, 0xf6, 0x4c, 0xfc, 0xdc, 0x3e, 0x94, 0xf7, 0xc7, 0x8c, 0xa7, 0x25, - 0x18, 0x5f, 0x8a, 0x7c, 0x37, 0x88, 0xe6, 0x72, 0xa6, 0x2a, 0xf7, 0xd0, - 0xce, 0x99, 0x8c, 0xdb, 0xff, 0x83, 0x4c, 0x35, 0xfa, 0xa2, 0x83, 0xf7, - 0x16, 0x6b, 0xd3, 0x22, 0x34, 0x19, 0x81, 0x53, 0xd7, 0x5b, 0x35, 0xf2, - 0xfd, 0xa7, 0xeb, 0xea, 0xfd, 0x51, 0x24, 0xae, 0x56, 0xf9, 0x0b, 0x90, - 0xd2, 0xad, 0x89, 0xe6, 0x9b, 0x7a, 0x29, 0x2e, 0xe8, 0xbd, 0xfa, 0x0a, - 0xeb, 0xa3, 0x70, 0xcb, 0x68, 0xfd, 0x54, 0x0b, 0x26, 0x3c, 0x1e, 0x0a, - 0x4c, 0xa1, 0x27, 0xd8, 0xec, 0x8e, 0xac, 0xe6, 0xa6, 0xc5, 0xfe, 0xd6, - 0xb2, 0x47, 0x12, 0x95, 0xcc, 0xbb, 0x8b, 0xdd, 0x92, 0x27, 0x78, 0xc2, - 0x96, 0x14, 0xe5, 0x19, 0xda, 0x28, 0xd7, 0x6d, 0x21, 0xa0, 0x29, 0xb2, - 0xaf, 0xe5, 0xef, 0x8f, 0xc5, 0x40, 0xff, 0x21, 0xdb, 0x0e, 0x8d, 0xa0, - 0x9e, 0xc6, 0x63, 0x18, 0x29, 0x15, 0x96, 0x67, 0xf4, 0xf1, 0x56, 0x83, - 0xe3, 0x0d, 0xbe, 0xad, 0x87, 0x67, 0x90, 0xf7, 0x0f, 0x31, 0xe2, 0xca, - 0xd9, 0x2e, 0x18, 0xef, 0x65, 0x65, 0x14, 0x8a, 0x77, 0x03, 0x90, 0xdf, - 0xe1, 0x48, 0x05, 0x3f, 0xf3, 0xd3, 0xa3, 0x6e, 0xa8, 0xf0, 0x26, 0x64, - 0x61, 0x81, 0x40, 0x6f, 0xcb, 0x9c, 0xd9, 0xe8, 0xc9, 0x1a, 0xc9, 0x3a, - 0x57, 0x60, 0x12, 0x24, 0x7c, 0x04, 0x1a, 0xbb, 0xaa, 0x2d, 0x53, 0x56, - 0xd2, 0xaa, 0xd9, 0x49, 0x90, 0x5d, 0xc3, 0x5a, 0xeb, 0x68, 0x84, 0x2e, - 0xf4, 0x3e, 0x80, 0xe0, 0x6d, 0xed, 0x16, 0x11, 0xa1, 0xc1, 0x76, 0x09, - 0x11, 0xec, 0x51, 0x09, 0x02, 0x8f, 0xb6, 0xf0, 0x04, 0x2c, 0x0f, 0xb4, - 0x37, 0x30, 0x90, 0x29, 0xec, 0x4e, 0x81, 0xe7, 0xf0, 0x0c, 0x32, 0xa5, - 0xd2, 0xc1, 0xef, 0x69, 0x08, 0x28, 0xe4, 0x64, 0xd5, 0x52, 0x48, 0x07, - 0x38, 0x8c, 0x57, 0x31, 0xbc, 0xd2, 0xb8, 0xca, 0xde, 0xb5, 0xd8, 0x17, - 0x38, 0x65, 0xc4, 0x9b, 0x62, 0x41, 0xf4, 0xa6, 0xa2, 0xaa, 0x51, 0x6f, - 0xf6, 0x2d, 0xd9, 0xa4, 0xd5, 0x6e, 0x9c, 0xa0, 0x3b, 0xba, 0xc3, 0x5a, - 0x8e, 0x6a, 0xcc, 0x20, 0x09, 0x34, 0x24, 0x07, 0x88, 0xac, 0x9e, 0xbd, - 0x63, 0xaa, 0x41, 0x34, 0xe2, 0x81, 0x55, 0xa3, 0x29, 0x9f, 0x32, 0x69, - 0x37, 0x27, 0xa6, 0x83, 0xaf, 0x8c, 0xb8, 0x82, 0x07, 0x9f, 0x11, 0x03, - 0x49, 0x20, 0x76, 0xc2, 0xb5, 0x6c, 0xf8, 0x5e, 0x16, 0x96, 0x95, 0x81, - 0x0c, 0x5d, 0xe7, 0x20, 0x1f, 0xe3, 0x94, 0xe8, 0x1a, 0x83, 0x63, 0x0b, - 0x1d, 0x93, 0x6f, 0xd7, 0x89, 0xeb, 0x1b, 0x62, 0x02, 0xcf, 0x6d, 0xbb, - 0xe6, 0x45, 0x7e, 0xa9, 0x63, 0x21, 0xca, 0xb4, 0x3c, 0x53, 0x4c, 0x1c, - 0x9d, 0x69, 0x07, 0x64, 0x6b, 0xb8, 0xbf, 0x5b, 0xd3, 0xb3, 0x8d, 0x79, - 0xff, 0x04, 0x69, 0x00, 0x5b, 0xb4, 0x6d, 0x60, 0x76, 0x2e, 0x94, 0xc3, - 0xaa, 0x33, 0x7e, 0x99, 0x26, 0x7e, 0xfa, 0xe2, 0x2e, 0xa5, 0xfa, 0x1c, - 0xc2, 0xd2, 0x14, 0xdf, 0x47, 0xc8, 0x57, 0x11, 0x74, 0x36, 0x48, 0x0d, - 0x74, 0xf7, 0xc1, 0x8d, 0xc7, 0xdb, 0xe1, 0x22, 0xe3, 0xa2, 0x4a, 0xc8, - 0xd6, 0xcf, 0x99, 0xbb, 0x98, 0xf5, 0x0a, 0xc8, 0x7a, 0xf8, 0xc1, 0x84, - 0xf8, 0x49, 0x65, 0x36, 0x10, 0x39, 0x4f, 0x73, 0x08, 0x19, 0x7f, 0x5e, - 0xf7, 0xac, 0xe6, 0xf5, 0x06, 0x51, 0xdb, 0x1f, 0x4b, 0xc7, 0x76, 0xfe, - 0x9a, 0x40, 0xfa, 0xc8, 0x8d, 0x33, 0x9a, 0xaf, 0x92, 0x40, 0x82, 0xfb, - 0xd0, 0x29, 0x8d, 0xac, 0x41, 0xaf, 0x73, 0x6b, 0x69, 0xa2, 0x54, 0x2c, - 0x33, 0xcc, 0x68, 0xdd, 0xc6, 0x0b, 0xa5, 0xd7, 0xc9, 0x64, 0x49, 0x17, - 0x41, 0x60, 0x1a, 0x8f, 0x29, 0x03, 0x4d, 0xb2, 0xd3, 0xe4, 0x7c, 0x3d, - 0x17, 0x1a, 0x9c, 0xe6, 0x5b, 0xfc, 0x7d, 0xda, 0xa5, 0xb2, 0xc1, 0x2e, - 0xfd, 0x91, 0xfa, 0x1a, 0x4a, 0x71, 0x50, 0x3b, 0x00, 0xf2, 0xef, 0xef, - 0xaf, 0x85, 0xe3, 0xf8, 0x51, 0x0e, 0x1d, 0x94, 0xd5, 0x62, 0x88, 0xf6, - 0x5d, 0xa8, 0x1c, 0x7f, 0x77, 0x4a, 0x4d, 0xb4, 0x6f, 0xdd, 0x51, 0x79, - 0xa2, 0x7d, 0x50, 0x81, 0x52, 0xfe, 0x68, 0x91, 0xcc, 0x37, 0x3e, 0x75, - 0xb6, 0xa4, 0xf8, 0xb7, 0x1c, 0x6d, 0x1a, 0x77, 0x1b, 0x69, 0x0d, 0x3f, - 0x3b, 0xb6, 0x11, 0x40, 0xcf, 0xf3, 0x1e, 0x1b, 0x13, 0x6c, 0xab, 0x8c, - 0x03, 0x02, 0xa0, 0x16, 0x8b, 0x40, 0xe0, 0xa4, 0x01, 0x37, 0x94, 0xdd, - 0x0c, 0x99, 0x35, 0xe5, 0x43, 0xac, 0xf1, 0xbe, 0x62, 0x8b, 0x70, 0xc4, - 0x67, 0xc2, 0x78, 0xcf, 0xa4, 0xb7, 0x93, 0xb4, 0x4f, 0x7d, 0x60, 0x87, - 0xd5, 0xea, 0xd3, 0xb1, 0x83, 0xa6, 0x0e, 0xf4, 0xc0, 0xe7, 0x8a, 0x9b, - 0x67, 0x25, 0xfb, 0x43, 0x84, 0xd5, 0x9b, 0xae, 0x3f, 0x7d, 0xef, 0x42, - 0x41, 0xf8, 0xe0, 0xf4, 0x7c, 0xd3, 0x6b, 0x0b, 0x64, 0x3a, 0x77, 0xb7, - 0xb4, 0xf9, 0xf1, 0xdc, 0xea, 0xa6, 0xac, 0x46, 0x5a, 0xb7, 0x9f, 0xf4, - 0x50, 0xff, 0x87, 0x9a, 0xa4, 0x37, 0x8a, 0x9e, 0x2b, 0x32, 0xb2, 0x42, - 0x23, 0xb3, 0x6b, 0xdf, 0x62, 0x58, 0x87, 0xf1, 0x6e, 0x66, 0xb0, 0x7a, - 0x8b, 0x74, 0x74, 0xd7, 0x61, 0xff, 0xaa, 0xc1, 0x12, 0x42, 0xbf, 0x14, - 0x7f, 0x27, 0x2a, 0x4c, 0x79, 0x9a, 0x08, 0x6f, 0xe6, 0xc7, 0x18, 0x5e, - 0xad, 0xdd, 0xa4, 0x19, 0x33, 0xba, 0xa8, 0xe9, 0xdd, 0x37, 0xcb, 0x8a, - 0x15, 0x55, 0xdc, 0x3b, 0xf9, 0x97, 0x89, 0x66, 0x35, 0xa2, 0xf6, 0x46, - 0x85, 0xc1, 0x5a, 0x67, 0xee, 0xc4, 0x2e, 0x02, 0x37, 0xc9, 0x91, 0xfe, - 0xfd, 0x6b, 0x74, 0x02, 0xd1, 0xf6, 0x9c, 0x0b, 0xb5, 0x6e, 0x9a, 0x7e, - 0x53, 0x05, 0x95, 0x22, 0xdb, 0x9b, 0x78, 0x21, 0x81, 0xe0, 0x2b, 0xa0, - 0xfd, 0xeb, 0xc8, 0x92, 0x7d, 0x72, 0x7d, 0x6b, 0xdd, 0x7a, 0x8a, 0x87, - 0x79, 0xad, 0x7a, 0x44, 0xf0, 0xc1, 0x72, 0xd4, 0xd1, 0x25, 0x8d, 0xc5, - 0xbd, 0x97, 0x38, 0x78, 0xfb, 0xa9, 0xc2, 0x72, 0x15, 0x86, 0xa1, 0x27, - 0x7d, 0x2e, 0xb0, 0xe7, 0xfc, 0x6e, 0xb4, 0xcc, 0x52, 0x4c, 0x9f, 0x03, - 0x75, 0x1d, 0x59, 0x47, 0x4c, 0x11, 0x6c, 0x94, 0xfc, 0x15, 0x70, 0xe6, - 0x73, 0xc7, 0xe1, 0x07, 0xe6, 0x96, 0x2d, 0x6e, 0xbe, 0x7b, 0xe4, 0xf0, - 0x4e, 0x23, 0xb7, 0xbe, 0x4e, 0xb0, 0xdc, 0xf2, 0x33, 0x74, 0x85, 0xda, - 0x8c, 0xd0, 0x2f, 0x15, 0x17, 0x8d, 0xe3, 0x1e, 0x84, 0x7a, 0x44, 0x62, - 0x85, 0x01, 0x33, 0xa8, 0xc9, 0xac, 0x43, 0x7b, 0x83, 0x47, 0xd1, 0x1c, - 0x01, 0x4a, 0x4f, 0x4e, 0xb8, 0x16, 0x3d, 0xf1, 0xed, 0x6b, 0xf4, 0x1e, - 0xad, 0x0b, 0xb7, 0xa3, 0x3d, 0x74, 0xa6, 0xfd, 0xb5, 0x43, 0xb9, 0x34, - 0x3a, 0x01, 0xde, 0x07, 0xb1, 0xe7, 0x23, 0x99, 0x04, 0x60, 0xcf, 0x08, - 0xf5, 0x35, 0x64, 0x67, 0xc7, 0x66, 0x56, 0x63, 0x39, 0xf6, 0x3d, 0x0e, - 0xf5, 0x83, 0x7b, 0xe9, 0xed, 0x4c, 0xc6, 0xc1, 0x1a, 0xaa, 0xc7, 0x06, - 0x88, 0x6c, 0xe7, 0xbe, 0x1b, 0x87, 0xb9, 0xf2, 0x39, 0x73, 0x33, 0x38, - 0xde, 0x99, 0x9c, 0xa2, 0x11, 0x34, 0x60, 0xcc, 0x90, 0xf4, 0xbd, 0x51, - 0x16, 0x87, 0x0a, 0x1a, 0x43, 0x25, 0x37, 0x60, 0x00, 0xdb, 0xa6, 0xfc, - 0x2f, 0xb7, 0xad, 0x4a, 0xd6, 0x54, 0xf6, 0x3b, 0x46, 0x08, 0xb4, 0x4a, - 0xa6, 0xf3, 0x6a, 0x4c, 0xb4, 0xdd, 0x4d, 0xab, 0x9a, 0xf4, 0xdb, 0xf2, - 0xac, 0xd6, 0xfe, 0x01, 0x19, 0x8e, 0x8d, 0xad, 0xc7, 0x1c, 0x15, 0x9d, - 0xda, 0x1f, 0xdc, 0x4c, 0x26, 0x14, 0x98, 0xac, 0xa7, 0x0e, 0x09, 0x5f, - 0xc4, 0x25, 0x78, 0x9a, 0x9c, 0x57, 0x25, 0x67, 0x04, 0x6c, 0x48, 0x4d, - 0x4e, 0x08, 0x91, 0x9e, 0x6f, 0xf1, 0x1c, 0x6c, 0x67, 0xf3, 0xe3, 0x7d, - 0x1f, 0xf7, 0x4f, 0xe1, 0x96, 0xfa, 0x99, 0xe3, 0xa9, 0x06, 0x53, 0xdf, - 0x33, 0x87, 0xc4, 0xb0, 0xf0, 0x31, 0x64, 0x4c, 0x8c, 0x5a, 0xf3, 0xd9, - 0xb7, 0xe8, 0x9e, 0xb0, 0x45, 0x9c, 0x1b, 0xec, 0x58, 0xdb, 0xbe, 0x54, - 0x00, 0xd2, 0x19, 0x76, 0x8c, 0x8a, 0x81, 0xd3, 0x2a, 0x2f, 0xab, 0x74, - 0xfd, 0x99, 0xdb, 0x92, 0x73, 0x51, 0x9d, 0x3e, 0x51, 0xa4, 0x1c, 0xe8, - 0xc8, 0x10, 0x28, 0x95, 0xbd, 0x3e, 0xc1, 0x73, 0xb9, 0xbf, 0xd6, 0x61, - 0x70, 0xe7, 0x76, 0x68, 0x23, 0x2e, 0x90, 0xc3, 0x67, 0x40, 0x30, 0x4e, - 0xcc, 0x31, 0x51, 0xf7, 0x49, 0xd4, 0x0c, 0xfd, 0x33, 0x36, 0x7f, 0xda, - 0xda, 0xf5, 0xc6, 0x0a, 0xdd, 0xae, 0x46, 0xa9, 0xb2, 0xc6, 0x24, 0x11, - 0x55, 0xd0, 0x11, 0x45, 0x81, 0xe6, 0x79, 0xd1, 0x68, 0x30, 0xbc, 0x7a, - 0xa2, 0xbb, 0xe1, 0xbc, 0x9f, 0x43, 0x2d, 0x56, 0xa2, 0xc2, 0x36, 0xaa, - 0x1d, 0x2b, 0x53, 0x3a, 0x52, 0x19, 0x6e, 0xe7, 0x95, 0x6d, 0x72, 0xe2, - 0x93, 0x6c, 0xd0, 0x74, 0x47, 0xfd, 0xf6, 0x0e, 0xc2, 0xe8, 0x7c, 0x2a, - 0x29, 0x31, 0xa0, 0x64, 0x91, 0x6f, 0x9e, 0x77, 0xfa, 0xb2, 0xf9, 0xe3, - 0x3c, 0xa9, 0xff, 0xea, 0x7b, 0x3c, 0x01, 0x70, 0xf6, 0x8e, 0x15, 0xb6, - 0xf2, 0x60, 0x07, 0x39, 0x34, 0x9c, 0x32, 0x6f, 0x40, 0x32, 0x6d, 0x54, - 0x40, 0xa1, 0xcf, 0xfb, 0x54, 0x57, 0x7c, 0x1b, 0xe0, 0x9e, 0x2c, 0xbc, - 0xe6, 0x70, 0x66, 0x6d, 0x54, 0x4e, 0xfd, 0xca, 0x8c, 0x86, 0x11, 0x30, - 0x22, 0x37, 0x0d, 0xe6, 0x0c, 0xaa, 0x4b, 0xc0, 0x1b, 0x3d, 0x48, 0x04, - 0x9c, 0xef, 0x57, 0x90, 0x55, 0xa2, 0x33, 0x7c, 0x49, 0xa5, 0x11, 0x33, - 0x50, 0x8a, 0xdf, 0x98, 0x7a, 0x5f, 0xfb, 0x69, 0x37, 0x31, 0x26, 0xed, - 0x46, 0xa1, 0x54, 0xbb, 0xe7, 0xa9, 0xef, 0x08, 0x4d, 0x70, 0x53, 0xf6, - 0x26, 0x7d, 0xed, 0x05, 0xe3, 0x9a, 0xa0, 0xa0, 0x65, 0x5f, 0x25, 0xc4, - 0xd1, 0xe7, 0x6f, 0x93, 0xaf, 0x91, 0x4f, 0x28, 0x9d, 0xfb, 0x69, 0x26, - 0xf6, 0xc4, 0x99, 0x7a, 0xc3, 0xfb, 0xe8, 0xb9, 0xb1, 0x0d, 0x7a, 0x3e, - 0x45, 0x7f, 0x31, 0x3c, 0xf9, 0x7a, 0xfe, 0xc1, 0x68, 0x11, 0x68, 0xab, - 0x40, 0x93, 0x9f, 0x4f, 0xe8, 0xe6, 0x8e, 0x7e, 0x02, 0x56, 0xe0, 0x93, - 0x42, 0x85, 0x5d, 0x70, 0x5d, 0x11, 0x7c, 0x62, 0x53, 0xe7, 0xea, 0x2b, - 0x5a, 0xa1, 0xa7, 0x4d, 0xcf, 0xaa, 0x55, 0xa3, 0x46, 0xa4, 0xce, 0xd4, - 0x01, 0xc9, 0x5b, 0x15, 0x25, 0x13, 0xdc, 0xb3, 0x4b, 0xa7, 0x87, 0xc1, - 0x2d, 0xb0, 0x2c, 0xca, 0x06, 0x7e, 0x1f, 0x48, 0xc9, 0xef, 0x7c, 0x90, - 0x86, 0x6c, 0x71, 0x75, 0x10, 0xe3, 0x88, 0x32, 0x90, 0x02, 0x46, 0xd6, - 0x7f, 0x05, 0x27, 0xdc, 0xfb, 0x2a, 0x78, 0xb7, 0x48, 0xab, 0x1b, 0xeb, - 0x3e, 0x75, 0xc4, 0xfe, 0x49, 0x23, 0xa5, 0x5c, 0x7b, 0x89, 0x4b, 0xf5, - 0x62, 0xa1, 0x27, 0xfe, 0xe4, 0x69, 0x44, 0x96, 0x62, 0x60, 0x14, 0x58, - 0xc3, 0x6b, 0xc0, 0x22, 0x15, 0xee, 0x90, 0x69, 0x6f, 0x03, 0x00, 0xa1, - 0xfc, 0x5d, 0xde, 0x86, 0x4d, 0x53, 0xc8, 0xb1, 0xb8, 0x0f, 0x1b, 0xaa, - 0x61, 0xc1, 0x53, 0xde, 0x4a, 0xe0, 0x92, 0x7a, 0x6b, 0xff, 0x03, 0x06, - 0x2f, 0xd7, 0x12, 0xca, 0x94, 0xf1, 0x48, 0xda, 0xec, 0xb5, 0x2c, 0x19, - 0x74, 0xa4, 0x02, 0xc2, 0x63, 0xae, 0xb2, 0x7e, 0x17, 0x89, 0x59, 0x6a, - 0xa5, 0x4d, 0x75, 0x30, 0x60, 0xa5, 0x89, 0xa1, 0x21, 0xa7, 0xd2, 0xe1, - 0x3f, 0xb4, 0x78, 0x20, 0x4b, 0x84, 0x36, 0xfb, 0xd3, 0x01, 0xf3, 0xad, - 0xf2, 0x11, 0x74, 0xf2, 0xa5, 0x5c, 0x17, 0x22, 0xc4, 0xb1, 0x9a, 0xfa, - 0xf2, 0x6b, 0xf4, 0xc4, 0x60, 0x4c, 0x7b, 0x63, 0x1e, 0xc3, 0x1f, 0xeb, - 0xa8, 0x62, 0xa1, 0x07, 0x04, 0x7d, 0x80, 0x4c, 0x30, 0x48, 0x98, 0xa1, - 0x2e, 0x63, 0xc0, 0x1f, 0xbe, 0xc0, 0x0a, 0x2d, 0xae, 0x13, 0xdb, 0xca, - 0x34, 0xbc, 0x86, 0xbc, 0x90, 0xb7, 0x88, 0x7b, 0x5f, 0x24, 0xf4, 0x8c, - 0xd6, 0xc5, 0x9d, 0x43, 0x32, 0xa2, 0xe3, 0xae, 0x24, 0xf3, 0x4a, 0x18, - 0xf3, 0xe9, 0x34, 0x41, 0xe0, 0x8b, 0xd5, 0x1c, 0x95, 0x7f, 0xbb, 0x6b, - 0xbf, 0x29, 0x2a, 0x80, 0xea, 0x54, 0x8f, 0x65, 0x53, 0xf5, 0x6a, 0x3b, - 0x19, 0x5d, 0x30, 0x50, 0xaa, 0x4e, 0xc2, 0x64, 0x1b, 0x11, 0x8c, 0xb2, - 0xda, 0x46, 0x36, 0xde, 0xfa, 0xd7, 0x57, 0x6f, 0xb4, 0x39, 0xc6, 0x2a, - 0x1e, 0xea, 0x85, 0x81, 0xb6, 0x3e, 0x17, 0xf8, 0x7d, 0x02, 0x30, 0x54, - 0x20, 0xce, 0x2c, 0x4e, 0x4f, 0x8b, 0xe4, 0x29, 0xdd, 0xbe, 0x9e, 0x4e, - 0x36, 0x23, 0x95, 0x82, 0xf3, 0x92, 0x58, 0x2d, 0x6c, 0xab, 0x4d, 0x3a, - 0x2f, 0x60, 0x3f, 0x0e, 0xc0, 0xff, 0x33, 0xb9, 0x20, 0x02, 0x6e, 0x5d, - 0xa7, 0xd9, 0x52, 0xca, 0xc6, 0x6a, 0x88, 0x15, 0xd7, 0x50, 0xee, 0xfd, - 0x8c, 0xf0, 0x1c, 0x73, 0x3e, 0xa5, 0xce, 0xf8, 0x78, 0x7c, 0xc0, 0xf9, - 0x5a, 0x6a, 0x0f, 0x72, 0xa8, 0xd6, 0xa7, 0x8c, 0x69, 0xdd, 0xfb, 0xc9, - 0x1a, 0xe9, 0xff, 0x8a, 0xd4, 0x9c, 0xdf, 0x83, 0x8a, 0xec, 0xfe, 0xaf, - 0xbd, 0x09, 0xd7, 0x6b, 0xa8, 0xc8, 0xe6, 0x3e, 0x89, 0x07, 0x13, 0x7b, - 0x1c, 0x7e, 0xa2, 0x0b, 0xf2, 0xc6, 0x8e, 0x20, 0x2f, 0x7d, 0x8f, 0x62, - 0x4e, 0x1b, 0xb0, 0xc7, 0xfc, 0xcb, 0xe3, 0xc0, 0x0d, 0x22, 0x0b, 0x1a, - 0x3f, 0x84, 0x1c, 0xc3, 0xd9, 0x76, 0xe2, 0xb0, 0xc7, 0xa0, 0x86, 0xae, - 0x8b, 0x6c, 0x41, 0x60, 0x83, 0xdb, 0x73, 0x92, 0x14, 0xf3, 0xf1, 0x86, - 0x7a, 0x9e, 0xc5, 0x72, 0x90, 0x69, 0xe0, 0x20, 0x88, 0xb0, 0xff, 0x20, - 0x1b, 0x66, 0xae, 0x1e, 0x69, 0x34, 0x4a, 0x4a, 0x22, 0x9e, 0xc3, 0x67, - 0x9a, 0x54, 0xb8, 0x03, 0xe4, 0x31, 0xf0, 0xd5, 0x7e, 0x5c, 0x31, 0xaf, - 0x48, 0x99, 0xf9, 0x0b, 0x2f, 0x37, 0xc8, 0xaa, 0x85, 0x5e, 0xba, 0x1d, - 0x46, 0x0d, 0xda, 0x26, 0x7e, 0x85, 0x68, 0x14, 0x54, 0xb9, 0x0c, 0x22, - 0xe2, 0xc9, 0xa7, 0xf8, 0xbb, 0x6b, 0xe9, 0xc4, 0x1c, 0x98, 0x83, 0xc1, - 0xc3, 0x8b, 0x6b, 0xbb, 0x49, 0xfe, 0x3f, 0x79, 0x47, 0xb9, 0xcb, 0x97, - 0xe3, 0xd5, 0x68, 0x56, 0xa6, 0xf4, 0xbf, 0x30, 0x5f, 0xd5, 0xa0, 0x61, - 0x1c, 0x95, 0x62, 0x78, 0x8b, 0xcc, 0x7d, 0x51, 0x8a, 0xfe, 0x74, 0x86, - 0x5a, 0x88, 0xcf, 0x8f, 0x82, 0x04, 0xb4, 0xc0, 0x69, 0x8b, 0x52, 0x94, - 0xcc, 0x83, 0x87, 0x6f, 0x67, 0x5e, 0x04, 0x7d, 0x81, 0x11, 0x6a, 0x07, - 0x77, 0x8f, 0x5c, 0x02, 0x47, 0xee, 0x7a, 0xaa, 0x7c, 0x61, 0xf7, 0x8a, - 0x47, 0x9f, 0xab, 0x41, 0x0f, 0x03, 0xcf, 0x35, 0xaa, 0xd4, 0xad, 0xcf, - 0xc0, 0xfb, 0xc8, 0x3f, 0x4e, 0xda, 0xb6, 0xa4, 0xc0, 0xc8, 0x2e, 0x78, - 0x65, 0x39, 0x4f, 0xad, 0x35, 0x7f, 0xc6, 0x52, 0x22, 0x68, 0x6c, 0x48, - 0x01, 0x47, 0x6f, 0xc3, 0x1e, 0x19, 0xcc, 0x29, 0x33, 0x13, 0xfd, 0x9f, - 0x68, 0x05, 0x94, 0x1c, 0xfa, 0xc8, 0xd8, 0xf8, 0x6e, 0x13, 0x00, 0xf0, - 0x64, 0x67, 0x07, 0x30, 0x4c, 0x17, 0x72, 0x72, 0x59, 0x35, 0xa3, 0x53, - 0x48, 0x19, 0x22, 0x0b, 0x87, 0x40, 0x4a, 0xa6, 0xac, 0x5c, 0x3c, 0xdd, - 0x56, 0x07, 0x5d, 0x33, 0x66, 0x3c, 0x5a, 0x9a, 0x0f, 0x78, 0x59, 0xc8, - 0xb1, 0x17, 0x7e, 0x0c, 0xca, 0x3d, 0x90, 0xd4, 0xbf, 0x7e, 0xce, 0x9b, - 0x5a, 0x48, 0xed, 0x5b, 0x95, 0x6e, 0x22, 0xe7, 0x62, 0x7c, 0x62, 0x92, - 0xa9, 0x43, 0x67, 0xaa, 0x96, 0x82, 0x0b, 0x5f, 0x92, 0xdd, 0x55, 0x8b, - 0x9f, 0xdf, 0x21, 0x88, 0xb3, 0x8b, 0x39, 0x92, 0xe6, 0x32, 0x42, 0x1f, - 0x64, 0xf1, 0x28, 0x27, 0x6a, 0xe9, 0xe1, 0x7f, 0x7c, 0x0d, 0xc7, 0x95, - 0x09, 0x33, 0x18, 0x8b, 0x8e, 0x23, 0x8f, 0x6b, 0x1c, 0xbc, 0x3b, 0x02, - 0x15, 0x25, 0x4e, 0x41, 0xd9, 0x92, 0x99, 0xaf, 0x75, 0x2f, 0xbe, 0x15, - 0x71, 0xe0, 0xc4, 0x9c, 0xc2, 0x7b, 0x18, 0x3c, 0x9d, 0x68, 0xe3, 0xc8, - 0xc4, 0xed, 0xd1, 0x91, 0xa3, 0x6c, 0x4d, 0x41, 0xa3, 0x32, 0x50, 0x13, - 0x4d, 0xe6, 0x39, 0x50, 0xc3, 0x93, 0x01, 0xc0, 0x4f, 0xd7, 0x86, 0xb7, - 0xe2, 0x61, 0x1d, 0x87, 0xea, 0xc7, 0xbd, 0xf1, 0xca, 0x21, 0xd6, 0xdd, - 0xf1, 0xd4, 0xa1, 0x8d, 0x17, 0x13, 0x3f, 0xb1, 0xbd, 0xfa, 0xbc, 0x0d, - 0xf7, 0x49, 0xf2, 0x38, 0x43, 0x75, 0x8c, 0x24, 0xe2, 0xab, 0xa1, 0x46, - 0x02, 0xc7, 0x2d, 0xa3, 0x55, 0x80, 0x82, 0x57, 0x10, 0x38, 0x4d, 0xe3, - 0xf0, 0xfc, 0xa8, 0x0f, 0x0a, 0x9e, 0xeb, 0xcb, 0x81, 0xc9, 0x2b, 0x18, - 0xe8, 0x4b, 0x69, 0xef, 0x8d, 0x9a, 0xdc, 0x3f, 0x53, 0xb7, 0x2e, 0xab, - 0x37, 0xb4, 0xa5, 0xa5, 0xd2, 0x2e, 0x3a, 0x77, 0x16, 0x65, 0xa6, 0xb3, - 0x68, 0x69, 0xac, 0xb7, 0x37, 0xd6, 0xff, 0x79, 0x03, 0x2b, 0x2f, 0xb3, - 0xa4, 0x28, 0xba, 0x0b, 0xde, 0x23, 0xcd, 0x98, 0x2b, 0xc1, 0x33, 0xaa, - 0xa5, 0xb2, 0x1e, 0xbc, 0x61, 0xb7, 0x51, 0x35, 0xe3, 0x14, 0xff, 0x09, - 0x98, 0x0d, 0x2d, 0xb5, 0x4a, 0x2c, 0x27, 0x68, 0x94, 0xfb, 0x50, 0x0d, - 0x47, 0x47, 0xd9, 0xfa, 0xdd, 0x53, 0x1d, 0x51, 0x2a, 0x6d, 0xcd, 0xbf, - 0x62, 0xb3, 0x88, 0x7e, 0x01, 0x5a, 0x29, 0x2b, 0xcd, 0x1a, 0xf3, 0x51, - 0x0f, 0xd4, 0xa2, 0x78, 0xa3, 0x09, 0x20, 0x7f, 0x36, 0x83, 0xa0, 0x8b, - 0x7f, 0x50, 0x75, 0x6a, 0x00, 0x9c, 0x24, 0xbe, 0x33, 0xa1, 0x0f, 0x87, - 0xad, 0xee, 0x16, 0x19, 0x9d, 0x94, 0xbd, 0xfc, 0xa8, 0xbd, 0x1e, 0xd3, - 0x55, 0x39, 0xa1, 0xbb, 0x03, 0x81, 0x60, 0xbf, 0xb4, 0xd9, 0x71, 0x00, - 0x45, 0x14, 0xaa, 0x3d, 0x90, 0x27, 0x33, 0x68, 0x7c, 0x14, 0x58, 0xbf, - 0xf7, 0xf1, 0x19, 0xd5, 0x03, 0x3e, 0xaf, 0x9a, 0x38, 0x96, 0xe2, 0x2a, - 0xe4, 0x07, 0x4b, 0x50, 0xb3, 0x70, 0x67, 0x0c, 0xfc, 0xd0, 0x8f, 0x0e, - 0x52, 0xe8, 0xd1, 0xd8, 0xdf, 0x19, 0x82, 0x2f, 0xd7, 0x0e, 0x0b, 0x88, - 0x75, 0x93, 0x19, 0x49, 0x1a, 0x78, 0x3b, 0x7a, 0xb6, 0x3c, 0x8c, 0xe4, - 0xa8, 0xba, 0x57, 0x7a, 0x1b, 0xef, 0x39, 0x7d, 0x88, 0x96, 0xf5, 0x92, - 0x0b, 0x81, 0x34, 0x3c, 0xa9, 0x1c, 0xed, 0x0c, 0x66, 0x27, 0x65, 0xfd, - 0x77, 0x16, 0x64, 0x16, 0x51, 0xb8, 0x50, 0xea, 0x6c, 0xbf, 0x01, 0xfa, - 0xa0, 0xfe, 0xa4, 0x07, 0x33, 0x78, 0x36, 0xfc, 0xca, 0xe2, 0xa3, 0x9a, - 0xd3, 0x20, 0x38, 0x4e, 0x3b, 0xc7, 0xb6, 0xd7, 0x6f, 0x8b, 0xae, 0x12, - 0xae, 0x11, 0x24, 0xa9, 0xe2, 0x9a, 0xba, 0x18, 0xdd, 0x26, 0x09, 0x0f, - 0x72, 0x5a, 0xf8, 0x5e, 0x04, 0xa0, 0x21, 0x9e, 0x71, 0xc3, 0xf4, 0x17, - 0x15, 0x92, 0x47, 0xe2, 0x31, 0xb9, 0x61, 0xc4, 0x97, 0xcd, 0x3a, 0xe3, - 0x12, 0xb9, 0xf3, 0xc6, 0xbb, 0xbb, 0xb6, 0xe6, 0x9f, 0x5b, 0xb4, 0xa7, - 0x86, 0x69, 0xff, 0x71, 0x25, 0xdd, 0x8a, 0x46, 0x7d, 0x59, 0x6d, 0x95, - 0xfe, 0x93, 0x43, 0x48, 0x9e, 0xab, 0x63, 0x3d, 0xe3, 0xca, 0xec, 0xc7, - 0xda, 0xd9, 0x2c, 0x16, 0xaf, 0xef, 0x7b, 0x02, 0x14, 0x4e, 0x97, 0xbd, - 0xe8, 0xd1, 0xd8, 0xe1, 0x02, 0xed, 0x49, 0xe8, 0xaf, 0x10, 0xc8, 0x16, - 0x2c, 0x78, 0x81, 0xd1, 0x55, 0x51, 0x5b, 0x8e, 0xc7, 0x77, 0x07, 0x30, - 0x78, 0x4f, 0x56, 0x8e, 0xdc, 0x84, 0x8c, 0x44, 0x1a, 0x99, 0xf8, 0xb9, - 0x1d, 0xef, 0xa2, 0x03, 0x68, 0xf8, 0xb4, 0x9e, 0x2d, 0x2f, 0x7f, 0xd5, - 0x9d, 0x4b, 0x33, 0xad, 0xb4, 0xd4, 0x6c, 0x97, 0xa7, 0xc9, 0x9b, 0x07, - 0x22, 0x77, 0x2f, 0x95, 0x4f, 0x3c, 0xad, 0xb7, 0x7b, 0x1f, 0xd0, 0xae, - 0x0d, 0x7b, 0xb5, 0x79, 0x0a, 0x06, 0x1c, 0x49, 0x0c, 0xb6, 0x8a, 0x7d, - 0xc0, 0xdc, 0xca, 0xa5, 0x59, 0xf4, 0x58, 0xc4, 0x2b, 0x38, 0x05, 0xba, - 0xd2, 0x5d, 0x2d, 0xa4, 0x49, 0xd2, 0xad, 0xb3, 0x31, 0x22, 0x77, 0x05, - 0x8c, 0xe5, 0x41, 0xb9, 0x1f, 0xb3, 0xe8, 0x2b, 0x82, 0x42, 0x83, 0x51, - 0x91, 0x81, 0x0e, 0x52, 0x00, 0x29, 0x1b, 0x44, 0xf7, 0x1e, 0xe0, 0x2e, - 0xaa, 0x01, 0xff, 0x24, 0x3e, 0x1a, 0x58, 0x21, 0xc7, 0xfa, 0x65, 0x58, - 0xd2, 0x59, 0x8b, 0xd9, 0x7f, 0xe4, 0x5e, 0xb2, 0x70, 0x46, 0x12, 0x3d, - 0x05, 0xc0, 0xec, 0x4b, 0x89, 0x22, 0xf0, 0xe5, 0x3e, 0x5f, 0xc9, 0xd1, - 0x97, 0xda, 0xe8, 0x37, 0x12, 0x70, 0x56, 0x76, 0xf0, 0xc6, 0x37, 0x24, - 0xbb, 0xfc, 0x81, 0x79, 0xb2, 0x9a, 0x20, 0x1d, 0x53, 0x25, 0x25, 0xac, - 0x01, 0x68, 0xff, 0x6e, 0x84, 0xee, 0xbb, 0x06, 0x26, 0x2b, 0xb4, 0xd0, - 0x04, 0xe8, 0x43, 0x43, 0x09, 0xa9, 0xce, 0xbd, 0x87, 0x96, 0x4f, 0x77, - 0x0f, 0xd8, 0xa9, 0xf1, 0xbb, 0x31, 0x69, 0x74, 0x40, 0x43, 0x1a, 0x23, - 0xca, 0xaf, 0x3f, 0x8c, 0xa4, 0x8f, 0x0b, 0x7f, 0xa5, 0x84, 0xe9, 0x8d, - 0x23, 0xd5, 0x10, 0x89, 0xba, 0xea, 0x06, 0x64, 0xc9, 0x03, 0xeb, 0xfa, - 0xd2, 0x87, 0x6a, 0x1b, 0x3d, 0x78, 0x8e, 0x0d, 0x6e, 0x30, 0xfa, 0xae, - 0xb6, 0x6f, 0xe5, 0x69, 0xad, 0x82, 0x6d, 0x7b, 0x84, 0xf5, 0xc3, 0xa2, - 0x97, 0x73, 0xe1, 0x16, 0xf3, 0x41, 0xd5, 0xf1, 0xc5, 0x34, 0xed, 0xb6, - 0x4a, 0xd2, 0xb1, 0x3d, 0x6e, 0xed, 0x4c, 0x1d, 0xa7, 0xc5, 0xe4, 0x8e, - 0xfc, 0x23, 0x01, 0x2b, 0xe7, 0xed, 0xa3, 0x47, 0x4b, 0xcb, 0xad, 0xed, - 0xd9, 0x02, 0xd4, 0x73, 0x0d, 0x23, 0x79, 0x44, 0xc9, 0x30, 0x56, 0x53, - 0x9f, 0xed, 0x72, 0x8f, 0x7e, 0x0f, 0xa5, 0x4e, 0x81, 0x10, 0x9e, 0x58, - 0x52, 0xc8, 0x8a, 0x4f, 0xe3, 0x50, 0xd4, 0xd0, 0xd2, 0xb7, 0x94, 0x80, - 0xa3, 0x69, 0x92, 0x96, 0x97, 0x7e, 0xd5, 0x55, 0x30, 0x5a, 0x8e, 0x78, - 0x26, 0xe5, 0x3c, 0xba, 0xf5, 0x6b, 0x36, 0x56, 0x21, 0x4a, 0xc5, 0x17, - 0x52, 0x34, 0x1f, 0x4e, 0xe5, 0xcb, 0xd4, 0xc5, 0x59, 0xa9, 0x3f, 0x12, - 0x0b, 0x73, 0x2c, 0xc3, 0xcc, 0x31, 0x22, 0xda, 0xf0, 0x7b, 0x7b, 0xc2, - 0xa8, 0xdb, 0xf0, 0x6c, 0x9e, 0x40, 0x2e, 0xe0, 0x5d, 0x90, 0x96, 0x67, - 0x1f, 0x9f, 0x9c, 0xc0, 0x23, 0x52, 0x86, 0x03, 0xfe, 0x6c, 0xbb, 0x62, - 0x98, 0x19, 0x1b, 0x75, 0xab, 0x05, 0xb6, 0xab, 0xdf, 0xe8, 0x73, 0xa3, - 0x86, 0x54, 0x40, 0xec, 0x78, 0x55, 0x36, 0x0c, 0x85, 0x27, 0x08, 0x32, - 0xd7, 0xdd, 0x4c, 0x71, 0x00, 0x2a, 0xdd, 0x54, 0x40, 0xda, 0x35, 0x27, - 0x2a, 0x9c, 0xbd, 0xa8, 0xd8, 0x8e, 0xc0, 0x2f, 0xc2, 0x43, 0x19, 0x8e, - 0xba, 0x5a, 0x50, 0xc6, 0x2d, 0x5a, 0x94, 0xa8, 0x56, 0x9f, 0xa2, 0xb0, - 0x3d, 0x00, 0x94, 0x12, 0x92, 0x1a, 0x0d, 0xa2, 0xfc, 0x84, 0xbd, 0x17, - 0x71, 0xe1, 0xdc, 0x38, 0x14, 0x63, 0x02, 0x48, 0x3d, 0xfc, 0x19, 0x01, - 0x4f, 0x41, 0x02, 0x70, 0x52, 0x9f, 0x5d, 0xfa, 0x5f, 0x8a, 0xea, 0x35, - 0xae, 0xdd, 0xba, 0x4c, 0xe0, 0x7f, 0xbf, 0xb1, 0x9c, 0xa1, 0xe1, 0x1f, - 0xe5, 0xa6, 0x49, 0x1d, 0x0f, 0x38, 0x04, 0x3e, 0xd1, 0x60, 0x73, 0xb0, - 0x60, 0xbc, 0xca, 0xe4, 0x1c, 0x6a, 0x20, 0x4a, 0x75, 0xb9, 0x83, 0x46, - 0x63, 0xc6, 0x3d, 0xf8, 0x3b, 0x37, 0xa0, 0x55, 0xfb, 0x5f, 0xb6, 0x71, - 0x70, 0x52, 0xb1, 0xe8, 0x94, 0xe5, 0x91, 0x43, 0xbe, 0x08, 0xa4, 0x61, - 0x87, 0x2f, 0x02, 0xef, 0xc9, 0x06, 0xa8, 0xdb, 0x29, 0x1c, 0xcc, 0x0e, - 0x5d, 0x20, 0x44, 0xa7, 0xc4, 0x49, 0xac, 0x41, 0xe5, 0xdd, 0xcc, 0x76, - 0xf5, 0xdb, 0x01, 0xb8, 0x12, 0x51, 0x75, 0x0e, 0x47, 0xe0, 0x2f, 0xf6, - 0xe3, 0x19, 0x9e, 0x3f, 0x0f, 0x8e, 0xaa, 0x76, 0x93, 0xd8, 0xda, 0x14, - 0x9b, 0x5e, 0xac, 0xaa, 0x3f, 0xb3, 0x8c, 0xc4, 0xb2, 0xa6, 0xb7, 0x23, - 0x07, 0x8c, 0x65, 0xc6, 0xa0, 0x6f, 0x91, 0xb6, 0x14, 0x2e, 0xfa, 0x3d, - 0xe9, 0x3f, 0x0e, 0xbe, 0x58, 0x42, 0x7d, 0xa3, 0xe5, 0x28, 0xc6, 0xe8, - 0x21, 0xad, 0x53, 0x3a, 0x33, 0x9d, 0xcc, 0xae, 0xc4, 0x4a, 0x5a, 0x52, - 0x4a, 0xd0, 0xcd, 0xf7, 0x95, 0x06, 0xc5, 0xc3, 0x24, 0xf8, 0x96, 0xfa, - 0xef, 0xcd, 0x95, 0x6b, 0x36, 0xcf, 0x1f, 0xda, 0x21, 0x26, 0xef, 0x96, - 0x12, 0x7d, 0xad, 0xed, 0xf4, 0xc9, 0x1c, 0x2b, 0x7e, 0xf5, 0x39, 0xc4, - 0xa4, 0xca, 0x30, 0xc7, 0xc7, 0x3b, 0x88, 0xa1, 0x19, 0x5b, 0x1e, 0x72, - 0xe4, 0xdd, 0xe1, 0x22, 0x39, 0x01, 0x17, 0x5f, 0xb8, 0x83, 0x05, 0x41, - 0x99, 0xf6, 0x74, 0xa3, 0x82, 0xbd, 0x2d, 0x36, 0x27, 0xe8, 0x4d, 0xe6, - 0x89, 0xa8, 0x07, 0x32, 0xff, 0xf6, 0xfb, 0x31, 0xf0, 0xeb, 0x72, 0x59, - 0x04, 0x97, 0x11, 0xed, 0x1c, 0xe2, 0xc7, 0xdf, 0xd7, 0xa1, 0xbf, 0xf9, - 0x8c, 0xc1, 0x0e, 0x45, 0x32, 0x64, 0xac, 0xc8, 0x2e, 0x78, 0xbb, 0xb5, - 0xa9, 0x1f, 0xb0, 0x2a, 0xdb, 0xa9, 0x6d, 0x91, 0xd8, 0x96, 0x94, 0x1a, - 0x14, 0xce, 0xb4, 0x67, 0x72, 0xf1, 0xe5, 0xce, 0x2a, 0x93, 0x26, 0x83, - 0xe2, 0xc6, 0x94, 0x1b, 0x2d, 0x84, 0x0d, 0x58, 0xcf, 0x97, 0x6d, 0x7f, - 0x1b, 0x57, 0xaa, 0x5d, 0xc6, 0x1c, 0xd8, 0x27, 0x7d, 0x08, 0xb7, 0x47, - 0x2b, 0x92, 0x49, 0xfb, 0x99, 0x03, 0x1a, 0x50, 0x85, 0xf6, 0xec, 0x4c, - 0x82, 0x7b, 0x07, 0xab, 0x44, 0xc7, 0xbb, 0x24, 0x99, 0x62, 0x80, 0x32, - 0xa0, 0x65, 0x7b, 0x6e, 0x51, 0xbd, 0xac, 0x34, 0x98, 0x72, 0x48, 0x2a, - 0x87, 0x62, 0x80, 0x07, 0xc8, 0xa2, 0x63, 0xa7, 0x74, 0xe3, 0xa7, 0xdd, - 0xfe, 0xd9, 0x3f, 0x9c, 0x43, 0x32, 0x50, 0x79, 0xad, 0x30, 0x18, 0x70, - 0xf6, 0x39, 0x2a, 0xe4, 0x5f, 0xc2, 0x36, 0x51, 0xfb, 0x5f, 0xb6, 0x71, - 0x70, 0x52, 0xb1, 0xe8, 0x94, 0xe5, 0x91, 0x43, 0xbe, 0x78, 0xa4, 0x61, - 0x87, 0x2f, 0x02, 0xef, 0xc9, 0x06, 0xa8, 0xdb, 0x29, 0x1c, 0xcc, 0x0e, - 0x5d, 0x20, 0x44, 0xa7, 0x53, 0x49, 0x86, 0x2a, 0xb6, 0x13, 0x27, 0xe1, - 0xc0, 0x27, 0xa2, 0xe5, 0x41, 0x6e, 0x38, 0x44, 0x47, 0xe0, 0x21, 0xf6, - 0xe3, 0x19, 0x9e, 0x3f, 0x0f, 0x8e, 0xaa, 0x76, 0x93, 0xd8, 0xda, 0x14, - 0x55, 0x91, 0x0d, 0xc3, 0xbf, 0xa6, 0xe8, 0x31, 0x67, 0x1a, 0xed, 0x7f, - 0xb7, 0x8b, 0xc8, 0x2c, 0xfd, 0xb0, 0x0f, 0x85, 0x55, 0x71, 0xce, 0xd8, - 0xbf, 0xdb, 0xd4, 0x26, 0x34, 0x12, 0x6f, 0x6d, 0xf6, 0x12, 0x0f, 0x2f, - 0x90, 0x5b, 0xb8, 0xb2, 0x87, 0x15, 0x27, 0xf2, 0x59, 0x8f, 0xa9, 0x9e, - 0x08, 0x90, 0x1a, 0x15, 0xf8, 0xed, 0x95, 0x18, 0xf7, 0x23, 0x6b, 0x96, - 0x55, 0x48, 0x9d, 0x2a, 0x2d, 0x58, 0xab, 0xf9, 0xa0, 0xd9, 0x1e, 0xe6, - 0xa7, 0xea, 0x1f, 0xfd, 0xa9, 0xa3, 0x38, 0xb2, 0xd4, 0xaa, 0x73, 0xd6, - 0x8d, 0xb6, 0xe5, 0x7e, 0xe4, 0x17, 0x78, 0xf9, 0xbe, 0xb2, 0x72, 0xd3, - 0x70, 0x7c, 0x2a, 0xe8, 0xb7, 0xba, 0x6f, 0x13, 0xaa, 0xdc, 0x5f, 0x96, - 0x4c, 0x03, 0x0a, 0x92, 0x7d, 0xa6, 0xee, 0x03, 0xbc, 0x53, 0xab, 0x88, - 0x5a, 0xed, 0xdf, 0x89, 0x56, 0xa8, 0xd5, 0x2f, 0xce, 0x60, 0x8c, 0xed, - 0xa9, 0x93, 0xdb, 0x61, 0x95, 0x2e, 0xbd, 0xe6, 0xff, 0xd0, 0x0a, 0xf3, - 0xc9, 0xed, 0xce, 0xf3, 0x72, 0x29, 0x7f, 0x4e, 0x88, 0xe2, 0xe5, 0xeb, - 0x94, 0x39, 0x95, 0x32, 0x96, 0x8d, 0x69, 0x79, 0x2c, 0x82, 0xb0, 0xee, - 0x4e, 0x68, 0xdc, 0x4f, 0xf9, 0x9d, 0x5e, 0x77, 0x6b, 0x2e, 0x45, 0xd6, - 0x58, 0xfc, 0xea, 0x3d, 0x92, 0x5b, 0x9d, 0x33, 0x98, 0x5f, 0x2f, 0xaa, - 0x18, 0xd7, 0xa6, 0x64, 0x10, 0x2a, 0x43, 0x47, 0xbb, 0xcb, 0x08, 0x56, - 0xad, 0x8b, 0xeb, 0x5e, 0x2b, 0x1e, 0xa8, 0xf3, 0xfa, 0x7e, 0x5c, 0x2b, - 0xd5, 0x7e, 0x0d, 0x0e, 0x99, 0x40, 0xaf, 0xa9, 0xaa, 0x03, 0x66, 0x16, - 0xd0, 0xee, 0x47, 0xf3, 0xcd, 0x82, 0x39, 0xda, 0x34, 0x88, 0x2d, 0x9b, - 0x96, 0x6d, 0xf5, 0xd3, 0x03, 0xde, 0xd6, 0x36, 0x7d, 0xb6, 0xf0, 0x05, - 0x5d, 0x6d, 0x9e, 0x6d, 0x97, 0x94, 0x6b, 0x65, 0x7a, 0x3f, 0x9a, 0xee, - 0xde, 0xb8, 0x75, 0xd8, 0xc1, 0x99, 0xaa, 0x79, 0xf7, 0x32, 0x18, 0x17, - 0x6f, 0xcb, 0x11, 0xd3, 0x32, 0xac, 0x51, 0x31, 0x98, 0x85, 0xab, 0x26, - 0xeb, 0x70, 0xab, 0x26, 0x8b, 0x3d, 0x01, 0x58, 0xda, 0x94, 0xd0, 0xe9, - 0x92, 0x8c, 0x9d, 0xc5, 0xec, 0xe6, 0xd9, 0x4c, 0xaf, 0x75, 0xcf, 0xbd, - 0xab, 0xca, 0xb2, 0x7e, 0xce, 0x57, 0x4c, 0x89, 0x08, 0x8f, 0xe1, 0xaf, - 0xfb, 0x2e, 0xb5, 0x0f, 0x0e, 0x90, 0xef, 0xc5, 0x07, 0xff, 0x30, 0xb8, - 0x81, 0xc3, 0x6c, 0x00, 0xd3, 0x16, 0xa1, 0x81, 0xc0, 0x36, 0xe5, 0x05, - 0x29, 0x2e, 0x37, 0x65, 0xe8, 0x9b, 0xef, 0xa2, 0xb6, 0x95, 0x59, 0x95, - 0x61, 0x26, 0x53, 0x2a, 0xb4, 0xbe, 0x8c, 0x1e, 0xdb, 0x57, 0xda, 0x21, - 0x09, 0x6d, 0xaf, 0xbd, 0x15, 0xf6, 0x32, 0x1e, 0x8e, 0x7e, 0xe6, 0x0a, - 0xc2, 0x3a, 0xad, 0xb9, 0xf1, 0x3f, 0x1a, 0xf6, 0xc1, 0xca, 0xed, 0xb5, - 0x06, 0x6d, 0x72, 0xee, 0x7f, 0x5f, 0xcb, 0xf9, 0x65, 0x18, 0xe9, 0x78, - 0xa0, 0x2d, 0xce, 0xa4, 0x90, 0x69, 0x5e, 0x83, 0x43, 0x16, 0x12, 0x2c, - 0xbd, 0x8b, 0xb8, 0x7a, 0x5f, 0x4c, 0xcc, 0x70, 0xd5, 0x2e, 0xe1, 0x45, - 0x27, 0x79, 0x5b, 0x01, 0x14, 0x54, 0x2d, 0xb2, 0x4f, 0xef, 0x1c, 0x9f, - 0x9b, 0x05, 0x67, 0x53, 0x88, 0xf1, 0xaf, 0x6a, 0xac, 0x74, 0xdf, 0x2f, - 0x59, 0xda, 0x15, 0xb1, 0x0b, 0xe4, 0xbf, 0xe7, 0x05, 0x06, 0xc5, 0xd9, - 0x2e, 0xad, 0x0a, 0xe8, 0xf1, 0x73, 0xe3, 0xb2, 0x6e, 0x54, 0x91, 0x51, - 0x17, 0xed, 0xe8, 0xea, 0xf6, 0x32, 0xa6, 0x83, 0xf3, 0xc3, 0x84, 0x4d, - 0x11, 0x54, 0x90, 0xa9, 0xba, 0xab, 0x92, 0xa5, 0x58, 0x15, 0x3c, 0xeb, - 0xca, 0x48, 0x64, 0x44, 0xfa, 0xdd, 0x6e, 0x6e, 0x6d, 0x75, 0xde, 0xbd, - 0xf7, 0xfb, 0x8c, 0x4f, 0xe9, 0x9f, 0x11, 0x60, 0xe1, 0xc4, 0xf2, 0x41, - 0x60, 0x71, 0x8d, 0x5c, 0x08, 0xff, 0xf5, 0x7b, 0xfb, 0x08, 0xa3, 0x59, - 0xa0, 0x97, 0x54, 0xf1, 0xbb, 0x68, 0x00, 0x1b, 0x9b, 0x95, 0x76, 0x80, - 0x6a, 0x75, 0x0d, 0x33, 0x73, 0xfc, 0x13, 0x6a, 0xb9, 0xf7, 0xc8, 0x85, - 0xb6, 0xbd, 0x75, 0x80, 0x6c, 0x5d, 0x92, 0x93, 0xdb, 0xd3, 0xe0, 0x2c, - 0x47, 0x88, 0xb8, 0x18, 0x0c, 0xac, 0x1c, 0x79, 0xf0, 0x0f, 0x0e, 0x16, - 0x1e, 0xe5, 0xe5, 0xfb, 0xe7, 0xf6, 0x79, 0x34, 0x15, 0xc4, 0x13, 0xf4, - 0x38, 0xd4, 0xf3, 0xd5, 0x85, 0x34, 0xa3, 0x10, 0xd5, 0x0c, 0xd4, 0x5e, - 0x37, 0x2e, 0xcb, 0x53, 0x51, 0xc5, 0xff, 0x38, 0x83, 0x9e, 0x0a, 0xf8, - 0x56, 0xcf, 0x65, 0xb7, 0xa2, 0x5c, 0xa9, 0x9e, 0x8a, 0xf9, 0x6b, 0xae, - 0xf1, 0xe0, 0xf7, 0x85, 0xc1, 0xa4, 0x89, 0x87, 0x50, 0x1a, 0x0c, 0x0c, - 0x9e, 0xb7, 0x6d, 0x7c, 0x70, 0x32, 0x0f, 0x4e, 0x68, 0xff, 0x8d, 0x56, - 0xe7, 0x15, 0x29, 0xbb, 0x62, 0x7e, 0x6f, 0x5f, 0xcc, 0x1a, 0x96, 0xf2, - 0xd1, 0x78, 0x70, 0x39, 0x97, 0x28, 0x2b, 0xab, 0x51, 0xa4, 0x8d, 0x6f, - 0x46, 0x41, 0xdb, 0x5c, 0xdd, 0x15, 0xeb, 0xdf, 0x8c, 0x3c, 0x4d, 0x79, - 0x5f, 0xcf, 0xd4, 0x68, 0x61, 0xbd, 0x89, 0xb5, 0xce, 0x39, 0xcc, 0xc9, - 0xd7, 0x9f, 0xaf, 0xac, 0xf2, 0xb2, 0x47, 0x64, 0x58, 0xb3, 0x87, 0x01, - 0x57, 0xbd, 0x04, 0x36, 0x70, 0xbf, 0x9d, 0xfd, 0x35, 0x24, 0x1f, 0xb8, - 0x36, 0xeb, 0x5c, 0xaa, 0x2a, 0xf4, 0x2b, 0x17, 0x1c, 0xc3, 0xf7, 0x14, - 0xb0, 0x26, 0x2a, 0x72, 0x92, 0x45, 0x90, 0x25, 0x0b, 0x61, 0x9f, 0x32, - 0x58, 0x57, 0x69, 0xa9, 0x32, 0x7a, 0xa1, 0x07, 0xad, 0xb9, 0xb9, 0x40, - 0x8b, 0xdb, 0x4d, 0xff, 0x4c, 0xe9, 0x02, 0xd6, 0xee, 0x8f, 0xcf, 0xff, - 0x72, 0xb7, 0x63, 0x16, 0xac, 0x06, 0x16, 0x1b, 0xfe, 0xca, 0x00, 0xb1, - 0x35, 0x9f, 0x86, 0xb7, 0x76, 0xa4, 0xc1, 0xd5, 0xf1, 0x6e, 0x08, 0x30, - 0x76, 0x88, 0x85, 0xee, 0xea, 0x53, 0x79, 0x92, 0x50, 0x53, 0x7f, 0xcc, - 0xa7, 0x79, 0xd2, 0x25, 0x4d, 0x22, 0x3a, 0x89, 0x9e, 0x86, 0x79, 0x77, - 0xc1, 0x74, 0xae, 0xf8, 0x4a, 0xe8, 0x61, 0x77, 0x85, 0xe1, 0x6d, 0xae, - 0x15, 0x0b, 0xc1, 0xdf, 0x24, 0x37, 0x79, 0x20, 0x0b, 0xa7, 0xa8, 0xb7, - 0xac, 0x63, 0x2c, 0x59, 0x30, 0x57, 0xb3, 0x50, 0xf4, 0x35, 0x5f, 0x62, - 0xb5, 0x23, 0x70, 0x07, 0x38, 0x49, 0x62, 0x45, 0x70, 0x54, 0x96, 0xcf, - 0x59, 0x69, 0x4c, 0x31, 0xad, 0xd5, 0x70, 0x1c, 0x00, 0x7c, 0x42, 0x9c, - 0x68, 0x28, 0x45, 0x02, 0x7f, 0xf9, 0x74, 0x23, 0xbb, 0xb1, 0x30, 0x84, - 0xd7, 0xd3, 0xcd, 0xf8, 0x63, 0x48, 0x2b, 0x94, 0xa0, 0xe6, 0x81, 0xd1, - 0x99, 0xec, 0x93, 0x20, 0x18, 0x01, 0x74, 0x32, 0x40, 0xbe, 0xf9, 0xbd, - 0xb1, 0x2f, 0x1c, 0xb3, 0x9d, 0x14, 0x6e, 0x3b, 0x50, 0x9b, 0x2f, 0x18, - 0xb2, 0x39, 0x56, 0xcb, 0x45, 0x26, 0xba, 0x47, 0xb3, 0xdc, 0xa9, 0x74, - 0x86, 0x8a, 0xbc, 0x54, 0x01, 0xb2, 0xca, 0x62, 0xe2, 0x3a, 0x02, 0x3a, - 0x43, 0xa1, 0x42, 0x46, 0x7e, 0x9f, 0x9f, 0xda, 0x0e, 0x16, 0x0a, 0xbb, - 0xec, 0xfb, 0x48, 0xb0, 0x82, 0xc0, 0x52, 0x24, 0x55, 0xdf, 0x33, 0x4f, - 0xe5, 0x48, 0xbf, 0xfc, 0xe6, 0x6b, 0x17, 0x66, 0xbb, 0x51, 0x1e, 0x4a, - 0x46, 0x8b, 0x5e, 0x29, 0x7e, 0x92, 0xbf, 0xea, 0xb8, 0x6d, 0x40, 0xcb, - 0x7b, 0x93, 0x40, 0x3e, 0xd7, 0x7a, 0xe2, 0x6b, 0x4f, 0xb3, 0xc3, 0x79, - 0xad, 0x83, 0x4d, 0x31, 0x20, 0xe0, 0xfb, 0x8a, 0xcc, 0x0b, 0x6c, 0x35, - 0x41, 0x2e, 0x08, 0x74, 0x44, 0x25, 0x4f, 0x48, 0xcf, 0xe0, 0x12, 0xd4, - 0x74, 0xb2, 0xe0, 0x3e, 0x45, 0x94, 0x07, 0x79, 0xde, 0x6e, 0xe8, 0x8f, - 0x21, 0xfb, 0x0e, 0x59, 0xaa, 0x88, 0x7c, 0x00, 0xee, 0xa5, 0x32, 0x99, - 0x56, 0x16, 0xf7, 0x28, 0xef, 0xac, 0xe9, 0x2c, 0x87, 0xe5, 0x8d, 0x47, - 0x33, 0xd3, 0x7f, 0x80, 0x9a, 0x62, 0x3e, 0x60, 0x60, 0x90, 0x4d, 0xa5, - 0xaa, 0x1a, 0x32, 0x35, 0x92, 0x4b, 0xb1, 0xdc, 0x4d, 0xf1, 0x3b, 0xd6, - 0x60, 0xca, 0x90, 0x77, 0x11, 0x15, 0xf5, 0xe9, 0xb2, 0xe3, 0xcb, 0xa9, - 0x41, 0xd0, 0x06, 0x02, 0xc9, 0x5e, 0x22, 0x5a, 0xdb, 0xc6, 0x64, 0x71, - 0xf8, 0x56, 0x8e, 0x08, 0xb2, 0xe3, 0xc0, 0x12, 0x8c, 0x49, 0x43, 0xbe, - 0x4e, 0xa5, 0xe2, 0xe8, 0xac, 0x87, 0xb2, 0xaf, 0x32, 0xf2, 0xab, 0xb1, - 0x89, 0xc4, 0xfa, 0xed, 0x46, 0x50, 0x08, 0xdd, 0x27, 0x9e, 0x5c, 0xa0, - 0xbf, 0xf8, 0xe5, 0x19, 0xdc, 0x84, 0x6b, 0x67, 0x53, 0x34, 0x64, 0x87, - 0xd7, 0x95, 0x3b, 0x60, 0xc0, 0xd4, 0x5d, 0x82, 0x90, 0x09, 0x63, 0xb2, - 0x14, 0xa4, 0x8a, 0xc7, 0xe2, 0x8b, 0x13, 0xa1, 0x1d, 0x72, 0x77, 0xd7, - 0xdf, 0xb0, 0xb0, 0x06, 0x4d, 0xd5, 0xf6, 0x78, 0xad, 0x5c, 0x94, 0x84, - 0xa0, 0x8b, 0x4c, 0x4b, 0xa9, 0x19, 0x81, 0x63, 0x24, 0x1a, 0x2b, 0xa1, - 0x21, 0x75, 0xf5, 0x26, 0xc1, 0xdd, 0x08, 0x15, 0x62, 0xdd, 0xfb, 0x92, - 0x86, 0x9c, 0xfb, 0xd3, 0xec, 0x7a, 0x8a, 0x70, 0x2c, 0x04, 0x34, 0xbf, - 0x14, 0xf8, 0xf0, 0x5a, 0x0b, 0x89, 0xa5, 0x1d, 0x75, 0xa3, 0xc5, 0xc0, - 0xa9, 0x31, 0xf1, 0x95, 0xba, 0x44, 0x19, 0xf5, 0x6d, 0x8a, 0x59, 0xb3, - 0x78, 0xe4, 0xee, 0x8a, 0x58, 0x0c, 0x7f, 0x0e, 0x91, 0xbc, 0xf2, 0xb7, - 0xac, 0x7f, 0x6a, 0xf2, 0x4d, 0x44, 0x99, 0x09, 0x05, 0x96, 0x15, 0x47, - 0x72, 0x74, 0xf0, 0x8f, 0x19, 0x59, 0xb7, 0xbb, 0xf1, 0x82, 0x31, 0xf3, - 0xe5, 0x96, 0x9e, 0xc0, 0xa2, 0x42, 0xe7, 0x7f, 0xec, 0xed, 0x1c, 0x6e, - 0xad, 0xe5, 0xd1, 0xbe, 0x8e, 0xd6, 0xb2, 0x8f, 0x3a, 0xae, 0x56, 0xf1, - 0xea, 0x74, 0xaf, 0xe9, 0xb8, 0x9f, 0x1b, 0x63, 0x68, 0xd4, 0x86, 0x5f, - 0x52, 0x72, 0x08, 0xde, 0x09, 0xc2, 0xa7, 0x31, 0x4e, 0xe2, 0xd1, 0x86, - 0x37, 0xe8, 0xd6, 0x7a, 0x5a, 0x95, 0x3a, 0x09, 0x9c, 0x09, 0x81, 0xb4, - 0xfe, 0x2d, 0xb5, 0x2f, 0x80, 0xf9, 0xc4, 0x75, 0x30, 0xc0, 0xdb, 0xd5, - 0x29, 0xc0, 0x56, 0xc9, 0x6f, 0x44, 0x06, 0x08, 0x27, 0x32, 0xb0, 0x20, - 0xda, 0x96, 0x66, 0xe4, 0xa9, 0xbb, 0xb0, 0x3c, 0x58, 0x67, 0x9c, 0x0e, - 0x34, 0x00, 0x00, 0xfd, 0x3c, 0xaa, 0xae, 0xdd, 0x5c, 0xce, 0x55, 0x7d, - 0x27, 0xb2, 0x84, 0xda, 0x4b, 0xdc, 0x52, 0xd2, 0x4b, 0x15, 0xe9, 0xb3, - 0x4c, 0x96, 0xf6, 0x72, 0x2a, 0xba, 0xa6, 0x82, 0x06, 0xf0, 0xb5, 0x47, - 0x21, 0xda, 0xbb, 0x78, 0xa7, 0x23, 0x4b, 0x8a, 0x1b, 0xab, 0x3d, 0x80, - 0x5b, 0xc8, 0xcf, 0x72, 0xca, 0xdf, 0x39, 0xc0, 0x34, 0x89, 0x46, 0xf8, - 0x2e, 0x95, 0xe8, 0x14, 0x55, 0xe9, 0x03, 0x63, 0xf2, 0x18, 0x1f, 0x62, - 0xc1, 0x63, 0xb9, 0x32, 0xb2, 0x33, 0xf9, 0x5e, 0xbc, 0x56, 0x51, 0x00, - 0x7e, 0x6e, 0x8b, 0xe9, 0xa1, 0x4f, 0x5c, 0x6a, 0xdd, 0x95, 0xaf, 0x76, - 0x12, 0xab, 0xfc, 0x70, 0x64, 0xb2, 0x34, 0x7b, 0xba, 0x09, 0x50, 0xd1, - 0xfc, 0x83, 0x21, 0xff, 0xa2, 0x40, 0x3d, 0x6c, 0xb9, 0x0d, 0xa2, 0x02, - 0x67, 0x3e, 0x92, 0x3d, 0x4a, 0xa5, 0x6d, 0x5f, 0x12, 0xe4, 0x33, 0x9b, - 0x66, 0x52, 0x20, 0xd2, 0x35, 0x08, 0xc2, 0x7e, 0x02, 0x4a, 0x3a, 0x87, - 0xa8, 0xb4, 0xa8, 0xef, 0x68, 0xd6, 0xea, 0x1e, 0xfb, 0xd8, 0x15, 0x66, - 0xf4, 0x1b, 0xa9, 0xc0, 0x15, 0xb6, 0xd0, 0xf7, 0x24, 0x3d, 0x27, 0x3f, - 0x2b, 0xed, 0x70, 0xce, 0xb5, 0x8f, 0xae, 0xa7, 0xd1, 0x6f, 0x8f, 0xaa, - 0x09, 0xf7, 0x75, 0xd8, 0x7e, 0x58, 0x8c, 0xe8, 0xdc, 0x58, 0x0b, 0x6a, - 0x71, 0x25, 0x29, 0x06, 0x44, 0x56, 0xb4, 0xde, 0xc5, 0x73, 0xd1, 0x67, - 0xfd, 0xd6, 0x40, 0xfa, 0xae, 0x50, 0x9e, 0x6c, 0x91, 0x7c, 0x6f, 0x2e, - 0xb3, 0x30, 0x19, 0x85, 0x19, 0xa6, 0x1b, 0xf6, 0x9c, 0xb9, 0x29, 0xd0, - 0x48, 0xec, 0x2a, 0xe1, 0xf7, 0xef, 0x22, 0xc8, 0x85, 0xf9, 0x72, 0xac, - 0xbf, 0xc6, 0x09, 0xb6, 0xac, 0x50, 0x75, 0x8f, 0x2f, 0x53, 0x2f, 0xd2, - 0xb6, 0x5a, 0x8d, 0xc2, 0xa6, 0x18, 0x68, 0x44, 0xfe, 0xf6, 0xf7, 0x4d, - 0xe6, 0x7a, 0xd0, 0x8b, 0xae, 0xb3, 0x14, 0xad, 0x74, 0xf2, 0x2b, 0xe1, - 0x00, 0xe3, 0xab, 0xd9, 0xd3, 0x73, 0x83, 0xd8, 0xe3, 0xc1, 0x7c, 0xd6, - 0x3b, 0x43, 0x9a, 0xe4, 0x61, 0xc7, 0xc1, 0x92, 0xcd, 0xb2, 0xed, 0x55, - 0x3b, 0xc7, 0xe5, 0x4e, 0xff, 0xc1, 0x17, 0x86, 0xf1, 0x10, 0x75, 0xa8, - 0x6b, 0x0f, 0xf6, 0x79, 0xac, 0xad, 0xb6, 0xd9, 0xf0, 0x2b, 0x29, 0x76, - 0x01, 0xd2, 0x12, 0x39, 0x5c, 0xc8, 0x89, 0x3d, 0x2a, 0x47, 0x02, 0xdd, - 0x3e, 0x2f, 0xb7, 0x87, 0x6a, 0x21, 0x50, 0x78, 0x95, 0xdd, 0xdc, 0xc0, - 0xa0, 0xdb, 0x22, 0x78, 0xe6, 0xa6, 0x5b, 0x79, 0x61, 0xcd, 0x17, 0x92, - 0x8a, 0x06, 0xe1, 0xa3, 0x41, 0xe0, 0xa2, 0xbf, 0x6f, 0x39, 0x9e, 0xb1, - 0x7f, 0x4c, 0xee, 0x00, 0xe5, 0x95, 0x46, 0x5e, 0x86, 0x53, 0x7a, 0xc0, - 0x2b, 0xc3, 0xd2, 0xa0, 0x73, 0x80, 0x60, 0x84, 0x4e, 0x3f, 0xff, 0xaf, - 0x92, 0xb4, 0x36, 0x01, 0x0b, 0x5d, 0x7e, 0xdc, 0xfa, 0xd1, 0xb2, 0x4a, - 0x06, 0xca, 0xfe, 0x72, 0xa3, 0x98, 0x12, 0x97, 0x67, 0x9a, 0xea, 0x7e, - 0x70, 0x32, 0x4e, 0x51, 0xc3, 0x6b, 0x39, 0x7a, 0xa8, 0x75, 0x27, 0xf3, - 0x84, 0x76, 0x8c, 0x71, 0xb9, 0x0d, 0x18, 0x0a, 0x11, 0x96, 0x25, 0x83, - 0x42, 0xfe, 0x72, 0x99, 0x0d, 0x99, 0x35, 0xba, 0xfa, 0xca, 0xde, 0x41, - 0xd7, 0xa0, 0x0c, 0x71, 0xac, 0xdf, 0xd7, 0x54, 0x28, 0xa7, 0x35, 0x0f, - 0x4d, 0xb3, 0x40, 0x6f, 0x55, 0x5b, 0x0e, 0xec, 0xb3, 0xc9, 0x8c, 0x45, - 0xc3, 0xfb, 0xa5, 0x85, 0x60, 0x87, 0xf9, 0x93, 0xdd, 0x1d, 0x09, 0xc0, - 0x9d, 0xdc, 0x84, 0x68, 0x8d, 0x35, 0x19, 0x35, 0x7b, 0x02, 0x9c, 0x30, - 0x52, 0x3c, 0xfd, 0x1e, 0x54, 0x79, 0x3e, 0x31, 0x76, 0xc0, 0x54, 0x89, - 0x1d, 0xbc, 0xe6, 0x34, 0xf7, 0x0b, 0xbb, 0x3a, 0x1a, 0x8c, 0x2b, 0xa8, - 0x97, 0xce, 0xca, 0x84, 0x6b, 0xc5, 0xe6, 0x73, 0x75, 0x6e, 0x9e, 0x35, - 0x88, 0x62, 0x9d, 0xdd, 0xab, 0x7c, 0xb8, 0x0f, 0x79, 0x59, 0x7c, 0x66, - 0xcb, 0x4f, 0x20, 0x64, 0x98, 0xa5, 0xb3, 0x2e, 0x44, 0x63, 0xe9, 0x9c, - 0x68, 0xc3, 0x62, 0xc1, 0x7b, 0x2e, 0x9b, 0x38, 0xce, 0xbc, 0xd5, 0x88, - 0x72, 0xcf, 0x7a, 0xc2, 0xac, 0xe1, 0x86, 0x3c, 0xa0, 0xef, 0x71, 0xce, - 0x1e, 0x03, 0x74, 0xaf, 0x5d, 0xe3, 0xdb, 0xbf, 0x95, 0xbe, 0x96, 0x51, - 0x23, 0x62, 0x99, 0xcb, 0xa3, 0xb5, 0x71, 0xbb, 0xf5, 0x55, 0xc2, 0x47, - 0x8f, 0xf2, 0xe6, 0x52, 0xbd, 0x1f, 0x34, 0xa0, 0xd1, 0x4e, 0x14, 0xea, - 0xf0, 0x05, 0x8a, 0x54, 0xf5, 0xb9, 0xe8, 0x27, 0x9c, 0x15, 0x8e, 0xfc, - 0xaa, 0x9b, 0x63, 0x05, 0x5f, 0xd2, 0x5a, 0x0e, 0x37, 0x27, 0xf0, 0x55, - 0xfd, 0x19, 0x4b, 0x08, 0x9b, 0xbd, 0xcc, 0xf1, 0x27, 0x87, 0xb5, 0xfd, - 0x9d, 0x71, 0x21, 0xda, 0xb7, 0x3a, 0xff, 0x18, 0x7c, 0x84, 0xef, 0xb4, - 0x1a, 0x15, 0x75, 0xb6, 0xeb, 0x54, 0xf1, 0x18, 0x59, 0xe3, 0x6f, 0xea, - 0xb6, 0x8d, 0x90, 0xa4, 0x41, 0xf0, 0x54, 0x85, 0xef, 0x7b, 0x46, 0x99, - 0xe5, 0x62, 0xf6, 0xab, 0xe2, 0xf3, 0x73, 0xa3, 0xfe, 0xcb, 0x01, 0xb9, - 0xf4, 0x85, 0x0b, 0x52, 0x1b, 0x1b, 0xf4, 0xa6, 0x1b, 0xbe, 0x80, 0x49, - 0x84, 0x94, 0x8f, 0xbb, 0x06, 0xe7, 0x76, 0x17, 0xc9, 0x1e, 0xf4, 0x3d, - 0x41, 0xbf, 0xb9, 0xe7, 0x71, 0xe2, 0xc5, 0x4f, 0xac, 0xaa, 0xbc, 0xc7, - 0x26, 0xe6, 0x02, 0x7c, 0xae, 0x18, 0xa6, 0x76, 0x2d, 0xed, 0x91, 0x24, - 0xd7, 0xc3, 0xe8, 0x11, 0x8f, 0xb2, 0xcc, 0x00, 0x6a, 0x7c, 0xe9, 0x1a, - 0x13, 0x97, 0xa0, 0x96, 0x31, 0x7a, 0xb7, 0xfa, 0xbe, 0xf9, 0x6c, 0x00, - 0x75, 0xb3, 0x2d, 0xdf, 0x56, 0x36, 0x84, 0xab, 0x4a, 0x9a, 0xa0, 0x35, - 0xad, 0x10, 0xaf, 0x71, 0xed, 0xa9, 0xb7, 0x6d, 0xa7, 0x41, 0x2d, 0x45, - 0x1e, 0x9d, 0xc9, 0xb8, 0xbd, 0xad, 0x82, 0x71, 0xe3, 0xdd, 0x06, 0x39, - 0x47, 0x2d, 0x04, 0x27, 0x30, 0xc1, 0xbb, 0xd9, 0xaf, 0x48, 0xe3, 0xcb, - 0x16, 0xfa, 0x72, 0xb8, 0x74, 0xa1, 0x84, 0xa2, 0x26, 0x63, 0x9a, 0x27, - 0x9e, 0x35, 0x24, 0x8d, 0xf9, 0xf8, 0x39, 0x29, 0xa9, 0xd4, 0x04, 0x3e, - 0x99, 0x6d, 0xd2, 0x22, 0x37, 0x11, 0x4e, 0x27, 0xbb, 0x91, 0x28, 0xab, - 0x31, 0x26, 0x14, 0xe9, 0xfb, 0xb2, 0x1b, 0x89, 0xf6, 0x55, 0xc2, 0x83, - 0xdf, 0xd4, 0x83, 0x89, 0xc3, 0x85, 0x6a, 0xc2, 0x4b, 0x07, 0xfc, 0x0d, - 0x87, 0x15, 0x2f, 0xa6, 0xa5, 0xd8, 0xbb, 0xd6, 0xdf, 0x78, 0xc0, 0x3b, - 0xb8, 0x5d, 0x0c, 0x3b, 0x92, 0x28, 0x47, 0xcb, 0x9e, 0x05, 0xda, 0xc2, - 0xd9, 0x77, 0xfe, 0x50, 0xcc, 0x2f, 0x4b, 0x51, 0x3a, 0xbc, 0x8d, 0x94, - 0x1f, 0xa1, 0x71, 0x55, 0x71, 0x26, 0x03, 0x41, 0x2d, 0x48, 0x13, 0xef, - 0xe6, 0x78, 0xf8, 0xd7, 0x53, 0x2f, 0xf2, 0x98, 0x87, 0xa0, 0xa1, 0x29, - 0x38, 0xc6, 0x33, 0x3c, 0xa5, 0xf8, 0xea, 0x48, 0xb8, 0x27, 0xfb, 0x0b, - 0x96, 0x5a, 0xab, 0x14, 0xa0, 0x90, 0x76, 0x98, 0x87, 0xfc, 0x02, 0x89, - 0x60, 0xb4, 0xc5, 0xdc, 0x91, 0x6e, 0x17, 0xa3, 0xb2, 0x0a, 0xf9, 0x29, - 0xd3, 0x84, 0xc6, 0xea, 0xe7, 0xb9, 0x01, 0x38, 0x6e, 0x85, 0xdc, 0x84, - 0x6c, 0xba, 0x50, 0x61, 0x27, 0xf3, 0xd2, 0x99, 0x38, 0x52, 0x5c, 0x0a, - 0x1a, 0xd0, 0x08, 0x92, 0x85, 0x6a, 0xb5, 0x3d, 0x57, 0x7e, 0x55, 0x0a, - 0x81, 0xf5, 0xce, 0x72, 0x1e, 0x35, 0xf8, 0xf8, 0xc0, 0x3c, 0x4d, 0x2e, - 0x6d, 0xc5, 0xf4, 0x26, 0xef, 0x8b, 0x43, 0x37, 0xd9, 0xa3, 0x73, 0xad, - 0xb9, 0xf2, 0xca, 0x65, 0x34, 0x0f, 0xfb, 0x03, 0x99, 0xfe, 0xed, 0x5e, - 0x4d, 0x47, 0x08, 0x7d, 0xd3, 0xb8, 0xdf, 0x76, 0xd1, 0x22, 0xaf, 0xdf, - 0x2b, 0x8f, 0xc6, 0xb2, 0x9b, 0x86, 0x61, 0xae, 0xc5, 0xa7, 0xa5, 0xce, - 0x61, 0x01, 0x97, 0x48, 0xde, 0xcb, 0x21, 0x35, 0xee, 0x72, 0x5f, 0xdc, - 0x86, 0x5e, 0x12, 0x05, 0xd8, 0x6a, 0x56, 0xb2, 0xb4, 0xb6, 0xba, 0x29, - 0xb5, 0x06, 0xa1, 0x39, 0x0e, 0xe8, 0xe7, 0x90, 0x79, 0xb4, 0xb4, 0x06, - 0x25, 0x23, 0xb3, 0xf7, 0xa7, 0xce, 0x3c, 0x14, 0xfa, 0xa5, 0x13, 0xe0, - 0x85, 0x94, 0x71, 0x14, 0xe2, 0xba, 0x21, 0xf2, 0xf4, 0x87, 0xba, 0x40, - 0xad, 0x72, 0xd3, 0x1c, 0x76, 0xdc, 0x2d, 0x17, 0x60, 0xb4, 0xe2, 0x77, - 0xe0, 0x8f, 0x1c, 0x3a, 0x25, 0xa2, 0x12, 0x49, 0x75, 0x2c, 0x6d, 0xda, - 0x4c, 0x9a, 0x26, 0x8b, 0xdc, 0xa4, 0x08, 0x81, 0x5c, 0x57, 0xdc, 0x27, - 0xc9, 0x57, 0x98, 0xb5, 0x94, 0x20, 0xf4, 0x12, 0xfa, 0x03, 0x0d, 0xb3, - 0xb3, 0xdc, 0xac, 0x40, 0x80, 0x33, 0x32, 0x06, 0xc5, 0x1b, 0x52, 0xf6, - 0x0a, 0xbd, 0xee, 0x9d, 0x2a, 0x78, 0xc7, 0x83, 0x4f, 0x56, 0x3f, 0x3d, - 0x4e, 0x39, 0x8b, 0x32, 0xca, 0x8c, 0xb5, 0x45, 0x06, 0xfa, 0xd0, 0xe4, - 0xd0, 0xd8, 0x81, 0xc0, 0x1a, 0xf2, 0xce, 0xda, 0x55, 0x44, 0xcc, 0x06, - 0x2d, 0xe2, 0xd6, 0x58, 0x31, 0x1e, 0xaf, 0x9b, 0x7b, 0x9e, 0x46, 0x9b, - 0x1c, 0x23, 0x77, 0x98, 0x13, 0xe4, 0xbf, 0x6b, 0xfd, 0x41, 0x49, 0x15, - 0x56, 0xeb, 0x66, 0x5a, 0xd2, 0x43, 0x3e, 0x32, 0xdd, 0x84, 0x98, 0xeb, - 0xcb, 0x43, 0xb0, 0x8d, 0xd3, 0xa4, 0xa3, 0x0d, 0x5e, 0xe0, 0x82, 0x42, - 0x8b, 0x4e, 0x84, 0x99, 0x2e, 0x7b, 0x02, 0xfc, 0xd0, 0xfb, 0xf3, 0x96, - 0x03, 0x7d, 0x1d, 0xa3, 0xe5, 0x7d, 0xf7, 0x4c, 0xbe, 0x02, 0xec, 0x1f, - 0xa0, 0x00, 0xea, 0x58, 0x98, 0x93, 0x42, 0xd0, 0xe1, 0x9c, 0xbe, 0x0e, - 0x5d, 0x5d, 0x41, 0xf4, 0xa7, 0xa1, 0x14, 0x94, 0x19, 0xe7, 0x5f, 0xfe, - 0x59, 0x03, 0x14, 0x57, 0xc4, 0x4c, 0xd3, 0x10, 0xfc, 0x4b, 0xc5, 0x78, - 0x65, 0xdd, 0x37, 0x24, 0x79, 0xb0, 0xfd, 0xd8, 0x46, 0x7d, 0xf4, 0x9f, - 0xad, 0xac, 0x79, 0x02, 0xfd, 0x03, 0x4f, 0x28, 0x57, 0xb3, 0x90, 0xd0, - 0xb4, 0xf6, 0xa9, 0xf0, 0xda, 0x07, 0x87, 0x65, 0xfd, 0x8a, 0xde, 0x2e, - 0xf8, 0x81, 0x4f, 0xb4, 0x21, 0x7d, 0x65, 0xd4, 0x09, 0x58, 0xf1, 0xbf, - 0x8c, 0x93, 0x1e, 0xca, 0x30, 0xd4, 0x82, 0x6e, 0x63, 0x7e, 0x25, 0x7e, - 0x40, 0x8d, 0x6f, 0x57, 0x99, 0x16, 0x2a, 0xea, 0x20, 0x0a, 0x02, 0x03, - 0x74, 0xf8, 0xa0, 0xa6, 0xb4, 0xe7, 0x8f, 0xeb, 0xda, 0xa3, 0x1e, 0xe7, - 0xd5, 0x93, 0xc9, 0xf7, 0xc6, 0x3d, 0xd9, 0x6e, 0x70, 0x66, 0x8b, 0x7c, - 0x2c, 0x4d, 0x31, 0x74, 0xff, 0xe5, 0xed, 0x4c, 0xf8, 0x5c, 0xca, 0x8b, - 0xeb, 0xaf, 0x69, 0x16, 0x8d, 0x0a, 0x64, 0x7f, 0x64, 0xe4, 0x7a, 0x86, - 0x85, 0x53, 0x47, 0x5f, 0x0d, 0x50, 0x0f, 0x90, 0x5d, 0xe5, 0x6a, 0x1e, - 0xc2, 0xf1, 0x65, 0xa3, 0xdf, 0x22, 0xea, 0x37, 0xfa, 0xdb, 0x00, 0x60, - 0x3c, 0x08, 0xfd, 0x4a, 0xe3, 0xc6, 0x40, 0x1c, 0xd6, 0x7f, 0x3c, 0xd7, - 0xbd, 0x67, 0x30, 0x9a, 0x08, 0x92, 0xc4, 0x33, 0x1b, 0x8e, 0x96, 0x5d, - 0x72, 0x5f, 0x86, 0x82, 0xe9, 0x6d, 0xb8, 0x7e, 0x75, 0xc4, 0x8c, 0x10, - 0x0c, 0x1d, 0x63, 0x50, 0xd2, 0x85, 0xc5, 0x30, 0x2e, 0x1d, 0x4d, 0x09, - 0x4e, 0xf7, 0x4e, 0x68, 0x3c, 0xb3, 0xa9, 0x24, 0xea, 0x4d, 0xfc, 0x6f, - 0x18, 0x7b, 0xe2, 0x0f, 0xd6, 0x90, 0x97, 0xd6, 0xa3, 0x22, 0x3e, 0x3f, - 0x82, 0xd0, 0x74, 0xd0, 0xbe, 0x05, 0x5d, 0x7b, 0xd1, 0xfe, 0x7b, 0x6f, - 0x91, 0xdd, 0xa3, 0x0c, 0x46, 0x8f, 0x90, 0xc8, 0x0c, 0x02, 0x76, 0x87, - 0xbb, 0x8d, 0xd8, 0x23, 0xee, 0x14, 0xae, 0x9d, 0xfc, 0x03, 0xab, 0x5c, - 0xe9, 0x21, 0x7d, 0x50, 0x2d, 0x1e, 0x1d, 0x14, 0x02, 0xb0, 0xd9, 0x57, - 0x18, 0xf3, 0xce, 0x9d, 0x95, 0x1c, 0xed, 0xe2, 0x33, 0x5b, 0x47, 0x56, - 0x27, 0x3d, 0x7d, 0xdb, 0xff, 0xb7, 0xac, 0x06, 0x10, 0xb9, 0x79, 0x90, - 0x91, 0xaa, 0x10, 0xd4, 0xc5, 0xbc, 0x21, 0xc6, 0x58, 0xe3, 0x29, 0xa6, - 0x3c, 0x8a, 0xaa, 0x5c, 0x51, 0xfc, 0xcd, 0x7a, 0x90, 0x90, 0x93, 0xc3, - 0x9e, 0x91, 0x2c, 0x35, 0x30, 0x82, 0x06, 0x52, 0xc4, 0x9e, 0xb1, 0x54, - 0x9c, 0xbc, 0x89, 0xb6, 0x9a, 0xe6, 0x88, 0xf7, 0x20, 0xf8, 0x07, 0x3e, - 0x5b, 0x88, 0x03, 0xc7, 0x06, 0x95, 0x41, 0x71, 0xc9, 0x8e, 0x12, 0x0d, - 0x11, 0xc0, 0xb2, 0x7c, 0x96, 0x08, 0x10, 0xec, 0x75, 0x27, 0x66, 0x80, - 0xa4, 0x44, 0x97, 0x60, 0xfb, 0x59, 0x0a, 0xc9, 0x03, 0xf8, 0x80, 0xc6, - 0xb4, 0x8e, 0xa4, 0x66, 0xe7, 0xfc, 0x27, 0xb2, 0xed, 0x8c, 0x26, 0x0e, - 0xab, 0x24, 0x55, 0xec, 0xe2, 0x97, 0xa1, 0x52, 0xa2, 0x41, 0x9d, 0xda, - 0x50, 0x77, 0xb2, 0xc8, 0xe6, 0xed, 0x89, 0x16, 0x13, 0x33, 0xb8, 0xf9, - 0x74, 0x54, 0xb7, 0x49, 0x8c, 0x1b, 0xdf, 0xa6, 0xf6, 0xe4, 0x54, 0xac, - 0x2c, 0x0f, 0x87, 0x19, 0x29, 0x68, 0x4a, 0xc1, 0x95, 0xd0, 0x5d, 0x08, - 0xa4, 0x12, 0x00, 0xae, 0xf5, 0xb8, 0x7a, 0x9c, 0x04, 0x66, 0x8d, 0xbd, - 0x04, 0x57, 0x45, 0x9a, 0x03, 0x82, 0x8d, 0x8b, 0xd6, 0x71, 0x87, 0xa0, - 0x8b, 0x07, 0x37, 0xdc, 0xd4, 0x70, 0x06, 0xf2, 0x66, 0xe6, 0xd5, 0xf3, - 0xb3, 0x49, 0xa5, 0xb9, 0x0b, 0x0d, 0xae, 0x7d, 0xd4, 0x48, 0xb1, 0xd6, - 0xa4, 0xb0, 0x20, 0x4c, 0xd7, 0x37, 0xf3, 0x33, 0x52, 0x49, 0xbc, 0x89, - 0x55, 0x80, 0xf0, 0x1c, 0xe6, 0x15, 0x6c, 0xa8, 0x45, 0x4a, 0x0e, 0xe2, - 0x96, 0x33, 0x55, 0xe7, 0x49, 0x7e, 0x0e, 0xa7, 0xa3, 0x4d, 0x35, 0x2e, - 0x84, 0xa7, 0xd5, 0xe2, 0x92, 0xf0, 0x48, 0x22, 0x1e, 0x70, 0xf0, 0x12, - 0x10, 0x31, 0x8e, 0x3f, 0x8f, 0xf2, 0xd3, 0x0f, 0xfa, 0xfb, 0xca, 0x1d, - 0x3a, 0x9c, 0xb2, 0x13, 0xe5, 0xd0, 0x64, 0xad, 0x08, 0x39, 0x49, 0x68, - 0x91, 0x0c, 0xe5, 0x84, 0x99, 0x66, 0x9d, 0x99, 0xd4, 0xc6, 0x3e, 0x11, - 0xda, 0xf9, 0xfa, 0xdc, 0xa9, 0x64, 0x8b, 0x79, 0xc2, 0xcd, 0xb0, 0xf1, - 0xf4, 0xe3, 0x7d, 0x1e, 0xa2, 0xf1, 0x7c, 0x92, 0x69, 0x87, 0x59, 0x47, - 0x76, 0xca, 0xe3, 0x99, 0xff, 0x3f, 0x54, 0xef, 0x3f, 0x20, 0xa7, 0x9d, - 0x00, 0xd4, 0x27, 0x8c, 0xbb, 0x63, 0x08, 0x7d, 0xc0, 0x3f, 0x33, 0x4f, - 0x30, 0xb4, 0xdc, 0x6e, 0x6a, 0x94, 0x36, 0x6f, 0x9f, 0xc0, 0xd6, 0xd0, - 0x65, 0x32, 0x74, 0x79, 0x63, 0x98, 0xef, 0x9c, 0xef, 0xa7, 0x2d, 0xec, - 0x4b, 0x77, 0xc1, 0x41, 0x94, 0x4a, 0xb6, 0xc1, 0x92, 0x9e, 0x14, 0x7b, - 0xb1, 0xcf, 0x84, 0x3a, 0x9d, 0xdf, 0x4c, 0x90, 0x7f, 0x52, 0x03, 0x9d, - 0x46, 0x6f, 0xcc, 0xa2, 0xfe, 0xa3, 0x84, 0xda, 0xd2, 0xe5, 0xd3, 0xac, - 0x95, 0x83, 0x9a, 0x81, 0x94, 0x26, 0x72, 0x81, 0x43, 0x0a, 0x88, 0xcb, - 0x4f, 0xcd, 0x80, 0xb0, 0xf2, 0x24, 0x67, 0x0c, 0x80, 0x0e, 0x10, 0x9d, - 0x1a, 0xc4, 0x99, 0xcd, 0x60, 0x57, 0xbe, 0x8f, 0xc7, 0x8a, 0x87, 0x6b, - 0x00, 0xb4, 0x0a, 0x9c, 0xb3, 0xe7, 0x4a, 0x32, 0x43, 0x8f, 0xd0, 0xa2, - 0x58, 0x23, 0x5b, 0x7e, 0x28, 0x3c, 0xb1, 0x97, 0xb9, 0x9d, 0x37, 0x10, - 0x04, 0x61, 0xcf, 0xc6, 0x08, 0x5e, 0xc7, 0x97, 0x3a, 0x29, 0xfb, 0x7f, - 0x4f, 0x8c, 0x7a, 0x3e, 0x6a, 0xbd, 0xc2, 0xa0, 0x3d, 0x32, 0xe1, 0xda, - 0xf7, 0xe5, 0xd7, 0x89, 0x4c, 0xa0, 0x9c, 0x69, 0xef, 0xb3, 0x6a, 0x40, - 0xd2, 0x7c, 0x13, 0x84, 0x41, 0x05, 0x20, 0xbe, 0x69, 0x41, 0x8d, 0x73, - 0x4c, 0x22, 0x8d, 0x31, 0x21, 0xc1, 0xc8, 0x09, 0x48, 0xc9, 0x39, 0x79, - 0xea, 0xb9, 0xc4, 0x08, 0x02, 0xe4, 0x86, 0x60, 0xb6, 0x15, 0x04, 0x17, - 0x08, 0xc4, 0x71, 0xb7, 0x2d, 0x85, 0xd9, 0x0e, 0x49, 0x19, 0xf4, 0x09, - 0x7f, 0xaa, 0x48, 0x77, 0xf2, 0x12, 0xec, 0x2f, 0x40, 0x2b, 0x7a, 0xbf, - 0x8c, 0xb0, 0x72, 0xb1, 0x22, 0x4f, 0xc2, 0x4d, 0x53, 0x8f, 0xa3, 0xe3, - 0x9d, 0x24, 0x7d, 0xf3, 0xea, 0x94, 0x29, 0xed, 0xec, 0x8f, 0xed, 0xec, - 0xc8, 0xb0, 0x0d, 0xc0, 0x14, 0x3d, 0xb2, 0xf8, 0xe4, 0x95, 0x78, 0xee, - 0x8e, 0x74, 0x8c, 0x34, 0xea, 0x5f, 0xcc, 0xcf, 0x6e, 0x2f, 0x4d, 0x85, - 0x79, 0x7b, 0x17, 0x6d, 0x73, 0x35, 0xf2, 0x93, 0xbb, 0xe0, 0xfe, 0xa4, - 0xed, 0xae, 0xd6, 0x82, 0x7a, 0xb4, 0x4e, 0x74, 0x74, 0xbf, 0x69, 0x23, - 0xdf, 0xcc, 0xe0, 0xdf, 0x77, 0xa1, 0x08, 0x3e, 0xc9, 0xd9, 0xf5, 0x8a, - 0x39, 0x6c, 0xa6, 0x93, 0x01, 0xd4, 0x26, 0xd3, 0x58, 0xf4, 0x14, 0xa1, - 0x05, 0x39, 0x00, 0x56, 0x09, 0x23, 0xaa, 0xd2, 0xe3, 0x35, 0x07, 0x43, - 0x06, 0xdf, 0xf4, 0x73, 0xd8, 0xa2, 0x08, 0x44, 0x6b, 0x61, 0x5b, 0x94, - 0x5c, 0xe1, 0x6e, 0xf8, 0xbd, 0x2b, 0x82, 0x31, 0xa4, 0xc8, 0x7e, 0xc4, - 0xaf, 0x4e, 0x04, 0x52, 0x1b, 0xc5, 0x1b, 0x34, 0x87, 0x43, 0xef, 0x51, - 0x76, 0xf6, 0x67, 0x16, 0x79, 0x40, 0xf6, 0xff, 0x3c, 0x85, 0x55, 0x7c, - 0x1e, 0x55, 0x2a, 0x27, 0xab, 0xdf, 0x0a, 0xf9, 0x0b, 0x89, 0x44, 0x0f, - 0x31, 0x86, 0xfb, 0x01, 0x0a, 0x3f, 0x0b, 0xb0, 0xa2, 0x80, 0x50, 0x28, - 0x84, 0x13, 0x6a, 0x84, 0x59, 0xd0, 0xb5, 0x0d, 0x72, 0x4f, 0x40, 0x72, - 0x6b, 0x86, 0x19, 0x4b, 0x3d, 0x80, 0xe5, 0xba, 0x27, 0xfc, 0x67, 0xfd, - 0xea, 0x87, 0xd6, 0x68, 0x57, 0xca, 0x6c, 0x5a, 0x47, 0x4b, 0x32, 0x3b, - 0x47, 0x05, 0xb5, 0x00, 0x8d, 0x59, 0x50, 0xbc, 0x48, 0x50, 0x37, 0xe4, - 0x5b, 0xc5, 0xc5, 0x0c, 0x0a, 0xcd, 0x70, 0x06, 0xe0, 0xdd, 0xf3, 0xc0, - 0x21, 0xc0, 0x8a, 0xd2, 0x74, 0x85, 0x6a, 0xcb, 0x63, 0x6a, 0xd9, 0xbd, - 0x25, 0xa8, 0x55, 0xf1, 0x80, 0x06, 0x3d, 0xc1, 0x8e, 0x42, 0x5a, 0xeb, - 0xd0, 0x9d, 0x5f, 0x37, 0x83, 0x01, 0xd6, 0xe2, 0xbe, 0xf8, 0x88, 0x4a, - 0x91, 0x3e, 0xaa, 0xb1, 0x5c, 0x36, 0x92, 0x40, 0xff, 0xa1, 0x58, 0x5d, - 0xd9, 0x2d, 0x15, 0xbf, 0xbf, 0xaa, 0xfc, 0x9b, 0x90, 0xe0, 0x6f, 0x85, - 0xff, 0x89, 0xa3, 0x43, 0x05, 0x4b, 0x1f, 0x48, 0x20, 0xec, 0x1e, 0xbe, - 0x14, 0xc7, 0xd4, 0x88, 0x83, 0xbd, 0x93, 0xcd, 0x0f, 0x4a, 0x5c, 0x69, - 0x3f, 0xcc, 0xe3, 0x0d, 0xf9, 0xfb, 0xab, 0xee, 0xbf, 0x3c, 0xd1, 0xed, - 0x0d, 0x4b, 0xf5, 0xf7, 0x71, 0xec, 0x86, 0xcb, 0x02, 0xa9, 0x04, 0x13, - 0x6f, 0xa6, 0x98, 0x16, 0x26, 0xb3, 0xc8, 0xa4, 0x7a, 0xdb, 0xd7, 0x48, - 0x88, 0x1c, 0xa6, 0xac, 0x64, 0xac, 0xd9, 0x31, 0xeb, 0xa5, 0x99, 0xfa, - 0xeb, 0xc7, 0xa1, 0x18, 0x37, 0xda, 0xc3, 0xcd, 0x74, 0xd1, 0xd8, 0xee, - 0x3e, 0x46, 0xbe, 0xa3, 0x7f, 0x80, 0xa5, 0x40, 0x34, 0xa2, 0x11, 0xf2, - 0x59, 0x3c, 0x2e, 0xdf, 0x08, 0x83, 0x47, 0x0e, 0xb1, 0x9f, 0x1d, 0xd2, - 0xc2, 0x83, 0xd3, 0xd3, 0xdc, 0xec, 0x85, 0x83, 0x8f, 0x1c, 0x5a, 0x5b, - 0x8b, 0xab, 0x57, 0xb4, 0xd0, 0x85, 0xba, 0xad, 0x2a, 0x2f, 0x7c, 0xec, - 0xa6, 0xfa, 0x46, 0x25, 0x46, 0x27, 0x55, 0x7c, 0xfb, 0xd5, 0x07, 0x6d, - 0x4c, 0xbc, 0xa3, 0x39, 0x63, 0x61, 0xa2, 0x4a, 0x6f, 0x4f, 0x2e, 0xc6, - 0xb9, 0x91, 0xcf, 0xea, 0x1f, 0xad, 0x4b, 0x1b, 0x9c, 0x32, 0xfb, 0x26, - 0xaf, 0xb9, 0xb0, 0xed, 0x9b, 0xe7, 0x34, 0xf5, 0x7e, 0x27, 0xc3, 0x7c, - 0x80, 0x6e, 0xa6, 0x74, 0xa5, 0x59, 0x6e, 0x04, 0x37, 0x3f, 0x29, 0xa4, - 0x9e, 0xd3, 0xb2, 0x02, 0x5a, 0x6a, 0x94, 0xe7, 0x81, 0xb7, 0xcd, 0xa1, - 0x14, 0xaa, 0xcc, 0xd0, 0x39, 0x06, 0xa6, 0xb6, 0x76, 0xd5, 0xa6, 0x09, - 0xfd, 0x93, 0x54, 0x91, 0x13, 0x29, 0xd4, 0x83, 0x22, 0x93, 0x23, 0x56, - 0x24, 0x3d, 0xee, 0x57, 0xb8, 0x8e, 0x39, 0x1e, 0xb2, 0xf0, 0x6a, 0x0b, - 0x4d, 0x07, 0x36, 0x4b, 0xfb, 0x39, 0xcd, 0x22, 0x75, 0xe2, 0x5a, 0xd0, - 0x00, 0x5b, 0x8f, 0x2b, 0xc2, 0x97, 0x49, 0x99, 0x56, 0x9e, 0xfa, 0x24, - 0x3a, 0x99, 0xa5, 0x49, 0xa6, 0x63, 0x1b, 0x8e, 0xcf, 0x18, 0x7f, 0xbc, - 0xf5, 0xc2, 0x42, 0x0b, 0x8c, 0x39, 0xab, 0xad, 0x46, 0x64, 0x2d, 0x1d, - 0x47, 0x69, 0xc8, 0xae, 0x3c, 0xd5, 0xbe, 0x1d, 0x79, 0x41, 0x2f, 0x6e, - 0xed, 0x40, 0x02, 0x23, 0x4e, 0xc0, 0x58, 0xea, 0xe9, 0x67, 0x9b, 0xde, - 0x7c, 0x01, 0x15, 0x08, 0x2a, 0x7c, 0x1c, 0x15, 0xe0, 0x61, 0xad, 0xb9, - 0xe7, 0x2b, 0x7d, 0x35, 0xa1, 0xac, 0xbf, 0x92, 0x3a, 0xcf, 0xd3, 0xea, - 0xee, 0x32, 0x13, 0x48, 0x53, 0x05, 0x1c, 0x4b, 0x4f, 0x21, 0x15, 0x00, - 0xe3, 0x5c, 0x18, 0x4e, 0xa3, 0x2b, 0x4f, 0x4b, 0x1d, 0xf3, 0xf4, 0xc2, - 0x63, 0xb7, 0x80, 0xd3, 0x65, 0x03, 0x0c, 0xcd, 0xb8, 0xc8, 0x4d, 0x46, - 0x88, 0x21, 0x8a, 0x08, 0xc1, 0x63, 0xdf, 0x36, 0xb6, 0xc1, 0xd3, 0x9e, - 0xe5, 0xf0, 0xbf, 0xf3, 0x34, 0x78, 0xe9, 0x11, 0x03, 0x31, 0x5d, 0xa1, - 0x0d, 0x2b, 0xa6, 0x5a, 0x4a, 0xcd, 0x41, 0xf0, 0x86, 0x41, 0xc8, 0xf6, - 0xa8, 0xdd, 0x58, 0x8b, 0x0f, 0x4b, 0x00, 0xa5, 0x4e, 0x5a, 0x65, 0xe3, - 0xf3, 0x00, 0x2d, 0x6a, 0xd0, 0x65, 0x08, 0xe6, 0x87, 0x8c, 0xdf, 0x54, - 0x5b, 0x25, 0xcd, 0x9b, 0xe3, 0x05, 0xe5, 0x86, 0xf2, 0x73, 0x67, 0x7f, - 0xc5, 0xd4, 0x54, 0x86, 0x1d, 0xa1, 0x71, 0x39, 0x45, 0x58, 0xe6, 0x95, - 0xc4, 0x52, 0x8f, 0x60, 0x7f, 0x92, 0x84, 0xdf, 0x70, 0x80, 0x2f, 0x38, - 0x61, 0x3e, 0x55, 0x14, 0xcc, 0x65, 0xcd, 0x99, 0x98, 0x70, 0x1e, 0x43, - 0x39, 0xbc, 0x92, 0xba, 0x81, 0x47, 0x67, 0x37, 0x5d, 0x2a, 0x98, 0x79, - 0x8d, 0x7e, 0xcd, 0x6c, 0xf1, 0xca, 0x00, 0xed, 0xd6, 0x0d, 0xee, 0x9d, - 0x3a, 0xa9, 0xae, 0x90, 0x62, 0xcc, 0x03, 0x31, 0x1d, 0x90, 0xd5, 0x80, - 0xae, 0x31, 0x6c, 0x86, 0x93, 0xbe, 0xb2, 0x5a, 0xef, 0x10, 0xd3, 0x02, - 0x29, 0x9a, 0x37, 0x32, 0x20, 0x65, 0x3c, 0xb9, 0x81, 0xb6, 0xcd, 0x4f, - 0x47, 0x22, 0x41, 0xfc, 0x83, 0xdb, 0x0f, 0x8e, 0x73, 0x94, 0x12, 0x69, - 0xdc, 0xcb, 0x5b, 0x93, 0x56, 0x08, 0xe5, 0xf8, 0x54, 0xc7, 0x21, 0x8d, - 0x35, 0x70, 0x8e, 0xf1, 0x06, 0x50, 0x9e, 0xf8, 0x1c, 0x85, 0x12, 0xa4, - 0x8f, 0x7c, 0x82, 0x7c, 0x09, 0xa0, 0x06, 0xbe, 0xa9, 0x7e, 0x6e, 0x57, - 0xcf, 0xaa, 0x67, 0xfa, 0xf2, 0xee, 0x3c, 0x84, 0x06, 0xba, 0x78, 0xf1, - 0x8d, 0xa2, 0xee, 0xb0, 0xe5, 0x39, 0x03, 0x9b, 0xc5, 0x8c, 0xef, 0x0b, - 0x8a, 0xd2, 0xa2, 0xcf, 0xc6, 0xc8, 0x1e, 0x5a, 0xce, 0xcc, 0x8f, 0xe5, - 0xbc, 0xb6, 0x58, 0x97, 0xab, 0xff, 0x57, 0x1f, 0xba, 0xae, 0x5f, 0x6f, - 0x7b, 0x99, 0x41, 0x5b, 0x33, 0x5b, 0x0c, 0xcf, 0x9d, 0x64, 0x4e, 0x15, - 0xe3, 0xff, 0x0e, 0x90, 0x0d, 0xb1, 0xf1, 0x13, 0x9f, 0xda, 0x33, 0x80, - 0x4b, 0x8d, 0xbc, 0x74, 0x45, 0x27, 0x2c, 0x73, 0xb0, 0x31, 0xc9, 0x93, - 0xe1, 0xb3, 0x23, 0xe5, 0xea, 0xcc, 0x86, 0x5f, 0xef, 0x31, 0xcc, 0xbd, - 0x36, 0x75, 0x10, 0xdf, 0xcd, 0x01, 0xb4, 0x4e, 0x61, 0xfa, 0x96, 0x92, - 0xcc, 0x84, 0xc6, 0xd9, 0x0a, 0x64, 0x74, 0x34, 0x24, 0xa4, 0xb8, 0x9d, - 0x86, 0xe6, 0x75, 0x89, 0x00, 0xdc, 0x12, 0x19, 0x30, 0x3e, 0xdd, 0xc0, - 0x4b, 0x6f, 0xff, 0x29, 0x07, 0x59, 0xff, 0xae, 0x62, 0x74, 0xe2, 0x99, - 0x59, 0xa9, 0x87, 0xf9, 0x73, 0xd9, 0x1f, 0x64, 0xe0, 0x8b, 0x62, 0xdd, - 0x7d, 0xb6, 0x55, 0x69, 0x32, 0x38, 0x41, 0x63, 0xe7, 0xa6, 0x0e, 0x2d, - 0xd6, 0xb8, 0x99, 0x4d, 0x67, 0xd0, 0xca, 0x94, 0x1c, 0x5e, 0xfe, 0x78, - 0x23, 0x80, 0x89, 0x74, 0xfe, 0xe2, 0xe6, 0x43, 0x65, 0xa7, 0xd7, 0xf0, - 0x41, 0x7e, 0x7b, 0x4e, 0x18, 0x99, 0x93, 0x36, 0x3d, 0x75, 0xf3, 0x87, - 0x90, 0x2e, 0xdb, 0x7b, 0x7f, 0x92, 0xc6, 0x2c, 0xc4, 0x3b, 0x93, 0x46, - 0x82, 0x87, 0x02, 0xad, 0x69, 0xd9, 0x61, 0xcb, 0x21, 0x87, 0x7c, 0x7d, - 0xa7, 0xdb, 0x9c, 0x76, 0x5b, 0x3b, 0xa7, 0xeb, 0xb2, 0xb6, 0xca, 0x18, - 0x28, 0x05, 0x0f, 0x8c, 0xe3, 0x0f, 0x6b, 0x42, 0x83, 0x20, 0x4c, 0x4b, - 0xb5, 0x8a, 0xa7, 0x15, 0x2f, 0x3e, 0xa8, 0x94, 0xb6, 0x7c, 0x11, 0xc3, - 0xf7, 0x2c, 0xa3, 0xad, 0xe0, 0x59, 0x49, 0x60, 0xaf, 0x15, 0xdf, 0xa0, - 0xdb, 0xef, 0x6f, 0xf8, 0xd7, 0xa3, 0x5e, 0x8d, 0x15, 0x5f, 0x20, 0x67, - 0x9f, 0xe5, 0xd0, 0x06, 0x0b, 0xa3, 0xa4, 0x4d, 0x2b, 0x03, 0xa5, 0x57, - 0x3f, 0x2f, 0x6c, 0x93, 0xce, 0x30, 0xa1, 0x2a, 0x22, 0x48, 0x95, 0x52, - 0xc0, 0xb6, 0xde, 0x67, 0x37, 0x69, 0xe5, 0xaa, 0x91, 0xf9, 0x02, 0x2e, - 0xab, 0x54, 0xb3, 0xf8, 0x9a, 0x8d, 0x0c, 0x2a, 0x1a, 0x8e, 0xb0, 0xc8, - 0x6f, 0xbd, 0x2c, 0x9f, 0xf4, 0x8b, 0x74, 0xdc, 0xdb, 0x6a, 0xa6, 0x6d, - 0x86, 0xd8, 0x42, 0x87, 0x93, 0x50, 0x12, 0x35, 0x84, 0xba, 0x65, 0x95, - 0x78, 0x2b, 0xd7, 0x7d, 0x31, 0xdc, 0x74, 0x3c, 0x92, 0xb3, 0xf2, 0xd1, - 0x7f, 0x16, 0x15, 0x9d, 0xb6, 0x3d, 0x9a, 0x42, 0x19, 0xe2, 0x29, 0x5b, - 0x75, 0xab, 0x69, 0x8a, 0x99, 0x6d, 0x21, 0x33, 0x05, 0xdb, 0xe3, 0x78, - 0xa1, 0x17, 0x1e, 0xaf, 0x57, 0x8d, 0x85, 0xd1, 0xa2, 0x4b, 0xc9, 0xa9, - 0x59, 0x09, 0xbb, 0x00, 0x40, 0x2f, 0x9f, 0x60, 0xe4, 0x64, 0xf9, 0x1e, - 0x8d, 0xf7, 0x99, 0x27, 0xd0, 0xf7, 0x04, 0x9f, 0x23, 0x72, 0x87, 0xda, - 0x80, 0xea, 0xdc, 0xd5, 0x55, 0x88, 0x90, 0xdf, 0x7a, 0xa7, 0xad, 0xad, - 0xa6, 0x0e, 0x42, 0xf0, 0xb0, 0x8f, 0x40, 0x26, 0x97, 0xaf, 0x2c, 0x21, - 0x8a, 0x51, 0x39, 0x97, 0x43, 0x58, 0xaf, 0xa9, 0x25, 0x39, 0x7a, 0xa5, - 0x65, 0xd9, 0x59, 0xd2, 0x11, 0x40, 0x14, 0x06, 0x5b, 0xa9, 0x5e, 0xaa, - 0xf2, 0x07, 0x4d, 0x2f, 0x85, 0x4d, 0x55, 0xdb, 0xe9, 0x3a, 0xef, 0xcb, - 0xa5, 0xb4, 0x59, 0x35, 0x6d, 0x97, 0xd5, 0x4b, 0xc6, 0x2a, 0xca, 0x50, - 0x99, 0x2a, 0x02, 0xa8, 0x38, 0x46, 0xcb, 0xd9, 0xa7, 0xe0, 0x01, 0x11, - 0xac, 0x96, 0xb7, 0x8d, 0xbd, 0xf7, 0x14, 0x60, 0xbc, 0xef, 0xec, 0x4e, - 0x69, 0x89, 0x66, 0x6c, 0x0e, 0xa3, 0xbf, 0x99, 0xf9, 0x1d, 0x60, 0x60, - 0x30, 0xc8, 0xd1, 0x6a, 0x92, 0x93, 0x8a, 0xfd, 0x31, 0x62, 0xbe, 0xd0, - 0x10, 0xed, 0x73, 0x2c, 0x52, 0x83, 0xca, 0x39, 0x99, 0x3b, 0xfc, 0x34, - 0x7b, 0xc0, 0xc2, 0x4b, 0x7a, 0x76, 0x92, 0x99, 0x1f, 0x92, 0x41, 0x3f, - 0x17, 0xf4, 0x9b, 0x5f, 0xa1, 0x8a, 0x4c, 0xa2, 0x55, 0xec, 0x9f, 0x94, - 0x6e, 0x2b, 0x9f, 0x55, 0xe1, 0x03, 0xf4, 0x54, 0x4a, 0x61, 0x57, 0x40, - 0x59, 0x85, 0x9d, 0x82, 0xfd, 0x18, 0x3f, 0x14, 0xdb, 0x3f, 0x8d, 0x0d, - 0x5d, 0x56, 0x2a, 0xa4, 0xbe, 0xef, 0xdc, 0xe9, 0x98, 0xcf, 0x92, 0xab, - 0x08, 0x09, 0x16, 0xec, 0x83, 0xe9, 0x3e, 0xd5, 0xfe, 0x76, 0x4b, 0x02, - 0x48, 0x11, 0x32, 0xf2, 0x43, 0x3f, 0x48, 0x9a, 0xd6, 0xc9, 0x53, 0xf8, - 0x3d, 0xd8, 0xb8, 0xe5, 0x5f, 0xd0, 0xba, 0xa5, 0x7d, 0x65, 0xa2, 0x7e, - 0x9b, 0xc4, 0xa2, 0xb2, 0x52, 0x8d, 0x91, 0x5c, 0xeb, 0xb8, 0x65, 0xac, - 0xd3, 0xb5, 0x7b, 0x60, 0xab, 0x99, 0xa2, 0xe2, 0x48, 0x59, 0xe5, 0x76, - 0x0c, 0x89, 0xd3, 0x7c, 0x47, 0x4c, 0x46, 0xcd, 0x76, 0x32, 0x1d, 0x06, - 0x9f, 0x63, 0xd8, 0xa1, 0xd7, 0xf8, 0x09, 0x78, 0x65, 0xe7, 0x46, 0x43, - 0xb9, 0x5a, 0x25, 0x8a, 0x7d, 0x11, 0x95, 0x0c, 0x73, 0x25, 0xca, 0x50, - 0xb3, 0x70, 0x97, 0x2e, 0x96, 0x57, 0xc9, 0xda, 0x1a, 0x83, 0x11, 0xaa, - 0x9f, 0x8c, 0x29, 0x16, 0xc4, 0x8c, 0xb8, 0xb5, 0xa7, 0xee, 0xb3, 0x1c, - 0x88, 0x2e, 0x2e, 0x76, 0x7a, 0xed, 0x1f, 0x13, 0xf5, 0xd8, 0x5a, 0x52, - 0xf0, 0xbd, 0x94, 0x95, 0x24, 0x53, 0xe0, 0x24, 0xe8, 0x4c, 0xda, 0x39, - 0x5f, 0xbb, 0xc0, 0xfb, 0x67, 0xf8, 0x18, 0x4d, 0x9d, 0xaa, 0x2d, 0x4a, - 0x7a, 0xf3, 0x78, 0xac, 0x21, 0x93, 0x7a, 0xb0, 0xd4, 0x2f, 0x81, 0xe4, - 0xe7, 0xd6, 0x18, 0x22, 0x9e, 0x81, 0x94, 0x72, 0x4e, 0x97, 0xbd, 0xb7, - 0xa9, 0x6c, 0x31, 0x2f, 0xdc, 0x24, 0x46, 0x42, 0x4e, 0x01, 0xd1, 0x68, - 0x9a, 0x5a, 0x03, 0xc1, 0x15, 0x2d, 0x08, 0x60, 0xa9, 0xe4, 0x68, 0x67, - 0xb5, 0x1c, 0x87, 0xa7, 0xe3, 0x53, 0x12, 0xe3, 0xc4, 0x79, 0xfd, 0xd1, - 0xf5, 0x2b, 0xb2, 0x98, 0xf6, 0x5c, 0xa6, 0x6f, 0xa4, 0xd9, 0x9e, 0x74, - 0xdd, 0x11, 0x1c, 0xea, 0x95, 0x40, 0xfc, 0x4a, 0xd3, 0x82, 0x06, 0x72, - 0x33, 0xb8, 0xd2, 0x27, 0xe4, 0x06, 0xdf, 0x80, 0x82, 0x68, 0xef, 0xda, - 0x03, 0x86, 0x1a, 0xb5, 0x9e, 0x12, 0x2f, 0xf7, 0x20, 0x32, 0x69, 0xe7, - 0x4d, 0xa0, 0x38, 0xfc, 0x0c, 0x80, 0x43, 0xe4, 0x50, 0xbc, 0x60, 0x3d, - 0x6c, 0x3a, 0xeb, 0x98, 0xf2, 0xde, 0xfa, 0x0b, 0x79, 0x42, 0xbd, 0x98, - 0x7d, 0x6f, 0xdf, 0x06, 0x1e, 0x8a, 0x68, 0x3b, 0x86, 0x95, 0x22, 0x2e, - 0xfb, 0x48, 0x79, 0x8d, 0x3a, 0x02, 0xca, 0xf7, 0xf4, 0x3e, 0x63, 0xb6, - 0x7c, 0x95, 0x80, 0xb0, 0xc2, 0x7b, 0x1c, 0xa2, 0x29, 0xf1, 0x87, 0xb2, - 0x57, 0x24, 0x3e, 0xac, 0x52, 0x0c, 0x32, 0xff, 0x66, 0x83, 0x33, 0xb5, - 0x9b, 0x75, 0x77, 0x4c, 0xa9, 0x70, 0x8c, 0xf6, 0x07, 0x29, 0x3c, 0xc7, - 0xed, 0x74, 0x63, 0x19, 0x46, 0x6b, 0x4b, 0x3b, 0x9e, 0x49, 0x70, 0x13, - 0x16, 0x8f, 0x82, 0xdf, 0x4c, 0xed, 0x45, 0xb8, 0x65, 0x9e, 0xc2, 0x84, - 0x30, 0x27, 0x7e, 0x3c, 0x77, 0xdb, 0xd3, 0xe2, 0x17, 0xd4, 0x38, 0x53, - 0x34, 0x83, 0xdd, 0x45, 0x0b, 0xf5, 0x2c, 0x6e, 0x3a, 0x7b, 0x1a, 0x27, - 0x4e, 0xa2, 0x7d, 0xb9, 0x00, 0x40, 0x1d, 0x32, 0xd5, 0x87, 0x65, 0xc0, - 0xeb, 0xba, 0xf8, 0x52, 0x37, 0x82, 0x4e, 0x74, 0xcb, 0x29, 0x51, 0xa5, - 0xcf, 0x35, 0xb5, 0x26, 0x80, 0x2c, 0x77, 0x63, 0x31, 0x34, 0x77, 0x70, - 0xb9, 0x1e, 0x67, 0x8a, 0x3d, 0x14, 0x06, 0x1e, 0xf8, 0x66, 0xfa, 0xf0, - 0xdf, 0xcf, 0xfb, 0xd8, 0xa3, 0x84, 0x86, 0xe3, 0xdf, 0x36, 0xbd, 0xb3, - 0x8b, 0xbe, 0x4f, 0x68, 0xdc, 0x70, 0x9e, 0xc8, 0xa8, 0x51, 0x7f, 0x52, - 0x0b, 0xda, 0x9f, 0xcf, 0x1d, 0x35, 0xba, 0x24, 0xeb, 0x58, 0x30, 0x19, - 0x94, 0xef, 0x55, 0xe9, 0x91, 0xec, 0x4c, 0xa6, 0x45, 0x08, 0xdb, 0xe9, - 0xce, 0x35, 0xd2, 0xfa, 0x49, 0xa4, 0x56, 0xd8, 0xf4, 0xc0, 0x47, 0x56, - 0xec, 0x5f, 0xc4, 0x5e, 0x78, 0xa4, 0x3d, 0x1b, 0x40, 0x2a, 0x53, 0x8a, - 0x94, 0x18, 0x57, 0xc9, 0xe3, 0xfa, 0xc9, 0xfe, 0xa9, 0xbc, 0x67, 0x96, - 0xd0, 0x9f, 0xb9, 0x0e, 0x4e, 0xb9, 0x1e, 0x75, 0xb2, 0x1e, 0x66, 0xf1, - 0xd4, 0x01, 0x2f, 0xbd, 0x2b, 0x8e, 0x87, 0x63, 0x67, 0xfe, 0x99, 0xc1, - 0x6a, 0x6f, 0xf7, 0x9c, 0xce, 0x32, 0xf7, 0x5b, 0x23, 0x9a, 0x59, 0x7c, - 0xb9, 0x2e, 0xc6, 0x1f, 0xee, 0x70, 0x21, 0x03, 0xc4, 0x74, 0xca, 0x38, - 0xff, 0x1a, 0x72, 0x0e, 0x0c, 0x80, 0xf1, 0x4a, 0xaf, 0x45, 0x0f, 0x6c, - 0xd3, 0x50, 0x44, 0x48, 0x18, 0xd2, 0x79, 0x09, 0x47, 0xed, 0x22, 0xd1, - 0x12, 0xcd, 0x72, 0x46, 0x05, 0x1f, 0xc0, 0xa8, 0x3c, 0x86, 0xf7, 0xab, - 0x27, 0x64, 0x62, 0x3f, 0x82, 0x6b, 0x74, 0x51, 0x47, 0x25, 0x3e, 0xbf, - 0x5e, 0x6a, 0x5c, 0x36, 0x6e, 0xee, 0xe6, 0x0d, 0xe9, 0x97, 0xbe, 0xb2, - 0x9d, 0xfb, 0x00, 0xc4, 0xfd, 0xf5, 0x0f, 0x7f, 0x00, 0xba, 0x54, 0x6f, - 0xca, 0xa9, 0x79, 0xf4, 0x5f, 0xaa, 0x29, 0x06, 0x4b, 0x1a, 0x2b, 0xfe, - 0x5f, 0x06, 0xc6, 0xd2, 0x8e, 0x08, 0x49, 0xcf, 0x9d, 0x6b, 0x4b, 0xe5, - 0xd6, 0x3b, 0x73, 0x73, 0x59, 0x11, 0xc4, 0x74, 0xde, 0x8d, 0x24, 0x80, - 0x49, 0x52, 0xdf, 0xfb, 0x3b, 0xd7, 0x12, 0xf9, 0x17, 0xa1, 0xa0, 0x6b, - 0x22, 0x1b, 0x6b, 0xa5, 0x98, 0xa7, 0xac, 0xd7, 0x0f, 0x70, 0x70, 0x4e, - 0xd7, 0x4a, 0x05, 0x6f, 0xf9, 0x52, 0x95, 0xc2, 0xb3, 0x2f, 0x22, 0x5f, - 0x07, 0xa0, 0x54, 0x28, 0xfc, 0x99, 0xfb, 0xc4, 0x76, 0x42, 0xb7, 0x6b, - 0x30, 0x12, 0x15, 0xae, 0x86, 0x6b, 0xc5, 0x36, 0xb2, 0x5d, 0xe0, 0x5f, - 0x3d, 0x43, 0xed, 0x61, 0x8c, 0x9a, 0xc2, 0x31, 0x7d, 0x9f, 0x70, 0xe8, - 0x9f, 0xd2, 0xec, 0x11, 0xb8, 0xfb, 0xdc, 0x3a, 0x46, 0xb2, 0xb0, 0x27, - 0xff, 0xfd, 0x92, 0x15, 0x6a, 0x82, 0x3d, 0x8d, 0xfd, 0xa1, 0x8c, 0x49, - 0x82, 0xd3, 0x70, 0x52, 0x86, 0xbe, 0x62, 0x3b, 0x39, 0x88, 0x2e, 0x05, - 0x89, 0x19, 0xe8, 0xf6, 0x4a, 0xb9, 0x25, 0x8d, 0x8f, 0x91, 0x0a, 0x5e, - 0x56, 0x4d, 0xdb, 0xbb, 0x17, 0xbf, 0xdf, 0xc6, 0xf1, 0xaf, 0xd3, 0xcd, - 0xd3, 0x78, 0x64, 0x49, 0x89, 0x9d, 0x45, 0x3b, 0x3e, 0x83, 0x9e, 0x53, - 0x8e, 0x7e, 0xa1, 0xf5, 0x71, 0x80, 0x3c, 0x9f, 0xdb, 0xa7, 0x21, 0x77, - 0x06, 0xcd, 0xfd, 0xf3, 0xce, 0xdf, 0x3e, 0x03, 0xbc, 0xf5, 0x48, 0x97, - 0x96, 0x53, 0xa7, 0x38, 0x53, 0xab, 0x58, 0xeb, 0xa8, 0x2d, 0x85, 0x42, - 0xde, 0x14, 0x10, 0x53, 0x34, 0x99, 0xee, 0x54, 0x5e, 0x09, 0x1c, 0x5a, - 0x3f, 0x23, 0xbd, 0x4a, 0xf3, 0xda, 0x29, 0x56, 0xf1, 0x6d, 0x16, 0x73, - 0x69, 0x65, 0x9b, 0xc8, 0x7f, 0x10, 0x8b, 0x69, 0xa8, 0xf8, 0x20, 0xac, - 0xca, 0x58, 0x17, 0x08, 0xf3, 0xce, 0x87, 0x30, 0xfe, 0x26, 0xd6, 0xcd, - 0x87, 0x17, 0x60, 0x44, 0x47, 0x94, 0x18, 0x75, 0x2a, 0x4e, 0xf4, 0xd1, - 0xc6, 0x14, 0xc6, 0xab, 0xeb, 0xfc, 0x9b, 0x44, 0x9a, 0x5f, 0x67, 0x4c, - 0x78, 0xd7, 0x7e, 0x74, 0x58, 0xa4, 0xa6, 0xd8, 0xae, 0x1f, 0x85, 0x7d, - 0xc4, 0x62, 0x27, 0x0d, 0x20, 0x57, 0x46, 0x8d, 0x84, 0xd9, 0x4f, 0xc8, - 0xf2, 0x58, 0x00, 0x3a, 0xb0, 0x6c, 0xd6, 0x14, 0xec, 0x98, 0x14, 0xb3, - 0x51, 0x9d, 0xc5, 0x54, 0xa8, 0x61, 0xcc, 0xb3, 0x99, 0x52, 0x42, 0x5c, - 0xa5, 0xb1, 0xd1, 0xcc, 0x6e, 0xe8, 0xe8, 0x44, 0x99, 0x11, 0x99, 0xd8, - 0x1a, 0x70, 0x67, 0x8e, 0x21, 0x6e, 0xa6, 0x0d, 0x67, 0x5c, 0x08, 0x58, - 0xbe, 0xe9, 0x46, 0xf5, 0xd2, 0x0f, 0xea, 0xcf, 0xdc, 0xbc, 0x0a, 0xfb, - 0x6e, 0x2e, 0x78, 0x61, 0xd0, 0xf5, 0x41, 0x74, 0x04, 0xf1, 0xe8, 0x87, - 0x50, 0x78, 0xdd, 0x55, 0x70, 0x49, 0x8a, 0xbf, 0x8a, 0x0c, 0xee, 0x98, - 0xd3, 0xde, 0x65, 0xa0, 0x1a, 0xb1, 0x93, 0x19, 0x4e, 0xf3, 0x6b, 0x56, - 0x6c, 0x2f, 0xac, 0xd1, 0xbe, 0xd0, 0x88, 0x76, 0xec, 0x69, 0xb1, 0x10, - 0xf7, 0x6e, 0x21, 0x8d, 0x67, 0x7d, 0x02, 0xba, 0x3e, 0x2a, 0xab, 0x39, - 0x9f, 0x6c, 0xfd, 0x6f, 0xce, 0xf6, 0x05, 0x6d, 0xcf, 0x04, 0x3d, 0x1b, - 0x3b, 0x02, 0xd1, 0xda, 0x28, 0x00, 0xac, 0xad, 0xc5, 0xbf, 0x73, 0x7e, - 0x37, 0x71, 0xdc, 0x53, 0xab, 0x00, 0xdf, 0x7b, 0x72, 0x6b, 0xf1, 0xdd, - 0x49, 0x71, 0x79, 0x51, 0xde, 0x04, 0x58, 0x2a, 0x46, 0x4f, 0x42, 0x72, - 0xf4, 0x61, 0xbc, 0x9c, 0xfd, 0x07, 0x47, 0x6c, 0x32, 0xdf, 0xbe, 0x58, - 0xc8, 0xa5, 0x83, 0x94, 0x99, 0x98, 0xd3, 0xf8, 0xa4, 0xea, 0x15, 0x4b, - 0xe4, 0x05, 0x56, 0xcb, 0x71, 0x9a, 0x43, 0x74, 0xaf, 0xfa, 0xcc, 0xb9, - 0x63, 0x40, 0xad, 0xe6, 0xa4, 0x0a, 0x24, 0xbd, 0x53, 0xc1, 0xd4, 0xd0, - 0x03, 0x6b, 0x91, 0x43, 0x5d, 0x36, 0xe1, 0x7c, 0x8e, 0x0b, 0xd9, 0x70, - 0x56, 0x56, 0x85, 0x3d, 0x5c, 0xb7, 0x8a, 0x8e, 0x7a, 0x18, 0xa8, 0x00, - 0x8d, 0x84, 0x66, 0x3d, 0xf7, 0xff, 0xcf, 0xba, 0x18, 0xf8, 0xe2, 0xd5, - 0xe3, 0x83, 0xbc, 0x8f, 0xd5, 0x7d, 0x20, 0x0e, 0x21, 0x8a, 0x62, 0x72, - 0x01, 0x64, 0x22, 0x9b, 0xb1, 0x17, 0x8d, 0x9a, 0x7e, 0xb8, 0x74, 0x5c, - 0x16, 0xeb, 0xe9, 0x87, 0x83, 0x32, 0x84, 0x9d, 0xb3, 0x35, 0xdc, 0x7d, - 0x49, 0xc8, 0x32, 0xd5, 0x4f, 0x8c, 0x1b, 0x04, 0xd9, 0x1f, 0x7a, 0x5a, - 0x46, 0x67, 0xa8, 0xbe, 0x6f, 0x25, 0xb9, 0x60, 0x35, 0x0b, 0x02, 0xee, - 0x1e, 0x8a, 0xc2, 0x77, 0x5c, 0x07, 0xef, 0xd1, 0x7f, 0xa8, 0xb9, 0x83, - 0xff, 0x50, 0x92, 0x79, 0x49, 0x4b, 0x79, 0x32, 0xf9, 0x15, 0x11, 0xf1, - 0x88, 0xd6, 0x0a, 0x3f, 0x3c, 0x2c, 0x54, 0x5f, 0x7e, 0xc5, 0xe8, 0xb8, - 0x7a, 0x6e, 0xd7, 0x6e, 0xcb, 0x33, 0xc1, 0xae, 0x81, 0x7b, 0x17, 0x85, - 0x7d, 0x4c, 0x15, 0x5b, 0x8c, 0xa1, 0x4f, 0xcd, 0x0d, 0x5e, 0x4d, 0x2f, - 0xe3, 0x27, 0x80, 0x63, 0xb1, 0x00, 0xf7, 0x11, 0x7c, 0x09, 0x19, 0x8c, - 0x79, 0x44, 0x94, 0xc0, 0x3f, 0x08, 0xf9, 0x89, 0x96, 0xd1, 0xa3, 0x55, - 0xae, 0x62, 0x44, 0x6f, 0x19, 0x5e, 0xa8, 0xc5, 0x17, 0xaa, 0x7f, 0xbb, - 0xba, 0x00, 0x96, 0x42, 0x00, 0x40, 0xf5, 0xec, 0x04, 0x16, 0x21, 0x23, - 0x29, 0xe7, 0x2e, 0x54, 0x93, 0x4b, 0xd0, 0x28, 0x26, 0xa4, 0xfc, 0x73, - 0xc5, 0xde, 0x47, 0x82, 0x0e, 0x02, 0x4a, 0xe9, 0x1f, 0x39, 0x17, 0x19, - 0xf3, 0xc6, 0x76, 0x2a, 0x70, 0x02, 0xb2, 0x88, 0xb8, 0x31, 0x15, 0x98, - 0xf5, 0x6d, 0x7d, 0xc3, 0x7f, 0x62, 0xb4, 0x49, 0x5e, 0xc4, 0x5e, 0x04, - 0xc1, 0xc3, 0x9f, 0x0b, 0xde, 0x0c, 0xfc, 0x9c, 0x36, 0x73, 0x00, 0x8e, - 0x85, 0x89, 0x16, 0x9a, 0x62, 0xc1, 0x7d, 0x84, 0x6c, 0x8f, 0xec, 0xe6, - 0x00, 0x50, 0x9e, 0x96, 0x84, 0xed, 0x6d, 0xf1, 0xe0, 0xef, 0xc6, 0xf0, - 0x06, 0xd3, 0x73, 0xe2, 0x4f, 0xea, 0x56, 0xcd, 0x62, 0x30, 0xb8, 0x9c, - 0x22, 0x33, 0xf5, 0xd0, 0x6a, 0x8d, 0x43, 0xaf, 0xc7, 0x03, 0x4d, 0xa3, - 0xa1, 0x82, 0x42, 0x52, 0xf7, 0x4d, 0xae, 0xd9, 0xb1, 0x6d, 0x68, 0x88, - 0x09, 0x47, 0x70, 0x70, 0xa2, 0x03, 0xe4, 0x50, 0xfb, 0x33, 0xf2, 0x00, - 0x15, 0xdb, 0x4c, 0x3e, 0x8e, 0xff, 0x39, 0x81, 0x1f, 0xd8, 0x34, 0xeb, - 0xb8, 0xa2, 0x32, 0x41, 0xd0, 0x9e, 0xdd, 0x82, 0x39, 0x60, 0x6b, 0x2d, - 0xee, 0x3c, 0x78, 0x8b, 0x4d, 0xad, 0x49, 0xa5, 0x70, 0xa9, 0x07, 0x61, - 0xe9, 0x66, 0x71, 0x75, 0x37, 0xcc, 0x00, 0x17, 0x8b, 0x22, 0x36, 0x0f, - 0x50, 0xff, 0xf7, 0x13, 0xe0, 0xad, 0xd0, 0x86, 0xbc, 0xf6, 0x95, 0xa8, - 0x14, 0xb3, 0xda, 0xb3, 0x07, 0xdc, 0x03, 0x41, 0xac, 0xe2, 0x7e, 0x4e, - 0x63, 0x9e, 0xb3, 0x8b, 0x3d, 0x32, 0x45, 0xb3, 0x23, 0x73, 0xe6, 0x43, - 0xf3, 0x5d, 0x8a, 0x34, 0x1b, 0xec, 0x78, 0xd0, 0x68, 0x87, 0xff, 0x8f, - 0xef, 0xb0, 0xc1, 0x1d, 0xc4, 0xef, 0x98, 0xd2, 0xdb, 0xe7, 0x28, 0x1a, - 0x98, 0x76, 0xd0, 0x11, 0xfb, 0x2a, 0x3b, 0x27, 0x9f, 0x7b, 0xc5, 0x1e, - 0x98, 0x1b, 0xbb, 0x06, 0x36, 0x3a, 0x22, 0xe5, 0x5c, 0x93, 0x62, 0x63, - 0x84, 0x4e, 0x94, 0x7b, 0xb7, 0x27, 0x2d, 0x00, 0x94, 0xbd, 0xf5, 0x7e, - 0x8d, 0x71, 0xd4, 0x73, 0xab, 0x4c, 0x57, 0xa4, 0xf1, 0xcf, 0x77, 0x38, - 0xc3, 0x31, 0x32, 0x3a, 0xfe, 0xf8, 0xa7, 0x38, 0xd6, 0x3d, 0xe7, 0xab, - 0xf0, 0x43, 0xc4, 0xd4, 0x0e, 0x69, 0x4f, 0x30, 0x8e, 0xd2, 0x3c, 0x8f, - 0x15, 0xba, 0xeb, 0x2d, 0x72, 0xa7, 0xf5, 0x75, 0xb0, 0xfc, 0x61, 0x13, - 0xf7, 0xd8, 0x5e, 0x37, 0x1c, 0x01, 0x78, 0x8a, 0x04, 0x51, 0xa8, 0x13, - 0x50, 0xa7, 0x33, 0x77, 0x50, 0x51, 0x31, 0x26, 0xc2, 0x53, 0x38, 0x4c, - 0x47, 0x90, 0xb6, 0xff, 0xc5, 0x7f, 0x8c, 0xa1, 0xd3, 0x35, 0x09, 0xad, - 0x1e, 0x80, 0xa5, 0x3a, 0xad, 0x30, 0x74, 0x99, 0x84, 0x1e, 0xbb, 0x5f, - 0x9b, 0x49, 0xaf, 0xde, 0x0d, 0x41, 0xf3, 0xcc, 0xfa, 0xfb, 0x63, 0xab, - 0x06, 0xad, 0xf9, 0x25, 0x04, 0x22, 0x26, 0x52, 0xbb, 0xdb, 0x85, 0x58, - 0xab, 0xde, 0x6e, 0xee, 0x9e, 0xca, 0xf8, 0x49, 0xa2, 0xf0, 0xa8, 0x14, - 0x1e, 0xb8, 0x41, 0x8e, 0xb8, 0x41, 0xcd, 0xe0, 0x43, 0x43, 0x92, 0xb0, - 0x11, 0x1f, 0xe0, 0xd8, 0x58, 0xed, 0x0d, 0xc2, 0xcf, 0xc2, 0xc4, 0x52, - 0x04, 0x64, 0xae, 0xa6, 0x5c, 0x8d, 0xb0, 0x96, 0x10, 0x77, 0xbd, 0x43, - 0x09, 0xdb, 0xe0, 0xaf, 0x85, 0x14, 0x95, 0xc4, 0x84, 0x69, 0x26, 0x07, - 0x31, 0x28, 0x1b, 0xa3, 0x8d, 0x7e, 0x30, 0xfd, 0xeb, 0x57, 0x83, 0x10, - 0xd8, 0xf3, 0x8d, 0xdb, 0xee, 0x3b, 0x18, 0x4a, 0xc2, 0xdb, 0x59, 0xa4, - 0x1a, 0xcb, 0x03, 0x5a, 0x39, 0x09, 0x43, 0xba, 0x02, 0xe5, 0xcc, 0x1c, - 0x1b, 0x94, 0x81, 0x92, 0x5e, 0xb2, 0xfb, 0x1e, 0xef, 0x7a, 0x6a, 0xbd, - 0x53, 0x22, 0x7e, 0x27, 0x02, 0x8e, 0x8b, 0xfd, 0x23, 0xc4, 0x50, 0xe0, - 0xdf, 0x4a, 0xf3, 0xae, 0x38, 0x12, 0xb6, 0xd3, 0x87, 0xc0, 0xb5, 0x45, - 0x00, 0x3c, 0x82, 0x55, 0xb7, 0xbc, 0x25, 0xb2, 0x94, 0xd2, 0x1a, 0x29, - 0x08, 0xbb, 0x3a, 0xe8, 0x94, 0x06, 0xa7, 0x15, 0xbb, 0x26, 0xfb, 0x1c, - 0x4a, 0x18, 0x15, 0x13, 0x23, 0x0d, 0x8c, 0x78, 0x2d, 0x30, 0x14, 0x4a, - 0x10, 0x5a, 0x5b, 0x74, 0x32, 0xe9, 0x13, 0x5c, 0xd2, 0x56, 0xce, 0xc5, - 0x35, 0xaa, 0x66, 0xd6, 0x5b, 0x7e, 0xe7, 0x78, 0x7d, 0x3b, 0xca, 0xb3, - 0xd4, 0x7d, 0x15, 0x18, 0x3d, 0xfc, 0xf9, 0xc5, 0x50, 0xe7, 0x66, 0xd5, - 0x5f, 0x87, 0xd0, 0x1f, 0xfa, 0x1d, 0xaf, 0x3e, 0x3d, 0x3f, 0x32, 0x0a, - 0xd8, 0xa5, 0x03, 0x21, 0xbc, 0xd3, 0x9c, 0xe3, 0x39, 0xfc, 0x24, 0x5c, - 0x68, 0xf3, 0x74, 0xf4, 0x9e, 0xc1, 0x41, 0x14, 0xdb, 0x39, 0xa5, 0xfc, - 0xa9, 0xaa, 0xed, 0xa0, 0xe5, 0x3c, 0x07, 0x18, 0x53, 0x31, 0xcb, 0xb0, - 0xef, 0x1c, 0x9f, 0x53, 0x81, 0xaf, 0x5e, 0x2f, 0xbd, 0xa1, 0xe2, 0x6b, - 0x1a, 0xfa, 0xb3, 0x98, 0xca, 0x4c, 0x9f, 0x86, 0xef, 0x28, 0xa8, 0x54, - 0xcf, 0xbc, 0xd4, 0x34, 0x98, 0xb3, 0xf0, 0xed, 0x36, 0x1d, 0x14, 0xa9, - 0xe5, 0xa6, 0x7c, 0x0b, 0x36, 0x77, 0x5a, 0xc6, 0x2a, 0xf9, 0xd4, 0x90, - 0x3f, 0xdc, 0xc5, 0x83, 0x39, 0x9b, 0xb9, 0xc4, 0xcf, 0x9e, 0xfa, 0x14, - 0x46, 0x2c, 0x34, 0x26, 0x17, 0xb5, 0x7d, 0x10, 0x79, 0x51, 0xc0, 0x7e, - 0x51, 0x4b, 0x94, 0x1e, 0x27, 0xf5, 0xca, 0x1f, 0x7c, 0x7e, 0x15, 0x9b, - 0xce, 0x20, 0x93, 0x05, 0x23, 0x63, 0xff, 0x2c, 0xef, 0x55, 0x9a, 0x1f, - 0xd4, 0xbd, 0x8c, 0x97, 0x79, 0xda, 0xad, 0xf3, 0xc3, 0xa1, 0x0c, 0xd2, - 0x1d, 0x7a, 0xf8, 0x32, 0xae, 0x8c, 0xc0, 0x50, 0x94, 0x1d, 0x64, 0xb7, - 0xfb, 0x63, 0x0f, 0x03, 0xfa, 0xec, 0x57, 0x68, 0xb3, 0x42, 0xfa, 0x2b, - 0x81, 0x0e, 0xac, 0x79, 0x9b, 0x7a, 0x8b, 0xdc, 0xa2, 0x2c, 0x50, 0x48, - 0x4f, 0x37, 0xaa, 0x82, 0x1c, 0x49, 0xc6, 0xf5, 0x61, 0xd0, 0xbf, 0x25, - 0x15, 0x24, 0x65, 0x10, 0x8e, 0x87, 0x4d, 0x18, 0x66, 0xdf, 0x05, 0x2f, - 0x07, 0xcb, 0xfe, 0x74, 0x69, 0x9f, 0x0b, 0x87, 0xa6, 0xc2, 0xa1, 0x10, - 0x32, 0x25, 0x15, 0x88, 0xa6, 0x67, 0x42, 0x28, 0xd2, 0x72, 0x61, 0x63, - 0x3e, 0x01, 0x7b, 0x7a, 0x9b, 0xdc, 0x65, 0x0e, 0xf2, 0x6a, 0x13, 0x78, - 0x65, 0xf5, 0xf8, 0x1c, 0xe7, 0x0b, 0xc9, 0x80, 0xbd, 0x8f, 0x46, 0x79, - 0x38, 0x5b, 0xc0, 0x68, 0x1e, 0x4b, 0xac, 0x6a, 0xb6, 0x9b, 0x49, 0x9b, - 0x23, 0xf2, 0x6f, 0x4b, 0x29, 0x82, 0x8c, 0xad, 0x7d, 0xad, 0x3f, 0xa8, - 0x07, 0x56, 0x13, 0x09, 0xfc, 0x9e, 0x4b, 0x41, 0x8c, 0x7b, 0xca, 0xc4, - 0xb2, 0xbd, 0x43, 0x43, 0x70, 0x2b, 0x21, 0x73, 0x63, 0x80, 0xe9, 0x84, - 0xe0, 0x7f, 0x06, 0xf3, 0xf4, 0x00, 0x64, 0x12, 0xfc, 0x19, 0xd2, 0x0e, - 0xd0, 0x70, 0x38, 0xc4, 0xbf, 0x5c, 0xda, 0x43, 0x16, 0x03, 0x80, 0xf4, - 0x59, 0xd4, 0xf1, 0x32, 0x1d, 0x24, 0xac, 0xbe, 0xbe, 0x90, 0xf5, 0x34, - 0x51, 0xf9, 0x4f, 0xda, 0x28, 0xb8, 0xd7, 0x8d, 0xd8, 0x2f, 0x5e, 0x02, - 0x63, 0xde, 0xc4, 0x5c, 0x0e, 0x67, 0x7a, 0x04, 0xbe, 0x6b, 0x1b, 0x86, - 0x63, 0xf6, 0xeb, 0xbe, 0xf7, 0xc1, 0x77, 0x36, 0xfb, 0xfa, 0x88, 0x92, - 0x2b, 0x40, 0xf1, 0xfc, 0x62, 0xc5, 0x22, 0x8c, 0xaf, 0xbd, 0x59, 0xe5, - 0xbf, 0x20, 0x93, 0x21, 0x1d, 0x7f, 0xb0, 0x3d, 0x64, 0xe0, 0x10, 0xd5, - 0xa7, 0xc9, 0x4b, 0x62, 0x84, 0xb1, 0x89, 0xed, 0xa0, 0x76, 0x9c, 0x3c, - 0xa2, 0xbf, 0x60, 0xfb, 0x50, 0xc0, 0x01, 0x37, 0x28, 0xca, 0xc1, 0xba, - 0xd5, 0x74, 0x59, 0x87, 0x58, 0x94, 0x41, 0xb0, 0x2f, 0xad, 0x8b, 0x5e, - 0xbc, 0x62, 0xdf, 0xbf, 0x05, 0x8e, 0xc6, 0x91, 0xac, 0xcc, 0x37, 0xe4, - 0xe0, 0xda, 0x7f, 0xb0, 0xde, 0x8b, 0x92, 0x82, 0x21, 0xf9, 0xd8, 0x52, - 0x0a, 0x80, 0x5f, 0xbb, 0xaf, 0xb9, 0x38, 0x27, 0x10, 0xb4, 0x83, 0xd3, - 0x33, 0x03, 0xa3, 0xe8, 0x70, 0x5c, 0xb4, 0x92, 0x2f, 0xf1, 0x8f, 0x57, - 0xcd, 0x89, 0x06, 0x6a, 0xf0, 0xb0, 0x82, 0x2c, 0x45, 0x2a, 0x95, 0x6b, - 0x16, 0x38, 0x6b, 0x45, 0x70, 0x9b, 0x72, 0xdd, 0xff, 0x81, 0x71, 0x10, - 0x42, 0x7e, 0x12, 0x5c, 0xe0, 0xce, 0xa2, 0xf2, 0x95, 0xaa, 0x9d, 0x53, - 0xff, 0xbb, 0xce, 0xfc, 0x7f, 0x29, 0x0a, 0xb5, 0x8f, 0xc3, 0xd4, 0x98, - 0xa1, 0x09, 0x0d, 0x8b, 0x07, 0x83, 0x89, 0x30, 0xb1, 0x22, 0x5e, 0x2f, - 0xfe, 0x07, 0x9a, 0x19, 0x5a, 0xc0, 0x8d, 0xc9, 0x7b, 0xc3, 0xf4, 0xa0, - 0x1e, 0xdf, 0x35, 0xe4, 0xdd, 0xea, 0xff, 0xc3, 0x2a, 0x31, 0xad, 0x40, - 0x5f, 0xd1, 0x8d, 0x3d, 0xa0, 0x88, 0x47, 0x82, 0x80, 0x2a, 0x10, 0x97, - 0x4b, 0x05, 0x41, 0xa9, 0xeb, 0x9e, 0x93, 0x47, 0x8e, 0x7c, 0x1d, 0xad, - 0xb9, 0x53, 0x94, 0x1c, 0xd6, 0x85, 0x08, 0x19, 0x56, 0xe9, 0xe4, 0x32, - 0x8d, 0xea, 0x2f, 0xae, 0x37, 0xf3, 0x29, 0xac, 0xa4, 0x03, 0x4c, 0x86, - 0x3b, 0x33, 0xe8, 0x30, 0x42, 0x45, 0xb0, 0xfd, 0xca, 0xbf, 0x43, 0x1c, - 0x61, 0xcc, 0xc6, 0x7d, 0x4d, 0xa1, 0x46, 0xcc, 0x5d, 0xb5, 0x3c, 0x2c, - 0xd0, 0x0a, 0x2c, 0xb5, 0x5a, 0x45, 0x16, 0x26, 0x5c, 0xd7, 0x50, 0x7e, - 0x7e, 0x1e, 0x7a, 0xfd, 0xc5, 0xd6, 0xd0, 0xfc, 0x13, 0x5c, 0x8c, 0x35, - 0x54, 0x66, 0xaa, 0xf8, 0x89, 0xb6, 0xcf, 0x4f, 0x29, 0x3b, 0x58, 0xe7, - 0x4e, 0x83, 0x32, 0xf5, 0x78, 0x7e, 0xd9, 0xbd, 0x66, 0x23, 0x41, 0xe3, - 0x63, 0x2f, 0x81, 0xde, 0xfb, 0x09, 0x68, 0x6e, 0x14, 0x3b, 0x38, 0xfb, - 0x1d, 0x9a, 0x91, 0x3b, 0x02, 0x87, 0x16, 0x14, 0x05, 0x67, 0x57, 0x1a, - 0x34, 0xaa, 0x3a, 0xe0, 0x19, 0x37, 0x68, 0x4f, 0x1c, 0xd0, 0x6e, 0xa2, - 0x5a, 0x2b, 0xc5, 0xb1, 0x19, 0x68, 0x2b, 0x68, 0xfa, 0x22, 0x59, 0xdc, - 0x1a, 0x27, 0x1a, 0xf4, 0x14, 0x78, 0x7d, 0x78, 0x30, 0x4a, 0x3f, 0xbd, - 0xc1, 0x23, 0x03, 0xe5, 0x9c, 0x96, 0xa9, 0x7c, 0x3d, 0xf3, 0xbf, 0x64, - 0x0c, 0x53, 0xd1, 0xd3, 0x22, 0x88, 0xc3, 0xe8, 0xa1, 0xf3, 0xc8, 0xbc, - 0x26, 0x03, 0x19, 0xd7, 0x45, 0x2a, 0x96, 0x15, 0x02, 0xe2, 0x7a, 0x11, - 0x1c, 0x5d, 0xc4, 0x95, 0x6f, 0x5d, 0x4a, 0x7d, 0xba, 0x1d, 0x12, 0x84, - 0x63, 0x88, 0xdc, 0xae, 0xbe, 0xb5, 0x2f, 0x90, 0xab, 0xbd, 0x63, 0xa4, - 0xc2, 0x9d, 0xe1, 0x44, 0x7c, 0x30, 0x8c, 0x61, 0x31, 0xb8, 0x39, 0xe3, - 0xc4, 0x28, 0xce, 0x7f, 0x57, 0x21, 0x05, 0xa7, 0x04, 0xa9, 0x60, 0x57, - 0xe3, 0xb5, 0x51, 0x2f, 0x42, 0x40, 0x76, 0x31, 0x32, 0x02, 0xf4, 0x8a, - 0x52, 0xc1, 0xb9, 0x9d, 0x2d, 0xd0, 0xc7, 0x95, 0x37, 0x13, 0xfc, 0x52, - 0x9e, 0xc4, 0x61, 0x12, 0x81, 0x40, 0x4f, 0x2f, 0x0b, 0x33, 0x3c, 0xbc, - 0xef, 0x08, 0xd2, 0x06, 0xe6, 0x9c, 0xf3, 0x2b, 0xb3, 0xdb, 0x1a, 0xdf, - 0xd6, 0x56, 0xf1, 0x1c, 0x2e, 0x40, 0x1e, 0x40, 0xac, 0xad, 0x55, 0x1c, - 0x51, 0x36, 0x17, 0x61, 0x71, 0xb4, 0x36, 0x7b, 0xf9, 0x45, 0xed, 0x4d, - 0x35, 0x70, 0x7b, 0x83, 0x29, 0x88, 0xf2, 0x12, 0xfb, 0xd4, 0xd9, 0x77, - 0x3b, 0x54, 0x04, 0x30, 0xf4, 0xc8, 0xf4, 0x18, 0x0e, 0x27, 0x4a, 0x43, - 0x21, 0xdd, 0x27, 0x4d, 0x9d, 0xbb, 0x4a, 0x5a, 0x28, 0x2a, 0x8f, 0x7b, - 0x64, 0xa3, 0xfe, 0xdb, 0x58, 0x18, 0x7f, 0xd7, 0xb3, 0x19, 0x2c, 0x0a, - 0x41, 0x31, 0x4b, 0xfc, 0x7f, 0x8e, 0xbf, 0x04, 0xf3, 0xb2, 0x09, 0x63, - 0x66, 0xf6, 0x66, 0x52, 0x08, 0x08, 0x8a, 0x4a, 0x2e, 0x61, 0x18, 0xaf, - 0xfc, 0x93, 0x54, 0x63, 0xf4, 0xcf, 0x90, 0xae, 0xc4, 0xe8, 0x04, 0xdf, - 0xf5, 0x43, 0x1a, 0xf5, 0xe8, 0xb4, 0x42, 0x28, 0xb4, 0x80, 0xbd, 0xcc, - 0xb7, 0x4e, 0x62, 0x80, 0xa6, 0xe7, 0xe5, 0xa4, 0x52, 0xed, 0xcf, 0x00, - 0xbd, 0x8b, 0x83, 0xcd, 0x62, 0x74, 0x44, 0x53, 0xaf, 0x60, 0xb4, 0xf2, - 0x6f, 0x28, 0x00, 0x78, 0x30, 0xfa, 0x7b, 0xef, 0xa3, 0x92, 0x55, 0x88, - 0x28, 0x14, 0xe6, 0x46, 0xbd, 0x4b, 0x1f, 0xf4, 0xea, 0xa7, 0x1e, 0x04, - 0x87, 0x12, 0x71, 0x1c, 0xb4, 0x50, 0x3e, 0x0c, 0xc5, 0x98, 0xd2, 0xac, - 0x90, 0x2c, 0x18, 0x65, 0xf7, 0x42, 0xe3, 0x4e, 0x69, 0xb5, 0xd8, 0xe7, - 0x4d, 0xc1, 0x3d, 0xfb, 0x1b, 0x2b, 0xa1, 0x37, 0x1a, 0x9b, 0x7c, 0xa1, - 0xc8, 0x66, 0x55, 0x2e, 0xac, 0xa9, 0x3d, 0x7a, 0x95, 0xec, 0x4d, 0x8a, - 0x0d, 0xed, 0x17, 0x8e, 0xa6, 0x26, 0xcc, 0x17, 0xd3, 0x92, 0x78, 0x26, - 0xf9, 0x74, 0x78, 0x4e, 0x5b, 0x06, 0xdd, 0x67, 0xa5, 0xa7, 0x37, 0xc8, - 0x5e, 0x02, 0x17, 0x93, 0x61, 0x56, 0x23, 0x19, 0xb8, 0xd6, 0x7e, 0xc5, - 0x78, 0x7b, 0x45, 0xe8, 0x4e, 0x06, 0x13, 0xe2, 0x64, 0x08, 0x96, 0xd5, - 0xf8, 0x37, 0x34, 0x5c, 0xf6, 0x49, 0x76, 0x34, 0x73, 0x9c, 0x34, 0xfe, - 0xe4, 0x8b, 0xc6, 0xa7, 0x90, 0x7f, 0x43, 0xee, 0x05, 0x22, 0x9b, 0x57, - 0x32, 0x08, 0x97, 0xa0, 0x13, 0x65, 0x04, 0x84, 0xaf, 0x18, 0x82, 0x97, - 0xf1, 0x00, 0xf8, 0xd5, 0x2e, 0xf0, 0x9d, 0x92, 0x8a, 0x81, 0x84, 0x38, - 0xcc, 0x23, 0x78, 0xd4, 0x06, 0x7a, 0xb7, 0x17, 0x64, 0x9a, 0xfb, 0xd7, - 0x80, 0x9d, 0xc5, 0x0e, 0xb2, 0xba, 0xc3, 0xe1, 0x01, 0xcc, 0xaa, 0x5b, - 0xd8, 0xd2, 0xd2, 0x88, 0xa3, 0x46, 0x68, 0xc7, 0x3e, 0x3b, 0x4e, 0xc7, - 0x5b, 0x1d, 0x76, 0x86, 0x79, 0x6a, 0x85, 0xf7, 0xa9, 0xf7, 0x22, 0xed, - 0x39, 0x72, 0x1a, 0x02, 0x4b, 0xec, 0x96, 0x1d, 0xc9, 0x5f, 0xe8, 0x89, - 0x83, 0x9e, 0x52, 0x5b, 0xd2, 0x5b, 0x40, 0x19, 0x7e, 0x56, 0x31, 0x3d, - 0x21, 0x42, 0xfa, 0xc6, 0x40, 0x93, 0x90, 0xf2, 0x0c, 0x02, 0x13, 0x43, - 0x2b, 0x26, 0xa4, 0x24, 0xe1, 0x05, 0xec, 0x43, 0x19, 0xdc, 0xd7, 0x72, - 0x31, 0x73, 0xb9, 0x84, 0xe4, 0x11, 0xab, 0xac, 0x98, 0x90, 0x9f, 0x0d, - 0x5d, 0x4b, 0x37, 0x89, 0x9a, 0x36, 0xf6, 0x3f, 0x7b, 0xf2, 0x3c, 0x23, - 0x54, 0x1d, 0x74, 0x80, 0xc4, 0xfc, 0x3d, 0x8c, 0x0a, 0xf1, 0x42, 0x76, - 0xdd, 0x5d, 0x85, 0xda, 0xcd, 0xe3, 0xda, 0x81, 0xa8, 0x4d, 0x01, 0x4a, - 0xe7, 0xdd, 0x93, 0xea, 0x32, 0xdc, 0x1d, 0xb6, 0x85, 0xbf, 0xf1, 0x62, - 0x2b, 0x59, 0x8b, 0xde, 0x75, 0xd7, 0xbb, 0x52, 0x97, 0x1a, 0x1b, 0xc4, - 0xa6, 0x3a, 0x99, 0xb9, 0x4f, 0x03, 0x2e, 0x78, 0x15, 0x99, 0xc0, 0x21, - 0x5c, 0x11, 0x82, 0xe0, 0x72, 0xf4, 0xd7, 0xd2, 0x40, 0xa7, 0x18, 0x45, - 0x13, 0x1b, 0x9a, 0x7c, 0x4e, 0x46, 0x52, 0x3f, 0x97, 0xb1, 0x8c, 0x4e, - 0xbc, 0x1e, 0xf7, 0x77, 0x10, 0xbf, 0x0b, 0xe6, 0x72, 0xcd, 0xa6, 0x88, - 0x7f, 0xce, 0x90, 0x4c, 0x09, 0xc3, 0x50, 0x55, 0x57, 0x73, 0x38, 0x69, - 0xeb, 0x8b, 0xd2, 0xc1, 0x85, 0xc1, 0xe1, 0xa5, 0x5e, 0x1a, 0x69, 0x30, - 0x11, 0xfa, 0x04, 0xf1, 0x63, 0xcf, 0x57, 0xd0, 0x32, 0x52, 0xc7, 0x6f, - 0xd0, 0xb4, 0x21, 0x67, 0x7f, 0x32, 0x3b, 0x24, 0xde, 0xe2, 0xc5, 0x38, - 0x95, 0x8c, 0xea, 0x66, 0x31, 0x8b, 0xcf, 0xeb, 0x66, 0x3f, 0xec, 0x79, - 0x84, 0xb6, 0xca, 0x54, 0xba, 0x59, 0x1f, 0xa2, 0xff, 0xcd, 0xa3, 0xff, - 0xc5, 0xec, 0xf5, 0x95, 0x12, 0x79, 0xb4, 0xee, 0x77, 0x46, 0x7d, 0x95, - 0x9a, 0xc0, 0xe3, 0x48, 0x3f, 0x80, 0x7c, 0xe8, 0x03, 0x5f, 0xd4, 0xcb, - 0xfe, 0xec, 0x4a, 0x52, 0x43, 0x98, 0x70, 0x9e, 0xf9, 0x97, 0x98, 0xe6, - 0xaa, 0x71, 0x5e, 0x85, 0x4b, 0xb8, 0x97, 0x29, 0x3b, 0x0f, 0xe2, 0x64, - 0x7a, 0xdf, 0x75, 0xb5, 0x24, 0x1d, 0x29, 0x8c, 0xc1, 0x78, 0x4c, 0x6d, - 0x07, 0x71, 0x89, 0xb8, 0xcc, 0xaa, 0x3c, 0x01, 0xc6, 0xf6, 0x37, 0xd8, - 0x3b, 0x77, 0x4f, 0x29, 0x2b, 0x44, 0x35, 0xcd, 0x28, 0x23, 0xf4, 0x3b, - 0x5d, 0x42, 0xba, 0x75, 0x65, 0xe2, 0x9c, 0x20, 0x07, 0x3d, 0xcc, 0x05, - 0x19, 0xa6, 0x95, 0x9c, 0xea, 0x62, 0xd5, 0xa3, 0xa9, 0x00, 0x5c, 0x44, - 0xfd, 0x3d, 0x18, 0xbf, 0x3c, 0x0e, 0xbf, 0x8b, 0x8b, 0xd6, 0x43, 0x17, - 0xe7, 0xeb, 0xda, 0xc7, 0x15, 0xd6, 0x1e, 0x97, 0x7c, 0x92, 0x73, 0x73, - 0x09, 0x66, 0x66, 0x38, 0x6c, 0x6b, 0xb1, 0x03, 0x59, 0x02, 0x80, 0x06, - 0x2b, 0xa7, 0xbb, 0x95, 0xae, 0x1d, 0x68, 0xc3, 0x34, 0xe3, 0x37, 0xbb, - 0x90, 0xfc, 0xc4, 0xdb, 0x7f, 0xc4, 0xcd, 0x05, 0x76, 0xd6, 0x18, 0x68, - 0x67, 0x62, 0xce, 0x5c, 0xae, 0x1c, 0xfe, 0xab, 0xb2, 0x2b, 0x4c, 0x22, - 0x5b, 0x3a, 0x5d, 0xba, 0x2c, 0x4c, 0x38, 0x2f, 0x64, 0xd3, 0x55, 0xfc, - 0x0e, 0xc0, 0x50, 0xc5, 0xf7, 0x05, 0xe2, 0x4e, 0x5c, 0xad, 0xc3, 0x4f, - 0xaa, 0x9c, 0xf1, 0xf7, 0x33, 0xb3, 0x6f, 0x47, 0x4e, 0x7b, 0x2d, 0xd0, - 0x68, 0xb0, 0xf5, 0x24, 0x81, 0x54, 0x12, 0xc1, 0x72, 0x3d, 0x3b, 0xbe, - 0xb4, 0x53, 0x18, 0x02, 0x0e, 0x01, 0x8f, 0x17, 0x17, 0x4d, 0x21, 0x01, - 0xd0, 0xe4, 0x87, 0x2e, 0xb1, 0x33, 0x0a, 0x67, 0xaa, 0xb9, 0x58, 0x1c, - 0x29, 0x1d, 0x81, 0x88, 0x15, 0x25, 0xd8, 0x6d, 0xeb, 0x8c, 0x82, 0xa3, - 0x80, 0x4a, 0x5b, 0x3f, 0xac, 0x07, 0x8a, 0x28, 0xd6, 0xd2, 0x9b, 0xee, - 0x7e, 0x4e, 0x59, 0xc5, 0x94, 0x67, 0xaf, 0xb4, 0xf0, 0x22, 0x91, 0xef, - 0x9c, 0x89, 0xf7, 0x02, 0xb8, 0xa5, 0xbb, 0xb3, 0x55, 0x66, 0x52, 0x12, - 0x5c, 0x83, 0x08, 0xf5, 0x99, 0x49, 0xd4, 0xa2, 0x04, 0x27, 0x8e, 0x45, - 0xf2, 0x83, 0x87, 0x17, 0x0a, 0x95, 0x8c, 0x5c, 0x0e, 0x3a, 0x5f, 0x2c, - 0xd3, 0xa3, 0x9b, 0x8a, 0xc8, 0xff, 0xc1, 0x5a, 0x39, 0x1a, 0xea, 0x5f, - 0xbf, 0x9c, 0x8b, 0xdb, 0x67, 0x42, 0xd5, 0x83, 0xd8, 0xe2, 0x34, 0x01, - 0x3a, 0x34, 0x1e, 0x6d, 0x66, 0xeb, 0xba, 0x58, 0xdd, 0x4d, 0x72, 0x45, - 0x30, 0x98, 0xc5, 0x72, 0xaa, 0xd6, 0x2e, 0x85, 0x83, 0x5a, 0x36, 0xa9, - 0xd5, 0x1f, 0x0f, 0x04, 0x94, 0x45, 0xd4, 0xe4, 0x51, 0x49, 0x63, 0xc3, - 0x46, 0x43, 0xe2, 0x1e, 0x94, 0x7a, 0xfb, 0x68, 0x7d, 0xdd, 0xab, 0xdb, - 0x21, 0x32, 0x4e, 0xb5, 0xda, 0x5d, 0x38, 0x78, 0xeb, 0x73, 0x81, 0xd6, - 0xbd, 0x55, 0xf4, 0x47, 0x3c, 0x8e, 0xfd, 0x83, 0x41, 0x73, 0xa5, 0x74, - 0xed, 0xe6, 0x24, 0x1f, 0x66, 0x44, 0xc7, 0x07, 0x69, 0x7c, 0x9e, 0x75, - 0xae, 0x99, 0x89, 0xd1, 0x8c, 0x6f, 0x43, 0x0c, 0x79, 0xa7, 0x32, 0x29, - 0x53, 0x7e, 0x9a, 0x6b, 0xf7, 0x93, 0x7d, 0x58, 0x08, 0x24, 0x15, 0xa8, - 0x24, 0x91, 0x9d, 0x8c, 0xbf, 0x13, 0xcb, 0x48, 0x51, 0xe9, 0x57, 0x39, - 0xf2, 0xab, 0x99, 0x3c, 0x84, 0x07, 0x7d, 0xf0, 0x13, 0xc5, 0xd2, 0xd8, - 0xc0, 0x6c, 0xcb, 0xb8, 0x20, 0xae, 0xc9, 0x3e, 0x93, 0xdd, 0x63, 0xf8, - 0x79, 0xa6, 0x3d, 0x06, 0x29, 0xc9, 0x39, 0xee, 0x26, 0xd5, 0xd2, 0x6a, - 0x53, 0x80, 0x97, 0x9e, 0x42, 0xbf, 0x3e, 0x5e, 0xe8, 0x4f, 0x4b, 0xdf, - 0xe2, 0x6a, 0x7e, 0x5b, 0x96, 0x07, 0x7d, 0xab, 0x64, 0x2d, 0xfd, 0x4c, - 0xc7, 0xbc, 0xf2, 0xd9, 0xdc, 0x45, 0x77, 0xcc, 0xfd, 0xec, 0x92, 0xd1, - 0xf2, 0xd1, 0x70, 0xda, 0xc7, 0x76, 0xa2, 0x8f, 0x28, 0xb8, 0x71, 0x92, - 0x88, 0xa4, 0xb3, 0x4a, 0x01, 0xeb, 0xc0, 0x4a, 0xce, 0x99, 0x3c, 0x67, - 0x91, 0x2b, 0xf7, 0x3c, 0xcb, 0x77, 0x5c, 0x54, 0xeb, 0x57, 0x4d, 0x9c, - 0xee, 0x64, 0x9f, 0x28, 0x94, 0x8b, 0x44, 0x7b, 0x80, 0xb9, 0x4b, 0xf9, - 0xd9, 0x01, 0xc4, 0x19, 0xa6, 0xa6, 0x58, 0xbb, 0x72, 0x2f, 0x21, 0xd7, - 0x2c, 0xb1, 0x02, 0x00, 0x31, 0x80, 0x4b, 0x62, 0x79, 0xe2, 0x07, 0xbb, - 0xb8, 0x19, 0x33, 0x96, 0x73, 0x70, 0x2b, 0x80, 0xd9, 0x16, 0x1a, 0x75, - 0x0d, 0x07, 0x49, 0x89, 0x6f, 0x25, 0xe9, 0xc0, 0x02, 0x8c, 0xb9, 0x8e, - 0x13, 0x3c, 0xc3, 0x1f, 0x6a, 0x41, 0xcf, 0xe2, 0xbf, 0xe4, 0xb6, 0x57, - 0x09, 0x83, 0x8e, 0x80, 0x9d, 0x36, 0x55, 0x89, 0x05, 0x8c, 0xab, 0xcb, - 0x65, 0xba, 0x42, 0xa9, 0xb8, 0x11, 0x19, 0x3e, 0x76, 0xa4, 0xb8, 0x28, - 0xa4, 0x34, 0xca, 0x44, 0x8b, 0x13, 0x4b, 0x55, 0x22, 0x3a, 0x58, 0x47, - 0x39, 0x58, 0xe9, 0x62, 0x72, 0x75, 0x54, 0x79, 0x67, 0xb9, 0x65, 0x35, - 0xbc, 0x9a, 0x15, 0x8f, 0x92, 0x23, 0x49, 0xc8, 0x9b, 0x73, 0xf3, 0x83, - 0xd6, 0x5c, 0x52, 0x3b, 0xd7, 0x18, 0x8a, 0x02, 0x8e, 0x25, 0x87, 0x9c, - 0x90, 0x31, 0xb5, 0xac, 0x64, 0xd1, 0xe7, 0xeb, 0x29, 0x4b, 0xc2, 0x06, - 0x30, 0x2f, 0xed, 0x6b, 0x35, 0x70, 0x5d, 0xfb, 0xd6, 0x5b, 0xa7, 0x89, - 0x67, 0xe1, 0x91, 0x53, 0x0f, 0x38, 0x03, 0x63, 0x12, 0xd8, 0x68, 0xfc, - 0x1b, 0x16, 0x35, 0x58, 0x98, 0xcd, 0x85, 0x5b, 0x88, 0xa1, 0x0f, 0xb3, - 0xd4, 0xe9, 0x3f, 0x2e, 0x9e, 0x57, 0x47, 0x26, 0xec, 0x70, 0x48, 0x45, - 0x8d, 0x83, 0x59, 0x24, 0x67, 0x5a, 0xf1, 0xfb, 0xc2, 0x62, 0x2c, 0x0b, - 0x34, 0x83, 0x57, 0x44, 0x21, 0xe6, 0x30, 0x8a, 0x4b, 0x51, 0x18, 0x9c, - 0xef, 0xbc, 0x1f, 0xbb, 0x19, 0x45, 0xee, 0x8d, 0x57, 0xda, 0xef, 0x04, - 0xe1, 0xcf, 0xaa, 0xcc, 0x5a, 0xf8, 0xf6, 0x0e, 0xef, 0x80, 0x69, 0x13, - 0x8a, 0x82, 0xfb, 0xad, 0x10, 0x48, 0xc7, 0x2f, 0x3a, 0x89, 0xb0, 0x3c, - 0xb7, 0x98, 0xbd, 0x71, 0xdf, 0x9b, 0xf8, 0x5b, 0xee, 0x07, 0xe0, 0xbc, - 0x7f, 0x9e, 0x7d, 0xf3, 0x4c, 0xec, 0x6a, 0x65, 0x2e, 0x53, 0xa1, 0x63, - 0x94, 0xff, 0x05, 0x64, 0xa2, 0xc3, 0xb9, 0x43, 0xbd, 0x5e, 0x90, 0x3b, - 0x7a, 0xb9, 0x6d, 0xa7, 0xb4, 0x60, 0xdb, 0x2c, 0xf2, 0xe1, 0xb5, 0x8a, - 0x5a, 0xf9, 0xb8, 0xca, 0x48, 0x3b, 0x89, 0x5b, 0xc3, 0xf5, 0xd0, 0x74, - 0xce, 0x59, 0x28, 0x17, 0x8e, 0x11, 0x4f, 0x10, 0xf8, 0x39, 0x99, 0x8a, - 0xdd, 0x00, 0x74, 0x34, 0xf7, 0x17, 0x54, 0x30, 0xba, 0x1e, 0x57, 0xd5, - 0x53, 0x1b, 0x80, 0x90, 0xa1, 0x07, 0xc9, 0x54, 0xa5, 0x40, 0xf7, 0x60, - 0x77, 0xb2, 0x46, 0xd1, 0xba, 0x90, 0x09, 0x9c, 0xab, 0x22, 0xb6, 0x7a, - 0x53, 0x41, 0xb7, 0x40, 0xc1, 0x8e, 0x92, 0x49, 0xbe, 0x54, 0xaf, 0xe6, - 0x90, 0xcf, 0x76, 0x0c, 0x85, 0xe7, 0x53, 0x8e, 0x7b, 0xd9, 0xf3, 0xf0, - 0x15, 0xe8, 0x6d, 0x6f, 0xd9, 0x88, 0x35, 0x55, 0x3b, 0x02, 0xc0, 0x08, - 0x2f, 0x1a, 0x75, 0x11, 0x8e, 0x15, 0x36, 0x51, 0x08, 0x87, 0x8a, 0xa6, - 0xea, 0xd7, 0x14, 0x46, 0x14, 0xe9, 0x7a, 0xfc, 0x46, 0x27, 0x82, 0x59, - 0x0c, 0x0f, 0xa9, 0x23, 0x19, 0x56, 0x58, 0xdc, 0xd5, 0x42, 0xb0, 0x57, - 0x5b, 0xc1, 0xb6, 0x48, 0x5d, 0x51, 0x4a, 0xca, 0x96, 0x76, 0xde, 0xef, - 0x35, 0xa8, 0xe6, 0x6e, 0xfc, 0x7d, 0x0a, 0x5a, 0x5b, 0xba, 0x09, 0x5e, - 0x76, 0x63, 0x94, 0x20, 0xa3, 0xb4, 0x42, 0xd0, 0x3b, 0xc4, 0x17, 0x25, - 0x27, 0x02, 0x18, 0xdc, 0x94, 0x94, 0x6a, 0x31, 0xf3, 0x0d, 0x23, 0x33, - 0xd1, 0x4b, 0x69, 0x5a, 0xef, 0xf6, 0x98, 0x05, 0x9b, 0x75, 0x59, 0x62, - 0x45, 0xc3, 0x33, 0xb9, 0xff, 0xb5, 0x45, 0x29, 0x4c, 0x36, 0x78, 0x63, - 0x89, 0xf2, 0x3d, 0x6b, 0x97, 0xb3, 0xa8, 0x89, 0xa0, 0x1a, 0x48, 0xb1, - 0x93, 0xed, 0x43, 0x78, 0xc7, 0x7f, 0xf5, 0x69, 0xd2, 0x2e, 0xe7, 0x85, - 0x79, 0x37, 0x9e, 0x84, 0xfb, 0x09, 0x9e, 0xf3, 0x42, 0x75, 0xed, 0x06, - 0xb3, 0xcc, 0x5e, 0x76, 0x7a, 0x62, 0xc5, 0xdd, 0x1b, 0x08, 0xbf, 0x3b, - 0x79, 0x8f, 0xe6, 0xe6, 0x73, 0xdc, 0xe2, 0xd4, 0x7d, 0x6b, 0x85, 0x00, - 0x8a, 0x2c, 0xd5, 0xf0, 0x0d, 0x26, 0x2c, 0xa2, 0x9f, 0x73, 0x74, 0x72, - 0x16, 0x79, 0xe2, 0xba, 0x7a, 0xf0, 0x35, 0xf2, 0x1f, 0x2c, 0x5d, 0x0d, - 0x30, 0xf1, 0x98, 0x31, 0x55, 0x56, 0xed, 0x66, 0xdb, 0x88, 0xdb, 0x45, - 0x31, 0x40, 0x49, 0x89, 0x2e, 0x10, 0x86, 0x37, 0xad, 0x35, 0xd6, 0xb9, - 0xd0, 0xe0, 0x58, 0x24, 0x61, 0xfb, 0xca, 0xb5, 0x66, 0xc8, 0x5b, 0xd3, - 0x01, 0x58, 0x99, 0xe6, 0x0d, 0x42, 0x21, 0xa3, 0xee, 0x22, 0xe3, 0x51, - 0xab, 0xc8, 0x1f, 0x58, 0x4b, 0x53, 0x67, 0x27, 0xdc, 0xff, 0xd7, 0x13, - 0xc3, 0x6c, 0x84, 0xf3, 0x23, 0x29, 0x6b, 0x87, 0x93, 0x59, 0xa5, 0x03, - 0x31, 0xe9, 0x6c, 0x4a, 0x93, 0xe3, 0x83, 0x3b, 0x9a, 0xed, 0xc5, 0xeb, - 0x9b, 0x69, 0x08, 0x23, 0x90, 0x3b, 0x43, 0x88, 0xad, 0x17, 0xaa, 0x77, - 0x67, 0x3e, 0xe3, 0x2b, 0xdb, 0x7c, 0x40, 0xb1, 0x4c, 0xbe, 0x7b, 0xd4, - 0x33, 0x56, 0x4e, 0x31, 0xea, 0x73, 0xc8, 0x2c, 0xa3, 0x58, 0xce, 0x2d, - 0xde, 0x2d, 0x43, 0x91, 0x6d, 0xf9, 0x39, 0x4b, 0x26, 0x5e, 0x60, 0xed, - 0xc5, 0x3a, 0xf9, 0x63, 0x8b, 0xc3, 0xfb, 0x0a, 0x60, 0x2b, 0x2f, 0x41, - 0x07, 0xd3, 0xdf, 0x75, 0xc7, 0x71, 0xfb, 0x96, 0x53, 0x4b, 0xcb, 0x3a, - 0x22, 0xa8, 0x2d, 0xcd, 0xe4, 0x9a, 0xb9, 0xbc, 0x3d, 0xe2, 0x81, 0x4a, - 0x74, 0x55, 0x1a, 0xc0, 0x44, 0x68, 0x00, 0xbe, 0x5a, 0x04, 0x50, 0xb4, - 0xb6, 0x1b, 0xe0, 0x36, 0xd9, 0xae, 0x2f, 0x9f, 0xd1, 0xb6, 0xf9, 0x83, - 0xd0, 0x9b, 0x5a, 0xd2, 0x07, 0x94, 0xf1, 0x08, 0x78, 0x30, 0x56, 0x53, - 0xd4, 0x4c, 0x38, 0xad, 0xa4, 0x24, 0x35, 0x95, 0xbb, 0x63, 0x9c, 0x72, - 0x0b, 0x88, 0x60, 0x85, 0x93, 0x88, 0xf7, 0x05, 0xc4, 0x35, 0x51, 0x17, - 0x3c, 0xc1, 0x76, 0x62, 0xea, 0xd3, 0x34, 0x9b, 0x14, 0xbc, 0x78, 0x1b, - 0x9d, 0x31, 0x3b, 0x04, 0xec, 0xb2, 0xbe, 0xad, 0x76, 0xdc, 0x22, 0xcc, - 0x1b, 0xcf, 0xd1, 0x16, 0x2f, 0xd7, 0xe1, 0x4d, 0x40, 0xba, 0xda, 0x49, - 0xf2, 0xbc, 0x50, 0x6e, 0x60, 0x42, 0xbe, 0xdc, 0x2f, 0x7a, 0x44, 0xb7, - 0xc1, 0xe5, 0x63, 0x0c, 0x6d, 0x40, 0x2a, 0x96, 0x85, 0x14, 0xca, 0x7a, - 0x7f, 0x65, 0x03, 0xbb, 0x39, 0x42, 0xf9, 0x58, 0xad, 0x32, 0x55, 0x1f, - 0xfc, 0xa8, 0xd0, 0x37, 0xf9, 0xe5, 0x9a, 0xbe, 0xb5, 0x8a, 0x53, 0x80, - 0xc7, 0x84, 0x25, 0x51, 0x16, 0x95, 0xc1, 0x6b, 0xe1, 0x38, 0x7e, 0xe2, - 0x9b, 0x7c, 0xfe, 0x6d, 0xc6, 0x94, 0xfd, 0xa2, 0xed, 0xad, 0x1e, 0x95, - 0x8a, 0xf1, 0x2c, 0x45, 0x72, 0x8c, 0x4b, 0x4e, 0x13, 0x01, 0x0f, 0x45, - 0x7e, 0x71, 0xe9, 0x14, 0x86, 0xec, 0x27, 0xe1, 0xc9, 0x04, 0xa9, 0xf7, - 0xfb, 0xd5, 0xc9, 0x36, 0x46, 0x8f, 0x19, 0xd4, 0x40, 0xf7, 0xf6, 0xb6, - 0x82, 0xc3, 0x4d, 0x10, 0x86, 0xa9, 0x9a, 0x48, 0x60, 0xf9, 0x86, 0x57, - 0xe8, 0xe6, 0xa3, 0xb5, 0xda, 0x86, 0x47, 0x98, 0x34, 0x9d, 0x73, 0xfa, - 0xdc, 0x3e, 0x78, 0x78, 0xc1, 0xe2, 0xb1, 0xc7, 0xb7, 0xdb, 0xf8, 0xcf, - 0x04, 0x3e, 0x1c, 0xca, 0x54, 0x50, 0xd3, 0x70, 0xdf, 0x18, 0x20, 0xa1, - 0x70, 0x83, 0xc7, 0xbf, 0x04, 0x9e, 0xfb, 0x71, 0xbf, 0xac, 0x01, 0x32, - 0x17, 0x0d, 0xad, 0xf0, 0x87, 0x02, 0x18, 0x53, 0x08, 0x84, 0xc8, 0xc2, - 0xfd, 0xa7, 0x3f, 0x2c, 0xa9, 0xa8, 0x6f, 0xa8, 0x4a, 0x2f, 0x72, 0xcb, - 0x5f, 0x33, 0xce, 0x99, 0x2e, 0x7a, 0x3e, 0x8d, 0xab, 0x54, 0x48, 0xb0, - 0x50, 0x08, 0xf8, 0x14, 0xce, 0x1f, 0x81, 0x17, 0x5d, 0x08, 0x77, 0x70, - 0x97, 0x65, 0x84, 0x6b, 0x79, 0x20, 0xe5, 0x42, 0xbe, 0x2d, 0x30, 0xae, - 0xd3, 0x43, 0xbf, 0xb9, 0x9d, 0x51, 0x10, 0x30, 0x53, 0x68, 0x4b, 0xc8, - 0x33, 0x12, 0x59, 0x73, 0xdf, 0x77, 0x29, 0xc0, 0xfb, 0x24, 0x05, 0x24, - 0xa5, 0x5c, 0xdc, 0xa4, 0x31, 0x35, 0xa7, 0x37, 0x02, 0xaa, 0x8c, 0xe3, - 0x46, 0x35, 0xd3, 0x98, 0xcb, 0x14, 0xbc, 0x26, 0xb8, 0xf3, 0x61, 0x31, - 0xd5, 0x1c, 0x09, 0x00, 0x43, 0xad, 0xf5, 0xb0, 0x6c, 0x51, 0x93, 0x5a, - 0x8c, 0xea, 0xe7, 0xe7, 0x50, 0xa8, 0xf6, 0x47, 0xdf, 0xb0, 0xbe, 0xe0, - 0x43, 0xb9, 0x44, 0xed, 0x65, 0x71, 0x2f, 0xe4, 0xd8, 0xca, 0xc5, 0x6f, - 0x3d, 0x8a, 0x40, 0xaf, 0xe2, 0x23, 0xe1, 0x43, 0x63, 0x5e, 0x97, 0x65, - 0xc6, 0x5c, 0xf3, 0x75, 0x3c, 0xe8, 0xa5, 0x84, 0x66, 0x75, 0xd5, 0x02, - 0x33, 0xa7, 0xea, 0x48, 0x9c, 0xe8, 0xd3, 0xc3, 0xe1, 0x56, 0x8d, 0x6a, - 0xa7, 0xb9, 0xb4, 0xfa, 0xb9, 0xc1, 0x1d, 0x3c, 0x26, 0x1e, 0x1a, 0x34, - 0xd3, 0xc4, 0xf5, 0xc3, 0xf6, 0x66, 0x25, 0xcd, 0x96, 0x1f, 0xeb, 0xfd, - 0x8d, 0xb0, 0x70, 0xed, 0xd2, 0x71, 0xbb, 0x26, 0xeb, 0xda, 0x95, 0xeb, - 0xc4, 0x6f, 0x1b, 0x86, 0x73, 0xbf, 0xa4, 0x3e, 0xcb, 0x21, 0xb5, 0x90, - 0x63, 0xf2, 0x22, 0xae, 0x69, 0x5d, 0x51, 0x43, 0xb8, 0x5d, 0x9c, 0xae, - 0x3b, 0x0d, 0x27, 0x8a, 0xb3, 0x88, 0x19, 0xb1, 0x09, 0x88, 0x5f, 0x42, - 0xcf, 0xf8, 0x68, 0x90, 0x34, 0x77, 0xf2, 0x06, 0x9b, 0xc4, 0x05, 0xb1, - 0xb5, 0xdf, 0x26, 0x2b, 0x02, 0xd9, 0xdf, 0x1c, 0xee, 0x86, 0x0e, 0x12, - 0x51, 0x61, 0x59, 0x04, 0x4e, 0xa7, 0x62, 0x93, 0x5e, 0xd0, 0x58, 0x65, - 0x9b, 0x8b, 0x1c, 0xaa, 0x79, 0x66, 0x4d, 0xf2, 0x1d, 0x15, 0x07, 0x3e, - 0x13, 0x29, 0x20, 0x34, 0x21, 0xed, 0xd2, 0x88, 0xab, 0xfd, 0x2d, 0x63, - 0xaa, 0x0a, 0xb5, 0xf1, 0xd7, 0xff, 0x09, 0x20, 0xb5, 0x71, 0xb5, 0x68, - 0xb6, 0x6c, 0xe1, 0xce, 0x3d, 0xec, 0x46, 0x20, 0x6e, 0xac, 0x37, 0x52, - 0x3f, 0xf0, 0xfd, 0xa0, 0x44, 0x05, 0x9a, 0x67, 0xf4, 0xd5, 0xb7, 0xd0, - 0x35, 0x16, 0x58, 0xa8, 0x11, 0x55, 0xbe, 0xb3, 0x21, 0x98, 0xfb, 0x2a, - 0x85, 0x0a, 0xc1, 0x8f, 0xbd, 0xa1, 0xd9, 0x6d, 0x43, 0x08, 0x8a, 0xc1, - 0xfd, 0x78, 0x17, 0xba, 0x80, 0x57, 0x05, 0xe3, 0x15, 0xfa, 0xb1, 0x4f, - 0xde, 0xbd, 0xb6, 0x06, 0xa4, 0x7b, 0x67, 0xb5, 0x2e, 0xbc, 0x71, 0x51, - 0x4d, 0x10, 0x1a, 0x29, 0x1a, 0x5a, 0xf1, 0x36, 0x17, 0x23, 0x27, 0x96, - 0x78, 0xc3, 0x88, 0x2b, 0xc1, 0xb3, 0xed, 0x86, 0x49, 0xf1, 0xc9, 0x47, - 0xca, 0xf1, 0xb7, 0x63, 0xb6, 0xc5, 0xf7, 0x8d, 0x5b, 0x77, 0xc7, 0x3e, - 0x47, 0x96, 0xbb, 0x96, 0xbc, 0x3f, 0x21, 0x9d, 0x70, 0x7c, 0xa2, 0xb9, - 0xf3, 0x75, 0xca, 0x9a, 0xcd, 0x35, 0xac, 0x0a, 0x90, 0x3d, 0x97, 0xf0, - 0xb3, 0xe9, 0xe3, 0x09, 0x89, 0xab, 0x7f, 0xfc, 0x9f, 0x2a, 0x67, 0x54, - 0x3e, 0x5e, 0x4c, 0xbd, 0xd3, 0x69, 0xc0, 0x23, 0xd8, 0x26, 0x72, 0xb2, - 0x6f, 0xbc, 0x84, 0x17, 0x02, 0xee, 0x3f, 0x82, 0xd7, 0x51, 0xe1, 0xb6, - 0xc0, 0x54, 0xdf, 0x7e, 0x8d, 0x6f, 0xf1, 0xc7, 0xb6, 0x3c, 0x0d, 0x6a, - 0x9e, 0xa6, 0xbd, 0x43, 0xa1, 0xb2, 0x3a, 0x80, 0x77, 0x50, 0x26, 0xe2, - 0x5c, 0x84, 0x8b, 0x9f, 0x48, 0x9e, 0x76, 0x36, 0xbb, 0x0d, 0x16, 0x92, - 0xd8, 0x3a, 0xa4, 0x55, 0x89, 0x74, 0x17, 0x72, 0xd9, 0x60, 0x87, 0x0e, - 0x9b, 0x8f, 0xe8, 0x3e, 0xf5, 0xac, 0xb6, 0xc7, 0x2e, 0xa1, 0xfd, 0xa6, - 0x43, 0x77, 0x3a, 0x20, 0xc8, 0xf7, 0x12, 0x47, 0xdf, 0xc3, 0x17, 0xb3, - 0xe7, 0x2e, 0x01, 0x6e, 0x9e, 0xc2, 0xe8, 0xf4, 0xa6, 0x5e, 0xf2, 0x85, - 0xd2, 0x97, 0xd7, 0xc8, 0x39, 0xa9, 0x69, 0x25, 0x35, 0xfc, 0x79, 0x71, - 0x35, 0x58, 0x8f, 0xcb, 0x91, 0x3f, 0x02, 0x4d, 0x70, 0xf5, 0x24, 0xdf, - 0x27, 0xb7, 0x7d, 0x27, 0xbf, 0xd1, 0xc2, 0x0b, 0xb5, 0x7c, 0x49, 0xd4, - 0xbe, 0xcd, 0x85, 0xb2, 0x30, 0x3d, 0xc0, 0xab, 0xb7, 0xb6, 0xb9, 0x56, - 0x04, 0x80, 0x6a, 0x75, 0xa0, 0x6b, 0x77, 0xe8, 0x96, 0xef, 0xa6, 0x9a, - 0xc8, 0x8b, 0x67, 0x94, 0x93, 0x00, 0xab, 0x6b, 0xd5, 0x04, 0x08, 0xf1, - 0xc2, 0x4a, 0x52, 0xc1, 0xb1, 0x50, 0x33, 0x03, 0x3a, 0xca, 0xa3, 0xdc, - 0x83, 0x9f, 0x74, 0x9f, 0xaa, 0x4f, 0xcb, 0x12, 0x56, 0x3e, 0xfd, 0xd3, - 0x67, 0xc5, 0x1e, 0x4e, 0x97, 0x66, 0x2d, 0x2e, 0x53, 0x0c, 0x23, 0xf8, - 0xda, 0xdd, 0x75, 0x84, 0xda, 0xfd, 0xc3, 0x7e, 0x84, 0x13, 0xe1, 0x89, - 0xd7, 0x3f, 0xf6, 0x76, 0xf8, 0x9c, 0x1e, 0xd4, 0xa7, 0x76, 0x6d, 0x5e, - 0xa5, 0x5e, 0xe5, 0xe1, 0x8d, 0x2d, 0xe6, 0xbf, 0x17, 0x4b, 0x7a, 0xf7, - 0xef, 0x9a, 0xc4, 0xb0, 0x7c, 0x53, 0x2f, 0xda, 0x5e, 0xe9, 0xbe, 0xca, - 0x06, 0x5a, 0xea, 0x55, 0xad, 0xc0, 0x13, 0x6e, 0x82, 0x6b, 0x6e, 0x45, - 0xd2, 0x06, 0x23, 0x6c, 0x3f, 0xb6, 0xaa, 0xe3, 0xf0, 0x47, 0xb5, 0x1d, - 0xe5, 0x2f, 0x47, 0xa0, 0x21, 0x1f, 0x23, 0xea, 0xf0, 0x7b, 0x09, 0xcb, - 0x70, 0xda, 0xe7, 0xfb, 0x95, 0xa5, 0xcc, 0x67, 0x81, 0x43, 0x05, 0x90, - 0xff, 0x8f, 0x51, 0x2e, 0xea, 0x4a, 0x03, 0xe2, 0xf4, 0xcd, 0xb1, 0xf1, - 0xd3, 0xe7, 0x67, 0xf9, 0x4f, 0x10, 0x80, 0x46, 0x70, 0xcf, 0x94, 0x79, - 0x04, 0xf1, 0x87, 0x5d, 0x8b, 0xb4, 0xce, 0xb3, 0xd5, 0x2d, 0x84, 0x44, - 0xca, 0x79, 0x1c, 0x6e, 0x32, 0x14, 0xa2, 0xe6, 0x4c, 0xc2, 0x19, 0x7b, - 0x19, 0xde, 0x64, 0x63, 0x93, 0xb5, 0x18, 0xd1, 0xfc, 0xd8, 0xb5, 0xe0, - 0xe2, 0x9d, 0x98, 0xba, 0xcf, 0xab, 0x23, 0xa8, 0xad, 0x54, 0xec, 0xa7, - 0x80, 0x9e, 0x87, 0xaa, 0x24, 0x96, 0x85, 0xce, 0xf4, 0xd2, 0xbd, 0x58, - 0x04, 0xbd, 0x58, 0x2d, 0x6c, 0xac, 0x4e, 0xc3, 0xd1, 0x48, 0xce, 0x3d, - 0x48, 0xc8, 0x50, 0x36, 0xd2, 0x42, 0x9f, 0x7f, 0x68, 0x43, 0x11, 0x32, - 0x6a, 0x68, 0x01, 0x22, 0x48, 0x5f, 0x8f, 0x87, 0xad, 0x83, 0x77, 0x16, - 0xe0, 0xa0, 0xf8, 0xf1, 0x7f, 0xf4, 0x26, 0xd4, 0x00, 0xa6, 0x78, 0x86, - 0xe6, 0xf5, 0xe2, 0x5c, 0x4a, 0x7a, 0xad, 0x9f, 0x1f, 0xe7, 0x7d, 0x7f, - 0xfe, 0xb9, 0x0d, 0x9a, 0x40, 0xb7, 0x45, 0x65, 0x50, 0x1c, 0x94, 0x12, - 0x3c, 0xf5, 0xa9, 0x54, 0x3e, 0x00, 0xa4, 0xb6, 0xfa, 0x17, 0x6f, 0xbb, - 0x6e, 0x1d, 0x5d, 0x07, 0x61, 0x60, 0x86, 0x80, 0x30, 0x6b, 0x79, 0x4a, - 0x40, 0xd1, 0x8d, 0x62, 0x98, 0x70, 0x98, 0x50, 0xd4, 0x07, 0xef, 0x72, - 0x7f, 0x3f, 0xa9, 0xd0, 0x1a, 0xff, 0x9d, 0x60, 0xb8, 0xb3, 0x7f, 0xb8, - 0x9f, 0xe7, 0x95, 0x73, 0x05, 0x36, 0x0a, 0x74, 0x2c, 0x93, 0xbf, 0x87, - 0x9c, 0xb8, 0xe5, 0x18, 0xed, 0x66, 0x90, 0x7f, 0x17, 0xfe, 0x70, 0x06, - 0x8f, 0xa6, 0xec, 0xa4, 0x33, 0x83, 0x9b, 0x95, 0xdb, 0x8f, 0x5a, 0xa3, - 0x62, 0x0a, 0xc5, 0xe2, 0x3a, 0x6e, 0x63, 0x91, 0x44, 0x60, 0xe1, 0x3c, - 0xdf, 0x45, 0x6b, 0x1d, 0x38, 0x6f, 0x66, 0xcf, 0x42, 0x21, 0xc6, 0x37, - 0xf7, 0x7c, 0xc1, 0xf2, 0x88, 0xef, 0x7d, 0x5f, 0x72, 0xb3, 0x0b, 0x5a, - 0xae, 0x74, 0xaf, 0x87, 0x18, 0x34, 0x2e, 0x52, 0x2f, 0x3e, 0xc6, 0x26, - 0x17, 0x40, 0xf5, 0xa1, 0x36, 0x95, 0x8a, 0x22, 0xbe, 0x0b, 0xad, 0x8b, - 0x7b, 0xe9, 0x9c, 0xca, 0x05, 0x9e, 0x68, 0x7d, 0x2b, 0xa0, 0x0f, 0x75, - 0x1f, 0xf3, 0xc5, 0x60, 0xa6, 0x37, 0x59, 0xd8, 0x43, 0x42, 0xc6, 0x84, - 0x28, 0x77, 0xbe, 0x31, 0x5a, 0x97, 0x98, 0x36, 0x0a, 0x00, 0xa4, 0xeb, - 0x83, 0x0d, 0x64, 0xe1, 0x3f, 0xc0, 0x15, 0x8b, 0x33, 0xc5, 0x68, 0xc5, - 0x82, 0x53, 0xbb, 0x3a, 0x9e, 0x38, 0x5e, 0x61, 0xdc, 0x3c, 0xa1, 0x0f, - 0xcf, 0x9b, 0x06, 0xf4, 0x06, 0xfb, 0x1c, 0xc5, 0x35, 0x28, 0xc8, 0xa9, - 0x13, 0x32, 0xda, 0x94, 0x6a, 0x15, 0xa8, 0x2f, 0xd4, 0x9a, 0xf5, 0xe3, - 0xf6, 0xea, 0xe6, 0x00, 0x32, 0xa2, 0x37, 0x52, 0x7f, 0xde, 0xe6, 0xfd, - 0xd5, 0x85, 0x12, 0x59, 0x7f, 0x6a, 0x87, 0xbc, 0xc4, 0xbb, 0xe9, 0xe3, - 0x03, 0x81, 0xc1, 0xa4, 0x66, 0x52, 0xed, 0x91, 0x3e, 0xca, 0x4d, 0xe9, - 0x34, 0x55, 0xcf, 0xa1, 0x4a, 0x42, 0xb7, 0xd5, 0x57, 0x98, 0x9c, 0xae, - 0x79, 0x2a, 0xdd, 0x7f, 0x3f, 0xa9, 0x9b, 0x36, 0xb7, 0x85, 0xc0, 0xe2, - 0xef, 0x0f, 0x12, 0x40, 0x46, 0xa2, 0xf2, 0xbd, 0xc6, 0xd7, 0xe5, 0x42, - 0xf7, 0x93, 0xef, 0x41, 0x3e, 0x16, 0x02, 0x19, 0xa7, 0x3a, 0x3f, 0xe6, - 0xb0, 0x21, 0x0c, 0x62, 0xe3, 0x53, 0xc5, 0x76, 0xd8, 0xeb, 0x31, 0x9e, - 0xa0, 0xa6, 0xe9, 0x0a, 0xfc, 0x7f, 0xbb, 0x26, 0xd2, 0x60, 0xcd, 0x88, - 0xe1, 0x8b, 0xf5, 0x2f, 0xf5, 0x93, 0xdf, 0xe4, 0x08, 0x01, 0x81, 0x2b, - 0x29, 0xe0, 0xee, 0xd8, 0x95, 0x49, 0x5a, 0xb8, 0x7c, 0x36, 0xcb, 0x84, - 0xb9, 0x1e, 0xb9, 0xf3, 0x80, 0x7c, 0xc4, 0x1a, 0xbb, 0x39, 0xb4, 0x0e, - 0x3b, 0x48, 0xe5, 0x38, 0xca, 0x56, 0x4f, 0xf0, 0xff, 0xc6, 0x94, 0x3b, - 0x91, 0xce, 0x30, 0x79, 0xf0, 0xd4, 0xcb, 0xee, 0xe8, 0x28, 0x44, 0xd1, - 0xf7, 0xa7, 0x0e, 0x6f, 0x28, 0x7a, 0xa4, 0x72, 0x8f, 0x91, 0x85, 0x83, - 0x44, 0x93, 0x38, 0xff, 0x8a, 0x26, 0x6f, 0x06, 0x3a, 0x16, 0x1b, 0xad, - 0x07, 0x35, 0xce, 0xee, 0x84, 0xb0, 0x7c, 0x3b, 0x8e, 0x6e, 0x91, 0x37, - 0x07, 0xa0, 0x26, 0x98, 0x38, 0x48, 0x98, 0x6d, 0x0d, 0x73, 0xc3, 0x43, - 0x47, 0x1f, 0x10, 0x54, 0xf1, 0x15, 0xcd, 0xec, 0xfe, 0xad, 0x09, 0xdc, - 0x10, 0xfb, 0x98, 0x12, 0x04, 0xf6, 0xdb, 0x1c, 0x57, 0xb8, 0xc2, 0xfc, - 0xcd, 0x05, 0xdf, 0x08, 0x77, 0xfe, 0xcf, 0xb1, 0x64, 0x8a, 0x19, 0xa3, - 0xc7, 0xaa, 0xad, 0xdc, 0xaf, 0xb3, 0x8c, 0x4c, 0x39, 0xae, 0xfd, 0xad, - 0xc4, 0xba, 0xa3, 0x81, 0x2d, 0x5a, 0x9b, 0x71, 0x54, 0xdf, 0x84, 0xda, - 0xef, 0x71, 0x62, 0x5f, 0xdc, 0xe9, 0xa3, 0x31, 0x8e, 0x12, 0xf3, 0x29, - 0x47, 0xa8, 0x01, 0xd5, 0x06, 0xed, 0x97, 0x24, 0x26, 0x0f, 0x12, 0x91, - 0xb3, 0x82, 0xf2, 0x12, 0xd4, 0x18, 0x1c, 0x01, 0x19, 0x92, 0x39, 0x3b, - 0x0b, 0xed, 0xe5, 0xb8, 0x27, 0x9d, 0xe8, 0xcb, 0xa5, 0x1f, 0x21, 0x2c, - 0x63, 0x7c, 0xea, 0x49, 0xa8, 0xbc, 0x0c, 0xe4, 0xa6, 0xd1, 0x8d, 0x62, - 0x36, 0xa9, 0xb0, 0x2c, 0xed, 0x1c, 0x86, 0x25, 0x82, 0xc7, 0x0f, 0x01, - 0xc5, 0xc7, 0xc6, 0x00, 0xf2, 0xe6, 0x7f, 0xe7, 0x2b, 0xc8, 0x64, 0x87, - 0xc0, 0xab, 0x38, 0x02, 0x22, 0xa7, 0x4d, 0x4d, 0x82, 0x4d, 0x85, 0xc0, - 0x1f, 0x9b, 0xf1, 0x34, 0x3e, 0x4f, 0xca, 0x69, 0xc4, 0x5b, 0x0d, 0x7f, - 0xa8, 0x12, 0x70, 0xc9, 0xa4, 0x19, 0xed, 0x4e, 0xa1, 0x60, 0xb0, 0xbf, - 0xa3, 0x83, 0x85, 0xc0, 0x46, 0xb7, 0x2d, 0xf5, 0x5c, 0x9f, 0x1a, 0x79, - 0xd8, 0x0d, 0x2e, 0x6c, 0x33, 0x0f, 0xf5, 0x4c, 0xba, 0x3c, 0x3d, 0x60, - 0x58, 0x5e, 0xd4, 0xa0, 0x95, 0x6b, 0xc2, 0x29, 0x45, 0xf9, 0x9b, 0x20, - 0xf5, 0x72, 0x90, 0xa4, 0xdd, 0xb8, 0x06, 0x5a, 0xb1, 0x72, 0x9c, 0xcf, - 0x08, 0x80, 0xbd, 0xb5, 0x72, 0xd9, 0x0c, 0xee, 0xf6, 0xed, 0x81, 0x9b, - 0x5c, 0xb0, 0x9b, 0xb9, 0x50, 0x1e, 0x68, 0xb0, 0xda, 0x8e, 0xb4, 0x3e, - 0x3e, 0x0c, 0x2f, 0x9f, 0x2f, 0x76, 0xc1, 0xe2, 0x0c, 0xe6, 0xcf, 0x18, - 0x15, 0x16, 0x1f, 0xc7, 0x57, 0x06, 0xa9, 0x9c, 0x89, 0x90, 0x58, 0x01, - 0x7d, 0x1e, 0x30, 0xbc, 0x60, 0x1c, 0x9e, 0xae, 0xe0, 0x1b, 0xcd, 0x9c, - 0xa2, 0x71, 0xde, 0x9e, 0x72, 0x64, 0x62, 0x3f, 0xaf, 0xfa, 0x52, 0x21, - 0xab, 0x6f, 0x22, 0x80, 0x46, 0x57, 0x57, 0xda, 0x37, 0xf5, 0x01, 0x6f, - 0x98, 0xb9, 0xd6, 0x6b, 0xb1, 0x13, 0xaf, 0xc8, 0x94, 0x65, 0xcb, 0xa6, - 0x8d, 0xa8, 0x4d, 0x07, 0xbd, 0x92, 0xfd, 0x69, 0xf3, 0xba, 0x08, 0x39, - 0x6e, 0x2a, 0x39, 0x77, 0x84, 0xdc, 0xb9, 0xea, 0x3b, 0x01, 0x14, 0xd1, - 0xd7, 0x22, 0xa1, 0x35, 0x56, 0x36, 0xa0, 0x1d, 0x8e, 0x53, 0x87, 0x07, - 0x6d, 0x08, 0x35, 0xbb, 0x0c, 0xc5, 0xaa, 0x8e, 0xd4, 0xa1, 0xaf, 0xc4, - 0xa3, 0x53, 0x3d, 0xa3, 0x5f, 0xae, 0xfa, 0x68, 0xa7, 0xb5, 0x87, 0x72, - 0x90, 0xef, 0xd5, 0x7f, 0xe1, 0x40, 0x62, 0xd6, 0xd5, 0xb9, 0x4d, 0x31, - 0x6c, 0x85, 0x8b, 0x0f, 0xf3, 0xf2, 0x03, 0x94, 0x03, 0x37, 0x6a, 0xbf, - 0xf9, 0x2e, 0x7c, 0x90, 0xf3, 0x8b, 0x1a, 0x3c, 0x7e, 0x93, 0x42, 0xf7, - 0x79, 0x7e, 0xfd, 0x21, 0x95, 0x13, 0xe6, 0x36, 0x25, 0x92, 0x3c, 0x73, - 0x80, 0x61, 0xc7, 0x56, 0x69, 0x1d, 0x6b, 0x13, 0xf0, 0x3d, 0x48, 0x24, - 0x1d, 0xff, 0x3a, 0x58, 0x07, 0xcb, 0xd4, 0x2b, 0x5b, 0xbc, 0x11, 0x9d, - 0xe1, 0x3a, 0x7a, 0x29, 0x99, 0xb2, 0x50, 0x8b, 0xbc, 0x1b, 0x80, 0xd3, - 0x2a, 0x7c, 0xa8, 0xa9, 0xba, 0x75, 0x58, 0x49, 0x3c, 0xe3, 0xde, 0x90, - 0xe9, 0xd0, 0xe1, 0xc3, 0xbe, 0x0c, 0xc8, 0xa0, 0x76, 0x93, 0xb6, 0xb2, - 0xcf, 0x32, 0x66, 0xd8, 0xde, 0x99, 0xac, 0x5d, 0x90, 0xea, 0xc9, 0x80, - 0x84, 0xeb, 0xad, 0x1d, 0x2a, 0x83, 0xd9, 0x1f, 0x36, 0xc9, 0xb2, 0xcc, - 0x93, 0x80, 0xbc, 0x12, 0xef, 0x4c, 0x10, 0xce, 0x9f, 0xf1, 0x9c, 0x16, - 0xf5, 0xf7, 0x19, 0x62, 0xfc, 0xdf, 0x57, 0x54, 0x8e, 0x19, 0xd7, 0xe1, - 0x32, 0xb2, 0xba, 0x44, 0xa4, 0xe9, 0x1c, 0x67, 0x86, 0xf0, 0xd9, 0x04, - 0xb5, 0x60, 0x7d, 0x50, 0x43, 0x1d, 0xd6, 0x84, 0xc1, 0xef, 0xdf, 0xba, - 0xa4, 0xe6, 0xd7, 0x99, 0x28, 0xe2, 0xbd, 0x35, 0x95, 0x1d, 0x63, 0xf2, - 0x10, 0x24, 0x4e, 0xcb, 0x1f, 0xa8, 0xf7, 0xdb, 0x36, 0x62, 0x91, 0x38, - 0xea, 0x8d, 0x07, 0x1b, 0xde, 0x46, 0x7f, 0x6e, 0x05, 0x42, 0x93, 0xf5, - 0xbe, 0xf5, 0xba, 0x87, 0x08, 0xb6, 0x35, 0x5c, 0x17, 0xfe, 0x2c, 0x48, - 0x4f, 0x5d, 0xc4, 0xcf, 0xde, 0xd4, 0x8a, 0x6d, 0x58, 0x09, 0x4c, 0xc0, - 0x9f, 0xb6, 0x08, 0x62, 0xb7, 0x00, 0x11, 0xfb, 0x69, 0x3d, 0x51, 0x77, - 0x02, 0xdf, 0xa4, 0x89, 0x5f, 0x62, 0xcb, 0x06, 0xdc, 0x86, 0x14, 0x6e, - 0x27, 0xe6, 0xc1, 0xf6, 0x82, 0xd1, 0xdf, 0x63, 0xfc, 0x09, 0x65, 0x3e, - 0x98, 0xaa, 0x6d, 0xdd, 0x02, 0x34, 0x92, 0xf6, 0xd0, 0x10, 0x8f, 0xaa, - 0xd6, 0xae, 0x2a, 0x26, 0xd5, 0xfc, 0x8c, 0x27, 0x3a, 0x7c, 0x4d, 0x8e, - 0x7e, 0xb3, 0xbe, 0x6d, 0x52, 0x4d, 0x27, 0x78, 0x7d, 0x0b, 0xd2, 0xb3, - 0x81, 0x09, 0x7b, 0xa4, 0xb2, 0x05, 0x64, 0x9f, 0xa8, 0x85, 0x49, 0xb0, - 0x36, 0xb5, 0x20, 0xd7, 0xb0, 0xdb, 0xb7, 0xaa, 0xe6, 0x22, 0x43, 0x75, - 0x3e, 0x09, 0x35, 0xee, 0xf1, 0x2d, 0x61, 0x2d, 0xd5, 0x51, 0x7f, 0x61, - 0x12, 0xa9, 0xce, 0xdb, 0xce, 0xf3, 0xd5, 0x41, 0x04, 0x78, 0x1a, 0x81, - 0x4f, 0xb9, 0x7a, 0x96, 0xb8, 0x4c, 0xa1, 0x4c, 0x01, 0xf3, 0x6a, 0xa0, - 0x58, 0x6d, 0x3c, 0x6d, 0xd6, 0x8b, 0x7b, 0x82, 0x8d, 0x74, 0xf0, 0x67, - 0x3c, 0xc7, 0x9b, 0xb8, 0x66, 0x2e, 0x3e, 0xb9, 0xb5, 0xfa, 0x1f, 0x96, - 0x6c, 0x1f, 0x8f, 0xcc, 0x2a, 0x10, 0x43, 0x4d, 0x67, 0x26, 0x7b, 0xa9, - 0x71, 0x50, 0x93, 0xe1, 0xa6, 0xb2, 0x1f, 0xb8, 0xb2, 0xf5, 0x34, 0xcd, - 0x6e, 0x30, 0x35, 0x90, 0x02, 0x7f, 0x9c, 0x15, 0xae, 0x3f, 0xe8, 0xae, - 0xcb, 0x94, 0x58, 0x3d, 0xb2, 0x54, 0x57, 0xa9, 0xc0, 0xc1, 0xce, 0xc4, - 0x77, 0xf9, 0x6a, 0x9a, 0xf5, 0xee, 0xbe, 0x07, 0x37, 0xc5, 0x81, 0xd2, - 0xf2, 0xcc, 0x54, 0xa1, 0x3e, 0x25, 0x07, 0x3d, 0xf2, 0xd3, 0x80, 0x37, - 0x06, 0x5b, 0xa7, 0x87, 0x81, 0xc9, 0xb9, 0x4e, 0x8c, 0xc1, 0x8a, 0x96, - 0x33, 0x51, 0xb7, 0x65, 0x36, 0xb4, 0x97, 0x60, 0x18, 0xc0, 0x57, 0x6b, - 0xea, 0x8e, 0x76, 0x4d, 0xf4, 0xa0, 0xb5, 0x2c, 0x96, 0xff, 0x64, 0x33, - 0xa1, 0x54, 0x06, 0x34, 0x2b, 0x9e, 0xed, 0x20, 0xbf, 0x60, 0xac, 0x90, - 0x8c, 0x68, 0xea, 0x39, 0xe9, 0x15, 0xc5, 0x86, 0x17, 0x9c, 0x61, 0x55, - 0x4d, 0x10, 0x64, 0x7d, 0xf7, 0x73, 0x05, 0x2d, 0x0e, 0x8d, 0xb2, 0x34, - 0x00, 0x01, 0x71, 0xe9, 0x2b, 0x34, 0xdd, 0x19, 0x48, 0x26, 0x53, 0xd3, - 0xe1, 0x21, 0xd8, 0xfe, 0x83, 0xe8, 0xd4, 0xfa, 0x78, 0x24, 0x08, 0xac, - 0xe4, 0xe8, 0x84, 0xf2, 0xfa, 0xb5, 0xc6, 0x8b, 0x4a, 0xa2, 0x4a, 0xd3, - 0xf9, 0xd2, 0x48, 0x62, 0x22, 0x4a, 0x45, 0x23, 0x40, 0x67, 0x0d, 0x9b, - 0x9b, 0xf1, 0x90, 0x05, 0xfc, 0xce, 0x3e, 0x5d, 0xa3, 0xf5, 0xc2, 0xe2, - 0xab, 0xac, 0x3b, 0xeb, 0x16, 0xa5, 0x10, 0x24, 0xb8, 0x30, 0x10, 0x67, - 0x28, 0x1d, 0xa3, 0x72, 0x9d, 0xbd, 0x0f, 0xd6, 0xcb, 0x3d, 0x38, 0xda, - 0x4d, 0x52, 0x0c, 0x08, 0xda, 0xd3, 0x72, 0x8c, 0x17, 0xcd, 0xc1, 0x69, - 0xef, 0x75, 0x49, 0xdf, 0xb2, 0xd2, 0x7d, 0xe9, 0x3c, 0xba, 0xb0, 0x59, - 0xa7, 0xdc, 0x04, 0xb4, 0xd6, 0x12, 0x61, 0xcd, 0xad, 0x73, 0x3a, 0x8c, - 0xfc, 0x18, 0x0a, 0xda, 0x9c, 0xb0, 0x1e, 0x60, 0xd2, 0x3d, 0xf0, 0xc3, - 0xc5, 0xcd, 0x45, 0x0c, 0x68, 0x07, 0x1f, 0x0c, 0xa2, 0x0f, 0x1a, 0xad, - 0x2d, 0x5d, 0x31, 0xaf, 0xe1, 0x72, 0xd2, 0xde, 0xe6, 0xde, 0x20, 0x4c, - 0x45, 0x9c, 0xcd, 0xd0, 0x26, 0x31, 0xe6, 0x05, 0x68, 0x7c, 0x4d, 0x16, - 0x2f, 0xb9, 0x74, 0x0e, 0x3e, 0x89, 0xd6, 0xdc, 0x1c, 0xc8, 0x2c, 0xfb, - 0x62, 0xd3, 0x55, 0x02, 0xd2, 0x48, 0x68, 0x85, 0x74, 0xdc, 0x5b, 0xf8, - 0x5c, 0x3e, 0x42, 0x1c, 0xf3, 0xce, 0x35, 0xc0, 0xf5, 0xd7, 0x10, 0xfd, - 0x1f, 0x1d, 0x0a, 0xbe, 0xc8, 0x1f, 0x13, 0x05, 0x67, 0x26, 0x7e, 0x1d, - 0xcd, 0x76, 0x86, 0xa7, 0x58, 0x1c, 0x55, 0x99, 0x17, 0x5b, 0xb3, 0x37, - 0xa9, 0x00, 0x6a, 0x2e, 0x6b, 0xe2, 0x1c, 0x5f, 0x38, 0x9b, 0x01, 0x03, - 0x7d, 0x7b, 0xac, 0xd9, 0x58, 0x6e, 0x30, 0x06, 0x14, 0xb2, 0x27, 0x0d, - 0x3d, 0xb3, 0x6f, 0x8a, 0xf6, 0x1b, 0xdf, 0xc3, 0x19, 0x08, 0xf2, 0x35, - 0x1d, 0xc1, 0x4c, 0x40, 0x25, 0x68, 0xd1, 0x81, 0x8a, 0x54, 0x9e, 0x0f, - 0x71, 0x21, 0xc8, 0xb9, 0xb9, 0x18, 0x71, 0xe8, 0xa6, 0x9a, 0x76, 0x27, - 0x07, 0x8c, 0x95, 0x51, 0x5f, 0x34, 0xbe, 0xda, 0x81, 0xf9, 0x0d, 0x0c, - 0xf6, 0xdb, 0x03, 0x64, 0x32, 0x80, 0x8b, 0xaa, 0x3f, 0x5b, 0xc2, 0xfd, - 0x7f, 0x73, 0x56, 0x19, 0xf5, 0x54, 0x15, 0x8f, 0xc6, 0xd8, 0x16, 0xdc, - 0x16, 0xd0, 0x41, 0xdf, 0x92, 0x42, 0xef, 0xde, 0x1c, 0xd7, 0xc2, 0x59, - 0xd2, 0x6b, 0x63, 0xf8, 0x0f, 0xf9, 0x15, 0x19, 0x71, 0xaf, 0xca, 0x94, - 0x54, 0x8c, 0x97, 0x3b, 0x29, 0xc3, 0x22, 0x4a, 0x37, 0x47, 0x65, 0xe8, - 0x28, 0xed, 0xe8, 0x67, 0x37, 0xb5, 0x71, 0xbf, 0x7a, 0xd2, 0x03, 0xe8, - 0x91, 0x20, 0x21, 0xf4, 0x4e, 0x2b, 0xc4, 0x74, 0x0b, 0x82, 0xec, 0xe3, - 0xf9, 0x7c, 0xc3, 0x96, 0x89, 0xdd, 0x2f, 0x24, 0xc1, 0xa7, 0x85, 0xb7, - 0xae, 0x39, 0x4d, 0x0b, 0x92, 0x15, 0x53, 0xb3, 0xe5, 0x21, 0x24, 0x23, - 0x33, 0x76, 0x55, 0xa7, 0xbf, 0xdf, 0x63, 0x84, 0x2c, 0xdf, 0xd5, 0xc0, - 0x59, 0x0f, 0x5c, 0xf7, 0xc3, 0x64, 0xbe, 0xd0, 0xe3, 0x81, 0x3f, 0xcc, - 0x83, 0x03, 0xf5, 0x40, 0xc4, 0x0d, 0x20, 0xa6, 0x81, 0xe5, 0x3d, 0xa3, - 0x82, 0x7d, 0xff, 0xe9, 0xc6, 0x12, 0xee, 0x5c, 0x42, 0x0c, 0x33, 0xaf, - 0x77, 0x1a, 0x63, 0xa8, 0xb0, 0x84, 0x5d, 0x5c, 0x0a, 0xab, 0x5d, 0x35, - 0x5d, 0x4c, 0xa5, 0x61, 0x20, 0x48, 0xee, 0x93, 0x33, 0x5c, 0xce, 0xde, - 0xa3, 0x5d, 0x9b, 0x7f, 0x67, 0x3b, 0x4b, 0x47, 0x93, 0x79, 0x3f, 0x17, - 0xad, 0x2b, 0x81, 0x75, 0xe1, 0x70, 0xaa, 0x5d, 0x23, 0xae, 0x0a, 0x27, - 0xf6, 0x22, 0xa3, 0x18, 0x6e, 0xe9, 0xe1, 0xd3, 0xa8, 0x11, 0x8d, 0x37, - 0x98, 0x11, 0x95, 0x98, 0xa4, 0x5e, 0x82, 0x84, 0x7d, 0x0f, 0xc5, 0x6f, - 0xc2, 0x1a, 0x04, 0x16, 0x91, 0xa5, 0x61, 0x3a, 0xba, 0xf3, 0xf0, 0x47, - 0x2b, 0x0b, 0x59, 0xf6, 0x0b, 0x7f, 0x92, 0xbf, 0x3b, 0xb6, 0x9f, 0x0e, - 0x56, 0xe2, 0xd1, 0x64, 0x4a, 0x76, 0x2c, 0xde, 0xcb, 0x1a, 0x5c, 0x85, - 0xec, 0xd2, 0xf9, 0xf5, 0xa0, 0x04, 0xa3, 0xa0, 0xaf, 0x42, 0xcb, 0xd3, - 0x0f, 0xdc, 0x18, 0xf6, 0x55, 0x31, 0xc2, 0x82, 0x96, 0xca, 0x95, 0xe7, - 0x56, 0x93, 0x77, 0x64, 0x2a, 0xe6, 0x9b, 0x55, 0x2b, 0x48, 0xec, 0x16, - 0x3a, 0x77, 0xaa, 0x06, 0x7b, 0xde, 0x81, 0x3d, 0xb5, 0xb7, 0xcc, 0xa5, - 0x82, 0xe6, 0x62, 0xab, 0xbe, 0xc3, 0xaf, 0xe3, 0x33, 0xdd, 0xa7, 0x8c, - 0x80, 0x5d, 0xf2, 0xf4, 0xfd, 0xfb, 0x4b, 0x1d, 0x4e, 0xbd, 0x21, 0xf7, - 0x02, 0xf6, 0xd9, 0x96, 0xa0, 0x09, 0xf1, 0x4e, 0x5d, 0xaf, 0xfe, 0x90, - 0x09, 0x8a, 0x0f, 0x72, 0x0e, 0x10, 0x2e, 0xbb, 0xd1, 0x0b, 0x87, 0x0d, - 0x4c, 0x89, 0x5a, 0xf1, 0x0a, 0x9e, 0x64, 0x57, 0x2d, 0xcb, 0x81, 0x2c, - 0xa9, 0x3e, 0x03, 0x68, 0x51, 0x27, 0x5b, 0x6d, 0xa4, 0x34, 0x52, 0x2a, - 0xf9, 0x27, 0x6c, 0x7c, 0x02, 0x68, 0xb8, 0x57, 0xa7, 0xa1, 0x4c, 0xb5, - 0x00, 0x35, 0x57, 0xe0, 0xef, 0xe5, 0x1e, 0x96, 0xe4, 0xf1, 0xa1, 0xd8, - 0x46, 0x20, 0x0c, 0x98, 0xb8, 0x2a, 0xc0, 0xbb, 0x14, 0x63, 0xf0, 0xe3, - 0x3a, 0xd0, 0xed, 0x73, 0xd0, 0x7d, 0xd1, 0x0e, 0xab, 0x7d, 0xc8, 0xb7, - 0xd9, 0x8a, 0x9a, 0x82, 0x46, 0x6b, 0x55, 0x2f, 0xa8, 0xf5, 0xb4, 0x09, - 0xaf, 0x4c, 0x50, 0x4c, 0x7d, 0x7b, 0x40, 0xa2, 0x95, 0x8d, 0x29, 0x4e, - 0x23, 0x8e, 0x95, 0x72, 0x78, 0x73, 0x71, 0xf6, 0x6f, 0x85, 0x76, 0xbd, - 0x79, 0xc9, 0x8c, 0x5c, 0x34, 0x60, 0x79, 0x80, 0x42, 0xf5, 0x3d, 0xf6, - 0xa9, 0x8a, 0xb7, 0x5f, 0xfa, 0x56, 0x75, 0xd3, 0xc4, 0x40, 0xd5, 0xf1, - 0x68, 0x9e, 0xbb, 0xed, 0x01, 0x66, 0x39, 0x89, 0x0a, 0x61, 0x88, 0xf2, - 0xf5, 0x72, 0x07, 0xc6, 0xc1, 0xfd, 0x34, 0xc2, 0x4d, 0xa6, 0xdf, 0xce, - 0x6f, 0xcc, 0xd6, 0xb0, 0xcc, 0xe4, 0xae, 0xbb, 0xa8, 0xae, 0x52, 0x74, - 0x8d, 0xab, 0x11, 0xff, 0x0f, 0x2c, 0x75, 0xb2, 0x5c, 0x1f, 0xf5, 0xa3, - 0x94, 0xe7, 0xc4, 0x3e, 0x00, 0x94, 0x29, 0x72, 0x47, 0x74, 0xca, 0x5f, - 0xc6, 0x4c, 0xc9, 0x67, 0x8e, 0x22, 0xa4, 0xff, 0x82, 0xa9, 0xce, 0xfc, - 0x01, 0xc1, 0x2a, 0x98, 0x3a, 0x66, 0xc1, 0x93, 0xc8, 0xd2, 0x7e, 0x0c, - 0x8e, 0x98, 0x76, 0x5b, 0x0e, 0x00, 0x52, 0x63, 0xd2, 0xd1, 0x44, 0x2e, - 0x6a, 0x94, 0x1e, 0xe6, 0x0b, 0xc3, 0x65, 0x92, 0xe8, 0x62, 0x6b, 0x32, - 0x8b, 0xfb, 0xca, 0x09, 0xc7, 0x1a, 0x75, 0xeb, 0xd2, 0x68, 0x54, 0x46, - 0x2e, 0x89, 0x16, 0x6e, 0x1f, 0x18, 0xbb, 0x08, 0xd6, 0x7c, 0x70, 0x94, - 0x02, 0xfb, 0x60, 0x15, 0x7c, 0x14, 0x09, 0xac, 0xa9, 0x6c, 0xd9, 0xd9, - 0x98, 0x7a, 0xf3, 0xda, 0x74, 0x28, 0x6f, 0xa3, 0xf9, 0x11, 0xfc, 0x86, - 0xe5, 0x79, 0xc4, 0x0c, 0x2c, 0xa0, 0x8f, 0x16, 0x23, 0x9d, 0xbd, 0x70, - 0xab, 0xb8, 0x7c, 0xfa, 0xc8, 0xcb, 0x05, 0xeb, 0x66, 0x85, 0x7a, 0x0e, - 0x4f, 0xb7, 0x41, 0x9f, 0xc6, 0x21, 0x8f, 0x1f, 0x8f, 0x4d, 0x48, 0xb4, - 0x22, 0xbd, 0x74, 0x07, 0x87, 0x26, 0x04, 0x6d, 0xf0, 0x8c, 0x6c, 0x28, - 0x1d, 0x4c, 0x1f, 0xf1, 0xd6, 0xf3, 0x67, 0x13, 0xfd, 0xc2, 0x30, 0xb8, - 0x6f, 0xf3, 0xd7, 0xb6, 0x1f, 0x84, 0x2f, 0x96, 0x92, 0xa8, 0x22, 0xbc, - 0xc2, 0x10, 0x1f, 0xd2, 0xef, 0xdf, 0x20, 0x2e, 0xb6, 0xd8, 0xae, 0xb5, - 0xd0, 0x30, 0x80, 0xc0, 0x70, 0x7e, 0xf3, 0xcd, 0xae, 0x31, 0x84, 0x95, - 0x9a, 0xef, 0xf7, 0x4c, 0x4a, 0x56, 0x55, 0xd1, 0xf7, 0xb5, 0x16, 0x5d, - 0xd2, 0xe1, 0x72, 0x0d, 0x7b, 0xfc, 0xc8, 0x6b, 0x10, 0x55, 0xf6, 0x7d, - 0x9f, 0x98, 0x7b, 0x30, 0x51, 0x99, 0xfc, 0x9c, 0x9a, 0x4b, 0x55, 0x56, - 0xde, 0xe0, 0x91, 0x30, 0xe2, 0x47, 0x5a, 0xf2, 0xe2, 0x36, 0x1e, 0x30, - 0x4c, 0x86, 0x87, 0xde, 0x3c, 0xa5, 0x86, 0x59, 0x41, 0xe0, 0xb7, 0x72, - 0x33, 0x1b, 0x95, 0x31, 0x3d, 0xb9, 0xa2, 0x29, 0x1c, 0x40, 0x32, 0x04, - 0xe2, 0x96, 0x89, 0x10, 0x42, 0xa9, 0x67, 0x0d, 0xbc, 0x06, 0xb1, 0x72, - 0x40, 0x3d, 0xf8, 0x15, 0x47, 0xdf, 0x73, 0x92, 0x60, 0x60, 0x6a, 0xc9, - 0x98, 0xf9, 0xcd, 0x5d, 0xc7, 0xb5, 0xc2, 0x73, 0x61, 0x8f, 0x0f, 0x0f, - 0x15, 0x99, 0xfd, 0x37, 0x8a, 0xf2, 0x4a, 0x46, 0x28, 0x04, 0x48, 0xae, - 0x84, 0x83, 0x34, 0x24, 0xd8, 0xc4, 0xfb, 0x1c, 0x25, 0x7b, 0xe0, 0x65, - 0x9d, 0xe3, 0xaf, 0x02, 0x70, 0xed, 0x62, 0x4e, 0xef, 0x24, 0xbd, 0x53, - 0xe5, 0x0a, 0x29, 0xb3, 0x1f, 0x93, 0xda, 0x45, 0x1d, 0x1f, 0xa0, 0xd0, - 0x4c, 0x3b, 0x10, 0xd2, 0xba, 0xe4, 0xb2, 0x7d, 0x78, 0x18, 0x47, 0x86, - 0xba, 0x58, 0xa5, 0xcb, 0x16, 0x74, 0x47, 0x89, 0xbe, 0x09, 0xa6, 0x39, - 0x60, 0xd4, 0xb8, 0xf3, 0x67, 0x13, 0xbb, 0x83, 0x19, 0x45, 0x97, 0x97, - 0x35, 0x1c, 0x6a, 0x67, 0x68, 0xe6, 0x68, 0xed, 0xf5, 0x54, 0x15, 0x8f, - 0xc6, 0xd8, 0x16, 0xdc, 0x16, 0xd0, 0x41, 0xdf, 0x92, 0x42, 0xef, 0xee, - 0x59, 0x65, 0x16, 0x61, 0x00, 0xfe, 0xef, 0x9e, 0x97, 0x2d, 0x27, 0x08, - 0xf4, 0x93, 0x06, 0x9f, 0x54, 0x8c, 0x97, 0x3b, 0x29, 0xc3, 0x22, 0x4a, - 0x37, 0x47, 0x65, 0xf8, 0x28, 0xed, 0xe8, 0x67, 0xdb, 0x36, 0x0c, 0x16, - 0xc8, 0x95, 0xfb, 0xfc, 0xe7, 0xd6, 0x5e, 0x10, 0x6e, 0xdc, 0x83, 0x6d, - 0x0b, 0x82, 0xe0, 0xe3, 0xf9, 0x7c, 0xc3, 0x96, 0x89, 0xdd, 0x2f, 0x24, - 0xc1, 0xa7, 0x85, 0xb7, 0xae, 0x39, 0x4d, 0x0b, 0x92, 0x15, 0x53, 0xb3, - 0xe5, 0x21, 0x24, 0x23, 0x33, 0x76, 0x55, 0xa7, 0xa5, 0x93, 0xb2, 0xa5, - 0x15, 0x21, 0x61, 0x29, 0xd7, 0xdf, 0x49, 0x99, 0x22, 0x9a, 0xa2, 0xa0, - 0x42, 0x13, 0x5e, 0x34, 0x9e, 0x74, 0x86, 0xe2, 0x54, 0x46, 0x38, 0xa6, - 0x4f, 0x51, 0xa4, 0x0d, 0x4e, 0x5c, 0xbe, 0x06, 0x95, 0x1b, 0xd5, 0x62, - 0x0c, 0xf2, 0xd1, 0x2c, 0xb2, 0x42, 0xfc, 0x15, 0xcb, 0xac, 0xdf, 0x4b, - 0x4d, 0x99, 0x6b, 0x47, 0xf7, 0x8b, 0x0e, 0x55, 0x40, 0xf4, 0x92, 0x4d, - 0xc4, 0x01, 0x80, 0x6e, 0x9f, 0x44, 0x46, 0x6f, 0x66, 0xbc, 0x37, 0xe1, - 0x18, 0x7e, 0x06, 0xec, 0xce, 0xb0, 0x7c, 0x3b, 0xe4, 0xff, 0xfc, 0x1b, - 0xc6, 0x8a, 0x4f, 0x84, 0xc3, 0x5b, 0xc7, 0x20, 0xf6, 0xeb, 0xd0, 0xec, - 0x97, 0x1f, 0xd9, 0x53, 0x22, 0xd8, 0xd8, 0x1f, 0x57, 0x10, 0x3d, 0x89, - 0xed, 0x0e, 0x42, 0xa4, 0x79, 0x0c, 0x01, 0x90, 0xa6, 0xb4, 0x65, 0xcb, - 0xd2, 0x32, 0x26, 0xd5, 0xde, 0x49, 0x50, 0x52, 0x90, 0x46, 0x96, 0x4a, - 0x7c, 0x05, 0xf9, 0x07, 0xbf, 0x94, 0x7f, 0x37, 0x66, 0x33, 0x56, 0x90, - 0x4e, 0xc3, 0x5d, 0xc9, 0xa1, 0x7b, 0x51, 0x87, 0x0b, 0x44, 0xe1, 0xaa, - 0x2c, 0x3b, 0x82, 0x61, 0x9a, 0x31, 0x25, 0x48, 0x49, 0xd4, 0x8a, 0x64, - 0x22, 0xe3, 0x08, 0x04, 0xf1, 0xd4, 0x0b, 0xd5, 0xcd, 0x8e, 0x6f, 0xca, - 0x63, 0xd5, 0xf8, 0xf6, 0x04, 0x06, 0x96, 0x51, 0xee, 0xaa, 0xd3, 0x1e, - 0x30, 0x7a, 0xd1, 0xe4, 0xca, 0x24, 0x15, 0x1e, 0x94, 0x4f, 0x73, 0x37, - 0xb2, 0x21, 0xa4, 0x17, 0x48, 0x44, 0x81, 0x14, 0x58, 0x86, 0xd6, 0xc3, - 0xdb, 0xb5, 0x8a, 0x1d, 0xc9, 0x24, 0x7e, 0xab, 0x75, 0xf8, 0x36, 0xc4, - 0xf8, 0x98, 0x77, 0x28, 0x01, 0x19, 0x38, 0x1e, 0xc0, 0xe7, 0x4f, 0x0f, - 0xa8, 0x8d, 0xe1, 0x43, 0x20, 0x6b, 0x8e, 0x7a, 0x9a, 0x8b, 0x2f, 0xc7, - 0x80, 0x63, 0xd1, 0xc6, 0x8a, 0x12, 0xc4, 0x39, 0xaf, 0x00, 0x60, 0xc8, - 0x01, 0x40, 0xa7, 0x8f, 0x34, 0x43, 0x8e, 0x92, 0x99, 0xc2, 0x0c, 0x68, - 0x58, 0x0c, 0xf2, 0x43, 0xf9, 0x14, 0xe5, 0x21, 0x0f, 0xa6, 0x4f, 0x33, - 0x37, 0x90, 0x8a, 0xe1, 0x72, 0x85, 0x9d, 0xb8, 0x4e, 0x35, 0x53, 0x94, - 0x2d, 0xf8, 0xfa, 0xf0, 0xd0, 0xed, 0x1a, 0x89, 0xca, 0xb0, 0x7b, 0x4c, - 0x06, 0xcd, 0x83, 0x0f, 0x74, 0xbb, 0xa7, 0x1a, 0x28, 0xef, 0x0b, 0x1a, - 0x72, 0x1e, 0xd1, 0xfe, 0xe2, 0xcc, 0x5e, 0x98, 0x01, 0xfa, 0x90, 0xec, - 0xef, 0xab, 0x0c, 0xa9, 0xf1, 0xfa, 0x8d, 0x92, 0x07, 0x9e, 0x7f, 0xc0, - 0x90, 0xd2, 0xc7, 0xa6, 0x4c, 0xa9, 0x08, 0x06, 0x12, 0x8b, 0x29, 0x58, - 0x1d, 0x0f, 0x04, 0xec, 0x6b, 0x34, 0x73, 0x24, 0x1a, 0xfe, 0xc0, 0x65, - 0x96, 0xc1, 0xa9, 0x73, 0x96, 0x24, 0x4b, 0x07, 0xdd, 0xc5, 0xed, 0x3e, - 0xd9, 0xaa, 0x29, 0x78, 0xc9, 0x7d, 0xca, 0xe8, 0x7b, 0x13, 0x19, 0x78, - 0x81, 0x52, 0x57, 0x8e, 0x33, 0x9b, 0xcd, 0x4c, 0xd4, 0x99, 0xa1, 0x3b, - 0x84, 0x1b, 0x43, 0x58, 0x5b, 0x24, 0xfe, 0xb6, 0x66, 0x42, 0xa5, 0x6f, - 0xbf, 0x5a, 0xac, 0x53, 0x4e, 0xde, 0xd1, 0xf8, 0x85, 0x12, 0xda, 0xf6, - 0xf4, 0xcb, 0xdc, 0x39, 0x4b, 0x37, 0x57, 0x4e, 0xed, 0x9d, 0x44, 0x9a, - 0x88, 0x4a, 0x01, 0x5b, 0x5a, 0x0f, 0x34, 0xe8, 0x83, 0x3e, 0xde, 0xb5, - 0x9b, 0x0a, 0x2a, 0x6e, 0x7d, 0xbe, 0xfd, 0x8d, 0x23, 0xc6, 0x90, 0xde, - 0x96, 0x57, 0x42, 0x3c, 0x69, 0xf4, 0x6f, 0x1d, 0xdd, 0x5d, 0xe7, 0x10, - 0x60, 0xe7, 0xb5, 0x61, 0x68, 0x03, 0xcb, 0xc6, 0x7a, 0x86, 0x62, 0x9d, - 0xd0, 0x6d, 0x63, 0xa5, 0x12, 0xfe, 0x19, 0xb1, 0x57, 0xd1, 0xcd, 0xd9, - 0x31, 0x21, 0x73, 0x9c, 0x4b, 0x5b, 0x37, 0xf2, 0xce, 0xd8, 0x19, 0x72, - 0xd6, 0xf3, 0x1e, 0x17, 0x3e, 0x0f, 0x12, 0x85, 0xf5, 0xdd, 0x71, 0xe3, - 0x3d, 0x13, 0xfd, 0x5b, 0x88, 0xe9, 0x3c, 0x48, 0x50, 0x4b, 0xbf, 0x4a, - 0x89, 0x25, 0xe7, 0x93, 0x81, 0xb1, 0x33, 0xb4, 0xeb, 0x93, 0xc2, 0xf7, - 0xee, 0x59, 0x13, 0xb7, 0x4f, 0x87, 0x51, 0xcb, 0xfc, 0xbb, 0x59, 0x65, - 0xe6, 0x69, 0x25, 0x44, 0x7d, 0x94, 0xd1, 0x8f, 0x17, 0xf6, 0x8d, 0x62, - 0x03, 0xc6, 0x42, 0x30, 0xb6, 0xfc, 0x79, 0x2e, 0x8a, 0x6d, 0x41, 0xfc, - 0x97, 0x8b, 0x18, 0xe7, 0x9b, 0xec, 0x5d, 0xd2, 0x86, 0xfd, 0xb2, 0x79, - 0x98, 0x6d, 0x13, 0x8b, 0x6b, 0xc5, 0xd4, 0xc7, 0xef, 0xf1, 0xca, 0x0f, - 0xca, 0xda, 0x51, 0x11, 0x05, 0xea, 0x52, 0x1d, 0x39, 0xde, 0x79, 0xc5, - 0x78, 0x3c, 0xa8, 0x2c, 0xab, 0x8b, 0xb9, 0xca, 0xd6, 0xa3, 0x2f, 0x65, - 0x3f, 0xb7, 0xca, 0x5a, 0x55, 0xb7, 0xc7, 0xb6, 0xe5, 0x5f, 0x19, 0xed, - 0x26, 0x5d, 0xfa, 0x70, 0x94, 0xf7, 0x89, 0xeb, 0x7a, 0x80, 0x6c, 0x1a, - 0x1a, 0x26, 0x07, 0x4a, 0xa9, 0xaa, 0xd2, 0x24, 0x3e, 0x5e, 0x5d, 0xfc, - 0x0a, 0x40, 0x54, 0x46, 0x14, 0xe5, 0xb0, 0x90, 0x68, 0x7f, 0x98, 0xe1, - 0x8e, 0x54, 0xc6, 0x64, 0x47, 0x21, 0x1b, 0xfb, 0x7d, 0xb7, 0x57, 0x90, - 0xe1, 0xf5, 0x97, 0x30, 0x33, 0x7d, 0x37, 0x41, 0xa0, 0xaa, 0xda, 0x57, - 0x74, 0x80, 0x8b, 0xe9, 0xd2, 0x32, 0xb5, 0x8a, 0x61, 0x93, 0xd8, 0xbf, - 0x42, 0x16, 0x4f, 0xb6, 0x09, 0xd8, 0xc8, 0x82, 0xc2, 0x75, 0x21, 0x77, - 0x49, 0xc2, 0x14, 0x1b, 0xa7, 0x19, 0x89, 0x3a, 0x63, 0xbc, 0xa9, 0xeb, - 0x53, 0x4c, 0x8a, 0xa3, 0xa4, 0xb8, 0xd6, 0xa1, 0x40, 0xd8, 0x86, 0x55, - 0xd5, 0xdd, 0x1d, 0xfc, 0x9c, 0x38, 0xe9, 0x41, 0xff, 0x71, 0x0c, 0xfd, - 0x93, 0x40, 0xf0, 0x96, 0x44, 0x93, 0x5c, 0x29, 0x46, 0x89, 0xae, 0xe7, - 0x72, 0xda, 0xa4, 0x64, 0x87, 0x96, 0x58, 0xcd, 0xa4, 0x65, 0x7e, 0x8f, - 0xfd, 0x09, 0x38, 0xaf, 0x7a, 0x74, 0xb3, 0x95, 0xd5, 0x79, 0x76, 0xe2, - 0x1e, 0x5b, 0xef, 0xa0, 0xd5, 0x3e, 0xdb, 0xa4, 0x1c, 0xb2, 0xa9, 0x70, - 0xe2, 0x51, 0xe5, 0x02, 0x70, 0xb8, 0xba, 0x26, 0x24, 0x41, 0x90, 0x53, - 0xcd, 0xf4, 0x79, 0x7c, 0x9d, 0xff, 0x04, 0xb0, 0x39, 0xd0, 0x36, 0x3e, - 0x06, 0x5d, 0x46, 0x63, 0x86, 0xf5, 0xf6, 0xaa, 0xa1, 0x72, 0xe5, 0x16, - 0x14, 0xf4, 0x5c, 0xb8, 0x57, 0x0f, 0x2b, 0x20, 0xbc, 0xa9, 0x82, 0x5d, - 0x01, 0x6c, 0xc5, 0xa6, 0x0c, 0x94, 0xf7, 0x64, 0x95, 0xc7, 0x89, 0xc8, - 0xa1, 0xef, 0x6a, 0xd4, 0xf7, 0xa4, 0x18, 0x6b, 0x93, 0x71, 0x28, 0x18, - 0x54, 0x6a, 0x36, 0xa3, 0xa9, 0xf3, 0x6f, 0x27, 0x9a, 0x5d, 0xc7, 0x75, - 0x96, 0x4d, 0x04, 0x47, 0xa6, 0xa5, 0x35, 0x8f, 0x4f, 0x8f, 0xe1, 0xad, - 0x6b, 0xda, 0xb7, 0x1b, 0xe8, 0x56, 0xe9, 0x11, 0x05, 0x11, 0xcd, 0xba, - 0x79, 0xaa, 0x1b, 0xfa, 0x0d, 0x1d, 0x80, 0xe4, 0xfd, 0x36, 0x21, 0xc4, - 0x6a, 0x03, 0xa6, 0xf9, 0x21, 0x48, 0x57, 0x3e, 0x29, 0x8a, 0xd8, 0xaf, - 0xed, 0x72, 0xa5, 0xc1, 0x34, 0xb9, 0x66, 0x5f, 0x8b, 0x76, 0x1b, 0xa1, - 0x12, 0xf0, 0xc4, 0xb5, 0x0c, 0x8e, 0x17, 0x31, 0xe3, 0xcb, 0x2f, 0x2c, - 0x7b, 0xff, 0x14, 0xde, 0x31, 0x0d, 0x62, 0x41, 0x54, 0xe7, 0x95, 0xb4, - 0xa6, 0x8d, 0x84, 0x05, 0xef, 0x8b, 0xac, 0x47, 0x83, 0x82, 0x06, 0xf6, - 0x5b, 0xe2, 0x08, 0x6a, 0x76, 0xc2, 0x79, 0x28, 0xa7, 0xdb, 0x70, 0x26, - 0x6f, 0x94, 0xc8, 0x9e, 0xd7, 0x0a, 0xb3, 0x1f, 0xfd, 0x83, 0xfe, 0xd6, - 0x18, 0x49, 0xf8, 0x6c, 0x9b, 0xb1, 0xa9, 0xf8, 0x90, 0x24, 0x00, 0xe1, - 0xba, 0x59, 0x06, 0x9f, 0x52, 0x0b, 0x77, 0x5b, 0xc5, 0xe8, 0x0a, 0x62, - 0x0c, 0x24, 0x31, 0x34, 0x8b, 0xce, 0x0f, 0xbc, 0x42, 0xe4, 0xee, 0x7c, - 0xfa, 0xbc, 0xee, 0x86, 0xee, 0x8d, 0x13, 0x29, 0xe4, 0x15, 0xe3, 0x30, - 0x21, 0x99, 0xf5, 0xda, 0x4b, 0xbd, 0x95, 0x98, 0x54, 0x16, 0x20, 0x19, - 0x6c, 0xb4, 0x52, 0xe9, 0xc2, 0xfa, 0xeb, 0xdc, 0x76, 0xf2, 0x9c, 0x7a, - 0xbf, 0x5e, 0x97, 0xe4, 0x17, 0x66, 0xd9, 0x89, 0xc6, 0xb9, 0xf6, 0x34, - 0x45, 0xa4, 0x59, 0x3c, 0x80, 0x13, 0x40, 0x70, 0x11, 0xe1, 0x2f, 0xef, - 0xc7, 0xd4, 0x7b, 0xce, 0xae, 0x93, 0xa4, 0xd7, 0xf8, 0xd3, 0x36, 0x20, - 0xe0, 0x1d, 0x56, 0xf5, 0x66, 0x4e, 0x3e, 0xdb, 0x32, 0xed, 0xfe, 0xe9, - 0xd4, 0x7d, 0x07, 0x71, 0xcf, 0x0e, 0x59, 0x62, 0x48, 0xc4, 0x2c, 0x9e, - 0x4c, 0x67, 0x37, 0xcd, 0xee, 0xa9, 0x26, 0x8e, 0x96, 0x3f, 0x61, 0x76, - 0xe6, 0xee, 0x5d, 0xc5, 0xb4, 0x77, 0x23, 0x2c, 0xdf, 0x7d, 0xa2, 0x24, - 0x1d, 0x36, 0x5e, 0x0e, 0xb3, 0x76, 0xec, 0x57, 0xa8, 0xbf, 0xf6, 0x36, - 0xbe, 0x5c, 0x63, 0x1d, 0xda, 0x18, 0x32, 0x8f, 0x31, 0x7a, 0xa9, 0x95, - 0x01, 0x3f, 0xf1, 0x16, 0x94, 0x95, 0xdd, 0x1c, 0x24, 0xf1, 0x1b, 0x04, - 0x53, 0x07, 0xe0, 0x28, 0x6b, 0x7a, 0xbf, 0x45, 0x75, 0x0e, 0x60, 0x7e, - 0x5c, 0x38, 0xd5, 0xfb, 0x79, 0xf7, 0xce, 0x32, 0x3e, 0x2b, 0x49, 0xae, - 0xd2, 0xdb, 0xbb, 0xd2, 0x3f, 0x47, 0xac, 0x75, 0x6b, 0x8c, 0x30, 0xf8, - 0xb5, 0xef, 0x87, 0x56, 0xd3, 0x0f, 0xa7, 0xae, 0xf4, 0x13, 0x0b, 0xbb, - 0xdf, 0xdf, 0x35, 0x68, 0x06, 0x4c, 0xcd, 0xe2, 0xce, 0xa9, 0xcb, 0x90, - 0x9f, 0x47, 0xad, 0xaa, 0x7a, 0x3f, 0xe0, 0x2f, 0x5a, 0xf0, 0xdc, 0xc0, - 0x03, 0xc8, 0x8e, 0x78, 0x2f, 0x7a, 0xd3, 0x14, 0x3c, 0x54, 0x64, 0xdb, - 0x11, 0x41, 0x46, 0x96, 0xad, 0xfc, 0x5e, 0xad, 0xa8, 0xf7, 0x8b, 0x8b, - 0xff, 0xdc, 0x94, 0xa7, 0x0a, 0xb9, 0x2c, 0x43, 0xea, 0x26, 0xd1, 0x6d, - 0xe0, 0xed, 0xd3, 0x8d, 0xbf, 0x36, 0x12, 0xfa, 0x9a, 0x60, 0x61, 0x63, - 0xa7, 0x7e, 0xab, 0xb4, 0x63, 0xa2, 0x52, 0x48, 0x57, 0x58, 0xfb, 0x23, - 0x92, 0x15, 0xf4, 0x87, 0x72, 0x88, 0x6e, 0x14, 0xca, 0xc1, 0x8c, 0x6d, - 0xdd, 0x38, 0xcc, 0x75, 0x44, 0x72, 0x53, 0xb2, 0x90, 0x80, 0x08, 0xd5, - 0x95, 0xa8, 0xdb, 0xa3, 0xb8, 0x19, 0x79, 0x1f, 0x15, 0x30, 0x98, 0x99, - 0xf3, 0x59, 0x11, 0x3f, 0x29, 0x7b, 0xc4, 0x0c, 0x29, 0x9e, 0x1f, 0x24, - 0x1f, 0xd4, 0xc6, 0xa0, 0x7e, 0x1d, 0xe2, 0xdb, 0x60, 0xb7, 0x19, 0x23, - 0x28, 0x8b, 0x85, 0xb3, 0xea, 0x34, 0xb9, 0xeb, 0xb7, 0x1e, 0x29, 0x6a, - 0xd5, 0x72, 0xc7, 0xaf, 0x30, 0xbd, 0x12, 0xb3, 0x39, 0xb3, 0x1f, 0xd0, - 0xf6, 0x43, 0x7a, 0x62, 0x6c, 0x36, 0xe7, 0xf9, 0x74, 0x2a, 0x2d, 0x25, - 0x11, 0x6e, 0x22, 0x6c, 0xfe, 0x32, 0x0a, 0xd7, 0x44, 0x67, 0x9e, 0x30, - 0x40, 0x1f, 0x6a, 0x4a, 0xe6, 0x90, 0x2f, 0xe4, 0xd4, 0xaf, 0x87, 0x20, - 0x9a, 0x25, 0xdd, 0x39, 0x02, 0x7e, 0x7e, 0x1b, 0x14, 0xce, 0x7a, 0x11, - 0x0b, 0x32, 0x53, 0xd7, 0x7b, 0x56, 0x6f, 0xed, 0x53, 0x1c, 0x2d, 0xb6, - 0x23, 0x32, 0xfe, 0xd3, 0xe3, 0x08, 0x2b, 0xc4, 0x8e, 0x3d, 0x84, 0x0e, - 0x87, 0xa9, 0x05, 0x4c, 0x66, 0x8d, 0x4b, 0xa7, 0xa8, 0x97, 0x54, 0x75, - 0xf5, 0xe6, 0x9e, 0x68, 0xbe, 0xa6, 0x57, 0x88, 0x6a, 0xca, 0xee, 0x15, - 0xb9, 0x6a, 0x9a, 0xf8, 0x2e, 0x2e, 0xda, 0xb0, 0x3f, 0x01, 0xad, 0xb1, - 0xaa, 0xa2, 0x2a, 0xef, 0x99, 0x9d, 0x75, 0x54, 0x40, 0xd9, 0xf1, 0xfe, - 0x14, 0xb4, 0xf3, 0x16, 0x6e, 0x0b, 0x49, 0x41, 0xad, 0xc2, 0xd5, 0x59, - 0x69, 0xbc, 0xe5, 0xb9, 0x87, 0x6f, 0x6f, 0xf3, 0xeb, 0x92, 0xf9, 0x63, - 0xf4, 0x65, 0x20, 0x3e, 0x19, 0xa1, 0x8d, 0x33, 0x19, 0xa7, 0x5a, 0xf6, - 0xcd, 0x06, 0x6d, 0x7f, 0xbf, 0xbe, 0xfc, 0xba, 0x96, 0xf5, 0xb8, 0x44, - 0x94, 0x6c, 0x8e, 0xda, 0x1e, 0xad, 0xd1, 0xce, 0xca, 0x5c, 0x81, 0x00, - 0x4a, 0xe4, 0xb8, 0x19, 0xbd, 0x5b, 0x72, 0x42, 0x95, 0xfa, 0x82, 0x3d, - 0x9b, 0xd6, 0x82, 0x09, 0x84, 0x82, 0xab, 0xd7, 0xc3, 0x13, 0x5f, 0xe4, - 0x70, 0x54, 0x4a, 0x93, 0xcd, 0x70, 0x5b, 0xe4, 0x2b, 0x5e, 0x15, 0x26, - 0x70, 0xbe, 0xef, 0x20, 0x87, 0x5e, 0xdb, 0xd1, 0x43, 0x10, 0x1c, 0xfb, - 0x0e, 0x5f, 0x48, 0x44, 0x3e, 0xf0, 0x76, 0x4e, 0x34, 0x41, 0x16, 0x14, - 0xde, 0xac, 0x64, 0x1d, 0x47, 0x97, 0x38, 0x1a, 0xa6, 0xeb, 0xe9, 0x64, - 0x9f, 0xb0, 0x6c, 0xe5, 0x16, 0xe4, 0x7c, 0xbc, 0xf0, 0x98, 0xfd, 0xd8, - 0x70, 0x9f, 0x8f, 0xce, 0xbf, 0x9d, 0xc4, 0xad, 0x7c, 0x7b, 0x86, 0x09, - 0x60, 0x9d, 0x9f, 0xd4, 0x89, 0x01, 0xa0, 0x6f, 0x54, 0xe9, 0xbb, 0x21, - 0x96, 0xf7, 0xb6, 0x1e, 0x6d, 0xc8, 0x88, 0xb2, 0x1b, 0x9a, 0xbc, 0x23, - 0x9f, 0x23, 0x2e, 0x13, 0x6e, 0x11, 0x70, 0xc3, 0x2c, 0xc5, 0x79, 0xa6, - 0x60, 0x76, 0x4a, 0xe4, 0xc7, 0xe2, 0xca, 0xce, 0x57, 0x8f, 0x4a, 0x04, - 0x23, 0x49, 0x67, 0xd6, 0x12, 0x29, 0x0a, 0x79, 0x97, 0xc4, 0x40, 0xb2, - 0x6d, 0xf7, 0x2e, 0xab, 0xb8, 0xd2, 0x2f, 0x5f, 0x07, 0xbb, 0x51, 0x73, - 0x1e, 0x29, 0x0f, 0xf8, 0x41, 0x62, 0x8c, 0x9c, 0xe4, 0xe7, 0x87, 0x6f, - 0x09, 0x3b, 0x67, 0xcf, 0x08, 0x61, 0xc3, 0x47, 0xf9, 0xb3, 0x45, 0xde, - 0x4c, 0x88, 0x34, 0xca, 0xa1, 0x2f, 0x9e, 0x1e, 0xbf, 0x3f, 0xc8, 0xc9, - 0x66, 0x41, 0xd9, 0xc9, 0x2a, 0x97, 0x17, 0xb7, 0x93, 0xd6, 0xc7, 0x9e, - 0x37, 0x74, 0x46, 0x49, 0x8b, 0xdb, 0xca, 0x80, 0x43, 0xd5, 0x17, 0xf2, - 0x46, 0x0e, 0x7a, 0xa7, 0x02, 0x50, 0xff, 0x30, 0xec, 0xf4, 0x07, 0xbf, - 0x73, 0xe3, 0xd6, 0xc8, 0x29, 0x51, 0x17, 0x0f, 0x16, 0xad, 0xb4, 0x0a, - 0x67, 0x7e, 0xde, 0x7b, 0x61, 0xfa, 0xa2, 0xd2, 0x09, 0xa1, 0x2f, 0x8b, - 0x4a, 0x0c, 0x0c, 0x60, 0x79, 0xd8, 0x97, 0xb3, 0xe9, 0x0d, 0xc3, 0xb3, - 0x91, 0x9e, 0xe6, 0x8a, 0x03, 0x9b, 0x57, 0x48, 0x02, 0x73, 0x36, 0x92, - 0xfe, 0xf0, 0xe0, 0x96, 0x0d, 0xe3, 0x4a, 0x19, 0x0d, 0x44, 0xb3, 0x69, - 0xc5, 0xa9, 0x0d, 0x91, 0xee, 0x1c, 0x1b, 0x50, 0x2a, 0x45, 0x38, 0x07, - 0x0c, 0x0f, 0x17, 0xe9, 0x40, 0xea, 0xe4, 0x64, 0x89, 0x35, 0xd5, 0x24, - 0x03, 0xa7, 0x84, 0x44, 0xac, 0xca, 0x74, 0xcc, 0xc7, 0x04, 0x73, 0x4c, - 0xa3, 0xdb, 0xd0, 0x76, 0x9f, 0xb6, 0x73, 0xb7, 0xc0, 0x14, 0x61, 0x2b, - 0x28, 0xc5, 0xe3, 0x3a, 0x1e, 0x3c, 0x42, 0xd9, 0xea, 0xd4, 0xfa, 0xf4, - 0x85, 0xd8, 0x9a, 0xfc, 0x48, 0xd0, 0xd4, 0x7a, 0x48, 0xa3, 0x68, 0x26, - 0x71, 0x84, 0xa3, 0xd5, 0xaf, 0xc3, 0x2f, 0x97, 0x89, 0xa8, 0x4c, 0x82, - 0x00, 0x53, 0x93, 0x02, 0x9d, 0xd6, 0xa1, 0x7a, 0xc5, 0x06, 0x8f, 0xe9, - 0x01, 0x33, 0xf4, 0x9f, 0x8f, 0xb8, 0x85, 0xd4, 0xa1, 0x1f, 0x37, 0x00, - 0xca, 0xee, 0x34, 0xbc, 0x29, 0x67, 0x02, 0xd6, 0xf9, 0x93, 0x9f, 0x1b, - 0xcd, 0xa4, 0x6e, 0x56, 0xd1, 0xea, 0xe1, 0x64, 0xcc, 0xde, 0x98, 0xa2, - 0x9f, 0xa4, 0x06, 0x1b, 0xde, 0xb0, 0x07, 0x0e, 0x94, 0x29, 0x11, 0x2c, - 0xc0, 0xe9, 0x83, 0x69, 0x81, 0x09, 0x86, 0x08, 0x10, 0x36, 0x22, 0xb0, - 0xa1, 0x0f, 0x07, 0x2a, 0x72, 0x9f, 0xf1, 0x9c, 0x67, 0x46, 0x18, 0xc1, - 0x01, 0xed, 0x01, 0xda, 0x94, 0x40, 0xfb, 0x88, 0x65, 0xc3, 0xe2, 0x10, - 0x58, 0xcb, 0x89, 0xcc, 0x87, 0xfd, 0xa2, 0x23, 0x7d, 0xb4, 0xf5, 0x46, - 0x88, 0xa9, 0x33, 0x2f, 0x04, 0x43, 0xe7, 0x45, 0xad, 0xda, 0x96, 0xc5, - 0xe0, 0xea, 0xdd, 0x90, 0x25, 0xe1, 0xf2, 0x8a, 0x53, 0x58, 0x7c, 0x58, - 0x8c, 0x59, 0xe2, 0xf4, 0x42, 0x5e, 0x32, 0xcc, 0x69, 0x1d, 0x4c, 0x2e, - 0xd2, 0x0b, 0x7c, 0x96, 0x5c, 0x71, 0x44, 0x24, 0x49, 0x3a, 0x2b, 0x27, - 0xc6, 0x6a, 0x0f, 0x5b, 0x2a, 0x9e, 0x07, 0x3f, 0x84, 0xeb, 0x2c, 0x77, - 0xcc, 0x76, 0xb2, 0x10, 0x1f, 0xbc, 0xfa, 0xe8, 0x2e, 0xa7, 0xc6, 0xfd, - 0x20, 0x0a, 0xe3, 0xff, 0x2c, 0x4d, 0x4c, 0x8d, 0x16, 0x18, 0xc6, 0x50, - 0xfd, 0x33, 0x22, 0x3e, 0xe0, 0x1b, 0xc1, 0xa8, 0x17, 0xae, 0xe9, 0x15, - 0x25, 0xae, 0xba, 0x45, 0xc1, 0xc5, 0xfd, 0xf3, 0x2f, 0x50, 0xd8, 0x15, - 0xe8, 0x53, 0x66, 0x5d, 0xf5, 0x3d, 0xf1, 0x64, 0x8a, 0x3a, 0x0c, 0x72, - 0xc4, 0x7c, 0x52, 0x33, 0x44, 0xfb, 0x9e, 0xb7, 0xd9, 0xbf, 0xcb, 0x8f, - 0xaf, 0x08, 0x8a, 0xc1, 0x94, 0x52, 0xaa, 0xfe, 0xf4, 0x1f, 0xb7, 0xeb, - 0xbe, 0x64, 0x89, 0x88, 0x30, 0xd2, 0x61, 0x17, 0x41, 0x1c, 0xa1, 0x92, - 0x40, 0x61, 0x53, 0x9c, 0xa2, 0x82, 0x4e, 0x92, 0xbb, 0x62, 0x02, 0xc8, - 0x4d, 0xaf, 0xbc, 0xf8, 0xd1, 0x7d, 0x43, 0x20, 0xfc, 0x22, 0xe1, 0x80, - 0xc4, 0x5f, 0x2f, 0xcd, 0xf8, 0xee, 0x7a, 0x64, 0x12, 0x65, 0x77, 0x64, - 0xf3, 0xb1, 0x69, 0x23, 0x67, 0x5f, 0x61, 0x16, 0xa2, 0xee, 0x3d, 0x6a, - 0xe0, 0xfd, 0x75, 0x1a, 0xc4, 0x5e, 0xb9, 0x19, 0xfe, 0xf3, 0xba, 0x76, - 0x3d, 0x61, 0x64, 0xaf, 0xd3, 0x93, 0x45, 0x1a, 0x8a, 0xc6, 0xb1, 0x16, - 0x3e, 0x10, 0x6b, 0x4c, 0x8b, 0x35, 0x5b, 0x33, 0x1d, 0xca, 0x23, 0xd5, - 0xf4, 0x99, 0xf3, 0xd8, 0x53, 0x89, 0x1b, 0x83, 0x7b, 0xec, 0xee, 0xb4, - 0x46, 0x72, 0x16, 0x74, 0x01, 0x47, 0x78, 0x9a, 0xfd, 0x78, 0xbd, 0xb7, - 0x26, 0x34, 0xd0, 0xa1, 0x7a, 0xe5, 0x9e, 0x0c, 0xe0, 0xa5, 0xcd, 0xc0, - 0xda, 0x7a, 0xbd, 0xdf, 0x56, 0x7d, 0x41, 0x2a, 0xa4, 0xeb, 0x3a, 0xd2, - 0xfa, 0xdc, 0xc3, 0x5e, 0xf6, 0x8a, 0xee, 0x18, 0x22, 0xc8, 0x6f, 0x38, - 0x1b, 0x58, 0x41, 0x03, 0x0f, 0x26, 0x68, 0xe8, 0x20, 0x43, 0x44, 0x2a, - 0x8b, 0x7e, 0x6e, 0xa9, 0xf8, 0x19, 0x38, 0xbe, 0xc8, 0x61, 0x9b, 0x51, - 0x96, 0x6e, 0x3c, 0xbd, 0x38, 0x60, 0xdd, 0x84, 0x14, 0x88, 0x9f, 0x82, - 0x91, 0x0b, 0x5f, 0x5c, 0x45, 0xba, 0x35, 0x1e, 0x69, 0x53, 0x01, 0x1f, - 0x1d, 0x82, 0xb5, 0xf0, 0x09, 0x93, 0xe0, 0x16, 0x63, 0xfa, 0x8a, 0x7b, - 0x17, 0x40, 0x48, 0x84, 0x64, 0x52, 0xe9, 0x40, 0x47, 0xf2, 0xae, 0x85, - 0x1f, 0xcf, 0x6c, 0x86, 0xc9, 0x9e, 0xa3, 0x46, 0xd6, 0x03, 0xb3, 0x84, - 0x13, 0xef, 0x16, 0xbf, 0xa9, 0xdd, 0x15, 0xa4, 0x74, 0xe8, 0x99, 0x11, - 0x27, 0xb6, 0xb2, 0x3a, 0xec, 0x85, 0x9b, 0xa0, 0x08, 0x42, 0x02, 0x27, - 0x01, 0x3d, 0x2d, 0x2d, 0x4b, 0x86, 0x72, 0x19, 0x6b, 0xec, 0x91, 0x06, - 0xd1, 0xe8, 0x9e, 0xe2, 0x1b, 0x31, 0x7d, 0x2d, 0xb8, 0xa2, 0x4b, 0x59, - 0x62, 0x16, 0x5e, 0x44, 0x76, 0xa1, 0x19, 0x5d, 0x0a, 0xb3, 0xd6, 0x33, - 0xc9, 0x39, 0x69, 0xe4, 0x8a, 0x0e, 0xa8, 0xc5, 0x84, 0x3b, 0x3a, 0xfb, - 0x21, 0x3f, 0x64, 0x68, 0x26, 0x39, 0x62, 0x05, 0x70, 0xef, 0xa1, 0x0f, - 0x0b, 0x3a, 0xe3, 0xdb, 0x46, 0xad, 0x8e, 0x76, 0x3c, 0xd4, 0x32, 0x00, - 0xf8, 0xb4, 0x3c, 0x0a, 0xde, 0x8e, 0xe2, 0x76, 0x98, 0x5b, 0xe0, 0x00, - 0x57, 0x03, 0x63, 0xba, 0x9b, 0x46, 0x8d, 0xd1, 0xa7, 0x44, 0xb4, 0xef, - 0x4e, 0xcc, 0xfb, 0x0f, 0x7c, 0x67, 0x46, 0x57, 0x2f, 0x1e, 0x70, 0x46, - 0xc3, 0x35, 0xba, 0xf8, 0xff, 0x21, 0xd6, 0x69, 0x75, 0x5b, 0x46, 0xb1, - 0x92, 0xd7, 0x8d, 0x70, 0x38, 0x46, 0x5d, 0x29, 0xa0, 0xf3, 0x20, 0xc4, - 0x6b, 0x3a, 0x13, 0xcf, 0xaf, 0xf4, 0x8b, 0x81, 0xe3, 0xd7, 0x94, 0xfb, - 0x4e, 0x09, 0x00, 0xbf, 0x4c, 0x41, 0x51, 0x02, 0x74, 0x3c, 0x6a, 0xbd, - 0x29, 0x5b, 0x03, 0x1d, 0x54, 0xc4, 0x24, 0x69, 0x08, 0xbf, 0x72, 0xf6, - 0xdd, 0x58, 0x9c, 0x38, 0xa2, 0x16, 0xe0, 0x06, 0x6d, 0x95, 0x97, 0xb5, - 0x69, 0x39, 0x21, 0xec, 0xf2, 0x8e, 0x49, 0x3e, 0x48, 0xb7, 0xbe, 0xe0, - 0xf6, 0x6a, 0xfc, 0x85, 0xdf, 0x12, 0x1d, 0x4d, 0x8d, 0xc4, 0x9d, 0xc8, - 0xc0, 0xe0, 0xb8, 0xa6, 0x2a, 0xa4, 0xd4, 0x25, 0xa7, 0x9c, 0x67, 0x5f, - 0x69, 0x4f, 0xdc, 0x7d, 0xdc, 0x93, 0xb4, 0xef, 0x78, 0xab, 0x0f, 0xc1, - 0x10, 0xe6, 0x4d, 0xa8, 0x32, 0xc7, 0xfa, 0xf9, 0x1b, 0x2f, 0xb2, 0x98, - 0x68, 0xf4, 0x58, 0x86, 0x8d, 0xf2, 0xb4, 0xbb, 0x63, 0x36, 0xc1, 0x37, - 0x7c, 0x3c, 0x5a, 0x0b, 0xb6, 0x84, 0xd4, 0x60, 0xac, 0x03, 0x47, 0xf2, - 0x6a, 0xbc, 0x1e, 0xb3, 0x84, 0x78, 0x4d, 0xca, 0x89, 0x4d, 0x53, 0xac, - 0x96, 0x4f, 0x17, 0x5b, 0xd3, 0xa3, 0xd7, 0x5d, 0x70, 0xcf, 0x66, 0x7e, - 0x21, 0x43, 0xc8, 0x04, 0x6c, 0x7a, 0x39, 0xd1, 0xe4, 0x04, 0x29, 0xbe, - 0xca, 0xe7, 0x4b, 0xe1, 0x6b, 0xfa, 0xbb, 0x06, 0xa6, 0x9c, 0x1f, 0xed, - 0xbb, 0x5d, 0xca, 0x1f, 0x44, 0x12, 0x72, 0x68, 0x3d, 0x47, 0x88, 0xfe, - 0xac, 0x0b, 0x54, 0x4a, 0xd4, 0x9d, 0x5e, 0x45, 0xe6, 0x31, 0x98, 0x00, - 0x40, 0x86, 0x25, 0x05, 0x50, 0x3b, 0x5f, 0xa1, 0x95, 0x17, 0x06, 0xc6, - 0x4d, 0xf1, 0x84, 0xc6, 0x26, 0xb2, 0xdc, 0x4d, 0x94, 0x2c, 0x58, 0x06, - 0x20, 0xd4, 0x03, 0xa5, 0x1b, 0x55, 0x05, 0x35, 0xc6, 0x22, 0x2d, 0x1d, - 0xb1, 0x18, 0x06, 0x7c, 0x01, 0x4a, 0xe9, 0x6b, 0xa0, 0x72, 0x40, 0x6f, - 0x33, 0xe0, 0xc0, 0xa7, 0xc7, 0x36, 0xd7, 0x02, 0x02, 0xfa, 0x52, 0xb1, - 0x8a, 0x2c, 0xb6, 0x36, 0x94, 0x42, 0xa0, 0xfd, 0xba, 0x9a, 0xaa, 0xe9, - 0x96, 0x7a, 0xc9, 0xe6, 0x22, 0xbc, 0xe4, 0x51, 0xf3, 0xd4, 0xe9, 0x43, - 0x5b, 0x85, 0xa9, 0x82, 0x39, 0xfe, 0xe0, 0x34, 0xca, 0x08, 0xcf, 0xfa, - 0xc7, 0x93, 0xa8, 0x65, 0x22, 0xbb, 0x64, 0x9d, 0x29, 0xea, 0x22, 0xc1, - 0xe0, 0x75, 0xfe, 0x6b, 0x91, 0x9b, 0x23, 0xac, 0x2c, 0xd9, 0xe1, 0x2b, - 0xbb, 0xbf, 0xa8, 0x98, 0x07, 0x89, 0x36, 0x7d, 0xc5, 0x20, 0x0b, 0xc5, - 0xd4, 0x9a, 0xe8, 0x6d, 0x5f, 0x46, 0x94, 0x40, 0x19, 0x04, 0xd9, 0x3b, - 0x81, 0x3e, 0x68, 0x2a, 0x57, 0x2e, 0xe9, 0xe3, 0xd0, 0x0f, 0x73, 0xd5, - 0x48, 0x8b, 0xcf, 0xa6, 0x89, 0x50, 0x7a, 0xa3, 0xde, 0x97, 0xa8, 0xaa, - 0x93, 0xe4, 0xbd, 0xd5, 0x14, 0x23, 0x16, 0x02, 0xac, 0x8c, 0xe5, 0x8b, - 0x1b, 0x78, 0xb2, 0xe4, 0x4f, 0x54, 0x5d, 0x58, 0x3d, 0x45, 0xaa, 0xb3, - 0xce, 0xe8, 0xf9, 0x28, 0xd1, 0x36, 0xe1, 0x83, 0x12, 0xf3, 0x27, 0xb4, - 0xbb, 0xab, 0xbf, 0x4d, 0x7c, 0x27, 0x5f, 0x50, 0x5f, 0x1d, 0x45, 0x66, - 0x06, 0x15, 0xda, 0x3b, 0xe9, 0x4e, 0x45, 0xf2, 0x18, 0x17, 0x52, 0x17, - 0x10, 0xca, 0x77, 0x80, 0xb6, 0x55, 0xcb, 0xc1, 0xd8, 0xf6, 0xfc, 0xac, - 0x64, 0x17, 0x09, 0x18, 0x57, 0x01, 0xc3, 0xfb, 0x3f, 0xd4, 0x37, 0x22, - 0xe2, 0x0a, 0x39, 0x87, 0x9f, 0x9c, 0x5e, 0x6b, 0x46, 0x6e, 0x40, 0xd8, - 0x51, 0xcd, 0xc7, 0x73, 0x76, 0x10, 0x9f, 0x28, 0x37, 0x4e, 0xaa, 0xdd, - 0xb0, 0xc9, 0x2e, 0xc6, 0x9e, 0x5e, 0xed, 0x91, 0x88, 0x05, 0xd3, 0xfa, - 0x34, 0x32, 0x20, 0xb5, 0x44, 0xe2, 0x7b, 0xda, 0x07, 0xcd, 0xc9, 0xac, - 0x55, 0xa7, 0x51, 0xaf, 0x59, 0x08, 0xb7, 0xa8, 0xfc, 0xbe, 0xdb, 0x22, - 0xcc, 0xa3, 0xa9, 0xeb, 0xd0, 0x04, 0xea, 0x35, 0x66, 0x0b, 0x5a, 0x5e, - 0x59, 0x49, 0xfe, 0xe6, 0xad, 0x2c, 0x76, 0x1d, 0x1c, 0xbd, 0xa3, 0x83, - 0x03, 0x40, 0xc9, 0x2a, 0x7d, 0xee, 0x8a, 0x9e, 0x92, 0x51, 0x32, 0x13, - 0xe2, 0x67, 0xba, 0xa5, 0x62, 0x37, 0x59, 0xa0, 0xc8, 0x1c, 0x97, 0x03, - 0xa9, 0xdb, 0x5b, 0x4a, 0x55, 0x54, 0xd1, 0xe0, 0xa1, 0xfe, 0x8d, 0x74, - 0x4a, 0x6f, 0xe2, 0xcc, 0x66, 0xbd, 0x44, 0xc8, 0x28, 0x52, 0x48, 0xa3, - 0x28, 0xad, 0xd8, 0xab, 0x2f, 0xee, 0x05, 0x9e, 0x54, 0xe9, 0xf7, 0x7b, - 0x84, 0xd2, 0xe9, 0x94, 0x0a, 0x98, 0x6d, 0x11, 0x0e, 0xf5, 0x16, 0xbc, - 0x2a, 0x8b, 0xb0, 0x9b, 0x8a, 0xb1, 0x86, 0xcd, 0x32, 0xe8, 0x7f, 0x0e, - 0x69, 0x50, 0x54, 0x5b, 0x2f, 0x02, 0x91, 0x3f, 0x1b, 0xb3, 0x78, 0xa2, - 0x6f, 0xc9, 0x59, 0x39, 0xce, 0x59, 0x75, 0xbf, 0x4a, 0x87, 0x8a, 0x54, - 0xb2, 0x55, 0xb5, 0xe9, 0x27, 0x34, 0x59, 0x3c, 0x1f, 0x06, 0x87, 0x13, - 0xf3, 0x6d, 0xb1, 0x72, 0x38, 0x0a, 0x4c, 0xe3, 0x18, 0x2d, 0xd4, 0x40, - 0x4e, 0x2a, 0xf0, 0xe1, 0xc6, 0xaa, 0x2c, 0x39, 0x31, 0x8c, 0xb3, 0x88, - 0xbc, 0x2e, 0x2c, 0x34, 0xec, 0x2b, 0x5d, 0xca, 0x07, 0xca, 0x94, 0x1b, - 0xbc, 0xf3, 0x80, 0xb3, 0x35, 0xac, 0xd5, 0x50, 0xd2, 0x4d, 0xc2, 0x73, - 0x19, 0x27, 0x50, 0xab, 0x37, 0x09, 0x55, 0xbf, 0x9e, 0x8e, 0xed, 0x7b, - 0x1b, 0xb5, 0x3d, 0x4a, 0x4b, 0x50, 0x1b, 0xd8, 0x13, 0xa6, 0x72, 0x8a, - 0xd2, 0x49, 0x44, 0x47, 0x99, 0xf5, 0xca, 0xac, 0xb4, 0x61, 0x08, 0xc2, - 0x97, 0x6c, 0x2b, 0x54, 0xcd, 0xf9, 0x51, 0xfc, 0x26, 0xba, 0x94, 0xad, - 0x11, 0x3a, 0xd4, 0xad, 0x49, 0xf8, 0x46, 0x37, 0xb9, 0xe9, 0xf2, 0x58, - 0xfa, 0x9b, 0x5c, 0x53, 0xaa, 0xc9, 0xcf, 0xd8, 0xc0, 0x50, 0xdc, 0x31, - 0x25, 0x3f, 0x5a, 0x00, 0x58, 0x11, 0x0f, 0x4c, 0xaf, 0x17, 0x91, 0xe3, - 0x64, 0x16, 0xb1, 0x90, 0x02, 0xb5, 0x92, 0x7a, 0x1e, 0x5f, 0xa2, 0xf1, - 0x16, 0x98, 0x00, 0xa7, 0xe5, 0x5f, 0xc4, 0x6b, 0x78, 0x9c, 0xb4, 0x4f, - 0xbe, 0x24, 0x0d, 0xa3, 0x0a, 0xfb, 0x8b, 0x68, 0xc8, 0x57, 0x16, 0xfc, - 0x49, 0x29, 0x47, 0x34, 0x8e, 0x47, 0x61, 0x2f, 0xd4, 0x25, 0xb6, 0x54, - 0x8d, 0xbe, 0x28, 0x9b, 0xcc, 0x3c, 0x9b, 0x8e, 0x2a, 0x21, 0x9d, 0x24, - 0x4d, 0xca, 0xae, 0xa3, 0x16, 0x9d, 0x33, 0xdc, 0x1f, 0x44, 0x2a, 0x5f, - 0x3c, 0x2b, 0x1f, 0x03, 0x12, 0x28, 0x7a, 0x01, 0xb2, 0x6c, 0xcb, 0x49, - 0x59, 0xf1, 0xd8, 0xc8, 0x1a, 0x23, 0x47, 0x8b, 0xce, 0x5f, 0x74, 0xe6, - 0xce, 0x74, 0x6a, 0xc7, 0xbc, 0x43, 0x13, 0xd0, 0x51, 0x2f, 0x19, 0x1e, - 0x86, 0xc1, 0x0f, 0x1e, 0x3b, 0xc5, 0x5e, 0x7a, 0x1c, 0x7b, 0x07, 0xb8, - 0x34, 0x3d, 0x72, 0xdf, 0x78, 0x62, 0x03, 0xbd, 0x3c, 0x93, 0x54, 0xf9, - 0x8f, 0x64, 0xe1, 0x5e, 0x56, 0x91, 0xce, 0xec, 0x9c, 0xd2, 0xda, 0xeb, - 0xf8, 0x21, 0x9a, 0x17, 0xb1, 0x15, 0xdb, 0xd7, 0xc0, 0x2e, 0xa2, 0xbb, - 0x8e, 0xc6, 0x25, 0x29, 0xee, 0x23, 0xc9, 0x16, 0xe8, 0x73, 0x52, 0x8f, - 0x56, 0xbf, 0x45, 0xce, 0x89, 0x35, 0x19, 0x4e, 0x23, 0x36, 0x75, 0xf4, - 0xa1, 0xb5, 0xdd, 0x05, 0x84, 0x17, 0x68, 0x4a, 0x5f, 0x8e, 0x14, 0x9a, - 0x3a, 0x03, 0x8e, 0x78, 0x21, 0x17, 0x4a, 0xa9, 0x37, 0x8e, 0x0f, 0x02, - 0xe1, 0x43, 0x56, 0x7b, 0x93, 0x23, 0x7a, 0x7e, 0x78, 0xcd, 0x0a, 0xbe, - 0x9d, 0x3a, 0x25, 0x71, 0xff, 0x09, 0x63, 0x23, 0x5d, 0x4f, 0xfe, 0xf1, - 0x73, 0xcd, 0xc1, 0x91, 0x76, 0xc5, 0x2e, 0x73, 0x2b, 0x53, 0xbd, 0x5a, - 0xa8, 0x17, 0xd4, 0x34, 0x7b, 0x2d, 0xfe, 0xfd, 0x7f, 0xe1, 0xb1, 0x26, - 0x16, 0xa4, 0xbd, 0x0c, 0x85, 0xfa, 0x47, 0x4b, 0x20, 0x5c, 0x17, 0x86, - 0xb3, 0x6b, 0xee, 0x3a, 0xd9, 0x65, 0x42, 0xcb, 0xf3, 0x27, 0xe0, 0xd7, - 0x96, 0xdb, 0x6b, 0x9f, 0xd0, 0xe7, 0xf8, 0xb5, 0xdd, 0x7d, 0x1e, 0x8d, - 0xce, 0x9f, 0x5f, 0xd7, 0x7b, 0x90, 0xba, 0xb2, 0xe8, 0x79, 0x48, 0xcc, - 0x70, 0x40, 0x30, 0xc1, 0x2c, 0x05, 0x0f, 0x86, 0x4a, 0x89, 0x0a, 0xe2, - 0xeb, 0x01, 0x36, 0x9c, 0x4e, 0x22, 0x04, 0xf1, 0xf0, 0x45, 0xb4, 0x0a, - 0x5c, 0x9e, 0x41, 0x78, 0x55, 0x51, 0xaa, 0x3b, 0xf1, 0x01, 0xb1, 0xeb, - 0xc6, 0xb5, 0x55, 0x32, 0xb5, 0x84, 0xbc, 0xdc, 0x5e, 0x4f, 0x55, 0x14, - 0x5f, 0x91, 0x30, 0x6c, 0xf1, 0xa8, 0x09, 0xb5, 0x20, 0x7d, 0xa4, 0x32, - 0x8d, 0x9f, 0x40, 0x3f, 0xb3, 0x2a, 0x91, 0x29, 0xb1, 0x17, 0x14, 0x80, - 0xe7, 0x10, 0x26, 0xe0, 0xd0, 0x2b, 0xb3, 0x7e, 0xb6, 0x64, 0xe0, 0x89, - 0x26, 0xd7, 0x79, 0x4c, 0xa6, 0x2d, 0x3a, 0xfe, 0x37, 0x30, 0xda, 0x96, - 0x77, 0xa5, 0xf1, 0xb5, 0x6c, 0xe7, 0x88, 0x40, 0x9d, 0xb9, 0x71, 0xf1, - 0x78, 0x8b, 0x71, 0x09, 0xb9, 0x46, 0xf4, 0x67, 0xaa, 0xb7, 0xd6, 0x77, - 0xa9, 0x7d, 0x8f, 0x00, 0x8e, 0x86, 0x49, 0x68, 0xa8, 0xb9, 0x28, 0x08, - 0x42, 0x2e, 0x83, 0x11, 0x5d, 0x43, 0x2e, 0xb7, 0x9c, 0xf2, 0x1f, 0x72, - 0xe3, 0x76, 0x7b, 0xec, 0x79, 0xef, 0x92, 0xc3, 0x90, 0x51, 0xce, 0xb7, - 0x23, 0x55, 0x1f, 0xb4, 0xb9, 0xae, 0x87, 0xc3, 0xa8, 0x60, 0x46, 0x19, - 0x0d, 0x69, 0xf5, 0x9e, 0x15, 0x9a, 0xf0, 0x69, 0xff, 0x10, 0xdd, 0xcd, - 0x07, 0xfc, 0x0e, 0x3c, 0x38, 0xb9, 0x15, 0xfd, 0x0a, 0x20, 0xeb, 0xdc, - 0xc6, 0xba, 0x0a, 0x61, 0xdb, 0x2e, 0x46, 0x5a, 0x2b, 0x9c, 0x06, 0x7c, - 0x6c, 0x89, 0x4d, 0xcd, 0x4e, 0x71, 0x95, 0x5b, 0x8f, 0x3c, 0x96, 0xc6, - 0x27, 0x31, 0xe8, 0x0a, 0xc0, 0xb1, 0xff, 0x9a, 0xd0, 0xe4, 0x0c, 0xab, - 0xcd, 0x1c, 0x64, 0xc7, 0xb4, 0xcc, 0xb0, 0xcf, 0x9d, 0xe0, 0xf6, 0x6d, - 0xd1, 0x0b, 0x0a, 0xe7, 0xaa, 0x74, 0x4d, 0x82, 0x57, 0x6e, 0x6d, 0x7e, - 0xd8, 0xf9, 0xcd, 0x61, 0x5a, 0xfc, 0x3b, 0x88, 0xf2, 0x4f, 0x06, 0xd3, - 0x5e, 0x03, 0x54, 0xed, 0x24, 0x6f, 0xd0, 0x59, 0xc9, 0x4d, 0x01, 0xb0, - 0xdd, 0x3c, 0x37, 0x5f, 0x1f, 0xac, 0xc3, 0x65, 0x90, 0x2e, 0x8b, 0x17, - 0x3c, 0xfe, 0x58, 0x63, 0x57, 0xb1, 0x1d, 0x64, 0xdd, 0x14, 0x5c, 0x80, - 0x53, 0x43, 0xd2, 0x8a, 0xd4, 0x4f, 0x34, 0x4a, 0x80, 0xa5, 0xf3, 0xe2, - 0xe7, 0x46, 0xd0, 0xc5, 0xaa, 0xb8, 0x18, 0xa5, 0xc5, 0x79, 0xec, 0xde, - 0xda, 0x13, 0x0d, 0x1d, 0x2c, 0x5f, 0x5f, 0xfd, 0x13, 0x02, 0x8c, 0xbb, - 0x6d, 0x53, 0x50, 0xc3, 0xdc, 0xaa, 0xa4, 0x78, 0xbf, 0xc0, 0x57, 0x67, - 0xf3, 0x1e, 0xfd, 0xe7, 0xfe, 0x0e, 0x46, 0x5b, 0x45, 0x3b, 0xcf, 0xa2, - 0x3b, 0xfe, 0xa5, 0xef, 0x53, 0xf3, 0x48, 0x75, 0x77, 0x3b, 0xc2, 0x16, - 0x9f, 0x62, 0xf2, 0x4f, 0x37, 0xda, 0xc8, 0x67, 0xb9, 0x7a, 0x2c, 0x02, - 0x0d, 0x79, 0x80, 0x65, 0xd2, 0x5b, 0x9a, 0xfc, 0xcc, 0x06, 0x95, 0x08, - 0xd3, 0x7e, 0xde, 0x9a, 0xd2, 0xe9, 0x79, 0xe7, 0x7c, 0x55, 0x83, 0x31, - 0xf6, 0x8b, 0xbb, 0x90, 0xe9, 0xe2, 0x3d, 0x6b, 0xe4, 0xca, 0x22, 0x10, - 0x0b, 0xfa, 0xce, 0x99, 0x32, 0xd1, 0x95, 0xb6, 0x41, 0xf7, 0x61, 0xe8, - 0xff, 0x28, 0x1c, 0x4d, 0x98, 0x2b, 0xb7, 0x30, 0xfd, 0x77, 0x85, 0x0c, - 0xa2, 0xe5, 0xa0, 0x5c, 0x89, 0x6c, 0x34, 0xc6, 0x88, 0x0d, 0xdd, 0x64, - 0x99, 0x4c, 0x0e, 0xfd, 0x98, 0x24, 0x6b, 0x55, 0xd5, 0x54, 0x2c, 0x2c, - 0x26, 0x70, 0xc9, 0xea, 0x88, 0x93, 0x80, 0xbb, 0xe9, 0x2e, 0xa7, 0x07, - 0x9e, 0xde, 0x1d, 0xf3, 0x14, 0x63, 0x55, 0xe1, 0x21, 0xf3, 0x87, 0xc7, - 0xab, 0x40, 0x97, 0xfc, 0x49, 0xdb, 0x45, 0xa7, 0xde, 0x03, 0xeb, 0xbb, - 0xd5, 0xa7, 0x1b, 0x89, 0x5c, 0xe8, 0xd8, 0x9d, 0xe8, 0x22, 0xbc, 0x71, - 0x76, 0x30, 0xd0, 0xb6, 0x9a, 0x90, 0x8b, 0x9e, 0xb5, 0x33, 0x30, 0x8c, - 0xb9, 0x9b, 0x04, 0xa6, 0xaa, 0xb3, 0x80, 0x6d, 0x9b, 0x26, 0xce, 0x7e, - 0xf2, 0xb8, 0x7e, 0x2e, 0xfa, 0xc3, 0xec, 0xc7, 0x3a, 0x58, 0x0a, 0x6c, - 0x85, 0x7b, 0x95, 0x2e, 0x21, 0xa0, 0x5d, 0x28, 0x54, 0xbf, 0xa8, 0xa9, - 0x8e, 0x03, 0x0f, 0xb1, 0x11, 0x92, 0xcb, 0xe5, 0x83, 0x58, 0xf1, 0x2d, - 0xd3, 0xf1, 0xac, 0x89, 0x2e, 0x35, 0xb6, 0xd4, 0x96, 0x5f, 0x22, 0x1e, - 0xab, 0x8c, 0xc9, 0x60, 0x11, 0x81, 0x77, 0x6d, 0x11, 0xcc, 0x6d, 0xd9, - 0x0a, 0x90, 0x5c, 0xef, 0x19, 0x7a, 0x65, 0x42, 0xd9, 0xc5, 0x34, 0x85, - 0x8d, 0x75, 0xa3, 0x1b, 0xaf, 0xe2, 0xb2, 0x72, 0x0f, 0x1c, 0xae, 0x5a, - 0xa3, 0x4b, 0x1f, 0x43, 0xba, 0x57, 0x59, 0xd0, 0xed, 0x09, 0x4d, 0xba, - 0xa4, 0xc2, 0x58, 0xe1, 0xa6, 0xf2, 0x86, 0x4a, 0xff, 0x7c, 0x24, 0x9c, - 0x01, 0x88, 0xf7, 0x9a, 0x88, 0x6a, 0x73, 0xe3, 0xb3, 0x32, 0xe5, 0xe1, - 0xa5, 0xd8, 0x64, 0x1b, 0xfd, 0xce, 0x36, 0x32, 0x58, 0x2a, 0xa7, 0xc7, - 0xbf, 0xbd, 0x37, 0xc3, 0x02, 0xa1, 0xc1, 0x01, 0xc9, 0xb1, 0x3b, 0x03, - 0x54, 0xbf, 0x68, 0x1d, 0xee, 0x0c, 0x1d, 0x64, 0xce, 0x34, 0x74, 0x4a, - 0x1c, 0x8d, 0xc4, 0xce, 0x1c, 0x5c, 0xfd, 0x75, 0xcd, 0x41, 0x5c, 0x32, - 0x8c, 0x22, 0xcf, 0xad, 0x74, 0x40, 0xd8, 0x9c, 0x85, 0x4e, 0xa4, 0xc6, - 0x5f, 0x56, 0x51, 0xb9, 0x7f, 0x03, 0x3a, 0xfd, 0x2c, 0xd6, 0x45, 0x48, - 0xf4, 0x8a, 0xa5, 0x44, 0xe2, 0x69, 0x18, 0x07, 0x65, 0xb1, 0xef, 0x6b, - 0x4e, 0x60, 0x98, 0xd3, 0x11, 0xbd, 0x05, 0xa6, 0xd1, 0xe6, 0x92, 0xb7, - 0x75, 0x70, 0x1b, 0xee, 0x57, 0xaa, 0x5c, 0x5c, 0x43, 0xfe, 0xd0, 0xf2, - 0xf1, 0x84, 0x98, 0xa4, 0x58, 0x4e, 0xde, 0x57, 0x85, 0x3f, 0xb8, 0xbe, - 0xcc, 0x4d, 0x55, 0x3b, 0x7f, 0x42, 0xd5, 0x85, 0x8c, 0x44, 0x2a, 0x49, - 0x8c, 0x38, 0xcf, 0x70, 0x59, 0x44, 0x32, 0xe7, 0x67, 0x0b, 0x84, 0xfd, - 0xc6, 0x80, 0x37, 0x7a, 0x19, 0x90, 0x35, 0x75, 0x98, 0x3f, 0xb8, 0x7c, - 0x37, 0xa9, 0xb4, 0x0f, 0x0c, 0x78, 0x0f, 0xe2, 0x46, 0x84, 0xba, 0xcc, - 0xd8, 0x18, 0x71, 0xcf, 0x29, 0xbe, 0x83, 0x1e, 0xd7, 0xe9, 0xff, 0x8c, - 0x81, 0x3f, 0x1f, 0xba, 0x52, 0xd6, 0x0e, 0x5c, 0x67, 0x27, 0xed, 0x9d, - 0x56, 0x02, 0xce, 0xb4, 0x78, 0x1b, 0x8c, 0xdb, 0xcb, 0x95, 0x01, 0x02, - 0x15, 0x50, 0x96, 0x1c, 0x12, 0x85, 0xfe, 0x53, 0x19, 0x56, 0x5b, 0x57, - 0xe3, 0xa7, 0x9b, 0xec, 0x8e, 0xf5, 0x5a, 0xde, 0xbe, 0x57, 0xd3, 0xaf, - 0xac, 0xfb, 0x79, 0x14, 0xe5, 0xea, 0x66, 0x7b, 0x50, 0xd9, 0x4b, 0xb8, - 0xfb, 0xf4, 0xbb, 0xa2, 0xf6, 0xd3, 0x6b, 0xa2, 0x74, 0x27, 0x2a, 0x34, - 0xb8, 0x0a, 0x70, 0x6c, 0xfc, 0x88, 0x7c, 0xe9, 0xd4, 0x2e, 0x95, 0x60, - 0x35, 0x4f, 0x46, 0xe4, 0x5a, 0xb1, 0x7e, 0x76, 0xd5, 0x39, 0x88, 0x1b, - 0x39, 0x39, 0x23, 0x96, 0x5f, 0xaa, 0x84, 0xfe, 0x92, 0x47, 0xee, 0x94, - 0x7b, 0x9b, 0x37, 0x02, 0x53, 0xf2, 0x45, 0xff, 0x62, 0x94, 0xc4, 0x8a, - 0xa4, 0x5a, 0x9d, 0x7f, 0x77, 0xa6, 0x28, 0x73, 0xbb, 0x3c, 0x91, 0xcb, - 0xb4, 0xf3, 0xe3, 0xef, 0xf6, 0xa4, 0xec, 0x50, 0x37, 0x50, 0x5d, 0x6a, - 0x9d, 0xdc, 0x7d, 0xd5, 0xbd, 0xb4, 0xfd, 0x1f, 0x97, 0x99, 0x1d, 0xd3, - 0xbe, 0x96, 0x1f, 0xb8, 0x0b, 0xb0, 0x45, 0x21, 0xd9, 0x45, 0x27, 0x3b, - 0x97, 0x54, 0x5e, 0x19, 0x21, 0x40, 0xbf, 0x9a, 0xc7, 0x51, 0x3f, 0x4b, - 0xe4, 0xd5, 0x26, 0x01, 0x3a, 0x6d, 0x8c, 0x96, 0x76, 0x6d, 0x85, 0x4e, - 0x6a, 0x67, 0xe2, 0x80, 0xf2, 0x9c, 0x80, 0x09, 0x4c, 0x76, 0xd4, 0xc1, - 0x38, 0xbb, 0x3b, 0xcb, 0x4f, 0xe0, 0x7a, 0x7b, 0x9e, 0x05, 0x9f, 0xdf, - 0x88, 0x4e, 0x14, 0xd5, 0xd3, 0xc8, 0xd1, 0x96, 0x49, 0x40, 0x9f, 0xf0, - 0x8c, 0x33, 0x10, 0x88, 0x57, 0x7e, 0x6d, 0x56, 0xd6, 0xc5, 0x33, 0x69, - 0x59, 0xf1, 0x1a, 0x1f, 0x5b, 0xb7, 0x7f, 0x93, 0xc9, 0xd0, 0xde, 0xec, - 0x12, 0xf8, 0x80, 0x55, 0x2d, 0xc7, 0x84, 0xbd, 0x08, 0x30, 0x5f, 0x02, - 0xdd, 0xba, 0x6f, 0x66, 0xdf, 0xc4, 0xa5, 0x75, 0x30, 0x6e, 0xe1, 0xc0, - 0x38, 0x6f, 0x1c, 0x38, 0xac, 0x9e, 0x23, 0x8c, 0xf1, 0xdb, 0x51, 0x5f, - 0x45, 0x42, 0xe1, 0xec, 0x30, 0x30, 0x01, 0x72, 0x87, 0xd6, 0x20, 0x7a, - 0x45, 0x47, 0x7d, 0xa7, 0x8b, 0x96, 0xf4, 0x61, 0x55, 0xf5, 0x92, 0xa6, - 0xf1, 0x20, 0xab, 0x9b, 0x2e, 0x4b, 0xf5, 0x60, 0x6b, 0xbc, 0x44, 0x5f, - 0x28, 0x75, 0xcd, 0xeb, 0x25, 0x06, 0xe9, 0xd2, 0xad, 0x31, 0x90, 0x10, - 0x56, 0x7d, 0x0b, 0x6e, 0xb0, 0x40, 0xf1, 0x51, 0x47, 0xb3, 0x93, 0x64, - 0x32, 0xd8, 0xae, 0x44, 0x9a, 0xf5, 0x36, 0xa0, 0xbf, 0xb3, 0xf7, 0xe1, - 0xed, 0xbf, 0xd6, 0x2b, 0xd7, 0x92, 0x72, 0xe8, 0x03, 0xf4, 0xd6, 0x34, - 0x36, 0x0b, 0x85, 0x3c, 0xd0, 0xbd, 0xa5, 0x72, 0x64, 0xfb, 0xff, 0x6f, - 0x8e, 0xd4, 0x9e, 0x75, 0xe2, 0x2b, 0xed, 0xea, 0x0c, 0x33, 0x6c, 0xcc, - 0xba, 0x77, 0x3f, 0xd2, 0xde, 0x4d, 0x2a, 0x38, 0xbe, 0x96, 0x65, 0x50, - 0xf6, 0xfd, 0x4e, 0x9c, 0x9d, 0x54, 0x40, 0x79, 0xdc, 0x5c, 0xd3, 0xf1, - 0x86, 0xe6, 0x98, 0x81, 0xa4, 0x88, 0x71, 0xfd, 0xf2, 0xe8, 0x5e, 0x57, - 0x86, 0x56, 0xf9, 0x84, 0x9f, 0x32, 0x62, 0x7b, 0xba, 0xab, 0x47, 0x76, - 0x5b, 0x23, 0x49, 0x93, 0x82, 0x3c, 0x31, 0x22, 0xbb, 0xa0, 0xc8, 0xc5, - 0x98, 0x51, 0x43, 0x1a, 0x3c, 0x45, 0xc2, 0x9b, 0x92, 0x47, 0xa0, 0xff, - 0x25, 0x4a, 0x15, 0x2a, 0xbf, 0xdf, 0xe7, 0x78, 0x88, 0x32, 0x8f, 0x80, - 0x2d, 0x01, 0x67, 0xd5, 0x32, 0xca, 0x1f, 0x2d, 0x77, 0xd1, 0xc3, 0x5f, - 0xd5, 0x3f, 0x94, 0xdb, 0x39, 0xbc, 0x94, 0xa1, 0x8c, 0xea, 0x72, 0x27, - 0x78, 0xa6, 0x11, 0x09, 0x32, 0x8b, 0xc1, 0x28, 0xd6, 0x50, 0x90, 0x7e, - 0x6f, 0x63, 0xb8, 0x9a, 0x1a, 0xfe, 0x94, 0x70, 0xb2, 0x21, 0xa7, 0x7d, - 0x3c, 0x68, 0xb8, 0x10, 0x27, 0x63, 0x26, 0xf6, 0xb4, 0xb2, 0xeb, 0xdf, - 0x8a, 0xda, 0x6f, 0x51, 0xf0, 0x76, 0x21, 0x1d, 0x92, 0xab, 0x0e, 0x7d, - 0x3c, 0x8b, 0xd8, 0x9a, 0x38, 0x2e, 0x21, 0xc3, 0xbc, 0xf9, 0x1d, 0x6d, - 0x73, 0x0e, 0x38, 0x53, 0xf6, 0xf9, 0xb1, 0x6c, 0xe0, 0xd2, 0x04, 0x4a, - 0x4d, 0x03, 0xde, 0x87, 0x56, 0x88, 0x35, 0xbc, 0xa9, 0xe5, 0x0e, 0x79, - 0xa1, 0xf7, 0xd0, 0xf2, 0x71, 0x8a, 0x52, 0x1a, 0x87, 0xdd, 0xd9, 0xd4, - 0x8a, 0xb5, 0x9e, 0x38, 0x1a, 0xc9, 0x8c, 0x7e, 0xd4, 0x82, 0x55, 0x07, - 0xb8, 0x88, 0xcf, 0x44, 0x6d, 0x4b, 0xe2, 0x5c, 0x19, 0x8a, 0xc2, 0x8c, - 0x7c, 0x42, 0x55, 0xc9, 0xcd, 0x39, 0x1c, 0xd2, 0x16, 0x65, 0xe1, 0x47, - 0xdc, 0x64, 0xe0, 0x0d, 0x0e, 0xc6, 0xd9, 0xc4, 0x20, 0x62, 0x62, 0x2a, - 0x8e, 0x79, 0xde, 0x49, 0xb0, 0xc9, 0xa3, 0x26, 0x7a, 0x4a, 0xe1, 0x5f, - 0x9d, 0x35, 0xee, 0xb7, 0xb6, 0x02, 0x92, 0x17, 0xc6, 0x3c, 0x30, 0xb6, - 0x32, 0x4f, 0x0e, 0x46, 0xea, 0x2c, 0x2a, 0x03, 0x56, 0x10, 0xe4, 0xd5, - 0x36, 0x0d, 0xe9, 0x96, 0xf0, 0x95, 0x54, 0x57, 0xdc, 0x02, 0x93, 0xb2, - 0x58, 0xc4, 0x08, 0xd5, 0xb7, 0x2c, 0x27, 0xed, 0xb6, 0xbd, 0x14, 0xa8, - 0x3b, 0x9e, 0xc0, 0x38, 0xbf, 0x63, 0x83, 0xf3, 0xeb, 0xda, 0x56, 0x7e, - 0x66, 0x99, 0x0f, 0xa3, 0xf1, 0x6e, 0x6b, 0xe7, 0x10, 0xa8, 0x09, 0xa3, - 0x9c, 0x8a, 0x31, 0x4a, 0x83, 0x51, 0xc4, 0xa2, 0x32, 0x6f, 0x83, 0x1b, - 0x0b, 0x77, 0x94, 0xc5, 0xbc, 0x15, 0xaa, 0x3b, 0x90, 0xa3, 0x1e, 0xd6, - 0x2d, 0x7a, 0x5c, 0x6d, 0x62, 0x88, 0x53, 0x9f, 0xe1, 0xef, 0x8b, 0xe5, - 0xfa, 0x42, 0x70, 0x86, 0xe0, 0x61, 0xfe, 0xa1, 0x9d, 0x87, 0x9f, 0xc6, - 0x0e, 0x65, 0xd2, 0xfe, 0x52, 0xd2, 0xea, 0xac, 0x8a, 0xa4, 0xd2, 0x01, - 0x9a, 0xe5, 0xf4, 0xb9, 0x9a, 0x7a, 0xd3, 0x36, 0x5f, 0xd9, 0x29, 0x7d, - 0x5e, 0xc8, 0xa7, 0x9a, 0x3b, 0x23, 0xe7, 0x57, 0x1d, 0xdb, 0x10, 0x5b, - 0x1e, 0x00, 0xd2, 0x0e, 0xc2, 0xf4, 0xb3, 0xc6, 0x35, 0xdb, 0xbf, 0x71, - 0x69, 0x57, 0x5a, 0x99, 0x78, 0x00, 0xa2, 0x89, 0x47, 0x99, 0x92, 0x95, - 0x57, 0x5f, 0x47, 0x9d, 0x4a, 0x28, 0xb8, 0x1c, 0xcd, 0xca, 0x36, 0x4f, - 0xfe, 0xd0, 0x6f, 0x06, 0x47, 0x10, 0xa1, 0x60, 0x3f, 0xec, 0x99, 0xe6, - 0xb6, 0xb0, 0xb7, 0x19, 0xb5, 0x39, 0x73, 0xf8, 0xfc, 0xdc, 0xb6, 0xcb, - 0xac, 0x74, 0xa8, 0xf1, 0xe6, 0x94, 0x00, 0x3f, 0xed, 0x36, 0x41, 0xff, - 0x97, 0xfc, 0xad, 0x9f, 0xca, 0xc3, 0x0e, 0x3e, 0xcf, 0x0d, 0x0d, 0xb9, - 0xf1, 0x0e, 0x78, 0x17, 0xfa, 0xd9, 0x1c, 0xc5, 0xd7, 0x26, 0x84, 0x28, - 0x4b, 0xef, 0xa9, 0xe5, 0x53, 0xcb, 0x8f, 0x8b, 0x4c, 0xd9, 0x49, 0x12, - 0xa7, 0x6e, 0x41, 0x2d, 0xce, 0xc2, 0x41, 0xc1, 0x50, 0x90, 0x45, 0x0d, - 0x45, 0xef, 0x87, 0x67, 0xe5, 0x6c, 0x32, 0xc6, 0x7a, 0x0e, 0x9e, 0xb9, - 0xb1, 0xec, 0xda, 0x0b, 0xae, 0xaa, 0xde, 0x5d, 0xb1, 0x0c, 0x9b, 0xbf, - 0x89, 0xc2, 0xbc, 0xd9, 0xc2, 0xff, 0xf4, 0x0c, 0x83, 0xfe, 0x16, 0x6a, - 0x97, 0x46, 0x59, 0x51, 0x80, 0xf8, 0x0b, 0x91, 0x39, 0xe9, 0x2b, 0xf0, - 0xfb, 0x78, 0x20, 0x55, 0x90, 0x61, 0x2b, 0xaa, 0x4c, 0x44, 0x74, 0x56, - 0x98, 0xcd, 0x87, 0x11, 0x01, 0x2d, 0xee, 0x11, 0xf1, 0x17, 0xaa, 0x5e, - 0xdb, 0x0e, 0xc6, 0xc0, 0x26, 0x03, 0x91, 0xb1, 0x84, 0x1f, 0xb2, 0x1a, - 0x6b, 0x4c, 0xb9, 0x68, 0x91, 0xae, 0x80, 0x0e, 0x34, 0x5b, 0x68, 0xed, - 0x3b, 0xd6, 0x2a, 0xce, 0x62, 0x91, 0xe3, 0xa5, 0xb4, 0x2b, 0x99, 0x65, - 0x73, 0x93, 0xff, 0xa4, 0x61, 0xc1, 0x59, 0x56, 0x99, 0xf0, 0xda, 0x37, - 0x9d, 0xec, 0x33, 0x2c, 0x8e, 0x93, 0x66, 0x70, 0x42, 0xc2, 0x9d, 0x2b, - 0x91, 0x9c, 0x0c, 0xf5, 0x34, 0x60, 0xe0, 0x0c, 0x19, 0xf7, 0x4f, 0x36, - 0xf6, 0xee, 0x3e, 0x1e, 0x6c, 0x62, 0x30, 0xde, 0x16, 0x8f, 0x66, 0xde, - 0xf7, 0x1d, 0x79, 0xab, 0xf0, 0x66, 0x26, 0x55, 0xbf, 0xf0, 0xa9, 0x65, - 0x4e, 0xb4, 0x90, 0x5c, 0x6c, 0x1c, 0x1e, 0x3a, 0xde, 0x89, 0x5d, 0xda, - 0x9e, 0xf5, 0x6b, 0xa4, 0xd2, 0xf0, 0x4d, 0x53, 0x42, 0x6a, 0x45, 0xbf, - 0xed, 0xdd, 0xea, 0x10, 0x79, 0x5d, 0xd7, 0x35, 0x39, 0xfa, 0x8e, 0xca, - 0x92, 0x04, 0x8e, 0xd3, 0x39, 0xe9, 0x95, 0x85, 0xef, 0xa0, 0xc4, 0xbf, - 0x8d, 0x14, 0x11, 0x55, 0x58, 0x4e, 0xb7, 0x85, 0xa6, 0x7a, 0x56, 0x3e, - 0x0c, 0x0b, 0xc8, 0x1f, 0x42, 0x30, 0xed, 0xb8, 0x0c, 0x26, 0x35, 0xed, - 0x67, 0xa7, 0xe8, 0x85, 0x53, 0x73, 0x3f, 0x2e, 0xa1, 0x94, 0x97, 0x29, - 0x93, 0x0b, 0x5e, 0x5d, 0xeb, 0xf2, 0x5b, 0xa9, 0x82, 0xac, 0xec, 0xee, - 0xae, 0x1c, 0xa4, 0x92, 0xfa, 0x8b, 0x83, 0xf2, 0x59, 0x05, 0xea, 0xb3, - 0xf8, 0x76, 0x07, 0x65, 0x2f, 0xa6, 0x8d, 0x75, 0x7e, 0x64, 0x6d, 0x9d, - 0x23, 0xfd, 0x2d, 0x52, 0xb1, 0x16, 0x37, 0x9d, 0xb2, 0x78, 0xb8, 0x71, - 0xfc, 0x3f, 0x2a, 0xcc, 0x68, 0x8b, 0xa0, 0xf9, 0x20, 0xd6, 0x0a, 0xe7, - 0x4b, 0x56, 0x95, 0x0c, 0x57, 0xc9, 0xb3, 0x74, 0xaa, 0xe6, 0x40, 0xbf, - 0x31, 0x52, 0xba, 0x92, 0x00, 0xc4, 0x63, 0x1f, 0x5a, 0xb1, 0xa7, 0xf9, - 0xe1, 0x7a, 0x01, 0xc9, 0xbf, 0xb0, 0xe5, 0x7f, 0x34, 0x75, 0x18, 0x5a, - 0x8a, 0xc0, 0xf4, 0xae, 0xda, 0x6c, 0x10, 0xcc, 0xc5, 0xd6, 0x16, 0xee, - 0x80, 0xa5, 0x5d, 0xb6, 0x31, 0x4c, 0xb7, 0xc7, 0x44, 0x84, 0x07, 0x9a, - 0x4f, 0x48, 0xc3, 0x4d, 0xdc, 0x32, 0x07, 0xb9, 0x64, 0xff, 0xf6, 0x8d, - 0x52, 0xdc, 0x58, 0x5a, 0x03, 0x4b, 0x5d, 0x55, 0x74, 0x87, 0x42, 0x8d, - 0xd2, 0x0d, 0x3a, 0x74, 0x18, 0xa7, 0x62, 0x23, 0xd6, 0xfe, 0x2f, 0xb6, - 0xda, 0x85, 0xb3, 0x44, 0xfb, 0x95, 0xfc, 0x39, 0xa3, 0xfb, 0x70, 0x36, - 0x0b, 0x69, 0xb9, 0x36, 0x7f, 0xe2, 0xcd, 0xa0, 0x97, 0x3f, 0xd4, 0xf3, - 0x8b, 0x5e, 0x01, 0x2d, 0x80, 0x82, 0x8b, 0x22, 0x97, 0x8c, 0xf7, 0xbb, - 0xe7, 0x46, 0x70, 0x00, 0x1b, 0xb8, 0xf5, 0x42, 0xdd, 0x2e, 0xd8, 0x04, - 0xfb, 0xed, 0x99, 0xa5, 0xe5, 0x73, 0x9f, 0x8c, 0x26, 0xb8, 0x84, 0xee, - 0xd9, 0x00, 0x62, 0x4f, 0x68, 0xaf, 0x6d, 0xd2, 0x42, 0xa6, 0xb8, 0x79, - 0xd1, 0xd0, 0x08, 0xac, 0x0f, 0x6d, 0x3a, 0x8a, 0xb9, 0x51, 0x6c, 0xd4, - 0x3a, 0xdd, 0x95, 0xe5, 0x3c, 0x1f, 0x0a, 0x8c, 0x0e, 0x50, 0xbd, 0xb4, - 0xf0, 0x5c, 0xd2, 0xe5, 0x1c, 0x1d, 0x54, 0xe4, 0x2e, 0xc5, 0x9f, 0xbb, - 0xdc, 0x60, 0x32, 0xe6, 0x4e, 0xc7, 0x2c, 0x95, 0xaa, 0x43, 0x97, 0x3e, - 0x4c, 0xa1, 0x37, 0xe0, 0xe1, 0x40, 0x84, 0x2e, 0xaf, 0x05, 0x82, 0x2c, - 0x0f, 0x79, 0x6c, 0x9f, 0x3b, 0xc7, 0x4a, 0x89, 0x09, 0x9d, 0xd0, 0xb2, - 0xfd, 0xb2, 0xbf, 0x1a, 0xde, 0xa4, 0x43, 0xb5, 0x58, 0xf9, 0x0f, 0x07, - 0xbe, 0x77, 0xb1, 0x4f, 0xde, 0xb0, 0xf7, 0x87, 0xc2, 0x7f, 0x42, 0x93, - 0x29, 0x9d, 0xe8, 0xa5, 0x39, 0x0c, 0xd0, 0x4e, 0xb1, 0x2a, 0xb9, 0x1c, - 0x12, 0x41, 0xdb, 0x3b, 0x6a, 0xd2, 0x3c, 0xec, 0x22, 0x32, 0x03, 0x31, - 0x7b, 0x31, 0xb0, 0xe2, 0x63, 0x29, 0x61, 0x0a, 0x89, 0x80, 0xa5, 0xd4, - 0xad, 0xbc, 0x91, 0xea, 0xa3, 0x4f, 0x57, 0x74, 0xc0, 0x8e, 0x8f, 0xa7, - 0x9c, 0xdf, 0xbf, 0x4a, 0xd0, 0x7f, 0xc1, 0x3b, 0xc3, 0x31, 0x0e, 0xec, - 0x2a, 0x86, 0x5b, 0xab, 0x4f, 0x1b, 0x8d, 0x31, 0x82, 0xde, 0x36, 0x9e, - 0x16, 0x03, 0x45, 0x0e, 0xfb, 0x0c, 0x1a, 0xce, 0x33, 0xb6, 0x82, 0x95, - 0x54, 0xa8, 0xfa, 0x35, 0x6e, 0xd2, 0xee, 0xec, 0x07, 0xf1, 0x8e, 0x7a, - 0x02, 0x02, 0xeb, 0xaa, 0x4f, 0xb4, 0xab, 0x55, 0xca, 0x9e, 0x00, 0xd0, - 0x66, 0x17, 0xeb, 0x08, 0x7b, 0x40, 0xa8, 0x3d, 0x3c, 0xe5, 0x71, 0x93, - 0x8e, 0x54, 0x2e, 0x57, 0xe9, 0x94, 0x0e, 0x96, 0x19, 0x11, 0xf9, 0x49, - 0xf2, 0x25, 0xe5, 0x93, 0xc9, 0x86, 0x3a, 0x08, 0xc7, 0x15, 0xaa, 0xb7, - 0xcc, 0x98, 0xac, 0x51, 0xe1, 0x78, 0x6f, 0x55, 0x74, 0x97, 0x35, 0x83, - 0x77, 0x66, 0x4e, 0x4d, 0x62, 0xa3, 0xd5, 0xf6, 0x72, 0xd6, 0x34, 0xa3, - 0x38, 0x02, 0x13, 0xb2, 0x60, 0x4b, 0xa9, 0xbe, 0x6c, 0x33, 0x6e, 0xdf, - 0x6e, 0x07, 0x5f, 0xd7, 0x07, 0xd3, 0xad, 0xa0, 0x14, 0x2c, 0xa6, 0xd2, - 0xa4, 0xec, 0xf3, 0x58, 0x47, 0x3b, 0x4e, 0x3b, 0x99, 0x0a, 0x26, 0x6e, - 0xac, 0xfe, 0x9e, 0x59, 0x9b, 0x70, 0xd3, 0xf4, 0xa0, 0x5a, 0x54, 0x7d, - 0x4b, 0x4f, 0x37, 0x10, 0xd5, 0xd8, 0x4c, 0xa9, 0x7f, 0x79, 0x12, 0x69, - 0xdc, 0x9d, 0x7a, 0x0d, 0xd4, 0x9d, 0x40, 0x02, 0x65, 0x9b, 0xaa, 0xce, - 0x20, 0x6d, 0xdc, 0xce, 0x5d, 0xcb, 0x13, 0xc6, 0xb1, 0x48, 0x93, 0xa9, - 0x6b, 0x22, 0x94, 0x6f, 0x71, 0xed, 0x18, 0x52, 0x0f, 0xed, 0x58, 0xae, - 0x0d, 0xc0, 0xab, 0xb1, 0x40, 0x6e, 0x82, 0x5f, 0x62, 0xa0, 0x08, 0xbb, - 0xf5, 0xa8, 0x04, 0x70, 0x5d, 0xfb, 0x30, 0xce, 0x24, 0x6a, 0x75, 0x04, - 0x65, 0x20, 0xc3, 0x2e, 0xae, 0xaa, 0xae, 0xb0, 0x7e, 0x96, 0xcc, 0x41, - 0x1b, 0xf9, 0x51, 0x8f, 0x10, 0xa2, 0x96, 0xde, 0x55, 0xea, 0xa3, 0x59, - 0xaa, 0xe2, 0xfb, 0x52, 0x6c, 0x46, 0x0d, 0x8a, 0xbc, 0xdb, 0x78, 0x72, - 0xf3, 0xcc, 0x43, 0x6a, 0x4c, 0x46, 0x60, 0xb5, 0x97, 0xc5, 0x43, 0xc4, - 0xd5, 0x70, 0x37, 0x8f, 0xbb, 0xa5, 0x6b, 0xf1, 0xff, 0x6b, 0xed, 0xc2, - 0x67, 0x42, 0x64, 0x30, 0x3f, 0x02, 0x88, 0x02, 0x77, 0x14, 0x61, 0xce, - 0xb6, 0xac, 0x0d, 0xfd, 0x19, 0x0a, 0x16, 0x58, 0xb5, 0x87, 0x22, 0x23, - 0xb4, 0xac, 0x90, 0x97, 0x94, 0x83, 0xcd, 0xc5, 0xa8, 0xf0, 0x51, 0x98, - 0x45, 0xfc, 0x19, 0x23, 0x0a, 0xff, 0x4b, 0x13, 0xd1, 0xd4, 0x89, 0x6c, - 0x84, 0x5a, 0x76, 0xfd, 0x48, 0x1e, 0xec, 0x50, 0x39, 0x9a, 0x72, 0xb5, - 0x5e, 0x7b, 0xb7, 0xc2, 0xab, 0x57, 0xa3, 0x5d, 0x1f, 0x87, 0xcd, 0x2e, - 0x7a, 0x65, 0x42, 0x46, 0x44, 0x56, 0xa8, 0x36, 0xd4, 0x01, 0x96, 0x2f, - 0xff, 0x83, 0x7b, 0x2e, 0xd5, 0x17, 0xb6, 0xd2, 0x88, 0x60, 0x7e, 0x47, - 0xac, 0x71, 0x53, 0x7d, 0x82, 0xbb, 0x83, 0xfe, 0x2a, 0xee, 0xc6, 0xb3, - 0x97, 0x5d, 0xe6, 0x78, 0xb7, 0x8b, 0xea, 0xad, 0x64, 0x8e, 0xba, 0xf2, - 0x31, 0xc8, 0x7e, 0x40, 0xcd, 0xed, 0x60, 0x43, 0xb3, 0x3e, 0x3d, 0x84, - 0x56, 0x8b, 0x04, 0x30, 0x64, 0xeb, 0xd8, 0x31, 0x39, 0xad, 0xb1, 0x17, - 0x8e, 0xd3, 0x5c, 0x25, 0x00, 0xdb, 0x10, 0x9d, 0xa7, 0xa8, 0x25, 0xc4, - 0xf0, 0x53, 0xfa, 0xe9, 0x63, 0x92, 0xc0, 0xa9, 0xd7, 0x72, 0x56, 0x49, - 0x13, 0xac, 0x54, 0x84, 0x90, 0xc0, 0xfb, 0x4a, 0xb2, 0xcc, 0xc2, 0xbf, - 0xf9, 0x80, 0x45, 0xaf, 0x51, 0x6d, 0x64, 0xa1, 0x59, 0xbb, 0x82, 0xb8, - 0x98, 0xed, 0x53, 0x90, 0xec, 0xb1, 0x08, 0x8a, 0x4f, 0x97, 0x84, 0x3c, - 0x0b, 0x61, 0x8a, 0xda, 0x74, 0x3d, 0xcd, 0x37, 0x46, 0x49, 0x2b, 0x4d, - 0x18, 0x72, 0xab, 0x0a, 0x02, 0xe3, 0x54, 0xb1, 0x2d, 0x7f, 0xe8, 0x9d, - 0xc6, 0x68, 0x6a, 0xd8, 0xbf, 0xaa, 0x89, 0x0c, 0x62, 0x78, 0x15, 0x25, - 0x4b, 0xd1, 0xd5, 0xed, 0xd7, 0x4c, 0x90, 0xe5, 0x0f, 0xd9, 0xfa, 0x16, - 0xaf, 0xe6, 0x4f, 0x70, 0x23, 0x2d, 0xcd, 0x47, 0xb9, 0xce, 0x14, 0xde, - 0x4a, 0x02, 0xb1, 0xac, 0x2a, 0x28, 0x98, 0xa4, 0x3b, 0xcc, 0x00, 0x8b, - 0x23, 0x33, 0xcb, 0x45, 0x5d, 0xca, 0x9f, 0x40, 0xae, 0x8e, 0x74, 0x72, - 0x5c, 0x3d, 0x34, 0x78, 0x92, 0x6b, 0x39, 0x8a, 0x1a, 0xac, 0x88, 0x00, - 0xe7, 0xff, 0x9b, 0xc4, 0x6c, 0x47, 0x07, 0xce, 0x2d, 0xa9, 0x88, 0xc4, - 0x8a, 0xdc, 0xdb, 0x31, 0x0b, 0x54, 0x06, 0xc0, 0xbf, 0xb1, 0x6c, 0x15, - 0x22, 0x2d, 0x6d, 0x2a, 0x9f, 0x58, 0xfc, 0x84, 0xe7, 0x7a, 0x9d, 0xc5, - 0x13, 0xbd, 0xbc, 0x1d, 0xd2, 0x91, 0x81, 0xc4, 0x95, 0x12, 0x45, 0x4b, - 0xa4, 0x84, 0xda, 0xfe, 0x14, 0x6b, 0x48, 0xd4, 0x9a, 0x75, 0xab, 0x03, - 0xcd, 0x55, 0x03, 0xcb, 0xd8, 0xfd, 0xee, 0xdb, 0xc9, 0x90, 0x15, 0xc9, - 0xe3, 0x2f, 0x29, 0x6d, 0xbd, 0x32, 0xfa, 0x2c, 0x8c, 0x20, 0xb2, 0x2c, - 0x8e, 0x64, 0x13, 0x0d, 0xd6, 0xfc, 0x4f, 0x2f, 0x7e, 0x9b, 0x9a, 0x86, - 0xb7, 0xf1, 0x7d, 0x5c, 0xcf, 0xe5, 0x5d, 0xbb, 0x9c, 0xa2, 0xbd, 0xdd, - 0x30, 0x39, 0x00, 0x8a, 0x86, 0xae, 0x35, 0x94, 0xe1, 0xfd, 0x7d, 0xe2, - 0x66, 0xba, 0x80, 0x28, 0xb9, 0x7f, 0x89, 0x3a, 0x96, 0xf7, 0x0d, 0xa0, - 0x5e, 0x01, 0x34, 0x69, 0x0c, 0xa2, 0x91, 0x6b, 0x72, 0x81, 0x95, 0xbb, - 0xc0, 0x06, 0xd3, 0x73, 0xe1, 0xde, 0x43, 0xbd, 0xe7, 0x36, 0x78, 0xed, - 0x13, 0x11, 0x47, 0x73, 0x7d, 0x11, 0x70, 0xa9, 0x56, 0x42, 0x19, 0xbd, - 0x4a, 0x78, 0x7e, 0x13, 0xd5, 0xc2, 0xcf, 0x9e, 0xfe, 0xdb, 0x8f, 0x26, - 0xb2, 0xa7, 0xb5, 0x88, 0xd8, 0xa3, 0x20, 0xe2, 0x9b, 0x00, 0x8d, 0x9b, - 0xa0, 0xd6, 0x74, 0xd2, 0xde, 0xf6, 0x57, 0x80, 0x9a, 0xb9, 0xaa, 0xb2, - 0xc7, 0x27, 0x0a, 0x73, 0xa4, 0x98, 0x82, 0x24, 0x3b, 0xd3, 0x95, 0x64, - 0xdd, 0x3e, 0xf8, 0x5c, 0x76, 0xf0, 0xc9, 0xd8, 0x2a, 0xfe, 0x9c, 0x19, - 0x37, 0x4e, 0x2a, 0x31, 0x0f, 0xc3, 0x2d, 0xc4, 0xe9, 0x79, 0x2e, 0x21, - 0x17, 0x1f, 0x52, 0xce, 0xb2, 0x65, 0xa5, 0x44, 0x02, 0x4d, 0xee, 0x35, - 0x6f, 0x58, 0x13, 0xdc, 0xae, 0x8a, 0xfb, 0x85, 0xf5, 0xf6, 0x13, 0x53, - 0x65, 0x2f, 0x85, 0x9a, 0xdc, 0xfe, 0x3b, 0x92, 0x43, 0xb1, 0x7d, 0x54, - 0xf9, 0x12, 0x09, 0xbc, 0x8d, 0xd7, 0x3a, 0x47, 0x93, 0xfb, 0xa9, 0xec, - 0x61, 0xa5, 0xf4, 0xdd, 0xa7, 0x92, 0xaf, 0x2b, 0x7a, 0x06, 0x88, 0xc3, - 0xce, 0x7b, 0xb8, 0xa9, 0x9b, 0x3f, 0xfa, 0x5e, 0xc7, 0x02, 0xbc, 0x40, - 0x2f, 0xd8, 0xe9, 0xaf, 0x83, 0x5f, 0xd4, 0xb2, 0x47, 0xa7, 0x21, 0xfd, - 0xdf, 0x14, 0x28, 0x2d, 0xee, 0xd3, 0x31, 0x36, 0x11, 0x17, 0x69, 0xd6, - 0xb7, 0x79, 0x8f, 0x10, 0x14, 0xb0, 0xcd, 0x71, 0x9f, 0xc0, 0x31, 0xdb, - 0x81, 0x63, 0x7b, 0xce, 0xce, 0xa9, 0xc7, 0x16, 0x3c, 0xe3, 0x30, 0xca, - 0xdf, 0x56, 0xa9, 0xcf, 0x18, 0x30, 0xee, 0x0a, 0x33, 0xc9, 0x89, 0x98, - 0x52, 0xf9, 0x3a, 0x1a, 0xf2, 0x65, 0xa5, 0x97, 0x8f, 0x70, 0x91, 0xd6, - 0x7c, 0xf1, 0x86, 0x0c, 0xc8, 0x55, 0xcc, 0xf5, 0xd4, 0x38, 0xda, 0x69, - 0xdd, 0xc4, 0xbe, 0x4d, 0x96, 0x76, 0xc3, 0x0a, 0xcb, 0x5d, 0xc3, 0xba, - 0x09, 0xb7, 0x7a, 0xa5, 0xaa, 0xc8, 0x90, 0x7f, 0x8d, 0x1f, 0x79, 0x33, - 0x3e, 0x4e, 0x95, 0x21, 0xbf, 0x18, 0x7e, 0x79, 0x1a, 0xc4, 0x33, 0x39, - 0x0c, 0x09, 0x63, 0x7d, 0x02, 0x4a, 0x5c, 0x07, 0xaf, 0x2b, 0xe9, 0xbf, - 0x67, 0x81, 0x70, 0xe8, 0x70, 0x1e, 0x47, 0xc0, 0xb2, 0x60, 0xb5, 0xcb, - 0xbc, 0x70, 0x9f, 0x4f, 0x45, 0x27, 0xde, 0x76, 0x56, 0x89, 0xfd, 0x14, - 0x23, 0xa3, 0x9c, 0xb7, 0xc5, 0x03, 0x3f, 0x43, 0xd1, 0xb9, 0xe5, 0x42, - 0x92, 0x60, 0xfc, 0x83, 0x3b, 0x40, 0x3f, 0x33, 0x60, 0xc5, 0x47, 0x18, - 0xe6, 0xbd, 0xbe, 0x2a, 0x3c, 0x65, 0x69, 0x42, 0x38, 0xd8, 0x8a, 0x21, - 0x3c, 0xaa, 0xb4, 0x0a, 0xfc, 0x27, 0x16, 0x7c, 0x76, 0x83, 0xfd, 0xb3, - 0x5c, 0xd1, 0x83, 0xfc, 0xb6, 0xf0, 0x45, 0xd1, 0x14, 0x24, 0xaa, 0x9f, - 0xa6, 0x83, 0x2e, 0x52, 0xa0, 0x4e, 0xe8, 0x95, 0xca, 0x7f, 0x38, 0x51, - 0xbf, 0xce, 0x2d, 0x27, 0x2d, 0x6c, 0x83, 0xee, 0x31, 0xa7, 0x25, 0xea, - 0xa8, 0xf1, 0x51, 0x0e, 0x93, 0x5c, 0x72, 0xf2, 0x7c, 0xe7, 0x2d, 0xd8, - 0xb8, 0x92, 0x64, 0xbd, 0x7f, 0x1b, 0x58, 0xc9, 0xe8, 0x85, 0x6f, 0x35, - 0x2c, 0x38, 0x2b, 0xce, 0xfc, 0x62, 0xf4, 0x3f, 0x8c, 0xe0, 0x0f, 0x33, - 0xb0, 0x10, 0x3d, 0x97, 0x2c, 0xaa, 0xd4, 0xc7, 0x80, 0x08, 0x9b, 0x11, - 0xaf, 0x57, 0x50, 0x87, 0x13, 0x31, 0x07, 0x37, 0xad, 0xb1, 0x2e, 0x5d, - 0x48, 0x7f, 0x8a, 0xef, 0x79, 0xdb, 0xf7, 0x7f, 0xf9, 0x54, 0x89, 0x68, - 0xe3, 0xd7, 0x2b, 0xe9, 0x5b, 0x26, 0x1a, 0x33, 0x5e, 0xbc, 0xb2, 0x83, - 0x64, 0xca, 0x15, 0x6b, 0x5b, 0xbe, 0x40, 0x1b, 0x0b, 0xee, 0x41, 0xdc, - 0xe2, 0xd4, 0xba, 0xcc, 0xe4, 0xcf, 0x7a, 0x29, 0xb8, 0x36, 0xb5, 0x87, - 0x73, 0x5c, 0x8a, 0x14, 0x7d, 0xad, 0x4a, 0x45, 0x9c, 0xd1, 0xb1, 0xdb, - 0x8b, 0xbd, 0x24, 0xed, 0xd0, 0xac, 0x9f, 0x5f, 0x07, 0xe8, 0x7d, 0x55, - 0x64, 0xa7, 0x8f, 0x98, 0x3a, 0xc4, 0xc3, 0x92, 0x98, 0x5b, 0x51, 0x1e, - 0x3d, 0x2e, 0x81, 0x43, 0x33, 0x06, 0x61, 0x80, 0x5c, 0xde, 0x47, 0x7e, - 0x51, 0xc9, 0x98, 0x08, 0x9a, 0xf0, 0xc5, 0x74, 0xdb, 0x1c, 0x41, 0x40, - 0x5a, 0x5b, 0x1d, 0x71, 0xf8, 0x4f, 0xf6, 0x66, 0x41, 0xb5, 0x96, 0x25, - 0xf0, 0x50, 0xb5, 0x33, 0xc7, 0xb4, 0xe9, 0x54, 0x67, 0x42, 0xb6, 0x70, - 0x95, 0xab, 0x9c, 0xca, 0xae, 0x28, 0x8f, 0xd5, 0x8d, 0x92, 0xee, 0x64, - 0xf4, 0x38, 0x0c, 0xf3, 0xaf, 0x81, 0xa1, 0x59, 0x6c, 0x87, 0x4f, 0x20, - 0xf5, 0x4c, 0x29, 0x85, 0x51, 0xbe, 0xc0, 0xee, 0x29, 0x02, 0x72, 0xb1, - 0x86, 0x11, 0xf4, 0xad, 0x37, 0x45, 0xfe, 0x24, 0x93, 0x51, 0x9a, 0x74, - 0x41, 0xc0, 0x3f, 0xf8, 0x66, 0xeb, 0xe4, 0x34, 0xac, 0x2e, 0xfc, 0x76, - 0x24, 0x56, 0x3a, 0x7a, 0x0b, 0x19, 0x08, 0xf8, 0xe7, 0x3c, 0xde, 0xfd, - 0xa3, 0x1d, 0x71, 0x5a, 0xe4, 0x92, 0x16, 0x42, 0xa2, 0x93, 0xcc, 0xa9, - 0x4f, 0x67, 0x97, 0xd1, 0xc7, 0x3b, 0x7a, 0xdb, 0x87, 0x17, 0xc0, 0xc8, - 0x4d, 0x29, 0x1d, 0xd8, 0xbd, 0xb1, 0x3a, 0x80, 0xd1, 0xf8, 0x40, 0xf6, - 0x2d, 0x0c, 0x8f, 0x49, 0x79, 0x10, 0xaa, 0x66, 0x87, 0x21, 0x2f, 0x0e, - 0x05, 0xfb, 0xdc, 0x3d, 0x46, 0xba, 0xe2, 0xeb, 0xa3, 0x76, 0x08, 0xaf, - 0x70, 0x85, 0x3e, 0x23, 0x02, 0x46, 0xf4, 0xbd, 0xb4, 0x07, 0xe5, 0xb0, - 0x37, 0xf9, 0x97, 0x35, 0x78, 0xe6, 0xf8, 0xb4, 0x33, 0xd1, 0x96, 0xcc, - 0xc8, 0xfd, 0x5a, 0x0a, 0xee, 0x31, 0x03, 0x49, 0x7c, 0x9f, 0xfd, 0xa2, - 0xde, 0xa7, 0x18, 0x7d, 0xfc, 0x5c, 0x23, 0x97, 0x66, 0x70, 0x2b, 0x7f, - 0x53, 0x98, 0xc1, 0x4e, 0x68, 0x4d, 0xce, 0x75, 0x42, 0xe7, 0x65, 0x33, - 0xd1, 0xcd, 0x52, 0x56, 0xca, 0x8b, 0x68, 0x96, 0xa2, 0x40, 0x30, 0x91, - 0x2b, 0x87, 0x15, 0x10, 0x1f, 0xde, 0x7a, 0x48, 0xea, 0xee, 0xc4, 0x84, - 0x56, 0x3c, 0x92, 0xd7, 0xc2, 0xf6, 0xa1, 0x38, 0x52, 0x7a, 0x02, 0xdf, - 0x32, 0xa9, 0xe9, 0xf8, 0x72, 0x1d, 0x46, 0x86, 0x46, 0xa3, 0xb6, 0x96, - 0x8e, 0x91, 0x3f, 0x29, 0x48, 0x0b, 0x2b, 0x88, 0xd0, 0x11, 0xf5, 0xfd, - 0xab, 0xdb, 0x6c, 0xb4, 0xbd, 0x4a, 0x15, 0x28, 0x04, 0x61, 0xf0, 0x2d, - 0xb6, 0x82, 0xc5, 0xbe, 0x0b, 0x4a, 0xdf, 0x1a, 0x1a, 0x02, 0xf1, 0x6d, - 0xfa, 0x17, 0xdd, 0x4d, 0xa2, 0x69, 0xf7, 0xad, 0x71, 0x19, 0xbe, 0x52, - 0x8e, 0xb9, 0xb6, 0x2e, 0x10, 0x63, 0xaf, 0x95, 0x7b, 0x6f, 0x13, 0xe1, - 0x2a, 0xb7, 0x26, 0xb0, 0x6f, 0xee, 0xf2, 0x36, 0x1e, 0xe6, 0xec, 0x5b, - 0xfe, 0x1c, 0xa8, 0xcb, 0x0d, 0xc3, 0x15, 0x10, 0x1f, 0xde, 0x7a, 0x48, - 0xea, 0xee, 0xc4, 0x84, 0x56, 0x3c, 0x92, 0xd7, 0xc2, 0xf6, 0xa1, 0x38, - 0x52, 0x7a, 0x02, 0xdf, 0x32, 0xa9, 0xe9, 0xf8, 0xde, 0x0e, 0x2e, 0x30, - 0x77, 0xd7, 0x77, 0x64, 0xd9, 0xcf, 0x34, 0x18, 0xb1, 0x5e, 0x48, 0xe1, - 0xf1, 0x8e, 0x76, 0x5e, 0x71, 0xcb, 0x90, 0x92, 0xa0, 0xcd, 0x2b, 0x6f, - 0x4c, 0x27, 0xa8, 0x1f, 0x57, 0x97, 0xce, 0xe2, 0x23, 0xd2, 0x15, 0x37, - 0xfb, 0x0d, 0x36, 0xd8, 0x04, 0xa8, 0x79, 0x47, 0x09, 0xb1, 0xdb, 0xb1, - 0xbb, 0x3b, 0xdb, 0xd5, 0x0a, 0xdb, 0xa9, 0xb1, 0xc7, 0x4a, 0x6b, 0x20, - 0x6b, 0x7e, 0x54, 0x89, 0x2a, 0xc6, 0x34, 0x7a, 0xf2, 0x9c, 0xb0, 0xf4, - 0x45, 0xd8, 0x50, 0x92, 0x1d, 0x65, 0x79, 0xd9, 0x35, 0x45, 0x8d, 0x12, - 0x93, 0xcb, 0x24, 0x3a, 0x12, 0x67, 0xc9, 0x1c, 0x56, 0x46, 0x67, 0xfb, - 0x2b, 0xce, 0x8d, 0xec, 0x69, 0x3a, 0x1f, 0x50, 0xac, 0x20, 0x21, 0xab, - 0x05, 0x00, 0x97, 0x91, 0x9b, 0x86, 0x7e, 0x71, 0xbd, 0x8b, 0xfe, 0x57, - 0x6d, 0x5d, 0xc7, 0x4e, 0x13, 0x00, 0xd0, 0x80, 0x5e, 0x00, 0x63, 0x2c, - 0x26, 0xf4, 0xa1, 0xd5, 0xda, 0xd2, 0x85, 0xc7, 0x89, 0x5f, 0xf6, 0x43, - 0xb5, 0xc8, 0xae, 0x5d, 0xe1, 0xff, 0xbc, 0xf7, 0x4f, 0x22, 0xfe, 0x85, - 0x02, 0x7d, 0x4c, 0xc6, 0x33, 0xb9, 0xc4, 0xb1, 0x59, 0x31, 0x37, 0x5c, - 0x5d, 0x5d, 0xcd, 0xce, 0x90, 0x45, 0x96, 0x90, 0x0e, 0x6a, 0x97, 0x11, - 0xed, 0x55, 0x91, 0xfb, 0x4d, 0xe3, 0xcc, 0xb2, 0xda, 0x1d, 0x9b, 0x8a, - 0x6c, 0x03, 0x89, 0xcd, 0x07, 0x2b, 0x02, 0xbb, 0x45, 0xd4, 0xe0, 0x1b, - 0x40, 0xee, 0x21, 0xf7, 0xec, 0xce, 0x5e, 0xf1, 0xf0, 0xd0, 0x73, 0x0a, - 0x14, 0xd0, 0x97, 0x3b, 0x80, 0xdc, 0x49, 0xd6, 0x50, 0x3c, 0xe4, 0x23, - 0x81, 0x9a, 0x67, 0x44, 0x70, 0xed, 0x2e, 0x22, 0xb2, 0x3f, 0xde, 0x0b, - 0x9a, 0x9a, 0xe9, 0x7f, 0xf6, 0x3c, 0x5b, 0xfe, 0x58, 0x18, 0xc7, 0x0d, - 0xf4, 0xb4, 0x8a, 0x21, 0x3b, 0x6f, 0x08, 0xef, 0xb9, 0x10, 0x0e, 0xb4, - 0x69, 0xcf, 0x37, 0x16, 0x0f, 0xcd, 0xa0, 0xf8, 0x2e, 0xef, 0x24, 0x9e, - 0x79, 0xae, 0x61, 0x2f, 0x18, 0x11, 0x78, 0xb6, 0x26, 0x76, 0x00, 0xd9, - 0xfd, 0x7c, 0x5f, 0xd3, 0xe0, 0xa1, 0xcd, 0x8f, 0x2b, 0x3a, 0x08, 0x7b, - 0x4e, 0x34, 0x9b, 0xd2, 0xf5, 0xc8, 0xec, 0xdf, 0x96, 0x59, 0x28, 0x99, - 0xa5, 0x61, 0xf0, 0x0c, 0xa7, 0x80, 0x66, 0xe0, 0xb6, 0x23, 0x20, 0x43, - 0x14, 0x41, 0x17, 0xd4, 0x20, 0xc8, 0x40, 0x98, 0x31, 0x30, 0x1a, 0xf5, - 0xa2, 0x5d, 0x66, 0xd3, 0xe9, 0xdf, 0x4e, 0x2f, 0x89, 0xd4, 0x9d, 0x27, - 0xe1, 0xd9, 0x68, 0x0a, 0x58, 0xfb, 0x86, 0xc6, 0x0b, 0x80, 0x05, 0x0d, - 0x0b, 0x2a, 0xff, 0xae, 0x90, 0x16, 0xe1, 0xb2, 0xdb, 0x1b, 0x6d, 0xad, - 0x98, 0x9e, 0xb3, 0xd4, 0x74, 0xf4, 0xfc, 0x72, 0xb1, 0x2c, 0x87, 0x88, - 0x95, 0xd0, 0x37, 0xf0, 0xcd, 0x18, 0x22, 0x3b, 0xa5, 0x9b, 0xb2, 0x00, - 0xd6, 0xaf, 0x02, 0xad, 0x1a, 0xee, 0x1b, 0xe4, 0x2e, 0xa8, 0xd3, 0xa4, - 0xd5, 0x6a, 0x08, 0x1e, 0x3c, 0xa0, 0xff, 0x87, 0xcd, 0x76, 0x43, 0x41, - 0x0f, 0x4c, 0xd7, 0xd8, 0xb4, 0x2b, 0xeb, 0x73, 0xb3, 0x67, 0x83, 0xce, - 0x7f, 0xbd, 0x2f, 0x21, 0x6a, 0x31, 0x23, 0xac, 0xc6, 0x94, 0xf7, 0x07, - 0x12, 0x52, 0xfe, 0xc6, 0x17, 0xe4, 0xfc, 0x2a, 0xc5, 0x86, 0xee, 0xab, - 0x5c, 0xaa, 0x7b, 0x83, 0x2a, 0x6f, 0xbb, 0xde, 0xee, 0x0a, 0x38, 0xd0, - 0xf1, 0xba, 0x5c, 0x40, 0x91, 0xc6, 0x44, 0xb3, 0xcf, 0x80, 0x61, 0x45, - 0x41, 0xb5, 0x9d, 0xa6, 0x07, 0x08, 0xdb, 0x75, 0x97, 0xf9, 0x8a, 0xc0, - 0xbd, 0x13, 0xd7, 0x21, 0x44, 0x9f, 0x78, 0x4a, 0x8c, 0x39, 0xfc, 0x12, - 0xb8, 0xf9, 0x7b, 0x48, 0x7f, 0xa7, 0xde, 0x13, 0xea, 0x10, 0xe9, 0xc2, - 0xdc, 0x3c, 0xe5, 0x08, 0xa1, 0xc6, 0x2b, 0x2b, 0xb3, 0x65, 0xc1, 0x8c, - 0x0d, 0x00, 0xb3, 0xa1, 0x5f, 0x32, 0x01, 0x59, 0x60, 0x71, 0xc7, 0x15, - 0x6d, 0x11, 0x97, 0x72, 0xd1, 0x2e, 0x46, 0x60, 0xf2, 0x64, 0xed, 0x3f, - 0x52, 0xe3, 0xde, 0xf6, 0x78, 0xa1, 0x30, 0x90, 0xa2, 0x02, 0xae, 0xca, - 0x2a, 0x0a, 0x75, 0x3e, 0xc0, 0xb0, 0x6f, 0x9f, 0x94, 0x4f, 0x9d, 0xc9, - 0xd7, 0xde, 0xa9, 0xaa, 0x27, 0xff, 0xa3, 0xb4, 0xf8, 0x2c, 0x9e, 0x91, - 0xfd, 0xc4, 0xf6, 0xe3, 0x83, 0x38, 0x7c, 0xf8, 0xee, 0x17, 0x46, 0x09, - 0x60, 0x4a, 0xe7, 0xcf, 0x44, 0xd9, 0x9c, 0x26, 0xce, 0x1f, 0xa9, 0xf6, - 0xce, 0x9a, 0x75, 0x68, 0x36, 0xa5, 0x34, 0x8d, 0xfc, 0x48, 0xaa, 0xad, - 0x42, 0x77, 0x79, 0x2d, 0xa0, 0x2d, 0x3c, 0x37, 0x83, 0x23, 0xbc, 0x28, - 0xff, 0xea, 0xde, 0x33, 0x2d, 0x5e, 0x18, 0x80, 0x95, 0xee, 0x11, 0x88, - 0x40, 0x80, 0x01, 0x3d, 0x93, 0xd9, 0x0b, 0x44, 0x4d, 0xa3, 0x3e, 0xe4, - 0xf7, 0xf0, 0x71, 0xfa, 0xd5, 0x1f, 0xaf, 0x81, 0x7c, 0x69, 0x1c, 0xac, - 0x8b, 0xd1, 0x91, 0xd4, 0x9a, 0x07, 0xbe, 0x46, 0xa3, 0xcd, 0x37, 0x4f, - 0xd4, 0x43, 0xec, 0x4e, 0x74, 0xcc, 0x21, 0x84, 0xd7, 0x54, 0x30, 0x85, - 0xfd, 0x69, 0x66, 0x10, 0xaa, 0x7d, 0x90, 0x70, 0xcd, 0x33, 0x65, 0x7d, - 0xf1, 0x5e, 0x8d, 0xed, 0x2d, 0xd3, 0x41, 0x02, 0xec, 0x8e, 0xa2, 0xa6, - 0xb5, 0x07, 0x6d, 0x52, 0xe3, 0x44, 0x5f, 0xf0, 0x10, 0xa1, 0x09, 0x22, - 0xce, 0x0a, 0x26, 0x95, 0xf0, 0x70, 0xc0, 0x43, 0xd9, 0x1b, 0x0e, 0x0b, - 0x57, 0x13, 0x2d, 0x2c, 0x00, 0x78, 0x83, 0xff, 0xe8, 0x48, 0x9d, 0x9a, - 0xcf, 0xe0, 0xae, 0xff, 0x6c, 0x20, 0xab, 0x6b, 0xa8, 0xe2, 0x8f, 0xc2, - 0xa8, 0xdc, 0x93, 0x0b, 0xe1, 0xd0, 0x27, 0x9e, 0xe5, 0x49, 0xa8, 0xd8, - 0x3b, 0x61, 0x13, 0x85, 0x08, 0x88, 0x26, 0x55, 0x66, 0xa2, 0x1f, 0x30, - 0x7b, 0xe4, 0x7b, 0x3a, 0xe0, 0xaf, 0x09, 0xb3, 0xd6, 0xa6, 0xc8, 0x22, - 0x85, 0x52, 0x7e, 0xc1, 0xbd, 0xec, 0x7c, 0xdc, 0x03, 0x12, 0x50, 0x15, - 0x95, 0x06, 0x8e, 0xf2, 0x15, 0x46, 0xb5, 0x38, 0xca, 0xca, 0x17, 0x85, - 0x21, 0x4c, 0x5a, 0x14, 0x8e, 0xc7, 0xdb, 0xd0, 0x82, 0x21, 0x1f, 0x7d, - 0x4a, 0x9c, 0xd6, 0x23, 0xc9, 0x4b, 0x41, 0x18, 0x39, 0xcd, 0x8a, 0xec, - 0x65, 0x78, 0x44, 0xf0, 0x3a, 0xbd, 0x15, 0xfb, 0xfd, 0xab, 0xe0, 0x25, - 0x44, 0x4e, 0x0b, 0x11, 0xda, 0xaf, 0xbf, 0x2b, 0x00, 0xdb, 0x78, 0xcf, - 0x54, 0xf2, 0x93, 0xab, 0x90, 0x76, 0xde, 0xc6, 0xc9, 0x04, 0x89, 0x06, - 0x33, 0xee, 0xfd, 0x91, 0xa9, 0x09, 0xf1, 0xde, 0x78, 0x24, 0x32, 0x82, - 0x33, 0x29, 0x92, 0x09, 0x99, 0x7e, 0xda, 0x65, 0x47, 0x8f, 0xf7, 0x59, - 0xa8, 0x7d, 0xe5, 0xef, 0x05, 0x3d, 0xa3, 0x0f, 0x9b, 0x1c, 0x76, 0x29, - 0xf7, 0xc0, 0x6b, 0x35, 0x9f, 0xba, 0x09, 0xc9, 0x98, 0x86, 0x80, 0xf4, - 0x9b, 0xd7, 0x60, 0x71, 0xcc, 0x4b, 0x8d, 0x32, 0x68, 0x3d, 0x63, 0x29, - 0x3d, 0xd0, 0xa0, 0xf0, 0xf3, 0x8c, 0x70, 0xd9, 0xf2, 0x28, 0x53, 0xd7, - 0xbd, 0x30, 0x6d, 0xe0, 0xd6, 0x59, 0xc3, 0x0c, 0x9c, 0x19, 0xac, 0xd1, - 0x02, 0xb1, 0x44, 0xfd, 0xca, 0x30, 0x14, 0xbf, 0xca, 0x7a, 0xd1, 0x0b, - 0xa5, 0xfa, 0x81, 0x6d, 0x92, 0x70, 0x81, 0x57, 0x9b, 0x1a, 0x20, 0x03, - 0xa6, 0x5a, 0x05, 0x92, 0x2a, 0x70, 0xa5, 0xcd, 0x69, 0x56, 0x46, 0x53, - 0x60, 0x92, 0x88, 0x35, 0xac, 0x54, 0x67, 0x9a, 0xc6, 0xcf, 0xf3, 0xd9, - 0xfe, 0xb7, 0x00, 0x1b, 0x3a, 0xf2, 0xaf, 0x89, 0x07, 0xdb, 0x22, 0x4c, - 0xc6, 0x4b, 0xdf, 0xc2, 0x13, 0x11, 0x11, 0xb0, 0x09, 0x69, 0x88, 0x90, - 0x3a, 0xbd, 0xe9, 0x7e, 0x4b, 0xdf, 0x22, 0x3b, 0xfb, 0x32, 0x7a, 0x22, - 0xc5, 0xf3, 0xd0, 0x8a, 0xb3, 0x0a, 0x8d, 0x25, 0x93, 0xe1, 0x1f, 0xc6, - 0xe5, 0x3e, 0xd2, 0x6b, 0x71, 0x1d, 0xc9, 0x4a, 0x6d, 0xb5, 0x2c, 0x7d, - 0x75, 0x18, 0xf4, 0x54, 0xad, 0x50, 0xd9, 0x8e, 0x08, 0x93, 0xb5, 0x25, - 0xf6, 0xa4, 0x10, 0xa0, 0xb2, 0x93, 0xa7, 0xb8, 0x42, 0x80, 0x1f, 0x85, - 0xa7, 0xbb, 0x86, 0x3b, 0x55, 0x55, 0x86, 0x97, 0x05, 0x21, 0xb7, 0x8b, - 0x9f, 0xc2, 0xd1, 0x43, 0xd1, 0x0b, 0x06, 0x35, 0x48, 0x6c, 0x45, 0xac, - 0xae, 0x46, 0x00, 0x91, 0x0f, 0x2c, 0x64, 0x84, 0x91, 0xa1, 0xe4, 0x92, - 0x1a, 0xfd, 0xbd, 0xb6, 0x23, 0xc6, 0x13, 0xe2, 0x6d, 0xd6, 0xa0, 0xd3, - 0xab, 0x4d, 0xb9, 0x8c, 0xcf, 0x3f, 0xf9, 0x29, 0xbb, 0xce, 0x14, 0xb4, - 0x9f, 0xfc, 0x7e, 0x43, 0x4a, 0x4a, 0x77, 0x2d, 0x11, 0x41, 0x74, 0x32, - 0x8d, 0x20, 0x73, 0xe5, 0x6e, 0xf1, 0xc1, 0xaf, 0xf2, 0x0d, 0x00, 0xee, - 0xb1, 0x68, 0xff, 0xfe, 0x12, 0x58, 0xe7, 0x79, 0xa6, 0xfd, 0x6b, 0x20, - 0xd6, 0x01, 0x56, 0x10, 0x69, 0x65, 0xa6, 0xc4, 0xa8, 0x69, 0x99, 0x47, - 0x3e, 0xe1, 0xf5, 0x87, 0xf5, 0xbe, 0x4c, 0x07, 0x19, 0x5b, 0xa7, 0xbb, - 0xce, 0x76, 0xfc, 0x9f, 0xbd, 0xe2, 0xb1, 0x7c, 0x38, 0xc3, 0x20, 0xc0, - 0x1c, 0x2b, 0x59, 0x22, 0x54, 0xf9, 0x45, 0x2f, 0x1a, 0xf1, 0x2b, 0x75, - 0x5a, 0xf4, 0x90, 0xef, 0x80, 0xb9, 0x8e, 0xdd, 0xf5, 0x75, 0x3e, 0xe2, - 0xc6, 0xa4, 0x0f, 0xf0, 0x17, 0x5a, 0x8a, 0xa3, 0x0d, 0x95, 0x18, 0x1e, - 0x85, 0xb4, 0x64, 0xef, 0x6e, 0xf1, 0xc1, 0xaf, 0xf2, 0x0d, 0x00, 0xc6, - 0xb1, 0x68, 0xff, 0xfe, 0x12, 0x69, 0xe7, 0x79, 0x97, 0x55, 0x76, 0x0d, - 0xf4, 0xf0, 0x08, 0x43, 0x32, 0x0b, 0x0b, 0x3f, 0x23, 0x37, 0xf1, 0xef, - 0xb5, 0x8b, 0xe1, 0x2f, 0xd7, 0x84, 0xbd, 0xee, 0xfe, 0x34, 0xed, 0xf5, - 0xa6, 0x6e, 0xf0, 0xac, 0xdf, 0x1e, 0x36, 0x69, 0x1d, 0xf6, 0x79, 0x31, - 0xca, 0x2a, 0xae, 0x2d, 0x28, 0xd9, 0x0b, 0xfb, 0x93, 0x9e, 0xa0, 0x36, - 0xb5, 0xd1, 0x50, 0x50, 0xca, 0x43, 0x28, 0x7d, 0x90, 0x4f, 0x5c, 0xe0, - 0xb5, 0xe5, 0xce, 0x10, 0x17, 0x3b, 0x67, 0xac, 0xaa, 0x07, 0x2a, 0x7f, - 0xa9, 0x98, 0xc4, 0x05, 0xb8, 0xca, 0xb4, 0x0a, 0x41, 0x28, 0x9e, 0x69, - 0x98, 0x04, 0x37, 0x39, 0x06, 0x72, 0xd2, 0xcf, 0xdc, 0xaa, 0x21, 0xb8, - 0x3b, 0xee, 0xa5, 0xcf, 0x20, 0x54, 0x12, 0x52, 0x12, 0xed, 0xc2, 0xc2, - 0xe5, 0x36, 0x36, 0xa4, 0x13, 0xd3, 0x6d, 0xa4, 0x94, 0xe5, 0x4a, 0xd5, - 0xdb, 0x46, 0x0c, 0xac, 0xd1, 0x59, 0xfb, 0xf8, 0x05, 0x81, 0x79, 0x38, - 0x18, 0xcf, 0xb5, 0x3e, 0xab, 0xbf, 0x58, 0x01, 0x80, 0x38, 0xc0, 0x6a, - 0x01, 0x4e, 0x3f, 0x84, 0x19, 0x84, 0x7b, 0xb6, 0x07, 0xf3, 0x36, 0x59, - 0x5c, 0x97, 0x31, 0x6e, 0x86, 0xe7, 0x27, 0xd7, 0xf4, 0xfb, 0x98, 0x85, - 0xb4, 0x4a, 0x1a, 0xb6, 0x8c, 0xbc, 0x05, 0xf0, 0x02, 0x72, 0x36, 0xbd, - 0xd4, 0xa6, 0x6d, 0x5a, 0xf2, 0xe9, 0xe1, 0x19, 0x48, 0x0f, 0xc7, 0xa9, - 0xd9, 0x73, 0x4b, 0x78, 0xad, 0xb2, 0x52, 0xd5, 0xe1, 0xa0, 0x0f, 0xaf, - 0xee, 0x91, 0xbb, 0xaa, 0x43, 0x34, 0x71, 0x1b, 0x05, 0xc2, 0xda, 0xa3, - 0xc3, 0xc0, 0x77, 0x71, 0xdd, 0xe2, 0x49, 0xca, 0x84, 0xf7, 0xe0, 0xe6, - 0x37, 0xb2, 0x5d, 0xc8, 0xcb, 0x8c, 0x11, 0xb4, 0x97, 0xe8, 0x4d, 0xf6, - 0x9c, 0x4e, 0x39, 0x63, 0xad, 0xbf, 0x30, 0x8a, 0x38, 0xf4, 0xcf, 0xcc, - 0xf3, 0xab, 0xe3, 0xf0, 0xff, 0x72, 0xe5, 0x68, 0x83, 0x31, 0x10, 0x98, - 0xff, 0x27, 0xe0, 0xca, 0xf4, 0x87, 0x64, 0xb6, 0xdd, 0xf4, 0x60, 0x17, - 0xf5, 0x40, 0xdf, 0x59, 0x55, 0x3e, 0x6c, 0x49, 0x90, 0xae, 0xcc, 0xa6, - 0xdb, 0x9b, 0x90, 0x39, 0x2a, 0x00, 0xd0, 0x3c, 0x35, 0xc4, 0xd9, 0x46, - 0xf2, 0x5b, 0xb5, 0xae, 0xda, 0x97, 0x93, 0xb9, 0x0b, 0x77, 0x7e, 0xb9, - 0xb7, 0xcc, 0xbc, 0x5f, 0xa7, 0xfc, 0xdf, 0xde, 0x7c, 0xba, 0x9f, 0xad, - 0x0e, 0x34, 0x7c, 0x2b, 0x7a, 0x13, 0xe4, 0xcc, 0x3c, 0x57, 0x7d, 0xcf, - 0x6d, 0xa7, 0xc9, 0xb5, 0xa2, 0x7e, 0x98, 0xcf, 0x01, 0xd9, 0xd9, 0xa7, - 0xd1, 0x1c, 0xe2, 0xa5, 0xfd, 0x2b, 0x2d, 0xb7, 0xab, 0xd3, 0x25, 0x77, - 0x4e, 0x46, 0x6f, 0x7e, 0x4a, 0x05, 0xa3, 0x72, 0x01, 0xf4, 0xc6, 0x88, - 0x50, 0xde, 0x69, 0x93, 0xe5, 0x95, 0x94, 0xa2, 0x35, 0x76, 0x08, 0xfe, - 0x00, 0x5e, 0x23, 0x62, 0x4f, 0xe6, 0x5d, 0x1a, 0x8b, 0x58, 0x0f, 0xc0, - 0xa8, 0x3c, 0x5a, 0x35, 0x02, 0xd2, 0x85, 0xd6, 0xcf, 0xa7, 0x3d, 0xe5, - 0x37, 0x9d, 0xd5, 0xa3, 0x0e, 0xe3, 0xa9, 0xe4, 0xe3, 0x97, 0xe3, 0xf3, - 0xdc, 0x3b, 0x29, 0xfe, 0x6b, 0x9b, 0xaf, 0xb2, 0xe4, 0xe8, 0x39, 0xb7, - 0xd7, 0xe5, 0xb3, 0xdb, 0x8a, 0x55, 0xcb, 0xee, 0x85, 0x1d, 0xcb, 0x8f, - 0x6a, 0xfb, 0xa9, 0x7d, 0x6b, 0x1f, 0x28, 0x8e, 0x17, 0xad, 0x9b, 0xb4, - 0x83, 0x79, 0x2c, 0xfe, 0x4a, 0xb9, 0xa0, 0x1e, 0x38, 0xe2, 0xdf, 0x51, - 0x31, 0x54, 0xa4, 0x79, 0xf6, 0xe0, 0x50, 0xda, 0xe2, 0x59, 0x08, 0x87, - 0x1b, 0x95, 0x7c, 0x71, 0xcf, 0xdd, 0x62, 0x9f, 0x0d, 0x91, 0xd1, 0x93, - 0x40, 0x4d, 0x14, 0x03, 0x5e, 0xdf, 0xc0, 0x86, 0x51, 0x30, 0x59, 0xdc, - 0xa0, 0x07, 0x27, 0x17, 0x51, 0xb5, 0xb5, 0x8a, 0x1d, 0x0c, 0x3f, 0x5f, - 0xf1, 0x55, 0x9d, 0x35, 0x6b, 0x1a, 0x52, 0xbc, 0x6d, 0x1b, 0xe6, 0x1a, - 0x47, 0xbb, 0xdb, 0xce, 0x49, 0x12, 0x19, 0x75, 0x62, 0x42, 0xb5, 0xb3, - 0x93, 0x2d, 0x99, 0x83, 0xf7, 0x02, 0x0a, 0xd4, 0xdf, 0x77, 0x19, 0xdf, - 0x63, 0x69, 0x7b, 0x11, 0x1e, 0xb6, 0x4d, 0x6e, 0x08, 0x2c, 0x02, 0x46, - 0xe3, 0xf0, 0xba, 0xbe, 0x0c, 0xed, 0x24, 0x88, 0x21, 0x65, 0xb1, 0x40, - 0x77, 0x6a, 0x8c, 0xf8, 0xef, 0x87, 0x7b, 0xb7, 0x05, 0x1d, 0x8c, 0x1d, - 0x57, 0xf1, 0x53, 0x50, 0xaa, 0x05, 0x6e, 0xf9, 0x4a, 0xdb, 0x5e, 0x8e, - 0x49, 0x8c, 0xaf, 0x78, 0xb1, 0xec, 0xc5, 0x2d, 0xc8, 0x8a, 0x8d, 0xb3, - 0xfe, 0x56, 0x92, 0xcc, 0x6c, 0x6f, 0xd0, 0xb9, 0x15, 0x83, 0x50, 0xe4, - 0x23, 0x89, 0x59, 0x94, 0x7b, 0xe3, 0xdd, 0x3f, 0x23, 0xd1, 0xde, 0x5a, - 0xee, 0x88, 0x73, 0xd6, 0x26, 0x28, 0x7a, 0x43, 0xc5, 0xa7, 0x9f, 0x3e, - 0x27, 0x84, 0xfe, 0x7b, 0x3d, 0xa6, 0xd3, 0x7b, 0x23, 0x27, 0x06, 0x1d, - 0x9f, 0xca, 0xe6, 0x38, 0x0b, 0x7a, 0xf8, 0x10, 0x3a, 0xb9, 0xd6, 0xfa, - 0x79, 0xf6, 0xe5, 0x98, 0x6e, 0x97, 0x5d, 0x98, 0x09, 0xad, 0xe5, 0x15, - 0x99, 0x60, 0x05, 0x41, 0x59, 0xc8, 0xb5, 0x40, 0x63, 0x19, 0x4d, 0x71, - 0x42, 0xb8, 0xe6, 0x1f, 0xc5, 0x66, 0x8f, 0x53, 0xf4, 0x70, 0xb4, 0x3c, - 0x68, 0xef, 0xb3, 0x1a, 0xab, 0x09, 0xbf, 0x39, 0x14, 0xf0, 0xc4, 0xae, - 0x75, 0xc7, 0x6a, 0xf6, 0x8f, 0xde, 0xa3, 0x50, 0xf0, 0x80, 0x19, 0x71, - 0x9e, 0x57, 0x8f, 0x35, 0x68, 0x5d, 0x09, 0x2c, 0x34, 0x8b, 0x7d, 0x97, - 0xac, 0xe9, 0xb3, 0x57, 0xbd, 0xa1, 0xf9, 0xf8, 0x8a, 0x84, 0x70, 0xf4, - 0x6b, 0x4f, 0x38, 0xca, 0x86, 0x23, 0xc7, 0x73, 0xc8, 0xbe, 0x86, 0x3c, - 0x4c, 0xf2, 0x29, 0x90, 0xec, 0x3a, 0xc1, 0xbe, 0xea, 0xdc, 0x4b, 0x01, - 0x15, 0x1a, 0x3d, 0x8d, 0x6f, 0x4b, 0x34, 0x7d, 0xe6, 0x0e, 0xe9, 0x2f, - 0x93, 0xff, 0xef, 0x76, 0xd6, 0x52, 0x0e, 0x76, 0x76, 0x2e, 0xef, 0xcf, - 0x6f, 0xfa, 0x18, 0xff, 0x36, 0xdc, 0x0a, 0x47, 0x19, 0x51, 0x0a, 0x5a, - 0x9a, 0xde, 0x33, 0x5e, 0x49, 0x85, 0x3f, 0xbc, 0x7a, 0xa3, 0x88, 0x37, - 0xd4, 0x9d, 0x75, 0xb6, 0xb1, 0x7b, 0x25, 0xe1, 0x4e, 0x0e, 0xe4, 0x59, - 0x46, 0x5b, 0x1f, 0x1b, 0x3f, 0x5d, 0xb1, 0x7e, 0xbb, 0xc9, 0x70, 0x19, - 0x35, 0xc1, 0x23, 0x85, 0x08, 0xba, 0x1e, 0x6e, 0xaf, 0x95, 0x55, 0xcd, - 0xac, 0x2e, 0x7d, 0x1d, 0x52, 0xf2, 0x44, 0xcc, 0x77, 0xec, 0x27, 0x4e, - 0x2f, 0xe7, 0x30, 0x9e, 0x6e, 0x0e, 0x4a, 0x46, 0x88, 0xec, 0xc4, 0x0f, - 0x78, 0xbf, 0x30, 0xf2, 0xbe, 0x3e, 0x35, 0x46, 0x20, 0x32, 0xc9, 0xde, - 0xc9, 0x5e, 0x49, 0xf9, 0xc1, 0x62, 0xb8, 0xd3, 0xb3, 0x98, 0x87, 0x74, - 0xe7, 0xdc, 0x16, 0x62, 0xce, 0x1d, 0x8d, 0x34, 0x07, 0x00, 0x23, 0x24, - 0x01, 0xad, 0x31, 0x3a, 0x97, 0xcc, 0xd4, 0x9f, 0xcb, 0xe7, 0x9a, 0xce, - 0x9c, 0xff, 0xae, 0x0f, 0xef, 0x81, 0x6a, 0x52, 0x85, 0x63, 0x6c, 0x65, - 0xd6, 0x63, 0xdd, 0xa1, 0x2f, 0x0b, 0x1b, 0x4c, 0x4b, 0x90, 0xaa, 0xdf, - 0x5e, 0xc8, 0x10, 0x70, 0xbc, 0xfd, 0xcc, 0x93, 0xe8, 0xa4, 0xfa, 0xed, - 0x50, 0xf8, 0xfd, 0x98, 0x75, 0x19, 0x2a, 0xfc, 0x99, 0xaf, 0x91, 0x25, - 0xdd, 0x9d, 0xbc, 0x0c, 0x52, 0x8e, 0x64, 0x1f, 0x21, 0x56, 0xc9, 0x32, - 0x8c, 0x5b, 0xcb, 0xcd, 0xc6, 0x46, 0x9b, 0x25, 0xc4, 0x39, 0x3e, 0x57, - 0x1a, 0x25, 0x49, 0xf8, 0xf1, 0x13, 0xa9, 0xce, 0xb7, 0x1b, 0xdb, 0x81, - 0x12, 0xf2, 0xc0, 0xb0, 0xe7, 0x6d, 0xbc, 0x13, 0xa2, 0x14, 0x74, 0x8c, - 0x6e, 0xaa, 0x2e, 0x10, 0x0c, 0xcc, 0x5b, 0xae, 0x29, 0xe7, 0x36, 0x82, - 0x03, 0xc6, 0xc4, 0x69, 0x98, 0x7e, 0xc0, 0x3a, 0xd3, 0x9b, 0x9d, 0x3a, - 0xee, 0xa8, 0x9b, 0x72, 0x21, 0x1a, 0x10, 0x65, 0xdd, 0x8f, 0x6e, 0x70, - 0xb5, 0xaf, 0xd7, 0xc1, 0xf6, 0x1c, 0x19, 0x6e, 0x8d, 0xbe, 0x6a, 0x77, - 0x78, 0xb5, 0xcf, 0x2f, 0x71, 0xeb, 0xa1, 0x4e, 0xc2, 0x3e, 0x67, 0x45, - 0xfb, 0x1b, 0x61, 0x0d, 0x0a, 0x17, 0xc9, 0x55, 0x25, 0xb4, 0x6c, 0x4d, - 0xfe, 0x57, 0x90, 0x90, 0x5e, 0x8a, 0xa8, 0xab, 0xb3, 0xe2, 0xc4, 0x4b, - 0x20, 0x74, 0x8d, 0xe5, 0x70, 0x1d, 0x16, 0xbe, 0xc4, 0x93, 0x49, 0xf6, - 0x01, 0x57, 0x51, 0x73, 0x36, 0x4d, 0x66, 0x28, 0x89, 0xac, 0x72, 0x2d, - 0x19, 0x10, 0xa3, 0x96, 0x40, 0x5d, 0x40, 0x77, 0x47, 0xad, 0x7b, 0x80, - 0xd7, 0x03, 0x82, 0xec, 0x5f, 0x0e, 0xfd, 0x18, 0x93, 0x83, 0x78, 0x5f, - 0x66, 0x88, 0x8b, 0x66, 0xba, 0x08, 0xac, 0x9f, 0x72, 0xf8, 0x70, 0x6f, - 0xda, 0x13, 0x6e, 0x8c, 0x74, 0x56, 0xa8, 0xbd, 0x6f, 0xa6, 0x2e, 0xe9, - 0x28, 0xb1, 0x06, 0x2a, 0xff, 0xb7, 0x80, 0xee, 0x25, 0x76, 0xa0, 0x97, - 0xa2, 0xe4, 0x26, 0x5c, 0x6f, 0xbc, 0x9a, 0xee, 0x1c, 0x01, 0x80, 0x77, - 0xf1, 0x98, 0xf0, 0x42, 0x38, 0xe3, 0x43, 0x88, 0x92, 0x8a, 0x05, 0xd7, - 0x51, 0x90, 0x40, 0xe3, 0xc9, 0xfe, 0x8d, 0xf3, 0x83, 0x0e, 0x87, 0x5e, - 0x7b, 0xc3, 0x98, 0x40, 0xbf, 0xe4, 0x3b, 0x8e, 0xe6, 0x8a, 0x6c, 0xc0, - 0x7c, 0x36, 0x89, 0x7c, 0x88, 0xe4, 0x6b, 0xed, 0xa2, 0x53, 0x0b, 0x12, - 0x3a, 0x08, 0x91, 0x7d, 0x64, 0xb6, 0x8b, 0x77, 0x70, 0x92, 0xbd, 0xca, - 0x76, 0x51, 0xb5, 0x1f, 0x9a, 0x3e, 0xb6, 0x32, 0xf2, 0xb6, 0x51, 0xa5, - 0x73, 0xd9, 0x6c, 0x3f, 0xd3, 0x5e, 0xf4, 0x49, 0x23, 0xde, 0xe4, 0x58, - 0xfb, 0x99, 0xdb, 0x88, 0x69, 0xfb, 0x1a, 0x58, 0xb0, 0x22, 0x97, 0x21, - 0xcb, 0xf1, 0x43, 0xdc, 0x50, 0x51, 0xcb, 0x2b, 0x88, 0x22, 0x09, 0x14, - 0xb6, 0x13, 0x38, 0x27, 0x02, 0x6e, 0xff, 0xd2, 0xf0, 0xd1, 0x65, 0x34, - 0x3f, 0xf5, 0x50, 0xdf, 0x55, 0x38, 0xdc, 0x0f, 0xf8, 0x96, 0xe8, 0x5d, - 0xf6, 0x83, 0x23, 0x70, 0xa0, 0x4a, 0xde, 0x8d, 0xc8, 0x21, 0x9a, 0x7b, - 0x6c, 0x27, 0xe4, 0xb8, 0x07, 0xe8, 0xb5, 0x47, 0xd0, 0x14, 0x4e, 0x3f, - 0x51, 0x62, 0xcc, 0x3b, 0xc9, 0x26, 0x39, 0xe1, 0xb4, 0x63, 0x6a, 0xd2, - 0x7b, 0x29, 0x16, 0x93, 0xd7, 0x71, 0x2c, 0xe3, 0xed, 0x13, 0x40, 0x8e, - 0x9c, 0x44, 0xf0, 0x0c, 0xe0, 0x30, 0xbf, 0xb5, 0xf1, 0x10, 0xd2, 0xc1, - 0x8c, 0x09, 0x7f, 0x3c, 0x72, 0x31, 0xe6, 0x3c, 0x9e, 0xb9, 0xe2, 0x51, - 0xb6, 0xf5, 0x56, 0x89, 0x13, 0x61, 0xd4, 0x2d, 0x98, 0xaa, 0xa6, 0xfd, - 0x08, 0x4d, 0x2d, 0xb3, 0x13, 0x00, 0x87, 0x67, 0xfc, 0x0e, 0x78, 0x18, - 0x96, 0xdb, 0x8f, 0xbb, 0x47, 0x16, 0xbf, 0x21, 0x20, 0x0d, 0x2c, 0xa8, - 0xce, 0x14, 0x49, 0x37, 0xd9, 0x1e, 0xab, 0x98, 0xdf, 0x90, 0x6e, 0x9f, - 0x8c, 0xd0, 0xac, 0xf0, 0xdc, 0x45, 0xc9, 0xb5, 0x9c, 0x09, 0x4f, 0x1a, - 0x37, 0x0b, 0x4a, 0xc7, 0xac, 0x6d, 0xa9, 0xde, 0xc7, 0xf7, 0x9d, 0x39, - 0xd8, 0x58, 0x5d, 0xb3, 0x4c, 0x48, 0x00, 0xd7, 0x63, 0xa8, 0xd0, 0x66, - 0xa9, 0x5e, 0x52, 0xb4, 0x64, 0xf5, 0x77, 0x7c, 0xbd, 0x59, 0xfb, 0x08, - 0xc1, 0x24, 0x83, 0x51, 0x64, 0x51, 0x3f, 0xe9, 0x10, 0x3e, 0xfa, 0xe0, - 0x5b, 0x1f, 0x66, 0x31, 0x15, 0x2f, 0x2a, 0x8b, 0xa5, 0x6b, 0x9e, 0xd8, - 0x9d, 0x13, 0x47, 0x2b, 0x9f, 0x68, 0xf0, 0xac, 0x98, 0x07, 0x00, 0xa9, - 0x6f, 0xc8, 0xc6, 0xfe, 0xc6, 0x1c, 0xd1, 0x3c, 0xfa, 0x78, 0x0b, 0x26, - 0x0a, 0x42, 0x3a, 0xa1, 0xe1, 0x00, 0x26, 0x5e, 0x84, 0x52, 0x1d, 0xf0, - 0xad, 0x8e, 0xac, 0xc9, 0x10, 0x72, 0xa0, 0x73, 0x16, 0x0e, 0xe8, 0x1d, - 0x44, 0x21, 0xa6, 0xc2, 0x50, 0x43, 0x56, 0xf8, 0x71, 0x2e, 0x23, 0x38, - 0xfb, 0xd0, 0x12, 0xd4, 0x35, 0x1d, 0x24, 0x10, 0x7f, 0x3d, 0xd2, 0xba, - 0x4f, 0xea, 0x7b, 0x91, 0x73, 0x78, 0x27, 0xad, 0x3e, 0x31, 0xb8, 0x51, - 0x72, 0xbf, 0x46, 0x3c, 0x85, 0x93, 0xff, 0x4e, 0xee, 0xb3, 0x15, 0xdd, - 0xee, 0x06, 0x23, 0xe4, 0x47, 0xcd, 0x72, 0x9c, 0xf7, 0x91, 0xa2, 0xb6, - 0xc3, 0x1c, 0x5a, 0xaf, 0xf7, 0x80, 0xf1, 0xcd, 0xd9, 0x4b, 0x6a, 0x55, - 0x77, 0x7e, 0xaa, 0x87, 0x7b, 0xf1, 0xdd, 0xf9, 0xc2, 0x7c, 0xd8, 0x82, - 0x87, 0xc6, 0xf4, 0x59, 0xf0, 0x8c, 0x33, 0xab, 0x18, 0xbf, 0x35, 0x92, - 0x12, 0x8a, 0xa2, 0x2a, 0x17, 0xfb, 0x40, 0x75, 0xaa, 0xa5, 0x2b, 0x27, - 0xc5, 0x4d, 0xca, 0xb2, 0x40, 0x01, 0x07, 0xf6, 0x2c, 0xbd, 0x9e, 0x17, - 0xe3, 0xfe, 0x4c, 0xc4, 0xa6, 0xf7, 0x07, 0x35, 0x73, 0x61, 0xb2, 0xe1, - 0xb5, 0x95, 0x01, 0x3f, 0x8d, 0x6d, 0x4b, 0xbd, 0x7d, 0xba, 0xba, 0x8a, - 0xb1, 0x18, 0x29, 0x38, 0x7f, 0x3d, 0xd2, 0xb8, 0x4f, 0xea, 0x7b, 0x91, - 0x73, 0x78, 0x27, 0xad, 0x3e, 0x31, 0xb8, 0x51, 0x72, 0xbf, 0x46, 0x3c, - 0x85, 0x93, 0xff, 0x4e, 0xfa, 0xce, 0x84, 0xe6, 0xef, 0xcc, 0x67, 0x68, - 0xc5, 0x8b, 0xc4, 0x75, 0x2d, 0x75, 0x7b, 0xb1, 0xd9, 0xfc, 0x61, 0x6d, - 0xcb, 0xab, 0x7b, 0x79, 0xce, 0x4e, 0x5f, 0xdc, 0xca, 0x7d, 0x7a, 0x1a, - 0xcb, 0x06, 0xad, 0xe5, 0xbb, 0x14, 0xf5, 0xe8, 0xe6, 0xf8, 0xab, 0xc9, - 0xb0, 0x02, 0x32, 0xc5, 0xc6, 0x85, 0x4a, 0xca, 0xa6, 0x37, 0x95, 0x26, - 0x02, 0x06, 0x59, 0xb2, 0x00, 0x37, 0xfa, 0xc0, 0xce, 0x3f, 0x77, 0x15, - 0xbf, 0xcc, 0xb7, 0xde, 0xe3, 0x05, 0x6d, 0x28, 0x8c, 0x78, 0x02, 0x9e, - 0xd7, 0xe6, 0xd7, 0x34, 0x58, 0xb2, 0xf2, 0xfc, 0x86, 0xe5, 0x65, 0xd5, - 0x52, 0x85, 0x35, 0x7c, 0x64, 0x06, 0x2a, 0xdb, 0x51, 0x03, 0x87, 0xe2, - 0x2f, 0xac, 0x8d, 0xb0, 0x1b, 0x67, 0x81, 0x73, 0xa9, 0x77, 0xf8, 0xbe, - 0x14, 0x10, 0x3f, 0x2e, 0x4e, 0x28, 0x38, 0xe6, 0x2e, 0xf4, 0x68, 0xf8, - 0x96, 0x95, 0x06, 0x71, 0x79, 0xd9, 0xa4, 0xf0, 0x20, 0x85, 0x1d, 0x58, - 0x7e, 0x23, 0x7d, 0x5b, 0x77, 0x92, 0xb1, 0x23, 0xf8, 0xc5, 0xf2, 0xfc, - 0x86, 0xe5, 0x65, 0xd5, 0x52, 0x85, 0x35, 0x7c, 0x14, 0xa7, 0x5c, 0x4a, - 0x9c, 0x45, 0x71, 0x65, 0x4c, 0xec, 0xd8, 0xa1, 0x33, 0x2a, 0x72, 0x39, - 0xc4, 0x35, 0x7e, 0xe7, 0x69, 0x88, 0x99, 0x7f, 0x52, 0x9f, 0x9c, 0x11, - 0x8d, 0xe6, 0x16, 0xc9, 0x77, 0x93, 0xaf, 0x2b, 0x57, 0xe8, 0xf2, 0xfc, - 0x86, 0xe5, 0x65, 0xd5, 0x52, 0x85, 0x35, 0x7c, 0x1d, 0xc8, 0x5c, 0x2b, - 0x3e, 0x6a, 0x96, 0xf7, 0x37, 0xe7, 0x67, 0xd5, 0x55, 0xa3, 0xd6, 0x73, - 0xa8, 0x9b, 0xe0, 0xe4, 0x99, 0xd7, 0x1c, 0x21, 0x17, 0xa7, 0xf3, 0x31, - 0xdf, 0x3a, 0xe9, 0x34, 0x9c, 0xef, 0x0a, 0xde, 0xc8, 0x7b, 0x02, 0xd4, - 0x2f, 0x17, 0xe5, 0x28, 0xfa, 0xdc, 0x4e, 0x32, 0x3a, 0xbe, 0x64, 0x3a, - 0x5e, 0xdf, 0xb6, 0x9a, 0x42, 0x5f, 0x0b, 0xca, 0xa2, 0xd3, 0x50, 0xca, - 0x29, 0xfe, 0xc8, 0xd6, 0xd0, 0xa1, 0x8e, 0x5b, 0xdf, 0x64, 0xc0, 0x4f, - 0x21, 0x1f, 0xad, 0x84, 0x9a, 0xf0, 0x06, 0xc2, 0x20, 0x5d, 0x16, 0x5b, - 0x37, 0xd7, 0xed, 0x39, 0x7f, 0x34, 0x76, 0xb3, 0x25, 0x64, 0x31, 0x5c, - 0xf1, 0x90, 0xd8, 0x45, 0x69, 0x26, 0x67, 0x16, 0x90, 0xee, 0x5e, 0x59, - 0x50, 0x1d, 0xe0, 0xf3, 0xf0, 0x36, 0xc7, 0x3d, 0xce, 0xc1, 0x20, 0xf8, - 0xa8, 0x5d, 0xb2, 0x29, 0xbf, 0x67, 0x59, 0x39, 0xba, 0x70, 0x41, 0xcd, - 0xe6, 0xaa, 0x11, 0x1a, 0xd1, 0x8c, 0x4f, 0x4d, 0xb2, 0x9a, 0x2d, 0xe9, - 0xce, 0x30, 0x88, 0x1e, 0x71, 0x53, 0xbe, 0x06, 0xb4, 0xf9, 0xd3, 0xc8, - 0x35, 0xdb, 0x9a, 0x2b, 0xfe, 0x73, 0xfb, 0x82, 0x8d, 0x03, 0x61, 0xd8, - 0x07, 0x4b, 0x51, 0x00, 0x01, 0xf9, 0x0c, 0x8d, 0x83, 0x0d, 0xfd, 0x00, - 0x35, 0xbe, 0xdc, 0xa6, 0xd9, 0xbd, 0x02, 0x59, 0x6a, 0x58, 0x17, 0xe9, - 0x27, 0xdd, 0xea, 0xed, 0x96, 0xae, 0xa7, 0x08, 0x29, 0xf1, 0xe2, 0x7e, - 0x48, 0x05, 0x5c, 0xef, 0xa4, 0x66, 0x24, 0x82, 0x5d, 0x58, 0x3d, 0x57, - 0x58, 0xfe, 0x70, 0xe7, 0xf8, 0x98, 0x11, 0x57, 0xd6, 0x8c, 0xa1, 0x35, - 0x4d, 0x07, 0xb2, 0x83, 0x45, 0x38, 0x59, 0x64, 0x6a, 0x1e, 0x23, 0xfa, - 0x66, 0x2a, 0x0d, 0xfa, 0x68, 0x02, 0x37, 0xb8, 0x89, 0xe6, 0xd4, 0x57, - 0xe5, 0x7d, 0x5c, 0x81, 0x99, 0xd6, 0x6f, 0x32, 0x96, 0x2b, 0x1b, 0x6e, - 0xb3, 0x30, 0xab, 0x0a, 0x8e, 0x82, 0x85, 0xca, 0xa2, 0x93, 0x05, 0x7c, - 0x2c, 0x74, 0x93, 0x98, 0xa1, 0xe5, 0x5d, 0x7e, 0x26, 0x59, 0xef, 0x08, - 0x0c, 0x8d, 0x9c, 0xa4, 0xec, 0x41, 0x01, 0x17, 0x18, 0x8b, 0x32, 0x2b, - 0xcc, 0xa6, 0x08, 0xf9, 0x91, 0x8e, 0x55, 0xe5, 0x44, 0x65, 0xff, 0x99, - 0x94, 0x9f, 0x72, 0x82, 0x06, 0x99, 0x09, 0xa0, 0x58, 0xae, 0x8f, 0xcd, - 0xb0, 0x0a, 0x48, 0xee, 0xeb, 0x10, 0xe7, 0xd5, 0x02, 0xf0, 0x11, 0x09, - 0x4f, 0xb9, 0x78, 0x23, 0x7f, 0xd7, 0xce, 0xbb, 0xcf, 0x73, 0x86, 0x4e, - 0x4b, 0xd3, 0xf4, 0x15, 0xb1, 0x99, 0x23, 0xd5, 0x4a, 0x15, 0x0d, 0x30, - 0xf4, 0x3a, 0x20, 0x41, 0x3a, 0x69, 0x9d, 0x13, 0xa8, 0x4a, 0xcd, 0xa6, - 0xa2, 0x68, 0xe7, 0x82, 0x1d, 0x53, 0x36, 0x5d, 0x5d, 0x8a, 0x8a, 0x6b, - 0x7b, 0x6c, 0x41, 0xca, 0x13, 0xf1, 0xc2, 0x06, 0x2e, 0x80, 0x44, 0x02, - 0xfa, 0x57, 0xd7, 0xf9, 0x56, 0xb3, 0x94, 0x32, 0x2f, 0x62, 0x28, 0xc9, - 0x0f, 0x9e, 0x97, 0x86, 0x89, 0x7a, 0xeb, 0x1a, 0x20, 0x21, 0x61, 0xd8, - 0x54, 0x52, 0x8b, 0x7c, 0x6d, 0x13, 0x2f, 0x88, 0xfa, 0xce, 0x51, 0xff, - 0x6b, 0x13, 0x0c, 0xeb, 0x6d, 0xbf, 0x5f, 0x09, 0x0d, 0xd6, 0xd3, 0xa9, - 0x59, 0x9f, 0x9c, 0x38, 0x36, 0x78, 0xb4, 0xe7, 0x14, 0xda, 0xf3, 0x35, - 0xba, 0x69, 0x4b, 0x2d, 0x23, 0x84, 0xba, 0xfa, 0x22, 0xe4, 0x99, 0xf5, - 0x55, 0x9d, 0xa3, 0xee, 0x6f, 0x6c, 0x19, 0x67, 0xdc, 0x07, 0x98, 0xd2, - 0x97, 0x08, 0x1e, 0xc9, 0xca, 0x2f, 0xad, 0x4a, 0xbf, 0x38, 0xd6, 0x7f, - 0x21, 0xd0, 0xa5, 0x41, 0xf8, 0x33, 0x01, 0xf7, 0x45, 0xd3, 0x47, 0x7a, - 0x90, 0x7b, 0x0a, 0x2c, 0xb5, 0x78, 0xa2, 0x8c, 0x4c, 0x6b, 0xd1, 0x67, - 0xec, 0xee, 0xf0, 0xc2, 0x56, 0xe3, 0x0b, 0xf4, 0xdd, 0x2f, 0x93, 0xd2, - 0xcf, 0x47, 0xe9, 0x53, 0x4a, 0x15, 0x3a, 0x90, 0xfb, 0x62, 0x93, 0xb0, - 0xcd, 0xe9, 0xe5, 0x53, 0xbc, 0x6c, 0x43, 0xba, 0x1c, 0xe0, 0x70, 0x15, - 0x3b, 0x35, 0x30, 0x1f, 0x7b, 0xaf, 0x85, 0xa3, 0xf6, 0x06, 0x7a, 0xa9, - 0x57, 0x1c, 0x27, 0x5d, 0xbb, 0x70, 0xd0, 0x7f, 0xa8, 0x5f, 0xc8, 0xcd, - 0xed, 0x30, 0xf5, 0x35, 0x41, 0x4a, 0x78, 0x41, 0x8f, 0x53, 0x07, 0xab, - 0x65, 0x38, 0x70, 0x76, 0x7f, 0xa7, 0xca, 0xea, 0xe9, 0x21, 0xe3, 0xc0, - 0x94, 0x64, 0x45, 0xf7, 0x31, 0xb7, 0x85, 0xb4, 0xa0, 0xc2, 0x5a, 0xa2, - 0x20, 0x58, 0xb2, 0x42, 0x0a, 0x8f, 0xa4, 0xe2, 0x2c, 0xfe, 0x34, 0xeb, - 0x84, 0x3c, 0xc3, 0xd7, 0x68, 0x77, 0x06, 0x35, 0xff, 0x1f, 0xd3, 0x43, - 0x54, 0xb1, 0x4c, 0xdd, 0x57, 0x93, 0xd0, 0x7d, 0xf1, 0xed, 0xfc, 0x7b, - 0xa0, 0x5b, 0xff, 0x75, 0xe2, 0x27, 0x4e, 0xc7, 0xc1, 0x6f, 0x1f, 0x55, - 0x21, 0x34, 0x76, 0x39, 0xbd, 0xd7, 0xed, 0xec, 0x11, 0x38, 0x72, 0x9f, - 0xa1, 0xd0, 0x3e, 0xe0, 0xd8, 0x3e, 0xf2, 0x47, 0x3f, 0xf2, 0x25, 0xa8, - 0xc3, 0xb0, 0x29, 0xf2, 0x13, 0x1d, 0x7d, 0x75, 0xb3, 0x7f, 0xad, 0xaa, - 0xf6, 0x64, 0x2f, 0xc4, 0x3c, 0xb6, 0x99, 0x4c, 0x1b, 0x60, 0x29, 0x9b, - 0x91, 0xa2, 0xae, 0x7f, 0x24, 0xea, 0x68, 0xe0, 0x81, 0xcb, 0xfa, 0xe6, - 0x78, 0x1e, 0xcc, 0x1a, 0x71, 0xe6, 0xcd, 0x3d, 0x9b, 0xdb, 0xa2, 0xa4, - 0xb3, 0x02, 0xc2, 0xc9, 0xd4, 0xb7, 0xb1, 0xe3, 0xab, 0xe2, 0x2a, 0xaa, - 0xf8, 0xb6, 0xb4, 0x89, 0x0b, 0x7b, 0x2c, 0x08, 0xd4, 0xb1, 0x88, 0xb6, - 0xd7, 0xff, 0x81, 0x5d, 0xbf, 0x90, 0x6c, 0xab, 0xee, 0x40, 0x6a, 0x22, - 0xfe, 0x48, 0xf4, 0x7b, 0xc8, 0x78, 0x14, 0xd3, 0xa8, 0x17, 0xea, 0x1b, - 0xa5, 0xd0, 0x8e, 0x0f, 0x71, 0x58, 0x09, 0x70, 0x75, 0x99, 0xc1, 0xbc, - 0xb8, 0x3e, 0x9b, 0x73, 0x20, 0x9a, 0x3c, 0xb4, 0x2e, 0xfa, 0x1f, 0x53, - 0xdc, 0x0b, 0xdc, 0x60, 0x3d, 0x72, 0xbe, 0xd8, 0xf2, 0x1f, 0xa6, 0xc0, - 0x53, 0x9c, 0x2d, 0x5a, 0x38, 0xaa, 0xce, 0xb5, 0xe7, 0x2f, 0xfb, 0x65, - 0x2e, 0x30, 0xa8, 0x35, 0x92, 0x65, 0xa8, 0xad, 0x59, 0x6e, 0xf3, 0x16, - 0x02, 0x0f, 0x04, 0x09, 0x64, 0x17, 0xe7, 0x43, 0x1a, 0x13, 0x02, 0x3d, - 0x0d, 0xa4, 0x44, 0x3c, 0xfc, 0xcb, 0x6e, 0x9a, 0x1c, 0xd7, 0xa5, 0x73, - 0x14, 0xa6, 0xa0, 0xe1, 0xc6, 0x11, 0xb0, 0x44, 0x96, 0xb4, 0x60, 0x0f, - 0xa7, 0x25, 0x8e, 0x19, 0xfb, 0x24, 0xa3, 0x9d, 0xe4, 0x15, 0xde, 0xe2, - 0xab, 0x45, 0x63, 0x57, 0xb7, 0x86, 0x73, 0xef, 0x30, 0xeb, 0xf1, 0xa4, - 0x97, 0xd7, 0x7d, 0x59, 0xb3, 0xb7, 0x5c, 0x40, 0x0d, 0x3b, 0x97, 0x48, - 0xdd, 0x29, 0x45, 0x6b, 0x67, 0x5c, 0xfd, 0x00, 0x00, 0x8c, 0x86, 0x03, - 0x73, 0x4a, 0x2c, 0x1c, 0x42, 0x9f, 0x9e, 0x1d, 0xb0, 0xd5, 0xad, 0x37, - 0x8b, 0x93, 0x16, 0x9d, 0x14, 0x20, 0x36, 0x9d, 0xa2, 0x0f, 0x46, 0x13, - 0xf0, 0x9a, 0x42, 0x37, 0x79, 0x36, 0xce, 0xc9, 0x8a, 0x88, 0x76, 0x54, - 0x29, 0x83, 0x53, 0xc7, 0x66, 0x44, 0xcd, 0x90, 0xfe, 0x12, 0x18, 0x72, - 0x3d, 0x8c, 0xb6, 0x9c, 0xfb, 0xfd, 0x39, 0x65, 0xfd, 0x27, 0x51, 0x13, - 0x97, 0xab, 0xec, 0x86, 0x7b, 0x4b, 0x3c, 0x9f, 0xad, 0x76, 0x71, 0xbe, - 0x5f, 0xa5, 0xc5, 0xa2, 0xb3, 0xb3, 0x45, 0x9f, 0xa1, 0x12, 0x8e, 0x9c, - 0xa6, 0xbe, 0x92, 0xac, 0x71, 0xa2, 0xb4, 0xfc, 0x94, 0x22, 0x19, 0xba, - 0x3f, 0x60, 0x46, 0xa1, 0xaf, 0x67, 0x63, 0x2a, 0x9f, 0x86, 0xd1, 0x3f, - 0x8b, 0x8d, 0xe6, 0x78, 0xae, 0xfc, 0xf0, 0x71, 0xa5, 0xc0, 0xca, 0x4a, - 0x17, 0xab, 0xc0, 0x5e, 0x26, 0xd8, 0x19, 0x26, 0x81, 0xd1, 0xca, 0x8a, - 0xb5, 0x2e, 0xba, 0x20, 0xa1, 0x4c, 0xa8, 0x90, 0x09, 0xf0, 0xf6, 0x58, - 0x93, 0x9d, 0xbe, 0xf8, 0xc2, 0x6d, 0xfb, 0x0c, 0x15, 0x69, 0x2e, 0x58, - 0x85, 0x58, 0x6b, 0x7b, 0x9d, 0x80, 0x16, 0xd3, 0x11, 0x9b, 0x3c, 0x3f, - 0xbf, 0x14, 0x07, 0x91, 0x96, 0xde, 0xe9, 0x40, 0x61, 0xdd, 0x57, 0x86, - 0x49, 0xa6, 0xd0, 0x1a, 0xa6, 0x03, 0x0b, 0x18, 0x0d, 0xb0, 0x89, 0xab, - 0x63, 0xd6, 0x68, 0x37, 0x61, 0xad, 0xcf, 0xb4, 0x5e, 0x58, 0x8d, 0x5b, - 0x0c, 0xc3, 0x72, 0x7d, 0x8e, 0xba, 0xf2, 0x6b, 0xc9, 0x4d, 0x31, 0x0b, - 0x84, 0xcd, 0xf2, 0x10, 0x72, 0xc4, 0xa2, 0x4f, 0xe4, 0x25, 0xf4, 0x22, - 0x64, 0x46, 0xbf, 0x50, 0xf0, 0x2b, 0x57, 0x15, 0xf1, 0x3f, 0x43, 0x0b, - 0x0e, 0xd1, 0xc3, 0xea, 0xcf, 0x3e, 0x06, 0xf0, 0x17, 0x8a, 0x85, 0x48, - 0x80, 0xd4, 0xd6, 0x47, 0xc7, 0xc9, 0x34, 0x69, 0x9a, 0xc4, 0x7f, 0x58, - 0x07, 0x6e, 0x56, 0x48, 0x3c, 0x63, 0xb5, 0x42, 0x6e, 0xd7, 0xd8, 0x07, - 0xbf, 0x38, 0x3a, 0x07, 0x47, 0xb4, 0x1d, 0x10, 0xba, 0x79, 0xfc, 0xa6, - 0xc5, 0x63, 0x5a, 0xe6, 0x39, 0xac, 0xb4, 0xe3, 0x3c, 0xab, 0x9d, 0x1e, - 0xa2, 0x8d, 0xf9, 0x9a, 0x01, 0x6a, 0x8e, 0x2a, 0x1a, 0x91, 0x33, 0xbd, - 0xf5, 0x0c, 0xf6, 0x17, 0x15, 0x98, 0x92, 0x7a, 0x60, 0x2c, 0x7a, 0x1b, - 0x0b, 0x80, 0x70, 0x13, 0x2e, 0x0b, 0x05, 0x1b, 0x62, 0xbc, 0x48, 0x5b, - 0xec, 0xcb, 0x1a, 0x3e, 0xa2, 0xc8, 0xec, 0x68, 0x58, 0x2b, 0x8d, 0xec, - 0xa2, 0xa9, 0xc3, 0x9e, 0x68, 0xfa, 0x40, 0x2b, 0x7f, 0x91, 0x0f, 0x07, - 0xb8, 0xc7, 0x70, 0x6b, 0xe6, 0xfb, 0xcc, 0xa7, 0x72, 0x09, 0xd5, 0x63, - 0x05, 0x50, 0xcf, 0xb4, 0x91, 0x26, 0x74, 0xa4, 0xb6, 0x33, 0xb4, 0xf4, - 0x93, 0xfd, 0x9a, 0x30, 0x66, 0x96, 0x70, 0x5d, 0xbb, 0x0e, 0xbb, 0x4d, - 0x45, 0xf0, 0x97, 0x0b, 0xd5, 0x96, 0x73, 0x26, 0xa3, 0x85, 0x54, 0x9d, - 0x54, 0x46, 0x11, 0xd9, 0x37, 0x5f, 0x66, 0x9e, 0x77, 0xf0, 0x0d, 0x39, - 0x22, 0x2a, 0x92, 0xd7, 0x37, 0xa9, 0x69, 0xbf, 0xcf, 0x48, 0x37, 0x9c, - 0xbc, 0x4b, 0x5f, 0x51, 0x30, 0x7f, 0xb7, 0x1c, 0xcf, 0xad, 0xbb, 0x8f, - 0xe9, 0xee, 0x3c, 0xbf, 0xd4, 0x08, 0x38, 0x3d, 0x8b, 0xb4, 0x47, 0x39, - 0xf9, 0x69, 0x24, 0x2f, 0x0f, 0x5b, 0xf7, 0x64, 0x61, 0xff, 0xe5, 0x58, - 0x6b, 0x9c, 0x0a, 0x04, 0xaa, 0xa6, 0x42, 0xd9, 0x4a, 0xd5, 0x9d, 0x77, - 0x89, 0xf8, 0x14, 0x03, 0x20, 0x6b, 0x2c, 0x5a, 0x39, 0xf5, 0x72, 0x74, - 0xa1, 0x91, 0x18, 0xbd, 0xe9, 0x1d, 0x4c, 0xa2, 0x8b, 0xde, 0x44, 0x92, - 0x80, 0xfe, 0x9c, 0x80, 0xda, 0x63, 0xec, 0x9f, 0x57, 0xb3, 0x4b, 0x3b, - 0xca, 0x67, 0x22, 0x02, 0xe9, 0x93, 0x5b, 0xc9, 0x35, 0xdd, 0xe4, 0x39, - 0xdc, 0x3f, 0x15, 0x12, 0xbf, 0x02, 0x28, 0xa1, 0x0c, 0xae, 0x00, 0x80, - 0x24, 0xda, 0x28, 0x91, 0x34, 0xbf, 0xac, 0x25, 0xbc, 0x1b, 0x9e, 0x12, - 0xd8, 0xa1, 0x54, 0xcc, 0x15, 0x35, 0x01, 0xe9, 0xb5, 0xbf, 0x1a, 0x68, - 0xe2, 0x95, 0x44, 0xc5, 0xdb, 0xdc, 0x25, 0xfc, 0xf4, 0x06, 0x33, 0xbb, - 0x1d, 0x5a, 0xa5, 0x36, 0x2e, 0xaf, 0xb7, 0x41, 0x85, 0x44, 0xa7, 0x13, - 0x00, 0x84, 0x9d, 0x62, 0x24, 0xd4, 0x05, 0x01, 0xe0, 0x1c, 0xd2, 0x04, - 0xac, 0x32, 0x5d, 0xe8, 0x3d, 0x0a, 0xf0, 0x03, 0xc2, 0xee, 0x5a, 0xaf, - 0x34, 0x06, 0xb8, 0x84, 0xf0, 0x21, 0xaa, 0x6d, 0xff, 0xa9, 0xcf, 0xcf, - 0x62, 0x2d, 0x7c, 0xc4, 0x96, 0xbd, 0xd2, 0x96, 0xa2, 0x86, 0xf8, 0xf8, - 0x86, 0xdf, 0xed, 0x79, 0xf4, 0xf0, 0x56, 0x38, 0x0c, 0x9c, 0x09, 0xf4, - 0x15, 0x6a, 0x48, 0x6b, 0x92, 0xd0, 0x38, 0xbd, 0x79, 0xd2, 0x3b, 0x80, - 0xb9, 0x07, 0x09, 0x45, 0xcc, 0x5b, 0x10, 0xa6, 0xa1, 0x9e, 0xd6, 0xd5, - 0xce, 0x3b, 0x61, 0xe0, 0xe4, 0x92, 0x5f, 0x9c, 0xf4, 0x98, 0xfd, 0x5a, - 0xa4, 0x86, 0x8d, 0x7e, 0x9b, 0xad, 0xd7, 0xe8, 0x17, 0x24, 0x2c, 0xd9, - 0x4b, 0xe2, 0x15, 0x49, 0x79, 0xd6, 0x4a, 0xc7, 0xac, 0x9d, 0xe1, 0x9a, - 0x71, 0x3b, 0x50, 0x07, 0x6c, 0x63, 0xac, 0xfb, 0xd5, 0x3d, 0x76, 0xea, - 0x31, 0x54, 0xd6, 0x70, 0xff, 0xbb, 0xd9, 0x7f, 0xd1, 0xf7, 0xc2, 0x8b, - 0x6c, 0x5b, 0x60, 0x77, 0xdc, 0xb0, 0x7f, 0x14, 0x08, 0x3a, 0x81, 0x1a, - 0x47, 0xee, 0x55, 0x38, 0xc4, 0x55, 0xa9, 0x1d, 0x8f, 0x26, 0xe5, 0x22, - 0x4b, 0xc2, 0x76, 0xd2, 0x61, 0x51, 0xc2, 0x25, 0x13, 0x37, 0x35, 0xae, - 0xd2, 0x11, 0xd3, 0x43, 0x34, 0x50, 0x1f, 0x5f, 0x4d, 0xd0, 0x34, 0x5b, - 0x8f, 0x22, 0x4d, 0x68, 0x84, 0x79, 0x46, 0x53, 0x03, 0x6a, 0x04, 0xa4, - 0x57, 0x03, 0x20, 0x80, 0x0d, 0x4d, 0x24, 0xac, 0xd2, 0xdb, 0x51, 0x38, - 0x21, 0xfb, 0xac, 0x24, 0x35, 0x62, 0x03, 0x52, 0xdd, 0x3f, 0x20, 0xb0, - 0x86, 0x82, 0x33, 0xd2, 0x3a, 0xaf, 0x5d, 0x71, 0x43, 0xaa, 0x73, 0xa0, - 0xd8, 0xf2, 0x79, 0x30, 0xe7, 0x09, 0xa4, 0xcb, 0x85, 0x31, 0xe8, 0xc1, - 0xb8, 0x5f, 0xb7, 0x03, 0x0c, 0x82, 0xf3, 0x3a, 0x43, 0x85, 0xdc, 0xcd, - 0xc4, 0x35, 0x64, 0xf0, 0x0f, 0xd0, 0xd8, 0x0e, 0xc4, 0xec, 0x46, 0xa0, - 0x7f, 0xc9, 0x9d, 0x67, 0x0e, 0xd7, 0x4a, 0xa0, 0xf2, 0x00, 0xe2, 0x37, - 0xfe, 0x26, 0xd8, 0x25, 0xa2, 0x14, 0x3a, 0x4b, 0xd4, 0x21, 0x44, 0xf7, - 0x12, 0x77, 0x69, 0x8b, 0xc7, 0x72, 0xf0, 0xed, 0xb7, 0x0b, 0x7e, 0xf1, - 0xe7, 0xfc, 0xd1, 0x00, 0x7b, 0xdd, 0xb3, 0x98, 0x95, 0x19, 0xc1, 0x4a, - 0x5e, 0x95, 0x48, 0x0c, 0x17, 0x2e, 0xff, 0xcd, 0xe6, 0x61, 0x08, 0x42, - 0x0a, 0x65, 0x8d, 0x5a, 0x31, 0xbd, 0xf5, 0xdc, 0x24, 0x98, 0xd0, 0xe8, - 0x16, 0x4e, 0x68, 0x66, 0x72, 0xcb, 0xe0, 0xda, 0xc3, 0x61, 0xdc, 0x09, - 0x93, 0x86, 0xc3, 0x69, 0x8f, 0x9a, 0xda, 0x26, 0x06, 0x14, 0x60, 0xaf, - 0xac, 0x4f, 0xae, 0x3b, 0xad, 0xca, 0x68, 0x5d, 0xd9, 0xc2, 0x64, 0x84, - 0x24, 0x8a, 0x07, 0xae, 0x7f, 0x7f, 0x1a, 0x1e, 0xe1, 0xef, 0xc5, 0xaa, - 0x13, 0x44, 0xe7, 0xe9, 0x99, 0x3e, 0xc5, 0xc6, 0xab, 0xac, 0x55, 0xa3, - 0x36, 0xe1, 0x03, 0x4d, 0x03, 0xa8, 0x9a, 0xd5, 0xa9, 0x79, 0x38, 0x2b, - 0x4a, 0x30, 0xdc, 0xaa, 0x08, 0xd1, 0x11, 0xc2, 0xac, 0x8b, 0x50, 0x86, - 0x74, 0x09, 0xb4, 0x4a, 0xc1, 0x6c, 0xe4, 0x16, 0x09, 0xf0, 0x07, 0x53, - 0x0d, 0x48, 0x44, 0x67, 0xa9, 0x47, 0xbf, 0x2a, 0xe8, 0x3d, 0x50, 0xd5, - 0xa6, 0xfc, 0x40, 0x61, 0x1a, 0xd1, 0x70, 0xf2, 0x2f, 0xab, 0x23, 0xee, - 0x7f, 0x88, 0xae, 0x4d, 0xdd, 0x9c, 0xcf, 0x6a, 0x70, 0x11, 0xd3, 0x11, - 0xb0, 0x39, 0xff, 0x38, 0xcc, 0x39, 0x94, 0x16, 0xce, 0x26, 0x8c, 0xe0, - 0xc9, 0x50, 0xa2, 0xbd, 0x70, 0x0e, 0x8c, 0xf5, 0x20, 0x87, 0xcd, 0x1b, - 0xe9, 0xfe, 0x0d, 0x34, 0x87, 0x80, 0x17, 0x81, 0x57, 0x77, 0x59, 0x56, - 0x30, 0x18, 0x49, 0x2d, 0xca, 0xf4, 0xb0, 0x22, 0x19, 0xb7, 0x63, 0x51, - 0x2e, 0xdb, 0xe9, 0xaf, 0xbf, 0xa5, 0x29, 0x86, 0x4b, 0xd1, 0xb9, 0xcc, - 0x40, 0x45, 0x66, 0xc1, 0x2d, 0xdf, 0x37, 0xd5, 0xfd, 0xa4, 0x17, 0x5b, - 0xd4, 0x3e, 0x2c, 0x53, 0x63, 0x9f, 0x1a, 0xec, 0xd8, 0x74, 0xc7, 0x83, - 0xf1, 0xca, 0x94, 0x7f, 0xaf, 0xa0, 0x78, 0x7b, 0x65, 0x11, 0x7e, 0xc6, - 0x92, 0x71, 0x11, 0x24, 0x36, 0x69, 0x6b, 0x21, 0x35, 0x89, 0xed, 0x51, - 0x5f, 0x16, 0x65, 0x62, 0xea, 0xc7, 0xc7, 0x80, 0x95, 0xeb, 0x05, 0x1c, - 0x1a, 0x39, 0x61, 0x32, 0x09, 0xc2, 0xa7, 0x84, 0xae, 0x9f, 0x31, 0x8b, - 0x5c, 0x88, 0xe7, 0x79, 0x4f, 0x1c, 0x68, 0x52, 0xb8, 0x36, 0x56, 0x57, - 0xc8, 0x55, 0x0c, 0xda, 0x9b, 0x9c, 0x97, 0x43, 0x74, 0x4a, 0x82, 0x9f, - 0xa4, 0xf6, 0x8e, 0xc7, 0xa5, 0x63, 0x91, 0xa5, 0x82, 0xfd, 0x4a, 0x01, - 0x92, 0xb5, 0x80, 0xe8, 0xd0, 0x09, 0xb1, 0x2d, 0x2c, 0x2f, 0x41, 0x2f, - 0x69, 0xac, 0xcb, 0xfb, 0x28, 0x84, 0x87, 0x7c, 0x12, 0x7e, 0x9c, 0x6d, - 0x77, 0xcb, 0x06, 0x4e, 0xef, 0xcf, 0x35, 0xb1, 0xce, 0xd5, 0x39, 0xa7, - 0x92, 0x1f, 0x26, 0x73, 0xe5, 0x99, 0x84, 0xbb, 0xb7, 0x47, 0x47, 0x5f, - 0xf9, 0xc2, 0xc4, 0xb3, 0x1c, 0x23, 0x61, 0x47, 0x56, 0x04, 0x8d, 0x1b, - 0xa0, 0x4a, 0xaa, 0xbb, 0xac, 0xc9, 0x97, 0xbd, 0x1b, 0x85, 0x67, 0x7f, - 0xc4, 0xe1, 0xb7, 0x5b, 0x36, 0x91, 0x70, 0x7b, 0x0a, 0xb1, 0x55, 0xdc, - 0x3c, 0x8e, 0xe5, 0x8b, 0x4e, 0x0e, 0xa3, 0x51, 0x5e, 0x16, 0x7d, 0xaf, - 0xd5, 0xbc, 0x53, 0x43, 0x43, 0xa5, 0xa8, 0xfd, 0x58, 0xff, 0x77, 0xdb, - 0x10, 0x39, 0x41, 0x30, 0x31, 0x9f, 0xf4, 0x5b, 0x32, 0x1a, 0xa2, 0xd7, - 0x8b, 0x38, 0xe1, 0xec, 0x89, 0xd7, 0x89, 0x62, 0xae, 0xb5, 0xfd, 0xf0, - 0x5d, 0x50, 0xe0, 0xd0, 0xaf, 0x60, 0xef, 0x36, 0x51, 0x76, 0x23, 0x29, - 0xeb, 0x60, 0x03, 0xd2, 0xce, 0xb8, 0xcf, 0xf4, 0xfb, 0xc7, 0x53, 0xb4, - 0x85, 0x01, 0x6b, 0x86, 0x64, 0x9b, 0xeb, 0x29, 0x7a, 0x91, 0xd2, 0xe0, - 0x0d, 0xe1, 0x15, 0x95, 0xfb, 0x1c, 0x3e, 0x19, 0xb9, 0xb3, 0x71, 0x98, - 0xd4, 0x77, 0x82, 0x91, 0xb9, 0xa2, 0x13, 0x16, 0x20, 0xbe, 0x04, 0x94, - 0xd4, 0x45, 0xd0, 0x32, 0xb9, 0x0c, 0x0c, 0xe4, 0x98, 0x48, 0xd7, 0x68, - 0x78, 0x40, 0xa0, 0x83, 0xa3, 0xd8, 0x97, 0x2d, 0xb9, 0x4a, 0xe5, 0x08, - 0xea, 0x5e, 0x71, 0xdf, 0x12, 0x10, 0xed, 0x55, 0xcf, 0xbb, 0x02, 0x7a, - 0x21, 0x91, 0xe0, 0x2c, 0x1e, 0x81, 0x06, 0xaf, 0x9c, 0xc2, 0xad, 0x9c, - 0x2d, 0x8a, 0xc3, 0x52, 0x2b, 0xff, 0xd8, 0x7c, 0x8c, 0x0b, 0xc6, 0xfc, - 0x26, 0x2f, 0x9d, 0x71, 0x08, 0xdc, 0x4b, 0x17, 0x43, 0x5d, 0xc2, 0xcd, - 0x56, 0x15, 0x64, 0x78, 0x55, 0x3e, 0xab, 0x84, 0x63, 0x1e, 0xf3, 0x5b, - 0x10, 0xa3, 0xea, 0x76, 0xd3, 0x46, 0x5f, 0x66, 0x69, 0x2f, 0x3c, 0xc3, - 0x8c, 0x0b, 0x6e, 0xda, 0x83, 0x47, 0xed, 0xb5, 0xc2, 0x2c, 0x54, 0xd2, - 0xa8, 0xad, 0x91, 0x17, 0x92, 0x94, 0x9f, 0xd7, 0x11, 0xd7, 0x38, 0x8b, - 0x3d, 0x0f, 0xd2, 0xfa, 0xe7, 0xe7, 0x62, 0xe8, 0xf6, 0x88, 0xc8, 0x00, - 0xae, 0x64, 0x0f, 0x8a, 0x1b, 0xf8, 0xd1, 0x28, 0x2a, 0x93, 0x5c, 0x19, - 0xe5, 0x41, 0x42, 0x65, 0x55, 0x89, 0x21, 0x9c, 0xe5, 0xc3, 0x01, 0x16, - 0x6a, 0x12, 0x9e, 0x1c, 0x92, 0x12, 0x8f, 0x3c, 0xed, 0x81, 0xbc, 0x1f, - 0x99, 0x05, 0xdd, 0x3e, 0x38, 0x28, 0x7e, 0xee, 0xc5, 0x13, 0xc3, 0x13, - 0x8d, 0xfc, 0xcf, 0xff, 0x62, 0x4a, 0x1a, 0x45, 0x92, 0x56, 0xa2, 0x8d, - 0x22, 0xbf, 0xff, 0x39, 0x55, 0x47, 0xa6, 0x46, 0xd7, 0xc4, 0x51, 0x9d, - 0x4a, 0x8c, 0x0a, 0x1f, 0xa9, 0x98, 0xd0, 0x6d, 0x40, 0x37, 0x9c, 0x77, - 0x4e, 0x66, 0x0c, 0xe1, 0xcc, 0x34, 0x89, 0x90, 0xe7, 0x03, 0x60, 0x4a, - 0xaa, 0x4f, 0x7e, 0xd5, 0xd9, 0x70, 0x7f, 0x93, 0x68, 0xf6, 0x2c, 0x45, - 0x45, 0x0f, 0x0f, 0xa6, 0xb8, 0xbb, 0x3c, 0xff, 0xcd, 0xec, 0x3a, 0xa3, - 0x01, 0x27, 0xb2, 0x57, 0x9a, 0x71, 0x8b, 0x0e, 0xb8, 0x33, 0xfa, 0x97, - 0x89, 0x50, 0xda, 0xe1, 0xe0, 0xab, 0x8d, 0xd0, 0xf3, 0x15, 0x0a, 0x37, - 0x15, 0xc6, 0xe1, 0x8d, 0x95, 0x6f, 0x85, 0x74, 0xe6, 0x47, 0x59, 0xcb, - 0xf0, 0x68, 0x5b, 0xda, 0x40, 0xd4, 0x01, 0x95, 0xef, 0xa9, 0xe5, 0x9f, - 0xc9, 0xec, 0x42, 0x29, 0x1e, 0xe7, 0x4b, 0xae, 0xf9, 0xce, 0x50, 0x45, - 0x73, 0x0b, 0x97, 0x03, 0x47, 0x72, 0xff, 0x9b, 0xfc, 0x13, 0xa4, 0x3d, - 0x64, 0x31, 0xad, 0xe4, 0xcd, 0xdd, 0x28, 0x1b, 0x32, 0xdf, 0xfb, 0xbb, - 0x2d, 0x8e, 0x33, 0x30, 0x58, 0xb0, 0x7e, 0x3f, 0x47, 0xa8, 0x4c, 0x34, - 0xf1, 0xca, 0x6d, 0x3d, 0xa3, 0x74, 0xe9, 0x6c, 0xa7, 0x2c, 0xae, 0x06, - 0x81, 0xda, 0x21, 0x23, 0xd0, 0x50, 0x10, 0xf6, 0xaf, 0xd2, 0xca, 0xa2, - 0x15, 0x23, 0x85, 0xaf, 0xad, 0x70, 0xf5, 0x14, 0xfe, 0xd1, 0x07, 0xc1, - 0xbe, 0x12, 0x16, 0x8d, 0x8e, 0x46, 0x2f, 0x73, 0x65, 0x1b, 0xe4, 0xa1, - 0xea, 0x8d, 0xf6, 0xfe, 0xe3, 0x75, 0x91, 0x8f, 0x9e, 0x88, 0x39, 0xdd, - 0x1f, 0xfa, 0x9e, 0x29, 0xa1, 0x2f, 0x5b, 0x4b, 0x8c, 0x99, 0xc1, 0x85, - 0xb5, 0x5c, 0x1e, 0xdb, 0x83, 0x27, 0xc4, 0x54, 0x6a, 0x4a, 0xb6, 0xb7, - 0x2f, 0x49, 0x0b, 0x5c, 0x26, 0x48, 0x85, 0x32, 0xea, 0x2f, 0xbe, 0xec, - 0x35, 0xac, 0x23, 0xf3, 0x87, 0xe9, 0x45, 0xd7, 0x5a, 0x55, 0x7a, 0x04, - 0xa1, 0xd0, 0x0b, 0x02, 0xe6, 0x56, 0x96, 0x94, 0xe8, 0x93, 0x5b, 0xda, - 0xb3, 0x8d, 0x03, 0x4c, 0x86, 0xd3, 0x98, 0xf5, 0x74, 0x87, 0x42, 0x0d, - 0x2e, 0x73, 0x82, 0x58, 0xc2, 0x76, 0xe7, 0xca, 0x47, 0x05, 0xb4, 0xc2, - 0x13, 0x46, 0x6a, 0xa5, 0x28, 0x28, 0x72, 0x45, 0xfb, 0x4e, 0x7f, 0xa9, - 0x07, 0xa9, 0x53, 0xbe, 0x33, 0xbc, 0x57, 0xfa, 0xcd, 0x90, 0x3c, 0xf2, - 0xf5, 0x76, 0x39, 0x27, 0x27, 0x42, 0xe5, 0x48, 0xcf, 0x50, 0x32, 0xc2, - 0xc9, 0x77, 0x00, 0xad, 0xbf, 0xe7, 0xfe, 0xa8, 0xe5, 0x0f, 0x0c, 0xa3, - 0x1b, 0xf9, 0x5e, 0xe6, 0xb0, 0x95, 0xc9, 0x77, 0x20, 0x25, 0xb6, 0x0a, - 0xe7, 0x60, 0x80, 0xd6, 0x6f, 0x3a, 0x39, 0xe1, 0x11, 0xe5, 0x78, 0x01, - 0x87, 0x29, 0x8e, 0x29, 0x40, 0x07, 0x05, 0x5c, 0x17, 0x54, 0x68, 0x15, - 0x95, 0xb5, 0x2c, 0xc6, 0x86, 0x76, 0x4d, 0x3e, 0xf8, 0x23, 0xc9, 0x2c, - 0x47, 0xd2, 0x36, 0xa8, 0xab, 0xe3, 0x4c, 0xd7, 0x9f, 0x26, 0x58, 0xf3, - 0x67, 0x35, 0x62, 0xf8, 0xbf, 0x18, 0x5b, 0x56, 0x45, 0x0d, 0x24, 0x58, - 0x80, 0xfb, 0xb6, 0x46, 0xc7, 0x17, 0x4e, 0xcb, 0x79, 0xd0, 0xee, 0x3a, - 0x42, 0xbb, 0x42, 0xfa, 0x3a, 0x21, 0x51, 0x81, 0x2c, 0xce, 0x2a, 0xb2, - 0xfb, 0xc2, 0x46, 0x46, 0xae, 0x96, 0xf7, 0xf9, 0x0a, 0x32, 0x7a, 0x6f, - 0xae, 0x43, 0x9b, 0x31, 0xb3, 0x6a, 0x17, 0x9e, 0x2f, 0x9d, 0x36, 0x9d, - 0x22, 0x30, 0x17, 0x98, 0x1e, 0x5c, 0xf2, 0xd6, 0xf4, 0x25, 0x2e, 0xce, - 0xa8, 0x87, 0x07, 0x7f, 0x9a, 0xf9, 0x24, 0x1f, 0xfb, 0x60, 0x26, 0x28, - 0xd9, 0xcf, 0x0d, 0x6a, 0x13, 0x67, 0x93, 0xb8, 0x06, 0x7c, 0xb2, 0x49, - 0x33, 0x83, 0x47, 0xc9, 0xcb, 0xdb, 0x0b, 0xa6, 0x2e, 0xb6, 0xfc, 0x74, - 0xf3, 0xc3, 0x02, 0xfe, 0xfc, 0x7c, 0x37, 0x88, 0xeb, 0xc3, 0x47, 0x60, - 0x74, 0x8b, 0xe8, 0x7b, 0x48, 0x94, 0xd3, 0x74, 0x2b, 0xd6, 0x34, 0x50, - 0x6b, 0x00, 0x55, 0x6f, 0xc9, 0x6b, 0x7b, 0x93, 0x7b, 0x38, 0x88, 0x43, - 0x22, 0xbf, 0x6b, 0x94, 0x41, 0x28, 0x4d, 0x0a, 0xa4, 0x5d, 0x67, 0x8d, - 0xdf, 0x35, 0x6f, 0x30, 0xd6, 0x1b, 0xca, 0x71, 0xe4, 0xf0, 0x30, 0x80, - 0x4a, 0x6f, 0xe6, 0x9b, 0x8c, 0xbd, 0xd6, 0x60, 0x43, 0xfb, 0x5b, 0x91, - 0x8c, 0xf4, 0xe6, 0xc5, 0xfc, 0xe9, 0x92, 0x35, 0x39, 0x07, 0xd4, 0xbe, - 0xd0, 0x76, 0x83, 0xf3, 0x93, 0xd0, 0x3f, 0xac, 0x0e, 0x4f, 0x22, 0x9f, - 0x05, 0xb1, 0x25, 0xb0, 0xeb, 0xf2, 0x22, 0x03, 0xd0, 0x3d, 0x22, 0x60, - 0xed, 0x4d, 0xe1, 0x7d, 0xf0, 0x2d, 0x12, 0x38, 0x35, 0x9f, 0x1e, 0x9d, - 0x1a, 0x79, 0x48, 0x48, 0x89, 0xb8, 0xaa, 0x4e, 0xdd, 0xf1, 0x32, 0x1f, - 0x8e, 0x78, 0xc4, 0x8a, 0xa8, 0xa6, 0x16, 0x61, 0xe3, 0x3a, 0x54, 0xa4, - 0x36, 0x7c, 0x41, 0x3c, 0xdb, 0x4f, 0x9b, 0xe5, 0xd4, 0xeb, 0x53, 0xce, - 0x94, 0x3e, 0xf7, 0x92, 0x0b, 0x02, 0x49, 0x0b, 0x41, 0xc5, 0x76, 0xb6, - 0xf2, 0xe5, 0x1a, 0xf1, 0xb3, 0x00, 0x3c, 0xfa, 0xc8, 0x6e, 0x54, 0x0c, - 0x16, 0x7a, 0x30, 0xcf, 0xb5, 0x42, 0x43, 0x76, 0xee, 0x28, 0xed, 0xfd, - 0x90, 0x5a, 0x35, 0x49, 0xe3, 0x75, 0xc7, 0xf3, 0x84, 0xaa, 0x44, 0x71, - 0x46, 0xc7, 0x08, 0xe5, 0xd4, 0x28, 0x52, 0xe4, 0xdf, 0x14, 0xb4, 0x04, - 0x3d, 0xe4, 0x4e, 0x47, 0x73, 0xca, 0xf0, 0xf8, 0xca, 0x33, 0x77, 0x30, - 0x81, 0xe0, 0x81, 0xc3, 0xfe, 0x45, 0x1a, 0xb1, 0x16, 0xaa, 0x0b, 0x9c, - 0x35, 0x5f, 0x36, 0x33, 0xe9, 0x67, 0xef, 0xa1, 0x46, 0x19, 0xc1, 0xfb, - 0x73, 0xfa, 0x36, 0x9a, 0xa5, 0xaf, 0x07, 0xff, 0xe0, 0x2a, 0xb3, 0x0a, - 0x61, 0x65, 0x6a, 0x86, 0x7e, 0x1f, 0x08, 0x29, 0x3a, 0x8c, 0xc2, 0x2e, - 0xae, 0xc1, 0x35, 0xa9, 0x31, 0x09, 0xf6, 0x3e, 0x48, 0xcc, 0x5b, 0x5a, - 0x5f, 0xdf, 0xe2, 0x81, 0x78, 0x99, 0x68, 0xad, 0x16, 0x18, 0x70, 0x0c, - 0x5e, 0x42, 0xe6, 0x7a, 0x83, 0x1d, 0xd5, 0x5f, 0x88, 0x5e, 0x90, 0x12, - 0xbe, 0xd5, 0xa3, 0x0b, 0x32, 0x31, 0x94, 0x04, 0xe1, 0xbe, 0x70, 0x3d, - 0x58, 0xd5, 0xa7, 0x3c, 0xa6, 0x98, 0xd4, 0xac, 0xf9, 0x0f, 0xa1, 0x32, - 0x24, 0xc2, 0xa6, 0xa9, 0x52, 0xf7, 0x10, 0xaa, 0xcc, 0x95, 0x51, 0x92, - 0x79, 0xc2, 0x5c, 0x5e, 0xc2, 0xfc, 0x1b, 0x9f, 0x25, 0xb3, 0xe2, 0x5f, - 0xeb, 0xb6, 0x42, 0xdd, 0x2b, 0x6c, 0x77, 0x3d, 0x16, 0x80, 0x4c, 0x1b, - 0x35, 0x1b, 0xc5, 0x00, 0x7b, 0xd5, 0x3d, 0x3b, 0xcd, 0xd7, 0xd0, 0x72, - 0xf4, 0xd0, 0x80, 0xeb, 0x52, 0x3f, 0xc4, 0x2c, 0x74, 0x69, 0xb6, 0xd1, - 0x1e, 0x4d, 0xb1, 0xdf, 0xee, 0x87, 0x99, 0xd5, 0x3f, 0x8a, 0xe3, 0x01, - 0x51, 0x6d, 0xa4, 0x85, 0xd0, 0xb0, 0xc3, 0x26, 0xa2, 0x61, 0xd4, 0xeb, - 0x7d, 0xad, 0x9d, 0x04, 0x44, 0x64, 0x85, 0xa4, 0xef, 0x4e, 0x67, 0xd0, - 0x90, 0x8a, 0xc6, 0x09, 0x27, 0x14, 0x9e, 0xea, 0xa4, 0x89, 0x23, 0x2d, - 0x6d, 0xbd, 0x54, 0x44, 0x0d, 0x45, 0x79, 0xe9, 0x60, 0x79, 0x44, 0x1e, - 0x58, 0x25, 0xf0, 0xfc, 0x63, 0x26, 0x86, 0x45, 0x00, 0x86, 0x7b, 0x25, - 0xa9, 0x1b, 0xeb, 0x6b, 0xcb, 0xeb, 0x20, 0x6d, 0x2c, 0x2f, 0x49, 0x96, - 0x17, 0x2f, 0x33, 0xad, 0xc5, 0x4e, 0xc6, 0xf0, 0x4e, 0xdf, 0xe5, 0xe2, - 0xd1, 0x8d, 0x29, 0x4b, 0x27, 0xa0, 0xea, 0x18, 0x61, 0xf9, 0x9e, 0x15, - 0xc3, 0x76, 0x1f, 0x57, 0xe9, 0xd3, 0xb9, 0x78, 0x98, 0x82, 0xb5, 0x2a, - 0x5d, 0x4d, 0x1b, 0xd7, 0xb1, 0x5c, 0x3b, 0x64, 0x65, 0x91, 0x8c, 0x54, - 0x50, 0xb6, 0x3c, 0xec, 0xce, 0xfd, 0x5d, 0x12, 0xb9, 0xf8, 0xa8, 0xae, - 0x0f, 0x03, 0x5f, 0xbe, 0x1e, 0xc7, 0x46, 0xc4, 0x38, 0x55, 0x11, 0x73, - 0xfb, 0xcb, 0x5a, 0x9f, 0xb9, 0xe4, 0xe7, 0x45, 0xa0, 0x10, 0x99, 0x1b, - 0xfc, 0x82, 0xed, 0x80, 0x1f, 0x16, 0xef, 0x8f, 0xf2, 0xa9, 0x01, 0x70, - 0x77, 0x0b, 0x9f, 0x21, 0xa8, 0x1f, 0xcf, 0x34, 0x6b, 0xf1, 0x86, 0x1e, - 0x7b, 0xb5, 0x04, 0x61, 0xa3, 0x10, 0x48, 0x5b, 0x18, 0x6d, 0x29, 0x1f, - 0xe9, 0x30, 0x91, 0x90, 0x4f, 0x31, 0xd0, 0x32, 0xf4, 0x19, 0x58, 0xce, - 0x54, 0x5e, 0xfa, 0xde, 0x97, 0x7d, 0x40, 0x0d, 0x0a, 0xaf, 0x75, 0x98, - 0xb2, 0xfa, 0xc2, 0x4b, 0x79, 0x39, 0x91, 0xbf, 0xce, 0x69, 0x14, 0x81, - 0x51, 0x11, 0xe2, 0xf5, 0x61, 0x47, 0x82, 0x6d, 0x5e, 0xfd, 0xf8, 0xa8, - 0x3f, 0xfb, 0x90, 0xee, 0x21, 0xdb, 0x21, 0xa0, 0x71, 0xcf, 0x54, 0xe2, - 0x52, 0x83, 0xff, 0xbe, 0xbb, 0x99, 0xe6, 0x12, 0xfd, 0xfe, 0xb5, 0x75, - 0xc0, 0x0a, 0x70, 0x9c, 0x1a, 0x6e, 0x02, 0xcb, 0x3f, 0xfb, 0x90, 0xee, - 0x21, 0xdb, 0xa3, 0x71, 0x71, 0xdf, 0x54, 0xe2, 0x52, 0x83, 0x7f, 0xfe, - 0x69, 0xf0, 0xc7, 0x3c, 0xdd, 0x20, 0x9a, 0xb3, 0x2f, 0x68, 0xe7, 0x4e, - 0x75, 0xb0, 0x56, 0x4a, 0x08, 0x52, 0xf4, 0xd4, 0xa8, 0xb8, 0x43, 0x15, - 0xe1, 0x8f, 0x88, 0x88, 0x05, 0x40, 0x99, 0x99, 0xe3, 0x9e, 0xf3, 0x8d, - 0x1b, 0x4c, 0xba, 0x1e, 0xa6, 0xab, 0x96, 0x7d, 0x9a, 0x47, 0x75, 0x48, - 0xa6, 0xc7, 0x6f, 0x0f, 0x41, 0xba, 0xb9, 0x57, 0x99, 0x2f, 0x09, 0x95, - 0x47, 0x79, 0xa4, 0x5b, 0x37, 0x02, 0x08, 0xa4, 0x67, 0xd5, 0xd3, 0x79, - 0xfb, 0x99, 0x44, 0x56, 0xe3, 0xe8, 0xca, 0x19, 0xaf, 0x53, 0x94, 0x29, - 0x1c, 0x0e, 0xa6, 0xe0, 0x86, 0x3f, 0x6b, 0x70, 0xa3, 0xcc, 0x70, 0x72, - 0xa7, 0x82, 0xc3, 0xc9, 0x70, 0x97, 0x05, 0x24, 0x5f, 0xf3, 0x44, 0xa1, - 0x81, 0xeb, 0x26, 0xe2, 0x03, 0x9e, 0xa6, 0xaf, 0x16, 0xd8, 0x05, 0x8d, - 0x7f, 0x6d, 0x8d, 0xeb, 0x47, 0xaf, 0x11, 0x02, 0x55, 0x2b, 0x19, 0x39, - 0x4a, 0x48, 0x69, 0x0a, 0xfe, 0x72, 0x71, 0xd7, 0x63, 0xa4, 0xd0, 0xc6, - 0x28, 0x42, 0x8d, 0xa9, 0x20, 0xf3, 0xeb, 0x9e, 0x58, 0xc1, 0x82, 0x7b, - 0x59, 0xb7, 0x17, 0x60, 0xd3, 0x75, 0x6a, 0xb7, 0xfc, 0x0c, 0x86, 0x34, - 0x14, 0x3a, 0xcf, 0x72, 0x21, 0xce, 0xff, 0x0f, 0x35, 0x7f, 0x57, 0xce, - 0x8c, 0x8b, 0x02, 0x1b, 0x2e, 0xdc, 0xa4, 0xe9, 0xac, 0xa7, 0xee, 0x00, - 0x87, 0x3b, 0x2e, 0x4b, 0x1b, 0xe7, 0x2b, 0xb2, 0xd3, 0x5d, 0x98, 0x86, - 0xad, 0x09, 0xa3, 0x65, 0x4d, 0x98, 0x57, 0xd2, 0x54, 0xa2, 0x6d, 0xc1, - 0xa2, 0xc6, 0xc5, 0xb2, 0x2a, 0xfd, 0x7b, 0x24, 0x8d, 0x2e, 0x9d, 0xf0, - 0xa6, 0xfe, 0x54, 0x88, 0x06, 0xf6, 0x80, 0x73, 0x76, 0x75, 0x6a, 0x2e, - 0x0d, 0xc2, 0x6c, 0x46, 0x92, 0x15, 0xa2, 0x7b, 0x45, 0x3e, 0xdb, 0x60, - 0x8b, 0xd0, 0x83, 0x0f, 0x18, 0x9e, 0x16, 0xc4, 0xfe, 0x17, 0xa4, 0x54, - 0xb7, 0x0a, 0x6e, 0xeb, 0x46, 0xf7, 0x3c, 0x0f, 0xa3, 0xfa, 0x2b, 0xf9, - 0x46, 0x6d, 0xb0, 0x3d, 0xe9, 0xdf, 0xd3, 0xa4, 0xb2, 0xd3, 0x5e, 0x26, - 0x06, 0x08, 0xe8, 0x89, 0xa7, 0x9b, 0x11, 0x5b, 0x9a, 0xbb, 0x59, 0x1b, - 0xfb, 0xdf, 0x8f, 0x3d, 0x1b, 0xd3, 0x89, 0x52, 0x33, 0x47, 0x9b, 0x5e, - 0x32, 0x5b, 0x37, 0xc9, 0x72, 0xcb, 0xef, 0xfa, 0x37, 0x17, 0x08, 0xf2, - 0x59, 0x20, 0x76, 0x8b, 0x9c, 0xf2, 0xea, 0x81, 0x82, 0x7f, 0x12, 0x18, - 0x35, 0xe9, 0x84, 0x92, 0xee, 0x3a, 0x2c, 0xac, 0xd1, 0x55, 0x9f, 0x8b, - 0xe7, 0x42, 0x2e, 0x25, 0x02, 0x85, 0xf1, 0xeb, 0x97, 0xb0, 0x7b, 0xa7, - 0x94, 0xf3, 0x1a, 0x15, 0x5e, 0x92, 0xdc, 0x35, 0x0f, 0x83, 0x1a, 0x97, - 0xee, 0x69, 0x82, 0x37, 0x3e, 0x50, 0xd0, 0x3c, 0x81, 0x40, 0xcc, 0xbf, - 0xb5, 0x90, 0x98, 0x52, 0x98, 0xe0, 0x64, 0x37, 0xc8, 0xf8, 0xef, 0x84, - 0x8b, 0xd2, 0x2e, 0xac, 0xff, 0xb9, 0x75, 0xab, 0x19, 0x7c, 0x3f, 0x37, - 0x25, 0x6b, 0x61, 0xb1, 0x23, 0x3b, 0xeb, 0x25, 0x48, 0x84, 0x70, 0x89, - 0x2f, 0x54, 0x4f, 0x5a, 0x3c, 0xc7, 0x89, 0x7c, 0x5a, 0xeb, 0x01, 0xf7, - 0x94, 0xd3, 0xf9, 0x68, 0x87, 0xec, 0x98, 0xc9, 0x5d, 0xa0, 0xc1, 0x6a, - 0xca, 0x1d, 0x57, 0x37, 0x99, 0x82, 0x02, 0x93, 0xd9, 0x56, 0x97, 0xc0, - 0x3d, 0x8e, 0x06, 0x29, 0x77, 0xd8, 0xd8, 0xec, 0x7c, 0xd1, 0xb4, 0xd6, - 0x9a, 0x6a, 0xad, 0xca, 0xc9, 0x68, 0x2e, 0x21, 0xaa, 0x89, 0xd7, 0x60, - 0xd9, 0x3e, 0xaf, 0x0a, 0x76, 0xc1, 0x22, 0x18, 0x34, 0xd7, 0x49, 0x99, - 0xf1, 0x6d, 0xc4, 0x9d, 0x56, 0x5c, 0x1d, 0x5d, 0xb0, 0x74, 0xfe, 0x45, - 0x2a, 0xda, 0x27, 0x7c, 0x1b, 0x92, 0x76, 0xd4, 0xa7, 0x24, 0x71, 0xdc, - 0x2e, 0xc5, 0x4f, 0xb4, 0xed, 0x6f, 0x53, 0xd3, 0x79, 0xc3, 0xd4, 0x00, - 0xc5, 0xbe, 0x4a, 0x02, 0xf2, 0x70, 0x57, 0xc9, 0x98, 0xcf, 0x70, 0x35, - 0x1d, 0x67, 0x9c, 0x18, 0x51, 0xfe, 0x2a, 0xfe, 0x60, 0xd3, 0xce, 0xbd, - 0xb2, 0x60, 0x84, 0x0a, 0x4b, 0xb0, 0x13, 0x28, 0x8b, 0x34, 0x50, 0x4c, - 0xb6, 0xb9, 0xb7, 0x25, 0x26, 0xa3, 0x87, 0x35, 0xc3, 0x91, 0x5f, 0x3a, - 0xb4, 0x51, 0x97, 0xf2, 0x5a, 0xaf, 0xf6, 0x37, 0x06, 0x5c, 0x91, 0x54, - 0x14, 0x68, 0x87, 0x66, 0x6c, 0x91, 0xc1, 0x08, 0xfa, 0x83, 0x64, 0xa6, - 0x6a, 0x20, 0x78, 0x2d, 0x72, 0x0b, 0x39, 0xc7, 0x64, 0xd7, 0x0d, 0x4d, - 0x3e, 0x99, 0xa6, 0xc0, 0x7d, 0x27, 0x4a, 0x21, 0xa9, 0xe2, 0x8e, 0x76, - 0xa0, 0xc1, 0x40, 0x5e, 0x9b, 0x3c, 0x85, 0xb5, 0xda, 0x44, 0x86, 0xd9, - 0x92, 0xb9, 0x00, 0xbd, 0xf2, 0xd4, 0xa7, 0x67, 0x71, 0x72, 0x50, 0x39, - 0x39, 0x21, 0xca, 0x99, 0x8c, 0xb5, 0x7d, 0xea, 0xf4, 0xaa, 0x72, 0x29, - 0x0b, 0xfe, 0x13, 0x2b, 0x36, 0x03, 0x3b, 0x56, 0x03, 0x7d, 0x6e, 0x81, - 0x71, 0x0a, 0xb7, 0xa3, 0xaa, 0x77, 0x7d, 0x1b, 0x75, 0x43, 0x93, 0x2d, - 0x51, 0x20, 0x76, 0x91, 0x7d, 0xdd, 0x33, 0x73, 0x0b, 0x2a, 0x64, 0x99, - 0x1d, 0xe2, 0x5b, 0x48, 0x38, 0x19, 0xb9, 0xb4, 0x48, 0xf4, 0xef, 0x8d, - 0xc1, 0x7b, 0x9c, 0xcf, 0x47, 0xdc, 0x60, 0x17, 0x8a, 0xe7, 0x47, 0x4f, - 0x73, 0xbe, 0xcd, 0x42, 0x8d, 0x40, 0x56, 0xda, 0xd6, 0x33, 0xa3, 0x5c, - 0xc5, 0x8c, 0xab, 0x76, 0x58, 0x82, 0x31, 0xa1, 0xad, 0xab, 0xcd, 0xbd, - 0x49, 0x00, 0x2e, 0x5b, 0x3b, 0xc6, 0x5d, 0x04, 0xa3, 0x3e, 0xee, 0x59, - 0x10, 0x8a, 0xe5, 0x5d, 0x6e, 0xab, 0xe0, 0xe0, 0xe1, 0x3b, 0x1a, 0xab, - 0x63, 0x23, 0xab, 0xc7, 0xa6, 0x7a, 0xaf, 0x68, 0xe4, 0xae, 0x04, 0x1e, - 0x2a, 0x8e, 0xce, 0x49, 0xf4, 0x5a, 0x10, 0x10, 0x6a, 0x0b, 0x75, 0xa8, - 0x81, 0x8f, 0x03, 0x6a, 0x86, 0xe0, 0x35, 0xc3, 0x19, 0x6a, 0x15, 0x7b, - 0x55, 0x11, 0x61, 0x4e, 0x26, 0x1e, 0xbe, 0x2a, 0x35, 0x0c, 0x36, 0xdf, - 0x8b, 0xde, 0x98, 0x17, 0x7e, 0xaa, 0x43, 0x91, 0xf7, 0xbf, 0x9b, 0x64, - 0x01, 0x22, 0x26, 0x86, 0xe9, 0x66, 0xc8, 0x58, 0xd1, 0x4a, 0x92, 0x1b, - 0x33, 0xd9, 0x66, 0xd0, 0x4b, 0x47, 0xfd, 0xeb, 0x77, 0xce, 0x97, 0x50, - 0x7e, 0x1b, 0xeb, 0x66, 0xac, 0xa9, 0x9c, 0xaa, 0x1b, 0xeb, 0xb2, 0x62, - 0x26, 0x94, 0xd4, 0xed, 0xe4, 0x32, 0x9a, 0x51, 0x02, 0x2c, 0x27, 0x76, - 0x46, 0xe0, 0x97, 0x8f, 0x41, 0xa7, 0x59, 0x9b, 0xb6, 0x57, 0x48, 0x30, - 0x2f, 0x29, 0xbb, 0x65, 0x23, 0x8d, 0x47, 0x82, 0x30, 0x92, 0xed, 0x94, - 0x7e, 0xaa, 0x8c, 0x91, 0x60, 0x72, 0x3d, 0x99, 0x76, 0xe6, 0x1f, 0xcd, - 0xfc, 0x9c, 0x35, 0x10, 0xdf, 0x76, 0xd0, 0x3e, 0x86, 0xc6, 0x96, 0x55, - 0x80, 0x67, 0x9b, 0xaa, 0xd4, 0x1f, 0x4d, 0x74, 0x30, 0x87, 0xa1, 0x38, - 0x6c, 0x95, 0x99, 0xde, 0x8e, 0x29, 0xdd, 0x51, 0x3d, 0xd6, 0x5e, 0xaa, - 0xa0, 0x50, 0xb2, 0x46, 0x61, 0xc7, 0xc3, 0xba, 0x64, 0xc0, 0xf2, 0xdd, - 0xf6, 0x39, 0x3a, 0xbe, 0xaa, 0x81, 0x27, 0x66, 0x8e, 0xfa, 0x48, 0x65, - 0xc4, 0x42, 0x90, 0x0d, 0x05, 0xe1, 0x51, 0x41, 0x28, 0x1b, 0x39, 0x3c, - 0x11, 0xb6, 0x58, 0xe8, 0x21, 0xfb, 0xbd, 0x3d, 0xe9, 0x6a, 0xf8, 0xb7, - 0xbd, 0x0b, 0xb3, 0x3d, 0xb7, 0x11, 0x7d, 0x18, 0xbf, 0xb8, 0x95, 0x31, - 0x9a, 0x87, 0x3f, 0xbe, 0x58, 0xb3, 0x76, 0x4e, 0xff, 0x41, 0x87, 0x48, - 0x0d, 0x09, 0x19, 0x83, 0x81, 0xb5, 0x4e, 0xac, 0x85, 0x1d, 0x73, 0xed, - 0xc0, 0xd9, 0x73, 0x15, 0x07, 0xb8, 0x37, 0xdb, 0xd2, 0xd4, 0x38, 0x7f, - 0x3f, 0x07, 0xab, 0x54, 0x13, 0x49, 0x3b, 0x9a, 0x18, 0x9d, 0xf5, 0x5a, - 0x93, 0x8b, 0x4d, 0xb7, 0x16, 0x54, 0x20, 0x29, 0x3a, 0xe8, 0xb0, 0x53, - 0xf0, 0x6e, 0x3c, 0xe3, 0xba, 0x1f, 0x26, 0xd2, 0xed, 0x7f, 0x22, 0x2d, - 0xbc, 0x43, 0x53, 0xf4, 0x37, 0xce, 0x24, 0x51, 0x75, 0xa3, 0xbb, 0x9d, - 0x08, 0xaf, 0x50, 0xb6, 0x11, 0x5a, 0x13, 0x6b, 0x83, 0xd2, 0x6b, 0x91, - 0xb3, 0xf5, 0x57, 0x76, 0x51, 0x11, 0x03, 0xb7, 0x4d, 0x06, 0x3f, 0x85, - 0xe6, 0xac, 0xe4, 0x17, 0x16, 0x49, 0xf0, 0x4b, 0x3d, 0x8f, 0xb2, 0x9c, - 0x3e, 0x9e, 0xdf, 0x79, 0xd2, 0x82, 0x35, 0x97, 0x89, 0x00, 0x09, 0x52, - 0xfa, 0x57, 0xb4, 0xbb, 0xdc, 0x0b, 0xef, 0xe1, 0x8a, 0x19, 0xde, 0x27, - 0x8b, 0xd5, 0x63, 0x2f, 0x5a, 0x1c, 0xf1, 0xc5, 0xd1, 0xae, 0xa4, 0x61, - 0x71, 0xf5, 0xf6, 0x69, 0xb2, 0x28, 0x68, 0x10, 0xc5, 0xaa, 0x0e, 0xfa, - 0xe4, 0x4b, 0xc1, 0x51, 0x2c, 0xbb, 0xac, 0xe1, 0x01, 0x24, 0xd0, 0x42, - 0x9c, 0xb1, 0x96, 0xf5, 0x39, 0xc9, 0x49, 0x92, 0x70, 0x35, 0x55, 0xae, - 0xdf, 0xf1, 0x2f, 0xc6, 0x39, 0x0a, 0x1b, 0x66, 0x0c, 0x29, 0x6d, 0xfb, - 0x15, 0xe6, 0x7c, 0x65, 0xc5, 0xc0, 0x10, 0x05, 0x3f, 0xb3, 0x8a, 0xc8, - 0x11, 0x3c, 0xef, 0x6e, 0x7a, 0xe3, 0xe2, 0xf1, 0x09, 0x5d, 0x83, 0x19, - 0xd9, 0xeb, 0x92, 0xf1, 0xb1, 0xac, 0x3e, 0x0e, 0xb8, 0x6b, 0x62, 0x37, - 0xd4, 0x5c, 0xf8, 0x24, 0x60, 0x7c, 0x2e, 0xea, 0x16, 0x02, 0x13, 0x8f, - 0xe1, 0x60, 0xc8, 0xd7, 0xde, 0x40, 0xe5, 0xda, 0xb9, 0x0d, 0xd1, 0x17, - 0x09, 0xbd, 0xdb, 0x2f, 0x02, 0xf7, 0x19, 0x56, 0x34, 0xd3, 0xfd, 0xdc, - 0x3f, 0x90, 0x3d, 0xfb, 0x15, 0x95, 0x3f, 0x4e, 0x48, 0x32, 0x82, 0x01, - 0x7c, 0xfa, 0x52, 0x01, 0x95, 0x19, 0x57, 0xbd, 0x8c, 0xf9, 0xd5, 0x14, - 0x4c, 0xfb, 0xe8, 0x53, 0xe0, 0xe8, 0x24, 0x9f, 0x9f, 0xa9, 0xce, 0xe2, - 0xc0, 0x7e, 0x47, 0x09, 0x4e, 0x08, 0x48, 0x99, 0xdd, 0x78, 0xf1, 0x67, - 0x0b, 0x46, 0xa6, 0x3f, 0xd0, 0xe6, 0x30, 0x14, 0xa7, 0xbe, 0xa2, 0x37, - 0x06, 0x0b, 0xc0, 0xfe, 0xc2, 0xfe, 0x7f, 0x34, 0xa7, 0x59, 0xf9, 0x05, - 0x35, 0xc8, 0x12, 0xf4, 0xc4, 0xee, 0x06, 0xce, 0x5f, 0x47, 0xf9, 0x9e, - 0x45, 0x6b, 0x5c, 0x5e, 0xc3, 0xed, 0x47, 0x73, 0x8a, 0x6b, 0xd3, 0x01, - 0x2e, 0xa2, 0x6e, 0xb0, 0xfa, 0x69, 0x97, 0x62, 0xc9, 0x6b, 0xf8, 0x48, - 0xba, 0x97, 0x43, 0xfd, 0xac, 0xdd, 0x2b, 0xa0, 0x15, 0x69, 0x01, 0x16, - 0x5c, 0xab, 0xac, 0xcf, 0x09, 0xc7, 0x2e, 0xd2, 0x44, 0xc7, 0xd9, 0xb9, - 0xfc, 0xfb, 0x97, 0xc6, 0xd9, 0x5a, 0x7f, 0x20, 0xac, 0x38, 0xec, 0xd2, - 0x80, 0x58, 0x33, 0xbd, 0x12, 0x68, 0xab, 0x6b, 0xd9, 0x44, 0x1b, 0x0e, - 0x1c, 0x9e, 0xbf, 0x2e, 0xee, 0x05, 0xe6, 0x86, 0x91, 0x97, 0xb9, 0xd8, - 0xd4, 0xae, 0xd2, 0xb5, 0x49, 0xc4, 0x82, 0xb1, 0x61, 0x66, 0x17, 0xd9, - 0xe6, 0xfb, 0x12, 0x6c, 0x10, 0x36, 0x63, 0xc2, 0xf2, 0xbe, 0x4a, 0x72, - 0x24, 0xbd, 0x17, 0x1b, 0x6c, 0x97, 0x67, 0x97, 0x83, 0x37, 0x35, 0x46, - 0x31, 0xbc, 0xe0, 0xa2, 0xf7, 0xb0, 0xbb, 0xb7, 0x88, 0x61, 0x6a, 0x93, - 0x15, 0xc4, 0x1e, 0x64, 0xdf, 0x5e, 0xde, 0x58, 0x23, 0xbd, 0x29, 0x6b, - 0x69, 0x16, 0x93, 0x0d, 0x46, 0xa4, 0x9f, 0x30, 0xf7, 0x30, 0x14, 0x69, - 0x5d, 0xad, 0xf1, 0xf6, 0xaa, 0xba, 0xd1, 0x39, 0x59, 0xb2, 0xaf, 0x9b, - 0x08, 0x37, 0x8f, 0x7f, 0x0c, 0xdb, 0xc9, 0x52, 0x26, 0x65, 0x6b, 0xb8, - 0x25, 0x80, 0x63, 0x37, 0x10, 0x1e, 0x4b, 0x78, 0xad, 0x6f, 0x35, 0xfa, - 0x68, 0xfc, 0x21, 0x55, 0x78, 0x3c, 0x69, 0x20, 0xec, 0x4f, 0x88, 0x50, - 0xda, 0x57, 0xd0, 0x15, 0x26, 0x66, 0xce, 0x1c, 0x9e, 0x1e, 0xdb, 0xf9, - 0x9a, 0x3a, 0xe7, 0xbd, 0x6c, 0x73, 0x32, 0x85, 0xb4, 0x42, 0x52, 0x86, - 0xc2, 0x6e, 0x52, 0xb0, 0xf4, 0xf6, 0xe3, 0x3e, 0x54, 0xdb, 0x75, 0xd9, - 0xc5, 0x95, 0xfe, 0xd2, 0x4f, 0x11, 0x6d, 0x64, 0x20, 0x4f, 0x49, 0x89, - 0x8b, 0x8a, 0xe3, 0x1c, 0xa2, 0x7f, 0xb5, 0x02, 0xf1, 0x11, 0xd0, 0xd8, - 0xb9, 0xfe, 0xba, 0xf7, 0x0a, 0x49, 0xa0, 0x64, 0xc1, 0xf3, 0xb2, 0xb1, - 0x2b, 0xcb, 0xe5, 0x7e, 0xa6, 0x53, 0x3b, 0xbf, 0xf1, 0xad, 0x53, 0xda, - 0xa8, 0x10, 0x21, 0x42, 0xaa, 0x48, 0xe2, 0x81, 0x3b, 0xd3, 0xc3, 0x4a, - 0x4b, 0x77, 0xae, 0x89, 0x71, 0x80, 0x27, 0x9f, 0x41, 0x6d, 0xe5, 0x43, - 0x63, 0xd5, 0x35, 0xa7, 0xe0, 0x57, 0xab, 0xdb, 0xe8, 0x1e, 0xf2, 0xc5, - 0x9b, 0xf1, 0xe7, 0xac, 0x5c, 0x6c, 0x6d, 0xf7, 0xea, 0xb2, 0xb6, 0x9b, - 0x73, 0xc7, 0x5d, 0x18, 0x84, 0x1d, 0x5f, 0x49, 0x58, 0x32, 0x97, 0x12, - 0x66, 0xd7, 0x7d, 0x25, 0x6f, 0x03, 0xd2, 0x3b, 0xe0, 0x05, 0x1a, 0xfa, - 0x51, 0xeb, 0xd3, 0x42, 0x78, 0x8b, 0xc8, 0xb7, 0x41, 0x73, 0xed, 0x41, - 0x4e, 0xc5, 0xe9, 0x2d, 0x04, 0x20, 0xf3, 0x5a, 0x28, 0xce, 0x1c, 0xa3, - 0xf5, 0x46, 0x4e, 0xef, 0x9e, 0x7d, 0xef, 0xe0, 0x28, 0xe4, 0x24, 0x94, - 0xe6, 0x54, 0x68, 0x64, 0x75, 0x6f, 0x54, 0xde, 0x94, 0xa6, 0x6f, 0x76, - 0xa2, 0xfa, 0x48, 0x68, 0x45, 0x44, 0x1a, 0xde, 0xff, 0x90, 0xd3, 0x22, - 0x21, 0x2e, 0xa5, 0x45, 0x0a, 0xa7, 0xa5, 0x37, 0xef, 0xab, 0x38, 0x12, - 0xdd, 0x2c, 0xbd, 0x22, 0x8e, 0xbb, 0x67, 0xc8, 0xe6, 0xa9, 0xf2, 0x4d, - 0x0c, 0x9f, 0x0e, 0xcb, 0x69, 0x09, 0xfc, 0x3d, 0xd4, 0x2f, 0x58, 0x4a, - 0xf5, 0x5f, 0x6a, 0x76, 0x35, 0x35, 0x63, 0x3e, 0xf6, 0xc8, 0x5b, 0x1e, - 0x8d, 0x5a, 0xcf, 0x44, 0xaf, 0x35, 0x57, 0x7f, 0x83, 0x5f, 0x1f, 0x13, - 0x91, 0xd6, 0x47, 0xdf, 0xd1, 0x60, 0x52, 0x7e, 0x22, 0xf0, 0xa7, 0x26, - 0x4b, 0x6c, 0x5c, 0xbf, 0xa3, 0xfd, 0xd2, 0x47, 0xe9, 0x74, 0x9e, 0x46, - 0xdf, 0xb8, 0x92, 0x89, 0x14, 0x1e, 0xf8, 0x5a, 0x9e, 0x97, 0xcf, 0xe0, - 0xe2, 0x34, 0xd0, 0x4d, 0x95, 0x1b, 0x5b, 0xb9, 0x93, 0xb2, 0xdf, 0xdd, - 0xb5, 0xa4, 0xac, 0x1b, 0x28, 0xad, 0x16, 0xd8, 0xda, 0x26, 0xde, 0xfb, - 0xd4, 0x6e, 0x66, 0x64, 0x3b, 0x12, 0x1e, 0xf8, 0x70, 0x47, 0xcc, 0x75, - 0x80, 0xca, 0x6d, 0xc6, 0xe7, 0x35, 0x99, 0x0f, 0x13, 0x0d, 0x73, 0x56, - 0x89, 0x7d, 0x28, 0x77, 0x17, 0x4d, 0x87, 0x75, 0x64, 0x12, 0xf7, 0x38, - 0x56, 0x35, 0x77, 0xd4, 0x92, 0x57, 0xd6, 0x19, 0x57, 0x67, 0x47, 0x81, - 0xc8, 0xb6, 0x44, 0x4e, 0xc0, 0xb3, 0xc0, 0x4e, 0x56, 0xaa, 0x55, 0xed, - 0x8d, 0xa5, 0x89, 0x51, 0x22, 0x2d, 0xfb, 0x07, 0xd0, 0x78, 0xc1, 0x0c, - 0x55, 0x4a, 0x0d, 0x66, 0xed, 0x1d, 0x7c, 0xb1, 0xa6, 0x7b, 0x31, 0x63, - 0xaf, 0xdf, 0x49, 0x56, 0x74, 0xb1, 0x24, 0xa9, 0xd5, 0x46, 0x9a, 0xc0, - 0x47, 0x84, 0x13, 0x3e, 0x06, 0x23, 0x3e, 0xee, 0x72, 0x53, 0x72, 0xfe, - 0x90, 0xe8, 0x31, 0x64, 0x19, 0x88, 0xca, 0x69, 0xbf, 0x47, 0xf5, 0x9f, - 0x77, 0x04, 0x4f, 0x35, 0x13, 0xfb, 0x83, 0x66, 0xdb, 0x46, 0x33, 0x11, - 0x9f, 0x05, 0x1e, 0xe4, 0x67, 0x13, 0xc4, 0xb5, 0x75, 0x12, 0xd9, 0x34, - 0xe3, 0x8d, 0xf3, 0xb4, 0x84, 0x75, 0xc8, 0xf4, 0x64, 0x2d, 0xd1, 0xce, - 0x49, 0x9b, 0x94, 0x3d, 0x12, 0x6b, 0xbf, 0xa2, 0x17, 0x02, 0x3e, 0xc5, - 0xec, 0xe9, 0x8b, 0x36, 0xe3, 0x0b, 0x13, 0xb0, 0x8f, 0xb0, 0x39, 0x54, - 0x48, 0xc2, 0xae, 0x22, 0x66, 0x72, 0x9c, 0x37, 0xaf, 0x60, 0xc2, 0x85, - 0x82, 0x25, 0x9d, 0x07, 0xde, 0xf4, 0xb1, 0xdf, 0x7e, 0xa1, 0x43, 0xfd, - 0xc1, 0x3c, 0x91, 0x3e, 0x7e, 0xdd, 0xcf, 0x04, 0xbf, 0xdf, 0xe9, 0xc8, - 0xe6, 0x9d, 0xea, 0x00, 0x0a, 0x80, 0x01, 0x35, 0xe7, 0x15, 0x1c, 0x99, - 0xd3, 0x20, 0x24, 0x83, 0x48, 0xf4, 0xa4, 0x47, 0xdc, 0x06, 0xe5, 0x6e, - 0x50, 0x45, 0x82, 0x7f, 0xcc, 0xc6, 0x1c, 0xb4, 0x0d, 0xc2, 0x0f, 0x2f, - 0x47, 0xc4, 0x88, 0x09, 0xc4, 0x59, 0x7d, 0x6b, 0x92, 0x45, 0xae, 0xaf, - 0x42, 0x8e, 0x39, 0xc8, 0x40, 0x85, 0x9d, 0x58, 0xf0, 0xf9, 0xe8, 0x68, - 0xe2, 0x39, 0x79, 0xb8, 0xf5, 0xb6, 0x92, 0x86, 0x70, 0x18, 0x0b, 0x41, - 0xb3, 0x28, 0x40, 0x25, 0x1e, 0x44, 0x0b, 0xbd, 0xc2, 0xd4, 0xb4, 0xcc, - 0x4e, 0x87, 0x1c, 0xa8, 0xa6, 0x27, 0xdc, 0x8c, 0xfe, 0x61, 0xb0, 0x34, - 0x55, 0x12, 0xc8, 0xc2, 0x0f, 0xc9, 0x34, 0xb8, 0x0f, 0x9c, 0x75, 0x1d, - 0x24, 0xdb, 0xdc, 0x9e, 0x1c, 0xa1, 0xb6, 0xd0, 0x81, 0xf5, 0x39, 0xff, - 0x23, 0x6d, 0x26, 0x6d, 0x53, 0x60, 0x5e, 0x5d, 0x39, 0x5c, 0xce, 0xd2, - 0xe3, 0x7c, 0xf2, 0x61, 0xd7, 0x4d, 0xb8, 0xcb, 0x2b, 0x33, 0x10, 0x3f, - 0x29, 0x5a, 0x0c, 0xa0, 0x4b, 0xc2, 0xd0, 0xda, 0x1a, 0x34, 0xb4, 0x41, - 0x50, 0x5f, 0x4e, 0x3f, 0x91, 0x0b, 0xbf, 0x07, 0xff, 0x30, 0x87, 0x2e, - 0xe4, 0x25, 0x1c, 0x83, 0x1c, 0x61, 0x5f, 0xb9, 0xbd, 0x5c, 0xad, 0xc6, - 0xb5, 0x08, 0x1e, 0x79, 0xcc, 0xea, 0x93, 0x54, 0xb1, 0x34, 0x36, 0x04, - 0x5d, 0x32, 0x5a, 0x76, 0x7e, 0x11, 0x8b, 0xa1, 0xb0, 0x32, 0xac, 0x79, - 0x00, 0x94, 0xb2, 0xcf, 0xc9, 0xea, 0x2a, 0x72, 0xff, 0x00, 0x45, 0x88, - 0xfe, 0x7b, 0x6a, 0x27, 0x99, 0x38, 0xb8, 0x07, 0x1d, 0xf9, 0x20, 0x81, - 0xb1, 0x04, 0xe6, 0x9b, 0xe2, 0xd1, 0x1c, 0x45, 0x54, 0x03, 0x93, 0xca, - 0x46, 0x80, 0x3d, 0xfc, 0xba, 0x95, 0x59, 0x58, 0x6b, 0x41, 0x7b, 0x33, - 0x98, 0x97, 0xa8, 0x72, 0xdd, 0xb3, 0xf6, 0x44, 0x16, 0xe6, 0x87, 0x50, - 0x03, 0xc1, 0x59, 0x11, 0x3d, 0x6f, 0xfd, 0x52, 0x9d, 0xf2, 0xbc, 0x95, - 0xeb, 0xd7, 0xf7, 0x09, 0x3a, 0xaa, 0x09, 0x2b, 0xe8, 0x00, 0x73, 0x5c, - 0x14, 0x26, 0x65, 0x30, 0x8a, 0x92, 0xba, 0x13, 0x21, 0x62, 0x71, 0x51, - 0x38, 0x3d, 0x72, 0x16, 0x78, 0x3c, 0x1d, 0xb9, 0xc2, 0x26, 0x34, 0x39, - 0xd6, 0x63, 0xec, 0x91, 0xb9, 0x8c, 0xa6, 0x1e, 0x12, 0x0b, 0x0e, 0xdb, - 0x22, 0x72, 0x57, 0x9c, 0x92, 0x16, 0xe8, 0x1a, 0xe6, 0xad, 0x99, 0x1f, - 0xac, 0xaf, 0xe2, 0xaf, 0x56, 0x68, 0x27, 0x33, 0xa9, 0x55, 0x60, 0xed, - 0x5b, 0x57, 0x94, 0xfe, 0xef, 0xb6, 0xc9, 0x8c, 0x4b, 0x66, 0xe4, 0xc5, - 0x27, 0x00, 0x19, 0x7a, 0x86, 0x04, 0xac, 0xfe, 0x03, 0x5b, 0x2f, 0xc0, - 0xd1, 0x27, 0x2f, 0xaa, 0x30, 0x50, 0xba, 0xf6, 0xfc, 0x88, 0x88, 0xa1, - 0x8d, 0xeb, 0xba, 0xe7, 0x4a, 0x33, 0x62, 0xf7, 0x5d, 0x6c, 0x87, 0x8e, - 0x1b, 0x1b, 0x39, 0x10, 0x22, 0xc5, 0xf6, 0xbe, 0xab, 0xe0, 0x8f, 0x47, - 0x04, 0x48, 0x4c, 0xcc, 0x80, 0x7e, 0x39, 0x45, 0x35, 0x1d, 0x91, 0x2e, - 0xa1, 0x26, 0x65, 0x30, 0x60, 0x23, 0xad, 0xc8, 0xba, 0xf8, 0xe7, 0x5c, - 0x43, 0xb6, 0x2a, 0x49, 0x63, 0x73, 0x58, 0xb5, 0x8a, 0x07, 0x86, 0xec, - 0x63, 0x73, 0xe8, 0xf0, 0x02, 0x09, 0x94, 0x0a, 0x33, 0x1b, 0x23, 0x9a, - 0x5c, 0x15, 0x48, 0xf0, 0xe7, 0xad, 0x0b, 0xb4, 0x02, 0x41, 0xe8, 0xbd, - 0xfa, 0xbf, 0x6e, 0xe0, 0x59, 0x6a, 0xb7, 0xc3, 0x92, 0x17, 0x13, 0x78, - 0xbe, 0xee, 0x77, 0x39, 0xe7, 0x21, 0x9a, 0x6f, 0xc4, 0xa7, 0x32, 0x2f, - 0x1d, 0x13, 0x84, 0x20, 0x09, 0xd2, 0x6b, 0xb4, 0x3e, 0x34, 0xe9, 0x9d, - 0x61, 0xc9, 0x10, 0x11, 0x7e, 0x64, 0x24, 0xbb, 0xd0, 0x5a, 0x34, 0x37, - 0x78, 0x5c, 0xf1, 0xfa, 0x13, 0xc9, 0x8a, 0x6d, 0xca, 0x72, 0x34, 0x18, - 0x4b, 0xea, 0x0a, 0x7c, 0xb7, 0xa2, 0xce, 0x8d, 0xde, 0x75, 0x9b, 0x29, - 0xa4, 0x74, 0xcd, 0xd3, 0x46, 0x01, 0xe8, 0x9c, 0x2c, 0x9f, 0x92, 0xf4, - 0xfc, 0x67, 0xd5, 0xcd, 0xf5, 0xb9, 0xa5, 0x17, 0x36, 0x1f, 0x82, 0x02, - 0xf2, 0x53, 0xc1, 0x37, 0x07, 0xa4, 0x25, 0x36, 0x46, 0x7f, 0x99, 0x52, - 0xd1, 0x66, 0xd7, 0xda, 0x2f, 0x4e, 0xe6, 0xfc, 0x76, 0x85, 0xf5, 0x5b, - 0x2a, 0x68, 0x9d, 0x99, 0xd9, 0x7e, 0xd8, 0xa0, 0xd5, 0x3d, 0x20, 0x38, - 0x05, 0x31, 0xea, 0xa1, 0xf4, 0xaa, 0xd5, 0x2c, 0xf4, 0x98, 0x46, 0x85, - 0x7f, 0xff, 0x88, 0x52, 0x37, 0xcd, 0xdc, 0xfd, 0xcf, 0x4d, 0x89, 0x89, - 0x2a, 0x99, 0xdc, 0xac, 0x54, 0x8e, 0x84, 0x30, 0xcd, 0x32, 0x0d, 0x57, - 0xd8, 0x0a, 0x2f, 0x68, 0x2b, 0x39, 0x6f, 0x43, 0x43, 0x23, 0xb3, 0x96, - 0x7d, 0xdd, 0x59, 0xd0, 0x61, 0xd2, 0x51, 0x07, 0x08, 0xc9, 0xbb, 0x86, - 0x93, 0xa4, 0x52, 0x19, 0x88, 0x8b, 0x1f, 0xc1, 0x0a, 0x5a, 0x53, 0xf0, - 0x39, 0x06, 0x97, 0xf6, 0x0d, 0x40, 0xa1, 0x55, 0x15, 0x66, 0x50, 0x41, - 0x44, 0xcf, 0x5d, 0x18, 0xf5, 0x2d, 0x81, 0x53, 0xdb, 0x55, 0xbe, 0xac, - 0x6b, 0xc4, 0xbd, 0xb9, 0xb6, 0xcb, 0x18, 0xf6, 0x7f, 0x14, 0x30, 0x8b, - 0x80, 0x16, 0x6a, 0xf7, 0x8d, 0x59, 0xc0, 0x42, 0xcb, 0x6f, 0xf4, 0xca, - 0x63, 0x3e, 0xa5, 0xd0, 0xc4, 0x34, 0xd8, 0xb8, 0x2a, 0xad, 0xa9, 0xa9, - 0x86, 0x89, 0xe4, 0x6f, 0x12, 0x6a, 0xad, 0x25, 0x67, 0xe0, 0x31, 0x8c, - 0x9f, 0xa1, 0x04, 0xac, 0x28, 0xc6, 0xf7, 0xc8, 0xed, 0x17, 0xcf, 0x91, - 0x43, 0xc4, 0xeb, 0x87, 0x83, 0x1d, 0x5a, 0xb1, 0xb8, 0x4c, 0x9d, 0xc9, - 0x41, 0xeb, 0xd8, 0x6b, 0xdb, 0xde, 0xce, 0x9c, 0xbe, 0xad, 0x74, 0xdf, - 0xbb, 0x78, 0x61, 0xd4, 0x2a, 0xf4, 0x46, 0x95, 0x69, 0x40, 0x38, 0x7f, - 0x56, 0x68, 0x8a, 0x7f, 0x02, 0x8a, 0x5e, 0x88, 0x37, 0x60, 0x01, 0x9a, - 0x3d, 0xbb, 0xbb, 0x87, 0x21, 0x20, 0x71, 0x97, 0xe9, 0x1e, 0xc0, 0xa4, - 0xbe, 0xb9, 0x58, 0xeb, 0xce, 0xc4, 0x44, 0x07, 0xae, 0x39, 0x29, 0x12, - 0x63, 0xea, 0x90, 0x98, 0x6d, 0xcf, 0x43, 0x23, 0xd5, 0x4e, 0x66, 0xb6, - 0x81, 0xd0, 0x91, 0x49, 0x52, 0x41, 0x12, 0xaf, 0xc1, 0xc9, 0x1d, 0xdc, - 0x81, 0xbc, 0x0a, 0x9a, 0xef, 0x3b, 0x99, 0x67, 0xd6, 0x04, 0xb1, 0x79, - 0xe6, 0x37, 0x7d, 0xa9, 0x21, 0xa4, 0x84, 0x16, 0xd7, 0x51, 0xc1, 0xcd, - 0x27, 0xf0, 0xf2, 0xfa, 0xcc, 0x2f, 0xef, 0xa6, 0x0d, 0xae, 0x2a, 0x6c, - 0xee, 0xf7, 0xf2, 0xa4, 0xb9, 0x09, 0xe3, 0x92, 0x71, 0xb0, 0xe8, 0xfb, - 0xb3, 0x9e, 0x03, 0x25, 0xd8, 0x4f, 0x83, 0x28, 0x82, 0x92, 0x67, 0xfd, - 0xf8, 0x55, 0x7e, 0xc0, 0x07, 0xfe, 0xbd, 0x1b, 0xe0, 0x3d, 0x5c, 0x7e, - 0xe9, 0xfb, 0x00, 0xed, 0x13, 0x7d, 0xb3, 0x98, 0x00, 0x6d, 0x1c, 0xfa, - 0x6e, 0x89, 0x83, 0xd2, 0x7a, 0xbc, 0x7b, 0xe8, 0xbf, 0x77, 0x0a, 0x75, - 0x15, 0x9f, 0x8b, 0x00, 0x88, 0x9f, 0x4b, 0xe4, 0xc3, 0x1a, 0x28, 0x3d, - 0xaf, 0x36, 0x88, 0x0c, 0xe8, 0x0a, 0x75, 0x49, 0x00, 0xe3, 0xda, 0x91, - 0xef, 0x0e, 0x8b, 0xd8, 0x41, 0x97, 0xe9, 0x05, 0xfa, 0xd0, 0x0e, 0x4d, - 0xd2, 0xfc, 0x5c, 0x72, 0xc5, 0x44, 0xf4, 0x61, 0x7c, 0x71, 0x4b, 0x2d, - 0x6d, 0x61, 0xc4, 0x3e, 0xb6, 0xa4, 0xfb, 0xbe, 0x93, 0xcd, 0x98, 0xd2, - 0x86, 0x25, 0xda, 0x3d, 0xf3, 0x84, 0x87, 0x27, 0xff, 0x04, 0x8c, 0x1d, - 0x5e, 0x51, 0xc1, 0x7d, 0x2c, 0x82, 0xe5, 0x90, 0x16, 0xf8, 0x7f, 0x4c, - 0xed, 0x57, 0x9b, 0xd3, 0x6f, 0x8e, 0x50, 0xee, 0x85, 0x60, 0x68, 0x94, - 0xd2, 0x9f, 0xbf, 0x07, 0xee, 0x62, 0xe5, 0xdc, 0x12, 0x51, 0x23, 0x89, - 0x1c, 0xb5, 0x7f, 0xf8, 0xce, 0x4d, 0x08, 0x5c, 0xdc, 0x43, 0x16, 0x59, - 0x17, 0x60, 0x53, 0x32, 0x93, 0x43, 0x1e, 0x3f, 0x88, 0x03, 0x1a, 0x3b, - 0xa9, 0xa5, 0xdf, 0x07, 0x74, 0x5a, 0x81, 0x66, 0xe8, 0xe8, 0x91, 0xbe, - 0xa8, 0x73, 0xfa, 0x7b, 0x6d, 0x2e, 0x2c, 0xaf, 0x0b, 0x35, 0xef, 0x61, - 0x99, 0xd4, 0x6a, 0x4d, 0xea, 0xd8, 0x12, 0x1f, 0x8e, 0x1c, 0x62, 0x20, - 0xec, 0x18, 0x16, 0x0f, 0x02, 0xe8, 0x90, 0x8b, 0x09, 0xeb, 0x8f, 0x44, - 0x21, 0x97, 0x6b, 0x80, 0xa7, 0xad, 0x1e, 0xdb, 0xd5, 0x9e, 0x65, 0xf4, - 0x72, 0x7b, 0x14, 0xa1, 0xdc, 0xc1, 0x23, 0x59, 0x0c, 0x1a, 0xb8, 0x7f, - 0xf9, 0xd7, 0xe3, 0x4f, 0x7b, 0xd9, 0xf1, 0x71, 0x81, 0x4c, 0xaa, 0x50, - 0xf5, 0x83, 0x3d, 0xb1, 0xea, 0xf0, 0x3e, 0x23, 0x5d, 0x25, 0x71, 0xaf, - 0x87, 0x1d, 0xad, 0xb0, 0x99, 0x46, 0xdd, 0xbb, 0xe0, 0xe4, 0x61, 0x46, - 0x49, 0xaa, 0x7e, 0xd2, 0xd8, 0x8d, 0xe7, 0x22, 0xa8, 0x6e, 0xf7, 0xe6, - 0xb6, 0xb0, 0x1a, 0x96, 0xb3, 0x5f, 0xa4, 0xa4, 0x2f, 0xef, 0xaf, 0x32, - 0x81, 0x75, 0xc3, 0xed, 0x37, 0x8a, 0x60, 0x61, 0x49, 0xe9, 0x10, 0x5b, - 0x11, 0xe2, 0x44, 0xe4, 0x25, 0x74, 0x64, 0xc2, 0x8e, 0x36, 0x39, 0xff, - 0xa7, 0xc3, 0xb9, 0x2a, 0x4d, 0x02, 0xab, 0x9c, 0x10, 0x60, 0x90, 0xc2, - 0x84, 0x1b, 0x8b, 0xd2, 0xfd, 0x4a, 0x6e, 0xc1, 0xca, 0xd9, 0x65, 0x1c, - 0xe6, 0xb3, 0x74, 0x58, 0xf9, 0xd2, 0x7a, 0x0e, 0x43, 0x23, 0x7e, 0x9e, - 0x75, 0xc1, 0xc1, 0x57, 0x5a, 0xce, 0xb7, 0xa6, 0xca, 0x22, 0xf1, 0x60, - 0x3a, 0x26, 0x89, 0x03, 0x4b, 0x46, 0x16, 0xbe, 0x28, 0x54, 0xb9, 0x62, - 0x1e, 0xd8, 0xd6, 0xda, 0x83, 0xf5, 0xa8, 0x08, 0x8c, 0xbd, 0x6f, 0x60, - 0x5e, 0xd0, 0x08, 0xfc, 0xf6, 0xe2, 0x67, 0xc7, 0x0d, 0x6a, 0xf5, 0x95, - 0xa2, 0xeb, 0xf7, 0xc1, 0x45, 0x83, 0xf2, 0x3f, 0xd0, 0x0d, 0xf4, 0x20, - 0x94, 0xf1, 0x65, 0xaa, 0x13, 0x7b, 0xaf, 0x09, 0x1a, 0xf7, 0xfc, 0x1a, - 0xd8, 0xc2, 0xf1, 0x2c, 0x02, 0x08, 0xc3, 0x1d, 0x6d, 0xc3, 0x5a, 0xfd, - 0x26, 0xec, 0xd0, 0xfe, 0x39, 0x7c, 0xd4, 0xe8, 0xf7, 0x13, 0x30, 0x9e, - 0x2f, 0x4e, 0xd5, 0x9a, 0xb0, 0x8d, 0x4e, 0x24, 0x28, 0xa7, 0x7e, 0x39, - 0x9b, 0x60, 0x9d, 0x61, 0x28, 0x77, 0x49, 0x5f, 0x0e, 0xf5, 0x97, 0xe3, - 0xee, 0x94, 0x99, 0xa2, 0xbc, 0xc8, 0x4f, 0x7d, 0x19, 0x7e, 0x22, 0x96, - 0xe5, 0xee, 0x1a, 0x68, 0x7a, 0x1a, 0x4a, 0xc3, 0x94, 0xfc, 0x19, 0xf9, - 0x0f, 0x17, 0xd3, 0x66, 0xfa, 0xc0, 0xec, 0x4f, 0xce, 0x6a, 0x0b, 0x26, - 0xf9, 0x9a, 0xfe, 0x76, 0x1c, 0xe4, 0xf9, 0xdc, 0x61, 0x42, 0x2c, 0x62, - 0x4f, 0x8e, 0xae, 0x07, 0xce, 0xa6, 0x9a, 0x70, 0x67, 0x6b, 0x83, 0xa6, - 0x54, 0x77, 0xf9, 0x60, 0xdb, 0x26, 0x40, 0xe0, 0xa7, 0xa7, 0xa5, 0x44, - 0x08, 0xff, 0x5a, 0x26, 0xf6, 0x85, 0xbf, 0xd6, 0xd3, 0x56, 0x72, 0xb6, - 0xf7, 0x9a, 0x92, 0x67, 0x00, 0xef, 0x12, 0x06, 0xdc, 0x08, 0xd8, 0x8d, - 0xe4, 0x60, 0x7a, 0xe6, 0xde, 0x45, 0x34, 0xc4, 0xbd, 0x93, 0x27, 0xc2, - 0x8c, 0x47, 0xc5, 0x33, 0x19, 0xc7, 0xcc, 0x4c, 0x58, 0x8a, 0x0b, 0xb0, - 0xd3, 0xad, 0x34, 0x98, 0x4b, 0x68, 0x88, 0xbc, 0xbc, 0x2f, 0x5f, 0x56, - 0x11, 0x24, 0xa3, 0xc7, 0xf8, 0x3b, 0x48, 0x6e, 0x92, 0x6a, 0xff, 0xb8, - 0x83, 0x2b, 0x8a, 0x61, 0x2f, 0xe4, 0x69, 0x96, 0x8c, 0xfc, 0x41, 0x65, - 0x07, 0x9a, 0xf8, 0xee, 0x17, 0x1b, 0x48, 0xba, 0x2a, 0x9f, 0x40, 0x40, - 0xea, 0xfa, 0x2b, 0x51, 0xce, 0xb8, 0x26, 0x75, 0xc8, 0x78, 0xa3, 0xc2, - 0xd7, 0xcd, 0x35, 0x00, 0x15, 0x96, 0x0a, 0xb5, 0xbb, 0x15, 0x55, 0xa7, - 0x4f, 0xe8, 0x88, 0x57, 0x68, 0x43, 0x41, 0x3e, 0x7c, 0xe9, 0xe7, 0xce, - 0x05, 0xe7, 0xea, 0x62, 0x04, 0xd7, 0x7f, 0xed, 0x1d, 0x0e, 0x4f, 0xf0, - 0x2a, 0x95, 0x1c, 0x4b, 0x22, 0x8d, 0x68, 0x6d, 0x26, 0xce, 0xd9, 0x55, - 0x45, 0xa7, 0xa6, 0x6b, 0xa1, 0xef, 0xbc, 0xca, 0xd8, 0x86, 0x92, 0x31, - 0x14, 0x6e, 0x41, 0x12, 0xc8, 0xe4, 0xe6, 0x67, 0x4e, 0x82, 0x56, 0xa2, - 0x15, 0xca, 0xf0, 0xfe, 0x71, 0xf1, 0x26, 0x02, 0x71, 0xf3, 0xc8, 0xa9, - 0x39, 0x57, 0xb6, 0xd8, 0x42, 0x3b, 0x2c, 0x13, 0xfd, 0x56, 0xd1, 0x1c, - 0x04, 0xec, 0xa9, 0x16, 0x82, 0x72, 0x1e, 0x01, 0x88, 0x9b, 0xca, 0x88, - 0xf6, 0xd2, 0x1b, 0xd4, 0xae, 0x97, 0x64, 0x84, 0x52, 0xb8, 0x5d, 0x5f, - 0xc0, 0x6b, 0x30, 0x79, 0x1c, 0x3b, 0xf5, 0x38, 0xa9, 0x1a, 0xbf, 0x71, - 0x3b, 0x84, 0x83, 0xd9, 0xca, 0x50, 0x3c, 0xed, 0xd1, 0xa5, 0x56, 0xbb, - 0x71, 0xa9, 0x7a, 0x05, 0x6a, 0xd6, 0x7c, 0xbf, 0x85, 0xfa, 0x05, 0xf0, - 0x7d, 0xab, 0xa8, 0xb1, 0x91, 0xe3, 0x19, 0x19, 0x61, 0x37, 0xf9, 0xd4, - 0x34, 0x9b, 0x82, 0xf2, 0x2d, 0x40, 0x1c, 0x25, 0x48, 0x2b, 0x7d, 0xe4, - 0xbe, 0xc0, 0xb4, 0x4a, 0x9d, 0xb5, 0x08, 0xc7, 0x08, 0x29, 0xc3, 0x43, - 0xb1, 0xf5, 0xc4, 0x8b, 0x03, 0x14, 0xdf, 0x42, 0xf2, 0x13, 0x20, 0x29, - 0xc4, 0xe6, 0x85, 0xfe, 0xf3, 0xa0, 0xf1, 0x1e, 0xd8, 0xd0, 0xc1, 0x20, - 0xf4, 0xa4, 0x53, 0xaf, 0x91, 0x31, 0x45, 0xe4, 0xaf, 0x02, 0x64, 0x9b, - 0x0e, 0xed, 0x8a, 0x76, 0x21, 0xc8, 0xe1, 0x00, 0xfb, 0x30, 0x76, 0xe6, - 0x4c, 0x2b, 0x7d, 0xe4, 0xbe, 0x40, 0xb4, 0x48, 0x9d, 0xb5, 0x08, 0x47, - 0x08, 0x2b, 0xc3, 0x5c, 0xec, 0xee, 0x9a, 0xf8, 0xbc, 0x16, 0xa5, 0xea, - 0x1b, 0xb0, 0x0a, 0x2b, 0xd2, 0xae, 0x3b, 0x85, 0xd7, 0x76, 0xe8, 0x9a, - 0x2b, 0x97, 0xe4, 0x56, 0x9c, 0xd6, 0x06, 0x96, 0xbf, 0x7c, 0x23, 0x54, - 0x0d, 0x2f, 0xd5, 0x85, 0x59, 0x8a, 0x07, 0xc3, 0xe1, 0xc7, 0xa3, 0xb8, - 0xb6, 0x34, 0x3a, 0xdd, 0xda, 0x68, 0x40, 0x55, 0x09, 0x2c, 0xfa, 0x04, - 0xf2, 0x6c, 0x85, 0xef, 0xd4, 0x81, 0xcd, 0x6c, 0x90, 0x10, 0xd5, 0x42, - 0xa3, 0x75, 0xa5, 0x99, 0xd5, 0xac, 0x75, 0x20, 0x2e, 0x23, 0xa1, 0x1d, - 0x7e, 0x84, 0xe8, 0x27, 0xcb, 0xd3, 0x07, 0x50, 0x2c, 0x1c, 0x5a, 0x39, - 0x2b, 0x08, 0x42, 0x99, 0x62, 0x0e, 0xea, 0x3b, 0x07, 0x7a, 0x32, 0x1e, - 0x4b, 0xe9, 0xee, 0xc6, 0xd7, 0x90, 0xfd, 0x2d, 0xa3, 0x71, 0x3a, 0x07, - 0x99, 0xd2, 0x3d, 0x92, 0x48, 0xe8, 0x8b, 0x11, 0x7c, 0x5b, 0x37, 0x53, - 0xd1, 0xdc, 0xb4, 0xa9, 0x73, 0xaf, 0x1c, 0xc8, 0x68, 0xcb, 0xa3, 0x60, - 0x3e, 0x4e, 0xd8, 0xdf, 0x86, 0x3d, 0xbb, 0x25, 0xcb, 0x70, 0x39, 0x2a, - 0x4b, 0x22, 0x7b, 0x83, 0x7a, 0x6f, 0x3b, 0x9c, 0xf8, 0x62, 0x94, 0xb7, - 0xbe, 0x3e, 0xac, 0xd4, 0x13, 0xa7, 0xfd, 0x56, 0x6f, 0xae, 0x2d, 0x63, - 0xcb, 0x2f, 0xf9, 0x14, 0x5f, 0x38, 0xdc, 0x8e, 0x46, 0x2a, 0x10, 0xed, - 0xed, 0x36, 0xaa, 0x0b, 0x04, 0x5d, 0x6f, 0x49, 0x88, 0x11, 0x53, 0xe2, - 0x49, 0xa7, 0xcc, 0xf8, 0xfc, 0xa6, 0xe2, 0x01, 0x9c, 0xca, 0xe4, 0x75, - 0x14, 0x0c, 0xf6, 0xcf, 0x7a, 0xb4, 0xaf, 0x46, 0x15, 0x28, 0xb8, 0x69, - 0x84, 0x92, 0x68, 0x47, 0x2b, 0xc2, 0x89, 0x31, 0x9f, 0x6a, 0x32, 0x00, - 0x28, 0xbb, 0xaf, 0x29, 0x7d, 0x90, 0x74, 0x03, 0x7f, 0x98, 0x17, 0x7c, - 0x85, 0x93, 0xf0, 0x44, 0xe6, 0x38, 0xf0, 0x92, 0x92, 0x53, 0x6a, 0x2b, - 0x30, 0xe4, 0x23, 0xfc, 0x05, 0x4d, 0xef, 0x31, 0x9e, 0x82, 0x68, 0x3f, - 0x76, 0xf7, 0xf4, 0xa1, 0xd3, 0x87, 0x94, 0x85, 0x24, 0x4d, 0x16, 0x82, - 0x98, 0x1a, 0xef, 0x1d, 0x36, 0x87, 0xf0, 0x68, 0x55, 0x7c, 0x2a, 0x57, - 0xe0, 0x42, 0x71, 0xb8, 0xd2, 0x56, 0xe4, 0xc4, 0x52, 0xdc, 0x79, 0xc6, - 0x85, 0xe8, 0xb5, 0x4f, 0x3b, 0x1c, 0x62, 0xb5, 0x0b, 0xa8, 0x76, 0x99, - 0x56, 0xc7, 0x5b, 0xbc, 0xf1, 0x0a, 0x25, 0xca, 0x1b, 0x2d, 0xda, 0x98, - 0x40, 0x3f, 0xde, 0x02, 0x00, 0xca, 0xb3, 0xf5, 0xdf, 0x52, 0x13, 0xec, - 0x56, 0x68, 0x19, 0x06, 0xe0, 0x41, 0x35, 0x3d, 0xf2, 0x9e, 0xdb, 0x57, - 0xe7, 0x9b, 0x03, 0xe2, 0x7a, 0xac, 0x9d, 0xfa, 0x44, 0x3d, 0x4e, 0x37, - 0x3a, 0xe7, 0xb5, 0xfb, 0x32, 0xbd, 0xfc, 0x4c, 0xcd, 0x2e, 0xa8, 0x09, - 0x66, 0x04, 0x74, 0x3e, 0xea, 0x8c, 0x56, 0xcd, 0x4a, 0x51, 0x85, 0xd6, - 0x15, 0xfe, 0xc5, 0x04, 0x06, 0x62, 0x2d, 0xa5, 0x9b, 0xcc, 0x81, 0x91, - 0x36, 0x15, 0x0a, 0x25, 0xad, 0xf7, 0xd6, 0x04, 0x80, 0xcb, 0x41, 0x40, - 0x63, 0x28, 0x3d, 0x9e, 0x40, 0xe8, 0xce, 0x3f, 0xe3, 0xfb, 0x00, 0x57, - 0xc8, 0xb8, 0x0e, 0x93, 0x53, 0x14, 0x0b, 0x31, 0x87, 0xe8, 0x40, 0x1f, - 0xb3, 0x38, 0x42, 0x36, 0xf7, 0x1c, 0xbf, 0xa1, 0x27, 0xb0, 0xa6, 0xd7, - 0x2e, 0xa3, 0x78, 0x65, 0xed, 0xb0, 0xae, 0xad, 0x97, 0xdf, 0xd6, 0x57, - 0xf1, 0x9c, 0x8c, 0xfe, 0x48, 0x63, 0x23, 0x01, 0x42, 0xc6, 0xc3, 0x40, - 0xa0, 0x3e, 0x9f, 0xae, 0x97, 0x5f, 0x01, 0x0f, 0xce, 0xbc, 0xc5, 0x09, - 0x69, 0x4f, 0x87, 0xbb, 0x26, 0xd8, 0xe5, 0x65, 0xaf, 0xa3, 0x39, 0x5b, - 0xbc, 0x2e, 0x70, 0x04, 0x3e, 0xbb, 0x22, 0xe2, 0x55, 0x77, 0x18, 0x60, - 0x4d, 0x9c, 0xf4, 0xa0, 0x64, 0xa3, 0x8b, 0x74, 0xf8, 0x38, 0xf7, 0x30, - 0x43, 0xa6, 0xad, 0x38, 0x64, 0xc9, 0x58, 0x07, 0x80, 0xec, 0x81, 0x11, - 0xc9, 0xac, 0xbb, 0x79, 0xd3, 0x87, 0x72, 0xa3, 0xee, 0xda, 0x23, 0x4b, - 0x79, 0x42, 0xab, 0xbf, 0x6f, 0x1a, 0x0c, 0x64, 0xc4, 0x0f, 0x83, 0x7f, - 0x37, 0x1f, 0x92, 0x93, 0x4d, 0x67, 0x42, 0x87, 0x1c, 0xd1, 0x30, 0x2b, - 0x18, 0x78, 0x90, 0x34, 0x6b, 0xff, 0x1e, 0x19, 0x14, 0x1f, 0xc7, 0x38, - 0x3d, 0xba, 0x8a, 0x16, 0x8f, 0x00, 0x87, 0xb9, 0xbc, 0xde, 0x28, 0xb9, - 0x35, 0xc5, 0x55, 0xd3, 0x77, 0xc8, 0x4d, 0x4a, 0x9c, 0xea, 0x1d, 0xfa, - 0x0a, 0xa4, 0x38, 0x91, 0xdc, 0x55, 0x8d, 0x7f, 0xa7, 0x3c, 0x44, 0xd5, - 0xd4, 0xd0, 0xa9, 0xdc, 0xce, 0x7d, 0x93, 0x1e, 0x22, 0xc1, 0xf0, 0xfe, - 0x56, 0xaa, 0x06, 0x7c, 0x8c, 0xff, 0xec, 0xd1, 0x3b, 0x22, 0x8e, 0xb5, - 0x53, 0x71, 0x6a, 0x9e, 0xc5, 0xd4, 0xbb, 0x97, 0x83, 0xc9, 0xc5, 0x88, - 0xdb, 0x38, 0xa8, 0xf2, 0x35, 0x47, 0x29, 0x01, 0xe6, 0x84, 0x34, 0x02, - 0xf4, 0xbe, 0x23, 0x1c, 0xff, 0x46, 0xf4, 0x17, 0x55, 0xaa, 0x1c, 0x38, - 0x4e, 0x51, 0xd6, 0x48, 0xad, 0xbf, 0x20, 0xfe, 0xec, 0x0e, 0xcc, 0xd5, - 0xd3, 0x69, 0x20, 0x9e, 0x2d, 0xd0, 0xde, 0x10, 0xd6, 0xf1, 0x28, 0x11, - 0xe5, 0x93, 0x57, 0x40, 0x1e, 0x6a, 0xd4, 0x4b, 0xf2, 0x2d, 0xed, 0xf0, - 0x05, 0xa2, 0x79, 0x69, 0xb3, 0x72, 0x4d, 0x8d, 0xdb, 0x42, 0x44, 0x9e, - 0xd0, 0xd3, 0x67, 0x18, 0xda, 0x01, 0x73, 0x3b, 0xa4, 0x72, 0x88, 0x34, - 0xd5, 0x60, 0x18, 0x13, 0x96, 0xa5, 0x0d, 0x2b, 0x2e, 0x52, 0xda, 0xe1, - 0x21, 0xd3, 0xae, 0xb5, 0x36, 0x76, 0x1e, 0x6b, 0x6d, 0x61, 0x8b, 0x64, - 0xa3, 0x2d, 0x40, 0x0f, 0x00, 0x7c, 0x59, 0x5f, 0x2a, 0x0b, 0xf9, 0xeb, - 0xff, 0xe4, 0x28, 0xf5, 0xab, 0x23, 0x52, 0x4a, 0xee, 0x53, 0x5d, 0xca, - 0x47, 0xe2, 0x9f, 0x73, 0xda, 0x83, 0x5c, 0xb9, 0xd2, 0x27, 0x12, 0xd7, - 0xc5, 0x11, 0xeb, 0x96, 0xf6, 0x54, 0x92, 0xa2, 0x79, 0x1b, 0xfb, 0xa0, - 0x8f, 0xb8, 0x1e, 0x27, 0xc4, 0x51, 0xac, 0xe9, 0x82, 0x31, 0x3f, 0xed, - 0x00, 0xa7, 0xa1, 0x1a, 0x6f, 0xc3, 0xe4, 0xc1, 0x50, 0xe3, 0x2c, 0xdc, - 0xa7, 0xeb, 0x84, 0x7e, 0x24, 0x79, 0x08, 0x87, 0x58, 0xd2, 0xc5, 0x9f, - 0x9c, 0x0d, 0xcd, 0x8e, 0xb9, 0x30, 0x50, 0x0d, 0xde, 0xa3, 0x0f, 0xc0, - 0xb0, 0xb5, 0x29, 0xbd, 0x15, 0xfd, 0x4c, 0xdf, 0xde, 0x07, 0x29, 0x3e, - 0x7c, 0xac, 0xce, 0xbc, 0x34, 0x91, 0x03, 0xfe, 0xec, 0x41, 0x32, 0x91, - 0x5d, 0xcc, 0x69, 0x25, 0x9b, 0xb2, 0xc3, 0x29, 0x92, 0xf9, 0x66, 0x68, - 0x98, 0xe7, 0xf0, 0x86, 0x0f, 0x9d, 0x12, 0xea, 0xef, 0x9b, 0xa8, 0xed, - 0x94, 0x81, 0x18, 0xef, 0x46, 0xee, 0x29, 0x1d, 0xc5, 0x02, 0xa4, 0x83, - 0x37, 0x92, 0x57, 0x63, 0x4c, 0x07, 0x69, 0x8d, 0x0a, 0x42, 0x06, 0xf8, - 0xdb, 0xbc, 0xbf, 0x2d, 0x01, 0xe2, 0x21, 0x2b, 0xfa, 0x06, 0xea, 0xc1, - 0x8c, 0x05, 0x65, 0x38, 0xb7, 0xb5, 0x1d, 0xbc, 0x6d, 0xb2, 0xea, 0x69, - 0x59, 0x07, 0x46, 0x2a, 0xf1, 0x7c, 0x00, 0xc5, 0xd8, 0xaa, 0x00, 0x8f, - 0x97, 0x7c, 0x62, 0xa1, 0xec, 0xd6, 0x01, 0xfe, 0x04, 0x0c, 0xab, 0x1b, - 0x52, 0xa3, 0x6f, 0x54, 0x32, 0x07, 0xfe, 0xaa, 0x99, 0xff, 0x67, 0xed, - 0x6a, 0x08, 0x07, 0xf3, 0xed, 0x30, 0x43, 0x3b, 0xe0, 0xfd, 0x6e, 0x34, - 0x78, 0xa1, 0x9c, 0x9c, 0xc7, 0x61, 0x37, 0x29, 0xfd, 0x90, 0xef, 0xad, - 0x4d, 0xdd, 0x48, 0x16, 0x52, 0x9f, 0x3d, 0x89, 0x4e, 0x5b, 0xe8, 0xc7, - 0x94, 0x1f, 0xf2, 0x50, 0x9a, 0x64, 0x7b, 0x55, 0xb1, 0x5e, 0xd6, 0xfc, - 0x84, 0xce, 0x19, 0xbc, 0xe0, 0xfd, 0x03, 0xa0, 0xcd, 0xcc, 0xb0, 0x4d, - 0x86, 0xcf, 0xc0, 0x18, 0x0d, 0x89, 0xaf, 0xe2, 0xd7, 0x8d, 0xaa, 0xd3, - 0x73, 0x80, 0xfa, 0xea, 0x15, 0x1c, 0x7b, 0x9d, 0x16, 0xb9, 0x8a, 0xfc, - 0x1e, 0x42, 0x59, 0x11, 0x09, 0x67, 0x84, 0x8d, 0x92, 0x42, 0xce, 0x9d, - 0x0d, 0x7e, 0xa8, 0x03, 0xfa, 0x64, 0xea, 0x98, 0x9a, 0xc8, 0x33, 0xfa, - 0x3f, 0x80, 0xcd, 0xf0, 0x87, 0x17, 0x69, 0xc0, 0x43, 0x84, 0x0e, 0xe1, - 0x8d, 0xca, 0x85, 0x91, 0x33, 0x35, 0x69, 0x62, 0x18, 0xcd, 0xf9, 0xb7, - 0xa1, 0x5d, 0x15, 0x56, 0xf0, 0xce, 0x9b, 0xdc, 0x24, 0xba, 0xca, 0x51, - 0xb7, 0x9a, 0x33, 0x70, 0xbe, 0xf1, 0xf1, 0xa8, 0x79, 0x8d, 0xab, 0x88, - 0xee, 0x1b, 0x33, 0x55, 0x42, 0x0e, 0x81, 0xcb, 0xa9, 0x9e, 0x4e, 0xf5, - 0xd7, 0x9f, 0x76, 0x83, 0xea, 0x13, 0xea, 0x8b, 0x6e, 0x83, 0x33, 0xbf, - 0xe4, 0xe7, 0x6f, 0x4f, 0x22, 0x4a, 0x00, 0xca, 0x53, 0x85, 0xa0, 0xe9, - 0x48, 0x16, 0xf0, 0x77, 0xf4, 0x3e, 0x0a, 0x4f, 0x78, 0xc7, 0x33, 0x7a, - 0x49, 0x16, 0xea, 0xd3, 0x79, 0x6d, 0xd4, 0x97, 0x61, 0x34, 0x7a, 0xa8, - 0xe3, 0xbd, 0x5d, 0xb6, 0x0a, 0x4e, 0xd9, 0x6e, 0x58, 0xb2, 0x3b, 0x2b, - 0xce, 0xcb, 0x27, 0xad, 0x45, 0x87, 0x56, 0x73, 0x93, 0xe6, 0x59, 0x78, - 0x68, 0xb8, 0x87, 0xc6, 0xf5, 0x8a, 0xe2, 0xf0, 0x12, 0x5b, 0xe8, 0x2a, - 0xa4, 0x07, 0x16, 0x2b, 0x42, 0xb4, 0xdb, 0xdd, 0xa9, 0x9e, 0x4e, 0xf5, - 0xd7, 0x9f, 0x76, 0x83, 0xea, 0x13, 0xea, 0x8b, 0x3b, 0xcf, 0x66, 0x3e, - 0xb2, 0x75, 0xad, 0x7e, 0xec, 0x14, 0xfd, 0x12, 0x94, 0x1a, 0x1a, 0x80, - 0x73, 0xe3, 0xdc, 0xbb, 0xa3, 0x0c, 0xb5, 0xea, 0x29, 0xfc, 0x89, 0x49, - 0x96, 0xa4, 0x9b, 0x70, 0xdc, 0x3b, 0x61, 0xad, 0xda, 0x9e, 0x20, 0xf6, - 0x21, 0xb4, 0x1d, 0x25, 0x07, 0x0a, 0x7e, 0x6d, 0x5d, 0x26, 0x92, 0xc0, - 0xd1, 0xb1, 0x8e, 0x6b, 0x31, 0x3d, 0x87, 0x58, 0x13, 0x4a, 0xa9, 0x54, - 0x8b, 0x22, 0xfe, 0x89, 0x92, 0x8b, 0xc9, 0x80, 0x42, 0x88, 0xbe, 0x33, - 0x37, 0xf3, 0xf0, 0x68, 0x2f, 0x38, 0x29, 0x6a, 0x44, 0xce, 0x9e, 0x6c, - 0x4a, 0xb7, 0xd2, 0xc4, 0x5e, 0x40, 0x26, 0x47, 0xbb, 0x40, 0x37, 0x70, - 0x53, 0x64, 0xae, 0x44, 0xd9, 0x27, 0x4e, 0x2c, 0xe5, 0xd8, 0x8c, 0x04, - 0xde, 0xaf, 0xbb, 0xd1, 0x4a, 0x75, 0xe3, 0x0f, 0x4a, 0x1a, 0x6c, 0x22, - 0x44, 0x1b, 0x73, 0x46, 0x1f, 0x21, 0x19, 0xe1, 0x1a, 0xa0, 0xf8, 0xea, - 0x15, 0x0d, 0x43, 0xfa, 0x5b, 0x4e, 0xae, 0xc5, 0xd7, 0x96, 0x4e, 0xc9, - 0x13, 0xf3, 0x16, 0x31, 0x84, 0x06, 0xf3, 0x34, 0xfd, 0x9c, 0x53, 0x70, - 0xd6, 0xdf, 0xcf, 0x4a, 0x6b, 0x21, 0x15, 0xb1, 0xc6, 0x47, 0x93, 0xfe, - 0xea, 0xf9, 0xf2, 0x5a, 0x8a, 0xa1, 0x9b, 0xe5, 0xa6, 0xaf, 0xb3, 0xe1, - 0x77, 0xc3, 0x66, 0xf4, 0x94, 0x33, 0x5e, 0xa0, 0x8a, 0xa8, 0xc2, 0x7a, - 0x92, 0xea, 0xe4, 0xc1, 0xe2, 0x50, 0x0c, 0x5d, 0x51, 0xfd, 0x34, 0x83, - 0x6e, 0x1b, 0x43, 0x07, 0x14, 0x17, 0x9f, 0x8e, 0x0a, 0x48, 0x8e, 0x3d, - 0x4d, 0xef, 0xcb, 0x8e, 0xae, 0x33, 0x4f, 0x8d, 0x4e, 0x00, 0x8d, 0x64, - 0x8d, 0x25, 0x14, 0x30, 0x57, 0xb2, 0x29, 0xc1, 0xdf, 0x1f, 0x10, 0x93, - 0xd0, 0x54, 0xa0, 0x89, 0x5c, 0x3e, 0x21, 0x0f, 0x6d, 0x5f, 0xd0, 0x19, - 0x28, 0x32, 0xd1, 0xab, 0xc9, 0x7f, 0x58, 0x30, 0xf9, 0xc0, 0x3f, 0xef, - 0xa2, 0x38, 0x83, 0xf2, 0x2d, 0x22, 0xed, 0xcd, 0x43, 0x92, 0x4c, 0x7d, - 0x81, 0xbc, 0x16, 0xc8, 0xbb, 0x81, 0x91, 0x29, 0xfc, 0x15, 0x6b, 0xdd, - 0x5f, 0xb2, 0xe2, 0xee, 0xfc, 0xff, 0xce, 0xf3, 0x27, 0x48, 0x7d, 0x07, - 0xd9, 0xb0, 0xfb, 0x92, 0x0c, 0x6e, 0x9d, 0xd2, 0x3f, 0xea, 0xdf, 0x0a, - 0xb4, 0xa5, 0xc1, 0x64, 0xf3, 0xae, 0x6c, 0x62, 0x96, 0xfd, 0x1e, 0x2e, - 0x52, 0xe5, 0x01, 0x7a, 0xce, 0x2b, 0x41, 0xfa, 0x58, 0x70, 0xb4, 0xc0, - 0xe4, 0x0e, 0x0c, 0x5e, 0x36, 0x20, 0x12, 0xb9, 0x76, 0x03, 0x25, 0x04, - 0xbd, 0xfc, 0xee, 0x27, 0x6b, 0x2d, 0x74, 0x30, 0x2a, 0x2c, 0x0c, 0x64, - 0x72, 0x73, 0x35, 0x1d, 0xe8, 0xd1, 0x64, 0x05, 0x9a, 0xee, 0x6e, 0x90, - 0xde, 0xae, 0x3c, 0x02, 0xdc, 0x7a, 0xa3, 0x6b, 0xea, 0xd4, 0x03, 0xa0, - 0xc9, 0xb7, 0xca, 0x29, 0x1d, 0x90, 0x8f, 0x2b, 0xfd, 0xe6, 0x49, 0xa8, - 0xe9, 0x23, 0x79, 0x7f, 0x5f, 0xd6, 0x23, 0xfd, 0xae, 0x43, 0x75, 0x23, - 0x36, 0xe1, 0x8d, 0x55, 0xe5, 0x4f, 0x31, 0xbd, 0x78, 0xeb, 0xc3, 0xff, - 0x1c, 0x1e, 0x4f, 0x11, 0x66, 0x17, 0xff, 0x0f, 0x31, 0xcd, 0xd8, 0xc8, - 0xf9, 0x10, 0xad, 0x91, 0xae, 0xb6, 0x51, 0x25, 0xfe, 0x86, 0xa8, 0x19, - 0x17, 0x6c, 0xbb, 0x01, 0x64, 0xe0, 0xba, 0x62, 0x8f, 0x20, 0x19, 0x7f, - 0x00, 0x50, 0xfb, 0xd6, 0xd3, 0x44, 0xb9, 0x99, 0x33, 0x6a, 0x38, 0x58, - 0x9b, 0x13, 0xb3, 0x42, 0xa7, 0x7b, 0x03, 0xc5, 0xb6, 0x9d, 0x1c, 0x5b, - 0xc7, 0xba, 0x91, 0xcb, 0x59, 0x0b, 0x3d, 0xe4, 0x6b, 0x56, 0x63, 0x3e, - 0x6c, 0x2e, 0xa4, 0x04, 0x5b, 0x30, 0x3b, 0x98, 0x05, 0x0a, 0x81, 0xc8, - 0x58, 0x44, 0xa2, 0xa9, 0x50, 0x49, 0xba, 0xee, 0xf8, 0x5b, 0xd5, 0xd7, - 0x0d, 0xb5, 0x7c, 0x7e, 0xcd, 0xd6, 0x42, 0x93, 0xe1, 0x7c, 0x1b, 0x3d, - 0xa5, 0x0a, 0x0f, 0x76, 0x7e, 0x89, 0xa9, 0xe5, 0xdc, 0x56, 0x4f, 0xd7, - 0x13, 0x48, 0x3f, 0xe3, 0x87, 0x61, 0x2d, 0x33, 0xc9, 0xf9, 0xfb, 0x88, - 0x80, 0x7e, 0x0c, 0x39, 0x93, 0xba, 0xd8, 0xdc, 0x7c, 0x98, 0xe4, 0xd6, - 0xff, 0x0a, 0xa5, 0x47, 0x66, 0x78, 0x41, 0x54, 0x30, 0xdb, 0x1f, 0xe1, - 0xe4, 0xa8, 0x95, 0x6c, 0x2a, 0x6f, 0xfa, 0x94, 0x96, 0xbb, 0x52, 0x2d, - 0x71, 0xa4, 0xd1, 0xe0, 0x75, 0x98, 0xc1, 0x46, 0x6f, 0x27, 0x81, 0xde, - 0xf3, 0x15, 0xb3, 0x8a, 0x4c, 0x00, 0x3b, 0xb8, 0x29, 0x2b, 0xac, 0xc7, - 0x15, 0x7c, 0x2a, 0xfd, 0x93, 0xea, 0x7d, 0xe5, 0xcd, 0x9a, 0x1f, 0xe0, - 0x49, 0xe7, 0xae, 0xd5, 0x56, 0x1a, 0x92, 0x93, 0x07, 0xfa, 0xe2, 0xd1, - 0x0b, 0x5f, 0xea, 0x1c, 0x1b, 0x2a, 0x36, 0xd7, 0x5f, 0x0b, 0xd1, 0x76, - 0xdb, 0x86, 0xb5, 0x21, 0xab, 0xaf, 0x9a, 0xb1, 0x20, 0x62, 0xe7, 0xe0, - 0xbf, 0xc0, 0xcc, 0xef, 0x09, 0x5c, 0x2c, 0x6d, 0x31, 0xda, 0x01, 0xb2, - 0x97, 0x02, 0xfb, 0x8e, 0xdb, 0xcd, 0x4f, 0x22, 0x30, 0x86, 0xd5, 0x11, - 0x67, 0x73, 0x47, 0xee, 0x22, 0xab, 0xa7, 0x94, 0x68, 0xd9, 0xbc, 0x96, - 0x6f, 0x4b, 0x0d, 0x53, 0xd7, 0x79, 0x76, 0xc2, 0x89, 0x58, 0x6b, 0x4a, - 0xed, 0xc7, 0xb0, 0x2d, 0xf4, 0xf3, 0xb1, 0x27, 0xa5, 0xe5, 0x5b, 0xfe, - 0xc4, 0x7c, 0xf0, 0x6f, 0x33, 0x13, 0xc6, 0xba, 0xee, 0x71, 0x66, 0x6e, - 0x0f, 0x35, 0xff, 0xfb, 0xa2, 0x1a, 0x98, 0xa3, 0xc4, 0x39, 0x59, 0x29, - 0x88, 0x36, 0xc9, 0x3c, 0xeb, 0x67, 0x8b, 0xac, 0x20, 0x4c, 0x1a, 0x34, - 0x6d, 0xc8, 0xfd, 0xec, 0x67, 0x48, 0x20, 0xd9, 0x97, 0xfa, 0x03, 0xa6, - 0x66, 0x0a, 0x6a, 0xf9, 0x6c, 0x22, 0x39, 0x2d, 0x47, 0xdd, 0x3f, 0x05, - 0xab, 0x6b, 0xc4, 0x19, 0xa7, 0xb4, 0x21, 0xfc, 0xcf, 0x5a, 0xbe, 0xa3, - 0xa7, 0xf8, 0xc0, 0x5a, 0x0e, 0x3c, 0xd4, 0x09, 0xf4, 0xd5, 0xdf, 0x63, - 0x58, 0xcb, 0x6c, 0x2b, 0xaa, 0x56, 0x9c, 0xb2, 0x55, 0x1e, 0x24, 0x23, - 0xe9, 0x5b, 0x60, 0x1a, 0x4f, 0x13, 0xa1, 0xe2, 0xaf, 0x1a, 0xc1, 0x1d, - 0x7a, 0x15, 0xc6, 0x91, 0xa8, 0x1c, 0xea, 0x65, 0x1a, 0xc1, 0xbd, 0xea, - 0x45, 0x7d, 0x84, 0xfc, 0x74, 0x2c, 0x7d, 0x50, 0xd8, 0x5d, 0xd4, 0x6e, - 0x00, 0x3a, 0x6a, 0xcc, 0x35, 0xe9, 0x7e, 0xa4, 0x51, 0x4c, 0x36, 0x45, - 0x4d, 0x70, 0x25, 0x2e, 0xbb, 0xc1, 0x09, 0x32, 0x56, 0x37, 0x30, 0xe3, - 0x94, 0x6d, 0x73, 0xb7, 0xf6, 0x7e, 0xff, 0x82, 0x9f, 0x9c, 0x9d, 0xbe, - 0xf9, 0x22, 0xfa, 0x9a, 0x13, 0x60, 0x7b, 0x49, 0xbc, 0xf1, 0xe0, 0x9f, - 0xb8, 0x35, 0xe3, 0x49, 0x30, 0x11, 0x50, 0x9e, 0x49, 0x2f, 0xe8, 0xd7, - 0xbb, 0xdf, 0x68, 0xf4, 0xd4, 0x42, 0x8e, 0xf9, 0x78, 0xb8, 0x9a, 0x6e, - 0xaa, 0xf2, 0xad, 0x75, 0x47, 0x94, 0x2b, 0xe5, 0x50, 0xd7, 0x93, 0xc7, - 0x7a, 0x07, 0xeb, 0xab, 0xf6, 0x0b, 0xed, 0xd8, 0xf4, 0xce, 0x89, 0xe5, - 0xa4, 0xa7, 0xd0, 0xb3, 0x8b, 0x24, 0x21, 0x6b, 0xc9, 0x63, 0x3e, 0xeb, - 0x72, 0x6a, 0xc2, 0x55, 0x8c, 0xb0, 0x27, 0x33, 0x0f, 0x3b, 0x21, 0x8c, - 0xbb, 0x37, 0x07, 0x70, 0xc4, 0xcd, 0x68, 0xd8, 0x63, 0x00, 0xf4, 0x8a, - 0x1d, 0x44, 0x9b, 0x39, 0xe6, 0x98, 0xd8, 0xff, 0xe7, 0xf7, 0x6a, 0x22, - 0x69, 0xe2, 0xda, 0xbb, 0xe7, 0xc4, 0xe5, 0xfb, 0x76, 0xc6, 0xd3, 0x03, - 0x6d, 0x49, 0xee, 0x5d, 0xc8, 0x45, 0xf4, 0xa5, 0xe5, 0x19, 0x2e, 0x7d, - 0xca, 0x0e, 0x21, 0xa2, 0xf2, 0xcc, 0x16, 0x7c, 0xc6, 0x37, 0x3e, 0xe8, - 0x82, 0x74, 0xa2, 0xcf, 0x50, 0xf8, 0x29, 0x18, 0x9a, 0x35, 0x9a, 0x37, - 0xec, 0x51, 0x19, 0x82, 0x72, 0x6b, 0x6a, 0x1c, 0x44, 0xce, 0x65, 0x97, - 0x84, 0x9b, 0x36, 0x46, 0xbc, 0x77, 0x26, 0xef, 0xf4, 0x57, 0x6b, 0x31, - 0xc2, 0xf1, 0x45, 0x65, 0x41, 0x69, 0x18, 0x57, 0xd6, 0xb3, 0xa4, 0xc4, - 0x3f, 0xf3, 0x2d, 0xd6, 0x40, 0xb5, 0xdc, 0x8d, 0x50, 0x9a, 0xa3, 0x8c, - 0xf0, 0x1a, 0x5c, 0xee, 0x0e, 0xb7, 0x72, 0x47, 0x3b, 0x1c, 0xd4, 0xbc, - 0xf2, 0x9c, 0x96, 0xf4, 0x0d, 0x72, 0x84, 0x44, 0xeb, 0x6a, 0x1a, 0x06, - 0xf8, 0xd2, 0x5b, 0x3f, 0xe2, 0x67, 0x1d, 0x41, 0x8c, 0x65, 0xc3, 0x0a, - 0x98, 0xc9, 0xf2, 0x81, 0x33, 0x55, 0x73, 0x91, 0x54, 0x92, 0xf3, 0x2d, - 0x61, 0x6a, 0x4a, 0x03, 0xde, 0x8b, 0x60, 0xb7, 0x70, 0xb9, 0x1a, 0x8f, - 0x61, 0x62, 0x22, 0x11, 0xa9, 0x66, 0x06, 0x42, 0x7a, 0x46, 0x9f, 0xc3, - 0x44, 0xfd, 0xbb, 0xfc, 0xe4, 0x8f, 0x1b, 0x95, 0x74, 0xe9, 0xae, 0x09, - 0xc4, 0x4a, 0x38, 0x05, 0xc7, 0x88, 0x46, 0x5c, 0x80, 0x51, 0xad, 0x0e, - 0x24, 0x8c, 0x1c, 0x14, 0x40, 0x47, 0x2e, 0xfe, 0x82, 0x6a, 0x20, 0xdc, - 0x83, 0xc8, 0x21, 0x7f, 0x21, 0xd4, 0xbc, 0xf2, 0x2c, 0x33, 0xed, 0x6b, - 0xff, 0x3a, 0x3d, 0xae, 0x4b, 0xd5, 0xb4, 0x67, 0x72, 0x58, 0xf5, 0x95, - 0x30, 0xf0, 0x6e, 0x94, 0xf2, 0x38, 0x20, 0xb3, 0x54, 0xf7, 0xf9, 0xb4, - 0x8f, 0xe0, 0x7d, 0xce, 0xdd, 0xa1, 0x86, 0x09, 0xf2, 0x59, 0xb9, 0xb5, - 0xa2, 0xf9, 0x18, 0xd6, 0x52, 0x20, 0xde, 0xa3, 0xda, 0x49, 0x30, 0xab, - 0xb9, 0x4b, 0x18, 0x77, 0x68, 0x92, 0x58, 0xfd, 0xc6, 0x99, 0x0b, 0x56, - 0x38, 0xc4, 0x2a, 0xc5, 0x60, 0x3b, 0x06, 0xf4, 0xf9, 0xcf, 0x89, 0xf3, - 0x59, 0x91, 0x80, 0x42, 0xc7, 0xe0, 0xf4, 0x21, 0x78, 0x2d, 0xc8, 0xae, - 0x4d, 0x2c, 0x54, 0xa5, 0x8c, 0x30, 0x30, 0x77, 0xd9, 0xf8, 0xa8, 0x78, - 0x98, 0x82, 0xcc, 0x1d, 0x27, 0xfb, 0x59, 0xda, 0x01, 0x01, 0x84, 0x3f, - 0xf7, 0x4c, 0xc9, 0x92, 0xc8, 0xef, 0xc1, 0x3a, 0x76, 0x1d, 0x7e, 0xf3, - 0x7f, 0xf1, 0xa1, 0x8a, 0x32, 0xcd, 0x9d, 0x89, 0x93, 0xbe, 0x43, 0x29, - 0xd0, 0x57, 0x15, 0xa6, 0x9c, 0xfa, 0x3d, 0x08, 0x56, 0xc9, 0xc5, 0xed, - 0x64, 0x8c, 0x24, 0xe0, 0x2b, 0x56, 0xad, 0x61, 0xe9, 0x56, 0x53, 0xad, - 0xb5, 0x8e, 0xed, 0x87, 0xa7, 0xdc, 0x5f, 0xea, 0x16, 0x37, 0x6b, 0xa9, - 0x96, 0x80, 0x2d, 0x5b, 0x0a, 0x0b, 0x74, 0x64, 0x6a, 0x98, 0x9e, 0x99, - 0x46, 0x67, 0x79, 0xc4, 0x24, 0xbb, 0x1b, 0x81, 0x9a, 0x6e, 0x7e, 0xa4, - 0x41, 0xb1, 0x65, 0xa9, 0xe7, 0xd6, 0x42, 0xfa, 0x4c, 0x97, 0x59, 0xc8, - 0x1b, 0xac, 0x17, 0xd8, 0x90, 0xc8, 0x44, 0x74, 0xf8, 0x27, 0xf5, 0xb1, - 0xf4, 0x59, 0x33, 0xbd, 0x05, 0xe8, 0x3d, 0xa7, 0x2c, 0xa6, 0xff, 0x2c, - 0xcb, 0x44, 0x13, 0x3b, 0xbd, 0xc8, 0x78, 0x9c, 0xef, 0x73, 0x42, 0x82, - 0x18, 0x28, 0x56, 0x49, 0x25, 0x02, 0x9c, 0x4a, 0xb7, 0x60, 0x1f, 0x8c, - 0x4d, 0x12, 0x63, 0xf0, 0x25, 0x33, 0x83, 0xf6, 0x03, 0x53, 0xa6, 0x7f, - 0x47, 0xe4, 0xaf, 0xac, 0xcc, 0xe9, 0xd7, 0x55, 0x68, 0x82, 0xa2, 0xa8, - 0xcf, 0xb2, 0x2c, 0x1a, 0x3a, 0xee, 0xac, 0xbc, 0x08, 0x9b, 0x7b, 0x13, - 0x61, 0x13, 0xf2, 0x1f, 0x18, 0x55, 0xc2, 0x6a, 0x1f, 0xc8, 0x96, 0x91, - 0xd6, 0x3b, 0xe2, 0xc6, 0x18, 0xcb, 0x6f, 0x8b, 0x26, 0xb6, 0x32, 0x08, - 0x00, 0x6a, 0x1e, 0x11, 0xef, 0xb0, 0x3f, 0x99, 0xbe, 0xaf, 0x0f, 0x90, - 0x7b, 0xe7, 0x57, 0x22, 0x32, 0xfe, 0x2c, 0xac, 0x93, 0x52, 0x8c, 0x01, - 0x87, 0x99, 0xf1, 0x9f, 0x07, 0x86, 0xcb, 0x18, 0x7e, 0xd9, 0x2c, 0xaf, - 0xcb, 0x40, 0x95, 0xc7, 0x04, 0x58, 0x8a, 0xfb, 0x58, 0x4d, 0xf3, 0xe5, - 0xc6, 0xbd, 0x37, 0x6e, 0x97, 0xf7, 0x68, 0x42, 0xa9, 0x05, 0x29, 0xa5, - 0x05, 0x40, 0xb8, 0xce, 0xb0, 0x93, 0xcc, 0x3e, 0x11, 0x75, 0x8c, 0x15, - 0xaf, 0x92, 0x55, 0x20, 0xc8, 0xd4, 0x8c, 0x78, 0x27, 0xfa, 0xbf, 0x4f, - 0x08, 0x6e, 0x78, 0x10, 0x34, 0x23, 0x21, 0xc4, 0xfd, 0xab, 0xcb, 0x8e, - 0x18, 0xdc, 0xab, 0x4b, 0x82, 0x5f, 0x35, 0xc8, 0xcd, 0x8f, 0xab, 0xcc, - 0x96, 0x12, 0x77, 0x43, 0x8e, 0x21, 0x5e, 0xc8, 0xef, 0x1b, 0x21, 0x49, - 0x03, 0x1d, 0x53, 0x49, 0x64, 0xbc, 0x87, 0xa1, 0xc3, 0x62, 0x7c, 0x5c, - 0x70, 0x35, 0x15, 0xb2, 0x70, 0x8e, 0x1a, 0x19, 0x47, 0x0b, 0xc0, 0x67, - 0xf3, 0x95, 0xaf, 0x1c, 0x4f, 0x3f, 0x89, 0x2c, 0x9d, 0x55, 0xbc, 0x7b, - 0xc5, 0x1e, 0x9b, 0xdf, 0xe7, 0x2a, 0x79, 0x9d, 0x4e, 0xd9, 0xbf, 0x8c, - 0xfb, 0x63, 0x3f, 0xee, 0xa4, 0xbf, 0xab, 0x7c, 0x47, 0x71, 0x5f, 0xd3, - 0x35, 0x89, 0x0f, 0x0c, 0xea, 0x39, 0x4a, 0x48, 0x1c, 0x95, 0xa3, 0xab, - 0x63, 0x8b, 0xea, 0x93, 0x49, 0xf0, 0x8a, 0x43, 0xca, 0x7d, 0xeb, 0x91, - 0xd4, 0x2d, 0x2c, 0x70, 0xf3, 0xd6, 0xce, 0xa0, 0x34, 0x77, 0x79, 0xf5, - 0xae, 0xd6, 0x1a, 0xb7, 0x4d, 0x7b, 0x89, 0x94, 0xe5, 0x25, 0x8e, 0x34, - 0xf5, 0x04, 0x3a, 0x12, 0x4d, 0xc7, 0x3a, 0x6e, 0xb7, 0xd3, 0x80, 0xad, - 0x6c, 0xa9, 0xac, 0x6c, 0x4e, 0x86, 0x8b, 0xdb, 0x14, 0xeb, 0xfb, 0x15, - 0x66, 0x6d, 0xc0, 0x64, 0x2a, 0x3e, 0xd6, 0x4e, 0xb3, 0xb1, 0x1d, 0xe4, - 0x1e, 0x4b, 0x9c, 0x28, 0x0e, 0x93, 0x5f, 0x2b, 0xa6, 0xdb, 0xea, 0x70, - 0x4f, 0xef, 0x3a, 0x03, 0x4f, 0xca, 0x98, 0xb9, 0xba, 0xc5, 0x61, 0x83, - 0x3c, 0x73, 0x72, 0x8a, 0x2e, 0xa9, 0xd9, 0x92, 0xef, 0x2e, 0x05, 0x81, - 0xe7, 0x40, 0x8f, 0x68, 0xf4, 0x1f, 0x8b, 0x72, 0xda, 0x44, 0x4f, 0xf3, - 0xa4, 0x16, 0xac, 0xbd, 0xcb, 0x3e, 0x29, 0x5d, 0x90, 0xa4, 0xa0, 0xd1, - 0xa6, 0x3d, 0xf5, 0xc7, 0x1b, 0x2e, 0x3d, 0x31, 0xfc, 0x20, 0xf5, 0xca, - 0x29, 0x43, 0x40, 0x30, 0x19, 0xa1, 0x64, 0x28, 0x2d, 0xd7, 0x46, 0xe8, - 0xe7, 0xe0, 0x49, 0x3d, 0xbf, 0xce, 0xc1, 0x57, 0x04, 0x16, 0x0f, 0x2c, - 0x74, 0x49, 0x3d, 0x9b, 0x96, 0x7e, 0xfc, 0x1e, 0x38, 0xef, 0xf8, 0xf2, - 0x4f, 0xf3, 0x35, 0xda, 0x42, 0x0b, 0xb0, 0xee, 0x03, 0x45, 0xd0, 0x76, - 0x1d, 0x6e, 0x7b, 0x72, 0xf8, 0xcf, 0x88, 0x96, 0x55, 0x3c, 0xd9, 0x12, - 0x65, 0xe8, 0x62, 0x12, 0x44, 0xb2, 0x4a, 0xc9, 0xfa, 0xaf, 0xc7, 0xda, - 0xe7, 0xb3, 0xba, 0x15, 0xf0, 0x29, 0x9e, 0xcf, 0xf6, 0x71, 0x2b, 0xcb, - 0x67, 0x40, 0xfa, 0x16, 0xc0, 0x94, 0xa1, 0x8c, 0x50, 0x47, 0x28, 0xa5, - 0xc9, 0x12, 0x38, 0xb7, 0xb6, 0x7c, 0x78, 0x85, 0x9b, 0xec, 0x03, 0xbf, - 0xf2, 0xcd, 0x34, 0xcd, 0x3f, 0xfc, 0xfb, 0x3b, 0xf1, 0x0c, 0x01, 0x59, - 0x9b, 0xf4, 0xe3, 0xb5, 0x1d, 0x6a, 0x90, 0x21, 0xc1, 0x2c, 0xfd, 0xef, - 0x48, 0x64, 0x2d, 0x63, 0x08, 0x15, 0xc6, 0x27, 0xca, 0x53, 0x91, 0xbe, - 0xf4, 0xd9, 0xa8, 0xbe, 0xf4, 0xde, 0x7c, 0x77, 0x1d, 0xc1, 0x81, 0x9e, - 0x98, 0xa1, 0xae, 0x63, 0xe6, 0x39, 0xb5, 0x83, 0x99, 0x90, 0x71, 0xbd, - 0x33, 0xbc, 0x92, 0x87, 0x50, 0x1f, 0xd9, 0xeb, 0x4d, 0x3a, 0x94, 0x9d, - 0x73, 0xab, 0xf1, 0x65, 0xae, 0xfb, 0x5e, 0x7e, 0xe8, 0xba, 0xce, 0x1d, - 0xff, 0xf2, 0xc4, 0xba, 0x93, 0x78, 0x24, 0x73, 0x92, 0x48, 0xce, 0x99, - 0x9c, 0x5a, 0x98, 0xe6, 0x4c, 0x8d, 0x91, 0x4e, 0x3a, 0x50, 0xc3, 0xbf, - 0xf8, 0xac, 0xdc, 0x5a, 0x66, 0x9f, 0x14, 0xc7, 0xc4, 0x7b, 0x7b, 0xf7, - 0x83, 0xd1, 0xa1, 0xe9, 0xa3, 0x2d, 0x5c, 0xa3, 0xa7, 0x44, 0x57, 0xd7, - 0xbf, 0xb2, 0xd5, 0x89, 0x23, 0xdf, 0xf1, 0xfb, 0xeb, 0xaa, 0x69, 0x99, - 0xbd, 0xc4, 0x77, 0xc9, 0x17, 0x79, 0x2e, 0x47, 0x07, 0x26, 0xe3, 0xda, - 0x64, 0xaf, 0xa8, 0x0b, 0x45, 0x3d, 0xda, 0x32, 0xdd, 0x24, 0x9b, 0x33, - 0xc7, 0xa9, 0xbd, 0x28, 0xec, 0x49, 0x79, 0xb6, 0xa1, 0x1c, 0x94, 0xc6, - 0xfe, 0x60, 0xf6, 0xb9, 0x30, 0x67, 0xe6, 0xe3, 0x99, 0x2f, 0xf9, 0x0d, - 0xb0, 0xd4, 0x82, 0x69, 0x7c, 0x1d, 0xd7, 0x83, 0x65, 0xfd, 0x16, 0xed, - 0x75, 0x75, 0xbd, 0x78, 0xf0, 0x2a, 0xc3, 0x7a, 0x7b, 0x3b, 0x2c, 0x7c, - 0x53, 0xb3, 0x75, 0xd6, 0xc9, 0x10, 0xda, 0xc9, 0x41, 0xc4, 0xce, 0xfe, - 0xaa, 0x06, 0xe1, 0x6a, 0x81, 0x63, 0xa1, 0x4e, 0xf7, 0x39, 0x58, 0x02, - 0x7c, 0xc1, 0xca, 0xcd, 0xae, 0x40, 0xbd, 0x58, 0x7b, 0xbe, 0x34, 0x95, - 0x3c, 0x2b, 0xa4, 0xc7, 0xd9, 0x54, 0xb4, 0x2c, 0x19, 0x71, 0x7a, 0x4b, - 0xf8, 0xd6, 0x05, 0x5c, 0x05, 0xac, 0x62, 0xa5, 0x07, 0xac, 0x29, 0x58, - 0x7a, 0x4b, 0xa2, 0x46, 0x2e, 0x6e, 0x4d, 0x52, 0x8a, 0x2e, 0x30, 0xf9, - 0x58, 0x85, 0xfe, 0x0e, 0xc0, 0xed, 0xe4, 0xc1, 0x9a, 0x43, 0xf2, 0xd0, - 0xd9, 0xf9, 0xe6, 0x31, 0x90, 0xab, 0x77, 0x2d, 0xbb, 0xfe, 0x63, 0x6c, - 0xe3, 0x25, 0x3e, 0x3e, 0xee, 0x2f, 0x75, 0xc4, 0xb0, 0x76, 0x9a, 0x5b, - 0xf1, 0x9e, 0xa7, 0x42, 0xe0, 0x1c, 0x05, 0xdb, 0x0c, 0xb3, 0x0e, 0x9b, - 0x5e, 0x5a, 0x99, 0x8d, 0xc6, 0x14, 0xc8, 0x63, 0x0c, 0x68, 0xd5, 0x9b, - 0xa9, 0xe7, 0x41, 0xd7, 0x10, 0x88, 0x48, 0x0f, 0x93, 0xd3, 0x3a, 0xd4, - 0x38, 0x2a, 0xe3, 0x19, 0x1b, 0xcd, 0x1e, 0x6a, 0xb7, 0x1c, 0x6d, 0xa0, - 0xcb, 0x01, 0x99, 0xde, 0x7e, 0x04, 0x33, 0x76, 0x6d, 0xfb, 0x48, 0xe9, - 0xaa, 0xc1, 0x91, 0x99, 0xb9, 0xbe, 0xf6, 0xb1, 0xa7, 0x6d, 0x2e, 0xda, - 0xd6, 0x47, 0xc3, 0x83, 0x05, 0xbd, 0x61, 0x38, 0x47, 0x0d, 0x1b, 0x3f, - 0xae, 0x32, 0x2a, 0x0c, 0xa0, 0x34, 0x0b, 0xb3, 0xb6, 0x80, 0x59, 0xd6, - 0xf8, 0x95, 0xd6, 0xc5, 0xc8, 0x29, 0xcb, 0xe1, 0x87, 0x16, 0xd3, 0x56, - 0x5b, 0xda, 0x26, 0x5d, 0xcf, 0x30, 0xf4, 0x08, 0xcf, 0x1b, 0x41, 0xea, - 0xdb, 0x82, 0xc2, 0x37, 0xc5, 0x66, 0x1f, 0x65, 0xb8, 0x89, 0x58, 0xc8, - 0x9a, 0xa6, 0x70, 0xcd, 0xc0, 0x44, 0x0d, 0x69, 0x42, 0x89, 0x28, 0x0a, - 0xfd, 0xbf, 0x9e, 0x11, 0xdb, 0xeb, 0x27, 0xe2, 0xaf, 0xb6, 0x76, 0xed, - 0x2c, 0xbf, 0x3c, 0xe3, 0x6d, 0x40, 0xc6, 0x24, 0xd0, 0x9b, 0x7f, 0x2e, - 0xc8, 0xef, 0xc1, 0x3a, 0x76, 0x1d, 0x7c, 0xf3, 0x7f, 0xf1, 0xa1, 0x8a, - 0x30, 0xcd, 0x9d, 0x89, 0x93, 0xbe, 0x43, 0x29, 0xd0, 0x57, 0x15, 0xa6, - 0x9c, 0xfa, 0x3d, 0x08, 0x56, 0xc9, 0xc5, 0xed, 0x64, 0x8c, 0x24, 0xe0, - 0x2b, 0x56, 0xad, 0x61, 0xe9, 0x56, 0x53, 0xad, 0xb5, 0x8e, 0xed, 0x87, - 0xa7, 0xdc, 0x5f, 0xea, 0x16, 0x37, 0x6b, 0xa9, 0x96, 0x80, 0x2d, 0x5b, - 0x0a, 0x0b, 0x74, 0x64, 0xf1, 0xb1, 0xcc, 0x91, 0x91, 0x40, 0x66, 0x4f, - 0x9b, 0x78, 0x3e, 0xf9, 0x36, 0x19, 0x63, 0xb8, 0xcb, 0xec, 0xfd, 0x4f, - 0x6a, 0x5d, 0xdd, 0x10, 0x68, 0x9c, 0x51, 0xe2, 0x23, 0x91, 0xb2, 0x1c, - 0xde, 0x58, 0x7e, 0x22, 0xe4, 0xc9, 0xae, 0xee, 0xb1, 0x9e, 0x32, 0xf6, - 0xa1, 0x8b, 0xba, 0xde, 0x93, 0x9b, 0xcb, 0x2f, 0x26, 0x8e, 0xfb, 0xdf, - 0x1b, 0xb6, 0xcf, 0xca, 0xbd, 0xb7, 0x32, 0xcd, 0x11, 0x05, 0xd6, 0x34, - 0x8e, 0x96, 0x64, 0xa7, 0xa9, 0x78, 0x91, 0x49, 0x79, 0xa4, 0x7c, 0x25, - 0x17, 0xbf, 0x5b, 0x16, 0xe6, 0xc7, 0x57, 0x85, 0xf1, 0x68, 0x8c, 0xca, - 0xb2, 0xc6, 0x8a, 0xdd, 0xa5, 0x61, 0xa7, 0xaa, 0x37, 0x3c, 0x2f, 0xde, - 0x28, 0x7f, 0xc4, 0x53, 0xe5, 0x2e, 0x05, 0xcf, 0x3c, 0x55, 0x84, 0x70, - 0xad, 0x44, 0x99, 0x37, 0x3e, 0x0a, 0x00, 0xd0, 0x62, 0x8d, 0x32, 0xaf, - 0x62, 0x91, 0x65, 0x05, 0x7e, 0x03, 0x46, 0xf3, 0xb0, 0xad, 0xb8, 0xe9, - 0xd9, 0x46, 0xd0, 0xef, 0x93, 0xa8, 0xe6, 0xba, 0x51, 0x77, 0x8d, 0xf3, - 0x38, 0xe1, 0x22, 0x8b, 0xe6, 0xb7, 0x30, 0xdb, 0x29, 0x67, 0x96, 0x86, - 0x98, 0x0e, 0xb3, 0x5f, 0x83, 0xe2, 0x91, 0x52, 0x4f, 0x58, 0x8c, 0x78, - 0xf7, 0x22, 0x7a, 0x24, 0xc7, 0x08, 0x47, 0xa8, 0xf4, 0x84, 0x52, 0x52, - 0x55, 0xf1, 0x2f, 0x10, 0x33, 0xef, 0x44, 0xf8, 0x73, 0x27, 0x76, 0xc4, - 0xa4, 0x44, 0xec, 0x0a, 0xe0, 0x5d, 0x6d, 0x35, 0xd1, 0x0f, 0xe8, 0x0b, - 0xb2, 0x0c, 0x1c, 0xac, 0xba, 0x93, 0x6f, 0x89, 0xac, 0xa6, 0x10, 0x95, - 0x99, 0xb5, 0xd0, 0x2a, 0x84, 0xd3, 0x33, 0x86, 0xb1, 0x0b, 0x9e, 0xfb, - 0x06, 0x35, 0x0c, 0x7e, 0x4c, 0x2a, 0x31, 0x3f, 0x3d, 0xa5, 0x4f, 0x92, - 0x56, 0xb6, 0x53, 0x6b, 0x8f, 0x27, 0xb0, 0xbe, 0x0a, 0x5f, 0x83, 0xc0, - 0xc5, 0xca, 0xb3, 0x4b, 0xca, 0x8a, 0x98, 0x0f, 0x4f, 0xb9, 0xff, 0x68, - 0x02, 0x6c, 0xcf, 0x02, 0x1a, 0x88, 0x78, 0xa0, 0x60, 0xe4, 0x51, 0xb6, - 0xea, 0x3d, 0xdd, 0x28, 0xa8, 0x6a, 0x2f, 0x87, 0xf3, 0x8c, 0x07, 0x3e, - 0xbb, 0x63, 0x9c, 0x15, 0x61, 0xf7, 0x46, 0xa5, 0x16, 0xa3, 0x3d, 0x63, - 0x35, 0xe2, 0x1a, 0x50, 0xec, 0xfc, 0xdd, 0xae, 0x42, 0x7f, 0x25, 0xae, - 0x40, 0x0f, 0xb7, 0xd8, 0x59, 0x51, 0xa1, 0xd9, 0xd1, 0x68, 0x49, 0xfc, - 0xff, 0x73, 0x39, 0x74, 0x84, 0x43, 0x60, 0x75, 0xc2, 0x1d, 0x99, 0x8a, - 0x1f, 0xe1, 0x80, 0x22, 0xf2, 0x44, 0x12, 0xdc, 0x9e, 0x52, 0x40, 0x70, - 0x79, 0x62, 0xba, 0x2c, 0xc4, 0x26, 0xdc, 0x49, 0x55, 0xa8, 0xe0, 0x3b, - 0x46, 0x39, 0x9c, 0x51, 0x63, 0xe1, 0x84, 0x5e, 0xf2, 0x64, 0xf9, 0x81, - 0xe5, 0x86, 0xe9, 0x8c, 0x4c, 0x42, 0x19, 0x6c, 0x1f, 0x45, 0x38, 0xac, - 0xcc, 0x0b, 0x5b, 0x05, 0x81, 0x39, 0x3b, 0x65, 0x2a, 0x3a, 0x33, 0xa0, - 0xde, 0x63, 0x4c, 0xba, 0x1e, 0xe4, 0xe3, 0xc6, 0xee, 0xac, 0x00, 0x70, - 0x80, 0x15, 0xc2, 0x5c, 0x08, 0xff, 0xae, 0xa6, 0x53, 0x78, 0x10, 0x24, - 0x65, 0xb4, 0x5d, 0x6e, 0x9f, 0x2f, 0x8b, 0xae, 0x23, 0x8b, 0xfa, 0xea, - 0x0e, 0x72, 0x7b, 0x57, 0x0f, 0xa5, 0x32, 0xde, 0xaf, 0x10, 0x8d, 0x5a, - 0x28, 0x5b, 0x28, 0xbb, 0xe4, 0xef, 0xf8, 0xfe, 0x1b, 0xd1, 0xc6, 0xbd, - 0xfe, 0xf0, 0x51, 0xc1, 0xeb, 0xcd, 0x6c, 0x4b, 0x7f, 0x50, 0x47, 0x2f, - 0x02, 0x1f, 0x48, 0x10, 0x74, 0x20, 0x46, 0xd4, 0x95, 0x0c, 0x90, 0xc4, - 0x51, 0xa0, 0x32, 0x60, 0x76, 0x2f, 0x4a, 0xa1, 0xcf, 0x2e, 0x20, 0xe7, - 0x60, 0x78, 0x62, 0x2d, 0xd4, 0x87, 0x2f, 0x31, 0xf9, 0x56, 0x8a, 0x6c, - 0x88, 0x69, 0x04, 0x27, 0x60, 0x5a, 0xf9, 0x93, 0x97, 0xdf, 0xd8, 0x9e, - 0x4b, 0xf3, 0x26, 0xc6, 0xc3, 0x3d, 0x5e, 0xbc, 0xb2, 0x62, 0xd2, 0x79, - 0xba, 0xc3, 0x85, 0x2a, 0x03, 0x22, 0xa1, 0xce, 0x53, 0x2e, 0xdc, 0x5b, - 0x1c, 0x4f, 0x3c, 0xa8, 0x93, 0xe6, 0x6f, 0xbf, 0x53, 0xf6, 0x04, 0xfe, - 0xb4, 0xa3, 0x3f, 0x96, 0xa7, 0x46, 0x25, 0x37, 0x76, 0xad, 0xc9, 0x9d, - 0x27, 0x2b, 0x54, 0xd9, 0x5f, 0x2e, 0x8f, 0x75, 0xeb, 0x25, 0xca, 0xd3, - 0x05, 0x4d, 0x3a, 0xce, 0x26, 0x82, 0x75, 0xb1, 0x2a, 0xe1, 0x64, 0x3d, - 0x40, 0xbb, 0x74, 0x93, 0xda, 0xe5, 0x1c, 0x01, 0x5b, 0x5a, 0x19, 0xe8, - 0xf1, 0xd5, 0x05, 0x7e, 0xab, 0x61, 0xa7, 0x59, 0x15, 0xe8, 0x65, 0xcd, - 0xcc, 0x2b, 0xab, 0xf6, 0xb5, 0x5f, 0x4c, 0x4e, 0x50, 0xa5, 0x05, 0xa5, - 0xd6, 0x97, 0x5b, 0x05, 0xc4, 0xb2, 0x0b, 0x85, 0xb2, 0x32, 0x21, 0x56, - 0x95, 0x1e, 0x2d, 0xcc, 0x6a, 0xff, 0xbe, 0x45, 0x61, 0x08, 0xd7, 0x10, - 0x66, 0x1c, 0xdf, 0xf7, 0x74, 0x02, 0xd5, 0x91, 0xda, 0xe3, 0x9d, 0x2a, - 0x9a, 0x44, 0x88, 0xb0, 0x95, 0xa9, 0x84, 0x2e, 0x87, 0x6b, 0xe2, 0x17, - 0x04, 0xbc, 0x85, 0x50, 0xed, 0x90, 0x7d, 0x13, 0xe0, 0x74, 0xb5, 0x32, - 0xaa, 0x1c, 0xb0, 0x3a, 0x7d, 0x50, 0x5e, 0x6d, 0x3f, 0x56, 0xee, 0xce, - 0x2e, 0x40, 0x7f, 0x6e, 0xc7, 0xe9, 0xd8, 0x64, 0x18, 0x66, 0xa7, 0x1e, - 0xd3, 0x11, 0xae, 0x5b, 0x1a, 0x3a, 0xd7, 0x49, 0x28, 0xf2, 0xce, 0xdf, - 0xf0, 0xe7, 0xbf, 0xaa, 0x62, 0x72, 0x66, 0x39, 0xba, 0x41, 0x16, 0x96, - 0x1f, 0xe4, 0xab, 0xf1, 0x51, 0x88, 0xc5, 0x91, 0xdf, 0xca, 0x45, 0x21, - 0xbb, 0x4e, 0x24, 0x5d, 0xbb, 0x51, 0x4f, 0x5f, 0xf2, 0x40, 0x55, 0x93, - 0x3e, 0x6c, 0x55, 0x31, 0x25, 0xc9, 0x02, 0x64, 0xf8, 0x28, 0xbb, 0x55, - 0xbc, 0xa4, 0xfd, 0x71, 0xf0, 0xfa, 0xd8, 0x32, 0x60, 0x87, 0xdd, 0xe9, - 0x43, 0x57, 0x53, 0x07, 0xc9, 0x62, 0x05, 0xc7, 0x04, 0xf5, 0xc2, 0xfe, - 0xcc, 0x04, 0x0f, 0x75, 0x67, 0xa1, 0xfa, 0xb4, 0x02, 0xf8, 0x8a, 0xe3, - 0xd5, 0x3f, 0x8e, 0xd4, 0xc0, 0x40, 0xe0, 0x0b, 0x56, 0x45, 0x32, 0x90, - 0xf1, 0xbd, 0x83, 0x08, 0x3d, 0xaf, 0x7b, 0x86, 0x8e, 0x8b, 0x9d, 0xdc, - 0x44, 0x9d, 0x17, 0xb5, 0x23, 0xbb, 0xfc, 0x2d, 0x46, 0xdb, 0x94, 0xff, - 0x88, 0x7c, 0xb2, 0xb7, 0x1d, 0x32, 0x4b, 0x9b, 0x73, 0x45, 0xe0, 0x7f, - 0xab, 0xfe, 0x94, 0xb2, 0xf9, 0x05, 0x2b, 0xef, 0x96, 0x55, 0x6c, 0x26, - 0x68, 0x90, 0x06, 0x43, 0x0d, 0x1c, 0x30, 0xf1, 0xfe, 0xdc, 0x87, 0x7b, - 0x8a, 0xd1, 0x17, 0x62, 0x22, 0x74, 0xa5, 0xbc, 0x45, 0x4e, 0x4e, 0x8c, - 0x98, 0x71, 0xc3, 0x4d, 0x5c, 0x9d, 0x95, 0xdc, 0x1d, 0x77, 0x3f, 0x1d, - 0xea, 0x05, 0xdf, 0x18, 0xb3, 0xdf, 0xc0, 0x53, 0x5d, 0x44, 0x12, 0xc7, - 0x76, 0x86, 0xe3, 0xad, 0xd2, 0xc0, 0x53, 0x9e, 0x66, 0x43, 0x67, 0x56, - 0xe1, 0x0d, 0x65, 0x6a, 0x9b, 0xfb, 0x8e, 0x6d, 0x32, 0xda, 0x81, 0x5e, - 0x21, 0xf4, 0x82, 0xa9, 0xad, 0xcd, 0x8d, 0x16, 0x89, 0x1c, 0x2c, 0xbc, - 0x62, 0xb4, 0x56, 0x83, 0x75, 0x9e, 0x71, 0xcf, 0x7a, 0x29, 0x35, 0xbe, - 0x2e, 0x20, 0x76, 0x23, 0xea, 0x76, 0xbe, 0x42, 0x89, 0x64, 0xa5, 0xc0, - 0xc9, 0x4c, 0x79, 0xb2, 0x92, 0xa8, 0xd9, 0x3c, 0x87, 0x40, 0x59, 0xbb, - 0x73, 0x3d, 0x56, 0xda, 0xcd, 0xca, 0xad, 0x00, 0x78, 0xa4, 0x31, 0x2d, - 0x3a, 0xd8, 0x12, 0xc1, 0xb9, 0x29, 0xa7, 0x89, 0xc3, 0x9c, 0xb6, 0xd6, - 0x69, 0x15, 0x4c, 0xf6, 0x2f, 0x5f, 0x65, 0x36, 0xf9, 0x1d, 0xf1, 0x5f, - 0xa9, 0x40, 0x6f, 0x42, 0x34, 0x2c, 0xb7, 0x5c, 0x2e, 0xd1, 0x9b, 0x51, - 0xa4, 0x81, 0xc3, 0xad, 0x90, 0x71, 0x9c, 0x79, 0xde, 0xb3, 0x49, 0x48, - 0x12, 0xcf, 0x5e, 0x4a, 0x68, 0x75, 0x3b, 0x51, 0xaa, 0xb5, 0x7c, 0x24, - 0xe5, 0xc4, 0x9e, 0xcb, 0xce, 0xf3, 0x98, 0x1a, 0x92, 0x00, 0x52, 0x37, - 0x1d, 0x49, 0x5a, 0x4c, 0xa0, 0xa0, 0x54, 0x14, 0xac, 0xe8, 0x20, 0x6c, - 0xdf, 0x56, 0x62, 0x5e, 0x06, 0xa9, 0xc1, 0x4b, 0xa6, 0x7e, 0x55, 0x49, - 0x04, 0x34, 0x25, 0x5a, 0xc2, 0x8d, 0x37, 0x6f, 0x92, 0x4e, 0x14, 0xaa, - 0x08, 0xf1, 0x0a, 0x9c, 0x3f, 0x17, 0x2f, 0xd2, 0xda, 0xbc, 0xfc, 0x38, - 0xef, 0x88, 0xd1, 0x1f, 0x2c, 0x10, 0xa9, 0x7d, 0x67, 0x7f, 0xe2, 0x87, - 0x51, 0x39, 0x35, 0x0b, 0x17, 0x17, 0x7e, 0x0d, 0x88, 0x20, 0xf2, 0xf1, - 0x96, 0x99, 0xd5, 0x1e, 0xae, 0x92, 0x13, 0x1b, 0xb9, 0x8f, 0xdb, 0x65, - 0x2e, 0x38, 0x01, 0x77, 0xa7, 0xce, 0x7f, 0x3a, 0x1f, 0xd5, 0x53, 0x0a, - 0x07, 0xff, 0x42, 0x8b, 0x59, 0xfc, 0x50, 0x84, 0x3f, 0x22, 0xc3, 0x36, - 0x39, 0x23, 0xad, 0xe3, 0x9b, 0x51, 0x37, 0xa7, 0xaa, 0xcb, 0x73, 0x7c, - 0x02, 0x23, 0x0b, 0x13, 0x29, 0xe9, 0xbe, 0x1c, 0xd2, 0xba, 0xab, 0x64, - 0x4b, 0x7e, 0x0b, 0x25, 0x2d, 0x3d, 0x75, 0x97, 0x26, 0x28, 0x51, 0x3f, - 0xd3, 0x98, 0x75, 0xa6, 0x19, 0x4b, 0x0b, 0xc7, 0x31, 0x7f, 0xcf, 0x85, - 0xea, 0xc6, 0xaa, 0x79, 0xa3, 0xed, 0x9b, 0x98, 0x99, 0x1d, 0x74, 0x40, - 0x85, 0x13, 0x91, 0xbd, 0xc7, 0xab, 0x7f, 0x18, 0x53, 0x0b, 0x25, 0x1e, - 0xbc, 0x3f, 0xf8, 0x84, 0x66, 0x7f, 0x7c, 0x96, 0xdd, 0xcc, 0xef, 0xbd, - 0x81, 0x96, 0xff, 0xc4, 0x37, 0xc2, 0xea, 0x7d, 0x2d, 0x27, 0x81, 0xdc, - 0xf0, 0x79, 0x68, 0x50, 0xc6, 0x3c, 0x17, 0x9b, 0x96, 0x1d, 0x79, 0x2e, - 0x98, 0x7c, 0x53, 0xd4, 0xd9, 0x2e, 0xad, 0xab, 0x74, 0x90, 0x51, 0xc4, - 0x5d, 0x53, 0x15, 0x45, 0xd7, 0x4b, 0xf5, 0x58, 0x29, 0xe5, 0x50, 0x1b, - 0xd0, 0xb6, 0x92, 0x5f, 0x24, 0xbe, 0x34, 0xa7, 0xfd, 0xc6, 0xc7, 0x57, - 0xd6, 0xcc, 0x99, 0x93, 0x0a, 0x1a, 0xf3, 0x30, 0x0e, 0xce, 0x54, 0x71, - 0xba, 0xed, 0xf0, 0xb7, 0xef, 0x8e, 0xb2, 0xc9, 0x8b, 0x6a, 0x9b, 0x51, - 0x76, 0xb3, 0x9c, 0x2d, 0x4e, 0x52, 0xbe, 0xf9, 0x11, 0xff, 0xfd, 0x7a, - 0x7f, 0xca, 0x6b, 0x32, 0xcd, 0x1f, 0x7a, 0xe8, 0x0c, 0xa6, 0xe4, 0xf8, - 0x69, 0xd6, 0x75, 0x8c, 0xf7, 0xa5, 0xca, 0x72, 0x73, 0x4d, 0xc8, 0xc6, - 0xe1, 0x3c, 0xec, 0xb9, 0x10, 0x44, 0xea, 0x0d, 0x9b, 0xdf, 0x77, 0x83, - 0x91, 0xe3, 0x0e, 0xa5, 0xde, 0x59, 0x03, 0x40, 0x66, 0x26, 0x8a, 0x5a, - 0xaa, 0x65, 0xfc, 0xdd, 0xd2, 0xf4, 0xcd, 0x6f, 0x21, 0x58, 0x26, 0x40, - 0x9e, 0x94, 0xe4, 0x51, 0x74, 0xaf, 0x53, 0xd0, 0x1d, 0x58, 0xc6, 0x74, - 0x12, 0xbc, 0x5d, 0x75, 0xda, 0x31, 0xb5, 0x2d, 0x00, 0xd4, 0x1b, 0x72, - 0x41, 0x90, 0xb0, 0x9a, 0x87, 0x52, 0x28, 0xe2, 0x49, 0x88, 0xb6, 0x39, - 0xe7, 0xa3, 0x5d, 0xe9, 0x55, 0x79, 0x42, 0x18, 0x14, 0xac, 0x56, 0xe5, - 0x16, 0x38, 0xe9, 0x6c, 0x05, 0x46, 0x36, 0x75, 0x00, 0xa1, 0x40, 0x77, - 0x22, 0x3f, 0x89, 0xb5, 0x26, 0xb7, 0x7f, 0x94, 0xd8, 0x87, 0xd3, 0xdc, - 0xac, 0xf7, 0xc7, 0x61, 0x12, 0xb7, 0xd7, 0xe2, 0x5f, 0x2d, 0x03, 0xc0, - 0xbd, 0x9e, 0x17, 0x48, 0xed, 0x31, 0x6e, 0x54, 0x8e, 0x1f, 0x9d, 0xf0, - 0xda, 0x31, 0xb5, 0x2d, 0x00, 0xd4, 0x1b, 0x72, 0x41, 0x90, 0xb0, 0xe2, - 0x87, 0x52, 0x2a, 0xe2, 0x2c, 0x06, 0xf6, 0xa6, 0x3e, 0x89, 0xad, 0x2b, - 0x9d, 0xd9, 0x79, 0x4e, 0xc6, 0x18, 0x2a, 0xc1, 0x93, 0xde, 0x69, 0x83, - 0x76, 0x5e, 0xdb, 0x35, 0x2a, 0xee, 0xf0, 0xce, 0x44, 0x22, 0xeb, 0xad, - 0xed, 0x68, 0x8e, 0x63, 0x8d, 0xc2, 0xf9, 0x7c, 0xd2, 0x12, 0x19, 0xed, - 0xab, 0xa6, 0x2b, 0x1f, 0x54, 0xe7, 0x5b, 0xe0, 0x7c, 0xda, 0x5b, 0x39, - 0x4c, 0x49, 0x33, 0x43, 0x76, 0x69, 0x1c, 0x11, 0xda, 0x31, 0xb5, 0x2d, - 0x00, 0xd4, 0x1b, 0x72, 0x41, 0x90, 0xb0, 0xca, 0x87, 0x52, 0x24, 0xe2, - 0x28, 0xf1, 0x74, 0x5a, 0x44, 0x14, 0xef, 0x9f, 0x91, 0x79, 0x66, 0x0b, - 0x85, 0x0f, 0x60, 0xdb, 0x60, 0xd0, 0x5f, 0xa7, 0x0d, 0x54, 0x57, 0xf7, - 0x79, 0x3f, 0xa9, 0xef, 0xe9, 0xa9, 0x98, 0xa6, 0x96, 0x86, 0x19, 0x8e, - 0x2b, 0x60, 0x06, 0x92, 0xd2, 0x70, 0xf2, 0xf0, 0xf3, 0x3d, 0xd9, 0xdf, - 0x77, 0x7a, 0x56, 0x47, 0xbc, 0x5e, 0x9d, 0x59, 0xd5, 0x4a, 0xe5, 0xf6, - 0x91, 0x13, 0xb9, 0x90, 0xda, 0x31, 0xb5, 0x2d, 0x00, 0xd4, 0x1b, 0x72, - 0x41, 0x90, 0xb0, 0x12, 0x87, 0x52, 0x26, 0xe2, 0x4b, 0x30, 0xd0, 0xaa, - 0xf9, 0x97, 0x33, 0x4e, 0x33, 0xe8, 0x16, 0x8c, 0xe1, 0xef, 0xf9, 0xa6, - 0xe4, 0x99, 0x26, 0x8f, 0x6c, 0x77, 0x81, 0x21, 0x22, 0xc4, 0x9f, 0x4f, - 0x4f, 0xad, 0x23, 0x64, 0x2a, 0x81, 0x97, 0x2d, 0xfc, 0x4e, 0x9d, 0x2b, - 0x5b, 0x60, 0x26, 0x95, 0xa5, 0x7c, 0x0d, 0xbe, 0x3e, 0x74, 0xde, 0x83, - 0x64, 0xde, 0xce, 0x48, 0xc9, 0x61, 0xa6, 0x42, 0xe4, 0x44, 0x02, 0x17, - 0xef, 0xc0, 0x62, 0x07, 0xd3, 0x7f, 0xab, 0x11, 0xc7, 0x39, 0x1f, 0x61, - 0x83, 0x51, 0x1a, 0x0e, 0xdd, 0x76, 0xb3, 0x3f, 0x51, 0xcd, 0x84, 0x00, - 0xf1, 0xb6, 0xa5, 0x61, 0xa9, 0x9e, 0xac, 0x53, 0x59, 0x4f, 0x04, 0xee, - 0x53, 0x3a, 0xac, 0x99, 0xe9, 0x23, 0x1d, 0x29, 0xea, 0x4e, 0xc0, 0x7b, - 0x9b, 0x31, 0x23, 0x93, 0x30, 0xd1, 0x1e, 0x4c, 0x4e, 0x1c, 0x6c, 0xf0, - 0x83, 0xdc, 0xe6, 0x32, 0x21, 0x00, 0xd3, 0x83, 0xaf, 0x45, 0x50, 0xd0, - 0xde, 0xcc, 0x2e, 0x66, 0x9c, 0x9f, 0xf6, 0x00, 0xa1, 0xdd, 0x10, 0x4a, - 0x77, 0x35, 0xae, 0x33, 0xd0, 0x5d, 0x7e, 0x91, 0xac, 0xda, 0xc5, 0x56, - 0x29, 0x4c, 0x36, 0x9d, 0x9b, 0x18, 0x41, 0x3f, 0x1b, 0x0b, 0x73, 0x25, - 0x16, 0x12, 0x7e, 0x3e, 0x5f, 0x81, 0x0b, 0xe1, 0x58, 0xa3, 0xe4, 0xd5, - 0x31, 0xa1, 0xc3, 0x15, 0x17, 0x28, 0x4f, 0x4c, 0xcd, 0x82, 0x30, 0xd7, - 0x61, 0x75, 0x7e, 0x70, 0x72, 0x07, 0x07, 0xfb, 0x5a, 0x9e, 0x3e, 0x4f, - 0x58, 0x25, 0x3a, 0x06, 0xad, 0xc5, 0x0a, 0xd7, 0xb1, 0xbf, 0x53, 0xaa, - 0x60, 0xf3, 0x8c, 0xf6, 0x01, 0x56, 0x75, 0xa6, 0xb5, 0x92, 0x12, 0x4f, - 0x33, 0xc6, 0xd1, 0x86, 0x6b, 0xbd, 0xb9, 0xeb, 0x5d, 0xa1, 0x12, 0x37, - 0x63, 0x06, 0x6b, 0xb0, 0x20, 0x45, 0x9e, 0x37, 0x24, 0x4c, 0x30, 0x78, - 0xea, 0xf8, 0x9e, 0x84, 0x14, 0xe2, 0x19, 0xfb, 0xed, 0x23, 0x89, 0x89, - 0x54, 0x8e, 0x2a, 0x0f, 0x01, 0x3f, 0xba, 0x60, 0x78, 0x0b, 0xfc, 0x98, - 0x37, 0x4d, 0x2f, 0x57, 0x27, 0xcb, 0xcf, 0x08, 0x51, 0x0d, 0x68, 0xf8, - 0x9e, 0xc0, 0x5c, 0x35, 0x12, 0xcc, 0x43, 0x40, 0x42, 0x86, 0xd5, 0xdf, - 0x27, 0x84, 0x19, 0x53, 0xfa, 0x02, 0x92, 0xfa, 0x25, 0xb9, 0x9f, 0x65, - 0x93, 0xfb, 0xb6, 0x59, 0x16, 0xdb, 0x0d, 0x7e, 0x8b, 0x9e, 0xe8, 0x8c, - 0x77, 0xd8, 0x73, 0xad, 0xcd, 0x96, 0x28, 0x9e, 0xdf, 0xc5, 0x19, 0xab, - 0x38, 0x88, 0xb3, 0xc4, 0xcb, 0xfb, 0x3d, 0x49, 0x5d, 0xbd, 0x13, 0x78, - 0x38, 0xc0, 0xc2, 0xc1, 0x8e, 0xcc, 0x5d, 0xa4, 0x62, 0x82, 0xf3, 0x00, - 0x2c, 0xe4, 0xc4, 0xb9, 0x61, 0x18, 0x7f, 0x45, 0xd8, 0x02, 0xbd, 0x37, - 0xf6, 0x3a, 0x00, 0xb7, 0x9c, 0x88, 0x58, 0xf2, 0x3b, 0x35, 0x0f, 0x3d, - 0xeb, 0x93, 0x1e, 0x8a, 0x95, 0xda, 0x8c, 0xc0, 0x6f, 0x0f, 0xfe, 0xae, - 0x30, 0xe4, 0xde, 0x74, 0xe0, 0x1a, 0x64, 0x7a, 0x8e, 0xa8, 0x93, 0xae, - 0x21, 0xc8, 0x62, 0x28, 0x69, 0x76, 0x20, 0x57, 0xda, 0x6d, 0x76, 0xb8, - 0xce, 0x8e, 0x34, 0x42, 0x8f, 0x25, 0x72, 0x77, 0xd6, 0xed, 0xf1, 0x8a, - 0x43, 0xcd, 0xb1, 0xae, 0x85, 0x47, 0x3c, 0x87, 0x12, 0x47, 0x6e, 0xb0, - 0x97, 0x56, 0x25, 0xa2, 0xa7, 0xe4, 0xea, 0xa7, 0xed, 0xa4, 0x96, 0xb4, - 0xff, 0x63, 0xd9, 0xaa, 0x44, 0xdf, 0x3e, 0xa8, 0xa7, 0x4b, 0x80, 0x16, - 0x8d, 0xca, 0x03, 0xbb, 0x9b, 0xea, 0x17, 0xf1, 0xc7, 0x20, 0xe5, 0x4a, - 0x3f, 0x7b, 0xa5, 0xa4, 0xd9, 0x64, 0xeb, 0x31, 0xf8, 0x12, 0x3e, 0xde, - 0xed, 0x5a, 0xb5, 0xaa, 0x83, 0x7e, 0xd4, 0x76, 0x4e, 0x63, 0xe6, 0xa6, - 0x08, 0x9f, 0x8b, 0xc0, 0x74, 0x1f, 0xe6, 0xeb, 0xa2, 0xcd, 0x03, 0x44, - 0xc5, 0x33, 0x0d, 0x4b, 0xfb, 0x66, 0x40, 0x4c, 0xce, 0x32, 0x3b, 0x02, - 0x50, 0xb5, 0xaf, 0x40, 0xaa, 0x85, 0xab, 0x50, 0x97, 0xff, 0x2c, 0x23, - 0x30, 0x35, 0xd1, 0xda, 0x56, 0xd9, 0x8e, 0xb8, 0xac, 0xc3, 0xed, 0x9a, - 0xcf, 0x44, 0xa1, 0x93, 0x1c, 0x9d, 0x0c, 0xfc, 0x60, 0xda, 0x1e, 0x14, - 0x81, 0x38, 0x5f, 0xa4, 0xf4, 0x67, 0x6c, 0xfa, 0x8a, 0x5d, 0x31, 0x91, - 0x6c, 0x19, 0x70, 0xf4, 0x2d, 0xca, 0xc6, 0xa9, 0x9d, 0xeb, 0xee, 0x8a, - 0x27, 0xf8, 0x01, 0x70, 0xc1, 0x44, 0xb4, 0xff, 0x8c, 0xea, 0x87, 0x8e, - 0xa9, 0xea, 0x84, 0x84, 0xc2, 0x8e, 0x77, 0x96, 0x32, 0xd6, 0xc9, 0x64, - 0xa2, 0x61, 0xcd, 0x15, 0x31, 0xc0, 0x4c, 0xc9, 0xb5, 0xb9, 0x6d, 0x99, - 0x07, 0x70, 0xbf, 0x59, 0x6f, 0x35, 0x66, 0x2e, 0x36, 0xb1, 0x6f, 0xa0, - 0x4e, 0x69, 0x1d, 0x96, 0x48, 0x9c, 0xa7, 0xf9, 0x4a, 0xf9, 0xb1, 0x1c, - 0x94, 0xa0, 0xc1, 0x10, 0x22, 0x51, 0x0c, 0xc2, 0x5c, 0x92, 0xaf, 0xcc, - 0xa7, 0x06, 0x87, 0xd0, 0x2e, 0x58, 0xce, 0x3c, 0xe8, 0x0b, 0x67, 0x46, - 0xc9, 0xf5, 0x5e, 0xb1, 0x8a, 0x07, 0xc0, 0x95, 0x18, 0x00, 0x3d, 0xd2, - 0xc4, 0x2a, 0x5a, 0x13, 0xbf, 0x03, 0xa0, 0x33, 0xe9, 0x2a, 0x0a, 0xec, - 0x69, 0x7b, 0xe0, 0x47, 0x43, 0xb6, 0x8c, 0x18, 0x20, 0xf4, 0x6b, 0xa2, - 0x6c, 0x57, 0xe8, 0xca, 0x63, 0x9e, 0x0d, 0x40, 0xa1, 0xd1, 0x1f, 0xd6, - 0xf5, 0x9b, 0x8d, 0xd3, 0x92, 0xe2, 0x5d, 0xbd, 0x27, 0xf1, 0xdb, 0x79, - 0x11, 0x8b, 0x63, 0xa1, 0x0a, 0x5c, 0x8d, 0x5f, 0x9d, 0xf7, 0xbf, 0x5b, - 0x0a, 0x52, 0xc4, 0x0c, 0xb1, 0x00, 0x02, 0xce, 0xdf, 0x17, 0x28, 0xb0, - 0xad, 0x6b, 0xd6, 0x83, 0x81, 0x91, 0x6b, 0xee, 0xdd, 0xd8, 0x6a, 0x33, - 0xe7, 0x25, 0x4f, 0x23, 0xa9, 0xf7, 0xd7, 0xa2, 0x12, 0x20, 0x0f, 0xcc, - 0x4b, 0x22, 0xde, 0x81, 0x59, 0x71, 0x82, 0xbd, 0xe5, 0x45, 0xa0, 0xa8, - 0x72, 0x34, 0x24, 0x29, 0x7e, 0x3b, 0x79, 0x89, 0x3a, 0x6b, 0x03, 0x21, - 0xf4, 0x25, 0x6f, 0x80, 0x2d, 0xc7, 0x1e, 0xae, 0x49, 0xee, 0x18, 0x0b, - 0x70, 0x5c, 0x35, 0xae, 0xf9, 0x38, 0x38, 0xf2, 0xc5, 0x60, 0xb3, 0xc2, - 0xb8, 0x52, 0x52, 0x2a, 0x0f, 0x22, 0x58, 0x98, 0x61, 0xaf, 0x7a, 0xed, - 0x32, 0xd9, 0x61, 0xff, 0xda, 0x7f, 0xac, 0xac, 0x64, 0x89, 0x32, 0x25, - 0x81, 0x9e, 0x50, 0xec, 0xb9, 0x11, 0x5d, 0x82, 0x33, 0xa6, 0x76, 0x76, - 0x0d, 0xb2, 0xf9, 0x36, 0x78, 0x5c, 0xaa, 0x96, 0xf5, 0xbf, 0x07, 0x46, - 0xa0, 0xfe, 0x0a, 0xeb, 0x59, 0xdb, 0x60, 0xf4, 0xc4, 0xc4, 0xae, 0x11, - 0x51, 0x6f, 0xd6, 0xa7, 0xa7, 0xd8, 0xda, 0x8c, 0x5e, 0xe6, 0x08, 0xd3, - 0xba, 0x02, 0x4e, 0x3b, 0xce, 0xdb, 0x94, 0xb7, 0xb5, 0xb4, 0xee, 0x92, - 0x91, 0xaa, 0x27, 0xa1, 0xa5, 0xde, 0xe5, 0x51, 0x5f, 0xae, 0xe7, 0x32, - 0x9a, 0xa5, 0x00, 0x11, 0x66, 0xb7, 0x3a, 0xab, 0xe6, 0x56, 0x8b, 0xec, - 0x8b, 0xd9, 0x3c, 0x3d, 0xd4, 0x3a, 0xca, 0x45, 0x4d, 0xee, 0xe2, 0xb5, - 0xaa, 0xcc, 0x30, 0xb5, 0x90, 0x57, 0xfc, 0x58, 0xd1, 0x49, 0x37, 0x22, - 0x30, 0xf0, 0xf6, 0xf7, 0x29, 0x3a, 0x5b, 0x8c, 0x81, 0x37, 0x7d, 0x2e, - 0x5a, 0xd0, 0x24, 0xd7, 0x0e, 0x48, 0x25, 0x4d, 0xdc, 0x66, 0xb8, 0x0a, - 0xbd, 0x9b, 0xa9, 0xcf, 0xc5, 0xbe, 0xfc, 0xe3, 0xb6, 0x18, 0x38, 0xb9, - 0x8f, 0x4e, 0xf8, 0x8b, 0x67, 0x48, 0x91, 0xf0, 0x48, 0x89, 0x74, 0xf2, - 0xc2, 0xca, 0xa2, 0x49, 0xf4, 0xca, 0x19, 0x84, 0x3b, 0x15, 0xa3, 0x5e, - 0x7c, 0xb1, 0x28, 0xd4, 0xdb, 0xf0, 0xb4, 0x72, 0xe3, 0xae, 0x53, 0xad, - 0xbf, 0x63, 0x1f, 0x3c, 0xb2, 0x38, 0x58, 0xfa, 0xdb, 0x67, 0x2a, 0x24, - 0x49, 0x14, 0xe2, 0xed, 0x89, 0xc7, 0xaa, 0x0c, 0x90, 0x9c, 0x0d, 0x4b, - 0x14, 0x32, 0xf3, 0x97, 0x3b, 0x73, 0x32, 0x05, 0xc2, 0xd4, 0xf7, 0x52, - 0x46, 0x7a, 0xd8, 0x8b, 0x80, 0x02, 0x30, 0x8c, 0xf3, 0xd8, 0xa9, 0xba, - 0x0a, 0x99, 0x38, 0x94, 0x7e, 0x72, 0x75, 0x41, 0x69, 0x0d, 0x4b, 0x03, - 0x4f, 0x0e, 0xa6, 0xe9, 0x71, 0x78, 0x36, 0xb4, 0xa2, 0x54, 0x70, 0xeb, - 0x85, 0x21, 0x48, 0x4b, 0xe2, 0xab, 0x17, 0xeb, 0x17, 0x2c, 0xbf, 0x15, - 0x10, 0x41, 0x52, 0x41, 0x11, 0xe5, 0xc8, 0x5f, 0x78, 0xa1, 0xb4, 0xd9, - 0x92, 0x75, 0x5c, 0xba, 0x1f, 0x5e, 0xd5, 0x46, 0x5e, 0xd6, 0xb5, 0x24, - 0x35, 0x57, 0x7d, 0xf5, 0x9f, 0x91, 0x8b, 0xad, 0xa6, 0xfb, 0x0c, 0x65, - 0x9f, 0xfb, 0x98, 0xb4, 0x03, 0xc9, 0xa9, 0x50, 0xd3, 0xbf, 0x6e, 0xf3, - 0x3d, 0x48, 0x01, 0x32, 0x5d, 0x49, 0xe0, 0x8d, 0x2e, 0x36, 0x48, 0x81, - 0xbd, 0xd0, 0xa9, 0x39, 0xfb, 0x9b, 0x40, 0x6b, 0x39, 0x91, 0xb5, 0x9f, - 0xbf, 0xf1, 0x8a, 0x42, 0xc7, 0x0a, 0xe8, 0xec, 0x95, 0x46, 0xf6, 0x4f, - 0xd9, 0x14, 0xae, 0xfe, 0xf3, 0xa2, 0x63, 0x6d, 0x94, 0x6d, 0x80, 0x0b, - 0x96, 0x09, 0x8b, 0x81, 0x7a, 0x96, 0x84, 0x6a, 0xd5, 0x6e, 0xa0, 0x84, - 0xdc, 0x8a, 0x54, 0xff, 0x6d, 0x60, 0xeb, 0x0d, 0x80, 0x55, 0x84, 0x78, - 0x38, 0x2c, 0x42, 0x04, 0xe9, 0xad, 0xff, 0x20, 0xce, 0x2e, 0x9f, 0x18, - 0xe0, 0xbc, 0x9b, 0xba, 0x65, 0x57, 0xe8, 0x28, 0xa8, 0x95, 0x02, 0x56, - 0x4d, 0xd7, 0xa3, 0xbc, 0xc4, 0xfc, 0x1d, 0x2d, 0x6a, 0x45, 0xbd, 0x81, - 0xdf, 0xc8, 0x23, 0xd9, 0x35, 0xbe, 0x55, 0x53, 0xfb, 0x6b, 0x42, 0xd8, - 0xb9, 0x78, 0x17, 0x48, 0x82, 0x6b, 0xa6, 0xfb, 0x4d, 0x49, 0x21, 0xc0, - 0x46, 0x7c, 0xb6, 0xc3, 0xb7, 0xb0, 0x13, 0xbf, 0xe3, 0x54, 0x9b, 0xaf, - 0x87, 0xbe, 0xa0, 0xdc, 0x5d, 0xbf, 0xc1, 0x2f, 0xec, 0x19, 0x0d, 0x65, - 0xce, 0xac, 0x03, 0xa3, 0x70, 0x2e, 0xac, 0x0c, 0x02, 0xd9, 0x57, 0x55, - 0xe5, 0xbf, 0xc2, 0xa1, 0x71, 0x40, 0x3c, 0x5f, 0xe6, 0x79, 0xd0, 0xbc, - 0xe0, 0x20, 0x00, 0x39, 0xc3, 0x7b, 0x5c, 0x8a, 0x3c, 0xc9, 0xc9, 0x43, - 0xf4, 0x0d, 0xba, 0xa2, 0xa2, 0x23, 0xe6, 0x3d, 0x1c, 0x07, 0xbf, 0xc2, - 0xe4, 0x7a, 0x7b, 0x42, 0x98, 0xa3, 0xd5, 0x11, 0x34, 0x6e, 0x8c, 0xb0, - 0x0d, 0x89, 0x44, 0x0c, 0xe9, 0xac, 0x8d, 0x3b, 0x1d, 0x54, 0x4a, 0xe8, - 0x8e, 0xf6, 0xc4, 0xfd, 0x41, 0xb4, 0x16, 0xd5, 0xbd, 0x4d, 0xc4, 0xb3, - 0xe5, 0xd1, 0xb5, 0xe9, 0xb7, 0x6e, 0x13, 0xb0, 0xce, 0xb2, 0x97, 0xd1, - 0xfd, 0xd1, 0xf6, 0xa8, 0x63, 0xd9, 0x57, 0xe3, 0x93, 0xd6, 0x11, 0x10, - 0x7c, 0x0d, 0x79, 0xb6, 0x3f, 0xd6, 0x41, 0xaf, 0xd5, 0x0e, 0xbd, 0x9e, - 0x2a, 0xeb, 0x0a, 0x87, 0x6d, 0xda, 0x55, 0x6e, 0x41, 0x31, 0xad, 0x0f, - 0x06, 0xfd, 0x59, 0xa4, 0x3a, 0x45, 0xd0, 0xc4, 0x86, 0xb9, 0x1f, 0x95, - 0x35, 0x3a, 0x5a, 0x52, 0x6e, 0x44, 0x9c, 0x45, 0x82, 0xa2, 0x05, 0x23, - 0xdd, 0xed, 0x36, 0xd4, 0x22, 0x24, 0x05, 0xe8, 0x97, 0x2b, 0x7f, 0x00, - 0xe0, 0xcb, 0x41, 0x71, 0x5d, 0x47, 0x25, 0x77, 0x9b, 0x5d, 0x43, 0x51, - 0xfd, 0x1b, 0xe2, 0x5b, 0x57, 0xfb, 0x2d, 0x34, 0x93, 0x99, 0x67, 0xee, - 0x6f, 0x53, 0xe8, 0x14, 0x0d, 0x10, 0xca, 0xb1, 0xf9, 0x12, 0x13, 0x9c, - 0x66, 0x62, 0x29, 0x8c, 0x48, 0x26, 0xfa, 0x31, 0xd5, 0x18, 0x09, 0x07, - 0x95, 0xef, 0x0b, 0xff, 0x34, 0xad, 0xe8, 0x38, 0x7b, 0x90, 0x67, 0x2b, - 0x5e, 0xe0, 0x67, 0x2d, 0xcb, 0xc4, 0x0e, 0x25, 0x2a, 0x5f, 0x2a, 0x31, - 0x6b, 0x15, 0x82, 0x74, 0xe9, 0x85, 0xca, 0xb4, 0x5b, 0x2e, 0xb1, 0x61, - 0x58, 0x66, 0xbb, 0x03, 0xc5, 0x9e, 0xe4, 0xd8, 0x40, 0xc1, 0xb1, 0x0e, - 0xf2, 0x17, 0xb4, 0xa6, 0x39, 0x4f, 0x2d, 0x5f, 0xe8, 0x4a, 0xe4, 0xb7, - 0xa7, 0x12, 0xf5, 0x84, 0x5f, 0xdd, 0xcc, 0x0e, 0x08, 0x13, 0xd4, 0xfb, - 0x75, 0xe7, 0x4b, 0xa8, 0x7e, 0xa0, 0x79, 0xa6, 0xfe, 0x77, 0x93, 0x74, - 0x31, 0x39, 0x86, 0xe9, 0x72, 0x68, 0xd5, 0x95, 0x93, 0x8a, 0x1e, 0x07, - 0x3d, 0xbb, 0xbd, 0x51, 0xe8, 0xb8, 0x4e, 0x7a, 0xed, 0x87, 0xfb, 0x81, - 0x12, 0x07, 0x2a, 0x59, 0xa1, 0x08, 0x18, 0xd4, 0x29, 0x55, 0xed, 0xc2, - 0xa7, 0xe9, 0xe1, 0x6b, 0x6c, 0x0d, 0x35, 0x3d, 0x7c, 0x75, 0x4a, 0xa9, - 0x15, 0x7a, 0xd2, 0xcf, 0x73, 0x02, 0x41, 0x7e, 0xc8, 0x8d, 0x6e, 0xdb, - 0xaa, 0x74, 0x98, 0xf4, 0xfb, 0xfd, 0x26, 0x98, 0x9e, 0x10, 0x11, 0xe1, - 0x27, 0x09, 0x50, 0x3f, 0x06, 0x1c, 0x5b, 0x2d, 0xfe, 0xd9, 0xae, 0x83, - 0x96, 0x70, 0xf5, 0xcf, 0xff, 0xf2, 0xfe, 0xe8, 0x91, 0x33, 0xc5, 0xa6, - 0x47, 0xbe, 0xd9, 0x5d, 0xa7, 0x30, 0x9b, 0x18, 0x3d, 0x1b, 0x5a, 0x46, - 0xe2, 0xcb, 0x1f, 0x7f, 0xc0, 0xbf, 0x21, 0xbc, 0x3c, 0xcf, 0x90, 0xb2, - 0x4b, 0x6f, 0x5f, 0x73, 0x28, 0x77, 0x58, 0x80, 0xd8, 0x74, 0x04, 0x75, - 0x0c, 0x8b, 0x44, 0x37, 0x5c, 0xf0, 0x45, 0x60, 0xe1, 0xd3, 0xe3, 0x10, - 0x8e, 0x09, 0x76, 0xca, 0x94, 0x24, 0x0f, 0xeb, 0x55, 0x1f, 0xc9, 0xdc, - 0xa7, 0xd0, 0x27, 0xe1, 0x78, 0x75, 0x4c, 0x3e, 0xaa, 0x39, 0xb7, 0x16, - 0x60, 0xf5, 0xe9, 0xa1, 0xb2, 0x92, 0xa8, 0x76, 0x1b, 0x30, 0x9a, 0x0a, - 0x60, 0x5d, 0x7c, 0xbe, 0x74, 0x46, 0xd0, 0x4e, 0xf5, 0x98, 0xd7, 0xc1, - 0x9d, 0xd2, 0xa1, 0xa7, 0xbe, 0x65, 0xf4, 0xd8, 0x95, 0xeb, 0x3b, 0x5d, - 0x8b, 0x8c, 0x56, 0x0f, 0x16, 0x77, 0x77, 0xc7, 0x95, 0x14, 0xaa, 0xbc, - 0x1d, 0xf2, 0xba, 0x37, 0x32, 0xea, 0x40, 0x4f, 0x49, 0xfb, 0x92, 0x60, - 0xbf, 0xb1, 0xa8, 0xaa, 0xcb, 0x9e, 0x6e, 0x31, 0x47, 0x56, 0x5a, 0xea, - 0xca, 0xd8, 0x68, 0x68, 0x86, 0xe3, 0xb2, 0x03, 0x0c, 0xd6, 0x10, 0x2f, - 0x2c, 0x1d, 0x21, 0x6c, 0xf0, 0x4f, 0x7c, 0x0e, 0x98, 0x80, 0xd4, 0x93, - 0x66, 0xe3, 0x64, 0xa6, 0x9e, 0x04, 0x2c, 0x17, 0xdf, 0x2b, 0x28, 0x36, - 0x6c, 0x74, 0x64, 0x94, 0xdc, 0xcb, 0xf7, 0xe1, 0x93, 0x8e, 0x25, 0x3d, - 0x79, 0xb2, 0xfd, 0x16, 0x8b, 0x6e, 0x59, 0x9a, 0xcd, 0x23, 0x5a, 0x73, - 0x54, 0x84, 0xef, 0x5d, 0x07, 0xa5, 0x94, 0x18, 0x6d, 0x2a, 0x22, 0x40, - 0xa3, 0x9b, 0x97, 0x67, 0x1a, 0x52, 0x5b, 0x48, 0xf3, 0xa2, 0x3b, 0xa5, - 0x48, 0xf6, 0xba, 0x82, 0x6d, 0x57, 0x2f, 0xe2, 0x24, 0x8e, 0x02, 0x04, - 0xe0, 0x6e, 0xb5, 0x2b, 0x98, 0x24, 0x9e, 0x39, 0x5b, 0xfc, 0x98, 0x52, - 0x83, 0xc3, 0x77, 0xe6, 0xdf, 0x95, 0xa2, 0x02, 0x3a, 0x93, 0x97, 0xbc, - 0xbd, 0xdd, 0xc2, 0x30, 0x90, 0x50, 0x36, 0x7f, 0x41, 0xa6, 0x35, 0x6a, - 0xba, 0x38, 0xac, 0xa2, 0x09, 0x07, 0xa1, 0xdf, 0x0c, 0xc6, 0x8b, 0xac, - 0xf0, 0xf2, 0xda, 0x71, 0x6e, 0xd0, 0xbc, 0x83, 0xf4, 0x3d, 0x3d, 0x36, - 0xa3, 0x61, 0xd7, 0x16, 0x23, 0xce, 0xf3, 0x3c, 0x27, 0xfc, 0xc7, 0x5b, - 0x89, 0x25, 0x09, 0x4a, 0xb1, 0x4e, 0x53, 0xaf, 0x2d, 0x5c, 0x51, 0xb9, - 0xc2, 0xb6, 0xc2, 0x51, 0x14, 0x04, 0x5a, 0x49, 0xe4, 0x63, 0x0f, 0x3c, - 0xff, 0xd2, 0x3c, 0x95, 0xeb, 0x5a, 0x9d, 0xa8, 0x65, 0x50, 0x52, 0xb0, - 0xde, 0x10, 0x58, 0x67, 0x0d, 0x16, 0x5f, 0xb2, 0x4d, 0xbf, 0x25, 0x54, - 0x2b, 0xa6, 0x31, 0x4c, 0xd7, 0xe8, 0x4c, 0xd0, 0x7a, 0xba, 0xf6, 0x11, - 0x0e, 0x29, 0x87, 0xcf, 0x0f, 0x73, 0xa8, 0x83, 0xaa, 0x3c, 0x9c, 0x16, - 0x61, 0xac, 0x2c, 0x8a, 0xd2, 0xb7, 0x72, 0xc6, 0xe2, 0x54, 0x15, 0xa0, - 0xf0, 0xf8, 0x6a, 0x99, 0xcc, 0x06, 0xfd, 0x62, 0x89, 0x06, 0x6d, 0x7b, - 0x39, 0x1e, 0xc2, 0x4f, 0x3a, 0xbf, 0xcc, 0x4b, 0xf6, 0x63, 0x66, 0x56, - 0x53, 0x6d, 0x1a, 0xf9, 0x5a, 0xa6, 0x20, 0xb7, 0x8f, 0x4f, 0xb8, 0x8f, - 0xde, 0xac, 0x61, 0xac, 0x08, 0x43, 0x39, 0xf4, 0x11, 0x25, 0xab, 0x41, - 0x05, 0x2b, 0x6d, 0x88, 0xce, 0xac, 0x10, 0xfc, 0x95, 0x39, 0x70, 0x6c, - 0x92, 0x02, 0x84, 0x57, 0x61, 0x8b, 0x6f, 0x0a, 0x0c, 0x12, 0x76, 0x21, - 0x28, 0x97, 0x60, 0xca, 0x81, 0x71, 0x9a, 0xaf, 0x4f, 0x83, 0xae, 0x51, - 0x78, 0x3f, 0xed, 0x65, 0x05, 0x3c, 0xd0, 0x18, 0x79, 0x2d, 0x98, 0xc2, - 0x18, 0x33, 0x16, 0xfa, 0xc9, 0xc6, 0xa3, 0x94, 0xf5, 0x2b, 0x7e, 0xb0, - 0x9f, 0xbf, 0x74, 0x73, 0xae, 0x7b, 0xb5, 0x26, 0x4d, 0x6b, 0x48, 0xb2, - 0x36, 0x7f, 0x2d, 0x18, 0x43, 0x9e, 0x1e, 0xa6, 0x36, 0x08, 0x24, 0x53, - 0x7a, 0xd0, 0xbb, 0x3f, 0x8d, 0x46, 0x83, 0x5b, 0xd1, 0x27, 0x7a, 0x88, - 0x2e, 0xf9, 0x22, 0x08, 0xd0, 0x79, 0x09, 0x8a, 0x9c, 0x76, 0x9d, 0xdb, - 0x2c, 0x58, 0xe4, 0x35, 0xf5, 0xe5, 0x98, 0x74, 0xcd, 0xaf, 0xc2, 0x36, - 0xfd, 0x78, 0xd1, 0x41, 0x86, 0x14, 0x7e, 0x42, 0xa4, 0xef, 0xf1, 0x49, - 0xb1, 0x92, 0x78, 0x90, 0x68, 0x44, 0xe2, 0x99, 0x2d, 0x31, 0x49, 0x5f, - 0x71, 0xf0, 0x13, 0xaa, 0xea, 0x27, 0x84, 0xa6, 0xea, 0x61, 0xb1, 0xc6, - 0x42, 0xe8, 0xdd, 0x58, 0x18, 0x42, 0x2b, 0x7e, 0x7f, 0x3f, 0x3b, 0x71, - 0xba, 0xa5, 0x29, 0xb3, 0x37, 0x2b, 0x73, 0x31, 0x0b, 0x49, 0x8a, 0xa6, - 0x1e, 0x4d, 0x0c, 0x19, 0x4c, 0x2e, 0x15, 0x37, 0x52, 0xf4, 0x39, 0x7f, - 0x08, 0xe5, 0xb5, 0xf9, 0x11, 0x7e, 0x6a, 0xef, 0x2c, 0xb8, 0xb8, 0xd6, - 0x4d, 0xc3, 0x39, 0x24, 0x57, 0xcf, 0x99, 0x7a, 0x03, 0x4c, 0xa2, 0x1d, - 0x82, 0x40, 0x66, 0x09, 0x14, 0x8c, 0x25, 0xb1, 0xaa, 0xee, 0xfa, 0x4b, - 0x4c, 0x5c, 0x58, 0x2f, 0xa1, 0xc6, 0xfe, 0x55, 0xd5, 0x59, 0xf1, 0x41, - 0xf2, 0x9b, 0x16, 0x3d, 0x23, 0x9e, 0x64, 0xf0, 0x0b, 0xf6, 0x5f, 0x3b, - 0xf3, 0xa2, 0xfd, 0x85, 0x4c, 0xb6, 0x74, 0x29, 0x31, 0xc0, 0xd6, 0x6b, - 0x40, 0x9a, 0xfc, 0x9a, 0x7b, 0x70, 0x10, 0x87, 0x85, 0x6b, 0xa5, 0xc9, - 0x2b, 0xf7, 0x44, 0xc5, 0xd2, 0xaf, 0xee, 0xc8, 0x1e, 0xb1, 0xb7, 0x5f, - 0x4c, 0x1d, 0x49, 0x9b, 0x69, 0xce, 0x8f, 0xac, 0x0d, 0xc5, 0x42, 0x77, - 0xa3, 0x2f, 0x9b, 0x03, 0x8c, 0x3a, 0xcf, 0x50, 0xb2, 0x99, 0x7d, 0xb0, - 0x89, 0xb2, 0x8a, 0x71, 0x48, 0xcd, 0xc6, 0x64, 0x59, 0x92, 0xe1, 0x94, - 0xbc, 0xbc, 0x0a, 0x49, 0x3c, 0x80, 0xfc, 0x7e, 0x3e, 0x77, 0xa7, 0x7b, - 0x46, 0x42, 0xff, 0x97, 0x36, 0xa3, 0xf8, 0xa6, 0xac, 0x22, 0xb4, 0xf3, - 0x46, 0x3f, 0x0e, 0x0c, 0xac, 0x01, 0x93, 0x9d, 0xf0, 0x87, 0xfb, 0x01, - 0x2f, 0xc0, 0xef, 0x5e, 0x2d, 0x0a, 0x5d, 0x38, 0xbd, 0x45, 0x7e, 0xcc, - 0x30, 0x04, 0xf0, 0xc3, 0xf2, 0x72, 0xd9, 0xc5, 0x29, 0x80, 0xea, 0x64, - 0x39, 0x86, 0x36, 0x5b, 0x56, 0x79, 0x48, 0x14, 0x4a, 0x85, 0x9b, 0xeb, - 0x2a, 0x3d, 0x45, 0x3b, 0xce, 0x1c, 0xd6, 0xdc, 0xb4, 0xac, 0x1a, 0x1b, - 0xed, 0x18, 0x63, 0xb5, 0x05, 0xbf, 0x88, 0x75, 0x73, 0x37, 0x7a, 0xf5, - 0xa7, 0xc4, 0x9a, 0xa7, 0x9c, 0xf2, 0x1c, 0x55, 0xba, 0x36, 0x69, 0x9d, - 0x39, 0xae, 0x7e, 0x4c, 0x7b, 0x53, 0xf8, 0x24, 0x27, 0x70, 0x05, 0xf0, - 0x1f, 0xfb, 0x28, 0x79, 0x66, 0xc1, 0x0f, 0xc9, 0xf1, 0xbf, 0x62, 0x62, - 0xdc, 0x42, 0x08, 0xb6, 0x3b, 0x63, 0xef, 0x19, 0x8e, 0xe4, 0x8b, 0x50, - 0x64, 0x91, 0xa5, 0x04, 0xec, 0xb9, 0xc4, 0x6b, 0x55, 0x8c, 0x4c, 0x44, - 0x28, 0xbc, 0x45, 0xfe, 0x6a, 0xac, 0xd7, 0xd6, 0x2f, 0x03, 0xc9, 0xb4, - 0x41, 0x60, 0x8c, 0x3b, 0xd9, 0x1c, 0x86, 0x3c, 0x69, 0x13, 0x3c, 0xeb, - 0x52, 0x7d, 0x68, 0xac, 0x35, 0xcc, 0xd8, 0x34, 0x93, 0xdb, 0xd5, 0x50, - 0x3a, 0x24, 0x8c, 0x6e, 0xcc, 0x36, 0xc6, 0x06, 0xbf, 0xb4, 0x31, 0xb5, - 0x14, 0x2c, 0x42, 0x50, 0xae, 0x13, 0xce, 0x13, 0x55, 0x66, 0xd8, 0xcd, - 0xa7, 0x3c, 0xbe, 0xac, 0x31, 0x87, 0xf5, 0xe9, 0x38, 0x9c, 0xcb, 0x3d, - 0x35, 0x3d, 0x73, 0xd4, 0x82, 0xd3, 0x2d, 0x40, 0xd1, 0x6c, 0x39, 0x68, - 0x57, 0xa8, 0x66, 0x0c, 0x4b, 0x36, 0x76, 0x62, 0x5a, 0x26, 0x2c, 0x79, - 0x16, 0x1e, 0x8f, 0x65, 0xab, 0xeb, 0x98, 0x26, 0x05, 0x25, 0x01, 0x94, - 0x0a, 0x91, 0x4b, 0x9b, 0x68, 0x3e, 0xa1, 0x1e, 0xc3, 0x76, 0x7b, 0xc6, - 0x8d, 0xf0, 0x84, 0xb4, 0xf6, 0x75, 0xee, 0x3b, 0x29, 0x69, 0x2e, 0xf0, - 0x97, 0x9a, 0x34, 0x7d, 0x77, 0x66, 0xde, 0xbe, 0x43, 0x61, 0xec, 0x56, - 0x07, 0xb5, 0xc4, 0x4f, 0x63, 0xd7, 0x9d, 0x0d, 0xe1, 0x02, 0x1c, 0x59, - 0x68, 0x88, 0x92, 0x3b, 0x15, 0x0b, 0x02, 0xcb, 0xb5, 0x2a, 0xcb, 0xb2, - 0x47, 0xfa, 0xbf, 0x17, 0x57, 0x3c, 0x7e, 0x2f, 0x3c, 0x6f, 0xd1, 0x4a, - 0x1d, 0x96, 0xd7, 0x48, 0x8c, 0xde, 0x11, 0x30, 0xa7, 0x0e, 0x77, 0xa6, - 0xdd, 0x83, 0xa4, 0xa7, 0x23, 0xd9, 0xb0, 0x13, 0x35, 0xa1, 0xcb, 0x7a, - 0xdd, 0x2c, 0xb6, 0x7b, 0x88, 0x6b, 0x94, 0xe5, 0xa7, 0x55, 0x83, 0xa3, - 0xe7, 0x8c, 0x34, 0x84, 0x96, 0xc6, 0xf7, 0xb6, 0xc3, 0xf3, 0x80, 0x9e, - 0x09, 0x30, 0xf9, 0x53, 0x9a, 0x11, 0xcb, 0xfb, 0x15, 0x2d, 0x6c, 0x11, - 0xe8, 0x18, 0xb9, 0x13, 0x6d, 0xd3, 0x41, 0xf3, 0x4f, 0x7f, 0xf6, 0x61, - 0x98, 0x28, 0xb5, 0x30, 0x71, 0x80, 0x2f, 0x9a, 0x93, 0xb0, 0x70, 0x28, - 0x55, 0x94, 0xa0, 0x31, 0x54, 0x32, 0x42, 0xff, 0x99, 0x64, 0x5c, 0x48, - 0x99, 0xf3, 0x1a, 0x9b, 0xde, 0x21, 0x83, 0xff, 0xb7, 0x37, 0x8a, 0x7f, - 0x98, 0xe4, 0x56, 0x34, 0x4b, 0x61, 0xb9, 0x3b, 0xb4, 0x89, 0xcf, 0x35, - 0x9b, 0x63, 0xf2, 0x79, 0xad, 0x14, 0xdb, 0xb9, 0x25, 0xad, 0x1c, 0xf0, - 0x3f, 0xde, 0xd6, 0x4e, 0x9e, 0x12, 0x8a, 0x12, 0xcf, 0xf0, 0x33, 0x60, - 0x6d, 0x8c, 0xcb, 0xe4, 0x6d, 0x8d, 0x05, 0xd9, 0x4b, 0xa6, 0xc2, 0x9d, - 0xa6, 0xa9, 0xe1, 0xd9, 0x87, 0x04, 0x28, 0x0f, 0x22, 0x48, 0x94, 0x6c, - 0x2b, 0x71, 0xd7, 0x06, 0x31, 0x7a, 0xec, 0x54, 0x39, 0x52, 0xbc, 0xb8, - 0x5e, 0x3e, 0xe1, 0xed, 0xaf, 0x57, 0xac, 0xff, 0x17, 0x77, 0x7a, 0x8c, - 0xfe, 0x27, 0x65, 0x13, 0x26, 0xa1, 0xdc, 0xe9, 0x67, 0xf8, 0xa0, 0xcd, - 0x99, 0xf5, 0x4c, 0xa6, 0xe7, 0xa1, 0xfc, 0x5f, 0x57, 0xd5, 0x93, 0x3d, - 0x49, 0x99, 0xa1, 0x6c, 0xc0, 0x20, 0xf4, 0x75, 0x1e, 0x09, 0xa1, 0xdf, - 0x5d, 0xb8, 0x55, 0xbe, 0x30, 0x6e, 0x0e, 0xfa, 0x0d, 0xa5, 0xc5, 0xb0, - 0x10, 0xa1, 0x44, 0x24, 0x89, 0xdf, 0x5b, 0x88, 0x4b, 0x89, 0x95, 0x22, - 0x35, 0x48, 0x52, 0x93, 0xef, 0x61, 0x78, 0xc3, 0xed, 0xef, 0x51, 0x41, - 0x45, 0xa1, 0x86, 0x27, 0x02, 0x23, 0x37, 0x70, 0xcd, 0xef, 0xb8, 0x0a, - 0x51, 0x50, 0x38, 0xca, 0xd7, 0x4e, 0xae, 0xf4, 0xc0, 0xf1, 0x74, 0xca, - 0xa5, 0xc2, 0x44, 0xc3, 0x47, 0xda, 0x26, 0xe3, 0xeb, 0xf9, 0x35, 0x8e, - 0x7b, 0xb5, 0x77, 0x2f, 0x4f, 0x9d, 0xa7, 0xb3, 0x59, 0x28, 0x4a, 0x1a, - 0xf8, 0xb5, 0x0a, 0x7e, 0x59, 0xe4, 0x5d, 0xfc, 0x5c, 0x01, 0x52, 0xa0, - 0x12, 0xb5, 0x9d, 0x3a, 0xc8, 0xef, 0xfe, 0x26, 0x74, 0x9b, 0x5f, 0x50, - 0xae, 0x8a, 0x6b, 0xb4, 0x61, 0x42, 0x58, 0xe4, 0xe9, 0x29, 0xaa, 0xac, - 0x6a, 0xb3, 0x56, 0x9a, 0x4c, 0x16, 0xa4, 0x32, 0x8d, 0x92, 0x7d, 0x94, - 0xce, 0xc8, 0x96, 0x26, 0x05, 0x58, 0x14, 0x74, 0xff, 0x81, 0xb2, 0x33, - 0xc0, 0x8e, 0xcf, 0xbb, 0xc1, 0xc8, 0x37, 0xd1, 0x10, 0xeb, 0x9f, 0x0c, - 0x07, 0x2e, 0x23, 0xf2, 0x61, 0x62, 0xae, 0x3f, 0xcd, 0x51, 0x64, 0xde, - 0x21, 0xb5, 0x35, 0x3c, 0xe7, 0x67, 0x3f, 0x79, 0xbd, 0x29, 0x15, 0x43, - 0xef, 0x2c, 0x8d, 0xed, 0xf3, 0xdc, 0xfb, 0x98, 0xc7, 0xb3, 0x2c, 0xbd, - 0xa5, 0x37, 0x58, 0x2d, 0x77, 0x67, 0xde, 0x8b, 0x6c, 0x80, 0xd6, 0xaa, - 0x19, 0xb3, 0x2d, 0xc0, 0x62, 0x63, 0x97, 0xd5, 0x9d, 0xcb, 0x4e, 0x54, - 0xdb, 0x44, 0x10, 0x7e, 0xad, 0xd3, 0x8f, 0x0d, 0xb4, 0x1c, 0xe7, 0x16, - 0x9c, 0xd5, 0xdd, 0x76, 0x2f, 0x7e, 0xe6, 0x0b, 0x0d, 0xaa, 0x15, 0x14, - 0x00, 0x19, 0x72, 0xc0, 0xbe, 0xa2, 0xb4, 0x66, 0x55, 0x6c, 0xa8, 0x59, - 0x07, 0x20, 0x68, 0x27, 0x33, 0xde, 0x28, 0x8a, 0x66, 0x83, 0xba, 0x5b, - 0x76, 0x8e, 0x13, 0x66, 0xb8, 0xfc, 0x73, 0x94, 0x9a, 0x80, 0x2c, 0xd6, - 0xe6, 0xcf, 0xea, 0x0d, 0xb6, 0x72, 0x26, 0x43, 0x17, 0xd6, 0x54, 0xa8, - 0x95, 0x01, 0x95, 0xe0, 0xf5, 0xf9, 0xc5, 0x69, 0x19, 0xe0, 0xee, 0xbe, - 0xb6, 0x11, 0x79, 0x23, 0xb2, 0x59, 0x6f, 0xbd, 0x53, 0x71, 0x22, 0x6b, - 0x1f, 0x76, 0x50, 0x87, 0xaa, 0x81, 0xd0, 0xb0, 0x99, 0x97, 0xbf, 0xf1, - 0x29, 0x28, 0xc4, 0x87, 0xd8, 0xb0, 0x3b, 0xed, 0x3f, 0xe8, 0x5b, 0x5e, - 0x5c, 0xdf, 0x05, 0x96, 0x37, 0x85, 0xdc, 0xc1, 0x43, 0x8f, 0x27, 0xbd, - 0x69, 0x66, 0xd7, 0x81, 0xa8, 0xa9, 0x0e, 0x27, 0x57, 0x00, 0x77, 0x61, - 0x9b, 0xe8, 0x8e, 0x90, 0xed, 0x22, 0x22, 0xa4, 0xed, 0xf8, 0x2d, 0xe6, - 0x61, 0xc9, 0xbf, 0x35, 0xcc, 0xfb, 0xf2, 0xc0, 0x25, 0x72, 0x4b, 0x30, - 0x7a, 0x05, 0x19, 0xb0, 0x2f, 0x1c, 0x4b, 0x0e, 0xff, 0x7c, 0x82, 0xae, - 0x15, 0x89, 0xb6, 0x9e, 0x64, 0x53, 0xa4, 0xd5, 0x23, 0x1c, 0xa2, 0xa1, - 0xab, 0xb4, 0x75, 0x09, 0x9b, 0xdf, 0x36, 0x06, 0x54, 0xa9, 0xa0, 0x91, - 0xff, 0xd7, 0x76, 0xce, 0xea, 0xf7, 0xc3, 0x54, 0xd3, 0x69, 0x90, 0x5b, - 0x07, 0xf2, 0x0f, 0x04, 0xb9, 0x62, 0xbd, 0xcd, 0x52, 0xd0, 0xfb, 0xe0, - 0x7c, 0x76, 0x4c, 0x39, 0x5a, 0xec, 0x48, 0x65, 0xcb, 0x49, 0xa8, 0x4e, - 0x2f, 0x56, 0x1a, 0x4f, 0x1b, 0x9b, 0x33, 0x35, 0xb7, 0x32, 0xd5, 0xfd, - 0xef, 0x51, 0x87, 0x38, 0x3d, 0xaa, 0x10, 0x95, 0xdc, 0xa3, 0x5b, 0x7b, - 0x07, 0xbc, 0x3d, 0x3e, 0x76, 0x50, 0xa8, 0xff, 0x4f, 0xa0, 0x35, 0xd5, - 0xfa, 0xce, 0x52, 0x28, 0x63, 0xb7, 0xfb, 0x32, 0x70, 0x36, 0x65, 0x01, - 0x0d, 0x2c, 0xd9, 0x9f, 0xeb, 0x1e, 0xe3, 0xc3, 0x0a, 0xad, 0x53, 0xb1, - 0xca, 0x53, 0xc0, 0xc3, 0x1c, 0xba, 0x0a, 0x70, 0x1d, 0x0c, 0xe9, 0x18, - 0xfa, 0xb7, 0x98, 0xaf, 0x84, 0x07, 0xed, 0x6e, 0x5c, 0x79, 0x98, 0x50, - 0xf9, 0x01, 0x74, 0xad, 0x78, 0x3f, 0x9b, 0xc7, 0x06, 0xfb, 0x3f, 0x00, - 0x6d, 0xfd, 0x3b, 0xc2, 0x76, 0x78, 0xeb, 0x51, 0x7d, 0xd8, 0xde, 0x9e, - 0xfe, 0x79, 0xd2, 0xa5, 0x2a, 0x02, 0x96, 0x6d, 0x29, 0x5c, 0x2e, 0x2a, - 0x81, 0x1b, 0x11, 0x9b, 0x53, 0x62, 0xa8, 0x9b, 0xb9, 0x47, 0x28, 0x25, - 0xc2, 0xa1, 0x7c, 0x02, 0x64, 0xa7, 0x22, 0xad, 0x65, 0x00, 0x34, 0x4c, - 0xc7, 0x9e, 0x07, 0xd6, 0xba, 0x03, 0x7c, 0x95, 0x4b, 0xeb, 0x7e, 0xef, - 0x7a, 0xae, 0xdb, 0x94, 0x35, 0x5e, 0xa2, 0x03, 0x01, 0x9d, 0xda, 0xdb, - 0x0f, 0x58, 0x3c, 0x79, 0x8a, 0x89, 0x0b, 0xa6, 0x3b, 0xcd, 0xf9, 0x32, - 0x5b, 0x16, 0x11, 0xdc, 0x1e, 0xcd, 0xa1, 0xa6, 0x04, 0xf8, 0x07, 0x88, - 0x17, 0xf4, 0xb1, 0x7e, 0x7f, 0xc3, 0x1d, 0x72, 0x3d, 0x39, 0xca, 0x24, - 0x74, 0x18, 0xc5, 0x07, 0xca, 0x98, 0xa6, 0xe2, 0x91, 0x81, 0x75, 0x9b, - 0x61, 0xf2, 0x8f, 0xc1, 0xe0, 0x02, 0xa6, 0x35, 0xe9, 0xf3, 0xbc, 0xc1, - 0x31, 0x57, 0x9f, 0xea, 0x92, 0x13, 0x9b, 0x5d, 0x24, 0x95, 0xb3, 0x0f, - 0xeb, 0x0c, 0xce, 0xeb, 0x62, 0xfb, 0xea, 0x08, 0x23, 0x3a, 0x7f, 0x59, - 0x73, 0xa4, 0xa0, 0x43, 0xe5, 0xf0, 0x1e, 0xb9, 0x42, 0x34, 0x19, 0xcb, - 0xc3, 0xe9, 0xe0, 0xaa, 0xc4, 0x58, 0x73, 0x23, 0xe0, 0x32, 0xf1, 0x96, - 0xfd, 0x57, 0x83, 0xc5, 0xd4, 0x90, 0x5a, 0x04, 0x2e, 0x4e, 0xad, 0x67, - 0xd7, 0xe7, 0x17, 0x96, 0xa8, 0x8b, 0x48, 0x27, 0x4c, 0xc1, 0x9b, 0x14, - 0x39, 0xbe, 0xc1, 0xc0, 0x84, 0xc8, 0x2e, 0xb9, 0x66, 0x76, 0xeb, 0xb7, - 0x0c, 0xd5, 0x3d, 0x53, 0x8d, 0xd8, 0xf2, 0x83, 0x9f, 0x41, 0x32, 0x0d, - 0xa3, 0xab, 0x7f, 0xf5, 0x0c, 0xdd, 0xa8, 0x39, 0x1d, 0x86, 0x17, 0x2c, - 0x7e, 0x55, 0x68, 0x7b, 0x7a, 0x0f, 0x6e, 0xc6, 0x8b, 0xf6, 0xb1, 0x5a, - 0x3a, 0xdd, 0x69, 0xc8, 0xb3, 0x8b, 0x61, 0x4e, 0x05, 0x2e, 0x9e, 0x33, - 0x9d, 0x67, 0x4b, 0xd2, 0x78, 0x97, 0x06, 0x52, 0x0d, 0x28, 0xa7, 0xac, - 0x6b, 0x3c, 0xd3, 0xad, 0xca, 0x57, 0x4e, 0x2a, 0x07, 0x5f, 0xf0, 0x6f, - 0xd5, 0x5e, 0x1a, 0xae, 0x63, 0x30, 0xd9, 0x1a, 0x02, 0x22, 0x01, 0xe5, - 0xe9, 0x32, 0x41, 0x8c, 0xbe, 0x49, 0xe2, 0x05, 0xff, 0x74, 0x1d, 0x30, - 0x81, 0x14, 0xd6, 0xeb, 0xef, 0x3a, 0x4c, 0x90, 0x0c, 0xd9, 0xf5, 0x8d, - 0xef, 0x16, 0xe3, 0x97, 0xe2, 0x4b, 0xb3, 0x10, 0x5f, 0x64, 0x48, 0x51, - 0x78, 0x03, 0x44, 0x2c, 0x7c, 0x70, 0xde, 0xd2, 0xa5, 0x1d, 0x55, 0x9d, - 0xc7, 0xe6, 0xce, 0x7e, 0xb5, 0x27, 0x64, 0xfb, 0xfc, 0x48, 0xf1, 0x4e, - 0x5b, 0x3e, 0xda, 0xcc, 0xa5, 0xc8, 0xa1, 0x45, 0x93, 0x54, 0x9f, 0x11, - 0xc9, 0xd8, 0xdb, 0x65, 0xc7, 0x75, 0xe9, 0xee, 0xdf, 0x8c, 0xf3, 0x1d, - 0xa3, 0x17, 0x9c, 0x93, 0xed, 0x09, 0x4c, 0x2d, 0x59, 0xf5, 0x14, 0x22, - 0x05, 0x30, 0xa9, 0xfa, 0x12, 0x8a, 0x78, 0xa7, 0x49, 0x02, 0x10, 0xe2, - 0x9f, 0x94, 0x8c, 0x10, 0x8e, 0x99, 0x56, 0x35, 0xab, 0x39, 0x13, 0x5d, - 0xfd, 0x78, 0xb4, 0x07, 0x5b, 0x2c, 0x79, 0x6f, 0xcf, 0x3d, 0x70, 0x64, - 0xf8, 0xb7, 0xf5, 0x77, 0x58, 0xac, 0xc9, 0xfe, 0xbd, 0xb6, 0xa8, 0xfb, - 0x3d, 0xdc, 0x93, 0x25, 0xcd, 0xc2, 0xfb, 0xdf, 0xfb, 0xcf, 0x52, 0x55, - 0xad, 0x6a, 0x6e, 0x1a, 0x30, 0x90, 0xc4, 0x1d, 0xd6, 0x81, 0x73, 0xe2, - 0x96, 0x16, 0x64, 0xf4, 0x38, 0xd5, 0xd3, 0x76, 0xf7, 0x26, 0xc4, 0xee, - 0xab, 0x8d, 0x94, 0x14, 0xb2, 0xd5, 0x76, 0x8f, 0x47, 0x47, 0xb9, 0xad, - 0x9b, 0x4a, 0xa8, 0x6e, 0xb2, 0xf0, 0xb5, 0xe6, 0xeb, 0xf8, 0x9d, 0x67, - 0x28, 0x68, 0xc2, 0x50, 0xc1, 0xc9, 0xad, 0xd2, 0xf7, 0xf0, 0x95, 0x19, - 0x24, 0x8b, 0x04, 0xb2, 0xe8, 0x76, 0x04, 0x83, 0xef, 0x71, 0x39, 0x1d, - 0x23, 0x6b, 0x86, 0x25, 0xeb, 0x34, 0x0a, 0xd5, 0x50, 0x71, 0xf6, 0xd0, - 0x38, 0xc3, 0xc2, 0xad, 0x6d, 0x64, 0x30, 0xe0, 0x94, 0x56, 0xab, 0x72, - 0xc6, 0x87, 0x55, 0x76, 0xb0, 0x45, 0x4f, 0xaa, 0xcb, 0x91, 0x07, 0x19, - 0x58, 0xb9, 0x37, 0x48, 0xf9, 0x85, 0x83, 0x5a, 0x54, 0x11, 0xf7, 0x40, - 0x3b, 0x5a, 0xa0, 0xfc, 0x2c, 0xad, 0x86, 0xd9, 0xdd, 0xfb, 0x99, 0xff, - 0xf5, 0x46, 0xb2, 0xfc, 0xb3, 0xbb, 0xb6, 0x8e, 0x68, 0x42, 0x32, 0x58, - 0x87, 0x1a, 0x93, 0x2e, 0x08, 0x98, 0xe6, 0x49, 0x35, 0xe2, 0x51, 0xcb, - 0xfb, 0xb6, 0xef, 0x1e, 0x01, 0xd3, 0x5d, 0x7e, 0xf8, 0x1f, 0x2d, 0x02, - 0x28, 0x5c, 0xda, 0x45, 0x95, 0x3f, 0xea, 0x23, 0x9e, 0xe5, 0x83, 0x0f, - 0xea, 0x78, 0xfc, 0x02, 0xeb, 0x7f, 0xa7, 0x05, 0xf4, 0x0b, 0x46, 0x70, - 0x1c, 0xc3, 0xb7, 0x5b, 0x48, 0x0b, 0x6a, 0x00, 0x6f, 0xa2, 0xb1, 0xa2, - 0xb5, 0x1b, 0x82, 0x64, 0x9f, 0x94, 0x26, 0x18, 0x50, 0x24, 0x6c, 0x31, - 0x69, 0x20, 0x1a, 0xac, 0xa9, 0xfd, 0xf6, 0xf2, 0xbe, 0xd6, 0xa2, 0xf9, - 0xf4, 0x17, 0x83, 0xd3, 0xa5, 0x1c, 0x6a, 0xd9, 0x81, 0x4a, 0x76, 0xdf, - 0x38, 0xb1, 0x6b, 0xc6, 0x0a, 0x6c, 0xa2, 0x6a, 0x2b, 0x6e, 0xb5, 0x69, - 0xa9, 0x53, 0x7f, 0xe0, 0x52, 0xa7, 0xeb, 0xa8, 0x8d, 0x42, 0x23, 0x1e, - 0x4b, 0x3e, 0xbf, 0x90, 0xb7, 0x46, 0x38, 0x21, 0xb6, 0x9e, 0xa2, 0xaa, - 0x84, 0x7c, 0x73, 0x5b, 0x8f, 0x58, 0x5d, 0x00, 0xf6, 0xfd, 0xbe, 0x19, - 0x5b, 0xa3, 0x4d, 0x73, 0x0c, 0x6d, 0x08, 0x81, 0x70, 0x66, 0x15, 0x42, - 0x18, 0xba, 0xa2, 0xc4, 0x27, 0x71, 0x3e, 0xea, 0x18, 0x64, 0x32, 0x36, - 0x89, 0xa3, 0xaf, 0xe6, 0x80, 0xe5, 0xaf, 0x0e, 0x53, 0x0e, 0x1c, 0x00, - 0xe8, 0x1d, 0x36, 0xb0, 0x55, 0x98, 0xe6, 0x8c, 0x4f, 0x7d, 0xc7, 0x18, - 0x75, 0x53, 0x6d, 0xd6, 0xfb, 0x77, 0xe8, 0x34, 0x41, 0x7c, 0xfe, 0x4e, - 0x13, 0x9e, 0xec, 0x4f, 0x90, 0x42, 0xc5, 0x8e, 0xc2, 0xbc, 0x27, 0xb9, - 0x99, 0x54, 0x4e, 0xef, 0x56, 0xe0, 0x88, 0xc0, 0x8a, 0x25, 0x7e, 0x43, - 0xb3, 0x21, 0x42, 0xe3, 0xc1, 0x47, 0x48, 0xbc, 0x6f, 0x33, 0xe8, 0x9f, - 0xca, 0xe7, 0xef, 0x45, 0xd2, 0x6f, 0x0e, 0xe2, 0x62, 0xc0, 0x22, 0x56, - 0xba, 0x8a, 0x85, 0x35, 0xd1, 0xf7, 0xca, 0x81, 0xfb, 0x35, 0x78, 0xc7, - 0x23, 0xe9, 0x69, 0xea, 0x29, 0x0e, 0xae, 0x42, 0x8c, 0xd5, 0x4d, 0xc2, - 0x1f, 0x53, 0xdb, 0x02, 0xf7, 0xec, 0x5f, 0x9d, 0xb6, 0x87, 0x45, 0x59, - 0x54, 0xad, 0x9b, 0x02, 0x1a, 0x95, 0xc3, 0x84, 0x69, 0x9d, 0x96, 0x60, - 0xc0, 0x87, 0xda, 0x57, 0x93, 0x71, 0x84, 0x79, 0xf1, 0x84, 0xd6, 0x3e, - 0xa6, 0x36, 0x53, 0xd1, 0x29, 0xa0, 0xce, 0x0c, 0x13, 0x16, 0xa2, 0xcf, - 0xc4, 0x2c, 0xc7, 0x3c, 0x3e, 0xd0, 0x8d, 0x0b, 0xdf, 0xd1, 0x8a, 0x8c, - 0x0b, 0x97, 0xfa, 0xfa, 0x78, 0x61, 0x41, 0x7f, 0xcb, 0x28, 0x3c, 0xab, - 0x0d, 0x70, 0x67, 0x8f, 0x9b, 0xd1, 0x1b, 0xf2, 0xd5, 0x2d, 0xb2, 0x9d, - 0x83, 0x84, 0x8c, 0x50, 0x79, 0xf4, 0x3b, 0xc9, 0x4f, 0xc8, 0x77, 0x0c, - 0x01, 0x9a, 0x8d, 0x65, 0xc9, 0x00, 0x1d, 0x85, 0x6b, 0xf4, 0x9b, 0x11, - 0x48, 0xfb, 0x8b, 0xc4, 0x57, 0x4c, 0xdb, 0x9c, 0xeb, 0xa7, 0xaf, 0x20, - 0x07, 0xdc, 0x1d, 0x6b, 0x8e, 0xb6, 0x0a, 0xa3, 0x8a, 0x82, 0x69, 0x1a, - 0x95, 0x29, 0x2e, 0xee, 0xe4, 0x18, 0xca, 0xa3, 0xb4, 0x0c, 0x0c, 0x25, - 0xd3, 0xf7, 0x8b, 0x4e, 0x84, 0xc0, 0x4e, 0x32, 0x17, 0x6e, 0x65, 0xb5, - 0xec, 0x79, 0x95, 0x37, 0x19, 0xfe, 0x7e, 0x2d, 0xb1, 0xaf, 0xcd, 0x85, - 0xd3, 0xcc, 0xf2, 0x0c, 0x66, 0x7f, 0xf0, 0x26, 0x73, 0xeb, 0xbc, 0x52, - 0x79, 0xb5, 0x07, 0x2b, 0x28, 0x4b, 0x31, 0xf9, 0x77, 0x4f, 0x3c, 0x2c, - 0x9f, 0xe1, 0x09, 0x2d, 0xd3, 0x45, 0x6a, 0x1b, 0xda, 0xdb, 0x2b, 0x34, - 0x51, 0xb1, 0xa6, 0x06, 0xae, 0x86, 0x47, 0x2b, 0x46, 0x42, 0x67, 0x68, - 0x77, 0x89, 0x71, 0x86, 0x27, 0x06, 0x9a, 0xed, 0xd3, 0x48, 0xa2, 0xde, - 0x47, 0x2c, 0xe2, 0xeb, 0xe4, 0x2d, 0x60, 0x89, 0x00, 0x17, 0x1d, 0x27, - 0x9a, 0x5b, 0x96, 0xc5, 0xf0, 0x38, 0xbe, 0xda, 0xf8, 0x38, 0x2a, 0x3d, - 0xc3, 0x99, 0xfe, 0xa5, 0xf3, 0x1d, 0x83, 0xa9, 0x1c, 0x70, 0x94, 0x87, - 0x35, 0x21, 0x5f, 0x12, 0x5e, 0x47, 0xe8, 0x28, 0xde, 0x0b, 0x94, 0xc7, - 0xce, 0xce, 0xe4, 0x27, 0xd7, 0x59, 0x07, 0x57, 0x0f, 0xa5, 0x7a, 0x6b, - 0x82, 0xf5, 0xa2, 0x40, 0x00, 0x1f, 0x6b, 0x83, 0xd4, 0x2d, 0xdb, 0x07, - 0x86, 0x27, 0xd7, 0xfc, 0xfc, 0x97, 0x42, 0xaf, 0xac, 0xf7, 0x9b, 0x77, - 0x7e, 0xa8, 0x3b, 0x56, 0x25, 0xd1, 0x9a, 0xc2, 0x12, 0x53, 0x46, 0x51, - 0xa5, 0x72, 0x71, 0x54, 0x81, 0x96, 0xf7, 0x3d, 0x5f, 0xf2, 0x82, 0x95, - 0x79, 0x92, 0x5d, 0x0f, 0xab, 0x00, 0xc5, 0x7f, 0xaf, 0xba, 0x22, 0x7f, - 0x49, 0x34, 0xa8, 0x7d, 0x4a, 0xf6, 0xe5, 0xaf, 0x25, 0xb0, 0x4d, 0x3e, - 0x5c, 0x74, 0xb6, 0x42, 0x31, 0x59, 0xd8, 0x3a, 0xf6, 0x01, 0xd5, 0x48, - 0x1e, 0x27, 0x15, 0x14, 0x25, 0xb6, 0x88, 0x42, 0xe0, 0xc2, 0x4e, 0x01, - 0xfb, 0xe1, 0xad, 0xfd, 0xc8, 0xd6, 0x98, 0x2a, 0xf6, 0x93, 0x61, 0xeb, - 0x3f, 0x86, 0x2c, 0xa3, 0xde, 0x77, 0x06, 0xdd, 0x10, 0xbd, 0x5a, 0x05, - 0x37, 0x13, 0xf1, 0x0b, 0x3f, 0x30, 0x92, 0x4d, 0xc1, 0x8f, 0x19, 0x72, - 0xb0, 0xad, 0xdb, 0xc9, 0x70, 0x1b, 0xd5, 0x11, 0x4e, 0xe2, 0xb2, 0x9c, - 0xe2, 0x26, 0x59, 0x1f, 0xab, 0xd5, 0x7c, 0xb4, 0xf2, 0xe2, 0x3c, 0xfa, - 0xbd, 0xab, 0xf5, 0x5c, 0x02, 0xd6, 0x01, 0x5c, 0x69, 0x5e, 0x38, 0xc9, - 0x07, 0x10, 0x8d, 0x82, 0xf5, 0x07, 0x63, 0x48, 0xbd, 0x8c, 0xd0, 0x88, - 0x9c, 0x72, 0xa2, 0x32, 0x2e, 0x48, 0xa2, 0x2d, 0xb4, 0x93, 0x95, 0xee, - 0x56, 0x5c, 0x1c, 0xcd, 0x4e, 0x08, 0xf3, 0xcd, 0xe0, 0xe2, 0x9d, 0x5f, - 0x77, 0xdd, 0x51, 0xe2, 0xe4, 0x74, 0x05, 0x11, 0x1d, 0x7b, 0x0a, 0xf3, - 0xa5, 0x83, 0x5b, 0x71, 0x6f, 0xe2, 0x2a, 0xaa, 0x43, 0x23, 0x64, 0xca, - 0xb3, 0x8b, 0x74, 0xfd, 0xc1, 0xc2, 0x9b, 0x96, 0x3c, 0xef, 0x82, 0x40, - 0x6a, 0x01, 0x30, 0xde, 0x0c, 0xd3, 0x1f, 0x71, 0xec, 0x74, 0x84, 0x8c, - 0xd1, 0x04, 0x6a, 0x12, 0xa4, 0x9a, 0x79, 0xc0, 0x01, 0x63, 0x72, 0xb0, - 0x76, 0x9a, 0x4e, 0x4b, 0xde, 0xd3, 0xbc, 0x63, 0xe3, 0x59, 0xc6, 0xb8, - 0x52, 0xd6, 0xb6, 0x00, 0xe6, 0x2c, 0x7f, 0x6a, 0x18, 0xb4, 0x62, 0xec, - 0x2f, 0x7e, 0x86, 0x3f, 0xad, 0xa2, 0x8a, 0x92, 0xe7, 0x58, 0x6d, 0x4e, - 0xd4, 0x90, 0xd5, 0xef, 0x8f, 0x17, 0x0c, 0x86, 0x40, 0xfc, 0x44, 0xaa, - 0x93, 0x19, 0x73, 0xa4, 0x4f, 0x5e, 0xc7, 0xe4, 0xf0, 0x42, 0x02, 0xb8, - 0xa9, 0x63, 0xdf, 0x88, 0x9c, 0xfb, 0xd9, 0x95, 0x87, 0xb0, 0xee, 0xac, - 0x99, 0x6e, 0xb8, 0xd2, 0x51, 0x49, 0xe8, 0xe4, 0xc3, 0x20, 0xda, 0xda, - 0xa2, 0xbe, 0xc5, 0xee, 0xbf, 0xa6, 0xab, 0x29, 0x0e, 0x0d, 0xec, 0xdb, - 0x2e, 0x33, 0x3a, 0xae, 0xd8, 0x8e, 0x4d, 0x31, 0xe6, 0xe0, 0xd9, 0x8e, - 0xff, 0xe5, 0xc7, 0x3d, 0xdb, 0x6e, 0x48, 0x9f, 0x46, 0x6d, 0xa0, 0x48, - 0xce, 0x1f, 0x0c, 0x60, 0xdc, 0x5f, 0x58, 0x34, 0xaf, 0xbb, 0x7a, 0xc4, - 0x2b, 0xb9, 0x8c, 0x62, 0xf1, 0x14, 0xad, 0x5a, 0x8e, 0xe4, 0x58, 0xf6, - 0xb9, 0x79, 0x58, 0x43, 0x2c, 0x2b, 0xf1, 0x0d, 0xa2, 0x49, 0xc6, 0x85, - 0xc2, 0xc5, 0xce, 0x8c, 0xe0, 0x98, 0x4c, 0x1f, 0x37, 0x7c, 0x94, 0xea, - 0x57, 0xec, 0xe3, 0x06, 0x06, 0x45, 0x73, 0xcf, 0xb3, 0x88, 0x74, 0x1f, - 0x15, 0x39, 0x06, 0x66, 0x71, 0x5e, 0x70, 0x41, 0xc6, 0xe8, 0x52, 0x05, - 0xa5, 0xc0, 0xd7, 0x07, 0xf0, 0x44, 0xda, 0x75, 0xd9, 0x91, 0x5b, 0x64, - 0xee, 0x9d, 0xeb, 0x88, 0x1f, 0x81, 0xbe, 0xae, 0x80, 0xba, 0x9f, 0x3f, - 0xb9, 0xa8, 0x2a, 0x86, 0x7a, 0xa6, 0x38, 0x63, 0x4b, 0x29, 0x30, 0x9f, - 0x37, 0x33, 0x5b, 0xf7, 0x7a, 0x86, 0x6c, 0xf4, 0x92, 0xee, 0xd4, 0x45, - 0xac, 0xb1, 0x2f, 0x1f, 0x3a, 0xc4, 0xb8, 0x68, 0x27, 0x2c, 0x84, 0x75, - 0xde, 0x0e, 0x9c, 0x52, 0x33, 0x8a, 0x0e, 0x93, 0xa1, 0xd4, 0xfe, 0x9d, - 0x68, 0x9e, 0x60, 0xa1, 0x6b, 0xd7, 0xac, 0xa7, 0x44, 0x21, 0x16, 0x9d, - 0xb3, 0xae, 0x2a, 0xa2, 0xde, 0xe0, 0xb4, 0x08, 0xcf, 0x54, 0xbe, 0xa7, - 0xd7, 0xb8, 0x2d, 0x0e, 0x04, 0xf6, 0xd6, 0xd2, 0x32, 0xfc, 0xac, 0x06, - 0x73, 0xdb, 0xf1, 0x72, 0x4c, 0x7a, 0x12, 0x7b, 0x15, 0x58, 0xab, 0xeb, - 0x5a, 0x81, 0x2b, 0xc5, 0xd5, 0x47, 0x94, 0x44, 0xe5, 0x08, 0x3d, 0x52, - 0x60, 0x2f, 0xad, 0x18, 0x9b, 0xbb, 0x73, 0xbd, 0xbb, 0x52, 0x0a, 0xb2, - 0xf1, 0x8b, 0x7d, 0x97, 0x5e, 0x92, 0xec, 0xd7, 0x5c, 0xf5, 0xa8, 0x50, - 0x24, 0xb2, 0x49, 0xd9, 0xe0, 0x1f, 0xaa, 0x1e, 0x6c, 0x92, 0x08, 0x67, - 0x16, 0x7c, 0xf5, 0xdc, 0x2b, 0xcf, 0x20, 0xff, 0x0b, 0x8a, 0x59, 0x5a, - 0xb8, 0x3b, 0xb7, 0x2e, 0xf2, 0xdc, 0xbf, 0xf6, 0x9b, 0xcc, 0xbd, 0x52, - 0x14, 0x71, 0x82, 0xde, 0xcf, 0x8a, 0x95, 0x06, 0xbe, 0xdc, 0xaf, 0xe2, - 0xb2, 0x76, 0xb7, 0xf4, 0x8c, 0xbe, 0x89, 0xf3, 0x3c, 0x7b, 0xf7, 0x3a, - 0x1f, 0xd8, 0x5a, 0xb0, 0xa3, 0xdd, 0xcd, 0x3e, 0xb3, 0x1d, 0xca, 0x5e, - 0xfc, 0x4f, 0xbd, 0x9c, 0xc4, 0x81, 0x7f, 0x29, 0xb2, 0xe6, 0xd8, 0x84, - 0x14, 0x2f, 0x27, 0x25, 0xcd, 0x35, 0xe6, 0x39, 0x43, 0x32, 0x33, 0x11, - 0x73, 0x56, 0x80, 0x1d, 0x8e, 0x91, 0xcf, 0x2e, 0xb0, 0x75, 0xf1, 0x6c, - 0xec, 0xd3, 0xee, 0xd7, 0x69, 0x97, 0x80, 0x6d, 0xe8, 0xaa, 0xd6, 0xca, - 0x3b, 0x89, 0x7c, 0xc9, 0x37, 0xa2, 0x54, 0xfa, 0xc8, 0xe2, 0xfb, 0xbb, - 0x12, 0xe5, 0xcc, 0xec, 0xca, 0xa3, 0x83, 0x5a, 0xe5, 0xc5, 0x17, 0xc7, - 0xe3, 0xe4, 0xde, 0xdf, 0xca, 0xc4, 0x6e, 0xe7, 0xc9, 0x8e, 0x7d, 0xcb, - 0x46, 0x42, 0x97, 0x20, 0xd8, 0xbf, 0x69, 0xb9, 0xb4, 0x9d, 0xab, 0x76, - 0x0d, 0x55, 0xbd, 0x6a, 0xc1, 0xaa, 0xdf, 0x71, 0x26, 0xf2, 0x2b, 0xe1, - 0x06, 0x7f, 0xac, 0xb0, 0x18, 0xcc, 0xf8, 0x94, 0x2b, 0xe4, 0x01, 0xfa, - 0x7a, 0x7c, 0x50, 0x5c, 0x4a, 0x8c, 0xf5, 0xaa, 0xb9, 0xed, 0x31, 0xe0, - 0xe0, 0x47, 0xa7, 0x25, 0x03, 0xfd, 0x55, 0x30, 0xed, 0x8e, 0x8a, 0x50, - 0x13, 0xb3, 0x64, 0x57, 0x1c, 0x20, 0x4e, 0xa5, 0x3f, 0x99, 0xca, 0xf1, - 0xcc, 0x20, 0x26, 0x9d, 0xb0, 0xb9, 0xd9, 0x00, 0x3a, 0x7a, 0x56, 0x32, - 0xd9, 0x88, 0x88, 0xe2, 0xea, 0x5e, 0x1c, 0x8c, 0xc6, 0xaf, 0x8b, 0xcd, - 0xa1, 0xe4, 0x26, 0xdf, 0xfc, 0x6e, 0x19, 0xce, 0x45, 0xf4, 0x50, 0xfc, - 0x6c, 0xab, 0x49, 0xcd, 0xcf, 0x79, 0xd1, 0x20, 0xa7, 0x21, 0x63, 0xd6, - 0xfb, 0x5b, 0x8f, 0x62, 0x73, 0x8b, 0xfc, 0xc3, 0xa9, 0xf5, 0xd0, 0x62, - 0x6b, 0x60, 0x89, 0xb8, 0xed, 0x4d, 0x73, 0xfd, 0x4b, 0x70, 0xbb, 0xab, - 0xf2, 0x0a, 0x05, 0x0e, 0x5c, 0x8f, 0xea, 0x8f, 0xe3, 0xe7, 0x39, 0x73, - 0xcb, 0xfa, 0xa5, 0x38, 0x5b, 0x3d, 0x38, 0x14, 0xb1, 0xee, 0x3e, 0x57, - 0x45, 0x29, 0x94, 0x57, 0x16, 0xf8, 0xef, 0x23, 0x7b, 0x84, 0xc2, 0x0b, - 0x43, 0xf4, 0xbb, 0xca, 0xc4, 0x10, 0x91, 0xa0, 0x0b, 0x0c, 0xf7, 0x4b, - 0x28, 0x5a, 0x0d, 0xb9, 0xf3, 0x93, 0xb1, 0x50, 0x0e, 0x99, 0x28, 0xf6, - 0x2a, 0x32, 0xaa, 0x30, 0x32, 0xfb, 0x61, 0xc9, 0x6d, 0xc0, 0xb4, 0xce, - 0x52, 0x4d, 0xb5, 0x31, 0x2d, 0x77, 0x0f, 0xcb, 0xcf, 0x4d, 0x29, 0x51, - 0x32, 0x24, 0x2a, 0x8f, 0x24, 0x8c, 0x6f, 0xb8, 0x91, 0x56, 0x68, 0x1d, - 0x48, 0x89, 0x6b, 0x4a, 0x42, 0x46, 0x7a, 0xe2, 0xf7, 0x73, 0x84, 0x06, - 0x5c, 0xb6, 0x42, 0xa9, 0x78, 0x8e, 0xff, 0x81, 0x24, 0xed, 0x48, 0x23, - 0xc6, 0x5a, 0xb9, 0x20, 0x3e, 0x5f, 0xc2, 0xe6, 0xd0, 0xc1, 0xb6, 0x7a, - 0x3a, 0xdb, 0xc5, 0xec, 0x7b, 0x01, 0x26, 0x7a, 0xe1, 0x13, 0xf0, 0xb4, - 0xfd, 0xbe, 0xba, 0x71, 0x32, 0xf9, 0xca, 0xea, 0x83, 0xb2, 0x23, 0xe4, - 0x4e, 0xd3, 0x18, 0x52, 0xf8, 0xaf, 0xc5, 0x5c, 0x02, 0x1b, 0x47, 0xb2, - 0x33, 0x9a, 0x15, 0xb0, 0x44, 0x4e, 0x4d, 0x37, 0x9f, 0xe3, 0xaa, 0x22, - 0x3e, 0x9a, 0x76, 0x3a, 0x97, 0x12, 0xa2, 0x0f, 0x17, 0xd3, 0x67, 0x50, - 0x5e, 0xb8, 0x90, 0xf2, 0x35, 0x05, 0xc7, 0x3f, 0xf6, 0x5c, 0x24, 0xd9, - 0x73, 0xe4, 0xf4, 0xc2, 0xbe, 0xbb, 0x71, 0xd1, 0xe9, 0xf9, 0xb6, 0xc0, - 0xf3, 0x1e, 0x4f, 0xdf, 0x93, 0x63, 0x71, 0x6b, 0xba, 0xf2, 0x12, 0x86, - 0x4d, 0x84, 0xb3, 0x8f, 0xd4, 0x19, 0x9d, 0x7b, 0xa0, 0x0d, 0x6b, 0xb5, - 0x75, 0x7d, 0x3d, 0x9b, 0xf7, 0xf9, 0x3b, 0xb3, 0x13, 0x95, 0xec, 0x12, - 0x1d, 0xa4, 0x5e, 0x22, 0xb7, 0x18, 0x93, 0x34, 0x76, 0x92, 0xeb, 0xfc, - 0x23, 0x9f, 0xcf, 0xe1, 0x60, 0xef, 0x4e, 0x89, 0x1c, 0x41, 0xbe, 0x08, - 0xd5, 0x55, 0x75, 0x5e, 0x99, 0x14, 0x8a, 0x6e, 0x4f, 0xb8, 0xdd, 0xa0, - 0x84, 0x5f, 0xf3, 0x31, 0xfd, 0xca, 0x3c, 0x24, 0x40, 0x1c, 0xfc, 0xec, - 0x55, 0xc4, 0x66, 0x27, 0x15, 0x7e, 0x7f, 0x1f, 0x42, 0xfb, 0x2c, 0xf3, - 0xf0, 0xd6, 0xd0, 0x9f, 0x7e, 0x33, 0x44, 0x17, 0xad, 0x1a, 0x24, 0x83, - 0x5a, 0x94, 0xef, 0x83, 0xc1, 0xd9, 0x20, 0x91, 0x73, 0x31, 0x14, 0x6b, - 0xa3, 0x0b, 0xb2, 0xa2, 0x89, 0xc1, 0xa2, 0x99, 0xff, 0x3f, 0xd1, 0x13, - 0xeb, 0xf4, 0x5b, 0xd3, 0x13, 0x7d, 0x9f, 0x7d, 0xa0, 0xa5, 0x2f, 0xb2, - 0x85, 0xe9, 0x08, 0x9e, 0x47, 0xe0, 0xbd, 0xa0, 0xd3, 0xbe, 0xee, 0x8d, - 0x85, 0x2e, 0xeb, 0xd4, 0x58, 0x34, 0x31, 0x07, 0x95, 0xb6, 0x1c, 0x81, - 0x20, 0x26, 0xef, 0xd9, 0xaf, 0x75, 0x24, 0xd4, 0x3b, 0xf6, 0xb1, 0x47, - 0x92, 0x68, 0x7a, 0x8a, 0xe9, 0x1a, 0x4b, 0xc9, 0x36, 0xc9, 0xcc, 0x04, - 0xe0, 0x1a, 0x6b, 0xe4, 0x09, 0x71, 0x1d, 0xfb, 0x29, 0xe5, 0xab, 0x86, - 0xeb, 0x36, 0xbb, 0x28, 0x9d, 0x2c, 0xa8, 0xfe, 0x98, 0x96, 0x04, 0xee, - 0x20, 0x6d, 0x67, 0xc2, 0xa3, 0x58, 0x2f, 0xbb, 0x9c, 0xed, 0x82, 0x56, - 0xc6, 0x06, 0xdb, 0x67, 0x50, 0x59, 0xce, 0x4d, 0xa9, 0x79, 0x69, 0x26, - 0xa8, 0xd0, 0x49, 0x53, 0x0f, 0x61, 0x5a, 0xa0, 0xd5, 0x6d, 0x14, 0x1e, - 0x7e, 0x08, 0x4a, 0xb0, 0xb9, 0x5e, 0xec, 0xf2, 0x8e, 0x12, 0x9c, 0x92, - 0xe8, 0x20, 0xda, 0x3d, 0x3b, 0x89, 0x04, 0xe1, 0x47, 0x39, 0x46, 0xdb, - 0x90, 0xda, 0x23, 0xc9, 0xa6, 0xad, 0xe9, 0xc5, 0x75, 0xa9, 0x70, 0x8d, - 0x92, 0xf8, 0xee, 0xff, 0x0c, 0x46, 0x0e, 0x31, 0xc5, 0x3e, 0x0b, 0xbb, - 0xf9, 0x85, 0x91, 0xcc, 0xcb, 0x3d, 0xc3, 0xdf, 0x76, 0x8b, 0xc2, 0xfa, - 0x8a, 0xe3, 0x98, 0x01, 0x97, 0x46, 0x6a, 0x88, 0x54, 0x55, 0xe2, 0x1f, - 0x70, 0xad, 0xd5, 0x88, 0x9c, 0xd5, 0x6a, 0xba, 0x6c, 0x3a, 0x2e, 0xcc, - 0x43, 0x55, 0xb2, 0x49, 0x36, 0xe8, 0x37, 0xf6, 0x1b, 0x27, 0xe3, 0x28, - 0x70, 0x90, 0x31, 0xdb, 0xb7, 0x4d, 0xea, 0xb3, 0x50, 0x5c, 0xb7, 0xe1, - 0x57, 0x74, 0x90, 0x5e, 0xec, 0xc6, 0x5e, 0x8c, 0x1b, 0x8c, 0xd2, 0xcd, - 0x5b, 0x7e, 0x90, 0x1a, 0xe0, 0xa8, 0x27, 0x9d, 0x49, 0x85, 0xa4, 0x34, - 0x16, 0xb8, 0x7a, 0xc3, 0xc5, 0xd4, 0x6a, 0xda, 0x8f, 0xb4, 0x81, 0x61, - 0x1a, 0x7f, 0xde, 0x46, 0x5c, 0x56, 0xd1, 0x55, 0x9e, 0x94, 0x37, 0xe0, - 0xf6, 0x55, 0x22, 0xa7, 0x4e, 0x25, 0xca, 0x8f, 0x91, 0x54, 0x49, 0x21, - 0xbe, 0x05, 0xae, 0x6d, 0x1a, 0x0f, 0x56, 0xca, 0x0e, 0x78, 0x76, 0x92, - 0xc8, 0x3b, 0x23, 0x65, 0x7f, 0x6c, 0xd9, 0xf5, 0xc6, 0x57, 0x15, 0x26, - 0xd6, 0x27, 0xea, 0x32, 0x52, 0xc9, 0x89, 0x78, 0xc7, 0xb4, 0xea, 0xe7, - 0x08, 0x2d, 0xd2, 0xcf, 0xef, 0x86, 0x38, 0x98, 0x1c, 0xc0, 0x86, 0x43, - 0xb8, 0xe1, 0x05, 0x28, 0x32, 0xc3, 0x2f, 0x91, 0x41, 0xaa, 0x5a, 0xbb, - 0x62, 0x7a, 0x1f, 0x30, 0xc0, 0xc9, 0xce, 0xa9, 0xe4, 0x4e, 0xd4, 0x1b, - 0xdf, 0xc8, 0x64, 0x61, 0x1e, 0xb1, 0xd0, 0x11, 0x71, 0xd8, 0xcc, 0xd1, - 0x9b, 0xd9, 0x23, 0xcc, 0x5e, 0x66, 0xe1, 0x2f, 0xb9, 0x8a, 0xaf, 0x5d, - 0xc4, 0xbf, 0xb4, 0xa1, 0x37, 0x30, 0xd5, 0x19, 0xa6, 0x71, 0x6d, 0xfb, - 0xa5, 0x46, 0xed, 0x65, 0x8a, 0xb3, 0xe0, 0xc4, 0x22, 0xea, 0x2d, 0x90, - 0xb4, 0x3c, 0xab, 0x46, 0x85, 0x09, 0x97, 0x02, 0xe3, 0x44, 0xff, 0xad, - 0x4d, 0x6f, 0x92, 0xd5, 0x73, 0xa7, 0xa3, 0xf5, 0x2b, 0x28, 0xf8, 0x33, - 0x8d, 0xc3, 0xb9, 0xce, 0x1b, 0x92, 0x38, 0xc4, 0x36, 0x00, 0x96, 0xd2, - 0x2e, 0x47, 0xfd, 0xcb, 0xf8, 0x0f, 0x7b, 0x2c, 0x0e, 0xcd, 0x19, 0x4c, - 0x31, 0xce, 0x28, 0x37, 0xd8, 0xac, 0xb6, 0xdf, 0xf0, 0x4c, 0x45, 0x70, - 0x21, 0x4b, 0xde, 0x82, 0x81, 0xc8, 0xd2, 0x67, 0x05, 0x67, 0x02, 0x51, - 0x1f, 0xe8, 0x51, 0x99, 0x4d, 0x05, 0x5e, 0x11, 0x19, 0x63, 0x1e, 0x50, - 0x71, 0x35, 0x74, 0xec, 0x21, 0x86, 0x8d, 0xef, 0xeb, 0xf5, 0x81, 0xa2, - 0x99, 0x05, 0xb9, 0x6e, 0x08, 0xc5, 0xcf, 0xec, 0xf7, 0x77, 0xc2, 0x4c, - 0x1b, 0x6c, 0xaf, 0x31, 0x95, 0x34, 0xc3, 0xdc, 0x1c, 0xcf, 0x9d, 0xa9, - 0x63, 0x2d, 0x97, 0xaf, 0xe5, 0xdf, 0xf7, 0xd9, 0x77, 0x83, 0x81, 0xee, - 0x8d, 0xa5, 0x98, 0x4b, 0xb0, 0xf3, 0x69, 0xca, 0xb4, 0x88, 0xfc, 0x95, - 0x6d, 0x47, 0xcd, 0x3d, 0xd7, 0xb2, 0x2b, 0x50, 0x97, 0x2e, 0x33, 0xec, - 0xab, 0xea, 0xe5, 0x79, 0xdd, 0xd3, 0x87, 0xd6, 0x41, 0x3d, 0x75, 0xc4, - 0x56, 0x96, 0xf9, 0xad, 0x5e, 0xcd, 0x96, 0xed, 0x36, 0xfd, 0xfd, 0x69, - 0x0e, 0x47, 0xee, 0x78, 0x4d, 0x55, 0x02, 0xdd, 0x50, 0x9c, 0x6d, 0x26, - 0x82, 0x58, 0x6a, 0xdf, 0x52, 0x06, 0xb1, 0x13, 0x0e, 0x89, 0x90, 0x38, - 0x7f, 0xab, 0x89, 0xcc, 0x9d, 0xa7, 0x30, 0x3a, 0x04, 0x30, 0x93, 0x03, - 0x3c, 0x50, 0x79, 0x1d, 0x33, 0xef, 0xfe, 0x50, 0x24, 0x58, 0x6b, 0x06, - 0x7b, 0x48, 0xda, 0x07, 0x5d, 0x2c, 0x30, 0x89, 0x82, 0xba, 0x3c, 0xb6, - 0x4b, 0xe3, 0xa4, 0x98, 0xa7, 0x10, 0xdb, 0x67, 0xd3, 0xf6, 0xe8, 0x7c, - 0xea, 0x74, 0x31, 0x68, 0xd6, 0x1c, 0xfc, 0xe6, 0xec, 0x39, 0x3c, 0x2b, - 0xca, 0x8a, 0x36, 0xa7, 0x14, 0xc9, 0x5e, 0xd1, 0x20, 0xb3, 0xa8, 0x10, - 0xf6, 0xb0, 0xc0, 0x78, 0x84, 0x2a, 0xec, 0xba, 0xfd, 0x33, 0x4c, 0x40, - 0x3b, 0xf5, 0x34, 0x99, 0x23, 0x71, 0x2f, 0x2a, 0xd3, 0x17, 0x66, 0x66, - 0x87, 0x73, 0x88, 0x44, 0x7e, 0x48, 0xe2, 0x89, 0xca, 0xf9, 0x6d, 0x2e, - 0xc3, 0x15, 0x40, 0xea, 0x3e, 0xa6, 0xe0, 0x56, 0xb9, 0x23, 0xab, 0x9b, - 0x28, 0xc2, 0xc2, 0xdc, 0x0c, 0x1e, 0x67, 0x50, 0x05, 0x90, 0xbb, 0xa3, - 0x2a, 0x8d, 0xeb, 0x54, 0x8f, 0xf2, 0x72, 0x35, 0x9a, 0xcd, 0xd8, 0xad, - 0xa7, 0x87, 0x81, 0x8d, 0xdb, 0x48, 0x25, 0xed, 0x9c, 0x71, 0x80, 0xe6, - 0x05, 0x6f, 0xbf, 0x75, 0xed, 0x15, 0x65, 0xb4, 0x98, 0x33, 0x46, 0xca, - 0x81, 0x5d, 0xfa, 0x65, 0xc1, 0x58, 0x3a, 0x2c, 0x48, 0xb5, 0x0d, 0x69, - 0x61, 0x01, 0x2f, 0xee, 0x06, 0x72, 0x57, 0x52, 0x3b, 0xcd, 0xdc, 0x4e, - 0xe3, 0x6d, 0x65, 0x40, 0x5d, 0x75, 0x56, 0xce, 0xec, 0x34, 0xa8, 0x92, - 0x99, 0x78, 0xb1, 0xe9, 0x77, 0x94, 0x81, 0xbf, 0x09, 0x88, 0x77, 0xd4, - 0x9c, 0xe1, 0xdb, 0x87, 0x17, 0x5b, 0x1c, 0x4b, 0x71, 0x58, 0x2a, 0x1c, - 0x2d, 0x69, 0x3b, 0x74, 0xde, 0xae, 0x0a, 0x5f, 0x6e, 0xa2, 0x3f, 0xf9, - 0x68, 0xd4, 0x7b, 0x22, 0xa9, 0x39, 0x40, 0xff, 0x02, 0xe4, 0x5c, 0xff, - 0xfc, 0x06, 0x69, 0x1a, 0xe4, 0xa4, 0xc9, 0xc7, 0x32, 0xc8, 0xfe, 0x68, - 0x02, 0x7b, 0x73, 0x03, 0x48, 0xbc, 0x4d, 0x3e, 0x88, 0xc0, 0xe8, 0x0d, - 0x67, 0xd2, 0xb5, 0xcb, 0x2a, 0x1e, 0x9d, 0x1f, 0xe8, 0x60, 0x93, 0x93, - 0xb4, 0x76, 0xb6, 0x41, 0x28, 0x8c, 0xf8, 0x99, 0x43, 0x79, 0x02, 0x54, - 0x0a, 0xc1, 0xe2, 0xad, 0xe5, 0x8e, 0x1b, 0xe6, 0xfd, 0x4e, 0xad, 0x17, - 0x7c, 0x8e, 0x12, 0x3b, 0x63, 0x02, 0xb6, 0xa3, 0x6d, 0x52, 0x20, 0x28, - 0x84, 0x07, 0xe1, 0xa6, 0x0e, 0x60, 0xed, 0x0f, 0xd1, 0x60, 0xe1, 0x30, - 0x72, 0xfb, 0x24, 0xb4, 0xcf, 0x58, 0x46, 0xd3, 0x4f, 0x09, 0x7c, 0x35, - 0x10, 0xd6, 0x8c, 0x51, 0x54, 0x1f, 0x37, 0x01, 0x34, 0xf7, 0x6a, 0x02, - 0x9b, 0x39, 0x7b, 0x49, 0x35, 0x9b, 0x72, 0x35, 0x34, 0xd0, 0x4b, 0x83, - 0x7f, 0x0d, 0x99, 0x38, 0xce, 0x20, 0x3c, 0xcb, 0x07, 0x74, 0x79, 0x6e, - 0x58, 0xe0, 0x69, 0x75, 0xee, 0x29, 0x7f, 0x8d, 0x11, 0x27, 0xc8, 0x3e, - 0x4f, 0xb4, 0xac, 0x16, 0x05, 0x4b, 0x47, 0xd3, 0x7d, 0x9c, 0xa4, 0x73, - 0x45, 0xa3, 0x88, 0xee, 0x4a, 0x93, 0xd6, 0xc8, 0x9f, 0x93, 0x2f, 0x2f, - 0xcd, 0xd6, 0xb4, 0x34, 0xb8, 0x3b, 0x21, 0xfb, 0x54, 0x0f, 0x57, 0x7e, - 0x55, 0xef, 0x25, 0x18, 0x9a, 0x12, 0xbb, 0xac, 0x9b, 0x31, 0xb0, 0xbc, - 0x70, 0x1c, 0xed, 0x31, 0xf3, 0x18, 0x4e, 0xb6, 0x3a, 0x9f, 0xdf, 0x1a, - 0x67, 0xbd, 0xd7, 0x21, 0x08, 0xb1, 0x2e, 0xfa, 0x65, 0xd2, 0x8b, 0x93, - 0x34, 0x8e, 0xe1, 0xe8, 0x94, 0x70, 0x31, 0x67, 0xe4, 0x29, 0xf6, 0x04, - 0x95, 0x03, 0x64, 0x49, 0x77, 0x09, 0x0e, 0x20, 0x99, 0x89, 0x39, 0x40, - 0x4c, 0xc0, 0x0f, 0x8e, 0xff, 0x10, 0x09, 0x5e, 0x9e, 0x84, 0x7c, 0x68, - 0x58, 0xf5, 0x93, 0xa1, 0x47, 0x4a, 0x36, 0x33, 0xc1, 0x1a, 0xc8, 0x93, - 0x92, 0x8b, 0x49, 0xa5, 0xe0, 0x02, 0x83, 0xce, 0x58, 0x5d, 0x16, 0xe9, - 0x1f, 0x36, 0x6f, 0xf7, 0xc8, 0x0c, 0x0d, 0x79, 0x06, 0xd6, 0x9b, 0xb6, - 0x6f, 0x39, 0x24, 0x6d, 0x7c, 0xb5, 0x20, 0xdc, 0x02, 0xb3, 0x1d, 0xe6, - 0x1b, 0x43, 0xe1, 0x94, 0x34, 0x15, 0xa0, 0x1c, 0xf9, 0x80, 0xdd, 0xed, - 0x28, 0x9c, 0x2a, 0xac, 0xee, 0x0f, 0x04, 0x7e, 0x4f, 0xec, 0x27, 0xb9, - 0x42, 0xc4, 0x57, 0xf7, 0x2a, 0x80, 0x61, 0x81, 0x1d, 0x8a, 0xac, 0x8e, - 0xc9, 0xc3, 0xcf, 0xda, 0xa0, 0x52, 0x9f, 0xdf, 0x62, 0x84, 0x69, 0xd7, - 0x56, 0xf1, 0x02, 0xad, 0xed, 0xdb, 0xa7, 0x7a, 0x63, 0x50, 0xca, 0x72, - 0x25, 0x5d, 0x25, 0x7d, 0x00, 0x9f, 0xfc, 0x88, 0x15, 0x0c, 0x69, 0x3e, - 0x2a, 0x32, 0x3c, 0x09, 0xfc, 0x15, 0x13, 0xa1, 0xdd, 0x1c, 0xae, 0x31, - 0x40, 0xe8, 0x2a, 0x61, 0x7f, 0x77, 0xca, 0xb9, 0xba, 0x1a, 0xdc, 0xf2, - 0xf5, 0xfc, 0x64, 0x5f, 0x9e, 0xf5, 0x61, 0x7c, 0xfb, 0x02, 0xcb, 0x76, - 0xe4, 0x27, 0x9d, 0x39, 0x73, 0x03, 0x29, 0xf4, 0xdf, 0xf5, 0x8e, 0xe7, - 0x60, 0x3d, 0x94, 0x31, 0x4b, 0x99, 0x23, 0x35, 0xf7, 0x42, 0x99, 0xb0, - 0xc1, 0xbd, 0x9e, 0x78, 0xe4, 0xee, 0x5c, 0xe0, 0xc1, 0xbb, 0xec, 0xeb, - 0x29, 0x4a, 0xd0, 0x0f, 0x21, 0xcd, 0x57, 0x3c, 0x9c, 0x98, 0x99, 0x78, - 0x34, 0x55, 0x64, 0x67, 0x93, 0x0d, 0xe7, 0x85, 0x21, 0x2b, 0x51, 0x30, - 0xbf, 0xe8, 0xd0, 0x15, 0xa6, 0x22, 0x79, 0x10, 0x38, 0x84, 0x5e, 0x49, - 0x30, 0x03, 0x37, 0x29, 0x1f, 0x98, 0x39, 0xf2, 0x25, 0x42, 0x39, 0xd3, - 0xa5, 0x65, 0x45, 0x72, 0xab, 0x6a, 0x2c, 0x2d, 0x5c, 0x56, 0x12, 0x17, - 0xa2, 0x21, 0xf1, 0x35, 0x9b, 0x1c, 0xcb, 0x4a, 0xf0, 0xda, 0xa1, 0x62, - 0x65, 0x72, 0x92, 0xe0, 0x7c, 0x58, 0xa0, 0x62, 0x47, 0x2f, 0xab, 0x62, - 0x8d, 0xbc, 0x82, 0xb3, 0xeb, 0xc9, 0x01, 0x56, 0xb2, 0x9c, 0x6b, 0xd4, - 0x90, 0x7e, 0x20, 0xb4, 0x22, 0x37, 0xc2, 0x35, 0x9e, 0x73, 0x7d, 0xb2, - 0x58, 0x92, 0x6c, 0x50, 0x41, 0x93, 0xac, 0x11, 0x77, 0x39, 0x6f, 0x29, - 0xf5, 0xd2, 0x9e, 0xea, 0x8e, 0xd6, 0x00, 0xa4, 0x07, 0xd5, 0xad, 0x3a, - 0xf2, 0x25, 0x77, 0x62, 0x76, 0x51, 0x10, 0xe7, 0x46, 0x12, 0x27, 0x41, - 0x4b, 0x26, 0x30, 0x60, 0x2b, 0x9d, 0x35, 0xb7, 0x2e, 0x62, 0xc3, 0x1a, - 0x27, 0x22, 0x2c, 0xc5, 0x99, 0x76, 0x2e, 0xe0, 0x5b, 0xf3, 0x62, 0xdd, - 0xdf, 0xd4, 0x45, 0x6f, 0x54, 0xd8, 0x7d, 0xb1, 0x7a, 0x35, 0x3f, 0x0a, - 0xf5, 0xa5, 0x73, 0x60, 0x3f, 0x97, 0x57, 0x9b, 0xa6, 0xcd, 0x05, 0xd1, - 0x54, 0x34, 0x4f, 0x5e, 0xc5, 0xe2, 0x5b, 0xe8, 0x9d, 0x90, 0xd0, 0x73, - 0x90, 0x30, 0x7a, 0x39, 0xe8, 0x07, 0x94, 0xd7, 0x67, 0xb1, 0x5a, 0x38, - 0x49, 0xfe, 0xd3, 0x76, 0x7c, 0x4c, 0x0c, 0xfd, 0x11, 0xc8, 0x24, 0x55, - 0xd6, 0xcd, 0x11, 0x4b, 0x63, 0x64, 0xa3, 0x15, 0xa0, 0xe5, 0x83, 0xb3, - 0xe5, 0x2f, 0xf9, 0x45, 0x92, 0x00, 0x33, 0x77, 0x73, 0x40, 0x53, 0xd2, - 0x36, 0x48, 0xd3, 0x14, 0x1b, 0xe4, 0x4e, 0xce, 0x93, 0x8f, 0xa1, 0x61, - 0x6b, 0x78, 0xa3, 0xfb, 0xfb, 0xab, 0x63, 0x00, 0x9f, 0x26, 0x07, 0x2a, - 0xd2, 0x29, 0x98, 0x07, 0x23, 0x50, 0xa3, 0x1d, 0x5b, 0x98, 0x28, 0x16, - 0xc8, 0x74, 0x54, 0xef, 0xd3, 0xa2, 0xfa, 0x59, 0xf8, 0xdb, 0x5e, 0x75, - 0xb7, 0xf7, 0xa9, 0x91, 0x15, 0x3f, 0x18, 0x3d, 0x61, 0xaf, 0xf7, 0xe3, - 0x8d, 0x6c, 0xbb, 0xc2, 0xe9, 0x32, 0xf2, 0x07, 0x8c, 0xbc, 0xa2, 0x84, - 0x88, 0x27, 0x6a, 0xc1, 0x3f, 0xce, 0xd0, 0xc3, 0x5d, 0x76, 0x1f, 0x44, - 0x15, 0xa3, 0x15, 0xf2, 0xa2, 0x6d, 0xf9, 0x40, 0x1e, 0x2f, 0xa7, 0xb7, - 0x43, 0x6a, 0x45, 0xd4, 0xce, 0x12, 0xfd, 0x8c, 0xa5, 0xec, 0x3c, 0x4d, - 0xa9, 0x9b, 0x78, 0xc6, 0x68, 0x27, 0x82, 0x0a, 0xb8, 0x8a, 0x0e, 0x1f, - 0x38, 0xa4, 0x86, 0xd3, 0x1a, 0x69, 0x18, 0xa1, 0x5b, 0x17, 0xcc, 0xe5, - 0x38, 0x94, 0xa3, 0x4f, 0x00, 0xe3, 0x73, 0xea, 0xed, 0x7d, 0x7e, 0x74, - 0x48, 0x06, 0x17, 0xc3, 0x04, 0x3f, 0x2a, 0x77, 0x8a, 0xa2, 0xbb, 0x41, - 0xc6, 0x92, 0x7c, 0xca, 0x8c, 0x76, 0x89, 0x9b, 0x77, 0x2a, 0xa1, 0xf3, - 0xd2, 0xf9, 0x46, 0x19, 0x59, 0x4e, 0x08, 0x1d, 0x98, 0x7f, 0x38, 0x4e, - 0xe4, 0x71, 0x79, 0x5d, 0x48, 0x4d, 0xb4, 0x52, 0x20, 0x35, 0x58, 0x45, - 0x5a, 0xfd, 0x3e, 0x8f, 0x3d, 0xd3, 0x8b, 0x6a, 0xc2, 0x60, 0x3f, 0x7e, - 0xc9, 0x46, 0x3e, 0xe5, 0x11, 0x71, 0x08, 0x77, 0x5b, 0x7f, 0x6c, 0x7c, - 0x74, 0x19, 0x1e, 0xcf, 0x5a, 0x18, 0xa8, 0xa5, 0xf1, 0x5e, 0xff, 0x70, - 0xde, 0x77, 0xe8, 0x17, 0x69, 0x6b, 0xc0, 0xcf, 0xdd, 0xf4, 0x9e, 0x32, - 0xc3, 0x2e, 0x7f, 0x4c, 0x6c, 0x69, 0xfb, 0x42, 0x3c, 0x06, 0x57, 0xd9, - 0xd6, 0xc9, 0xcd, 0x24, 0x94, 0x68, 0x89, 0x59, 0xa5, 0x21, 0xf4, 0x31, - 0x1d, 0x05, 0x5c, 0xfd, 0x22, 0x9d, 0x4a, 0x66, 0x56, 0x8c, 0x1e, 0xd6, - 0x78, 0xad, 0x3e, 0x42, 0x08, 0xde, 0xd8, 0x08, 0x39, 0x4f, 0x8d, 0x04, - 0xb4, 0xdc, 0x60, 0xa4, 0xc8, 0x37, 0x34, 0xd4, 0x01, 0x03, 0x56, 0x1b, - 0x80, 0x33, 0xac, 0x02, 0xd2, 0x64, 0x70, 0x82, 0xb7, 0x3e, 0x4a, 0xbb, - 0x47, 0xfa, 0x8e, 0x32, 0x95, 0x63, 0xe5, 0x3c, 0x58, 0x73, 0x18, 0xf6, - 0x28, 0x3e, 0x25, 0x81, 0xc3, 0x18, 0x09, 0xd3, 0x6a, 0xa4, 0x62, 0xbf, - 0x11, 0xaa, 0x7d, 0x8c, 0x77, 0x75, 0x70, 0x41, 0x72, 0x11, 0x99, 0x65, - 0xea, 0x1e, 0xfc, 0x6d, 0x5f, 0x23, 0x3d, 0xad, 0xe3, 0xeb, 0x1e, 0x0f, - 0x74, 0x93, 0x94, 0xdd, 0x6f, 0xe5, 0xb6, 0xd6, 0x91, 0xf6, 0xe7, 0x05, - 0xd6, 0xb0, 0x54, 0x10, 0x42, 0x0a, 0xfe, 0x1d, 0x22, 0x5f, 0xb4, 0xaa, - 0xdc, 0x4e, 0x54, 0x91, 0xd7, 0x28, 0xbf, 0xb9, 0x61, 0xba, 0x2e, 0x87, - 0x13, 0xc6, 0x1e, 0xd4, 0x48, 0x56, 0x63, 0x71, 0x43, 0x3e, 0xa5, 0xe8, - 0xb1, 0x5f, 0x05, 0x9d, 0x2d, 0x04, 0x52, 0x12, 0xed, 0x31, 0x2c, 0xb0, - 0xb1, 0x76, 0xea, 0x35, 0xaf, 0xa0, 0xb5, 0xb5, 0x59, 0x14, 0x9b, 0x4f, - 0xf8, 0x15, 0x03, 0x87, 0xbe, 0x9f, 0x84, 0x63, 0x22, 0x75, 0xa4, 0x7c, - 0x98, 0x7b, 0xf2, 0x0c, 0x77, 0xff, 0xb1, 0x95, 0x6f, 0xcd, 0x39, 0x60, - 0x47, 0x2c, 0x3f, 0xbb, 0x13, 0x09, 0x8d, 0xe6, 0xa9, 0x08, 0xfa, 0x70, - 0x10, 0xff, 0xb5, 0xcc, 0xd9, 0x9e, 0xce, 0x0a, 0x5f, 0xa9, 0xe3, 0x44, - 0xea, 0xcd, 0xab, 0x89, 0xd0, 0x2f, 0x0b, 0xb9, 0x24, 0xda, 0x6c, 0xf6, - 0xdb, 0x7e, 0xfd, 0xfc, 0x7b, 0x70, 0xcc, 0xad, 0x4f, 0xa4, 0x0f, 0x85, - 0x64, 0x3c, 0x5b, 0xa5, 0x50, 0x78, 0xd8, 0xdc, 0x03, 0x43, 0x6e, 0x99, - 0x8a, 0xa9, 0x9b, 0x75, 0x1b, 0x48, 0x7c, 0x4c, 0xac, 0x21, 0xbc, 0x86, - 0x9b, 0xf1, 0x10, 0xdc, 0x2d, 0x66, 0x10, 0x4b, 0x70, 0x65, 0x22, 0xdd, - 0xea, 0xd0, 0xda, 0x7f, 0x4d, 0x93, 0x0c, 0xdb, 0x8d, 0xc0, 0x15, 0x60, - 0x94, 0x99, 0x1c, 0xde, 0x14, 0xa2, 0xdd, 0xf7, 0xbc, 0x99, 0x84, 0xc3, - 0x5b, 0x58, 0xcd, 0xf3, 0x56, 0x6d, 0xad, 0x16, 0xbc, 0xfc, 0xcf, 0x76, - 0x66, 0xcb, 0xf7, 0x88, 0x3e, 0x4b, 0xe7, 0x6f, 0xc6, 0xb2, 0xf8, 0x21, - 0x4f, 0x1f, 0xce, 0xe0, 0xa0, 0x01, 0xaa, 0x83, 0xbd, 0x04, 0x3d, 0x11, - 0x16, 0xf4, 0x67, 0xd5, 0x75, 0xc5, 0x23, 0x72, 0x2d, 0x26, 0xbb, 0x44, - 0x30, 0xe8, 0x45, 0x7e, 0x96, 0xef, 0xc5, 0xef, 0xc5, 0x6b, 0xda, 0xda, - 0x21, 0x36, 0xd7, 0x3d, 0xe6, 0x0b, 0xa8, 0x98, 0x56, 0xcd, 0x7e, 0xe7, - 0xe1, 0xda, 0xb5, 0x44, 0x8c, 0xae, 0x2a, 0xa4, 0x94, 0xc6, 0xc6, 0x25, - 0x9a, 0x8b, 0x43, 0xac, 0xbd, 0x6b, 0x8e, 0x84, 0x03, 0x94, 0xf7, 0xd0, - 0xdd, 0xf5, 0x6b, 0xc4, 0x94, 0xb3, 0x51, 0x44, 0x81, 0xf2, 0x7f, 0xdb, - 0xd4, 0xe7, 0xe2, 0xc6, 0x32, 0x0c, 0xdf, 0xda, 0x3d, 0x0c, 0x34, 0x4e, - 0x31, 0x56, 0xec, 0x1a, 0x51, 0x18, 0x76, 0xfa, 0xf8, 0x44, 0xe6, 0xc3, - 0xad, 0xa0, 0x35, 0x31, 0x57, 0xdf, 0xe3, 0x88, 0x4d, 0xd5, 0x76, 0x09, - 0x64, 0x12, 0x9f, 0xd9, 0x65, 0x70, 0x39, 0x64, 0x58, 0x12, 0x00, 0xb7, - 0xa8, 0x14, 0x60, 0xf1, 0x42, 0xbe, 0xd4, 0x49, 0x40, 0xd9, 0x1e, 0x36, - 0x14, 0x31, 0xd6, 0x49, 0x4d, 0x58, 0x64, 0xa6, 0xe3, 0x20, 0xbe, 0x9a, - 0xa8, 0xd5, 0x95, 0x3f, 0xb1, 0xcf, 0x27, 0xf0, 0x32, 0xc8, 0xdd, 0xbc, - 0x97, 0x40, 0x49, 0xc5, 0x78, 0x69, 0x0a, 0x48, 0x5f, 0x02, 0xbe, 0xbe, - 0xf0, 0xe5, 0xe6, 0xff, 0xc2, 0xa8, 0x2c, 0xd6, 0x56, 0x2f, 0x3c, 0x87, - 0x80, 0x72, 0xea, 0x41, 0x9e, 0x0c, 0xd8, 0xd6, 0xc4, 0xef, 0x29, 0xc6, - 0x1a, 0xde, 0x68, 0x07, 0x63, 0x57, 0x3f, 0xc5, 0x03, 0xe3, 0xc4, 0x7e, - 0x69, 0x3c, 0xf2, 0xc0, 0x81, 0x9f, 0xcc, 0xae, 0x61, 0x04, 0xd3, 0x9c, - 0x5b, 0xaa, 0x49, 0xeb, 0x18, 0xe5, 0xc6, 0xb9, 0x69, 0x1d, 0xcd, 0x21, - 0x1e, 0x96, 0x56, 0x75, 0x41, 0x0e, 0x22, 0xd6, 0xa5, 0x7e, 0xe6, 0x25, - 0xb5, 0xae, 0xf3, 0x05, 0x94, 0x13, 0xd8, 0x9e, 0x62, 0x5e, 0xb7, 0xb4, - 0xd1, 0xdb, 0x98, 0x97, 0x85, 0x79, 0x3e, 0x00, 0xaf, 0x4e, 0x99, 0x42, - 0x8f, 0x2e, 0x7d, 0xcd, 0xb7, 0xc1, 0xca, 0x67, 0x43, 0xa8, 0x89, 0xef, - 0xc7, 0xc4, 0xb6, 0x65, 0x22, 0xa5, 0x24, 0x7e, 0x36, 0x5a, 0x3e, 0x13, - 0xcc, 0xb9, 0xbb, 0x36, 0x14, 0x12, 0x4d, 0xee, 0xb2, 0x04, 0x39, 0x30, - 0x4c, 0x67, 0x2a, 0xa5, 0xdf, 0xc6, 0x2c, 0xb3, 0xe7, 0xc7, 0xdd, 0x1a, - 0x93, 0xdf, 0xaf, 0x55, 0xf4, 0x7d, 0x2a, 0x5c, 0x13, 0x92, 0x7c, 0xbe, - 0x37, 0xba, 0x44, 0x87, 0xb6, 0x38, 0xd4, 0xc4, 0x8d, 0x6e, 0xff, 0xe4, - 0xb0, 0xa0, 0xda, 0x42, 0x34, 0x5c, 0x3b, 0xaf, 0x3a, 0x2c, 0xa8, 0xbd, - 0xca, 0x7e, 0x5d, 0x3a, 0x89, 0x22, 0x56, 0x38, 0x6a, 0x16, 0xa7, 0xf4, - 0xf6, 0xf6, 0xb5, 0xc8, 0xc5, 0xbd, 0xab, 0xf4, 0xa9, 0x35, 0x75, 0xe4, - 0x79, 0xeb, 0xcc, 0x1c, 0x0e, 0xaa, 0x9b, 0x49, 0x53, 0x8d, 0x54, 0x2a, - 0xaf, 0x3a, 0x72, 0xa6, 0xe1, 0x94, 0x2f, 0x1a, 0xae, 0x7f, 0xbb, 0x8c, - 0xb9, 0x61, 0x49, 0x9b, 0xde, 0x4d, 0xcb, 0x15, 0x31, 0xf0, 0xee, 0x48, - 0x72, 0x70, 0x1e, 0x0d, 0xda, 0x71, 0x80, 0x7c, 0xc9, 0xc4, 0x9f, 0xa8, - 0x0b, 0x84, 0xfc, 0xc1, 0xc8, 0x50, 0x58, 0xc8, 0x54, 0xc9, 0x63, 0x97, - 0xa1, 0xc5, 0x02, 0xcf, 0x71, 0x51, 0x7a, 0xa4, 0x6b, 0xda, 0xdb, 0x1d, - 0x49, 0x3f, 0xc0, 0xc2, 0xb9, 0xfe, 0x1c, 0x35, 0xc1, 0x02, 0x91, 0xc8, - 0xe2, 0x63, 0xcb, 0x27, 0xfd, 0x35, 0xe3, 0x3e, 0xa0, 0xbc, 0x66, 0x0a, - 0x4b, 0x43, 0x98, 0x03, 0x6d, 0x31, 0xac, 0x79, 0x69, 0x45, 0x83, 0x6b, - 0x77, 0x07, 0x7a, 0xea, 0x54, 0xc3, 0x03, 0x0d, 0xe8, 0x21, 0x04, 0x2e, - 0xa4, 0x85, 0xc6, 0x95, 0x71, 0x46, 0xfc, 0xae, 0xf7, 0x3d, 0x91, 0x44, - 0x4a, 0xe5, 0xf0, 0xc7, 0x32, 0x2f, 0x21, 0x86, 0x24, 0xe2, 0xa0, 0xc7, - 0xd3, 0x59, 0xca, 0xb3, 0xf8, 0xad, 0x57, 0x0d, 0xf0, 0x37, 0xda, 0xe1, - 0x8f, 0x53, 0xb0, 0xfe, 0x7a, 0xd8, 0x53, 0xea, 0x87, 0xfe, 0xa2, 0x69, - 0x3c, 0x6d, 0x15, 0xae, 0x63, 0xc4, 0xe6, 0xa5, 0xe7, 0xb9, 0xe0, 0x6c, - 0x08, 0xfc, 0x6d, 0xb3, 0x70, 0x65, 0x23, 0xf6, 0x64, 0x67, 0x16, 0x2c, - 0x4d, 0xee, 0xb2, 0x2d, 0xdc, 0x59, 0xec, 0x26, 0x2c, 0xb4, 0x0f, 0x7c, - 0xab, 0xc8, 0x13, 0xc4, 0x26, 0xdf, 0xa1, 0xc0, 0xde, 0xc0, 0x42, 0x4b, - 0xab, 0x5e, 0x8b, 0xf4, 0x47, 0x00, 0x66, 0x2a, 0x43, 0xf1, 0x99, 0xbc, - 0x5e, 0x1d, 0xcb, 0xee, 0xc9, 0x22, 0x37, 0x38, 0xcc, 0x30, 0x74, 0x61, - 0x5e, 0x67, 0xe4, 0x9a, 0x19, 0x76, 0x9d, 0x41, 0x69, 0x1e, 0x7a, 0xc0, - 0x3b, 0x11, 0x19, 0x87, 0x62, 0x69, 0x06, 0x79, 0xe0, 0xf8, 0xc5, 0xf3, - 0xc8, 0x0a, 0x2f, 0x7d, 0x4d, 0x56, 0x2e, 0xd3, 0x23, 0x38, 0x48, 0x17, - 0x22, 0x8d, 0x55, 0xb5, 0xcc, 0x43, 0x9c, 0xcc, 0xaf, 0xce, 0xfd, 0xa5, - 0xa8, 0x54, 0x23, 0x3d, 0xe9, 0x87, 0x59, 0xfa, 0x5c, 0x7c, 0x99, 0x20, - 0x56, 0x60, 0xa1, 0x95, 0xdc, 0x4a, 0x9d, 0x4d, 0xc0, 0xf1, 0x92, 0xd3, - 0x14, 0xd5, 0x74, 0x75, 0x67, 0xe9, 0x84, 0xcf, 0xee, 0xd4, 0x4c, 0xe0, - 0xa4, 0xa0, 0x76, 0xbb, 0x49, 0x59, 0xf7, 0xb7, 0x26, 0x6e, 0xa0, 0xf2, - 0x04, 0x8d, 0xfe, 0x50, 0x1d, 0x78, 0x92, 0xec, 0x79, 0x5b, 0x6d, 0x81, - 0x08, 0xa6, 0x95, 0xf7, 0x45, 0xc0, 0xd9, 0xdf, 0xbe, 0xf4, 0x10, 0xb2, - 0x36, 0xe0, 0xe1, 0xde, 0x6b, 0xf2, 0xbf, 0x4d, 0xc4, 0x58, 0x90, 0x72, - 0x46, 0xe8, 0xae, 0xcc, 0xba, 0x98, 0x94, 0x28, 0x27, 0x98, 0x6c, 0x9f, - 0xa0, 0x2d, 0xe3, 0xf7, 0xef, 0x54, 0x7b, 0xd9, 0x7f, 0x90, 0xcd, 0x54, - 0xa1, 0x89, 0x66, 0xb1, 0x81, 0x7a, 0x2b, 0xde, 0x13, 0xba, 0x21, 0x2f, - 0x99, 0x68, 0x25, 0x92, 0x68, 0xf1, 0x77, 0x80, 0xce, 0xc8, 0xbf, 0xe0, - 0x56, 0xe5, 0x8a, 0xfa, 0x72, 0xd3, 0x62, 0x30, 0xcb, 0xea, 0x12, 0x5b, - 0xba, 0xbe, 0xea, 0x15, 0x43, 0xa3, 0xe7, 0x37, 0xc2, 0x7c, 0xca, 0x1e, - 0xc9, 0x71, 0xa6, 0x7b, 0xae, 0x0b, 0x15, 0x80, 0x31, 0xd7, 0xce, 0xa1, - 0xc8, 0x12, 0xe9, 0x22, 0x0e, 0xd5, 0x71, 0x2b, 0x38, 0x93, 0xf5, 0xb0, - 0x7b, 0xcf, 0x71, 0x67, 0x8e, 0xaa, 0x86, 0x71, 0xf2, 0xd4, 0x73, 0x39, - 0x32, 0x76, 0xb5, 0x81, 0x6f, 0xc7, 0x68, 0xb9, 0x99, 0x33, 0xf8, 0x7b, - 0x3e, 0xe9, 0x10, 0x11, 0xab, 0xb0, 0x18, 0x23, 0xcf, 0x09, 0x13, 0x1e, - 0xe5, 0xbb, 0xb4, 0x74, 0x2f, 0xf6, 0x30, 0x40, 0x61, 0x25, 0xe2, 0x08, - 0xa5, 0xb7, 0x77, 0x7f, 0xc1, 0x73, 0x40, 0x6e, 0x3b, 0x27, 0x95, 0x6c, - 0xe4, 0x21, 0x21, 0x82, 0x84, 0xce, 0xfe, 0xb8, 0x0a, 0x26, 0xb6, 0x18, - 0xda, 0xd4, 0xcc, 0x9b, 0xbd, 0xa1, 0x62, 0xc7, 0x08, 0x81, 0x77, 0x1f, - 0xa0, 0xde, 0x7d, 0xeb, 0x90, 0x1a, 0x2d, 0x06, 0xaa, 0x3a, 0xa2, 0xf7, - 0x43, 0x0e, 0xdb, 0x33, 0xaf, 0x4c, 0x2c, 0xc6, 0xe6, 0x70, 0x2c, 0x9e, - 0xbf, 0xfd, 0x8c, 0xca, 0x5c, 0x85, 0x3b, 0xe1, 0xc5, 0x58, 0xa8, 0xf9, - 0x01, 0x9f, 0x43, 0x93, 0xf0, 0x48, 0x4d, 0x23, 0xe2, 0x10, 0x93, 0xc8, - 0x8c, 0xf9, 0xb9, 0x02, 0xb6, 0x59, 0x4d, 0xf9, 0x98, 0x0c, 0xb8, 0x8e, - 0xc9, 0x34, 0xcd, 0x45, 0x69, 0xf6, 0xef, 0x85, 0x0b, 0xc0, 0xe0, 0xa7, - 0x79, 0x67, 0x23, 0xb0, 0x67, 0xd3, 0xa4, 0x65, 0xf1, 0x8e, 0xb4, 0x01, - 0x79, 0x90, 0x05, 0x0c, 0xb2, 0x03, 0x05, 0xb2, 0x93, 0xe2, 0x2d, 0x74, - 0x2c, 0x32, 0x10, 0xab, 0x84, 0xc1, 0xf9, 0x71, 0x40, 0x8f, 0x9a, 0xa6, - 0xf0, 0x29, 0x84, 0x95, 0x9c, 0xea, 0xc2, 0xc9, 0xb1, 0x18, 0x9d, 0x8f, - 0xce, 0x8f, 0xc2, 0x67, 0x4d, 0x99, 0xf6, 0x53, 0xc3, 0xe1, 0x2f, 0x55, - 0x1c, 0x18, 0xee, 0x59, 0xd0, 0x7b, 0xe5, 0x2a, 0x33, 0x3b, 0x9b, 0xf7, - 0xef, 0x69, 0x98, 0xde, 0x18, 0x4b, 0xe9, 0xe9, 0xa9, 0x95, 0xcc, 0xbc, - 0x30, 0x4d, 0xb2, 0xa7, 0xfa, 0x9c, 0x80, 0xce, 0xfd, 0x6f, 0x83, 0x41, - 0xa2, 0x1f, 0x4f, 0x80, 0xd4, 0xbf, 0x60, 0xa4, 0x74, 0xea, 0x1f, 0x39, - 0x4e, 0xf1, 0x40, 0x9e, 0x6b, 0xea, 0xfd, 0xe5, 0x60, 0x99, 0x9c, 0x97, - 0xd1, 0xcc, 0x45, 0x89, 0x9e, 0x23, 0x3a, 0x46, 0xd7, 0x85, 0xf7, 0x11, - 0xed, 0x44, 0x79, 0xd6, 0xfb, 0xd7, 0xde, 0x71, 0x06, 0xbb, 0x2b, 0x05, - 0x29, 0xb1, 0x8f, 0x54, 0x08, 0x7a, 0x64, 0x8d, 0x9c, 0x95, 0xc6, 0x62, - 0xcd, 0x11, 0xff, 0xec, 0xb0, 0x5d, 0xb6, 0x54, 0xb0, 0xa6, 0x8f, 0x81, - 0x59, 0xb9, 0x3a, 0x6c, 0x57, 0x28, 0x59, 0xa1, 0x5a, 0x76, 0x1c, 0x27, - 0x36, 0xa6, 0x24, 0xbd, 0xa9, 0xfa, 0xac, 0x15, 0x43, 0xab, 0xf1, 0xe5, - 0xe1, 0x1d, 0x94, 0xe1, 0x13, 0x60, 0x15, 0x20, 0x82, 0x3d, 0x47, 0x73, - 0x70, 0xb9, 0xb8, 0x0b, 0x08, 0xdd, 0x2f, 0x41, 0x68, 0x06, 0x94, 0x1a, - 0xc2, 0x5f, 0x2e, 0xd2, 0x3c, 0x76, 0x24, 0x23, 0x39, 0x81, 0x1d, 0x1a, - 0xe3, 0xd9, 0x81, 0x05, 0xf0, 0x84, 0x13, 0x61, 0x96, 0x6b, 0x3d, 0x20, - 0x94, 0x5f, 0x01, 0xdb, 0x94, 0x04, 0x0c, 0x27, 0x70, 0x3e, 0x85, 0xa9, - 0x3a, 0xc6, 0x35, 0x74, 0x3f, 0x5b, 0x0e, 0xdb, 0xad, 0xdd, 0x90, 0x40, - 0x20, 0xea, 0x92, 0x53, 0x34, 0xa3, 0x22, 0xa3, 0x48, 0xc7, 0x5e, 0xd3, - 0x7a, 0x82, 0xc6, 0x61, 0xf5, 0x1b, 0x66, 0x63, 0xd1, 0x79, 0x35, 0x2f, - 0x49, 0x07, 0x74, 0x03, 0xef, 0x3e, 0xc7, 0x02, 0x04, 0x62, 0xa2, 0xd3, - 0x38, 0x8b, 0x9c, 0x75, 0x36, 0x08, 0x98, 0xd7, 0xba, 0xfd, 0x30, 0x7c, - 0x73, 0x60, 0x11, 0xfc, 0x2d, 0x61, 0xaa, 0xd9, 0x5e, 0xac, 0xb4, 0x14, - 0x4d, 0x3a, 0xed, 0x0a, 0xef, 0x92, 0xcb, 0x72, 0xf7, 0xf7, 0xe8, 0x9f, - 0xf8, 0x89, 0x0e, 0x61, 0xc8, 0xec, 0x51, 0x1e, 0x74, 0x58, 0x76, 0x93, - 0x04, 0x91, 0x52, 0x70, 0x7d, 0x27, 0xf5, 0x38, 0x44, 0x12, 0x18, 0xb1, - 0xe0, 0xa0, 0x40, 0x00, 0xbe, 0x45, 0xe5, 0xd7, 0x4c, 0xd4, 0xac, 0x09, - 0x5c, 0x8b, 0xff, 0xd5, 0x4c, 0x9c, 0x22, 0xd3, 0x11, 0xef, 0xeb, 0x25, - 0x20, 0xa7, 0xed, 0xb4, 0xc3, 0x75, 0x09, 0x6c, 0x17, 0xde, 0x9b, 0xb6, - 0xe4, 0xe9, 0x05, 0xb5, 0xd8, 0x16, 0x64, 0xb4, 0xb7, 0x9e, 0x2a, 0x7f, - 0x17, 0xd8, 0x42, 0xf7, 0xb0, 0x47, 0xa0, 0x75, 0xb1, 0x6f, 0x92, 0xce, - 0x72, 0xaf, 0x70, 0x58, 0x60, 0x54, 0xb7, 0x1e, 0xc3, 0xcd, 0x13, 0xb2, - 0xae, 0xef, 0x35, 0x52, 0x6d, 0x8a, 0x46, 0x63, 0xf1, 0xbb, 0xbe, 0xbd, - 0xe1, 0xeb, 0xba, 0xbe, 0x6e, 0x7d, 0x86, 0x75, 0xb5, 0x72, 0xc1, 0x2a, - 0x74, 0xaf, 0xf4, 0x57, 0xad, 0x8a, 0x1c, 0x6b, 0x91, 0x31, 0xdf, 0xd7, - 0x9e, 0x29, 0x13, 0x50, 0x8f, 0x69, 0xed, 0x4f, 0xd3, 0x01, 0xd0, 0x14, - 0xf0, 0x46, 0x38, 0x54, 0x2d, 0xa0, 0xa4, 0x71, 0x48, 0x34, 0x67, 0xda, - 0xc6, 0xb3, 0xbd, 0x4d, 0xd8, 0x7b, 0x69, 0x72, 0x7b, 0xaf, 0x38, 0x5a, - 0x1a, 0x8a, 0x86, 0x96, 0x7d, 0x2d, 0xba, 0x61, 0x8d, 0x3a, 0x06, 0x7c, - 0x57, 0xb3, 0xa0, 0x4f, 0x5c, 0x63, 0xd9, 0xce, 0xbb, 0x1d, 0xe2, 0xbb, - 0xe4, 0x8f, 0x12, 0xc6, 0x32, 0xcf, 0x4f, 0x2b, 0x59, 0xf7, 0x6a, 0x37, - 0x25, 0x88, 0x05, 0xd2, 0xa0, 0xb1, 0x36, 0x1c, 0x16, 0x48, 0x17, 0xf8, - 0x9e, 0x31, 0x65, 0xb6, 0x7e, 0x45, 0xf8, 0x56, 0x86, 0xf8, 0x14, 0x06, - 0xc9, 0x2c, 0x9d, 0x20, 0x9e, 0x34, 0x30, 0x56, 0xc7, 0xcf, 0x56, 0xd0, - 0xbb, 0x76, 0x6d, 0x5a, 0x9b, 0x1f, 0x2c, 0xcc, 0x75, 0x88, 0x62, 0xcc, - 0x86, 0x6d, 0x4d, 0x7e, 0xe2, 0x3c, 0x33, 0x57, 0xd8, 0x78, 0x3a, 0x6d, - 0xc5, 0xe9, 0x56, 0xbc, 0xb2, 0x88, 0xae, 0xe9, 0x97, 0x9b, 0x5b, 0xef, - 0xd5, 0x92, 0x69, 0x66, 0x23, 0xac, 0x5a, 0x23, 0xc5, 0xb4, 0x57, 0xc3, - 0x6b, 0x31, 0x1d, 0x59, 0xaa, 0x9d, 0x65, 0xe6, 0x29, 0x04, 0x42, 0x8c, - 0xb1, 0xae, 0x48, 0x24, 0xdb, 0x5b, 0xf6, 0x43, 0xb0, 0x2b, 0xdb, 0x6b, - 0x4b, 0x62, 0x2c, 0xf9, 0x1f, 0x01, 0xb4, 0x75, 0x51, 0xf5, 0x59, 0x9c, - 0xb9, 0x65, 0x94, 0xf9, 0x43, 0x4a, 0x21, 0x40, 0x18, 0x1d, 0x63, 0x12, - 0x7a, 0x56, 0xb3, 0x5c, 0x2c, 0xe4, 0x0e, 0x89, 0x1f, 0x0f, 0xa7, 0x0b, - 0x7f, 0x5c, 0x07, 0xf1, 0x63, 0xc5, 0xdc, 0x8e, 0xbd, 0xf2, 0xfa, 0xed, - 0xa5, 0xb6, 0x3e, 0xd8, 0xae, 0x45, 0x27, 0xa8, 0x74, 0x3f, 0x90, 0x97, - 0x8c, 0xb9, 0x28, 0xa5, 0xeb, 0x00, 0x55, 0x9d, 0x55, 0x99, 0x77, 0x92, - 0xfb, 0x74, 0xc8, 0xfa, 0x3b, 0xd2, 0x94, 0x50, 0xdc, 0x4c, 0x92, 0xfc, - 0x61, 0xac, 0x11, 0x98, 0x73, 0x97, 0xd0, 0x8a, 0xb1, 0x24, 0xbc, 0x64, - 0xb3, 0x6d, 0x1b, 0x88, 0x08, 0x2c, 0xf1, 0x19, 0x6d, 0x37, 0xc1, 0x54, - 0x71, 0xe8, 0xfc, 0x55, 0x07, 0xf2, 0x65, 0x8c, 0xc8, 0xca, 0x38, 0x59, - 0x6a, 0x23, 0x04, 0x21, 0x8f, 0xf7, 0x94, 0xf7, 0x7d, 0x89, 0x5a, 0x64, - 0x7c, 0x91, 0x34, 0xd6, 0x82, 0xe9, 0xfe, 0x13, 0x70, 0x45, 0x3f, 0xbe, - 0x51, 0x41, 0x88, 0x53, 0xa4, 0xdd, 0x1f, 0x48, 0xe5, 0x2e, 0xa9, 0x7a, - 0x3a, 0xa4, 0x6c, 0x4f, 0x1c, 0xb6, 0x3d, 0x6a, 0x39, 0x26, 0x4b, 0x47, - 0x75, 0xc0, 0x0c, 0x61, 0x72, 0xf3, 0x77, 0x69, 0x94, 0x57, 0x9e, 0x14, - 0xd3, 0xbc, 0x22, 0xc0, 0x7d, 0xc2, 0xf1, 0xd9, 0x79, 0x91, 0x0d, 0x70, - 0x98, 0xf1, 0x0e, 0x8a, 0x96, 0x17, 0xe8, 0x50, 0xb1, 0xdd, 0x7b, 0x1f, - 0x5f, 0x23, 0x45, 0xe3, 0x3d, 0xb7, 0x73, 0xe3, 0x3b, 0x00, 0x78, 0x72, - 0x22, 0x15, 0x0c, 0xc4, 0x47, 0x0b, 0x6f, 0xaa, 0xac, 0x9f, 0x6d, 0x88, - 0x9a, 0x7b, 0x7e, 0x70, 0x44, 0xd7, 0x6b, 0xfa, 0xb4, 0x76, 0x49, 0xc6, - 0xc3, 0x71, 0xb4, 0xe5, 0x80, 0x67, 0xcc, 0xce, 0x2f, 0xf4, 0xbc, 0xd5, - 0xc4, 0x5a, 0x15, 0x07, 0x71, 0xa1, 0x10, 0xe9, 0xd5, 0x5a, 0x63, 0xc1, - 0xd1, 0x44, 0xb4, 0x74, 0xfb, 0xeb, 0x33, 0x3c, 0x81, 0x23, 0x84, 0x39, - 0x7f, 0xf5, 0xd6, 0x54, 0x0c, 0xaf, 0xfb, 0xac, 0x19, 0xe1, 0x77, 0xd4, - 0x37, 0x58, 0x4f, 0xcd, 0xc3, 0xb7, 0x66, 0x15, 0x0d, 0x98, 0xde, 0x01, - 0xde, 0xdd, 0x28, 0x3d, 0x50, 0x11, 0xae, 0x6f, 0x6c, 0xa2, 0x91, 0xfa, - 0x9a, 0xb5, 0xdd, 0xd6, 0x8a, 0xfd, 0xa1, 0xed, 0x6c, 0x83, 0xd8, 0xd1, - 0x99, 0x1b, 0x4b, 0xdb, 0x5f, 0xee, 0x02, 0x4d, 0x9b, 0x8a, 0xb5, 0x7a, - 0xe5, 0x7e, 0xc4, 0xc1, 0x77, 0x89, 0x42, 0x33, 0x04, 0xe9, 0xbd, 0x3f, - 0x6a, 0x2a, 0x22, 0xa0, 0x52, 0xc3, 0x51, 0x0e, 0x78, 0x89, 0x43, 0x6c, - 0x07, 0xa9, 0x65, 0xc9, 0xdf, 0xb4, 0xba, 0x83, 0xb7, 0xb0, 0x34, 0x5b, - 0x4a, 0x20, 0xd1, 0x14, 0xbe, 0x8b, 0xa5, 0x12, 0x08, 0x61, 0x5f, 0xb1, - 0xa4, 0xd1, 0xa4, 0xb0, 0x98, 0x52, 0x81, 0x80, 0xb0, 0xb3, 0x6d, 0x33, - 0x4d, 0xcf, 0x0a, 0x4a, 0x53, 0x8a, 0xe2, 0xad, 0x47, 0x84, 0xd2, 0x38, - 0x4c, 0xac, 0xc9, 0x07, 0xb0, 0x28, 0x2d, 0x31, 0x00, 0xed, 0xb0, 0xf8, - 0x37, 0x32, 0xb1, 0xec, 0x66, 0x88, 0x90, 0x78, 0x35, 0x0a, 0xfe, 0xc7, - 0x3c, 0x20, 0x3a, 0x82, 0x85, 0x77, 0x91, 0xd0, 0x79, 0xc2, 0x91, 0x7b, - 0xbe, 0x82, 0x51, 0xc7, 0xd8, 0xec, 0x6e, 0x7d, 0x0e, 0x36, 0xc9, 0x05, - 0x94, 0x7d, 0x66, 0x6b, 0xf9, 0x8b, 0xbf, 0x96, 0x2e, 0x69, 0x44, 0xef, - 0x94, 0xa8, 0xde, 0x43, 0x2c, 0xa0, 0x75, 0x35, 0x3e, 0x6f, 0x6a, 0x36, - 0x68, 0x20, 0xd4, 0xaf, 0xe0, 0x98, 0x16, 0x0d, 0x64, 0xff, 0xeb, 0x3c, - 0xbe, 0x2e, 0x39, 0x3f, 0xdb, 0x7f, 0x0a, 0x00, 0x0e, 0x46, 0xb2, 0xcb, - 0x13, 0x7b, 0xfe, 0x8d, 0x3f, 0xde, 0x94, 0xc1, 0xe3, 0xfb, 0x7a, 0xcb, - 0x79, 0x68, 0x62, 0x8e, 0x9b, 0xee, 0x54, 0xef, 0x9a, 0xe6, 0x5d, 0x5a, - 0xa6, 0x23, 0xd2, 0xca, 0x2c, 0x3f, 0x41, 0x2d, 0xa1, 0x54, 0x0d, 0x2f, - 0x3c, 0xa8, 0xae, 0x78, 0x86, 0x41, 0xc4, 0x80, 0xdd, 0x4c, 0x9c, 0xfe, - 0x33, 0x07, 0x23, 0x64, 0x6e, 0xca, 0x10, 0x78, 0x8d, 0xd8, 0xd8, 0x6c, - 0xd5, 0x44, 0xb1, 0x3d, 0x1d, 0x23, 0xc5, 0x95, 0xf9, 0x93, 0x88, 0xae, - 0x46, 0x18, 0x2e, 0x48, 0x71, 0x57, 0x52, 0xbc, 0xcb, 0xdb, 0xf5, 0xa4, - 0xc0, 0x33, 0x61, 0xa1, 0x45, 0x81, 0x80, 0xbf, 0x92, 0x78, 0x2b, 0x30, - 0x46, 0xee, 0xaa, 0x6b, 0x19, 0xfa, 0x11, 0xe3, 0xa9, 0x7c, 0x08, 0x55, - 0xa4, 0x10, 0x2e, 0xbc, 0x01, 0x5f, 0xda, 0x24, 0xd5, 0x33, 0x8d, 0x6a, - 0xf2, 0x18, 0x01, 0x81, 0x47, 0x29, 0x10, 0xc5, 0x26, 0x4c, 0x05, 0xea, - 0x1d, 0xc4, 0x51, 0x36, 0x4f, 0x22, 0x61, 0x50, 0x5f, 0xd8, 0xec, 0xa4, - 0x90, 0xa4, 0x07, 0x1a, 0xa8, 0xf3, 0x7d, 0x8b, 0x5e, 0x7f, 0x9c, 0x0c, - 0xb6, 0xe2, 0x35, 0x32, 0x07, 0x1b, 0xca, 0x4e, 0x4b, 0x19, 0x55, 0x15, - 0x71, 0x48, 0xa2, 0x76, 0x61, 0xa6, 0x7b, 0xe0, 0x95, 0xf1, 0x6b, 0x71, - 0xac, 0xc9, 0x04, 0x59, 0xb1, 0x7f, 0x0b, 0xd6, 0xa7, 0xa6, 0x66, 0x53, - 0x0e, 0xcf, 0xd0, 0x97, 0x14, 0x5f, 0xf9, 0xff, 0x39, 0xff, 0x4e, 0x2e, - 0x35, 0xec, 0x57, 0x3b, 0xfb, 0x78, 0xbb, 0x2e, 0x61, 0xb8, 0xa7, 0x5e, - 0x16, 0xc2, 0x6d, 0x85, 0xa2, 0x07, 0xbc, 0x74, 0xfe, 0x25, 0x52, 0x1e, - 0x75, 0xbd, 0x48, 0xdf, 0xf2, 0xfd, 0x06, 0x97, 0xb9, 0xde, 0xbc, 0x7f, - 0x15, 0x74, 0xba, 0x21, 0x8c, 0x92, 0xbd, 0x98, 0x7f, 0x8c, 0xc5, 0x0b, - 0x42, 0xd8, 0xfc, 0xa3, 0xc9, 0xd4, 0x0c, 0x76, 0x40, 0xf8, 0xa7, 0x91, - 0x52, 0x0c, 0x71, 0xbb, 0xfb, 0xd4, 0x5d, 0x2a, 0x71, 0xb6, 0x92, 0x5d, - 0x5c, 0xd2, 0x20, 0x34, 0xeb, 0xb4, 0x10, 0xf6, 0x94, 0xd9, 0x2e, 0x7d, - 0xb7, 0x5f, 0xf4, 0x7d, 0x66, 0x2c, 0xac, 0xdf, 0xe4, 0xce, 0xb3, 0xff, - 0x02, 0x5e, 0x82, 0x86, 0xe2, 0x1f, 0x65, 0xf6, 0xfd, 0x57, 0x66, 0x14, - 0x9b, 0xee, 0xd7, 0x53, 0xfa, 0x2d, 0xd9, 0xc6, 0xb6, 0xfa, 0x79, 0x80, - 0x7e, 0xfb, 0x74, 0x67, 0xee, 0x67, 0x05, 0x10, 0x2f, 0x9f, 0x7e, 0xf7, - 0x19, 0x90, 0xef, 0xec, 0xc0, 0xfb, 0xa0, 0x40, 0x4e, 0xa1, 0x45, 0x5d, - 0x9c, 0x51, 0xff, 0x6c, 0xfe, 0xf6, 0xf3, 0x01, 0xbd, 0xbb, 0x31, 0xe6, - 0xa6, 0x1f, 0xbf, 0x40, 0x4d, 0x8c, 0x06, 0xf8, 0x24, 0x5e, 0x1c, 0xda, - 0x9d, 0xcf, 0xfe, 0xce, 0x8f, 0x00, 0x4c, 0x6f, 0x7e, 0x9a, 0xda, 0x51, - 0x33, 0x2b, 0xbf, 0x2e, 0xf4, 0x75, 0x44, 0x29, 0x08, 0xa0, 0xfd, 0x00, - 0x5f, 0x9e, 0x26, 0x83, 0xed, 0xa5, 0xe6, 0xfd, 0x26, 0x7c, 0x6d, 0x0d, - 0xf4, 0x8b, 0xf6, 0xeb, 0xaa, 0x57, 0xc5, 0x80, 0x9d, 0x14, 0x30, 0x97, - 0x99, 0x54, 0x4b, 0xfc, 0xd6, 0x5d, 0x76, 0xeb, 0x31, 0x13, 0x04, 0x71, - 0xfc, 0x0b, 0x01, 0xcf, 0x73, 0x71, 0xc6, 0xfb, 0x0a, 0x77, 0x28, 0x08, - 0x90, 0x4d, 0x49, 0xd0, 0x3b, 0xe9, 0xc5, 0x09, 0xcb, 0x2a, 0xdc, 0xff, - 0xab, 0xdd, 0x4f, 0x6b, 0x0c, 0x8f, 0xef, 0x32, 0x3b, 0xd0, 0x02, 0x2b, - 0x9a, 0x6d, 0xa9, 0xed, 0xed, 0x34, 0x7c, 0xf6, 0x78, 0xe3, 0x4e, 0x23, - 0x7f, 0x82, 0xc0, 0x36, 0xa0, 0x05, 0x30, 0xf6, 0x42, 0x5a, 0x07, 0x5c, - 0x5d, 0x27, 0xf7, 0x1d, 0x0b, 0xcb, 0x36, 0x8c, 0x46, 0xae, 0x68, 0xc9, - 0xcd, 0x70, 0xb8, 0x89, 0x13, 0x57, 0xee, 0x06, 0xc6, 0x21, 0xd3, 0x9e, - 0x80, 0x71, 0x7c, 0xa9, 0x25, 0x70, 0x7e, 0xf6, 0x75, 0x37, 0xd3, 0x99, - 0x84, 0xc5, 0xd2, 0x35, 0xdf, 0x77, 0x12, 0x20, 0xfe, 0x05, 0x65, 0xd3, - 0xae, 0xa8, 0x97, 0xd1, 0xbc, 0xd3, 0xb4, 0x6e, 0xd8, 0xf5, 0x3f, 0xbf, - 0x0b, 0x5d, 0x15, 0xfa, 0xfc, 0xa8, 0x21, 0x14, 0xd8, 0xe6, 0x66, 0xd6, - 0x76, 0xb1, 0x8a, 0x58, 0x37, 0x61, 0x85, 0x0b, 0xd2, 0xe5, 0x8c, 0x98, - 0xd2, 0xf2, 0x13, 0xcb, 0x5a, 0xff, 0x1b, 0x27, 0xbf, 0xa5, 0xbd, 0x3d, - 0xfb, 0x75, 0x4a, 0xcf, 0x38, 0x85, 0xcc, 0x35, 0xd9, 0x5c, 0x97, 0xd9, - 0xa6, 0x10, 0x76, 0xf7, 0xdb, 0x0a, 0x63, 0xb4, 0xb5, 0x35, 0xe2, 0xda, - 0x5c, 0x27, 0x50, 0x48, 0xed, 0xe6, 0xeb, 0xf6, 0xd8, 0xf5, 0xa3, 0xd4, - 0xa6, 0x73, 0x7e, 0xe3, 0xa5, 0xe8, 0xa8, 0x03, 0x6d, 0xe4, 0x1e, 0x23, - 0x27, 0x41, 0x5c, 0xd9, 0xff, 0xa9, 0xdb, 0x9f, 0x02, 0xaf, 0xea, 0x6b, - 0x76, 0x4f, 0x62, 0xe9, 0x62, 0xd2, 0x11, 0x40, 0x94, 0x89, 0x1b, 0x24, - 0x36, 0x4e, 0x60, 0x83, 0xd6, 0x4c, 0xc9, 0xb1, 0xe0, 0x87, 0xe0, 0x0c, - 0x36, 0xc2, 0xfe, 0x0c, 0x19, 0x30, 0x17, 0x33, 0x50, 0xb0, 0x0d, 0xa4, - 0x43, 0xb2, 0x3e, 0xed, 0x86, 0xd2, 0x67, 0xa1, 0xa1, 0x12, 0xb8, 0xd8, - 0xe3, 0xc1, 0xbe, 0x65, 0x1e, 0xa7, 0xc0, 0xed, 0xf8, 0x89, 0xdb, 0xfc, - 0x1a, 0xe9, 0x5c, 0x15, 0x8f, 0x11, 0xc5, 0x0c, 0xa8, 0x46, 0x65, 0x4c, - 0x9a, 0x68, 0xeb, 0x73, 0xba, 0x8d, 0x41, 0xa2, 0xb7, 0xd5, 0x39, 0xdc, - 0x73, 0x69, 0xeb, 0x30, 0xf3, 0xce, 0x1b, 0xf7, 0xe2, 0x67, 0xde, 0x37, - 0x1e, 0xda, 0xce, 0x4d, 0x9d, 0x44, 0x3d, 0xe0, 0x35, 0xaa, 0xcb, 0xe9, - 0x33, 0x41, 0x7a, 0xb0, 0xb7, 0xa2, 0x01, 0x0a, 0x30, 0x01, 0x0c, 0xc5, - 0x13, 0x9f, 0xa7, 0x18, 0x58, 0xe2, 0x0d, 0x4e, 0xd1, 0xe3, 0x84, 0x18, - 0x55, 0x18, 0xa0, 0x49, 0x3d, 0x63, 0x63, 0x85, 0xca, 0xd1, 0x91, 0x9a, - 0x71, 0x89, 0x91, 0xec, 0x99, 0x7e, 0xcf, 0x8c, 0x91, 0x61, 0x87, 0x23, - 0xe3, 0x1d, 0x44, 0xfb, 0xcb, 0x79, 0x85, 0x8b, 0x2f, 0x74, 0x3d, 0x45, - 0x38, 0x05, 0x76, 0xfc, 0x04, 0x70, 0x9d, 0xd2, 0x9b, 0x66, 0x66, 0x9b, - 0x31, 0xd1, 0xeb, 0xac, 0x53, 0x4e, 0x05, 0x83, 0xde, 0x96, 0xfd, 0x2e, - 0xbd, 0xc4, 0x22, 0xc1, 0x3d, 0xb1, 0xd0, 0xc5, 0xad, 0xdb, 0x7f, 0xa7, - 0xa1, 0x69, 0x53, 0x01, 0xf5, 0x49, 0x4b, 0xb1, 0xe0, 0xb3, 0xf0, 0xc1, - 0xbd, 0xc0, 0x7a, 0x13, 0xc1, 0x70, 0xa9, 0x7d, 0xcd, 0x38, 0xa7, 0x96, - 0xf3, 0xe4, 0xb4, 0x1d, 0x4d, 0xb7, 0xa8, 0xc7, 0x0c, 0xcb, 0xa0, 0x71, - 0x68, 0xfb, 0x19, 0x5b, 0xa9, 0x90, 0x28, 0xa6, 0xde, 0xaa, 0x86, 0x73, - 0xdc, 0xbb, 0xfb, 0x17, 0xf2, 0x4f, 0xf9, 0x3d, 0x23, 0x32, 0x75, 0xf6, - 0xa2, 0x75, 0xd0, 0x8e, 0x0f, 0x6e, 0xd4, 0x30, 0xee, 0x67, 0xf0, 0x0e, - 0x29, 0xc0, 0xdf, 0x00, 0x9d, 0xdf, 0x6b, 0xf5, 0x30, 0x00, 0x6a, 0x75, - 0x70, 0xbf, 0x02, 0x76, 0x62, 0x38, 0x3f, 0xcd, 0xc1, 0xb0, 0xdd, 0xb2, - 0x9e, 0xa3, 0x43, 0xf5, 0xdb, 0x62, 0x11, 0xb5, 0xa0, 0x12, 0x28, 0x05, - 0x6e, 0x21, 0x5f, 0x9a, 0xce, 0xb7, 0x6d, 0xe4, 0xbc, 0x18, 0x66, 0x0c, - 0xec, 0x24, 0xa1, 0x6e, 0x86, 0x3d, 0x55, 0xbd, 0x64, 0xb8, 0xc5, 0x6e, - 0xe4, 0x73, 0x61, 0x3d, 0xd8, 0x9e, 0x9d, 0x1d, 0x0e, 0xc4, 0x58, 0x3f, - 0xf7, 0x32, 0x43, 0xf9, 0x6f, 0x21, 0xf2, 0x7f, 0xa4, 0xb9, 0xf0, 0xf1, - 0x46, 0x5c, 0x15, 0x22, 0xf4, 0x81, 0x53, 0xe2, 0x3d, 0x35, 0x7f, 0xd4, - 0x1f, 0xd1, 0x2a, 0xe1, 0x0a, 0x14, 0xc3, 0x24, 0x75, 0x93, 0x01, 0xb0, - 0xdb, 0x40, 0x75, 0x7e, 0xb0, 0x9c, 0xd8, 0x4d, 0x2e, 0x42, 0x98, 0xc2, - 0xe9, 0x99, 0x9b, 0x74, 0x24, 0x6f, 0xfa, 0x57, 0x90, 0x3b, 0xd5, 0x5b, - 0x01, 0x87, 0xaa, 0x78, 0x72, 0x94, 0x19, 0xc1, 0xfe, 0xac, 0x5c, 0xdd, - 0xd3, 0xa9, 0x12, 0x86, 0x6c, 0xa9, 0xb3, 0x3b, 0x8d, 0x76, 0xdc, 0x7e, - 0xe1, 0x0a, 0x7d, 0x95, 0xaf, 0xb1, 0xeb, 0x55, 0x57, 0x10, 0x03, 0x83, - 0x2c, 0xa8, 0x6e, 0x98, 0xd9, 0x04, 0xa4, 0xd8, 0xb6, 0xc1, 0x83, 0xdd, - 0x36, 0x62, 0x8a, 0x2c, 0x73, 0xf6, 0x58, 0x98, 0x02, 0x59, 0x72, 0x55, - 0x0d, 0xa2, 0xb3, 0xcb, 0x01, 0x1b, 0xbb, 0xbd, 0x8d, 0x32, 0x2c, 0xd5, - 0x87, 0x42, 0x4d, 0x44, 0x42, 0xf3, 0x2f, 0x66, 0x69, 0xc4, 0x50, 0x93, - 0xf0, 0xda, 0x8f, 0x78, 0x4a, 0x6c, 0x42, 0xe2, 0x69, 0x40, 0xfa, 0x3a, - 0x93, 0xcf, 0xb1, 0xde, 0x35, 0x28, 0x0b, 0x2d, 0x21, 0xee, 0x2d, 0xa4, - 0xc3, 0x49, 0xf8, 0xba, 0xf7, 0xa6, 0xf3, 0xfb, 0x3d, 0x34, 0x51, 0x47, - 0x78, 0x18, 0xd4, 0xf4, 0x3f, 0x5d, 0x7c, 0x4f, 0x41, 0x67, 0x2e, 0x47, - 0x4b, 0xe9, 0x59, 0x74, 0xdb, 0x82, 0x9e, 0x61, 0x45, 0x1a, 0x6c, 0x86, - 0xea, 0x04, 0x3d, 0x88, 0x8f, 0x3f, 0x4c, 0x7b, 0xa1, 0x4b, 0xb4, 0x8f, - 0x01, 0x56, 0x93, 0xd5, 0x25, 0xd0, 0x0a, 0x38, 0x9d, 0xed, 0x70, 0xae, - 0x13, 0xe8, 0x7c, 0x86, 0x78, 0xe3, 0x4e, 0x23, 0x42, 0x72, 0x9b, 0xe7, - 0x73, 0xc4, 0xf7, 0x58, 0x28, 0x76, 0x20, 0xe1, 0x3d, 0x58, 0x3d, 0xe8, - 0xeb, 0x07, 0xec, 0xc7, 0x37, 0x79, 0x41, 0xd7, 0x42, 0x21, 0xca, 0x88, - 0xf6, 0xdf, 0xa6, 0x1f, 0x68, 0x1c, 0x38, 0xbc, 0x3b, 0xa3, 0xe3, 0xe5, - 0x42, 0xfd, 0x49, 0xd2, 0xca, 0x64, 0x98, 0xd2, 0x82, 0x7c, 0xb3, 0x6e, - 0x1a, 0xd9, 0x47, 0xc4, 0x9f, 0xf9, 0x6c, 0x2c, 0x40, 0x9f, 0xac, 0x73, - 0xf8, 0x9d, 0x29, 0xb1, 0x08, 0x44, 0x8b, 0x72, 0x1b, 0x02, 0xf2, 0xe0, - 0xf2, 0xf4, 0x63, 0x89, 0x54, 0xae, 0x8a, 0x9b, 0x31, 0x8f, 0xb2, 0x42, - 0xa5, 0xae, 0x1d, 0xf1, 0x05, 0x33, 0x9f, 0x32, 0xae, 0x9a, 0x80, 0xe2, - 0x04, 0xbc, 0xb8, 0x0c, 0x7e, 0xc2, 0x75, 0x88, 0xf0, 0x4c, 0x09, 0x9e, - 0x1a, 0xa2, 0x2d, 0xa1, 0xad, 0x5f, 0xb2, 0x06, 0x67, 0x6f, 0xbc, 0xb5, - 0x3c, 0x7f, 0x44, 0xec, 0xe9, 0xbd, 0xd8, 0x31, 0xe2, 0x29, 0x53, 0x96, - 0x7e, 0xca, 0x19, 0x6b, 0x33, 0xa6, 0xd0, 0x91, 0x35, 0x08, 0x86, 0x86, - 0x24, 0x5f, 0xc9, 0xee, 0x63, 0x75, 0xaa, 0x5e, 0xc6, 0x9a, 0x6c, 0x93, - 0xa5, 0x09, 0x98, 0xae, 0x8a, 0x3a, 0xc8, 0xad, 0xc2, 0xad, 0x62, 0xa7, - 0x32, 0x27, 0xc3, 0xec, 0x70, 0x47, 0x12, 0x7f, 0xf6, 0x28, 0x2b, 0xd4, - 0x29, 0xbe, 0x6e, 0x8b, 0xc3, 0xcf, 0x4b, 0xe0, 0xd0, 0xe8, 0xfe, 0x69, - 0x1d, 0xfe, 0xb4, 0xf0, 0xe6, 0x4a, 0xe7, 0x4b, 0xfd, 0x93, 0xf2, 0xca, - 0x62, 0x82, 0x3f, 0xbd, 0xf9, 0x87, 0x01, 0x4f, 0x67, 0x47, 0xf9, 0xec, - 0x17, 0x59, 0xde, 0xeb, 0x59, 0xc1, 0x0d, 0xc0, 0x17, 0xdb, 0x58, 0x86, - 0xfc, 0x94, 0xba, 0x0f, 0x13, 0x11, 0x6f, 0x27, 0x31, 0xb8, 0x79, 0x81, - 0x70, 0x95, 0x7e, 0x2b, 0x82, 0x3e, 0xa0, 0x2e, 0xed, 0xf2, 0x69, 0x89, - 0x85, 0xb0, 0xba, 0x42, 0xb4, 0x80, 0xf8, 0x5a, 0x1b, 0xb5, 0x23, 0x59, - 0x55, 0x65, 0x03, 0x5f, 0xba, 0xa7, 0x00, 0x49, 0xc3, 0x11, 0x28, 0x4d, - 0x2c, 0x65, 0xdb, 0x78, 0xb1, 0xd3, 0x2e, 0xd4, 0x2b, 0xec, 0xa3, 0x6d, - 0x42, 0x64, 0x41, 0x08, 0x98, 0xc3, 0x30, 0x92, 0xf1, 0x1b, 0x1f, 0x57, - 0x50, 0x34, 0x83, 0x26, 0xea, 0x63, 0x3f, 0xa5, 0x58, 0x93, 0x8e, 0xfa, - 0xbe, 0x92, 0x17, 0xe1, 0x2b, 0xf9, 0xf2, 0xe3, 0xfa, 0x3e, 0xd6, 0xb2, - 0x1c, 0xd2, 0xd7, 0x87, 0xe3, 0xb1, 0x59, 0x34, 0xec, 0x23, 0x81, 0x4e, - 0x8a, 0x43, 0xfb, 0xb9, 0x42, 0xa9, 0xfd, 0x98, 0x8f, 0xe2, 0x28, 0x1d, - 0x5e, 0xf4, 0xc5, 0x0b, 0xde, 0x22, 0xdb, 0xb8, 0x9e, 0x3e, 0x98, 0x5b, - 0x08, 0x38, 0x11, 0xd2, 0xdc, 0xda, 0x04, 0x99, 0xe0, 0x03, 0xfe, 0x01, - 0x8e, 0x85, 0x35, 0x99, 0x80, 0x11, 0xc6, 0x4e, 0x48, 0x8e, 0xc1, 0x33, - 0x3f, 0x70, 0x21, 0xb4, 0x8e, 0xeb, 0xfa, 0x23, 0xd2, 0xb6, 0x82, 0x3d, - 0x3e, 0x50, 0x03, 0xe6, 0xd3, 0x70, 0x8f, 0x88, 0xeb, 0xa4, 0xfd, 0x64, - 0xe3, 0x79, 0x3f, 0xdc, 0x79, 0xab, 0xce, 0x4e, 0x5b, 0xac, 0xe2, 0x38, - 0xc1, 0x75, 0xc4, 0xa6, 0xb2, 0xdd, 0x35, 0x9a, 0x05, 0x08, 0x13, 0x0f, - 0xde, 0x40, 0x23, 0x29, 0xc6, 0x8f, 0x3f, 0x39, 0x9c, 0x13, 0xa5, 0x81, - 0xfa, 0x07, 0x9d, 0xd3, 0xdd, 0x24, 0xf4, 0xae, 0x9e, 0x07, 0xcc, 0x40, - 0x69, 0xaf, 0xa4, 0x79, 0x13, 0x43, 0x98, 0x95, 0x11, 0x1e, 0x37, 0x9e, - 0xb5, 0xc6, 0xd3, 0x96, 0x7a, 0x86, 0x20, 0xb1, 0x26, 0x50, 0xe1, 0xc6, - 0x88, 0x10, 0xf9, 0x55, 0x92, 0xe9, 0xa7, 0xa1, 0xc8, 0x3e, 0xfd, 0xf9, - 0x47, 0xdb, 0xcb, 0xf8, 0x11, 0x35, 0xa1, 0x27, 0x0d, 0xac, 0x17, 0x34, - 0x4d, 0x54, 0xf4, 0xe9, 0xbc, 0x24, 0xb2, 0x61, 0x57, 0x1d, 0xef, 0xf6, - 0x7b, 0xdf, 0xcc, 0x88, 0x29, 0x67, 0x01, 0xdf, 0xe8, 0x3d, 0x56, 0x98, - 0xa4, 0x98, 0x14, 0x99, 0xd9, 0xbf, 0x6b, 0x1f, 0x83, 0x64, 0xc0, 0x80, - 0xd5, 0xd9, 0x46, 0xc1, 0xe8, 0xf0, 0xe7, 0x97, 0x63, 0x06, 0xe2, 0xbb, - 0x63, 0x91, 0xd9, 0x14, 0xa4, 0x77, 0xf4, 0x95, 0x06, 0xf6, 0x6f, 0x03, - 0x92, 0x82, 0x5e, 0x23, 0xef, 0x95, 0x35, 0x6b, 0x29, 0x45, 0xdf, 0x63, - 0x1b, 0x11, 0x55, 0xa1, 0x6a, 0xa6, 0x9d, 0x3e, 0xc7, 0x1c, 0xb6, 0x19, - 0x83, 0xce, 0xe2, 0x28, 0x60, 0x20, 0x08, 0x66, 0x82, 0x90, 0x37, 0x69, - 0xf6, 0x6d, 0xbb, 0x74, 0xef, 0x57, 0xc6, 0x82, 0x0f, 0x4e, 0x23, 0xac, - 0x55, 0xe3, 0x82, 0x8e, 0x16, 0x95, 0x5a, 0xa7, 0x98, 0x0e, 0x52, 0xd7, - 0xba, 0x8e, 0x7c, 0xbf, 0x78, 0xec, 0x32, 0x6f, 0xde, 0x91, 0xf8, 0xb5, - 0xc1, 0x16, 0xdf, 0x45, 0x1d, 0xde, 0x5e, 0xa9, 0xdf, 0xa3, 0xf4, 0x7a, - 0x06, 0x44, 0x75, 0x01, 0xba, 0x8e, 0x8e, 0xf0, 0x78, 0x29, 0x9e, 0x9e, - 0x82, 0xe8, 0x88, 0x47, 0x22, 0x10, 0x77, 0xbc, 0xf6, 0x07, 0xe4, 0x3a, - 0xdc, 0x17, 0x6e, 0x13, 0xc2, 0x62, 0xa9, 0x43, 0x10, 0x72, 0xfa, 0x3e, - 0x4c, 0x8b, 0x70, 0x1c, 0xb7, 0xae, 0x4c, 0x35, 0xde, 0x7d, 0xa1, 0x93, - 0x78, 0xca, 0xa5, 0xa7, 0xc4, 0xee, 0xe7, 0x56, 0x5c, 0xcd, 0xab, 0xd1, - 0xfc, 0x10, 0x11, 0x4b, 0x38, 0x2c, 0x4b, 0x99, 0xe3, 0x05, 0x91, 0x6c, - 0x9e, 0xdf, 0xf8, 0xc0, 0x0c, 0xea, 0x2d, 0xd7, 0xf0, 0x2c, 0x16, 0xa5, - 0xb8, 0x54, 0x61, 0xe0, 0xd0, 0x3a, 0x5b, 0x93, 0xd5, 0xca, 0x94, 0x85, - 0xa5, 0x64, 0x28, 0x95, 0xb1, 0x05, 0x3a, 0x79, 0xe5, 0xbc, 0x1d, 0xdf, - 0xda, 0x6a, 0x70, 0x94, 0x29, 0xea, 0x53, 0xc0, 0xb7, 0xcb, 0x49, 0x82, - 0x8c, 0x44, 0x1e, 0x93, 0x5c, 0x03, 0x65, 0xf3, 0x25, 0x16, 0x9a, 0x4b, - 0x44, 0xa5, 0xfb, 0x3b, 0x56, 0x70, 0xa0, 0x67, 0x42, 0xf4, 0x91, 0xec, - 0xdf, 0x13, 0xee, 0x35, 0xda, 0xd1, 0x6e, 0x7e, 0xcc, 0x53, 0xcc, 0xab, - 0xa8, 0xe7, 0xdb, 0x85, 0x86, 0x24, 0xc4, 0xb6, 0x66, 0x61, 0x08, 0x42, - 0x5e, 0xb5, 0xa2, 0xea, 0x33, 0x66, 0xac, 0x80, 0x6d, 0xd3, 0xb1, 0xf3, - 0x59, 0xc1, 0x3e, 0xa1, 0x08, 0x19, 0x0b, 0xdc, 0x86, 0xca, 0x82, 0xc6, - 0x18, 0x3e, 0x8b, 0x81, 0x6b, 0xcd, 0x3d, 0xda, 0x0d, 0x1b, 0x4c, 0x5e, - 0xa1, 0x5b, 0x34, 0x8f, 0xff, 0xb0, 0x46, 0x77, 0x15, 0xf3, 0x29, 0xd4, - 0xaa, 0xd8, 0xf7, 0x60, 0x43, 0x60, 0xe1, 0x02, 0x4f, 0x37, 0x9c, 0x46, - 0xa8, 0xda, 0xde, 0xea, 0x01, 0x68, 0xda, 0x2f, 0xef, 0x37, 0xae, 0x44, - 0xc8, 0x57, 0x68, 0x20, 0x35, 0x6c, 0x87, 0x75, 0xac, 0xad, 0x80, 0xb7, - 0xbd, 0x35, 0xbf, 0x58, 0xf4, 0x4c, 0x8f, 0x47, 0x7a, 0xb7, 0xbf, 0xe8, - 0x3c, 0x5a, 0x9f, 0xcc, 0xb9, 0xf5, 0x8b, 0x54, 0x09, 0xc5, 0x0f, 0x69, - 0x31, 0x2c, 0x90, 0x27, 0xd9, 0x4c, 0xc2, 0x32, 0x9f, 0xf1, 0x60, 0xe9, - 0xae, 0x3f, 0x97, 0x1a, 0xb0, 0x88, 0x5b, 0x7c, 0xce, 0x56, 0x96, 0x70, - 0x2d, 0x04, 0x74, 0x25, 0x06, 0xda, 0x44, 0xeb, 0x4e, 0xea, 0x90, 0xc3, - 0x87, 0x5a, 0x1f, 0xe8, 0x90, 0x23, 0xe4, 0x98, 0x2f, 0xaf, 0xde, 0x33, - 0xf3, 0xbe, 0x2f, 0x09, 0x0e, 0xad, 0x22, 0x39, 0x6e, 0xbf, 0x15, 0x13, - 0x31, 0x5a, 0xa2, 0xbd, 0xcc, 0xe2, 0x23, 0xfe, 0x91, 0xce, 0x8c, 0x43, - 0x74, 0xf0, 0x17, 0x04, 0xd9, 0x36, 0x08, 0xae, 0xe0, 0x42, 0xe5, 0xb0, - 0x22, 0xb8, 0xda, 0x5e, 0xaf, 0x9b, 0x7e, 0xb8, 0xa6, 0x53, 0x84, 0x4e, - 0x45, 0xbd, 0x5e, 0x77, 0x6c, 0x79, 0x70, 0xbc, 0xdd, 0x5a, 0xbf, 0x60, - 0x1a, 0x3b, 0x67, 0x40, 0xa8, 0x35, 0xff, 0x35, 0x26, 0xa5, 0xe0, 0xdb, - 0xc0, 0xd6, 0xf0, 0x30, 0x81, 0x01, 0x4a, 0xba, 0x46, 0xf6, 0x8e, 0x70, - 0x8e, 0x22, 0xc5, 0x53, 0xb7, 0x26, 0xe5, 0xca, 0xe3, 0xf1, 0xf7, 0x18, - 0x1e, 0x31, 0x53, 0xd8, 0x52, 0xdd, 0xc4, 0xe0, 0xf7, 0x56, 0x76, 0x76, - 0xaf, 0x49, 0x84, 0x59, 0xfa, 0x13, 0xb7, 0xe4, 0x8f, 0x77, 0x6e, 0xa7, - 0x2b, 0xf5, 0x1d, 0x3f, 0x98, 0xcf, 0x4a, 0xbc, 0x57, 0x07, 0x86, 0x33, - 0xa9, 0xe3, 0xf4, 0x50, 0x3c, 0x15, 0x37, 0x8e, 0x56, 0x0f, 0x13, 0xbc, - 0x7a, 0x71, 0x28, 0x88, 0xb7, 0x55, 0xbb, 0xab, 0xb1, 0x1f, 0xbf, 0x74, - 0x67, 0x0f, 0x05, 0x4b, 0x68, 0xd2, 0x68, 0xdd, 0xd4, 0xb9, 0x39, 0x0e, - 0x49, 0xab, 0xc2, 0xd5, 0x22, 0x1f, 0xf3, 0x92, 0xe6, 0x4c, 0x98, 0x89, - 0xe4, 0x45, 0xfe, 0xfc, 0xda, 0x80, 0x01, 0xb2, 0x11, 0x00, 0x7f, 0xd2, - 0x96, 0x71, 0xca, 0x24, 0x0e, 0x74, 0x68, 0xd5, 0xe3, 0xc7, 0x70, 0xfd, - 0xeb, 0xf2, 0xde, 0xea, 0xba, 0x8d, 0xe8, 0x4f, 0xce, 0xaa, 0xa1, 0x43, - 0xb5, 0x89, 0x1e, 0x91, 0x7e, 0x93, 0xbc, 0x3d, 0x4d, 0xfd, 0xa7, 0xc0, - 0xc0, 0x89, 0xf5, 0x09, 0x01, 0x14, 0x5b, 0x38, 0xb5, 0x82, 0x76, 0xf9, - 0x89, 0x99, 0xfc, 0xfb, 0x4a, 0x1d, 0x24, 0xa2, 0xbc, 0x55, 0x21, 0x72, - 0x14, 0x3e, 0x40, 0xa4, 0xde, 0x08, 0x6b, 0x61, 0x93, 0x53, 0x60, 0xff, - 0x65, 0x55, 0x84, 0xc7, 0x2d, 0xb8, 0x08, 0xde, 0xdf, 0x55, 0xab, 0x08, - 0x67, 0xd5, 0x79, 0x9d, 0x2f, 0x95, 0x26, 0x9f, 0xb5, 0xde, 0x7f, 0x9e, - 0x8b, 0x7b, 0xbe, 0xa9, 0xb0, 0xff, 0xc0, 0x0d, 0x39, 0xfd, 0x3e, 0xe7, - 0x2a, 0xa5, 0xa7, 0x9e, 0x46, 0xe3, 0x91, 0xa9, 0x72, 0xd6, 0xc1, 0x2a, - 0x6f, 0xa9, 0x23, 0xc2, 0x2a, 0x00, 0x3e, 0xee, 0xb5, 0x85, 0x65, 0xae, - 0x0c, 0x03, 0xab, 0xfd, 0x4a, 0x72, 0x40, 0x47, 0xba, 0xf7, 0x05, 0x6b, - 0x28, 0x6f, 0x6c, 0xfa, 0xc8, 0xb9, 0xbc, 0x7e, 0xf7, 0x77, 0xb7, 0x03, - 0x01, 0x1c, 0xb5, 0x65, 0x1d, 0xb7, 0xd0, 0x13, 0x19, 0x7a, 0xaa, 0xe8, - 0xc1, 0x54, 0x60, 0xfa, 0x6e, 0xf4, 0x64, 0x29, 0x6b, 0x50, 0xf7, 0x7c, - 0x9c, 0x9c, 0x25, 0xa4, 0xcb, 0x86, 0x8b, 0xb3, 0x4d, 0x53, 0x74, 0xfe, - 0xf5, 0x20, 0xb7, 0xeb, 0x3a, 0x97, 0x3d, 0x1b, 0x7a, 0xd4, 0x27, 0xe3, - 0xf7, 0x7e, 0x1d, 0xa4, 0x24, 0x2a, 0x15, 0x46, 0x21, 0xc0, 0xf3, 0x8c, - 0x1f, 0x2a, 0x19, 0x12, 0xb5, 0x19, 0x2a, 0xac, 0x07, 0x2e, 0xe0, 0x4a, - 0xfc, 0xc0, 0xe3, 0x9f, 0xdd, 0x78, 0x10, 0xd7, 0x56, 0xa8, 0x1e, 0x7b, - 0xec, 0x3b, 0x26, 0x81, 0x34, 0xf6, 0xf3, 0x8c, 0x1f, 0x2a, 0x19, 0x12, - 0xb5, 0x69, 0x2a, 0xac, 0x73, 0x81, 0x0c, 0x08, 0xe0, 0x78, 0xd5, 0xa6, - 0x2a, 0x03, 0xc3, 0x69, 0xf5, 0xf2, 0xa3, 0xa5, 0x7d, 0x73, 0x18, 0x7f, - 0xf7, 0x99, 0xf9, 0x2c, 0x13, 0x98, 0xac, 0xa9, 0x5d, 0x2d, 0x62, 0xa3, - 0x8c, 0x48, 0xd8, 0x89, 0xeb, 0xed, 0xac, 0x37, 0x96, 0x42, 0xb6, 0x08, - 0x45, 0x24, 0xb9, 0x36, 0x64, 0x91, 0xb6, 0x5a, 0x22, 0x7d, 0x4d, 0x9b, - 0x65, 0xd6, 0xb0, 0x7a, 0x47, 0x96, 0x3b, 0x2d, 0x82, 0x4c, 0x18, 0xcb, - 0xd2, 0xe2, 0x28, 0xbb, 0x3a, 0xc3, 0x9c, 0xfc, 0xbb, 0xf9, 0xae, 0xef, - 0xae, 0x7b, 0x68, 0x3b, 0x87, 0xc6, 0x0b, 0xbd, 0x43, 0x6e, 0xd7, 0x6d, - 0xe9, 0x59, 0x14, 0x1b, 0xaf, 0x92, 0x2c, 0xda, 0x14, 0xa9, 0x78, 0xa9, - 0x6f, 0x8d, 0xed, 0x8c, 0xe6, 0x22, 0xf5, 0x32, 0x10, 0x64, 0x88, 0x5a, - 0xb9, 0xf1, 0xe3, 0xd1, 0xc3, 0x10, 0x9a, 0x3c, 0xe9, 0x67, 0xfc, 0xdd, - 0x2e, 0xfd, 0x34, 0x15, 0x15, 0xd1, 0xda, 0xcc, 0x4b, 0xea, 0xc8, 0xb2, - 0xc2, 0x81, 0x02, 0xf2, 0x84, 0xd6, 0xa1, 0x80, 0x00, 0xeb, 0x6e, 0x66, - 0x1b, 0xaa, 0x85, 0x9b, 0xb1, 0x3e, 0xa1, 0x70, 0x2f, 0x49, 0x24, 0xba, - 0x41, 0x57, 0x31, 0xd0, 0x9d, 0xda, 0x7f, 0x7d, 0x50, 0xc1, 0xd8, 0xdc, - 0xfe, 0xbd, 0xea, 0xc3, 0xfb, 0xc0, 0x0c, 0x7d, 0xbb, 0x0c, 0xa3, 0xd7, - 0xac, 0x9b, 0x7b, 0x3d, 0x01, 0x98, 0x7e, 0x1e, 0xf8, 0xf1, 0x42, 0x24, - 0x87, 0xfe, 0xb8, 0x75, 0x93, 0xb4, 0x95, 0xfe, 0x93, 0x9c, 0x6c, 0x98, - 0x06, 0xca, 0xc2, 0xaf, 0x0e, 0x0f, 0xdb, 0xa1, 0xa6, 0x25, 0x20, 0x72, - 0x29, 0x57, 0x02, 0x5d, 0x6e, 0x08, 0xf3, 0x6a, 0xf7, 0xa1, 0x32, 0x20, - 0xd8, 0xf0, 0xf4, 0x44, 0x12, 0xe1, 0xa3, 0x72, 0x63, 0xc9, 0x4c, 0x23, - 0x2d, 0xbf, 0xab, 0xc8, 0x84, 0xe6, 0x45, 0x44, 0x65, 0xc2, 0xd1, 0xcb, - 0x09, 0xf1, 0xf9, 0xd6, 0x13, 0xcb, 0x5a, 0xf1, 0x07, 0x9b, 0xfb, 0x51, - 0x71, 0x93, 0xac, 0x3a, 0x85, 0x07, 0x3d, 0xa1, 0xc4, 0x36, 0xb1, 0xf3, - 0xfc, 0x47, 0x91, 0x9a, 0xb0, 0xdd, 0xa0, 0xf2, 0xf3, 0x76, 0xae, 0x15, - 0x7b, 0x04, 0xf3, 0xdd, 0x1b, 0x9d, 0xf9, 0x4b, 0xbd, 0x3f, 0xd5, 0x78, - 0x32, 0x51, 0xcd, 0x44, 0xce, 0x72, 0x3f, 0x9b, 0xac, 0x80, 0x20, 0xe7, - 0x2f, 0x07, 0xdd, 0x40, 0x46, 0xc3, 0x73, 0x98, 0xfb, 0xc1, 0xf7, 0x94, - 0x67, 0xda, 0x67, 0xec, 0xad, 0x3a, 0xd8, 0x9c, 0x32, 0x07, 0x4f, 0x2d, - 0x15, 0x20, 0x07, 0xba, 0x89, 0x95, 0x12, 0x37, 0xf3, 0xb3, 0xf6, 0x91, - 0x34, 0xa1, 0x75, 0x06, 0xa1, 0x5e, 0xc5, 0xef, 0x98, 0x10, 0xf9, 0x26, - 0xc8, 0x50, 0xcd, 0x2d, 0xe9, 0xf6, 0xa3, 0xc7, 0xc1, 0xcf, 0x7a, 0x81, - 0xa0, 0x22, 0xc9, 0xa5, 0x5e, 0x0b, 0xa8, 0x57, 0xe2, 0x03, 0x1e, 0x5e, - 0x0f, 0x16, 0xab, 0xc5, 0x10, 0xcf, 0xb8, 0x7c, 0xb2, 0xc0, 0xb1, 0x2a, - 0xfb, 0x9b, 0x24, 0x33, 0x8c, 0x3f, 0xea, 0x49, 0x2c, 0x09, 0x5b, 0xe8, - 0x34, 0x6c, 0x45, 0xdf, 0x9b, 0x70, 0x47, 0x28, 0x18, 0x7b, 0xbb, 0x21, - 0x38, 0x3e, 0x4c, 0x8b, 0x1c, 0x6c, 0x23, 0x4a, 0x0d, 0xea, 0x00, 0xeb, - 0x89, 0x74, 0x80, 0xdd, 0x90, 0x63, 0xef, 0x27, 0x7d, 0xfb, 0x48, 0xbc, - 0x97, 0xf1, 0x2b, 0x8c, 0xfa, 0xeb, 0xb1, 0x62, 0xc6, 0xfd, 0xcc, 0xa3, - 0xe4, 0x2f, 0x52, 0xbf, 0x51, 0x0e, 0x32, 0x85, 0x44, 0xe3, 0x78, 0x80, - 0x21, 0x46, 0xa5, 0x7f, 0x18, 0x8d, 0xf5, 0x5a, 0x7d, 0x04, 0xbf, 0x2d, - 0xcd, 0xdb, 0xd3, 0xc8, 0x40, 0x1b, 0xf6, 0x0c, 0x7f, 0x79, 0xb6, 0xca, - 0x5f, 0x7a, 0x79, 0x4c, 0x52, 0xc7, 0x30, 0x63, 0x5a, 0xd5, 0x16, 0xfa, - 0x43, 0xad, 0x98, 0xe7, 0xe4, 0xe8, 0xd4, 0x4f, 0xdb, 0x36, 0x78, 0x23, - 0x6c, 0x61, 0x98, 0x81, 0x21, 0x3d, 0xab, 0x61, 0x38, 0xd0, 0xac, 0xff, - 0x69, 0x79, 0x3a, 0x41, 0xaf, 0x41, 0xc5, 0x12, 0x7f, 0xbe, 0xe0, 0xd3, - 0x16, 0x76, 0x7d, 0x24, 0x10, 0x02, 0xb3, 0x8f, 0x33, 0xf4, 0xec, 0x6e, - 0x72, 0x29, 0xa7, 0x67, 0x26, 0x90, 0x23, 0x8b, 0xce, 0x6b, 0x42, 0x83, - 0xe0, 0xf6, 0x56, 0xca, 0xe1, 0x80, 0x4c, 0xf8, 0x1e, 0xe8, 0x60, 0x67, - 0xc5, 0x98, 0x15, 0x16, 0xcd, 0xeb, 0x2d, 0x87, 0x75, 0xa6, 0xf3, 0xdd, - 0xf9, 0xbb, 0x8b, 0x0e, 0xbe, 0x5e, 0x29, 0xc1, 0x1f, 0x77, 0xe2, 0xe7, - 0xe7, 0x50, 0xb5, 0xb2, 0x12, 0xc2, 0xc5, 0x66, 0x01, 0x68, 0x28, 0x01, - 0x43, 0xa5, 0xe2, 0x94, 0xd0, 0x05, 0xe5, 0x89, 0xe0, 0xcd, 0x89, 0xf1, - 0x59, 0x8a, 0x66, 0xa2, 0x19, 0xf3, 0x1f, 0xb7, 0xcd, 0x68, 0x49, 0x4a, - 0xfa, 0x33, 0x49, 0xfb, 0xa4, 0x51, 0xda, 0x9c, 0xd2, 0x74, 0x66, 0x76, - 0xdf, 0x62, 0xe0, 0x47, 0xea, 0x83, 0xd6, 0x83, 0xe3, 0xe2, 0x6c, 0x8c, - 0x59, 0x53, 0xf0, 0x53, 0x0e, 0x15, 0xdc, 0x64, 0x35, 0x4a, 0x79, 0xe3, - 0x2b, 0x0a, 0xa7, 0xc0, 0x61, 0x95, 0x4a, 0x28, 0x82, 0x48, 0x45, 0x74, - 0xd2, 0xba, 0xc2, 0x88, 0x5d, 0x8b, 0xb4, 0xa6, 0xd4, 0xa1, 0x28, 0xe5, - 0x08, 0x91, 0x68, 0xc3, 0x34, 0x30, 0x0e, 0x97, 0x33, 0x61, 0x05, 0x7e, - 0x6e, 0x27, 0x6a, 0xdf, 0xd7, 0x17, 0xec, 0x71, 0x33, 0x75, 0xae, 0x8c, - 0x8a, 0xa9, 0x23, 0x9d, 0x7d, 0x3f, 0x38, 0x2a, 0xd0, 0x0e, 0x0c, 0x68, - 0xec, 0xcc, 0xfc, 0x4d, 0x2a, 0x5d, 0xc8, 0x85, 0x5b, 0x01, 0xdc, 0x2d, - 0xc7, 0x06, 0xad, 0x35, 0x24, 0xd9, 0x24, 0x45, 0x15, 0x59, 0x38, 0xae, - 0x3a, 0x98, 0x5c, 0x04, 0x82, 0xa9, 0xd5, 0xac, 0x40, 0x8c, 0x95, 0xb0, - 0x6a, 0x42, 0x3e, 0x2b, 0xf9, 0x8f, 0x5e, 0x84, 0x77, 0x8d, 0xa1, 0x9d, - 0x77, 0x2f, 0xfb, 0x4d, 0x24, 0x33, 0x76, 0x38, 0x67, 0x6e, 0x77, 0xb4, - 0x78, 0xa4, 0x07, 0xa7, 0x9d, 0x0d, 0x68, 0x3f, 0x40, 0x2f, 0x01, 0x64, - 0x5a, 0x4d, 0xc4, 0x69, 0x7b, 0xf4, 0xc6, 0x3e, 0xfb, 0x69, 0x99, 0x38, - 0x53, 0x32, 0x7f, 0x02, 0xb1, 0x26, 0x24, 0xc5, 0xa5, 0x49, 0xa2, 0x60, - 0xea, 0x42, 0xf6, 0xda, 0x87, 0x3c, 0xe9, 0x9d, 0xf2, 0x48, 0xcd, 0x84, - 0x39, 0x99, 0xb8, 0x7d, 0xa8, 0xdc, 0x67, 0xc2, 0xdc, 0x52, 0xd4, 0xa3, - 0x96, 0x14, 0xb7, 0xff, 0x87, 0xdd, 0x76, 0x52, 0x89, 0xd6, 0xf4, 0xc1, - 0xf9, 0xa1, 0xfe, 0xd0, 0xb8, 0x2a, 0xf0, 0xf4, 0xf6, 0xa4, 0xe3, 0x88, - 0xe3, 0x81, 0xf4, 0x7f, 0xa7, 0x1c, 0x17, 0x67, 0x6e, 0x57, 0xca, 0xb3, - 0xf5, 0x47, 0x07, 0x73, 0x9a, 0xba, 0xf4, 0xc3, 0x54, 0x91, 0xf2, 0xf5, - 0x13, 0x81, 0xd3, 0x89, 0xcd, 0x28, 0xd4, 0x47, 0x9d, 0x0e, 0x67, 0xde, - 0xee, 0x8e, 0x99, 0x48, 0x35, 0x87, 0x48, 0xce, 0x93, 0x91, 0xa2, 0x9b, - 0x9b, 0x93, 0xc5, 0xe3, 0xb0, 0x5b, 0xe3, 0x49, 0xce, 0x0e, 0x00, 0xa7, - 0x4f, 0xcd, 0xf4, 0x1a, 0x2d, 0xfd, 0x65, 0x26, 0x74, 0xfa, 0x96, 0xe8, - 0x8c, 0xe6, 0xb1, 0x82, 0x6e, 0xab, 0x7f, 0x97, 0xf4, 0xfa, 0xe3, 0xcc, - 0x88, 0xa9, 0x1c, 0xfd, 0x99, 0x10, 0xea, 0x5f, 0x53, 0xe6, 0xb7, 0xaa, - 0x16, 0xc9, 0x99, 0x98, 0xca, 0xd7, 0x37, 0x09, 0xef, 0x0b, 0xe0, 0x57, - 0x57, 0x81, 0xe5, 0x25, 0xec, 0x5a, 0x5c, 0xaf, 0x31, 0xed, 0x9b, 0xc9, - 0x2b, 0xe7, 0xce, 0xf2, 0x58, 0x26, 0x8a, 0x4c, 0xcb, 0xfa, 0xf8, 0x42, - 0x5e, 0x9d, 0x98, 0xa6, 0x07, 0x2a, 0xb1, 0xd6, 0xb6, 0xc4, 0xea, 0x2f, - 0x76, 0xe2, 0x95, 0x13, 0x80, 0x86, 0xb0, 0x74, 0xce, 0x59, 0x35, 0x7e, - 0xbe, 0xb3, 0xfb, 0x00, 0x3d, 0x62, 0x6b, 0xf8, 0xd9, 0x83, 0xe5, 0x6d, - 0xb9, 0xfd, 0xf7, 0xf3, 0x25, 0xd8, 0x49, 0x35, 0x86, 0x04, 0x53, 0x7f, - 0x40, 0x50, 0x76, 0x1a, 0x45, 0xdc, 0x5f, 0xb6, 0x98, 0x9e, 0x00, 0xa4, - 0xb5, 0x16, 0x93, 0xff, 0xa3, 0x20, 0x8a, 0xd7, 0xe3, 0x62, 0xfa, 0x83, - 0xc5, 0xf2, 0x73, 0xce, 0xee, 0xb7, 0x00, 0x93, 0x77, 0x95, 0x98, 0xbc, - 0x3b, 0x37, 0x66, 0x79, 0x6c, 0xb6, 0xa2, 0x63, 0x40, 0x58, 0x21, 0x9e, - 0x9e, 0xe3, 0x02, 0x4b, 0x80, 0x7a, 0x5a, 0xb6, 0x25, 0xb0, 0x3e, 0x57, - 0x63, 0xdf, 0xe8, 0xf8, 0xb7, 0xc3, 0xb5, 0xbb, 0x2e, 0x01, 0x8a, 0x72, - 0xec, 0xef, 0x19, 0x88, 0x55, 0x8c, 0x62, 0x30, 0xc8, 0xe1, 0xdb, 0xd9, - 0x1d, 0xe4, 0xce, 0x94, 0x6c, 0xe9, 0x99, 0x50, 0x93, 0xfd, 0x75, 0x07, - 0x09, 0x16, 0x9b, 0xe8, 0x2c, 0x1b, 0x7d, 0x1c, 0x99, 0xf1, 0xcb, 0x0e, - 0x74, 0x5b, 0xe8, 0xd9, 0xc1, 0x39, 0x48, 0x35, 0xfb, 0x9f, 0x2c, 0xfb, - 0x5b, 0xdb, 0x59, 0x91, 0x70, 0xb1, 0xbe, 0x61, 0x29, 0xc3, 0x5f, 0x47, - 0x30, 0x0b, 0x7b, 0x7e, 0x87, 0xe7, 0xbe, 0x9c, 0x8b, 0x78, 0x20, 0x01, - 0x15, 0x84, 0x53, 0x51, 0x00, 0xe9, 0xba, 0x81, 0x36, 0x23, 0xf9, 0x21, - 0xe9, 0xca, 0xea, 0xe7, 0xfa, 0xfb, 0x24, 0x9f, 0x1c, 0x29, 0x45, 0xc0, - 0x5c, 0x3d, 0x8d, 0x4d, 0x3e, 0x87, 0xd7, 0x4c, 0x3e, 0xee, 0xaa, 0xdd, - 0x92, 0xf1, 0xc7, 0xc1, 0xce, 0x5b, 0xff, 0x3e, 0x7a, 0x86, 0x1e, 0xf2, - 0xc5, 0xb2, 0x69, 0x39, 0xc6, 0x2c, 0x92, 0x6a, 0xf7, 0x11, 0xfc, 0x81, - 0xed, 0xcb, 0x14, 0x4e, 0x3a, 0xdf, 0x61, 0xb0, 0x8c, 0xda, 0xb6, 0x02, - 0xff, 0xf3, 0xc9, 0x86, 0xe8, 0x66, 0xbc, 0xc9, 0x4e, 0x6d, 0xdd, 0x17, - 0x32, 0x79, 0x9d, 0xf5, 0x38, 0x40, 0x7d, 0x70, 0x30, 0xf5, 0x6c, 0xc7, - 0xd2, 0x83, 0xa4, 0xa3, 0xc9, 0x0c, 0x4d, 0xf0, 0xbe, 0x10, 0xc3, 0x36, - 0x44, 0x85, 0xc9, 0x28, 0xb1, 0xe0, 0xa6, 0xe0, 0x08, 0xad, 0xf3, 0x82, - 0x48, 0xd5, 0xbf, 0x9e, 0xbb, 0x58, 0xc7, 0x3f, 0xec, 0x43, 0x47, 0x40, - 0xfe, 0x10, 0xbd, 0x95, 0x1a, 0xb1, 0xea, 0x00, 0x4e, 0x8e, 0xab, 0xe1, - 0x79, 0xfc, 0x0b, 0x9e, 0xc3, 0xed, 0x8f, 0x8e, 0x1b, 0x82, 0xad, 0xfc, - 0x0d, 0x27, 0xd5, 0xdd, 0x1a, 0xb1, 0x9c, 0x0c, 0x18, 0x93, 0xe4, 0x32, - 0xbb, 0x9b, 0xcf, 0xde, 0xda, 0x2f, 0x46, 0x6e, 0xec, 0x67, 0x5d, 0x36, - 0x2e, 0xa2, 0xab, 0x27, 0x85, 0x22, 0x07, 0x37, 0x99, 0x44, 0x25, 0x0e, - 0x90, 0x25, 0x10, 0xbf, 0x9b, 0xc2, 0x23, 0xe6, 0xbb, 0x33, 0xfe, 0x5d, - 0x06, 0x3d, 0xc2, 0xc9, 0x84, 0xb2, 0x0a, 0xe5, 0x7a, 0xac, 0xbe, 0xee, - 0xc5, 0x77, 0xaf, 0x6c, 0xa5, 0xfb, 0x35, 0xf3, 0x7e, 0x06, 0x48, 0x5e, - 0x1a, 0x5b, 0xb6, 0x4e, 0x1a, 0xe0, 0xda, 0x87, 0x46, 0x7b, 0xd1, 0xd6, - 0x15, 0x1c, 0x0e, 0x8a, 0x60, 0x6c, 0xeb, 0xab, 0xc8, 0xc2, 0x90, 0xf8, - 0xa4, 0x60, 0x39, 0x52, 0xee, 0x63, 0x94, 0x82, 0x2c, 0x9c, 0xc8, 0x9f, - 0x77, 0x20, 0x9f, 0xa6, 0x40, 0x49, 0x05, 0x86, 0x1f, 0x6b, 0x6c, 0xb8, - 0x55, 0x3a, 0x4b, 0x37, 0x57, 0x28, 0x35, 0xc2, 0x70, 0xc4, 0x74, 0x2f, - 0x14, 0x41, 0x32, 0x33, 0xc0, 0xed, 0x51, 0x8f, 0xc9, 0xcc, 0xca, 0x69, - 0x8c, 0x6d, 0x68, 0xa5, 0x73, 0xd0, 0x06, 0x74, 0x3e, 0xcc, 0xb2, 0xae, - 0x6d, 0x31, 0x64, 0xc6, 0x96, 0xf7, 0x93, 0x29, 0xcf, 0x1c, 0xed, 0x2e, - 0x46, 0xda, 0xed, 0x12, 0x0c, 0x79, 0x0f, 0x85, 0xf9, 0xc0, 0x25, 0x78, - 0xda, 0xf6, 0xd4, 0x45, 0xdf, 0x33, 0x45, 0xde, 0xd8, 0x90, 0x8d, 0x52, - 0x22, 0xf0, 0xee, 0xce, 0x81, 0x86, 0x87, 0x0e, 0x58, 0x98, 0xa5, 0x6b, - 0x6e, 0x31, 0xd1, 0xa8, 0xb3, 0x93, 0x8e, 0x35, 0xfa, 0x3e, 0x51, 0xea, - 0xf9, 0x9d, 0xa5, 0xd6, 0x0d, 0x21, 0xe5, 0xcc, 0x7d, 0x79, 0xf1, 0xbe, - 0xeb, 0xdd, 0x46, 0x48, 0x30, 0x98, 0xc3, 0x1d, 0x71, 0x7e, 0xcc, 0xd1, - 0xb1, 0xeb, 0x5a, 0x92, 0x00, 0x28, 0x66, 0x0b, 0x5a, 0x17, 0xa1, 0x97, - 0xc5, 0x25, 0x4d, 0x86, 0xfb, 0x42, 0x8e, 0x33, 0x6a, 0x32, 0xbd, 0xff, - 0x8d, 0x74, 0xbe, 0xb7, 0xd8, 0x4c, 0x99, 0x37, 0x3f, 0xee, 0xd8, 0x42, - 0xeb, 0x9c, 0xfb, 0xba, 0x85, 0xd3, 0x36, 0x4d, 0x9f, 0xb4, 0xf2, 0xa9, - 0x8c, 0x0d, 0x08, 0x0a, 0xd2, 0x16, 0xdb, 0xeb, 0x2c, 0xce, 0x87, 0x3e, - 0xc0, 0xde, 0x48, 0xb9, 0x5a, 0xcf, 0x5b, 0x6c, 0xf3, 0xa2, 0xfb, 0x33, - 0x5e, 0x7d, 0xba, 0x80, 0x40, 0x79, 0x0b, 0xab, 0xae, 0x3b, 0xf6, 0x56, - 0x4e, 0x5a, 0xe0, 0x63, 0x95, 0xec, 0x77, 0x61, 0x4e, 0x33, 0x55, 0x3e, - 0xdc, 0x21, 0xd5, 0x1d, 0x5f, 0x7c, 0x69, 0x2f, 0xe4, 0x92, 0x31, 0x04, - 0xc0, 0x6a, 0x70, 0xcc, 0x17, 0x0a, 0x3b, 0x67, 0xaf, 0x1a, 0x5e, 0x72, - 0x23, 0xe7, 0xcf, 0x52, 0xb2, 0x82, 0x46, 0x79, 0x41, 0xaf, 0xe2, 0xdb, - 0x3f, 0x25, 0x3d, 0x7a, 0xba, 0xfc, 0xb7, 0x23, 0xa3, 0xb8, 0x1b, 0x76, - 0x47, 0x28, 0x88, 0x8f, 0x54, 0x60, 0xc9, 0x99, 0x8a, 0x07, 0x15, 0xcc, - 0x42, 0x2c, 0x40, 0x4c, 0xb4, 0x9b, 0x7f, 0x48, 0x37, 0xe1, 0xda, 0xf3, - 0x19, 0x84, 0x53, 0x63, 0xe2, 0xcf, 0x28, 0xb5, 0x0c, 0x88, 0x10, 0x85, - 0xcb, 0xc8, 0xfc, 0x8f, 0x1f, 0x4c, 0x0c, 0x99, 0xf2, 0xe3, 0x39, 0xe2, - 0xa5, 0x16, 0x33, 0xb5, 0xdb, 0xc3, 0x60, 0x6a, 0xe3, 0x12, 0xf3, 0xc0, - 0xed, 0xc4, 0x41, 0xae, 0xea, 0x9a, 0x94, 0x60, 0x63, 0x01, 0x54, 0x7c, - 0xb5, 0xa4, 0x76, 0x54, 0xe5, 0x03, 0x30, 0xaa, 0xa0, 0x9d, 0xa2, 0xed, - 0x62, 0x04, 0x3f, 0x24, 0xdb, 0x7b, 0x62, 0xe3, 0x2e, 0xeb, 0xee, 0x70, - 0x20, 0x90, 0x22, 0x08, 0xef, 0x45, 0xe9, 0xeb, 0x7b, 0x9d, 0x83, 0x96, - 0x0a, 0x40, 0x27, 0x88, 0xa0, 0x64, 0x8b, 0x5b, 0xf2, 0xf9, 0xc7, 0xd6, - 0xb4, 0x09, 0x15, 0x0c, 0x6b, 0x67, 0x3c, 0x3d, 0x42, 0x63, 0xbc, 0xfd, - 0x16, 0x62, 0x89, 0x86, 0xba, 0x3b, 0x67, 0x2e, 0xdd, 0xd0, 0xb8, 0x4c, - 0x6a, 0x31, 0x9c, 0xf6, 0x0c, 0xc3, 0xea, 0x45, 0x81, 0x87, 0xe6, 0xef, - 0x5b, 0xdc, 0x58, 0xfd, 0x72, 0x94, 0x41, 0x01, 0xcc, 0x4d, 0x0a, 0xc0, - 0x45, 0xfd, 0xfd, 0x4e, 0x39, 0x93, 0x41, 0xc3, 0x9c, 0xb0, 0x37, 0x63, - 0xac, 0x8c, 0xae, 0x4a, 0xd8, 0x91, 0xab, 0x68, 0x0d, 0x9d, 0xde, 0x66, - 0x8a, 0x90, 0x58, 0xad, 0xd3, 0x9c, 0xb5, 0xee, 0x2f, 0xf0, 0xf1, 0xe5, - 0x10, 0x76, 0xbc, 0x7e, 0xcf, 0xd0, 0xbd, 0x71, 0xa5, 0x62, 0x56, 0x98, - 0x04, 0xbd, 0x6e, 0xb4, 0xe9, 0x38, 0x33, 0x1d, 0x07, 0x76, 0x1d, 0x71, - 0xe1, 0x3e, 0x42, 0xda, 0x14, 0x36, 0x48, 0xe2, 0x7a, 0x90, 0xfe, 0x19, - 0xbf, 0x77, 0xa3, 0x00, 0xaa, 0x06, 0xda, 0x4c, 0xfa, 0x8a, 0x5e, 0x8b, - 0xc2, 0x58, 0x80, 0x2f, 0xe2, 0x88, 0x81, 0x4c, 0xdb, 0x1d, 0xd5, 0x94, - 0x8b, 0xff, 0xdb, 0xf4, 0x4a, 0xe5, 0x89, 0x73, 0x52, 0xf9, 0xf3, 0x02, - 0x80, 0xd6, 0x1c, 0x91, 0x64, 0xe9, 0x65, 0x3c, 0x7f, 0x65, 0xcf, 0xfd, - 0x2d, 0x8b, 0x6b, 0x39, 0x4a, 0x72, 0xce, 0x91, 0x7c, 0xd0, 0x15, 0x8a, - 0xf9, 0x25, 0x2c, 0x96, 0x25, 0x69, 0xba, 0x6f, 0x72, 0xd3, 0x60, 0x68, - 0x1c, 0x18, 0x12, 0xc1, 0x2e, 0x77, 0x71, 0x2d, 0x6d, 0xf5, 0x48, 0xd8, - 0xfd, 0x48, 0x3b, 0x00, 0xf9, 0x05, 0x3d, 0x76, 0xd1, 0xd4, 0xc9, 0xdf, - 0xde, 0x75, 0x24, 0x02, 0x5d, 0x55, 0xab, 0x44, 0xd8, 0xfb, 0xff, 0x6c, - 0x40, 0x25, 0xd2, 0x24, 0x36, 0x7f, 0x95, 0x37, 0x76, 0x5c, 0x34, 0xc7, - 0xae, 0x19, 0x5f, 0xab, 0x15, 0xbb, 0x31, 0xb9, 0xd7, 0xe1, 0x78, 0xe3, - 0xca, 0x69, 0x6d, 0x49, 0xfc, 0x52, 0x7f, 0x64, 0xc2, 0x92, 0xa2, 0xf0, - 0x28, 0x21, 0x8e, 0xcc, 0x3d, 0x70, 0xac, 0x09, 0x2c, 0x7b, 0x1f, 0x7c, - 0xfb, 0xf5, 0x62, 0xc9, 0x4a, 0xdb, 0x50, 0x93, 0xef, 0xd2, 0xf7, 0x6c, - 0x3f, 0x36, 0x56, 0x45, 0x8d, 0x98, 0x3d, 0x27, 0xf5, 0x94, 0x46, 0x1f, - 0x54, 0x5d, 0xcf, 0x47, 0x9a, 0xda, 0xfa, 0x82, 0x50, 0x54, 0xc1, 0xab, - 0xf5, 0xef, 0xc5, 0x3a, 0x3c, 0x23, 0x73, 0xa7, 0x6f, 0x0c, 0xe6, 0x27, - 0x1e, 0x04, 0xf5, 0xbb, 0x71, 0x87, 0xa1, 0x6b, 0x82, 0xb9, 0x60, 0x05, - 0x9a, 0x3e, 0xb7, 0x77, 0x98, 0xa3, 0xfc, 0xd0, 0x2f, 0x69, 0x11, 0x22, - 0x44, 0xb1, 0xa5, 0xd0, 0x9c, 0xbb, 0x3a, 0x9a, 0x92, 0x57, 0x0c, 0x3d, - 0xc0, 0x82, 0xfc, 0x5a, 0x26, 0xd9, 0xf2, 0x15, 0xa0, 0x80, 0x3a, 0x19, - 0x4f, 0x59, 0x77, 0x97, 0xde, 0xe1, 0x6f, 0xa1, 0x73, 0xcf, 0xbe, 0x9e, - 0x2d, 0x62, 0xa9, 0x07, 0x08, 0x82, 0xcb, 0xb6, 0xba, 0x56, 0xc9, 0xe5, - 0x6c, 0xc1, 0x6a, 0xa3, 0x56, 0x25, 0xcb, 0xa7, 0x47, 0x49, 0xc5, 0x94, - 0x73, 0xfc, 0x4c, 0xd1, 0x10, 0x6e, 0x1e, 0x29, 0xbd, 0xb3, 0x88, 0xcb, - 0x33, 0xcb, 0x66, 0x90, 0xd9, 0x5b, 0x85, 0xf2, 0xe1, 0x8a, 0x88, 0x63, - 0xc5, 0x03, 0xcc, 0x41, 0xd5, 0xb4, 0x15, 0x06, 0x0c, 0x14, 0xe6, 0xe1, - 0xbf, 0x82, 0x0b, 0x0c, 0x31, 0x51, 0x14, 0x17, 0x1f, 0xfc, 0x05, 0x54, - 0xe8, 0x91, 0x41, 0xdf, 0x37, 0x28, 0x0b, 0x17, 0x18, 0x17, 0x67, 0xb1, - 0xaf, 0xa6, 0xaa, 0x65, 0x65, 0x15, 0xe5, 0xe7, 0x69, 0xb3, 0xb0, 0xed, - 0xd3, 0x41, 0x65, 0xe4, 0x7d, 0x87, 0x97, 0xad, 0x7f, 0xa7, 0xcd, 0xc9, - 0xd1, 0xb3, 0x30, 0x9a, 0xe4, 0x27, 0x0f, 0x9e, 0xb3, 0xda, 0xb1, 0xd3, - 0x22, 0x5e, 0x3b, 0x40, 0x76, 0x65, 0x58, 0x5a, 0xde, 0xca, 0xc3, 0x74, - 0x8f, 0xcc, 0xc2, 0x4c, 0xe5, 0x67, 0x17, 0x51, 0x20, 0xa2, 0x8f, 0xa7, - 0xa1, 0x3d, 0x01, 0xdd, 0x6d, 0x1c, 0x76, 0x66, 0xab, 0xd0, 0x5f, 0x15, - 0x73, 0x92, 0x9b, 0x81, 0x4e, 0x35, 0x8d, 0xd8, 0xce, 0x1d, 0x46, 0x12, - 0xb3, 0x05, 0xfe, 0x62, 0x6e, 0x10, 0xfb, 0x28, 0xec, 0x67, 0xdf, 0xe0, - 0x85, 0x39, 0xe0, 0x3f, 0x87, 0xb4, 0x30, 0xf4, 0x39, 0x80, 0x2f, 0x8f, - 0x51, 0xd9, 0xd1, 0xae, 0xbb, 0x0e, 0x70, 0x02, 0x58, 0x19, 0x07, 0x9d, - 0xd8, 0x31, 0xc7, 0xcd, 0xf5, 0xf0, 0x2a, 0xf9, 0xaf, 0x53, 0x8b, 0x70, - 0x01, 0x2b, 0xde, 0x7c, 0x08, 0xf3, 0x01, 0xf7, 0xac, 0x88, 0x41, 0xd2, - 0xab, 0xd2, 0xe1, 0x0e, 0x6b, 0x39, 0x14, 0xed, 0x78, 0xd7, 0xd6, 0xe9, - 0xb8, 0x11, 0xc2, 0x75, 0x00, 0xc5, 0xa6, 0xa7, 0x98, 0x31, 0x4a, 0xae, - 0x8c, 0x1b, 0xc9, 0xe7, 0x27, 0xb5, 0x34, 0x78, 0x9a, 0x1f, 0x5a, 0x09, - 0x62, 0x02, 0x1b, 0x56, 0xc7, 0x30, 0x60, 0x56, 0x6d, 0xc4, 0x1c, 0xf2, - 0x1f, 0x7e, 0x28, 0x9b, 0x1b, 0x05, 0x4c, 0xb8, 0xbc, 0x52, 0x26, 0xbc, - 0xe0, 0x8c, 0x60, 0xf7, 0x12, 0x3c, 0x37, 0xf6, 0x03, 0x23, 0x9f, 0xfa, - 0xba, 0xa5, 0x1a, 0x41, 0x2f, 0x45, 0x7a, 0x84, 0xe8, 0x62, 0x1f, 0x63, - 0xbf, 0xa5, 0x1f, 0x47, 0xcb, 0x92, 0x4f, 0x94, 0x8e, 0x6c, 0x5e, 0xea, - 0xf7, 0x0f, 0xd5, 0x96, 0x19, 0xe9, 0x31, 0xbc, 0x2b, 0xdd, 0x4a, 0x0c, - 0x56, 0xc1, 0x49, 0xef, 0x2b, 0x87, 0xbd, 0x95, 0xe0, 0x65, 0x4d, 0x42, - 0x9c, 0x59, 0x09, 0xfb, 0x87, 0x5e, 0xa4, 0x41, 0x2a, 0x2d, 0x2f, 0xd8, - 0x91, 0x2a, 0x04, 0x7c, 0x92, 0x01, 0x67, 0xdd, 0xe4, 0x9d, 0xdf, 0xcd, - 0x2e, 0x69, 0x33, 0x31, 0xef, 0x31, 0x50, 0xa4, 0x7e, 0xaa, 0x21, 0x91, - 0xb1, 0x7d, 0xfa, 0xe9, 0x43, 0x16, 0x03, 0x0b, 0xc6, 0xd9, 0xa7, 0xb1, - 0x17, 0x15, 0xc3, 0x0d, 0xa9, 0x8e, 0xd0, 0x19, 0x35, 0xe4, 0xc6, 0x1f, - 0x4c, 0x51, 0xba, 0x8d, 0xe2, 0xea, 0x30, 0x6f, 0x59, 0x84, 0xad, 0x55, - 0x0b, 0x4b, 0xf6, 0x15, 0x6c, 0x13, 0xce, 0x2f, 0xff, 0x4b, 0xc7, 0x84, - 0x8c, 0x5a, 0x39, 0xc2, 0xdb, 0x99, 0x36, 0xe8, 0x1c, 0x88, 0xfa, 0x00, - 0x2d, 0x52, 0xc1, 0xe9, 0x07, 0x86, 0xd6, 0x20, 0x96, 0x94, 0xfb, 0xa7, - 0x70, 0xf8, 0x8d, 0xb1, 0x99, 0x5f, 0x79, 0x70, 0xb3, 0xcd, 0x99, 0xd2, - 0x54, 0x2f, 0x52, 0x5f, 0x09, 0x01, 0x02, 0x64, 0x64, 0xe5, 0xb0, 0xef, - 0x77, 0xc4, 0x97, 0x49, 0xe9, 0x58, 0x2f, 0x50, 0x23, 0x8f, 0x7b, 0x59, - 0x98, 0x78, 0x37, 0x88, 0x1a, 0x0d, 0xf4, 0x24, 0xff, 0x0f, 0x7a, 0xdd, - 0x5d, 0xa8, 0x2e, 0x98, 0xd6, 0x89, 0xed, 0x90, 0xa3, 0xdc, 0x3b, 0xe4, - 0x12, 0xb4, 0x51, 0xd5, 0x2a, 0x5b, 0xb6, 0xcb, 0x29, 0x5b, 0x18, 0xdb, - 0xb2, 0x25, 0x38, 0x83, 0xdf, 0xcb, 0x8c, 0x34, 0x3b, 0xa8, 0x93, 0xba, - 0x42, 0xa3, 0xeb, 0x9e, 0x92, 0x82, 0x2b, 0x2d, 0x50, 0x4c, 0xf2, 0xd1, - 0x8a, 0xfe, 0xf4, 0x72, 0x87, 0x09, 0x7f, 0x99, 0x7d, 0x71, 0x0b, 0xf2, - 0x18, 0xb9, 0x16, 0x4e, 0x88, 0x06, 0xc2, 0x42, 0x4b, 0xce, 0x70, 0x26, - 0xc8, 0x23, 0x75, 0x5e, 0x1b, 0xe6, 0xc4, 0x16, 0x43, 0xe9, 0xd3, 0xb9, - 0xae, 0xcc, 0xeb, 0xbb, 0xc6, 0x4b, 0x85, 0x2e, 0x82, 0x0c, 0xfd, 0x9c, - 0x1b, 0x59, 0x50, 0x19, 0x7a, 0x64, 0x7d, 0xcc, 0x99, 0xd9, 0x77, 0xb1, - 0xb8, 0x12, 0x8b, 0x7a, 0x4e, 0x85, 0xb1, 0xee, 0x70, 0xcf, 0x5f, 0xa5, - 0xbb, 0x72, 0xe3, 0x85, 0x67, 0x09, 0x04, 0x71, 0xab, 0x76, 0x18, 0x64, - 0x58, 0xf3, 0x61, 0xdb, 0xf1, 0x99, 0x93, 0xc0, 0x9c, 0xc4, 0xa5, 0x9f, - 0x56, 0x66, 0x1b, 0x92, 0x46, 0x3d, 0x85, 0x96, 0x06, 0x0b, 0xd4, 0x8c, - 0x74, 0x70, 0x9c, 0x61, 0xf9, 0x20, 0xcf, 0x2a, 0x65, 0x02, 0x4d, 0x70, - 0x4b, 0x12, 0x19, 0x88, 0xe3, 0xaa, 0x03, 0x2c, 0x7f, 0xfc, 0xad, 0xf5, - 0x8a, 0x61, 0x5e, 0x43, 0xae, 0x75, 0xe8, 0x75, 0x1e, 0x00, 0x94, 0x13, - 0x88, 0x60, 0x34, 0x23, 0x6a, 0xe2, 0x56, 0x98, 0xb4, 0xce, 0x6f, 0xe0, - 0xd9, 0x9c, 0xae, 0xae, 0xda, 0x90, 0x9e, 0xff, 0xaf, 0x72, 0x80, 0x86, - 0xb3, 0x9c, 0xb3, 0xec, 0x7a, 0x80, 0x4b, 0xdb, 0xd2, 0xd9, 0x47, 0x02, - 0x64, 0x02, 0x61, 0x06, 0x48, 0xd8, 0x60, 0x7a, 0x6b, 0xf8, 0xee, 0xba, - 0x16, 0x26, 0xc8, 0xa0, 0x4f, 0xdd, 0x65, 0x2d, 0x5d, 0x1c, 0x19, 0x35, - 0x68, 0xb7, 0x5d, 0x7a, 0xf3, 0x80, 0x6e, 0x75, 0x23, 0xbe, 0xf6, 0x15, - 0x3f, 0x27, 0x11, 0xbe, 0xe8, 0x2f, 0xfc, 0x0c, 0x32, 0xf7, 0x60, 0xd5, - 0x51, 0x86, 0x22, 0xa0, 0xf4, 0xf5, 0x19, 0x97, 0x45, 0x2d, 0x80, 0x06, - 0x3d, 0x35, 0x74, 0x1b, 0x34, 0xa1, 0x8b, 0x79, 0x5b, 0xef, 0x75, 0xb7, - 0x95, 0x8d, 0x46, 0x3a, 0x33, 0x69, 0xa1, 0x8f, 0x7d, 0x01, 0xf3, 0xae, - 0x96, 0x9e, 0x2a, 0x23, 0xe6, 0x50, 0xfb, 0x51, 0xac, 0x0b, 0x1b, 0x10, - 0x38, 0xfc, 0xa9, 0xf1, 0xa9, 0x67, 0x17, 0x82, 0x5a, 0x0c, 0xd1, 0x77, - 0x30, 0x22, 0xc0, 0x9c, 0xb0, 0xd1, 0x18, 0x43, 0xcc, 0xed, 0x54, 0x9f, - 0x0b, 0x99, 0x5c, 0xb5, 0x6a, 0x05, 0x39, 0xd1, 0xde, 0xf3, 0x06, 0x23, - 0x67, 0xb7, 0xba, 0x57, 0xa3, 0x47, 0xaa, 0x70, 0x50, 0x6c, 0x38, 0x6a, - 0x92, 0xd8, 0x00, 0x96, 0x99, 0xb3, 0xca, 0x10, 0xd9, 0xe1, 0x8f, 0x05, - 0xe0, 0x06, 0x6d, 0x02, 0xfa, 0x2c, 0xfb, 0x00, 0xf1, 0x46, 0xfc, 0x11, - 0x92, 0xe9, 0xd1, 0x37, 0x3c, 0x85, 0xc5, 0xc3, 0xb4, 0x65, 0x39, 0xed, - 0xbb, 0x99, 0x01, 0x6f, 0x7d, 0x49, 0x39, 0xb1, 0x07, 0x5e, 0x45, 0xc3, - 0x5b, 0xa8, 0xf1, 0x43, 0x4b, 0xad, 0xec, 0x71, 0x0e, 0xdb, 0x72, 0xc1, - 0x3d, 0x07, 0xd4, 0x43, 0xb9, 0x48, 0x4f, 0xb4, 0x5f, 0x37, 0xf3, 0x9e, - 0x3c, 0x69, 0x0a, 0xb1, 0xc4, 0x02, 0xb2, 0x2d, 0xac, 0x8f, 0x35, 0x2a, - 0x70, 0x5d, 0x0b, 0x23, 0xd0, 0x07, 0xfb, 0xd0, 0x4f, 0x0c, 0xc7, 0xa8, - 0x45, 0x0a, 0x16, 0xe9, 0x81, 0x2c, 0xb6, 0x56, 0x3c, 0x07, 0x2d, 0x1e, - 0x64, 0x33, 0xc4, 0x27, 0xae, 0xf8, 0x9c, 0x3c, 0xcc, 0x5f, 0x2c, 0xe0, - 0x64, 0x80, 0xb0, 0x1d, 0xa2, 0x86, 0x2f, 0x89, 0xdf, 0x0d, 0x08, 0x5a, - 0x99, 0xc4, 0xad, 0x5b, 0xd9, 0xe9, 0x4f, 0x6c, 0x0b, 0x6c, 0xaa, 0x21, - 0xaf, 0xce, 0x02, 0xa4, 0xbd, 0x92, 0x7a, 0x06, 0xdb, 0x6a, 0xcf, 0xc1, - 0x39, 0x28, 0x52, 0x67, 0x96, 0x46, 0x46, 0x04, 0x9e, 0x96, 0x7a, 0x29, - 0xc0, 0xfa, 0x99, 0xe2, 0xd8, 0x06, 0x5f, 0xe6, 0x2b, 0xb3, 0x08, 0xb6, - 0x1c, 0xc7, 0x58, 0x2d, 0xce, 0xa6, 0xb9, 0x33, 0xf0, 0xe0, 0x0a, 0x5d, - 0x32, 0x69, 0x81, 0xa6, 0x3e, 0x26, 0x5a, 0x4a, 0x04, 0x90, 0x34, 0x91, - 0x6f, 0xfc, 0xba, 0xf8, 0x71, 0x15, 0x49, 0x6f, 0xeb, 0x1e, 0x34, 0xa2, - 0xcc, 0x35, 0x1d, 0x10, 0xbc, 0xa3, 0x05, 0xf4, 0x43, 0x4d, 0x6b, 0x3f, - 0x09, 0xe5, 0x23, 0x32, 0x0f, 0xdb, 0x28, 0x73, 0x71, 0xdd, 0x82, 0xcc, - 0xc3, 0x78, 0xdf, 0x20, 0xf4, 0xfb, 0xce, 0x30, 0xd8, 0x29, 0xef, 0x32, - 0x1e, 0x14, 0x23, 0x30, 0x33, 0x78, 0x4e, 0x95, 0x04, 0x27, 0x42, 0xcb, - 0x83, 0x64, 0x6e, 0x81, 0x06, 0xe1, 0xc5, 0xed, 0x48, 0x6f, 0xd6, 0xdb, - 0xfa, 0x65, 0xa7, 0x14, 0x64, 0x6e, 0x20, 0xe3, 0x09, 0x5d, 0xe6, 0x9f, - 0x05, 0xcf, 0x78, 0x9b, 0xa5, 0x1a, 0x44, 0x94, 0xeb, 0x3f, 0x93, 0x7e, - 0x06, 0x7f, 0xa7, 0x5e, 0x8a, 0x67, 0x1d, 0x0c, 0xe5, 0x48, 0x23, 0x6b, - 0xbd, 0x78, 0xf4, 0x4c, 0x54, 0xb9, 0x83, 0x92, 0x74, 0xcf, 0xe1, 0x1c, - 0xc8, 0x32, 0x87, 0x13, 0xc2, 0xd1, 0xff, 0x4a, 0xe6, 0x99, 0xf7, 0x70, - 0x04, 0x80, 0x57, 0xa9, 0xaf, 0x6b, 0x1d, 0xc3, 0x33, 0x3f, 0x6c, 0xc4, - 0x11, 0x61, 0x11, 0xe3, 0x50, 0xc5, 0x67, 0x55, 0x60, 0xbd, 0x95, 0xe2, - 0xc2, 0x7a, 0xd3, 0xa1, 0x48, 0x47, 0x43, 0x04, 0xe9, 0x99, 0x23, 0x73, - 0x10, 0x74, 0xc8, 0x71, 0x2f, 0xe8, 0xc4, 0x00, 0xb6, 0x0a, 0x34, 0xb6, - 0x55, 0x69, 0x4e, 0xdf, 0xab, 0x3a, 0x21, 0x4e, 0x78, 0xcb, 0x8d, 0x62, - 0x6e, 0x53, 0xd4, 0x6b, 0x37, 0x71, 0x9c, 0xd0, 0x38, 0xe0, 0xb6, 0x81, - 0x7d, 0x6e, 0x12, 0xcd, 0xdd, 0xdb, 0x77, 0xfd, 0x7a, 0xac, 0xb5, 0x86, - 0x7f, 0xe5, 0x7a, 0xe9, 0x6f, 0xa2, 0xec, 0xf1, 0x03, 0xb5, 0x2a, 0xbc, - 0x0d, 0x78, 0x78, 0x01, 0xec, 0x92, 0x0e, 0x3b, 0x13, 0xd1, 0x37, 0x38, - 0x9f, 0x8f, 0x27, 0xe6, 0x7b, 0xb0, 0x4e, 0x07, 0x5f, 0x80, 0xe2, 0xa0, - 0xb3, 0x09, 0x24, 0x31, 0x3c, 0x83, 0x5e, 0x45, 0xca, 0x24, 0xd0, 0x12, - 0xc9, 0x2a, 0x51, 0x20, 0x3e, 0x06, 0x10, 0xf1, 0x41, 0xd2, 0x71, 0xbc, - 0xc7, 0x4d, 0xe6, 0x7f, 0x44, 0xb7, 0xe6, 0xd6, 0x05, 0x79, 0x9f, 0xec, - 0x4c, 0x0c, 0x38, 0x1d, 0x29, 0xea, 0x5c, 0x9c, 0xe5, 0x36, 0xc0, 0x61, - 0x2f, 0xeb, 0xb5, 0x4b, 0x0b, 0xaf, 0xe1, 0x2e, 0x4b, 0xc0, 0xde, 0x10, - 0x40, 0xd8, 0x97, 0x20, 0x3b, 0x12, 0xfe, 0xc3, 0xe4, 0xf4, 0xc0, 0xa4, - 0x12, 0x18, 0x62, 0x00, 0xb7, 0x23, 0x73, 0x13, 0x33, 0xad, 0x76, 0xc8, - 0x98, 0xda, 0x89, 0x5f, 0xd5, 0xca, 0xfd, 0xf0, 0xde, 0xfe, 0xe3, 0xf9, - 0x48, 0xd9, 0x5d, 0x33, 0xb5, 0xce, 0x3c, 0x46, 0xc1, 0x20, 0x1b, 0x6e, - 0xaf, 0x69, 0x72, 0xcf, 0x3b, 0x8f, 0x30, 0xb5, 0x7a, 0xf7, 0x1a, 0x5c, - 0x4c, 0x5c, 0x18, 0x38, 0xbb, 0x94, 0xc9, 0x9e, 0xbd, 0x39, 0xbf, 0xe7, - 0xc5, 0xe9, 0xbf, 0x64, 0x6a, 0x05, 0xff, 0xc8, 0xc4, 0xab, 0x10, 0xaf, - 0xbf, 0x5b, 0xf0, 0x4c, 0x30, 0x7c, 0x25, 0x0f, 0x33, 0xda, 0x46, 0x8c, - 0xae, 0x61, 0x1a, 0x7e, 0x43, 0x9f, 0xea, 0xfc, 0x20, 0xd3, 0x7c, 0xa6, - 0xeb, 0xcd, 0xb3, 0x35, 0xc0, 0x3d, 0x84, 0x87, 0xab, 0x88, 0xb4, 0x85, - 0x41, 0x8f, 0xea, 0x95, 0xc9, 0x92, 0x7e, 0x04, 0xfb, 0xdd, 0x33, 0x65, - 0x2f, 0xc9, 0xc5, 0x26, 0xe2, 0x84, 0xc4, 0x47, 0x3a, 0xa0, 0x27, 0x9e, - 0xd8, 0x58, 0x25, 0xc4, 0xa2, 0x12, 0x19, 0x36, 0x27, 0x54, 0x1f, 0x6a, - 0x0e, 0x59, 0x45, 0xfc, 0x3e, 0x73, 0x87, 0x45, 0x44, 0x4e, 0xe8, 0x78, - 0xe8, 0x1b, 0x91, 0x2f, 0x8a, 0x2b, 0x78, 0xfb, 0x36, 0xa7, 0x5c, 0x7d, - 0x5e, 0x0d, 0x44, 0xb4, 0x6a, 0x75, 0xaa, 0xa2, 0x6a, 0x8b, 0x7d, 0x10, - 0x59, 0x60, 0x18, 0xd3, 0xa2, 0xab, 0x5a, 0xf5, 0xcd, 0xac, 0x07, 0xc6, - 0xf4, 0x81, 0xac, 0xca, 0xfd, 0x77, 0x20, 0x11, 0x53, 0x61, 0x1f, 0x1d, - 0xc3, 0x77, 0xea, 0xad, 0xa8, 0x88, 0x5f, 0xc1, 0xe9, 0xe4, 0xde, 0x11, - 0x4b, 0xe9, 0x76, 0x6c, 0xda, 0xfa, 0x5b, 0xbd, 0x85, 0x31, 0x40, 0x85, - 0x6a, 0x9e, 0xa7, 0x5f, 0x89, 0xb0, 0x43, 0x99, 0x23, 0x13, 0xbb, 0xfa, - 0x9b, 0xc4, 0x1f, 0x16, 0xb7, 0xa0, 0xeb, 0xfd, 0x14, 0x05, 0xb3, 0x16, - 0xe8, 0x95, 0x83, 0xfd, 0xdf, 0xed, 0x6f, 0xac, 0x58, 0x87, 0x07, 0xda, - 0xaa, 0x3b, 0xfb, 0x24, 0x6f, 0xfb, 0x43, 0x97, 0x9f, 0xec, 0x5e, 0x11, - 0x8b, 0xf1, 0xa1, 0x90, 0x8d, 0x64, 0x61, 0x3b, 0xbe, 0x22, 0xc2, 0x00, - 0x84, 0x08, 0xe0, 0xb9, 0x9e, 0x7a, 0xc1, 0xb3, 0xd8, 0xb7, 0x2a, 0xe8, - 0xe8, 0x35, 0xcc, 0xfa, 0x01, 0x7a, 0xd4, 0x2f, 0xde, 0xae, 0xb8, 0xbc, - 0xf8, 0x1a, 0xaa, 0x37, 0x59, 0x3c, 0xbd, 0xe2, 0x85, 0xe4, 0x63, 0xd0, - 0x7d, 0x1c, 0x4a, 0x35, 0xfe, 0x5a, 0x6a, 0x7b, 0x82, 0x67, 0x52, 0x6a, - 0x1a, 0x9f, 0x4c, 0x24, 0x01, 0xa1, 0xdc, 0x68, 0x07, 0xc6, 0x97, 0xa7, - 0xbe, 0x2d, 0x74, 0x42, 0x9f, 0xf9, 0x25, 0x7b, 0x91, 0x35, 0x2b, 0xa8, - 0x15, 0xc6, 0x0b, 0xf3, 0x8c, 0x1f, 0x9c, 0x81, 0xf4, 0xa0, 0x3a, 0xbb, - 0xd7, 0x11, 0xd3, 0x2a, 0xb5, 0x14, 0xbe, 0x1b, 0x77, 0xfd, 0x49, 0xfa, - 0xce, 0x6f, 0x4d, 0xc6, 0x78, 0x26, 0x53, 0xd3, 0x08, 0xba, 0xf9, 0x53, - 0x33, 0x6a, 0x0d, 0x52, 0x89, 0x4a, 0x47, 0xa9, 0x0e, 0x5f, 0x40, 0xc3, - 0xd5, 0x24, 0x15, 0x6e, 0x87, 0xaa, 0xd8, 0xb6, 0x40, 0x5f, 0xd6, 0x27, - 0xb3, 0x50, 0x19, 0x13, 0xa9, 0x22, 0x7f, 0x9c, 0xab, 0xf5, 0xd5, 0x13, - 0x85, 0x9d, 0xfc, 0x0c, 0xb4, 0x72, 0x55, 0x16, 0x52, 0x71, 0x3b, 0x1f, - 0xec, 0xc9, 0xe2, 0x49, 0x59, 0xee, 0x58, 0x36, 0x9a, 0x8f, 0x84, 0x28, - 0xbe, 0x36, 0x50, 0x24, 0x88, 0xa6, 0x8f, 0xc5, 0x8d, 0xba, 0x9b, 0x52, - 0x64, 0x93, 0xd4, 0xe5, 0xbd, 0x9c, 0x59, 0x5d, 0x00, 0xab, 0x90, 0x23, - 0xcd, 0xb7, 0x7f, 0xb1, 0x5c, 0x4a, 0x04, 0x5f, 0xfe, 0x41, 0xa2, 0x46, - 0x9c, 0x0b, 0x6a, 0x5c, 0x65, 0x9d, 0xda, 0xa9, 0x1c, 0x1b, 0x3f, 0x2a, - 0xc1, 0x72, 0xaa, 0x97, 0xac, 0xf4, 0x99, 0x91, 0x5b, 0x1a, 0xf2, 0x13, - 0x76, 0x4f, 0xf0, 0xe1, 0xe6, 0xe4, 0x01, 0x57, 0xb5, 0x47, 0xe2, 0x41, - 0xe2, 0xa7, 0xcf, 0x45, 0x41, 0x51, 0x26, 0x23, 0x44, 0x72, 0xbc, 0x6d, - 0xf6, 0x4f, 0x8e, 0xd3, 0xa2, 0xbe, 0xb7, 0x91, 0xd3, 0x3f, 0x3b, 0x24, - 0xe8, 0x64, 0x0a, 0x55, 0x46, 0x8d, 0x40, 0x77, 0x62, 0x7c, 0xdd, 0x4a, - 0x15, 0x61, 0x8c, 0xe9, 0x38, 0xb7, 0x95, 0x2a, 0x29, 0x7a, 0xe9, 0xc5, - 0xb4, 0x56, 0x6c, 0x04, 0x37, 0xdd, 0x57, 0x3a, 0x19, 0x6b, 0xb0, 0x00, - 0x14, 0x9d, 0x9a, 0xd3, 0xda, 0xa3, 0xb9, 0xd4, 0x8f, 0xf8, 0xe4, 0xed, - 0x0a, 0xb1, 0x46, 0x94, 0x36, 0x4d, 0x89, 0x41, 0x78, 0xbd, 0xc4, 0xfc, - 0x78, 0xd2, 0x13, 0x80, 0x8f, 0x34, 0x95, 0xc5, 0xbc, 0x3c, 0x69, 0xb8, - 0xd1, 0x63, 0xd0, 0x95, 0xb4, 0xe6, 0xec, 0xe7, 0x75, 0x7c, 0xaa, 0x35, - 0xe4, 0x63, 0xaf, 0x6b, 0x16, 0xd4, 0xe7, 0x1d, 0x4b, 0x7b, 0x19, 0x30, - 0xf6, 0x11, 0xfd, 0x16, 0x15, 0xc1, 0xb4, 0x05, 0xde, 0xa1, 0xc4, 0x22, - 0xc1, 0x05, 0x19, 0x55, 0x4b, 0xe1, 0x1e, 0x9a, 0x88, 0xa6, 0x31, 0x53, - 0x1d, 0x7b, 0xc7, 0xc8, 0xf2, 0x10, 0xd7, 0x01, 0xde, 0xd7, 0x7c, 0x5e, - 0x08, 0x9e, 0x04, 0x93, 0x4f, 0x27, 0x6b, 0x31, 0x69, 0xa4, 0x5d, 0xce, - 0xe1, 0x86, 0xcd, 0x0a, 0x1b, 0x66, 0x7a, 0x51, 0xef, 0xc3, 0x47, 0x9b, - 0x88, 0x8b, 0x0a, 0x9b, 0x5c, 0xd5, 0xf9, 0x18, 0xf9, 0xe4, 0x83, 0xfd, - 0xb7, 0x9b, 0x10, 0xf5, 0x7c, 0x0a, 0xba, 0x1d, 0xcc, 0x8c, 0x30, 0x14, - 0x2a, 0xce, 0x02, 0xee, 0x35, 0x8a, 0xde, 0x2c, 0xe8, 0xc6, 0x77, 0x29, - 0x4a, 0x31, 0x5c, 0x33, 0x8f, 0x8f, 0x6e, 0xb4, 0xf0, 0x52, 0x38, 0xe2, - 0x58, 0xe3, 0xd1, 0x6c, 0xe9, 0x3a, 0xce, 0xca, 0xba, 0x35, 0x0a, 0x44, - 0x4d, 0x41, 0xb0, 0x3a, 0x11, 0xef, 0x39, 0xe3, 0x87, 0x71, 0x86, 0xaf, - 0x2c, 0x71, 0x47, 0x40, 0x6b, 0xfc, 0x6c, 0xd5, 0x7d, 0x7f, 0xf1, 0xc5, - 0x4e, 0xae, 0x7b, 0x00, 0xa1, 0xb8, 0xcb, 0x7c, 0x5f, 0x2c, 0xd9, 0x21, - 0xda, 0xd6, 0xf2, 0x5d, 0x81, 0x1a, 0xb3, 0xbb, 0x41, 0x2c, 0x47, 0x3c, - 0xcd, 0x94, 0x88, 0x03, 0x07, 0x1f, 0x1b, 0x3b, 0x4e, 0xa2, 0x69, 0xdb, - 0x7a, 0xf0, 0xed, 0xf0, 0xf3, 0x19, 0x51, 0x9f, 0xab, 0x1f, 0xea, 0x8c, - 0xfa, 0xb8, 0xa1, 0xea, 0x02, 0xbd, 0x34, 0x44, 0x31, 0x2f, 0x1b, 0x44, - 0xfa, 0x56, 0x3e, 0x1a, 0xcd, 0x87, 0x50, 0x83, 0xef, 0xb8, 0xe5, 0x4f, - 0x23, 0x11, 0x21, 0x33, 0xff, 0xc6, 0xb4, 0x66, 0xcd, 0xcc, 0xec, 0xe0, - 0x3f, 0x1e, 0xad, 0x96, 0x00, 0x1f, 0x52, 0x35, 0xb5, 0x18, 0xac, 0x84, - 0x61, 0x49, 0x9b, 0x72, 0x15, 0xf8, 0x1a, 0x1f, 0xe7, 0xf0, 0x66, 0x90, - 0xb2, 0xc3, 0xa0, 0x7a, 0xb5, 0xe9, 0x02, 0xb1, 0x99, 0x87, 0x2b, 0xd6, - 0x85, 0x31, 0x1f, 0x2e, 0x0d, 0x07, 0xd5, 0x61, 0x3f, 0xf3, 0x70, 0x30, - 0x0d, 0x5e, 0x95, 0x2a, 0xe6, 0x33, 0x1b, 0x9d, 0xff, 0x93, 0xbf, 0x27, - 0xc8, 0x23, 0xbd, 0x72, 0xd3, 0x8a, 0xf8, 0xe3, 0xc1, 0xb8, 0x88, 0x45, - 0xff, 0xfb, 0x5d, 0x70, 0x85, 0x81, 0x75, 0xbb, 0x89, 0xc0, 0x75, 0x4d, - 0xfa, 0x27, 0x2c, 0x46, 0xc4, 0xb4, 0x37, 0xb4, 0xa3, 0x77, 0x46, 0x66, - 0xc0, 0x91, 0x3d, 0xf4, 0x5c, 0xde, 0x27, 0x3a, 0x26, 0x23, 0xc5, 0x2e, - 0x81, 0x2a, 0x7f, 0x0a, 0xf9, 0xa8, 0x42, 0x11, 0xd4, 0x6b, 0x23, 0x5e, - 0x71, 0x10, 0xe6, 0x63, 0xfe, 0x01, 0xcf, 0x78, 0x2b, 0x4b, 0xd9, 0xa4, - 0x87, 0x07, 0x1e, 0x93, 0x51, 0x74, 0xb2, 0xd3, 0x95, 0x06, 0x45, 0x56, - 0x2f, 0x50, 0x29, 0xad, 0xf3, 0x60, 0x34, 0x23, 0xf4, 0x09, 0xc6, 0x0a, - 0xbd, 0xc4, 0xae, 0xa1, 0x44, 0x5b, 0xd5, 0x14, 0x5f, 0xbb, 0x87, 0xeb, - 0x60, 0x5b, 0xf5, 0xa7, 0xbb, 0xf1, 0x68, 0x07, 0x71, 0x4b, 0xbc, 0x82, - 0x67, 0x5b, 0xc5, 0xd6, 0x12, 0xce, 0x60, 0xb0, 0x49, 0x90, 0x03, 0xef, - 0x03, 0xdb, 0x37, 0x87, 0xcd, 0xa0, 0x0a, 0xd3, 0x2c, 0xf3, 0x5f, 0x51, - 0xcd, 0x38, 0xb5, 0xf2, 0xe0, 0x42, 0xe8, 0xfc, 0x15, 0x12, 0x04, 0x29, - 0xcd, 0x03, 0x93, 0x9b, 0xc6, 0x7f, 0x3a, 0x28, 0x56, 0xe5, 0x2d, 0xd9, - 0x5f, 0xac, 0xf9, 0x03, 0xc6, 0xd6, 0xcd, 0xb5, 0xb1, 0xe2, 0xf2, 0xd7, - 0xd9, 0xaf, 0xe7, 0xa9, 0xdb, 0xa7, 0x04, 0x28, 0x9d, 0xe8, 0x35, 0x49, - 0x6c, 0xff, 0xd2, 0x89, 0xc1, 0x9b, 0x7d, 0xc2, 0x13, 0x47, 0xb8, 0x49, - 0x8c, 0x4f, 0x28, 0xc8, 0x83, 0x77, 0x83, 0x22, 0xfe, 0x7a, 0x64, 0x7b, - 0x21, 0xda, 0x7c, 0x3b, 0x14, 0xda, 0x40, 0xb6, 0x2c, 0xdc, 0x2f, 0xe9, - 0x80, 0x73, 0x61, 0x57, 0x94, 0x29, 0xa6, 0x10, 0xba, 0x38, 0xf6, 0x84, - 0x5c, 0x14, 0x3b, 0xda, 0x29, 0x25, 0xba, 0x26, 0x7c, 0x19, 0xbc, 0x4b, - 0x85, 0x25, 0x41, 0x51, 0x40, 0x47, 0x68, 0xd2, 0x2e, 0x65, 0xca, 0xa4, - 0x86, 0x08, 0x40, 0xdd, 0xf8, 0x4e, 0xe4, 0x2c, 0xa9, 0xe1, 0x62, 0x0b, - 0xad, 0x27, 0x36, 0x49, 0xa2, 0xd4, 0xc0, 0xa6, 0xe1, 0x5d, 0xb2, 0x35, - 0x3b, 0x50, 0x77, 0x4a, 0xbb, 0xde, 0xa7, 0xb2, 0xb5, 0xd3, 0x67, 0xc7, - 0xfc, 0xdc, 0x4d, 0x86, 0x80, 0x83, 0x36, 0xc7, 0x30, 0xe5, 0x0f, 0xae, - 0xfa, 0xc5, 0x85, 0xc8, 0x97, 0xee, 0xb1, 0x42, 0x6b, 0x27, 0xe6, 0xa2, - 0x79, 0xf7, 0x2b, 0x3d, 0x07, 0x70, 0x0b, 0x9f, 0x11, 0xbb, 0x06, 0xf8, - 0x22, 0x94, 0x9a, 0xd7, 0x6f, 0x12, 0xb4, 0xee, 0xf6, 0x32, 0xc6, 0x6c, - 0x1a, 0xaf, 0x48, 0x2c, 0xfb, 0xa3, 0x2c, 0x45, 0xe1, 0xcd, 0x62, 0x24, - 0x05, 0x0e, 0x09, 0x2f, 0xf4, 0x9c, 0x55, 0xe1, 0xac, 0x68, 0x29, 0x5b, - 0xd0, 0x64, 0xd8, 0xbf, 0x97, 0x5f, 0xc8, 0x8b, 0xe9, 0x99, 0x6b, 0x71, - 0x1a, 0x06, 0xda, 0x95, 0x86, 0x72, 0xd9, 0x6e, 0x2b, 0x6c, 0xfc, 0x99, - 0xff, 0xbe, 0x62, 0x91, 0x96, 0xcf, 0x42, 0xfd, 0x94, 0xab, 0xb8, 0x06, - 0xe1, 0x00, 0xd1, 0x35, 0xe2, 0x72, 0x31, 0xe9, 0xdc, 0x2c, 0x79, 0xf8, - 0xe9, 0x07, 0xf6, 0xf2, 0xbb, 0x07, 0x7d, 0xbd, 0x04, 0x47, 0xd0, 0xf3, - 0xed, 0xeb, 0x94, 0x92, 0x10, 0x96, 0x67, 0x12, 0x10, 0x4e, 0xee, 0x98, - 0xf2, 0x32, 0xe3, 0xee, 0x69, 0x94, 0x1b, 0x9b, 0x8d, 0x48, 0x31, 0x3c, - 0x4f, 0x96, 0xa3, 0x98, 0xf5, 0x51, 0xae, 0x1d, 0x17, 0x4b, 0x78, 0x9e, - 0x58, 0xaf, 0x44, 0xad, 0x6e, 0x83, 0x9c, 0x98, 0x2e, 0xd4, 0xae, 0xfe, - 0x2e, 0x55, 0xf9, 0xae, 0x49, 0xe6, 0x07, 0x04, 0x9b, 0xbe, 0x70, 0x6e, - 0x31, 0x1c, 0x00, 0x16, 0xf8, 0x94, 0xba, 0x0a, 0x30, 0x97, 0x55, 0xc9, - 0xcb, 0x1b, 0xad, 0xa4, 0x54, 0x08, 0x0a, 0xf8, 0x22, 0x53, 0x0f, 0x3e, - 0xe4, 0x4a, 0x5a, 0x58, 0x15, 0x4a, 0xed, 0x48, 0xbc, 0x5c, 0x8c, 0xe6, - 0x78, 0x3e, 0x37, 0xb4, 0x2e, 0xa1, 0x27, 0x00, 0x59, 0x38, 0xcc, 0x3a, - 0x64, 0x0c, 0xfc, 0x71, 0xd8, 0x47, 0x62, 0x9d, 0x71, 0x4d, 0xa0, 0x40, - 0x74, 0x57, 0xac, 0x86, 0xb0, 0x37, 0xc3, 0x4b, 0xed, 0xbc, 0xf8, 0xb4, - 0x42, 0x36, 0x7d, 0x1f, 0xff, 0xd7, 0x41, 0x56, 0x0a, 0x06, 0x0e, 0x81, - 0x88, 0x74, 0xdf, 0xf6, 0x92, 0x3c, 0x61, 0xa0, 0xf2, 0xcf, 0x95, 0xac, - 0x4d, 0x1b, 0xf9, 0x28, 0x14, 0x0b, 0x42, 0x6b, 0x20, 0xbe, 0x07, 0x93, - 0xa3, 0x72, 0x7d, 0x53, 0x45, 0xc6, 0x8a, 0xda, 0x2f, 0xec, 0xd9, 0xf8, - 0xfd, 0x1b, 0x2c, 0xd1, 0x80, 0x51, 0xd6, 0xf1, 0x9e, 0x07, 0xc0, 0x84, - 0x6c, 0x50, 0x84, 0x84, 0x6a, 0xf8, 0x4c, 0xe0, 0xfa, 0x23, 0xb0, 0x1a, - 0x6e, 0x18, 0x41, 0x71, 0x70, 0x81, 0x4c, 0x46, 0x92, 0x5e, 0x57, 0x3a, - 0x43, 0x8c, 0xed, 0x97, 0xb4, 0x4e, 0x2a, 0x2a, 0x3a, 0xea, 0xf4, 0x19, - 0xe5, 0xdb, 0x20, 0x7f, 0x7e, 0x18, 0xfe, 0x63, 0xbe, 0x5c, 0x7b, 0xbe, - 0xa6, 0xc2, 0x6e, 0xc4, 0xcf, 0xdd, 0x06, 0xa6, 0x9e, 0xe8, 0x0e, 0x5f, - 0x05, 0x6e, 0x13, 0x24, 0x4f, 0xca, 0x66, 0x9e, 0x1d, 0x61, 0xf2, 0x37, - 0xdb, 0x3b, 0x23, 0x54, 0x64, 0x16, 0x52, 0x2a, 0xbb, 0x04, 0x86, 0x28, - 0xc7, 0xf0, 0xb7, 0x00, 0x72, 0x08, 0xcb, 0x3e, 0xab, 0xc5, 0x94, 0x63, - 0xb2, 0x52, 0x7b, 0x7e, 0xe4, 0x2a, 0xc8, 0xf5, 0xb8, 0x7d, 0x5e, 0xdf, - 0x57, 0x08, 0x93, 0x9a, 0xe4, 0xbb, 0x23, 0x9e, 0x64, 0xf4, 0xbb, 0x5d, - 0x5e, 0x8e, 0xc0, 0xf4, 0xda, 0x29, 0x82, 0x81, 0xaf, 0xc0, 0x1f, 0x79, - 0x17, 0xe9, 0xab, 0x80, 0x87, 0xf4, 0xed, 0x94, 0x3b, 0xf1, 0x94, 0x8d, - 0xfa, 0xf4, 0x82, 0x65, 0xd4, 0x37, 0x67, 0x3f, 0x8c, 0x9f, 0x7e, 0x98, - 0x75, 0xb3, 0x0c, 0x9a, 0x5f, 0xc2, 0xb3, 0xdc, 0x0e, 0xfe, 0x9d, 0x91, - 0x76, 0xce, 0xb4, 0xc7, 0x62, 0xb0, 0xee, 0x47, 0x5f, 0x80, 0xb5, 0x0c, - 0x71, 0xab, 0x87, 0x95, 0x1e, 0x02, 0xdc, 0xac, 0x44, 0xc9, 0xd4, 0x89, - 0xb4, 0x7d, 0xf4, 0x2f, 0x1f, 0x15, 0xbd, 0x9f, 0xb4, 0x81, 0x84, 0xae, - 0x77, 0x46, 0x02, 0x61, 0x14, 0x26, 0x87, 0x25, 0xf6, 0x47, 0x88, 0xae, - 0x26, 0xd0, 0x64, 0x66, 0x8a, 0xc6, 0x1f, 0xa5, 0xe7, 0xa4, 0x40, 0x21, - 0x9d, 0x5c, 0x6a, 0xe6, 0x31, 0x31, 0x5e, 0x01, 0xfc, 0x68, 0xff, 0x58, - 0x2a, 0xa6, 0xa3, 0x1a, 0xc9, 0x94, 0x77, 0xa7, 0x6f, 0x95, 0x20, 0x5c, - 0xe1, 0x99, 0x48, 0xe9, 0x45, 0xd2, 0x76, 0x8e, 0xb4, 0xc1, 0x50, 0xd9, - 0x80, 0xa0, 0xf2, 0x3e, 0xfe, 0xc9, 0xe8, 0x3a, 0xdf, 0x31, 0xea, 0xa0, - 0xaa, 0x70, 0xcb, 0xde, 0xca, 0x7b, 0xab, 0x33, 0xa1, 0x72, 0x71, 0xd9, - 0x8b, 0x91, 0x8e, 0x3c, 0x25, 0x21, 0xd4, 0x22, 0x88, 0xbb, 0xc5, 0x14, - 0x71, 0x5f, 0x1a, 0x87, 0xd5, 0x39, 0x90, 0xdd, 0x34, 0x8d, 0xc1, 0x1e, - 0x72, 0x26, 0x12, 0x0a, 0x8d, 0xff, 0x97, 0xde, 0x4a, 0xba, 0x12, 0x2a, - 0xb3, 0xc7, 0xa0, 0x53, 0x23, 0x08, 0xcb, 0xdb, 0xa9, 0x33, 0x91, 0xb7, - 0x4c, 0x53, 0x8c, 0x67, 0x57, 0x85, 0xc9, 0xab, 0xb7, 0xa7, 0x3f, 0xfa, - 0xa9, 0xf5, 0xac, 0xb0, 0x57, 0xe0, 0x65, 0xb3, 0x7d, 0xfe, 0xdb, 0x40, - 0x06, 0xb6, 0xb2, 0x45, 0x62, 0xd3, 0x44, 0x7c, 0xcd, 0xf8, 0x9f, 0xf9, - 0x68, 0x90, 0x6d, 0xad, 0xcd, 0xd5, 0x7c, 0xbe, 0x67, 0x16, 0x07, 0xf8, - 0x5a, 0x2a, 0x56, 0xe8, 0x98, 0xf4, 0xde, 0xf9, 0x6e, 0xf5, 0x8b, 0x0d, - 0x65, 0xf8, 0x6b, 0x65, 0xaa, 0xec, 0xa4, 0xb4, 0xac, 0x9b, 0xb7, 0xed, - 0xed, 0x3d, 0x0d, 0x23, 0xbd, 0xa2, 0x65, 0x87, 0x9d, 0xf4, 0xfb, 0x5e, - 0xeb, 0x2e, 0x06, 0xe1, 0x7d, 0xf7, 0x2b, 0xb2, 0x76, 0x07, 0x27, 0xc6, - 0x1d, 0xc3, 0xc4, 0x27, 0xd7, 0x45, 0xb8, 0xef, 0xe2, 0x4b, 0xc2, 0xd3, - 0x86, 0x62, 0x3a, 0x41, 0x77, 0x0d, 0x50, 0xef, 0x40, 0xd1, 0x5e, 0x56, - 0x7b, 0x68, 0x98, 0x87, 0x3b, 0x66, 0xad, 0x7d, 0xfa, 0xe3, 0xa3, 0x7f, - 0xc9, 0xb3, 0x23, 0x82, 0x53, 0x44, 0x01, 0xe8, 0xf8, 0xa3, 0x21, 0xcb, - 0x0a, 0x4a, 0xbe, 0xf1, 0x91, 0x80, 0x16, 0x3e, 0x67, 0x75, 0x3a, 0x3c, - 0x1a, 0x55, 0x4c, 0x36, 0x7a, 0xa7, 0xfd, 0x5e, 0xa9, 0xd5, 0x90, 0xb7, - 0x4f, 0x37, 0x21, 0xce, 0x15, 0xd7, 0xd4, 0x51, 0x57, 0xe7, 0x49, 0xce, - 0xa3, 0xe0, 0xae, 0x4a, 0x92, 0x26, 0xe7, 0xa0, 0xab, 0x0e, 0xcc, 0x3a, - 0xc9, 0x7d, 0xf8, 0x14, 0x86, 0x7c, 0xfd, 0x58, 0xc3, 0xe4, 0xff, 0xf0, - 0x8a, 0x91, 0xcb, 0x4f, 0x7a, 0x12, 0x4a, 0x1d, 0xd8, 0x99, 0xd2, 0x59, - 0xc0, 0xe3, 0xbf, 0x1f, 0x3d, 0x7d, 0x2c, 0xe8, 0x39, 0xf8, 0x76, 0xa9, - 0xd0, 0x17, 0x60, 0x59, 0x5b, 0x38, 0x73, 0xa2, 0x72, 0x3d, 0xbc, 0x85, - 0xfd, 0x6f, 0x55, 0x07, 0xfc, 0x5d, 0xdc, 0x6f, 0x3b, 0xcc, 0xa0, 0x73, - 0xe3, 0x32, 0x9d, 0xe0, 0x77, 0xa3, 0xb6, 0xb3, 0x71, 0xf3, 0x37, 0xab, - 0x6a, 0x2e, 0x62, 0xe1, 0x22, 0x91, 0x16, 0x0f, 0x98, 0xa0, 0x96, 0x0e, - 0x24, 0xfa, 0x60, 0x10, 0xae, 0x4a, 0x2c, 0x98, 0xe9, 0xf5, 0x97, 0x54, - 0x85, 0x91, 0x97, 0x74, 0x70, 0xdf, 0xc8, 0xe3, 0x7b, 0xdd, 0x6e, 0xbc, - 0xd6, 0x80, 0x21, 0x0b, 0xa5, 0x44, 0xd0, 0x79, 0xe3, 0xae, 0x4a, 0x93, - 0x6d, 0xd6, 0x43, 0xb5, 0x99, 0xa0, 0x36, 0xb0, 0xd5, 0x95, 0xd7, 0xc7, - 0x87, 0xfd, 0xd9, 0x4c, 0x23, 0x4c, 0x7c, 0xd0, 0xbb, 0xe6, 0x30, 0xb5, - 0x81, 0xec, 0x40, 0x77, 0xec, 0x3e, 0x0e, 0x0a, 0xd1, 0x74, 0x10, 0x22, - 0x6a, 0x28, 0x14, 0x50, 0x44, 0x52, 0x4d, 0x3c, 0x39, 0x91, 0x54, 0x47, - 0x8f, 0x81, 0x3e, 0xa1, 0xb3, 0xab, 0xda, 0x24, 0xe2, 0x2e, 0x1c, 0x2e, - 0x63, 0x25, 0x3b, 0xf2, 0x1b, 0x5d, 0x89, 0xae, 0xb6, 0xaa, 0xea, 0xfc, - 0xbb, 0x6e, 0x0e, 0x33, 0xdf, 0x7a, 0x2a, 0x4b, 0x48, 0xd5, 0xd3, 0x65, - 0x23, 0x2a, 0x35, 0x67, 0x7c, 0xee, 0xa0, 0x5f, 0x31, 0x48, 0xf4, 0x41, - 0x7d, 0x1f, 0x7d, 0xa7, 0x6f, 0x55, 0x29, 0xd0, 0xf9, 0x2a, 0x26, 0x4e, - 0xfc, 0x35, 0x80, 0x21, 0x8e, 0x7f, 0x80, 0x46, 0x7d, 0x2f, 0xc0, 0xb7, - 0x1e, 0xfd, 0xb7, 0x83, 0x19, 0xe8, 0x7e, 0x6d, 0xaa, 0x22, 0x89, 0xcc, - 0x2d, 0x58, 0xe4, 0xef, 0x33, 0x41, 0x9e, 0xc5, 0xd2, 0x37, 0x91, 0xbb, - 0xec, 0x04, 0x73, 0xc7, 0xe6, 0xcb, 0x81, 0x2d, 0x13, 0x2b, 0x72, 0xf0, - 0x91, 0xe5, 0x29, 0x34, 0xaf, 0x79, 0xfb, 0xc2, 0x64, 0xb3, 0x99, 0x55, - 0x29, 0x89, 0x31, 0x2c, 0x9f, 0x39, 0x0d, 0xd4, 0x27, 0x55, 0x20, 0xce, - 0xac, 0x7e, 0xb5, 0xa8, 0xd2, 0x03, 0x2d, 0xe2, 0xde, 0x5d, 0xd4, 0xab, - 0x65, 0x4b, 0xbf, 0xa7, 0x2e, 0x42, 0xfd, 0x07, 0x76, 0x5e, 0xe0, 0xd8, - 0xe3, 0x06, 0x63, 0xa3, 0x2a, 0xa8, 0x0f, 0x25, 0x95, 0x8f, 0x83, 0x62, - 0x52, 0x0a, 0xb9, 0x3a, 0xcb, 0x96, 0x10, 0x8f, 0x19, 0xd9, 0x8e, 0x9e, - 0x30, 0xb0, 0xe6, 0x38, 0x8c, 0xd1, 0x6f, 0xed, 0x05, 0x53, 0x74, 0xcf, - 0x4b, 0x44, 0xe5, 0xb5, 0xe1, 0xa1, 0x82, 0x1f, 0xbc, 0xa1, 0xdd, 0x93, - 0x5f, 0x82, 0xe5, 0x42, 0x6b, 0xe0, 0xe1, 0x22, 0x6e, 0x70, 0x59, 0x2f, - 0xb8, 0x77, 0xd2, 0xd0, 0x8b, 0x27, 0xf1, 0x26, 0xcc, 0xc7, 0x57, 0xda, - 0xe4, 0xe3, 0x5c, 0x05, 0x9e, 0x96, 0xb0, 0x2c, 0x82, 0xdc, 0x51, 0xb4, - 0x98, 0x67, 0xa3, 0x4a, 0xaf, 0x92, 0xe1, 0x89, 0xb0, 0x30, 0x90, 0x59, - 0xec, 0xc7, 0xc7, 0x8b, 0xda, 0xf2, 0x5b, 0xba, 0x5b, 0x02, 0x71, 0x22, - 0x47, 0x3f, 0x8e, 0x3d, 0x7d, 0xdd, 0x32, 0xf8, 0xc7, 0xb2, 0x35, 0x07, - 0xcf, 0x5a, 0x68, 0x50, 0x08, 0x65, 0xec, 0xe0, 0xb8, 0x2c, 0x9d, 0x09, - 0x99, 0x2c, 0x55, 0x32, 0x88, 0xde, 0x3f, 0x27, 0xb9, 0x60, 0x8d, 0x91, - 0x7d, 0x27, 0x39, 0xf8, 0xe1, 0xaf, 0xa8, 0x47, 0x5e, 0x01, 0x3f, 0xdf, - 0xe3, 0x48, 0xd4, 0x27, 0xe4, 0x0e, 0x01, 0xbb, 0xc7, 0x74, 0x7c, 0x69, - 0x11, 0x50, 0xdf, 0x56, 0x99, 0xba, 0x2d, 0xb3, 0xd2, 0xf4, 0xfb, 0x84, - 0x6c, 0x32, 0x62, 0x0d, 0xc2, 0xb9, 0xe6, 0x78, 0xc2, 0x22, 0x2b, 0x70, - 0x9e, 0x35, 0x2a, 0x8f, 0xee, 0xa3, 0xe7, 0x25, 0xba, 0x71, 0x1f, 0xba, - 0x4a, 0x0c, 0x99, 0x44, 0x35, 0x6e, 0x45, 0x6a, 0x16, 0x7d, 0x93, 0x98, - 0x31, 0x1a, 0x85, 0x78, 0x34, 0x5b, 0xfc, 0x59, 0xa0, 0xc7, 0xe5, 0x32, - 0xcc, 0x1a, 0x8f, 0x83, 0x26, 0x9b, 0x24, 0xcb, 0x49, 0x5e, 0x8d, 0x4b, - 0x89, 0x9b, 0x48, 0x45, 0xf4, 0xdb, 0x37, 0x2c, 0x34, 0x9d, 0x8e, 0x55, - 0xa0, 0x4b, 0x45, 0x81, 0x60, 0x17, 0x1d, 0x76, 0x95, 0xea, 0x13, 0x29, - 0x7b, 0x38, 0x6c, 0xd0, 0xec, 0xb8, 0x1c, 0xf1, 0xe9, 0x96, 0xf0, 0x02, - 0xed, 0xab, 0x4c, 0x53, 0xcb, 0x81, 0x06, 0x88, 0x27, 0xac, 0xab, 0x80, - 0xb4, 0x2b, 0x03, 0x1f, 0x08, 0x3d, 0x5f, 0xbd, 0xea, 0x12, 0x8c, 0x1f, - 0x63, 0x47, 0xf6, 0x07, 0xca, 0x1b, 0x25, 0x7e, 0x98, 0x11, 0xdf, 0x63, - 0x15, 0xc4, 0xd1, 0x78, 0x1a, 0x54, 0x1f, 0x9f, 0xb3, 0xde, 0xfc, 0x39, - 0x06, 0x10, 0x84, 0x17, 0x78, 0x27, 0x84, 0x52, 0x2a, 0x13, 0x03, 0x38, - 0xd6, 0xb0, 0xad, 0x5e, 0x9d, 0x7c, 0x25, 0x8a, 0xf6, 0x81, 0x8c, 0xc9, - 0xcd, 0xf6, 0xfa, 0x2f, 0x13, 0xa6, 0x49, 0x2c, 0x3b, 0xfd, 0xcb, 0x52, - 0x25, 0x03, 0x4d, 0x91, 0xb8, 0x65, 0x74, 0xe4, 0x5d, 0xf2, 0x48, 0x7e, - 0x2f, 0x9b, 0xec, 0x2f, 0x0a, 0xc6, 0x43, 0x8e, 0xeb, 0x43, 0x35, 0xbd, - 0xa5, 0x92, 0x84, 0x5e, 0x91, 0x35, 0xe7, 0xb8, 0xc1, 0x39, 0x54, 0x66, - 0x34, 0x01, 0x8e, 0x25, 0x91, 0x7f, 0x1d, 0x22, 0x38, 0xca, 0x64, 0xa8, - 0x1d, 0xf1, 0x82, 0xf9, 0x84, 0xd7, 0x53, 0x49, 0x62, 0x4f, 0xf7, 0x11, - 0xb4, 0x57, 0x28, 0xee, 0x4d, 0x61, 0x82, 0xee, 0x54, 0x1b, 0xba, 0xd4, - 0x8f, 0x6c, 0x65, 0x3b, 0x08, 0x91, 0xc5, 0xd5, 0xde, 0x37, 0xf8, 0xce, - 0x4c, 0xda, 0x55, 0xab, 0x36, 0x7d, 0x54, 0xfa, 0x6f, 0xfa, 0xc0, 0x42, - 0x3b, 0xce, 0xaa, 0x65, 0x8e, 0xb2, 0xe2, 0x4c, 0x4f, 0xd2, 0x47, 0x54, - 0x3f, 0xdc, 0xfd, 0x54, 0x67, 0x9e, 0x02, 0xc5, 0xc5, 0x85, 0x2b, 0xa0, - 0x01, 0xb3, 0xf1, 0xea, 0x36, 0xd7, 0x98, 0xf7, 0x8d, 0xc8, 0xfc, 0x48, - 0x08, 0x49, 0xa1, 0xea, 0x7f, 0x03, 0xce, 0xbe, 0x6a, 0xb3, 0x50, 0x4a, - 0x6c, 0x87, 0x21, 0x59, 0xaf, 0xbe, 0xa3, 0xa1, 0x75, 0x52, 0x3b, 0x42, - 0x1e, 0x36, 0xee, 0x5d, 0xbb, 0x9c, 0x38, 0x26, 0x11, 0x43, 0xea, 0x2b, - 0xd6, 0xac, 0x96, 0x1c, 0x15, 0x2c, 0xf4, 0xbb, 0x30, 0xb5, 0x0d, 0xcf, - 0xde, 0x0e, 0xb7, 0x1f, 0x2f, 0x47, 0x21, 0x78, 0x34, 0xf7, 0x30, 0x6b, - 0xf6, 0xda, 0x66, 0x3c, 0xd1, 0x1b, 0x92, 0xfd, 0xaa, 0x7a, 0xbd, 0xd7, - 0xed, 0x7a, 0xd5, 0xbf, 0x04, 0x05, 0x27, 0xb3, 0x57, 0xe9, 0x5b, 0xba, - 0xc8, 0x84, 0x2a, 0x4c, 0xff, 0xae, 0xe8, 0xec, 0x31, 0x19, 0xd8, 0x2b, - 0x82, 0xea, 0x98, 0xba, 0xe3, 0x6f, 0xca, 0xfe, 0x71, 0x7b, 0xb6, 0xb6, - 0xb8, 0x12, 0x50, 0x0a, 0xa6, 0x85, 0x22, 0x09, 0x7c, 0x9c, 0x67, 0x21, - 0x55, 0xd8, 0x3b, 0x2b, 0x72, 0x60, 0xdf, 0x5f, 0x59, 0x2c, 0x25, 0xce, - 0x79, 0x17, 0x9d, 0xe7, 0xf4, 0x93, 0x2a, 0x9c, 0xac, 0x41, 0x56, 0x5c, - 0x42, 0x31, 0x6e, 0x85, 0xf0, 0xb1, 0x9e, 0xa6, 0x5e, 0x7b, 0xcc, 0xdc, - 0xe9, 0x9f, 0xcd, 0x79, 0x80, 0x7a, 0xee, 0x57, 0xff, 0x14, 0x56, 0x00, - 0x82, 0x81, 0xfc, 0x38, 0xdb, 0x35, 0x89, 0x16, 0x75, 0xd4, 0x9f, 0x61, - 0x7e, 0x96, 0xe8, 0x01, 0x5d, 0x9d, 0xc4, 0xf7, 0x9d, 0x89, 0x8f, 0x54, - 0x68, 0xd0, 0x36, 0xe1, 0x14, 0xa2, 0x62, 0x36, 0x99, 0x32, 0xce, 0x25, - 0xff, 0x26, 0xc9, 0xb4, 0xec, 0x29, 0xe7, 0x45, 0x7e, 0x16, 0xc0, 0x7c, - 0x6f, 0xf5, 0x2a, 0x99, 0xb6, 0x01, 0x06, 0xf9, 0x70, 0xc3, 0xdd, 0xb8, - 0xbb, 0x0a, 0x73, 0xe4, 0x20, 0x9d, 0x82, 0x1c, 0x60, 0x4d, 0x7d, 0x7d, - 0x16, 0xf5, 0x12, 0x8f, 0xb2, 0x7f, 0x36, 0x37, 0x8b, 0x19, 0xfc, 0xf3, - 0x4a, 0xff, 0x95, 0x62, 0xe8, 0xec, 0x6a, 0x04, 0x65, 0x60, 0xbe, 0xf1, - 0x45, 0x99, 0xee, 0x7e, 0x40, 0x31, 0x03, 0x69, 0xda, 0xc9, 0x83, 0x23, - 0x55, 0xe9, 0xd0, 0x77, 0x3e, 0xc2, 0x80, 0x67, 0x56, 0x09, 0x84, 0x73, - 0x90, 0x65, 0x0d, 0x84, 0x3e, 0xd3, 0x5d, 0x86, 0xd5, 0x7b, 0x0c, 0x2a, - 0xce, 0xc3, 0xd1, 0xca, 0xde, 0xba, 0x18, 0x84, 0x8f, 0x58, 0xd1, 0x76, - 0x99, 0x3d, 0x69, 0x80, 0x57, 0xbb, 0xf7, 0xaf, 0x11, 0x6d, 0xfb, 0xae, - 0x73, 0xf3, 0x28, 0xb6, 0x41, 0xea, 0xf5, 0x8b, 0x09, 0x31, 0xf3, 0x83, - 0x2c, 0xe1, 0x7f, 0x06, 0x3a, 0x75, 0x47, 0xf5, 0xd4, 0xd5, 0xe9, 0x33, - 0xa6, 0xe5, 0x8e, 0xf0, 0xe3, 0x24, 0x28, 0x09, 0x06, 0x93, 0x0e, 0xce, - 0x95, 0xed, 0xbc, 0x4d, 0x7e, 0x19, 0x21, 0xd0, 0x1a, 0x65, 0xbf, 0xcf, - 0x4e, 0x6c, 0xe2, 0xb3, 0x01, 0x56, 0x4f, 0x1f, 0xf9, 0xb7, 0xbf, 0x16, - 0x52, 0xa4, 0x2f, 0xc2, 0xbd, 0xc1, 0xdf, 0xf8, 0xc3, 0xd6, 0x87, 0xcd, - 0x29, 0x7a, 0x39, 0x4e, 0xe4, 0xf2, 0x55, 0x47, 0xc2, 0xe4, 0x3c, 0x22, - 0x64, 0x6f, 0x9b, 0x6c, 0xa1, 0xcf, 0xdf, 0xe8, 0x86, 0x16, 0x9a, 0x9c, - 0xd9, 0x4f, 0x15, 0x9e, 0x24, 0xfb, 0xbc, 0xf9, 0xc0, 0x10, 0x9c, 0x71, - 0xfe, 0x5e, 0x7e, 0xb6, 0x5d, 0xfc, 0x3d, 0xd0, 0xff, 0xaf, 0xec, 0x15, - 0x46, 0x15, 0x01, 0x01, 0x10, 0xf9, 0x36, 0xed, 0x7d, 0x05, 0x54, 0xa9, - 0x75, 0xcc, 0x22, 0xb0, 0x94, 0xfe, 0xc8, 0x46, 0x41, 0xcf, 0xf2, 0xf9, - 0x13, 0xe3, 0xad, 0x57, 0xef, 0xb4, 0x87, 0x21, 0x0b, 0x22, 0x67, 0x0b, - 0x07, 0x3b, 0xf5, 0x14, 0xb0, 0x7e, 0xec, 0x1b, 0x91, 0x2c, 0x58, 0x4d, - 0xd5, 0xf8, 0x04, 0x37, 0x5f, 0xb5, 0x5c, 0xfd, 0x19, 0xac, 0xc0, 0xad, - 0xbf, 0x8e, 0xdd, 0x87, 0xa6, 0x05, 0xa9, 0x24, 0x00, 0x01, 0xed, 0xe5, - 0x07, 0x8d, 0xad, 0x6b, 0xce, 0xd1, 0xe4, 0x35, 0xb0, 0xb6, 0x74, 0xe9, - 0xfe, 0x4b, 0x5a, 0x1f, 0x6e, 0x77, 0xae, 0xca, 0x5c, 0xa7, 0x11, 0xb9, - 0xaf, 0xc0, 0x48, 0x68, 0xac, 0x57, 0xb1, 0x46, 0xd3, 0xaf, 0x94, 0x89, - 0xf1, 0x8f, 0x13, 0x67, 0xcc, 0x7a, 0xf2, 0xde, 0x41, 0x2e, 0x5a, 0xfb, - 0xdd, 0x29, 0xd5, 0xce, 0x4d, 0x4b, 0xab, 0xf6, 0x9c, 0x72, 0x7c, 0xa7, - 0xea, 0x09, 0xdc, 0x7a, 0xd5, 0x40, 0x18, 0xde, 0x0c, 0xac, 0xff, 0x84, - 0x0f, 0xa0, 0x72, 0x2a, 0x87, 0xf2, 0xae, 0x33, 0x57, 0xeb, 0x13, 0x5f, - 0x20, 0x09, 0xc2, 0x54, 0x2e, 0x53, 0x2b, 0x24, 0xa1, 0x8c, 0x02, 0x19, - 0xbb, 0x84, 0xd8, 0xa2, 0x0a, 0xa7, 0x96, 0xcb, 0xa3, 0xa6, 0x93, 0xc9, - 0x3a, 0x04, 0xaa, 0x3d, 0x15, 0x7f, 0xc9, 0x04, 0x7f, 0xa8, 0xde, 0x37, - 0xa5, 0x10, 0xbe, 0xe7, 0x1e, 0x7f, 0x2d, 0xbb, 0x8b, 0x13, 0x80, 0x3e, - 0x36, 0x03, 0xeb, 0x6a, 0xe1, 0x22, 0x7c, 0x30, 0x92, 0x3c, 0x70, 0xda, - 0xf1, 0x76, 0x82, 0x7b, 0x0d, 0x7b, 0xa7, 0x86, 0x02, 0x7b, 0xe3, 0x8b, - 0x80, 0x62, 0x2b, 0x23, 0xb0, 0x2f, 0x03, 0x2e, 0x60, 0xb1, 0x56, 0x8b, - 0xb0, 0xd7, 0x55, 0x03, 0xc2, 0x8f, 0x2d, 0x2c, 0x8c, 0x5b, 0x7d, 0xae, - 0xb1, 0x37, 0xbc, 0xff, 0xfe, 0x50, 0xb0, 0x5d, 0x04, 0x5c, 0xd6, 0xee, - 0xcc, 0xbb, 0x1c, 0x5e, 0xf6, 0x92, 0xbf, 0x0b, 0xf4, 0x7d, 0x6b, 0xdf, - 0xfb, 0x51, 0x87, 0xe6, 0xec, 0x6c, 0x5f, 0xbc, 0x4b, 0xad, 0xb9, 0x6f, - 0xa4, 0x03, 0x9c, 0xe5, 0x33, 0xc6, 0x89, 0x67, 0xec, 0x51, 0x7d, 0xd3, - 0x2c, 0x91, 0x49, 0xb6, 0x2a, 0xdb, 0x83, 0xc7, 0x0a, 0xd7, 0xd4, 0x7d, - 0xcf, 0x4d, 0xe2, 0xf5, 0xd0, 0x0b, 0x15, 0x21, 0x01, 0xf1, 0xb7, 0x43, - 0x97, 0x9d, 0x10, 0xf5, 0x0b, 0x3b, 0xb4, 0xbf, 0xa4, 0x6a, 0x83, 0xf7, - 0xe5, 0x48, 0xeb, 0x54, 0x1f, 0xa0, 0x5e, 0x2a, 0xc1, 0x87, 0x5e, 0x11, - 0xfe, 0xb6, 0x94, 0xf8, 0x05, 0xda, 0x20, 0x3b, 0xac, 0x18, 0xb2, 0x6e, - 0x7b, 0x98, 0xff, 0x6c, 0x86, 0xfc, 0x1b, 0x68, 0x3f, 0xff, 0x08, 0x6e, - 0x05, 0x57, 0x84, 0xec, 0x6b, 0x66, 0xd5, 0x41, 0x17, 0xa4, 0x84, 0x7c, - 0xfd, 0x4e, 0x6c, 0x01, 0x88, 0x74, 0x22, 0x97, 0x8d, 0xcb, 0xdd, 0x45, - 0x87, 0xee, 0x96, 0xde, 0x3e, 0x8c, 0xea, 0xee, 0xd6, 0x2e, 0x6a, 0x89, - 0x3f, 0xfc, 0xb8, 0x80, 0xab, 0x5f, 0xda, 0xa2, 0x9b, 0xc0, 0x1e, 0x60, - 0xc9, 0xd0, 0x6c, 0xf5, 0x28, 0xb8, 0xb8, 0x65, 0x41, 0x54, 0xd6, 0xe0, - 0xdc, 0xd2, 0x14, 0x02, 0xbd, 0xc9, 0x51, 0xd4, 0x17, 0x8f, 0x86, 0xce, - 0x49, 0x77, 0xdf, 0x76, 0xdf, 0x09, 0xe2, 0x43, 0x85, 0x3a, 0x06, 0xbb, - 0x16, 0x87, 0xa6, 0x18, 0x16, 0x4f, 0x72, 0x9e, 0x09, 0xa4, 0x1a, 0xe8, - 0xe9, 0x2c, 0xe2, 0xc2, 0x37, 0x32, 0xfc, 0xdd, 0x01, 0x55, 0xa9, 0xd5, - 0x29, 0x8e, 0xf1, 0x96, 0x12, 0x9a, 0x3d, 0x88, 0x8e, 0x9f, 0x59, 0x35, - 0x6f, 0x33, 0xc0, 0xb6, 0x03, 0xbd, 0xa3, 0x1d, 0x2e, 0x5e, 0xb0, 0xbe, - 0xe4, 0x64, 0xce, 0x1f, 0x04, 0x08, 0x04, 0xe4, 0x6d, 0x38, 0x24, 0x0f, - 0xb2, 0x02, 0xe0, 0x04, 0x1f, 0xae, 0x69, 0x61, 0x85, 0x3f, 0xd6, 0xf7, - 0x59, 0x06, 0xf9, 0xc8, 0x24, 0x4e, 0x76, 0xe1, 0xd7, 0x7d, 0x0c, 0xb2, - 0x99, 0x6f, 0x0a, 0x17, 0xda, 0xf2, 0xcf, 0x14, 0xaf, 0xe1, 0x8b, 0x21, - 0x7a, 0x77, 0xdb, 0x80, 0x8b, 0xaf, 0x4b, 0xe9, 0x3a, 0xb8, 0xba, 0xcb, - 0x8a, 0x4b, 0x72, 0x2d, 0x01, 0xd3, 0x41, 0xa7, 0x85, 0xf8, 0xe0, 0x8f, - 0x5f, 0x57, 0xd6, 0xca, 0xff, 0x14, 0xc5, 0x1c, 0x89, 0xa2, 0x12, 0x47, - 0x63, 0x98, 0x42, 0x8c, 0x38, 0x88, 0xfc, 0xce, 0x8e, 0xee, 0x04, 0xda, - 0x6f, 0x9f, 0x34, 0x94, 0xf7, 0x46, 0x0a, 0x74, 0x69, 0x78, 0xa7, 0xf1, - 0xc6, 0x50, 0x2f, 0x02, 0x88, 0x0b, 0x71, 0x61, 0x01, 0xdf, 0xc0, 0xcb, - 0x40, 0xc7, 0x8b, 0xae, 0x62, 0x89, 0x67, 0x3d, 0xa8, 0xa2, 0xbe, 0xdc, - 0x66, 0x75, 0x91, 0x8c, 0x10, 0x96, 0x47, 0xdc, 0x7e, 0x2a, 0xe1, 0xdc, - 0xc6, 0x9d, 0xbc, 0xc4, 0x18, 0x35, 0xfb, 0x35, 0xc5, 0xab, 0x72, 0x7f, - 0x2c, 0xeb, 0x83, 0x80, 0x24, 0x23, 0xf1, 0xda, 0x1b, 0x9b, 0x59, 0x94, - 0xe6, 0xad, 0xd7, 0x3e, 0x36, 0x5c, 0xac, 0xda, 0xbb, 0x5a, 0xb6, 0xe4, - 0xb5, 0xbe, 0xb9, 0x44, 0x5f, 0xbb, 0x1e, 0xc3, 0x18, 0x34, 0x23, 0xef, - 0x2d, 0x59, 0xcb, 0xb9, 0x18, 0x5e, 0xcf, 0xa2, 0x3f, 0x5f, 0xef, 0x4b, - 0xb4, 0x54, 0x0d, 0x1c, 0x96, 0xb8, 0x53, 0x80, 0xa5, 0xce, 0xde, 0x03, - 0x2b, 0x2c, 0xd4, 0x88, 0x0c, 0x03, 0xac, 0xfd, 0x01, 0x31, 0xaf, 0x30, - 0x5b, 0x21, 0x90, 0xb3, 0x9c, 0x6f, 0x09, 0x84, 0xc8, 0x25, 0x6c, 0x9c, - 0x91, 0xdd, 0x46, 0xbf, 0x37, 0x9d, 0x7b, 0xfb, 0x8a, 0x03, 0xce, 0x6f, - 0xc7, 0xf0, 0x91, 0x84, 0x39, 0x4b, 0x11, 0xf7, 0x1d, 0xe7, 0x38, 0x49, - 0x62, 0x49, 0xff, 0x56, 0xd1, 0xb6, 0xef, 0x53, 0x6c, 0xd0, 0x29, 0x3d, - 0xe1, 0x12, 0xe0, 0x95, 0x51, 0x56, 0x67, 0x2f, 0x52, 0xfb, 0x54, 0x4a, - 0x0f, 0xe6, 0x1a, 0x4b, 0x49, 0xb8, 0x33, 0xea, 0x2a, 0x05, 0x6a, 0x7e, - 0xc4, 0x26, 0x69, 0x38, 0x0f, 0x85, 0x57, 0xde, 0x66, 0x48, 0x9f, 0x65, - 0xd0, 0xef, 0xac, 0x61, 0x83, 0xbf, 0xf3, 0xb5, 0xa5, 0x62, 0x60, 0xf8, - 0xa7, 0x6d, 0x8e, 0xe1, 0x81, 0xe1, 0xc0, 0xa3, 0x89, 0xbf, 0x48, 0xa9, - 0xb5, 0x84, 0xd8, 0x6a, 0x36, 0xde, 0x98, 0x8f, 0xd7, 0xed, 0x84, 0x44, - 0xec, 0x7e, 0xa9, 0x6d, 0xc5, 0xbf, 0x3e, 0x2e, 0xb4, 0xc0, 0x27, 0x16, - 0xbd, 0xa0, 0xb0, 0x04, 0x75, 0x83, 0xb2, 0x97, 0x54, 0xf8, 0x16, 0xee, - 0x8b, 0x6d, 0x8f, 0x04, 0x82, 0x50, 0x8e, 0x20, 0x15, 0x6c, 0x97, 0x25, - 0x54, 0x8e, 0xa9, 0x20, 0xd1, 0x32, 0x35, 0xd0, 0x2d, 0x9c, 0x5c, 0xc1, - 0x55, 0x95, 0x88, 0xe5, 0x98, 0x13, 0x15, 0xbc, 0x4b, 0x08, 0xb2, 0xcb, - 0xf5, 0xe7, 0xfc, 0xc4, 0x8a, 0xf4, 0xde, 0xea, 0xd2, 0x34, 0xe0, 0x08, - 0x6a, 0x68, 0x1b, 0x2f, 0x80, 0xc6, 0x52, 0x65, 0xbc, 0xa8, 0x28, 0xbf, - 0x46, 0xa2, 0x03, 0xcf, 0x96, 0x2a, 0x0e, 0x17, 0x7e, 0x18, 0x9a, 0x02, - 0xfd, 0xd6, 0x45, 0x39, 0xfd, 0xeb, 0x05, 0x0d, 0xd9, 0xd5, 0x53, 0xe6, - 0xe3, 0xdb, 0x83, 0x75, 0x19, 0xe3, 0x45, 0x46, 0xa4, 0x9b, 0x4e, 0x5e, - 0x1d, 0xe3, 0xc4, 0x4d, 0x0d, 0xec, 0x38, 0xb6, 0xbf, 0xfd, 0xa7, 0xaf, - 0xd1, 0xb0, 0xb0, 0xb1, 0x59, 0x49, 0x7a, 0x7f, 0xfa, 0xa6, 0x89, 0xb9, - 0xf2, 0x45, 0x58, 0x39, 0xc7, 0xc4, 0xd7, 0x40, 0x62, 0xe1, 0xbc, 0x0a, - 0x85, 0x0d, 0x71, 0x29, 0xa0, 0x46, 0x87, 0x41, 0x07, 0x02, 0xa8, 0x2c, - 0x60, 0x1d, 0xbb, 0xea, 0x0b, 0x1c, 0xea, 0xd7, 0xcf, 0xec, 0x9e, 0x98, - 0x87, 0x46, 0x64, 0x27, 0x33, 0x20, 0xd6, 0xca, 0xd4, 0x7d, 0x07, 0x8b, - 0x7b, 0x31, 0x24, 0xd4, 0xb7, 0x4c, 0xdc, 0x74, 0x71, 0x10, 0xcb, 0x7a, - 0xa7, 0x24, 0x2a, 0x3b, 0xe2, 0x4f, 0xe1, 0x28, 0xfc, 0x54, 0x8b, 0xb3, - 0xc2, 0x7e, 0x57, 0x56, 0x7b, 0x0b, 0x89, 0x8d, 0xa1, 0xa3, 0xf8, 0xe5, - 0xb3, 0xfb, 0x0e, 0x25, 0x12, 0x85, 0x81, 0x87, 0x79, 0x0c, 0x50, 0xc2, - 0xc4, 0x97, 0xa9, 0x59, 0xbd, 0x8d, 0x8f, 0x82, 0x10, 0x35, 0xc8, 0xa1, - 0xcc, 0xe1, 0x65, 0xcb, 0x2a, 0xe6, 0x72, 0x84, 0x82, 0x07, 0x5d, 0x6e, - 0xa6, 0x0e, 0xaf, 0x4e, 0x16, 0x44, 0xd3, 0xe2, 0x0f, 0x3c, 0x4b, 0xda, - 0xc8, 0xb0, 0x05, 0x62, 0xa2, 0x7e, 0xe4, 0x03, 0xa2, 0x58, 0xa6, 0xae, - 0x2e, 0x44, 0x1e, 0xd0, 0xeb, 0xcb, 0xca, 0x18, 0xca, 0x3c, 0xc3, 0x66, - 0xf2, 0xa2, 0x1c, 0x31, 0xbc, 0xe0, 0x24, 0xe4, 0x68, 0x90, 0x26, 0xa8, - 0xed, 0xc0, 0xba, 0xaa, 0x91, 0x66, 0x50, 0x60, 0xf1, 0x20, 0x40, 0x09, - 0x07, 0x8d, 0x83, 0x49, 0x3c, 0x64, 0x88, 0x34, 0x78, 0xcb, 0x95, 0x39, - 0x81, 0xd9, 0x6e, 0xa7, 0xb6, 0x48, 0xdf, 0x21, 0x43, 0x02, 0xce, 0x37, - 0xb7, 0xb7, 0x64, 0x06, 0xa2, 0x26, 0xde, 0x09, 0x8a, 0xb4, 0x4d, 0x8a, - 0x39, 0x94, 0x13, 0x78, 0x35, 0xae, 0xf6, 0x44, 0x72, 0x27, 0x5f, 0x10, - 0x7c, 0xa2, 0xc3, 0x01, 0xca, 0x67, 0xc2, 0x11, 0x38, 0x72, 0xaf, 0xc9, - 0x51, 0x8c, 0x04, 0xf7, 0xc5, 0xc2, 0x41, 0x0e, 0x24, 0x24, 0xb4, 0xf5, - 0x35, 0xea, 0x78, 0x47, 0xad, 0x1e, 0xe0, 0x22, 0x78, 0x43, 0xea, 0x19, - 0xb7, 0x59, 0x42, 0x9c, 0xc2, 0x6f, 0x84, 0xc2, 0x58, 0x22, 0x01, 0x11, - 0xdf, 0x5d, 0xcb, 0xf1, 0x80, 0x14, 0x6c, 0xc6, 0xcd, 0x7a, 0xa3, 0xb7, - 0xca, 0xf6, 0xf4, 0x29, 0xa5, 0x68, 0x32, 0xe7, 0x4e, 0x3d, 0x0e, 0xb4, - 0xce, 0x08, 0xa1, 0x27, 0x4f, 0xe8, 0x91, 0x2f, 0x4b, 0xf1, 0x1c, 0x7d, - 0x00, 0x14, 0x4a, 0x31, 0xed, 0x16, 0x06, 0x7e, 0x15, 0x75, 0x1e, 0x9e, - 0x63, 0x20, 0x0f, 0x71, 0xc6, 0x40, 0xfb, 0x94, 0xd3, 0xba, 0x9e, 0xd3, - 0x49, 0xd2, 0xfb, 0x5f, 0x62, 0x97, 0x30, 0x26, 0xc3, 0x24, 0xd2, 0x0c, - 0x01, 0xfc, 0x1e, 0x73, 0xa6, 0xb0, 0xb5, 0xb9, 0xcf, 0x0c, 0xc8, 0x42, - 0xb9, 0x13, 0xd5, 0x81, 0x5e, 0x0a, 0x29, 0x3a, 0x85, 0x96, 0x21, 0xca, - 0xd1, 0x4d, 0x19, 0x13, 0xbf, 0x49, 0x4c, 0xc2, 0x19, 0x00, 0x20, 0xdb, - 0xf8, 0x68, 0x3b, 0xa2, 0x89, 0xb4, 0x5b, 0xdc, 0xeb, 0x4f, 0xb1, 0xdf, - 0x60, 0x56, 0x35, 0xf1, 0x4f, 0x25, 0x6b, 0x61, 0x58, 0xee, 0x59, 0xe8, - 0x13, 0xb5, 0x10, 0xc0, 0xd2, 0xb2, 0x7f, 0x99, 0x9e, 0x42, 0x47, 0x22, - 0x14, 0x29, 0xe2, 0xe5, 0xdb, 0xf3, 0x7f, 0x8f, 0x55, 0x5e, 0xdc, 0xb0, - 0xdd, 0x25, 0x52, 0x29, 0xdd, 0x21, 0xe6, 0x5b, 0x0e, 0xe3, 0xb3, 0x69, - 0x2e, 0xb9, 0xbd, 0x68, 0x67, 0xb9, 0xae, 0x07, 0x07, 0xf0, 0xf6, 0xd2, - 0x97, 0xcd, 0xaf, 0x12, 0x19, 0xdb, 0x08, 0x55, 0x7d, 0xf4, 0xad, 0x03, - 0xbf, 0x5a, 0xed, 0xc3, 0xcb, 0x9c, 0xd8, 0x63, 0xb5, 0xee, 0xd8, 0xfa, - 0x82, 0x84, 0x1f, 0x9f, 0x76, 0xeb, 0x0f, 0x42, 0xe8, 0xbe, 0xff, 0xe5, - 0xb9, 0xa0, 0x6c, 0x72, 0xf9, 0xa8, 0xa6, 0xac, 0x10, 0x43, 0x7f, 0xf7, - 0x13, 0xba, 0x0f, 0x55, 0xd6, 0x29, 0x9c, 0xae, 0x1c, 0xe2, 0xa1, 0xd2, - 0x35, 0xf3, 0x49, 0x21, 0x28, 0xfa, 0x02, 0x75, 0x7c, 0x29, 0x16, 0x53, - 0x49, 0xdb, 0xf2, 0x61, 0xa6, 0xd4, 0xb1, 0x2f, 0xb8, 0x7b, 0xbe, 0xd0, - 0x8f, 0xbd, 0x20, 0xaf, 0x0e, 0x30, 0x05, 0x65, 0x74, 0x43, 0xa8, 0xcc, - 0x1b, 0x43, 0x56, 0x2f, 0xb3, 0x33, 0x31, 0xc3, 0x3d, 0x41, 0x7d, 0x61, - 0x6a, 0x2a, 0x9a, 0x45, 0xc4, 0x46, 0x47, 0x58, 0x8f, 0x35, 0x0b, 0x27, - 0xe9, 0x3f, 0x99, 0x22, 0x34, 0xb3, 0xc2, 0x37, 0x88, 0x9d, 0xf0, 0xc3, - 0xa8, 0xc7, 0xb0, 0x5f, 0x5e, 0xd3, 0x15, 0xa9, 0x31, 0xa0, 0x58, 0x19, - 0x6c, 0xe6, 0xca, 0xdf, 0x05, 0xce, 0x4f, 0x65, 0x74, 0x4b, 0x60, 0xb4, - 0x3e, 0x88, 0x81, 0xda, 0x1a, 0xd0, 0x08, 0xfa, 0xec, 0x7b, 0xa6, 0x87, - 0x9b, 0xe1, 0xd2, 0x67, 0x64, 0x23, 0x7d, 0x8c, 0x5f, 0x56, 0x9e, 0x76, - 0x33, 0xea, 0x5f, 0x14, 0x1f, 0xf4, 0xda, 0x68, 0xbc, 0x08, 0x0f, 0x87, - 0xc5, 0x49, 0xba, 0x2f, 0xea, 0x23, 0xfa, 0x5b, 0x2d, 0x0a, 0x4a, 0x63, - 0x5d, 0xba, 0x37, 0x8f, 0xe7, 0x34, 0x3a, 0x65, 0x31, 0xfd, 0xbc, 0x82, - 0x2b, 0xe6, 0x51, 0xf1, 0x36, 0x78, 0x2a, 0x69, 0xa7, 0x40, 0x06, 0x8b, - 0x3e, 0xdc, 0x1d, 0x5b, 0x6c, 0x7b, 0xe9, 0x7a, 0x32, 0xcb, 0x9f, 0x44, - 0x22, 0x0f, 0xf0, 0xa5, 0xcf, 0x9e, 0x37, 0x43, 0x31, 0xc8, 0x65, 0xb6, - 0x72, 0xf1, 0xb3, 0x2f, 0x90, 0x8c, 0x60, 0x4d, 0x93, 0xff, 0xa5, 0xc2, - 0x3e, 0x82, 0x1b, 0x97, 0x95, 0xc9, 0x6f, 0xaa, 0xa4, 0x64, 0xb1, 0x41, - 0xee, 0xbb, 0xf5, 0x0d, 0x40, 0x8c, 0x50, 0x3c, 0x27, 0x3f, 0xa9, 0x52, - 0xb6, 0x25, 0xb3, 0x7c, 0xc5, 0xdd, 0xbd, 0xbe, 0x82, 0x56, 0x58, 0xcf, - 0x4f, 0xd7, 0x1e, 0xdb, 0xcf, 0xb4, 0x9f, 0x21, 0x96, 0xc5, 0x0e, 0x81, - 0x0c, 0x54, 0x60, 0x8f, 0x4c, 0xc7, 0xbe, 0x75, 0x4f, 0xa9, 0x42, 0x8e, - 0xaf, 0x25, 0x14, 0x8f, 0xb3, 0x10, 0x4d, 0x36, 0xfa, 0x60, 0xce, 0xef, - 0x2f, 0x01, 0xf9, 0x1e, 0x25, 0x6f, 0xb8, 0x49, 0xeb, 0xfa, 0xbb, 0xcd, - 0x59, 0x17, 0xcb, 0xae, 0xac, 0xdb, 0xa6, 0x20, 0x85, 0x3f, 0x5d, 0x74, - 0xca, 0xa4, 0xb3, 0x6c, 0x18, 0x11, 0xe8, 0xbb, 0x98, 0x2d, 0xe8, 0xe7, - 0x56, 0xf3, 0xf4, 0x10, 0x25, 0xf5, 0xb6, 0x64, 0x6d, 0x3e, 0xc3, 0x59, - 0x9c, 0x95, 0xa9, 0x09, 0xeb, 0x36, 0xce, 0xe9, 0xa4, 0x3c, 0x81, 0x1e, - 0x4c, 0x08, 0xa2, 0x8c, 0x38, 0x3d, 0x82, 0x05, 0x13, 0x5f, 0xab, 0x9b, - 0x36, 0x43, 0xcc, 0xaa, 0x6b, 0xbc, 0xc2, 0x34, 0xc8, 0x8b, 0xdb, 0xe4, - 0x3b, 0x41, 0x69, 0xf3, 0x72, 0xfe, 0x81, 0xab, 0x54, 0xef, 0x39, 0xc9, - 0x23, 0xae, 0x13, 0x73, 0x64, 0xd2, 0x63, 0xfb, 0xaf, 0x40, 0xca, 0xa1, - 0x95, 0x85, 0x72, 0x56, 0x90, 0x89, 0xb7, 0xe4, 0x9b, 0x1f, 0x28, 0x83, - 0xe4, 0x21, 0x94, 0xc9, 0xfa, 0x24, 0xf6, 0x45, 0x63, 0x64, 0x31, 0xb4, - 0x42, 0xbb, 0x8c, 0xc0, 0x49, 0x56, 0x1d, 0x91, 0x35, 0x12, 0x09, 0xb0, - 0x93, 0x3c, 0x44, 0xa7, 0xf0, 0x46, 0x4f, 0x98, 0x5f, 0x8e, 0xd5, 0xa0, - 0x9b, 0x8f, 0xf6, 0x1a, 0x92, 0x10, 0x34, 0xb1, 0xcd, 0xf6, 0xb4, 0xf2, - 0x99, 0x4e, 0x3c, 0xa3, 0x63, 0xcd, 0x38, 0x11, 0x41, 0x5b, 0xad, 0x46, - 0x0a, 0x3a, 0xbf, 0xdf, 0xc8, 0x69, 0x8c, 0x62, 0xaa, 0x71, 0xae, 0xf6, - 0xdd, 0x9d, 0x78, 0x51, 0x9c, 0x8a, 0xb2, 0x10, 0x10, 0x77, 0x8e, 0x04, - 0x37, 0x9f, 0x19, 0x62, 0xcd, 0xa8, 0xb2, 0xb8, 0xc2, 0xed, 0xec, 0xd5, - 0xd7, 0x53, 0x31, 0x7d, 0x6d, 0xa5, 0x60, 0xfe, 0x44, 0x44, 0x05, 0xd2, - 0xc7, 0xa4, 0xfa, 0x29, 0x5a, 0x33, 0xf4, 0x64, 0xab, 0xee, 0xb0, 0xe2, - 0xb7, 0xcd, 0x41, 0x1c, 0x2a, 0x7b, 0x3a, 0x26, 0x42, 0x84, 0x06, 0x80, - 0xbb, 0x78, 0x74, 0x08, 0x45, 0xec, 0xc1, 0xa9, 0xea, 0x93, 0x68, 0xb4, - 0xf2, 0x76, 0x0b, 0x04, 0x30, 0x01, 0xa3, 0x36, 0xb2, 0xaa, 0x4b, 0x2c, - 0xe4, 0xb2, 0xdb, 0x51, 0xfa, 0x90, 0x2e, 0x45, 0x10, 0xb5, 0xed, 0x2f, - 0xcb, 0x7f, 0xc5, 0xad, 0xd0, 0xb8, 0x09, 0xc2, 0x29, 0x68, 0x26, 0xc5, - 0x19, 0x5d, 0x64, 0xc7, 0x09, 0xc0, 0x36, 0xda, 0x76, 0x98, 0x40, 0x89, - 0x20, 0x27, 0xad, 0xc3, 0x9b, 0x1d, 0x37, 0xe0, 0x7a, 0xee, 0x03, 0xdd, - 0x37, 0x13, 0x9c, 0x56, 0xc2, 0x9d, 0xa6, 0x5e, 0xea, 0x23, 0x01, 0x8a, - 0xbf, 0x9b, 0x26, 0xfb, 0x95, 0x48, 0x74, 0x08, 0x4d, 0xe7, 0x02, 0xc5, - 0xd7, 0x26, 0x21, 0x8c, 0x0f, 0xf2, 0xb0, 0x02, 0xee, 0xbc, 0x13, 0xdb, - 0xe1, 0x11, 0xff, 0xdf, 0xdf, 0x0e, 0x0f, 0x84, 0x5f, 0x2f, 0x52, 0xed, - 0xb4, 0x30, 0x7f, 0xe3, 0x36, 0xfd, 0xd1, 0x9b, 0xbe, 0x0d, 0xe2, 0xd3, - 0x41, 0x65, 0xe9, 0x1e, 0x5a, 0x43, 0x56, 0x36, 0xd9, 0x69, 0x89, 0x0d, - 0xc9, 0xce, 0xee, 0x19, 0x1a, 0x6a, 0x7c, 0x93, 0x51, 0xb2, 0x10, 0xca, - 0x41, 0xde, 0xe1, 0xbf, 0x39, 0x7e, 0x36, 0x7f, 0x9b, 0xf2, 0xdd, 0x6b, - 0x91, 0x11, 0x44, 0xa8, 0xdd, 0xd3, 0x41, 0x66, 0x61, 0xc3, 0x6f, 0x6d, - 0x81, 0xe6, 0x77, 0x05, 0x88, 0xf3, 0x1d, 0xad, 0xba, 0x52, 0x2c, 0x9f, - 0x00, 0xb7, 0x18, 0x92, 0xb6, 0x36, 0xa4, 0x42, 0x81, 0xd4, 0x5e, 0x1d, - 0x9c, 0x5b, 0xc6, 0xee, 0xd8, 0x96, 0x7d, 0xf9, 0x23, 0x85, 0xfe, 0x81, - 0x7d, 0x7a, 0x5e, 0x0a, 0x97, 0x02, 0x4c, 0xd9, 0x70, 0x39, 0x8f, 0xcd, - 0x27, 0x50, 0x66, 0xcd, 0xfb, 0xf4, 0x13, 0xba, 0x81, 0x75, 0x99, 0xf4, - 0x70, 0xfe, 0x07, 0x2c, 0x94, 0x32, 0x12, 0xfa, 0x71, 0x9b, 0xb0, 0x9e, - 0x14, 0x56, 0xa0, 0xcf, 0x91, 0x97, 0xca, 0x64, 0xbb, 0x0e, 0x25, 0x4e, - 0x92, 0x13, 0x98, 0xe4, 0xd4, 0x03, 0x3b, 0xd4, 0xa3, 0xf2, 0xd5, 0x71, - 0x6c, 0xf4, 0xc9, 0x73, 0x82, 0xb1, 0x0f, 0x8b, 0x24, 0x66, 0x69, 0x5e, - 0x37, 0xe3, 0xa1, 0x6d, 0x19, 0xed, 0xba, 0xd3, 0xf8, 0x08, 0x0f, 0xe9, - 0xe3, 0x04, 0x91, 0x9c, 0xee, 0x71, 0xb6, 0x4f, 0xce, 0x19, 0xbb, 0xa5, - 0x9b, 0x1b, 0xe1, 0xd0, 0xa4, 0x3e, 0x5f, 0xd7, 0x67, 0xf3, 0x96, 0x9e, - 0x27, 0x9d, 0x27, 0x41, 0x30, 0x56, 0x8a, 0x4e, 0x11, 0xf6, 0x52, 0xe2, - 0x5d, 0x80, 0x1f, 0xb9, 0x0d, 0xec, 0x56, 0x90, 0x1c, 0x14, 0x1d, 0x96, - 0xff, 0x8e, 0x2e, 0x72, 0x44, 0xa4, 0xd4, 0x3d, 0xc0, 0xd0, 0xda, 0x97, - 0x20, 0xc6, 0x78, 0xd7, 0x11, 0x5c, 0xba, 0x33, 0xbd, 0x95, 0xb5, 0xa8, - 0xf4, 0xc6, 0x03, 0x0e, 0xd5, 0x8b, 0x25, 0x3e, 0x70, 0x1b, 0x24, 0x39, - 0xa1, 0x09, 0x61, 0x80, 0x1a, 0xc5, 0x43, 0xcf, 0xd8, 0x57, 0x78, 0x98, - 0xe0, 0x0a, 0x70, 0x55, 0x4b, 0x5e, 0x03, 0xe1, 0x58, 0xce, 0xc4, 0xd1, - 0xcb, 0x95, 0xf8, 0xcf, 0xf5, 0xb9, 0x63, 0xa9, 0xca, 0x4e, 0xe1, 0x17, - 0x3a, 0x08, 0x57, 0x6d, 0x96, 0x34, 0x7c, 0xc1, 0xf7, 0xc2, 0xcf, 0xbf, - 0xc4, 0x29, 0x74, 0x8c, 0x12, 0xa9, 0x5d, 0x50, 0x19, 0x62, 0x54, 0x75, - 0xc9, 0x1f, 0x91, 0x8b, 0xd7, 0x0c, 0xdd, 0x2e, 0xe5, 0x77, 0x3a, 0x48, - 0xd2, 0xf5, 0xc1, 0xb9, 0x9a, 0x0b, 0x35, 0x21, 0xf1, 0x86, 0xb0, 0x83, - 0x78, 0xd0, 0x6f, 0x5a, 0xd7, 0xfa, 0x50, 0xbf, 0x76, 0xba, 0x27, 0x31, - 0x29, 0x14, 0x40, 0xa0, 0xfb, 0x19, 0x13, 0x2a, 0x37, 0xab, 0xc3, 0xc2, - 0xb2, 0xb1, 0x5a, 0x4f, 0x3f, 0x61, 0xd5, 0xa2, 0xaf, 0xd8, 0x88, 0x40, - 0xea, 0xf9, 0xdf, 0x4b, 0xa5, 0x7e, 0x7e, 0xef, 0x25, 0xc4, 0x97, 0xc6, - 0x98, 0x60, 0x93, 0x6a, 0x05, 0x97, 0xdd, 0xca, 0xdc, 0x02, 0xe7, 0x45, - 0x02, 0xbf, 0x57, 0x2d, 0x7a, 0xba, 0xae, 0x14, 0x6a, 0x99, 0x20, 0x99, - 0x0c, 0xe7, 0x52, 0x13, 0x66, 0x3f, 0x66, 0xb7, 0xd2, 0x7e, 0x69, 0x9f, - 0xd7, 0x1b, 0x60, 0x4b, 0x94, 0xc0, 0x58, 0x23, 0x5c, 0x7b, 0x65, 0x22, - 0xd9, 0xdc, 0x3f, 0x76, 0x46, 0xca, 0x34, 0x1d, 0xf0, 0x46, 0x9f, 0xfb, - 0xd1, 0x13, 0xaa, 0xba, 0xb1, 0x21, 0x2a, 0xc4, 0xad, 0xc4, 0x0f, 0x8d, - 0x65, 0xdb, 0xf0, 0x5f, 0x5e, 0x9a, 0xce, 0xee, 0x61, 0x8f, 0x9b, 0x37, - 0xb6, 0x46, 0x77, 0xc8, 0x97, 0xc9, 0xca, 0xf9, 0x87, 0x8b, 0xa3, 0x36, - 0x17, 0x0a, 0x7c, 0x28, 0x31, 0x63, 0x15, 0xc9, 0x34, 0xf0, 0x22, 0x94, - 0xbc, 0x10, 0x1d, 0x93, 0xc0, 0x46, 0x43, 0x5e, 0x1b, 0xb4, 0x85, 0x78, - 0x9c, 0x94, 0x3d, 0xc1, 0x83, 0x32, 0x79, 0x3d, 0x7c, 0x07, 0x8a, 0x63, - 0x63, 0xd7, 0xb3, 0xcd, 0x79, 0xd7, 0x70, 0xe3, 0xa0, 0x44, 0x7b, 0xc9, - 0xbd, 0x91, 0x2f, 0x6e, 0xbe, 0x3c, 0xff, 0x6f, 0xa2, 0x86, 0x49, 0xa0, - 0x11, 0x8e, 0xe1, 0xb1, 0xb6, 0x59, 0x70, 0x34, 0x24, 0x53, 0x8f, 0x9a, - 0x2e, 0xdf, 0xe8, 0xd6, 0x67, 0x8f, 0xa6, 0xd3, 0x73, 0x29, 0x92, 0x18, - 0x29, 0x87, 0xe7, 0xe3, 0xa0, 0xbe, 0x57, 0x2c, 0x3e, 0x45, 0xeb, 0x79, - 0x9e, 0x87, 0xde, 0x51, 0x2d, 0x98, 0x4f, 0x29, 0x99, 0xc3, 0xf4, 0xcb, - 0x3b, 0x5c, 0x81, 0x6f, 0x3a, 0x1b, 0xba, 0x62, 0x7d, 0x30, 0x4c, 0xf2, - 0xb1, 0x6b, 0x3d, 0x66, 0x7a, 0xfd, 0x68, 0x6b, 0x3e, 0x7b, 0x43, 0x64, - 0x2c, 0x8c, 0x11, 0xc6, 0x4a, 0xa3, 0x48, 0xa4, 0xdc, 0x7c, 0x2e, 0xbc, - 0x7a, 0x56, 0xdb, 0x8e, 0xab, 0xf0, 0xc2, 0x7c, 0xba, 0x08, 0x9b, 0x13, - 0x93, 0x86, 0x6d, 0x3a, 0xfa, 0x9b, 0x8e, 0x60, 0x00, 0x20, 0xb0, 0x5d, - 0x0f, 0xd6, 0x97, 0x49, 0x61, 0x12, 0x9f, 0xa5, 0x3f, 0x19, 0x9b, 0x66, - 0x1b, 0xb2, 0x14, 0x86, 0x7e, 0xb6, 0xc3, 0x95, 0x84, 0xcf, 0x00, 0xc2, - 0x75, 0x56, 0xaa, 0x2c, 0xc1, 0xb3, 0xe3, 0x29, 0x18, 0xcd, 0x34, 0x9b, - 0x8c, 0xbe, 0x69, 0x4a, 0x9b, 0xb2, 0xde, 0x40, 0xed, 0x59, 0x12, 0x74, - 0x3c, 0x3f, 0x7c, 0x6e, 0x56, 0x6d, 0x0c, 0xaf, 0x5e, 0xfd, 0xd5, 0x69, - 0xac, 0xfc, 0xd4, 0x18, 0xf2, 0xa4, 0xd0, 0x11, 0x11, 0x74, 0x5b, 0xeb, - 0x67, 0x13, 0x35, 0xa2, 0xeb, 0x1d, 0x2d, 0xd8, 0x35, 0x9f, 0x9b, 0xbe, - 0x78, 0xce, 0x73, 0xe4, 0x31, 0x95, 0xad, 0x8f, 0x4c, 0x62, 0xc5, 0x46, - 0x7c, 0xb0, 0x69, 0xf6, 0xc8, 0x27, 0xd5, 0x4e, 0x29, 0x8f, 0xca, 0x97, - 0x8b, 0xfd, 0x5a, 0x9d, 0xd1, 0xbf, 0xf9, 0x93, 0xdc, 0xa5, 0xfe, 0x8f, - 0x20, 0x69, 0xb5, 0x21, 0x0d, 0xbd, 0x1e, 0xb1, 0x1e, 0x86, 0xa0, 0x17, - 0x20, 0xc7, 0xc4, 0x0b, 0xf6, 0x17, 0x80, 0xae, 0x77, 0x25, 0x73, 0x2d, - 0x84, 0x96, 0xad, 0xed, 0xcd, 0xda, 0xc6, 0x8e, 0x37, 0xad, 0x76, 0xfa, - 0x38, 0xaa, 0x33, 0x98, 0x65, 0x3a, 0xa0, 0x3e, 0xb9, 0xe1, 0x6f, 0xe6, - 0x7f, 0x6c, 0x29, 0x13, 0x14, 0xcf, 0x4d, 0xfd, 0xea, 0x03, 0x6c, 0x84, - 0x19, 0x57, 0x30, 0xab, 0xae, 0x06, 0x44, 0x95, 0xb5, 0xb5, 0x8e, 0x85, - 0x23, 0x45, 0xbd, 0xc0, 0x7f, 0x4c, 0x73, 0x90, 0x6d, 0x3e, 0xd7, 0xdf, - 0xc8, 0x95, 0x76, 0x3c, 0xf7, 0xe2, 0x59, 0xea, 0x9c, 0xa0, 0x41, 0x5a, - 0x26, 0xac, 0x5b, 0x8b, 0xd8, 0xec, 0x2f, 0xbb, 0xdb, 0xfb, 0xf7, 0x09, - 0x92, 0x34, 0x66, 0x4d, 0x65, 0x11, 0xa3, 0x46, 0xd6, 0xba, 0x46, 0x5c, - 0x8c, 0x9f, 0x9e, 0xa4, 0x5b, 0x85, 0x4b, 0x78, 0x13, 0xe3, 0x4b, 0x58, - 0xc5, 0xcc, 0x3a, 0x36, 0xe7, 0x09, 0x6c, 0x8f, 0x6f, 0x9a, 0x62, 0x77, - 0xfb, 0x02, 0xed, 0x89, 0xa3, 0x78, 0xd1, 0x23, 0x3f, 0xde, 0xf7, 0xe9, - 0x0c, 0xab, 0x3b, 0x7b, 0x95, 0x47, 0x1d, 0xf9, 0xc4, 0x19, 0x4c, 0x2f, - 0xbf, 0xa6, 0xd2, 0x8a, 0xf0, 0x63, 0xd7, 0xa3, 0x50, 0x19, 0xda, 0xd3, - 0x8d, 0x67, 0xa3, 0x8a, 0x78, 0xc3, 0x17, 0xea, 0xa2, 0xab, 0xb3, 0x17, - 0x41, 0x55, 0x95, 0x44, 0xb3, 0x90, 0x54, 0xdb, 0xee, 0x11, 0x4d, 0xb1, - 0x4a, 0xc7, 0x4f, 0x13, 0xba, 0x75, 0x52, 0x95, 0xdd, 0xea, 0x0b, 0x60, - 0x93, 0x6c, 0xc5, 0xfa, 0x75, 0xf9, 0xe9, 0xb9, 0x99, 0xea, 0xce, 0x4a, - 0xab, 0x0b, 0xd5, 0x17, 0x41, 0x5e, 0xf2, 0x8d, 0xec, 0xc6, 0x86, 0xfd, - 0xd9, 0x57, 0xd9, 0x49, 0x6d, 0x12, 0x63, 0x45, 0x24, 0x4f, 0x08, 0x31, - 0xf3, 0x9c, 0x0f, 0x33, 0x1a, 0xd3, 0xb2, 0x40, 0x0c, 0x5a, 0xdb, 0xd6, - 0x95, 0x41, 0xa7, 0xeb, 0x12, 0x25, 0xb7, 0x4a, 0xb2, 0x7f, 0x77, 0xb8, - 0xb1, 0xc6, 0x4b, 0x63, 0x9d, 0xe8, 0x61, 0xac, 0x8b, 0xf7, 0x2e, 0xcc, - 0xec, 0x1a, 0x6d, 0x59, 0x62, 0xca, 0xed, 0xec, 0xe0, 0x53, 0x8a, 0x1e, - 0xcd, 0x19, 0xbb, 0xd9, 0x0a, 0xb6, 0xcc, 0xe2, 0xf1, 0xfb, 0xd2, 0x58, - 0x24, 0xd1, 0x48, 0x02, 0xef, 0x0b, 0x9e, 0xef, 0x7e, 0xd5, 0xbf, 0xce, - 0xfe, 0x02, 0x32, 0x2f, 0xe1, 0x1d, 0xeb, 0xbd, 0xe2, 0x5f, 0x7a, 0xe6, - 0x50, 0xda, 0x8d, 0xfc, 0x49, 0x76, 0xef, 0xa7, 0xdf, 0xf0, 0x6d, 0x12, - 0x45, 0xc6, 0x6e, 0x7b, 0x57, 0xeb, 0x39, 0x77, 0xd6, 0xb2, 0xd2, 0x90, - 0xaa, 0xec, 0xc6, 0xa9, 0x11, 0x3f, 0x76, 0x49, 0x96, 0x26, 0x21, 0xee, - 0x7e, 0xe8, 0x58, 0xb4, 0x6d, 0x05, 0x6d, 0x1e, 0x06, 0xa5, 0xa9, 0x39, - 0x99, 0x49, 0x2f, 0xf5, 0xc6, 0x14, 0x44, 0xa3, 0xa4, 0x61, 0xa2, 0xe8, - 0x08, 0x22, 0x01, 0xb6, 0x97, 0x05, 0x93, 0x6b, 0x7b, 0x4c, 0x43, 0x7c, - 0x57, 0x37, 0xa5, 0x8a, 0x6f, 0x48, 0x91, 0xe5, 0x96, 0x14, 0x8d, 0x4c, - 0xce, 0xf4, 0x63, 0xd4, 0x71, 0x01, 0xd8, 0x39, 0xa3, 0xd0, 0xf8, 0xd2, - 0xf8, 0x50, 0xa4, 0x9a, 0x50, 0x13, 0x3d, 0x57, 0xb2, 0x45, 0xfa, 0xe6, - 0xa5, 0x3e, 0xfe, 0xdd, 0x95, 0x21, 0xa9, 0x86, 0xb4, 0x05, 0x1e, 0xd2, - 0x53, 0x10, 0xaf, 0x60, 0x0f, 0x9e, 0xce, 0xeb, 0x8c, 0xef, 0x5f, 0xa3, - 0xe5, 0xb8, 0x04, 0x81, 0xbd, 0x8f, 0x87, 0x5c, 0xc1, 0x6e, 0xe1, 0x55, - 0x89, 0xc8, 0xa4, 0x90, 0xa4, 0x74, 0x73, 0x58, 0x03, 0x1b, 0xa6, 0xe6, - 0x7a, 0xce, 0x12, 0xac, 0x87, 0x85, 0x13, 0x63, 0x2b, 0x57, 0xc4, 0x54, - 0xce, 0x27, 0xdc, 0x12, 0x58, 0xa5, 0x93, 0x4e, 0x98, 0x7e, 0xd3, 0xb3, - 0x3a, 0x25, 0x48, 0x91, 0xfa, 0x09, 0xf3, 0x37, 0xd5, 0x51, 0x84, 0x4d, - 0x45, 0x93, 0x21, 0x1a, 0x1e, 0xb0, 0x80, 0xc7, 0x3c, 0xf6, 0x53, 0x6f, - 0x87, 0x33, 0xd5, 0xf1, 0x7c, 0x88, 0x12, 0x62, 0xc7, 0xfd, 0x5e, 0x7c, - 0x45, 0xad, 0x0f, 0xfa, 0xb6, 0xe2, 0x54, 0x1a, 0xcf, 0xf2, 0x62, 0xd1, - 0x6b, 0xa9, 0xb7, 0xee, 0xfa, 0xd6, 0x6f, 0x9f, 0xbe, 0x1c, 0x73, 0xc8, - 0xcc, 0x4f, 0xd0, 0x8a, 0x9f, 0xbe, 0x85, 0x3d, 0x26, 0x2e, 0x6a, 0x65, - 0xab, 0xd8, 0xa9, 0xfb, 0x33, 0xdc, 0x44, 0xfc, 0xc2, 0xce, 0xd0, 0xa7, - 0xb5, 0xec, 0x74, 0x5d, 0xff, 0x09, 0xa3, 0xe8, 0x5e, 0xaa, 0x3a, 0x24, - 0x2c, 0x3a, 0x46, 0xdb, 0x51, 0xb9, 0xdb, 0xc4, 0x77, 0x7a, 0x1e, 0x1c, - 0xc3, 0xc2, 0x7f, 0x7b, 0x79, 0x50, 0xf2, 0xe4, 0x12, 0xd4, 0xa7, 0xdf, - 0x68, 0xb0, 0xca, 0x46, 0xc5, 0x3f, 0xe5, 0x09, 0xe7, 0xb0, 0x66, 0xf0, - 0x1c, 0xff, 0x31, 0x10, 0x3a, 0xbf, 0xd8, 0xe8, 0x0f, 0x88, 0x7b, 0xc5, - 0xa6, 0xb7, 0x24, 0x6d, 0x3c, 0xc3, 0x48, 0x6e, 0xcf, 0xc0, 0x33, 0xe8, - 0xa0, 0x3e, 0xa9, 0x68, 0xb0, 0xed, 0x8e, 0x46, 0x4f, 0xc6, 0x5c, 0x14, - 0x55, 0x10, 0x8f, 0x06, 0x6a, 0x07, 0xf3, 0x60, 0xf9, 0xb7, 0x25, 0xfc, - 0x69, 0xac, 0xc5, 0x22, 0xb2, 0xd0, 0xeb, 0x2b, 0x16, 0x93, 0x76, 0xf3, - 0xc9, 0xd7, 0xc1, 0xef, 0xa4, 0xdc, 0x8a, 0xf7, 0x01, 0x80, 0x6a, 0xb5, - 0x34, 0x85, 0xfd, 0x35, 0xde, 0x43, 0x69, 0x8b, 0xa9, 0xc8, 0xc7, 0x55, - 0x85, 0xa5, 0x2e, 0x34, 0x6f, 0x84, 0x77, 0x25, 0x18, 0x2f, 0xdc, 0x97, - 0xee, 0x07, 0xc2, 0xd2, 0x67, 0x20, 0x97, 0xbd, 0xd8, 0x49, 0xca, 0x28, - 0x4a, 0x77, 0x30, 0xb4, 0x22, 0x52, 0xf6, 0xc4, 0x12, 0xae, 0x92, 0x7e, - 0x72, 0x17, 0x24, 0x98, 0x32, 0x02, 0xb7, 0xf3, 0xb2, 0xe2, 0xe4, 0x38, - 0x6f, 0x3a, 0xb5, 0xe6, 0xdd, 0xb4, 0x28, 0xd9, 0xc0, 0x73, 0xa1, 0xf5, - 0x0f, 0xc4, 0x30, 0xa2, 0x2d, 0x5d, 0xb1, 0xe2, 0x6f, 0x0d, 0x45, 0x06, - 0x6c, 0xa6, 0x2f, 0xa5, 0x4d, 0x3a, 0x16, 0x6d, 0x91, 0x1d, 0x37, 0xc0, - 0xe9, 0xf7, 0x31, 0xd4, 0xd3, 0xff, 0x1a, 0xf7, 0x88, 0xe5, 0x84, 0xec, - 0xb7, 0x16, 0x6c, 0xc6, 0x1e, 0xd1, 0x5a, 0x09, 0x97, 0x01, 0x32, 0x62, - 0x98, 0xf2, 0x83, 0xd9, 0x57, 0x8f, 0xa7, 0x43, 0x80, 0x56, 0x27, 0xc0, - 0xc1, 0x5f, 0x56, 0x5f, 0xef, 0xc3, 0x80, 0x16, 0xd0, 0x42, 0xce, 0x54, - 0x72, 0xf2, 0x56, 0x3e, 0x70, 0xda, 0xfd, 0xbc, 0x93, 0xa5, 0xb4, 0xc6, - 0xb1, 0x2f, 0x29, 0xce, 0x0f, 0x82, 0x06, 0xce, 0x95, 0x2e, 0x10, 0x5b, - 0xb9, 0xa4, 0x7e, 0xe7, 0x77, 0xba, 0x14, 0x47, 0xa0, 0x2d, 0xb6, 0x8c, - 0xd1, 0x9f, 0x62, 0x7c, 0xdd, 0x8b, 0x41, 0xc8, 0xe1, 0x4d, 0xc5, 0x5c, - 0xb1, 0x13, 0xad, 0x44, 0xd8, 0x90, 0x93, 0x53, 0xa0, 0x83, 0xd7, 0xde, - 0x69, 0x25, 0x5d, 0xb7, 0xea, 0x14, 0x9e, 0x50, 0x66, 0x5a, 0x73, 0x64, - 0x0b, 0x9d, 0x70, 0x42, 0x6a, 0x6c, 0x9a, 0xf9, 0x8c, 0x66, 0x90, 0x3b, - 0xb2, 0xb8, 0x15, 0x9d, 0x4f, 0x04, 0x05, 0xb7, 0x3c, 0xe1, 0x66, 0x1f, - 0x35, 0x97, 0x07, 0xe7, 0xc9, 0xf8, 0x60, 0x67, 0xc0, 0xd5, 0x9f, 0xa0, - 0xfc, 0xc8, 0x76, 0x4a, 0x68, 0x24, 0x74, 0xf7, 0x63, 0x04, 0x88, 0xc6, - 0x61, 0x38, 0x05, 0xa0, 0x58, 0x6a, 0x95, 0xdc, 0x5b, 0x87, 0x9d, 0x2e, - 0xc4, 0xc4, 0x15, 0x1e, 0x06, 0x43, 0x21, 0x14, 0xc8, 0x61, 0xda, 0xaf, - 0xf4, 0xd3, 0x1a, 0x9d, 0xa4, 0xfa, 0x2e, 0x62, 0x40, 0x22, 0xe3, 0x85, - 0xa1, 0xf2, 0xaf, 0xd7, 0x0e, 0xa7, 0x7d, 0x68, 0x4a, 0xcd, 0xdf, 0xe2, - 0xa7, 0x3d, 0x08, 0x2a, 0xf1, 0xb7, 0x78, 0xc7, 0x06, 0x0c, 0xea, 0xf1, - 0x61, 0x37, 0x09, 0x2b, 0x44, 0x5c, 0xe4, 0x80, 0xfa, 0x8c, 0x81, 0x97, - 0x16, 0x2e, 0xfb, 0x52, 0x95, 0x59, 0xcb, 0xbb, 0x73, 0x80, 0xe4, 0xc3, - 0x4d, 0x1e, 0x00, 0x7c, 0x98, 0x8c, 0x04, 0x93, 0x80, 0x99, 0xa1, 0xc5, - 0x3c, 0x95, 0x8e, 0x38, 0xee, 0x40, 0xe6, 0xcb, 0x74, 0xda, 0x01, 0x75, - 0xde, 0xe9, 0xb8, 0xce, 0x71, 0xca, 0x58, 0x5b, 0x14, 0x63, 0x65, 0xd7, - 0x69, 0xbe, 0xa3, 0x64, 0x8c, 0xaa, 0x1e, 0xbd, 0x51, 0x0f, 0xbe, 0x0a, - 0xef, 0xe4, 0x44, 0x60, 0xc1, 0xe1, 0x19, 0xa5, 0xd0, 0xd4, 0x32, 0xb5, - 0x02, 0xc0, 0x85, 0x87, 0x74, 0x74, 0x95, 0x35, 0x39, 0x1d, 0x24, 0x5b, - 0xb3, 0x1c, 0x33, 0x47, 0x35, 0x66, 0xab, 0x18, 0x5a, 0xb3, 0x52, 0xe6, - 0x54, 0x07, 0x2a, 0x04, 0xe8, 0xc7, 0xe4, 0x67, 0x72, 0x2e, 0xe1, 0x1e, - 0xe2, 0xc7, 0xf1, 0x89, 0x11, 0x7c, 0xfb, 0x27, 0xac, 0x0b, 0x92, 0x59, - 0x5b, 0x6d, 0xc7, 0x77, 0xae, 0xe3, 0x8c, 0x0d, 0xaa, 0x00, 0xb1, 0xdb, - 0x40, 0xc4, 0xbc, 0x20, 0x2d, 0x62, 0x3c, 0xb1, 0x64, 0x94, 0xc2, 0xc5, - 0xe7, 0x07, 0xc6, 0x02, 0x66, 0x89, 0x15, 0xd0, 0x6d, 0x01, 0xde, 0x57, - 0x12, 0x32, 0xee, 0x72, 0x1c, 0xf0, 0x00, 0x1c, 0x55, 0x40, 0xa8, 0x94, - 0x18, 0x23, 0x4f, 0xf9, 0x7f, 0x00, 0x9a, 0x98, 0xd4, 0x01, 0x8e, 0x21, - 0x40, 0xf9, 0xe8, 0x71, 0x30, 0x4d, 0xae, 0xf3, 0x85, 0x14, 0xf6, 0x1a, - 0x3c, 0x4d, 0x7b, 0xbb, 0x16, 0xca, 0x65, 0xd1, 0x89, 0x21, 0x83, 0xe8, - 0x71, 0xb1, 0x87, 0xd0, 0xcb, 0xd5, 0x81, 0x6e, 0xb9, 0x89, 0x1c, 0x1d, - 0x02, 0x37, 0x1b, 0x92, 0xc4, 0xfe, 0x42, 0x8f, 0x9d, 0xb6, 0xbc, 0xb7, - 0xd3, 0x8a, 0x25, 0x66, 0x68, 0x2d, 0xf2, 0xfc, 0x17, 0xa6, 0xc5, 0x86, - 0xf8, 0x5f, 0xe4, 0x56, 0xe4, 0x43, 0xce, 0x10, 0xe5, 0xf3, 0x74, 0xfd, - 0x1a, 0x56, 0x10, 0xab, 0x4a, 0x69, 0x63, 0xd1, 0xef, 0x16, 0x41, 0x93, - 0xbf, 0x9c, 0x4c, 0x86, 0xe8, 0xa5, 0x18, 0x34, 0xa3, 0x8c, 0x62, 0x3e, - 0x4b, 0xa5, 0x46, 0x30, 0x4a, 0x90, 0xf0, 0xfd, 0xdf, 0xa7, 0x8d, 0x1b, - 0x1c, 0x85, 0xd7, 0xdc, 0xa2, 0xef, 0x9d, 0x94, 0x3f, 0x39, 0x65, 0x97, - 0xab, 0x44, 0x50, 0xb3, 0x3f, 0x69, 0x98, 0xa8, 0x37, 0x4a, 0xfa, 0x58, - 0xcc, 0x3d, 0xca, 0x15, 0xb8, 0xca, 0x49, 0xc5, 0x47, 0x2e, 0xc4, 0xf2, - 0xa9, 0x97, 0xf2, 0xf0, 0x5a, 0x85, 0x9e, 0xc7, 0x86, 0xdc, 0xa0, 0x2b, - 0x39, 0xf9, 0xe9, 0xce, 0x6b, 0x7e, 0x19, 0xe0, 0x71, 0x67, 0x7a, 0x23, - 0x21, 0x5e, 0x7c, 0xe2, 0x9b, 0x59, 0xef, 0x07, 0x3d, 0x77, 0x42, 0xec, - 0x53, 0xf4, 0xbd, 0xde, 0xff, 0x2d, 0x7d, 0x0d, 0xb3, 0x8c, 0x3a, 0x7c, - 0x27, 0x95, 0x0d, 0x2e, 0xc4, 0xd5, 0xe9, 0x65, 0xc8, 0x88, 0x85, 0xb0, - 0xbb, 0xee, 0xea, 0xa0, 0x7f, 0xbf, 0x90, 0xc4, 0xe3, 0xb6, 0x07, 0xd6, - 0xd1, 0xa0, 0x45, 0xf7, 0x0a, 0x30, 0x5f, 0xcb, 0x6b, 0x17, 0xb7, 0xeb, - 0x32, 0x55, 0xa3, 0x37, 0x91, 0x07, 0xe1, 0x14, 0x76, 0xba, 0x64, 0xb1, - 0x1d, 0x2f, 0xe3, 0x31, 0x5e, 0xe8, 0x37, 0x24, 0x32, 0x80, 0x2b, 0x56, - 0xc1, 0x63, 0xc6, 0x02, 0xc8, 0x8b, 0xee, 0xaa, 0xf1, 0xfc, 0x46, 0xc8, - 0xe9, 0x49, 0x87, 0xd7, 0xd3, 0xcd, 0x31, 0xb9, 0x93, 0x5a, 0x04, 0x5a, - 0x4e, 0x90, 0x4c, 0x4c, 0xae, 0x41, 0xf3, 0x60, 0x4a, 0xb4, 0xac, 0x64, - 0xd1, 0x12, 0x4f, 0x05, 0x6e, 0x20, 0x8d, 0x53, 0xb5, 0x8c, 0xe5, 0x88, - 0xd5, 0x91, 0x00, 0xb9, 0xfb, 0xeb, 0x36, 0xd9, 0x0a, 0x65, 0x57, 0x43, - 0xa8, 0xc8, 0x76, 0x58, 0x2b, 0x88, 0x37, 0x8e, 0xfd, 0xeb, 0xe1, 0xe7, - 0x61, 0x9f, 0xfb, 0xa6, 0xb9, 0xb6, 0x02, 0x4a, 0x68, 0x6a, 0xcd, 0x0f, - 0xa9, 0xd2, 0x0a, 0xcd, 0x34, 0x4b, 0x57, 0x9b, 0xb4, 0x21, 0xd4, 0x40, - 0xe1, 0x3b, 0xed, 0x33, 0x60, 0x22, 0xb0, 0xca, 0xbb, 0x27, 0x44, 0x08, - 0x47, 0x3a, 0x6b, 0x16, 0xf0, 0x92, 0x9b, 0x62, 0xd6, 0xd1, 0xa8, 0x2e, - 0x42, 0x7a, 0x9e, 0xa9, 0x9e, 0xd7, 0xf7, 0xbe, 0x46, 0x4d, 0xf7, 0x95, - 0x0a, 0x87, 0x75, 0xa3, 0xf4, 0x3a, 0x30, 0x91, 0x64, 0x76, 0x83, 0x13, - 0xfe, 0xcb, 0xc4, 0x91, 0x79, 0xd9, 0x04, 0x49, 0x15, 0xcd, 0xc8, 0x5a, - 0x86, 0xd7, 0xaa, 0x22, 0xa1, 0x3c, 0xd2, 0xa4, 0x00, 0x62, 0xfd, 0x37, - 0x5f, 0x66, 0xb1, 0x84, 0x28, 0x45, 0x0e, 0x3d, 0x86, 0x13, 0x61, 0x8b, - 0xe9, 0xf4, 0x4c, 0x5e, 0x6c, 0x4b, 0xc1, 0xab, 0xd6, 0x52, 0x8b, 0x6a, - 0xdb, 0xff, 0x21, 0xb6, 0x63, 0x27, 0xbc, 0x1c, 0xd3, 0x06, 0xe3, 0x74, - 0x07, 0xc2, 0x00, 0x1e, 0x86, 0xc0, 0xfe, 0xa4, 0x7e, 0x20, 0xe9, 0x59, - 0xe5, 0x77, 0x5c, 0xcb, 0xd9, 0x4e, 0xaf, 0x8e, 0x86, 0x63, 0x9d, 0xdd, - 0x99, 0x16, 0xdd, 0x6f, 0x5c, 0xe5, 0xe1, 0x7e, 0x8f, 0x68, 0xab, 0xfd, - 0x01, 0x9b, 0xcb, 0x33, 0xc6, 0x5d, 0x90, 0x4e, 0x94, 0x0a, 0xd2, 0x1c, - 0xeb, 0xcb, 0xed, 0x81, 0xa1, 0x93, 0xb1, 0x86, 0x8a, 0x70, 0xab, 0x26, - 0x96, 0x5f, 0x6d, 0xb2, 0x45, 0x53, 0xf7, 0x94, 0xcb, 0xf8, 0xd8, 0x22, - 0x43, 0x26, 0x41, 0x0e, 0x74, 0xe2, 0x40, 0x03, 0xe3, 0xb4, 0xb8, 0xe9, - 0xd5, 0x84, 0x40, 0x22, 0x9d, 0x47, 0x34, 0x65, 0x7e, 0x91, 0x6a, 0xb8, - 0x9b, 0xb7, 0xc9, 0x7f, 0x62, 0xdb, 0x0d, 0xb6, 0x31, 0xfd, 0xe3, 0x11, - 0xb8, 0x8d, 0x26, 0x5e, 0x6c, 0x5c, 0xbc, 0xd9, 0x9c, 0xf6, 0xe8, 0x30, - 0x6c, 0xb6, 0x2a, 0x88, 0x6d, 0x06, 0xa4, 0x91, 0xf8, 0x9b, 0xea, 0xcf, - 0x06, 0x15, 0x92, 0x9a, 0xb5, 0x3e, 0x14, 0x10, 0xe0, 0x67, 0xf1, 0x77, - 0x6d, 0x6f, 0x25, 0xdb, 0xc4, 0xd8, 0x70, 0xb8, 0xf1, 0xf8, 0x8a, 0x1b, - 0x0b, 0x9d, 0xd6, 0x4d, 0xfb, 0x9b, 0xbc, 0x03, 0xe9, 0x1e, 0xd8, 0x8b, - 0xd4, 0x42, 0xd5, 0x2c, 0x18, 0xc3, 0x6b, 0xe5, 0xa5, 0xf6, 0x39, 0x14, - 0x38, 0x9d, 0x8f, 0xa6, 0x32, 0x40, 0x00, 0x09, 0x47, 0xe5, 0x24, 0x9a, - 0xdc, 0x2b, 0xcb, 0x33, 0xac, 0xe9, 0x16, 0x86, 0x75, 0x4e, 0x91, 0xa9, - 0x29, 0xd5, 0xad, 0x74, 0x48, 0xa3, 0x75, 0x5d, 0x96, 0x5d, 0x91, 0xc2, - 0x3d, 0x63, 0xb3, 0xdc, 0x90, 0x55, 0x73, 0x23, 0xef, 0xf5, 0x88, 0xcc, - 0x76, 0x6c, 0x7a, 0x11, 0xb2, 0x53, 0xcf, 0x96, 0x84, 0xa7, 0x52, 0x01, - 0xa5, 0xdc, 0x74, 0x03, 0x97, 0xfe, 0x69, 0x99, 0x14, 0xbf, 0x97, 0x51, - 0xcb, 0xb5, 0x6a, 0x0b, 0x48, 0xd4, 0xdb, 0x77, 0xd3, 0x52, 0x44, 0x7c, - 0x97, 0xbf, 0x8e, 0x20, 0x3c, 0xd2, 0x2c, 0x5c, 0x5c, 0xd1, 0x31, 0xeb, - 0xc2, 0x46, 0xdc, 0xf3, 0x95, 0x52, 0x60, 0x94, 0xb3, 0xfa, 0x30, 0x79, - 0x6c, 0x3f, 0x48, 0x4c, 0x4d, 0x5c, 0x38, 0xd8, 0x14, 0x59, 0x64, 0x9b, - 0x11, 0x4e, 0xb3, 0xef, 0x05, 0x77, 0x10, 0x22, 0xae, 0xf4, 0xfa, 0xbf, - 0x72, 0xba, 0x10, 0x29, 0x48, 0x74, 0x66, 0x93, 0xa4, 0x18, 0x3f, 0x88, - 0xd6, 0x3c, 0x6f, 0x23, 0xa2, 0x0b, 0xc2, 0x45, 0x5a, 0x1f, 0x10, 0xbf, - 0x5f, 0xb6, 0xa1, 0x4f, 0xab, 0x3a, 0x56, 0x75, 0x7d, 0x56, 0x37, 0x6d, - 0x3e, 0x59, 0x86, 0xf7, 0xbb, 0x3a, 0xb3, 0x63, 0xc5, 0xb2, 0xa5, 0x08, - 0xdb, 0xc4, 0xa8, 0x76, 0xed, 0xf5, 0x4e, 0x7c, 0x25, 0xaf, 0xa0, 0x57, - 0x47, 0xe1, 0x20, 0x9d, 0x4e, 0x1e, 0xcb, 0xe6, 0xaa, 0xb0, 0x04, 0x4e, - 0x61, 0x3d, 0xba, 0x76, 0x5a, 0xc6, 0xb4, 0x9a, 0xea, 0xfd, 0x49, 0x9b, - 0xa5, 0x04, 0xc8, 0x72, 0x7a, 0xbf, 0x6f, 0x25, 0x90, 0xe1, 0xe9, 0xa4, - 0xa8, 0x25, 0x8b, 0xf5, 0x2e, 0x19, 0x92, 0xd3, 0xab, 0x51, 0x77, 0x8d, - 0xcd, 0x8c, 0x53, 0x37, 0x43, 0x66, 0xd3, 0x54, 0x3e, 0x9a, 0xff, 0xb7, - 0x6f, 0x8f, 0x5d, 0xe5, 0x6e, 0x01, 0x8c, 0x44, 0x83, 0x13, 0xdc, 0x24, - 0x9e, 0x7a, 0xc1, 0xad, 0x9b, 0x2d, 0x60, 0x01, 0x45, 0x85, 0xd5, 0x4b, - 0x3c, 0x70, 0x0b, 0x76, 0xa2, 0x13, 0x50, 0x4a, 0xbd, 0xe9, 0xbe, 0x7e, - 0xda, 0x95, 0x38, 0x1e, 0x14, 0x92, 0x3a, 0xcc, 0xfc, 0xfc, 0x3c, 0xc3, - 0x03, 0x40, 0x8f, 0xc4, 0x53, 0x27, 0xee, 0x38, 0xf9, 0xbf, 0xd9, 0xf9, - 0x6d, 0x66, 0x3a, 0x01, 0xef, 0x89, 0xa3, 0x74, 0xdc, 0x41, 0x4d, 0x0e, - 0xbf, 0xd3, 0x51, 0xa4, 0xb2, 0xec, 0x0c, 0x5f, 0xa1, 0x99, 0xda, 0x93, - 0xd4, 0xaf, 0x1b, 0xc2, 0x63, 0x3c, 0x03, 0xf4, 0x2a, 0x53, 0xf5, 0x9b, - 0x8b, 0x8e, 0x03, 0xe3, 0x66, 0x79, 0x30, 0xc6, 0x1b, 0xa3, 0x5f, 0xf7, - 0x77, 0xc2, 0xf2, 0xc0, 0xc3, 0x4d, 0x17, 0x9d, 0x14, 0x57, 0x29, 0xbf, - 0x3e, 0x63, 0xcc, 0x51, 0xfd, 0xc0, 0x90, 0x01, 0x01, 0x21, 0x40, 0x58, - 0xcd, 0xc4, 0x54, 0x28, 0x30, 0xf4, 0xdb, 0x54, 0xa8, 0x0c, 0x14, 0x1d, - 0x48, 0x26, 0x92, 0x4a, 0x03, 0x96, 0xb8, 0x09, 0x9f, 0x6f, 0x49, 0xab, - 0x0c, 0x20, 0xe6, 0x90, 0x54, 0xe1, 0x31, 0x0c, 0x14, 0x4a, 0xc0, 0x26, - 0xf0, 0x11, 0xa8, 0x90, 0x62, 0x21, 0xa7, 0x2a, 0x89, 0xdb, 0x57, 0x71, - 0x7f, 0xbe, 0x1e, 0x0e, 0xca, 0x9f, 0xbb, 0xcd, 0xe8, 0xb0, 0xa1, 0x5e, - 0xac, 0xeb, 0x68, 0xd2, 0x4c, 0xbe, 0x08, 0xf4, 0xd5, 0x1d, 0x46, 0x2d, - 0xde, 0x20, 0x74, 0x5a, 0xc1, 0xc3, 0x51, 0x8d, 0x49, 0xf3, 0x97, 0xdc, - 0x39, 0xc4, 0x21, 0x9f, 0xcd, 0xb2, 0x13, 0x1d, 0x33, 0x09, 0xa9, 0x21, - 0x17, 0xb1, 0x24, 0xc6, 0xa4, 0x7a, 0xb2, 0xed, 0xe7, 0xde, 0xda, 0x3e, - 0x16, 0x92, 0xea, 0x16, 0x86, 0xfc, 0x83, 0xb4, 0xbf, 0x59, 0x59, 0x63, - 0x4a, 0x7d, 0x3e, 0x61, 0xe2, 0xee, 0xbc, 0xbe, 0xf8, 0x38, 0x6f, 0x4d, - 0x3a, 0x2a, 0x8a, 0x94, 0x7b, 0xae, 0x23, 0x9b, 0x21, 0xc1, 0x06, 0xb4, - 0x49, 0xb3, 0x45, 0x55, 0xa9, 0xb0, 0x92, 0x6f, 0x48, 0xa5, 0x7e, 0x90, - 0xb1, 0x26, 0xe1, 0x0c, 0x7a, 0x8a, 0x9f, 0xe7, 0x2e, 0x1d, 0x68, 0xcc, - 0x34, 0x7e, 0xa0, 0x49, 0x38, 0xe2, 0xc3, 0x73, 0xff, 0xb5, 0xf8, 0xd8, - 0x3f, 0xd0, 0x76, 0x48, 0x5e, 0xf8, 0x4c, 0x6d, 0x11, 0x73, 0x01, 0x7a, - 0x60, 0x61, 0x47, 0xcf, 0x12, 0xe9, 0xef, 0x7d, 0x0c, 0xe3, 0xab, 0x0f, - 0x82, 0xdb, 0x42, 0xdd, 0x89, 0xf6, 0x84, 0x1b, 0xa2, 0xce, 0x16, 0x64, - 0x5a, 0xb5, 0x84, 0xec, 0x69, 0x31, 0x99, 0x07, 0x5d, 0x3b, 0x10, 0x90, - 0x74, 0x47, 0xc0, 0xb1, 0x72, 0x05, 0x96, 0x4c, 0x4f, 0x61, 0xa2, 0x60, - 0x3b, 0x29, 0x7e, 0xaa, 0x63, 0xf9, 0xc6, 0x1f, 0xd9, 0xa7, 0xe8, 0x6d, - 0x39, 0xa5, 0x4b, 0x08, 0x15, 0x68, 0x04, 0x8d, 0xa1, 0x70, 0x69, 0x8e, - 0x07, 0xb3, 0xac, 0x40, 0x31, 0x1e, 0xde, 0x98, 0x02, 0x2f, 0xe1, 0x97, - 0x6b, 0xb3, 0xe9, 0x03, 0x35, 0x42, 0xb1, 0x35, 0xe6, 0x52, 0x66, 0x52, - 0xf1, 0x05, 0x1c, 0xe3, 0x1e, 0xf8, 0x0d, 0x55, 0xf6, 0x47, 0xfb, 0x4c, - 0x9d, 0x75, 0x90, 0xbe, 0xee, 0x1f, 0xed, 0xd8, 0x73, 0x29, 0x8b, 0x9b, - 0x2e, 0x63, 0x7f, 0xaf, 0xa4, 0xd9, 0x9c, 0x56, 0x6c, 0x2e, 0xb9, 0xfc, - 0x2e, 0x9d, 0xcb, 0x10, 0xc3, 0x82, 0xc9, 0xae, 0xf6, 0xb0, 0xdb, 0x22, - 0x4f, 0x04, 0x2b, 0x68, 0x33, 0x9b, 0x08, 0xda, 0x24, 0x95, 0x9a, 0xa0, - 0xed, 0xf7, 0x2f, 0xf9, 0xd2, 0xce, 0x65, 0xff, 0xf0, 0xd5, 0x75, 0xa7, - 0x3f, 0xb4, 0x44, 0x70, 0x7e, 0x1d, 0x23, 0x54, 0xd7, 0x99, 0xdd, 0xff, - 0x81, 0x78, 0x97, 0xa8, 0xbd, 0x9e, 0x36, 0x80, 0x5e, 0xde, 0xe8, 0x99, - 0x9a, 0xc7, 0x3c, 0xc0, 0x8a, 0xb1, 0xde, 0x7e, 0x01, 0xb4, 0x52, 0x65, - 0x32, 0x46, 0xae, 0x20, 0x83, 0x02, 0x95, 0xdf, 0x49, 0x98, 0x96, 0xaa, - 0x2c, 0xd0, 0x9b, 0xd5, 0xd9, 0x4b, 0xc6, 0xf9, 0xef, 0xcb, 0x32, 0xf2, - 0xbd, 0x60, 0xd9, 0x7e, 0x66, 0x68, 0x4d, 0xe1, 0xc2, 0x68, 0x7a, 0xf5, - 0x2b, 0x06, 0x00, 0x77, 0xe9, 0xac, 0x80, 0xe6, 0xe0, 0xc3, 0x3a, 0x88, - 0x71, 0x97, 0x7d, 0xfb, 0x9f, 0x3e, 0x0d, 0x37, 0x17, 0xe8, 0x80, 0x3e, - 0x2d, 0xcc, 0x4d, 0x91, 0x6e, 0xdb, 0x0f, 0xa9, 0x70, 0xbb, 0x4f, 0xdd, - 0x9f, 0x7e, 0x2c, 0x0b, 0x4c, 0xff, 0xc2, 0xff, 0x0e, 0x79, 0x8c, 0x92, - 0x1d, 0x98, 0xee, 0x98, 0x9b, 0x73, 0x9f, 0x6e, 0x74, 0xbb, 0x60, 0xab, - 0x54, 0xb8, 0xe4, 0x39, 0xe3, 0x80, 0xa6, 0xcd, 0xf6, 0xea, 0x39, 0x55, - 0xec, 0xa8, 0xf3, 0x2b, 0xf1, 0x57, 0xd5, 0x30, 0x0f, 0xd4, 0xd4, 0x33, - 0xff, 0xc3, 0x7d, 0xb0, 0x84, 0x6c, 0x4f, 0x4c, 0xb3, 0xc2, 0xfb, 0x48, - 0x61, 0x5d, 0x2e, 0x09, 0x20, 0x10, 0x44, 0x6b, 0x65, 0x77, 0xef, 0x8e, - 0x46, 0xcb, 0x1f, 0xc7, 0x48, 0x04, 0x92, 0xf2, 0x2b, 0x2f, 0x60, 0x11, - 0x56, 0x62, 0xc6, 0x26, 0x79, 0xc5, 0xba, 0x7e, 0x58, 0x87, 0x1f, 0xf5, - 0xae, 0x52, 0x4b, 0xeb, 0xab, 0x63, 0x25, 0x0d, 0xd0, 0x67, 0x89, 0x48, - 0x86, 0x97, 0x24, 0x64, 0x3c, 0x1a, 0x31, 0xbc, 0x2c, 0x98, 0xe9, 0x60, - 0x15, 0xb1, 0x2f, 0x4b, 0xbd, 0x7c, 0x0a, 0x27, 0x3b, 0x9f, 0x5b, 0x9b, - 0x5b, 0xfe, 0xb6, 0xd4, 0x74, 0x54, 0x72, 0x72, 0xa6, 0x39, 0x5e, 0xbb, - 0x90, 0xd4, 0x0a, 0x59, 0xf9, 0x18, 0xa3, 0xd3, 0xc6, 0xe9, 0x2f, 0x42, - 0x51, 0xd5, 0xaa, 0xcf, 0xd8, 0xc2, 0x1c, 0x97, 0x3a, 0x0f, 0xe3, 0xe8, - 0x18, 0xac, 0x7c, 0x2c, 0x61, 0xbe, 0xc1, 0x57, 0xa7, 0xe1, 0x1e, 0x93, - 0x0b, 0x56, 0xc5, 0x12, 0x00, 0x97, 0xb4, 0x8c, 0x0e, 0x82, 0xab, 0x21, - 0x81, 0xc8, 0x89, 0x03, 0xab, 0x1f, 0x68, 0xb2, 0x10, 0xdd, 0xee, 0x44, - 0x79, 0xa4, 0x3d, 0x4e, 0xf8, 0xa2, 0x51, 0x59, 0x2e, 0x07, 0xf6, 0x02, - 0x20, 0x55, 0x66, 0x99, 0x14, 0xd0, 0x2f, 0xbf, 0x7a, 0x92, 0x54, 0x07, - 0x97, 0x51, 0xd2, 0x3f, 0xc0, 0xc5, 0xba, 0x78, 0x5a, 0xa4, 0x98, 0x41, - 0x16, 0x85, 0xf5, 0xf7, 0x5a, 0xea, 0xe9, 0x4b, 0x38, 0x63, 0x60, 0x20, - 0x5d, 0xc8, 0x97, 0xd4, 0x8c, 0xdf, 0xe6, 0x0d, 0xa5, 0x22, 0xc3, 0x1d, - 0x57, 0x8e, 0xc3, 0xdd, 0xa9, 0x75, 0x14, 0xf2, 0xba, 0x62, 0x8c, 0x62, - 0x6a, 0x37, 0x63, 0x70, 0x9a, 0x4b, 0x70, 0xb9, 0x24, 0x44, 0x6e, 0x0e, - 0xa9, 0x71, 0x17, 0x74, 0x67, 0x4e, 0xe2, 0x3b, 0xfe, 0x98, 0x80, 0xa9, - 0xea, 0x1e, 0x37, 0xd6, 0x7b, 0x2f, 0xab, 0x25, 0xd5, 0x5b, 0x4c, 0x67, - 0xb0, 0x5b, 0x55, 0x16, 0x39, 0xb4, 0x63, 0x7a, 0xb0, 0xdc, 0xc8, 0x84, - 0x82, 0xea, 0x47, 0x1f, 0x76, 0xb8, 0xb3, 0xc7, 0x81, 0x04, 0x6d, 0x68, - 0xa1, 0x18, 0x62, 0x39, 0x4e, 0x01, 0x69, 0x7f, 0x3f, 0x8a, 0x30, 0x58, - 0xf8, 0x30, 0x6d, 0x4b, 0x83, 0xf3, 0x70, 0xcf, 0x2e, 0x21, 0xe5, 0x8c, - 0x91, 0x2b, 0xb8, 0xb6, 0xe1, 0xd3, 0xc5, 0xe0, 0xb9, 0x0b, 0xae, 0x5c, - 0x84, 0xf1, 0xda, 0xb9, 0xcb, 0xff, 0x7b, 0x4a, 0x98, 0x66, 0x3a, 0x10, - 0xfd, 0x89, 0x56, 0x6f, 0xce, 0xd1, 0x2f, 0x1f, 0xe2, 0xfc, 0x83, 0x18, - 0xde, 0x46, 0x83, 0x94, 0x66, 0x76, 0xcb, 0x32, 0xd8, 0x34, 0xa5, 0xe8, - 0x49, 0x53, 0xe7, 0x96, 0xdf, 0x87, 0x8e, 0x78, 0x8c, 0xfa, 0xa8, 0x3d, - 0xbd, 0x8a, 0x4e, 0x37, 0x1d, 0x3b, 0x0a, 0xd8, 0xc4, 0x62, 0xa5, 0x06, - 0x2d, 0xa0, 0x4f, 0x80, 0x83, 0x61, 0x74, 0xde, 0x9e, 0x39, 0xa2, 0x25, - 0x45, 0x2c, 0x5c, 0x82, 0xfb, 0x13, 0x06, 0xd5, 0x9a, 0xcb, 0xc2, 0x93, - 0x82, 0xec, 0xa1, 0x3f, 0xed, 0x13, 0x8b, 0x88, 0x7c, 0xed, 0x4a, 0xac, - 0xfa, 0x0a, 0x2e, 0x52, 0x9d, 0xe7, 0x32, 0x28, 0xfd, 0x8e, 0xa0, 0x35, - 0x24, 0x80, 0x29, 0x67, 0x83, 0xb1, 0xa3, 0xe2, 0xaa, 0x5b, 0xc3, 0xa7, - 0x8e, 0x5e, 0x3b, 0xbb, 0x41, 0x53, 0x18, 0xb7, 0xbc, 0xc3, 0x66, 0xbb, - 0xf3, 0xec, 0xb0, 0x98, 0x19, 0x8c, 0xf3, 0x29, 0xed, 0x0d, 0x70, 0xa8, - 0xef, 0x66, 0xb4, 0xbf, 0xb3, 0xf1, 0xa6, 0xdb, 0x75, 0xab, 0x7b, 0x51, - 0x81, 0x26, 0xa8, 0x74, 0x80, 0xbd, 0xd0, 0xd5, 0xc1, 0xce, 0x3d, 0xac, - 0x11, 0x5a, 0xdd, 0xb1, 0x4c, 0x87, 0x79, 0x1a, 0x84, 0x1b, 0x0c, 0xa2, - 0xfe, 0xa9, 0xc1, 0xb2, 0xd7, 0x80, 0x0a, 0x61, 0xb5, 0x68, 0xfb, 0xf6, - 0xd9, 0xe0, 0x9e, 0x59, 0x0c, 0xa6, 0x05, 0x43, 0x7a, 0xed, 0x56, 0xfc, - 0xa1, 0x7f, 0x1c, 0x5f, 0xe7, 0x84, 0x59, 0x8d, 0x61, 0x30, 0x06, 0x7f, - 0xa7, 0x53, 0xa6, 0xb7, 0x14, 0xc9, 0x1d, 0xd9, 0xc9, 0x33, 0xa5, 0x57, - 0x52, 0x9a, 0x50, 0xb8, 0x82, 0x30, 0x85, 0x0f, 0xc5, 0x4c, 0xb2, 0x14, - 0x55, 0xa9, 0x52, 0x9d, 0x72, 0x18, 0x67, 0x41, 0x30, 0x38, 0x20, 0xbc, - 0x71, 0x3a, 0x1d, 0x9e, 0xde, 0x3d, 0x42, 0x45, 0xcc, 0xf6, 0x86, 0xe8, - 0xec, 0x81, 0x73, 0x2d, 0xae, 0x44, 0x5b, 0x11, 0x44, 0x77, 0xc9, 0x8f, - 0x90, 0xf6, 0xb2, 0x5c, 0xaa, 0x01, 0xf0, 0xd1, 0x63, 0x29, 0x98, 0xbf, - 0x36, 0x7d, 0x9b, 0x60, 0x47, 0xe3, 0xf7, 0xcb, 0x9e, 0xe8, 0x2d, 0xdd, - 0x07, 0x43, 0xc7, 0x9f, 0xb1, 0x2f, 0xe1, 0xda, 0x50, 0x1b, 0x4f, 0x25, - 0xce, 0x71, 0x2d, 0xe4, 0x5b, 0x6e, 0x09, 0xb2, 0x09, 0xf3, 0xd2, 0x75, - 0x53, 0x85, 0x79, 0x13, 0x5f, 0xfe, 0xb5, 0xd3, 0xfc, 0x3c, 0xe8, 0xc4, - 0xe0, 0x15, 0xa0, 0xf8, 0x8e, 0xf4, 0x36, 0xa7, 0xe7, 0xaf, 0x86, 0xf3, - 0x9e, 0x3e, 0xfb, 0xbf, 0xc5, 0xbe, 0xe3, 0x26, 0x47, 0x0b, 0xd7, 0x9d, - 0x15, 0xff, 0xe4, 0xaf, 0x57, 0x3d, 0x74, 0x41, 0x33, 0xa0, 0xf7, 0xf0, - 0x54, 0x3a, 0x79, 0x81, 0x38, 0xfc, 0x31, 0xf9, 0x10, 0x5b, 0x1f, 0xec, - 0xff, 0x0f, 0xca, 0xe9, 0xd2, 0x30, 0x57, 0x2c, 0x29, 0xb1, 0x61, 0x69, - 0x40, 0x9b, 0x54, 0x5a, 0x1b, 0xf2, 0xb4, 0x0a, 0x42, 0xe5, 0xfb, 0xd5, - 0x7b, 0x7a, 0x25, 0x90, 0x8c, 0xa7, 0x04, 0xe1, 0x52, 0x4d, 0x6f, 0xb0, - 0x95, 0x44, 0x87, 0x37, 0xef, 0x2f, 0x9e, 0xe8, 0xd5, 0x04, 0x1c, 0x51, - 0x77, 0xe3, 0x00, 0xdc, 0x68, 0xb2, 0x29, 0x8e, 0xb3, 0x35, 0xe8, 0xb3, - 0x13, 0x00, 0x98, 0x0e, 0x5d, 0x04, 0xc0, 0x38, 0x34, 0x53, 0xb0, 0x7a, - 0x2b, 0x4b, 0xbc, 0x9a, 0x57, 0xd0, 0x3f, 0x53, 0x4c, 0xed, 0x40, 0xa9, - 0xd5, 0xaa, 0x34, 0x60, 0xf5, 0x91, 0xc2, 0x92, 0x8a, 0xd6, 0x6b, 0x37, - 0x0d, 0x8b, 0x2b, 0x24, 0x96, 0xb2, 0xa0, 0x1e, 0xc9, 0x09, 0xda, 0x90, - 0x23, 0x56, 0xa3, 0x56, 0x6e, 0x8d, 0xbc, 0x17, 0xd5, 0x06, 0xac, 0xd4, - 0x56, 0x01, 0xcd, 0x99, 0x4a, 0xa8, 0x88, 0x56, 0x2a, 0xad, 0xa7, 0x09, - 0x59, 0xe0, 0xc9, 0x62, 0x8c, 0xa4, 0x3a, 0x1f, 0x40, 0x46, 0x47, 0xfd, - 0x3b, 0x50, 0x6c, 0x22, 0x07, 0x1a, 0x75, 0xe0, 0x7e, 0x89, 0x23, 0xe3, - 0xe6, 0x60, 0x7a, 0xdb, 0xd8, 0xf5, 0xf3, 0xa7, 0x9e, 0x77, 0xeb, 0x62, - 0xa1, 0x25, 0x3b, 0x70, 0xc0, 0xb3, 0xda, 0xe0, 0xed, 0xc8, 0xc6, 0x6c, - 0x83, 0x20, 0x89, 0xc0, 0xab, 0xc0, 0xfd, 0xf1, 0xca, 0xc6, 0x23, 0xca, - 0xfa, 0x87, 0xf7, 0xf3, 0xe3, 0x73, 0xe1, 0x95, 0x18, 0xc9, 0x3c, 0xd4, - 0xf8, 0x2d, 0xd1, 0x46, 0x6b, 0x6f, 0x94, 0x2d, 0x25, 0xcd, 0xe2, 0x87, - 0x71, 0xe9, 0x08, 0x28, 0x47, 0x34, 0xa4, 0xc4, 0xe1, 0xf5, 0xe7, 0x38, - 0x16, 0x55, 0xd3, 0x99, 0x0d, 0x0b, 0xd4, 0xfb, 0x0f, 0x80, 0xd9, 0x91, - 0x83, 0xaa, 0xc6, 0x5e, 0x87, 0xc5, 0xe6, 0xc3, 0xb8, 0x1f, 0x24, 0xa9, - 0x7b, 0x5a, 0xdd, 0x4f, 0xfe, 0xae, 0x9a, 0x78, 0x40, 0xd2, 0x61, 0x9c, - 0x5a, 0x18, 0xa5, 0x57, 0x76, 0x6b, 0x16, 0xe2, 0x18, 0xa8, 0x9c, 0xad, - 0x75, 0xac, 0xea, 0x35, 0x09, 0x41, 0xc7, 0xf7, 0x20, 0x55, 0x1f, 0xe5, - 0x77, 0x57, 0x50, 0xd1, 0xda, 0xe5, 0x6b, 0x38, 0x27, 0xa2, 0x16, 0xd5, - 0xf6, 0xb1, 0xa0, 0x20, 0xbb, 0x83, 0xf6, 0x50, 0xb2, 0x5c, 0x21, 0xd6, - 0x8d, 0x45, 0x21, 0x9b, 0xa5, 0xf1, 0xd0, 0x2c, 0x31, 0x37, 0x41, 0xb0, - 0x4f, 0x42, 0xc9, 0xe5, 0x59, 0x52, 0x7f, 0xe9, 0xd3, 0x9e, 0x7e, 0xe9, - 0xca, 0xb4, 0x6c, 0x46, 0xb8, 0xd0, 0x6b, 0xd5, 0xa6, 0xc8, 0x07, 0x66, - 0x52, 0x32, 0x5d, 0x49, 0xc6, 0xcc, 0x2c, 0x1b, 0x49, 0xe0, 0x3a, 0xe5, - 0x25, 0x18, 0x6a, 0x94, 0x1b, 0x7a, 0xc2, 0xb0, 0x82, 0x56, 0x96, 0xa2, - 0x3e, 0xa1, 0x94, 0x28, 0xef, 0x1b, 0xb0, 0x9a, 0xd9, 0x66, 0xbc, 0x22, - 0x4b, 0x18, 0xe0, 0xf7, 0x6a, 0x82, 0x85, 0x8e, 0x31, 0x89, 0x63, 0x6d, - 0x03, 0x20, 0xc6, 0xbc, 0x77, 0xfa, 0xad, 0xcf, 0x1a, 0xc3, 0x0e, 0x2f, - 0x1a, 0x19, 0x4c, 0xbb, 0x6b, 0x3c, 0x6e, 0x03, 0x53, 0xde, 0xcb, 0x96, - 0xce, 0xcc, 0xae, 0x7b, 0x79, 0xda, 0x1b, 0x73, 0x63, 0xe7, 0x66, 0xfe, - 0x94, 0x98, 0x65, 0x6e, 0xc0, 0x32, 0x58, 0xd1, 0x80, 0x10, 0x87, 0xdd, - 0xf3, 0x3c, 0x1c, 0xa7, 0xd6, 0x55, 0x73, 0xe0, 0xc6, 0xad, 0x34, 0x5a, - 0x74, 0xd6, 0x26, 0x07, 0x05, 0x06, 0x13, 0x47, 0x17, 0x48, 0x88, 0x53, - 0xae, 0x4e, 0x37, 0xcc, 0x7d, 0xcf, 0xfa, 0xc4, 0xff, 0xdc, 0xf0, 0x00, - 0x71, 0x5a, 0xe7, 0x81, 0x7b, 0x24, 0xa4, 0x91, 0x2f, 0xc0, 0x9e, 0xa3, - 0x44, 0x0e, 0xd6, 0x99, 0x42, 0x70, 0xf9, 0x1e, 0xad, 0x4e, 0xe4, 0x27, - 0x75, 0x63, 0xc6, 0xc5, 0x27, 0x2d, 0xf7, 0x4e, 0x33, 0x43, 0x81, 0x3d, - 0xbc, 0x23, 0x68, 0x67, 0x3c, 0x77, 0xe1, 0x62, 0x4c, 0x10, 0xd2, 0x80, - 0x38, 0xa2, 0xd5, 0x67, 0x1c, 0x34, 0xe6, 0xfe, 0xe0, 0x76, 0xde, 0xfe, - 0x47, 0x31, 0x1a, 0x6c, 0x56, 0x6c, 0x6d, 0xaf, 0x29, 0x3f, 0x07, 0x1a, - 0x56, 0x7c, 0x0a, 0x55, 0x8b, 0xac, 0xa8, 0xb2, 0x6f, 0x62, 0xce, 0xa4, - 0xdd, 0xff, 0x88, 0xa4, 0x70, 0xe1, 0xbc, 0xeb, 0xba, 0x3d, 0x08, 0xe1, - 0x94, 0xa0, 0x1e, 0x00, 0x93, 0x76, 0xed, 0x79, 0xff, 0x0c, 0xc3, 0x9a, - 0xc0, 0x11, 0x84, 0x77, 0xf4, 0x06, 0x35, 0x25, 0x79, 0xd4, 0x2f, 0x0b, - 0xc2, 0x01, 0xd3, 0x37, 0xba, 0x36, 0xdd, 0x7e, 0x25, 0xf4, 0x47, 0x59, - 0x5f, 0x97, 0xc0, 0x15, 0x41, 0x58, 0x47, 0x6a, 0xe5, 0x03, 0x52, 0x14, - 0xdf, 0xcf, 0x00, 0xdb, 0x2e, 0xdd, 0x24, 0x72, 0x3f, 0x1a, 0xa9, 0xf7, - 0xe2, 0xab, 0xe4, 0x30, 0xcd, 0xd5, 0x63, 0x09, 0xab, 0xe3, 0x6c, 0x13, - 0xa0, 0x55, 0xd6, 0xe8, 0xa4, 0x29, 0x63, 0x5f, 0x8c, 0x66, 0xd7, 0xa3, - 0x1f, 0x0e, 0x08, 0x99, 0x32, 0xab, 0x1a, 0xc2, 0x58, 0xca, 0xb9, 0xf2, - 0x96, 0x47, 0x8b, 0xf1, 0x4e, 0x88, 0x3c, 0x54, 0x74, 0x9a, 0x1e, 0xe7, - 0x38, 0x8e, 0xca, 0x05, 0x7b, 0xd8, 0x7c, 0x6c, 0x1e, 0x89, 0x16, 0x45, - 0x08, 0x27, 0x45, 0x02, 0xd5, 0x39, 0xcc, 0x62, 0x53, 0xbd, 0x22, 0xa0, - 0x40, 0xbe, 0x1b, 0xe8, 0xae, 0x9a, 0x55, 0x77, 0xe9, 0x36, 0x2b, 0x13, - 0xc1, 0xd5, 0xe8, 0xf5, 0x32, 0xf5, 0x28, 0x4a, 0x0c, 0x88, 0xea, 0xc2, - 0xb5, 0xdb, 0xfd, 0x9d, 0xf1, 0x35, 0x36, 0xa6, 0x82, 0x7d, 0x80, 0xf8, - 0x03, 0xa2, 0x00, 0x9e, 0x7c, 0x36, 0xcf, 0xfa, 0xbf, 0x0a, 0xf7, 0xc0, - 0x38, 0x1b, 0xc8, 0xb8, 0x46, 0xb4, 0x4c, 0x40, 0x68, 0xeb, 0x73, 0x7a, - 0xfa, 0xa5, 0x91, 0xb0, 0xd8, 0x5a, 0x81, 0x8d, 0xb1, 0xcd, 0xf0, 0x1b, - 0x40, 0xfd, 0xe2, 0xb7, 0x18, 0xc7, 0x69, 0xda, 0x59, 0x28, 0xd5, 0xa5, - 0x0a, 0x5d, 0x0b, 0x4c, 0x72, 0xa9, 0x61, 0xa5, 0xfb, 0x7e, 0xfd, 0xf5, - 0x25, 0xe8, 0xb9, 0x6a, 0xb0, 0x00, 0x5e, 0xac, 0x0a, 0x9e, 0xeb, 0x28, - 0x84, 0x08, 0x1b, 0xd0, 0x44, 0xe8, 0x4a, 0x87, 0x90, 0x7f, 0x6e, 0x46, - 0x7c, 0x0d, 0x1d, 0x75, 0x3f, 0x4d, 0x36, 0xd3, 0x83, 0xeb, 0xe5, 0x0e, - 0x14, 0x43, 0x06, 0x44, 0x4f, 0xe4, 0x15, 0xa8, 0x6a, 0x9c, 0x0c, 0xbb, - 0x97, 0x98, 0x3f, 0x13, 0x48, 0xc8, 0xa0, 0x02, 0x34, 0xc8, 0x86, 0xef, - 0x31, 0x37, 0xe3, 0x46, 0x3e, 0x08, 0xe7, 0xc5, 0x4b, 0x65, 0x21, 0x05, - 0x25, 0x89, 0xdd, 0x1c, 0x58, 0x5c, 0x68, 0x43, 0x1f, 0xc3, 0x87, 0x81, - 0xff, 0x0b, 0x2e, 0x15, 0xce, 0x33, 0x6e, 0x89, 0x2f, 0x29, 0x63, 0x9d, - 0x44, 0xdc, 0x79, 0xe5, 0xd4, 0x71, 0x15, 0xdf, 0xd1, 0x9b, 0xe3, 0x25, - 0xe3, 0x8b, 0x02, 0x22, 0xe2, 0xca, 0x9e, 0x57, 0xac, 0x16, 0x80, 0x73, - 0x9e, 0x02, 0xa2, 0xfc, 0x34, 0x2f, 0x71, 0xec, 0x56, 0xe7, 0x90, 0x25, - 0xa2, 0xab, 0xf3, 0xde, 0x30, 0x08, 0xb4, 0x2d, 0xf0, 0x3d, 0x85, 0x1b, - 0x47, 0x89, 0x8a, 0x33, 0x6e, 0x74, 0x4a, 0x21, 0xfd, 0x18, 0xcb, 0x02, - 0x35, 0x3b, 0x23, 0xdc, 0x6c, 0x53, 0x6e, 0x8c, 0x35, 0x65, 0xe3, 0xf5, - 0x86, 0x10, 0xe4, 0xda, 0x14, 0x84, 0xd6, 0x6f, 0x80, 0x99, 0xbd, 0xf2, - 0xd5, 0xb6, 0xa5, 0xd2, 0xe3, 0xa9, 0xee, 0x5c, 0x32, 0x28, 0x98, 0x73, - 0x34, 0x4b, 0xb3, 0x85, 0xba, 0x16, 0x70, 0xa0, 0x68, 0xef, 0x92, 0xe6, - 0xea, 0xb8, 0x89, 0xc9, 0xe5, 0x7b, 0x0b, 0x36, 0x7f, 0xa9, 0x30, 0x04, - 0xa0, 0x4c, 0x26, 0xb4, 0x53, 0x99, 0xe0, 0x54, 0x01, 0xc9, 0xe8, 0xe5, - 0x56, 0x7e, 0x1e, 0x76, 0xfa, 0x5c, 0x50, 0x89, 0x8f, 0x80, 0x05, 0x30, - 0x5c, 0xaf, 0xef, 0x66, 0x2b, 0x1d, 0xaf, 0x14, 0x98, 0xdb, 0x46, 0x59, - 0xde, 0x3e, 0xef, 0xf7, 0xef, 0x89, 0x26, 0xe3, 0x72, 0xe9, 0xc6, 0x78, - 0xae, 0x86, 0xc8, 0x1b, 0xc5, 0x41, 0x3f, 0x1f, 0x90, 0xa5, 0x18, 0x46, - 0x99, 0xcb, 0x9e, 0xb5, 0x3f, 0x66, 0x40, 0x3b, 0x57, 0x17, 0xfa, 0x8b, - 0x29, 0x75, 0x7f, 0xe1, 0xb5, 0xd1, 0xe0, 0x81, 0x19, 0x2a, 0xd0, 0xb7, - 0xf9, 0x70, 0x81, 0x03, 0x1b, 0xff, 0x05, 0x07, 0x18, 0x0b, 0xb3, 0xad, - 0x6c, 0xb8, 0x02, 0xe1, 0xcd, 0x20, 0x9a, 0xa1, 0x82, 0x1f, 0x13, 0x7b, - 0x7c, 0xa3, 0x6b, 0x0b, 0x21, 0x3c, 0xe2, 0x8c, 0xe6, 0xa6, 0x6f, 0x01, - 0x37, 0x2a, 0xb2, 0x2b, 0x41, 0xa0, 0x2a, 0xf6, 0xc8, 0x1e, 0xe7, 0x05, - 0x40, 0x2f, 0x63, 0xa6, 0xc1, 0xc8, 0x6a, 0x5e, 0x5e, 0x4e, 0x0a, 0x61, - 0xf0, 0x27, 0x11, 0xf0, 0x9c, 0x4b, 0x36, 0xac, 0x50, 0x3e, 0xf2, 0xa1, - 0x26, 0x77, 0x7a, 0x3c, 0x91, 0xdb, 0xf7, 0xaf, 0xd0, 0x9f, 0xb2, 0x04, - 0xe4, 0xdb, 0x00, 0x2d, 0xec, 0x0a, 0xbf, 0xa8, 0x66, 0x71, 0xc8, 0x64, - 0x9b, 0xd4, 0xff, 0xe7, 0x26, 0x63, 0xf9, 0x4d, 0xe8, 0x6d, 0x8d, 0xbc, - 0xca, 0x48, 0x99, 0xb3, 0x68, 0x45, 0x9d, 0x71, 0xf5, 0x6f, 0x7e, 0x4f, - 0xcd, 0xad, 0x9c, 0x78, 0x21, 0x08, 0xb1, 0x4c, 0x86, 0xcd, 0x06, 0x27, - 0xa3, 0x45, 0x6e, 0x7b, 0x50, 0x37, 0x95, 0xea, 0x05, 0x65, 0x78, 0x0d, - 0x10, 0x55, 0x0e, 0xee, 0xc9, 0x4c, 0x39, 0xaf, 0x8e, 0xed, 0xb6, 0x1b, - 0x34, 0xb2, 0x52, 0x11, 0x89, 0xb4, 0xda, 0x9a, 0x23, 0xc7, 0x1e, 0xdb, - 0x18, 0x78, 0x21, 0xa0, 0xb4, 0x93, 0xf3, 0xed, 0x63, 0x9d, 0x98, 0x30, - 0x16, 0xc5, 0x82, 0xf0, 0x0e, 0x6e, 0xbe, 0x91, 0x58, 0x4a, 0xa7, 0xdc, - 0xfa, 0xa9, 0xf5, 0x37, 0xae, 0xdb, 0x4a, 0xf4, 0xc7, 0x18, 0xa5, 0x89, - 0x4b, 0x96, 0x02, 0x79, 0x12, 0xb1, 0x34, 0xdb, 0xc5, 0x60, 0x57, 0xc5, - 0xf3, 0x3b, 0xbc, 0xa4, 0xcc, 0x3a, 0xd3, 0x90, 0x0e, 0x94, 0xa9, 0x0a, - 0x6f, 0xd5, 0x2b, 0x34, 0x3c, 0x4a, 0x65, 0xd0, 0x26, 0x42, 0x80, 0x0e, - 0x09, 0x54, 0xf3, 0xfe, 0xd8, 0x2d, 0x7e, 0x67, 0x66, 0x06, 0x71, 0x36, - 0xbd, 0x3c, 0x34, 0xe2, 0x19, 0x63, 0x5c, 0xcb, 0x42, 0x9c, 0x41, 0x56, - 0x64, 0x2e, 0x52, 0xcb, 0xc0, 0xf8, 0x6f, 0x25, 0x81, 0x20, 0x85, 0x6d, - 0x57, 0xc4, 0xdb, 0x64, 0x53, 0x22, 0x6a, 0x2d, 0x9f, 0x81, 0x6d, 0xb7, - 0x66, 0x61, 0xc5, 0x83, 0x5e, 0x6d, 0xbd, 0x47, 0xe8, 0xa1, 0x3e, 0xc8, - 0x63, 0x31, 0x39, 0x8b, 0x53, 0xa8, 0x76, 0x0e, 0x7c, 0x45, 0x6a, 0x6c, - 0xe2, 0x53, 0xb9, 0x97, 0x6c, 0x71, 0xc6, 0x95, 0x5c, 0xc7, 0xac, 0x4d, - 0x29, 0xf0, 0xa9, 0x6f, 0xdc, 0x0b, 0x50, 0x7d, 0x6b, 0x51, 0x6b, 0x79, - 0x45, 0x4e, 0x03, 0xd7, 0x02, 0xa0, 0x38, 0x34, 0xc9, 0x9f, 0x8e, 0xf6, - 0x31, 0x53, 0x75, 0x93, 0x6c, 0xda, 0x4a, 0x0b, 0xe4, 0xf6, 0x90, 0x40, - 0x07, 0x94, 0x9d, 0xb8, 0x9a, 0xa8, 0xff, 0xff, 0x7e, 0xd4, 0x31, 0x03, - 0x01, 0x1d, 0x89, 0x0a, 0x9f, 0xfb, 0xf5, 0x9e, 0x67, 0xa7, 0xa4, 0xd3, - 0x71, 0xb2, 0xfe, 0x21, 0xf0, 0x45, 0x48, 0x05, 0x63, 0x6b, 0x20, 0x04, - 0x54, 0xd8, 0x1a, 0xc4, 0xc5, 0x4b, 0x45, 0xec, 0xff, 0x85, 0xfb, 0xb7, - 0x02, 0x28, 0xfc, 0x57, 0xd4, 0xcc, 0x01, 0xf2, 0x99, 0x71, 0x1c, 0x88, - 0x11, 0x76, 0x93, 0xfa, 0x96, 0xfb, 0xa8, 0x46, 0x2d, 0x10, 0x1c, 0xd6, - 0x06, 0xb2, 0x42, 0x77, 0x05, 0x7b, 0xea, 0x4f, 0xcf, 0xc0, 0xb0, 0xe2, - 0xe2, 0x11, 0x9a, 0xff, 0xd7, 0xdc, 0x21, 0x8f, 0xc6, 0x85, 0x6b, 0x66, - 0x2f, 0xd5, 0x61, 0xe5, 0x0c, 0xc9, 0x89, 0x05, 0x9b, 0x04, 0x3d, 0x45, - 0xe6, 0x0f, 0x83, 0x9e, 0xf5, 0x1b, 0x12, 0xa1, 0xc9, 0x4e, 0x13, 0x32, - 0xfb, 0xf5, 0xc2, 0x92, 0xf5, 0x32, 0xdf, 0x61, 0x7d, 0xfa, 0xa4, 0x3b, - 0x7d, 0xa8, 0xa2, 0x00, 0xb9, 0xd4, 0x25, 0xf6, 0x22, 0x98, 0xea, 0xed, - 0x1d, 0x0e, 0x9f, 0x23, 0x99, 0xab, 0x16, 0xb5, 0x0b, 0x0b, 0x18, 0xd2, - 0x6b, 0x2b, 0x8a, 0x02, 0xfe, 0xb2, 0x6b, 0x1a, 0x0a, 0x89, 0x7e, 0x70, - 0x5d, 0x2e, 0x79, 0xa9, 0x1d, 0xf7, 0x34, 0x5f, 0x14, 0x7f, 0x27, 0x0b, - 0x76, 0x2b, 0x82, 0x0d, 0x49, 0x06, 0x85, 0xa9, 0x4f, 0xa2, 0x7a, 0x71, - 0xb2, 0x1a, 0xe7, 0x47, 0x41, 0x31, 0xd0, 0x8a, 0x15, 0x05, 0x53, 0xe5, - 0x17, 0x58, 0xff, 0xb9, 0x42, 0xfb, 0x3f, 0x67, 0x71, 0xfb, 0x1b, 0x41, - 0x6a, 0xc4, 0x22, 0xe6, 0x43, 0xd4, 0x2b, 0x98, 0x28, 0x4d, 0x4b, 0x03, - 0xa6, 0xdd, 0xfa, 0x58, 0x86, 0x63, 0xb1, 0x0c, 0xb2, 0xdc, 0x01, 0x43, - 0x93, 0xcd, 0xaa, 0x5b, 0xcd, 0x5d, 0x03, 0x41, 0xd2, 0xf9, 0x0a, 0x89, - 0xef, 0x7f, 0x6d, 0x0a, 0xd6, 0xa8, 0x70, 0x44, 0x4f, 0x11, 0xbd, 0xe0, - 0xf9, 0x78, 0x8e, 0xdf, 0xa2, 0x8a, 0xff, 0xf3, 0x55, 0xb0, 0xd5, 0x49, - 0x3e, 0x53, 0xfb, 0xb7, 0x4f, 0x86, 0x99, 0x89, 0x66, 0xb4, 0xca, 0x5f, - 0x14, 0x63, 0x4a, 0x70, 0x85, 0xf2, 0xae, 0x25, 0xfd, 0xb2, 0xee, 0x2e, - 0xa1, 0x3c, 0xa8, 0x0c, 0x9f, 0x92, 0x0d, 0x02, 0x37, 0xb7, 0xa1, 0x1b, - 0x2d, 0xca, 0x17, 0xc6, 0xe8, 0x7a, 0x21, 0x2c, 0x55, 0xa1, 0xb4, 0x3b, - 0xa4, 0xe6, 0x18, 0x31, 0xeb, 0x18, 0x3e, 0xfd, 0x30, 0x55, 0x17, 0x95, - 0x7e, 0xfd, 0x77, 0x18, 0xed, 0x78, 0xf0, 0x74, 0xdd, 0xc3, 0x04, 0xa3, - 0x18, 0x78, 0x9e, 0xd0, 0x70, 0xbb, 0xeb, 0xbb, 0xae, 0x20, 0xc3, 0xfc, - 0xf6, 0x9c, 0x95, 0x90, 0x1e, 0xdf, 0xab, 0xb6, 0xa3, 0x1a, 0x6a, 0x68, - 0x82, 0x97, 0x05, 0xc6, 0x06, 0x02, 0x6d, 0x1c, 0xf9, 0x4c, 0x18, 0xff, - 0x05, 0x65, 0xad, 0xbc, 0xb3, 0xa5, 0xb2, 0x30, 0x7b, 0x6d, 0x08, 0x2d, - 0x9d, 0xb5, 0x7b, 0xd5, 0x85, 0xd8, 0x8c, 0xb2, 0xab, 0xc7, 0x71, 0x65, - 0x84, 0x3f, 0x7a, 0x99, 0x0c, 0xad, 0x95, 0x8f, 0x62, 0x41, 0xd4, 0x14, - 0xbb, 0x3b, 0x7b, 0xef, 0xe0, 0x68, 0x3f, 0x04, 0xa4, 0x8d, 0xcb, 0xbf, - 0x9a, 0x28, 0x41, 0x54, 0x46, 0xf6, 0xe5, 0x80, 0xc0, 0x8d, 0xa1, 0x09, - 0xb5, 0xdf, 0x13, 0xce, 0x6b, 0x74, 0x70, 0x67, 0x3f, 0xd9, 0xc9, 0x0b, - 0x54, 0xba, 0xd2, 0xf6, 0x8e, 0x27, 0xd0, 0x64, 0x94, 0x10, 0xca, 0x43, - 0xda, 0xd3, 0x57, 0x37, 0xab, 0xbe, 0xfb, 0x80, 0x28, 0x20, 0x10, 0xc5, - 0x05, 0x8f, 0x31, 0xa9, 0xf2, 0xce, 0x0a, 0x33, 0x87, 0x8a, 0xf6, 0x6a, - 0xbf, 0x60, 0xae, 0xd7, 0x8b, 0xdf, 0x0a, 0x91, 0x27, 0x92, 0x11, 0x84, - 0x42, 0x48, 0x48, 0x25, 0x34, 0xc8, 0x03, 0x1b, 0xa1, 0x85, 0x1a, 0x90, - 0xed, 0x5d, 0x4b, 0x37, 0xc1, 0x1a, 0xae, 0x0d, 0x30, 0x91, 0x80, 0x14, - 0x6e, 0x30, 0xc4, 0x6f, 0xd4, 0x54, 0xd1, 0x70, 0x35, 0x65, 0xdc, 0xcf, - 0xb2, 0x96, 0xe8, 0xb7, 0x46, 0x2d, 0x4d, 0x64, 0x16, 0xa7, 0x2d, 0x7c, - 0x0a, 0x26, 0x91, 0x38, 0xb1, 0xf1, 0xa0, 0xaf, 0xac, 0xab, 0x26, 0xa5, - 0x88, 0xf2, 0x50, 0x15, 0x86, 0xac, 0x11, 0xf5, 0x47, 0xa1, 0x6b, 0xab, - 0xed, 0xbf, 0x2d, 0xe8, 0x75, 0x24, 0x2d, 0x1e, 0x60, 0xc4, 0xfb, 0xe8, - 0x34, 0x27, 0x79, 0x43, 0xb4, 0x05, 0x2b, 0x76, 0xcc, 0xa7, 0x58, 0x4e, - 0xe1, 0x69, 0x74, 0xfb, 0x31, 0x9d, 0x5c, 0xc3, 0xb4, 0xbc, 0xa6, 0x05, - 0x4d, 0xaa, 0x51, 0x02, 0xfc, 0xf4, 0x7b, 0xea, 0x73, 0xb3, 0x10, 0xa7, - 0x7b, 0x2b, 0xf1, 0x28, 0xaa, 0x1d, 0xeb, 0x08, 0x19, 0x70, 0x98, 0x36, - 0xe8, 0x02, 0x22, 0xec, 0x28, 0x36, 0x4a, 0x8d, 0x8a, 0x0a, 0x29, 0x30, - 0x11, 0xbd, 0x9b, 0x87, 0x2b, 0x03, 0xe1, 0x34, 0x9b, 0x1f, 0xda, 0x48, - 0x5c, 0x06, 0x88, 0xa4, 0xa3, 0x10, 0x47, 0x9f, 0xd8, 0xcc, 0x01, 0x50, - 0x5a, 0x9c, 0x2a, 0xb7, 0x7d, 0xff, 0xd4, 0x66, 0x65, 0x5a, 0xce, 0xf0, - 0x83, 0xfe, 0x98, 0x94, 0xdd, 0x9b, 0xe0, 0xcd, 0xd3, 0x83, 0x62, 0x6d, - 0x49, 0xd4, 0x9a, 0xec, 0x69, 0xed, 0x42, 0x85, 0x6d, 0x90, 0x07, 0xc9, - 0x0b, 0x2e, 0x14, 0x59, 0x76, 0x62, 0x69, 0xa1, 0x0f, 0x8f, 0xf3, 0xd1, - 0x99, 0x59, 0x0e, 0xfa, 0xca, 0x76, 0xf9, 0x53, 0xbd, 0x89, 0xf3, 0xf5, - 0xf0, 0xda, 0xcd, 0x7b, 0x49, 0xb1, 0xf0, 0xf3, 0x6e, 0x1e, 0x8d, 0xe1, - 0xaf, 0xd6, 0xc7, 0x6f, 0x3b, 0x43, 0x60, 0x66, 0x30, 0x7d, 0x7d, 0x7f, - 0x48, 0x94, 0x0a, 0x0e, 0xcb, 0x2d, 0xbe, 0xd6, 0x8d, 0xbc, 0xd2, 0x83, - 0x18, 0x2f, 0x0f, 0x56, 0x39, 0x85, 0xf0, 0x24, 0xd3, 0x62, 0xfb, 0x0c, - 0xd8, 0x1d, 0xe7, 0x42, 0x3c, 0x7e, 0xc2, 0x3c, 0xec, 0x10, 0x1f, 0x4e, - 0x7b, 0xe4, 0xbc, 0x10, 0xb7, 0xc6, 0x2d, 0x15, 0x7e, 0x2f, 0x73, 0xfd, - 0xe5, 0xa0, 0xa6, 0xbb, 0x64, 0xd8, 0xd0, 0x7c, 0x86, 0x4a, 0x09, 0xd1, - 0xd6, 0xa0, 0x05, 0x94, 0xa6, 0x81, 0xd5, 0x06, 0x3d, 0x58, 0xcb, 0x97, - 0x18, 0x6d, 0x40, 0xb5, 0x88, 0x1c, 0x5f, 0x09, 0x15, 0xbf, 0xaf, 0x8a, - 0xf6, 0xbd, 0x81, 0xda, 0x10, 0x6a, 0x59, 0xd7, 0x48, 0xc4, 0xa5, 0x6e, - 0x80, 0x91, 0x6e, 0xd9, 0xe5, 0x90, 0x4c, 0xf7, 0x15, 0x38, 0x2d, 0x56, - 0x22, 0x7c, 0x7d, 0xd0, 0xed, 0x58, 0x57, 0xb3, 0x97, 0x0e, 0x4f, 0xfe, - 0x8b, 0x22, 0xed, 0x68, 0x6b, 0x1e, 0x8b, 0x5d, 0x19, 0x1f, 0xa4, 0x51, - 0x2d, 0x3d, 0xa9, 0x7d, 0x38, 0x49, 0xcf, 0x57, 0x53, 0xd6, 0xfc, 0x8c, - 0x1e, 0x23, 0x4d, 0x92, 0xf8, 0xf9, 0xeb, 0x88, 0xd4, 0x5d, 0x0b, 0xdb, - 0x22, 0x52, 0x56, 0x52, 0x51, 0x78, 0x57, 0xfe, 0x9d, 0x20, 0xbc, 0x77, - 0x4f, 0x8f, 0xcc, 0x9d, 0x2f, 0x11, 0x6e, 0xdc, 0x22, 0x0d, 0x2f, 0x22, - 0x48, 0x1c, 0x45, 0x6e, 0xcf, 0xef, 0x55, 0x36, 0x60, 0x00, 0x3c, 0xfd, - 0xd2, 0xc3, 0xc1, 0x0e, 0x29, 0xcb, 0x9d, 0xa5, 0x1a, 0x0f, 0x8b, 0x8a, - 0x95, 0x8e, 0x3d, 0x9e, 0x47, 0x53, 0x90, 0xc4, 0x25, 0x88, 0x5b, 0xdd, - 0x26, 0xf4, 0x23, 0xb3, 0x86, 0xb9, 0xac, 0x74, 0xd4, 0x7e, 0x58, 0x1a, - 0xec, 0xad, 0x75, 0x8d, 0x86, 0x8d, 0x83, 0x4c, 0x71, 0xf3, 0xf4, 0x6b, - 0x18, 0x59, 0x0a, 0x76, 0xef, 0xe7, 0xe3, 0x7c, 0x06, 0x18, 0x5a, 0xb5, - 0x2e, 0xe5, 0xe6, 0x9a, 0x8c, 0x97, 0xa6, 0x8a, 0xeb, 0x39, 0x46, 0xad, - 0x2a, 0xb0, 0xe9, 0x52, 0x60, 0x0c, 0xac, 0xda, 0x07, 0xd8, 0xab, 0x84, - 0xfc, 0x04, 0x11, 0xa3, 0x2c, 0x00, 0xf0, 0x63, 0xb5, 0xee, 0x7f, 0x17, - 0xdd, 0xe2, 0xec, 0xde, 0x98, 0x23, 0xf4, 0x21, 0xd2, 0xdb, 0xe3, 0x41, - 0x4e, 0x88, 0xc2, 0x2a, 0xce, 0xa1, 0x55, 0xbf, 0x7d, 0xcf, 0x86, 0xa3, - 0xb9, 0x77, 0x4b, 0xe9, 0x9c, 0x8d, 0x7b, 0x0c, 0xef, 0x7e, 0xa9, 0x21, - 0xc3, 0xdb, 0xec, 0xc8, 0x83, 0x4d, 0xb1, 0x7c, 0xac, 0xd7, 0xba, 0xe0, - 0xd0, 0x87, 0xc8, 0x29, 0xc2, 0x53, 0x0e, 0x9c, 0x4d, 0x7c, 0x4a, 0x6a, - 0x5c, 0xf8, 0xea, 0xfb, 0xf6, 0x1e, 0x7b, 0x2e, 0xbb, 0x61, 0xfe, 0x5c, - 0xc8, 0x20, 0x51, 0x6e, 0x24, 0x1b, 0xc3, 0x36, 0xf5, 0x8c, 0x2e, 0x7d, - 0x99, 0x0b, 0xa2, 0x1c, 0xbb, 0x26, 0xce, 0x57, 0x0b, 0xc0, 0x07, 0x72, - 0x62, 0x8a, 0x48, 0x8f, 0x6c, 0xba, 0xf5, 0x15, 0x8c, 0x38, 0xf3, 0xfc, - 0xb6, 0x6b, 0x9c, 0xc5, 0x56, 0x6d, 0xaa, 0xb3, 0xad, 0x99, 0x8b, 0xc6, - 0x3d, 0x39, 0x67, 0x1d, 0x70, 0xe4, 0x16, 0x97, 0xeb, 0xc8, 0xce, 0xd0, - 0xf2, 0x3a, 0xd4, 0x70, 0x72, 0xaf, 0xf4, 0x3a, 0x79, 0x6f, 0x8c, 0x1e, - 0x1c, 0x43, 0xdf, 0x4d, 0x31, 0x75, 0xb4, 0xef, 0x46, 0x0b, 0x4e, 0xd2, - 0x0d, 0xf6, 0x1d, 0x22, 0xdb, 0x40, 0x49, 0xab, 0x68, 0x57, 0x52, 0xdc, - 0x24, 0x88, 0xe1, 0xf0, 0xbc, 0xb9, 0xe2, 0x9a, 0xed, 0xae, 0xf7, 0xc8, - 0x2c, 0xa0, 0x11, 0xcd, 0xc2, 0x56, 0xaa, 0xf0, 0xc4, 0x27, 0xc1, 0x58, - 0x06, 0x18, 0xb4, 0x4f, 0xa7, 0x61, 0x13, 0xd5, 0xaa, 0x4b, 0x19, 0xe5, - 0x7f, 0x14, 0x88, 0xaf, 0x67, 0x18, 0x26, 0xab, 0x49, 0xeb, 0xf8, 0x92, - 0x9f, 0x57, 0xce, 0x4f, 0x67, 0x3f, 0xd9, 0xa7, 0x78, 0x04, 0x04, 0x2d, - 0x45, 0x9b, 0xfe, 0xb3, 0x98, 0xcd, 0xbf, 0x5f, 0x45, 0xea, 0xb1, 0x98, - 0x11, 0x73, 0x13, 0x95, 0x26, 0x7b, 0x1f, 0x79, 0xcd, 0x1c, 0x96, 0x4c, - 0xdd, 0x06, 0x0f, 0x79, 0xf3, 0xfb, 0xb7, 0xce, 0xce, 0xf2, 0xa3, 0x91, - 0x83, 0xd7, 0x81, 0x86, 0xb2, 0xe9, 0x17, 0x49, 0x65, 0xef, 0x0d, 0xa6, - 0x3d, 0xe8, 0x63, 0xd9, 0x73, 0x9f, 0xfe, 0x44, 0x22, 0xa9, 0x5e, 0xa8, - 0x10, 0xf1, 0x3a, 0x48, 0x6c, 0x05, 0x6a, 0x87, 0x03, 0x8b, 0x9b, 0xf5, - 0xd7, 0x52, 0x09, 0x94, 0x4b, 0x44, 0xbe, 0xf4, 0x05, 0x54, 0x61, 0xf1, - 0xd2, 0x1a, 0x80, 0x5a, 0xe6, 0xf1, 0xc7, 0x70, 0x08, 0xba, 0x63, 0xca, - 0xf8, 0x25, 0x82, 0xf7, 0x0b, 0x84, 0x2c, 0x68, 0x85, 0x74, 0xd9, 0x2d, - 0x07, 0x54, 0xde, 0x25, 0xc6, 0xbc, 0x30, 0x72, 0x8d, 0x93, 0xa3, 0xd5, - 0x78, 0x37, 0x55, 0x3d, 0x50, 0x4e, 0x9f, 0x4a, 0x21, 0x27, 0x44, 0xa3, - 0x54, 0x7a, 0xdb, 0xa6, 0x63, 0xed, 0x07, 0x38, 0xfb, 0xbe, 0xae, 0xba, - 0x8c, 0x23, 0x2f, 0x2c, 0xff, 0xaa, 0xee, 0xcc, 0x5f, 0x20, 0x4b, 0x11, - 0x7c, 0xc0, 0x70, 0x86, 0xdd, 0xfe, 0x1f, 0x18, 0x4d, 0xfd, 0xe6, 0xdf, - 0x9b, 0x55, 0x73, 0x34, 0x58, 0xf7, 0xe4, 0x83, 0xd1, 0x8f, 0xa0, 0x50, - 0x4f, 0xc5, 0xdf, 0x50, 0x98, 0xa9, 0x6c, 0x6f, 0xd4, 0x18, 0x09, 0xd6, - 0xbd, 0x3f, 0x72, 0x81, 0x3a, 0x13, 0xb9, 0x7b, 0x7a, 0x62, 0x6d, 0xd4, - 0x04, 0x29, 0xfa, 0xbb, 0x59, 0xc2, 0x90, 0x43, 0xa1, 0x23, 0xb9, 0x56, - 0xe8, 0x27, 0xef, 0xcb, 0xb0, 0x7a, 0x09, 0xb4, 0x8c, 0x62, 0x12, 0x5c, - 0x20, 0xb7, 0x6b, 0xb5, 0x67, 0xb4, 0x21, 0xf3, 0x2e, 0x92, 0xa7, 0x7e, - 0x57, 0x50, 0x95, 0xa9, 0x9e, 0x7d, 0xf8, 0xff, 0x99, 0x4b, 0xdf, 0xc8, - 0xf6, 0x70, 0x70, 0xe4, 0xa9, 0xb1, 0x4f, 0x1e, 0x93, 0xc8, 0xe6, 0xc3, - 0x97, 0xff, 0x64, 0x19, 0x33, 0x82, 0x89, 0x3c, 0x21, 0xfc, 0xa4, 0x8a, - 0x8b, 0x62, 0x5c, 0x82, 0x9e, 0xc8, 0xba, 0x11, 0x6f, 0x0e, 0x6e, 0xc3, - 0x9b, 0x41, 0x1f, 0xa0, 0xbb, 0xc2, 0x6f, 0x3a, 0x56, 0x44, 0xf2, 0xc3, - 0xcd, 0x05, 0x33, 0x63, 0x7f, 0x6f, 0x51, 0x4a, 0x85, 0xad, 0xb3, 0xdf, - 0x19, 0x8c, 0x39, 0x00, 0x1b, 0xa0, 0x05, 0x18, 0x4d, 0x5b, 0x5b, 0x57, - 0x8c, 0x1f, 0x85, 0x39, 0xd8, 0x08, 0xc4, 0xc1, 0x51, 0xa4, 0x34, 0xdf, - 0xa0, 0x2e, 0x96, 0xb8, 0x6f, 0x51, 0x5c, 0x7e, 0x04, 0x81, 0x91, 0x6c, - 0x2c, 0xf9, 0x4a, 0x30, 0x30, 0x1a, 0xc1, 0x33, 0xfc, 0x13, 0x07, 0xc0, - 0xb4, 0x7c, 0xf1, 0x7f, 0xe9, 0x52, 0xa9, 0xb1, 0xbe, 0xae, 0x75, 0x18, - 0xa1, 0x9c, 0xa6, 0xe8, 0x3f, 0x77, 0x0a, 0x48, 0xe8, 0x8a, 0x15, 0xab, - 0xf6, 0xfa, 0x44, 0xb7, 0xb8, 0x49, 0xdd, 0x72, 0xa8, 0x85, 0x5c, 0x36, - 0x60, 0x43, 0x1b, 0xbe, 0xc5, 0x51, 0xb9, 0xc9, 0x07, 0xf0, 0x8c, 0x6a, - 0xa1, 0xac, 0x76, 0x0b, 0xb7, 0xfa, 0xf7, 0x54, 0xa4, 0x16, 0xc0, 0xa3, - 0x2f, 0xb3, 0x74, 0xd8, 0x06, 0x85, 0x33, 0x9f, 0xe2, 0x1a, 0x9f, 0xcd, - 0x7d, 0xef, 0x9e, 0xe4, 0x1e, 0x07, 0x49, 0xb7, 0xf3, 0xcc, 0xf1, 0x79, - 0x9a, 0xf3, 0x9d, 0xb0, 0x92, 0x47, 0x41, 0x1d, 0x6a, 0xf1, 0xf4, 0x04, - 0x0f, 0xc4, 0x87, 0xb2, 0xf5, 0x89, 0xce, 0xf6, 0x72, 0x3f, 0x69, 0x1a, - 0x83, 0x80, 0xd9, 0x39, 0x3a, 0xdd, 0xe9, 0x0d, 0x4d, 0x02, 0x65, 0x88, - 0x8b, 0x02, 0x8d, 0x58, 0x1e, 0x3a, 0x17, 0x8a, 0xc3, 0xc0, 0xec, 0xb6, - 0x5e, 0xda, 0x73, 0x6f, 0x2f, 0x26, 0x91, 0x78, 0x98, 0x4a, 0x68, 0x81, - 0xe7, 0x04, 0x1c, 0x06, 0x93, 0x06, 0x20, 0x04, 0xbc, 0x49, 0x96, 0x40, - 0x6b, 0x98, 0x59, 0x43, 0x47, 0x16, 0x1a, 0x9b, 0x87, 0x17, 0xa8, 0x17, - 0xe0, 0x61, 0x40, 0x07, 0xae, 0xb5, 0xd0, 0x88, 0x73, 0x91, 0xd4, 0xf5, - 0x6d, 0xa7, 0x38, 0x5b, 0x58, 0x31, 0xf3, 0x94, 0xdb, 0x12, 0x69, 0xf4, - 0x15, 0xbf, 0xa5, 0x73, 0x83, 0xc4, 0x9b, 0x23, 0xe9, 0x0a, 0x6c, 0xbe, - 0x19, 0x0f, 0xaf, 0xbf, 0x1c, 0x3c, 0x3a, 0x8a, 0xf2, 0x7b, 0x30, 0xbe, - 0x10, 0x2d, 0x36, 0x2f, 0xc6, 0xf8, 0xff, 0xb8, 0x18, 0xc0, 0xa0, 0xce, - 0xd1, 0xbc, 0x5a, 0xcb, 0xa1, 0xab, 0xf8, 0xd0, 0x6c, 0x9b, 0x5d, 0xb5, - 0xe1, 0xbc, 0x3d, 0x42, 0x33, 0xf0, 0x7c, 0xce, 0xfc, 0xef, 0x55, 0x90, - 0x87, 0x18, 0x39, 0x99, 0x64, 0x02, 0xda, 0x8f, 0x09, 0xb1, 0x93, 0xf6, - 0xc2, 0xa4, 0x59, 0x9a, 0xb8, 0x26, 0x56, 0x47, 0x8e, 0x41, 0x30, 0x7f, - 0xfd, 0xa8, 0x36, 0x7d, 0x17, 0x26, 0x6c, 0x24, 0x9b, 0x30, 0x34, 0xb5, - 0xdf, 0x0d, 0xb5, 0x9d, 0x21, 0x42, 0x43, 0xf2, 0xdc, 0xb0, 0x52, 0x21, - 0x1d, 0xc8, 0xb0, 0xc8, 0x42, 0xad, 0x44, 0x42, 0xfa, 0xaa, 0x36, 0xa3, - 0x34, 0x6a, 0xe7, 0x85, 0x54, 0x0d, 0x6b, 0x82, 0xaa, 0xde, 0x17, 0x19, - 0x81, 0x2d, 0xae, 0x90, 0x97, 0xe9, 0x93, 0x1f, 0xee, 0xf6, 0x39, 0x29, - 0xc8, 0x45, 0xba, 0x43, 0x2d, 0xa7, 0xf2, 0xcd, 0x34, 0xd4, 0x13, 0x99, - 0x70, 0x90, 0x01, 0xa7, 0x51, 0xa7, 0x35, 0xc7, 0xdc, 0xe7, 0x70, 0x58, - 0x79, 0x57, 0xde, 0x26, 0xda, 0xd9, 0x89, 0x14, 0xc7, 0x61, 0xd7, 0x97, - 0x8d, 0x55, 0xaa, 0xde, 0x0c, 0x17, 0x4c, 0x66, 0x08, 0x69, 0x2e, 0x0d, - 0xe6, 0x32, 0x89, 0x75, 0x38, 0x9d, 0xa0, 0x3c, 0x75, 0x57, 0xd9, 0xba, - 0xec, 0x32, 0x62, 0x96, 0x98, 0x81, 0xf1, 0x5c, 0x8a, 0xf9, 0xd5, 0x5c, - 0x9d, 0xa2, 0x0e, 0x12, 0x54, 0xd8, 0x24, 0xe0, 0x2e, 0xcc, 0x4f, 0x03, - 0x6e, 0x80, 0xf0, 0x5c, 0x98, 0x32, 0x95, 0xb8, 0x1b, 0xc4, 0x41, 0x3c, - 0x88, 0xe7, 0xe9, 0xaa, 0x63, 0xbd, 0xf7, 0x81, 0xc6, 0xb0, 0x7b, 0x84, - 0x8a, 0x0e, 0xfc, 0x0a, 0x49, 0xdc, 0x9c, 0x8a, 0x85, 0x1f, 0x57, 0x74, - 0xee, 0x41, 0xeb, 0x52, 0xd4, 0x9a, 0x3f, 0x79, 0x19, 0xce, 0xc0, 0x45, - 0xc9, 0xc4, 0x0e, 0x7d, 0x7e, 0x70, 0xad, 0xe6, 0x56, 0x43, 0x03, 0xfa, - 0x79, 0xdd, 0x63, 0xed, 0x59, 0x86, 0xa7, 0xb3, 0x79, 0xfb, 0xaf, 0xbb, - 0x87, 0x15, 0x1e, 0x37, 0xb3, 0x30, 0x37, 0xc7, 0x19, 0x4b, 0x7b, 0x82, - 0x04, 0x94, 0xc2, 0xa5, 0xbf, 0x33, 0xca, 0x27, 0x8b, 0x63, 0x8d, 0x21, - 0x74, 0xf0, 0xbc, 0x02, 0x2e, 0xbf, 0x17, 0x26, 0xdb, 0xf8, 0x4f, 0x63, - 0xa2, 0x15, 0xaa, 0x62, 0xaf, 0x5a, 0x52, 0x68, 0x4c, 0x1a, 0xf3, 0x42, - 0x95, 0x68, 0xa7, 0xa6, 0xad, 0xe0, 0x05, 0x94, 0x8e, 0x83, 0x78, 0x61, - 0x8e, 0x8e, 0x51, 0xff, 0x07, 0xb0, 0x76, 0xa4, 0xe2, 0x27, 0xe7, 0x81, - 0x09, 0x66, 0x5b, 0x0a, 0x8d, 0xd0, 0x87, 0x07, 0x75, 0xf1, 0xcf, 0xb0, - 0x62, 0x19, 0xe1, 0x75, 0x9b, 0x9e, 0xc3, 0x40, 0x70, 0xf6, 0x79, 0x5f, - 0x9c, 0x35, 0xa5, 0x28, 0x92, 0xd3, 0x2b, 0x59, 0x6d, 0x1b, 0xfd, 0xdb, - 0x2e, 0x34, 0xfc, 0x79, 0x8f, 0xc0, 0xd1, 0x4c, 0x8a, 0x9d, 0x65, 0xed, - 0x7f, 0xf0, 0x5f, 0x1a, 0x6c, 0xfa, 0xd5, 0x11, 0x1f, 0xeb, 0x69, 0x48, - 0x05, 0x5b, 0x10, 0x78, 0x2e, 0xed, 0x9d, 0xa6, 0x52, 0xcb, 0xde, 0xb0, - 0x04, 0xa9, 0x00, 0x2e, 0x65, 0x57, 0x48, 0x70, 0xb7, 0x6e, 0xca, 0x2c, - 0xa4, 0x2a, 0x21, 0x14, 0xb0, 0xee, 0x74, 0x39, 0xe4, 0x31, 0x47, 0x72, - 0x1d, 0x87, 0x65, 0x89, 0x79, 0xf8, 0x8c, 0xa2, 0xa7, 0x8b, 0x20, 0xd5, - 0x4e, 0x28, 0x3d, 0x35, 0x41, 0x43, 0xaa, 0x10, 0xaa, 0xf1, 0x2b, 0x83, - 0xba, 0x22, 0x73, 0x96, 0x37, 0x52, 0xb4, 0x99, 0x89, 0xdd, 0x79, 0xb4, - 0x76, 0x2d, 0xf8, 0x26, 0xce, 0xf7, 0x8a, 0x3d, 0x0e, 0x3b, 0x84, 0x05, - 0x1c, 0xe3, 0x95, 0x1a, 0xa9, 0x93, 0xa4, 0x5a, 0xeb, 0xea, 0x6c, 0x6c, - 0xc9, 0xaf, 0x31, 0x26, 0x5a, 0x03, 0x9f, 0x3f, 0x23, 0xa8, 0x1b, 0x0b, - 0x54, 0xe1, 0x17, 0x5e, 0xd8, 0xac, 0x6a, 0xc2, 0x51, 0xf4, 0xb6, 0x94, - 0xb8, 0xad, 0x06, 0xb6, 0x98, 0x1d, 0xee, 0x88, 0x1d, 0x01, 0xc1, 0xf8, - 0x5a, 0xe4, 0x68, 0xf2, 0xc9, 0x74, 0xad, 0xe6, 0xfb, 0xb7, 0xba, 0x7f, - 0x89, 0xed, 0xf1, 0x97, 0xeb, 0x02, 0x9c, 0x62, 0xc6, 0x78, 0x5f, 0xb8, - 0x6c, 0xd3, 0x43, 0xaa, 0x81, 0xfe, 0x40, 0xe5, 0xf5, 0xf3, 0x8f, 0x21, - 0x43, 0x94, 0xf3, 0x34, 0x78, 0xa3, 0xe4, 0x1e, 0x5b, 0x92, 0x0f, 0xda, - 0x94, 0x67, 0x2d, 0xe7, 0xfc, 0xf8, 0x40, 0x2b, 0x58, 0xf8, 0x59, 0xdf, - 0xdc, 0x10, 0xf3, 0x5e, 0x65, 0xd5, 0x08, 0x18, 0xe4, 0x6c, 0xf1, 0x72, - 0xe4, 0x32, 0x33, 0xd2, 0xe7, 0x2b, 0x9f, 0xfc, 0x74, 0x2f, 0x75, 0xe4, - 0x00, 0x56, 0xb0, 0x5b, 0xde, 0xda, 0xbe, 0x25, 0x63, 0xf1, 0x60, 0x93, - 0x26, 0x0b, 0x7a, 0xab, 0x08, 0x8c, 0xd7, 0xd6, 0x41, 0xac, 0x3b, 0xac, - 0x8d, 0x9d, 0xdf, 0x93, 0xba, 0x65, 0x4b, 0x03, 0xd4, 0xfe, 0xef, 0xcf, - 0x17, 0x3c, 0x12, 0x2a, 0xf4, 0xac, 0x02, 0xe0, 0x36, 0x94, 0x47, 0x6d, - 0x43, 0x0b, 0x92, 0xca, 0xf1, 0xb5, 0xe6, 0x11, 0x3b, 0x1a, 0x8d, 0x96, - 0x55, 0xc3, 0x9a, 0x5e, 0xe7, 0x02, 0x95, 0xa2, 0xf6, 0xb9, 0x1b, 0x02, - 0x80, 0x8e, 0xe1, 0xe8, 0xdf, 0x4e, 0xb5, 0xef, 0x7c, 0x79, 0x84, 0xee, - 0x76, 0x78, 0x97, 0x6b, 0x97, 0xf7, 0x86, 0xf3, 0xa6, 0xb8, 0x53, 0x5a, - 0x9f, 0xe6, 0xba, 0xca, 0xd8, 0xca, 0x67, 0xae, 0xa5, 0xdc, 0x43, 0x0b, - 0xb3, 0x67, 0x47, 0xcc, 0x12, 0x73, 0xd3, 0x3e, 0x22, 0x6a, 0x1a, 0xef, - 0x62, 0x63, 0x18, 0xce, 0xc3, 0x67, 0x56, 0x2a, 0x70, 0x50, 0xe0, 0x23, - 0xef, 0x07, 0xca, 0x24, 0xb1, 0xee, 0xe9, 0x64, 0x5a, 0xc9, 0xbf, 0x64, - 0x40, 0xe8, 0x90, 0xf4, 0x5a, 0x2d, 0x69, 0x4e, 0xc9, 0x1a, 0xdc, 0xf0, - 0xa9, 0xa3, 0xb2, 0x8e, 0x0b, 0xe2, 0x23, 0xd5, 0x92, 0x81, 0x86, 0x01, - 0x16, 0x5f, 0x8c, 0xf1, 0x96, 0x2e, 0xf0, 0x46, 0xda, 0xe8, 0x26, 0x90, - 0xe3, 0x75, 0x3a, 0x87, 0xc6, 0x11, 0x0a, 0x7d, 0xce, 0x67, 0xa9, 0xb7, - 0x2b, 0x89, 0x5a, 0xdb, 0xaa, 0x4a, 0x68, 0x6c, 0x29, 0xb5, 0x94, 0xdc, - 0x8d, 0x03, 0xe6, 0xbc, 0xe4, 0x52, 0xb2, 0x83, 0x1c, 0x0c, 0x5b, 0x9b, - 0xfb, 0xf4, 0x80, 0x2c, 0x45, 0xce, 0xf1, 0xb9, 0xa5, 0x00, 0x8f, 0xfd, - 0x8d, 0x88, 0x47, 0x75, 0x29, 0x8c, 0xc5, 0xe6, 0x01, 0x34, 0x10, 0xb0, - 0xaf, 0xaa, 0x81, 0xfa, 0x15, 0xb8, 0x4a, 0x04, 0x2e, 0xaf, 0xa9, 0x52, - 0x41, 0x50, 0x46, 0x99, 0x73, 0x31, 0x6d, 0x76, 0x9b, 0xfd, 0xea, 0xd5, - 0xa0, 0x2b, 0x63, 0x26, 0xea, 0x45, 0x2b, 0xaf, 0x75, 0xe3, 0x84, 0x53, - 0x73, 0xf4, 0x16, 0x33, 0x2f, 0x1c, 0x4f, 0xcb, 0x1f, 0xab, 0x43, 0x1b, - 0xe5, 0x81, 0x03, 0x67, 0xb3, 0x92, 0x75, 0xf3, 0x1d, 0x8d, 0x4d, 0x9e, - 0x12, 0xfe, 0x23, 0x72, 0xeb, 0xe3, 0xe6, 0x76, 0x26, 0x03, 0xdc, 0x51, - 0x98, 0xc5, 0x8e, 0xf6, 0xb2, 0x5c, 0x26, 0x4e, 0xd6, 0x90, 0xaf, 0x99, - 0x44, 0xc3, 0x06, 0x8c, 0x47, 0x20, 0x4e, 0xf2, 0x11, 0xa1, 0x60, 0x7e, - 0x5c, 0xa4, 0x0b, 0xee, 0xbf, 0xdc, 0x50, 0xa6, 0xfe, 0xd7, 0x1d, 0xa8, - 0x22, 0xc6, 0xcc, 0xf3, 0xf1, 0x04, 0x10, 0xc3, 0x09, 0x9b, 0xd6, 0x51, - 0xbc, 0x47, 0x48, 0xe7, 0xef, 0x53, 0xd3, 0xca, 0x58, 0x14, 0x74, 0xbb, - 0x56, 0xb4, 0x6c, 0x29, 0xe9, 0x17, 0xc8, 0x13, 0xa7, 0x57, 0xb1, 0x87, - 0x1c, 0xd6, 0x21, 0x58, 0xad, 0x76, 0x79, 0x25, 0xb3, 0x08, 0x33, 0x6e, - 0xec, 0x8f, 0x4b, 0xc4, 0x5e, 0x3f, 0x50, 0xcf, 0x60, 0x06, 0x81, 0x38, - 0x62, 0x6d, 0xe6, 0xff, 0x00, 0xcf, 0xcc, 0xed, 0x2f, 0x2f, 0x18, 0x4b, - 0x49, 0x6b, 0x65, 0x5d, 0x5d, 0x7d, 0x1d, 0x05, 0x55, 0x88, 0x7d, 0x0e, - 0x88, 0x7d, 0xa3, 0xc7, 0xb0, 0x5f, 0xcf, 0xff, 0x4f, 0x3a, 0x2e, 0x84, - 0x87, 0xc2, 0xa1, 0xa3, 0xc4, 0xf7, 0x4c, 0x20, 0x79, 0xe6, 0x23, 0x97, - 0x8c, 0xbd, 0xe1, 0xa7, 0x40, 0xb4, 0x01, 0x83, 0xe2, 0x82, 0x78, 0xe5, - 0x6a, 0xae, 0x71, 0xaf, 0xc4, 0x14, 0xe2, 0x16, 0x4a, 0xab, 0x43, 0x60, - 0xe2, 0x2f, 0xd3, 0x60, 0x53, 0x5d, 0x94, 0xb6, 0xae, 0xe6, 0xac, 0x5a, - 0x93, 0xa3, 0x3d, 0x33, 0x76, 0x6d, 0x9b, 0xdc, 0x76, 0xeb, 0xb9, 0xfd, - 0x10, 0xca, 0x1b, 0x35, 0xa2, 0xb1, 0x97, 0xd0, 0x0e, 0x9e, 0x8b, 0xb8, - 0x46, 0x86, 0x57, 0xb8, 0x00, 0x05, 0x6c, 0xcd, 0x63, 0x30, 0x51, 0x45, - 0xf6, 0x6c, 0xe2, 0x2f, 0x61, 0x96, 0xb4, 0xf1, 0xb5, 0x9a, 0x8f, 0x62, - 0x38, 0x58, 0xa3, 0x37, 0xa8, 0x6a, 0x69, 0x99, 0xe6, 0x84, 0xdf, 0x92, - 0xb4, 0xce, 0xe4, 0x64, 0x54, 0x5c, 0x30, 0x18, 0x4c, 0x1b, 0x1c, 0xf8, - 0x90, 0xbe, 0xe6, 0x42, 0xad, 0x24, 0x9d, 0xa2, 0x42, 0x3b, 0xda, 0x61, - 0x41, 0xe3, 0x06, 0x8f, 0x00, 0x27, 0x87, 0xd3, 0xf8, 0xe9, 0xd9, 0x9d, - 0xc7, 0x28, 0x6f, 0xe2, 0x36, 0xd4, 0x6f, 0x1c, 0xd7, 0x9b, 0x01, 0x79, - 0xa0, 0xd9, 0xe5, 0x87, 0x1d, 0x70, 0xb8, 0x4f, 0x3d, 0xb3, 0xdb, 0x0f, - 0x25, 0x60, 0x4b, 0xc1, 0xf1, 0x4b, 0x36, 0x81, 0x07, 0x7f, 0x46, 0x04, - 0x38, 0x62, 0x98, 0xd6, 0x7a, 0x82, 0xe3, 0x06, 0xd6, 0x8f, 0x0d, 0xa1, - 0xd8, 0x47, 0x1d, 0x9f, 0xa5, 0x09, 0xa1, 0x93, 0x58, 0x96, 0xd4, 0x8c, - 0xbe, 0x70, 0x1e, 0xa4, 0x3b, 0xa7, 0x84, 0x30, 0xed, 0xff, 0x59, 0xa2, - 0x77, 0x45, 0x8b, 0x20, 0xab, 0x69, 0x59, 0x42, 0x67, 0xed, 0x30, 0x92, - 0xd4, 0x00, 0xdb, 0x5f, 0xa3, 0x07, 0x11, 0x0c, 0x36, 0x55, 0x44, 0x0d, - 0x62, 0x9c, 0xdf, 0x41, 0x78, 0x25, 0xcd, 0x32, 0xe0, 0x64, 0x40, 0xd8, - 0x54, 0x74, 0xf1, 0xcf, 0xb3, 0x92, 0xa1, 0x02, 0x4c, 0x5b, 0xad, 0xe2, - 0xc4, 0x32, 0x0a, 0x08, 0x1d, 0x01, 0x1c, 0xe7, 0xe8, 0x4b, 0xc9, 0x5f, - 0xa0, 0x51, 0x3d, 0x14, 0x71, 0x47, 0x8b, 0x6c, 0xab, 0x69, 0x59, 0x42, - 0x67, 0xed, 0x30, 0x92, 0x63, 0x02, 0x3b, 0x1c, 0xa0, 0xd2, 0x95, 0x6e, - 0x9c, 0x74, 0x79, 0x61, 0x52, 0x37, 0xb4, 0xaa, 0x5d, 0xd5, 0x06, 0xf3, - 0x8e, 0x13, 0xb8, 0xae, 0x0a, 0x6d, 0xe2, 0xb5, 0x23, 0x34, 0xa0, 0xa7, - 0x0a, 0x56, 0x27, 0x61, 0xcd, 0x2d, 0x3d, 0x1c, 0x43, 0xeb, 0xc4, 0xaa, - 0xc0, 0xdb, 0x3c, 0xeb, 0x06, 0x93, 0x85, 0x58, 0xba, 0xf1, 0x69, 0x04, - 0xce, 0xaa, 0xd9, 0x3f, 0x15, 0xe0, 0xdc, 0xc2, 0x46, 0x0c, 0xda, 0xf2, - 0x9f, 0x90, 0xbe, 0x70, 0xe5, 0x4c, 0x41, 0x49, 0x4e, 0x6c, 0xed, 0x92, - 0x22, 0x78, 0x3f, 0x12, 0xb5, 0xc6, 0x9a, 0xe9, 0x10, 0x0a, 0xf1, 0xf7, - 0xda, 0x46, 0x37, 0x9e, 0xad, 0x33, 0x3d, 0xd1, 0x3c, 0x48, 0xd7, 0x3e, - 0x4e, 0x07, 0x53, 0xb7, 0xe2, 0xa1, 0x07, 0xca, 0x67, 0x18, 0x34, 0x0d, - 0x73, 0xf4, 0xb5, 0x42, 0xf5, 0x2b, 0x25, 0x29, 0xc4, 0x34, 0x46, 0x91, - 0xb3, 0xb9, 0xd1, 0xa2, 0x68, 0x34, 0xe4, 0x64, 0x16, 0xe6, 0x45, 0x3d, - 0x96, 0x33, 0x2a, 0x0b, 0xef, 0xce, 0xa5, 0xa8, 0x0d, 0x20, 0x14, 0x1f, - 0x6f, 0x16, 0xb7, 0xda, 0x5b, 0xc0, 0x1a, 0x40, 0xcd, 0xe8, 0x81, 0x3f, - 0xd6, 0x87, 0x59, 0xf9, 0x2d, 0x14, 0x7b, 0x52, 0xc6, 0xfd, 0x3d, 0x90, - 0x2d, 0x99, 0xce, 0xf9, 0xe6, 0xda, 0xe3, 0x0d, 0x72, 0x01, 0x7a, 0xbb, - 0xb3, 0x18, 0x93, 0x4c, 0x28, 0x59, 0x2f, 0x5e, 0x04, 0x11, 0x88, 0x97, - 0x8f, 0xc2, 0xe6, 0x14, 0xe7, 0xdb, 0x78, 0x45, 0x92, 0xdb, 0xdf, 0xd9, - 0xb9, 0xbd, 0x73, 0x6e, 0xc5, 0xbf, 0x3d, 0xd1, 0x7d, 0x6c, 0x71, 0xc1, - 0xd6, 0x02, 0x63, 0x23, 0x8a, 0xc2, 0x31, 0xc2, 0x37, 0xcf, 0x28, 0x58, - 0x1a, 0xe4, 0x84, 0x85, 0xe5, 0x6f, 0x5a, 0x0d, 0x03, 0xea, 0x9e, 0xfb, - 0xcc, 0x63, 0x38, 0xe4, 0x53, 0x82, 0x6b, 0xee, 0xc3, 0x8b, 0xfd, 0x92, - 0xc7, 0x12, 0x18, 0xb8, 0x89, 0x22, 0x3c, 0xb0, 0x52, 0x7b, 0x1c, 0x5b, - 0xd4, 0xd5, 0x61, 0x07, 0x41, 0xb4, 0x56, 0x89, 0x01, 0xec, 0xdf, 0x8c, - 0x51, 0x7a, 0x81, 0xc5, 0x24, 0xc5, 0x9f, 0x50, 0x08, 0x5f, 0xe1, 0xcd, - 0x03, 0xed, 0x4d, 0xd1, 0xac, 0xbc, 0xc9, 0x5e, 0xd5, 0xaa, 0xc8, 0xf4, - 0x88, 0xf0, 0x69, 0xfd, 0x90, 0xf3, 0x5c, 0xad, 0x2b, 0x2b, 0x9f, 0xf9, - 0xa1, 0xf6, 0xc4, 0xde, 0x52, 0xe0, 0xeb, 0x25, 0x23, 0x54, 0x64, 0x54, - 0x4a, 0x9a, 0x8c, 0x1e, 0x9e, 0x38, 0x7d, 0xc4, 0xc9, 0x0c, 0x7e, 0x46, - 0x23, 0x5b, 0x52, 0x1a, 0xa0, 0x91, 0x67, 0x18, 0x91, 0xd6, 0x63, 0x70, - 0x03, 0x3e, 0x47, 0x59, 0x9e, 0xe4, 0x92, 0xf3, 0x6e, 0x48, 0xa1, 0x42, - 0xf2, 0x86, 0x2c, 0xf5, 0x8f, 0x8c, 0xcb, 0xe1, 0x11, 0x94, 0x58, 0x11, - 0x5a, 0x60, 0x8e, 0xdf, 0x02, 0xdb, 0x3c, 0x8d, 0x0e, 0xcd, 0x0d, 0x75, - 0x16, 0x9e, 0x36, 0x3f, 0xeb, 0x7f, 0xe8, 0x28, 0xa2, 0xe0, 0x34, 0xea, - 0x56, 0xba, 0xcb, 0xdd, 0x6c, 0xd1, 0x2d, 0x8b, 0x11, 0x5e, 0x4a, 0xf0, - 0xea, 0xb1, 0xf6, 0x30, 0x15, 0x3e, 0xcc, 0x67, 0xe3, 0x19, 0x2b, 0x9e, - 0x14, 0xfd, 0xc8, 0x49, 0x13, 0xf5, 0x09, 0xfd, 0x5d, 0xad, 0x34, 0x37, - 0x59, 0x9e, 0x4c, 0x4b, 0x1e, 0x29, 0x42, 0x5a, 0x1d, 0xb1, 0xee, 0xc4, - 0x4d, 0x6d, 0x5f, 0x22, 0xcb, 0xf6, 0x75, 0x10, 0x19, 0x30, 0x96, 0x30, - 0x9c, 0xc0, 0xd1, 0x99, 0x93, 0xdc, 0xca, 0x5f, 0x36, 0xee, 0x70, 0x17, - 0x37, 0xc4, 0x85, 0x40, 0x33, 0xd4, 0xdc, 0x61, 0xdc, 0x4a, 0x70, 0x72, - 0xfa, 0x93, 0x66, 0xd5, 0xd7, 0x73, 0x2e, 0x83, 0xd2, 0x92, 0xc9, 0x54, - 0x58, 0x69, 0x3c, 0x5c, 0xf7, 0x68, 0xec, 0xdc, 0xd9, 0xf3, 0x27, 0xed, - 0xe4, 0x07, 0xae, 0x88, 0xbd, 0xaa, 0xb5, 0xde, 0xad, 0x8b, 0x38, 0xdb, - 0x12, 0x77, 0x25, 0xad, 0x18, 0x89, 0x55, 0xce, 0x70, 0x1e, 0x6a, 0x66, - 0xf6, 0x0a, 0x37, 0x8f, 0x73, 0x3c, 0xce, 0x23, 0x7d, 0xf2, 0x5b, 0x10, - 0x5c, 0x49, 0x65, 0x8f, 0xc4, 0xce, 0x87, 0x2f, 0x00, 0xdf, 0xe3, 0x14, - 0x09, 0x4a, 0x8a, 0x80, 0x5a, 0xa5, 0x15, 0x94, 0x08, 0x99, 0xdc, 0x2a, - 0x63, 0xdc, 0xc0, 0x46, 0xbd, 0x9e, 0x3a, 0x0d, 0x8d, 0xb7, 0x6d, 0x3e, - 0x8e, 0x63, 0xed, 0xab, 0x22, 0x4f, 0x69, 0x9b, 0x30, 0xaa, 0x60, 0x25, - 0xed, 0x73, 0xb0, 0x64, 0x66, 0xf0, 0x01, 0x15, 0x53, 0xfc, 0x87, 0x9c, - 0x75, 0xcd, 0xb9, 0xea, 0xdc, 0x61, 0x35, 0x46, 0x54, 0xde, 0xce, 0xf5, - 0xd9, 0xfd, 0xd4, 0x53, 0x3e, 0xa7, 0xf9, 0xe5, 0xfc, 0xd4, 0xd8, 0x8d, - 0x82, 0x88, 0x6f, 0xeb, 0x6e, 0x07, 0x75, 0x9a, 0x02, 0xa7, 0xdf, 0xda, - 0xb0, 0x4e, 0xb0, 0x13, 0xb5, 0x86, 0x91, 0x60, 0xba, 0x64, 0xab, 0x91, - 0xdd, 0x47, 0x1b, 0x12, 0xcc, 0x1d, 0xed, 0xd7, 0xc5, 0x46, 0x93, 0x2b, - 0x90, 0x60, 0x9f, 0x0a, 0x64, 0x24, 0x41, 0x5d, 0x1f, 0x32, 0xb6, 0xc1, - 0x7d, 0x79, 0xde, 0xd3, 0xb5, 0xa8, 0x03, 0x3f, 0x29, 0x59, 0x75, 0x30, - 0xc2, 0xc4, 0xb9, 0xdb, 0x48, 0x38, 0x40, 0x6f, 0x34, 0x79, 0x61, 0xe9, - 0x95, 0xb0, 0x57, 0xf7, 0x94, 0x4d, 0x62, 0xd7, 0x5b, 0xa4, 0x42, 0xbf, - 0xe7, 0x15, 0x8b, 0x66, 0xcb, 0x21, 0xda, 0x85, 0xfd, 0xa4, 0x1e, 0x2b, - 0xd8, 0x21, 0xa6, 0xb6, 0xe1, 0x95, 0x17, 0x41, 0xd7, 0x81, 0x74, 0x17, - 0x97, 0xad, 0x91, 0xf4, 0x51, 0x73, 0x99, 0xd9, 0x35, 0x8f, 0xc0, 0x85, - 0x3a, 0x37, 0x0b, 0x4b, 0x8e, 0xe1, 0x70, 0x68, 0x81, 0xfc, 0x8f, 0x97, - 0x76, 0x9a, 0x6b, 0x00, 0x9a, 0x84, 0xb3, 0x1b, 0xbf, 0x94, 0x51, 0x39, - 0xfa, 0x1b, 0xdd, 0x32, 0xa9, 0xd7, 0xab, 0x76, 0x46, 0xfd, 0xea, 0xa8, - 0x98, 0x7c, 0x8f, 0xb1, 0x0d, 0x29, 0x2c, 0x40, 0x02, 0x7d, 0xf8, 0x10, - 0x24, 0x10, 0x0d, 0x5d, 0x79, 0xe0, 0x95, 0xc1, 0xba, 0xb7, 0xaf, 0x2c, - 0xbb, 0x74, 0x8d, 0xf1, 0xb7, 0xfd, 0xad, 0x31, 0x8a, 0x5a, 0xf8, 0xb4, - 0x46, 0x79, 0xd2, 0x4c, 0x8c, 0xcd, 0x05, 0xc2, 0x2e, 0x1f, 0x9f, 0x58, - 0x22, 0xf0, 0xd0, 0x76, 0x70, 0xb5, 0x47, 0x8f, 0x34, 0xb6, 0x73, 0x9d, - 0x00, 0x42, 0x86, 0x70, 0x60, 0xb2, 0x4a, 0xf5, 0x49, 0x64, 0x55, 0x25, - 0x39, 0xac, 0x19, 0x79, 0xd6, 0x65, 0x94, 0x9a, 0x19, 0x8c, 0xa2, 0xc8, - 0xe8, 0x7e, 0x36, 0x34, 0x12, 0x2d, 0xc0, 0xd3, 0x23, 0xd5, 0x04, 0x78, - 0xb0, 0x5b, 0x85, 0x6e, 0x3f, 0xd1, 0xf0, 0xcd, 0xe7, 0x3a, 0xf3, 0x44, - 0xb3, 0xb4, 0x78, 0x98, 0x36, 0xc5, 0x12, 0xde, 0xb2, 0x81, 0x44, 0x1b, - 0x29, 0x98, 0x27, 0x5e, 0xee, 0xc9, 0x60, 0xd3, 0x89, 0xba, 0x4a, 0x55, - 0x7e, 0xfa, 0x14, 0xca, 0x83, 0x34, 0x94, 0xae, 0x1a, 0x7f, 0x06, 0xb4, - 0xf1, 0x7b, 0x3e, 0xa4, 0x33, 0x08, 0x24, 0xc0, 0x7f, 0xb1, 0xc3, 0x11, - 0x7c, 0x63, 0xe2, 0x44, 0x1e, 0x35, 0x45, 0x5f, 0x70, 0x8c, 0x0c, 0x39, - 0xcd, 0x70, 0x8a, 0x26, 0x81, 0x2b, 0xe2, 0x2f, 0xb7, 0x15, 0x9e, 0x79, - 0x11, 0x56, 0x2b, 0xdf, 0x6c, 0x64, 0x12, 0x52, 0x08, 0xe9, 0xbf, 0xbf, - 0x00, 0xaf, 0x7f, 0xd9, 0x8d, 0xd9, 0xac, 0x1f, 0x1d, 0x83, 0x69, 0xb5, - 0x2f, 0x1d, 0xc7, 0x9d, 0x5a, 0x25, 0x10, 0x85, 0xac, 0x2e, 0x04, 0x0b, - 0xa1, 0x8a, 0x8b, 0x6e, 0x46, 0x55, 0xbf, 0x51, 0x9a, 0x8d, 0x70, 0xe1, - 0x6f, 0x85, 0x35, 0xab, 0xda, 0xf3, 0x24, 0xed, 0x97, 0x61, 0x21, 0x37, - 0x71, 0xdd, 0x12, 0x56, 0x55, 0xaa, 0xdb, 0xcf, 0x9b, 0xeb, 0xc5, 0xb4, - 0xc4, 0xb8, 0xe1, 0x8e, 0xbf, 0xf7, 0xb9, 0xd9, 0xc4, 0x1b, 0x80, 0x97, - 0x88, 0x17, 0x84, 0x71, 0x7d, 0xf2, 0x5b, 0x10, 0x5c, 0x49, 0x65, 0x8f, - 0xc4, 0xce, 0x95, 0x2f, 0x00, 0xdf, 0xe3, 0x14, 0x09, 0x4a, 0x8a, 0x80, - 0x5a, 0xa5, 0x15, 0x94, 0x08, 0x99, 0xdc, 0x2a, 0x63, 0xdc, 0xc0, 0x46, - 0xa9, 0x84, 0xdc, 0x50, 0xe7, 0x3f, 0xd5, 0xb1, 0xa0, 0xda, 0x4a, 0xa0, - 0xa7, 0x3c, 0x6b, 0x4f, 0x53, 0xb8, 0xbd, 0xc6, 0x2c, 0x68, 0xdd, 0x51, - 0xc0, 0xc3, 0xc6, 0xf9, 0x09, 0x4c, 0x63, 0xfc, 0x3d, 0x07, 0xa0, 0x20, - 0xb3, 0x15, 0x29, 0xc2, 0xc1, 0xfb, 0x0c, 0x07, 0x2b, 0x6a, 0x91, 0x11, - 0x3e, 0xa7, 0xf9, 0xe5, 0xfc, 0xd4, 0xd8, 0x8d, 0x82, 0x88, 0x6f, 0xeb, - 0x6e, 0x07, 0x67, 0x9a, 0x02, 0xa7, 0xdf, 0xda, 0xb0, 0x4e, 0xb0, 0x13, - 0xb5, 0x86, 0x91, 0x60, 0xba, 0x64, 0xab, 0x91, 0xe9, 0x96, 0xd4, 0x97, - 0x33, 0xf7, 0xd5, 0x2d, 0x69, 0x2e, 0x47, 0xfa, 0x2b, 0x5a, 0x49, 0x12, - 0x64, 0x24, 0x41, 0x5d, 0x1f, 0x32, 0xb6, 0xc1, 0x6b, 0x79, 0xde, 0xd3, - 0xb5, 0xa8, 0x03, 0x3f, 0xf5, 0x9a, 0x11, 0xc4, 0x2a, 0xb9, 0x0c, 0x99, - 0x12, 0x9a, 0x57, 0x67, 0xcf, 0xce, 0xef, 0x99, 0xdc, 0x91, 0xb7, 0x11, - 0xc6, 0xd7, 0xaa, 0x70, 0xb2, 0x26, 0xe8, 0x6f, 0xe7, 0x2a, 0x37, 0x81, - 0x4a, 0x4c, 0xc5, 0x08, 0xde, 0x61, 0x39, 0x80, 0xdd, 0xbc, 0x95, 0xf8, - 0x13, 0x15, 0x9d, 0x83, 0x91, 0x5f, 0x26, 0xc1, 0xcd, 0x31, 0x76, 0xb1, - 0x0b, 0xb0, 0xf4, 0x09, 0x8c, 0x81, 0x16, 0x45, 0x84, 0x80, 0x4b, 0x2a, - 0x3b, 0xfd, 0x4d, 0x79, 0x6d, 0x91, 0xbd, 0x05, 0x60, 0xd3, 0x5d, 0x3f, - 0x11, 0x05, 0x56, 0x7f, 0xa1, 0x5e, 0x13, 0xce, 0x5c, 0x9c, 0x37, 0x64, - 0x0b, 0x55, 0x3c, 0xfe, 0x1a, 0x44, 0xfb, 0x25, 0xab, 0x59, 0x22, 0x86, - 0x4b, 0x20, 0x18, 0xaa, 0x56, 0x14, 0xbc, 0x56, 0x23, 0xc6, 0x61, 0x7b, - 0x75, 0x35, 0x09, 0x40, 0xbc, 0x0b, 0xd8, 0x83, 0xd4, 0x86, 0x14, 0x18, - 0xa5, 0x00, 0xdd, 0x70, 0xd4, 0x3e, 0x5e, 0x4c, 0x42, 0x28, 0x66, 0x50, - 0xf1, 0x48, 0xad, 0x28, 0x50, 0x1f, 0x08, 0xd8, 0x39, 0x96, 0x8c, 0xad, - 0x7b, 0xad, 0xc9, 0x3a, 0xb8, 0x5d, 0x03, 0xfc, 0x2a, 0xa3, 0x99, 0x51, - 0x20, 0x11, 0xe2, 0x3c, 0xff, 0x4f, 0x92, 0x6f, 0xe9, 0x0d, 0xb1, 0x5b, - 0x9e, 0x9d, 0x48, 0x86, 0xa7, 0xb9, 0x09, 0x91, 0xc6, 0xdd, 0x7a, 0xf8, - 0x44, 0x6c, 0xcd, 0xdd, 0x5f, 0x44, 0xad, 0x34, 0x2b, 0x4c, 0xde, 0x97, - 0x07, 0xe8, 0x65, 0x99, 0x2a, 0xfc, 0xfa, 0x55, 0xd1, 0xc5, 0x2d, 0xfe, - 0x69, 0x89, 0x91, 0x24, 0xf0, 0x55, 0x2c, 0x65, 0x3f, 0xdc, 0x2b, 0x7e, - 0x57, 0xec, 0xfc, 0xe9, 0x51, 0x72, 0x42, 0x6b, 0x10, 0xa0, 0x46, 0x60, - 0x38, 0xc9, 0xe3, 0xfc, 0x61, 0x60, 0xd0, 0xad, 0x48, 0x3a, 0xec, 0xa6, - 0x71, 0xdf, 0x12, 0x8b, 0x8e, 0x71, 0x14, 0x61, 0x3d, 0x4a, 0x41, 0x05, - 0x80, 0xcc, 0xa7, 0x15, 0x2e, 0xdd, 0x65, 0x87, 0xb0, 0xc1, 0x5e, 0x57, - 0x0e, 0x8e, 0x6f, 0xd4, 0xbf, 0xd5, 0xc5, 0xe9, 0x5c, 0xec, 0xf0, 0x3f, - 0xcd, 0x7c, 0x50, 0xe6, 0xb3, 0xb1, 0xa3, 0x17, 0x47, 0xfc, 0xbb, 0x19, - 0x80, 0xae, 0xcb, 0xcc, 0xfe, 0xd8, 0xf1, 0x3f, 0x99, 0xd7, 0xa0, 0xfb, - 0xc0, 0x8f, 0x28, 0x61, 0xc1, 0xe1, 0xef, 0xce, 0xeb, 0x0f, 0xe4, 0xb0, - 0xa5, 0x41, 0x47, 0x08, 0xd8, 0x04, 0xdc, 0xb1, 0xcf, 0x0a, 0x61, 0x2a, - 0xe4, 0x62, 0xd3, 0xc5, 0x20, 0x13, 0x41, 0x75, 0x64, 0x1d, 0xf5, 0xc3, - 0x16, 0x49, 0x4c, 0xac, 0x40, 0x86, 0x18, 0xc1, 0x2f, 0xc3, 0x5d, 0xfe, - 0x36, 0x17, 0xa0, 0x55, 0xd9, 0x12, 0x55, 0x9c, 0x07, 0xc8, 0xf0, 0x26, - 0xd3, 0xab, 0xd7, 0x76, 0x16, 0x10, 0xac, 0x70, 0x68, 0x7b, 0xeb, 0xa2, - 0x3c, 0xf7, 0x2a, 0xee, 0xa3, 0x5a, 0x36, 0xe4, 0x1f, 0x52, 0x75, 0x92, - 0xc1, 0xec, 0xfc, 0xa7, 0x9a, 0xeb, 0xef, 0x6f, 0x80, 0x29, 0x69, 0xab, - 0x51, 0x73, 0x5e, 0xff, 0xd4, 0x5f, 0x8d, 0x58, 0xe4, 0x58, 0xe6, 0x04, - 0xa7, 0xbf, 0xc7, 0xaf, 0xdd, 0x5a, 0xb3, 0x06, 0xf3, 0x00, 0x73, 0x60, - 0xab, 0x51, 0x4b, 0x0c, 0x2e, 0x5a, 0x4d, 0x8b, 0xe7, 0x60, 0x51, 0xa5, - 0xcc, 0xd1, 0x6e, 0x80, 0xbb, 0x28, 0xf7, 0x0b, 0xc0, 0x47, 0x57, 0x61, - 0x4a, 0xbb, 0xfb, 0x4e, 0xc9, 0x6c, 0x3b, 0x16, 0x21, 0xa4, 0x7b, 0xbc, - 0x36, 0x38, 0x7e, 0x2c, 0x07, 0xad, 0xb7, 0x58, 0x2f, 0xd2, 0xaa, 0xc6, - 0x2e, 0x08, 0x62, 0x8b, 0x0e, 0x2c, 0xdc, 0xfb, 0x4d, 0x70, 0x3d, 0x0d, - 0x69, 0x59, 0xb0, 0x2a, 0xaa, 0xf8, 0x8d, 0x9b, 0x85, 0x7f, 0x89, 0xd8, - 0x6d, 0xfe, 0x05, 0xf4, 0xd2, 0x14, 0xfb, 0xf7, 0x41, 0xe5, 0x8f, 0x0e, - 0xa9, 0xec, 0x72, 0xc8, 0xec, 0x5f, 0xae, 0xaa, 0x44, 0xad, 0x08, 0x7d, - 0xcf, 0xde, 0x70, 0x90, 0xfe, 0x54, 0x02, 0x65, 0x73, 0x20, 0x1f, 0x5b, - 0x44, 0xce, 0xa1, 0x8c, 0x66, 0x14, 0xf0, 0x55, 0xd2, 0x62, 0x2d, 0x50, - 0xad, 0x03, 0xed, 0xdc, 0x86, 0x57, 0x62, 0x94, 0x3e, 0x03, 0x01, 0x37, - 0x77, 0x2c, 0xce, 0x65, 0xdc, 0x82, 0xbd, 0x2f, 0x9e, 0x1b, 0x21, 0x87, - 0xb7, 0x69, 0xf9, 0x6b, 0x35, 0x95, 0xbe, 0x9a, 0x96, 0x85, 0xda, 0x6e, - 0xd4, 0xfa, 0xa1, 0xee, 0xe9, 0x52, 0x6f, 0xc5, 0xd7, 0xc6, 0xfd, 0xc8, - 0xbd, 0x5a, 0x66, 0x18, 0x0b, 0x5e, 0xa5, 0xff, 0x6e, 0x34, 0xa5, 0xba, - 0xa5, 0x05, 0x46, 0x0f, 0xfb, 0x4c, 0x54, 0xbe, 0xee, 0x5f, 0x21, 0x2f, - 0xfb, 0x62, 0x17, 0x21, 0xdb, 0x20, 0x73, 0xd1, 0x6f, 0x14, 0x22, 0x39, - 0xce, 0xbd, 0xee, 0x2b, 0xf9, 0x71, 0x4d, 0xe4, 0xaa, 0x94, 0xda, 0x95, - 0xa5, 0x1d, 0x73, 0x9c, 0x46, 0x8a, 0x21, 0x48, 0x33, 0xdb, 0x57, 0x23, - 0xa2, 0x50, 0x33, 0x8b, 0x1b, 0x54, 0xe7, 0x60, 0x6f, 0x51, 0xe5, 0x51, - 0x11, 0xe4, 0x07, 0x53, 0xbd, 0x1a, 0xf9, 0x46, 0x53, 0xe2, 0xf5, 0x70, - 0x15, 0x58, 0xcd, 0xf6, 0xef, 0xdb, 0x8f, 0xd7, 0xd3, 0x14, 0x19, 0x35, - 0xa7, 0x5f, 0x67, 0x0f, 0x9f, 0xdc, 0xea, 0xf9, 0x5a, 0x5e, 0x32, 0x12, - 0x99, 0xfb, 0x60, 0x93, 0x2b, 0x57, 0x0c, 0x0b, 0xc1, 0x71, 0x6b, 0xde, - 0x2e, 0x8d, 0x85, 0x46, 0x07, 0xe0, 0xc4, 0xf2, 0xd3, 0xe2, 0xed, 0x06, - 0xd4, 0xd7, 0x22, 0x2b, 0x36, 0xd2, 0x1e, 0xd6, 0x59, 0x43, 0x83, 0x7a, - 0x65, 0xd8, 0x9e, 0xa1, 0xd2, 0x4c, 0xce, 0x25, 0x23, 0xbe, 0x11, 0xdf, - 0x8b, 0x50, 0xa3, 0xa7, 0x58, 0xee, 0x8c, 0x56, 0x12, 0xe9, 0x1d, 0x72, - 0x25, 0xe5, 0x8d, 0x8f, 0x08, 0x8a, 0x7f, 0x25, 0xa0, 0xb3, 0xbf, 0x14, - 0x3a, 0x13, 0x3e, 0xc2, 0x86, 0xc7, 0x8a, 0x95, 0x0e, 0x5b, 0xe5, 0x51, - 0xa2, 0x0b, 0x03, 0x04, 0x3b, 0xc2, 0x1c, 0xe5, 0x02, 0xb9, 0xbb, 0x87, - 0x83, 0xf5, 0x38, 0x10, 0x11, 0x46, 0x5b, 0x5e, 0x2a, 0xe2, 0xfe, 0xdb, - 0x01, 0x8f, 0xf7, 0x13, 0x3c, 0x0c, 0x24, 0xcb, 0x0a, 0x69, 0x81, 0x3c, - 0x47, 0x7d, 0xe8, 0x6a, 0x5d, 0x1f, 0xd5, 0x6b, 0xd7, 0xc8, 0x09, 0x31, - 0xc6, 0x2a, 0x53, 0xa4, 0x9b, 0x40, 0x8b, 0xba, 0xab, 0xbb, 0x6a, 0x92, - 0xa9, 0xc2, 0x17, 0x9c, 0x9b, 0x93, 0x7c, 0xf8, 0x79, 0x0d, 0x4f, 0x4b, - 0xf1, 0x63, 0x71, 0xe7, 0xc6, 0x67, 0x79, 0xcd, 0x8e, 0xe7, 0x2b, 0x1f, - 0xa7, 0xbd, 0x03, 0x20, 0x9f, 0xa9, 0xa4, 0xd2, 0xbb, 0x50, 0x97, 0xd8, - 0x36, 0x31, 0x23, 0x32, 0x34, 0x09, 0xef, 0x3f, 0x25, 0xbb, 0x3f, 0x72, - 0x6e, 0x39, 0x5e, 0xfc, 0x99, 0x35, 0x23, 0xa6, 0x32, 0xe9, 0x36, 0xc2, - 0xc4, 0x85, 0xef, 0xbd, 0x84, 0x5d, 0x2a, 0xaf, 0x82, 0x18, 0xda, 0x0a, - 0x14, 0x58, 0xe7, 0xa0, 0x0a, 0x1e, 0x49, 0x57, 0x7b, 0x98, 0xdf, 0xa5, - 0xe7, 0x6d, 0xa9, 0xb2, 0x74, 0xc2, 0x9b, 0x06, 0xfb, 0xd9, 0x88, 0xd8, - 0xd2, 0x87, 0xbd, 0xf7, 0xb5, 0xdd, 0x36, 0x59, 0x49, 0xe0, 0xe6, 0xf3, - 0x76, 0x78, 0xa3, 0x3a, 0xd0, 0x98, 0xda, 0x8e, 0x04, 0xc5, 0x93, 0x79, - 0x70, 0xe4, 0xf0, 0x50, 0x0f, 0x44, 0xc8, 0x4e, 0x8c, 0xe3, 0x34, 0x12, - 0xa5, 0xd9, 0x16, 0x0e, 0x3a, 0xb6, 0x5e, 0x00, 0x0b, 0xcd, 0xd0, 0x70, - 0xd0, 0xb2, 0x0b, 0xc8, 0xda, 0x20, 0x8c, 0x0b, 0x14, 0xd7, 0xd8, 0x6d, - 0xa9, 0xa5, 0x47, 0x82, 0x46, 0xfe, 0x93, 0xb3, 0x82, 0xe5, 0x2b, 0x1f, - 0xcb, 0x7e, 0xd3, 0xe2, 0xec, 0xde, 0xbe, 0xb0, 0xd3, 0xac, 0xd5, 0x76, - 0xd9, 0x3b, 0xd0, 0x99, 0x6a, 0xbb, 0xd7, 0xbb, 0x3c, 0xf7, 0x2a, 0xee, - 0xa3, 0x5a, 0x36, 0xe4, 0x1f, 0x52, 0x75, 0x92, 0xc1, 0xec, 0xfc, 0xa7, - 0x9a, 0xeb, 0xef, 0x6f, 0x80, 0x29, 0x69, 0xab, 0x51, 0x73, 0x5e, 0xff, - 0xd4, 0x5f, 0x8d, 0x58, 0xe4, 0x58, 0xe6, 0x04, 0xa7, 0xbf, 0xc7, 0xaf, - 0xdd, 0x5a, 0xb3, 0x06, 0xf3, 0x00, 0x73, 0x60, 0xab, 0x51, 0x4b, 0x0c, - 0x2e, 0x5a, 0x4d, 0x8b, 0xe7, 0x60, 0x51, 0xa5, 0xcc, 0xd1, 0x6e, 0x80, - 0xbb, 0x28, 0xf7, 0x0b, 0x42, 0x4b, 0xaa, 0x88, 0x62, 0xcf, 0x76, 0x5e, - 0x6a, 0x25, 0x0d, 0x9f, 0x87, 0x5c, 0x43, 0xeb, 0x7a, 0x75, 0xd9, 0xad, - 0x3d, 0x94, 0x18, 0x28, 0x83, 0x09, 0x42, 0xd8, 0xcc, 0x82, 0x23, 0xb4, - 0x5b, 0x8c, 0x7f, 0xd6, 0x9a, 0x7c, 0xe8, 0xc0, 0xad, 0xa3, 0x79, 0xa8, - 0x16, 0x62, 0x88, 0x02, 0xc3, 0xe3, 0xe4, 0x31, 0x3c, 0x2e, 0x81, 0x74, - 0xed, 0x5f, 0x2e, 0xef, 0x5d, 0x63, 0x40, 0x72, 0xf3, 0x94, 0x8d, 0x34, - 0x0d, 0x8e, 0x62, 0x12, 0xf2, 0x50, 0xd2, 0x43, 0xdf, 0xc7, 0xe7, 0xea, - 0x8d, 0xfa, 0x97, 0x6d, 0x78, 0xcd, 0xd8, 0xdc, 0x35, 0x1d, 0x3e, 0x62, - 0xe0, 0x08, 0x35, 0xef, 0x0b, 0x3e, 0x1c, 0xeb, 0xe0, 0xe6, 0xd5, 0x9c, - 0x9f, 0x78, 0xac, 0x86, 0x2e, 0x11, 0x34, 0x57, 0x4f, 0x58, 0x33, 0x8a, - 0x23, 0x7f, 0xbd, 0x4d, 0x5e, 0x4e, 0xcd, 0xd9, 0xe2, 0x9f, 0xbc, 0x6b, - 0xfc, 0xa7, 0xc1, 0x3f, 0x4c, 0x8f, 0xad, 0xdb, 0x53, 0x27, 0xa2, 0x03, - 0x12, 0x99, 0xfd, 0x90, 0x40, 0x96, 0x82, 0x08, 0x3b, 0x05, 0x97, 0x6b, - 0x1e, 0x8b, 0x91, 0x88, 0xaa, 0xcd, 0xcf, 0x98, 0x88, 0x53, 0xaf, 0xe1, - 0x94, 0x8a, 0xa9, 0xb6, 0x8c, 0x82, 0x1c, 0xe4, 0x69, 0xc4, 0xd8, 0x67, - 0x54, 0xd1, 0x1e, 0x98, 0x04, 0x9b, 0x79, 0xef, 0x14, 0xac, 0xcb, 0xc8, - 0x8f, 0xfc, 0x23, 0x0e, 0x2b, 0x6c, 0x39, 0xe2, 0xef, 0x6c, 0xc2, 0x11, - 0x4d, 0xaa, 0x44, 0xe4, 0xe9, 0x51, 0xdd, 0x8f, 0x46, 0x3b, 0x24, 0xb3, - 0x84, 0xd8, 0xbd, 0x7d, 0x55, 0x11, 0xac, 0xdb, 0x96, 0xcb, 0xca, 0x58, - 0xe9, 0x9f, 0x4a, 0xc9, 0x52, 0x68, 0x10, 0x69, 0x7d, 0x22, 0x13, 0x01, - 0xba, 0xe2, 0xb6, 0x06, 0x9d, 0xbb, 0x71, 0x60, 0xe5, 0x73, 0xb2, 0x20, - 0xe5, 0x83, 0xa5, 0x5f, 0xac, 0x8c, 0x5b, 0x03, 0xc7, 0x0c, 0xf0, 0xd3, - 0x31, 0x2f, 0xf4, 0x36, 0x53, 0xdd, 0xd8, 0x91, 0x1e, 0x23, 0x56, 0xd8, - 0xc9, 0xdc, 0x9c, 0x80, 0x8e, 0x7e, 0x6d, 0x90, 0xfa, 0x90, 0xf4, 0xbf, - 0x0c, 0x8a, 0xf4, 0x94, 0x1d, 0x2f, 0xc0, 0x5f, 0x8b, 0x77, 0x05, 0x90, - 0xe0, 0xe4, 0x9a, 0x26, 0xfc, 0xa7, 0xd6, 0x8f, 0xc0, 0x1d, 0x26, 0xba, - 0xf7, 0x28, 0x7e, 0x39, 0x3a, 0x4f, 0x37, 0x4b, 0xc3, 0x17, 0xc5, 0x84, - 0x8c, 0x50, 0x1e, 0x1c, 0x8b, 0x8e, 0xb5, 0x26, 0xee, 0xcc, 0xf2, 0x5e, - 0x6a, 0x4a, 0xe2, 0x7a, 0x84, 0x4a, 0x8a, 0xcd, 0x70, 0x65, 0x6b, 0x4a, - 0x80, 0x13, 0xea, 0x15, 0x47, 0x2d, 0x67, 0x34, 0x3a, 0x93, 0x6c, 0xae, - 0x1b, 0xa0, 0xeb, 0xd1, 0x43, 0xe2, 0xdd, 0xd8, 0xb9, 0xc0, 0x09, 0x00, - 0x9a, 0x3c, 0xf2, 0x48, 0x0a, 0x69, 0x81, 0x3c, 0x47, 0x7d, 0xe8, 0x6a, - 0x5d, 0x1f, 0xd5, 0x6b, 0xd7, 0xc8, 0x09, 0x31, 0xc6, 0x2a, 0x53, 0xa4, - 0x9b, 0x40, 0x8b, 0xba, 0xab, 0xbb, 0x6a, 0x92, 0xa9, 0xc2, 0x17, 0x9c, - 0x9b, 0x93, 0x7c, 0xf8, 0x79, 0x0d, 0x4f, 0x4b, 0xf1, 0x63, 0x71, 0xe7, - 0xc6, 0x67, 0x79, 0xcd, 0x8e, 0xe7, 0x2b, 0x1f, 0xa7, 0xbd, 0x03, 0x20, - 0x9f, 0xa9, 0xa4, 0xd2, 0xbb, 0x50, 0x97, 0xd8, 0x36, 0x31, 0x23, 0x32, - 0x34, 0x09, 0xef, 0x3f, 0x25, 0xbb, 0x3f, 0x72, 0xe1, 0xac, 0xa8, 0xf3, - 0x02, 0x9a, 0x80, 0x1d, 0xc6, 0xb5, 0xca, 0x4a, 0x60, 0x9a, 0xa7, 0xd9, - 0x83, 0x25, 0x2a, 0xaf, 0x82, 0x18, 0xda, 0x0a, 0x14, 0x58, 0xe7, 0xa0, - 0x0a, 0x1e, 0x49, 0x57, 0x7b, 0x98, 0xdf, 0xa5, 0xe7, 0x6d, 0xa9, 0xb2, - 0x74, 0xc2, 0x9b, 0x06, 0xfb, 0xd9, 0x88, 0xd8, 0xd2, 0x87, 0xbd, 0xf7, - 0xb5, 0xdd, 0x36, 0x59, 0x49, 0xe0, 0xe6, 0xf3, 0x76, 0x78, 0xa3, 0x3a, - 0xd0, 0x98, 0xda, 0x8e, 0x04, 0xc5, 0x93, 0x79, 0x70, 0xe4, 0xf0, 0x50, - 0x0f, 0x44, 0xc8, 0x4e, 0xbf, 0x8e, 0x79, 0xb8, 0xec, 0x7f, 0xe5, 0x4f, - 0xe1, 0x94, 0x07, 0x6b, 0x93, 0xa3, 0xc3, 0xce, 0xed, 0xc8, 0xc1, 0x3f, - 0xe3, 0xbd, 0x74, 0x5a, 0x70, 0x2f, 0xf0, 0xf3, 0xa1, 0x09, 0x62, 0xb7, - 0x57, 0x84, 0x3c, 0x32, 0xcd, 0x77, 0xd5, 0x18, 0xf7, 0x63, 0xe3, 0xfb, - 0x61, 0xae, 0x7a, 0x71, 0x24, 0xb3, 0x8e, 0x4b, 0x65, 0x44, 0xa9, 0xdf, - 0x40, 0xcc, 0xb9, 0x43, 0x42, 0xea, 0xca, 0x6c, 0x3c, 0x50, 0x7c, 0x61, - 0x2e, 0x56, 0xef, 0x21, 0x61, 0x86, 0x82, 0x33, 0x28, 0xb7, 0x4c, 0x80, - 0x2c, 0x77, 0xde, 0x64, 0x8f, 0x3a, 0x2c, 0x11, 0x11, 0x37, 0x23, 0x1f, - 0x8a, 0x14, 0x88, 0xa7, 0xb7, 0x43, 0x07, 0x50, 0xc0, 0xa5, 0x54, 0x6f, - 0x67, 0x50, 0x02, 0x67, 0xaf, 0x72, 0x15, 0x62, 0x75, 0x9a, 0x39, 0xb2, - 0x60, 0xe0, 0x01, 0xf4, 0xba, 0x24, 0x76, 0x90, 0x0a, 0xfd, 0x46, 0x3d, - 0x2e, 0x54, 0x75, 0xd6, 0xfa, 0xc2, 0x91, 0xfa, 0xd9, 0x7b, 0x1e, 0xa9, - 0x04, 0x2f, 0xf8, 0xc7, 0x64, 0xde, 0x93, 0x32, 0x15, 0x55, 0x12, 0x49, - 0xc8, 0xc8, 0x3a, 0xee, 0x95, 0x98, 0xdd, 0xb2, 0x59, 0x66, 0x30, 0x0b, - 0x8a, 0xfe, 0xa4, 0xaf, 0x9c, 0x12, 0xdb, 0xb1, 0x5d, 0xdb, 0x7d, 0x9c, - 0xa4, 0xce, 0x02, 0xf5, 0xba, 0x59, 0xe4, 0x77, 0x23, 0x3a, 0x97, 0xd5, - 0x16, 0x23, 0x69, 0xa9, 0x41, 0x07, 0x0b, 0x3f, 0xf2, 0x73, 0x90, 0xa1, - 0x14, 0x69, 0xa0, 0x08, 0xf4, 0xfc, 0x75, 0x92, 0x9e, 0xfd, 0x8a, 0x29, - 0x2c, 0x8d, 0x75, 0xfb, 0x78, 0x82, 0x2a, 0x8c, 0xba, 0xb6, 0x04, 0x81, - 0x63, 0x47, 0xfa, 0xeb, 0x5a, 0xc7, 0x58, 0x75, 0x21, 0x8a, 0x6a, 0x60, - 0xf6, 0x43, 0x89, 0x46, 0x90, 0xb0, 0x86, 0xea, 0xc2, 0x9f, 0x84, 0x04, - 0x18, 0x52, 0xe6, 0x9e, 0x52, 0xca, 0xf2, 0xd5, 0x1f, 0x9c, 0xc8, 0x0d, - 0xd3, 0xad, 0x2c, 0x40, 0x36, 0xd8, 0xbf, 0x3e, 0x8a, 0xcd, 0x66, 0xec, - 0xf6, 0x32, 0x2c, 0xa0, 0x4c, 0x6a, 0x9c, 0x18, 0xf8, 0xfd, 0x5b, 0x26, - 0xf3, 0x86, 0x53, 0x56, 0x54, 0xcb, 0xf9, 0x9c, 0x84, 0x66, 0xdb, 0x26, - 0x75, 0x1c, 0x01, 0xa3, 0x73, 0xa2, 0x9a, 0xa2, 0xc9, 0x51, 0x74, 0x89, - 0x7b, 0x3e, 0x61, 0x5d, 0x1e, 0x68, 0x90, 0xb7, 0x8b, 0xb2, 0xb6, 0xba, - 0x5f, 0x07, 0xb8, 0x93, 0x65, 0x67, 0xdd, 0xc9, 0x90, 0x5b, 0x5e, 0xf7, - 0x07, 0x05, 0x6b, 0x51, 0xea, 0xff, 0x7c, 0xc7, 0xba, 0x2d, 0xa3, 0x0a, - 0xaa, 0x19, 0x2a, 0x11, 0x3e, 0xbe, 0x54, 0xb3, 0xea, 0xde, 0x3a, 0x4e, - 0xa2, 0x3c, 0x31, 0x8b, 0x66, 0x51, 0x37, 0xed, 0x2d, 0x98, 0x18, 0x8e, - 0x8c, 0x96, 0x8b, 0x99, 0x71, 0x42, 0x81, 0x04, 0xf7, 0x66, 0xbf, 0x4f, - 0xb4, 0xef, 0xb1, 0x1b, 0xc9, 0xb0, 0x6e, 0x9e, 0x81, 0xf2, 0x6b, 0x7f, - 0x3b, 0xbe, 0x83, 0x5a, 0x2b, 0xf3, 0xb1, 0xe6, 0x1d, 0x44, 0xee, 0x80, - 0x7f, 0xd7, 0x9c, 0x19, 0xd4, 0xeb, 0xb6, 0x13, 0xed, 0x82, 0x89, 0x25, - 0xa0, 0xff, 0xa9, 0x5b, 0xff, 0xe5, 0xa4, 0x45, 0xde, 0xf3, 0xa6, 0xf9, - 0xb2, 0x82, 0x6c, 0xfa, 0xdb, 0x42, 0x87, 0x1b, 0x0d, 0x13, 0xa1, 0xde, - 0x14, 0xc4, 0xe4, 0x46, 0xb5, 0xcc, 0xa0, 0x44, 0xe3, 0xbe, 0xe0, 0x80, - 0x79, 0xc4, 0xcc, 0x36, 0x64, 0xb8, 0x5d, 0x03, 0x52, 0xc7, 0x2d, 0xc0, - 0x7a, 0xa3, 0x31, 0x02, 0x1f, 0x78, 0xc6, 0xff, 0x76, 0x26, 0x4f, 0xc9, - 0xc8, 0xa3, 0xe6, 0x54, 0x91, 0xe1, 0x2d, 0x0c, 0x40, 0xf5, 0x3b, 0x15, - 0x76, 0xd1, 0x38, 0x48, 0xf2, 0xd3, 0x46, 0x51, 0xa6, 0xd5, 0x41, 0x42, - 0xb7, 0xc4, 0x85, 0xdd, 0x06, 0x1b, 0xd0, 0x42, 0x32, 0xda, 0x99, 0xd0, - 0x2e, 0xf3, 0x35, 0x0e, 0xaa, 0xc1, 0x70, 0x59, 0xca, 0xb9, 0x2a, 0x76, - 0x49, 0xef, 0xa9, 0x88, 0x83, 0x79, 0x0f, 0xd6, 0x8c, 0x43, 0x27, 0x8a, - 0x39, 0x27, 0xa0, 0x35, 0xb0, 0x36, 0xe2, 0xd8, 0x71, 0x50, 0xbb, 0x65, - 0x38, 0x03, 0x36, 0x13, 0x3d, 0x58, 0x9a, 0x07, 0xe2, 0xb1, 0x56, 0xd9, - 0x9e, 0x59, 0x89, 0x73, 0xfb, 0xfc, 0xe1, 0x4f, 0x1a, 0xd0, 0x35, 0xb9, - 0x33, 0xbb, 0x3f, 0xcb, 0xb5, 0xb7, 0xff, 0x15, 0xed, 0xdf, 0xe6, 0x3f, - 0x39, 0xc0, 0x67, 0xc7, 0x2e, 0x85, 0x28, 0x49, 0xb8, 0xe2, 0x0b, 0x79, - 0x03, 0xce, 0x97, 0x82, 0x7e, 0x64, 0x80, 0xf3, 0xa9, 0xe2, 0x44, 0xab, - 0xe8, 0x85, 0x7a, 0xd7, 0x78, 0x4b, 0xc9, 0x04, 0x15, 0xf9, 0xea, 0x12, - 0xed, 0x1a, 0x66, 0x3a, 0xdc, 0x8d, 0x07, 0xaf, 0x7f, 0xf5, 0x8a, 0xce, - 0x9a, 0x26, 0xd9, 0xeb, 0xdf, 0xd6, 0x17, 0x52, 0x7e, 0x60, 0x29, 0x89, - 0x1f, 0xab, 0x70, 0x5b, 0xba, 0x72, 0x53, 0xb2, 0xef, 0x2d, 0xad, 0x61, - 0x98, 0x28, 0x9a, 0x00, 0x26, 0xa3, 0x81, 0x5f, 0xe1, 0x5a, 0x72, 0x0c, - 0x15, 0xc6, 0x0e, 0x29, 0x3b, 0x55, 0x92, 0xa0, 0xdc, 0x75, 0x91, 0x8a, - 0xa9, 0x7f, 0xe5, 0x12, 0x8c, 0x44, 0x8a, 0xe8, 0xe7, 0xcd, 0x03, 0x9e, - 0x69, 0x6e, 0x7a, 0x77, 0x62, 0x4a, 0xea, 0x62, 0x3a, 0x23, 0x7c, 0xda, - 0x35, 0x17, 0x60, 0xaf, 0xba, 0x08, 0x82, 0xd5, 0xb8, 0x1c, 0x8e, 0x90, - 0xcc, 0x3b, 0xcd, 0x98, 0xdd, 0x7d, 0xc5, 0xaf, 0x93, 0xcf, 0x53, 0xb8, - 0xab, 0xf0, 0x83, 0x49, 0x0a, 0xb4, 0xe1, 0xba, 0x38, 0x30, 0x39, 0xfb, - 0xf1, 0x4d, 0x84, 0xdf, 0x3f, 0x3c, 0xe3, 0x4d, 0xf5, 0x34, 0x50, 0xe2, - 0x19, 0xf0, 0xf0, 0xb0, 0x4a, 0xa3, 0xce, 0xe9, 0xbe, 0xaa, 0xcf, 0xf5, - 0x79, 0x76, 0x81, 0x68, 0x5e, 0x86, 0x0c, 0x1c, 0x68, 0xde, 0x47, 0xa8, - 0xb3, 0x5a, 0xf9, 0x9c, 0x6f, 0x2c, 0xde, 0xab, 0x3f, 0x91, 0xd0, 0xe1, - 0x7b, 0x0a, 0x11, 0x41, 0xc9, 0x88, 0xfa, 0xcc, 0x2e, 0x75, 0xf3, 0x29, - 0x79, 0xf1, 0xab, 0x04, 0xaf, 0x1f, 0xeb, 0x52, 0x11, 0x4f, 0xf5, 0xdb, - 0xbb, 0x67, 0x8b, 0x10, 0xc7, 0x77, 0x42, 0xc4, 0xcb, 0x02, 0x7f, 0xd0, - 0xed, 0xaa, 0x82, 0x63, 0x81, 0x6a, 0x35, 0x2c, 0x13, 0x48, 0x7c, 0x98, - 0xb3, 0x88, 0xfb, 0x85, 0x9f, 0x0b, 0x6c, 0xe4, 0x7b, 0xfd, 0x1b, 0x54, - 0xc0, 0x04, 0x7c, 0xc9, 0x76, 0x18, 0x9f, 0x29, 0x40, 0x05, 0x78, 0x94, - 0xa8, 0x4f, 0x36, 0xe7, 0xdb, 0x6e, 0xfa, 0x5b, 0xee, 0x74, 0xca, 0x10, - 0x36, 0x1e, 0x28, 0xc9, 0x33, 0xd9, 0x57, 0x51, 0xb7, 0x20, 0xaf, 0x7a, - 0xe8, 0x1e, 0xa6, 0x3d, 0x62, 0x42, 0x90, 0x5a, 0x7d, 0xd5, 0x64, 0xb7, - 0xb4, 0x11, 0x96, 0xb3, 0x2d, 0xc6, 0xdd, 0x5f, 0x5b, 0x0b, 0x0e, 0xf1, - 0xa2, 0xf1, 0xba, 0x4d, 0x99, 0x27, 0x38, 0xf7, 0x21, 0x87, 0x93, 0x81, - 0x2b, 0x1f, 0x06, 0xc2, 0x8d, 0x24, 0x64, 0x71, 0xab, 0x0f, 0x26, 0x8d, - 0xea, 0x10, 0xfb, 0x54, 0x2f, 0x39, 0xc7, 0x19, 0xef, 0x46, 0xfe, 0x40, - 0x83, 0x79, 0x0f, 0xd6, 0x8c, 0x53, 0x27, 0x8a, 0x39, 0x27, 0xa0, 0x35, - 0xb0, 0x36, 0xe2, 0xd8, 0x71, 0x50, 0xbb, 0x65, 0x38, 0x03, 0x36, 0x13, - 0x3d, 0x58, 0x9a, 0x07, 0xe2, 0xb1, 0x56, 0xd9, 0x9e, 0x59, 0x89, 0x73, - 0xfb, 0xfc, 0xe1, 0x4f, 0x1a, 0xd0, 0x35, 0xb9, 0x33, 0xbb, 0x3f, 0xcb, - 0x35, 0xb5, 0x46, 0x5e, 0xa6, 0x8f, 0xf1, 0xc2, 0x12, 0x50, 0x71, 0x39, - 0x4f, 0x19, 0x3e, 0x32, 0x05, 0x66, 0x18, 0x03, 0xbc, 0xff, 0x88, 0x7d, - 0xbb, 0x5f, 0x52, 0x8d, 0x26, 0x82, 0x3c, 0xca, 0xdb, 0x16, 0xe8, 0x49, - 0x55, 0x0b, 0xda, 0xae, 0x18, 0x52, 0x28, 0x9a, 0xab, 0x69, 0x10, 0xb5, - 0x4e, 0x48, 0x95, 0x2d, 0x6a, 0x5b, 0xc2, 0xb5, 0x27, 0x32, 0x92, 0x53, - 0x3e, 0xa3, 0x5d, 0xd8, 0xfb, 0x39, 0x41, 0xa7, 0xc3, 0xf6, 0xf0, 0xea, - 0xce, 0x7f, 0x44, 0x14, 0x9c, 0x59, 0x2d, 0x98, 0x0c, 0x2d, 0xe6, 0x3f, - 0xfc, 0xec, 0xe0, 0xc4, 0x73, 0xe7, 0x6f, 0x0f, 0xba, 0xfd, 0x1f, 0x29, - 0x3f, 0xdf, 0x97, 0x27, 0xc2, 0x26, 0xf7, 0x21, 0x7c, 0xb0, 0x6f, 0xe8, - 0xb2, 0x13, 0x51, 0xf2, 0x34, 0x89, 0xf7, 0x73, 0x09, 0x06, 0x75, 0x1e, - 0x82, 0xe6, 0x61, 0x7e, 0xeb, 0x36, 0xe0, 0xf5, 0xf1, 0x92, 0x97, 0x30, - 0x73, 0xaa, 0xe9, 0xd8, 0x9f, 0x0c, 0xb7, 0xc4, 0x1a, 0x22, 0xd5, 0x12, - 0x5d, 0x68, 0x0a, 0x62, 0x5a, 0x6e, 0xe3, 0x3a, 0x11, 0x11, 0x97, 0x15, - 0xd4, 0x27, 0x3d, 0xd8, 0x01, 0x44, 0x86, 0x69, 0xca, 0xf5, 0xce, 0xf5, - 0x1f, 0xdc, 0x31, 0x16, 0xc2, 0x84, 0x5f, 0xaa, 0x79, 0xa7, 0xb3, 0x42, - 0x1e, 0x38, 0xea, 0x9e, 0x8c, 0x57, 0x75, 0xd4, 0x3c, 0x81, 0x2a, 0xa5, - 0x56, 0x4d, 0xf3, 0x34, 0xe0, 0x80, 0xe4, 0x41, 0x40, 0x45, 0x94, 0xd7, - 0xc7, 0x76, 0x2a, 0x08, 0x25, 0x7b, 0x82, 0xa6, 0x3d, 0x89, 0xfc, 0x6b, - 0xec, 0x1f, 0x13, 0x9b, 0xe6, 0x56, 0x47, 0x6b, 0x3b, 0x03, 0x46, 0x64, - 0x61, 0xe2, 0xc8, 0x00, 0x3c, 0x61, 0x09, 0xc6, 0xf4, 0x72, 0x05, 0x2e, - 0x43, 0x77, 0xb3, 0xd7, 0x32, 0x54, 0x95, 0x89, 0x2c, 0x3e, 0xf0, 0x3a, - 0xc8, 0xcb, 0xdc, 0x9c, 0x29, 0x24, 0x6a, 0x6e, 0xa9, 0x50, 0x83, 0xa7, - 0x8a, 0x79, 0xd5, 0xba, 0xe8, 0xff, 0x94, 0x77, 0xf9, 0x23, 0x47, 0x38, - 0x13, 0x16, 0x5d, 0xce, 0xf9, 0x59, 0x1c, 0xfa, 0x8f, 0xb9, 0xb0, 0xf8, - 0xdb, 0xa0, 0xb4, 0xa7, 0x9c, 0xce, 0x85, 0x03, 0x03, 0x23, 0x98, 0x48, - 0xb8, 0x19, 0x9e, 0xa6, 0x99, 0xcb, 0x10, 0x60, 0x5d, 0xc4, 0x8b, 0x61, - 0x31, 0x96, 0x1b, 0xa4, 0x05, 0x50, 0x1f, 0xd2, 0x1e, 0x21, 0x91, 0x85, - 0x7e, 0x9f, 0xad, 0xc3, 0xc9, 0x19, 0xdb, 0x78, 0x7d, 0x0a, 0x0b, 0xc8, - 0x1c, 0xa9, 0x5c, 0x21, 0xa0, 0xe1, 0x0a, 0x2f, 0x7c, 0x9c, 0xf6, 0xb7, - 0x71, 0xeb, 0x55, 0x14, 0xc8, 0x3a, 0xf8, 0x97, 0xcd, 0x99, 0x84, 0x71, - 0x83, 0x40, 0x4d, 0xb4, 0x22, 0x43, 0x52, 0xe7, 0x89, 0x6a, 0x9d, 0xba, - 0xe9, 0x47, 0x95, 0x06, 0x07, 0xef, 0xd6, 0xaf, 0x7d, 0x3b, 0x6f, 0x15, - 0x35, 0xb9, 0x04, 0x72, 0xd6, 0x4d, 0x06, 0xef, 0xd7, 0xdc, 0xe4, 0x47, - 0x87, 0xc4, 0xaf, 0x4c, 0xb7, 0x96, 0xdb, 0x50, 0x40, 0x54, 0xf5, 0x7e, - 0x67, 0x39, 0x37, 0x36, 0xdd, 0x9a, 0xae, 0x68, 0x34, 0x9f, 0x12, 0x03, - 0x98, 0x57, 0xe4, 0x82, 0x44, 0xd2, 0xa4, 0x8a, 0xd1, 0xe8, 0x47, 0x16, - 0x74, 0x35, 0x99, 0xbb, 0x68, 0xab, 0x23, 0x7f, 0xfa, 0x45, 0x15, 0xc3, - 0x4c, 0x78, 0x16, 0x89, 0xa3, 0x1e, 0xd5, 0xcc, 0x42, 0x49, 0xca, 0xa4, - 0xee, 0xb1, 0x3f, 0x87, 0x70, 0x6f, 0x52, 0x34, 0x46, 0x74, 0x7d, 0xcf, - 0x0a, 0x4c, 0xe7, 0x7e, 0x44, 0x51, 0xc1, 0xac, 0x4f, 0xc0, 0xbe, 0x87, - 0xaf, 0x4c, 0xf2, 0x8b, 0x10, 0x5f, 0xa9, 0x52, 0x78, 0xd9, 0x3e, 0xc9, - 0xf2, 0xf9, 0xc5, 0x0c, 0xca, 0x15, 0xb6, 0xe5, 0xf8, 0xa4, 0x34, 0xa0, - 0x13, 0xba, 0xb9, 0x01, 0xab, 0xa9, 0xa9, 0x10, 0x61, 0x65, 0x94, 0x1e, - 0xbe, 0xfd, 0x3b, 0x1e, 0xb4, 0x0f, 0x53, 0x94, 0x55, 0x4a, 0x36, 0x93, - 0xea, 0x75, 0x3c, 0x89, 0xa8, 0x0d, 0x61, 0x34, 0x8a, 0x19, 0xa5, 0x31, - 0xa9, 0xbb, 0x9d, 0xf7, 0xb7, 0x78, 0xbf, 0xcb, 0xa7, 0x9d, 0x8a, 0x09, - 0x39, 0xd3, 0x41, 0xeb, 0x4f, 0x57, 0xc9, 0x48, 0x87, 0xfa, 0x8d, 0x6f, - 0x43, 0xd0, 0x48, 0xdf, 0x09, 0xbd, 0xc9, 0xc7, 0x36, 0xfd, 0x7f, 0x5a, - 0x7b, 0x4d, 0x87, 0xbc, 0xb2, 0x4e, 0x0c, 0x13, 0xc7, 0xbc, 0xad, 0x00, - 0x53, 0xa6, 0xe3, 0x16, 0x6e, 0xfb, 0x6b, 0x6d, 0x0d, 0x79, 0x42, 0x03, - 0x62, 0xe9, 0x38, 0xaf, 0xfb, 0x5c, 0x71, 0x4f, 0xaa, 0xbc, 0x85, 0x33, - 0xf0, 0x10, 0xce, 0xb2, 0xe4, 0xf1, 0x53, 0xdb, 0x23, 0x26, 0xbf, 0xe8, - 0x30, 0x22, 0x6a, 0x1a, 0x62, 0xed, 0xdd, 0x3f, 0x23, 0xd4, 0x49, 0x56, - 0x7f, 0xf3, 0x9e, 0xdd, 0x32, 0x59, 0x94, 0x93, 0xdf, 0x53, 0x03, 0xd0, - 0xb2, 0x5b, 0x7f, 0xa7, 0x54, 0x7c, 0x1e, 0x7b, 0x6b, 0x1a, 0x96, 0x1a, - 0x71, 0x8d, 0x6a, 0x4a, 0xc9, 0x27, 0xde, 0xf0, 0x11, 0x44, 0xc5, 0x64, - 0xbc, 0xab, 0xe1, 0x00, 0x5b, 0x29, 0xfa, 0x0e, 0x8f, 0xa7, 0x00, 0x73, - 0x94, 0xb7, 0x99, 0x99, 0x76, 0x19, 0xd6, 0x53, 0x1d, 0x77, 0x53, 0xd6, - 0x35, 0x93, 0x96, 0x42, 0x51, 0x45, 0x64, 0x61, 0x9d, 0x00, 0x11, 0x4c, - 0x1a, 0x71, 0x59, 0x12, 0xcf, 0xca, 0x41, 0x6d, 0x49, 0x4c, 0x5e, 0x87, - 0x90, 0x66, 0x9a, 0x89, 0x5e, 0x2a, 0xef, 0x9c, 0xe7, 0xd7, 0xc2, 0x3c, - 0xae, 0xcc, 0x42, 0x5a, 0x87, 0x1d, 0xf8, 0xe8, 0x68, 0xd9, 0x6a, 0x58, - 0xb0, 0x7c, 0xe7, 0xc2, 0x62, 0xe3, 0xfe, 0x3e, 0x69, 0x33, 0x62, 0x05, - 0xe5, 0x79, 0xa6, 0x4d, 0x49, 0x78, 0x15, 0x8e, 0xb0, 0x7c, 0x4d, 0xa7, - 0x1b, 0x04, 0x29, 0x11, 0x69, 0xd7, 0x41, 0x64, 0x2e, 0x98, 0x38, 0x90, - 0x89, 0x6a, 0x20, 0x99, 0xd6, 0x57, 0x36, 0x51, 0xbf, 0x1c, 0x43, 0xa2, - 0x7e, 0x8d, 0xa0, 0x79, 0xc9, 0x71, 0x23, 0x16, 0x8c, 0x8c, 0x71, 0xa9, - 0x7a, 0xec, 0x37, 0x1f, 0x65, 0x38, 0xa0, 0x5a, 0xb4, 0x0b, 0x53, 0x5e, - 0x73, 0xb1, 0xb6, 0x3c, 0x83, 0xa2, 0xf8, 0x26, 0xcf, 0xe9, 0x91, 0x5f, - 0x58, 0xee, 0x9c, 0x77, 0x3d, 0x96, 0x78, 0xfd, 0x6d, 0x8f, 0xe0, 0x51, - 0x54, 0x41, 0xf1, 0x19, 0x71, 0xc6, 0x71, 0x15, 0x61, 0x52, 0x77, 0x87, - 0x73, 0x72, 0xdd, 0x96, 0xa4, 0x33, 0x42, 0xd5, 0xc4, 0x3d, 0xd0, 0x83, - 0x18, 0xa0, 0x00, 0xff, 0x44, 0x59, 0xfd, 0xc4, 0x90, 0x78, 0x0d, 0x59, - 0x60, 0x50, 0x2e, 0x3a, 0xa9, 0x7d, 0xe8, 0xf6, 0xdb, 0xe7, 0xad, 0x1d, - 0xf3, 0x7c, 0x1d, 0x01, 0xac, 0xdf, 0x41, 0x6b, 0xe9, 0x6b, 0x93, 0xe8, - 0x58, 0xcd, 0x60, 0xcd, 0x55, 0xab, 0xa0, 0xfb, 0xc0, 0x45, 0xbd, 0x09, - 0x88, 0xe9, 0x08, 0x7f, 0xc9, 0x70, 0xe6, 0x6f, 0x2a, 0xbf, 0x06, 0x4c, - 0x98, 0x7a, 0x53, 0x8a, 0x66, 0x60, 0x1f, 0x34, 0x63, 0x80, 0x34, 0xe8, - 0xa1, 0x0f, 0x6c, 0x38, 0x8c, 0x16, 0x22, 0xf3, 0xdb, 0x55, 0xd1, 0xf5, - 0x54, 0x5c, 0xeb, 0x37, 0x9d, 0x28, 0xe1, 0x87, 0xc2, 0x89, 0x10, 0x14, - 0x5f, 0xa8, 0x1d, 0x25, 0x44, 0xb3, 0x40, 0xd5, 0xaf, 0x21, 0x6b, 0xe4, - 0xa1, 0x5d, 0xb4, 0x2e, 0x05, 0x62, 0xa7, 0x80, 0x23, 0x1c, 0xde, 0x01, - 0x44, 0xda, 0xb0, 0x71, 0xc5, 0xaf, 0x73, 0x32, 0xaf, 0xd3, 0x17, 0xff, - 0x25, 0xc4, 0xe0, 0x55, 0xe7, 0x40, 0x98, 0x56, 0x37, 0xd5, 0x8f, 0xca, - 0xf5, 0x4d, 0x88, 0x49, 0x66, 0xf6, 0x4c, 0xfe, 0xdd, 0x48, 0x93, 0xd2, - 0x07, 0x3b, 0x10, 0x37, 0x5c, 0x3d, 0x72, 0xb3, 0xe6, 0xc6, 0xdb, 0xdf, - 0x4e, 0x13, 0x11, 0xd7, 0xa5, 0xbd, 0xab, 0x1d, 0xcf, 0x34, 0x65, 0xb9, - 0xb1, 0xd8, 0xfa, 0x85, 0x0b, 0x98, 0x50, 0x00, 0xec, 0x9f, 0xf5, 0xa7, - 0x70, 0x70, 0x4d, 0xef, 0xc4, 0x90, 0xb1, 0x87, 0x3d, 0xed, 0x1b, 0xfe, - 0x4e, 0xcb, 0xb1, 0x9f, 0xc7, 0x0f, 0x53, 0xe7, 0x9a, 0xb0, 0x2d, 0x75, - 0x34, 0x6e, 0xb7, 0x51, 0x84, 0xb6, 0xcc, 0xa6, 0x26, 0xe7, 0xb0, 0x88, - 0x8c, 0x08, 0x6b, 0xa0, 0x16, 0x14, 0xaa, 0x99, 0xbc, 0xd3, 0x91, 0x45, - 0x61, 0x04, 0xe3, 0xbe, 0x18, 0x65, 0x6f, 0x88, 0x1f, 0xaf, 0x7b, 0xa4, - 0x18, 0x89, 0x8b, 0x37, 0x57, 0xef, 0x56, 0x6c, 0x9e, 0xdb, 0x33, 0xff, - 0xc8, 0x58, 0xe9, 0x4e, 0xf1, 0x59, 0x3a, 0x46, 0xf8, 0x01, 0xaa, 0x19, - 0x57, 0xe4, 0x17, 0x81, 0x1e, 0xab, 0x89, 0x1e, 0xf1, 0x57, 0xa1, 0x96, - 0xae, 0x91, 0x9a, 0x86, 0xa8, 0x52, 0x6c, 0x38, 0x3a, 0xe0, 0xb4, 0x85, - 0x52, 0xed, 0x77, 0xf3, 0x34, 0x46, 0x8b, 0x00, 0x18, 0xcc, 0xc8, 0x99, - 0xfc, 0x16, 0xde, 0xcd, 0xaf, 0xe6, 0x6f, 0x93, 0xc2, 0x95, 0xa8, 0xd3, - 0xeb, 0x71, 0x87, 0xd3, 0x27, 0x19, 0xe5, 0x7c, 0x51, 0x22, 0xe3, 0xc5, - 0xf9, 0xcc, 0x39, 0x6c, 0x54, 0x74, 0x73, 0xdb, 0xf7, 0x8f, 0x57, 0x48, - 0xba, 0x36, 0x51, 0x8c, 0x0a, 0x65, 0x25, 0x04, 0x1b, 0x7b, 0xe8, 0x80, - 0xeb, 0x3e, 0xf7, 0x59, 0x4d, 0x61, 0x7d, 0x53, 0x16, 0xf8, 0x9a, 0x09, - 0x77, 0x9a, 0x1e, 0xe5, 0x2e, 0x16, 0xe3, 0x6a, 0x4b, 0x86, 0x1e, 0x7d, - 0x73, 0x1d, 0xf4, 0x11, 0xfc, 0xfa, 0x7d, 0xd6, 0x2d, 0xa1, 0xc6, 0x5a, - 0x67, 0xae, 0x8f, 0x38, 0xea, 0x36, 0xfd, 0xf0, 0xf7, 0xbf, 0x0f, 0xdf, - 0x6c, 0xfa, 0x3c, 0xf8, 0x75, 0xa4, 0xb9, 0x7f, 0x98, 0xdc, 0x35, 0xab, - 0xad, 0x0f, 0xd7, 0xbc, 0x57, 0xcb, 0x47, 0x4c, 0xfb, 0xe5, 0x5b, 0x54, - 0xf2, 0xe8, 0x9a, 0xe1, 0x27, 0x9b, 0x61, 0x05, 0x07, 0x2f, 0x4f, 0x47, - 0x73, 0xd3, 0x6e, 0x8e, 0x4f, 0x00, 0xd6, 0x71, 0x39, 0xf8, 0x13, 0xe8, - 0x41, 0x66, 0xcf, 0xcc, 0x16, 0x59, 0xca, 0x4b, 0xe2, 0x6e, 0x81, 0x49, - 0x5f, 0xfd, 0x7f, 0xe5, 0xb0, 0x1e, 0xa0, 0x3c, 0xcb, 0x7a, 0x89, 0x80, - 0xd6, 0x45, 0xcd, 0x3b, 0xfb, 0x02, 0x3f, 0x97, 0xb0, 0xfe, 0x2f, 0x54, - 0x29, 0xcf, 0x62, 0x9c, 0xa5, 0xfe, 0xe2, 0x4d, 0xd3, 0xa1, 0x0a, 0x48, - 0x20, 0xdb, 0xd8, 0xcc, 0x7c, 0x91, 0x30, 0x45, 0x4f, 0x93, 0xc0, 0xdf, - 0x1b, 0x99, 0x9c, 0x80, 0xce, 0xdf, 0x76, 0x27, 0x73, 0xde, 0xc8, 0x1d, - 0xdf, 0x6e, 0x30, 0x8e, 0x7a, 0x20, 0xcd, 0x3c, 0x66, 0xd3, 0x18, 0x02, - 0xa2, 0x60, 0x7b, 0xce, 0x77, 0x5a, 0x96, 0xbd, 0xc4, 0x5d, 0x10, 0xbd, - 0xcb, 0x68, 0x3a, 0x63, 0x8a, 0xe0, 0x21, 0x1f, 0x1d, 0xe4, 0x07, 0x98, - 0xb8, 0x4d, 0x81, 0x16, 0x1e, 0x6a, 0x01, 0x98, 0xa3, 0xd2, 0xed, 0xfb, - 0x34, 0xcd, 0xcf, 0x0f, 0x06, 0x1e, 0x21, 0x6b, 0xf1, 0xd0, 0x10, 0x81, - 0x50, 0xd4, 0x05, 0x55, 0x1e, 0x18, 0x10, 0xd5, 0xe4, 0xa9, 0xfd, 0x0d, - 0x96, 0xa2, 0x63, 0xb3, 0xa8, 0x83, 0x05, 0x5b, 0xd1, 0x6d, 0xba, 0x29, - 0x05, 0xce, 0x70, 0x8f, 0xce, 0x0b, 0x7f, 0xdd, 0x34, 0xcc, 0x0b, 0x69, - 0x89, 0x1f, 0x61, 0x2a, 0xac, 0x1c, 0x33, 0x08, 0xe6, 0x58, 0x6e, 0x7f, - 0x06, 0xac, 0x26, 0xb3, 0x03, 0xff, 0xc9, 0x95, 0xdd, 0x8b, 0x02, 0xa5, - 0x81, 0x68, 0xce, 0xb5, 0x69, 0xc2, 0x31, 0x54, 0xa8, 0xaa, 0xd8, 0x1b, - 0x7d, 0xb5, 0x14, 0xc0, 0x9e, 0xb9, 0x2e, 0x16, 0x25, 0xd9, 0x44, 0x0d, - 0x03, 0x8e, 0xee, 0xca, 0x6c, 0x67, 0x57, 0x2a, 0xac, 0x78, 0x6a, 0xe1, - 0x45, 0x13, 0x77, 0x2a, 0x24, 0xab, 0x45, 0xe0, 0x1b, 0x17, 0x54, 0x1a, - 0x32, 0x74, 0xd8, 0x64, 0x17, 0xce, 0xa0, 0x58, 0xcd, 0x89, 0x0c, 0xf1, - 0xdc, 0xe5, 0x71, 0xd8, 0x37, 0x94, 0x7a, 0x61, 0x81, 0xb0, 0xb5, 0x68, - 0x75, 0xa4, 0xd8, 0x50, 0x9a, 0xc3, 0x61, 0xa1, 0xb0, 0x57, 0xea, 0xd6, - 0xc2, 0xc5, 0x0f, 0x9c, 0xd1, 0xcf, 0xd3, 0x53, 0x35, 0xb6, 0x3e, 0x65, - 0x97, 0x02, 0x6e, 0x03, 0x1a, 0x83, 0x51, 0xb6, 0xc1, 0x02, 0xcc, 0x4a, - 0x77, 0x43, 0x3c, 0x96, 0x31, 0x54, 0x84, 0xf9, 0x62, 0xaf, 0xc9, 0x3d, - 0x02, 0x68, 0x0a, 0xdd, 0xe4, 0x18, 0x49, 0xd9, 0xc1, 0xa5, 0xaa, 0xe2, - 0x27, 0x2e, 0x6f, 0x0f, 0x6e, 0x72, 0xfb, 0x85, 0x4e, 0x88, 0xd4, 0xa4, - 0x1e, 0x97, 0x27, 0x73, 0x75, 0x46, 0xe5, 0xed, 0x30, 0xc1, 0x79, 0xd8, - 0x98, 0xba, 0x51, 0x18, 0xa8, 0xac, 0x62, 0x33, 0x1e, 0xf2, 0xc2, 0x95, - 0x75, 0xd3, 0xd9, 0x89, 0xd6, 0x05, 0x80, 0xf3, 0xaf, 0x70, 0xd4, 0xda, - 0xb1, 0x8d, 0x16, 0x5d, 0x94, 0xe7, 0x77, 0xb7, 0x94, 0x22, 0xb3, 0xac, - 0x81, 0x0e, 0x9b, 0x2c, 0xbf, 0x19, 0xb8, 0x0f, 0x59, 0x31, 0xad, 0x4e, - 0xe9, 0xd8, 0x8e, 0x88, 0x7a, 0x2e, 0x2b, 0x69, 0x1b, 0x0c, 0xf2, 0x28, - 0xb5, 0x47, 0x58, 0x4b, 0x0e, 0x3b, 0xa5, 0x5b, 0x34, 0x74, 0x5c, 0xad, - 0x3c, 0xf3, 0xfa, 0xb6, 0xc6, 0x01, 0x6a, 0x1a, 0x07, 0xc0, 0x20, 0xf3, - 0x87, 0xa9, 0x40, 0xa4, 0x7b, 0x86, 0x41, 0x2b, 0xe6, 0x12, 0xeb, 0xc5, - 0x6f, 0xcb, 0x86, 0xfd, 0xd1, 0xa1, 0x25, 0xcd, 0x64, 0x8b, 0xb1, 0x6b, - 0x2b, 0x30, 0x0e, 0x4a, 0xf2, 0x86, 0x9d, 0xeb, 0xe0, 0xfb, 0x9d, 0x44, - 0x9d, 0x09, 0x1f, 0x53, 0x97, 0x8b, 0x5e, 0x44, 0xfa, 0x14, 0xd9, 0x83, - 0x4a, 0x87, 0x4d, 0x23, 0x34, 0x11, 0x46, 0xce, 0x52, 0x3d, 0x15, 0x49, - 0xe0, 0x3d, 0xe1, 0x84, 0x6e, 0x9e, 0xfa, 0x33, 0x7c, 0x3c, 0x7d, 0xc0, - 0x03, 0x27, 0xa7, 0x90, 0x78, 0x45, 0x4e, 0xd9, 0x56, 0x5e, 0x36, 0x6a, - 0x9a, 0x9f, 0xbe, 0xe4, 0x94, 0x13, 0x21, 0x0d, 0x60, 0x34, 0x87, 0x82, - 0xf3, 0xa3, 0xa1, 0x91, 0x31, 0x03, 0xd2, 0x0c, 0xdc, 0xfe, 0x74, 0x33, - 0x06, 0x2a, 0x77, 0xa0, 0x8f, 0x5e, 0x29, 0x81, 0xe5, 0x51, 0x26, 0x27, - 0x06, 0xa1, 0x5e, 0xf0, 0xa2, 0xc1, 0x5b, 0xfa, 0xa2, 0x73, 0x76, 0xa8, - 0xec, 0x1b, 0xe2, 0x81, 0xbc, 0x95, 0xbc, 0x37, 0xc7, 0x6f, 0x49, 0x87, - 0xba, 0x59, 0x00, 0xb6, 0x7e, 0x32, 0x45, 0x4c, 0x20, 0x50, 0xd3, 0x26, - 0x02, 0xd8, 0x87, 0xb6, 0xd9, 0x96, 0xec, 0xc9, 0x8b, 0x16, 0x09, 0x3d, - 0x5e, 0x42, 0x96, 0xb3, 0x0a, 0x7f, 0xa1, 0xcd, 0xb8, 0x3b, 0xd8, 0x01, - 0xc2, 0x36, 0x2f, 0xa4, 0xe2, 0x3a, 0x21, 0xff, 0xe5, 0xe4, 0x64, 0xfb, - 0xb2, 0xf7, 0xe9, 0x57, 0x04, 0xbf, 0x7c, 0x6d, 0xbd, 0xf9, 0x14, 0x13, - 0xf9, 0x3f, 0xcb, 0x27, 0x7e, 0x45, 0xf0, 0x52, 0xe4, 0x5b, 0x41, 0xe2, - 0x35, 0x1a, 0x83, 0x38, 0x0e, 0xc8, 0x18, 0xae, 0xf6, 0xfc, 0xae, 0x1e, - 0x1c, 0xa7, 0xf1, 0xfa, 0xe0, 0x8f, 0x46, 0x6c, 0x14, 0x0f, 0xc7, 0x16, - 0x25, 0x4e, 0x6e, 0x24, 0xe9, 0x4e, 0x24, 0xa3, 0x7d, 0x96, 0xe5, 0x5b, - 0xe8, 0x99, 0x49, 0x17, 0xef, 0xe0, 0xad, 0xb7, 0x45, 0x4f, 0x24, 0x10, - 0xe2, 0x79, 0x06, 0xad, 0x66, 0x83, 0x24, 0xc6, 0x24, 0x56, 0x64, 0xf7, - 0x30, 0xe5, 0xc8, 0xdf, 0x7a, 0x7f, 0x19, 0x16, 0xc9, 0x6a, 0xf1, 0x58, - 0x0c, 0xd0, 0x10, 0xbe, 0x05, 0xe1, 0x50, 0x6a, 0xad, 0x80, 0xea, 0x68, - 0x56, 0xc0, 0xb2, 0x10, 0x7e, 0x54, 0x73, 0x3e, 0xab, 0xf6, 0x98, 0x77, - 0xfb, 0x03, 0xc7, 0x09, 0x44, 0xf1, 0x39, 0xb7, 0xb6, 0x41, 0xc2, 0x95, - 0x4f, 0xd6, 0xe5, 0xe6, 0xf1, 0x83, 0x7c, 0x2e, 0x77, 0xb3, 0xbd, 0xa3, - 0xb5, 0x31, 0x26, 0x94, 0xe8, 0xca, 0xb7, 0xef, 0x1c, 0xf1, 0x53, 0xd3, - 0xba, 0x47, 0xb0, 0x17, 0x0e, 0x0a, 0x47, 0xdf, 0xf9, 0xa3, 0x23, 0x7f, - 0x02, 0x0c, 0xaa, 0x85, 0x99, 0x4e, 0xf6, 0xe8, 0x44, 0xc4, 0x3f, 0xf8, - 0x29, 0x54, 0x17, 0x7f, 0x3c, 0xd2, 0xb6, 0x46, 0x05, 0x25, 0x49, 0x82, - 0xa7, 0x86, 0xd3, 0x8b, 0x2a, 0x72, 0x0d, 0x3b, 0x67, 0xb1, 0x3e, 0x1f, - 0x09, 0x00, 0x05, 0xc7, 0x2d, 0x59, 0xf6, 0xe1, 0x6d, 0xca, 0x61, 0xe0, - 0x4c, 0x1a, 0xd9, 0x7c, 0x6d, 0xd3, 0x6c, 0x2c, 0x1b, 0x23, 0x35, 0xe2, - 0xa2, 0xd3, 0x7a, 0x26, 0x52, 0x03, 0xd9, 0x0f, 0x12, 0xa8, 0xe7, 0x45, - 0x89, 0x92, 0x12, 0x24, 0x3c, 0xb6, 0xca, 0xb6, 0x69, 0xa8, 0x07, 0x8c, - 0x50, 0x22, 0x02, 0x93, 0x52, 0x15, 0x99, 0xc6, 0xad, 0x91, 0xc7, 0xe8, - 0xf6, 0x75, 0x91, 0xdc, 0x3a, 0x90, 0x63, 0xa2, 0xc8, 0xb0, 0x19, 0x83, - 0x3e, 0xc5, 0x0a, 0x44, 0xd9, 0xb7, 0x32, 0x73, 0x14, 0xd5, 0x0c, 0x2d, - 0xea, 0x83, 0xb9, 0xda, 0x98, 0xf7, 0x22, 0xfc, 0xf0, 0x8f, 0xab, 0x46, - 0xaa, 0xd9, 0x02, 0x8a, 0xc5, 0x06, 0x3c, 0x19, 0xe9, 0xed, 0x49, 0xf3, - 0x42, 0x57, 0x21, 0x7f, 0x40, 0x16, 0x1a, 0x74, 0xcb, 0x65, 0xb5, 0xe4, - 0xd0, 0x2e, 0xbd, 0xcc, 0xb1, 0xae, 0xe4, 0x58, 0xdf, 0xfb, 0xaa, 0x64, - 0x69, 0xe3, 0x81, 0x38, 0x40, 0x81, 0xa1, 0xa6, 0x28, 0xaa, 0x92, 0xcd, - 0x71, 0xf6, 0xfb, 0x5b, 0x9b, 0x3a, 0x40, 0x7c, 0xef, 0x1d, 0xad, 0xad, - 0xe4, 0xac, 0x1f, 0x6e, 0x7c, 0x82, 0x55, 0x06, 0x3f, 0x66, 0x3c, 0x2a, - 0x1c, 0x00, 0x6f, 0x4d, 0xf6, 0xd5, 0xf4, 0xce, 0xf1, 0xd0, 0x1e, 0x40, - 0xa7, 0x34, 0x77, 0x94, 0x52, 0x75, 0x09, 0xf1, 0xf1, 0xb3, 0xfb, 0x4d, - 0x62, 0xb3, 0x5b, 0xe0, 0xf4, 0xa6, 0xe1, 0x60, 0x67, 0x7b, 0x66, 0x81, - 0x56, 0x21, 0x5e, 0x04, 0x93, 0x00, 0x1b, 0xc6, 0x8e, 0xed, 0x67, 0x39, - 0x57, 0x8e, 0x37, 0x50, 0xa5, 0x45, 0x7d, 0xd5, 0x93, 0x1a, 0xbd, 0x90, - 0x8f, 0x8a, 0xf4, 0x56, 0x8d, 0xad, 0x35, 0x31, 0xa0, 0x64, 0x3c, 0xf5, - 0x4f, 0x27, 0x04, 0xf3, 0xf1, 0x6f, 0x72, 0xae, 0xbb, 0xa0, 0x24, 0xb7, - 0x8f, 0xc1, 0xed, 0x33, 0x24, 0x54, 0x3a, 0x97, 0xf8, 0xe6, 0x54, 0x11, - 0xcb, 0x60, 0xcb, 0x80, 0x95, 0x27, 0xbb, 0x09, 0xfa, 0x27, 0xf0, 0x4b, - 0x3f, 0x91, 0xb6, 0xec, 0x9d, 0x94, 0xa9, 0x3e, 0x83, 0xea, 0x74, 0x15, - 0xd9, 0xd6, 0x21, 0x12, 0xa3, 0xeb, 0x1b, 0xc4, 0x69, 0xea, 0x5b, 0x44, - 0x23, 0xbe, 0x52, 0xec, 0x22, 0x5b, 0x39, 0x0f, 0x20, 0xf5, 0x8a, 0xe6, - 0x2d, 0x7b, 0xc2, 0x78, 0xa8, 0x70, 0x3e, 0xd8, 0xa3, 0xdb, 0xc8, 0xcd, - 0x0f, 0x92, 0x6f, 0xec, 0xe3, 0x58, 0x91, 0x40, 0xe6, 0xb6, 0x6a, 0xa5, - 0x02, 0x65, 0x93, 0x1f, 0x74, 0x32, 0x60, 0x7b, 0x85, 0x53, 0x18, 0xbd, - 0x98, 0x0b, 0x4d, 0x12, 0x2c, 0x33, 0x14, 0x1f, 0x7b, 0xd3, 0xc3, 0x7c, - 0x00, 0xe1, 0x57, 0x3e, 0xf4, 0x77, 0xff, 0x89, 0x6a, 0x7a, 0xdd, 0xc3, - 0xc0, 0x5d, 0xdb, 0xb4, 0x3d, 0xdf, 0x96, 0x6d, 0x81, 0x35, 0xe3, 0x90, - 0xd1, 0x83, 0xd7, 0x6f, 0xfe, 0x69, 0x6c, 0xf0, 0x3a, 0xd3, 0x04, 0xa4, - 0x66, 0xf9, 0x74, 0xea, 0x3a, 0x92, 0x1b, 0xab, 0xb1, 0xa7, 0x5b, 0x82, - 0xc1, 0xc9, 0x8e, 0x29, 0x77, 0x24, 0x4b, 0x69, 0x70, 0x03, 0xbc, 0x10, - 0xe2, 0x32, 0x02, 0xc0, 0xa7, 0x63, 0xe6, 0xec, 0xbb, 0xb7, 0xb1, 0xd0, - 0x6c, 0x99, 0xd2, 0x7f, 0x9a, 0x0a, 0x3c, 0x0e, 0x1d, 0x95, 0x2b, 0xe4, - 0x07, 0x0e, 0x03, 0xf4, 0x5f, 0x5c, 0xb3, 0x49, 0xd7, 0x9b, 0x84, 0x8c, - 0x4a, 0x19, 0xa8, 0x6f, 0xe0, 0x61, 0x72, 0x97, 0x2a, 0x44, 0x70, 0x44, - 0x21, 0x0d, 0xf2, 0x26, 0x2f, 0x8b, 0x32, 0x7e, 0x3c, 0x88, 0xfc, 0x8d, - 0x77, 0xff, 0xd2, 0xf2, 0xce, 0x6b, 0x1a, 0xb8, 0xfc, 0xbe, 0x7c, 0x99, - 0x3d, 0x93, 0x73, 0x97, 0x44, 0x4d, 0xb4, 0xf6, 0xca, 0xc2, 0x09, 0x31, - 0x5d, 0x31, 0xf5, 0x2b, 0x6e, 0x17, 0x14, 0xb0, 0x3f, 0x01, 0xdd, 0x15, - 0x7e, 0xa3, 0xdf, 0xc0, 0x8d, 0x15, 0x9e, 0x11, 0xdd, 0xb5, 0x10, 0xbe, - 0x24, 0xc1, 0x99, 0x91, 0xf7, 0xbb, 0x16, 0x9b, 0x51, 0x34, 0xe3, 0xb5, - 0x01, 0xe6, 0x55, 0xe1, 0x58, 0xda, 0x23, 0x50, 0x2b, 0x18, 0xad, 0xad, - 0xbc, 0x9a, 0xcc, 0xcf, 0x23, 0x82, 0x24, 0x99, 0x29, 0x5c, 0x91, 0x42, - 0xf4, 0xe4, 0x75, 0x76, 0x34, 0x63, 0x37, 0x1c, 0x00, 0xfd, 0x69, 0x92, - 0x28, 0xe6, 0x08, 0xc3, 0x7f, 0xdc, 0xb7, 0x82, 0xfc, 0x40, 0x16, 0xcb, - 0x7d, 0x95, 0x24, 0x9a, 0xc9, 0x45, 0xed, 0x65, 0x09, 0xae, 0xcd, 0xad, - 0x87, 0xce, 0x5e, 0x7b, 0xde, 0x11, 0xbc, 0x54, 0x28, 0xff, 0xdc, 0x97, - 0xb7, 0xa2, 0xf7, 0x09, 0x13, 0x90, 0xbc, 0x94, 0x5b, 0x41, 0xef, 0xc9, - 0x7c, 0x74, 0xa1, 0x6f, 0x6d, 0xbc, 0x27, 0x35, 0xa4, 0x6d, 0x0a, 0xff, - 0x1f, 0x41, 0x75, 0x1e, 0x13, 0xce, 0x8c, 0xf9, 0x3d, 0x2a, 0x63, 0x72, - 0x45, 0xcf, 0x38, 0x34, 0x7f, 0x78, 0xf0, 0x72, 0xfd, 0xa8, 0x17, 0xe8, - 0x0d, 0x94, 0xf4, 0x98, 0xff, 0x1a, 0x68, 0x15, 0x15, 0x16, 0x0b, 0x92, - 0x61, 0xbd, 0x49, 0x2a, 0x15, 0x9e, 0x37, 0x5a, 0x6a, 0x3a, 0x05, 0x50, - 0x0a, 0xec, 0x2a, 0xa2, 0x19, 0x74, 0x75, 0xf3, 0x8e, 0x51, 0xf4, 0x5d, - 0xb2, 0x67, 0xd1, 0x83, 0xf3, 0xc1, 0x9f, 0x5e, 0xb5, 0x6e, 0x7b, 0x36, - 0xd9, 0x75, 0x48, 0x47, 0xfb, 0xe4, 0x70, 0x11, 0x92, 0x7f, 0xf6, 0x16, - 0x55, 0x4f, 0x93, 0x1f, 0xfd, 0xd7, 0xdc, 0x1f, 0x30, 0xcb, 0xe4, 0x67, - 0x95, 0x5d, 0xfe, 0xbc, 0xaf, 0xb6, 0x7e, 0x97, 0x60, 0x26, 0xf5, 0x15, - 0xa4, 0xc7, 0x9c, 0x47, 0x1c, 0xd9, 0x76, 0x3b, 0x61, 0x46, 0x00, 0x0a, - 0xc2, 0x6b, 0xcb, 0xf3, 0xd6, 0x97, 0x2d, 0x28, 0xfc, 0x7f, 0xba, 0x99, - 0x9d, 0x57, 0xfc, 0xca, 0xca, 0x24, 0x0c, 0xe5, 0xd7, 0xc8, 0x85, 0x56, - 0x68, 0x1b, 0x89, 0x0f, 0x3d, 0xd4, 0x21, 0xce, 0x7c, 0xcf, 0x4c, 0x9d, - 0xae, 0x49, 0xc5, 0x4e, 0xff, 0x8c, 0xbb, 0x79, 0xd2, 0xa9, 0x10, 0x68, - 0xd3, 0x9c, 0xc8, 0xb3, 0x3d, 0x29, 0x10, 0x91, 0xc2, 0xcb, 0x35, 0xf0, - 0x04, 0x6b, 0x4f, 0x7e, 0x6b, 0x6d, 0x08, 0x93, 0x57, 0xe8, 0xdf, 0xb7, - 0x8a, 0xfc, 0xb5, 0xce, 0xe0, 0x05, 0x14, 0x0c, 0x56, 0xf2, 0xc7, 0x2f, - 0x3b, 0x57, 0x95, 0x27, 0x29, 0xbd, 0x53, 0x0b, 0x1a, 0x8a, 0x3c, 0xba, - 0x2b, 0xfd, 0x7b, 0xf5, 0x96, 0xa2, 0xc4, 0x26, 0xdd, 0x82, 0x2e, 0x54, - 0xcf, 0xe7, 0x57, 0x13, 0x8b, 0x7d, 0x15, 0x60, 0xfe, 0x64, 0x63, 0xb3, - 0xdc, 0xeb, 0x0d, 0x7f, 0xef, 0x9f, 0xca, 0x9d, 0xb1, 0xbd, 0x48, 0x7a, - 0x19, 0xfb, 0xc9, 0x45, 0x96, 0x45, 0xa2, 0x89, 0xe1, 0x51, 0xde, 0xc5, - 0xed, 0x38, 0xc0, 0x86, 0x21, 0xe3, 0x8a, 0xcd, 0x9f, 0xbc, 0xf1, 0x21, - 0x28, 0x23, 0x32, 0x70, 0xbe, 0x9a, 0xf7, 0xc4, 0x4e, 0x8f, 0xc5, 0x87, - 0x97, 0x00, 0xcc, 0x58, 0x83, 0x55, 0xb8, 0x0c, 0x53, 0x9c, 0x0c, 0xce, - 0x9e, 0x53, 0xad, 0xf6, 0x5b, 0x9e, 0x81, 0x5c, 0xd8, 0x1a, 0x4f, 0x57, - 0x9b, 0xf4, 0x5e, 0x28, 0x11, 0xbd, 0x79, 0xf2, 0x43, 0xae, 0x43, 0xce, - 0x0e, 0x3a, 0x11, 0x5b, 0x3c, 0xeb, 0x42, 0xee, 0xff, 0x2e, 0x1b, 0xb0, - 0xf1, 0x6a, 0x74, 0xae, 0x21, 0xea, 0xbe, 0x92, 0x81, 0x7c, 0xc4, 0x78, - 0x6e, 0x1c, 0x67, 0x5b, 0x47, 0xe0, 0x9a, 0x62, 0x67, 0x0f, 0x0a, 0x30, - 0x6b, 0x2c, 0xe2, 0x2b, 0x73, 0x73, 0x20, 0x6d, 0x0b, 0x87, 0x29, 0xe4, - 0xb1, 0x3c, 0xe7, 0x49, 0x42, 0x72, 0x8e, 0xca, 0x74, 0x88, 0xf4, 0x37, - 0xa6, 0xac, 0xf9, 0xc2, 0xfa, 0xa5, 0x7e, 0x64, 0xd5, 0xf1, 0x77, 0x9c, - 0x48, 0x68, 0xe7, 0x19, 0x0e, 0x5f, 0xb0, 0xd0, 0x57, 0xce, 0xee, 0x88, - 0x9c, 0xe1, 0xf7, 0xac, 0xb9, 0x9e, 0x71, 0x12, 0x6b, 0x34, 0xec, 0x68, - 0x51, 0xf5, 0xde, 0x76, 0xa3, 0xd5, 0x1d, 0x11, 0xa5, 0xe8, 0xb1, 0xdd, - 0x78, 0xc4, 0x42, 0x9f, 0x2a, 0x40, 0x8d, 0x79, 0xb6, 0x6d, 0x2f, 0x36, - 0xef, 0x85, 0x1c, 0x6e, 0x4b, 0x79, 0xf7, 0xb6, 0xf5, 0xc3, 0x03, 0xa7, - 0x86, 0x29, 0x43, 0xc8, 0xc8, 0x9e, 0xea, 0xb4, 0x48, 0x2a, 0xd6, 0x18, - 0xe5, 0x12, 0x39, 0x3b, 0xfc, 0xbd, 0x93, 0xa9, 0xb9, 0x2f, 0x5c, 0x3f, - 0x44, 0xd7, 0x8a, 0xbf, 0x9a, 0x21, 0x16, 0x58, 0x46, 0xc3, 0xc5, 0xf2, - 0x06, 0x4b, 0x9b, 0x64, 0x6a, 0x4f, 0x32, 0x5e, 0xbd, 0xee, 0x38, 0x3f, - 0x67, 0x84, 0xa2, 0xf2, 0x3e, 0x5a, 0x82, 0xeb, 0xf6, 0x04, 0x2a, 0x25, - 0x9c, 0xc8, 0xab, 0x5b, 0xec, 0x0f, 0xd1, 0x30, 0x6f, 0xde, 0x17, 0xcd, - 0xc6, 0x69, 0xb2, 0xfd, 0xa4, 0x15, 0xa9, 0x31, 0xee, 0xd6, 0x0d, 0x5b, - 0x67, 0xae, 0x8f, 0x38, 0xea, 0x36, 0xfd, 0xf0, 0xf7, 0xbf, 0x0f, 0xdf, - 0x6c, 0xfa, 0x3c, 0xf8, 0x75, 0xa4, 0xb9, 0x7f, 0xbc, 0x8d, 0x4f, 0x2e, - 0x1f, 0x06, 0x83, 0xdb, 0xff, 0xa6, 0x65, 0x6a, 0xbf, 0x3c, 0x78, 0x96, - 0x35, 0xaa, 0x7d, 0x20, 0x51, 0xa0, 0xe6, 0xd3, 0xf9, 0xf1, 0x08, 0x0e, - 0x79, 0xb9, 0xab, 0xbf, 0x57, 0x88, 0x4a, 0x9b, 0xc8, 0xcc, 0x19, 0xb6, - 0x6a, 0x90, 0xbc, 0x44, 0xbb, 0x67, 0xab, 0xb6, 0x07, 0xc8, 0xb6, 0x5c, - 0xd3, 0x75, 0xf2, 0x62, 0x9d, 0x18, 0x6d, 0xdf, 0x64, 0x0b, 0xfb, 0x49, - 0x10, 0x7c, 0x67, 0x97, 0x06, 0x4c, 0x79, 0x45, 0x36, 0xf9, 0x87, 0xa6, - 0xff, 0x7a, 0xd2, 0x76, 0xb5, 0xc1, 0xa9, 0x8f, 0x16, 0x30, 0xac, 0xd4, - 0x90, 0x26, 0xf7, 0x2d, 0x15, 0x7a, 0xeb, 0x1e, 0xbb, 0xa0, 0x24, 0xa3, - 0x5f, 0xb8, 0x0c, 0xbd, 0xe0, 0xca, 0xcd, 0xe8, 0x8f, 0x41, 0xce, 0xbc, - 0xdf, 0x97, 0x3b, 0x3d, 0x1c, 0xd4, 0xed, 0x12, 0x2a, 0x6b, 0xa6, 0x40, - 0xd9, 0x25, 0x41, 0x25, 0x2e, 0x09, 0x83, 0x0d, 0xef, 0x15, 0x74, 0x5b, - 0xf1, 0x2a, 0xf4, 0x7c, 0x5d, 0x97, 0x4d, 0xa8, 0x6f, 0x10, 0x08, 0x14, - 0xc0, 0x7f, 0x1c, 0x53, 0xf9, 0x9c, 0x68, 0x74, 0x8e, 0x52, 0xef, 0x32, - 0x86, 0x96, 0xaa, 0x60, 0x73, 0x9d, 0x77, 0x3e, 0x37, 0xba, 0x09, 0x99, - 0xf0, 0xe9, 0xda, 0x9f, 0x9f, 0xaa, 0xac, 0x91, 0xc8, 0x46, 0xd4, 0xc0, - 0x77, 0x67, 0x1a, 0x42, 0xa0, 0x76, 0xe4, 0xf8, 0x2d, 0x75, 0x07, 0xa2, - 0xee, 0xc3, 0xc9, 0x51, 0x11, 0x56, 0xd7, 0xfe, 0x37, 0x7c, 0x94, 0xce, - 0x2e, 0x90, 0x6a, 0x10, 0xcf, 0x71, 0xcc, 0xbc, 0xf8, 0x06, 0xe2, 0x37, - 0x6a, 0x20, 0x2d, 0xd6, 0xb3, 0xec, 0x78, 0x82, 0xbe, 0x71, 0x39, 0xe7, - 0xc7, 0xf6, 0x79, 0xa3, 0x95, 0x98, 0x31, 0x06, 0x26, 0x0e, 0xb7, 0x9f, - 0x2c, 0x2f, 0xe5, 0x82, 0x48, 0x1b, 0x2c, 0x57, 0x2a, 0xcf, 0x15, 0xb3, - 0xcc, 0xca, 0x8e, 0x6e, 0x20, 0x8a, 0x9c, 0x0e, 0xf7, 0x9d, 0x63, 0x4e, - 0x81, 0x9a, 0xfa, 0xbf, 0x61, 0x3d, 0x4c, 0xeb, 0x11, 0xd2, 0x02, 0x09, - 0x5a, 0xdf, 0xd4, 0x29, 0xdb, 0xdc, 0xcf, 0x66, 0x32, 0x58, 0x4c, 0x66, - 0x5d, 0x5c, 0xd7, 0xa5, 0xee, 0xcd, 0x12, 0xef, 0xc7, 0x5c, 0xfd, 0x02, - 0xad, 0x9e, 0xec, 0x4a, 0x9a, 0xde, 0x07, 0xdd, 0x94, 0x73, 0x2f, 0x81, - 0x87, 0x03, 0x7a, 0x4c, 0x8c, 0x43, 0xe9, 0x96, 0xa5, 0x87, 0xa6, 0xc1, - 0x61, 0xa5, 0x75, 0x90, 0x38, 0x60, 0x75, 0x7b, 0xca, 0xb7, 0xcb, 0x67, - 0x36, 0xa7, 0x9c, 0xd0, 0x8d, 0x92, 0xc8, 0xe3, 0x13, 0x54, 0x80, 0x45, - 0x2b, 0x7d, 0xc3, 0x75, 0x9c, 0xc3, 0xb9, 0x54, 0xc5, 0x5f, 0x2f, 0xd4, - 0xaf, 0x94, 0x46, 0x65, 0x1c, 0xc1, 0x6e, 0x93, 0xc6, 0x51, 0xed, 0x84, - 0xdb, 0x23, 0x50, 0xe9, 0x51, 0x02, 0x83, 0x3f, 0x90, 0xc8, 0x64, 0xbf, - 0x17, 0x30, 0xcd, 0x7e, 0xee, 0x39, 0x27, 0x3b, 0xb3, 0x11, 0x7e, 0x18, - 0x70, 0xa3, 0xf7, 0x02, 0x0b, 0xe1, 0xdf, 0xf0, 0xb8, 0xec, 0x52, 0x5b, - 0x27, 0x51, 0x0c, 0xe8, 0x4b, 0x00, 0x1f, 0x89, 0x76, 0xb8, 0xcf, 0x83, - 0x8d, 0x55, 0x47, 0x57, 0xcf, 0x41, 0x6f, 0xc7, 0x46, 0xe9, 0x9c, 0xc2, - 0xad, 0x43, 0xc2, 0xfc, 0x13, 0xc2, 0x96, 0x42, 0xa5, 0x10, 0xd5, 0x49, - 0x12, 0xb7, 0x82, 0xd5, 0xa5, 0x0d, 0x7c, 0x21, 0xce, 0x2a, 0xa0, 0x88, - 0xbd, 0x64, 0x9f, 0xf4, 0xd8, 0x0d, 0xba, 0x90, 0x13, 0x61, 0xc9, 0x2f, - 0xa5, 0xe0, 0xdd, 0xeb, 0xbc, 0xab, 0xb3, 0x52, 0x07, 0xde, 0xd5, 0x1a, - 0x8a, 0xc6, 0xd5, 0x93, 0xc0, 0xb8, 0xc4, 0x23, 0x88, 0x20, 0xbe, 0xf0, - 0x4f, 0xee, 0xcf, 0x5f, 0xf7, 0x56, 0x1b, 0xb2, 0x75, 0xd1, 0xb9, 0x8f, - 0x68, 0xda, 0xe9, 0x08, 0x1d, 0x53, 0x5b, 0xf8, 0x18, 0xe7, 0xf8, 0xbd, - 0xa0, 0xdd, 0x18, 0xa2, 0x55, 0x6b, 0x32, 0xa4, 0x8e, 0xe0, 0x57, 0x19, - 0x0f, 0x2f, 0x05, 0xf8, 0xff, 0xd2, 0xcd, 0x5b, 0xa1, 0x56, 0x06, 0xa6, - 0x20, 0xb8, 0xb0, 0xaf, 0xcf, 0x2a, 0x8d, 0x1b, 0x1a, 0xfd, 0x56, 0xed, - 0xed, 0xab, 0xc3, 0x51, 0xfc, 0x66, 0x47, 0x2f, 0x37, 0x0d, 0x16, 0xf4, - 0xce, 0x35, 0x42, 0x30, 0xc5, 0x16, 0x93, 0x9a, 0x8b, 0x37, 0x20, 0x9d, - 0xa1, 0xe4, 0x82, 0xbf, 0x48, 0xb2, 0x71, 0x56, 0xd9, 0xba, 0xd3, 0x19, - 0xea, 0xe9, 0x13, 0xea, 0x5c, 0xc4, 0x62, 0x5b, 0x43, 0xc6, 0x87, 0xe8, - 0xe9, 0x00, 0xc2, 0x2b, 0x9c, 0xa5, 0x54, 0xec, 0xa6, 0xd5, 0x9a, 0x05, - 0x8c, 0x51, 0x34, 0x00, 0x81, 0x96, 0x8c, 0x14, 0xec, 0x0a, 0x28, 0x1b, - 0x96, 0x1c, 0xf2, 0x1b, 0x0d, 0xc0, 0xb3, 0x65, 0x5b, 0xc6, 0xeb, 0x79, - 0x84, 0xc1, 0x6c, 0x17, 0x7a, 0xaa, 0xde, 0x1d, 0x3b, 0xa3, 0x23, 0x1c, - 0xdb, 0x51, 0xf4, 0x70, 0x88, 0x90, 0xe9, 0x68, 0xa6, 0x53, 0x4c, 0xe2, - 0x65, 0xca, 0xac, 0x65, 0xd7, 0xe9, 0x7c, 0x8c, 0xea, 0x35, 0x88, 0x1e, - 0xfc, 0x9b, 0xaf, 0xa8, 0x55, 0x93, 0x8b, 0xd7, 0x7a, 0x36, 0x58, 0xee, - 0x55, 0xa0, 0xf5, 0xad, 0x04, 0xa4, 0xa6, 0xa1, 0x4d, 0x89, 0xa5, 0x9b, - 0x27, 0xac, 0xbe, 0x29, 0x45, 0xf0, 0xda, 0x87, 0xa8, 0x07, 0xa1, 0x34, - 0xbf, 0xa3, 0xc5, 0xbf, 0xf2, 0x58, 0x85, 0x98, 0xaf, 0xba, 0x12, 0x53, - 0x09, 0xd7, 0x57, 0x7e, 0xb7, 0xfa, 0x7c, 0xa6, 0xc1, 0x51, 0xa0, 0x98, - 0xc6, 0xc9, 0x4f, 0x95, 0x2b, 0xa2, 0x6f, 0x4b, 0xd1, 0x84, 0xa4, 0x75, - 0xbd, 0x87, 0x23, 0x76, 0xa5, 0x80, 0x63, 0xfa, 0xc9, 0x04, 0x0d, 0x94, - 0x1b, 0x54, 0x82, 0x73, 0x33, 0x19, 0x30, 0x1f, 0x6a, 0x37, 0x16, 0x0c, - 0x6e, 0x15, 0xf6, 0x79, 0xd8, 0x14, 0x03, 0xd5, 0x2d, 0xf1, 0x8b, 0x98, - 0x10, 0x28, 0xb3, 0xf1, 0xec, 0xe7, 0x1e, 0x5d, 0x63, 0xc5, 0xac, 0x01, - 0xa1, 0x9f, 0xb1, 0x04, 0xd3, 0xe3, 0x48, 0x3c, 0x98, 0x4f, 0x90, 0x50, - 0xe1, 0x2f, 0xf5, 0x11, 0x89, 0xcd, 0xad, 0x5c, 0x5a, 0xbc, 0x34, 0xab, - 0x27, 0x88, 0x84, 0x86, 0x71, 0x94, 0xb2, 0x39, 0xa5, 0x60, 0x8a, 0x02, - 0xef, 0x48, 0x30, 0xcd, 0xe0, 0x34, 0xef, 0x54, 0x73, 0x6b, 0xbe, 0x6a, - 0xa1, 0x64, 0x74, 0x11, 0xa0, 0xb4, 0x2e, 0x73, 0x10, 0x54, 0xf5, 0x07, - 0x71, 0x16, 0x3a, 0x40, 0xe3, 0x9a, 0x16, 0x65, 0xe6, 0xca, 0xd2, 0xef, - 0xd6, 0xf6, 0xa4, 0x95, 0x1f, 0x69, 0xe0, 0x08, 0x25, 0xd2, 0x99, 0x0c, - 0x43, 0xda, 0x77, 0x4a, 0x9c, 0x72, 0xa4, 0x4c, 0x4d, 0x1c, 0x60, 0xee, - 0x92, 0x89, 0xd2, 0x55, 0x01, 0x17, 0xf2, 0xaa, 0x1b, 0x71, 0x63, 0x4c, - 0xf5, 0x66, 0xfe, 0x60, 0x4f, 0xd8, 0x76, 0xf4, 0xd8, 0xaa, 0x03, 0x02, - 0xcd, 0xb0, 0xc1, 0x8a, 0xa7, 0x97, 0x8d, 0xc5, 0x1d, 0xed, 0x17, 0xc6, - 0x0c, 0xb1, 0xc9, 0x44, 0x05, 0xa3, 0x5f, 0x50, 0x62, 0x44, 0x8b, 0xb1, - 0x4b, 0x28, 0x97, 0xee, 0xb1, 0x23, 0xb7, 0x25, 0x78, 0xe9, 0x73, 0x06, - 0x3e, 0x6a, 0x8e, 0x0b, 0x6c, 0xca, 0x45, 0x35, 0xca, 0x79, 0x83, 0xbf, - 0x37, 0x9b, 0x1e, 0xc5, 0x02, 0xa1, 0x2b, 0x99, 0x94, 0xdd, 0xca, 0x28, - 0xff, 0x0e, 0xd8, 0xc7, 0x73, 0xe3, 0x6e, 0x6a, 0x70, 0x75, 0x01, 0x34, - 0x64, 0x1f, 0x25, 0x64, 0x65, 0x85, 0xe7, 0x11, 0xaf, 0xe1, 0xef, 0x5d, - 0xe3, 0x1c, 0x48, 0x06, 0x56, 0x6d, 0x5f, 0x20, 0xae, 0x8c, 0x8d, 0xc5, - 0x69, 0x56, 0xbf, 0x2f, 0xfa, 0xc3, 0xc0, 0xe6, 0xdf, 0xa1, 0xd8, 0x70, - 0x42, 0x86, 0xf5, 0xe0, 0x45, 0x87, 0x49, 0x37, 0x61, 0x7b, 0xf7, 0xc1, - 0xc3, 0x45, 0x62, 0xb1, 0xc6, 0x44, 0x1a, 0xb1, 0x5f, 0xcf, 0x47, 0xa0, - 0x26, 0x5c, 0xf8, 0x71, 0x79, 0x78, 0x67, 0x6f, 0xc3, 0x5f, 0x74, 0xe5, - 0x3a, 0x07, 0x0e, 0x9b, 0xe8, 0x71, 0xcf, 0xea, 0x36, 0x9c, 0x36, 0x57, - 0x43, 0x6d, 0x64, 0x17, 0xcf, 0xa6, 0xd6, 0x0c, 0x52, 0xcd, 0x67, 0x34, - 0x72, 0x7f, 0x51, 0xdc, 0x54, 0xc6, 0x61, 0x92, 0xc1, 0x07, 0x76, 0x68, - 0xf3, 0xf8, 0x0e, 0x22, 0x42, 0x59, 0xc6, 0xff, 0xe1, 0x2b, 0xc2, 0x68, - 0xee, 0x16, 0x4e, 0x09, 0x45, 0x09, 0x34, 0xde, 0xee, 0xd9, 0x6f, 0xdc, - 0x08, 0x35, 0x12, 0x93, 0x3e, 0xcc, 0x48, 0x9d, 0x27, 0x81, 0xc8, 0xa7, - 0x27, 0x05, 0x5b, 0x0e, 0x48, 0x52, 0x2b, 0xd4, 0xdd, 0x70, 0x8b, 0x74, - 0xf0, 0x62, 0x5e, 0x3f, 0x8c, 0x49, 0xec, 0x7e, 0x62, 0x5c, 0x62, 0x5b, - 0x6e, 0xe9, 0x4e, 0xc5, 0xd6, 0x88, 0x42, 0x20, 0xde, 0xc5, 0xc2, 0x88, - 0x2b, 0x45, 0xf4, 0xee, 0xb9, 0xe1, 0x75, 0xf3, 0xcd, 0x02, 0x6b, 0xa8, - 0x7a, 0xff, 0xd2, 0x31, 0xab, 0xc6, 0x92, 0xb0, 0x74, 0xf0, 0x1d, 0xb6, - 0x1d, 0xed, 0x2d, 0x5b, 0xc8, 0x29, 0x13, 0xad, 0x3a, 0x3f, 0xca, 0xd6, - 0x0d, 0x70, 0x13, 0x12, 0xff, 0x08, 0x71, 0x7a, 0x1d, 0xaa, 0xbd, 0x38, - 0x65, 0x1b, 0xcb, 0x66, 0x92, 0xfa, 0x93, 0x5f, 0x44, 0x5d, 0xcd, 0x42, - 0x67, 0xbc, 0x4a, 0xdf, 0xd5, 0x83, 0xe6, 0x94, 0xc9, 0x29, 0x55, 0x12, - 0x3d, 0xe3, 0xf9, 0xa7, 0x33, 0x4a, 0xbe, 0xd1, 0x69, 0x45, 0xc5, 0xbc, - 0x53, 0x0d, 0x89, 0xd6, 0x52, 0xf7, 0x39, 0x02, 0x0e, 0x36, 0x6d, 0x93, - 0x64, 0x4f, 0xb8, 0x0e, 0xb1, 0xe3, 0x01, 0x07, 0xcc, 0xbd, 0xc8, 0x43, - 0xf8, 0x7e, 0xd3, 0xc7, 0xa7, 0xdc, 0x9d, 0x71, 0x80, 0xf5, 0x4d, 0x3d, - 0x49, 0x22, 0x22, 0x32, 0x64, 0x1c, 0xa7, 0xd9, 0x27, 0x90, 0x1d, 0xb3, - 0xb1, 0x72, 0x8c, 0xd1, 0x3b, 0xb1, 0xdf, 0x18, 0xed, 0xee, 0x1f, 0x2b, - 0x23, 0x80, 0x9b, 0xaa, 0xfa, 0x44, 0xac, 0x87, 0x71, 0xbd, 0x55, 0xff, - 0xa9, 0xce, 0xc0, 0xd8, 0x1f, 0xc8, 0x41, 0x64, 0xdf, 0x68, 0xcf, 0xad, - 0x12, 0x87, 0x7f, 0xdd, 0x39, 0xbd, 0xc1, 0x0f, 0x55, 0x79, 0xc2, 0xe9, - 0x49, 0xe3, 0xbc, 0xf5, 0x2f, 0xf2, 0xdf, 0x29, 0xad, 0x19, 0x1e, 0x32, - 0xbe, 0x54, 0xbe, 0x4e, 0xb1, 0x2b, 0x52, 0x1b, 0x3c, 0x95, 0xe5, 0x80, - 0x60, 0x28, 0xb6, 0xab, 0x4a, 0xf0, 0xb5, 0xe4, 0x32, 0x2c, 0xb8, 0x43, - 0xc2, 0x2b, 0x06, 0xb6, 0xdf, 0x9e, 0xc2, 0x6d, 0x5f, 0x30, 0xc8, 0x6f, - 0xef, 0xc1, 0xc7, 0x23, 0x49, 0x05, 0x53, 0xb5, 0x6a, 0x67, 0xaa, 0xc5, - 0x57, 0x78, 0x81, 0xde, 0xff, 0x47, 0x67, 0xb8, 0x8d, 0x2f, 0x71, 0x5f, - 0xe6, 0x5a, 0xcb, 0x5e, 0x10, 0x9c, 0xaa, 0x76, 0x26, 0x9d, 0x20, 0x73, - 0xda, 0x0e, 0x0a, 0x28, 0x77, 0xc2, 0x0d, 0xf7, 0x7f, 0xf4, 0x51, 0x94, - 0x9c, 0xd8, 0x41, 0x0e, 0xff, 0x9a, 0x9d, 0x1e, 0x77, 0xd8, 0xc6, 0xfd, - 0xdf, 0xa4, 0x70, 0xfa, 0xcb, 0x68, 0x0b, 0x6a, 0xe3, 0x7c, 0x27, 0x20, - 0xd2, 0x25, 0xae, 0x2c, 0x46, 0x65, 0xa5, 0xad, 0x3f, 0x77, 0x2a, 0x39, - 0xd7, 0x44, 0x45, 0xc7, 0x5a, 0x2b, 0xbe, 0x4d, 0xd8, 0xcd, 0x69, 0x44, - 0xdf, 0xc7, 0xe5, 0xb5, 0x79, 0x03, 0xa4, 0x67, 0x63, 0x7e, 0xc2, 0xc5, - 0xe1, 0xa7, 0x72, 0xe3, 0x2f, 0x8e, 0x80, 0x65, 0x22, 0x61, 0x02, 0x15, - 0x2f, 0xa4, 0x01, 0xf6, 0x1c, 0x71, 0x9b, 0xac, 0xda, 0x36, 0xf4, 0xb5, - 0x7d, 0x70, 0x8f, 0x9c, 0x29, 0x66, 0x43, 0xca, 0x86, 0x43, 0xfa, 0x6c, - 0xbb, 0x62, 0xed, 0xdf, 0xc2, 0xf2, 0x0f, 0xef, 0xab, 0xae, 0xdd, 0x9c, - 0x09, 0x57, 0x25, 0x46, 0x6b, 0x9d, 0x60, 0x9f, 0xb4, 0xcd, 0xcd, 0x7b, - 0x6e, 0x26, 0x09, 0x36, 0xb0, 0xb4, 0xf6, 0xbc, 0x53, 0x6e, 0x41, 0xf8, - 0x72, 0x1a, 0xc3, 0xfc, 0x97, 0x25, 0xf1, 0x8e, 0x6c, 0xde, 0xf6, 0x61, - 0x9f, 0xe9, 0xe4, 0x99, 0x3f, 0x60, 0xf6, 0xc2, 0x13, 0x3c, 0x16, 0x7c, - 0xdb, 0x54, 0x54, 0x2c, 0x66, 0xe0, 0x5a, 0x13, 0xfd, 0x18, 0x98, 0x86, - 0xf6, 0x6b, 0xcc, 0x63, 0x49, 0x7d, 0x15, 0x51, 0x2d, 0x7b, 0xd7, 0x24, - 0x55, 0xf1, 0xbe, 0xbe, 0xde, 0x7a, 0xa6, 0x7b, 0x6e, 0xf9, 0x2c, 0x49, - 0xf0, 0xeb, 0x39, 0xd8, 0x27, 0xf8, 0x40, 0x66, 0x80, 0x6a, 0x8b, 0xa0, - 0x8e, 0x5e, 0xfa, 0x95, 0xb1, 0x91, 0x1d, 0xa7, 0x8e, 0x01, 0x89, 0x75, - 0xfd, 0x7b, 0x07, 0x8b, 0x95, 0xf6, 0x3c, 0xd3, 0x5c, 0xc5, 0xb4, 0xfa, - 0x53, 0x4c, 0xc7, 0x9b, 0xfe, 0x5b, 0x43, 0x01, 0x02, 0x1c, 0x22, 0xe8, - 0x79, 0x44, 0x00, 0x39, 0x30, 0xb2, 0x2f, 0x00, 0x7c, 0x80, 0x04, 0xa1, - 0xd6, 0x30, 0xf4, 0xd6, 0x5e, 0xb1, 0x36, 0x0c, 0x52, 0x8c, 0x7c, 0xbf, - 0xd4, 0xff, 0xa3, 0x70, 0x1b, 0x2f, 0xab, 0x38, 0xe1, 0xf1, 0xeb, 0xbe, - 0xa4, 0xd0, 0x49, 0x79, 0x7f, 0xbb, 0x51, 0x65, 0x5c, 0x14, 0x85, 0xc9, - 0x88, 0xc7, 0x72, 0x3d, 0xac, 0xfb, 0xbe, 0xc7, 0xc7, 0xb4, 0x14, 0x7c, - 0x54, 0xc6, 0x08, 0x92, 0x23, 0x57, 0x49, 0xdb, 0x34, 0x2d, 0xfe, 0x1c, - 0xf2, 0xb7, 0x7c, 0xbd, 0x55, 0xe6, 0xaa, 0xc8, 0x89, 0xd2, 0xe2, 0xb9, - 0x56, 0x16, 0x17, 0x24, 0x65, 0x2f, 0x48, 0x6b, 0x94, 0xf9, 0xb2, 0x88, - 0x2a, 0x63, 0x9a, 0xda, 0x2c, 0x10, 0xbf, 0x5e, 0x1e, 0xa2, 0x48, 0x61, - 0x7d, 0x08, 0x39, 0x0f, 0x2f, 0xcb, 0xe9, 0xbc, 0xa4, 0x04, 0xf3, 0x55, - 0x7a, 0xf0, 0x3b, 0xfb, 0x5e, 0x6f, 0xdc, 0x48, 0x1c, 0x31, 0x64, 0x7d, - 0x49, 0xea, 0x3f, 0xeb, 0xb5, 0x0a, 0xf5, 0x5d, 0x92, 0x5a, 0x28, 0x37, - 0x4a, 0x70, 0x50, 0xc8, 0xe5, 0xf0, 0x5d, 0xe4, 0xc7, 0xfa, 0xea, 0x4a, - 0x84, 0xbf, 0x6c, 0x53, 0xe2, 0x12, 0xe9, 0x6b, 0x72, 0xe6, 0xa5, 0x92, - 0x08, 0x06, 0xf3, 0x3e, 0x35, 0xbb, 0x3f, 0x50, 0x6f, 0xa9, 0xfd, 0x6f, - 0xf1, 0x1f, 0x36, 0x07, 0xf5, 0x48, 0x46, 0x31, 0xaa, 0x95, 0x47, 0x21, - 0x46, 0xe5, 0xad, 0x8c, 0xc2, 0x32, 0xcf, 0x70, 0xad, 0xd4, 0x03, 0x8d, - 0x97, 0x7d, 0x05, 0x66, 0x10, 0x31, 0x5d, 0xd7, 0xcd, 0x5a, 0x1d, 0xbf, - 0xab, 0xec, 0x6b, 0x49, 0x49, 0xa1, 0x98, 0x89, 0x1a, 0x8f, 0x6b, 0x59, - 0x70, 0xca, 0x06, 0xd3, 0x46, 0x79, 0x1e, 0x0a, 0xc1, 0x3a, 0xb5, 0x0b, - 0xe7, 0x26, 0x93, 0x50, 0x32, 0x7c, 0x95, 0xc1, 0x25, 0xbf, 0x3e, 0xa8, - 0x43, 0x3d, 0x75, 0x4a, 0x9c, 0x72, 0xa4, 0x4c, 0x4d, 0x1c, 0x60, 0xee, - 0x92, 0x89, 0xd2, 0x55, 0xba, 0x0c, 0x33, 0xef, 0x0e, 0xc9, 0xf4, 0x73, - 0x7f, 0x0e, 0x4a, 0xf0, 0x57, 0xfa, 0xe3, 0x3d, 0x2d, 0x75, 0x1d, 0x8b, - 0x74, 0x81, 0x53, 0xdd, 0x24, 0xf7, 0x07, 0x96, 0xe2, 0x77, 0x81, 0x03, - 0xda, 0x73, 0x0c, 0x8f, 0x73, 0x4c, 0x72, 0x50, 0x61, 0xc7, 0xc3, 0xc0, - 0x6b, 0xad, 0xaa, 0xb6, 0x18, 0xb3, 0xa1, 0xb0, 0xe5, 0x1c, 0xc1, 0x10, - 0xd4, 0xa5, 0x23, 0xaf, 0xf4, 0x27, 0x62, 0x4b, 0xc3, 0x8b, 0xbc, 0x18, - 0x25, 0xd1, 0x35, 0x7e, 0x70, 0x40, 0x5a, 0xff, 0x93, 0x0b, 0x35, 0xaa, - 0x4d, 0x8c, 0xef, 0x28, 0x97, 0x75, 0xb2, 0x7d, 0xbf, 0x6d, 0x95, 0xff, - 0x85, 0xba, 0x1d, 0x33, 0xc9, 0xdd, 0xb8, 0xe6, 0x39, 0x88, 0x93, 0x48, - 0x99, 0x86, 0x40, 0xc2, 0xab, 0x62, 0xb8, 0x22, 0x60, 0x13, 0xd2, 0xd8, - 0x22, 0x2f, 0xba, 0x33, 0xab, 0x2d, 0x21, 0xe0, 0xb0, 0xdd, 0xfb, 0x65, - 0x7d, 0x09, 0x9a, 0xb1, 0x5f, 0xcb, 0x02, 0x97, 0x77, 0x18, 0x4f, 0xd4, - 0xb1, 0x97, 0xca, 0xf0, 0x4f, 0xb3, 0x30, 0xdb, 0xe8, 0x97, 0x11, 0xd2, - 0xb1, 0xee, 0x6c, 0xb3, 0x55, 0x2f, 0xb6, 0x68, 0x9b, 0x8c, 0x62, 0x55, - 0x1b, 0x5c, 0x2a, 0xdb, 0xdc, 0x6f, 0xa1, 0x6a, 0x39, 0xd3, 0x47, 0x25, - 0x69, 0xab, 0xbd, 0xea, 0x22, 0xba, 0x37, 0xb3, 0x04, 0x59, 0x89, 0x38, - 0x7b, 0x1e, 0x22, 0x60, 0x5e, 0xec, 0x07, 0xb5, 0x4c, 0x0f, 0xf8, 0xba, - 0xb6, 0xce, 0xef, 0xf5, 0xef, 0x18, 0xca, 0xeb, 0x7a, 0x9f, 0x8c, 0x32, - 0x9d, 0x78, 0xf3, 0xec, 0x2a, 0x2c, 0x9e, 0x81, 0x3b, 0xcb, 0x64, 0x04, - 0x0e, 0xf9, 0x7c, 0x8a, 0xcd, 0x49, 0x35, 0xae, 0x90, 0x00, 0x56, 0xbe, - 0x75, 0x5d, 0x48, 0xd6, 0xee, 0x3b, 0x14, 0x0a, 0x8a, 0x9b, 0xaa, 0x28, - 0x47, 0xe7, 0xdb, 0xc1, 0x25, 0x85, 0xc3, 0x1a, 0x5e, 0x02, 0x5d, 0x14, - 0xf3, 0x8c, 0xdd, 0xe0, 0x1e, 0x41, 0xaa, 0x91, 0x89, 0x52, 0xfb, 0x55, - 0xaf, 0xa7, 0xd4, 0x13, 0xb4, 0x70, 0x78, 0x46, 0xf1, 0xe4, 0x83, 0xf5, - 0x7d, 0xdd, 0x06, 0xf0, 0xbb, 0x18, 0x63, 0xb3, 0x2c, 0xc1, 0x3b, 0xf4, - 0xd6, 0x29, 0x0e, 0x78, 0x80, 0xfe, 0xb8, 0xe2, 0x9c, 0x8d, 0x59, 0x8f, - 0x61, 0x97, 0xbe, 0xe8, 0x58, 0x8d, 0xd0, 0xf4, 0xa5, 0x5a, 0xab, 0x3c, - 0x45, 0x82, 0xc9, 0xa6, 0x6e, 0xdf, 0xeb, 0xbf, 0x4a, 0x91, 0xa2, 0xf1, - 0xfd, 0x0c, 0xe7, 0x8d, 0x40, 0xd4, 0xac, 0x4a, 0x03, 0x05, 0x93, 0x48, - 0x8e, 0x81, 0x7e, 0x02, 0xf6, 0x2b, 0x03, 0x07, 0x51, 0x52, 0xb4, 0x19, - 0x77, 0xab, 0x23, 0x15, 0x80, 0x5f, 0x7f, 0x7c, 0xa9, 0x2e, 0x90, 0x94, - 0x9b, 0xbd, 0x0f, 0xa1, 0x33, 0x5b, 0x4c, 0x99, 0xab, 0xa0, 0xe3, 0xa5, - 0x48, 0xd3, 0x7b, 0xf9, 0xef, 0xc8, 0x2a, 0xb6, 0x8a, 0xc3, 0xec, 0x17, - 0xb6, 0x54, 0x5e, 0x2c, 0xc1, 0xbe, 0x8e, 0x1e, 0xb6, 0xab, 0x97, 0xa9, - 0x05, 0xe9, 0x13, 0x41, 0xb3, 0xb1, 0x68, 0xe5, 0x16, 0xf6, 0xef, 0xc5, - 0xfb, 0x5c, 0x54, 0xef, 0xec, 0x46, 0xe0, 0xf7, 0xd9, 0x64, 0x53, 0x53, - 0xe0, 0xed, 0x80, 0xf2, 0x37, 0xcb, 0x9f, 0xb6, 0xf5, 0xf7, 0x1a, 0xa5, - 0x45, 0x7c, 0xcc, 0x43, 0xee, 0x8c, 0x8d, 0x7e, 0x6a, 0xc4, 0x4d, 0x90, - 0x9f, 0x89, 0xf4, 0x2e, 0xba, 0xd0, 0xe6, 0x87, 0x2c, 0xb3, 0xe4, 0x48, - 0xa7, 0x5f, 0xf9, 0x7f, 0x78, 0xba, 0x98, 0x1b, 0x45, 0x28, 0x5d, 0x0a, - 0xcf, 0x8b, 0xaf, 0xae, 0x53, 0xb8, 0x37, 0xd9, 0x05, 0x93, 0x1a, 0xc5, - 0xb9, 0x40, 0x37, 0x95, 0xb1, 0x4a, 0xca, 0x0d, 0xb0, 0x04, 0x8c, 0xfd, - 0xf6, 0x8a, 0x31, 0xea, 0x4f, 0xd1, 0xd9, 0xae, 0x81, 0xae, 0xfe, 0x51, - 0x85, 0x27, 0xca, 0xee, 0x75, 0xbd, 0x8f, 0xe2, 0xeb, 0x66, 0xc4, 0xcc, - 0x23, 0xb3, 0xfa, 0xde, 0xf5, 0xe4, 0x45, 0x13, 0xd8, 0x7c, 0x95, 0x90, - 0x40, 0x49, 0x84, 0xc0, 0x0e, 0x6f, 0x60, 0xf0, 0x6d, 0x03, 0x74, 0xc2, - 0x8e, 0x77, 0x55, 0xaa, 0x76, 0xb1, 0x50, 0x9a, 0xec, 0x9d, 0x08, 0xdd, - 0x2a, 0xe4, 0xb0, 0x2b, 0xc8, 0x9e, 0x1e, 0x1d, 0xb8, 0x77, 0x97, 0x54, - 0x1c, 0xca, 0x2c, 0x93, 0xc6, 0x91, 0xf7, 0xd0, 0xb4, 0x7e, 0x43, 0xc9, - 0x6d, 0xe0, 0xa6, 0xb5, 0xd5, 0xe9, 0x42, 0x9f, 0x5b, 0x3a, 0x2d, 0x75, - 0xc1, 0x2f, 0xb3, 0xfc, 0x5f, 0xb9, 0x48, 0x21, 0x34, 0x80, 0xdc, 0xd1, - 0x29, 0x21, 0x6d, 0x48, 0x92, 0xfd, 0x61, 0x56, 0xe4, 0xf6, 0x34, 0xf3, - 0xf9, 0xfd, 0xef, 0xcb, 0x31, 0x80, 0x53, 0xd1, 0x60, 0x0e, 0x2c, 0x7c, - 0xaf, 0x08, 0xab, 0x76, 0xe1, 0x24, 0x50, 0xf3, 0x26, 0x68, 0xcf, 0x69, - 0x68, 0x86, 0xa8, 0xa5, 0x96, 0xde, 0xc1, 0x37, 0xd6, 0xe8, 0x3c, 0x54, - 0x09, 0xdb, 0x94, 0xdd, 0xe2, 0xb7, 0xe0, 0x14, 0x8f, 0xf3, 0x9e, 0x9b, - 0xa0, 0x73, 0x74, 0x87, 0x13, 0xed, 0xdb, 0x8c, 0xbb, 0x7d, 0xf8, 0xd7, - 0x81, 0x0f, 0x43, 0xe3, 0x60, 0x7b, 0xe4, 0xe8, 0xe9, 0x15, 0x25, 0xf2, - 0x5e, 0x59, 0xb4, 0x40, 0xf9, 0x21, 0xb6, 0x01, 0x57, 0x49, 0x78, 0xdd, - 0xa0, 0x0f, 0x0b, 0xc5, 0xac, 0x73, 0x2d, 0xac, 0x21, 0xe1, 0xd3, 0x60, - 0x45, 0xc3, 0xce, 0x30, 0x1a, 0x8f, 0xf4, 0x79, 0x30, 0x01, 0x61, 0xc3, - 0xce, 0x16, 0xc0, 0x64, 0x60, 0xa7, 0xb1, 0xc2, 0x26, 0x95, 0x74, 0xbf, - 0xec, 0x9a, 0x04, 0xb1, 0xcb, 0x0e, 0x4a, 0x12, 0xea, 0x01, 0x7f, 0x2f, - 0xdd, 0xf6, 0xfe, 0x51, 0x06, 0x2f, 0xf0, 0x78, 0x62, 0xa7, 0x60, 0x52, - 0x91, 0x46, 0xcb, 0x1a, 0x1b, 0x4f, 0x0a, 0x20, 0x34, 0x7b, 0x2c, 0xf4, - 0x25, 0xb3, 0x31, 0x53, 0x26, 0x67, 0x78, 0x64, 0xc7, 0x8a, 0x85, 0x0b, - 0xa5, 0x06, 0x36, 0x8b, 0x9e, 0x34, 0x9c, 0x1f, 0xb1, 0xce, 0xb1, 0x47, - 0xc1, 0x7d, 0xb5, 0x69, 0xbb, 0xe6, 0x61, 0xef, 0xa3, 0x4f, 0x3c, 0x1e, - 0x03, 0x55, 0x42, 0x65, 0xa4, 0x17, 0x10, 0x1a, 0x71, 0xe1, 0x1d, 0x75, - 0xa3, 0xde, 0xbb, 0x2c, 0xc6, 0xd3, 0xb9, 0x96, 0xe1, 0x2d, 0x23, 0xd4, - 0x30, 0xe4, 0xd7, 0x54, 0x72, 0x09, 0x99, 0xd4, 0x83, 0xc3, 0x7a, 0x94, - 0xb1, 0xd1, 0xce, 0x66, 0x00, 0x5b, 0x1f, 0xef, 0x87, 0x1b, 0xe3, 0x3b, - 0x36, 0x77, 0xcf, 0x29, 0x45, 0xc9, 0xd5, 0xb9, 0x32, 0x07, 0xe8, 0xfe, - 0x53, 0x10, 0x7f, 0xa3, 0xcb, 0x84, 0x9a, 0x14, 0x7b, 0xe4, 0xc9, 0xba, - 0xfe, 0x20, 0x5b, 0x9b, 0x90, 0xc3, 0xd4, 0xdd, 0xbb, 0xf6, 0x23, 0x7a, - 0x12, 0x43, 0x98, 0xb7, 0xdf, 0x71, 0x57, 0xda, 0xbf, 0xee, 0x3a, 0x2e, - 0x34, 0xc2, 0xe3, 0xf1, 0xa9, 0xe6, 0xa0, 0x6f, 0x0b, 0x6d, 0xa9, 0xb9, - 0x29, 0x9a, 0xdf, 0x45, 0xf9, 0x91, 0xc6, 0x97, 0x41, 0x14, 0x82, 0x59, - 0x6f, 0x02, 0x90, 0xa8, 0x4e, 0x77, 0x65, 0xd6, 0x7b, 0x09, 0xaf, 0x29, - 0x5d, 0x0b, 0xc6, 0x4d, 0x0b, 0xf9, 0xf5, 0x96, 0xf0, 0xc6, 0x7b, 0x10, - 0x5f, 0xd3, 0xcb, 0x01, 0x24, 0x1d, 0x32, 0x0b, 0x9c, 0x6c, 0x01, 0x38, - 0x51, 0xa0, 0xa1, 0xba, 0x08, 0xe9, 0x21, 0x45, 0xd0, 0x4d, 0x3f, 0x91, - 0x3a, 0x84, 0x47, 0x9e, 0xe2, 0x7e, 0x2d, 0xab, 0x00, 0x00, 0xdd, 0xba, - 0xba, 0x81, 0x14, 0xc2, 0xd5, 0x9a, 0xae, 0xac, 0xa0, 0x77, 0x04, 0x51, - 0xf3, 0x9d, 0xb2, 0xe8, 0xd0, 0x0b, 0x5e, 0x97, 0x4e, 0x70, 0x63, 0xda, - 0x45, 0xd5, 0xd4, 0x67, 0x5d, 0xf3, 0x64, 0xf5, 0x3f, 0x7e, 0xeb, 0x2d, - 0xfa, 0x30, 0x6a, 0x3b, 0xb4, 0x53, 0x88, 0xa3, 0xe0, 0x4b, 0x67, 0x06, - 0x4b, 0x6e, 0x32, 0x1f, 0x90, 0x4d, 0x48, 0xe0, 0xa7, 0x42, 0x40, 0xa1, - 0xf5, 0xfe, 0x7a, 0xe1, 0x89, 0x8c, 0x6c, 0x2e, 0x64, 0x22, 0xc2, 0xb4, - 0x50, 0x72, 0x43, 0x59, 0x77, 0x9f, 0xf1, 0x67, 0xaa, 0x00, 0xa3, 0xd7, - 0x18, 0x20, 0xd9, 0xb8, 0x58, 0x55, 0xae, 0x1b, 0x6f, 0x5a, 0x18, 0x9d, - 0x08, 0xa1, 0x2e, 0xec, 0x8e, 0xbf, 0xac, 0x51, 0xe5, 0xd5, 0xd3, 0x69, - 0xd2, 0x7d, 0xbf, 0xbb, 0xfd, 0xd9, 0x6e, 0x58, 0x8d, 0xbe, 0x59, 0xc1, - 0x15, 0x52, 0x17, 0x58, 0x14, 0xa5, 0x28, 0x18, 0x9c, 0x03, 0xfb, 0x81, - 0x46, 0x24, 0x3b, 0x56, 0x2c, 0xf0, 0xb9, 0x8e, 0x0c, 0xf2, 0x31, 0x1b, - 0x0b, 0x12, 0xdd, 0xb1, 0xe1, 0x73, 0xd3, 0xf1, 0x2f, 0x20, 0x69, 0x70, - 0x51, 0xf2, 0x49, 0xec, 0xad, 0xc9, 0xdb, 0x8f, 0x1f, 0xb3, 0x26, 0x15, - 0xea, 0x3d, 0xff, 0xe0, 0x4d, 0x52, 0x84, 0x49, 0x32, 0x67, 0xbe, 0xef, - 0xdb, 0xda, 0x09, 0x41, 0x5b, 0x62, 0xf4, 0x67, 0xed, 0x40, 0x2e, 0x30, - 0x10, 0x6b, 0x5a, 0x89, 0x2d, 0xf0, 0x5f, 0xa1, 0x51, 0x17, 0x4b, 0xc0, - 0x4f, 0xa0, 0x54, 0xa5, 0x83, 0x72, 0x16, 0x98, 0xfd, 0xa2, 0x9a, 0xcc, - 0x08, 0x93, 0x89, 0x8b, 0x3f, 0x8f, 0x22, 0xb7, 0xac, 0xf2, 0x4c, 0xeb, - 0xc7, 0x9e, 0x9a, 0xb6, 0x27, 0x92, 0xf4, 0x94, 0x4c, 0x1a, 0x75, 0x5f, - 0xa4, 0x19, 0x33, 0x94, 0x2a, 0xc7, 0x48, 0x0e, 0xaa, 0xc5, 0xf4, 0x69, - 0x0f, 0x2e, 0xf7, 0x13, 0xab, 0x82, 0xc0, 0xe2, 0xe6, 0xb0, 0xca, 0x24, - 0x92, 0x93, 0xed, 0x77, 0x48, 0xdd, 0x37, 0xe2, 0xe0, 0xef, 0x78, 0xed, - 0xe2, 0x3e, 0x5f, 0x18, 0x8b, 0xb7, 0x2d, 0x93, 0xe1, 0x1c, 0xcf, 0x16, - 0x18, 0xe1, 0xec, 0x23, 0x26, 0x9b, 0xca, 0x04, 0x16, 0xaa, 0x4b, 0x2c, - 0x36, 0x28, 0x07, 0xde, 0x85, 0x21, 0xd2, 0x14, 0x80, 0x43, 0xc3, 0x2a, - 0xb9, 0xe4, 0x7e, 0x5c, 0x2e, 0xba, 0x0e, 0x3c, 0xfd, 0xbf, 0x04, 0xaa, - 0xde, 0xdd, 0x5c, 0x3c, 0x4c, 0x8c, 0xf2, 0x4c, 0xfa, 0x76, 0xae, 0x3a, - 0x73, 0xa3, 0x7b, 0x9b, 0x5c, 0xc6, 0x61, 0xb9, 0x39, 0xe4, 0xc3, 0x05, - 0x2c, 0x19, 0x6a, 0x1c, 0x09, 0x81, 0x44, 0x76, 0x5f, 0x38, 0xba, 0xa9, - 0xc9, 0x65, 0xda, 0xe6, 0x19, 0x8f, 0xbd, 0x8e, 0xec, 0x24, 0x02, 0xae, - 0x1c, 0x61, 0x4a, 0xfd, 0x0b, 0x1c, 0x8f, 0x54, 0x9c, 0x07, 0xc0, 0x7a, - 0x50, 0xaf, 0x1c, 0x7c, 0x7a, 0x1d, 0x65, 0x42, 0xc6, 0xf3, 0x73, 0x91, - 0xaa, 0xb5, 0x20, 0xf4, 0xaa, 0x29, 0x42, 0xcc, 0x70, 0xaa, 0xdc, 0x2b, - 0xc0, 0x2a, 0x5b, 0xa5, 0x3f, 0x2d, 0xfc, 0x9c, 0xe7, 0x08, 0xc4, 0x09, - 0xff, 0x2a, 0x88, 0xfe, 0x39, 0x0b, 0xa9, 0x1d, 0x18, 0xec, 0xa5, 0xd6, - 0x70, 0x14, 0xba, 0x14, 0xb6, 0xf5, 0x44, 0x53, 0x51, 0x96, 0x2c, 0xb4, - 0xd1, 0x66, 0x79, 0x95, 0x9e, 0x48, 0x85, 0xf1, 0x82, 0xfd, 0xb9, 0x4c, - 0x44, 0x5c, 0xfa, 0x26, 0x4f, 0xca, 0x14, 0x66, 0x68, 0xe6, 0xae, 0xd6, - 0xe2, 0x37, 0xd9, 0xf0, 0x3c, 0x41, 0x22, 0xa4, 0xce, 0x75, 0x26, 0x36, - 0x38, 0xac, 0x91, 0x7e, 0x41, 0x18, 0xf3, 0x12, 0x8c, 0x9d, 0x2c, 0xf8, - 0x93, 0xfb, 0xc9, 0x3e, 0xda, 0xc0, 0x48, 0x89, 0x21, 0xb2, 0x55, 0x23, - 0xd9, 0xee, 0x85, 0x42, 0x65, 0x1e, 0xc1, 0xe8, 0x2f, 0x7f, 0x38, 0x7c, - 0xb7, 0xef, 0xc8, 0x59, 0xd2, 0xf0, 0xdf, 0x31, 0xc0, 0x32, 0xab, 0xcf, - 0x20, 0x62, 0x62, 0x8f, 0x3c, 0x9d, 0x99, 0x6a, 0xca, 0xee, 0x04, 0xa3, - 0x89, 0x4a, 0xe9, 0xa2, 0xe0, 0x59, 0x51, 0x39, 0xaa, 0xd0, 0x55, 0xc6, - 0x6a, 0x76, 0x63, 0x15, 0xfd, 0xbf, 0x81, 0x7f, 0xea, 0xe3, 0xaa, 0x58, - 0xc0, 0x38, 0xdf, 0x2b, 0x44, 0xa9, 0x9e, 0x31, 0x0b, 0x7f, 0xfb, 0x1b, - 0xb5, 0x6b, 0x91, 0xe9, 0x45, 0x63, 0x70, 0x23, 0x29, 0x95, 0x79, 0xa2, - 0x25, 0x06, 0xcb, 0x00, 0x6d, 0x09, 0x1c, 0xaf, 0xc9, 0x57, 0x66, 0x25, - 0x49, 0x78, 0x02, 0x68, 0x79, 0xd6, 0xfd, 0x86, 0x71, 0x2a, 0x3e, 0xa5, - 0x4b, 0xd9, 0x18, 0xc9, 0x17, 0xc1, 0xaa, 0x6d, 0xd0, 0x47, 0xc2, 0x06, - 0xc8, 0xc2, 0xe7, 0x30, 0x2d, 0xd5, 0x40, 0xed, 0x45, 0xb7, 0x7a, 0xf9, - 0xbe, 0x1c, 0xcd, 0x75, 0x81, 0x35, 0x03, 0xe2, 0x99, 0xfc, 0x4b, 0xc9, - 0x31, 0x32, 0xe3, 0x50, 0x12, 0xde, 0x22, 0x44, 0x3e, 0xc9, 0x5b, 0xf9, - 0x41, 0x14, 0x64, 0xc5, 0x86, 0x85, 0xf7, 0x62, 0xc8, 0x7f, 0xae, 0x21, - 0x14, 0xf7, 0x96, 0x77, 0xd4, 0x7c, 0x4c, 0xd7, 0x01, 0x6b, 0x13, 0xd7, - 0x45, 0x00, 0x11, 0x76, 0xca, 0x50, 0x84, 0x93, 0xed, 0x2e, 0x38, 0xf4, - 0x29, 0x12, 0x29, 0x1a, 0x4c, 0x6d, 0x8e, 0xe8, 0xc2, 0x44, 0x7d, 0x5e, - 0xed, 0x6e, 0xcb, 0x20, 0x96, 0x91, 0x76, 0x11, 0x3c, 0xda, 0xc3, 0x5e, - 0x90, 0xf4, 0x88, 0xa2, 0xe0, 0x2d, 0xd4, 0x99, 0x64, 0x39, 0xe4, 0x4e, - 0x67, 0x1d, 0xbd, 0xca, 0xbd, 0x11, 0x24, 0xbc, 0xe0, 0xff, 0x27, 0xb5, - 0x44, 0x71, 0xd2, 0x54, 0x50, 0x9b, 0x5f, 0xa1, 0xd3, 0x0e, 0x5d, 0x7a, - 0xb9, 0x1d, 0x3d, 0x8f, 0x9d, 0xdd, 0xf6, 0xcf, 0xdd, 0x8c, 0x98, 0x70, - 0x95, 0xcc, 0x19, 0x16, 0x89, 0xcc, 0xf1, 0x1f, 0xf6, 0xee, 0x7d, 0xd1, - 0xed, 0x56, 0x37, 0xc8, 0x79, 0x9a, 0x14, 0x17, 0x09, 0x1c, 0x39, 0xca, - 0xa0, 0x86, 0x1f, 0x5f, 0x05, 0xfa, 0x77, 0xbc, 0xeb, 0x57, 0xfa, 0xb8, - 0xe5, 0x74, 0x80, 0x98, 0x79, 0x79, 0x62, 0xfb, 0x1a, 0x9c, 0x1b, 0x97, - 0x1d, 0x83, 0x28, 0xc5, 0x39, 0x27, 0x14, 0xcd, 0x39, 0x30, 0x04, 0x13, - 0x16, 0xc0, 0xd6, 0xb8, 0x16, 0x22, 0x12, 0x61, 0x87, 0x82, 0x19, 0xb2, - 0xf1, 0xd4, 0x43, 0x90, 0xb8, 0x8c, 0x6e, 0xb2, 0xf9, 0xd0, 0x96, 0x6a, - 0x48, 0x3b, 0x11, 0xea, 0xe6, 0x52, 0xd6, 0x0d, 0xf5, 0xe9, 0x36, 0xc6, - 0xfb, 0x43, 0x9b, 0x61, 0xaf, 0xda, 0x82, 0x5a, 0x12, 0x29, 0xbb, 0x58, - 0xd7, 0x6a, 0x79, 0xee, 0x27, 0x75, 0x0d, 0xba, 0x12, 0x14, 0x81, 0xe1, - 0xf4, 0x54, 0xc6, 0x9e, 0x91, 0x5b, 0xf1, 0xaf, 0x40, 0x89, 0x08, 0xdc, - 0xce, 0x9e, 0x1c, 0x46, 0xbe, 0x05, 0xa6, 0xe8, 0xe2, 0x76, 0x86, 0xc8, - 0x0c, 0xd2, 0xed, 0x6b, 0x25, 0xbd, 0xbd, 0x98, 0x62, 0xba, 0x50, 0xc4, - 0x6e, 0xaa, 0x28, 0x63, 0x18, 0xc1, 0xed, 0x91, 0xc8, 0xc5, 0xcb, 0x48, - 0x1d, 0xe6, 0xdb, 0x12, 0xd9, 0xc2, 0x54, 0x14, 0x42, 0xf1, 0x88, 0x7b, - 0x76, 0x7f, 0xab, 0x33, 0x9c, 0xca, 0x10, 0xd8, 0xdd, 0x2b, 0x77, 0xb7, - 0x8f, 0x95, 0xe0, 0x80, 0x8b, 0x2a, 0x1d, 0x2f, 0xb3, 0xb4, 0x2e, 0xac, - 0x68, 0xdd, 0x89, 0x0f, 0xb8, 0x3a, 0x5b, 0xa0, 0x1c, 0x61, 0x8f, 0x8f, - 0x4e, 0x17, 0x39, 0x57, 0x66, 0x67, 0x2c, 0x0a, 0x26, 0x3c, 0x5f, 0xed, - 0x65, 0x62, 0x09, 0xb2, 0x3f, 0x29, 0x5f, 0x8a, 0x46, 0x3e, 0xf2, 0x84, - 0x8c, 0x56, 0x90, 0xa2, 0x65, 0x0b, 0x4c, 0xed, 0x10, 0x9b, 0x49, 0x55, - 0x98, 0xc3, 0x87, 0x90, 0xe5, 0x36, 0xeb, 0xbd, 0xc5, 0x87, 0x39, 0xf7, - 0x9b, 0xc6, 0x62, 0x24, 0xd0, 0xa5, 0x5b, 0x24, 0x82, 0x6d, 0x14, 0x6d, - 0x9e, 0x30, 0x8d, 0x9d, 0x9a, 0x25, 0x01, 0xab, 0x89, 0xc4, 0xbc, 0x7f, - 0x57, 0xbe, 0x60, 0x35, 0xc6, 0x9a, 0xbb, 0x78, 0x8f, 0x9a, 0xb1, 0xbd, - 0xc1, 0x42, 0x4d, 0xf1, 0xd2, 0x14, 0x18, 0xbc, 0xd4, 0xc4, 0xf3, 0x83, - 0x41, 0x81, 0xde, 0xc4, 0xc5, 0x82, 0x0e, 0x2e, 0x57, 0x0a, 0x56, 0x03, - 0xda, 0x31, 0x28, 0x65, 0x2d, 0x93, 0xa4, 0xf1, 0x3b, 0x81, 0x8e, 0xab, - 0x9f, 0x65, 0x5f, 0xfe, 0xac, 0x26, 0xfe, 0x41, 0x04, 0xfb, 0x58, 0xea, - 0x4e, 0xff, 0xe4, 0x6b, 0x70, 0x02, 0xa3, 0xaf, 0x90, 0xed, 0xc9, 0x9f, - 0xd9, 0x89, 0xd3, 0xaa, 0x63, 0x0e, 0x9d, 0xba, 0xfb, 0x80, 0x40, 0xe3, - 0xbf, 0xdd, 0x60, 0x63, 0xf7, 0x76, 0x20, 0xbe, 0x3b, 0xd6, 0xa6, 0x2a, - 0x3a, 0xfc, 0x90, 0xd5, 0x2b, 0xbe, 0xf1, 0xe0, 0x99, 0xa1, 0x3e, 0xed, - 0x1d, 0x93, 0x78, 0x15, 0x2e, 0xfd, 0x27, 0x5b, 0x7a, 0xb7, 0x7a, 0xbe, - 0xbb, 0x03, 0x35, 0xf2, 0x9a, 0x11, 0x5c, 0x6f, 0x72, 0x32, 0xaf, 0x29, - 0x02, 0x9f, 0x0f, 0x01, 0x8c, 0x2d, 0x12, 0xdc, 0xa7, 0xce, 0x0e, 0x50, - 0x90, 0x2f, 0x96, 0x4d, 0xd8, 0xae, 0x01, 0x17, 0xc6, 0xc2, 0x6b, 0x0d, - 0x8a, 0xc6, 0x15, 0xb6, 0xa5, 0xfd, 0xd5, 0x5c, 0x10, 0xba, 0x5b, 0x9f, - 0xae, 0x74, 0x2b, 0xd5, 0xab, 0x9e, 0x78, 0xec, 0xcf, 0x2b, 0x7c, 0x20, - 0xfb, 0x90, 0x28, 0x6f, 0xb1, 0xa6, 0xe6, 0xde, 0x29, 0x59, 0xf0, 0x81, - 0xa9, 0x5d, 0x3f, 0xe0, 0x74, 0x5e, 0x17, 0x5f, 0xd4, 0x30, 0x45, 0x04, - 0x6b, 0xba, 0x32, 0xaf, 0x85, 0x13, 0x56, 0x8b, 0xdc, 0xa0, 0xe1, 0x18, - 0x65, 0x48, 0xab, 0xdd, 0xbf, 0x2f, 0x87, 0x54, 0xef, 0xb2, 0x10, 0x2f, - 0x6d, 0x2b, 0xcc, 0xb7, 0x84, 0x4f, 0x3b, 0xb9, 0xe6, 0x7a, 0xe7, 0x0e, - 0x99, 0xc1, 0x73, 0xd9, 0x07, 0xb1, 0xfb, 0xb4, 0x6b, 0xcf, 0x3b, 0x73, - 0x0b, 0x64, 0x56, 0x82, 0x8e, 0x61, 0x60, 0x41, 0x1e, 0x2a, 0xde, 0xf4, - 0xcd, 0x77, 0xbc, 0xf4, 0x1e, 0x40, 0xd0, 0x8b, 0xb6, 0xb8, 0x97, 0x1e, - 0xa4, 0x7a, 0x62, 0x4f, 0x23, 0x15, 0x17, 0x1c, 0x52, 0x9a, 0x91, 0x86, - 0xf4, 0xb8, 0x50, 0x02, 0x8a, 0x1c, 0x27, 0xf8, 0x96, 0x15, 0x7e, 0x84, - 0x0b, 0x6d, 0xce, 0xed, 0x11, 0x56, 0x1f, 0x2d, 0x66, 0x65, 0x22, 0x72, - 0xd5, 0x94, 0x48, 0x36, 0x80, 0x30, 0xd5, 0x1e, 0x67, 0x53, 0x6c, 0x5e, - 0xa8, 0xb1, 0x33, 0xb5, 0xb0, 0x2c, 0x54, 0x10, 0x2e, 0x29, 0xf4, 0xcf, - 0x1b, 0xe8, 0x23, 0x16, 0xde, 0x5b, 0xfc, 0x8c, 0xd2, 0xfd, 0x86, 0x63, - 0xee, 0xc8, 0xb6, 0x7c, 0x81, 0x5d, 0x1a, 0x55, 0x30, 0xbd, 0x01, 0xd9, - 0x8c, 0x37, 0x4b, 0xfd, 0x4c, 0x8c, 0x2a, 0x39, 0xb2, 0x12, 0xaa, 0xf8, - 0xef, 0x01, 0x94, 0xa3, 0xda, 0x3b, 0xf3, 0xca, 0x7f, 0xfe, 0xda, 0x88, - 0xd6, 0x82, 0x54, 0xc8, 0xeb, 0xcc, 0xe7, 0xf7, 0x96, 0xaf, 0xd4, 0x22, - 0xe9, 0xad, 0xa0, 0x7c, 0x2c, 0x7d, 0x29, 0x22, 0x0b, 0xe3, 0x5f, 0xe3, - 0xa6, 0x56, 0xcd, 0xa8, 0xae, 0x5a, 0x42, 0x48, 0xa3, 0x8d, 0xa1, 0xf4, - 0x5c, 0x06, 0x2d, 0xf1, 0x00, 0xf3, 0x6e, 0x2e, 0x5a, 0x16, 0x62, 0xaf, - 0x0c, 0x5c, 0x3a, 0x68, 0xad, 0x53, 0x9a, 0x62, 0xaf, 0x24, 0x9b, 0x0e, - 0x44, 0x69, 0x53, 0x9e, 0x42, 0x30, 0xf3, 0xa7, 0x34, 0x52, 0xe1, 0xcb, - 0x85, 0x63, 0x5d, 0x0c, 0xf6, 0xe1, 0x8f, 0x04, 0x93, 0xb3, 0xf1, 0xd2, - 0x6c, 0xc9, 0x09, 0x1e, 0xeb, 0xdf, 0x36, 0xb9, 0x74, 0xa2, 0x24, 0x3f, - 0xd8, 0x61, 0xc0, 0x1c, 0xf9, 0xfd, 0x22, 0xea, 0x1c, 0x61, 0x06, 0x4a, - 0xdf, 0xb6, 0xd7, 0x1a, 0xec, 0x5a, 0xaf, 0x49, 0xe8, 0xf2, 0x50, 0x85, - 0xe9, 0xc8, 0x5f, 0x23, 0x01, 0x16, 0x82, 0x2a, 0x5f, 0xdb, 0x9e, 0x44, - 0xbb, 0xda, 0xb3, 0xbd, 0xdc, 0xa8, 0x5c, 0x7d, 0xd7, 0xa6, 0x26, 0x50, - 0xb5, 0xb7, 0x59, 0x9c, 0x8f, 0x27, 0x7f, 0x9f, 0x3a, 0xa2, 0x5e, 0x3b, - 0xd3, 0xbc, 0x57, 0x7d, 0xa5, 0x9b, 0xcd, 0x26, 0xcf, 0x4b, 0xd1, 0x1b, - 0xa4, 0x1f, 0xd2, 0x4c, 0x9e, 0x1f, 0x72, 0x90, 0x8a, 0x6c, 0xf3, 0x2f, - 0x6c, 0x07, 0x00, 0x59, 0xe4, 0x87, 0x2b, 0xa9, 0xa2, 0x1b, 0x7e, 0x6e, - 0xd2, 0xb3, 0x8e, 0xae, 0xd4, 0xd7, 0x67, 0x06, 0x6c, 0x7b, 0x34, 0x05, - 0x60, 0x9d, 0x81, 0x3b, 0x6e, 0xda, 0x69, 0x6d, 0x3c, 0xd4, 0x96, 0x1f, - 0xf9, 0xbe, 0x57, 0xa3, 0x57, 0xf7, 0x06, 0xbd, 0xbc, 0x48, 0x19, 0xf2, - 0x14, 0x85, 0x49, 0xc0, 0xbb, 0x44, 0x8e, 0x8c, 0x0a, 0x90, 0x6b, 0x36, - 0xd7, 0xc8, 0x91, 0x7e, 0x16, 0xd1, 0x3c, 0x2d, 0xd1, 0x7d, 0x96, 0x59, - 0x7c, 0xaf, 0x68, 0x9d, 0x84, 0xbe, 0xf0, 0x07, 0x33, 0x8f, 0x68, 0x53, - 0x6e, 0x13, 0xb0, 0x01, 0xad, 0xaf, 0x29, 0x8a, 0x18, 0x7a, 0x40, 0x86, - 0x46, 0xcb, 0xf8, 0x76, 0xca, 0x87, 0xb2, 0x8b, 0x7e, 0x3d, 0x0f, 0x01, - 0xe2, 0xd7, 0x60, 0x3c, 0x4b, 0x78, 0xcd, 0x82, 0x15, 0xd2, 0x7f, 0x7a, - 0x96, 0x83, 0xe3, 0xac, 0xa4, 0x70, 0xb7, 0xea, 0x41, 0x7d, 0x91, 0x07, - 0x8e, 0xdc, 0x17, 0x83, 0x58, 0x11, 0xc2, 0x81, 0x9d, 0x7f, 0x95, 0x53, - 0x0d, 0x92, 0xaf, 0xc9, 0xc7, 0x7b, 0xda, 0x62, 0x94, 0x4d, 0x36, 0x66, - 0xd6, 0x53, 0x3e, 0xfb, 0x64, 0x78, 0x74, 0x40, 0xcc, 0x22, 0x1d, 0xfc, - 0x60, 0x9d, 0xb7, 0x19, 0x22, 0xf1, 0xb8, 0x37, 0xaa, 0xce, 0x3e, 0xb8, - 0x17, 0xef, 0x8f, 0x13, 0x80, 0x87, 0xc0, 0x98, 0x8a, 0x7b, 0xb0, 0x3d, - 0x82, 0x9d, 0xb5, 0xbe, 0x1d, 0x96, 0x30, 0x7c, 0xeb, 0x6e, 0x84, 0xdf, - 0x5c, 0xe5, 0x14, 0xd7, 0x37, 0x4a, 0x70, 0xdb, 0xa6, 0xce, 0x1f, 0x4b, - 0x6e, 0xc2, 0x36, 0x7e, 0x24, 0x66, 0x83, 0x1f, 0x0b, 0xc5, 0xbc, 0x1a, - 0x61, 0xb9, 0x08, 0xaf, 0x82, 0xd1, 0xdf, 0x04, 0xbb, 0xce, 0xbe, 0xc5, - 0x49, 0xe3, 0x85, 0x06, 0x0b, 0xf2, 0x66, 0x40, 0xac, 0xf2, 0xfa, 0xa8, - 0x93, 0xe1, 0x7b, 0x4c, 0x4a, 0x35, 0x13, 0xc4, 0x3f, 0xe8, 0x64, 0x7f, - 0x19, 0x81, 0x91, 0x90, 0x26, 0x16, 0xce, 0x83, 0x4c, 0xe8, 0xb3, 0x9b, - 0x63, 0x27, 0x12, 0xb6, 0xa1, 0xcd, 0x97, 0xd8, 0xf9, 0xb9, 0x45, 0x82, - 0x6b, 0xfd, 0x92, 0xbc, 0xa3, 0x90, 0x7f, 0x8d, 0xd6, 0x05, 0x05, 0x88, - 0x57, 0xdc, 0xac, 0x39, 0x0f, 0xb4, 0xfc, 0x8b, 0x78, 0x87, 0x8d, 0x1d, - 0x5c, 0xd0, 0x62, 0x1b, 0x7b, 0x68, 0xfd, 0x6f, 0xb3, 0x67, 0x51, 0x12, - 0x5a, 0x13, 0x6b, 0x80, 0x30, 0xff, 0x3a, 0x14, 0x28, 0x50, 0x66, 0xc3, - 0x1a, 0xb8, 0xe4, 0x69, 0x4d, 0x38, 0x5c, 0xed, 0xf0, 0xbb, 0xeb, 0x5d, - 0x00, 0x55, 0x1c, 0x9d, 0xae, 0x7d, 0x7c, 0xb1, 0xf3, 0x28, 0xaa, 0x4b, - 0xaa, 0xb6, 0xfd, 0xbd, 0x87, 0xd1, 0xaa, 0x7a, 0x8f, 0x11, 0x11, 0xa3, - 0x15, 0x2b, 0xa5, 0x41, 0x8a, 0x22, 0xfd, 0x72, 0x9a, 0xff, 0x8a, 0x56, - 0x20, 0x3a, 0xfc, 0xab, 0x11, 0x68, 0x0f, 0x2e, 0x87, 0x3a, 0x08, 0x0b, - 0xdf, 0x42, 0x93, 0x18, 0x21, 0x89, 0x60, 0xd9, 0x05, 0x49, 0xea, 0x94, - 0x31, 0xbb, 0xdb, 0x8d, 0x0f, 0xb1, 0x86, 0x30, 0x06, 0x25, 0x06, 0xd5, - 0x96, 0x30, 0xa3, 0x35, 0xd3, 0x04, 0xac, 0x14, 0xbc, 0x36, 0xb7, 0x4b, - 0x84, 0x55, 0x9d, 0x5b, 0x6e, 0x9b, 0xa4, 0xe7, 0x1a, 0xd7, 0xdd, 0xe5, - 0x95, 0x55, 0x26, 0xae, 0xfd, 0xa8, 0xea, 0x40, 0xc3, 0x32, 0x82, 0xdd, - 0xda, 0x93, 0xb1, 0x24, 0x5a, 0x95, 0xa5, 0xd2, 0xe7, 0x0e, 0x5d, 0xcd, - 0x21, 0x1b, 0x0e, 0x3e, 0xf6, 0xc5, 0x07, 0xfa, 0x8e, 0x1f, 0xc8, 0xa3, - 0x66, 0x4e, 0x0f, 0xce, 0xcb, 0x01, 0xa4, 0xb2, 0xdf, 0xba, 0xdd, 0xe4, - 0x7f, 0x51, 0x11, 0xbb, 0xde, 0xd0, 0xb8, 0xc3, 0xc0, 0x2e, 0xff, 0xaf, - 0xb6, 0x33, 0x87, 0x86, 0x19, 0x2f, 0x85, 0x50, 0x74, 0x4d, 0x63, 0x8b, - 0x0a, 0x55, 0xb8, 0xe2, 0x74, 0xf3, 0xf7, 0x59, 0xc2, 0xa9, 0x41, 0x9c, - 0xe2, 0xdb, 0x00, 0x82, 0x5c, 0xaf, 0x86, 0xec, 0x04, 0xc6, 0x85, 0x87, - 0xa0, 0x73, 0x5b, 0xdd, 0xe8, 0xb8, 0x52, 0xfc, 0x47, 0xca, 0x02, 0x98, - 0x2e, 0x77, 0x6a, 0xc0, 0x75, 0xfa, 0x97, 0x32, 0x41, 0xa7, 0xd9, 0x3d, - 0x02, 0x86, 0xfa, 0x74, 0x6a, 0x6f, 0x31, 0x4a, 0x2a, 0x66, 0xf2, 0xa3, - 0x97, 0x9e, 0xf0, 0xd2, 0xf9, 0x9d, 0x29, 0x5f, 0x78, 0x55, 0x7b, 0xc8, - 0xdb, 0x1f, 0xc7, 0xc1, 0x6c, 0xda, 0x05, 0x26, 0xf0, 0xea, 0x4c, 0xde, - 0xb7, 0xb0, 0xc9, 0xb7, 0xa7, 0x1e, 0x33, 0xdf, 0x3f, 0xa5, 0xc4, 0x21, - 0x29, 0x53, 0x69, 0xd8, 0xf5, 0x54, 0x68, 0x8b, 0xb1, 0xe8, 0x04, 0xf5, - 0x29, 0x3a, 0xfa, 0x68, 0xdc, 0x4e, 0x1a, 0x95, 0x73, 0xd4, 0x81, 0x1a, - 0xd8, 0xd9, 0xbe, 0x38, 0x7d, 0xfc, 0x71, 0xb2, 0xd4, 0xd6, 0xd9, 0x1c, - 0x9b, 0x6d, 0xad, 0x04, 0x28, 0x23, 0x9f, 0xd0, 0x22, 0xe6, 0xb3, 0xfd, - 0xa7, 0x50, 0x94, 0x2a, 0x84, 0xbe, 0xff, 0x39, 0x19, 0xa8, 0xd0, 0x35, - 0x7d, 0xaf, 0x86, 0x48, 0x8e, 0x40, 0x1f, 0xe9, 0x56, 0xea, 0xb8, 0xda, - 0x9f, 0xcc, 0x94, 0x56, 0x00, 0x71, 0x99, 0x30, 0xff, 0xb1, 0x06, 0x8a, - 0x79, 0x10, 0xf0, 0x4d, 0x9f, 0x3c, 0x1e, 0xd9, 0x43, 0xa8, 0xba, 0xd3, - 0x95, 0x38, 0x30, 0x3a, 0x4d, 0xc0, 0x0e, 0x45, 0x7e, 0x7a, 0x09, 0xd0, - 0xb4, 0x4b, 0x41, 0xb8, 0x2d, 0x52, 0xb8, 0x16, 0xdc, 0xa2, 0xde, 0x68, - 0x8a, 0x81, 0x73, 0x8a, 0x7b, 0xee, 0x73, 0xdc, 0xe6, 0x50, 0xd8, 0xd5, - 0xd9, 0xcd, 0xff, 0x39, 0x6a, 0x67, 0x13, 0xec, 0xbe, 0xb8, 0x55, 0xf8, - 0x61, 0x87, 0xd1, 0x1f, 0x1f, 0xbc, 0xbf, 0x6c, 0x11, 0xad, 0x88, 0x4d, - 0xcb, 0x4b, 0x4f, 0xaf, 0x44, 0x38, 0x09, 0x6d, 0x47, 0xa0, 0x50, 0x15, - 0xd6, 0x2d, 0xfb, 0x59, 0x65, 0xcf, 0xba, 0x54, 0xbf, 0xff, 0x3d, 0xe3, - 0x36, 0x77, 0x96, 0x2e, 0xfa, 0xfe, 0x3b, 0xaf, 0x92, 0xdb, 0xf2, 0x35, - 0x17, 0xc8, 0x18, 0x3d, 0x55, 0x04, 0xc1, 0xc8, 0x01, 0xc3, 0x14, 0x27, - 0x1e, 0x9d, 0xbc, 0xa4, 0x0f, 0x1f, 0xbb, 0x75, 0x5b, 0x76, 0x26, 0x5e, - 0x5e, 0xbc, 0x55, 0x84, 0xf7, 0x5a, 0xfc, 0xe9, 0x8e, 0xe1, 0x23, 0x07, - 0xaa, 0x94, 0x7e, 0xb6, 0x6f, 0x83, 0xf1, 0xdf, 0x51, 0x5c, 0xa2, 0x0a, - 0x98, 0x8c, 0x28, 0xfc, 0xa9, 0x8f, 0x98, 0x3e, 0x22, 0x13, 0xf1, 0x47, - 0x8f, 0xd9, 0xb9, 0xbd, 0x3d, 0x5d, 0xef, 0x37, 0xda, 0x44, 0x95, 0x9b, - 0x7e, 0x8f, 0x07, 0x7c, 0x3f, 0x22, 0xa6, 0x41, 0xe5, 0x29, 0xce, 0x6b, - 0x87, 0x89, 0x8e, 0x3c, 0xb8, 0xd8, 0xad, 0xf1, 0xc7, 0x19, 0x97, 0xa9, - 0x53, 0x5d, 0x2e, 0xbd, 0x0c, 0x36, 0xee, 0x58, 0x4c, 0xd7, 0x47, 0xde, - 0x78, 0x32, 0x43, 0x67, 0x36, 0x00, 0xe4, 0x4f, 0xda, 0xd5, 0x9d, 0xdc, - 0x71, 0xb6, 0x45, 0x49, 0xd9, 0xc0, 0x1e, 0xd1, 0x59, 0x48, 0x7f, 0x6d, - 0x33, 0x35, 0x09, 0xf8, 0x71, 0xc2, 0x16, 0xf3, 0x24, 0x7e, 0x31, 0x7f, - 0xae, 0x30, 0xaf, 0xce, 0x23, 0xb1, 0xab, 0xa4, 0xe7, 0x6f, 0x48, 0xb1, - 0xb7, 0xdb, 0xff, 0x44, 0x99, 0x84, 0x28, 0x66, 0x67, 0xb9, 0x1c, 0x05, - 0x06, 0x0b, 0x91, 0x29, 0x69, 0x08, 0x44, 0x70, 0x1f, 0x30, 0xfb, 0x91, - 0x0c, 0x42, 0x09, 0x75, 0x36, 0xe6, 0x8a, 0xb2, 0x3a, 0xe2, 0x4a, 0xd7, - 0xe2, 0x68, 0x2c, 0x24, 0x0e, 0x5f, 0x2f, 0xce, 0x70, 0x0d, 0x89, 0xf2, - 0x9d, 0xca, 0x6b, 0x3e, 0x4e, 0xde, 0x45, 0xfe, 0xc2, 0x7f, 0x82, 0xbb, - 0x76, 0x6b, 0xb3, 0xf2, 0x34, 0x1d, 0x2a, 0xfc, 0xad, 0xc1, 0x14, 0x2c, - 0x14, 0x2d, 0x72, 0xef, 0x82, 0x49, 0xed, 0x9d, 0x22, 0x48, 0x57, 0xcb, - 0xb9, 0xbd, 0xfa, 0xc3, 0x14, 0x77, 0x73, 0x98, 0x6c, 0x51, 0x5a, 0xfe, - 0xc3, 0x4b, 0x39, 0xb8, 0xc3, 0x6a, 0x25, 0xba, 0x52, 0xa7, 0x27, 0xd5, - 0x71, 0xbb, 0xa3, 0x79, 0xe2, 0x05, 0x40, 0x07, 0x75, 0x58, 0x90, 0xad, - 0x52, 0x55, 0xc3, 0xe4, 0xc1, 0xcb, 0x58, 0x15, 0xc1, 0x40, 0x79, 0x7b, - 0x1e, 0xff, 0xe9, 0x57, 0xd0, 0x03, 0x94, 0xd4, 0x46, 0xfa, 0xdb, 0x0c, - 0x31, 0xf9, 0x55, 0x01, 0xe5, 0xe6, 0xe4, 0x9f, 0x88, 0xe6, 0x38, 0x36, - 0x0d, 0x4b, 0x99, 0x8a, 0x28, 0x4a, 0x51, 0xb7, 0x2d, 0xe3, 0xf3, 0xdd, - 0x9d, 0xe4, 0xd7, 0x2e, 0x3e, 0x89, 0x5e, 0x7e, 0x81, 0x2a, 0xf3, 0x59, - 0x92, 0x01, 0x64, 0x85, 0xfb, 0x51, 0x0b, 0x58, 0x80, 0x74, 0xa4, 0x0d, - 0x7e, 0x96, 0xcd, 0x40, 0x7b, 0x1e, 0x15, 0x9c, 0xac, 0xfb, 0xe0, 0xc7, - 0xeb, 0x98, 0x5c, 0x56, 0xb5, 0x23, 0xa4, 0x4c, 0x3b, 0x47, 0x66, 0x21, - 0x0c, 0x82, 0x1c, 0xfe, 0x48, 0x71, 0x0f, 0xb4, 0x2d, 0x15, 0xd0, 0x73, - 0xbd, 0xd3, 0x55, 0x95, 0x04, 0x4d, 0x64, 0x26, 0x18, 0x06, 0xf9, 0x51, - 0x12, 0x9a, 0x90, 0x11, 0x48, 0x01, 0x47, 0x63, 0x74, 0xa1, 0xe1, 0x0d, - 0x2d, 0xf6, 0xed, 0xda, 0x8d, 0xde, 0x1c, 0xf0, 0x4a, 0x3d, 0x91, 0x31, - 0x87, 0xb9, 0x38, 0xb4, 0x35, 0xb1, 0xe1, 0xb3, 0xd9, 0x76, 0x29, 0xe6, - 0x22, 0xf2, 0x4e, 0x29, 0xfd, 0xfe, 0xfa, 0xe6, 0x43, 0xb2, 0x95, 0x37, - 0x8d, 0x48, 0x9e, 0xea, 0x20, 0xba, 0x30, 0x5c, 0xa4, 0x97, 0xe7, 0x6c, - 0xfe, 0x08, 0x19, 0x30, 0x45, 0xb7, 0x10, 0x72, 0xe6, 0x9c, 0xe9, 0xec, - 0x61, 0xa9, 0x48, 0xb2, 0xaa, 0x31, 0x6f, 0x02, 0xf1, 0x8d, 0x14, 0x08, - 0x27, 0xfc, 0x8e, 0x56, 0x51, 0xcc, 0xb6, 0x0b, 0x13, 0x53, 0x48, 0x90, - 0xea, 0x74, 0xef, 0xe0, 0xfc, 0xea, 0x6a, 0xe9, 0x3f, 0x5f, 0xd2, 0xaa, - 0x76, 0xc5, 0xa0, 0xbb, 0x70, 0x79, 0xf0, 0xc9, 0xc7, 0x7e, 0x6b, 0xc7, - 0x75, 0x8b, 0x6a, 0x13, 0xbd, 0xbf, 0xee, 0x75, 0x8e, 0x41, 0x3d, 0x34, - 0xa8, 0x36, 0x94, 0x62, 0x01, 0x44, 0xe7, 0xdf, 0x9b, 0x34, 0x30, 0x15, - 0x55, 0x34, 0xf0, 0x6b, 0xfe, 0x35, 0x60, 0x00, 0xa9, 0x56, 0x09, 0x29, - 0xce, 0xfd, 0x95, 0x2a, 0x8c, 0xae, 0x47, 0xe9, 0x87, 0x25, 0x20, 0x74, - 0x5a, 0x24, 0xd3, 0x30, 0x3b, 0xfe, 0xf1, 0xb7, 0x53, 0xba, 0xd5, 0x61, - 0xc6, 0x57, 0x35, 0x74, 0x4f, 0x0c, 0x6e, 0xe6, 0x81, 0x54, 0xe5, 0xa5, - 0xd8, 0xf9, 0xfa, 0xa9, 0x09, 0xa5, 0x5d, 0x71, 0x86, 0xe8, 0xf8, 0x70, - 0x71, 0x70, 0xa0, 0x33, 0x6c, 0x0e, 0xf7, 0x83, 0x91, 0x25, 0xd9, 0x59, - 0x6c, 0x48, 0x0c, 0x74, 0x7b, 0xd2, 0x6a, 0xf1, 0xcd, 0xd6, 0x79, 0x20, - 0x2f, 0xf1, 0x27, 0xc6, 0xf6, 0x49, 0x61, 0xe7, 0xab, 0x05, 0xe3, 0x87, - 0x74, 0xe8, 0xbe, 0x2a, 0x3a, 0x00, 0x01, 0x71, 0x92, 0x83, 0x04, 0x3e, - 0x60, 0xbd, 0x85, 0x01, 0x9c, 0x47, 0xac, 0xd1, 0x7c, 0x7c, 0xc5, 0x58, - 0xef, 0x92, 0x45, 0x4b, 0x88, 0xeb, 0x45, 0xbb, 0xd5, 0x2b, 0x18, 0xdd, - 0x43, 0x19, 0xad, 0x08, 0x01, 0xbd, 0x60, 0x35, 0xb5, 0x1d, 0x51, 0x95, - 0x34, 0x76, 0x86, 0x82, 0x2b, 0x7c, 0xfc, 0xe7, 0x55, 0x6a, 0xc8, 0x90, - 0x3d, 0x97, 0x18, 0xe7, 0xa5, 0xbe, 0x86, 0x40, 0x31, 0xd3, 0xa8, 0xae, - 0xbd, 0xd6, 0x9f, 0x12, 0x05, 0x9c, 0xa7, 0xa6, 0x59, 0x22, 0x91, 0x1a, - 0x74, 0x12, 0xf6, 0x24, 0x6c, 0xc3, 0xfa, 0x55, 0xa4, 0xf6, 0xad, 0x51, - 0x8e, 0x1d, 0xf3, 0xe5, 0x6c, 0xf1, 0xcb, 0xc9, 0xf3, 0xbf, 0x56, 0x34, - 0x11, 0xbb, 0xeb, 0xc0, 0xab, 0xb5, 0x5c, 0x8b, 0xd2, 0x7f, 0x6c, 0x7d, - 0xc3, 0x6a, 0x5b, 0x63, 0x70, 0xff, 0xbf, 0xda, 0xb8, 0xc1, 0x14, 0x7c, - 0x40, 0xb7, 0x6f, 0xca, 0x2d, 0xa0, 0xa5, 0x20, 0xe4, 0x46, 0xe0, 0xb2, - 0xd3, 0x0f, 0x66, 0xf5, 0x97, 0x5b, 0x45, 0x37, 0x16, 0x26, 0x5e, 0x33, - 0xce, 0xc6, 0xbe, 0xc7, 0x9b, 0xae, 0x9c, 0xdc, 0x2d, 0x9b, 0xf9, 0x3b, - 0x7b, 0x3d, 0x4c, 0xa1, 0x00, 0xfe, 0x65, 0x66, 0xa5, 0x1e, 0x37, 0x4f, - 0x15, 0x0a, 0xcd, 0x79, 0x3f, 0x7c, 0x23, 0xf4, 0x0a, 0x8c, 0xb8, 0x30, - 0xbc, 0x7d, 0x32, 0xe2, 0x32, 0x01, 0xa9, 0x17, 0x7e, 0x12, 0x24, 0x5a, - 0x3c, 0xc6, 0x10, 0x66, 0xe2, 0x1b, 0x76, 0x3d, 0x1f, 0x7d, 0x30, 0x8c, - 0x16, 0x57, 0xeb, 0x4d, 0x75, 0x0e, 0x57, 0x05, 0x6f, 0x67, 0x12, 0x08, - 0xd5, 0xda, 0xf8, 0x3f, 0x5c, 0x41, 0xbb, 0xa1, 0x81, 0x76, 0xb8, 0x86, - 0x5d, 0xc2, 0xa2, 0x27, 0xa0, 0x12, 0x8a, 0xe1, 0x53, 0xfc, 0x9e, 0xd3, - 0x42, 0x6a, 0xa9, 0x53, 0xb4, 0xe4, 0xa4, 0x52, 0x14, 0x2c, 0xef, 0x1a, - 0x49, 0xac, 0x64, 0x9d, 0x04, 0xa6, 0xc0, 0xcc, 0x47, 0xfd, 0x4c, 0xf4, - 0xe0, 0x11, 0xa7, 0x70, 0x0f, 0xfd, 0xca, 0x93, 0xd1, 0xe6, 0xba, 0xb6, - 0x72, 0x74, 0xd4, 0x2f, 0x9a, 0xd0, 0xa3, 0xcb, 0xdc, 0xbd, 0xe3, 0xd8, - 0xa2, 0x7e, 0x46, 0x06, 0x85, 0xb6, 0x36, 0x7f, 0x40, 0xf7, 0xf6, 0xa7, - 0x63, 0xa4, 0x36, 0x13, 0xac, 0x23, 0x8c, 0x8b, 0x75, 0x62, 0x3d, 0xf2, - 0xe6, 0xe4, 0xd6, 0xb5, 0x31, 0x9b, 0x70, 0xfd, 0x7d, 0x4e, 0x13, 0xb9, - 0xbe, 0x1f, 0x59, 0x10, 0x06, 0x3b, 0x86, 0x6d, 0x58, 0xae, 0x34, 0x55, - 0xd0, 0xbe, 0x6a, 0x6a, 0xf3, 0xb9, 0xf3, 0x19, 0x1b, 0x33, 0x50, 0x0c, - 0x1c, 0xe3, 0x08, 0x25, 0xbf, 0x6f, 0x37, 0x32, 0x83, 0x3f, 0x7a, 0xba, - 0xea, 0xb4, 0x51, 0x16, 0x5a, 0xdb, 0xf6, 0x66, 0xa0, 0x85, 0x6f, 0x92, - 0x83, 0xed, 0xc6, 0x67, 0xf9, 0xd6, 0xc9, 0xd8, 0x54, 0x45, 0x9c, 0xd3, - 0x4a, 0xf7, 0x90, 0xed, 0x55, 0x07, 0x34, 0x53, 0xe3, 0x75, 0x2d, 0xe1, - 0xa4, 0xa8, 0xc8, 0xa3, 0x65, 0xca, 0xd1, 0x3c, 0x95, 0xdc, 0xd8, 0x7a, - 0xd4, 0x7d, 0xb5, 0x76, 0xbf, 0x4b, 0xa8, 0xb9, 0xb8, 0xb7, 0x5c, 0x0d, - 0x81, 0x54, 0xa1, 0x4d, 0x66, 0x1c, 0xe9, 0x13, 0xc7, 0x98, 0xc5, 0x1b, - 0x48, 0x80, 0x61, 0xca, 0xb8, 0x2f, 0x2a, 0xb9, 0x5f, 0x9d, 0x4a, 0xf7, - 0xa3, 0x22, 0x69, 0x62, 0x82, 0xa8, 0xb9, 0x10, 0x8b, 0x51, 0x7d, 0xba, - 0x95, 0xfa, 0x50, 0x43, 0x6b, 0x52, 0xfd, 0xf5, 0x85, 0x08, 0xd1, 0x97, - 0xc4, 0x8c, 0xdf, 0x40, 0x9b, 0x83, 0xa9, 0x75, 0xcc, 0xf1, 0xea, 0xb6, - 0x22, 0x70, 0x0c, 0x37, 0xfc, 0xee, 0x6c, 0x1f, 0xb5, 0x21, 0xb4, 0x48, - 0x5d, 0x53, 0x3b, 0xdd, 0x06, 0xda, 0x1c, 0xaf, 0x63, 0x2d, 0x76, 0x3f, - 0xa7, 0xfe, 0x0c, 0x83, 0x33, 0x06, 0xf0, 0x07, 0x4f, 0xd9, 0x18, 0x4e, - 0x5a, 0x03, 0x9d, 0xbc, 0x73, 0x40, 0x90, 0x30, 0xd6, 0x06, 0x07, 0x20, - 0x13, 0x5d, 0xd2, 0xcf, 0xad, 0x2d, 0xb7, 0x16, 0x0a, 0xac, 0x44, 0xb0, - 0xa9, 0x10, 0xc5, 0x39, 0x2b, 0x7a, 0x02, 0xca, 0xe8, 0xc9, 0xcd, 0x67, - 0xf7, 0xe4, 0x43, 0x72, 0x9a, 0x3f, 0x9f, 0xcb, 0xb4, 0x36, 0xcd, 0x6c, - 0xcd, 0x21, 0xbe, 0x7f, 0xba, 0xbe, 0xbd, 0x4d, 0x6e, 0xf4, 0x4a, 0x59, - 0x2e, 0x73, 0xe3, 0xea, 0x7f, 0x24, 0x6b, 0xce, 0x3e, 0xfb, 0xd9, 0xf2, - 0xe6, 0x6e, 0xf7, 0xc2, 0x64, 0xaf, 0x52, 0x54, 0x26, 0xfb, 0xd5, 0xbf, - 0x64, 0xb8, 0xed, 0xbf, 0x05, 0x5c, 0xa1, 0x58, 0xb5, 0x60, 0xb3, 0x08, - 0x82, 0xb9, 0x56, 0xe4, 0x21, 0x9b, 0x1e, 0x0c, 0x59, 0xcd, 0x83, 0x41, - 0x17, 0xf1, 0xac, 0x51, 0x37, 0x95, 0x22, 0xe2, 0x40, 0xbf, 0x9c, 0x85, - 0x5e, 0x72, 0x59, 0x77, 0xbe, 0xba, 0x79, 0x93, 0x40, 0xa3, 0xdb, 0xa7, - 0xa0, 0xdd, 0x83, 0x76, 0xa3, 0x5c, 0xbf, 0x2b, 0xf9, 0x87, 0x71, 0x87, - 0x82, 0xcc, 0x5a, 0x4e, 0x9e, 0x87, 0x35, 0x47, 0xed, 0x39, 0xfc, 0x4e, - 0x9c, 0xe7, 0x50, 0x03, 0xac, 0x54, 0xa4, 0x1a, 0xaa, 0x3a, 0xe7, 0x92, - 0xbb, 0xfe, 0xdc, 0xd7, 0x4f, 0x62, 0x5f, 0x56, 0x44, 0x01, 0xfd, 0xd4, - 0x8a, 0x62, 0xfc, 0xb1, 0x93, 0xf8, 0x6f, 0xb1, 0x43, 0x19, 0xc4, 0xcc, - 0x85, 0xa8, 0x13, 0xba, 0xe0, 0x4e, 0xc0, 0x4a, 0x3a, 0x73, 0x98, 0x59, - 0x5b, 0x72, 0xc0, 0x17, 0xa9, 0x12, 0x70, 0xeb, 0x12, 0xac, 0xdc, 0xb2, - 0xa9, 0x10, 0xc5, 0x39, 0x86, 0xb7, 0x23, 0x5d, 0x87, 0x55, 0xf6, 0x17, - 0x9f, 0x3c, 0xc6, 0x75, 0x71, 0x19, 0x96, 0x8f, 0x17, 0xed, 0xfb, 0x9e, - 0xe3, 0x91, 0x14, 0x66, 0x66, 0xba, 0xbb, 0x26, 0xdd, 0xdc, 0x02, 0x02, - 0xa0, 0xeb, 0x89, 0xf2, 0x36, 0x3d, 0x52, 0xf9, 0x9a, 0x26, 0xb6, 0x48, - 0xfd, 0x66, 0x59, 0xfd, 0x51, 0x40, 0xad, 0xae, 0xe2, 0x11, 0x8b, 0xda, - 0xf6, 0xab, 0xfe, 0x74, 0x35, 0x35, 0xf7, 0x1a, 0x8d, 0xa9, 0xd4, 0x90, - 0x17, 0x45, 0x98, 0x56, 0x2a, 0xa4, 0x7c, 0x11, 0x54, 0xe7, 0xd8, 0x61, - 0xc5, 0x37, 0xf5, 0x2f, 0x2f, 0xe3, 0xfd, 0x57, 0x1d, 0xd5, 0x21, 0x4d, - 0x7c, 0x8a, 0x8c, 0x99, 0x81, 0x08, 0x23, 0xcc, 0xdb, 0x32, 0x8a, 0xc2, - 0xf5, 0xe0, 0xea, 0xe6, 0x32, 0x60, 0x50, 0x32, 0xf6, 0x23, 0x73, 0x1a, - 0x07, 0xd5, 0x13, 0x29, 0x95, 0x0c, 0x44, 0x90, 0x7e, 0xa3, 0x0e, 0x6d, - 0x4b, 0x64, 0xbb, 0x4f, 0x1b, 0xa3, 0xb1, 0x95, 0xf0, 0x7e, 0xd7, 0x16, - 0xae, 0x2b, 0xbf, 0xbf, 0x3d, 0x43, 0x31, 0x7d, 0x2d, 0x62, 0xa2, 0x67, - 0xeb, 0x4f, 0x28, 0x50, 0x73, 0x53, 0xad, 0x4b, 0x52, 0xac, 0xab, 0xa6, - 0xaa, 0x2d, 0x05, 0xc0, 0x15, 0xb7, 0x6f, 0x48, 0x77, 0xff, 0x6d, 0x65, - 0xb9, 0x2d, 0x11, 0x6f, 0xd4, 0x4a, 0xfd, 0x46, 0xa0, 0x17, 0x97, 0x0f, - 0x31, 0xf1, 0x73, 0x86, 0xf2, 0xa0, 0xc4, 0xe8, 0x27, 0x36, 0x77, 0x7a, - 0xfb, 0x12, 0xb0, 0xa1, 0xec, 0xdb, 0xf2, 0x55, 0x7f, 0x65, 0x80, 0xe5, - 0x4c, 0x2e, 0xa3, 0x9c, 0x08, 0x09, 0x8b, 0x14, 0x3b, 0x1b, 0x84, 0xc8, - 0x0f, 0x15, 0x4a, 0xb4, 0xe2, 0x81, 0x49, 0xa5, 0x3c, 0xbf, 0x34, 0x04, - 0xe1, 0x9a, 0xf4, 0x38, 0x24, 0xb2, 0x52, 0xf6, 0x49, 0x03, 0xb2, 0x36, - 0x0e, 0x19, 0xa5, 0x8b, 0x1c, 0x32, 0xf0, 0x8b, 0x9e, 0x71, 0xdc, 0x1a, - 0x8d, 0x77, 0xa1, 0x03, 0x93, 0xaa, 0x7f, 0xe7, 0x60, 0x74, 0x8f, 0x65, - 0x25, 0xb5, 0xec, 0x5f, 0x05, 0xbb, 0x63, 0x1a, 0x54, 0xdf, 0xee, 0x35, - 0x29, 0x51, 0x36, 0xa4, 0xbd, 0x9a, 0xa0, 0x43, 0xc2, 0xbf, 0x42, 0x6c, - 0xc7, 0x21, 0xde, 0xd3, 0x65, 0x8d, 0x8b, 0x2e, 0x9e, 0x7f, 0xd4, 0x98, - 0x16, 0x27, 0x24, 0x5c, 0xc2, 0x30, 0xe7, 0x65, 0x4e, 0xee, 0x66, 0xde, - 0x51, 0x8a, 0x4f, 0x24, 0x66, 0x87, 0xb8, 0xb2, 0x74, 0x64, 0x9a, 0x87, - 0x64, 0x48, 0x29, 0xea, 0x0c, 0xbe, 0xe1, 0x61, 0x9f, 0x05, 0x98, 0xfd, - 0x54, 0xd8, 0x9d, 0x9d, 0x5f, 0x31, 0x29, 0x38, 0x05, 0x19, 0x88, 0xdb, - 0xbd, 0xed, 0xfe, 0x49, 0x57, 0x31, 0x0c, 0x03, 0x88, 0x20, 0xe1, 0x48, - 0x51, 0xa5, 0xbb, 0x9c, 0x9a, 0x60, 0xb3, 0x5c, 0x54, 0x8a, 0x05, 0xdf, - 0x94, 0x68, 0xd3, 0xee, 0xd7, 0x63, 0x52, 0xc3, 0x9d, 0x32, 0xa3, 0x48, - 0xa7, 0xee, 0xa3, 0x4b, 0xb9, 0xcc, 0x71, 0x73, 0xee, 0xd7, 0xce, 0xe0, - 0x06, 0xcc, 0x5d, 0x7a, 0x85, 0x7b, 0x91, 0x35, 0x4c, 0x26, 0x79, 0xf1, - 0xb0, 0x17, 0xb4, 0x41, 0x7c, 0x8d, 0xf4, 0x71, 0xd5, 0x5d, 0xa8, 0x86, - 0x7f, 0x05, 0x50, 0xda, 0x42, 0x0b, 0xfc, 0x00, 0x7e, 0x26, 0xe9, 0x8e, - 0xa0, 0x75, 0x78, 0x3d, 0xc9, 0xe0, 0x07, 0xe2, 0x3f, 0x71, 0xb1, 0x97, - 0xde, 0x53, 0x58, 0xc3, 0xb2, 0x2a, 0x29, 0xde, 0x05, 0x17, 0x26, 0x94, - 0x61, 0x67, 0x1f, 0xc7, 0xa1, 0x74, 0x47, 0x4c, 0x05, 0x5f, 0x53, 0x70, - 0x17, 0x11, 0x52, 0xc5, 0x2e, 0x52, 0xea, 0x92, 0x4f, 0xf4, 0x37, 0xd7, - 0xf8, 0x6b, 0x1b, 0x68, 0x72, 0x64, 0x08, 0xaf, 0x17, 0x85, 0x44, 0x21, - 0xd9, 0x1c, 0xc7, 0x55, 0x01, 0xf4, 0xc5, 0x83, 0x22, 0x25, 0xb0, 0xdb, - 0x1b, 0x2d, 0xb4, 0x6b, 0x69, 0x97, 0xac, 0x8c, 0xe0, 0x85, 0x7c, 0xcd, - 0xe2, 0xd7, 0x04, 0x18, 0x4c, 0x52, 0x4d, 0xa6, 0xc1, 0xf4, 0xc0, 0x2e, - 0xfb, 0xce, 0xb8, 0x62, 0xce, 0x8f, 0xfc, 0xa7, 0xf5, 0x81, 0x2d, 0xa9, - 0xd4, 0x1a, 0xfb, 0xcd, 0x8d, 0x6a, 0xd0, 0x42, 0x9c, 0x82, 0x2b, 0xad, - 0xdf, 0xa5, 0x25, 0xda, 0x2a, 0xa9, 0x76, 0x89, 0xc0, 0x7b, 0x88, 0x04, - 0xcb, 0x0e, 0xfe, 0x1e, 0xef, 0x8a, 0xc7, 0x75, 0xa6, 0x3b, 0xc6, 0x05, - 0x0f, 0x25, 0x77, 0x78, 0x59, 0x25, 0x18, 0x13, 0x39, 0x57, 0x19, 0xa6, - 0x0a, 0xe7, 0x3b, 0x6e, 0xbb, 0xed, 0x8c, 0xe1, 0xc5, 0x3b, 0xaf, 0x6a, - 0x11, 0xda, 0xe3, 0xec, 0x2b, 0x0a, 0xc1, 0x06, 0x64, 0xc5, 0xc8, 0x2c, - 0xf8, 0x0c, 0x7f, 0x35, 0xbc, 0x19, 0xc7, 0x87, 0xa2, 0x39, 0xcc, 0xb2, - 0xe1, 0x51, 0xf0, 0x76, 0x6d, 0x3d, 0x96, 0xef, 0x8f, 0xca, 0xb0, 0x81, - 0x3f, 0x82, 0x2a, 0xa1, 0xaf, 0x5e, 0xfa, 0xde, 0x57, 0xa3, 0x18, 0x29, - 0x58, 0x67, 0xaa, 0x24, 0x62, 0x0e, 0xa9, 0x22, 0x91, 0x60, 0x6b, 0xcd, - 0x68, 0x9b, 0x55, 0x67, 0x86, 0xbb, 0x40, 0xaf, 0x71, 0x93, 0x42, 0x25, - 0xc9, 0x17, 0x69, 0x08, 0x88, 0xae, 0xac, 0x05, 0x6e, 0x92, 0x16, 0x22, - 0x14, 0x8c, 0x81, 0x88, 0x3f, 0x23, 0x3b, 0xa1, 0x5a, 0x3f, 0x40, 0x88, - 0xfb, 0x9a, 0x89, 0xf7, 0x52, 0x4f, 0x17, 0x59, 0x42, 0x1d, 0x12, 0x32, - 0x3f, 0xfe, 0xa2, 0x43, 0x93, 0x24, 0x98, 0x68, 0x44, 0xd9, 0x31, 0x12, - 0xbd, 0xd2, 0xa6, 0xdc, 0xd2, 0x8e, 0x19, 0xfa, 0xde, 0x03, 0x3a, 0x17, - 0xf6, 0x31, 0x36, 0x98, 0x73, 0xa1, 0xd7, 0x8f, 0x45, 0x68, 0xa4, 0xd6, - 0x32, 0xad, 0xea, 0xf6, 0xd2, 0x2c, 0x49, 0x06, 0xb5, 0xca, 0xfc, 0x28, - 0x24, 0x72, 0xb5, 0x8e, 0x30, 0xfa, 0x55, 0x33, 0xab, 0x0e, 0xcc, 0xd4, - 0xf5, 0x22, 0x60, 0x8a, 0x1a, 0x51, 0x2b, 0x6e, 0x59, 0xc6, 0x20, 0xef, - 0x43, 0x99, 0x58, 0xe3, 0x55, 0x30, 0xed, 0x17, 0xf3, 0xcd, 0xd6, 0x72, - 0x75, 0x90, 0xd9, 0x91, 0xbc, 0xda, 0xd5, 0xb6, 0x88, 0x5d, 0xe4, 0xc8, - 0x9f, 0x00, 0x75, 0x24, 0xcb, 0xe6, 0x10, 0x25, 0xad, 0xac, 0xa2, 0x07, - 0xe2, 0x7c, 0x37, 0xcb, 0xca, 0x84, 0xb6, 0x65, 0x1d, 0xe8, 0xc2, 0xba, - 0xfe, 0x4e, 0xc7, 0x85, 0x92, 0xe5, 0x08, 0x8a, 0xef, 0xa0, 0xb9, 0xfe, - 0xc5, 0x69, 0x01, 0xc1, 0x0b, 0x4d, 0xd5, 0x92, 0xfd, 0xc4, 0x4c, 0x53, - 0xd1, 0x02, 0x6d, 0x70, 0xd1, 0x40, 0xbc, 0x37, 0x26, 0x82, 0x79, 0x1d, - 0x73, 0x09, 0xfa, 0xb6, 0xf9, 0xc3, 0x88, 0x5a, 0x0d, 0x0e, 0x03, 0x3f, - 0x9c, 0x5b, 0x5f, 0xba, 0xde, 0x47, 0x45, 0xe7, 0x5e, 0xef, 0x49, 0x27, - 0x4a, 0x94, 0x9b, 0xdc, 0x21, 0x0a, 0xca, 0x58, 0x90, 0x0d, 0xe3, 0x0d, - 0x6f, 0x00, 0xf5, 0xfa, 0x9a, 0x0c, 0x31, 0xec, 0x6e, 0x29, 0x99, 0x0b, - 0x47, 0xce, 0xe7, 0x1d, 0xfe, 0x34, 0x06, 0xe3, 0x80, 0x27, 0xcb, 0x14, - 0x44, 0x17, 0xc2, 0x69, 0x9e, 0x49, 0x72, 0xed, 0x0d, 0x5d, 0xc7, 0x87, - 0xe9, 0xbc, 0x33, 0xff, 0x69, 0xd7, 0x19, 0xb5, 0xd7, 0xed, 0x28, 0xdc, - 0x82, 0xf1, 0x6d, 0x28, 0x0e, 0x60, 0x3a, 0x57, 0x42, 0x6c, 0x9b, 0xbc, - 0xda, 0x56, 0xff, 0x82, 0x9f, 0x1c, 0x86, 0x94, 0x93, 0x13, 0x9c, 0x4a, - 0x81, 0x34, 0x83, 0x23, 0x80, 0x2a, 0x36, 0x11, 0x63, 0x0b, 0xcf, 0xc6, - 0xa9, 0x35, 0x99, 0x52, 0x96, 0x2a, 0x8a, 0xbc, 0x72, 0x3e, 0x12, 0x1e, - 0x37, 0x77, 0xd3, 0x4c, 0x0d, 0x86, 0xa6, 0x49, 0x77, 0xb3, 0x3f, 0xe2, - 0x4b, 0x8f, 0x64, 0x8c, 0x98, 0x2d, 0xc6, 0x92, 0xe6, 0xcf, 0x53, 0x80, - 0x06, 0xbc, 0xc9, 0xaa, 0x3d, 0x03, 0x3a, 0x6f, 0x99, 0x6c, 0xaf, 0x45, - 0xac, 0x22, 0x30, 0x14, 0x0e, 0x19, 0x65, 0x2d, 0x75, 0x6c, 0x49, 0x87, - 0xcd, 0x67, 0xa6, 0x9c, 0xfd, 0xae, 0x1c, 0xf6, 0x92, 0x04, 0x13, 0xfa, - 0x45, 0xc0, 0x33, 0x74, 0x0e, 0x5b, 0x4b, 0xd8, 0xee, 0xa6, 0x04, 0x83, - 0x37, 0x07, 0xf8, 0xbf, 0x96, 0xd2, 0x17, 0x77, 0xa3, 0xa9, 0x8a, 0x23, - 0x99, 0xb2, 0xc5, 0x04, 0xe6, 0x67, 0xfa, 0xab, 0xd9, 0x9a, 0x9e, 0x79, - 0x4c, 0x3f, 0xad, 0xab, 0x16, 0x40, 0x67, 0xb1, 0x17, 0xec, 0xb7, 0x6e, - 0x17, 0x3b, 0x22, 0x8b, 0x36, 0x04, 0x2a, 0xbd, 0x32, 0x8e, 0xcf, 0x94, - 0xb8, 0x48, 0x1a, 0xf2, 0x7d, 0x7d, 0x86, 0x9a, 0xfa, 0xae, 0xec, 0xb0, - 0x53, 0xd9, 0x6f, 0xda, 0xcb, 0xe3, 0x0d, 0x1a, 0x06, 0xaa, 0x4f, 0xe6, - 0x96, 0x41, 0x01, 0x0a, 0xfa, 0xc2, 0x12, 0xb1, 0xe0, 0xc7, 0xae, 0x2a, - 0x7c, 0x59, 0xff, 0x98, 0xf5, 0xe0, 0x12, 0x4e, 0xf1, 0x9a, 0xf5, 0xd9, - 0x70, 0xde, 0xcb, 0x8a, 0x5e, 0xa6, 0x43, 0xeb, 0x4a, 0x86, 0x0e, 0x40, - 0x67, 0x07, 0xe6, 0x7b, 0x72, 0x9b, 0x65, 0x01, 0xbb, 0x7b, 0x3e, 0x5a, - 0xb6, 0x49, 0x6c, 0xe7, 0x64, 0x61, 0x90, 0xaf, 0x48, 0xdb, 0xf8, 0x9c, - 0x9b, 0xf1, 0x9b, 0x86, 0xd2, 0x76, 0x71, 0xee, 0x08, 0x3e, 0xe5, 0x0f, - 0x34, 0x11, 0xcc, 0x68, 0x29, 0x3d, 0x66, 0xe1, 0x4a, 0xf1, 0x17, 0xb4, - 0x6f, 0xf7, 0x9f, 0x60, 0x21, 0xf4, 0xd3, 0x73, 0x50, 0x48, 0x6b, 0x98, - 0x44, 0x55, 0x60, 0xa0, 0x7d, 0xf2, 0xdd, 0xb0, 0x5a, 0x45, 0xce, 0x38, - 0x6a, 0xec, 0xe5, 0x43, 0x06, 0xe1, 0xbd, 0x3e, 0x4f, 0x85, 0xac, 0xc0, - 0xc4, 0xaf, 0xe6, 0x5e, 0xc2, 0x89, 0x5c, 0xe9, 0x3f, 0x08, 0x63, 0x01, - 0x66, 0x84, 0x0e, 0xe6, 0x50, 0xc4, 0x96, 0x26, 0x6c, 0x18, 0x64, 0x87, - 0x96, 0x70, 0x5d, 0xb3, 0x85, 0x36, 0x0a, 0x58, 0x51, 0x5d, 0xfb, 0x5a, - 0xf6, 0x13, 0xba, 0x9d, 0x02, 0x15, 0x28, 0xcc, 0x2e, 0x69, 0x31, 0xa2, - 0xc5, 0xf0, 0xc4, 0xf3, 0xec, 0xe7, 0xf9, 0x68, 0x8f, 0x0e, 0xba, 0xb0, - 0x9a, 0xe6, 0x6f, 0x65, 0x5c, 0x3a, 0x88, 0xb5, 0x34, 0x13, 0x0a, 0x46, - 0xad, 0x91, 0x36, 0x17, 0xc3, 0x77, 0x07, 0x55, 0x11, 0xa5, 0xdd, 0x00, - 0x57, 0xd8, 0xec, 0xe9, 0x03, 0x51, 0x43, 0x31, 0x12, 0x08, 0x74, 0x60, - 0x37, 0x8e, 0x95, 0xab, 0x0a, 0xc3, 0xa9, 0xf0, 0xd0, 0x3f, 0x29, 0xb8, - 0x87, 0x2e, 0xd8, 0x5c, 0xbe, 0x89, 0x54, 0x08, 0x82, 0xa3, 0x7c, 0x8f, - 0xfc, 0x81, 0x84, 0xf4, 0x90, 0xa6, 0xcd, 0x8e, 0x03, 0x51, 0x2d, 0x3b, - 0x57, 0xba, 0x3f, 0xb3, 0x32, 0xfe, 0x2e, 0xc3, 0xd7, 0xbe, 0x51, 0x75, - 0xcf, 0x1c, 0xf1, 0x4a, 0x51, 0xc4, 0xa8, 0x7d, 0x28, 0x7e, 0x42, 0x9f, - 0xfe, 0x84, 0x0e, 0x12, 0x40, 0xd2, 0xd7, 0x32, 0xc1, 0x05, 0xf5, 0xbf, - 0x07, 0xd5, 0xe1, 0xf4, 0x6f, 0xcc, 0x68, 0x8c, 0x9e, 0xcf, 0xa8, 0x47, - 0xba, 0x48, 0x98, 0x87, 0xad, 0xa3, 0xb9, 0xd9, 0x43, 0xc2, 0x4a, 0x65, - 0xc4, 0x23, 0x0f, 0x8c, 0x1d, 0xae, 0x1c, 0x71, 0x3f, 0x42, 0x9c, 0x5e, - 0x06, 0x1d, 0x46, 0xe8, 0x46, 0xd6, 0x4e, 0xd2, 0x88, 0x9b, 0xfc, 0xaf, - 0xff, 0xb9, 0x21, 0x78, 0x64, 0x29, 0x98, 0x76, 0x19, 0x18, 0x67, 0x5e, - 0xa3, 0xd6, 0xa3, 0x22, 0x47, 0xf9, 0x78, 0x98, 0x8b, 0x9c, 0x1c, 0x1c, - 0x1c, 0x46, 0x1d, 0xf7, 0xe8, 0x32, 0x0f, 0x03, 0xfc, 0x95, 0x5f, 0x94, - 0x04, 0x27, 0xaa, 0x57, 0x13, 0x26, 0xad, 0x48, 0xf0, 0x00, 0xb3, 0x0f, - 0x01, 0xbb, 0x82, 0x86, 0xd5, 0xda, 0xeb, 0xa0, 0xcd, 0x8e, 0x50, 0xa3, - 0x96, 0xa3, 0xf7, 0xf9, 0x4f, 0x40, 0x7b, 0x54, 0xbf, 0x37, 0x64, 0x00, - 0xad, 0x9b, 0xc2, 0xcb, 0xc9, 0x87, 0xdf, 0x1b, 0xfb, 0xb0, 0x9c, 0xdc, - 0xe0, 0xd7, 0x4a, 0x13, 0xda, 0xd4, 0x98, 0x68, 0x85, 0xcf, 0xa4, 0x7a, - 0x32, 0xce, 0xe1, 0x1b, 0x28, 0xb5, 0x58, 0x5f, 0x76, 0xa5, 0x6a, 0xc3, - 0xae, 0xbb, 0xf5, 0xb4, 0xca, 0x49, 0xf4, 0xa5, 0x6b, 0xfd, 0x3d, 0x52, - 0xbf, 0x4d, 0xcb, 0x83, 0xbb, 0xf8, 0xf4, 0x23, 0x0c, 0x8c, 0x60, 0x99, - 0xa2, 0x8e, 0xc3, 0xbe, 0x5b, 0xff, 0x48, 0x2b, 0x97, 0x02, 0xc3, 0x23, - 0xd6, 0x96, 0xb2, 0x19, 0x8c, 0x3b, 0xf8, 0xad, 0xed, 0xd6, 0xb8, 0x84, - 0xec, 0xb9, 0x9f, 0x64, 0xd5, 0x08, 0xe0, 0x30, 0xab, 0xf0, 0x0e, 0xce, - 0xcb, 0xfa, 0x10, 0x3b, 0x0f, 0xfa, 0xf8, 0x92, 0x10, 0xbf, 0xdd, 0xc1, - 0xe1, 0xab, 0x1a, 0xa5, 0x5d, 0x25, 0xd5, 0xfb, 0x15, 0xe8, 0xe4, 0x8e, - 0xa2, 0xa2, 0xae, 0x19, 0x95, 0x80, 0x77, 0x42, 0xb2, 0x48, 0x1e, 0xbf, - 0x6e, 0xda, 0x62, 0xb7, 0xce, 0xd4, 0xf9, 0xcf, 0xec, 0xde, 0xfb, 0xa6, - 0x3d, 0x8d, 0x2a, 0x40, 0x9e, 0xe4, 0xdf, 0xde, 0xac, 0x9f, 0xbc, 0xb3, - 0x84, 0xf5, 0x77, 0x74, 0xb8, 0x96, 0xcc, 0x35, 0xa1, 0x01, 0xfc, 0xa8, - 0xbd, 0xda, 0xc1, 0x7c, 0x55, 0x19, 0xb3, 0xb9, 0x99, 0x29, 0x58, 0x7b, - 0xdd, 0x2f, 0xd0, 0x29, 0xa9, 0xe4, 0x2b, 0xd1, 0x69, 0x06, 0x36, 0x33, - 0x8d, 0xb6, 0x81, 0x05, 0xb8, 0x4f, 0x64, 0x7b, 0x93, 0xe6, 0x8b, 0xc7, - 0x2a, 0x34, 0x34, 0xa9, 0xac, 0x11, 0x9c, 0x3b, 0xf9, 0x55, 0x34, 0xee, - 0x26, 0x00, 0xbf, 0x1e, 0xc4, 0xef, 0xb0, 0xda, 0x59, 0x4e, 0xb9, 0xe0, - 0x48, 0x19, 0x66, 0x10, 0x3f, 0xad, 0x97, 0x66, 0x1e, 0x3d, 0x10, 0x34, - 0x2c, 0x66, 0x2f, 0x06, 0x14, 0x4a, 0xd7, 0x9a, 0xff, 0x16, 0xed, 0x57, - 0xd7, 0x0e, 0x25, 0xb4, 0x09, 0x6a, 0x5a, 0x74, 0xdf, 0x8a, 0x12, 0x0b, - 0xc1, 0xb4, 0x17, 0x13, 0x82, 0x1e, 0x44, 0x69, 0x0d, 0xbb, 0xf2, 0x4c, - 0x67, 0x62, 0x2e, 0xee, 0xce, 0xba, 0xcb, 0x63, 0xb9, 0x9b, 0x50, 0x7c, - 0x0f, 0xa9, 0x80, 0x08, 0xab, 0x9c, 0x0c, 0x24, 0x44, 0x6d, 0xf3, 0xaa, - 0x37, 0xc7, 0xc4, 0xd5, 0xd7, 0x63, 0x72, 0x1f, 0x77, 0x26, 0xf6, 0x1b, - 0x41, 0x51, 0x53, 0x7c, 0x46, 0x9d, 0x51, 0x69, 0x3d, 0x0c, 0xd6, 0x88, - 0x48, 0xbf, 0x29, 0xe4, 0x3a, 0xbd, 0x65, 0x9c, 0xde, 0x65, 0x2e, 0xaf, - 0x44, 0xe6, 0x7c, 0x7c, 0xdb, 0x93, 0x2c, 0xd4, 0x85, 0x8b, 0x90, 0xc6, - 0x64, 0x27, 0x33, 0xf8, 0x26, 0x09, 0xac, 0xb1, 0xf7, 0x85, 0xa7, 0xfe, - 0x96, 0xce, 0x27, 0xa3, 0xc6, 0xae, 0xb3, 0x95, 0x1c, 0xc0, 0x7f, 0x9e, - 0xc6, 0x5b, 0x17, 0x7e, 0x3e, 0x23, 0xea, 0x58, 0xf6, 0x75, 0xf1, 0xc6, - 0x9e, 0x39, 0xa7, 0xab, 0xea, 0xe7, 0x95, 0x83, 0x32, 0x48, 0x47, 0xfc, - 0xcb, 0xbe, 0xe4, 0x04, 0xd7, 0x58, 0xb7, 0x24, 0x89, 0x45, 0xfa, 0x20, - 0xa1, 0x03, 0x8d, 0xe2, 0x7a, 0x96, 0x9b, 0xda, 0x74, 0xcc, 0x8d, 0x5e, - 0x40, 0x37, 0xf1, 0xbe, 0x35, 0x9b, 0x42, 0x6a, 0x5a, 0x01, 0xef, 0x5e, - 0xfc, 0x27, 0xb6, 0x30, 0x1a, 0xc2, 0xc5, 0xff, 0x53, 0x50, 0xa5, 0x87, - 0x35, 0x51, 0x8d, 0xa9, 0x1b, 0xdd, 0xde, 0xd6, 0xed, 0xb4, 0x39, 0x33, - 0x3b, 0x14, 0xba, 0x1a, 0x00, 0x1b, 0xcb, 0xe3, 0xa9, 0xbe, 0xfd, 0xb3, - 0x29, 0xaa, 0x79, 0x06, 0x2c, 0xf6, 0x7e, 0xe0, 0xe8, 0x51, 0xf7, 0xec, - 0x90, 0x3d, 0xe1, 0x93, 0x1e, 0xcb, 0x91, 0xcd, 0xcb, 0x03, 0x31, 0x90, - 0xaa, 0x81, 0x5d, 0x44, 0x1c, 0xd1, 0xc0, 0xb1, 0x39, 0xa0, 0xf3, 0x41, - 0x52, 0xde, 0x53, 0xbe, 0xa1, 0x05, 0x33, 0x1b, 0xc8, 0x35, 0x4d, 0x5a, - 0xea, 0x1b, 0x57, 0xe8, 0xf3, 0x30, 0x50, 0xec, 0x6b, 0xd1, 0x05, 0x24, - 0x76, 0xf8, 0x30, 0xc3, 0x98, 0x6f, 0x8b, 0xdf, 0xa7, 0xe7, 0x63, 0x5d, - 0xb2, 0xf4, 0x4d, 0x43, 0x21, 0xa7, 0x1f, 0x24, 0xda, 0xf7, 0x33, 0xd5, - 0xeb, 0x28, 0x26, 0x76, 0x33, 0x5d, 0x5c, 0x46, 0x7c, 0xfa, 0x35, 0x4e, - 0xd2, 0xdf, 0xf5, 0xeb, 0x4b, 0x47, 0xbf, 0x0d, 0xf6, 0x19, 0x9e, 0x5d, - 0x62, 0xaa, 0x19, 0xe8, 0x8c, 0xbd, 0x11, 0xa7, 0x91, 0x42, 0xf2, 0x9e, - 0x9a, 0x6f, 0x99, 0xe7, 0x70, 0x06, 0x22, 0xa5, 0xa6, 0x45, 0x7e, 0x05, - 0xa2, 0x58, 0x99, 0x03, 0x20, 0xdf, 0x3b, 0x48, 0xf9, 0xf9, 0x92, 0xd3, - 0xa2, 0xbd, 0x0c, 0x28, 0x7f, 0xa5, 0x4d, 0x44, 0x48, 0xe4, 0xce, 0x07, - 0x96, 0x8d, 0x0b, 0x4e, 0xe8, 0x8f, 0x87, 0x6d, 0xe2, 0xec, 0x34, 0x5f, - 0x40, 0x77, 0xb9, 0xae, 0x13, 0x3f, 0xe1, 0xb6, 0xdc, 0x01, 0xba, 0xa0, - 0x04, 0xd7, 0x98, 0xd5, 0x22, 0xc9, 0x97, 0x46, 0xc8, 0xd1, 0x61, 0x2b, - 0xe0, 0x8b, 0xa1, 0x06, 0x58, 0x06, 0xad, 0x65, 0x14, 0x91, 0x9d, 0xc4, - 0x4d, 0x17, 0x88, 0x7b, 0xe7, 0x5a, 0x4d, 0x58, 0xca, 0xc1, 0xbd, 0xee, - 0xe4, 0xf2, 0x7c, 0x86, 0xa2, 0xe0, 0xfa, 0x18, 0xa3, 0x58, 0x20, 0x3a, - 0x25, 0xd4, 0x35, 0xbc, 0xc1, 0x1e, 0x87, 0xaf, 0x64, 0xf8, 0x2c, 0xd0, - 0xe6, 0x9f, 0xc7, 0xbe, 0xf0, 0x67, 0x76, 0x1d, 0xd3, 0x1e, 0xae, 0x7a, - 0x35, 0x48, 0x36, 0x6c, 0xb6, 0xff, 0x98, 0xf0, 0x01, 0xcd, 0xad, 0x41, - 0x10, 0xbe, 0xe4, 0xf7, 0x57, 0x9c, 0x63, 0xff, 0xfc, 0xe5, 0x69, 0x9a, - 0xe6, 0x8a, 0x3b, 0xb3, 0x21, 0xc6, 0xde, 0x2c, 0x30, 0x82, 0xc9, 0x2c, - 0xbd, 0x85, 0x70, 0xa1, 0xb3, 0x2d, 0xb9, 0xe7, 0xa1, 0x57, 0x3d, 0x80, - 0xf7, 0xd6, 0x82, 0x08, 0xd5, 0x12, 0xbd, 0x63, 0xc5, 0x27, 0x1f, 0x7d, - 0xbb, 0x33, 0x29, 0x4f, 0xec, 0x3a, 0xa4, 0x19, 0xec, 0xe2, 0xec, 0x53, - 0xce, 0x15, 0xdb, 0x4d, 0x27, 0x8b, 0xa1, 0xa1, 0x8d, 0xb9, 0xa4, 0x0b, - 0xe7, 0x57, 0x4a, 0x87, 0x6b, 0x8c, 0xb0, 0x37, 0x0d, 0x1f, 0x1c, 0xe6, - 0xb7, 0x67, 0xe0, 0x0d, 0x8d, 0x8c, 0x46, 0x94, 0x4a, 0xd5, 0x62, 0x64, - 0xda, 0x21, 0xf8, 0x9b, 0x23, 0xf5, 0xce, 0x29, 0xf4, 0x9c, 0x6b, 0x1d, - 0xf8, 0xb8, 0x5f, 0xba, 0x47, 0x9f, 0x07, 0x82, 0xbd, 0x61, 0xc4, 0x20, - 0xde, 0xc0, 0x3c, 0xf4, 0xac, 0xb2, 0x99, 0xb7, 0xc9, 0x37, 0x81, 0xf6, - 0x50, 0x01, 0x80, 0xe1, 0x7b, 0x87, 0xd9, 0x6e, 0x7f, 0x0a, 0xf8, 0xe2, - 0x2b, 0x92, 0xbf, 0x33, 0xd4, 0x6e, 0xd3, 0xd4, 0xc4, 0x40, 0xe6, 0xec, - 0xd0, 0x99, 0x07, 0x30, 0xac, 0x9f, 0x53, 0x10, 0x33, 0xf2, 0xae, 0xd5, - 0xf8, 0x63, 0xe6, 0x30, 0x24, 0x32, 0xff, 0xd1, 0x33, 0x4b, 0x81, 0x1e, - 0xf3, 0xe9, 0x30, 0xe3, 0xa8, 0x17, 0x3d, 0xb7, 0xe5, 0x4c, 0x78, 0x5a, - 0x8c, 0x6d, 0x13, 0x61, 0xa8, 0x74, 0x9c, 0xaf, 0x7c, 0x0f, 0x50, 0x12, - 0x65, 0xa2, 0x01, 0x2b, 0x43, 0x1c, 0x85, 0xc8, 0x86, 0x45, 0xcb, 0x96, - 0xcc, 0x41, 0x00, 0x61, 0x27, 0x47, 0xcd, 0x57, 0xff, 0x63, 0x51, 0x6f, - 0xf1, 0x83, 0x12, 0x3e, 0xfc, 0xc8, 0xff, 0x2d, 0x00, 0x73, 0xda, 0x44, - 0x90, 0xe3, 0x5e, 0x2d, 0xb8, 0x19, 0x8f, 0xed, 0x04, 0x43, 0xfa, 0xe1, - 0x07, 0xe3, 0x53, 0x09, 0xc0, 0x10, 0x6c, 0xe7, 0xd0, 0xc6, 0xae, 0x4d, - 0x34, 0xb7, 0x19, 0x0a, 0xbb, 0x74, 0x9a, 0x9e, 0xcb, 0x3a, 0x42, 0x64, - 0x1a, 0x19, 0x7e, 0xdf, 0xd5, 0xf7, 0x42, 0x27, 0x07, 0x36, 0x24, 0x86, - 0x64, 0xfc, 0x37, 0x75, 0xd6, 0xd4, 0x21, 0xf6, 0xe6, 0x1a, 0x04, 0xd3, - 0x17, 0xe8, 0x91, 0x2f, 0x8a, 0xd8, 0x7a, 0x0c, 0x19, 0x0d, 0xd7, 0x98, - 0x33, 0xc7, 0x2d, 0x9e, 0x43, 0xea, 0x36, 0xb2, 0x6d, 0x70, 0x04, 0x25, - 0xd8, 0xc6, 0xc1, 0xd5, 0x11, 0x7f, 0x3b, 0x28, 0x6e, 0x73, 0xbd, 0x18, - 0x5a, 0x12, 0x82, 0xad, 0xdc, 0x35, 0x38, 0x5f, 0xa7, 0xb5, 0x9f, 0x2e, - 0x29, 0xd2, 0xa1, 0xeb, 0x55, 0x6d, 0xcb, 0x36, 0xfe, 0x44, 0xd9, 0x4c, - 0x1b, 0xf6, 0x29, 0x96, 0x82, 0x90, 0x40, 0xd6, 0x1d, 0xef, 0x51, 0x82, - 0x00, 0x87, 0x27, 0x18, 0x55, 0x19, 0x4b, 0x9c, 0x7b, 0x32, 0xae, 0x02, - 0xb7, 0x97, 0x96, 0xe3, 0x05, 0x2b, 0x98, 0xf9, 0x82, 0xe8, 0x32, 0xb6, - 0xc8, 0x76, 0x59, 0x3d, 0x32, 0xde, 0x9f, 0x16, 0xb9, 0x26, 0x66, 0xb8, - 0x7e, 0x74, 0x86, 0x7d, 0x60, 0x44, 0xa3, 0x73, 0xad, 0x83, 0xef, 0x33, - 0xf3, 0x1c, 0x43, 0x5c, 0x15, 0xd7, 0xc6, 0xb9, 0xf6, 0x52, 0xae, 0x59, - 0xa3, 0x16, 0x19, 0xe6, 0xdd, 0x27, 0xc0, 0xcb, 0x76, 0x51, 0x1f, 0x20, - 0x2f, 0x59, 0xd3, 0x32, 0x8a, 0xc4, 0x88, 0xca, 0x01, 0x96, 0x3e, 0x3a, - 0x5f, 0x1f, 0x31, 0x6c, 0x1a, 0xcc, 0x54, 0xf2, 0x3c, 0x22, 0xf6, 0x47, - 0x99, 0x89, 0xb0, 0x58, 0x58, 0x8a, 0xe0, 0x06, 0x0d, 0xb6, 0x91, 0x27, - 0xce, 0xe4, 0xc1, 0x49, 0xd2, 0x60, 0x39, 0x23, 0x3e, 0x41, 0xb5, 0x49, - 0x91, 0x07, 0xdb, 0xbd, 0x6f, 0x98, 0xee, 0x0f, 0xa8, 0xf5, 0x6f, 0x14, - 0xaf, 0x98, 0xc7, 0x2b, 0x5d, 0x47, 0xdd, 0xfb, 0x14, 0x14, 0x12, 0x6d, - 0xf2, 0x5f, 0xf7, 0xcd, 0xf6, 0xdd, 0xf5, 0x6d, 0x61, 0x3a, 0xfe, 0xdb, - 0x20, 0x2a, 0x47, 0x87, 0x3f, 0x5a, 0x75, 0xfc, 0x37, 0x8a, 0x5f, 0xf6, - 0x20, 0x37, 0x53, 0x0c, 0xf8, 0xa5, 0x3a, 0x82, 0x6b, 0x41, 0xe8, 0xec, - 0x1c, 0xc5, 0xdc, 0xec, 0xe9, 0x04, 0xe0, 0xbb, 0x1f, 0x37, 0x27, 0xea, - 0x5f, 0xde, 0x5a, 0x7b, 0xd7, 0xaa, 0x12, 0x8f, 0xc5, 0xf5, 0x81, 0xaf, - 0xae, 0xa3, 0x25, 0x3a, 0x65, 0x3c, 0x80, 0xd0, 0x7c, 0x81, 0xec, 0x20, - 0x6a, 0xa0, 0x25, 0xeb, 0x2c, 0x40, 0xe3, 0xc0, 0x83, 0xfd, 0xe3, 0xf1, - 0xd6, 0x59, 0xbb, 0x11, 0x50, 0x32, 0x52, 0x4c, 0x39, 0x65, 0xdb, 0x93, - 0xeb, 0x8c, 0x71, 0x31, 0x93, 0xdb, 0x62, 0x64, 0x03, 0x80, 0xa8, 0x02, - 0xe7, 0x8e, 0x0c, 0xe6, 0xff, 0x1e, 0xcc, 0x19, 0x46, 0x12, 0x39, 0xf6, - 0x00, 0x6d, 0x4b, 0x44, 0x20, 0xa4, 0x52, 0x65, 0xff, 0xb4, 0x64, 0x30, - 0xd3, 0x91, 0x55, 0x9f, 0x12, 0x35, 0xfa, 0x3c, 0x9a, 0x5b, 0x0e, 0x7c, - 0xfe, 0x23, 0xa9, 0x88, 0x11, 0xee, 0x08, 0x0a, 0x7c, 0xdc, 0x94, 0x34, - 0x70, 0xae, 0x1c, 0x45, 0x26, 0xb1, 0xed, 0x8a, 0xe7, 0x00, 0x09, 0x40, - 0x7c, 0xd7, 0x14, 0x3e, 0x5b, 0xb0, 0x07, 0xf7, 0x9f, 0x83, 0x8c, 0x1a, - 0x33, 0xa8, 0x47, 0x3e, 0x9a, 0x56, 0x2d, 0xb9, 0x8c, 0x69, 0x9e, 0x5f, - 0x2f, 0x91, 0x5f, 0xe6, 0x7b, 0xde, 0x17, 0xb1, 0x34, 0x8a, 0xe8, 0x38, - 0xfa, 0x19, 0xb2, 0x96, 0xc5, 0x6b, 0x08, 0x86, 0xdf, 0x2b, 0x09, 0x41, - 0x0e, 0x96, 0x1d, 0x45, 0x74, 0xae, 0xfb, 0xf2, 0xa1, 0x30, 0xea, 0xc0, - 0xb7, 0xb8, 0xdb, 0x0b, 0x94, 0x3e, 0xe8, 0x82, 0x23, 0x51, 0x61, 0x0b, - 0x78, 0xcc, 0xfb, 0x95, 0x12, 0x5b, 0xdc, 0x91, 0x08, 0xeb, 0x26, 0xd1, - 0x96, 0x71, 0x18, 0xb9, 0x8c, 0x9d, 0x0f, 0x89, 0x0b, 0x96, 0xc4, 0xb1, - 0x8f, 0x62, 0x70, 0xab, 0xe1, 0x69, 0xde, 0xfb, 0xd7, 0x53, 0x0e, 0xbd, - 0x48, 0xf1, 0x56, 0x50, 0x95, 0xe7, 0x7f, 0x82, 0xc0, 0x14, 0x3d, 0x5c, - 0xed, 0x60, 0xb1, 0x28, 0x6d, 0xe3, 0xe0, 0xdc, 0xac, 0x68, 0xc0, 0x54, - 0x88, 0x0a, 0x5d, 0x55, 0x02, 0xa8, 0xd8, 0x20, 0x64, 0x21, 0xfb, 0x89, - 0x74, 0x29, 0x4c, 0x56, 0x8b, 0xcc, 0xa1, 0x2a, 0x22, 0x81, 0x3e, 0x38, - 0xd1, 0x7e, 0x69, 0x4a, 0x8d, 0x97, 0x6e, 0xf2, 0xf1, 0xa2, 0x81, 0x3c, - 0x36, 0x38, 0x7a, 0xb4, 0x90, 0xa7, 0x6f, 0x50, 0x8e, 0x1f, 0x8f, 0xc9, - 0xd9, 0x44, 0x2e, 0xe6, 0xe9, 0x71, 0xdc, 0xd4, 0x34, 0x9c, 0xa3, 0xb4, - 0x88, 0xd4, 0xe2, 0x04, 0x4a, 0x0c, 0x66, 0x47, 0x34, 0x23, 0x22, 0x30, - 0x95, 0xec, 0x89, 0x6f, 0xe4, 0x35, 0xf1, 0x83, 0xad, 0x99, 0x76, 0xbc, - 0x26, 0xd9, 0xa8, 0xfc, 0xa2, 0x4c, 0x7c, 0xcd, 0x27, 0x0a, 0x97, 0x32, - 0x17, 0xa6, 0xef, 0x7b, 0x46, 0x3c, 0xb0, 0xd8, 0x58, 0xbc, 0x0d, 0xb5, - 0xf8, 0x66, 0x8a, 0x21, 0x05, 0x7e, 0x55, 0x30, 0x9a, 0x10, 0xc2, 0xc6, - 0xd1, 0x88, 0x3d, 0x4e, 0xa6, 0x34, 0x89, 0xc6, 0xae, 0x5c, 0x8d, 0x9c, - 0x5d, 0xd4, 0x10, 0xba, 0x00, 0xb2, 0x5d, 0x7b, 0x22, 0x11, 0x0a, 0x35, - 0x58, 0xe3, 0x22, 0x14, 0xd8, 0x3d, 0x90, 0x32, 0xa6, 0x4d, 0xc9, 0xe4, - 0x02, 0xaf, 0x4c, 0x8b, 0x35, 0x9e, 0xd8, 0x94, 0x12, 0x25, 0x18, 0x81, - 0xe8, 0xb0, 0x96, 0xfd, 0x14, 0x1a, 0xfa, 0xdc, 0xb8, 0xd1, 0xed, 0xbe, - 0xff, 0x30, 0xe5, 0xef, 0x30, 0xf5, 0xf8, 0x1b, 0xc5, 0x8f, 0xa0, 0x45, - 0xbe, 0x8a, 0xa2, 0x34, 0x4a, 0x39, 0x73, 0xf1, 0xb0, 0x74, 0x94, 0x18, - 0xce, 0x2d, 0xee, 0x9c, 0x91, 0x75, 0x54, 0x6d, 0xaa, 0x33, 0x62, 0x5b, - 0x1d, 0x89, 0x58, 0x75, 0xdf, 0x2e, 0xe1, 0x50, 0x22, 0xb3, 0xd8, 0x40, - 0x63, 0x25, 0xae, 0xcb, 0xb3, 0x73, 0x0a, 0x67, 0x7e, 0xf3, 0xb9, 0xe9, - 0xa1, 0x8a, 0x4c, 0x6b, 0xd3, 0x0e, 0xca, 0xeb, 0x0d, 0xe1, 0xf4, 0x5c, - 0x9f, 0x6c, 0x33, 0x93, 0xb2, 0x41, 0x02, 0xb2, 0x91, 0x24, 0x7a, 0x09, - 0xa1, 0x94, 0xae, 0x96, 0x49, 0xa1, 0x0d, 0x30, 0x1f, 0x08, 0x0c, 0x87, - 0x1e, 0xa9, 0xc5, 0x8f, 0x5f, 0x14, 0x58, 0x19, 0xd8, 0xc6, 0x65, 0xfa, - 0x62, 0x9f, 0x1d, 0x1c, 0x89, 0xe0, 0x4a, 0x67, 0x1d, 0x68, 0xce, 0x1a, - 0xee, 0xb9, 0x76, 0x8e, 0x2e, 0xdc, 0x5f, 0x4c, 0xb9, 0x4c, 0x9a, 0x23, - 0x8b, 0x58, 0xd1, 0x67, 0x0f, 0x01, 0xc4, 0xc7, 0xbe, 0xbd, 0x3d, 0x07, - 0x71, 0x1d, 0x88, 0x06, 0x9a, 0x5b, 0x65, 0x16, 0xd3, 0x0b, 0x55, 0xb1, - 0xa3, 0x47, 0x81, 0x1a, 0xc4, 0xad, 0x36, 0xb2, 0x0c, 0xa4, 0x7f, 0x65, - 0x6e, 0x70, 0xa6, 0x10, 0x22, 0xa2, 0x15, 0x72, 0xc7, 0xc4, 0xaa, 0xe2, - 0x65, 0x97, 0xb0, 0x66, 0x0c, 0x03, 0x8a, 0xe1, 0x32, 0x48, 0x94, 0x03, - 0x84, 0x74, 0x7f, 0x8d, 0x05, 0xc9, 0xbb, 0x29, 0x5b, 0x34, 0x1c, 0x54, - 0xa3, 0xa2, 0xd4, 0x7d, 0x59, 0x18, 0xa0, 0x4c, 0x4d, 0x80, 0xe3, 0x0e, - 0x4b, 0x1b, 0xea, 0xd7, 0xfc, 0xe0, 0x42, 0xa0, 0x5e, 0x8c, 0xc5, 0x5f, - 0x16, 0x98, 0x61, 0x48, 0xc8, 0x43, 0x15, 0xf9, 0xc1, 0x88, 0xea, 0x7b, - 0xac, 0xe4, 0x93, 0x15, 0xb6, 0x61, 0x65, 0xda, 0x0c, 0xbd, 0xfb, 0xcb, - 0xca, 0x35, 0x7b, 0x6e, 0x5d, 0xb5, 0xcb, 0x4b, 0x1f, 0x91, 0x72, 0xe7, - 0x8d, 0x27, 0x3f, 0xf3, 0x06, 0x17, 0xbf, 0x98, 0xdb, 0xb6, 0xd6, 0x78, - 0x4f, 0x1c, 0x48, 0x43, 0x18, 0x4d, 0xb0, 0x9c, 0x4a, 0xaf, 0x11, 0xf3, - 0x90, 0x44, 0xc0, 0x01, 0x59, 0xdc, 0xd9, 0x28, 0x55, 0x81, 0x24, 0xa9, - 0x78, 0x1e, 0x12, 0x1a, 0x76, 0x23, 0xd0, 0x42, 0x3e, 0xe4, 0x7f, 0xe6, - 0x09, 0x9a, 0xbd, 0xbd, 0x36, 0xe0, 0x63, 0xbf, 0xc1, 0x93, 0x4b, 0xd9, - 0x18, 0x9e, 0x6a, 0x30, 0x40, 0xd4, 0xde, 0xae, 0xfa, 0xb6, 0x58, 0x66, - 0x2e, 0x08, 0xbd, 0x21, 0x3d, 0x78, 0x9d, 0xdb, 0xdd, 0xa1, 0xb7, 0x23, - 0xd3, 0x48, 0x3b, 0x2b, 0x33, 0x4f, 0x76, 0x04, 0xfd, 0xe5, 0xf3, 0xd5, - 0xcf, 0x81, 0x5f, 0xcf, 0x5b, 0xa3, 0xbd, 0xca, 0x5a, 0xa1, 0x1b, 0x48, - 0x3a, 0x49, 0xbf, 0x21, 0x88, 0x84, 0x4d, 0xec, 0x13, 0x67, 0x0b, 0xa2, - 0x10, 0x4e, 0xc6, 0x02, 0xb9, 0x8c, 0x0d, 0x37, 0x7e, 0x5f, 0xb1, 0xad, - 0x16, 0x7d, 0xfe, 0x8b, 0xb5, 0x64, 0x67, 0x0b, 0xe4, 0x4d, 0x5a, 0xc5, - 0xfe, 0xdf, 0x6a, 0x32, 0xdd, 0x39, 0x28, 0x43, 0x39, 0x97, 0x70, 0xd2, - 0x57, 0xc1, 0xe0, 0x55, 0xd2, 0x42, 0xc8, 0xcb, 0x8b, 0xe3, 0x5a, 0xcc, - 0x75, 0x3f, 0x66, 0x7a, 0x0d, 0xa6, 0x51, 0x42, 0x32, 0x03, 0xb7, 0xeb, - 0x43, 0x2e, 0xa0, 0x39, 0x54, 0x52, 0x3b, 0xcc, 0x26, 0x02, 0x38, 0x92, - 0x15, 0x53, 0xf2, 0xa6, 0x01, 0x46, 0x53, 0x66, 0xfd, 0x81, 0xfb, 0xeb, - 0xc5, 0xc9, 0xdb, 0x09, 0x92, 0x96, 0xdc, 0xea, 0xb2, 0x54, 0x20, 0xcd, - 0xc5, 0x17, 0xb0, 0x7e, 0xd7, 0x3d, 0x3f, 0xe1, 0xd1, 0xbd, 0x42, 0x3c, - 0x38, 0xa3, 0xe7, 0xcc, 0xda, 0x6e, 0xfa, 0x7d, 0xea, 0xcd, 0xdf, 0x80, - 0xee, 0x7a, 0xc1, 0xe0, 0xc1, 0x4b, 0x90, 0x92, 0xec, 0xc8, 0x94, 0xd2, - 0xfe, 0xe4, 0x49, 0xe3, 0x0e, 0xef, 0xa6, 0x68, 0xe0, 0x11, 0xf7, 0xac, - 0xa6, 0xa4, 0x06, 0x32, 0xc5, 0xae, 0x4e, 0x27, 0xa0, 0xec, 0x88, 0x42, - 0x15, 0x73, 0x63, 0xf7, 0x21, 0x5e, 0x23, 0x53, 0x62, 0xbd, 0x76, 0x03, - 0x88, 0x11, 0x87, 0x24, 0x1b, 0x46, 0x00, 0xee, 0xc1, 0x81, 0x13, 0x13, - 0x00, 0x0b, 0xc3, 0x93, 0xe4, 0x95, 0x5a, 0x15, 0x67, 0xf8, 0x65, 0x53, - 0xa3, 0x57, 0x7a, 0xcf, 0xc7, 0x67, 0xb0, 0x2c, 0xbd, 0x7a, 0xa8, 0xe6, - 0x06, 0x90, 0x9d, 0x89, 0xf3, 0x9f, 0x61, 0xb7, 0x00, 0xb4, 0x04, 0x9f, - 0xfa, 0x98, 0x2c, 0xc3, 0xee, 0x21, 0x9f, 0x63, 0x2e, 0x45, 0x65, 0xcb, - 0x4e, 0x04, 0x61, 0x99, 0x40, 0x9e, 0x95, 0x65, 0x88, 0xa0, 0xe7, 0x05, - 0x24, 0xd5, 0x80, 0x70, 0x14, 0xb5, 0xc9, 0x08, 0x00, 0xa4, 0x07, 0xbd, - 0x42, 0xf6, 0xd8, 0x03, 0x26, 0xdd, 0xcf, 0x00, 0x96, 0xa2, 0xcb, 0xc8, - 0xd4, 0xc0, 0xf0, 0x2f, 0x7d, 0xef, 0x57, 0xcd, 0xe6, 0x96, 0x6d, 0x34, - 0xdf, 0x63, 0x8e, 0x38, 0x19, 0xdb, 0x81, 0xd3, 0x85, 0xa8, 0xb4, 0x22, - 0x7c, 0xa4, 0x7c, 0x50, 0x83, 0x42, 0x59, 0xc5, 0x97, 0x97, 0x14, 0x35, - 0x0e, 0x09, 0xcc, 0x67, 0x6d, 0xb7, 0x7d, 0x42, 0xb7, 0x7f, 0x69, 0x32, - 0xd4, 0x4f, 0x4d, 0x07, 0x24, 0xb1, 0x80, 0xc1, 0x9d, 0x3e, 0xd0, 0x39, - 0x58, 0xb4, 0xb9, 0x01, 0x2a, 0xeb, 0x41, 0x37, 0xc8, 0x50, 0x50, 0x20, - 0x3c, 0xf4, 0xc7, 0x4f, 0xc6, 0x43, 0x06, 0xf2, 0xa9, 0x76, 0x9c, 0xaa, - 0x87, 0x42, 0x66, 0xf7, 0xbf, 0xfb, 0xaf, 0x1f, 0x66, 0x19, 0xdd, 0x3c, - 0xea, 0x69, 0x60, 0x83, 0xcc, 0x84, 0x7b, 0x6a, 0x68, 0x57, 0xb5, 0xff, - 0x05, 0x9c, 0xe1, 0x5d, 0x09, 0x0b, 0x27, 0xc7, 0x60, 0xeb, 0x2a, 0x30, - 0xbd, 0xe4, 0xda, 0xc0, 0x3d, 0x1a, 0x80, 0x85, 0x24, 0xcb, 0x83, 0xc7, - 0x3f, 0xf2, 0x73, 0xc2, 0x8a, 0xd2, 0xca, 0x9d, 0xb9, 0x51, 0x6c, 0xc6, - 0xce, 0x96, 0xa7, 0xb5, 0x99, 0xd9, 0xe4, 0x63, 0x4b, 0x36, 0x5b, 0x0b, - 0x8d, 0xce, 0x12, 0x21, 0x21, 0xde, 0x30, 0x1b, 0xf2, 0x66, 0x76, 0x3c, - 0xe5, 0x1c, 0x57, 0x70, 0xa4, 0x73, 0x70, 0x41, 0x73, 0x6e, 0x7d, 0xc9, - 0x74, 0x52, 0xb8, 0x71, 0x71, 0x60, 0xb9, 0xd7, 0x65, 0x88, 0xe9, 0x88, - 0x92, 0x64, 0x98, 0xee, 0x4d, 0x51, 0x79, 0x6c, 0x48, 0xdb, 0x85, 0xab, - 0x0e, 0xb4, 0xd6, 0xc1, 0xe5, 0xe1, 0xc8, 0xf0, 0xd6, 0x03, 0x38, 0x10, - 0xa9, 0x52, 0xec, 0x88, 0xe6, 0x1c, 0x04, 0x7a, 0xd7, 0xe3, 0x1d, 0xe1, - 0x57, 0xed, 0xe7, 0x11, 0x82, 0xd6, 0xa0, 0x45, 0x2b, 0x34, 0x1a, 0xa6, - 0x48, 0x65, 0x8e, 0xd0, 0x43, 0x84, 0x11, 0x41, 0x11, 0xad, 0xfd, 0x7b, - 0x94, 0x17, 0xda, 0x42, 0x0f, 0xe2, 0x68, 0x8a, 0xa9, 0x01, 0x77, 0xac, - 0xa2, 0x73, 0xc2, 0x41, 0xff, 0x48, 0xab, 0x48, 0xfd, 0x00, 0x72, 0x4d, - 0x7f, 0xf4, 0x99, 0x82, 0xff, 0x79, 0x5d, 0x8b, 0x22, 0x45, 0x56, 0x94, - 0xb7, 0x52, 0x18, 0x99, 0xf4, 0x86, 0x05, 0x1e, 0x5e, 0x6f, 0xa4, 0xb7, - 0xd1, 0x96, 0x11, 0xc9, 0x6f, 0x63, 0x5e, 0xc8, 0x30, 0xd6, 0x29, 0x63, - 0x95, 0x93, 0xb6, 0xbb, 0x6a, 0x23, 0x4f, 0xb4, 0x33, 0x49, 0x41, 0xbf, - 0xef, 0x32, 0xa8, 0x40, 0x11, 0xaa, 0x97, 0xfc, 0x8c, 0x39, 0xc8, 0x7e, - 0x88, 0xe7, 0xe7, 0xa2, 0xe3, 0x8d, 0x38, 0x0e, 0x56, 0x44, 0x5f, 0x55, - 0x2c, 0x39, 0x23, 0x89, 0xed, 0xba, 0x79, 0x0e, 0x73, 0x13, 0x00, 0x43, - 0x01, 0xda, 0x3c, 0x68, 0x55, 0x04, 0xf7, 0xf7, 0xb5, 0x35, 0xb1, 0xee, - 0x08, 0x9b, 0x19, 0x9e, 0x0b, 0x48, 0x1a, 0x9b, 0x03, 0x79, 0x50, 0x03, - 0x90, 0x5f, 0xdb, 0x7a, 0x1d, 0xd3, 0xc7, 0xac, 0x4d, 0x8d, 0x32, 0x7f, - 0x34, 0xea, 0x9e, 0xd1, 0x59, 0x9b, 0x2b, 0xe6, 0x39, 0x66, 0x29, 0xa1, - 0x8d, 0x61, 0xda, 0x3b, 0x35, 0xa4, 0x18, 0xcd, 0x99, 0x75, 0x95, 0x9c, - 0x89, 0x4e, 0x0a, 0xc5, 0x7d, 0x04, 0xdc, 0xb6, 0xda, 0xb6, 0x11, 0xab, - 0xaf, 0x91, 0xbd, 0xaa, 0xfd, 0xbb, 0xfb, 0xc9, 0x6a, 0xbd, 0xa1, 0x95, - 0x9f, 0x7b, 0xf3, 0x92, 0x7a, 0x9f, 0xbd, 0x3d, 0x22, 0x19, 0xc6, 0x89, - 0x52, 0xfe, 0xb3, 0xe4, 0x5f, 0xdf, 0x98, 0x29, 0x7f, 0x42, 0x05, 0xaa, - 0x41, 0x0f, 0x57, 0xb6, 0xfe, 0x21, 0x47, 0x57, 0x4b, 0x2f, 0x03, 0xd6, - 0x6a, 0xb0, 0x1d, 0x14, 0xe8, 0x1d, 0xb7, 0x62, 0xa7, 0xd9, 0xae, 0x12, - 0x4b, 0xa2, 0xb0, 0x8e, 0x16, 0xfa, 0x8b, 0xe5, 0xb6, 0x47, 0x44, 0x59, - 0x2d, 0xb3, 0xf1, 0x9b, 0x47, 0xdb, 0x23, 0xa8, 0x84, 0xcb, 0x05, 0xec, - 0x12, 0x11, 0xc1, 0x17, 0xf9, 0xb9, 0x6b, 0xf7, 0x1f, 0xe9, 0xdf, 0xd6, - 0xf8, 0xe1, 0x91, 0x56, 0x04, 0xf6, 0xef, 0x3c, 0xc7, 0x94, 0x56, 0xde, - 0x2d, 0x38, 0x09, 0x77, 0x71, 0xd6, 0x3e, 0x67, 0x60, 0x11, 0x96, 0x7a, - 0x69, 0x35, 0x8c, 0xd4, 0x81, 0x4a, 0x7e, 0x6b, 0x50, 0x0a, 0xeb, 0xb2, - 0x08, 0xd8, 0xc6, 0x61, 0x40, 0xfe, 0x97, 0x1f, 0xf9, 0xee, 0xac, 0x66, - 0x52, 0x9a, 0xf5, 0x3c, 0x83, 0x8c, 0xeb, 0xcc, 0xc5, 0xdc, 0x40, 0x79, - 0xfa, 0xe4, 0x54, 0x4d, 0x3e, 0x1b, 0x22, 0x64, 0x7c, 0x68, 0x0f, 0x71, - 0x94, 0x7d, 0xd5, 0x0b, 0xdf, 0x6d, 0xec, 0x50, 0x27, 0x89, 0xd7, 0x30, - 0xec, 0x30, 0x30, 0xd9, 0x4c, 0x36, 0xb9, 0x50, 0x51, 0x3f, 0xd5, 0x96, - 0x24, 0x56, 0x30, 0x0c, 0xf5, 0x04, 0x53, 0x91, 0x59, 0x73, 0x98, 0x52, - 0x61, 0x29, 0xce, 0xe9, 0xea, 0x72, 0x28, 0xd5, 0xbe, 0xa7, 0x56, 0x7a, - 0x86, 0x4a, 0x19, 0x70, 0xe7, 0xe7, 0x93, 0x7b, 0xb9, 0xef, 0xc5, 0xa2, - 0x9c, 0x9c, 0xef, 0x80, 0x53, 0xbe, 0xd3, 0xf7, 0x60, 0xdd, 0xaa, 0xea, - 0xbb, 0x01, 0x8d, 0x93, 0x8e, 0xee, 0xb9, 0x28, 0xd0, 0x46, 0xc8, 0xad, - 0xfb, 0x1c, 0x7e, 0xc8, 0x70, 0xe2, 0x1c, 0x96, 0x8b, 0xf4, 0xbc, 0x0e, - 0x5f, 0x23, 0xca, 0x5e, 0xc9, 0x98, 0x52, 0xae, 0x83, 0x7c, 0x71, 0xee, - 0x84, 0x45, 0x5f, 0x3d, 0xe0, 0x1a, 0xf4, 0x59, 0x38, 0xbe, 0xea, 0x59, - 0xb6, 0x47, 0x0d, 0xa6, 0x83, 0x50, 0xd0, 0x9d, 0x24, 0x8a, 0xf3, 0x8f, - 0xe1, 0xd3, 0xeb, 0xa1, 0x91, 0x10, 0x03, 0x38, 0x55, 0x0d, 0xc4, 0x25, - 0x86, 0xfa, 0x59, 0x01, 0xdf, 0x44, 0xac, 0xe1, 0x17, 0xab, 0xf6, 0xff, - 0xcb, 0xb3, 0xbd, 0x11, 0x77, 0x4d, 0x36, 0x54, 0x32, 0xa0, 0x8e, 0x48, - 0xd7, 0xe9, 0x9c, 0x8c, 0xc3, 0x56, 0x41, 0xfe, 0x3d, 0x93, 0x44, 0x00, - 0x34, 0x0b, 0x7f, 0xee, 0xbf, 0x83, 0xac, 0xc3, 0x51, 0xff, 0xa0, 0x36, - 0xb8, 0x9b, 0x84, 0x0b, 0x30, 0xc3, 0x8c, 0xed, 0xa0, 0xab, 0xf3, 0x47, - 0xd4, 0xae, 0x9b, 0x4b, 0xbc, 0x9a, 0x26, 0xfd, 0x6f, 0xd9, 0x02, 0x7d, - 0x5c, 0x70, 0x05, 0x35, 0x64, 0x43, 0x83, 0x88, 0x72, 0x83, 0x62, 0x04, - 0xf4, 0x04, 0x01, 0x18, 0x2a, 0x97, 0xce, 0x42, 0x1a, 0x03, 0x0b, 0x82, - 0x3b, 0xab, 0xbd, 0x9f, 0x3f, 0x90, 0x9e, 0xea, 0x8a, 0xb3, 0x16, 0x47, - 0x98, 0x86, 0xa5, 0xcf, 0x5c, 0xc8, 0x29, 0xba, 0x7d, 0x2f, 0x18, 0x12, - 0xae, 0x80, 0x04, 0x1f, 0x1a, 0x5d, 0x29, 0x8b, 0x09, 0x67, 0xe9, 0x30, - 0xb6, 0x10, 0x52, 0x54, 0xac, 0x62, 0x9c, 0xf2, 0xb7, 0x88, 0x5b, 0xa7, - 0x99, 0x9b, 0xb8, 0xce, 0xfa, 0x56, 0x30, 0x11, 0x75, 0xb8, 0xf5, 0xf0, - 0xc4, 0x9d, 0xe7, 0x23, 0xd5, 0xa6, 0x30, 0x2d, 0x89, 0x6b, 0x24, 0xd4, - 0xad, 0xda, 0xce, 0x28, 0xfb, 0x76, 0xb2, 0x6a, 0x39, 0x92, 0x52, 0x9e, - 0x94, 0xfc, 0xb5, 0x57, 0x49, 0x4c, 0x04, 0xb8, 0xcf, 0xc1, 0x79, 0xdf, - 0xdb, 0x9a, 0xbe, 0xe7, 0x1a, 0x0b, 0xf3, 0x4d, 0x47, 0x4e, 0xdd, 0xcb, - 0x71, 0x7f, 0x29, 0x46, 0xcf, 0xf2, 0x25, 0x2e, 0x98, 0x33, 0x00, 0x2a, - 0xd4, 0xf5, 0xdc, 0x67, 0x45, 0x57, 0x3b, 0x0d, 0xad, 0xa3, 0x79, 0x11, - 0xfa, 0x79, 0x95, 0x3e, 0xa4, 0x07, 0xc2, 0x50, 0x31, 0x04, 0x8e, 0x08, - 0xaf, 0xfe, 0xe2, 0x34, 0x62, 0x58, 0x07, 0xc6, 0x2f, 0x87, 0x51, 0x00, - 0x8b, 0x54, 0xd7, 0x1b, 0x3b, 0x49, 0x9a, 0xca, 0xcd, 0x66, 0x2c, 0x51, - 0xc6, 0x20, 0x46, 0xf7, 0x80, 0x2b, 0x09, 0x8a, 0xd9, 0x67, 0x22, 0xf9, - 0x46, 0xaf, 0x46, 0xf0, 0xc8, 0x68, 0xb9, 0xf0, 0x21, 0xe0, 0x89, 0x70, - 0xc9, 0x45, 0xbb, 0x9e, 0x62, 0xb5, 0xde, 0x35, 0x77, 0x36, 0x1f, 0x85, - 0x19, 0xd9, 0x0c, 0x05, 0xed, 0x70, 0x87, 0xc4, 0x58, 0xd7, 0xaf, 0xcb, - 0xec, 0x7e, 0xbe, 0x54, 0x3d, 0xb8, 0x11, 0x9e, 0x8f, 0xad, 0x2f, 0x37, - 0x18, 0xe3, 0xb2, 0x01, 0x96, 0x4e, 0x8f, 0xf8, 0x70, 0xe3, 0x13, 0x18, - 0xc4, 0x34, 0x64, 0x10, 0x3c, 0x0d, 0x3f, 0x88, 0x93, 0x08, 0x0a, 0xae, - 0x4f, 0x85, 0x5a, 0x5e, 0xc3, 0x28, 0x02, 0x75, 0xb5, 0x74, 0x31, 0xbe, - 0x6e, 0x3b, 0xbd, 0xbb, 0x5c, 0x4e, 0x6b, 0x46, 0x7c, 0x29, 0xf1, 0x8f, - 0xbf, 0x99, 0xc9, 0xa8, 0xe0, 0x6a, 0x01, 0x75, 0xc8, 0x1b, 0x4b, 0x9d, - 0xdb, 0x9e, 0xa4, 0x14, 0x0a, 0x7a, 0x89, 0x82, 0xfa, 0x69, 0x5c, 0x79, - 0x0f, 0xeb, 0xb7, 0xf5, 0x03, 0xe6, 0xde, 0x07, 0x18, 0xf9, 0xbb, 0xb7, - 0x1e, 0x78, 0x42, 0xa6, 0xfe, 0xb2, 0x1b, 0xb4, 0x85, 0x2f, 0x92, 0xc6, - 0x29, 0x9c, 0xd8, 0xc3, 0xd3, 0xbb, 0x43, 0x8a, 0x30, 0x92, 0xd5, 0x29, - 0xcb, 0xfa, 0x5b, 0x4c, 0x10, 0x91, 0x86, 0x40, 0x26, 0xeb, 0xd9, 0xc1, - 0x48, 0x44, 0x56, 0x95, 0xa0, 0x63, 0xad, 0x3d, 0x5f, 0xb4, 0x27, 0xf0, - 0xd4, 0xc6, 0xfc, 0x2e, 0x71, 0x33, 0xb7, 0x7e, 0x34, 0x20, 0xd0, 0x2c, - 0x66, 0xca, 0x19, 0xa5, 0xbc, 0x84, 0x3b, 0xcb, 0x5d, 0xe8, 0xdf, 0x5a, - 0x2d, 0xbf, 0x98, 0x9b, 0x2d, 0xd9, 0x90, 0x8f, 0x1d, 0x2f, 0xab, 0x46, - 0xb1, 0x29, 0xc0, 0x22, 0x34, 0x04, 0x53, 0x06, 0xe6, 0xcb, 0x62, 0x96, - 0x4c, 0x68, 0x13, 0x37, 0x65, 0xcf, 0x55, 0x51, 0x1d, 0x5e, 0x84, 0x77, - 0xee, 0x37, 0x7e, 0x77, 0x03, 0xee, 0xae, 0x6b, 0xd3, 0x3d, 0x85, 0x85, - 0xa1, 0x94, 0xeb, 0xf5, 0x86, 0x37, 0x75, 0x7f, 0x2c, 0x94, 0x04, 0xdb, - 0x57, 0xc2, 0xa8, 0x34, 0x3d, 0x74, 0xc9, 0x5d, 0x49, 0x79, 0xe2, 0xd0, - 0x22, 0x0a, 0x80, 0xb5, 0xb7, 0xc7, 0xba, 0x87, 0xaf, 0x75, 0x6d, 0xb1, - 0xfa, 0xc1, 0xb5, 0xfa, 0x08, 0xca, 0x5b, 0x67, 0x1e, 0xc9, 0xf0, 0x8a, - 0xf2, 0x11, 0xa8, 0xeb, 0x05, 0x0a, 0x01, 0x0c, 0x14, 0xef, 0x6f, 0xfc, - 0x87, 0xdb, 0x27, 0x8e, 0x88, 0xbc, 0x17, 0x9a, 0x2a, 0xc7, 0x81, 0x1b, - 0x58, 0x0f, 0xe7, 0x5a, 0x08, 0x99, 0x5f, 0xb3, 0xb0, 0x1b, 0x56, 0x5c, - 0xe1, 0xcf, 0xda, 0x39, 0x44, 0x8b, 0x06, 0xf9, 0x6f, 0x40, 0x54, 0x1a, - 0x00, 0x5b, 0x5b, 0x1e, 0x5a, 0x14, 0x37, 0x59, 0xa0, 0x18, 0x26, 0x51, - 0xb0, 0x18, 0x4f, 0x89, 0x95, 0x0f, 0xe9, 0xc6, 0x96, 0xb2, 0x45, 0x03, - 0xa6, 0xfd, 0xde, 0x12, 0xf1, 0x60, 0x9b, 0xdf, 0x8c, 0x11, 0xe6, 0xa9, - 0x47, 0x54, 0x50, 0x4c, 0xb2, 0xad, 0xbb, 0xb2, 0x82, 0xb3, 0x84, 0x6b, - 0x66, 0x12, 0x85, 0xb7, 0x8c, 0xb1, 0x0a, 0x47, 0xf6, 0xcc, 0x66, 0xb1, - 0x2a, 0x51, 0x60, 0x52, 0x41, 0xa1, 0x5e, 0x77, 0x58, 0x56, 0x11, 0x43, - 0x19, 0xa1, 0xad, 0x36, 0x62, 0x67, 0xf1, 0x3f, 0x63, 0x5f, 0xf1, 0xa9, - 0xa1, 0xa2, 0x8a, 0xef, 0xfe, 0x15, 0xf0, 0x97, 0x38, 0xc4, 0x4f, 0xb8, - 0xe6, 0x78, 0x8f, 0x1c, 0xef, 0x75, 0xe0, 0x59, 0x9b, 0x1b, 0xf2, 0x3c, - 0x6b, 0x23, 0xb0, 0x05, 0x1e, 0x45, 0x09, 0x75, 0x5c, 0x13, 0x68, 0x66, - 0x50, 0xab, 0xed, 0xaa, 0xed, 0x8f, 0x8b, 0x48, 0xb2, 0x88, 0x21, 0xc9, - 0x61, 0x0b, 0xf0, 0x4a, 0x24, 0x7a, 0x87, 0x10, 0xaa, 0x7f, 0x71, 0xde, - 0x39, 0xda, 0xf6, 0xf4, 0x99, 0x31, 0xda, 0xea, 0xf1, 0xec, 0x04, 0xef, - 0x9c, 0x1a, 0x70, 0x78, 0xd4, 0xe5, 0x8f, 0x43, 0x1b, 0x5e, 0x20, 0x79, - 0x04, 0x71, 0x29, 0xb9, 0xbe, 0xaf, 0xc1, 0xe5, 0x28, 0xbe, 0xdd, 0xee, - 0x9c, 0x93, 0x6e, 0x13, 0x60, 0x56, 0x4f, 0x6b, 0xe6, 0x66, 0xfd, 0x65, - 0xdc, 0xff, 0x61, 0x87, 0x3a, 0x45, 0x53, 0x50, 0x62, 0x49, 0x44, 0xa9, - 0xd4, 0xea, 0xdb, 0xa0, 0xfc, 0x41, 0x5f, 0x31, 0x5f, 0x9b, 0x8d, 0x27, - 0xd0, 0xe9, 0xcd, 0x7a, 0xde, 0xb1, 0x21, 0xb3, 0xa1, 0x30, 0xc1, 0x20, - 0x86, 0xcb, 0x99, 0x73, 0xa3, 0x5a, 0xb1, 0x1e, 0xe4, 0x11, 0x58, 0x07, - 0xa7, 0x7b, 0x8b, 0x32, 0xd6, 0x0f, 0x44, 0xa2, 0x27, 0xa3, 0xa7, 0x65, - 0x1d, 0x47, 0x1b, 0x43, 0xaa, 0x61, 0x54, 0x8f, 0x07, 0x35, 0xa1, 0x0a, - 0xcd, 0x25, 0x1b, 0x83, 0x7f, 0xc7, 0xe2, 0x71, 0x57, 0x7a, 0x8e, 0x27, - 0x92, 0xad, 0x5e, 0x7f, 0xb9, 0x35, 0x5d, 0x3f, 0x26, 0xe5, 0x6d, 0x85, - 0x5d, 0x5a, 0x33, 0xd6, 0xe6, 0x8a, 0x8f, 0x11, 0x47, 0xd6, 0xdb, 0xab, - 0x99, 0xdd, 0xcc, 0x05, 0xab, 0xdd, 0x7b, 0x42, 0x42, 0x1b, 0xfb, 0x44, - 0x78, 0x41, 0xfb, 0x75, 0x2b, 0x55, 0x72, 0x44, 0x9b, 0x9e, 0x62, 0x59, - 0x75, 0x4a, 0x3c, 0x3f, 0xc7, 0xdb, 0x83, 0x2b, 0x7e, 0x78, 0x61, 0xf7, - 0xa1, 0xac, 0x61, 0xbe, 0x59, 0x46, 0xdb, 0xba, 0x8a, 0xf7, 0xcd, 0x25, - 0x03, 0x53, 0x00, 0x2d, 0x80, 0x78, 0xaf, 0xa3, 0x32, 0x35, 0x47, 0x08, - 0xb6, 0x22, 0xdf, 0x2a, 0x05, 0x1b, 0x4f, 0x1f, 0x16, 0x70, 0xa6, 0x5f, - 0xb1, 0x24, 0x1b, 0x9a, 0xb3, 0x21, 0x7c, 0x17, 0xc2, 0x9f, 0x3e, 0xf9, - 0x0a, 0x84, 0x18, 0x95, 0x45, 0x29, 0x38, 0x34, 0x0b, 0xbc, 0xf3, 0x27, - 0xee, 0x6b, 0x29, 0xcd, 0xb6, 0x4d, 0x35, 0x48, 0xd0, 0x2e, 0xd3, 0xe2, - 0x9c, 0x9f, 0x02, 0xac, 0xaa, 0xd7, 0x90, 0x2d, 0xe2, 0x13, 0x7b, 0xda, - 0x16, 0xdc, 0x81, 0x98, 0xa4, 0xfd, 0x53, 0x09, 0x3a, 0x94, 0x79, 0x9d, - 0xba, 0x9e, 0x46, 0x13, 0xbd, 0x94, 0x47, 0x7e, 0x57, 0xbf, 0xbe, 0x6e, - 0x86, 0x5a, 0xd3, 0x08, 0x4f, 0x61, 0x6f, 0xa1, 0x49, 0xd1, 0xb2, 0x3c, - 0x9f, 0x42, 0xe9, 0xe6, 0x25, 0x50, 0xcf, 0x53, 0x7d, 0x12, 0x15, 0x64, - 0x10, 0x94, 0xc0, 0x60, 0x32, 0x33, 0x72, 0xe6, 0xc0, 0xc6, 0xef, 0xf8, - 0x1d, 0x8f, 0xaa, 0xc1, 0xd0, 0x04, 0xe4, 0xec, 0x3d, 0x31, 0x2a, 0xf7, - 0x85, 0xa5, 0xb5, 0x46, 0x68, 0x51, 0x46, 0x2c, 0x1a, 0x12, 0xf2, 0x27, - 0x27, 0xa5, 0x41, 0xe5, 0xaa, 0xbd, 0x6f, 0xd8, 0x0e, 0x30, 0x83, 0x00, - 0x39, 0x21, 0x8a, 0x06, 0x74, 0x06, 0x2b, 0x92, 0x64, 0xf3, 0x43, 0x21, - 0xfa, 0xb0, 0xf5, 0xf2, 0x4e, 0xaa, 0xed, 0x9a, 0x73, 0x39, 0x50, 0xde, - 0x79, 0x3e, 0x78, 0xf6, 0x5d, 0x41, 0x65, 0x4e, 0xcf, 0xc5, 0xb6, 0x39, - 0x53, 0x19, 0x66, 0x11, 0x90, 0x65, 0x73, 0xc8, 0xda, 0x6d, 0x62, 0xd2, - 0x44, 0x5a, 0x34, 0x17, 0x29, 0xae, 0xbf, 0x16, 0x81, 0xf6, 0xed, 0x23, - 0xe4, 0xa9, 0x28, 0x71, 0x50, 0xbf, 0xb2, 0xbe, 0xb1, 0xed, 0x4f, 0x19, - 0x8b, 0xfa, 0x83, 0x90, 0x3e, 0x2f, 0x92, 0x1b, 0x5e, 0x5b, 0x04, 0x70, - 0x7d, 0xfc, 0xd2, 0x7b, 0x67, 0xcd, 0x16, 0x52, 0x39, 0x87, 0x8d, 0xd1, - 0x17, 0x53, 0x92, 0x96, 0x4e, 0xd4, 0xd8, 0x47, 0x4e, 0xa6, 0xb0, 0x6c, - 0x85, 0x4b, 0x6b, 0x0a, 0x1c, 0xbf, 0xd8, 0x44, 0x85, 0x55, 0x59, 0xf8, - 0x48, 0x21, 0x6a, 0xac, 0x8b, 0xe4, 0x64, 0xcf, 0x6d, 0x4e, 0x37, 0x13, - 0xab, 0x9a, 0xcd, 0x21, 0xb9, 0x50, 0xf2, 0xf7, 0x2c, 0xc6, 0x49, 0x5e, - 0x9d, 0x13, 0x9b, 0x03, 0x5c, 0x43, 0x68, 0xf8, 0xda, 0x23, 0x0b, 0xaf, - 0xd5, 0x5f, 0xdc, 0x89, 0xcc, 0x4b, 0xbc, 0xe3, 0x59, 0xcd, 0xec, 0x7d, - 0xab, 0xd3, 0xce, 0x3e, 0xbc, 0x77, 0xeb, 0x1c, 0x3c, 0x8d, 0x0e, 0x36, - 0x40, 0x2f, 0xc0, 0x07, 0x65, 0xb6, 0x22, 0xad, 0xd8, 0xa4, 0x68, 0x95, - 0x36, 0xc8, 0x62, 0xa0, 0x97, 0x3b, 0x71, 0xb9, 0x6c, 0x07, 0xe1, 0x39, - 0x85, 0x46, 0x8a, 0xd0, 0x44, 0x0d, 0x4e, 0x55, 0xe2, 0x0d, 0xb5, 0xee, - 0xb6, 0x2a, 0x0e, 0x67, 0xdd, 0x74, 0xb7, 0x05, 0x6c, 0xfe, 0xff, 0x73, - 0xfc, 0x82, 0x09, 0x82, 0xff, 0x73, 0x97, 0x3b, 0x3d, 0x76, 0x87, 0x33, - 0x9d, 0x1f, 0x4d, 0xd9, 0x0b, 0xc4, 0x73, 0xe7, 0xb5, 0xdf, 0xeb, 0xa8, - 0xde, 0x9a, 0xe5, 0x28, 0x2b, 0x43, 0x7d, 0x5a, 0xbf, 0x26, 0xb4, 0x9f, - 0x9b, 0xc6, 0xfa, 0xd7, 0xfc, 0x2c, 0x96, 0x64, 0xf8, 0x36, 0x26, 0x28, - 0x36, 0xef, 0x6b, 0xcb, 0xe1, 0x3b, 0x1a, 0x16, 0x4d, 0x95, 0x80, 0x2d, - 0x46, 0x4e, 0x5f, 0x04, 0xbb, 0xfd, 0xb0, 0x5f, 0x4d, 0xc6, 0x31, 0xaf, - 0x9d, 0xf2, 0x83, 0x8c, 0xbf, 0xf4, 0xd1, 0xe7, 0xd8, 0x62, 0x8d, 0x93, - 0x4c, 0x46, 0xe1, 0x30, 0xdf, 0x05, 0x8d, 0x13, 0x27, 0x0b, 0xe1, 0x24, - 0x33, 0x6b, 0xa5, 0xff, 0x47, 0x52, 0xea, 0xa9, 0x7a, 0x69, 0x92, 0xd6, - 0x6f, 0x10, 0x49, 0xf7, 0x8b, 0xbe, 0xb5, 0x40, 0xce, 0x18, 0xa8, 0xeb, - 0xaf, 0x5d, 0xaf, 0xc6, 0xad, 0x9e, 0x86, 0x8e, 0x4a, 0x6c, 0xc7, 0x3c, - 0x28, 0x7a, 0x4b, 0xc7, 0xa8, 0xf1, 0x2d, 0x47, 0xf5, 0x7a, 0xe2, 0xfd, - 0x75, 0xe5, 0x31, 0xc7, 0x03, 0x93, 0x0e, 0x1d, 0x99, 0xc9, 0x8d, 0x00, - 0xc5, 0xe0, 0xd1, 0x02, 0x37, 0x82, 0x2a, 0x54, 0x8e, 0x20, 0x3f, 0x35, - 0x11, 0xe5, 0xf4, 0xad, 0xb6, 0x00, 0xad, 0x39, 0x8e, 0xfc, 0xed, 0x74, - 0xa2, 0xf6, 0x31, 0xe5, 0x1c, 0x28, 0x19, 0x5e, 0xf6, 0xdf, 0x2d, 0xb6, - 0xf7, 0x7b, 0xb1, 0xb8, 0xa7, 0x73, 0x6f, 0xd8, 0xcd, 0x40, 0xe5, 0xf5, - 0x2e, 0x2f, 0x42, 0x6d, 0xa6, 0x0f, 0xcc, 0x46, 0xde, 0x45, 0xbd, 0x10, - 0xd8, 0xa7, 0x23, 0x8e, 0xd2, 0x39, 0x99, 0x46, 0xa9, 0xaa, 0xc4, 0xb9, - 0x4c, 0xb8, 0x3b, 0xc6, 0x0d, 0x63, 0xd8, 0xd6, 0x5a, 0xb8, 0xf9, 0xdd, - 0x4d, 0xe5, 0xd9, 0xdc, 0x9a, 0x58, 0x66, 0x79, 0x4d, 0xb8, 0xf1, 0xf3, - 0x8a, 0x1c, 0xb0, 0x0a, 0xfb, 0x50, 0x2b, 0x75, 0xcc, 0x91, 0xf4, 0x56, - 0xef, 0x45, 0x8b, 0x0c, 0xfb, 0xcc, 0xad, 0xdb, 0x44, 0x69, 0x54, 0xf9, - 0x78, 0xdd, 0xfa, 0x16, 0x22, 0xeb, 0x5a, 0x40, 0x3d, 0xf7, 0xb9, 0xcb, - 0xc3, 0x4a, 0x73, 0x9b, 0x63, 0x03, 0x6c, 0xb0, 0x72, 0x4d, 0x30, 0x85, - 0x8a, 0xbe, 0x74, 0xae, 0x15, 0xd3, 0x14, 0x27, 0xde, 0x8a, 0x7e, 0x3c, - 0x97, 0x09, 0x66, 0xa0, 0x70, 0xe9, 0x2b, 0x32, 0xe6, 0xe3, 0xeb, 0xf3, - 0xda, 0x30, 0xff, 0xcf, 0x62, 0x13, 0xa2, 0x45, 0x1a, 0xd3, 0xa4, 0x78, - 0xfa, 0x5c, 0x42, 0x20, 0x6a, 0x72, 0xad, 0x6e, 0xae, 0x20, 0x72, 0x05, - 0xa1, 0x95, 0x60, 0xa9, 0x9b, 0xd2, 0x31, 0x5d, 0x48, 0xa0, 0xc6, 0xd6, - 0x5b, 0xee, 0x6e, 0x62, 0x6f, 0x68, 0x55, 0x58, 0x3e, 0x8d, 0xb8, 0xc5, - 0x44, 0x08, 0x86, 0xd8, 0xdc, 0x2b, 0x26, 0x4e, 0x4d, 0x01, 0xff, 0x0c, - 0xfd, 0x9b, 0x93, 0x97, 0x48, 0xf2, 0x44, 0xa2, 0x0b, 0x31, 0x13, 0xa4, - 0xd3, 0xa7, 0x54, 0x91, 0x18, 0x03, 0xe1, 0xd6, 0xd2, 0x13, 0x1b, 0x3c, - 0x0e, 0x19, 0x86, 0x43, 0xaa, 0xd3, 0x6c, 0x08, 0xc0, 0x52, 0x3a, 0xbb, - 0x17, 0xc7, 0x08, 0xdd, 0x8d, 0x8c, 0xa9, 0xa9, 0x24, 0xf9, 0xb3, 0xec, - 0xe9, 0xf6, 0xdd, 0x56, 0xb8, 0x64, 0x99, 0x44, 0x16, 0x85, 0x61, 0xb5, - 0xc8, 0x9b, 0x08, 0xee, 0x02, 0xcc, 0x97, 0x41, 0x43, 0x94, 0x62, 0x06, - 0x83, 0xd9, 0xac, 0x4a, 0xd8, 0x9f, 0xa5, 0x91, 0xaf, 0x68, 0xd4, 0xb5, - 0x85, 0x7d, 0xd8, 0xc3, 0xe0, 0xc7, 0xe0, 0x40, 0xdc, 0x69, 0xf7, 0x60, - 0x31, 0x90, 0xc3, 0x28, 0x08, 0x79, 0xa3, 0x39, 0x2b, 0xd9, 0xf5, 0xf6, - 0x90, 0x8b, 0xe9, 0x02, 0x87, 0x91, 0x37, 0x27, 0xe6, 0x09, 0xc2, 0x8c, - 0xb8, 0x70, 0x94, 0xe9, 0x42, 0x16, 0xb6, 0xf3, 0x4d, 0x26, 0xa8, 0x66, - 0x62, 0x09, 0x77, 0x36, 0x82, 0x29, 0xa3, 0xc6, 0x1b, 0x86, 0xc0, 0xb1, - 0xfe, 0xcd, 0x30, 0xc6, 0xb1, 0x20, 0x0c, 0xcd, 0x69, 0x48, 0x1f, 0x13, - 0xfb, 0xd0, 0x6d, 0x18, 0x3f, 0x7b, 0x14, 0x18, 0x4c, 0x18, 0xe2, 0x71, - 0x82, 0x05, 0x31, 0x43, 0xb9, 0x7d, 0xa5, 0xeb, 0x4b, 0xfe, 0xbb, 0x7e, - 0x59, 0xa2, 0xdb, 0xc9, 0x7a, 0x68, 0x08, 0x27, 0xba, 0xae, 0x36, 0xda, - 0xe1, 0x97, 0x01, 0x31, 0xa0, 0xb2, 0x25, 0x7a, 0x7e, 0x12, 0x31, 0xce, - 0x7c, 0x36, 0x07, 0xb3, 0x92, 0xc2, 0x9b, 0x2a, 0x90, 0x5d, 0xe5, 0xf3, - 0x5e, 0x79, 0x29, 0xfb, 0x51, 0xc7, 0x61, 0x4d, 0xf9, 0x69, 0xc1, 0x40, - 0xf8, 0x04, 0xf5, 0xb3, 0x30, 0x51, 0x92, 0x15, 0x53, 0x8d, 0xaf, 0x32, - 0x6c, 0x34, 0xc8, 0x42, 0x42, 0x6d, 0xe1, 0xaa, 0xd7, 0xc3, 0xa0, 0x63, - 0xce, 0xe7, 0x52, 0xc0, 0x6a, 0xd3, 0x40, 0xe9, 0x2c, 0x9b, 0x11, 0x31, - 0x8b, 0xf5, 0x89, 0x5f, 0xe8, 0x90, 0x61, 0x5c, 0xb6, 0x49, 0x81, 0x22, - 0x83, 0x44, 0x71, 0x08, 0xe7, 0x4a, 0xb9, 0x94, 0x06, 0x20, 0x2c, 0xfa, - 0xe8, 0x93, 0x64, 0x67, 0x24, 0x81, 0x48, 0x46, 0xb1, 0xbf, 0xef, 0x14, - 0xfc, 0x7e, 0x6a, 0x65, 0x1c, 0xc8, 0x1f, 0x61, 0xb7, 0x36, 0xc8, 0x57, - 0x80, 0x7a, 0x77, 0xb1, 0xfa, 0xce, 0x67, 0x04, 0x2e, 0x82, 0x6f, 0x44, - 0x64, 0x33, 0x3e, 0x1d, 0x00, 0x2e, 0x70, 0xd2, 0xec, 0x92, 0x9d, 0xfb, - 0x9b, 0x0c, 0x4b, 0x2d, 0xd2, 0x0d, 0x70, 0x07, 0xd9, 0x1a, 0x62, 0x78, - 0x0c, 0xfc, 0xa3, 0x1d, 0xee, 0x1a, 0x62, 0xe3, 0xe6, 0x0c, 0xba, 0x4f, - 0x90, 0xa6, 0x56, 0xe0, 0xfb, 0xaa, 0x06, 0x5f, 0x1a, 0xee, 0x8e, 0x63, - 0x37, 0xd8, 0xa4, 0x62, 0x6b, 0x62, 0x71, 0xef, 0xda, 0x9a, 0x95, 0xff, - 0x8d, 0x10, 0x73, 0xa7, 0xb6, 0x96, 0x67, 0x39, 0x24, 0x1f, 0x04, 0xca, - 0x74, 0x53, 0xad, 0x00, 0xdd, 0x64, 0x42, 0xe6, 0xe3, 0x2d, 0x7b, 0x56, - 0x7d, 0xb2, 0x08, 0xd7, 0xb1, 0xca, 0xe7, 0xa2, 0x1b, 0x29, 0x75, 0x9c, - 0x1f, 0x4f, 0x95, 0x93, 0x42, 0xb7, 0xc1, 0x13, 0x9c, 0xae, 0x93, 0xd5, - 0x89, 0x80, 0x10, 0x14, 0x20, 0x10, 0xf7, 0xf2, 0x79, 0x74, 0xb0, 0x69, - 0x83, 0xff, 0xae, 0x50, 0x65, 0xc0, 0x07, 0x8f, 0xbc, 0xbe, 0xd1, 0x1c, - 0x2a, 0x4a, 0x1e, 0xd1, 0xbf, 0x16, 0x4f, 0x31, 0x3f, 0x54, 0xf7, 0x02, - 0xcf, 0x0a, 0xdb, 0x91, 0xfd, 0xef, 0x39, 0xce, 0xfa, 0x30, 0xfb, 0xca, - 0x31, 0x92, 0x34, 0x61, 0x7c, 0xc9, 0x42, 0x61, 0x0a, 0xd7, 0xfc, 0x80, - 0x73, 0x4f, 0x62, 0xb9, 0xbe, 0x54, 0x25, 0xbf, 0x62, 0xad, 0x8b, 0x2b, - 0xb8, 0xba, 0xba, 0x70, 0xab, 0xe2, 0x30, 0x02, 0x1b, 0x44, 0xda, 0x83, - 0xbc, 0x2c, 0x7c, 0xa1, 0xdb, 0xf3, 0xbe, 0x03, 0xb4, 0x6d, 0xa5, 0x6a, - 0x27, 0x10, 0xe0, 0x53, 0x4a, 0x77, 0x49, 0x20, 0x4b, 0x6c, 0xed, 0xd5, - 0xba, 0xa6, 0x8c, 0x07, 0x16, 0x37, 0xa1, 0x21, 0xfb, 0x8c, 0xce, 0xa8, - 0xbc, 0x6d, 0xee, 0x82, 0x87, 0x01, 0xd4, 0xa2, 0x37, 0xc6, 0x1c, 0xed, - 0xd9, 0x92, 0x08, 0x6f, 0xfa, 0x26, 0xd5, 0xf7, 0x12, 0xfb, 0xe3, 0xad, - 0x40, 0xf2, 0xa8, 0xe5, 0xe9, 0xc2, 0xce, 0x9a, 0x19, 0x35, 0x20, 0x28, - 0x4a, 0x92, 0x18, 0xdc, 0x8e, 0xf3, 0x68, 0x01, 0x99, 0xae, 0x68, 0xd5, - 0x75, 0x1e, 0x30, 0xd1, 0x3d, 0x9e, 0xbe, 0xa5, 0x12, 0xf2, 0xac, 0x5b, - 0x89, 0xbd, 0x97, 0x00, 0x9b, 0x1b, 0xc8, 0xf6, 0x19, 0x0d, 0x03, 0xb8, - 0xa9, 0xb1, 0x3c, 0xee, 0xd2, 0x0f, 0x33, 0xe9, 0x0b, 0xa9, 0x7a, 0x02, - 0xe9, 0xf0, 0x43, 0xfa, 0x32, 0xf8, 0x51, 0x47, 0xf3, 0x5e, 0x82, 0xbe, - 0x04, 0x84, 0x5f, 0x28, 0x80, 0x05, 0x7d, 0x13, 0x58, 0x5f, 0x4e, 0xe2, - 0xed, 0x91, 0x37, 0x73, 0x14, 0xe4, 0x3e, 0x8b, 0x22, 0x5b, 0x2f, 0xc6, - 0x27, 0xad, 0x2a, 0x92, 0xd9, 0x7a, 0x80, 0x5e, 0x5d, 0x2a, 0xd3, 0xda, - 0x54, 0xd6, 0x76, 0x24, 0x6f, 0xff, 0xac, 0x12, 0x4b, 0x46, 0x9c, 0xcb, - 0x82, 0x49, 0x78, 0xa5, 0xad, 0x83, 0x4a, 0x16, 0x86, 0x9c, 0xee, 0x99, - 0x67, 0x0c, 0x8f, 0xb1, 0x26, 0xb1, 0x03, 0x27, 0x1a, 0xe7, 0x12, 0x20, - 0x08, 0x6b, 0x27, 0x63, 0x94, 0xc9, 0xa3, 0x8d, 0xc8, 0xe3, 0x7e, 0xbc, - 0xd5, 0xe2, 0xd0, 0xe0, 0x09, 0x66, 0x53, 0xfe, 0x90, 0xd6, 0x56, 0xd8, - 0x72, 0x81, 0x9a, 0xc2, 0xe1, 0x5c, 0x3a, 0x23, 0x94, 0x83, 0x90, 0x98, - 0xb5, 0x87, 0xc5, 0x05, 0xb7, 0xc9, 0x80, 0x41, 0x79, 0x3e, 0xfb, 0x4f, - 0xfb, 0x14, 0x50, 0x63, 0x7d, 0x1f, 0xf7, 0x36, 0xb6, 0xf1, 0x21, 0x87, - 0xa0, 0x1b, 0x21, 0xca, 0x09, 0x07, 0x24, 0xb7, 0xf1, 0xb7, 0x8c, 0x5b, - 0x8a, 0xbd, 0x7c, 0x2d, 0x2c, 0x3e, 0x98, 0x05, 0x2d, 0xe6, 0x58, 0xbe, - 0x7f, 0xc2, 0x13, 0xf2, 0x4c, 0xe0, 0xa2, 0xa1, 0x94, 0xbb, 0xea, 0xe9, - 0x47, 0x05, 0xf8, 0x05, 0xa1, 0xe2, 0xf9, 0x1b, 0x38, 0x72, 0xa5, 0x03, - 0xa7, 0x23, 0xac, 0x31, 0x57, 0xf5, 0x3c, 0xfc, 0x84, 0x5d, 0x39, 0x0a, - 0x88, 0x6d, 0x78, 0x15, 0x2f, 0x97, 0x44, 0x6a, 0xd8, 0x9a, 0x05, 0xcd, - 0x48, 0x91, 0x3b, 0x06, 0x1e, 0x6d, 0x4c, 0x49, 0x9d, 0x1e, 0x89, 0xaf, - 0x3e, 0x74, 0xee, 0xce, 0xed, 0x87, 0x12, 0x78, 0x0b, 0x42, 0x04, 0xf7, - 0x87, 0x49, 0x1b, 0x54, 0x9f, 0xfb, 0xb6, 0x11, 0x2e, 0xd1, 0x2e, 0xd9, - 0x55, 0x43, 0xb0, 0x1c, 0xbc, 0x28, 0x4e, 0x3c, 0x4a, 0x08, 0x21, 0x0a, - 0x12, 0xc9, 0x4e, 0x62, 0x62, 0x49, 0xe8, 0x64, 0x04, 0x8c, 0x90, 0x94, - 0x7f, 0xd1, 0xe4, 0x51, 0x4e, 0x16, 0xae, 0x2e, 0x3c, 0xda, 0x65, 0x82, - 0x0a, 0xb8, 0xcc, 0x4e, 0xc9, 0x6b, 0x51, 0x6f, 0xf3, 0xc8, 0x5b, 0x67, - 0xec, 0x5a, 0xcb, 0x05, 0x65, 0xc3, 0xcb, 0x8d, 0x13, 0x11, 0x99, 0xea, - 0x37, 0xe9, 0x0c, 0x0b, 0x8f, 0xd1, 0xee, 0xe8, 0x8d, 0xfb, 0xfc, 0x7e, - 0xdc, 0x53, 0x1d, 0xd6, 0x75, 0x92, 0xc4, 0xf7, 0x5e, 0x10, 0x40, 0x84, - 0x9e, 0x5e, 0xc9, 0x7e, 0x9d, 0x5f, 0xad, 0x4f, 0x75, 0x5e, 0xb5, 0x07, - 0x3a, 0xb0, 0xe4, 0x0d, 0xc4, 0x1b, 0x33, 0xc4, 0xeb, 0xab, 0xff, 0xf3, - 0x3b, 0x7b, 0x53, 0xd7, 0x93, 0xa0, 0x28, 0x53, 0x91, 0x7b, 0x2a, 0x6e, - 0x93, 0xf7, 0x77, 0x53, 0x7d, 0x85, 0x32, 0x88, 0x46, 0xf2, 0xe4, 0xd4, - 0x6f, 0x99, 0xe9, 0xec, 0x79, 0x27, 0x98, 0xb0, 0xf4, 0x3b, 0x86, 0x78, - 0x4a, 0xa0, 0x27, 0x6c, 0x3f, 0x95, 0xb7, 0xd6, 0x6d, 0x5b, 0x41, 0x17, - 0x79, 0x08, 0x4d, 0x7b, 0x60, 0x0e, 0x4f, 0x4d, 0x4f, 0xe1, 0xa8, 0x5c, - 0x5a, 0xdb, 0x57, 0xd0, 0xe1, 0xe7, 0xb8, 0x9a, 0xfe, 0x98, 0xdc, 0xbf, - 0x04, 0x27, 0xcb, 0xac, 0xa2, 0xa2, 0xb0, 0x6e, 0x36, 0xc8, 0xbd, 0x84, - 0x1f, 0x35, 0x2e, 0x63, 0xd2, 0x14, 0xf7, 0x68, 0x00, 0xdf, 0x39, 0xf8, - 0x6b, 0xef, 0x60, 0x53, 0x71, 0xd4, 0x7d, 0xf8, 0x25, 0xbf, 0x1f, 0xa5, - 0x6d, 0x10, 0x96, 0xa0, 0x3f, 0x37, 0xdd, 0xb9, 0x08, 0x82, 0x86, 0xbd, - 0x4b, 0x22, 0xf1, 0xac, 0x79, 0xfa, 0x17, 0x1e, 0xeb, 0xff, 0x41, 0x65, - 0xc8, 0x32, 0x4c, 0x8c, 0xb9, 0x39, 0xe7, 0x16, 0x1f, 0xbb, 0x94, 0x32, - 0x67, 0x3a, 0x6a, 0x26, 0x8f, 0xbe, 0xdd, 0x75, 0x06, 0xc2, 0x1b, 0xc0, - 0x24, 0x18, 0xf7, 0xc5, 0xb1, 0xa3, 0xc1, 0xf2, 0x3b, 0x6d, 0x13, 0xb8, - 0x9f, 0xc0, 0x9b, 0x06, 0xbb, 0x5a, 0x21, 0xc5, 0xbd, 0x37, 0x43, 0xb6, - 0x22, 0x86, 0xe3, 0x25, 0x9d, 0x24, 0x38, 0x7b, 0x17, 0xd5, 0x49, 0xad, - 0x9a, 0x9a, 0xd1, 0x9a, 0xe3, 0xc9, 0x8b, 0x0a, 0xb7, 0xad, 0x63, 0x63, - 0x0f, 0x6a, 0xcf, 0x5b, 0x34, 0x4a, 0xb9, 0xa3, 0xd4, 0x49, 0xc1, 0x05, - 0x97, 0x69, 0x10, 0x52, 0x43, 0x20, 0xff, 0x0b, 0x16, 0xcd, 0x13, 0x5e, - 0xc3, 0x54, 0x7b, 0x33, 0x3b, 0x23, 0xd5, 0xf4, 0x79, 0xe0, 0x17, 0x7d, - 0xb4, 0xc1, 0xf6, 0xef, 0x66, 0xf4, 0xfa, 0x73, 0xad, 0x52, 0x7a, 0xde, - 0xd8, 0x97, 0x32, 0x6b, 0x34, 0x4f, 0xb0, 0x4f, 0x00, 0x98, 0x21, 0x7f, - 0xd6, 0x49, 0x94, 0x92, 0xed, 0x81, 0xb6, 0x1b, 0xcd, 0x07, 0x04, 0x6c, - 0x6c, 0x36, 0x2a, 0xee, 0x35, 0x4a, 0xd7, 0xc5, 0x51, 0x1c, 0x41, 0x0a, - 0x19, 0x1a, 0xfc, 0x42, 0xae, 0x1a, 0xf9, 0xe1, 0xec, 0xe2, 0x5d, 0x6c, - 0xe3, 0xa0, 0x74, 0xc7, 0xc6, 0x6f, 0xf4, 0x3e, 0x13, 0x8f, 0x1a, 0xc1, - 0x1f, 0x1b, 0x85, 0x72, 0xc7, 0x5f, 0x4a, 0xd6, 0x49, 0x06, 0x5f, 0x94, - 0xa2, 0xf0, 0x30, 0xd2, 0x6f, 0x07, 0x12, 0xb9, 0x3c, 0xbd, 0x44, 0xe1, - 0x44, 0x8d, 0x91, 0x51, 0x0d, 0x2a, 0xd0, 0xbc, 0x60, 0xde, 0xa1, 0x81, - 0x64, 0x02, 0x52, 0x28, 0x88, 0x21, 0x2c, 0xb3, 0x78, 0x38, 0x0a, 0x13, - 0xb9, 0xa7, 0xe1, 0x49, 0x6a, 0xab, 0xee, 0x16, 0x47, 0xd0, 0xa6, 0xbd, - 0x67, 0x84, 0x55, 0x1a, 0xfe, 0x5d, 0x65, 0xbc, 0x25, 0x08, 0x05, 0x2f, - 0x14, 0x1e, 0xf3, 0x4b, 0xc8, 0x4b, 0xb1, 0x77, 0x4f, 0x0c, 0xaf, 0x70, - 0xe8, 0x6e, 0x56, 0x06, 0xa1, 0xa1, 0x9a, 0xeb, 0x23, 0xc8, 0xf2, 0x5b, - 0x16, 0xa2, 0xa9, 0x01, 0xa3, 0xc7, 0x15, 0xab, 0x58, 0x79, 0xf9, 0x2d, - 0x9a, 0x1f, 0x96, 0x0f, 0x71, 0x26, 0xc0, 0x6a, 0xf1, 0xaf, 0xec, 0xeb, - 0xe4, 0x2a, 0x74, 0x81, 0xa8, 0x78, 0xdb, 0x8c, 0xa5, 0x0e, 0x73, 0x76, - 0x47, 0x4f, 0x5f, 0x10, 0x29, 0x88, 0x6c, 0x8f, 0xb4, 0xc7, 0xbb, 0x8e, - 0x3b, 0x2d, 0xf1, 0x78, 0xe2, 0xc6, 0xee, 0x9d, 0x2e, 0xf3, 0xcb, 0x43, - 0x7d, 0x7b, 0x12, 0x1c, 0xac, 0xd3, 0x54, 0x09, 0x8e, 0x52, 0xe6, 0x4b, - 0x6a, 0x1f, 0xfa, 0xed, 0x06, 0x23, 0x00, 0x83, 0xca, 0xd2, 0x8d, 0x09, - 0xb8, 0x18, 0x2e, 0xca, 0x6a, 0xad, 0xe0, 0x5b, 0x44, 0x0f, 0x2b, 0xb8, - 0x8f, 0x3d, 0x71, 0xbf, 0xc5, 0x5c, 0xcf, 0x7f, 0x0d, 0x4c, 0xc6, 0xe6, - 0x4d, 0x04, 0xb8, 0x6b, 0x7b, 0xf1, 0xc6, 0x9e, 0xf6, 0xcc, 0x85, 0x73, - 0x0e, 0x82, 0xc5, 0xec, 0x97, 0x7c, 0x36, 0x32, 0xbf, 0xfa, 0xfb, 0xaf, - 0x19, 0x47, 0x03, 0xf6, 0xbb, 0xb6, 0x92, 0x08, 0x5c, 0xe2, 0x7b, 0x1f, - 0xff, 0xaa, 0xac, 0xe3, 0x6b, 0x0a, 0x6f, 0xe2, 0xbc, 0x9a, 0x01, 0xb0, - 0x13, 0xb5, 0x0c, 0x2f, 0x31, 0xc5, 0xad, 0x97, 0x7d, 0xba, 0x28, 0xe3, - 0xdd, 0xdb, 0xa8, 0xde, 0x25, 0x80, 0xb2, 0x83, 0xa2, 0x35, 0x52, 0x14, - 0x3f, 0x4f, 0x09, 0xc9, 0x35, 0x7b, 0xef, 0x1f, 0x2e, 0x71, 0x28, 0xb9, - 0xa2, 0x4a, 0xa1, 0xa7, 0x42, 0x9f, 0x0b, 0x7c, 0x09, 0x87, 0xe4, 0x45, - 0x68, 0x7c, 0x8f, 0xb8, 0x4b, 0xe8, 0x30, 0x16, 0x1c, 0xf9, 0x62, 0x0d, - 0x0b, 0x14, 0x38, 0xcd, 0x39, 0xf8, 0xf0, 0x9e, 0x85, 0x17, 0x07, 0xbf, - 0xb7, 0x82, 0xd9, 0x3f, 0x6a, 0x48, 0x94, 0x9c, 0xe1, 0x05, 0x1b, 0xb7, - 0x74, 0x33, 0xf1, 0x93, 0x87, 0xef, 0x47, 0xf6, 0x98, 0x87, 0xc6, 0xda, - 0x31, 0x92, 0x31, 0x7e, 0xf1, 0x46, 0x4d, 0x3f, 0xaa, 0x9f, 0xda, 0xc5, - 0x62, 0xa1, 0xc6, 0x2d, 0xfb, 0x85, 0xdc, 0x09, 0x44, 0xc5, 0x1c, 0x5a, - 0xfb, 0x13, 0xe1, 0x32, 0x82, 0xa0, 0x5e, 0x92, 0x01, 0x12, 0x67, 0xa2, - 0x4a, 0xe2, 0xbc, 0xd7, 0x71, 0x0b, 0x0d, 0x23, 0x4a, 0x7d, 0xc6, 0x1a, - 0xd3, 0xfe, 0x00, 0x6e, 0x48, 0x6f, 0x40, 0xa7, 0x1d, 0x24, 0xaa, 0x5e, - 0x83, 0x60, 0x0e, 0xad, 0x8a, 0xdb, 0x08, 0x42, 0x9c, 0x96, 0x19, 0xa9, - 0x33, 0x3f, 0xaa, 0x03, 0x19, 0x3a, 0xb0, 0xd7, 0x07, 0xfc, 0x0c, 0xcf, - 0x8b, 0xff, 0x75, 0x4c, 0x79, 0x80, 0x4d, 0x80, 0xc2, 0xdd, 0x29, 0xc7, - 0x2c, 0x9e, 0x6b, 0xd0, 0xb7, 0x04, 0xbe, 0xf3, 0x9a, 0xa0, 0x7e, 0x52, - 0x6c, 0x48, 0x2b, 0x68, 0x50, 0x78, 0x33, 0xe4, 0x88, 0x04, 0x80, 0x6b, - 0x3f, 0x97, 0x36, 0x40, 0xd7, 0xa3, 0x7f, 0x88, 0x12, 0xd2, 0x35, 0x94, - 0xb7, 0x29, 0x24, 0xc1, 0xc0, 0x3d, 0x34, 0xec, 0x3a, 0xec, 0xba, 0xf8, - 0xf3, 0x78, 0xdc, 0xae, 0x7c, 0xbb, 0xef, 0x4d, 0x26, 0xe7, 0xb1, 0x90, - 0x71, 0xaf, 0x59, 0x1f, 0xcf, 0x90, 0x61, 0xf3, 0x10, 0xfd, 0x82, 0xd3, - 0x78, 0x3e, 0x7a, 0x19, 0x93, 0x25, 0xe7, 0xba, 0xbe, 0xfb, 0x02, 0x0e, - 0x02, 0xed, 0x40, 0x87, 0x34, 0xd8, 0x5c, 0x20, 0xc5, 0x9a, 0x52, 0x47, - 0xe3, 0x35, 0x1c, 0xee, 0x2a, 0xcc, 0x4d, 0xb7, 0x36, 0x49, 0x1a, 0xf8, - 0x76, 0xff, 0x0a, 0x5a, 0x2d, 0x39, 0xc2, 0xed, 0x73, 0x79, 0x1f, 0x05, - 0x8c, 0x1a, 0x0e, 0x1c, 0x91, 0xd1, 0x1b, 0x6d, 0xf4, 0xe7, 0xb5, 0x99, - 0xd3, 0x98, 0xba, 0x75, 0xf8, 0x74, 0x6e, 0xf5, 0x0b, 0xd9, 0xb7, 0x96, - 0x4e, 0xeb, 0x49, 0x1d, 0xfc, 0x91, 0x4b, 0x83, 0xb9, 0xbf, 0x46, 0xac, - 0x4e, 0x0b, 0x44, 0x77, 0x05, 0x76, 0x90, 0x30, 0x6c, 0xbc, 0xe9, 0xac, - 0xd9, 0xda, 0x28, 0x12, 0x38, 0x05, 0xd9, 0x02, 0x4c, 0x37, 0x5c, 0x73, - 0xf2, 0x8b, 0xad, 0x39, 0x47, 0xd4, 0x52, 0xd6, 0xa4, 0xed, 0xbb, 0xbf, - 0x00, 0x29, 0xfa, 0x64, 0xfe, 0x95, 0x28, 0x96, 0xd6, 0x83, 0x90, 0x91, - 0x6f, 0x3b, 0x5d, 0x03, 0x53, 0x91, 0x28, 0x92, 0x8a, 0x74, 0x04, 0x91, - 0xd0, 0xe0, 0xb1, 0x25, 0xe2, 0xdb, 0x82, 0x18, 0x5e, 0xee, 0x9d, 0xb3, - 0x1a, 0x05, 0x7d, 0x61, 0xc5, 0x83, 0x2b, 0x84, 0x66, 0x1c, 0xe0, 0x36, - 0xbd, 0xb3, 0xae, 0x9a, 0xa5, 0x41, 0x49, 0x2f, 0x94, 0xcb, 0x4e, 0x17, - 0xb7, 0x54, 0x84, 0x67, 0x4a, 0xe4, 0x9f, 0xb5, 0x7d, 0x90, 0xf6, 0x1f, - 0x6e, 0x32, 0xda, 0xf4, 0x5f, 0x79, 0xca, 0x08, 0xbe, 0x67, 0x08, 0xc4, - 0x30, 0xe8, 0xa8, 0x45, 0xb5, 0x64, 0xbf, 0xd1, 0x15, 0x8c, 0xcb, 0x48, - 0x9a, 0x50, 0x54, 0xe8, 0xb2, 0xda, 0xf8, 0x23, 0x9d, 0x59, 0xcd, 0x93, - 0xdf, 0x8e, 0x61, 0x6f, 0x90, 0xbc, 0x93, 0x2f, 0x80, 0x09, 0x8f, 0x21, - 0x85, 0xa8, 0xeb, 0x26, 0xdc, 0x45, 0x82, 0xf2, 0xd1, 0xd3, 0xc1, 0xa7, - 0xd9, 0x39, 0x12, 0xae, 0x77, 0xd4, 0x53, 0x2b, 0x01, 0x41, 0x65, 0xed, - 0x40, 0xaa, 0xf9, 0x86, 0x77, 0x8d, 0xeb, 0x09, 0x51, 0x11, 0x42, 0x0f, - 0xb8, 0xb6, 0x9b, 0x22, 0xcd, 0x3f, 0x02, 0x9a, 0x7e, 0xd2, 0xe8, 0xd2, - 0xb0, 0xd2, 0xb2, 0x64, 0x3e, 0xd0, 0xbe, 0xfd, 0x3b, 0x3d, 0x09, 0x76, - 0xae, 0xa6, 0x1a, 0x6c, 0x96, 0x06, 0x49, 0x8d, 0x4e, 0x85, 0x6a, 0xec, - 0x09, 0x58, 0x7b, 0x47, 0x43, 0xb2, 0x35, 0xd9, 0xe4, 0x85, 0x87, 0xfb, - 0x42, 0xc4, 0xf0, 0x01, 0xb4, 0x3f, 0x9a, 0xb7, 0x1f, 0x97, 0x24, 0x60, - 0xde, 0x6e, 0x91, 0xe7, 0xf1, 0xfb, 0xe2, 0x6e, 0xe1, 0x93, 0x8e, 0xff, - 0xb8, 0xd8, 0x5e, 0xfa, 0x2e, 0xc9, 0x82, 0x07, 0x65, 0xe4, 0x6b, 0xba, - 0xb2, 0x5e, 0xb4, 0xfa, 0xb3, 0x2b, 0x25, 0xa5, 0xed, 0x8b, 0x12, 0xf5, - 0xf7, 0x98, 0xd4, 0xf8, 0x57, 0x00, 0x7f, 0x17, 0x3c, 0xac, 0x65, 0x51, - 0x6c, 0xfb, 0x96, 0x75, 0xdd, 0x62, 0x74, 0x95, 0xa9, 0x2c, 0x9c, 0xe8, - 0x70, 0xdd, 0xd0, 0xd6, 0xaa, 0x77, 0x88, 0xa8, 0x6d, 0xea, 0x63, 0x6f, - 0x1c, 0x3f, 0x2b, 0xd9, 0x46, 0x49, 0x87, 0x6d, 0x16, 0xb1, 0x4f, 0xa6, - 0x82, 0x24, 0xf2, 0x22, 0xa8, 0x79, 0x19, 0x4b, 0x4a, 0x98, 0x01, 0x93, - 0xed, 0xd2, 0x3b, 0x16, 0xa2, 0xf2, 0xb4, 0xe2, 0x64, 0x92, 0x57, 0x10, - 0x0d, 0x71, 0x7c, 0x3a, 0x14, 0x1f, 0x3d, 0x1f, 0x71, 0xe6, 0xef, 0x63, - 0x0c, 0xdc, 0xab, 0x74, 0x3e, 0x61, 0xcc, 0x49, 0xdf, 0x52, 0x17, 0x7c, - 0xd2, 0x39, 0x1f, 0xef, 0xfa, 0x4e, 0xa6, 0xba, 0x02, 0x1e, 0xa2, 0x69, - 0x81, 0xc0, 0x95, 0x71, 0x3d, 0x36, 0x31, 0x1e, 0x1b, 0xe1, 0xde, 0x9b, - 0x77, 0x57, 0x9d, 0xfb, 0x18, 0x05, 0x68, 0xda, 0x9b, 0x2e, 0xe6, 0x36, - 0x29, 0xd1, 0xdb, 0xe1, 0xe0, 0x88, 0x2e, 0x84, 0xa8, 0x44, 0x76, 0x51, - 0x95, 0x6a, 0x0b, 0xe6, 0x6a, 0x69, 0x6f, 0x8e, 0x10, 0x3b, 0x88, 0x80, - 0x02, 0xe5, 0xcb, 0xa3, 0x5a, 0x29, 0x51, 0xb8, 0x69, 0xe8, 0x9f, 0xc8, - 0xae, 0xad, 0x78, 0x88, 0xfc, 0xa4, 0xe0, 0x4b, 0x08, 0x0e, 0xcb, 0x56, - 0x61, 0x74, 0xab, 0xdb, 0x60, 0xdc, 0x59, 0x7e, 0xc1, 0x82, 0xdc, 0x23, - 0x85, 0x3e, 0x79, 0x01, 0x52, 0x47, 0x9b, 0x92, 0xac, 0x40, 0x2e, 0x89, - 0x0e, 0xdb, 0x80, 0xf0, 0x1c, 0x02, 0x5b, 0xc2, 0x99, 0x65, 0x04, 0xb5, - 0x76, 0x88, 0x0f, 0x00, 0x00, 0x19, 0x34, 0x3e, 0xe9, 0x07, 0x24, 0xd2, - 0x36, 0x09, 0xdb, 0xdc, 0x7a, 0xaf, 0x9a, 0x5a, 0xb9, 0x8a, 0x91, 0x3a, - 0xb7, 0x06, 0x94, 0x32, 0xae, 0xbb, 0x99, 0xda, 0xb5, 0xe3, 0xa1, 0x2f, - 0x44, 0x38, 0x81, 0xca, 0x78, 0xa1, 0x1e, 0xe8, 0x77, 0x83, 0xb3, 0xa7, - 0x4e, 0xdb, 0x6e, 0x3d, 0xb6, 0x25, 0xac, 0xf1, 0xf1, 0x59, 0x79, 0xa5, - 0x69, 0xca, 0xbb, 0x5d, 0xe0, 0x6c, 0xb7, 0xf7, 0x8c, 0x48, 0x3d, 0x45, - 0x01, 0x46, 0x6f, 0x8b, 0x83, 0x48, 0xc8, 0x2b, 0xe7, 0xc7, 0xd7, 0x6f, - 0x17, 0x40, 0xa4, 0x87, 0xf6, 0x3c, 0x92, 0x57, 0x00, 0xad, 0x91, 0x5e, - 0x42, 0x97, 0xf5, 0x8f, 0x5d, 0x1b, 0xeb, 0x4d, 0xd7, 0xda, 0x4b, 0x83, - 0x0e, 0x64, 0x7c, 0x90, 0x24, 0x38, 0x79, 0x11, 0x4f, 0x3a, 0xe8, 0x3b, - 0xcb, 0xd9, 0x41, 0x08, 0x8b, 0x48, 0x89, 0x35, 0x8d, 0x44, 0x1f, 0x1f, - 0xaa, 0xe9, 0x7e, 0x2d, 0x27, 0xf4, 0x5d, 0xf7, 0x1e, 0x4c, 0x9e, 0x6f, - 0xc4, 0xb5, 0x8e, 0x81, 0x5f, 0x92, 0x8e, 0x71, 0xc8, 0x04, 0x69, 0xce, - 0x3c, 0xbc, 0x17, 0x8e, 0xd7, 0x17, 0xaa, 0x51, 0xcb, 0x55, 0x86, 0x5c, - 0x84, 0x47, 0x3b, 0x63, 0xb3, 0x79, 0x83, 0xd7, 0xb4, 0x6d, 0xdd, 0xa8, - 0x16, 0xb7, 0x93, 0x59, 0xbb, 0x42, 0xae, 0x4d, 0x6a, 0x5e, 0xce, 0xbd, - 0x8f, 0xb0, 0x05, 0x2c, 0x56, 0xb8, 0x87, 0x5f, 0xe3, 0x7a, 0xc0, 0x83, - 0x7a, 0xce, 0xac, 0x96, 0xa3, 0x09, 0xbf, 0x33, 0xf4, 0x23, 0xfd, 0xd1, - 0x05, 0x25, 0x6b, 0xb1, 0xfd, 0x05, 0x96, 0x75, 0xcb, 0xca, 0xa3, 0xdd, - 0xc1, 0xd9, 0xc7, 0x25, 0xfe, 0x40, 0x76, 0xbe, 0xe8, 0x7a, 0x8e, 0x54, - 0x93, 0x6a, 0xa0, 0x42, 0x9a, 0x7b, 0x9b, 0x14, 0x94, 0x2a, 0x4a, 0xbc, - 0x35, 0xde, 0x05, 0xfb, 0x4d, 0xb0, 0x5f, 0x20, 0x2b, 0xd0, 0xd2, 0x6d, - 0x44, 0x2f, 0x80, 0xe4, 0x7e, 0x64, 0xb1, 0xc0, 0xaf, 0xf6, 0xc8, 0x82, - 0x8d, 0x2f, 0x91, 0xac, 0x52, 0x38, 0xea, 0x79, 0x2b, 0x56, 0xb1, 0x85, - 0x67, 0xac, 0x10, 0x4a, 0x30, 0x19, 0x18, 0x61, 0x49, 0x99, 0x3d, 0x89, - 0xc1, 0x75, 0x09, 0xc1, 0x3e, 0x39, 0x97, 0x56, 0x46, 0x18, 0x7e, 0x81, - 0xb3, 0x4c, 0x5b, 0x59, 0x6a, 0xe6, 0x25, 0x7e, 0x98, 0xd8, 0x4f, 0x5f, - 0xeb, 0x3e, 0xbd, 0x9b, 0x8a, 0x40, 0x7d, 0x7c, 0xf9, 0xb7, 0xb3, 0x87, - 0x70, 0x6f, 0xb9, 0xbc, 0x16, 0x0b, 0x1b, 0x03, 0x7e, 0xcd, 0xfc, 0x45, - 0x2d, 0xcf, 0x1e, 0x0a, 0xfb, 0x49, 0x40, 0x5e, 0xc1, 0xfc, 0x2d, 0x77, - 0x32, 0x79, 0xc5, 0xf2, 0x10, 0x9a, 0x51, 0xa5, 0x24, 0x56, 0xb9, 0xa2, - 0xdb, 0x83, 0x3b, 0x6b, 0xc9, 0x68, 0x16, 0x61, 0x52, 0xbb, 0x8a, 0xf1, - 0xb8, 0xa4, 0x4a, 0x1e, 0x60, 0x77, 0x7a, 0x71, 0xfc, 0x0e, 0x53, 0x6d, - 0x8a, 0x18, 0x74, 0x86, 0x88, 0x59, 0xd6, 0x8f, 0x11, 0x23, 0xa0, 0xd9, - 0xe2, 0x60, 0xfc, 0xec, 0x1e, 0xb5, 0x61, 0x75, 0x98, 0x66, 0xe5, 0x9d, - 0x85, 0x6f, 0x1b, 0x44, 0x11, 0x96, 0x38, 0x52, 0xd2, 0x94, 0x2f, 0x98, - 0x46, 0xb6, 0x56, 0xc1, 0x5d, 0x19, 0x0f, 0x2d, 0x54, 0xce, 0xfc, 0xcd, - 0xcc, 0xd9, 0x2f, 0xe0, 0x2a, 0x4e, 0x8c, 0x53, 0x78, 0x2f, 0x79, 0x79, - 0x64, 0x22, 0x91, 0x03, 0x17, 0x4e, 0x4a, 0x62, 0x33, 0x17, 0x8a, 0x82, - 0x6a, 0x01, 0x97, 0x29, 0x7d, 0x13, 0xe7, 0x9e, 0x0e, 0xe8, 0xbc, 0x1a, - 0xc9, 0x89, 0x31, 0x6b, 0xff, 0xba, 0x3e, 0x49, 0xec, 0xa8, 0x38, 0x42, - 0x06, 0xfd, 0x43, 0xc6, 0x6a, 0xa7, 0xcc, 0xb2, 0x44, 0xe3, 0x7e, 0x01, - 0xc3, 0x1d, 0x98, 0x0c, 0x41, 0xb6, 0x92, 0xd0, 0x0b, 0xbf, 0x3a, 0x5c, - 0x3c, 0x35, 0x1c, 0xda, 0x97, 0xe9, 0xbf, 0x0d, 0x91, 0xea, 0xd2, 0x4a, - 0x16, 0xa6, 0xa1, 0x28, 0x31, 0x5c, 0x91, 0x23, 0xac, 0x68, 0xb6, 0xc1, - 0x15, 0xda, 0x63, 0xdf, 0x93, 0xe7, 0x2f, 0x10, 0x56, 0x71, 0x2d, 0xd6, - 0x0c, 0x3e, 0xfe, 0xbd, 0x96, 0x45, 0xf5, 0x96, 0x0c, 0xcb, 0xf4, 0xa4, - 0x35, 0x85, 0xa8, 0x68, 0x9c, 0xa7, 0x1b, 0x8c, 0xd2, 0xa1, 0xb6, 0x69, - 0x33, 0x7f, 0x34, 0xa3, 0xb0, 0x9f, 0x32, 0x94, 0xfb, 0x59, 0x26, 0xf0, - 0x7c, 0x73, 0xce, 0xf5, 0xe9, 0x0f, 0x18, 0x4c, 0xe5, 0x5a, 0x33, 0x47, - 0xc8, 0xb2, 0x1b, 0x34, 0x7c, 0x05, 0xa9, 0xd7, 0x80, 0x73, 0xba, 0x12, - 0x6b, 0xaa, 0xd2, 0x6d, 0x4a, 0x05, 0xd2, 0xa0, 0xba, 0x1f, 0xef, 0x7e, - 0xd8, 0x2c, 0xde, 0x2c, 0x52, 0x9e, 0xe8, 0x64, 0x1f, 0x3c, 0x82, 0xfa, - 0x3a, 0xef, 0x5a, 0xdf, 0xab, 0x05, 0x7f, 0xa5, 0x68, 0x52, 0x69, 0x44, - 0xd7, 0x26, 0xb3, 0xbc, 0x9f, 0x12, 0xa7, 0x2d, 0x63, 0x07, 0xab, 0x0c, - 0x1a, 0xde, 0x56, 0x4e, 0xde, 0x5a, 0xba, 0x1a, 0xb4, 0x36, 0xc9, 0xa0, - 0x92, 0x44, 0xf4, 0x78, 0x10, 0xdc, 0x82, 0xef, 0x6e, 0x12, 0x22, 0x0f, - 0x91, 0xbd, 0x5e, 0xda, 0xf8, 0xb9, 0x28, 0xa0, 0xe3, 0xb4, 0x55, 0xdd, - 0x42, 0x5a, 0x4a, 0xb4, 0xf5, 0x57, 0x0b, 0x7f, 0x73, 0xa9, 0xbf, 0x19, - 0x7a, 0x52, 0xd7, 0x19, 0x67, 0xf4, 0x31, 0xb7, 0x8e, 0xa3, 0x60, 0xf6, - 0x46, 0x58, 0xd0, 0xcd, 0x9f, 0x3f, 0x8f, 0x61, 0x64, 0xdd, 0xa8, 0xbe, - 0x45, 0xa4, 0x16, 0xaa, 0xca, 0x12, 0xd1, 0x20, 0x33, 0xb9, 0xc1, 0x19, - 0xf3, 0x98, 0x4c, 0x6a, 0x2d, 0x24, 0x5a, 0x2f, 0xc9, 0xc1, 0x74, 0xf6, - 0x0d, 0xda, 0xca, 0xd8, 0xd7, 0xb8, 0x94, 0x1c, 0xda, 0x4f, 0xb8, 0x4c, - 0x8b, 0x83, 0x36, 0x83, 0x1e, 0xcc, 0x89, 0x59, 0x10, 0xa9, 0x49, 0x5c, - 0x8c, 0xad, 0x93, 0xc4, 0x9c, 0x0e, 0x29, 0x9e, 0x9f, 0xb6, 0x02, 0x95, - 0x53, 0x8b, 0x77, 0x60, 0xaa, 0xdd, 0xd4, 0x88, 0x13, 0x11, 0xe0, 0xca, - 0x02, 0x63, 0x8e, 0xcc, 0x03, 0x38, 0xc9, 0xbc, 0xbe, 0x65, 0xe7, 0x08, - 0x0c, 0xff, 0xaa, 0x14, 0x8a, 0x0c, 0x94, 0x15, 0x23, 0x28, 0xb4, 0xe4, - 0x91, 0x72, 0x08, 0xc6, 0xb6, 0x8e, 0xab, 0x00, 0xda, 0xb9, 0x11, 0x36, - 0x81, 0xa0, 0x67, 0x19, 0xc9, 0x55, 0x96, 0x61, 0xca, 0x69, 0xaf, 0xba, - 0x5d, 0x67, 0xfc, 0x6a, 0x14, 0xeb, 0xb8, 0xad, 0xbc, 0x6b, 0x33, 0xcd, - 0x37, 0x53, 0x4d, 0x47, 0x9f, 0xef, 0xa1, 0xde, 0xe4, 0x35, 0xb2, 0x66, - 0x97, 0x2b, 0x9b, 0x99, 0x1d, 0x4b, 0x60, 0x7f, 0xab, 0xa2, 0xd1, 0x7e, - 0xef, 0xbe, 0xa4, 0x3e, 0x05, 0x41, 0xe8, 0x91, 0xaa, 0xfb, 0xd2, 0xf1, - 0x7c, 0xd7, 0x9d, 0xb1, 0x15, 0x31, 0x13, 0x30, 0xdf, 0x53, 0x0c, 0x75, - 0xfe, 0x4d, 0x30, 0x7e, 0x70, 0xca, 0xb7, 0xa5, 0x56, 0x1b, 0xdb, 0xef, - 0x42, 0x33, 0x24, 0x38, 0xaf, 0x24, 0xe0, 0x54, 0xd9, 0xed, 0x89, 0x0c, - 0xfd, 0xd0, 0x88, 0x25, 0xab, 0x45, 0x2a, 0xb9, 0x2b, 0xec, 0xba, 0x46, - 0x02, 0xdc, 0xea, 0x5d, 0x83, 0x51, 0x3a, 0xa7, 0xe4, 0xe1, 0x8c, 0xaf, - 0x4f, 0xb0, 0x6d, 0x6b, 0xd7, 0xdc, 0xea, 0x9a, 0x4a, 0x40, 0x3b, 0x9b, - 0x0a, 0x5c, 0x4d, 0x47, 0xc3, 0x17, 0xfd, 0x83, 0xc2, 0x76, 0x82, 0x28, - 0xb2, 0xa4, 0xb1, 0x2a, 0x1b, 0x08, 0x58, 0x9a, 0xf1, 0x10, 0x12, 0x87, - 0xbd, 0x27, 0x55, 0x9b, 0xf4, 0xc7, 0x5c, 0xe1, 0x6a, 0x97, 0x7e, 0x2c, - 0x60, 0x02, 0x91, 0x0d, 0xd2, 0x18, 0x2a, 0xfc, 0x20, 0x9b, 0x24, 0x46, - 0x07, 0xd1, 0x3c, 0xab, 0xa5, 0xdd, 0x8b, 0xab, 0x64, 0x3c, 0xb3, 0x5a, - 0x15, 0x88, 0xa0, 0x22, 0x4d, 0x67, 0xbc, 0x97, 0xd6, 0x12, 0x7d, 0x64, - 0x85, 0xf5, 0xe7, 0x7f, 0x26, 0x43, 0xea, 0xfc, 0xed, 0x61, 0x42, 0x82, - 0x29, 0x29, 0xf0, 0x4b, 0xee, 0xb2, 0x03, 0x7d, 0x80, 0x07, 0x2a, 0x5f, - 0x4b, 0x1f, 0x75, 0x92, 0xea, 0x3f, 0x87, 0x64, 0x54, 0xc8, 0x4a, 0x79, - 0x04, 0xb8, 0x53, 0xc9, 0xb4, 0xed, 0x04, 0xf0, 0x9d, 0xf0, 0x0d, 0xce, - 0x59, 0x41, 0x27, 0xf1, 0xba, 0xea, 0xa0, 0x3e, 0xe8, 0x15, 0xde, 0x91, - 0x34, 0xd5, 0xff, 0x60, 0xcc, 0x43, 0x0b, 0x08, 0x4d, 0xe9, 0x4a, 0xb2, - 0x6c, 0xc6, 0x75, 0x42, 0x1e, 0x64, 0xe6, 0x84, 0xd3, 0x02, 0xc5, 0x34, - 0x58, 0xe4, 0xb3, 0x5b, 0x4f, 0x68, 0xd7, 0xb5, 0x8e, 0xf4, 0xdd, 0x14, - 0xea, 0xfe, 0xed, 0x96, 0xc0, 0xa7, 0x9e, 0x23, 0x7c, 0xce, 0x70, 0xd3, - 0x4a, 0xc4, 0x59, 0xca, 0xc1, 0x1d, 0xa6, 0x67, 0x29, 0x13, 0x63, 0x56, - 0x9e, 0xdd, 0x3d, 0xd1, 0xb0, 0xa5, 0x22, 0xae, 0xd5, 0xaa, 0x5a, 0x5b, - 0x20, 0x95, 0xa9, 0xcd, 0x5c, 0xdf, 0x52, 0xb1, 0xf3, 0xaf, 0x81, 0xc9, - 0x95, 0x80, 0xa7, 0x2a, 0xc0, 0xf6, 0xb7, 0xd1, 0x81, 0xac, 0x54, 0x45, - 0x51, 0x12, 0xeb, 0x36, 0x89, 0x5e, 0x37, 0x33, 0x70, 0x46, 0x8b, 0xd6, - 0xe2, 0x68, 0x36, 0xca, 0xa0, 0xcb, 0xe0, 0x52, 0x70, 0xe4, 0xfa, 0xb1, - 0x6a, 0xe8, 0x44, 0xcf, 0xbe, 0x0c, 0xf8, 0x4d, 0xa0, 0x41, 0x83, 0xdd, - 0x04, 0xf7, 0x03, 0x34, 0x53, 0x8f, 0x9b, 0xb9, 0x7a, 0xca, 0x3c, 0x09, - 0x85, 0x71, 0x0d, 0x8c, 0xcd, 0x41, 0x65, 0x44, 0x80, 0x59, 0x3a, 0xee, - 0xdb, 0x96, 0xa0, 0xef, 0x09, 0x17, 0x44, 0xbe, 0x8b, 0xe1, 0xba, 0x76, - 0xa6, 0x9d, 0x91, 0xeb, 0x47, 0x11, 0x6b, 0xb5, 0xad, 0x61, 0x49, 0x1a, - 0xb6, 0xd9, 0x9d, 0x60, 0x92, 0x4d, 0xbf, 0xe0, 0xbf, 0x97, 0x49, 0x60, - 0x7a, 0x5d, 0x2f, 0x6a, 0x2a, 0x6f, 0xdf, 0x55, 0x76, 0x47, 0xbe, 0xd8, - 0xa8, 0x03, 0x2b, 0x2c, 0x29, 0xa8, 0xac, 0x22, 0x9f, 0xb4, 0x60, 0x70, - 0xef, 0x26, 0x5b, 0x5e, 0xf3, 0x8d, 0x7e, 0x45, 0x66, 0xe6, 0x9d, 0x05, - 0x50, 0x76, 0x05, 0x88, 0xf0, 0x84, 0xd6, 0x28, 0x1d, 0x07, 0xaf, 0x7c, - 0xaf, 0x4e, 0xa1, 0xf8, 0xec, 0xb3, 0x03, 0x98, 0xaa, 0x39, 0x03, 0x61, - 0x4c, 0x26, 0xfd, 0x9f, 0x28, 0xc0, 0x8d, 0x4f, 0x47, 0x45, 0xc0, 0x88, - 0x72, 0x7b, 0x69, 0x4f, 0x5d, 0x5f, 0xbc, 0xf3, 0x21, 0xc2, 0x79, 0xc4, - 0x16, 0x8f, 0xc0, 0x77, 0xb2, 0xf3, 0xf7, 0x6c, 0x43, 0xd8, 0xd5, 0xa7, - 0x2e, 0xa8, 0x9a, 0x8c, 0xd7, 0x94, 0x01, 0x70, 0xb0, 0xad, 0xcd, 0xfd, - 0x07, 0x1f, 0x6b, 0x47, 0xd5, 0x4b, 0x81, 0x4b, 0x24, 0x5e, 0x07, 0x2d, - 0xf8, 0xa9, 0x02, 0xd6, 0x0a, 0x96, 0x10, 0xb7, 0x63, 0x2d, 0xd9, 0xad, - 0x11, 0xf0, 0x4d, 0x49, 0x1b, 0x37, 0x1f, 0x2a, 0x6d, 0x21, 0xb0, 0x88, - 0x34, 0x32, 0xa4, 0x9e, 0xca, 0x2a, 0x23, 0x35, 0x0e, 0x1b, 0xd6, 0x38, - 0xb5, 0x0d, 0xc0, 0xa4, 0x61, 0xdf, 0xab, 0xf9, 0xb3, 0x65, 0x5b, 0x33, - 0xb6, 0xeb, 0xf5, 0xdd, 0x7c, 0x3b, 0xa7, 0xc6, 0x62, 0xc4, 0xfa, 0x5a, - 0x97, 0x7b, 0xe8, 0xe7, 0x4a, 0x16, 0x03, 0x23, 0x22, 0xf6, 0xd7, 0x92, - 0x88, 0x6f, 0x39, 0x01, 0x23, 0xbd, 0x91, 0x15, 0x7c, 0x0f, 0x58, 0xa7, - 0x22, 0x14, 0x5a, 0x72, 0x95, 0x40, 0xa9, 0x57, 0x64, 0xdd, 0x1b, 0x3f, - 0xfa, 0x2c, 0x32, 0xe0, 0x5c, 0x4e, 0x89, 0xe3, 0xc0, 0xfb, 0x16, 0xac, - 0xb7, 0x5a, 0x63, 0x0f, 0x19, 0x03, 0x78, 0x85, 0xa6, 0xe0, 0xf4, 0xc6, - 0x29, 0x04, 0x7d, 0xb7, 0xaa, 0xb1, 0x5e, 0x6f, 0xa5, 0x7a, 0xa1, 0xe3, - 0xa0, 0x88, 0x95, 0x82, 0x25, 0x30, 0xba, 0x93, 0x4a, 0xa6, 0x54, 0xa8, - 0x3e, 0x72, 0x16, 0xb6, 0xcd, 0xab, 0x98, 0x95, 0xd4, 0xd8, 0x44, 0x30, - 0x04, 0x84, 0x85, 0x5f, 0x9f, 0x4b, 0x28, 0xb1, 0x89, 0xfc, 0x4c, 0x8e, - 0xec, 0xc8, 0x5f, 0xd9, 0xeb, 0x6f, 0xdf, 0x75, 0xb6, 0x00, 0xdd, 0x5e, - 0xc7, 0x21, 0xcd, 0x59, 0x06, 0x03, 0x1a, 0x34, 0xfa, 0x0a, 0x4b, 0xa8, - 0xe9, 0x04, 0x6d, 0x92, 0xc9, 0x3f, 0xe2, 0xc3, 0xce, 0xc0, 0xbe, 0xa7, - 0x8c, 0x8c, 0x22, 0x06, 0x71, 0xa8, 0x41, 0x9a, 0xe7, 0xb9, 0x82, 0x3e, - 0x07, 0x46, 0xe2, 0x2b, 0x0b, 0x71, 0x7e, 0xd0, 0xba, 0x4a, 0x1a, 0x57, - 0x25, 0x83, 0xb8, 0x7a, 0x29, 0xea, 0xed, 0x40, 0xc5, 0x4b, 0x60, 0xd9, - 0x6d, 0xdd, 0x2e, 0xd7, 0xe8, 0xca, 0x77, 0xd4, 0x75, 0x4e, 0x81, 0x08, - 0x1e, 0xe9, 0xaf, 0x65, 0x87, 0x5f, 0x2d, 0xe0, 0xfe, 0xa3, 0x81, 0x1c, - 0xd1, 0xf3, 0x7c, 0x1d, 0xb3, 0x08, 0xea, 0x00, 0x15, 0x94, 0x5f, 0xd8, - 0x19, 0x45, 0xaf, 0x63, 0x8c, 0x1e, 0xbe, 0x17, 0xe6, 0xee, 0x1a, 0x4c, - 0x80, 0xf5, 0x20, 0x52, 0x09, 0x03, 0x23, 0x83, 0xad, 0x66, 0x40, 0xe7, - 0x6c, 0x0d, 0xce, 0x41, 0xd1, 0xf1, 0x24, 0xfa, 0xc4, 0x93, 0xaa, 0x71, - 0xec, 0xfa, 0x4f, 0xa2, 0x34, 0xac, 0x30, 0x41, 0x2b, 0x62, 0xd8, 0x51, - 0xa4, 0x2f, 0x7c, 0xf6, 0xb5, 0x17, 0x05, 0xda, 0x70, 0xef, 0x74, 0x88, - 0xe2, 0xf4, 0xb1, 0xa7, 0x8f, 0xea, 0x43, 0x3f, 0x23, 0x66, 0x86, 0xac, - 0xe9, 0x57, 0x36, 0x0e, 0x9d, 0x73, 0x64, 0xef, 0xec, 0x7f, 0xf3, 0x95, - 0x40, 0x9d, 0xfe, 0xc1, 0x78, 0x5e, 0x73, 0xd3, 0x6b, 0x62, 0xd0, 0xa7, - 0x59, 0xd4, 0x73, 0xcb, 0xf7, 0x2d, 0x45, 0x80, 0xa5, 0x9c, 0x79, 0xe5, - 0xb8, 0x9e, 0xb9, 0x61, 0xac, 0x9b, 0x19, 0x4f, 0x0c, 0x47, 0xa5, 0x88, - 0x1f, 0xe9, 0xd3, 0x31, 0xf8, 0x9f, 0x9b, 0x34, 0x5d, 0x23, 0x44, 0xfc, - 0x7d, 0xfd, 0x8c, 0x0f, 0x2d, 0xfb, 0x7c, 0xd5, 0x74, 0x94, 0x0d, 0xc9, - 0xc4, 0x60, 0x36, 0x11, 0x81, 0xe4, 0x45, 0x65, 0x11, 0x2b, 0x5a, 0x21, - 0xd2, 0xfa, 0x86, 0x85, 0xe1, 0xd3, 0x14, 0xb8, 0x82, 0xf2, 0x81, 0x00, - 0x00, 0xdd, 0xa6, 0x66, 0x8b, 0x63, 0xf5, 0xce, 0x65, 0x57, 0xf8, 0xda, - 0xaa, 0x97, 0x24, 0x16, 0x7f, 0xa5, 0x3f, 0xf7, 0xee, 0xbe, 0x1c, 0x48, - 0x32, 0x1b, 0x8c, 0x81, 0x34, 0xc9, 0x9f, 0x79, 0xd9, 0xd6, 0x81, 0xe5, - 0x82, 0x90, 0xb2, 0x23, 0xef, 0x6d, 0xaf, 0x97, 0xad, 0x07, 0x09, 0xbc, - 0x95, 0xba, 0xb2, 0x88, 0xf3, 0x4f, 0x4b, 0xf6, 0x95, 0x09, 0x88, 0xa2, - 0xfc, 0x23, 0xc4, 0x3b, 0x7c, 0x90, 0xbe, 0x82, 0xc3, 0x7d, 0xd5, 0x62, - 0x77, 0xbe, 0x74, 0x93, 0x48, 0x1a, 0x09, 0x84, 0x1a, 0xad, 0xe1, 0x53, - 0x9a, 0x18, 0x28, 0xd2, 0x82, 0x12, 0x2a, 0x4c, 0x9f, 0xe9, 0xfa, 0xd5, - 0x8d, 0xf8, 0x03, 0xb0, 0xc0, 0x3e, 0xff, 0xff, 0xef, 0x57, 0x33, 0x21, - 0xa0, 0xd1, 0x27, 0x18, 0xf4, 0x0a, 0xf7, 0xd4, 0x96, 0x71, 0x7b, 0x9b, - 0xd3, 0x11, 0x45, 0x90, 0x66, 0x98, 0x7c, 0xe0, 0xe7, 0x96, 0x4b, 0x8d, - 0x56, 0x81, 0x41, 0x4d, 0x2d, 0x77, 0xa0, 0xf6, 0xa2, 0x78, 0x11, 0xfa, - 0x72, 0x1c, 0xfa, 0x86, 0xd6, 0x17, 0xad, 0x29, 0x62, 0xea, 0xb6, 0x24, - 0x27, 0x7c, 0x55, 0xc6, 0xf8, 0x83, 0xb4, 0xf6, 0xbc, 0x12, 0xc9, 0x15, - 0x51, 0xc0, 0x2b, 0x8b, 0x9c, 0x23, 0x7f, 0x56, 0x52, 0x3f, 0x0b, 0x68, - 0xbe, 0x69, 0xcc, 0x11, 0x92, 0x1d, 0xd7, 0xf1, 0x99, 0x4f, 0x9f, 0x54, - 0x73, 0x58, 0xbc, 0xd1, 0x0d, 0x7e, 0xf8, 0xb6, 0xa5, 0x23, 0xb4, 0x62, - 0xda, 0x83, 0x12, 0x7e, 0xdc, 0x3c, 0xd5, 0x33, 0xe5, 0x6b, 0xd5, 0x71, - 0xd3, 0xbf, 0xb8, 0xd3, 0xde, 0xbe, 0x62, 0xa0, 0x62, 0x34, 0x11, 0x02, - 0x06, 0x49, 0xe2, 0x7e, 0xa8, 0x24, 0x4e, 0x53, 0xe6, 0xc1, 0xd9, 0xe5, - 0xa3, 0x78, 0xf2, 0xaa, 0xf6, 0x4c, 0x71, 0xe5, 0x58, 0x4e, 0x2a, 0x15, - 0x52, 0xa9, 0x7a, 0x44, 0xe1, 0x6c, 0xef, 0x10, 0x80, 0x09, 0x22, 0x97, - 0x68, 0xf8, 0x48, 0x23, 0x43, 0x76, 0xa7, 0xdc, 0x4d, 0x1f, 0x1b, 0x5e, - 0xd0, 0xc3, 0x8c, 0x36, 0xd7, 0x9d, 0xac, 0x34, 0x37, 0x7d, 0xdc, 0x03, - 0xa4, 0x60, 0xbf, 0x22, 0xc7, 0xbd, 0x48, 0x21, 0x29, 0xfc, 0xc0, 0x11, - 0x81, 0x15, 0xbe, 0x45, 0x5f, 0x87, 0xb6, 0x8a, 0xf7, 0x13, 0x18, 0xb1, - 0xd4, 0xeb, 0x79, 0x4d, 0xc2, 0x52, 0x96, 0xaa, 0x71, 0x7c, 0x5b, 0x26, - 0x35, 0xd2, 0xe0, 0x2d, 0x38, 0xc3, 0x46, 0x4c, 0x78, 0xb6, 0xd1, 0x2d, - 0x85, 0xe8, 0xac, 0xd8, 0xa7, 0x4c, 0x40, 0xd5, 0x4b, 0xb8, 0x92, 0xf8, - 0x3f, 0x9c, 0x6e, 0x42, 0x4e, 0xa8, 0x53, 0x69, 0xf2, 0x00, 0xdc, 0xf8, - 0x0f, 0xa6, 0x7f, 0x8a, 0xc0, 0x98, 0xc0, 0x1a, 0x0e, 0x22, 0x02, 0xde, - 0xbc, 0xe7, 0xfb, 0x33, 0x76, 0x35, 0xa3, 0x0f, 0xfe, 0xda, 0x33, 0x55, - 0xf9, 0x56, 0x02, 0xa6, 0xd9, 0xe2, 0x60, 0x4e, 0x65, 0xaa, 0x0a, 0x38, - 0x40, 0x20, 0xa5, 0x8d, 0x38, 0x7b, 0xdc, 0x28, 0x68, 0x74, 0x40, 0xf0, - 0x7b, 0xa2, 0xfc, 0x7d, 0x56, 0x5f, 0x05, 0x4d, 0xdb, 0xd9, 0x96, 0x77, - 0x66, 0x28, 0x03, 0x97, 0x4c, 0x75, 0xa1, 0xda, 0x05, 0x0b, 0xa5, 0xab, - 0x79, 0x5c, 0x3d, 0xdc, 0xa2, 0x49, 0x2f, 0x76, 0x94, 0xfa, 0x78, 0x90, - 0xe1, 0xcd, 0x1a, 0xd7, 0x00, 0xe1, 0x14, 0xfe, 0xf7, 0x7b, 0x74, 0xcd, - 0x1f, 0xb4, 0x31, 0x6e, 0x0f, 0x0f, 0x74, 0xaa, 0x29, 0x04, 0x70, 0xf8, - 0xb5, 0x3e, 0x1e, 0x67, 0x2a, 0xe1, 0xfe, 0xfc, 0xb1, 0x11, 0x18, 0x93, - 0x6a, 0x87, 0xd1, 0x53, 0x09, 0x97, 0xfd, 0x0b, 0x0f, 0xc2, 0x77, 0x63, - 0xf0, 0x20, 0x30, 0x52, 0x03, 0xfa, 0xbd, 0xc5, 0x5d, 0x75, 0x57, 0x58, - 0x4e, 0x66, 0x4b, 0x84, 0x18, 0xbe, 0x2e, 0x81, 0xfc, 0x4b, 0x34, 0xf2, - 0x10, 0x04, 0x21, 0x05, 0x24, 0xee, 0x0f, 0x4c, 0xd3, 0xf8, 0xd7, 0xc9, - 0x23, 0x17, 0xf8, 0x50, 0xb0, 0x0d, 0x68, 0x28, 0x34, 0x6f, 0x17, 0xa5, - 0xf4, 0x3f, 0xfd, 0x0c, 0x2e, 0x4a, 0x6d, 0xe7, 0x7b, 0x29, 0x05, 0x5c, - 0x45, 0x79, 0x43, 0x46, 0x1a, 0x7f, 0xd1, 0xb5, 0x1e, 0xd7, 0xd7, 0xdc, - 0xd0, 0xe8, 0x65, 0x46, 0xce, 0x6e, 0x65, 0xa1, 0x5c, 0xde, 0x36, 0x3f, - 0x8c, 0x9d, 0xe2, 0x97, 0x7d, 0x5b, 0xe2, 0x02, 0xc0, 0xa2, 0x45, 0xa3, - 0x85, 0xbf, 0x19, 0x72, 0x8a, 0xfa, 0x06, 0x05, 0x34, 0xc4, 0x57, 0xd8, - 0xec, 0x96, 0x93, 0x6b, 0x09, 0x63, 0x1e, 0x6a, 0xd1, 0x5b, 0x28, 0x40, - 0xc6, 0x4a, 0xee, 0xfb, 0xa8, 0x99, 0x25, 0x2b, 0x90, 0x42, 0xb4, 0xbf, - 0x8d, 0x98, 0x93, 0x17, 0xe0, 0x9c, 0x44, 0x3b, 0x33, 0x20, 0x65, 0xa7, - 0x34, 0xbf, 0xce, 0x62, 0x23, 0x61, 0xe4, 0x5a, 0x99, 0x78, 0x01, 0xa8, - 0xb2, 0xb1, 0x53, 0x59, 0xc4, 0x8c, 0x1e, 0x0a, 0x95, 0x44, 0xa7, 0xfa, - 0xe9, 0x37, 0xa0, 0x02, 0xed, 0xab, 0x52, 0xb1, 0xb6, 0x04, 0x9f, 0xdc, - 0xf4, 0x40, 0x57, 0xfa, 0x79, 0xac, 0x9d, 0xb1, 0xfe, 0xfc, 0x51, 0x89, - 0x19, 0x44, 0x62, 0x2b, 0xe5, 0x23, 0xf1, 0x03, 0x5f, 0x72, 0xad, 0x87, - 0x30, 0xe4, 0x38, 0x97, 0xfa, 0x8a, 0x3d, 0xd3, 0xb0, 0xfc, 0x6c, 0xca, - 0xe8, 0x1a, 0xae, 0xf8, 0x80, 0xd8, 0x83, 0xb7, 0xe4, 0xf3, 0xa5, 0xb2, - 0x00, 0xb0, 0x99, 0xd4, 0x7a, 0xe8, 0x6d, 0x90, 0xd4, 0x85, 0x3b, 0x93, - 0xeb, 0x15, 0xf7, 0x9b, 0xb6, 0x4b, 0x28, 0xf4, 0xf5, 0xef, 0x92, 0x9e, - 0x42, 0xa5, 0x5a, 0x77, 0x28, 0x39, 0x4a, 0xb2, 0xec, 0x86, 0x6a, 0x55, - 0xe6, 0xc8, 0x5f, 0x1d, 0x9d, 0xe1, 0x2e, 0x7a, 0xc8, 0x2b, 0xac, 0xb7, - 0x52, 0xea, 0x87, 0x51, 0xf8, 0x27, 0x2d, 0x46, 0xb2, 0x9f, 0xdb, 0xa2, - 0x3e, 0x59, 0x1f, 0x78, 0x26, 0x9a, 0x6a, 0x2b, 0xfe, 0x9b, 0x49, 0x01, - 0xad, 0xc9, 0x02, 0x9b, 0x03, 0xec, 0xad, 0xbe, 0x42, 0x49, 0x84, 0x9c, - 0x09, 0xe7, 0xf2, 0xa6, 0x91, 0x71, 0x3b, 0x86, 0x52, 0x0b, 0x9d, 0x97, - 0x77, 0x33, 0x01, 0xe9, 0x81, 0x15, 0x8d, 0x13, 0x5c, 0x2a, 0x5a, 0x8c, - 0x1f, 0x0d, 0xcb, 0x5a, 0x0a, 0x89, 0xcd, 0xab, 0x84, 0x19, 0x77, 0x5a, - 0x6c, 0x9f, 0x0d, 0xd8, 0x80, 0x3f, 0xf1, 0xd4, 0x1c, 0x51, 0xbf, 0x96, - 0x3d, 0x06, 0x5a, 0x71, 0x63, 0x61, 0x8b, 0x12, 0x41, 0x26, 0x22, 0x4e, - 0xa2, 0xd0, 0x3a, 0xe3, 0x8b, 0x4a, 0x09, 0x31, 0x5b, 0x1d, 0x34, 0x15, - 0xe2, 0x8a, 0xdb, 0xd7, 0x4f, 0x84, 0xc5, 0xed, 0x1c, 0x45, 0x60, 0x51, - 0x0e, 0xaa, 0xe4, 0x90, 0x7d, 0xcb, 0xf3, 0x27, 0x2c, 0x55, 0xf9, 0x01, - 0x3f, 0x7f, 0x6f, 0x48, 0xee, 0x4e, 0x83, 0x1b, 0xdc, 0x8b, 0x91, 0xb0, - 0x83, 0x4b, 0x91, 0x3c, 0x4a, 0xe7, 0x2e, 0xbe, 0x1d, 0xf8, 0xa8, 0x9e, - 0xaf, 0x17, 0x3b, 0x6d, 0x95, 0x10, 0xde, 0x5d, 0xd7, 0x81, 0x47, 0xb8, - 0x2b, 0x53, 0xf1, 0xc7, 0xcf, 0x62, 0x38, 0x59, 0x0b, 0xa1, 0xb9, 0x46, - 0x53, 0xfa, 0xb0, 0x2a, 0x10, 0x9d, 0xe6, 0xd6, 0x4a, 0x8b, 0xa6, 0x8d, - 0xe8, 0xb3, 0x1c, 0xf6, 0xca, 0x9f, 0x11, 0xd9, 0xda, 0xe8, 0xb6, 0x03, - 0xd4, 0x5b, 0x6d, 0x9d, 0x37, 0x53, 0x82, 0x3b, 0xe5, 0x15, 0x11, 0xcd, - 0x42, 0xf2, 0xa7, 0xfc, 0x7e, 0x57, 0xf7, 0xa0, 0x08, 0x9e, 0x32, 0xc6, - 0xd9, 0x36, 0xe2, 0x4a, 0xc1, 0x07, 0x8e, 0xd1, 0xb5, 0x50, 0x7e, 0x01, - 0xa9, 0x2e, 0x11, 0x48, 0x8d, 0xa2, 0xfb, 0xb9, 0xf3, 0x74, 0x69, 0x11, - 0xc6, 0x4c, 0x34, 0x50, 0xe2, 0x75, 0x4f, 0xae, 0x1c, 0xc5, 0xb5, 0x05, - 0x13, 0xce, 0xd1, 0x74, 0x06, 0x2c, 0x2c, 0xbb, 0x96, 0x37, 0x6c, 0x0c, - 0xfd, 0xbd, 0xfc, 0x51, 0x41, 0x89, 0xe4, 0xe1, 0xa8, 0x11, 0x43, 0x2a, - 0xa0, 0x8b, 0x40, 0x06, 0xea, 0xbd, 0x00, 0x68, 0x67, 0xd2, 0xca, 0x19, - 0x48, 0xf3, 0xba, 0xfb, 0xe4, 0x75, 0xc6, 0x7a, 0x56, 0x4d, 0x10, 0xc8, - 0xa1, 0xac, 0xf0, 0xbd, 0xff, 0x9e, 0xbd, 0x82, 0x56, 0x26, 0x9f, 0x44, - 0xcd, 0xc9, 0x6d, 0xf5, 0x32, 0xc3, 0x14, 0x13, 0x72, 0x9d, 0xfb, 0x9c, - 0x87, 0xc0, 0x4b, 0xef, 0x1e, 0x97, 0x1d, 0x06, 0x35, 0xb2, 0xdb, 0x9d, - 0x0b, 0x6e, 0x52, 0x71, 0xe8, 0x90, 0xef, 0x88, 0xaa, 0xd1, 0x81, 0x57, - 0x5f, 0x80, 0x07, 0x11, 0xeb, 0x8e, 0x1d, 0x7e, 0xc9, 0xac, 0xe3, 0x66, - 0xaa, 0x50, 0x54, 0x47, 0xb8, 0x59, 0x57, 0x46, 0xcd, 0x51, 0x7a, 0x6b, - 0x22, 0x1c, 0x92, 0x1e, 0x8e, 0x97, 0x13, 0x62, 0x3d, 0xff, 0x66, 0x1d, - 0xca, 0x18, 0xe7, 0x29, 0xbe, 0xdb, 0x7c, 0x8b, 0xee, 0xcf, 0x13, 0xc3, - 0x90, 0x01, 0xe2, 0xe2, 0xa9, 0x23, 0xb1, 0xca, 0xc7, 0x26, 0x4f, 0x77, - 0x91, 0x0d, 0x9e, 0x55, 0x3a, 0x65, 0x21, 0xbb, 0xf0, 0x3f, 0x3f, 0x6e, - 0x65, 0xf9, 0x0c, 0x91, 0xb6, 0x03, 0x85, 0x18, 0x7d, 0x0c, 0xfd, 0x15, - 0x13, 0x30, 0xf8, 0x37, 0x6b, 0xfc, 0xf5, 0x37, 0x96, 0x46, 0x48, 0x7b, - 0x1d, 0x5c, 0x7c, 0x7c, 0xd8, 0x9b, 0x95, 0x32, 0xe4, 0xda, 0xe8, 0xa4, - 0x8f, 0x74, 0xfa, 0xf2, 0x6a, 0x47, 0x0b, 0xe1, 0x45, 0x5f, 0x07, 0x79, - 0x22, 0x43, 0xda, 0xc6, 0x20, 0x72, 0xea, 0x02, 0x8c, 0xbc, 0x45, 0x5c, - 0x16, 0x82, 0x66, 0xfe, 0x46, 0x3e, 0xcf, 0xa4, 0xc7, 0x4f, 0x48, 0xe3, - 0x03, 0x90, 0x9e, 0x26, 0x70, 0x86, 0x31, 0xce, 0x97, 0xf7, 0xa1, 0x8d, - 0x1f, 0x68, 0x85, 0x6e, 0x0f, 0x32, 0xf4, 0x66, 0xc8, 0x34, 0x14, 0x8a, - 0xdc, 0x3a, 0x0b, 0xfe, 0x7d, 0xa1, 0x92, 0x8e, 0x35, 0x98, 0x83, 0x48, - 0x19, 0xda, 0x66, 0x5a, 0xa3, 0x20, 0xf1, 0xcf, 0xf9, 0x2d, 0xaf, 0xca, - 0x13, 0x31, 0x1d, 0x8b, 0xb2, 0xa3, 0xab, 0x9c, 0x2d, 0x4b, 0xa1, 0xda, - 0xcc, 0x7d, 0xbf, 0xb0, 0xec, 0x2c, 0x6c, 0xe0, 0xad, 0xe5, 0x50, 0xec, - 0x01, 0xcc, 0x1e, 0x17, 0xad, 0x70, 0x7f, 0x03, 0x99, 0x0a, 0x5c, 0x4d, - 0x47, 0x33, 0x10, 0x2b, 0xbb, 0x2c, 0x85, 0x80, 0xa6, 0x3d, 0x59, 0x2e, - 0x81, 0x8d, 0x7c, 0x54, 0x71, 0x19, 0xc9, 0xaf, 0x28, 0xd2, 0x7c, 0xa7, - 0x2e, 0x8f, 0xa2, 0x8a, 0x9f, 0xca, 0xbc, 0xee, 0x54, 0xa7, 0xec, 0x34, - 0xdc, 0xfc, 0xfa, 0x5d, 0x16, 0xf6, 0x0a, 0x46, 0x44, 0xf8, 0xf4, 0x25, - 0xf1, 0xa0, 0xc8, 0x3f, 0xaf, 0x9d, 0xea, 0x72, 0x54, 0x63, 0x13, 0xfe, - 0x4f, 0x9a, 0x69, 0xd4, 0xe3, 0x77, 0xa1, 0x82, 0x3d, 0x02, 0x1a, 0xbd, - 0x6f, 0xba, 0x03, 0xee, 0x62, 0xe2, 0x10, 0x7a, 0xf3, 0x06, 0x6e, 0xd3, - 0x25, 0x3b, 0x5d, 0xa6, 0xa2, 0xa6, 0x88, 0xc4, 0x00, 0x30, 0xec, 0x2e, - 0xf5, 0x51, 0xf3, 0xfa, 0x7b, 0x08, 0x8a, 0x3a, 0x79, 0x5f, 0xca, 0x28, - 0x76, 0x75, 0x84, 0x47, 0xa7, 0x86, 0xcd, 0xde, 0xd3, 0xac, 0xd7, 0xc7, - 0xf4, 0x95, 0xaa, 0x2b, 0x1b, 0x50, 0x8c, 0x77, 0x93, 0xac, 0xb6, 0x53, - 0x23, 0xfd, 0xc1, 0x14, 0x78, 0x01, 0xc6, 0xaa, 0xc3, 0xd6, 0xe5, 0x37, - 0xff, 0x00, 0x39, 0xbf, 0x15, 0x27, 0x21, 0xab, 0xdc, 0x64, 0xa2, 0xd3, - 0xa5, 0x8a, 0xa7, 0x78, 0x2a, 0xed, 0xf4, 0x59, 0x20, 0x65, 0x4a, 0xdd, - 0x1c, 0x79, 0x26, 0x8f, 0xbb, 0x39, 0x21, 0x8d, 0x80, 0x73, 0x55, 0x06, - 0x88, 0xff, 0x4b, 0xe3, 0x20, 0x85, 0x0d, 0x51, 0x8c, 0x01, 0xf6, 0x40, - 0xba, 0xf9, 0x0d, 0x40, 0x47, 0x16, 0x59, 0x18, 0x55, 0x5a, 0x1b, 0x29, - 0x45, 0x82, 0xac, 0xa3, 0x9c, 0x2b, 0x1d, 0xb2, 0xf2, 0xf2, 0xed, 0x64, - 0xb0, 0x1e, 0x10, 0x83, 0xa6, 0xf4, 0xdd, 0x78, 0x4c, 0xb0, 0xa6, 0x59, - 0xb5, 0xbd, 0xc8, 0xd8, 0xa8, 0x85, 0xe3, 0x9c, 0xf1, 0x01, 0xe4, 0x73, - 0x4b, 0xda, 0xdd, 0xe4, 0x8a, 0x4c, 0x1a, 0x6c, 0x0e, 0xf3, 0xf6, 0x7e, - 0x8f, 0x66, 0x0c, 0x72, 0x7d, 0x8d, 0xa2, 0x61, 0xa2, 0xbc, 0x28, 0xe6, - 0xf6, 0x69, 0x1b, 0xe5, 0x14, 0xa1, 0x0e, 0x0c, 0x56, 0x33, 0x37, 0x40, - 0x7e, 0xc9, 0x96, 0x8b, 0x70, 0xd2, 0x70, 0xf1, 0xa6, 0xbf, 0x15, 0x62, - 0x08, 0x37, 0x25, 0x6b, 0xd9, 0x4b, 0xdc, 0x43, 0x14, 0xb2, 0x7f, 0x71, - 0x6f, 0x91, 0xf4, 0x4c, 0x09, 0x19, 0x6d, 0x92, 0xfb, 0xde, 0x2c, 0xc3, - 0x48, 0xb3, 0x16, 0xb9, 0x89, 0xad, 0xc5, 0xdc, 0x21, 0xc4, 0xfc, 0x64, - 0xd0, 0x0a, 0x0c, 0x28, 0x64, 0xfb, 0x60, 0x09, 0x43, 0x88, 0x20, 0x86, - 0x28, 0x4f, 0x48, 0x1e, 0xa1, 0x8a, 0x5b, 0xd9, 0x92, 0x1f, 0x94, 0xdd, - 0xe1, 0x1e, 0xaf, 0xb0, 0x69, 0xd8, 0x89, 0x68, 0x67, 0x75, 0x10, 0x56, - 0x31, 0xd8, 0x98, 0xcd, 0xc8, 0x5a, 0x03, 0x2d, 0xd1, 0xe4, 0xcc, 0x50, - 0x5c, 0x9b, 0x99, 0xcd, 0x48, 0x08, 0xe3, 0x9d, 0xe4, 0x40, 0xcf, 0x7e, - 0x2d, 0x56, 0x01, 0x0c, 0x7a, 0xfb, 0x2e, 0x16, 0xfa, 0x80, 0x8d, 0xd8, - 0x32, 0x3d, 0xdf, 0xf6, 0xfa, 0x72, 0x9d, 0x16, 0x43, 0xd2, 0x90, 0x73, - 0x43, 0x63, 0x82, 0x99, 0xd6, 0x6d, 0x14, 0x8e, 0xed, 0x90, 0x49, 0xb1, - 0x5b, 0x19, 0x88, 0x2c, 0xf6, 0xa5, 0x74, 0xf7, 0xf5, 0x4d, 0x65, 0xb8, - 0xea, 0x5a, 0xa9, 0x37, 0x50, 0x70, 0xd1, 0xad, 0xe6, 0x9f, 0xd6, 0x3a, - 0xfd, 0xba, 0xf7, 0x40, 0xf4, 0x99, 0x4a, 0xe5, 0x30, 0x62, 0xde, 0x85, - 0xa0, 0x8e, 0xb2, 0x3f, 0x49, 0x20, 0x8d, 0x52, 0x2f, 0x86, 0x03, 0x28, - 0x71, 0xff, 0x0c, 0xa1, 0x83, 0x2b, 0xef, 0x7f, 0x79, 0x02, 0xc3, 0xea, - 0x37, 0x13, 0x22, 0xd6, 0x06, 0xfc, 0x45, 0x98, 0x9d, 0x78, 0xa2, 0x27, - 0xf1, 0xac, 0xf2, 0xfb, 0x61, 0xf3, 0x8c, 0x3a, 0xca, 0xee, 0xec, 0xf9, - 0x94, 0x3a, 0x48, 0x29, 0xfc, 0xbb, 0xaa, 0xb8, 0x8c, 0xad, 0xc9, 0x7b, - 0x6e, 0x32, 0x01, 0x77, 0x7f, 0xe5, 0x74, 0x62, 0x63, 0x69, 0x70, 0x42, - 0x44, 0xde, 0x0f, 0x26, 0xab, 0x73, 0xf4, 0xca, 0x64, 0xcf, 0x4e, 0x92, - 0x26, 0x6b, 0xae, 0x24, 0xc1, 0xfd, 0xcc, 0x32, 0xf5, 0x94, 0x01, 0xbe, - 0xd6, 0xfb, 0xc8, 0xc5, 0x12, 0x31, 0xb6, 0x38, 0xf7, 0x5f, 0x3b, 0x59, - 0xe9, 0xf2, 0xd7, 0xd3, 0xe0, 0xa8, 0xf2, 0x5e, 0x4f, 0x15, 0xfe, 0xf7, - 0x82, 0x82, 0x6d, 0x1c, 0x2c, 0x37, 0x11, 0x3d, 0x3e, 0x9c, 0xd5, 0xf9, - 0x9e, 0xaa, 0x90, 0x11, 0xa7, 0x45, 0xde, 0x1f, 0x9f, 0xd7, 0xe9, 0x1d, - 0x44, 0xaf, 0xa1, 0x48, 0xed, 0x84, 0x51, 0xf5, 0x74, 0xbd, 0x4c, 0x32, - 0xe4, 0xf2, 0x5e, 0x32, 0x88, 0xe6, 0x80, 0x7d, 0xb5, 0xe2, 0x1e, 0x60, - 0x56, 0x87, 0x65, 0x00, 0x76, 0x8b, 0x2c, 0x81, 0x56, 0x46, 0x0b, 0xc4, - 0xae, 0xbc, 0x8f, 0xbb, 0x52, 0x38, 0x26, 0x01, 0xa5, 0x4c, 0x1d, 0x46, - 0x1e, 0x2f, 0x9c, 0x0e, 0xe4, 0x46, 0x17, 0x5a, 0xcd, 0x4e, 0x08, 0xa9, - 0x29, 0xba, 0x79, 0x68, 0x84, 0x8b, 0x4e, 0xcf, 0xb4, 0xd4, 0xdc, 0xfd, - 0x6e, 0x79, 0x99, 0xe0, 0x4d, 0xfd, 0xa0, 0x0e, 0x52, 0x5c, 0x45, 0x68, - 0x71, 0xc4, 0x52, 0xe8, 0xff, 0x84, 0xd4, 0x18, 0x97, 0x87, 0x46, 0xdb, - 0x8c, 0xad, 0xed, 0xb6, 0x7b, 0xfe, 0x2a, 0x6c, 0x8c, 0xd0, 0x7d, 0xce, - 0x42, 0x4b, 0x47, 0x3e, 0x3d, 0x38, 0x52, 0x0e, 0x5c, 0x28, 0xf6, 0x01, - 0xa8, 0xe1, 0x57, 0x02, 0xc9, 0xbf, 0x53, 0xce, 0x74, 0x59, 0x0e, 0xb4, - 0xc8, 0x89, 0xda, 0x17, 0x5d, 0x8a, 0xf1, 0x07, 0xf2, 0x25, 0x6e, 0x71, - 0x33, 0x16, 0x8d, 0xa9, 0x95, 0xc5, 0x23, 0x19, 0x98, 0x4d, 0x39, 0xe7, - 0xe7, 0x02, 0x77, 0xa6, 0x9f, 0x13, 0x56, 0xb3, 0xe3, 0xef, 0x91, 0xdc, - 0x62, 0xab, 0xd9, 0x1e, 0xae, 0x59, 0xfa, 0x18, 0xdf, 0x3c, 0xb7, 0xd5, - 0x14, 0xba, 0x7e, 0x43, 0x02, 0x48, 0x1b, 0x23, 0x68, 0x71, 0x33, 0x4f, - 0xdd, 0xb7, 0x27, 0xfa, 0xd7, 0xb2, 0xd1, 0x23, 0x41, 0xcf, 0xd2, 0x41, - 0x9a, 0x76, 0x99, 0xce, 0x24, 0x07, 0x3d, 0xa5, 0x24, 0x66, 0xea, 0xb1, - 0xd7, 0x81, 0x18, 0x7c, 0x49, 0xa6, 0x1c, 0x19, 0xff, 0x64, 0x62, 0x10, - 0x19, 0x9d, 0xdc, 0x3a, 0x98, 0x92, 0x83, 0xc9, 0x8c, 0x18, 0xd9, 0xfd, - 0x3a, 0x1c, 0x19, 0xbd, 0x9d, 0x35, 0x9c, 0x92, 0x27, 0x87, 0xf3, 0x34, - 0xb3, 0x66, 0xc1, 0xa4, 0xa9, 0x1e, 0xec, 0x39, 0x8d, 0xed, 0xdb, 0xcf, - 0xa8, 0xc3, 0x5e, 0xd8, 0xea, 0xdc, 0xd7, 0x2b, 0xcd, 0xe4, 0x3c, 0xc1, - 0x56, 0xda, 0x14, 0x6f, 0x85, 0xec, 0x8e, 0x5a, 0x83, 0x2f, 0x42, 0x4b, - 0xdb, 0xc5, 0xd5, 0x6b, 0xed, 0x6d, 0xc7, 0x93, 0x39, 0xef, 0xdd, 0xcf, - 0xa7, 0xd9, 0xd0, 0x7f, 0x5b, 0x9f, 0xcd, 0xbf, 0xfe, 0x5f, 0x35, 0x9b, - 0x8d, 0x19, 0x64, 0xc3, 0xe5, 0x78, 0x0c, 0x34, 0x24, 0xa2, 0x3a, 0x76, - 0x0c, 0x5f, 0xe4, 0x12, 0xcc, 0xfa, 0xad, 0x4d, 0xed, 0x7c, 0x3e, 0x50, - 0x41, 0xa3, 0x0e, 0x5a, 0x37, 0xb4, 0xdb, 0x0f, 0x4f, 0x05, 0x78, 0x7e, - 0x76, 0x02, 0xdd, 0xaa, 0x79, 0x18, 0x83, 0x18, 0xc3, 0x1a, 0xa0, 0x60, - 0xbe, 0x5d, 0xa6, 0xa6, 0x40, 0x0c, 0xec, 0x86, 0x7a, 0xde, 0x62, 0x11, - 0xdd, 0x18, 0xdf, 0x39, 0x45, 0x64, 0xaf, 0xb4, 0x37, 0xc1, 0x8f, 0x0e, - 0xb8, 0xb6, 0x6e, 0x87, 0x67, 0xfd, 0x4e, 0xc8, 0xe2, 0xd4, 0xa5, 0x3f, - 0xac, 0x90, 0x56, 0x87, 0x75, 0x01, 0x4a, 0x21, 0x0a, 0x88, 0xfd, 0x2d, - 0x50, 0x18, 0x19, 0x19, 0xc2, 0xa7, 0x6c, 0x14, 0x86, 0x4b, 0x70, 0x17, - 0x1d, 0x9e, 0xb2, 0x54, 0x84, 0x2a, 0xc2, 0x3e, 0x2e, 0xf3, 0xe1, 0xaf, - 0xa4, 0x8f, 0xe0, 0x6a, 0x76, 0x5a, 0xbe, 0x89, 0x0e, 0x2a, 0xbc, 0x5f, - 0xa2, 0xf7, 0x4c, 0x97, 0x36, 0xc6, 0x8f, 0xdd, 0x1b, 0x90, 0xf6, 0x67, - 0xa7, 0x07, 0xb7, 0xe9, 0x64, 0x3b, 0xc0, 0xcd, 0x2d, 0xc9, 0xb5, 0xd0, - 0xca, 0x90, 0x50, 0xcc, 0x49, 0x45, 0xd8, 0x4b, 0x14, 0x03, 0x3b, 0xa1, - 0xd0, 0xcd, 0x37, 0x22, 0x96, 0x9a, 0xdb, 0xf0, 0x6d, 0x99, 0x86, 0x0b, - 0x79, 0x0d, 0x44, 0xc5, 0xcd, 0x78, 0xbb, 0x75, 0xf1, 0xb7, 0x3f, 0xcf, - 0x5a, 0x4c, 0x62, 0xf1, 0xde, 0xa2, 0xb7, 0x45, 0x93, 0xf4, 0x22, 0xb4, - 0x33, 0x43, 0x0b, 0x25, 0x3e, 0x08, 0x5d, 0xc6, 0x5d, 0x09, 0xbb, 0x0f, - 0x6d, 0xa4, 0x19, 0x80, 0x7d, 0x8c, 0x4b, 0x26, 0x63, 0xbe, 0xb7, 0xb0, - 0xe7, 0xe4, 0x32, 0xfb, 0x0c, 0xc1, 0x9e, 0x12, 0xe7, 0x5b, 0xb9, 0x32, - 0xaf, 0x02, 0x54, 0x42, 0x9c, 0xb1, 0x8e, 0x1a, 0xd1, 0x77, 0x91, 0xe1, - 0x9f, 0x74, 0xe8, 0xa8, 0x75, 0xa4, 0xc5, 0x91, 0xe0, 0xe7, 0xf5, 0x60, - 0xc5, 0x33, 0x87, 0x2b, 0xb3, 0x2b, 0xf4, 0x58, 0xd4, 0xb3, 0x77, 0x94, - 0xa4, 0x1a, 0xe9, 0xb9, 0xc0, 0x34, 0xb0, 0xce, 0x65, 0x03, 0x1b, 0xf2, - 0xc9, 0xc6, 0x9f, 0x81, 0x07, 0xa2, 0xa2, 0x31, 0x8b, 0x7b, 0xfe, 0x2d, - 0x56, 0x4a, 0x8d, 0xef, 0xcb, 0x3f, 0xb2, 0xd9, 0x54, 0xd3, 0x7a, 0xec, - 0x31, 0x85, 0x51, 0x6f, 0x29, 0xd0, 0xc4, 0x29, 0x18, 0x51, 0x63, 0xb4, - 0x48, 0x45, 0xf9, 0xfc, 0x1e, 0x06, 0x30, 0x4b, 0x94, 0x1b, 0x30, 0x8f, - 0x62, 0xf6, 0x4c, 0x9e, 0xff, 0x1b, 0xc2, 0x24, 0x94, 0x3f, 0x89, 0x48, - 0xd5, 0x14, 0xe2, 0x54, 0x31, 0xa4, 0x60, 0x03, 0xed, 0x36, 0xcf, 0x0d, - 0x2e, 0x86, 0xc8, 0x5f, 0x08, 0x5d, 0x08, 0xe6, 0x8b, 0x3e, 0x83, 0xb0, - 0x3f, 0x1b, 0xe3, 0xd7, 0x0f, 0x51, 0x16, 0xc6, 0x75, 0x24, 0x22, 0x79, - 0xc1, 0x46, 0xd2, 0xdd, 0x79, 0x87, 0xfb, 0x64, 0xb3, 0xac, 0x0d, 0xef, - 0xd3, 0x1c, 0xc0, 0xe6, 0xf0, 0x6c, 0xf5, 0x50, 0xf0, 0xdb, 0x92, 0x38, - 0x0d, 0x49, 0xdf, 0x69, 0x33, 0x7b, 0x2c, 0x7d, 0x9c, 0x54, 0x8b, 0x4f, - 0x17, 0x38, 0xff, 0xf2, 0x8b, 0xfa, 0x7d, 0x89, 0x0f, 0xf7, 0x83, 0xbf, - 0x33, 0xce, 0xc4, 0xdd, 0x09, 0x2c, 0x78, 0xf9, 0x9c, 0x3b, 0x45, 0xbc, - 0x08, 0x97, 0xb4, 0x86, 0x06, 0x53, 0x68, 0x83, 0x65, 0x5a, 0x90, 0x6b, - 0xa0, 0x4e, 0xea, 0x11, 0xcb, 0xd4, 0x9c, 0xb2, 0xb5, 0x42, 0xab, 0xa6, - 0xb1, 0xba, 0x89, 0x76, 0x79, 0xc3, 0x7c, 0x12, 0x73, 0x46, 0x0e, 0xbe, - 0x1a, 0x3b, 0xab, 0x81, 0x25, 0xf0, 0x53, 0x19, 0x46, 0x1e, 0xf5, 0x17, - 0x4b, 0x73, 0x91, 0x53, 0x24, 0xa4, 0x85, 0x3a, 0x83, 0x6a, 0x77, 0x6d, - 0xfd, 0x55, 0x3f, 0x99, 0xfc, 0x18, 0x8e, 0x7d, 0x42, 0xfd, 0x34, 0xa2, - 0xbf, 0x1f, 0xf7, 0xf4, 0x73, 0xe9, 0xe3, 0x1e, 0x76, 0xab, 0xc7, 0x4c, - 0xae, 0x6b, 0x34, 0x5b, 0xda, 0x93, 0x43, 0x10, 0xb6, 0xa8, 0x5a, 0xa9, - 0xf0, 0xb4, 0xac, 0xde, 0x5d, 0xac, 0x61, 0xa9, 0x6f, 0x98, 0xe1, 0xbd, - 0x72, 0x0b, 0x51, 0xac, 0xa0, 0x57, 0xcd, 0x51, 0x4b, 0x18, 0xe5, 0x55, - 0x4b, 0x9f, 0xc0, 0x38, 0x7e, 0x32, 0xed, 0xf4, 0x90, 0x8f, 0x25, 0xbe, - 0x07, 0x5e, 0x3c, 0x8b, 0x42, 0xf8, 0x1a, 0xe0, 0x4c, 0x86, 0xca, 0xd5, - 0x91, 0x09, 0x39, 0x00, 0x5b, 0xbc, 0x2f, 0x35, 0xc6, 0x80, 0xb5, 0xec, - 0xa9, 0xc5, 0x25, 0xb8, 0xac, 0x66, 0x2e, 0xf4, 0x80, 0xac, 0x2e, 0x1b, - 0x9a, 0x7e, 0x47, 0x32, 0x67, 0xe8, 0x1a, 0x3c, 0x5e, 0x2d, 0xae, 0x4d, - 0x33, 0x3c, 0x35, 0x5c, 0x7f, 0x96, 0xeb, 0x81, 0xbc, 0x4d, 0x7e, 0x21, - 0x72, 0xbb, 0xea, 0x4b, 0x70, 0x8b, 0x4f, 0x01, 0x36, 0x00, 0x28, 0x06, - 0xaa, 0x01, 0xcf, 0x84, 0xb2, 0xf8, 0x1c, 0xb6, 0x13, 0x0f, 0x26, 0xc0, - 0x40, 0x9d, 0xa1, 0x01, 0x4d, 0x59, 0x3b, 0x2f, 0xa9, 0x3d, 0x19, 0xc7, - 0x0f, 0x8c, 0x1a, 0x47, 0x29, 0x75, 0xee, 0xee, 0x22, 0x94, 0x83, 0x60, - 0x9a, 0xad, 0x4d, 0x70, 0x3c, 0x14, 0x8c, 0x12, 0x1e, 0x40, 0x01, 0x4e, - 0xf8, 0xab, 0x5e, 0xa4, 0xef, 0x9a, 0xc1, 0xe0, 0x35, 0xe2, 0x21, 0xa9, - 0x3b, 0xc5, 0x05, 0x5c, 0x21, 0xb2, 0x55, 0xe8, 0x20, 0x1b, 0xe9, 0x54, - 0x14, 0x1a, 0x39, 0x49, 0xe7, 0xcb, 0x6c, 0x79, 0x5e, 0xe2, 0xfd, 0x76, - 0x87, 0xc7, 0x84, 0x0f, 0xfc, 0xfd, 0x17, 0xbf, 0x12, 0x8d, 0x24, 0xa8, - 0x87, 0xbe, 0x6e, 0xbe, 0x21, 0xb0, 0xe0, 0xd4, 0xf2, 0xf1, 0x25, 0x25, - 0x36, 0x15, 0xf5, 0x7e, 0x9b, 0x5f, 0xa2, 0xb8, 0x0c, 0x64, 0x0c, 0xe5, - 0xd3, 0x58, 0x91, 0x71, 0xa8, 0x2f, 0xd9, 0x77, 0x30, 0x19, 0x34, 0xc1, - 0xac, 0x97, 0x39, 0x5b, 0x5c, 0xc9, 0x37, 0x9a, 0x45, 0xcc, 0x7a, 0xad, - 0x22, 0xe1, 0x09, 0x80, 0x79, 0x12, 0xb0, 0xd9, 0x28, 0xaf, 0x3e, 0x05, - 0xea, 0xc3, 0xdd, 0x6a, 0x4f, 0xc6, 0x41, 0xcf, 0x5b, 0x25, 0x49, 0xfe, - 0xfa, 0xd1, 0x3b, 0xcb, 0x50, 0xdf, 0x13, 0xce, 0xea, 0x2a, 0x01, 0x4f, - 0xe5, 0x35, 0xab, 0x96, 0x26, 0xde, 0x99, 0x02, 0x78, 0xc5, 0xf5, 0x67, - 0x81, 0x45, 0x7b, 0xb9, 0x67, 0x81, 0x07, 0x02, 0xca, 0x67, 0x56, 0x32, - 0x60, 0xf5, 0x4d, 0x3b, 0x47, 0x2c, 0xb2, 0xb3, 0xdc, 0x6a, 0xca, 0xc4, - 0xfa, 0xff, 0x0f, 0x32, 0xcf, 0x17, 0x45, 0xd0, 0xfc, 0xad, 0x3c, 0xcb, - 0xad, 0x16, 0x66, 0xec, 0x5a, 0xab, 0x0e, 0xd6, 0x2a, 0x35, 0x52, 0x8f, - 0x28, 0xfe, 0x6e, 0xd7, 0xe7, 0x63, 0x2a, 0xdb, 0x18, 0xf3, 0xcf, 0x99, - 0x83, 0x61, 0xaa, 0x1a, 0x17, 0xf2, 0xbb, 0x1a, 0x32, 0xac, 0x80, 0xbb, - 0x2a, 0x2d, 0xa1, 0x7c, 0x0e, 0xb4, 0x43, 0x10, 0x86, 0x4f, 0x61, 0xd4, - 0x00, 0x44, 0x41, 0xf7, 0x27, 0xec, 0x38, 0x4d, 0x81, 0x4b, 0x43, 0x11, - 0x8d, 0x99, 0x8e, 0x59, 0x6e, 0xca, 0x75, 0xcb, 0x33, 0x68, 0x52, 0x31, - 0x6b, 0x80, 0xc0, 0x35, 0x18, 0xe0, 0x1a, 0x15, 0xc3, 0xc2, 0xa4, 0x38, - 0xc5, 0x1f, 0xeb, 0x61, 0x54, 0x6a, 0x8c, 0x26, 0x56, 0x45, 0x2f, 0xb9, - 0x44, 0x89, 0x75, 0xcf, 0x9b, 0xed, 0xc1, 0xe8, 0x5f, 0x19, 0xd2, 0xb6, - 0x97, 0x93, 0x2f, 0x8d, 0x94, 0x47, 0xb2, 0x8f, 0x56, 0x7b, 0xd3, 0xec, - 0x87, 0x6f, 0xdc, 0xb0, 0x4a, 0x7e, 0xaa, 0xcc, 0xac, 0x22, 0xd7, 0x37, - 0x29, 0xd7, 0x96, 0xb0, 0x78, 0xcc, 0xa1, 0x82, 0x44, 0xb6, 0xe4, 0x9e, - 0x8d, 0x09, 0xad, 0x4b, 0xea, 0x14, 0x36, 0x5c, 0x3e, 0x13, 0xee, 0x9b, - 0xcd, 0x85, 0x2f, 0x4d, 0x56, 0x08, 0x62, 0x61, 0x98, 0xde, 0x01, 0x79, - 0xe3, 0xc7, 0x76, 0x11, 0x6c, 0xf0, 0x2d, 0x28, 0x02, 0x35, 0x46, 0xf3, - 0x54, 0x50, 0x4f, 0xe5, 0x20, 0x3b, 0xef, 0x42, 0x97, 0x63, 0x94, 0xfe, - 0xf2, 0x9a, 0x26, 0xaa, 0x81, 0x39, 0x59, 0xf0, 0xc8, 0xf2, 0x2b, 0x94, - 0x4e, 0x70, 0x7d, 0xec, 0x6a, 0x25, 0x2a, 0x27, 0x1f, 0xaa, 0xc9, 0x54, - 0x76, 0x6a, 0x42, 0xe8, 0x2e, 0x3f, 0x21, 0x39, 0x89, 0xba, 0x36, 0xb4, - 0x67, 0x75, 0x04, 0xfc, 0x36, 0xbb, 0x98, 0xe4, 0x5d, 0x63, 0xe2, 0x29, - 0x5f, 0xcb, 0xbb, 0x75, 0xb1, 0x47, 0x7b, 0x0b, 0x93, 0x1b, 0x20, 0xea, - 0xf0, 0x72, 0x1b, 0xdd, 0xfa, 0xd4, 0x2a, 0x69, 0x4b, 0xf9, 0xe9, 0x30, - 0x8c, 0xea, 0xd8, 0x22, 0x1d, 0xcb, 0x9d, 0x9b, 0xb5, 0x65, 0x60, 0xa7, - 0x3e, 0x46, 0xba, 0xa7, 0x5a, 0x15, 0xae, 0x37, 0x60, 0xd7, 0x2f, 0x98, - 0x78, 0xbc, 0x3a, 0x74, 0x62, 0x83, 0x60, 0x8b, 0xdf, 0xa1, 0xb0, 0xc9, - 0x52, 0xfb, 0x84, 0x50, 0xbd, 0xaa, 0x8d, 0x20, 0xc3, 0x45, 0xee, 0x61, - 0x49, 0xb7, 0xca, 0x8b, 0xda, 0x5c, 0xf2, 0xac, 0xe6, 0x7e, 0xce, 0x4c, - 0x7b, 0xbc, 0x7e, 0x2b, 0x20, 0xf8, 0xe8, 0x43, 0xe6, 0x48, 0x43, 0x3b, - 0x64, 0xb1, 0x54, 0x1a, 0x47, 0xe1, 0xdf, 0xe6, 0x57, 0x5b, 0xa1, 0x7e, - 0x72, 0x7b, 0x69, 0x79, 0xbe, 0xce, 0x02, 0x90, 0x17, 0xe0, 0xc8, 0xe0, - 0xe8, 0xd4, 0xd2, 0x54, 0xbb, 0x7b, 0xc3, 0x54, 0xbd, 0x05, 0x55, 0x79, - 0xc9, 0xb6, 0xe3, 0x0c, 0xb8, 0x6e, 0x09, 0xa7, 0xa2, 0xe9, 0x2a, 0xc1, - 0x32, 0x1c, 0xb7, 0x78, 0x34, 0xff, 0x31, 0x93, 0x6a, 0xf8, 0x2e, 0xdc, - 0x59, 0xc9, 0x6c, 0xb3, 0x18, 0x3a, 0xbc, 0x1e, 0x11, 0x09, 0x80, 0x61, - 0xa6, 0x53, 0xbc, 0xec, 0x7a, 0x94, 0xda, 0xf1, 0xe1, 0x37, 0x05, 0xaf, - 0x1e, 0x3b, 0x4b, 0x1d, 0x95, 0x26, 0xe0, 0xe9, 0x70, 0x2a, 0x69, 0x47, - 0xac, 0xd0, 0xfb, 0x1a, 0x67, 0xe7, 0x5e, 0xdf, 0x3d, 0x96, 0x45, 0xa7, - 0x57, 0x05, 0xb6, 0x05, 0x27, 0x57, 0x51, 0x2d, 0x1c, 0x43, 0x8f, 0x82, - 0xde, 0x4e, 0x31, 0xa3, 0x9b, 0x3d, 0x63, 0xca, 0x68, 0x3b, 0x02, 0xbd, - 0xb2, 0x25, 0x0a, 0x20, 0x47, 0x24, 0x88, 0x23, 0x4f, 0x23, 0xb4, 0x68, - 0xd5, 0xe1, 0xb4, 0x9d, 0x27, 0x71, 0x5d, 0xe3, 0x52, 0x1d, 0x9f, 0xc4, - 0x4a, 0x19, 0x12, 0xa6, 0x22, 0xfb, 0xc1, 0x78, 0x99, 0xeb, 0xb7, 0x69, - 0x6f, 0x74, 0x6a, 0x65, 0x80, 0x31, 0x81, 0x93, 0xcb, 0xdf, 0x58, 0xd2, - 0x3f, 0x3a, 0x61, 0xc4, 0x73, 0x55, 0xd8, 0xf4, 0x4b, 0x21, 0x7c, 0xb8, - 0x41, 0x8e, 0xe5, 0xce, 0xc2, 0x7f, 0x8f, 0x2e, 0xb8, 0xf3, 0xe0, 0x3c, - 0x0f, 0x18, 0x31, 0x7c, 0x14, 0xed, 0x14, 0xc7, 0xbf, 0x49, 0x2b, 0xed, - 0x19, 0xb5, 0x5a, 0x2f, 0x02, 0x21, 0x27, 0x2c, 0xbc, 0x76, 0x18, 0xb2, - 0x0b, 0x22, 0x32, 0xbf, 0x08, 0x5a, 0xdb, 0x08, 0x58, 0x3a, 0x5c, 0xdf, - 0x72, 0xe7, 0xab, 0x63, 0x71, 0x05, 0xa9, 0x65, 0xb8, 0x7d, 0x53, 0xd1, - 0x3b, 0x7a, 0x10, 0x65, 0xa3, 0x49, 0xbd, 0xb5, 0xfb, 0x6a, 0xea, 0xef, - 0x4f, 0x33, 0x1c, 0x0e, 0xa0, 0x73, 0x70, 0x60, 0x97, 0xbc, 0x27, 0xb1, - 0x21, 0x91, 0xea, 0x79, 0xda, 0xd0, 0xfc, 0x5d, 0x43, 0xbc, 0xf3, 0xc4, - 0x90, 0x3f, 0xca, 0x5c, 0xac, 0xf9, 0xf6, 0x3b, 0xe4, 0x5f, 0x00, 0x44, - 0xdf, 0xe4, 0xb4, 0x0b, 0xf4, 0x30, 0x01, 0x71, 0x46, 0x03, 0x94, 0x7e, - 0xc5, 0xd5, 0x1f, 0x07, 0xe8, 0xc9, 0xfb, 0x8c, 0x55, 0x2f, 0x1a, 0x2d, - 0x8b, 0x81, 0xb8, 0x6a, 0xa7, 0x02, 0x23, 0xe5, 0xa7, 0xfa, 0x46, 0x38, - 0x86, 0x0b, 0x0b, 0x50, 0xd1, 0x22, 0x56, 0x09, 0xd2, 0xa2, 0x97, 0xc1, - 0xbe, 0x2c, 0x5b, 0x1f, 0x48, 0x59, 0x5c, 0xcd, 0x1a, 0x4f, 0x13, 0x4c, - 0x23, 0x52, 0x35, 0xa9, 0x57, 0x37, 0xbd, 0x61, 0x43, 0x7b, 0x47, 0x18, - 0x95, 0x86, 0xa4, 0xfb, 0xa8, 0x5b, 0xc6, 0xa2, 0x3c, 0x1f, 0x98, 0x88, - 0xed, 0x58, 0xaa, 0x8a, 0xd3, 0x56, 0x32, 0xd6, 0xe6, 0xe4, 0xd8, 0x20, - 0xe4, 0xb3, 0xbb, 0x05, 0x22, 0x94, 0x5a, 0xd8, 0x7d, 0xda, 0xc1, 0x06, - 0x14, 0xf3, 0x92, 0x94, 0xf6, 0x9b, 0x93, 0x99, 0xd6, 0xb9, 0xdf, 0x4c, - 0x70, 0x15, 0x9e, 0x5d, 0x95, 0xed, 0x01, 0x40, 0x0f, 0xbb, 0x87, 0xb9, - 0xe7, 0x16, 0x85, 0xa9, 0x62, 0xa0, 0x4e, 0x7d, 0x8e, 0xdd, 0x8c, 0xc1, - 0xd2, 0xb1, 0xc6, 0x34, 0x01, 0x8d, 0x7b, 0x4c, 0x81, 0xe9, 0x75, 0xda, - 0x4c, 0xf9, 0x3f, 0xcf, 0xe4, 0xcc, 0x98, 0x08, 0x3c, 0xdf, 0xee, 0xb7, - 0x7e, 0x0a, 0x8e, 0x5e, 0x6d, 0xd3, 0x39, 0x03, 0x68, 0x80, 0x6d, 0x9f, - 0x4d, 0xa6, 0xcd, 0x56, 0xf5, 0xb5, 0xdb, 0xee, 0xd6, 0xa0, 0xc6, 0x3d, - 0x3c, 0x4b, 0xce, 0x39, 0x53, 0x15, 0xe8, 0xa7, 0xe1, 0xf1, 0xcb, 0xd8, - 0xfb, 0x80, 0xbd, 0x62, 0xaa, 0x32, 0x9a, 0x69, 0xa8, 0x71, 0x17, 0x90, - 0x02, 0x29, 0x1a, 0x17, 0x8f, 0xb7, 0x94, 0xc9, 0x72, 0x66, 0x1a, 0x00, - 0xb7, 0xd4, 0x6f, 0x8e, 0x77, 0x2f, 0xc1, 0x90, 0xd1, 0x78, 0x01, 0x17, - 0x9a, 0xeb, 0x29, 0x62, 0x44, 0x8b, 0x1f, 0xb6, 0x99, 0x67, 0x46, 0x68, - 0x56, 0x41, 0x6d, 0xef, 0xe5, 0x90, 0x0f, 0x71, 0x29, 0x52, 0x4e, 0xb7, - 0x80, 0x79, 0x59, 0xb0, 0x18, 0xe9, 0xa9, 0x45, 0xbf, 0xea, 0xb4, 0x68, - 0x20, 0xc5, 0x0c, 0xbe, 0x92, 0xe1, 0xda, 0x89, 0xf2, 0x0b, 0xe5, 0x22, - 0x4f, 0x54, 0x15, 0xe5, 0x30, 0xa1, 0xe4, 0x13, 0xd2, 0x13, 0x87, 0x4d, - 0x8e, 0x41, 0x72, 0x1c, 0xfb, 0x55, 0x42, 0x30, 0xcf, 0x34, 0xb9, 0xfd, - 0x1f, 0x93, 0x5e, 0x6b, 0x24, 0x81, 0x90, 0x0d, 0xf8, 0x63, 0x77, 0xf8, - 0xcc, 0x5d, 0x74, 0x46, 0xf3, 0x63, 0x67, 0xf6, 0xb4, 0x39, 0x97, 0xfb, - 0x29, 0x10, 0x86, 0x52, 0x20, 0x36, 0x5b, 0xd6, 0xfb, 0x9c, 0xe0, 0x96, - 0x34, 0x5e, 0x8c, 0x2f, 0xda, 0x0a, 0xb1, 0xff, 0x3c, 0x58, 0xd0, 0xd3, - 0x38, 0xb0, 0x55, 0x8c, 0x32, 0x5d, 0x05, 0xb1, 0x13, 0x34, 0x52, 0x98, - 0xec, 0x11, 0xb3, 0x45, 0x22, 0x00, 0x9d, 0x47, 0xba, 0xbf, 0xf3, 0xb2, - 0x0a, 0x83, 0x7d, 0x69, 0x94, 0xc2, 0x9e, 0xc4, 0x42, 0x64, 0x2b, 0x30, - 0x03, 0xb6, 0x07, 0x04, 0xeb, 0x2b, 0x77, 0x14, 0xf4, 0x4c, 0x51, 0x93, - 0xbe, 0x4b, 0xe9, 0xac, 0x4c, 0x82, 0x85, 0x25, 0x83, 0x58, 0xb7, 0x51, - 0xf3, 0x87, 0x6f, 0xf9, 0x1c, 0x7a, 0x8b, 0x71, 0xd6, 0x48, 0x9f, 0xf0, - 0x63, 0xf8, 0x62, 0xb0, 0x9f, 0xf3, 0x14, 0x91, 0xcf, 0x02, 0xb9, 0xbf, - 0x5b, 0x48, 0x1c, 0x4a, 0x8f, 0x11, 0xdc, 0x27, 0xcf, 0xbe, 0x4e, 0xb2, - 0x02, 0xda, 0x09, 0xa2, 0xdd, 0x92, 0x93, 0xd1, 0xb5, 0x47, 0xbf, 0x28, - 0x73, 0x85, 0x4f, 0x5b, 0x34, 0x6f, 0x86, 0xce, 0x8d, 0xc7, 0xd1, 0x03, - 0x00, 0xfe, 0x45, 0x52, 0x3e, 0x55, 0xe8, 0x6b, 0x52, 0xef, 0x64, 0xfc, - 0xa8, 0x7b, 0x7b, 0xbc, 0x02, 0x03, 0x2e, 0x04, 0x5d, 0x2d, 0x66, 0xa2, - 0x6f, 0x68, 0x11, 0x8d, 0x72, 0xcc, 0x8f, 0x51, 0xd5, 0xfa, 0xf3, 0x75, - 0x39, 0xc1, 0xb3, 0x58, 0x8f, 0x5e, 0xec, 0x4e, 0x34, 0xaa, 0x5e, 0xfb, - 0x21, 0xa1, 0x72, 0xf7, 0xf4, 0x29, 0x4f, 0xf9, 0x6d, 0x02, 0x76, 0xd6, - 0x7c, 0x03, 0x3c, 0x21, 0x80, 0xbc, 0x16, 0x6d, 0x59, 0x91, 0x4d, 0xe0, - 0x3b, 0x2b, 0xb1, 0xb4, 0x2d, 0xb3, 0x89, 0x96, 0xf0, 0x4a, 0xe3, 0x13, - 0x49, 0x31, 0x93, 0x2b, 0xba, 0x26, 0xa2, 0x1f, 0xab, 0xb9, 0xf7, 0x14, - 0x5c, 0xf6, 0xb5, 0x30, 0x84, 0x3e, 0x3a, 0x41, 0xe8, 0x66, 0x2f, 0x9a, - 0x6b, 0xdc, 0x67, 0xdc, 0x26, 0x43, 0x43, 0x1a, 0xb0, 0xe8, 0x72, 0x8b, - 0xda, 0xbe, 0xfb, 0x73, 0xca, 0x29, 0xf2, 0x4b, 0x3d, 0x1b, 0xe7, 0xaa, - 0xee, 0xc3, 0x0f, 0xed, 0x2e, 0x03, 0x3f, 0x7f, 0x55, 0x39, 0x62, 0xd5, - 0x9b, 0xee, 0x37, 0xa6, 0xf1, 0xe4, 0x37, 0x8f, 0xcc, 0x3a, 0x19, 0x9b, - 0xc4, 0xfe, 0x91, 0xb8, 0x41, 0x87, 0xe6, 0x91, 0xc3, 0xb6, 0x07, 0x0e, - 0x3e, 0x07, 0xf6, 0xc0, 0xb3, 0x01, 0xb0, 0x54, 0x3d, 0x25, 0x55, 0x5e, - 0x06, 0xd7, 0x14, 0x57, 0xf9, 0xdf, 0x25, 0x5e, 0x8d, 0x8f, 0x2b, 0xaa, - 0x5e, 0xf6, 0xe9, 0x51, 0x40, 0xb3, 0xfd, 0x0a, 0x55, 0x3a, 0x0d, 0x93, - 0x34, 0x72, 0xb4, 0xcd, 0x6d, 0x44, 0x12, 0x2a, 0xf6, 0x15, 0xf8, 0x3b, - 0x09, 0x1e, 0x68, 0xa1, 0x65, 0xdc, 0x28, 0xf8, 0xd1, 0x51, 0x0f, 0xda, - 0xfa, 0x5b, 0x1e, 0xf0, 0x64, 0x05, 0xf1, 0x7e, 0x4b, 0x21, 0x4e, 0xd2, - 0x44, 0x88, 0x05, 0x12, 0xde, 0xbb, 0x53, 0xe8, 0x24, 0x76, 0xe5, 0x1a, - 0x9d, 0xdd, 0x76, 0x31, 0x08, 0x38, 0x0b, 0xcb, 0xa5, 0x7d, 0x09, 0xa8, - 0xe5, 0x4d, 0xc8, 0x72, 0xe8, 0xd0, 0x30, 0xb6, 0x60, 0x7e, 0x4d, 0xfd, - 0x45, 0x0e, 0xc0, 0x34, 0x4b, 0xb1, 0xc4, 0x5a, 0xfd, 0x2f, 0xb6, 0xa3, - 0xf9, 0x06, 0x1a, 0xc5, 0xb1, 0xda, 0xb8, 0xeb, 0x98, 0x20, 0x0e, 0xdd, - 0xc1, 0xd1, 0xd9, 0xa3, 0x09, 0xb6, 0x3a, 0x6b, 0x84, 0x7d, 0x3a, 0x53, - 0x70, 0x3f, 0xc1, 0xb9, 0x9c, 0xc7, 0x90, 0xe3, 0xf0, 0x4e, 0x1d, 0xd6, - 0x04, 0xc0, 0xed, 0x71, 0xf0, 0x7c, 0xc1, 0xbd, 0x46, 0x25, 0x9e, 0x81, - 0xfb, 0x77, 0x75, 0x71, 0xb9, 0x4f, 0x3e, 0x20, 0xfc, 0xe5, 0x00, 0x80, - 0x30, 0x5f, 0x27, 0x3d, 0x42, 0x1f, 0x82, 0x04, 0xe7, 0x6c, 0x6f, 0x0f, - 0x70, 0x6d, 0x14, 0x9e, 0x15, 0xb4, 0xb0, 0x2e, 0x55, 0xa2, 0xea, 0x28, - 0xb6, 0xcf, 0x79, 0xf5, 0xe4, 0x64, 0xdb, 0xf2, 0x79, 0xf2, 0x14, 0x49, - 0xc1, 0xf3, 0x23, 0x47, 0xff, 0x31, 0x50, 0xef, 0xf0, 0xce, 0x41, 0x99, - 0x21, 0x26, 0x77, 0x8b, 0x71, 0x72, 0x2b, 0x0d, 0x7e, 0xac, 0x73, 0x05, - 0x93, 0x6c, 0xfd, 0x7c, 0x76, 0xcc, 0x09, 0x42, 0x2f, 0x97, 0xa9, 0xf0, - 0xfd, 0x8b, 0x67, 0x7e, 0x5c, 0x67, 0xb4, 0xdb, 0x66, 0xd4, 0x48, 0xf0, - 0x56, 0xdf, 0x0d, 0x3e, 0x09, 0xda, 0x37, 0xd8, 0x7e, 0xab, 0x59, 0xef, - 0xf6, 0xf5, 0x87, 0x3f, 0x4c, 0xd7, 0x1b, 0x5f, 0x66, 0x04, 0x00, 0xf9, - 0x40, 0x10, 0x24, 0xa9, 0x25, 0x7b, 0xf5, 0xb1, 0x85, 0x1f, 0x20, 0xc1, - 0x96, 0xf1, 0x51, 0x64, 0xd6, 0xb8, 0x58, 0x9a, 0xa5, 0x44, 0xd0, 0xef, - 0xf9, 0x08, 0xaa, 0xd9, 0x88, 0x8a, 0x9a, 0xb1, 0x9e, 0x23, 0x97, 0x8e, - 0xef, 0xf1, 0x85, 0xdd, 0x69, 0xdb, 0x3e, 0x53, 0xfe, 0xff, 0x0a, 0xf8, - 0xb6, 0xd7, 0x26, 0xad, 0xed, 0x66, 0x23, 0xba, 0xd6, 0xd0, 0x38, 0x05, - 0x8a, 0x0c, 0xc7, 0xa7, 0x28, 0xd2, 0x4e, 0x26, 0xb1, 0x8a, 0xf7, 0x23, - 0x47, 0xc8, 0xe0, 0xf7, 0x54, 0x70, 0xf5, 0xb6, 0x0d, 0xf2, 0xae, 0xdb, - 0x1f, 0x19, 0xb4, 0x08, 0x32, 0x84, 0x1c, 0xa3, 0x3f, 0x86, 0xe7, 0x51, - 0xae, 0x41, 0x9d, 0x22, 0xd3, 0x12, 0xf2, 0x08, 0xb4, 0xe3, 0xfe, 0x64, - 0xd9, 0xa6, 0xe1, 0xd2, 0x99, 0x23, 0xaa, 0x98, 0x78, 0xd5, 0x30, 0xcf, - 0x7c, 0xe1, 0x1f, 0x05, 0x98, 0xf6, 0x69, 0xcb, 0x00, 0xd1, 0x75, 0xcf, - 0x54, 0xe3, 0xb1, 0xac, 0x4b, 0xce, 0xe7, 0x1a, 0xb8, 0x7d, 0x85, 0xe2, - 0x3f, 0x99, 0xab, 0x37, 0xa2, 0x80, 0xfe, 0x3f, 0x5d, 0xdd, 0x20, 0x33, - 0x33, 0xed, 0xfe, 0xba, 0x88, 0x59, 0xd0, 0x2f, 0xd1, 0xe2, 0x69, 0x33, - 0xc9, 0xc2, 0x6f, 0x53, 0x6b, 0x9b, 0x53, 0xb1, 0xf2, 0x68, 0x15, 0x59, - 0xf9, 0x95, 0x57, 0x22, 0xea, 0xa7, 0x0d, 0xdb, 0x71, 0x22, 0x4f, 0x3a, - 0x10, 0xbf, 0x66, 0xb7, 0xaa, 0xeb, 0xc0, 0x07, 0x9f, 0xaa, 0x44, 0xc4, - 0xa4, 0x28, 0xff, 0x65, 0x56, 0x2d, 0xc7, 0x52, 0x35, 0x97, 0x39, 0x5b, - 0x99, 0x44, 0xe7, 0xc3, 0xe8, 0x86, 0xe5, 0x05, 0x5c, 0xfd, 0x5e, 0xa2, - 0xc7, 0xa8, 0x1f, 0x14, 0x55, 0x96, 0xe2, 0x20, 0x73, 0xc3, 0x62, 0x6e, - 0x4a, 0x4e, 0x99, 0xc1, 0xd9, 0x50, 0x0b, 0xda, 0x84, 0x98, 0x36, 0xf9, - 0xc6, 0x7f, 0xc3, 0x68, 0x97, 0x21, 0xd9, 0x52, 0xd8, 0xce, 0x37, 0x14, - 0x38, 0x62, 0x31, 0xcd, 0x3c, 0x76, 0xf2, 0xc1, 0xfe, 0xdb, 0x04, 0xdf, - 0x67, 0x7d, 0x5f, 0x0f, 0x8a, 0x39, 0xb8, 0x20, 0xa1, 0x20, 0x52, 0x33, - 0x88, 0xec, 0x62, 0x76, 0xa7, 0x42, 0xe6, 0x4d, 0xf7, 0xfb, 0x96, 0x4d, - 0xaa, 0xdd, 0x6d, 0x6e, 0x1a, 0x3f, 0xb4, 0xf9, 0x9b, 0x36, 0x2e, 0x24, - 0x37, 0x27, 0x43, 0x59, 0xfd, 0x12, 0x6c, 0x07, 0xf9, 0xa5, 0x1c, 0x76, - 0xaf, 0xd8, 0x52, 0x05, 0xa7, 0x6f, 0x55, 0xa6, 0x52, 0xaf, 0xe3, 0x9d, - 0x6e, 0x89, 0x50, 0x92, 0xb5, 0x73, 0x2f, 0x4b, 0x23, 0xa9, 0x0f, 0xc7, - 0x93, 0x2c, 0x68, 0x6e, 0x8c, 0x6f, 0x75, 0x7f, 0xf6, 0x3c, 0xaf, 0x5b, - 0x15, 0xbc, 0xc8, 0x67, 0x96, 0xc3, 0xf5, 0x04, 0xc2, 0x29, 0x46, 0x1b, - 0xde, 0xe1, 0x69, 0xd1, 0x56, 0x37, 0xda, 0x01, 0x74, 0x35, 0xa8, 0x25, - 0xb9, 0x0b, 0xd5, 0x23, 0xba, 0xbe, 0xa5, 0x93, 0x68, 0x9f, 0x58, 0x14, - 0xbf, 0xa6, 0x0a, 0x41, 0x8c, 0x40, 0x92, 0x2e, 0xc9, 0xc0, 0xaa, 0x74, - 0xe0, 0xdf, 0xad, 0x62, 0x1f, 0x9d, 0x58, 0xe6, 0x00, 0x59, 0x00, 0xe7, - 0x57, 0xb0, 0x0d, 0x54, 0x22, 0x1f, 0x42, 0xe5, 0x03, 0xc2, 0x99, 0x33, - 0xde, 0x60, 0xa3, 0x4f, 0xba, 0xc5, 0x61, 0x71, 0xd5, 0x93, 0x76, 0xfa, - 0x79, 0xb2, 0xe9, 0x67, 0xbc, 0x59, 0x7c, 0xc0, 0xaa, 0x86, 0x05, 0x4b, - 0xb0, 0xdf, 0xbf, 0xa7, 0x86, 0x6a, 0x66, 0x52, 0x55, 0xb2, 0xaa, 0x59, - 0x15, 0x83, 0x76, 0x2b, 0x9e, 0xc2, 0x85, 0xfa, 0xe6, 0x7d, 0x76, 0xda, - 0x35, 0x79, 0x79, 0x72, 0x11, 0xe3, 0x9e, 0x1c, 0x3d, 0x55, 0x4e, 0x19, - 0x1d, 0xb3, 0x91, 0x24, 0xbf, 0xb2, 0xe9, 0xc9, 0xcf, 0x01, 0xea, 0x70, - 0x60, 0x92, 0xdd, 0x91, 0x49, 0x50, 0xf3, 0xd8, 0x5b, 0x6a, 0x69, 0x91, - 0x2d, 0xcd, 0xbd, 0x81, 0x9c, 0xad, 0x07, 0xab, 0x2b, 0xa8, 0xbd, 0x44, - 0x52, 0x8e, 0x21, 0x0b, 0x47, 0xa5, 0xd5, 0xa3, 0x14, 0x03, 0xd7, 0x19, - 0xc0, 0x92, 0x3d, 0xa3, 0xbd, 0xb0, 0xf4, 0x06, 0xdd, 0x29, 0x6a, 0x86, - 0x62, 0x08, 0x44, 0xa9, 0xac, 0x83, 0x9b, 0xc0, 0x3f, 0x7d, 0x8c, 0x3f, - 0xc7, 0x44, 0x90, 0xca, 0x9a, 0x31, 0x01, 0x59, 0x5c, 0x91, 0x22, 0x58, - 0x33, 0x39, 0xd6, 0x22, 0xac, 0x33, 0x16, 0xf9, 0x13, 0x0a, 0x03, 0x8f, - 0xa4, 0x81, 0xae, 0xe1, 0xc5, 0x51, 0x30, 0x2b, 0x77, 0xdb, 0xf6, 0xf6, - 0xa8, 0xb1, 0x0d, 0x5f, 0x3f, 0x4a, 0x9c, 0xec, 0xb6, 0xab, 0x1a, 0x7d, - 0x69, 0x35, 0xef, 0x83, 0xce, 0xb7, 0x76, 0x82, 0x0d, 0xd3, 0x90, 0x8f, - 0x39, 0x77, 0x59, 0x1f, 0xcf, 0x2f, 0x7b, 0x36, 0x95, 0x83, 0x2d, 0x38, - 0xaf, 0x84, 0x99, 0xe3, 0xa8, 0x17, 0x94, 0xc1, 0xb6, 0x52, 0x4c, 0x06, - 0x0d, 0xd8, 0xa1, 0x7d, 0x50, 0x28, 0x89, 0x1f, 0xf0, 0x5d, 0x65, 0x09, - 0xc9, 0x92, 0x96, 0xc3, 0x34, 0xbc, 0xdf, 0x9c, 0x02, 0x28, 0xa3, 0x88, - 0x68, 0xa6, 0xf6, 0x07, 0xaf, 0x25, 0x96, 0x3b, 0x56, 0xd3, 0x75, 0x99, - 0xc1, 0xac, 0x20, 0xf5, 0xeb, 0xbd, 0xdc, 0x3d, 0xe1, 0xa0, 0x3c, 0xd1, - 0xf0, 0x67, 0x45, 0x13, 0x12, 0x1a, 0x5b, 0x92, 0xf8, 0x94, 0x64, 0x47, - 0x1c, 0x1b, 0xe8, 0x1c, 0x14, 0x97, 0xbf, 0x50, 0xd2, 0xd9, 0x67, 0x87, - 0xb6, 0x92, 0x8d, 0x85, 0x89, 0x66, 0x64, 0x48, 0x8a, 0x0d, 0x3b, 0xe2, - 0xc6, 0xda, 0x70, 0xc8, 0x64, 0xb4, 0xd7, 0xa2, 0x7c, 0x26, 0xd5, 0xd1, - 0x94, 0x38, 0x48, 0x44, 0xac, 0xd2, 0x89, 0xea, 0x8e, 0xdb, 0xe6, 0xe5, - 0x07, 0x32, 0xde, 0x81, 0x97, 0x48, 0xfd, 0xda, 0x85, 0x36, 0x52, 0x74, - 0x8f, 0x4e, 0xeb, 0x75, 0x3b, 0x4f, 0x75, 0x3f, 0xa9, 0x8a, 0x5c, 0x96, - 0xd0, 0x91, 0x4a, 0x9e, 0xc9, 0xf8, 0xd1, 0x55, 0xee, 0xc4, 0x72, 0xea, - 0x01, 0xcb, 0x6e, 0xd8, 0xa7, 0xbb, 0x76, 0x01, 0xe0, 0x1e, 0xb5, 0xe7, - 0xf3, 0x78, 0x08, 0x24, 0xa6, 0x52, 0x84, 0x44, 0xf1, 0xda, 0xdb, 0x0f, - 0xb9, 0x9c, 0x5e, 0xa9, 0x94, 0x5e, 0x31, 0x56, 0x3e, 0x79, 0x4f, 0x54, - 0xbb, 0x00, 0x58, 0x95, 0x60, 0x2b, 0xe6, 0x15, 0xbc, 0x04, 0x2e, 0x9c, - 0x79, 0xef, 0x58, 0x48, 0xf6, 0x3f, 0xa2, 0x4e, 0x02, 0x58, 0x03, 0x9b, - 0x9d, 0xac, 0x5b, 0xff, 0x75, 0xa3, 0x9e, 0x13, 0x81, 0xc0, 0x3d, 0x0c, - 0x6e, 0xfb, 0x76, 0x43, 0xfd, 0x28, 0xa2, 0x48, 0xa4, 0x66, 0x40, 0x1f, - 0x81, 0xec, 0x5f, 0x5a, 0x11, 0x8c, 0xf9, 0xf0, 0x9d, 0xf6, 0xac, 0x95, - 0xf6, 0xc8, 0xce, 0x20, 0x90, 0xda, 0x85, 0x67, 0x2b, 0x03, 0x8b, 0xe1, - 0x40, 0x53, 0x63, 0x19, 0x06, 0x08, 0xf9, 0xb5, 0xad, 0x5e, 0x78, 0x2f, - 0x45, 0xaf, 0x24, 0x67, 0xe1, 0x9b, 0x68, 0x44, 0x61, 0xd6, 0xbc, 0xdb, - 0x8a, 0x78, 0xbb, 0x6c, 0xbf, 0x4d, 0x66, 0x13, 0x71, 0x42, 0xfe, 0x8e, - 0x26, 0xe6, 0x4e, 0xb0, 0xb0, 0x7f, 0x0a, 0x01, 0x89, 0x6b, 0xe7, 0xda, - 0xd4, 0x73, 0x7a, 0x7f, 0x89, 0x0d, 0xb0, 0x81, 0xa1, 0x93, 0xb7, 0xf9, - 0x05, 0xdb, 0x29, 0x31, 0x5d, 0xe8, 0xdf, 0x0d, 0xee, 0x05, 0x6e, 0xaf, - 0x64, 0x08, 0x54, 0x07, 0x7a, 0xd6, 0xc3, 0x78, 0x33, 0x4b, 0x5c, 0x71, - 0xff, 0x6c, 0xe3, 0x12, 0xfa, 0xde, 0x8d, 0x84, 0xe7, 0xb2, 0x94, 0x5a, - 0x8f, 0xf8, 0xff, 0x0b, 0x52, 0x85, 0xb1, 0xbf, 0xfd, 0x96, 0x1d, 0x64, - 0xf0, 0x73, 0x46, 0xbd, 0x45, 0x57, 0xe4, 0x81, 0x99, 0x74, 0x16, 0x62, - 0x9e, 0x38, 0x3d, 0x66, 0xa9, 0x7c, 0xfd, 0x96, 0x77, 0x3c, 0x7a, 0x32, - 0x2a, 0xb1, 0x4d, 0xfb, 0x6e, 0x74, 0xb4, 0x89, 0xe7, 0x33, 0x28, 0xab, - 0x42, 0xeb, 0xc0, 0x9e, 0xb1, 0x7c, 0xef, 0x9e, 0xc6, 0x81, 0x48, 0x48, - 0x0a, 0x96, 0x36, 0xe1, 0xe6, 0xd8, 0x25, 0x9a, 0xf6, 0xd6, 0xc0, 0x63, - 0xc8, 0xe3, 0x13, 0x62, 0x83, 0x93, 0xb0, 0x8e, 0x12, 0x93, 0x84, 0x56, - 0x0a, 0x7e, 0x99, 0xd8, 0xb2, 0x60, 0xd8, 0x8b, 0x37, 0xa0, 0x1d, 0x97, - 0x99, 0x73, 0xc3, 0xb6, 0xff, 0x6e, 0x1d, 0x9d, 0x40, 0x6f, 0xb9, 0x88, - 0x64, 0x41, 0x34, 0xeb, 0x72, 0xfd, 0xd0, 0x8d, 0x6f, 0xdf, 0xf6, 0xc6, - 0x48, 0xf0, 0x70, 0x93, 0x5f, 0xb2, 0x36, 0x44, 0xeb, 0x11, 0xcb, 0xd6, - 0x1a, 0xb4, 0xa5, 0xa0, 0xef, 0x39, 0xd3, 0x39, 0xb3, 0xe1, 0xf7, 0xa5, - 0xcf, 0xfe, 0x8f, 0x26, 0x47, 0x38, 0xf0, 0x8d, 0x90, 0x5b, 0x86, 0x3b, - 0xe3, 0xa3, 0xc0, 0x19, 0x8a, 0x8d, 0x91, 0xb9, 0xb1, 0xa9, 0xd4, 0x48, - 0x66, 0x23, 0x35, 0xcd, 0x9c, 0xea, 0x53, 0xe7, 0x25, 0x40, 0xfa, 0xe7, - 0x86, 0x41, 0x66, 0x69, 0x74, 0x53, 0xc7, 0xba, 0xb9, 0x26, 0xf2, 0x4e, - 0x1b, 0x59, 0x82, 0x47, 0x93, 0x1d, 0x8d, 0x2b, 0x81, 0xd5, 0x59, 0x4a, - 0x7f, 0x51, 0x09, 0x77, 0x4a, 0xda, 0x3f, 0x4a, 0x4c, 0xc6, 0x7b, 0xe7, - 0x7c, 0x23, 0xe5, 0x1c, 0xca, 0x56, 0x0a, 0xbb, 0x84, 0xc9, 0x8a, 0x6b, - 0xe5, 0x76, 0x61, 0xb2, 0xfb, 0xf2, 0xce, 0x37, 0x6b, 0xd1, 0x11, 0x6b, - 0xeb, 0xb2, 0x8d, 0x0d, 0x72, 0xda, 0x81, 0x6d, 0x97, 0x1f, 0x56, 0x23, - 0x1b, 0xda, 0x6e, 0xa2, 0xd0, 0x38, 0x8d, 0x34, 0xfc, 0x5e, 0x6c, 0x9d, - 0xa1, 0x89, 0x8d, 0x09, 0xf4, 0xfd, 0xb5, 0x9b, 0xd3, 0x45, 0x90, 0xf9, - 0xc9, 0xcd, 0x3f, 0xa7, 0x56, 0x6d, 0x57, 0x27, 0x55, 0x06, 0x09, 0x25, - 0xa9, 0x72, 0xbd, 0x92, 0x53, 0x6c, 0x52, 0x44, 0x0c, 0xe3, 0xe0, 0x69, - 0x7e, 0x13, 0xa3, 0xc3, 0x55, 0x5f, 0x07, 0x9b, 0xa0, 0xd5, 0xba, 0xcc, - 0x63, 0xdd, 0xd0, 0xb3, 0x9f, 0xa9, 0xd6, 0x0d, 0xec, 0xb1, 0x71, 0xea, - 0x7d, 0x3a, 0x1e, 0x0e, 0x8b, 0x36, 0xe2, 0x78, 0x73, 0xa1, 0x0c, 0xf5, - 0xcd, 0x73, 0xa1, 0x4b, 0x7b, 0xd8, 0x46, 0xc0, 0xb5, 0xe1, 0x8d, 0x82, - 0x34, 0x05, 0xd0, 0xd8, 0x62, 0x39, 0x0b, 0xbc, 0x7b, 0xbd, 0xa9, 0x37, - 0x39, 0x9a, 0xa4, 0xc9, 0x89, 0xd7, 0x4f, 0x19, 0x20, 0x0d, 0x1b, 0xe4, - 0x88, 0x0c, 0xb4, 0x66, 0x06, 0xa4, 0x5b, 0xb3, 0x3c, 0xbc, 0x17, 0x8b, - 0x7d, 0xf9, 0x39, 0x97, 0xd2, 0xa8, 0x22, 0xf0, 0xbf, 0x45, 0x1e, 0x29, - 0x79, 0xd2, 0xfc, 0xc5, 0xb1, 0xdb, 0x6b, 0x1f, 0x00, 0x76, 0xad, 0xa4, - 0x6c, 0xbe, 0x5b, 0xed, 0xe6, 0x8a, 0x5e, 0x6e, 0x5c, 0x56, 0x31, 0x3a, - 0x0e, 0x10, 0x52, 0x8a, 0xf7, 0xf3, 0xe4, 0xec, 0x55, 0x34, 0xd2, 0xc6, - 0x20, 0x17, 0xda, 0xf8, 0x22, 0x6d, 0xd5, 0x63, 0x62, 0xf8, 0xdd, 0xd4, - 0xbf, 0x53, 0x34, 0x96, 0x75, 0x8f, 0x66, 0x2e, 0x1c, 0xef, 0x7b, 0x9b, - 0xa1, 0xb6, 0x1f, 0x2b, 0xce, 0x8b, 0x09, 0x24, 0x27, 0xa3, 0xd9, 0xca, - 0x68, 0x62, 0xec, 0x6d, 0xd3, 0x07, 0x74, 0xa9, 0x41, 0x23, 0x5d, 0xc5, - 0x9b, 0xcb, 0xc1, 0xbb, 0x8d, 0x60, 0xaf, 0xd5, 0xf6, 0x0d, 0x00, 0x57, - 0xce, 0xd7, 0xfe, 0xd2, 0x44, 0xdb, 0x4c, 0xab, 0x8a, 0x74, 0xbb, 0x87, - 0x1c, 0x04, 0xbb, 0x0d, 0x9d, 0x4f, 0x38, 0x1a, 0x84, 0xaa, 0x6b, 0xab, - 0xff, 0xc9, 0xcd, 0x6e, 0x07, 0x8b, 0x91, 0x5e, 0x7a, 0x3c, 0x2d, 0x4e, - 0xad, 0x35, 0xb5, 0x95, 0x54, 0x8d, 0x1b, 0x06, 0xe9, 0x9f, 0x0b, 0x7a, - 0x84, 0xaf, 0x4f, 0xa3, 0x19, 0x70, 0xee, 0xb3, 0xb5, 0x8a, 0xf1, 0x53, - 0xae, 0xae, 0xcc, 0x5c, 0xa9, 0x3f, 0x51, 0xdd, 0xc5, 0x28, 0x13, 0x59, - 0x05, 0xbb, 0x90, 0x9b, 0x9b, 0xba, 0xe5, 0x91, 0x23, 0x80, 0xe5, 0xf3, - 0xc2, 0x98, 0xb7, 0x55, 0x9b, 0x21, 0xd7, 0x8c, 0x1b, 0xca, 0xd7, 0xf7, - 0x93, 0xba, 0x05, 0xe9, 0x5d, 0x57, 0x02, 0xc2, 0xf7, 0xe4, 0x9b, 0x54, - 0x91, 0x11, 0x5c, 0xaa, 0xb4, 0x88, 0x28, 0xdf, 0x3c, 0x2a, 0x89, 0xd1, - 0xc8, 0x47, 0xdf, 0x60, 0x69, 0xbc, 0x8a, 0x43, 0xd0, 0x93, 0xf9, 0xb7, - 0x90, 0x73, 0xab, 0xa0, 0xf3, 0x55, 0xe4, 0xd7, 0xcf, 0x9c, 0xd7, 0xb5, - 0xe8, 0x29, 0xc7, 0x47, 0x40, 0xa9, 0x6e, 0x15, 0x07, 0xe7, 0x6b, 0xa7, - 0x49, 0xbb, 0x8d, 0x31, 0x2d, 0xfa, 0xa5, 0x27, 0x95, 0xbe, 0x54, 0x25, - 0x07, 0x82, 0x91, 0x8e, 0x51, 0xb8, 0xa2, 0xca, 0x0e, 0xc9, 0xd0, 0x71, - 0x5e, 0xcf, 0xb9, 0xf1, 0x05, 0x1e, 0xc8, 0xbf, 0x1e, 0x60, 0xc9, 0xc0, - 0x79, 0x35, 0x1b, 0x83, 0x5a, 0x7b, 0x39, 0xbb, 0xca, 0xe7, 0x66, 0xa3, - 0x37, 0x1f, 0xdd, 0xbf, 0xba, 0x61, 0x1f, 0xd2, 0xc6, 0xa9, 0x66, 0x10, - 0x0c, 0xa8, 0xca, 0x43, 0x2c, 0x2c, 0xda, 0x88, 0xdc, 0x53, 0x53, 0x4b, - 0x01, 0xb7, 0x23, 0xe2, 0x10, 0x5a, 0x5d, 0x3c, 0x2c, 0x02, 0xc5, 0xe9, - 0xe7, 0x72, 0x67, 0x7c, 0x09, 0x8f, 0xaa, 0x7a, 0xcc, 0x18, 0x53, 0xd2, - 0xb2, 0x5c, 0xb2, 0x33, 0x98, 0xd5, 0xdd, 0x48, 0x00, 0x76, 0xcb, 0xc2, - 0xdb, 0x00, 0xe4, 0x0c, 0xae, 0x54, 0xa9, 0xf9, 0x58, 0x9e, 0xba, 0x4e, - 0x02, 0xbd, 0x44, 0x85, 0x88, 0xb1, 0xbc, 0x11, 0xa0, 0x15, 0x57, 0x8e, - 0x30, 0x81, 0x2e, 0x57, 0x0a, 0x70, 0xee, 0x1b, 0x33, 0x13, 0x74, 0x3a, - 0x85, 0x9d, 0xe9, 0xf1, 0x77, 0x8b, 0x8e, 0xb3, 0xe5, 0x8a, 0x94, 0xc2, - 0x4f, 0x4d, 0xba, 0xfc, 0x1b, 0xd9, 0xcf, 0xb1, 0xbc, 0xbb, 0x1c, 0x36, - 0x8a, 0x5a, 0x21, 0xda, 0xd9, 0x8d, 0x07, 0xaf, 0x7f, 0xf5, 0x8a, 0xce, - 0x9a, 0x26, 0xd9, 0xeb, 0xdf, 0xd6, 0x17, 0x52, 0x7e, 0x60, 0x29, 0x89, - 0x1f, 0xab, 0x70, 0x5b, 0xba, 0x72, 0x53, 0xb2, 0xef, 0x2d, 0xad, 0x61, - 0x5c, 0x3d, 0x82, 0xaa, 0x67, 0x73, 0xca, 0x8f, 0xa7, 0xcc, 0x7d, 0xe7, - 0xcc, 0x19, 0x86, 0xb5, 0xa6, 0x7a, 0x26, 0xc9, 0xb8, 0x63, 0xcf, 0xc0, - 0xed, 0xc3, 0x57, 0x9e, 0xa5, 0xd7, 0xb6, 0x2c, 0xf4, 0x9a, 0x3d, 0x4e, - 0xf5, 0x4e, 0x2b, 0xe9, 0x71, 0x76, 0x88, 0xa0, 0xe7, 0x96, 0x70, 0x6d, - 0x35, 0x17, 0x60, 0xaf, 0xba, 0x1e, 0x82, 0xd5, 0xb8, 0x1c, 0x44, 0x88, - 0xcc, 0x38, 0xcd, 0x9b, 0x78, 0x8e, 0xb7, 0xe8, 0x58, 0x62, 0xe7, 0xb2, - 0xeb, 0x5b, 0xd0, 0xb5, 0xa8, 0x24, 0x83, 0xd8, 0xf4, 0x95, 0x5d, 0x91, - 0x71, 0x85, 0x79, 0xda, 0x4a, 0xfe, 0x38, 0xc3, 0xb5, 0x99, 0x18, 0x08, - 0xf8, 0x18, 0x68, 0x1a, 0xef, 0xd8, 0xdf, 0xa2, 0x1a, 0x0d, 0x22, 0x07, - 0x6c, 0x42, 0x6d, 0x5a, 0xe1, 0x9d, 0x56, 0x53, 0xdd, 0xe8, 0xe3, 0xc6, - 0x74, 0x2e, 0xcf, 0x50, 0x33, 0x1e, 0xa9, 0xc6, 0x92, 0x23, 0xb1, 0xa6, - 0x81, 0x76, 0x6e, 0x23, 0x80, 0x55, 0xee, 0x54, 0xb2, 0xaf, 0xb5, 0x55, - 0xe7, 0x9c, 0x28, 0xf1, 0xdd, 0x7f, 0x09, 0x9a, 0xf6, 0x06, 0x99, 0x24, - 0x7a, 0x33, 0x74, 0x71, 0xc0, 0x6d, 0x8f, 0x1f, 0x02, 0xf9, 0x7a, 0x66, - 0x10, 0xb0, 0xba, 0x96, 0xdc, 0x5a, 0xd1, 0x83, 0x1e, 0x8e, 0xc7, 0x77, - 0x35, 0x52, 0xc9, 0xf2, 0x0c, 0x76, 0xb2, 0xcd, 0xa9, 0x1f, 0xdf, 0x70, - 0x08, 0xb6, 0x38, 0x74, 0xec, 0x27, 0xa9, 0x0c, 0x5a, 0xe3, 0x06, 0xab, - 0x3b, 0x33, 0x3e, 0x0a, 0x33, 0xc1, 0x11, 0x0d, 0x2f, 0x5e, 0x55, 0x96, - 0x60, 0xc0, 0x25, 0x3f, 0x9d, 0x74, 0xba, 0xe0, 0x2a, 0x3d, 0x96, 0x31, - 0x18, 0xcc, 0x10, 0x35, 0xf2, 0x89, 0xe6, 0xac, 0x47, 0x0b, 0x58, 0x6a, - 0x3a, 0x25, 0xc4, 0x67, 0xee, 0x55, 0x25, 0xe9, 0x72, 0xe0, 0x63, 0xb3, - 0x51, 0x8a, 0x49, 0x4a, 0xdc, 0xab, 0x66, 0xd4, 0xf7, 0xb8, 0xb8, 0x5a, - 0x32, 0xf3, 0x01, 0x6e, 0x9d, 0xb1, 0x97, 0x09, 0x1e, 0x1d, 0xeb, 0x6e, - 0x45, 0xac, 0x7b, 0x3b, 0x94, 0xe6, 0x38, 0xf8, 0x9e, 0x75, 0x30, 0xa9, - 0x69, 0xf8, 0x70, 0xd6, 0xe1, 0x02, 0x60, 0xb8, 0x24, 0x28, 0xf7, 0x8a, - 0x38, 0x31, 0x85, 0xd5, 0x18, 0x41, 0x78, 0x86, 0x3f, 0x87, 0x76, 0x33, - 0x68, 0x67, 0x18, 0xd0, 0x9c, 0xae, 0x3f, 0x44, 0x3c, 0x97, 0xd1, 0x21, - 0x33, 0x8d, 0x38, 0x0c, 0x19, 0x10, 0xe7, 0x77, 0xfe, 0x29, 0xdc, 0xb5, - 0x72, 0x94, 0xbc, 0xd7, 0xee, 0x17, 0x6f, 0xbb, 0xcb, 0xd8, 0x1f, 0x50, - 0x73, 0x30, 0xb4, 0xb1, 0x6a, 0x22, 0x59, 0x18, 0xfb, 0xd4, 0x10, 0xb9, - 0x55, 0xce, 0x8d, 0x99, 0x86, 0xba, 0x92, 0xe1, 0xda, 0xf8, 0xbc, 0xae, - 0xab, 0xec, 0x72, 0xf8, 0xf1, 0xfa, 0x37, 0xe9, 0xc3, 0x40, 0x28, 0xea, - 0xc3, 0x5a, 0x07, 0x27, 0xfd, 0x33, 0x08, 0xd4, 0x0d, 0xe2, 0x1f, 0x4e, - 0x78, 0x2f, 0x27, 0x33, 0x45, 0x5c, 0xc0, 0xb4, 0x78, 0x4a, 0x46, 0x7d, - 0x57, 0xbf, 0xb8, 0x62, 0x23, 0x46, 0xa0, 0x3e, 0x1f, 0xeb, 0x7d, 0x77, - 0x7e, 0x67, 0x96, 0x9a, 0xe3, 0x78, 0x63, 0x0f, 0xad, 0x7e, 0x72, 0x15, - 0x74, 0xea, 0xc3, 0x9d, 0x3c, 0x0f, 0xd9, 0x67, 0xc9, 0xd8, 0x62, 0x23, - 0x19, 0x38, 0xe7, 0xa6, 0xb4, 0x1d, 0x3a, 0x25, 0xf4, 0x4a, 0x6c, 0x96, - 0x42, 0xaa, 0x92, 0xd4, 0xd8, 0x83, 0x27, 0x6e, 0x1c, 0x80, 0x61, 0xe4, - 0xe3, 0xd1, 0xfd, 0x0c, 0x6f, 0x83, 0x31, 0x60, 0x94, 0xd2, 0x37, 0xa4, - 0x7c, 0xaf, 0x33, 0xfa, 0xed, 0x60, 0x0c, 0x3e, 0x91, 0xa1, 0x36, 0xc4, - 0x2a, 0xaf, 0x3b, 0x4b, 0x2f, 0x01, 0x9d, 0xe2, 0x1f, 0xfe, 0x83, 0x05, - 0xde, 0x3c, 0x35, 0xc9, 0x42, 0x18, 0x91, 0x08, 0xb3, 0x5b, 0xaa, 0x8b, - 0x98, 0xa0, 0x67, 0x65, 0xd8, 0xeb, 0xc5, 0x1f, 0x00, 0x4a, 0x84, 0x0f, - 0x96, 0x65, 0xd7, 0x83, 0xad, 0x9b, 0x84, 0x6a, 0xbc, 0x38, 0x1f, 0x4f, - 0x5a, 0xb1, 0x87, 0x6f, 0xaf, 0x2d, 0xce, 0x4a, 0xfa, 0x58, 0xe5, 0x7c, - 0x74, 0x9a, 0xcd, 0x7a, 0xe0, 0xb2, 0xb5, 0xb2, 0x0d, 0x83, 0xf3, 0x6d, - 0xd6, 0xba, 0x9e, 0xcc, 0x70, 0x32, 0x19, 0x23, 0x19, 0x1d, 0xa7, 0xd5, - 0x62, 0x48, 0x23, 0x8b, 0xd3, 0x59, 0xef, 0xef, 0x6a, 0xd1, 0xab, 0x09, - 0xed, 0xbc, 0x90, 0x19, 0xb9, 0x3e, 0x25, 0x5f, 0xc0, 0x57, 0x19, 0x29, - 0x3d, 0x9f, 0x65, 0xda, 0x62, 0x40, 0x9a, 0xe9, 0x3d, 0x1f, 0x78, 0xa9, - 0xad, 0x74, 0x60, 0x47, 0x13, 0x4a, 0xc1, 0xfb, 0xf0, 0xde, 0x6e, 0x57, - 0xdf, 0x81, 0xb3, 0x3f, 0xbf, 0xfa, 0xc7, 0x19, 0xb2, 0xa3, 0xfe, 0xae, - 0x4c, 0x0e, 0xd7, 0xf6, 0x1f, 0xfd, 0x69, 0x3f, 0x1b, 0x63, 0xb2, 0xd8, - 0xb5, 0x50, 0x0f, 0x77, 0xa5, 0xfe, 0x89, 0x31, 0x25, 0x0e, 0x3e, 0x40, - 0xba, 0x6a, 0x5d, 0x30, 0x05, 0x92, 0x9f, 0x52, 0xab, 0xf1, 0x2a, 0x9b, - 0x1f, 0x09, 0x93, 0xa7, 0xe9, 0x7b, 0x12, 0x3b, 0x48, 0xd1, 0xc2, 0x4e, - 0xf8, 0x98, 0x16, 0xfd, 0xa5, 0x54, 0x84, 0x1e, 0x6a, 0xc1, 0x49, 0x1f, - 0x28, 0x5f, 0x91, 0x9d, 0x04, 0xca, 0x19, 0x4e, 0xd5, 0x96, 0x56, 0x8f, - 0x5b, 0xb3, 0x0e, 0xb7, 0xec, 0x8d, 0xdc, 0x90, 0x7c, 0x78, 0x0f, 0xbc, - 0xd6, 0x28, 0xd3, 0xb0, 0x7d, 0x95, 0x37, 0xf8, 0xb9, 0x5e, 0x00, 0x50, - 0x7e, 0xb6, 0x8f, 0x21, 0x19, 0x79, 0x46, 0x98, 0x3b, 0xdf, 0x72, 0x80, - 0x52, 0xcd, 0x3c, 0x37, 0x66, 0x54, 0x0c, 0xa9, 0xfb, 0x77, 0x66, 0x9a, - 0x9d, 0xb8, 0x4d, 0x29, 0x26, 0x86, 0xde, 0x85, 0x21, 0xce, 0xc1, 0xf0, - 0x70, 0x0f, 0xa1, 0x7b, 0x5a, 0x26, 0x72, 0x35, 0xa1, 0x06, 0x47, 0x19, - 0xcd, 0x8d, 0x63, 0x55, 0xe6, 0x34, 0xb1, 0x12, 0x20, 0xa7, 0x6c, 0xc7, - 0x5f, 0x94, 0x7e, 0x27, 0xcf, 0xb0, 0xc0, 0xc1, 0x69, 0x6b, 0x5d, 0x3e, - 0xee, 0xd7, 0x82, 0xa1, 0x6e, 0x05, 0xbf, 0xfa, 0xc0, 0x69, 0xb2, 0xab, - 0x7c, 0x76, 0xa4, 0xca, 0x9c, 0x09, 0x35, 0x43, 0xdf, 0x7b, 0x4b, 0x6e, - 0xd7, 0xef, 0xcf, 0xe2, 0xce, 0x7d, 0xc2, 0xea, 0x44, 0xbb, 0xd2, 0xb9, - 0x33, 0x00, 0x0c, 0xbd, 0x73, 0x92, 0xac, 0x00, 0x38, 0x5f, 0x96, 0x7b, - 0x72, 0x8e, 0xe1, 0xa7, 0x57, 0xd9, 0x7b, 0x4b, 0x7b, 0x5f, 0x6e, 0xc0, - 0xd9, 0xbc, 0xa3, 0x5b, 0xce, 0x62, 0x61, 0x79, 0x02, 0x11, 0xfd, 0xb3, - 0xba, 0x34, 0x75, 0x4f, 0x55, 0x8e, 0xa5, 0x58, 0xd4, 0xe9, 0xfc, 0x76, - 0xdb, 0x29, 0xe0, 0xca, 0x01, 0xcd, 0xb8, 0x07, 0x61, 0x4b, 0x29, 0x77, - 0xca, 0xba, 0x19, 0x92, 0x70, 0xdb, 0xf8, 0xe4, 0xb0, 0xf7, 0x2a, 0x62, - 0x91, 0x8d, 0xe2, 0xd4, 0x1b, 0xdc, 0x51, 0xf3, 0x67, 0xd0, 0x7b, 0xc6, - 0x08, 0xf5, 0x77, 0x55, 0x37, 0xe9, 0x93, 0x35, 0x44, 0xaa, 0xc5, 0xb3, - 0xcf, 0x44, 0xd4, 0x56, 0x83, 0x3b, 0x2a, 0x54, 0x4f, 0x3b, 0x9d, 0xb5, - 0x19, 0xf6, 0xb9, 0xa0, 0x43, 0x81, 0x7f, 0xc6, 0x92, 0xe7, 0x2a, 0x20, - 0x18, 0x6a, 0x4a, 0xbd, 0xe3, 0x06, 0x15, 0xc3, 0x29, 0xcb, 0x7b, 0x72, - 0x7f, 0x55, 0x89, 0x39, 0x9c, 0x3c, 0x06, 0x33, 0xd6, 0x77, 0xdd, 0x32, - 0xf9, 0x86, 0x9c, 0xe8, 0x89, 0xcc, 0x4f, 0x62, 0x1a, 0x2d, 0x2b, 0x49, - 0x47, 0x60, 0xd2, 0xe8, 0x65, 0x17, 0x44, 0xcb, 0xf8, 0x71, 0x6a, 0x98, - 0x3f, 0x03, 0x2e, 0x89, 0x17, 0x2e, 0xb5, 0x62, 0xd4, 0x84, 0xe6, 0xa1, - 0xbf, 0x28, 0x8c, 0x87, 0x29, 0x8e, 0xcc, 0xb5, 0x66, 0xf0, 0x88, 0x9f, - 0x27, 0x09, 0xb5, 0x35, 0x57, 0x56, 0x93, 0xfe, 0xb2, 0x3f, 0x45, 0x93, - 0x7c, 0xae, 0x4d, 0x97, 0x23, 0xbd, 0x2a, 0x01, 0x4c, 0xc9, 0xa7, 0xd6, - 0xf5, 0xc2, 0x8b, 0xda, 0x3b, 0xca, 0xdd, 0x29, 0x09, 0x1e, 0x58, 0x86, - 0x56, 0xb0, 0x7e, 0x24, 0x9c, 0x44, 0x14, 0x93, 0xd3, 0x72, 0xee, 0xd9, - 0xea, 0xf1, 0xda, 0x80, 0x89, 0x51, 0x63, 0xde, 0x2e, 0xaf, 0x19, 0xb8, - 0xef, 0xd3, 0xb1, 0x29, 0x9d, 0x45, 0xd5, 0x1a, 0xca, 0x54, 0xa0, 0x40, - 0x59, 0x06, 0xe9, 0x41, 0x9b, 0x89, 0xf4, 0x18, 0xfe, 0x80, 0xc3, 0x3c, - 0x84, 0x8e, 0xd0, 0x8e, 0xd6, 0x75, 0xde, 0x43, 0x17, 0x28, 0x40, 0x23, - 0x44, 0xa1, 0x81, 0x49, 0x49, 0x5a, 0x25, 0x52, 0x1a, 0xe7, 0xb5, 0xc9, - 0xfb, 0xde, 0xf5, 0x5e, 0xfb, 0x74, 0x5f, 0x0a, 0x70, 0xcb, 0xbf, 0x6f, - 0xf4, 0x04, 0xb2, 0x39, 0xa1, 0x98, 0x70, 0xfe, 0x3c, 0x1a, 0x33, 0xb4, - 0x39, 0x86, 0x6b, 0x84, 0x63, 0x11, 0x5a, 0x44, 0xf4, 0xa1, 0x0b, 0xdc, - 0x03, 0x0c, 0xdd, 0x0d, 0x58, 0xba, 0x06, 0xb7, 0x99, 0xdf, 0x91, 0xea, - 0x60, 0xad, 0xf9, 0x6a, 0x96, 0xc8, 0xfd, 0xff, 0x66, 0x3d, 0x90, 0xc9, - 0x9f, 0xc2, 0x27, 0x47, 0xf8, 0x9c, 0x8c, 0xa8, 0xb7, 0x12, 0x0b, 0x07, - 0x46, 0x47, 0xcd, 0x50, 0x0d, 0xc6, 0x3c, 0x28, 0xd5, 0x71, 0xcf, 0x0d, - 0x67, 0x7e, 0xc6, 0xb1, 0x8f, 0xf3, 0xea, 0xd3, 0x8d, 0x7e, 0x54, 0x3d, - 0x9a, 0xba, 0xf2, 0xe4, 0x21, 0x35, 0x6a, 0x46, 0xb3, 0x97, 0x41, 0x92, - 0x42, 0x8e, 0xfe, 0x4c, 0xb6, 0xc7, 0x82, 0x59, 0x11, 0x14, 0xc7, 0x9a, - 0x8a, 0x4d, 0xdc, 0xcd, 0x47, 0x69, 0x72, 0x6f, 0x23, 0x31, 0x79, 0xa0, - 0x02, 0xbe, 0xca, 0x78, 0xea, 0x6a, 0xda, 0xc8, 0x84, 0x4c, 0x35, 0xc8, - 0x3f, 0x6f, 0xd0, 0x4d, 0x65, 0x9e, 0xdf, 0x00, 0x2a, 0xb7, 0x77, 0x3b, - 0x95, 0x78, 0x87, 0x06, 0xa4, 0x7d, 0xa9, 0x04, 0xc0, 0x53, 0xef, 0x5c, - 0xd9, 0xa0, 0xf6, 0xa9, 0xdd, 0x4e, 0xf3, 0x89, 0x9f, 0x6a, 0x01, 0x50, - 0x8e, 0x0f, 0xb6, 0x81, 0x1b, 0x57, 0x24, 0x7f, 0xb4, 0xff, 0x44, 0x0e, - 0x49, 0xcc, 0xb8, 0xe0, 0x27, 0x0f, 0x3c, 0x19, 0x91, 0xf4, 0xef, 0xef, - 0x5d, 0x8f, 0xc5, 0x5d, 0x54, 0xc0, 0x56, 0xd3, 0x9d, 0xa0, 0xaa, 0xbe, - 0x23, 0x9f, 0x65, 0x89, 0xb9, 0x0b, 0xe5, 0xc1, 0x76, 0xe7, 0x0b, 0x76, - 0x0d, 0x03, 0x9b, 0x01, 0xe2, 0xc0, 0xa5, 0x23, 0x5e, 0xb5, 0xde, 0xe5, - 0x0b, 0x1a, 0x35, 0xd0, 0x53, 0x81, 0x16, 0xd5, 0xef, 0xca, 0x6a, 0x82, - 0xa2, 0x86, 0xb5, 0x55, 0xec, 0x7b, 0x3f, 0xa3, 0x8c, 0x68, 0xe3, 0x72, - 0x66, 0x5a, 0x1d, 0x72, 0xa9, 0x87, 0x52, 0x45, 0x46, 0x07, 0xee, 0xd4, - 0xda, 0xfb, 0x0b, 0x40, 0x7b, 0x19, 0x56, 0xa6, 0x8b, 0xde, 0x4f, 0xfb, - 0xc1, 0x3e, 0x9c, 0xa9, 0x35, 0x77, 0x0b, 0xc0, 0x59, 0xa6, 0xc4, 0xb5, - 0x28, 0xea, 0x39, 0x6d, 0xc2, 0x8c, 0xb8, 0x7d, 0xfd, 0x0a, 0x68, 0x6f, - 0x95, 0xd5, 0x98, 0xc2, 0x23, 0x77, 0x02, 0xd1, 0x48, 0x1b, 0x9c, 0xe0, - 0x4c, 0xca, 0x91, 0x3c, 0x26, 0xec, 0x81, 0x51, 0xaa, 0x93, 0x66, 0x97, - 0xda, 0xa8, 0x1a, 0x2a, 0x64, 0x4c, 0xde, 0x3e, 0xcc, 0x0b, 0x0d, 0xf1, - 0xc8, 0x7d, 0x18, 0x08, 0x86, 0x71, 0xc6, 0xcb, 0x94, 0x59, 0xa7, 0xba, - 0x92, 0xe4, 0x9c, 0x50, 0xc0, 0xd2, 0x38, 0x79, 0x26, 0x04, 0x05, 0xa0, - 0x39, 0xfa, 0x27, 0x99, 0x77, 0x71, 0x35, 0xb3, 0x20, 0xfe, 0xc5, 0x2e, - 0xe9, 0xb4, 0x64, 0x05, 0xca, 0x46, 0xe6, 0x33, 0xf4, 0x7a, 0x2c, 0x63, - 0x0c, 0x72, 0x3e, 0x5f, 0xc4, 0x0a, 0x8f, 0x09, 0xde, 0x43, 0xbf, 0x56, - 0x1f, 0x29, 0x74, 0x86, 0x5b, 0x3f, 0x3b, 0x2c, 0xcd, 0xf1, 0xda, 0x1a, - 0x9b, 0x9d, 0x0b, 0x62, 0x2b, 0xd7, 0x81, 0xe6, 0x1b, 0x0e, 0xcb, 0x72, - 0x9b, 0x5c, 0x5b, 0x0f, 0x70, 0x75, 0x1d, 0x86, 0xea, 0xc7, 0x30, 0xd7, - 0x37, 0x00, 0x29, 0xfd, 0xd9, 0x7d, 0x1b, 0x40, 0x16, 0x2a, 0x1b, 0x06, - 0x2c, 0xd0, 0x92, 0xe4, 0x20, 0x17, 0x7d, 0x65, 0xc3, 0x17, 0xe2, 0xf9, - 0x0f, 0xe6, 0x59, 0xae, 0xa8, 0x95, 0x66, 0xc8, 0x90, 0x52, 0xb1, 0x2b, - 0xf6, 0xd6, 0xb7, 0xe7, 0x6c, 0xb1, 0x15, 0x23, 0x8a, 0xed, 0xad, 0x27, - 0x67, 0x9c, 0x73, 0xe7, 0x6f, 0x84, 0x99, 0xf3, 0x59, 0xe9, 0xe1, 0x19, - 0x53, 0xd0, 0x74, 0x55, 0x73, 0x41, 0xf3, 0x79, 0xe3, 0x67, 0x0d, 0x6f, - 0x8e, 0x69, 0xfb, 0xca, 0xbe, 0xb7, 0xce, 0x47, 0x8d, 0xa6, 0x9d, 0x83, - 0x54, 0xf7, 0xca, 0x4e, 0xf6, 0x6c, 0x9d, 0xa7, 0x0a, 0xa5, 0x3a, 0xdf, - 0xdd, 0xec, 0xe2, 0xfe, 0xc8, 0xac, 0x8b, 0x44, 0x57, 0xb3, 0x39, 0xe3, - 0xee, 0x94, 0xd3, 0x6b, 0xf5, 0x06, 0xb0, 0x34, 0x4c, 0x45, 0x16, 0x9d, - 0x72, 0xc4, 0x04, 0xd1, 0x4f, 0x8d, 0x2f, 0x22, 0xec, 0x46, 0xf1, 0xc2, - 0x27, 0x41, 0x01, 0x6f, 0xd9, 0x62, 0xee, 0x26, 0xdf, 0x44, 0x96, 0xa6, - 0x63, 0x74, 0x38, 0x4d, 0x76, 0xd5, 0x31, 0x39, 0xeb, 0xcd, 0x8e, 0x53, - 0x7c, 0x6d, 0x07, 0x42, 0x36, 0x7c, 0x89, 0x5d, 0xf8, 0xee, 0xe5, 0x24, - 0x88, 0x19, 0x3d, 0x2e, 0x33, 0x8e, 0x50, 0xec, 0x7a, 0x58, 0x4d, 0x0c, - 0x0e, 0x42, 0x23, 0x1b, 0x8d, 0x80, 0xe1, 0x46, 0x1f, 0xa1, 0x94, 0x32, - 0xf7, 0x9c, 0x7e, 0x05, 0x64, 0xc7, 0xe6, 0xf0, 0x17, 0x16, 0x85, 0x18, - 0x82, 0xbd, 0xf6, 0xf5, 0xff, 0x27, 0x68, 0xff, 0x1b, 0x23, 0x0b, 0x8c, - 0x38, 0x5b, 0x36, 0x85, 0x41, 0xc0, 0x31, 0xe0, 0xdc, 0xd5, 0x91, 0x2f, - 0x2a, 0x77, 0x8e, 0x9d, 0x4c, 0xb6, 0x03, 0x08, 0xb4, 0x33, 0x4a, 0x7c, - 0xe2, 0x8f, 0x51, 0x8f, 0x68, 0x1a, 0x1c, 0xcd, 0x5d, 0x43, 0x75, 0x1a, - 0x5a, 0xe8, 0x87, 0xdd, 0x29, 0xc9, 0x91, 0x20, 0x1f, 0xf7, 0x32, 0x1b, - 0xdf, 0x1d, 0x12, 0x31, 0xfa, 0x5d, 0x5a, 0x13, 0x5e, 0x70, 0xf8, 0xdf, - 0xde, 0x28, 0x77, 0x6c, 0xb9, 0x81, 0x54, 0x27, 0x87, 0x7e, 0x2e, 0xb2, - 0xd1, 0xbe, 0x8e, 0x3f, 0xef, 0xe4, 0x47, 0x4f, 0x06, 0x55, 0xac, 0xe0, - 0x9b, 0xa3, 0x0f, 0x7f, 0x0a, 0x59, 0xbd, 0xf3, 0xf8, 0xa7, 0x83, 0x46, - 0x76, 0xcc, 0x20, 0x20, 0x39, 0x69, 0xb0, 0xd2, 0x0f, 0xc6, 0x2b, 0xbe, - 0x33, 0x3c, 0x86, 0xb0, 0xe8, 0x46, 0x90, 0x78, 0x3a, 0x15, 0xec, 0x97, - 0x00, 0x1d, 0xc3, 0x94, 0x67, 0x62, 0xf9, 0x3e, 0x29, 0x81, 0x6c, 0x48, - 0x81, 0x31, 0xf6, 0xa5, 0x8c, 0xd0, 0x96, 0x57, 0x44, 0x5e, 0x67, 0x92, - 0xc2, 0xdd, 0xfa, 0x7c, 0xfd, 0x01, 0x77, 0x96, 0xe4, 0x22, 0x84, 0xe7, - 0x44, 0x8a, 0x29, 0xca, 0xb1, 0xff, 0xf8, 0x76, 0x9e, 0x36, 0xd0, 0xa4, - 0x59, 0x81, 0x2d, 0xdd, 0xa4, 0x7e, 0xde, 0xe7, 0xe3, 0xad, 0x55, 0x82, - 0xf7, 0x40, 0x68, 0x94, 0x08, 0x74, 0xf3, 0x2d, 0x1d, 0x54, 0xd4, 0x8b, - 0xde, 0x07, 0x81, 0xa8, 0x07, 0x06, 0x0e, 0x4c, 0x35, 0x2b, 0x26, 0xde, - 0xfa, 0xb6, 0xc1, 0xeb, 0x68, 0x13, 0xf9, 0x26, 0x44, 0x98, 0x24, 0x70, - 0x42, 0xba, 0x84, 0x4c, 0xb1, 0x06, 0x08, 0x97, 0xf3, 0x44, 0x8a, 0x83, - 0xef, 0xa8, 0x68, 0x19, 0x50, 0x99, 0x95, 0x5d, 0x20, 0xf4, 0xe4, 0x25, - 0x81, 0x27, 0xbb, 0x9d, 0x13, 0x71, 0xda, 0x6e, 0xfc, 0xe5, 0xe2, 0x61, - 0xcd, 0x07, 0x10, 0x74, 0x5d, 0xa6, 0x5b, 0x6f, 0x23, 0xb9, 0xe3, 0x85, - 0xc1, 0xec, 0x73, 0xa7, 0xb9, 0x26, 0xab, 0x5b, 0x9b, 0xc6, 0x16, 0xef, - 0xfd, 0xf1, 0x9f, 0x1f, 0x58, 0x05, 0x8d, 0x07, 0x90, 0x0d, 0xb8, 0x68, - 0xab, 0x52, 0x15, 0x0b, 0x83, 0x65, 0xa6, 0x04, 0x85, 0xec, 0xed, 0xbe, - 0x45, 0x01, 0x3a, 0xb4, 0x8f, 0x47, 0x2b, 0xe2, 0xab, 0x92, 0xe2, 0x6d, - 0xd7, 0x44, 0x71, 0xee, 0xba, 0xe1, 0x4b, 0x8e, 0x05, 0xbf, 0xea, 0xe1, - 0x2a, 0x1d, 0x90, 0x18, 0xbc, 0xcf, 0xdd, 0x18, 0x18, 0x0c, 0x52, 0xec, - 0xf5, 0xfc, 0xe8, 0x5b, 0x20, 0x30, 0x20, 0xcb, 0x79, 0xc3, 0xa5, 0xa7, - 0x6b, 0x98, 0xba, 0x12, 0xbd, 0xb1, 0xd4, 0x7a, 0x2a, 0x6b, 0x4a, 0xeb, - 0xf4, 0x71, 0x88, 0xbb, 0xfe, 0x11, 0x92, 0xa0, 0x1d, 0x80, 0xd3, 0xff, - 0x67, 0xea, 0x0b, 0x1e, 0xe0, 0xf6, 0x59, 0x22, 0xb9, 0x7c, 0x80, 0x22, - 0x01, 0xac, 0x42, 0x0b, 0x5f, 0x23, 0x81, 0x6e, 0x99, 0x10, 0x64, 0x86, - 0x89, 0x70, 0x1a, 0x0d, 0x5b, 0xad, 0xde, 0x18, 0x54, 0x72, 0x7d, 0xde, - 0xfd, 0x5f, 0x19, 0x04, 0xb4, 0x99, 0xf9, 0x3e, 0x7d, 0xab, 0x5e, 0xd9, - 0x00, 0xb6, 0x69, 0xa5, 0xae, 0x0e, 0x28, 0xf3, 0x40, 0xa8, 0x7e, 0xc3, - 0x90, 0x47, 0xe3, 0x12, 0x95, 0x58, 0x7b, 0x2a, 0x73, 0x07, 0x87, 0x54, - 0xee, 0x74, 0x1a, 0x54, 0xf6, 0xc0, 0x52, 0x79, 0x50, 0xb9, 0x84, 0xd4, - 0x31, 0xde, 0x1c, 0xc4, 0x11, 0xce, 0x22, 0x8e, 0xcc, 0x4d, 0xd6, 0x5a, - 0x9f, 0x0b, 0x6b, 0x9b, 0xd5, 0x20, 0xe4, 0x2e, 0xa6, 0x03, 0x5e, 0x62, - 0xa9, 0x3e, 0xce, 0x34, 0xa5, 0xbe, 0xc0, 0x61, 0xa8, 0x3c, 0x54, 0x77, - 0x5d, 0xe0, 0x84, 0xb2, 0x2a, 0x7d, 0xcf, 0x20, 0x07, 0x25, 0x9b, 0x45, - 0x87, 0x92, 0xeb, 0xf4, 0x76, 0x8f, 0xff, 0x7a, 0x78, 0xb3, 0x89, 0x15, - 0xea, 0x81, 0x3e, 0xcc, 0x40, 0x33, 0xbe, 0xec, 0x4c, 0x90, 0x0e, 0x87, - 0x4f, 0x3b, 0x6b, 0xa0, 0x2b, 0xd5, 0x8e, 0x3b, 0x86, 0xa8, 0x40, 0x7a, - 0x46, 0x3a, 0x2c, 0xdd, 0x37, 0x8a, 0x04, 0x72, 0xe7, 0xee, 0xa4, 0x55, - 0x8d, 0x5d, 0xac, 0xa4, 0x2f, 0x86, 0x10, 0x56, 0x4a, 0xf2, 0xf7, 0x39, - 0x64, 0x71, 0xd3, 0x96, 0x1a, 0xcd, 0xa2, 0x3f, 0x0a, 0xe2, 0xc2, 0x34, - 0x5f, 0x56, 0x14, 0x80, 0x96, 0x95, 0x61, 0x14, 0x8e, 0xf4, 0x6a, 0xfc, - 0xdb, 0x4a, 0xf3, 0x4d, 0x5d, 0xae, 0x40, 0xa1, 0xec, 0x80, 0x1f, 0x34, - 0xd8, 0xbf, 0xef, 0x1e, 0x1c, 0x9b, 0xc3, 0x57, 0xb7, 0xe4, 0x85, 0x40, - 0x3e, 0x76, 0x50, 0x01, 0x00, 0xf7, 0x74, 0xe4, 0xd4, 0x84, 0x06, 0xdc, - 0x17, 0xee, 0x76, 0xb5, 0x84, 0x30, 0x7a, 0x1f, 0xd3, 0x91, 0x02, 0xd4, - 0xdd, 0xee, 0x32, 0xd0, 0x01, 0x53, 0x2b, 0x9f, 0x34, 0x26, 0xd4, 0xa2, - 0x72, 0x32, 0x41, 0xd9, 0x0e, 0xab, 0x4c, 0xde, 0x0a, 0x73, 0xb2, 0xf5, - 0xc3, 0xcb, 0x65, 0x9b, 0xdf, 0xbc, 0xc6, 0x1d, 0x1a, 0x2a, 0x31, 0x71, - 0xd3, 0xb1, 0x34, 0x4b, 0x8d, 0xdf, 0x91, 0xa0, 0xe1, 0xa2, 0xf7, 0x31, - 0x19, 0x6c, 0xd7, 0xe8, 0x04, 0xf1, 0x0f, 0x4c, 0x4e, 0x0f, 0xbf, 0xdc, - 0x26, 0x95, 0xaa, 0xe0, 0x96, 0x91, 0x5f, 0x6a, 0x3b, 0xa5, 0x80, 0xd1, - 0x02, 0x29, 0x40, 0x78, 0x8b, 0xbb, 0x0b, 0x0b, 0x00, 0x48, 0xd3, 0x00, - 0x9d, 0x57, 0x5d, 0xf4, 0xbf, 0x69, 0x85, 0x9c, 0xee, 0x3f, 0xdb, 0xd2, - 0x10, 0x9c, 0x5c, 0xd6, 0xfb, 0xd2, 0x62, 0xad, 0xb5, 0x03, 0xdb, 0x67, - 0xc6, 0xb3, 0x43, 0x02, 0x23, 0x38, 0x0e, 0xd5, 0xde, 0xa8, 0xdb, 0x7c, - 0x0a, 0x01, 0x9d, 0xdd, 0x90, 0x98, 0xe6, 0x67, 0x2a, 0x4d, 0x90, 0x1f, - 0x9a, 0x86, 0x41, 0xf4, 0x8c, 0x9c, 0x62, 0x04, 0xf9, 0x5a, 0xe6, 0x15, - 0x34, 0xf9, 0x9d, 0xae, 0x9e, 0x0a, 0x2c, 0x90, 0xc0, 0xd4, 0x87, 0x1a, - 0xea, 0x62, 0x7d, 0x53, 0x97, 0x44, 0xcc, 0x4b, 0xa1, 0xef, 0x14, 0x8f, - 0x79, 0xa6, 0x1d, 0xd5, 0x93, 0xcd, 0xc3, 0x4e, 0xad, 0x55, 0xf7, 0x48, - 0x90, 0x1d, 0xeb, 0x27, 0xfd, 0xdc, 0xd7, 0x3f, 0x9c, 0x26, 0x3b, 0x0e, - 0x60, 0xa0, 0x0b, 0xc9, 0xf3, 0x04, 0x6b, 0x94, 0x13, 0xf9, 0x29, 0x48, - 0x86, 0xcc, 0xc3, 0x53, 0x85, 0xf0, 0xc3, 0x02, 0x65, 0x4f, 0xdc, 0x54, - 0x54, 0x67, 0x5a, 0xd8, 0xd8, 0x31, 0x8d, 0xe1, 0x69, 0xe1, 0x74, 0x84, - 0xfd, 0xd9, 0x3d, 0xb8, 0x25, 0x40, 0x5a, 0x3b, 0x24, 0xcf, 0xa7, 0xaa, - 0x27, 0x27, 0x9c, 0x54, 0x81, 0x8d, 0xff, 0x89, 0x94, 0x69, 0x28, 0xb5, - 0xa1, 0xe4, 0xef, 0xea, 0x4c, 0x61, 0xfa, 0x75, 0x46, 0xe5, 0x3e, 0x5e, - 0xda, 0xee, 0x9e, 0x7d, 0x6a, 0x8b, 0x31, 0x06, 0x87, 0x2e, 0xa7, 0x5f, - 0x3d, 0xc3, 0xa8, 0x85, 0x48, 0x67, 0x88, 0x02, 0x0f, 0xcd, 0x06, 0x3f, - 0x50, 0x5d, 0xa6, 0xfa, 0x87, 0xfd, 0x7d, 0x46, 0x65, 0x98, 0xa3, 0x50, - 0x35, 0x51, 0xbf, 0x63, 0x81, 0x5e, 0x68, 0x2d, 0x73, 0xb7, 0x57, 0x3c, - 0xfd, 0x0b, 0x7f, 0xa9, 0x08, 0x84, 0x42, 0xd6, 0x22, 0x6d, 0xa7, 0x42, - 0x15, 0x81, 0xc6, 0x31, 0x51, 0xca, 0xee, 0x0b, 0x93, 0x46, 0xc3, 0x0c, - 0x19, 0xc5, 0xbc, 0x5a, 0xcf, 0xf9, 0x39, 0xc7, 0x7c, 0x25, 0x7c, 0x91, - 0x06, 0x79, 0xfc, 0x4b, 0x35, 0x7e, 0x00, 0x1f, 0x37, 0xf2, 0x52, 0x47, - 0xba, 0xca, 0x61, 0x1f, 0x4b, 0xc2, 0x82, 0x09, 0xd4, 0x53, 0x54, 0x23, - 0xcf, 0x90, 0xd6, 0xcc, 0xf7, 0x91, 0xc0, 0xde, 0x34, 0x32, 0xff, 0x0c, - 0xb0, 0xb1, 0xe9, 0xf5, 0xcb, 0xf0, 0x76, 0xb7, 0x6d, 0x21, 0x9d, 0x62, - 0x85, 0x7c, 0x83, 0xf2, 0x6e, 0x2b, 0x7a, 0xda, 0xa1, 0x97, 0xad, 0xa4, - 0x50, 0xf4, 0xc2, 0x03, 0x90, 0x57, 0xe9, 0xe5, 0x85, 0x8c, 0xee, 0x70, - 0xcc, 0x28, 0x3b, 0x1c, 0x11, 0x7d, 0x90, 0x37, 0x84, 0x97, 0xfc, 0x53, - 0x97, 0x3a, 0x18, 0xa9, 0xf5, 0x52, 0x9c, 0x3d, 0xb5, 0x37, 0x48, 0xd4, - 0xfb, 0x4a, 0xbb, 0xf4, 0xf8, 0x98, 0x37, 0x55, 0x25, 0x01, 0xaf, 0x87, - 0xe7, 0xb1, 0x4f, 0x8b, 0xde, 0x98, 0x67, 0x20, 0x7f, 0xe4, 0xba, 0xc7, - 0x93, 0xce, 0xc1, 0x78, 0x51, 0xb4, 0x62, 0x49, 0xed, 0xcc, 0x45, 0xec, - 0xe2, 0xde, 0xe9, 0x10, 0xce, 0xbe, 0xb9, 0x00, 0xe9, 0x1d, 0x4b, 0x2d, - 0x06, 0xba, 0xdd, 0xbd, 0x40, 0x40, 0xa5, 0xf1, 0x82, 0xa4, 0x53, 0x63, - 0x4b, 0x51, 0x4c, 0x6e, 0x41, 0x68, 0xb8, 0x0c, 0x26, 0xaf, 0xdf, 0xfa, - 0x35, 0x23, 0x38, 0x2c, 0x30, 0x88, 0x69, 0x6d, 0xbf, 0x91, 0xca, 0x85, - 0xf9, 0x12, 0x77, 0xd0, 0x18, 0x31, 0x32, 0x67, 0xd8, 0x5a, 0xde, 0xc3, - 0x7a, 0x30, 0xda, 0xc8, 0xc2, 0x95, 0xd1, 0x29, 0xe5, 0xc8, 0x75, 0x0d, - 0xac, 0xc2, 0x69, 0x06, 0xb8, 0x68, 0xa5, 0xa5, 0xf4, 0x78, 0xdb, 0xb4, - 0x5d, 0xbf, 0x0c, 0x9c, 0x8e, 0xa9, 0x84, 0xb3, 0x68, 0xc5, 0x7b, 0xc0, - 0x78, 0xae, 0xb2, 0x1f, 0xac, 0xdb, 0x30, 0x4d, 0x87, 0x6f, 0x28, 0x62, - 0xdd, 0x5f, 0xaa, 0xe0, 0x62, 0x18, 0xc0, 0x9b, 0x1c, 0x01, 0x26, 0x9a, - 0x5a, 0xbb, 0x38, 0xc7, 0xe9, 0xb8, 0xda, 0x0c, 0xcf, 0xf4, 0x89, 0xe4, - 0x03, 0xdc, 0x84, 0xa8, 0x80, 0xcb, 0xde, 0x61, 0xb7, 0xfd, 0x49, 0x6f, - 0x4d, 0xcc, 0x17, 0xce, 0x47, 0xd0, 0x02, 0x35, 0x68, 0x67, 0xcf, 0x29, - 0xac, 0x74, 0x64, 0x5f, 0x06, 0x1d, 0xc0, 0xfb, 0x25, 0xe6, 0x6b, 0xdd, - 0x46, 0x08, 0xee, 0x07, 0x7b, 0x2f, 0xcf, 0x71, 0xb8, 0xcc, 0xd7, 0x8b, - 0x7a, 0xd6, 0xbd, 0x9f, 0x04, 0x78, 0x9e, 0x7c, 0x81, 0xf7, 0x15, 0xdb, - 0x7f, 0x10, 0x31, 0x16, 0xd0, 0xca, 0x3b, 0x3a, 0x97, 0x1e, 0x3a, 0x54, - 0x85, 0x7c, 0x83, 0xf2, 0x6e, 0x2b, 0x7a, 0xda, 0xa1, 0x97, 0xad, 0xa5, - 0xb0, 0xf4, 0xc2, 0x03, 0x9e, 0x1c, 0xdb, 0xe5, 0xd9, 0x36, 0xc4, 0xba, - 0x9a, 0x73, 0x96, 0x35, 0x55, 0xd2, 0x1b, 0x0d, 0xfb, 0x96, 0x3d, 0x5c, - 0x3d, 0xcc, 0x0c, 0x7b, 0xa2, 0x16, 0x18, 0x27, 0xc0, 0x80, 0x28, 0x9d, - 0xed, 0x33, 0xb3, 0x94, 0x16, 0x8d, 0x7d, 0xb0, 0x0e, 0x0f, 0x18, 0xa2, - 0x72, 0xb1, 0x1f, 0xd4, 0xc8, 0x3c, 0x4e, 0x5e, 0x24, 0x83, 0x8b, 0xee, - 0xbe, 0x86, 0x35, 0xbe, 0x40, 0x67, 0x5d, 0xc4, 0x21, 0xa0, 0xe8, 0x53, - 0xd0, 0x25, 0x3b, 0x50, 0x23, 0x8a, 0x7d, 0xaa, 0xb5, 0x80, 0x0e, 0xeb, - 0x30, 0x7b, 0x8f, 0x61, 0xd6, 0x4e, 0xc0, 0xeb, 0x57, 0x58, 0x25, 0x60, - 0xc4, 0xbb, 0xc7, 0x37, 0x01, 0xcf, 0x25, 0x20, 0x4c, 0x27, 0x73, 0x8f, - 0x84, 0x89, 0x67, 0xff, 0xba, 0xe9, 0x9d, 0x28, 0x47, 0x2e, 0x55, 0x03, - 0x77, 0xd0, 0x8b, 0xb1, 0x0c, 0x52, 0xb7, 0x7e, 0x7e, 0x41, 0x29, 0xbc, - 0x7c, 0x14, 0x66, 0x5f, 0x29, 0x2a, 0x69, 0xce, 0xa7, 0xd1, 0x74, 0x98, - 0xc9, 0xd9, 0xa4, 0x06, 0xc6, 0xaa, 0xd7, 0x89, 0xbe, 0xa4, 0xbc, 0xc9, - 0x26, 0x07, 0x00, 0x6c, 0x60, 0x08, 0x8a, 0x7c, 0xef, 0xb2, 0xdf, 0x3d, - 0x6a, 0x45, 0xac, 0xad, 0xce, 0x0f, 0x6b, 0x2d, 0xda, 0xb2, 0x5d, 0xec, - 0x25, 0x62, 0xe7, 0xee, 0xda, 0x45, 0xdb, 0xc0, 0x2d, 0x20, 0xff, 0xe7, - 0x9d, 0x5a, 0x1d, 0x14, 0x73, 0xc5, 0xa6, 0x70, 0xf0, 0xa0, 0x38, 0x2f, - 0x72, 0x39, 0x14, 0xc9, 0x17, 0x84, 0xe3, 0x61, 0x83, 0xeb, 0x91, 0x63, - 0x86, 0x7f, 0x7e, 0x28, 0x15, 0x98, 0x82, 0x5f, 0xdb, 0x66, 0xb9, 0xc3, - 0x4a, 0x56, 0xf2, 0x79, 0x90, 0x50, 0x0e, 0x8e, 0x4d, 0x8c, 0x6d, 0x03, - 0x54, 0x08, 0x0b, 0xf6, 0x10, 0x97, 0xd4, 0x8e, 0x4d, 0xf8, 0xb0, 0x66, - 0x52, 0x5b, 0xb4, 0x67, 0x4e, 0x45, 0xd1, 0x9d, 0xa2, 0x3d, 0x5f, 0x47, - 0xdb, 0xcd, 0xaa, 0x04, 0xac, 0xa0, 0x2d, 0xa0, 0xd9, 0x81, 0xaf, 0x88, - 0x3e, 0xe8, 0x41, 0x06, 0xea, 0x91, 0x87, 0xf3, 0x0b, 0x5e, 0x90, 0xa0, - 0x8b, 0x00, 0x1a, 0x1d, 0xa5, 0x88, 0xa0, 0xef, 0xe1, 0xed, 0x98, 0x6d, - 0x55, 0xfc, 0xf1, 0x30, 0x98, 0x94, 0x4f, 0x41, 0xaa, 0xe2, 0x48, 0xef, - 0xbe, 0xf9, 0xc1, 0x8d, 0xda, 0xd9, 0x93, 0x0e, 0xae, 0x25, 0x1f, 0x4f, - 0x34, 0x48, 0xba, 0x80, 0xd9, 0xdd, 0x0c, 0x7b, 0x3f, 0x32, 0xaa, 0x7c, - 0xbc, 0x71, 0x89, 0x1e, 0x89, 0xc2, 0xdb, 0xc1, 0x7b, 0x0a, 0x89, 0x32, - 0xbb, 0xdc, 0x5a, 0x7f, 0xe3, 0x1f, 0xae, 0x77, 0x65, 0xa8, 0x43, 0xa2, - 0xc1, 0x7e, 0xa5, 0x09, 0x34, 0x76, 0xfc, 0x6b, 0xb5, 0x71, 0x5d, 0xcb, - 0x44, 0xba, 0x45, 0x0c, 0x55, 0x91, 0xa7, 0x4a, 0xc8, 0xc7, 0xc1, 0xb1, - 0x59, 0x70, 0x54, 0xc9, 0x95, 0x18, 0xb2, 0xbb, 0xd9, 0x0a, 0xc2, 0xfa, - 0x48, 0x2e, 0x10, 0x7e, 0x15, 0xec, 0xa7, 0x52, 0x59, 0x97, 0x39, 0xd3, - 0xd8, 0x1f, 0x23, 0xe3, 0x63, 0xe7, 0x21, 0x67, 0x65, 0x02, 0x5c, 0x8f, - 0xa8, 0x0f, 0x82, 0xf6, 0xe0, 0x57, 0xdf, 0x11, 0x0f, 0xff, 0x83, 0x8e, - 0x3a, 0xb5, 0x1c, 0x20, 0x6d, 0xb4, 0x70, 0xcc, 0x5e, 0x8e, 0xfc, 0x1d, - 0xa2, 0x65, 0x2e, 0x38, 0x31, 0xfa, 0x4b, 0x6d, 0xcd, 0x0c, 0xf1, 0xd8, - 0x79, 0x16, 0x12, 0xd6, 0x5d, 0x38, 0x1b, 0xa8, 0x52, 0xa7, 0xca, 0x9c, - 0x7a, 0x38, 0xda, 0xe2, 0x62, 0x1a, 0xa7, 0x7b, 0xf4, 0x15, 0x9c, 0x81, - 0xdf, 0x91, 0x47, 0x9c, 0x16, 0x16, 0xe5, 0x92, 0x9c, 0x9b, 0x9f, 0xd6, - 0x4c, 0x79, 0xdc, 0x59, 0x64, 0x10, 0xe7, 0xcf, 0xc7, 0x90, 0xf7, 0xbc, - 0xf2, 0x09, 0x41, 0x8c, 0x4d, 0x8e, 0x04, 0x30, 0xa2, 0xc8, 0x81, 0xea, - 0x30, 0xa2, 0xc1, 0x24, 0x3b, 0xb1, 0x50, 0xed, 0xb6, 0xaf, 0x87, 0x46, - 0xfb, 0xf5, 0xbc, 0x83, 0x76, 0xd0, 0x7f, 0xb7, 0xeb, 0xec, 0xa9, 0x85, - 0x68, 0xc3, 0x8e, 0x3f, 0x97, 0xb9, 0x44, 0x8e, 0x38, 0x25, 0xb4, 0xc3, - 0x3c, 0x4e, 0x37, 0x25, 0xae, 0xa3, 0x71, 0x12, 0x29, 0x3b, 0x82, 0xad, - 0x95, 0xf9, 0x96, 0x5a, 0xe3, 0x98, 0x7e, 0x5f, 0x34, 0xb2, 0xa9, 0x28, - 0x1a, 0x8c, 0x3c, 0x4e, 0xda, 0x4e, 0x75, 0x26, 0x5d, 0x69, 0x4f, 0x90, - 0xc1, 0xc6, 0xa7, 0x70, 0xa6, 0x5a, 0x9f, 0x1d, 0xeb, 0x45, 0x80, 0x8a, - 0xe9, 0x9b, 0x96, 0xff, 0xcb, 0x81, 0xe0, 0xa6, 0x20, 0x74, 0x0a, 0x9f, - 0xc0, 0x00, 0x73, 0x59, 0x63, 0xf7, 0x75, 0x09, 0x34, 0x0b, 0x50, 0x93, - 0xb1, 0xdf, 0xba, 0x17, 0xb6, 0x34, 0xfb, 0xf7, 0xe5, 0x21, 0x8d, 0xf4, - 0x69, 0xc8, 0x81, 0xb8, 0x36, 0x73, 0x82, 0x11, 0x55, 0x1c, 0xd8, 0x6c, - 0x00, 0x82, 0xdb, 0x2b, 0x85, 0xf9, 0xb0, 0xba, 0x60, 0x38, 0xc3, 0x6b, - 0x06, 0xdc, 0x65, 0x28, 0xd0, 0x0e, 0x5f, 0x80, 0xae, 0x20, 0x5a, 0x54, - 0xea, 0x27, 0xc4, 0x62, 0x67, 0xc7, 0x4a, 0xde, 0xa5, 0xb9, 0xa0, 0xaf, - 0x16, 0x5b, 0xa8, 0x37, 0x77, 0xe1, 0x10, 0x0e, 0xc5, 0xa9, 0xb2, 0x23, - 0xc7, 0x82, 0xea, 0xd0, 0xd1, 0xe4, 0x11, 0xc1, 0x6f, 0x12, 0xd8, 0x10, - 0x6b, 0x09, 0xb8, 0x20, 0x70, 0x16, 0xf9, 0xee, 0xc1, 0x05, 0xea, 0x24, - 0x6d, 0x3f, 0x54, 0x16, 0xc7, 0xcf, 0x7b, 0x91, 0x6c, 0x1d, 0x9e, 0x38, - 0x6d, 0xc4, 0x91, 0xf0, 0x0f, 0x68, 0x8b, 0xf0, 0xf8, 0xb4, 0xd5, 0x4e, - 0x33, 0x34, 0x37, 0xe1, 0x1f, 0x11, 0xc8, 0x14, 0xe0, 0xb7, 0x7d, 0x9d, - 0x56, 0x90, 0x51, 0x17, 0x98, 0xef, 0x17, 0x94, 0x79, 0x93, 0x99, 0x7d, - 0xc6, 0xe0, 0x42, 0x9a, 0xd7, 0x6e, 0x65, 0xca, 0xdd, 0xa0, 0xaa, 0xb7, - 0xe9, 0x3c, 0xdf, 0x6b, 0x8f, 0x96, 0xa2, 0x37, 0xe7, 0x6e, 0xd4, 0x3c, - 0x0f, 0x80, 0xdb, 0x1d, 0x2b, 0xcd, 0x6a, 0x0d, 0xdd, 0xa5, 0x8a, 0x15, - 0xdf, 0xf0, 0xa3, 0xa8, 0xf0, 0x12, 0x36, 0x7f, 0x41, 0x13, 0x0b, 0x3c, - 0x87, 0x8a, 0xb4, 0x45, 0x9b, 0xea, 0xa4, 0xfc, 0x40, 0xae, 0xd6, 0x41, - 0x1e, 0x78, 0xbd, 0x83, 0x03, 0xb4, 0xe8, 0x16, 0x92, 0xe5, 0x5d, 0x02, - 0xb8, 0x2c, 0x0b, 0x20, 0x0d, 0x1b, 0x16, 0xa4, 0x46, 0x63, 0x74, 0x32, - 0xb8, 0x58, 0x11, 0x9e, 0xad, 0x2c, 0xde, 0x2a, 0x3d, 0xbf, 0xf3, 0xfc, - 0x4c, 0x0c, 0xf9, 0x6c, 0xbc, 0x52, 0x7a, 0xfc, 0x31, 0x50, 0x1e, 0x63, - 0xc8, 0x0a, 0x4f, 0xe8, 0x75, 0x65, 0xab, 0x49, 0x06, 0x5c, 0x68, 0x89, - 0x77, 0x7c, 0x69, 0x74, 0x80, 0xdb, 0xa3, 0xc2, 0x59, 0x6b, 0x6b, 0xf7, - 0x24, 0x04, 0xeb, 0x6f, 0x0e, 0x54, 0x90, 0xcb, 0x38, 0x01, 0x12, 0x5d, - 0xe0, 0x88, 0x8d, 0x33, 0x09, 0xb4, 0xc8, 0x0b, 0x5d, 0xb7, 0x61, 0x5b, - 0x63, 0x02, 0x53, 0x3f, 0x39, 0xec, 0x6e, 0x35, 0xe3, 0xeb, 0xcd, 0x60, - 0x50, 0x3e, 0xaa, 0xac, 0xe4, 0x84, 0xf2, 0x7f, 0x8d, 0xd9, 0xcb, 0xcb, - 0xa2, 0xc6, 0x76, 0x79, 0xe0, 0xa7, 0x42, 0x51, 0x08, 0x9c, 0xbc, 0xe5, - 0x87, 0xdd, 0xc3, 0xbf, 0xaa, 0x65, 0x5c, 0xdb, 0xee, 0x79, 0xb2, 0xfa, - 0xd1, 0x23, 0x8e, 0x4f, 0x5a, 0x5b, 0xfb, 0xf3, 0x9d, 0x6b, 0xba, 0xc3, - 0x45, 0x23, 0xb3, 0xad, 0x3c, 0x25, 0x41, 0xb3, 0x9d, 0x25, 0x13, 0xa9, - 0x64, 0x04, 0x43, 0x33, 0xd8, 0x9e, 0xa4, 0x21, 0x24, 0x47, 0xc6, 0xcf, - 0xf1, 0x27, 0x80, 0xf6, 0x91, 0x2d, 0x0e, 0xe6, 0x9a, 0xf0, 0xb3, 0x87, - 0x15, 0xe2, 0x42, 0xb8, 0x1b, 0xd3, 0xa9, 0x31, 0xe7, 0x08, 0x8d, 0xc4, - 0x28, 0xe4, 0x92, 0x1b, 0x5a, 0xe1, 0xce, 0xde, 0xde, 0x94, 0x48, 0xaf, - 0x6d, 0xc8, 0xc8, 0xdf, 0x9c, 0x7a, 0xf0, 0x0f, 0x5d, 0xab, 0x1b, 0x32, - 0x22, 0x83, 0x88, 0xf4, 0x96, 0x66, 0xad, 0x7c, 0xd5, 0xc8, 0xfb, 0xa2, - 0x6b, 0x38, 0xa8, 0x1d, 0x3f, 0x58, 0x32, 0x09, 0xb7, 0x8d, 0x16, 0xdf, - 0x59, 0x4e, 0x56, 0x75, 0x50, 0xb7, 0x06, 0x9e, 0x11, 0x31, 0xc6, 0x3e, - 0xad, 0xb7, 0xb5, 0x9a, 0x5c, 0x36, 0x55, 0x3e, 0x95, 0x7b, 0x81, 0xf5, - 0x09, 0xd9, 0xbe, 0x4e, 0xc8, 0x99, 0x4d, 0x6d, 0x59, 0x62, 0x21, 0xc7, - 0x2b, 0x5f, 0xc4, 0x54, 0x49, 0x33, 0x0c, 0x41, 0x0f, 0x1c, 0x62, 0x32, - 0x0d, 0xd5, 0x8d, 0xc0, 0xd7, 0x8b, 0xaf, 0xac, 0x57, 0x6f, 0x1b, 0xdb, - 0x21, 0xf6, 0x29, 0x26, 0xbd, 0x2f, 0x54, 0x8f, 0xec, 0xc0, 0xd3, 0x55, - 0x0f, 0x3a, 0x16, 0xb9, 0x7d, 0xd7, 0x83, 0x31, 0x7c, 0x23, 0xa4, 0x01, - 0x24, 0x9d, 0x92, 0x62, 0x90, 0xf6, 0x9e, 0xef, 0x60, 0x49, 0x43, 0xc3, - 0xe5, 0x8b, 0x37, 0x8d, 0xfb, 0xf8, 0x3c, 0x20, 0x87, 0xae, 0x73, 0xa7, - 0xda, 0xda, 0xa8, 0xd2, 0x80, 0xf1, 0x1f, 0x48, 0x8b, 0x38, 0x18, 0xfe, - 0xa5, 0xdc, 0x95, 0xfc, 0x23, 0x1a, 0x87, 0x1a, 0xfd, 0xd6, 0x6f, 0x9b, - 0xf3, 0x5c, 0x03, 0x60, 0x51, 0x34, 0x7f, 0x3f, 0x41, 0xf6, 0x01, 0x2c, - 0x36, 0x54, 0x57, 0xf6, 0x32, 0xb5, 0x19, 0x49, 0x37, 0x6e, 0x1e, 0xf7, - 0x69, 0x94, 0x39, 0xf3, 0x45, 0x26, 0xea, 0x99, 0x79, 0xe8, 0x5f, 0x34, - 0xe5, 0x7f, 0x26, 0x9f, 0xf4, 0x17, 0x08, 0x79, 0x93, 0x3c, 0xfb, 0x4a, - 0xcc, 0x71, 0xbe, 0xdb, 0xe1, 0x16, 0x26, 0xc3, 0xb4, 0xff, 0x44, 0x0e, - 0x49, 0xcc, 0xb8, 0xe0, 0x27, 0x0f, 0x3c, 0x19, 0x91, 0xf5, 0x3f, 0xef, - 0x80, 0xd2, 0xe0, 0x3e, 0x67, 0xa1, 0x0b, 0x2f, 0x0a, 0x45, 0xa1, 0xc2, - 0xda, 0x03, 0x1c, 0xcb, 0xfa, 0x9d, 0x17, 0xb4, 0x4a, 0xc8, 0xe1, 0xc1, - 0xad, 0xec, 0xb7, 0x8a, 0xd8, 0x9e, 0xc1, 0x8e, 0xa3, 0x41, 0x93, 0x3e, - 0x8f, 0xed, 0xb7, 0x76, 0x9e, 0x5a, 0x9d, 0x3c, 0x5e, 0x02, 0xc2, 0x38, - 0x73, 0xdf, 0x24, 0x5d, 0x4b, 0xb9, 0xf9, 0xfc, 0xe0, 0x0b, 0xea, 0x40, - 0x2b, 0x4a, 0xf6, 0x91, 0x57, 0x51, 0xb3, 0x00, 0xa8, 0xbd, 0x70, 0x40, - 0xf1, 0x37, 0xc6, 0xac, 0x4a, 0x7a, 0xbe, 0x7a, 0xe3, 0x4a, 0xdc, 0xd9, - 0xd4, 0x54, 0x75, 0x74, 0x5f, 0xa7, 0x27, 0x61, 0x78, 0x60, 0x87, 0xae, - 0xdb, 0x51, 0x1f, 0x3a, 0x29, 0x6d, 0x94, 0x95, 0x68, 0xf1, 0x33, 0xf3, - 0x26, 0x9c, 0xac, 0xca, 0xce, 0x14, 0x8e, 0xa6, 0x11, 0x20, 0x1f, 0xd8, - 0xd6, 0x80, 0xc5, 0x1a, 0xd9, 0x6e, 0xc3, 0xc3, 0x85, 0x7c, 0x83, 0xf2, - 0x6e, 0x2b, 0x7a, 0xda, 0xa1, 0x97, 0xad, 0xa5, 0x80, 0xf4, 0xc2, 0x03, - 0x1b, 0x40, 0x7f, 0x8d, 0xd8, 0x65, 0xcf, 0x7c, 0xd6, 0xaf, 0xa3, 0xcc, - 0x63, 0x31, 0xf1, 0x61, 0x06, 0x3a, 0xf0, 0xc0, 0x1c, 0xea, 0xfe, 0x9b, - 0x3f, 0xc4, 0x7c, 0x84, 0x8d, 0xb9, 0x05, 0x8c, 0x5d, 0x7b, 0xcf, 0x81, - 0x34, 0x73, 0x88, 0xa9, 0x84, 0xe3, 0xbc, 0x55, 0x99, 0x80, 0x4e, 0xd6, - 0x05, 0x36, 0xbc, 0x5a, 0xb5, 0x1b, 0x58, 0xa1, 0xbd, 0x2a, 0xb7, 0x41, - 0xf3, 0x9f, 0xa8, 0xbe, 0xe4, 0x7f, 0x23, 0x6e, 0xb6, 0x04, 0xb0, 0xda, - 0xd9, 0xbd, 0x80, 0x22, 0x38, 0xbc, 0xf2, 0xe9, 0x98, 0x70, 0x12, 0x2d, - 0xfd, 0xee, 0xeb, 0xd0, 0x26, 0x6a, 0x3d, 0x64, 0xb4, 0xf1, 0x03, 0x32, - 0x0c, 0x64, 0x83, 0xef, 0x8c, 0x78, 0x04, 0xca, 0x96, 0xc7, 0xf2, 0xbc, - 0x54, 0x24, 0x0d, 0x74, 0xf7, 0x73, 0xab, 0xfb, 0x34, 0xd8, 0x16, 0xee, - 0x52, 0xe1, 0x2e, 0xbb, 0x86, 0x54, 0x2d, 0xe6, 0xb4, 0xff, 0x44, 0x0e, - 0x49, 0xcc, 0xb8, 0xe0, 0x27, 0x0f, 0x3c, 0x19, 0x91, 0xf4, 0xdf, 0xef, - 0xea, 0x48, 0xea, 0xd6, 0x06, 0xff, 0x90, 0x40, 0x81, 0x52, 0x51, 0x6a, - 0x18, 0x10, 0x62, 0x73, 0xd0, 0x54, 0x82, 0xee, 0xab, 0xdf, 0xb6, 0xec, - 0x37, 0x9f, 0x9b, 0x4c, 0xc5, 0x99, 0xb0, 0x51, 0xec, 0xe6, 0x15, 0xfe, - 0x87, 0x01, 0x1a, 0x86, 0x55, 0x0c, 0xbf, 0xac, 0x73, 0xe1, 0x97, 0x7a, - 0x30, 0xab, 0xe6, 0xbe, 0xb8, 0xbb, 0x2e, 0x3f, 0xe1, 0xcd, 0xd0, 0xc8, - 0x7d, 0xe3, 0xf1, 0xe3, 0x24, 0x7e, 0xdd, 0x71, 0xa5, 0xf8, 0x76, 0x6c, - 0x6c, 0xe9, 0xf9, 0xa9, 0x78, 0xa8, 0x8e, 0xba, 0xe3, 0x83, 0xb0, 0x74, - 0x52, 0x60, 0x90, 0xda, 0xd2, 0x6b, 0x3d, 0x99, 0x6d, 0xbd, 0x9d, 0x0c, - 0xa5, 0x84, 0xbd, 0x81, 0x42, 0x6c, 0x3b, 0xe5, 0xae, 0x81, 0x58, 0xa8, - 0xc3, 0x76, 0xe2, 0xc4, 0x38, 0x7f, 0x01, 0x7f, 0xd4, 0x18, 0xfe, 0xbc, - 0x7c, 0xba, 0x5a, 0x19, 0x6f, 0x9d, 0x84, 0x56, 0x4f, 0xbf, 0x69, 0xde, - 0x34, 0x13, 0x68, 0x3f, 0x9f, 0x01, 0xf9, 0x64, 0x40, 0x41, 0x6e, 0x64, - 0x83, 0x7d, 0x31, 0xf8, 0x3d, 0x18, 0x6f, 0xfd, 0x59, 0x8f, 0xb1, 0xa2, - 0x15, 0xc8, 0xaa, 0x26, 0xb9, 0x63, 0x79, 0x4d, 0xae, 0x59, 0xfe, 0x93, - 0xa1, 0x0f, 0xc9, 0xf7, 0xe9, 0x23, 0x7c, 0xea, 0x8e, 0x64, 0xa0, 0xfa, - 0x3d, 0x5c, 0x39, 0xa9, 0x3e, 0xdb, 0xdf, 0xa4, 0x4c, 0x2d, 0x1b, 0x00, - 0xca, 0x86, 0x7b, 0xc6, 0x45, 0x9d, 0x46, 0xa1, 0x1b, 0xee, 0xde, 0xb5, - 0xa8, 0x79, 0x71, 0x53, 0x31, 0x78, 0x0b, 0xc9, 0x72, 0x58, 0x5d, 0x93, - 0xed, 0xf3, 0x51, 0x72, 0xf3, 0x84, 0xda, 0xbe, 0x15, 0xf0, 0x4c, 0x18, - 0xd5, 0x6c, 0x23, 0x77, 0xc8, 0xb6, 0x1e, 0x39, 0xc0, 0x02, 0x58, 0x42, - 0xdc, 0x59, 0x70, 0xe9, 0x5a, 0x92, 0xe5, 0x49, 0x8c, 0x03, 0xe6, 0x42, - 0x82, 0x82, 0x86, 0xe5, 0x5b, 0x9c, 0xe1, 0x37, 0x49, 0x9f, 0xcc, 0x18, - 0x11, 0x26, 0x29, 0xa8, 0x70, 0x6c, 0x51, 0x87, 0x51, 0x2a, 0xc0, 0xe4, - 0x00, 0xbd, 0xfd, 0xf0, 0xab, 0x26, 0xe0, 0x2f, 0x6f, 0x22, 0x23, 0xb2, - 0x73, 0x21, 0x93, 0x53, 0xfa, 0x48, 0x66, 0x52, 0x50, 0x4f, 0x22, 0x84, - 0x7d, 0x6f, 0x34, 0x63, 0xb6, 0x39, 0x29, 0xaf, 0x4c, 0xe6, 0x4b, 0xdc, - 0x46, 0xa3, 0x0f, 0xaf, 0x18, 0xc0, 0xb8, 0xd3, 0xb9, 0xe7, 0x72, 0x63, - 0x7c, 0x7a, 0x77, 0x49, 0xa0, 0xeb, 0xa4, 0x68, 0x57, 0x19, 0x11, 0x50, - 0x31, 0x2e, 0x06, 0x0d, 0xfd, 0xbe, 0xc0, 0x0c, 0xac, 0x38, 0x2a, 0x15, - 0x1c, 0x45, 0x0f, 0xd6, 0x56, 0xd8, 0xd1, 0x42, 0x50, 0xda, 0x88, 0x84, - 0xc8, 0x0e, 0xda, 0x44, 0x64, 0xf2, 0x19, 0xf8, 0x6b, 0xd5, 0x9d, 0x8d, - 0x0f, 0xfa, 0xcd, 0x11, 0x5c, 0x82, 0xc9, 0x0e, 0xdd, 0xb6, 0xa6, 0xd4, - 0xcd, 0xe6, 0x73, 0xd0, 0x82, 0x8d, 0x8d, 0x56, 0x71, 0x44, 0x3a, 0x19, - 0x26, 0x2d, 0x08, 0x55, 0x80, 0xeb, 0x8f, 0xf4, 0x38, 0x0d, 0xe7, 0x47, - 0x89, 0x40, 0x79, 0xc4, 0x1c, 0xc6, 0x2c, 0xcb, 0x5c, 0xbd, 0x67, 0x87, - 0x7c, 0x01, 0x51, 0x8c, 0xec, 0x87, 0x28, 0x8a, 0x2c, 0xb7, 0xa8, 0x23, - 0xba, 0x0d, 0x1f, 0xfc, 0x07, 0xf7, 0xc1, 0xc8, 0x16, 0xf2, 0xa5, 0x10, - 0x1c, 0x9c, 0x3e, 0x22, 0x13, 0x3a, 0x50, 0x72, 0x55, 0x47, 0x99, 0x81, - 0x44, 0x2e, 0x02, 0x70, 0x0f, 0xbc, 0x13, 0x67, 0xe4, 0x89, 0xfb, 0x32, - 0xc5, 0x6f, 0x80, 0x78, 0x04, 0x2a, 0x56, 0x6e, 0x8a, 0xee, 0x47, 0xde, - 0xe6, 0x15, 0xfe, 0x45, 0xea, 0xf9, 0x18, 0xfd, 0xcc, 0x3d, 0xf7, 0x65, - 0x0b, 0xc4, 0xba, 0xca, 0x98, 0xc1, 0x82, 0x77, 0xb2, 0x73, 0x04, 0xcf, - 0x62, 0x01, 0xaa, 0x2a, 0x97, 0xf8, 0xee, 0x8d, 0x0e, 0x44, 0xc9, 0xdb, - 0x34, 0x28, 0xf5, 0x6c, 0x76, 0x32, 0xbd, 0xdd, 0x4d, 0x8c, 0xfe, 0x1f, - 0xc6, 0x4a, 0x25, 0xb6, 0xf6, 0x10, 0x1b, 0x8d, 0xc1, 0x4f, 0x2d, 0xc1, - 0x33, 0x3a, 0xae, 0xca, 0xb5, 0xa8, 0xda, 0xb4, 0xd9, 0xb4, 0x7e, 0xdb, - 0x0e, 0x9a, 0x97, 0xe3, 0xfa, 0x91, 0x09, 0x91, 0xe2, 0x7c, 0x95, 0xb7, - 0x2f, 0xe9, 0x7b, 0x89, 0x16, 0xea, 0xf7, 0xd4, 0xe7, 0x38, 0xe3, 0x6b, - 0x5d, 0x57, 0xff, 0xbd, 0x7f, 0xa1, 0x78, 0x9c, 0x8c, 0xa8, 0x12, 0xb4, - 0x95, 0x41, 0x1b, 0x3d, 0x79, 0x57, 0x9a, 0x6b, 0x87, 0x9d, 0xd7, 0x6a, - 0xa1, 0x68, 0x6c, 0x3e, 0x82, 0x2d, 0x21, 0x58, 0xea, 0x68, 0x80, 0x24, - 0x17, 0x8c, 0x9e, 0xbf, 0x7a, 0x0d, 0xaa, 0xdd, 0x83, 0x58, 0x82, 0x40, - 0x7c, 0xce, 0xde, 0xd5, 0xd0, 0x82, 0xda, 0x34, 0x34, 0x0f, 0x04, 0x67, - 0xf6, 0xa6, 0x4f, 0x1f, 0x00, 0xd2, 0xf4, 0xe2, 0x7c, 0x3f, 0x33, 0x2e, - 0x45, 0x4d, 0x67, 0x5f, 0x59, 0xbc, 0xac, 0x7c, 0x06, 0x1b, 0xa7, 0x5d, - 0x7f, 0x28, 0x9f, 0x4a, 0x27, 0x75, 0xba, 0xc0, 0x57, 0x0b, 0x07, 0x69, - 0x8f, 0x4a, 0x74, 0x8c, 0xd3, 0xe2, 0xf1, 0x1d, 0x0d, 0x2a, 0x16, 0x1e, - 0xe8, 0x19, 0xe0, 0x8d, 0x7d, 0x4a, 0xc4, 0x3e, 0xf2, 0xbc, 0x5b, 0x5a, - 0x22, 0x71, 0xac, 0xb9, 0x64, 0xe9, 0xc3, 0x94, 0x18, 0x20, 0xcb, 0x60, - 0x16, 0x55, 0xfa, 0x2c, 0x93, 0x73, 0x73, 0x03, 0xc1, 0x2f, 0xb6, 0x0e, - 0xc4, 0x9b, 0x64, 0x36, 0x7c, 0x00, 0x5f, 0x91, 0x56, 0x32, 0x11, 0xde, - 0x7a, 0xc3, 0x22, 0x3b, 0xc2, 0x99, 0x0c, 0x31, 0x27, 0x26, 0xc5, 0xbd, - 0xa1, 0xf0, 0x48, 0x2f, 0x25, 0x48, 0x8b, 0x97, 0x0e, 0xea, 0x36, 0x90, - 0x7b, 0x57, 0x6c, 0x05, 0xe2, 0xf4, 0x1c, 0x3c, 0x3e, 0xc0, 0x16, 0x5c, - 0xe1, 0x38, 0xcf, 0xce, 0x3e, 0x64, 0x2e, 0x05, 0xf6, 0xe9, 0x89, 0xaa, - 0xe8, 0xc3, 0x3e, 0x40, 0x9a, 0x22, 0xf9, 0x33, 0xaa, 0xf4, 0xdd, 0xc8, - 0xc1, 0x04, 0x13, 0x25, 0x12, 0x9f, 0xbc, 0xb7, 0x27, 0x1e, 0x69, 0x7c, - 0x02, 0x0f, 0x6e, 0x99, 0x4b, 0xf4, 0x8b, 0x53, 0xe7, 0xea, 0xed, 0x87, - 0x24, 0x97, 0x95, 0x56, 0x5c, 0xf1, 0xf4, 0x48, 0x9b, 0xb9, 0xbe, 0x82, - 0x54, 0x44, 0xbb, 0x77, 0xd9, 0x85, 0xef, 0xca, 0x1d, 0x20, 0x90, 0x2d, - 0x1a, 0xd8, 0x84, 0xc2, 0x58, 0x6b, 0xc7, 0xc1, 0x73, 0x67, 0x24, 0xb3, - 0x86, 0x9b, 0x9d, 0xab, 0x22, 0xf6, 0x68, 0xa7, 0xe6, 0xaf, 0x88, 0xf5, - 0x37, 0x58, 0x02, 0x45, 0xe5, 0x18, 0x2b, 0xac, 0xb3, 0x65, 0xeb, 0x3d, - 0xfe, 0x4d, 0x3c, 0xf0, 0xc5, 0x87, 0x80, 0x82, 0x80, 0xdc, 0x14, 0x80, - 0xfb, 0xe7, 0x6a, 0x14, 0x83, 0x27, 0x8d, 0x64, 0xf5, 0x0b, 0x3b, 0x2f, - 0xa3, 0x86, 0x4e, 0xf8, 0x22, 0x9c, 0xc9, 0x85, 0x53, 0x12, 0x76, 0x8f, - 0x14, 0xd4, 0x85, 0x71, 0xa0, 0xd5, 0xdd, 0xe7, 0xe3, 0xcb, 0xf0, 0x53, - 0x10, 0x43, 0xfb, 0x2f, 0x94, 0x01, 0xa5, 0x1d, 0xe0, 0x09, 0x53, 0x97, - 0x1d, 0x1c, 0x87, 0x5a, 0x7d, 0x24, 0x2d, 0x85, 0x9f, 0x26, 0x61, 0xe8, - 0xa7, 0xfa, 0x87, 0xca, 0x21, 0xa7, 0x22, 0x0f, 0xa1, 0xa3, 0x1b, 0x66, - 0x72, 0x31, 0xb3, 0xf0, 0xfc, 0xe9, 0xf6, 0xf1, 0xfd, 0xc2, 0xe5, 0xea, - 0x19, 0x66, 0x57, 0x69, 0x97, 0xc6, 0x19, 0xfd, 0x78, 0x9f, 0xca, 0x71, - 0x33, 0x11, 0xd6, 0x1c, 0x7c, 0x36, 0x35, 0x95, 0x17, 0x46, 0xfb, 0xd9, - 0xc2, 0xd6, 0xde, 0x73, 0xf5, 0x0a, 0x64, 0xea, 0xa7, 0x9e, 0x1a, 0xeb, - 0xdd, 0x54, 0xc2, 0x67, 0xa4, 0x39, 0x2f, 0xc7, 0x0f, 0x6d, 0xdc, 0xab, - 0x68, 0x34, 0x93, 0x12, 0x38, 0x76, 0xd3, 0xba, 0x57, 0x7b, 0xc2, 0xfe, - 0x41, 0x14, 0xc6, 0xc8, 0x39, 0x95, 0xa3, 0x5d, 0x88, 0xee, 0x60, 0x42, - 0x67, 0xde, 0x99, 0x96, 0xc8, 0x8b, 0xd5, 0x0c, 0x93, 0x81, 0x30, 0xcf, - 0x8c, 0x23, 0x1b, 0xe8, 0x87, 0x21, 0x98, 0x65, 0xdd, 0xc2, 0xe2, 0x67, - 0xfa, 0xe4, 0xda, 0xb6, 0x69, 0x61, 0x3a, 0x63, 0x9d, 0x82, 0x72, 0xfc, - 0xb7, 0xd5, 0xa3, 0xc4, 0x80, 0xca, 0x66, 0xda, 0xf3, 0x5e, 0x11, 0x56, - 0x5a, 0x63, 0x24, 0x4f, 0x95, 0x4d, 0x4e, 0xf6, 0x46, 0xbd, 0x6b, 0x7a, - 0x41, 0xc6, 0xaf, 0x68, 0x4b, 0xc8, 0xa5, 0xe0, 0x61, 0xae, 0xbe, 0x29, - 0x8f, 0xb5, 0xd8, 0x5c, 0xf0, 0x9b, 0x59, 0x75, 0x5f, 0xc0, 0x3c, 0x40, - 0x37, 0xa6, 0xc1, 0x75, 0xfb, 0x37, 0xb4, 0xf3, 0xc6, 0x87, 0x8c, 0x82, - 0xcf, 0x18, 0x0a, 0xd8, 0x0a, 0x76, 0x9e, 0x25, 0x45, 0x10, 0xa8, 0x2f, - 0x30, 0xf1, 0x9a, 0x19, 0xfc, 0xce, 0xe1, 0x11, 0x0b, 0x5b, 0x7e, 0xb7, - 0x78, 0x67, 0xeb, 0x18, 0x42, 0xe8, 0x56, 0x64, 0x64, 0xbc, 0x02, 0x55, - 0xc3, 0xe0, 0xf5, 0xd4, 0x1d, 0x5f, 0xfb, 0xf8, 0xdd, 0x72, 0xd1, 0x44, - 0xb8, 0xb4, 0x79, 0x99, 0x91, 0x91, 0xcc, 0xab, 0xb6, 0x64, 0xb4, 0xd8, - 0xc4, 0xde, 0x37, 0x59, 0xe3, 0x18, 0xa7, 0xed, 0x44, 0x48, 0x53, 0xfb, - 0xd8, 0x7c, 0xe5, 0xc5, 0x42, 0x44, 0xee, 0xe7, 0xa2, 0x3a, 0x55, 0xd6, - 0x8a, 0x30, 0x77, 0xa5, 0x13, 0x3e, 0x03, 0x57, 0x0a, 0x6a, 0xfc, 0xf8, - 0xb9, 0xfc, 0xd3, 0x6d, 0xb6, 0x16, 0x16, 0x6a, 0x34, 0xf4, 0xa1, 0x34, - 0xea, 0x5e, 0x03, 0xd1, 0xcc, 0x45, 0xc6, 0xe1, 0x1d, 0xc5, 0xa0, 0xb8, - 0x53, 0xb0, 0x9f, 0x96, 0x62, 0xd7, 0x21, 0xbc, 0x4b, 0x58, 0xe9, 0x3b, - 0xfa, 0x95, 0x34, 0x47, 0x8b, 0xe2, 0xc6, 0x09, 0x60, 0x61, 0x4c, 0x8c, - 0x91, 0xac, 0x97, 0x7a, 0x74, 0x25, 0xa4, 0xb9, 0xb7, 0xd5, 0x12, 0xfd, - 0xe0, 0x37, 0xae, 0xc8, 0x9c, 0x11, 0x50, 0x37, 0x31, 0x6b, 0xba, 0x9a, - 0x2e, 0x8c, 0x1e, 0x83, 0xd0, 0x1b, 0x91, 0x25, 0xd4, 0x33, 0x65, 0x70, - 0x39, 0x0b, 0xe9, 0x5b, 0x59, 0x01, 0xad, 0x2e, 0x26, 0x7f, 0x84, 0x42, - 0xe4, 0x04, 0x25, 0xdf, 0xf5, 0x0f, 0x3e, 0xe4, 0x32, 0x15, 0x54, 0xa9, - 0x15, 0x78, 0x95, 0x4b, 0x55, 0x9a, 0x9f, 0x5d, 0x90, 0xd4, 0x21, 0x31, - 0xd6, 0x36, 0x72, 0x18, 0xd2, 0x42, 0xcd, 0x3a, 0xa9, 0x81, 0xa1, 0x85, - 0x2c, 0x7c, 0xc4, 0xeb, 0x11, 0x37, 0x37, 0x4a, 0xd0, 0x1a, 0x1f, 0x7c, - 0xdd, 0x8b, 0x08, 0x6f, 0x5e, 0x5f, 0x6e, 0x82, 0x1d, 0x79, 0x84, 0xd7, - 0x8b, 0x4d, 0x25, 0xef, 0xc8, 0x2a, 0x52, 0x84, 0x17, 0x99, 0xa9, 0x20, - 0xa3, 0x39, 0xff, 0x5a, 0x43, 0x10, 0x9f, 0xb4, 0x08, 0x55, 0x8b, 0xc6, - 0xd8, 0x21, 0xe7, 0xd8, 0xbf, 0x7a, 0xea, 0x93, 0x23, 0x77, 0x02, 0xd1, - 0x48, 0x1b, 0x9c, 0xe0, 0x4c, 0xca, 0x91, 0x3c, 0x31, 0xcc, 0x81, 0x49, - 0x82, 0x08, 0xd6, 0x7c, 0xb4, 0x31, 0xf7, 0x02, 0xbf, 0xa1, 0xea, 0xc3, - 0x33, 0xce, 0x74, 0xeb, 0xf6, 0x5c, 0xfb, 0xde, 0xef, 0xa6, 0x07, 0xbf, - 0x04, 0x1f, 0xbb, 0x85, 0x5b, 0xab, 0xf4, 0xd0, 0x50, 0xf7, 0xda, 0xd8, - 0x2e, 0xd7, 0x27, 0xee, 0xd8, 0x59, 0xee, 0x51, 0x99, 0xb8, 0x0a, 0xb3, - 0xc7, 0x55, 0xfe, 0x05, 0x3e, 0x54, 0x9b, 0x4d, 0xbc, 0x09, 0x50, 0xb9, - 0x6f, 0x49, 0x31, 0x03, 0x3b, 0xd3, 0xfc, 0xda, 0x3c, 0xa8, 0x32, 0x84, - 0x31, 0xe6, 0x24, 0xec, 0x4e, 0xe0, 0x84, 0xe2, 0xb5, 0x78, 0x27, 0xc2, - 0xae, 0xd7, 0xbd, 0xbd, 0xda, 0xd1, 0x4b, 0xb2, 0x04, 0xa7, 0x92, 0x20, - 0x94, 0x4a, 0x93, 0xc9, 0x7d, 0x47, 0xa3, 0x97, 0x56, 0xa1, 0x49, 0x56, - 0x36, 0x89, 0x42, 0x5b, 0x91, 0x24, 0x58, 0xe7, 0x86, 0x41, 0x68, 0x20, - 0xb4, 0x34, 0xfc, 0x9f, 0xd9, 0x66, 0x8b, 0xc5, 0x0e, 0x55, 0x23, 0x68, - 0x0c, 0xb8, 0x15, 0x51, 0xaa, 0x9d, 0xf6, 0xd4, 0xb4, 0x96, 0x02, 0x98, - 0x69, 0x7e, 0x85, 0x92, 0x47, 0x52, 0x58, 0xbb, 0xea, 0x4d, 0x49, 0x26, - 0x1e, 0x45, 0x73, 0x54, 0xc2, 0x07, 0xa3, 0xbb, 0xdd, 0xf1, 0xf3, 0x50, - 0x59, 0xff, 0x7d, 0xaa, 0x02, 0x93, 0x31, 0xdb, 0x47, 0xe3, 0x4f, 0xe3, - 0xc0, 0xb0, 0x30, 0xed, 0xb8, 0xc6, 0x40, 0x2e, 0xa7, 0xce, 0xea, 0xd8, - 0x06, 0xe9, 0xd4, 0xec, 0x41, 0x2a, 0x0f, 0x8d, 0x71, 0x13, 0xb0, 0xb9, - 0xa0, 0x2f, 0xd0, 0x40, 0xad, 0x0a, 0xf2, 0xcf, 0x96, 0x5a, 0x9e, 0x9a, - 0x6a, 0x74, 0x87, 0x69, 0xc6, 0x5f, 0x6b, 0x12, 0x1a, 0x09, 0x34, 0xa5, - 0xfd, 0x3d, 0x05, 0xce, 0x3d, 0x4a, 0x96, 0x55, 0x7a, 0x95, 0x5b, 0xcc, - 0x15, 0xef, 0xd3, 0x25, 0x35, 0x7a, 0xb8, 0xd7, 0xd3, 0xe1, 0xb7, 0x54, - 0x2a, 0x94, 0x22, 0x89, 0x6e, 0x81, 0x79, 0xcb, 0xcd, 0xf9, 0x0b, 0x58, - 0x7c, 0x9d, 0x3f, 0x89, 0xc5, 0xae, 0xfb, 0x76, 0x50, 0xd1, 0x02, 0xfc, - 0x44, 0x65, 0x88, 0xfe, 0x93, 0x59, 0x76, 0x62, 0x50, 0x07, 0xc0, 0xa5, - 0x39, 0xca, 0x13, 0x40, 0xdf, 0x11, 0x50, 0xbb, 0x5f, 0x04, 0x02, 0x3a, - 0xa1, 0xb9, 0xda, 0xd7, 0xc2, 0x00, 0x8b, 0xdf, 0xaf, 0xb8, 0x41, 0xa2, - 0xb3, 0x97, 0x45, 0xaf, 0xe2, 0x81, 0x35, 0xe6, 0x05, 0x7e, 0x90, 0xf4, - 0xdc, 0xd9, 0x90, 0x5c, 0x9c, 0x40, 0xc2, 0x1d, 0x3e, 0x82, 0xce, 0x8c, - 0x37, 0x52, 0xf8, 0x93, 0xa3, 0xad, 0x1b, 0x05, 0x43, 0xac, 0xbc, 0x10, - 0x34, 0x0d, 0x47, 0xf3, 0x72, 0x76, 0x56, 0x38, 0x18, 0xc1, 0x8f, 0x13, - 0x72, 0x4f, 0xfc, 0xfd, 0x47, 0xe1, 0xc9, 0x46, 0xb4, 0x3d, 0x4f, 0x66, - 0xeb, 0x60, 0x73, 0x32, 0x6a, 0xe4, 0x07, 0x5c, 0x7c, 0xac, 0x46, 0x03, - 0xe1, 0x51, 0x1c, 0x8f, 0x04, 0x8a, 0x9d, 0x27, 0xd9, 0x11, 0xd3, 0xce, - 0xf5, 0xbd, 0xc1, 0x98, 0xbf, 0x1f, 0x1c, 0x06, 0x38, 0x2e, 0xab, 0xf1, - 0xe3, 0x70, 0xe5, 0xe7, 0xe9, 0x8a, 0x90, 0x2b, 0xe6, 0x00, 0x00, 0x7d, - 0x86, 0xa6, 0x22, 0x6c, 0xbc, 0xdc, 0x6b, 0x64, 0x1c, 0x98, 0xa7, 0x5f, - 0x67, 0xfe, 0x55, 0x76, 0xe9, 0x46, 0x8f, 0x63, 0x3b, 0x7e, 0xb5, 0xbe, - 0x67, 0xb7, 0xa2, 0x1e, 0xc7, 0xb1, 0xd3, 0x2f, 0x57, 0x83, 0x5e, 0x70, - 0x44, 0xa4, 0xa9, 0xe3, 0xe2, 0x45, 0xe7, 0x05, 0x0d, 0x5e, 0x91, 0xcc, - 0xc9, 0x7f, 0xda, 0xf5, 0x1c, 0x09, 0x7a, 0xa1, 0x5d, 0xab, 0x7d, 0xb1, - 0x75, 0xe6, 0x81, 0xf2, 0xce, 0xf0, 0x30, 0xed, 0xb9, 0x2e, 0x40, 0x2e, - 0xa7, 0xce, 0xea, 0xd8, 0x34, 0x98, 0x9e, 0xca, 0x3a, 0xd6, 0xb1, 0xf4, - 0xca, 0x79, 0x51, 0x41, 0x12, 0x41, 0x08, 0x09, 0x6c, 0x73, 0x19, 0x02, - 0xbd, 0x37, 0x9c, 0xb4, 0x68, 0x57, 0xe0, 0xee, 0xcd, 0x31, 0x10, 0x91, - 0x17, 0x06, 0x32, 0x28, 0x20, 0x61, 0xfe, 0xc8, 0x1b, 0x3d, 0xfb, 0xe0, - 0xbf, 0x4a, 0x2b, 0x40, 0xf6, 0x39, 0xa3, 0xfa, 0xf7, 0xb7, 0x53, 0x39, - 0x70, 0xe6, 0xd5, 0xcd, 0xc6, 0xa5, 0xd3, 0x9d, 0x76, 0x9b, 0xf8, 0xfd, - 0x88, 0xd1, 0x6d, 0xdd, 0x8d, 0xcf, 0xf9, 0x4c, 0x0c, 0x8c, 0xd6, 0x70, - 0xcc, 0x13, 0x9f, 0x31, 0x65, 0x3d, 0x91, 0x8c, 0xca, 0xc3, 0x1d, 0x8d, - 0x33, 0x82, 0xf1, 0xa9, 0xcc, 0x7b, 0x1f, 0x0c, 0x75, 0x6a, 0x45, 0x5b, - 0x57, 0x76, 0x1e, 0xbb, 0x1a, 0xb1, 0xf6, 0x3a, 0xba, 0x06, 0xba, 0x3c, - 0x16, 0x19, 0x63, 0x60, 0x7e, 0x3c, 0x14, 0x99, 0x98, 0x42, 0x60, 0xc6, - 0xd6, 0xa7, 0x81, 0x32, 0x7e, 0xcd, 0x0f, 0x73, 0x8a, 0x32, 0xe9, 0x24, - 0xbd, 0x67, 0xdc, 0x06, 0x38, 0x71, 0x87, 0xb6, 0x5d, 0x69, 0xea, 0xad, - 0x9d, 0x3e, 0xd7, 0x4e, 0x41, 0xc7, 0x88, 0x32, 0x20, 0xad, 0x06, 0xc6, - 0xbb, 0xce, 0x6c, 0x83, 0x8b, 0x32, 0xdf, 0xea, 0x79, 0x79, 0xd9, 0x6f, - 0xc2, 0x6e, 0x8f, 0x71, 0x89, 0xcd, 0x7a, 0xeb, 0x50, 0x64, 0x33, 0xb6, - 0xf6, 0x5c, 0xed, 0x1f, 0xfe, 0x0a, 0xf0, 0xed, 0x30, 0x63, 0x0c, 0x94, - 0xfa, 0xd1, 0x39, 0x85, 0x12, 0x00, 0x54, 0x27, 0xb2, 0x84, 0xb3, 0x47, - 0xea, 0x21, 0xa8, 0x42, 0x73, 0x09, 0x32, 0x24, 0xd0, 0x9c, 0xf7, 0xac, - 0x54, 0xb5, 0x24, 0x3a, 0x65, 0x73, 0x3d, 0xfd, 0xeb, 0x6b, 0x42, 0x0c, - 0x38, 0xd5, 0xe6, 0x0c, 0x51, 0xbb, 0xef, 0xa5, 0x9d, 0xf7, 0x6b, 0xbf, - 0x6e, 0x28, 0x78, 0xdb, 0x9c, 0xad, 0x8e, 0xd6, 0x28, 0x99, 0x1c, 0xce, - 0xa5, 0xa0, 0xf3, 0x5a, 0x5b, 0x02, 0x6a, 0x8e, 0xc5, 0x7b, 0x0f, 0xc7, - 0x1b, 0xda, 0xed, 0x7b, 0xca, 0xbd, 0x64, 0x70, 0xac, 0x8e, 0x96, 0xe2, - 0x79, 0x8b, 0xc3, 0xfe, 0x2f, 0x0a, 0xd2, 0x6c, 0xcb, 0x8b, 0x76, 0x7e, - 0x1b, 0x52, 0x0f, 0x05, 0x68, 0x05, 0x5c, 0x42, 0x6e, 0x10, 0x47, 0x31, - 0x24, 0xe3, 0x8e, 0xdb, 0xaf, 0x71, 0x7e, 0x8c, 0xe4, 0xfd, 0x13, 0x69, - 0x47, 0x89, 0xa8, 0xcd, 0xbd, 0xd6, 0x95, 0x42, 0x6f, 0x3a, 0xe6, 0xd5, - 0x52, 0x2c, 0x6d, 0xa4, 0xe9, 0x1a, 0xc7, 0x59, 0x4e, 0x5b, 0x9c, 0xf3, - 0xf2, 0x5b, 0xef, 0xa0, 0x16, 0x01, 0x4a, 0xde, 0xf8, 0x49, 0xb0, 0xb6, - 0x85, 0xf4, 0xf9, 0x0d, 0x58, 0xa2, 0xdf, 0x5a, 0x9b, 0x5a, 0x2f, 0x23, - 0xfa, 0xf1, 0xd6, 0xe0, 0xa5, 0x53, 0xf7, 0x52, 0x9e, 0xff, 0x0d, 0xc9, - 0xb7, 0x0a, 0x6c, 0xd1, 0xa1, 0xee, 0x2b, 0x82, 0xbd, 0x13, 0xf2, 0x40, - 0xcb, 0x5a, 0x5e, 0x45, 0x5e, 0xf2, 0xe4, 0xaa, 0xa0, 0xca, 0xd9, 0x86, - 0xa9, 0x16, 0xe9, 0x5d, 0x9c, 0x55, 0x11, 0x65, 0xea, 0xf1, 0x31, 0xc8, - 0xc6, 0x0f, 0x6c, 0xd9, 0xdf, 0x2c, 0xae, 0xee, 0x00, 0x72, 0xd1, 0xe7, - 0xa5, 0xc5, 0x39, 0x20, 0x01, 0x15, 0xe5, 0x48, 0x6f, 0xb5, 0x4e, 0xa6, - 0xdd, 0x78, 0x94, 0x88, 0x18, 0x10, 0x38, 0xfd, 0x49, 0x0c, 0x69, 0xe4, - 0x1f, 0x6f, 0x8c, 0x5d, 0xb8, 0x11, 0x55, 0x0b, 0x57, 0xf3, 0x28, 0x80, - 0xbb, 0x37, 0xf7, 0x43, 0x73, 0x36, 0x5d, 0x4b, 0x16, 0x5a, 0xd7, 0xbc, - 0x46, 0x08, 0x93, 0xf0, 0x41, 0xb2, 0x13, 0x6d, 0x87, 0xc1, 0x88, 0x0e, - 0x66, 0xf7, 0x0d, 0x32, 0x34, 0xff, 0xcd, 0x1d, 0x56, 0xd5, 0x86, 0x77, - 0x2c, 0x7d, 0x87, 0xd3, 0xbc, 0x3a, 0xf9, 0x52, 0xa3, 0x0a, 0x49, 0xd3, - 0xba, 0xa1, 0x35, 0xd9, 0x81, 0x4c, 0xa0, 0xb7, 0xbb, 0x83, 0x15, 0x63, - 0x2d, 0x28, 0x73, 0x12, 0xab, 0xc8, 0xcb, 0x43, 0xb7, 0x97, 0x44, 0xf2, - 0x20, 0x39, 0x4b, 0x53, 0x4c, 0x5a, 0x66, 0x07, 0x20, 0x99, 0x6b, 0xca, - 0xff, 0x24, 0x05, 0xfe, 0x1f, 0xe9, 0x51, 0x7b, 0xd9, 0x68, 0xa3, 0xf1, - 0x1c, 0x7c, 0xe0, 0xb7, 0x16, 0x80, 0xd7, 0xa2, 0xa2, 0x74, 0x53, 0x35, - 0x98, 0x7e, 0x6c, 0x76, 0x21, 0x60, 0xfe, 0x70, 0x8b, 0x7a, 0x07, 0x0b, - 0x1b, 0x2c, 0x12, 0x04, 0xa9, 0x55, 0x45, 0x4d, 0xa2, 0xed, 0x45, 0x56, - 0x98, 0x5a, 0xa2, 0xbe, 0x0e, 0xb0, 0x37, 0x12, 0x19, 0xba, 0x39, 0x19, - 0x7e, 0x71, 0x18, 0x0c, 0x08, 0x39, 0x32, 0xa0, 0x9a, 0x89, 0x88, 0x66, - 0x74, 0x82, 0x63, 0xf7, 0xad, 0xb9, 0xe9, 0x4e, 0x64, 0x83, 0x68, 0x8e, - 0xed, 0x4c, 0x92, 0x6e, 0x13, 0x12, 0x2a, 0x14, 0x4f, 0x70, 0x12, 0x2e, - 0x13, 0xf8, 0xc9, 0x37, 0x40, 0xaa, 0x50, 0x57, 0x1b, 0x10, 0xd1, 0x4d, - 0x58, 0x99, 0xd5, 0xa8, 0x8c, 0x83, 0x1a, 0x27, 0x60, 0x6e, 0xae, 0xfb, - 0xfd, 0xf9, 0x8f, 0x27, 0xbd, 0xe6, 0x15, 0xf1, 0xdb, 0x42, 0xca, 0x13, - 0x1c, 0x5a, 0xf0, 0xc0, 0x00, 0x6c, 0xaf, 0x7c, 0xa0, 0x9c, 0x74, 0x94, - 0xc1, 0x98, 0x71, 0x95, 0x8e, 0x2e, 0xd5, 0xe7, 0x1c, 0x52, 0x38, 0x57, - 0x6c, 0x59, 0x09, 0xd9, 0x67, 0x40, 0x29, 0xfc, 0x71, 0xb9, 0xc7, 0xe3, - 0x27, 0x72, 0x4f, 0x43, 0x07, 0x92, 0x27, 0x7b, 0xac, 0x1b, 0xdb, 0x85, - 0x63, 0xf8, 0x23, 0xb1, 0x69, 0xdd, 0x2b, 0x1b, 0xae, 0xf7, 0x80, 0x59, - 0x9e, 0xf3, 0x16, 0x2e, 0x6c, 0x88, 0x1c, 0xe2, 0x64, 0x7f, 0x1f, 0x98, - 0x39, 0x80, 0xe7, 0xfe, 0x0a, 0x54, 0x84, 0x06, 0xc9, 0x64, 0x83, 0x81, - 0x8a, 0x15, 0xdb, 0x2f, 0x80, 0x1a, 0xfe, 0xa0, 0x08, 0x7d, 0xf1, 0x1d, - 0x6c, 0xed, 0x58, 0x4f, 0xd0, 0x7f, 0x63, 0x3d, 0x05, 0x60, 0x35, 0x1b, - 0x55, 0x97, 0x64, 0x66, 0x6c, 0x6f, 0x5f, 0xd1, 0xac, 0xc8, 0xe7, 0xcf, - 0x70, 0x75, 0xd8, 0x8e, 0x4c, 0x0c, 0x70, 0x3d, 0x5b, 0xb9, 0x57, 0x77, - 0xfc, 0xe5, 0x59, 0xba, 0x80, 0x9a, 0xcc, 0x27, 0xc5, 0x83, 0xf5, 0x60, - 0x24, 0x6b, 0xdd, 0xa5, 0xd4, 0x93, 0x63, 0x3d, 0x1b, 0x0e, 0x48, 0x4d, - 0x1b, 0x05, 0xe6, 0xfe, 0x6c, 0x16, 0x13, 0xfe, 0xd0, 0xb6, 0xe2, 0xad, - 0xc4, 0x7c, 0x19, 0x94, 0x47, 0x8b, 0x70, 0xbb, 0x99, 0x9d, 0xea, 0xdd, - 0x35, 0x2e, 0xa2, 0x85, 0xdd, 0x45, 0x23, 0xf0, 0x31, 0xb6, 0x9d, 0xdb, - 0x74, 0xea, 0x6d, 0x92, 0x2f, 0x40, 0x66, 0xd2, 0x43, 0x0b, 0x5c, 0xe4, - 0xcf, 0x8c, 0x0b, 0xb4, 0xc9, 0xdf, 0xb6, 0x51, 0x42, 0x50, 0xa6, 0xd2, - 0x53, 0x06, 0x28, 0xdf, 0x49, 0x10, 0xcf, 0xbe, 0xaf, 0x32, 0xaa, 0x98, - 0xc7, 0x7e, 0xd5, 0x9b, 0xa4, 0xd8, 0x67, 0x76, 0x59, 0x2b, 0x7f, 0xa5, - 0x9d, 0xd2, 0xfa, 0x56, 0x6e, 0x4c, 0xf8, 0x0f, 0x0e, 0x0c, 0x91, 0x8d, - 0xc7, 0x9c, 0x0b, 0x90, 0x30, 0x7e, 0xe9, 0x3d, 0xf9, 0x0d, 0x37, 0x4d, - 0xcd, 0x98, 0x7c, 0xd9, 0x87, 0x3a, 0x14, 0x5d, 0xc5, 0x21, 0x45, 0x1e, - 0xc5, 0xdd, 0xea, 0x96, 0x3f, 0x17, 0xd4, 0x7f, 0xe4, 0xbc, 0x53, 0xb5, - 0xbb, 0x22, 0xe4, 0xf0, 0x5f, 0x07, 0x94, 0x0f, 0x2f, 0x50, 0x82, 0x3f, - 0xf2, 0x6e, 0xb4, 0xbb, 0x20, 0x3a, 0x49, 0x94, 0x06, 0xb0, 0xdf, 0x9d, - 0x2f, 0x17, 0xed, 0xae, 0x0e, 0x05, 0xdc, 0x07, 0x82, 0x86, 0x8f, 0x68, - 0x23, 0xb9, 0x2d, 0x9d, 0x22, 0xee, 0x12, 0x04, 0x9b, 0x82, 0x4a, 0x2b, - 0x2c, 0x48, 0xe0, 0x30, 0x0d, 0xbf, 0x9e, 0xbd, 0xaf, 0x2a, 0x29, 0x4e, - 0x1b, 0x14, 0xe4, 0xd8, 0x1c, 0x9c, 0xa3, 0xa9, 0x28, 0x89, 0x8b, 0x9c, - 0x9c, 0x1e, 0xa2, 0xdc, 0x57, 0xde, 0x30, 0xe0, 0x3a, 0x52, 0x46, 0x15, - 0xb2, 0xc6, 0x21, 0x36, 0x08, 0x75, 0x0c, 0x7d, 0x60, 0x5b, 0x6a, 0x5f, - 0xa0, 0x83, 0xd8, 0x3f, 0x50, 0xe9, 0x81, 0x2e, 0x55, 0x51, 0x32, 0x7c, - 0x18, 0x54, 0x71, 0xb0, 0xf8, 0xf1, 0xcc, 0x49, 0x85, 0xa5, 0x74, 0x50, - 0x8b, 0x90, 0x40, 0xab, 0x46, 0x57, 0x0b, 0x36, 0xc5, 0xd2, 0xf8, 0x78, - 0x93, 0xc1, 0x35, 0x32, 0x80, 0xfb, 0xee, 0x21, 0x40, 0x11, 0xab, 0xd8, - 0x02, 0xc6, 0x12, 0x5b, 0xf6, 0xd8, 0x30, 0x26, 0x25, 0xc2, 0xeb, 0x64, - 0x0d, 0xee, 0xd6, 0x06, 0x93, 0x44, 0xd0, 0x00, 0x80, 0xfa, 0xc5, 0xe3, - 0xf6, 0x2f, 0x5b, 0x50, 0xad, 0xc2, 0xf0, 0x6e, 0x3f, 0x01, 0x31, 0x29, - 0x9b, 0x00, 0x0a, 0x97, 0x29, 0xbc, 0xf1, 0x4a, 0x81, 0x57, 0x5f, 0xa6, - 0xdd, 0x8b, 0x2b, 0xdf, 0x05, 0xf5, 0x40, 0x2e, 0x42, 0xb3, 0x60, 0x69, - 0xaf, 0xd6, 0xfb, 0x39, 0xc0, 0xe4, 0x61, 0x8a, 0x2e, 0x3e, 0x12, 0x28, - 0x80, 0xe5, 0xec, 0x84, 0xcc, 0x99, 0x01, 0x65, 0x40, 0x2b, 0xa2, 0x89, - 0xf1, 0xe3, 0xe2, 0x54, 0xa1, 0x60, 0x97, 0x50, 0xfc, 0xb0, 0x37, 0x1b, - 0xe4, 0xf1, 0x6e, 0x66, 0x35, 0x77, 0x13, 0x0c, 0x61, 0xb7, 0xf4, 0x8b, - 0x77, 0x05, 0x84, 0xae, 0x69, 0xa7, 0x05, 0x4b, 0xb8, 0x78, 0x42, 0xc3, - 0xb9, 0xe1, 0xae, 0x11, 0xaf, 0x67, 0x55, 0x12, 0x14, 0x20, 0xe5, 0x2c, - 0x67, 0x9c, 0xa4, 0x48, 0xa3, 0x02, 0x6d, 0x0f, 0xd4, 0xce, 0x59, 0x34, - 0x9c, 0x09, 0xe5, 0x69, 0x77, 0x48, 0xfe, 0xf4, 0x19, 0x18, 0x58, 0x44, - 0xa8, 0xf2, 0xfd, 0xdf, 0x34, 0x1d, 0x05, 0x3c, 0x5c, 0x40, 0x11, 0xb5, - 0x4f, 0x8d, 0x28, 0x59, 0xfb, 0xc4, 0x63, 0xec, 0x79, 0x9f, 0x2e, 0x66, - 0xbd, 0xa7, 0x3a, 0xfe, 0x3c, 0x03, 0x1f, 0x10, 0x31, 0x8a, 0x5d, 0xc9, - 0x06, 0xa8, 0x43, 0x7c, 0x37, 0x1a, 0x70, 0xc0, 0x78, 0x8f, 0x4e, 0x4e, - 0xc1, 0x71, 0x3c, 0xe2, 0xba, 0x25, 0x98, 0x8c, 0x2a, 0x89, 0x01, 0x74, - 0x46, 0x17, 0x7d, 0x4a, 0x3f, 0xa4, 0x5b, 0xde, 0x9f, 0x31, 0xfe, 0x0c, - 0x3b, 0x38, 0xd2, 0xf1, 0xa9, 0x64, 0xa7, 0x0f, 0x2c, 0xaf, 0xcb, 0x8e, - 0x22, 0xa5, 0xfc, 0x3f, 0x79, 0xdc, 0x1b, 0x68, 0x22, 0xf0, 0x5f, 0x6c, - 0x5c, 0x73, 0x25, 0xb4, 0xe2, 0x66, 0xd6, 0x8c, 0x83, 0x4e, 0x89, 0x95, - 0xa8, 0xcc, 0xa7, 0xbd, 0xf8, 0x4b, 0xed, 0x20, 0x77, 0x80, 0xeb, 0x3a, - 0x3a, 0x8e, 0x43, 0x10, 0x28, 0x3d, 0xe3, 0xe8, 0x1d, 0xdc, 0xef, 0x49, - 0x09, 0xce, 0x75, 0x2c, 0x1c, 0x70, 0x4f, 0xe5, 0x2e, 0x1f, 0x4d, 0x58, - 0xc2, 0x30, 0xf0, 0x78, 0x2d, 0x24, 0x41, 0x2e, 0xdd, 0x63, 0xa0, 0x71, - 0x7c, 0x08, 0x5c, 0x0b, 0x9a, 0x8f, 0x82, 0xb0, 0x49, 0xbe, 0x02, 0xfe, - 0xce, 0xdf, 0x82, 0x2a, 0x5f, 0xdb, 0x9e, 0x44, 0xbb, 0xda, 0xb3, 0xbd, - 0xdc, 0xa8, 0x5c, 0x7d, 0xd7, 0xa6, 0x26, 0x50, 0xb5, 0xb7, 0x59, 0x9c, - 0x8f, 0x27, 0x7f, 0x9f, 0x3a, 0xa2, 0x5e, 0x3b, 0xd3, 0xbc, 0x57, 0x7d, - 0xa5, 0x9b, 0xcd, 0x26, 0xcf, 0x4b, 0xd1, 0x1b, 0xa4, 0x1f, 0xd2, 0x4c, - 0x9e, 0x1f, 0x72, 0x90, 0x8a, 0x6c, 0xf3, 0x2f, 0x6c, 0x07, 0x00, 0x59, - 0xe4, 0x87, 0x2b, 0xa9, 0xa2, 0x1b, 0x7e, 0x6e, 0x70, 0x1e, 0xb5, 0x44, - 0x36, 0xd9, 0xe5, 0xa1, 0x48, 0xec, 0x6e, 0x24, 0x5e, 0xb6, 0x1e, 0x55, - 0xe8, 0x26, 0x34, 0xb8, 0xdf, 0xc3, 0xf8, 0x85, 0x46, 0xe2, 0xab, 0xf7, - 0x31, 0x58, 0x03, 0xd0, 0x0f, 0xfc, 0x45, 0x52, 0x8c, 0x53, 0xd2, 0xff, - 0x94, 0x0e, 0xe8, 0x88, 0x81, 0x6d, 0xc7, 0x4a, 0xa2, 0xc2, 0x2a, 0x61, - 0x18, 0x4a, 0x6f, 0x02, 0x81, 0x8e, 0x68, 0x3e, 0x59, 0xb1, 0xcc, 0x84, - 0xaa, 0x34, 0xc0, 0x6e, 0x40, 0x45, 0xf1, 0x73, 0x5f, 0xbe, 0x03, 0xd1, - 0x29, 0x48, 0x7a, 0xf8, 0x95, 0x35, 0xec, 0xce, 0x3f, 0x81, 0xc7, 0xe5, - 0xac, 0x06, 0xe1, 0x54, 0x2f, 0x6a, 0xc9, 0x0e, 0xd4, 0xdc, 0x60, 0xfa, - 0x0c, 0x1e, 0x8c, 0x1e, 0x91, 0xed, 0x40, 0x18, 0xbd, 0x3c, 0x89, 0x54, - 0xd7, 0x85, 0x90, 0x6e, 0xa9, 0x4b, 0xdc, 0x00, 0x57, 0xf7, 0x5b, 0xb5, - 0x91, 0xc5, 0x5e, 0x99, 0x6c, 0x6a, 0xed, 0xc8, 0x9f, 0xd1, 0x24, 0xc2, - 0x06, 0x2e, 0xa6, 0x60, 0xc2, 0x3a, 0x46, 0xa8, 0xec, 0x43, 0xc8, 0x67, - 0x7d, 0x3f, 0x5d, 0x92, 0x02, 0x9f, 0x6c, 0xf1, 0x02, 0x5a, 0x47, 0xe0, - 0x66, 0xb0, 0xf2, 0x64, 0x33, 0x2a, 0x87, 0x7c, 0xcf, 0xf6, 0xd0, 0xe2, - 0xd5, 0x97, 0x11, 0x36, 0xef, 0x04, 0xd3, 0x40, 0x43, 0xf8, 0x29, 0x20, - 0x18, 0x21, 0x4c, 0x10, 0x6f, 0xa2, 0x01, 0x31, 0xcf, 0x17, 0x61, 0xf1, - 0xd1, 0xe6, 0x5e, 0x74, 0xea, 0xbb, 0xe1, 0x31, 0xa3, 0xf5, 0x7f, 0x44, - 0x21, 0x65, 0x2a, 0x2f, 0x77, 0x30, 0x11, 0x1d, 0xa9, 0xed, 0x96, 0xd9, - 0xde, 0xda, 0xcb, 0x5b, 0xef, 0xff, 0x1f, 0x2b, 0xc5, 0x20, 0x6d, 0x3e, - 0x6f, 0x95, 0x38, 0xd8, 0x41, 0x72, 0x17, 0x19, 0x65, 0x86, 0x9b, 0xb6, - 0xe4, 0x03, 0xc3, 0xad, 0x5a, 0xb2, 0x79, 0x17, 0x35, 0xb1, 0x39, 0xd9, - 0x11, 0xee, 0xb7, 0xce, 0x07, 0x77, 0x0f, 0x24, 0x50, 0xeb, 0x94, 0x82, - 0x7f, 0xd3, 0xd5, 0x51, 0xc6, 0x91, 0x09, 0x75, 0x04, 0x7c, 0xc6, 0x3a, - 0xf9, 0xd3, 0xf5, 0xcc, 0xc3, 0x92, 0xb8, 0x27, 0x01, 0x6b, 0x88, 0x15, - 0x2d, 0x49, 0x90, 0xbb, 0x81, 0x36, 0xd9, 0xa9, 0xf5, 0x61, 0xc1, 0xc6, - 0x11, 0xb7, 0xd1, 0xaa, 0x8a, 0x84, 0x7a, 0x08, 0x9b, 0x5a, 0x26, 0xe4, - 0xb8, 0xe4, 0x8a, 0x7b, 0x10, 0x95, 0xe3, 0x07, 0xd6, 0x67, 0x87, 0xbf, - 0xa4, 0xb5, 0x32, 0x1a, 0x65, 0xdb, 0xcf, 0x66, 0xfa, 0x9c, 0xb6, 0x78, - 0x51, 0x8a, 0x0d, 0xec, 0xaa, 0xa3, 0x7a, 0x72, 0xa1, 0xf3, 0x71, 0x59, - 0x1b, 0xde, 0x10, 0x84, 0xb9, 0xff, 0x0d, 0xca, 0xc9, 0xfb, 0x4a, 0x8b, - 0x45, 0x12, 0x4e, 0xb4, 0xaa, 0x42, 0xf2, 0xc8, 0x47, 0x2f, 0xd4, 0x2f, - 0x60, 0xb0, 0xce, 0x18, 0x25, 0xac, 0x81, 0xbc, 0x3a, 0x22, 0xdf, 0x45, - 0x59, 0x1b, 0xc5, 0x49, 0xea, 0x83, 0xba, 0x09, 0xee, 0x21, 0x84, 0x4b, - 0x22, 0x42, 0x2f, 0xd1, 0xcc, 0x56, 0x6a, 0x74, 0x75, 0x9d, 0x31, 0xb7, - 0x4b, 0xd2, 0x82, 0x08, 0x88, 0x78, 0x8e, 0x11, 0xd5, 0xc6, 0xa0, 0x55, - 0x04, 0xb7, 0x85, 0xf0, 0xbe, 0x20, 0xf6, 0x32, 0xf3, 0xa5, 0x27, 0x92, - 0xdd, 0x00, 0x44, 0x98, 0x15, 0x40, 0xbe, 0x60, 0xda, 0xf2, 0x25, 0x60, - 0x00, 0x4a, 0x4f, 0x93, 0x96, 0x8b, 0xb3, 0xa4, 0x76, 0x5c, 0x2d, 0x5b, - 0x5a, 0x67, 0x7f, 0xf7, 0xf2, 0x51, 0x05, 0x3f, 0x29, 0x87, 0xd5, 0x37, - 0x19, 0x9f, 0x67, 0xea, 0x54, 0x79, 0x00, 0x92, 0x95, 0x4f, 0x30, 0xd7, - 0xf6, 0x08, 0x6e, 0xac, 0x4a, 0xe1, 0xc5, 0xe5, 0xc2, 0x27, 0x5f, 0x8e, - 0x3b, 0x7c, 0xe5, 0x45, 0x61, 0xe8, 0x51, 0x96, 0xd1, 0xaa, 0xd1, 0xfa, - 0xdc, 0xd1, 0x62, 0x7c, 0xde, 0x84, 0x4b, 0xa4, 0xe2, 0x1c, 0x68, 0xd4, - 0xd7, 0x74, 0xe9, 0xe4, 0x51, 0x8f, 0x6f, 0xc2, 0xc3, 0xbc, 0x77, 0x98, - 0x5b, 0xb0, 0xd7, 0xb5, 0x23, 0xd0, 0xb1, 0x2c, 0xbf, 0x0c, 0x32, 0x1b, - 0x93, 0x62, 0xab, 0xb4, 0xb5, 0x62, 0xd3, 0x1d, 0x1f, 0x0d, 0x2b, 0xf2, - 0x14, 0x58, 0xf3, 0x63, 0x4d, 0xf1, 0x22, 0xa8, 0x51, 0x63, 0xea, 0x4a, - 0xd9, 0xda, 0x1c, 0x72, 0x06, 0x50, 0x75, 0xb2, 0x82, 0x6e, 0x6d, 0xe0, - 0xea, 0x1e, 0x64, 0x08, 0xf8, 0x0f, 0x94, 0xb8, 0xa8, 0x22, 0x29, 0xcf, - 0x4b, 0xa7, 0x11, 0xe3, 0x43, 0xcb, 0x3b, 0xac, 0x80, 0x66, 0x12, 0x75, - 0xff, 0x5e, 0x43, 0x1c, 0x61, 0x26, 0x6c, 0x4a, 0x13, 0x7e, 0x25, 0x5d, - 0x25, 0x95, 0xc0, 0xf9, 0xdd, 0x55, 0x2f, 0x36, 0xff, 0xdb, 0x68, 0xd8, - 0x96, 0xd1, 0x7a, 0x4b, 0xa4, 0x4d, 0x41, 0xe9, 0x71, 0xe1, 0x80, 0x5b, - 0x1d, 0xf6, 0x1f, 0x21, 0x6c, 0x99, 0xb6, 0x83, 0x08, 0x56, 0x3b, 0xeb, - 0xe5, 0x83, 0x40, 0xb1, 0x0a, 0x60, 0xe8, 0x32, 0xeb, 0x7e, 0x18, 0xdd, - 0xbd, 0x50, 0x51, 0x2f, 0xd8, 0x1b, 0x91, 0x5b, 0xcf, 0x6e, 0x7e, 0x6a, - 0x8f, 0xd0, 0xa5, 0x5a, 0xad, 0xcd, 0xfb, 0x05, 0x20, 0xbc, 0xf8, 0x96, - 0xdc, 0xf5, 0x0a, 0xb5, 0xde, 0xf6, 0xc2, 0x9d, 0x82, 0x9e, 0xeb, 0xbf, - 0x27, 0x24, 0x3b, 0xe7, 0x0c, 0x78, 0xb3, 0x6a, 0x93, 0xdd, 0xe7, 0x29, - 0xf4, 0xeb, 0xe0, 0x92, 0x07, 0xdb, 0xd7, 0x7f, 0xe1, 0x3e, 0xe1, 0x94, - 0xbd, 0x97, 0x2f, 0x18, 0x61, 0xcf, 0x30, 0xeb, 0x3c, 0x02, 0xd8, 0x13, - 0xf7, 0xd1, 0xf5, 0xaa, 0x53, 0xad, 0xd6, 0x9c, 0xe9, 0xed, 0x8d, 0x7b, - 0x72, 0xe7, 0xf8, 0xf3, 0xfd, 0xe5, 0xfd, 0x71, 0x10, 0x0b, 0x38, 0xc9, - 0x0c, 0x37, 0x23, 0x1b, 0x4c, 0xda, 0xc4, 0x8d, 0x09, 0xbb, 0x6c, 0x45, - 0x07, 0x16, 0x04, 0x65, 0xa1, 0x11, 0x55, 0x3d, 0xa4, 0x20, 0xda, 0x94, - 0xb7, 0x80, 0xda, 0x24, 0xd3, 0x11, 0xc9, 0xa7, 0x90, 0x19, 0x98, 0xc9, - 0x5a, 0x0d, 0x5d, 0xd4, 0xf0, 0x2f, 0x93, 0x15, 0x78, 0xa8, 0xfd, 0x3a, - 0x30, 0x4f, 0x03, 0xcc, 0x01, 0x45, 0x79, 0x53, 0xe4, 0x49, 0x56, 0xc8, - 0xf3, 0x75, 0x5f, 0x12, 0x3f, 0x68, 0x55, 0x70, 0xf7, 0x65, 0xdb, 0xb2, - 0x04, 0x96, 0x54, 0xd4, 0x86, 0x0d, 0x95, 0xb2, 0x82, 0x6c, 0x58, 0x35, - 0xbd, 0xef, 0x41, 0x70, 0xe7, 0xd4, 0x22, 0x27, 0x3e, 0x06, 0x7f, 0x17, - 0xe9, 0x9a, 0xe9, 0xf3, 0xd4, 0xb6, 0x50, 0x82, 0xef, 0xfe, 0x71, 0x42, - 0xc6, 0xad, 0x35, 0x72, 0x25, 0x73, 0x7a, 0x5a, 0x6b, 0x6c, 0xe6, 0x86, - 0x46, 0x3b, 0xf5, 0xa2, 0x49, 0xb3, 0x0b, 0xe1, 0x67, 0x2e, 0x65, 0x33, - 0x81, 0x5d, 0x40, 0x17, 0xbe, 0x27, 0xee, 0x36, 0xbf, 0xfb, 0x25, 0x7c, - 0x83, 0xcd, 0x70, 0xfe, 0xf8, 0x7b, 0xa2, 0x90, 0x5d, 0x83, 0x50, 0xfb, - 0xa3, 0x0e, 0xe2, 0xb7, 0x12, 0xb8, 0x99, 0xb0, 0xb6, 0x12, 0x22, 0x18, - 0x6c, 0xdd, 0x9b, 0x05, 0x72, 0xd0, 0x92, 0xe6, 0x6e, 0x3b, 0x10, 0x38, - 0x2a, 0xa8, 0x2b, 0x50, 0xd8, 0x55, 0xf3, 0x3f, 0x91, 0xab, 0x8f, 0x9e, - 0xda, 0xb5, 0xcd, 0x18, 0xd3, 0x34, 0xaf, 0x6c, 0x7b, 0x25, 0xbb, 0x6a, - 0x51, 0x1b, 0x60, 0x92, 0xf9, 0x10, 0xcb, 0x28, 0x57, 0x7b, 0x73, 0xa1, - 0x70, 0x97, 0xbf, 0x6d, 0xe6, 0xf2, 0x35, 0x06, 0x3e, 0xc3, 0x64, 0xe5, - 0x00, 0x5f, 0xbf, 0x2c, 0xa7, 0x82, 0xcf, 0x3d, 0x0b, 0x79, 0xf3, 0x20, - 0x4c, 0xbe, 0x5e, 0xa6, 0xa1, 0x2a, 0xd3, 0x14, 0xd8, 0x04, 0x22, 0xe3, - 0x54, 0x62, 0xdf, 0x08, 0xa8, 0x24, 0xd1, 0x6d, 0x16, 0xca, 0x6f, 0x2f, - 0x70, 0x55, 0xb5, 0x63, 0xd2, 0x46, 0xf0, 0xc5, 0x52, 0x58, 0x33, 0xe8, - 0xa8, 0xe9, 0x8f, 0xc1, 0x9c, 0x90, 0x40, 0xd0, 0x0e, 0x8e, 0x6c, 0xc3, - 0x99, 0x36, 0xbc, 0xb7, 0x11, 0xdf, 0x24, 0xc0, 0xd9, 0x42, 0x4f, 0xc5, - 0x37, 0xd1, 0xe1, 0x7b, 0x0c, 0x5b, 0xfc, 0xff, 0x0e, 0x60, 0x87, 0xb5, - 0x9a, 0x42, 0x9b, 0x06, 0x6f, 0x22, 0xf3, 0x51, 0xc5, 0xd5, 0x62, 0x7b, - 0x2c, 0xd3, 0xcf, 0xf8, 0x0d, 0xe3, 0xe3, 0xfd, 0x43, 0x70, 0xce, 0xd0, - 0x95, 0xfc, 0x66, 0x1a, 0xcb, 0x18, 0x0e, 0x22, 0xb2, 0xc2, 0x96, 0x9e, - 0xa5, 0xb5, 0xa3, 0xbe, 0xa1, 0x3f, 0xa4, 0xdb, 0x8d, 0xae, 0xac, 0x86, - 0x10, 0x47, 0xcc, 0x44, 0x76, 0x89, 0x5e, 0xae, 0x6c, 0x1f, 0x1d, 0xaf, - 0x43, 0x97, 0xdc, 0x0a, 0xe2, 0x47, 0xb7, 0x77, 0xda, 0x0b, 0xec, 0xc9, - 0x58, 0x8d, 0x30, 0x96, 0x41, 0xf3, 0x14, 0x64, 0x7e, 0x72, 0x30, 0x2e, - 0x91, 0xda, 0x0a, 0x6a, 0xdf, 0x34, 0xae, 0x90, 0x54, 0x7d, 0xaa, 0x0f, - 0x98, 0x31, 0x7b, 0x36, 0xe6, 0x7e, 0xc2, 0x40, 0x90, 0xba, 0x47, 0x2c, - 0x56, 0x86, 0xc8, 0x1d, 0xd0, 0x12, 0xed, 0xe1, 0xf9, 0x79, 0x40, 0xa3, - 0x31, 0xe6, 0x6c, 0x61, 0x68, 0xd8, 0x18, 0x7e, 0xcb, 0xa5, 0xd4, 0x5a, - 0x30, 0x3e, 0x64, 0x49, 0xe8, 0x43, 0x85, 0x82, 0x96, 0xc0, 0x7d, 0xd4, - 0x2a, 0xac, 0xe4, 0x81, 0x6a, 0xa1, 0xac, 0x76, 0x04, 0x7b, 0x4a, 0x86, - 0xae, 0x57, 0x33, 0x34, 0xe6, 0x53, 0x74, 0x9b, 0x02, 0x36, 0x0c, 0x45, - 0xf2, 0x23, 0x9f, 0xb0, 0x0b, 0x1e, 0xc5, 0x78, 0x9f, 0xc6, 0x39, 0xc7, - 0x41, 0x08, 0x93, 0xdc, 0x46, 0x4d, 0x56, 0x7e, 0xae, 0x7d, 0xe9, 0xca, - 0x8b, 0xfb, 0x54, 0xcc, 0x62, 0xf0, 0x32, 0x3e, 0x96, 0xea, 0x2a, 0x27, - 0x7c, 0x30, 0x5f, 0xc6, 0xf7, 0xa1, 0x50, 0x67, 0xb2, 0xf3, 0x1d, 0xa1, - 0xad, 0x78, 0x6c, 0x3e, 0xea, 0x0b, 0x43, 0xca, 0xa1, 0x10, 0xf8, 0x43, - 0x73, 0x81, 0x01, 0xd0, 0x8c, 0x38, 0x7d, 0x4b, 0xf1, 0x3c, 0x51, 0xa7, - 0x51, 0x92, 0x88, 0x92, 0xc0, 0x79, 0xc7, 0x92, 0x0a, 0xd7, 0x68, 0xe2, - 0x17, 0x58, 0xc7, 0x3a, 0x87, 0xef, 0x7c, 0x67, 0x56, 0xbb, 0xcc, 0xdd, - 0xf8, 0xe9, 0x1b, 0x53, 0x2e, 0x57, 0xb3, 0x25, 0xc8, 0x42, 0x9d, 0xb3, - 0x2f, 0x78, 0x07, 0xf4, 0x57, 0xb9, 0x8e, 0x3d, 0xaa, 0x9b, 0x0b, 0x2f, - 0x79, 0xdc, 0x8a, 0x92, 0xbf, 0x2f, 0xd9, 0xa7, 0x08, 0xcf, 0xa6, 0x60, - 0x02, 0x57, 0x36, 0x0b, 0x28, 0x9f, 0x28, 0xa2, 0x5d, 0xe8, 0x10, 0x5b, - 0x3e, 0x65, 0x39, 0x35, 0x57, 0xc3, 0xbf, 0x1b, 0x90, 0x6b, 0xec, 0x1a, - 0x8d, 0x4c, 0x96, 0x5d, 0x99, 0xd9, 0x12, 0x34, 0xc1, 0xa1, 0xfe, 0xe4, - 0x47, 0x0c, 0xe0, 0x07, 0xb8, 0xb3, 0xbb, 0x81, 0x28, 0x26, 0x2e, 0xc8, - 0x75, 0x81, 0xf8, 0xba, 0xd0, 0x44, 0xc5, 0x72, 0xc7, 0x7b, 0xc3, 0xe8, - 0x10, 0x3b, 0xd3, 0x83, 0x07, 0x3e, 0x95, 0x06, 0xe1, 0x1c, 0x32, 0x72, - 0x75, 0xb0, 0x25, 0x57, 0xb9, 0x1d, 0x0c, 0x6a, 0xf8, 0xa7, 0xb1, 0xfb, - 0x6c, 0xfa, 0x91, 0x6d, 0xfa, 0x14, 0xda, 0x6b, 0xb2, 0x7c, 0x0b, 0x59, - 0x6d, 0x39, 0x0e, 0x4a, 0x9d, 0x78, 0x74, 0xe8, 0x24, 0x55, 0x9b, 0x6a, - 0x0b, 0xd4, 0x8f, 0xab, 0x16, 0xd4, 0xdd, 0x34, 0xed, 0x24, 0x02, 0x5f, - 0x1c, 0xea, 0x68, 0xde, 0x3f, 0x52, 0xfb, 0x00, 0x06, 0x3b, 0x38, 0xf8, - 0x45, 0x3b, 0xb1, 0xeb, 0x2e, 0xf6, 0xfd, 0xa4, 0x27, 0x0a, 0x7e, 0x8d, - 0x46, 0xcc, 0x78, 0xd3, 0x68, 0x9a, 0x81, 0x98, 0xcf, 0xc7, 0x11, 0xa9, - 0x13, 0xd3, 0xab, 0x97, 0xeb, 0xa4, 0x2f, 0xda, 0xe4, 0x49, 0x0c, 0x65, - 0x47, 0x29, 0x14, 0xf1, 0x5f, 0xbe, 0xd8, 0x90, 0x29, 0x61, 0x9b, 0x9d, - 0x13, 0x20, 0x2b, 0x85, 0xd0, 0xcb, 0x22, 0x0e, 0xa8, 0x1a, 0x90, 0xae, - 0xf4, 0xb7, 0x56, 0x73, 0xc4, 0xc3, 0xe2, 0x78, 0xe9, 0x1f, 0x27, 0x7e, - 0x14, 0x54, 0xf9, 0x78, 0x89, 0x54, 0x2d, 0x41, 0xa3, 0xee, 0x22, 0x53, - 0x6b, 0xdd, 0xd2, 0xbe, 0x6c, 0x61, 0x4c, 0x46, 0x15, 0xd1, 0x8c, 0xad, - 0x49, 0x81, 0xa4, 0x1c, 0x6e, 0x67, 0xdd, 0xe8, 0x41, 0x4c, 0x48, 0x05, - 0x63, 0x67, 0xa9, 0x24, 0x77, 0xb3, 0x50, 0xb2, 0x35, 0x39, 0x73, 0xcb, - 0x44, 0x62, 0x7d, 0x28, 0x6f, 0xee, 0xf4, 0x0b, 0x0b, 0x14, 0x38, 0xcd, - 0x39, 0xf8, 0xf0, 0x9e, 0x85, 0x17, 0x07, 0xbf, 0xb7, 0x82, 0xd9, 0x24, - 0x39, 0xed, 0xab, 0x22, 0xbe, 0x31, 0x43, 0x0a, 0x6c, 0x58, 0x2a, 0x99, - 0x9e, 0xf3, 0x6d, 0x96, 0x0a, 0x0f, 0xb6, 0x25, 0x99, 0x46, 0xed, 0x76, - 0x95, 0xc4, 0x96, 0x9c, 0x54, 0x3d, 0x79, 0x83, 0xe6, 0xf6, 0x94, 0xad, - 0x67, 0x4f, 0x8e, 0x61, 0x1f, 0x5a, 0x40, 0x38, 0x07, 0x64, 0xd4, 0x06, - 0x93, 0x1c, 0x08, 0x4c, 0x23, 0x6d, 0x2b, 0x8f, 0xed, 0xa5, 0x2f, 0xdc, - 0x2c, 0x17, 0x7e, 0x94, 0x9c, 0x68, 0x9a, 0x59, 0xc8, 0x8c, 0x92, 0x29, - 0x87, 0xd4, 0x2b, 0x56, 0x8a, 0xfe, 0x37, 0xad, 0x01, 0x51, 0x9e, 0x13, - 0x70, 0xf5, 0x3d, 0xaf, 0xac, 0xd1, 0x07, 0xad, 0x87, 0x85, 0xe3, 0x6d, - 0xa9, 0x9b, 0x91, 0x2c, 0x06, 0xd2, 0x7a, 0xfd, 0x35, 0xf8, 0xde, 0x52, - 0x70, 0x22, 0x4b, 0xe4, 0x5d, 0x71, 0x64, 0x3b, 0xde, 0x7c, 0x75, 0x2d, - 0xf1, 0x3b, 0xd8, 0x56, 0x7f, 0xbb, 0xee, 0xf9, 0xac, 0xc2, 0x4c, 0xd8, - 0x85, 0x54, 0x5a, 0x1a, 0xc3, 0x0b, 0x55, 0x99, 0xcb, 0x56, 0x13, 0x75, - 0xf4, 0x9b, 0xe1, 0xc3, 0x81, 0xa8, 0x03, 0xcd, 0x87, 0x7a, 0x82, 0xbb, - 0xc3, 0xb3, 0x7f, 0xaf, 0x58, 0x5e, 0x6e, 0xae, 0xab, 0x68, 0xaf, 0x37, - 0x8c, 0x97, 0xbc, 0xd0, 0x13, 0x44, 0x25, 0x28, 0xe3, 0x22, 0x26, 0xc1, - 0x93, 0xb8, 0x57, 0x12, 0xe5, 0x79, 0xd0, 0xf9, 0x27, 0xda, 0x88, 0x5b, - 0x45, 0xe1, 0x90, 0x56, 0x20, 0xa1, 0x27, 0x52, 0xae, 0xcc, 0xcc, 0xa3, - 0xcf, 0xad, 0x58, 0xd8, 0x95, 0x22, 0x45, 0x18, 0xdc, 0xd9, 0x72, 0x81, - 0x8c, 0x3d, 0xfb, 0xc6, 0x6a, 0xf6, 0xcf, 0x87, 0x7d, 0xe2, 0x4d, 0xc1, - 0x27, 0x00, 0x2f, 0xd0, 0x1c, 0xa2, 0xd1, 0xaa, 0xd9, 0x7c, 0x6a, 0x1d, - 0xd1, 0x5e, 0x94, 0x57, 0xc0, 0xcf, 0xb8, 0x82, 0xcf, 0x91, 0xa7, 0x9e, - 0x93, 0xd8, 0xa1, 0x8d, 0xe3, 0x44, 0x9a, 0x38, 0x1b, 0xf7, 0x24, 0x45, - 0x2d, 0xc3, 0xa9, 0x39, 0xb2, 0x7d, 0x7d, 0x84, 0x36, 0xd7, 0x81, 0xe4, - 0xb6, 0xda, 0xad, 0xba, 0x2d, 0x2b, 0x82, 0xf0, 0xa3, 0xd4, 0x23, 0x0d, - 0xd6, 0x39, 0x78, 0x2e, 0xa0, 0x0f, 0x00, 0x5f, 0xf8, 0x1a, 0xe1, 0xc3, - 0xc2, 0x59, 0xdd, 0x95, 0xba, 0x2a, 0x50, 0x3c, 0x44, 0x51, 0xbe, 0x8c, - 0xd7, 0xe8, 0x2a, 0xf2, 0x8f, 0x5d, 0x52, 0x3b, 0xf3, 0xb7, 0xbe, 0x03, - 0x8c, 0x78, 0x8b, 0xfa, 0xa7, 0xf9, 0x2a, 0x7f, 0x26, 0x01, 0xef, 0xa4, - 0x3a, 0x51, 0xdf, 0x0e, 0xfb, 0x3c, 0x84, 0xe1, 0xba, 0x94, 0x46, 0x86, - 0x58, 0xc6, 0xd1, 0x46, 0xcd, 0x48, 0x26, 0xbf, 0x2a, 0xfe, 0xca, 0x05, - 0x7e, 0xe4, 0x1f, 0xc0, 0x1e, 0x04, 0x37, 0xd4, 0x61, 0xc2, 0xa5, 0xdc, - 0x49, 0x8f, 0x87, 0xab, 0x5e, 0xc0, 0x84, 0x2b, 0x7a, 0x50, 0x36, 0xdc, - 0x99, 0xc4, 0xa8, 0x88, 0xa1, 0xb4, 0x53, 0xf2, 0xea, 0xc3, 0xb6, 0xbb, - 0xb3, 0x50, 0x58, 0x11, 0xe4, 0x3f, 0x6f, 0x51, 0x0b, 0x1e, 0xc1, 0x7e, - 0x37, 0x3c, 0x3b, 0x51, 0x1d, 0xe7, 0x3d, 0xe7, 0x82, 0x49, 0x02, 0x9e, - 0xd0, 0xff, 0xe1, 0x71, 0x28, 0x18, 0x17, 0x44, 0xe3, 0x73, 0xc8, 0x9c, - 0x81, 0xfe, 0x6f, 0x9d, 0x99, 0x77, 0x42, 0x3c, 0x39, 0x0f, 0x55, 0xd5, - 0x69, 0x6f, 0xf0, 0x08, 0x70, 0x81, 0x81, 0x16, 0x9c, 0x82, 0x70, 0x58, - 0xd7, 0x54, 0xf2, 0x96, 0xf6, 0x49, 0x54, 0xd8, 0xcb, 0xdc, 0x6c, 0x86, - 0x54, 0x1d, 0x90, 0x88, 0x0d, 0x9e, 0x0c, 0xdf, 0xb7, 0x6d, 0x99, 0x75, - 0x30, 0x1d, 0xf1, 0xfa, 0x02, 0x15, 0x9b, 0xea, 0x18, 0xf3, 0xd0, 0xa5, - 0x01, 0xcd, 0x18, 0x75, 0x01, 0xbc, 0x2a, 0xa7, 0x00, 0xba, 0x9a, 0x71, - 0xb7, 0x3c, 0x74, 0x31, 0x18, 0x88, 0xa8, 0x1a, 0x3c, 0x83, 0xb9, 0x1b, - 0x9c, 0x23, 0x3f, 0x59, 0xfb, 0xa1, 0x25, 0xa6, 0xc3, 0x4e, 0xfa, 0x7a, - 0xef, 0x88, 0x1f, 0x95, 0xdb, 0xcf, 0xcd, 0x53, 0x3c, 0xd1, 0x87, 0xe8, - 0xa7, 0x11, 0xce, 0xa3, 0xb7, 0x9f, 0xb8, 0xd5, 0x8c, 0x70, 0x80, 0xa7, - 0x2b, 0x35, 0xe0, 0x58, 0x65, 0x2f, 0xd6, 0xda, 0xee, 0x64, 0xad, 0x1f, - 0xbc, 0x2a, 0x4e, 0x88, 0x9b, 0x37, 0x9b, 0xd1, 0x72, 0x19, 0x0d, 0x60, - 0x09, 0xde, 0x4e, 0x9e, 0x87, 0x4c, 0xc2, 0x8c, 0x81, 0x5e, 0x1c, 0x67, - 0xbe, 0x7d, 0x06, 0x83, 0xcc, 0x1d, 0x02, 0x8e, 0xca, 0x2e, 0x6b, 0x6d, - 0xe9, 0xfa, 0xb8, 0x2e, 0x7a, 0xd4, 0xc2, 0x83, 0xea, 0xa5, 0xb1, 0x6d, - 0x54, 0xae, 0x0c, 0x06, 0x26, 0x41, 0xef, 0x7e, 0x0e, 0xb8, 0x9a, 0xb7, - 0x60, 0x8b, 0xd8, 0xf2, 0x5f, 0x5c, 0x43, 0x73, 0xe0, 0x94, 0x83, 0xe5, - 0xe9, 0x15, 0xb5, 0xdc, 0x89, 0x3c, 0x51, 0x5e, 0x7c, 0x80, 0x7c, 0xe7, - 0x7b, 0xed, 0x6c, 0xe7, 0x78, 0xed, 0x89, 0x6d, 0x2e, 0x62, 0x49, 0xc6, - 0xde, 0xf8, 0x17, 0x33, 0x69, 0xd9, 0x8f, 0x02, 0x5e, 0x4d, 0x13, 0xbf, - 0x6c, 0xe0, 0x8d, 0x91, 0x21, 0x8f, 0xdb, 0xd1, 0x5b, 0xb7, 0xe0, 0x11, - 0x15, 0x9b, 0xd5, 0xcd, 0x40, 0xc8, 0x42, 0x67, 0xeb, 0xd8, 0x58, 0x06, - 0x70, 0xd2, 0xbe, 0x3e, 0x96, 0xe7, 0x1f, 0xfd, 0x1b, 0x9f, 0x47, 0xd3, - 0x51, 0x95, 0x6d, 0x5b, 0xd6, 0x59, 0xd9, 0x96, 0xf8, 0xe5, 0x86, 0x7a, - 0xde, 0x17, 0xba, 0x97, 0x2b, 0x44, 0x8f, 0x86, 0xed, 0x92, 0x79, 0x66, - 0x53, 0xd9, 0x85, 0x19, 0x1b, 0xf0, 0x1c, 0x20, 0x09, 0xee, 0x8c, 0x18, - 0x27, 0x47, 0x0d, 0xd5, 0x99, 0x09, 0xf6, 0x5d, 0x74, 0xc0, 0x76, 0xa6, - 0xcb, 0x8d, 0xc9, 0x8d, 0x58, 0x62, 0xa5, 0x3f, 0x41, 0x02, 0x73, 0x6b, - 0xbc, 0x89, 0x46, 0x89, 0xe5, 0xe3, 0x3c, 0xa3, 0x6c, 0x01, 0xa2, 0xe7, - 0x7f, 0x4f, 0xd9, 0x0d, 0x45, 0x98, 0x5d, 0xbf, 0xbe, 0x9f, 0xaa, 0x2a, - 0xdd, 0x6a, 0x84, 0x8e, 0x42, 0xf3, 0xfe, 0x61, 0x97, 0x6e, 0x4f, 0xd9, - 0x59, 0xc5, 0x54, 0x66, 0xcd, 0x34, 0xf9, 0xaf, 0x5b, 0x8d, 0x64, 0x35, - 0x97, 0x4d, 0x27, 0x33, 0x49, 0x95, 0xc7, 0x16, 0x5d, 0x87, 0x94, 0xad, - 0x65, 0xbb, 0xcc, 0x70, 0xc5, 0x33, 0xca, 0x74, 0x27, 0x28, 0x4a, 0xca, - 0x54, 0xba, 0xa9, 0x26, 0x4d, 0x6b, 0xb1, 0x28, 0x48, 0xc0, 0x61, 0xe5, - 0x3b, 0x06, 0x53, 0x05, 0x8f, 0xa4, 0x2d, 0x10, 0x78, 0x43, 0x07, 0x10, - 0xaf, 0xc9, 0x5f, 0x86, 0x74, 0x7e, 0x0c, 0xef, 0xeb, 0xb4, 0x01, 0xbb, - 0x20, 0x17, 0xa9, 0xdc, 0x20, 0xc4, 0x76, 0xad, 0xdb, 0xe6, 0x3f, 0x58, - 0xba, 0xf5, 0x93, 0x8d, 0x51, 0xd7, 0xb7, 0xb3, 0xf6, 0x5a, 0xe8, 0x07, - 0xbb, 0x01, 0xfe, 0x6a, 0x4f, 0x58, 0x61, 0xb7, 0x7d, 0x3f, 0xc8, 0x55, - 0xc9, 0xb7, 0x0e, 0xc8, 0x4e, 0x65, 0x25, 0x8f, 0xff, 0xfa, 0x27, 0x8f, - 0x5a, 0x29, 0xf0, 0x0d, 0xdf, 0xff, 0x13, 0xea, 0xb2, 0x16, 0xc5, 0xfc, - 0xc0, 0x9c, 0xfd, 0x12, 0x13, 0x57, 0x81, 0x8b, 0x9a, 0x59, 0x9f, 0x3c, - 0x07, 0x6d, 0xb5, 0xf9, 0x58, 0xf2, 0x87, 0x36, 0x78, 0x22, 0x90, 0x4c, - 0xe0, 0x83, 0xf1, 0x26, 0xc7, 0x45, 0x01, 0xa4, 0x2d, 0x78, 0xab, 0x81, - 0x80, 0xb1, 0x1a, 0x16, 0x2a, 0x4e, 0x1e, 0x77, 0x91, 0xfb, 0xcb, 0xca, - 0xff, 0x57, 0x47, 0xb7, 0x50, 0x2f, 0x18, 0xa5, 0xd8, 0xc4, 0xbf, 0x2b, - 0x49, 0xce, 0x77, 0x2f, 0x6a, 0x44, 0x32, 0x1d, 0x73, 0x79, 0x05, 0xd4, - 0xd9, 0xf0, 0x3d, 0x52, 0x8a, 0xe1, 0x07, 0x5b, 0x0e, 0x58, 0x50, 0x65, - 0x2d, 0xee, 0xa6, 0x0e, 0x93, 0xd6, 0x36, 0x1d, 0x78, 0xeb, 0x7c, 0x43, - 0x89, 0x95, 0xde, 0x28, 0xcb, 0x2b, 0x5b, 0xe6, 0x17, 0xa5, 0xe9, 0x98, - 0x82, 0xe2, 0xdb, 0x8c, 0x20, 0xe7, 0x9c, 0x54, 0x1a, 0x8a, 0x14, 0xc3, - 0x0f, 0x84, 0xe1, 0xaf, 0x20, 0x24, 0xbc, 0x9b, 0x59, 0x0f, 0x56, 0x9a, - 0xd4, 0xae, 0x9c, 0x8d, 0x0e, 0xa5, 0x3b, 0xcc, 0x40, 0xe1, 0x53, 0xc3, - 0xab, 0xab, 0x58, 0x12, 0x61, 0xc3, 0x81, 0x69, 0xef, 0x64, 0xb0, 0x45, - 0xe5, 0xfc, 0xf3, 0xa6, 0x48, 0x68, 0xac, 0x23, 0x5f, 0x4d, 0xdd, 0x5d, - 0x6c, 0xb8, 0xf0, 0x12, 0x69, 0x32, 0x3c, 0x0c, 0x29, 0xec, 0x64, 0x73, - 0xc3, 0xba, 0x27, 0x4f, 0x19, 0x77, 0x92, 0x9a, 0xfe, 0x9e, 0x50, 0xac, - 0x6d, 0x66, 0x98, 0x91, 0x11, 0x16, 0xa2, 0xf0, 0xee, 0x7f, 0xca, 0x7c, - 0xf4, 0xae, 0x97, 0x7c, 0xb5, 0x1f, 0x6e, 0x8c, 0xad, 0xd9, 0xc4, 0xd6, - 0xda, 0xd4, 0xf2, 0x60, 0xb8, 0xb6, 0x2b, 0x55, 0xef, 0xf9, 0xd2, 0xf0, - 0xaa, 0x5a, 0x43, 0xa8, 0x80, 0xa8, 0x7e, 0xe0, 0xdf, 0xc0, 0xfe, 0x68, - 0xae, 0xbd, 0xdb, 0x70, 0xbd, 0x80, 0x16, 0xbe, 0x2b, 0x70, 0x04, 0xda, - 0x36, 0xda, 0xf1, 0x0f, 0x7e, 0x1a, 0xd1, 0xe9, 0x78, 0x4a, 0x12, 0x32, - 0x98, 0x7d, 0xf2, 0xa9, 0x0f, 0xc6, 0x0a, 0xcc, 0x35, 0x77, 0x5a, 0xc5, - 0x92, 0x5f, 0x03, 0xa5, 0x71, 0xda, 0x2d, 0x12, 0x74, 0x5e, 0x9a, 0xb8, - 0x68, 0x10, 0x0f, 0xa0, 0xa0, 0x18, 0x5f, 0xe8, 0xb1, 0x1d, 0x24, 0x1b, - 0x39, 0xb3, 0x3a, 0x37, 0xcb, 0x62, 0x25, 0xca, 0xe2, 0x98, 0x7c, 0x6f, - 0x8f, 0x0f, 0x6e, 0x0f, 0xa6, 0x8a, 0xdd, 0x39, 0xbc, 0x7c, 0x6c, 0x82, - 0x7c, 0xa2, 0xa1, 0x59, 0x41, 0x01, 0x8d, 0x58, 0x26, 0xc3, 0xed, 0x57, - 0x94, 0xec, 0xc3, 0xf6, 0x3c, 0xab, 0xec, 0x56, 0x53, 0x55, 0xd7, 0xdc, - 0xd8, 0xbd, 0x80, 0x36, 0xbc, 0xf7, 0x23, 0xe0, 0x90, 0x32, 0x4f, 0xd7, - 0x45, 0xd1, 0xf2, 0x49, 0xa6, 0xa5, 0x8b, 0x8b, 0xd0, 0x7b, 0x43, 0xf5, - 0xd9, 0x96, 0x7d, 0x61, 0xdc, 0xb3, 0xf3, 0x59, 0xed, 0x5e, 0x6f, 0x4f, - 0x95, 0xa9, 0x2f, 0xfa, 0x17, 0x57, 0x33, 0x36, 0x96, 0x4c, 0x9d, 0xdb, - 0xb1, 0xdb, 0x53, 0x85, 0x53, 0x8f, 0x98, 0x6a, 0x16, 0xe5, 0x96, 0x2f, - 0x9e, 0x9c, 0xe2, 0xb0, 0xb2, 0x6d, 0x9a, 0x0e, 0xa9, 0xd7, 0x6f, 0xf4, - 0x15, 0x19, 0x07, 0xaf, 0x37, 0xb1, 0xf6, 0x3c, 0xcb, 0x6f, 0xc6, 0xe7, - 0xd6, 0x0d, 0xf7, 0xfe, 0x40, 0x26, 0xfc, 0x71, 0x4a, 0xa4, 0x0e, 0xb1, - 0x65, 0xee, 0x7f, 0x89, 0x3c, 0xbe, 0xb3, 0x1e, 0x10, 0xf7, 0xc2, 0xa5, - 0x67, 0x55, 0x6e, 0x61, 0x92, 0x65, 0x7f, 0xf1, 0x29, 0x1c, 0x1d, 0x5f, - 0xfb, 0x81, 0x1f, 0x89, 0x92, 0xd1, 0xf0, 0x92, 0xb2, 0xc7, 0xa3, 0xc4, - 0x44, 0x08, 0x4a, 0x58, 0x9f, 0x04, 0x39, 0xac, 0x63, 0xf8, 0xa8, 0xc9, - 0xe4, 0xea, 0xaf, 0x61, 0x5e, 0xb3, 0xd4, 0x55, 0xb1, 0xcc, 0xff, 0x93, - 0x9a, 0x80, 0xea, 0xd1, 0xfa, 0x71, 0x15, 0x4c, 0x46, 0xed, 0x9c, 0x6d, - 0xc2, 0xb6, 0xee, 0xfa, 0x7e, 0x10, 0x01, 0xcb, 0xaa, 0x18, 0x3f, 0x34, - 0x50, 0xd5, 0xf1, 0x5d, 0x9e, 0xcc, 0x56, 0xc4, 0x94, 0x5e, 0x0b, 0x7d, - 0xdc, 0xee, 0x9e, 0xd3, 0x95, 0x6b, 0x59, 0x6c, 0xad, 0xa7, 0xc2, 0xfa, - 0xcb, 0x52, 0x5b, 0x6d, 0xe0, 0xef, 0x4d, 0x3d, 0x66, 0xc8, 0x7b, 0xdc, - 0xcd, 0xd6, 0x2d, 0x11, 0xda, 0x56, 0x6f, 0x36, 0x0d, 0x05, 0x0f, 0x75, - 0xb0, 0xc4, 0xae, 0x0c, 0xb2, 0x31, 0x73, 0x1c, 0xec, 0xa5, 0x58, 0xf1, - 0x81, 0xb7, 0xb2, 0x01, 0xf2, 0x6d, 0xb3, 0x3c, 0x0d, 0x15, 0x43, 0x5e, - 0x6f, 0x1c, 0xf8, 0xb8, 0xa7, 0x27, 0x4d, 0x1c, 0x67, 0x1c, 0x19, 0x84, - 0xc0, 0x7f, 0x66, 0xde, 0x05, 0x76, 0x31, 0x12, 0xaf, 0xcb, 0x73, 0xdf, - 0xb9, 0xfe, 0x1b, 0x61, 0xb7, 0x11, 0x14, 0xdd, 0x93, 0x2a, 0x18, 0x10, - 0x56, 0x0a, 0xe1, 0x79, 0xbf, 0xad, 0xd2, 0xbf, 0x31, 0x62, 0x49, 0x69, - 0xeb, 0x18, 0xd2, 0xb9, 0x3e, 0xf8, 0x99, 0x07, 0x45, 0xb0, 0xac, 0x0a, - 0x46, 0x9a, 0xdf, 0x9c, 0xcd, 0x1c, 0x6b, 0x1e, 0x24, 0x97, 0xa0, 0x3d, - 0x8e, 0xa3, 0x45, 0xb9, 0xeb, 0x45, 0x9a, 0x70, 0x55, 0x78, 0xc5, 0x2d, - 0x11, 0x3b, 0x1c, 0xb7, 0x86, 0x55, 0xf0, 0x52, 0x9b, 0x15, 0x24, 0x05, - 0xa3, 0x1a, 0x27, 0x97, 0x07, 0xa6, 0x25, 0x15, 0xfa, 0x05, 0xc6, 0x3f, - 0x23, 0x68, 0xd7, 0x63, 0xca, 0x65, 0xb6, 0xb8, 0x7a, 0x72, 0x86, 0xc7, - 0xe2, 0x03, 0x0d, 0xc6, 0xa0, 0xb1, 0x61, 0x8c, 0x21, 0xdf, 0xc6, 0xc8, - 0x9c, 0xb3, 0x2f, 0xb8, 0x0a, 0x81, 0x25, 0x61, 0xd8, 0x81, 0x3c, 0xa6, - 0x73, 0xaf, 0x9f, 0xc7, 0x30, 0x78, 0xd4, 0x96, 0x5f, 0x5d, 0x87, 0xf8, - 0x89, 0x93, 0xb6, 0x89, 0x4e, 0xb3, 0x20, 0xce, 0xa1, 0x27, 0x7b, 0x07, - 0x44, 0x13, 0xae, 0x4e, 0xc8, 0xa5, 0xca, 0xe9, 0x05, 0x6e, 0x9e, 0x64, - 0x4e, 0x8f, 0x11, 0x72, 0xa1, 0x14, 0xf0, 0xab, 0x91, 0xbc, 0x80, 0xf0, - 0xee, 0x7a, 0x66, 0xa5, 0x88, 0xfa, 0xf9, 0xec, 0x2d, 0x64, 0x4e, 0x51, - 0x6e, 0xac, 0xe1, 0x4d, 0xfb, 0xd6, 0x76, 0xd4, 0xe5, 0xbc, 0x0e, 0x4e, - 0x16, 0x0d, 0x77, 0x1c, 0x08, 0x15, 0x8b, 0xfa, 0x50, 0xf4, 0x16, 0xa4, - 0x3e, 0xe2, 0x31, 0x70, 0xb8, 0xaa, 0xa8, 0xdb, 0xaa, 0xaa, 0x3c, 0xc5, - 0xfd, 0xae, 0x04, 0xd5, 0x30, 0xe6, 0xae, 0x0d, 0x49, 0x88, 0xd9, 0x28, - 0x4b, 0x95, 0x51, 0xba, 0x1a, 0xfc, 0x25, 0x7d, 0x80, 0x63, 0x5b, 0xfb, - 0x6b, 0x13, 0xfe, 0x84, 0x07, 0x3c, 0x99, 0x74, 0x32, 0x62, 0xa2, 0x34, - 0xee, 0xa1, 0xd4, 0xc9, 0x33, 0x7b, 0xf9, 0x5f, 0x26, 0xc7, 0x65, 0x57, - 0xce, 0xc1, 0x26, 0x44, 0x11, 0xd6, 0xdc, 0x49, 0xff, 0x5f, 0x6e, 0x49, - 0x3b, 0xd5, 0x6f, 0x12, 0xca, 0xa9, 0x89, 0x3b, 0xfd, 0xcf, 0x53, 0x6e, - 0xa6, 0xeb, 0xf3, 0x09, 0x66, 0xe9, 0x24, 0xf1, 0x3a, 0xa3, 0x2e, 0x86, - 0x7b, 0xe6, 0xc2, 0x6a, 0x26, 0xb8, 0x0c, 0x38, 0x5c, 0x6d, 0x31, 0xe1, - 0x13, 0x39, 0x9c, 0x3b, 0x45, 0xc7, 0xaa, 0xf4, 0x01, 0xaf, 0xa3, 0x8a, - 0x18, 0xc8, 0x31, 0x1d, 0x34, 0xe7, 0x56, 0x17, 0x30, 0x68, 0x66, 0xa1, - 0x8a, 0xb7, 0x27, 0x98, 0x29, 0xbd, 0x9d, 0x66, 0x2e, 0xfd, 0xdc, 0xda, - 0x02, 0xb5, 0xeb, 0xcd, 0x66, 0xb5, 0x18, 0xed, 0x6a, 0x70, 0x1c, 0xd6, - 0x62, 0x56, 0xd5, 0xf7, 0x9a, 0x17, 0x8d, 0xe3, 0x1a, 0xf1, 0xed, 0x22, - 0xe0, 0x19, 0x2f, 0x38, 0x3c, 0x7d, 0xf5, 0x5f, 0x35, 0xcd, 0x4e, 0x6a, - 0xfe, 0x90, 0x27, 0xeb, 0xf8, 0x0a, 0x67, 0xfc, 0x72, 0x7a, 0x00, 0x2f, - 0x59, 0x51, 0x18, 0x25, 0x1e, 0xc7, 0xec, 0xdf, 0xab, 0x4d, 0xb6, 0x1f, - 0x74, 0x2b, 0xa9, 0x03, 0x9e, 0x8a, 0xf6, 0x61, 0x75, 0x55, 0x5a, 0x50, - 0x9c, 0x1e, 0xc4, 0x23, 0x22, 0x11, 0xd2, 0xbb, 0xe9, 0x56, 0x82, 0xfa, - 0xa9, 0x25, 0x15, 0x82, 0xaa, 0x77, 0xdb, 0xe2, 0x5a, 0x1c, 0xbe, 0x08, - 0x30, 0x8d, 0x05, 0x4b, 0x8d, 0x5e, 0x39, 0x6b, 0x40, 0x58, 0x3c, 0x18, - 0x11, 0x42, 0x6a, 0x3a, 0x31, 0x3a, 0xf2, 0x10, 0xf1, 0xf0, 0x55, 0xdf, - 0xfb, 0x82, 0x3b, 0x12, 0x29, 0x7e, 0x32, 0x4d, 0x56, 0xbc, 0x82, 0x39, - 0xf3, 0xfd, 0x23, 0xe5, 0x22, 0x27, 0x8d, 0x05, 0x48, 0x92, 0xa7, 0x77, - 0x3a, 0x1f, 0x7c, 0xf3, 0x6f, 0xe7, 0xcd, 0x21, 0x9e, 0xdd, 0xcf, 0xd7, - 0x2e, 0x8c, 0x15, 0xc5, 0x83, 0x81, 0x1b, 0x72, 0xb0, 0x43, 0x1c, 0x8d, - 0x26, 0xaa, 0xbd, 0xf1, 0x22, 0x8b, 0xab, 0x96, 0xe1, 0x41, 0x56, 0x7d, - 0xca, 0x6d, 0xda, 0x3b, 0xd1, 0x25, 0x68, 0x21, 0xf7, 0xe1, 0x53, 0x84, - 0x92, 0x18, 0x9d, 0xb0, 0x00, 0xe5, 0x74, 0xf2, 0x4b, 0xa9, 0x82, 0x5d, - 0x4a, 0xd9, 0xe6, 0xcb, 0x08, 0x5c, 0xd7, 0x77, 0xa0, 0xe5, 0x81, 0x2d, - 0x90, 0x7a, 0x07, 0x23, 0x3b, 0x6c, 0x7f, 0xd3, 0x51, 0x57, 0x55, 0xff, - 0x3c, 0x95, 0xb8, 0xec, 0x90, 0x18, 0xd5, 0xb7, 0x19, 0x9f, 0x1b, 0xce, - 0xa8, 0xfc, 0xf1, 0x66, 0xa5, 0xe3, 0x1c, 0x6e, 0x64, 0x22, 0x61, 0xa9, - 0xd4, 0xc6, 0x48, 0xae, 0xf2, 0x88, 0x41, 0x4e, 0xc5, 0xfc, 0x2b, 0x44, - 0xa2, 0x18, 0x3b, 0xb4, 0xb5, 0x33, 0x06, 0x9f, 0x6d, 0xc4, 0xc8, 0x58, - 0xe8, 0x85, 0xf6, 0x8e, 0x29, 0xab, 0x98, 0x5b, 0x78, 0xb9, 0x45, 0x6c, - 0x2e, 0x38, 0x51, 0x67, 0x55, 0x1b, 0x6f, 0xfe, 0xc0, 0x57, 0x4c, 0x43, - 0x3e, 0x72, 0xe0, 0x28, 0xa4, 0x07, 0x71, 0xd9, 0x26, 0x67, 0x4b, 0xf4, - 0xc2, 0x75, 0x1e, 0xa1, 0xef, 0x4f, 0xcf, 0xf0, 0x93, 0x35, 0x10, 0x1e, - 0x44, 0xf4, 0xbb, 0xe9, 0xfe, 0x5b, 0xa3, 0x2a, 0xdd, 0xf7, 0xdc, 0xa2, - 0x9b, 0xd5, 0x66, 0xe2, 0xfa, 0x5c, 0x76, 0x7b, 0x1b, 0xf1, 0xb7, 0x14, - 0x85, 0x05, 0x4d, 0xa1, 0x8f, 0xf7, 0xcd, 0xb4, 0x4d, 0xc0, 0x18, 0xa1, - 0x63, 0x3c, 0xcd, 0xb1, 0xfa, 0x1b, 0x38, 0xb0, 0x58, 0x9c, 0x1d, 0x47, - 0x59, 0x86, 0xa5, 0x83, 0x7c, 0xa0, 0xad, 0x55, 0x71, 0x3a, 0xe9, 0xa5, - 0x9d, 0x50, 0xf4, 0x39, 0x69, 0x75, 0x7b, 0x46, 0x02, 0xc7, 0x57, 0x36, - 0xcb, 0xe9, 0x03, 0xcb, 0x12, 0xd6, 0x8b, 0xac, 0x1a, 0x81, 0xed, 0xbe, - 0xe9, 0x48, 0x0c, 0x9a, 0x04, 0x57, 0x59, 0x11, 0x5a, 0xea, 0xa7, 0x47, - 0x08, 0x20, 0x9b, 0xb1, 0x08, 0x24, 0xbb, 0x71, 0xa4, 0xf7, 0x09, 0xf9, - 0xf6, 0xd8, 0xfa, 0x64, 0x3f, 0x36, 0xf7, 0xb5, 0xb1, 0x64, 0x3c, 0xf5, - 0xf6, 0xa6, 0x8a, 0x88, 0xc9, 0xd5, 0x83, 0x20, 0x26, 0x62, 0x60, 0x4d, - 0x47, 0x1d, 0xec, 0x91, 0x09, 0xd9, 0x30, 0x6b, 0xb0, 0x7a, 0xfb, 0xf8, - 0x8a, 0x22, 0x6c, 0x1c, 0xd0, 0x98, 0x93, 0x7f, 0xe1, 0x7f, 0xa8, 0x88, - 0xcf, 0xc0, 0xd4, 0x68, 0xf0, 0x50, 0x00, 0x23, 0xa4, 0x12, 0x7e, 0x4f, - 0xf7, 0x3c, 0x54, 0x7f, 0xf8, 0xa9, 0x54, 0x8c, 0xac, 0x80, 0xec, 0x47, - 0xec, 0x88, 0x81, 0x16, 0x25, 0x75, 0x3e, 0x05, 0xab, 0x22, 0x46, 0x49, - 0xeb, 0x1b, 0xa8, 0x27, 0xe3, 0x78, 0x12, 0x7c, 0x79, 0x1d, 0xb9, 0x05, - 0x54, 0x27, 0x6b, 0xf8, 0x61, 0x7e, 0xb0, 0x50, 0xdc, 0xcc, 0xb8, 0xb5, - 0x86, 0xb8, 0xa0, 0x00, 0xb6, 0x1d, 0x2e, 0xf6, 0xdc, 0x99, 0x46, 0xba, - 0x2c, 0x33, 0x24, 0x3e, 0x35, 0xcd, 0xd0, 0xef, 0x70, 0xa9, 0xac, 0xb3, - 0xd3, 0x96, 0x1c, 0xae, 0x20, 0x89, 0xaa, 0x6d, 0x16, 0x2e, 0x8c, 0xaa, - 0xc1, 0xb4, 0xe9, 0xa5, 0xe0, 0x3a, 0xbf, 0xda, 0xbf, 0x7c, 0xc3, 0x07, - 0xe0, 0x14, 0xae, 0x56, 0x8f, 0x42, 0xb5, 0xfb, 0xe9, 0x64, 0x47, 0x66, - 0x4f, 0x1d, 0x8c, 0x3a, 0xde, 0x98, 0xe8, 0x22, 0x6e, 0xa6, 0x0c, 0x4d, - 0x39, 0xea, 0x1d, 0x49, 0xa0, 0x9c, 0x72, 0xe4, 0x41, 0xc8, 0x5b, 0xd5, - 0x6d, 0xc0, 0x58, 0xe8, 0x33, 0x67, 0x84, 0xb5, 0xc9, 0x3d, 0xfd, 0x8d, - 0xa7, 0xcd, 0x14, 0x4c, 0xb2, 0xc6, 0xc6, 0xb6, 0x10, 0x34, 0x79, 0xe5, - 0x4b, 0x48, 0x88, 0x35, 0xfb, 0xc4, 0xb6, 0x88, 0xb6, 0xfa, 0x28, 0x6a, - 0xe9, 0xbd, 0xba, 0xb2, 0xe9, 0x0c, 0x6c, 0xc0, 0x9d, 0x1e, 0x86, 0x94, - 0xc5, 0x33, 0x36, 0x89, 0xef, 0xa6, 0x69, 0xb0, 0x1c, 0x6d, 0x81, 0x21, - 0x6a, 0x76, 0xd9, 0xff, 0x63, 0x85, 0x62, 0x0b, 0xb4, 0x94, 0x15, 0x49, - 0xf3, 0xa2, 0xb0, 0x2b, 0xd5, 0xec, 0x01, 0xc9, 0x72, 0xa3, 0x0e, 0x9d, - 0xa1, 0x14, 0x6c, 0x2d, 0x14, 0x35, 0x87, 0xfa, 0xc4, 0xb9, 0xde, 0x99, - 0x95, 0xee, 0xef, 0x98, 0xbd, 0x53, 0x6a, 0x97, 0xf9, 0x14, 0xff, 0x48, - 0x7e, 0xc6, 0x0d, 0x76, 0xd3, 0xc6, 0x1b, 0xe5, 0x1f, 0x9d, 0x4b, 0x05, - 0x50, 0xff, 0x42, 0x16, 0x9b, 0xa0, 0x4f, 0x6a, 0x69, 0xdd, 0x3f, 0xa2, - 0xcc, 0x88, 0x12, 0xd1, 0x4d, 0xa8, 0xf2, 0xbb, 0xed, 0xc5, 0xc3, 0x3c, - 0x15, 0xf5, 0x03, 0x54, 0x57, 0x32, 0x6d, 0x60, 0xba, 0x97, 0xd7, 0x93, - 0x0c, 0x0f, 0x6f, 0xb4, 0xd4, 0xce, 0xb8, 0x19, 0x64, 0x75, 0x23, 0x40, - 0x58, 0x17, 0xef, 0xdb, 0x00, 0x2c, 0xfa, 0x55, 0xc5, 0x11, 0xdd, 0xca, - 0x9c, 0xb9, 0xdb, 0xba, 0x63, 0x9c, 0xf6, 0x96, 0x24, 0x22, 0x81, 0x71, - 0x5e, 0x90, 0x17, 0x61, 0x67, 0x7a, 0xd2, 0x65, 0x32, 0x2f, 0xd1, 0xef, - 0xfd, 0x73, 0xb5, 0x0e, 0x3b, 0x77, 0x1f, 0x25, 0x8d, 0xaf, 0x7c, 0x7c, - 0xa2, 0x5d, 0x35, 0xd5, 0xda, 0xa0, 0x8e, 0x73, 0x63, 0x18, 0xe9, 0x01, - 0x68, 0xa7, 0x5a, 0xd5, 0xb5, 0xb5, 0x4c, 0xf2, 0xd9, 0xbe, 0xd3, 0xd1, - 0x9a, 0x9d, 0x3f, 0x34, 0xe7, 0x2a, 0xe9, 0x45, 0x4a, 0x31, 0xd8, 0xde, - 0xb4, 0x30, 0x55, 0x97, 0x6a, 0xa2, 0xb4, 0x0d, 0xfd, 0x29, 0x56, 0xd2, - 0x71, 0x9a, 0xa6, 0x53, 0xf6, 0x15, 0xb3, 0x9c, 0x09, 0x28, 0x55, 0xbd, - 0x37, 0xe5, 0x5a, 0x7e, 0x2c, 0xdd, 0x09, 0x18, 0x82, 0x92, 0x0c, 0xab, - 0x46, 0x0d, 0xe2, 0x74, 0xf7, 0xad, 0xda, 0x70, 0x91, 0xcf, 0xa6, 0x93, - 0x5b, 0x12, 0x76, 0x86, 0xaf, 0xea, 0xf4, 0x09, 0xb7, 0xe5, 0xa7, 0xa8, - 0xee, 0xe6, 0x58, 0x51, 0xe1, 0xf8, 0xc6, 0x27, 0xd4, 0x45, 0x8e, 0x6e, - 0x84, 0xce, 0xff, 0x98, 0xb3, 0x28, 0x22, 0xbf, 0x36, 0x5f, 0xe1, 0x42, - 0x2b, 0x9d, 0x05, 0xef, 0x5a, 0x33, 0xe5, 0x81, 0x2a, 0x2c, 0x10, 0x83, - 0xa9, 0xe3, 0x4e, 0xcc, 0x66, 0xa1, 0x2a, 0x0e, 0x77, 0x12, 0x92, 0x39, - 0xa5, 0x2f, 0x66, 0xe2, 0x17, 0x72, 0x5d, 0x87, 0xfc, 0xc1, 0x65, 0x98, - 0x03, 0xcd, 0x90, 0xe7, 0x93, 0xed, 0x3d, 0x7f, 0x37, 0x27, 0xe3, 0x2d, - 0x53, 0xc6, 0xc4, 0xd0, 0x41, 0x70, 0x4e, 0xfb, 0x95, 0x71, 0x73, 0x37, - 0x76, 0x6f, 0xda, 0x4b, 0xc6, 0x77, 0x30, 0xf8, 0x7b, 0xc7, 0xb0, 0xfe, - 0x38, 0xe2, 0xe1, 0x23, 0xee, 0x21, 0xa1, 0xa4, 0x74, 0xbf, 0x33, 0x32, - 0xef, 0x6b, 0xe8, 0xbe, 0x29, 0x70, 0xbc, 0xf4, 0x9c, 0x68, 0xc8, 0x1c, - 0xcf, 0xd1, 0x00, 0x1e, 0xf5, 0xd0, 0xbc, 0x50, 0xf5, 0xd2, 0x50, 0xee, - 0x5a, 0x77, 0x30, 0x57, 0x43, 0xf9, 0xbc, 0x30, 0x80, 0x39, 0x32, 0xcd, - 0x44, 0xee, 0x93, 0xc7, 0xde, 0xab, 0x1b, 0x3d, 0x88, 0x0c, 0x52, 0x50, - 0x89, 0xc2, 0x90, 0x75, 0x19, 0x62, 0x24, 0x22, 0x75, 0x53, 0x22, 0x91, - 0x94, 0x1f, 0x22, 0xd8, 0xa3, 0x4b, 0x61, 0xf2, 0x17, 0x35, 0x61, 0x86, - 0x29, 0x86, 0x6d, 0xe4, 0xb4, 0x5f, 0x20, 0x0a, 0x64, 0x86, 0x04, 0x94, - 0xa0, 0xe9, 0x5b, 0xe1, 0x98, 0x36, 0x98, 0x1e, 0x77, 0x5c, 0xbf, 0xbd, - 0x87, 0x08, 0x39, 0xbe, 0xc7, 0x2e, 0x40, 0x79, 0x25, 0xb0, 0xcf, 0x5d, - 0xb3, 0x93, 0x07, 0xd9, 0x5c, 0x54, 0x9c, 0xb6, 0x80, 0x1b, 0xe9, 0x36, - 0x94, 0x86, 0xa9, 0x98, 0xa0, 0x36, 0xbc, 0x4e, 0x11, 0x39, 0x42, 0xa9, - 0xb1, 0x1c, 0x47, 0x73, 0x77, 0x8c, 0xa7, 0x99, 0x2b, 0x26, 0xdc, 0x8d, - 0xc6, 0x29, 0xfb, 0x3a, 0xd8, 0x20, 0xe5, 0xd1, 0x49, 0x68, 0x10, 0xf7, - 0x92, 0xa3, 0xb8, 0xb2, 0xdd, 0x95, 0x1f, 0x2a, 0x22, 0x33, 0xdd, 0x25, - 0x69, 0x8d, 0xae, 0x7d, 0x40, 0x3a, 0xc2, 0x8a, 0xca, 0x67, 0x5f, 0xaf, - 0x78, 0x12, 0xee, 0xd5, 0xb3, 0x45, 0xe6, 0x03, 0x02, 0xc1, 0x44, 0xba, - 0x25, 0xfd, 0xf5, 0xf0, 0x38, 0x45, 0x78, 0xc8, 0x3c, 0xf5, 0xe1, 0xcf, - 0x3d, 0x9a, 0x0d, 0x5d, 0x32, 0x6a, 0x02, 0xcb, 0x61, 0xc3, 0x07, 0x63, - 0x53, 0x01, 0xfd, 0x58, 0x8f, 0xb8, 0x4b, 0x2e, 0x88, 0xf1, 0xaf, 0x12, - 0x3d, 0x4b, 0xca, 0x5b, 0x88, 0xd7, 0x56, 0x3c, 0x2b, 0x0a, 0x70, 0x5d, - 0xc2, 0x69, 0x5f, 0xb7, 0x21, 0x9a, 0x19, 0xe1, 0x34, 0xef, 0xaa, 0x96, - 0x9f, 0x2e, 0x2f, 0xe0, 0x09, 0x1a, 0x88, 0x1d, 0x50, 0x34, 0x01, 0xa9, - 0x44, 0xc8, 0x1c, 0x93, 0x89, 0x40, 0x39, 0x09, 0xdb, 0x7c, 0x7a, 0xcc, - 0x43, 0x3d, 0x64, 0xaa, 0xe3, 0xd2, 0x75, 0x68, 0x76, 0xd7, 0x7c, 0x54, - 0x7e, 0xd1, 0xc8, 0x0c, 0x5a, 0xc1, 0xf6, 0xef, 0x10, 0xb3, 0x25, 0x36, - 0x26, 0xd5, 0x6a, 0xf2, 0x3e, 0x80, 0x8d, 0xb6, 0xb0, 0xc0, 0xaf, 0x9c, - 0x99, 0xf1, 0x04, 0x03, 0x8a, 0xe3, 0x9c, 0x37, 0x19, 0x73, 0x5b, 0xdb, - 0xd2, 0x6b, 0x55, 0xdf, 0xed, 0x0e, 0x4d, 0xa2, 0x6c, 0x86, 0x6d, 0x52, - 0x12, 0xfc, 0x0a, 0xbf, 0x92, 0xe0, 0x72, 0x32, 0x3f, 0xe1, 0xc3, 0x12, - 0x05, 0xbb, 0x9d, 0x78, 0xc8, 0xb0, 0xd3, 0x95, 0x29, 0x3b, 0xe9, 0x88, - 0x56, 0x76, 0x83, 0xf3, 0xda, 0xe8, 0xd7, 0xa4, 0x51, 0xca, 0x3f, 0x2e, - 0x5b, 0x92, 0x37, 0x1c, 0x14, 0xad, 0x6e, 0xec, 0x43, 0x3e, 0x5e, 0x88, - 0x76, 0xa1, 0x43, 0x8f, 0x9e, 0xab, 0x76, 0xad, 0xfc, 0x44, 0xec, 0xc8, - 0xcc, 0x1b, 0x05, 0xca, 0x32, 0xda, 0xd8, 0x11, 0x3f, 0x0e, 0x28, 0x65, - 0xe3, 0x1a, 0xb0, 0x79, 0x70, 0x26, 0xa3, 0x68, 0xb1, 0x8a, 0xa6, 0xd0, - 0xf5, 0x8b, 0xc0, 0x65, 0xdd, 0x6a, 0xfb, 0x61, 0x6b, 0x9a, 0x8a, 0x53, - 0x1c, 0x55, 0xc2, 0x1d, 0x76, 0xde, 0x24, 0x13, 0x4d, 0x6e, 0xaa, 0x37, - 0xf8, 0x36, 0x54, 0xd9, 0xb4, 0x37, 0x10, 0xe7, 0xac, 0xb9, 0xb1, 0x4c, - 0xed, 0x05, 0x78, 0x7f, 0x12, 0x24, 0x16, 0xb8, 0x6e, 0x8c, 0xa6, 0x7c, - 0xb2, 0x63, 0x8a, 0x7e, 0xe0, 0xd6, 0x42, 0x44, 0x1a, 0x4c, 0xb3, 0xa9, - 0xae, 0xd8, 0x2d, 0x6c, 0x56, 0x7a, 0xa0, 0x4a, 0xcc, 0x82, 0xed, 0x41, - 0x52, 0x4d, 0xaf, 0x4c, 0x7d, 0xf2, 0x63, 0x48, 0x17, 0xbd, 0xce, 0xbb, - 0x96, 0xe2, 0xc1, 0x58, 0x87, 0x25, 0x9c, 0xe6, 0x70, 0x70, 0x00, 0xfe, - 0xee, 0x84, 0x2e, 0xd3, 0x8a, 0x6d, 0xba, 0x36, 0x11, 0x31, 0x2d, 0xd0, - 0x9e, 0x0c, 0x43, 0xf8, 0xfa, 0x90, 0x52, 0xab, 0x86, 0x4d, 0x04, 0xf8, - 0xcf, 0xfe, 0x78, 0xf4, 0xf3, 0x0b, 0x00, 0x8e, 0xaa, 0x3c, 0x8c, 0x6f, - 0xde, 0xa6, 0x7c, 0x8d, 0x5d, 0x87, 0x3d, 0xc0, 0x4f, 0x6a, 0xbf, 0x11, - 0xac, 0xa3, 0xe0, 0xae, 0xbe, 0xa7, 0x9e, 0xce, 0x72, 0x6a, 0x82, 0x4b, - 0x7c, 0xab, 0x65, 0xb9, 0xf8, 0x7f, 0x1f, 0x71, 0x91, 0x1d, 0xfc, 0xeb, - 0x88, 0x99, 0x48, 0x91, 0x2e, 0x5d, 0x5e, 0x24, 0x2e, 0xca, 0x48, 0x26, - 0xfa, 0xae, 0x62, 0x7e, 0xc9, 0x50, 0x95, 0x0d, 0xd0, 0xf5, 0x64, 0x8f, - 0x1e, 0xcb, 0x1d, 0xc8, 0x81, 0x8f, 0xb3, 0x44, 0x14, 0x8b, 0x09, 0x83, - 0xfb, 0xcd, 0xac, 0x7b, 0x54, 0xb2, 0x51, 0x98, 0x4c, 0x93, 0xa2, 0x7d, - 0xf5, 0xb1, 0xbc, 0xca, 0x92, 0xb2, 0x21, 0x02, 0x8e, 0xf9, 0x4b, 0x81, - 0xf4, 0xb3, 0xa1, 0x9d, 0xc0, 0x81, 0x6b, 0x23, 0x5b, 0xbf, 0xf3, 0x48, - 0x41, 0x6a, 0xf4, 0xd2, 0x4a, 0x31, 0x76, 0xcd, 0x58, 0xbe, 0xea, 0xb8, - 0x83, 0x5e, 0x1d, 0x54, 0xb5, 0xf0, 0x7f, 0x88, 0xe6, 0x0b, 0x74, 0xe4, - 0x86, 0x75, 0x8b, 0xbf, 0x57, 0xee, 0x27, 0xbd, 0x36, 0x69, 0x8f, 0x1e, - 0xb8, 0x6d, 0x67, 0xe9, 0xfd, 0x20, 0x97, 0x39, 0x02, 0x39, 0xbe, 0x77, - 0x38, 0x6e, 0x5f, 0x67, 0x94, 0xc0, 0x56, 0xfa, 0x40, 0x75, 0x71, 0x8d, - 0xd5, 0x9a, 0xd3, 0x9e, 0xc4, 0x16, 0xf4, 0x92, 0xde, 0x52, 0x78, 0x84, - 0x81, 0xcd, 0xaf, 0x8d, 0x21, 0x86, 0x0c, 0x13, 0x6a, 0x29, 0x46, 0x1e, - 0xc6, 0x80, 0xaf, 0xb4, 0x32, 0xd2, 0xf7, 0xf2, 0x3f, 0x45, 0x6d, 0x2e, - 0xcc, 0xb2, 0x9f, 0x0f, 0x89, 0x91, 0x21, 0xd3, 0x41, 0xfb, 0x07, 0xad, - 0xed, 0x50, 0xf4, 0x45, 0xd6, 0x80, 0x2a, 0x9d, 0x79, 0x9c, 0x07, 0x0f, - 0x9b, 0xc0, 0x74, 0x99, 0xdb, 0xb7, 0xba, 0x64, 0x56, 0x16, 0x11, 0x6c, - 0x53, 0x17, 0xc7, 0x8c, 0x6e, 0x3d, 0x6e, 0x35, 0x36, 0x66, 0xa6, 0xe7, - 0x0a, 0x41, 0x31, 0xbb, 0x2f, 0x61, 0x99, 0x3b, 0xf6, 0xeb, 0x0e, 0xb0, - 0x22, 0x4b, 0xdd, 0xe8, 0x21, 0xba, 0xa2, 0xc4, 0xf9, 0xc7, 0x9f, 0x08, - 0xe7, 0x6e, 0x8c, 0xa7, 0xbe, 0x0a, 0x8f, 0x78, 0xd1, 0x6f, 0xf4, 0x7e, - 0xb8, 0x28, 0xde, 0x51, 0x45, 0xdc, 0x30, 0x55, 0xc3, 0x06, 0x85, 0x53, - 0x56, 0x36, 0x29, 0xd9, 0x69, 0xe3, 0xaf, 0xb1, 0x9d, 0x31, 0x7c, 0x30, - 0xaf, 0x12, 0xbd, 0x5f, 0x4f, 0x3a, 0x71, 0x0a, 0x59, 0x5e, 0xf6, 0x47, - 0xab, 0xe0, 0x04, 0x57, 0x93, 0x32, 0xa7, 0x56, 0xbd, 0x44, 0x8e, 0x31, - 0x44, 0x0a, 0xe8, 0xee, 0xa1, 0xb9, 0x86, 0x14, 0xe4, 0x1f, 0x9e, 0x86, - 0xb0, 0x14, 0xee, 0x24, 0x42, 0x05, 0xfc, 0xd1, 0x35, 0x20, 0x2f, 0x2f, - 0x67, 0x89, 0xb0, 0xcb, 0x75, 0xfc, 0x9a, 0x3b, 0x0d, 0xc6, 0xb9, 0x7e, - 0xd1, 0xc0, 0xc4, 0x29, 0x25, 0x89, 0x24, 0x67, 0x6c, 0xe3, 0xf8, 0xa1, - 0x69, 0x28, 0xbf, 0x15, 0xfc, 0x5a, 0x85, 0x14, 0x66, 0xee, 0xd7, 0x2f, - 0xcc, 0x0e, 0xd3, 0x42, 0x11, 0x14, 0x68, 0xf0, 0xe2, 0xcd, 0xdd, 0xfd, - 0xf1, 0xf4, 0xaf, 0x96, 0x7a, 0xc0, 0x98, 0xb7, 0x21, 0x73, 0x1e, 0xd1, - 0x78, 0xeb, 0xf8, 0x1f, 0x8e, 0xfa, 0x5d, 0xf5, 0x2b, 0x0f, 0x5b, 0xd8, - 0x2c, 0x07, 0x5a, 0x0b, 0x88, 0x8c, 0x08, 0x8b, 0xf5, 0x12, 0x54, 0x40, - 0xa8, 0x95, 0x9c, 0xfc, 0xe2, 0xa6, 0x04, 0x63, 0x0a, 0x22, 0xe2, 0xb0, - 0x22, 0x77, 0x81, 0xd5, 0x9d, 0x5f, 0xa5, 0x52, 0xf7, 0xdc, 0xb6, 0xa3, - 0x01, 0xf6, 0x31, 0x45, 0x89, 0xe9, 0xdb, 0x4f, 0x57, 0xf3, 0xe9, 0xcc, - 0xcf, 0x0f, 0x05, 0x5d, 0x40, 0x5f, 0xed, 0x05, 0x7f, 0x44, 0xa3, 0x4e, - 0xb4, 0xd8, 0xcb, 0xff, 0x5d, 0x52, 0x4a, 0xa1, 0xfa, 0x22, 0xac, 0x7f, - 0x98, 0x5e, 0x2c, 0xc5, 0x66, 0x99, 0x60, 0x2c, 0xee, 0x0b, 0x73, 0x4b, - 0xb6, 0x2e, 0x6c, 0x2b, 0x9a, 0xb8, 0x40, 0x4a, 0x6e, 0x4c, 0xf0, 0xe3, - 0xfe, 0x46, 0x65, 0x64, 0xc5, 0x33, 0xb7, 0x1c, 0x7d, 0x35, 0xbd, 0x8e, - 0x1d, 0xa7, 0x2c, 0x9e, 0x4e, 0xa3, 0xea, 0x8f, 0xd8, 0x46, 0x29, 0xae, - 0xf4, 0x8b, 0x33, 0x82, 0xb9, 0x71, 0x60, 0xcb, 0xa6, 0xd6, 0xb0, 0x95, - 0x6e, 0x32, 0x92, 0x6a, 0x2d, 0x65, 0xeb, 0x5b, 0x9c, 0x8c, 0x90, 0x2c, - 0x8d, 0x0b, 0xe7, 0x1b, 0x76, 0x41, 0x5b, 0x88, 0x6e, 0xbb, 0x71, 0x1e, - 0xcc, 0xeb, 0x87, 0xed, 0xd1, 0x2e, 0x6e, 0xe7, 0xd7, 0x47, 0x9c, 0xde, - 0x06, 0x77, 0x30, 0xa3, 0x42, 0x8c, 0x17, 0xec, 0xb6, 0x6d, 0x94, 0x35, - 0xc7, 0x37, 0x37, 0x53, 0x14, 0x2d, 0xb1, 0xa6, 0xfc, 0x3e, 0xe2, 0xba, - 0x36, 0xf0, 0xf1, 0x5f, 0xb6, 0xd1, 0x76, 0x43, 0x30, 0xd9, 0xd6, 0x93, - 0xd7, 0xe3, 0x29, 0xb7, 0x33, 0x7f, 0x66, 0xfc, 0xa4, 0xf4, 0x29, 0xd2, - 0x59, 0x4d, 0xd1, 0x00, 0x5c, 0x84, 0x99, 0x71, 0x41, 0x5f, 0xb1, 0xb4, - 0x88, 0x8e, 0x73, 0x57, 0xaf, 0x3e, 0x51, 0xd8, 0xee, 0x77, 0x3b, 0x49, - 0x7c, 0xe6, 0xe7, 0xad, 0xfd, 0x86, 0x95, 0x55, 0x0e, 0xa0, 0x68, 0x86, - 0xdb, 0x4a, 0x43, 0xbf, 0x7c, 0xe0, 0xae, 0xfa, 0xc3, 0xfc, 0x65, 0xb5, - 0x4a, 0x25, 0x45, 0xd9, 0x03, 0x0a, 0x62, 0x67, 0xab, 0xf5, 0x4d, 0x85, - 0x35, 0x75, 0x3b, 0x6c, 0x3e, 0x7f, 0x1d, 0xa5, 0x43, 0x2b, 0x35, 0x87, - 0xb9, 0x8c, 0x1e, 0xe3, 0xbd, 0x7c, 0xbb, 0xba, 0xa2, 0x6c, 0x49, 0x9e, - 0xe6, 0xe5, 0x8e, 0xe5, 0xf8, 0x2e, 0x78, 0x5d, 0xe5, 0x4e, 0x04, 0x77, - 0x0e, 0x37, 0x31, 0x39, 0x8d, 0xfc, 0x59, 0x27, 0x4f, 0xb6, 0x91, 0x9e, - 0x95, 0x46, 0x51, 0x75, 0x95, 0xbf, 0x98, 0x94, 0x5a, 0xd8, 0xc3, 0xe9, - 0xcc, 0x92, 0xb1, 0x26, 0xcb, 0xf3, 0x3c, 0xa2, 0x48, 0x7a, 0xe3, 0xa1, - 0xf2, 0xdc, 0x1d, 0x6e, 0x4d, 0x65, 0x7d, 0x54, 0xe0, 0x60, 0xfa, 0x6e, - 0x94, 0x3f, 0x90, 0xde, 0xa4, 0x89, 0x58, 0x13, 0xd5, 0x1e, 0x52, 0x31, - 0x12, 0xa0, 0xfb, 0x8d, 0xab, 0x62, 0x18, 0x25, 0x63, 0x97, 0x7d, 0xc6, - 0xb3, 0x81, 0xcc, 0x96, 0xae, 0x15, 0x3c, 0xcc, 0x50, 0x61, 0x84, 0x67, - 0x15, 0xd6, 0xd4, 0x5d, 0x82, 0xbb, 0x21, 0x7e, 0x48, 0x0c, 0x96, 0x84, - 0x9b, 0x23, 0x00, 0xfd, 0x0e, 0xc4, 0x74, 0xd7, 0x4f, 0xc9, 0x32, 0x9f, - 0x05, 0x14, 0xe5, 0x19, 0x1a, 0x16, 0xa8, 0x66, 0xdd, 0x82, 0x07, 0x75, - 0x53, 0x67, 0xc4, 0x06, 0x0d, 0x98, 0x48, 0xfb, 0xbe, 0x53, 0x9e, 0x2a, - 0xad, 0x4f, 0x28, 0x89, 0x9b, 0x4b, 0xc1, 0xaa, 0xd0, 0xee, 0x32, 0x2c, - 0x2e, 0x85, 0x38, 0x03, 0x11, 0x07, 0x46, 0x94, 0x4a, 0x8a, 0x61, 0x33, - 0x92, 0xf4, 0x54, 0xdf, 0x9a, 0x27, 0x80, 0xbf, 0xaf, 0xc1, 0x73, 0x44, - 0xfa, 0x8c, 0x04, 0x23, 0xde, 0xa1, 0x26, 0x57, 0x5a, 0x9d, 0xdf, 0xdb, - 0x3a, 0x24, 0xb2, 0x94, 0xad, 0xc7, 0x54, 0xfe, 0xeb, 0x8b, 0x9c, 0x2a, - 0xe6, 0x02, 0xb4, 0x74, 0xde, 0x9a, 0x1b, 0x93, 0x05, 0xe3, 0xf4, 0xbe, - 0x3e, 0x8b, 0xa8, 0x82, 0x1d, 0xb5, 0x70, 0x2a, 0xd4, 0x7a, 0x3b, 0x26, - 0x56, 0xd7, 0xc6, 0x88, 0x3a, 0xd6, 0xc5, 0x07, 0x1d, 0x1a, 0x27, 0x89, - 0x29, 0x7f, 0x3a, 0x10, 0x7a, 0xb1, 0xa7, 0xee, 0x61, 0x13, 0xa8, 0x9e, - 0x13, 0x8d, 0x32, 0x89, 0x49, 0x30, 0xe1, 0x1f, 0xc7, 0x3c, 0xa5, 0x6f, - 0x36, 0xe6, 0x0a, 0x9a, 0x30, 0x5b, 0xb5, 0x73, 0x2d, 0x12, 0x87, 0x21, - 0xc9, 0xaa, 0x7c, 0x0f, 0xe8, 0x3c, 0xae, 0x47, 0x8f, 0x24, 0x5d, 0x6e, - 0x26, 0xd3, 0x9b, 0x06, 0xe8, 0x5f, 0xbc, 0x14, 0x6a, 0x4d, 0xc4, 0xad, - 0xe0, 0x95, 0x68, 0xfb, 0x43, 0x41, 0x7a, 0xbe, 0x4f, 0xc7, 0x08, 0xb5, - 0x0b, 0x49, 0x54, 0x31, 0x7b, 0x58, 0x0e, 0x9d, 0xe2, 0xd0, 0x2d, 0x9f, - 0x08, 0x63, 0x97, 0x31, 0xc4, 0xec, 0xac, 0x59, 0x21, 0xba, 0xf2, 0xeb, - 0x39, 0x59, 0x7f, 0x5d, 0xe9, 0x70, 0x4e, 0x40, 0xc7, 0x1a, 0x04, 0x21, - 0xc9, 0xe2, 0x76, 0xf0, 0x43, 0xfd, 0x7c, 0x3a, 0xf5, 0x85, 0xe5, 0x6e, - 0xcd, 0x26, 0x8e, 0x9d, 0x9b, 0xef, 0xc4, 0x55, 0x58, 0xc1, 0x0f, 0x5a, - 0xa5, 0xec, 0x5f, 0x53, 0x65, 0x80, 0xeb, 0xb5, 0xc0, 0xae, 0x50, 0x99, - 0x23, 0xb0, 0x60, 0xff, 0x35, 0x23, 0x44, 0xa7, 0x72, 0xdd, 0x04, 0xb5, - 0xf7, 0x4c, 0x99, 0x0e, 0x25, 0xa6, 0xf4, 0x93, 0xf0, 0x9f, 0x5b, 0x60, - 0xef, 0xa9, 0x91, 0x6a, 0xd6, 0x3f, 0x03, 0x35, 0xec, 0x4c, 0x64, 0x37, - 0x28, 0xef, 0x54, 0x2e, 0x1b, 0xba, 0x1e, 0xd0, 0xad, 0x4f, 0xd5, 0x9d, - 0x83, 0x04, 0x09, 0x4f, 0xa1, 0x55, 0x92, 0xcf, 0xf4, 0x5e, 0x79, 0x79, - 0x41, 0x5d, 0x7f, 0x16, 0xa6, 0x9e, 0x6b, 0x51, 0x78, 0x0a, 0x55, 0x93, - 0xe4, 0xf9, 0xd7, 0x0d, 0x6f, 0x99, 0xaa, 0x32, 0xca, 0xf8, 0x66, 0x61, - 0x51, 0xbc, 0xb1, 0xed, 0xff, 0x1a, 0xf3, 0xa4, 0xc1, 0x89, 0xcf, 0xff, - 0x86, 0xf2, 0xf9, 0x51, 0x56, 0xda, 0xe8, 0x53, 0x30, 0x6a, 0xbc, 0x32, - 0xbc, 0xe2, 0x69, 0x81, 0x33, 0x46, 0xe3, 0xc7, 0x46, 0x73, 0x17, 0x8b, - 0x82, 0x24, 0x74, 0xcf, 0x71, 0x13, 0xc4, 0xb6, 0x6c, 0x3e, 0x4a, 0x8f, - 0x2d, 0x84, 0x80, 0x06, 0x40, 0xa8, 0x05, 0x68, 0x83, 0x35, 0x8a, 0x34, - 0x30, 0x42, 0xaf, 0xc0, 0xdd, 0xaf, 0x5c, 0x7f, 0x5b, 0x3a, 0x29, 0xaf, - 0x3b, 0xf2, 0x6d, 0x02, 0x2e, 0x61, 0x99, 0x28, 0xb0, 0xa9, 0x1d, 0x2f, - 0x75, 0x0a, 0xe5, 0xb2, 0xa1, 0x99, 0xd9, 0x2c, 0x77, 0xcf, 0x88, 0x74, - 0x8d, 0x73, 0x5a, 0x02, 0xa7, 0xc6, 0xa1, 0x29, 0x3d, 0xab, 0xca, 0xf7, - 0x56, 0xda, 0x8c, 0xd3, 0xb5, 0xd6, 0xad, 0x9e, 0x3e, 0x4a, 0xf1, 0xaf, - 0x9a, 0x96, 0xe1, 0xe3, 0xc3, 0x26, 0xc5, 0x6d, 0x5c, 0x62, 0x8d, 0x35, - 0x9e, 0xfd, 0x94, 0x39, 0x46, 0xfe, 0x05, 0x94, 0x81, 0x22, 0x7e, 0xb5, - 0x94, 0x72, 0x43, 0xcb, 0xaa, 0xb2, 0x85, 0xbe, 0xd9, 0x98, 0xc1, 0xa2, - 0x22, 0xef, 0x51, 0xf3, 0x9f, 0xa7, 0xf8, 0xe2, 0xcf, 0xbf, 0xe0, 0x4e, - 0x25, 0xf3, 0xff, 0x4c, 0x77, 0xe1, 0x5b, 0xdb, 0x8c, 0x00, 0x01, 0x67, - 0xc4, 0xbd, 0x7b, 0x9d, 0x29, 0xd4, 0xeb, 0xb8, 0x41, 0xe7, 0x37, 0x18, - 0xc9, 0x10, 0x4c, 0x7b, 0xa2, 0x05, 0xf4, 0x5a, 0xd1, 0xf4, 0xfb, 0x36, - 0x7b, 0x87, 0x8d, 0x84, 0x5a, 0xf1, 0x9c, 0x33, 0x01, 0x87, 0x87, 0xc2, - 0x49, 0xbb, 0xad, 0x2e, 0x4b, 0x5f, 0x7a, 0x2c, 0x2e, 0xf1, 0xba, 0xe7, - 0x93, 0xbc, 0x2e, 0xff, 0xfe, 0xe0, 0x54, 0xd9, 0xf2, 0x8f, 0x9b, 0xd2, - 0x44, 0x5e, 0x08, 0x9c, 0xd9, 0x03, 0xad, 0x1a, 0x68, 0x40, 0x66, 0x60, - 0x1a, 0x0a, 0x8b, 0x48, 0x92, 0x59, 0x47, 0x70, 0xef, 0x4d, 0x6d, 0xaa, - 0xf6, 0x88, 0x60, 0xf7, 0x09, 0xe1, 0x7b, 0x22, 0x83, 0xd8, 0x46, 0x8a, - 0x86, 0x2b, 0xef, 0xf6, 0xc0, 0xde, 0x4c, 0x2a, 0xf3, 0x06, 0xe7, 0x48, - 0x87, 0x87, 0x08, 0xd8, 0x51, 0x05, 0xac, 0xf8, 0xdb, 0x77, 0xec, 0x6d, - 0x9a, 0x70, 0xac, 0xf2, 0x1d, 0xff, 0xcc, 0xbb, 0x83, 0x0a, 0xfe, 0x2a, - 0x0e, 0x38, 0xf0, 0xb7, 0x45, 0x20, 0xeb, 0xda, 0xc7, 0x49, 0x4e, 0x02, - 0x70, 0x73, 0xb9, 0xa5, 0x11, 0xc2, 0x0e, 0x57, 0x63, 0xfc, 0xb4, 0x16, - 0x0a, 0xa3, 0x26, 0xfb, 0x9d, 0xd8, 0x89, 0x2e, 0x98, 0xa7, 0x97, 0xea, - 0xc7, 0x71, 0x7e, 0xe2, 0x6d, 0x8f, 0xcf, 0x69, 0x6e, 0x4a, 0x64, 0xe8, - 0xeb, 0xc9, 0xe3, 0xe1, 0xed, 0xe8, 0xc9, 0x8f, 0x91, 0x26, 0x70, 0xd9, - 0x14, 0xfa, 0xff, 0xa9, 0xbd, 0x29, 0xe7, 0xd9, 0x1b, 0x18, 0x2c, 0xfd, - 0xa9, 0x67, 0x01, 0x9c, 0x47, 0x51, 0xaa, 0x3a, 0x9f, 0x1b, 0x7f, 0xe6, - 0x5e, 0x65, 0xd9, 0x0b, 0x74, 0x42, 0x7f, 0x8d, 0xeb, 0x2c, 0x29, 0x17, - 0xd8, 0x7f, 0x94, 0x92, 0x49, 0xc4, 0x1d, 0x25, 0x78, 0xb1, 0x8c, 0xea, - 0x6a, 0xec, 0xaf, 0xc6, 0xf4, 0xad, 0x68, 0x69, 0x77, 0xed, 0x26, 0x8c, - 0xe1, 0x8b, 0x52, 0x78, 0xd2, 0x31, 0xd9, 0x2d, 0x05, 0x0e, 0x1b, 0xb0, - 0x8d, 0xbf, 0x30, 0xf8, 0xcd, 0x38, 0x6f, 0x10, 0xe1, 0xeb, 0xa7, 0xa3, - 0x4e, 0x4b, 0x8d, 0x4a, 0x08, 0xf7, 0xdc, 0xb6, 0xea, 0x63, 0xd6, 0xeb, - 0xa4, 0x62, 0x06, 0x2b, 0x0b, 0x0f, 0x87, 0x87, 0x6d, 0xae, 0x3e, 0xcf, - 0x5e, 0x6b, 0xab, 0x7f, 0x9a, 0x0f, 0xac, 0x9d, 0x60, 0xfc, 0xa2, 0xb3, - 0x74, 0x7b, 0x13, 0xc9, 0x1d, 0x3c, 0x99, 0xea, 0x18, 0xe1, 0xfa, 0x1a, - 0x3a, 0x42, 0xfe, 0x55, 0xbd, 0x00, 0x3c, 0x37, 0x78, 0x21, 0xe0, 0xa3, - 0x12, 0xa7, 0x81, 0x5b, 0xb2, 0x5b, 0x37, 0xba, 0xa6, 0xce, 0xd1, 0x9d, - 0x76, 0xbc, 0xd1, 0x12, 0x5b, 0x25, 0xb9, 0xc1, 0x3b, 0x20, 0x09, 0xa4, - 0xb1, 0x61, 0x2f, 0x4b, 0x46, 0x97, 0xa0, 0xb6, 0xd2, 0x45, 0xd6, 0x38, - 0x24, 0xb9, 0x56, 0x57, 0x01, 0xb9, 0xb1, 0xa9, 0x2f, 0x41, 0xcb, 0x4d, - 0x70, 0x84, 0x4c, 0x35, 0x0e, 0x26, 0xc0, 0xbb, 0x6e, 0xb8, 0xa8, 0xbb, - 0xa1, 0xda, 0x5b, 0xe3, 0x5c, 0x12, 0xda, 0xc9, 0x67, 0xe5, 0xd0, 0xc7, - 0x79, 0xd1, 0x06, 0xb8, 0x06, 0xff, 0x01, 0x0f, 0xca, 0x8f, 0x7c, 0x97, - 0x8c, 0xc2, 0x67, 0xe9, 0x76, 0x3f, 0xb6, 0x6c, 0xfd, 0xd9, 0x9e, 0x81, - 0x3f, 0x27, 0x8f, 0xb1, 0xdd, 0xc8, 0xd3, 0x03, 0x54, 0xbd, 0x2d, 0xc8, - 0x36, 0x4f, 0x57, 0x99, 0xfa, 0x69, 0x3d, 0xe5, 0xff, 0xa3, 0x7c, 0xe8, - 0x78, 0x37, 0x9e, 0x1f, 0x51, 0x9f, 0x8c, 0x97, 0xef, 0x95, 0xfe, 0xa0, - 0x4f, 0x4b, 0x98, 0x33, 0x50, 0x65, 0xeb, 0x58, 0xd8, 0xdb, 0xbc, 0x1c, - 0x76, 0x6f, 0x83, 0x70, 0xde, 0xc2, 0xa3, 0x57, 0xba, 0xaa, 0x46, 0x6a, - 0x3f, 0x7d, 0xc6, 0xf6, 0xe6, 0x5e, 0xfe, 0xd4, 0xc8, 0x1b, 0xbf, 0x76, - 0xbd, 0x62, 0x6d, 0x0b, 0xc0, 0x6c, 0x6f, 0x53, 0x7b, 0x8b, 0x3a, 0x75, - 0x3f, 0x2f, 0xc8, 0xc1, 0xc9, 0x37, 0x47, 0x00, 0xde, 0xaf, 0xec, 0xf3, - 0x6b, 0xe7, 0xfc, 0x08, 0xdf, 0x73, 0xb3, 0x24, 0x38, 0xbb, 0x3e, 0x1a, - 0x67, 0xff, 0x3f, 0xce, 0x18, 0x5c, 0x2d, 0x32, 0xee, 0x6a, 0x61, 0xfe, - 0x1f, 0x8b, 0x2f, 0x9e, 0xc4, 0xbe, 0xb3, 0xfd, 0xe0, 0xa3, 0xf2, 0x45, - 0xaf, 0x1b, 0xc9, 0xf5, 0xac, 0x84, 0x7f, 0x0a, 0xd1, 0x8e, 0x9c, 0x34, - 0x58, 0x50, 0xf3, 0xd3, 0xd7, 0xfd, 0x0e, 0x1a, 0xa5, 0x1b, 0x16, 0xd8, - 0xbe, 0x61, 0xb4, 0x30, 0xd0, 0x17, 0x84, 0x89, 0x0e, 0x96, 0x31, 0xe8, - 0x06, 0x43, 0x8a, 0x9a, 0x1c, 0x3b, 0x12, 0x01, 0xb9, 0xcb, 0xed, 0x6f, - 0x1e, 0xb6, 0xe7, 0xbc, 0x17, 0x65, 0xb0, 0xf0, 0xaf, 0x4e, 0x02, 0x36, - 0x7c, 0xa7, 0xfb, 0xcc, 0x81, 0x76, 0x44, 0x08, 0x32, 0xa8, 0x3a, 0x34, - 0x49, 0x42, 0xcd, 0x03, 0xf7, 0xd2, 0xbe, 0xfa, 0xe6, 0x09, 0xce, 0xf9, - 0xdb, 0x7b, 0xf0, 0x00, 0x16, 0xf3, 0x4e, 0x25, 0xea, 0x3b, 0xf1, 0x98, - 0xed, 0xf1, 0xef, 0x6a, 0x05, 0x8c, 0xed, 0x28, 0x95, 0x56, 0x59, 0x27, - 0xee, 0xce, 0x10, 0x89, 0x8d, 0x0b, 0x7b, 0x36, 0xe7, 0xbe, 0x25, 0x9a, - 0xf7, 0x6e, 0x56, 0x7e, 0x60, 0xd6, 0xc6, 0xf2, 0x7b, 0x51, 0x61, 0xa8, - 0x81, 0x45, 0xe5, 0xea, 0x3e, 0x85, 0xfd, 0x31, 0x5a, 0xdb, 0x08, 0x95, - 0xd1, 0xe6, 0xf6, 0x04, 0xf9, 0xa9, 0xd2, 0xb3, 0xd4, 0xce, 0x6f, 0x4d, - 0xf7, 0x6f, 0x5b, 0x37, 0xa8, 0x81, 0xcd, 0x1d, 0xeb, 0x1e, 0xfe, 0x01, - 0x0e, 0xa6, 0xbf, 0xe0, 0xcb, 0xcb, 0x51, 0x7c, 0x01, 0x9f, 0x7c, 0x12, - 0xbd, 0xfa, 0x12, 0x5d, 0x3c, 0x9f, 0x4a, 0x1e, 0x20, 0xf2, 0xf1, 0x71, - 0x04, 0xcc, 0x74, 0x5b, 0x0a, 0xf1, 0xff, 0x60, 0xe1, 0x5f, 0x82, 0x16, - 0x28, 0x93, 0xd6, 0xd8, 0x49, 0x75, 0x6f, 0x75, 0x37, 0x5f, 0x7b, 0xea, - 0xc0, 0x03, 0xd9, 0xc5, 0xbd, 0x8a, 0x6d, 0x00, 0x33, 0xa0, 0x3b, 0xb1, - 0x08, 0x36, 0x04, 0x67, 0xa4, 0x68, 0x72, 0x7f, 0x0c, 0x19, 0xcd, 0x0f, - 0x6a, 0x29, 0x91, 0x03, 0x4e, 0x02, 0x67, 0x86, 0xad, 0xcc, 0x46, 0x9d, - 0xe3, 0x74, 0xe6, 0xfe, 0xaf, 0x6d, 0x09, 0xb6, 0x50, 0xa5, 0x43, 0x53, - 0x68, 0xbe, 0x19, 0xd5, 0x11, 0x61, 0xb4, 0x58, 0x08, 0x1b, 0x05, 0x49, - 0x49, 0xdc, 0x5f, 0xf4, 0xf0, 0xe1, 0xc7, 0x3b, 0xfa, 0x27, 0xa0, 0x1c, - 0x93, 0x9c, 0xfe, 0xc8, 0x0b, 0x84, 0xa3, 0x13, 0x2f, 0x95, 0x06, 0x02, - 0xf5, 0xd3, 0x19, 0xc4, 0x03, 0xa8, 0x43, 0x96, 0xdb, 0x8e, 0x86, 0x22, - 0x5d, 0x6c, 0x53, 0x17, 0x0f, 0x7d, 0x84, 0x3a, 0x1d, 0x63, 0xed, 0xcf, - 0xef, 0xaa, 0x69, 0xe6, 0xbd, 0x9f, 0xdd, 0x38, 0xfc, 0xde, 0xf6, 0xc4, - 0x8b, 0xf1, 0x73, 0xf8, 0x1e, 0xfb, 0x67, 0x9f, 0x6b, 0x63, 0x08, 0x71, - 0x21, 0x9e, 0x97, 0x37, 0x4a, 0x01, 0xe7, 0x6e, 0x62, 0xcf, 0x91, 0x88, - 0x4b, 0x43, 0xee, 0x9d, 0x17, 0xb7, 0x8c, 0xdc, 0x23, 0xb0, 0x2f, 0x6b, - 0xc3, 0xe0, 0xb8, 0xe5, 0x6e, 0x12, 0x44, 0x53, 0x9a, 0x13, 0x3e, 0xe1, - 0xe7, 0x37, 0xf8, 0xfa, 0xae, 0x0c, 0xb8, 0x99, 0x22, 0x54, 0x2d, 0x87, - 0x85, 0x73, 0x3f, 0x4c, 0xdc, 0xe1, 0x46, 0x74, 0x6d, 0xc2, 0xc8, 0x77, - 0x3f, 0x3b, 0xc2, 0xc6, 0x34, 0xad, 0xfc, 0x25, 0x6b, 0xed, 0xe6, 0x4e, - 0xa0, 0x8b, 0x90, 0x8b, 0xe1, 0xcd, 0x3c, 0xf8, 0xb8, 0xfa, 0x06, 0x5d, - 0x73, 0xbb, 0x39, 0xe6, 0xa9, 0xd3, 0x33, 0x86, 0x97, 0xd3, 0x8c, 0x43, - 0xb4, 0x1a, 0x1c, 0x5a, 0xf8, 0xb6, 0x82, 0xaf, 0xb5, 0x81, 0x20, 0xd1, - 0x74, 0xec, 0x9c, 0x80, 0xf6, 0x8a, 0xc8, 0x2f, 0x2e, 0x86, 0x8e, 0x68, - 0xf3, 0x4f, 0x40, 0x96, 0xfe, 0x2a, 0xd1, 0x6c, 0xf7, 0xd1, 0x21, 0x5d, - 0x1c, 0x74, 0xda, 0xe6, 0xbc, 0x21, 0x4f, 0x3f, 0xbe, 0x1c, 0xee, 0x66, - 0x1c, 0x1a, 0x1d, 0x7c, 0x7d, 0x48, 0x80, 0x30, 0xc8, 0x0e, 0x97, 0x4b, - 0x8c, 0xb3, 0x72, 0xf2, 0xad, 0x7a, 0x5a, 0x8e, 0x68, 0x12, 0xf1, 0x00, - 0x6f, 0xe6, 0x99, 0x24, 0x65, 0x7b, 0x66, 0xa2, 0x2b, 0xb1, 0x8c, 0x2d, - 0xa9, 0x8e, 0xa8, 0x2d, 0x63, 0x98, 0xac, 0x64, 0x84, 0xb6, 0x1b, 0xb2, - 0x52, 0xd5, 0xb5, 0x72, 0x02, 0x7b, 0x31, 0xcb, 0xc3, 0xe3, 0x6e, 0x5d, - 0x74, 0x35, 0x58, 0xaf, 0x96, 0x0f, 0x8c, 0xdc, 0xce, 0xc5, 0xc4, 0x60, - 0xf3, 0xf4, 0xfd, 0x0f, 0xa4, 0x38, 0xfb, 0x6e, 0x10, 0xbf, 0x61, 0xdd, - 0xeb, 0x5b, 0x92, 0x47, 0xa4, 0x6a, 0xa8, 0xb0, 0x2b, 0xea, 0x36, 0x98, - 0x72, 0x1b, 0xc4, 0x9d, 0xb5, 0x07, 0xcc, 0x3b, 0xc5, 0x02, 0x2e, 0xdf, - 0x33, 0x8d, 0xc2, 0x77, 0xe8, 0xd0, 0x7f, 0x81, 0x78, 0x5e, 0xfd, 0x33, - 0x0c, 0xcc, 0x10, 0x3f, 0xab, 0x39, 0x8a, 0x08, 0x93, 0xc1, 0x58, 0xd6, - 0x8c, 0xd0, 0x01, 0x4e, 0xb1, 0xbb, 0x16, 0x59, 0xd8, 0x6f, 0xda, 0x49, - 0x58, 0xdb, 0x8c, 0x43, 0x90, 0x6e, 0xc2, 0x97, 0x63, 0x6d, 0xac, 0x2a, - 0x0e, 0xaf, 0x68, 0x5d, 0x75, 0xdc, 0xa7, 0x00, 0x7d, 0xb1, 0x0d, 0xd1, - 0xda, 0x84, 0x77, 0x7b, 0x40, 0x84, 0xbd, 0xbd, 0x5a, 0xd0, 0xc8, 0xf9, - 0xea, 0xaa, 0xec, 0x1c, 0xf7, 0x8f, 0xe7, 0x5e, 0xef, 0x3a, 0xa2, 0x17, - 0xaf, 0x05, 0x28, 0x6c, 0x8d, 0xa7, 0xc3, 0x29, 0x65, 0x29, 0x45, 0xfc, - 0x34, 0x6e, 0xeb, 0x74, 0xe2, 0x8a, 0xe2, 0xbe, 0x46, 0x3b, 0xa8, 0xc1, - 0x33, 0x64, 0xc1, 0x66, 0x9e, 0x08, 0x1e, 0xed, 0xfc, 0x7a, 0x5c, 0x19, - 0x49, 0xdb, 0xb8, 0x1a, 0x71, 0xcb, 0x73, 0xbb, 0xe3, 0x52, 0x75, 0x1f, - 0xc8, 0x13, 0x1c, 0xb7, 0x52, 0x7b, 0xc2, 0xdf, 0x1c, 0x5e, 0x3a, 0x14, - 0x23, 0xdd, 0xf6, 0xe8, 0x96, 0x3d, 0x2f, 0x03, 0xe9, 0xb1, 0xb1, 0x3e, - 0x3d, 0x07, 0x83, 0x2b, 0xca, 0x34, 0xb7, 0x82, 0xc2, 0x4e, 0xd2, 0x32, - 0x02, 0xb6, 0x8a, 0xf8, 0x77, 0xbd, 0xcb, 0x83, 0x71, 0x71, 0xaf, 0x9f, - 0xf1, 0x22, 0x26, 0xa3, 0x17, 0xd6, 0x32, 0x9c, 0xf1, 0x30, 0xde, 0xd1, - 0xa9, 0x7b, 0x38, 0x35, 0x47, 0x35, 0xd2, 0xeb, 0x18, 0xa5, 0x03, 0xf7, - 0xfc, 0x8c, 0xcd, 0x1d, 0x2f, 0x45, 0x18, 0xdb, 0xcf, 0xf3, 0x9c, 0x06, - 0x72, 0x20, 0x8e, 0x89, 0x58, 0xa4, 0xc0, 0x41, 0x0a, 0xb7, 0x3e, 0xf7, - 0xcb, 0x1d, 0xc5, 0xb4, 0x06, 0x4e, 0x46, 0xbc, 0x35, 0x74, 0xd2, 0x81, - 0xaa, 0x89, 0x9a, 0x98, 0xcd, 0x93, 0xf3, 0x33, 0xfe, 0xd0, 0xf5, 0x59, - 0x5e, 0x3c, 0x60, 0xd0, 0x14, 0xb2, 0x93, 0x0a, 0x07, 0x0d, 0x46, 0x7f, - 0xaa, 0xc7, 0xf8, 0x32, 0xd3, 0x9d, 0x09, 0x4d, 0x13, 0x38, 0x5c, 0xd0, - 0x92, 0x4f, 0xeb, 0x36, 0x73, 0x27, 0x37, 0xec, 0x2c, 0xb1, 0x36, 0x7d, - 0xef, 0x84, 0x8c, 0x0a, 0xff, 0xac, 0xa9, 0xcc, 0x5c, 0x78, 0x07, 0x6d, - 0x86, 0x41, 0xc6, 0x56, 0xa7, 0x90, 0xb4, 0x73, 0x11, 0x3d, 0x48, 0x73, - 0xa2, 0x92, 0x42, 0x0d, 0xfe, 0x80, 0x93, 0x17, 0x14, 0xa8, 0x8f, 0xa3, - 0x28, 0x77, 0x24, 0x5f, 0x36, 0x9b, 0x26, 0x1d, 0x98, 0x5a, 0x5b, 0x48, - 0xe1, 0xae, 0x54, 0xbd, 0xf6, 0xaf, 0xaf, 0x5d, 0xeb, 0x64, 0x53, 0xf5, - 0x8c, 0x6e, 0x9d, 0x12, 0x1d, 0x5e, 0xee, 0xc0, 0xde, 0xe3, 0x33, 0x9f, - 0x41, 0xa0, 0x59, 0x88, 0x12, 0xee, 0x67, 0xea, 0xf7, 0xf6, 0xf1, 0xe6, - 0x8a, 0x93, 0x06, 0x7b, 0xee, 0x45, 0x09, 0x4f, 0xc7, 0xa5, 0xbb, 0x0a, - 0x80, 0x6f, 0x25, 0x62, 0x5e, 0x64, 0xfe, 0x8a, 0x96, 0xe8, 0xf4, 0x8e, - 0x18, 0x16, 0x43, 0xe9, 0x7f, 0xbd, 0xab, 0x0b, 0x52, 0x4b, 0x65, 0xee, - 0xc6, 0x75, 0xeb, 0xd8, 0x76, 0x54, 0x04, 0x77, 0xec, 0xe9, 0x77, 0x46, - 0xec, 0x04, 0xb6, 0x7d, 0xf9, 0x7b, 0xbe, 0x6d, 0x26, 0xe2, 0x85, 0xa9, - 0x68, 0x95, 0x01, 0x94, 0xb0, 0xd6, 0xc6, 0xc8, 0xe4, 0xaf, 0xd7, 0x31, - 0x9c, 0xa6, 0xe1, 0x4d, 0xe7, 0x6f, 0xdf, 0x33, 0x99, 0x2c, 0xbc, 0xa0, - 0x08, 0x22, 0x6c, 0x4e, 0x50, 0x64, 0x76, 0x4a, 0x85, 0xd6, 0xcb, 0x3d, - 0xbb, 0x21, 0x0b, 0xee, 0x04, 0xbc, 0xb2, 0xf9, 0xae, 0xb4, 0xc5, 0x1d, - 0xb7, 0xff, 0x1f, 0x06, 0x4d, 0xc7, 0x45, 0x6b, 0xca, 0x44, 0x71, 0xad, - 0xbd, 0xf9, 0x8e, 0x4b, 0x3f, 0x9e, 0x03, 0xe6, 0x19, 0xc1, 0x9e, 0x23, - 0xfd, 0x53, 0x26, 0xec, 0xca, 0xbd, 0xa0, 0x58, 0x5f, 0x13, 0x71, 0x04, - 0x0e, 0xd9, 0xe7, 0x76, 0x5a, 0x4a, 0x5f, 0x9f, 0xd2, 0xfa, 0xfc, 0x30, - 0x5e, 0xc1, 0xe2, 0xb0, 0xf4, 0x8c, 0x08, 0x40, 0x42, 0x9a, 0xbb, 0x5b, - 0x5f, 0x52, 0xb8, 0xad, 0x59, 0x1a, 0xe3, 0x60, 0xe3, 0x40, 0x0a, 0x8e, - 0x1f, 0x2d, 0x93, 0x43, 0xc8, 0xc7, 0xb7, 0x9d, 0xee, 0x7a, 0x74, 0x18, - 0xcd, 0xfd, 0x28, 0xd8, 0x1c, 0x60, 0x44, 0x7b, 0x2e, 0x4f, 0xa4, 0xde, - 0xca, 0x24, 0xbe, 0x61, 0x95, 0xcb, 0x89, 0x40, 0x0f, 0x0d, 0xd2, 0x24, - 0xc8, 0xc0, 0x58, 0xe6, 0xcb, 0x48, 0xea, 0x77, 0x33, 0xfa, 0x60, 0x5d, - 0x2d, 0x79, 0xf9, 0xd1, 0x9c, 0x5a, 0x62, 0x74, 0xaa, 0xdc, 0x16, 0xdf, - 0x80, 0x09, 0xa7, 0xae, 0xcd, 0x52, 0x3a, 0xef, 0xaf, 0xd9, 0x38, 0x00, - 0x90, 0xc4, 0xe9, 0xd4, 0x3f, 0x56, 0x1d, 0x0c, 0x66, 0xd5, 0x54, 0xfb, - 0xb3, 0x1d, 0xb1, 0xf9, 0x51, 0x6c, 0xcf, 0x16, 0xfe, 0xf8, 0xb6, 0x72, - 0x4e, 0x29, 0x83, 0xb3, 0xdf, 0xf4, 0x40, 0x16, 0x42, 0x40, 0xbe, 0xb9, - 0xca, 0x3d, 0x2c, 0xb9, 0xfb, 0x09, 0xd0, 0x91, 0xb7, 0x38, 0x87, 0x5f, - 0x06, 0xdc, 0xc9, 0xd5, 0x65, 0xb7, 0xa2, 0xd5, 0x4e, 0x7f, 0xa7, 0x0b, - 0x38, 0xc2, 0xf8, 0x56, 0x73, 0x7e, 0x57, 0xcf, 0x23, 0x6c, 0x50, 0xf6, - 0x9e, 0xd6, 0xef, 0xa0, 0xa5, 0xda, 0x94, 0x60, 0xfb, 0x1a, 0x49, 0x96, - 0x8e, 0xb6, 0x9e, 0x1f, 0xcc, 0x06, 0x35, 0x6b, 0x5e, 0x19, 0x56, 0x5b, - 0xae, 0xe9, 0x90, 0xa7, 0xa6, 0x36, 0x17, 0x1b, 0xf1, 0x44, 0x95, 0x8e, - 0xae, 0x23, 0xa6, 0x86, 0xab, 0xa6, 0xd9, 0xdb, 0x0b, 0xa3, 0x47, 0xc7, - 0x5e, 0x04, 0x01, 0xef, 0x7b, 0x52, 0x43, 0x33, 0xc5, 0x71, 0x0a, 0x75, - 0xac, 0x3f, 0xde, 0x48, 0x7a, 0x09, 0xc8, 0xd5, 0xba, 0xc1, 0xa7, 0x83, - 0x56, 0x75, 0x9c, 0x0c, 0xd4, 0xcb, 0x3b, 0xee, 0xe3, 0xf7, 0x61, 0x46, - 0x6b, 0x75, 0xc8, 0x78, 0x86, 0xc2, 0xc0, 0x78, 0xaf, 0x2d, 0xd7, 0x77, - 0x1d, 0x01, 0x3c, 0x40, 0x8b, 0xa4, 0xd1, 0x6f, 0x22, 0xc8, 0xd2, 0x0e, - 0x0c, 0xf1, 0x15, 0x5c, 0x10, 0xac, 0x50, 0xd1, 0x60, 0x82, 0xfd, 0x76, - 0x34, 0x6f, 0x13, 0xda, 0x1f, 0xd2, 0xe3, 0x63, 0x61, 0x47, 0xaf, 0xe3, - 0x6a, 0x6f, 0x6f, 0x77, 0x42, 0x9d, 0x55, 0xe3, 0xdc, 0x53, 0x5c, 0x3c, - 0x46, 0x87, 0xf8, 0x7b, 0x80, 0x87, 0x16, 0xb6, 0x23, 0xe9, 0x27, 0xdf, - 0x08, 0x99, 0x3b, 0x0c, 0x4a, 0x64, 0x2d, 0xcc, 0x98, 0x42, 0x52, 0x4c, - 0x0c, 0xa6, 0xb1, 0x5f, 0xd2, 0x19, 0x2a, 0x63, 0xbf, 0x9a, 0xc5, 0x53, - 0xd1, 0xb1, 0x71, 0x12, 0xc8, 0x10, 0x7c, 0x56, 0xb3, 0x29, 0xd7, 0xef, - 0xea, 0xdf, 0xd7, 0x73, 0xdb, 0x3a, 0x8b, 0xb8, 0x12, 0x03, 0x34, 0x2f, - 0x65, 0xe4, 0x03, 0x40, 0xea, 0xf1, 0x64, 0xf6, 0xb7, 0xf1, 0x3e, 0x70, - 0x81, 0xac, 0xaf, 0xd4, 0x06, 0x8e, 0x62, 0xac, 0x6a, 0xf7, 0x36, 0x9a, - 0x2f, 0x8a, 0x60, 0xf5, 0x50, 0x0a, 0x61, 0x5e, 0x7e, 0x87, 0x85, 0xc6, - 0x88, 0xcb, 0xcc, 0x33, 0x82, 0xac, 0xc4, 0x62, 0x97, 0x8e, 0x0f, 0xc2, - 0xa5, 0x87, 0x5f, 0xad, 0x4b, 0xa4, 0xe3, 0x1f, 0xca, 0xf0, 0x3b, 0x12, - 0xe5, 0x3f, 0x68, 0x6a, 0x11, 0xee, 0xb8, 0xeb, 0x0e, 0x64, 0x78, 0xee, - 0x1c, 0x20, 0x56, 0x87, 0x63, 0xbd, 0x7c, 0xe2, 0xb2, 0xda, 0x31, 0x0d, - 0xbe, 0xcd, 0xb9, 0x03, 0xdc, 0x03, 0x3d, 0xbd, 0x1b, 0xea, 0x8f, 0xc6, - 0xd8, 0xc2, 0xd2, 0x29, 0x89, 0x5a, 0xc3, 0x4d, 0x3b, 0xea, 0xea, 0xa8, - 0xe0, 0xba, 0xb4, 0x28, 0x3c, 0x04, 0x3f, 0x44, 0xe3, 0xa4, 0xbf, 0xf3, - 0xdb, 0xb3, 0xc6, 0xd0, 0xa2, 0x0f, 0xf2, 0x89, 0xc1, 0x7c, 0x05, 0x08, - 0xdc, 0x60, 0x6b, 0x74, 0x2c, 0xa5, 0x72, 0xf8, 0x09, 0x90, 0x11, 0x7c, - 0x81, 0x4e, 0x41, 0x48, 0xd6, 0x47, 0x9a, 0x98, 0xa5, 0xb6, 0x9d, 0x70, - 0x3b, 0x86, 0x0b, 0x4c, 0x9f, 0xe8, 0xad, 0xd6, 0x9f, 0xb0, 0xbf, 0x41, - 0x28, 0x9f, 0x24, 0xff, 0x68, 0xf2, 0x78, 0xe7, 0x25, 0x25, 0xc6, 0x5a, - 0xa3, 0x26, 0x6b, 0xaf, 0x18, 0x99, 0x88, 0x02, 0x8f, 0x24, 0x28, 0x34, - 0x4e, 0xe3, 0xa0, 0x57, 0xbe, 0x8c, 0x29, 0x38, 0xcb, 0x8d, 0xa3, 0xb6, - 0x90, 0x0e, 0xcb, 0x00, 0x2e, 0xd1, 0x9f, 0xad, 0xfe, 0x4d, 0xce, 0x3a, - 0x1a, 0x97, 0xa3, 0xe9, 0x6f, 0x05, 0x69, 0x79, 0x19, 0xe1, 0x74, 0x17, - 0xa0, 0x43, 0xeb, 0x02, 0x80, 0xfb, 0x55, 0xa9, 0x4b, 0x03, 0x19, 0x6c, - 0xcd, 0x1f, 0x67, 0x5b, 0xfb, 0x88, 0xe6, 0x3a, 0x0d, 0xde, 0x17, 0x3b, - 0xd2, 0xf2, 0x29, 0x40, 0x7f, 0x9d, 0x6b, 0x22, 0x78, 0x8c, 0xe0, 0x2c, - 0xa0, 0xe3, 0xe7, 0x8f, 0xc9, 0x8e, 0x7c, 0xd1, 0x91, 0x25, 0xc7, 0xd6, - 0xf1, 0xfc, 0x5e, 0x59, 0x52, 0xc9, 0x12, 0xb2, 0xba, 0x8c, 0x61, 0x69, - 0x18, 0xb0, 0x1e, 0x2f, 0x4c, 0x7f, 0x0e, 0xe9, 0x0f, 0x72, 0x5f, 0x66, - 0x88, 0xbe, 0x7b, 0x51, 0x1d, 0xe3, 0x06, 0x95, 0x72, 0xb2, 0x96, 0xdd, - 0x9e, 0xb7, 0x73, 0xaa, 0x98, 0x27, 0x56, 0x5e, 0xf1, 0x53, 0x29, 0x1f, - 0x64, 0x2d, 0x83, 0x39, 0x25, 0xfa, 0x7a, 0xca, 0x6b, 0xa3, 0x6c, 0xec, - 0x4c, 0x55, 0x33, 0xa4, 0x84, 0x96, 0xb2, 0x56, 0x18, 0xd2, 0x34, 0x2e, - 0x1f, 0x8b, 0x25, 0xfe, 0xb0, 0x48, 0x40, 0x25, 0x08, 0x31, 0xbb, 0x67, - 0x9b, 0x05, 0x55, 0x24, 0xbe, 0xfe, 0x03, 0xfb, 0xb0, 0x85, 0x70, 0x7c, - 0x26, 0x38, 0xb9, 0xaf, 0xbe, 0x41, 0x7b, 0x76, 0xe2, 0x58, 0x4f, 0xcb, - 0x64, 0x1d, 0x75, 0xe6, 0x06, 0xfc, 0x46, 0x99, 0x35, 0xe3, 0x7d, 0x08, - 0xd6, 0xe7, 0xab, 0x38, 0x9f, 0x60, 0x51, 0x3f, 0x68, 0x22, 0x4f, 0xeb, - 0xa6, 0xab, 0x0c, 0x1f, 0x35, 0xc0, 0x79, 0x5a, 0xaa, 0x6a, 0xdf, 0x20, - 0x29, 0x6a, 0x8a, 0x5f, 0x5d, 0x19, 0x3f, 0x59, 0x26, 0x9e, 0x2f, 0xf0, - 0xe9, 0x3d, 0x74, 0xa0, 0xf0, 0xfd, 0x1d, 0xc5, 0xf9, 0xf1, 0x56, 0xc9, - 0x35, 0xfd, 0x79, 0x1e, 0x39, 0x84, 0xd3, 0xd4, 0xe8, 0x73, 0xaf, 0x3c, - 0x9d, 0x8f, 0xbe, 0xa6, 0xc3, 0xb3, 0xcf, 0x1a, 0x55, 0xbb, 0xe1, 0x77, - 0xcf, 0xe5, 0x9c, 0xa4, 0xa7, 0x94, 0x97, 0x9d, 0xdd, 0xc0, 0xfb, 0x7a, - 0xd0, 0x3f, 0x72, 0x36, 0x86, 0x16, 0xb4, 0x33, 0x1f, 0x4e, 0x48, 0x86, - 0x86, 0x35, 0xb8, 0x8d, 0xa5, 0xb5, 0xaf, 0x9c, 0x69, 0xcc, 0xc2, 0xb1, - 0x69, 0xbc, 0x50, 0x54, 0xa1, 0x2f, 0x3b, 0x66, 0x5a, 0x33, 0xe3, 0xa6, - 0x49, 0xe9, 0x50, 0xe0, 0x8d, 0xa4, 0x5e, 0x6d, 0x77, 0x00, 0x45, 0x64, - 0x78, 0xcb, 0x38, 0xa4, 0xd4, 0x17, 0xa0, 0x12, 0x59, 0x51, 0x34, 0xe0, - 0xd5, 0xd3, 0x8e, 0x70, 0x39, 0x9f, 0xd9, 0xb4, 0x78, 0xb1, 0x0c, 0xb2, - 0x43, 0x9f, 0xca, 0xa7, 0x29, 0x3d, 0x72, 0x94, 0x6c, 0x18, 0x27, 0x2c, - 0x2d, 0x01, 0x94, 0x9f, 0x75, 0x6b, 0x36, 0x83, 0x2f, 0x22, 0x63, 0xad, - 0x71, 0x26, 0x1e, 0xa3, 0x5f, 0x84, 0x8a, 0x5e, 0x3f, 0x3a, 0x37, 0xfc, - 0xc1, 0x7e, 0x8b, 0x00, 0x03, 0x39, 0x1a, 0x8b, 0x27, 0xc6, 0x83, 0xdb, - 0xec, 0xd6, 0xd3, 0xf0, 0x79, 0xeb, 0xb9, 0xef, 0x70, 0x9b, 0xaf, 0x47, - 0x4a, 0xca, 0x35, 0xf7, 0xfc, 0xfb, 0x56, 0xb3, 0x91, 0x1c, 0xed, 0xf8, - 0x7a, 0xf1, 0x3c, 0xff, 0x09, 0x5f, 0x8c, 0xf3, 0x5f, 0x54, 0x74, 0xfb, - 0xa8, 0xc7, 0xd2, 0x7f, 0x00, 0x32, 0x01, 0xa7, 0xc5, 0x8a, 0xd8, 0x4e, - 0x45, 0x8c, 0x78, 0x51, 0x92, 0x27, 0xee, 0x2c, 0x97, 0x99, 0x46, 0x01, - 0x13, 0x50, 0x96, 0x9f, 0xee, 0xa6, 0xb7, 0x32, 0xa0, 0x82, 0x40, 0xca, - 0xf1, 0x2c, 0x5e, 0xaf, 0xc6, 0x1f, 0xca, 0x80, 0x25, 0x18, 0x41, 0xa5, - 0x96, 0x7a, 0x63, 0x63, 0xf1, 0x7b, 0x0d, 0xb7, 0x8f, 0xe4, 0x39, 0x22, - 0xe4, 0xfc, 0xd7, 0xb1, 0xbe, 0x86, 0x4c, 0x25, 0xc5, 0x46, 0xfd, 0x84, - 0x43, 0xfd, 0x4a, 0xc2, 0xdb, 0x92, 0x75, 0x6a, 0xd4, 0x62, 0xe0, 0x61, - 0x2a, 0x09, 0x9b, 0x53, 0xda, 0xf3, 0xe4, 0xd3, 0xf8, 0x42, 0x7a, 0xd8, - 0x50, 0x33, 0x28, 0x8c, 0x1a, 0xc6, 0xeb, 0x95, 0x9a, 0x4e, 0x9e, 0x61, - 0xd0, 0x8d, 0xc5, 0xfe, 0x20, 0x56, 0xf1, 0x63, 0xb3, 0x22, 0xd4, 0x16, - 0x85, 0xc1, 0x36, 0x04, 0x76, 0xc2, 0xff, 0x40, 0xfc, 0x20, 0xc8, 0xaf, - 0xd4, 0x4c, 0xa7, 0xfe, 0xcb, 0x38, 0x33, 0xc1, 0x52, 0xfc, 0xb7, 0xd3, - 0x26, 0xa9, 0xb5, 0xd5, 0x3a, 0x13, 0x38, 0xfb, 0xa6, 0xed, 0x99, 0x71, - 0x10, 0x7f, 0x90, 0x36, 0x79, 0xfb, 0x76, 0xeb, 0x8d, 0x96, 0xf7, 0x02, - 0x73, 0x3d, 0xd1, 0x65, 0x49, 0x4b, 0x59, 0xbf, 0x97, 0x65, 0x35, 0xfe, - 0xe0, 0x84, 0x01, 0xb8, 0x50, 0x5e, 0xbb, 0xa7, 0x10, 0x20, 0x3b, 0x55, - 0xd6, 0x0d, 0x63, 0x1b, 0xa0, 0x6d, 0x2d, 0x6f, 0xfe, 0x4a, 0x89, 0xea, - 0xfb, 0x7d, 0x57, 0x87, 0xe6, 0x28, 0xec, 0x54, 0xe9, 0x43, 0xfa, 0x83, - 0xb6, 0x79, 0x94, 0x8c, 0xd7, 0xed, 0x6a, 0xcf, 0xc0, 0xa2, 0x99, 0x62, - 0xd1, 0xe5, 0x04, 0xaf, 0xfa, 0x9d, 0xba, 0xfd, 0xa6, 0xbc, 0xd9, 0xc8, - 0xb4, 0x01, 0x09, 0xd5, 0xc3, 0x48, 0x24, 0xb3, 0x35, 0x3a, 0x6b, 0xac, - 0x87, 0x64, 0xa7, 0xf8, 0x97, 0xf9, 0x46, 0x51, 0x52, 0x3b, 0x13, 0x3d, - 0x49, 0xb1, 0xb2, 0x64, 0x66, 0xfd, 0x7d, 0x3b, 0x39, 0x20, 0x5a, 0x9b, - 0x8f, 0xbd, 0x46, 0xff, 0x57, 0x1e, 0x9c, 0x64, 0x0a, 0x12, 0xbd, 0xff, - 0x74, 0x60, 0x65, 0x8f, 0xf7, 0x39, 0x0c, 0x46, 0xc5, 0x2e, 0x31, 0x3a, - 0x50, 0x47, 0x07, 0xeb, 0xc3, 0x49, 0xa8, 0xa4, 0x48, 0xfa, 0x35, 0xe7, - 0x16, 0xf9, 0xfe, 0xe1, 0x56, 0x45, 0x3c, 0x02, 0x0e, 0x08, 0xf7, 0xbc, - 0xc4, 0x9d, 0x78, 0xd9, 0x2c, 0xba, 0xd6, 0x7b, 0x8e, 0xf8, 0x85, 0x33, - 0xde, 0xe3, 0xb2, 0xf7, 0x01, 0xc5, 0xf1, 0xb0, 0x72, 0xfd, 0x3a, 0x41, - 0xf7, 0x07, 0x29, 0xe1, 0xcf, 0x4e, 0x68, 0x4c, 0xd3, 0x68, 0x51, 0x0f, - 0xac, 0xdc, 0x7e, 0x6e, 0x55, 0xc4, 0x83, 0x52, 0xd9, 0x70, 0xdd, 0x63, - 0x36, 0xba, 0x3a, 0x93, 0xac, 0x4c, 0x6d, 0xaa, 0x49, 0x7b, 0xd3, 0x89, - 0xe9, 0xee, 0x6f, 0xbc, 0x0b, 0x72, 0x59, 0xa2, 0x4a, 0x00, 0x7d, 0x09, - 0xb8, 0x34, 0xf4, 0x6f, 0x87, 0xc9, 0xa5, 0x7d, 0xc6, 0xd7, 0x7d, 0x53, - 0xb2, 0x55, 0x24, 0x15, 0x26, 0x8b, 0x23, 0x0a, 0x1b, 0x73, 0xbb, 0x50, - 0xc0, 0xe5, 0x57, 0x43, 0xac, 0x68, 0xed, 0x8f, 0x2a, 0x75, 0x88, 0x3d, - 0x54, 0x7f, 0xcd, 0x71, 0xa6, 0x46, 0x53, 0xc9, 0x5d, 0xc7, 0xf5, 0xdd, - 0xd0, 0xa5, 0x74, 0x4a, 0x84, 0x69, 0x2c, 0x32, 0x69, 0xfb, 0x93, 0xb6, - 0x35, 0x12, 0xd2, 0xd3, 0x41, 0xbf, 0xdf, 0x88, 0x74, 0xfb, 0xdb, 0x56, - 0x32, 0x86, 0x1d, 0xd3, 0x85, 0xfd, 0x16, 0xd8, 0x4a, 0x9c, 0xc9, 0x60, - 0xb4, 0x01, 0x09, 0xd5, 0xc3, 0x48, 0x24, 0xb3, 0x33, 0x3a, 0x6d, 0xac, - 0x87, 0x64, 0xa7, 0xf8, 0xfb, 0x59, 0xe4, 0x33, 0x00, 0x74, 0xe4, 0x42, - 0xe3, 0xf9, 0xd1, 0xad, 0x21, 0x88, 0xec, 0x38, 0x96, 0x1a, 0xe8, 0xd9, - 0x68, 0x47, 0x00, 0xeb, 0x4d, 0xfc, 0x28, 0xd8, 0x8e, 0x5d, 0x5c, 0x6e, - 0x5b, 0x55, 0x75, 0x29, 0x6c, 0xf2, 0xa3, 0xf1, 0x60, 0x7b, 0x2d, 0xb7, - 0x31, 0xf2, 0x65, 0x91, 0xc3, 0x49, 0xa8, 0xa4, 0x48, 0xfa, 0x35, 0xe6, - 0x16, 0xf9, 0xfe, 0xe1, 0x56, 0xcd, 0x3c, 0x02, 0xc9, 0xeb, 0x17, 0x11, - 0x5e, 0x5a, 0xf5, 0xe5, 0x91, 0xf0, 0x56, 0x51, 0xda, 0x0c, 0xfa, 0xea, - 0xd5, 0xfd, 0x62, 0x01, 0xb3, 0x74, 0xef, 0xad, 0x0e, 0xff, 0xa5, 0xba, - 0x7a, 0xfd, 0xf5, 0xfe, 0x18, 0xc7, 0x27, 0xd5, 0x4b, 0x0a, 0xdc, 0x7e, - 0x87, 0x27, 0xea, 0x03, 0xf8, 0x5c, 0x6d, 0x2e, 0x9f, 0x41, 0x7d, 0xd2, - 0x9b, 0xc1, 0x1d, 0x15, 0xed, 0x19, 0x0c, 0x57, 0xf3, 0x1c, 0xca, 0xbe, - 0xe4, 0x9b, 0x77, 0xb8, 0xdd, 0xed, 0x97, 0xd4, 0xcd, 0xce, 0x62, 0x0c, - 0x4d, 0x26, 0x3f, 0xb9, 0x76, 0x66, 0x15, 0xd2, 0x32, 0xe7, 0x8d, 0x5d, - 0xe3, 0x21, 0xe0, 0x49, 0x00, 0x05, 0xf2, 0x5c, 0x21, 0xe7, 0x82, 0x9c, - 0x5c, 0xa2, 0x41, 0xce, 0x8d, 0xc6, 0x7d, 0x26, 0x70, 0x0a, 0x8c, 0x9f, - 0x81, 0xc2, 0x58, 0x7f, 0xda, 0x69, 0x23, 0xc4, 0x62, 0x86, 0xb8, 0xf7, - 0xcd, 0x3e, 0x00, 0x73, 0xa3, 0xcb, 0x0f, 0xd9, 0xb3, 0xee, 0x35, 0x55, - 0x29, 0x20, 0xac, 0xf6, 0xdc, 0xe1, 0x54, 0x38, 0xac, 0xd1, 0x2a, 0x39, - 0xf6, 0x78, 0x11, 0x3e, 0x28, 0xec, 0xd8, 0xb1, 0xee, 0x23, 0x63, 0xf3, - 0x13, 0x68, 0xe3, 0xd1, 0xdb, 0xf9, 0xd6, 0xac, 0x99, 0x43, 0x68, 0x68, - 0xfc, 0x15, 0x59, 0x6f, 0xc0, 0xca, 0x0d, 0x15, 0x2d, 0x89, 0x47, 0xa9, - 0x99, 0x38, 0xdb, 0xe7, 0xbc, 0xb6, 0x66, 0x91, 0x73, 0x89, 0xa6, 0xf8, - 0x6e, 0xb4, 0x18, 0xf5, 0x03, 0x8c, 0xb0, 0xfc, 0xdc, 0xfd, 0xe1, 0x10, - 0xdb, 0xe9, 0xa8, 0xf8, 0xfa, 0x8f, 0xc1, 0xca, 0x14, 0x0a, 0x5d, 0x9c, - 0x32, 0x62, 0xc5, 0xe5, 0xbf, 0x12, 0xf1, 0x3d, 0x56, 0xc7, 0x54, 0xcc, - 0x5c, 0x53, 0xd3, 0xbb, 0x4c, 0x4f, 0x59, 0x1f, 0xb7, 0xd0, 0xd5, 0x63, - 0xc5, 0x5b, 0xb2, 0xa2, 0xc6, 0xea, 0x43, 0x87, 0x3a, 0xf7, 0x11, 0xf2, - 0x61, 0x81, 0xe6, 0xc8, 0xdf, 0x3d, 0xf1, 0xe9, 0x20, 0x46, 0x90, 0x81, - 0x22, 0x36, 0xbd, 0x6f, 0xfe, 0xa4, 0x3e, 0x5e, 0xac, 0xb4, 0x62, 0xff, - 0xd2, 0xfd, 0x64, 0x38, 0xc3, 0xd5, 0x81, 0x67, 0x8b, 0xc6, 0xf3, 0x84, - 0x0f, 0x03, 0xbb, 0x37, 0x90, 0xd2, 0xd6, 0x4e, 0x77, 0x83, 0x0f, 0x55, - 0x63, 0xad, 0xa7, 0x36, 0x72, 0x9c, 0x7b, 0x86, 0xfb, 0x72, 0x9e, 0x8e, - 0x6b, 0x61, 0x1f, 0xa5, 0xf9, 0xb7, 0x8b, 0x8e, 0x92, 0xf5, 0xad, 0x7c, - 0xf2, 0xee, 0x01, 0x64, 0x19, 0x57, 0xa0, 0x73, 0x64, 0x09, 0x85, 0x21, - 0x80, 0x02, 0x98, 0x18, 0xbb, 0xf1, 0xf7, 0x6e, 0x75, 0xa4, 0x6b, 0xe2, - 0x6a, 0x74, 0xca, 0x49, 0x73, 0xca, 0x3f, 0x92, 0x21, 0xfd, 0xb4, 0x02, - 0x05, 0x25, 0xce, 0xa9, 0x60, 0xef, 0xb1, 0x9f, 0xbb, 0x51, 0xb5, 0x6f, - 0x99, 0xa7, 0x81, 0xc5, 0x4d, 0x08, 0xe2, 0x34, 0x7a, 0x71, 0x9a, 0x7e, - 0xcf, 0x9a, 0x96, 0xc4, 0x1f, 0x2c, 0x95, 0x83, 0xa3, 0xe0, 0xea, 0x79, - 0x49, 0xfd, 0x6a, 0x5f, 0x4a, 0x4b, 0x8d, 0x68, 0x26, 0x37, 0x31, 0x6d, - 0xff, 0x2e, 0x2b, 0xd0, 0x75, 0x71, 0x2c, 0x72, 0x40, 0xb3, 0xc7, 0xc7, - 0x4a, 0x7c, 0xe9, 0x2e, 0xd3, 0x1c, 0x22, 0x35, 0x69, 0x00, 0xfa, 0x4b, - 0xce, 0x96, 0x0f, 0xe6, 0x73, 0x3f, 0x16, 0xb5, 0x96, 0x9b, 0x1f, 0x69, - 0xa1, 0x7b, 0x30, 0x4f, 0x8d, 0x5c, 0x89, 0x9d, 0xdd, 0x54, 0x03, 0x27, - 0xd8, 0x9b, 0xd9, 0xf7, 0x01, 0xa6, 0xde, 0xd1, 0x32, 0x5c, 0x19, 0xde, - 0x46, 0x6b, 0x0d, 0x73, 0x7c, 0x6b, 0xe0, 0x1b, 0x1e, 0x03, 0xb0, 0x75, - 0x23, 0x1f, 0x7d, 0x65, 0xf7, 0x03, 0xe7, 0x14, 0xc4, 0xeb, 0x8d, 0x73, - 0xdc, 0x42, 0x72, 0xdd, 0xad, 0x5d, 0x69, 0x21, 0x4f, 0xbf, 0x71, 0x94, - 0xf2, 0x64, 0x4f, 0x68, 0x4d, 0xb7, 0xf3, 0xf3, 0x9d, 0xec, 0x7c, 0x71, - 0x58, 0x47, 0x09, 0x1d, 0x61, 0xfc, 0xd9, 0x1a, 0xa5, 0x3f, 0xc9, 0x3b, - 0xff, 0x9f, 0x09, 0x2d, 0x97, 0xce, 0x0f, 0x87, 0x59, 0xcc, 0xfb, 0xcb, - 0xc5, 0x6b, 0xf7, 0x3a, 0x05, 0xb0, 0x9f, 0x7c, 0xfd, 0xc2, 0x8a, 0x2f, - 0x84, 0x53, 0x80, 0x45, 0xfb, 0x24, 0xd3, 0x2e, 0x4a, 0x74, 0xe7, 0xf5, - 0xd7, 0xa6, 0x40, 0x5d, 0xaf, 0x19, 0xd1, 0x17, 0xef, 0xe7, 0x6c, 0x03, - 0xd7, 0x50, 0xf3, 0x30, 0x99, 0x48, 0xf1, 0x06, 0xc5, 0x7b, 0x42, 0x1a, - 0x72, 0x4b, 0xe1, 0x73, 0xcb, 0x23, 0x49, 0xe3, 0xf3, 0x3e, 0x8f, 0x8a, - 0xcf, 0xb5, 0x6e, 0x0e, 0x32, 0x20, 0x44, 0x25, 0x2e, 0x93, 0x35, 0x27, - 0xd6, 0x4f, 0x25, 0x74, 0x9b, 0x5c, 0xbb, 0x13, 0xc5, 0xa3, 0x72, 0x2e, - 0x29, 0x17, 0x80, 0xcf, 0x76, 0xd5, 0xc0, 0x23, 0x9d, 0x9e, 0x6d, 0xad, - 0xb5, 0xc5, 0xb3, 0x90, 0x7e, 0x81, 0x32, 0xde, 0x03, 0x18, 0x28, 0x65, - 0x81, 0x54, 0x52, 0xff, 0x40, 0xa2, 0x43, 0xa5, 0xc8, 0x42, 0x77, 0x31, - 0xc3, 0x36, 0xfe, 0x34, 0xa7, 0x4a, 0xda, 0xb7, 0x4f, 0x7f, 0xc3, 0x59, - 0xf1, 0xe5, 0x9e, 0xa2, 0x8f, 0x90, 0xc8, 0x70, 0xea, 0x22, 0x99, 0x34, - 0xa7, 0xd1, 0x15, 0xb9, 0xcb, 0xa3, 0xcc, 0x07, 0x25, 0xe6, 0x79, 0xe1, - 0x96, 0x68, 0x07, 0x4a, 0x0c, 0x90, 0x82, 0x84, 0x1b, 0x20, 0xed, 0xe7, - 0xc8, 0x46, 0x17, 0x60, 0xf2, 0xd4, 0x75, 0xff, 0x95, 0xd4, 0x8a, 0x9f, - 0x02, 0xf8, 0xa3, 0x8a, 0xbf, 0x5c, 0x3b, 0xc9, 0xf2, 0xd3, 0xd1, 0x48, - 0x5a, 0x43, 0x2c, 0x6f, 0x0d, 0x0d, 0xdd, 0xe6, 0xd3, 0xa5, 0x9a, 0x56, - 0xbe, 0xcd, 0x09, 0xde, 0x81, 0xc2, 0x9a, 0xc8, 0x7b, 0x08, 0x21, 0x1f, - 0x6a, 0xa4, 0xbf, 0x56, 0xae, 0x09, 0xd1, 0xbc, 0xc7, 0x06, 0x8e, 0x57, - 0x34, 0x72, 0x68, 0x4d, 0x58, 0x22, 0xd6, 0x1a, 0x4f, 0xc1, 0x39, 0xd2, - 0xf6, 0xe0, 0xe9, 0x1d, 0xcd, 0x27, 0x79, 0xe3, 0x3b, 0xec, 0xec, 0x1f, - 0x42, 0xb3, 0xbc, 0xc3, 0xa2, 0x27, 0x04, 0xce, 0xb0, 0xfc, 0xdf, 0x46, - 0x6b, 0x06, 0xfb, 0x75, 0x5f, 0x89, 0x15, 0xc8, 0x05, 0xd1, 0x16, 0xd0, - 0x0d, 0xca, 0xb8, 0xe1, 0x4d, 0x5f, 0x80, 0x2e, 0x5a, 0x36, 0xff, 0xaf, - 0x36, 0xd1, 0x76, 0x4c, 0x41, 0x90, 0xf4, 0x14, 0xaf, 0xc7, 0x55, 0x66, - 0x7c, 0x3e, 0x9c, 0xc3, 0x34, 0xcb, 0xef, 0xc9, 0x6a, 0xea, 0x95, 0x6e, - 0xf1, 0x29, 0xb5, 0x08, 0xab, 0xa8, 0x80, 0x22, 0xe7, 0x4b, 0x77, 0xe4, - 0x75, 0x7c, 0xdd, 0xc9, 0x92, 0xd0, 0x36, 0xcc, 0xec, 0x8b, 0x06, 0x8e, - 0x5a, 0x0e, 0xbf, 0x42, 0x4b, 0xd4, 0xcf, 0xdd, 0x6a, 0x1b, 0x7f, 0xd7, - 0x8b, 0x8c, 0x3f, 0x36, 0x46, 0x1d, 0x18, 0x06, 0x63, 0x81, 0x5b, 0xbe, - 0xaa, 0x28, 0x03, 0xf5, 0x0b, 0x35, 0x6f, 0x4b, 0x10, 0xcf, 0xf7, 0xbe, - 0x8c, 0x65, 0xe6, 0x3b, 0xa2, 0xce, 0xfa, 0xa6, 0x76, 0x13, 0x05, 0xc0, - 0x69, 0xf4, 0x1a, 0x03, 0x8f, 0xbd, 0x03, 0x19, 0x85, 0x4d, 0xa3, 0x7e, - 0xca, 0x19, 0xf5, 0x88, 0xdd, 0xde, 0xfc, 0x42, 0x64, 0x45, 0x81, 0xdd, - 0xc7, 0xec, 0x52, 0x36, 0x0e, 0xe3, 0x70, 0x33, 0xfa, 0xd6, 0x88, 0x85, - 0xa3, 0xfd, 0x3a, 0x9b, 0x91, 0xa7, 0xb3, 0x2b, 0x91, 0x86, 0xc0, 0x6e, - 0xe5, 0x58, 0x90, 0x94, 0xd7, 0x79, 0x93, 0x3f, 0x67, 0xdd, 0xf6, 0x80, - 0x3e, 0xf2, 0xa5, 0x0b, 0xc8, 0x50, 0xc1, 0x43, 0x92, 0x6a, 0xdd, 0xb1, - 0x6a, 0xa0, 0x8f, 0x48, 0x20, 0x75, 0x7b, 0x11, 0x56, 0xcd, 0xb3, 0x67, - 0x09, 0xe7, 0x41, 0xab, 0x56, 0x69, 0x8f, 0x17, 0x70, 0x3a, 0x15, 0x0f, - 0xfa, 0xbb, 0x15, 0xd9, 0xfe, 0x4e, 0x63, 0x21, 0x23, 0x02, 0x5a, 0xfb, - 0xda, 0x96, 0x37, 0x30, 0x3b, 0xab, 0xbe, 0xc0, 0x2b, 0x5a, 0x13, 0x16, - 0x5d, 0xfb, 0x6f, 0xc7, 0x86, 0x14, 0xfc, 0x78, 0x19, 0x29, 0x1d, 0xaf, - 0x2a, 0xd5, 0x24, 0x1d, 0xae, 0x8f, 0x08, 0x4d, 0x48, 0x0a, 0xcd, 0xfb, - 0x80, 0xb3, 0x1a, 0xcf, 0x30, 0xe4, 0x2e, 0xf1, 0x80, 0xd4, 0x51, 0x43, - 0xb6, 0xd9, 0x4f, 0x29, 0xd2, 0x84, 0x7e, 0xb6, 0x48, 0x58, 0x33, 0x42, - 0x2b, 0x4a, 0xd1, 0xc0, 0x69, 0x9e, 0x73, 0xf8, 0x89, 0x6d, 0x98, 0x16, - 0x49, 0x70, 0x6c, 0xbb, 0x7c, 0x53, 0x73, 0xb5, 0x9b, 0xa7, 0x09, 0x06, - 0xe9, 0x73, 0x12, 0x34, 0xd3, 0x4c, 0x8a, 0xfe, 0x2e, 0x1b, 0x18, 0x8b, - 0xc5, 0xb7, 0xc7, 0x79, 0x2a, 0xa0, 0xe0, 0xae, 0xdc, 0xe6, 0x64, 0xd7, - 0xf8, 0x39, 0x8c, 0xcb, 0x86, 0xe7, 0x63, 0x31, 0xa5, 0xd0, 0xff, 0x78, - 0x77, 0x51, 0x15, 0xb2, 0x86, 0x30, 0xdf, 0xec, 0x62, 0xfd, 0x19, 0x56, - 0x52, 0x8b, 0x02, 0xcd, 0x2b, 0x82, 0x27, 0xd0, 0x3b, 0xa0, 0x16, 0x36, - 0x4f, 0x58, 0x1c, 0xd8, 0xde, 0x27, 0xd2, 0xba, 0xb1, 0x30, 0xad, 0x4b, - 0x6c, 0x18, 0x13, 0x71, 0x3a, 0xd9, 0x17, 0x01, 0xd5, 0x07, 0x13, 0xdb, - 0x3d, 0x48, 0x26, 0xae, 0x09, 0xc1, 0x0b, 0xd1, 0x88, 0x38, 0xf2, 0xa5, - 0xf2, 0xb4, 0xb1, 0x69, 0xdf, 0x8a, 0x3a, 0xab, 0xfe, 0x05, 0x53, 0xe0, - 0x61, 0xd9, 0xa2, 0x2e, 0x92, 0x83, 0xdb, 0x83, 0x32, 0xc5, 0x12, 0xcf, - 0xec, 0xe1, 0xd1, 0x2a, 0x7c, 0x02, 0xcd, 0x47, 0x63, 0x2f, 0x94, 0x47, - 0x2c, 0xc5, 0x66, 0xfc, 0xda, 0xd7, 0x8c, 0x2f, 0x23, 0x7a, 0x4b, 0xf5, - 0x26, 0xd7, 0xa2, 0xc4, 0xfa, 0x27, 0x42, 0x4a, 0x23, 0xeb, 0x17, 0xf3, - 0x39, 0x01, 0x30, 0x2a, 0x32, 0xd4, 0xbe, 0x2d, 0xd5, 0x4f, 0x5b, 0x8f, - 0x1b, 0x73, 0x74, 0x25, 0xb0, 0x4a, 0x7f, 0xdd, 0x34, 0xbd, 0x8e, 0xd1, - 0xde, 0x3f, 0x4a, 0x31, 0xf6, 0xea, 0xb7, 0x71, 0x9e, 0xb4, 0xc1, 0xa0, - 0x28, 0xf3, 0xe7, 0xce, 0xf2, 0xde, 0xdf, 0x20, 0x57, 0x96, 0x07, 0xbc, - 0xf0, 0xce, 0x15, 0x8b, 0x9f, 0xda, 0x1c, 0x81, 0x74, 0x4c, 0x3d, 0x37, - 0xfa, 0x03, 0x95, 0x7c, 0x85, 0xb2, 0x68, 0x44, 0x6b, 0x98, 0xc0, 0x63, - 0x5d, 0x9d, 0x31, 0x36, 0x29, 0xa0, 0x17, 0xaa, 0xaa, 0xc7, 0x5c, 0xe8, - 0x02, 0x4b, 0x7d, 0xa5, 0x6b, 0x6c, 0xce, 0xf7, 0x9f, 0xe6, 0x18, 0xc9, - 0xe6, 0x41, 0x02, 0xf3, 0xce, 0x18, 0x29, 0x86, 0x8d, 0xc1, 0xe6, 0x2c, - 0xc4, 0x51, 0x0f, 0x34, 0x50, 0x5c, 0x4e, 0xad, 0xcd, 0x8a, 0xf8, 0x28, - 0x4c, 0x99, 0x71, 0x8d, 0x12, 0x90, 0x18, 0xd7, 0x58, 0xce, 0xd2, 0xc0, - 0x88, 0xb3, 0x3c, 0xab, 0x1c, 0x56, 0x35, 0x7d, 0x19, 0xe3, 0xc5, 0x97, - 0xb3, 0x28, 0xdb, 0xf1, 0x61, 0x6c, 0x97, 0x8e, 0xdc, 0xd0, 0x9c, 0x61, - 0x0c, 0x2e, 0x94, 0xbb, 0x46, 0x77, 0x01, 0x4d, 0x1b, 0xbd, 0xc5, 0x6c, - 0xed, 0xa3, 0x4c, 0x4b, 0x4f, 0x6b, 0xc0, 0x25, 0x7c, 0xfd, 0x13, 0x96, - 0xd3, 0x0d, 0x98, 0x68, 0x41, 0xae, 0x5d, 0xc6, 0x65, 0xab, 0x15, 0xce, - 0xa1, 0xcd, 0xc8, 0xe4, 0xd4, 0x5a, 0x6f, 0xa9, 0x1d, 0xf1, 0xe0, 0x7c, - 0x94, 0x6b, 0xcd, 0x8d, 0xf7, 0x0f, 0xe6, 0x52, 0xae, 0x36, 0xf7, 0x39, - 0xa3, 0x87, 0xd7, 0xc0, 0x3f, 0x65, 0xb5, 0xcf, 0xbf, 0x6c, 0x98, 0xf1, - 0x1f, 0x2b, 0xe5, 0x0a, 0x23, 0x3c, 0x7f, 0x11, 0xad, 0x5c, 0x80, 0x50, - 0xb8, 0x4f, 0x6a, 0x8b, 0xad, 0xe5, 0x46, 0x47, 0x22, 0x01, 0x0f, 0xd8, - 0x18, 0x54, 0x60, 0xd1, 0x37, 0x5f, 0x88, 0x3c, 0x33, 0xff, 0x96, 0xc6, - 0x48, 0xef, 0xd8, 0xef, 0x83, 0x5c, 0x78, 0xfd, 0x07, 0x4b, 0x2a, 0x02, - 0xf4, 0xd7, 0x17, 0xbe, 0x75, 0x42, 0x28, 0x80, 0xe7, 0xa9, 0xb4, 0x23, - 0xc4, 0x13, 0xd8, 0x7c, 0xd7, 0x7c, 0x4a, 0x85, 0x50, 0xac, 0x8f, 0x37, - 0xcc, 0xc1, 0x06, 0xa0, 0x80, 0xec, 0x2c, 0x4c, 0xd4, 0x8e, 0x29, 0xe6, - 0x58, 0x29, 0x03, 0x27, 0xd7, 0xaf, 0x49, 0xc1, 0xa6, 0x79, 0x73, 0x10, - 0xdd, 0x4f, 0x74, 0xe5, 0xdd, 0x7c, 0xa4, 0x24, 0xd5, 0x65, 0xfd, 0x1e, - 0x8e, 0x7e, 0x43, 0x8e, 0x8d, 0xd7, 0xd0, 0x48, 0x73, 0xa0, 0xef, 0x2e, - 0x6b, 0x40, 0x30, 0xe5, 0x3f, 0x26, 0x2e, 0x29, 0xb8, 0xa8, 0x1d, 0x44, - 0xf1, 0xb4, 0x80, 0x10, 0xcf, 0x64, 0x7b, 0x68, 0x90, 0x8a, 0x43, 0x7f, - 0x49, 0xaa, 0xe1, 0xe2, 0x00, 0x0b, 0x79, 0xb9, 0x78, 0x65, 0x0d, 0x87, - 0x1e, 0x83, 0xcc, 0xf3, 0xcc, 0x08, 0x1d, 0x3c, 0x60, 0xa2, 0x18, 0xb0, - 0x2b, 0xef, 0x8b, 0x9b, 0x68, 0x21, 0x7c, 0xbe, 0xf7, 0x1c, 0xbf, 0x6c, - 0x84, 0x5a, 0xf6, 0x11, 0xa8, 0xd3, 0x37, 0x65, 0xa0, 0xd0, 0x8a, 0xe7, - 0xe7, 0x56, 0xcd, 0x58, 0x14, 0xec, 0x5b, 0x01, 0xba, 0x0f, 0xc7, 0x03, - 0x16, 0xcc, 0xc9, 0xdb, 0x9c, 0x66, 0x15, 0x46, 0x0c, 0x98, 0x4e, 0x01, - 0xf5, 0x9c, 0x96, 0xdb, 0x42, 0x4f, 0x82, 0xa0, 0xd3, 0x34, 0xf1, 0x2d, - 0x8e, 0x0a, 0xb8, 0xa6, 0x01, 0xfb, 0xa8, 0x3f, 0x3b, 0x7e, 0x37, 0x75, - 0x41, 0xb9, 0xd4, 0x90, 0xce, 0x0c, 0x4f, 0x90, 0xa5, 0x7d, 0xf4, 0x0e, - 0xa2, 0x7d, 0x20, 0xa4, 0x8b, 0x38, 0x1f, 0x7f, 0x00, 0x06, 0xe9, 0x3a, - 0xed, 0xb4, 0x5f, 0xc9, 0x7f, 0x1e, 0x60, 0x1f, 0xbb, 0x65, 0xfd, 0x45, - 0x73, 0x12, 0x9c, 0x32, 0x37, 0x9d, 0x7c, 0x88, 0xd5, 0xe2, 0x48, 0x2b, - 0xc1, 0x73, 0x1e, 0x6d, 0xd4, 0xf9, 0x41, 0x82, 0x74, 0x50, 0x2a, 0xa3, - 0xb9, 0x64, 0x6c, 0xff, 0x42, 0x90, 0x09, 0xfc, 0x19, 0x5e, 0x92, 0xf9, - 0x83, 0x5d, 0xd9, 0x92, 0x5e, 0x71, 0x5e, 0xd7, 0x96, 0x2d, 0x0a, 0xac, - 0x9b, 0xe9, 0x37, 0x1d, 0x5d, 0xc6, 0x86, 0x57, 0xbb, 0x83, 0x06, 0x69, - 0x8d, 0xda, 0xdc, 0x6c, 0x25, 0xfa, 0x9c, 0x3f, 0x96, 0x60, 0xe2, 0x97, - 0xc6, 0xa9, 0xeb, 0xcd, 0x0f, 0x9c, 0xa1, 0x44, 0x58, 0x26, 0x8b, 0xd4, - 0x3a, 0x23, 0x4a, 0xf6, 0x1f, 0xb4, 0xb1, 0xa0, 0x38, 0x1d, 0x67, 0xba, - 0xe2, 0x42, 0x32, 0x92, 0xa6, 0xef, 0x54, 0x51, 0x85, 0xaf, 0xd3, 0xd1, - 0x9b, 0xb2, 0xaa, 0xe0, 0xc8, 0x98, 0xc2, 0xf8, 0x63, 0xcd, 0x17, 0x21, - 0x7d, 0x42, 0xca, 0x5c, 0xe1, 0xb4, 0x07, 0x45, 0x46, 0x1b, 0xd3, 0xda, - 0x1f, 0xee, 0xee, 0xd0, 0x08, 0x37, 0x8b, 0xff, 0xa9, 0xc4, 0x80, 0xb5, - 0xb9, 0x55, 0x93, 0xe2, 0x30, 0xb9, 0xcc, 0x77, 0x79, 0x32, 0x2b, 0xce, - 0x05, 0x8e, 0xb7, 0xbb, 0x19, 0x7e, 0xf8, 0x43, 0xc6, 0x28, 0x42, 0xa7, - 0x22, 0x06, 0xea, 0x92, 0x3e, 0x51, 0x53, 0x31, 0xdd, 0xd2, 0x21, 0x00, - 0x39, 0x3b, 0x55, 0x7d, 0x56, 0x83, 0x24, 0x1f, 0xbc, 0xcd, 0xaf, 0x57, - 0x84, 0x3c, 0x8e, 0xb7, 0x1a, 0x94, 0x72, 0xac, 0xcb, 0xd6, 0x63, 0x8f, - 0x82, 0x9c, 0xcc, 0xbf, 0x44, 0x4f, 0x4e, 0x30, 0x85, 0x3a, 0xcb, 0x09, - 0x82, 0xf6, 0xe3, 0x8d, 0x71, 0x8b, 0x91, 0x94, 0x15, 0x52, 0x68, 0x23, - 0x45, 0x2c, 0xbe, 0x80, 0x59, 0x29, 0x73, 0x58, 0xb6, 0xe6, 0xc7, 0x84, - 0x3e, 0x14, 0xb1, 0xdb, 0x0f, 0xfc, 0xc0, 0xc0, 0xfd, 0xe3, 0x82, 0x31, - 0x4f, 0xb5, 0x9b, 0xe7, 0x84, 0x50, 0xf7, 0x54, 0xe0, 0x5c, 0x34, 0xb5, - 0xa6, 0x41, 0xa4, 0xf3, 0x3c, 0xe3, 0x43, 0x31, 0x85, 0xc1, 0xeb, 0x9b, - 0xfe, 0x73, 0xb1, 0x1b, 0x7c, 0xb4, 0xdc, 0xf3, 0x3f, 0xf6, 0x7b, 0x30, - 0xaf, 0x41, 0x32, 0x3e, 0x7e, 0x5e, 0xa7, 0x6e, 0x56, 0x5e, 0xc5, 0x4d, - 0x54, 0x21, 0x03, 0x7d, 0x27, 0x61, 0x17, 0xc4, 0x48, 0x99, 0xee, 0x5a, - 0xfa, 0xc3, 0xb9, 0x3f, 0x13, 0xee, 0xc1, 0x9c, 0xb7, 0xf2, 0x18, 0x60, - 0xaf, 0x7b, 0xf2, 0xf9, 0x1c, 0x2c, 0x21, 0x1a, 0x8b, 0xf7, 0xa4, 0x50, - 0x66, 0xb9, 0xe1, 0x5e, 0x43, 0xd6, 0x03, 0x51, 0x8b, 0x3b, 0x1f, 0xb9, - 0x6e, 0x4e, 0xa8, 0x4b, 0x9b, 0x5b, 0x44, 0x1d, 0x9f, 0x8a, 0xd4, 0x81, - 0x74, 0x78, 0x1d, 0xa0, 0xd1, 0xfe, 0xff, 0x26, 0xc4, 0x9e, 0x67, 0x52, - 0x77, 0x72, 0x97, 0x12, 0x2d, 0xe1, 0x61, 0x9f, 0x33, 0x9d, 0x29, 0xdd, - 0x3b, 0xa8, 0x97, 0x53, 0xe5, 0x4d, 0x59, 0xdd, 0xc9, 0x62, 0x13, 0x20, - 0xd0, 0xda, 0x2e, 0x80, 0xb8, 0x64, 0xf0, 0xab, 0x07, 0xa7, 0x4a, 0x4a, - 0x5e, 0x5d, 0x84, 0x9f, 0x5a, 0x15, 0x05, 0x7d, 0x14, 0x3c, 0xb9, 0x33, - 0xbc, 0xa9, 0x74, 0x21, 0x34, 0xf9, 0x86, 0x80, 0xea, 0x36, 0x58, 0x31, - 0xef, 0xd8, 0x51, 0xec, 0x64, 0x4e, 0x93, 0x58, 0x4b, 0x35, 0x53, 0x26, - 0xf6, 0x1c, 0xec, 0xc3, 0x5b, 0xed, 0x23, 0x01, 0x61, 0x67, 0x2e, 0x4c, - 0x79, 0x7f, 0xe0, 0x78, 0x21, 0x1a, 0x8b, 0x0a, 0x47, 0x5d, 0x21, 0x96, - 0xd6, 0xbf, 0x88, 0xb9, 0xbf, 0xef, 0x12, 0x49, 0xfe, 0x2f, 0x8d, 0x66, - 0x45, 0x36, 0x29, 0x46, 0x1b, 0xf5, 0x20, 0x78, 0x1a, 0x0e, 0x26, 0xf0, - 0xb2, 0x4b, 0xd9, 0x46, 0xf2, 0x2d, 0x2a, 0xe9, 0x07, 0x15, 0x22, 0xe6, - 0xb7, 0xb2, 0xb8, 0xbe, 0x5d, 0xf5, 0x5b, 0xc7, 0x0f, 0x7c, 0xb7, 0x52, - 0x91, 0xb2, 0xe5, 0xa7, 0xe7, 0x79, 0xde, 0x19, 0x3a, 0xce, 0x7c, 0x70, - 0x11, 0x69, 0x55, 0xff, 0x23, 0xfe, 0xf0, 0x7d, 0x20, 0xc2, 0xce, 0x05, - 0x1b, 0xf4, 0xb4, 0x1d, 0xa6, 0xe6, 0x46, 0xe4, 0xe8, 0x91, 0x2a, 0xf8, - 0x5d, 0xb9, 0x02, 0xf6, 0xab, 0xd1, 0x2e, 0x8d, 0x78, 0x58, 0x0a, 0x85, - 0xc7, 0xc1, 0xf3, 0x4c, 0x64, 0x82, 0x4d, 0xda, 0x8b, 0xd0, 0xf8, 0x1f, - 0x60, 0x45, 0x61, 0xe2, 0x95, 0x6b, 0x88, 0xe7, 0xaa, 0x69, 0x6f, 0x25, - 0x7c, 0x2a, 0x00, 0x05, 0xaf, 0x14, 0xa7, 0x2e, 0x41, 0x42, 0x43, 0x87, - 0x06, 0xb9, 0xcf, 0xe0, 0x37, 0x57, 0x9e, 0x02, 0xcb, 0x07, 0xd9, 0xcb, - 0x70, 0xa3, 0x92, 0xc9, 0xb8, 0x12, 0xae, 0x96, 0x1c, 0xa0, 0x50, 0xdf, - 0x4f, 0xa2, 0xd9, 0xf5, 0x53, 0x12, 0xe6, 0xb6, 0xd2, 0x50, 0xdf, 0x62, - 0xba, 0xf6, 0x20, 0x80, 0xb4, 0x5d, 0x84, 0xb8, 0x80, 0xee, 0x85, 0x07, - 0x69, 0xbc, 0x72, 0x71, 0xee, 0x24, 0xee, 0xa5, 0x5a, 0x3a, 0x9d, 0xff, - 0x10, 0x88, 0x51, 0x75, 0x3b, 0x83, 0x03, 0xb0, 0xfa, 0x09, 0x88, 0xc8, - 0x2b, 0xa3, 0xa5, 0x8f, 0xf8, 0x77, 0xb9, 0xac, 0xfc, 0xf2, 0x95, 0x92, - 0x3b, 0xb7, 0x1e, 0x76, 0x9c, 0xc5, 0x3b, 0x23, 0xd3, 0x45, 0x4e, 0x85, - 0x6c, 0x1a, 0x61, 0x24, 0x19, 0x3c, 0xbb, 0x08, 0xf9, 0xf9, 0xab, 0x79, - 0x54, 0xf1, 0xf0, 0x65, 0xf3, 0xab, 0x3d, 0xd3, 0x1f, 0x3e, 0x97, 0x18, - 0xee, 0xd3, 0x90, 0x8f, 0xb3, 0x04, 0x90, 0x80, 0xf3, 0x24, 0x58, 0xfb, - 0x5d, 0xb3, 0xe2, 0xa5, 0x36, 0xef, 0x65, 0x44, 0x98, 0xfb, 0xb0, 0x71, - 0xa7, 0x59, 0x42, 0x1b, 0x39, 0x22, 0xbe, 0xef, 0x01, 0xdc, 0xf4, 0x2d, - 0xeb, 0x42, 0xe4, 0xc3, 0xd5, 0x95, 0xbc, 0x31, 0xca, 0xf8, 0xb7, 0xc7, - 0x9b, 0xf5, 0xe4, 0xfc, 0xa6, 0x34, 0x27, 0x8b, 0x78, 0xed, 0x0b, 0x50, - 0x6a, 0x7f, 0x77, 0x45, 0x4a, 0x8a, 0x8a, 0x2d, 0xc5, 0x51, 0x5b, 0x14, - 0x68, 0xdc, 0x6c, 0xe4, 0x72, 0x31, 0x1f, 0x89, 0xb7, 0xec, 0xbb, 0x83, - 0x2f, 0xa0, 0x66, 0x7b, 0x44, 0xed, 0x37, 0xfe, 0x5c, 0x3c, 0xb0, 0xa1, - 0x83, 0xef, 0x26, 0x70, 0x62, 0x73, 0x0b, 0xe9, 0xe6, 0x88, 0x9e, 0x3f, - 0xd0, 0xb4, 0xb6, 0xc4, 0xcc, 0x07, 0xc3, 0x60, 0x07, 0xab, 0x33, 0x5f, - 0x44, 0xc3, 0x8d, 0x6c, 0xa6, 0xce, 0xde, 0x6a, 0xd9, 0x9d, 0x58, 0xdc, - 0x2d, 0xfe, 0x59, 0x9e, 0xe8, 0xcd, 0xe1, 0xc4, 0x85, 0xb9, 0x88, 0xeb, - 0x2e, 0xbd, 0xd9, 0x37, 0x2a, 0xd2, 0x9a, 0xbd, 0x1c, 0x23, 0xf7, 0x91, - 0xa5, 0xc1, 0x3f, 0x55, 0x5f, 0x9e, 0xad, 0x44, 0x8d, 0x64, 0x86, 0x14, - 0x66, 0xd6, 0x4d, 0xce, 0xc9, 0x3e, 0xc8, 0xa9, 0xb0, 0xb7, 0xea, 0x01, - 0xf9, 0xd4, 0xf1, 0xb2, 0xe4, 0x54, 0xe6, 0x3c, 0x46, 0xef, 0x8e, 0x7c, - 0xf6, 0xe2, 0xfa, 0xc3, 0xdb, 0xb5, 0xb3, 0x0e, 0x9b, 0x63, 0xaf, 0x40, - 0x61, 0xee, 0x2c, 0x91, 0x42, 0xac, 0xc5, 0x77, 0xa1, 0x7a, 0xb4, 0x54, - 0xa6, 0x9d, 0x5d, 0x7c, 0x1d, 0xa2, 0xc3, 0x19, 0x88, 0x12, 0x05, 0x75, - 0x7b, 0xb9, 0xd3, 0x02, 0xb3, 0x75, 0xeb, 0xee, 0x3c, 0x6e, 0xed, 0x08, - 0x26, 0x37, 0x80, 0xbd, 0xf7, 0x6c, 0xdd, 0x89, 0x37, 0x87, 0x55, 0x7e, - 0x1a, 0x7a, 0x05, 0x63, 0x82, 0xb6, 0x83, 0x20, 0x7f, 0xe5, 0x1d, 0xda, - 0x89, 0x57, 0xb2, 0x9d, 0x05, 0xfb, 0x08, 0x6e, 0x64, 0xa1, 0x7a, 0xaa, - 0x33, 0x62, 0x42, 0xdd, 0xbd, 0xe7, 0xc3, 0x84, 0x59, 0x19, 0xb8, 0xbb, - 0xc8, 0x3c, 0x48, 0xd4, 0x09, 0x06, 0xfd, 0x25, 0xf4, 0x93, 0x5d, 0x53, - 0xa8, 0x88, 0x29, 0xb1, 0xbe, 0x87, 0xbf, 0x2b, 0x7c, 0x0c, 0x69, 0xba, - 0x56, 0x96, 0x60, 0xe1, 0x5f, 0xc4, 0x00, 0xe8, 0x15, 0x3c, 0x26, 0x86, - 0x2b, 0x69, 0x5d, 0x12, 0x7b, 0x35, 0x21, 0x96, 0xeb, 0x9b, 0xf7, 0x42, - 0xff, 0x50, 0x47, 0xc3, 0x5d, 0xfb, 0x79, 0x3f, 0x9a, 0x92, 0x64, 0xe1, - 0x10, 0x63, 0x56, 0x5a, 0xe1, 0x9f, 0x88, 0xab, 0x3a, 0x2f, 0xc4, 0x64, - 0x25, 0xd8, 0x15, 0x57, 0x2e, 0xea, 0x51, 0x86, 0xff, 0x9f, 0xdb, 0x9c, - 0x04, 0x3c, 0x06, 0xd9, 0x5e, 0xb0, 0x08, 0x34, 0x23, 0x59, 0xd8, 0xdc, - 0x81, 0x22, 0xf1, 0x80, 0x6a, 0x1e, 0x7b, 0x58, 0x20, 0x94, 0xb1, 0x8e, - 0xf3, 0x36, 0x13, 0x6f, 0xdd, 0xd6, 0x24, 0x4c, 0xfa, 0xe4, 0x84, 0x80, - 0xf9, 0xc4, 0xe7, 0x49, 0x8f, 0x35, 0xa5, 0xf3, 0x9d, 0x4b, 0x72, 0x0a, - 0xb3, 0x47, 0x31, 0xa0, 0x55, 0x18, 0xc5, 0x99, 0xd3, 0xdf, 0x01, 0x4f, - 0x9c, 0xbd, 0xb1, 0xc0, 0x94, 0xfd, 0xfd, 0xa1, 0xbe, 0x99, 0x86, 0xf0, - 0xf0, 0xc8, 0x61, 0x60, 0xe3, 0x2b, 0x44, 0x9f, 0xca, 0x38, 0xe9, 0x7d, - 0x39, 0x5c, 0x84, 0xb6, 0x66, 0xc9, 0x40, 0x41, 0x4f, 0x82, 0x8e, 0xf0, - 0x62, 0x04, 0xfc, 0xa3, 0xa1, 0x02, 0xc0, 0xad, 0xef, 0x36, 0x6d, 0x20, - 0xfe, 0x07, 0x52, 0xc7, 0x7e, 0xdc, 0x8e, 0x4b, 0xb6, 0xda, 0x07, 0xb1, - 0x31, 0x1a, 0x84, 0x32, 0x06, 0x12, 0xd7, 0xd2, 0x82, 0x76, 0xb7, 0x7b, - 0xb2, 0x34, 0xdd, 0x98, 0x67, 0xfa, 0x9a, 0x62, 0x66, 0xc1, 0x06, 0xc5, - 0x76, 0x20, 0x95, 0xa7, 0xb6, 0xb2, 0xdb, 0xba, 0x95, 0x85, 0x36, 0x96, - 0x6e, 0xf4, 0x2c, 0x60, 0x75, 0xf9, 0x9f, 0x87, 0xf9, 0x25, 0xf6, 0x1a, - 0xe5, 0xad, 0x58, 0xf9, 0x41, 0x5b, 0x36, 0xee, 0xac, 0x19, 0x75, 0x54, - 0x80, 0xc2, 0xfe, 0x81, 0xd2, 0x3d, 0x44, 0x3a, 0x6b, 0x22, 0x0b, 0xa7, - 0xba, 0x7a, 0x2f, 0x8f, 0x53, 0xa5, 0x15, 0xcf, 0x80, 0x52, 0xb4, 0x97, - 0x5f, 0xb9, 0xba, 0xa0, 0xc4, 0x67, 0x96, 0xe7, 0x7e, 0x79, 0xc1, 0x3a, - 0x8c, 0x8c, 0xce, 0xc5, 0x9e, 0x25, 0x2a, 0xbc, 0x98, 0xef, 0x78, 0x6c, - 0x7b, 0x83, 0x80, 0xfc, 0x78, 0x96, 0x02, 0x03, 0x41, 0x9c, 0xc8, 0x01, - 0x77, 0x9e, 0xc1, 0xa7, 0x66, 0x82, 0x94, 0x69, 0x7e, 0x8e, 0x25, 0x67, - 0x44, 0xbb, 0x4e, 0xd0, 0x11, 0xb3, 0x18, 0xec, 0x17, 0x39, 0xe1, 0x92, - 0x74, 0xd1, 0x73, 0x7d, 0x2c, 0x4c, 0xfe, 0xeb, 0x35, 0x7f, 0x7b, 0xe5, - 0xd4, 0x2a, 0x9a, 0x88, 0xb3, 0x56, 0xbe, 0xf2, 0x28, 0xc8, 0x52, 0x39, - 0x65, 0xc2, 0x87, 0x0e, 0xa9, 0x85, 0x92, 0x01, 0xff, 0xa3, 0x84, 0x66, - 0x6b, 0xa5, 0x52, 0xc4, 0x1c, 0x4d, 0x23, 0xc4, 0x1c, 0xca, 0x12, 0x49, - 0xb0, 0x8c, 0x55, 0x0a, 0xe2, 0xe4, 0x8e, 0x7b, 0xc6, 0xe2, 0xa6, 0xb7, - 0xd7, 0x79, 0xea, 0x22, 0x14, 0x50, 0x49, 0x82, 0x77, 0x1e, 0xdb, 0xa3, - 0x09, 0x2e, 0x06, 0x0c, 0xe0, 0x9d, 0x9b, 0x3a, 0xb1, 0x72, 0xf0, 0x2b, - 0xdd, 0xdc, 0xc4, 0x94, 0xfe, 0x36, 0xb2, 0xbd, 0x34, 0x2b, 0x6e, 0x93, - 0x07, 0x46, 0x10, 0x8e, 0xa6, 0x50, 0x89, 0xb9, 0x19, 0x97, 0x08, 0xd6, - 0x7b, 0x74, 0xe7, 0xb6, 0x65, 0xd7, 0x4c, 0x2f, 0x74, 0x21, 0x8b, 0xe7, - 0xe1, 0x69, 0x6d, 0x8c, 0x11, 0xfd, 0x0d, 0xb2, 0xfd, 0xca, 0x14, 0xd4, - 0xb8, 0x84, 0xa0, 0xf1, 0x84, 0x4b, 0x1e, 0xcc, 0xae, 0x66, 0xe5, 0xd5, - 0xe6, 0x86, 0x89, 0x40, 0xea, 0x52, 0x22, 0xae, 0x35, 0x3e, 0x3b, 0xdc, - 0x30, 0x89, 0x2b, 0x97, 0xd9, 0xd4, 0xae, 0x54, 0x48, 0x3f, 0x0b, 0x6f, - 0xcf, 0xc0, 0x90, 0x64, 0x9d, 0xbb, 0xd4, 0x07, 0xda, 0x1f, 0xe1, 0x46, - 0x48, 0xf2, 0x12, 0xb0, 0xad, 0xfd, 0x40, 0x9b, 0x88, 0x96, 0x41, 0x19, - 0xab, 0xb6, 0x25, 0x9f, 0x4b, 0x26, 0x14, 0x02, 0xc7, 0x84, 0xac, 0xc2, - 0xe7, 0x1d, 0x0b, 0x45, 0x5e, 0xa6, 0x55, 0x35, 0xac, 0x75, 0x74, 0x4a, - 0x3f, 0x76, 0x41, 0xf3, 0x03, 0x90, 0xeb, 0x80, 0xbf, 0x01, 0x6e, 0x84, - 0x14, 0x72, 0x2b, 0x28, 0xb2, 0xe1, 0xa8, 0x4e, 0x5e, 0x7b, 0xc7, 0x45, - 0x87, 0x1e, 0xaf, 0x32, 0x61, 0xfa, 0x7c, 0xf7, 0x82, 0x41, 0xda, 0x14, - 0xdb, 0x9d, 0xb8, 0x2a, 0x43, 0xb2, 0xad, 0xaf, 0x77, 0x40, 0x05, 0x0c, - 0x2c, 0xa2, 0x49, 0xb7, 0xfe, 0x8d, 0xa0, 0xf1, 0x7b, 0x60, 0x58, 0x84, - 0x5e, 0x31, 0x52, 0x52, 0xce, 0x74, 0x6f, 0x76, 0xc7, 0xe6, 0x96, 0x5f, - 0xef, 0xd5, 0x9b, 0x1b, 0x2f, 0xa8, 0x5f, 0x10, 0x98, 0xba, 0x8f, 0xbc, - 0x9c, 0x2b, 0xab, 0x93, 0x45, 0xb7, 0x16, 0x46, 0xe9, 0x9e, 0x36, 0xff, - 0x31, 0x30, 0x50, 0x35, 0xa6, 0x76, 0x92, 0x94, 0xf0, 0xf4, 0x36, 0x67, - 0xc3, 0xd4, 0x1a, 0x20, 0x53, 0xf7, 0xbf, 0x03, 0x51, 0x17, 0xc6, 0x04, - 0x20, 0xc8, 0x8d, 0x89, 0x34, 0x12, 0x1c, 0x62, 0x2d, 0x74, 0x52, 0x22, - 0xd4, 0x31, 0xfc, 0xab, 0x5a, 0x55, 0xcc, 0x2c, 0x8d, 0x66, 0x41, 0x87, - 0x40, 0xd0, 0xff, 0xf8, 0x73, 0x27, 0x13, 0xfc, 0x30, 0xd6, 0x89, 0xaf, - 0x2f, 0xdc, 0x6f, 0x64, 0x81, 0x80, 0x2b, 0x28, 0x19, 0x0f, 0xa6, 0x80, - 0xc7, 0x9f, 0xb5, 0x89, 0x46, 0xd7, 0x6d, 0xd8, 0x82, 0x50, 0xda, 0x30, - 0x7e, 0x7a, 0x27, 0xa5, 0xfa, 0x39, 0x84, 0xc8, 0xe5, 0xda, 0x23, 0x18, - 0x9a, 0x3c, 0x11, 0x8e, 0x98, 0xb6, 0xbc, 0xcb, 0x6c, 0xae, 0x64, 0x39, - 0xeb, 0x66, 0x1a, 0xbf, 0xe1, 0xe1, 0x1f, 0x68, 0x8a, 0xa6, 0xd0, 0xbe, - 0xd6, 0x6c, 0x4a, 0x71, 0xcc, 0xf6, 0xa6, 0x90, 0x5a, 0xcd, 0xdf, 0x2d, - 0xe5, 0x19, 0xe9, 0x80, 0x92, 0xc7, 0x8a, 0xa0, 0x58, 0x6b, 0xac, 0xd0, - 0x75, 0x04, 0xae, 0x3a, 0x8c, 0xf4, 0xd7, 0xd3, 0x86, 0x09, 0x5d, 0x31, - 0x95, 0x09, 0x4c, 0x1c, 0x41, 0x0a, 0x40, 0x03, 0x29, 0xaf, 0x42, 0x77, - 0x7e, 0xa0, 0x6b, 0x5a, 0x66, 0xdb, 0x13, 0x0c, 0x76, 0x49, 0x27, 0xd3, - 0xf3, 0xb4, 0x10, 0x4b, 0xd2, 0x7a, 0xce, 0x84, 0xa0, 0x7e, 0xec, 0x57, - 0x0a, 0x5b, 0x54, 0xaa, 0x9e, 0xf5, 0xe5, 0xee, 0xec, 0x1e, 0x84, 0x02, - 0xda, 0x40, 0x66, 0x81, 0x50, 0x61, 0xec, 0xec, 0xc1, 0x87, 0x46, 0x9c, - 0x13, 0xed, 0xb9, 0x99, 0x69, 0xad, 0xce, 0x16, 0xd8, 0x68, 0xb6, 0xa2, - 0x2c, 0xe9, 0x7d, 0x82, 0xfa, 0x32, 0x02, 0x8f, 0xf3, 0xb0, 0xa4, 0x35, - 0xc6, 0x4a, 0xc8, 0x46, 0x42, 0x21, 0x53, 0xd7, 0x2e, 0xf3, 0xb8, 0xa1, - 0x5d, 0xab, 0xef, 0xad, 0x46, 0xdb, 0xc4, 0x15, 0x2f, 0x3d, 0x56, 0x5d, - 0x05, 0x70, 0x84, 0xf7, 0x1c, 0x07, 0xe4, 0x1b, 0xff, 0x8e, 0xd9, 0x88, - 0xac, 0xa8, 0x89, 0xac, 0x26, 0xbe, 0xa5, 0xbb, 0x3c, 0x87, 0x66, 0xf3, - 0xf9, 0xf2, 0xcb, 0xa1, 0xc3, 0x44, 0xe3, 0xdc, 0x55, 0x52, 0x92, 0x49, - 0x32, 0xe2, 0x1d, 0x7f, 0xe0, 0x08, 0x9f, 0x00, 0x91, 0x52, 0xe0, 0xdf, - 0x52, 0xc7, 0x8a, 0x08, 0x9e, 0x51, 0x70, 0xe6, 0xf1, 0x1c, 0x41, 0x23, - 0x7f, 0xbe, 0xb6, 0x32, 0x11, 0x2c, 0x16, 0xe3, 0x37, 0x60, 0x6a, 0x16, - 0xcf, 0x83, 0xb0, 0x32, 0x75, 0x04, 0x6e, 0x99, 0x43, 0x1e, 0xf2, 0xd2, - 0x8e, 0xa4, 0xf2, 0x04, 0x20, 0xc1, 0xd4, 0xc9, 0x05, 0xc4, 0xf8, 0x3a, - 0xe7, 0x5b, 0x58, 0x8b, 0x2b, 0xbc, 0xa6, 0x7b, 0x30, 0x07, 0xa5, 0xcf, - 0x2a, 0xff, 0xd5, 0x1e, 0xde, 0x88, 0x85, 0xf5, 0xc9, 0xe4, 0x95, 0xe8, - 0x85, 0xc8, 0x27, 0x43, 0x7e, 0x01, 0x75, 0xa6, 0x72, 0x84, 0x4c, 0x33, - 0x71, 0x9d, 0x0b, 0x1e, 0x99, 0xc7, 0x7b, 0xa3, 0xe4, 0x3f, 0x53, 0xe3, - 0xe1, 0x12, 0x98, 0xde, 0xa7, 0x50, 0x2f, 0x38, 0xbc, 0xfe, 0x8a, 0x9c, - 0x94, 0xb5, 0x1c, 0x4c, 0xb3, 0x3e, 0x4e, 0xb9, 0x9f, 0xaa, 0x06, 0xf1, - 0x56, 0x8f, 0x7c, 0x8a, 0x8a, 0xae, 0x56, 0xb4, 0x56, 0x33, 0x18, 0xc1, - 0xe5, 0x1e, 0x08, 0xad, 0xed, 0x77, 0x37, 0xe3, 0x1c, 0xc8, 0xc5, 0x89, - 0xc8, 0xd5, 0x86, 0xe4, 0x91, 0x9f, 0x71, 0x19, 0x84, 0xc0, 0xf8, 0x27, - 0xfc, 0xaa, 0xf5, 0xa4, 0x35, 0xdc, 0x33, 0xe8, 0x69, 0xa5, 0x09, 0xa5, - 0x1c, 0x5b, 0x45, 0x26, 0x4d, 0xa2, 0xe2, 0x2a, 0x6d, 0xb8, 0x1e, 0xa1, - 0xc2, 0xa2, 0x0d, 0x05, 0x57, 0xe4, 0x94, 0x26, 0xb1, 0xe3, 0xd5, 0x16, - 0xdc, 0x6f, 0x32, 0x15, 0xac, 0xdb, 0x03, 0x4b, 0xe3, 0xd5, 0xb9, 0xd4, - 0x92, 0xf0, 0xd0, 0x8a, 0x1d, 0x9f, 0x71, 0x4a, 0x7f, 0x30, 0x9b, 0xf7, - 0xc5, 0x89, 0x7a, 0xcd, 0xab, 0xba, 0x2c, 0xe7, 0xb0, 0x30, 0x15, 0x50, - 0xf1, 0x24, 0xe9, 0x8f, 0x20, 0x23, 0x98, 0x24, 0x91, 0x70, 0x2e, 0x4e, - 0xa8, 0x32, 0x0d, 0x6c, 0x80, 0x4a, 0xb2, 0xc6, 0x9b, 0xe7, 0x69, 0xc4, - 0x0b, 0xcd, 0x6c, 0x80, 0x7f, 0x18, 0x27, 0xf1, 0x58, 0x39, 0x79, 0x1d, - 0x12, 0x7a, 0xb5, 0xec, 0x31, 0xe9, 0xe4, 0x19, 0x27, 0x07, 0xbf, 0x9b, - 0x62, 0x34, 0xe1, 0x6f, 0xe5, 0x07, 0x4e, 0xe8, 0x16, 0xcc, 0x82, 0x5b, - 0xc0, 0xf0, 0xb5, 0x15, 0xf9, 0x52, 0x0f, 0x02, 0x3e, 0x76, 0x80, 0xbd, - 0xc1, 0x41, 0xaf, 0x90, 0xce, 0xbd, 0x80, 0xd9, 0xc2, 0x84, 0x35, 0xcd, - 0x6f, 0x79, 0xcb, 0x12, 0xd8, 0xf1, 0x02, 0xe8, 0x5e, 0xe3, 0xac, 0xca, - 0xd1, 0x29, 0x09, 0x63, 0x77, 0x91, 0x8a, 0x06, 0xb3, 0x3c, 0x44, 0x92, - 0x73, 0xcf, 0xb0, 0xf5, 0x11, 0x60, 0xf5, 0xb6, 0xc0, 0xb0, 0x15, 0x02, - 0x53, 0x79, 0x00, 0x27, 0xcb, 0x46, 0x8b, 0x0c, 0x74, 0x52, 0x15, 0x03, - 0x0c, 0x70, 0xf8, 0x31, 0x17, 0xd8, 0x0c, 0xb4, 0x03, 0xff, 0xbf, 0x72, - 0xb5, 0x68, 0x7d, 0x73, 0x13, 0x29, 0xdb, 0xcc, 0x09, 0x40, 0x0b, 0x18, - 0xc6, 0x80, 0xde, 0x56, 0x44, 0x49, 0x42, 0x38, 0x35, 0x16, 0xc9, 0xcf, - 0xe8, 0x2f, 0x58, 0x2d, 0xda, 0xea, 0x61, 0x6d, 0x6a, 0x61, 0x62, 0x49, - 0x14, 0x2a, 0xf6, 0x82, 0x57, 0x3f, 0x6d, 0xb8, 0x33, 0xd2, 0xe9, 0x2f, - 0x7e, 0x07, 0xee, 0x1e, 0x8c, 0xe8, 0x7e, 0xa7, 0x55, 0x0f, 0xa4, 0xf4, - 0x84, 0x7f, 0x56, 0xd4, 0xa0, 0x78, 0xea, 0x51, 0xb3, 0x31, 0xc3, 0x73, - 0x83, 0xbf, 0x96, 0xf5, 0xc4, 0x7b, 0x96, 0x49, 0x50, 0x8f, 0xa3, 0xbb, - 0x54, 0x2f, 0x41, 0xdf, 0xb6, 0x65, 0xa3, 0x1a, 0x54, 0x99, 0x66, 0xa6, - 0x1e, 0x76, 0x71, 0x50, 0xd4, 0x48, 0x57, 0x86, 0x85, 0x61, 0x18, 0xad, - 0x9a, 0x8e, 0xe4, 0x78, 0xd2, 0x11, 0x0d, 0xf3, 0xf0, 0xa2, 0x89, 0x30, - 0x7a, 0x39, 0x99, 0x19, 0x8b, 0x11, 0x43, 0xbe, 0xdd, 0xf4, 0xe8, 0xf4, - 0x9b, 0xb8, 0x3c, 0xf1, 0x39, 0xeb, 0xb5, 0x2c, 0x09, 0xf0, 0xcc, 0xc4, - 0x98, 0x77, 0x29, 0x4b, 0x95, 0x56, 0x1d, 0x6b, 0xe0, 0xb8, 0xe5, 0x83, - 0x48, 0x2f, 0x08, 0xa7, 0x0d, 0x10, 0x0c, 0xec, 0x92, 0xd0, 0x3d, 0x38, - 0x88, 0x47, 0xdd, 0x8d, 0x16, 0xe8, 0x08, 0x5b, 0x8e, 0x69, 0x83, 0x3c, - 0x38, 0x9a, 0xe8, 0xff, 0x26, 0xd9, 0x04, 0xfb, 0xea, 0xce, 0x2c, 0x31, - 0xd9, 0x58, 0xda, 0xee, 0xf9, 0xa9, 0x40, 0xaf, 0x08, 0x45, 0xfe, 0xf2, - 0x5b, 0xad, 0x99, 0xda, 0x90, 0xf8, 0x81, 0x3b, 0x69, 0x41, 0x54, 0xa4, - 0xac, 0x88, 0x9f, 0x22, 0x77, 0x43, 0x4a, 0x67, 0x91, 0xd5, 0x19, 0x16, - 0xff, 0xcf, 0xfa, 0xa0, 0x94, 0x4d, 0x4f, 0xe4, 0x9f, 0x82, 0x41, 0xcc, - 0xe1, 0x25, 0x4b, 0x75, 0x3a, 0xb7, 0x25, 0xe9, 0x81, 0x33, 0x67, 0x58, - 0x15, 0xd5, 0x2b, 0xed, 0x71, 0xbb, 0x19, 0x69, 0xe9, 0x15, 0x53, 0x62, - 0x29, 0x8d, 0xd9, 0x32, 0xb8, 0x0f, 0xd1, 0x5b, 0xe1, 0x29, 0x6f, 0x33, - 0x05, 0x7a, 0xd7, 0x2e, 0x43, 0xb9, 0x58, 0x81, 0x45, 0x5e, 0xb0, 0x58, - 0xe9, 0xf6, 0x75, 0xb0, 0xa4, 0xde, 0x42, 0x98, 0x53, 0xf3, 0x48, 0x47, - 0xaf, 0xe7, 0xe8, 0xae, 0x20, 0xdc, 0x98, 0x66, 0xf3, 0x88, 0x53, 0x1f, - 0xb2, 0xf9, 0x0f, 0x15, 0xe5, 0xb9, 0x85, 0xad, 0x05, 0xc1, 0xf1, 0x73, - 0x2a, 0x9b, 0x08, 0x36, 0xfd, 0xa6, 0x6b, 0x06, 0x74, 0x25, 0x44, 0xd9, - 0x62, 0xf0, 0x63, 0xbc, 0x47, 0xf9, 0x91, 0x13, 0x3f, 0x19, 0xb1, 0xd2, - 0xa0, 0x27, 0xed, 0xb5, 0x30, 0x1e, 0x7c, 0x8b, 0xe3, 0x09, 0xb7, 0x34, - 0xe6, 0xfb, 0x55, 0x28, 0x1a, 0xcc, 0x59, 0x71, 0x1f, 0xaa, 0xd1, 0x73, - 0x68, 0x4e, 0xc8, 0x2a, 0x73, 0x5e, 0x9d, 0x22, 0xb1, 0xe2, 0x6c, 0x85, - 0x03, 0x2b, 0x6e, 0x87, 0x0f, 0xe3, 0x77, 0x4a, 0x3e, 0xd0, 0xe8, 0xea, - 0x9f, 0x15, 0x22, 0x25, 0xbe, 0xa5, 0x88, 0xee, 0x06, 0x7b, 0xb9, 0x87, - 0x24, 0x20, 0x0a, 0x18, 0xc5, 0x08, 0x4f, 0x94, 0x87, 0xf8, 0x9a, 0xe5, - 0x9b, 0x5e, 0xd5, 0xc8, 0xf5, 0x38, 0xc3, 0xbf, 0x81, 0x7f, 0x59, 0xb7, - 0x6e, 0x56, 0x86, 0xed, 0xd2, 0x60, 0x17, 0xbd, 0xda, 0x95, 0x25, 0x27, - 0x9f, 0x8b, 0x9d, 0xc3, 0x57, 0xe6, 0xc0, 0x65, 0xa5, 0x85, 0xf1, 0xba, - 0x17, 0x75, 0x6d, 0x7a, 0x83, 0xe3, 0xdb, 0x90, 0x49, 0x21, 0x30, 0x5e, - 0x21, 0xe5, 0x29, 0x57, 0x46, 0xe7, 0x49, 0xb2, 0x73, 0x31, 0xa7, 0x47, - 0x03, 0x4b, 0xdd, 0x7b, 0x34, 0x8a, 0x79, 0x5a, 0xe0, 0x83, 0x29, 0x22, - 0x24, 0x5a, 0xf1, 0x6c, 0xc8, 0x46, 0x9a, 0x1a, 0xf1, 0x2c, 0x04, 0x84, - 0x10, 0x84, 0xe0, 0x2a, 0x8c, 0xcf, 0x6b, 0x3a, 0x22, 0xe1, 0x41, 0xdc, - 0x70, 0x93, 0x13, 0x13, 0x5e, 0xb6, 0x04, 0x85, 0xb6, 0xb7, 0x12, 0xf6, - 0x46, 0xf2, 0xf2, 0xb7, 0x7e, 0x33, 0x4c, 0x51, 0x60, 0x32, 0xc9, 0xa2, - 0x77, 0xda, 0xaf, 0x65, 0x49, 0x8c, 0x0e, 0xbd, 0x89, 0x0c, 0xd8, 0x72, - 0xe1, 0xdb, 0x50, 0x2a, 0x88, 0xf9, 0xf1, 0x0b, 0xcb, 0xb4, 0xf7, 0xd6, - 0x51, 0x5f, 0x58, 0x52, 0x8f, 0x4b, 0xfc, 0x04, 0xf9, 0x9c, 0x29, 0x2d, - 0x68, 0x0f, 0xc6, 0xe8, 0x89, 0x7b, 0xfb, 0x4d, 0xff, 0x3a, 0x8f, 0x36, - 0x6b, 0x81, 0x35, 0xa8, 0x7a, 0xe8, 0x59, 0xe6, 0x03, 0x0a, 0xe2, 0x8e, - 0xb7, 0xfd, 0x7b, 0x10, 0xfa, 0xe0, 0xa3, 0xd2, 0x18, 0x7c, 0xe2, 0xe3, - 0x12, 0x81, 0x74, 0x12, 0x2d, 0x40, 0x43, 0x99, 0xd4, 0xad, 0x30, 0xd5, - 0x36, 0xde, 0x09, 0x35, 0x85, 0x1b, 0x24, 0x1b, 0x6f, 0xc8, 0xdc, 0xcf, - 0xff, 0x72, 0x27, 0xbd, 0x9e, 0xcf, 0x75, 0x16, 0x72, 0x1c, 0x97, 0x4b, - 0x31, 0xb3, 0xd9, 0xaf, 0xe9, 0x7c, 0xb0, 0x8d, 0x0e, 0x19, 0xf4, 0x23, - 0x12, 0x3b, 0xc0, 0x8f, 0x75, 0x1a, 0xf1, 0xaf, 0xb0, 0xe1, 0x45, 0x04, - 0x2f, 0xa6, 0xce, 0x76, 0xe3, 0x64, 0xb8, 0xe2, 0xa9, 0xac, 0xee, 0x8e, - 0xe6, 0x50, 0x7d, 0x40, 0x88, 0xcf, 0x13, 0x4c, 0xed, 0xfe, 0xbb, 0x62, - 0x6a, 0x0d, 0x62, 0x8c, 0x83, 0x2d, 0x16, 0x24, 0xf9, 0x0f, 0x44, 0x72, - 0x04, 0x22, 0x54, 0xc4, 0xba, 0x66, 0xc0, 0xd6, 0x56, 0x56, 0x18, 0x69, - 0x6e, 0x6c, 0x2b, 0x47, 0xb0, 0x3e, 0xab, 0x27, 0xc1, 0xad, 0x4f, 0x23, - 0x60, 0x55, 0xa2, 0xf1, 0xd6, 0x27, 0x93, 0x79, 0x3b, 0x3e, 0x3e, 0xda, - 0x61, 0x09, 0xe0, 0x19, 0xa7, 0xab, 0x8b, 0x83, 0x47, 0x5a, 0xdb, 0x06, - 0x7e, 0x61, 0xf7, 0x89, 0x4e, 0x40, 0x6c, 0x4f, 0xca, 0x3b, 0xbb, 0x87, - 0xf6, 0x35, 0x50, 0x18, 0x41, 0x37, 0xb2, 0xed, 0x61, 0xbb, 0x65, 0x01, - 0x19, 0x1b, 0xd2, 0x2c, 0x16, 0x33, 0xe9, 0x8d, 0x43, 0x6e, 0x27, 0xef, - 0x3f, 0xb0, 0x9b, 0xa7, 0x14, 0xfc, 0xea, 0x51, 0x8c, 0x6d, 0x2a, 0x88, - 0x28, 0x09, 0xf2, 0x2f, 0x3b, 0x0a, 0x16, 0x36, 0x99, 0xf0, 0xd6, 0x26, - 0xe4, 0xf5, 0x7b, 0xaf, 0x08, 0x92, 0x1f, 0x79, 0xaf, 0x7a, 0x25, 0x29, - 0x60, 0xed, 0x07, 0xb3, 0x0a, 0x48, 0xcd, 0x92, 0x1d, 0x5b, 0x8e, 0x72, - 0x8f, 0xa5, 0x48, 0xdd, 0xfa, 0x64, 0xb3, 0xcf, 0x7c, 0x30, 0x01, 0x94, - 0xe1, 0x3e, 0x50, 0xc1, 0x9e, 0x75, 0xaa, 0xd2, 0x85, 0x33, 0x4c, 0x62, - 0x00, 0xe1, 0xd3, 0xad, 0xd9, 0x0c, 0x4b, 0xed, 0x5b, 0xee, 0xcd, 0xc5, - 0x8a, 0xb6, 0x05, 0x15, 0x09, 0x51, 0x9a, 0x9e, 0x38, 0x4f, 0x19, 0xee, - 0xe8, 0x2a, 0x6c, 0x41, 0xa4, 0x12, 0x23, 0x04, 0xb7, 0x1c, 0x5a, 0xea, - 0xc4, 0x93, 0x7d, 0x34, 0x12, 0xdc, 0x2f, 0x6b, 0x1e, 0x67, 0xd8, 0x6d, - 0xaa, 0xa1, 0x42, 0x95, 0xd2, 0x7a, 0x33, 0xbd, 0x8f, 0x5d, 0x58, 0x8c, - 0x3d, 0x6c, 0x25, 0x35, 0x24, 0x84, 0x2e, 0x03, 0x4b, 0x66, 0x9a, 0xcf, - 0xcb, 0xdc, 0xee, 0x4a, 0x42, 0x7b, 0x3e, 0x61, 0x83, 0x14, 0x5b, 0x35, - 0x8c, 0xc8, 0x55, 0x55, 0x66, 0x99, 0xc8, 0x60, 0xfa, 0xbe, 0x48, 0x20, - 0x0b, 0x23, 0xfe, 0xfd, 0x6e, 0xd9, 0xd4, 0x76, 0xf4, 0xdc, 0xff, 0xb3, - 0xfb, 0xc0, 0xbc, 0x1c, 0x36, 0x02, 0x26, 0x75, 0x4d, 0x8c, 0xc3, 0x58, - 0x66, 0x16, 0xd2, 0x4d, 0xa3, 0x21, 0x45, 0xa0, 0xd6, 0x53, 0xf9, 0xdb, - 0xf8, 0xee, 0x4e, 0xba, 0xc2, 0x3a, 0x30, 0x99, 0x6c, 0x3b, 0x89, 0xc3, - 0xd3, 0xdd, 0x09, 0x53, 0x86, 0xcb, 0x84, 0xbf, 0x05, 0x7e, 0xc4, 0xcd, - 0xb8, 0x60, 0x40, 0xb9, 0x2a, 0xa7, 0x01, 0x66, 0x89, 0x37, 0xb9, 0x83, - 0xcc, 0xba, 0x63, 0x7e, 0x0a, 0x32, 0xa8, 0xeb, 0x06, 0x6b, 0xaa, 0xfd, - 0x79, 0x6e, 0x98, 0x77, 0x66, 0xa3, 0xac, 0xde, 0xe8, 0x14, 0x47, 0xe2, - 0x96, 0x74, 0x00, 0xa0, 0xfc, 0x6e, 0x09, 0x19, 0x80, 0x3b, 0x40, 0x00, - 0x37, 0xdd, 0x69, 0x18, 0xa9, 0x77, 0x1c, 0x69, 0x27, 0x78, 0x67, 0xa9, - 0x66, 0xe3, 0x40, 0x69, 0xf8, 0x5e, 0x46, 0x67, 0xe5, 0xf9, 0xee, 0x91, - 0x01, 0x6e, 0x7a, 0xa1, 0xd3, 0x62, 0x58, 0xc5, 0xc2, 0x05, 0x66, 0xec, - 0x53, 0x95, 0x85, 0x17, 0xdf, 0x2e, 0x4a, 0x4d, 0x1f, 0x58, 0xf1, 0xbe, - 0xaf, 0xc4, 0x2e, 0x6e, 0x78, 0x28, 0x2a, 0xcc, 0x54, 0x70, 0x25, 0x6e, - 0x90, 0x47, 0xce, 0xe7, 0x20, 0x79, 0xdd, 0xf7, 0x7f, 0xb5, 0xa6, 0xfb, - 0x78, 0xc4, 0x74, 0x62, 0x3e, 0x6f, 0xa0, 0x3b, 0x16, 0x99, 0xba, 0x71, - 0x35, 0x64, 0x14, 0xe6, 0x4d, 0x6e, 0x63, 0x2d, 0x28, 0xac, 0x55, 0x6c, - 0xfa, 0x2f, 0x63, 0xbb, 0xde, 0x0f, 0x19, 0x8b, 0x70, 0x4b, 0xc6, 0xa6, - 0x35, 0xc5, 0xae, 0xf5, 0xd0, 0x96, 0xbb, 0x27, 0xb6, 0x75, 0x93, 0x28, - 0x2f, 0x95, 0xad, 0x92, 0xcb, 0x5c, 0x27, 0x8d, 0xd3, 0x0c, 0x48, 0x4b, - 0xe9, 0x4c, 0x62, 0x4d, 0xe8, 0xcc, 0x92, 0x66, 0x48, 0x2c, 0x09, 0xcb, - 0xb4, 0xf7, 0x2e, 0xb4, 0x29, 0x66, 0x44, 0xf2, 0x8a, 0x26, 0xd8, 0x67, - 0x05, 0x2d, 0x0a, 0x81, 0xd5, 0xb8, 0x64, 0xf9, 0xe1, 0xe5, 0x46, 0x4e, - 0xde, 0xf1, 0xf6, 0x7b, 0x3c, 0xc4, 0x3b, 0x78, 0x3b, 0x00, 0xd6, 0x46, - 0x42, 0x5d, 0xda, 0x67, 0xae, 0xff, 0x2a, 0x4d, 0x05, 0x56, 0x11, 0xca, - 0xa8, 0x6c, 0x67, 0xf8, 0xfa, 0x46, 0x84, 0xf4, 0xd7, 0x20, 0xea, 0xfb, - 0xb6, 0xae, 0x61, 0x28, 0xb0, 0xf8, 0x75, 0xdf, 0x99, 0x34, 0xb4, 0x8a, - 0xf0, 0xfd, 0x31, 0xf2, 0x84, 0xe5, 0x1d, 0xf7, 0xdc, 0x9e, 0x7b, 0x2a, - 0xf3, 0x0d, 0xef, 0x05, 0xa6, 0xe4, 0xf6, 0xab, 0xe1, 0x3f, 0x10, 0x73, - 0x8b, 0xf6, 0xbc, 0xfb, 0xe2, 0x85, 0xcb, 0x75, 0x79, 0x71, 0x77, 0xa3, - 0x2b, 0xf3, 0x14, 0x31, 0x3b, 0x95, 0x9f, 0xcd, 0xca, 0x63, 0x5d, 0xd8, - 0x81, 0x31, 0xfa, 0x9e, 0x09, 0x47, 0x46, 0x99, 0x4d, 0x04, 0xe8, 0x32, - 0x6a, 0x8c, 0x23, 0x2b, 0xd9, 0xba, 0x0f, 0x98, 0x69, 0x62, 0xc9, 0xc6, - 0xce, 0x27, 0xf0, 0x63, 0x91, 0xce, 0xc5, 0xd0, 0x90, 0x6f, 0xb5, 0xd0, - 0xc9, 0x6a, 0x92, 0xd3, 0x64, 0x5a, 0x10, 0xb5, 0x0a, 0x3a, 0x24, 0x3d, - 0x45, 0x0b, 0xec, 0xa4, 0x84, 0x99, 0xbf, 0x4b, 0x6d, 0x09, 0xd7, 0xba, - 0x69, 0xd3, 0xfe, 0x86, 0x43, 0x46, 0xad, 0xcb, 0xf8, 0x1d, 0x3f, 0xb1, - 0xde, 0x93, 0xdb, 0x50, 0x84, 0xd5, 0x86, 0xc5, 0xec, 0xd1, 0x3d, 0xbf, - 0xce, 0xff, 0xd8, 0x63, 0xa3, 0x27, 0x40, 0xf4, 0x82, 0xbb, 0x9c, 0x0e, - 0xc9, 0x4e, 0x1c, 0x36, 0xfa, 0xbd, 0xc1, 0xb5, 0xc3, 0x13, 0x05, 0xa5, - 0xf8, 0xf3, 0xa5, 0xf2, 0x1b, 0x0f, 0x06, 0xe1, 0x6e, 0x15, 0x1d, 0x25, - 0xc5, 0x95, 0xb8, 0x35, 0x29, 0x31, 0x4f, 0x17, 0x9f, 0x33, 0x34, 0x0a, - 0x6d, 0x88, 0x97, 0xbf, 0x95, 0x73, 0x0b, 0x05, 0xe2, 0x8c, 0x58, 0xf1, - 0xff, 0xea, 0xac, 0xe1, 0x26, 0x75, 0xd3, 0x3c, 0x2e, 0xea, 0x0e, 0xd0, - 0xdd, 0x27, 0x23, 0xce, 0xbd, 0xd1, 0x2d, 0xec, 0xbf, 0xcc, 0xc1, 0xb4, - 0xf5, 0x57, 0xeb, 0x4c, 0x4a, 0xab, 0x8d, 0x48, 0xed, 0xbe, 0xa7, 0x6b, - 0x46, 0x06, 0xaa, 0xe2, 0x3e, 0xf1, 0x34, 0x8b, 0xe0, 0x04, 0x95, 0x55, - 0xd1, 0xde, 0x21, 0x53, 0xfe, 0x87, 0x7e, 0x4f, 0x3a, 0xb6, 0xbc, 0x30, - 0xdd, 0xbd, 0x20, 0x3c, 0xd1, 0x05, 0x27, 0x33, 0x1b, 0x56, 0x35, 0x6d, - 0x5b, 0xde, 0xc6, 0xf3, 0xe2, 0xbb, 0x31, 0x0d, 0x90, 0xdb, 0x3e, 0xbd, - 0xbd, 0xae, 0x9e, 0x73, 0x77, 0x4a, 0x97, 0xaf, 0x9d, 0x78, 0xfd, 0xc4, - 0xf8, 0xb5, 0x67, 0x87, 0x0c, 0xd5, 0x0b, 0xbf, 0xed, 0xb8, 0x59, 0x22, - 0x5d, 0x4f, 0x2b, 0x1e, 0x01, 0x1c, 0x80, 0xc0, 0x81, 0x4c, 0x0d, 0x78, - 0x6a, 0xbd, 0x88, 0xd0, 0xab, 0xc3, 0xc4, 0x9f, 0x13, 0xc9, 0xd7, 0x59, - 0x8a, 0x3d, 0x1c, 0x3a, 0x27, 0x8c, 0xac, 0x5a, 0x67, 0xc6, 0xe8, 0x7c, - 0x83, 0xda, 0xe1, 0xbc, 0x17, 0xd4, 0x04, 0xc0, 0xdd, 0x26, 0x1a, 0x7c, - 0x4b, 0xe3, 0x53, 0x64, 0xf3, 0x3f, 0x9d, 0xaa, 0xba, 0x7b, 0x90, 0x0b, - 0xaa, 0x8e, 0x02, 0xfa, 0xc4, 0x7e, 0x47, 0xc8, 0x8f, 0xc5, 0x95, 0x9e, - 0x92, 0xa1, 0xa4, 0x25, 0x62, 0x73, 0xe7, 0x79, 0x5b, 0x8e, 0x97, 0x7d, - 0xda, 0x80, 0x19, 0x40, 0x89, 0x93, 0x5d, 0xa3, 0x9c, 0xa7, 0x62, 0x60, - 0x62, 0xa2, 0xf6, 0x2f, 0x19, 0x90, 0x66, 0xb6, 0x49, 0x11, 0xed, 0x9b, - 0x55, 0xf1, 0x68, 0x3d, 0x33, 0x59, 0x96, 0xef, 0x28, 0x5f, 0xfb, 0x9f, - 0x95, 0x38, 0x74, 0xd4, 0xf0, 0x35, 0x05, 0x92, 0xb5, 0xc5, 0x6a, 0x18, - 0x1f, 0x45, 0x2a, 0x72, 0x6f, 0x03, 0x79, 0xec, 0x74, 0xbb, 0x38, 0x25, - 0xaf, 0xf0, 0xfa, 0x6e, 0x62, 0x11, 0x26, 0x18, 0x15, 0x11, 0xc2, 0xad, - 0x06, 0x85, 0x74, 0x87, 0x2a, 0x44, 0x17, 0x46, 0x33, 0xf1, 0x92, 0xc5, - 0x3f, 0x62, 0x4a, 0x16, 0xf2, 0x67, 0x9f, 0x3a, 0xa1, 0xbb, 0xa8, 0xf8, - 0xf0, 0x8b, 0xe6, 0x77, 0x6c, 0x13, 0x5e, 0x53, 0xc3, 0x7a, 0x48, 0xd2, - 0x00, 0x02, 0x90, 0x3a, 0xc3, 0x96, 0x6f, 0x05, 0xb2, 0x61, 0x8a, 0x53, - 0x78, 0xcf, 0xf7, 0xcf, 0xb9, 0x23, 0x01, 0xbc, 0x27, 0x82, 0xf0, 0x59, - 0xd8, 0x7b, 0xbe, 0xde, 0xf1, 0x2b, 0x19, 0x02, 0xad, 0xc8, 0x26, 0x30, - 0x23, 0x99, 0x76, 0xb3, 0xf1, 0x9f, 0x0d, 0x94, 0x79, 0x13, 0x69, 0x0e, - 0xa7, 0xff, 0xe5, 0x08, 0x65, 0x89, 0x57, 0x98, 0x46, 0x16, 0x0d, 0x97, - 0x59, 0x05, 0x44, 0xec, 0x96, 0x2b, 0xb1, 0x9c, 0xe4, 0x96, 0xd0, 0xb5, - 0xec, 0x2f, 0x15, 0x38, 0xbc, 0xb1, 0x96, 0x44, 0x20, 0x4a, 0x0d, 0x9d, - 0x81, 0x51, 0x82, 0x3a, 0xe9, 0xc2, 0x93, 0x15, 0x75, 0x89, 0x9d, 0x2e, - 0x28, 0x5a, 0x6b, 0xb5, 0xef, 0x4c, 0xa4, 0x3c, 0x00, 0xc3, 0x32, 0x2a, - 0xca, 0x8c, 0xa3, 0x6a, 0xda, 0x92, 0x2b, 0x66, 0x7b, 0x07, 0x55, 0x27, - 0xeb, 0xc5, 0x99, 0x57, 0x39, 0xd0, 0x37, 0x43, 0x93, 0xe3, 0xc5, 0xa3, - 0xf7, 0xeb, 0xe4, 0x04, 0x80, 0x07, 0x34, 0x60, 0xca, 0x66, 0x10, 0x2b, - 0x4d, 0x84, 0x04, 0x35, 0x89, 0xf2, 0xab, 0x65, 0x19, 0x79, 0x26, 0x97, - 0x2c, 0x33, 0xdd, 0x3d, 0xa2, 0xd9, 0x1e, 0x28, 0x4d, 0x6e, 0x1d, 0xee, - 0xf5, 0xe7, 0xb7, 0x4b, 0x81, 0x9b, 0x1e, 0x8f, 0xb4, 0xba, 0x87, 0x48, - 0xe1, 0x58, 0x71, 0x85, 0x71, 0xb0, 0xfc, 0x08, 0xe8, 0x61, 0xfe, 0x18, - 0x4f, 0xb3, 0x51, 0x8b, 0x2f, 0xc1, 0x41, 0x41, 0xb9, 0xac, 0x7a, 0x3a, - 0x32, 0xf8, 0x3f, 0x15, 0xf1, 0xd2, 0x22, 0x2b, 0x1e, 0xcb, 0x9c, 0xa5, - 0x99, 0x1c, 0x9d, 0x20, 0x7f, 0x1a, 0x29, 0x95, 0x8b, 0x7e, 0x30, 0x00, - 0xdb, 0x2f, 0x05, 0x3d, 0xdf, 0x6a, 0xc3, 0x12, 0x55, 0x6a, 0x42, 0x96, - 0x26, 0xfb, 0x75, 0x8d, 0xd2, 0xd7, 0x33, 0x4c, 0xe4, 0x47, 0x77, 0xc9, - 0x69, 0xe9, 0x44, 0x86, 0x3b, 0x11, 0x27, 0xb5, 0xdd, 0x43, 0x2c, 0xae, - 0x3a, 0xfb, 0x77, 0x90, 0xd7, 0xef, 0xb2, 0x2a, 0x11, 0x4d, 0xe8, 0xf6, - 0x11, 0xfe, 0x64, 0xed, 0x74, 0x4b, 0xa1, 0x41, 0x80, 0x20, 0x0e, 0x1e, - 0x1d, 0xac, 0x99, 0xdd, 0x8b, 0x47, 0x46, 0x31, 0x26, 0x9c, 0xfa, 0xc1, - 0x60, 0xf9, 0x35, 0xd3, 0x5a, 0xd9, 0x67, 0x3d, 0x33, 0x1c, 0x92, 0x8b, - 0x8d, 0xaa, 0xde, 0xca, 0x1d, 0xfb, 0x1b, 0xc9, 0x98, 0x13, 0xcf, 0x69, - 0x57, 0xb6, 0x7f, 0x0a, 0x09, 0x6c, 0xbc, 0xd0, 0x32, 0xad, 0x3b, 0xde, - 0x19, 0x4c, 0xa4, 0xd4, 0xf7, 0x81, 0xe9, 0xae, 0xf1, 0x65, 0xdf, 0x8c, - 0xbf, 0x7c, 0xea, 0xf6, 0x7d, 0x33, 0xf5, 0xf3, 0x77, 0xb0, 0xc4, 0x28, - 0x27, 0xe4, 0x20, 0x56, 0xbf, 0x3d, 0x14, 0x52, 0x60, 0x3d, 0x37, 0x91, - 0xba, 0x0e, 0x8e, 0x75, 0x7a, 0x7e, 0x60, 0xda, 0xfb, 0x6f, 0x7f, 0xd5, - 0x7f, 0xb6, 0x81, 0xba, 0xd9, 0xf1, 0x90, 0x8d, 0x6a, 0xa9, 0xfe, 0xdd, - 0x8a, 0x77, 0x9c, 0xca, 0x4d, 0xcc, 0x26, 0x35, 0xfc, 0x18, 0x5b, 0x01, - 0xb5, 0x2a, 0xcd, 0xc0, 0xfd, 0xfe, 0xe0, 0xd6, 0xc5, 0x3e, 0x4a, 0x5b, - 0x3c, 0x8b, 0x5c, 0x8c, 0xc2, 0xe7, 0x85, 0x3e, 0xb4, 0xd1, 0x48, 0x49, - 0x1c, 0xf4, 0xf6, 0xe5, 0x61, 0x9a, 0xd7, 0xc0, 0x5f, 0x59, 0xdd, 0x65, - 0x9b, 0x30, 0x6d, 0x15, 0x0a, 0xd9, 0x35, 0x2d, 0x9d, 0x1e, 0x94, 0x2d, - 0x2e, 0xad, 0x97, 0x29, 0x32, 0x1a, 0xaf, 0x1f, 0x39, 0x95, 0xa5, 0x2c, - 0xad, 0x30, 0x96, 0x3a, 0x46, 0x99, 0x5e, 0x5f, 0x1f, 0xa6, 0x17, 0x3b, - 0xe7, 0x7d, 0x7b, 0x39, 0x78, 0xc7, 0x72, 0xf6, 0x0e, 0xe8, 0xd9, 0x5e, - 0x5c, 0x5f, 0x42, 0x47, 0x14, 0x9b, 0x6b, 0x3e, 0xa9, 0x90, 0x07, 0x19, - 0x10, 0x22, 0xd5, 0x7c, 0x3b, 0x47, 0x5c, 0xa9, 0xa7, 0xe3, 0x65, 0x93, - 0xb4, 0x52, 0x4a, 0x64, 0x86, 0x59, 0xa4, 0xe1, 0x10, 0xa2, 0xcb, 0x4e, - 0x03, 0x39, 0x1e, 0x3d, 0x98, 0x82, 0xac, 0x44, 0xbd, 0x0b, 0x36, 0x91, - 0x63, 0x67, 0x99, 0x66, 0x17, 0x74, 0xda, 0x1a, 0x7a, 0xeb, 0xea, 0x83, - 0x4d, 0x2f, 0xfd, 0x63, 0x6c, 0x96, 0x4e, 0x20, 0xa6, 0xf3, 0x75, 0x2d, - 0x63, 0x5a, 0x00, 0xa0, 0x24, 0x7d, 0xd2, 0x43, 0x7f, 0x93, 0xf1, 0xaa, - 0xb0, 0x34, 0xf0, 0x4b, 0xf1, 0xed, 0x7b, 0x48, 0x7a, 0x20, 0xdb, 0x4c, - 0x80, 0xc2, 0x8e, 0x19, 0x13, 0xa1, 0x90, 0xab, 0x11, 0x3d, 0x44, 0x48, - 0x0b, 0xa0, 0xc5, 0xc7, 0x80, 0x4a, 0xd9, 0x7b, 0x88, 0x25, 0x0a, 0x88, - 0x88, 0x8d, 0x0b, 0xee, 0x54, 0x27, 0x93, 0x40, 0x5d, 0xc1, 0x2d, 0x0a, - 0x4f, 0x8e, 0x47, 0xd7, 0xc1, 0xe0, 0x34, 0x00, 0xce, 0xe0, 0x83, 0xdc, - 0x90, 0x73, 0xac, 0xd3, 0xb3, 0x85, 0x5f, 0x78, 0x2b, 0xf6, 0xce, 0xe5, - 0x8e, 0x3e, 0xce, 0xa9, 0x40, 0x90, 0x00, 0xe3, 0xb0, 0x7a, 0xfb, 0x98, - 0xba, 0xd5, 0xef, 0x17, 0x04, 0x5e, 0xb5, 0x26, 0x18, 0x4f, 0xa5, 0x0f, - 0x07, 0x2c, 0x47, 0xc0, 0xcc, 0x17, 0xc8, 0xe5, 0x71, 0x74, 0x60, 0x2b, - 0x18, 0xe7, 0x6b, 0xad, 0xe9, 0x34, 0x69, 0x5d, 0x8c, 0x17, 0xdc, 0xab, - 0xc5, 0x59, 0xd9, 0x05, 0xbe, 0x75, 0x19, 0x9c, 0xb8, 0x0e, 0x89, 0x27, - 0x45, 0xea, 0xcd, 0x5e, 0xf2, 0xfe, 0x45, 0x69, 0x6f, 0x02, 0x8c, 0xa3, - 0xaf, 0x1c, 0x26, 0x57, 0x02, 0x38, 0x47, 0x48, 0x1e, 0xe3, 0x46, 0xf0, - 0xb1, 0x99, 0x9b, 0x49, 0x96, 0xbb, 0xcf, 0xfb, 0x68, 0xa2, 0x18, 0x42, - 0xfd, 0x10, 0x62, 0xce, 0xc0, 0x6b, 0xe5, 0x87, 0x9a, 0x43, 0xf1, 0x85, - 0x7e, 0x62, 0x77, 0xe5, 0xb7, 0x4a, 0xf1, 0x8a, 0x74, 0xea, 0x87, 0xe4, - 0x5c, 0xea, 0xfc, 0x40, 0xf7, 0x29, 0x1b, 0x1c, 0x34, 0xdd, 0xc7, 0x14, - 0xa2, 0xc6, 0xda, 0xa0, 0xa6, 0xb4, 0x33, 0xee, 0x54, 0x8d, 0xc1, 0x2c, - 0x60, 0x77, 0x33, 0xd2, 0xe8, 0xde, 0x78, 0x6b, 0x4f, 0x1e, 0xe5, 0x6f, - 0xc5, 0x24, 0x54, 0x50, 0xe8, 0xce, 0xa0, 0x9b, 0x03, 0xd4, 0x39, 0x5f, - 0x7e, 0x08, 0xd3, 0x2c, 0x1a, 0x69, 0x44, 0xf8, 0x7b, 0x15, 0xc0, 0xbe, - 0x45, 0xcb, 0x50, 0x7b, 0xc6, 0xc6, 0x9c, 0x42, 0x80, 0xe5, 0x2c, 0x00, - 0xde, 0x06, 0xe0, 0x0c, 0x15, 0x11, 0xa4, 0xf3, 0xb1, 0x2c, 0x0d, 0x1e, - 0xf5, 0xdd, 0xd2, 0x68, 0x5e, 0x3c, 0xb4, 0xab, 0x4b, 0xfc, 0x7e, 0xad, - 0xb2, 0x26, 0x96, 0x7d, 0xb8, 0xe3, 0x4f, 0xf0, 0x0b, 0xe2, 0xcf, 0x79, - 0x8f, 0x3e, 0x2e, 0x06, 0x5a, 0x96, 0x8b, 0x4e, 0x66, 0x0f, 0x9e, 0x24, - 0xcd, 0xa3, 0x4d, 0x95, 0xc2, 0xd5, 0x67, 0x73, 0xda, 0xf5, 0x8e, 0x78, - 0x3e, 0x6b, 0xe0, 0xe9, 0x64, 0x5f, 0x3c, 0xb5, 0x59, 0xa2, 0x27, 0xa9, - 0xcb, 0x93, 0x0c, 0x1e, 0x0c, 0x86, 0x90, 0xfc, 0x56, 0x66, 0x97, 0x10, - 0xfc, 0xd6, 0xed, 0x4c, 0xff, 0xc0, 0x76, 0x81, 0x3a, 0xb6, 0xf1, 0xbc, - 0x6e, 0x28, 0x52, 0xe5, 0x72, 0xd6, 0xb8, 0xd9, 0x86, 0x23, 0xad, 0xa9, - 0xbb, 0xc6, 0x45, 0xfe, 0xe0, 0xa0, 0x56, 0x07, 0x09, 0x39, 0x7b, 0xfa, - 0xe3, 0x5c, 0x46, 0x94, 0x3c, 0x69, 0x40, 0xf8, 0x2e, 0x42, 0x6d, 0x08, - 0x57, 0x16, 0x28, 0xbf, 0xb2, 0x13, 0x58, 0x49, 0x6e, 0x55, 0x34, 0xcb, - 0x27, 0xa3, 0x43, 0x8b, 0xc5, 0xd2, 0xbe, 0xda, 0x71, 0xb7, 0xcc, 0xe4, - 0x55, 0x8c, 0x5c, 0x0f, 0x7c, 0x42, 0xf4, 0x18, 0xf5, 0xa0, 0xca, 0xc0, - 0x67, 0x88, 0xf4, 0x65, 0x47, 0xad, 0x20, 0x9f, 0x99, 0x3c, 0x5b, 0x72, - 0xb1, 0x71, 0xce, 0x24, 0xc0, 0x36, 0x9d, 0x61, 0xe7, 0xb6, 0x74, 0xee, - 0xc5, 0xa3, 0xa3, 0x8d, 0xd8, 0xb0, 0xd8, 0x5a, 0xcb, 0xda, 0xb2, 0x6c, - 0xbd, 0x9e, 0xfe, 0xc8, 0xd7, 0x72, 0xbb, 0xae, 0x12, 0x1b, 0xe8, 0x44, - 0xf4, 0x43, 0xb5, 0x48, 0x86, 0x91, 0xca, 0x82, 0x67, 0x75, 0x58, 0x88, - 0xd8, 0x92, 0xd2, 0xf8, 0x7d, 0x73, 0x5b, 0x90, 0x24, 0xcd, 0x43, 0x07, - 0xdd, 0x5d, 0xa5, 0x41, 0xbe, 0x9a, 0xea, 0x52, 0x59, 0xa1, 0x93, 0x23, - 0x11, 0x39, 0xaa, 0x95, 0x94, 0x97, 0x45, 0x82, 0x4e, 0x9a, 0xff, 0xc8, - 0x6f, 0xa9, 0x83, 0x96, 0xd8, 0x90, 0x4d, 0x2a, 0x1b, 0x2c, 0xc3, 0xdb, - 0x27, 0x33, 0x60, 0xd4, 0xb1, 0xe8, 0x0e, 0x44, 0xf1, 0x40, 0xb5, 0x72, - 0x97, 0x77, 0x49, 0x06, 0xca, 0x2a, 0x45, 0x9f, 0x68, 0x63, 0x01, 0x21, - 0xf7, 0x9a, 0x99, 0x72, 0x4d, 0x7c, 0x05, 0x96, 0xab, 0xe3, 0x3b, 0x77, - 0x0f, 0xbd, 0xc1, 0x8e, 0x51, 0x22, 0x0c, 0x8c, 0xb6, 0x05, 0x03, 0x28, - 0xf8, 0x01, 0x6e, 0xbf, 0x97, 0xf1, 0x27, 0x3e, 0x38, 0x49, 0x41, 0xd9, - 0xa3, 0x89, 0x06, 0x3a, 0x7d, 0x18, 0x11, 0x68, 0x92, 0x8b, 0xe3, 0xba, - 0x4c, 0x59, 0x01, 0x6c, 0xf9, 0xb7, 0x54, 0xb2, 0xed, 0x22, 0xf3, 0x0d, - 0xe2, 0xd0, 0x88, 0xfa, 0x1d, 0x12, 0x1a, 0xed, 0xc3, 0x0f, 0x19, 0xa3, - 0xfe, 0xe8, 0xc3, 0xda, 0x96, 0x15, 0x6d, 0x48, 0x75, 0xc7, 0x24, 0x12, - 0x2f, 0xfc, 0xaf, 0x60, 0xbe, 0xe6, 0x9c, 0x39, 0x98, 0xbd, 0x86, 0xbd, - 0xaa, 0xd5, 0x5d, 0xaf, 0xb9, 0xea, 0xf8, 0x85, 0x56, 0x5c, 0x3c, 0x5e, - 0xbf, 0xbe, 0xe0, 0x15, 0xeb, 0x49, 0x7c, 0x5d, 0x8b, 0xe1, 0xfd, 0xb5, - 0xe8, 0x5e, 0xfa, 0x91, 0x9d, 0x5d, 0x01, 0xa4, 0x3a, 0x29, 0x7d, 0xfa, - 0x58, 0x41, 0x77, 0xb5, 0x84, 0xec, 0xed, 0x4d, 0xb8, 0x12, 0xfb, 0x91, - 0x48, 0xd7, 0xf8, 0x0d, 0x3e, 0x06, 0xf9, 0x49, 0x19, 0x85, 0x69, 0xde, - 0x24, 0x92, 0x9b, 0xc9, 0x15, 0x67, 0x8e, 0xd7, 0xe9, 0x9e, 0x4f, 0x9c, - 0xfb, 0xb3, 0x66, 0xf9, 0x10, 0x79, 0x0a, 0x0d, 0x15, 0x65, 0x76, 0xb7, - 0xcf, 0xa2, 0x99, 0xda, 0x5d, 0xe6, 0xab, 0xcd, 0xe9, 0x4d, 0xa5, 0x70, - 0x60, 0x6a, 0xb0, 0x7f, 0x84, 0x4d, 0xac, 0xdd, 0xa9, 0x0d, 0x63, 0xfc, - 0x58, 0x7d, 0xb0, 0x75, 0xab, 0x86, 0x02, 0xf1, 0xcf, 0x15, 0x34, 0x8d, - 0xd5, 0x8e, 0x55, 0xc6, 0x92, 0x81, 0x16, 0x1f, 0xb9, 0x22, 0x75, 0x8b, - 0x7e, 0xd1, 0x53, 0xf7, 0x90, 0xa2, 0x4c, 0x2f, 0x94, 0x57, 0xb5, 0x09, - 0x9f, 0x89, 0xab, 0x1b, 0xfb, 0x06, 0x24, 0x52, 0xf0, 0x92, 0xb5, 0xfd, - 0x67, 0x77, 0x01, 0xfc, 0x59, 0x90, 0xb3, 0x4d, 0x5f, 0xa5, 0x90, 0xfe, - 0xa6, 0xef, 0x3e, 0x27, 0xbe, 0xa0, 0x54, 0x03, 0xdc, 0x60, 0x1e, 0xfc, - 0x05, 0x65, 0x7a, 0xbc, 0xbd, 0xf1, 0x92, 0x65, 0x9b, 0x22, 0x6a, 0xd9, - 0x34, 0x24, 0x13, 0xa2, 0x62, 0x93, 0x2b, 0x00, 0x63, 0x30, 0xe7, 0xe1, - 0xef, 0x00, 0xc3, 0x71, 0x37, 0x4a, 0x54, 0x3d, 0x55, 0x1b, 0x3b, 0x50, - 0x28, 0xd0, 0x6a, 0x72, 0x01, 0xcd, 0x17, 0x63, 0xfb, 0xfd, 0xa8, 0xc7, - 0x44, 0xa2, 0xf6, 0x6f, 0x28, 0x57, 0x72, 0x39, 0x78, 0x1e, 0x9a, 0x48, - 0xe7, 0x0a, 0x48, 0x67, 0x5d, 0xb0, 0xd1, 0x94, 0x2e, 0x75, 0xd2, 0x99, - 0x0f, 0xd5, 0x6a, 0x31, 0x65, 0x1e, 0xa0, 0x23, 0xba, 0x2b, 0xa8, 0xf7, - 0x4f, 0xf3, 0xef, 0xd7, 0x9e, 0xda, 0xcc, 0xe8, 0xf4, 0x2e, 0x3c, 0x3a, - 0xf1, 0x81, 0x39, 0x21, 0x85, 0x28, 0x96, 0xf9, 0x7b, 0x5c, 0x8c, 0x96, - 0x7f, 0x5c, 0x28, 0xc7, 0x40, 0x1c, 0x6d, 0xbe, 0xe1, 0x36, 0x09, 0xea, - 0x54, 0x30, 0x23, 0xdc, 0x2d, 0x2a, 0x93, 0x8b, 0xef, 0xbb, 0x8b, 0x1e, - 0xbd, 0x61, 0x7a, 0xe7, 0x11, 0xd8, 0x5d, 0x3d, 0x04, 0x9c, 0x5b, 0x0c, - 0xf1, 0xf4, 0x77, 0x44, 0x70, 0x43, 0x73, 0xda, 0x9b, 0xe6, 0xe1, 0xd6, - 0x9f, 0x89, 0xb6, 0xb2, 0x27, 0xde, 0x69, 0xa4, 0x0c, 0xf0, 0x83, 0x3f, - 0x93, 0xa2, 0x13, 0xe0, 0x8b, 0x92, 0x14, 0x86, 0xc9, 0xf3, 0xa2, 0x79, - 0x13, 0x15, 0xa7, 0xae, 0x4d, 0x46, 0x73, 0x41, 0xd7, 0xfe, 0x61, 0x03, - 0xf8, 0xb8, 0x3c, 0x2e, 0x3b, 0xc5, 0x0c, 0xb9, 0x76, 0xc8, 0x98, 0x31, - 0x0c, 0x34, 0x8f, 0x33, 0x3f, 0x96, 0x92, 0x4e, 0x89, 0x30, 0xa7, 0xf5, - 0xaa, 0x02, 0x2a, 0x6a, 0x0d, 0xdf, 0xb9, 0x2e, 0x96, 0x45, 0xab, 0x76, - 0x6c, 0x20, 0x77, 0xad, 0x35, 0x25, 0xb0, 0xd4, 0xa0, 0xdd, 0x34, 0x47, - 0x32, 0xc0, 0xff, 0x40, 0x4f, 0x7e, 0x91, 0x61, 0xcf, 0xf1, 0x21, 0x27, - 0x8e, 0xef, 0x49, 0x53, 0xf0, 0x3b, 0xcf, 0x7a, 0xb8, 0xc5, 0x2a, 0x37, - 0xab, 0x1a, 0xa5, 0x07, 0xf9, 0x6d, 0xef, 0x61, 0x34, 0xb4, 0x30, 0xf3, - 0x29, 0x8a, 0x52, 0xd3, 0x75, 0xa9, 0xb2, 0x5a, 0x04, 0x9f, 0x76, 0xee, - 0x09, 0x2d, 0xd8, 0x99, 0xf1, 0xca, 0x0e, 0xf9, 0xa8, 0x74, 0x7c, 0x15, - 0x17, 0xdf, 0x92, 0x70, 0x4f, 0xe6, 0x0f, 0x1a, 0x83, 0xc5, 0xd9, 0x3c, - 0x1a, 0x0d, 0xf2, 0x35, 0x40, 0x0e, 0x36, 0xf2, 0x98, 0x47, 0x9d, 0x2c, - 0x63, 0xf1, 0xd1, 0x74, 0xe1, 0x72, 0xb8, 0xd7, 0x41, 0x8b, 0xa4, 0x44, - 0x98, 0x35, 0xa8, 0x24, 0x24, 0x1c, 0x62, 0x70, 0x52, 0x88, 0x70, 0xc3, - 0x45, 0x20, 0xd3, 0x18, 0xcc, 0x2d, 0x07, 0x52, 0x57, 0xc9, 0x68, 0x56, - 0x95, 0x09, 0x1a, 0xbb, 0xad, 0xa6, 0xd0, 0xf4, 0xe5, 0x62, 0x43, 0x1f, - 0xf8, 0x16, 0xb7, 0x7b, 0x33, 0x3f, 0xfa, 0xb1, 0xca, 0xc5, 0x56, 0x93, - 0xc6, 0x55, 0x34, 0xd1, 0x5b, 0x7e, 0xd6, 0x5b, 0xea, 0xde, 0x7d, 0xef, - 0x23, 0x14, 0x5c, 0xfd, 0x98, 0xa4, 0x86, 0x60, 0xbb, 0x30, 0x29, 0x60, - 0x6d, 0xf5, 0x84, 0x6f, 0xe5, 0x7a, 0x6e, 0xbf, 0x2e, 0x44, 0xd1, 0xf1, - 0x7b, 0x8c, 0xa3, 0x17, 0xe1, 0x34, 0xfd, 0x10, 0x04, 0xad, 0xa7, 0xe6, - 0xd7, 0xfa, 0xea, 0xbf, 0x1b, 0x92, 0x1a, 0x75, 0x38, 0x32, 0xee, 0xff, - 0x22, 0x52, 0x8a, 0xe5, 0xac, 0x5f, 0x5f, 0xc2, 0x57, 0x52, 0x1d, 0x87, - 0xdf, 0xe6, 0xf9, 0x2b, 0x9d, 0x61, 0x1c, 0xa1, 0x0b, 0x32, 0x4a, 0x09, - 0x35, 0xa6, 0x2d, 0xf0, 0x37, 0x73, 0x5d, 0x7a, 0xad, 0x0d, 0x61, 0x5f, - 0x8e, 0x5f, 0x61, 0x7c, 0xfb, 0x69, 0x87, 0x2a, 0xb8, 0xd1, 0x4a, 0x0a, - 0xbf, 0x2b, 0xeb, 0x09, 0x3b, 0x92, 0xc7, 0xbf, 0xca, 0xb4, 0x03, 0xdb, - 0xc8, 0x98, 0xc9, 0x8c, 0x9b, 0x29, 0x14, 0x37, 0xcf, 0xcf, 0xb1, 0x01, - 0x8e, 0x60, 0x4a, 0x27, 0x3a, 0xb8, 0x29, 0x5b, 0xe8, 0xf3, 0xf0, 0xd9, - 0x1c, 0xbf, 0x1b, 0xee, 0x7a, 0x5a, 0xa6, 0xb5, 0x63, 0xff, 0xfb, 0xb1, - 0xa4, 0x87, 0xd3, 0xe8, 0x2d, 0x7b, 0xbf, 0xe8, 0x40, 0x89, 0x2b, 0x02, - 0x8e, 0x2d, 0xd3, 0xc1, 0x89, 0x38, 0xad, 0xc1, 0x5f, 0xd9, 0x51, 0x5f, - 0x44, 0xbc, 0xd6, 0x4a, 0x58, 0xc3, 0xc9, 0xdc, 0xff, 0xe8, 0x21, 0x24, - 0x6f, 0x17, 0x2f, 0x3c, 0xb4, 0x1d, 0x90, 0x4d, 0xa4, 0x2b, 0xf4, 0x3b, - 0xe9, 0xdc, 0x9b, 0x92, 0x8c, 0x8a, 0x14, 0x7e, 0x7c, 0x5e, 0x02, 0x2e, - 0xea, 0x52, 0x2d, 0x26, 0xc2, 0xbe, 0x1b, 0x14, 0xc3, 0x4e, 0x9f, 0xf8, - 0x76, 0x67, 0xb6, 0x30, 0x90, 0xff, 0x0e, 0x72, 0xcf, 0x42, 0x95, 0xc6, - 0x99, 0x27, 0x5d, 0xa3, 0xc7, 0x69, 0x5e, 0x9c, 0x0e, 0x8f, 0x29, 0xd9, - 0xa3, 0x88, 0x5c, 0xb1, 0x1f, 0x47, 0x90, 0x94, 0x95, 0xb7, 0x82, 0x83, - 0xe9, 0x26, 0x18, 0x82, 0x17, 0x54, 0xc9, 0x41, 0x6a, 0xe7, 0x58, 0x3b, - 0xcf, 0xf0, 0x18, 0x99, 0x90, 0x54, 0x2b, 0xb9, 0xa5, 0xf8, 0xe5, 0x12, - 0x59, 0x2f, 0xc5, 0xb0, 0xb3, 0xc9, 0x71, 0x3e, 0xf8, 0x70, 0x76, 0xac, - 0x4c, 0x30, 0x05, 0x6c, 0xf2, 0x28, 0x72, 0x37, 0x94, 0x2e, 0xaa, 0xe0, - 0xf1, 0xfe, 0xb6, 0x6a, 0x00, 0x16, 0x6e, 0xb8, 0x4d, 0x71, 0xc2, 0x86, - 0xd1, 0x76, 0x74, 0xd0, 0x59, 0x3a, 0x34, 0xf3, 0x51, 0x88, 0x3f, 0x1f, - 0xa6, 0x8f, 0x76, 0x85, 0xb0, 0x26, 0x25, 0xa6, 0xa6, 0xec, 0xfd, 0xae, - 0x20, 0x1d, 0x21, 0x8a, 0xf7, 0x1c, 0x31, 0x71, 0xbb, 0xb7, 0x6e, 0xc8, - 0x9a, 0x42, 0xc2, 0x3a, 0xfb, 0x9d, 0x22, 0xe9, 0x1c, 0x2c, 0x0e, 0x51, - 0xc3, 0x74, 0x18, 0xaa, 0x37, 0x5b, 0xd0, 0xa3, 0xf7, 0x7f, 0xcf, 0x8c, - 0xbf, 0x3c, 0x58, 0xb3, 0x9c, 0xc7, 0xa9, 0x19, 0x06, 0xf3, 0xe3, 0x5b, - 0x17, 0x9b, 0x98, 0xaa, 0xb8, 0xb5, 0xe1, 0x85, 0xd3, 0x4f, 0x56, 0x73, - 0xca, 0xd3, 0xb0, 0x69, 0x6b, 0xc9, 0x2e, 0xc2, 0x3c, 0x98, 0x31, 0xcc, - 0xc5, 0x23, 0x4f, 0xf6, 0xf7, 0x1a, 0xbe, 0x0f, 0xa0, 0x7c, 0x80, 0x1a, - 0xb6, 0x29, 0x44, 0x52, 0x1b, 0xd3, 0xc4, 0x43, 0xe8, 0x76, 0xbf, 0x71, - 0x6e, 0x72, 0x08, 0x06, 0x05, 0x6f, 0x96, 0x42, 0xc7, 0xb9, 0xf2, 0x6f, - 0x44, 0xff, 0x83, 0xb1, 0x9e, 0x05, 0xfa, 0xca, 0x46, 0x3d, 0x51, 0xd5, - 0x68, 0x48, 0xf5, 0xa7, 0x3a, 0x9e, 0x71, 0x08, 0xee, 0xa3, 0x6b, 0x9c, - 0x78, 0xc0, 0xa0, 0x68, 0x0f, 0xd9, 0x98, 0x50, 0xea, 0xc9, 0x1b, 0x8a, - 0xa4, 0x47, 0xdf, 0xc7, 0xfc, 0xfa, 0xec, 0x55, 0xbb, 0x1b, 0x09, 0x20, - 0xd1, 0x28, 0x32, 0x73, 0x30, 0xbb, 0xa0, 0xc2, 0x22, 0xe5, 0xa5, 0x1b, - 0xc3, 0x98, 0xcf, 0x98, 0xc7, 0xbf, 0xd5, 0xa6, 0xbb, 0xa0, 0x2c, 0x5f, - 0xdf, 0x4b, 0xab, 0x01, 0x7f, 0x72, 0x9d, 0xd2, 0x66, 0x94, 0x1c, 0xb9, - 0x9c, 0xd7, 0x21, 0x76, 0xab, 0x05, 0x0f, 0x60, 0xd9, 0x29, 0xfc, 0x33, - 0x0b, 0x61, 0x76, 0x9c, 0x5d, 0x95, 0xcb, 0xcc, 0x5f, 0xbb, 0x53, 0x24, - 0x2b, 0xc2, 0xa1, 0x8a, 0xfa, 0x6b, 0x19, 0x48, 0xab, 0x95, 0x27, 0xb3, - 0x7f, 0x63, 0xac, 0x43, 0x03, 0x93, 0xed, 0x1a, 0x50, 0xa8, 0x80, 0x6d, - 0x40, 0x2f, 0xb3, 0x32, 0x45, 0x98, 0x07, 0xcb, 0x2a, 0xf7, 0x6e, 0xb2, - 0x86, 0xb3, 0x82, 0x90, 0xd3, 0x53, 0x9a, 0x9b, 0x68, 0x4e, 0x7a, 0x5e, - 0x5c, 0x3a, 0xd4, 0x4e, 0x55, 0x68, 0x7a, 0xe0, 0xc3, 0x43, 0x13, 0x33, - 0x17, 0x45, 0x36, 0xdf, 0xc0, 0xc2, 0xc6, 0xbf, 0xb6, 0x75, 0x25, 0x7b, - 0x70, 0x70, 0x94, 0x70, 0xcb, 0x1e, 0x30, 0xfb, 0x9a, 0xe9, 0x7b, 0x54, - 0x9d, 0x98, 0xa2, 0x67, 0x4e, 0x94, 0x03, 0x9d, 0x24, 0xf4, 0x3f, 0x59, - 0xd3, 0xa2, 0xc5, 0x58, 0x4e, 0x79, 0x77, 0x94, 0xe9, 0x37, 0xfd, 0x2c, - 0x78, 0xa9, 0xc9, 0x11, 0x11, 0x28, 0x51, 0x01, 0x69, 0x9e, 0xad, 0xe5, - 0x05, 0xf8, 0x30, 0x1c, 0xbc, 0xd8, 0xb1, 0x1d, 0x5d, 0xbf, 0xf7, 0x93, - 0x02, 0x17, 0xe1, 0xe4, 0xd3, 0xf0, 0x53, 0x76, 0xa2, 0xd1, 0xf6, 0xa0, - 0x7d, 0x4f, 0x3f, 0x4c, 0xa4, 0xb9, 0x18, 0x04, 0xeb, 0x87, 0x27, 0x55, - 0xcf, 0x85, 0xf3, 0x4a, 0x13, 0xdf, 0x7e, 0x95, 0x09, 0x7c, 0x91, 0x53, - 0x6b, 0xf1, 0x5d, 0xae, 0xa9, 0x45, 0x5d, 0x85, 0x31, 0x40, 0x09, 0xe2, - 0x4a, 0x57, 0x3d, 0xae, 0x4e, 0xf7, 0xbd, 0x52, 0x6a, 0x76, 0xe8, 0x57, - 0x21, 0xec, 0x8d, 0xc6, 0x02, 0x2f, 0xe3, 0xd2, 0x71, 0xf1, 0xc9, 0x5d, - 0xc4, 0xc9, 0xda, 0xc9, 0xff, 0x25, 0x8e, 0x62, 0xf8, 0x8d, 0x51, 0x59, - 0x9b, 0xdf, 0x39, 0xf7, 0xb1, 0x5d, 0x78, 0x76, 0x36, 0x02, 0xa2, 0x42, - 0x30, 0x15, 0x9d, 0x8e, 0x57, 0xf7, 0x67, 0xb1, 0xd3, 0xbd, 0x11, 0x0b, - 0xf4, 0x0e, 0xf8, 0x6b, 0xe8, 0xc9, 0x0c, 0x82, 0xa5, 0x70, 0x41, 0x10, - 0x01, 0x87, 0xd9, 0xbd, 0x6d, 0x2a, 0xba, 0x54, 0x21, 0xd2, 0xf8, 0x8b, - 0xe0, 0x81, 0x5b, 0xf2, 0x8d, 0x71, 0xaa, 0x65, 0x52, 0xcd, 0xe1, 0x8d, - 0xa7, 0x18, 0xe0, 0xa7, 0x85, 0x79, 0xaf, 0x28, 0xd2, 0xb4, 0x6b, 0x2d, - 0xf7, 0x7d, 0x70, 0x6f, 0x99, 0xbf, 0x6d, 0xd9, 0x65, 0x5b, 0x69, 0x33, - 0x6e, 0x85, 0xba, 0x12, 0x9f, 0xb0, 0x75, 0x55, 0x87, 0x3f, 0x53, 0xfe, - 0x0a, 0xe3, 0x2a, 0x2b, 0x5a, 0x0d, 0xf2, 0xd0, 0x1d, 0xa0, 0x8e, 0xc5, - 0xb8, 0xfb, 0xed, 0x5e, 0xef, 0xaf, 0x4c, 0xed, 0xcd, 0xa2, 0x66, 0xd4, - 0x92, 0x66, 0xd1, 0x36, 0x6d, 0x91, 0x25, 0xa9, 0x83, 0xe4, 0x10, 0xcf, - 0x7f, 0x9b, 0x71, 0x36, 0x42, 0xc7, 0xde, 0xe5, 0xe1, 0xcb, 0x1a, 0x27, - 0xa1, 0x22, 0x56, 0x5a, 0x6c, 0xef, 0x17, 0xde, 0xd1, 0x4d, 0x66, 0x09, - 0x6b, 0xfa, 0xa6, 0x14, 0x2c, 0x93, 0x20, 0x56, 0xe3, 0xa4, 0x76, 0xc1, - 0xb8, 0x6a, 0xb7, 0x5e, 0x4d, 0xfe, 0x5d, 0xe1, 0x12, 0xf5, 0x5f, 0x4f, - 0xb5, 0x91, 0x75, 0x2f, 0x3b, 0x52, 0xf8, 0xe3, 0x8b, 0xaf, 0x8f, 0x3e, - 0xa8, 0x75, 0x26, 0x00, 0x8c, 0x69, 0x4f, 0x2d, 0x58, 0xbf, 0x36, 0x11, - 0x22, 0x01, 0x80, 0xff, 0x41, 0x7d, 0xb4, 0xad, 0x7a, 0x9b, 0xd3, 0xc1, - 0x2d, 0x95, 0xe3, 0x49, 0xb0, 0x42, 0x1c, 0xc6, 0xb6, 0x08, 0x91, 0xd7, - 0xdb, 0xfd, 0xad, 0x9c, 0x24, 0x4b, 0x9f, 0x50, 0xf6, 0x8f, 0x48, 0x0b, - 0xbc, 0x40, 0xe1, 0xb3, 0x09, 0x9d, 0xdc, 0x7f, 0xcb, 0xe8, 0xc8, 0x9d, - 0xf3, 0xbc, 0x31, 0x8c, 0xe1, 0x21, 0xbb, 0xd8, 0xe9, 0x73, 0x0b, 0x79, - 0x13, 0x9c, 0x47, 0xe4, 0x23, 0xcf, 0xb4, 0xf1, 0xf1, 0x47, 0x07, 0x3a, - 0xc6, 0x6b, 0x82, 0x0c, 0x04, 0x25, 0xed, 0xec, 0xe9, 0xc9, 0xde, 0x1c, - 0x6f, 0x83, 0xac, 0x44, 0xd1, 0x3e, 0x02, 0x15, 0x13, 0xc4, 0x9f, 0xdd, - 0xbc, 0x37, 0x33, 0x8e, 0xa1, 0x57, 0xab, 0xd3, 0x50, 0xb3, 0x61, 0xa6, - 0xf3, 0x58, 0x40, 0xc4, 0x00, 0xd1, 0xf5, 0x5e, 0x42, 0x35, 0x3a, 0x1a, - 0xec, 0xa1, 0xa4, 0x71, 0xe4, 0x29, 0xb7, 0x2f, 0xa0, 0xa3, 0xed, 0xca, - 0x97, 0xd7, 0xe3, 0x97, 0x02, 0x41, 0x96, 0x56, 0xd0, 0x3f, 0x1c, 0x2a, - 0xba, 0xed, 0xc7, 0x04, 0xc2, 0x00, 0x5f, 0x17, 0x7e, 0x18, 0x0d, 0x17, - 0xfc, 0xe0, 0x09, 0x65, 0x0e, 0x08, 0x97, 0xc9, 0x3f, 0x85, 0x03, 0x59, - 0x14, 0xf0, 0x89, 0x72, 0xaa, 0xe6, 0xf7, 0x16, 0x71, 0x0f, 0x25, 0xa5, - 0x8f, 0xb6, 0xd8, 0x34, 0xe1, 0x10, 0x48, 0x38, 0x90, 0xfa, 0x39, 0xcf, - 0x1d, 0x85, 0x64, 0x9b, 0xe8, 0x48, 0x6f, 0x25, 0x11, 0x9b, 0x37, 0xdc, - 0xf9, 0xf5, 0xf2, 0x92, 0x61, 0x97, 0x38, 0x0e, 0x12, 0xaf, 0xc2, 0xe9, - 0x25, 0x99, 0xc6, 0x73, 0xfa, 0x14, 0x25, 0x1d, 0xa9, 0x7e, 0x48, 0x61, - 0xf3, 0x9a, 0x68, 0x83, 0x82, 0xf0, 0x67, 0x20, 0xd9, 0xc1, 0x80, 0x17, - 0x1d, 0xfc, 0x95, 0x46, 0xd7, 0xd8, 0xe7, 0xd7, 0x02, 0x6a, 0x30, 0xa9, - 0x97, 0xf6, 0xe7, 0x1b, 0x4b, 0xe1, 0x66, 0x28, 0x64, 0x00, 0xe0, 0xa8, - 0x73, 0xf8, 0x24, 0xb3, 0xed, 0xa7, 0x93, 0xb2, 0xc7, 0xcf, 0xa0, 0x89, - 0x1a, 0x16, 0x29, 0xd5, 0x10, 0xa1, 0x7a, 0xe0, 0x1d, 0x99, 0x11, 0x3f, - 0xff, 0x15, 0x77, 0x7a, 0x1d, 0x66, 0x68, 0x4f, 0x91, 0x2b, 0x6b, 0x22, - 0x1c, 0xfc, 0x19, 0x6c, 0x1b, 0xed, 0xf5, 0x46, 0x71, 0xe8, 0x35, 0xe1, - 0x7f, 0x1c, 0x23, 0x84, 0x6e, 0x8c, 0xf7, 0x08, 0xfb, 0x7c, 0x39, 0x2d, - 0x6f, 0x0c, 0xfb, 0x2d, 0x21, 0x9e, 0x89, 0x46, 0x93, 0x47, 0x7d, 0x23, - 0xee, 0x82, 0x6c, 0x6c, 0x98, 0x09, 0xf7, 0x79, 0x19, 0x2f, 0x3f, 0xfe, - 0x1d, 0x71, 0x27, 0xf3, 0x71, 0x39, 0xfb, 0xdc, 0x97, 0xee, 0x5e, 0x20, - 0xd0, 0x3e, 0x0a, 0xcf, 0x4a, 0xcb, 0x7a, 0xc8, 0xda, 0x19, 0xb8, 0xdb, - 0xc5, 0x60, 0xe4, 0xe0, 0x80, 0x1b, 0xdc, 0x93, 0x13, 0x63, 0xdb, 0x81, - 0xdf, 0xbe, 0x65, 0x48, 0x0c, 0x81, 0xb7, 0xe4, 0x28, 0x41, 0x85, 0xc2, - 0x28, 0x73, 0xa8, 0x8e, 0xbc, 0x8e, 0x11, 0x6f, 0xf1, 0xe8, 0x27, 0x79, - 0x3d, 0x45, 0xe5, 0x95, 0xdc, 0x61, 0xb0, 0xef, 0xf6, 0x67, 0x21, 0x6c, - 0x6c, 0x42, 0xdf, 0xfd, 0xfa, 0x2c, 0x24, 0xb7, 0xaa, 0xc1, 0x0c, 0x41, - 0xdf, 0xc6, 0x40, 0x70, 0xa7, 0xfb, 0xae, 0x89, 0x5d, 0xd7, 0xb2, 0x3e, - 0x8b, 0x7f, 0xbc, 0xd5, 0x95, 0x61, 0x4f, 0x3f, 0xf8, 0xbe, 0x6f, 0x0e, - 0x77, 0xbc, 0x23, 0x63, 0x9f, 0xc5, 0xc4, 0x8e, 0x82, 0xe7, 0xd1, 0x9d, - 0x96, 0xe4, 0xd4, 0x54, 0x70, 0x84, 0xe2, 0x6d, 0x90, 0xdc, 0xc6, 0xbb, - 0x0d, 0xea, 0xd8, 0xe0, 0x17, 0x1c, 0x1f, 0xe2, 0xc3, 0x74, 0x27, 0x0d, - 0xab, 0xdd, 0xbe, 0x9b, 0xf5, 0x3d, 0x46, 0xb5, 0x06, 0x93, 0x87, 0x5f, - 0x56, 0xd4, 0x97, 0xbe, 0x68, 0xc8, 0xcf, 0x05, 0xc0, 0x16, 0x86, 0xdc, - 0x4d, 0xa0, 0xc3, 0xad, 0x6c, 0x16, 0x7b, 0xac, 0x40, 0x27, 0x1b, 0xae, - 0xb2, 0x9b, 0x41, 0x2f, 0x53, 0x46, 0x58, 0xb6, 0xd1, 0x48, 0x9f, 0xbc, - 0xce, 0x79, 0xb8, 0x0b, 0x49, 0x81, 0x7c, 0xfa, 0x48, 0x3a, 0xad, 0x1f, - 0xc5, 0xd4, 0x85, 0x9b, 0x6e, 0xcb, 0x39, 0xff, 0xec, 0xbb, 0x33, 0x86, - 0xf1, 0xfb, 0xfa, 0xef, 0x0b, 0x46, 0x0d, 0xc9, 0x7a, 0x23, 0x63, 0xb7, - 0xed, 0xed, 0x3a, 0xa1, 0x65, 0x09, 0xad, 0x10, 0xe5, 0x84, 0xcb, 0xc0, - 0x80, 0x4f, 0xe4, 0x65, 0x98, 0xa7, 0x05, 0xa5, 0x9c, 0x08, 0xee, 0xd1, - 0x2c, 0x32, 0x64, 0x9c, 0x2a, 0xaf, 0xdf, 0x2a, 0xba, 0x9d, 0xba, 0x03, - 0x10, 0xde, 0x19, 0xf4, 0x06, 0xf8, 0xc3, 0x32, 0xab, 0x17, 0xad, 0xa3, - 0xfb, 0x50, 0xf6, 0xb0, 0x84, 0xb1, 0x7e, 0x0a, 0xad, 0x49, 0xa4, 0x01, - 0xb8, 0x3e, 0xae, 0xe2, 0xe3, 0x71, 0x54, 0xe3, 0xe4, 0x6c, 0x76, 0x36, - 0xa7, 0xf8, 0x2f, 0x4e, 0xe6, 0x6d, 0xee, 0x2f, 0x8a, 0x32, 0x3c, 0x1c, - 0x1a, 0xc5, 0xe5, 0x9b, 0x9a, 0xb2, 0x2f, 0xb5, 0x26, 0xf5, 0xf7, 0x9a, - 0xf8, 0x71, 0x2a, 0x9d, 0xd2, 0xc5, 0x62, 0xd4, 0x9d, 0x18, 0x08, 0xf7, - 0xaa, 0x44, 0xa1, 0xcf, 0xbb, 0x24, 0x42, 0xc7, 0x59, 0xd8, 0xf0, 0xa7, - 0xf1, 0x27, 0x5e, 0xac, 0x61, 0x8a, 0xcc, 0x75, 0xd8, 0x7b, 0xfd, 0x30, - 0x71, 0xc4, 0x2b, 0x16, 0x07, 0xdc, 0xfe, 0x50, 0x94, 0xb1, 0xcf, 0x4d, - 0x43, 0x6e, 0x86, 0xab, 0xb1, 0x05, 0x3a, 0xed, 0x85, 0x35, 0x69, 0x6d, - 0x61, 0xed, 0x7b, 0xfa, 0xc1, 0x94, 0x21, 0x82, 0x54, 0xc8, 0x2a, 0x39, - 0x5d, 0x92, 0xb6, 0xa3, 0xc9, 0xa5, 0xff, 0xb6, 0x17, 0x8a, 0xce, 0x9d, - 0xe8, 0x21, 0x76, 0x4d, 0x47, 0xde, 0x78, 0xda, 0x5e, 0xa1, 0x2e, 0xe1, - 0x11, 0xfb, 0xeb, 0x65, 0x27, 0xeb, 0x5f, 0xa9, 0xb6, 0xaf, 0x41, 0xef, - 0x1c, 0xca, 0x2c, 0xa3, 0x44, 0x2b, 0x84, 0x4f, 0xf0, 0x38, 0x4f, 0xf5, - 0xb3, 0x17, 0xa2, 0x21, 0xe5, 0xf8, 0x6f, 0xae, 0xfb, 0x3e, 0xfc, 0x6b, - 0xde, 0xde, 0x7c, 0x44, 0x74, 0x61, 0xbd, 0xfa, 0xc4, 0x50, 0x3b, 0xd9, - 0x18, 0x92, 0x1e, 0x65, 0x39, 0x8a, 0x31, 0x9f, 0xf4, 0x32, 0x01, 0x80, - 0x0d, 0x7c, 0xaf, 0x57, 0x7d, 0xc9, 0x7a, 0x37, 0x93, 0x15, 0x4a, 0x21, - 0xcb, 0x88, 0xb2, 0x84, 0x64, 0x66, 0xca, 0x89, 0xa6, 0x73, 0x61, 0x85, - 0x96, 0xae, 0x32, 0xef, 0x75, 0xb6, 0x7b, 0x0a, 0x2b, 0xa3, 0xd1, 0x96, - 0x7c, 0x93, 0x15, 0xf9, 0xd3, 0x02, 0x50, 0xb3, 0xa8, 0xaa, 0xe7, 0x7a, - 0xaa, 0x86, 0xc8, 0x38, 0x7c, 0x29, 0x54, 0x76, 0x34, 0xd3, 0x51, 0x0a, - 0x60, 0xf4, 0x9b, 0x48, 0x20, 0xbd, 0xbd, 0xe3, 0x99, 0x9f, 0xf1, 0x44, - 0x1f, 0x23, 0x87, 0x4e, 0x97, 0xad, 0x23, 0x91, 0x81, 0x4d, 0xee, 0x6a, - 0x07, 0xa5, 0x94, 0xf3, 0x3d, 0xc0, 0xe3, 0x5b, 0x99, 0xd7, 0x9f, 0x1d, - 0xe0, 0xec, 0x60, 0x3c, 0x5b, 0x10, 0x9a, 0x63, 0x0c, 0xdc, 0x73, 0x02, - 0xa4, 0x72, 0x25, 0xf1, 0xbd, 0x1e, 0xd8, 0x36, 0xc4, 0x68, 0xdd, 0x57, - 0xfa, 0x32, 0xc4, 0x4f, 0x5f, 0x0e, 0xbb, 0xde, 0xb9, 0x17, 0x47, 0x73, - 0xbc, 0x47, 0xc9, 0x09, 0x32, 0x98, 0xaf, 0xf1, 0x0a, 0x92, 0xc9, 0xa5, - 0x7b, 0xdc, 0xb1, 0x13, 0x10, 0x63, 0x1f, 0xf0, 0x96, 0xc3, 0x36, 0x76, - 0x27, 0x70, 0xfd, 0x1f, 0x4d, 0xb6, 0x30, 0xc4, 0x87, 0xc3, 0x73, 0xc1, - 0xc9, 0x03, 0x11, 0xcd, 0xf9, 0x6a, 0x53, 0xbd, 0x14, 0x2d, 0xa8, 0xbc, - 0x59, 0xc3, 0x79, 0x6e, 0xed, 0x1c, 0x72, 0xac, 0x9f, 0x09, 0x0a, 0xef, - 0x91, 0x5d, 0xb0, 0xa2, 0x00, 0x45, 0xa3, 0x0e, 0xe3, 0x08, 0x6f, 0x42, - 0xf6, 0x61, 0x6d, 0x57, 0xce, 0x90, 0x32, 0x4f, 0xfc, 0x71, 0xb4, 0x8a, - 0x0f, 0xa1, 0x9f, 0xe5, 0x49, 0x36, 0x49, 0xe2, 0x5a, 0xa8, 0xb8, 0xe7, - 0x9b, 0x23, 0xa6, 0xdb, 0xf4, 0xc0, 0x2a, 0xa7, 0x6a, 0x17, 0xe4, 0xbf, - 0x8d, 0xda, 0x24, 0x81, 0xe8, 0x6e, 0x71, 0xaf, 0xd2, 0x28, 0xec, 0x40, - 0x5e, 0x31, 0x03, 0x82, 0xb2, 0x9e, 0x8c, 0x28, 0xc0, 0x63, 0xbb, 0x03, - 0xf4, 0x4c, 0x9c, 0xee, 0xe3, 0x5b, 0x92, 0x6d, 0xfd, 0xac, 0xa4, 0xa3, - 0x7f, 0x56, 0x9f, 0x00, 0xe5, 0xfa, 0x64, 0x97, 0x08, 0xf1, 0x5c, 0x10, - 0x54, 0xac, 0xe6, 0xf1, 0xe9, 0x58, 0x9c, 0x92, 0x5f, 0xf2, 0x0c, 0x70, - 0xaf, 0xb4, 0x6e, 0x6b, 0x5a, 0xa1, 0x08, 0x29, 0xd5, 0x93, 0x07, 0x81, - 0xcd, 0x27, 0x70, 0x92, 0xce, 0xcc, 0xb7, 0xbf, 0x22, 0x4a, 0xbc, 0xf0, - 0xbf, 0xdb, 0xe9, 0x8d, 0x8c, 0xb2, 0xf8, 0x63, 0x0f, 0xf0, 0x26, 0x5e, - 0xe0, 0x07, 0x61, 0xbf, 0xbc, 0x3d, 0xb8, 0x39, 0xef, 0x7b, 0x2b, 0x30, - 0xb2, 0xc8, 0x9a, 0x53, 0x33, 0x05, 0x72, 0x34, 0x0d, 0xba, 0xe1, 0xe4, - 0xcb, 0x3b, 0x8d, 0x1e, 0xba, 0x38, 0x16, 0xa4, 0x72, 0xad, 0xf3, 0xde, - 0xf9, 0xb5, 0x2f, 0x06, 0xc0, 0x65, 0x7e, 0x85, 0x86, 0x4a, 0xce, 0xdf, - 0x60, 0x3d, 0x9a, 0xb0, 0x63, 0xa7, 0x7e, 0x5c, 0x64, 0x11, 0xc6, 0xd1, - 0xe1, 0xac, 0x6c, 0xb9, 0x42, 0x2b, 0xa4, 0x03, 0x93, 0x2e, 0xfb, 0xaf, - 0x41, 0xf6, 0x57, 0x84, 0xb1, 0x13, 0x09, 0x88, 0x2b, 0x75, 0x6b, 0x18, - 0x58, 0x29, 0xb0, 0xf0, 0xda, 0x86, 0x4d, 0x50, 0x26, 0xef, 0x71, 0x83, - 0x4b, 0xf0, 0x1b, 0x02, 0xfd, 0x69, 0x4a, 0x74, 0x78, 0x75, 0xd0, 0xed, - 0x79, 0x00, 0xa5, 0xc9, 0x7f, 0xc9, 0x3d, 0x3e, 0x96, 0x7c, 0x98, 0xcb, - 0x9c, 0x67, 0x84, 0xd6, 0x65, 0xf5, 0xa7, 0x8d, 0x47, 0x5a, 0xfe, 0x28, - 0xc0, 0x74, 0x30, 0x17, 0x4e, 0xd7, 0xc2, 0x69, 0x5b, 0x6b, 0x28, 0x21, - 0xf6, 0xa1, 0x9d, 0x60, 0x50, 0xe6, 0xfc, 0xde, 0xa1, 0xd5, 0xac, 0x30, - 0x6c, 0xe1, 0xcc, 0x02, 0xda, 0xb3, 0x9d, 0x56, 0xe9, 0x66, 0x06, 0xa8, - 0x44, 0x2e, 0x38, 0x39, 0x71, 0x81, 0x4e, 0x23, 0x7b, 0x0a, 0xc5, 0xf9, - 0x4d, 0x6f, 0xeb, 0x90, 0xf5, 0x19, 0xf0, 0xb6, 0xd3, 0xb1, 0x59, 0x3f, - 0xe4, 0x13, 0x39, 0x4f, 0x7b, 0x5a, 0x59, 0x1a, 0xd9, 0x59, 0x56, 0xba, - 0x6e, 0x94, 0x23, 0xc8, 0x6f, 0x75, 0xdd, 0x95, 0xd9, 0xec, 0xf2, 0x6e, - 0x19, 0x88, 0x9b, 0x09, 0x22, 0xbe, 0xce, 0xde, 0xb4, 0x4f, 0x78, 0x7e, - 0xba, 0x27, 0x02, 0x63, 0xa1, 0x59, 0xd1, 0x63, 0x67, 0x2f, 0x96, 0x9f, - 0xd9, 0x1d, 0xb8, 0x76, 0xe9, 0x13, 0x39, 0xc4, 0x1c, 0x50, 0xcd, 0x90, - 0x6d, 0xe8, 0x02, 0x97, 0x07, 0xff, 0x7d, 0x61, 0x5c, 0x7f, 0xe5, 0xbf, - 0x83, 0x72, 0x4c, 0xb7, 0x13, 0xca, 0x15, 0xd5, 0x0c, 0x52, 0x2d, 0xd8, - 0x3d, 0xb9, 0x16, 0xab, 0x9d, 0x8f, 0x05, 0xa4, 0x7b, 0x9f, 0xb5, 0x99, - 0x80, 0xd8, 0x37, 0x91, 0xaa, 0x11, 0xe0, 0x63, 0xd8, 0xc8, 0xef, 0x10, - 0x2f, 0x70, 0x7a, 0x82, 0x0e, 0x1a, 0x92, 0x17, 0x68, 0x64, 0x82, 0x25, - 0x1a, 0xf4, 0xf7, 0x3f, 0x56, 0xb3, 0xd6, 0x43, 0x32, 0xa8, 0x51, 0xd3, - 0xd1, 0x79, 0xef, 0x4f, 0x53, 0xea, 0x4b, 0x58, 0x03, 0x57, 0xab, 0xc3, - 0x2d, 0xb5, 0xd7, 0x8d, 0x51, 0x09, 0x6d, 0x8a, 0xb7, 0xc4, 0x29, 0xd5, - 0x10, 0xa1, 0x7a, 0xe0, 0x1d, 0x99, 0x11, 0x3f, 0xff, 0x15, 0x77, 0x7a, - 0x1d, 0x66, 0x68, 0x4f, 0x91, 0x2b, 0x6b, 0x22, 0xf3, 0x7e, 0xde, 0x68, - 0x85, 0x8f, 0x88, 0x12, 0x2b, 0x91, 0x93, 0xa8, 0x93, 0xf0, 0xe0, 0xc8, - 0xca, 0x38, 0x41, 0x3a, 0x12, 0x9f, 0x4c, 0x10, 0xdb, 0xac, 0x7a, 0xb8, - 0xc0, 0xb7, 0xef, 0x23, 0x95, 0xb1, 0x61, 0xd6, 0x3b, 0x70, 0x3c, 0x54, - 0xda, 0x0c, 0x99, 0xaf, 0x09, 0x4c, 0xf1, 0x18, 0x07, 0xf2, 0x74, 0xde, - 0x4a, 0x7d, 0xef, 0xf0, 0x1e, 0x03, 0x04, 0xed, 0xfe, 0x36, 0xe1, 0x7c, - 0xa6, 0x48, 0x04, 0xdf, 0x0f, 0x6a, 0x88, 0x1b, 0xbd, 0x7b, 0x75, 0xd2, - 0x6a, 0xc9, 0x4e, 0xa8, 0xd5, 0x2b, 0x35, 0x58, 0x27, 0x57, 0x84, 0x11, - 0xb9, 0xf7, 0xc5, 0xa6, 0x29, 0x45, 0x6e, 0xa5, 0xbd, 0x0a, 0x37, 0xa4, - 0xf8, 0x09, 0xd8, 0x58, 0xc7, 0xf1, 0xcb, 0x4a, 0xa9, 0x13, 0x37, 0x18, - 0xf9, 0xe5, 0x41, 0x47, 0xbf, 0xe5, 0x8b, 0x15, 0xb6, 0x1c, 0x4a, 0x79, - 0x2f, 0x24, 0xdd, 0x9d, 0xf5, 0x3f, 0x9f, 0x54, 0x1a, 0x8a, 0xc5, 0xc8, - 0xd4, 0xfc, 0x5a, 0x4a, 0x80, 0x81, 0xae, 0xaa, 0xce, 0x5d, 0x4c, 0xeb, - 0xce, 0x2b, 0xb8, 0x61, 0xbd, 0xfa, 0x2f, 0x08, 0x22, 0x3f, 0xa4, 0xcb, - 0x12, 0x9d, 0x79, 0x31, 0x12, 0x21, 0x5b, 0x31, 0x9f, 0x04, 0xc2, 0xa9, - 0xa0, 0xf8, 0xed, 0xeb, 0xcd, 0x80, 0x3b, 0x5d, 0x7f, 0x85, 0xd6, 0x7a, - 0xdc, 0x5d, 0x05, 0x7a, 0x38, 0xeb, 0x3d, 0xd0, 0x58, 0x74, 0x4a, 0x4a, - 0x63, 0x7e, 0x56, 0x8d, 0x4e, 0xf3, 0xc4, 0x0d, 0xbf, 0xf3, 0x12, 0xa0, - 0xb8, 0x9c, 0xb0, 0x22, 0x5b, 0x61, 0x9d, 0x44, 0x28, 0x17, 0x1c, 0x9d, - 0x63, 0x44, 0xae, 0x1f, 0x8e, 0x1e, 0x39, 0x35, 0x4a, 0x29, 0x02, 0xf3, - 0xf6, 0xd6, 0x37, 0xf8, 0x29, 0x60, 0xba, 0x9d, 0x8d, 0xf5, 0xc0, 0x07, - 0x4e, 0x4b, 0x76, 0xfe, 0x74, 0x3c, 0xdd, 0x77, 0xcb, 0x52, 0xcd, 0xbb, - 0x43, 0xad, 0x53, 0x64, 0xad, 0xfb, 0x3a, 0x63, 0x85, 0xbf, 0x2a, 0x35, - 0x8e, 0xdc, 0x55, 0x55, 0x00, 0x53, 0xe8, 0x28, 0xb3, 0x10, 0x88, 0x62, - 0x38, 0x15, 0x75, 0x5b, 0xc9, 0x07, 0x4a, 0x15, 0x4c, 0x92, 0x8f, 0xd0, - 0x06, 0x9a, 0x00, 0x3c, 0xf6, 0xb0, 0x98, 0xc7, 0xbb, 0xcd, 0xb0, 0x8d, - 0x9c, 0x50, 0xea, 0x7c, 0xa9, 0x6b, 0x41, 0x08, 0x66, 0x04, 0xb1, 0xb6, - 0x3a, 0x65, 0xb5, 0x06, 0x02, 0x6f, 0xe5, 0x9c, 0x19, 0x48, 0x51, 0x4d, - 0xcb, 0x40, 0xc1, 0xb5, 0x5d, 0xb1, 0xf4, 0xe5, 0x71, 0x8a, 0xe7, 0x3e, - 0xbd, 0x14, 0xc1, 0x34, 0x91, 0xd8, 0xf2, 0xba, 0x57, 0x3c, 0x61, 0x7b, - 0x16, 0x36, 0x4b, 0x35, 0x14, 0xd8, 0xa9, 0xd3, 0x25, 0x4c, 0x61, 0x3e, - 0x1d, 0xf1, 0xcb, 0xec, 0x8d, 0xb1, 0x5c, 0x2a, 0x29, 0x58, 0x1f, 0xc2, - 0x61, 0xf8, 0x3e, 0xc2, 0xc1, 0x21, 0xf5, 0x06, 0x21, 0xd5, 0x62, 0xda, - 0x2c, 0x60, 0xe4, 0x84, 0x2d, 0xa2, 0x28, 0x96, 0xef, 0x98, 0x1f, 0x24, - 0xc4, 0x37, 0xfe, 0x41, 0x5e, 0x48, 0xbd, 0x18, 0x2e, 0x06, 0xbe, 0x5e, - 0xfe, 0xa4, 0x93, 0x06, 0x09, 0x0a, 0x98, 0x1b, 0x16, 0xf0, 0x99, 0x59, - 0xb9, 0x31, 0x5f, 0x54, 0x54, 0xae, 0x1f, 0xd5, 0x8d, 0x24, 0x33, 0xc3, - 0xfc, 0xab, 0xad, 0x87, 0xf0, 0x47, 0x99, 0x7a, 0x23, 0xbc, 0xad, 0xec, - 0xa2, 0x37, 0x71, 0xeb, 0xc5, 0x5e, 0x66, 0xff, 0xf9, 0x51, 0x9c, 0x41, - 0x2c, 0xcd, 0x96, 0x5a, 0x63, 0x29, 0x4e, 0xb3, 0x4d, 0x9e, 0xfe, 0x19, - 0xa4, 0x8a, 0x82, 0x9b, 0x0f, 0x5d, 0x5c, 0xea, 0xc7, 0xf4, 0xe9, 0xe2, - 0x40, 0x28, 0x6d, 0x16, 0xba, 0x2d, 0x4d, 0x94, 0x76, 0xd0, 0x21, 0xa7, - 0xb3, 0x89, 0x42, 0x97, 0x6f, 0xd9, 0xe8, 0xc4, 0x15, 0x66, 0x9f, 0x17, - 0x41, 0xbf, 0x96, 0x37, 0x0b, 0x08, 0x16, 0x60, 0x53, 0x05, 0xaf, 0x48, - 0x64, 0x49, 0xf3, 0x23, 0x3c, 0xe1, 0x2c, 0xd1, 0x98, 0x97, 0x70, 0xaf, - 0x0e, 0xb1, 0xc4, 0x64, 0x88, 0x85, 0x28, 0xa0, 0x31, 0x2e, 0xce, 0x46, - 0x1c, 0x62, 0xc7, 0xc1, 0xbc, 0x09, 0xe2, 0x7d, 0xd3, 0x5b, 0xa0, 0x7d, - 0x6e, 0x41, 0x9c, 0x5f, 0xff, 0x42, 0x2b, 0xea, 0xe0, 0x98, 0x12, 0x2d, - 0xca, 0xe8, 0x46, 0xcf, 0xe4, 0xe9, 0xb2, 0xcf, 0xd8, 0xa7, 0x51, 0x91, - 0xdb, 0xa1, 0x12, 0x79, 0x6c, 0xec, 0x9b, 0xcf, 0x22, 0x82, 0xdf, 0x09, - 0x36, 0x54, 0xf2, 0x56, 0x97, 0x9d, 0xf7, 0xfc, 0xa1, 0x8d, 0xa8, 0xf8, - 0x36, 0xf3, 0xa7, 0x5f, 0x5d, 0x15, 0xd6, 0x5b, 0xab, 0x14, 0x83, 0x36, - 0x9d, 0x85, 0xc6, 0xbd, 0x91, 0x61, 0x99, 0xad, 0xde, 0xa2, 0x66, 0x61, - 0x80, 0x0d, 0x35, 0x57, 0x91, 0xb0, 0x55, 0x0b, 0x3f, 0x46, 0xb3, 0x9f, - 0xc3, 0xdc, 0xca, 0x25, 0xda, 0x7b, 0x83, 0xe8, 0xcb, 0xb7, 0x18, 0x50, - 0xdc, 0xe7, 0x58, 0xa1, 0x36, 0x66, 0x0c, 0x5e, 0x6d, 0x7e, 0x5a, 0x8a, - 0xc9, 0x5d, 0xb9, 0xb0, 0xac, 0x0f, 0x63, 0xac, 0xf0, 0xb3, 0xbc, 0xd1, - 0x2f, 0x02, 0x57, 0x17, 0xec, 0x11, 0x1f, 0xe5, 0x54, 0x96, 0xe4, 0x21, - 0x3b, 0xb3, 0x14, 0x38, 0xd2, 0x44, 0xa8, 0xd0, 0xa2, 0x8a, 0xbf, 0x9b, - 0x91, 0xfd, 0xc0, 0xd2, 0xb4, 0x16, 0x65, 0x46, 0x34, 0xdd, 0x7b, 0x14, - 0xb3, 0xff, 0x74, 0xc8, 0x3e, 0x9a, 0x61, 0x4a, 0xb0, 0x99, 0x66, 0x7f, - 0x69, 0xc1, 0x4e, 0xb3, 0x51, 0x36, 0x79, 0xc0, 0xeb, 0x5f, 0x42, 0xe3, - 0x86, 0xf9, 0x2f, 0xa4, 0x62, 0x1b, 0x8c, 0x43, 0xd1, 0x44, 0xe3, 0x63, - 0xb2, 0x0f, 0x47, 0xce, 0xbf, 0xb7, 0xd2, 0xd7, 0xe1, 0x1f, 0x88, 0x81, - 0x86, 0x0e, 0x39, 0x61, 0x9b, 0xfa, 0xca, 0x91, 0xcd, 0xac, 0x3c, 0x4c, - 0xd5, 0xcd, 0x2b, 0x12, 0x4f, 0xe2, 0x02, 0x60, 0x53, 0x5f, 0xcd, 0xa8, - 0xa9, 0x79, 0xea, 0x28, 0x0a, 0x47, 0xe5, 0xf4, 0xaf, 0x95, 0x0f, 0x13, - 0x57, 0x41, 0x12, 0x60, 0xac, 0x23, 0x81, 0x09, 0x9f, 0x11, 0xde, 0x2d, - 0xec, 0x99, 0x70, 0x22, 0x23, 0xc6, 0x17, 0xfa, 0x5a, 0x28, 0xa4, 0x65, - 0x4a, 0x16, 0xa7, 0xfa, 0x7c, 0x36, 0x2d, 0x1e, 0x70, 0xdd, 0xce, 0x44, - 0x7a, 0xd0, 0x18, 0xee, 0xc4, 0xd2, 0x04, 0x09, 0x12, 0x97, 0xf6, 0xb0, - 0x16, 0xb6, 0x79, 0x5b, 0x3c, 0x0d, 0x1f, 0x83, 0x61, 0xde, 0xd6, 0xb0, - 0xd5, 0x6e, 0x6e, 0x9e, 0x2e, 0x5b, 0x95, 0x44, 0x44, 0x9e, 0x96, 0x7a, - 0x86, 0x9a, 0xd4, 0x9a, 0xd6, 0xb2, 0xca, 0x4e, 0xfe, 0xeb, 0x8a, 0xf9, - 0x51, 0xc2, 0x62, 0xc8, 0x82, 0xa5, 0x4b, 0xca, 0xb2, 0x61, 0x5f, 0x31, - 0x67, 0x4d, 0xf3, 0xa6, 0x57, 0xe1, 0x26, 0xe3, 0x32, 0xf3, 0xb2, 0xee, - 0x69, 0x07, 0x3d, 0x6d, 0x2f, 0x8d, 0x9d, 0x33, 0x90, 0xe9, 0x63, 0xdb, - 0xc2, 0x09, 0x84, 0x9d, 0xe2, 0xde, 0x05, 0x45, 0x76, 0x40, 0x86, 0x82, - 0x47, 0x61, 0x64, 0x97, 0x4c, 0x3d, 0xd4, 0x7b, 0x9f, 0x71, 0xae, 0xc1, - 0x19, 0x5d, 0x35, 0x3d, 0xf7, 0xbb, 0x02, 0xb1, 0x53, 0xfa, 0x89, 0xfb, - 0xac, 0xfa, 0x68, 0x93, 0x82, 0x7a, 0x4d, 0x39, 0xcd, 0x0f, 0x34, 0xd1, - 0xc9, 0x3f, 0xba, 0x6d, 0x90, 0x36, 0x39, 0x7c, 0xbf, 0xb4, 0xf1, 0x89, - 0xaf, 0x9d, 0xdb, 0xbf, 0xf6, 0xbf, 0x98, 0x67, 0x49, 0x03, 0x8f, 0x66, - 0x6f, 0xbb, 0x8a, 0xd8, 0xb6, 0x0a, 0x57, 0x58, 0x55, 0xb8, 0x2b, 0x2c, - 0xb6, 0x75, 0x00, 0x92, 0x0e, 0x45, 0x78, 0x9f, 0xaa, 0x66, 0x7c, 0x53, - 0x20, 0xa7, 0xbd, 0xfd, 0xec, 0x14, 0xa1, 0x4d, 0x12, 0x5e, 0x4b, 0x0b, - 0x6e, 0xdb, 0x06, 0xf8, 0xf6, 0x3f, 0xee, 0xc4, 0xa3, 0xb8, 0x68, 0xdb, - 0x34, 0x94, 0xe2, 0x3e, 0xbc, 0xa0, 0x5f, 0x4f, 0x0c, 0x06, 0x2c, 0xe9, - 0x23, 0xab, 0x55, 0x1e, 0xaf, 0xdb, 0xa6, 0x6a, 0xc1, 0xbc, 0x13, 0x53, - 0x27, 0xe1, 0xd7, 0x03, 0xaf, 0x05, 0x27, 0xd0, 0xe4, 0x0e, 0x48, 0xd9, - 0xb7, 0xb6, 0x9b, 0x91, 0xe8, 0x29, 0x71, 0x01, 0xf6, 0x6a, 0x54, 0x79, - 0xec, 0xe7, 0x13, 0x47, 0xe3, 0x72, 0x4b, 0x60, 0x66, 0xef, 0x45, 0x99, - 0xb4, 0x5f, 0x8b, 0x1e, 0xf1, 0xc5, 0xa2, 0xb9, 0x2b, 0xfe, 0xe6, 0xca, - 0xf5, 0x31, 0x0d, 0x36, 0x68, 0xa1, 0x16, 0x30, 0x9e, 0x9e, 0x04, 0x4d, - 0xeb, 0xa9, 0x46, 0x62, 0x5d, 0xeb, 0x9a, 0x02, 0xc1, 0x73, 0xdf, 0x53, - 0x14, 0x71, 0xb9, 0xfb, 0xa4, 0xd5, 0x3c, 0x67, 0x4c, 0xb6, 0x02, 0x5b, - 0x27, 0x8d, 0x6e, 0x73, 0x60, 0xf1, 0x33, 0x1a, 0x89, 0xe0, 0x67, 0x88, - 0x14, 0x79, 0x51, 0x73, 0xe1, 0x87, 0x46, 0xcf, 0x2a, 0x77, 0xdd, 0x72, - 0xb8, 0xe9, 0x25, 0xb6, 0x23, 0x3c, 0x45, 0xee, 0x62, 0x8e, 0x27, 0x4c, - 0x75, 0xd5, 0x00, 0xd5, 0x0e, 0xc1, 0x56, 0xc1, 0x77, 0xf5, 0xf2, 0xcb, - 0x73, 0x56, 0x65, 0x55, 0xa6, 0x57, 0x13, 0x54, 0xb4, 0x08, 0x98, 0x68, - 0x7f, 0x56, 0xc7, 0x55, 0x8e, 0x58, 0x07, 0xcf, 0x3c, 0x04, 0xe0, 0xa2, - 0x8b, 0xa4, 0x54, 0xec, 0x30, 0xbb, 0xcf, 0x4d, 0x14, 0xe5, 0xac, 0x42, - 0x62, 0xf9, 0xf8, 0xac, 0x73, 0x5a, 0x10, 0x28, 0x4c, 0xf7, 0x38, 0xcb, - 0xfd, 0xea, 0x32, 0x85, 0x89, 0xb5, 0x7f, 0x35, 0xf7, 0xf7, 0xa9, 0x04, - 0xa0, 0x0a, 0x02, 0x74, 0x0c, 0xe0, 0x62, 0x52, 0xbc, 0xd5, 0xe3, 0x28, - 0x9f, 0x70, 0xb0, 0xa1, 0xc2, 0x17, 0x51, 0x9f, 0x6f, 0xee, 0x17, 0x0f, - 0x4f, 0x94, 0xb9, 0xae, 0x1d, 0x7a, 0x8b, 0x2a, 0x24, 0xe2, 0x8c, 0x2d, - 0x7e, 0xc0, 0xcc, 0xcd, 0x9e, 0x52, 0xd0, 0xef, 0x1e, 0xdf, 0x31, 0x5e, - 0x5e, 0xb2, 0x56, 0x85, 0x9a, 0xfa, 0x94, 0xb7, 0x37, 0x29, 0x75, 0x75, - 0x3b, 0x73, 0x8d, 0xf4, 0xae, 0xa9, 0xe1, 0x56, 0x5a, 0xcc, 0x41, 0xc3, - 0x4f, 0x2e, 0x11, 0x25, 0x81, 0xfc, 0xf2, 0xae, 0x56, 0xf3, 0xc9, 0xe5, - 0x43, 0x58, 0x1b, 0xcf, 0xcb, 0xdd, 0xa2, 0x06, 0x11, 0xcc, 0x3b, 0xd3, - 0x81, 0x06, 0x2b, 0xb7, 0xcf, 0xef, 0x12, 0x6d, 0x07, 0x3a, 0x67, 0x94, - 0x33, 0x72, 0xd3, 0x9e, 0xc1, 0xb8, 0xf2, 0xd3, 0xed, 0x72, 0xcd, 0x74, - 0x11, 0x21, 0xf3, 0xfb, 0xbf, 0xb9, 0xc6, 0xf8, 0x03, 0xb2, 0x28, 0xd8, - 0x24, 0x75, 0xb9, 0x40, 0x41, 0x77, 0x2f, 0x33, 0x6a, 0x6c, 0x17, 0xc2, - 0x60, 0x5b, 0xb4, 0xff, 0xd7, 0xd8, 0xc7, 0xa5, 0x5c, 0x6b, 0x3f, 0x1f, - 0x86, 0xa1, 0xcc, 0x63, 0x8b, 0x37, 0xb0, 0x99, 0x43, 0x4e, 0x63, 0xb2, - 0xf8, 0x81, 0xb6, 0xcc, 0xf7, 0xe3, 0xbf, 0xe3, 0xe5, 0xb6, 0xbe, 0x65, - 0xaf, 0xe1, 0xbe, 0x10, 0x8d, 0xba, 0x70, 0xb0, 0xb2, 0x52, 0x95, 0x89, - 0xb3, 0xe5, 0xb2, 0x53, 0xfe, 0x61, 0x62, 0xed, 0xe5, 0x85, 0x5b, 0x6d, - 0x62, 0xe2, 0x49, 0x36, 0xdd, 0x1a, 0x2c, 0xf1, 0x14, 0x8c, 0xe0, 0x02, - 0xc2, 0x00, 0x5b, 0xc8, 0x25, 0x87, 0xe9, 0x11, 0xb1, 0x5f, 0x0c, 0xa0, - 0xfc, 0x78, 0xd3, 0x18, 0x48, 0x31, 0xa3, 0xa0, 0x9b, 0x52, 0xd5, 0xc3, - 0x13, 0x44, 0x4b, 0xf9, 0xc9, 0x51, 0x5f, 0xae, 0xb2, 0xfb, 0xe9, 0xc9, - 0xac, 0x41, 0x56, 0x8c, 0x39, 0xf0, 0xf4, 0x5a, 0x7d, 0xa2, 0xb1, 0x64, - 0x8c, 0x85, 0x5e, 0x3e, 0x4e, 0xbd, 0xa6, 0x89, 0x15, 0x84, 0x58, 0xc1, - 0x99, 0x34, 0x4f, 0xb7, 0x1a, 0xfd, 0xad, 0x3f, 0xfe, 0xec, 0x9e, 0x3f, - 0x3c, 0x8b, 0x7d, 0x4d, 0x16, 0xaa, 0x83, 0xd5, 0xad, 0xb9, 0x49, 0xfe, - 0x86, 0x13, 0x7f, 0x4f, 0x96, 0xcc, 0x9f, 0xcc, 0xcc, 0x88, 0x50, 0x63, - 0x17, 0x8c, 0xca, 0x78, 0x61, 0x4a, 0x62, 0x18, 0x3a, 0x34, 0x48, 0x44, - 0x39, 0x26, 0x7d, 0x92, 0xa0, 0xad, 0xb0, 0x45, 0x5b, 0xdd, 0x9d, 0xca, - 0xb2, 0xa8, 0x69, 0xc8, 0x42, 0x79, 0xec, 0x23, 0x38, 0x77, 0x07, 0x06, - 0x48, 0x86, 0x16, 0xaf, 0x52, 0x59, 0x8d, 0x4f, 0x9f, 0xd6, 0x8b, 0x9b, - 0xe9, 0x67, 0x15, 0xab, 0x41, 0x7d, 0xd0, 0x9f, 0x3a, 0x76, 0x73, 0xca, - 0x03, 0x19, 0xdf, 0xa7, 0x44, 0x45, 0xbe, 0x56, 0xb3, 0xe5, 0xd7, 0xac, - 0x5c, 0x65, 0x0e, 0x08, 0x3d, 0xc9, 0x5f, 0x3b, 0x02, 0x8c, 0xa3, 0x8e, - 0x8f, 0x96, 0x21, 0x44, 0x43, 0x92, 0x9e, 0x16, 0x7f, 0x36, 0x31, 0xd8, - 0x57, 0x8b, 0xbf, 0xeb, 0x19, 0xc8, 0x10, 0x2e, 0x76, 0xdc, 0x15, 0xa7, - 0x07, 0x9e, 0xdf, 0xda, 0x47, 0x90, 0x9a, 0x0c, 0xfe, 0xac, 0x97, 0x92, - 0xad, 0x06, 0x10, 0xcb, 0x5a, 0x35, 0x01, 0x04, 0x80, 0xea, 0xd8, 0xee, - 0x26, 0x86, 0xf6, 0xce, 0xa8, 0xb5, 0xed, 0xb6, 0x88, 0x5d, 0x5e, 0xd7, - 0x00, 0xa6, 0xdc, 0xdc, 0xe3, 0xd8, 0x20, 0x30, 0xcc, 0xf1, 0x74, 0x0a, - 0x67, 0xe3, 0xab, 0x67, 0x19, 0x87, 0xd5, 0xd4, 0xeb, 0x84, 0xdc, 0x53, - 0xdf, 0xa4, 0x95, 0x09, 0x08, 0xe3, 0x9f, 0x9b, 0x33, 0x5c, 0xc8, 0x3b, - 0x26, 0xb3, 0x1c, 0xf6, 0x46, 0x45, 0x54, 0x90, 0x73, 0x90, 0x60, 0x91, - 0xee, 0x49, 0x1b, 0xd7, 0x9b, 0xb6, 0x8c, 0xdf, 0x22, 0xb1, 0x6e, 0x0e, - 0xa9, 0x81, 0x69, 0x87, 0xc0, 0x5f, 0x2b, 0x85, 0x21, 0x3a, 0x2e, 0x03, - 0xa1, 0xbf, 0x56, 0x2f, 0x6d, 0x51, 0x51, 0x2e, 0x77, 0x86, 0x6f, 0xdd, - 0x3d, 0x9b, 0xe6, 0xc9, 0xe2, 0xfc, 0x18, 0x96, 0x5a, 0x2c, 0xaa, 0x93, - 0xc9, 0x28, 0x3f, 0xf0, 0x63, 0xb7, 0x05, 0x46, 0x4a, 0x94, 0x4d, 0x0c, - 0x61, 0x22, 0x50, 0x95, 0xa1, 0x42, 0x80, 0xbd, 0x33, 0x21, 0xa8, 0x8b, - 0xdb, 0x32, 0xae, 0xe1, 0x5e, 0x5a, 0xd7, 0x7f, 0xb1, 0x1e, 0xa0, 0x72, - 0x7f, 0x8f, 0x0e, 0xc3, 0xb4, 0xa2, 0x92, 0x29, 0x25, 0x72, 0xcb, 0xff, - 0x04, 0xac, 0xda, 0x80, 0x51, 0x64, 0x28, 0x3a, 0x3f, 0xcf, 0x47, 0x42, - 0xb8, 0x2f, 0x87, 0xce, 0x91, 0x02, 0x9d, 0xaa, 0x2d, 0xf5, 0x6f, 0xf3, - 0xfe, 0x00, 0x17, 0x32, 0x31, 0xdb, 0x1c, 0x3c, 0x83, 0xdf, 0xc5, 0x8c, - 0x5c, 0xa2, 0xa1, 0x0c, 0xa6, 0xb4, 0x96, 0xf6, 0xa5, 0x2e, 0xd5, 0xa3, - 0x71, 0x32, 0xeb, 0xce, 0x1f, 0x4c, 0x1a, 0xf1, 0x93, 0xb3, 0xa4, 0xf8, - 0xcc, 0xab, 0xed, 0xeb, 0x9b, 0xfd, 0xa1, 0x27, 0x4f, 0xf6, 0x57, 0xe6, - 0xbd, 0xba, 0xe5, 0xc7, 0x21, 0xa3, 0xca, 0x93, 0xa7, 0x6d, 0x1f, 0x76, - 0xcd, 0xc2, 0xef, 0x56, 0xa3, 0xdc, 0xbd, 0x2e, 0x6d, 0xe0, 0xa7, 0xcb, - 0x4e, 0x10, 0x19, 0xca, 0x87, 0x31, 0xc8, 0xfc, 0xfe, 0xf1, 0xff, 0x06, - 0xef, 0x9e, 0x22, 0xb8, 0xa7, 0x33, 0xb9, 0xbf, 0xdf, 0x9b, 0xf9, 0x5b, - 0x46, 0x1b, 0x94, 0x29, 0x02, 0x81, 0xb2, 0xb0, 0x75, 0x85, 0x99, 0x28, - 0xfb, 0x88, 0x54, 0x9a, 0x7d, 0xcb, 0x7a, 0x3a, 0x77, 0xe3, 0x67, 0xe7, - 0xdc, 0x7c, 0x37, 0xf0, 0x23, 0xa9, 0xd4, 0x1e, 0x97, 0x03, 0x11, 0x12, - 0xe2, 0xaa, 0x3d, 0x58, 0x83, 0x8c, 0x4d, 0x33, 0xd8, 0x87, 0x4d, 0xe5, - 0xbc, 0x39, 0xab, 0x47, 0x85, 0xde, 0xf9, 0xe0, 0x64, 0x13, 0x2c, 0x1e, - 0x0e, 0xc3, 0xe2, 0x9b, 0xa0, 0x2f, 0xc2, 0x3b, 0xff, 0x6b, 0x7a, 0xd5, - 0x4f, 0x9c, 0xf9, 0x04, 0xb0, 0x5c, 0x3f, 0x31, 0xf0, 0xb1, 0x2c, 0x3c, - 0x01, 0x85, 0xc8, 0xb0, 0xe5, 0xd7, 0xd7, 0xda, 0x72, 0x73, 0xc8, 0xea, - 0xa4, 0x47, 0x81, 0x4d, 0x80, 0x23, 0x66, 0x78, 0xd7, 0x08, 0x19, 0x82, - 0x46, 0x98, 0x8a, 0x35, 0x08, 0xa6, 0x5d, 0x96, 0x66, 0x2c, 0x64, 0x6b, - 0x6a, 0xe5, 0x97, 0xaf, 0x80, 0x76, 0x97, 0x7e, 0xe3, 0x2b, 0x87, 0x15, - 0xee, 0x88, 0x72, 0xf3, 0x3d, 0x9e, 0x69, 0xcd, 0x49, 0x78, 0x5f, 0x83, - 0x2d, 0x50, 0x97, 0x71, 0xe4, 0x60, 0x91, 0xf6, 0xb2, 0x48, 0x33, 0xdf, - 0x24, 0xe5, 0xe6, 0x3e, 0x93, 0xee, 0x3d, 0xcd, 0x69, 0x80, 0xdd, 0x12, - 0x3f, 0x6c, 0x22, 0xd7, 0x4b, 0x93, 0xe7, 0xea, 0x68, 0x17, 0xea, 0xb4, - 0xec, 0x43, 0xdb, 0x02, 0x0b, 0xc3, 0xd9, 0x59, 0x6b, 0xb4, 0x69, 0x16, - 0x45, 0x2d, 0x21, 0xac, 0x9a, 0x4c, 0x3e, 0x56, 0x6a, 0x22, 0x8a, 0x36, - 0x6f, 0x05, 0xfb, 0xf0, 0xe2, 0xdd, 0x09, 0x11, 0x81, 0x0e, 0x81, 0x37, - 0xed, 0x34, 0xb4, 0xcd, 0xe4, 0xc8, 0x30, 0x4a, 0x05, 0x47, 0x95, 0xf6, - 0xf2, 0xba, 0xae, 0x14, 0x72, 0xae, 0x3f, 0x28, 0x1a, 0x1c, 0xba, 0xa9, - 0xd6, 0x52, 0x70, 0x9e, 0x2d, 0x96, 0x96, 0xac, 0xcc, 0x8a, 0xa4, 0xaf, - 0xbc, 0x6c, 0x97, 0x5d, 0x9d, 0x3c, 0xc2, 0x45, 0x7c, 0x2a, 0xc3, 0xad, - 0x4f, 0x49, 0x9d, 0xc5, 0xf7, 0x7a, 0xcf, 0xd0, 0x06, 0x3e, 0x8e, 0x47, - 0x3a, 0x33, 0x98, 0x0f, 0x6d, 0x09, 0xb9, 0x89, 0xbe, 0xfb, 0x54, 0x94, - 0xd2, 0x1b, 0x72, 0x6e, 0xcf, 0x45, 0xc8, 0x65, 0x6e, 0x8e, 0x0d, 0x06, - 0xbd, 0xd2, 0x89, 0x09, 0x6e, 0x44, 0x4a, 0x82, 0xf5, 0x4c, 0xf6, 0x0b, - 0xe1, 0x6d, 0x53, 0x0f, 0x75, 0x99, 0xa2, 0x73, 0x1e, 0xd6, 0x4f, 0xad, - 0x92, 0xde, 0x40, 0xef, 0x7a, 0x7b, 0x32, 0x2e, 0x4a, 0x29, 0x14, 0x83, - 0x09, 0xeb, 0x18, 0x34, 0x02, 0xbb, 0x7c, 0xf2, 0x70, 0x1e, 0xd8, 0x89, - 0x4e, 0x95, 0x72, 0xf6, 0x4e, 0x87, 0x67, 0x76, 0x1c, 0x80, 0x67, 0x2a, - 0xcc, 0x07, 0x97, 0xa4, 0x73, 0xaa, 0x75, 0x4b, 0x36, 0xf6, 0x56, 0x77, - 0x22, 0x0b, 0xf4, 0xcc, 0x7d, 0x2e, 0x67, 0xfa, 0x67, 0xd8, 0x37, 0xd4, - 0x75, 0x3b, 0xaf, 0x08, 0x55, 0x5f, 0x2d, 0xd9, 0x27, 0x54, 0xcb, 0x05, - 0xb9, 0xa8, 0x69, 0x99, 0x67, 0xc6, 0x44, 0xb9, 0xf3, 0xf1, 0x6b, 0x7a, - 0xeb, 0xab, 0x1e, 0x22, 0x7d, 0x52, 0x01, 0xb8, 0xd8, 0x94, 0x1f, 0x4e, - 0x39, 0x00, 0x4a, 0x87, 0x57, 0xde, 0xbd, 0xb7, 0xf5, 0xdd, 0x84, 0x71, - 0xf6, 0xd9, 0x35, 0x28, 0xe5, 0xd2, 0x25, 0xc0, 0xaa, 0x3b, 0x5d, 0x76, - 0x88, 0xc3, 0x44, 0x40, 0x44, 0x1b, 0xdb, 0xd7, 0x10, 0x00, 0x0b, 0x26, - 0xcb, 0xa0, 0xa9, 0x9a, 0x40, 0x06, 0x7d, 0x55, 0x5b, 0x38, 0x3e, 0xe6, - 0x9e, 0xb4, 0xd3, 0x8c, 0x87, 0xa1, 0x2a, 0x6b, 0xdf, 0x4e, 0xd8, 0x69, - 0x81, 0x6a, 0xc8, 0x77, 0x0a, 0x7f, 0x70, 0x8b, 0xf3, 0x4b, 0xe5, 0x59, - 0x52, 0x9a, 0xc1, 0x9a, 0x2c, 0x81, 0x0e, 0x5d, 0x4c, 0x9c, 0x6a, 0xf8, - 0xcd, 0x22, 0xfc, 0xf6, 0x65, 0xfa, 0x15, 0x7d, 0x30, 0x4f, 0x04, 0x82, - 0xba, 0x96, 0x58, 0x5f, 0x15, 0xc9, 0x4a, 0x30, 0x6a, 0x69, 0x78, 0x3b, - 0x7c, 0x59, 0x00, 0xca, 0xc3, 0x37, 0x1b, 0xa3, 0x71, 0x79, 0x76, 0xfa, - 0xbf, 0x44, 0x0d, 0x7d, 0xbc, 0x79, 0xa6, 0x53, 0x3c, 0xab, 0x63, 0x17, - 0x28, 0x7c, 0xdc, 0x86, 0x40, 0x4f, 0xbf, 0x94, 0x2d, 0xbf, 0x15, 0xa9, - 0xec, 0x8e, 0xb0, 0x5a, 0xb3, 0x5f, 0x7e, 0x60, 0x86, 0x18, 0xe6, 0x77, - 0x7a, 0xf4, 0x96, 0xf9, 0x0b, 0x3c, 0x89, 0xe5, 0x18, 0xb3, 0x59, 0x5a, - 0xa1, 0xbf, 0x36, 0xb1, 0xd3, 0xd3, 0xd4, 0x69, 0x73, 0xb0, 0xed, 0x89, - 0x3f, 0xd3, 0xc6, 0x2e, 0xf5, 0x2b, 0xaa, 0x6a, 0x10, 0xbe, 0x4c, 0x23, - 0x6b, 0xf8, 0x4a, 0x69, 0xcc, 0x8a, 0xe8, 0xc9, 0x38, 0x1e, 0x70, 0xd7, - 0x16, 0xf7, 0x8f, 0x9a, 0x26, 0xad, 0xed, 0x70, 0xe3, 0xb4, 0x6f, 0xc6, - 0x3a, 0x2a, 0x5c, 0x83, 0xef, 0x00, 0x79, 0xcf, 0xcd, 0x25, 0xe7, 0xaa, - 0x3d, 0x32, 0xf9, 0x81, 0x0d, 0x31, 0x07, 0xf4, 0x39, 0x9c, 0xbb, 0xf6, - 0xde, 0x4a, 0x02, 0x3b, 0x4a, 0x5d, 0x78, 0x60, 0x9c, 0x46, 0x6f, 0xa2, - 0x35, 0xf6, 0x0d, 0x2d, 0xc2, 0x77, 0x2b, 0x35, 0x43, 0xcb, 0xcd, 0xe4, - 0xc5, 0x97, 0xcb, 0x29, 0xe5, 0x29, 0x02, 0x2f, 0x93, 0xc1, 0x49, 0x10, - 0x7e, 0xfe, 0x44, 0x66, 0xf9, 0x82, 0xcd, 0xb0, 0xb8, 0xd9, 0xf0, 0xb4, - 0x59, 0x68, 0xc5, 0x8f, 0x48, 0x66, 0x3a, 0x44, 0xac, 0x84, 0x0d, 0x43, - 0x62, 0x8f, 0x86, 0x51, 0xef, 0x23, 0x3f, 0x33, 0x35, 0x72, 0x50, 0xfb, - 0x34, 0xb0, 0x31, 0x1e, 0x86, 0x45, 0x8a, 0x04, 0xe5, 0x82, 0x8f, 0x0d, - 0xbe, 0x94, 0xbb, 0x0d, 0x50, 0xb8, 0x1c, 0x80, 0x02, 0x75, 0x65, 0xda, - 0x6a, 0x56, 0xa8, 0xb2, 0x88, 0xe1, 0x33, 0xa3, 0x08, 0x66, 0x28, 0x51, - 0x18, 0xbf, 0x39, 0x7f, 0x1b, 0xf4, 0x9d, 0x5d, 0xcc, 0x65, 0xfb, 0xe3, - 0xe4, 0x4f, 0xa6, 0x12, 0x13, 0xe4, 0x97, 0xe0, 0x94, 0xb6, 0x81, 0xe1, - 0xd2, 0x00, 0x4a, 0x4e, 0xf6, 0xb4, 0xf6, 0x10, 0x76, 0x67, 0xdb, 0x13, - 0x99, 0x4b, 0x8d, 0xd8, 0x54, 0x53, 0x71, 0x67, 0xa9, 0x75, 0x61, 0xf0, - 0x71, 0xcb, 0xe6, 0x69, 0x91, 0xca, 0xcf, 0x12, 0xd7, 0x10, 0x84, 0x2c, - 0x69, 0x80, 0x19, 0x98, 0x79, 0x5d, 0x15, 0x85, 0x5a, 0x31, 0x30, 0x9f, - 0x0e, 0x48, 0x0b, 0x58, 0x37, 0xdd, 0xac, 0xd8, 0x1d, 0x51, 0x62, 0x2a, - 0x7f, 0x15, 0xe4, 0x47, 0x31, 0x26, 0xb1, 0x08, 0x7b, 0xf6, 0x17, 0x48, - 0xd2, 0xb6, 0x65, 0x2c, 0x12, 0x63, 0x7e, 0x3a, 0x2a, 0xc7, 0x73, 0x28, - 0x62, 0x7b, 0x83, 0x9f, 0x54, 0x74, 0x47, 0x62, 0xb9, 0xb6, 0x50, 0xdb, - 0xf3, 0x7d, 0xae, 0xd2, 0x4c, 0xff, 0x2f, 0x80, 0x31, 0x0e, 0xc4, 0x7e, - 0xf6, 0x3d, 0x79, 0x52, 0xda, 0x35, 0x61, 0xda, 0x22, 0xa1, 0x1e, 0x2e, - 0x5a, 0x86, 0xb7, 0x8c, 0x0a, 0x4d, 0xd6, 0x14, 0x13, 0xe8, 0x5f, 0x0f, - 0x4d, 0x63, 0xb7, 0x39, 0x15, 0x4a, 0x83, 0xf5, 0xc0, 0x3b, 0xde, 0x75, - 0x82, 0xb6, 0x0f, 0xc6, 0x5b, 0x48, 0xc3, 0x65, 0xf7, 0x4b, 0xa4, 0x75, - 0x87, 0x07, 0x1c, 0x1d, 0x9b, 0x5f, 0x8c, 0x6e, 0x17, 0xc8, 0x78, 0x71, - 0x43, 0x0d, 0x45, 0x0f, 0x22, 0x87, 0xb7, 0x68, 0x07, 0x0b, 0x74, 0x13, - 0x64, 0xf2, 0x8b, 0xc0, 0x68, 0xe0, 0xdd, 0x59, 0x85, 0x98, 0x7e, 0x41, - 0x11, 0xef, 0x2f, 0xcd, 0xc0, 0x37, 0xe8, 0x68, 0x5d, 0xce, 0x55, 0x2f, - 0x07, 0xaf, 0xd7, 0x59, 0x4d, 0x8c, 0x7e, 0xf4, 0xd6, 0x55, 0x60, 0xe7, - 0x28, 0xe8, 0x60, 0xe1, 0xf3, 0x7d, 0x03, 0x4c, 0xcc, 0x20, 0xed, 0x40, - 0x00, 0x61, 0x62, 0x5a, 0x71, 0x2b, 0x68, 0x21, 0xe6, 0x3f, 0x90, 0x9b, - 0x90, 0x1d, 0xb5, 0xda, 0xc7, 0x35, 0xfa, 0x07, 0x5b, 0x59, 0x4d, 0x71, - 0x5f, 0xc0, 0xaa, 0xde, 0xe8, 0xf0, 0x3e, 0xaa, 0xe8, 0x1f, 0xb1, 0x41, - 0x80, 0x24, 0x10, 0xd2, 0x65, 0x79, 0xe1, 0x06, 0x86, 0xb8, 0xfb, 0xa0, - 0xa6, 0xbd, 0xe7, 0xc2, 0xff, 0x13, 0x30, 0xcd, 0xc6, 0x4b, 0x77, 0x1b, - 0x85, 0x5c, 0xf6, 0xfa, 0x31, 0x27, 0x7a, 0xa6, 0xdf, 0x3c, 0x06, 0x9c, - 0xb5, 0x40, 0xc5, 0xff, 0x25, 0x9f, 0x56, 0x37, 0x41, 0x5b, 0x68, 0xc4, - 0x7e, 0x60, 0xc6, 0xa9, 0xc1, 0xa3, 0xfc, 0xce, 0x59, 0x5e, 0x59, 0x50, - 0x9a, 0xd3, 0xae, 0xe6, 0x29, 0x44, 0xd9, 0xfc, 0x7d, 0xbf, 0x55, 0x67, - 0x04, 0xd9, 0xc2, 0x8b, 0x58, 0x89, 0xbb, 0x10, 0x43, 0x25, 0xbb, 0x21, - 0xbc, 0xe0, 0xcb, 0xa8, 0x3f, 0xf6, 0x58, 0xbf, 0x0b, 0x50, 0xd2, 0x34, - 0x39, 0x76, 0xd2, 0xff, 0x33, 0x13, 0xae, 0x61, 0x59, 0xa6, 0x75, 0x36, - 0xb0, 0x6b, 0x5b, 0xbb, 0x17, 0xa5, 0x77, 0xf0, 0x65, 0x2f, 0xb6, 0xfb, - 0x2b, 0x1f, 0xc8, 0x7e, 0xf7, 0xe7, 0xef, 0x87, 0x72, 0x57, 0x70, 0xcb, - 0x7a, 0x7f, 0xd1, 0xa5, 0x95, 0x65, 0x17, 0xaf, 0x31, 0x8b, 0x57, 0x3d, - 0x04, 0xaa, 0xfd, 0x0a, 0xe6, 0xfc, 0x2f, 0x9a, 0xcc, 0x15, 0xf2, 0xb9, - 0x0f, 0x90, 0x5e, 0x00, 0x44, 0x23, 0x1d, 0xb0, 0x86, 0x2a, 0x08, 0x7e, - 0x76, 0x3e, 0x2a, 0xf2, 0xa4, 0x46, 0x66, 0x9e, 0x98, 0x0b, 0x0f, 0xc8, - 0xae, 0x34, 0xf4, 0xca, 0x4b, 0xd7, 0xbb, 0x3b, 0x9f, 0xcd, 0x30, 0x65, - 0x0c, 0xa6, 0xe3, 0xff, 0xc2, 0x60, 0xa8, 0x6b, 0x95, 0xeb, 0x6d, 0x47, - 0xb9, 0x90, 0xfa, 0x1a, 0xc0, 0x13, 0x09, 0x51, 0x33, 0x8d, 0xd3, 0x88, - 0x56, 0xed, 0x93, 0x31, 0x8a, 0x32, 0xa7, 0x66, 0xc1, 0x93, 0xda, 0x75, - 0xaf, 0x01, 0xfb, 0xb0, 0xc4, 0xba, 0x79, 0xb0, 0xf4, 0x0c, 0xca, 0xdd, - 0xd9, 0x8f, 0x9e, 0xa2, 0xc1, 0x22, 0x4a, 0x3a, 0x73, 0x81, 0xbe, 0x08, - 0x5c, 0x73, 0x08, 0xb2, 0x2b, 0x05, 0xdd, 0x07, 0x5a, 0x3e, 0x95, 0x58, - 0x37, 0x61, 0xa9, 0x60, 0x85, 0x89, 0x39, 0x15, 0xa8, 0xbf, 0xca, 0xcb, - 0xbb, 0x9f, 0x4c, 0x1c, 0x0b, 0x21, 0x74, 0x20, 0x19, 0x5b, 0xa4, 0x5a, - 0xf6, 0xbc, 0x11, 0x93, 0xaf, 0xa5, 0xd7, 0x39, 0x01, 0x73, 0x1a, 0xfa, - 0xd6, 0x18, 0x45, 0x6a, 0xda, 0x1b, 0x73, 0xea, 0x5c, 0x58, 0x07, 0x11, - 0x50, 0xc4, 0xa2, 0x08, 0x73, 0xb4, 0x9a, 0xc3, 0x35, 0xd1, 0xd3, 0xc0, - 0x8a, 0x0c, 0x8c, 0x68, 0xb0, 0x2c, 0x95, 0x33, 0xe5, 0x71, 0x0d, 0x3e, - 0xc6, 0x68, 0xfe, 0x57, 0x63, 0xa8, 0x94, 0xaa, 0x32, 0xb5, 0xc9, 0x64, - 0xa0, 0x65, 0xce, 0xda, 0x23, 0xba, 0x66, 0x4d, 0x48, 0x8a, 0x1b, 0x8b, - 0xe9, 0x97, 0x87, 0xd5, 0x15, 0xa6, 0x21, 0x11, 0x42, 0x41, 0x74, 0x56, - 0x39, 0xa5, 0x34, 0xc9, 0x16, 0x46, 0x78, 0xa5, 0x91, 0xc4, 0xbf, 0x73, - 0x1e, 0x74, 0xcd, 0x7b, 0xf7, 0x81, 0x8e, 0x3d, 0xe6, 0x22, 0xb5, 0x85, - 0x18, 0xc2, 0x7f, 0xf3, 0x17, 0x0f, 0x58, 0x38, 0x3c, 0x60, 0xb4, 0x75, - 0x71, 0xb1, 0x39, 0x66, 0x54, 0x23, 0xd1, 0x70, 0x68, 0x9f, 0x0c, 0x1c, - 0x5a, 0xe7, 0xa9, 0x96, 0x8b, 0x2b, 0xde, 0xf0, 0x1e, 0x14, 0x0f, 0xee, - 0x88, 0x61, 0xe1, 0x25, 0xf9, 0x35, 0x6b, 0xda, 0x39, 0x0d, 0x96, 0x58, - 0xac, 0x59, 0x54, 0x89, 0x6a, 0x61, 0x1d, 0x99, 0xeb, 0xd2, 0x81, 0x62, - 0x98, 0x5c, 0x2e, 0x31, 0xd9, 0x33, 0xd7, 0xd8, 0xe5, 0xf8, 0x8f, 0x7f, - 0xd6, 0x2c, 0x85, 0xe3, 0x8f, 0x70, 0x78, 0x9b, 0x63, 0xc0, 0xff, 0xeb, - 0x7a, 0x4b, 0xe5, 0x87, 0x28, 0xf5, 0x86, 0xa7, 0xa7, 0xff, 0xb6, 0xeb, - 0x26, 0xdc, 0xb7, 0xaa, 0xc5, 0x18, 0x3f, 0x03, 0xee, 0x18, 0x6a, 0xdb, - 0xef, 0x7a, 0xaf, 0xa8, 0xe6, 0xc3, 0x75, 0x81, 0xe9, 0x20, 0x97, 0xa0, - 0xf7, 0x41, 0x6d, 0x53, 0x56, 0x48, 0x28, 0xb0, 0x12, 0x77, 0x94, 0x47, - 0x1f, 0x16, 0xbb, 0x5c, 0x54, 0x05, 0x27, 0x6e, 0xca, 0x20, 0xbf, 0x25, - 0x48, 0x8b, 0x64, 0x2a, 0x85, 0x85, 0x3d, 0xac, 0x86, 0xac, 0x8e, 0x62, - 0x95, 0x1b, 0x04, 0xc8, 0x3f, 0x8d, 0x4b, 0x59, 0x7e, 0x18, 0x13, 0x93, - 0x7f, 0xf0, 0x89, 0x83, 0x78, 0xdc, 0xa7, 0x33, 0x52, 0xd6, 0x15, 0xe2, - 0x06, 0xda, 0xda, 0x92, 0xbe, 0x8e, 0xa4, 0x7c, 0xea, 0x22, 0xef, 0x77, - 0x84, 0x0e, 0xe7, 0x6b, 0xa8, 0x24, 0x19, 0x40, 0xc3, 0xdd, 0xec, 0x0f, - 0x2e, 0xf4, 0x96, 0xf6, 0xb6, 0x94, 0x6d, 0xa3, 0x83, 0x31, 0x84, 0x76, - 0x3e, 0xfb, 0x94, 0x3a, 0x25, 0xb5, 0x72, 0x9d, 0xd6, 0xcb, 0x15, 0xc3, - 0xa2, 0x7b, 0x91, 0xdf, 0xff, 0x78, 0x10, 0x63, 0x3e, 0xee, 0xe9, 0x14, - 0x05, 0x54, 0x36, 0x88, 0xfd, 0x7f, 0x06, 0x54, 0x0b, 0xb8, 0x3e, 0x14, - 0x26, 0x47, 0x8b, 0xb1, 0x88, 0xcb, 0x69, 0xe8, 0x59, 0x35, 0xb5, 0x32, - 0xce, 0x18, 0x05, 0x36, 0xa8, 0xa4, 0x94, 0x2b, 0x34, 0xcc, 0x2a, 0x06, - 0xda, 0x73, 0x5b, 0x3e, 0x26, 0x21, 0xef, 0x98, 0x9a, 0x01, 0x67, 0xa2, - 0x8c, 0x84, 0x8f, 0x5a, 0xdb, 0x49, 0xf3, 0x48, 0x20, 0xd8, 0x2e, 0xdd, - 0xb9, 0x55, 0xf5, 0x38, 0x3d, 0x88, 0x2e, 0x4e, 0x3e, 0x66, 0x41, 0x0a, - 0x4d, 0x87, 0x4b, 0x36, 0xf1, 0x89, 0x0c, 0xbb, 0x20, 0x53, 0x5b, 0x3d, - 0xb6, 0xcf, 0xba, 0x6a, 0xa9, 0xb9, 0x64, 0xd4, 0xe6, 0xda, 0xd8, 0xed, - 0x34, 0x2a, 0xde, 0xbb, 0x5a, 0x27, 0xf6, 0x55, 0x2d, 0x49, 0xbb, 0xbe, - 0x2f, 0x00, 0xd1, 0xe3, 0x35, 0x47, 0xe2, 0x95, 0x49, 0x6a, 0x9d, 0x47, - 0xc2, 0xf3, 0x75, 0x5c, 0xb1, 0x70, 0x31, 0x4f, 0xfd, 0xe6, 0xa3, 0xd2, - 0x67, 0x02, 0xd5, 0xa3, 0x15, 0x6c, 0xb6, 0xaa, 0x89, 0x72, 0x95, 0xbe, - 0xa1, 0x2f, 0x38, 0x25, 0xb8, 0xff, 0xa7, 0xfc, 0x49, 0xc9, 0xf4, 0xa5, - 0x52, 0x8e, 0xf3, 0xeb, 0x3d, 0xa0, 0x15, 0xa2, 0x21, 0x00, 0xeb, 0x6a, - 0xb8, 0x5b, 0xcf, 0x7c, 0xc0, 0x5e, 0x80, 0x25, 0x06, 0x80, 0xf3, 0x66, - 0x7d, 0xfb, 0xad, 0x9e, 0x65, 0x17, 0xd6, 0x34, 0x2a, 0x81, 0xfc, 0xe8, - 0x30, 0xc7, 0xc4, 0x2e, 0x94, 0x30, 0x2f, 0x27, 0xb2, 0xf2, 0xab, 0xa3, - 0x38, 0xe8, 0xf6, 0x15, 0xe2, 0x4c, 0x46, 0x05, 0x19, 0x34, 0xac, 0x6b, - 0xfd, 0xce, 0xf4, 0x85, 0x23, 0x01, 0x0c, 0xfe, 0xdf, 0xdb, 0x76, 0xea, - 0x23, 0x12, 0xf1, 0xe1, 0x72, 0xd4, 0xb9, 0xbd, 0x4c, 0xbe, 0x7f, 0xd3, - 0x15, 0x35, 0xdd, 0xe0, 0xb5, 0xc4, 0xf0, 0x71, 0x2d, 0x54, 0x31, 0xb6, - 0xfe, 0xcd, 0xc8, 0x66, 0x48, 0x7c, 0x86, 0xf4, 0x0a, 0x38, 0x80, 0x8d, - 0x37, 0x29, 0x4b, 0x0c, 0x3f, 0xc1, 0x9c, 0x5f, 0x2e, 0x41, 0xab, 0x87, - 0xb6, 0x5a, 0xd9, 0x73, 0x8f, 0xe6, 0x79, 0x73, 0x9c, 0xe1, 0x25, 0x43, - 0x03, 0x12, 0xa6, 0x20, 0x7d, 0x02, 0xe2, 0x10, 0xc6, 0x9c, 0x87, 0x68, - 0x90, 0xf2, 0xf3, 0xcf, 0x0d, 0x54, 0xe1, 0xdb, 0xf7, 0x3b, 0x25, 0x09, - 0xba, 0x26, 0x11, 0x9c, 0xb9, 0xb7, 0xaf, 0xea, 0xc8, 0x14, 0xec, 0x40, - 0x33, 0xc0, 0xd8, 0x65, 0x72, 0xaf, 0x29, 0x4d, 0x04, 0x32, 0xe5, 0x7a, - 0x22, 0xd4, 0x85, 0x62, 0x70, 0x8e, 0xe4, 0x33, 0xc1, 0x63, 0x63, 0xfc, - 0x25, 0x7d, 0x77, 0x36, 0xbc, 0x04, 0xc7, 0x59, 0xe2, 0xf6, 0x0c, 0x70, - 0x46, 0x4e, 0x49, 0x33, 0x99, 0xc2, 0x07, 0xae, 0xac, 0x82, 0x6e, 0x15, - 0xe0, 0x93, 0x53, 0x33, 0xaa, 0xf8, 0x5b, 0x30, 0x03, 0xfe, 0x86, 0xde, - 0x30, 0xd6, 0x3a, 0x94, 0x12, 0x1b, 0x39, 0xd5, 0x4e, 0xdb, 0x22, 0xc4, - 0xd3, 0xf2, 0xae, 0x12, 0x82, 0xac, 0xb1, 0x72, 0x11, 0xa4, 0x8a, 0x3d, - 0xcd, 0x03, 0x8e, 0xed, 0xa5, 0xe4, 0xe1, 0xec, 0xe0, 0xd0, 0x70, 0x32, - 0x83, 0x60, 0xf8, 0x4a, 0x37, 0x89, 0xe5, 0x29, 0x46, 0xd4, 0xa7, 0x4a, - 0xa3, 0xf7, 0x79, 0x74, 0x58, 0x83, 0x1d, 0xea, 0x0f, 0xcf, 0x65, 0xc6, - 0xab, 0x20, 0x8e, 0x89, 0x3e, 0xd5, 0x61, 0x9c, 0xff, 0x68, 0x0b, 0x88, - 0xb1, 0xda, 0x76, 0x39, 0xd8, 0xff, 0x5e, 0xc3, 0x27, 0x80, 0xd4, 0x9d, - 0x7b, 0x3a, 0x22, 0xa4, 0xe8, 0x49, 0x81, 0x5b, 0xc5, 0x33, 0x46, 0x92, - 0x18, 0xa1, 0xe1, 0xbc, 0xfd, 0x52, 0xe0, 0xf4, 0x46, 0xc5, 0xf3, 0x79, - 0xd2, 0xa0, 0xf4, 0x61, 0xae, 0x6b, 0xd3, 0xc0, 0xcd, 0x2f, 0x2d, 0xbe, - 0xfb, 0x4f, 0xb1, 0xdc, 0x35, 0x36, 0x75, 0xfa, 0x71, 0x4b, 0xfd, 0x17, - 0xba, 0x0c, 0x58, 0x0e, 0x7c, 0x2f, 0xa0, 0x7f, 0x69, 0x17, 0x85, 0x1e, - 0xe7, 0xd7, 0x87, 0xd0, 0x61, 0xc2, 0x5f, 0xe1, 0xb8, 0x26, 0x39, 0xa9, - 0xeb, 0xda, 0xd7, 0xa9, 0x52, 0xd1, 0xeb, 0xc2, 0x19, 0xb0, 0x35, 0x58, - 0xa9, 0x47, 0x3b, 0x91, 0x61, 0x87, 0xb1, 0xf1, 0x00, 0x12, 0x22, 0x2f, - 0xd7, 0x8a, 0xb5, 0x5f, 0xa0, 0xe3, 0x87, 0xdc, 0x05, 0xc2, 0x84, 0x99, - 0x97, 0x67, 0xc0, 0x9f, 0x82, 0x4c, 0x31, 0x82, 0xe1, 0x4c, 0xf5, 0x6f, - 0x0d, 0x6c, 0xff, 0xe2, 0x05, 0xb0, 0x0b, 0x83, 0xbf, 0x50, 0xb0, 0xae, - 0x8b, 0x32, 0x01, 0x3f, 0xdd, 0xfd, 0x54, 0xaf, 0x06, 0x50, 0x29, 0x07, - 0xee, 0x77, 0x9f, 0x9c, 0xa0, 0x17, 0x5c, 0xbc, 0x4e, 0x0e, 0x2d, 0x5f, - 0xfd, 0xac, 0x18, 0xbd, 0xf6, 0x8d, 0x19, 0xb3, 0x75, 0x68, 0xe8, 0xd6, - 0x65, 0xd4, 0x83, 0xb3, 0xd0, 0x9a, 0xca, 0xbd, 0xdc, 0x10, 0x7f, 0x17, - 0xb0, 0x69, 0x78, 0x8c, 0x61, 0x12, 0x0e, 0x6b, 0xf5, 0xe4, 0x20, 0x5b, - 0xfd, 0x35, 0x65, 0xc2, 0xdc, 0x23, 0x45, 0x1e, 0xd2, 0xec, 0xbf, 0x1c, - 0xa5, 0xa5, 0x2b, 0xcb, 0xb3, 0x22, 0x63, 0x4c, 0x9c, 0x3a, 0xc7, 0x78, - 0xfb, 0x85, 0xfa, 0x0d, 0x5e, 0xe9, 0x1a, 0x35, 0x81, 0x64, 0xc2, 0xf2, - 0x4e, 0xc6, 0x14, 0xfb, 0x37, 0x1c, 0x6e, 0xb2, 0x97, 0xf7, 0x9a, 0xb4, - 0x96, 0x77, 0x9a, 0x31, 0x52, 0xc1, 0xf0, 0xac, 0x5e, 0xd6, 0x76, 0xe9, - 0x96, 0x41, 0x52, 0x31, 0xa2, 0xa6, 0xd7, 0x04, 0x9d, 0xeb, 0x7d, 0xde, - 0x86, 0x42, 0x61, 0xed, 0x1a, 0xdf, 0x82, 0xf2, 0x5d, 0xba, 0x60, 0x09, - 0x18, 0x39, 0x68, 0x2a, 0x42, 0xce, 0x93, 0x0b, 0x79, 0xcc, 0x94, 0x58, - 0x6c, 0x18, 0x83, 0x08, 0x28, 0x6c, 0x8d, 0xc4, 0xb8, 0x4d, 0xd2, 0xa4, - 0xfb, 0xff, 0x31, 0xb1, 0xa2, 0x29, 0x3e, 0xb4, 0xf9, 0x01, 0x91, 0x3b, - 0xd9, 0x85, 0xd9, 0x3b, 0xf7, 0x3e, 0x00, 0xd0, 0xff, 0xb6, 0xba, 0x5b, - 0xff, 0x22, 0x88, 0xab, 0x5d, 0x11, 0x12, 0x08, 0x80, 0x32, 0x0f, 0xdf, - 0x8a, 0xf3, 0x86, 0xcc, 0x37, 0xfc, 0xc0, 0xe8, 0x61, 0xe3, 0xf6, 0x8a, - 0x67, 0xb4, 0x0f, 0x2f, 0x8f, 0x7f, 0xdc, 0x5b, 0x70, 0xfe, 0xf0, 0x5c, - 0xab, 0x14, 0x17, 0x9b, 0x29, 0x08, 0x0d, 0x92, 0x42, 0xac, 0x4a, 0xd3, - 0xb5, 0xcc, 0x46, 0xff, 0x42, 0xa7, 0xb1, 0x2f, 0xfa, 0xff, 0xf3, 0x30, - 0xe3, 0x5d, 0xd4, 0x3e, 0xcc, 0x49, 0x5e, 0x21, 0x39, 0x59, 0xd1, 0x37, - 0xb3, 0xf2, 0x08, 0x2b, 0xc1, 0x61, 0xe1, 0x95, 0xbb, 0xd9, 0xc0, 0xd8, - 0xe3, 0x7f, 0xa0, 0xe8, 0x2b, 0x44, 0xb4, 0x87, 0xfb, 0x55, 0x49, 0x43, - 0x2e, 0xef, 0x4c, 0x77, 0xfc, 0xae, 0x44, 0x24, 0xff, 0x20, 0x41, 0xa4, - 0x9a, 0xff, 0x42, 0x97, 0x8b, 0x11, 0x63, 0x93, 0xef, 0xa9, 0x98, 0x98, - 0x12, 0x34, 0x6f, 0x76, 0x45, 0x88, 0xa8, 0x20, 0x9a, 0xeb, 0x5c, 0xc2, - 0x7c, 0x66, 0xa6, 0x56, 0x16, 0xef, 0xf2, 0xb5, 0x28, 0x94, 0x7a, 0x4f, - 0x14, 0x8e, 0xda, 0xa9, 0x79, 0x33, 0xfd, 0xdc, 0x56, 0x1d, 0x67, 0x6f, - 0xb1, 0x8d, 0x43, 0xc5, 0x49, 0x49, 0x99, 0xd4, 0xa3, 0x77, 0x72, 0x8d, - 0x88, 0xab, 0x15, 0xf2, 0x19, 0x35, 0x3c, 0xe5, 0xc5, 0x8a, 0x66, 0xb9, - 0x63, 0x9e, 0xfc, 0x04, 0xd0, 0x97, 0xd3, 0xa6, 0xe4, 0xb0, 0x48, 0xef, - 0x85, 0x0d, 0x62, 0xf7, 0x85, 0x3c, 0xff, 0x4b, 0x9e, 0x4e, 0x29, 0x9e, - 0xb5, 0xf4, 0x37, 0x2c, 0x96, 0x76, 0x9b, 0x4d, 0xdc, 0x3a, 0xab, 0x58, - 0xbe, 0x31, 0x30, 0xa0, 0xbf, 0x8e, 0x03, 0xcd, 0x46, 0xe3, 0xec, 0xc1, - 0x1e, 0x37, 0x11, 0x4b, 0xda, 0x6f, 0x6b, 0xc0, 0x21, 0xe9, 0xc4, 0x4e, - 0xae, 0x8b, 0x4e, 0x1c, 0x1d, 0x35, 0x98, 0x16, 0x57, 0x3f, 0x5c, 0x4b, - 0x0d, 0xf2, 0x28, 0xce, 0x2e, 0xb1, 0xd8, 0x5c, 0x4b, 0x55, 0x03, 0x94, - 0x9c, 0x71, 0x84, 0x9b, 0x7f, 0xfa, 0xe0, 0x89, 0x05, 0x83, 0x7f, 0xee, - 0x90, 0x17, 0xf6, 0xb2, 0x10, 0x91, 0x7d, 0x05, 0xad, 0xa1, 0x73, 0xa7, - 0x73, 0xfb, 0xca, 0x46, 0x30, 0x81, 0x56, 0x90, 0x92, 0xca, 0x33, 0xa3, - 0x72, 0x6f, 0xd2, 0x5f, 0x97, 0x07, 0x92, 0x01, 0xb1, 0x2b, 0x1e, 0x52, - 0x69, 0x8e, 0x19, 0x0d, 0x59, 0xb4, 0x80, 0xf6, 0xf3, 0x8a, 0x1f, 0xf5, - 0x0a, 0xa0, 0x7d, 0xed, 0x4a, 0x83, 0xbd, 0x78, 0xea, 0x63, 0xd5, 0xd9, - 0x6e, 0x36, 0xfc, 0x36, 0x0c, 0x49, 0xea, 0xdc, 0x7b, 0x44, 0x19, 0x03, - 0x81, 0xdb, 0xeb, 0xcc, 0x0e, 0x85, 0x9c, 0x52, 0x67, 0x54, 0x8b, 0x08, - 0x52, 0x08, 0xc1, 0x2a, 0xb0, 0x24, 0xf0, 0xed, 0x2b, 0x7e, 0x6e, 0x5b, - 0xc1, 0x13, 0x34, 0x57, 0x0f, 0x6d, 0x45, 0x7e, 0x5c, 0x54, 0x50, 0x4b, - 0xa5, 0x14, 0x92, 0x4a, 0xd3, 0xeb, 0x4a, 0x1d, 0x8f, 0xee, 0xee, 0x52, - 0x24, 0xf4, 0xfd, 0x95, 0x09, 0x57, 0x49, 0x3b, 0x2f, 0x88, 0x04, 0xa4, - 0x98, 0x72, 0x5b, 0x8a, 0x8f, 0xc4, 0x5d, 0x7a, 0x5b, 0xaa, 0xc7, 0xff, - 0xfb, 0xbe, 0x7a, 0xcb, 0xba, 0xaf, 0xf1, 0xe3, 0x6b, 0x57, 0xef, 0x36, - 0xd0, 0x81, 0x27, 0x32, 0x89, 0xb9, 0x2d, 0x6a, 0x5a, 0x9a, 0xe4, 0x84, - 0x0e, 0x88, 0xbe, 0xf1, 0xd7, 0xd0, 0x63, 0xec, 0xd6, 0x53, 0xe5, 0xf0, - 0x9b, 0xad, 0x7b, 0x35, 0xab, 0xd5, 0x79, 0xf6, 0x3d, 0xe5, 0x51, 0xbe, - 0x13, 0x01, 0x77, 0xdc, 0x1f, 0xaf, 0x8c, 0x6e, 0x40, 0xb8, 0x98, 0xda, - 0x3f, 0xbe, 0xac, 0x7d, 0x26, 0xdf, 0xc7, 0xe1, 0x73, 0x4c, 0x6d, 0x8b, - 0x38, 0xc1, 0xfd, 0x76, 0x15, 0x0c, 0x96, 0x37, 0x6e, 0x0b, 0xd7, 0xfa, - 0xf3, 0xa9, 0x19, 0xaa, 0x13, 0xe8, 0x4e, 0xf6, 0x22, 0xe7, 0xb1, 0x5e, - 0x7d, 0xd4, 0xf0, 0xab, 0x2b, 0x81, 0xb6, 0x48, 0x22, 0xc9, 0xdf, 0x6e, - 0x62, 0x6e, 0xf6, 0x38, 0x78, 0xf3, 0x46, 0xba, 0x25, 0x58, 0x5d, 0xf4, - 0x22, 0x17, 0xc9, 0x3a, 0xd1, 0xc9, 0x5d, 0x36, 0x3e, 0xe5, 0xc7, 0x72, - 0x22, 0x12, 0x60, 0xb8, 0xf2, 0xcf, 0x02, 0x0b, 0xd3, 0xe2, 0x1a, 0xac, - 0xe5, 0xe3, 0xb9, 0xcc, 0x10, 0x35, 0x27, 0x23, 0x11, 0xbb, 0x30, 0x09, - 0xf1, 0x11, 0xea, 0x51, 0xa0, 0xc4, 0x9b, 0x20, 0xd8, 0x42, 0xb3, 0x89, - 0x5e, 0xb7, 0x16, 0xa1, 0x10, 0xe2, 0x9c, 0x5d, 0x6a, 0x02, 0xc5, 0xf2, - 0x33, 0x92, 0xff, 0xe2, 0xcc, 0x87, 0x90, 0xe6, 0xe6, 0xbf, 0xb0, 0xf7, - 0x50, 0xbc, 0xcc, 0xa3, 0x05, 0x0c, 0x2f, 0x53, 0x57, 0x63, 0x15, 0xf6, - 0xff, 0x53, 0xf4, 0x2a, 0x84, 0x3e, 0x2d, 0xfa, 0x01, 0x75, 0x52, 0xc5, - 0x46, 0xd6, 0x5e, 0x10, 0x1f, 0x48, 0x8b, 0x99, 0xab, 0x59, 0x97, 0x32, - 0x75, 0x5c, 0x2e, 0x46, 0x79, 0xab, 0xc8, 0x5b, 0x06, 0x95, 0xae, 0xd8, - 0x1e, 0xdf, 0x33, 0x8f, 0xf9, 0xa2, 0x47, 0xfc, 0x9d, 0x62, 0x50, 0xd9, - 0xca, 0xd0, 0xdc, 0x69, 0xf5, 0x00, 0xc2, 0xec, 0xbd, 0x8a, 0x04, 0x32, - 0xaf, 0x48, 0xb0, 0xdf, 0x80, 0xe4, 0xc9, 0xcb, 0xa2, 0x95, 0x7a, 0x50, - 0xc0, 0x8e, 0x85, 0x25, 0x18, 0x37, 0x71, 0x58, 0x08, 0xe3, 0x75, 0x7c, - 0x8c, 0x1c, 0xd7, 0xc9, 0x84, 0x6c, 0xc9, 0x5b, 0x69, 0x09, 0x44, 0x54, - 0x8d, 0xa3, 0xd4, 0x17, 0x19, 0x9e, 0xe2, 0xa4, 0x74, 0x69, 0xc5, 0x95, - 0xc5, 0xeb, 0x96, 0xe0, 0x56, 0xcf, 0x34, 0x1b, 0xd5, 0xc7, 0xf5, 0x94, - 0xea, 0x11, 0x6b, 0xce, 0xc2, 0x94, 0x3e, 0x74, 0x38, 0xa5, 0xbb, 0x34, - 0x8e, 0x34, 0x03, 0x3d, 0xe2, 0x86, 0x42, 0x40, 0xf2, 0x06, 0x4a, 0xb3, - 0xe5, 0xc4, 0x01, 0x39, 0xdb, 0xfe, 0xdf, 0xe6, 0xb3, 0xe8, 0xde, 0x35, - 0xd5, 0x5e, 0x1d, 0xa1, 0x83, 0x18, 0xcc, 0xa4, 0x66, 0xdb, 0xe6, 0x03, - 0x22, 0x0c, 0x3e, 0x2d, 0x09, 0xf4, 0x08, 0xec, 0xb2, 0x49, 0x26, 0x5a, - 0xae, 0x88, 0x64, 0x5f, 0x49, 0xd3, 0x63, 0xa5, 0x28, 0xfa, 0xee, 0xcf, - 0xe3, 0xd7, 0xd9, 0x30, 0xbd, 0x3e, 0xfa, 0xdd, 0x8a, 0x26, 0xdf, 0x5c, - 0xb8, 0xe5, 0x91, 0xae, 0x30, 0x1a, 0x7e, 0xdb, 0xeb, 0xa0, 0xa3, 0xb5, - 0x6f, 0x64, 0xe0, 0xfd, 0x1f, 0x5f, 0xc8, 0x37, 0xdf, 0x9f, 0x59, 0xc8, - 0xbd, 0xf5, 0x50, 0x58, 0xd2, 0xb8, 0x65, 0x3f, 0xac, 0xa0, 0xcb, 0x76, - 0x8d, 0xe6, 0x76, 0xb5, 0x5d, 0xeb, 0xf0, 0xe3, 0x0c, 0x5d, 0xe0, 0x49, - 0x62, 0x73, 0xa3, 0x22, 0x35, 0xc2, 0x7d, 0x4b, 0x95, 0x5d, 0x27, 0xcd, - 0xf8, 0x0b, 0x91, 0x16, 0x86, 0x41, 0xf9, 0xc1, 0x6f, 0x06, 0xdc, 0xe8, - 0xbf, 0x35, 0x75, 0x08, 0x5f, 0x65, 0xba, 0x18, 0x0d, 0x9a, 0xce, 0x28, - 0x12, 0x0f, 0xa6, 0xa1, 0x7e, 0x07, 0x55, 0x6b, 0x8d, 0x88, 0xe3, 0x10, - 0x97, 0x8b, 0x79, 0x95, 0x21, 0xf6, 0x9f, 0x34, 0x21, 0x4a, 0x71, 0x55, - 0x89, 0x5f, 0x5c, 0x44, 0xd2, 0x55, 0x5a, 0x12, 0xd0, 0xd7, 0x36, 0xe7, - 0xf5, 0xef, 0x4f, 0x91, 0x12, 0x57, 0xd2, 0x76, 0x38, 0x0b, 0x55, 0x60, - 0xd9, 0x38, 0xaa, 0x15, 0xc1, 0xa9, 0x19, 0x94, 0x78, 0x81, 0x8b, 0x49, - 0x65, 0xa6, 0x3f, 0x0a, 0x47, 0xf1, 0x97, 0x73, 0x02, 0x02, 0x02, 0x25, - 0x33, 0xf5, 0x71, 0x2a, 0xd2, 0xd0, 0x37, 0x9f, 0x3c, 0xd6, 0xe0, 0x7c, - 0xa4, 0x65, 0x0f, 0x7d, 0xb8, 0xb8, 0x60, 0x84, 0x7a, 0xc0, 0x9f, 0x0f, - 0x8d, 0x2c, 0x0a, 0x61, 0x8e, 0xe0, 0xda, 0xdb, 0xbe, 0xd5, 0xf7, 0xf2, - 0x74, 0xd4, 0xf6, 0x52, 0x78, 0xcd, 0x5d, 0x81, 0xdc, 0x0b, 0x73, 0x8d, - 0x6a, 0xfc, 0x8a, 0xf6, 0xdb, 0xe7, 0xc9, 0x76, 0x57, 0x66, 0x9c, 0x63, - 0x5c, 0xe3, 0x04, 0xec, 0xb9, 0x44, 0xfc, 0xe4, 0x0f, 0x08, 0xa9, 0x0f, - 0x22, 0xed, 0x31, 0xc4, 0x64, 0xa2, 0x6b, 0xda, 0x20, 0x14, 0xc4, 0xc4, - 0xe3, 0x32, 0x6c, 0x58, 0xdb, 0x5f, 0x40, 0x31, 0x2c, 0x52, 0xe8, 0xcb, - 0x25, 0x05, 0x9a, 0x52, 0xa9, 0x5a, 0x00, 0x2b, 0xea, 0xf7, 0x5d, 0xf2, - 0x33, 0x15, 0x19, 0x83, 0x4a, 0x72, 0x7d, 0xcf, 0x8c, 0x32, 0x94, 0x58, - 0x8b, 0x4d, 0x32, 0xd4, 0x95, 0x5f, 0x12, 0x2f, 0xbe, 0x61, 0xe8, 0xff, - 0x04, 0x90, 0xd1, 0x37, 0x5f, 0xa7, 0xc7, 0x12, 0x94, 0xe8, 0x19, 0xa7, - 0x5a, 0xe1, 0x77, 0x1f, 0x4c, 0x04, 0x5b, 0xff, 0x64, 0x37, 0x21, 0xf3, - 0xcc, 0x6a, 0x34, 0xd8, 0x8b, 0x67, 0x0f, 0x78, 0xb5, 0xe1, 0x6a, 0x27, - 0x85, 0xab, 0xfe, 0x97, 0x6f, 0xcc, 0x67, 0x31, 0x3a, 0x91, 0x50, 0x0d, - 0xdc, 0x63, 0x3c, 0x11, 0x67, 0x8c, 0x01, 0x85, 0xd0, 0x69, 0x11, 0xcb, - 0x40, 0x3c, 0x3b, 0x0f, 0x89, 0x7a, 0x6e, 0x83, 0x89, 0xcf, 0x9b, 0xae, - 0x50, 0xad, 0xc2, 0x77, 0x7a, 0x12, 0x04, 0x2b, 0x5e, 0x3b, 0x33, 0x31, - 0xa7, 0x28, 0x80, 0x4e, 0x41, 0x0f, 0xdb, 0x41, 0xa7, 0x26, 0xb6, 0x19, - 0x79, 0x6c, 0x7b, 0xc1, 0x10, 0x83, 0xeb, 0x00, 0x36, 0x01, 0x17, 0xbb, - 0x71, 0xcd, 0x30, 0xc9, 0x53, 0x0f, 0xeb, 0x7f, 0xb5, 0x9a, 0xda, 0xda, - 0x14, 0x55, 0xa3, 0x6b, 0x82, 0x7a, 0x36, 0xb2, 0xa6, 0x39, 0xb9, 0x6e, - 0xbf, 0xcc, 0x90, 0xa4, 0xd7, 0x36, 0x7b, 0x4f, 0xb2, 0x8e, 0x6f, 0x3e, - 0x91, 0x9d, 0x16, 0xd8, 0xcd, 0x35, 0x81, 0xc5, 0xd0, 0xda, 0x06, 0x26, - 0x20, 0x2b, 0xcf, 0x88, 0x90, 0xb1, 0x4f, 0x35, 0x57, 0xb5, 0xd9, 0xd9, - 0xdf, 0x34, 0x97, 0xed, 0xb1, 0xad, 0xc1, 0xae, 0x1b, 0x0f, 0xc8, 0x18, - 0xf5, 0xe4, 0x13, 0x59, 0xc0, 0xc3, 0x46, 0x71, 0x4b, 0x2b, 0x44, 0x38, - 0x03, 0x71, 0xaa, 0xdf, 0xf5, 0x44, 0x2c, 0x5e, 0x5c, 0x2a, 0x4f, 0x33, - 0x6d, 0x97, 0x0f, 0x58, 0xdf, 0x44, 0x81, 0x33, 0x4a, 0xc9, 0x02, 0x99, - 0xad, 0x0d, 0xe8, 0xe8, 0x16, 0xf7, 0x34, 0xce, 0x09, 0xad, 0x1d, 0x7d, - 0x64, 0xd4, 0x9b, 0xdf, 0xaa, 0x64, 0x1c, 0x78, 0x5f, 0x4c, 0xe2, 0x38, - 0x2b, 0x23, 0xdf, 0x20, 0x8f, 0xfb, 0x97, 0xf9, 0xbd, 0x5d, 0x4a, 0xbc, - 0x22, 0xb4, 0x30, 0x71, 0x27, 0x5c, 0x85, 0xcc, 0xa0, 0x09, 0x6c, 0x4a, - 0x53, 0x73, 0xbf, 0x6c, 0xe9, 0x4b, 0x77, 0xb7, 0xc9, 0x5f, 0x4e, 0x21, - 0x5f, 0xd5, 0x16, 0xae, 0x50, 0x99, 0x5c, 0xd8, 0xe3, 0x1b, 0x80, 0xc4, - 0x3d, 0x6e, 0xf7, 0xbf, 0xdf, 0x47, 0x2c, 0x7f, 0x61, 0x5f, 0x77, 0x6a, - 0x9d, 0xe5, 0x12, 0x7f, 0x88, 0xe7, 0xb7, 0xe9, 0x7e, 0x78, 0xb5, 0x79, - 0xa5, 0x22, 0xfb, 0xf6, 0x51, 0x2a, 0xb1, 0xb4, 0xc9, 0x85, 0x0e, 0x31, - 0xc7, 0x29, 0xc2, 0x99, 0xc7, 0x37, 0x52, 0x41, 0x58, 0x22, 0xc1, 0xd5, - 0x19, 0xbc, 0x96, 0xc2, 0xfe, 0xec, 0xea, 0x7e, 0x15, 0x8d, 0x55, 0x83, - 0x64, 0x0b, 0x5a, 0x1b, 0xb6, 0x7e, 0xe4, 0xc0, 0xe8, 0x9b, 0xd4, 0x00, - 0x98, 0x66, 0x18, 0xc1, 0xee, 0x27, 0x1e, 0x41, 0x42, 0xd7, 0x50, 0x92, - 0x4b, 0x3e, 0xd0, 0x81, 0xb2, 0x24, 0x0e, 0xba, 0xda, 0xc8, 0xe6, 0xd9, - 0x39, 0x75, 0xb4, 0x8a, 0x97, 0xaf, 0x20, 0xf0, 0x97, 0x76, 0x4f, 0xa9, - 0x19, 0xe7, 0x3f, 0xc0, 0x77, 0xc1, 0x8d, 0xc6, 0x5e, 0x80, 0xdc, 0xee, - 0x34, 0x31, 0xee, 0x5c, 0xa3, 0x22, 0x48, 0xc6, 0x90, 0x2e, 0x13, 0x0e, - 0xe8, 0xff, 0x94, 0xeb, 0x87, 0xd9, 0x6b, 0xc2, 0xaf, 0x48, 0x6a, 0x26, - 0xa7, 0xb8, 0xd5, 0x88, 0x73, 0x99, 0x12, 0x81, 0x2e, 0xee, 0xfd, 0x78, - 0xcd, 0x38, 0x69, 0x14, 0x31, 0x64, 0xa8, 0x51, 0x55, 0xb7, 0x1c, 0x61, - 0xcc, 0x5c, 0x08, 0x62, 0xfb, 0xaf, 0xaa, 0xed, 0xd5, 0x57, 0x48, 0x28, - 0xad, 0x3d, 0xbb, 0x63, 0x88, 0x80, 0xe1, 0x81, 0x91, 0x2d, 0x71, 0xda, - 0x05, 0xe1, 0x27, 0x42, 0x35, 0x90, 0x29, 0xee, 0x40, 0xe3, 0x98, 0xa0, - 0xa4, 0xa2, 0x3e, 0x01, 0x35, 0x66, 0xb1, 0x56, 0x95, 0x08, 0xfc, 0x09, - 0xf1, 0xac, 0x63, 0x3b, 0x12, 0x54, 0x8e, 0x42, 0x4a, 0x74, 0x8f, 0x47, - 0xd4, 0x7f, 0xb1, 0x5f, 0xfa, 0xbc, 0x3f, 0x71, 0x0f, 0xf8, 0x2d, 0xdb, - 0x6f, 0x34, 0x0e, 0x3e, 0x3f, 0x69, 0x0c, 0xd7, 0x9c, 0xc1, 0x51, 0xc2, - 0x9a, 0x87, 0xb5, 0xca, 0x4c, 0x98, 0xa6, 0x73, 0x59, 0x70, 0x44, 0x50, - 0xf1, 0xaf, 0x17, 0x0f, 0xa4, 0xd8, 0xb0, 0xd6, 0x9e, 0x48, 0x48, 0xb7, - 0xf3, 0x29, 0xd9, 0x74, 0xb0, 0xe6, 0xca, 0x5b, 0x86, 0x58, 0x3a, 0x10, - 0x90, 0x3a, 0x07, 0xc2, 0x67, 0x0b, 0x21, 0x16, 0x79, 0xf9, 0x9d, 0xa0, - 0xb9, 0x60, 0xdb, 0x48, 0x23, 0x16, 0xd0, 0xd1, 0xb8, 0x45, 0x90, 0x4a, - 0x07, 0xa2, 0xa4, 0x2e, 0xea, 0x14, 0xf4, 0x20, 0x44, 0xf0, 0xdf, 0x7a, - 0xdc, 0xa4, 0x1f, 0x29, 0x61, 0x83, 0x2b, 0x1d, 0xea, 0x83, 0x02, 0xcb, - 0xb9, 0x21, 0xa6, 0x4d, 0x74, 0xb4, 0x7e, 0xf8, 0x66, 0xd5, 0x5d, 0xe0, - 0xd1, 0x70, 0xad, 0x2e, 0x9f, 0x5b, 0xb7, 0xad, 0xe2, 0xbf, 0xcd, 0x7e, - 0x1c, 0x44, 0x9b, 0x0c, 0xe2, 0x2d, 0x07, 0x9a, 0x5a, 0x2f, 0x3e, 0xdd, - 0x96, 0xb9, 0xa2, 0x42, 0xee, 0xac, 0x60, 0xec, 0x22, 0xd6, 0x82, 0xfa, - 0x95, 0x1d, 0x3b, 0x44, 0x23, 0x43, 0x6a, 0x38, 0xab, 0x93, 0x4b, 0x5e, - 0x1b, 0x68, 0xdd, 0xa1, 0xab, 0x34, 0x93, 0xfe, 0x50, 0xfc, 0x2a, 0x3d, - 0xc0, 0x98, 0xab, 0x72, 0xf5, 0xdc, 0x68, 0xd6, 0x2c, 0xa6, 0x55, 0x08, - 0xe6, 0x77, 0x19, 0x12, 0x16, 0x17, 0x02, 0x7c, 0x61, 0x6c, 0x1d, 0xbe, - 0xb8, 0xf0, 0x07, 0xd1, 0x11, 0xe6, 0x65, 0xa3, 0xc0, 0x98, 0xab, 0x72, - 0xd0, 0x53, 0x31, 0x32, 0xd9, 0xfb, 0x2a, 0xe3, 0x2d, 0x94, 0xa5, 0xa4, - 0xe0, 0xfb, 0x17, 0x5f, 0x14, 0xfd, 0xf4, 0xc3, 0x9e, 0x75, 0x3b, 0xe3, - 0x31, 0x81, 0xad, 0x53, 0x24, 0x91, 0xfa, 0x20, 0xbb, 0x3c, 0x8f, 0x5e, - 0x39, 0xec, 0x11, 0xf6, 0x11, 0xdd, 0xb6, 0xe8, 0xa9, 0xba, 0x5c, 0x57, - 0x30, 0x1d, 0x64, 0xaa, 0x3e, 0xad, 0x47, 0x81, 0x56, 0xcc, 0xb3, 0x8c, - 0x6f, 0xf9, 0x6e, 0x7e, 0x81, 0xc3, 0x6b, 0x69, 0xa1, 0x0e, 0x54, 0x67, - 0x1a, 0xd0, 0x1e, 0xcb, 0x65, 0x15, 0x6e, 0x47, 0xdb, 0x50, 0x11, 0x99, - 0xc9, 0xec, 0x6c, 0xd7, 0x32, 0xd5, 0x5a, 0x43, 0x23, 0x85, 0x6a, 0x8a, - 0x06, 0x4f, 0xd7, 0x03, 0x7f, 0x54, 0x39, 0x35, 0x46, 0xb3, 0x7c, 0x1e, - 0xbf, 0xfc, 0x08, 0x6d, 0x99, 0x09, 0xd9, 0xc2, 0xfa, 0x0a, 0xc6, 0xb9, - 0xb0, 0x2d, 0x0d, 0x2f, 0xe1, 0x53, 0xb6, 0xb5, 0x17, 0x77, 0x49, 0x83, - 0xca, 0x97, 0x63, 0x48, 0x12, 0xb2, 0xc9, 0x27, 0xe7, 0x81, 0xff, 0xfb, - 0x84, 0x6e, 0xc9, 0xe5, 0xfa, 0x50, 0x63, 0x81, 0x22, 0x4d, 0x12, 0x75, - 0xab, 0x84, 0x1b, 0x6f, 0x17, 0x98, 0xac, 0xd2, 0x2d, 0xfa, 0xed, 0x65, - 0xb4, 0x9e, 0x22, 0x5a, 0x31, 0x31, 0xf1, 0x88, 0xfe, 0xdc, 0x7b, 0x8b, - 0x74, 0x85, 0x50, 0xca, 0xa4, 0x25, 0x19, 0x43, 0x4f, 0xdb, 0x4d, 0xca, - 0x4f, 0x2a, 0x83, 0x95, 0xff, 0x64, 0x5e, 0x73, 0xb1, 0x1f, 0x60, 0x94, - 0xdd, 0xc7, 0xf0, 0xb7, 0x90, 0xd3, 0x58, 0x0d, 0x24, 0x15, 0x8b, 0x12, - 0x83, 0x15, 0xc6, 0xf1, 0x7b, 0xfe, 0xcd, 0x64, 0x4c, 0x95, 0xec, 0x1a, - 0x68, 0xce, 0x23, 0x42, 0x5b, 0x7f, 0x0c, 0x36, 0x67, 0x9e, 0x00, 0x51, - 0x8c, 0x9d, 0x96, 0xbb, 0x18, 0x33, 0x5e, 0x0f, 0x1b, 0xbe, 0x79, 0xda, - 0x17, 0xfd, 0x79, 0x10, 0x29, 0x1c, 0x76, 0xf0, 0xce, 0xe1, 0x97, 0xb5, - 0x02, 0xb8, 0xc0, 0xb3, 0xff, 0x87, 0xe1, 0xb2, 0x04, 0x1a, 0xc4, 0xde, - 0xa1, 0x0b, 0x59, 0x64, 0x0f, 0xc5, 0x65, 0x40, 0xb2, 0xa8, 0x9d, 0x3b, - 0xba, 0x80, 0x6a, 0x07, 0x51, 0x4f, 0xed, 0x5f, 0xc1, 0xac, 0xd8, 0x7e, - 0xe1, 0x4e, 0xa2, 0x2e, 0x32, 0xbb, 0x89, 0x97, 0x6a, 0xec, 0xf6, 0x34, - 0x33, 0xf9, 0x94, 0x2f, 0xc8, 0x9c, 0xa2, 0xdc, 0x67, 0x31, 0x04, 0x73, - 0xd7, 0x48, 0x70, 0x9f, 0x38, 0xe9, 0x59, 0xba, 0x67, 0x9c, 0x71, 0x2b, - 0x44, 0xb2, 0xd7, 0x62, 0x99, 0x5f, 0xb6, 0x65, 0xbb, 0xe6, 0xd9, 0xd3, - 0x6a, 0xd8, 0xee, 0xb2, 0x3a, 0x65, 0xe1, 0xfd, 0xf2, 0x13, 0x57, 0xbc, - 0xa4, 0x34, 0x2e, 0x0c, 0x90, 0xd9, 0x04, 0x6e, 0xe7, 0x69, 0x8b, 0xe6, - 0x21, 0x90, 0x70, 0x84, 0xc4, 0xec, 0x15, 0x31, 0xbc, 0x45, 0x93, 0x7c, - 0x88, 0xbd, 0x28, 0xca, 0x8a, 0xcc, 0xd0, 0x00, 0x72, 0x37, 0x0c, 0x77, - 0x9f, 0x8c, 0x93, 0x7f, 0x7b, 0xb0, 0x82, 0xe8, 0x80, 0xef, 0x5f, 0x41, - 0x65, 0xd3, 0x4e, 0xb7, 0xc9, 0x1a, 0x3d, 0x3c, 0xfa, 0x93, 0xf3, 0x26, - 0xc7, 0x84, 0x0e, 0x88, 0xa4, 0x49, 0xe6, 0x61, 0xdd, 0x44, 0x21, 0x6f, - 0xe6, 0x87, 0x75, 0x68, 0x2c, 0x76, 0xeb, 0x70, 0x29, 0xfa, 0x8c, 0x9e, - 0xb1, 0x2a, 0x8f, 0xf7, 0x2c, 0xd5, 0x94, 0xcf, 0xb9, 0xa3, 0x13, 0x24, - 0x8f, 0x44, 0xf3, 0x26, 0xce, 0x2a, 0x20, 0x83, 0x7d, 0x5b, 0x84, 0x4c, - 0x6c, 0x56, 0x0d, 0x0e, 0x06, 0x64, 0x46, 0xb4, 0x20, 0x76, 0xac, 0xc4, - 0x5c, 0x58, 0x31, 0x8d, 0x1b, 0x6b, 0x18, 0xe9, 0x57, 0x7c, 0x49, 0x57, - 0x70, 0x13, 0x1e, 0x77, 0x75, 0x5d, 0x81, 0x52, 0x49, 0x2c, 0xa0, 0x73, - 0xa1, 0x15, 0xee, 0xab, 0xc8, 0xe6, 0x31, 0x67, 0x00, 0x65, 0xfc, 0x7a, - 0x31, 0xda, 0x56, 0x98, 0x34, 0x22, 0xbd, 0x10, 0x46, 0x22, 0xbd, 0xba, - 0xa3, 0x4e, 0xd4, 0xad, 0x56, 0x9d, 0xa3, 0x46, 0x00, 0x6f, 0x19, 0xa1, - 0x75, 0x71, 0xc9, 0xf4, 0xd9, 0x6a, 0x78, 0xb4, 0xa8, 0x6c, 0x87, 0x3e, - 0xc2, 0x15, 0xb6, 0x14, 0x97, 0x8b, 0x20, 0x13, 0x0e, 0x99, 0x35, 0x50, - 0x1f, 0x6c, 0xca, 0x17, 0x9f, 0xd6, 0x2b, 0x83, 0x6a, 0xf6, 0x03, 0x94, - 0xf6, 0xc1, 0x69, 0x0d, 0x4b, 0xea, 0xea, 0xda, 0x19, 0xf7, 0x4e, 0xc0, - 0x95, 0x27, 0xb5, 0xb0, 0x0a, 0xb2, 0x11, 0x07, 0x1d, 0x51, 0x55, 0x14, - 0xaf, 0x82, 0x06, 0xb2, 0x8c, 0x68, 0x33, 0x48, 0x4e, 0xd4, 0x4a, 0xa3, - 0x88, 0xde, 0x62, 0xaf, 0x98, 0x72, 0xc0, 0x10, 0xe7, 0x0a, 0xb8, 0xd0, - 0x8b, 0xab, 0xd9, 0xe8, 0x8a, 0xaf, 0xa3, 0xfe, 0xb0, 0xec, 0x1d, 0xb4, - 0xbd, 0x2e, 0x57, 0xd4, 0x10, 0xce, 0x8d, 0x2e, 0xd2, 0xb0, 0x21, 0xbe, - 0x55, 0xa7, 0xb3, 0xf0, 0xb8, 0xb2, 0xea, 0x47, 0x8a, 0x7f, 0xeb, 0x13, - 0x3c, 0x2c, 0x11, 0x32, 0xab, 0xbf, 0x38, 0x0a, 0x6a, 0x87, 0xc6, 0xc1, - 0x4e, 0x64, 0xef, 0xa4, 0x37, 0xba, 0x22, 0x8e, 0xfc, 0xec, 0xef, 0xc7, - 0x3f, 0x1a, 0x98, 0x3c, 0x00, 0xa7, 0x25, 0x4f, 0x32, 0x09, 0xb5, 0x63, - 0x9a, 0x6e, 0xe2, 0x72, 0x62, 0x22, 0xdf, 0xa3, 0xa0, 0xef, 0xa1, 0xd8, - 0xed, 0xae, 0xb7, 0xa2, 0xa3, 0xb6, 0xf9, 0x0d, 0x05, 0x7b, 0xb8, 0x27, - 0x80, 0x65, 0x04, 0xe6, 0x29, 0xae, 0x76, 0x5a, 0xa0, 0xb6, 0x8e, 0x46, - 0x15, 0x17, 0xef, 0x7d, 0x3b, 0x57, 0x11, 0x33, 0x9a, 0x78, 0x7c, 0xdd, - 0xdb, 0xf8, 0x47, 0xc2, 0x2a, 0xc4, 0x3d, 0x44, 0xc9, 0xdc, 0xb8, 0xdb, - 0x7b, 0xdd, 0xbb, 0xcf, 0x2f, 0x92, 0x8e, 0xfe, 0x0f, 0x00, 0x91, 0x55, - 0x5e, 0xac, 0x4a, 0x9c, 0xfb, 0x4c, 0xeb, 0x9a, 0xf2, 0x32, 0x2e, 0x50, - 0x67, 0x13, 0xe9, 0xbb, 0x59, 0x17, 0x46, 0x98, 0x08, 0x08, 0xe8, 0x86, - 0xd1, 0xb4, 0xbd, 0xbb, 0xc5, 0x04, 0xf3, 0x83, 0xf6, 0xce, 0x44, 0x7c, - 0xf8, 0x85, 0x20, 0xc1, 0x25, 0x4a, 0x27, 0x25, 0x4a, 0x70, 0x17, 0xf5, - 0xf1, 0xd2, 0x9d, 0x97, 0x81, 0xe1, 0x95, 0x84, 0x28, 0xb0, 0xec, 0xb5, - 0x47, 0xd3, 0x9b, 0x90, 0x5a, 0x80, 0x60, 0x91, 0x34, 0xa0, 0x66, 0x64, - 0xe7, 0x11, 0x31, 0x62, 0xa4, 0x6f, 0xbe, 0xcd, 0x4f, 0xc4, 0x66, 0x41, - 0x95, 0xe5, 0xbb, 0x91, 0xf1, 0xbc, 0x77, 0xe9, 0x7a, 0xa5, 0x92, 0xd4, - 0x1c, 0x02, 0x52, 0x45, 0x60, 0xdf, 0xba, 0xae, 0x58, 0xa2, 0x54, 0x16, - 0x47, 0x9e, 0x00, 0x3c, 0x02, 0x72, 0x57, 0xfe, 0x01, 0xfc, 0x08, 0x3f, - 0x36, 0x0e, 0xd4, 0x64, 0x98, 0x2c, 0x6d, 0x91, 0x94, 0x8c, 0x96, 0x7f, - 0x0e, 0xff, 0x1f, 0xc0, 0xd8, 0x49, 0x53, 0x6b, 0xbc, 0x87, 0x88, 0x2c, - 0x59, 0x03, 0xe8, 0x32, 0x0e, 0x12, 0x4b, 0x05, 0x70, 0xeb, 0xbd, 0x29, - 0xb3, 0x2a, 0x90, 0xa0, 0xd9, 0x3b, 0x3e, 0xd7, 0x4b, 0x2d, 0xc6, 0x18, - 0xcf, 0x9f, 0x20, 0x7c, 0x65, 0x2a, 0xda, 0x83, 0xe2, 0x2f, 0xd0, 0xff, - 0xe5, 0xbe, 0xde, 0xf3, 0xba, 0xde, 0xd9, 0xdd, 0xd6, 0xf8, 0xcd, 0x41, - 0xb5, 0x1c, 0x70, 0x68, 0x39, 0x21, 0x90, 0x97, 0x07, 0xc0, 0x2c, 0x76, - 0x8c, 0x8e, 0xb2, 0x54, 0xdb, 0x3f, 0x95, 0xf1, 0xbf, 0x92, 0xe9, 0x2f, - 0x25, 0x80, 0x6a, 0x25, 0xe5, 0x3e, 0x32, 0xe0, 0xdd, 0x9f, 0x44, 0xe6, - 0x9b, 0x5f, 0x74, 0xa0, 0x77, 0x04, 0x7e, 0x3b, 0xe0, 0xc6, 0x37, 0x94, - 0x72, 0x69, 0x9e, 0x2e, 0x8d, 0xfd, 0x27, 0xb3, 0x2a, 0xb4, 0xf0, 0xfe, - 0xf6, 0x49, 0x5a, 0xd4, 0xf1, 0xb0, 0x6c, 0xc4, 0x84, 0x3a, 0x88, 0x58, - 0x8d, 0x31, 0xc7, 0x46, 0x52, 0xe8, 0x16, 0x1f, 0xf0, 0x7d, 0x4b, 0x1c, - 0x27, 0x3a, 0xe8, 0xb3, 0x7f, 0xd6, 0x86, 0xde, 0xce, 0x51, 0x22, 0x52, - 0x21, 0xb5, 0x5f, 0x1c, 0xf2, 0x3e, 0x3e, 0x9a, 0x7e, 0xaf, 0xa4, 0xc4, - 0x1e, 0x7a, 0xbc, 0x75, 0xdb, 0x7f, 0x6d, 0x5c, 0x9d, 0x09, 0x63, 0x10, - 0x9c, 0x93, 0x9e, 0x7f, 0x69, 0x89, 0x2a, 0xf6, 0xcb, 0xf1, 0x80, 0x1a, - 0x27, 0x39, 0xe2, 0xe3, 0x51, 0xe3, 0xbf, 0x57, 0x5d, 0xfd, 0x58, 0x0d, - 0x09, 0x51, 0x75, 0x92, 0x9d, 0x78, 0xa8, 0xeb, 0x2c, 0x12, 0x54, 0x18, - 0x90, 0xec, 0x7d, 0x26, 0x17, 0xf8, 0x06, 0xab, 0xe7, 0x95, 0xd4, 0x3a, - 0x3e, 0xa3, 0x0d, 0xee, 0x36, 0x56, 0xa8, 0x25, 0x60, 0x13, 0xde, 0xa1, - 0x2b, 0x64, 0xe9, 0xf6, 0xbb, 0x78, 0xca, 0x41, 0x96, 0x6f, 0xd3, 0x34, - 0xe9, 0xd4, 0x34, 0xd7, 0x86, 0xd2, 0x6f, 0xcc, 0xce, 0x41, 0x20, 0x2c, - 0xac, 0xd9, 0x69, 0x3f, 0x3e, 0x7c, 0x35, 0x8a, 0x71, 0xe0, 0x81, 0xa2, - 0xf2, 0x75, 0x07, 0xbc, 0xf6, 0xda, 0x9e, 0xde, 0xe5, 0xb1, 0x2c, 0x49, - 0x2b, 0x3d, 0x96, 0x32, 0x70, 0x96, 0x54, 0x37, 0x63, 0x36, 0xab, 0xe4, - 0x26, 0xdd, 0xba, 0xbb, 0x0b, 0x19, 0x3c, 0xb5, 0xed, 0x93, 0xdc, 0x8a, - 0x6a, 0xea, 0x11, 0x9f, 0x0b, 0x59, 0x32, 0xa9, 0x10, 0xcc, 0xdb, 0xb9, - 0xa7, 0x52, 0xd3, 0x32, 0x7f, 0x5c, 0x4c, 0x1e, 0xe3, 0x59, 0x87, 0x97, - 0x90, 0x59, 0x9f, 0x26, 0xcb, 0x12, 0xf1, 0x00, 0xe5, 0x38, 0xee, 0xe2, - 0x2b, 0x7f, 0xab, 0xb0, 0x15, 0x30, 0xe5, 0x47, 0x0f, 0xd6, 0x30, 0x55, - 0xd1, 0xb1, 0xc7, 0xac, 0x9d, 0xd7, 0x25, 0x03, 0xf2, 0xef, 0x0e, 0x5f, - 0x26, 0x1e, 0x9d, 0x7a, 0x04, 0x88, 0x00, 0xaa, 0xeb, 0x4e, 0xb3, 0x24, - 0x81, 0x2d, 0x25, 0x15, 0x9d, 0xc8, 0x12, 0x94, 0x1e, 0x38, 0x16, 0x19, - 0x2b, 0x58, 0x64, 0x83, 0xb3, 0xaf, 0xe6, 0x7a, 0x92, 0x85, 0x08, 0x9c, - 0x96, 0x0c, 0xa7, 0x35, 0x32, 0x7b, 0x89, 0x7c, 0x58, 0xc9, 0x23, 0x53, - 0xd8, 0x18, 0xb6, 0x63, 0x56, 0x1b, 0x7d, 0xaf, 0xb7, 0x3d, 0x58, 0x3d, - 0x44, 0xb3, 0x74, 0xe5, 0xc9, 0x50, 0x6d, 0xc1, 0xfd, 0xab, 0xf1, 0xbc, - 0x91, 0x42, 0x87, 0x2f, 0x78, 0xca, 0xd1, 0x09, 0x52, 0xfd, 0x65, 0x83, - 0x82, 0x0b, 0xc2, 0xb9, 0x1b, 0x9d, 0x2e, 0x2d, 0xad, 0x8a, 0x57, 0xef, - 0x77, 0xe9, 0xb0, 0x2a, 0xd2, 0x3f, 0x7a, 0xfa, 0xba, 0x18, 0x39, 0x86, - 0x0e, 0x0a, 0x35, 0x13, 0x34, 0x29, 0x2a, 0x67, 0x16, 0x67, 0xb1, 0xa1, - 0xfa, 0x90, 0x59, 0xa0, 0xae, 0x04, 0xd7, 0x0c, 0x50, 0xbf, 0xa6, 0x18, - 0x2e, 0x8e, 0xa5, 0x44, 0xaa, 0x74, 0x08, 0x2d, 0x6f, 0xd0, 0xfd, 0xd4, - 0xa4, 0x68, 0x46, 0xcc, 0x56, 0x47, 0x02, 0x93, 0x81, 0x5f, 0x49, 0xfd, - 0xce, 0x6d, 0x0f, 0x9b, 0x68, 0xb7, 0x05, 0xbb, 0x7d, 0x6d, 0xd6, 0xef, - 0x9c, 0x84, 0xc5, 0xee, 0x03, 0xb2, 0x62, 0xab, 0x4b, 0x60, 0xf1, 0x0d, - 0x22, 0xb8, 0x79, 0x0f, 0x3d, 0x36, 0x36, 0x6f, 0x44, 0xa3, 0x2c, 0x46, - 0xb3, 0x06, 0xfe, 0x34, 0x78, 0x05, 0x00, 0x8f, 0x6b, 0x29, 0x4b, 0x6e, - 0x3a, 0x42, 0x1e, 0x08, 0xfa, 0xf1, 0xcb, 0x33, 0x3b, 0xf9, 0xc8, 0x2b, - 0xe0, 0x16, 0x66, 0x5e, 0xf4, 0x8a, 0x72, 0x3d, 0x8e, 0x1c, 0xeb, 0x78, - 0xf9, 0x7c, 0x2b, 0x9d, 0x42, 0xee, 0x13, 0xbb, 0xba, 0x77, 0xf9, 0x72, - 0x9c, 0x1b, 0x21, 0x43, 0x86, 0x14, 0x2e, 0x16, 0x82, 0x80, 0xc2, 0x9c, - 0xec, 0xc9, 0x73, 0x67, 0x2c, 0x72, 0xe5, 0x63, 0x7a, 0xe7, 0xa6, 0x3e, - 0x71, 0x3d, 0xea, 0x47, 0xc1, 0x58, 0x5f, 0x40, 0x72, 0x84, 0x85, 0x09, - 0x5f, 0x52, 0x55, 0xf5, 0x36, 0x6f, 0x3b, 0xb4, 0xd2, 0x4a, 0xe9, 0x86, - 0x09, 0xa2, 0xa6, 0x7b, 0xa3, 0xfe, 0xca, 0x99, 0x12, 0x80, 0xc9, 0xea, - 0xb9, 0xf9, 0x75, 0xf7, 0xa5, 0xa5, 0x52, 0x14, 0xc2, 0x9d, 0x73, 0xb9, - 0x89, 0x89, 0xe4, 0x62, 0xab, 0x90, 0x4d, 0x3a, 0xa4, 0x7b, 0x37, 0xcf, - 0x21, 0x32, 0x9b, 0xa9, 0x90, 0x4b, 0x9c, 0xca, 0x26, 0xc0, 0x66, 0xc1, - 0xae, 0x00, 0xce, 0xa2, 0xa8, 0xa5, 0x93, 0xda, 0x2e, 0xed, 0xe8, 0xe3, - 0x2c, 0xb1, 0xff, 0x1a, 0x6d, 0xc7, 0x8e, 0x38, 0xc1, 0xbd, 0xd7, 0x80, - 0xbd, 0xf4, 0x5b, 0x3d, 0xbf, 0x76, 0xbd, 0x70, 0x42, 0xca, 0x94, 0x01, - 0xec, 0x26, 0xdb, 0xff, 0x8e, 0x36, 0x9d, 0xd6, 0xad, 0x3a, 0x5c, 0xa9, - 0x17, 0x08, 0xba, 0x7b, 0x28, 0xa3, 0xbb, 0x9f, 0x51, 0xcf, 0xdb, 0xf3, - 0xb8, 0xd5, 0x49, 0xd0, 0xdc, 0xf6, 0x60, 0xe5, 0x8f, 0xb9, 0x88, 0x23, - 0x10, 0x69, 0xb5, 0xf2, 0xf9, 0xcd, 0xba, 0xd3, 0xae, 0x5c, 0x59, 0x73, - 0xb3, 0x43, 0x07, 0xa5, 0x9a, 0xca, 0x42, 0xdd, 0x5c, 0xd5, 0x1c, 0x8a, - 0xe4, 0xb9, 0x1c, 0x65, 0x22, 0x3c, 0x89, 0x3f, 0x23, 0x32, 0x83, 0x72, - 0xda, 0x4a, 0x7e, 0xc5, 0x24, 0xa0, 0x43, 0xc9, 0x32, 0xe8, 0x00, 0x7d, - 0xf0, 0x9e, 0x1f, 0xf3, 0xb5, 0x7b, 0xa7, 0xc6, 0x09, 0x77, 0x7b, 0xe5, - 0xc8, 0xab, 0xf9, 0x8d, 0xbd, 0xd9, 0x3e, 0xa8, 0x47, 0xf1, 0x15, 0x34, - 0x39, 0x56, 0x63, 0x96, 0xad, 0x56, 0xad, 0xbf, 0x27, 0x02, 0xe3, 0xdb, - 0xb9, 0x9f, 0x99, 0x3d, 0x28, 0x53, 0x94, 0x3c, 0x33, 0xc2, 0xb8, 0x59, - 0x07, 0xe1, 0xef, 0x84, 0x6c, 0x23, 0x54, 0x16, 0xde, 0x99, 0x76, 0x9d, - 0x00, 0x1f, 0xa1, 0x28, 0x01, 0x11, 0x7e, 0x0a, 0x12, 0xdf, 0x1d, 0x45, - 0x12, 0xa8, 0x9b, 0xb2, 0xa7, 0x62, 0x04, 0x45, 0x97, 0xd5, 0x9e, 0x08, - 0x07, 0xd2, 0x69, 0x5e, 0x29, 0xa4, 0xb8, 0x4e, 0x1f, 0x32, 0x12, 0x07, - 0x72, 0x83, 0xc3, 0x49, 0xc6, 0x51, 0x2c, 0x8e, 0xa5, 0x16, 0x7e, 0x7d, - 0xfa, 0xdb, 0x98, 0x44, 0x32, 0xd1, 0x7d, 0x4f, 0xf3, 0x9a, 0x5b, 0x00, - 0x06, 0x13, 0x1e, 0x26, 0x57, 0x8e, 0x7d, 0x74, 0x17, 0xe4, 0x63, 0xd7, - 0x9e, 0xc1, 0x34, 0xba, 0x0e, 0x25, 0xcb, 0xa8, 0x5a, 0x58, 0xf9, 0x25, - 0x29, 0xfb, 0x0d, 0xc4, 0x69, 0x0b, 0x32, 0x15, 0x8c, 0xe6, 0xcc, 0xad, - 0x27, 0x3b, 0xa7, 0x95, 0xe3, 0xcc, 0xe0, 0x6e, 0x48, 0xfd, 0x27, 0x20, - 0x0f, 0xc7, 0x51, 0x8a, 0xc9, 0x90, 0x49, 0xeb, 0x7f, 0xc0, 0x47, 0x1b, - 0x6a, 0x65, 0x80, 0xc0, 0xdc, 0x3d, 0xe9, 0x4e, 0x11, 0xef, 0x53, 0x2c, - 0x61, 0xc9, 0x9c, 0x2f, 0xf6, 0x97, 0x59, 0x67, 0x83, 0x81, 0xb2, 0xa0, - 0x75, 0xaa, 0x5f, 0xcd, 0xb0, 0x87, 0x18, 0x52, 0x4d, 0x8d, 0x52, 0x93, - 0x77, 0xad, 0x70, 0x5a, 0x60, 0x90, 0xa6, 0x97, 0xa6, 0xeb, 0xa0, 0xe3, - 0xed, 0xb2, 0x30, 0xdd, 0x38, 0xf3, 0xd2, 0x57, 0xbe, 0xec, 0xb0, 0x7e, - 0xb9, 0x4d, 0x64, 0x23, 0x53, 0x6e, 0x25, 0x3d, 0xa4, 0xdf, 0x40, 0xf5, - 0xd2, 0xa4, 0x05, 0x34, 0xf2, 0x6b, 0x85, 0x80, 0xe1, 0x2f, 0x85, 0x31, - 0x38, 0x6d, 0x36, 0x80, 0x6e, 0x3c, 0x59, 0x2d, 0x6f, 0x37, 0x6b, 0xa0, - 0xbf, 0x1c, 0x60, 0x47, 0x5a, 0x7c, 0x82, 0xda, 0xdf, 0x90, 0x81, 0x36, - 0xfe, 0x53, 0xa7, 0x66, 0xe1, 0xc6, 0xc1, 0xcc, 0xc1, 0xcc, 0xa3, 0x7b, - 0xd5, 0x0d, 0x22, 0xda, 0x1b, 0x3d, 0xe9, 0x56, 0x9a, 0x17, 0x70, 0x3c, - 0xf8, 0x1e, 0x15, 0xea, 0x8b, 0xa3, 0x9a, 0x8c, 0x71, 0xdc, 0x5d, 0x83, - 0x29, 0x06, 0x95, 0x62, 0xbb, 0x62, 0x06, 0xb4, 0xf0, 0x5e, 0x3b, 0x1d, - 0x46, 0x3f, 0xf6, 0xa2, 0x5f, 0x32, 0xf4, 0xea, 0xae, 0xc8, 0xf9, 0x43, - 0xfa, 0x5e, 0x7a, 0xbf, 0x81, 0x34, 0x7c, 0x0f, 0xee, 0x71, 0x03, 0x06, - 0x30, 0x17, 0xc2, 0x20, 0x1e, 0x81, 0x3d, 0xaf, 0x3c, 0xb8, 0x77, 0x70, - 0xd2, 0x59, 0x96, 0xdf, 0xda, 0x08, 0x9a, 0xfd, 0x2e, 0x36, 0x0c, 0xa6, - 0xce, 0xe9, 0x6b, 0x66, 0x10, 0x80, 0x0d, 0x60, 0xc5, 0x5a, 0xcf, 0xc4, - 0xed, 0xa2, 0x8a, 0x58, 0x1b, 0xd2, 0x82, 0x59, 0x8a, 0xbc, 0xf1, 0x52, - 0x0c, 0x52, 0xed, 0xad, 0x6c, 0xb1, 0x0d, 0x60, 0x59, 0x3a, 0xa8, 0xb6, - 0xc4, 0x1c, 0x5a, 0xca, 0x1f, 0x0a, 0x97, 0x55, 0x8d, 0xf4, 0x09, 0x31, - 0xf1, 0x9c, 0xfa, 0xf5, 0x24, 0x7a, 0x65, 0x62, 0xbc, 0x86, 0x70, 0x2b, - 0x24, 0x37, 0x27, 0xa1, 0xf7, 0xf1, 0xf1, 0x64, 0x33, 0x8d, 0x63, 0x29, - 0x01, 0xac, 0x2f, 0x88, 0xc8, 0xf9, 0x06, 0x79, 0x38, 0x3a, 0x42, 0xad, - 0xf6, 0x30, 0xca, 0x2c, 0x93, 0x27, 0x79, 0x3e, 0x6f, 0xd0, 0x1c, 0x4a, - 0x9f, 0x74, 0xfc, 0x4c, 0x35, 0x44, 0xf6, 0x50, 0x9c, 0xb4, 0x3b, 0x88, - 0x13, 0x46, 0x9e, 0x78, 0xe8, 0x61, 0xbc, 0x2c, 0x06, 0x04, 0x82, 0x20, - 0x62, 0x51, 0x5f, 0x83, 0x7a, 0x4d, 0x59, 0x41, 0x41, 0xd9, 0x76, 0x74, - 0xc5, 0x65, 0xf7, 0x50, 0x37, 0xdc, 0x1f, 0xe2, 0xc1, 0x72, 0x6a, 0x5c, - 0x94, 0xd4, 0x3b, 0xdf, 0x62, 0xdf, 0x85, 0xa5, 0xe8, 0x96, 0xea, 0x7c, - 0xc8, 0xbf, 0x27, 0xbb, 0xf5, 0x3e, 0x8c, 0x73, 0x98, 0x27, 0x37, 0xfc, - 0x28, 0x39, 0x73, 0x66, 0x9f, 0x27, 0xa1, 0x6e, 0xd9, 0x36, 0xd7, 0x85, - 0x7c, 0xcc, 0x3c, 0x2b, 0x5d, 0x29, 0xbf, 0x16, 0x93, 0x2d, 0x80, 0x57, - 0x94, 0xac, 0x09, 0xde, 0x32, 0x12, 0x7d, 0xce, 0x57, 0xe1, 0xa7, 0xc9, - 0xb2, 0x56, 0x75, 0x9c, 0x0a, 0xc5, 0x38, 0x70, 0x62, 0xbc, 0x1c, 0xab, - 0x7a, 0x07, 0xb1, 0x8e, 0xdc, 0x2f, 0x7e, 0x0f, 0xc1, 0xde, 0x3d, 0xf3, - 0x53, 0x57, 0x0a, 0x48, 0x9b, 0xf0, 0xc7, 0x71, 0x08, 0x0f, 0xf8, 0xba, - 0x88, 0x94, 0x31, 0xcd, 0x62, 0x7c, 0xa3, 0x42, 0xf5, 0xf2, 0x75, 0xe9, - 0x2b, 0xcb, 0x6b, 0xd4, 0x00, 0x4e, 0x9a, 0x28, 0x07, 0x01, 0xe0, 0x22, - 0x36, 0x0e, 0x87, 0xb9, 0x49, 0x4b, 0x73, 0x0e, 0x89, 0x05, 0x7d, 0xee, - 0xe0, 0xa7, 0xe4, 0x05, 0xa3, 0x4d, 0xdf, 0x27, 0xcb, 0x61, 0x7a, 0x06, - 0xf2, 0xd7, 0x75, 0x30, 0x40, 0x77, 0x3c, 0xa6, 0x1b, 0x0c, 0x0d, 0x47, - 0xc6, 0xe1, 0xf4, 0x18, 0x01, 0xed, 0xad, 0x8b, 0x3f, 0x25, 0x15, 0x1c, - 0x06, 0xd8, 0xb5, 0x4e, 0x8e, 0xcb, 0xc4, 0xcb, 0x5a, 0x98, 0xa0, 0x27, - 0x99, 0xf9, 0xbb, 0x43, 0xd7, 0x3f, 0x1e, 0xd7, 0x50, 0x58, 0xe8, 0x81, - 0x47, 0x55, 0xdc, 0xc5, 0x6a, 0x2e, 0x42, 0x52, 0xc5, 0x3a, 0x82, 0x84, - 0x97, 0x0a, 0x0d, 0x0d, 0xe7, 0x22, 0x93, 0xf7, 0xce, 0x59, 0xdd, 0x81, - 0x44, 0x4c, 0x6f, 0xb1, 0x07, 0x6b, 0x0f, 0xa8, 0x1e, 0x9d, 0x06, 0x97, - 0x77, 0x47, 0xe6, 0xc2, 0x55, 0xf4, 0x09, 0x93, 0xf8, 0x3c, 0x31, 0x37, - 0xcc, 0xeb, 0xb8, 0xf0, 0x2a, 0xf0, 0xae, 0x02, 0x43, 0x9a, 0xe7, 0x3b, - 0x3a, 0x90, 0x43, 0x96, 0x7a, 0xcd, 0x11, 0x6c, 0xba, 0xbc, 0x95, 0x24, - 0x48, 0x64, 0x8a, 0x5f, 0x2d, 0x1c, 0xb0, 0x13, 0xf6, 0x7d, 0x0b, 0xbc, - 0x81, 0x11, 0x5a, 0x95, 0xfe, 0xd1, 0x55, 0x9d, 0x19, 0x54, 0x89, 0x16, - 0xcc, 0x17, 0x2d, 0x4c, 0xcf, 0xb9, 0xa9, 0x10, 0x03, 0xb5, 0x7a, 0xb2, - 0xf4, 0x86, 0x36, 0x07, 0x3d, 0xed, 0x64, 0xfc, 0x77, 0x49, 0xa5, 0xad, - 0x5e, 0xc8, 0x21, 0x5d, 0x75, 0x04, 0x1d, 0xa1, 0xd7, 0x64, 0x29, 0xc9, - 0xaa, 0x5b, 0xce, 0xf6, 0xd5, 0x0b, 0xea, 0xb1, 0x4d, 0xd0, 0x8c, 0xf2, - 0x3c, 0x19, 0x12, 0x8f, 0xea, 0x97, 0x09, 0xf8, 0xbe, 0x6b, 0x92, 0x1a, - 0x78, 0x07, 0xb7, 0xcb, 0x1f, 0x32, 0xcb, 0xeb, 0xee, 0x31, 0x11, 0xc1, - 0x03, 0x2f, 0x3c, 0x92, 0x73, 0x28, 0xc5, 0xe7, 0xd1, 0xcb, 0xa4, 0x0e, - 0x10, 0x4d, 0xbf, 0xd6, 0x2f, 0x1c, 0xa4, 0x92, 0x87, 0xbd, 0x48, 0x84, - 0x9d, 0xdd, 0x21, 0x1e, 0x11, 0x32, 0xfb, 0xa1, 0x37, 0x49, 0x1d, 0x82, - 0x57, 0x0c, 0xca, 0xc9, 0xc7, 0xfe, 0x79, 0xb6, 0x38, 0x9c, 0xcd, 0xd9, - 0xbd, 0x50, 0x50, 0x6e, 0x55, 0x62, 0x3e, 0x49, 0xee, 0x02, 0x3b, 0x04, - 0xa6, 0xcb, 0x12, 0x2c, 0x62, 0x05, 0xba, 0xf2, 0x29, 0xa6, 0xf9, 0x4b, - 0xd8, 0x00, 0xe7, 0x99, 0xfb, 0x91, 0xb4, 0x98, 0x39, 0x8c, 0xb9, 0xcc, - 0xcb, 0x9b, 0x7e, 0x88, 0x90, 0x65, 0x42, 0x7c, 0x72, 0x59, 0x4c, 0x9c, - 0xe3, 0x6a, 0x2a, 0xb4, 0xdb, 0xe4, 0x20, 0x3f, 0x86, 0x5a, 0x63, 0xb8, - 0x69, 0x31, 0x9c, 0x8c, 0xb1, 0xf6, 0x42, 0x72, 0x17, 0x64, 0x73, 0x52, - 0xdb, 0x59, 0x76, 0x3d, 0x3e, 0x24, 0x5b, 0xa3, 0x39, 0x3f, 0x7f, 0x8f, - 0x92, 0xde, 0xcd, 0xba, 0xef, 0x46, 0x7e, 0xad, 0x48, 0x20, 0x17, 0xc5, - 0xcf, 0x05, 0xd8, 0xd5, 0x7e, 0x54, 0x5f, 0x81, 0x79, 0xa7, 0x45, 0xc4, - 0xeb, 0xa4, 0xb8, 0x3d, 0x89, 0x5e, 0x16, 0xe3, 0x54, 0xca, 0xc0, 0x93, - 0x24, 0x2e, 0xe4, 0x7f, 0x55, 0x7d, 0xc9, 0xfd, 0x69, 0xd2, 0x32, 0xbf, - 0x97, 0x6e, 0x6f, 0x77, 0x46, 0xc1, 0x59, 0x60, 0x06, 0xfc, 0xd9, 0xe1, - 0x32, 0x81, 0xfa, 0xa7, 0x74, 0x76, 0x9a, 0x1e, 0x0b, 0x84, 0x92, 0xa7, - 0xd1, 0x72, 0xb1, 0xbf, 0xd6, 0x14, 0x03, 0xed, 0xcf, 0x19, 0xdb, 0x45, - 0x22, 0xf9, 0xfe, 0x22, 0x95, 0xf5, 0x8a, 0xc5, 0x93, 0x2b, 0x09, 0xcc, - 0x91, 0x9d, 0xf3, 0x66, 0x9f, 0xf6, 0x96, 0x57, 0xea, 0x4d, 0xac, 0x28, - 0xb3, 0xfb, 0x88, 0x8f, 0x9d, 0x32, 0x38, 0xfb, 0x63, 0xf8, 0x51, 0xdb, - 0x24, 0xa5, 0xc5, 0xf2, 0xe5, 0x57, 0xc7, 0xaa, 0xcb, 0x50, 0x59, 0xde, - 0x20, 0x23, 0xb4, 0x00, 0x0d, 0x58, 0x2a, 0x82, 0x3b, 0x54, 0xdf, 0xe2, - 0xd7, 0xa3, 0xc0, 0xb8, 0x18, 0xf5, 0x17, 0x55, 0x96, 0x69, 0x7f, 0xee, - 0x60, 0xe9, 0x84, 0x24, 0xde, 0xce, 0xe6, 0xfd, 0x30, 0xc5, 0x2b, 0x38, - 0x9d, 0x1a, 0x37, 0xca, 0xb6, 0x44, 0xce, 0xea, 0xa6, 0x55, 0x06, 0xcc, - 0x40, 0x4a, 0x58, 0x22, 0xea, 0xa1, 0xde, 0x4f, 0xc8, 0xb9, 0xf2, 0x7c, - 0x24, 0x27, 0x3b, 0x4e, 0x2d, 0xb2, 0xc4, 0xe8, 0x69, 0x64, 0xa3, 0xce, - 0xa9, 0x70, 0x51, 0xaa, 0x3f, 0x5d, 0x45, 0xd1, 0x05, 0xaf, 0x34, 0xc6, - 0x14, 0xa0, 0x3a, 0xf1, 0x64, 0xf0, 0xa6, 0xb0, 0xdf, 0x97, 0xda, 0x12, - 0xf7, 0x4f, 0x59, 0xa2, 0xd3, 0x4c, 0xd0, 0xc1, 0x4b, 0x1c, 0x9d, 0x37, - 0x10, 0xa8, 0x3e, 0xd4, 0x00, 0xb7, 0xc2, 0xbc, 0x26, 0xa4, 0x93, 0xcb, - 0x35, 0x60, 0x80, 0xb8, 0xa4, 0xe3, 0x63, 0x35, 0xd2, 0xc0, 0xda, 0xeb, - 0x50, 0x31, 0x45, 0x0a, 0x22, 0xc7, 0x27, 0x9c, 0x20, 0x58, 0x06, 0x58, - 0x8e, 0x25, 0xb2, 0xb5, 0x3b, 0xba, 0xdb, 0xe4, 0xa1, 0x81, 0x62, 0x54, - 0x4c, 0x57, 0x1a, 0x1e, 0xe9, 0xc3, 0xe6, 0xa2, 0xdb, 0x4f, 0x45, 0xe2, - 0x86, 0x97, 0xb0, 0xea, 0x99, 0xe5, 0x66, 0xbf, 0x78, 0x25, 0xec, 0xc3, - 0xad, 0xf2, 0x84, 0xa2, 0x0d, 0x51, 0x8a, 0x49, 0x57, 0x51, 0x20, 0x3c, - 0x23, 0x04, 0x72, 0xc1, 0x66, 0x97, 0x4b, 0xce, 0xff, 0x22, 0xc5, 0x68, - 0x7c, 0x40, 0x83, 0xba, 0x76, 0x11, 0xe5, 0xd9, 0x9f, 0xd5, 0xc3, 0xe3, - 0x41, 0x0f, 0xbb, 0xd4, 0x79, 0xa6, 0xc3, 0x14, 0x19, 0x72, 0xcf, 0xd3, - 0xac, 0x16, 0x1c, 0x5d, 0x23, 0x2c, 0xe2, 0xd7, 0xaa, 0x83, 0x2c, 0xe1, - 0x47, 0xce, 0xea, 0x93, 0x2e, 0x69, 0x65, 0x59, 0x70, 0x28, 0x8c, 0xf5, - 0xbc, 0xb7, 0x74, 0x48, 0x82, 0x26, 0x58, 0xf6, 0x35, 0x58, 0x63, 0x9b, - 0xbd, 0x70, 0x80, 0x43, 0x05, 0x62, 0x31, 0x0e, 0x42, 0xb3, 0xce, 0x52, - 0x9f, 0x30, 0xdb, 0xa4, 0xdc, 0x24, 0x7a, 0x1b, 0xc0, 0xfa, 0xb4, 0x7b, - 0x08, 0x3a, 0x1a, 0xa9, 0xcc, 0x72, 0x42, 0x46, 0x64, 0x6d, 0x0b, 0x39, - 0x3d, 0x4e, 0xaa, 0x2c, 0x5f, 0x0f, 0x8d, 0xd8, 0xc7, 0xfd, 0xaa, 0x18, - 0x72, 0x95, 0xe9, 0x02, 0x3e, 0x94, 0x96, 0xf8, 0x82, 0xc6, 0xd9, 0x33, - 0x2a, 0xb8, 0x26, 0xbb, 0x10, 0x08, 0xae, 0x38, 0x2c, 0x17, 0xf5, 0x0c, - 0xb7, 0x3b, 0x78, 0x1e, 0x08, 0xa8, 0xba, 0x46, 0xa0, 0x6a, 0xf2, 0x12, - 0xae, 0xa1, 0xe9, 0xf9, 0x4e, 0x36, 0x38, 0x9a, 0x96, 0xeb, 0xae, 0xf7, - 0xa3, 0xab, 0x23, 0x58, 0x3b, 0x4e, 0x05, 0x64, 0xc9, 0xad, 0xa3, 0xbb, - 0xa0, 0xc7, 0x45, 0xc6, 0x22, 0xdb, 0xd9, 0x70, 0x39, 0x60, 0x83, 0x0d, - 0x5b, 0x93, 0xb8, 0x27, 0x1a, 0x9f, 0x2d, 0xb7, 0x9c, 0xe6, 0xf6, 0x3d, - 0x82, 0xb0, 0xa1, 0xde, 0xd3, 0x9f, 0xb0, 0x3d, 0xa0, 0x10, 0xa8, 0xf3, - 0x01, 0xbd, 0x77, 0xcc, 0xbc, 0xd2, 0xe4, 0xfc, 0xc4, 0x7e, 0xbf, 0xd5, - 0xe0, 0x9d, 0x7b, 0x36, 0xed, 0x73, 0x63, 0x8f, 0x76, 0xf6, 0xdf, 0x62, - 0xdb, 0x7f, 0x9f, 0xfa, 0x4a, 0xb8, 0xec, 0x2e, 0xad, 0x5a, 0x07, 0x58, - 0xed, 0xc3, 0x55, 0x44, 0x85, 0x4a, 0x88, 0x7b, 0xc0, 0x07, 0x9c, 0x00, - 0x16, 0x4a, 0x18, 0xfb, 0x9c, 0x11, 0x85, 0xb0, 0x60, 0xf5, 0xa9, 0x6f, - 0xf1, 0xb8, 0x0d, 0xbf, 0x06, 0x45, 0xe7, 0xa2, 0x52, 0xe5, 0x8b, 0x13, - 0x60, 0x5b, 0x83, 0x58, 0x56, 0xc5, 0x3e, 0x9e, 0x0f, 0x79, 0xb3, 0x3f, - 0x14, 0xa6, 0xf0, 0x4d, 0xe9, 0x33, 0x83, 0xac, 0x16, 0x54, 0x29, 0x97, - 0x40, 0xcd, 0xad, 0x91, 0x32, 0x02, 0xd3, 0x2b, 0x45, 0x1d, 0xcb, 0xa4, - 0x72, 0xab, 0x6d, 0x79, 0xec, 0xf3, 0xbe, 0xf2, 0x97, 0x23, 0xf6, 0xd3, - 0x27, 0xa4, 0xe8, 0x94, 0xb0, 0xdd, 0x19, 0xc1, 0xcd, 0x07, 0x85, 0xd0, - 0x55, 0x57, 0x3a, 0x61, 0x62, 0x98, 0x80, 0xdf, 0xe5, 0x6f, 0xf4, 0xb2, - 0x79, 0x27, 0x26, 0x88, 0xd9, 0x9d, 0xbd, 0xd6, 0x5d, 0x51, 0x38, 0x0a, - 0x1c, 0x8d, 0x24, 0xa7, 0xb8, 0x04, 0x0e, 0x4e, 0xb1, 0x56, 0x08, 0xc1, - 0x6f, 0x2a, 0x48, 0x50, 0xdc, 0x6b, 0x90, 0x37, 0xc9, 0x13, 0x0f, 0x99, - 0x32, 0xd7, 0x89, 0xf7, 0xba, 0x16, 0x6b, 0x31, 0x33, 0x34, 0x6a, 0x37, - 0xbe, 0x37, 0x23, 0x9a, 0xc1, 0x59, 0x7e, 0x1a, 0x42, 0x8f, 0xf5, 0xf2, - 0xd0, 0xf4, 0x1f, 0x03, 0xe4, 0x9a, 0x80, 0xa9, 0x0d, 0xa4, 0x9f, 0x5a, - 0x27, 0x1a, 0x46, 0xf4, 0x24, 0x57, 0xe0, 0xba, 0x90, 0x20, 0xa3, 0x7d, - 0x25, 0xc7, 0xfa, 0xa3, 0xb9, 0x16, 0xd5, 0x19, 0x66, 0x2e, 0xb7, 0xad, - 0xc6, 0x19, 0x14, 0xe2, 0x3b, 0xe4, 0xab, 0xf7, 0xf3, 0x8d, 0x51, 0x4e, - 0x73, 0xef, 0x43, 0x8c, 0xa2, 0x99, 0x59, 0xe6, 0x15, 0xe4, 0xdc, 0xa5, - 0x69, 0x5f, 0xc1, 0x82, 0x81, 0x1b, 0xcc, 0x16, 0x99, 0x73, 0x14, 0x76, - 0x15, 0x05, 0x7a, 0xec, 0x7b, 0x10, 0x9a, 0xa0, 0xca, 0x3b, 0x7d, 0xba, - 0x02, 0x5b, 0xcf, 0xa8, 0xf4, 0xe2, 0xde, 0x16, 0x14, 0x7d, 0x67, 0xc8, - 0xd8, 0x50, 0xdb, 0x80, 0x54, 0x59, 0xbf, 0x21, 0xa0, 0x16, 0x83, 0xe7, - 0xb1, 0x00, 0x34, 0xaa, 0x67, 0xcf, 0xf4, 0x3b, 0xcb, 0x0b, 0xad, 0x2d, - 0xf9, 0x70, 0xe0, 0xb9, 0x75, 0xa7, 0xe9, 0x53, 0xbd, 0x35, 0x9d, 0xfe, - 0x61, 0xca, 0x84, 0xac, 0xcf, 0x7e, 0xdd, 0xd6, 0xb8, 0xd6, 0x2c, 0x59, - 0x66, 0xc5, 0x58, 0x84, 0x79, 0x18, 0xdb, 0x04, 0xc6, 0xcf, 0xdf, 0x31, - 0xd9, 0xb7, 0x4f, 0xa2, 0x98, 0x23, 0xb4, 0xce, 0xac, 0xcd, 0xe9, 0xb0, - 0x35, 0x4f, 0x93, 0x5f, 0x35, 0xef, 0x64, 0x76, 0x24, 0xc1, 0x57, 0xb2, - 0x53, 0xbe, 0xe8, 0x66, 0x86, 0x48, 0x6c, 0x58, 0x49, 0x3e, 0xb0, 0x80, - 0xd6, 0x18, 0xbf, 0xd9, 0xf4, 0x44, 0x95, 0x46, 0x42, 0xc9, 0x51, 0xe7, - 0x9e, 0xf3, 0xa1, 0x44, 0x54, 0x05, 0x14, 0x83, 0x31, 0xff, 0x02, 0x42, - 0x6e, 0xbc, 0xb8, 0x28, 0x20, 0x84, 0x74, 0xe3, 0x21, 0x07, 0x7a, 0xe3, - 0x0e, 0x99, 0x39, 0xf7, 0x0e, 0x42, 0xe5, 0x44, 0x92, 0x70, 0xcb, 0xf6, - 0xbc, 0x34, 0x05, 0x5e, 0x1f, 0x87, 0x0a, 0x29, 0x68, 0x97, 0x6e, 0xd7, - 0x91, 0xf1, 0xd1, 0xf0, 0x74, 0x7c, 0x6a, 0x0d, 0x30, 0x5c, 0xae, 0x62, - 0x6e, 0x28, 0xe2, 0xc9, 0x1f, 0x14, 0xcf, 0xf9, 0x89, 0x20, 0x2f, 0x1e, - 0xd0, 0x52, 0x1d, 0x04, 0x92, 0xf1, 0x4c, 0x67, 0xe6, 0xac, 0x7e, 0x9a, - 0xd8, 0x07, 0xf7, 0x9d, 0xb2, 0xb2, 0x54, 0xbc, 0xdd, 0xc2, 0xab, 0xe3, - 0x16, 0xd6, 0xfd, 0x4a, 0x18, 0x9c, 0x7f, 0x0e, 0x17, 0x4b, 0xd2, 0xa9, - 0xd5, 0xdf, 0x93, 0x6d, 0xbe, 0xb0, 0xd7, 0xc0, 0x29, 0xc2, 0x82, 0x26, - 0x7c, 0x96, 0x76, 0xd1, 0x14, 0x66, 0xee, 0x45, 0x7c, 0xe7, 0x70, 0xb8, - 0x45, 0xef, 0x7a, 0xbd, 0xf0, 0xbd, 0x12, 0x8e, 0x2b, 0x6f, 0x04, 0x7e, - 0x90, 0x78, 0x2d, 0x53, 0x79, 0xeb, 0xaa, 0xdb, 0x65, 0x2a, 0xb1, 0x6e, - 0x02, 0x65, 0x64, 0xd4, 0x48, 0xde, 0x5d, 0xf6, 0x5d, 0x8e, 0x30, 0x62, - 0xc1, 0xab, 0xc1, 0xe9, 0x1d, 0xa6, 0xfa, 0x4f, 0xf7, 0x41, 0x32, 0x06, - 0x33, 0xf3, 0x24, 0x93, 0x55, 0x93, 0x4a, 0xc6, 0xc4, 0xa2, 0x4a, 0xe9, - 0x99, 0xf3, 0x7e, 0xe3, 0x46, 0x8b, 0x55, 0x83, 0x6e, 0xae, 0xd4, 0x1f, - 0x8b, 0xcd, 0x1f, 0x06, 0x79, 0xdf, 0x5d, 0xf8, 0xd6, 0x3d, 0x7f, 0x65, - 0x86, 0x94, 0xf8, 0xb6, 0xa1, 0xa4, 0x61, 0xa5, 0x7b, 0x63, 0x0f, 0x00, - 0xee, 0x7c, 0xb3, 0x64, 0x1b, 0x3a, 0xde, 0xe5, 0xc3, 0x57, 0x1b, 0x6b, - 0x70, 0x60, 0xea, 0xdd, 0x12, 0x73, 0xf8, 0x1a, 0x61, 0x16, 0x07, 0x8f, - 0x6c, 0x65, 0x15, 0x51, 0x37, 0xdd, 0xca, 0x35, 0x5a, 0x10, 0xa2, 0x78, - 0xa0, 0xd4, 0x51, 0xcc, 0xf8, 0x1b, 0xcc, 0x88, 0x86, 0x32, 0x54, 0x89, - 0xbf, 0x3c, 0xd8, 0x8b, 0xac, 0x3c, 0xbf, 0x68, 0x66, 0xde, 0x1b, 0x81, - 0xaf, 0xa9, 0x91, 0x87, 0xc6, 0xaf, 0x8d, 0x33, 0x51, 0x3f, 0x4a, 0x4a, - 0x42, 0xf2, 0x9c, 0xc0, 0x53, 0x58, 0x1f, 0x4f, 0x93, 0x87, 0xb6, 0x0a, - 0x94, 0xd6, 0xc5, 0x40, 0xab, 0x8f, 0x45, 0xee, 0x34, 0x57, 0xf6, 0xe1, - 0xe4, 0x74, 0x10, 0x88, 0x12, 0x89, 0x15, 0x3b, 0x0d, 0x78, 0xc2, 0xbe, - 0xe0, 0x93, 0xc1, 0xab, 0xce, 0x5f, 0x53, 0x48, 0x67, 0xbd, 0xa3, 0x8a, - 0x5d, 0x43, 0xfd, 0xbf, 0xd7, 0x8b, 0xf1, 0x8f, 0x36, 0x2e, 0xf1, 0xc0, - 0x30, 0xbc, 0xbd, 0x15, 0x65, 0xb9, 0x7d, 0x0f, 0x95, 0xb5, 0x64, 0x5f, - 0xd0, 0x34, 0xe0, 0x4a, 0x16, 0x41, 0x00, 0xac, 0xa4, 0xa3, 0x37, 0xd5, - 0x13, 0x82, 0x26, 0x95, 0xea, 0x09, 0x50, 0x05, 0xae, 0x3b, 0xa1, 0x37, - 0xac, 0x77, 0xde, 0xc9, 0x73, 0x68, 0x1e, 0x48, 0xfd, 0x4f, 0x20, 0xf4, - 0x5a, 0xd9, 0x16, 0xc1, 0xac, 0x3b, 0x0f, 0xa4, 0x55, 0x60, 0x82, 0x9e, - 0x80, 0xe6, 0x98, 0x33, 0xfb, 0xd5, 0xa1, 0xe6, 0xbb, 0x74, 0x34, 0xe0, - 0x6f, 0xe2, 0x58, 0xaf, 0xd4, 0x98, 0x6a, 0x0f, 0xa2, 0x89, 0xd9, 0x3f, - 0xc0, 0xbf, 0xf3, 0x82, 0x76, 0x79, 0x38, 0xd0, 0x4d, 0xe7, 0x9f, 0x62, - 0x56, 0x26, 0x74, 0xc5, 0x39, 0x97, 0x29, 0x5c, 0x24, 0x94, 0xbd, 0xd8, - 0xd4, 0x32, 0xfa, 0xdd, 0x1a, 0x2a, 0xcf, 0xc2, 0x4a, 0x02, 0x96, 0x51, - 0x90, 0xac, 0xe5, 0x51, 0xd6, 0x00, 0x63, 0xf9, 0x86, 0xb0, 0x2a, 0x44, - 0xf5, 0x63, 0x53, 0x96, 0x1d, 0x5f, 0x89, 0xa3, 0x36, 0x7d, 0x70, 0x6f, - 0xc1, 0x36, 0x94, 0xa5, 0x7f, 0x1e, 0xd8, 0x64, 0xc5, 0x6e, 0x4c, 0xa1, - 0x02, 0x3c, 0x2e, 0xf9, 0x32, 0xa1, 0x03, 0xad, 0x5e, 0x11, 0x78, 0xbe, - 0x96, 0x87, 0x7f, 0x4c, 0x97, 0xcc, 0x58, 0xaf, 0x29, 0x7d, 0x52, 0xb1, - 0x7e, 0xc9, 0x27, 0x76, 0xc0, 0xb4, 0x0d, 0x8f, 0x8c, 0xd5, 0xc4, 0xcb, - 0x15, 0xde, 0xb2, 0x32, 0x6b, 0xd6, 0x9a, 0xbd, 0x96, 0x86, 0x7e, 0x7e, - 0x91, 0xbc, 0x08, 0xc3, 0x79, 0x83, 0x3a, 0x52, 0x2e, 0xa8, 0x84, 0xd6, - 0x44, 0x88, 0x86, 0x2d, 0x8f, 0x1f, 0x82, 0x23, 0x5f, 0x35, 0x87, 0x8f, - 0x02, 0x52, 0x01, 0xdf, 0x52, 0xee, 0x12, 0x6d, 0x33, 0xd6, 0xc2, 0xff, - 0x43, 0x28, 0xe5, 0x67, 0x9b, 0xef, 0x5e, 0xc5, 0xb5, 0x4b, 0x5c, 0x4f, - 0xfd, 0x17, 0xf0, 0x34, 0xa5, 0x0f, 0x3f, 0x85, 0x4e, 0x2f, 0xf0, 0xb7, - 0x38, 0x61, 0xb7, 0x2f, 0xc8, 0x75, 0x5a, 0x01, 0x28, 0x83, 0x8d, 0x52, - 0x5e, 0x4e, 0xed, 0x2b, 0xbb, 0x0b, 0x02, 0xee, 0xf3, 0x2d, 0x12, 0xcc, - 0x23, 0xa4, 0x1b, 0xa5, 0xd7, 0x1a, 0xf0, 0x92, 0x90, 0x17, 0x85, 0x61, - 0xe4, 0x11, 0xd5, 0x45, 0xce, 0xa5, 0x65, 0x4e, 0x0d, 0xf8, 0x31, 0x26, - 0x41, 0x51, 0xc8, 0x62, 0xce, 0xa4, 0x8f, 0x1b, 0x29, 0x9f, 0x58, 0xdc, - 0x1b, 0x19, 0x40, 0x79, 0xfa, 0x40, 0x38, 0x51, 0x24, 0xc9, 0xb8, 0x63, - 0x85, 0xba, 0x7a, 0x9c, 0x21, 0xce, 0xf9, 0x8e, 0x22, 0x8e, 0x8c, 0xec, - 0x0f, 0x0e, 0xc0, 0x35, 0x3a, 0x88, 0x10, 0x39, 0x3d, 0xc6, 0xdb, 0x6b, - 0xe3, 0x9f, 0xe4, 0xa8, 0x98, 0xf0, 0xce, 0x50, 0xd4, 0x92, 0x9c, 0x45, - 0x9e, 0xc5, 0x5e, 0x05, 0xe1, 0x06, 0x87, 0xa6, 0xce, 0xf0, 0x43, 0x9f, - 0xc3, 0x74, 0xd4, 0x22, 0xbd, 0xcd, 0x76, 0x6c, 0x58, 0x13, 0x2a, 0x77, - 0xbf, 0xec, 0x7a, 0x30, 0xfd, 0x93, 0xfe, 0xda, 0x8c, 0xae, 0x6e, 0x75, - 0x72, 0x5f, 0x65, 0x90, 0xec, 0x9b, 0x8e, 0xf3, 0xc1, 0x94, 0x24, 0xe9, - 0xfa, 0x0e, 0x22, 0x00, 0x6f, 0xe0, 0xb1, 0x7c, 0x88, 0x42, 0x2e, 0xba, - 0xcd, 0x61, 0x2d, 0xff, 0x63, 0x71, 0x93, 0x8a, 0x5a, 0x7c, 0xde, 0x4d, - 0x7c, 0x37, 0xa5, 0xc0, 0x78, 0x7d, 0x3c, 0x2b, 0x9b, 0x64, 0x8e, 0x69, - 0xe1, 0xe0, 0x97, 0xe3, 0x61, 0xc3, 0x7c, 0x8e, 0x1a, 0x1d, 0xa7, 0xfe, - 0x10, 0xdb, 0x8c, 0x5f, 0xee, 0xcc, 0xad, 0x94, 0x95, 0xc3, 0xd8, 0x29, - 0x78, 0xa1, 0x78, 0xde, 0x0e, 0x73, 0xb4, 0x3a, 0x6d, 0x94, 0xb3, 0x82, - 0xc5, 0xfd, 0xf9, 0xea, 0x58, 0xd0, 0xa0, 0x39, 0x1b, 0x03, 0xe3, 0xbe, - 0x3f, 0x22, 0x75, 0x9f, 0xec, 0x74, 0x12, 0x2a, 0x91, 0xd4, 0xd1, 0x2f, - 0x45, 0x1c, 0x27, 0x8c, 0xda, 0xe5, 0xcd, 0xca, 0xd7, 0xe6, 0xf3, 0x83, - 0x1d, 0x6e, 0x01, 0xea, 0x32, 0x79, 0x27, 0x42, 0x10, 0x78, 0xf2, 0x50, - 0x7d, 0xc6, 0xd4, 0x3e, 0x90, 0x51, 0xb4, 0x14, 0x35, 0x35, 0x04, 0xdc, - 0xc5, 0x5d, 0x95, 0xf3, 0xa7, 0x35, 0x42, 0x83, 0xeb, 0x5d, 0xbf, 0xee, - 0xbf, 0xd9, 0xe9, 0x7b, 0xb3, 0x99, 0x38, 0xcc, 0xa3, 0x9d, 0x7d, 0x12, - 0xb2, 0xd7, 0x89, 0x5b, 0xcb, 0x44, 0xa8, 0x2f, 0x33, 0x70, 0x95, 0x5b, - 0x06, 0xe6, 0x5c, 0x43, 0x8f, 0x12, 0xf6, 0x5f, 0xb4, 0x3e, 0x05, 0x65, - 0xa1, 0xda, 0xa0, 0x7b, 0x2c, 0x0f, 0x5a, 0x98, 0x70, 0x70, 0xea, 0xe0, - 0x4c, 0xf4, 0xef, 0x9e, 0x89, 0xfa, 0x2b, 0xc8, 0x38, 0x3e, 0xb3, 0x93, - 0xde, 0xb4, 0xa3, 0x4e, 0x60, 0x33, 0xce, 0x48, 0x00, 0x53, 0x94, 0x20, - 0xcf, 0x26, 0xe3, 0x17, 0xd7, 0x2f, 0x49, 0xdd, 0x37, 0x81, 0x80, 0x74, - 0x4a, 0x33, 0x94, 0x69, 0x46, 0x09, 0xd4, 0xcf, 0x31, 0xed, 0xbf, 0x48, - 0xf1, 0x9c, 0x73, 0x79, 0x43, 0x9d, 0xfe, 0x12, 0x0b, 0x0d, 0x73, 0x9a, - 0x84, 0xae, 0x7c, 0x77, 0x8f, 0xad, 0x11, 0xf8, 0x98, 0x8d, 0x44, 0xab, - 0x7a, 0xc7, 0xe6, 0xfe, 0x38, 0xd7, 0x45, 0xa9, 0xb7, 0xde, 0xd9, 0xdf, - 0x43, 0xcf, 0xe0, 0xae, 0xa8, 0xbd, 0xcb, 0x05, 0xa9, 0x82, 0xeb, 0x25, - 0x88, 0x18, 0xaa, 0x84, 0x69, 0xc7, 0xa5, 0xbb, 0xde, 0x0b, 0x71, 0x0a, - 0xfa, 0xed, 0x78, 0xb1, 0x76, 0xf0, 0x81, 0xa6, 0x06, 0x3a, 0x88, 0x21, - 0x32, 0x83, 0x8f, 0xf9, 0xf8, 0x5a, 0x95, 0xce, 0x03, 0x2e, 0x6d, 0xc8, - 0xb4, 0xbd, 0xb2, 0x0a, 0x2d, 0xaa, 0xd4, 0xa1, 0x7c, 0x8a, 0x6c, 0x4c, - 0x7d, 0x03, 0x48, 0x1d, 0xfc, 0xd9, 0xcb, 0x2a, 0x0e, 0xd3, 0x19, 0xd3, - 0xa2, 0x9c, 0x11, 0x9c, 0xce, 0x3c, 0x21, 0xb4, 0x0b, 0x30, 0x28, 0xb8, - 0xa0, 0xf7, 0xc6, 0xca, 0x49, 0xb0, 0xa7, 0x77, 0x8b, 0x8b, 0x36, 0xa4, - 0xd5, 0x01, 0xf2, 0x23, 0xc9, 0x8f, 0xe1, 0x96, 0x5e, 0xf4, 0xd8, 0x49, - 0x2c, 0x5b, 0xc8, 0x0c, 0xd0, 0xe0, 0x95, 0x01, 0x10, 0x5c, 0xb1, 0x7a, - 0xc8, 0xe5, 0xb1, 0x71, 0x73, 0x2c, 0xe2, 0xb0, 0x0b, 0x8b, 0x02, 0x57, - 0xeb, 0x15, 0xad, 0x54, 0x77, 0x8c, 0xd2, 0xd2, 0xc1, 0x0a, 0x69, 0xfc, - 0x4a, 0x65, 0xe9, 0x4c, 0xcd, 0x2f, 0xe8, 0x60, 0x23, 0xab, 0x50, 0x7e, - 0x5a, 0x28, 0xa8, 0xca, 0xcb, 0x3c, 0x94, 0x60, 0xe6, 0x32, 0x78, 0xde, - 0x7a, 0xa6, 0x23, 0xd4, 0xb1, 0xfb, 0x5a, 0x4d, 0xa2, 0xb6, 0xb3, 0xa1, - 0x76, 0x78, 0x46, 0xb1, 0x61, 0xcd, 0x5c, 0x5c, 0xc5, 0xe5, 0xf7, 0x8c, - 0x89, 0xbd, 0x3e, 0x9e, 0x71, 0x3b, 0xaf, 0xaa, 0x83, 0x80, 0xe0, 0x61, - 0x6d, 0xc5, 0x83, 0x40, 0x13, 0xdc, 0x86, 0x69, 0x41, 0xa6, 0xf9, 0x2d, - 0xbb, 0x8f, 0xf3, 0x9d, 0x08, 0x92, 0x3e, 0x6c, 0x26, 0xcb, 0x1b, 0xa0, - 0x92, 0x77, 0xdc, 0xa0, 0x28, 0xa7, 0x38, 0x8f, 0x84, 0x7b, 0x95, 0xc1, - 0x74, 0xa5, 0x56, 0xc7, 0x92, 0x9f, 0x6e, 0x6f, 0x6d, 0x84, 0x6a, 0x91, - 0xba, 0x79, 0x03, 0x75, 0xdd, 0xce, 0x52, 0x06, 0x7e, 0xb9, 0xff, 0x96, - 0x9f, 0x29, 0x67, 0xdd, 0x37, 0x45, 0x10, 0xfd, 0x80, 0xb2, 0x81, 0x8c, - 0x41, 0x5d, 0xd5, 0x25, 0xe0, 0x82, 0xfe, 0x2b, 0x33, 0xbb, 0x26, 0x36, - 0x8a, 0xb3, 0xf3, 0x4d, 0xbc, 0xe0, 0x95, 0xa4, 0x2e, 0x57, 0x99, 0xd0, - 0xae, 0x36, 0xf5, 0x76, 0xb9, 0xa9, 0xec, 0x8e, 0x95, 0x4e, 0x1c, 0x9b, - 0x5d, 0x81, 0x9c, 0x91, 0xc6, 0x16, 0xe0, 0xff, 0x48, 0x28, 0xe7, 0x74, - 0x98, 0x58, 0xfc, 0x9f, 0x95, 0xde, 0x8f, 0x42, 0x81, 0x19, 0x87, 0xf4, - 0xe9, 0x5b, 0xd0, 0x0e, 0xd4, 0x5b, 0x47, 0x2e, 0xdb, 0x53, 0xf1, 0x4a, - 0xb7, 0x0e, 0x44, 0xcd, 0xe5, 0xab, 0x84, 0xf5, 0xd1, 0x6d, 0x95, 0xe9, - 0x03, 0xe3, 0xf5, 0xdd, 0x7d, 0xbd, 0x0b, 0x1a, 0x4d, 0xb1, 0xbb, 0xa7, - 0x96, 0xd9, 0x56, 0x96, 0x05, 0x8b, 0x6e, 0x5e, 0xb6, 0x56, 0x87, 0x23, - 0xc4, 0x53, 0x9a, 0x06, 0xd8, 0x31, 0x20, 0xb6, 0x17, 0xf0, 0x22, 0x3f, - 0xe6, 0x68, 0x59, 0xb2, 0x65, 0xa8, 0xe2, 0xf1, 0x42, 0xc3, 0x28, 0x86, - 0xce, 0x0d, 0xa9, 0x47, 0x54, 0x1e, 0xbc, 0xdb, 0x0a, 0x7c, 0x12, 0x80, - 0xe0, 0xfa, 0xe4, 0x27, 0x27, 0xdb, 0x9f, 0x10, 0x9c, 0x6c, 0x80, 0x15, - 0x37, 0x18, 0x57, 0xb7, 0xbc, 0x52, 0xeb, 0x46, 0x87, 0xb9, 0xf2, 0xd5, - 0xb3, 0x35, 0x8c, 0xdb, 0x60, 0xe3, 0xdc, 0xd9, 0x65, 0x0f, 0xda, 0x34, - 0x39, 0xb1, 0xe5, 0x4a, 0xd1, 0x29, 0x44, 0x4e, 0x5a, 0xda, 0x44, 0xcd, - 0x4e, 0x86, 0x04, 0x4f, 0xe4, 0xb7, 0xd2, 0x24, 0xe4, 0x6b, 0xd2, 0x12, - 0xf8, 0x5b, 0xe5, 0x2e, 0xe3, 0x4e, 0x8d, 0xcf, 0x24, 0xf8, 0x20, 0xc4, - 0x84, 0x10, 0xaf, 0x15, 0xa9, 0x85, 0x77, 0xe5, 0xd2, 0x5e, 0x05, 0xff, - 0xdc, 0x34, 0xea, 0x18, 0x12, 0x50, 0x74, 0xbc, 0xd5, 0x90, 0x60, 0xfc, - 0x38, 0x46, 0xb7, 0xc6, 0x9a, 0x38, 0x47, 0x58, 0xc4, 0xc2, 0xe8, 0x0d, - 0xa4, 0xf7, 0xed, 0x22, 0xf7, 0x07, 0x2f, 0xa9, 0x63, 0xc2, 0x91, 0x9d, - 0xb9, 0xbc, 0x56, 0xc5, 0x98, 0xd2, 0xe1, 0xbf, 0x00, 0xd9, 0x7d, 0xf6, - 0x51, 0x16, 0x9c, 0x74, 0xb4, 0xa5, 0x17, 0x53, 0xcb, 0x9d, 0xa8, 0x95, - 0x62, 0xcc, 0xb5, 0x27, 0xa4, 0x3b, 0x29, 0x6e, 0xe3, 0x03, 0x46, 0x9b, - 0x9f, 0x45, 0xb6, 0xd9, 0x87, 0xe3, 0x05, 0x57, 0xd4, 0x15, 0x50, 0x7f, - 0x7e, 0xf6, 0x2a, 0x7f, 0x5d, 0xcb, 0x9b, 0x7f, 0x0d, 0x3a, 0x5f, 0xf1, - 0x91, 0xd4, 0x0e, 0x28, 0xa9, 0x9b, 0xec, 0xc3, 0x45, 0x77, 0x88, 0x38, - 0xc9, 0x25, 0x7f, 0xc2, 0xb8, 0xe7, 0xd8, 0xd4, 0x66, 0x05, 0xe3, 0x15, - 0x31, 0x8a, 0x94, 0xc9, 0xb3, 0x09, 0x4c, 0x8c, 0xee, 0x71, 0xcf, 0xd1, - 0xf9, 0x54, 0x9f, 0xd3, 0x4a, 0xd0, 0x71, 0x1e, 0x34, 0x6e, 0x12, 0xaa, - 0x13, 0x65, 0x37, 0xa5, 0x28, 0x43, 0x53, 0xaa, 0x5f, 0x46, 0x78, 0x3c, - 0x9f, 0x4c, 0xa5, 0x10, 0x50, 0xf3, 0x42, 0xdb, 0xcc, 0xaf, 0xb6, 0x0d, - 0x83, 0x82, 0x73, 0x6f, 0xf9, 0x5c, 0xcf, 0x6c, 0x6d, 0xf1, 0x25, 0xd4, - 0xd2, 0xfb, 0x14, 0x18, 0xa2, 0x7d, 0xae, 0xed, 0xc5, 0xed, 0x3e, 0x80, - 0x64, 0x51, 0xe2, 0xe0, 0x89, 0xee, 0xa1, 0xdc, 0xa9, 0x86, 0x91, 0xcd, - 0xd8, 0x45, 0x35, 0xe9, 0xb2, 0x66, 0x78, 0xde, 0xd4, 0xd2, 0xe6, 0x40, - 0x63, 0xa4, 0x17, 0xb7, 0xb2, 0xdc, 0x48, 0x80, 0xbd, 0x2f, 0x0a, 0x8c, - 0x84, 0x41, 0xaf, 0x70, 0x60, 0x1e, 0x05, 0x40, 0x8c, 0x3e, 0x60, 0x60, - 0x44, 0x9a, 0x7d, 0x86, 0xe0, 0xfe, 0xdc, 0x84, 0x87, 0x3e, 0x3d, 0x4c, - 0x74, 0xf3, 0x18, 0xf7, 0x50, 0x83, 0x94, 0xa6, 0x99, 0xe4, 0x0c, 0x66, - 0xb2, 0x94, 0xcd, 0x22, 0x59, 0xa9, 0x2c, 0x00, 0xa1, 0x16, 0xe6, 0x89, - 0x12, 0x08, 0xde, 0xd7, 0xfd, 0x5a, 0xaf, 0x62, 0x3a, 0x73, 0x62, 0xe2, - 0x30, 0x3b, 0x76, 0xd6, 0x3d, 0x82, 0x12, 0xd5, 0xa8, 0xbb, 0x97, 0xf0, - 0x55, 0xb5, 0xb3, 0x28, 0xf7, 0x45, 0x5c, 0x99, 0x86, 0x98, 0x07, 0x10, - 0xba, 0x87, 0x30, 0xc5, 0xc2, 0xc3, 0x4e, 0xe0, 0x99, 0xc1, 0xb2, 0x22, - 0xdb, 0x36, 0x59, 0x20, 0x18, 0xae, 0xc3, 0x69, 0xf7, 0xde, 0xe1, 0xc2, - 0xb3, 0x3a, 0x11, 0xad, 0x2c, 0x42, 0x07, 0x9b, 0x15, 0xb3, 0x2b, 0xd5, - 0x10, 0xcb, 0x80, 0x13, 0xf2, 0x11, 0xe8, 0xbb, 0x41, 0x52, 0x61, 0xdb, - 0xda, 0xa4, 0xea, 0x44, 0x4d, 0x98, 0x03, 0xff, 0xd1, 0xf9, 0xa7, 0xbe, - 0x8c, 0x87, 0x1e, 0xf9, 0xa8, 0x6d, 0xdb, 0xd7, 0xa8, 0x16, 0x03, 0xfe, - 0xac, 0x0d, 0xbd, 0x5a, 0x02, 0x5d, 0x06, 0x9e, 0x23, 0xc0, 0x1f, 0x6e, - 0x6e, 0xb8, 0x19, 0x79, 0xf2, 0x19, 0x80, 0x9a, 0x75, 0x33, 0xd4, 0xac, - 0x3e, 0xee, 0x79, 0xdf, 0x47, 0x67, 0x58, 0x57, 0xa8, 0xdd, 0x8f, 0x6e, - 0x46, 0x73, 0x9c, 0x80, 0x40, 0x88, 0xe7, 0x34, 0x56, 0x89, 0xcf, 0x0d, - 0x0f, 0x59, 0xf6, 0x55, 0x9f, 0x5a, 0x91, 0x2a, 0x85, 0xda, 0x92, 0x5a, - 0x7d, 0xa7, 0xb9, 0xe3, 0xa9, 0x40, 0x6c, 0xb7, 0xfc, 0x83, 0x35, 0x58, - 0x7b, 0x5e, 0x7c, 0xf1, 0x55, 0x16, 0xe0, 0xa4, 0x1d, 0x6e, 0xa1, 0x52, - 0xfd, 0x9d, 0x0f, 0xc3, 0xfe, 0x9f, 0x77, 0x38, 0xbf, 0x3d, 0x12, 0xd7, - 0x31, 0x24, 0x2f, 0xc9, 0xfe, 0x28, 0xbe, 0x4c, 0x4b, 0xfc, 0x34, 0x0b, - 0x8c, 0x33, 0xb0, 0xe4, 0x7c, 0x49, 0xfc, 0x27, 0x21, 0x48, 0xb1, 0x04, - 0x3c, 0xe1, 0x90, 0x9f, 0xac, 0x43, 0x04, 0xc1, 0x7b, 0xc5, 0x80, 0x8a, - 0x3f, 0x49, 0xb0, 0x8e, 0x07, 0x6f, 0x76, 0x64, 0x0d, 0xff, 0x3f, 0xf8, - 0x05, 0x8b, 0xdd, 0x53, 0x03, 0x6f, 0xab, 0xdd, 0x8a, 0x26, 0x61, 0x02, - 0x0c, 0xac, 0x9f, 0x8f, 0xd3, 0x72, 0x3e, 0x36, 0x92, 0xfb, 0x13, 0xb9, - 0x71, 0x96, 0xf4, 0xe9, 0x81, 0x3b, 0x7c, 0xe1, 0xb7, 0x81, 0x2e, 0x81, - 0x31, 0x38, 0x9b, 0x0f, 0x58, 0xdd, 0x16, 0x22, 0xa2, 0x49, 0xf9, 0xd4, - 0x5a, 0xfb, 0xe1, 0xf9, 0x86, 0x9b, 0xeb, 0x98, 0x10, 0x3b, 0x66, 0xec, - 0x8e, 0x8b, 0x4e, 0x06, 0xa6, 0x94, 0x56, 0x62, 0xbb, 0xbc, 0xf5, 0x6c, - 0x53, 0x67, 0x18, 0xde, 0x33, 0x47, 0xc4, 0x0c, 0xf1, 0xbe, 0xf2, 0x5f, - 0x6a, 0x5f, 0x87, 0x7d, 0xe6, 0x43, 0xb9, 0xb7, 0xd4, 0xcf, 0xcd, 0xd3, - 0xb6, 0x03, 0x6f, 0xde, 0x1b, 0x81, 0x84, 0xb5, 0xec, 0x8a, 0x7b, 0x1f, - 0x38, 0x97, 0x6f, 0x17, 0xee, 0xce, 0x01, 0xa5, 0x96, 0xb2, 0x8f, 0xa1, - 0xa6, 0x2c, 0x01, 0xb1, 0x60, 0x13, 0xb5, 0x5f, 0x6a, 0xaf, 0xcc, 0xb0, - 0xa0, 0xf6, 0x9a, 0xd6, 0xe4, 0xdb, 0xc1, 0x3b, 0xb0, 0x10, 0x50, 0x28, - 0xd2, 0x47, 0x22, 0x80, 0x92, 0xe6, 0x81, 0x01, 0x47, 0x8d, 0x66, 0x74, - 0x40, 0x4e, 0x78, 0xe5, 0x1a, 0x26, 0xda, 0xbc, 0xdf, 0x12, 0x18, 0x0c, - 0x73, 0xa4, 0x0f, 0x37, 0x0d, 0xb9, 0xb2, 0xc8, 0x11, 0x5e, 0xd2, 0x84, - 0x09, 0xb4, 0x4b, 0x06, 0xc6, 0xfa, 0x59, 0xa3, 0xac, 0xde, 0x7f, 0x13, - 0xcb, 0x1d, 0x77, 0xa3, 0x26, 0x6e, 0x7a, 0x20, 0xf4, 0xd4, 0x14, 0x77, - 0x5b, 0x1d, 0x15, 0x86, 0xce, 0x81, 0x8b, 0x72, 0x2b, 0x16, 0x7c, 0x91, - 0x5d, 0x5a, 0x61, 0x3c, 0xfc, 0x52, 0x49, 0x3e, 0x3b, 0x23, 0x57, 0x7d, - 0x4d, 0x46, 0xe6, 0x79, 0x41, 0x78, 0x61, 0xd6, 0x2b, 0x6a, 0x42, 0x82, - 0x3b, 0xb4, 0x5e, 0x25, 0xf4, 0x85, 0x1e, 0x37, 0xc7, 0x5f, 0xf4, 0xa2, - 0x2a, 0x61, 0xe1, 0x7f, 0x24, 0x97, 0x52, 0x2e, 0xb2, 0xbb, 0xb8, 0x8e, - 0xf3, 0xfe, 0x09, 0x46, 0x82, 0x91, 0x83, 0x13, 0xf9, 0x42, 0x74, 0x0b, - 0xd5, 0xcd, 0x26, 0xde, 0x8c, 0x29, 0xc8, 0xba, 0x2b, 0x46, 0xf0, 0xa8, - 0x6d, 0x12, 0xaf, 0x98, 0x84, 0x57, 0xe0, 0x29, 0xde, 0x81, 0xba, 0xba, - 0xa5, 0x6a, 0xf5, 0x97, 0xe5, 0xeb, 0xab, 0xba, 0x0f, 0xd2, 0x92, 0x04, - 0x03, 0xc8, 0xc4, 0x2d, 0x4d, 0xd0, 0x8d, 0xec, 0x9a, 0xc6, 0x7f, 0x54, - 0x1f, 0x8d, 0x18, 0x4c, 0x68, 0x34, 0x1b, 0x39, 0x63, 0x85, 0x84, 0xaf, - 0x4a, 0x12, 0x98, 0x6c, 0xd8, 0x66, 0x06, 0xab, 0x2a, 0x1e, 0x50, 0xd8, - 0xe4, 0x49, 0xa5, 0x2d, 0x7b, 0xbe, 0x60, 0x0c, 0x87, 0x57, 0x8c, 0xf7, - 0x96, 0xef, 0xab, 0xd9, 0xef, 0x37, 0x9b, 0x72, 0x6a, 0x87, 0xf9, 0x39, - 0x7d, 0x83, 0xc6, 0x75, 0x6f, 0x46, 0xca, 0x23, 0xfc, 0xc2, 0x77, 0x4c, - 0xdc, 0x3e, 0x03, 0x80, 0x21, 0x8d, 0x7c, 0x4c, 0x9a, 0x10, 0x6e, 0x7f, - 0x74, 0x01, 0xde, 0x3d, 0x3f, 0x63, 0xe7, 0xc9, 0xc3, 0x56, 0x15, 0x05, - 0x60, 0xc7, 0x12, 0x64, 0x78, 0x9d, 0x47, 0xae, 0xcd, 0xb7, 0x62, 0xf5, - 0xfb, 0x2c, 0x8c, 0x8b, 0x4e, 0x49, 0x72, 0xd3, 0x0b, 0xa4, 0x8e, 0x4f, - 0xfc, 0xe3, 0x05, 0x66, 0xd9, 0x6a, 0x08, 0x88, 0x09, 0x07, 0x3a, 0x0a, - 0x7b, 0x5f, 0x63, 0xec, 0x98, 0xf0, 0xf6, 0x01, 0x63, 0xda, 0xab, 0x74, - 0xab, 0xa6, 0xaa, 0xa4, 0x21, 0xb8, 0x1e, 0x7f, 0x33, 0xa5, 0xaf, 0xf5, - 0x80, 0x8b, 0x7d, 0x04, 0x11, 0x7a, 0x82, 0x3c, 0x8b, 0x1d, 0x43, 0x77, - 0x39, 0x1c, 0x43, 0x84, 0x1b, 0x79, 0x4b, 0xd8, 0xcc, 0xa0, 0xfb, 0x5e, - 0xed, 0xed, 0xeb, 0xa6, 0xd9, 0xb1, 0x0a, 0x07, 0xc6, 0x7e, 0x8c, 0xea, - 0x79, 0x33, 0x78, 0x4a, 0x88, 0xe9, 0x73, 0x80, 0x3c, 0x65, 0x03, 0x1b, - 0xce, 0x8d, 0xae, 0x23, 0x17, 0x99, 0xff, 0x35, 0x13, 0x91, 0x36, 0x44, - 0xdf, 0x85, 0xac, 0x6f, 0x18, 0x65, 0x9c, 0x0f, 0x35, 0x51, 0x7c, 0x71, - 0xfd, 0x63, 0xae, 0x2f, 0x24, 0xfe, 0x27, 0x9d, 0x12, 0x8c, 0xd4, 0xda, - 0x68, 0x43, 0x90, 0xfc, 0x62, 0xae, 0xf1, 0xd6, 0x28, 0x96, 0x07, 0xa5, - 0x11, 0x7e, 0x3a, 0x0d, 0xd6, 0x49, 0x53, 0xdd, 0xfb, 0xdf, 0x06, 0x5e, - 0xc5, 0xc2, 0x6d, 0x46, 0x4c, 0x7a, 0x21, 0x0d, 0xfe, 0x31, 0x7e, 0x91, - 0x29, 0x65, 0x72, 0x63, 0xf5, 0x97, 0x42, 0x23, 0xb7, 0xd8, 0x99, 0x36, - 0x54, 0x26, 0xbe, 0x88, 0xb5, 0x2b, 0xee, 0xe7, 0x78, 0x28, 0x42, 0x6b, - 0x87, 0x2f, 0x60, 0xa0, 0x51, 0xd2, 0xe4, 0x1d, 0xda, 0xee, 0x70, 0xb6, - 0xc8, 0x22, 0xfc, 0x82, 0x20, 0xbe, 0x2f, 0x9b, 0x3b, 0xdd, 0x16, 0x68, - 0x7d, 0x1d, 0x02, 0x1f, 0x62, 0x72, 0xc3, 0xc0, 0x0b, 0xe2, 0x81, 0xc0, - 0xa6, 0x52, 0x72, 0x05, 0x3b, 0x6b, 0xa8, 0x1c, 0xf2, 0x2c, 0x45, 0x38, - 0xef, 0x67, 0xe4, 0xe1, 0x2e, 0xc3, 0xca, 0x6b, 0x80, 0x5a, 0x61, 0x04, - 0xbf, 0xa6, 0xcd, 0xd6, 0x23, 0x19, 0x43, 0x92, 0x65, 0x2e, 0x47, 0xc4, - 0x07, 0x82, 0x0b, 0x84, 0xf2, 0xba, 0x11, 0xb3, 0xb2, 0x48, 0x31, 0xab, - 0x85, 0x45, 0x77, 0x93, 0x40, 0xd7, 0x41, 0x0f, 0xde, 0x93, 0xe0, 0x2b, - 0x96, 0xb7, 0xd9, 0x04, 0x68, 0xb9, 0x0b, 0xdd, 0x1a, 0x33, 0xa7, 0x00, - 0x6f, 0xcc, 0xac, 0x13, 0x95, 0x94, 0xa5, 0x17, 0xcd, 0x55, 0xd1, 0xe7, - 0x54, 0x29, 0xf1, 0x35, 0x00, 0xc9, 0x5c, 0x1f, 0x9a, 0x9a, 0x14, 0x5a, - 0x3f, 0x1a, 0xf3, 0x4b, 0xf2, 0x81, 0x25, 0x9d, 0xd7, 0x79, 0x76, 0xc5, - 0x13, 0xd1, 0xab, 0x99, 0x5a, 0x74, 0x06, 0x24, 0xe3, 0xf4, 0xd6, 0xb9, - 0xcd, 0x58, 0xf7, 0xf4, 0xac, 0xc7, 0xc1, 0x3d, 0x12, 0x22, 0xc2, 0x2b, - 0xea, 0xed, 0x37, 0x27, 0xe7, 0xf2, 0x00, 0x6a, 0xc8, 0xe1, 0xb1, 0x35, - 0x5e, 0xca, 0x11, 0xa5, 0x86, 0x30, 0x5f, 0x6e, 0x60, 0x9d, 0x53, 0xcb, - 0x52, 0xb6, 0xbc, 0x00, 0x84, 0xb2, 0xa8, 0xf7, 0x8b, 0xa2, 0x88, 0x60, - 0x42, 0xea, 0x7e, 0x06, 0xe1, 0x08, 0x28, 0xfb, 0xbe, 0x97, 0x55, 0x70, - 0x83, 0x1a, 0x99, 0xf6, 0x9d, 0x7a, 0xf0, 0xc3, 0x40, 0xc5, 0xec, 0x65, - 0x55, 0xf5, 0xde, 0x2a, 0x8c, 0x0d, 0x17, 0x2d, 0x0f, 0x27, 0xd6, 0xd0, - 0x1e, 0x87, 0xc5, 0x55, 0xbc, 0x9c, 0x7f, 0x2f, 0x07, 0x8d, 0xfd, 0xa9, - 0xc5, 0xc6, 0x5a, 0xec, 0x04, 0x4e, 0x5c, 0x0a, 0xfb, 0xdc, 0x46, 0xc4, - 0xa0, 0x72, 0x9d, 0x96, 0xe7, 0xc9, 0x1f, 0x68, 0xf3, 0x80, 0xd2, 0x44, - 0x1d, 0xe9, 0x4c, 0x22, 0x07, 0x88, 0x07, 0x2e, 0x96, 0x48, 0x3d, 0xe2, - 0x8a, 0x6c, 0xe8, 0x49, 0xf3, 0xef, 0x50, 0x23, 0xcd, 0x70, 0x0b, 0xde, - 0x64, 0x86, 0xfa, 0x63, 0xcc, 0x64, 0xdf, 0x11, 0xc4, 0x07, 0x21, 0xca, - 0xc8, 0x94, 0x3c, 0x79, 0x6d, 0x39, 0xd2, 0x30, 0x8e, 0x16, 0x8b, 0x69, - 0x4a, 0x46, 0x42, 0x78, 0xdb, 0xac, 0xd3, 0x95, 0x02, 0x11, 0x28, 0xa3, - 0x65, 0x0c, 0xec, 0x19, 0x52, 0xc0, 0x1b, 0xab, 0xea, 0xad, 0xa0, 0x41, - 0x64, 0x55, 0x23, 0x60, 0x27, 0xe0, 0x6e, 0xc9, 0x19, 0x06, 0xb2, 0xba, - 0xae, 0x23, 0xef, 0x77, 0x80, 0x24, 0xff, 0x7e, 0xb3, 0xcf, 0x4a, 0x88, - 0x32, 0x8f, 0xdf, 0xaa, 0x7e, 0xec, 0x35, 0x87, 0x46, 0x78, 0x2c, 0x06, - 0x08, 0x23, 0x90, 0xb7, 0x6d, 0x32, 0x3b, 0x5f, 0xda, 0x9b, 0xea, 0x3f, - 0x2c, 0x4e, 0xab, 0x52, 0x4f, 0xc5, 0x59, 0x8a, 0x6a, 0x4b, 0x7f, 0x12, - 0x54, 0xa0, 0xad, 0x78, 0xe7, 0x02, 0x7c, 0x70, 0x23, 0xb8, 0x8d, 0x8c, - 0x6b, 0x44, 0x7c, 0x11, 0x90, 0x55, 0xca, 0xca, 0xdf, 0x86, 0x5a, 0x2f, - 0x65, 0x03, 0xd6, 0x8d, 0x1f, 0x67, 0x5d, 0xda, 0xa5, 0xe9, 0x8f, 0x35, - 0x96, 0x1e, 0x30, 0x78, 0xe0, 0xaa, 0x27, 0x51, 0x18, 0xb3, 0x36, 0x2e, - 0xc1, 0x54, 0x85, 0xd4, 0xa2, 0x9d, 0x9c, 0x50, 0xe5, 0x3a, 0xed, 0x58, - 0x77, 0x9c, 0x3b, 0x3e, 0x5f, 0x29, 0x3c, 0xb2, 0x73, 0x54, 0xb6, 0x57, - 0x05, 0x49, 0x0f, 0x60, 0xa9, 0x49, 0x82, 0x35, 0xcd, 0xfa, 0x3e, 0x08, - 0xad, 0x70, 0xc5, 0xb1, 0x98, 0x4f, 0x67, 0xda, 0x27, 0x04, 0xcd, 0x7f, - 0x78, 0x74, 0x61, 0xd8, 0x3e, 0xd9, 0xa0, 0xc0, 0x3e, 0x87, 0x42, 0x56, - 0x29, 0xc6, 0xee, 0x61, 0x24, 0xe2, 0xb6, 0x08, 0xa7, 0x33, 0x8e, 0x1f, - 0xe6, 0x4e, 0xa5, 0x5c, 0x64, 0x24, 0x96, 0x8e, 0x26, 0x68, 0xf3, 0xfa, - 0x43, 0xf0, 0xef, 0xf3, 0x68, 0x90, 0x26, 0xad, 0x0e, 0x9c, 0x54, 0x63, - 0xeb, 0x63, 0x9f, 0xa0, 0x6e, 0x35, 0x88, 0xe1, 0x97, 0x3c, 0x48, 0x17, - 0x94, 0x97, 0xab, 0xed, 0xcb, 0x71, 0xeb, 0x91, 0x59, 0x81, 0x29, 0x5d, - 0xe5, 0x49, 0xa9, 0x2e, 0xfb, 0x6c, 0x14, 0x5f, 0xb4, 0x28, 0xfa, 0xba, - 0x72, 0x8a, 0xe5, 0x25, 0x41, 0x80, 0xd4, 0xef, 0x4f, 0xd8, 0x1f, 0x20, - 0x61, 0x3b, 0xa4, 0x56, 0x9f, 0xdc, 0x01, 0xed, 0x1d, 0xdd, 0x9e, 0xcf, - 0xfc, 0x8a, 0x1b, 0xc2, 0xe6, 0x47, 0x6f, 0xaf, 0x18, 0x62, 0x78, 0xfc, - 0xd6, 0x9d, 0x4e, 0x43, 0x47, 0x30, 0x1c, 0x61, 0x7c, 0xa0, 0xdd, 0x2e, - 0xb9, 0x69, 0x68, 0x31, 0x1b, 0x09, 0xeb, 0x7e, 0x95, 0xcf, 0xc8, 0x99, - 0x6a, 0x71, 0x70, 0x7a, 0x8d, 0x22, 0x23, 0xbf, 0x87, 0x4c, 0x57, 0x85, - 0x79, 0x4d, 0x35, 0xe1, 0x06, 0xce, 0x3c, 0x93, 0xa0, 0xfa, 0x2a, 0x67, - 0xd3, 0xdf, 0x00, 0x50, 0x24, 0x6b, 0xec, 0xc0, 0xcf, 0x13, 0xcc, 0x57, - 0x6a, 0x31, 0x1c, 0x98, 0xa3, 0xd1, 0x4b, 0x85, 0x9d, 0x06, 0xe2, 0xb8, - 0x06, 0xac, 0xe7, 0x2d, 0xf1, 0x2c, 0x45, 0x21, 0x79, 0xbc, 0x41, 0xb1, - 0x30, 0x9a, 0x0e, 0xa9, 0x53, 0xeb, 0x31, 0x8c, 0xd1, 0x82, 0x5e, 0x8a, - 0x71, 0x01, 0xa8, 0x70, 0xf8, 0x92, 0x96, 0x14, 0x62, 0x2c, 0x2e, 0xd6, - 0x50, 0x64, 0xe1, 0x82, 0xaf, 0x24, 0xbe, 0xae, 0x55, 0x64, 0xc5, 0x48, - 0x55, 0x54, 0x69, 0x2e, 0x95, 0x82, 0xf8, 0x9a, 0x78, 0xa7, 0x2d, 0x5a, - 0xca, 0xe1, 0x0f, 0xac, 0x9d, 0x48, 0x27, 0x7d, 0xfb, 0x54, 0x05, 0xff, - 0xc3, 0x6f, 0x62, 0xc8, 0x24, 0x02, 0x74, 0x1d, 0x26, 0xfc, 0x2a, 0xae, - 0x71, 0xc2, 0x29, 0x0b, 0x29, 0x15, 0xc6, 0x72, 0xa5, 0x3e, 0x5b, 0xac, - 0xd4, 0xe2, 0x19, 0x02, 0x95, 0xb2, 0x28, 0x76, 0x05, 0xbd, 0x46, 0x96, - 0x3a, 0x38, 0x27, 0x8e, 0x32, 0x19, 0x18, 0xad, 0xf6, 0xb8, 0x22, 0xf1, - 0xd5, 0x65, 0x84, 0x75, 0x47, 0x74, 0x09, 0xf4, 0x21, 0xed, 0x5a, 0x49, - 0x43, 0x40, 0x50, 0x4f, 0x42, 0x3c, 0x4e, 0x6f, 0xbc, 0x45, 0x87, 0xe4, - 0x01, 0x59, 0xde, 0xba, 0xa5, 0xf7, 0x70, 0xe2, 0x72, 0x92, 0x54, 0xe1, - 0x8c, 0x5c, 0x3d, 0x2a, 0xf2, 0x5d, 0x09, 0xe7, 0x16, 0xc3, 0xfb, 0x77, - 0x73, 0xb7, 0x08, 0xc9, 0x7f, 0xe5, 0x40, 0xa7, 0x57, 0x7e, 0x93, 0x96, - 0xb8, 0xdd, 0x59, 0xdb, 0x7b, 0x3c, 0x6a, 0x78, 0x30, 0x6d, 0x62, 0x9d, - 0x20, 0xd3, 0x91, 0xbd, 0xa7, 0x87, 0x42, 0x67, 0x16, 0x5f, 0xcb, 0x34, - 0x47, 0x35, 0x35, 0x6e, 0x12, 0x15, 0x96, 0x29, 0xbb, 0x61, 0xe2, 0x9e, - 0x91, 0x07, 0x30, 0xc3, 0x13, 0x2a, 0x8f, 0xa6, 0x3c, 0xf1, 0xf6, 0x25, - 0x1f, 0xdb, 0x56, 0xf8, 0x2a, 0x4b, 0xcc, 0xd3, 0xc5, 0xc6, 0x61, 0x94, - 0x02, 0xf8, 0xed, 0xef, 0x6a, 0xb4, 0xd8, 0x52, 0x6b, 0x5e, 0xe8, 0x40, - 0xf6, 0xa2, 0xf8, 0xaa, 0xdf, 0x00, 0x0d, 0xb0, 0xa5, 0x68, 0x86, 0x05, - 0x88, 0x41, 0x1b, 0xe2, 0x33, 0xdd, 0xd5, 0x46, 0x42, 0xf4, 0xbc, 0xdb, - 0x73, 0x37, 0x97, 0xf0, 0x0c, 0x56, 0x84, 0xc2, 0x13, 0x04, 0xaa, 0xdf, - 0x4b, 0x84, 0x58, 0xac, 0x16, 0xa7, 0x3b, 0x76, 0x64, 0x5a, 0xda, 0x42, - 0x5d, 0x5d, 0x76, 0xba, 0x76, 0xf9, 0x15, 0x4b, 0x51, 0xdc, 0x8c, 0xb8, - 0xfb, 0xcc, 0xc1, 0x1f, 0x3d, 0x25, 0xce, 0x25, 0x4f, 0xbc, 0x15, 0x6d, - 0xd1, 0xa5, 0x3b, 0x04, 0xfc, 0xc3, 0x20, 0xe4, 0x44, 0x3e, 0xad, 0xe2, - 0xed, 0xa3, 0x4b, 0xb4, 0x2d, 0xd0, 0xf0, 0xe0, 0x5e, 0x17, 0x87, 0x6b, - 0x5d, 0xda, 0x97, 0x3e, 0xe1, 0x99, 0x86, 0x9c, 0x29, 0xe7, 0x6b, 0x7a, - 0x2c, 0x37, 0x97, 0x51, 0x72, 0xa5, 0x59, 0x3e, 0xee, 0x60, 0x71, 0xb3, - 0x74, 0xdb, 0x44, 0x81, 0x37, 0x50, 0x68, 0xb0, 0x9c, 0x7c, 0x80, 0xd8, - 0x78, 0x88, 0x3e, 0x5c, 0x98, 0x1f, 0xc2, 0xe7, 0x01, 0x64, 0xab, 0xa3, - 0x3c, 0x9a, 0x72, 0xe9, 0x52, 0x13, 0x88, 0xe6, 0x60, 0xd3, 0xe9, 0x1b, - 0x3e, 0x97, 0xed, 0xa5, 0x8c, 0x4d, 0x0a, 0xd3, 0xe6, 0xc8, 0xa5, 0xce, - 0xe9, 0x3d, 0x69, 0x95, 0xa5, 0x2e, 0x06, 0x8f, 0x72, 0x36, 0x31, 0x48, - 0x18, 0xa8, 0x37, 0xf3, 0x44, 0xa0, 0x90, 0xcf, 0xae, 0x65, 0x22, 0x64, - 0x6a, 0xaa, 0xef, 0x54, 0x04, 0x19, 0x06, 0x33, 0x41, 0x1e, 0x19, 0x6d, - 0x5a, 0x8f, 0x2b, 0xd3, 0x89, 0x92, 0x60, 0xd3, 0x70, 0xa1, 0x1b, 0x03, - 0x81, 0xdf, 0xca, 0xc5, 0xb1, 0x11, 0x78, 0x2b, 0x10, 0xb6, 0x20, 0x0a, - 0xa6, 0x0c, 0x6c, 0xfe, 0xb8, 0x02, 0x4c, 0x80, 0xac, 0x79, 0x28, 0x9d, - 0xbd, 0x93, 0x14, 0x7c, 0x97, 0x78, 0xd6, 0x2f, 0xf8, 0x23, 0x19, 0x09, - 0xf8, 0x90, 0x53, 0xf8, 0x46, 0x10, 0x70, 0x9c, 0xf5, 0x8a, 0x07, 0xa7, - 0x60, 0xfc, 0xa7, 0xc7, 0x61, 0x2f, 0x13, 0xb2, 0xa0, 0x0c, 0xb5, 0x51, - 0x5f, 0x38, 0x58, 0x62, 0x77, 0xfa, 0x89, 0xd2, 0x1d, 0x9a, 0xd1, 0x5a, - 0xe2, 0xfa, 0x20, 0xc3, 0x80, 0x26, 0x39, 0x2d, 0xa5, 0xeb, 0x79, 0x42, - 0x94, 0x7a, 0x3e, 0x09, 0x13, 0x85, 0x33, 0x2f, 0x94, 0xc0, 0xa8, 0x66, - 0xfd, 0x31, 0xdc, 0x65, 0x63, 0x2f, 0x27, 0x12, 0x10, 0xcc, 0x67, 0x0a, - 0x3f, 0xf3, 0x27, 0x7c, 0x57, 0x19, 0x05, 0xd0, 0x8c, 0x80, 0xa7, 0x07, - 0x27, 0xdf, 0xa5, 0x16, 0x49, 0xee, 0x0d, 0x52, 0x23, 0xf2, 0x74, 0x74, - 0x05, 0xf6, 0x6c, 0xff, 0x11, 0x54, 0x16, 0x8d, 0x6e, 0xef, 0x53, 0x52, - 0x52, 0xcc, 0xac, 0xe3, 0x9f, 0xc8, 0xd3, 0xf0, 0x6c, 0x78, 0x6f, 0x84, - 0xb0, 0xa0, 0x76, 0x85, 0x71, 0x82, 0x43, 0x42, 0x27, 0xa4, 0x3b, 0x3c, - 0xf0, 0x79, 0xbb, 0xae, 0x2a, 0x8e, 0x7b, 0xe9, 0x61, 0xf8, 0xff, 0x36, - 0xc0, 0xc3, 0x19, 0x5b, 0xfc, 0xf6, 0xd4, 0x41, 0x27, 0x30, 0xca, 0x18, - 0x85, 0xfb, 0x13, 0xbc, 0xd2, 0x86, 0xcf, 0x5e, 0x5c, 0x3c, 0xb4, 0x2b, - 0xcd, 0x0d, 0x20, 0x25, 0x66, 0x86, 0xcb, 0xfb, 0x4a, 0xbb, 0x7c, 0x38, - 0x16, 0x3b, 0x93, 0x3b, 0xf1, 0x29, 0x04, 0xaf, 0x0b, 0x6e, 0xaa, 0x9f, - 0x8c, 0x4d, 0xb9, 0x42, 0xed, 0xfa, 0x52, 0xfb, 0x2c, 0xb8, 0xd4, 0x17, - 0x00, 0x9f, 0xb9, 0x6f, 0x0c, 0xb7, 0x38, 0x11, 0xce, 0x71, 0xb5, 0x75, - 0x22, 0x60, 0x78, 0x4d, 0xf7, 0x0b, 0x4b, 0xe8, 0xaa, 0xae, 0xad, 0xab, - 0xa9, 0x41, 0xf0, 0xd2, 0xb3, 0xa3, 0x31, 0x7e, 0x33, 0x54, 0x13, 0x7b, - 0xe1, 0xde, 0x0d, 0x65, 0x8f, 0x4d, 0xd0, 0xfe, 0xa4, 0xfa, 0xb9, 0x72, - 0x02, 0x73, 0x06, 0xef, 0x0a, 0x6c, 0x85, 0x24, 0x77, 0xbf, 0x4c, 0x77, - 0xd9, 0x53, 0xc1, 0x96, 0x0e, 0x36, 0x62, 0x9e, 0xd2, 0xac, 0x5a, 0xcc, - 0x4e, 0x46, 0x1d, 0xd2, 0x8a, 0x40, 0xe4, 0x1f, 0x46, 0xec, 0xb8, 0x9a, - 0x48, 0xc3, 0x85, 0xcb, 0x34, 0x3d, 0x0d, 0xaa, 0x8f, 0x6d, 0x9d, 0xba, - 0x79, 0xdd, 0xdb, 0x70, 0x10, 0x19, 0xe7, 0x08, 0x6e, 0x08, 0x26, 0x35, - 0x6c, 0x22, 0x7e, 0xaf, 0x2c, 0x79, 0xc0, 0x3b, 0x68, 0xe2, 0xa3, 0xa2, - 0x77, 0xac, 0xc7, 0x4b, 0xf6, 0xca, 0xa8, 0xd0, 0xda, 0x8d, 0xf7, 0x41, - 0xc5, 0x12, 0xc7, 0xef, 0xe1, 0x67, 0xc5, 0x2a, 0x11, 0x7c, 0x08, 0xf2, - 0xba, 0x79, 0x2b, 0xc7, 0xd4, 0xf2, 0x6e, 0x28, 0xc5, 0xd5, 0x50, 0x66, - 0xf6, 0x53, 0xaf, 0xc1, 0x4f, 0x55, 0x6c, 0x7c, 0x9f, 0x02, 0xce, 0x40, - 0xb3, 0x83, 0x28, 0xd9, 0x39, 0x76, 0x37, 0x0b, 0x6c, 0xea, 0x79, 0xde, - 0xd5, 0xf6, 0xe4, 0x26, 0x8b, 0xbc, 0xef, 0x58, 0x31, 0x6a, 0xd5, 0x64, - 0x73, 0x72, 0xa6, 0x23, 0x77, 0x7f, 0x07, 0x62, 0x4a, 0x59, 0xb6, 0xd9, - 0x00, 0xba, 0x7e, 0x31, 0xa5, 0x51, 0x7d, 0x7e, 0x65, 0xbe, 0x22, 0xbd, - 0x4d, 0x20, 0xdb, 0x39, 0xc8, 0x4a, 0x54, 0xae, 0xc1, 0x91, 0x1d, 0x63, - 0x68, 0x10, 0x1b, 0xc6, 0x90, 0x15, 0xcc, 0x45, 0x0e, 0x76, 0xc9, 0x43, - 0xcd, 0x5f, 0x8b, 0xbc, 0x85, 0x35, 0x7a, 0xb2, 0x48, 0x75, 0x9a, 0x3e, - 0x6f, 0xee, 0x69, 0xd7, 0xbf, 0x5c, 0xfa, 0xcc, 0x52, 0x41, 0x59, 0xce, - 0x65, 0xeb, 0x1e, 0xbe, 0x5e, 0xa7, 0x30, 0x3b, 0x05, 0x79, 0x7b, 0x79, - 0xed, 0x88, 0xe5, 0xd4, 0xc4, 0xf9, 0x68, 0x98, 0xb7, 0xfb, 0x1c, 0x58, - 0x9f, 0x5e, 0x8d, 0x6e, 0x58, 0xa7, 0x1f, 0x32, 0x71, 0x54, 0x15, 0xc7, - 0x70, 0x60, 0x79, 0xf5, 0x9d, 0x6e, 0xb8, 0x29, 0xf0, 0x8c, 0x46, 0xf2, - 0xd4, 0x1a, 0x7a, 0x9f, 0x7c, 0x3c, 0x03, 0xd3, 0x78, 0x79, 0xf0, 0x9b, - 0xe9, 0xf4, 0x4d, 0x50, 0x63, 0x92, 0x02, 0x30, 0xc4, 0x08, 0x7e, 0x15, - 0x84, 0xb7, 0x7e, 0xcc, 0xf6, 0x5c, 0xae, 0xdd, 0xcf, 0x0e, 0xc1, 0x38, - 0xe1, 0xb4, 0x9d, 0xc7, 0xe0, 0xbe, 0x3a, 0xaa, 0x31, 0x4b, 0xf0, 0x52, - 0xe9, 0xa3, 0x05, 0x57, 0x37, 0x86, 0xd1, 0x97, 0x87, 0x68, 0x5d, 0x55, - 0x2f, 0xaa, 0x4a, 0x1e, 0xd7, 0xc0, 0xd3, 0x44, 0x59, 0x8f, 0x46, 0x14, - 0xfa, 0x58, 0xe0, 0x49, 0x44, 0x21, 0x15, 0x2b, 0xa2, 0x18, 0x6a, 0xbd, - 0x86, 0x7b, 0x80, 0x33, 0xb6, 0x16, 0x6b, 0x0f, 0x87, 0xae, 0xee, 0xf7, - 0x83, 0xe7, 0x06, 0x7d, 0xc7, 0xe1, 0xac, 0xfc, 0x65, 0x19, 0x46, 0x97, - 0x73, 0xff, 0xa7, 0xdf, 0x03, 0x4f, 0x05, 0x2c, 0xca, 0x25, 0x61, 0xe9, - 0xf4, 0x47, 0xd8, 0x78, 0x36, 0x97, 0xd9, 0xb7, 0x57, 0x64, 0x28, 0xf2, - 0x15, 0xaa, 0x9f, 0x6f, 0x08, 0x7f, 0xef, 0xd9, 0x02, 0xf0, 0xb0, 0xb2, - 0x49, 0x3f, 0x6f, 0xa0, 0xe5, 0xe0, 0x9b, 0x90, 0xce, 0xb4, 0x05, 0xdc, - 0xff, 0x42, 0x61, 0x1f, 0xa4, 0x9b, 0x06, 0xfd, 0xda, 0x69, 0xee, 0x9e, - 0x96, 0x91, 0x35, 0x1c, 0x50, 0xcd, 0x83, 0x42, 0x08, 0x24, 0xd2, 0x4e, - 0x56, 0x56, 0x09, 0x2b, 0x24, 0xb2, 0x50, 0x62, 0x47, 0x55, 0x5f, 0x87, - 0x45, 0x32, 0x68, 0x55, 0x39, 0x4e, 0xd7, 0xae, 0xc5, 0xad, 0xff, 0x7d, - 0x97, 0x8f, 0x0d, 0x00, 0x88, 0x8a, 0xe3, 0xc6, 0xc3, 0xf7, 0x37, 0xb9, - 0xc4, 0xea, 0x2e, 0x61, 0x36, 0x04, 0x77, 0xc6, 0x5b, 0x9b, 0xfb, 0x7a, - 0x11, 0x85, 0x3d, 0x05, 0x03, 0x1a, 0xd2, 0x2c, 0xa2, 0x94, 0xd9, 0x2a, - 0x3d, 0x1c, 0x09, 0x5d, 0x70, 0xbb, 0x2b, 0x2e, 0xd9, 0xef, 0x4a, 0x67, - 0xd6, 0xfb, 0xa4, 0xbe, 0xa3, 0xa5, 0xb4, 0x9d, 0xdd, 0xea, 0x2d, 0xdd, - 0x78, 0x59, 0x56, 0xb2, 0x91, 0x4f, 0xe3, 0x4b, 0x2f, 0x39, 0x06, 0xd0, - 0xad, 0xd8, 0x49, 0x57, 0xb3, 0xdb, 0x2e, 0x13, 0x40, 0x57, 0x4c, 0x86, - 0x08, 0x1f, 0x02, 0x5f, 0x9a, 0x6e, 0x80, 0xbf, 0x2d, 0xb7, 0xc2, 0xa5, - 0x54, 0xf1, 0x14, 0x68, 0x83, 0x48, 0xc9, 0x4e, 0x91, 0xb1, 0x3d, 0x2d, - 0x0d, 0xf2, 0xac, 0x6d, 0xf5, 0xc4, 0x98, 0xb1, 0xb2, 0xac, 0xce, 0xff, - 0x47, 0x5c, 0x7e, 0xc7, 0xb9, 0xe8, 0xe5, 0x22, 0x84, 0xd7, 0xee, 0xa5, - 0xbd, 0xe0, 0xcc, 0x4b, 0xa2, 0xb6, 0x6a, 0xda, 0x78, 0xbc, 0x4f, 0x7a, - 0x5d, 0xc3, 0xf2, 0x04, 0x1f, 0x3b, 0xe2, 0x28, 0x50, 0xf2, 0x5f, 0xad, - 0xb0, 0xd1, 0x59, 0x79, 0xcc, 0xca, 0x0c, 0xee, 0xa3, 0x7c, 0xe8, 0x48, - 0xf0, 0x33, 0x2b, 0x2d, 0xae, 0xfb, 0x5c, 0x73, 0x15, 0x1c, 0xee, 0xf7, - 0x9e, 0x48, 0x25, 0x7a, 0x45, 0x6c, 0x07, 0x87, 0x4b, 0x8b, 0x5f, 0x7e, - 0x92, 0x17, 0x62, 0xae, 0xbb, 0xec, 0x3e, 0x47, 0x94, 0xce, 0xaf, 0xed, - 0x1e, 0x1c, 0x11, 0x01, 0x64, 0xfb, 0xe4, 0x82, 0xc5, 0xbc, 0x61, 0x65, - 0xac, 0x32, 0xf9, 0x3a, 0x78, 0x48, 0x48, 0x2f, 0x41, 0x46, 0xc8, 0x3c, - 0xb5, 0xd7, 0x7a, 0xc1, 0x01, 0x58, 0xd5, 0xd0, 0xdd, 0x6d, 0x35, 0x00, - 0xf2, 0x32, 0x3e, 0xb0, 0xd0, 0x3a, 0xcb, 0x88, 0xac, 0x87, 0xfa, 0xc3, - 0x66, 0x8f, 0x7a, 0xb9, 0x74, 0x70, 0x6c, 0x9c, 0xda, 0xb8, 0x34, 0xde, - 0x4b, 0xe2, 0xa7, 0x83, 0x71, 0x9b, 0x49, 0x46, 0x25, 0x3e, 0x87, 0x8d, - 0xb7, 0x30, 0xbc, 0xfd, 0xe0, 0x87, 0x3a, 0x2b, 0x22, 0x57, 0xe5, 0x74, - 0x44, 0x74, 0x89, 0x06, 0xc4, 0x6c, 0x5a, 0x32, 0xee, 0x33, 0xf5, 0x17, - 0xf2, 0xbd, 0xf2, 0x1c, 0x6e, 0x2e, 0x02, 0xc3, 0x12, 0x83, 0xad, 0xf0, - 0xb3, 0xcf, 0xec, 0x41, 0xc4, 0x5b, 0xb9, 0xe2, 0x26, 0x2e, 0xd1, 0xb1, - 0xaf, 0x07, 0x13, 0x03, 0xae, 0xfd, 0xe3, 0x8a, 0xc3, 0x0b, 0xda, 0x20, - 0x88, 0x5b, 0x2e, 0xb1, 0x45, 0x55, 0x9d, 0xf2, 0xb1, 0xe7, 0x4b, 0xaa, - 0x98, 0xfd, 0x3c, 0x90, 0x25, 0xc2, 0x0d, 0x60, 0xdc, 0x9f, 0xc4, 0x35, - 0x6c, 0xb3, 0x6a, 0xd6, 0x8d, 0x35, 0xc6, 0x60, 0xae, 0xfb, 0xf9, 0x31, - 0x9e, 0x74, 0xb6, 0x4e, 0xdd, 0xca, 0x80, 0x13, 0xea, 0xd5, 0x36, 0x67, - 0xa6, 0xb9, 0x64, 0x08, 0xbb, 0x01, 0xc1, 0x76, 0xbe, 0x3b, 0xb9, 0xc8, - 0x42, 0xc9, 0x00, 0x5f, 0xa4, 0x20, 0x76, 0x66, 0x8c, 0x4e, 0x61, 0xcb, - 0x22, 0x20, 0x2b, 0x79, 0x80, 0x29, 0xa8, 0x52, 0x28, 0xb6, 0x1a, 0x1c, - 0xc1, 0xeb, 0x3d, 0x59, 0x59, 0x94, 0x30, 0x6b, 0x7b, 0xb3, 0x47, 0x3b, - 0x39, 0xb7, 0x50, 0x4a, 0xef, 0x63, 0x9b, 0xd5, 0x8b, 0x94, 0x63, 0xe7, - 0x17, 0x3d, 0x1b, 0x42, 0x15, 0x99, 0x8f, 0x0a, 0x8a, 0x79, 0x13, 0x21, - 0x46, 0xad, 0xbf, 0xdd, 0xab, 0x25, 0x1e, 0x29, 0xff, 0x0a, 0xb5, 0xf5, - 0x65, 0x01, 0xda, 0x1c, 0xf1, 0x1a, 0xec, 0x3d, 0x6d, 0x6c, 0x5a, 0x15, - 0x6d, 0x13, 0x49, 0x64, 0x58, 0x23, 0xfd, 0xad, 0x17, 0xfe, 0x99, 0x60, - 0x44, 0xa5, 0x0e, 0x11, 0xb3, 0xdc, 0x27, 0xac, 0x94, 0x64, 0x78, 0x9f, - 0x71, 0xc6, 0x2e, 0x59, 0x53, 0x0f, 0x76, 0x04, 0x5e, 0x85, 0x91, 0x0b, - 0x07, 0x01, 0x0f, 0xbe, 0x0d, 0xde, 0xc9, 0x64, 0x7b, 0x95, 0x0e, 0x61, - 0x4c, 0x73, 0xb5, 0x84, 0x48, 0xfb, 0xc6, 0xd5, 0x99, 0x7a, 0x1d, 0x2c, - 0x74, 0xbe, 0x6d, 0x40, 0x28, 0x04, 0x1b, 0x8d, 0x36, 0xb1, 0x6c, 0xe8, - 0x54, 0xdd, 0xb1, 0xce, 0xa7, 0x7f, 0x20, 0x8c, 0xe0, 0xfe, 0x29, 0x4c, - 0x00, 0x5f, 0x86, 0xab, 0x88, 0x27, 0xe9, 0x10, 0xab, 0x93, 0x9a, 0x4d, - 0xbf, 0x0c, 0x4b, 0x1f, 0xc2, 0xc2, 0xd8, 0xa4, 0x5a, 0x61, 0x9e, 0xbc, - 0xca, 0x52, 0x3a, 0xab, 0x72, 0x67, 0x61, 0xe0, 0xe6, 0x2c, 0x3a, 0x54, - 0x04, 0x9a, 0xb6, 0x92, 0x53, 0xac, 0xea, 0x15, 0xce, 0xee, 0xea, 0x24, - 0x7f, 0x14, 0xa9, 0x85, 0xc8, 0xbd, 0x7f, 0x34, 0x57, 0x8c, 0x88, 0xb4, - 0xaf, 0x0e, 0xf3, 0x95, 0xe0, 0xa7, 0x7e, 0xf2, 0x50, 0xa7, 0xf7, 0xb4, - 0xa8, 0xe4, 0x1e, 0x40, 0xbc, 0x4a, 0xea, 0x1d, 0x83, 0x60, 0x30, 0x75, - 0x6a, 0x60, 0x91, 0xf6, 0xa7, 0x8f, 0x52, 0x5e, 0xef, 0xc7, 0x10, 0xfc, - 0xf3, 0x76, 0xe5, 0xe4, 0x69, 0xbb, 0x50, 0x56, 0x33, 0x7c, 0x16, 0x55, - 0xcd, 0x0d, 0xc8, 0xb7, 0x1d, 0xce, 0xe8, 0x29, 0x9c, 0xd4, 0xca, 0xa0, - 0x1e, 0xb0, 0x14, 0xf5, 0x01, 0x3c, 0xd2, 0xc0, 0x26, 0x83, 0xcb, 0x55, - 0xe0, 0x91, 0x0e, 0xd3, 0x46, 0x3b, 0xd1, 0x07, 0x16, 0x34, 0x6a, 0xeb, - 0x79, 0x3d, 0x68, 0xc4, 0x44, 0xe2, 0xac, 0x9f, 0xfb, 0x5e, 0xb1, 0x6c, - 0x52, 0x80, 0x6e, 0x6a, 0x6a, 0xc0, 0xe7, 0xbb, 0x0b, 0xf2, 0xde, 0x57, - 0xe4, 0xe5, 0xdb, 0x0a, 0xe2, 0x81, 0xa0, 0xf9, 0xd9, 0x9d, 0x32, 0x4d, - 0x70, 0xcc, 0x14, 0x9f, 0x95, 0x3b, 0x63, 0x80, 0x91, 0x3a, 0x67, 0x7d, - 0x56, 0x28, 0x97, 0xea, 0x39, 0x84, 0xdd, 0x0c, 0x99, 0x08, 0x3b, 0x05, - 0xe6, 0x34, 0xf5, 0xf7, 0xd9, 0x24, 0x2c, 0xaf, 0x2c, 0xd2, 0xfa, 0x50, - 0x38, 0xd6, 0x8c, 0xb6, 0xc5, 0xfd, 0x16, 0x6a, 0x7c, 0xe0, 0x28, 0x99, - 0xd9, 0xd4, 0xa5, 0xf6, 0x33, 0x43, 0xfe, 0x10, 0x53, 0xcc, 0x76, 0x43, - 0x7d, 0x74, 0x15, 0x3b, 0x5b, 0xa2, 0x50, 0xd2, 0xb8, 0xcf, 0x9d, 0xec, - 0x2d, 0x3d, 0xd1, 0x6b, 0x69, 0xf8, 0x91, 0xc0, 0x50, 0x12, 0x8e, 0xbc, - 0x47, 0x64, 0xa7, 0x59, 0x92, 0x4f, 0x4d, 0x22, 0xf5, 0x7b, 0x60, 0xab, - 0x6b, 0xf5, 0x30, 0x11, 0x96, 0xfc, 0x14, 0xa8, 0x31, 0x61, 0x7b, 0x11, - 0x30, 0xdf, 0x02, 0x15, 0x92, 0x73, 0x0b, 0x9d, 0xfe, 0x04, 0x04, 0x9c, - 0x68, 0xe1, 0xd2, 0x01, 0x32, 0x4c, 0x26, 0x2f, 0x06, 0x4e, 0xbf, 0x14, - 0xb4, 0x39, 0x40, 0xff, 0x80, 0x02, 0xb8, 0x9e, 0x07, 0xb4, 0x0a, 0xf4, - 0x1c, 0xa9, 0xee, 0x24, 0x7a, 0x9b, 0x93, 0x06, 0x9e, 0xae, 0x71, 0x3e, - 0x6f, 0x20, 0xd6, 0x03, 0xd4, 0x64, 0x51, 0x14, 0x00, 0x90, 0x28, 0x2a, - 0xcb, 0x29, 0xf6, 0xe4, 0x0b, 0xe8, 0xcb, 0x2a, 0x9e, 0xef, 0x77, 0xda, - 0xc4, 0xa8, 0x91, 0x6e, 0x12, 0x4e, 0x62, 0x9a, 0xe9, 0x55, 0x2e, 0x83, - 0x77, 0x01, 0x52, 0x87, 0x13, 0x83, 0xe4, 0xe2, 0x61, 0xb7, 0x9b, 0x46, - 0x51, 0x37, 0x0b, 0x40, 0x45, 0xfc, 0x71, 0xfd, 0x92, 0x9c, 0x3b, 0x42, - 0x08, 0x44, 0xb9, 0x73, 0x51, 0x36, 0x32, 0xb9, 0x7b, 0x84, 0x76, 0x5c, - 0x78, 0xd5, 0x71, 0xe5, 0xea, 0x76, 0x95, 0x9c, 0xb3, 0x98, 0xea, 0x52, - 0xd8, 0x50, 0x3a, 0x6e, 0x3d, 0x50, 0x6c, 0x4f, 0x6f, 0x6c, 0x31, 0x72, - 0xd1, 0x41, 0x93, 0x00, 0x56, 0x12, 0x00, 0x52, 0xfb, 0x27, 0x49, 0x15, - 0xaa, 0x06, 0x9c, 0xb3, 0x96, 0x12, 0x6d, 0x5b, 0x2b, 0xaf, 0x33, 0xdf, - 0x66, 0x84, 0x26, 0x05, 0x7a, 0x14, 0xac, 0x1b, 0x38, 0xbb, 0x68, 0xa8, - 0xee, 0x07, 0xe6, 0xd9, 0x4b, 0x52, 0x75, 0x16, 0x06, 0xe9, 0xa1, 0xc9, - 0xe0, 0x44, 0x3a, 0xac, 0xd2, 0xec, 0x40, 0xfb, 0x82, 0x40, 0x2a, 0x04, - 0x33, 0x5c, 0x8d, 0x37, 0xe8, 0x7c, 0xa2, 0xbb, 0xc1, 0x62, 0x25, 0x20, - 0x48, 0x7f, 0x14, 0x59, 0x94, 0xac, 0xa6, 0x5c, 0x98, 0x93, 0x9b, 0x56, - 0x80, 0x84, 0xbc, 0x25, 0x9c, 0x4a, 0x75, 0xfd, 0xb4, 0x13, 0x51, 0x8f, - 0x51, 0x34, 0xa7, 0x34, 0x18, 0x8b, 0x95, 0xeb, 0xef, 0x93, 0x42, 0x9c, - 0xd9, 0x3f, 0xec, 0xc8, 0xe0, 0x04, 0x7f, 0xd9, 0x94, 0xb3, 0x39, 0xf6, - 0x93, 0x78, 0xc4, 0x32, 0x32, 0xc2, 0x59, 0x1b, 0xf0, 0x38, 0xe7, 0x87, - 0x6b, 0xc5, 0xae, 0xa0, 0x29, 0x3e, 0xb7, 0x1a, 0xfc, 0xcd, 0xa9, 0x1d, - 0x45, 0xbf, 0xc8, 0x59, 0x45, 0x14, 0x12, 0xb2, 0x70, 0xce, 0xc3, 0x20, - 0x8c, 0x27, 0xc1, 0xbe, 0xfb, 0xb5, 0xc6, 0x7c, 0x01, 0x85, 0xa8, 0x04, - 0x6a, 0x1d, 0x80, 0xd3, 0x77, 0x18, 0x0f, 0x7f, 0x79, 0xd4, 0xa4, 0x77, - 0x85, 0xcd, 0xdc, 0x18, 0xc7, 0xff, 0xe4, 0xc7, 0x25, 0x04, 0x6a, 0x8e, - 0xbb, 0xfe, 0xd9, 0x09, 0x52, 0x13, 0xb2, 0x94, 0xe4, 0x27, 0x3a, 0x2c, - 0xf3, 0xde, 0x96, 0xae, 0x8c, 0xc2, 0x69, 0xe5, 0x86, 0x7a, 0x2c, 0xe4, - 0x62, 0xbc, 0xa3, 0xfb, 0x14, 0x83, 0x36, 0x13, 0xeb, 0x7e, 0xca, 0x87, - 0x3e, 0xb9, 0x59, 0x30, 0x1e, 0x09, 0x77, 0xb5, 0xe0, 0x08, 0x80, 0x1c, - 0x95, 0x5f, 0xce, 0x64, 0x6c, 0x62, 0x64, 0x0c, 0xc1, 0xe2, 0xac, 0x15, - 0x71, 0x3a, 0x15, 0xa9, 0x80, 0x17, 0x26, 0xe9, 0x28, 0x2d, 0x22, 0xe0, - 0x5d, 0xfc, 0x28, 0xe3, 0x40, 0x0f, 0x2c, 0x6c, 0x04, 0xe9, 0x0f, 0x8e, - 0xbe, 0x87, 0x93, 0xe4, 0x55, 0xcf, 0x97, 0xa6, 0xbc, 0xfd, 0xe0, 0x11, - 0xdc, 0xb3, 0x7f, 0x48, 0x32, 0x02, 0x96, 0x3a, 0xa0, 0xf4, 0xd3, 0xdf, - 0xbe, 0xa0, 0xef, 0xe0, 0x68, 0x29, 0x53, 0x77, 0x83, 0x41, 0x85, 0xfe, - 0xbd, 0x66, 0x38, 0xcf, 0x38, 0x37, 0x39, 0x74, 0x79, 0x7b, 0x3b, 0x5a, - 0x79, 0x3b, 0xc7, 0xf7, 0xa3, 0x01, 0xf7, 0xfe, 0xc0, 0xcd, 0xa1, 0x04, - 0x1a, 0xd1, 0x31, 0x7f, 0x30, 0xe3, 0xf4, 0x5a, 0x96, 0xe7, 0x2d, 0x91, - 0xe4, 0xfb, 0x66, 0xd6, 0x69, 0x89, 0x6c, 0x0c, 0x8f, 0xd2, 0xb3, 0x66, - 0xf9, 0xb4, 0xa4, 0x80, 0xd8, 0xaf, 0xb4, 0x70, 0x38, 0x90, 0xd9, 0xba, - 0x38, 0xef, 0xff, 0x45, 0x42, 0xc3, 0xe7, 0x39, 0x16, 0x9c, 0xaa, 0x20, - 0xf9, 0x5f, 0xf4, 0x88, 0x87, 0xed, 0x44, 0x14, 0x24, 0xf0, 0x30, 0xf1, - 0xdd, 0x69, 0x48, 0xf8, 0xf0, 0xfd, 0x9d, 0x22, 0x8d, 0x1b, 0xf2, 0x70, - 0x84, 0xde, 0xf5, 0x52, 0xd4, 0xd6, 0x20, 0x2b, 0x8c, 0xfe, 0x08, 0x7b, - 0xe2, 0xe5, 0xb7, 0xcd, 0x9b, 0x86, 0xf1, 0x27, 0xb6, 0x1e, 0xab, 0xe9, - 0xa4, 0x04, 0xcd, 0x3e, 0xe4, 0xa1, 0x1c, 0xe1, 0x2c, 0x19, 0xb6, 0x90, - 0x3b, 0x83, 0x5a, 0xb3, 0xae, 0x68, 0x6f, 0x11, 0x9f, 0x26, 0x58, 0x5c, - 0x80, 0xf4, 0x51, 0xfc, 0x79, 0xda, 0x11, 0x5e, 0x25, 0x50, 0x48, 0x73, - 0xe3, 0x3e, 0xc3, 0x18, 0xee, 0x35, 0x1b, 0xd9, 0xfe, 0x9d, 0xd0, 0xda, - 0xe1, 0x89, 0x90, 0x95, 0x44, 0xd0, 0xc5, 0xa0, 0x9f, 0xae, 0x78, 0x4e, - 0x0b, 0xa2, 0x49, 0x47, 0xbf, 0xf6, 0x03, 0x93, 0x41, 0x5c, 0xb0, 0x10, - 0xf4, 0x87, 0x7f, 0x22, 0x3b, 0x69, 0x3b, 0x7c, 0x31, 0xae, 0x53, 0x37, - 0x84, 0x55, 0x26, 0x0e, 0xbd, 0x65, 0x91, 0x6d, 0xdd, 0x3a, 0x3d, 0xe1, - 0x49, 0xcb, 0x64, 0xbb, 0x82, 0x82, 0xdd, 0xb1, 0x66, 0x0e, 0x48, 0x36, - 0xf5, 0x92, 0xe5, 0x1c, 0x48, 0x97, 0x4e, 0x98, 0x13, 0x95, 0xb9, 0x34, - 0x77, 0xa7, 0x20, 0xc8, 0xa2, 0x05, 0x8f, 0x15, 0xdc, 0x9d, 0xae, 0xcb, - 0x5b, 0x37, 0x93, 0x75, 0xc1, 0x15, 0x8e, 0x69, 0x62, 0xb2, 0xd8, 0x0c, - 0x3f, 0x39, 0xf8, 0xc4, 0xfa, 0x1f, 0x67, 0x0e, 0x7c, 0xc8, 0xeb, 0x0c, - 0xa4, 0x9f, 0xda, 0x12, 0xe0, 0xd7, 0x85, 0x96, 0x8d, 0x41, 0x15, 0xcd, - 0x6b, 0x74, 0xd6, 0x36, 0x62, 0x2b, 0xd3, 0x37, 0xef, 0x69, 0xb6, 0x9d, - 0x67, 0xcd, 0xb6, 0x5b, 0x7f, 0x75, 0xbf, 0x46, 0xab, 0xb6, 0xe2, 0x21, - 0x01, 0x69, 0x25, 0x98, 0x59, 0x93, 0x7d, 0x4b, 0x28, 0xa6, 0x34, 0x4f, - 0x6a, 0x44, 0x01, 0x79, 0xbc, 0x66, 0x68, 0x9f, 0x45, 0x22, 0x45, 0xdd, - 0x1d, 0x66, 0xa8, 0x5c, 0xb6, 0x38, 0xae, 0xca, 0x26, 0x06, 0xea, 0xcb, - 0xb2, 0x3c, 0x31, 0x00, 0xc6, 0xda, 0x57, 0x77, 0xc5, 0xb9, 0x7f, 0x35, - 0xfa, 0x12, 0x8a, 0xa4, 0x56, 0xa0, 0x39, 0xec, 0xe3, 0xb8, 0x04, 0xd8, - 0xd3, 0x9e, 0x31, 0x69, 0x89, 0x25, 0x4f, 0x5c, 0xf9, 0x5a, 0x17, 0xc7, - 0xc1, 0xe9, 0xba, 0xa3, 0xe2, 0x61, 0x8a, 0xbb, 0x12, 0xca, 0xce, 0x71, - 0x37, 0xad, 0x20, 0x0a, 0x93, 0x94, 0x1a, 0x19, 0xd5, 0x99, 0x08, 0x88, - 0xfd, 0xe6, 0xb9, 0x61, 0xa1, 0x26, 0xfc, 0xff, 0xcb, 0x4b, 0xbb, 0x8a, - 0x9a, 0xee, 0x73, 0x27, 0x31, 0xac, 0x2d, 0x13, 0xde, 0x7f, 0x50, 0x41, - 0xc0, 0x9a, 0xcf, 0x4f, 0xc7, 0x61, 0xaa, 0x33, 0x7a, 0x0e, 0x7a, 0x29, - 0xa5, 0xc6, 0xe8, 0x94, 0xbc, 0x78, 0x28, 0x5e, 0xc3, 0x76, 0x11, 0xce, - 0x76, 0x5c, 0x04, 0x38, 0x74, 0x81, 0x4a, 0xee, 0x47, 0x68, 0xb3, 0x1b, - 0xda, 0x0b, 0x46, 0x39, 0xe4, 0x61, 0x4c, 0x9f, 0xa9, 0xfe, 0x5c, 0x42, - 0x9c, 0x97, 0x2c, 0x90, 0xcc, 0x46, 0xa3, 0xc5, 0xab, 0x21, 0x71, 0x88, - 0xd9, 0x7f, 0xfe, 0xda, 0xa4, 0xd4, 0xd5, 0x2e, 0x0d, 0x1c, 0x8f, 0xd8, - 0x7d, 0xf8, 0xbb, 0x06, 0xc5, 0x14, 0x8c, 0xb2, 0x12, 0x69, 0x96, 0xf4, - 0xcf, 0xfc, 0x08, 0x19, 0x39, 0x3b, 0x2b, 0x93, 0x66, 0x87, 0x2e, 0x75, - 0x14, 0xc2, 0xc5, 0x05, 0x92, 0xa0, 0x06, 0x1a, 0x11, 0x32, 0x7d, 0x2b, - 0x2b, 0x06, 0xc2, 0x84, 0xcc, 0x47, 0xb3, 0x7e, 0xce, 0x8f, 0x39, 0x66, - 0x83, 0xee, 0x47, 0x6c, 0x91, 0xb8, 0xdf, 0x36, 0x99, 0xa1, 0x79, 0x8b, - 0xa4, 0x05, 0xcc, 0x32, 0xeb, 0x4c, 0xb8, 0xa8, 0xcc, 0x26, 0x89, 0x6e, - 0x43, 0xbe, 0x09, 0x95, 0x9e, 0x7a, 0xcb, 0x7c, 0x17, 0x59, 0x64, 0xb3, - 0xb4, 0x25, 0x21, 0xe6, 0xcc, 0x80, 0xce, 0x26, 0x52, 0x64, 0xbc, 0x84, - 0x78, 0xc2, 0x9e, 0x9d, 0x5b, 0xb7, 0xb5, 0xbb, 0x6d, 0x3c, 0xd2, 0x97, - 0x25, 0x43, 0x37, 0x59, 0xe4, 0x25, 0xb3, 0x7f, 0xc0, 0x3f, 0x08, 0x28, - 0xb4, 0xf8, 0xe9, 0x73, 0xd7, 0x3a, 0x11, 0x78, 0xf4, 0xf7, 0xc8, 0xc1, - 0x9b, 0x97, 0xf5, 0xcf, 0x3c, 0x12, 0x05, 0xec, 0x24, 0xd0, 0xb1, 0x9c, - 0x9e, 0x8f, 0x01, 0x14, 0x30, 0x2f, 0x87, 0x9a, 0x47, 0x7c, 0xd5, 0xa5, - 0x4c, 0x48, 0x0e, 0x9e, 0xec, 0x5c, 0x5c, 0x4c, 0xa8, 0xe6, 0x91, 0xb5, - 0xbe, 0xb0, 0xde, 0x50, 0xdf, 0x8f, 0xce, 0xa5, 0x24, 0x15, 0x36, 0x13, - 0x9a, 0x8d, 0x1e, 0x8c, 0xa8, 0xd2, 0xce, 0x98, 0xf0, 0x69, 0x05, 0x1a, - 0x8f, 0x6a, 0xb6, 0x59, 0x18, 0x71, 0xa8, 0xe3, 0xf0, 0x1c, 0x91, 0xa6, - 0xcf, 0xac, 0x7b, 0xb8, 0xb1, 0x3f, 0xd0, 0x31, 0xec, 0xb6, 0x2d, 0xef, - 0x66, 0x4f, 0xa9, 0xe7, 0x95, 0x60, 0x4e, 0xd3, 0x64, 0xba, 0x3e, 0x8a, - 0x49, 0x6d, 0xe8, 0xf9, 0x0c, 0x52, 0x9f, 0x7a, 0x91, 0xfe, 0x3b, 0xd9, - 0xb7, 0x0e, 0x6c, 0x6e, 0x03, 0x42, 0x11, 0x56, 0xaf, 0xaa, 0x1e, 0x04, - 0xf9, 0x5d, 0x87, 0x92, 0xa9, 0x00, 0xa5, 0x9f, 0xe1, 0xd1, 0xc2, 0xfa, - 0x04, 0x07, 0x94, 0x5c, 0x48, 0xe5, 0x02, 0x93, 0x50, 0x3e, 0x9f, 0x59, - 0x7e, 0xc3, 0x9c, 0x9c, 0x02, 0xdc, 0xec, 0x78, 0x25, 0x8d, 0x8a, 0x6c, - 0x51, 0x56, 0x49, 0xaf, 0x20, 0xdb, 0x03, 0x50, 0x82, 0xf0, 0x02, 0x9d, - 0x42, 0xf6, 0x98, 0x70, 0x79, 0x76, 0x8c, 0x54, 0x90, 0x40, 0xca, 0xbe, - 0x24, 0x9f, 0x62, 0x2b, 0x2e, 0x45, 0x4e, 0x35, 0x0a, 0xe1, 0x9e, 0xb9, - 0x3b, 0xbf, 0x0a, 0x5d, 0xa7, 0xa4, 0xfe, 0x9a, 0x48, 0xf4, 0xac, 0xb8, - 0xe7, 0xe5, 0x73, 0x46, 0x33, 0xe2, 0x9e, 0xb9, 0xa9, 0x97, 0xbd, 0x75, - 0x97, 0xc7, 0x95, 0xbe, 0x7b, 0x2e, 0x22, 0x25, 0x30, 0xe0, 0xa6, 0x88, - 0x2e, 0x88, 0x25, 0x15, 0x48, 0x18, 0xf0, 0xfd, 0xc0, 0x4b, 0x82, 0x75, - 0x76, 0x93, 0xc4, 0xdb, 0xb2, 0x23, 0x28, 0xa1, 0xdb, 0xc3, 0x57, 0xb1, - 0xb8, 0x9b, 0xba, 0xaf, 0xeb, 0xdb, 0xf6, 0xda, 0x74, 0x94, 0xe8, 0xec, - 0x59, 0xf8, 0x6d, 0xc4, 0x3e, 0xf6, 0x45, 0x57, 0x3c, 0x93, 0x92, 0x36, - 0x06, 0x7e, 0xe0, 0x14, 0xef, 0x5d, 0xf1, 0xd4, 0x06, 0x02, 0xa7, 0x22, - 0x45, 0xc0, 0xcd, 0x86, 0x52, 0x03, 0xa9, 0xd4, 0x01, 0x7f, 0xa6, 0x2f, - 0xa6, 0xea, 0x44, 0xe3, 0x5d, 0x9e, 0x7c, 0x2b, 0x0e, 0x55, 0xb3, 0x49, - 0xe5, 0x45, 0xa3, 0xf6, 0x5e, 0x71, 0xab, 0xe0, 0x8f, 0xa9, 0xd9, 0x2e, - 0x01, 0x42, 0x70, 0xaa, 0xfc, 0xfb, 0x58, 0x10, 0x57, 0x4f, 0xd1, 0x2c, - 0x1c, 0x30, 0xe7, 0x6c, 0x4b, 0x18, 0x40, 0x3e, 0x95, 0xa7, 0x4d, 0xa2, - 0xcb, 0x62, 0x92, 0x38, 0xfe, 0x5e, 0xa1, 0x10, 0x01, 0xe0, 0xa2, 0x31, - 0x88, 0x5e, 0x1f, 0x87, 0x43, 0x3a, 0x53, 0x52, 0x07, 0x01, 0xa3, 0xbd, - 0x0b, 0xc7, 0x85, 0xe8, 0x5f, 0x2a, 0x9b, 0xfd, 0xd3, 0xbe, 0x7d, 0x86, - 0x08, 0xfc, 0x78, 0xa6, 0x86, 0xef, 0x86, 0x42, 0x5b, 0xc6, 0xf5, 0x27, - 0x90, 0x88, 0xa4, 0xfe, 0x41, 0xdd, 0xd5, 0xc6, 0xa9, 0x38, 0x6d, 0x26, - 0xb8, 0xfd, 0x52, 0xf6, 0xcd, 0xd0, 0x9e, 0xd0, 0x7a, 0xd8, 0x5a, 0x13, - 0x37, 0xdc, 0xb8, 0x24, 0xf3, 0x38, 0x6d, 0x07, 0x2c, 0x65, 0x01, 0x1a, - 0x04, 0xc0, 0x5d, 0xab, 0x1e, 0xd0, 0x43, 0xc1, 0xb5, 0xd6, 0x7b, 0x0b, - 0x68, 0x14, 0x75, 0x93, 0x32, 0xa7, 0x87, 0x73, 0x95, 0x8c, 0x40, 0xf2, - 0x34, 0x26, 0x12, 0xe0, 0x9e, 0x1c, 0x3a, 0x4e, 0xe9, 0x23, 0x50, 0x56, - 0x1f, 0x31, 0xdb, 0x4a, 0x01, 0xa2, 0xde, 0xde, 0xa1, 0xb1, 0x7f, 0x2c, - 0xbd, 0x1b, 0x7e, 0x40, 0x72, 0x7c, 0x92, 0xd3, 0x9f, 0x86, 0x81, 0x94, - 0xc3, 0x58, 0x2c, 0xeb, 0xab, 0x90, 0x86, 0xdf, 0xd8, 0x04, 0x1c, 0xc1, - 0xea, 0x75, 0x5e, 0xaf, 0x48, 0xfa, 0x80, 0x5a, 0x60, 0x53, 0x91, 0xeb, - 0xa4, 0x10, 0x00, 0xa1, 0xd9, 0x20, 0x28, 0x85, 0x98, 0x2b, 0x6d, 0xc4, - 0x4c, 0xf3, 0x91, 0x8c, 0x40, 0xf5, 0xd5, 0x6b, 0x5a, 0x4e, 0x27, 0x9d, - 0x7e, 0x3e, 0xed, 0x66, 0x7d, 0x1b, 0xe4, 0xe7, 0x71, 0x3d, 0xe0, 0xce, - 0xd1, 0x36, 0x3a, 0xa1, 0x1a, 0x38, 0xbe, 0xd5, 0x97, 0x07, 0xcc, 0xd3, - 0xc8, 0x58, 0x0a, 0x24, 0x87, 0x67, 0x35, 0x9a, 0x17, 0xc2, 0x95, 0x63, - 0x83, 0xb0, 0x86, 0x95, 0x4e, 0x8b, 0x76, 0x16, 0x79, 0x26, 0x17, 0x1e, - 0xae, 0xb5, 0xd6, 0x67, 0x99, 0x95, 0x35, 0xe2, 0x01, 0x5e, 0x52, 0xe6, - 0x8d, 0xc8, 0x3b, 0x4c, 0x64, 0xd9, 0x80, 0xd6, 0x50, 0x3e, 0x7e, 0xd6, - 0x58, 0x28, 0xb7, 0xff, 0x3c, 0x7b, 0x53, 0xb1, 0x3c, 0xaf, 0x9d, 0x75, - 0xac, 0x8f, 0xd5, 0x7a, 0xf6, 0xd5, 0xc4, 0x5b, 0xf7, 0x0b, 0xa3, 0xe2, - 0xa7, 0x77, 0xc2, 0x4f, 0xf3, 0xc0, 0xf8, 0xba, 0x39, 0x5b, 0xa0, 0x10, - 0x43, 0xb9, 0x8d, 0xe7, 0x22, 0xb1, 0x28, 0x4e, 0x14, 0x7f, 0x0a, 0x92, - 0xec, 0xc2, 0xf4, 0xd6, 0x6a, 0x19, 0x9c, 0x0d, 0xc3, 0xc8, 0x8b, 0x2f, - 0xe3, 0x8a, 0xfa, 0x16, 0xc4, 0x27, 0x5c, 0xec, 0xd9, 0xe7, 0xf7, 0xed, - 0x40, 0x36, 0xd0, 0xf3, 0x23, 0xd6, 0x9d, 0x07, 0x47, 0x3e, 0xdc, 0xf7, - 0x25, 0xed, 0xdc, 0x5b, 0x8e, 0xc1, 0xf3, 0x8f, 0x82, 0x38, 0xb2, 0x09, - 0x4c, 0x09, 0x4f, 0xb5, 0xa1, 0x93, 0xa3, 0x68, 0x39, 0xe5, 0xdb, 0x08, - 0x3f, 0x58, 0x92, 0x79, 0x08, 0x8b, 0x6f, 0x1f, 0xb2, 0x04, 0x11, 0xd0, - 0x77, 0xe3, 0x33, 0x29, 0x74, 0x40, 0x75, 0x21, 0x10, 0xe0, 0xe3, 0xf4, - 0xad, 0xa5, 0x8a, 0x7c, 0xa4, 0x42, 0x9b, 0x24, 0x84, 0xb4, 0x80, 0x20, - 0xfc, 0x93, 0x13, 0x59, 0x98, 0x39, 0xc1, 0x08, 0xe4, 0x49, 0xf7, 0x55, - 0xb7, 0x91, 0xd3, 0xce, 0xb0, 0xc9, 0x39, 0xdc, 0x2a, 0x42, 0x56, 0xb3, - 0x90, 0x3e, 0x06, 0x91, 0xb1, 0xfb, 0x73, 0x2f, 0x9c, 0xca, 0x2a, 0x99, - 0x55, 0xe1, 0x5e, 0x99, 0x9a, 0xc0, 0xa8, 0x7b, 0xe4, 0x3f, 0x60, 0x5c, - 0xff, 0x07, 0x91, 0x42, 0x3b, 0xfb, 0xc9, 0xc3, 0x97, 0xe6, 0x04, 0x1b, - 0x5c, 0xf7, 0xb0, 0x16, 0xf5, 0x33, 0xfc, 0x6f, 0xd1, 0x3c, 0xd5, 0xf7, - 0x39, 0xaa, 0x35, 0x6c, 0x65, 0x65, 0x8b, 0x33, 0x97, 0xd5, 0x2b, 0x34, - 0xb8, 0xa9, 0x15, 0x20, 0xd7, 0x0d, 0x42, 0x82, 0x3b, 0xe6, 0x6b, 0x3e, - 0x78, 0x09, 0xb0, 0xb4, 0xec, 0xd8, 0x0c, 0x54, 0x26, 0x37, 0x8f, 0x63, - 0x89, 0x07, 0xb4, 0x6f, 0x1d, 0x6e, 0x57, 0x6a, 0x8c, 0xd3, 0x93, 0x09, - 0xdc, 0x30, 0x77, 0x54, 0x3d, 0xf7, 0x7a, 0xf2, 0x01, 0x90, 0x20, 0xe9, - 0x55, 0xe9, 0x6c, 0x17, 0xe9, 0x8d, 0xa2, 0x63, 0xd0, 0xa0, 0x18, 0x28, - 0xae, 0xc1, 0xe7, 0xfe, 0xd9, 0x42, 0x89, 0x3a, 0x15, 0x38, 0x23, 0xef, - 0xd7, 0x17, 0x83, 0x2d, 0x60, 0xb0, 0xe9, 0x88, 0x05, 0xc4, 0xdc, 0x98, - 0xf1, 0xfd, 0xc1, 0x7e, 0x11, 0xd5, 0x7b, 0xbe, 0x8b, 0x16, 0x47, 0x93, - 0x6e, 0xb7, 0xf4, 0xb1, 0xde, 0xe6, 0xfa, 0x1c, 0x60, 0xc0, 0xf7, 0xb5, - 0x41, 0xcd, 0x00, 0x46, 0x07, 0x89, 0xf3, 0x90, 0x95, 0x3a, 0x21, 0xda, - 0x2e, 0xcf, 0x66, 0xce, 0x76, 0x8a, 0x9c, 0x2c, 0xba, 0x8b, 0x03, 0x90, - 0x31, 0x29, 0xe3, 0x7d, 0xe4, 0x45, 0x39, 0x13, 0x37, 0x16, 0x65, 0xa1, - 0x9d, 0x22, 0xa3, 0x45, 0xc4, 0x23, 0x18, 0xa5, 0x0e, 0x02, 0x1e, 0x6c, - 0x7b, 0xfe, 0xb6, 0xc9, 0x0c, 0xbe, 0x79, 0x2e, 0x15, 0xca, 0xaf, 0x0c, - 0x1f, 0x77, 0xdd, 0xb1, 0x71, 0xca, 0xec, 0xf2, 0x0a, 0x61, 0x8f, 0xb5, - 0xe3, 0x0d, 0xdd, 0x91, 0x0a, 0x32, 0xe6, 0xf7, 0xca, 0xab, 0xd9, 0xe6, - 0x77, 0x44, 0x79, 0x1e, 0xf7, 0xc4, 0x53, 0xd8, 0x05, 0xd2, 0xea, 0xfc, - 0x02, 0x8e, 0x0c, 0xd3, 0x22, 0xb2, 0x65, 0xc0, 0xcd, 0x85, 0xa6, 0x3f, - 0xe8, 0x10, 0x13, 0x9c, 0xed, 0x19, 0x12, 0x05, 0x47, 0x57, 0x78, 0x5f, - 0xb5, 0x9a, 0xb6, 0xa4, 0xda, 0x7d, 0x81, 0xd9, 0x28, 0x42, 0x0f, 0xab, - 0x7d, 0x32, 0x22, 0x59, 0xcc, 0xae, 0x24, 0xae, 0x05, 0x54, 0x22, 0xf8, - 0xd9, 0x89, 0x37, 0xb3, 0x28, 0xfb, 0x8a, 0x0c, 0x14, 0x93, 0x3a, 0xba, - 0x4d, 0x77, 0xca, 0x1b, 0xf8, 0x76, 0x94, 0x81, 0x8b, 0xc0, 0xb6, 0xb4, - 0x7d, 0xe3, 0x21, 0x1e, 0x73, 0x9c, 0x22, 0x1f, 0xf0, 0xa6, 0xcc, 0x87, - 0xda, 0xd4, 0xc2, 0x3f, 0x1c, 0xef, 0xf1, 0xaf, 0x91, 0x00, 0x7e, 0x4a, - 0x5b, 0x9c, 0x75, 0x42, 0x42, 0xa9, 0xa2, 0x8f, 0x11, 0xc0, 0x87, 0xdf, - 0xc6, 0x73, 0xd9, 0xd7, 0xad, 0x30, 0x29, 0x69, 0x53, 0xcf, 0x88, 0x1e, - 0x90, 0x4c, 0x72, 0x32, 0xe4, 0xcf, 0x10, 0xb7, 0xda, 0x20, 0xa9, 0x74, - 0x8a, 0x0e, 0x35, 0x0a, 0xd4, 0x52, 0xe8, 0xfa, 0x5b, 0x58, 0xfc, 0xc2, - 0x95, 0x17, 0x68, 0x73, 0x1e, 0xeb, 0x16, 0x3f, 0xbf, 0x74, 0xe4, 0xe2, - 0x50, 0xe6, 0x13, 0x52, 0xf0, 0x7d, 0xda, 0xc9, 0xae, 0xa0, 0x02, 0x32, - 0x73, 0xcc, 0xbf, 0xa7, 0x8c, 0x14, 0x1a, 0xe9, 0xea, 0x7e, 0xd7, 0xdb, - 0x9d, 0x1b, 0xa7, 0x86, 0x0e, 0xa4, 0x09, 0x7b, 0xb8, 0x84, 0xa6, 0x90, - 0xee, 0x33, 0xd7, 0x54, 0xfc, 0xaa, 0x14, 0xe3, 0x87, 0xb6, 0x03, 0xb1, - 0xc1, 0x75, 0x84, 0x06, 0xf9, 0x52, 0x1b, 0xd6, 0xf7, 0x28, 0x80, 0x87, - 0xf0, 0x17, 0x67, 0xff, 0xac, 0xe0, 0x1d, 0x55, 0x52, 0xd0, 0x1c, 0x82, - 0xcc, 0x0f, 0xe5, 0x97, 0x6a, 0xda, 0xae, 0x6e, 0x71, 0x88, 0x83, 0x62, - 0xac, 0xf5, 0xa7, 0xa0, 0x1b, 0x73, 0xab, 0x91, 0x75, 0x69, 0x1f, 0x6b, - 0x4a, 0x7f, 0x6e, 0xfd, 0x1d, 0xa6, 0xdb, 0x50, 0x83, 0x61, 0xb1, 0xd4, - 0xbf, 0xcc, 0x08, 0xcc, 0x1b, 0x09, 0x8c, 0x1e, 0x95, 0xa1, 0xb6, 0xaf, - 0x7b, 0x48, 0x1a, 0x1f, 0xe1, 0x2e, 0x73, 0x9f, 0x82, 0xe6, 0x88, 0x6d, - 0x4f, 0x2a, 0x73, 0x95, 0xd9, 0x1c, 0x3d, 0xf0, 0x7e, 0xe5, 0xca, 0xb7, - 0x99, 0x19, 0x6c, 0xff, 0x2e, 0x7b, 0x68, 0x28, 0x69, 0xe8, 0xe1, 0x6a, - 0xa8, 0xd3, 0x58, 0xc7, 0xc4, 0xa4, 0x7a, 0x19, 0x50, 0x98, 0xaa, 0x2a, - 0x1d, 0xef, 0xe1, 0x16, 0x7c, 0xd4, 0x35, 0x05, 0xc9, 0x67, 0xb2, 0x81, - 0x76, 0xf5, 0x78, 0x58, 0x1e, 0xd3, 0x4b, 0x18, 0xca, 0x6b, 0x32, 0x6a, - 0xb1, 0x45, 0xa0, 0xf4, 0xa3, 0x01, 0x4b, 0xf3, 0xc4, 0x7a, 0xa0, 0x5b, - 0x8b, 0x72, 0x15, 0x87, 0xee, 0x5d, 0x32, 0x49, 0x58, 0x20, 0xb5, 0xf9, - 0x54, 0x4b, 0x0b, 0x47, 0x3f, 0xc5, 0x91, 0xa1, 0x9d, 0xa7, 0xe1, 0xb1, - 0xe2, 0x9f, 0x0c, 0xb3, 0xcf, 0x97, 0x88, 0x8e, 0x65, 0x3a, 0xdf, 0x6e, - 0xb2, 0x36, 0xd5, 0xe3, 0xe3, 0xa8, 0xb7, 0x0a, 0x45, 0x58, 0xf2, 0xaf, - 0xd9, 0x7f, 0xb2, 0x0f, 0x6a, 0xd9, 0x89, 0x9d, 0x1b, 0x6c, 0x1d, 0xf0, - 0xec, 0xe6, 0x58, 0xb5, 0x2a, 0xbd, 0x3a, 0x89, 0x6a, 0x58, 0xee, 0xa3, - 0xa5, 0x06, 0xf2, 0x32, 0x00, 0x7e, 0x0e, 0x9d, 0x26, 0xf3, 0xca, 0xfc, - 0xc6, 0x8a, 0xe8, 0xd0, 0x4d, 0x25, 0x83, 0x4b, 0xe1, 0x2c, 0xde, 0x34, - 0x4f, 0xa5, 0x8a, 0x4a, 0x1b, 0x31, 0x99, 0xb4, 0x9f, 0xe8, 0x6c, 0x29, - 0x8c, 0x39, 0xa0, 0x07, 0xb1, 0x06, 0x18, 0x25, 0xcc, 0x6a, 0x15, 0xff, - 0x94, 0x70, 0x2f, 0x0f, 0x49, 0xf3, 0xdf, 0x76, 0x70, 0x0e, 0x89, 0x3d, - 0xb5, 0x01, 0x6a, 0x50, 0xe8, 0x5d, 0xfe, 0xb3, 0x27, 0x87, 0x61, 0x27, - 0xc7, 0x73, 0x39, 0x1e, 0xb8, 0x9b, 0xdb, 0x89, 0x05, 0xf5, 0x07, 0x3c, - 0x5e, 0x32, 0x3e, 0x2c, 0x03, 0x6f, 0x2f, 0x30, 0xad, 0x17, 0x16, 0xb5, - 0x14, 0xc8, 0x81, 0x9e, 0xf3, 0x67, 0xae, 0xa6, 0x5b, 0x21, 0xfa, 0x3d, - 0xcd, 0xcc, 0x24, 0x8f, 0xa5, 0xc9, 0x60, 0x9d, 0x82, 0xee, 0x74, 0xc2, - 0x7c, 0xdb, 0xf6, 0x26, 0x51, 0x80, 0xe8, 0x5a, 0x07, 0x3c, 0x8c, 0x43, - 0x66, 0xb9, 0xba, 0x4b, 0x47, 0xca, 0xd2, 0x70, 0x3e, 0xe6, 0x88, 0x12, - 0xba, 0x91, 0x3e, 0x84, 0xb0, 0xc4, 0x22, 0x87, 0x52, 0x9a, 0xd6, 0x2c, - 0x35, 0x00, 0xd5, 0xc2, 0x9a, 0x20, 0x2a, 0xcb, 0x52, 0xc9, 0x49, 0xe0, - 0x31, 0xb7, 0xd3, 0x1b, 0x4f, 0x0c, 0x23, 0x67, 0xd2, 0xbd, 0x8a, 0xc9, - 0xb4, 0x47, 0x26, 0x8e, 0xaa, 0xd9, 0x32, 0x50, 0xb5, 0x61, 0x7e, 0x98, - 0xd1, 0x9e, 0x5e, 0x0f, 0x92, 0xb5, 0x31, 0x77, 0x8c, 0x6d, 0xba, 0x11, - 0xb1, 0x15, 0x8e, 0xb5, 0x53, 0xf0, 0xe0, 0x10, 0xbf, 0xac, 0x14, 0x6f, - 0x25, 0x6f, 0x9d, 0x7e, 0x8a, 0x49, 0xe4, 0xf2, 0x13, 0x28, 0xdd, 0x75, - 0xd2, 0xa5, 0x17, 0xf9, 0xa9, 0xec, 0xcf, 0x51, 0x02, 0x30, 0xed, 0x25, - 0xab, 0xe2, 0x2a, 0xd2, 0x30, 0x8b, 0x24, 0x48, 0x35, 0x46, 0x00, 0xb2, - 0x37, 0xfe, 0x40, 0xea, 0xbd, 0x0a, 0xe3, 0x68, 0x07, 0xa4, 0x6c, 0xb7, - 0xcd, 0x32, 0x69, 0x85, 0xee, 0xe8, 0x9a, 0x8e, 0x7e, 0x05, 0xe1, 0xb2, - 0x81, 0xb1, 0x0d, 0x0b, 0xa2, 0xff, 0x9b, 0xe2, 0x61, 0x2d, 0xef, 0x15, - 0xbb, 0x80, 0x5b, 0xf5, 0xe2, 0xf7, 0xf2, 0x69, 0xb6, 0x10, 0x67, 0x99, - 0x6d, 0x14, 0x12, 0xf7, 0xf3, 0x3f, 0x49, 0x45, 0x28, 0x41, 0x74, 0xd4, - 0xb8, 0x84, 0x65, 0xeb, 0x76, 0x57, 0x1a, 0x0a, 0x0b, 0x69, 0xb3, 0x6a, - 0x92, 0x46, 0xd2, 0x0a, 0x9d, 0x8c, 0xe6, 0x88, 0x38, 0x0a, 0xa1, 0xcf, - 0xc6, 0xeb, 0xe8, 0xdf, 0x98, 0xa5, 0x6f, 0x6d, 0x72, 0x7e, 0xda, 0xdc, - 0x20, 0x6e, 0xb9, 0xdc, 0x48, 0x0a, 0xb9, 0x4f, 0x96, 0xf1, 0xb1, 0x88, - 0xb2, 0xc1, 0x01, 0xee, 0xf7, 0xbe, 0x46, 0xb9, 0xcb, 0x52, 0xfd, 0x52, - 0x64, 0xd9, 0x6f, 0x46, 0xc4, 0x4c, 0x5f, 0x21, 0x5e, 0x16, 0xa9, 0xfe, - 0x55, 0x73, 0xf5, 0xda, 0x92, 0x66, 0x42, 0xdf, 0x75, 0x64, 0xa4, 0x80, - 0x33, 0x65, 0x9f, 0x2f, 0xcd, 0x56, 0xae, 0x3d, 0x94, 0x44, 0xa6, 0x90, - 0x63, 0xfa, 0xe5, 0xbb, 0xfe, 0xc4, 0xa9, 0xc0, 0xc8, 0xf5, 0x2b, 0x9a, - 0xea, 0x9d, 0x6e, 0x3b, 0x90, 0x20, 0x95, 0x78, 0xf1, 0x23, 0x01, 0xa3, - 0x54, 0x8b, 0x7f, 0x3c, 0xe1, 0x71, 0x9a, 0xfc, 0x15, 0x35, 0xbe, 0xb4, - 0x54, 0x16, 0x94, 0xf2, 0x10, 0x0b, 0x12, 0x38, 0x3c, 0x47, 0xd9, 0x23, - 0x1f, 0xbc, 0x0b, 0x4b, 0xc9, 0x25, 0xb4, 0x5a, 0xca, 0xe7, 0xb6, 0x2f, - 0x63, 0x1f, 0xaf, 0x21, 0xd5, 0x80, 0x06, 0xfd, 0xa2, 0x41, 0xb0, 0x65, - 0xb7, 0xda, 0x94, 0x7c, 0x49, 0x6d, 0x26, 0xc6, 0x2d, 0x68, 0x05, 0x30, - 0x9c, 0x8e, 0x7b, 0xa1, 0x4c, 0xb0, 0x3a, 0xf0, 0x4a, 0x90, 0x97, 0x39, - 0xbf, 0x2d, 0xcd, 0x0c, 0x3f, 0x25, 0x6e, 0xba, 0x6d, 0x63, 0x47, 0xd9, - 0x36, 0xd5, 0x86, 0xfb, 0xe8, 0xdb, 0x26, 0x7b, 0x61, 0xdd, 0xa5, 0xd3, - 0x50, 0x43, 0x6d, 0xf0, 0x59, 0x56, 0x72, 0x9f, 0x0b, 0xb8, 0xee, 0x9f, - 0x90, 0x60, 0xd5, 0x32, 0x52, 0xe9, 0x29, 0x61, 0xd4, 0x7f, 0xf2, 0xa5, - 0x64, 0xb0, 0xb3, 0x28, 0x02, 0x04, 0x42, 0xf3, 0x57, 0xb3, 0x98, 0x7a, - 0xb3, 0x8f, 0x08, 0xfd, 0xd4, 0x9d, 0xa6, 0x04, 0x7f, 0x89, 0x79, 0x4c, - 0x2d, 0x51, 0x3d, 0xa4, 0xfd, 0xc0, 0x89, 0x5e, 0x1b, 0xd3, 0x66, 0x90, - 0x3a, 0xd3, 0xa1, 0x54, 0xd4, 0x17, 0xa2, 0xf6, 0x7d, 0x2a, 0xed, 0x21, - 0x77, 0xd4, 0xfa, 0x1d, 0x58, 0x03, 0x54, 0xd2, 0x45, 0xae, 0xe0, 0xc7, - 0xe4, 0xb3, 0x67, 0xe2, 0x2b, 0xd0, 0x20, 0x72, 0xa9, 0x74, 0xb8, 0x03, - 0xcd, 0x72, 0x24, 0xdb, 0x0b, 0xfa, 0x78, 0x44, 0xd0, 0x18, 0xa5, 0x27, - 0x84, 0xce, 0xc9, 0xc9, 0xf4, 0xef, 0x82, 0xd8, 0x12, 0x2d, 0x6c, 0xa8, - 0x5a, 0xf6, 0xc2, 0x12, 0x95, 0x5e, 0xdd, 0x7e, 0xb2, 0x58, 0xe0, 0x8b, - 0xeb, 0xef, 0xa1, 0x47, 0x08, 0x79, 0xe2, 0x1e, 0x5a, 0x90, 0x7e, 0xa7, - 0x2c, 0xb7, 0xbd, 0x79, 0x82, 0xd4, 0x5d, 0xe9, 0x44, 0xe1, 0xb2, 0xe7, - 0xcd, 0xe1, 0xc4, 0xa0, 0x63, 0x7d, 0xf9, 0xb6, 0x6f, 0x4b, 0x4c, 0xd1, - 0xd6, 0x22, 0x49, 0x2b, 0x46, 0x2b, 0x8d, 0x64, 0x55, 0x15, 0xc1, 0xd6, - 0xe0, 0xac, 0x2d, 0x75, 0x3c, 0xd4, 0x06, 0x6e, 0x59, 0x1a, 0x88, 0x68, - 0x51, 0xe0, 0x02, 0xdf, 0x2d, 0x2e, 0x9f, 0xec, 0x36, 0x8a, 0x58, 0xc9, - 0x44, 0x89, 0x3a, 0xc7, 0x03, 0xb4, 0xe4, 0x1c, 0xf6, 0x91, 0x98, 0xe6, - 0x3a, 0xe7, 0x58, 0x6a, 0xfe, 0x3f, 0x3c, 0xcb, 0x1b, 0x74, 0xc7, 0x02, - 0x84, 0xd3, 0x11, 0xce, 0x0c, 0x9a, 0x43, 0x14, 0xb4, 0x6b, 0x2e, 0xc7, - 0x53, 0xdb, 0x19, 0x6d, 0xa8, 0x78, 0x36, 0x22, 0x65, 0xe2, 0x79, 0x06, - 0x02, 0xfa, 0xe0, 0x2f, 0x43, 0xb3, 0x3c, 0xf4, 0xcd, 0x1c, 0x4f, 0xad, - 0xe9, 0xd3, 0x57, 0x73, 0xad, 0x1d, 0x7c, 0xe0, 0x73, 0xf8, 0xf2, 0x09, - 0x51, 0x9c, 0x10, 0x97, 0xea, 0xba, 0x62, 0x74, 0xa0, 0x5c, 0xc0, 0x8c, - 0x3a, 0x52, 0xfd, 0x85, 0x0d, 0x12, 0x12, 0x23, 0xab, 0x4d, 0x5e, 0xfe, - 0x24, 0x84, 0x7d, 0xbe, 0x05, 0xf9, 0x7a, 0x35, 0xed, 0x1e, 0xf7, 0x3d, - 0x22, 0xe7, 0x1a, 0xa1, 0x92, 0xa1, 0xe2, 0x06, 0xe0, 0xf2, 0x18, 0xdf, - 0x90, 0x0c, 0x08, 0xad, 0xd0, 0xd8, 0xc0, 0x46, 0x82, 0x66, 0x75, 0x5a, - 0x4f, 0x90, 0xb6, 0x1e, 0x3f, 0x1d, 0x10, 0xff, 0x80, 0xf8, 0xa9, 0x34, - 0x7e, 0x71, 0x44, 0x21, 0xf2, 0xf4, 0xdf, 0xa5, 0x44, 0x1b, 0x73, 0x38, - 0xc0, 0xc6, 0xf0, 0x81, 0x94, 0x53, 0x31, 0xda, 0xe8, 0x11, 0xda, 0xab, - 0x88, 0x9c, 0x53, 0xb1, 0xdb, 0x83, 0xff, 0x8d, 0x17, 0xc0, 0x9f, 0x21, - 0x1c, 0xeb, 0xe7, 0x0e, 0x84, 0x84, 0x59, 0x06, 0x03, 0x00, 0xa9, 0x57, - 0x51, 0x12, 0xd6, 0x0c, 0xde, 0xe5, 0x11, 0x6d, 0x74, 0x42, 0x73, 0xcd, - 0x6c, 0xf0, 0xc1, 0x01, 0xd0, 0x84, 0x3c, 0xad, 0x01, 0xb5, 0xdc, 0xfb, - 0x82, 0x66, 0x49, 0xd2, 0xf5, 0xdd, 0x45, 0x67, 0x01, 0x2c, 0xf4, 0x50, - 0x1c, 0x76, 0xeb, 0xc8, 0x81, 0x27, 0xde, 0xf5, 0x13, 0x6b, 0x9f, 0x4e, - 0x05, 0x86, 0x74, 0xe2, 0x74, 0xc6, 0x2a, 0xc7, 0x22, 0x1e, 0x93, 0x18, - 0x98, 0x11, 0x4f, 0x96, 0xf3, 0x53, 0xfd, 0xe7, 0x57, 0x92, 0x90, 0x1a, - 0xad, 0x15, 0x75, 0xc4, 0x25, 0x75, 0x06, 0x7a, 0x75, 0x53, 0x18, 0xa6, - 0xc1, 0x9b, 0x51, 0x70, 0xb9, 0xde, 0x20, 0x41, 0x86, 0x14, 0x3e, 0xf7, - 0x0f, 0x60, 0xee, 0xfd, 0x3c, 0xf2, 0xd5, 0x3e, 0x68, 0x71, 0xf9, 0x8c, - 0xa0, 0x65, 0x9c, 0x95, 0x0a, 0xe7, 0x9c, 0xcb, 0xd7, 0x97, 0x12, 0x3a, - 0x0a, 0xc2, 0x77, 0x61, 0x92, 0xb2, 0x9e, 0x0a, 0xed, 0x30, 0x3d, 0x5e, - 0x68, 0xc1, 0x8a, 0x85, 0xe6, 0xc3, 0xad, 0x75, 0xaf, 0x57, 0x3d, 0x27, - 0x8b, 0xa4, 0xc1, 0x18, 0x69, 0xbe, 0x9f, 0x63, 0xa5, 0x5e, 0x63, 0xa3, - 0x59, 0x76, 0xa6, 0xb3, 0x7a, 0x6d, 0x40, 0x02, 0xbd, 0xb2, 0x6d, 0xf5, - 0xbf, 0x9d, 0xe6, 0xca, 0x21, 0x7e, 0x4f, 0xd2, 0x03, 0x98, 0x34, 0xd0, - 0x0b, 0x6c, 0x75, 0xc4, 0xa4, 0xcb, 0x0e, 0xe0, 0x56, 0xe6, 0xf1, 0xbb, - 0xb2, 0xba, 0x19, 0xc7, 0x0f, 0x0f, 0xe6, 0x58, 0xaa, 0x3b, 0x58, 0xd6, - 0xa7, 0x1e, 0x31, 0x86, 0x7d, 0x9a, 0xf8, 0xf7, 0xcf, 0x05, 0x97, 0xd2, - 0x09, 0x4e, 0x1b, 0xd9, 0x7f, 0xe6, 0x09, 0xac, 0xb8, 0x1c, 0xb3, 0xb1, - 0x98, 0x74, 0xd6, 0x62, 0xdb, 0xe9, 0x3d, 0xc2, 0x4a, 0x08, 0x9c, 0x8f, - 0x22, 0xa7, 0xb2, 0xd6, 0x3b, 0xa3, 0xec, 0x42, 0x3c, 0x30, 0x76, 0x81, - 0x25, 0xa1, 0x17, 0x78, 0x1b, 0xf5, 0xb5, 0x57, 0xe7, 0x26, 0x15, 0x46, - 0xf4, 0xbc, 0x52, 0x39, 0x16, 0x5f, 0xff, 0x5a, 0x0f, 0x22, 0xc4, 0x4a, - 0xda, 0xdd, 0xea, 0x44, 0x3b, 0x61, 0x86, 0xb1, 0xf4, 0xc0, 0xeb, 0x61, - 0xcd, 0x42, 0x7a, 0x63, 0x4a, 0x5d, 0xf9, 0x46, 0xf0, 0x42, 0x60, 0x50, - 0x5a, 0xe6, 0xaa, 0x07, 0x4b, 0xca, 0x0d, 0x36, 0xbf, 0x53, 0x39, 0xbf, - 0x0f, 0x9e, 0x21, 0xab, 0xab, 0x6c, 0x91, 0xa4, 0x8a, 0x10, 0x19, 0xed, - 0x4b, 0x0b, 0x7f, 0x4e, 0x34, 0x32, 0xcf, 0xa5, 0x1f, 0xcd, 0x0e, 0x2e, - 0x24, 0x27, 0xd9, 0xb3, 0x10, 0xeb, 0xc8, 0xba, 0x70, 0xf1, 0x28, 0x44, - 0x0d, 0x66, 0x2b, 0xc9, 0xe1, 0x06, 0xff, 0xfb, 0x4a, 0x64, 0x1f, 0xd6, - 0x37, 0x71, 0xe8, 0xae, 0x8d, 0x72, 0xfa, 0x01, 0x06, 0xeb, 0x2d, 0x20, - 0x25, 0x5b, 0x18, 0x75, 0x7e, 0x99, 0x70, 0x66, 0xaa, 0xc7, 0xc6, 0x96, - 0xc5, 0x13, 0x63, 0x0c, 0x99, 0xdd, 0xf9, 0x81, 0xae, 0x38, 0xae, 0xad, - 0x6a, 0xfa, 0x7b, 0xec, 0x81, 0xc7, 0x14, 0xab, 0xb7, 0x63, 0x55, 0x3f, - 0x44, 0x03, 0x5c, 0xc8, 0xa3, 0x56, 0x96, 0x09, 0xbc, 0x9b, 0xc7, 0x86, - 0xd7, 0x8c, 0x7b, 0xf8, 0x91, 0x3b, 0xf0, 0x69, 0x5a, 0xbf, 0xe3, 0xc9, - 0x0d, 0x59, 0x4a, 0x0f, 0x30, 0x39, 0x22, 0x7e, 0xc8, 0x9c, 0xe5, 0x8a, - 0xbb, 0x09, 0xea, 0xb1, 0xeb, 0xaf, 0x9b, 0x17, 0xe9, 0x3b, 0x01, 0x9f, - 0x86, 0x8d, 0xa2, 0xa5, 0x5a, 0x3d, 0x1d, 0x50, 0x5c, 0x00, 0xa2, 0x73, - 0x6f, 0x74, 0xbd, 0x3f, 0x0f, 0xbe, 0x3f, 0xa9, 0x6e, 0x0f, 0x58, 0x13, - 0xf0, 0x2d, 0xe4, 0x73, 0xf1, 0x8c, 0x4f, 0x7d, 0x58, 0xbf, 0x6f, 0xdc, - 0x1e, 0xbe, 0xfd, 0x92, 0xd6, 0x37, 0x77, 0xf0, 0xc8, 0x91, 0x16, 0x00, - 0x18, 0x31, 0xa6, 0x02, 0x38, 0xe6, 0xd9, 0x47, 0x89, 0x99, 0x63, 0xe3, - 0x2f, 0x26, 0xa5, 0x38, 0xeb, 0x24, 0x26, 0x26, 0x55, 0xd4, 0x71, 0x1e, - 0xab, 0xe8, 0x3e, 0x92, 0x46, 0x13, 0xa3, 0x5a, 0x7f, 0x34, 0xe6, 0x4d, - 0xe5, 0x93, 0xca, 0xfd, 0xfc, 0xc7, 0xff, 0xde, 0x6c, 0x81, 0xc7, 0xcd, - 0x45, 0x17, 0x77, 0x3e, 0x9b, 0x59, 0x97, 0x2b, 0x98, 0xd6, 0xa3, 0xde, - 0x28, 0xea, 0xf0, 0x7c, 0xc2, 0x75, 0x99, 0x94, 0x09, 0x50, 0x29, 0x9d, - 0xe2, 0x02, 0x84, 0x3b, 0x7e, 0x74, 0x00, 0x38, 0x9c, 0x31, 0x1d, 0x37, - 0x64, 0x39, 0x0c, 0xb6, 0xb3, 0xd6, 0x1b, 0x76, 0x26, 0xe0, 0xa7, 0x14, - 0xf6, 0x11, 0x97, 0x46, 0x92, 0x46, 0x54, 0x36, 0x4a, 0xe4, 0xc2, 0x2c, - 0x89, 0xe6, 0x95, 0x16, 0x57, 0x34, 0x36, 0x57, 0x2b, 0xf5, 0x45, 0xda, - 0x3d, 0x1e, 0x07, 0xbf, 0x05, 0x49, 0xb2, 0xea, 0x53, 0x18, 0xec, 0xd0, - 0x34, 0xaa, 0x23, 0x44, 0x8a, 0x06, 0x06, 0x21, 0x4d, 0x8b, 0x46, 0x29, - 0x44, 0x5d, 0xea, 0x3c, 0x0e, 0xe4, 0x83, 0x4a, 0xf3, 0x04, 0x4a, 0xa8, - 0x30, 0xe6, 0x72, 0x5f, 0x5b, 0x4b, 0xfc, 0xb3, 0xbd, 0xc7, 0x01, 0xef, - 0x3a, 0xad, 0xa9, 0x33, 0x3d, 0x7d, 0xbb, 0x44, 0xf4, 0x44, 0x98, 0x4a, - 0xe8, 0xf1, 0x7b, 0xe1, 0x57, 0x30, 0xdb, 0xfe, 0x74, 0xfa, 0x8d, 0x43, - 0xfc, 0xa0, 0x60, 0x57, 0x28, 0x82, 0x90, 0x3c, 0x55, 0xd9, 0x14, 0x23, - 0x03, 0x62, 0xcc, 0x56, 0x90, 0x10, 0x18, 0x67, 0x46, 0xe3, 0xe8, 0x8e, - 0xfe, 0x69, 0xb5, 0x89, 0x34, 0x8c, 0x88, 0x68, 0xd0, 0xe5, 0xfd, 0x02, - 0xf4, 0x43, 0xfb, 0xa9, 0xad, 0xeb, 0xf3, 0x7e, 0xa2, 0x5b, 0x64, 0xcc, - 0x63, 0xe2, 0x5f, 0x24, 0x72, 0xed, 0x4b, 0xa2, 0x17, 0x92, 0xd2, 0xf3, - 0xe6, 0x1a, 0x6f, 0xef, 0x3a, 0xff, 0x7a, 0xe7, 0x2b, 0x5d, 0xd6, 0xf6, - 0xcb, 0x1e, 0xac, 0xda, 0xaa, 0x69, 0xa7, 0x5e, 0x6f, 0xbd, 0x05, 0x9d, - 0x7a, 0xec, 0x7a, 0x77, 0xa1, 0x01, 0x17, 0xd1, 0x3d, 0xd1, 0x17, 0xaa, - 0x4e, 0x35, 0x90, 0x92, 0x7a, 0x0b, 0xfb, 0x67, 0xca, 0xc7, 0xc8, 0xf8, - 0x78, 0x21, 0x97, 0xec, 0x09, 0x4c, 0x96, 0x83, 0x27, 0x4c, 0x78, 0x0c, - 0x37, 0x48, 0xdd, 0x40, 0x82, 0x22, 0x2f, 0x6e, 0x62, 0x4d, 0xef, 0x5d, - 0x8b, 0x3c, 0x84, 0x7b, 0xd9, 0xa1, 0x88, 0x3f, 0x68, 0xb5, 0x9b, 0x92, - 0xba, 0x5b, 0x7a, 0x0f, 0x3b, 0xf6, 0xdf, 0xcc, 0x70, 0xca, 0x8d, 0xf5, - 0x41, 0xbb, 0x74, 0xd2, 0x1a, 0xf9, 0x92, 0x76, 0xa8, 0x2b, 0xb5, 0x87, - 0xea, 0xdb, 0x38, 0x8a, 0x8b, 0x5d, 0x7e, 0x38, 0x51, 0xb3, 0xde, 0xd7, - 0x18, 0xeb, 0x33, 0x67, 0xc5, 0x55, 0x37, 0x0c, 0xdd, 0x47, 0x6e, 0x7d, - 0xfd, 0x5f, 0x24, 0xe8, 0x6d, 0x67, 0x35, 0xba, 0x4e, 0x77, 0x2a, 0xd7, - 0x7a, 0xa5, 0xfa, 0xfb, 0x03, 0xf0, 0xbf, 0x3c, 0xfb, 0xf2, 0x2a, 0x64, - 0x38, 0xb1, 0x5b, 0x9f, 0xad, 0xdf, 0xdf, 0xf2, 0x02, 0x2c, 0xe0, 0xc5, - 0x91, 0x74, 0x3d, 0x17, 0x1d, 0xfd, 0xb8, 0x18, 0x4a, 0xa4, 0xf1, 0xfc, - 0x87, 0x69, 0xec, 0x17, 0x71, 0xa8, 0x84, 0xdf, 0xb9, 0xcf, 0x66, 0x5e, - 0xc6, 0x08, 0xbf, 0xdb, 0x19, 0xbd, 0x51, 0xe0, 0x43, 0x1f, 0x0d, 0x2c, - 0x4f, 0xb1, 0x50, 0x91, 0x28, 0xfa, 0x4e, 0x8b, 0x61, 0x73, 0xf2, 0x4c, - 0xc5, 0xf9, 0x88, 0x83, 0x07, 0x7d, 0x78, 0x3b, 0x17, 0xdc, 0xe8, 0x0d, - 0xba, 0x40, 0x9b, 0x77, 0xd5, 0x12, 0x60, 0xfe, 0x42, 0xb0, 0x32, 0xd6, - 0xcf, 0x5d, 0x1c, 0x0b, 0x5d, 0xe8, 0x28, 0x7a, 0x81, 0x56, 0xbb, 0x7a, - 0xef, 0x14, 0x6a, 0x8d, 0x93, 0x16, 0x36, 0x97, 0x2d, 0xe1, 0x4d, 0xfb, - 0xb5, 0xe0, 0x7f, 0xf9, 0xb7, 0xef, 0x76, 0xc0, 0x91, 0xb8, 0x56, 0xbd, - 0x7b, 0x0f, 0xac, 0x61, 0xdb, 0xae, 0x83, 0x05, 0x27, 0x57, 0x0e, 0x55, - 0xd6, 0x19, 0x87, 0xb8, 0x08, 0x8f, 0xdf, 0xe1, 0xc0, 0xc1, 0x41, 0xfd, - 0x35, 0x0f, 0x7b, 0x65, 0x8f, 0x25, 0xc9, 0xe2, 0x29, 0xa4, 0xaa, 0xc9, - 0x25, 0xd6, 0xfe, 0x65, 0x4b, 0x17, 0xd3, 0x4a, 0xb2, 0x09, 0x8d, 0xdf, - 0x51, 0xa5, 0x78, 0x8e, 0x17, 0xa2, 0xef, 0x74, 0x34, 0xe3, 0xd6, 0x8a, - 0x0e, 0x45, 0x85, 0x1f, 0xf6, 0x16, 0x77, 0x21, 0xe5, 0x92, 0x70, 0x42, - 0xa9, 0x3f, 0x86, 0xda, 0x94, 0xcd, 0xb0, 0x8c, 0xa5, 0x84, 0x55, 0x02, - 0x5c, 0x71, 0x22, 0x01, 0xb8, 0x11, 0x5d, 0xd7, 0xed, 0x64, 0x25, 0x9c, - 0x55, 0x4b, 0x7d, 0x9a, 0x4b, 0xfc, 0x7e, 0xb4, 0xe7, 0x89, 0x44, 0xcf, - 0x36, 0x49, 0x01, 0x9e, 0x70, 0x01, 0x0f, 0xaf, 0x13, 0xa9, 0xaa, 0x32, - 0xbf, 0x91, 0x43, 0x79, 0xfa, 0xe0, 0x4f, 0x39, 0x61, 0xed, 0x58, 0xbb, - 0xe8, 0x5b, 0x2a, 0xfd, 0xdb, 0xac, 0xf2, 0xf2, 0x73, 0x20, 0x05, 0x84, - 0x4a, 0x7a, 0xfa, 0xef, 0xf8, 0x91, 0xdc, 0x8e, 0x12, 0x40, 0x56, 0xee, - 0x2e, 0x8d, 0x3c, 0xe1, 0xbe, 0xa7, 0x5b, 0x5b, 0x69, 0xf1, 0xdf, 0x80, - 0xdc, 0x17, 0xa4, 0xb4, 0x28, 0x6e, 0x37, 0xb2, 0xf0, 0x94, 0x7a, 0x46, - 0x05, 0xfd, 0x72, 0x9a, 0x5d, 0x87, 0xd8, 0x7b, 0x08, 0xad, 0x38, 0x11, - 0xc5, 0xe6, 0x42, 0xcc, 0x61, 0xb7, 0x9f, 0x38, 0xf5, 0xa1, 0x9a, 0xf0, - 0x5a, 0x42, 0x09, 0x60, 0xb9, 0x4e, 0xd5, 0xe7, 0xd1, 0x4f, 0xfb, 0x3c, - 0x3c, 0xa4, 0x9c, 0x0a, 0xa5, 0xaf, 0xc5, 0x2f, 0x09, 0xd3, 0x32, 0x79, - 0xd7, 0x90, 0xb1, 0x6b, 0xbd, 0xd6, 0x3d, 0xb9, 0x68, 0x0f, 0x9f, 0x3c, - 0x46, 0xee, 0x7e, 0xf9, 0x93, 0x6c, 0xa8, 0xfd, 0x5f, 0x2c, 0xca, 0x18, - 0xa6, 0x09, 0x88, 0x94, 0x5f, 0x69, 0xec, 0x71, 0xc8, 0xe8, 0x01, 0x63, - 0xd8, 0x73, 0xc8, 0x47, 0x7e, 0x9e, 0x79, 0x9c, 0x97, 0xe7, 0x50, 0x15, - 0x40, 0x75, 0x3a, 0xde, 0x35, 0xde, 0xf6, 0xde, 0x41, 0x3a, 0x01, 0x35, - 0xff, 0xac, 0x43, 0x8b, 0x59, 0x35, 0xe1, 0x23, 0x96, 0x92, 0x5f, 0xc2, - 0x02, 0x3c, 0xbe, 0x03, 0xc0, 0x96, 0x6f, 0xc4, 0x3b, 0x24, 0x55, 0x2a, - 0x86, 0x12, 0xfc, 0x6e, 0x11, 0x55, 0x83, 0x90, 0x45, 0x87, 0x9f, 0xa8, - 0xac, 0x2d, 0x6b, 0xd9, 0x61, 0x15, 0x36, 0x64, 0x2a, 0xab, 0x03, 0x9c, - 0x22, 0x6b, 0x42, 0x53, 0xac, 0x99, 0xf3, 0x16, 0xae, 0x13, 0x8d, 0x10, - 0x02, 0x8f, 0xe0, 0xeb, 0xa0, 0xcc, 0x6f, 0xda, 0x3d, 0x49, 0x54, 0x0e, - 0xf1, 0x54, 0x5e, 0xa6, 0xf8, 0x26, 0x19, 0x2b, 0x3e, 0xef, 0x35, 0x54, - 0xf1, 0x33, 0x0f, 0x08, 0xd1, 0x5b, 0x60, 0x78, 0x3b, 0x02, 0x42, 0xce, - 0xee, 0x1c, 0x66, 0xad, 0xa2, 0xe8, 0x8f, 0x36, 0x05, 0xf5, 0x08, 0x01, - 0xf1, 0xd0, 0x2a, 0xd4, 0x4f, 0x7a, 0xfd, 0xff, 0x6d, 0x25, 0xc7, 0x3c, - 0x8f, 0xef, 0x41, 0x81, 0xa5, 0x3e, 0x88, 0xae, 0x8d, 0x01, 0x81, 0x8e, - 0x7c, 0xf8, 0x01, 0x10, 0xd9, 0xfc, 0x25, 0xdf, 0x0c, 0x5a, 0x8f, 0xf6, - 0x39, 0x76, 0xd0, 0x67, 0x35, 0xc6, 0x28, 0xa2, 0xe3, 0x4f, 0x16, 0xf0, - 0xa5, 0x94, 0xa9, 0x41, 0x33, 0x79, 0xe0, 0x7d, 0x68, 0xec, 0xf5, 0xa1, - 0xa6, 0xa9, 0x2b, 0xa7, 0x35, 0x41, 0xac, 0x54, 0x1c, 0x49, 0x63, 0xb4, - 0x19, 0x59, 0xb4, 0xd6, 0xc6, 0x31, 0xce, 0x80, 0x42, 0xa8, 0x61, 0x3b, - 0xba, 0x93, 0xf2, 0xbc, 0xfe, 0xc5, 0x92, 0xdc, 0xe7, 0xea, 0x89, 0x7e, - 0x8d, 0x16, 0x4a, 0x43, 0xd0, 0xe9, 0x58, 0x9e, 0x0d, 0x99, 0x08, 0xa0, - 0x36, 0x3e, 0xe0, 0x18, 0x5a, 0x17, 0xbe, 0x44, 0x50, 0x4e, 0x36, 0xf0, - 0xf1, 0x62, 0xfd, 0x25, 0x3c, 0x2b, 0xf1, 0xf2, 0x09, 0x1d, 0x79, 0x8a, - 0x00, 0xef, 0x04, 0xab, 0xe0, 0xf3, 0x08, 0xde, 0xa1, 0x4f, 0x8c, 0xcd, - 0x78, 0x42, 0x21, 0xdc, 0x89, 0xc4, 0x86, 0xfa, 0x0f, 0xcd, 0xa3, 0x1b, - 0xde, 0xd0, 0xf2, 0xa4, 0x5f, 0xb1, 0x5a, 0xf4, 0xa3, 0x2d, 0xb9, 0xd3, - 0xb5, 0x98, 0x91, 0xcc, 0xc3, 0xd5, 0xba, 0xeb, 0x6a, 0x0b, 0x91, 0xca, - 0x49, 0x2f, 0x26, 0xa9, 0x69, 0xe6, 0x47, 0xab, 0x81, 0x40, 0x63, 0xbf, - 0x04, 0x05, 0x8d, 0x81, 0x59, 0x05, 0x82, 0x68, 0x55, 0x9d, 0xae, 0x96, - 0x99, 0x9d, 0x2f, 0x8f, 0x7b, 0x36, 0x86, 0xbb, 0x86, 0xae, 0xb9, 0x9a, - 0x01, 0xb7, 0x4e, 0x2a, 0x60, 0x1c, 0x84, 0x66, 0x91, 0xa7, 0x0d, 0x49, - 0xe8, 0xf1, 0x54, 0x41, 0x2c, 0x24, 0xe2, 0x22, 0x52, 0x41, 0xdb, 0x50, - 0xee, 0xbe, 0x11, 0x16, 0x69, 0x58, 0x1b, 0x5a, 0x30, 0x10, 0xfa, 0xff, - 0x4f, 0xb0, 0x1e, 0xf9, 0xf2, 0x32, 0x91, 0xc8, 0x8b, 0x6e, 0x95, 0x94, - 0x8b, 0x33, 0x33, 0x78, 0xdf, 0x5f, 0xd8, 0xfb, 0x2b, 0x12, 0xf7, 0xd2, - 0x03, 0x73, 0x26, 0xb2, 0x30, 0x6a, 0x83, 0xb9, 0xcf, 0x73, 0xe8, 0x35, - 0x66, 0x3f, 0x53, 0x5f, 0xad, 0x4b, 0xfe, 0x06, 0x99, 0xed, 0xe0, 0x16, - 0x81, 0x21, 0x8b, 0xea, 0x2d, 0x59, 0xe9, 0x73, 0xe1, 0x68, 0x24, 0x4f, - 0x1b, 0xe6, 0x55, 0x50, 0x30, 0x18, 0xa1, 0xe7, 0x4f, 0x42, 0x68, 0x6b, - 0xf1, 0x39, 0x23, 0x8d, 0x2c, 0x24, 0xe2, 0x22, 0x52, 0x41, 0xdb, 0x50, - 0xee, 0xbe, 0x11, 0x16, 0x69, 0x9a, 0x1b, 0x5a, 0xa2, 0xca, 0xaa, 0x41, - 0x0f, 0xed, 0xb6, 0x27, 0x1a, 0xbd, 0x41, 0xcc, 0xc1, 0xda, 0x4f, 0x2e, - 0x2b, 0x39, 0x1c, 0xa0, 0x19, 0xc1, 0x62, 0xec, 0x75, 0x49, 0x9b, 0x08, - 0x60, 0x70, 0x24, 0xe1, 0x41, 0xf8, 0xa7, 0xb4, 0x66, 0x72, 0xf4, 0xad, - 0x90, 0xe4, 0x98, 0xda, 0xee, 0xb2, 0x6f, 0x09, 0x59, 0x15, 0xb5, 0x9b, - 0xa7, 0x19, 0xe1, 0x9a, 0x13, 0x1d, 0x19, 0xf4, 0xa7, 0x1e, 0x16, 0xe9, - 0x68, 0x84, 0x6c, 0x9f, 0xe9, 0x39, 0x8a, 0xf0, 0x87, 0xa4, 0x19, 0x6a, - 0xcd, 0xb0, 0xcd, 0x1f, 0xd7, 0x62, 0xee, 0x20, 0xba, 0xad, 0x7b, 0xeb, - 0xe5, 0x50, 0x23, 0x85, 0xe4, 0x6d, 0xa4, 0x6e, 0xde, 0xba, 0xe6, 0x45, - 0x27, 0xc8, 0x4f, 0xba, 0xda, 0x00, 0xaf, 0xdd, 0x1c, 0x01, 0x4d, 0x24, - 0x00, 0x02, 0xb9, 0x2f, 0xfa, 0xab, 0x98, 0xe7, 0x46, 0x14, 0xea, 0x80, - 0xc3, 0xb4, 0x14, 0xb6, 0x30, 0x4f, 0x53, 0x30, 0xcd, 0xa1, 0x82, 0xdc, - 0x12, 0x89, 0x16, 0xa6, 0xf7, 0x64, 0x52, 0x5b, 0xbd, 0x31, 0xc5, 0x29, - 0xf4, 0xd1, 0x3f, 0x8c, 0x8f, 0xc1, 0x77, 0xef, 0x59, 0x84, 0xaf, 0x9d, - 0xea, 0x2b, 0x68, 0xb1, 0x26, 0x29, 0x9d, 0x8c, 0xa2, 0x9d, 0xfc, 0xda, - 0xa9, 0xfc, 0x5f, 0xf2, 0x77, 0x73, 0x2d, 0x0c, 0x4f, 0x10, 0x4d, 0x8e, - 0x68, 0xa6, 0x86, 0x86, 0x4e, 0xf1, 0xc6, 0xf4, 0x44, 0x50, 0xa9, 0x7e, - 0xd1, 0x06, 0xfa, 0xfc, 0x79, 0x5e, 0xaf, 0x07, 0xdd, 0xc7, 0x68, 0x6c, - 0xfa, 0xc3, 0x1b, 0x33, 0x21, 0xb3, 0x17, 0xfe, 0x9f, 0x7e, 0x18, 0x43, - 0x89, 0x88, 0xec, 0xb6, 0x03, 0x74, 0x5a, 0xf8, 0x5e, 0x2f, 0xed, 0x5c, - 0x23, 0x9a, 0x22, 0x6f, 0x88, 0x69, 0x2a, 0x36, 0xb0, 0x33, 0x1a, 0x57, - 0xd9, 0x0a, 0xa0, 0xbe, 0x7c, 0xfa, 0x29, 0xb8, 0xc0, 0x5c, 0xf8, 0x9b, - 0x8b, 0x3e, 0x5c, 0xdb, 0x54, 0x4e, 0x46, 0x4a, 0xb8, 0x15, 0x17, 0xa6, - 0x20, 0xbd, 0xd7, 0x29, 0x32, 0x3e, 0x68, 0x1b, 0xe1, 0xdc, 0xdd, 0xed, - 0xe6, 0x39, 0x39, 0x45, 0xd8, 0x87, 0x5e, 0x30, 0xa0, 0x86, 0x94, 0x64, - 0x6c, 0x67, 0x33, 0x8f, 0x87, 0x4d, 0xbc, 0x36, 0x1e, 0x36, 0xdf, 0xf6, - 0x7c, 0x64, 0x6f, 0x72, 0xd0, 0x0e, 0xe8, 0x1a, 0x1f, 0xf2, 0x83, 0x52, - 0xa1, 0x25, 0x83, 0x09, 0x1f, 0x7c, 0x0e, 0x6b, 0xb6, 0x5f, 0x2f, 0x0b, - 0xbd, 0x2d, 0x6f, 0x7a, 0x96, 0x5d, 0x6f, 0x6e, 0x7b, 0xb0, 0x7a, 0x1b, - 0xfa, 0x6c, 0x2a, 0x81, 0xd1, 0x57, 0x45, 0x40, 0xcf, 0x47, 0x23, 0x8f, - 0xad, 0x92, 0xb4, 0x94, 0xd7, 0x71, 0xba, 0xa1, 0x0f, 0xa6, 0x8c, 0x1b, - 0x19, 0xc0, 0x3d, 0x1a, 0x4a, 0x52, 0x5b, 0x25, 0x5d, 0x1e, 0x6d, 0xd9, - 0x0b, 0xf8, 0x2b, 0xb7, 0x17, 0xd8, 0x84, 0x88, 0x4c, 0x74, 0xa7, 0x7a, - 0xef, 0xb8, 0x5c, 0x63, 0xd1, 0xd2, 0xb4, 0x92, 0x0f, 0xc7, 0x63, 0x1e, - 0x62, 0xfc, 0x27, 0x44, 0xc1, 0x51, 0xe2, 0x24, 0x79, 0x94, 0x37, 0x57, - 0x90, 0x07, 0x98, 0xc0, 0xe3, 0x4b, 0xc3, 0x4c, 0xfd, 0x4e, 0x1f, 0xa5, - 0x0f, 0xf9, 0xb0, 0xba, 0x9e, 0xe9, 0xf6, 0x93, 0xec, 0x8e, 0xec, 0x28, - 0x77, 0x4f, 0x06, 0x6e, 0xfe, 0x3a, 0xf0, 0xcb, 0x4d, 0x4b, 0x2a, 0x02, - 0xf0, 0x6f, 0x04, 0x83, 0x1c, 0x3e, 0xa8, 0x22, 0x98, 0x47, 0xb2, 0x35, - 0xd7, 0x22, 0x19, 0xc7, 0xa2, 0x63, 0x41, 0xa2, 0xd4, 0xc9, 0xec, 0x57, - 0xea, 0x91, 0x6d, 0xb3, 0xad, 0x71, 0x1f, 0x3f, 0x1c, 0xe2, 0x15, 0xa3, - 0x53, 0xdc, 0x72, 0x5d, 0xe1, 0xa2, 0xc8, 0x76, 0xe5, 0x3c, 0x36, 0x67, - 0x46, 0x26, 0x98, 0xcc, 0x83, 0xce, 0xe0, 0x73, 0x42, 0x4d, 0xcb, 0xa6, - 0xd8, 0xb2, 0xb0, 0x59, 0x25, 0x36, 0x43, 0x10, 0x86, 0x2b, 0xa6, 0xeb, - 0x33, 0xde, 0xb5, 0xf6, 0xec, 0xd2, 0x11, 0x9c, 0x74, 0x5f, 0x28, 0x2c, - 0xf5, 0x58, 0xe1, 0x52, 0xdd, 0x96, 0x35, 0x81, 0x18, 0xd1, 0xc1, 0xe8, - 0x4b, 0x9e, 0xb7, 0x79, 0x0e, 0x0b, 0x33, 0x82, 0x40, 0x31, 0xc9, 0x9f, - 0x8d, 0xdb, 0xfa, 0x48, 0x29, 0x94, 0x4b, 0xb2, 0xdf, 0x60, 0x01, 0x67, - 0xa5, 0xd6, 0x61, 0xc2, 0x3a, 0x99, 0xbe, 0x77, 0xbb, 0x18, 0x7e, 0xaa, - 0x62, 0xa2, 0xe0, 0x29, 0xee, 0xe7, 0xca, 0x98, 0x5e, 0xc4, 0x42, 0xb8, - 0x4f, 0x08, 0x8b, 0xf0, 0x23, 0x54, 0x4b, 0xff, 0x17, 0x3b, 0x3d, 0x4f, - 0xc8, 0x06, 0xd1, 0x03, 0x55, 0x7f, 0x94, 0x6e, 0x6b, 0x70, 0x78, 0xb0, - 0xc9, 0xcf, 0xb2, 0x41, 0x94, 0xd9, 0x58, 0xa5, 0x74, 0x7b, 0x10, 0x5c, - 0x43, 0xb9, 0x74, 0xc5, 0x70, 0x06, 0xe3, 0x84, 0x3f, 0x21, 0x90, 0x46, - 0x9b, 0xd0, 0x84, 0x18, 0xf1, 0x55, 0x4c, 0x85, 0x3b, 0x91, 0x4a, 0x07, - 0xb3, 0x96, 0xf9, 0x88, 0xf0, 0x5f, 0x26, 0x8f, 0x95, 0x4d, 0xea, 0x69, - 0xdf, 0x9d, 0x6a, 0x9e, 0x35, 0xde, 0x70, 0x5e, 0x32, 0x29, 0x67, 0xe7, - 0xeb, 0x94, 0xeb, 0x9b, 0x80, 0x9f, 0x6c, 0x8d, 0x7d, 0x7a, 0xf7, 0x04, - 0xc1, 0x64, 0x58, 0xb2, 0x70, 0xc0, 0xbb, 0x96, 0x92, 0x33, 0xd9, 0x94, - 0xb1, 0x64, 0xfe, 0xcb, 0xf9, 0x94, 0xde, 0x28, 0x8f, 0x3c, 0xaf, 0x59, - 0x95, 0xe0, 0x9c, 0x03, 0x22, 0x4d, 0x7a, 0x8c, 0x9c, 0xb8, 0x88, 0x07, - 0x85, 0x4c, 0x9c, 0xee, 0x44, 0xf0, 0x9d, 0x1d, 0xde, 0xed, 0x87, 0x9d, - 0xde, 0x66, 0x06, 0x27, 0x2e, 0xb2, 0xc9, 0x37, 0xa8, 0xca, 0x82, 0x84, - 0x0a, 0x6e, 0x04, 0xea, 0x39, 0x28, 0x44, 0xb6, 0xb0, 0xf6, 0x62, 0xfb, - 0x06, 0x16, 0x95, 0xad, 0x22, 0xb7, 0x2e, 0xc1, 0xce, 0x52, 0xdc, 0x19, - 0xcb, 0xc9, 0x02, 0x37, 0xf1, 0x48, 0x7b, 0x51, 0x5f, 0x28, 0x52, 0xe6, - 0x78, 0x8f, 0xdf, 0xb7, 0x53, 0x7a, 0x2d, 0xcc, 0xef, 0xd2, 0xfb, 0xf7, - 0x6a, 0xef, 0xeb, 0xe9, 0x25, 0x50, 0x15, 0x44, 0x2d, 0x02, 0x38, 0xbe, - 0x89, 0x4c, 0x83, 0x49, 0xa3, 0x02, 0x6e, 0x52, 0xa6, 0x56, 0x3e, 0xd5, - 0xc2, 0xa8, 0x8f, 0xde, 0xc9, 0x81, 0x39, 0x55, 0xe6, 0xb2, 0x4e, 0x84, - 0xb4, 0x32, 0x42, 0xd1, 0x1b, 0x3c, 0x35, 0x99, 0x9b, 0xf9, 0x36, 0xe9, - 0x1d, 0xb9, 0xbc, 0xe8, 0x4b, 0x57, 0x66, 0xbc, 0x6f, 0x88, 0x71, 0x9a, - 0xad, 0x21, 0xee, 0x07, 0x98, 0xc3, 0x4b, 0xae, 0x48, 0xb7, 0xe2, 0x56, - 0x87, 0x4b, 0x95, 0x6a, 0xd9, 0x71, 0x70, 0xad, 0xd2, 0x8c, 0x4b, 0xd5, - 0xc9, 0xb4, 0xbb, 0x99, 0xaa, 0x43, 0x32, 0x2e, 0xcb, 0xb3, 0x41, 0x88, - 0xe1, 0x26, 0x55, 0x44, 0x36, 0x5b, 0x7a, 0xab, 0xce, 0x5b, 0x52, 0x89, - 0x31, 0xb6, 0x7a, 0x0a, 0xdf, 0x28, 0x19, 0xe5, 0x1b, 0x68, 0xbc, 0xcb, - 0xb5, 0xaf, 0xc3, 0xce, 0x02, 0xa4, 0x15, 0x71, 0x0c, 0x4f, 0x13, 0xba, - 0xe4, 0x93, 0xc8, 0xfa, 0xc3, 0xac, 0xcd, 0x88, 0xf9, 0x8b, 0x8d, 0x7c, - 0x87, 0x49, 0x44, 0x59, 0x29, 0xe8, 0xdc, 0x80, 0x20, 0xad, 0x02, 0xee, - 0x1d, 0x07, 0x66, 0xf1, 0x83, 0x22, 0xab, 0x93, 0x9b, 0x10, 0x0d, 0xac, - 0x55, 0x3b, 0x3e, 0x2e, 0x70, 0x63, 0x8e, 0x51, 0x2b, 0xc8, 0xdb, 0xa7, - 0xc0, 0x3b, 0xbc, 0xfb, 0x80, 0xb3, 0x0d, 0x0d, 0xbd, 0x17, 0x88, 0x08, - 0x8d, 0xf0, 0xe9, 0x9c, 0x43, 0xd3, 0x7e, 0xea, 0x7b, 0x28, 0x3f, 0xae, - 0xdc, 0x36, 0x55, 0x97, 0xe2, 0xe7, 0xe5, 0xf0, 0xc7, 0x54, 0x79, 0xc4, - 0x14, 0xdc, 0xe2, 0x12, 0x79, 0x69, 0x29, 0x3c, 0xe8, 0xa1, 0x36, 0xf0, - 0x96, 0x71, 0x21, 0x85, 0x5d, 0xf9, 0x82, 0x9b, 0xc9, 0xd0, 0xaf, 0xc0, - 0x4e, 0xd0, 0x7c, 0x3a, 0x84, 0x82, 0x9b, 0x62, 0x5e, 0x24, 0xfd, 0x37, - 0x27, 0x5c, 0x52, 0xc8, 0xfa, 0xf5, 0xbe, 0xa5, 0x5f, 0x5e, 0x2c, 0xd8, - 0x33, 0x3a, 0x19, 0xe7, 0xb9, 0x2d, 0x42, 0xaf, 0xa9, 0x48, 0x1c, 0x2a, - 0xa8, 0x40, 0x7c, 0x62, 0xd9, 0x0f, 0xd7, 0xd8, 0x69, 0x13, 0x01, 0x22, - 0x5a, 0xbe, 0x88, 0x97, 0xf8, 0xc5, 0xdc, 0x9b, 0xa5, 0x05, 0x73, 0x2f, - 0x24, 0x7b, 0xe3, 0x88, 0x84, 0x6f, 0x9a, 0xa6, 0xf3, 0x10, 0x1b, 0xb8, - 0xd9, 0xfd, 0x71, 0xf6, 0x32, 0xcf, 0x8d, 0xf3, 0x33, 0xbf, 0x07, 0x28, - 0xe4, 0x54, 0x23, 0x43, 0x8f, 0x81, 0x72, 0x9a, 0xaf, 0xb1, 0xfa, 0x32, - 0x61, 0x44, 0x29, 0xdc, 0x20, 0x4c, 0x26, 0xd4, 0xf2, 0x79, 0x91, 0x16, - 0xd3, 0xe2, 0x08, 0x99, 0x71, 0xc2, 0xe9, 0x66, 0xc9, 0xee, 0x77, 0xd0, - 0x3f, 0xf5, 0x2e, 0x81, 0x16, 0xfe, 0x5e, 0x2b, 0x73, 0x86, 0x64, 0xb5, - 0x9a, 0x23, 0x73, 0xe5, 0xcc, 0x41, 0x0f, 0x19, 0x27, 0xc8, 0x79, 0x78, - 0x9d, 0xcc, 0x90, 0xcb, 0xd8, 0xcd, 0x01, 0xf5, 0x95, 0xe0, 0x2e, 0x18, - 0x68, 0x01, 0x0e, 0xd1, 0x54, 0xd9, 0x7e, 0x15, 0x61, 0xbf, 0xdb, 0x77, - 0x08, 0x70, 0x75, 0xc5, 0xeb, 0xfb, 0x84, 0x1d, 0x0b, 0xdf, 0xc5, 0x17, - 0x1e, 0xae, 0x1d, 0x87, 0x2e, 0x6a, 0xd7, 0xa4, 0xf7, 0x1d, 0x6a, 0x2a, - 0xba, 0xe5, 0x89, 0x97, 0x2a, 0x14, 0xeb, 0xb0, 0x86, 0x6f, 0xba, 0x6d, - 0x2a, 0xd5, 0x81, 0xaf, 0x8b, 0x29, 0xb9, 0x10, 0xea, 0x65, 0x47, 0x0e, - 0x56, 0xbd, 0x97, 0xd0, 0x97, 0xf9, 0x75, 0xd1, 0x09, 0x7b, 0x33, 0x4d, - 0x32, 0x8f, 0x70, 0x0b, 0x16, 0x67, 0xd8, 0xc4, 0x60, 0xa8, 0x63, 0x36, - 0xf2, 0xb7, 0xdf, 0x3a, 0xab, 0x9a, 0x88, 0xd8, 0x5d, 0x53, 0xd9, 0x69, - 0x19, 0x86, 0x15, 0x6f, 0x12, 0xf9, 0x85, 0x3c, 0xe8, 0x87, 0x79, 0x5d, - 0xee, 0xfc, 0xd3, 0x69, 0xba, 0x5b, 0xb2, 0xa8, 0x8b, 0x24, 0x40, 0x8a, - 0x93, 0x4c, 0x6d, 0x23, 0xd8, 0x6a, 0x04, 0xcd, 0xad, 0x1c, 0xde, 0xaf, - 0xfa, 0x9c, 0x92, 0xd4, 0xa3, 0x2c, 0x17, 0x0d, 0xaa, 0x48, 0x4f, 0x2c, - 0xff, 0xbf, 0x1c, 0x3e, 0xa8, 0x6d, 0x17, 0xac, 0xca, 0x6a, 0x5c, 0x32, - 0xfa, 0x44, 0x97, 0x0f, 0xb0, 0x3b, 0xd8, 0x12, 0x53, 0x5a, 0xe6, 0x88, - 0x86, 0xd3, 0x16, 0x7b, 0x38, 0xc3, 0xf1, 0x7d, 0xa6, 0x03, 0xbf, 0xbd, - 0x17, 0x1d, 0x09, 0x61, 0x9d, 0x4d, 0x74, 0xff, 0xa2, 0x0d, 0x94, 0xde, - 0xc4, 0x28, 0x47, 0xe9, 0x39, 0x38, 0x08, 0x72, 0xd4, 0x12, 0x76, 0x4e, - 0xb6, 0x13, 0xf9, 0x44, 0x9e, 0x13, 0xab, 0x7f, 0xe5, 0xfa, 0xf2, 0x23, - 0xd4, 0x10, 0x99, 0x65, 0xdc, 0x78, 0x44, 0x0c, 0x3f, 0x3e, 0x6b, 0x1f, - 0xce, 0x8e, 0x3c, 0xdd, 0x76, 0xa9, 0xc8, 0xc8, 0xc3, 0x35, 0xca, 0x3a, - 0xa8, 0xb6, 0x63, 0x29, 0x68, 0x5f, 0x78, 0x34, 0x63, 0x9a, 0x54, 0xf4, - 0xe2, 0x05, 0xa3, 0x6a, 0x04, 0xe4, 0xef, 0x3f, 0xc2, 0xfa, 0xd3, 0x55, - 0x17, 0x6f, 0x07, 0xbd, 0xff, 0x0a, 0xa3, 0x78, 0x67, 0xf1, 0xd7, 0x0d, - 0xf7, 0x83, 0xfb, 0x0e, 0xdc, 0xbe, 0x95, 0xc2, 0x10, 0x1a, 0x47, 0x6d, - 0x2c, 0x1e, 0xf5, 0xb4, 0x6c, 0x27, 0x62, 0xb7, 0xdf, 0x2d, 0xb2, 0x4a, - 0x43, 0x40, 0x53, 0x6b, 0x86, 0xca, 0x01, 0xbc, 0x83, 0x66, 0x79, 0xa7, - 0x11, 0x76, 0xcc, 0x37, 0x3f, 0xc0, 0xb6, 0xca, 0x15, 0x43, 0xfd, 0x8a, - 0xe3, 0x71, 0xf3, 0x11, 0x21, 0x34, 0x3e, 0xa8, 0x8f, 0x82, 0x4b, 0x1d, - 0xa5, 0xc3, 0x6b, 0x28, 0x18, 0x3e, 0xda, 0xe7, 0xa3, 0x6f, 0xcc, 0x9a, - 0x90, 0x3a, 0xa7, 0x40, 0x2d, 0xe2, 0xa1, 0x99, 0xd6, 0x76, 0x7c, 0x9a, - 0xbb, 0x6b, 0x54, 0xdc, 0x5e, 0xe7, 0xf6, 0x93, 0xfb, 0x53, 0x32, 0x51, - 0xd1, 0xc7, 0x15, 0x01, 0x4b, 0x55, 0xbd, 0x40, 0x11, 0x9a, 0xe8, 0x34, - 0xfb, 0xe2, 0x89, 0xdd, 0xf1, 0x4f, 0x8a, 0xb4, 0xec, 0xb5, 0xa3, 0xd9, - 0x82, 0x56, 0xe4, 0xf5, 0x11, 0xa6, 0x1b, 0xac, 0xbb, 0xd6, 0x1f, 0x20, - 0xf3, 0x16, 0x59, 0xd9, 0xd6, 0x1c, 0xe8, 0xd3, 0x07, 0xb0, 0xfd, 0x14, - 0x18, 0xd4, 0x0c, 0x35, 0xea, 0x96, 0x36, 0xbb, 0xca, 0xfc, 0x38, 0x0f, - 0xef, 0x9f, 0x50, 0xb8, 0xb4, 0x4b, 0x98, 0x60, 0xb5, 0x25, 0xbc, 0x8d, - 0x9d, 0x05, 0xb7, 0x9c, 0xfc, 0xae, 0x16, 0xd8, 0xf7, 0x49, 0x4e, 0x3a, - 0x65, 0x1d, 0xc2, 0x68, 0x09, 0xd8, 0x8a, 0x52, 0x15, 0x69, 0x05, 0x72, - 0x00, 0xf1, 0xae, 0x2f, 0xa3, 0xf5, 0x89, 0xe6, 0xb0, 0x1c, 0x2a, 0x09, - 0x34, 0x97, 0xe8, 0x72, 0x67, 0x62, 0x57, 0x26, 0x29, 0xcb, 0x15, 0x65, - 0x3f, 0x6f, 0x0c, 0xa9, 0xe5, 0xab, 0x32, 0xc3, 0x1f, 0x25, 0xaa, 0x6c, - 0xf8, 0xf1, 0x4d, 0xec, 0x2d, 0xb0, 0x19, 0xd3, 0xa2, 0x98, 0x11, 0x9c, - 0xce, 0x3c, 0x21, 0xb4, 0xd7, 0x19, 0xac, 0x05, 0x7d, 0x4e, 0x00, 0xb2, - 0xa7, 0x35, 0xaf, 0x29, 0x16, 0x67, 0xa8, 0x9a, 0x08, 0x7e, 0x65, 0xc3, - 0x98, 0x8a, 0x75, 0xed, 0x35, 0xc4, 0x01, 0xe4, 0xcc, 0x4b, 0xc2, 0x9a, - 0xed, 0x14, 0x2a, 0x6f, 0x66, 0x93, 0x1b, 0x99, 0xbc, 0x42, 0x02, 0x30, - 0xb0, 0x3a, 0x51, 0x2e, 0xa7, 0xef, 0xf1, 0xd3, 0x06, 0xcf, 0xf4, 0x82, - 0xae, 0xf1, 0x24, 0x86, 0x8a, 0xec, 0x87, 0xef, 0x1b, 0x23, 0xcf, 0x51, - 0x5f, 0x87, 0xd2, 0x3a, 0xd7, 0xb5, 0xe1, 0xb5, 0xa7, 0x92, 0xef, 0xd0, - 0x6f, 0x17, 0x9c, 0x33, 0x0d, 0x24, 0xc2, 0xef, 0xa1, 0x4c, 0x4e, 0x50, - 0x27, 0x38, 0xba, 0x32, 0xa7, 0x4d, 0xb5, 0x42, 0xf0, 0x01, 0x3c, 0x56, - 0x15, 0xd6, 0x02, 0x80, 0x10, 0xfb, 0x62, 0xda, 0xa9, 0x90, 0x83, 0x27, - 0x22, 0x2e, 0x57, 0xb4, 0x70, 0xc2, 0x35, 0x59, 0xb9, 0x8e, 0xcd, 0x84, - 0xe7, 0xcf, 0xe1, 0x12, 0x97, 0x8a, 0x52, 0xae, 0x48, 0xb3, 0x64, 0x8e, - 0x82, 0x50, 0x4b, 0x01, 0x14, 0x52, 0x0f, 0x19, 0x9e, 0x1a, 0x88, 0xee, - 0x57, 0x36, 0x28, 0xe6, 0x99, 0x2a, 0x29, 0x8c, 0xb6, 0x9f, 0x79, 0x59, - 0x12, 0x24, 0x69, 0x13, 0xfc, 0x92, 0x54, 0x25, 0x31, 0x05, 0x33, 0x33, - 0x15, 0x0c, 0xa4, 0x77, 0xf2, 0x2a, 0xbc, 0x15, 0x45, 0xda, 0x5e, 0x2b, - 0x73, 0x86, 0x64, 0xb5, 0xb7, 0x25, 0xbc, 0x8d, 0x9d, 0x05, 0xb7, 0x9c, - 0xfc, 0xae, 0x16, 0xd8, 0xf7, 0x49, 0x4e, 0x3a, 0x65, 0x1d, 0xc2, 0x68, - 0x09, 0xd8, 0x8a, 0x52, 0x15, 0x69, 0x05, 0x72, 0x00, 0xf1, 0xae, 0x2f, - 0xa3, 0xf5, 0x89, 0xe6, 0xb0, 0x1c, 0x2a, 0x09, 0x34, 0x97, 0xe8, 0x72, - 0x67, 0x62, 0x57, 0x26, 0x29, 0xcb, 0x15, 0x65, 0x3f, 0x6f, 0x0c, 0xa9, - 0xe5, 0xab, 0x32, 0xc3, 0x1f, 0x25, 0xaa, 0x6c, 0xf8, 0xf1, 0x4d, 0xec, - 0x2d, 0xb0, 0x19, 0xd3, 0xa2, 0x98, 0x11, 0x9c, 0xce, 0x3c, 0x21, 0xb4, - 0xd7, 0x19, 0xac, 0x05, 0x7d, 0x4e, 0x00, 0xb2, 0xa7, 0x35, 0xaf, 0x29, - 0x16, 0x67, 0xa8, 0x9a, 0x08, 0x7e, 0x65, 0xc3, 0x98, 0x8a, 0x75, 0xed, - 0x35, 0xc4, 0x01, 0xe4, 0xcc, 0x4b, 0xc2, 0x9a, 0x0a, 0xde, 0x94, 0xd3, - 0xef, 0x9b, 0xb6, 0xfb, 0x20, 0x3f, 0x06, 0x63, 0x16, 0x89, 0xa4, 0x1e, - 0x64, 0x5b, 0x19, 0xcf, 0x12, 0x72, 0x6a, 0x4b, 0x22, 0x83, 0x8f, 0x85, - 0x81, 0xf6, 0xa4, 0x3f, 0x1b, 0x23, 0xcf, 0x51, 0x5f, 0x87, 0xd2, 0x3a, - 0xd7, 0xb5, 0xe1, 0xb5, 0xa7, 0x92, 0xef, 0x58, 0x92, 0x59, 0x42, 0x92, - 0xbc, 0x82, 0x5a, 0x61, 0xf5, 0xb2, 0xee, 0x1d, 0x87, 0x08, 0x94, 0x43, - 0xa7, 0x4d, 0xb5, 0x32, 0xf0, 0x01, 0x3c, 0x56, 0x15, 0xd6, 0x02, 0x80, - 0x10, 0xfb, 0x62, 0xda, 0xa9, 0x90, 0x83, 0x27, 0x22, 0x2e, 0x57, 0xb4, - 0x70, 0xc2, 0x35, 0x59, 0xb9, 0x8e, 0xcd, 0x84, 0xe7, 0xcf, 0xe1, 0x12, - 0x97, 0x8a, 0x52, 0xae, 0x48, 0xb3, 0x64, 0x8e, 0x82, 0x50, 0x4b, 0x01, - 0x14, 0x52, 0x0f, 0x19, 0x9e, 0x1a, 0x88, 0xee, 0x57, 0x36, 0x28, 0xe6, - 0x99, 0x2a, 0x29, 0x8c, 0x50, 0x56, 0xc0, 0x60, 0xea, 0xcd, 0x5a, 0x2f, - 0x88, 0x49, 0x44, 0xb9, 0x27, 0xb2, 0xfc, 0x78, 0x58, 0x9a, 0x4f, 0xf2, - 0x45, 0x19, 0xf6, 0x33, 0x9d, 0x47, 0xe4, 0xe4, 0x13, 0x0b, 0xae, 0xcd, - 0x87, 0x4d, 0x74, 0xd4, 0x02, 0xab, 0x57, 0xe4, 0x34, 0x57, 0x92, 0x38, - 0xed, 0x9e, 0xcf, 0x8b, 0x02, 0x7e, 0x74, 0x4c, 0xd1, 0xea, 0xdf, 0x86, - 0xf2, 0xd3, 0x3f, 0xbf, 0x02, 0xa2, 0xfc, 0xa0, 0xf3, 0x7b, 0xf9, 0x11, - 0x94, 0x65, 0x17, 0x56, 0xa1, 0xaf, 0x37, 0x16, 0x09, 0xbe, 0x1b, 0x7d, - 0x48, 0xf1, 0xbe, 0x01, 0x2a, 0x78, 0x45, 0x15, 0x02, 0x01, 0xd9, 0x8e, - 0xa9, 0xe3, 0xda, 0x7c, 0x90, 0x0c, 0xc6, 0x0b, 0x36, 0x75, 0x0a, 0x64, - 0x50, 0xf6, 0x58, 0x64, 0x87, 0x8e, 0xe1, 0xa9, 0x65, 0x12, 0xa3, 0x7d, - 0x6a, 0xe0, 0x31, 0x7a, 0x18, 0x64, 0xc9, 0x3a, 0x2b, 0xbb, 0xd7, 0xcb, - 0x3d, 0x8c, 0xad, 0x1f, 0x14, 0xc8, 0x7e, 0xd7, 0xe6, 0x36, 0x50, 0x09, - 0xb3, 0x87, 0x70, 0x2a, 0xed, 0xe5, 0x00, 0x2e, 0xa5, 0xd2, 0x83, 0xff, - 0xcd, 0x9b, 0x0c, 0x1a, 0xe5, 0x3d, 0x35, 0xc4, 0x11, 0x35, 0x1a, 0xb8, - 0x02, 0x69, 0x97, 0xc3, 0xd7, 0x5b, 0x51, 0x18, 0x14, 0xd9, 0xaa, 0xd0, - 0x5a, 0xbe, 0xc6, 0x28, 0x90, 0xad, 0x70, 0xe2, 0xf5, 0x7f, 0x89, 0x75, - 0x92, 0x5a, 0x54, 0xb2, 0x28, 0xc7, 0x35, 0xf8, 0xe8, 0x0c, 0xf6, 0x82, - 0xef, 0x1a, 0xe5, 0xf8, 0x54, 0xd8, 0x8f, 0xed, 0xf6, 0x30, 0x3d, 0x85, - 0x4a, 0x7c, 0xfe, 0x03, 0x97, 0x7e, 0xa8, 0x40, 0x25, 0x04, 0xc3, 0x36, - 0x24, 0xba, 0x34, 0xcf, 0xaa, 0x84, 0x37, 0xf0, 0x4a, 0xf3, 0x61, 0x82, - 0x1d, 0x67, 0x84, 0x53, 0xce, 0x54, 0x27, 0x34, 0x81, 0xe3, 0x85, 0x8a, - 0x4d, 0xff, 0xf9, 0x17, 0x4f, 0xf6, 0xe7, 0xbe, 0x4c, 0x61, 0x20, 0xd2, - 0xa5, 0x4e, 0xc1, 0x04, 0x7f, 0xb8, 0x0d, 0x60, 0x0f, 0xd3, 0x87, 0x34, - 0xf7, 0x41, 0x6c, 0x0f, 0x15, 0x37, 0x3e, 0x16, 0x56, 0x2d, 0xb5, 0xf7, - 0x8d, 0x0c, 0xa1, 0xb2, 0x38, 0x75, 0x1f, 0x17, 0x01, 0x12, 0xce, 0x4e, - 0x5f, 0xd7, 0x17, 0xfa, 0x48, 0x70, 0xa5, 0x8b, 0xe4, 0x31, 0x5e, 0xad, - 0xb7, 0x9a, 0x28, 0x96, 0xe4, 0x26, 0x3e, 0x14, 0x14, 0xdb, 0xba, 0xed, - 0xad, 0x8b, 0x87, 0x43, 0x2c, 0x84, 0x23, 0xbb, 0x01, 0xd8, 0x94, 0x8d, - 0x4d, 0x59, 0x81, 0x22, 0xa1, 0xe5, 0x39, 0x3a, 0x1e, 0x48, 0x8b, 0x1a, - 0xc0, 0x0e, 0x77, 0x99, 0xe1, 0xed, 0x63, 0x67, 0x23, 0x64, 0xfd, 0x11, - 0x9c, 0x09, 0xd2, 0xbc, 0x35, 0x03, 0x78, 0xeb, 0x4e, 0xf3, 0x85, 0x58, - 0x43, 0x43, 0xd9, 0xb6, 0xd0, 0x22, 0x28, 0x74, 0x9b, 0xb5, 0xed, 0x06, - 0xf7, 0xd8, 0x21, 0x70, 0xfc, 0x8b, 0x8e, 0x24, 0xf3, 0x5d, 0x81, 0xb5, - 0xde, 0xef, 0x67, 0xca, 0xd4, 0xb0, 0x2d, 0x2f, 0x96, 0x78, 0xb9, 0xd0, - 0x9f, 0x75, 0x30, 0x33, 0xd4, 0xfb, 0xe6, 0x9b, 0x1e, 0xc9, 0xdd, 0x72, - 0x65, 0xef, 0x12, 0x64, 0x1a, 0x45, 0x42, 0xd8, 0x8e, 0x25, 0x41, 0xb6, - 0xb3, 0x37, 0xa6, 0x62, 0x23, 0xcf, 0x2a, 0xe1, 0x40, 0xe0, 0xeb, 0xbd, - 0x6a, 0xed, 0x99, 0xa4, 0x5f, 0x93, 0xd7, 0xa1, 0x4b, 0xe9, 0x48, 0x34, - 0x2e, 0x40, 0xb4, 0x78, 0xbd, 0x9b, 0x3b, 0xc0, 0x05, 0xe8, 0x8e, 0x35, - 0x9e, 0x66, 0x64, 0x82, 0x62, 0x96, 0xe6, 0x7d, 0xb6, 0x76, 0x25, 0x90, - 0x73, 0x47, 0x5a, 0xf0, 0xe4, 0x1d, 0x49, 0x6b, 0x14, 0xdf, 0x20, 0x6c, - 0xc1, 0x1d, 0x15, 0x48, 0x3c, 0xa3, 0xc1, 0x9a, 0x84, 0x11, 0x54, 0xcf, - 0x77, 0x1a, 0xfc, 0x11, 0x61, 0x16, 0xc5, 0x48, 0x06, 0x9d, 0x33, 0x49, - 0xc8, 0x78, 0x01, 0xa9, 0xcc, 0x3d, 0x75, 0x54, 0x10, 0x41, 0x29, 0x10, - 0x87, 0x7d, 0x5a, 0x4d, 0x0b, 0x09, 0x9a, 0xad, 0x3f, 0xb6, 0xf9, 0x66, - 0xe5, 0xd1, 0xca, 0x78, 0x44, 0x33, 0x85, 0xe8, 0x66, 0x4f, 0x02, 0xda, - 0x3a, 0x55, 0x3c, 0x3e, 0x25, 0x6d, 0xe2, 0x8c, 0x3b, 0x31, 0x36, 0xd5, - 0x0a, 0xba, 0x61, 0x68, 0x55, 0xd1, 0x90, 0xef, 0xec, 0x0d, 0x55, 0x42, - 0xaa, 0x20, 0x31, 0x21, 0xf3, 0xdd, 0xd6, 0xb8, 0xe0, 0x18, 0x88, 0x20, - 0xb3, 0xd8, 0x9e, 0x0b, 0x9d, 0x71, 0x6f, 0x0e, 0x4c, 0x3b, 0x89, 0xbb, - 0x71, 0x15, 0x9f, 0x48, 0x03, 0x5f, 0x46, 0x31, 0x86, 0x68, 0x36, 0x7e, - 0xe9, 0x7a, 0xaf, 0x06, 0xc6, 0x36, 0x79, 0x34, 0x62, 0x30, 0x80, 0x08, - 0x8f, 0xff, 0x7e, 0xb7, 0xed, 0x80, 0xa4, 0xe9, 0x7f, 0xa3, 0x8a, 0xa1, - 0x63, 0xf3, 0x83, 0xa2, 0x05, 0xac, 0x8c, 0xbe, 0xfc, 0x91, 0x79, 0x63, - 0x9b, 0x13, 0xc9, 0x9b, 0x18, 0x3e, 0x9f, 0xe5, 0xf7, 0xfb, 0x9f, 0x8b, - 0x7c, 0xfc, 0xc2, 0x28, 0x13, 0x24, 0xd2, 0x82, 0xb5, 0x47, 0x36, 0x68, - 0x1c, 0xfa, 0xed, 0x5b, 0xa0, 0x6a, 0xc3, 0x65, 0xfe, 0x87, 0x1a, 0xe1, - 0x79, 0x43, 0xb4, 0xce, 0x1f, 0xa5, 0x31, 0xee, 0xd3, 0x88, 0xd0, 0x8f, - 0x24, 0xab, 0x02, 0x84, 0xcc, 0x48, 0x7e, 0x93, 0xc3, 0x99, 0x2f, 0xde, - 0x39, 0x87, 0x68, 0x39, 0xb5, 0x26, 0x29, 0x57, 0xdf, 0x35, 0x31, 0x45, - 0x47, 0x2c, 0x01, 0xe6, 0x7e, 0x13, 0xf9, 0x83, 0xf2, 0xa1, 0xf0, 0x4b, - 0x99, 0x97, 0x6c, 0xc0, 0xb7, 0xff, 0x33, 0x55, 0x85, 0xa3, 0xd2, 0xb7, - 0xaf, 0x05, 0xf5, 0x65, 0x8f, 0xed, 0x2b, 0x5f, 0x26, 0xda, 0xd0, 0x9a, - 0x05, 0x4a, 0x00, 0xeb, 0xf0, 0x96, 0x42, 0xab, 0xd6, 0x92, 0xc6, 0xe7, - 0x80, 0xde, 0x1f, 0xe2, 0x92, 0x4c, 0xe1, 0x11, 0xf4, 0x02, 0xc1, 0x8e, - 0xb5, 0x13, 0x22, 0x5b, 0x1f, 0x5b, 0x22, 0x4e, 0xac, 0x65, 0xa0, 0xfc, - 0x66, 0x72, 0x53, 0x33, 0x37, 0x69, 0xfb, 0x1a, 0x8f, 0xa8, 0x7f, 0x34, - 0x5a, 0x19, 0xbf, 0x89, 0x59, 0x97, 0x67, 0x1e, 0xa5, 0xb2, 0xc4, 0x5f, - 0x8c, 0xa2, 0xa6, 0x98, 0x0b, 0x6f, 0xf9, 0x69, 0x50, 0x55, 0x90, 0x5e, - 0x3f, 0x54, 0x6c, 0xab, 0xc7, 0x81, 0x98, 0xbe, 0x2d, 0x8f, 0x34, 0x2a, - 0x51, 0x4a, 0x43, 0x79, 0xe5, 0x46, 0x34, 0xa8, 0xa7, 0x1e, 0x30, 0x90, - 0x94, 0x78, 0xc1, 0x29, 0xf8, 0xe7, 0x2c, 0xe7, 0xc8, 0xfc, 0x49, 0xf8, - 0x2e, 0xf3, 0x6f, 0xac, 0xce, 0x53, 0x52, 0x0c, 0x78, 0x8f, 0x9a, 0x40, - 0x5b, 0x1d, 0x83, 0xc8, 0xc6, 0x8e, 0x56, 0xba, 0x1b, 0xbd, 0x8d, 0x6c, - 0x05, 0x76, 0xe0, 0xb8, 0xef, 0xf7, 0xc0, 0x8e, 0x18, 0xe4, 0x31, 0xb1, - 0x43, 0x6e, 0x64, 0xb4, 0xef, 0xe6, 0xa8, 0x98, 0x1f, 0x4f, 0xb8, 0xfa, - 0xbd, 0x5b, 0xe0, 0xc5, 0x9f, 0xa7, 0x53, 0x96, 0x76, 0xb7, 0x5f, 0x3d, - 0x8f, 0x43, 0x30, 0xea, 0x66, 0x21, 0x15, 0xc7, 0xbe, 0xbb, 0x53, 0x1f, - 0xb8, 0x2b, 0x32, 0x91, 0xd6, 0xbe, 0x97, 0xd2, 0x77, 0x7a, 0x56, 0x34, - 0x4b, 0x2e, 0xb4, 0xd4, 0x4b, 0x0b, 0xed, 0xc5, 0x5c, 0xd0, 0xeb, 0xd9, - 0x5a, 0xf0, 0x26, 0x79, 0x8c, 0x33, 0x8a, 0x0d, 0xc8, 0xef, 0x01, 0x98, - 0xf6, 0x7e, 0xdb, 0x79, 0x9e, 0xab, 0x0d, 0xa0, 0x76, 0xdd, 0xb4, 0xe9, - 0xc9, 0x5c, 0x21, 0x80, 0xa6, 0x19, 0xc6, 0xe8, 0x93, 0xa5, 0x86, 0xc8, - 0x91, 0xb1, 0x56, 0x7b, 0x84, 0xcf, 0xff, 0xf0, 0x15, 0x6e, 0xcd, 0xda, - 0x8f, 0x39, 0xd6, 0x04, 0xc8, 0xb4, 0x79, 0x3b, 0x35, 0x4b, 0xc3, 0x07, - 0xf6, 0x43, 0x5b, 0x6e, 0x25, 0x10, 0xba, 0x72, 0x6c, 0x15, 0x32, 0x1b, - 0xae, 0xe9, 0xf4, 0xb4, 0xed, 0xaf, 0x75, 0xae, 0x57, 0x0a, 0x80, 0xab, - 0xef, 0x43, 0xce, 0x1e, 0xe1, 0xdc, 0x4e, 0xb3, 0xca, 0x5b, 0x5e, 0x47, - 0x3c, 0xbb, 0xbb, 0xb9, 0x5e, 0xe1, 0x83, 0x16, 0xb8, 0x81, 0x93, 0x21, - 0xd7, 0x84, 0x51, 0xc5, 0x22, 0x9e, 0x09, 0xfb, 0x40, 0xa6, 0x84, 0x89, - 0xed, 0x12, 0xa2, 0x8d, 0xf0, 0xc5, 0xfe, 0x48, 0x1a, 0x1c, 0x04, 0x86, - 0x35, 0xa8, 0xd1, 0xec, 0x2c, 0x82, 0x02, 0xe5, 0x86, 0x22, 0x1c, 0xc6, - 0x86, 0x92, 0xbf, 0x6f, 0x8b, 0xa9, 0x27, 0xef, 0xfb, 0x9e, 0x1a, 0xed, - 0xb4, 0x15, 0xd9, 0xcf, 0x60, 0x12, 0x0c, 0x54, 0xda, 0xe5, 0xc4, 0x2d, - 0x09, 0x86, 0xc7, 0x2c, 0x66, 0x42, 0x09, 0x83, 0x01, 0x60, 0x01, 0xfe, - 0x74, 0xba, 0xed, 0x7b, 0x20, 0x73, 0xcb, 0xeb, 0xb6, 0xb6, 0x6f, 0xcf, - 0x2f, 0x5c, 0x1d, 0xb3, 0xf2, 0x32, 0x0e, 0xd8, 0xaf, 0x8c, 0xf0, 0x7d, - 0x62, 0xc7, 0x08, 0xdb, 0xba, 0xc1, 0x92, 0xe7, 0x32, 0x57, 0xce, 0xbc, - 0x89, 0x59, 0x67, 0xc4, 0xfc, 0x65, 0xe2, 0x80, 0x51, 0x9f, 0xb8, 0x36, - 0x21, 0xc6, 0x5b, 0x6f, 0x7f, 0xe8, 0xbf, 0xa0, 0x0e, 0x5b, 0x07, 0x76, - 0xcd, 0x88, 0xff, 0xe7, 0x5e, 0xbf, 0x18, 0xe0, 0xda, 0x80, 0xd6, 0x66, - 0x88, 0x40, 0xfb, 0x48, 0x11, 0x9d, 0xab, 0xb7, 0x26, 0x89, 0x89, 0xe5, - 0xc5, 0x63, 0x82, 0x67, 0x92, 0x49, 0xe0, 0xbd, 0xa4, 0x1a, 0x99, 0x1a, - 0x31, 0xef, 0x76, 0xe8, 0xf6, 0x62, 0x30, 0xcf, 0x9d, 0xbe, 0x80, 0x69, - 0x63, 0xd2, 0x55, 0x0d, 0x76, 0xe4, 0x6e, 0xac, 0xbc, 0x82, 0x18, 0x96, - 0x08, 0x7c, 0xbc, 0xfc, 0x44, 0x3b, 0x77, 0x9c, 0x0a, 0x40, 0xe0, 0xdb, - 0x01, 0xf7, 0xd4, 0x2d, 0x0d, 0x1c, 0xd0, 0x17, 0x77, 0xe3, 0x18, 0xfa, - 0xa9, 0x9b, 0x4d, 0x57, 0x57, 0x92, 0xa6, 0xc9, 0xd4, 0x0e, 0x51, 0xbe, - 0x28, 0x5a, 0x9f, 0x01, 0x65, 0x7d, 0x9c, 0x90, 0xb3, 0xbf, 0x34, 0x80, - 0xe1, 0xb3, 0xc8, 0xe9, 0x7d, 0xdb, 0x11, 0xe9, 0x9f, 0x2b, 0x7d, 0xa6, - 0x43, 0xd4, 0x48, 0xcf, 0xe7, 0x50, 0x6e, 0x0b, 0xe4, 0x82, 0xc0, 0xcf, - 0xc6, 0xad, 0x6a, 0x75, 0xc8, 0x25, 0x48, 0x2a, 0x64, 0x19, 0x87, 0x47, - 0xea, 0x65, 0x36, 0x9c, 0x21, 0x3e, 0x32, 0xd5, 0xf3, 0x3f, 0x72, 0xce, - 0xf8, 0xf9, 0xe0, 0x42, 0x36, 0x1a, 0x9c, 0x25, 0x01, 0x70, 0xd6, 0x7f, - 0xa7, 0xe5, 0x6a, 0x9a, 0xb1, 0x54, 0x38, 0xf3, 0x5f, 0x8c, 0xc3, 0x05, - 0xd6, 0x1b, 0xdb, 0x6e, 0xa3, 0x58, 0xf6, 0x56, 0x1c, 0xc0, 0x47, 0xec, - 0x4a, 0x89, 0x51, 0xab, 0x8f, 0xee, 0xbb, 0xcf, 0x41, 0xfb, 0xe2, 0xf5, - 0x05, 0xf6, 0xb1, 0xda, 0x72, 0xf2, 0xff, 0x7d, 0xd9, 0x07, 0x4d, 0xe3, - 0x3a, 0x9a, 0x1b, 0xbd, 0x4b, 0x5a, 0x18, 0x1d, 0xdb, 0x1f, 0x06, 0xbc, - 0x09, 0xc6, 0xc4, 0xca, 0xb5, 0x3f, 0xc5, 0xb1, 0xf6, 0xf5, 0x72, 0x5c, - 0x0a, 0xa5, 0x2a, 0xd9, 0xf2, 0x94, 0xd5, 0x91, 0x41, 0xf5, 0xda, 0xbd, - 0x25, 0xd2, 0x80, 0x80, 0xf9, 0x17, 0x40, 0xf4, 0x40, 0x18, 0x29, 0x6a, - 0xca, 0xf4, 0x11, 0x1f, 0xbd, 0x7f, 0x2f, 0xbf, 0x35, 0x26, 0x88, 0x45, - 0xf0, 0x0e, 0x40, 0x35, 0x64, 0xba, 0x64, 0xfa, 0x6c, 0x0d, 0x58, 0x63, - 0x62, 0x64, 0x24, 0xb5, 0xd9, 0x7b, 0x82, 0x08, 0xe0, 0xf3, 0xff, 0x91, - 0xff, 0x9f, 0x66, 0x16, 0x77, 0x97, 0x4c, 0x74, 0x81, 0xc2, 0xab, 0x04, - 0xf8, 0x87, 0x02, 0xb7, 0x45, 0x53, 0x92, 0x78, 0xec, 0x92, 0xdd, 0x88, - 0x8e, 0x3f, 0x8a, 0x78, 0x6c, 0xc2, 0x4b, 0x1e, 0x44, 0xdd, 0xf6, 0xc0, - 0xb1, 0x60, 0x9b, 0xa7, 0x48, 0xc6, 0x89, 0x7b, 0xa8, 0x8f, 0x49, 0xfc, - 0x17, 0x1f, 0x90, 0x34, 0xb0, 0x1d, 0xa7, 0x89, 0x41, 0x25, 0xd7, 0xcc, - 0x46, 0xb0, 0xfa, 0x38, 0x7c, 0x7f, 0xc8, 0xa4, 0xb6, 0x96, 0x62, 0x19, - 0xfb, 0x6f, 0xaf, 0xe4, 0x1f, 0x0e, 0x58, 0x05, 0x4c, 0x37, 0x21, 0x00, - 0x61, 0x22, 0xea, 0x54, 0x59, 0xc0, 0x85, 0xea, 0xe1, 0x3c, 0x91, 0x84, - 0xeb, 0x14, 0xc9, 0x6b, 0x73, 0x49, 0xd0, 0xd3, 0xb8, 0x34, 0x76, 0x87, - 0xe3, 0x89, 0x65, 0x1f, 0x10, 0x97, 0xad, 0x6d, 0x6b, 0x51, 0xa9, 0x64, - 0xb9, 0xad, 0x00, 0xfe, 0xb6, 0x7d, 0xc8, 0x38, 0x5d, 0x23, 0x4f, 0x8e, - 0x9c, 0xb1, 0x9b, 0x6d, 0x5e, 0xb4, 0xfe, 0xad, 0xbd, 0xcb, 0x22, 0x8f, - 0x1c, 0xcd, 0x68, 0x66, 0x11, 0x5e, 0x52, 0x73, 0x91, 0x5f, 0x14, 0x4e, - 0x67, 0x65, 0xc1, 0x03, 0x1f, 0x9d, 0x08, 0x90, 0x72, 0xf2, 0xcb, 0x11, - 0x39, 0xbc, 0xb7, 0x28, 0x5b, 0xb3, 0xd9, 0x52, 0x42, 0x64, 0x86, 0x55, - 0xd2, 0x5f, 0xb5, 0x5d, 0x7d, 0x9b, 0x21, 0x0a, 0x51, 0xec, 0x9d, 0xd6, - 0x27, 0x96, 0x5e, 0xad, 0x00, 0x6b, 0x66, 0x6d, 0x96, 0x81, 0xf5, 0xb0, - 0x86, 0x08, 0x48, 0x2e, 0x01, 0x27, 0xd4, 0xf6, 0xac, 0x11, 0xf5, 0x4d, - 0x87, 0x61, 0xcb, 0x42, 0xa9, 0x40, 0xfd, 0x44, 0xa9, 0x04, 0x92, 0x7c, - 0x17, 0x36, 0xdc, 0x2e, 0xde, 0xf1, 0x74, 0x79, 0xce, 0x0e, 0x43, 0x53, - 0x6e, 0xbe, 0xb5, 0xce, 0x0e, 0xcc, 0xa8, 0x50, 0x83, 0x57, 0xf0, 0x1a, - 0x74, 0xea, 0x75, 0x1a, 0x91, 0x83, 0x51, 0x2f, 0x93, 0x18, 0x2e, 0x17, - 0xa9, 0xe4, 0x6c, 0xa2, 0x9a, 0xb3, 0xc1, 0x8f, 0x1e, 0x55, 0x5d, 0x5d, - 0x10, 0x4f, 0x42, 0x03, 0xac, 0xf7, 0x74, 0x2c, 0x9d, 0xee, 0xb2, 0xc9, - 0x77, 0x35, 0x02, 0x9b, 0xe9, 0xf9, 0xb3, 0x41, 0x63, 0xac, 0x5b, 0x8d, - 0x33, 0xa5, 0x43, 0xb0, 0x48, 0x36, 0x01, 0xa1, 0x35, 0xad, 0x49, 0xfe, - 0x36, 0x60, 0x6e, 0xba, 0x0a, 0xb4, 0x46, 0x95, 0xe1, 0xf5, 0xf8, 0x7b, - 0x67, 0x53, 0xf9, 0x54, 0x5b, 0x44, 0x3e, 0xa9, 0x72, 0xc8, 0x67, 0xf5, - 0xa0, 0xf7, 0x79, 0x12, 0xb9, 0x37, 0x9c, 0x92, 0x71, 0x90, 0xb9, 0x22, - 0xc9, 0x66, 0x64, 0x10, 0x0e, 0x45, 0x66, 0x74, 0xbe, 0x94, 0xbc, 0x84, - 0x2a, 0xe4, 0x98, 0x51, 0xb1, 0x01, 0x6d, 0x7b, 0xdd, 0xe3, 0x2f, 0x94, - 0xf4, 0x8d, 0x25, 0xee, 0xe4, 0x22, 0x4e, 0xb6, 0xc6, 0x15, 0xec, 0x8c, - 0x4c, 0x48, 0xf8, 0x7b, 0x8a, 0x28, 0x24, 0xab, 0x35, 0xeb, 0x02, 0xd4, - 0x04, 0x57, 0xf1, 0xf3, 0x72, 0x09, 0x15, 0xcb, 0x53, 0x5e, 0x69, 0xd1, - 0x7f, 0x9e, 0xc8, 0x36, 0x69, 0x9d, 0x08, 0x59, 0xba, 0xec, 0x94, 0x94, - 0x1f, 0x28, 0xfd, 0x19, 0xac, 0xe5, 0xfb, 0xf5, 0xae, 0xe5, 0xed, 0xf0, - 0xc5, 0x2d, 0xf8, 0x02, 0x71, 0x41, 0x1f, 0x9e, 0x90, 0x8a, 0xb7, 0xf5, - 0x11, 0xd9, 0x1f, 0xf9, 0x93, 0x56, 0xa6, 0x0c, 0xf6, 0xc8, 0xed, 0x17, - 0xa9, 0x56, 0xc6, 0xd1, 0x88, 0x85, 0x36, 0x84, 0xd7, 0xee, 0xd9, 0xed, - 0x9d, 0x3a, 0x91, 0x3c, 0xf8, 0x50, 0x8d, 0x36, 0xaa, 0xe1, 0x0b, 0x2e, - 0xbe, 0xe9, 0x92, 0xe5, 0xeb, 0x48, 0xea, 0x4d, 0xdd, 0xb9, 0x4b, 0xf8, - 0x24, 0x7d, 0xf7, 0x16, 0x83, 0xb1, 0xb9, 0x66, 0x79, 0x81, 0x8c, 0x3e, - 0x59, 0x93, 0x82, 0xd6, 0x6c, 0xa3, 0x1f, 0xdd, 0x44, 0x06, 0xf7, 0x75, - 0xe2, 0x5f, 0x96, 0xa7, 0x6d, 0xbd, 0xec, 0x8c, 0x5b, 0x03, 0x47, 0x5e, - 0xec, 0xd1, 0xf9, 0x74, 0xc2, 0x68, 0x2d, 0xcc, 0x1e, 0xce, 0x5d, 0x71, - 0x66, 0x20, 0x0e, 0xa2, 0xa6, 0xad, 0x24, 0x2c, 0x49, 0x73, 0xee, 0x43, - 0x55, 0x54, 0x32, 0x7c, 0xe8, 0x67, 0x6e, 0x67, 0x85, 0x63, 0xf8, 0x13, - 0x61, 0x5a, 0x0d, 0x4c, 0xf3, 0xa3, 0xc8, 0x63, 0x34, 0x16, 0xfc, 0xf2, - 0xd5, 0x08, 0x3c, 0xf7, 0xe0, 0x7a, 0xe5, 0x04, 0x79, 0x7f, 0x96, 0x88, - 0xc4, 0x8a, 0x93, 0xda, 0xdf, 0x25, 0xcf, 0x4d, 0xce, 0x4d, 0x2f, 0x7a, - 0xe4, 0xef, 0x6c, 0x9f, 0xf7, 0x41, 0x17, 0x4c, 0xdf, 0xb5, 0x5e, 0x1b, - 0x9c, 0xd0, 0x50, 0x4f, 0x37, 0xaa, 0x22, 0x0d, 0xd9, 0x5e, 0x58, 0xd6, - 0x44, 0x2d, 0xde, 0x3e, 0xd7, 0x37, 0x15, 0x04, 0x46, 0xc8, 0x36, 0x2c, - 0x44, 0x91, 0x69, 0x83, 0x67, 0xbe, 0xf1, 0x33, 0x7a, 0x12, 0x2f, 0x30, - 0xe1, 0xc5, 0xb6, 0xbe, 0x29, 0xdc, 0x61, 0xf0, 0xd5, 0x32, 0x3c, 0xfb, - 0xb2, 0xfe, 0x9a, 0x6d, 0xd1, 0xc4, 0x93, 0x60, 0x5a, 0x9a, 0x3b, 0x63, - 0x0e, 0xb0, 0x20, 0x57, 0xef, 0x95, 0xf6, 0xce, 0xf9, 0x8e, 0x8d, 0x40, - 0x77, 0x6a, 0x84, 0x52, 0xbd, 0x3d, 0x59, 0x8f, 0xc6, 0xd6, 0x51, 0xcc, - 0x38, 0xeb, 0xf2, 0x97, 0xaf, 0x4f, 0x81, 0x9f, 0x2d, 0x42, 0x65, 0x33, - 0x8d, 0xc4, 0xac, 0xb0, 0x6a, 0xfe, 0xf8, 0xe1, 0x41, 0x1b, 0xfc, 0x81, - 0x79, 0xf8, 0xcf, 0xc0, 0xdc, 0xed, 0x13, 0xd0, 0x5e, 0x01, 0x24, 0x37, - 0x62, 0x17, 0x8a, 0x41, 0xad, 0x0a, 0xc0, 0xca, 0xa2, 0xd1, 0xfd, 0x2b, - 0x44, 0xc8, 0xdd, 0x48, 0xee, 0x4f, 0x30, 0x91, 0x1e, 0x6f, 0xb6, 0xa5, - 0x00, 0x60, 0xe9, 0x57, 0xa9, 0x05, 0x86, 0xa3, 0x93, 0xb2, 0xfd, 0x21, - 0x3a, 0x18, 0xb9, 0xb5, 0xbd, 0x49, 0xdc, 0x79, 0xd8, 0x8a, 0xd1, 0x8d, - 0x80, 0xe6, 0xe5, 0x14, 0xbf, 0xa7, 0x60, 0x1c, 0x1d, 0x1a, 0xa2, 0x12, - 0x77, 0x6c, 0xbf, 0x9b, 0x84, 0x9d, 0x86, 0xc2, 0xdb, 0x27, 0xb3, 0x71, - 0xc7, 0xab, 0xe6, 0x6c, 0xfa, 0x03, 0xe8, 0xb5, 0x75, 0xed, 0xb7, 0xd6, - 0xef, 0x69, 0x68, 0x5b, 0x56, 0x2e, 0xa7, 0x83, 0x9d, 0x73, 0x97, 0x3b, - 0x90, 0x52, 0x8e, 0xa0, 0xe5, 0xff, 0x00, 0xbc, 0x87, 0x61, 0x9a, 0xf5, - 0x03, 0x94, 0x36, 0x40, 0x5c, 0xab, 0x03, 0xda, 0x70, 0xfe, 0x22, 0xaf, - 0xed, 0xbc, 0x4c, 0x41, 0x6f, 0x48, 0xd3, 0x10, 0x33, 0xbe, 0xe4, 0x6a, - 0x24, 0x2e, 0x41, 0x7f, 0xb9, 0xf5, 0x4c, 0xd1, 0x61, 0x9e, 0x2f, 0x13, - 0x3a, 0x38, 0xdd, 0xc5, 0xca, 0xc0, 0xbf, 0x3d, 0x75, 0x1b, 0xf6, 0x55, - 0x31, 0x61, 0xd1, 0x67, 0x6d, 0x66, 0x57, 0xb9, 0x56, 0xb4, 0x79, 0xdf, - 0x91, 0xe2, 0x2b, 0x13, 0xec, 0x65, 0x00, 0x16, 0x7c, 0x40, 0xcb, 0xd1, - 0x1a, 0xf8, 0x5e, 0x6d, 0x55, 0x9b, 0x47, 0x92, 0x8c, 0x74, 0x10, 0x6c, - 0x49, 0xca, 0x2b, 0x42, 0x27, 0x36, 0x38, 0x1e, 0xa4, 0x6f, 0x90, 0x9d, - 0x68, 0x67, 0x05, 0xa1, 0xd6, 0x89, 0x9f, 0x70, 0xac, 0xb4, 0xe5, 0xe5, - 0xa8, 0x59, 0xe7, 0x55, 0xdd, 0x3e, 0x33, 0xbb, 0xcf, 0x3f, 0x7e, 0xe8, - 0xfc, 0x3f, 0xed, 0x94, 0xf3, 0x3b, 0x46, 0xb1, 0x28, 0x1e, 0x3f, 0x69, - 0x75, 0xa8, 0xe2, 0x9b, 0x25, 0xdb, 0x83, 0xbe, 0x2a, 0x2c, 0x73, 0x20, - 0x0c, 0xed, 0xb3, 0xdd, 0x19, 0xe1, 0xa2, 0x85, 0x52, 0xfe, 0xca, 0x1e, - 0x6c, 0x3b, 0x49, 0x14, 0x76, 0x2c, 0x73, 0x80, 0xa8, 0xb4, 0x7c, 0x38, - 0xad, 0x4f, 0x45, 0x41, 0x55, 0x9c, 0x95, 0x0a, 0x06, 0x90, 0xb8, 0x17, - 0xa8, 0x9c, 0x81, 0xe7, 0x85, 0x3e, 0x33, 0x2f, 0xe6, 0x46, 0x08, 0x8f, - 0x01, 0x9d, 0xeb, 0x52, 0x5a, 0x4d, 0x31, 0xc2, 0x3f, 0x15, 0x7f, 0x1e, - 0x04, 0x4f, 0x12, 0xcd, 0x1c, 0xa4, 0x97, 0x2f, 0xbc, 0xb6, 0x48, 0x17, - 0xd2, 0x2e, 0x52, 0x66, 0x50, 0x78, 0x6c, 0xaf, 0xc4, 0x2f, 0x90, 0x9a, - 0xa6, 0xbc, 0x49, 0xad, 0xd3, 0x97, 0x1d, 0x0f, 0x54, 0xc0, 0xc6, 0x91, - 0xe7, 0x0e, 0xd4, 0x7c, 0xcc, 0x4c, 0xa5, 0xb8, 0x4a, 0xd3, 0xcd, 0x6a, - 0xb9, 0x88, 0x33, 0xd1, 0x83, 0xbd, 0xa5, 0xeb, 0x4e, 0xc6, 0x2b, 0xa3, - 0x6a, 0xf9, 0xb6, 0xdc, 0x7e, 0x45, 0xb6, 0x4f, 0xe3, 0x86, 0xdf, 0x47, - 0xa6, 0x5d, 0xa5, 0x82, 0xdd, 0x1b, 0x80, 0x73, 0x23, 0xff, 0x66, 0x8e, - 0xef, 0x3d, 0xea, 0x62, 0x5c, 0x53, 0x57, 0xf3, 0xfe, 0x8b, 0xe5, 0xfe, - 0x79, 0x19, 0x4b, 0xa4, 0xc2, 0x6e, 0xc9, 0x35, 0xe2, 0x99, 0xc0, 0x86, - 0x19, 0x01, 0x75, 0xd6, 0x20, 0x10, 0x97, 0x0e, 0x6d, 0x02, 0x97, 0xca, - 0xcd, 0x34, 0xd3, 0xa7, 0xb9, 0x59, 0x50, 0xbf, 0x3d, 0x8c, 0x8b, 0xd5, - 0xe3, 0x3d, 0xe7, 0x5d, 0xd4, 0x72, 0xd7, 0xf4, 0x67, 0x5b, 0xeb, 0xde, - 0xe9, 0x7b, 0x2d, 0x61, 0x21, 0xf1, 0x21, 0x37, 0xa9, 0xe2, 0x3b, 0xcc, - 0x06, 0x3b, 0xc4, 0x16, 0x82, 0x1e, 0x82, 0x4b, 0xe4, 0x69, 0x6f, 0x4e, - 0xdd, 0x30, 0xb4, 0x1a, 0x18, 0x3a, 0xa6, 0x65, 0x95, 0xf3, 0xd7, 0xd8, - 0x28, 0xd1, 0xf1, 0xad, 0x2c, 0xa9, 0x35, 0x2d, 0xd2, 0xc2, 0xd0, 0xf1, - 0xcd, 0x9f, 0x3b, 0xa4, 0x1d, 0x71, 0xf8, 0xa3, 0x28, 0xa7, 0x4d, 0xfc, - 0x17, 0x6e, 0x50, 0xed, 0xe7, 0x0e, 0x39, 0x14, 0xc8, 0x62, 0x04, 0x50, - 0x5a, 0x9b, 0x76, 0x40, 0xbf, 0x7e, 0xa4, 0x10, 0xb1, 0x29, 0xdb, 0x4c, - 0x55, 0x46, 0xc8, 0x41, 0xd0, 0x33, 0xdd, 0x89, 0x23, 0xcb, 0x42, 0x3f, - 0x0c, 0x4c, 0xa7, 0x12, 0x71, 0xa6, 0xe2, 0x88, 0x6e, 0x9a, 0x43, 0x11, - 0x66, 0xfa, 0xc4, 0x32, 0x2b, 0xea, 0x85, 0xc5, 0x80, 0x09, 0xb8, 0xa3, - 0x55, 0x54, 0xa9, 0xf5, 0x22, 0xcf, 0xa7, 0x75, 0x8f, 0xfd, 0x7e, 0xd8, - 0x0d, 0x76, 0x7b, 0x0f, 0x26, 0x4c, 0xcb, 0x9e, 0x0d, 0x44, 0x24, 0xe7, - 0x07, 0x12, 0x4d, 0x3f, 0x12, 0xac, 0x52, 0x71, 0x65, 0xf6, 0x65, 0xb0, - 0x7e, 0xa2, 0x07, 0xad, 0x20, 0x9d, 0x5d, 0x5e, 0x7c, 0x3c, 0xe2, 0xed, - 0xe2, 0xd7, 0x2c, 0xba, 0x8a, 0xdf, 0xd9, 0xeb, 0x17, 0x53, 0xa7, 0xbd, - 0xe0, 0xa4, 0x23, 0x9d, 0xdc, 0xd7, 0x77, 0xd1, 0xa8, 0xe3, 0xc3, 0x0a, - 0x18, 0x7a, 0x06, 0xe6, 0xe6, 0x1b, 0xf1, 0xa3, 0xb9, 0xd2, 0xa3, 0x00, - 0x1c, 0x17, 0x6d, 0x76, 0xd1, 0xa6, 0x70, 0x05, 0xd1, 0x66, 0x78, 0x9a, - 0x34, 0x5e, 0x4d, 0x5b, 0xca, 0x95, 0x3b, 0xca, 0x2a, 0xfc, 0xa8, 0x40, - 0xa5, 0x31, 0x9c, 0xb5, 0xe3, 0x0f, 0x41, 0xaa, 0xce, 0x55, 0xae, 0xff, - 0xa7, 0x39, 0xf8, 0x75, 0x19, 0xee, 0xa4, 0xea, 0xf6, 0x23, 0xd1, 0x6c, - 0x22, 0xef, 0x12, 0x03, 0xea, 0xfa, 0xec, 0x3d, 0xf1, 0xfa, 0xec, 0xdb, - 0xa1, 0x3a, 0x2a, 0x0b, 0xef, 0xa6, 0x53, 0xb1, 0x39, 0x51, 0x5a, 0x79, - 0x65, 0x7c, 0xbb, 0xc5, 0xcb, 0xde, 0xda, 0x62, 0x50, 0x60, 0xac, 0x23, - 0xc9, 0x38, 0xd4, 0x3d, 0x07, 0x84, 0xe2, 0xbe, 0x2e, 0x04, 0xab, 0x29, - 0x34, 0xd7, 0x60, 0x5d, 0x11, 0x7e, 0x26, 0xdf, 0x10, 0x31, 0x5c, 0x60, - 0x6a, 0xa2, 0xab, 0xc1, 0x24, 0xd1, 0x2c, 0x76, 0x7c, 0x67, 0x3e, 0x5b, - 0x5f, 0x5b, 0x73, 0xa6, 0xc5, 0xad, 0x4c, 0x32, 0x89, 0x21, 0x4d, 0x8c, - 0x7b, 0x92, 0x4d, 0x18, 0xbd, 0xe3, 0x53, 0x8d, 0x0c, 0x65, 0xa8, 0xd7, - 0x6c, 0x6d, 0x59, 0x7a, 0x64, 0xb0, 0xf6, 0xb2, 0x20, 0x8f, 0x07, 0x1e, - 0xba, 0x86, 0xe1, 0x13, 0xcf, 0x77, 0xba, 0xeb, 0xab, 0x91, 0xd9, 0x32, - 0x33, 0x4e, 0xcf, 0x18, 0x87, 0x9f, 0xff, 0x4a, 0x1a, 0x92, 0x5d, 0xeb, - 0x79, 0x7c, 0x3f, 0xbd, 0xe6, 0xf0, 0xde, 0xea, 0xc7, 0x1c, 0x0f, 0x3c, - 0x08, 0xe4, 0x48, 0xf8, 0x27, 0x10, 0xd8, 0x61, 0xdd, 0x87, 0x3d, 0x7f, - 0x6a, 0xa5, 0xa8, 0xac, 0x7c, 0x30, 0x70, 0x1a, 0x0a, 0x03, 0x14, 0xde, - 0x79, 0xdd, 0xe1, 0x72, 0xbf, 0x73, 0x07, 0x77, 0xdd, 0xe5, 0xf7, 0x21, - 0xe8, 0xb1, 0x48, 0x63, 0x10, 0x7d, 0x38, 0xe3, 0xee, 0x0e, 0xbf, 0x0e, - 0x31, 0x90, 0xc3, 0x7f, 0x85, 0xdf, 0x4f, 0xbc, 0xcf, 0x47, 0x78, 0xdc, - 0xe0, 0xc7, 0xbf, 0x72, 0x5a, 0x2c, 0xdf, 0x72, 0x17, 0x32, 0xda, 0xdb, - 0x37, 0x60, 0x65, 0xd4, 0x29, 0xbe, 0x0f, 0xbc, 0xb3, 0x99, 0x4f, 0xff, - 0xae, 0xc9, 0xe8, 0xfd, 0xa1, 0x58, 0x79, 0x23, 0x38, 0x8c, 0x4a, 0x20, - 0xe1, 0x7e, 0x84, 0xb2, 0x78, 0x00, 0xdd, 0xbd, 0x3d, 0x4d, 0xb0, 0x40, - 0xb8, 0x75, 0x86, 0x5f, 0x89, 0x14, 0xd4, 0x8e, 0xba, 0x05, 0x19, 0x86, - 0xf5, 0x96, 0x7a, 0x26, 0x25, 0x1d, 0x97, 0x31, 0xc3, 0x52, 0x1d, 0xc2, - 0xf2, 0xca, 0x7a, 0xff, 0xf3, 0x12, 0x66, 0x3b, 0x5b, 0x13, 0xd2, 0x7f, - 0x90, 0x55, 0x90, 0x6b, 0x4a, 0xc3, 0x8e, 0x3b, 0x70, 0x02, 0x82, 0x42, - 0xd0, 0x48, 0x17, 0x51, 0xe0, 0xb5, 0x1f, 0x6f, 0xcf, 0x81, 0xf1, 0x58, - 0x40, 0xcc, 0x32, 0x17, 0xcf, 0xcf, 0x04, 0x42, 0xb2, 0x79, 0xd2, 0x80, - 0x61, 0x5f, 0x83, 0xf3, 0xcb, 0xa3, 0x82, 0xcb, 0x0c, 0xe2, 0x86, 0xb2, - 0x96, 0xd9, 0x30, 0xc5, 0xa9, 0xe6, 0xd3, 0xe0, 0xc6, 0x11, 0x15, 0xc2, - 0xd5, 0xdb, 0xcb, 0x7b, 0x95, 0xd8, 0x68, 0xaa, 0x03, 0x36, 0x64, 0xec, - 0x63, 0x78, 0x19, 0x5e, 0x14, 0xc8, 0x1b, 0x71, 0x12, 0xd4, 0x14, 0xf0, - 0x52, 0x5e, 0x65, 0x8b, 0x5e, 0x8d, 0xa2, 0x89, 0x47, 0x9b, 0xa9, 0x6a, - 0xc5, 0xa5, 0xf3, 0x8f, 0x9b, 0x22, 0x84, 0x94, 0x82, 0xed, 0xab, 0x85, - 0x0a, 0x2f, 0xcd, 0x34, 0x3b, 0xd1, 0xbd, 0x71, 0xdb, 0x4c, 0xd3, 0x0b, - 0x39, 0x45, 0x40, 0x82, 0xc6, 0xb2, 0xd1, 0xe7, 0x9d, 0x61, 0x41, 0xb4, - 0x26, 0x9c, 0x51, 0xab, 0x69, 0x59, 0x1a, 0xd4, 0x77, 0xf1, 0xe1, 0x3b, - 0x64, 0xaa, 0x81, 0x8e, 0xf7, 0x9d, 0x6f, 0x5f, 0x0f, 0x90, 0xdc, 0x39, - 0x77, 0xe5, 0x64, 0x79, 0x9e, 0x61, 0xcb, 0x73, 0x9d, 0xa1, 0xe3, 0x80, - 0x3a, 0x2c, 0x9f, 0x8d, 0xa6, 0xe4, 0x1a, 0x3a, 0xd1, 0xcb, 0xa5, 0x93, - 0x28, 0xa4, 0xc6, 0x5f, 0xf0, 0x2e, 0xea, 0x5c, 0x19, 0xf8, 0xb6, 0xd8, - 0xf6, 0xfd, 0x7e, 0x8b, 0x23, 0x3a, 0x98, 0xfb, 0xad, 0xd7, 0x72, 0x89, - 0xc9, 0x54, 0x23, 0x25, 0x87, 0xf8, 0xf7, 0x98, 0x00, 0x10, 0x70, 0xe2, - 0xc0, 0x5f, 0x0d, 0x08, 0x77, 0x58, 0xb6, 0xcf, 0x4a, 0x64, 0x7c, 0x5c, - 0x20, 0xe0, 0xa2, 0xc1, 0xdf, 0xbe, 0x4d, 0xb4, 0x6b, 0x04, 0x82, 0x1b, - 0xfd, 0xae, 0x1a, 0xca, 0xc2, 0xaf, 0x94, 0x2d, 0x50, 0xee, 0xf6, 0x36, - 0x69, 0x2e, 0x31, 0x67, 0xda, 0x3a, 0x23, 0xf7, 0x54, 0x68, 0x8f, 0xf1, - 0x04, 0x83, 0xd9, 0x44, 0xd5, 0x0b, 0xf5, 0x66, 0x0d, 0xa7, 0x86, 0x21, - 0x9a, 0x0a, 0x3b, 0x81, 0x19, 0x06, 0x5c, 0xe4, 0x65, 0x9e, 0x11, 0xa5, - 0xe7, 0xd1, 0xaf, 0x4e, 0x33, 0x91, 0xac, 0x0b, 0x44, 0x44, 0x02, 0xbd, - 0x73, 0xb9, 0x2e, 0xba, 0x62, 0x57, 0x8a, 0xa8, 0x29, 0x7d, 0x3b, 0xbb, - 0x0f, 0xdb, 0x9a, 0x6b, 0x4b, 0x78, 0x04, 0xe2, 0x31, 0x1d, 0x53, 0xbe, - 0x46, 0x55, 0x0e, 0x40, 0x94, 0x0f, 0x25, 0x28, 0x66, 0x79, 0x57, 0xb8, - 0x17, 0x6a, 0x06, 0x64, 0x26, 0x6a, 0x51, 0xf6, 0x86, 0x09, 0x3e, 0xef, - 0xf3, 0xa3, 0xd4, 0x2a, 0x6d, 0x8a, 0x49, 0x1c, 0xcb, 0xf9, 0x60, 0xda, - 0x00, 0x1f, 0x33, 0x04, 0xd9, 0x29, 0x03, 0x88, 0x90, 0xbf, 0xcc, 0xfa, - 0xd1, 0x7a, 0xaf, 0x93, 0x2e, 0xb5, 0x35, 0x1f, 0x39, 0xd4, 0xc0, 0xbd, - 0x68, 0x3b, 0x6a, 0x3a, 0xd7, 0xfd, 0x32, 0xc7, 0x11, 0xe5, 0xf4, 0x04, - 0xa4, 0x80, 0x5d, 0x1a, 0xd8, 0x02, 0x37, 0xcc, 0xca, 0xb4, 0xd2, 0xd5, - 0x97, 0x73, 0x21, 0x6e, 0xca, 0xc1, 0x1b, 0x3f, 0xe0, 0x2b, 0x27, 0x6c, - 0xc8, 0x30, 0xa3, 0xb4, 0xb7, 0xdf, 0xb0, 0xc0, 0x4f, 0xfb, 0xdc, 0x1c, - 0x23, 0x80, 0xd6, 0x72, 0x0f, 0x05, 0xab, 0x90, 0x67, 0xa3, 0x81, 0x17, - 0x08, 0x86, 0xc3, 0xbe, 0xd4, 0x66, 0xd1, 0xd7, 0x26, 0xae, 0xd0, 0x60, - 0xc3, 0x96, 0xa0, 0xec, 0xed, 0x14, 0x63, 0x46, 0x18, 0xd4, 0xba, 0x38, - 0x10, 0xfd, 0x90, 0xa0, 0xe5, 0x4f, 0x12, 0x3b, 0x78, 0xab, 0x01, 0xd7, - 0xd8, 0x45, 0x5d, 0xff, 0x13, 0x60, 0x1b, 0x50, 0xfa, 0xe6, 0xb4, 0x63, - 0x84, 0xef, 0x39, 0x07, 0x2e, 0x48, 0x9e, 0x42, 0xe7, 0xfa, 0xd4, 0xe3, - 0xf5, 0xdd, 0x64, 0x53, 0xde, 0xf4, 0xa7, 0xc0, 0x14, 0x8c, 0xb8, 0x12, - 0xdb, 0x4b, 0xc9, 0x60, 0xc3, 0x3d, 0x0c, 0xdb, 0x8b, 0x05, 0x8d, 0x3c, - 0x59, 0x79, 0x23, 0xce, 0x35, 0x90, 0x26, 0xd6, 0x01, 0x78, 0xae, 0x1a, - 0x42, 0x59, 0x58, 0x6d, 0xab, 0xf4, 0xa9, 0xe5, 0x49, 0x07, 0xf7, 0xb2, - 0xad, 0xd6, 0xb2, 0x52, 0x43, 0x48, 0x9a, 0x2e, 0x53, 0xc5, 0xfc, 0x2e, - 0x56, 0x50, 0x0d, 0x79, 0xa9, 0x44, 0xcf, 0xad, 0x0e, 0x41, 0xfd, 0xfc, - 0xb1, 0xcf, 0xbf, 0xc9, 0xac, 0x97, 0x8d, 0xcd, 0x99, 0x64, 0x3b, 0xd9, - 0xe9, 0xbd, 0xad, 0xb1, 0xfb, 0x45, 0x5d, 0x25, 0xcc, 0xa4, 0x49, 0x16, - 0xac, 0x1c, 0xbc, 0x15, 0x67, 0x9a, 0xd2, 0x95, 0x5a, 0x7a, 0x86, 0xcc, - 0x88, 0xee, 0x42, 0xb3, 0x6b, 0xe8, 0x24, 0x55, 0x29, 0x7a, 0x74, 0xc8, - 0xf5, 0xf4, 0x73, 0xef, 0x9f, 0x62, 0xff, 0xd8, 0xcd, 0xff, 0xed, 0x60, - 0xde, 0xe7, 0x84, 0xf5, 0xb1, 0xdb, 0x28, 0x20, 0x58, 0xfd, 0xa4, 0x4b, - 0x34, 0x06, 0x82, 0x42, 0xd0, 0x1d, 0x01, 0xf2, 0xfe, 0xd6, 0x1f, 0x6f, - 0xcf, 0x81, 0xf1, 0x58, 0x40, 0xcc, 0x32, 0x17, 0xcf, 0xcf, 0x04, 0x42, - 0xb2, 0x79, 0xd2, 0x80, 0x61, 0x5f, 0x83, 0xf3, 0xc5, 0x41, 0x73, 0xc9, - 0x49, 0x05, 0xfa, 0x79, 0x72, 0x95, 0x45, 0xac, 0xf3, 0x46, 0x76, 0x62, - 0xd1, 0xf6, 0xc7, 0x3b, 0xe2, 0xa8, 0x92, 0xc2, 0xb4, 0xe2, 0xcc, 0x80, - 0x86, 0xba, 0xd1, 0x61, 0x63, 0x78, 0x19, 0x5e, 0x14, 0x78, 0x1b, 0x71, - 0x12, 0xd4, 0x38, 0xf0, 0x52, 0x5e, 0x65, 0x8b, 0xbd, 0x28, 0xd5, 0x8d, - 0xd8, 0x6b, 0xa9, 0x01, 0x70, 0x84, 0x4a, 0x7b, 0x78, 0xdf, 0x43, 0xa8, - 0x4b, 0x47, 0xb8, 0x72, 0x5a, 0x7f, 0x5d, 0x12, 0x6f, 0xbd, 0x77, 0x21, - 0x4b, 0x7c, 0x27, 0xef, 0x25, 0x45, 0x40, 0x82, 0xc6, 0xb2, 0xd1, 0xe7, - 0x9d, 0x61, 0x41, 0xb4, 0x26, 0x9c, 0x51, 0xab, 0x75, 0x3e, 0x7f, 0xd0, - 0x53, 0x86, 0x06, 0xe2, 0xac, 0x89, 0xaf, 0x97, 0xbe, 0xb9, 0xcf, 0x52, - 0x0f, 0x90, 0xdc, 0x39, 0x77, 0xe5, 0x64, 0x79, 0x9e, 0x41, 0xcb, 0x73, - 0x9d, 0xa1, 0xeb, 0x80, 0xea, 0x94, 0xad, 0x67, 0x7e, 0xa8, 0xdd, 0x7d, - 0xb3, 0xc1, 0xea, 0xe4, 0x1d, 0xd5, 0xd0, 0x54, 0x3e, 0x98, 0xff, 0x49, - 0xe8, 0x5c, 0x4a, 0xee, 0xcb, 0x50, 0x06, 0x70, 0x4a, 0x1c, 0xfa, 0x84, - 0x59, 0xe1, 0x62, 0x6e, 0x81, 0x5e, 0x14, 0x8f, 0xf0, 0x2c, 0x24, 0xe7, - 0x6d, 0xd0, 0xab, 0x16, 0x2f, 0xfe, 0xc6, 0x88, 0xc6, 0x2c, 0xd2, 0x54, - 0x42, 0x7e, 0x93, 0x88, 0x7d, 0xbf, 0x63, 0x46, 0x5f, 0x11, 0xe1, 0xba, - 0x45, 0xc1, 0x4b, 0x87, 0x8d, 0xf6, 0xcc, 0xac, 0xa8, 0x30, 0x09, 0x11, - 0x91, 0xc9, 0xb5, 0x70, 0x81, 0xaf, 0x23, 0x76, 0x61, 0xf3, 0xda, 0x4a, - 0x1d, 0xd8, 0x3d, 0xc6, 0xa9, 0x13, 0xa0, 0x79, 0x31, 0x71, 0x7d, 0x46, - 0x60, 0x11, 0x44, 0xcf, 0xfd, 0xed, 0x03, 0x8b, 0x3b, 0xf8, 0x17, 0x13, - 0x3a, 0xf7, 0x10, 0x3d, 0xe7, 0xd9, 0x7f, 0xee, 0xcd, 0xee, 0x17, 0x8d, - 0xe5, 0x67, 0xa4, 0xa3, 0x32, 0xf0, 0x27, 0x0a, 0xee, 0x55, 0x36, 0x06, - 0xc2, 0x67, 0xd7, 0x14, 0x78, 0x79, 0x62, 0x61, 0xef, 0xaf, 0x0d, 0xfd, - 0xab, 0xc2, 0xe6, 0x42, 0xb3, 0xf3, 0xb6, 0xd1, 0x6c, 0x99, 0x15, 0x1f, - 0x98, 0x28, 0x29, 0xf2, 0xe0, 0x1c, 0xd4, 0x09, 0x97, 0xa7, 0xe5, 0x67, - 0xe2, 0x6b, 0xc3, 0xc2, 0x54, 0x4b, 0x08, 0x62, 0x9a, 0xb8, 0x86, 0xdc, - 0x4b, 0xa0, 0xd1, 0x51, 0x5f, 0xfa, 0x5b, 0x65, 0x56, 0x15, 0xae, 0x48, - 0x23, 0x78, 0xa6, 0x93, 0x6e, 0x4e, 0x60, 0x9b, 0x08, 0x65, 0xe4, 0x9e, - 0x52, 0x2b, 0xa8, 0x61, 0xa4, 0xf2, 0x6b, 0xbf, 0x3a, 0xf0, 0x7a, 0x8b, - 0x55, 0x58, 0xf1, 0xf1, 0x94, 0x88, 0xff, 0x67, 0x97, 0x2c, 0x02, 0x21, - 0x3d, 0xa0, 0x21, 0x02, 0x7c, 0xfb, 0xbf, 0x88, 0x58, 0x70, 0xb8, 0x4f, - 0x5c, 0x94, 0xc8, 0x95, 0x1d, 0x3e, 0xb7, 0x49, 0x6c, 0x0f, 0x02, 0xce, - 0x1f, 0x67, 0xf4, 0xb6, 0xa4, 0xf7, 0xc8, 0x98, 0x7f, 0xec, 0x14, 0x7d, - 0x7b, 0xdd, 0xea, 0x5f, 0xe6, 0xb3, 0xbd, 0x9e, 0x8d, 0x54, 0xf5, 0x15, - 0x18, 0x0e, 0x96, 0x35, 0xa9, 0x3c, 0x3c, 0xe6, 0xa4, 0xd9, 0x85, 0x74, - 0x1b, 0x23, 0xc3, 0x17, 0x89, 0xd4, 0x7f, 0x06, 0xf5, 0x14, 0xe3, 0x68, - 0xf8, 0x12, 0x6c, 0x53, 0x97, 0xad, 0xe8, 0x71, 0x48, 0xa3, 0x92, 0x3a, - 0x9c, 0x9c, 0x16, 0x89, 0x51, 0x39, 0x6e, 0x61, 0x15, 0x96, 0xc4, 0x7d, - 0x46, 0xcb, 0x1b, 0x8f, 0x60, 0x96, 0xf9, 0x02, 0x25, 0xdc, 0x5d, 0xf2, - 0xbc, 0x4f, 0xea, 0x59, 0xf0, 0x40, 0x89, 0xf3, 0x67, 0xe0, 0x35, 0x3b, - 0x9a, 0x2c, 0xa8, 0xb8, 0xbb, 0xdb, 0x41, 0x31, 0x6f, 0xf4, 0x85, 0x1e, - 0x95, 0xa6, 0xed, 0x1e, 0x43, 0x09, 0x78, 0x26, 0x65, 0x09, 0xa3, 0xd5, - 0x55, 0x87, 0x5f, 0xa3, 0xc8, 0x7c, 0xf0, 0xf7, 0x56, 0x0c, 0x7b, 0x58, - 0xb1, 0x24, 0x96, 0x53, 0xa3, 0xa4, 0x71, 0x7f, 0x84, 0x12, 0x1d, 0x73, - 0x07, 0x6a, 0x69, 0xe0, 0x25, 0x86, 0x27, 0x41, 0xca, 0x58, 0x68, 0x5e, - 0xaf, 0xa2, 0xb9, 0x47, 0xbf, 0xa2, 0x6f, 0xb5, 0x52, 0xd6, 0xb3, 0xb0, - 0x8b, 0xdd, 0xf6, 0xbd, 0xe5, 0x62, 0x69, 0x17, 0xe8, 0x27, 0x17, 0xef, - 0x14, 0xfa, 0xdd, 0x7e, 0xd9, 0x38, 0x22, 0x67, 0x79, 0xb4, 0xfb, 0xfe, - 0x5e, 0x99, 0x93, 0x47, 0x98, 0x43, 0x11, 0x5a, 0x29, 0x67, 0xd0, 0x77, - 0x6a, 0x20, 0x83, 0x42, 0xe4, 0x92, 0xfd, 0xdc, 0xa1, 0x6c, 0x83, 0xc6, - 0xb6, 0x0b, 0xf9, 0x27, 0xee, 0xdb, 0xb4, 0x0d, 0xf7, 0xe3, 0xc2, 0xa6, - 0x8e, 0xc6, 0x0a, 0xb3, 0xc6, 0x5e, 0xe8, 0x55, 0xac, 0xcc, 0x2a, 0x66, - 0x25, 0x64, 0x0d, 0x39, 0xb5, 0x8d, 0x26, 0x23, 0x57, 0x8c, 0xa4, 0x5e, - 0xf4, 0xd7, 0xb0, 0x56, 0x60, 0xe5, 0xab, 0x0e, 0x1d, 0x5e, 0x9c, 0x12, - 0x6f, 0x44, 0x7d, 0xb8, 0x5e, 0x9d, 0x12, 0x95, 0x68, 0xb7, 0x26, 0xb7, - 0x45, 0xaa, 0x27, 0xc2, 0x1a, 0x92, 0xcd, 0x64, 0xc6, 0xf1, 0x47, 0x54, - 0xea, 0x0a, 0xae, 0xd1, 0x7d, 0x05, 0x68, 0x1e, 0x0b, 0xa1, 0xf7, 0xa7, - 0xb9, 0x5c, 0x3e, 0xae, 0xd7, 0xaa, 0x2a, 0x72, 0x7a, 0x1e, 0x84, 0xf4, - 0x72, 0x0b, 0x81, 0x46, 0x01, 0xfd, 0x49, 0x92, 0xb4, 0xed, 0xc3, 0x07, - 0xdf, 0x35, 0x0b, 0xfa, 0x1d, 0xf1, 0xd2, 0xa3, 0xd3, 0x1a, 0xf9, 0x4e, - 0xfa, 0xb6, 0x0a, 0x0c, 0xe6, 0x99, 0x64, 0x0d, 0x75, 0x60, 0x65, 0x16, - 0x55, 0x18, 0x77, 0x4b, 0x06, 0x9e, 0x34, 0x64, 0xb6, 0xe2, 0x13, 0xa4, - 0xfc, 0xbd, 0x02, 0x87, 0xb7, 0x91, 0xe9, 0x4b, 0x8f, 0x73, 0x87, 0xf3, - 0x67, 0xcd, 0x6d, 0x49, 0xc3, 0xcc, 0xd1, 0x1c, 0xc1, 0xf3, 0x09, 0xdc, - 0x47, 0x25, 0x8d, 0x9a, 0x9d, 0x9d, 0xe8, 0x8a, 0x28, 0x67, 0x20, 0x09, - 0x9c, 0x13, 0xe0, 0x4f, 0x92, 0xef, 0xbf, 0x84, 0x63, 0x2e, 0x25, 0xf7, - 0x31, 0x70, 0xbc, 0xf9, 0xea, 0x6a, 0x41, 0x09, 0xe5, 0x89, 0xdc, 0xb0, - 0x6f, 0xbf, 0x94, 0x7c, 0x78, 0x00, 0xbc, 0xe3, 0x98, 0xff, 0x02, 0x72, - 0xd9, 0x79, 0x37, 0xc3, 0x88, 0x76, 0xce, 0x55, 0x3d, 0x3d, 0x3b, 0xd4, - 0x46, 0xee, 0x7e, 0x55, 0xb8, 0x2b, 0xac, 0x93, 0xb1, 0xd2, 0x07, 0x13, - 0x3b, 0xea, 0x0f, 0x7c, 0x92, 0x72, 0x2e, 0x8f, 0x9c, 0xaf, 0x5f, 0x8a, - 0x51, 0xc3, 0xd1, 0xd5, 0x9f, 0xc9, 0x3f, 0xd8, 0xb5, 0x6a, 0x29, 0x0d, - 0x09, 0x1e, 0x5b, 0xbd, 0x1e, 0x36, 0x9f, 0xf5, 0x0d, 0x6a, 0x69, 0x33, - 0x86, 0x6a, 0xa0, 0x5c, 0x0f, 0xcc, 0xe0, 0x6c, 0x51, 0x12, 0xe7, 0x14, - 0x4b, 0x48, 0xef, 0xc5, 0x2f, 0xdf, 0xcf, 0x7f, 0x42, 0x1f, 0x94, 0xc0, - 0xdc, 0x98, 0x62, 0x2a, 0x17, 0x28, 0x41, 0x1b, 0xb3, 0x56, 0x72, 0x18, - 0x96, 0xda, 0x57, 0x3b, 0xe7, 0x9c, 0x12, 0xb7, 0xce, 0xb5, 0x5b, 0x21, - 0x9f, 0x30, 0x5b, 0xcb, 0x3c, 0x77, 0x3f, 0x45, 0x66, 0xb2, 0xee, 0x7a, - 0x2e, 0x6e, 0xd7, 0x68, 0xb7, 0x22, 0x92, 0xe7, 0x6f, 0x84, 0xb5, 0x66, - 0x04, 0x56, 0x59, 0x3b, 0xa8, 0x00, 0xa2, 0xe0, 0x05, 0x0d, 0x72, 0x23, - 0x85, 0x50, 0x49, 0xdc, 0x14, 0x07, 0x3d, 0x7b, 0x0a, 0x91, 0xb0, 0xca, - 0xd0, 0x87, 0x60, 0xb5, 0xec, 0x84, 0xea, 0xfb, 0x9e, 0xc9, 0x04, 0x99, - 0x88, 0x19, 0x45, 0xdc, 0xf7, 0xc4, 0x72, 0x39, 0x0a, 0x7c, 0x98, 0xf0, - 0x42, 0xa8, 0x43, 0x39, 0x10, 0xab, 0xcd, 0x41, 0xd7, 0x09, 0x39, 0xaf, - 0x3f, 0x2f, 0x79, 0x4d, 0x8e, 0xd8, 0x21, 0xa9, 0xb5, 0xfe, 0xfb, 0xdf, - 0x79, 0x9c, 0x87, 0xbd, 0x8e, 0x80, 0x70, 0x04, 0x82, 0xf4, 0x52, 0x1b, - 0xe5, 0x58, 0x3f, 0xfd, 0xf1, 0xfc, 0xd9, 0xab, 0x12, 0xd0, 0x8a, 0xfc, - 0xe3, 0xd6, 0xf3, 0x79, 0x50, 0xe3, 0x64, 0x29, 0xc0, 0x81, 0x93, 0x91, - 0x12, 0xe6, 0x33, 0x88, 0x0b, 0x8b, 0x00, 0xd8, 0x19, 0x56, 0x02, 0x75, - 0xc3, 0x22, 0x20, 0x76, 0xd7, 0xcd, 0x3c, 0xfb, 0x69, 0x59, 0xa5, 0xa6, - 0xee, 0x70, 0x4d, 0xf4, 0x75, 0x21, 0xd8, 0xc9, 0xa0, 0x7b, 0xf2, 0x04, - 0x20, 0x5e, 0x51, 0xc2, 0xd7, 0xa1, 0x4d, 0x3c, 0x30, 0x84, 0xf8, 0x36, - 0x8c, 0x5c, 0xb7, 0xbf, 0xec, 0xd3, 0x99, 0x50, 0x60, 0xc6, 0x37, 0xe5, - 0x7b, 0x45, 0x6f, 0x24, 0xd4, 0xd7, 0x7f, 0x70, 0xba, 0xe7, 0xd6, 0x7b, - 0x3f, 0x5a, 0xe9, 0x81, 0xd0, 0x8e, 0x31, 0xfc, 0x3d, 0x43, 0x74, 0x36, - 0x91, 0x93, 0xb2, 0x01, 0x29, 0x22, 0xda, 0x87, 0xa6, 0xf3, 0x3a, 0xfc, - 0xa1, 0x25, 0x50, 0xb7, 0xe2, 0x8f, 0xb2, 0x14, 0x1d, 0x10, 0xd8, 0x10, - 0x86, 0x78, 0x1a, 0xa9, 0xbd, 0xc1, 0x2d, 0xc2, 0x4e, 0x87, 0x2f, 0xaa, - 0x1a, 0xdf, 0xe1, 0xcf, 0x02, 0x69, 0x33, 0xc8, 0x4d, 0xb8, 0xdd, 0x7c, - 0xff, 0x81, 0x39, 0x0d, 0x09, 0xf3, 0x3f, 0x7d, 0xfb, 0xfc, 0x31, 0x4e, - 0x91, 0x7c, 0x4e, 0xa5, 0x09, 0xc8, 0xa5, 0xe8, 0x32, 0x8a, 0x8b, 0x27, - 0x57, 0x3b, 0xc9, 0xc6, 0x17, 0x1f, 0x27, 0xc9, 0x2c, 0xc7, 0xa5, 0x17, - 0x4e, 0xa7, 0x17, 0x26, 0xfe, 0x52, 0x43, 0x09, 0x7a, 0x10, 0x6d, 0x3b, - 0x69, 0x32, 0x32, 0x44, 0x04, 0xe5, 0x9b, 0x16, 0xb0, 0x87, 0x6e, 0x00, - 0xca, 0x81, 0x5b, 0x4d, 0x76, 0x0c, 0xe4, 0xdd, 0xeb, 0xa1, 0xd0, 0x0c, - 0xa1, 0x90, 0x93, 0xea, 0xdd, 0xc3, 0x9a, 0x8d, 0x16, 0x66, 0x32, 0x42, - 0xc0, 0xde, 0xd2, 0xca, 0x78, 0x7c, 0xb4, 0x6f, 0x89, 0x5c, 0x26, 0x5a, - 0x56, 0x24, 0x78, 0x47, 0xa5, 0x3b, 0x23, 0x57, 0xc8, 0x58, 0xf3, 0x95, - 0xa1, 0xe2, 0x0f, 0xf8, 0xd9, 0x28, 0xab, 0xcb, 0xfe, 0xae, 0xb0, 0x15, - 0x44, 0xda, 0x01, 0x87, 0x68, 0x99, 0x32, 0xc6, 0x73, 0xe4, 0x75, 0xb2, - 0x7e, 0x80, 0xc2, 0x76, 0x7d, 0xf7, 0x9e, 0x64, 0x23, 0x6b, 0x1c, 0xaa, - 0xe9, 0x28, 0xf5, 0x39, 0xfd, 0x02, 0xc8, 0x57, 0x9f, 0x05, 0x6d, 0x80, - 0xdb, 0x98, 0x53, 0xd8, 0x3c, 0x81, 0xaf, 0x5a, 0x2e, 0x85, 0xde, 0xea, - 0x77, 0x6a, 0x69, 0xe4, 0xf2, 0x68, 0xed, 0xee, 0xcd, 0xf3, 0xa3, 0x45, - 0x94, 0xd3, 0xc6, 0xfa, 0x6a, 0xa6, 0xef, 0x27, 0xaa, 0x11, 0x6d, 0x52, - 0x33, 0x18, 0xc0, 0xc2, 0x7c, 0xcd, 0x80, 0x30, 0x49, 0x79, 0x81, 0x29, - 0x30, 0xaa, 0x3a, 0x7d, 0x32, 0x13, 0xdf, 0x6e, 0x20, 0x6d, 0x1f, 0x85, - 0xf3, 0xdd, 0x38, 0x59, 0x10, 0x6c, 0x7d, 0xa6, 0xfd, 0xd5, 0x9f, 0x8e, - 0xf3, 0xac, 0xe9, 0xb8, 0x18, 0xd1, 0x21, 0x71, 0xad, 0xe1, 0xe0, 0x68, - 0xf0, 0x03, 0x2f, 0xfc, 0x55, 0x82, 0x76, 0xdd, 0xda, 0x64, 0xde, 0x61, - 0x0c, 0x71, 0x3e, 0x25, 0x73, 0x22, 0x20, 0x9c, 0xcc, 0x85, 0xfd, 0x22, - 0x3b, 0x68, 0x13, 0x42, 0xcf, 0x5b, 0xd3, 0xb1, 0xee, 0x7f, 0xcf, 0xee, - 0xf3, 0x0b, 0x1f, 0xe7, 0x1e, 0x19, 0x10, 0x03, 0x6a, 0x3e, 0x5d, 0xfb, - 0xbc, 0x1a, 0x69, 0x12, 0xb0, 0x73, 0x51, 0x01, 0xf4, 0x4c, 0x13, 0x8e, - 0xea, 0xf3, 0x1e, 0xbb, 0x77, 0x27, 0x7d, 0x6e, 0xd1, 0x30, 0x2d, 0xbf, - 0x95, 0x84, 0x74, 0x2a, 0x88, 0xb2, 0x41, 0x68, 0x92, 0xdd, 0x10, 0xb2, - 0xcb, 0xf8, 0xbc, 0x36, 0xd5, 0xe8, 0xc3, 0x56, 0xf3, 0xcc, 0xd3, 0x2f, - 0x7c, 0x8c, 0x21, 0x9d, 0x22, 0xb6, 0xff, 0x3e, 0x79, 0x3f, 0xaa, 0xab, - 0x71, 0x04, 0xae, 0x9b, 0xdb, 0xac, 0xec, 0x6e, 0x46, 0xc0, 0x53, 0x71, - 0x37, 0x79, 0x8a, 0x3b, 0xdc, 0xbb, 0x89, 0x4e, 0x82, 0x6f, 0xd4, 0xac, - 0x73, 0xf3, 0x72, 0x2d, 0x44, 0xbe, 0x2e, 0x2b, 0x25, 0x85, 0xbb, 0x53, - 0x72, 0x8f, 0x82, 0x53, 0x1b, 0x58, 0xba, 0xa0, 0xcd, 0x0b, 0x50, 0xa0, - 0x08, 0x58, 0x73, 0x73, 0xc1, 0x12, 0xbc, 0x5f, 0x50, 0xd9, 0x41, 0xe6, - 0x7d, 0xd9, 0xd1, 0x11, 0xf2, 0xb5, 0xb6, 0xc5, 0x30, 0xed, 0x19, 0x83, - 0xd3, 0xe5, 0x17, 0x9c, 0x11, 0xa5, 0xd6, 0x47, 0x66, 0xf9, 0x5a, 0xbb, - 0xcc, 0x3a, 0xc5, 0x34, 0x28, 0x5b, 0x60, 0xd3, 0x6f, 0x9f, 0x62, 0xce, - 0x35, 0x75, 0xcb, 0x68, 0x56, 0xe2, 0xc2, 0x6a, 0xe8, 0x2c, 0x39, 0x89, - 0x73, 0x87, 0x97, 0x70, 0x73, 0x08, 0xef, 0xea, 0xed, 0xd3, 0xa9, 0xfa, - 0xda, 0x19, 0x39, 0x37, 0x3e, 0xea, 0x84, 0x6b, 0x06, 0x63, 0x31, 0x50, - 0x0d, 0x08, 0x52, 0x63, 0x54, 0x6b, 0xe5, 0xee, 0x0d, 0x92, 0x4f, 0xb9, - 0x13, 0x7a, 0xcd, 0xaf, 0x48, 0xd4, 0xa3, 0xf6, 0x27, 0xc4, 0x84, 0x56, - 0xb3, 0x39, 0x31, 0x63, 0x63, 0x15, 0xa7, 0xae, 0x18, 0x22, 0x95, 0xa1, - 0xae, 0x26, 0xdb, 0xef, 0x79, 0xfd, 0xc6, 0xab, 0x5e, 0x56, 0x2e, 0x5f, - 0x4f, 0xe0, 0x18, 0x1b, 0x66, 0x84, 0x92, 0xcf, 0x84, 0xd4, 0xd3, 0xcc, - 0xae, 0x69, 0xbd, 0x60, 0x39, 0x82, 0x07, 0x6a, 0xd9, 0x83, 0xd8, 0xaa, - 0xaf, 0x56, 0xed, 0x1a, 0xdf, 0x7f, 0xa9, 0x52, 0x6f, 0x0c, 0x47, 0x72, - 0xc8, 0x1b, 0x6f, 0xf2, 0x79, 0x57, 0x17, 0xdd, 0xbd, 0x68, 0x69, 0x58, - 0xda, 0x9d, 0x0a, 0x75, 0x9d, 0xc8, 0x55, 0x6e, 0x5a, 0x40, 0x80, 0x38, - 0x5c, 0xba, 0x19, 0x23, 0xf7, 0xbe, 0xe4, 0xeb, 0x61, 0x69, 0x54, 0x3c, - 0x4b, 0xd8, 0x4a, 0x77, 0x8e, 0x55, 0x95, 0xbe, 0xbe, 0xbd, 0xe0, 0xbd, - 0x01, 0x63, 0xa4, 0xd2, 0x57, 0x4d, 0x7a, 0x18, 0x6b, 0x3d, 0xe6, 0x23, - 0x29, 0xa4, 0x72, 0x51, 0x55, 0x79, 0xc4, 0x89, 0xe3, 0x32, 0x31, 0xaa, - 0xcc, 0x83, 0xe5, 0x2f, 0xdc, 0x52, 0xb8, 0x5a, 0x78, 0x70, 0xb3, 0x08, - 0x69, 0x29, 0x52, 0x0b, 0x45, 0xa3, 0xf1, 0x5e, 0x8a, 0x28, 0x30, 0x75, - 0x94, 0x0b, 0x2a, 0xe1, 0x9a, 0x78, 0x7f, 0xb5, 0x37, 0x2e, 0x3d, 0x18, - 0x47, 0x82, 0x74, 0xe3, 0x11, 0x06, 0x2b, 0x30, 0x0f, 0x8a, 0x2f, 0x0c, - 0xac, 0x1f, 0x63, 0xcb, 0x98, 0x5a, 0x44, 0x9f, 0x02, 0xb3, 0xca, 0x0d, - 0xd9, 0x27, 0x84, 0x03, 0xdb, 0x93, 0x8a, 0x04, 0xc5, 0x9f, 0xde, 0xf8, - 0x90, 0x9c, 0xe2, 0x5d, 0x35, 0xeb, 0x1d, 0xdb, 0xda, 0xf5, 0xd1, 0x2b, - 0x78, 0xb7, 0x41, 0x1a, 0xc8, 0x99, 0x2e, 0xcf, 0x17, 0x04, 0x6e, 0xb1, - 0xd1, 0xaf, 0xc4, 0x23, 0x49, 0xa5, 0x39, 0x20, 0xc1, 0x71, 0x83, 0x69, - 0xed, 0x2d, 0xeb, 0x31, 0xeb, 0xfc, 0xef, 0xe3, 0xd2, 0x48, 0x2d, 0x78, - 0x56, 0x1c, 0xf3, 0x14, 0xd6, 0xae, 0x72, 0x35, 0x4f, 0x94, 0x31, 0xe1, - 0x31, 0x96, 0x0b, 0x11, 0x82, 0x57, 0x10, 0xff, 0x43, 0xbf, 0x64, 0x2c, - 0xb7, 0x89, 0xdd, 0x17, 0x6f, 0x8e, 0xbe, 0x56, 0xf0, 0xe0, 0xf8, 0x22, - 0x22, 0x67, 0xc9, 0xc0, 0xc9, 0xb6, 0x96, 0xa0, 0xd5, 0x78, 0x38, 0xa7, - 0x3d, 0x56, 0x3c, 0x0b, 0xab, 0x36, 0xcf, 0xc7, 0x24, 0x72, 0x6c, 0xb1, - 0x21, 0x5c, 0x14, 0xfe, 0x52, 0xd9, 0x5c, 0x17, 0xaf, 0xb1, 0x6c, 0x8a, - 0x77, 0xe6, 0x56, 0x84, 0x5b, 0xe8, 0x7d, 0x56, 0xc0, 0x4a, 0x19, 0x5d, - 0xa1, 0xe3, 0x6e, 0x5a, 0x19, 0xe8, 0xe7, 0x8d, 0x84, 0x21, 0x83, 0xc3, - 0xf0, 0x3d, 0xb8, 0x69, 0x0e, 0x94, 0x13, 0xf6, 0x17, 0x48, 0x2a, 0x64, - 0xbf, 0xdb, 0x73, 0x49, 0xca, 0x52, 0x39, 0x2d, 0xa3, 0x2c, 0xe5, 0x86, - 0x98, 0x20, 0xed, 0x34, 0xe4, 0xaf, 0xb5, 0x49, 0xf6, 0xa5, 0x79, 0x71, - 0x1d, 0xed, 0x2f, 0x2c, 0x57, 0x9d, 0x54, 0x14, 0xa2, 0x24, 0x7c, 0x21, - 0x11, 0xc4, 0x08, 0xcd, 0xb6, 0x7d, 0x93, 0x63, 0x35, 0x6e, 0x80, 0xa2, - 0xb0, 0xdc, 0x9d, 0x69, 0xb4, 0x97, 0x7b, 0x5f, 0xf7, 0xd3, 0xff, 0xad, - 0x5a, 0x6e, 0x0e, 0x9f, 0x10, 0x8d, 0xad, 0x97, 0xf6, 0xb3, 0xbf, 0xa0, - 0x52, 0xe2, 0xda, 0xdd, 0x8e, 0x67, 0x3e, 0xe4, 0xf0, 0x49, 0x9e, 0x62, - 0xd2, 0xf5, 0x80, 0xf0, 0x1e, 0xab, 0x70, 0x46, 0x04, 0x47, 0x1e, 0x99, - 0xb1, 0xd6, 0x37, 0x5a, 0xbf, 0x8b, 0xb2, 0xa0, 0x08, 0xfa, 0x95, 0xd8, - 0xb0, 0x23, 0x0c, 0x85, 0x9a, 0x58, 0xcf, 0xe2, 0xa8, 0x86, 0xe0, 0x42, - 0xe7, 0xab, 0x38, 0xdf, 0xd0, 0x07, 0xa1, 0x81, 0x29, 0xba, 0x66, 0x62, - 0x91, 0x29, 0x25, 0x99, 0x14, 0x2c, 0xed, 0xe3, 0x57, 0x8f, 0x5d, 0xbe, - 0x96, 0x19, 0x72, 0xb5, 0x5d, 0x44, 0xb4, 0xf0, 0xdb, 0xb2, 0xc2, 0x72, - 0x78, 0xfb, 0xa3, 0xbc, 0xd8, 0xeb, 0x8b, 0x2c, 0x89, 0x8b, 0x4e, 0xa5, - 0x5b, 0xd0, 0xd5, 0x34, 0x8f, 0xe0, 0xa5, 0x03, 0x34, 0xb5, 0x22, 0x46, - 0xd0, 0xd7, 0x95, 0x70, 0xb3, 0xc4, 0x1e, 0x70, 0x14, 0x65, 0xa6, 0x87, - 0x62, 0x87, 0x34, 0x09, 0xda, 0xd0, 0xb7, 0xff, 0x27, 0x48, 0xc7, 0x3f, - 0x53, 0x8a, 0xea, 0xc1, 0xd6, 0x39, 0xbf, 0xb8, 0x5e, 0xaf, 0x37, 0x35, - 0x89, 0x8e, 0x12, 0xef, 0x56, 0xa7, 0x2a, 0x4f, 0x1a, 0xc0, 0x16, 0x56, - 0x16, 0xa0, 0x7b, 0x9d, 0xcf, 0x74, 0xab, 0x04, 0xc1, 0x2d, 0x66, 0xcd, - 0x59, 0x62, 0x2d, 0x8e, 0x1e, 0xc2, 0xaa, 0xe5, 0x3f, 0xbf, 0x6d, 0x4d, - 0xb0, 0x5d, 0x69, 0x81, 0x7a, 0x98, 0x00, 0xb7, 0xac, 0x8b, 0x63, 0x0a, - 0x32, 0xb3, 0x8d, 0x52, 0x14, 0xe6, 0x51, 0x0b, 0xd5, 0x5a, 0xe1, 0x20, - 0x87, 0x4d, 0x82, 0x2c, 0x24, 0xa6, 0x93, 0xc9, 0x70, 0x57, 0x0b, 0xc6, - 0x1e, 0x24, 0x03, 0xe7, 0xea, 0xdd, 0x4b, 0xad, 0x3b, 0x1e, 0x4b, 0xec, - 0xdf, 0x0d, 0xa2, 0xb8, 0x72, 0xde, 0xd3, 0xa1, 0x1b, 0xc2, 0xb5, 0x51, - 0x5e, 0x8c, 0x30, 0x14, 0xf8, 0x86, 0xfa, 0x67, 0x36, 0xb9, 0x07, 0xff, - 0x12, 0xf1, 0xa4, 0xdd, 0x43, 0x7a, 0x0a, 0x3b, 0x6e, 0x33, 0x59, 0x3e, - 0x16, 0xe8, 0x8d, 0xc5, 0x6a, 0xa1, 0x1c, 0x53, 0x8e, 0x77, 0x68, 0x41, - 0xa3, 0x4a, 0x51, 0x5f, 0xcb, 0x41, 0x80, 0xd8, 0x58, 0xb2, 0x1e, 0xba, - 0x41, 0x54, 0x33, 0x7d, 0x40, 0x2e, 0x61, 0x98, 0x06, 0x90, 0xcc, 0xc5, - 0xa7, 0x51, 0xe7, 0x84, 0x1e, 0x7b, 0x13, 0x41, 0xc9, 0xb4, 0x86, 0xdf, - 0x90, 0x8c, 0x97, 0xc4, 0xa6, 0xd0, 0xb7, 0x7e, 0xd2, 0x95, 0xc2, 0xbe, - 0xcd, 0xc9, 0xe0, 0x62, 0xe1, 0x28, 0xfe, 0x71, 0xc0, 0x5f, 0xfb, 0x35, - 0x8e, 0x58, 0x44, 0xd6, 0x88, 0xc0, 0x25, 0x1c, 0xb1, 0x1b, 0x51, 0x80, - 0xd2, 0x2d, 0xd0, 0x9b, 0x22, 0xa3, 0xbc, 0x50, 0xa1, 0x05, 0x1e, 0x63, - 0xf9, 0x7a, 0xb9, 0x76, 0x2b, 0xd7, 0x47, 0xe8, 0xd1, 0xd7, 0x40, 0x57, - 0xaa, 0xc0, 0x63, 0x08, 0xbd, 0xae, 0xa0, 0x2a, 0x7a, 0x6f, 0x23, 0x94, - 0x36, 0x59, 0x32, 0x1a, 0xfd, 0xb2, 0xef, 0xb6, 0xd1, 0x32, 0x59, 0xbb, - 0xba, 0x28, 0x53, 0x50, 0x5e, 0x4d, 0xe6, 0x1d, 0xd2, 0x28, 0xeb, 0xe8, - 0x68, 0xcb, 0x76, 0x11, 0x67, 0xab, 0x66, 0x55, 0x23, 0x40, 0x5b, 0x5d, - 0x21, 0x44, 0x48, 0xaf, 0x86, 0x7e, 0x4c, 0x0a, 0xa9, 0x51, 0x71, 0x1f, - 0x48, 0x2a, 0x48, 0xe5, 0x17, 0x51, 0x2e, 0x14, 0xa9, 0xc0, 0xde, 0xa6, - 0xa2, 0x87, 0xe9, 0x03, 0xb9, 0xc1, 0x00, 0xfe, 0x82, 0xf1, 0xd0, 0x24, - 0x69, 0x7b, 0x44, 0x53, 0xfe, 0x56, 0x25, 0xe8, 0x85, 0xac, 0xf3, 0x46, - 0xba, 0x6e, 0x46, 0xe7, 0xfc, 0xcb, 0x2c, 0xcf, 0x86, 0xd3, 0x0f, 0x2f, - 0x51, 0xbe, 0x89, 0xe9, 0x18, 0x1f, 0x50, 0x84, 0x57, 0x97, 0xa0, 0xa2, - 0x10, 0x4e, 0xf1, 0x84, 0xd8, 0xeb, 0x4c, 0x30, 0xa3, 0x83, 0x3f, 0xcb, - 0x06, 0x5a, 0xac, 0xf3, 0x8d, 0xc8, 0xea, 0x9e, 0xb6, 0x5b, 0x6b, 0x02, - 0x1d, 0x28, 0x65, 0xf0, 0x96, 0x5b, 0x93, 0x14, 0x4a, 0xf3, 0x49, 0xbc, - 0x9b, 0xc4, 0x27, 0x84, 0x4a, 0xd6, 0x00, 0x41, 0xfe, 0x1c, 0x8a, 0xb4, - 0xbc, 0x52, 0xf0, 0xc7, 0x92, 0xa8, 0x47, 0x24, 0xc5, 0x02, 0xaf, 0xca, - 0xb3, 0x80, 0x39, 0x16, 0x5e, 0x9e, 0x1d, 0x29, 0x8a, 0xf5, 0x08, 0x72, - 0xa8, 0xa4, 0x59, 0x34, 0x43, 0x48, 0xfb, 0x43, 0xf3, 0x17, 0xd8, 0x6d, - 0xc0, 0x49, 0xcc, 0xe9, 0x70, 0x14, 0x2f, 0xb5, 0xbc, 0x25, 0xd8, 0x24, - 0xdc, 0xca, 0x20, 0xd1, 0x3d, 0x9f, 0x9a, 0x54, 0x34, 0x0c, 0xb5, 0x0e, - 0x4d, 0x5c, 0xdb, 0x43, 0x14, 0x07, 0x47, 0x62, 0x6c, 0x11, 0x15, 0x64, - 0x9b, 0x9d, 0x04, 0x22, 0x54, 0xa4, 0x83, 0xfc, 0x36, 0xca, 0xec, 0xeb, - 0xda, 0x5c, 0x2a, 0x06, 0xaf, 0x0e, 0x36, 0x41, 0xde, 0xe0, 0x6f, 0x5f, - 0xa9, 0xf7, 0x9b, 0xe8, 0xf2, 0xc4, 0x1f, 0x47, 0x63, 0x1e, 0x8a, 0x9d, - 0x14, 0x67, 0xd1, 0xde, 0x8d, 0x0e, 0xb0, 0xea, 0xff, 0x52, 0x56, 0x85, - 0x56, 0x2a, 0x1a, 0x8c, 0x32, 0xb6, 0x17, 0x70, 0xe4, 0x31, 0x20, 0xe9, - 0xbd, 0x6e, 0xcf, 0x61, 0x39, 0x6a, 0x75, 0x21, 0x6a, 0x94, 0x25, 0xe8, - 0x8a, 0xf2, 0x2f, 0x43, 0x94, 0x76, 0x5e, 0xbf, 0x37, 0x2c, 0xa4, 0x96, - 0xb7, 0xbc, 0x62, 0xaf, 0x4d, 0xdb, 0x5e, 0x7b, 0x59, 0xda, 0x11, 0xcc, - 0x56, 0x29, 0x11, 0x93, 0x42, 0xd7, 0xd1, 0x3d, 0xad, 0x70, 0x2b, 0x0d, - 0x2a, 0x43, 0xa8, 0x29, 0xd5, 0xb9, 0x43, 0xba, 0x65, 0x17, 0x40, 0x8d, - 0xd1, 0xf5, 0xf4, 0x0e, 0x1e, 0x97, 0x8f, 0x19, 0x01, 0xf4, 0x2c, 0x32, - 0x5b, 0xa0, 0xc7, 0x48, 0xa5, 0xb8, 0xe8, 0xc6, 0x50, 0xa7, 0xb7, 0x7e, - 0xd4, 0x63, 0x23, 0xaa, 0x0f, 0x6c, 0x63, 0x29, 0x30, 0x66, 0x49, 0xe5, - 0x6b, 0xc1, 0x06, 0x8c, 0x93, 0x6e, 0x43, 0x29, 0xba, 0x02, 0x3b, 0x5b, - 0x24, 0x44, 0x79, 0x21, 0x5c, 0x9d, 0x57, 0x69, 0x8d, 0x59, 0x55, 0xfd, - 0xdc, 0x1b, 0x5c, 0x20, 0xa7, 0xdd, 0x75, 0xa2, 0xf8, 0xc5, 0x95, 0x02, - 0x1b, 0xed, 0x62, 0x8e, 0x09, 0x0a, 0xae, 0x7c, 0x4c, 0x62, 0x6f, 0xac, - 0x24, 0xe7, 0xd4, 0x0e, 0xef, 0x2b, 0x6d, 0x8b, 0xbf, 0xe8, 0x04, 0x10, - 0x2c, 0x06, 0x1a, 0x0d, 0xe7, 0x45, 0xa3, 0x31, 0x2c, 0x0a, 0xd1, 0xe6, - 0x7a, 0x38, 0x5a, 0xe6, 0x11, 0xc0, 0x3e, 0x0d, 0xe3, 0xb2, 0x38, 0x5a, - 0x2a, 0xf7, 0x52, 0x29, 0x03, 0x3e, 0xaf, 0x37, 0x80, 0x83, 0xc9, 0x37, - 0x78, 0x77, 0xb8, 0x4f, 0x25, 0xc0, 0xa6, 0x0d, 0x0e, 0xd1, 0x5a, 0xdb, - 0xcc, 0x74, 0x1d, 0x9a, 0xa7, 0xe8, 0xc6, 0x2a, 0x98, 0x15, 0x08, 0x4c, - 0x1d, 0xc5, 0x4b, 0x5e, 0xe0, 0x3f, 0xd8, 0xee, 0x69, 0x5a, 0x08, 0x3c, - 0xc5, 0x79, 0x3f, 0xd1, 0xa6, 0x38, 0xbf, 0xc7, 0xc1, 0x5d, 0xbe, 0xae, - 0x8b, 0x82, 0x95, 0x75, 0xdf, 0x1d, 0x6c, 0x4f, 0xf4, 0x2d, 0x67, 0xd7, - 0xc3, 0x8b, 0xf2, 0x48, 0x45, 0x7e, 0xe2, 0xa7, 0x56, 0x1a, 0x55, 0x4b, - 0xa3, 0xa2, 0xb8, 0x4d, 0xf5, 0xfe, 0xec, 0x38, 0xb3, 0x19, 0x76, 0x44, - 0x62, 0x13, 0x28, 0x17, 0x47, 0xf9, 0xff, 0xea, 0x7d, 0x3b, 0x74, 0x5f, - 0x61, 0x20, 0x5c, 0x81, 0x2f, 0xc7, 0xe6, 0x9a, 0xf2, 0x55, 0xf2, 0x3e, - 0x66, 0x37, 0x75, 0xdf, 0x64, 0x8b, 0x51, 0xd0, 0xc9, 0xe3, 0xd4, 0xbb, - 0x95, 0x91, 0xac, 0xae, 0x14, 0x39, 0x4b, 0x00, 0x88, 0x4d, 0x31, 0x84, - 0x5c, 0x4a, 0x54, 0x91, 0x35, 0x8e, 0x6c, 0x1a, 0x68, 0x81, 0xc7, 0xce, - 0x21, 0xb1, 0x11, 0xf2, 0x6f, 0xeb, 0x7c, 0xfc, 0x5b, 0x16, 0x01, 0x28, - 0x6d, 0x47, 0x80, 0xd4, 0xa4, 0xe4, 0x8d, 0x07, 0x0c, 0xcc, 0x18, 0xe2, - 0x65, 0x7b, 0x16, 0x2a, 0x0e, 0xbb, 0xdc, 0xe6, 0x6c, 0x3a, 0x71, 0x67, - 0x02, 0x74, 0x2b, 0x6d, 0xb8, 0xb0, 0xf1, 0x80, 0x8e, 0xfe, 0x68, 0xd0, - 0x22, 0xbf, 0x66, 0x31, 0xe2, 0x65, 0x2b, 0x58, 0xc5, 0xae, 0xac, 0xa7, - 0x91, 0xa3, 0xe4, 0x7d, 0x48, 0x84, 0xe8, 0x1c, 0xab, 0x8a, 0x79, 0x46, - 0x62, 0xda, 0x91, 0xc6, 0xa7, 0xc6, 0x71, 0x51, 0xf9, 0x71, 0x0a, 0x2b, - 0x27, 0x7f, 0x4c, 0x93, 0xc7, 0x77, 0x30, 0x78, 0x8b, 0x27, 0x64, 0x90, - 0x02, 0x62, 0xf1, 0x7f, 0x20, 0x36, 0xd3, 0x81, 0x08, 0x1f, 0x65, 0xf4, - 0xa4, 0x52, 0x85, 0xa4, 0x03, 0x40, 0xb8, 0xb4, 0x9b, 0x46, 0xfd, 0xb8, - 0xc8, 0x31, 0xe9, 0xb6, 0x99, 0x29, 0xde, 0x65, 0xfb, 0x75, 0xf8, 0x36, - 0x3f, 0xbf, 0x40, 0x9d, 0xb4, 0xd7, 0x81, 0xc0, 0xb4, 0x54, 0xc0, 0xc3, - 0x49, 0xa7, 0x81, 0x50, 0xc4, 0x71, 0xc6, 0xda, 0xf7, 0x9e, 0x5d, 0xf8, - 0x27, 0xb3, 0x79, 0x6f, 0x41, 0x1d, 0x42, 0xa6, 0x7d, 0xfe, 0x28, 0xa6, - 0x4f, 0x25, 0xc7, 0xce, 0xed, 0x6f, 0xc9, 0x48, 0x46, 0x54, 0x22, 0x2d, - 0xe5, 0xd0, 0x5c, 0x16, 0xf9, 0xae, 0x61, 0x54, 0x34, 0xe9, 0x74, 0x0c, - 0xa6, 0xeb, 0xe6, 0x2d, 0x4c, 0xea, 0x65, 0xcb, 0xe7, 0xc2, 0x7a, 0x80, - 0xcd, 0xc5, 0x6e, 0x5c, 0xb9, 0xef, 0x0d, 0xdb, 0xb1, 0x52, 0xfc, 0x21, - 0x08, 0x0c, 0x8c, 0xcc, 0x64, 0x22, 0x70, 0x4e, 0x03, 0x96, 0x2b, 0xc3, - 0x41, 0xe1, 0xfe, 0xe2, 0x82, 0x6d, 0xb1, 0xf0, 0x44, 0xf8, 0xb8, 0xec, - 0x27, 0x10, 0xaf, 0xc4, 0xe2, 0xd4, 0x88, 0x86, 0x51, 0x05, 0x0a, 0xd6, - 0xfb, 0xa5, 0xd8, 0xbb, 0x44, 0x9a, 0x42, 0x7d, 0x8d, 0x74, 0x63, 0x7b, - 0x0a, 0x8c, 0x6a, 0x2f, 0x22, 0x79, 0x1e, 0xb5, 0x0f, 0xbd, 0xf0, 0x16, - 0xc3, 0x49, 0xa2, 0x0a, 0x7b, 0x76, 0x46, 0x72, 0x4f, 0x9b, 0x43, 0x2e, - 0xd0, 0x98, 0x47, 0x39, 0x36, 0xe2, 0x28, 0xfa, 0x09, 0xc4, 0x6e, 0xbc, - 0xab, 0xda, 0xab, 0xf1, 0x8c, 0xa7, 0x26, 0xcc, 0x39, 0xe4, 0xfe, 0x91, - 0xeb, 0x28, 0xdc, 0xeb, 0x90, 0x1b, 0x6b, 0xca, 0xd7, 0xff, 0x3d, 0xb0, - 0xec, 0xf9, 0xa1, 0xd7, 0x3a, 0x80, 0x9f, 0xec, 0xbe, 0xc3, 0x53, 0xaf, - 0x78, 0x52, 0x9b, 0xf0, 0xdf, 0x08, 0xc1, 0xe0, 0xcf, 0x16, 0x6a, 0x7f, - 0x24, 0xe8, 0x2b, 0xd3, 0xd9, 0x05, 0xcd, 0x30, 0x76, 0x85, 0x47, 0x71, - 0x9c, 0x5f, 0x82, 0x31, 0xd0, 0x18, 0x82, 0xf5, 0xd8, 0x7c, 0x97, 0x89, - 0x10, 0xd0, 0x16, 0x04, 0x0a, 0x9a, 0x57, 0x95, 0xd4, 0xa3, 0x5f, 0x47, - 0xd0, 0x28, 0x84, 0x8c, 0x64, 0x70, 0x5e, 0x0c, 0xd0, 0x3b, 0xfd, 0x40, - 0x8f, 0x8b, 0xe5, 0x3e, 0xe5, 0x93, 0xad, 0xa6, 0x9b, 0x17, 0x43, 0x6f, - 0x14, 0x1d, 0xaa, 0x06, 0xc3, 0x9f, 0xf1, 0xaa, 0x67, 0xbe, 0x43, 0x4f, - 0x07, 0xf3, 0xf3, 0x45, 0xdc, 0xaa, 0xf9, 0x12, 0x0c, 0xae, 0xac, 0x7a, - 0xd6, 0x75, 0x42, 0x42, 0x53, 0x11, 0x43, 0xa2, 0xfd, 0xb6, 0xb8, 0xed, - 0x0f, 0x8a, 0x5b, 0x27, 0x8b, 0xe8, 0x6f, 0x62, 0x6d, 0x94, 0x98, 0xc8, - 0xcf, 0xc5, 0x94, 0xa7, 0x96, 0x63, 0x65, 0x63, 0xc7, 0x27, 0x97, 0x7f, - 0x34, 0x42, 0x8d, 0xe0, 0x87, 0x61, 0x45, 0x9c, 0x73, 0xd2, 0xa4, 0xef, - 0xff, 0x32, 0xcc, 0xa6, 0xcb, 0xae, 0x6d, 0x72, 0xfe, 0x10, 0x49, 0xcf, - 0x35, 0xa5, 0xf4, 0x71, 0xaf, 0x33, 0xc8, 0xc8, 0xa3, 0xb8, 0x29, 0xb2, - 0x25, 0xd7, 0xb9, 0xb0, 0xa5, 0x7d, 0x98, 0xed, 0x5b, 0x80, 0x25, 0x3e, - 0x45, 0xed, 0x40, 0x49, 0xbd, 0x20, 0x32, 0xa1, 0xb7, 0x91, 0xcb, 0xb8, - 0xe2, 0xcb, 0x18, 0x49, 0x57, 0x42, 0xc6, 0xf7, 0xc8, 0x3c, 0xec, 0xab, - 0xdd, 0xd9, 0x35, 0x65, 0x8f, 0x9b, 0xe2, 0x16, 0x8b, 0x5d, 0x3c, 0x35, - 0xde, 0x00, 0xf5, 0xcd, 0xa2, 0xed, 0x02, 0xd4, 0xae, 0x71, 0xf0, 0x03, - 0x91, 0x70, 0xb1, 0x9b, 0x34, 0xc4, 0xfc, 0x40, 0x23, 0x4e, 0x8a, 0x7e, - 0x57, 0x29, 0x72, 0x92, 0xb8, 0xac, 0xaf, 0x0c, 0x4a, 0xa6, 0x61, 0x89, - 0x4b, 0xee, 0xf0, 0xdd, 0x8e, 0x45, 0xbf, 0x8f, 0xe6, 0xf1, 0x81, 0x69, - 0xa3, 0xdb, 0x51, 0xcb, 0x5a, 0x69, 0x2e, 0x43, 0x19, 0x52, 0x96, 0xa9, - 0x17, 0xea, 0x72, 0x74, 0xf5, 0x1a, 0x58, 0x79, 0xa9, 0x5f, 0x9d, 0x76, - 0x28, 0x23, 0x04, 0x65, 0x73, 0xb4, 0xa8, 0xb0, 0x41, 0x98, 0x5b, 0xb9, - 0xc6, 0x1d, 0xd2, 0x11, 0x03, 0xa9, 0x8c, 0x5f, 0x59, 0x01, 0xca, 0x36, - 0xa6, 0x96, 0xfa, 0x55, 0xa0, 0xc1, 0xcd, 0x68, 0x49, 0x0a, 0x14, 0x35, - 0x43, 0xda, 0xb7, 0x4c, 0x34, 0x78, 0x65, 0x83, 0xac, 0xa0, 0xd5, 0xc4, - 0xbe, 0x96, 0xd7, 0x9d, 0xc2, 0xd9, 0x4d, 0x4d, 0x32, 0xe2, 0xa7, 0xe4, - 0xe2, 0x7b, 0xcf, 0x82, 0x33, 0xa0, 0xa7, 0xea, 0x71, 0x53, 0x88, 0xe3, - 0xed, 0xff, 0x24, 0x19, 0xb5, 0xf3, 0xbc, 0xcc, 0xfb, 0x32, 0xc3, 0xb0, - 0x01, 0x48, 0x43, 0x5e, 0x05, 0x5c, 0x66, 0xc0, 0x89, 0xc5, 0x63, 0x2d, - 0x26, 0xf6, 0x60, 0x70, 0x57, 0x46, 0x85, 0x11, 0x29, 0x6c, 0x67, 0xf6, - 0xd1, 0xc9, 0xe2, 0xcf, 0xe6, 0xd2, 0xf5, 0x33, 0x8c, 0x67, 0xdd, 0x6e, - 0xd2, 0x61, 0xe4, 0xe4, 0x13, 0x13, 0xae, 0xcd, 0x78, 0xb3, 0xbf, 0x0b, - 0xab, 0x64, 0xe5, 0x7b, 0xcd, 0x61, 0x0c, 0x19, 0x8e, 0x0e, 0x23, 0xe2, - 0x4f, 0xba, 0xe6, 0x80, 0x50, 0x02, 0xd9, 0x49, 0xf8, 0xa8, 0x9f, 0x3c, - 0xc1, 0xdb, 0x76, 0x63, 0x96, 0x16, 0x2c, 0x40, 0xe1, 0x7c, 0x4c, 0x6f, - 0x2e, 0x62, 0x00, 0x88, 0x2b, 0xed, 0xa6, 0xce, 0x63, 0x1b, 0xfd, 0x86, - 0xfd, 0xe2, 0xd8, 0x55, 0x7e, 0xe1, 0x88, 0x6a, 0x7a, 0xc5, 0x50, 0x87, - 0x5e, 0x41, 0xb5, 0xdf, 0x73, 0x3a, 0x80, 0xbc, 0x30, 0x1e, 0xe5, 0x0d, - 0x9b, 0x12, 0x15, 0x33, 0xc2, 0x18, 0xb1, 0x97, 0x5c, 0x53, 0xe1, 0xce, - 0x89, 0x71, 0x9c, 0xab, 0x50, 0x46, 0xe8, 0x27, 0x14, 0xcd, 0x2a, 0xe6, - 0xc3, 0x6e, 0xcd, 0x87, 0x30, 0x3c, 0x85, 0x78, 0x8b, 0x35, 0x0c, 0x0b, - 0xdf, 0xfa, 0x01, 0xfc, 0x06, 0x40, 0x69, 0x0c, 0x9a, 0xa2, 0x6c, 0x21, - 0x9e, 0xd0, 0xda, 0x3d, 0x75, 0x4c, 0xc3, 0xbc, 0xd3, 0x18, 0x11, 0x26, - 0x38, 0x75, 0x48, 0x21, 0xb7, 0x77, 0x34, 0x73, 0xe3, 0xaf, 0x85, 0xc5, - 0x33, 0x64, 0x9a, 0x49, 0xf3, 0xc2, 0xf7, 0xf8, 0x1f, 0x44, 0x7a, 0x74, - 0x09, 0x64, 0xd1, 0xdd, 0xf6, 0x60, 0xe9, 0xb7, 0x71, 0x2f, 0xfa, 0x7a, - 0x94, 0x72, 0xad, 0x3e, 0x1c, 0x18, 0xfc, 0x36, 0x47, 0xc1, 0xd1, 0x71, - 0x39, 0xe3, 0xfd, 0xc1, 0x29, 0x29, 0x87, 0xe0, 0xbc, 0x3c, 0xcb, 0x27, - 0x25, 0x4b, 0xae, 0x31, 0xe8, 0x8d, 0x77, 0x4c, 0x3b, 0x9e, 0xcb, 0x69, - 0x67, 0xdd, 0x99, 0xb9, 0x88, 0x6d, 0x21, 0x04, 0x98, 0x1b, 0x37, 0xbe, - 0x79, 0xd2, 0x1f, 0xc7, 0x2c, 0xcc, 0xc6, 0xa3, 0x1a, 0x02, 0xa9, 0x0a, - 0xb4, 0x95, 0x01, 0x11, 0x52, 0xb0, 0x7f, 0xa7, 0x60, 0xfc, 0x2c, 0x0f, - 0x8b, 0x3a, 0x55, 0x10, 0x3f, 0x07, 0x48, 0x3a, 0xaa, 0xaa, 0x1e, 0xca, - 0x9d, 0x8b, 0x03, 0x9a, 0xc2, 0x85, 0x7c, 0x95, 0x06, 0x89, 0x23, 0xd0, - 0x7c, 0xde, 0xea, 0xa3, 0x8e, 0xc1, 0xab, 0xc0, 0xc2, 0x61, 0x59, 0x74, - 0x36, 0x73, 0x45, 0x57, 0x16, 0x6a, 0x0d, 0x8c, 0x5a, 0x27, 0x34, 0x50, - 0x76, 0x96, 0x67, 0x76, 0xcb, 0xba, 0x5d, 0xd2, 0x2c, 0xa3, 0xbd, 0xbd, - 0x40, 0x24, 0x3c, 0xed, 0x80, 0xe6, 0xa9, 0x46, 0x84, 0x34, 0x13, 0x63, - 0xd1, 0x60, 0x6c, 0x53, 0x88, 0xcf, 0xbc, 0x10, 0x79, 0xa0, 0x4c, 0x89, - 0x4b, 0xbd, 0xa3, 0xaa, 0x69, 0x39, 0xb8, 0x1b, 0xe1, 0x3d, 0xa0, 0xca, - 0xc3, 0xb5, 0x65, 0x1a, 0xac, 0xee, 0x87, 0x1c, 0x1d, 0x7c, 0x30, 0x1c, - 0x05, 0x3b, 0xfc, 0xd5, 0x3c, 0x51, 0xfb, 0xe3, 0xd3, 0x2c, 0xca, 0x88, - 0x9b, 0xa3, 0x90, 0x18, 0x79, 0xbf, 0x3c, 0x70, 0x1e, 0x88, 0xa4, 0x36, - 0x07, 0xa8, 0xe2, 0x70, 0x20, 0x9c, 0xb0, 0xca, 0x15, 0x83, 0xe9, 0x79, - 0x35, 0x65, 0x40, 0x5d, 0x38, 0x70, 0x69, 0x72, 0xc8, 0x85, 0x10, 0xb6, - 0xf2, 0xcf, 0x85, 0x00, 0xe1, 0x06, 0x86, 0xd3, 0xd7, 0x56, 0x84, 0x7e, - 0x4a, 0x33, 0x6f, 0x4f, 0x2f, 0x2c, 0x3e, 0x88, 0xc5, 0xf8, 0x06, 0x38, - 0x50, 0x87, 0x5a, 0x43, 0x36, 0x5e, 0xf3, 0x54, 0x61, 0xcc, 0x84, 0xbb, - 0x79, 0x73, 0x2c, 0x3d, 0x1d, 0x9a, 0xc5, 0xec, 0x34, 0x5c, 0xba, 0x8c, - 0x2b, 0xad, 0xff, 0xe8, 0x5b, 0x05, 0x66, 0x14, 0x29, 0x57, 0xb4, 0x59, - 0x43, 0x2f, 0xea, 0xce, 0xb6, 0x75, 0x6d, 0x7b, 0xb8, 0x55, 0x77, 0xaf, - 0x6f, 0x70, 0x0e, 0xf6, 0xa1, 0x3e, 0x46, 0x92, 0x8b, 0xf1, 0xfe, 0x1f, - 0xe4, 0xbe, 0xdb, 0x5e, 0xd9, 0xf8, 0x0c, 0xef, 0xd1, 0xf1, 0xb8, 0x36, - 0x19, 0xd2, 0xb2, 0x04, 0x11, 0xeb, 0xed, 0x05, 0xd9, 0x55, 0x81, 0x47, - 0x69, 0x12, 0x65, 0xc1, 0x8d, 0xd3, 0x07, 0xaf, 0xbe, 0xb4, 0xdc, 0xd8, - 0x2d, 0xd9, 0xbc, 0x97, 0x72, 0xeb, 0x0e, 0xe5, 0xf6, 0xb5, 0xe3, 0x4b, - 0x0f, 0x37, 0xee, 0x24, 0xcc, 0x50, 0xb9, 0x04, 0xb1, 0xe9, 0xac, 0xbb, - 0x11, 0xc5, 0x9c, 0xc5, 0x98, 0x2c, 0xb6, 0xe3, 0xcc, 0x17, 0x4d, 0xc3, - 0xc4, 0xd0, 0xf1, 0xe1, 0x83, 0xfc, 0xa2, 0xec, 0xba, 0x07, 0x91, 0x4e, - 0xff, 0xc3, 0xe5, 0x63, 0x11, 0x96, 0xe4, 0x4d, 0xd1, 0x3d, 0xcf, 0x1e, - 0x10, 0xad, 0x5c, 0x2f, 0x8d, 0x70, 0xd6, 0xb1, 0xcb, 0x71, 0xf1, 0xa2, - 0x58, 0x55, 0x59, 0xcd, 0x2f, 0xd0, 0xa2, 0x63, 0x56, 0xc5, 0x1b, 0xb8, - 0x13, 0x31, 0x0c, 0x0f, 0x23, 0xab, 0x7a, 0x08, 0xf3, 0x4b, 0xcc, 0x76, - 0x92, 0x59, 0x6c, 0x2f, 0xe2, 0x21, 0x5d, 0xbb, 0x23, 0xc3, 0x84, 0x76, - 0xfe, 0xe2, 0xb1, 0x8a, 0xd5, 0xf7, 0x2e, 0x0e, 0x41, 0xc1, 0x0c, 0x4d, - 0xfa, 0x5d, 0xab, 0x2e, 0xfa, 0xe7, 0x8e, 0xf9, 0xbe, 0xda, 0x23, 0x23, - 0x76, 0xb3, 0x70, 0x32, 0x23, 0x58, 0x67, 0x26, 0xa7, 0x8b, 0xa4, 0xbb, - 0x4a, 0x77, 0x5a, 0x37, 0x03, 0xf7, 0x72, 0x30, 0xbf, 0xcc, 0x09, 0x78, - 0x11, 0xfe, 0x97, 0xe6, 0x24, 0x94, 0x67, 0xd8, 0x90, 0xc3, 0x83, 0x83, - 0xd5, 0xf5, 0x64, 0xea, 0x3d, 0xb0, 0xa9, 0xe0, 0x96, 0x13, 0xa6, 0xc2, - 0xd5, 0x63, 0x06, 0x75, 0xf3, 0x32, 0x79, 0x73, 0x2e, 0x33, 0x97, 0xae, - 0xab, 0x53, 0x98, 0x60, 0xbd, 0xb8, 0x7d, 0x2c, 0x63, 0x4f, 0x78, 0x78, - 0x04, 0x10, 0x9e, 0x06, 0x23, 0x7d, 0x16, 0x08, 0xed, 0x8c, 0x46, 0x27, - 0x14, 0x54, 0x0d, 0x48, 0x60, 0xd4, 0xbc, 0x4b, 0x73, 0x04, 0x1d, 0xb5, - 0xaa, 0xd1, 0xd4, 0x99, 0xba, 0x22, 0xcf, 0xba, 0xad, 0x44, 0x0a, 0x3c, - 0x29, 0xd0, 0x77, 0x5c, 0x31, 0x4e, 0x84, 0x9d, 0x35, 0xd9, 0x84, 0xd9, - 0x95, 0xbc, 0xc5, 0x81, 0x24, 0xd2, 0x8f, 0x28, 0xd2, 0xfc, 0x60, 0xb1, - 0xfb, 0xa8, 0x1d, 0x9c, 0xf8, 0x64, 0xfe, 0xf9, 0x70, 0x44, 0x4d, 0x02, - 0xf9, 0x05, 0xd4, 0x04, 0xa0, 0x98, 0xd2, 0x0f, 0xab, 0x8a, 0x53, 0xd9, - 0xce, 0x4e, 0x7c, 0xfa, 0xb9, 0x49, 0x87, 0x09, 0x46, 0xa5, 0xcd, 0x3b, - 0xfd, 0xa3, 0xa5, 0x02, 0xf5, 0x79, 0x6e, 0x77, 0x12, 0xc5, 0xdd, 0x2f, - 0xf9, 0x1a, 0xf5, 0xda, 0x96, 0x6f, 0x48, 0x39, 0x43, 0x00, 0x6f, 0x23, - 0xde, 0xb6, 0x0a, 0xae, 0x6b, 0xf9, 0x40, 0x4c, 0x55, 0x30, 0x09, 0x81, - 0xab, 0xd5, 0x22, 0x38, 0x28, 0x0c, 0x6a, 0x13, 0x87, 0xe2, 0xa4, 0x6f, - 0x71, 0xc2, 0x7e, 0x8f, 0xc9, 0xf2, 0x74, 0x4a, 0xa7, 0xd7, 0x87, 0x56, - 0x19, 0xdd, 0x5a, 0x44, 0x2b, 0x87, 0x43, 0x25, 0x78, 0x27, 0x7e, 0x1d, - 0x6c, 0x57, 0x9f, 0x67, 0x69, 0xcc, 0x50, 0xf5, 0xf3, 0x1f, 0x11, 0x2d, - 0xd1, 0x02, 0xd3, 0xc1, 0x12, 0x0e, 0x63, 0xb4, 0xf4, 0x25, 0x7c, 0x26, - 0x9b, 0x43, 0xf5, 0x5f, 0xba, 0x8b, 0xa1, 0x8f, 0xcf, 0x4b, 0x3c, 0x6f, - 0x9f, 0x39, 0x30, 0xb2, 0x43, 0x4e, 0xd7, 0x5b, 0xe1, 0x46, 0xc2, 0x80, - 0x84, 0x6b, 0x54, 0xba, 0x2c, 0xba, 0xa3, 0x21, 0x40, 0x70, 0x51, 0x96, - 0xba, 0x25, 0x95, 0xe9, 0x95, 0x9d, 0x59, 0x56, 0xa6, 0x9e, 0x74, 0x69, - 0xb2, 0x2b, 0xe4, 0x6a, 0xba, 0x56, 0xde, 0xf4, 0x60, 0x71, 0x55, 0xc9, - 0xb3, 0x87, 0xa6, 0xbe, 0x88, 0x96, 0x6b, 0x8f, 0x70, 0x4b, 0x60, 0x4f, - 0xd9, 0x8f, 0x5b, 0x6b, 0x40, 0xb5, 0xe7, 0xae, 0xc9, 0x3b, 0x73, 0xd3, - 0xfb, 0x4a, 0xe6, 0x88, 0x89, 0x16, 0x0e, 0x52, 0x3e, 0xd5, 0xee, 0x74, - 0x0c, 0x49, 0x9f, 0xa1, 0x07, 0xcf, 0xe8, 0x5e, 0x23, 0x26, 0x0f, 0x07, - 0x2c, 0xb2, 0xb0, 0x5a, 0xf7, 0x9d, 0xec, 0xab, 0x4b, 0xb9, 0x3e, 0xb4, - 0xd0, 0xc2, 0x32, 0xb4, 0x1f, 0xe1, 0x78, 0x64, 0xe9, 0xa8, 0x3c, 0x88, - 0xb6, 0xd2, 0x4b, 0x0e, 0x3d, 0xe8, 0xf5, 0x9b, 0x1a, 0x54, 0x6a, 0x00, - 0x47, 0xf9, 0xd5, 0x9b, 0x72, 0xc2, 0x54, 0x5e, 0xab, 0x7e, 0x65, 0x6c, - 0x56, 0x55, 0x2a, 0x6e, 0x0f, 0x20, 0x18, 0x56, 0x3f, 0x33, 0x78, 0xfb, - 0x8b, 0x31, 0x0c, 0x0b, 0x35, 0xf4, 0x1d, 0xad, 0xd8, 0xa1, 0xcb, 0x95, - 0xf9, 0xd8, 0x2f, 0x66, 0x86, 0x4c, 0x9a, 0x2f, 0x55, 0xf8, 0xa4, 0xb4, - 0x4b, 0xd0, 0xad, 0x79, 0x4d, 0x2c, 0x27, 0x11, 0xbc, 0x7e, 0x65, 0x87, - 0x90, 0x71, 0xc6, 0x31, 0xf5, 0xeb, 0x35, 0xcf, 0xea, 0x98, 0x0f, 0xc1, - 0x0b, 0xd8, 0xa3, 0x11, 0x16, 0x1c, 0x4a, 0x00, 0x7e, 0xb7, 0x81, 0x9c, - 0x44, 0x8f, 0x96, 0x05, 0x64, 0x3e, 0x51, 0x23, 0xe9, 0xcc, 0x24, 0x43, - 0x5b, 0x83, 0x96, 0x3a, 0x4d, 0x48, 0x34, 0xba, 0xd7, 0x78, 0x64, 0x40, - 0x28, 0xb8, 0x41, 0xee, 0x40, 0xe5, 0x70, 0x91, 0x38, 0xc4, 0x41, 0x09, - 0x7a, 0x5c, 0x56, 0x85, 0x59, 0xb8, 0xdf, 0x6f, 0xb3, 0x99, 0xd4, 0xc9, - 0xe6, 0x2b, 0xef, 0xfe, 0x8c, 0xdb, 0xba, 0xaa, 0xe2, 0xc5, 0x82, 0xd6, - 0x86, 0xd2, 0xa7, 0xcc, 0xc1, 0x86, 0x40, 0x8c, 0x52, 0xbc, 0x82, 0x9a, - 0x6b, 0x80, 0x62, 0x4f, 0x39, 0xf8, 0x21, 0x0a, 0xde, 0x99, 0xfc, 0x58, - 0xd5, 0xd8, 0x07, 0x95, 0xb9, 0xba, 0xce, 0xfb, 0x1c, 0x53, 0xad, 0x5d, - 0x33, 0x90, 0xff, 0x2d, 0x73, 0x2f, 0xb0, 0xc8, 0x1c, 0xc8, 0xc1, 0x6a, - 0x7f, 0xfd, 0x93, 0x8e, 0x04, 0x34, 0x92, 0x3b, 0xd4, 0x2f, 0xf7, 0xfe, - 0xbb, 0xf3, 0xff, 0x30, 0xcf, 0x96, 0x10, 0xa2, 0xc5, 0x99, 0x56, 0x05, - 0x8b, 0xe9, 0x0b, 0xef, 0xc5, 0xe1, 0x08, 0xb0, 0x2f, 0x4e, 0x05, 0x55, - 0xa2, 0x5e, 0x39, 0xcb, 0x4c, 0xe6, 0xb9, 0xac, 0xbd, 0xfa, 0xee, 0x38, - 0xc1, 0x3e, 0x6b, 0x80, 0x4c, 0x97, 0xe6, 0x85, 0x63, 0xde, 0x91, 0x2d, - 0x77, 0xd7, 0x86, 0xa6, 0x64, 0xb8, 0xe4, 0x78, 0x61, 0x6d, 0x66, 0xc8, - 0x14, 0xea, 0x03, 0x6d, 0xb9, 0xda, 0x42, 0xb8, 0x06, 0x04, 0xde, 0x3b, - 0x8f, 0x39, 0x70, 0x43, 0x10, 0xdc, 0x9b, 0xd3, 0x53, 0x81, 0xac, 0x14, - 0xf1, 0x89, 0xcc, 0x31, 0xd9, 0xfe, 0xa8, 0xcc, 0x40, 0x63, 0x91, 0xc7, - 0x6c, 0x98, 0xa4, 0x59, 0x51, 0x95, 0xe6, 0x68, 0xff, 0x9b, 0xf3, 0x8d, - 0x69, 0x70, 0xa5, 0x78, 0xeb, 0x01, 0x88, 0xb3, 0xe0, 0x0a, 0x70, 0x1a, - 0x2e, 0x1b, 0xf5, 0xa1, 0x9e, 0xe2, 0xb2, 0x4f, 0x2e, 0xf9, 0xac, 0xc8, - 0x93, 0x5f, 0x49, 0x3b, 0xd9, 0x19, 0x97, 0x64, 0xd5, 0xb2, 0x49, 0x41, - 0xc9, 0xb1, 0xa3, 0x5e, 0x93, 0x06, 0x0b, 0xd3, 0x6a, 0xdb, 0x28, 0x31, - 0xd0, 0xcc, 0xf3, 0xee, 0xcb, 0xa3, 0xc6, 0x1d, 0xe5, 0x1d, 0xa0, 0x46, - 0xe3, 0xfa, 0xf7, 0x50, 0xad, 0x5e, 0x38, 0xca, 0x49, 0xe1, 0x9a, 0x1f, - 0x36, 0x00, 0x1d, 0x35, 0xdd, 0x75, 0x9c, 0x12, 0x1f, 0x3d, 0xd6, 0xbc, - 0x46, 0xb1, 0xde, 0xb3, 0x49, 0xbb, 0xe2, 0xb6, 0x94, 0xbd, 0x59, 0x6e, - 0x70, 0xc3, 0x45, 0x6e, 0x20, 0x6f, 0xdc, 0xad, 0xbd, 0x32, 0xe5, 0x74, - 0x37, 0xae, 0x5b, 0xc4, 0x51, 0x66, 0x81, 0x3c, 0x5d, 0xca, 0x3f, 0x1d, - 0xe2, 0x84, 0xb1, 0x34, 0xb4, 0x88, 0xb5, 0x4e, 0x68, 0xcb, 0xb3, 0x42, - 0x64, 0x06, 0x87, 0x65, 0xc3, 0xd9, 0x62, 0xef, 0xdf, 0x2d, 0x5f, 0x93, - 0x84, 0x6f, 0xe3, 0xba, 0xc0, 0x7f, 0xda, 0xeb, 0x09, 0xad, 0xce, 0x02, - 0x44, 0x8f, 0x96, 0x05, 0x64, 0x3e, 0x51, 0x23, 0x90, 0x37, 0xcf, 0xcf, - 0x7a, 0x90, 0xa1, 0x8c, 0xc0, 0xb9, 0x61, 0x71, 0x6f, 0x9b, 0x53, 0xc8, - 0x28, 0xb8, 0x41, 0xee, 0x40, 0xe5, 0x70, 0x91, 0x38, 0xc4, 0x41, 0x09, - 0x7a, 0x5c, 0x56, 0x83, 0x55, 0x47, 0x15, 0x3d, 0xa3, 0x9c, 0x44, 0x71, - 0x65, 0x46, 0xb4, 0xfa, 0x12, 0x39, 0x06, 0xa7, 0xe8, 0xbe, 0x13, 0x77, - 0x8e, 0x65, 0x50, 0x5c, 0x13, 0xdb, 0x87, 0x01, 0x2b, 0x47, 0x54, 0xec, - 0x93, 0xa5, 0x0b, 0xd9, 0x84, 0xec, 0x84, 0x07, 0xfe, 0xe7, 0x88, 0x7d, - 0x5d, 0x4f, 0xcd, 0x2b, 0x7b, 0x3b, 0x70, 0x3a, 0xbb, 0xcc, 0x45, 0x5a, - 0xcf, 0x2d, 0x75, 0x30, 0xf5, 0x04, 0x26, 0x54, 0x6a, 0xbf, 0x40, 0x9f, - 0x5c, 0xd5, 0x39, 0x0a, 0x97, 0x84, 0x5c, 0x92, 0x0e, 0x66, 0x78, 0x66, - 0x58, 0x09, 0xd6, 0x03, 0x09, 0xde, 0x2f, 0x2a, 0x52, 0x3c, 0x40, 0x86, - 0xd2, 0xdb, 0x4a, 0xcf, 0xce, 0xe3, 0xa3, 0xf9, 0x36, 0x30, 0x90, 0x94, - 0xb5, 0x5d, 0x5b, 0xf8, 0x11, 0xbc, 0x64, 0x79, 0x93, 0x9d, 0x06, 0x0d, - 0xe6, 0xff, 0x1c, 0xce, 0x5a, 0x7a, 0xbd, 0xff, 0xb4, 0xe6, 0x6e, 0x33, - 0x6c, 0xbc, 0xf1, 0x4e, 0x74, 0x72, 0x1d, 0x33, 0x91, 0x7d, 0x87, 0xa3, - 0xa3, 0xea, 0x33, 0x6d, 0x4d, 0x41, 0xd4, 0x2d, 0x95, 0xfa, 0x0a, 0xf0, - 0xfe, 0x13, 0x4f, 0x32, 0xfc, 0x58, 0x06, 0xd2, 0x62, 0xc1, 0xe3, 0x6b, - 0x28, 0x40, 0xc8, 0xb2, 0xe3, 0x6f, 0x47, 0x72, 0x12, 0x99, 0x2c, 0x0e, - 0x52, 0xec, 0x84, 0x85, 0x2f, 0xb4, 0x15, 0x27, 0x68, 0xd8, 0xfa, 0x94, - 0x7b, 0x28, 0xad, 0xc8, 0xb0, 0xbd, 0x3a, 0x94, 0x5a, 0x2f, 0x49, 0xe0, - 0x5b, 0xf3, 0x73, 0xfc, 0x61, 0x6f, 0xeb, 0xdb, 0x90, 0xcb, 0x90, 0xfb, - 0x93, 0x57, 0x80, 0x0b, 0x24, 0xa8, 0xc9, 0x3b, 0x3d, 0x53, 0x39, 0xfc, - 0xea, 0x27, 0x5d, 0x76, 0x59, 0xa8, 0xbe, 0x4c, 0x6d, 0x91, 0x56, 0x3a, - 0xc0, 0xbc, 0x76, 0xec, 0x78, 0x13, 0xa6, 0x77, 0xe2, 0x76, 0x25, 0xab, - 0x6c, 0xfb, 0x65, 0xa4, 0x52, 0x08, 0x1e, 0x8d, 0x51, 0xe4, 0x6f, 0xd2, - 0x96, 0xa4, 0xdf, 0x7f, 0x54, 0x82, 0x25, 0x5c, 0x0d, 0x1f, 0x49, 0x82, - 0x16, 0x6a, 0xd2, 0x8e, 0x13, 0xfe, 0x10, 0x0b, 0xe3, 0x47, 0xf4, 0x62, - 0x0f, 0xf5, 0xb8, 0xaf, 0xb3, 0x51, 0xdf, 0x37, 0x0d, 0xea, 0x1d, 0xf3, - 0xd5, 0x68, 0xaa, 0xe0, 0x12, 0xdf, 0x0a, 0x86, 0x38, 0x4b, 0xad, 0xb1, - 0xaa, 0xa2, 0x2f, 0x8f, 0x99, 0x9c, 0x75, 0x74, 0x40, 0xd9, 0xf1, 0xfe, - 0x9d, 0x13, 0xd9, 0x44, 0xbe, 0xf3, 0x5d, 0x7f, 0xb9, 0xde, 0xee, 0xcd, - 0x91, 0x25, 0xbc, 0x11, 0xab, 0xbd, 0xa8, 0x22, 0x4f, 0x70, 0xc8, 0x00, - 0x3b, 0xd7, 0x46, 0x55, 0x6d, 0x92, 0x9d, 0xa1, 0x8d, 0x8f, 0xd9, 0xb4, - 0x83, 0x81, 0xcf, 0xc9, 0x6e, 0xb1, 0x52, 0xa9, 0xed, 0x4e, 0x89, 0xe3, - 0x92, 0xd2, 0x45, 0xfb, 0xb4, 0x77, 0x67, 0x11, 0x8a, 0x75, 0x4a, 0x21, - 0x0e, 0x7e, 0x67, 0xa9, 0x44, 0x43, 0xfe, 0x70, 0x4a, 0x18, 0xa2, 0xb5, - 0xc5, 0xaf, 0xf6, 0x71, 0x4e, 0xf3, 0xf9, 0x48, 0xd2, 0xdd, 0x96, 0xf1, - 0x25, 0x5f, 0xd1, 0x44, 0x95, 0xf7, 0x25, 0xea, 0x11, 0xf6, 0x63, 0x18, - 0xf2, 0xbf, 0x69, 0x06, 0x7d, 0x00, 0x2e, 0x88, 0x2f, 0xcf, 0x22, 0xcd, - 0x41, 0x44, 0xef, 0x0c, 0x82, 0x14, 0x23, 0x69, 0x3a, 0x23, 0x5c, 0xa6, - 0x4d, 0x6e, 0x25, 0x83, 0xa4, 0xc3, 0x7e, 0x14, 0x8e, 0x0a, 0x49, 0xc6, - 0x21, 0x79, 0x34, 0x1c, 0xcc, 0xf8, 0xde, 0x8e, 0x23, 0x0e, 0x48, 0x7a, - 0x0d, 0x80, 0x78, 0xab, 0xfa, 0xbe, 0x39, 0x6d, 0x6c, 0x48, 0xf9, 0xf6, - 0x02, 0x29, 0xbc, 0xb9, 0x65, 0xf5, 0xb4, 0xfb, 0x45, 0xa4, 0xef, 0xbd, - 0x66, 0xfd, 0x1b, 0xb4, 0x01, 0x45, 0x50, 0xe0, 0x52, 0xb6, 0x95, 0xb1, - 0xc9, 0xe2, 0x80, 0xad, 0xb1, 0xe3, 0x4b, 0x5d, 0x12, 0xcf, 0x0a, 0x7b, - 0xb0, 0x00, 0x8b, 0xcb, 0x00, 0xf5, 0x72, 0xb3, 0xed, 0x9a, 0xe7, 0x4b, - 0x5f, 0x20, 0x63, 0xe9, 0x6f, 0xdf, 0x91, 0xf6, 0x48, 0xce, 0xd7, 0xc1, - 0x7d, 0xe6, 0xcf, 0x5e, 0x3b, 0x1d, 0xc2, 0x4d, 0xb8, 0x23, 0x62, 0x4c, - 0xa4, 0x56, 0xfb, 0x56, 0x86, 0xd9, 0xef, 0xfd, 0x87, 0x34, 0x61, 0x46, - 0xf9, 0xb2, 0xb4, 0x67, 0x09, 0x19, 0x88, 0xe4, 0xd1, 0x77, 0x2c, 0x3e, - 0xc8, 0x87, 0x7b, 0x67, 0x45, 0x69, 0x26, 0x19, 0xf0, 0x6a, 0xfe, 0xb4, - 0x5b, 0x2e, 0xa2, 0xab, 0x6a, 0x91, 0x36, 0xbb, 0x2c, 0x62, 0x2c, 0x9f, - 0x86, 0xa1, 0x5d, 0x4b, 0xdb, 0x48, 0xc8, 0x52, 0x38, 0x4e, 0x98, 0x8f, - 0xd8, 0x85, 0x1c, 0x6a, 0xfc, 0xa7, 0x3f, 0x06, 0x58, 0xd9, 0xd8, 0x2e, - 0x07, 0x52, 0xb1, 0x02, 0xa6, 0x99, 0xf8, 0x65, 0x9d, 0xea, 0xb3, 0x15, - 0xb6, 0xb9, 0x64, 0x32, 0xc8, 0x6b, 0x3c, 0x77, 0x82, 0x38, 0xf4, 0xdd, - 0x71, 0x8b, 0x96, 0x69, 0x07, 0x49, 0x6d, 0xa0, 0x63, 0x46, 0xb0, 0xab, - 0x41, 0x7c, 0x05, 0xe8, 0x29, 0xd3, 0xbf, 0xf2, 0xbb, 0x38, 0x2c, 0x8f, - 0x7e, 0x91, 0x33, 0xa4, 0x5c, 0xe5, 0x59, 0xe4, 0x21, 0xca, 0x6c, 0xb8, - 0x2c, 0xba, 0x15, 0x4b, 0xdb, 0xfb, 0xd3, 0x93, 0x8c, 0xda, 0x61, 0x62, - 0x86, 0x30, 0x45, 0x99, 0xde, 0x6d, 0xc1, 0x28, 0x63, 0xcf, 0x19, 0xd6, - 0x4a, 0xa0, 0x33, 0xa4, 0xea, 0x3d, 0x5a, 0xc9, 0xea, 0x9e, 0xba, 0xf2, - 0xb5, 0x46, 0x62, 0xe9, 0xb3, 0x04, 0x8a, 0xa7, 0xc4, 0xd7, 0xc4, 0x7c, - 0x55, 0xd4, 0x9b, 0x14, 0x94, 0x57, 0xe3, 0xe2, 0xc9, 0x9f, 0x18, 0x2c, - 0x84, 0xc9, 0x63, 0x24, 0xe0, 0x1d, 0xb5, 0x78, 0x62, 0x37, 0xb1, 0x04, - 0xa8, 0x29, 0x59, 0x59, 0xdf, 0xe2, 0x26, 0x46, 0xd6, 0xc7, 0x53, 0x2c, - 0xf3, 0x79, 0xf9, 0x9a, 0xa9, 0x49, 0xd8, 0xff, 0x62, 0xc3, 0x0f, 0x7c, - 0x28, 0x25, 0xe1, 0x76, 0x08, 0xae, 0x0a, 0xa3, 0x3a, 0x54, 0x3a, 0xff, - 0xe0, 0xab, 0x95, 0xcf, 0x26, 0x06, 0x87, 0xc2, 0x8b, 0x71, 0x35, 0x95, - 0x65, 0x90, 0x69, 0x8e, 0xd8, 0xce, 0xa9, 0x5b, 0x2c, 0xf6, 0x8f, 0xd8, - 0x76, 0xc5, 0x66, 0xfd, 0x83, 0x18, 0x14, 0x1d, 0x4d, 0xed, 0x36, 0xb1, - 0xf4, 0x30, 0x63, 0x9d, 0x65, 0x47, 0x14, 0x33, 0xc9, 0xef, 0x95, 0x73, - 0xa5, 0xa5, 0x4c, 0x74, 0x3a, 0x2e, 0x0f, 0xd5, 0xfc, 0x00, 0xa9, 0x0e, - 0x88, 0x3f, 0xab, 0x0a, 0x39, 0x23, 0xa3, 0x42, 0x6a, 0x28, 0x1a, 0xe4, - 0x56, 0x89, 0xb1, 0x5d, 0xce, 0x48, 0xb0, 0xf8, 0x18, 0x97, 0x13, 0x94, - 0xf4, 0x78, 0xf0, 0x35, 0xf1, 0xaa, 0xb3, 0x62, 0x3c, 0xeb, 0x08, 0x06, - 0xe3, 0xb7, 0x5e, 0x79, 0x71, 0x90, 0x71, 0x8a, 0x01, 0xb4, 0x95, 0xbb, - 0xa5, 0xa0, 0x59, 0x9c, 0xc8, 0xf5, 0x23, 0x12, 0x7e, 0x50, 0x2d, 0x40, - 0x5f, 0x15, 0xee, 0x77, 0x96, 0x9b, 0x6e, 0x09, 0x74, 0x44, 0x82, 0xb4, - 0xb1, 0xcd, 0xe5, 0xf8, 0xb0, 0xaa, 0x95, 0x0f, 0xad, 0x6b, 0x9d, 0x51, - 0x41, 0x8c, 0xc4, 0xd2, 0xbf, 0x69, 0x43, 0xa5, 0x28, 0xaf, 0xdc, 0xb2, - 0x24, 0xb1, 0xd6, 0xdc, 0x17, 0x4d, 0xcd, 0xba, 0x2d, 0x2a, 0xd5, 0x35, - 0x07, 0x2a, 0x4c, 0xc3, 0x2d, 0xeb, 0x30, 0x8c, 0x1c, 0x0a, 0xf5, 0xc6, - 0xc7, 0x8e, 0x52, 0xe3, 0x89, 0xc3, 0x9b, 0x3c, 0x26, 0x47, 0x06, 0x5d, - 0x58, 0xba, 0x0c, 0xd4, 0x3d, 0x02, 0x26, 0x75, 0xcf, 0x20, 0x3a, 0x43, - 0x29, 0x85, 0xdf, 0x99, 0xcf, 0xeb, 0x3a, 0x97, 0xf4, 0xbf, 0xf9, 0x49, - 0xf2, 0x3f, 0x9b, 0x11, 0x3b, 0x04, 0xa8, 0x91, 0x2c, 0x9c, 0x31, 0x74, - 0x4d, 0xb2, 0xb6, 0xa6, 0xca, 0x17, 0x74, 0x45, 0x10, 0xf2, 0x71, 0x11, - 0xde, 0xf7, 0x66, 0x42, 0x28, 0xb0, 0x3f, 0x68, 0x44, 0xd1, 0xe1, 0x46, - 0x58, 0xac, 0x89, 0x17, 0x4a, 0xb0, 0x13, 0xf2, 0x9a, 0x05, 0xf8, 0x13, - 0xf1, 0x68, 0xcb, 0x1c, 0x63, 0x11, 0x3f, 0x99, 0x94, 0xc5, 0x7b, 0x91, - 0x37, 0xa7, 0x06, 0x55, 0x1f, 0x13, 0x97, 0xe7, 0xe7, 0x23, 0xc9, 0xec, - 0xce, 0xab, 0x8a, 0x67, 0x46, 0xbb, 0x17, 0x7a, 0xc3, 0x44, 0x5b, 0x03, - 0x5d, 0xb8, 0x68, 0x36, 0x55, 0xbc, 0x03, 0xf6, 0x10, 0x86, 0x3c, 0x88, - 0xda, 0xfc, 0xdc, 0x1a, 0x6b, 0x72, 0x13, 0xda, 0xdf, 0xdd, 0x5f, 0x83, - 0x92, 0x99, 0xd0, 0xe3, 0xc4, 0x7e, 0x0c, 0xe3, 0xd2, 0x07, 0x57, 0x13, - 0xb5, 0xa5, 0xb0, 0x3d, 0x64, 0x53, 0x86, 0x66, 0x41, 0xd9, 0x46, 0x27, - 0x77, 0x05, 0x86, 0x43, 0x93, 0xe6, 0xd9, 0x69, 0x48, 0x11, 0x11, 0x6e, - 0xd6, 0x1e, 0x48, 0x22, 0x38, 0x4b, 0xad, 0xb1, 0xaa, 0xa2, 0x2a, 0x9b, - 0x99, 0x9c, 0x75, 0x74, 0x40, 0xd9, 0xf1, 0xfe, 0xf3, 0xf9, 0x39, 0xcd, - 0x77, 0x64, 0x21, 0xaf, 0x93, 0x46, 0xa7, 0x41, 0x79, 0x92, 0x6d, 0x9b, - 0xe5, 0x13, 0x6b, 0x37, 0x44, 0x22, 0xa8, 0xfd, 0x90, 0x97, 0x54, 0x66, - 0x16, 0xb0, 0x69, 0x0b, 0x57, 0xe6, 0xbe, 0x2a, 0xd8, 0x8f, 0x15, 0xaa, - 0x07, 0xc1, 0x3a, 0x15, 0xb0, 0xf9, 0x04, 0x11, 0x6c, 0xe4, 0x89, 0x44, - 0x10, 0xe3, 0xd6, 0xb0, 0x14, 0xb8, 0xa8, 0xbe, 0xdd, 0xc4, 0x3f, 0xf8, - 0xaf, 0xc4, 0x49, 0xef, 0x41, 0xa3, 0x71, 0x89, 0x55, 0x87, 0x69, 0xc7, - 0x0c, 0x41, 0x7f, 0xe3, 0xa7, 0x92, 0xf2, 0xc6, 0xa2, 0x13, 0x18, 0xad, - 0x10, 0xc6, 0x72, 0xf9, 0xb2, 0x8e, 0x22, 0x94, 0xd2, 0xce, 0x8d, 0x64, - 0xdc, 0x22, 0x8b, 0x43, 0x45, 0x45, 0x3f, 0x6c, 0x7b, 0xe5, 0xd9, 0x7d, - 0x4c, 0x3e, 0x04, 0xd1, 0xaf, 0x58, 0x2c, 0xd6, 0x9a, 0x43, 0x73, 0x5a, - 0xd6, 0x11, 0x15, 0xa9, 0xcb, 0xd7, 0xe8, 0xcd, 0x4e, 0x2e, 0x4a, 0x8c, - 0x79, 0x55, 0xc2, 0xfd, 0x49, 0x8a, 0x1b, 0x43, 0x8f, 0x50, 0x85, 0x4c, - 0x9f, 0xfc, 0x6e, 0xde, 0x8b, 0x63, 0xc6, 0xb5, 0x73, 0x85, 0x5c, 0x55, - 0xee, 0x0b, 0xd4, 0x4f, 0xd2, 0xb9, 0x98, 0x06, 0xbd, 0x0b, 0x9a, 0xba, - 0x14, 0xd1, 0xf2, 0x06, 0xd8, 0x9a, 0xa9, 0xba, 0xec, 0xa3, 0x5e, 0x6f, - 0x56, 0x3f, 0xd9, 0xb1, 0x28, 0x80, 0x1c, 0x3a, 0x5f, 0x14, 0x9d, 0xfc, - 0xa8, 0xfc, 0x28, 0xa8, 0x0f, 0xd8, 0xc0, 0x44, 0x9c, 0xa1, 0xba, 0xdb, - 0xba, 0xde, 0x57, 0x13, 0xc8, 0x77, 0x5d, 0xa8, 0xf5, 0xc1, 0xeb, 0x47, - 0x6c, 0x4c, 0xcc, 0x5a, 0xd4, 0x57, 0x4e, 0xeb, 0xf6, 0x3b, 0xfe, 0x3c, - 0x2f, 0x1e, 0x94, 0xdc, 0x8e, 0xd2, 0x4b, 0x63, 0x93, 0xab, 0x3f, 0x26, - 0x3f, 0x44, 0x45, 0x79, 0x7e, 0x1e, 0x28, 0x82, 0xa0, 0x35, 0x5f, 0xb6, - 0xc0, 0xa0, 0x48, 0x00, 0x6d, 0x14, 0x68, 0xe4, 0xfb, 0xaf, 0x21, 0xb7, - 0xee, 0x6b, 0xcc, 0x61, 0xc8, 0xb1, 0xa4, 0xdb, 0x54, 0xd9, 0x49, 0xa2, - 0x14, 0xb3, 0xcb, 0xd0, 0x00, 0xb8, 0x01, 0x6d, 0x3d, 0x1d, 0xde, 0x6a, - 0xcc, 0xb4, 0xd1, 0x48, 0xa3, 0x65, 0x3f, 0xd8, 0x32, 0xdd, 0x47, 0x38, - 0x57, 0x37, 0x4a, 0x64, 0x96, 0xce, 0x8c, 0x59, 0x48, 0x26, 0xef, 0xaa, - 0x71, 0xba, 0x28, 0xdd, 0x4f, 0xbf, 0x7a, 0x69, 0xb9, 0xcc, 0x74, 0x33, - 0xb3, 0x67, 0x61, 0xe0, 0xc7, 0x01, 0x5e, 0x66, 0xa8, 0x09, 0x9e, 0xdb, - 0x90, 0x1c, 0x35, 0xe9, 0xbb, 0xd0, 0x77, 0xfd, 0xe4, 0x4b, 0xd0, 0xe4, - 0xbd, 0x42, 0x29, 0xd4, 0xba, 0x3b, 0x09, 0x7d, 0x60, 0xc4, 0x1a, 0x5f, - 0x7a, 0x09, 0x94, 0xdc, 0x2e, 0xdd, 0x00, 0x32, 0x21, 0xac, 0xca, 0x68, - 0xc8, 0x26, 0xdf, 0x82, 0xf5, 0x7c, 0x1a, 0x31, 0x36, 0x41, 0xc2, 0xec, - 0xb2, 0xe0, 0x7c, 0x3c, 0x95, 0xdb, 0x9c, 0x13, 0x57, 0x12, 0x95, 0x12, - 0xec, 0x6a, 0xfe, 0x46, 0xd9, 0x03, 0xd4, 0x59, 0x41, 0x6c, 0x7b, 0xa3, - 0x14, 0x2d, 0x72, 0xc8, 0xf3, 0x8a, 0x3c, 0x95, 0x7a, 0xff, 0x4a, 0x25, - 0x14, 0xe5, 0x13, 0xc2, 0x71, 0x34, 0x8b, 0x43, 0xc5, 0x80, 0x03, 0xbd, - 0xdf, 0x88, 0xd7, 0xdd, 0xec, 0x57, 0x94, 0x77, 0xbd, 0xae, 0x37, 0x20, - 0x7f, 0x99, 0x80, 0xa2, 0xab, 0x6d, 0x5e, 0xd5, 0x82, 0xa3, 0xac, 0x8d, - 0x23, 0x29, 0xb3, 0x26, 0x59, 0xb1, 0xa6, 0xab, 0x1b, 0xa6, 0x3a, 0xd9, - 0x3d, 0x70, 0x50, 0xe4, 0x70, 0xf1, 0x92, 0x6c, 0x4c, 0xcb, 0xae, 0xce, - 0x06, 0x2a, 0xc2, 0x1b, 0x24, 0xbf, 0x19, 0x55, 0x25, 0xb0, 0x2c, 0x6e, - 0x85, 0x06, 0x09, 0x71, 0xba, 0xc0, 0xf7, 0xc2, 0x04, 0x0b, 0xe1, 0x37, - 0xf8, 0xdd, 0xa8, 0x4c, 0xde, 0xe5, 0xb3, 0x31, 0x0b, 0xb6, 0x6f, 0x4d, - 0x39, 0xee, 0x7e, 0xce, 0xad, 0xdb, 0xd2, 0x8d, 0x9b, 0x18, 0x7d, 0xc0, - 0x74, 0xe3, 0xf6, 0x18, 0x68, 0xc8, 0xe9, 0x67, 0xbf, 0xbb, 0x97, 0xbb, - 0x17, 0x62, 0x51, 0x3d, 0xe9, 0x22, 0x36, 0x02, 0xf6, 0x53, 0x74, 0x80, - 0x08, 0x6e, 0xff, 0x4b, 0x47, 0xab, 0x3a, 0xf1, 0x31, 0x78, 0xd2, 0xbe, - 0x57, 0x92, 0x25, 0x1a, 0x73, 0x2e, 0x9d, 0x84, 0xef, 0x49, 0x6f, 0xf6, - 0x97, 0x59, 0xbc, 0x0f, 0x10, 0xce, 0x4e, 0xf0, 0x4d, 0xc4, 0x6e, 0x0b, - 0xc2, 0x40, 0xa0, 0x90, 0x8f, 0xdf, 0x05, 0xc6, 0x74, 0xf0, 0x3a, 0xc6, - 0xd8, 0x03, 0x14, 0x3b, 0x25, 0x95, 0xa4, 0xa3, 0xd9, 0x69, 0x7d, 0xb4, - 0xe1, 0xdc, 0x03, 0x4c, 0xe9, 0xd4, 0xde, 0x0f, 0x97, 0xd5, 0x3a, 0xe4, - 0x7b, 0x62, 0xa7, 0xc9, 0x75, 0x8b, 0x79, 0xfb, 0x5d, 0xe4, 0x38, 0x3e, - 0xcc, 0x02, 0xb9, 0xcc, 0x04, 0x94, 0x71, 0x6c, 0x17, 0x51, 0x9f, 0xe8, - 0x6c, 0x27, 0x74, 0x70, 0x61, 0x68, 0xaf, 0xab, 0x1b, 0x9f, 0x52, 0x92, - 0x09, 0xb5, 0x3f, 0xc3, 0xc9, 0xa0, 0x35, 0x6e, 0x98, 0xfc, 0x60, 0x1c, - 0xc6, 0x8a, 0xc2, 0x8a, 0x32, 0x54, 0x34, 0x7b, 0xf9, 0x3d, 0x0b, 0x20, - 0x76, 0x03, 0xfc, 0x03, 0xe8, 0x8a, 0xde, 0x99, 0x81, 0x8a, 0x61, 0xb1, - 0xcf, 0x4f, 0xc4, 0x49, 0x1c, 0x88, 0xfe, 0x93, 0xa9, 0x0b, 0x21, 0xc1, - 0x64, 0x8e, 0x26, 0xeb, 0x1a, 0x6e, 0xd3, 0x55, 0x2e, 0x0e, 0x82, 0x2d, - 0x0f, 0x31, 0xcd, 0x03, 0x07, 0xf0, 0x81, 0xc7, 0x3b, 0x23, 0x25, 0x98, - 0xaf, 0x0d, 0x33, 0xc7, 0xc1, 0x1f, 0x5b, 0x15, 0x8f, 0x6c, 0x80, 0x49, - 0x97, 0x49, 0xf7, 0x6d, 0x3c, 0x3e, 0x71, 0xbf, 0xcd, 0xce, 0xc2, 0x67, - 0x99, 0xf4, 0xb7, 0xa0, 0x17, 0xef, 0x37, 0xd6, 0x57, 0xd3, 0xa3, 0x69, - 0x2f, 0x6c, 0x34, 0xc4, 0xc9, 0xc2, 0xa5, 0x8a, 0x4c, 0x69, 0xd3, 0x04, - 0x35, 0x63, 0xae, 0x03, 0x0d, 0xef, 0xb4, 0xbd, 0x5e, 0x66, 0xcd, 0xff, - 0xd5, 0xa1, 0x26, 0x16, 0x83, 0x39, 0xfc, 0xba, 0x38, 0xd6, 0x44, 0x3a, - 0x7e, 0x26, 0xa2, 0x94, 0x69, 0xd7, 0x4c, 0x55, 0xb2, 0xfe, 0xc1, 0x66, - 0x90, 0x3e, 0x5e, 0x50, 0x83, 0x9d, 0x83, 0xc2, 0xc1, 0x95, 0xbc, 0xf0, - 0x38, 0xf5, 0x38, 0xb3, 0x9c, 0x96, 0x20, 0x10, 0xed, 0xfc, 0x42, 0xa3, - 0x8c, 0x3d, 0x46, 0x42, 0xd8, 0xb3, 0x1b, 0x95, 0xc3, 0xc1, 0x75, 0xb9, - 0x30, 0xd6, 0x65, 0xb2, 0x8f, 0xfd, 0xa2, 0x59, 0x2a, 0x20, 0x4c, 0x91, - 0xc4, 0x2d, 0xcf, 0xd7, 0x47, 0xa0, 0xbd, 0x8b, 0x13, 0x83, 0xef, 0x52, - 0x49, 0x09, 0xdc, 0x6e, 0xb9, 0xbc, 0x95, 0x81, 0x8c, 0x1e, 0xf8, 0x5c, - 0x2e, 0x0a, 0xf3, 0x5d, 0xa8, 0xd8, 0x8e, 0x8f, 0x0d, 0xc4, 0x96, 0x1c, - 0x0d, 0x08, 0xa0, 0x85, 0xef, 0xa3, 0x99, 0xfa, 0x34, 0x53, 0xc2, 0x58, - 0x58, 0xc2, 0xab, 0x08, 0xba, 0xe1, 0xce, 0xb6, 0xfc, 0x5c, 0xec, 0x83, - 0xa2, 0x9b, 0x34, 0x1a, 0xaa, 0x15, 0x2a, 0x95, 0x06, 0x8e, 0xb8, 0xd4, - 0x6e, 0x7b, 0x79, 0x3b, 0xb3, 0x1e, 0x55, 0x44, 0x64, 0x51, 0xf7, 0x8e, - 0x5d, 0x28, 0x40, 0x68, 0xae, 0x89, 0xfe, 0x8b, 0x5a, 0xf7, 0x76, 0xb7, - 0x7b, 0x0b, 0x31, 0xc2, 0x69, 0x6c, 0x4a, 0x54, 0x54, 0xce, 0x49, 0xf3, - 0x39, 0xec, 0x7e, 0x1e, 0x24, 0x7d, 0x0f, 0x86, 0xee, 0x86, 0x40, 0x1b, - 0xe4, 0xf2, 0x63, 0x69, 0x9a, 0xfe, 0x3b, 0x70, 0x63, 0xde, 0x1b, 0xfa, - 0xef, 0xcc, 0xa0, 0x7e, 0x39, 0x97, 0xc6, 0x87, 0xb2, 0x1b, 0x87, 0x91, - 0x06, 0x20, 0xfc, 0xec, 0xe1, 0x00, 0xf1, 0xdf, 0x41, 0x35, 0x7e, 0x03, - 0x53, 0x0c, 0xc6, 0x08, 0x46, 0xbb, 0x51, 0xe2, 0x1f, 0x81, 0x58, 0x21, - 0xfb, 0xcf, 0xaa, 0xd9, 0x1f, 0xbf, 0xbd, 0xad, 0x2c, 0x24, 0x61, 0x4b, - 0x58, 0x99, 0x79, 0xcf, 0x43, 0x1e, 0x49, 0x80, 0x43, 0xb2, 0xd2, 0x73, - 0x06, 0xa9, 0x51, 0x22, 0xa5, 0x4a, 0x02, 0xe7, 0x09, 0x6f, 0xa8, 0xf7, - 0x62, 0xf8, 0x11, 0x0e, 0x3c, 0x63, 0xbb, 0xca, 0xff, 0xdd, 0x27, 0xd3, - 0x8c, 0x4f, 0xf9, 0x03, 0xdb, 0x84, 0x17, 0xb8, 0x04, 0xef, 0x23, 0x7b, - 0xcf, 0x07, 0xb5, 0x52, 0xa0, 0x2f, 0x7f, 0xb0, 0x9a, 0xa3, 0x16, 0x46, - 0x97, 0xb3, 0x2e, 0xfd, 0x35, 0xfc, 0x6f, 0xee, 0xf2, 0x74, 0xe7, 0x34, - 0x44, 0xa0, 0xa9, 0xdb, 0xb8, 0x57, 0xf4, 0xd0, 0x80, 0x32, 0x57, 0x02, - 0xbd, 0x81, 0xc7, 0x43, 0x33, 0x9c, 0x3f, 0xf2, 0xa1, 0x92, 0xd4, 0x6c, - 0xb8, 0x96, 0xc9, 0xb4, 0x38, 0x36, 0x54, 0x50, 0x4b, 0x2a, 0x56, 0xd2, - 0xaa, 0x88, 0x61, 0xd4, 0x98, 0x70, 0x37, 0x42, 0x92, 0x4f, 0x12, 0xf3, - 0xfc, 0xc7, 0xb6, 0x9b, 0xcd, 0xc8, 0xf9, 0x96, 0xcc, 0x78, 0xbb, 0x09, - 0x7d, 0xe1, 0xaf, 0xe8, 0xa3, 0x69, 0xe2, 0xfa, 0x9c, 0x6f, 0x56, 0xb1, - 0x83, 0xa3, 0xca, 0xd9, 0x02, 0xc2, 0xde, 0x26, 0x3d, 0xfb, 0x38, 0xfc, - 0xb6, 0x72, 0x2d, 0x85, 0x94, 0x73, 0x61, 0x70, 0x5a, 0x79, 0xa3, 0x6f, - 0x54, 0xd4, 0x92, 0x68, 0xd3, 0xff, 0x5c, 0xbd, 0x6b, 0x97, 0x42, 0xec, - 0x0c, 0xf5, 0x07, 0x5a, 0xca, 0x8d, 0xe9, 0xc8, 0x4e, 0xe3, 0x97, 0xf7, - 0xa5, 0xee, 0x2a, 0x35, 0x54, 0x7d, 0x86, 0x0f, 0x42, 0xd4, 0x94, 0xd9, - 0x5c, 0x5e, 0xe7, 0x32, 0x45, 0xfe, 0x0e, 0x20, 0x85, 0xa1, 0xe2, 0x3a, - 0x51, 0x64, 0xf3, 0x18, 0x03, 0x36, 0x26, 0xf1, 0xc1, 0x43, 0xfa, 0xd3, - 0xd0, 0xc4, 0x03, 0x54, 0x7f, 0xfc, 0x85, 0xdc, 0x84, 0x55, 0xf3, 0x48, - 0xbd, 0x26, 0xb5, 0xc2, 0x5b, 0x2b, 0x74, 0x3a, 0x89, 0x84, 0xcb, 0x1a, - 0xc4, 0xc7, 0xc6, 0xa1, 0xa9, 0xe0, 0x01, 0x80, 0xbe, 0x78, 0x0a, 0xcd, - 0x39, 0x73, 0x69, 0x7c, 0x35, 0xbd, 0x5b, 0x32, 0x0d, 0x49, 0xc6, 0xe7, - 0xbc, 0x9b, 0x15, 0xb9, 0x08, 0x5f, 0x56, 0xee, 0x2c, 0x90, 0x4e, 0x22, - 0x14, 0x5f, 0x56, 0x29, 0xcb, 0x1e, 0x7e, 0x8b, 0x3d, 0xa8, 0xa1, 0xc7, - 0xb5, 0x15, 0x3a, 0x48, 0x31, 0x72, 0x5c, 0x8a, 0xc0, 0x72, 0xf4, 0x55, - 0x93, 0x70, 0xe7, 0x3e, 0x4e, 0x21, 0x4e, 0x33, 0x83, 0x65, 0xad, 0xca, - 0x81, 0x10, 0x82, 0xab, 0x0b, 0xd0, 0x72, 0xcc, 0x56, 0x06, 0x18, 0xdc, - 0xd7, 0x64, 0x19, 0xef, 0xa7, 0xdb, 0x14, 0x19, 0x8a, 0x9d, 0x38, 0xff, - 0xf5, 0xe4, 0x66, 0x08, 0x1b, 0xee, 0x0a, 0xa0, 0xc5, 0x52, 0x93, 0x27, - 0xd7, 0x08, 0x80, 0x46, 0x07, 0xd7, 0xb4, 0x5a, 0x13, 0x74, 0xd2, 0x51, - 0xe0, 0x4a, 0x28, 0x59, 0x32, 0xce, 0x1f, 0xfb, 0x97, 0x76, 0xc3, 0x4b, - 0xe8, 0x14, 0xb1, 0x99, 0xae, 0x8d, 0x78, 0xe2, 0x54, 0x65, 0x91, 0xdc, - 0x5f, 0x43, 0x7e, 0x87, 0xbf, 0x34, 0xde, 0xb2, 0xb2, 0xd4, 0xa9, 0xbb, - 0x39, 0xf2, 0x17, 0x5b, 0x69, 0xeb, 0x16, 0x11, 0x82, 0xa6, 0x5d, 0x5f, - 0x18, 0xca, 0xd7, 0xeb, 0xe5, 0xe0, 0x5e, 0x73, 0x02, 0xed, 0x1a, 0xab, - 0xfe, 0x09, 0x26, 0xeb, 0x11, 0xb0, 0x48, 0x00, 0x89, 0xcd, 0xe2, 0x30, - 0x7f, 0x41, 0xbe, 0x27, 0xf5, 0x1a, 0xc4, 0xc5, 0xfd, 0x42, 0x79, 0x61, - 0x1a, 0xde, 0x4a, 0x14, 0x01, 0x13, 0xeb, 0x39, 0xc7, 0x9a, 0x44, 0x5f, - 0xe1, 0x71, 0x5e, 0xf8, 0x5f, 0x0d, 0xc4, 0x66, 0x00, 0x18, 0x82, 0x5e, - 0x9e, 0x7b, 0x3d, 0xf9, 0xcb, 0x89, 0x39, 0xd6, 0xb5, 0x53, 0x1b, 0x29, - 0x6f, 0xf1, 0x55, 0x86, 0xa2, 0x3f, 0x51, 0xff, 0xcc, 0x87, 0x70, 0xca, - 0x55, 0x25, 0x49, 0x36, 0x4c, 0xd0, 0x0e, 0x44, 0x82, 0x6b, 0xf9, 0x1b, - 0xd7, 0x80, 0x6d, 0xc2, 0x00, 0x67, 0x61, 0xf4, 0x62, 0x36, 0xed, 0x62, - 0x70, 0xfb, 0xae, 0xc6, 0xa7, 0xda, 0xeb, 0xf9, 0xef, 0x01, 0x77, 0x86, - 0x48, 0x17, 0x7d, 0xa4, 0xc6, 0xb3, 0x1a, 0x4b, 0x42, 0x54, 0x18, 0xad, - 0x01, 0xf2, 0xe3, 0xa5, 0x4f, 0xcf, 0x11, 0xda, 0x78, 0xec, 0x40, 0x60, - 0x00, 0x9b, 0x30, 0x49, 0xf0, 0x16, 0x0e, 0xe8, 0xf3, 0xbc, 0xe4, 0xa7, - 0x5b, 0xe2, 0x38, 0x48, 0xfb, 0x9d, 0x09, 0xc4, 0x46, 0x49, 0xc5, 0x53, - 0xf5, 0x7f, 0x8b, 0x9b, 0xd7, 0x9b, 0xe3, 0x30, 0x3d, 0xd5, 0x97, 0x18, - 0xbc, 0x5a, 0x44, 0x8e, 0xa4, 0x7c, 0x77, 0x22, 0x44, 0x2c, 0x8f, 0xe1, - 0xf6, 0xfb, 0x67, 0xee, 0x25, 0xca, 0x31, 0x62, 0x1b, 0x71, 0x34, 0x67, - 0x90, 0x71, 0x4a, 0x0e, 0xa9, 0x83, 0xc0, 0x31, 0x88, 0xfe, 0x12, 0xc1, - 0xed, 0x87, 0x84, 0xff, 0xfc, 0x19, 0x8b, 0xca, 0x6d, 0x07, 0xce, 0xb6, - 0xf3, 0x9a, 0xdf, 0x92, 0x7b, 0x4f, 0x6a, 0x27, 0xd1, 0x32, 0x25, 0x23, - 0x38, 0xf7, 0x97, 0x77, 0x6c, 0x9c, 0x46, 0x9a, 0x66, 0xbc, 0xab, 0x65, - 0x25, 0x42, 0x28, 0x42, 0x5a, 0x56, 0x15, 0xf6, 0x89, 0xd4, 0x9a, 0x59, - 0xbe, 0xfd, 0x23, 0x1a, 0xca, 0x2d, 0x8b, 0x9e, 0x28, 0xef, 0x48, 0xac, - 0x90, 0xed, 0xd3, 0xbb, 0xf8, 0xc5, 0x1e, 0x1d, 0xdc, 0x73, 0xdd, 0x04, - 0xc7, 0xa7, 0xab, 0x22, 0xcf, 0xde, 0x52, 0x7d, 0x62, 0x51, 0x27, 0xe2, - 0x03, 0xc4, 0xec, 0xc2, 0x80, 0x5f, 0x12, 0x10, 0x80, 0x45, 0x94, 0x07, - 0xa3, 0x7e, 0x5a, 0xda, 0x2b, 0x7c, 0x39, 0xc6, 0x84, 0xcc, 0x62, 0x62, - 0x3f, 0x77, 0xd7, 0x47, 0xd5, 0xd9, 0xf0, 0x44, 0x90, 0x20, 0x7f, 0x84, - 0xb7, 0x2a, 0xd1, 0x90, 0x58, 0xf8, 0xa2, 0x67, 0x45, 0x39, 0x4a, 0x2c, - 0x68, 0x22, 0x8c, 0x2f, 0xb7, 0x06, 0x5e, 0x5c, 0x2e, 0xb5, 0x85, 0x9d, - 0x5e, 0xd0, 0x55, 0xb2, 0x6e, 0xcb, 0x4c, 0x93, 0xb7, 0xb8, 0xab, 0xf9, - 0xf0, 0x89, 0x70, 0x35, 0xa3, 0x9b, 0xbb, 0x13, 0x16, 0x65, 0x47, 0x1f, - 0x17, 0x0b, 0xf0, 0x23, 0x6b, 0x1e, 0x4a, 0xd9, 0x16, 0x2e, 0xdb, 0x1c, - 0xc7, 0x26, 0x9e, 0x83, 0x0e, 0x53, 0x2b, 0xca, 0x16, 0xcc, 0xaa, 0x76, - 0x0d, 0xa1, 0x9e, 0x4f, 0x24, 0x35, 0xf4, 0xc8, 0xf9, 0xfc, 0x26, 0xf3, - 0x0a, 0xba, 0x3a, 0xa5, 0x76, 0x4f, 0x4a, 0x7b, 0x49, 0xf9, 0x65, 0x0b, - 0xe6, 0x39, 0xa9, 0x8e, 0x8c, 0x05, 0x4a, 0x49, 0x86, 0x2a, 0x04, 0x36, - 0xf7, 0x83, 0x4a, 0x53, 0xb2, 0x2c, 0x10, 0x44, 0xfb, 0x53, 0x4a, 0x77, - 0x2e, 0xd1, 0xa0, 0xa9, 0x0b, 0x49, 0xbb, 0x6b, 0x1e, 0x2a, 0x14, 0xed, - 0x91, 0x01, 0xa2, 0x66, 0x35, 0x2b, 0xf6, 0xfb, 0x75, 0xba, 0x11, 0x30, - 0xfe, 0x18, 0xbf, 0xab, 0x65, 0xd3, 0x13, 0x00, 0xcd, 0x36, 0xd6, 0x4f, - 0x21, 0x4c, 0x77, 0xa3, 0xec, 0x5a, 0xa3, 0x23, 0x03, 0x63, 0xae, 0x79, - 0xcf, 0x86, 0xc2, 0x26, 0xa6, 0x99, 0x4f, 0x57, 0x51, 0x37, 0xa4, 0x32, - 0x5f, 0xf1, 0x5b, 0xa7, 0x6a, 0x28, 0xf2, 0x61, 0x7b, 0x70, 0xab, 0x5b, - 0x00, 0xa6, 0x7b, 0xea, 0x58, 0x42, 0x73, 0x85, 0xc6, 0x58, 0xbd, 0xc8, - 0x37, 0xcb, 0x00, 0x17, 0x1b, 0x7c, 0xce, 0xdf, 0x1c, 0x23, 0x2e, 0x78, - 0x21, 0x2e, 0x20, 0xfa, 0x58, 0x88, 0xd9, 0x92, 0x77, 0xf6, 0xb2, 0x16, - 0x53, 0x37, 0x6b, 0x71, 0x9c, 0xbb, 0xe3, 0x5d, 0x25, 0x92, 0x9d, 0xd3, - 0xf2, 0xea, 0x52, 0x25, 0xb9, 0xb6, 0x59, 0x9b, 0xaf, 0x36, 0xd7, 0xb3, - 0xe2, 0x6e, 0x95, 0x6a, 0x71, 0xae, 0x60, 0x86, 0xa4, 0x1e, 0x2b, 0x03, - 0xf4, 0x96, 0x8c, 0x8b, 0x2a, 0x1d, 0xdb, 0x29, 0x21, 0xfb, 0x67, 0x22, - 0x4e, 0x10, 0x9c, 0x44, 0x84, 0x37, 0xee, 0x82, 0xe1, 0x79, 0xc8, 0x91, - 0x8c, 0x79, 0x5f, 0x94, 0xa5, 0x8b, 0x97, 0x72, 0x56, 0xbd, 0x22, 0x34, - 0x03, 0x8d, 0xaf, 0x3b, 0x92, 0x1c, 0x1f, 0x42, 0x9d, 0x54, 0xa2, 0x4f, - 0xbb, 0xc3, 0x7a, 0x83, 0x2b, 0xa1, 0xcf, 0xbc, 0x59, 0x31, 0xfc, 0x47, - 0xf3, 0x99, 0xf4, 0x87, 0x76, 0xaf, 0x93, 0xaa, 0x54, 0xbf, 0x15, 0x61, - 0xcf, 0xab, 0xcc, 0x25, 0xf4, 0x34, 0x35, 0x67, 0x24, 0x4c, 0x03, 0xa1, - 0x4d, 0xd8, 0x34, 0x6d, 0x71, 0x25, 0x3f, 0x1b, 0xaf, 0x69, 0x11, 0x8c, - 0xdf, 0x40, 0xce, 0x27, 0x57, 0xd3, 0x15, 0xc3, 0x7e, 0x03, 0x70, 0x6e, - 0x61, 0x6d, 0xbb, 0xbd, 0x5e, 0xcf, 0x31, 0x24, 0xff, 0xa4, 0x64, 0x8f, - 0xe5, 0xda, 0x77, 0x10, 0x34, 0xe8, 0x92, 0x7f, 0xe8, 0x33, 0xcd, 0x30, - 0xd9, 0xb1, 0xfe, 0xb1, 0x50, 0xa3, 0x8d, 0x5e, 0xd3, 0xb0, 0x33, 0xff, - 0xe2, 0xd0, 0xe0, 0xd9, 0xd5, 0xb8, 0xf9, 0x56, 0x87, 0xa2, 0xeb, 0xf7, - 0x54, 0xf4, 0x8a, 0x82, 0x52, 0x38, 0xbc, 0x3d, 0x7d, 0x11, 0xee, 0xf2, - 0xd6, 0xd1, 0xdf, 0x72, 0xcb, 0xfb, 0xb9, 0x01, 0x24, 0x2b, 0x69, 0x74, - 0x64, 0x81, 0xc8, 0x67, 0xef, 0x6f, 0xc5, 0x5a, 0x79, 0x0e, 0x30, 0x61, - 0xd5, 0x5d, 0x20, 0xf5, 0x6f, 0xa9, 0x95, 0x0f, 0x33, 0x69, 0x7c, 0x0a, - 0x65, 0x59, 0x0c, 0x31, 0xd1, 0x59, 0x52, 0x99, 0x9e, 0xe3, 0xa2, 0x06, - 0x74, 0x9e, 0x88, 0x83, 0x60, 0x11, 0x59, 0x1f, 0xa9, 0xbd, 0x01, 0x95, - 0x79, 0x22, 0x99, 0xcd, 0x9d, 0xcf, 0xbb, 0xd6, 0x76, 0x68, 0x94, 0x9e, - 0x5e, 0xa0, 0xad, 0xfd, 0x63, 0x46, 0x37, 0x7b, 0x86, 0xbd, 0xe1, 0xb7, - 0x32, 0xd9, 0x0f, 0xb0, 0xee, 0xe0, 0x74, 0x9d, 0x53, 0x2b, 0x16, 0x82, - 0x16, 0xe3, 0xf0, 0xb2, 0x33, 0x3d, 0x24, 0x8a, 0xd2, 0x77, 0x62, 0x12, - 0x6b, 0x1f, 0x34, 0x04, 0xe4, 0x37, 0x78, 0xf2, 0xcf, 0x8f, 0xb4, 0x7e, - 0xe5, 0xda, 0xc6, 0x99, 0xb2, 0xc8, 0x79, 0xdd, 0x5e, 0xd0, 0x4a, 0xba, - 0x55, 0x52, 0x6b, 0x24, 0x34, 0x15, 0xaf, 0x08, 0x9f, 0x4c, 0x66, 0x30, - 0x52, 0x44, 0x31, 0x99, 0x53, 0x7b, 0x9f, 0xf0, 0x2b, 0x5b, 0x5c, 0xfa, - 0x1e, 0x0a, 0xd6, 0x5e, 0x44, 0x36, 0x48, 0xce, 0x7f, 0xc7, 0x16, 0x8f, - 0x0c, 0xeb, 0x4c, 0x33, 0x04, 0x91, 0x08, 0x60, 0x94, 0x19, 0x58, 0x5b, - 0x78, 0xa9, 0x67, 0x2a, 0x8f, 0x85, 0xeb, 0xf0, 0xd5, 0x31, 0xa7, 0x69, - 0x8f, 0x33, 0x4c, 0x25, 0x85, 0x36, 0x7a, 0x8e, 0x1d, 0xbe, 0x96, 0x16, - 0xe4, 0x34, 0xce, 0x59, 0x22, 0x02, 0xef, 0x73, 0x57, 0xa8, 0xb1, 0x48, - 0x90, 0x40, 0xab, 0xdd, 0x95, 0xa0, 0x2e, 0x80, 0xda, 0x63, 0xa8, 0x9e, - 0xfe, 0xb7, 0xdf, 0xdb, 0x0f, 0xb5, 0x44, 0x2e, 0x4e, 0x89, 0x51, 0x3a, - 0x93, 0x40, 0x0c, 0x43, 0xc8, 0x35, 0x82, 0x8c, 0x9b, 0x17, 0x87, 0xb8, - 0x25, 0xa1, 0xbd, 0x14, 0x09, 0xab, 0x18, 0x28, 0x67, 0xdd, 0x08, 0xb6, - 0x7f, 0x0f, 0x15, 0xd8, 0x73, 0x3e, 0xa0, 0x51, 0x52, 0x6a, 0xad, 0x64, - 0xa0, 0x2d, 0x50, 0xd1, 0x8a, 0x00, 0xd8, 0x8a, 0xfa, 0x0b, 0x7e, 0x36, - 0xfb, 0x8d, 0xb2, 0xe8, 0x07, 0x9f, 0xee, 0xe4, 0x12, 0xd9, 0x58, 0xf7, - 0x39, 0x63, 0x43, 0x38, 0xf0, 0x3d, 0x7f, 0xc1, 0x7d, 0xb0, 0x34, 0x71, - 0xab, 0xd0, 0x62, 0xec, 0x09, 0x6c, 0x7b, 0x32, 0x23, 0xf2, 0xfe, 0x97, - 0xd2, 0x72, 0x21, 0x1b, 0xb9, 0x58, 0x87, 0x77, 0x12, 0x23, 0x1c, 0x55, - 0xbf, 0xf1, 0xeb, 0x51, 0x01, 0xed, 0x79, 0xef, 0xa9, 0x8f, 0x17, 0xfc, - 0x42, 0x9e, 0x4b, 0xe6, 0x49, 0x88, 0x57, 0x37, 0x36, 0x73, 0xf5, 0xa7, - 0xeb, 0xab, 0x2f, 0x76, 0x72, 0x60, 0x7b, 0xf8, 0x4f, 0x26, 0x10, 0xa2, - 0xf7, 0x8c, 0x74, 0xb7, 0x5b, 0x3c, 0xc2, 0x73, 0xa2, 0x7a, 0x52, 0xb0, - 0xe2, 0x28, 0xa0, 0xde, 0xb9, 0xa6, 0x35, 0x98, 0x15, 0x02, 0x1d, 0x40, - 0x76, 0xd6, 0x26, 0x1f, 0x2f, 0xfd, 0x13, 0x4a, 0x55, 0x71, 0x9c, 0x87, - 0x43, 0x1d, 0x59, 0xf2, 0xe8, 0x6e, 0xf1, 0xfd, 0x05, 0x7a, 0xb2, 0xf2, - 0x03, 0x56, 0x62, 0x55, 0x1b, 0xa2, 0xcc, 0x1e, 0x77, 0xdd, 0xe3, 0xba, - 0x75, 0x02, 0x50, 0x41, 0x86, 0xd4, 0x82, 0xee, 0x78, 0x78, 0xa6, 0x52, - 0xfc, 0xdc, 0xe6, 0x84, 0xa5, 0x81, 0x0f, 0xb7, 0x3a, 0xef, 0x01, 0x6d, - 0x26, 0x91, 0x94, 0xa4, 0x65, 0xcf, 0x7c, 0x5c, 0x82, 0x73, 0xff, 0x7a, - 0x99, 0xa0, 0x63, 0xf0, 0x17, 0x23, 0xef, 0x09, 0x4d, 0x3c, 0xd0, 0x9e, - 0x0c, 0xe3, 0x2c, 0x8b, 0x1e, 0xfd, 0xc6, 0x85, 0x83, 0x1c, 0x09, 0x63, - 0xfd, 0xbb, 0xc5, 0xcf, 0xb5, 0xd1, 0xcc, 0x7c, 0x8b, 0x39, 0x67, 0xa6, - 0x0b, 0x01, 0x11, 0xc3, 0xf4, 0x66, 0xa8, 0x16, 0xff, 0x77, 0x93, 0x6b, - 0x42, 0xa1, 0x9f, 0x3e, 0x2c, 0xbd, 0x93, 0x10, 0x33, 0xe6, 0xad, 0x8f, - 0xaa, 0x7e, 0xa3, 0xe4, 0x35, 0x6b, 0x7b, 0x8f, 0x00, 0x16, 0xee, 0xa6, - 0x18, 0xd5, 0xe7, 0x2f, 0xd0, 0x07, 0x7b, 0x04, 0xf8, 0x29, 0x5a, 0xa9, - 0xcf, 0x59, 0xa9, 0xb6, 0x5b, 0xab, 0x98, 0x47, 0x26, 0xe3, 0xc9, 0xbe, - 0x90, 0x0b, 0x57, 0xa0, 0x7b, 0xca, 0x78, 0x70, 0x2f, 0x99, 0x3a, 0x3e, - 0x54, 0x5c, 0x2c, 0x47, 0x94, 0x3d, 0x28, 0x1c, 0x52, 0xc5, 0x77, 0x48, - 0xbf, 0xf7, 0x18, 0x53, 0xcd, 0xcb, 0x5f, 0xd6, 0x74, 0x01, 0xf0, 0x37, - 0x2f, 0xf3, 0x2e, 0xa9, 0x67, 0x8b, 0x31, 0xb4, 0x7d, 0xd9, 0xd8, 0x41, - 0x04, 0x3c, 0x3c, 0xc0, 0x5d, 0x81, 0xcc, 0x52, 0xf5, 0xe5, 0x22, 0xd5, - 0x02, 0xeb, 0xf6, 0xe3, 0x98, 0x96, 0xe8, 0x98, 0x32, 0x7b, 0xbb, 0x25, - 0xba, 0xfa, 0xea, 0x45, 0xb5, 0xfb, 0x07, 0xeb, 0x4f, 0x39, 0xc3, 0xae, - 0xb6, 0x63, 0xc5, 0x32, 0x57, 0x47, 0xc7, 0xe6, 0xaa, 0xa1, 0xbc, 0xa9, - 0x03, 0x72, 0xf8, 0xcf, 0x05, 0x34, 0xfb, 0x05, 0xd1, 0x54, 0xfc, 0xa7, - 0xf5, 0x45, 0xe2, 0x65, 0x62, 0xc6, 0xb1, 0x62, 0xd1, 0xfa, 0x1e, 0x57, - 0xe1, 0x33, 0x34, 0xd8, 0x25, 0xe4, 0xcc, 0xaa, 0xd4, 0xd4, 0xa0, 0xc9, - 0x9b, 0xe5, 0x16, 0x85, 0x66, 0x49, 0x81, 0xb3, 0x33, 0x5b, 0x0f, 0xde, - 0x3b, 0x3e, 0x93, 0x07, 0x4a, 0xc7, 0x0c, 0xec, 0x7c, 0x0a, 0x02, 0xa3, - 0x50, 0x50, 0xf1, 0xb9, 0xab, 0xa0, 0xd3, 0x54, 0xb4, 0x30, 0xce, 0x70, - 0x01, 0xc2, 0xa8, 0x5d, 0x62, 0xa1, 0xd7, 0x39, 0xe9, 0x36, 0x6e, 0xcb, - 0x4b, 0x17, 0x40, 0xf7, 0xaa, 0xb5, 0x9c, 0x75, 0xc5, 0xd8, 0x78, 0x88, - 0x6b, 0x49, 0xdf, 0x12, 0x93, 0x43, 0x68, 0x3f, 0xcb, 0x8a, 0x68, 0x6d, - 0xdd, 0x32, 0xb9, 0x0b, 0x15, 0xf4, 0x4c, 0xb5, 0xbb, 0xc9, 0x1d, 0xda, - 0x59, 0xde, 0x88, 0xe3, 0xcf, 0x97, 0x85, 0xd5, 0x00, 0x18, 0xaa, 0x36, - 0xa8, 0x61, 0x3e, 0x39, 0x0c, 0xba, 0xab, 0xc9, 0xe4, 0x87, 0xa1, 0xf0, - 0xb7, 0x2a, 0x1c, 0xfe, 0xf5, 0x09, 0x49, 0x85, 0x80, 0x5e, 0xc9, 0x79, - 0x98, 0x22, 0xb5, 0x08, 0x9d, 0xef, 0x56, 0xb3, 0x01, 0x3c, 0xc1, 0x85, - 0x57, 0x90, 0x02, 0x8a, 0xe0, 0x18, 0xf9, 0xa8, 0x86, 0x51, 0x3b, 0x57, - 0x3a, 0x66, 0x34, 0xfb, 0x86, 0x3b, 0xcb, 0x53, 0x35, 0x56, 0x55, 0x69, - 0xc8, 0x24, 0x3d, 0x66, 0xe8, 0x7e, 0xf7, 0xe9, 0x6a, 0xdb, 0x2c, 0x78, - 0xb8, 0x64, 0x11, 0x1d, 0xa7, 0xe4, 0xd4, 0xfc, 0x30, 0xf3, 0x61, 0xcd, - 0xab, 0xf0, 0xcf, 0x61, 0xce, 0xee, 0x3c, 0xde, 0xbe, 0x3a, 0xd8, 0x06, - 0x72, 0x59, 0xba, 0x99, 0xd9, 0x20, 0x25, 0x8d, 0xd6, 0xd6, 0xef, 0xed, - 0x70, 0x04, 0x8e, 0x96, 0x31, 0x78, 0x7d, 0xf7, 0xac, 0xf5, 0x99, 0x70, - 0xee, 0x68, 0x4b, 0x23, 0x0a, 0x3f, 0xea, 0xc5, 0xb0, 0x38, 0xd2, 0xfe, - 0x63, 0xca, 0xa8, 0x28, 0xe7, 0x9d, 0x16, 0x43, 0xc7, 0xc8, 0xe1, 0x10, - 0x41, 0x29, 0x33, 0x02, 0x36, 0x85, 0xe8, 0x64, 0x37, 0x61, 0xaa, 0xd1, - 0x84, 0x1d, 0x7c, 0x67, 0x45, 0xe5, 0x54, 0x1e, 0x49, 0x70, 0xdd, 0x77, - 0x81, 0xfc, 0xd9, 0x97, 0x79, 0x00, 0x1c, 0x7b, 0x8d, 0x2b, 0x6b, 0x70, - 0x08, 0xe8, 0xed, 0xba, 0xe2, 0xcc, 0x45, 0x6a, 0x9d, 0x08, 0xd8, 0x2a, - 0xa4, 0x18, 0xb3, 0xfb, 0x03, 0x50, 0x38, 0x64, 0x80, 0x83, 0xf9, 0xfb, - 0x5d, 0xca, 0x3b, 0x85, 0xe2, 0x84, 0xb1, 0x34, 0xb4, 0x88, 0xb5, 0x4e, - 0x68, 0xcb, 0xb3, 0x42, 0xd1, 0x9a, 0x9e, 0x8f, 0xdd, 0xa6, 0xac, 0x90, - 0xc7, 0x1c, 0x95, 0x8d, 0x80, 0x70, 0x7e, 0x50, 0x46, 0x67, 0xbc, 0xbc, - 0x5a, 0xe4, 0xd6, 0x07, 0x99, 0x30, 0x19, 0x61, 0x29, 0x15, 0xeb, 0xac, - 0x83, 0x1e, 0x77, 0x69, 0x70, 0x11, 0x6d, 0xf5, 0xca, 0x17, 0x65, 0x11, - 0xf6, 0x62, 0x41, 0x87, 0x14, 0x82, 0x89, 0x22, 0x72, 0x08, 0x02, 0xee, - 0x43, 0x74, 0x85, 0x38, 0xb8, 0xac, 0x0f, 0xda, 0xaf, 0xbf, 0x50, 0x29, - 0x4a, 0x5c, 0x9e, 0x6c, 0x2b, 0x5e, 0x13, 0x53, 0xc0, 0x54, 0x81, 0x9c, - 0xd4, 0x6e, 0xf7, 0xc3, 0xd6, 0x5a, 0x51, 0x50, 0x87, 0x6f, 0x31, 0xf4, - 0x6c, 0x85, 0xcf, 0xec, 0x4a, 0x0f, 0xf4, 0xb8, 0x5d, 0x15, 0x7f, 0xa9, - 0x4f, 0x5d, 0x8b, 0x2d, 0x5c, 0x9e, 0x1d, 0xab, 0xe1, 0x41, 0x06, 0x32, - 0x09, 0xdf, 0xdd, 0x9f, 0x6a, 0x4b, 0xa4, 0x5b, 0xfc, 0x76, 0x4d, 0x29, - 0x3d, 0x30, 0xa0, 0xbb, 0xc5, 0x25, 0x0c, 0xe8, 0xbc, 0x71, 0x05, 0x49, - 0xb6, 0x06, 0x6a, 0x0c, 0x01, 0x31, 0xd6, 0xd0, 0x05, 0x90, 0xfc, 0xd7, - 0xf1, 0x36, 0x80, 0x64, 0x94, 0xc0, 0xa5, 0x58, 0x04, 0xd9, 0xb0, 0x8e, - 0x81, 0x20, 0x9f, 0x5e, 0x60, 0xcb, 0x1e, 0x80, 0xf2, 0xec, 0xd3, 0xac, - 0x79, 0xd2, 0x1e, 0x82, 0xe8, 0x9f, 0xd0, 0xd8, 0xff, 0x1c, 0x33, 0xf3, - 0xba, 0xd9, 0xf4, 0x86, 0xa0, 0x69, 0x5a, 0x0e, 0xe8, 0x81, 0xac, 0xe7, - 0x76, 0x8d, 0xca, 0x6e, 0xdc, 0x23, 0x02, 0xde, 0xd3, 0xb1, 0x32, 0x81, - 0xce, 0x9c, 0xbe, 0x80, 0x4f, 0x9e, 0xee, 0x2d, 0xb6, 0xc1, 0x92, 0x13, - 0xe1, 0xf4, 0x01, 0xcc, 0x70, 0xef, 0xb1, 0x0e, 0xae, 0x89, 0xdb, 0xfe, - 0x65, 0x99, 0xc7, 0x33, 0xf8, 0x62, 0xb9, 0xfe, 0x83, 0xa4, 0x42, 0xd2, - 0x99, 0x12, 0xc7, 0x98, 0xc4, 0x0a, 0x56, 0xe5, 0x99, 0xc8, 0x59, 0x01, - 0x42, 0xa5, 0x77, 0x23, 0x0d, 0xea, 0xd4, 0xbf, 0x44, 0x78, 0xa5, 0x26, - 0x39, 0x7f, 0xbc, 0x11, 0x50, 0x6c, 0xa8, 0x8b, 0xd9, 0xb3, 0x8c, 0x9a, - 0x27, 0x80, 0xeb, 0xb7, 0x13, 0x20, 0x84, 0x58, 0x97, 0x26, 0xf4, 0x35, - 0xb4, 0xad, 0xa8, 0xe0, 0x93, 0x27, 0x52, 0x57, 0x11, 0xd3, 0x00, 0x4f, - 0x5e, 0x8d, 0x7f, 0x61, 0xad, 0x15, 0x25, 0x61, 0x0c, 0x23, 0x2b, 0x56, - 0x08, 0x87, 0xc9, 0xb3, 0x4b, 0x7d, 0x70, 0xb1, 0xd0, 0x94, 0xd8, 0xaf, - 0x66, 0x34, 0xff, 0xc0, 0xf5, 0x15, 0x20, 0x54, 0xa8, 0xfa, 0x0a, 0x81, - 0x7c, 0x81, 0xad, 0x24, 0x66, 0x12, 0x0c, 0xe6, 0x17, 0xa6, 0x7a, 0x5a, - 0x06, 0x23, 0x5c, 0xbb, 0x5f, 0xe5, 0x48, 0x0b, 0x37, 0x38, 0x2f, 0x93, - 0xc4, 0xba, 0x35, 0xe4, 0x27, 0x85, 0x0d, 0x3b, 0x41, 0xaf, 0xf3, 0x94, - 0xb6, 0xc4, 0x0c, 0x26, 0x63, 0xe5, 0x31, 0x06, 0x6d, 0xac, 0xeb, 0x31, - 0x82, 0x13, 0x01, 0x96, 0x5d, 0x73, 0xb1, 0x82, 0xe9, 0x5f, 0x75, 0xd4, - 0xb8, 0xa5, 0x51, 0xde, 0x66, 0x54, 0xd1, 0xb0, 0x91, 0x2a, 0x9f, 0x94, - 0x6e, 0xbc, 0x54, 0x2e, 0xf4, 0x0d, 0xd1, 0xaf, 0x73, 0xed, 0x75, 0x91, - 0xf7, 0xa5, 0x7a, 0x43, 0x9f, 0xc7, 0xe6, 0xdb, 0x93, 0x7a, 0xf0, 0x11, - 0x2e, 0xb6, 0x76, 0xa8, 0x24, 0x79, 0x4d, 0xc2, 0x16, 0xf1, 0x60, 0xad, - 0xa2, 0x5f, 0x80, 0xb8, 0x34, 0x15, 0xfd, 0x1d, 0x11, 0x1b, 0x75, 0x58, - 0xb7, 0x03, 0xa6, 0xb2, 0xd7, 0x54, 0xab, 0x01, 0x2e, 0xf1, 0xa3, 0x2d, - 0x70, 0x95, 0x0b, 0xa5, 0xa2, 0x90, 0x1c, 0x54, 0xc3, 0x87, 0x8c, 0x6e, - 0x03, 0xcc, 0x7c, 0xc9, 0xef, 0x08, 0x19, 0x56, 0x9f, 0x2e, 0x29, 0xfd, - 0x4e, 0xa1, 0x5d, 0x15, 0x6c, 0xd5, 0x87, 0x3e, 0x0b, 0xaf, 0x23, 0xcb, - 0x39, 0xb2, 0xb8, 0x3a, 0x16, 0xd5, 0x76, 0xfa, 0xf3, 0x59, 0x8f, 0xf9, - 0x1a, 0x65, 0xad, 0xd7, 0xe0, 0xb7, 0xc5, 0xba, 0x51, 0xdb, 0x48, 0x3a, - 0xb0, 0xe4, 0x9c, 0x99, 0xd3, 0x64, 0x3d, 0x04, 0x82, 0x88, 0x89, 0xb8, - 0x26, 0xa1, 0x68, 0x18, 0xe8, 0xbe, 0x8f, 0xf6, 0x49, 0xce, 0xa5, 0x07, - 0x56, 0xc8, 0x9e, 0x4f, 0x83, 0xcc, 0x1f, 0x08, 0x2b, 0x18, 0x3f, 0xbe, - 0x7a, 0xfc, 0x90, 0x08, 0x1c, 0x02, 0xe8, 0x40, 0x4c, 0x47, 0x60, 0x2c, - 0x09, 0xef, 0x7e, 0x52, 0xb1, 0x2f, 0x4b, 0x28, 0x08, 0xf8, 0xa5, 0xbc, - 0x69, 0x55, 0x5a, 0x8d, 0xc7, 0xe7, 0x43, 0x79, 0xe0, 0xbb, 0x3e, 0x14, - 0xc9, 0x7b, 0xef, 0x08, 0xa6, 0xc2, 0xad, 0x22, 0x11, 0x68, 0x45, 0x34, - 0x1e, 0xe3, 0xa6, 0xc8, 0xf6, 0x41, 0x07, 0xa5, 0x4f, 0xf4, 0x4b, 0x99, - 0x53, 0x5e, 0xbf, 0xe2, 0x9d, 0xab, 0x39, 0xd4, 0xee, 0xdf, 0xac, 0x96, - 0x05, 0x86, 0x71, 0x32, 0xf4, 0xa0, 0x8c, 0x5f, 0xaf, 0x64, 0x36, 0xd3, - 0x30, 0xc4, 0x0e, 0xab, 0x65, 0x63, 0x6a, 0x97, 0xc2, 0x8d, 0x6e, 0x84, - 0x7e, 0xbb, 0xbd, 0xe2, 0x7a, 0xa0, 0x14, 0xb4, 0x1f, 0xc0, 0x1c, 0x9b, - 0xc4, 0xa0, 0x40, 0xc0, 0x30, 0x0b, 0xd2, 0x54, 0x76, 0x5c, 0x32, 0x77, - 0xab, 0x8b, 0x53, 0xb7, 0xfd, 0x3d, 0x33, 0xba, 0x8b, 0x33, 0xfb, 0x84, - 0x29, 0x93, 0xb7, 0xb0, 0x1f, 0x67, 0xf1, 0xe1, 0x9e, 0xad, 0xcb, 0xd1, - 0x09, 0xdd, 0x9b, 0x3c, 0x26, 0x47, 0x06, 0x5d, 0x58, 0xba, 0x0c, 0xd4, - 0x3d, 0x02, 0x26, 0x75, 0xcf, 0x20, 0x3a, 0x43, 0x80, 0xf3, 0x13, 0x04, - 0x42, 0xb9, 0x84, 0x48, 0xf5, 0x80, 0x1e, 0x0f, 0x96, 0x30, 0x9d, 0xc1, - 0x4b, 0xe5, 0xdd, 0x28, 0x2c, 0x83, 0x39, 0x0e, 0x5a, 0xb5, 0xb4, 0x1b, - 0x69, 0xcc, 0xcb, 0xe9, 0x28, 0x6b, 0xbf, 0x23, 0x33, 0x3e, 0x99, 0x0c, - 0x00, 0x40, 0xaf, 0xd2, 0xc4, 0x21, 0x96, 0xef, 0xaf, 0x89, 0x84, 0x88, - 0xb1, 0xc4, 0xfa, 0x19, 0xd2, 0xd7, 0xfa, 0x8f, 0x11, 0xe7, 0x1a, 0x44, - 0x4d, 0x5d, 0x2d, 0xd0, 0x90, 0x7f, 0xaf, 0xc2, 0x43, 0x76, 0xcb, 0x16, - 0x26, 0xb6, 0xf0, 0x02, 0x32, 0x6d, 0x92, 0x11, 0x82, 0x8a, 0x46, 0x77, - 0x97, 0xc1, 0x5b, 0x79, 0x6c, 0x5b, 0x0d, 0xb1, 0x1f, 0xd4, 0xab, 0xfe, - 0x81, 0x27, 0x64, 0xec, 0xf3, 0x30, 0xdb, 0x66, 0xd1, 0xa3, 0xf7, 0x05, - 0x19, 0x5f, 0x1f, 0xe6, 0x8f, 0x4a, 0x5e, 0x7e, 0x29, 0xdd, 0xfa, 0x9e, - 0x0d, 0xd7, 0x46, 0x10, 0x68, 0xfc, 0x11, 0x97, 0x6d, 0x08, 0x6d, 0x07, - 0x95, 0x8c, 0x8f, 0x68, 0x9f, 0x47, 0x7d, 0x67, 0x7c, 0xf6, 0x43, 0xf3, - 0xac, 0x31, 0x45, 0xc6, 0x44, 0x5e, 0xb2, 0x5e, 0x1f, 0xfe, 0x34, 0xa5, - 0x5e, 0xf2, 0xdd, 0x90, 0xe0, 0x47, 0x13, 0x3f, 0xcb, 0xb3, 0x7c, 0x7a, - 0xa1, 0x8b, 0x27, 0x68, 0x45, 0x69, 0x26, 0x19, 0xf0, 0x6a, 0xfe, 0xb4, - 0x5b, 0xf6, 0xa2, 0xab, 0x6a, 0x91, 0x36, 0xbb, 0x32, 0x98, 0x7a, 0x1b, - 0x72, 0x58, 0x2b, 0x3a, 0xcb, 0xab, 0x39, 0x0c, 0x0c, 0xb8, 0x4a, 0x47, - 0x92, 0xa4, 0x89, 0xa1, 0x61, 0xdc, 0xc4, 0xb4, 0x22, 0x7d, 0x3b, 0xf2, - 0x58, 0xf6, 0x7e, 0x02, 0xb2, 0xcf, 0xc7, 0xb0, 0xd6, 0xe8, 0x49, 0x4c, - 0x2d, 0x5b, 0xa0, 0xc9, 0x3e, 0x66, 0x5b, 0x72, 0xf2, 0xb5, 0x3b, 0x1b, - 0x21, 0x7b, 0x27, 0xd2, 0x08, 0x71, 0x43, 0x44, 0x77, 0x05, 0x70, 0xae, - 0x79, 0x05, 0xb5, 0xfe, 0x9f, 0xdb, 0xff, 0xc7, 0x5f, 0x4c, 0x1a, 0xd6, - 0x72, 0x9d, 0x00, 0x0c, 0x71, 0x2a, 0x10, 0x46, 0x93, 0xa3, 0x15, 0x30, - 0xcd, 0x57, 0x05, 0x14, 0x45, 0xdb, 0x06, 0xc7, 0x60, 0x90, 0xaf, 0x47, - 0x74, 0x2f, 0x5e, 0x58, 0x5e, 0x33, 0x84, 0x91, 0x46, 0x83, 0x93, 0xa1, - 0xcc, 0xf8, 0x3f, 0x5e, 0x9e, 0xd5, 0x60, 0x53, 0x68, 0xd2, 0x28, 0xb6, - 0x0d, 0xe3, 0x2c, 0x5e, 0x35, 0x80, 0x48, 0x56, 0xce, 0xd8, 0x6f, 0x30, - 0xa4, 0xad, 0x5a, 0xac, 0xc3, 0x26, 0x64, 0xf6, 0xe3, 0x65, 0x61, 0x83, - 0x8b, 0xc9, 0x42, 0x39, 0x75, 0x4e, 0x19, 0xd4, 0x42, 0xe0, 0xed, 0x02, - 0xad, 0xdf, 0x23, 0x7b, 0x23, 0xcd, 0x8b, 0xdf, 0xa4, 0x50, 0x0d, 0x8e, - 0xe9, 0xfd, 0xd7, 0x20, 0x5d, 0x18, 0xf5, 0x14, 0xbb, 0x4c, 0xa0, 0x6a, - 0x81, 0x3a, 0x8a, 0xee, 0x7f, 0x10, 0xd9, 0xa4, 0x8a, 0x49, 0xcc, 0x59, - 0xec, 0x2f, 0x2b, 0x78, 0x8d, 0xfa, 0xb7, 0x83, 0xba, 0x6d, 0x26, 0x3d, - 0x77, 0x94, 0x3b, 0x63, 0x5e, 0xd5, 0x08, 0x2b, 0xc5, 0xf6, 0x09, 0x09, - 0x99, 0x55, 0x7c, 0xbe, 0x72, 0xf8, 0x5b, 0x6f, 0x4b, 0x89, 0x26, 0x97, - 0x63, 0xe0, 0xc4, 0xb2, 0x4f, 0xbf, 0x10, 0x65, 0x29, 0xcc, 0xb1, 0x40, - 0xac, 0x0e, 0x4b, 0x23, 0x4f, 0xca, 0x1b, 0x19, 0x75, 0xd5, 0xcd, 0xf8, - 0x40, 0x67, 0x72, 0x34, 0x6b, 0x30, 0xb6, 0x64, 0x2d, 0x7a, 0x42, 0x6e, - 0x67, 0xa4, 0xa4, 0x56, 0x76, 0xc0, 0x94, 0x84, 0x78, 0x9f, 0x89, 0xa0, - 0x27, 0xda, 0x42, 0x31, 0xa7, 0xce, 0xa1, 0xdd, 0xe7, 0x46, 0x02, 0x29, - 0xa9, 0xae, 0xd1, 0x01, 0xd8, 0xb5, 0x82, 0xcc, 0x4c, 0x25, 0x0f, 0x24, - 0x54, 0x64, 0x26, 0x2b, 0xa8, 0xf8, 0x01, 0x24, 0xef, 0x82, 0x79, 0xd2, - 0x8d, 0x4b, 0xd8, 0x31, 0xf2, 0x18, 0x1c, 0x28, 0xe4, 0x67, 0xae, 0x86, - 0x6b, 0x68, 0x49, 0x83, 0x3e, 0xfd, 0x33, 0x3f, 0x7a, 0xd7, 0xe3, 0x9b, - 0x57, 0xf6, 0xef, 0xb8, 0xdc, 0x1a, 0x83, 0xd0, 0xfa, 0x62, 0xa1, 0xaa, - 0x17, 0x0f, 0x77, 0x7f, 0xf7, 0x7d, 0x00, 0x9b, 0xfd, 0xbe, 0x94, 0x94, - 0x08, 0xcf, 0xdb, 0x02, 0x30, 0x64, 0x50, 0x07, 0xd4, 0x91, 0x57, 0x16, - 0xcf, 0x5d, 0x82, 0xcf, 0x60, 0x2d, 0x0f, 0x98, 0x88, 0xcf, 0xbc, 0x10, - 0x79, 0xb8, 0x4c, 0x89, 0x4b, 0xbd, 0xa3, 0xaa, 0x69, 0x39, 0xb8, 0x1b, - 0xea, 0x5d, 0xee, 0xb6, 0x63, 0x54, 0x12, 0xf7, 0xc6, 0xa9, 0x87, 0x0c, - 0xa3, 0xe9, 0x47, 0x8e, 0x9a, 0x9c, 0x6e, 0x07, 0x1e, 0x98, 0x72, 0x15, - 0x3c, 0x16, 0x11, 0x3e, 0x82, 0x20, 0x09, 0xfb, 0xe8, 0x5f, 0x04, 0x63, - 0x66, 0x1c, 0x45, 0x81, 0x39, 0x6c, 0x3b, 0x56, 0x53, 0xfe, 0xc6, 0xfe, - 0xd4, 0x22, 0xfa, 0x55, 0xbf, 0xec, 0x1b, 0xd6, 0x79, 0x1a, 0xc6, 0xdc, - 0xf1, 0x6c, 0x30, 0x7f, 0x24, 0x3c, 0x25, 0x57, 0x95, 0xac, 0x6a, 0x2a, - 0x10, 0x2a, 0xab, 0xfa, 0x41, 0xc7, 0xb8, 0xd7, 0x0f, 0x34, 0x09, 0xd2, - 0xbb, 0x9e, 0x62, 0x6d, 0x30, 0x34, 0xea, 0x50, 0xa6, 0x05, 0x7b, 0x9a, - 0xa8, 0xee, 0x6e, 0x8f, 0x8e, 0x7e, 0x38, 0xde, 0x98, 0xf0, 0xfe, 0x7c, - 0x99, 0xdf, 0x3e, 0x51, 0x5d, 0xb7, 0xbf, 0xab, 0x54, 0x91, 0x3f, 0x80, - 0x0a, 0x19, 0x09, 0x0c, 0xbd, 0xf4, 0xe0, 0x03, 0xc5, 0x2b, 0xdf, 0x2f, - 0x00, 0xc4, 0x8a, 0x24, 0x70, 0xe0, 0xb9, 0x0b, 0xfd, 0x70, 0xe8, 0x2e, - 0x88, 0xdc, 0x80, 0x16, 0x8c, 0x13, 0x4d, 0x8f, 0x52, 0x97, 0xdb, 0xc9, - 0x5d, 0x1c, 0xa1, 0x4a, 0x74, 0xbe, 0xb3, 0x33, 0xdc, 0xf4, 0x35, 0x86, - 0xb2, 0x53, 0x39, 0xdc, 0x37, 0x8d, 0x02, 0x2f, 0xba, 0x66, 0xa8, 0x43, - 0x43, 0x99, 0xa4, 0xdf, 0x36, 0xa9, 0x2d, 0xe4, 0xc9, 0x8f, 0x19, 0xe6, - 0xd8, 0x15, 0x04, 0xce, 0x3d, 0x41, 0x57, 0x08, 0xe2, 0x5a, 0xa3, 0xe3, - 0x3f, 0xd1, 0xa9, 0x00, 0xf3, 0x8e, 0x90, 0x33, 0xe9, 0x4f, 0xa4, 0x0c, - 0xd5, 0xfe, 0xc0, 0xd4, 0x72, 0xea, 0xc4, 0x01, 0x99, 0x86, 0x7b, 0x97, - 0xbe, 0x4f, 0x57, 0xdb, 0x29, 0x99, 0x4f, 0x94, 0x61, 0x58, 0xbf, 0xe4, - 0xcb, 0x95, 0xa7, 0xaa, 0x38, 0x52, 0x96, 0xec, 0x0d, 0xd6, 0x2f, 0x42, - 0x3b, 0x61, 0x58, 0x7b, 0xc5, 0x8e, 0x5d, 0xed, 0xf0, 0xa2, 0xe1, 0x1d, - 0x32, 0x85, 0x97, 0x81, 0x84, 0xdb, 0x0d, 0xe8, 0x35, 0x7f, 0x5b, 0x56, - 0xa5, 0x1d, 0xa0, 0xce, 0x5c, 0x8e, 0x8e, 0x8a, 0x34, 0x51, 0x2f, 0x19, - 0xf3, 0x16, 0xec, 0xbb, 0x2a, 0x8f, 0xc5, 0x82, 0xaa, 0x3a, 0xea, 0x0d, - 0x63, 0x2b, 0x66, 0x55, 0x16, 0xf3, 0x6a, 0x5a, 0x42, 0x4b, 0xbe, 0x1a, - 0x66, 0xdf, 0x68, 0xd9, 0xeb, 0x93, 0x1b, 0x3e, 0xaf, 0x57, 0x32, 0x04, - 0x5f, 0x62, 0xf2, 0x68, 0xf4, 0x4a, 0x90, 0x01, 0x7f, 0x88, 0xde, 0x91, - 0x29, 0xb7, 0xb1, 0xab, 0x0b, 0xc4, 0x69, 0x0b, 0x27, 0x77, 0x22, 0xe9, - 0xfb, 0x1c, 0xa0, 0x84, 0x0f, 0x82, 0x08, 0xe4, 0x4c, 0xfa, 0x77, 0xb3, - 0x21, 0x1e, 0x3d, 0x14, 0x96, 0x32, 0x9e, 0x5b, 0x7c, 0x19, 0x09, 0xd3, - 0x73, 0x01, 0xfc, 0x43, 0x53, 0x1d, 0xf4, 0x17, 0xb5, 0x6b, 0xb9, 0x83, - 0x2d, 0x0e, 0x24, 0x9c, 0x7e, 0x49, 0x93, 0x3b, 0x61, 0x69, 0x73, 0x43, - 0x69, 0x4a, 0x27, 0x78, 0x07, 0xbb, 0xaa, 0x2b, 0x12, 0xf6, 0xe0, 0x6f, - 0xec, 0x9a, 0xcf, 0xf6, 0x20, 0x14, 0x73, 0x65, 0x82, 0x9d, 0xd0, 0xef, - 0x72, 0xa7, 0x12, 0x18, 0xd1, 0x89, 0x6a, 0x09, 0x31, 0x84, 0x60, 0x8e, - 0x71, 0x2a, 0x75, 0x7e, 0x5e, 0xa0, 0x78, 0x19, 0x86, 0x43, 0x3f, 0x23, - 0x8d, 0x22, 0x6b, 0x2e, 0x1d, 0xea, 0x8f, 0x3b, 0x66, 0xe6, 0x3f, 0xb0, - 0xcf, 0xa1, 0x3a, 0x53, 0xdd, 0xf3, 0xad, 0xbe, 0xe2, 0x9f, 0x79, 0x14, - 0x5b, 0xc6, 0x6e, 0x04, 0x81, 0xde, 0x71, 0x17, 0xd9, 0x16, 0x80, 0x57, - 0xc9, 0x66, 0xba, 0x1a, 0x88, 0x7d, 0xa3, 0x7d, 0x60, 0x6e, 0x8f, 0xa1, - 0x00, 0xdd, 0xf7, 0x65, 0x36, 0x1f, 0x6c, 0xc5, 0xd0, 0xb1, 0x08, 0x51, - 0x62, 0xda, 0x19, 0x66, 0xab, 0xf5, 0x1f, 0xbf, 0x8e, 0x49, 0x85, 0x58, - 0x75, 0x74, 0x0a, 0x3e, 0x96, 0xb9, 0xba, 0x42, 0x97, 0x06, 0xec, 0x61, - 0x71, 0xd3, 0x4e, 0x8a, 0xcb, 0xea, 0x6b, 0x18, 0x7b, 0x14, 0xa3, 0x54, - 0xf5, 0x7c, 0xe8, 0xaa, 0xd3, 0xba, 0x91, 0x19, 0x85, 0x1c, 0x88, 0x91, - 0xe0, 0xb2, 0x98, 0x56, 0x31, 0xff, 0xfa, 0x6a, 0xb8, 0x05, 0xae, 0xa0, - 0x38, 0x3b, 0x3f, 0x7b, 0xfe, 0xcc, 0x9b, 0x2d, 0x6e, 0xc2, 0x2d, 0xba, - 0x3c, 0x3a, 0x9c, 0x94, 0xc7, 0xc2, 0x2c, 0x3f, 0x09, 0x3f, 0xb4, 0x9c, - 0x69, 0x47, 0xe2, 0xb2, 0xeb, 0x57, 0xf9, 0xed, 0x40, 0xe6, 0x8a, 0xf6, - 0xbc, 0x69, 0x29, 0x19, 0x2c, 0x95, 0x3a, 0xee, 0x61, 0x7e, 0xf2, 0x3d, - 0x14, 0x89, 0xf1, 0xa1, 0x73, 0x65, 0xa2, 0x92, 0x71, 0xb7, 0x9a, 0x15, - 0x03, 0x9d, 0xb7, 0x7c, 0xaa, 0xf8, 0xd0, 0x39, 0xa0, 0x66, 0x56, 0x9b, - 0xf1, 0xe3, 0x06, 0x7f, 0xcc, 0xca, 0xca, 0xba, 0x74, 0x69, 0xe6, 0xc7, - 0xe7, 0x38, 0x4c, 0xa7, 0xb3, 0x17, 0xff, 0x86, 0x4e, 0x3a, 0xd0, 0x73, - 0xb4, 0x2f, 0x3b, 0xff, 0xa9, 0x0b, 0x73, 0xc1, 0x42, 0x69, 0x08, 0x24, - 0x0b, 0x15, 0x93, 0x4e, 0xd8, 0x0b, 0xa9, 0xee, 0x09, 0xbd, 0x7c, 0xf0, - 0x11, 0x2d, 0x32, 0xcb, 0x63, 0xd4, 0xfe, 0x2f, 0xa1, 0xd1, 0xb5, 0xc8, - 0x86, 0xa4, 0x8e, 0xc5, 0x6d, 0x0f, 0xd9, 0x35, 0xd7, 0xd1, 0x49, 0x6b, - 0x4a, 0x88, 0x18, 0x05, 0xc0, 0x0c, 0x74, 0x23, 0x5a, 0xe3, 0xec, 0x27, - 0x97, 0x37, 0x13, 0x81, 0xee, 0x12, 0x7b, 0x30, 0x33, 0xca, 0x3d, 0xff, - 0xf5, 0x04, 0xf8, 0x0e, 0x31, 0x10, 0x7c, 0xc2, 0x24, 0xeb, 0x52, 0x9c, - 0x48, 0x14, 0x7a, 0xf0, 0x5a, 0xcc, 0x0b, 0xef, 0x16, 0x2c, 0x4b, 0x2f, - 0xa5, 0xf2, 0x17, 0x70, 0xa1, 0x95, 0x1f, 0x69, 0xa9, 0x25, 0xc0, 0x4c, - 0xb3, 0xe8, 0x58, 0xf1, 0x02, 0x02, 0x1c, 0x7d, 0x14, 0x81, 0x39, 0x3e, - 0xf2, 0x9e, 0x52, 0x89, 0x5b, 0x6f, 0xa7, 0xd4, 0xfa, 0x5f, 0xe7, 0xa5, - 0x7e, 0xca, 0xe4, 0x6e, 0x28, 0xef, 0xc5, 0xb1, 0xe0, 0xda, 0xca, 0x39, - 0x1f, 0x8a, 0x95, 0xe7, 0xd6, 0x2a, 0xa0, 0x38, 0xdc, 0x45, 0x65, 0xa4, - 0x7c, 0xa3, 0xbb, 0x4e, 0x96, 0x7c, 0x9c, 0x9c, 0xd4, 0x86, 0x22, 0x71, - 0x00, 0x81, 0x9a, 0x6e, 0xfd, 0x3c, 0xc6, 0x4a, 0xa3, 0xee, 0xd8, 0xc9, - 0x99, 0x91, 0x21, 0x14, 0xae, 0xd0, 0x1f, 0xfe, 0x4b, 0xb7, 0xdc, 0x3a, - 0xea, 0x87, 0xb1, 0x98, 0xb9, 0xd7, 0x9c, 0xba, 0x4e, 0x00, 0x61, 0x55, - 0xfe, 0x5b, 0xf9, 0x2b, 0x31, 0x7b, 0x49, 0x01, 0x1d, 0x79, 0xed, 0x83, - 0x87, 0xd6, 0xbd, 0x78, 0x4d, 0xfc, 0xbe, 0xa7, 0x2e, 0x15, 0x47, 0xff, - 0x41, 0x15, 0x5d, 0xed, 0x79, 0x1d, 0x97, 0xea, 0xce, 0xa4, 0x8f, 0x8b, - 0x5b, 0x17, 0x49, 0x76, 0xcc, 0xbe, 0xda, 0x6d, 0x52, 0x80, 0x13, 0xe0, - 0xa3, 0xd9, 0xc2, 0xf3, 0xee, 0x2e, 0x1a, 0xa3, 0xea, 0xf7, 0x56, 0xd7, - 0xa7, 0xc1, 0x7d, 0xc5, 0xf5, 0x1e, 0x04, 0x22, 0x5f, 0x63, 0x0a, 0xb8, - 0x98, 0xeb, 0x20, 0x04, 0x1f, 0x60, 0x7f, 0xde, 0x64, 0x20, 0x88, 0xf3, - 0x15, 0xe7, 0x4f, 0x24, 0x95, 0xa7, 0x1a, 0xae, 0xf2, 0xbb, 0xbb, 0x8e, - 0x36, 0xc7, 0x6b, 0x76, 0xb0, 0x8f, 0x41, 0xf2, 0xc4, 0x0e, 0x89, 0x0f, - 0xcf, 0x74, 0x63, 0x1e, 0xc8, 0xa8, 0xd8, 0x39, 0xc2, 0x8c, 0x48, 0xb7, - 0x1a, 0x0e, 0xb3, 0x95, 0x80, 0x3a, 0xc1, 0x74, 0x0c, 0x92, 0xdb, 0x5e, - 0x90, 0xab, 0x92, 0xf2, 0x59, 0x87, 0x1e, 0x06, 0xbb, 0x87, 0x81, 0xc8, - 0x51, 0x1e, 0x6e, 0xa6, 0x08, 0xe6, 0xf3, 0xbe, 0xe5, 0x53, 0x37, 0xf2, - 0x46, 0x09, 0xb1, 0x4b, 0xa4, 0xda, 0x53, 0x54, 0xe5, 0xf3, 0x9c, 0x3f, - 0x42, 0xae, 0x31, 0xe0, 0x1a, 0x30, 0x83, 0x76, 0x6e, 0xb9, 0x46, 0xa9, - 0x74, 0xef, 0x30, 0x4e, 0xcd, 0x76, 0x13, 0x7f, 0x49, 0x47, 0x37, 0xe7, - 0x5a, 0x41, 0x38, 0x6f, 0x55, 0x2c, 0xbf, 0x1b, 0xb4, 0x93, 0xa2, 0x6b, - 0x35, 0xbe, 0xb4, 0x52, 0x8c, 0x53, 0x2d, 0xb0, 0x2c, 0x94, 0xee, 0x12, - 0x15, 0x15, 0x5f, 0x9f, 0xe0, 0xbe, 0x65, 0xf5, 0x43, 0x29, 0x5b, 0x94, - 0xc6, 0x2b, 0x15, 0x6a, 0x1d, 0xbb, 0x8a, 0x86, 0x5c, 0x27, 0x47, 0x51, - 0x46, 0x27, 0xfa, 0xd6, 0x5f, 0x97, 0xf8, 0x21, 0xd1, 0xe5, 0xf8, 0x06, - 0xc8, 0x09, 0x29, 0x19, 0xf8, 0xde, 0xca, 0x7e, 0x5a, 0x8f, 0x04, 0x5f, - 0xa3, 0x7e, 0x65, 0xd4, 0x01, 0x9e, 0xf6, 0x05, 0x0b, 0x56, 0xea, 0x25, - 0x18, 0x82, 0xaf, 0xb3, 0xed, 0x4c, 0xee, 0x42, 0x8f, 0x8a, 0xef, 0x1a, - 0x59, 0xf2, 0xdb, 0xb2, 0xca, 0x4b, 0xd5, 0x2a, 0x9d, 0xd9, 0x71, 0x2b, - 0xb0, 0x1f, 0x0b, 0x6f, 0x84, 0xf2, 0x90, 0x9e, 0x43, 0x46, 0x23, 0x18, - 0x8b, 0x6e, 0x45, 0xcd, 0x46, 0xf3, 0x03, 0xa5, 0xb2, 0xdf, 0x11, 0x01, - 0x9c, 0xb0, 0x3e, 0x16, 0x5c, 0x0b, 0x4e, 0xc8, 0x87, 0x8a, 0x35, 0x6f, - 0x52, 0x06, 0xed, 0x5c, 0x47, 0x2d, 0x66, 0x99, 0x25, 0x47, 0x5a, 0x14, - 0xbf, 0x61, 0x73, 0x52, 0x17, 0x20, 0x6a, 0x7c, 0x87, 0x96, 0xda, 0xef, - 0x10, 0x00, 0x2c, 0x44, 0xe0, 0x3c, 0xfd, 0xa0, 0x12, 0xc4, 0xc3, 0x9b, - 0xe9, 0x85, 0x87, 0x2a, 0xf8, 0x9d, 0x2b, 0xd1, 0x12, 0x9c, 0xde, 0x83, - 0x23, 0xdb, 0x1b, 0x21, 0xea, 0xfd, 0xc6, 0x73, 0x0d, 0xb4, 0x10, 0xcc, - 0x35, 0x6f, 0xbb, 0xce, 0x8f, 0x3e, 0x78, 0xc1, 0x0a, 0x72, 0x8d, 0x8f, - 0x47, 0x69, 0x40, 0xf3, 0xa2, 0x0e, 0x22, 0xa3, 0x87, 0x23, 0x3c, 0x44, - 0x22, 0x61, 0xc0, 0x7c, 0xed, 0x54, 0xdd, 0x96, 0x64, 0xc9, 0x32, 0x3d, - 0x3f, 0x58, 0x2a, 0x8c, 0xca, 0xbd, 0x20, 0x5f, 0xab, 0x09, 0x70, 0x30, - 0x13, 0xd9, 0x87, 0xc5, 0x04, 0x3e, 0xab, 0x8a, 0x21, 0x1f, 0x71, 0xe6, - 0x29, 0x91, 0x98, 0x0f, 0xac, 0x6f, 0xd0, 0x40, 0xd3, 0xb6, 0xbe, 0x14, - 0xd3, 0xce, 0xb6, 0xed, 0x3e, 0x0b, 0x57, 0xdc, 0x07, 0xeb, 0xbf, 0xea, - 0x60, 0xd4, 0x62, 0xef, 0x7a, 0xf9, 0x55, 0x79, 0xeb, 0x1b, 0xea, 0xc5, - 0xc7, 0xcb, 0x5a, 0x15, 0xdf, 0x9a, 0xcb, 0x84, 0x56, 0xba, 0x83, 0xa7, - 0xa4, 0x9b, 0x3c, 0x52, 0xda, 0x06, 0x36, 0x86, 0x0c, 0xb8, 0xc6, 0xa1, - 0x83, 0x30, 0xf2, 0x8a, 0x9d, 0x8a, 0x44, 0xf4, 0x85, 0xbc, 0xd1, 0x54, - 0x0d, 0xdb, 0x2b, 0x7a, 0x21, 0x12, 0x78, 0xcb, 0x49, 0xee, 0x39, 0x6a, - 0xc0, 0xbf, 0x91, 0x13, 0x40, 0x1e, 0x08, 0xb4, 0x9e, 0x44, 0xb2, 0x29, - 0x97, 0xe6, 0x25, 0xd6, 0xcd, 0xdd, 0x7a, 0x88, 0x7e, 0x7e, 0xe4, 0xfc, - 0xc1, 0x4a, 0x48, 0x76, 0xe7, 0x49, 0x02, 0xff, 0xa1, 0x0d, 0x05, 0x81, - 0x7b, 0x18, 0x41, 0xf8, 0x9d, 0x79, 0xf6, 0x48, 0x7b, 0xc1, 0xe0, 0x19, - 0xdc, 0xa7, 0x11, 0x62, 0xcf, 0xe5, 0xc0, 0x33, 0x58, 0xeb, 0xe1, 0x7e, - 0x73, 0xcb, 0x3c, 0x73, 0x15, 0x1e, 0x35, 0x1f, 0x10, 0x0d, 0x55, 0xc3, - 0x40, 0x90, 0xf6, 0x3c, 0x80, 0xf8, 0x5d, 0xd9, 0xec, 0x41, 0x55, 0xb3, - 0xda, 0x10, 0x42, 0x13, 0x8f, 0x4e, 0x0a, 0xd2, 0xe9, 0xb0, 0x3d, 0x6a, - 0x1f, 0x05, 0x2c, 0x5d, 0x26, 0x14, 0x27, 0xf8, 0x4b, 0x97, 0xc3, 0xd6, - 0xfe, 0xbf, 0x96, 0xd6, 0xc6, 0xe7, 0xa7, 0x7b, 0xe0, 0x30, 0x65, 0x07, - 0x20, 0xf9, 0x49, 0xd0, 0x3b, 0x13, 0x88, 0x01, 0x7b, 0x10, 0x80, 0x55, - 0xf3, 0x5a, 0x0f, 0x63, 0xec, 0x12, 0xa3, 0x6c, 0x60, 0xf0, 0x70, 0xd6, - 0x8e, 0xaa, 0xfc, 0x71, 0x5f, 0xd5, 0x53, 0x6c, 0xa7, 0x09, 0x96, 0x0f, - 0x31, 0xb1, 0xbc, 0x6b, 0xf6, 0x51, 0x64, 0x1a, 0x61, 0x75, 0x82, 0x16, - 0x6e, 0xa4, 0xdc, 0x6a, 0xb4, 0xae, 0x40, 0x93, 0x42, 0x7b, 0x7c, 0xe3, - 0x04, 0xc5, 0xe9, 0xa8, 0x89, 0x12, 0xb5, 0x27, 0x16, 0xfd, 0x8f, 0xa9, - 0x35, 0xa1, 0xce, 0xb9, 0xa1, 0xff, 0x32, 0x31, 0xef, 0xe7, 0x78, 0xa8, - 0xdb, 0x9d, 0x0b, 0xf0, 0x28, 0x9e, 0xfb, 0x9a, 0x98, 0x6e, 0xdc, 0xc2, - 0xc9, 0x45, 0xd1, 0x5b, 0xf1, 0xb2, 0x92, 0xef, 0x2e, 0x0b, 0x3e, 0xa5, - 0x4f, 0x89, 0x57, 0x67, 0x8c, 0x9a, 0x06, 0x7d, 0x24, 0x2a, 0xa2, 0x95, - 0xf9, 0x35, 0xd5, 0x3a, 0x5d, 0x8f, 0xfc, 0xc6, 0x66, 0xc7, 0x9c, 0x9a, - 0x2c, 0xd8, 0x66, 0xd9, 0x7a, 0x1d, 0x7e, 0x36, 0x32, 0x2d, 0x83, 0x03, - 0xd8, 0x27, 0x61, 0x14, 0x13, 0xf6, 0x3a, 0xff, 0xab, 0x58, 0x99, 0x7f, - 0xe4, 0x3f, 0x5e, 0x96, 0x09, 0x8b, 0x29, 0x27, 0xfe, 0x34, 0x01, 0xaa, - 0xff, 0xd0, 0x3e, 0xbf, 0xa1, 0x83, 0x78, 0xd9, 0x0f, 0x49, 0x8b, 0x70, - 0x02, 0x71, 0x5d, 0xa2, 0xb7, 0x66, 0xab, 0x27, 0x09, 0x09, 0xb2, 0x40, - 0x37, 0x1d, 0xb4, 0xc9, 0xac, 0xd9, 0x77, 0xcb, 0x05, 0xcf, 0xfd, 0x6d, - 0x8e, 0x40, 0xbc, 0xd4, 0xde, 0x1a, 0xd1, 0x44, 0x8c, 0x2c, 0xee, 0x09, - 0xf2, 0x56, 0xd0, 0xab, 0xbb, 0x08, 0xf7, 0x98, 0x6a, 0x6a, 0xfb, 0x0b, - 0x5c, 0xf6, 0x32, 0x8b, 0xb9, 0x71, 0x97, 0xce, 0x3b, 0x94, 0x1f, 0xfe, - 0x27, 0xaf, 0xb8, 0xa7, 0xe1, 0xe4, 0x3e, 0x2a, 0x50, 0x5b, 0x2d, 0xac, - 0xfb, 0x63, 0x96, 0x16, 0x2d, 0x9b, 0x57, 0x4a, 0x2b, 0x74, 0x1d, 0xd7, - 0x01, 0x72, 0x6b, 0x98, 0x0d, 0x23, 0x7f, 0xb2, 0x48, 0xdb, 0x22, 0xe2, - 0x39, 0x4a, 0xe6, 0xa8, 0x4c, 0xbe, 0x6b, 0xeb, 0x0c, 0xfb, 0x59, 0xbb, - 0x78, 0xd5, 0x94, 0x99, 0x13, 0xbe, 0xb7, 0xd3, 0x59, 0x8d, 0xcb, 0xe3, - 0x17, 0x5a, 0xfa, 0x6a, 0x05, 0x35, 0x5e, 0x50, 0xc8, 0x25, 0xb0, 0xcd, - 0x80, 0xe3, 0xf4, 0xaf, 0x68, 0xd3, 0x65, 0x1c, 0x27, 0x85, 0xee, 0xa3, - 0x95, 0x0c, 0x17, 0x42, 0xfe, 0xfb, 0xd5, 0x67, 0xe3, 0x6d, 0xb9, 0x62, - 0x7e, 0x76, 0x5d, 0x86, 0xdd, 0xcd, 0xf5, 0x33, 0x2c, 0x29, 0xe6, 0x99, - 0xd5, 0x19, 0x65, 0x6b, 0x8a, 0x48, 0xdf, 0xbc, 0xb5, 0x08, 0x18, 0x53, - 0x41, 0x9b, 0x43, 0x73, 0x5e, 0xbf, 0x55, 0xee, 0x4b, 0x69, 0xff, 0xb6, - 0xa8, 0xa8, 0x09, 0x36, 0x51, 0x69, 0x7e, 0x52, 0xb4, 0x36, 0x9e, 0x7d, - 0xe9, 0xbc, 0x39, 0xa1, 0xd3, 0xeb, 0xd5, 0x46, 0xbb, 0xa6, 0x04, 0xa6, - 0x78, 0xee, 0x8a, 0x53, 0x8e, 0x71, 0xbe, 0x76, 0x3b, 0xf9, 0xc6, 0x4f, - 0xf8, 0x36, 0xd6, 0x5d, 0x1f, 0xa6, 0x39, 0x8f, 0x1d, 0x2d, 0xfc, 0x66, - 0x8f, 0x18, 0xa5, 0x0d, 0x3a, 0x2c, 0xb5, 0x6b, 0x44, 0x1b, 0x76, 0x9f, - 0x4a, 0x8f, 0x47, 0xe8, 0x58, 0x2e, 0xe2, 0xeb, 0x51, 0xd0, 0x72, 0x86, - 0x27, 0x48, 0x6e, 0x95, 0x0c, 0x72, 0x1a, 0x22, 0xe0, 0xf3, 0x8a, 0x36, - 0xae, 0x05, 0xad, 0x85, 0x72, 0xad, 0x71, 0xd5, 0x5a, 0xaf, 0x23, 0xb1, - 0xcc, 0x91, 0xad, 0xde, 0x30, 0xd2, 0x8e, 0x7c, 0x09, 0xad, 0xd7, 0x76, - 0xb4, 0x06, 0x4a, 0x35, 0x2a, 0x3b, 0x94, 0xf1, 0x38, 0x85, 0xa6, 0x66, - 0x55, 0xd2, 0xab, 0xd5, 0x90, 0xb3, 0x9c, 0xa6, 0xd8, 0x30, 0x62, 0x9b, - 0x24, 0xbb, 0xce, 0xe5, 0xdf, 0x0d, 0x25, 0xd5, 0x0e, 0x7b, 0x85, 0x6f, - 0xc7, 0x79, 0x89, 0x61, 0xb3, 0x6b, 0xd2, 0x4f, 0xed, 0x71, 0xd4, 0xc6, - 0xe0, 0x86, 0xa1, 0x99, 0x90, 0x4c, 0x89, 0x3b, 0xdf, 0x75, 0x68, 0xd3, - 0xb9, 0xf4, 0x45, 0x83, 0x15, 0x4f, 0xf8, 0x9e, 0x6a, 0x5c, 0xb2, 0xe6, - 0xdf, 0xf3, 0x14, 0xa0, 0xb2, 0xf8, 0x2e, 0xd2, 0xc2, 0x03, 0xdd, 0xfe, - 0xd5, 0x8c, 0xa6, 0x5e, 0xa1, 0xd4, 0xec, 0x28, 0xb9, 0x9a, 0xcd, 0x39, - 0x63, 0x7b, 0xb8, 0x90, 0x7b, 0x19, 0x24, 0x16, 0x0a, 0xc2, 0x35, 0xe7, - 0x32, 0xba, 0xe2, 0x81, 0xc6, 0x8d, 0x91, 0x1b, 0xc6, 0x4d, 0xe4, 0xaf, - 0xf7, 0x01, 0xce, 0xf1, 0x2c, 0x93, 0xbf, 0xfb, 0xe3, 0x15, 0x13, 0x1c, - 0xa0, 0x1d, 0x9f, 0x4e, 0xa9, 0xea, 0x1c, 0xd0, 0xb6, 0xc7, 0x76, 0x05, - 0x7e, 0x7e, 0x59, 0xdc, 0x4d, 0x91, 0x2b, 0x68, 0x9f, 0x2d, 0x97, 0xe9, - 0xd9, 0x95, 0xf5, 0x9b, 0x7b, 0xd9, 0x97, 0xd7, 0x69, 0xcf, 0x11, 0xf5, - 0xdb, 0x00, 0x6e, 0x1a, 0x44, 0x4c, 0xdb, 0x5e, 0x07, 0x8b, 0x87, 0x8a, - 0x8f, 0x53, 0x7f, 0x5f, 0x64, 0xcb, 0xb0, 0x9e, 0xda, 0x9e, 0xe8, 0xaf, - 0xe6, 0xdc, 0x8e, 0x74, 0xd3, 0xb5, 0xc4, 0x9b, 0x51, 0x81, 0xa7, 0xa8, - 0x09, 0x69, 0x52, 0xf6, 0x34, 0xcb, 0xb2, 0x43, 0xec, 0xc9, 0x5a, 0x1c, - 0x78, 0x5f, 0x9d, 0x02, 0xb4, 0xdf, 0xb3, 0xd2, 0xa3, 0x6e, 0x21, 0x95, - 0x6b, 0xc6, 0xf5, 0x4f, 0xfe, 0xa9, 0x43, 0x62, 0x45, 0x15, 0x18, 0x66, - 0x6d, 0x1f, 0x51, 0x83, 0xb3, 0xb4, 0x01, 0xe9, 0xa7, 0xb4, 0xa6, 0x8c, - 0xdf, 0x37, 0x20, 0xad, 0xee, 0xa1, 0xf9, 0x36, 0x13, 0x56, 0x7a, 0xfb, - 0x2a, 0x00, 0x13, 0xf2, 0x66, 0x0c, 0x8a, 0x01, 0x4b, 0x96, 0xe2, 0xd2, - 0xdd, 0xab, 0x65, 0x93, 0x1a, 0x6c, 0x4d, 0x38, 0xcf, 0xe9, 0x0e, 0xa9, - 0x9d, 0x70, 0x39, 0xc2, 0xe0, 0x26, 0xb0, 0x5d, 0xb5, 0x38, 0x76, 0x7d, - 0x68, 0xf9, 0x1e, 0x0c, 0xa7, 0x06, 0x5f, 0x6b, 0x9d, 0x18, 0x64, 0x56, - 0xe4, 0x4b, 0x07, 0x6f, 0x1c, 0x8e, 0xad, 0x3a, 0xe0, 0x73, 0xdc, 0x8e, - 0x97, 0xce, 0x21, 0x93, 0xb2, 0x08, 0x40, 0x11, 0x2d, 0xeb, 0x30, 0x8c, - 0x1c, 0x0a, 0xf5, 0xc6, 0xc7, 0x8e, 0x52, 0xe3, 0x89, 0xd7, 0x9b, 0x3c, - 0x26, 0x47, 0x06, 0x5d, 0x58, 0xba, 0x0c, 0xd4, 0x3d, 0x02, 0x26, 0x75, - 0xcf, 0x20, 0x3a, 0x43, 0x26, 0xfb, 0x29, 0x90, 0xed, 0x79, 0x84, 0x5c, - 0xe6, 0xca, 0x82, 0x4b, 0x46, 0x44, 0x36, 0x62, 0xf5, 0xe8, 0xdd, 0x25, - 0x1c, 0xa2, 0x22, 0x28, 0x17, 0xfe, 0xc7, 0x3e, 0x3e, 0x89, 0x64, 0x04, - 0xc4, 0x8a, 0x0c, 0x21, 0x29, 0x1b, 0xb3, 0xa4, 0xb9, 0x8b, 0x5f, 0x5d, - 0x3f, 0xfe, 0x8c, 0x8a, 0xd4, 0xef, 0xc0, 0xee, 0x8c, 0x07, 0xb9, 0xe1, - 0x9c, 0xe4, 0xd6, 0x5f, 0x9b, 0xc5, 0xe3, 0xb0, 0x98, 0x35, 0x44, 0xd9, - 0x06, 0xfe, 0x9e, 0x51, 0x79, 0x4f, 0x6b, 0x88, 0x2c, 0xaf, 0xbf, 0xe2, - 0xcf, 0x2d, 0x3b, 0x09, 0x90, 0x3e, 0x6f, 0x02, 0x75, 0x69, 0x09, 0x8a, - 0xd4, 0xcb, 0x51, 0x0a, 0x36, 0xa5, 0x95, 0xd8, 0xc4, 0x5d, 0x17, 0x75, - 0x5c, 0x2a, 0xf1, 0x7e, 0xb3, 0x09, 0xae, 0x6c, 0xe0, 0x72, 0x1f, 0x35, - 0x34, 0xe4, 0x9d, 0x47, 0xc8, 0xe1, 0xc6, 0xf9, 0xe0, 0x18, 0xea, 0x96, - 0x28, 0xa9, 0x1e, 0x03, 0xee, 0x70, 0x09, 0x92, 0x27, 0x1d, 0xf2, 0x9d, - 0x5b, 0xe5, 0x0d, 0xee, 0x21, 0xd5, 0x57, 0x88, 0x8d, 0xc9, 0xe3, 0x98, - 0xba, 0xcd, 0xf3, 0xcd, 0xe9, 0xbf, 0x9d, 0x2e, 0x0c, 0x7c, 0x56, 0x81, - 0xce, 0xcd, 0x42, 0xf4, 0x55, 0xb7, 0x37, 0x0f, 0xb5, 0x1b, 0xf6, 0x03, - 0xdc, 0xc3, 0x71, 0x63, 0xb5, 0xf6, 0xe4, 0x18, 0x6d, 0xbf, 0xf5, 0xe5, - 0xa2, 0x95, 0xa8, 0xf6, 0x1b, 0x99, 0xed, 0xa5, 0xcd, 0xc0, 0xa8, 0x16, - 0xbc, 0x94, 0xb6, 0x21, 0x22, 0xa2, 0xad, 0x48, 0xfb, 0x40, 0x2a, 0xa3, - 0xd8, 0xce, 0x45, 0xcb, 0x96, 0xa3, 0x22, 0x06, 0x54, 0x2a, 0x6d, 0xae, - 0x1a, 0x62, 0x21, 0x60, 0x63, 0xbf, 0x8c, 0x0f, 0xbe, 0xd1, 0xa2, 0xa6, - 0x72, 0x1c, 0xb5, 0xea, 0xf8, 0x56, 0x02, 0x69, 0x00, 0x92, 0xe3, 0x86, - 0x63, 0xfb, 0x5d, 0x30, 0xf9, 0xf9, 0x64, 0xb1, 0x72, 0x09, 0xc8, 0x0a, - 0x77, 0xa0, 0x62, 0xac, 0xb3, 0xc7, 0x75, 0xe4, 0xbf, 0xa5, 0xba, 0xde, - 0x39, 0x46, 0xf5, 0x6e, 0x55, 0xe1, 0x95, 0xe8, 0x39, 0x31, 0x0e, 0x3b, - 0x63, 0x13, 0x93, 0x58, 0x54, 0x7a, 0x88, 0xfe, 0xbf, 0xca, 0x9d, 0x58, - 0x97, 0x99, 0x54, 0xd8, 0x5e, 0x8d, 0x36, 0x42, 0xdf, 0x77, 0x57, 0x3e, - 0x59, 0x22, 0xa4, 0xe8, 0x7b, 0x17, 0xab, 0x3e, 0xea, 0x35, 0x6a, 0xcb, - 0x1e, 0x07, 0xca, 0xb9, 0x8a, 0x3b, 0xc0, 0x4b, 0x5c, 0x5f, 0x1c, 0x94, - 0x38, 0xbb, 0x20, 0x46, 0xe7, 0xbb, 0x70, 0x54, 0x80, 0xea, 0xb7, 0x5b, - 0x10, 0xad, 0x76, 0xff, 0x8e, 0x7a, 0xa7, 0x07, 0x9a, 0x01, 0x58, 0x67, - 0x62, 0x73, 0xef, 0xdb, 0xf1, 0x00, 0xb5, 0x55, 0xa0, 0x18, 0xef, 0x08, - 0x64, 0x35, 0x05, 0x7a, 0x42, 0xa4, 0x1d, 0x82, 0xed, 0x8b, 0x2f, 0x98, - 0x60, 0x83, 0x9c, 0x69, 0x16, 0xe1, 0x49, 0x4a, 0x29, 0xe4, 0x42, 0xc0, - 0xcd, 0xa8, 0x15, 0x85, 0xb8, 0x88, 0xe7, 0x80, 0x17, 0x77, 0xca, 0xc4, - 0xcd, 0x00, 0xa5, 0x07, 0x1f, 0x7e, 0x89, 0xcd, 0x45, 0x14, 0xfd, 0xa4, - 0x67, 0xb1, 0xf8, 0x69, 0xc9, 0x10, 0x8c, 0x1c, 0x1a, 0x62, 0x5b, 0x57, - 0xdb, 0xc9, 0x5d, 0xaa, 0x44, 0x44, 0xe2, 0x28, 0x71, 0x92, 0xf4, 0xb0, - 0xaa, 0x65, 0x99, 0xab, 0x4f, 0xb3, 0x60, 0xa7, 0x59, 0x27, 0xd3, 0x04, - 0x22, 0x1b, 0x90, 0x35, 0xae, 0x7e, 0x07, 0x5e, 0x20, 0x3c, 0xb7, 0xa9, - 0x6a, 0x83, 0x12, 0x0c, 0xf0, 0xbd, 0x56, 0x52, 0x58, 0x8a, 0xc6, 0xef, - 0x0e, 0xdf, 0xb4, 0x82, 0x11, 0x32, 0xec, 0x4d, 0x63, 0xf4, 0x99, 0x03, - 0xca, 0xa7, 0x64, 0xad, 0x1e, 0x50, 0x56, 0xe2, 0x9f, 0xda, 0xde, 0x8e, - 0xc7, 0x23, 0xf2, 0xc4, 0xa0, 0x12, 0xd9, 0x3b, 0xaa, 0xc8, 0xe4, 0x93, - 0x3a, 0xb5, 0xd2, 0x8d, 0x42, 0x94, 0xd4, 0x74, 0xa8, 0x00, 0xa4, 0x77, - 0x05, 0xe6, 0xbd, 0xf4, 0x34, 0x95, 0x00, 0x2a, 0x06, 0xd4, 0x68, 0xd3, - 0x96, 0x4b, 0x11, 0x61, 0xde, 0x2f, 0x33, 0x55, 0x28, 0x02, 0x75, 0x3e, - 0x0b, 0x11, 0x89, 0xc8, 0x22, 0x28, 0x28, 0x21, 0x87, 0x46, 0x55, 0x78, - 0x79, 0xcc, 0xc5, 0x27, 0x6e, 0x64, 0xaf, 0x75, 0xfe, 0x85, 0x1e, 0x19, - 0x40, 0x88, 0xea, 0x9f, 0x6f, 0x66, 0x39, 0x7c, 0x8d, 0x28, 0xa7, 0xa2, - 0x97, 0xf0, 0x68, 0x84, 0x7c, 0x17, 0x28, 0x19, 0x82, 0xb7, 0xc0, 0x85, - 0x1a, 0x24, 0xbd, 0x1a, 0xc8, 0x12, 0xec, 0xed, 0x55, 0xce, 0x7e, 0x3d, - 0x09, 0x07, 0x92, 0x66, 0x0c, 0x98, 0x37, 0xfc, 0xe3, 0xdc, 0x74, 0x83, - 0x12, 0x69, 0x86, 0x78, 0x43, 0xfc, 0x04, 0x06, 0xc0, 0xff, 0xa3, 0x2f, - 0xc2, 0x08, 0x5b, 0x92, 0x81, 0xf5, 0x12, 0x18, 0xe1, 0x43, 0x8f, 0x7d, - 0x5d, 0x6d, 0x76, 0x1c, 0x16, 0xeb, 0x9a, 0xb9, 0x02, 0x6e, 0xa9, 0xbb, - 0x1d, 0xdf, 0x37, 0xf1, 0xd3, 0x04, 0x24, 0xa8, 0x07, 0xde, 0xb1, 0x19, - 0x01, 0x4c, 0x33, 0x72, 0x92, 0xc5, 0x31, 0x47, 0x9e, 0xc9, 0x20, 0xa8, - 0xcf, 0x13, 0x81, 0xc6, 0xd5, 0xdb, 0x0e, 0xd8, 0xec, 0x27, 0xf5, 0xdb, - 0x14, 0xb3, 0x51, 0xb0, 0xc7, 0x04, 0xc2, 0x00, 0x09, 0x60, 0x7b, 0x8b, - 0xcb, 0x05, 0xe2, 0x86, 0x4a, 0xe7, 0x42, 0xaa, 0xc3, 0x2d, 0xd1, 0x61, - 0x28, 0x14, 0xb2, 0xd7, 0x8b, 0x20, 0xa7, 0x2d, 0xdb, 0xd2, 0x2c, 0x4f, - 0x1f, 0x85, 0x05, 0xda, 0x92, 0x54, 0x65, 0x1c, 0xfb, 0xcc, 0x5d, 0x66, - 0x47, 0x63, 0x3e, 0xc2, 0x80, 0xb5, 0xe6, 0x18, 0x98, 0xac, 0xbe, 0x25, - 0x05, 0x3c, 0xc8, 0xc1, 0x46, 0xa5, 0xdb, 0xf0, 0x87, 0xfb, 0x86, 0x9c, - 0x8a, 0xa3, 0xd7, 0x05, 0xc8, 0x3d, 0x72, 0xf0, 0x32, 0x7c, 0x9e, 0x35, - 0x78, 0x9e, 0x96, 0xcf, 0x9c, 0x9e, 0x0f, 0xc6, 0x93, 0x54, 0x29, 0x8a, - 0x64, 0x14, 0xff, 0x9d, 0x10, 0x55, 0x8e, 0x6a, 0x02, 0x9c, 0x4b, 0x27, - 0x19, 0x01, 0x25, 0x63, 0xe1, 0xca, 0x5a, 0x06, 0x26, 0xa1, 0xda, 0x2b, - 0x7d, 0xcb, 0x75, 0x50, 0x16, 0x7d, 0x21, 0x2a, 0xbe, 0xc7, 0x78, 0xe0, - 0xa1, 0x35, 0x8d, 0xe2, 0xc1, 0x29, 0xb6, 0xff, 0x4f, 0xdb, 0x77, 0x68, - 0x8f, 0x77, 0x22, 0x08, 0x99, 0x87, 0xc6, 0xef, 0x64, 0xfa, 0x9e, 0xd8, - 0xd0, 0xf6, 0x4d, 0x05, 0xba, 0x4d, 0x73, 0x8d, 0xc2, 0x78, 0x7f, 0x05, - 0x2e, 0x11, 0x0e, 0xe2, 0x36, 0x14, 0x5e, 0x48, 0x42, 0x80, 0xd0, 0x59, - 0xd8, 0x9b, 0x08, 0x83, 0x42, 0x87, 0xda, 0xe3, 0x06, 0xa2, 0xcc, 0x73, - 0xd6, 0xab, 0x4c, 0x68, 0x13, 0x27, 0x53, 0x57, 0xda, 0x13, 0xaf, 0x24, - 0xb6, 0x1f, 0xf0, 0x0b, 0x5d, 0x42, 0x7d, 0x9b, 0x77, 0x3b, 0xee, 0x65, - 0x67, 0x99, 0xbb, 0x07, 0x3a, 0x53, 0x26, 0xee, 0x63, 0x13, 0x30, 0x16, - 0x95, 0xf3, 0x60, 0xbe, 0xc8, 0x84, 0x2f, 0x59, 0x82, 0xb4, 0xe5, 0x9c, - 0x13, 0x79, 0x85, 0xb6, 0x1b, 0x5e, 0x66, 0x98, 0x58, 0x0d, 0x53, 0x5e, - 0x63, 0xfb, 0x7f, 0x50, 0x0b, 0xd0, 0xf5, 0x8e, 0xe8, 0x13, 0x29, 0x04, - 0x0a, 0xeb, 0x96, 0x0f, 0x4c, 0x6a, 0x83, 0xe5, 0x9c, 0x35, 0x9c, 0x3b, - 0xdd, 0xc3, 0x9b, 0x98, 0xb0, 0x04, 0xb3, 0xe7, 0xbb, 0xba, 0x39, 0xc5, - 0x46, 0xe3, 0x46, 0x66, 0x51, 0x94, 0x68, 0x56, 0x5d, 0x4c, 0x95, 0xb1, - 0x71, 0xe7, 0xbd, 0xc4, 0x34, 0x66, 0xd4, 0xcb, 0x68, 0xe2, 0xae, 0x51, - 0x83, 0x2d, 0x1a, 0x66, 0xe6, 0x48, 0x89, 0x34, 0xc8, 0x6b, 0x9b, 0x0f, - 0x94, 0xa3, 0x02, 0x5e, 0x04, 0x8c, 0xe8, 0xa9, 0xa8, 0x9d, 0x36, 0xe9, - 0x19, 0x2d, 0x89, 0xfa, 0x1f, 0x06, 0xc7, 0x22, 0x5c, 0x00, 0x2d, 0x96, - 0xb4, 0x9b, 0x15, 0x8d, 0x42, 0x6e, 0xcb, 0xef, 0xb2, 0x7c, 0x90, 0x57, - 0xb8, 0xb6, 0x23, 0x87, 0xd8, 0xe5, 0x26, 0x90, 0xe8, 0x51, 0xe9, 0x90, - 0x94, 0x7c, 0xea, 0x67, 0x64, 0xae, 0x37, 0x4e, 0x65, 0xef, 0x88, 0xce, - 0x53, 0x68, 0xe1, 0xcb, 0xb0, 0xaf, 0xd1, 0xfb, 0xa7, 0xf0, 0xde, 0x4b, - 0xa2, 0x05, 0x21, 0x12, 0xc5, 0x5f, 0x4b, 0x7b, 0xef, 0x91, 0x2a, 0x27, - 0xeb, 0x7b, 0x46, 0x1c, 0x6e, 0x72, 0x70, 0x8a, 0x6a, 0xe0, 0xbc, 0x84, - 0xa8, 0xef, 0x68, 0x29, 0x3d, 0x80, 0x46, 0x96, 0x82, 0x60, 0x12, 0xbc, - 0x04, 0xae, 0x21, 0xad, 0xdb, 0x24, 0x62, 0x63, 0xb2, 0xb9, 0x14, 0x4d, - 0xe1, 0xf5, 0x01, 0xde, 0x78, 0x40, 0x89, 0x06, 0xc5, 0x87, 0x8a, 0x39, - 0xdc, 0xc1, 0x91, 0x37, 0x69, 0xe0, 0x82, 0x8f, 0x99, 0x70, 0x50, 0xe5, - 0xa3, 0x34, 0xe2, 0x50, 0x13, 0xc6, 0x45, 0xe2, 0xe7, 0x69, 0x53, 0x22, - 0x28, 0xa0, 0xa7, 0x41, 0xed, 0x21, 0x46, 0x94, 0xe1, 0x4c, 0x55, 0xa0, - 0xed, 0xf6, 0x2f, 0x03, 0x98, 0x0c, 0x8d, 0x91, 0x20, 0xd7, 0x80, 0x0c, - 0x1a, 0x02, 0xcc, 0x1d, 0x6c, 0x07, 0x14, 0x0b, 0x6c, 0x0b, 0x4f, 0xf2, - 0x1b, 0x77, 0x98, 0x22, 0xa5, 0x7c, 0x68, 0x0c, 0xf6, 0xfe, 0xb6, 0xc4, - 0xb9, 0x4a, 0xf1, 0xd9, 0x98, 0x51, 0xd7, 0xf0, 0xdd, 0x02, 0xb3, 0xc0, - 0x28, 0x47, 0x91, 0x7e, 0x25, 0x95, 0x05, 0xc1, 0xd0, 0x32, 0x5e, 0x30, - 0xe1, 0x3f, 0x73, 0x8f, 0x25, 0xd4, 0x26, 0xca, 0xbb, 0x51, 0xa6, 0x2f, - 0xca, 0xb7, 0xef, 0xe1, 0xde, 0xb6, 0xbc, 0xab, 0x8a, 0x7c, 0xaf, 0x8e, - 0x76, 0x9a, 0xb1, 0x3b, 0x5e, 0xc1, 0x74, 0x52, 0xba, 0x98, 0x55, 0xd4, - 0x3f, 0xbd, 0x0b, 0x19, 0xf4, 0x12, 0x50, 0x92, 0x75, 0x86, 0xe3, 0x8f, - 0xd9, 0x63, 0x5c, 0x91, 0x8f, 0x3a, 0x65, 0x89, 0x97, 0x6e, 0x3c, 0x8f, - 0x6a, 0x26, 0xea, 0xe3, 0xc3, 0x92, 0xc7, 0x43, 0x34, 0xf9, 0xfc, 0x9d, - 0x17, 0x6a, 0xd7, 0xa9, 0x02, 0xeb, 0xd4, 0x2c, 0x6c, 0x9c, 0x48, 0x8f, - 0x26, 0x67, 0x06, 0x5d, 0x58, 0xba, 0x0c, 0xd4, 0x3d, 0x02, 0x26, 0x75, - 0xcf, 0x20, 0x3a, 0x43, 0x52, 0x77, 0x9f, 0xfa, 0x85, 0xb7, 0xbc, 0x6b, - 0x93, 0xbc, 0xe0, 0x2b, 0x14, 0x8f, 0x94, 0xe9, 0xb7, 0xc7, 0xe0, 0xb2, - 0x0f, 0xaf, 0x77, 0x8b, 0xf9, 0xc3, 0xec, 0xb5, 0xb0, 0x86, 0xec, 0x32, - 0xe3, 0x60, 0xa3, 0x65, 0xd3, 0x8b, 0x14, 0xdb, 0x31, 0x89, 0x94, 0x82, - 0x19, 0xa1, 0x49, 0xf8, 0x33, 0x3d, 0xea, 0x59, 0x9b, 0xda, 0x7e, 0x3a, - 0x68, 0x7d, 0xb8, 0x6a, 0xbf, 0xb2, 0x4d, 0x7f, 0xe8, 0x87, 0x1b, 0x59, - 0xde, 0xcf, 0x32, 0x8d, 0x49, 0x3a, 0x18, 0x07, 0x4d, 0x13, 0x13, 0x1b, - 0x81, 0x08, 0x1c, 0x94, 0x05, 0x11, 0xaa, 0x6d, 0x0b, 0xb3, 0x99, 0x26, - 0x76, 0x5c, 0x8e, 0x95, 0x92, 0xb0, 0xe8, 0xe7, 0xf7, 0xaa, 0x6e, 0x84, - 0x88, 0xfb, 0x50, 0x31, 0xd9, 0x9e, 0x1d, 0x79, 0x3b, 0x57, 0xf9, 0x35, - 0x0b, 0x2e, 0xe8, 0x26, 0x90, 0x7b, 0x1b, 0xe5, 0xa5, 0xa2, 0x36, 0x02, - 0xb6, 0x2b, 0xfc, 0x48, 0x01, 0x05, 0x09, 0xba, 0x23, 0xa9, 0xe4, 0x05, - 0xf4, 0xa9, 0x1b, 0xf0, 0xbf, 0xba, 0xe8, 0x1b, 0x60, 0x7a, 0x63, 0x18, - 0xb3, 0x8a, 0x00, 0xdf, 0x02, 0x3c, 0xd2, 0x77, 0x86, 0x43, 0x13, 0xda, - 0xb8, 0x01, 0x5e, 0xc8, 0x6b, 0x28, 0x26, 0xd9, 0x46, 0x00, 0x04, 0x7d, - 0x0a, 0xea, 0x00, 0xa2, 0xa9, 0xd9, 0xcf, 0xc9, 0xf6, 0xc3, 0xfa, 0x08, - 0xaa, 0xdb, 0x4c, 0x3b, 0x4d, 0xbe, 0x96, 0xf1, 0xfb, 0xaa, 0xaf, 0x06, - 0xbd, 0x69, 0xef, 0x74, 0x72, 0xa9, 0xfe, 0x76, 0xb6, 0x1d, 0x93, 0x43, - 0x46, 0x5c, 0x03, 0xf9, 0xa5, 0x5a, 0x1f, 0xfe, 0x0c, 0x74, 0x84, 0x7c, - 0x04, 0xb4, 0xe3, 0x99, 0x09, 0x2f, 0x9b, 0x51, 0xc2, 0x30, 0x80, 0xef, - 0xcd, 0xfc, 0x87, 0x2b, 0xb2, 0xf4, 0x3c, 0x88, 0x3c, 0x93, 0x74, 0x87, - 0xb2, 0xf1, 0xaf, 0x8c, 0x6f, 0xe4, 0xca, 0x2b, 0xed, 0x10, 0x37, 0xcb, - 0x96, 0x0c, 0x72, 0xdd, 0x76, 0xda, 0x3f, 0xb4, 0xae, 0x53, 0xe9, 0x1c, - 0x84, 0x5d, 0xa0, 0x64, 0x52, 0xdf, 0xa4, 0xcf, 0x68, 0x4b, 0x90, 0xbf, - 0x6f, 0x31, 0x82, 0x9f, 0x72, 0xdd, 0x92, 0x97, 0x3e, 0xa8, 0xcc, 0x35, - 0xed, 0x96, 0xb9, 0x87, 0xbf, 0x75, 0x2e, 0xfd, 0xb1, 0x59, 0x93, 0x4f, - 0xc7, 0x74, 0x23, 0xd5, 0x28, 0x50, 0x56, 0xa6, 0x10, 0x4a, 0x76, 0x05, - 0x70, 0x66, 0xbe, 0x10, 0xa7, 0x62, 0xba, 0x88, 0xa7, 0x9b, 0x47, 0xce, - 0x9c, 0x8c, 0xbc, 0xb7, 0xfa, 0x86, 0x1c, 0x01, 0xd9, 0x4f, 0xb2, 0x9c, - 0xba, 0x5f, 0xd6, 0x09, 0x6c, 0x4a, 0xa5, 0x24, 0xb9, 0xba, 0x46, 0xbe, - 0x4a, 0xf1, 0x7b, 0x4c, 0xb6, 0x97, 0x72, 0xfe, 0xf3, 0xc7, 0x0d, 0x81, - 0x0e, 0xad, 0x07, 0x84, 0x9e, 0x54, 0x4e, 0xed, 0xbf, 0x76, 0x14, 0xef, - 0xd2, 0x47, 0x74, 0xac, 0xdf, 0xd1, 0x43, 0x93, 0xcf, 0x7b, 0x94, 0x60, - 0x69, 0x6b, 0xd6, 0x4b, 0x3d, 0x47, 0x62, 0xfa, 0xf1, 0x52, 0x3e, 0x49, - 0x80, 0x74, 0x50, 0x3e, 0x8d, 0x63, 0xca, 0x52, 0xc1, 0x76, 0x54, 0x89, - 0x84, 0x85, 0x88, 0x79, 0x1c, 0x38, 0xc2, 0xd7, 0x55, 0xea, 0xeb, 0xef, - 0xec, 0xbe, 0x50, 0x5f, 0xd4, 0x2d, 0xb9, 0xa3, 0x6f, 0x32, 0x8c, 0xce, - 0xf9, 0xec, 0x84, 0xa5, 0xc0, 0xf8, 0xda, 0xab, 0x8e, 0xc2, 0x29, 0xb0, - 0x69, 0x73, 0x4d, 0xee, 0x30, 0x3c, 0x16, 0x81, 0xba, 0x2e, 0x9e, 0xfa, - 0x9d, 0xb1, 0xb0, 0x46, 0xcb, 0xa5, 0x60, 0xe2, 0x89, 0x64, 0xe2, 0x40, - 0x82, 0x49, 0x86, 0xfd, 0x09, 0x93, 0x5c, 0x0a, 0x36, 0x30, 0x8c, 0x01, - 0xc2, 0xf1, 0x03, 0x7d, 0xfb, 0x07, 0x33, 0x75, 0xe0, 0x11, 0xf7, 0x80, - 0x1e, 0xbb, 0x15, 0x2c, 0x42, 0xa0, 0x2b, 0x75, 0xbb, 0x79, 0x73, 0x6b, - 0x90, 0x5b, 0xe9, 0xae, 0x57, 0x9e, 0x2b, 0xbe, 0xf6, 0xbc, 0xa7, 0x65, - 0xb7, 0xd5, 0x07, 0xc6, 0xa4, 0x11, 0xba, 0x27, 0x21, 0x4b, 0xad, 0xa6, - 0x70, 0x11, 0xf0, 0x5d, 0x9c, 0x6c, 0x40, 0x71, 0xb7, 0x4b, 0x4b, 0x87, - 0x96, 0x5b, 0xca, 0x08, 0x64, 0x6a, 0xc8, 0x5e, 0x30, 0xa0, 0xad, 0x5f, - 0x36, 0x5a, 0xac, 0x5c, 0xd8, 0x3f, 0x97, 0xb8, 0xf4, 0x57, 0x77, 0x01, - 0x4d, 0x41, 0x22, 0x28, 0x6b, 0x6d, 0xbb, 0x22, 0x65, 0xe7, 0x76, 0x4b, - 0x90, 0xb7, 0x6d, 0x0d, 0xeb, 0xdc, 0x33, 0x69, 0x0f, 0x02, 0x8e, 0xb7, - 0x9b, 0xd4, 0x5d, 0x5e, 0x55, 0x59, 0xc2, 0x03, 0x12, 0xcf, 0xb3, 0x81, - 0x01, 0x81, 0xf7, 0x11, 0xa7, 0xd9, 0x4a, 0x10, 0xcc, 0x9b, 0x36, 0x09, - 0x88, 0xd0, 0x8e, 0x76, 0xe6, 0xdb, 0x02, 0x8c, 0xb6, 0x8f, 0x13, 0x11, - 0x37, 0x7c, 0xfa, 0xaa, 0xe0, 0xfe, 0xaf, 0x34, 0x07, 0x9f, 0x6d, 0xe8, - 0x60, 0x5d, 0x62, 0x88, 0xbb, 0xd2, 0x5c, 0xe4, 0x2a, 0xeb, 0xa6, 0xe3, - 0xa3, 0x9b, 0xed, 0x9b, 0x44, 0xa5, 0xdd, 0x9a, 0xfc, 0x92, 0xd2, 0x4a, - 0x19, 0xfe, 0xf5, 0x10, 0x70, 0x49, 0x56, 0x9d, 0xbe, 0x4a, 0xa7, 0xaf, - 0x43, 0x16, 0x11, 0x0a, 0x0c, 0xb7, 0x92, 0xec, 0x76, 0x0f, 0x94, 0x61, - 0xeb, 0x97, 0x21, 0x6c, 0xb5, 0x0a, 0x1a, 0xc7, 0xa7, 0x0f, 0x49, 0x32, - 0x90, 0x6e, 0xfc, 0x59, 0x9a, 0xd3, 0x63, 0xd4, 0x76, 0x06, 0x63, 0x7c, - 0x2d, 0xe3, 0x71, 0x63, 0xfc, 0x98, 0xde, 0x9d, 0x53, 0xd4, 0x31, 0xf5, - 0xff, 0x2e, 0x1b, 0x3e, 0x7c, 0x78, 0x63, 0x7a, 0x86, 0xa4, 0x64, 0x36, - 0x0b, 0x9d, 0x73, 0x69, 0x8b, 0xca, 0xd0, 0xc8, 0xa5, 0x52, 0x83, 0x67, - 0xd5, 0x72, 0x98, 0x34, 0xcf, 0x57, 0xf1, 0x45, 0x5e, 0x3d, 0xf1, 0xe5, - 0xcc, 0x89, 0x0a, 0x8b, 0xb4, 0xd4, 0x35, 0x49, 0x59, 0xda, 0x56, 0x76, - 0x73, 0x97, 0x25, 0x84, 0x0d, 0x1f, 0x48, 0x0f, 0x09, 0xd5, 0x50, 0x57, - 0xfe, 0x67, 0x98, 0xf6, 0xa0, 0x3b, 0x08, 0x77, 0x0b, 0xcf, 0xd8, 0x8b, - 0x07, 0x30, 0xf4, 0x58, 0x15, 0xae, 0x4d, 0x1e, 0x31, 0x66, 0x32, 0x36, - 0xa8, 0x40, 0x43, 0xfd, 0x25, 0xcb, 0xcd, 0xf2, 0xce, 0x59, 0x4b, 0xee, - 0x7a, 0xf2, 0x75, 0x4b, 0x03, 0xdd, 0xef, 0xba, 0xf9, 0xc3, 0x54, 0x29, - 0x2c, 0x92, 0x37, 0x1c, 0xe5, 0x70, 0x38, 0x1a, 0x40, 0x6a, 0xb2, 0x73, - 0xb4, 0x41, 0xa5, 0x49, 0xd7, 0x13, 0xb3, 0x04, 0x1e, 0x41, 0x54, 0x82, - 0x1c, 0x14, 0x03, 0x7c, 0xb7, 0xd0, 0x76, 0x3b, 0x3a, 0xd6, 0x65, 0xc8, - 0xc3, 0x72, 0x15, 0x67, 0xd9, 0x94, 0xa0, 0xfc, 0x96, 0x12, 0x15, 0x07, - 0xd9, 0x3c, 0x89, 0x1e, 0x2b, 0xfa, 0x65, 0x0a, 0x23, 0x72, 0x37, 0xdc, - 0x65, 0xd5, 0x22, 0x4b, 0x33, 0x86, 0x05, 0xd9, 0x5a, 0x2a, 0x76, 0x19, - 0x2d, 0xc7, 0x1b, 0xd5, 0x42, 0xf2, 0x20, 0x98, 0xab, 0x38, 0x62, 0x84, - 0x1e, 0x31, 0x3a, 0x3a, 0x30, 0x12, 0x99, 0x61, 0x57, 0xec, 0xc5, 0x60, - 0xec, 0xf3, 0x10, 0x66, 0xbd, 0x6b, 0x06, 0xd2, 0xab, 0x21, 0xe4, 0x23, - 0x9c, 0x61, 0x74, 0x51, 0xdc, 0xac, 0x69, 0xfc, 0x17, 0xe2, 0x43, 0x6a, - 0x3b, 0x2f, 0xe8, 0x56, 0xb2, 0x15, 0x63, 0x8b, 0x80, 0x8d, 0x22, 0xda, - 0xe0, 0x2b, 0x17, 0xbf, 0xb2, 0x0e, 0xe9, 0xf6, 0x84, 0x09, 0x77, 0xa7, - 0x2f, 0xd8, 0x99, 0x4f, 0x35, 0xdf, 0x2e, 0xd6, 0x73, 0xf8, 0xbe, 0x3e, - 0xcd, 0x1d, 0xc2, 0xbe, 0x2b, 0xe3, 0x04, 0x4d, 0x53, 0xda, 0xdd, 0x10, - 0xa5, 0xb7, 0x44, 0xda, 0xa1, 0xde, 0x3d, 0xdb, 0xe4, 0x19, 0x20, 0x71, - 0xc9, 0x7f, 0x5f, 0x3f, 0x86, 0x2e, 0xf3, 0xd0, 0xba, 0x31, 0xa7, 0xd5, - 0x7d, 0x76, 0xff, 0x8c, 0x11, 0xa0, 0x9e, 0xac, 0xd5, 0xca, 0x1f, 0x4c, - 0x49, 0x2e, 0xfa, 0x3a, 0x47, 0x30, 0x3e, 0x3f, 0x83, 0xd8, 0x7d, 0x2e, - 0x2f, 0x7a, 0xdf, 0x56, 0x54, 0x43, 0x42, 0x65, 0xa0, 0x83, 0x30, 0xc9, - 0x67, 0xee, 0xda, 0x76, 0xca, 0xe4, 0xb7, 0xc9, 0x2c, 0x54, 0x2e, 0xa0, - 0x45, 0x73, 0x01, 0x06, 0xfb, 0x2f, 0x66, 0xc1, 0xf1, 0x0e, 0x99, 0x02, - 0xc8, 0xc1, 0x17, 0x8a, 0x09, 0x85, 0x80, 0xc9, 0x61, 0x0c, 0x42, 0xe8, - 0x34, 0xa5, 0x67, 0x96, 0xda, 0x22, 0x22, 0x3c, 0xb3, 0x8a, 0xcd, 0x8c, - 0x67, 0xf4, 0x55, 0xbf, 0xe0, 0xc8, 0x00, 0x46, 0x2f, 0xa6, 0x72, 0x12, - 0x15, 0x56, 0xf0, 0xef, 0xe4, 0x3c, 0x3c, 0x10, 0xe1, 0xb9, 0xfb, 0x71, - 0x78, 0x73, 0x06, 0xea, 0xbd, 0x7c, 0x68, 0x88, 0x3c, 0xef, 0xc3, 0x09, - 0x9b, 0xf5, 0x15, 0xcc, 0x49, 0x5c, 0x1b, 0xb8, 0xd3, 0x66, 0x0e, 0x86, - 0x5b, 0x20, 0x65, 0xe2, 0x5e, 0x90, 0xb5, 0x77, 0x66, 0x74, 0x43, 0x52, - 0xe6, 0x5a, 0x81, 0x4d, 0xd0, 0x5e, 0x84, 0x4c, 0x0a, 0xfb, 0x94, 0xcc, - 0xc1, 0xca, 0x95, 0xc1, 0xab, 0x0f, 0x6d, 0xf1, 0xd3, 0x58, 0x35, 0x57, - 0x40, 0x30, 0x34, 0x23, 0xa5, 0x4b, 0x60, 0x3a, 0xbc, 0x13, 0x52, 0xc2, - 0xec, 0x38, 0x32, 0x51, 0xcd, 0xea, 0x78, 0xe8, 0xce, 0x6e, 0x6b, 0x9e, - 0x0b, 0xa1, 0x6c, 0x4a, 0xb1, 0x28, 0x8c, 0x21, 0xcd, 0x0b, 0x6e, 0x80, - 0xf5, 0x4d, 0x32, 0xce, 0x23, 0xbb, 0xd6, 0x72, 0x9e, 0x77, 0xdf, 0xe7, - 0xbc, 0x0a, 0x81, 0xe3, 0x14, 0x82, 0x6e, 0xea, 0x13, 0x76, 0x65, 0x1f, - 0x7f, 0xc6, 0xe6, 0xdb, 0xd6, 0xab, 0x9c, 0xa8, 0x3a, 0xc2, 0x3d, 0xbd, - 0x3f, 0x8d, 0x61, 0xe1, 0x87, 0x28, 0x57, 0x11, 0x63, 0x9e, 0x4f, 0xb2, - 0x1d, 0x4f, 0xad, 0xb1, 0x41, 0x0b, 0x17, 0x57, 0xec, 0x08, 0xfe, 0x15, - 0x61, 0x21, 0xf5, 0x09, 0x0a, 0x52, 0xda, 0x8c, 0x81, 0x02, 0x34, 0x93, - 0x38, 0x69, 0xe4, 0xee, 0x29, 0x14, 0x51, 0xfb, 0x5b, 0xa5, 0x15, 0xad, - 0x40, 0x8d, 0xe3, 0xe6, 0xb7, 0x08, 0x7a, 0xe3, 0x7b, 0x45, 0xf3, 0x2f, - 0x29, 0x0d, 0x07, 0x57, 0xe2, 0xb5, 0x08, 0x83, 0xff, 0xb7, 0x20, 0xe2, - 0x16, 0xc0, 0xef, 0xf5, 0xb6, 0xad, 0x3a, 0x1b, 0x8d, 0x2c, 0xdb, 0xaa, - 0x10, 0xb2, 0xdf, 0x4c, 0x7d, 0x11, 0x4c, 0xec, 0x6f, 0x19, 0xde, 0x27, - 0xf1, 0x0b, 0x83, 0x47, 0x88, 0x54, 0x18, 0x4c, 0xd2, 0xee, 0x49, 0x54, - 0x3a, 0x22, 0x3e, 0x9c, 0xba, 0xf2, 0x35, 0x40, 0x8a, 0x3c, 0xb6, 0x8b, - 0x9b, 0x65, 0xff, 0xf0, 0x85, 0x2e, 0xdf, 0x90, 0x34, 0xb8, 0xd1, 0xb7, - 0xc1, 0x4c, 0xa0, 0xdd, 0x6a, 0x2f, 0x47, 0x0a, 0xd0, 0x10, 0x1c, 0xa3, - 0x22, 0x66, 0xb5, 0xcb, 0x49, 0x32, 0x70, 0xdf, 0x58, 0x46, 0x4a, 0xb3, - 0x38, 0x4b, 0xad, 0xb1, 0xaa, 0xa2, 0x2a, 0xdf, 0x99, 0x9c, 0x75, 0x74, - 0x40, 0xd9, 0xf1, 0xfe, 0x6e, 0x57, 0xa3, 0x22, 0x06, 0xd1, 0x32, 0x55, - 0x2e, 0x72, 0xa3, 0xd0, 0x74, 0xe3, 0xd9, 0x71, 0xff, 0x45, 0xb9, 0xbd, - 0x71, 0x3e, 0xb2, 0xde, 0xf5, 0x0d, 0x53, 0xd4, 0xfa, 0x6d, 0x15, 0x30, - 0x98, 0xeb, 0x79, 0x0a, 0xcd, 0x1b, 0x77, 0x50, 0x68, 0xf5, 0x63, 0x4f, - 0xbb, 0xc1, 0x01, 0x3a, 0xef, 0x21, 0x66, 0x79, 0x2e, 0x66, 0x61, 0xd2, - 0xa7, 0x47, 0xea, 0xf6, 0xaa, 0xab, 0x06, 0xd4, 0xae, 0x6d, 0x07, 0xd1, - 0xb9, 0x36, 0x8c, 0x63, 0xe9, 0x03, 0x72, 0x9f, 0xee, 0x7c, 0x09, 0x61, - 0xde, 0x6d, 0xf2, 0x28, 0x56, 0x80, 0x37, 0x76, 0x6c, 0xb8, 0x54, 0x68, - 0x79, 0x8f, 0xb5, 0x9d, 0x11, 0x30, 0x32, 0x27, 0xd4, 0xe1, 0x7a, 0xcd, - 0xed, 0x0e, 0x38, 0x4a, 0x50, 0x13, 0x1f, 0x62, 0xc9, 0x35, 0x70, 0xc8, - 0x07, 0x95, 0x7c, 0xab, 0x46, 0x8c, 0xaf, 0x8a, 0x1f, 0xc8, 0xff, 0x91, - 0xd9, 0xf9, 0x07, 0x94, 0xf4, 0xb7, 0xf5, 0x12, 0x3f, 0x63, 0x1d, 0x14, - 0xcf, 0xf1, 0x8d, 0xbf, 0x10, 0x4c, 0x41, 0x44, 0x1f, 0x4a, 0x19, 0x37, - 0x48, 0x05, 0xc9, 0x92, 0x46, 0xc7, 0x20, 0x98, 0x95, 0x9c, 0x12, 0xe0, - 0x62, 0xcb, 0xa9, 0x60, 0x7d, 0x46, 0x7a, 0xb0, 0x10, 0x98, 0xa8, 0x65, - 0xed, 0xe0, 0x47, 0xe7, 0x92, 0x47, 0x01, 0xe5, 0xf6, 0x96, 0x90, 0x65, - 0x08, 0x0f, 0x93, 0xf6, 0x61, 0x4e, 0x89, 0x7c, 0x02, 0x05, 0xa3, 0x6f, - 0x8d, 0xb7, 0x73, 0x2c, 0xce, 0x90, 0xc1, 0xe9, 0xeb, 0xb9, 0xf9, 0x0d, - 0x56, 0x7a, 0x2a, 0x47, 0x83, 0xa8, 0xf0, 0xf7, 0x78, 0x6e, 0x38, 0x7c, - 0x89, 0x4a, 0x78, 0x83, 0xeb, 0x80, 0x84, 0x87, 0x7e, 0xad, 0x7c, 0x55, - 0x47, 0x8b, 0x71, 0x1e, 0x84, 0x57, 0x1f, 0x78, 0xa9, 0xfa, 0x8d, 0x1d, - 0xd1, 0x29, 0x96, 0x28, 0xeb, 0x4f, 0xc9, 0x00, 0xb0, 0x96, 0x97, 0x85, - 0xc8, 0xd6, 0xaf, 0xca, 0xcd, 0x0f, 0x5b, 0x76, 0x48, 0xe1, 0x9c, 0xac, - 0xd6, 0x62, 0x52, 0xdd, 0xa6, 0xeb, 0xcf, 0x0c, 0x5b, 0x0d, 0x3a, 0x3a, - 0x99, 0x54, 0x88, 0xb9, 0xf4, 0x45, 0xfb, 0xdd, 0x4d, 0xf6, 0x65, 0xfe, - 0x61, 0x33, 0x9e, 0xbc, 0x45, 0x77, 0xe3, 0x4d, 0xe6, 0x24, 0x00, 0xd4, - 0xd6, 0x3b, 0xdb, 0xb4, 0xc2, 0x48, 0xc5, 0xa7, 0x72, 0x46, 0xd6, 0x7b, - 0x6f, 0xd9, 0x58, 0x8d, 0xf4, 0x1c, 0x2c, 0xab, 0xb2, 0x89, 0x71, 0xfa, - 0x38, 0xa0, 0xaf, 0x0e, 0xf6, 0x99, 0xfd, 0xad, 0x71, 0x8a, 0x84, 0x2d, - 0xb1, 0x89, 0x74, 0x28, 0x96, 0x55, 0x04, 0x33, 0x69, 0x01, 0x9c, 0xb1, - 0x2b, 0x09, 0xd2, 0x4c, 0xbc, 0xd9, 0x10, 0x5c, 0x3a, 0x94, 0xc2, 0x5d, - 0xbb, 0xb3, 0xaa, 0xcc, 0x3b, 0xdb, 0x7c, 0x4e, 0x4b, 0x7d, 0xa9, 0x0e, - 0x46, 0xd9, 0x58, 0xe9, 0x75, 0x4f, 0xc1, 0x1c, 0xaf, 0xdc, 0xd1, 0x6d, - 0xc9, 0x3d, 0x74, 0x2e, 0x99, 0xf0, 0x45, 0xae, 0xcc, 0x15, 0x76, 0x78, - 0xcb, 0x9e, 0xe0, 0x43, 0xd9, 0x41, 0x85, 0x42, 0x4c, 0xa2, 0x94, 0x13, - 0xf5, 0x0a, 0x40, 0xe7, 0x04, 0xfa, 0x33, 0x65, 0xa5, 0x2a, 0x82, 0xd4, - 0x20, 0xa3, 0xec, 0xca, 0xef, 0x4e, 0xdc, 0x60, 0x3b, 0xfd, 0x2c, 0x3d, - 0x35, 0xb2, 0xd1, 0x10, 0x8e, 0x96, 0x2f, 0x2b, 0x8b, 0xb2, 0xa2, 0x68, - 0xd3, 0x43, 0x56, 0x77, 0xde, 0x96, 0x72, 0xce, 0xbf, 0xfd, 0xce, 0x3e, - 0xd3, 0x5a, 0xd2, 0x0f, 0x93, 0xa9, 0x1d, 0x35, 0x6e, 0x3e, 0xcc, 0xc6, - 0xa2, 0x5a, 0x78, 0x5c, 0x9d, 0x79, 0xa8, 0x03, 0x2b, 0xfe, 0xa6, 0x50, - 0xad, 0x79, 0x7f, 0x62, 0xf8, 0x38, 0xb5, 0xd1, 0x61, 0xcf, 0xe5, 0x3f, - 0xdc, 0xba, 0xa8, 0x43, 0x14, 0xb3, 0x31, 0x13, 0x71, 0x97, 0xa0, 0x79, - 0x51, 0x60, 0x59, 0xa1, 0xd6, 0x95, 0x2e, 0x38, 0xd3, 0x5d, 0xb5, 0x7d, - 0xa8, 0xfa, 0x0d, 0x99, 0xa9, 0x67, 0x76, 0x1c, 0xab, 0x5e, 0xa0, 0x89, - 0xc1, 0xb3, 0x63, 0x94, 0x42, 0x75, 0x8b, 0x48, 0xb7, 0x15, 0x74, 0xb9, - 0xc2, 0x21, 0x48, 0x1c, 0x1e, 0x65, 0x9b, 0x42, 0xb8, 0x2e, 0x0e, 0x51, - 0x76, 0xe9, 0x68, 0x06, 0xe7, 0x4f, 0xc3, 0x3a, 0x67, 0xf9, 0x51, 0x43, - 0xef, 0xcf, 0x6d, 0xa6, 0x33, 0x34, 0x3d, 0x76, 0x79, 0x4a, 0x78, 0xe8, - 0xf4, 0x4c, 0x0a, 0xff, 0xd4, 0x1d, 0x85, 0x9c, 0xd2, 0xdf, 0x81, 0xeb, - 0x8e, 0xd8, 0xee, 0x44, 0xd3, 0xb5, 0x32, 0x99, 0x7c, 0x2c, 0x3e, 0xc3, - 0xb9, 0x9c, 0x4c, 0x81, 0xb8, 0x57, 0xbf, 0x2f, 0x17, 0x1f, 0x3e, 0x00, - 0x56, 0x16, 0x30, 0x9a, 0x06, 0x41, 0x81, 0x36, 0x66, 0xc1, 0xdb, 0x8f, - 0xbf, 0xb8, 0xc5, 0x0c, 0x09, 0x54, 0x3a, 0x21, 0x0b, 0xb8, 0xa9, 0x6b, - 0xc3, 0x81, 0xff, 0x23, 0x2d, 0x5a, 0x74, 0xad, 0x4d, 0x13, 0x2a, 0x3e, - 0xae, 0x91, 0x1a, 0x57, 0x73, 0x47, 0x9b, 0x03, 0xe4, 0x7a, 0x08, 0xcf, - 0xe1, 0x08, 0x6c, 0x83, 0x05, 0xb5, 0x19, 0xc6, 0x8c, 0x31, 0x55, 0x99, - 0xf7, 0x1c, 0xbf, 0x2b, 0xea, 0x2e, 0x1d, 0xd5, 0xf5, 0xd2, 0x74, 0xe7, - 0x0a, 0x87, 0xdb, 0xad, 0x8b, 0x54, 0x07, 0x42, 0xef, 0x0f, 0x9f, 0x32, - 0x73, 0x94, 0x77, 0x2e, 0x22, 0xe3, 0x6a, 0x47, 0x1a, 0xe1, 0xa2, 0xcf, - 0x75, 0x7e, 0x7f, 0xad, 0xc5, 0x0c, 0xd7, 0x26, 0x79, 0xfe, 0x36, 0xbb, - 0xdf, 0x16, 0x1d, 0x13, 0x98, 0xae, 0x23, 0xe0, 0xbf, 0xce, 0x4e, 0xf5, - 0x29, 0x9a, 0xeb, 0xb8, 0x26, 0x2f, 0xe4, 0x95, 0xcb, 0x3e, 0x00, 0x5c, - 0xca, 0xf6, 0x39, 0x7a, 0xc9, 0xaf, 0xfe, 0x7c, 0x04, 0x1b, 0xf0, 0x2f, - 0xf1, 0xc5, 0x1b, 0xb3, 0x65, 0x47, 0x09, 0x0e, 0xb6, 0xc9, 0x2c, 0x66, - 0xbf, 0x44, 0xc0, 0x2d, 0x99, 0xab, 0xe6, 0xb8, 0x44, 0xfc, 0x7a, 0x22, - 0xfd, 0xae, 0x8a, 0x83, 0xbe, 0x92, 0x07, 0x12, 0x1a, 0x67, 0x65, 0x16, - 0x1b, 0x5c, 0x3b, 0x17, 0xd7, 0x74, 0x20, 0x1d, 0xd4, 0x00, 0xaf, 0x86, - 0x1d, 0xad, 0xfd, 0x04, 0x0e, 0x29, 0x90, 0x06, 0x37, 0x22, 0x2c, 0x49, - 0xbd, 0x93, 0xbb, 0x7e, 0xb1, 0x6d, 0xec, 0x86, 0x51, 0x06, 0x8e, 0x68, - 0xae, 0x60, 0xa1, 0x62, 0xe2, 0xec, 0x5e, 0xc2, 0xf3, 0x73, 0x15, 0xf5, - 0xa2, 0xee, 0x15, 0xb3, 0x2b, 0xe7, 0x49, 0xa1, 0xc9, 0x33, 0xfd, 0x26, - 0x4f, 0xc2, 0xad, 0x9f, 0xb4, 0x37, 0xc7, 0xd3, 0x1a, 0x01, 0x6e, 0x79, - 0x89, 0x08, 0x29, 0x50, 0x34, 0xc8, 0x2c, 0xf6, 0xcc, 0x40, 0x22, 0x4a, - 0xa0, 0xf1, 0xdf, 0xee, 0xfd, 0xd5, 0x04, 0x69, 0xc6, 0x8c, 0x47, 0x38, - 0x7c, 0xa6, 0x7f, 0xc9, 0xa2, 0xd6, 0x6b, 0xf4, 0x90, 0xfc, 0xa3, 0xbf, - 0x7e, 0x47, 0xdb, 0xf6, 0x28, 0x5e, 0x84, 0xfb, 0x12, 0xc4, 0xe1, 0xa9, - 0x63, 0x24, 0xd2, 0xba, 0x20, 0xaa, 0xe3, 0x2c, 0x71, 0xd2, 0xc2, 0x91, - 0x75, 0x6b, 0x0c, 0xcf, 0xae, 0xcd, 0xa5, 0x7b, 0x10, 0x63, 0x3c, 0xde, - 0xe1, 0x2d, 0x7f, 0xb3, 0x7c, 0x56, 0x5c, 0x2d, 0xf9, 0x0d, 0xf0, 0x88, - 0xee, 0xba, 0x3c, 0x15, 0xd3, 0x7d, 0x6c, 0xaa, 0xcf, 0x54, 0xb0, 0xc8, - 0x47, 0x52, 0x4f, 0xcb, 0x35, 0xcd, 0xf2, 0x0f, 0x5b, 0xe7, 0x74, 0xb4, - 0xa5, 0xac, 0x86, 0xe2, 0x05, 0xd2, 0xab, 0x48, 0x01, 0x11, 0x31, 0x64, - 0xbd, 0x29, 0xa7, 0xf5, 0xa5, 0x30, 0x57, 0x55, 0x3d, 0xaf, 0x53, 0x0c, - 0x43, 0x1f, 0xf4, 0x24, 0x9f, 0x1c, 0x11, 0x47, 0x4b, 0xcc, 0xc4, 0x66, - 0x82, 0x94, 0xde, 0x99, 0x96, 0x07, 0x6b, 0x0d, 0x18, 0x75, 0x52, 0x3d, - 0xab, 0x92, 0x09, 0x16, 0x84, 0x9f, 0x97, 0x14, 0x19, 0x4f, 0xff, 0x8a, - 0x50, 0x8c, 0xb8, 0x04, 0x0f, 0x13, 0x6e, 0xd9, 0x56, 0x50, 0x52, 0x6e, - 0x8b, 0xaa, 0x1e, 0xc5, 0x67, 0x10, 0xa7, 0x94, 0xeb, 0xf8, 0xd5, 0xde, - 0x62, 0x2c, 0x89, 0x6f, 0xd8, 0xfc, 0x19, 0xbf, 0xc0, 0x4a, 0x47, 0x19, - 0x04, 0x34, 0xf7, 0x40, 0x74, 0x64, 0x67, 0xb9, 0xfe, 0x1f, 0x00, 0x8f, - 0xbe, 0x89, 0x12, 0xd4, 0x69, 0x00, 0x5d, 0x98, 0x51, 0xdd, 0x90, 0x3f, - 0x64, 0x32, 0xf1, 0xc0, 0x6b, 0x06, 0xd5, 0x9f, 0x32, 0xfd, 0xa4, 0x98, - 0x6a, 0xbf, 0x0e, 0x3c, 0xab, 0x59, 0xff, 0x5b, 0x78, 0x4d, 0x7d, 0x67, - 0x84, 0x7e, 0x37, 0xb3, 0xd0, 0x40, 0xca, 0x2f, 0x0a, 0xcc, 0xfa, 0x69, - 0x59, 0x94, 0x7b, 0xeb, 0xea, 0xc5, 0xd1, 0xb4, 0xa7, 0x3b, 0xf9, 0x32, - 0x97, 0xba, 0xb4, 0xe3, 0x20, 0x17, 0xb6, 0xe2, 0xa7, 0x57, 0x27, 0xdd, - 0xc7, 0x77, 0x34, 0xb6, 0xb2, 0xe2, 0x14, 0x18, 0x7f, 0x51, 0x06, 0xe0, - 0xca, 0xe4, 0xc0, 0x5f, 0xdc, 0x85, 0xee, 0x8f, 0xd3, 0x8d, 0x3b, 0x23, - 0xb3, 0xaa, 0x2b, 0x30, 0x87, 0x9e, 0x7d, 0x91, 0x32, 0x07, 0x21, 0x3a, - 0x2a, 0x00, 0x7d, 0xb8, 0x26, 0x79, 0x17, 0x76, 0xb2, 0xdb, 0xcd, 0x0b, - 0x41, 0x6a, 0x20, 0x85, 0x37, 0x00, 0xac, 0xa7, 0x1f, 0x71, 0xe3, 0x73, - 0x88, 0xba, 0x04, 0x1e, 0x4d, 0x8b, 0x35, 0x8d, 0x0d, 0x88, 0xa0, 0x86, - 0x14, 0x06, 0x8a, 0x2f, 0xc0, 0x60, 0x89, 0x1e, 0xa8, 0xc8, 0xd8, 0x78, - 0x7f, 0xb9, 0x8a, 0x90, 0x6f, 0xb1, 0x03, 0xae, 0xda, 0x89, 0x8a, 0xbb, - 0x6b, 0x4d, 0xc2, 0x9e, 0x55, 0x57, 0xfe, 0x6b, 0x4f, 0xd9, 0x59, 0xce, - 0x6e, 0x05, 0x8f, 0x7d, 0x09, 0xf7, 0x9e, 0x21, 0xb1, 0xc1, 0xb1, 0xa3, - 0xb5, 0xd5, 0x32, 0x53, 0x07, 0x7a, 0x1b, 0x11, 0x88, 0xc4, 0x3e, 0xe9, - 0x98, 0x40, 0xdd, 0xa3, 0x26, 0x9d, 0x79, 0x88, 0xb0, 0x28, 0xb1, 0xae, - 0xf6, 0x56, 0x44, 0x48, 0xef, 0x3a, 0x0c, 0x8e, 0x31, 0x8b, 0x05, 0x9e, - 0x5b, 0xa3, 0x74, 0x01, 0x47, 0xfd, 0x50, 0xb7, 0xa0, 0x37, 0x70, 0xa7, - 0xcd, 0x08, 0xb1, 0x77, 0x34, 0xec, 0xda, 0x07, 0xa9, 0xa0, 0x89, 0x51, - 0xb6, 0xd1, 0x68, 0x8f, 0x12, 0xbf, 0x97, 0x33, 0x44, 0x58, 0x23, 0x8e, - 0x7b, 0x1b, 0xd8, 0x3e, 0x49, 0x77, 0x4b, 0x21, 0xdc, 0xd9, 0x40, 0x0e, - 0x9f, 0x67, 0x84, 0xb8, 0x3d, 0x55, 0x35, 0x04, 0x6f, 0x8a, 0xbb, 0xdf, - 0xbb, 0x1b, 0xa5, 0x47, 0xdf, 0x3e, 0x8b, 0xe7, 0x49, 0x19, 0x73, 0xb8, - 0x5d, 0x74, 0x6b, 0x19, 0x14, 0x2d, 0xea, 0x2c, 0x56, 0x3e, 0x47, 0x02, - 0x66, 0xe5, 0x77, 0x0a, 0x8a, 0x84, 0xb2, 0x02, 0xa4, 0x12, 0x20, 0x3e, - 0x3c, 0x70, 0xfd, 0xa2, 0x93, 0x3a, 0xa1, 0xef, 0x2e, 0x63, 0xe2, 0x59, - 0x0b, 0x93, 0xfb, 0x14, 0x74, 0x44, 0x68, 0x3d, 0x6b, 0xe6, 0x39, 0xb5, - 0x68, 0x85, 0xd1, 0x8f, 0xba, 0xf4, 0xb1, 0xd3, 0x1f, 0x7d, 0xa2, 0x9a, - 0x7f, 0xca, 0x8a, 0x1b, 0x99, 0x4f, 0x21, 0xce, 0xf1, 0xd3, 0x19, 0x04, - 0xe1, 0x8b, 0x73, 0x6b, 0x08, 0xba, 0x2d, 0x23, 0xdb, 0x81, 0x51, 0xe5, - 0x48, 0xeb, 0x7c, 0x34, 0x48, 0xc9, 0x83, 0xb5, 0x0a, 0x10, 0xd0, 0x09, - 0xc5, 0x22, 0x1b, 0xc1, 0x64, 0x3e, 0x00, 0x32, 0x7d, 0x43, 0xb7, 0x5d, - 0xaa, 0x13, 0x62, 0x05, 0x6a, 0x51, 0xfe, 0xcf, 0x74, 0x70, 0xad, 0x24, - 0xc7, 0xfe, 0x5c, 0x40, 0x9a, 0x5a, 0x2b, 0x0c, 0xe6, 0x45, 0x1c, 0x7b, - 0x33, 0x13, 0xfe, 0x1e, 0xf7, 0x69, 0x0b, 0x03, 0xc2, 0x6e, 0x77, 0x3f, - 0x99, 0x3d, 0xe5, 0x30, 0xaf, 0xf6, 0x77, 0xb7, 0x0e, 0x22, 0xc5, 0xf4, - 0x99, 0x7f, 0x78, 0xaa, 0x5b, 0xb5, 0xe7, 0x57, 0x6b, 0xa0, 0xac, 0x95, - 0xa6, 0xc4, 0x86, 0x09, 0xa8, 0x83, 0x44, 0x06, 0x65, 0x32, 0x13, 0xb9, - 0x19, 0x21, 0xe5, 0x3d, 0xd1, 0x35, 0x41, 0x80, 0xde, 0x8a, 0x87, 0x4f, - 0x24, 0xff, 0x01, 0x3f, 0x56, 0x40, 0x08, 0xf5, 0x89, 0x11, 0x32, 0x23, - 0x5d, 0xa0, 0x3b, 0xd4, 0xd8, 0x77, 0x21, 0x9e, 0x30, 0xe0, 0x67, 0xd0, - 0x6d, 0x86, 0xa9, 0xb2, 0x25, 0x2d, 0x8a, 0x09, 0x2f, 0x28, 0xbb, 0xe9, - 0x55, 0x41, 0xa3, 0x27, 0x4e, 0x9e, 0xeb, 0xd9, 0x3b, 0x16, 0xab, 0x7f, - 0x17, 0x6e, 0x61, 0x23, 0xdc, 0x5a, 0x25, 0x8d, 0x84, 0x35, 0x06, 0x20, - 0x2b, 0xfd, 0x13, 0xca, 0xa9, 0x88, 0xb2, 0x2b, 0x11, 0x1b, 0x25, 0x46, - 0x79, 0xe5, 0xdb, 0x83, 0xed, 0x19, 0x91, 0x57, 0x06, 0xa9, 0xa6, 0x96, - 0xd0, 0xfc, 0x1d, 0x3b, 0xb4, 0xee, 0x76, 0x0d, 0x8c, 0x47, 0x09, 0x94, - 0x75, 0x3a, 0x09, 0x87, 0xd1, 0xf0, 0x92, 0x6f, 0x5a, 0x9b, 0xa3, 0x79, - 0xd3, 0x7e, 0x08, 0x67, 0x57, 0xa6, 0x44, 0x5d, 0xdf, 0xc8, 0xf6, 0xa2, - 0xca, 0x48, 0x89, 0xea, 0x59, 0x9d, 0xc8, 0xdb, 0xea, 0xbb, 0x85, 0x11, - 0xb8, 0xe5, 0x21, 0xac, 0x8e, 0x66, 0xd1, 0xf4, 0x03, 0xcd, 0xd2, 0xaa, - 0x13, 0x98, 0xc2, 0x74, 0x6e, 0x79, 0xd0, 0x25, 0x19, 0x4c, 0x4a, 0x01, - 0x49, 0x00, 0xaf, 0xad, 0x48, 0x99, 0x6b, 0x7d, 0x45, 0x0f, 0xc1, 0xa6, - 0x44, 0x06, 0xa8, 0x1e, 0x3e, 0xeb, 0xeb, 0xc4, 0xce, 0x93, 0xe5, 0xa0, - 0xe2, 0x30, 0xed, 0xaf, 0x01, 0x05, 0x6e, 0x0f, 0xe1, 0x4c, 0x91, 0x37, - 0x84, 0xab, 0x45, 0x4f, 0x44, 0xd9, 0x98, 0xd6, 0x45, 0xea, 0xdd, 0x93, - 0xa5, 0xa3, 0x22, 0xf7, 0x98, 0xd9, 0x5f, 0x43, 0xef, 0x34, 0xd3, 0x09, - 0xbc, 0x32, 0x66, 0x7e, 0x94, 0x13, 0x55, 0xae, 0xf2, 0x92, 0xc8, 0x8c, - 0xb6, 0xaf, 0x2a, 0x8a, 0xbc, 0x22, 0x7f, 0xe2, 0x10, 0x32, 0x0a, 0xe7, - 0xfb, 0x37, 0x3e, 0x49, 0xed, 0x94, 0xc7, 0x4f, 0x23, 0x10, 0x40, 0x92, - 0x51, 0x86, 0x08, 0xcd, 0xe9, 0x19, 0xb8, 0x14, 0x21, 0x14, 0x27, 0x68, - 0xb3, 0xed, 0x58, 0x09, 0x70, 0x8c, 0x9f, 0x7c, 0x6b, 0xa5, 0x7e, 0x57, - 0x68, 0x7e, 0xb8, 0xd6, 0xb1, 0x7b, 0xdd, 0x1e, 0xdc, 0x12, 0xd5, 0xed, - 0xc2, 0x8d, 0x05, 0xa1, 0xaf, 0x62, 0xad, 0x28, 0xd6, 0xfd, 0x05, 0x43, - 0x8b, 0xd0, 0x75, 0x78, 0x4c, 0x77, 0xf4, 0x5d, 0x18, 0xec, 0xe8, 0x26, - 0x04, 0x8a, 0x45, 0x29, 0x6b, 0x38, 0xd8, 0x1b, 0x24, 0x70, 0x6b, 0xf8, - 0xf3, 0x31, 0x53, 0xab, 0xcd, 0xf4, 0x5e, 0x60, 0x3e, 0xb8, 0xac, 0x00, - 0x70, 0xea, 0x51, 0x6c, 0x32, 0x9e, 0xf1, 0x8d, 0xdc, 0xf2, 0x9e, 0x5d, - 0xa3, 0x9a, 0x5d, 0xac, 0x3f, 0x41, 0xa0, 0x88, 0x6c, 0x71, 0xb7, 0xc8, - 0xa7, 0xf7, 0x42, 0x21, 0x5e, 0xc3, 0x43, 0x06, 0xc7, 0x3c, 0x8f, 0x08, - 0x2b, 0x33, 0xd2, 0x8a, 0x3a, 0x4f, 0x3f, 0x52, 0x82, 0xde, 0x1f, 0x1b, - 0xc1, 0x67, 0x67, 0x04, 0x88, 0x78, 0x7e, 0x2e, 0xb6, 0xf0, 0x33, 0xa8, - 0xc5, 0x6a, 0x17, 0x6c, 0x2c, 0xde, 0x2a, 0xb1, 0xe4, 0x3e, 0x3e, 0xef, - 0xd1, 0xba, 0x73, 0x1b, 0x8b, 0x4e, 0xaf, 0xb3, 0x7f, 0x21, 0x81, 0xe0, - 0xf7, 0x75, 0x2c, 0x18, 0x55, 0x32, 0x0a, 0xa4, 0x05, 0x0f, 0xfb, 0x94, - 0xbc, 0x63, 0x5b, 0x0c, 0x16, 0x48, 0x20, 0x6c, 0x82, 0x83, 0x42, 0x97, - 0x82, 0xd4, 0xf7, 0x46, 0x6e, 0x44, 0xbf, 0x9d, 0xb4, 0x65, 0x87, 0xad, - 0xce, 0x06, 0xcb, 0x32, 0x7d, 0x93, 0xb4, 0x5f, 0x4a, 0x28, 0x8d, 0x8b, - 0xa5, 0x3b, 0xb6, 0xd2, 0x03, 0x7a, 0xce, 0xa6, 0xcb, 0xaa, 0xee, 0xc2, - 0xf4, 0x66, 0x2c, 0xdf, 0xc4, 0x8b, 0x9c, 0x5a, 0x05, 0xb1, 0xb6, 0xdc, - 0x9a, 0xf7, 0x46, 0x83, 0x7f, 0xb4, 0x8f, 0x6d, 0xad, 0x7b, 0xf5, 0x2d, - 0x3c, 0x48, 0xb3, 0x66, 0x6a, 0x9d, 0xc0, 0x39, 0xfd, 0x3b, 0x56, 0x3b, - 0x43, 0x90, 0xa0, 0x30, 0x7b, 0xc5, 0x9e, 0x89, 0xb7, 0xb4, 0x86, 0xca, - 0xce, 0x73, 0x45, 0xdb, 0xbb, 0x02, 0x08, 0x6d, 0xec, 0x4a, 0x19, 0x13, - 0xf2, 0x80, 0x3c, 0xa1, 0x08, 0x93, 0x31, 0xf1, 0xcd, 0xaf, 0x5c, 0x06, - 0x52, 0xd0, 0x73, 0x33, 0xce, 0xca, 0x0d, 0xc2, 0xcc, 0x92, 0x58, 0xe2, - 0x8d, 0xd4, 0xb3, 0xb5, 0xed, 0x58, 0xee, 0x24, 0x21, 0x2d, 0x28, 0x27, - 0x88, 0x36, 0x7b, 0xb6, 0xcc, 0xf3, 0x97, 0x3e, 0xce, 0x7e, 0x16, 0x18, - 0x2e, 0xf6, 0x02, 0x4c, 0x69, 0x3d, 0x9f, 0x3a, 0x05, 0xfe, 0xf8, 0x10, - 0xa4, 0xa7, 0x63, 0xad, 0x4b, 0x3d, 0xa3, 0xaa, 0x69, 0x39, 0xb8, 0x1b, - 0xf3, 0x84, 0x0b, 0xd1, 0xba, 0xa0, 0x24, 0x6c, 0x68, 0x10, 0x49, 0x35, - 0xcd, 0x10, 0x56, 0xca, 0x44, 0xbf, 0x62, 0xb1, 0x8b, 0x3e, 0xc9, 0x98, - 0x84, 0xb4, 0xd3, 0x36, 0x5f, 0x46, 0x4b, 0x23, 0x0b, 0x62, 0x17, 0x6d, - 0x7b, 0x55, 0x81, 0x23, 0xb1, 0x69, 0x8a, 0x3c, 0x6d, 0xde, 0x66, 0xcc, - 0xb1, 0x81, 0xe8, 0xd1, 0x2d, 0x2e, 0x29, 0xbe, 0x1a, 0xef, 0x77, 0xb2, - 0x98, 0xc3, 0x7e, 0x67, 0x4f, 0xdb, 0x43, 0x05, 0x71, 0xef, 0xf8, 0x59, - 0x00, 0xc9, 0x34, 0x49, 0x83, 0x61, 0x89, 0x94, 0x11, 0x10, 0xff, 0xf8, - 0x75, 0x5f, 0x16, 0x4b, 0x3b, 0x65, 0xa2, 0xa1, 0x11, 0x09, 0x50, 0xfc, - 0x1b, 0x62, 0x1f, 0x73, 0x6e, 0x00, 0x58, 0x2f, 0x27, 0x17, 0xf6, 0x23, - 0x4b, 0x03, 0xc2, 0x58, 0x6e, 0x5c, 0xed, 0xcb, 0x9e, 0xdc, 0x06, 0x44, - 0xfa, 0x5f, 0xaa, 0xe7, 0x88, 0x9b, 0x83, 0x27, 0x91, 0x6b, 0x7e, 0xb5, - 0x55, 0x73, 0xbe, 0x54, 0x70, 0xa2, 0x2f, 0x9d, 0x73, 0x5d, 0xbd, 0x68, - 0xbf, 0x6f, 0x56, 0xf1, 0x52, 0x92, 0x9f, 0x76, 0x56, 0xa1, 0x15, 0xdb, - 0x35, 0xa4, 0xd1, 0x04, 0xe1, 0x3e, 0x8d, 0xe9, 0xb9, 0x3a, 0x42, 0xda, - 0xbb, 0x6a, 0xab, 0x1e, 0x1c, 0xb6, 0xca, 0xc5, 0xd4, 0x60, 0x8d, 0xfa, - 0x93, 0x20, 0xac, 0xc8, 0xe2, 0x02, 0xc2, 0xbe, 0xa2, 0xa8, 0x8b, 0x40, - 0x97, 0x0d, 0xdd, 0xa8, 0x77, 0x29, 0xe5, 0x45, 0x0c, 0xe2, 0x10, 0x3a, - 0x15, 0xa5, 0xe4, 0x40, 0xfc, 0x69, 0x52, 0xc1, 0xe5, 0x91, 0x28, 0xcf, - 0x0d, 0x6e, 0xed, 0x91, 0x59, 0x8d, 0xbd, 0x28, 0x32, 0xba, 0xc0, 0x4e, - 0x11, 0xf1, 0xb4, 0x59, 0x98, 0x31, 0x88, 0xf2, 0x52, 0xd3, 0x55, 0x93, - 0x58, 0xfb, 0x1b, 0x3c, 0x6c, 0x96, 0x11, 0x9c, 0x3d, 0x0e, 0x0a, 0x81, - 0xb7, 0xb5, 0x2e, 0x9b, 0x1b, 0xaf, 0x08, 0xb4, 0xbc, 0x00, 0xb1, 0x87, - 0x03, 0x4a, 0xaf, 0x02, 0x30, 0x42, 0x45, 0xce, 0x99, 0x25, 0x32, 0x2f, - 0xf6, 0xd4, 0xca, 0x80, 0x08, 0x60, 0x38, 0x47, 0xae, 0x6e, 0x68, 0xd7, - 0x96, 0x7c, 0x5a, 0xce, 0x75, 0x3c, 0xff, 0xa1, 0x9a, 0x13, 0x11, 0x73, - 0xea, 0x9e, 0x61, 0x1c, 0x6a, 0x74, 0x8d, 0x77, 0x21, 0x5f, 0x4a, 0x86, - 0x87, 0x34, 0x79, 0x1e, 0x36, 0xe3, 0x38, 0x80, 0xbb, 0x19, 0x60, 0x0c, - 0x8e, 0xbf, 0x19, 0xa7, 0x93, 0x66, 0x7d, 0x95, 0x8b, 0xcc, 0x3d, 0x93, - 0xbb, 0x7b, 0x86, 0x62, 0xe2, 0x91, 0xd6, 0x0f, 0x3d, 0x29, 0xa6, 0xa9, - 0x84, 0x29, 0x1a, 0x7c, 0xa2, 0xc0, 0xc1, 0xb1, 0x0b, 0xc4, 0x60, 0xc6, - 0x04, 0xc5, 0x91, 0xbd, 0xad, 0x8f, 0xda, 0xb5, 0xc8, 0xe7, 0x53, 0xc3, - 0x81, 0x30, 0x6e, 0x6f, 0x06, 0x22, 0x24, 0x80, 0x66, 0x47, 0x71, 0x79, - 0x2f, 0xfd, 0xaf, 0xea, 0x99, 0x62, 0x9a, 0x29, 0xc8, 0x9b, 0xdf, 0x29, - 0x51, 0x10, 0xaa, 0x24, 0xe9, 0x08, 0x80, 0xfb, 0x2f, 0x62, 0xb6, 0xd9, - 0x01, 0xe5, 0x25, 0x04, 0x7a, 0x34, 0xc4, 0xa7, 0xef, 0xc1, 0xf4, 0xf0, - 0x53, 0x71, 0x26, 0x0c, 0xe4, 0x4d, 0xe6, 0x46, 0xf6, 0xf2, 0xa5, 0x55, - 0xe8, 0x21, 0x1c, 0xe0, 0xad, 0xde, 0xe7, 0x51, 0xdc, 0x60, 0x44, 0x73, - 0x07, 0x5c, 0x7b, 0x0a, 0x5a, 0x83, 0x6e, 0x99, 0x7e, 0x64, 0x5d, 0x7f, - 0x06, 0x73, 0x52, 0x91, 0xdf, 0xc1, 0xad, 0xf6, 0x78, 0x40, 0x60, 0x7f, - 0x0b, 0x74, 0x99, 0x84, 0x75, 0x78, 0xf0, 0xfc, 0x41, 0x92, 0xb8, 0x8b, - 0x1b, 0x1f, 0xcf, 0x1b, 0x37, 0x6b, 0x6c, 0x7f, 0x28, 0xc4, 0x67, 0xbc, - 0x19, 0xe7, 0x9c, 0x3b, 0xe6, 0x6d, 0x5e, 0x0b, 0x63, 0xc4, 0xc7, 0x23, - 0xc6, 0xf0, 0xee, 0x74, 0x12, 0x3b, 0xf7, 0xad, 0xad, 0x73, 0x68, 0x23, - 0x40, 0xa7, 0x8f, 0x30, 0x5a, 0x69, 0xab, 0x81, 0x17, 0x9c, 0x20, 0x5f, - 0x7c, 0x81, 0x41, 0x03, 0x85, 0x5e, 0xfc, 0x55, 0x0d, 0x97, 0x7c, 0x03, - 0xa5, 0xf8, 0xc7, 0x2c, 0x3b, 0x30, 0xe7, 0xdc, 0x3f, 0x73, 0x22, 0x97, - 0xb4, 0xcd, 0xf4, 0x11, 0x58, 0xfd, 0x2e, 0xf9, 0xc1, 0x57, 0x3b, 0x12, - 0x21, 0xdb, 0x06, 0x69, 0x98, 0xfa, 0x9d, 0x7e, 0xfc, 0x79, 0xb2, 0x93, - 0xcb, 0xd6, 0x10, 0x54, 0x5b, 0x17, 0xc4, 0x25, 0xdb, 0x8b, 0x36, 0xc8, - 0xe9, 0x00, 0x16, 0x93, 0x1d, 0x73, 0xb7, 0x23, 0xfa, 0xb3, 0xca, 0x84, - 0xe3, 0x9b, 0x82, 0x62, 0x0a, 0xc8, 0x49, 0x79, 0xac, 0x03, 0xd9, 0x80, - 0x3a, 0xfe, 0xf4, 0xa9, 0x37, 0xf3, 0x21, 0x3d, 0x1a, 0x4c, 0xff, 0x6a, - 0x13, 0x41, 0x33, 0x5c, 0xc0, 0xd6, 0x6d, 0x29, 0x40, 0x4a, 0xf6, 0xbb, - 0xd8, 0x7e, 0x8b, 0x7f, 0xeb, 0x87, 0x7c, 0x5f, 0x6e, 0xf0, 0xbe, 0xc3, - 0xea, 0x22, 0x3f, 0xc0, 0x62, 0x1b, 0x22, 0x84, 0x2c, 0x96, 0x0c, 0x57, - 0x96, 0xc6, 0x5a, 0x12, 0x81, 0x27, 0x97, 0x8f, 0x9e, 0xb2, 0x6b, 0xb4, - 0xc6, 0x90, 0x47, 0x3a, 0xb8, 0xf5, 0x31, 0x13, 0x86, 0xd3, 0x05, 0xf4, - 0xda, 0xf7, 0x74, 0x5c, 0x1a, 0x79, 0x8a, 0x3e, 0xfb, 0x7d, 0x67, 0xc1, - 0xb7, 0x38, 0xa2, 0x05, 0x01, 0x00, 0x46, 0xd5, 0xa1, 0xdd, 0x85, 0x39, - 0xfd, 0xf9, 0xdc, 0xb1, 0x88, 0x0c, 0x49, 0xef, 0xf8, 0x3f, 0x66, 0xac, - 0x43, 0x7d, 0x31, 0x8e, 0xa6, 0x19, 0xe3, 0x09, 0x27, 0x37, 0xe9, 0x84, - 0xa1, 0x4d, 0xab, 0xdd, 0xb5, 0xfb, 0x45, 0xf4, 0x98, 0x4d, 0x1e, 0x72, - 0x3c, 0x82, 0x20, 0x78, 0x67, 0x6c, 0x07, 0x49, 0x38, 0x39, 0x75, 0x15, - 0xe4, 0x14, 0x7e, 0x86, 0xe0, 0x0b, 0x72, 0x8d, 0xa8, 0x13, 0x00, 0x22, - 0x17, 0xe2, 0xe5, 0x34, 0x70, 0x77, 0xcd, 0xe7, 0x05, 0x43, 0x7f, 0xa9, - 0x65, 0x41, 0x5d, 0x83, 0xe6, 0x88, 0xbf, 0x80, 0xe5, 0x1f, 0xb3, 0x31, - 0x50, 0x1a, 0xcc, 0xef, 0x55, 0x93, 0x73, 0x58, 0x62, 0xea, 0xf4, 0x39, - 0xa7, 0xb7, 0x99, 0x26, 0x1f, 0xb7, 0x26, 0xc0, 0x95, 0xdb, 0xbe, 0x9c, - 0x2a, 0xd9, 0x1d, 0x8f, 0x97, 0x62, 0xcf, 0x81, 0xa4, 0x1b, 0xa9, 0x77, - 0x1f, 0xf5, 0x48, 0xe4, 0xe3, 0x14, 0x06, 0x7b, 0x6c, 0x74, 0x7d, 0xdb, - 0x3c, 0xd2, 0x6e, 0xe4, 0xf6, 0x5c, 0xb7, 0x2d, 0xa1, 0xf5, 0x21, 0x95, - 0x01, 0x2d, 0x36, 0x3f, 0x89, 0xa8, 0xe3, 0x8c, 0x08, 0xa5, 0x60, 0x42, - 0xf2, 0xc7, 0x69, 0xdd, 0x44, 0x63, 0xe4, 0x23, 0x14, 0xba, 0xc5, 0xbd, - 0x85, 0x1a, 0x83, 0xab, 0x81, 0xa0, 0x49, 0x35, 0x01, 0x2b, 0xd9, 0xd2, - 0xae, 0xfd, 0x9f, 0xd2, 0x6b, 0xb1, 0xb7, 0x27, 0x1b, 0x86, 0xd3, 0x78, - 0x34, 0x14, 0x24, 0x23, 0x17, 0xca, 0x30, 0xb4, 0xfe, 0x27, 0x1e, 0x44, - 0x40, 0x42, 0x1e, 0x95, 0x45, 0x34, 0x82, 0x07, 0xc9, 0x38, 0x0c, 0xac, - 0xd4, 0xee, 0x38, 0xe1, 0x7f, 0xe6, 0xde, 0x21, 0x7f, 0x40, 0x1a, 0x8e, - 0xdd, 0xe4, 0x62, 0x99, 0x08, 0xc7, 0xba, 0xc5, 0xf0, 0x09, 0xe9, 0x9c, - 0x12, 0x42, 0x1c, 0xd8, 0xc2, 0x7e, 0x7f, 0xc9, 0x9f, 0x56, 0xed, 0x29, - 0x30, 0x3c, 0x2b, 0x68, 0x3c, 0x16, 0xd6, 0x7c, 0xac, 0x3f, 0x2a, 0x10, - 0xbd, 0xd7, 0x72, 0x07, 0x4c, 0x97, 0x06, 0x7d, 0xcc, 0xf5, 0x44, 0xa8, - 0xd5, 0xfa, 0x1c, 0xb6, 0x31, 0x01, 0xcc, 0xb8, 0xaf, 0x4a, 0x9a, 0xd8, - 0xa7, 0xc1, 0x60, 0xad, 0xa9, 0x8d, 0xf3, 0x8f, 0x09, 0xb8, 0x9f, 0xdf, - 0x6b, 0x4f, 0xae, 0x09, 0x99, 0xed, 0x4a, 0x33, 0xfd, 0x51, 0xd0, 0x50, - 0x62, 0x79, 0x6d, 0x4f, 0x6a, 0xef, 0x57, 0xc8, 0x86, 0x8e, 0x75, 0x78, - 0xd5, 0xd4, 0xc1, 0x7d, 0x7c, 0xde, 0xa7, 0x43, 0xf9, 0xec, 0x5f, 0x33, - 0xf6, 0x97, 0x93, 0x58, 0xe6, 0x2f, 0x87, 0x6e, 0x80, 0x86, 0xff, 0x21, - 0x40, 0xb6, 0x4c, 0xe0, 0x9b, 0xee, 0x6a, 0xa6, 0x80, 0x65, 0xf3, 0xba, - 0xfa, 0x8b, 0xe7, 0x12, 0xc4, 0xfe, 0x23, 0x15, 0xb8, 0xac, 0x77, 0x18, - 0xa2, 0xfc, 0xb5, 0x0c, 0x7f, 0x73, 0x8a, 0x43, 0x52, 0x13, 0xc4, 0xf8, - 0xec, 0x27, 0xf5, 0x95, 0x7f, 0x0d, 0x61, 0x96, 0x1b, 0xe4, 0x80, 0xd8, - 0x38, 0x60, 0xec, 0x47, 0xc6, 0x1c, 0x01, 0x11, 0x73, 0x7f, 0x55, 0x36, - 0x83, 0x84, 0xce, 0x1b, 0x9a, 0xf8, 0xd2, 0x57, 0x65, 0xf4, 0xd4, 0x91, - 0xc0, 0x6c, 0x78, 0xe4, 0x4f, 0xb5, 0x4e, 0x37, 0xf5, 0x36, 0x9d, 0x67, - 0x59, 0x4d, 0xe1, 0x2d, 0x92, 0x5a, 0x76, 0x79, 0x72, 0x0e, 0xf2, 0xdb, - 0x2a, 0xea, 0x0e, 0x2f, 0x1e, 0xde, 0x56, 0xdc, 0xf7, 0xef, 0x51, 0xec, - 0x40, 0x99, 0x7a, 0x34, 0xec, 0x68, 0x3b, 0x86, 0xe4, 0xc9, 0x7b, 0xa9, - 0x4a, 0xe2, 0x23, 0x31, 0x75, 0x5c, 0xc1, 0x04, 0xcd, 0xe5, 0x97, 0xa1, - 0xbc, 0xa1, 0xc6, 0x61, 0x8f, 0xfe, 0x76, 0xfa, 0xca, 0x30, 0x3c, 0xa2, - 0x82, 0x3d, 0xfb, 0xec, 0x46, 0x43, 0x12, 0x53, 0x5e, 0x53, 0xce, 0x1c, - 0x9d, 0x3c, 0x7f, 0x14, 0xf7, 0x4f, 0xe9, 0xe7, 0xa4, 0x86, 0x46, 0x3a, - 0xf8, 0x1e, 0x94, 0xd9, 0x8c, 0x04, 0x0a, 0x7f, 0xc9, 0xf9, 0x82, 0x1d, - 0x9b, 0x07, 0x87, 0xc7, 0x82, 0xe9, 0x0a, 0x01, 0x98, 0xa7, 0x21, 0x65, - 0x03, 0x9d, 0xb9, 0xd2, 0xb4, 0xbb, 0x6e, 0x54, 0x16, 0x1e, 0x14, 0xdb, - 0xd2, 0x2b, 0x3b, 0xc2, 0x2e, 0xa6, 0xa4, 0x3e, 0xae, 0x72, 0x95, 0x71, - 0xaf, 0x63, 0x6f, 0xa2, 0x44, 0xbf, 0x01, 0x18, 0x53, 0x5f, 0x5a, 0x9a, - 0x04, 0x96, 0x64, 0x6b, 0x51, 0x16, 0xda, 0x04, 0x7b, 0x07, 0xd6, 0xc6, - 0xf6, 0x83, 0x6a, 0x52, 0x3a, 0x69, 0x7a, 0x23, 0x5f, 0x34, 0x6c, 0xe3, - 0xda, 0x93, 0xef, 0x8c, 0x55, 0x52, 0xb0, 0x58, 0x4e, 0xe5, 0x2b, 0x54, - 0x77, 0x83, 0xf9, 0x36, 0xf2, 0x6c, 0x6d, 0x69, 0x40, 0xb3, 0x43, 0x71, - 0x54, 0x2e, 0x5a, 0x52, 0x3f, 0x39, 0x06, 0x10, 0xde, 0x90, 0xd6, 0xba, - 0xfc, 0x1b, 0xa6, 0x1b, 0x51, 0xca, 0x89, 0x07, 0x73, 0x4c, 0xb4, 0x33, - 0x66, 0x9c, 0xbd, 0x60, 0x15, 0x9f, 0x0c, 0x49, 0xfc, 0xf3, 0xaf, 0x88, - 0xd6, 0x8a, 0xe1, 0xbb, 0x38, 0xb8, 0x51, 0x22, 0x2d, 0x3c, 0x6c, 0x36, - 0x45, 0xb2, 0x95, 0x13, 0x9c, 0x34, 0xcf, 0xcd, 0x34, 0x11, 0xe4, 0xc2, - 0x56, 0x8a, 0x89, 0x57, 0xf3, 0xd2, 0x21, 0x77, 0x3f, 0x33, 0x38, 0x26, - 0x07, 0x4d, 0x0d, 0xe7, 0x60, 0x87, 0x3f, 0xf2, 0x16, 0x4e, 0xd9, 0x3c, - 0x8c, 0xe0, 0x11, 0xb9, 0xaa, 0x9b, 0x31, 0xc2, 0x37, 0xe2, 0x30, 0x76, - 0x35, 0xf2, 0x24, 0x14, 0xe5, 0xa9, 0x89, 0xdc, 0xf1, 0x4f, 0x8a, 0xb4, - 0xab, 0x48, 0x50, 0xa7, 0xd5, 0x7b, 0x20, 0x6f, 0xab, 0xa2, 0xd9, 0x20, - 0x69, 0x21, 0xab, 0x12, 0xa1, 0x49, 0xc5, 0xbc, 0x59, 0x30, 0x3e, 0x2e, - 0x89, 0x7b, 0xa9, 0x2c, 0x15, 0x4b, 0xbf, 0x60, 0x8c, 0x61, 0x4b, 0x92, - 0x07, 0x26, 0xe9, 0xa7, 0x47, 0x77, 0xd2, 0x2e, 0x70, 0x7e, 0x07, 0x08, - 0x0b, 0x5c, 0x79, 0x63, 0x87, 0x5c, 0xdf, 0x02, 0xc2, 0xa4, 0xbe, 0x3b, - 0x27, 0x46, 0x2d, 0xec, 0xad, 0x2f, 0x5f, 0x13, 0x04, 0xd4, 0xdf, 0x71, - 0x75, 0x1f, 0xd9, 0xb6, 0x26, 0x43, 0xbc, 0x6c, 0x39, 0xb0, 0xaa, 0x56, - 0x39, 0x6a, 0xe1, 0x20, 0xb4, 0x0e, 0x3a, 0xfc, 0x5b, 0x8e, 0xff, 0xd3, - 0x0c, 0xb4, 0xb5, 0x62, 0xcc, 0xd4, 0xd4, 0xd3, 0xe3, 0x90, 0xa2, 0x90, - 0x19, 0x43, 0xb0, 0xba, 0x5d, 0xf2, 0x29, 0x5d, 0x46, 0x0c, 0x29, 0xed, - 0xad, 0xad, 0xac, 0xcd, 0xcf, 0xeb, 0xa3, 0x3c, 0x2d, 0x32, 0x65, 0xe2, - 0x9e, 0x02, 0x51, 0x44, 0x75, 0xc6, 0x0e, 0x79, 0x65, 0x54, 0xc2, 0x93, - 0xf0, 0x68, 0x0b, 0xee, 0x20, 0xd0, 0x21, 0xda, 0xb4, 0xd0, 0xef, 0xfe, - 0xd3, 0x59, 0xf6, 0x1b, 0x70, 0xe4, 0x3f, 0xba, 0x72, 0x15, 0xd4, 0xa4, - 0x02, 0x3d, 0xff, 0x45, 0x48, 0x2f, 0x44, 0xa7, 0x6b, 0x0a, 0x02, 0xaf, - 0xf1, 0x72, 0x11, 0x54, 0xe9, 0xa0, 0xf7, 0x9b, 0xe4, 0x41, 0x64, 0x6d, - 0x26, 0x62, 0x45, 0xb8, 0x70, 0x04, 0x15, 0xb8, 0x41, 0x62, 0x20, 0x9e, - 0x22, 0xfe, 0x66, 0x25, 0x84, 0xed, 0xf8, 0xaf, 0xdd, 0xbb, 0xc4, 0x8a, - 0x24, 0x2a, 0x1e, 0xf4, 0xcb, 0x79, 0x2c, 0xcc, 0x21, 0x6a, 0x7b, 0xfb, - 0xe5, 0x62, 0xbb, 0x0d, 0xc8, 0xf3, 0x74, 0x27, 0xd7, 0x52, 0x4e, 0xd4, - 0x65, 0xad, 0xc9, 0x25, 0x49, 0xb2, 0x5a, 0x39, 0xcc, 0x67, 0xad, 0x8d, - 0x8a, 0xed, 0x0b, 0x2b, 0x0f, 0xf1, 0xb7, 0x38, 0xe8, 0x02, 0xf0, 0x14, - 0xa4, 0xc6, 0x15, 0x81, 0xc1, 0x5c, 0x7d, 0x81, 0x38, 0x47, 0x35, 0xd2, - 0x06, 0xc5, 0x50, 0xe5, 0x6a, 0xdf, 0x98, 0x98, 0x2b, 0xdf, 0x1e, 0x35, - 0x77, 0x22, 0x99, 0x21, 0x8f, 0x6c, 0x89, 0x68, 0xd5, 0x53, 0xa0, 0x50, - 0x06, 0x7a, 0x65, 0x4c, 0x3f, 0x77, 0xe4, 0xda, 0x8d, 0x7a, 0x0a, 0x07, - 0x87, 0xd0, 0x55, 0xc5, 0x7e, 0xf8, 0x97, 0xbf, 0x08, 0xd2, 0xf5, 0x87, - 0xf3, 0xf1, 0x00, 0x01, 0xad, 0xce, 0x4d, 0xb8, 0xc5, 0x1c, 0x81, 0x43, - 0x6d, 0xac, 0xa7, 0x9f, 0x31, 0x80, 0x60, 0xcd, 0x0b, 0xa6, 0x79, 0xfd, - 0x39, 0x93, 0x28, 0x44, 0x08, 0x2f, 0x0b, 0xd0, 0xf1, 0x18, 0x5e, 0xe7, - 0x85, 0x65, 0x6e, 0x6f, 0x89, 0xc0, 0x88, 0x3e, 0x16, 0x2e, 0xbb, 0x3a, - 0xb4, 0xc9, 0x13, 0xc2, 0x2b, 0xff, 0xb8, 0xa9, 0x7b, 0x90, 0x97, 0x44, - 0xba, 0x5b, 0x71, 0x07, 0xd0, 0x71, 0x4c, 0x90, 0x8f, 0x6f, 0x7a, 0x72, - 0xb4, 0xd8, 0xbd, 0x24, 0x80, 0x22, 0xd1, 0xb1, 0xa9, 0x9d, 0x65, 0xc7, - 0xa8, 0x1c, 0x19, 0xa5, 0x67, 0xe7, 0x99, 0x25, 0x4d, 0xa8, 0x39, 0xbc, - 0x34, 0x4b, 0xab, 0xa8, 0x2a, 0x76, 0xf4, 0xdd, 0x3a, 0xaf, 0xae, 0xd4, - 0x49, 0xe2, 0x78, 0xc8, 0xf1, 0xe8, 0xf3, 0xfc, 0x31, 0x5d, 0xdb, 0xf7, - 0x5c, 0xb6, 0xdb, 0x0c, 0xf2, 0x06, 0x06, 0xd3, 0xff, 0x84, 0x26, 0xfe, - 0x59, 0x33, 0xbf, 0x63, 0xb2, 0x53, 0xb7, 0x11, 0xb5, 0xf3, 0xe3, 0x2d, - 0x8e, 0xab, 0x6a, 0xd9, 0x3d, 0xf5, 0x23, 0xa0, 0x62, 0x2d, 0x51, 0xc1, - 0x79, 0xd8, 0xe7, 0x6a, 0xbe, 0x7a, 0x9a, 0xe6, 0x09, 0xe6, 0x8e, 0xa3, - 0x2b, 0xff, 0x8c, 0x8b, 0x79, 0x38, 0xb7, 0x5a, 0x64, 0x35, 0xd7, 0x70, - 0x29, 0xb7, 0xd5, 0x37, 0x22, 0x78, 0xbf, 0x8b, 0xc2, 0xc4, 0x36, 0x54, - 0x01, 0xc1, 0xc4, 0x13, 0x9a, 0x7d, 0x26, 0x2c, 0xae, 0x06, 0x6c, 0x3b, - 0xd7, 0xb8, 0x10, 0xb2, 0x98, 0x70, 0x1f, 0x14, 0x46, 0xff, 0xce, 0x48, - 0x58, 0x3b, 0x19, 0x1c, 0xd4, 0x60, 0x10, 0x33, 0xc9, 0xaa, 0x38, 0x9a, - 0x12, 0xda, 0x67, 0xf5, 0x29, 0x7e, 0xef, 0xaf, 0xa8, 0x55, 0x19, 0x98, - 0x73, 0xed, 0x2f, 0xb1, 0xb8, 0xad, 0x82, 0x69, 0xab, 0xc6, 0x3c, 0x36, - 0x56, 0x6e, 0x04, 0x5c, 0xe8, 0xc1, 0x78, 0x78, 0x36, 0x74, 0x80, 0xff, - 0x23, 0x57, 0xce, 0xf9, 0xbf, 0x3b, 0xe0, 0x3e, 0xba, 0x90, 0x63, 0xd3, - 0xb2, 0x81, 0x2f, 0x01, 0x1b, 0x04, 0x49, 0xe1, 0x7e, 0xee, 0xae, 0x38, - 0x44, 0x00, 0xa0, 0x27, 0x04, 0xc9, 0xcf, 0x41, 0x21, 0x39, 0xb0, 0x6c, - 0xa4, 0xbc, 0xf1, 0x2d, 0xcb, 0xaa, 0x79, 0xf9, 0xc6, 0xd1, 0xd1, 0x07, - 0xba, 0xa7, 0x4a, 0xab, 0xa8, 0x8b, 0x30, 0xfc, 0x14, 0x4b, 0x02, 0x99, - 0xac, 0x74, 0x1e, 0x5d, 0xd2, 0xcd, 0x17, 0x38, 0x33, 0x1a, 0x5f, 0x96, - 0x3a, 0x08, 0x17, 0x04, 0x04, 0xef, 0xfb, 0x11, 0x85, 0x8c, 0x59, 0x77, - 0xa5, 0x9d, 0x66, 0x57, 0xf8, 0xb0, 0xce, 0xc4, 0x32, 0xfb, 0x34, 0xa4, - 0xaf, 0xbb, 0xd7, 0x76, 0xf0, 0xf3, 0xb7, 0x86, 0xea, 0x06, 0x45, 0xfb, - 0xdd, 0x80, 0xc8, 0x40, 0xbe, 0x38, 0x59, 0x67, 0x03, 0x9e, 0x3f, 0x62, - 0x42, 0x79, 0xc9, 0x98, 0x0c, 0x18, 0xfc, 0x9e, 0xa0, 0xe9, 0xba, 0xeb, - 0x4a, 0x80, 0xf3, 0x99, 0x4d, 0x3c, 0x56, 0xee, 0x81, 0x04, 0x02, 0x29, - 0x63, 0xfb, 0x2a, 0x50, 0x84, 0xf3, 0x90, 0xcc, 0x67, 0x15, 0x3f, 0x1d, - 0x16, 0xae, 0x77, 0xd1, 0xf8, 0x67, 0x51, 0x13, 0x35, 0x64, 0xf2, 0x46, - 0xc1, 0x5e, 0x5c, 0xdd, 0x1d, 0x19, 0xd2, 0xb4, 0x76, 0x19, 0xf5, 0xa3, - 0xd4, 0xa9, 0x13, 0x5b, 0xf1, 0x91, 0x7e, 0x7e, 0x77, 0xac, 0x31, 0x16, - 0x0f, 0xf6, 0xff, 0x08, 0xb6, 0xb1, 0x12, 0xf1, 0x24, 0xf6, 0x8d, 0xbd, - 0xa0, 0xf0, 0xd1, 0x58, 0x38, 0x5d, 0x9c, 0xc4, 0x39, 0xa9, 0x78, 0xe7, - 0x27, 0x2a, 0x42, 0xc0, 0xf2, 0xa5, 0x49, 0xc3, 0x29, 0x0f, 0x97, 0x1a, - 0xf9, 0x4b, 0xc9, 0x34, 0xf6, 0x4b, 0xf8, 0x43, 0x2d, 0xdb, 0x47, 0x77, - 0xb0, 0x4c, 0x25, 0xb9, 0x3c, 0x27, 0x1b, 0xf6, 0x88, 0x0b, 0x51, 0xe8, - 0x91, 0x52, 0x91, 0xde, 0xe5, 0x04, 0x75, 0x21, 0xad, 0x50, 0x08, 0x5b, - 0xab, 0x76, 0xd7, 0xd1, 0x07, 0xb7, 0xc2, 0x0d, 0x29, 0x70, 0x46, 0x3f, - 0x00, 0xda, 0x75, 0x01, 0x97, 0x80, 0xe2, 0xc9, 0x38, 0x62, 0xe6, 0xbc, - 0xfc, 0x2f, 0xcc, 0xf0, 0xb7, 0xc9, 0xe1, 0x8a, 0x40, 0x81, 0x23, 0x62, - 0xfa, 0xe0, 0xa4, 0x5e, 0x84, 0x0c, 0x3b, 0x5b, 0x99, 0x4f, 0xc3, 0x5f, - 0x25, 0xf3, 0x7b, 0x82, 0x21, 0x43, 0x8d, 0x06, 0xff, 0x7d, 0x9b, 0x28, - 0x7b, 0xb7, 0x83, 0xf8, 0xf9, 0xed, 0x2e, 0xd5, 0x8c, 0x80, 0x56, 0x2c, - 0x1f, 0x82, 0x22, 0x4c, 0x6d, 0xbd, 0xf8, 0xb9, 0x78, 0x2d, 0xf6, 0x30, - 0xaf, 0x35, 0x26, 0xc9, 0xcd, 0x55, 0xb5, 0xba, 0x1d, 0x04, 0xcb, 0x6a, - 0x2b, 0xb3, 0x93, 0x2d, 0xbd, 0xdd, 0x02, 0x74, 0x52, 0x67, 0xfa, 0xcf, - 0xae, 0x04, 0x84, 0x56, 0xad, 0x97, 0xfd, 0xfc, 0xbf, 0x06, 0xff, 0xbb, - 0xe0, 0xd2, 0x37, 0xf3, 0xd3, 0x72, 0xcb, 0xfd, 0x4d, 0xf0, 0x33, 0x2b, - 0xbf, 0x2a, 0x1d, 0x7e, 0xa6, 0x43, 0x21, 0xea, 0x1a, 0xa9, 0xfc, 0xab, - 0x72, 0x02, 0x93, 0xc0, 0x72, 0x3d, 0x29, 0x3a, 0xe3, 0xef, 0x86, 0x81, - 0xd8, 0x67, 0xa7, 0xef, 0x4d, 0x08, 0x72, 0x62, 0x74, 0x26, 0xad, 0x40, - 0xa2, 0x0b, 0x29, 0x20, 0x60, 0x3a, 0xfc, 0x8e, 0xb5, 0x6f, 0x6b, 0x1c, - 0x9d, 0x0f, 0xf6, 0xa1, 0xec, 0x2a, 0xde, 0x92, 0x70, 0x87, 0x6c, 0x67, - 0x10, 0x44, 0x18, 0x2c, 0x3e, 0x59, 0x54, 0x63, 0xc9, 0xb1, 0x24, 0x68, - 0x2c, 0xb2, 0x1f, 0x46, 0x53, 0x34, 0xa6, 0x7a, 0xb1, 0x75, 0x40, 0x28, - 0xeb, 0x4d, 0xc8, 0x8b, 0x21, 0xee, 0xc6, 0x1c, 0x8a, 0x07, 0xcf, 0x52, - 0xa0, 0xa9, 0x75, 0x66, 0x63, 0x8a, 0x04, 0x6b, 0x48, 0x01, 0x48, 0xf6, - 0xa2, 0x44, 0x57, 0x57, 0xb0, 0xe8, 0xe3, 0x0b, 0xdf, 0x87, 0x89, 0xea, - 0xf3, 0xf7, 0x9e, 0x4f, 0xbc, 0xa7, 0x5b, 0x0e, 0x3e, 0xee, 0xad, 0x3a, - 0x32, 0x4e, 0x61, 0x37, 0xad, 0x03, 0xc2, 0x38, 0xf0, 0xd3, 0x70, 0x55, - 0x1e, 0xc5, 0x25, 0x7e, 0xe7, 0x94, 0x36, 0x34, 0xb2, 0x56, 0x59, 0x9a, - 0x07, 0x87, 0xeb, 0x9c, 0xd0, 0x72, 0x4a, 0xf2, 0x3c, 0xdd, 0xa2, 0x38, - 0x53, 0xaa, 0xaf, 0xd5, 0xfa, 0xf7, 0xc8, 0x9d, 0x36, 0x9a, 0x2b, 0x52, - 0x53, 0x3d, 0x0c, 0xa7, 0xdd, 0x5f, 0x9c, 0xa2, 0x19, 0x28, 0x0e, 0x11, - 0xb7, 0x57, 0xf9, 0xbc, 0xcd, 0x3e, 0x35, 0x0b, 0xff, 0xb3, 0xf1, 0x51, - 0x62, 0x96, 0x5f, 0xa9, 0x69, 0xca, 0x53, 0x9b, 0x50, 0x7a, 0x6e, 0xeb, - 0x76, 0x26, 0xe6, 0x12, 0xbd, 0xe3, 0xfa, 0xd2, 0x70, 0xb2, 0x5c, 0x8a, - 0xbc, 0x6a, 0x65, 0xdf, 0xd7, 0x64, 0x24, 0x95, 0xeb, 0x4e, 0xdc, 0x7e, - 0xe1, 0x6e, 0xc9, 0xeb, 0x7f, 0x09, 0x17, 0xb2, 0x54, 0xef, 0x35, 0x22, - 0xb4, 0x3e, 0x3a, 0xa1, 0xcd, 0xfe, 0xc2, 0x9e, 0xf7, 0x44, 0xdd, 0x7d, - 0x1c, 0xe7, 0x50, 0x91, 0x8d, 0x96, 0xe6, 0xed, 0x34, 0xb2, 0x60, 0xcc, - 0x8e, 0xcd, 0x07, 0x8d, 0xc3, 0x00, 0x77, 0xc4, 0xa8, 0x9a, 0xf7, 0x88, - 0x47, 0x90, 0x34, 0x95, 0x33, 0x07, 0x9f, 0xb6, 0x08, 0xc6, 0x25, 0x4c, - 0xc4, 0x0e, 0xb1, 0x6c, 0x75, 0x92, 0x2a, 0x78, 0x1e, 0x20, 0x39, 0x51, - 0xb7, 0x77, 0x18, 0x56, 0x16, 0xfc, 0x14, 0x8c, 0x0d, 0x70, 0xe9, 0x8c, - 0xc8, 0x78, 0x2d, 0x1a, 0x71, 0x29, 0xed, 0xa0, 0x60, 0xb6, 0xcd, 0xbf, - 0x79, 0xbd, 0xcd, 0xd7, 0xdc, 0x8e, 0xf6, 0x95, 0x66, 0xf7, 0x6e, 0xd4, - 0x52, 0xad, 0xcc, 0x03, 0x9d, 0x2b, 0x90, 0x84, 0x2e, 0x71, 0xae, 0x36, - 0x58, 0x1a, 0xe1, 0xe4, 0xe2, 0x3b, 0x57, 0xbb, 0x12, 0x1a, 0x57, 0x6f, - 0xeb, 0x20, 0xf5, 0x38, 0xc4, 0xd1, 0x97, 0xcd, 0x43, 0xd4, 0x29, 0xcb, - 0xca, 0x2e, 0x23, 0x0b, 0xb5, 0xfc, 0xc2, 0xc1, 0x17, 0xed, 0x1e, 0x98, - 0x29, 0xa4, 0x71, 0x6e, 0x33, 0x21, 0x86, 0xb9, 0xcc, 0x54, 0x71, 0x5b, - 0xa2, 0x8f, 0xd1, 0x0e, 0x79, 0x7c, 0xb6, 0x2e, 0xf9, 0x55, 0xac, 0xb1, - 0xbe, 0x88, 0x0d, 0x31, 0x5d, 0xae, 0x4a, 0x24, 0x5c, 0x4b, 0xc7, 0x4b, - 0x4d, 0x9a, 0x92, 0x4c, 0x8e, 0x3e, 0x72, 0xf9, 0x83, 0xd3, 0x1f, 0x5f, - 0x75, 0xdc, 0xf4, 0xbd, 0x32, 0x99, 0x51, 0xbf, 0xd5, 0x42, 0x12, 0xda, - 0x41, 0xe0, 0x8a, 0x09, 0xd4, 0x14, 0x76, 0x21, 0xf2, 0xb9, 0x21, 0x37, - 0xe5, 0xc1, 0x27, 0x8b, 0x4d, 0x46, 0xfe, 0xe3, 0x44, 0xf7, 0x28, 0xfc, - 0xbf, 0x8b, 0x1a, 0x54, 0x00, 0x1e, 0xef, 0x5d, 0x78, 0xcf, 0x59, 0x40, - 0xe0, 0x55, 0x56, 0x72, 0x88, 0x26, 0x50, 0xfa, 0xd1, 0x00, 0x5c, 0xd8, - 0xf3, 0x20, 0x4b, 0x5a, 0xac, 0x45, 0x53, 0x64, 0xfc, 0x6e, 0x1c, 0x94, - 0xfc, 0x53, 0x38, 0x9a, 0xc0, 0x48, 0x44, 0xc3, 0xa1, 0xc3, 0x7d, 0x58, - 0xf8, 0x99, 0x02, 0x03, 0xdd, 0xc7, 0xf9, 0x72, 0x11, 0x0a, 0x80, 0x82, - 0xca, 0xf6, 0xc2, 0x09, 0x76, 0xee, 0xa2, 0x8d, 0xdb, 0xe1, 0x04, 0x9d, - 0x08, 0x9f, 0x42, 0xd9, 0x57, 0xf2, 0xbb, 0xc2, 0xa5, 0xd8, 0x4a, 0x9e, - 0x19, 0xdd, 0xeb, 0xce, 0x23, 0x67, 0x0f, 0x69, 0x11, 0xbc, 0xec, 0x03, - 0x38, 0x02, 0xad, 0xaf, 0xc2, 0x65, 0xfb, 0x4f, 0xb1, 0xf1, 0xe7, 0xb0, - 0x8f, 0x9a, 0x6d, 0x05, 0x4c, 0x84, 0xae, 0x79, 0x35, 0xaa, 0x44, 0xfd, - 0x0e, 0xec, 0x6f, 0x55, 0x9a, 0x45, 0x5c, 0xad, 0x26, 0x51, 0xff, 0x50, - 0x74, 0xe3, 0x4c, 0x15, 0x2a, 0x30, 0xf2, 0x1a, 0x03, 0x0c, 0x10, 0xe8, - 0x41, 0x60, 0xfd, 0x71, 0x01, 0xdd, 0xfd, 0xf5, 0xb0, 0x49, 0xd0, 0x38, - 0x3f, 0x7d, 0x66, 0xaa, 0x6f, 0x31, 0x5c, 0x42, 0x9e, 0xb9, 0x0c, 0x00, - 0x4b, 0xf3, 0xb1, 0xd5, 0x87, 0x95, 0x18, 0x8c, 0x64, 0x0e, 0xa1, 0x97, - 0xa1, 0xcd, 0x5d, 0xa6, 0x27, 0x5a, 0xdb, 0x82, 0x06, 0x1f, 0xd6, 0x5d, - 0x0c, 0x13, 0x57, 0xbe, 0x19, 0xb1, 0x1e, 0x17, 0x93, 0xd2, 0x15, 0x7b, - 0x87, 0xbc, 0x5c, 0x77, 0x84, 0xaa, 0x92, 0x44, 0xe1, 0xcc, 0xc6, 0xed, - 0xeb, 0xb7, 0xb4, 0xda, 0xdf, 0x5d, 0x01, 0x36, 0xc8, 0x6c, 0x74, 0x6f, - 0xed, 0x3a, 0xad, 0x76, 0x6c, 0x16, 0x2e, 0x1f, 0xa3, 0xd5, 0xf4, 0xbc, - 0x4c, 0xbc, 0x0c, 0xe0, 0x06, 0x0f, 0x2c, 0xef, 0x4e, 0xf1, 0x64, 0x64, - 0x8d, 0xf3, 0x55, 0x63, 0x90, 0xd7, 0x9a, 0x87, 0xd1, 0x8a, 0x37, 0x99, - 0x0c, 0x90, 0xef, 0x3d, 0x95, 0x0d, 0xc9, 0x4a, 0x79, 0x3c, 0xed, 0x9d, - 0x42, 0x3c, 0x4e, 0xca, 0x14, 0x6a, 0x7e, 0x36, 0xf3, 0x48, 0x97, 0xdb, - 0x71, 0xbb, 0xad, 0x82, 0xdc, 0xfb, 0x23, 0x6f, 0x05, 0xa8, 0x99, 0x22, - 0x71, 0xbe, 0xb1, 0x42, 0xa1, 0xa9, 0xa6, 0x81, 0x52, 0x6f, 0xc7, 0xd7, - 0x68, 0xde, 0xf3, 0x8e, 0x6c, 0x9a, 0xa1, 0x3d, 0x46, 0x70, 0x09, 0xa3, - 0x11, 0x19, 0x40, 0x82, 0xf6, 0x54, 0x68, 0x98, 0x5a, 0xa9, 0x01, 0x49, - 0x15, 0xca, 0xac, 0x28, 0x60, 0x6b, 0xcd, 0x6e, 0x94, 0x26, 0xaf, 0xba, - 0x16, 0xa8, 0xa2, 0x48, 0x07, 0x5c, 0xd5, 0x78, 0x86, 0x50, 0xf2, 0x0f, - 0xe9, 0xbf, 0x88, 0x55, 0x94, 0x21, 0xf7, 0xb7, 0x85, 0xa8, 0x15, 0xe3, - 0xee, 0xbe, 0xcd, 0x58, 0xcd, 0xae, 0x6d, 0x2b, 0xf5, 0x1c, 0x68, 0x21, - 0x86, 0x08, 0x79, 0xd9, 0x4b, 0x3a, 0x12, 0x24, 0xbc, 0xcb, 0xb2, 0x7b, - 0x28, 0x7d, 0x29, 0x88, 0xc3, 0x1f, 0x11, 0x49, 0xee, 0xb5, 0x60, 0x52, - 0x85, 0x2d, 0x8c, 0x50, 0xc3, 0xba, 0x5c, 0x44, 0xa4, 0x62, 0x02, 0x71, - 0x09, 0x8b, 0xa1, 0x79, 0xf2, 0xc8, 0xe7, 0xc0, 0xfc, 0x5b, 0x69, 0x0d, - 0x4b, 0xcc, 0x0a, 0x92, 0x25, 0xa7, 0x76, 0x3a, 0x40, 0x03, 0xae, 0xfc, - 0xf3, 0x07, 0x62, 0x41, 0xf1, 0x54, 0xf8, 0x5b, 0xb8, 0x52, 0x6f, 0xd0, - 0xf0, 0xba, 0x06, 0xb0, 0x7b, 0xd7, 0xe8, 0xf6, 0x8c, 0x6e, 0xb6, 0x22, - 0xc4, 0x50, 0x37, 0x44, 0x7b, 0x98, 0x79, 0xd5, 0xc5, 0x12, 0x50, 0xa2, - 0x1c, 0x8d, 0x7b, 0x7c, 0x73, 0xb9, 0x5d, 0x83, 0x22, 0x62, 0x95, 0x6a, - 0xeb, 0x71, 0xc9, 0x6b, 0x33, 0x24, 0xf1, 0xaf, 0xf5, 0xd8, 0xb5, 0xea, - 0xbf, 0x87, 0xf5, 0xa4, 0xbe, 0x44, 0x30, 0x54, 0xa6, 0xf5, 0x2c, 0x7b, - 0xed, 0xc4, 0x5c, 0x36, 0xc9, 0x8e, 0x0d, 0x16, 0x35, 0xf9, 0xe5, 0x45, - 0xe0, 0xfc, 0x13, 0x95, 0x28, 0x25, 0xdd, 0xea, 0xb5, 0xf9, 0xbd, 0x2a, - 0x0e, 0xd5, 0x95, 0x61, 0x91, 0x9f, 0x88, 0x38, 0x06, 0x10, 0x0a, 0xa2, - 0x88, 0x09, 0x15, 0x63, 0xa0, 0xed, 0xe2, 0x49, 0xa6, 0x68, 0x5a, 0x19, - 0xf6, 0x3b, 0xb3, 0xb4, 0xbc, 0x5f, 0x8e, 0x90, 0xd5, 0x35, 0x4b, 0x48, - 0x56, 0xd1, 0x21, 0x94, 0x36, 0xb6, 0x96, 0x3c, 0x8c, 0xd5, 0xd0, 0x71, - 0xb0, 0xe7, 0xe1, 0x63, 0xbf, 0x8d, 0x2e, 0x85, 0x9f, 0x96, 0xb2, 0x44, - 0xac, 0xd9, 0x07, 0xa7, 0x31, 0x64, 0x31, 0xbb, 0x06, 0x2d, 0x80, 0x98, - 0x5b, 0x4e, 0x1f, 0x66, 0x9a, 0x90, 0x7f, 0xba, 0x8d, 0x2e, 0x08, 0xcc, - 0x03, 0xcd, 0x43, 0x30, 0x73, 0xcf, 0x68, 0x6a, 0x2f, 0x2b, 0xf2, 0xbd, - 0xee, 0xd6, 0x6d, 0x3c, 0x32, 0x2e, 0xe0, 0x45, 0xc7, 0x18, 0x58, 0x2a, - 0xb3, 0xda, 0x5a, 0x43, 0x7c, 0x59, 0x74, 0x86, 0x42, 0x25, 0x3f, 0xcc, - 0x33, 0xeb, 0xac, 0x14, 0xeb, 0x45, 0x32, 0x1e, 0x1b, 0x99, 0xd1, 0xde, - 0x8a, 0x31, 0x2a, 0xb2, 0x9d, 0xbf, 0x8e, 0xb1, 0x37, 0xf8, 0x23, 0x3d, - 0x1b, 0x6b, 0x7e, 0x5c, 0xe2, 0x54, 0xa3, 0x84, 0x6e, 0x92, 0x0f, 0x85, - 0x20, 0xde, 0x5e, 0x97, 0x24, 0xb0, 0x82, 0x40, 0x97, 0xd3, 0xea, 0xcd, - 0x3e, 0x44, 0x22, 0x0e, 0x16, 0xb0, 0x7b, 0x56, 0xf9, 0xef, 0x92, 0x7a, - 0xe1, 0x0b, 0x17, 0xf6, 0x04, 0x4e, 0xc0, 0xa3, 0x71, 0x13, 0xe0, 0x41, - 0xe5, 0x8c, 0xc9, 0xf5, 0x75, 0x14, 0x08, 0x42, 0x7b, 0x78, 0x59, 0x78, - 0x54, 0x2f, 0x5c, 0x93, 0xbe, 0xef, 0x4e, 0x61, 0xff, 0xe5, 0x2a, 0x74, - 0xf5, 0xb3, 0x9f, 0x08, 0x2c, 0x19, 0x6e, 0x1f, 0xda, 0xd5, 0x75, 0x12, - 0x76, 0x22, 0x5b, 0xd5, 0x67, 0xbf, 0x6e, 0xe8, 0xbc, 0xdc, 0xde, 0x7f, - 0x6e, 0x02, 0x46, 0x89, 0x7b, 0x45, 0xd7, 0x62, 0xba, 0x27, 0x92, 0x9c, - 0xc4, 0xb3, 0x9b, 0x3e, 0x7f, 0x5f, 0xe2, 0x86, 0x67, 0x55, 0x91, 0xed, - 0xbc, 0xe6, 0x54, 0x8c, 0x93, 0xcf, 0xcd, 0xd9, 0x04, 0x0c, 0x07, 0xd8, - 0xe5, 0xf1, 0x70, 0xd7, 0x74, 0x27, 0x8a, 0xd2, 0xeb, 0x73, 0x47, 0xb0, - 0x2f, 0x66, 0x67, 0xf2, 0x48, 0x0f, 0xda, 0x3a, 0x27, 0x09, 0xdb, 0x85, - 0xbd, 0xbd, 0xbf, 0xbd, 0x32, 0x6e, 0x4d, 0xee, 0x39, 0x52, 0x8d, 0x5a, - 0xe4, 0x2d, 0xa1, 0x41, 0xea, 0xeb, 0xfc, 0x30, 0x79, 0xd8, 0x5e, 0xd8, - 0x74, 0x80, 0x97, 0xa9, 0x3f, 0x33, 0xc8, 0x30, 0x2d, 0x28, 0x8e, 0xfc, - 0xbe, 0xf2, 0x92, 0x65, 0xd7, 0xcb, 0x22, 0xf8, 0xf3, 0xad, 0x02, 0x85, - 0xbb, 0x91, 0x38, 0xe5, 0x33, 0xa7, 0xf8, 0x71, 0x85, 0xf0, 0x35, 0xb6, - 0xd5, 0x53, 0xf6, 0xbc, 0x11, 0x1b, 0xf4, 0x6d, 0xaa, 0x9c, 0xf0, 0x55, - 0x69, 0x0f, 0xeb, 0xc7, 0xc7, 0x58, 0xd3, 0xb4, 0x52, 0xb6, 0x51, 0x70, - 0x6c, 0x43, 0xc4, 0x05, 0x80, 0x50, 0x41, 0xb8, 0x7e, 0xcd, 0x46, 0x64, - 0x83, 0xbd, 0xa8, 0x0c, 0x2d, 0x2e, 0x2e, 0xc9, 0x05, 0xf0, 0x71, 0x03, - 0xa2, 0xfb, 0x2f, 0x54, 0x8d, 0xce, 0x7c, 0xb9, 0x29, 0xc6, 0x86, 0x11, - 0x71, 0x7e, 0xc4, 0x7d, 0xd5, 0xa8, 0xff, 0x25, 0x19, 0xaa, 0xf3, 0xb0, - 0xf8, 0x05, 0x26, 0xe2, 0x08, 0xe7, 0xa4, 0x77, 0x20, 0xb7, 0xe4, 0x35, - 0x0b, 0xc6, 0x34, 0x0b, 0x40, 0xfe, 0x33, 0x0c, 0x63, 0x5a, 0x78, 0xf1, - 0x34, 0x5d, 0x51, 0xde, 0xcf, 0xa5, 0xd3, 0x25, 0x20, 0x40, 0xd5, 0xd7, - 0x75, 0x36, 0x54, 0xc3, 0x0e, 0x38, 0x83, 0x41, 0x85, 0xf4, 0xf5, 0x35, - 0xe6, 0x40, 0xb0, 0xab, 0x50, 0x5f, 0x28, 0xe4, 0xda, 0x3b, 0x80, 0xf4, - 0x39, 0x78, 0xa4, 0x90, 0x22, 0x89, 0x7e, 0x3b, 0xaa, 0x6f, 0x87, 0x61, - 0x65, 0x42, 0xf4, 0x4a, 0x00, 0x9f, 0xc1, 0x9c, 0x74, 0x7b, 0x8a, 0x7e, - 0x34, 0x3c, 0x3e, 0xda, 0x7f, 0x03, 0xc4, 0xda, 0x36, 0x7e, 0xc9, 0x6c, - 0xac, 0xe5, 0xd4, 0x58, 0x1f, 0xfa, 0x92, 0x40, 0x36, 0x74, 0x8e, 0x2c, - 0x68, 0x7b, 0x30, 0xa3, 0x1b, 0xd8, 0x50, 0x02, 0x00, 0xb6, 0x96, 0xc6, - 0x6a, 0x77, 0xd8, 0xa3, 0x7e, 0xd4, 0x5f, 0x30, 0x62, 0x25, 0x38, 0xb9, - 0x40, 0x8c, 0xba, 0x66, 0x60, 0x34, 0x08, 0x07, 0xa7, 0xb3, 0xd8, 0xfc, - 0x6e, 0x2f, 0x75, 0x9a, 0x52, 0x8f, 0xd2, 0xca, 0xb8, 0x8b, 0xfa, 0x05, - 0x3c, 0xcb, 0xa9, 0x55, 0x15, 0x70, 0x91, 0x62, 0xd0, 0xce, 0xe2, 0x6d, - 0xd9, 0x33, 0xf5, 0x9f, 0x65, 0x97, 0xe5, 0x1c, 0x67, 0xd0, 0x5e, 0x70, - 0xda, 0xe4, 0x2d, 0xdf, 0x7d, 0x2f, 0x2c, 0xba, 0x08, 0x65, 0xaa, 0xfd, - 0xb3, 0x26, 0xd3, 0x79, 0xc6, 0xd5, 0x9a, 0x95, 0xbf, 0x92, 0x10, 0xb0, - 0x88, 0xcf, 0xbc, 0x10, 0x79, 0xa8, 0x4c, 0x88, 0x4a, 0x7d, 0xa3, 0xaa, - 0x69, 0x39, 0xb8, 0x1b, 0x95, 0xbf, 0x7b, 0x87, 0x60, 0x3a, 0x07, 0x15, - 0x2a, 0x7e, 0xc2, 0x9d, 0xf9, 0xf3, 0x35, 0x8a, 0x2c, 0x75, 0x3c, 0x15, - 0x6a, 0xd1, 0x4b, 0x72, 0x52, 0x76, 0x5c, 0x4f, 0xa7, 0xec, 0xf9, 0x6c, - 0x20, 0xbe, 0xfb, 0x49, 0x16, 0x60, 0xc0, 0x48, 0xef, 0x25, 0x9b, 0x91, - 0xf9, 0xc2, 0xf5, 0x5b, 0xe7, 0xde, 0x16, 0xa3, 0x4e, 0xb4, 0x0e, 0x91, - 0x30, 0x48, 0x98, 0x0c, 0xc0, 0x12, 0x59, 0x90, 0x7d, 0x99, 0x26, 0x2d, - 0x74, 0xe7, 0x72, 0x6d, 0x51, 0xad, 0x8d, 0xc3, 0x32, 0x29, 0xbc, 0x8e, - 0xda, 0x30, 0xab, 0xf8, 0x0e, 0x2a, 0x8b, 0x9d, 0xc1, 0x9a, 0x5e, 0x85, - 0x35, 0x13, 0x24, 0xc5, 0x7c, 0x0d, 0xc2, 0x55, 0x36, 0x95, 0xc1, 0xd4, - 0xd9, 0xd5, 0x17, 0x34, 0x53, 0xc9, 0x9e, 0x7c, 0xb8, 0x67, 0xa0, 0xf7, - 0x8c, 0x4b, 0xc3, 0xb9, 0xc8, 0xb0, 0xce, 0xce, 0x2e, 0x01, 0x62, 0xe9, - 0x31, 0xe9, 0x94, 0xaf, 0x0b, 0x9a, 0xe0, 0x38, 0xa8, 0x87, 0xcf, 0xce, - 0x21, 0xa4, 0x17, 0x4c, 0xa6, 0xeb, 0x74, 0x5d, 0xa2, 0xd9, 0x8f, 0xbe, - 0xf7, 0xdb, 0xda, 0x58, 0x63, 0xbb, 0x91, 0x4b, 0x6b, 0x05, 0xc5, 0xda, - 0xcc, 0x36, 0x96, 0xd1, 0x8e, 0x20, 0x14, 0xb6, 0x5f, 0x7c, 0x5f, 0xd3, - 0x9b, 0x85, 0x5d, 0xd8, 0x85, 0xe2, 0x9b, 0xf2, 0x94, 0xc7, 0xa9, 0x37, - 0xae, 0x00, 0x9f, 0x31, 0xb5, 0xf2, 0xef, 0x5c, 0x79, 0xc4, 0xc2, 0xf5, - 0x98, 0xb0, 0x94, 0x03, 0xac, 0xe7, 0xb0, 0xc8, 0x1b, 0x86, 0x1b, 0x54, - 0x14, 0xd7, 0x6f, 0xce, 0x57, 0x2e, 0x17, 0x09, 0x56, 0x78, 0xba, 0xae, - 0xda, 0x28, 0x58, 0x42, 0xef, 0x5c, 0x8a, 0x29, 0x6d, 0x27, 0xdd, 0x67, - 0x7f, 0x1e, 0xd1, 0xf1, 0x8c, 0x9a, 0x1f, 0x7c, 0x4c, 0x11, 0x8c, 0x3a, - 0x5b, 0x2a, 0x4a, 0xa9, 0xba, 0x0f, 0xa3, 0xaa, 0x21, 0x16, 0xf5, 0x02, - 0x35, 0xb0, 0x27, 0x0d, 0x4b, 0xc2, 0xaa, 0xc7, 0xcd, 0x8a, 0x9c, 0x3f, - 0xfb, 0x5e, 0x6a, 0xa7, 0x1b, 0x08, 0x6b, 0x3b, 0x2b, 0x93, 0xbf, 0x2a, - 0x67, 0x81, 0xb6, 0x31, 0xa6, 0xc9, 0x75, 0xab, 0xba, 0xf9, 0x05, 0xc4, - 0xa3, 0xbb, 0x80, 0xfd, 0xfc, 0xd5, 0x7d, 0xbb, 0x4e, 0x4e, 0x87, 0x24, - 0x67, 0x6d, 0xa9, 0x09, 0x55, 0xa0, 0xc9, 0xe1, 0x71, 0xb4, 0x41, 0xc5, - 0xcd, 0x18, 0x53, 0x14, 0xf0, 0xdd, 0x0e, 0xbb, 0xb1, 0x49, 0x83, 0x78, - 0xb7, 0xb2, 0x64, 0xf3, 0x85, 0x63, 0xc7, 0x1e, 0x68, 0xe9, 0x0f, 0x21, - 0xaa, 0x5e, 0x32, 0x22, 0x1b, 0x5d, 0x31, 0x1e, 0xcd, 0x48, 0xe8, 0xb5, - 0xce, 0x09, 0xb1, 0xf7, 0x9d, 0xee, 0x0e, 0x45, 0x78, 0xbb, 0xe1, 0xb3, - 0xed, 0x4e, 0x43, 0x4e, 0x08, 0x5c, 0x6b, 0x4a, 0xae, 0x32, 0xe0, 0xa2, - 0xb6, 0xd4, 0x0e, 0x97, 0x0c, 0x88, 0x62, 0x7b, 0x93, 0x43, 0x25, 0xe2, - 0x63, 0x08, 0x05, 0xc5, 0x65, 0xdd, 0x5e, 0xe3, 0xa5, 0x73, 0x21, 0xb2, - 0xef, 0x21, 0x5f, 0x31, 0x4f, 0xdc, 0xa2, 0x71, 0x33, 0xab, 0x6e, 0x51, - 0x75, 0xb0, 0x8e, 0x5a, 0x77, 0xf7, 0x91, 0x15, 0x40, 0xac, 0xa2, 0x5c, - 0xcb, 0x8e, 0x69, 0xa5, 0xf8, 0xf4, 0xeb, 0x87, 0x0e, 0xe4, 0xff, 0x1a, - 0x51, 0x29, 0x21, 0xc9, 0x44, 0x55, 0x11, 0x87, 0x00, 0xfd, 0xc6, 0xc7, - 0xb3, 0x00, 0xd0, 0x93, 0x60, 0x2e, 0x11, 0xa3, 0xce, 0x79, 0x24, 0x3b, - 0xaa, 0x20, 0x6f, 0x3d, 0xe0, 0xa6, 0x38, 0x33, 0x64, 0xfb, 0xb8, 0xd3, - 0x34, 0x3b, 0xf3, 0x79, 0xfb, 0xa9, 0xa6, 0xd4, 0xdf, 0x01, 0xf2, 0xff, - 0x8b, 0xf1, 0x8e, 0x67, 0xad, 0x47, 0x58, 0x27, 0x83, 0x0a, 0x06, 0x57, - 0x01, 0x51, 0x33, 0x07, 0x47, 0xe5, 0x80, 0xc9, 0xc5, 0x8c, 0xe5, 0x8c, - 0xde, 0xa3, 0xe3, 0x4b, 0xb8, 0x55, 0x26, 0xe0, 0x18, 0x3f, 0xbd, 0x33, - 0x88, 0xad, 0xf6, 0x4e, 0x59, 0xc2, 0xb4, 0x4c, 0xc0, 0xf2, 0xf2, 0xb1, - 0x96, 0x63, 0x0a, 0xcc, 0x2b, 0x00, 0xaf, 0x48, 0x71, 0x95, 0x62, 0x4a, - 0xa7, 0x85, 0x03, 0x8a, 0x06, 0x3b, 0x13, 0xb0, 0x5f, 0xfc, 0x26, 0x2a, - 0x29, 0x1a, 0xcb, 0x1b, 0x06, 0x11, 0x8d, 0xaf, 0x46, 0xf3, 0x2b, 0xd6, - 0x6b, 0x35, 0x4a, 0xc2, 0xde, 0xa6, 0x63, 0x5d, 0x16, 0x92, 0xb9, 0x2a, - 0x53, 0x44, 0x76, 0x14, 0x3b, 0x05, 0x36, 0xfe, 0x2b, 0x63, 0x97, 0xdf, - 0xfb, 0x10, 0xf4, 0x65, 0xd1, 0xfb, 0x86, 0x3e, 0xd7, 0xe0, 0xea, 0xf0, - 0xac, 0x00, 0x9a, 0x69, 0x41, 0x49, 0xb4, 0x5c, 0xc8, 0xec, 0x47, 0xb1, - 0x40, 0xc2, 0x45, 0x53, 0x8d, 0xf4, 0x58, 0xc3, 0x2e, 0xc6, 0x27, 0x30, - 0x8e, 0x70, 0xbe, 0xd6, 0x2e, 0x76, 0xc9, 0xb6, 0x69, 0x97, 0xf1, 0x08, - 0xa0, 0x2e, 0x7e, 0xb3, 0x25, 0x30, 0xae, 0xe8, 0x10, 0xbe, 0x49, 0xb9, - 0x3d, 0x6d, 0xa2, 0x42, 0x28, 0x3a, 0xe0, 0xce, 0x81, 0xc9, 0x41, 0x1d, - 0x8c, 0xd0, 0xe5, 0x0e, 0x3b, 0x77, 0x6e, 0xf3, 0xe0, 0x39, 0x8c, 0x75, - 0x8f, 0x4c, 0x8a, 0x63, 0xac, 0x06, 0xbb, 0xe7, 0x65, 0x32, 0x5b, 0x87, - 0x94, 0x55, 0x01, 0xf8, 0x71, 0x09, 0x3a, 0xf0, 0x43, 0x6e, 0x2e, 0x94, - 0x69, 0xa7, 0x30, 0x23, 0x24, 0x2d, 0x53, 0x3f, 0x71, 0xd5, 0xdd, 0x40, - 0x83, 0x60, 0xf3, 0x56, 0xc8, 0xcd, 0x27, 0x21, 0x73, 0x7f, 0x36, 0x75, - 0x52, 0xf4, 0x12, 0x66, 0x42, 0xc1, 0x99, 0x09, 0x13, 0xf9, 0x14, 0x1e, - 0xf3, 0x6f, 0xcd, 0xcd, 0x1e, 0x45, 0xdf, 0xfd, 0x13, 0x40, 0x12, 0x3a, - 0x79, 0x0f, 0x43, 0x19, 0xb0, 0x0d, 0x78, 0xa0, 0x4f, 0x73, 0x72, 0x64, - 0x0a, 0x54, 0x9c, 0x72, 0x64, 0x85, 0x03, 0x49, 0x80, 0x9d, 0xa3, 0xe4, - 0x54, 0x30, 0x1e, 0xad, 0x85, 0xae, 0x9a, 0xd2, 0x55, 0x5d, 0x0d, 0x9e, - 0x24, 0x14, 0x07, 0x70, 0x71, 0xf0, 0x27, 0x83, 0xe4, 0x31, 0x73, 0x57, - 0x10, 0x2d, 0xdf, 0x33, 0x07, 0x19, 0x42, 0x37, 0xa4, 0x85, 0x4b, 0xf5, - 0x73, 0xd4, 0x7c, 0x1a, 0x0b, 0x59, 0xee, 0x9a, 0xc3, 0x93, 0xca, 0x59, - 0xb5, 0x45, 0x9f, 0xbc, 0x21, 0x24, 0xa9, 0xc9, 0x3c, 0xa8, 0x7d, 0xb1, - 0x7e, 0xb9, 0x83, 0x68, 0x6d, 0x92, 0x72, 0xe5, 0x34, 0xdc, 0x3d, 0xe2, - 0x6f, 0xaf, 0x60, 0x9f, 0x06, 0x2c, 0xcf, 0x1d, 0x97, 0x6c, 0x14, 0x59, - 0xbc, 0x7a, 0x25, 0x0c, 0xaa, 0x38, 0xe5, 0xf0, 0x5b, 0xd2, 0xdd, 0x89, - 0x6b, 0xf8, 0x7d, 0x3d, 0xb3, 0x10, 0x00, 0x3f, 0x3c, 0x3a, 0x81, 0xec, - 0xb1, 0x32, 0x4a, 0x32, 0x36, 0x4e, 0x95, 0x50, 0x1c, 0xcc, 0x8c, 0x71, - 0x16, 0xe0, 0xc8, 0xd7, 0x68, 0xea, 0x35, 0x34, 0x3d, 0x08, 0xd7, 0x9c, - 0x38, 0xcb, 0x84, 0xe0, 0xeb, 0x47, 0x67, 0x6c, 0x6c, 0x23, 0x88, 0xc3, - 0x81, 0x44, 0xe2, 0xaa, 0x20, 0xd2, 0x82, 0x17, 0x31, 0x88, 0x9a, 0x46, - 0x6d, 0x14, 0xbc, 0x50, 0x42, 0x8a, 0xad, 0x72, 0x69, 0x08, 0x15, 0x2b, - 0xb4, 0xc0, 0x98, 0x4d, 0x99, 0x3f, 0x9e, 0xb7, 0xa5, 0xd8, 0x80, 0x38, - 0x18, 0x1a, 0x18, 0x24, 0xc1, 0xa7, 0x37, 0x62, 0xbc, 0x87, 0xbc, 0x2a, - 0xee, 0x60, 0x4d, 0x75, 0x20, 0x0b, 0x38, 0x62, 0xc9, 0x68, 0xd5, 0x6d, - 0x2d, 0x46, 0x53, 0x0b, 0xf5, 0xd0, 0xd0, 0x93, 0xbc, 0x33, 0xe6, 0x59, - 0x71, 0x8c, 0xa7, 0xa1, 0xe5, 0x9c, 0x0f, 0x99, 0xfc, 0x3f, 0x79, 0x8a, - 0x74, 0xb8, 0xe8, 0x00, 0xdd, 0xdd, 0x2b, 0x79, 0xf2, 0x1a, 0x2f, 0xb2, - 0x61, 0x7d, 0xa1, 0x54, 0x34, 0x15, 0xa4, 0x13, 0x59, 0xdf, 0x64, 0x24, - 0x34, 0x81, 0xf5, 0x13, 0x59, 0xd9, 0xb8, 0x60, 0x8e, 0xa6, 0xa8, 0x54, - 0x11, 0x7d, 0x5b, 0xaf, 0x4a, 0x6d, 0x4e, 0xb9, 0x0e, 0x6f, 0xe0, 0x2c, - 0x68, 0xd7, 0xdc, 0xa3, 0xbb, 0x37, 0xdb, 0xd5, 0x6c, 0x46, 0xb5, 0xfd, - 0xce, 0x5a, 0xa1, 0xe3, 0xf0, 0x68, 0x11, 0xcf, 0xd1, 0x24, 0x7d, 0x4b, - 0x2b, 0x01, 0x07, 0x5a, 0xb7, 0xa2, 0x47, 0xc4, 0x25, 0x4d, 0xf7, 0xdc, - 0xd8, 0x8b, 0x23, 0xf2, 0x66, 0x27, 0xc7, 0xb3, 0xc3, 0xea, 0x55, 0x8d, - 0x95, 0x8e, 0xe4, 0xc7, 0xa7, 0x00, 0x08, 0xbb, 0xdb, 0xea, 0x33, 0xd6, - 0x63, 0x34, 0x2e, 0x07, 0x1f, 0x1c, 0x63, 0xb4, 0xe9, 0x41, 0x8b, 0x56, - 0xfb, 0xbc, 0x4c, 0x84, 0x8d, 0x3b, 0xdb, 0x13, 0x6a, 0x83, 0x31, 0x26, - 0x92, 0x26, 0x1c, 0xc1, 0x32, 0xbb, 0x38, 0x8f, 0x1f, 0x2a, 0xcd, 0x9e, - 0x7a, 0x9d, 0xc3, 0x48, 0xd9, 0x43, 0x67, 0xc2, 0x5c, 0xcc, 0x06, 0x5f, - 0x5d, 0x44, 0x3c, 0xaa, 0x2b, 0xdd, 0x8f, 0x54, 0x37, 0x69, 0xcd, 0x01, - 0xbc, 0x84, 0x02, 0x40, 0x56, 0x94, 0x78, 0xeb, 0xe6, 0x0f, 0x7e, 0x6c, - 0x64, 0x14, 0x6a, 0x81, 0x35, 0xa7, 0x4a, 0xb2, 0x3e, 0xe6, 0x73, 0x0d, - 0x35, 0x20, 0x18, 0x51, 0x7b, 0xdd, 0x20, 0xd8, 0xd1, 0x61, 0x97, 0x0a, - 0x65, 0x3a, 0xbd, 0xd1, 0x07, 0x45, 0x82, 0xe3, 0x80, 0x25, 0xf5, 0x52, - 0x5b, 0x74, 0xb7, 0xf2, 0x0a, 0xa1, 0x82, 0x06, 0x6c, 0x7e, 0x92, 0x5c, - 0xee, 0x25, 0xed, 0xf3, 0x3d, 0x4c, 0x47, 0x88, 0xb2, 0xeb, 0xa7, 0x04, - 0xb3, 0x4e, 0xdf, 0x91, 0x60, 0xb5, 0x2a, 0x7a, 0x99, 0xb6, 0x1f, 0xff, - 0x5c, 0xc9, 0xfa, 0x5a, 0x44, 0x17, 0x81, 0x7c, 0x24, 0xbc, 0x23, 0x4a, - 0x4f, 0x90, 0x9b, 0xc2, 0x6a, 0xda, 0xa8, 0xad, 0xe1, 0xcf, 0x0b, 0xdf, - 0xc6, 0x6a, 0xef, 0xe2, 0x56, 0x0d, 0x43, 0x5b, 0x0b, 0x83, 0xe6, 0xae, - 0x29, 0x01, 0xb5, 0x3b, 0xa7, 0xe3, 0x20, 0x37, 0x36, 0xa9, 0x49, 0x6c, - 0x35, 0xf8, 0xd1, 0x82, 0xdc, 0x12, 0x55, 0x38, 0x7e, 0x04, 0x29, 0x1f, - 0xde, 0x6f, 0x29, 0xc3, 0xb0, 0x6c, 0xda, 0x9d, 0x51, 0x2b, 0x6b, 0x20, - 0x0e, 0xde, 0x23, 0x80, 0xdb, 0x82, 0x31, 0xc4, 0x13, 0xda, 0xd0, 0x92, - 0xc3, 0xce, 0x9d, 0x33, 0x31, 0xfb, 0x1b, 0x8e, 0x3b, 0x23, 0x0c, 0x66, - 0x31, 0xe2, 0x88, 0xe2, 0xc6, 0xc4, 0x6b, 0x88, 0xd9, 0x30, 0xc9, 0xef, - 0x79, 0x38, 0x5e, 0x01, 0x8d, 0xc1, 0xc1, 0xdf, 0x36, 0xb7, 0xb9, 0x5d, - 0x92, 0x42, 0x9f, 0xbd, 0x64, 0xf9, 0x9e, 0x28, 0x3a, 0xb3, 0x21, 0x2e, - 0x52, 0xe2, 0x83, 0x85, 0x1b, 0xcf, 0xd8, 0xe6, 0x14, 0x69, 0x31, 0x96, - 0x07, 0x3c, 0x9a, 0xd9, 0xab, 0xe2, 0x53, 0x23, 0x0e, 0xb1, 0x33, 0x96, - 0x6d, 0xd1, 0x63, 0xd8, 0x69, 0x1f, 0xbe, 0x05, 0xfd, 0xa6, 0x85, 0x40, - 0xf1, 0x08, 0x13, 0x7e, 0x12, 0xe4, 0xc3, 0x03, 0xab, 0x49, 0x8d, 0x2b, - 0x75, 0x4d, 0x1f, 0x32, 0xef, 0x2a, 0xa2, 0x3f, 0x2e, 0xe8, 0xae, 0x32, - 0x3e, 0x88, 0x8d, 0x70, 0x8c, 0x5c, 0x79, 0x46, 0x94, 0xc2, 0xba, 0x8b, - 0x8b, 0x38, 0x4c, 0x62, 0x09, 0xe8, 0x64, 0xdf, 0x01, 0x98, 0xe4, 0xe3, - 0x08, 0x15, 0x14, 0x27, 0x20, 0xa8, 0x63, 0x71, 0xe8, 0xbd, 0x4b, 0x63, - 0xbb, 0x9f, 0xf2, 0x2e, 0x01, 0x3c, 0x67, 0x27, 0x94, 0xa6, 0xfc, 0xd6, - 0x12, 0xaf, 0x1b, 0xfa, 0x27, 0xd5, 0x47, 0x86, 0x4e, 0x32, 0xcf, 0x78, - 0x29, 0x7c, 0xdc, 0xf9, 0x2e, 0xf4, 0x70, 0xf5, 0x7a, 0xc0, 0xe6, 0x1c, - 0x9f, 0xe9, 0xca, 0xa9, 0xe3, 0xf2, 0x34, 0xc7, 0xbe, 0xdf, 0xd5, 0x66, - 0x71, 0x1c, 0xa7, 0x8b, 0x22, 0xb7, 0x14, 0xf4, 0x84, 0xe9, 0x55, 0x71, - 0x2d, 0xb5, 0x26, 0x5a, 0x65, 0xca, 0xc2, 0xab, 0x86, 0xc8, 0x48, 0x5d, - 0x50, 0x44, 0x59, 0x96, 0x56, 0xe5, 0xdd, 0x79, 0x34, 0xde, 0xe2, 0x2e, - 0xfa, 0x45, 0xc3, 0xd5, 0x21, 0xbf, 0x5c, 0xa6, 0xad, 0xef, 0xfa, 0x9c, - 0xdc, 0xe3, 0x2d, 0x44, 0x0e, 0x6b, 0xe0, 0x56, 0x50, 0x97, 0x79, 0x94, - 0x21, 0xff, 0xc2, 0xd5, 0x7b, 0x1b, 0x7d, 0x64, 0xa0, 0x56, 0xb2, 0x6f, - 0xe1, 0xf0, 0xd8, 0xc7, 0xe3, 0x06, 0xfe, 0x9a, 0xd6, 0x5b, 0xb1, 0x08, - 0x0b, 0x83, 0x5d, 0x99, 0xaa, 0x7e, 0xed, 0xd7, 0x03, 0xdf, 0x65, 0x5f, - 0xa2, 0xa8, 0xcd, 0x6e, 0x11, 0x91, 0xdf, 0x96, 0x68, 0x9e, 0x25, 0x53, - 0x93, 0x27, 0xa5, 0x29, 0x06, 0xab, 0x81, 0x01, 0xea, 0x24, 0x60, 0x9c, - 0x5e, 0xfa, 0x96, 0x24, 0x72, 0x0a, 0xcf, 0xc9, 0xb1, 0xd3, 0x01, 0x0a, - 0xad, 0x99, 0x17, 0xc6, 0x46, 0x18, 0x91, 0x00, 0x46, 0xc5, 0x2d, 0x1e, - 0x91, 0x60, 0x4f, 0xc6, 0xb2, 0x09, 0xb1, 0xc4, 0xf8, 0x84, 0x65, 0xcb, - 0xe1, 0x42, 0xff, 0x5b, 0xbd, 0x6a, 0x65, 0x1f, 0x1b, 0x16, 0x8b, 0xb1, - 0xf1, 0x81, 0xc6, 0x05, 0xc0, 0x2c, 0xae, 0xf9, 0xc9, 0xe5, 0xbf, 0x19, - 0x7e, 0x04, 0x27, 0x3e, 0xc1, 0xa6, 0x3a, 0x8c, 0xf2, 0x7d, 0x0a, 0xb7, - 0x32, 0xd8, 0xb5, 0xf1, 0x4f, 0x0d, 0xdc, 0x2c, 0xab, 0x3d, 0xc8, 0x5b, - 0xc3, 0xe7, 0x7a, 0x1f, 0x59, 0x75, 0xd9, 0x7e, 0xaf, 0xac, 0x3c, 0xa5, - 0xc6, 0x4f, 0x90, 0x9c, 0x9f, 0x99, 0x40, 0x16, 0x13, 0xc8, 0x56, 0x3b, - 0x1c, 0x89, 0x0a, 0x98, 0x4b, 0x26, 0xe9, 0xc4, 0xde, 0xeb, 0xb8, 0x68, - 0x2e, 0x70, 0xfb, 0xc7, 0x09, 0x08, 0x90, 0x38, 0x96, 0x89, 0x19, 0x60, - 0xad, 0x92, 0x66, 0x82, 0x32, 0x87, 0x5f, 0xc7, 0xd6, 0xcc, 0x05, 0xf9, - 0x0a, 0xef, 0xec, 0xc9, 0x23, 0x5f, 0x54, 0x87, 0x20, 0x33, 0x35, 0x9c, - 0xa2, 0x04, 0xb3, 0x0d, 0x9f, 0x12, 0xc0, 0x1c, 0xde, 0x62, 0x10, 0xbb, - 0xb1, 0x5d, 0x0f, 0xe5, 0x8a, 0xff, 0xec, 0x76, 0xf2, 0xa4, 0xc2, 0x1d, - 0xc5, 0xde, 0xd0, 0x70, 0xa7, 0x46, 0x04, 0x6a, 0xfa, 0x10, 0x58, 0x8e, - 0x5a, 0x00, 0x52, 0xd8, 0xb7, 0x36, 0xfe, 0x9d, 0x48, 0x5f, 0x83, 0x18, - 0xd0, 0x5d, 0x6a, 0x35, 0xbf, 0xfd, 0xd6, 0x78, 0xaf, 0xc8, 0x65, 0x50, - 0x95, 0x0a, 0x8d, 0x54, 0x76, 0x7e, 0xf2, 0x37, 0x5d, 0x64, 0x97, 0x38, - 0x63, 0xba, 0x7b, 0x17, 0xcc, 0xff, 0xab, 0x57, 0x64, 0xfd, 0x04, 0x14, - 0x3a, 0xdc, 0x33, 0xc0, 0xbf, 0x26, 0xd0, 0x99, 0x2c, 0xde, 0x37, 0x4c, - 0x29, 0x13, 0x6d, 0x0e, 0x48, 0x8a, 0x74, 0xcf, 0x62, 0xdc, 0x32, 0x54, - 0xdc, 0x75, 0x82, 0x0e, 0xe4, 0x57, 0xbc, 0xe3, 0xfa, 0x10, 0xc8, 0x00, - 0x5d, 0xb2, 0xf0, 0x68, 0xaf, 0x04, 0x21, 0x9d, 0x84, 0x49, 0xde, 0xaa, - 0x8e, 0x03, 0xe9, 0x07, 0x21, 0xf8, 0x8f, 0xce, 0x4a, 0x7f, 0x2b, 0xd0, - 0x95, 0x87, 0x56, 0x82, 0x9c, 0x3d, 0x95, 0x67, 0x2d, 0x38, 0xd8, 0xc9, - 0xe4, 0xad, 0xec, 0x74, 0xcd, 0xa0, 0xa7, 0xa2, 0x3d, 0x69, 0x07, 0x97, - 0x00, 0xd2, 0x6b, 0xb3, 0x45, 0xe7, 0xb5, 0x25, 0xe6, 0x54, 0xb1, 0xab, - 0xdb, 0x62, 0x4c, 0xff, 0x76, 0x9a, 0x13, 0xef, 0x83, 0xcd, 0xf6, 0x97, - 0xce, 0xa7, 0x6b, 0x15, 0x19, 0xe7, 0x97, 0xdd, 0xa3, 0xf1, 0xd1, 0x9c, - 0x91, 0x13, 0xe1, 0x1d, 0xa5, 0xd0, 0x70, 0xae, 0xff, 0x2c, 0xd9, 0x03, - 0x98, 0xab, 0x28, 0x89, 0x0b, 0xda, 0x70, 0x9c, 0xb7, 0x37, 0xb0, 0x55, - 0xd1, 0x98, 0x8a, 0x8e, 0x55, 0xf9, 0x00, 0xed, 0x6a, 0xfb, 0xd9, 0x15, - 0x97, 0x40, 0x13, 0x9a, 0xb8, 0xf5, 0x53, 0x8b, 0x62, 0x85, 0xa8, 0xa4, - 0xd6, 0x0f, 0x56, 0x82, 0xed, 0x2d, 0xa5, 0xfc, 0x5a, 0x61, 0x8e, 0x06, - 0x41, 0xa2, 0x92, 0x70, 0x71, 0x17, 0xfa, 0xa8, 0x3a, 0x9c, 0x78, 0xa1, - 0x8d, 0x60, 0xe6, 0x63, 0x69, 0x76, 0x8f, 0x25, 0xa2, 0x2f, 0xa6, 0xfd, - 0x41, 0xf3, 0x03, 0x9f, 0x25, 0xd5, 0xfa, 0x1f, 0xdd, 0x3d, 0x5b, 0xda, - 0xf2, 0x1c, 0x9a, 0x8a, 0xc7, 0x45, 0x18, 0x62, 0xa0, 0xa4, 0x3a, 0x56, - 0xaf, 0x20, 0x20, 0x2e, 0x81, 0x9a, 0x95, 0x5c, 0x7e, 0x86, 0xb3, 0x10, - 0xf0, 0x2f, 0x5e, 0x8f, 0xe3, 0x37, 0x2b, 0x20, 0x06, 0xcf, 0x87, 0xb5, - 0xf4, 0x35, 0x8d, 0xaf, 0x0c, 0x15, 0x8e, 0x7e, 0x36, 0x58, 0x65, 0x17, - 0x8d, 0x06, 0x2b, 0xa4, 0xe3, 0xc2, 0x51, 0xc6, 0xaa, 0xef, 0xe0, 0xaa, - 0x6c, 0xee, 0xe2, 0x6c, 0x65, 0xc2, 0x5d, 0xaf, 0xca, 0x54, 0x3c, 0x64, - 0x4d, 0x35, 0x4c, 0x71, 0x86, 0xe1, 0x6a, 0xfe, 0x18, 0x42, 0xd3, 0xc5, - 0x60, 0x4e, 0xdb, 0x2e, 0xc1, 0x5b, 0x80, 0x99, 0xee, 0x30, 0x3c, 0xd0, - 0x37, 0x4f, 0xca, 0xe3, 0x72, 0xbd, 0x53, 0x0a, 0x02, 0xd8, 0x8d, 0x03, - 0x2d, 0x80, 0x62, 0xe2, 0x2d, 0x0e, 0xd9, 0xee, 0xba, 0x86, 0x25, 0xa9, - 0xd6, 0xbd, 0x55, 0xe4, 0xc2, 0x5c, 0xfa, 0x38, 0x94, 0xec, 0x0f, 0x0b, - 0x08, 0x85, 0x8d, 0xe7, 0x4a, 0xed, 0xa1, 0xfb, 0x59, 0xbb, 0x67, 0x4a, - 0x53, 0x9c, 0x5b, 0x48, 0xcf, 0x08, 0x6c, 0xdd, 0x4a, 0x54, 0xed, 0x41, - 0x0f, 0x99, 0x6d, 0x9e, 0xe1, 0xb3, 0xe2, 0x8f, 0x1a, 0x02, 0xb0, 0x90, - 0x11, 0x03, 0xd5, 0x50, 0x5b, 0x34, 0x8e, 0x34, 0xde, 0x0d, 0xf6, 0x2b, - 0x53, 0xe1, 0xaf, 0x92, 0x2b, 0xf9, 0x0c, 0xeb, 0xe3, 0xeb, 0x06, 0xc7, - 0xf7, 0x52, 0xab, 0xe7, 0x70, 0x52, 0x84, 0xaa, 0x7c, 0xbf, 0xee, 0x42, - 0xd0, 0x92, 0x93, 0xe1, 0x92, 0x1f, 0x5b, 0x7c, 0x7a, 0xed, 0x39, 0x08, - 0xf8, 0x52, 0xe1, 0xcb, 0x22, 0x97, 0xa3, 0x10, 0x8c, 0x98, 0x34, 0x5e, - 0xfc, 0x07, 0xab, 0x7e, 0x5b, 0xc1, 0xc8, 0xde, 0x2b, 0xc4, 0x27, 0x7f, - 0x2d, 0x45, 0xcb, 0x81, 0x1c, 0x0a, 0x07, 0x2b, 0x7d, 0x9f, 0x54, 0xb6, - 0xdd, 0xd9, 0x6c, 0x26, 0x70, 0xf0, 0xf4, 0x2c, 0x30, 0xf7, 0x22, 0x33, - 0x59, 0x28, 0x9d, 0xed, 0x90, 0x87, 0x55, 0x32, 0xd5, 0xca, 0xe2, 0xc2, - 0x07, 0x7c, 0xb9, 0x1d, 0xeb, 0xc6, 0x88, 0x88, 0xa7, 0x1c, 0x53, 0x23, - 0x79, 0x66, 0xff, 0x06, 0x76, 0x60, 0x32, 0x04, 0xd1, 0xcb, 0xe4, 0xb6, - 0xa3, 0xa5, 0x8d, 0xff, 0x37, 0xad, 0x58, 0x1d, 0x46, 0x85, 0x19, 0x4f, - 0x83, 0xde, 0x09, 0xcc, 0xe1, 0xa9, 0x56, 0x08, 0xef, 0x8f, 0x1b, 0x4c, - 0x24, 0x8d, 0x22, 0x3e, 0x96, 0x07, 0xcc, 0xc0, 0x8e, 0x9a, 0x91, 0x22, - 0xc9, 0x3c, 0xea, 0xba, 0x49, 0x09, 0x95, 0x55, 0xf8, 0x30, 0x26, 0x19, - 0x2b, 0xb6, 0xff, 0xe0, 0x7a, 0x33, 0x39, 0x4f, 0x13, 0x00, 0x52, 0xa6, - 0xda, 0xe6, 0x98, 0xaf, 0xaf, 0x7b, 0x8e, 0x27, 0x44, 0x0a, 0x5c, 0xe4, - 0x91, 0x8c, 0x4e, 0x77, 0x60, 0x87, 0x03, 0x1b, 0xc5, 0x54, 0x9e, 0x54, - 0xd7, 0xf6, 0x67, 0xc4, 0x62, 0x3e, 0x84, 0x50, 0xec, 0xfc, 0x64, 0x91, - 0x4a, 0xb8, 0xd4, 0x7c, 0x35, 0x67, 0x3d, 0x4c, 0xb8, 0xb4, 0x36, 0xf9, - 0x35, 0xce, 0x8f, 0x33, 0x5c, 0x90, 0xfa, 0x46, 0xd7, 0x8a, 0xd4, 0x35, - 0x72, 0xc8, 0xc6, 0xc1, 0xca, 0x04, 0x2b, 0x58, 0xf8, 0x9f, 0x6d, 0xb6, - 0xc8, 0xf2, 0xde, 0xc0, 0x78, 0x5a, 0x60, 0x95, 0x25, 0x5e, 0x3c, 0x59, - 0x83, 0x9f, 0xcf, 0x77, 0xb2, 0xd2, 0x65, 0x21, 0x8b, 0xcc, 0xac, 0x59, - 0x34, 0x41, 0xbf, 0xe0, 0x9b, 0xf2, 0xce, 0x2c, 0x9a, 0xb0, 0xe5, 0x94, - 0xf0, 0x7b, 0x25, 0xd8, 0xf9, 0xa9, 0x52, 0xb3, 0xbf, 0x84, 0xca, 0x8a, - 0x3e, 0x52, 0x76, 0x3e, 0x5c, 0x21, 0xf8, 0x2f, 0xb5, 0xf0, 0x6e, 0xb3, - 0x85, 0x63, 0xfb, 0x60, 0x9c, 0x7d, 0x7d, 0x81, 0x00, 0x58, 0x3c, 0x5d, - 0xbd, 0xaf, 0x2c, 0x7d, 0x57, 0x2f, 0x8a, 0x59, 0x5d, 0x81, 0x32, 0xa3, - 0xa9, 0x5e, 0x06, 0xce, 0x12, 0x84, 0x68, 0xc8, 0x94, 0x9a, 0xcb, 0xbe, - 0x0e, 0x23, 0x5e, 0x4e, 0x01, 0xc6, 0x7c, 0x59, 0x39, 0xbb, 0x56, 0x36, - 0x3e, 0x7f, 0x08, 0x63, 0x4d, 0xb6, 0x10, 0x9b, 0x55, 0xd5, 0xdc, 0xc6, - 0x10, 0xbb, 0x7c, 0xd7, 0xd5, 0x62, 0xdf, 0xd3, 0x64, 0x3f, 0x11, 0xd7, - 0x3f, 0x8c, 0x30, 0xf0, 0x52, 0x33, 0x67, 0xf3, 0xeb, 0x13, 0x05, 0x4a, - 0x61, 0x70, 0xe6, 0x1b, 0x45, 0x46, 0xf5, 0x48, 0x28, 0xde, 0xb3, 0xa4, - 0x34, 0xda, 0xa1, 0x3a, 0xcc, 0x03, 0xf2, 0x37, 0x75, 0x56, 0x00, 0xe9, - 0x10, 0xfe, 0xbc, 0xa5, 0x0f, 0x5f, 0x0f, 0x71, 0x3f, 0x68, 0x07, 0x92, - 0x4b, 0x40, 0x6c, 0xc0, 0xa7, 0xbc, 0x36, 0x7d, 0x79, 0x5d, 0xa7, 0xf4, - 0x8e, 0x59, 0xab, 0xc0, 0x78, 0x25, 0x2f, 0xc6, 0xd8, 0x8a, 0x44, 0xcf, - 0x3d, 0x16, 0x1b, 0x9e, 0x4e, 0xf5, 0xae, 0xd7, 0x54, 0x86, 0x83, 0xb2, - 0x07, 0x72, 0xd8, 0x5e, 0xe9, 0xae, 0xa0, 0x7e, 0x41, 0x4c, 0x13, 0x5d, - 0xdc, 0xef, 0x06, 0xed, 0x1a, 0xbc, 0xfd, 0x8a, 0xd6, 0x30, 0x2b, 0xbd, - 0xce, 0x00, 0xfd, 0xb1, 0xc7, 0x8f, 0x16, 0x3d, 0xe7, 0xec, 0x0c, 0x8b, - 0x0e, 0x26, 0xd8, 0xac, 0x55, 0x03, 0x0b, 0x6d, 0x6d, 0xcc, 0xca, 0xa7, - 0x73, 0xad, 0xbb, 0xea, 0x9a, 0xbb, 0x70, 0x31, 0x02, 0xa3, 0x99, 0x26, - 0xf5, 0x14, 0xa5, 0xe1, 0xf7, 0x1b, 0xfa, 0xa2, 0x9a, 0x75, 0x6a, 0x69, - 0x17, 0x5a, 0x94, 0xed, 0x06, 0x81, 0x22, 0x1d, 0xf0, 0x46, 0xa1, 0xa6, - 0x78, 0x34, 0xfb, 0x2f, 0x97, 0x74, 0xc3, 0x1e, 0x5a, 0xd9, 0x86, 0xd5, - 0x78, 0x9d, 0x16, 0xd5, 0x10, 0x38, 0xbd, 0x22, 0x37, 0xc2, 0xb8, 0xdf, - 0xc0, 0xb3, 0xa0, 0xd7, 0xef, 0xa6, 0x06, 0x21, 0x38, 0xfd, 0x98, 0xbc, - 0xd5, 0x1b, 0x1e, 0x8e, 0x12, 0x87, 0x51, 0x5c, 0x3a, 0xd5, 0x12, 0x8f, - 0x59, 0xd2, 0x84, 0x22, 0xd9, 0x01, 0x21, 0x6b, 0xae, 0xc6, 0xa5, 0x81, - 0x8f, 0x4d, 0x15, 0x5a, 0xc5, 0x42, 0x5e, 0x24, 0x20, 0x4b, 0xcf, 0x5d, - 0x90, 0xfe, 0x1f, 0xbf, 0x69, 0x8b, 0x25, 0xb0, 0xfe, 0xa1, 0xe9, 0x67, - 0x6d, 0x17, 0xb9, 0x86, 0xb2, 0x74, 0xe9, 0x09, 0x88, 0x38, 0x88, 0x38, - 0x5b, 0x06, 0x42, 0x3c, 0xba, 0xcd, 0x67, 0x2c, 0xf1, 0x60, 0x50, 0x3c, - 0x47, 0xdd, 0x43, 0x43, 0x02, 0xe5, 0x22, 0x22, 0xb1, 0x11, 0x5b, 0x84, - 0x90, 0x94, 0x58, 0x67, 0xe1, 0x70, 0xb1, 0x1b, 0xa2, 0xd1, 0x92, 0x6d, - 0x93, 0x9f, 0x7d, 0x0d, 0x99, 0xd3, 0x09, 0x46, 0x4d, 0x28, 0x4b, 0x3f, - 0x9c, 0x54, 0xa0, 0x89, 0x60, 0x23, 0x99, 0xb2, 0xa0, 0x38, 0x9d, 0xe3, - 0xe5, 0x2c, 0xa5, 0x03, 0xa4, 0x85, 0x62, 0x1d, 0x41, 0xdb, 0xdd, 0xe0, - 0x52, 0x15, 0xcb, 0xc4, 0x93, 0x5a, 0xa1, 0x53, 0xbd, 0xda, 0x50, 0x01, - 0xc9, 0xd5, 0x76, 0x72, 0x22, 0x75, 0x1e, 0xce, 0x94, 0x40, 0x86, 0xb0, - 0xfc, 0xbe, 0x42, 0x4e, 0xcb, 0xc6, 0x1d, 0xee, 0xe5, 0x05, 0x4c, 0x6b, - 0x07, 0xc0, 0x29, 0x97, 0x00, 0x4f, 0xf0, 0xa6, 0x92, 0xab, 0xd1, 0x34, - 0x97, 0xaf, 0x31, 0xf7, 0x3a, 0x30, 0x2d, 0x33, 0xe5, 0x10, 0x8c, 0x5b, - 0x35, 0xce, 0x3b, 0xb4, 0xf9, 0xe1, 0xf5, 0x8e, 0xd9, 0x9e, 0x53, 0xff, - 0x4d, 0x0a, 0x08, 0xef, 0xf2, 0xd0, 0xf6, 0x5e, 0x96, 0x24, 0x5e, 0x17, - 0x71, 0x49, 0x4e, 0x1e, 0x6d, 0x35, 0xc8, 0x99, 0xce, 0x91, 0xb7, 0xbc, - 0xf0, 0xe8, 0x37, 0x18, 0x90, 0x21, 0xd0, 0xe7, 0x0a, 0x17, 0x41, 0x67, - 0xa3, 0x56, 0x50, 0xe1, 0x52, 0x3e, 0xcd, 0x85, 0x6d, 0x46, 0xda, 0x27, - 0xb4, 0x49, 0x24, 0x9b, 0xae, 0x1e, 0xce, 0x3b, 0xd4, 0xce, 0xec, 0xad, - 0xe0, 0x29, 0x4b, 0xbf, 0xa8, 0x2d, 0x94, 0x23, 0x57, 0xc9, 0x02, 0x8e, - 0x45, 0x89, 0xba, 0xa8, 0x02, 0x8f, 0xec, 0xcc, 0x74, 0x37, 0x76, 0xdb, - 0xc1, 0x67, 0x30, 0xb0, 0xc2, 0xa3, 0x70, 0x39, 0x9b, 0x69, 0x40, 0xa1, - 0x1c, 0xbd, 0xf8, 0x05, 0xbc, 0xad, 0xd0, 0xbe, 0xbd, 0xc6, 0x13, 0xf0, - 0x18, 0x2a, 0x91, 0xda, 0x84, 0x35, 0x8e, 0x12, 0xf9, 0xf4, 0x44, 0x9f, - 0x88, 0x95, 0x95, 0xab, 0x9c, 0x89, 0x6b, 0xfa, 0xd8, 0x71, 0x6f, 0x99, - 0x08, 0x5f, 0xa8, 0x71, 0x6d, 0xe9, 0x7a, 0x29, 0xa9, 0x2c, 0x4e, 0x84, - 0xa4, 0x66, 0x02, 0x65, 0x19, 0xeb, 0x54, 0x5f, 0xdd, 0xbe, 0xdd, 0x58, - 0x5b, 0x89, 0xaa, 0x53, 0xe6, 0x8e, 0xaa, 0x35, 0xc8, 0xa8, 0x9c, 0xf9, - 0x6d, 0x2c, 0xa8, 0xd4, 0x7d, 0x2f, 0x8f, 0x79, 0x02, 0x5b, 0x6e, 0xdf, - 0x33, 0xae, 0xf7, 0x16, 0x20, 0x08, 0xc1, 0x42, 0x5d, 0xbd, 0xd3, 0xcf, - 0x3f, 0x17, 0x39, 0x4f, 0xc7, 0x35, 0x17, 0x27, 0x61, 0x46, 0x14, 0x69, - 0xf8, 0x8e, 0xdc, 0xef, 0x46, 0xe8, 0xc4, 0xe5, 0x9a, 0x98, 0x6c, 0x5b, - 0x41, 0x29, 0x2d, 0x8f, 0xcf, 0x1d, 0xf6, 0xaf, 0x73, 0xb0, 0x03, 0xbd, - 0x2f, 0xc1, 0x10, 0x86, 0xe3, 0xd1, 0x4c, 0x33, 0xac, 0x91, 0xe8, 0x42, - 0xa6, 0x2a, 0xea, 0xde, 0xb4, 0x5c, 0x02, 0xb5, 0x6b, 0x7b, 0x3e, 0x63, - 0xf0, 0x84, 0x1c, 0x6f, 0xfe, 0x64, 0x52, 0x65, 0xf3, 0xc8, 0x4f, 0xae, - 0xde, 0x24, 0x5f, 0x50, 0x9d, 0xa5, 0x0c, 0x94, 0x69, 0xd8, 0x19, 0x2d, - 0xa8, 0x26, 0x6f, 0xb1, 0xca, 0xa9, 0x46, 0xd9, 0x91, 0xf6, 0x34, 0x0b, - 0x33, 0xb1, 0x2f, 0xb0, 0x66, 0xcb, 0x52, 0x3f, 0x22, 0xe5, 0xc8, 0x39, - 0xca, 0x85, 0xb0, 0xf1, 0x52, 0x07, 0xef, 0xfd, 0x64, 0xdb, 0xc6, 0x9c, - 0x1a, 0x8f, 0x92, 0x9d, 0xc1, 0xc8, 0x40, 0xbb, 0xdf, 0x3d, 0xcb, 0x0c, - 0xa3, 0x97, 0x97, 0x0b, 0xb1, 0xf0, 0x8e, 0x45, 0xf0, 0x04, 0x6a, 0x6c, - 0x6f, 0x37, 0xcf, 0x5c, 0x1e, 0xdb, 0xdf, 0x00, 0x7b, 0x36, 0xb0, 0x63, - 0x94, 0x99, 0x47, 0x0b, 0x1b, 0x29, 0x1f, 0xb7, 0xbb, 0x71, 0xb0, 0xc1, - 0xda, 0xd8, 0x58, 0x9d, 0xda, 0x24, 0x61, 0x12, 0xb3, 0xf2, 0x50, 0x02, - 0x1a, 0x61, 0xeb, 0xab, 0xfe, 0xcb, 0x43, 0xe7, 0x48, 0x3b, 0xdf, 0x33, - 0x09, 0xb3, 0x71, 0x11, 0x62, 0x9b, 0x58, 0x17, 0xea, 0xd2, 0x96, 0xc3, - 0xee, 0x25, 0xff, 0x38, 0x60, 0x7f, 0x58, 0xc1, 0x54, 0x35, 0xd2, 0xb3, - 0x46, 0xd5, 0x5b, 0xe8, 0xed, 0xf8, 0xf0, 0x86, 0x61, 0x19, 0xd5, 0x54, - 0x4d, 0x8b, 0xfb, 0xa0, 0x12, 0x0d, 0x67, 0xd8, 0xb2, 0x02, 0x48, 0xae, - 0xc0, 0x6f, 0xdf, 0xf1, 0xf8, 0x31, 0x7f, 0x20, 0x42, 0x63, 0xe6, 0x45, - 0xc9, 0x5f, 0x85, 0x2f, 0x85, 0x1e, 0x96, 0xbd, 0xf4, 0x6d, 0x2a, 0x79, - 0xb4, 0x1e, 0x7c, 0xd8, 0xc8, 0xa1, 0x88, 0xcb, 0xca, 0x4d, 0xda, 0x82, - 0xfc, 0x9f, 0x1e, 0xc1, 0x92, 0x6b, 0x40, 0x69, 0x5a, 0x81, 0xf1, 0x14, - 0xd5, 0x01, 0xa2, 0x69, 0x21, 0xa8, 0x58, 0x52, 0x33, 0xfd, 0x42, 0x04, - 0xa7, 0xc4, 0xe6, 0xe5, 0x48, 0x32, 0xcb, 0x61, 0x0c, 0xff, 0xff, 0x97, - 0x20, 0xfa, 0x27, 0x89, 0x43, 0xd1, 0xab, 0x4a, 0x8d, 0x16, 0xf2, 0x1a, - 0xb4, 0x2c, 0x2c, 0x37, 0x01, 0xb8, 0x45, 0xe9, 0x63, 0xb3, 0x5d, 0x7c, - 0x76, 0xd3, 0x9f, 0xb1, 0x35, 0xc9, 0xf9, 0xbe, 0xf1, 0x79, 0x48, 0x99, - 0x65, 0x8d, 0x8c, 0x5d, 0xc7, 0xae, 0xcc, 0x85, 0xa5, 0x31, 0x14, 0x58, - 0x80, 0xe6, 0xcf, 0xbf, 0x23, 0xa1, 0xd0, 0x5a, 0x09, 0x06, 0x34, 0x02, - 0x9c, 0xd8, 0x53, 0x4e, 0xa0, 0xa8, 0x30, 0xe8, 0xce, 0x48, 0xfb, 0xdc, - 0x04, 0xee, 0x7e, 0xef, 0x97, 0x8f, 0xbe, 0x6f, 0xd8, 0xc1, 0x4e, 0x31, - 0xfe, 0xbb, 0x60, 0xee, 0x4e, 0x1c, 0xbd, 0x21, 0x09, 0x96, 0x72, 0x69, - 0xce, 0xc2, 0x2d, 0xb1, 0x7d, 0x54, 0x46, 0x83, 0xc1, 0xbc, 0x3c, 0x53, - 0x1b, 0xb6, 0xcf, 0xeb, 0x27, 0x7f, 0x98, 0x2a, 0x68, 0xf1, 0x21, 0xee, - 0x14, 0x5b, 0xd7, 0x4a, 0x24, 0xeb, 0xbe, 0x4c, 0x10, 0x47, 0x31, 0xcd, - 0xcb, 0x08, 0x95, 0x0d, 0x5e, 0x7a, 0x5f, 0x57, 0x29, 0xb7, 0x98, 0xa5, - 0x35, 0x7f, 0x35, 0xf1, 0x46, 0x0e, 0xdd, 0xdc, 0xf2, 0xdc, 0xa1, 0xe0, - 0xad, 0xe8, 0x87, 0xa8, 0x91, 0xd7, 0xf9, 0x02, 0x69, 0x5b, 0x7d, 0x6f, - 0x53, 0xbc, 0xa1, 0x0d, 0x95, 0x6f, 0x36, 0x14, 0x3a, 0x13, 0xa4, 0xb4, - 0x85, 0x99, 0x9e, 0x30, 0x95, 0x56, 0x68, 0x23, 0x6c, 0xb4, 0x47, 0x81, - 0x32, 0xbb, 0x80, 0x90, 0x95, 0xc2, 0xd5, 0x83, 0x94, 0x33, 0x2c, 0xa0, - 0x9e, 0x0c, 0x32, 0xa9, 0xc3, 0x96, 0xd1, 0xa1, 0x97, 0xa9, 0x0e, 0x13, - 0xd2, 0xe8, 0xb7, 0xbb, 0xb2, 0x1b, 0xb8, 0xde, 0x09, 0x6d, 0x1c, 0x14, - 0x81, 0x85, 0x33, 0xbd, 0xb1, 0xaa, 0xf9, 0xc9, 0xe5, 0x06, 0x6e, 0x91, - 0x4f, 0xe4, 0xec, 0xa5, 0x12, 0xf3, 0x8f, 0x14, 0x0b, 0xb0, 0x10, 0xf9, - 0x32, 0x4d, 0xf5, 0x6d, 0xa6, 0x54, 0x70, 0x22, 0xb8, 0x41, 0x95, 0xf9, - 0x5d, 0xa0, 0xb5, 0x09, 0xf5, 0xb5, 0x16, 0xf4, 0x09, 0x96, 0x77, 0x7f, - 0xf7, 0x75, 0xd4, 0xc6, 0x43, 0xae, 0xe6, 0xf1, 0xbe, 0xaa, 0x54, 0x90, - 0x34, 0xd0, 0xb4, 0xc0, 0xc8, 0xba, 0xec, 0xb6, 0x9e, 0x6b, 0x83, 0x53, - 0xc4, 0x02, 0x7e, 0xdd, 0x88, 0xcf, 0xbc, 0x10, 0x7a, 0xa0, 0x4c, 0x89, - 0x4b, 0xbd, 0xa3, 0xaa, 0x69, 0x39, 0xb8, 0x1b, 0xfb, 0xc6, 0x16, 0x01, - 0xfd, 0xc0, 0x1a, 0xba, 0xeb, 0x73, 0x0e, 0xd5, 0x8c, 0x92, 0xc1, 0x69, - 0x00, 0x08, 0x4a, 0x2e, 0xc8, 0x77, 0x7e, 0xc2, 0xe3, 0x1c, 0x8e, 0x88, - 0xdc, 0xe5, 0xa5, 0x83, 0x12, 0xc1, 0xb9, 0xd5, 0x4e, 0x10, 0xc7, 0xa7, - 0x3f, 0x43, 0x89, 0x88, 0x6a, 0x13, 0xbd, 0x6f, 0xf2, 0x90, 0x13, 0xc7, - 0x61, 0x39, 0x17, 0x04, 0x73, 0x94, 0x03, 0x12, 0x5c, 0x3e, 0xec, 0xa2, - 0xf4, 0x57, 0xf5, 0xc0, 0xdf, 0x1d, 0x93, 0xde, 0x23, 0x90, 0xf6, 0x3e, - 0x53, 0x32, 0x79, 0x44, 0x31, 0x1c, 0x7e, 0xbb, 0xcc, 0xed, 0x4b, 0x28, - 0x70, 0x7e, 0x19, 0xe1, 0xab, 0xca, 0xf5, 0x0c, 0xf1, 0xd5, 0x3b, 0x22, - 0xeb, 0xe5, 0x63, 0x8b, 0x16, 0xb6, 0x71, 0x78, 0xc6, 0xec, 0x0c, 0x6a, - 0xcb, 0x71, 0xf0, 0xa5, 0x94, 0x23, 0x7f, 0xdf, 0xc5, 0x32, 0xc6, 0xc9, - 0xf7, 0x9d, 0xc9, 0xde, 0xa8, 0x7a, 0xfb, 0x10, 0x68, 0x54, 0x8f, 0xaa, - 0xfb, 0xbd, 0x69, 0xa9, 0xd8, 0x08, 0x63, 0x7a, 0x22, 0x36, 0x6e, 0xb2, - 0xdc, 0xf1, 0xef, 0x63, 0xbe, 0xe4, 0x3d, 0x62, 0x3e, 0xd2, 0xcd, 0xa6, - 0xdd, 0xa7, 0x86, 0x5d, 0xc3, 0x48, 0x1b, 0xac, 0x4e, 0x7d, 0x18, 0x2d, - 0x52, 0x8a, 0x57, 0xda, 0x7e, 0xf3, 0x7d, 0xcf, 0x46, 0xfd, 0x18, 0xb0, - 0x43, 0xb2, 0x3a, 0x90, 0x7a, 0xa2, 0x9e, 0x7d, 0x90, 0x92, 0x15, 0x46, - 0x98, 0x4c, 0x4c, 0x19, 0x76, 0x6f, 0x97, 0x93, 0x98, 0x9b, 0xaa, 0xaf, - 0x6d, 0x54, 0xef, 0x08, 0x02, 0x14, 0x14, 0xd2, 0x62, 0x95, 0xa4, 0xe0, - 0x3f, 0xbd, 0xcd, 0x4e, 0x74, 0x4b, 0xb1, 0x23, 0x4c, 0x61, 0x8c, 0x0c, - 0x07, 0xe0, 0xfd, 0x7a, 0x20, 0x63, 0x23, 0x62, 0x29, 0xd6, 0xa7, 0x3c, - 0xe9, 0xaa, 0x0c, 0x5e, 0xde, 0x78, 0xf7, 0x78, 0x53, 0x0c, 0xd0, 0xfb, - 0xa5, 0x7f, 0x46, 0xf2, 0x7b, 0x35, 0xc8, 0xa4, 0xa9, 0xcc, 0x94, 0x8d, - 0xdc, 0xf2, 0x63, 0x12, 0x1e, 0xc2, 0xf2, 0xa7, 0xa6, 0x17, 0x43, 0x92, - 0xa4, 0x80, 0x70, 0xb7, 0xc8, 0x1a, 0xb8, 0xf9, 0x1b, 0xfd, 0xd7, 0x27, - 0xd7, 0xee, 0xdc, 0x2a, 0x95, 0x6b, 0x5d, 0x9d, 0xa1, 0xda, 0xdb, 0xba, - 0xb6, 0x31, 0x5a, 0x89, 0x43, 0x57, 0x11, 0x37, 0xf0, 0xfd, 0xb1, 0x2a, - 0xa4, 0x11, 0x95, 0xe8, 0x84, 0x11, 0x75, 0x9d, 0xf3, 0xaf, 0x56, 0x2c, - 0x4b, 0x60, 0xc0, 0x17, 0xc7, 0x3b, 0x9b, 0x7f, 0xb2, 0xa7, 0x67, 0xa7, - 0xd3, 0xf3, 0x1f, 0x1f, 0x5c, 0x2d, 0x1a, 0xbb, 0x28, 0x01, 0x0d, 0x6f, - 0xc2, 0x7e, 0xcb, 0x35, 0x9a, 0x25, 0xf4, 0x14, 0xe4, 0xd0, 0x20, 0xe8, - 0xa2, 0xf5, 0x51, 0x7d, 0x1c, 0xc0, 0xb5, 0xf9, 0xfe, 0x8f, 0x7d, 0x0f, - 0x30, 0xe0, 0xdd, 0xc6, 0xfc, 0xd6, 0xca, 0x4a, 0xbb, 0x6d, 0x08, 0x34, - 0x4f, 0x93, 0x44, 0x38, 0x30, 0xbc, 0xfa, 0x46, 0xfb, 0x3c, 0xbd, 0xe2, - 0x4f, 0x24, 0x54, 0x97, 0x7d, 0x5f, 0xf3, 0x31, 0x20, 0x5b, 0x5e, 0x89, - 0x88, 0x7f, 0xf9, 0x09, 0xf8, 0xb4, 0x07, 0xc7, 0x6f, 0xc3, 0x84, 0xde, - 0x28, 0xbc, 0xee, 0x11, 0x85, 0x14, 0x03, 0xf6, 0x6f, 0x68, 0x0d, 0x19, - 0x8a, 0x5d, 0x18, 0xe8, 0x7b, 0xa5, 0x7a, 0x93, 0x2a, 0xfc, 0x9c, 0x08, - 0xce, 0x1f, 0x09, 0xc5, 0x34, 0x51, 0xd0, 0xe6, 0x14, 0x7a, 0xb7, 0x40, - 0x67, 0x2f, 0x11, 0x94, 0x09, 0x46, 0xae, 0xfc, 0xea, 0x60, 0xfe, 0x44, - 0x27, 0x94, 0x7e, 0xb8, 0x72, 0x05, 0x1b, 0x17, 0x03, 0xa9, 0x3f, 0x7e, - 0x8b, 0x08, 0x2f, 0x95, 0x1a, 0x6a, 0x25, 0x75, 0x95, 0x7a, 0x14, 0xe2, - 0xaf, 0x57, 0x68, 0x23, 0xa6, 0x98, 0x8d, 0xb7, 0x65, 0x0a, 0x23, 0x2c, - 0x30, 0x15, 0x0d, 0x2f, 0x8f, 0xa6, 0x6e, 0x9d, 0x68, 0x37, 0x17, 0x40, - 0x2f, 0x44, 0xc4, 0x0b, 0xb0, 0x27, 0x0c, 0x24, 0x6c, 0x9e, 0x62, 0xa1, - 0x91, 0x0e, 0x0c, 0xca, 0xbf, 0x01, 0x00, 0x42, 0x69, 0x6c, 0x23, 0x00, - 0x67, 0x83, 0x95, 0x96, 0x77, 0x36, 0x69, 0x22, 0x29, 0x13, 0xeb, 0x85, - 0xda, 0x6d, 0x45, 0x55, 0x33, 0xe6, 0xb3, 0x95, 0x6b, 0x66, 0xe3, 0x7c, - 0xcc, 0xd9, 0x3b, 0xe2, 0x13, 0x07, 0xe3, 0x7c, 0x40, 0x5f, 0xaa, 0x95, - 0x8d, 0x9d, 0x1e, 0xd8, 0xf3, 0x0c, 0xdc, 0xf0, 0x7d, 0x73, 0xe0, 0x58, - 0xac, 0xb2, 0x9b, 0xde, 0x42, 0x19, 0xdb, 0xc0, 0xa4, 0xe3, 0x3b, 0xe3, - 0x07, 0x7a, 0xb1, 0x61, 0xba, 0xc1, 0xdd, 0xa6, 0x12, 0x51, 0x86, 0x00, - 0xf5, 0x77, 0x19, 0xd6, 0x53, 0x40, 0xed, 0x02, 0xf8, 0x96, 0x38, 0x78, - 0x10, 0xa8, 0x1d, 0x24, 0xee, 0x96, 0x51, 0x85, 0x52, 0xfc, 0xa4, 0x7d, - 0x60, 0x35, 0x2e, 0x6c, 0x4b, 0x18, 0x8d, 0xa8, 0xbd, 0xce, 0x76, 0x8d, - 0x13, 0xc6, 0x20, 0x21, 0x2a, 0x0e, 0xf6, 0xad, 0xc0, 0x1c, 0x26, 0x44, - 0xe8, 0xdf, 0xed, 0x72, 0x0d, 0x14, 0x94, 0x92, 0x6a, 0xf1, 0xc0, 0xfa, - 0xbf, 0xad, 0xb1, 0xa4, 0x3c, 0xba, 0x96, 0x14, 0x5b, 0x30, 0xa1, 0xea, - 0xe6, 0x94, 0x55, 0xa3, 0xe8, 0xbd, 0xd5, 0x73, 0x7a, 0x77, 0x18, 0x2b, - 0xee, 0x19, 0x4c, 0xe3, 0xb3, 0x3b, 0x81, 0x9c, 0x91, 0xc5, 0x7f, 0xeb, - 0xc0, 0xf7, 0x81, 0x2a, 0xe7, 0x60, 0x32, 0x9f, 0x2e, 0x9b, 0x66, 0x4d, - 0x20, 0x51, 0x94, 0xb8, 0xd8, 0xf4, 0x46, 0x5a, 0x34, 0x01, 0x3e, 0x9a, - 0xbc, 0xe5, 0xfd, 0x2c, 0x2e, 0x08, 0x6c, 0x0e, 0x92, 0x9b, 0x24, 0x70, - 0xf0, 0x4d, 0xa4, 0x69, 0x1b, 0x5b, 0x28, 0x61, 0xdf, 0x00, 0x8a, 0x60, - 0x19, 0x72, 0xa0, 0x7c, 0xfd, 0xd3, 0x0e, 0x44, 0xfe, 0xdd, 0xe9, 0xac, - 0x2b, 0x66, 0x2d, 0x89, 0x83, 0xbf, 0xe1, 0xeb, 0xb6, 0xcc, 0x55, 0xdc, - 0x3f, 0xc7, 0x37, 0xbc, 0xb2, 0x82, 0x9b, 0xae, 0xd9, 0x32, 0xe1, 0x54, - 0x5e, 0x09, 0xce, 0x33, 0x79, 0xc2, 0x25, 0xd4, 0x3a, 0x5e, 0x6b, 0xf1, - 0x03, 0xe8, 0x0b, 0x89, 0xad, 0xbb, 0x63, 0x65, 0x83, 0xd3, 0x27, 0x3d, - 0x17, 0x27, 0x8c, 0x8b, 0x44, 0x6b, 0xef, 0x95, 0x83, 0x40, 0x70, 0x40, - 0xde, 0x9b, 0x97, 0x79, 0x14, 0xa8, 0xec, 0x22, 0x3a, 0x08, 0xbe, 0x04, - 0xe3, 0xf5, 0xcc, 0x25, 0x99, 0xd8, 0xbc, 0x63, 0x61, 0x11, 0x1b, 0xb2, - 0xbb, 0x1e, 0x09, 0xb5, 0x48, 0xf1, 0x1a, 0xef, 0xe6, 0x53, 0x6c, 0x09, - 0xdc, 0x91, 0x63, 0xd3, 0xef, 0x85, 0x41, 0x7c, 0xff, 0x4c, 0x27, 0x0f, - 0x84, 0xb2, 0xe5, 0x0e, 0x1e, 0x48, 0xb6, 0x08, 0x82, 0xf6, 0x33, 0xab, - 0x40, 0x52, 0x89, 0xa4, 0x1e, 0x53, 0x8d, 0x3f, 0xcc, 0x76, 0x36, 0x31, - 0xed, 0x87, 0x88, 0x90, 0xf1, 0x68, 0xcb, 0x00, 0xbd, 0xa1, 0x34, 0xe9, - 0x3d, 0xf0, 0xb1, 0xec, 0xee, 0x7b, 0x81, 0x37, 0xc5, 0x39, 0x01, 0xfe, - 0x2f, 0xe2, 0x00, 0xdc, 0x37, 0x5d, 0x7c, 0x8e, 0xf3, 0xae, 0xc4, 0x1b, - 0x1f, 0xe4, 0x80, 0xfd, 0x76, 0x9e, 0xcd, 0x82, 0x06, 0x20, 0xae, 0x34, - 0x73, 0x43, 0xde, 0x25, 0x95, 0x4b, 0x78, 0x92, 0xf5, 0x3d, 0x80, 0x34, - 0x9b, 0x10, 0x4a, 0xe0, 0x52, 0x3e, 0x81, 0x54, 0xbb, 0xf9, 0x36, 0x9e, - 0x37, 0x1c, 0x1c, 0x44, 0xe5, 0xdc, 0x4b, 0x75, 0x0c, 0xe1, 0xa9, 0xb6, - 0x89, 0xf3, 0x26, 0xf0, 0x9a, 0x3b, 0x63, 0x68, 0x71, 0x63, 0xe2, 0x11, - 0x02, 0x78, 0x6d, 0x44, 0xaa, 0xb3, 0x53, 0xf9, 0x1c, 0x56, 0x2e, 0xd9, - 0xef, 0x9d, 0x9a, 0xb0, 0xa0, 0xc6, 0xcc, 0x39, 0x87, 0x2b, 0x95, 0xf0, - 0x29, 0x5b, 0x1c, 0x57, 0x8d, 0x1b, 0x6a, 0xfc, 0x08, 0xea, 0xe2, 0x1a, - 0xe2, 0xcc, 0x45, 0x6d, 0x0f, 0x4a, 0xae, 0x9b, 0x0b, 0x85, 0xa5, 0xad, - 0xe7, 0x33, 0xfb, 0x95, 0x50, 0x1c, 0x54, 0xd4, 0x5d, 0xca, 0x3a, 0x15, - 0xe2, 0x84, 0xb1, 0x34, 0xb4, 0x88, 0xb5, 0x4e, 0x68, 0xcb, 0xb3, 0x42, - 0xc1, 0x31, 0x40, 0x5b, 0xf7, 0x5d, 0x56, 0xe1, 0x3e, 0x90, 0xdb, 0x00, - 0x8f, 0xaf, 0x1c, 0x9a, 0x47, 0x7f, 0x7b, 0x8e, 0x5a, 0x8a, 0xae, 0xdb, - 0xb4, 0x3e, 0x7d, 0x0a, 0x7c, 0x33, 0x05, 0x0f, 0x24, 0x56, 0x92, 0xcb, - 0x2e, 0x46, 0xcc, 0xb2, 0x0d, 0xb1, 0x0f, 0xee, 0x6c, 0xf5, 0xb1, 0x7a, - 0x9c, 0x39, 0xab, 0x31, 0x4f, 0x83, 0x00, 0x1a, 0xb8, 0x0c, 0x24, 0xe0, - 0x17, 0x56, 0xfb, 0xae, 0xd3, 0x35, 0x0e, 0xd1, 0xf1, 0xb8, 0x0a, 0x6c, - 0xfd, 0xd4, 0x31, 0x9c, 0x69, 0x33, 0x68, 0x4c, 0x9d, 0xb7, 0xd3, 0x64, - 0xd0, 0xa2, 0x33, 0x8c, 0x8d, 0x96, 0x20, 0x21, 0xaa, 0xd3, 0xd8, 0xfb, - 0x0f, 0x8a, 0x31, 0x9c, 0x70, 0x50, 0x3c, 0x90, 0x2f, 0xf4, 0x92, 0x94, - 0xd1, 0x9d, 0x51, 0x67, 0xdb, 0x4c, 0x95, 0xa7, 0xd4, 0xde, 0x77, 0x0f, - 0x45, 0x48, 0x75, 0xd0, 0xa0, 0x46, 0x63, 0x0a, 0xf0, 0x32, 0xcf, 0xbd, - 0xf5, 0x52, 0x50, 0x5a, 0xab, 0x2c, 0x43, 0xe3, 0x39, 0x9c, 0x34, 0xe8, - 0x38, 0xff, 0x6a, 0x2e, 0x43, 0x15, 0x6d, 0x97, 0x07, 0xc9, 0xc5, 0x78, - 0xb7, 0x6c, 0x6b, 0x0b, 0xb5, 0x42, 0x1c, 0x87, 0x96, 0xb4, 0x76, 0x42, - 0x51, 0x64, 0xe9, 0x13, 0x90, 0x98, 0x05, 0x1c, 0x88, 0x9a, 0x21, 0xbd, - 0x1b, 0x55, 0xba, 0x74, 0x8f, 0x55, 0x44, 0x36, 0x81, 0x5e, 0x85, 0xc1, - 0xd3, 0xb0, 0xa1, 0xa6, 0x20, 0x8c, 0xa1, 0x00, 0xff, 0xad, 0x8f, 0xfd, - 0xc8, 0x2e, 0x8d, 0xb9, 0x6f, 0x59, 0xc5, 0x6a, 0x60, 0x35, 0xf8, 0x66, - 0x49, 0xab, 0x64, 0x53, 0xbf, 0x5a, 0x0f, 0xdd, 0xf0, 0x63, 0x18, 0xd2, - 0x33, 0x57, 0xf0, 0xe1, 0xea, 0xb0, 0x50, 0x4a, 0x67, 0x3d, 0x9d, 0xf6, - 0x95, 0x35, 0xf7, 0x0b, 0xca, 0x8f, 0xe5, 0x05, 0x2a, 0x48, 0x8f, 0xe8, - 0x38, 0xdd, 0x25, 0x64, 0x3d, 0x25, 0x8d, 0xfb, 0x2c, 0x4b, 0x12, 0xf3, - 0x2b, 0xd6, 0x78, 0xec, 0x1b, 0xb7, 0x52, 0x05, 0xf8, 0x15, 0x1c, 0x09, - 0xe4, 0xec, 0xb2, 0x69, 0x3d, 0xac, 0x12, 0xb2, 0x85, 0x9e, 0x00, 0xce, - 0x6e, 0xdf, 0x0b, 0xdd, 0x2b, 0x88, 0xef, 0x46, 0xb7, 0xec, 0x5b, 0xbb, - 0x91, 0xbd, 0x9c, 0xd0, 0x78, 0xca, 0xeb, 0xc0, 0x00, 0x66, 0x9c, 0xcb, - 0x0b, 0xab, 0x7b, 0xb5, 0x15, 0xaa, 0x69, 0xf8, 0x63, 0x17, 0x5a, 0x16, - 0x28, 0x8d, 0xd9, 0x27, 0x26, 0xec, 0x75, 0x98, 0x7c, 0x18, 0xed, 0xb9, - 0x56, 0xb0, 0xc2, 0xef, 0x6f, 0xd5, 0xec, 0x5b, 0x7b, 0x5d, 0xde, 0x6b, - 0xcd, 0x7f, 0x5b, 0x50, 0xdb, 0x3c, 0xa2, 0x77, 0x3c, 0x0e, 0x68, 0x24, - 0xd1, 0x4a, 0x95, 0xe5, 0x4b, 0x0f, 0xa5, 0x26, 0x5c, 0xb3, 0x87, 0x82, - 0xb9, 0x3d, 0x53, 0xb2, 0x07, 0x56, 0x40, 0xfc, 0xe2, 0xdc, 0x2d, 0x11, - 0xa7, 0x06, 0xc1, 0xa7, 0xd9, 0x1a, 0x5a, 0x14, 0xeb, 0x06, 0x5e, 0x74, - 0x9b, 0xd6, 0xca, 0xb3, 0xea, 0x27, 0xfe, 0xcd, 0xf3, 0x0f, 0x8a, 0xbf, - 0x98, 0xa2, 0x87, 0xa4, 0x0c, 0xfe, 0xb6, 0x0f, 0x4c, 0x0e, 0x30, 0xb1, - 0x05, 0xbe, 0x19, 0xbb, 0x37, 0xbd, 0x38, 0x76, 0xf6, 0xab, 0xf3, 0x36, - 0x1e, 0xa9, 0x75, 0x3e, 0x28, 0x8f, 0x5b, 0xc5, 0x7d, 0xc4, 0x1d, 0x78, - 0x30, 0x32, 0x1d, 0x3c, 0x20, 0xac, 0x5f, 0x65, 0xf1, 0x6b, 0xe0, 0xa4, - 0x6e, 0x55, 0x40, 0x49, 0x74, 0x4c, 0xd6, 0x3a, 0xe4, 0xb4, 0x7b, 0xf8, - 0xc9, 0xbd, 0xda, 0xf0, 0x05, 0x01, 0xc8, 0x5e, 0x40, 0xbb, 0xe9, 0xee, - 0x77, 0x8d, 0x8f, 0x0c, 0xc4, 0x00, 0x7d, 0x9e, 0xbb, 0x36, 0x3f, 0x51, - 0x31, 0xc5, 0xf4, 0xc3, 0x20, 0xb8, 0x24, 0xf0, 0xec, 0x3e, 0x0e, 0xe8, - 0xa9, 0x56, 0xb8, 0x32, 0xa8, 0x81, 0x14, 0x6d, 0x41, 0xad, 0x1f, 0x8c, - 0xc1, 0x5e, 0x5a, 0x68, 0x29, 0x7b, 0xcb, 0x19, 0x2a, 0x4b, 0x79, 0x96, - 0x88, 0xcf, 0xbc, 0x10, 0x79, 0xc0, 0x4c, 0x88, 0x4a, 0x7d, 0xa3, 0xaa, - 0x69, 0x39, 0xb8, 0x1b, 0xf0, 0xe0, 0x99, 0xf3, 0x5b, 0x4a, 0x20, 0x05, - 0xa8, 0xc0, 0x75, 0xe9, 0x9a, 0x82, 0x11, 0xe5, 0xbd, 0x75, 0x84, 0xf6, - 0x43, 0x5e, 0xe9, 0x8f, 0x11, 0xac, 0x90, 0xea, 0xf7, 0x3c, 0x9f, 0x2e, - 0x01, 0x60, 0x4c, 0x5d, 0xf4, 0x59, 0x8b, 0xd0, 0x09, 0xf6, 0x74, 0xb9, - 0xef, 0x85, 0x7f, 0x67, 0xa2, 0xb0, 0xd0, 0x4d, 0x55, 0x97, 0xbb, 0x22, - 0x91, 0x39, 0xda, 0xb8, 0x23, 0x16, 0xbe, 0x75, 0xde, 0x4e, 0xc6, 0xc3, - 0xf5, 0x51, 0x7a, 0xf7, 0x1a, 0x6b, 0x28, 0xe3, 0x7a, 0xb7, 0xaf, 0xc1, - 0xe5, 0x97, 0x24, 0xd5, 0x58, 0xd6, 0x01, 0xa9, 0xac, 0xad, 0x1e, 0xf4, - 0xb6, 0x04, 0x0f, 0x01, 0x39, 0x45, 0x00, 0xcb, 0x45, 0x14, 0x98, 0x52, - 0x9f, 0x93, 0x48, 0xc6, 0x08, 0xe1, 0x59, 0xd0, 0x9c, 0xbd, 0xd9, 0x9c, - 0x4e, 0xb7, 0x15, 0x12, 0x2d, 0x96, 0x7c, 0x54, 0xb4, 0xbc, 0xcb, 0x19, - 0xb9, 0x31, 0x24, 0x6c, 0x29, 0xd0, 0xcc, 0x8c, 0x7a, 0x73, 0x9f, 0x85, - 0x8d, 0xca, 0xe9, 0xcc, 0x02, 0xeb, 0x0d, 0x23, 0xe5, 0x92, 0x1e, 0x16, - 0x8a, 0xec, 0x28, 0xfc, 0x94, 0x2e, 0xf8, 0x35, 0x0b, 0xa1, 0x47, 0x5e, - 0xf2, 0xf6, 0x94, 0xda, 0x4d, 0xe2, 0x94, 0x10, 0x17, 0x4a, 0x6d, 0xf3, - 0xa5, 0x81, 0x79, 0x20, 0x98, 0x57, 0x58, 0x22, 0x36, 0xb3, 0x9a, 0xdf, - 0x73, 0xa4, 0x33, 0x5f, 0xa6, 0xb3, 0x34, 0xc2, 0x2a, 0xeb, 0x80, 0x9c, - 0xb9, 0x39, 0x21, 0x42, 0x1b, 0x59, 0x39, 0xce, 0x7e, 0xa2, 0x07, 0x76, - 0x0c, 0xd6, 0xa4, 0x8d, 0x81, 0x66, 0x98, 0xda, 0x9d, 0xf6, 0x2f, 0xad, - 0xf7, 0x30, 0x42, 0x67, 0x35, 0x56, 0x35, 0x1d, 0x0d, 0x8d, 0x74, 0xda, - 0x22, 0x14, 0x03, 0xa5, 0x2d, 0xeb, 0x30, 0x8c, 0x1c, 0x0a, 0xf5, 0xc6, - 0xc7, 0x8e, 0x52, 0xe3, 0x89, 0xbf, 0x9b, 0x3c, 0x28, 0xf1, 0x8b, 0x2c, - 0xf8, 0x18, 0xbb, 0xf8, 0x4e, 0xa1, 0x0f, 0xa4, 0x80, 0x19, 0x7b, 0xd5, - 0x67, 0x34, 0x59, 0x69, 0x84, 0x60, 0xc1, 0xbd, 0xeb, 0xed, 0x17, 0x11, - 0x4a, 0x32, 0x49, 0xa5, 0x09, 0x8f, 0x3a, 0x7b, 0xf5, 0x18, 0x4c, 0x45, - 0x19, 0x9e, 0xf3, 0x1f, 0x05, 0xb4, 0xa6, 0x77, 0x65, 0x88, 0x78, 0x3d, - 0x63, 0x03, 0xf8, 0xa9, 0x20, 0x5e, 0x50, 0x0d, 0x75, 0xd3, 0x99, 0x1f, - 0x17, 0x9f, 0xa9, 0xfb, 0xe9, 0xd4, 0x02, 0xff, 0xe6, 0xa6, 0x9b, 0xea, - 0x89, 0x28, 0xe3, 0xf0, 0xb7, 0x8d, 0xd7, 0x01, 0x4a, 0xd4, 0xdd, 0xf2, - 0x30, 0x9c, 0x14, 0xbf, 0x11, 0x24, 0xf3, 0xd5, 0x3b, 0x79, 0xce, 0x7f, - 0xbd, 0x80, 0x29, 0x2b, 0xd7, 0x04, 0xee, 0x35, 0xa4, 0x38, 0x4a, 0x30, - 0x88, 0x88, 0x1a, 0x28, 0xdf, 0xd1, 0x5f, 0x31, 0x2b, 0x5b, 0xd8, 0x3a, - 0xac, 0xf4, 0x59, 0x02, 0xea, 0xfb, 0x42, 0x94, 0x64, 0x44, 0xdc, 0x2a, - 0xa3, 0x30, 0x81, 0x99, 0x82, 0x5c, 0x4a, 0xee, 0xef, 0xd6, 0xc6, 0x58, - 0x7f, 0x01, 0x3b, 0x05, 0x21, 0x67, 0xe6, 0x0b, 0xb5, 0xf9, 0xb4, 0x9d, - 0x98, 0xfe, 0x0b, 0xe6, 0x69, 0xd9, 0x86, 0x60, 0xfa, 0x4d, 0xe6, 0xac, - 0xd6, 0xf0, 0xd2, 0x8e, 0x8f, 0xe0, 0x3c, 0xcb, 0x5a, 0x74, 0xb0, 0xe8, - 0x20, 0xd4, 0x72, 0x45, 0x73, 0xa2, 0x0d, 0xc3, 0xe2, 0x77, 0xc6, 0xcd, - 0x75, 0x87, 0x19, 0xdc, 0x50, 0x25, 0x47, 0x0e, 0x9f, 0xc1, 0x6e, 0x52, - 0xdc, 0x26, 0x25, 0x29, 0x3f, 0x2e, 0x9e, 0xe7, 0xbb, 0xcc, 0xb9, 0x96, - 0x97, 0xbc, 0xad, 0xac, 0xdb, 0xa0, 0xae, 0xe7, 0xb8, 0x4f, 0xe8, 0x88, - 0x95, 0xba, 0xe7, 0xbd, 0x28, 0x5b, 0x4d, 0xed, 0x7b, 0x60, 0x1c, 0xeb, - 0x57, 0x94, 0xd9, 0x2a, 0x69, 0x48, 0x00, 0xca, 0xe8, 0x3c, 0xda, 0x37, - 0xb8, 0xc7, 0x28, 0x3d, 0x58, 0xad, 0xd4, 0xde, 0xf8, 0x2f, 0xac, 0xe5, - 0x29, 0x9f, 0x06, 0xd8, 0xb2, 0x83, 0x63, 0xcc, 0xa0, 0xf7, 0x79, 0x08, - 0x6a, 0x6c, 0x30, 0x26, 0x6d, 0x1b, 0x47, 0xc7, 0x02, 0x65, 0x61, 0x4b, - 0x61, 0xf7, 0x35, 0x69, 0xd1, 0xc7, 0xae, 0x75, 0xf0, 0xb3, 0xe0, 0xa4, - 0x26, 0xbd, 0xc8, 0x8a, 0x67, 0xd5, 0x1c, 0x4c, 0x9f, 0x51, 0x8b, 0xa6, - 0x89, 0x0a, 0x99, 0x9a, 0x1e, 0x7f, 0xa7, 0x23, 0x0c, 0xc4, 0xa6, 0x29, - 0xd4, 0xd2, 0x9b, 0x29, 0x97, 0xfa, 0xb2, 0xe4, 0x9e, 0xcf, 0x4e, 0x8a, - 0x66, 0xe9, 0x9a, 0x51, 0x15, 0x6a, 0x54, 0xd0, 0x08, 0x84, 0x21, 0x80, - 0x8d, 0x8e, 0x01, 0xf1, 0x66, 0x81, 0x5b, 0xb1, 0xdb, 0x10, 0xea, 0x90, - 0x2a, 0xf3, 0x8b, 0x21, 0x37, 0x2c, 0x77, 0xf0, 0x72, 0x01, 0x5a, 0x15, - 0x52, 0x9b, 0x33, 0xcf, 0xd9, 0x20, 0x70, 0x52, 0x8e, 0x25, 0x32, 0x96, - 0x43, 0xbd, 0xf1, 0x1a, 0x59, 0x8f, 0xb2, 0x3b, 0x42, 0x0b, 0x4c, 0x1b, - 0xd3, 0xcf, 0xab, 0xea, 0x72, 0xb6, 0x88, 0x56, 0x41, 0x1d, 0xd3, 0x92, - 0x8b, 0x4a, 0x66, 0x9e, 0x9e, 0xf1, 0x57, 0xc6, 0x65, 0xc9, 0x28, 0x9c, - 0x24, 0x97, 0xb9, 0x1f, 0x4a, 0x8f, 0xb8, 0xd5, 0xa3, 0x23, 0xb5, 0x82, - 0x16, 0x8f, 0x82, 0x3d, 0xa4, 0x0e, 0xc3, 0xbb, 0x1a, 0xf3, 0x19, 0xae, - 0x5d, 0xf0, 0xc3, 0x44, 0xc6, 0x0b, 0xe6, 0x09, 0xf3, 0xdd, 0xc0, 0xcb, - 0x1d, 0xc0, 0xca, 0xc4, 0x7e, 0x1c, 0x68, 0x57, 0x53, 0xd5, 0xbf, 0x4d, - 0xe9, 0xf1, 0xf2, 0xe6, 0x34, 0x60, 0xa0, 0x02, 0xf8, 0x4f, 0x8f, 0x14, - 0x82, 0x76, 0xe0, 0xe6, 0x3c, 0xc3, 0x0a, 0x43, 0xcb, 0xc9, 0x9e, 0xe9, - 0x85, 0xfd, 0x16, 0x7a, 0x03, 0xb5, 0xcf, 0xa5, 0xb8, 0x65, 0xd4, 0xa2, - 0x46, 0x3d, 0xf0, 0x83, 0x59, 0xc0, 0x4c, 0x71, 0x62, 0x78, 0xc5, 0x30, - 0xce, 0xcc, 0x91, 0xe5, 0x09, 0xde, 0x65, 0xa9, 0xc0, 0xe9, 0x74, 0xb0, - 0x19, 0xa6, 0x30, 0x76, 0xaf, 0x99, 0x54, 0x0b, 0x7e, 0x4f, 0xff, 0x93, - 0xf3, 0x90, 0x62, 0x36, 0x73, 0x8f, 0x72, 0xce, 0xef, 0x6e, 0xcb, 0xd9, - 0x8e, 0x02, 0x01, 0x3d, 0x63, 0x60, 0x2c, 0x0f, 0xc4, 0x56, 0xf3, 0xa7, - 0xc7, 0xc3, 0x77, 0x08, 0xd5, 0x53, 0xf7, 0xf2, 0xd1, 0x0e, 0xfa, 0x2d, - 0xab, 0xdb, 0x64, 0x85, 0xaa, 0x01, 0xa7, 0x9d, 0x35, 0x08, 0xdf, 0x79, - 0xd0, 0x6e, 0x27, 0x54, 0x59, 0x07, 0x2d, 0xc4, 0x80, 0xb0, 0xdb, 0x62, - 0x32, 0xdc, 0x6c, 0x36, 0xf2, 0xb6, 0x54, 0x07, 0x60, 0x56, 0x5e, 0x73, - 0x91, 0x8d, 0xb1, 0x5f, 0x04, 0xcc, 0x8f, 0xcb, 0xa8, 0xb6, 0x6a, 0xcd, - 0x06, 0xc9, 0x94, 0x5c, 0xbd, 0xb3, 0x70, 0x39, 0xab, 0xf5, 0x3f, 0x94, - 0xcd, 0xa3, 0x48, 0x7e, 0x42, 0x45, 0xc5, 0xef, 0xd0, 0x6a, 0xe1, 0x90, - 0x48, 0x5e, 0x7d, 0x10, 0xa6, 0x86, 0x98, 0xef, 0xd7, 0xc5, 0x92, 0x73, - 0x88, 0x65, 0x47, 0x53, 0x7d, 0xef, 0x1e, 0x35, 0x58, 0xd9, 0xeb, 0xe3, - 0x77, 0x01, 0x46, 0x2a, 0x7e, 0xfb, 0x87, 0xbb, 0x65, 0x92, 0x27, 0x51, - 0x98, 0x9c, 0xcd, 0xe1, 0x60, 0x24, 0x8a, 0x23, 0x16, 0x7d, 0x50, 0x1e, - 0x85, 0xd5, 0xfc, 0x91, 0xed, 0x2d, 0x25, 0x42, 0xa2, 0x32, 0x28, 0x6d, - 0x26, 0xcc, 0xac, 0xca, 0x8a, 0x0f, 0x73, 0x92, 0x11, 0xba, 0x59, 0x0f, - 0x92, 0x02, 0xb0, 0x38, 0xac, 0x1d, 0x6d, 0x13, 0x02, 0xb7, 0xc2, 0x24, - 0xeb, 0xa6, 0xd3, 0xfb, 0xec, 0x67, 0xd2, 0x86, 0x03, 0x09, 0x42, 0xf8, - 0xf6, 0x2b, 0xa8, 0x5c, 0x02, 0x89, 0x60, 0x52, 0x73, 0x64, 0x58, 0xfc, - 0x00, 0xfd, 0x25, 0x33, 0xfe, 0x54, 0x22, 0x43, 0x3b, 0x64, 0x8c, 0x46, - 0xec, 0xfe, 0x52, 0xa9, 0x89, 0x1a, 0xc4, 0x95, 0x8a, 0x2a, 0xd8, 0x6e, - 0xed, 0xa5, 0x44, 0x5e, 0xdf, 0xec, 0x22, 0x0e, 0x88, 0x18, 0x99, 0x0d, - 0x96, 0x09, 0xbe, 0x1b, 0x11, 0xb2, 0xea, 0x16, 0x5c, 0x46, 0x9c, 0x58, - 0x9a, 0x37, 0xdd, 0x4d, 0x61, 0xd5, 0x99, 0xe8, 0x7e, 0xeb, 0x9c, 0x63, - 0x33, 0xac, 0x77, 0x18, 0x78, 0xc5, 0x27, 0x4a, 0xee, 0xb1, 0x91, 0x64, - 0xfe, 0xe9, 0x79, 0x2e, 0x70, 0x28, 0xda, 0xc6, 0xaa, 0xdc, 0xd6, 0x49, - 0xb8, 0x92, 0x15, 0x81, 0x6b, 0x23, 0xd7, 0xb8, 0x7b, 0xdf, 0x3f, 0x36, - 0xe9, 0x1b, 0x15, 0x54, 0x11, 0xf2, 0xc5, 0xde, 0x44, 0xc3, 0x68, 0xc5, - 0xf5, 0x0e, 0xad, 0x4c, 0x8d, 0x72, 0x61, 0xfd, 0x62, 0xa3, 0x81, 0x85, - 0xf9, 0x96, 0x37, 0x42, 0xe8, 0x5a, 0x67, 0x68, 0x07, 0x26, 0x29, 0x0a, - 0x4d, 0x3a, 0xd7, 0x73, 0x1c, 0xfa, 0xe4, 0x32, 0xe7, 0x70, 0x09, 0xbf, - 0xb7, 0x35, 0x6f, 0xda, 0xd9, 0x38, 0x3c, 0x72, 0xfa, 0x0f, 0x6c, 0x80, - 0x97, 0x24, 0xfd, 0xc7, 0x48, 0x7a, 0x0b, 0x97, 0x15, 0xdb, 0xdf, 0xcb, - 0x0e, 0x76, 0x89, 0x63, 0xba, 0x20, 0xfd, 0x0a, 0x8a, 0x01, 0x41, 0x88, - 0x1d, 0xf8, 0xbe, 0x26, 0x7e, 0xb1, 0xf2, 0x94, 0x49, 0x18, 0x1b, 0xd8, - 0x7b, 0x25, 0x0a, 0x29, 0x88, 0x89, 0xc7, 0xec, 0x55, 0x87, 0x85, 0x0c, - 0xff, 0x92, 0x85, 0xe3, 0xaa, 0x2c, 0x46, 0x5c, 0x90, 0xf7, 0xd7, 0x37, - 0x13, 0x24, 0xde, 0x3e, 0xdf, 0xb2, 0x0a, 0xa8, 0x79, 0x9f, 0x9c, 0xc8, - 0x28, 0x96, 0xe1, 0x90, 0xcb, 0x0c, 0x3c, 0x2b, 0x6f, 0x97, 0x34, 0x3d, - 0x31, 0x45, 0x44, 0xd1, 0x29, 0xe9, 0xc6, 0x4e, 0x29, 0xa4, 0x27, 0x4a, - 0xed, 0x33, 0x55, 0x18, 0x7c, 0xce, 0x48, 0x0b, 0x00, 0xe5, 0xe8, 0x97, - 0x2a, 0x1a, 0x56, 0xbe, 0xdd, 0xe1, 0x8c, 0x35, 0xf6, 0x78, 0x29, 0x21, - 0x45, 0x2b, 0x0f, 0x81, 0xf3, 0x68, 0x49, 0x77, 0x9d, 0x28, 0x35, 0xbb, - 0xf4, 0xa2, 0x26, 0xe1, 0x33, 0x27, 0x16, 0x5a, 0xa2, 0xd8, 0xc4, 0x7a, - 0xd4, 0xbb, 0x92, 0x2a, 0x75, 0x09, 0xba, 0x01, 0x5f, 0x61, 0xf9, 0x8a, - 0x10, 0x42, 0x8f, 0x56, 0xb6, 0xad, 0x05, 0x11, 0xe4, 0x17, 0xa6, 0x2b, - 0x1f, 0x53, 0x4c, 0x78, 0xe8, 0x1f, 0x29, 0x72, 0xa5, 0x82, 0xed, 0x0e, - 0x81, 0xb4, 0x51, 0x46, 0x9c, 0x60, 0x0a, 0x47, 0xf1, 0x0e, 0xe7, 0x57, - 0xd7, 0x8b, 0x12, 0x46, 0x4b, 0x6a, 0x09, 0x8e, 0xc1, 0xc1, 0xb5, 0xfe, - 0x21, 0x5e, 0xe0, 0x67, 0x35, 0xeb, 0xc7, 0x51, 0xe0, 0xe9, 0x22, 0xdb, - 0xb2, 0x2c, 0x10, 0x60, 0x04, 0xee, 0x7c, 0xe2, 0xaf, 0x73, 0x89, 0xe3, - 0xd4, 0x7d, 0x66, 0x85, 0xc4, 0xbb, 0xa3, 0xf7, 0x19, 0x7e, 0x3b, 0x29, - 0xb6, 0x3e, 0x0b, 0xb5, 0xbd, 0xa3, 0xe5, 0x34, 0xf1, 0xae, 0x47, 0x13, - 0x88, 0xc9, 0xc1, 0x8c, 0xe1, 0x45, 0xc2, 0x7e, 0x83, 0x6b, 0xfe, 0x08, - 0xb1, 0x42, 0x78, 0x3c, 0x6a, 0xf3, 0xc9, 0x51, 0xa2, 0x0b, 0xbc, 0x68, - 0xcf, 0xaf, 0x27, 0x43, 0x06, 0xce, 0xe8, 0xbd, 0xf2, 0x95, 0x0b, 0xdf, - 0x79, 0x89, 0xab, 0x8b, 0xb4, 0x12, 0xd0, 0xef, 0x1b, 0x9d, 0x19, 0x4d, - 0x6e, 0x68, 0xfc, 0x05, 0xfa, 0x8b, 0x48, 0xd2, 0xd5, 0xfb, 0xd5, 0x2c, - 0x16, 0x56, 0xf8, 0xe2, 0xd2, 0x91, 0xe0, 0xe2, 0x2c, 0xf1, 0x7a, 0x14, - 0x48, 0xd8, 0xd6, 0x49, 0x34, 0x1b, 0xb7, 0xab, 0xf7, 0xa1, 0xec, 0xb6, - 0x4b, 0x1b, 0x14, 0xb6, 0x77, 0xf9, 0x4b, 0xae, 0xae, 0x46, 0xf4, 0x09, - 0x89, 0xad, 0xe6, 0xe2, 0x1a, 0xa2, 0xac, 0x66, 0xc1, 0xf0, 0x61, 0x2a, - 0x7e, 0x97, 0x97, 0xdb, 0xe1, 0x7e, 0x5c, 0x25, 0x13, 0xf6, 0x97, 0xea, - 0x42, 0xca, 0x5f, 0x87, 0xe5, 0xd1, 0x18, 0x59, 0x42, 0x68, 0x8d, 0x50, - 0x42, 0xb4, 0x9a, 0x77, 0xf2, 0x3b, 0x2d, 0x4e, 0x6c, 0x5a, 0x80, 0xc4, - 0xc9, 0x18, 0x8e, 0xd8, 0xda, 0xf6, 0xf8, 0xaf, 0x4f, 0x28, 0x94, 0xb6, - 0x92, 0x51, 0x57, 0xca, 0x85, 0x5d, 0x40, 0xf2, 0xd8, 0xe1, 0x87, 0x10, - 0x46, 0x58, 0xf1, 0x05, 0x9f, 0x88, 0xb2, 0x4e, 0xe2, 0xbe, 0x8c, 0x5e, - 0x9d, 0x7e, 0xd8, 0x58, 0xfa, 0xcd, 0xaf, 0x7a, 0x9d, 0xcf, 0x42, 0x48, - 0xc0, 0xdc, 0xac, 0x1a, 0x07, 0xca, 0x17, 0x6a, 0x44, 0x12, 0xa1, 0xb8, - 0x7e, 0x08, 0xf7, 0x0e, 0x0b, 0x5f, 0x6f, 0x80, 0x27, 0x01, 0x93, 0xbe, - 0x71, 0x19, 0xa1, 0x82, 0x0e, 0xef, 0xa5, 0x01, 0x41, 0x0b, 0x62, 0x44, - 0x21, 0xec, 0x51, 0x64, 0xd2, 0x1b, 0x9d, 0x0d, 0x2c, 0x61, 0xcf, 0x90, - 0x6d, 0xc8, 0x3c, 0xd9, 0x51, 0x85, 0xf7, 0x55, 0x10, 0x62, 0x0f, 0x81, - 0x3f, 0x11, 0xea, 0x82, 0x25, 0xc7, 0x96, 0x84, 0x61, 0xc2, 0xfe, 0x1f, - 0x08, 0x08, 0x80, 0x1f, 0xc0, 0x1d, 0x13, 0x72, 0x8b, 0x2d, 0xde, 0x67, - 0xf1, 0xa7, 0x3a, 0x89, 0x52, 0x8a, 0x22, 0xb6, 0x64, 0x76, 0xc3, 0x8a, - 0x56, 0xb0, 0x0f, 0x3e, 0xd7, 0xe8, 0x58, 0xf7, 0xb6, 0x4f, 0x0d, 0x34, - 0x9c, 0x5e, 0xd5, 0x74, 0x1d, 0xdd, 0x73, 0x4e, 0x66, 0x3e, 0xb7, 0x08, - 0x72, 0xa4, 0x56, 0x52, 0x6a, 0xb3, 0x97, 0x83, 0x47, 0xd2, 0xe1, 0x1e, - 0xb6, 0x27, 0x15, 0x46, 0xbc, 0x95, 0xe2, 0x61, 0xfa, 0x2d, 0xf1, 0x74, - 0x9a, 0xa3, 0x41, 0xe3, 0x26, 0x57, 0x72, 0x6a, 0x8d, 0xef, 0x2c, 0xb9, - 0x80, 0x2d, 0xb7, 0x2a, 0x67, 0x62, 0x3e, 0xa0, 0xb0, 0xfe, 0xc4, 0x7a, - 0x3e, 0x11, 0xc8, 0xdf, 0x6b, 0x56, 0x32, 0x42, 0x64, 0x13, 0xad, 0xcd, - 0x04, 0x68, 0x12, 0xe9, 0xbf, 0xc5, 0x1f, 0x96, 0x23, 0x83, 0xa9, 0x60, - 0x0b, 0x15, 0x8e, 0x63, 0x33, 0x3e, 0xde, 0x67, 0x08, 0x0e, 0xbe, 0x35, - 0x13, 0x55, 0x27, 0x2c, 0x42, 0x0f, 0x06, 0x04, 0xc0, 0x43, 0x63, 0x18, - 0xd6, 0x33, 0x0e, 0x3c, 0xe2, 0x4f, 0xe3, 0xe5, 0x8e, 0xf0, 0xec, 0xb8, - 0xb7, 0x6a, 0x24, 0xf1, 0x0a, 0x66, 0xa4, 0xaa, 0x55, 0x09, 0xcc, 0x0a, - 0x72, 0xc8, 0xbf, 0x65, 0x8c, 0x8b, 0x8f, 0xb4, 0x93, 0x8a, 0xb0, 0xc4, - 0x4d, 0x7d, 0xf2, 0x5a, 0xe3, 0xf6, 0x66, 0xa2, 0xfd, 0x29, 0xf5, 0xf6, - 0x69, 0x34, 0x5b, 0x75, 0xe9, 0x76, 0x0c, 0x30, 0x90, 0x46, 0x16, 0x20, - 0x01, 0x1c, 0x6a, 0x32, 0x0d, 0x2e, 0x40, 0xb2, 0x14, 0x8c, 0xca, 0xaf, - 0x48, 0x11, 0xc7, 0xac, 0xf6, 0xb7, 0x6c, 0x3e, 0x24, 0xd8, 0x58, 0x0c, - 0x9c, 0xe6, 0xd9, 0xbc, 0x48, 0xbf, 0xb5, 0xe4, 0x48, 0xcc, 0x25, 0x88, - 0x17, 0xb8, 0x9d, 0x5c, 0x10, 0x87, 0xa0, 0x19, 0x6f, 0x59, 0x34, 0xcd, - 0xa4, 0x66, 0xbf, 0x27, 0x8c, 0x88, 0x79, 0xd1, 0x38, 0xc6, 0x98, 0x94, - 0x28, 0x7d, 0x07, 0x79, 0x17, 0xe6, 0xa0, 0x62, 0xab, 0x24, 0xd0, 0xc0, - 0xc7, 0xf1, 0x8c, 0x4f, 0xd1, 0x89, 0x6d, 0xcf, 0x7a, 0x66, 0xf8, 0xae, - 0x4d, 0xdb, 0xce, 0x3b, 0x57, 0xaf, 0x93, 0x16, 0x8b, 0x41, 0x58, 0x1d, - 0x46, 0x0c, 0x5f, 0x9d, 0xec, 0x05, 0x7f, 0x26, 0xee, 0x2f, 0x65, 0xaf, - 0x96, 0x1f, 0x6c, 0x86, 0x0b, 0xd0, 0x9f, 0x46, 0x1f, 0xcd, 0x0e, 0xef, - 0x03, 0xa8, 0xe7, 0x40, 0x80, 0xdd, 0xbc, 0xb1, 0x23, 0x86, 0x57, 0x26, - 0xbc, 0x53, 0x26, 0xc3, 0x82, 0xa2, 0xaa, 0xc2, 0xd7, 0x0e, 0xc8, 0xd9, - 0x4e, 0x3e, 0x49, 0xa8, 0x2d, 0x21, 0x83, 0xf5, 0x6a, 0xa4, 0x0b, 0x46, - 0x8c, 0x03, 0x34, 0x7e, 0x26, 0xd2, 0x73, 0xd4, 0xad, 0xc3, 0x0e, 0x9e, - 0xb3, 0x61, 0xe8, 0xa9, 0x42, 0x5b, 0xec, 0x87, 0x51, 0x21, 0x9d, 0xf2, - 0x82, 0xb3, 0x30, 0x9b, 0x63, 0x8c, 0xb4, 0xa0, 0x65, 0xd2, 0x22, 0x94, - 0x6a, 0xf0, 0x92, 0xde, 0xb1, 0xdd, 0xd0, 0x72, 0x15, 0x32, 0xd9, 0x12, - 0xd5, 0x96, 0xc1, 0xc1, 0x89, 0x41, 0x39, 0x07, 0xab, 0x1c, 0x1d, 0x66, - 0x9c, 0xa2, 0xd0, 0x0f, 0xab, 0xf5, 0xf1, 0xc7, 0xc7, 0x6e, 0x69, 0x8b, - 0xbb, 0xfb, 0x9b, 0xba, 0x2b, 0xae, 0x3b, 0x62, 0x55, 0x60, 0xb6, 0x5b, - 0xc6, 0x27, 0x7d, 0x0b, 0x75, 0x91, 0x7b, 0xab, 0x5d, 0x0b, 0xfc, 0x2a, - 0x6a, 0x7f, 0x07, 0xfa, 0xd6, 0x0f, 0xd3, 0x51, 0x63, 0x7a, 0xee, 0x90, - 0xe3, 0xb9, 0x17, 0x95, 0x34, 0xb6, 0xbb, 0x47, 0xd0, 0x4a, 0xf7, 0x1e, - 0x7d, 0x22, 0xce, 0x74, 0x3e, 0x9b, 0x15, 0x15, 0xf4, 0x6c, 0xda, 0x43, - 0x15, 0x87, 0x8d, 0xd0, 0x6e, 0x44, 0xaf, 0xf2, 0xcd, 0xf1, 0x3c, 0x64, - 0xd5, 0x6b, 0x98, 0x73, 0xd8, 0x29, 0x4c, 0xda, 0x78, 0x36, 0x99, 0xed, - 0xe4, 0xa2, 0xe1, 0xc2, 0xa5, 0xd6, 0x1d, 0x0c, 0x58, 0x1e, 0xa4, 0x62, - 0x16, 0xb9, 0x8f, 0xb5, 0x95, 0xc1, 0x00, 0x15, 0x49, 0x99, 0xe1, 0xf3, - 0x49, 0x4f, 0xa3, 0xf5, 0x3a, 0xcb, 0x57, 0xc3, 0xc5, 0x6f, 0x94, 0x9e, - 0x06, 0x72, 0x08, 0xf3, 0x73, 0x71, 0x74, 0x9e, 0xd5, 0x2e, 0x86, 0xc2, - 0x27, 0xba, 0xfc, 0xe0, 0x67, 0x9c, 0x45, 0x78, 0x02, 0xf1, 0x4c, 0x8c, - 0x13, 0x8f, 0x8c, 0x64, 0x8c, 0xff, 0xb9, 0x09, 0xcd, 0xfe, 0xd3, 0xf0, - 0xd0, 0x10, 0x24, 0x0d, 0xb9, 0xdf, 0xbb, 0x86, 0xda, 0x86, 0xee, 0x77, - 0x47, 0xf5, 0x97, 0xbb, 0xc2, 0x74, 0xc5, 0x6d, 0x7b, 0x3c, 0x79, 0xc6, - 0xe1, 0xa7, 0x7e, 0xa9, 0xd5, 0x98, 0x40, 0xaf, 0xaf, 0x96, 0x97, 0x93, - 0x00, 0x7a, 0x71, 0xec, 0xd1, 0x25, 0xf9, 0x9e, 0x1c, 0x10, 0xa0, 0x8a, - 0x59, 0xdf, 0x8a, 0x07, 0x12, 0x96, 0xb2, 0x9e, 0x78, 0xe2, 0x8f, 0x6e, - 0xff, 0xed, 0x87, 0x44, 0xe4, 0xf7, 0xe8, 0xbb, 0x2e, 0x79, 0x0c, 0xa7, - 0x34, 0x32, 0xbf, 0x7c, 0x4f, 0x79, 0x8f, 0x4d, 0x9a, 0xea, 0x4f, 0x2f, - 0xbf, 0x5d, 0x6e, 0x7a, 0xf6, 0xe2, 0x64, 0x93, 0xa3, 0x39, 0x75, 0x2b, - 0x33, 0xc7, 0x08, 0x54, 0x92, 0x59, 0x5c, 0xb3, 0x6d, 0x07, 0x9a, 0xa5, - 0x2c, 0x18, 0x15, 0xf8, 0x3e, 0x7d, 0x7f, 0xe6, 0xe5, 0x2c, 0xe5, 0xd8, - 0x2d, 0x27, 0x8a, 0x77, 0x4b, 0x4d, 0x4f, 0x55, 0x64, 0xec, 0xae, 0x09, - 0x5a, 0xbf, 0x32, 0xb7, 0x8a, 0xf4, 0xd7, 0x43, 0x08, 0x5b, 0x79, 0x9a, - 0x7a, 0x40, 0x62, 0x75, 0xbd, 0xaf, 0xb5, 0x79, 0x23, 0x6b, 0x0b, 0xc8, - 0x1f, 0x77, 0xee, 0x30, 0x4f, 0x7e, 0x7d, 0x78, 0x36, 0xb6, 0x0d, 0x59, - 0x19, 0x4d, 0x2d, 0x41, 0x08, 0x5b, 0x3a, 0xa1, 0x1a, 0x46, 0x49, 0xc1, - 0xec, 0x3d, 0xb4, 0xb4, 0x86, 0x80, 0x63, 0xc6, 0xc9, 0x33, 0x83, 0x31, - 0x10, 0x7c, 0xc6, 0x27, 0x7c, 0x4a, 0x44, 0x60, 0x92, 0x59, 0xee, 0x4b, - 0x05, 0x87, 0x71, 0xa8, 0xf5, 0x77, 0x5b, 0x58, 0xc5, 0x66, 0xec, 0x33, - 0x39, 0xaa, 0xd8, 0x43, 0xb8, 0x60, 0x3d, 0x54, 0x51, 0xdf, 0x5f, 0xe3, - 0xed, 0x2d, 0x68, 0xbb, 0xfd, 0xe6, 0x0b, 0x23, 0xf0, 0x69, 0x1c, 0x75, - 0x3b, 0xc5, 0x4b, 0x5c, 0x82, 0xfd, 0x4d, 0xe2, 0x22, 0x93, 0xd0, 0xa8, - 0x7d, 0xcf, 0x18, 0xe8, 0x59, 0xb3, 0x9f, 0xfa, 0xe7, 0x40, 0x9f, 0xba, - 0xc8, 0x66, 0xed, 0x1e, 0x4d, 0x6f, 0x1f, 0x83, 0x28, 0x04, 0x26, 0x6a, - 0x88, 0x26, 0x7b, 0x3f, 0xd1, 0xb0, 0xf7, 0xb8, 0xa0, 0xfa, 0x37, 0x92, - 0xba, 0x26, 0xdf, 0x2a, 0x40, 0x95, 0x9d, 0x10, 0x7c, 0x31, 0x74, 0x8d, - 0x00, 0xda, 0x3d, 0x66, 0xc9, 0x8d, 0x81, 0x26, 0x17, 0x99, 0x07, 0x67, - 0x8d, 0xa1, 0x19, 0x50, 0x1f, 0xaa, 0x8b, 0xa2, 0x36, 0xc7, 0x3b, 0x15, - 0xb8, 0x0c, 0x5c, 0xad, 0xee, 0x55, 0xde, 0xf0, 0xfc, 0xa5, 0xc5, 0xc8, - 0x1e, 0xdc, 0xc0, 0x6e, 0xd2, 0x85, 0x5a, 0xe4, 0x0d, 0xb3, 0x60, 0x65, - 0xd5, 0xb0, 0x00, 0x20, 0x6a, 0xf6, 0xc5, 0xe5, 0x26, 0x76, 0x06, 0xde, - 0x30, 0xa6, 0xcb, 0xb3, 0x34, 0xb6, 0xff, 0x43, 0xa5, 0xbf, 0x88, 0x1a, - 0xc6, 0x38, 0x98, 0x6f, 0x59, 0xc2, 0xe4, 0xbc, 0x05, 0x8c, 0x58, 0x0d, - 0x16, 0x87, 0xff, 0x05, 0xec, 0x90, 0xcf, 0x54, 0x22, 0xed, 0x20, 0x2f, - 0x3d, 0x04, 0xaa, 0xc2, 0x0a, 0x82, 0x25, 0x89, 0x74, 0xdf, 0x4b, 0x6f, - 0x03, 0xca, 0x1f, 0x1c, 0x2d, 0x41, 0x1f, 0x29, 0x29, 0xeb, 0xb3, 0x61, - 0xc9, 0x89, 0xd6, 0xa5, 0x95, 0x43, 0x61, 0xed, 0xb4, 0x9d, 0x39, 0x8e, - 0x8a, 0x03, 0xbf, 0x4e, 0xa5, 0xda, 0xac, 0xb6, 0x87, 0x05, 0x8a, 0x55, - 0x24, 0x1e, 0xe8, 0x89, 0x6b, 0x1f, 0xb7, 0xa8, 0x25, 0x2f, 0x0c, 0xb5, - 0x3b, 0x7b, 0xf6, 0xbd, 0xb8, 0x4a, 0xb1, 0xa2, 0xab, 0xd9, 0xf4, 0x62, - 0x03, 0x6a, 0xba, 0xb5, 0x49, 0x3f, 0xe2, 0x3d, 0xe1, 0x67, 0xf1, 0xd2, - 0x13, 0xa4, 0xb2, 0xe7, 0xc4, 0xff, 0xa0, 0x28, 0x32, 0x46, 0x81, 0x5e, - 0x04, 0x66, 0xc3, 0x80, 0x36, 0xae, 0xe2, 0x97, 0x32, 0x57, 0xad, 0xed, - 0x66, 0x8b, 0x3f, 0xd6, 0xa6, 0x5f, 0x88, 0xcb, 0x11, 0x4e, 0x16, 0x77, - 0x9d, 0xf9, 0xda, 0x83, 0x6d, 0x03, 0xd7, 0xa2, 0xfe, 0x91, 0x03, 0xa3, - 0xfa, 0x7e, 0xb5, 0x40, 0x2b, 0x72, 0x28, 0x09, 0x2c, 0x30, 0x81, 0x90, - 0xec, 0x25, 0x52, 0xf8, 0xc8, 0x35, 0x9b, 0x90, 0x37, 0x9d, 0x43, 0x1f, - 0xa1, 0xe9, 0xf0, 0xb2, 0x07, 0x36, 0x5b, 0xcb, 0x5c, 0xbd, 0x9a, 0xe9, - 0x1c, 0x7b, 0x0a, 0x9a, 0xc6, 0x88, 0x51, 0x66, 0x7b, 0xf9, 0x2d, 0x54, - 0xfa, 0x1a, 0x6d, 0xfb, 0xa2, 0x97, 0x5b, 0x18, 0xd6, 0x20, 0xeb, 0xe6, - 0xba, 0x5d, 0xcc, 0xac, 0x6d, 0x43, 0xe4, 0x56, 0xc0, 0x2f, 0x96, 0xaf, - 0x7e, 0x9a, 0x61, 0x3d, 0x2d, 0x9c, 0x82, 0xf3, 0x94, 0x96, 0xcc, 0x50, - 0x43, 0x19, 0xf8, 0xda, 0x0d, 0xfc, 0xf5, 0x46, 0x12, 0x63, 0xbc, 0xb7, - 0xa0, 0x56, 0x0e, 0xff, 0xbd, 0xd6, 0xa0, 0x6a, 0xbe, 0xb7, 0x16, 0x5b, - 0xb3, 0x6a, 0xb8, 0xec, 0xdb, 0x0f, 0x29, 0xe4, 0xcc, 0x5a, 0x18, 0x05, - 0x8c, 0xcf, 0xc1, 0xd0, 0x40, 0x73, 0x78, 0x71, 0x77, 0x30, 0x37, 0x14, - 0x27, 0xb9, 0x0d, 0xa3, 0xe6, 0xd8, 0xc1, 0x04, 0x24, 0xe3, 0x3e, 0xa0, - 0x4b, 0xde, 0x93, 0x59, 0x71, 0xed, 0x07, 0x93, 0xad, 0xb1, 0x0d, 0x8a, - 0x85, 0x3b, 0xf7, 0x48, 0x3f, 0xe9, 0xcc, 0xad, 0x9d, 0xb2, 0x8a, 0x76, - 0x9d, 0x05, 0x24, 0x0d, 0xb3, 0xd7, 0x2c, 0x6d, 0x46, 0xe3, 0x01, 0xb5, - 0x0a, 0x55, 0x36, 0x64, 0x5f, 0xcc, 0xa1, 0xed, 0xa0, 0x82, 0x7f, 0x9e, - 0x80, 0xc9, 0xe1, 0xb5, 0xb2, 0xeb, 0xe8, 0xc9, 0xe2, 0xda, 0x2f, 0x0d, - 0x2b, 0x67, 0xed, 0x4b, 0xf3, 0x43, 0x81, 0xe9, 0x46, 0xaf, 0x3e, 0x75, - 0x7b, 0x33, 0x79, 0x1a, 0xaf, 0xbf, 0x2a, 0xe1, 0x1b, 0xf3, 0xba, 0x70, - 0x70, 0x4b, 0xa8, 0xd5, 0xaa, 0x13, 0x51, 0xe8, 0x08, 0xed, 0x93, 0x81, - 0xca, 0xd3, 0xe2, 0x6d, 0xc5, 0x46, 0xaa, 0xd2, 0x72, 0x97, 0x30, 0xc4, - 0x89, 0xfd, 0x1d, 0x1e, 0xc2, 0xd9, 0xc3, 0x47, 0x62, 0x67, 0x3a, 0xa8, - 0x6a, 0xbd, 0xbd, 0x33, 0x30, 0x41, 0xa5, 0xcc, 0xa6, 0x4e, 0x98, 0xd9, - 0x6b, 0xdb, 0x17, 0x93, 0x18, 0x3d, 0x20, 0xe4, 0x7c, 0xe2, 0x68, 0xcb, - 0x49, 0x33, 0x7e, 0xbe, 0x1e, 0x81, 0xd7, 0xb6, 0x06, 0xd9, 0x58, 0x34, - 0xcd, 0xb7, 0x1c, 0x3a, 0xa4, 0xf7, 0x3f, 0x36, 0x51, 0x36, 0x70, 0xef, - 0xae, 0x17, 0x1e, 0x9e, 0xd1, 0x8b, 0xde, 0xd4, 0x27, 0x14, 0x1a, 0xd6, - 0x43, 0x3f, 0xbd, 0x41, 0xa3, 0x4b, 0x53, 0x7a, 0xe1, 0x2a, 0xc8, 0xf6, - 0xb2, 0x89, 0xd2, 0x17, 0x20, 0x57, 0x98, 0xbf, 0x57, 0x79, 0x5a, 0x4a, - 0xd1, 0x18, 0xd8, 0xcf, 0xf5, 0xd1, 0x50, 0x22, 0xd3, 0x71, 0x90, 0xe7, - 0x79, 0x4f, 0xe8, 0x1c, 0x7f, 0xb0, 0x79, 0xce, 0xa0, 0x84, 0x1a, 0xbd, - 0xc6, 0x0c, 0x2a, 0x70, 0x25, 0x9c, 0x9c, 0xc7, 0x19, 0x62, 0xa5, 0x16, - 0xe1, 0xbb, 0xcc, 0x1f, 0x24, 0xf5, 0x82, 0x9c, 0xd9, 0x8b, 0x79, 0x16, - 0xa4, 0x5d, 0x99, 0xd1, 0x34, 0x35, 0x9c, 0x4e, 0x7b, 0x14, 0x11, 0xbf, - 0xdc, 0x91, 0xfe, 0xd3, 0x4a, 0xd9, 0xcd, 0x07, 0x7e, 0x1b, 0x55, 0xae, - 0xd0, 0xbd, 0x06, 0xa4, 0x18, 0x38, 0xc1, 0xfe, 0xb1, 0xda, 0xc1, 0xf2, - 0x5e, 0x08, 0xea, 0xad, 0x23, 0xe9, 0x9b, 0x48, 0x43, 0xd9, 0xba, 0x61, - 0x39, 0x8f, 0xa8, 0x94, 0x7e, 0x95, 0x54, 0x31, 0xbe, 0xa7, 0x88, 0xa3, - 0x98, 0x7f, 0xda, 0xba, 0xf1, 0x25, 0x0d, 0x21, 0x9a, 0x8b, 0x9b, 0x60, - 0x42, 0xf0, 0xfc, 0x12, 0x17, 0xea, 0x2b, 0xe1, 0x34, 0xb3, 0xff, 0x78, - 0x17, 0x2a, 0xb9, 0xdf, 0x5f, 0xca, 0xb8, 0x16, 0x86, 0xd3, 0x3f, 0xae, - 0x80, 0x54, 0x74, 0x09, 0xe7, 0x0f, 0x8b, 0xda, 0x96, 0x80, 0x27, 0x3c, - 0x52, 0x34, 0x8f, 0xf2, 0xa2, 0x21, 0x24, 0x1e, 0xc8, 0xa0, 0x3e, 0xd6, - 0x3f, 0x98, 0x30, 0xa0, 0xdd, 0x33, 0x7a, 0xce, 0x0f, 0x1b, 0x9e, 0x8e, - 0xf0, 0x6d, 0x5a, 0x20, 0x4c, 0xe8, 0x9a, 0xe2, 0x21, 0x51, 0x51, 0xf6, - 0x4b, 0xb1, 0x72, 0x21, 0x03, 0x67, 0xb7, 0xcd, 0xdd, 0x0e, 0xe6, 0xb6, - 0x84, 0xa8, 0xa4, 0xbd, 0xf7, 0x13, 0xfa, 0x4b, 0x37, 0xae, 0x43, 0x1a, - 0x1a, 0x39, 0x36, 0x01, 0xb5, 0xb5, 0x48, 0xc9, 0x29, 0x1f, 0xfb, 0x22, - 0x3a, 0x44, 0x61, 0x40, 0x29, 0x6f, 0x7f, 0x8a, 0x0a, 0x31, 0x2d, 0x90, - 0x74, 0xfc, 0x57, 0xa2, 0xbe, 0xd6, 0x4e, 0x95, 0x35, 0x4f, 0x10, 0x5b, - 0x5f, 0x58, 0x53, 0x48, 0xd0, 0x71, 0x85, 0xcd, 0xb7, 0x30, 0x56, 0x2f, - 0xd6, 0x35, 0x57, 0x75, 0x45, 0x5f, 0xc2, 0x1d, 0x8c, 0xa9, 0x14, 0xf8, - 0x57, 0x26, 0x44, 0x16, 0x14, 0xd6, 0xfb, 0x33, 0xb3, 0x85, 0x79, 0x75, - 0x8c, 0xdb, 0x92, 0x7f, 0x89, 0xc4, 0x76, 0x00, 0x9d, 0xd4, 0x4c, 0xea, - 0x38, 0xb4, 0x60, 0xde, 0x3c, 0xc2, 0x4c, 0xa8, 0x2d, 0x0a, 0xe5, 0x36, - 0x44, 0xa1, 0xa7, 0xf5, 0x5d, 0x84, 0x82, 0x75, 0x3a, 0x51, 0x49, 0xc6, - 0x5e, 0x4d, 0x52, 0x0a, 0x9b, 0x12, 0x97, 0x08, 0xf7, 0x5e, 0xf3, 0x26, - 0xa7, 0xcd, 0x0a, 0xb9, 0x0c, 0xfe, 0x50, 0x39, 0x3a, 0x9e, 0xd1, 0x15, - 0x02, 0x78, 0x60, 0x0a, 0xeb, 0x93, 0x9c, 0x96, 0x56, 0xd3, 0x15, 0x6d, - 0x25, 0xfe, 0x80, 0xad, 0x8f, 0xc4, 0x85, 0x43, 0x0c, 0x4c, 0xb7, 0xd6, - 0x2f, 0xe3, 0xf4, 0x04, 0x88, 0x92, 0x43, 0xba, 0x74, 0x83, 0xe2, 0x23, - 0x85, 0x21, 0x86, 0x04, 0x74, 0x11, 0x3b, 0x2c, 0xbd, 0x38, 0x0b, 0x9f, - 0x01, 0xbf, 0xab, 0x13, 0x23, 0xfc, 0x6a, 0x5c, 0x6b, 0x95, 0x88, 0xad, - 0x31, 0x1d, 0xc3, 0x4c, 0x59, 0x79, 0xbd, 0x8e, 0xd4, 0x01, 0x23, 0x48, - 0xcf, 0xcd, 0x77, 0x35, 0xe9, 0xc5, 0x11, 0x6b, 0x22, 0xfd, 0xea, 0xff, - 0x97, 0xcf, 0xf9, 0x2e, 0x98, 0xa0, 0xa4, 0x31, 0xfb, 0x9a, 0x9f, 0xba, - 0x32, 0xb0, 0x05, 0x94, 0x7b, 0x89, 0x28, 0x6d, 0x5b, 0xa6, 0x77, 0x28, - 0x0d, 0xb2, 0xff, 0xad, 0xff, 0x11, 0x0f, 0x7c, 0x64, 0x9a, 0xaf, 0xae, - 0xcf, 0x53, 0x95, 0x76, 0x9c, 0x48, 0x93, 0x09, 0xe5, 0x8f, 0x49, 0xe9, - 0x45, 0x67, 0xa1, 0xbb, 0x4c, 0x15, 0x50, 0x6c, 0x61, 0x96, 0xea, 0x75, - 0x05, 0xab, 0x32, 0x82, 0xde, 0xde, 0xfd, 0xfd, 0xa4, 0x70, 0x71, 0x0c, - 0x86, 0xc8, 0x19, 0x70, 0x2a, 0xa7, 0x82, 0xc5, 0x71, 0x49, 0xe7, 0x5f, - 0x6a, 0xe5, 0x08, 0x2d, 0xee, 0x8d, 0x02, 0x4b, 0x08, 0xf8, 0x57, 0xf8, - 0x3f, 0xa8, 0xc7, 0x6c, 0xfb, 0x4b, 0xdb, 0xa3, 0x80, 0x7b, 0xdc, 0x2c, - 0x4b, 0x03, 0x4b, 0x74, 0xac, 0x67, 0xb8, 0xee, 0x79, 0x0d, 0x18, 0x72, - 0x96, 0x6e, 0x1d, 0x14, 0x56, 0xca, 0xe5, 0x3a, 0xc8, 0x78, 0x43, 0xd8, - 0xf0, 0xcd, 0xdd, 0xd6, 0x5b, 0x69, 0x6e, 0x96, 0x09, 0x60, 0x78, 0x5f, - 0xf3, 0xb3, 0x56, 0x39, 0xd4, 0x19, 0x74, 0x0b, 0xaf, 0xe9, 0x3b, 0x07, - 0x21, 0x73, 0xc0, 0xd6, 0xee, 0x4f, 0xfa, 0x6c, 0xbd, 0x20, 0xc6, 0xbd, - 0xac, 0x3b, 0xa5, 0xa9, 0x09, 0xb8, 0x9c, 0xcb, 0xcb, 0x37, 0x97, 0x2c, - 0x01, 0xbd, 0x79, 0xfe, 0xb2, 0x5a, 0xa4, 0x61, 0x13, 0xbe, 0xad, 0xe4, - 0x1f, 0x54, 0x24, 0xfd, 0xf5, 0x88, 0xdf, 0xa1, 0x6e, 0x54, 0x82, 0x93, - 0x89, 0x22, 0x05, 0xab, 0x02, 0xcd, 0x79, 0xb5, 0xda, 0x3d, 0x49, 0x45, - 0x62, 0xa7, 0xcd, 0x0d, 0x54, 0xa9, 0x38, 0xcf, 0x94, 0x35, 0x47, 0x9b, - 0x7e, 0xb7, 0x2d, 0xa7, 0xf9, 0xee, 0x58, 0x5c, 0xb7, 0x9a, 0xbf, 0xcd, - 0xe3, 0xe1, 0x0e, 0x18, 0x89, 0xa5, 0xc4, 0xa6, 0x5f, 0x9f, 0xde, 0x1c, - 0x27, 0x25, 0xc4, 0x5b, 0x45, 0xba, 0x31, 0x35, 0x01, 0xcf, 0xc9, 0x70, - 0x7b, 0x85, 0xd6, 0x2e, 0x67, 0x94, 0xb5, 0xf2, 0x3d, 0x06, 0xea, 0xef, - 0x3f, 0xbf, 0xa8, 0x52, 0x88, 0xd7, 0x3e, 0x00, 0xe3, 0xf5, 0x84, 0x5c, - 0xef, 0xf3, 0xb0, 0x75, 0xd4, 0x08, 0x0f, 0xa8, 0xbf, 0xb4, 0xf1, 0x7a, - 0x13, 0xd5, 0x03, 0x9e, 0xa4, 0x3c, 0xeb, 0xe6, 0x0e, 0x85, 0x41, 0xfa, - 0x25, 0x1f, 0xca, 0x49, 0xff, 0xfd, 0xc9, 0x20, 0x9c, 0x90, 0x5c, 0x86, - 0x06, 0xa7, 0x70, 0x1d, 0x3e, 0xf5, 0x5f, 0x10, 0xb0, 0x44, 0xf5, 0x94, - 0x32, 0x27, 0x94, 0x50, 0xc6, 0x25, 0x99, 0x63, 0x63, 0xb7, 0x91, 0xcb, - 0x75, 0x0b, 0xb4, 0x4d, 0x21, 0x38, 0xad, 0xad, 0x3e, 0x0f, 0x3a, 0x77, - 0xfd, 0xca, 0x64, 0x59, 0xee, 0xbc, 0x79, 0x11, 0xde, 0xfd, 0x52, 0xcf, - 0xdb, 0x8f, 0xe5, 0xb2, 0x77, 0xb6, 0x28, 0x1c, 0x5b, 0x2c, 0xff, 0x4b, - 0x1b, 0x90, 0x18, 0xe8, 0x5e, 0x3d, 0xbe, 0x4d, 0x6d, 0x39, 0xee, 0xc4, - 0xc3, 0x0f, 0xff, 0xe4, 0x06, 0xae, 0x7c, 0x55, 0xc6, 0xde, 0x92, 0xb4, - 0xe3, 0x28, 0x10, 0xbd, 0x46, 0xc8, 0x7c, 0xfd, 0xa9, 0x95, 0x0b, 0x7c, - 0x62, 0x7a, 0x39, 0x27, 0x28, 0x3f, 0x77, 0x48, 0xbf, 0xd6, 0xba, 0x4c, - 0x3b, 0x6f, 0x75, 0xf2, 0xb4, 0x8b, 0x50, 0x9e, 0xe6, 0xe9, 0x63, 0x53, - 0x09, 0x88, 0xbc, 0x29, 0xc8, 0x9f, 0x2d, 0x22, 0x17, 0x96, 0xdb, 0x83, - 0x4b, 0xbf, 0x76, 0x95, 0x8b, 0x40, 0xd5, 0xe5, 0x23, 0x7d, 0xd8, 0x38, - 0xed, 0x2a, 0xd0, 0x11, 0x39, 0xf4, 0x7c, 0x38, 0x4a, 0x91, 0x8b, 0xa2, - 0xc7, 0x12, 0xde, 0x46, 0x66, 0xf6, 0x2e, 0x82, 0x7c, 0x24, 0xaf, 0x33, - 0x0a, 0xb8, 0xc1, 0xc3, 0x68, 0x6b, 0x53, 0xdd, 0x51, 0xb3, 0x28, 0x4b, - 0x8e, 0xa6, 0x44, 0xf0, 0xaa, 0xac, 0x43, 0xe8, 0xd9, 0xc6, 0xd1, 0xec, - 0x1d, 0x05, 0x88, 0xdb, 0x61, 0xf1, 0xfa, 0xbb, 0x3e, 0x82, 0x03, 0x09, - 0xcf, 0x75, 0xba, 0x3a, 0x40, 0xe2, 0x2e, 0x28, 0xc8, 0xb5, 0x49, 0x58, - 0x10, 0x51, 0xb1, 0x39, 0xad, 0x2c, 0xac, 0x81, 0x56, 0xca, 0x01, 0xee, - 0x1c, 0xcc, 0xc2, 0x1c, 0x21, 0x06, 0x16, 0xf3, 0xcd, 0xae, 0xc7, 0xc8, - 0x27, 0x0d, 0x76, 0x99, 0x13, 0x98, 0xe5, 0xbc, 0xa0, 0x9c, 0x9e, 0xd3, - 0xe9, 0x41, 0x4e, 0xf8, 0x36, 0x51, 0x85, 0x1b, 0x05, 0xcc, 0xe1, 0x12, - 0xe9, 0x13, 0x6e, 0xa1, 0xbd, 0x72, 0x2c, 0x28, 0x1b, 0x78, 0x22, 0xfd, - 0x9c, 0x93, 0xd0, 0x13, 0x03, 0xd6, 0x67, 0x2a, 0x78, 0xcb, 0xd7, 0x3c, - 0x3c, 0xe3, 0x7d, 0xfe, 0xe5, 0x56, 0x02, 0xa8, 0x4c, 0x91, 0xd9, 0x8a, - 0x3f, 0x7d, 0x6d, 0x27, 0xb1, 0x44, 0xb6, 0x19, 0xfe, 0xde, 0x0b, 0x9e, - 0x29, 0x8a, 0x72, 0x8b, 0x89, 0xea, 0xcb, 0xe6, 0x7b, 0x11, 0x78, 0xac, - 0x49, 0x0b, 0x55, 0x3a, 0x4b, 0xf3, 0x9c, 0x5e, 0x15, 0x8f, 0x4a, 0xa8, - 0x7f, 0xe0, 0xd0, 0x5d, 0x28, 0x14, 0x4a, 0xef, 0x37, 0xd4, 0xb8, 0x40, - 0x5e, 0x91, 0xc2, 0x1f, 0x06, 0x4a, 0xbe, 0xcc, 0x23, 0x8d, 0x5d, 0x5f, - 0x4c, 0x42, 0x33, 0x35, 0xe4, 0x0c, 0x4b, 0x5f, 0xf2, 0xd0, 0x20, 0xbf, - 0x94, 0x7a, 0x6c, 0x23, 0xbe, 0xf2, 0x33, 0x87, 0x86, 0x02, 0xe9, 0xae, - 0x91, 0x44, 0x55, 0xcb, 0x2c, 0x1d, 0x10, 0xd8, 0x05, 0xcb, 0x9f, 0x84, - 0x0c, 0xc4, 0x84, 0xbc, 0x23, 0x8a, 0xcd, 0xc6, 0x48, 0x1d, 0x7b, 0x6e, - 0xeb, 0x88, 0x57, 0xbb, 0x85, 0x1c, 0xb9, 0x99, 0xab, 0x67, 0x12, 0x11, - 0x49, 0x50, 0x9c, 0xb2, 0x1b, 0x19, 0x6e, 0x64, 0x7e, 0x63, 0x78, 0xfc, - 0x0c, 0x61, 0x91, 0x4e, 0x72, 0xce, 0x1c, 0xe1, 0x66, 0x37, 0x9b, 0xe0, - 0xbc, 0x59, 0xd0, 0xf2, 0x3e, 0x84, 0xf9, 0xa1, 0xb3, 0x54, 0x91, 0x29, - 0x18, 0xde, 0xc7, 0x81, 0xdc, 0x47, 0x5f, 0x3b, 0xe8, 0x4b, 0x0d, 0x58, - 0xfd, 0x1f, 0x59, 0xd8, 0xbf, 0x1c, 0x26, 0x57, 0x72, 0x58, 0xe7, 0x9a, - 0x5a, 0x98, 0x73, 0x77, 0x79, 0x38, 0x0d, 0x9e, 0x79, 0x90, 0xf2, 0x4d, - 0xe7, 0x7f, 0x42, 0x38, 0x75, 0x1f, 0xe7, 0xc4, 0xe3, 0x91, 0x78, 0xf9, - 0x97, 0xe5, 0xc1, 0xc6, 0x59, 0x48, 0x33, 0x80, 0xde, 0xfc, 0x01, 0xdd, - 0xd8, 0x95, 0xda, 0x4c, 0x46, 0xd1, 0x06, 0x8f, 0xf7, 0xdb, 0x5a, 0xdb, - 0xd4, 0x9e, 0x2b, 0x83, 0xcd, 0x45, 0x77, 0x86, 0x5a, 0x95, 0x1f, 0x2b, - 0x87, 0xbf, 0x69, 0x2c, 0x8e, 0x0e, 0x7b, 0x50, 0x87, 0xa8, 0x2e, 0x6d, - 0xe0, 0xfe, 0xa0, 0xec, 0xe9, 0x16, 0x52, 0x05, 0x4b, 0x40, 0x1b, 0xc1, - 0x72, 0x13, 0x90, 0x1e, 0x44, 0x8b, 0x15, 0x0a, 0x4b, 0x2e, 0xa5, 0xf5, - 0x47, 0xcb, 0xc6, 0x48, 0xe1, 0x70, 0xe1, 0xd6, 0x73, 0x97, 0x72, 0x19, - 0xc0, 0x62, 0xa4, 0xb1, 0x3e, 0xbf, 0x02, 0x26, 0x0e, 0x9f, 0x87, 0xd6, - 0x4e, 0xc5, 0x9d, 0xae, 0xcf, 0x29, 0xc8, 0x61, 0x94, 0x1e, 0x0d, 0xff, - 0x72, 0x7a, 0x1b, 0x2c, 0x45, 0x46, 0xb4, 0x89, 0xde, 0xfd, 0x46, 0xaf, - 0xd6, 0x4e, 0xe8, 0x0d, 0x16, 0x31, 0xa7, 0xca, 0xda, 0xa7, 0x87, 0x9f, - 0xfb, 0x78, 0x7c, 0xc4, 0x1a, 0x12, 0x8f, 0xc8, 0xdc, 0x9b, 0xf0, 0x64, - 0x06, 0xa8, 0x2f, 0xdc, 0xc3, 0xeb, 0xa1, 0x44, 0x28, 0x2f, 0xad, 0x62, - 0xd6, 0xa6, 0xa0, 0x25, 0xa8, 0xc2, 0xee, 0xf8, 0xa2, 0x39, 0x61, 0xd1, - 0xad, 0x1f, 0x54, 0xd1, 0x43, 0xe9, 0x01, 0x69, 0x74, 0x23, 0xa1, 0x81, - 0xf8, 0x86, 0x64, 0x43, 0x4f, 0xbe, 0x92, 0x19, 0x8a, 0x73, 0xa4, 0xc2, - 0xf6, 0x43, 0x5c, 0xb6, 0xb2, 0x66, 0xf5, 0x32, 0xf3, 0x69, 0x3a, 0xbf, - 0xe2, 0x14, 0x4f, 0x92, 0xad, 0x3f, 0xb5, 0xe6, 0xff, 0xe2, 0x79, 0x4b, - 0xc1, 0x7f, 0x5b, 0x3b, 0x19, 0x06, 0xde, 0xed, 0xcb, 0x5f, 0x3d, 0x21, - 0x45, 0xfe, 0xf3, 0xc0, 0x39, 0x2d, 0x6c, 0x8b, 0x6e, 0x16, 0x63, 0xfa, - 0xec, 0x4c, 0x26, 0xc7, 0x03, 0x45, 0x10, 0x44, 0x45, 0xde, 0xeb, 0x0c, - 0xe2, 0x57, 0x1f, 0x5d, 0x8c, 0x7f, 0xa2, 0xf2, 0xed, 0x61, 0xcc, 0x55, - 0x93, 0x15, 0x64, 0xfc, 0xcf, 0x35, 0xe7, 0x30, 0x09, 0x92, 0x05, 0x66, - 0xc0, 0x59, 0xe0, 0x10, 0xc3, 0x1d, 0x06, 0x3d, 0x78, 0x1a, 0x08, 0x6a, - 0x5e, 0xa0, 0x50, 0x20, 0x70, 0xdd, 0x9d, 0x9d, 0x7d, 0x53, 0x8d, 0x14, - 0x54, 0x8e, 0x9f, 0xbf, 0x8a, 0x14, 0x0a, 0x7f, 0x49, 0x33, 0xbd, 0x14, - 0x57, 0x27, 0x41, 0x6e, 0xe2, 0xa0, 0x17, 0x7a, 0xc2, 0x2d, 0x96, 0x61, - 0xbc, 0xb7, 0x34, 0xd6, 0x19, 0x9c, 0x3f, 0x0d, 0xf0, 0x07, 0x65, 0x48, - 0x47, 0xa5, 0xea, 0x69, 0xd3, 0x67, 0xf1, 0x5a, 0x32, 0xc5, 0x28, 0x0b, - 0x65, 0x6c, 0xfa, 0xb3, 0xb4, 0xc1, 0x9a, 0xad, 0xd6, 0xa6, 0x36, 0x47, - 0x26, 0x5c, 0xd1, 0xf8, 0xb5, 0xde, 0x6a, 0x16, 0x28, 0x65, 0x5e, 0xb1, - 0x1b, 0x81, 0xb5, 0x7a, 0xb8, 0x95, 0x4a, 0x7c, 0x63, 0x88, 0x1c, 0x16, - 0x91, 0xae, 0xe9, 0x85, 0x8d, 0x3c, 0xa2, 0xf7, 0xda, 0xd5, 0x71, 0x43, - 0xb1, 0x72, 0xfd, 0xab, 0xec, 0x4a, 0x53, 0x14, 0x5e, 0x15, 0x16, 0xf2, - 0x01, 0x6b, 0xd9, 0xac, 0xf9, 0xb2, 0xb8, 0x1a, 0x35, 0x87, 0x27, 0x0f, - 0xb8, 0x43, 0x52, 0xad, 0x05, 0x2e, 0x72, 0x3e, 0x24, 0x92, 0x8b, 0x28, - 0xd9, 0xba, 0x92, 0x6f, 0x00, 0x86, 0x4b, 0xf4, 0x67, 0xc3, 0xcf, 0xa5, - 0xac, 0x3b, 0x4d, 0x19, 0xb0, 0x9a, 0x64, 0x85, 0x3c, 0x68, 0x80, 0x9e, - 0x85, 0x4e, 0x4a, 0x06, 0xf1, 0x78, 0x71, 0xbb, 0x0f, 0xd7, 0xa5, 0xab, - 0xb5, 0x66, 0x71, 0x12, 0xf9, 0xc4, 0xf8, 0x4c, 0x0b, 0x21, 0x63, 0x5b, - 0xfe, 0x1b, 0xc0, 0xcf, 0x61, 0x44, 0xc4, 0x33, 0xd2, 0x16, 0x26, 0x44, - 0x2e, 0xc6, 0x1d, 0xf1, 0xa3, 0xec, 0xf3, 0x7d, 0x34, 0x50, 0xab, 0xa2, - 0x8d, 0xf3, 0x7d, 0x13, 0x66, 0xf2, 0xe7, 0x67, 0x9d, 0x81, 0xad, 0x92, - 0x8c, 0xf7, 0x00, 0x56, 0x23, 0xf1, 0x53, 0xde, 0x38, 0xbe, 0x95, 0xe3, - 0x3e, 0x7f, 0x12, 0xaf, 0xe4, 0xe8, 0xcd, 0x6b, 0x5e, 0x49, 0x73, 0x64, - 0x5b, 0x6b, 0xcf, 0xa6, 0x42, 0xf8, 0x94, 0x92, 0x35, 0xb4, 0x7a, 0xe4, - 0x0f, 0x06, 0xef, 0xca, 0x39, 0xc2, 0x24, 0xfd, 0xfe, 0x8e, 0x6c, 0x3c, - 0x62, 0xd4, 0xfc, 0xd7, 0xaf, 0x2b, 0x70, 0x96, 0xfd, 0x23, 0x7b, 0x05, - 0x20, 0x45, 0x25, 0xb6, 0x87, 0xf8, 0x50, 0x68, 0xea, 0x3b, 0x60, 0xb3, - 0x11, 0x5a, 0x74, 0x17, 0x7c, 0x83, 0xa5, 0x11, 0x17, 0x8d, 0xa7, 0x92, - 0x7b, 0xa6, 0x96, 0xa6, 0x35, 0xb6, 0x7e, 0x6e, 0xeb, 0xa3, 0xc0, 0xb6, - 0x2b, 0xa9, 0x15, 0x9e, 0x78, 0x72, 0xa1, 0x91, 0x19, 0x28, 0x17, 0xdf, - 0xad, 0xf1, 0x5f, 0x80, 0x76, 0x35, 0xca, 0xb4, 0x5b, 0xc5, 0x9e, 0xb8, - 0x56, 0x0b, 0x48, 0x24, 0xb0, 0x8c, 0x4f, 0x29, 0x72, 0xd9, 0x94, 0x54, - 0x8c, 0xcd, 0x5f, 0x7e, 0x99, 0x8a, 0xaf, 0x52, 0x50, 0x64, 0x1b, 0xae, - 0x2f, 0x20, 0xb5, 0xcd, 0xba, 0x0b, 0x82, 0xd5, 0x27, 0x9f, 0x59, 0x28, - 0xa9, 0x2b, 0x47, 0x5c, 0xa2, 0x7f, 0x40, 0xfa, 0xf9, 0x53, 0xbb, 0x39, - 0x99, 0x3b, 0xb3, 0x13, 0x1a, 0x88, 0x3f, 0x7e, 0xfd, 0x3f, 0x1e, 0xf2, - 0xc8, 0xe2, 0x24, 0xe1, 0x59, 0xc0, 0xd2, 0x4c, 0xe0, 0xaa, 0xad, 0x50, - 0x55, 0xe4, 0x31, 0xe4, 0x63, 0xf6, 0x1e, 0x1e, 0xbc, 0x53, 0xa8, 0x8f, - 0xb2, 0x18, 0xd7, 0x86, 0x8a, 0x28, 0xba, 0xae, 0x32, 0x5b, 0x24, 0xbd, - 0xcc, 0x6a, 0x3d, 0x23, 0x67, 0xd2, 0x7d, 0xdd, 0xf8, 0x84, 0x47, 0x80, - 0x3e, 0xb4, 0x1f, 0x5b, 0xc7, 0xcc, 0x0e, 0xe5, 0x50, 0x24, 0xc6, 0x76, - 0xb2, 0x3e, 0xca, 0x2d, 0x1f, 0xfc, 0xf9, 0x1f, 0x40, 0x88, 0xb2, 0x24, - 0x4f, 0x9e, 0xd9, 0x52, 0x83, 0xc5, 0xfe, 0x0e, 0x98, 0x5f, 0xcb, 0xd0, - 0x3a, 0x5e, 0xda, 0xa1, 0xa5, 0xce, 0xbe, 0x6e, 0xe7, 0xb7, 0x1e, 0x97, - 0x58, 0x66, 0xde, 0x30, 0x5a, 0x90, 0x1d, 0xf3, 0xf7, 0xa9, 0x6a, 0x40, - 0x89, 0x16, 0x4c, 0x1c, 0xc7, 0xfb, 0x51, 0xf0, 0xdc, 0x98, 0x63, 0x53, - 0x4b, 0x7d, 0x5b, 0x3b, 0xfd, 0xa6, 0x24, 0x94, 0x76, 0xb6, 0x17, 0x2a, - 0x2e, 0x71, 0xca, 0xce, 0xfb, 0x1d, 0xc9, 0xee, 0xdc, 0x61, 0xe0, 0x7e, - 0xd6, 0x82, 0x0e, 0xa3, 0x94, 0x6a, 0x19, 0xbf, 0x9b, 0xb5, 0x1f, 0xac, - 0x6e, 0xaa, 0x78, 0x6f, 0x18, 0x6e, 0x99, 0x34, 0xeb, 0x33, 0x03, 0x27, - 0x6e, 0xed, 0x28, 0xa4, 0x73, 0xe1, 0x1f, 0x36, 0xb0, 0xff, 0xbe, 0x6e, - 0x73, 0x0c, 0x8c, 0x1d, 0xc9, 0x6a, 0xe3, 0x3f, 0xa5, 0xe5, 0xd9, 0xb6, - 0xf6, 0x22, 0x30, 0xc9, 0x45, 0x96, 0x3f, 0x16, 0xf4, 0xe3, 0x7a, 0x48, - 0x47, 0xfe, 0x54, 0xe7, 0xf6, 0x55, 0x7e, 0x6c, 0xb4, 0xbb, 0x80, 0xef, - 0xca, 0x00, 0x7f, 0x12, 0x49, 0x47, 0xac, 0x11, 0x0d, 0xb3, 0x9b, 0x29, - 0xd7, 0x71, 0x1d, 0x3b, 0xc8, 0x30, 0x14, 0x42, 0x96, 0x0a, 0x12, 0xab, - 0xff, 0xc4, 0xe5, 0x55, 0xe2, 0xcf, 0xc1, 0x9d, 0x9e, 0x3c, 0xdf, 0x6d, - 0x73, 0x1f, 0x1b, 0xdb, 0xed, 0x28, 0xfe, 0x71, 0xef, 0x8f, 0x1c, 0x43, - 0xa6, 0x87, 0x3f, 0xe6, 0x33, 0x0f, 0xce, 0x88, 0x23, 0x36, 0xd8, 0x63, - 0xad, 0x44, 0xa3, 0x56, 0x3b, 0x46, 0x2e, 0xc7, 0xa1, 0xeb, 0x20, 0x79, - 0x30, 0xa2, 0x66, 0x28, 0x7c, 0x0c, 0xb1, 0xa5, 0x9e, 0x54, 0x8c, 0x2e, - 0x14, 0xea, 0x60, 0x76, 0x60, 0x5f, 0x82, 0xa5, 0x43, 0xce, 0x57, 0x3d, - 0x61, 0x5c, 0x5e, 0xd8, 0x8d, 0x25, 0xd5, 0x13, 0xb7, 0x43, 0x60, 0x0f, - 0x45, 0x70, 0x8d, 0xb6, 0xb9, 0x0a, 0xe4, 0xa0, 0x4e, 0xc4, 0x03, 0x85, - 0x71, 0xa3, 0xe9, 0xac, 0xc3, 0xec, 0xd3, 0xe3, 0x6e, 0xba, 0x79, 0x83, - 0x54, 0xae, 0x7e, 0x99, 0x84, 0x50, 0xc9, 0x12, 0x8c, 0x1a, 0xa0, 0x94, - 0xd5, 0x05, 0xc1, 0xbe, 0x8c, 0x70, 0xe3, 0xa7, 0xf1, 0x5e, 0x25, 0x3f, - 0xf9, 0xf0, 0x8d, 0x68, 0x53, 0x72, 0x2b, 0xa2, 0x43, 0x7f, 0xde, 0xd3, - 0xec, 0x3e, 0x4e, 0xd6, 0x8c, 0x72, 0x43, 0xba, 0xe7, 0x17, 0xdd, 0xec, - 0x05, 0xde, 0xed, 0x22, 0x68, 0xad, 0xe4, 0xf5, 0xbc, 0x49, 0xcf, 0x8e, - 0xe5, 0x51, 0x34, 0x3d, 0x73, 0xa1, 0xe7, 0x72, 0x07, 0xf0, 0x10, 0x7d, - 0x4b, 0xe3, 0x72, 0xdf, 0x6b, 0x81, 0x94, 0x53, 0x8c, 0xa2, 0x8d, 0x13, - 0x34, 0xb0, 0x2f, 0x1a, 0x45, 0x02, 0x8b, 0x43, 0x26, 0x51, 0xef, 0x9a, - 0xee, 0x07, 0x0d, 0xc1, 0x21, 0x53, 0xa2, 0xac, 0xe3, 0x79, 0x0e, 0x31, - 0x0a, 0xaf, 0x7d, 0xc4, 0x86, 0xcb, 0x47, 0x58, 0x97, 0xbd, 0x42, 0x9b, - 0x27, 0xf2, 0x9c, 0xf1, 0x05, 0x7e, 0xd4, 0xe7, 0x8f, 0xa2, 0xf6, 0xd9, - 0x71, 0x58, 0xf5, 0x06, 0xe4, 0x76, 0xa9, 0x02, 0x3f, 0xcc, 0x4f, 0x0c, - 0xf6, 0xb3, 0x22, 0x34, 0xb9, 0x3f, 0xc8, 0xf0, 0xfe, 0x4e, 0xd7, 0x74, - 0x05, 0xde, 0xe1, 0xb2, 0x4d, 0xde, 0xa2, 0x9e, 0xc4, 0x20, 0xce, 0x1e, - 0x9b, 0x7b, 0x4c, 0xcd, 0xc8, 0x00, 0x47, 0x9b, 0xff, 0x04, 0xe2, 0x75, - 0xa1, 0xeb, 0x84, 0x3e, 0x0e, 0xcb, 0x98, 0x44, 0xf6, 0xf7, 0x8f, 0xfe, - 0xf9, 0x5b, 0x5e, 0x4a, 0xb1, 0x38, 0x57, 0xa6, 0x78, 0x9c, 0x3d, 0xee, - 0x84, 0x23, 0x57, 0x6a, 0xde, 0xb7, 0xb2, 0x08, 0x5c, 0xcf, 0xc7, 0x5d, - 0x79, 0xf1, 0xfe, 0x29, 0xc2, 0xa2, 0x40, 0x3f, 0x60, 0x06, 0xfb, 0x8a, - 0xef, 0x24, 0x1e, 0x63, 0xfa, 0x51, 0x0f, 0x1c, 0x17, 0xda, 0x0f, 0x4e, - 0xc5, 0xc2, 0xf7, 0x87, 0x26, 0xa5, 0xcb, 0x1e, 0xac, 0xe8, 0x92, 0x93, - 0x57, 0xe2, 0x93, 0x66, 0x8e, 0xdf, 0x7a, 0x1a, 0x21, 0xb0, 0x64, 0xb3, - 0x25, 0xd6, 0x15, 0x8a, 0x17, 0x43, 0x5d, 0x49, 0x34, 0x48, 0xd3, 0x9b, - 0x1d, 0x99, 0x93, 0x20, 0x47, 0x7a, 0x2c, 0xc3, 0x0d, 0x64, 0xad, 0x64, - 0x8f, 0xdb, 0x69, 0xf6, 0xaa, 0x3f, 0xb7, 0x85, 0x63, 0x0b, 0x0a, 0x4a, - 0x06, 0xee, 0xe2, 0x3a, 0x68, 0xa3, 0x3b, 0x96, 0xa4, 0x23, 0x09, 0x25, - 0xe9, 0x50, 0xff, 0x18, 0x99, 0x6e, 0x6e, 0x7d, 0x6c, 0xd9, 0x55, 0xe5, - 0x1d, 0x3f, 0xa6, 0x0e, 0x37, 0xb9, 0x66, 0xd3, 0x01, 0x72, 0xf3, 0x77, - 0x18, 0x93, 0x7f, 0xcb, 0xd5, 0x6a, 0x6f, 0x53, 0xd6, 0xed, 0xaa, 0x95, - 0x89, 0x29, 0xae, 0x44, 0xae, 0xff, 0xb7, 0x4f, 0x23, 0x3a, 0x63, 0x81, - 0x4e, 0x6b, 0x22, 0x21, 0x2e, 0x63, 0x06, 0xeb, 0xae, 0xf1, 0xba, 0xa4, - 0x2e, 0x96, 0xc8, 0x75, 0x6f, 0x34, 0x76, 0x43, 0xd5, 0x01, 0x4a, 0x5d, - 0x55, 0x10, 0x9d, 0x40, 0xff, 0x0b, 0xc6, 0xe3, 0x16, 0xe6, 0xd4, 0x59, - 0x40, 0x59, 0xd9, 0x39, 0xf8, 0x87, 0xe1, 0x0c, 0x79, 0x68, 0x0b, 0x57, - 0xf6, 0x81, 0xfe, 0x8d, 0x6f, 0xc3, 0x1f, 0xd1, 0x8a, 0x12, 0xc1, 0x0b, - 0x62, 0x8b, 0xc0, 0x91, 0x29, 0x1f, 0xcb, 0x98, 0xfa, 0xd7, 0x66, 0x10, - 0x2d, 0x3f, 0x97, 0x29, 0x27, 0x30, 0xe0, 0x1f, 0x49, 0x32, 0x49, 0xd6, - 0x04, 0x88, 0x4e, 0xc3, 0xaf, 0x82, 0x75, 0x25, 0xc5, 0x11, 0xdf, 0xa6, - 0x5e, 0x32, 0x96, 0xde, 0x4a, 0x4c, 0xa0, 0x13, 0xee, 0xfa, 0x79, 0xe8, - 0xb5, 0x69, 0xd6, 0x5b, 0x3d, 0x58, 0x3c, 0x1b, 0xbe, 0xb2, 0x7c, 0xa4, - 0x7d, 0xf2, 0xaf, 0x15, 0x31, 0xca, 0x80, 0x04, 0x0a, 0xdd, 0xee, 0x76, - 0x7e, 0xae, 0x0e, 0xa8, 0xe3, 0xaa, 0xf8, 0x97, 0x71, 0x9f, 0xc1, 0x71, - 0x24, 0x92, 0x9e, 0xec, 0x0c, 0x3a, 0xf2, 0x56, 0xfd, 0xed, 0xe9, 0xc8, - 0xf6, 0xf1, 0xe1, 0xb9, 0x3c, 0x98, 0x6a, 0x93, 0xe3, 0x20, 0x07, 0x09, - 0x59, 0xf8, 0xfa, 0x4c, 0x62, 0xd1, 0x02, 0x72, 0x9f, 0xc1, 0x9e, 0x44, - 0x93, 0x66, 0xc9, 0x02, 0xba, 0x2f, 0x61, 0xa2, 0xd1, 0xa7, 0xd3, 0xb0, - 0x76, 0x02, 0xcc, 0x48, 0xac, 0x17, 0x0c, 0xde, 0x14, 0x72, 0x58, 0x6b, - 0xed, 0x7b, 0xf7, 0xe7, 0x48, 0xbd, 0xb3, 0x93, 0xb5, 0xec, 0x45, 0xab, - 0x66, 0xac, 0x92, 0x5b, 0x0a, 0x8e, 0x10, 0xd0, 0xc4, 0xc3, 0xb5, 0x00, - 0x11, 0x8d, 0x09, 0x2c, 0x7f, 0x1d, 0xb8, 0xed, 0x3b, 0x87, 0x31, 0x08, - 0x46, 0x2c, 0xe5, 0x86, 0xb2, 0x7e, 0x4b, 0xcc, 0xab, 0x7a, 0xb3, 0x5c, - 0x5e, 0x79, 0xbc, 0x18, 0xe2, 0x18, 0x73, 0xd8, 0x16, 0xb8, 0x58, 0x5a, - 0x2e, 0xaf, 0x55, 0x93, 0xcd, 0x02, 0x8e, 0xb1, 0xde, 0x32, 0x22, 0x47, - 0xf5, 0x2a, 0x32, 0x40, 0xb0, 0x7a, 0x78, 0x58, 0x00, 0x52, 0x8c, 0x2a, - 0x5e, 0x06, 0x73, 0xbb, 0x59, 0xf3, 0xc9, 0x56, 0xd7, 0x77, 0x61, 0x2c, - 0x58, 0x23, 0x93, 0xe4, 0x38, 0x3e, 0x2d, 0x22, 0x0f, 0x1a, 0xcb, 0x88, - 0x76, 0xd9, 0x60, 0x1c, 0x0c, 0x65, 0x6c, 0x2f, 0x89, 0xca, 0xd6, 0x03, - 0x48, 0x0c, 0x11, 0xe3, 0x82, 0xe4, 0x7b, 0xad, 0x2c, 0x47, 0xbf, 0xae, - 0xd3, 0x35, 0x17, 0x0e, 0x4e, 0x77, 0xdb, 0xa8, 0xb8, 0x07, 0x60, 0x96, - 0xc7, 0x38, 0x56, 0x9b, 0x5b, 0xba, 0x35, 0xc6, 0x6f, 0x5c, 0x11, 0xed, - 0x4f, 0x86, 0xb7, 0x50, 0xbc, 0xf0, 0x1d, 0x54, 0x60, 0x18, 0xd0, 0x13, - 0xe0, 0xb4, 0x51, 0x03, 0x8e, 0x56, 0x15, 0x4c, 0xcf, 0x0b, 0xc5, 0xf0, - 0xbc, 0xc0, 0xd7, 0xcf, 0xd5, 0xa0, 0x52, 0x72, 0x56, 0xb9, 0x87, 0xf8, - 0x7f, 0x40, 0xc8, 0xa5, 0xf7, 0xce, 0xb0, 0xf2, 0x94, 0xff, 0x6d, 0x5b, - 0xc2, 0xb1, 0x69, 0x75, 0xc8, 0xb5, 0x95, 0x62, 0xcd, 0xed, 0x37, 0x8a, - 0x72, 0x27, 0xf7, 0x51, 0x24, 0x02, 0x51, 0x29, 0x35, 0xed, 0x41, 0x1a, - 0x39, 0x3d, 0xcb, 0x6e, 0x19, 0x1f, 0xdb, 0xe1, 0x8f, 0xdf, 0x06, 0xf6, - 0x44, 0x8d, 0xf4, 0x46, 0x60, 0xd9, 0x3e, 0xe9, 0x53, 0x32, 0x66, 0xbe, - 0x4d, 0x98, 0x62, 0x0d, 0xf2, 0x1b, 0x19, 0x28, 0xf9, 0x69, 0x11, 0x25, - 0x12, 0x21, 0x01, 0x7e, 0x33, 0x34, 0x9f, 0x62, 0x4b, 0x42, 0x4f, 0xea, - 0xb8, 0x1d, 0x7a, 0x91, 0x88, 0x64, 0x71, 0x32, 0x05, 0x3c, 0xfe, 0xea, - 0x56, 0xb4, 0xeb, 0x2e, 0x94, 0x7d, 0x95, 0xe9, 0x2d, 0x4e, 0xe0, 0x3e, - 0x97, 0xa8, 0x35, 0x0a, 0xce, 0x01, 0x2f, 0x32, 0xfe, 0x94, 0x59, 0x13, - 0x46, 0xaf, 0x7b, 0xb3, 0x23, 0xf1, 0xfb, 0x24, 0x97, 0x1c, 0x4e, 0x8c, - 0x89, 0x9b, 0x19, 0x72, 0x31, 0x87, 0x88, 0x42, 0x2c, 0x44, 0x8d, 0xfd, - 0x25, 0x3c, 0x94, 0x7b, 0x34, 0x0e, 0x32, 0x7c, 0xd0, 0xbb, 0xcb, 0xaa, - 0xd4, 0x8f, 0x9f, 0xbb, 0x5c, 0x25, 0x28, 0xcd, 0x6b, 0x68, 0xb7, 0x31, - 0x84, 0x6b, 0x3e, 0xf0, 0xf5, 0xb9, 0xf5, 0xda, 0xca, 0x12, 0xb7, 0xd6, - 0xe0, 0x73, 0xb4, 0x6e, 0x35, 0xd2, 0x35, 0x22, 0x16, 0x0b, 0x34, 0xac, - 0x3e, 0xd6, 0x06, 0xac, 0xef, 0x43, 0x06, 0x06, 0xb3, 0xc6, 0xc9, 0xfe, - 0x72, 0x5f, 0x04, 0x01, 0x05, 0x41, 0x87, 0x1c, 0x9a, 0x35, 0x7d, 0xad, - 0x7b, 0x29, 0x39, 0x8e, 0x34, 0x43, 0x39, 0x19, 0xa1, 0x6f, 0x4c, 0x17, - 0x60, 0x00, 0xdc, 0xd0, 0x09, 0x38, 0xc8, 0x48, 0xa1, 0x48, 0x0a, 0xb8, - 0x90, 0x38, 0x63, 0x91, 0x23, 0x1f, 0xbd, 0x81, 0xe5, 0x24, 0xa4, 0x39, - 0x33, 0xf2, 0xf7, 0x63, 0x7d, 0x6b, 0x4a, 0xd9, 0xc8, 0xbf, 0x2a, 0x48, - 0x72, 0x0a, 0x7b, 0xe5, 0x9b, 0xa2, 0x0d, 0xf5, 0x96, 0x3f, 0xd5, 0x6f, - 0x66, 0x1c, 0x8b, 0x4c, 0x46, 0x92, 0x3c, 0xfb, 0x61, 0x79, 0xf5, 0x10, - 0x21, 0x63, 0x91, 0xd4, 0xa5, 0x0d, 0x05, 0xa9, 0xfa, 0x08, 0x54, 0x19, - 0xd6, 0xc5, 0x30, 0xab, 0x4e, 0x85, 0x4c, 0xda, 0x58, 0xdd, 0xef, 0x20, - 0x21, 0x91, 0x50, 0x38, 0x92, 0xf5, 0x5c, 0x57, 0x12, 0x13, 0xaf, 0xde, - 0x65, 0x7e, 0x1a, 0x7b, 0x8a, 0x19, 0x3d, 0x11, 0x28, 0x87, 0x78, 0x0d, - 0x8d, 0xb9, 0xf0, 0x73, 0xf1, 0xa2, 0x97, 0x5d, 0x1b, 0xb6, 0x35, 0x70, - 0x00, 0xc9, 0xaa, 0x2c, 0x77, 0x49, 0x59, 0xd4, 0x7e, 0xf0, 0x3d, 0x13, - 0xd3, 0x3f, 0x23, 0x23, 0x73, 0x05, 0xc7, 0xe4, 0x5c, 0x8e, 0x83, 0xa9, - 0x78, 0x0b, 0x36, 0xd4, 0xd0, 0x7c, 0xb7, 0x38, 0x5f, 0xdc, 0x79, 0xa8, - 0xed, 0x65, 0x26, 0xad, 0x39, 0xad, 0xba, 0xeb, 0xe4, 0xfb, 0x76, 0xdb, - 0xfa, 0x56, 0x6d, 0xd2, 0xdb, 0x1c, 0x51, 0xd7, 0x5e, 0x87, 0x5e, 0x8c, - 0xd1, 0xb0, 0x19, 0x3f, 0x4a, 0x2c, 0x44, 0xc6, 0x98, 0xe8, 0x58, 0x19, - 0xcd, 0x10, 0x35, 0xdb, 0x96, 0x1e, 0xa7, 0x4e, 0x10, 0x64, 0x4d, 0xa9, - 0x04, 0x21, 0x31, 0x20, 0xf8, 0x5b, 0xf3, 0xc8, 0x08, 0xa1, 0xf3, 0x90, - 0x54, 0x78, 0xbd, 0x64, 0x6c, 0x16, 0x9d, 0x6b, 0x21, 0x00, 0x71, 0x65, - 0xde, 0x76, 0xef, 0x2d, 0x54, 0xae, 0x36, 0x69, 0x72, 0x3a, 0x52, 0xce, - 0xcc, 0x96, 0xb2, 0xd1, 0xd9, 0x54, 0x49, 0x24, 0xa1, 0x3a, 0x26, 0xb1, - 0x4e, 0x40, 0xc4, 0xa6, 0x2a, 0xae, 0x92, 0xe1, 0x99, 0x7a, 0x1d, 0xa0, - 0x19, 0x62, 0x60, 0xd7, 0x0d, 0x08, 0xba, 0x58, 0xfc, 0x6c, 0xa4, 0x57, - 0xcb, 0x60, 0x0e, 0x8c, 0xef, 0x7b, 0x71, 0x15, 0x2c, 0x7f, 0xdc, 0x04, - 0x74, 0xeb, 0xb9, 0xbd, 0xf3, 0xe2, 0xa1, 0x23, 0x17, 0xf2, 0x02, 0xe9, - 0x5e, 0x34, 0x0f, 0xb0, 0x08, 0xa2, 0x5a, 0x9a, 0x88, 0x76, 0x40, 0xce, - 0xbe, 0x03, 0x46, 0x60, 0x20, 0x75, 0x21, 0x74, 0xea, 0x90, 0x71, 0xc4, - 0xcd, 0x00, 0x43, 0x19, 0x19, 0x59, 0xeb, 0xea, 0x1e, 0xea, 0xa9, 0xbf, - 0x59, 0x86, 0x4d, 0x18, 0x04, 0x53, 0xed, 0xa0, 0x9e, 0x9b, 0x7e, 0xcc, - 0xb3, 0xe8, 0xe1, 0xec, 0x2e, 0x8b, 0x8d, 0x61, 0x88, 0x09, 0x81, 0x95, - 0xff, 0xa6, 0x40, 0x48, 0xf6, 0x60, 0xf7, 0x34, 0xcf, 0x9c, 0x40, 0xa9, - 0x9e, 0xde, 0xd1, 0xc1, 0x8d, 0x66, 0x0a, 0x02, 0xc0, 0x35, 0x8c, 0x9a, - 0x0e, 0x3a, 0x2b, 0x13, 0xee, 0x25, 0x96, 0x0e, 0xf7, 0xce, 0x61, 0x6c, - 0x27, 0x2e, 0xcb, 0xfb, 0x93, 0xf3, 0x9f, 0x8b, 0xb1, 0x07, 0x7e, 0x2b, - 0x74, 0xb1, 0x0e, 0x43, 0x00, 0xc5, 0x2c, 0xd2, 0x19, 0x71, 0x24, 0x6a, - 0x41, 0xdf, 0x66, 0xeb, 0xed, 0x02, 0xa4, 0x3e, 0x74, 0x6e, 0x90, 0xce, - 0xcc, 0x3d, 0x81, 0x0d, 0x2f, 0x1a, 0x2f, 0x3f, 0xe9, 0x66, 0x74, 0xe1, - 0x89, 0x64, 0x50, 0xc6, 0x72, 0xa2, 0x49, 0x30, 0x59, 0xf5, 0x06, 0xba, - 0x97, 0xfb, 0x4a, 0xda, 0xef, 0x14, 0xb2, 0x20, 0x35, 0x21, 0x42, 0x1a, - 0x01, 0x14, 0xb3, 0x92, 0xf8, 0xdd, 0xee, 0x3b, 0x61, 0xf1, 0x43, 0xe3, - 0x2a, 0xd3, 0x68, 0xe5, 0xaf, 0xd8, 0x33, 0x18, 0x0a, 0x23, 0x03, 0x12, - 0x10, 0x5f, 0x11, 0xc8, 0x72, 0xa4, 0x94, 0x4a, 0x0c, 0xcf, 0xac, 0xbb, - 0xa3, 0xe0, 0x07, 0x0e, 0x9a, 0x40, 0x4c, 0x39, 0x35, 0x77, 0x7e, 0xfa, - 0x87, 0xe8, 0xa2, 0xcf, 0x4c, 0x49, 0xd5, 0x81, 0x50, 0x9e, 0x78, 0xcb, - 0x9e, 0x10, 0x75, 0x0d, 0x90, 0x37, 0x5e, 0x53, 0x39, 0x1c, 0xaf, 0x41, - 0xa9, 0x78, 0x11, 0x97, 0x34, 0x20, 0x05, 0xff, 0xc0, 0xbe, 0xe1, 0xf0, - 0xf5, 0x17, 0x8d, 0x0e, 0xc9, 0x8f, 0x11, 0x14, 0xcc, 0xfb, 0x44, 0x62, - 0x30, 0x67, 0x90, 0x16, 0xf0, 0x53, 0x66, 0x96, 0x68, 0x28, 0x89, 0x9d, - 0x97, 0x24, 0x32, 0xa8, 0xee, 0x6f, 0x6f, 0xb7, 0xf7, 0x9d, 0x15, 0x69, - 0x27, 0x45, 0x0f, 0x5d, 0x63, 0xf3, 0x53, 0x2c, 0x37, 0x7a, 0xda, 0xa6, - 0xc3, 0x35, 0x31, 0xb7, 0x70, 0xcf, 0x1d, 0xac, 0x01, 0xe9, 0x32, 0xde, - 0x61, 0x25, 0x4c, 0x9d, 0xcc, 0x19, 0x75, 0x7b, 0x05, 0xff, 0x08, 0x76, - 0xfe, 0x09, 0x7d, 0x1f, 0x44, 0xc1, 0x55, 0x86, 0x91, 0x53, 0x7c, 0xb5, - 0x35, 0x9f, 0x9f, 0xac, 0x7d, 0xc6, 0xe5, 0xed, 0x3f, 0xeb, 0xc5, 0x8a, - 0xc3, 0x05, 0xb0, 0xf4, 0x3e, 0xfa, 0x29, 0xcd, 0x98, 0xb3, 0x4c, 0x5f, - 0xf3, 0xc6, 0x21, 0x8e, 0xb9, 0x25, 0xba, 0xbb, 0xc9, 0xd2, 0xa7, 0x2e, - 0xd9, 0x97, 0xc0, 0xf7, 0xc3, 0x0c, 0xc3, 0xfc, 0xf4, 0x39, 0x17, 0x8d, - 0xd2, 0xc1, 0x1d, 0x18, 0x48, 0xf9, 0x80, 0xfb, 0x59, 0x3e, 0xd0, 0x27, - 0xd5, 0x1a, 0x4a, 0x91, 0x08, 0xf2, 0x93, 0x69, 0x4a, 0xb8, 0xfc, 0xd0, - 0xf6, 0xc5, 0x7c, 0x9c, 0x0a, 0xa9, 0xbb, 0xfe, 0x90, 0x98, 0x7a, 0xae, - 0xd5, 0xa7, 0x95, 0x4b, 0xed, 0x1e, 0x7e, 0x0a, 0xaa, 0x4b, 0xa1, 0x5e, - 0x8d, 0x4e, 0x89, 0xe4, 0xcb, 0xf1, 0x0a, 0xfb, 0x23, 0xc8, 0x80, 0x4b, - 0x32, 0x98, 0x9e, 0x6a, 0x49, 0x10, 0xf1, 0x90, 0x95, 0x83, 0xd4, 0x5e, - 0xf5, 0x32, 0x11, 0x6a, 0x5d, 0x44, 0x7f, 0x1c, 0xac, 0xa2, 0xd5, 0x55, - 0xa7, 0xe0, 0x69, 0xdf, 0x5d, 0xb0, 0xd2, 0x54, 0x5d, 0xe2, 0x3d, 0x55, - 0x0d, 0x47, 0x57, 0xff, 0x07, 0x66, 0x67, 0x9b, 0x2a, 0xff, 0x3e, 0x71, - 0x40, 0x54, 0x78, 0xea, 0x5a, 0xa2, 0xe6, 0x57, 0x84, 0xf0, 0x23, 0xf4, - 0xaa, 0x71, 0x8a, 0x10, 0x03, 0x14, 0xd9, 0x95, 0x81, 0x4b, 0xfb, 0x97, - 0x49, 0x0a, 0xb6, 0x06, 0x5f, 0x3d, 0x14, 0x5d, 0x29, 0xa4, 0xb9, 0x69, - 0x28, 0x67, 0x61, 0xc9, 0x60, 0xc1, 0xd9, 0x64, 0xe3, 0x60, 0x71, 0x2c, - 0xfc, 0xc2, 0x32, 0x79, 0x91, 0xdb, 0x4f, 0x26, 0xb6, 0xb7, 0x7e, 0xc6, - 0xe5, 0x9d, 0xf8, 0x66, 0x38, 0x8e, 0xde, 0x69, 0xbc, 0x1e, 0xb9, 0xaa, - 0x02, 0x86, 0xfb, 0x0b, 0x1d, 0xb9, 0x57, 0x91, 0xc9, 0x62, 0x65, 0x2e, - 0x08, 0x47, 0x87, 0x3b, 0x8c, 0x22, 0xa4, 0xdc, 0x3e, 0x88, 0x6b, 0x18, - 0xe7, 0x77, 0xd4, 0xba, 0xe8, 0x39, 0xc7, 0xf0, 0xc8, 0xa2, 0x53, 0xa0, - 0x0e, 0x9e, 0xf4, 0xce, 0x42, 0xc4, 0xe0, 0x22, 0x5d, 0xc6, 0xe8, 0xbc, - 0x86, 0x84, 0x2c, 0x25, 0xf9, 0xb5, 0xe4, 0xf8, 0x92, 0xe0, 0x78, 0x51, - 0x22, 0x1c, 0xc9, 0x9f, 0x6c, 0x29, 0xa0, 0x79, 0x4b, 0x10, 0x9e, 0x8c, - 0xe3, 0x05, 0xdf, 0x09, 0x0a, 0x92, 0xbd, 0xbb, 0x79, 0xc9, 0xca, 0x6a, - 0x5c, 0x01, 0xe9, 0x86, 0x69, 0x83, 0x2d, 0xd7, 0xd3, 0x3c, 0xfa, 0x22, - 0xce, 0x8b, 0x38, 0xe1, 0xeb, 0x08, 0x99, 0x40, 0xe1, 0xb2, 0x42, 0xbd, - 0x93, 0x88, 0x58, 0x5a, 0x8e, 0xa0, 0x60, 0x48, 0xd9, 0x20, 0x29, 0x78, - 0xbb, 0xda, 0xa4, 0x02, 0x13, 0xa1, 0x38, 0xb3, 0x77, 0x06, 0xfe, 0xa9, - 0x92, 0x3d, 0x3d, 0xf8, 0x93, 0x06, 0xa3, 0xd1, 0x2d, 0xcb, 0x03, 0xfd, - 0x04, 0xaa, 0xf1, 0x34, 0xdc, 0xe2, 0x3e, 0x3a, 0xcc, 0xa7, 0xc3, 0xbb, - 0xb3, 0x5f, 0x66, 0xe7, 0xa9, 0xf0, 0xae, 0x03, 0x44, 0x23, 0x9d, 0xce, - 0xb9, 0x81, 0x77, 0xf7, 0x6c, 0xa1, 0xf2, 0x36, 0xeb, 0x38, 0x25, 0x58, - 0x5c, 0x38, 0xfa, 0xec, 0x46, 0x93, 0x4e, 0x92, 0xb4, 0xf9, 0x19, 0x56, - 0x19, 0x15, 0x5b, 0xc6, 0x13, 0xd7, 0x8e, 0xa7, 0xb2, 0x8d, 0x81, 0xe9, - 0xbd, 0x07, 0xf4, 0xd9, 0x02, 0xb4, 0xdd, 0x93, 0xaf, 0x1f, 0xa3, 0xc3, - 0x90, 0x9b, 0x2c, 0xeb, 0xc5, 0xad, 0x8c, 0x52, 0xb6, 0xcb, 0xe9, 0xa9, - 0xce, 0xaa, 0x1f, 0x62, 0x9d, 0xb3, 0x94, 0x31, 0x6f, 0x42, 0x6a, 0xd6, - 0x0f, 0xc6, 0x4e, 0xb0, 0xbe, 0x57, 0x25, 0x43, 0x9d, 0x44, 0xcb, 0xef, - 0xb2, 0xc2, 0xc9, 0x0e, 0x24, 0x39, 0xb6, 0x2f, 0xa1, 0x2e, 0x94, 0xc9, - 0x81, 0x34, 0x35, 0x0c, 0x24, 0xab, 0x8c, 0x63, 0x99, 0xae, 0x7c, 0x27, - 0xee, 0xef, 0x41, 0x72, 0xb7, 0xe9, 0xf6, 0xe3, 0x25, 0x60, 0x34, 0x06, - 0xce, 0x76, 0x31, 0x5a, 0x87, 0x04, 0xda, 0x2c, 0x76, 0x3c, 0x85, 0xce, - 0x6c, 0x6e, 0xc8, 0xb4, 0xd9, 0xe8, 0x30, 0x97, 0x0f, 0x50, 0x8e, 0x49, - 0x9f, 0x27, 0xe3, 0x14, 0x08, 0x17, 0x59, 0x0a, 0x5c, 0xb6, 0xd7, 0x55, - 0x30, 0xa6, 0x98, 0xe9, 0x7c, 0x38, 0x64, 0x81, 0x3f, 0xa2, 0xe9, 0x0d, - 0x22, 0x19, 0x55, 0x30, 0xc7, 0x1b, 0x60, 0x1b, 0x61, 0x6f, 0x32, 0xd2, - 0x09, 0xa2, 0x58, 0x2c, 0xe2, 0x38, 0xe1, 0xf3, 0x1d, 0x41, 0x3f, 0xab, - 0xae, 0x88, 0x23, 0x16, 0xf8, 0x3d, 0x34, 0xee, 0x6d, 0x0c, 0x86, 0x2e, - 0xb4, 0x74, 0x88, 0x5f, 0xee, 0xe3, 0xe2, 0xf9, 0xee, 0xea, 0x3c, 0xae, - 0xa2, 0xa3, 0xa9, 0x7f, 0xf0, 0x12, 0x6a, 0x82, 0xa7, 0xf7, 0x64, 0x73, - 0x7a, 0x9b, 0xdc, 0xfc, 0x18, 0x99, 0xe4, 0x2e, 0x1e, 0xdb, 0xe3, 0xa8, - 0x2f, 0x23, 0x89, 0x0d, 0x50, 0x7d, 0x8e, 0xf4, 0xda, 0x88, 0xfc, 0xa0, - 0x47, 0xf3, 0x5d, 0xdc, 0xa4, 0x11, 0x91, 0x15, 0xe9, 0x83, 0x88, 0xf9, - 0xc9, 0x25, 0x64, 0x22, 0xe0, 0xb0, 0xb0, 0x92, 0x43, 0x82, 0x49, 0x6c, - 0x21, 0x26, 0x40, 0xf6, 0xa3, 0x7f, 0xdd, 0xe4, 0x2d, 0xbe, 0x38, 0x84, - 0x6d, 0x25, 0xa9, 0xc0, 0xda, 0x36, 0xb0, 0x2e, 0x2f, 0xda, 0x3c, 0xe3, - 0x33, 0xfd, 0x37, 0xfc, 0x4f, 0x09, 0x41, 0x4b, 0xd5, 0x11, 0x4c, 0x03, - 0x2d, 0x4c, 0x29, 0xd9, 0x39, 0xf9, 0xa9, 0xdb, 0x3a, 0x33, 0x73, 0x0a, - 0xa2, 0x72, 0x43, 0xbf, 0x86, 0xc1, 0x96, 0x9f, 0x51, 0x6b, 0xd1, 0xa2, - 0xb5, 0xc3, 0x4a, 0x90, 0x2f, 0x26, 0x34, 0x90, 0x93, 0xbf, 0xf1, 0x8a, - 0xc0, 0xc6, 0x99, 0x17, 0x43, 0x2e, 0x81, 0xaa, 0x64, 0xa7, 0x98, 0xb9, - 0x24, 0xb3, 0xbc, 0x89, 0xa5, 0x9a, 0xc6, 0xa3, 0xaf, 0x26, 0xed, 0xb2, - 0x24, 0x8a, 0x0b, 0x39, 0xcc, 0x02, 0xfc, 0xb0, 0x6f, 0x3e, 0x6d, 0x5d, - 0x49, 0xc8, 0x4d, 0xc6, 0x39, 0x96, 0x56, 0x26, 0x0f, 0x7c, 0xcc, 0x1f, - 0xe2, 0xf3, 0xf7, 0x28, 0xa7, 0x63, 0x7c, 0xab, 0x83, 0x67, 0xc3, 0x79, - 0xeb, 0x6a, 0x00, 0x69, 0x87, 0x6b, 0xde, 0xf9, 0x11, 0xf5, 0x48, 0xb2, - 0x17, 0x67, 0x38, 0xd8, 0xd2, 0x28, 0x9f, 0x50, 0x8c, 0xe1, 0x18, 0x9a, - 0xea, 0x18, 0xf4, 0x3b, 0x1a, 0xe2, 0x46, 0xdc, 0x7d, 0xe4, 0x2d, 0x59, - 0x79, 0xb3, 0x3d, 0x1c, 0x7d, 0x87, 0xa2, 0x64, 0xf3, 0xa6, 0x93, 0x14, - 0x66, 0x64, 0x92, 0xfa, 0x92, 0x6e, 0x71, 0xc8, 0x99, 0xf4, 0xa5, 0xa7, - 0x67, 0x85, 0x2a, 0x99, 0xe5, 0x09, 0xd8, 0xa3, 0x1a, 0x11, 0x6b, 0xc6, - 0x65, 0xee, 0x9d, 0x9a, 0x8a, 0x13, 0x57, 0xa7, 0x85, 0x4b, 0x47, 0xf3, - 0xa1, 0x3c, 0x88, 0x0a, 0x18, 0xa0, 0xbd, 0x3a, 0x27, 0xb4, 0x1b, 0x17, - 0xdb, 0x89, 0x5c, 0xa5, 0x46, 0xbd, 0xa7, 0x79, 0x6b, 0xf5, 0x3b, 0x63, - 0xa0, 0x16, 0xbc, 0x05, 0xc1, 0xf2, 0x32, 0xaf, 0x38, 0x3d, 0x54, 0x46, - 0x19, 0x95, 0x0b, 0x84, 0xb5, 0x8f, 0x77, 0xf7, 0x3f, 0x21, 0xa7, 0xc7, - 0xff, 0x5d, 0x64, 0xf6, 0xb0, 0xbd, 0x73, 0x24, 0x65, 0x54, 0x5f, 0x96, - 0x27, 0xd7, 0x5d, 0x40, 0x67, 0x44, 0x35, 0xc4, 0xbf, 0x31, 0x3e, 0xd5, - 0x22, 0xad, 0x0a, 0xa2, 0x55, 0x39, 0xff, 0x3d, 0x86, 0x37, 0xdb, 0x06, - 0x97, 0x97, 0xad, 0xa0, 0x5f, 0xa8, 0x75, 0x41, 0x85, 0xd0, 0xe6, 0x8c, - 0x7e, 0x72, 0xa8, 0x4f, 0xb7, 0xe3, 0x89, 0x42, 0x81, 0xa9, 0xf2, 0xab, - 0x64, 0xeb, 0xb3, 0x19, 0xab, 0xd1, 0x39, 0x13, 0x23, 0xcb, 0x80, 0xae, - 0x44, 0xad, 0x26, 0xff, 0x45, 0xdc, 0xf1, 0x6c, 0x12, 0xf0, 0xa8, 0x01, - 0xdb, 0x9f, 0x60, 0x59, 0xe2, 0x7f, 0x2d, 0xc1, 0xfc, 0x49, 0x57, 0x15, - 0x5f, 0x5f, 0x17, 0xc7, 0xe3, 0x1d, 0x47, 0xa8, 0x9c, 0x6a, 0xd4, 0x31, - 0xde, 0x40, 0x3b, 0x64, 0xb4, 0xeb, 0x9e, 0x13, 0x9a, 0xaf, 0xd9, 0x44, - 0x8b, 0xc7, 0xb1, 0xb3, 0xa7, 0x37, 0x1b, 0x1c, 0x5e, 0x83, 0x93, 0xb3, - 0x63, 0x08, 0x28, 0x9a, 0xf4, 0x19, 0x00, 0xa2, 0x3a, 0xc7, 0xd5, 0x24, - 0x28, 0xb9, 0x9b, 0x0d, 0x5f, 0x46, 0x69, 0x1a, 0x0f, 0xd2, 0x2e, 0x68, - 0x2d, 0x86, 0x3d, 0x39, 0xb8, 0x25, 0xb4, 0x84, 0x62, 0x2b, 0x4f, 0xb0, - 0xae, 0x58, 0x8c, 0x0e, 0xa8, 0x83, 0x18, 0xb7, 0xe5, 0x50, 0x63, 0xcd, - 0x57, 0x53, 0x46, 0x68, 0x9e, 0xef, 0xa8, 0x8c, 0xdd, 0x70, 0x91, 0xf4, - 0x0c, 0xf4, 0xfd, 0x4b, 0xb5, 0xb7, 0x71, 0xe7, 0xd2, 0x9f, 0x6b, 0x4b, - 0xa4, 0x38, 0xc5, 0x6b, 0xc2, 0x9f, 0xad, 0x04, 0x00, 0xba, 0xd7, 0x38, - 0x5d, 0x9f, 0x5e, 0xe0, 0x8b, 0xe8, 0xd7, 0x5a, 0x36, 0x18, 0x98, 0x3a, - 0x09, 0x77, 0x25, 0xa6, 0x08, 0x13, 0xc0, 0x17, 0x7d, 0xe5, 0xc2, 0x51, - 0xce, 0x31, 0x6e, 0x6b, 0xf4, 0xd6, 0x1f, 0x70, 0x8b, 0x6a, 0xe2, 0xd9, - 0x42, 0xa5, 0x36, 0x53, 0x3c, 0xc6, 0x96, 0xb3, 0x84, 0x26, 0xb3, 0x97, - 0x35, 0xd1, 0x3f, 0x21, 0x46, 0x83, 0x17, 0x64, 0xa6, 0x9d, 0x00, 0xe7, - 0x5a, 0xd7, 0x83, 0x4e, 0x13, 0xce, 0x7f, 0xdf, 0xcb, 0x97, 0x9b, 0xef, - 0x9f, 0xc1, 0x20, 0x30, 0x87, 0x08, 0xb9, 0x77, 0xb0, 0xf3, 0xf3, 0x88, - 0xe2, 0xf0, 0x09, 0xf7, 0xc3, 0xc5, 0xa5, 0x4d, 0x60, 0xf6, 0x9b, 0xb1, - 0x39, 0x28, 0x0b, 0x28, 0x56, 0xcd, 0x0e, 0xa9, 0xbc, 0xd8, 0xa3, 0x09, - 0x3a, 0xc5, 0xb5, 0xe2, 0x51, 0xef, 0x87, 0x68, 0xcd, 0x8c, 0x73, 0x3b, - 0x5c, 0xb2, 0xd8, 0x51, 0x9d, 0xe7, 0xb7, 0x3f, 0x1a, 0x28, 0x71, 0x38, - 0x13, 0x91, 0x64, 0xc1, 0xa6, 0x3d, 0xb9, 0xf8, 0xc5, 0x39, 0xaf, 0x78, - 0xec, 0x97, 0x17, 0x78, 0x07, 0xf1, 0xcf, 0xe1, 0x7b, 0x24, 0x4c, 0x72, - 0x6a, 0x62, 0x68, 0x79, 0x80, 0x68, 0x1c, 0x11, 0x30, 0x5a, 0xf7, 0xdf, - 0x4c, 0x93, 0x16, 0x71, 0xca, 0x96, 0x67, 0x39, 0x70, 0x35, 0xd5, 0x66, - 0xaf, 0xe8, 0xa1, 0x8d, 0x9a, 0xca, 0x70, 0x8d, 0xef, 0x0e, 0x62, 0x05, - 0x45, 0xda, 0x4b, 0xc7, 0x03, 0xc8, 0x69, 0x1e, 0x5e, 0x2d, 0xd5, 0xb8, - 0x14, 0x03, 0x78, 0x50, 0x55, 0x19, 0x6c, 0x09, 0xb1, 0x58, 0x98, 0x45, - 0xc0, 0xe2, 0x56, 0xd4, 0x7c, 0xd8, 0x4e, 0xac, 0xe9, 0xa0, 0xf0, 0xcb, - 0xb7, 0x1f, 0x71, 0x01, 0x7f, 0x1f, 0x1b, 0x11, 0xcc, 0x20, 0x92, 0xc4, - 0x41, 0x4d, 0x4c, 0x34, 0x23, 0xc8, 0x74, 0x31, 0xa5, 0x57, 0xd1, 0xaa, - 0x12, 0x0c, 0x6c, 0xef, 0xf4, 0xab, 0x46, 0xbe, 0x93, 0x2e, 0x0e, 0x6e, - 0xc3, 0x22, 0x17, 0x51, 0x21, 0xc0, 0x55, 0xb3, 0x5f, 0x8e, 0xff, 0xae, - 0xe1, 0x00, 0xcd, 0xd2, 0xbc, 0xd0, 0xfa, 0xde, 0x3b, 0x52, 0xea, 0x26, - 0xac, 0x55, 0x09, 0xc2, 0x1c, 0x4c, 0x2f, 0x06, 0x7c, 0x08, 0x97, 0x0b, - 0x39, 0x26, 0x49, 0xb2, 0x6f, 0xd6, 0xa1, 0x1e, 0xd9, 0x6f, 0xde, 0x41, - 0xd8, 0xc9, 0x06, 0x09, 0xd2, 0xbb, 0x8e, 0x91, 0x8c, 0xb2, 0x66, 0x55, - 0xdd, 0x8a, 0xc1, 0xd0, 0xfb, 0xb0, 0x47, 0x68, 0x09, 0x3a, 0x8b, 0xd7, - 0x18, 0x75, 0x17, 0x92, 0xe7, 0x7d, 0xed, 0x7c, 0xcc, 0x77, 0x20, 0x94, - 0x5e, 0xce, 0xf3, 0x9f, 0xb9, 0x14, 0xa0, 0xc4, 0x9f, 0x47, 0x02, 0x25, - 0xb9, 0xd8, 0x6c, 0x34, 0x50, 0x43, 0xa1, 0xae, 0x36, 0xd9, 0x02, 0x7b, - 0xb5, 0x74, 0xe1, 0x85, 0x9a, 0x79, 0x30, 0x60, 0xa1, 0xc0, 0x6d, 0xca, - 0x58, 0xf2, 0xd8, 0xa9, 0xad, 0xf6, 0xa4, 0xd5, 0xab, 0x96, 0x35, 0x81, - 0xcd, 0x24, 0xb0, 0x59, 0xbf, 0x0a, 0xae, 0xea, 0xd9, 0x41, 0x07, 0xdb, - 0xc0, 0x39, 0x4b, 0x5b, 0xbf, 0xc6, 0xf2, 0x9c, 0x16, 0x00, 0x9f, 0x1f, - 0xfe, 0xf0, 0x4f, 0xfc, 0x71, 0x5d, 0x6e, 0xf8, 0xdc, 0xe9, 0x04, 0xa4, - 0x98, 0x9a, 0x87, 0xe9, 0x1a, 0x97, 0x79, 0x49, 0xc5, 0xf5, 0x00, 0xbb, - 0xa6, 0x05, 0x9e, 0xb7, 0xde, 0xda, 0x22, 0x23, 0xed, 0x65, 0x5c, 0x54, - 0x04, 0x7f, 0x69, 0x2a, 0x61, 0x07, 0x57, 0xe3, 0x7f, 0x3b, 0x9b, 0xdf, - 0x63, 0x4a, 0xea, 0xe0, 0x45, 0x4e, 0xb1, 0x68, 0xea, 0x04, 0xd8, 0x6b, - 0x41, 0x9e, 0x9f, 0xed, 0xc8, 0xed, 0x76, 0x7a, 0x77, 0x28, 0xc9, 0x26, - 0x5c, 0xf5, 0xdf, 0xde, 0xdc, 0xe4, 0x0f, 0x58, 0x3a, 0x01, 0xfa, 0x4d, - 0x4a, 0xd5, 0x03, 0xaa, 0xde, 0xdc, 0x50, 0xbf, 0xeb, 0xdb, 0x63, 0x51, - 0xee, 0x5f, 0x24, 0xa9, 0x5f, 0xe7, 0x85, 0xc8, 0x26, 0x2b, 0x1b, 0x61, - 0x1b, 0x6e, 0x3e, 0xe0, 0xe4, 0xa3, 0x30, 0x9e, 0x32, 0x8e, 0xc4, 0x9b, - 0xc9, 0xd0, 0x07, 0xaa, 0xfa, 0x3c, 0x17, 0x9a, 0xbf, 0xe4, 0x9b, 0xd1, - 0x22, 0xcd, 0xed, 0x6f, 0x40, 0xad, 0x87, 0xce, 0x10, 0xfe, 0xe9, 0xad, - 0xb5, 0x9c, 0xf7, 0xc0, 0x37, 0x56, 0x18, 0x1c, 0xda, 0xb9, 0x9e, 0xb9, - 0xe4, 0x62, 0xe2, 0x06, 0x82, 0x67, 0xed, 0x47, 0x90, 0x2b, 0x46, 0x39, - 0x74, 0x1f, 0x27, 0x39, 0x0f, 0xcb, 0x9e, 0xd3, 0x35, 0x40, 0x72, 0x11, - 0xfe, 0x7d, 0x16, 0x60, 0x14, 0xa6, 0xd7, 0x98, 0x36, 0x64, 0x0a, 0x82, - 0x07, 0xc0, 0x5f, 0xec, 0xea, 0x51, 0xda, 0x9c, 0x05, 0x70, 0xc0, 0xb7, - 0xc9, 0x3f, 0x7a, 0xca, 0x9d, 0x0b, 0xe1, 0xfd, 0xcf, 0xd3, 0x14, 0x2b, - 0xac, 0x48, 0xc3, 0x16, 0x1e, 0x4c, 0x12, 0x28, 0x39, 0x69, 0x1e, 0xcf, - 0xa7, 0x35, 0x50, 0x31, 0x02, 0x7b, 0x80, 0xab, 0xf8, 0x62, 0x4e, 0xda, - 0xc9, 0xcb, 0x1d, 0x5b, 0xf8, 0xdf, 0xf5, 0x4d, 0xd0, 0xcf, 0xb8, 0x2f, - 0x22, 0x6b, 0xe0, 0x52, 0x03, 0xec, 0x90, 0xe1, 0x83, 0x9e, 0xa0, 0x04, - 0x35, 0x12, 0xf2, 0x33, 0x4f, 0x28, 0x45, 0xaa, 0x22, 0x5d, 0xaa, 0x64, - 0xc6, 0x85, 0x66, 0x0f, 0x75, 0xa5, 0x5a, 0x81, 0x5c, 0xf6, 0xf3, 0xcd, - 0x4d, 0x00, 0x42, 0x26, 0x79, 0x0e, 0xda, 0x6e, 0xf7, 0xeb, 0xef, 0xd6, - 0xb0, 0x33, 0x62, 0xad, 0xf4, 0xe8, 0xe9, 0x7f, 0x3d, 0xc4, 0x47, 0xe7, - 0x8d, 0xa9, 0xa5, 0x2a, 0xc0, 0x88, 0x81, 0x3b, 0x61, 0x9e, 0x87, 0x52, - 0xb9, 0x55, 0x61, 0x10, 0xa8, 0x00, 0x39, 0x20, 0x22, 0xae, 0x0c, 0xae, - 0x63, 0x24, 0x28, 0x48, 0x36, 0x97, 0x7a, 0x8b, 0x49, 0x8f, 0x40, 0xa2, - 0x26, 0x34, 0xc8, 0xe8, 0xe8, 0x5b, 0x0c, 0x9e, 0x9c, 0x48, 0xbe, 0x52, - 0xe0, 0x9b, 0xbe, 0xbb, 0x63, 0xa4, 0x49, 0x50, 0x98, 0x39, 0xb1, 0xf0, - 0x3d, 0x18, 0x51, 0x8d, 0x7c, 0xba, 0x95, 0xf6, 0xf0, 0x45, 0xf7, 0xb8, - 0xe4, 0x4a, 0xc8, 0x4f, 0x78, 0x13, 0xa6, 0x62, 0xeb, 0x15, 0x23, 0xb9, - 0x25, 0x3b, 0xff, 0x15, 0x9c, 0x3b, 0x5e, 0x93, 0x3a, 0xf7, 0x22, 0xf1, - 0x2b, 0x60, 0x22, 0x70, 0x91, 0x2b, 0x6e, 0x4b, 0x9b, 0x1b, 0x27, 0x81, - 0x38, 0x9e, 0xc3, 0x1e, 0x14, 0xfd, 0xf2, 0xf6, 0xc4, 0x07, 0x32, 0x33, - 0x5c, 0x52, 0xe6, 0xc2, 0xe4, 0x28, 0x21, 0x0f, 0xbf, 0x27, 0x07, 0xa6, - 0x2b, 0x33, 0xf8, 0xb6, 0x8f, 0xf1, 0x14, 0x90, 0x69, 0xcf, 0x2c, 0xd9, - 0x90, 0x1a, 0x2b, 0xb4, 0x5e, 0x3d, 0xe0, 0x73, 0x55, 0x05, 0xb5, 0xfe, - 0x93, 0x5e, 0x00, 0xc3, 0xa9, 0x6a, 0xb3, 0x0c, 0x99, 0x98, 0x68, 0xc1, - 0x72, 0x56, 0x14, 0xcf, 0x4a, 0x1d, 0xb7, 0xcb, 0xe1, 0x56, 0x40, 0x3e, - 0x5e, 0x83, 0x86, 0x3e, 0xbc, 0x21, 0x4a, 0xcf, 0x86, 0xd5, 0x47, 0x6b, - 0x9c, 0x78, 0xbc, 0xab, 0xc1, 0xab, 0xc5, 0x9b, 0xb4, 0xb0, 0x62, 0xfc, - 0xa5, 0x1f, 0xfb, 0xf3, 0x78, 0xb1, 0x41, 0xf3, 0xfd, 0xa8, 0x51, 0xb8, - 0xc8, 0x8f, 0x36, 0x3e, 0x9a, 0xaa, 0xad, 0x17, 0xbc, 0x5f, 0x04, 0xf3, - 0x11, 0x2f, 0xe9, 0xef, 0x71, 0x4e, 0xc2, 0x7a, 0x12, 0x43, 0x37, 0xce, - 0x21, 0x6f, 0x81, 0xc9, 0x16, 0xb5, 0xfa, 0xea, 0x0f, 0x78, 0x24, 0xe5, - 0xb9, 0xca, 0xec, 0x26, 0x9e, 0x37, 0x3d, 0x3c, 0x2b, 0x09, 0xad, 0x9c, - 0x06, 0xd8, 0x6a, 0x5d, 0x39, 0x87, 0x0d, 0x3d, 0x81, 0xbf, 0xe0, 0x1a, - 0xa6, 0xcc, 0x30, 0xf9, 0xac, 0xfa, 0x23, 0x71, 0xf4, 0x58, 0x3d, 0xed, - 0xfb, 0xad, 0xcf, 0xba, 0x20, 0xab, 0xb0, 0xde, 0x5e, 0x8a, 0x01, 0xb1, - 0x18, 0xe7, 0x6f, 0x40, 0x08, 0xf6, 0xe2, 0x0e, 0xdb, 0xa6, 0xb6, 0x78, - 0x04, 0xeb, 0x99, 0x36, 0x44, 0x2b, 0x77, 0x2c, 0x8a, 0xf8, 0x60, 0xaf, - 0xd9, 0x17, 0x13, 0xbc, 0x78, 0xa2, 0x40, 0x54, 0x6b, 0xa1, 0x26, 0xc5, - 0x65, 0x89, 0xc8, 0x9c, 0x1d, 0xf1, 0xdd, 0xc6, 0x77, 0x46, 0xae, 0x06, - 0xba, 0xa3, 0x6a, 0x84, 0x03, 0xb9, 0x60, 0x2b, 0x6f, 0xd6, 0x25, 0x60, - 0xbf, 0x71, 0xf9, 0x44, 0x15, 0x44, 0xc7, 0x7c, 0x60, 0xf3, 0xa2, 0x1a, - 0xd2, 0x34, 0x37, 0x59, 0xba, 0xec, 0x3a, 0xf5, 0x0a, 0xef, 0xb7, 0x62, - 0xe6, 0x51, 0xe2, 0x93, 0x43, 0xd3, 0x79, 0xea, 0x5e, 0x33, 0x82, 0x6d, - 0x4a, 0x88, 0x9b, 0x77, 0xb4, 0x3e, 0x5f, 0x78, 0x56, 0xc1, 0xd6, 0x35, - 0xfd, 0xf2, 0xc1, 0x73, 0x6d, 0x12, 0x2f, 0x59, 0xff, 0xcc, 0x61, 0x29, - 0x56, 0xfe, 0xf0, 0xb5, 0xb5, 0x51, 0x45, 0x0e, 0x52, 0x32, 0xfd, 0x1e, - 0x8f, 0xf9, 0xd0, 0x08, 0xbd, 0x75, 0x4a, 0xb3, 0x42, 0xd9, 0xa4, 0x14, - 0x86, 0xa5, 0xbd, 0x9c, 0x12, 0xbb, 0xaa, 0x99, 0x8a, 0x86, 0xe4, 0x8d, - 0xb2, 0x89, 0x41, 0x00, 0xcf, 0x58, 0x65, 0x8b, 0x46, 0x6c, 0xea, 0x67, - 0x59, 0xec, 0x17, 0xa8, 0xa3, 0x2b, 0x36, 0xdb, 0xa0, 0xb2, 0x9c, 0x64, - 0xc2, 0xac, 0xc8, 0xe9, 0xea, 0x25, 0x4f, 0x4c, 0xb3, 0x44, 0x33, 0xb0, - 0x2a, 0x81, 0xc7, 0x5f, 0x9c, 0xfd, 0x2e, 0x31, 0xfb, 0x75, 0xcf, 0x0f, - 0x73, 0xd8, 0x2b, 0xb6, 0xf7, 0xd6, 0xb8, 0x62, 0x54, 0x5f, 0x7b, 0xca, - 0x73, 0x28, 0xb1, 0xec, 0x12, 0x92, 0x82, 0xf0, 0x95, 0xb2, 0x79, 0x2f, - 0x81, 0xa4, 0x7b, 0x10, 0x40, 0x57, 0x19, 0x01, 0xd9, 0xe9, 0x64, 0xa1, - 0x7c, 0x1b, 0xf3, 0x8a, 0x5a, 0x86, 0x0b, 0x19, 0x5a, 0xb5, 0xe7, 0xe8, - 0x99, 0x55, 0x6d, 0x7a, 0x28, 0x16, 0x7f, 0xd7, 0x17, 0x67, 0xfc, 0xe8, - 0x82, 0x04, 0x7a, 0x3e, 0xb5, 0x7a, 0x69, 0x0d, 0xaf, 0x9f, 0x07, 0xed, - 0xb2, 0x2c, 0xb8, 0x61, 0xe6, 0x8b, 0x9c, 0x86, 0x67, 0x37, 0xda, 0x85, - 0xba, 0xe7, 0x36, 0x88, 0x8a, 0xff, 0xd9, 0x59, 0xcc, 0x28, 0x90, 0x26, - 0x07, 0xe4, 0x9f, 0xfe, 0x10, 0x07, 0xe6, 0x61, 0x14, 0x77, 0x62, 0xf8, - 0x9c, 0x31, 0xcf, 0xfe, 0xb8, 0x00, 0x87, 0x69, 0xca, 0xef, 0xf4, 0xba, - 0x64, 0x00, 0xff, 0x74, 0x8c, 0xde, 0x69, 0xb7, 0x72, 0x31, 0xbd, 0xaf, - 0x00, 0x7a, 0x39, 0xe6, 0xcb, 0xf3, 0x9f, 0x68, 0x71, 0x2c, 0x32, 0x47, - 0xa2, 0x8a, 0xcc, 0xbb, 0x49, 0x14, 0xd1, 0x74, 0xad, 0x27, 0xae, 0x3b, - 0x47, 0x33, 0xb5, 0x89, 0xfd, 0x3e, 0x6d, 0x8a, 0xe9, 0xb8, 0x5a, 0x46, - 0x9d, 0x07, 0xd4, 0x69, 0x5a, 0xe4, 0xbe, 0x82, 0xd4, 0x1e, 0x27, 0x0e, - 0xe0, 0x14, 0xd0, 0xe9, 0x44, 0x3d, 0x64, 0x30, 0x6e, 0x9c, 0x00, 0x74, - 0x33, 0xef, 0x6c, 0x0e, 0x96, 0x54, 0x75, 0x62, 0xf3, 0xec, 0x93, 0x77, - 0x02, 0x86, 0xf5, 0x3c, 0x70, 0xe1, 0xe2, 0x73, 0xe0, 0xdf, 0x03, 0x77, - 0x26, 0xea, 0x0c, 0xef, 0x52, 0x0a, 0xc4, 0xe8, 0xfe, 0x19, 0x33, 0xad, - 0x77, 0x6e, 0x40, 0xcf, 0x6a, 0x19, 0x45, 0x0c, 0xa5, 0x80, 0x6a, 0x59, - 0xde, 0xbc, 0x01, 0x3a, 0x28, 0x0f, 0xf5, 0x0a, 0xb8, 0x33, 0x7b, 0x36, - 0x69, 0xc4, 0x8f, 0x52, 0x0b, 0x7f, 0x80, 0xd5, 0x4d, 0x42, 0xe7, 0xae, - 0x89, 0x32, 0x6c, 0xd7, 0xfd, 0xd3, 0x9f, 0x7d, 0x6e, 0xe5, 0x43, 0x8d, - 0xce, 0x27, 0x1b, 0x06, 0xd2, 0x46, 0x11, 0xc0, 0xda, 0xf3, 0x40, 0xbc, - 0x9d, 0x8d, 0x83, 0x92, 0x76, 0xbe, 0xc2, 0x48, 0x25, 0x8a, 0x62, 0x0d, - 0x46, 0x0d, 0xd5, 0x67, 0x72, 0x15, 0x00, 0x93, 0xd1, 0x0c, 0x7a, 0x02, - 0x1e, 0x41, 0xa5, 0xd7, 0xd5, 0xa2, 0xb4, 0x62, 0x28, 0x7c, 0xa4, 0xab, - 0x51, 0xd0, 0xbf, 0xf7, 0x64, 0xf2, 0xcc, 0x74, 0x9e, 0x1b, 0x37, 0x7e, - 0xfd, 0x82, 0x5b, 0x41, 0x01, 0x44, 0x77, 0x2f, 0x94, 0xd8, 0x9d, 0x38, - 0xf6, 0xdc, 0xb2, 0x53, 0xe6, 0xf1, 0x76, 0x6a, 0x80, 0x39, 0x49, 0x65, - 0x7c, 0xe7, 0x94, 0xe2, 0x35, 0x55, 0xfb, 0x1a, 0x35, 0x3d, 0xb5, 0xed, - 0xa0, 0x15, 0x37, 0xac, 0x31, 0x29, 0xe4, 0xf2, 0xe0, 0x7b, 0x7a, 0xfc, - 0x80, 0xe6, 0x21, 0xb1, 0x9d, 0xcc, 0x2c, 0xbb, 0x7b, 0x2c, 0xfe, 0x83, - 0x1f, 0x2b, 0x24, 0xea, 0xf1, 0xd1, 0xd2, 0x5b, 0x4c, 0x6f, 0xaf, 0xca, - 0x53, 0x9c, 0x6e, 0x92, 0x40, 0x98, 0x93, 0xf0, 0x50, 0x64, 0x92, 0x9b, - 0xd8, 0xd5, 0xd7, 0xff, 0x46, 0x39, 0x59, 0xd5, 0x5b, 0x42, 0x95, 0xbf, - 0x08, 0x6d, 0xaf, 0xa0, 0x58, 0xec, 0x3c, 0x59, 0x76, 0x8e, 0xd8, 0xfb, - 0x0f, 0xe9, 0x94, 0x0d, 0xd6, 0x68, 0x48, 0xd0, 0x03, 0x86, 0xd0, 0x70, - 0xa9, 0x62, 0xdb, 0x9c, 0x69, 0x1e, 0x84, 0x9b, 0x87, 0xb0, 0xb2, 0x9b, - 0xce, 0x41, 0xae, 0x9a, 0x5f, 0xb7, 0x76, 0x40, 0x5a, 0xb2, 0x90, 0x1e, - 0x6b, 0x10, 0x89, 0xb2, 0x69, 0xab, 0x5c, 0xcd, 0xb5, 0xe1, 0x93, 0xeb, - 0xbd, 0xb1, 0x1a, 0xdb, 0x65, 0xd5, 0xc2, 0x9d, 0x4b, 0xcd, 0xff, 0xf7, - 0x7f, 0x16, 0x17, 0x22, 0x38, 0xf2, 0x51, 0x71, 0x3b, 0x54, 0x8c, 0x66, - 0x99, 0xde, 0x1b, 0xdd, 0x7e, 0x54, 0xe5, 0xa5, 0x25, 0x29, 0xee, 0xa2, - 0xb4, 0x81, 0x62, 0xec, 0x41, 0x77, 0x4a, 0x04, 0x07, 0xe2, 0xb9, 0xb5, - 0xaf, 0x92, 0x8e, 0xde, 0xc6, 0x48, 0xb1, 0x0f, 0x15, 0x26, 0x3c, 0x6f, - 0x9e, 0x69, 0xf5, 0x52, 0x01, 0x91, 0x3e, 0xe2, 0xcc, 0x56, 0x21, 0x2e, - 0x4f, 0xec, 0xcd, 0xdd, 0x9c, 0x5a, 0x3a, 0x6e, 0x2e, 0x5b, 0x47, 0xe5, - 0xab, 0x3f, 0x9c, 0x96, 0x87, 0x07, 0xe4, 0xd7, 0x3a, 0xfe, 0x07, 0x22, - 0x38, 0xf2, 0x51, 0x71, 0x3b, 0x54, 0x8c, 0x66, 0x99, 0xde, 0x1b, 0xf5, - 0x65, 0x93, 0xb0, 0x49, 0x7c, 0x53, 0x51, 0x62, 0x9d, 0x7c, 0xd4, 0xe7, - 0xa5, 0xd6, 0x88, 0x33, 0x65, 0xeb, 0xb3, 0x34, 0xa5, 0x44, 0x4f, 0x8f, - 0xb9, 0x34, 0x6a, 0xae, 0xb5, 0x92, 0x43, 0x13, 0x9f, 0xa3, 0x1d, 0x06, - 0x48, 0xc3, 0xb4, 0x84, 0x54, 0x49, 0x73, 0x77, 0x12, 0xb4, 0x92, 0xae, - 0x9e, 0x32, 0xdb, 0xe0, 0x99, 0x03, 0xb5, 0x2a, 0x3f, 0x3a, 0xb3, 0x58, - 0xf6, 0x75, 0xff, 0xe8, 0xf8, 0x47, 0x22, 0x5b, 0x15, 0xe8, 0x77, 0x35, - 0x1b, 0x91, 0xc8, 0x59, 0xd3, 0x6d, 0xcf, 0x45, 0x20, 0x29, 0x6f, 0x1e, - 0x7e, 0xcb, 0x8e, 0x09, 0x09, 0xc6, 0x44, 0x7b, 0x9a, 0x89, 0xd5, 0xb8, - 0xd2, 0x31, 0xa9, 0xc4, 0x1d, 0xb6, 0x28, 0x44, 0x63, 0xfd, 0xf8, 0x7d, - 0xdb, 0xf6, 0xb9, 0xbc, 0xd6, 0x6a, 0xbf, 0x9b, 0xc0, 0xb1, 0x3a, 0x92, - 0x35, 0xc5, 0x39, 0xb3, 0x10, 0x47, 0xca, 0xec, 0xce, 0x2b, 0x2f, 0x9d, - 0xa5, 0x3a, 0x52, 0x38, 0x30, 0x50, 0x45, 0x94, 0xf6, 0xa9, 0xc7, 0x72, - 0x9f, 0x56, 0xae, 0x74, 0x6e, 0x54, 0xac, 0x0f, 0x6c, 0xcd, 0xab, 0x45, - 0x7e, 0x41, 0x44, 0x5f, 0x00, 0xfb, 0x91, 0xf6, 0xaa, 0x18, 0xc9, 0x1f, - 0x7f, 0xc3, 0xe8, 0x69, 0x68, 0x24, 0x54, 0xbf, 0x8b, 0x4f, 0x36, 0xb6, - 0x9c, 0x89, 0xe1, 0x5d, 0x0d, 0xe7, 0x99, 0xff, 0xfe, 0x36, 0x8a, 0x16, - 0x1f, 0x01, 0xe8, 0x95, 0x3a, 0xe5, 0x5a, 0x93, 0xb5, 0x93, 0xf7, 0x6d, - 0x15, 0x43, 0xbe, 0x69, 0xca, 0xc3, 0x0b, 0x37, 0x45, 0x01, 0xe8, 0x60, - 0x07, 0x23, 0x10, 0x9b, 0x2a, 0xc2, 0x97, 0x1f, 0xf1, 0x78, 0x57, 0x35, - 0x4c, 0x1e, 0xce, 0x36, 0x76, 0xcb, 0x7b, 0x98, 0xfd, 0x5f, 0x3f, 0xfc, - 0x38, 0x3e, 0x5e, 0xc9, 0x10, 0xcf, 0x3a, 0x88, 0xf4, 0x36, 0x64, 0x17, - 0x01, 0xcb, 0x41, 0x79, 0x26, 0x12, 0x1b, 0xc9, 0xf8, 0x95, 0x2a, 0x9e, - 0x8e, 0xa3, 0x5b, 0x24, 0x08, 0x1d, 0x96, 0x2f, 0xac, 0x81, 0xc3, 0xc9, - 0xe4, 0xab, 0x1f, 0xcc, 0x04, 0x0f, 0x32, 0x89, 0xa7, 0xf5, 0xff, 0x09, - 0xb2, 0xee, 0xe7, 0x6a, 0x4b, 0x15, 0x10, 0xbf, 0x08, 0xb4, 0x65, 0xb2, - 0x22, 0x66, 0x8a, 0x7e, 0x97, 0x8a, 0xab, 0x8a, 0x3a, 0x61, 0x1a, 0x0e, - 0x94, 0x18, 0x8e, 0x60, 0x2c, 0x4d, 0x89, 0x00, 0x6a, 0x62, 0xd0, 0x88, - 0x68, 0x87, 0xf9, 0x84, 0xeb, 0x13, 0xae, 0xe0, 0x24, 0x6d, 0xd3, 0x13, - 0xa8, 0xf4, 0x72, 0xc2, 0x13, 0x38, 0x89, 0x82, 0xc9, 0x91, 0x32, 0x43, - 0xde, 0xbe, 0x6a, 0x42, 0x81, 0xe4, 0x62, 0x1e, 0x38, 0x34, 0x0e, 0x15, - 0x1a, 0x04, 0xb9, 0x7b, 0xfa, 0x31, 0x67, 0xff, 0xaa, 0x4b, 0xc8, 0x1c, - 0x74, 0xb1, 0xae, 0x5f, 0x93, 0x8b, 0x47, 0xc5, 0x9f, 0xbb, 0x0e, 0x37, - 0x0a, 0x5b, 0xa8, 0x39, 0x5d, 0xd0, 0xc8, 0x24, 0xa7, 0x59, 0xf3, 0x14, - 0x5e, 0xce, 0xca, 0xc7, 0x95, 0xee, 0x93, 0xa0, 0x90, 0x0a, 0x40, 0xd8, - 0x1c, 0x54, 0xfe, 0x1e, 0x14, 0x14, 0x96, 0x43, 0x4b, 0xc5, 0x1c, 0x35, - 0x9e, 0xe8, 0x02, 0x57, 0x2b, 0xb4, 0x84, 0x14, 0x85, 0x6a, 0x48, 0x48, - 0xb2, 0x44, 0x83, 0xd4, 0x06, 0x3e, 0x80, 0x72, 0x72, 0xd6, 0xbf, 0x57, - 0x84, 0xe2, 0x81, 0x46, 0x80, 0x99, 0xbc, 0xe9, 0xee, 0xc8, 0x4a, 0x41, - 0x32, 0x34, 0xed, 0x00, 0xed, 0x47, 0xa2, 0x93, 0x0d, 0x6b, 0x06, 0x84, - 0xd3, 0x53, 0xd5, 0xda, 0x21, 0x25, 0xc2, 0xd5, 0xca, 0xd9, 0x1c, 0x53, - 0xac, 0xb4, 0x2e, 0xd4, 0xb5, 0x1b, 0xc4, 0x4b, 0x0c, 0x79, 0xa8, 0x4c, - 0x77, 0x71, 0xfe, 0x7c, 0x57, 0x7e, 0x8b, 0xf6, 0x22, 0x7d, 0x1b, 0x99, - 0x7a, 0xf0, 0x67, 0x27, 0xb5, 0xaa, 0xdf, 0x02, 0x7a, 0x69, 0x31, 0x1a, - 0xb4, 0x5c, 0x3e, 0x3c, 0xd1, 0x61, 0x39, 0x92, 0xd3, 0x51, 0x4d, 0x80, - 0x9c, 0x1a, 0xaf, 0x45, 0xcb, 0x85, 0x2d, 0x3a, 0x03, 0xe7, 0x22, 0xb6, - 0x72, 0xd0, 0x85, 0x47, 0xd0, 0x87, 0xc7, 0xb1, 0xfb, 0x38, 0x7d, 0xc8, - 0x2d, 0x1f, 0x57, 0xce, 0x9c, 0xa7, 0x55, 0x1b, 0x64, 0xcb, 0x29, 0x5d, - 0x4b, 0x73, 0x37, 0x5b, 0x6a, 0x3f, 0x51, 0x6e, 0x64, 0x61, 0xe5, 0x9f, - 0x3f, 0x76, 0x53, 0x86, 0xf1, 0xb2, 0xa0, 0xd0, 0xa8, 0x44, 0x75, 0x99, - 0x51, 0xd1, 0x18, 0xd6, 0xcc, 0x44, 0x3f, 0x0b, 0xf2, 0xc1, 0xf4, 0xa1, - 0x8f, 0x51, 0x14, 0x8a, 0x8d, 0x7d, 0x50, 0xe2, 0x64, 0x17, 0xd6, 0xe8, - 0x48, 0x86, 0xed, 0xe7, 0xb2, 0xb5, 0x61, 0xf2, 0xec, 0x2e, 0x46, 0x9a, - 0x2b, 0xc0, 0x54, 0x9d, 0xb6, 0x7c, 0x28, 0xab, 0x4b, 0x76, 0x40, 0xf2, - 0x4f, 0xd4, 0xe3, 0xad, 0xb5, 0x44, 0xdf, 0xba, 0x34, 0xb0, 0xf2, 0xcf, - 0xee, 0x63, 0x15, 0xb9, 0x7f, 0xdb, 0x78, 0xd7, 0x38, 0x79, 0x58, 0xc5, - 0x5e, 0x41, 0xaf, 0x40, 0x52, 0x48, 0xbb, 0x92, 0xb7, 0x8a, 0xc0, 0x8f, - 0x5f, 0xf2, 0x5d, 0xed, 0x3f, 0x68, 0xd5, 0xdf, 0x25, 0x35, 0x16, 0x4e, - 0xbb, 0x7e, 0x0a, 0x5c, 0xc9, 0x72, 0x1a, 0x37, 0xc3, 0x28, 0x3d, 0x18, - 0x55, 0x54, 0xd4, 0xdc, 0x36, 0x17, 0x55, 0x53, 0x94, 0xd8, 0x89, 0xdb, - 0xec, 0x59, 0x9c, 0x9a, 0x2c, 0x78, 0xf5, 0xa6, 0x56, 0x74, 0x54, 0xe1, - 0xde, 0xb1, 0x16, 0xcd, 0x47, 0xff, 0xb2, 0xd6, 0x0a, 0x45, 0xce, 0xe4, - 0xe6, 0x16, 0xc9, 0x13, 0x6e, 0xb5, 0x24, 0x19, 0x90, 0x68, 0xe9, 0xf0, - 0x63, 0x27, 0xee, 0xcd, 0x2d, 0x54, 0xc7, 0x1b, 0xd1, 0xf5, 0x59, 0x24, - 0x20, 0x7c, 0xe3, 0xb7, 0x2b, 0x04, 0x56, 0x70, 0x8c, 0x76, 0x11, 0xa8, - 0xd4, 0xa0, 0xf0, 0x57, 0xa8, 0x81, 0xe8, 0x41, 0x92, 0x26, 0x05, 0x0d, - 0x5a, 0xf5, 0xc6, 0xa0, 0x52, 0x1f, 0x23, 0x37, 0x99, 0x67, 0xad, 0x26, - 0x60, 0xa4, 0xc0, 0x5b, 0x9f, 0xc0, 0x87, 0xf9, 0x2e, 0xa6, 0xe4, 0xbe, - 0x23, 0x2b, 0x2b, 0xaf, 0x1d, 0x76, 0x1f, 0x24, 0xb3, 0x3b, 0xac, 0xf3, - 0x86, 0xda, 0x17, 0x86, 0xf3, 0x0a, 0x95, 0x0d, 0x00, 0xbc, 0x09, 0xb4, - 0x98, 0x72, 0x06, 0x8e, 0x3f, 0xa4, 0xbb, 0x8d, 0x89, 0xa0, 0x0c, 0xcc, - 0xf4, 0x6d, 0xc3, 0x46, 0x48, 0x5a, 0xe8, 0x46, 0xe7, 0x6a, 0x1d, 0x8d, - 0xe2, 0x47, 0x3a, 0x0e, 0xe3, 0x57, 0xc0, 0xe5, 0xdb, 0xfc, 0xaa, 0xe7, - 0xaa, 0x8e, 0x66, 0x5a, 0xc6, 0x97, 0xa2, 0xdd, 0xd9, 0x42, 0x5e, 0x4a, - 0x46, 0x31, 0x8b, 0x5c, 0xbf, 0x2d, 0x4f, 0xdc, 0x12, 0xcd, 0x70, 0x89, - 0xe2, 0xf4, 0x89, 0xf7, 0x03, 0x5b, 0xed, 0x2c, 0x9d, 0x51, 0xb6, 0x42, - 0xd8, 0x98, 0x61, 0x96, 0xdb, 0x4a, 0x9c, 0x7c, 0xb8, 0xb4, 0xe5, 0xee, - 0x49, 0x87, 0xfc, 0x04, 0x62, 0x25, 0xee, 0x8d, 0x07, 0x26, 0x13, 0xe5, - 0xeb, 0xe3, 0xa1, 0x29, 0xd4, 0x43, 0x02, 0xe2, 0x82, 0x10, 0x2d, 0x0a, - 0x2f, 0x49, 0xe1, 0x3d, 0x70, 0xf9, 0x67, 0xa7, 0x8e, 0x51, 0xac, 0x16, - 0x29, 0xa0, 0x6b, 0x69, 0xc7, 0x12, 0x43, 0xdf, 0x3f, 0x51, 0xf4, 0x0f, - 0xe2, 0x09, 0xf5, 0xcb, 0x62, 0x4e, 0x39, 0x53, 0x54, 0xf6, 0xb8, 0xc8, - 0x44, 0x4e, 0xf7, 0xa9, 0x74, 0x3e, 0x5f, 0xf6, 0x4a, 0x99, 0x20, 0x04, - 0x48, 0x51, 0x92, 0xcf, 0xca, 0xd1, 0xc7, 0x4c, 0xb1, 0x9d, 0x34, 0xb5, - 0x07, 0xce, 0x84, 0x9b, 0x7f, 0xd6, 0xf5, 0x77, 0x28, 0xe3, 0x9c, 0x19, - 0xe5, 0x72, 0xc5, 0x4f, 0x5d, 0xf8, 0x23, 0x03, 0x14, 0x5e, 0x80, 0x65, - 0x58, 0x8d, 0xb3, 0x7d, 0x01, 0xc8, 0xf6, 0xfd, 0x4a, 0x9d, 0x3e, 0x77, - 0x06, 0xf5, 0xa0, 0x34, 0x89, 0xf0, 0xe7, 0x1e, 0xea, 0x53, 0x36, 0xa1, - 0x19, 0x78, 0x1f, 0xf7, 0x3a, 0x6d, 0xaf, 0x77, 0x30, 0xe2, 0x38, 0x42, - 0x9a, 0x0e, 0xc0, 0xbe, 0x9a, 0xcf, 0x34, 0x28, 0x3d, 0xd1, 0xeb, 0xf5, - 0x08, 0x92, 0xe7, 0xa5, 0xbf, 0xd7, 0xa8, 0x4c, 0xad, 0x7f, 0x36, 0x85, - 0xe4, 0x01, 0xce, 0x15, 0x3c, 0x9e, 0xc4, 0x7a, 0x96, 0x83, 0xd1, 0x84, - 0xf8, 0x6b, 0x5c, 0x2e, 0x94, 0x2c, 0x9a, 0x5f, 0x0f, 0x6c, 0xac, 0xfe, - 0x2f, 0x7e, 0xcf, 0x14, 0xd3, 0x18, 0x47, 0x81, 0x06, 0xef, 0x8c, 0x24, - 0x4a, 0x72, 0xd8, 0x3b, 0x07, 0x21, 0x2d, 0xd9, 0xe5, 0xb2, 0x73, 0xae, - 0x7e, 0x3d, 0x44, 0xdb, 0xc9, 0x45, 0x28, 0x90, 0x8b, 0xd2, 0x1b, 0x9b, - 0x6d, 0x9b, 0x9f, 0xad, 0x9f, 0x41, 0x0a, 0x10, 0x18, 0xaa, 0x68, 0x70, - 0x0f, 0xa2, 0x61, 0x3b, 0x86, 0x69, 0x3a, 0x17, 0xc8, 0x85, 0x12, 0x28, - 0xdd, 0x8e, 0x6c, 0x25, 0xa7, 0x29, 0xee, 0x0c, 0x71, 0x70, 0x71, 0x4c, - 0x1a, 0x62, 0x18, 0xf1, 0x2e, 0xb1, 0x31, 0xa9, 0x46, 0x0c, 0x1e, 0xd6, - 0x8b, 0x18, 0x94, 0x8e, 0x6e, 0xaa, 0x59, 0x94, 0xef, 0xf9, 0x31, 0xfd, - 0xfa, 0x3f, 0xc3, 0x24, 0x3e, 0xfe, 0x46, 0x63, 0x90, 0xf4, 0x96, 0x28, - 0x17, 0xe8, 0xbe, 0x53, 0x97, 0x45, 0x90, 0x9e, 0x2f, 0xca, 0x67, 0xe0, - 0xb1, 0x20, 0xc5, 0xde, 0x81, 0x18, 0xca, 0x97, 0x49, 0x7c, 0x01, 0xb9, - 0x06, 0x95, 0x0b, 0x13, 0x57, 0x89, 0xdf, 0xe5, 0x51, 0x0c, 0x94, 0xb9, - 0x4e, 0x10, 0x94, 0xa2, 0xb5, 0xb2, 0x01, 0xc4, 0x95, 0xb4, 0x68, 0x12, - 0x27, 0x29, 0x00, 0x79, 0x7c, 0x6f, 0x4d, 0x1c, 0x1c, 0xa9, 0xeb, 0x9d, - 0xe6, 0xe5, 0xe3, 0x68, 0xd0, 0xe8, 0x7c, 0x35, 0x6a, 0x70, 0x2a, 0xc2, - 0x14, 0xb4, 0x5e, 0xa2, 0xc7, 0x4c, 0x34, 0xab, 0x5c, 0x44, 0xff, 0xf9, - 0x32, 0x8d, 0x11, 0xec, 0x35, 0xcc, 0x1a, 0xdb, 0x9c, 0xc6, 0xb6, 0xe2, - 0xef, 0x17, 0xdb, 0x93, 0xdb, 0x94, 0x36, 0x3a, 0x81, 0x8a, 0xbb, 0x22, - 0x01, 0x59, 0xef, 0xe6, 0xed, 0xa6, 0xe7, 0x2a, 0xb6, 0xef, 0x93, 0x86, - 0x3c, 0x03, 0xa5, 0x53, 0x8a, 0xf9, 0x69, 0x42, 0x87, 0xd2, 0x87, 0xcf, - 0x01, 0xdd, 0x74, 0xb8, 0x3e, 0x68, 0x08, 0xdb, 0x5a, 0xa9, 0xa2, 0x66, - 0x9c, 0xdc, 0x6a, 0x20, 0xe2, 0xbd, 0xd1, 0xc1, 0xa7, 0x31, 0x10, 0xb8, - 0x4a, 0x30, 0xde, 0x1f, 0x2c, 0x4e, 0x39, 0x81, 0x6f, 0xdf, 0xd3, 0x92, - 0x30, 0xd0, 0x51, 0x1e, 0xc0, 0xd1, 0x95, 0xbf, 0x16, 0x1e, 0xfb, 0x0c, - 0x71, 0xc0, 0xda, 0x33, 0x75, 0x74, 0xc2, 0xa7, 0x10, 0x6c, 0xe7, 0x74, - 0xca, 0x39, 0xa6, 0x71, 0xc3, 0x21, 0xf2, 0x28, 0x6a, 0xe3, 0xdf, 0x76, - 0xb3, 0x8c, 0xeb, 0xea, 0x72, 0xdc, 0x9c, 0x35, 0xbc, 0x21, 0x3e, 0x34, - 0x66, 0xa5, 0x96, 0xbd, 0x6e, 0x34, 0x62, 0xc0, 0xc2, 0x62, 0xf0, 0xfc, - 0x0d, 0x64, 0x68, 0xd6, 0x78, 0xe6, 0x0c, 0x0f, 0x32, 0xfa, 0x2e, 0xe1, - 0x49, 0x11, 0x33, 0x51, 0x74, 0x6c, 0x82, 0x15, 0x66, 0x44, 0xbb, 0xd8, - 0xa4, 0xc6, 0xfc, 0xd1, 0x76, 0x43, 0x58, 0x4a, 0x08, 0x3b, 0xa7, 0x78, - 0x6e, 0x4c, 0x7a, 0x83, 0xa0, 0x1b, 0x38, 0x38, 0xf3, 0xe2, 0xe4, 0x64, - 0xb5, 0x13, 0x8c, 0xad, 0x21, 0x37, 0xb0, 0xf2, 0xc9, 0xe3, 0xf3, 0xf4, - 0xc6, 0xbd, 0xa9, 0x17, 0x5a, 0x4e, 0x24, 0xf4, 0x94, 0x0f, 0x0d, 0x41, - 0x6e, 0x7b, 0xa4, 0x4d, 0xc0, 0xb0, 0x98, 0xea, 0x96, 0x40, 0x06, 0xd1, - 0x6c, 0x59, 0x03, 0xdd, 0x93, 0x1d, 0xf9, 0xf7, 0x68, 0x39, 0x96, 0xe6, - 0xe7, 0xa5, 0x82, 0x6d, 0x50, 0x26, 0x2c, 0xa5, 0xb3, 0x2a, 0x80, 0x32, - 0x4d, 0x18, 0x47, 0x99, 0x3d, 0xe5, 0xde, 0xe1, 0x69, 0x30, 0x70, 0x17, - 0x20, 0x4c, 0xcc, 0xf1, 0x44, 0x88, 0x8b, 0x48, 0x76, 0x58, 0x71, 0x07, - 0xa9, 0x29, 0x3a, 0x4e, 0xf5, 0xfc, 0xa8, 0xb3, 0xba, 0xc8, 0x50, 0x42, - 0x5c, 0x95, 0xbc, 0x47, 0x61, 0xf7, 0x26, 0x2d, 0x6f, 0x01, 0x73, 0x8b, - 0xa8, 0x1c, 0x98, 0x43, 0x5a, 0xe1, 0xdc, 0x9f, 0x13, 0xe9, 0x0a, 0xb1, - 0xa3, 0xb8, 0xa2, 0x51, 0x8b, 0xf6, 0xb0, 0xfe, 0x38, 0x16, 0x0e, 0x4a, - 0xe1, 0xe1, 0x87, 0xd0, 0x4b, 0x17, 0x00, 0x57, 0x87, 0x7d, 0x27, 0xef, - 0x84, 0x23, 0xee, 0x04, 0x49, 0x21, 0x52, 0xdc, 0x2f, 0xa5, 0x87, 0xa9, - 0x6a, 0x30, 0xc8, 0xfa, 0x36, 0x33, 0xcb, 0x5f, 0xa0, 0xae, 0x9b, 0x13, - 0x35, 0x77, 0x9b, 0x70, 0x38, 0xe8, 0x3d, 0xd5, 0xf7, 0x70, 0x9d, 0x15, - 0x2d, 0xa8, 0x70, 0x43, 0xff, 0x01, 0x11, 0x68, 0xa8, 0x47, 0xe5, 0x9c, - 0x5f, 0x39, 0xd5, 0xb2, 0x32, 0x6e, 0x31, 0x14, 0xa4, 0xde, 0xdf, 0x10, - 0x75, 0x8c, 0xde, 0xc6, 0xae, 0xf0, 0xec, 0x14, 0x94, 0xd8, 0xf4, 0xdd, - 0x62, 0x5e, 0x7f, 0xf4, 0x3d, 0xcb, 0x37, 0x41, 0x25, 0xb0, 0x72, 0x6e, - 0xa6, 0xd4, 0xe4, 0xca, 0x39, 0x1e, 0x1b, 0x68, 0x23, 0xa7, 0x84, 0x3a, - 0x5e, 0x2c, 0x1d, 0x50, 0xc4, 0x84, 0x6f, 0x01, 0xf6, 0x75, 0xcc, 0x90, - 0x8b, 0x47, 0x52, 0x47, 0x80, 0xf4, 0x68, 0xb5, 0xb4, 0xd0, 0x54, 0x3d, - 0x87, 0xf3, 0x2c, 0x14, 0x54, 0xc5, 0x38, 0x5d, 0xa8, 0x95, 0x80, 0x43, - 0x28, 0x1e, 0x3f, 0x26, 0x8e, 0xca, 0xc8, 0x58, 0x95, 0x08, 0xdf, 0x1e, - 0xab, 0x04, 0x45, 0x8f, 0xa9, 0x10, 0x09, 0xdf, 0x9e, 0xa4, 0x56, 0x96, - 0x7c, 0x4f, 0x87, 0x3a, 0xe2, 0x12, 0x6f, 0xa5, 0x66, 0xb2, 0x49, 0xfa, - 0xc1, 0xd1, 0x39, 0xe1, 0x68, 0x9b, 0x35, 0x19, 0x8e, 0x07, 0xe9, 0x12, - 0xfd, 0x9d, 0x59, 0x46, 0x44, 0x5e, 0x92, 0x3c, 0xa4, 0xd6, 0x64, 0x3d, - 0x37, 0x07, 0x1f, 0x2f, 0xf9, 0x7f, 0xaa, 0x63, 0xd8, 0xf1, 0x22, 0x45, - 0x0d, 0x62, 0x4f, 0x6f, 0x6a, 0x81, 0x73, 0x00, 0xcf, 0xaf, 0x84, 0xf2, - 0x6c, 0x89, 0x42, 0x67, 0xc7, 0x01, 0x38, 0x62, 0x4c, 0x78, 0x4e, 0x49, - 0x3b, 0x4b, 0x1b, 0xbd, 0x32, 0x39, 0x67, 0xbf, 0x80, 0x90, 0x92, 0x04, - 0x56, 0xe3, 0xc7, 0x16, 0x6e, 0xa4, 0x88, 0xe9, 0xd7, 0x0f, 0x60, 0x4f, - 0x35, 0x85, 0x53, 0x60, 0x89, 0xd1, 0x1d, 0x29, 0xfa, 0x8c, 0x32, 0xd7, - 0xc4, 0xe8, 0x8c, 0x17, 0x2e, 0x4c, 0x91, 0x6a, 0x7d, 0xc9, 0xe6, 0x1d, - 0xe5, 0xed, 0xfe, 0xae, 0x14, 0x70, 0x03, 0x18, 0xd0, 0xd7, 0xfc, 0xd3, - 0x77, 0x50, 0x6c, 0xe3, 0x0e, 0x58, 0x16, 0xc2, 0x91, 0x6b, 0x93, 0x40, - 0x55, 0xec, 0xe5, 0x16, 0x72, 0xc6, 0x6c, 0xda, 0x77, 0x2e, 0x78, 0xa4, - 0x36, 0x7e, 0x20, 0x5c, 0xb0, 0x7d, 0xbb, 0xcb, 0xd7, 0x00, 0x26, 0x97, - 0xa2, 0xea, 0x1a, 0x98, 0xda, 0x39, 0x7d, 0x96, 0xda, 0x50, 0x50, 0x3d, - 0xfb, 0x50, 0xee, 0xb1, 0xfe, 0x45, 0x55, 0x9c, 0xc4, 0x46, 0x7b, 0x13, - 0x03, 0x0e, 0x6d, 0xb4, 0x6a, 0x9a, 0x45, 0x76, 0xe5, 0x00, 0x25, 0x9b, - 0x37, 0x7b, 0x65, 0x59, 0x6c, 0x3a, 0xf8, 0x16, 0x78, 0xdd, 0x1d, 0x8a, - 0x33, 0xfa, 0xe7, 0x9f, 0x36, 0xe1, 0x4c, 0xd8, 0xf7, 0x83, 0x5b, 0x12, - 0x4f, 0xde, 0xd9, 0x3c, 0x57, 0xc8, 0xa6, 0xde, 0x85, 0xf8, 0xd8, 0x5f, - 0x4b, 0x04, 0x5b, 0x7e, 0xfc, 0x8c, 0xd2, 0x24, 0x73, 0x6e, 0x54, 0x57, - 0x22, 0x7b, 0xff, 0x7b, 0xf9, 0xda, 0xb2, 0xd5, 0x87, 0x2d, 0xe4, 0x53, - 0x47, 0x37, 0x1f, 0x2d, 0x4a, 0xff, 0x34, 0x4a, 0x31, 0x9d, 0x00, 0x0a, - 0x6c, 0xac, 0xa9, 0xf6, 0xf0, 0xea, 0x59, 0x6e, 0x7d, 0x37, 0x97, 0xc6, - 0x9c, 0x7d, 0xc2, 0x5b, 0x22, 0x89, 0xb5, 0x97, 0x9c, 0x4d, 0xeb, 0xe0, - 0xf7, 0x47, 0xde, 0xcc, 0x7e, 0xf7, 0x60, 0x69, 0xe6, 0x56, 0xf0, 0xcf, - 0x9b, 0xec, 0x76, 0x1c, 0x0c, 0x61, 0x62, 0x58, 0x9f, 0x70, 0xf1, 0x4e, - 0xd9, 0x7d, 0xde, 0x0c, 0xa9, 0x72, 0x80, 0x48, 0x6b, 0x04, 0x19, 0x0b, - 0x84, 0xc4, 0x5a, 0xe5, 0x86, 0x5d, 0x24, 0x0c, 0xe8, 0x17, 0xb0, 0x26, - 0xde, 0xcb, 0xc0, 0x53, 0xe0, 0xb1, 0x8a, 0x8a, 0x09, 0x67, 0x6a, 0xa7, - 0x76, 0x53, 0x86, 0x22, 0xa8, 0x47, 0x33, 0x4a, 0x2a, 0xcb, 0x8f, 0x56, - 0x05, 0xaf, 0x8f, 0xe8, 0xdb, 0xc6, 0x7e, 0xc2, 0x76, 0x68, 0xf3, 0xef, - 0x7e, 0x4a, 0x26, 0x45, 0xd6, 0x95, 0x58, 0x27, 0x94, 0x15, 0x5c, 0x6f, - 0x92, 0x0b, 0x53, 0x43, 0x2d, 0x19, 0xf7, 0x09, 0x54, 0xec, 0x97, 0x0e, - 0xb4, 0x0f, 0x35, 0x40, 0xe8, 0x27, 0xed, 0x7c, 0x0e, 0x39, 0xe1, 0x89, - 0x71, 0xc8, 0x55, 0xb1, 0xa4, 0xea, 0x8d, 0xcb, 0x33, 0xd5, 0x6c, 0xc4, - 0x4b, 0xe7, 0xa0, 0x63, 0xaf, 0x37, 0x7c, 0xb3, 0x93, 0xd3, 0xea, 0x87, - 0xd8, 0x7b, 0x2c, 0x6f, 0xd7, 0x44, 0x9b, 0x7c, 0x0b, 0x42, 0xb5, 0xa8, - 0x94, 0xf3, 0x54, 0x1e, 0x73, 0x38, 0x4a, 0xc6, 0xb7, 0x27, 0x2c, 0x0c, - 0x0f, 0xed, 0x50, 0xd6, 0x14, 0x95, 0x8e, 0x14, 0xad, 0xce, 0x28, 0x46, - 0x0e, 0xc4, 0x98, 0x22, 0xb9, 0xa6, 0xc0, 0x26, 0x66, 0x66, 0xd0, 0x15, - 0x81, 0x84, 0xaf, 0x7e, 0xdc, 0x14, 0xe3, 0xce, 0x17, 0x9e, 0x4e, 0xa7, - 0xd5, 0x34, 0xc4, 0x60, 0x3f, 0x89, 0xbb, 0xc7, 0x4a, 0x66, 0xe6, 0x61, - 0x57, 0x93, 0x05, 0x27, 0x4e, 0x2e, 0xb2, 0xf5, 0xa7, 0x79, 0x2e, 0x8c, - 0x90, 0xea, 0xca, 0x07, 0xa3, 0x65, 0x88, 0xb0, 0xf1, 0x32, 0x3c, 0x08, - 0xef, 0x60, 0xe1, 0xfa, 0x70, 0xb2, 0x23, 0x77, 0xfe, 0x8a, 0x8c, 0x16, - 0x2c, 0xeb, 0x09, 0xd7, 0xf2, 0xfa, 0x5f, 0xae, 0xe6, 0x94, 0x27, 0xfa, - 0x3e, 0x23, 0xee, 0xf0, 0x46, 0xe0, 0xcd, 0x03, 0xee, 0xc7, 0x60, 0xed, - 0x4e, 0x29, 0x90, 0xdd, 0xe5, 0x51, 0x13, 0xcb, 0xef, 0x16, 0x40, 0x0c, - 0xb5, 0xa7, 0xfa, 0xe7, 0x48, 0x66, 0x1c, 0x14, 0x83, 0x15, 0xdd, 0xc1, - 0x2a, 0x29, 0xcf, 0x6a, 0x7d, 0x89, 0xe6, 0xd3, 0xba, 0x8c, 0x26, 0x4f, - 0x09, 0x3e, 0xb6, 0xbe, 0x88, 0x3a, 0x67, 0xe3, 0xf2, 0x05, 0x70, 0x03, - 0xaf, 0xfe, 0x66, 0xbf, 0xaf, 0xda, 0xeb, 0x8b, 0x24, 0xb8, 0x9b, 0x4a, - 0xa3, 0x41, 0x47, 0xa5, 0xa8, 0x4b, 0xb3, 0xdb, 0x2e, 0xd5, 0x8e, 0x9b, - 0xd6, 0xcd, 0x3b, 0x23, 0x77, 0x7f, 0x69, 0x61, 0xfe, 0xb3, 0x41, 0x7c, - 0x9c, 0xfb, 0xe7, 0xb3, 0x09, 0x75, 0x98, 0x79, 0x41, 0xfb, 0xb1, 0xe7, - 0x5f, 0x61, 0xe9, 0xd0, 0x6f, 0x13, 0xcb, 0x90, 0x2c, 0x57, 0xee, 0x69, - 0x31, 0xb9, 0xb9, 0xc0, 0xe3, 0x30, 0x44, 0xc0, 0x76, 0x14, 0x78, 0xbf, - 0x20, 0x5e, 0xc5, 0xfb, 0x01, 0x53, 0x19, 0xfc, 0x5a, 0x84, 0xb5, 0xe0, - 0xaa, 0x90, 0x56, 0xe4, 0xa8, 0x57, 0x29, 0x60, 0x37, 0xa3, 0x3d, 0xba, - 0x95, 0xc7, 0x2f, 0x72, 0x20, 0x1d, 0x9a, 0x44, 0xc4, 0x52, 0x6c, 0x03, - 0xf6, 0x78, 0xbd, 0xf7, 0xf1, 0xa9, 0x5a, 0x7e, 0xcf, 0x05, 0xae, 0x71, - 0x11, 0x82, 0xc7, 0xf7, 0x6f, 0x14, 0x61, 0xfa, 0x91, 0x00, 0x0d, 0xfc, - 0x4a, 0x37, 0xbb, 0x5d, 0x98, 0xfe, 0xdf, 0xed, 0xeb, 0x1a, 0x3e, 0xaa, - 0x29, 0x94, 0x2e, 0x6c, 0x96, 0xd3, 0x85, 0xfd, 0x41, 0x53, 0x59, 0x17, - 0x77, 0xc6, 0x5c, 0xa7, 0x38, 0xce, 0x21, 0xd0, 0x0c, 0x03, 0x63, 0x76, - 0xa2, 0xaf, 0x88, 0xf6, 0xd0, 0xc7, 0xd1, 0x06, 0xcf, 0x44, 0x11, 0x66, - 0x93, 0xaf, 0x5f, 0x8f, 0x8e, 0x03, 0xb6, 0x7d, 0x10, 0x93, 0x8b, 0xcc, - 0x63, 0x8c, 0xd3, 0x51, 0xe6, 0xb5, 0xf4, 0x2a, 0xfe, 0x1d, 0xef, 0xa3, - 0xfc, 0xd6, 0x69, 0x3e, 0x68, 0x82, 0x4f, 0x32, 0x80, 0x2b, 0x21, 0x93, - 0x97, 0x77, 0xbf, 0x86, 0x77, 0x67, 0x23, 0x5e, 0x05, 0x54, 0x4c, 0xa8, - 0xa7, 0x99, 0x14, 0x4e, 0x49, 0x21, 0x0e, 0x46, 0x0a, 0x79, 0x98, 0x09, - 0x11, 0xbd, 0xc4, 0x41, 0x31, 0x74, 0xdc, 0xc7, 0x94, 0x8e, 0x0c, 0xea, - 0xed, 0x71, 0x33, 0xcf, 0xda, 0xc2, 0xf4, 0xfb, 0x2c, 0x7a, 0x0d, 0xb5, - 0x57, 0xcc, 0xea, 0x70, 0x24, 0xdf, 0xb9, 0x76, 0x8e, 0x4d, 0x63, 0x8c, - 0xad, 0xe2, 0x09, 0x4f, 0xbf, 0x0f, 0x3c, 0x76, 0xf9, 0x5c, 0x30, 0x7f, - 0x86, 0x21, 0xa0, 0x04, 0xf7, 0x45, 0x2e, 0x0a, 0xa4, 0xf9, 0x74, 0xf9, - 0xb9, 0xc2, 0xa2, 0xe5, 0x03, 0x25, 0x1d, 0x72, 0x00, 0x38, 0x60, 0x29, - 0xe0, 0xd3, 0x0d, 0x0f, 0x6b, 0x46, 0xd5, 0xda, 0x36, 0xdf, 0x3a, 0x10, - 0xc0, 0xfb, 0x19, 0x03, 0xd3, 0xac, 0x7d, 0x47, 0xe5, 0xb8, 0xd0, 0xa0, - 0xa3, 0x3f, 0xa1, 0x83, 0xe2, 0x74, 0x45, 0x46, 0x18, 0x89, 0xa3, 0x65, - 0x08, 0xb1, 0xa5, 0xc2, 0x8a, 0x8d, 0x46, 0xf6, 0x0d, 0xdb, 0x86, 0x92, - 0x40, 0xa0, 0x1c, 0x0e, 0xb5, 0x54, 0x31, 0x24, 0xb7, 0x4d, 0xc8, 0xf3, - 0x9d, 0x56, 0x4a, 0xf3, 0xc7, 0x5b, 0xa7, 0x1d, 0x9f, 0x33, 0xf8, 0x45, - 0x3a, 0x45, 0x5f, 0xd6, 0xba, 0x57, 0xda, 0x2b, 0x7c, 0x2f, 0x2b, 0x8b, - 0x77, 0xec, 0x33, 0xe8, 0xd9, 0x4d, 0x34, 0xca, 0xb5, 0x52, 0x11, 0x77, - 0xc8, 0x77, 0xf9, 0x20, 0x10, 0x81, 0xc9, 0xf4, 0x76, 0xff, 0xa2, 0xcb, - 0xf8, 0x9d, 0xc2, 0x7c, 0x1f, 0xd0, 0x73, 0x91, 0x32, 0xbb, 0xd5, 0xfa, - 0x3b, 0xf6, 0x13, 0x4b, 0xa9, 0xd4, 0x06, 0x0e, 0x64, 0x5b, 0xc6, 0x56, - 0x69, 0x6f, 0xc4, 0xce, 0x23, 0x75, 0xb0, 0x62, 0xfa, 0x12, 0x8d, 0x1b, - 0x98, 0x35, 0x41, 0xfe, 0x0c, 0x7f, 0x96, 0xb1, 0x51, 0x9a, 0x35, 0xa1, - 0xc1, 0x5a, 0x79, 0x0d, 0x90, 0x2c, 0x29, 0xc9, 0x4a, 0x21, 0x06, 0x67, - 0x4d, 0x79, 0x99, 0xf9, 0xda, 0x12, 0x8b, 0x79, 0xc1, 0xbc, 0x39, 0xd7, - 0xfc, 0x16, 0xa4, 0x41, 0x30, 0x46, 0xba, 0x43, 0x33, 0xd3, 0xa4, 0xbd, - 0xcf, 0xf0, 0x5d, 0x9c, 0x34, 0x65, 0xc0, 0x55, 0x8f, 0xea, 0x35, 0xe8, - 0x32, 0xfd, 0x21, 0xb0, 0x04, 0x81, 0x79, 0x56, 0xb2, 0x7e, 0xb6, 0xf6, - 0xd0, 0xb0, 0x81, 0xef, 0xd4, 0x65, 0x8b, 0x1e, 0xaa, 0xda, 0x15, 0x19, - 0x79, 0xec, 0xd1, 0x38, 0x75, 0x47, 0x3e, 0x98, 0x10, 0x98, 0xf5, 0xfe, - 0x80, 0x17, 0x6a, 0xa4, 0x0c, 0x32, 0x2d, 0x4a, 0xe9, 0x92, 0x1f, 0xfe, - 0xf2, 0xa0, 0x50, 0x22, 0x99, 0x07, 0x72, 0x8a, 0xfd, 0x82, 0x54, 0xc3, - 0x01, 0x65, 0xd9, 0xe7, 0xeb, 0xe2, 0x7d, 0x5c, 0x8c, 0x00, 0x35, 0x45, - 0x15, 0xb1, 0xb2, 0x7f, 0x17, 0x2b, 0xe1, 0xcd, 0x06, 0xe2, 0x46, 0x2b, - 0x86, 0xe2, 0xe9, 0xf6, 0xf6, 0x11, 0xf1, 0x21, 0x8b, 0x9b, 0x35, 0xb9, - 0x85, 0xaf, 0x7d, 0xbe, 0xe0, 0x0d, 0xa3, 0x08, 0x6e, 0x50, 0xc1, 0x71, - 0x4f, 0x27, 0x43, 0x3f, 0x6d, 0xab, 0xf8, 0x31, 0x4b, 0xbe, 0x5d, 0x7b, - 0x5a, 0xae, 0xbe, 0xe2, 0x53, 0xf8, 0xb8, 0xf1, 0x17, 0x5d, 0x7f, 0x34, - 0x18, 0x87, 0x69, 0xd4, 0xc7, 0x73, 0x11, 0xa6, 0x02, 0xed, 0xfe, 0xb8, - 0x7c, 0x8a, 0x72, 0x09, 0x45, 0x4c, 0xe9, 0x92, 0x19, 0x66, 0x4f, 0x92, - 0xcf, 0x46, 0x4b, 0xe3, 0xa9, 0x62, 0xb7, 0xc4, 0x05, 0x38, 0x98, 0xd0, - 0x1f, 0xd9, 0xff, 0xf0, 0x77, 0x6e, 0x09, 0x99, 0x7e, 0xab, 0x92, 0x20, - 0x5e, 0xc8, 0x46, 0xca, 0x74, 0xd1, 0xf7, 0x0b, 0x7d, 0x56, 0x35, 0x25, - 0xf9, 0xd2, 0xa3, 0x9f, 0x57, 0xf7, 0x62, 0x33, 0x67, 0xfb, 0x04, 0x03, - 0x33, 0x3b, 0xf0, 0x25, 0xf9, 0x2b, 0xe3, 0x68, 0x2a, 0x82, 0xaf, 0xa7, - 0x27, 0xfa, 0x1e, 0xab, 0xb7, 0x71, 0x96, 0x8c, 0x87, 0x61, 0x79, 0x14, - 0x61, 0xf9, 0x0b, 0x87, 0xde, 0x60, 0x20, 0xf5, 0x6f, 0xe8, 0xdb, 0x27, - 0x90, 0x01, 0x31, 0xc7, 0xfc, 0x08, 0x50, 0x5c, 0x7a, 0x30, 0x9a, 0xdd, - 0x55, 0xe5, 0x00, 0x85, 0xea, 0xb1, 0x8b, 0xf8, 0x6a, 0x18, 0x57, 0x50, - 0x1f, 0xf7, 0xd2, 0x3a, 0xa1, 0x0f, 0xee, 0x80, 0x70, 0x12, 0x33, 0x42, - 0x6f, 0x5c, 0xe6, 0xe0, 0x7f, 0x9a, 0xa4, 0x4f, 0x47, 0x7f, 0xd3, 0x23, - 0x61, 0xd8, 0x66, 0x32, 0x31, 0x3f, 0xa3, 0xd2, 0x85, 0xb9, 0x4f, 0xb4, - 0xed, 0x92, 0x5f, 0x0f, 0x3a, 0x75, 0x13, 0xbe, 0xac, 0xf8, 0xcd, 0x14, - 0x8f, 0x54, 0xc3, 0x8c, 0x54, 0xe3, 0x19, 0x3e, 0xfb, 0xfb, 0xea, 0x1b, - 0x2a, 0x87, 0x25, 0xd0, 0x0e, 0x11, 0xfd, 0x28, 0x63, 0xba, 0x92, 0xc3, - 0x64, 0xc1, 0x26, 0x5a, 0x1a, 0x36, 0x02, 0x39, 0x6d, 0x8f, 0xa6, 0x58, - 0x68, 0x54, 0x48, 0x32, 0x3d, 0x6a, 0x82, 0x24, 0x85, 0xd0, 0x5e, 0x79, - 0x1b, 0xbb, 0xd2, 0x50, 0xfb, 0x0c, 0x47, 0x5a, 0xc3, 0x6c, 0xe6, 0x24, - 0x1f, 0xc3, 0x80, 0x0a, 0xc5, 0xfb, 0xf1, 0x49, 0xbb, 0x8c, 0x9d, 0x8b, - 0x49, 0x79, 0x4c, 0x7b, 0xc1, 0x60, 0x4a, 0x60, 0xa9, 0x93, 0xf9, 0x16, - 0xb1, 0x17, 0x08, 0x90, 0x5f, 0x20, 0xe1, 0x9b, 0x5b, 0xc3, 0xa4, 0x8e, - 0xed, 0xef, 0xca, 0xc4, 0xb1, 0x08, 0x70, 0x56, 0xa7, 0x4e, 0x0d, 0x8f, - 0x36, 0x59, 0xbc, 0xff, 0xfe, 0x26, 0x9a, 0x0e, 0x4e, 0x56, 0xfe, 0xa3, - 0x7b, 0x2b, 0xdf, 0x0c, 0x73, 0x54, 0x95, 0x85, 0x84, 0xc2, 0x1a, 0xba, - 0x9d, 0xab, 0x13, 0xce, 0xf7, 0xe6, 0x3f, 0xdd, 0x91, 0x75, 0x0f, 0xa0, - 0x2b, 0x3b, 0xbb, 0x39, 0xc7, 0x60, 0x33, 0xb8, 0x63, 0xe3, 0xae, 0xc2, - 0x49, 0xe0, 0x1d, 0x9e, 0x81, 0x17, 0xd1, 0xa0, 0x00, 0x7c, 0xfd, 0x3b, - 0xce, 0xc8, 0x58, 0x4d, 0x68, 0x32, 0xb9, 0x8b, 0x04, 0xf3, 0x4d, 0x93, - 0x53, 0x53, 0xf3, 0x78, 0xc6, 0x59, 0x7f, 0xe7, 0x2b, 0xb4, 0x0f, 0xe0, - 0x6e, 0xdd, 0x55, 0x95, 0xa8, 0xbe, 0x03, 0xfb, 0xa3, 0xe6, 0xd4, 0x9c, - 0x38, 0x2f, 0xb0, 0xc2, 0x1d, 0x09, 0x2d, 0x2c, 0xbe, 0x73, 0x7d, 0xc1, - 0x83, 0x40, 0x75, 0x41, 0x3e, 0x2e, 0xa7, 0xbe, 0x22, 0x64, 0x2d, 0x39, - 0x4e, 0xf2, 0xcf, 0x8f, 0x4e, 0x8d, 0xee, 0x1c, 0x2a, 0xd2, 0xd8, 0x87, - 0x66, 0x69, 0x76, 0x11, 0x3f, 0x31, 0x4b, 0xa9, 0xd9, 0xce, 0x01, 0xcd, - 0x53, 0x89, 0x40, 0x95, 0x7a, 0x60, 0x3c, 0xdf, 0x1f, 0xc1, 0xe3, 0xb3, - 0x9e, 0x76, 0xfb, 0xd3, 0xa1, 0x20, 0xa4, 0x72, 0xe5, 0x40, 0x3f, 0xc2, - 0x0b, 0xe9, 0xf6, 0x47, 0x47, 0xa1, 0x93, 0x9f, 0x25, 0x43, 0x97, 0xf1, - 0x51, 0x30, 0x02, 0x28, 0x72, 0xcc, 0x36, 0xaf, 0x03, 0x9f, 0xb8, 0x67, - 0xbc, 0xcf, 0xf3, 0x1d, 0xca, 0x09, 0xc9, 0x23, 0xa4, 0x74, 0xc6, 0x71, - 0x6c, 0xe0, 0x94, 0xa3, 0x04, 0xbd, 0xa0, 0xf4, 0xf2, 0x29, 0x5c, 0x70, - 0x3b, 0x33, 0xcc, 0xdd, 0x8a, 0xbe, 0x9e, 0x09, 0xd0, 0xd4, 0xb6, 0x98, - 0x43, 0x8a, 0x2f, 0x6f, 0x00, 0xd7, 0xd2, 0x54, 0x12, 0x1b, 0x23, 0xaf, - 0xd6, 0xc0, 0xce, 0xb3, 0x61, 0xb4, 0xf1, 0x6d, 0xe0, 0x33, 0x86, 0xe0, - 0x60, 0xc6, 0x72, 0x06, 0xb4, 0x63, 0xdf, 0xde, 0xb6, 0x5e, 0xce, 0x56, - 0x9f, 0xe2, 0xdc, 0x80, 0x7c, 0x23, 0x61, 0x7c, 0x63, 0x49, 0x90, 0x9b, - 0x68, 0x13, 0xa1, 0x2d, 0xc8, 0x25, 0x94, 0x9a, 0x3d, 0x9c, 0x58, 0xf3, - 0xb6, 0xed, 0x7e, 0x62, 0x78, 0x3b, 0x5b, 0x59, 0xa6, 0x57, 0x84, 0xee, - 0x19, 0x2a, 0x91, 0x57, 0x38, 0x3d, 0x83, 0xef, 0xb7, 0xad, 0xb1, 0xd4, - 0x2a, 0x3b, 0x47, 0xe3, 0xb7, 0x42, 0xa8, 0x61, 0xac, 0x92, 0x5e, 0xe3, - 0xd1, 0xd9, 0x98, 0x2b, 0x1b, 0x6d, 0x5c, 0xb7, 0x5b, 0x72, 0x54, 0x21, - 0xba, 0x32, 0x0b, 0xfd, 0xe9, 0x35, 0x81, 0x67, 0xd5, 0xe1, 0xb2, 0xd0, - 0x6e, 0x58, 0x3a, 0xd3, 0x64, 0x4b, 0x15, 0x1f, 0x5f, 0xe7, 0x64, 0xa6, - 0x3c, 0xb7, 0xa8, 0x46, 0xce, 0xff, 0xed, 0x3c, 0xad, 0x84, 0xc5, 0xe8, - 0x32, 0x77, 0xac, 0x3e, 0x16, 0x92, 0xf1, 0xe8, 0x41, 0x13, 0x9d, 0xeb, - 0x86, 0xd9, 0x6e, 0x06, 0xc1, 0x95, 0x46, 0x56, 0xcb, 0x17, 0x4c, 0xba, - 0xb3, 0x22, 0x80, 0xea, 0xd7, 0x84, 0x48, 0xde, 0xbd, 0x63, 0x57, 0x66, - 0x70, 0xe9, 0xef, 0xdf, 0x84, 0xbc, 0x7f, 0xbb, 0xf2, 0x15, 0xeb, 0xf9, - 0x13, 0x71, 0x81, 0x84, 0x97, 0x31, 0xe6, 0x88, 0xf0, 0x17, 0xc2, 0xd6, - 0x1e, 0xff, 0x7a, 0xca, 0xed, 0x42, 0x43, 0xbd, 0x11, 0x5b, 0x10, 0xd9, - 0x15, 0xf5, 0x83, 0x05, 0x4a, 0x21, 0x25, 0xea, 0xb0, 0x97, 0x1b, 0x5e, - 0x6f, 0xb6, 0x44, 0x8c, 0xf8, 0x15, 0xe8, 0xae, 0xcb, 0x53, 0x8e, 0xc0, - 0xaa, 0x04, 0x95, 0xc4, 0x60, 0xad, 0xde, 0xa2, 0xed, 0x39, 0x93, 0x31, - 0x2b, 0xa1, 0xb0, 0x7b, 0x1f, 0x0a, 0xf0, 0x5a, 0xf3, 0xcb, 0xeb, 0x8a, - 0x38, 0x15, 0x2c, 0xc3, 0x09, 0xe2, 0x50, 0x45, 0x21, 0x3c, 0x27, 0xbd, - 0xf8, 0x2f, 0x3d, 0x36, 0x67, 0x33, 0x29, 0x4e, 0x2b, 0x40, 0xd1, 0x67, - 0x5b, 0x0d, 0x46, 0x5a, 0x28, 0xf6, 0xad, 0xbd, 0xd6, 0xf0, 0x90, 0x35, - 0x72, 0x64, 0xc4, 0x6b, 0xc0, 0x27, 0x88, 0x57, 0x7a, 0x77, 0xc7, 0x6f, - 0x4e, 0x04, 0x72, 0x8f, 0x6f, 0xb4, 0x83, 0x05, 0xcc, 0xba, 0x26, 0x58, - 0x4e, 0x64, 0xba, 0xf4, 0x63, 0x00, 0x03, 0x19, 0xf5, 0x90, 0xaf, 0x0b, - 0xaa, 0x7e, 0xe2, 0x60, 0xa1, 0xd8, 0xb7, 0x39, 0x0f, 0x12, 0x35, 0x23, - 0x91, 0xe0, 0x42, 0xca, 0xe9, 0x53, 0xaa, 0xb2, 0xd1, 0x4a, 0xe5, 0x1d, - 0xdd, 0x09, 0x14, 0xfb, 0xad, 0xcc, 0x92, 0x5b, 0xfe, 0xbb, 0xc5, 0x85, - 0xa5, 0xb8, 0xb0, 0x26, 0xb9, 0x0f, 0x72, 0x06, 0xbb, 0x97, 0xf4, 0xc7, - 0x03, 0xc7, 0x2b, 0x42, 0xc7, 0x31, 0xa4, 0x19, 0xff, 0x34, 0xf6, 0x0c, - 0xd4, 0x32, 0xc0, 0xeb, 0x69, 0xc5, 0x90, 0xbc, 0xba, 0x74, 0x92, 0x9e, - 0xb1, 0xb3, 0x74, 0x11, 0x4a, 0xc5, 0x13, 0xed, 0x7d, 0x3d, 0x5c, 0x26, - 0x48, 0x4e, 0x63, 0x1d, 0x0c, 0x71, 0x3a, 0xcb, 0x30, 0xbb, 0x28, 0xf4, - 0x96, 0xcd, 0x25, 0xa1, 0x79, 0x0d, 0xcf, 0xfe, 0x80, 0xf9, 0x5c, 0x8a, - 0xa3, 0xa4, 0x3f, 0xdf, 0x7b, 0x31, 0x59, 0x42, 0x45, 0x27, 0x1a, 0xd9, - 0xff, 0x6d, 0x27, 0xd6, 0x93, 0x67, 0x14, 0xf2, 0x69, 0x0d, 0x33, 0x04, - 0x78, 0x74, 0x05, 0xc3, 0xa7, 0x2b, 0x3d, 0x1e, 0xc0, 0x9f, 0x9e, 0xf9, - 0x4e, 0x38, 0xab, 0x54, 0x10, 0xe6, 0xf1, 0xf8, 0xee, 0x7e, 0xcd, 0x5b, - 0x0e, 0xa5, 0x40, 0xf2, 0xdb, 0xd7, 0xeb, 0xc8, 0xad, 0xde, 0xa6, 0x8e, - 0x22, 0x15, 0x70, 0xb8, 0x1b, 0x96, 0x6a, 0x64, 0xe1, 0x72, 0x86, 0x26, - 0x3d, 0x22, 0x39, 0xd0, 0xeb, 0xf0, 0x6b, 0x87, 0xb3, 0xfb, 0x70, 0x70, - 0x81, 0x12, 0x54, 0xd3, 0x4f, 0x79, 0x62, 0x50, 0xb9, 0x18, 0x5f, 0x7e, - 0x39, 0x58, 0x9b, 0xf8, 0xd6, 0xcc, 0xa5, 0x55, 0xb0, 0x62, 0xd2, 0xb2, - 0x34, 0x58, 0x89, 0x28, 0xb4, 0x0d, 0x95, 0x93, 0x4c, 0xc3, 0x89, 0x5d, - 0xca, 0xe1, 0x07, 0x98, 0x47, 0xb6, 0x3f, 0x08, 0xf2, 0xe2, 0x31, 0x56, - 0xc3, 0xc9, 0x72, 0x99, 0xd5, 0x16, 0xe0, 0x4c, 0x60, 0xe8, 0x98, 0xd6, - 0x06, 0x22, 0xd3, 0x1a, 0x92, 0xdd, 0x70, 0x2e, 0xb0, 0x38, 0xc9, 0xc2, - 0x2e, 0x08, 0x3e, 0x0d, 0xd0, 0x3e, 0xc2, 0x88, 0x8a, 0x51, 0x8d, 0xff, - 0xa7, 0x03, 0x07, 0xce, 0x12, 0x98, 0x69, 0xb7, 0x40, 0x7c, 0x1a, 0x22, - 0x09, 0x5b, 0x77, 0x19, 0x92, 0x3b, 0xc8, 0x4e, 0x32, 0x27, 0xfc, 0x46, - 0xd6, 0x6e, 0x53, 0x44, 0x6e, 0xbc, 0x6d, 0x37, 0x32, 0x6a, 0xf9, 0x61, - 0x7b, 0x85, 0xed, 0x55, 0x33, 0x61, 0x7a, 0xd5, 0x3c, 0x26, 0x2a, 0x92, - 0xf5, 0xd6, 0x4f, 0xd3, 0xca, 0xd3, 0xc5, 0xdf, 0x8c, 0xa1, 0x53, 0x43, - 0x50, 0x49, 0x03, 0x81, 0xdd, 0xd5, 0x1a, 0x7f, 0x37, 0x64, 0xf3, 0x3b, - 0x54, 0xe7, 0x2d, 0xfe, 0x39, 0x44, 0x2d, 0x3f, 0x33, 0x80, 0xe9, 0xcd, - 0x76, 0x48, 0x39, 0xdb, 0xfa, 0x4b, 0x63, 0x58, 0xbe, 0xf2, 0x71, 0x75, - 0x38, 0xf6, 0x98, 0x69, 0x05, 0x2b, 0x26, 0xef, 0x2d, 0x55, 0x37, 0x34, - 0x77, 0xc7, 0xdf, 0x32, 0xd5, 0xa6, 0x8c, 0x7e, 0x34, 0x7c, 0x4f, 0xfd, - 0x0a, 0xe7, 0xce, 0x89, 0x04, 0x36, 0xd2, 0xef, 0xb0, 0xfa, 0xe7, 0x01, - 0xd0, 0x67, 0xd8, 0x9a, 0x90, 0xcf, 0x29, 0x48, 0x40, 0xe5, 0x54, 0x09, - 0x75, 0x0b, 0xa4, 0x63, 0x4a, 0xa3, 0xac, 0x7c, 0x19, 0x20, 0x1c, 0xae, - 0x8a, 0x68, 0x74, 0x41, 0x32, 0x9d, 0x9c, 0x28, 0x33, 0x08, 0x71, 0x7c, - 0x87, 0x1d, 0x77, 0xf5, 0x38, 0xe6, 0xe2, 0x36, 0x91, 0xe9, 0x8e, 0x40, - 0x1d, 0x9f, 0x8c, 0xc2, 0xa2, 0x36, 0xe2, 0xfc, 0x4c, 0xc2, 0xd0, 0x7e, - 0x23, 0x0d, 0x21, 0x4a, 0x9e, 0x2d, 0x05, 0x3a, 0x54, 0xbb, 0x9d, 0x6f, - 0x7a, 0x86, 0xb9, 0x68, 0xb3, 0x45, 0xde, 0x70, 0x01, 0xf9, 0xb5, 0x58, - 0x5c, 0x26, 0xb0, 0x2e, 0xad, 0x79, 0x22, 0x1a, 0x31, 0xcc, 0x07, 0x45, - 0xe9, 0x5a, 0x10, 0xbb, 0x15, 0xed, 0xe8, 0x18, 0xb8, 0xff, 0xd4, 0x98, - 0x52, 0xcf, 0xe1, 0x18, 0x1c, 0xe6, 0xc7, 0x4e, 0xe8, 0xb6, 0x61, 0x5a, - 0xa8, 0x0d, 0x8c, 0xca, 0x2d, 0x73, 0xb3, 0x74, 0x1e, 0x3c, 0x02, 0xa8, - 0xc7, 0xef, 0x6d, 0x7c, 0xb2, 0x5b, 0x95, 0x78, 0x1c, 0xcd, 0x4f, 0xc5, - 0x46, 0xd3, 0x40, 0xf9, 0x85, 0xaf, 0x0f, 0x14, 0x2c, 0x47, 0xc0, 0xf5, - 0x27, 0xc1, 0xaa, 0xe1, 0x31, 0x02, 0x74, 0x15, 0xb4, 0x78, 0xf8, 0xf6, - 0x31, 0xfd, 0x7f, 0x53, 0x10, 0x4f, 0x9b, 0x3c, 0x93, 0x57, 0x12, 0x99, - 0xf4, 0x90, 0xbd, 0x75, 0xae, 0xef, 0xd2, 0xc0, 0x34, 0x6b, 0x43, 0x9e, - 0x1f, 0x9e, 0xd6, 0xfd, 0xfc, 0x29, 0x21, 0xf4, 0x79, 0xa0, 0x1f, 0x08, - 0xb1, 0x7d, 0x7d, 0x13, 0xd6, 0x27, 0x0e, 0x65, 0xdf, 0x73, 0x2f, 0x59, - 0x2f, 0xf9, 0x26, 0x5c, 0x88, 0xa3, 0x82, 0x96, 0x43, 0x98, 0xda, 0x0f, - 0xa6, 0x91, 0x14, 0x2b, 0xeb, 0x1e, 0x25, 0x5a, 0x30, 0x5e, 0x4d, 0x24, - 0xa6, 0x89, 0x93, 0x5b, 0xe4, 0xbd, 0x30, 0x50, 0x12, 0x4e, 0x62, 0xec, - 0xd1, 0x6b, 0xd0, 0x62, 0xed, 0x8c, 0xd6, 0xb4, 0x9d, 0xf9, 0x0e, 0x6e, - 0x7f, 0x4b, 0xd0, 0x4b, 0xd9, 0x4c, 0xd4, 0x23, 0xab, 0x07, 0x4c, 0x01, - 0xf3, 0x24, 0xec, 0x3c, 0x1d, 0xde, 0x5d, 0x5b, 0x47, 0x32, 0x0b, 0xd4, - 0x18, 0x05, 0xf7, 0xbd, 0xad, 0x11, 0xb6, 0x8b, 0xcc, 0xdf, 0xe9, 0x81, - 0x46, 0x73, 0xe6, 0x3e, 0x14, 0x1e, 0x31, 0x13, 0xe7, 0x2f, 0xc1, 0xe2, - 0x6a, 0x52, 0x75, 0x0f, 0x34, 0x68, 0x37, 0x60, 0xca, 0xe5, 0xf8, 0xbe, - 0xa2, 0x4b, 0x24, 0xe9, 0x63, 0x05, 0x5c, 0xd5, 0x03, 0xe3, 0x07, 0xa8, - 0x0b, 0x8f, 0xc1, 0x9b, 0x64, 0x7f, 0x67, 0x74, 0x83, 0xce, 0x19, 0x82, - 0x35, 0x97, 0x82, 0xdc, 0xb3, 0xc0, 0x2b, 0x84, 0xa9, 0x15, 0x47, 0xde, - 0x43, 0x0d, 0x69, 0xb4, 0x80, 0x0c, 0x98, 0x6d, 0x64, 0x90, 0x9b, 0x22, - 0xd7, 0x19, 0xe7, 0xd2, 0xbc, 0x6e, 0x93, 0xf1, 0x10, 0x6a, 0x25, 0xef, - 0xc6, 0xa6, 0xfc, 0xa9, 0x1c, 0xd4, 0xe5, 0x89, 0x5c, 0x66, 0x39, 0x5d, - 0xb5, 0xf8, 0x35, 0x8d, 0x89, 0xe1, 0x1f, 0x90, 0x00, 0xf9, 0x17, 0x3e, - 0x9a, 0x86, 0x98, 0xe4, 0x62, 0xa8, 0x03, 0x37, 0x09, 0xda, 0x53, 0xde, - 0xb9, 0xd8, 0x3d, 0x4e, 0x71, 0x96, 0x93, 0x77, 0xe6, 0x69, 0x9c, 0xbf, - 0xd9, 0xb2, 0x5c, 0x3e, 0xb1, 0x53, 0xc9, 0x95, 0x84, 0x17, 0xd0, 0xdd, - 0x02, 0xbd, 0x14, 0x36, 0x97, 0xdd, 0x2d, 0xf6, 0x88, 0x5d, 0xd5, 0xb2, - 0xd1, 0x66, 0xf8, 0xac, 0x96, 0x98, 0x91, 0x21, 0xc7, 0xda, 0x79, 0x8a, - 0xa0, 0x72, 0x82, 0xc7, 0x11, 0x65, 0x8c, 0xee, 0x88, 0x8f, 0x02, 0xa7, - 0x13, 0xb8, 0xb1, 0x22, 0x6d, 0x72, 0x2c, 0x30, 0x84, 0x3c, 0x8b, 0xc9, - 0xa8, 0x61, 0x90, 0x1d, 0x84, 0xe9, 0x82, 0xe6, 0x6f, 0xbc, 0xdf, 0xec, - 0xc6, 0x07, 0xc1, 0x7b, 0x18, 0x46, 0x45, 0x4f, 0x6b, 0xf1, 0x58, 0xe5, - 0xbd, 0x7c, 0x54, 0xb5, 0x0f, 0x4f, 0xa9, 0x1a, 0x0b, 0x41, 0xd9, 0x67, - 0x46, 0x9a, 0x4d, 0x23, 0x8b, 0x48, 0x58, 0x6a, 0xcc, 0x81, 0x6d, 0xca, - 0xa5, 0xe3, 0x65, 0x23, 0x4e, 0x0b, 0x51, 0x2f, 0xc5, 0x14, 0x84, 0x9a, - 0x21, 0x17, 0xf5, 0x77, 0xbb, 0x7e, 0x7e, 0xe1, 0xb5, 0x86, 0x37, 0xed, - 0x37, 0x9d, 0x8a, 0x59, 0x60, 0xa0, 0x24, 0x87, 0x47, 0x56, 0x62, 0xdd, - 0x7f, 0xcc, 0x29, 0xa2, 0xb0, 0x43, 0x87, 0x53, 0x13, 0x62, 0x3a, 0x59, - 0xd4, 0xd1, 0x6f, 0x20, 0xe7, 0xb2, 0x3e, 0x78, 0xf5, 0xba, 0xe5, 0xc0, - 0x32, 0xdf, 0x50, 0x7b, 0xe5, 0x2d, 0x82, 0x0e, 0x2b, 0x33, 0x66, 0x36, - 0x77, 0x51, 0x86, 0xc0, 0x4a, 0x24, 0xc3, 0x7a, 0x87, 0xff, 0x75, 0x3f, - 0x2b, 0x1c, 0x18, 0xf3, 0x9c, 0xc4, 0x59, 0x8b, 0xdd, 0xb9, 0x09, 0xf2, - 0x6c, 0xb9, 0x39, 0x70, 0x55, 0x3e, 0x96, 0x96, 0x08, 0x96, 0xef, 0x44, - 0x87, 0xaf, 0x5a, 0x02, 0x3f, 0x21, 0x1f, 0x27, 0xd4, 0x90, 0x84, 0xed, - 0xa2, 0xca, 0x67, 0x09, 0x2c, 0xe0, 0x92, 0xbe, 0x4b, 0xf9, 0x14, 0x60, - 0x36, 0x32, 0x75, 0x8d, 0xaa, 0x50, 0xc3, 0xf3, 0xc5, 0x28, 0xc5, 0x4f, - 0xdd, 0x7e, 0xe4, 0xb2, 0x55, 0x3a, 0x39, 0x4e, 0x0a, 0xe2, 0x2e, 0x8b, - 0x71, 0xa5, 0xbb, 0xe2, 0x72, 0xe0, 0xdf, 0xae, 0x74, 0x5c, 0xb7, 0x34, - 0x6d, 0x54, 0xee, 0x03, 0xa4, 0x02, 0x8a, 0x6d, 0x84, 0x1b, 0xbc, 0xc8, - 0xbc, 0x1a, 0x8f, 0x46, 0x2b, 0xe7, 0x99, 0xfc, 0xbc, 0x95, 0xea, 0x76, - 0x1e, 0x4f, 0x82, 0x22, 0x26, 0xec, 0xd8, 0x48, 0x48, 0xda, 0x9a, 0x47, - 0xff, 0xc6, 0x78, 0x44, 0x65, 0x7a, 0xf6, 0xad, 0x80, 0x38, 0x67, 0x9d, - 0xe4, 0xe7, 0x0f, 0xd9, 0x7f, 0xfe, 0x86, 0xa8, 0x8a, 0x44, 0x26, 0x7c, - 0x3c, 0x58, 0x0d, 0xea, 0x8d, 0x62, 0x0e, 0x52, 0x1c, 0x7c, 0x18, 0x57, - 0x47, 0x94, 0x47, 0x59, 0x78, 0xb1, 0x7c, 0x81, 0xc5, 0xb1, 0x3b, 0xd3, - 0x44, 0x57, 0x44, 0x23, 0xa7, 0x8a, 0xfc, 0x64, 0xd9, 0xb4, 0x7b, 0x98, - 0x83, 0x4f, 0xcf, 0x96, 0xbb, 0x89, 0x23, 0x81, 0x0b, 0x8e, 0x51, 0x4a, - 0xcc, 0x97, 0x73, 0x5c, 0x76, 0x5f, 0x7c, 0x21, 0x5e, 0xef, 0xb9, 0x6e, - 0xbd, 0xfd, 0x53, 0x69, 0xe4, 0x7d, 0x72, 0x67, 0x72, 0xe8, 0x54, 0xe9, - 0xb6, 0x97, 0xad, 0xa5, 0x8c, 0x2f, 0x1b, 0xaf, 0x74, 0x39, 0xb8, 0xbc, - 0xb3, 0x43, 0x05, 0xc1, 0xeb, 0x20, 0x93, 0xa9, 0x8a, 0x32, 0xd0, 0xbd, - 0x80, 0x8f, 0xeb, 0x44, 0x97, 0x78, 0x4a, 0x0a, 0xe5, 0x97, 0xd9, 0x6a, - 0xaa, 0x61, 0x03, 0x7b, 0x1a, 0x01, 0x4c, 0xe3, 0x20, 0x85, 0xef, 0x01, - 0xe4, 0x5a, 0x91, 0x33, 0x60, 0xf4, 0x94, 0xc7, 0x47, 0x81, 0x1a, 0x28, - 0x67, 0x55, 0xb3, 0x7a, 0x5d, 0xb3, 0x5c, 0x15, 0xe5, 0x30, 0x84, 0xbc, - 0x48, 0x5c, 0x89, 0x4e, 0x4b, 0x63, 0x77, 0x7b, 0x16, 0xf9, 0xd3, 0xbc, - 0x2d, 0x09, 0xea, 0x19, 0x7c, 0xff, 0x20, 0xd0, 0x52, 0xa8, 0x4b, 0xc5, - 0x9b, 0x12, 0xe6, 0x49, 0xa5, 0x9a, 0xbe, 0x97, 0x57, 0x0d, 0xb1, 0xf2, - 0x84, 0xb0, 0xfe, 0xd4, 0xd0, 0x8d, 0xfe, 0x34, 0x91, 0xe0, 0x67, 0x6a, - 0xb4, 0x8f, 0x24, 0x14, 0x05, 0xb0, 0x69, 0x35, 0x97, 0xe0, 0x30, 0x1a, - 0xb5, 0xcd, 0x5a, 0x64, 0xd9, 0x7d, 0xd9, 0xc8, 0x01, 0xe9, 0x3b, 0xf1, - 0x34, 0xb2, 0x98, 0xce, 0x10, 0x25, 0x00, 0xb4, 0xfb, 0xe9, 0x3c, 0x31, - 0xa3, 0x91, 0xe6, 0x02, 0x5a, 0x71, 0x52, 0x69, 0x22, 0x78, 0xbc, 0x9d, - 0x93, 0xed, 0xe8, 0x6a, 0xec, 0x57, 0x63, 0x72, 0xc2, 0x79, 0xba, 0x94, - 0x83, 0x7a, 0xff, 0xd6, 0x9e, 0x6f, 0xe3, 0xb3, 0x83, 0x77, 0x99, 0x4f, - 0x2a, 0x84, 0x7d, 0x20, 0xc1, 0xbe, 0x48, 0xb7, 0x97, 0xd9, 0xe4, 0xe0, - 0x5a, 0xad, 0x56, 0x16, 0x31, 0x42, 0xe2, 0xe0, 0xdd, 0x8f, 0x1d, 0x5e, - 0x1f, 0xb4, 0x78, 0x6f, 0x3e, 0x8d, 0x40, 0x5c, 0x49, 0xd0, 0x78, 0x0c, - 0x3d, 0x91, 0x57, 0xe0, 0xcd, 0x49, 0xd3, 0x9f, 0xd5, 0x9c, 0xbe, 0xc6, - 0x71, 0x50, 0x6a, 0x51, 0xda, 0xe0, 0xd4, 0x66, 0x70, 0xfd, 0x3e, 0x78, - 0xea, 0xdf, 0xf1, 0x75, 0xcd, 0xb7, 0x48, 0x1d, 0x64, 0xb2, 0x14, 0x81, - 0x28, 0x0e, 0x5f, 0x54, 0x80, 0x0d, 0x7d, 0x09, 0x2c, 0x41, 0x7d, 0xe5, - 0xed, 0x6f, 0x43, 0x38, 0x2d, 0x13, 0x80, 0x2e, 0x8e, 0x5d, 0xac, 0xc7, - 0xe4, 0x60, 0x93, 0x63, 0x37, 0x0a, 0x60, 0x6b, 0x08, 0x3e, 0xa3, 0x79, - 0xb6, 0x5a, 0x60, 0x1a, 0xbf, 0x20, 0xbb, 0xbd, 0x7a, 0x30, 0xde, 0x14, - 0x9a, 0xd2, 0x65, 0xc1, 0x1f, 0x47, 0xd0, 0xc7, 0xd5, 0x27, 0x92, 0x63, - 0xa9, 0xa1, 0x63, 0x0b, 0xad, 0x8f, 0x30, 0x31, 0xc0, 0x9d, 0x25, 0x75, - 0x18, 0xe6, 0xf5, 0x82, 0x87, 0x3d, 0xd4, 0x3b, 0x36, 0x2b, 0x9b, 0xfa, - 0xf0, 0x3f, 0x4b, 0x88, 0x49, 0x09, 0x29, 0x44, 0xdc, 0xd1, 0x6f, 0x66, - 0x9d, 0x82, 0x52, 0x68, 0x11, 0xe8, 0x0b, 0x89, 0x14, 0xb6, 0x42, 0xaa, - 0x8a, 0x9a, 0x6c, 0x43, 0x31, 0xc4, 0xa1, 0xdf, 0x5a, 0x41, 0x7f, 0xd0, - 0x1d, 0x0f, 0xa6, 0x82, 0xfc, 0xad, 0xdd, 0xfa, 0xb4, 0x6d, 0x54, 0x77, - 0xbd, 0x8f, 0x9c, 0x6a, 0x96, 0xfe, 0xc5, 0x28, 0x0f, 0xc8, 0x3c, 0xf0, - 0xcb, 0x65, 0xf1, 0xc1, 0x8d, 0xc6, 0x0e, 0x30, 0x5d, 0x54, 0x5a, 0x84, - 0x8d, 0xe4, 0xeb, 0x9d, 0xb9, 0x87, 0xd9, 0xdd, 0xc8, 0xc7, 0xb1, 0x6b, - 0x09, 0xa6, 0x6b, 0xa0, 0x78, 0x1c, 0xa3, 0xf1, 0x4f, 0xd5, 0x12, 0xdb, - 0x59, 0x81, 0x34, 0xbf, 0xe0, 0xd3, 0x42, 0x27, 0xb6, 0xa2, 0x12, 0x29, - 0x3f, 0x7c, 0xe1, 0x0a, 0x40, 0x75, 0x96, 0x4a, 0x99, 0x0a, 0xf9, 0xbd, - 0xfe, 0x8c, 0xb2, 0x51, 0xbd, 0x93, 0xd9, 0x71, 0x94, 0x75, 0x30, 0x16, - 0x7a, 0xdd, 0xd1, 0xd5, 0x5c, 0xb5, 0xd0, 0x17, 0x6a, 0x83, 0x5d, 0xe5, - 0xe7, 0xe6, 0x1c, 0x05, 0x38, 0xe6, 0x1b, 0x74, 0x53, 0xa9, 0x13, 0x41, - 0x2d, 0x38, 0x89, 0x20, 0x97, 0x5e, 0xaa, 0xee, 0xbc, 0xf8, 0x74, 0xb4, - 0x16, 0x14, 0x21, 0xf8, 0x5b, 0x9d, 0x64, 0x27, 0xda, 0xcd, 0x84, 0x6e, - 0xa8, 0x00, 0x6a, 0xc5, 0x37, 0x2c, 0x81, 0xb7, 0x37, 0x0c, 0xe4, 0x25, - 0x74, 0x01, 0xf9, 0x8f, 0xcb, 0x6b, 0x6d, 0xa0, 0x0c, 0x65, 0x7b, 0xf9, - 0xf4, 0xb2, 0x95, 0x1b, 0xb6, 0x32, 0x2f, 0x6b, 0xd2, 0x5b, 0x5e, 0x6d, - 0x4e, 0x80, 0x35, 0xfc, 0xac, 0xdc, 0xce, 0x40, 0xf0, 0xe5, 0x4c, 0xe7, - 0x7e, 0x7b, 0x2a, 0x45, 0xa9, 0x56, 0x43, 0xae, 0xd2, 0x82, 0xae, 0x11, - 0x03, 0x68, 0x82, 0xec, 0xd0, 0x4b, 0xdf, 0x10, 0x9d, 0x57, 0x78, 0x1f, - 0x9c, 0x00, 0x60, 0x28, 0x55, 0xd2, 0x3e, 0xa9, 0x41, 0x13, 0x34, 0xc2, - 0x77, 0x0c, 0x79, 0x46, 0x09, 0xf2, 0xbf, 0x33, 0x14, 0xdf, 0x20, 0x3d, - 0xba, 0x90, 0x83, 0xb0, 0xce, 0xd6, 0x01, 0x11, 0xeb, 0x6d, 0xd8, 0x46, - 0x4c, 0x56, 0x3b, 0x45, 0x22, 0x97, 0x26, 0xb4, 0x5e, 0xbc, 0x81, 0x77, - 0x32, 0xeb, 0xa0, 0xd5, 0x8b, 0xc8, 0xd4, 0x0b, 0x18, 0xcf, 0x33, 0x7b, - 0x05, 0x81, 0x1e, 0xbb, 0x89, 0x43, 0xd1, 0xde, 0x22, 0x8b, 0x89, 0xcd, - 0x07, 0xb7, 0xef, 0xb5, 0x51, 0xcb, 0x08, 0x14, 0x2c, 0xee, 0x17, 0x6c, - 0x6c, 0xf3, 0xdb, 0x5c, 0x4d, 0x11, 0xb6, 0x20, 0xd6, 0xc1, 0xbe, 0x5d, - 0x78, 0x72, 0x44, 0x65, 0x1e, 0x63, 0xc5, 0x6d, 0xc6, 0x16, 0xa1, 0xf7, - 0xcf, 0x0e, 0x8f, 0x0f, 0xb9, 0x6d, 0xa4, 0x26, 0xbb, 0x3c, 0xa8, 0x64, - 0xf2, 0xe9, 0xb9, 0xda, 0x59, 0xae, 0x26, 0x54, 0x5a, 0xe6, 0xcb, 0x73, - 0x21, 0x92, 0xb6, 0x05, 0x25, 0xdc, 0xa3, 0xa0, 0xa2, 0xdc, 0x21, 0x8d, - 0x1f, 0x67, 0x5f, 0x0b, 0x08, 0x9e, 0x79, 0xc0, 0xa9, 0xba, 0xdb, 0xfe, - 0xa1, 0xf2, 0x03, 0xe7, 0xf7, 0x5f, 0x24, 0x66, 0x5a, 0xec, 0x7b, 0x14, - 0xb0, 0x26, 0xe0, 0x5f, 0xe2, 0xb3, 0x57, 0xc6, 0x14, 0xe7, 0x9a, 0xc7, - 0x32, 0x25, 0x86, 0x50, 0x39, 0xd4, 0x12, 0xf6, 0x76, 0xf3, 0x41, 0xc2, - 0x5c, 0xcc, 0x59, 0xc7, 0x01, 0x95, 0xf5, 0x32, 0xfa, 0x3a, 0x9d, 0x03, - 0x82, 0x83, 0x88, 0x09, 0x0c, 0xed, 0x90, 0x2b, 0x17, 0xad, 0x9c, 0x80, - 0xf3, 0xac, 0x4c, 0x5b, 0xc4, 0xd7, 0x91, 0x83, 0x9e, 0xd1, 0xcf, 0x9d, - 0x8e, 0x16, 0xd5, 0x0a, 0x31, 0x57, 0x44, 0xf5, 0x41, 0xa3, 0xe4, 0xd5, - 0x1e, 0xe7, 0xc4, 0x00, 0x7b, 0xe1, 0x02, 0x5c, 0xcf, 0xe7, 0xf3, 0xce, - 0x70, 0xb1, 0x33, 0xf5, 0xee, 0x55, 0x60, 0x31, 0xe0, 0x90, 0x49, 0x1c, - 0x32, 0xc7, 0xa0, 0xf3, 0xd1, 0xc4, 0xbd, 0xbb, 0xfe, 0xb5, 0xa4, 0x3e, - 0x92, 0x5d, 0x23, 0xaa, 0x03, 0x75, 0x15, 0x22, 0xdf, 0x09, 0xc6, 0xfe, - 0xb6, 0x1e, 0x94, 0x2f, 0x5c, 0xad, 0x3a, 0x2c, 0xd9, 0x98, 0x3e, 0xcc, - 0x83, 0x6c, 0xd5, 0x9f, 0x3e, 0x87, 0x5a, 0x1b, 0xad, 0xf5, 0xfd, 0xfb, - 0xef, 0xbe, 0x9a, 0x92, 0x79, 0x9e, 0xad, 0xe2, 0x04, 0xb9, 0xfc, 0x39, - 0x43, 0x21, 0x46, 0x48, 0x4f, 0xc5, 0xe4, 0xfa, 0xb5, 0x9b, 0xc7, 0xf7, - 0x0b, 0x9b, 0xf2, 0x80, 0x9c, 0x2a, 0x5f, 0x10, 0x40, 0x13, 0xa4, 0x3c, - 0x3f, 0x84, 0x51, 0x78, 0x95, 0x17, 0xf9, 0xba, 0xd2, 0x99, 0xbd, 0x5b, - 0x8f, 0x77, 0x07, 0x4b, 0x7f, 0x5f, 0x96, 0xd9, 0x4b, 0xff, 0xa7, 0xa4, - 0xd7, 0x59, 0xdb, 0x5f, 0x98, 0x97, 0x42, 0xda, 0x3a, 0x7f, 0x9d, 0xae, - 0x39, 0x70, 0x94, 0xd1, 0x18, 0xec, 0xda, 0x7b, 0xa7, 0x25, 0x73, 0xfe, - 0xfb, 0x01, 0x2f, 0xd3, 0xcd, 0xc1, 0x99, 0x7e, 0xac, 0xf5, 0x4d, 0x27, - 0x2a, 0xb9, 0x58, 0xe3, 0x9f, 0x21, 0xdc, 0x54, 0xb8, 0x06, 0xb2, 0x36, - 0xc7, 0x3e, 0x0a, 0x56, 0x0f, 0x1a, 0xb7, 0x89, 0xed, 0x40, 0xe3, 0x9e, - 0xaa, 0x57, 0x4e, 0x4f, 0x44, 0x29, 0x6c, 0x4f, 0x81, 0x38, 0x48, 0xa0, - 0xb2, 0x05, 0xd2, 0x4a, 0x3c, 0xdd, 0x51, 0x08, 0x06, 0x04, 0xe1, 0xe3, - 0x7b, 0x90, 0x41, 0x11, 0xf5, 0x4b, 0x0c, 0xdd, 0x91, 0xf9, 0x7f, 0x94, - 0x78, 0x92, 0xcf, 0xc4, 0xab, 0x47, 0x5c, 0x89, 0x86, 0xe7, 0x8c, 0x8c, - 0x5a, 0x30, 0x46, 0x45, 0xf7, 0xf6, 0xc4, 0x09, 0x40, 0x46, 0xab, 0x26, - 0x4c, 0x90, 0x84, 0xee, 0x9e, 0x89, 0x7b, 0xdc, 0xc5, 0x4e, 0x5b, 0xdb, - 0xc1, 0xa4, 0x8d, 0xd9, 0x79, 0xee, 0x69, 0xd1, 0x29, 0x5c, 0xa9, 0xdd, - 0x66, 0x4c, 0x02, 0x13, 0x85, 0x36, 0xf7, 0x66, 0xbc, 0x4a, 0x7f, 0x95, - 0x6c, 0xbb, 0x33, 0x89, 0x10, 0xd8, 0x5b, 0xdb, 0xc1, 0xa4, 0x8d, 0xd9, - 0x79, 0xee, 0x69, 0xd1, 0xc4, 0x81, 0xb7, 0x4a, 0xae, 0x48, 0xab, 0xe0, - 0x6a, 0x6f, 0xca, 0x92, 0xad, 0xc8, 0xc2, 0xbf, 0x0e, 0x85, 0x0e, 0x90, - 0x8c, 0xa4, 0x46, 0x86, 0x2e, 0x05, 0xab, 0x7d, 0xda, 0xde, 0x0b, 0x28, - 0x4c, 0x78, 0x16, 0xde, 0x3b, 0x74, 0x36, 0x6f, 0xc5, 0x70, 0x52, 0x38, - 0x9c, 0xba, 0xc0, 0x8a, 0xf7, 0xd2, 0x9d, 0x57, 0x1d, 0x8a, 0x9d, 0x36, - 0xfc, 0x94, 0xa0, 0xd7, 0x39, 0x52, 0x2f, 0x2c, 0xbe, 0x95, 0x1e, 0x4f, - 0xca, 0xe2, 0x10, 0x2b, 0x25, 0xe1, 0xa3, 0xbd, 0x2a, 0x90, 0xec, 0x0e, - 0x82, 0x4d, 0x33, 0x52, 0x43, 0xa4, 0xb2, 0xae, 0xbd, 0x2a, 0x3f, 0xa6, - 0xa8, 0xb5, 0x01, 0x1c, 0x83, 0x04, 0xfc, 0xbf, 0x99, 0xc3, 0xb5, 0xc6, - 0x4f, 0xbf, 0xd8, 0x3d, 0x51, 0x11, 0x03, 0x67, 0x84, 0xa0, 0xba, 0xac, - 0xec, 0x20, 0x83, 0x9b, 0xef, 0x2c, 0xd0, 0xb9, 0xbe, 0xaa, 0x53, 0xbd, - 0xee, 0x32, 0x5b, 0x36, 0xb6, 0xd4, 0x2f, 0xa7, 0x4e, 0x33, 0x50, 0x2d, - 0x41, 0x35, 0x9f, 0x00, 0x4e, 0xa9, 0x18, 0x47, 0x19, 0x35, 0x37, 0x90, - 0x4b, 0xba, 0xc5, 0x7d, 0x07, 0x6a, 0x25, 0x96, 0x73, 0x84, 0x30, 0xcc, - 0x18, 0x33, 0x19, 0xb4, 0x2a, 0xb2, 0x24, 0xa0, 0x91, 0xf3, 0xbc, 0x41, - 0xba, 0xf8, 0xec, 0xc6, 0x8d, 0xc3, 0x10, 0xf5, 0x4d, 0xcd, 0xe6, 0xa3, - 0x2f, 0xc4, 0x33, 0x29, 0xa4, 0x19, 0x77, 0xc5, 0x3b, 0x01, 0x02, 0x9b, - 0x83, 0x93, 0xbf, 0xa8, 0xc0, 0x2a, 0xbd, 0xd6, 0x73, 0x8d, 0xed, 0x43, - 0xba, 0xcd, 0xa4, 0xc7, 0x76, 0x82, 0x9e, 0xf7, 0xba, 0x6a, 0xca, 0x87, - 0x5c, 0x7a, 0x29, 0x72, 0xe4, 0xce, 0x94, 0x46, 0x3e, 0x69, 0x13, 0xf0, - 0x0d, 0x75, 0x5f, 0x77, 0x6b, 0x06, 0x3c, 0xaa, 0xdd, 0x50, 0xdb, 0x7b, - 0x18, 0x7a, 0xcc, 0xb8, 0x5d, 0x6a, 0x5a, 0xb9, 0x58, 0x62, 0xcc, 0x9a, - 0x87, 0x4b, 0x4a, 0x51, 0x66, 0xc5, 0xdd, 0xd6, 0xf7, 0x7b, 0x57, 0x50, - 0x12, 0xf6, 0x44, 0x2d, 0xa5, 0x61, 0x24, 0xea, 0xc8, 0x87, 0xe4, 0x5c, - 0x86, 0x0f, 0x82, 0xa7, 0xfc, 0x1e, 0x5d, 0xc5, 0x04, 0x5f, 0x2b, 0xab, - 0x24, 0x1f, 0xfe, 0x94, 0x79, 0x75, 0xa5, 0xed, 0x5a, 0xd9, 0xa9, 0xd2, - 0x84, 0xef, 0x75, 0x06, 0x7f, 0x7b, 0xcc, 0x4e, 0xf0, 0xf1, 0x50, 0x03, - 0x00, 0xf2, 0xbc, 0xe0, 0xc7, 0x30, 0x2d, 0x63, 0x8a, 0x28, 0xce, 0x76, - 0x4f, 0x09, 0x58, 0xf9, 0x25, 0x64, 0xfe, 0x72, 0x51, 0x19, 0xd1, 0x2f, - 0xa2, 0xe1, 0x99, 0xd8, 0x46, 0xc3, 0x4b, 0x89, 0xfc, 0x42, 0x6e, 0x37, - 0x16, 0x94, 0x10, 0xd1, 0xd2, 0x66, 0x5c, 0x83, 0x33, 0xf7, 0x73, 0x07, - 0x62, 0xd6, 0x31, 0xbd, 0xa6, 0x19, 0x1b, 0x1c, 0xcb, 0x84, 0xc6, 0xc2, - 0xb1, 0xd0, 0xb4, 0xa7, 0xdf, 0x84, 0xb5, 0xb2, 0xf4, 0xf2, 0xa0, 0x0c, - 0x9b, 0x6a, 0xed, 0xb4, 0xb7, 0x2c, 0x2e, 0xa5, 0x9d, 0x34, 0x6a, 0x00, - 0x16, 0x7f, 0x98, 0xac, 0xad, 0x4b, 0x80, 0xb9, 0x3d, 0x1a, 0x59, 0xdc, - 0x28, 0x86, 0xca, 0xd6, 0xd2, 0x11, 0x0b, 0xf3, 0x21, 0x7e, 0x4b, 0xc0, - 0xc4, 0xde, 0x98, 0x0e, 0x10, 0x53, 0x63, 0x18, 0x8b, 0xf3, 0x9f, 0xac, - 0xd2, 0xd5, 0x6c, 0xc2, 0x45, 0xf1, 0x21, 0x8c, 0x27, 0x0f, 0x42, 0x93, - 0x5e, 0x94, 0x47, 0xde, 0x54, 0x5d, 0x9d, 0x93, 0xff, 0x2d, 0xd0, 0x92, - 0x6e, 0x33, 0x33, 0x45, 0x12, 0x7e, 0x81, 0x3e, 0x4e, 0x89, 0xf4, 0x44, - 0x02, 0xb7, 0x37, 0x6c, 0x95, 0x32, 0x5e, 0x78, 0x91, 0xcd, 0xb6, 0x14, - 0x93, 0x37, 0xba, 0x23, 0x9c, 0x65, 0xce, 0x78, 0xb0, 0x26, 0x86, 0xba, - 0x5c, 0x5f, 0x58, 0x72, 0x6b, 0x96, 0x5a, 0x1c, 0xbf, 0x15, 0xe2, 0xeb, - 0x5d, 0x38, 0x29, 0x49, 0x2d, 0x90, 0x00, 0x4a, 0x3f, 0x28, 0x69, 0x01, - 0xf9, 0x8a, 0x98, 0x3c, 0x21, 0x6d, 0xdb, 0x14, 0x55, 0xd4, 0x6e, 0x31, - 0x3f, 0x08, 0x33, 0x19, 0xb4, 0x02, 0x75, 0x88, 0xd8, 0x53, 0x91, 0x36, - 0x17, 0xab, 0xa9, 0xa9, 0xb1, 0x4b, 0x89, 0x4f, 0xe3, 0xab, 0x5c, 0xe5, - 0xa4, 0xa0, 0x8c, 0xec, 0xf4, 0xed, 0x82, 0xe3, 0xc4, 0xa3, 0xbe, 0x6f, - 0x5e, 0x75, 0x15, 0xb6, 0xb3, 0x02, 0xeb, 0x52, 0x7e, 0x9c, 0xbf, 0x0a, - 0x45, 0xb1, 0x3d, 0x2e, 0x93, 0x4d, 0xa4, 0x61, 0x6f, 0x3b, 0x72, 0xe1, - 0x3d, 0x82, 0x13, 0x44, 0x03, 0x95, 0x19, 0xf9, 0x3c, 0x90, 0x9f, 0xdb, - 0x12, 0xaa, 0x2b, 0xe5, 0x31, 0xbc, 0xe4, 0xf2, 0xb8, 0xc3, 0x68, 0x04, - 0x32, 0x29, 0x09, 0xf6, 0xfc, 0x25, 0xdc, 0x14, 0x01, 0x03, 0x7c, 0x43, - 0x8d, 0x62, 0xd9, 0x8f, 0x63, 0x43, 0x66, 0x9c, 0x2a, 0xaf, 0x13, 0x3e, - 0x17, 0x8d, 0x44, 0x20, 0xbd, 0x89, 0x3b, 0xbc, 0xa2, 0x03, 0x03, 0xe5, - 0xc6, 0xad, 0xa4, 0xe8, 0x11, 0xaf, 0x97, 0x80, 0x8c, 0xc7, 0x24, 0x24, - 0xad, 0x10, 0x28, 0xb5, 0xbf, 0xc3, 0x40, 0x75, 0x66, 0xfc, 0xb2, 0xa8, - 0x6e, 0x73, 0xaf, 0x23, 0x97, 0x70, 0x90, 0x40, 0xcc, 0x56, 0x36, 0x07, - 0x1b, 0xc0, 0xdc, 0x25, 0x4b, 0x4a, 0x30, 0x9b, 0xbd, 0x8c, 0xcd, 0x29, - 0x85, 0xf5, 0x68, 0xc9, 0x5c, 0x96, 0x13, 0xb3, 0xfb, 0xe2, 0xd1, 0x34, - 0x0f, 0x78, 0xd5, 0x36, 0x14, 0xc2, 0x63, 0xdc, 0x5d, 0xd4, 0x12, 0xb1, - 0x89, 0xfb, 0x00, 0x33, 0x1d, 0x8b, 0x02, 0x86, 0x2f, 0x43, 0x24, 0x33, - 0xde, 0x6b, 0xac, 0x70, 0x73, 0xcf, 0x0b, 0xa6, 0xcc, 0xe4, 0x42, 0x16, - 0x51, 0x86, 0xf2, 0xd1, 0xc3, 0x39, 0x20, 0xdb, 0x71, 0x63, 0x59, 0x00, - 0xc9, 0xd5, 0x27, 0x37, 0xc1, 0x08, 0x4a, 0x35, 0x53, 0xbb, 0xb7, 0x2f, - 0x65, 0x5f, 0x8f, 0x7d, 0x38, 0xe9, 0x75, 0xd6, 0x58, 0x41, 0x92, 0xd5, - 0x76, 0x13, 0x80, 0x3b, 0x87, 0xc7, 0x4c, 0xca, 0xea, 0x37, 0x44, 0x85, - 0xb7, 0xd7, 0x7f, 0xbc, 0xc9, 0x86, 0x67, 0xc1, 0x70, 0xfb, 0xfd, 0x3c, - 0x25, 0x35, 0x74, 0x6a, 0x33, 0xfb, 0xae, 0x40, 0x50, 0x80, 0x5f, 0x7a, - 0x37, 0x51, 0x8e, 0x55, 0x24, 0x46, 0xcd, 0xdb, 0x6a, 0x32, 0x1d, 0xc3, - 0x5a, 0xde, 0xf0, 0x77, 0x0d, 0xec, 0x04, 0xea, 0xdf, 0xa8, 0x83, 0x7c, - 0x65, 0x23, 0x7a, 0x09, 0xe7, 0xd5, 0x85, 0x10, 0x71, 0x12, 0x00, 0x1f, - 0x28, 0xd3, 0x93, 0x81, 0x1b, 0x61, 0xbd, 0x2f, 0x54, 0x95, 0x11, 0xdd, - 0xff, 0xf8, 0x85, 0xfa, 0x0f, 0x0a, 0x4d, 0x85, 0x2d, 0x18, 0x57, 0x87, - 0xd9, 0x72, 0x9f, 0xc7, 0xfe, 0x18, 0xd8, 0x38, 0x6c, 0xad, 0x64, 0x83, - 0x78, 0xe2, 0x8c, 0x55, 0x97, 0xa4, 0xe3, 0x36, 0xea, 0xc2, 0x06, 0xcf, - 0xf4, 0x70, 0xf5, 0xb0, 0x9f, 0x3d, 0x3e, 0xd4, 0x19, 0x5d, 0x66, 0x2a, - 0xfe, 0xc8, 0x41, 0x04, 0x8f, 0x5c, 0x25, 0x4f, 0x22, 0x30, 0x8e, 0x0d, - 0xfc, 0x2d, 0x63, 0x52, 0xd7, 0x80, 0xd0, 0x53, 0x20, 0x1f, 0x5b, 0x38, - 0xf7, 0xe9, 0x2d, 0xa4, 0x62, 0xb5, 0x9d, 0x07, 0xd1, 0xf1, 0x6f, 0x02, - 0x56, 0xac, 0xbe, 0x0d, 0x4b, 0x84, 0xfe, 0xa6, 0xf9, 0xe0, 0xdc, 0x50, - 0x13, 0x73, 0x79, 0x92, 0x50, 0x03, 0xc9, 0x50, 0xba, 0x14, 0x56, 0x12, - 0x04, 0x08, 0x54, 0xb4, 0x14, 0x07, 0x91, 0xf6, 0xee, 0x27, 0x9e, 0x74, - 0x95, 0x9d, 0x61, 0x37, 0xb2, 0x06, 0x6b, 0x60, 0xf2, 0x7c, 0x75, 0x9c, - 0x5e, 0xb6, 0x99, 0x6c, 0x09, 0x13, 0x82, 0xfd, 0x0d, 0x67, 0x4a, 0xa2, - 0x27, 0x74, 0x09, 0xf1, 0xe5, 0x5f, 0xeb, 0x5c, 0x6c, 0x06, 0x40, 0x8f, - 0x24, 0x07, 0x16, 0x91, 0x20, 0x2e, 0x24, 0x10, 0xb7, 0xb0, 0x33, 0xe8, - 0x2c, 0x20, 0x3b, 0xb8, 0x4c, 0xc6, 0x41, 0xe6, 0xb0, 0xf8, 0x14, 0x66, - 0x7e, 0x54, 0x02, 0x45, 0x2f, 0xff, 0x53, 0xdf, 0x9f, 0x9e, 0x39, 0xe4, - 0xf8, 0xad, 0x1f, 0x10, 0xb2, 0x5f, 0x6d, 0x41, 0x08, 0xd5, 0xb2, 0xca, - 0xd4, 0x33, 0x0c, 0x05, 0xfb, 0x69, 0x91, 0x63, 0x2a, 0xec, 0xd2, 0xae, - 0x1b, 0x02, 0x2b, 0x8e, 0x5e, 0xaa, 0xab, 0xdc, 0xc2, 0x64, 0xee, 0x59, - 0x6f, 0x33, 0x9d, 0x78, 0xd0, 0x95, 0x30, 0xe5, 0xf1, 0x7c, 0xde, 0xd5, - 0x77, 0xb6, 0x6e, 0x1d, 0xb5, 0x62, 0x83, 0x3f, 0x82, 0xe4, 0xac, 0x82, - 0x0d, 0x50, 0x05, 0x81, 0x47, 0xbc, 0x94, 0xc2, 0xc0, 0xf8, 0xc4, 0x33, - 0x78, 0xcc, 0xe6, 0x57, 0xfd, 0xbf, 0x69, 0x93, 0xfa, 0xfd, 0x9c, 0x00, - 0xf4, 0x20, 0xf5, 0xb4, 0x0e, 0xb6, 0x9f, 0x36, 0x1d, 0xa5, 0xe6, 0x08, - 0x55, 0x3d, 0x28, 0xbd, 0x43, 0x7f, 0x39, 0xff, 0x61, 0xcf, 0xb8, 0x80, - 0x4e, 0x1f, 0x3a, 0x8a, 0x66, 0xde, 0xcc, 0xad, 0x86, 0x35, 0x2d, 0xff, - 0xed, 0x59, 0xce, 0x7f, 0x5c, 0x55, 0x48, 0xc2, 0x3c, 0xd2, 0xfd, 0x27, - 0x46, 0x64, 0x0c, 0xd5, 0xd7, 0xd5, 0x64, 0x37, 0xbc, 0xf2, 0x7c, 0x1b, - 0x6a, 0xba, 0x58, 0x0b, 0x07, 0x15, 0x73, 0x0d, 0xe2, 0x97, 0x24, 0xcc, - 0x09, 0xcf, 0xfc, 0xe9, 0xe1, 0x31, 0xdf, 0x1e, 0x13, 0x4f, 0xb1, 0x3c, - 0x40, 0x95, 0xf3, 0x12, 0x01, 0xe0, 0x07, 0xbc, 0xf6, 0x47, 0xf4, 0x14, - 0x54, 0x13, 0x87, 0x6f, 0x1c, 0xe9, 0x2a, 0xf8, 0x48, 0xab, 0x7a, 0xe8, - 0x84, 0x64, 0x83, 0x44, 0x1e, 0x50, 0x3f, 0x5b, 0x76, 0x02, 0xe6, 0x85, - 0xb1, 0x7e, 0xcc, 0xfd, 0x00, 0xfb, 0xd1, 0xa6, 0x42, 0xd3, 0xf9, 0xb9, - 0x6e, 0x57, 0x52, 0x74, 0x9d, 0x8d, 0x98, 0x66, 0x93, 0xc7, 0x71, 0x27, - 0x04, 0xfb, 0x82, 0x4b, 0x54, 0x8e, 0xbc, 0xc7, 0x27, 0xe3, 0x87, 0x8b, - 0x6b, 0x88, 0xf5, 0x67, 0x62, 0x1c, 0xf9, 0x51, 0x6a, 0x58, 0x6d, 0x26, - 0xd0, 0x56, 0xa5, 0x29, 0x60, 0xe1, 0x9f, 0x58, 0x15, 0x3a, 0xc5, 0xfd, - 0x46, 0x95, 0x6c, 0xed, 0x78, 0x6c, 0xfb, 0x2c, 0xcb, 0x80, 0xc4, 0x65, - 0xd2, 0x5d, 0x73, 0x26, 0x9f, 0x14, 0xd9, 0x42, 0x30, 0xd7, 0x76, 0x98, - 0x26, 0x01, 0x55, 0xe7, 0xc9, 0x23, 0xf2, 0x03, 0xcb, 0xb0, 0x85, 0x86, - 0xb9, 0xfb, 0x5a, 0x15, 0x0e, 0x3d, 0x01, 0x9b, 0xe8, 0xa2, 0x38, 0x1a, - 0x2c, 0x36, 0xc5, 0x7f, 0xc4, 0x97, 0x2a, 0xa2, 0x0e, 0x72, 0x19, 0xba, - 0x83, 0x96, 0xfd, 0xa8, 0x2d, 0x7f, 0x01, 0x55, 0x35, 0xec, 0xe7, 0x1a, - 0xaa, 0x33, 0x2e, 0x83, 0x2d, 0x67, 0xb6, 0x79, 0x6d, 0xe8, 0x86, 0xba, - 0xb8, 0xf8, 0xf4, 0xe1, 0xf9, 0xad, 0xf3, 0x30, 0x8e, 0x35, 0xb3, 0xf4, - 0x55, 0xf0, 0xc0, 0x19, 0x21, 0x22, 0xd0, 0x72, 0xe1, 0xb0, 0xd5, 0x3f, - 0x0f, 0x5c, 0xd8, 0x43, 0x98, 0x09, 0x72, 0x9b, 0x32, 0x0c, 0x3b, 0x13, - 0x65, 0xbb, 0xc4, 0xe3, 0x16, 0x70, 0x7e, 0xc7, 0xd6, 0x49, 0x4d, 0x3e, - 0x80, 0x0a, 0x28, 0xcb, 0x46, 0x11, 0x0c, 0x64, 0x36, 0xd9, 0x55, 0x3b, - 0xca, 0x90, 0x9f, 0xa5, 0x48, 0xae, 0x06, 0x47, 0x78, 0x7e, 0x90, 0x54, - 0x7e, 0x54, 0xe9, 0x93, 0x2c, 0xb2, 0x7c, 0x8e, 0xe7, 0x53, 0xd7, 0x9a, - 0xef, 0x25, 0x99, 0xa4, 0x97, 0xb8, 0xb7, 0x28, 0xcd, 0x5b, 0x46, 0x08, - 0xff, 0x9f, 0x0e, 0x94, 0x20, 0x3a, 0xf9, 0xa4, 0x92, 0xe5, 0xcb, 0x6f, - 0x05, 0x56, 0xb1, 0x5e, 0x51, 0x7f, 0x06, 0x75, 0x61, 0xf1, 0x6b, 0xb9, - 0xfc, 0x85, 0x42, 0xae, 0xb6, 0x46, 0x76, 0x5f, 0xdf, 0xe0, 0x22, 0x13, - 0xd7, 0xdd, 0x12, 0xc3, 0xe4, 0x08, 0x98, 0xd3, 0x08, 0x4a, 0x5d, 0x72, - 0x38, 0x30, 0xf6, 0x9c, 0x92, 0xb9, 0xe1, 0x84, 0xc7, 0xfa, 0x1c, 0xff, - 0x07, 0xf9, 0xf5, 0xd7, 0xc9, 0xb7, 0x61, 0xcf, 0x72, 0x06, 0xb2, 0xe0, - 0x2d, 0x71, 0xf4, 0x63, 0xee, 0x98, 0x2a, 0x95, 0xb0, 0x45, 0x0e, 0x24, - 0x38, 0xe9, 0xd6, 0x45, 0x18, 0x35, 0x5c, 0xe7, 0x68, 0x19, 0x6d, 0x34, - 0x3c, 0xeb, 0xe6, 0x9a, 0x36, 0x6d, 0x82, 0x80, 0x53, 0x25, 0x73, 0x42, - 0x75, 0x3f, 0xdf, 0x62, 0x83, 0x8e, 0x83, 0x9a, 0x51, 0x85, 0x9f, 0x0b, - 0x7b, 0x74, 0x49, 0x4b, 0xdb, 0x71, 0x00, 0x6e, 0x6c, 0x84, 0x77, 0x44, - 0x0d, 0xf0, 0x02, 0x36, 0x31, 0x05, 0x38, 0x87, 0x31, 0x40, 0xec, 0x24, - 0xc6, 0x56, 0xa2, 0xfa, 0x3f, 0xdf, 0xe0, 0x96, 0x68, 0x61, 0x87, 0x5f, - 0x8d, 0xbb, 0x30, 0xb6, 0x41, 0x6a, 0x3e, 0x30, 0x85, 0x3d, 0xda, 0x22, - 0xe6, 0x38, 0x09, 0xa6, 0x29, 0x7f, 0x32, 0x55, 0xcc, 0xf0, 0x83, 0x10, - 0x2f, 0x9b, 0x1e, 0xb7, 0xde, 0xbe, 0xdf, 0x83, 0xd5, 0x4e, 0x16, 0xaf, - 0xf2, 0xf6, 0x4d, 0x08, 0xae, 0x2a, 0x0d, 0xd3, 0xa8, 0x3d, 0x9c, 0x7b, - 0x25, 0x17, 0x69, 0x3a, 0x21, 0x64, 0xb9, 0xc0, 0x80, 0xf6, 0x2b, 0x57, - 0xf7, 0x2d, 0x3a, 0x82, 0xc9, 0x0f, 0x12, 0xc3, 0x4b, 0x75, 0xf3, 0x79, - 0xa3, 0x01, 0xec, 0xe5, 0x80, 0x04, 0x6c, 0xee, 0x05, 0x23, 0xeb, 0xcc, - 0x2a, 0x15, 0x21, 0x5f, 0x68, 0x99, 0xaf, 0x6a, 0xcd, 0x06, 0x52, 0x10, - 0xe6, 0x34, 0x6e, 0x73, 0x37, 0x14, 0x63, 0x19, 0x7b, 0x46, 0xdb, 0x0f, - 0xe2, 0x18, 0xb9, 0x0c, 0xf5, 0xd3, 0xfb, 0x23, 0x89, 0x49, 0x84, 0xd8, - 0x66, 0x70, 0x94, 0x83, 0x6e, 0x04, 0xc0, 0xb9, 0xa8, 0x94, 0x28, 0xf4, - 0x4a, 0x15, 0xbf, 0xe8, 0xb6, 0xc9, 0xdf, 0x7f, 0xfa, 0x79, 0xdf, 0x6c, - 0x4a, 0xe4, 0x98, 0xe8, 0xab, 0x96, 0xc3, 0xc7, 0x36, 0x81, 0xfd, 0x9f, - 0x76, 0x3a, 0x88, 0x17, 0x62, 0xb9, 0xce, 0x7a, 0x68, 0xaa, 0x45, 0x43, - 0xbd, 0xfe, 0x27, 0x14, 0xf5, 0xe5, 0x1e, 0xd0, 0xac, 0x47, 0x26, 0x40, - 0x8b, 0x12, 0x42, 0x06, 0x22, 0xf1, 0x61, 0x0d, 0xbf, 0xa3, 0x3a, 0x86, - 0x2e, 0x7d, 0xc5, 0xc7, 0xec, 0x35, 0x36, 0xf3, 0x87, 0x8c, 0xa6, 0x5a, - 0x41, 0xe9, 0xc5, 0x35, 0xe0, 0x97, 0x27, 0x5a, 0x78, 0xb1, 0xf4, 0x6c, - 0xbd, 0x30, 0x79, 0x7f, 0x9c, 0x8d, 0x9c, 0x21, 0xf7, 0xfc, 0x02, 0xdd, - 0xc4, 0x47, 0xba, 0xb2, 0xf2, 0x45, 0xc3, 0x5b, 0x5f, 0x5e, 0xdb, 0x38, - 0x5c, 0xd9, 0xec, 0x78, 0x43, 0xd2, 0xe9, 0xb1, 0xed, 0x2e, 0xa5, 0xc7, - 0xc6, 0xe3, 0x19, 0xf0, 0x50, 0xea, 0xfa, 0xfa, 0xa7, 0x4b, 0x8f, 0xab, - 0xfc, 0xc1, 0x8a, 0x9b, 0x9a, 0x1f, 0xbd, 0xd1, 0x53, 0xc8, 0x20, 0x57, - 0x5b, 0xba, 0xbd, 0xb9, 0x83, 0x2c, 0x07, 0xd4, 0xc1, 0xb1, 0x62, 0x7f, - 0x6e, 0xaf, 0x0b, 0x0a, 0xa1, 0x4e, 0xe2, 0xb2, 0x44, 0xe6, 0xeb, 0xdb, - 0xdc, 0xa8, 0x0a, 0x7a, 0x74, 0xc7, 0x6b, 0x89, 0x1a, 0x7b, 0x42, 0x8e, - 0xa1, 0x8c, 0x5a, 0x74, 0xcd, 0x39, 0xc7, 0x80, 0x28, 0x5e, 0x76, 0xc3, - 0x85, 0x58, 0xf6, 0xed, 0x8c, 0x09, 0x4e, 0x0e, 0xdb, 0x1e, 0x56, 0x92, - 0x1d, 0x62, 0x55, 0x5a, 0x82, 0xe8, 0x36, 0x48, 0x65, 0xd3, 0xcd, 0x82, - 0x37, 0x2d, 0x6f, 0x47, 0x1f, 0xa1, 0x34, 0xd9, 0x76, 0x78, 0x7e, 0x97, - 0x96, 0xe1, 0x6f, 0x38, 0xb7, 0x83, 0xc3, 0xb8, 0x0c, 0x79, 0x82, 0xdf, - 0x67, 0x57, 0x03, 0x6a, 0x5d, 0xf1, 0x6c, 0x7d, 0x6c, 0x6f, 0x50, 0xc6, - 0x54, 0xa9, 0x44, 0xdc, 0x16, 0x28, 0x4c, 0xc8, 0x7a, 0xb4, 0x21, 0x93, - 0x54, 0x07, 0x77, 0x43, 0x0c, 0x61, 0x1a, 0xab, 0x00, 0xbc, 0x9c, 0xc7, - 0xa4, 0xae, 0x5d, 0xd9, 0x2c, 0x7b, 0xe9, 0x4e, 0xe6, 0x81, 0xc5, 0x3a, - 0x2b, 0xe9, 0x61, 0x23, 0x70, 0x0a, 0xb0, 0x6e, 0x72, 0x6e, 0x0d, 0xe8, - 0xe8, 0xb1, 0x29, 0x76, 0x56, 0xf1, 0xdf, 0x9c, 0xde, 0xa3, 0xb1, 0x90, - 0xb0, 0x2a, 0x7b, 0x71, 0x78, 0x62, 0x92, 0x89, 0xde, 0xbd, 0x91, 0x94, - 0xc9, 0xb5, 0xbd, 0x40, 0x7c, 0x3e, 0xff, 0x3b, 0x1d, 0x4b, 0x32, 0xa1, - 0x3b, 0x95, 0xe8, 0xe4, 0xe2, 0x3d, 0xc2, 0x13, 0x59, 0x99, 0xdf, 0x2a, - 0xa6, 0x32, 0x32, 0x2f, 0x2b, 0xe7, 0xbb, 0x07, 0x06, 0x40, 0xcf, 0xf5, - 0x7c, 0x90, 0x22, 0x4e, 0x4f, 0xb9, 0x42, 0xcb, 0x37, 0x02, 0xcc, 0x41, - 0xbb, 0x3c, 0x7d, 0xd8, 0xf0, 0xbf, 0xd8, 0x09, 0x34, 0x8e, 0x97, 0x74, - 0x84, 0x8f, 0xf4, 0xb1, 0x89, 0xde, 0x78, 0x41, 0x97, 0x28, 0xa4, 0xf4, - 0x2e, 0x70, 0xae, 0x85, 0x8b, 0x0a, 0xbd, 0xdf, 0xf6, 0x48, 0x0e, 0xf9, - 0x91, 0xbc, 0x7f, 0xec, 0x9d, 0xb9, 0x53, 0xdb, 0xf9, 0x54, 0x50, 0x9b, - 0xeb, 0x2f, 0xdd, 0x97, 0xc0, 0xc9, 0x20, 0xa5, 0x6d, 0x74, 0xd5, 0xdf, - 0xf1, 0xad, 0x2b, 0xb6, 0xe3, 0xdb, 0xf7, 0x9e, 0x92, 0x4f, 0xcd, 0x95, - 0x4d, 0x6f, 0x3e, 0xd6, 0x01, 0x63, 0x13, 0x1a, 0xcc, 0xdb, 0x1a, 0x66, - 0xfa, 0x5d, 0xb8, 0xd3, 0x36, 0xcd, 0x98, 0x27, 0x3a, 0x41, 0x03, 0x16, - 0x20, 0x82, 0x9b, 0xeb, 0xf6, 0x8a, 0xbb, 0x1b, 0xbb, 0x58, 0x55, 0x89, - 0x38, 0x94, 0x04, 0x8f, 0xc3, 0x35, 0x69, 0xbc, 0xb2, 0x35, 0x29, 0x3e, - 0xa7, 0x6d, 0x4c, 0xa1, 0xe3, 0xa9, 0xf6, 0x5e, 0x58, 0xd5, 0x4a, 0xe8, - 0x76, 0x2e, 0x34, 0xc6, 0x9f, 0x72, 0x34, 0x8e, 0xa0, 0x5c, 0x01, 0x33, - 0xeb, 0xe7, 0x81, 0x51, 0x6a, 0xbf, 0x27, 0x71, 0x5f, 0x86, 0x1c, 0x1e, - 0xdd, 0x2e, 0x6d, 0x5e, 0xe6, 0x7a, 0xfa, 0x7d, 0x7b, 0xb5, 0x2b, 0x2e, - 0x3a, 0xd1, 0xe1, 0x09, 0x76, 0xef, 0x3e, 0xf6, 0x2d, 0x16, 0xc2, 0xd3, - 0x90, 0xd4, 0x62, 0xfd, 0xe3, 0x6c, 0xdd, 0x4a, 0x15, 0x5c, 0xa4, 0xaa, - 0x0b, 0x56, 0x31, 0x97, 0x66, 0x61, 0x9f, 0x86, 0xfb, 0x44, 0x6d, 0x52, - 0x79, 0x5f, 0xbb, 0x53, 0x49, 0x22, 0x5e, 0xea, 0x73, 0xbf, 0x9d, 0xe3, - 0xe3, 0x78, 0x2e, 0x2f, 0xc0, 0x8b, 0x1f, 0x36, 0xc2, 0x4d, 0x09, 0xee, - 0xc9, 0x86, 0x03, 0x6d, 0x0e, 0x76, 0xfc, 0xa9, 0x07, 0x03, 0x1e, 0x96, - 0x9b, 0x5b, 0x9e, 0x7d, 0xe8, 0x17, 0x7b, 0xbf, 0xe6, 0x42, 0xee, 0xd9, - 0xca, 0xad, 0x8e, 0xb4, 0xe4, 0x7a, 0x2b, 0x87, 0x06, 0xc7, 0x2b, 0xcd, - 0x52, 0x3a, 0xef, 0x7f, 0x5a, 0xb7, 0xf1, 0xc3, 0x09, 0xd4, 0x40, 0xd0, - 0x78, 0x00, 0xe6, 0xec, 0x38, 0xf2, 0x99, 0xba, 0x99, 0x8a, 0x1f, 0xc6, - 0x9d, 0x4e, 0xe2, 0xee, 0xb4, 0x68, 0xe7, 0x60, 0x06, 0x21, 0xf6, 0x81, - 0x06, 0x27, 0x21, 0xf8, 0xbf, 0x80, 0x94, 0x02, 0x1c, 0xf4, 0x4c, 0x82, - 0x7e, 0x44, 0x14, 0x94, 0xae, 0x7a, 0x38, 0xf1, 0xee, 0xbd, 0x8a, 0x5a, - 0xf9, 0x95, 0xec, 0xf6, 0x03, 0xe3, 0x51, 0x49, 0x18, 0xb4, 0x76, 0x95, - 0x1c, 0x6e, 0x18, 0xfa, 0x4e, 0x67, 0xaa, 0x1e, 0x9f, 0x37, 0xea, 0x98, - 0x3e, 0x9b, 0x60, 0x03, 0xb4, 0x3d, 0x5a, 0x8a, 0xea, 0x3f, 0xce, 0x8c, - 0x4a, 0x8b, 0x79, 0x3c, 0x31, 0x85, 0xf0, 0xb5, 0x84, 0x2b, 0x49, 0x1a, - 0x98, 0xea, 0x18, 0xfd, 0x5b, 0xc5, 0xd3, 0xee, 0xbd, 0x44, 0x01, 0x85, - 0x6d, 0x29, 0xcc, 0x39, 0x5e, 0x51, 0x1e, 0x4c, 0x3d, 0xc6, 0x66, 0x01, - 0x90, 0x05, 0x25, 0x28, 0xe5, 0x54, 0x32, 0xbe, 0xa3, 0xca, 0x9a, 0x53, - 0x6e, 0xca, 0x9b, 0x1c, 0xf9, 0x0b, 0x1d, 0xbb, 0xbf, 0x97, 0x87, 0xb4, - 0x8e, 0x35, 0x6c, 0x3e, 0x8e, 0x08, 0x6a, 0x54, 0x99, 0xac, 0x27, 0xa9, - 0xa6, 0xf4, 0xd5, 0xdb, 0x27, 0x91, 0x64, 0x0f, 0xbe, 0x76, 0xdc, 0xff, - 0x15, 0x38, 0x0f, 0xe0, 0xf9, 0x17, 0x70, 0x9b, 0xa7, 0x11, 0xe9, 0xaf, - 0x35, 0x71, 0xb0, 0x36, 0xc8, 0xbb, 0x3e, 0x4e, 0xff, 0x05, 0x45, 0x7f, - 0x03, 0x7b, 0xba, 0x8d, 0x96, 0xdf, 0x73, 0xf3, 0x3c, 0xb5, 0x92, 0xba, - 0xf8, 0x8e, 0x23, 0x2c, 0x1f, 0x5e, 0xff, 0xe3, 0x09, 0x7c, 0x89, 0xb5, - 0xcc, 0x9c, 0x9d, 0x5e, 0x21, 0xf4, 0x33, 0xbb, 0xf0, 0x07, 0xed, 0x5d, - 0x3d, 0x74, 0x2f, 0x20, 0x65, 0xd2, 0x13, 0x7b, 0xfc, 0x81, 0xf1, 0xe1, - 0x7f, 0xb9, 0x4a, 0xbc, 0x13, 0x43, 0x3d, 0xbe, 0xf0, 0x0d, 0x50, 0xfa, - 0x5d, 0x1e, 0xf4, 0xe2, 0x39, 0x2a, 0x7e, 0xa0, 0x78, 0xbe, 0x94, 0xd8, - 0x68, 0x69, 0xd4, 0x10, 0xc3, 0x19, 0x6e, 0x26, 0x90, 0xd3, 0xa1, 0xfb, - 0x4c, 0x4b, 0x8d, 0x39, 0xe5, 0x43, 0x40, 0xd3, 0xeb, 0xdf, 0x81, 0x53, - 0x9a, 0x2e, 0x4c, 0xff, 0xd7, 0x10, 0xe3, 0x09, 0xba, 0x3b, 0x7a, 0xb4, - 0x78, 0x26, 0x2a, 0xbf, 0xe1, 0x45, 0x68, 0xbe, 0xf4, 0xce, 0xbd, 0xc4, - 0x57, 0x62, 0x4e, 0x6e, 0xd6, 0xd4, 0x8e, 0x97, 0xf3, 0xb2, 0x3d, 0x41, - 0x54, 0x1c, 0x28, 0x29, 0x74, 0xdf, 0x28, 0x4e, 0x9d, 0x28, 0x21, 0xaf, - 0xc6, 0x21, 0x09, 0x4b, 0x0e, 0x28, 0x55, 0xeb, 0x0b, 0xd3, 0xad, 0xe7, - 0x9a, 0x42, 0x4d, 0x79, 0x67, 0xbb, 0xeb, 0x06, 0xe4, 0xb3, 0x43, 0x8c, - 0xf4, 0x9f, 0x75, 0xd4, 0xaf, 0x0b, 0xe7, 0xeb, 0x9c, 0x5d, 0x70, 0x0f, - 0xe7, 0xd9, 0x75, 0x5b, 0xc5, 0x84, 0x58, 0x13, 0xdb, 0x04, 0xcf, 0x1f, - 0xfa, 0xca, 0xf6, 0x58, 0xf9, 0xa2, 0x94, 0x7e, 0x69, 0x93, 0xd4, 0xa1, - 0x24, 0x07, 0xcb, 0xd1, 0x7e, 0x91, 0x69, 0x7f, 0xcf, 0x57, 0x30, 0x43, - 0x27, 0x9c, 0xc8, 0x4d, 0x1a, 0x13, 0xbe, 0xeb, 0x6f, 0x6a, 0xa8, 0xb1, - 0x2d, 0x15, 0xff, 0x51, 0x18, 0xb1, 0x03, 0x2b, 0x3a, 0xaf, 0xf8, 0x6d, - 0x34, 0x35, 0xd8, 0x5a, 0x06, 0xd5, 0x89, 0x15, 0x04, 0x09, 0xd7, 0xee, - 0x5a, 0x61, 0x7d, 0x6a, 0x7f, 0x35, 0x25, 0x6d, 0xec, 0x30, 0xf1, 0x5e, - 0x58, 0x3c, 0x50, 0x81, 0xd1, 0x5d, 0x7e, 0x67, 0xd6, 0x9f, 0x05, 0x54, - 0x24, 0xd2, 0xe3, 0x89, 0x8c, 0x80, 0x32, 0x67, 0x0d, 0xf7, 0x44, 0x7e, - 0x42, 0x70, 0xe0, 0xca, 0x60, 0x64, 0xc8, 0xa6, 0xac, 0xf9, 0x96, 0x64, - 0x6a, 0xd3, 0x7f, 0xdf, 0x6e, 0xfd, 0xf7, 0xb9, 0x03, 0x73, 0xeb, 0x90, - 0xec, 0xff, 0x07, 0x63, 0x83, 0x6e, 0xa0, 0xfa, 0x30, 0x54, 0x29, 0xf4, - 0xb6, 0x44, 0xe1, 0xb8, 0x98, 0x1f, 0x67, 0x40, 0x3a, 0x20, 0x72, 0xa6, - 0xd6, 0xa5, 0xf3, 0x6c, 0x13, 0x02, 0x83, 0xb1, 0x7e, 0x8c, 0xe1, 0x93, - 0xa3, 0xab, 0x48, 0xc9, 0x61, 0x21, 0x05, 0xcf, 0x41, 0x7e, 0xfa, 0x3d, - 0x4f, 0xcb, 0x2f, 0x9c, 0xd8, 0xe8, 0x30, 0xbd, 0x72, 0xc2, 0x09, 0x0d, - 0x89, 0x26, 0x9b, 0xb3, 0xd3, 0x77, 0x71, 0x40, 0x8a, 0x36, 0x89, 0xa2, - 0x11, 0xd5, 0x7e, 0x6d, 0x8e, 0x5b, 0x56, 0x40, 0x55, 0x32, 0xe5, 0x4a, - 0xf5, 0x46, 0xd0, 0x12, 0x07, 0x86, 0x4d, 0x1d, 0xc8, 0xe1, 0x7b, 0xc7, - 0xfc, 0x33, 0x9e, 0x1a, 0x43, 0x31, 0x0a, 0xab, 0x24, 0x64, 0x4a, 0x8c, - 0x41, 0xb6, 0xcf, 0x13, 0x59, 0xd8, 0xaa, 0x23, 0xdd, 0x7c, 0x21, 0xa6, - 0xe2, 0xe8, 0xa5, 0xf3, 0x85, 0x72, 0xf7, 0x8d, 0xa1, 0xcf, 0x59, 0x1a, - 0x77, 0xb0, 0x77, 0x53, 0xb6, 0x78, 0x55, 0x26, 0xb3, 0xab, 0x65, 0x01, - 0x7d, 0xf5, 0x73, 0x2b, 0x27, 0x94, 0x89, 0x5e, 0x5c, 0x0c, 0x4d, 0x6a, - 0x7c, 0x47, 0xca, 0xbd, 0x92, 0x9b, 0x1a, 0xb8, 0x44, 0xf4, 0x97, 0xcb, - 0x01, 0x08, 0xed, 0x74, 0xae, 0x72, 0xa1, 0xa8, 0x6e, 0xc9, 0x9d, 0x83, - 0x70, 0xcb, 0x7b, 0xe6, 0x07, 0x6c, 0xc4, 0x89, 0xfd, 0x63, 0xe3, 0xdf, - 0xe3, 0xac, 0xb6, 0xe2, 0x39, 0x82, 0xb1, 0x5e, 0x6e, 0x25, 0x93, 0x58, - 0x63, 0x05, 0xf0, 0x36, 0x0d, 0xd8, 0x0b, 0x43, 0xec, 0x5b, 0x5d, 0x41, - 0x3c, 0x40, 0x37, 0xfe, 0x93, 0x32, 0x67, 0xc0, 0x18, 0x45, 0x65, 0xd7, - 0xa3, 0x4a, 0x5a, 0x74, 0xd8, 0xc8, 0xfc, 0xa9, 0xe2, 0xdd, 0x72, 0xff, - 0x9f, 0x82, 0xae, 0x34, 0xf2, 0x42, 0x94, 0xd9, 0x3b, 0xa0, 0x5a, 0x7b, - 0x0d, 0x41, 0x03, 0x13, 0xcb, 0xc9, 0x47, 0x16, 0xf1, 0x44, 0x03, 0x50, - 0x36, 0x51, 0x61, 0x43, 0xdc, 0x2e, 0xaa, 0xe1, 0xf3, 0x08, 0x62, 0x5e, - 0x87, 0xe0, 0xdc, 0x51, 0x7c, 0xe2, 0xb0, 0x7d, 0xce, 0xe3, 0x35, 0x94, - 0x7e, 0x06, 0x9d, 0x3a, 0x64, 0xcf, 0x4c, 0xee, 0x30, 0x49, 0xb5, 0xe4, - 0x5f, 0xd2, 0xfa, 0x33, 0x6d, 0x14, 0xde, 0xef, 0x37, 0xf6, 0xf7, 0x74, - 0x45, 0xb3, 0x79, 0x8d, 0x9b, 0x71, 0x2a, 0xa2, 0x99, 0x66, 0x65, 0x90, - 0x09, 0x49, 0xd2, 0x35, 0xbf, 0xd6, 0xfe, 0x4b, 0xf2, 0xce, 0xe1, 0x06, - 0x71, 0x67, 0x67, 0xef, 0xf9, 0x4a, 0x42, 0x38, 0x23, 0x0b, 0x59, 0x57, - 0xc7, 0xc1, 0x90, 0x26, 0xfb, 0x0e, 0x62, 0xea, 0xf5, 0x30, 0x80, 0x22, - 0xa1, 0x05, 0xbf, 0xa3, 0xc9, 0x2e, 0xd8, 0x22, 0x78, 0x52, 0x60, 0xf1, - 0x84, 0xf1, 0x10, 0x83, 0xcf, 0x2a, 0xe6, 0x64, 0x3c, 0x9c, 0xe1, 0x04, - 0x9b, 0x33, 0x92, 0x39, 0x8c, 0xa5, 0xfb, 0xbf, 0xf3, 0x01, 0xf8, 0x34, - 0xd0, 0x91, 0x61, 0x45, 0xbb, 0xb4, 0x05, 0xe9, 0x90, 0xee, 0xb8, 0xe1, - 0xa8, 0x84, 0xe1, 0x06, 0xcc, 0x9a, 0x22, 0xcd, 0x00, 0x02, 0x1a, 0xc7, - 0x05, 0x10, 0x96, 0xa1, 0xb1, 0x77, 0xbe, 0xb5, 0xd4, 0xe9, 0x54, 0xc3, - 0xfb, 0x68, 0x7e, 0xd9, 0x0b, 0x7d, 0xfb, 0x0b, 0x26, 0xe0, 0xe3, 0xde, - 0xc7, 0xbd, 0x0e, 0x10, 0x26, 0x19, 0xc4, 0x2e, 0x60, 0xb4, 0xd3, 0xf9, - 0x11, 0x03, 0x13, 0xd2, 0xfd, 0x65, 0x97, 0x80, 0x3a, 0x5f, 0x2c, 0x73, - 0x2f, 0xee, 0x92, 0x8b, 0x61, 0xde, 0xa9, 0x22, 0x3e, 0x5f, 0x61, 0x5f, - 0xa6, 0x56, 0xaf, 0xdb, 0x06, 0xba, 0x53, 0x5e, 0x10, 0xcc, 0x63, 0x5a, - 0xd1, 0xd6, 0xe7, 0x23, 0xa2, 0x57, 0x88, 0x5a, 0xf3, 0x57, 0x68, 0x01, - 0x1a, 0x25, 0xfa, 0x70, 0x9e, 0xea, 0x4f, 0x70, 0xf3, 0x95, 0x5c, 0x9f, - 0x1c, 0x83, 0xf4, 0x29, 0x6e, 0x59, 0x74, 0xb4, 0x06, 0xb9, 0xa7, 0x8b, - 0x0e, 0x12, 0x79, 0xae, 0x84, 0xc2, 0x96, 0x61, 0x65, 0x0b, 0x76, 0xbd, - 0x61, 0xa3, 0x4f, 0xf1, 0x3f, 0x4b, 0x91, 0x24, 0xe0, 0x2a, 0xc1, 0xb5, - 0x58, 0xcc, 0xb5, 0xfd, 0x4f, 0x55, 0x1f, 0xce, 0x90, 0x5a, 0x97, 0xc3, - 0xd5, 0x21, 0x6d, 0x30, 0x1a, 0x6c, 0xfd, 0x84, 0x1d, 0xb1, 0x28, 0x7b, - 0x62, 0x05, 0x04, 0xc5, 0x3e, 0x4e, 0xe9, 0xc5, 0x23, 0x8a, 0x02, 0x2b, - 0xf7, 0x1a, 0xf5, 0x00, 0xae, 0x9d, 0xa9, 0xdc, 0x28, 0x64, 0x59, 0xb4, - 0x3e, 0xf3, 0x7d, 0xf4, 0xb5, 0x13, 0x39, 0x29, 0xe4, 0x25, 0x4e, 0x6b, - 0x88, 0xe1, 0x20, 0x04, 0xfc, 0x04, 0x01, 0xc1, 0x26, 0xef, 0x1d, 0xa9, - 0xb6, 0x6c, 0xc4, 0x6a, 0x34, 0x72, 0xef, 0x91, 0x3a, 0x0c, 0x7d, 0x46, - 0x00, 0x35, 0x71, 0x78, 0x3a, 0xaf, 0xd2, 0x97, 0xa1, 0x52, 0x2f, 0x5f, - 0xa0, 0xd9, 0x46, 0xec, 0xb5, 0x5e, 0x50, 0x97, 0x1c, 0x95, 0xa6, 0xf3, - 0xef, 0x43, 0xd2, 0x59, 0xf4, 0xd5, 0xbe, 0x33, 0x17, 0x04, 0xa2, 0x63, - 0x18, 0x76, 0xa4, 0x86, 0xe3, 0xc6, 0x32, 0x40, 0x8f, 0xa5, 0xb5, 0x5d, - 0x56, 0x84, 0x10, 0x3b, 0xcf, 0xce, 0x5f, 0x17, 0xcd, 0x07, 0x70, 0x15, - 0x9a, 0x92, 0x36, 0x65, 0x86, 0xfc, 0x85, 0x28, 0x7e, 0xa8, 0x4c, 0xe1, - 0x99, 0x36, 0xb2, 0xb3, 0x81, 0xf5, 0x9a, 0x08, 0x24, 0xe3, 0xf4, 0x40, - 0x6f, 0x0b, 0xc7, 0x13, 0x36, 0xf3, 0xc0, 0x95, 0x1c, 0x00, 0xca, 0x9b, - 0x98, 0xba, 0x3a, 0xbf, 0x79, 0x57, 0x37, 0x4f, 0xe2, 0x80, 0x86, 0xa9, - 0x98, 0xa6, 0x69, 0x6b, 0xcf, 0x2c, 0x32, 0x43, 0xf1, 0xe3, 0x81, 0xf4, - 0x15, 0xaf, 0x8c, 0x97, 0x00, 0xdd, 0x00, 0x79, 0xf3, 0xdc, 0xd3, 0x0a, - 0x11, 0xbf, 0x0a, 0xb3, 0x8f, 0x98, 0x5c, 0xc3, 0x64, 0xc5, 0x0d, 0x5e, - 0xe0, 0xf8, 0x16, 0xca, 0x1b, 0xff, 0xa4, 0xa9, 0x0e, 0xc7, 0x02, 0xb1, - 0x73, 0xfe, 0x39, 0x44, 0xe8, 0xb1, 0xa3, 0xd6, 0xe7, 0xc3, 0x2d, 0x4c, - 0xbf, 0xcd, 0xa8, 0xbd, 0xc0, 0x36, 0x88, 0xdc, 0x7c, 0xc9, 0xf5, 0x57, - 0xdd, 0x05, 0x99, 0xc4, 0x30, 0x52, 0x75, 0x1f, 0xc0, 0x02, 0xc0, 0x5e, - 0x79, 0x34, 0xd3, 0x95, 0x6c, 0x8b, 0x59, 0xac, 0x60, 0x33, 0x38, 0xd5, - 0xa0, 0x95, 0xbd, 0xba, 0x13, 0xd8, 0xcd, 0xa3, 0x6e, 0x41, 0x2f, 0x7e, - 0xfa, 0x80, 0x69, 0xdf, 0x90, 0x82, 0x4d, 0x6f, 0xf7, 0x47, 0x30, 0x5c, - 0xff, 0x33, 0x65, 0x59, 0xb0, 0x8d, 0xfd, 0x6d, 0x3e, 0xc6, 0xe4, 0xff, - 0x4c, 0xc5, 0xd1, 0x71, 0xfd, 0x77, 0x1e, 0x7b, 0x47, 0x5c, 0x77, 0x11, - 0x96, 0x85, 0x78, 0xed, 0x18, 0x3b, 0x18, 0x18, 0xe7, 0x01, 0x0f, 0x05, - 0x50, 0xa0, 0x1a, 0xcd, 0x14, 0xee, 0x9e, 0xb5, 0xfc, 0xff, 0x3b, 0x74, - 0x18, 0x23, 0x48, 0x46, 0x17, 0xaa, 0x32, 0x69, 0x2a, 0x63, 0xf9, 0x06, - 0x03, 0x3c, 0x91, 0x12, 0x2b, 0x42, 0x6c, 0xd4, 0xc2, 0x00, 0x40, 0xa9, - 0x92, 0x48, 0x2a, 0x1c, 0xed, 0x8b, 0x18, 0x21, 0x3f, 0x89, 0x06, 0x47, - 0xf5, 0x71, 0xe7, 0x7c, 0x23, 0x14, 0xaf, 0xaf, 0x91, 0xd5, 0x06, 0x14, - 0xc7, 0x0e, 0x3b, 0x01, 0x0c, 0xbe, 0xf0, 0x0f, 0x23, 0xed, 0xc5, 0xe6, - 0xd6, 0xea, 0x10, 0x53, 0x1c, 0x2d, 0x1b, 0x33, 0xec, 0x11, 0xcb, 0x79, - 0xfd, 0xc1, 0xb4, 0x35, 0xec, 0xdc, 0xd3, 0xc6, 0x12, 0x1b, 0xa6, 0xb3, - 0x60, 0xdc, 0xb9, 0xea, 0xbf, 0xb2, 0x48, 0x81, 0x58, 0x65, 0x95, 0x7c, - 0xda, 0x3b, 0x9a, 0x61, 0xe9, 0xf6, 0x5c, 0x7a, 0x52, 0xe3, 0x40, 0x2a, - 0xe7, 0xf8, 0xd4, 0x34, 0x9e, 0xd3, 0x5a, 0x09, 0x0f, 0xff, 0x02, 0xfc, - 0x77, 0xa0, 0x8a, 0x81, 0x91, 0x5d, 0xf2, 0x31, 0x04, 0x39, 0x4c, 0x23, - 0x09, 0x2a, 0xfb, 0xd5, 0x0a, 0x6f, 0xa4, 0x2a, 0x6a, 0x39, 0x89, 0x2d, - 0x83, 0x53, 0xaa, 0x5f, 0xce, 0xc4, 0x6f, 0x2b, 0xd0, 0x62, 0x5a, 0xd0, - 0x04, 0x9b, 0xe3, 0xa4, 0x84, 0x6c, 0x33, 0xb3, 0xeb, 0x5a, 0xf1, 0xf2, - 0x78, 0x60, 0x78, 0x9f, 0x71, 0x32, 0x66, 0x5b, 0xac, 0xa2, 0x5c, 0x17, - 0xb2, 0x1e, 0x98, 0xf2, 0xa0, 0xe2, 0xe3, 0x42, 0x64, 0xd8, 0x01, 0x3e, - 0x8e, 0x5e, 0x10, 0x72, 0x7d, 0x51, 0x5d, 0xc2, 0x75, 0x5d, 0x84, 0x13, - 0x15, 0x78, 0x38, 0x92, 0xea, 0xda, 0xef, 0xd3, 0x08, 0xbe, 0x46, 0xe5, - 0x0c, 0xa4, 0x01, 0x48, 0x52, 0x5a, 0x30, 0xe7, 0x44, 0x08, 0x91, 0x3b, - 0x33, 0x1c, 0xd9, 0x8d, 0x0f, 0x15, 0x9f, 0xc9, 0x95, 0xfc, 0xd1, 0x16, - 0x18, 0xa0, 0xde, 0x3c, 0x9a, 0xd4, 0x38, 0x13, 0x40, 0x99, 0x4e, 0x20, - 0x23, 0x82, 0x04, 0xe7, 0xf4, 0x8b, 0x58, 0xdc, 0x78, 0xf3, 0x03, 0x24, - 0xc9, 0x93, 0x77, 0x94, 0x4f, 0xcf, 0xef, 0xfb, 0x3b, 0xfd, 0xf6, 0x9c, - 0xb5, 0x11, 0xe9, 0xab, 0x81, 0xc9, 0x5c, 0xea, 0x9b, 0xc6, 0x8c, 0xc2, - 0x0a, 0x0e, 0x68, 0xf0, 0x3c, 0x84, 0x65, 0x2e, 0x7b, 0xe2, 0x64, 0x2d, - 0x48, 0x70, 0xf3, 0x9a, 0xa2, 0x27, 0xba, 0x2e, 0x16, 0x33, 0x35, 0x57, - 0x30, 0x27, 0xeb, 0xaf, 0xbd, 0xec, 0xc5, 0x91, 0x97, 0x26, 0xb8, 0xd8, - 0x7f, 0xd4, 0x7e, 0xbc, 0x90, 0x14, 0xf6, 0x09, 0x1f, 0x87, 0x2b, 0x06, - 0xb1, 0x79, 0x02, 0xb0, 0xbd, 0x11, 0x41, 0xf7, 0x58, 0x68, 0xbd, 0x23, - 0xea, 0xf9, 0x8c, 0x94, 0x5c, 0xf4, 0x5a, 0x16, 0xb0, 0x86, 0x3c, 0x00, - 0x14, 0x22, 0xc3, 0x8e, 0x8f, 0xdb, 0x0f, 0x96, 0x64, 0x55, 0x76, 0x1e, - 0xbb, 0x6a, 0x71, 0xf5, 0x34, 0x54, 0x55, 0xd9, 0x96, 0x80, 0x60, 0x59, - 0xc6, 0xdf, 0xa7, 0x68, 0x4c, 0x39, 0xd5, 0x7e, 0x17, 0x6e, 0xc0, 0x65, - 0x0e, 0xb4, 0xe8, 0x83, 0xb7, 0x41, 0x1f, 0x18, 0x52, 0x75, 0x44, 0x82, - 0x22, 0x7b, 0x3a, 0xa8, 0xa4, 0x4d, 0x7c, 0x0f, 0x53, 0xf9, 0x8c, 0x86, - 0x54, 0x0e, 0x29, 0xcd, 0x86, 0x82, 0x20, 0x6c, 0xbb, 0x13, 0x87, 0xd7, - 0x3a, 0x0f, 0x72, 0x98, 0x9f, 0x7c, 0xa1, 0x2e, 0xc4, 0x63, 0xb4, 0xe3, - 0x48, 0x1f, 0xd0, 0xc2, 0x63, 0x81, 0xbc, 0x7f, 0x47, 0x69, 0xe5, 0xb6, - 0xa7, 0xf9, 0x17, 0x89, 0xf1, 0xc3, 0x94, 0xcf, 0x85, 0x1b, 0xd9, 0x70, - 0xcd, 0x52, 0x6a, 0xe4, 0xe7, 0xd8, 0x8a, 0x41, 0x0e, 0x93, 0xe8, 0x7b, - 0x73, 0x52, 0x74, 0x60, 0x78, 0x4a, 0x8f, 0x0b, 0x6e, 0xc1, 0xf2, 0x10, - 0x3e, 0xcf, 0x4e, 0x6c, 0xeb, 0xc8, 0xf7, 0x46, 0x2e, 0x99, 0x95, 0xdb, - 0x52, 0x66, 0x08, 0xaf, 0x85, 0x68, 0x84, 0x23, 0x0c, 0x7f, 0xac, 0xcf, - 0x92, 0xef, 0xb0, 0x8a, 0xc1, 0x79, 0xfb, 0x81, 0x18, 0xb6, 0x69, 0x90, - 0xc3, 0x2e, 0x80, 0xab, 0x78, 0x8f, 0x8c, 0x38, 0xca, 0x3a, 0xfd, 0x0b, - 0xef, 0x29, 0x25, 0xef, 0x55, 0xe4, 0xcc, 0xc9, 0xdc, 0x03, 0x1a, 0xbb, - 0xb9, 0x96, 0x96, 0x74, 0x64, 0x12, 0x05, 0xa3, 0xf8, 0x9a, 0x06, 0x9b, - 0xd6, 0xc1, 0x89, 0x2b, 0xf0, 0x12, 0x89, 0x0c, 0x69, 0x64, 0x3d, 0x79, - 0x4e, 0x02, 0xef, 0xa5, 0xe5, 0xaa, 0xce, 0x77, 0x85, 0xb1, 0x69, 0x2e, - 0xd8, 0x57, 0x38, 0x35, 0xaa, 0x0a, 0x1a, 0x38, 0x36, 0x80, 0xd6, 0x4e, - 0x0a, 0x76, 0x3c, 0xcd, 0xa6, 0x39, 0x6e, 0x7e, 0xef, 0xd2, 0x81, 0x21, - 0xbf, 0x42, 0xb3, 0x2d, 0xcb, 0xf8, 0x12, 0x00, 0x76, 0x5a, 0x0e, 0x2c, - 0xc5, 0x8e, 0x96, 0xee, 0xf2, 0xed, 0xe1, 0x31, 0xc7, 0x05, 0xcd, 0x42, - 0xb0, 0x22, 0xd1, 0xdb, 0x60, 0xf2, 0x95, 0x2a, 0x52, 0x68, 0x7a, 0x88, - 0x0e, 0x8a, 0x2b, 0x11, 0x12, 0x05, 0x94, 0xf8, 0x07, 0xbf, 0xf2, 0xa3, - 0x31, 0xc7, 0xd2, 0x8d, 0x08, 0xd1, 0xc9, 0xa3, 0x74, 0x32, 0x2f, 0x71, - 0x96, 0xdc, 0x9e, 0x8a, 0xa7, 0xc3, 0x2d, 0x3b, 0xde, 0x0d, 0xc1, 0x24, - 0x07, 0xd8, 0xe9, 0xf8, 0xe1, 0x7c, 0xe5, 0x01, 0x50, 0xd1, 0xe3, 0xd3, - 0xaa, 0xad, 0x4c, 0x11, 0xcc, 0x5a, 0x4c, 0xe8, 0xdf, 0xd1, 0x4c, 0x00, - 0xc7, 0x10, 0x4d, 0xd6, 0xe1, 0x72, 0x35, 0x75, 0x56, 0x38, 0x00, 0xcc, - 0xf3, 0x62, 0x15, 0x63, 0x26, 0x75, 0x02, 0x17, 0x91, 0xee, 0xae, 0xca, - 0xfd, 0xe1, 0xdd, 0x9c, 0xa5, 0xcc, 0x9a, 0xfa, 0xab, 0x2a, 0x84, 0xd3, - 0x14, 0xad, 0x47, 0x4f, 0xf4, 0xf8, 0xc6, 0xe0, 0xe4, 0xe8, 0xb5, 0x22, - 0xa8, 0x0a, 0xbe, 0x95, 0x39, 0x60, 0xdd, 0x55, 0x67, 0xa5, 0x95, 0xf3, - 0x63, 0xae, 0x0d, 0x58, 0x95, 0xcc, 0xf8, 0xd0, 0x0b, 0xb1, 0x4a, 0x06, - 0x1f, 0xb3, 0x10, 0x8b, 0x50, 0x77, 0x3b, 0xe8, 0x12, 0xd8, 0xe8, 0x93, - 0xb5, 0x7f, 0x51, 0x1d, 0x0a, 0x74, 0x42, 0x43, 0x11, 0x58, 0x94, 0xb9, - 0xb1, 0x64, 0x3e, 0x2e, 0x58, 0x13, 0xac, 0x49, 0xfb, 0xbb, 0x5f, 0xe2, - 0x2f, 0xc6, 0x68, 0x6d, 0x0b, 0x69, 0xe8, 0xc3, 0x50, 0x94, 0x28, 0x18, - 0xc4, 0x43, 0x4b, 0x85, 0x5a, 0x19, 0x39, 0x60, 0x50, 0x9b, 0x3b, 0x9a, - 0x74, 0xe3, 0x21, 0x8e, 0xc7, 0xba, 0x21, 0x3e, 0x28, 0x6e, 0x8b, 0x4c, - 0x06, 0x95, 0x72, 0xca, 0x6b, 0x16, 0x36, 0xe1, 0xe2, 0x0d, 0xf8, 0x73, - 0x42, 0xf4, 0xb7, 0x98, 0x26, 0xe5, 0x9a, 0xc7, 0x22, 0xd6, 0x4b, 0x39, - 0x70, 0x11, 0x30, 0xb5, 0x21, 0x2a, 0xb7, 0x16, 0x20, 0x37, 0xae, 0x4a, - 0x98, 0xab, 0x24, 0x4a, 0x43, 0xd9, 0x61, 0x0f, 0xb3, 0x85, 0x72, 0xce, - 0xfa, 0xea, 0x8a, 0x41, 0x85, 0x05, 0x4f, 0xdb, 0x7d, 0xda, 0xb8, 0x8d, - 0x76, 0x16, 0xb7, 0x1c, 0x8e, 0x90, 0xb5, 0xda, 0x3f, 0x19, 0x9f, 0x4e, - 0xe8, 0xd0, 0xc4, 0xa9, 0x69, 0x63, 0xc3, 0xd7, 0xbb, 0xcc, 0x78, 0xf9, - 0x3c, 0xa8, 0xea, 0xa2, 0x3d, 0x2a, 0x18, 0xef, 0x4f, 0x04, 0xf0, 0x24, - 0x08, 0xaf, 0x90, 0xdb, 0xf5, 0xc9, 0xd7, 0x20, 0xab, 0xe2, 0xd8, 0xdb, - 0xad, 0x9a, 0x33, 0x9f, 0xa9, 0x98, 0x6b, 0xfc, 0xfd, 0x56, 0x8e, 0x35, - 0xf8, 0x35, 0x59, 0xcb, 0x67, 0xac, 0x78, 0x1d, 0x88, 0x57, 0x46, 0x9d, - 0xe7, 0x0d, 0xc2, 0x6d, 0x45, 0x17, 0x14, 0x67, 0xd3, 0xb8, 0xec, 0xee, - 0x3c, 0x31, 0xde, 0x4f, 0x03, 0x47, 0x63, 0xb9, 0xbb, 0x7b, 0xc5, 0x82, - 0x5c, 0xbf, 0x6c, 0xb5, 0xe0, 0x10, 0xe5, 0xae, 0xcf, 0xb5, 0x00, 0x0c, - 0x0c, 0xa4, 0xf5, 0x8c, 0x93, 0xfb, 0x92, 0x86, 0x8e, 0xa5, 0x05, 0x6f, - 0xec, 0x47, 0xd1, 0x5a, 0x42, 0xb2, 0x0a, 0x8e, 0x79, 0xd7, 0x40, 0x99, - 0x37, 0x37, 0x17, 0x70, 0x14, 0x59, 0x34, 0x9e, 0x5d, 0xf6, 0xcf, 0xcb, - 0xc1, 0xcf, 0xfe, 0x57, 0x7d, 0x92, 0xfc, 0x70, 0xee, 0x1d, 0xcb, 0x05, - 0x31, 0xc9, 0x6e, 0xc7, 0x54, 0xe4, 0xc5, 0xab, 0x22, 0x4a, 0xda, 0x17, - 0xd0, 0x11, 0x77, 0xaf, 0x92, 0x85, 0xa2, 0xd0, 0xfe, 0xe1, 0x75, 0xc7, - 0x75, 0x6a, 0x2e, 0x29, 0x16, 0xe7, 0x0a, 0x75, 0x11, 0xbe, 0x13, 0x9b, - 0xb8, 0xc0, 0xb8, 0x0f, 0x10, 0xf5, 0xb0, 0xbc, 0xa9, 0x61, 0x4c, 0x0f, - 0xf3, 0x0b, 0xe8, 0x00, 0xb1, 0xb2, 0xab, 0x83, 0x61, 0xba, 0x6b, 0x78, - 0xf7, 0x83, 0x8c, 0xe6, 0xf0, 0xf6, 0xf4, 0xba, 0x1c, 0x5d, 0xf3, 0x66, - 0x76, 0x97, 0x55, 0x1d, 0x35, 0x57, 0x35, 0x54, 0xfe, 0x7d, 0x1c, 0xe3, - 0xe9, 0xee, 0xa9, 0x46, 0x39, 0x33, 0x1f, 0xb5, 0xe9, 0xb9, 0x8d, 0x74, - 0x35, 0x98, 0x3f, 0x8b, 0x90, 0xf5, 0xc1, 0xf0, 0x31, 0xc7, 0xb7, 0x82, - 0x28, 0x19, 0xf0, 0x6d, 0x0e, 0x2a, 0x26, 0x6e, 0x37, 0x25, 0x4e, 0xb4, - 0x2c, 0x49, 0x3a, 0x5e, 0xb4, 0x39, 0x84, 0xbb, 0x44, 0xc3, 0x94, 0x77, - 0x43, 0x7a, 0x25, 0xff, 0x3e, 0xae, 0xa1, 0xdd, 0x95, 0x0c, 0x05, 0x34, - 0xdc, 0xbc, 0xf5, 0xb2, 0xc5, 0xa5, 0x7d, 0x18, 0x6d, 0xf3, 0x3d, 0xfb, - 0x72, 0x7c, 0xd0, 0xd6, 0x01, 0x05, 0x79, 0xda, 0xdd, 0xa4, 0xac, 0x18, - 0x9b, 0xeb, 0x0f, 0xac, 0xda, 0x15, 0x98, 0x2a, 0x94, 0x37, 0x91, 0x9f, - 0x68, 0xaa, 0x36, 0x95, 0x89, 0xcd, 0xef, 0xaa, 0x55, 0x86, 0x51, 0x98, - 0x1a, 0x00, 0xef, 0xf1, 0x54, 0xe8, 0xfe, 0x3a, 0x94, 0x70, 0x9a, 0xf7, - 0xc8, 0x4e, 0xc1, 0xc1, 0x9b, 0xf9, 0x87, 0x08, 0x7c, 0xd8, 0xaa, 0xe2, - 0xed, 0x56, 0x80, 0x51, 0x81, 0x3d, 0x8d, 0x1c, 0xfd, 0x46, 0x07, 0xc6, - 0xed, 0x20, 0xb7, 0xe1, 0x34, 0xa1, 0x5d, 0xc9, 0xc8, 0xe9, 0x94, 0xff, - 0x5a, 0x23, 0xcc, 0xae, 0x39, 0x31, 0x6e, 0x49, 0x41, 0xf2, 0x49, 0x43, - 0xb4, 0x68, 0xdc, 0x1d, 0x8e, 0xd6, 0x1e, 0x4a, 0xbe, 0xd2, 0x29, 0x9b, - 0x82, 0x2e, 0x5d, 0x40, 0x17, 0x8d, 0x37, 0xab, 0x4a, 0x76, 0x8c, 0x5f, - 0xa4, 0x1a, 0x9b, 0x7b, 0x37, 0x98, 0x62, 0xe3, 0x52, 0xc2, 0xcd, 0xc1, - 0x0c, 0xa2, 0xf8, 0x0f, 0x35, 0x7a, 0xc8, 0xc0, 0x59, 0x89, 0x8a, 0x06, - 0xc8, 0x57, 0x87, 0xfa, 0xa8, 0x90, 0x9e, 0x05, 0x7a, 0x65, 0xc8, 0x36, - 0x2c, 0x67, 0xbe, 0x80, 0xe8, 0xbb, 0xab, 0x85, 0xc8, 0x8a, 0x01, 0x7e, - 0xf1, 0xfc, 0xb8, 0x46, 0xf9, 0x48, 0xbc, 0xc2, 0x2e, 0x97, 0x77, 0x1c, - 0x25, 0x30, 0x1b, 0xdf, 0x5b, 0xe3, 0x76, 0xfc, 0x7d, 0x24, 0xc9, 0xb4, - 0xa4, 0x01, 0xda, 0xa0, 0x55, 0xf9, 0x09, 0x89, 0xbe, 0x62, 0x76, 0x0e, - 0x4b, 0x4a, 0x4b, 0xaf, 0x3e, 0xd6, 0x05, 0x25, 0xb2, 0x20, 0x54, 0xd4, - 0x0d, 0xa4, 0xe4, 0x9f, 0x03, 0x46, 0x35, 0xce, 0x79, 0x6f, 0x7e, 0x84, - 0x44, 0xc3, 0x94, 0x77, 0x45, 0x2e, 0x25, 0xff, 0x3e, 0xae, 0xa1, 0xc9, - 0x95, 0x0c, 0x0c, 0xc0, 0x21, 0xbb, 0x43, 0xdb, 0x18, 0x39, 0x54, 0x1b, - 0x4c, 0x61, 0xdf, 0xb2, 0x3c, 0x86, 0xe2, 0x20, 0x33, 0xfc, 0xe7, 0x77, - 0xba, 0x1e, 0xbe, 0xaa, 0x46, 0x80, 0x2b, 0xb4, 0xe7, 0x8f, 0x2b, 0x0a, - 0x9d, 0x49, 0x7b, 0x86, 0xa3, 0xe2, 0x0a, 0x5e, 0xda, 0xb4, 0x57, 0x33, - 0x69, 0xfe, 0x9a, 0x8e, 0x8e, 0x3b, 0xe3, 0x33, 0x20, 0x2a, 0x87, 0x0e, - 0x65, 0x1c, 0xb1, 0x0b, 0x00, 0x43, 0x5d, 0x36, 0xb3, 0x68, 0x54, 0x82, - 0xe4, 0x74, 0x8c, 0x66, 0x40, 0x11, 0x3e, 0x9e, 0xef, 0x43, 0x46, 0xf4, - 0x08, 0x8c, 0xbe, 0xac, 0x2a, 0x21, 0xf0, 0x56, 0xab, 0x2c, 0x66, 0xc3, - 0xa1, 0x4c, 0x7b, 0x3b, 0x09, 0xcb, 0xab, 0x3e, 0x69, 0x39, 0xad, 0x61, - 0x3b, 0x4a, 0x8d, 0xac, 0xb3, 0x36, 0x23, 0xf4, 0x6c, 0x31, 0x3f, 0xec, - 0x0c, 0xcb, 0x3e, 0x80, 0xef, 0x8f, 0x17, 0x6e, 0xcc, 0x91, 0x7f, 0xb5, - 0xcf, 0x7d, 0xac, 0x46, 0x1c, 0x46, 0x80, 0xbe, 0xa0, 0x0b, 0x55, 0x4d, - 0xa0, 0x1e, 0xec, 0x69, 0x3d, 0x86, 0x88, 0xe9, 0x03, 0xd1, 0x2e, 0x9a, - 0xcb, 0x28, 0xb8, 0x42, 0x10, 0x2c, 0x45, 0xf2, 0x14, 0x5e, 0xdb, 0xb0, - 0x5d, 0x00, 0x06, 0x9f, 0xa4, 0x22, 0x1e, 0x12, 0xca, 0x16, 0x5e, 0x43, - 0xc6, 0x95, 0x6b, 0xd3, 0x3c, 0x0d, 0xd7, 0xe1, 0x2a, 0xae, 0xb0, 0x69, - 0x18, 0x63, 0xa7, 0x8a, 0x40, 0xd7, 0x87, 0x3b, 0xf3, 0x5d, 0xa9, 0xab, - 0xf8, 0x0d, 0x30, 0xdc, 0x17, 0xb3, 0xe9, 0xd8, 0x94, 0x79, 0x7c, 0xe5, - 0xc9, 0xef, 0xa2, 0x86, 0xd4, 0xba, 0x5d, 0x1e, 0x56, 0xb5, 0x65, 0x37, - 0xf7, 0x01, 0x32, 0x16, 0xa8, 0x23, 0xef, 0x22, 0x09, 0xf3, 0x2d, 0x97, - 0xea, 0x61, 0x01, 0x14, 0xa8, 0xbb, 0x26, 0x30, 0xc1, 0x34, 0x27, 0xd1, - 0xed, 0x02, 0x84, 0x56, 0xea, 0x72, 0xfa, 0xcd, 0xdc, 0x65, 0x11, 0xe5, - 0xe8, 0xbf, 0xf4, 0x51, 0xed, 0xc2, 0xc6, 0x35, 0xd1, 0xad, 0xe1, 0xcc, - 0x6b, 0x99, 0xbe, 0x2f, 0x6e, 0x9e, 0xa5, 0x49, 0x49, 0x0d, 0x11, 0x15, - 0xfa, 0x52, 0x74, 0x58, 0xf9, 0x36, 0x91, 0x4d, 0x7c, 0x97, 0xae, 0x72, - 0x5c, 0x46, 0x09, 0x02, 0xa7, 0x54, 0xb5, 0x0e, 0x04, 0xa3, 0xd2, 0xac, - 0xdf, 0x58, 0xb6, 0x61, 0x84, 0xe5, 0x1a, 0xc9, 0x28, 0x93, 0xa0, 0xa8, - 0xdd, 0x87, 0xb0, 0x08, 0xff, 0x28, 0xa1, 0x01, 0x8f, 0x27, 0x52, 0x50, - 0x4b, 0x96, 0x94, 0x07, 0xea, 0x4d, 0xf5, 0x4a, 0x68, 0x17, 0x83, 0x6f, - 0x2b, 0x24, 0x9e, 0xb7, 0x40, 0xe7, 0x20, 0x4e, 0x78, 0x01, 0x10, 0xa7, - 0x27, 0x5a, 0x39, 0x86, 0xfe, 0x7f, 0xac, 0x37, 0xa6, 0xa9, 0xa1, 0xd9, - 0x00, 0x3e, 0x88, 0x31, 0xd2, 0x9b, 0x7b, 0x53, 0x29, 0xfd, 0x54, 0x0f, - 0x0e, 0xc5, 0x8f, 0xb0, 0x26, 0x2e, 0xb0, 0x88, 0x2b, 0x41, 0x9a, 0x8c, - 0xd8, 0xf9, 0x38, 0x3a, 0xc3, 0x72, 0x9b, 0x00, 0xc3, 0x14, 0x0c, 0xb3, - 0xb6, 0xcb, 0xba, 0xeb, 0x98, 0xcc, 0xed, 0x52, 0x49, 0xb6, 0xa8, 0x69, - 0xc9, 0x59, 0xb1, 0xa9, 0xac, 0xd3, 0xf0, 0xb9, 0x6e, 0xcc, 0x01, 0xff, - 0xbe, 0x0c, 0x07, 0x8a, 0xf6, 0x2f, 0x69, 0x6f, 0xf6, 0x77, 0x05, 0x6c, - 0xb7, 0xff, 0xa0, 0x9c, 0xb9, 0x1f, 0x20, 0xc7, 0x5d, 0x11, 0xc3, 0x50, - 0x1e, 0x73, 0x56, 0xde, 0x27, 0x7e, 0x27, 0xf7, 0xe3, 0x02, 0xd1, 0xc5, - 0x5c, 0xd5, 0x10, 0xfb, 0x5b, 0x5d, 0xab, 0xbc, 0x8e, 0xbb, 0xdf, 0xef, - 0xc2, 0xce, 0x6b, 0x2c, 0xe9, 0x27, 0x76, 0x48, 0x69, 0xf7, 0xd3, 0x8f, - 0xc0, 0x4b, 0xe6, 0xe5, 0x71, 0xfd, 0xa7, 0x5d, 0x96, 0xab, 0x6f, 0x42, - 0xd3, 0x5f, 0xa8, 0x41, 0x8c, 0x23, 0x1b, 0xa4, 0xbe, 0x44, 0x75, 0xe6, - 0x82, 0xfe, 0xfd, 0x25, 0xb5, 0xac, 0x37, 0xc8, 0xf9, 0xa3, 0x77, 0x08, - 0x03, 0xb0, 0x4c, 0xe5, 0x3f, 0x25, 0x15, 0xde, 0xc3, 0xd3, 0x4e, 0x02, - 0xe3, 0x91, 0x8c, 0x62, 0x4d, 0xbc, 0x02, 0x88, 0x80, 0x9a, 0xdf, 0x48, - 0x74, 0xd9, 0x1a, 0xaf, 0x9b, 0x41, 0x34, 0x04, 0xef, 0x5b, 0x54, 0xc6, - 0xe9, 0xf7, 0x9c, 0x85, 0xfd, 0xa7, 0x3d, 0x48, 0x91, 0x56, 0x67, 0xf4, - 0x10, 0x97, 0xdc, 0x24, 0xd1, 0xed, 0x2f, 0x8b, 0x9a, 0x26, 0xb3, 0x3e, - 0x15, 0x4a, 0xa2, 0x58, 0x79, 0x1a, 0x82, 0x71, 0x1c, 0xa2, 0xda, 0x02, - 0x95, 0x78, 0xfe, 0xd2, 0x2d, 0xfb, 0x3b, 0x58, 0xe5, 0x41, 0x16, 0x64, - 0xeb, 0x5a, 0x16, 0x51, 0x68, 0x7d, 0x97, 0xfd, 0x9b, 0x5d, 0x49, 0xff, - 0xef, 0xd6, 0xbf, 0x20, 0x1c, 0x13, 0x7d, 0xb8, 0x35, 0x98, 0x4c, 0x8b, - 0xc7, 0x21, 0x85, 0xbe, 0x28, 0x07, 0xc4, 0x13, 0x4c, 0xcb, 0x53, 0xa1, - 0x92, 0x23, 0x5f, 0x62, 0x02, 0x14, 0xcb, 0x70, 0x0e, 0x69, 0x43, 0xc2, - 0xf0, 0xe1, 0x66, 0xa2, 0xe3, 0x87, 0x51, 0xa0, 0x5e, 0x10, 0xb8, 0x96, - 0xa7, 0xe7, 0xbd, 0x5d, 0x91, 0xa3, 0x5a, 0x21, 0x46, 0xed, 0x58, 0xa4, - 0xd0, 0x74, 0xe8, 0xc5, 0xfa, 0xec, 0x83, 0x63, 0xcf, 0x49, 0x71, 0xdb, - 0xf6, 0xb5, 0x5c, 0xd7, 0x8e, 0xa0, 0x6b, 0xbe, 0x81, 0x83, 0xd7, 0x6b, - 0xdc, 0x08, 0x2b, 0x38, 0x18, 0xfe, 0x53, 0x9f, 0xb8, 0x1b, 0x76, 0x73, - 0x76, 0x03, 0x76, 0x74, 0xa5, 0x27, 0xae, 0xbf, 0xcd, 0x41, 0xf8, 0xa0, - 0x2e, 0x27, 0x17, 0xfa, 0x8c, 0x26, 0x3a, 0xf5, 0x9e, 0x1f, 0x2f, 0xd9, - 0x5b, 0x4c, 0xb6, 0x4c, 0x95, 0xbd, 0xfa, 0x5f, 0xa3, 0x78, 0xc6, 0xb5, - 0xb2, 0xf7, 0x22, 0x55, 0xb4, 0x32, 0x88, 0x2c, 0xc4, 0xfd, 0xf9, 0x68, - 0xbb, 0x23, 0x33, 0x74, 0x67, 0x8c, 0x48, 0xe9, 0x24, 0x70, 0x24, 0x96, - 0xaf, 0x5e, 0x41, 0x93, 0xf3, 0xd0, 0xef, 0x4d, 0xb5, 0xcb, 0xc0, 0x25, - 0x5b, 0x30, 0x6a, 0x56, 0xf0, 0x4c, 0x96, 0x5a, 0x16, 0xe6, 0x36, 0xb4, - 0xbc, 0x5c, 0x1e, 0x3c, 0x44, 0x76, 0x17, 0x30, 0xa8, 0x08, 0xec, 0x88, - 0xcb, 0xb8, 0x98, 0x76, 0x1f, 0xf2, 0x42, 0x51, 0xe7, 0xc5, 0x06, 0x8b, - 0x13, 0x58, 0x96, 0x73, 0x7e, 0xe7, 0x42, 0xb8, 0xe2, 0xb0, 0xf2, 0xac, - 0xef, 0xc3, 0x95, 0x85, 0x4d, 0x00, 0x81, 0x3a, 0x39, 0xaa, 0x64, 0x4f, - 0xe3, 0xc6, 0x1f, 0x1b, 0xae, 0x87, 0xa3, 0x2d, 0x22, 0x6c, 0xa4, 0x39, - 0xb0, 0xc7, 0x37, 0xc1, 0xb3, 0x32, 0xef, 0x9e, 0xb0, 0xaa, 0xd0, 0xbd, - 0x50, 0xa5, 0x27, 0x0a, 0xd6, 0x3f, 0x5a, 0x94, 0x2a, 0xec, 0xfc, 0xb7, - 0x47, 0xb5, 0xd2, 0xe2, 0xe5, 0xff, 0x96, 0x9d, 0x2f, 0x08, 0x38, 0x06, - 0x7e, 0xc5, 0xfb, 0x6d, 0xc9, 0x2d, 0x7c, 0x54, 0x25, 0x04, 0xdd, 0xc2, - 0xa6, 0x1e, 0x5d, 0x7e, 0xbe, 0x17, 0x6c, 0xda, 0x68, 0x6d, 0x44, 0x98, - 0x32, 0xcd, 0x45, 0x87, 0x6d, 0xc3, 0xf5, 0x9b, 0xf6, 0xd6, 0x56, 0x77, - 0x78, 0xa6, 0xc0, 0x83, 0x99, 0x68, 0x25, 0xbe, 0xf9, 0xad, 0x4e, 0x35, - 0x6a, 0x4e, 0x96, 0x3b, 0x6c, 0x96, 0xba, 0x43, 0xa4, 0x37, 0x2b, 0x2a, - 0x49, 0xb5, 0x99, 0x87, 0x98, 0x33, 0x80, 0x5d, 0x13, 0xc8, 0x8e, 0xf5, - 0x9f, 0x18, 0x34, 0xbd, 0xae, 0xe9, 0x56, 0xed, 0x72, 0xcf, 0x81, 0xc8, - 0x1d, 0xc6, 0xe0, 0x23, 0x7f, 0xe4, 0x9e, 0x1f, 0xfd, 0x65, 0x15, 0x04, - 0xf4, 0x6c, 0xcd, 0xf1, 0xe6, 0xee, 0xa1, 0xbb, 0xa0, 0x78, 0xe5, 0x06, - 0xcc, 0x34, 0x7b, 0xf2, 0x45, 0x3c, 0xad, 0x5f, 0x7c, 0xf5, 0x81, 0x71, - 0x80, 0x84, 0xe8, 0x9b, 0x6b, 0x25, 0x48, 0xb4, 0x93, 0xa5, 0x44, 0xad, - 0xe6, 0xff, 0xe2, 0xe7, 0x3b, 0xcd, 0xeb, 0xc3, 0xf0, 0xef, 0x6d, 0x0d, - 0x98, 0x27, 0x21, 0xc9, 0x7f, 0xa2, 0x9f, 0x75, 0x27, 0x5b, 0x26, 0xbc, - 0xa2, 0x50, 0xb0, 0x95, 0x39, 0xa1, 0x6f, 0x71, 0x8d, 0xf5, 0xa9, 0x7a, - 0x9c, 0x7e, 0xe3, 0xca, 0x6c, 0x23, 0xb2, 0xa2, 0x66, 0x97, 0x00, 0x9f, - 0xba, 0x57, 0x0d, 0xf8, 0x53, 0x1f, 0x42, 0x53, 0x9a, 0xfb, 0x0e, 0xa5, - 0x72, 0x60, 0xe0, 0xf2, 0x71, 0x4a, 0x42, 0x2a, 0xbc, 0x2f, 0xc4, 0x0b, - 0xf1, 0x93, 0xc5, 0xeb, 0x64, 0x7f, 0xf4, 0x25, 0x39, 0xac, 0xc8, 0xc0, - 0x9e, 0x5a, 0x66, 0x50, 0x43, 0x82, 0xf3, 0xaf, 0xe1, 0x42, 0xd8, 0x35, - 0xb6, 0x87, 0xb2, 0xb7, 0x89, 0x68, 0x35, 0x81, 0x44, 0x1f, 0x2b, 0x9b, - 0xd0, 0x00, 0xa8, 0xee, 0xd7, 0x81, 0x4e, 0xf2, 0xa8, 0x64, 0xe6, 0xfc, - 0x34, 0x2b, 0xeb, 0x1d, 0x08, 0x85, 0x7c, 0xe9, 0xed, 0x8e, 0x80, 0x85, - 0x86, 0xe7, 0x6c, 0xa4, 0x23, 0x66, 0xf5, 0x66, 0x0c, 0x92, 0x89, 0x27, - 0x7b, 0xd7, 0x4c, 0x8d, 0xc8, 0x05, 0x74, 0x1e, 0xc7, 0xa5, 0x9e, 0xc2, - 0xaf, 0x0e, 0x99, 0x1e, 0x91, 0xf3, 0x4b, 0x21, 0x50, 0xfa, 0x1b, 0x27, - 0x52, 0x83, 0xb1, 0x3d, 0xa8, 0x97, 0xdb, 0x6e, 0x02, 0xa2, 0x36, 0x84, - 0x90, 0xee, 0xac, 0xaa, 0x5f, 0x56, 0x02, 0xc4, 0x22, 0x4d, 0x42, 0x81, - 0xc5, 0x9c, 0xc0, 0xee, 0xb8, 0x01, 0xc2, 0x3f, 0xa5, 0xd0, 0x96, 0x88, - 0x44, 0xf2, 0x90, 0x4b, 0xdf, 0xa2, 0xae, 0xaf, 0x38, 0xfc, 0x62, 0x1e, - 0xd2, 0xbc, 0xe3, 0x03, 0x90, 0xd5, 0xef, 0x9f, 0xbc, 0x2f, 0x3e, 0x59, - 0xf1, 0x8c, 0x0c, 0x5e, 0x89, 0x75, 0x50, 0x53, 0x83, 0x53, 0x3d, 0x39, - 0xa4, 0x6e, 0xdb, 0xac, 0x77, 0x1b, 0x74, 0x08, 0xad, 0x03, 0xb7, 0x35, - 0x13, 0x81, 0x2f, 0x84, 0x8d, 0xff, 0xeb, 0xdf, 0x32, 0x00, 0xbf, 0xd7, - 0xf8, 0x23, 0xbd, 0x88, 0xeb, 0xa5, 0x38, 0xf6, 0x54, 0xbe, 0x90, 0xe6, - 0x99, 0x8e, 0xf3, 0x1c, 0xe0, 0x2a, 0x49, 0x5a, 0x50, 0x8d, 0xd2, 0xa4, - 0x97, 0x90, 0x98, 0x12, 0x5e, 0x50, 0x4e, 0x9f, 0x8d, 0x9e, 0x17, 0x1c, - 0x0a, 0xd4, 0x0d, 0x16, 0xe7, 0x2e, 0x37, 0xd8, 0x0e, 0x37, 0x4c, 0xaf, - 0x12, 0xe0, 0x5c, 0x3b, 0x4c, 0x77, 0x62, 0xa2, 0x9a, 0x16, 0x40, 0xf6, - 0xf2, 0x25, 0xe4, 0x54, 0xd8, 0x08, 0x9c, 0xc0, 0x9e, 0x0e, 0x97, 0x9c, - 0x56, 0x3f, 0x16, 0x91, 0xf1, 0x5c, 0x98, 0x26, 0x6c, 0x21, 0xae, 0xd0, - 0x9f, 0xee, 0x88, 0xce, 0xaf, 0xc5, 0xe0, 0x43, 0xbc, 0x37, 0x74, 0x1b, - 0xde, 0xfa, 0xf8, 0x9b, 0x90, 0xf8, 0xe6, 0xf1, 0xf0, 0xdc, 0x45, 0xba, - 0x0f, 0xae, 0xc1, 0xe7, 0xe6, 0xbc, 0xe3, 0x0c, 0x10, 0x9a, 0x64, 0xcc, - 0xe2, 0x1d, 0x59, 0xb0, 0x27, 0x6b, 0xe9, 0x05, 0x63, 0xa8, 0x88, 0x3e, - 0x72, 0x3a, 0x38, 0x07, 0x75, 0xa1, 0x6c, 0x13, 0x9e, 0x36, 0x10, 0x15, - 0x75, 0xd6, 0xe8, 0x76, 0x9b, 0x89, 0x58, 0x66, 0xa1, 0x02, 0x71, 0xe4, - 0x7d, 0xa5, 0x7f, 0x6f, 0xdb, 0x4e, 0x8a, 0xc0, 0x96, 0x32, 0x66, 0x80, - 0x36, 0x02, 0xf9, 0x00, 0x12, 0x88, 0x13, 0x94, 0x89, 0xc5, 0x61, 0x96, - 0x35, 0x9a, 0x60, 0xd7, 0x4d, 0xcf, 0x7a, 0x93, 0xa2, 0xef, 0x3f, 0x72, - 0x7a, 0x81, 0x15, 0x31, 0x8a, 0x7a, 0x82, 0xdc, 0xa5, 0x60, 0x38, 0x2b, - 0xc1, 0x70, 0x21, 0xfd, 0xbe, 0x4b, 0x3f, 0x8d, 0xc3, 0xc3, 0x11, 0x19, - 0x5f, 0x06, 0x50, 0x37, 0x75, 0x60, 0x83, 0xc6, 0x09, 0xff, 0x8e, 0x0d, - 0x35, 0xd6, 0x19, 0x93, 0x63, 0xd8, 0xc7, 0x6a, 0x22, 0x7c, 0x78, 0x8d, - 0xf9, 0xa2, 0xb9, 0x5f, 0xea, 0x93, 0xf7, 0xf1, 0x12, 0x75, 0xf9, 0xf9, - 0xfe, 0x0f, 0x1d, 0xd2, 0xa2, 0xa4, 0xb8, 0x90, 0xb5, 0x9d, 0xa5, 0x0e, - 0xc2, 0x14, 0x6c, 0x17, 0x88, 0x13, 0xfd, 0xfa, 0x97, 0x6a, 0xc6, 0x32, - 0x1d, 0x18, 0xb3, 0xbb, 0xf1, 0x56, 0xb8, 0x16, 0xfa, 0x49, 0xf5, 0x9d, - 0x64, 0xa0, 0x93, 0x08, 0x33, 0x97, 0xd1, 0xb0, 0xbd, 0x96, 0x00, 0x34, - 0xd8, 0x71, 0xfe, 0x22, 0x69, 0x9f, 0x01, 0x13, 0xa6, 0x73, 0x8a, 0xa1, - 0x5d, 0xbc, 0xc5, 0xea, 0xb1, 0x5b, 0x94, 0x43, 0x11, 0xfa, 0x56, 0x10, - 0xc7, 0x81, 0xf7, 0x8e, 0xcc, 0x52, 0x59, 0xb3, 0x39, 0x9d, 0xec, 0x09, - 0xaf, 0xdf, 0x03, 0x73, 0xeb, 0x00, 0x15, 0xf0, 0x5f, 0x8c, 0x84, 0x30, - 0x07, 0x94, 0x17, 0x02, 0x91, 0x3c, 0x06, 0xe1, 0xa5, 0x29, 0x30, 0xd2, - 0xc2, 0x83, 0x70, 0x5a, 0x04, 0x59, 0x89, 0xbc, 0xa1, 0x26, 0xa5, 0x24, - 0x2c, 0xdb, 0xc5, 0xaa, 0x41, 0x54, 0xb9, 0x70, 0x7e, 0x76, 0x44, 0x9d, - 0x15, 0x4f, 0xc9, 0xbf, 0xc8, 0x43, 0xe8, 0x3b, 0xf3, 0x6b, 0x06, 0x36, - 0xfc, 0x93, 0x24, 0xa8, 0x7a, 0xfe, 0x58, 0x75, 0x93, 0x81, 0x79, 0x82, - 0x98, 0x46, 0x08, 0x95, 0xc7, 0x49, 0x84, 0xf7, 0x90, 0xf6, 0xd5, 0x17, - 0x52, 0x85, 0x03, 0xd2, 0x7d, 0xe3, 0x61, 0xd3, 0x73, 0xe0, 0x08, 0x87, - 0x7f, 0x8b, 0x78, 0x84, 0x2f, 0x8b, 0x8c, 0x40, 0x9b, 0xbb, 0x5b, 0xe4, - 0x2c, 0xff, 0xd0, 0x32, 0xf7, 0x34, 0x20, 0xdd, 0x9c, 0xc4, 0x2e, 0xbd, - 0x0c, 0xb7, 0x40, 0x04, 0x35, 0xbe, 0x5b, 0x33, 0x29, 0x92, 0x9b, 0x74, - 0x32, 0x2c, 0xed, 0xf9, 0x34, 0x9f, 0xc8, 0x9b, 0xbe, 0x5c, 0x14, 0x9d, - 0x39, 0x80, 0x15, 0xa7, 0x7d, 0x09, 0x8c, 0xa5, 0x57, 0x30, 0xfd, 0xb4, - 0x96, 0xf9, 0xef, 0xf6, 0xba, 0xa5, 0x36, 0xe7, 0x8c, 0x1a, 0x74, 0xec, - 0xce, 0xcb, 0x75, 0x7a, 0x4a, 0xd6, 0xf0, 0x21, 0xb6, 0xc2, 0xd5, 0x41, - 0xc7, 0x02, 0xd0, 0xd4, 0xb6, 0x24, 0x5e, 0x65, 0x89, 0xbe, 0x98, 0x50, - 0x2f, 0x9b, 0x9b, 0x5f, 0x5a, 0x21, 0x6a, 0x56, 0xcb, 0x39, 0xf7, 0x5d, - 0xf0, 0x2b, 0x7e, 0x5c, 0x7d, 0x8f, 0x3a, 0x8a, 0x1d, 0xe3, 0xa2, 0x2f, - 0xd3, 0xb4, 0x82, 0x72, 0x19, 0x11, 0xb8, 0xee, 0xe7, 0x9c, 0x36, 0x73, - 0x82, 0x7d, 0xcb, 0x42, 0x40, 0x49, 0x16, 0x47, 0xb6, 0xe2, 0x43, 0x77, - 0xf9, 0x9e, 0xc3, 0xfd, 0xbf, 0xda, 0xe9, 0x6c, 0x55, 0xef, 0xc6, 0x37, - 0x25, 0xe7, 0x45, 0x08, 0xbc, 0x0a, 0xc1, 0xcf, 0x3e, 0xf7, 0xdd, 0xf7, - 0x94, 0x4d, 0xd3, 0x7f, 0x40, 0x45, 0x7b, 0xf5, 0x9b, 0x98, 0x07, 0x34, - 0x01, 0xca, 0xe6, 0xf7, 0x09, 0xc2, 0x43, 0x92, 0x5f, 0xa0, 0x5d, 0xbc, - 0xe1, 0xf9, 0xbb, 0x65, 0x40, 0x20, 0xd0, 0xa4, 0xff, 0x25, 0x42, 0xb6, - 0x17, 0x54, 0x2a, 0xdb, 0xb7, 0xf3, 0xd3, 0x20, 0x17, 0xeb, 0x0e, 0xec, - 0xe8, 0x0c, 0x89, 0xf5, 0xcc, 0x04, 0x46, 0x44, 0x65, 0x39, 0x58, 0x16, - 0x16, 0x15, 0x86, 0x7d, 0x59, 0x30, 0xd3, 0x1a, 0xfd, 0x52, 0x63, 0x44, - 0xd6, 0x70, 0x25, 0xc2, 0xe5, 0xb8, 0xb9, 0x44, 0x7b, 0x9d, 0x7f, 0x61, - 0x70, 0x32, 0x0f, 0xbe, 0xc9, 0xdb, 0x9f, 0xff, 0x58, 0x32, 0x62, 0x3f, - 0x0f, 0x2f, 0x5a, 0x29, 0x55, 0xa3, 0x53, 0xc8, 0x34, 0x39, 0x68, 0x58, - 0xff, 0x10, 0xa9, 0x7b, 0x13, 0xe6, 0x4a, 0x31, 0xfe, 0x91, 0x70, 0x09, - 0x22, 0x6f, 0x94, 0x8e, 0xe6, 0x7d, 0xc9, 0x16, 0x3e, 0x2c, 0x15, 0x43, - 0xae, 0x71, 0xbb, 0x30, 0x1b, 0x9b, 0x50, 0xc9, 0x6d, 0xeb, 0x92, 0xea, - 0x5b, 0xde, 0xf5, 0xf8, 0x80, 0x11, 0x56, 0x64, 0x5d, 0xf6, 0xce, 0xcc, - 0x80, 0xbb, 0xa8, 0xb7, 0x04, 0x46, 0x6f, 0xbc, 0xb4, 0x81, 0xc5, 0x61, - 0x0e, 0xc0, 0x3e, 0x58, 0x29, 0x5b, 0x44, 0xf6, 0xcb, 0x9b, 0x3c, 0x71, - 0x61, 0x8d, 0xbb, 0x84, 0x87, 0x59, 0xc4, 0x00, 0x8e, 0xd6, 0xb6, 0x47, - 0x99, 0xbc, 0x7f, 0x54, 0x98, 0x8a, 0xaa, 0x48, 0x0d, 0x20, 0x19, 0x87, - 0x7b, 0x96, 0x6e, 0xf7, 0xc2, 0xcb, 0x9f, 0x75, 0x70, 0x46, 0x2f, 0x0a, - 0x05, 0x69, 0xba, 0x85, 0xe0, 0xc1, 0xb2, 0x75, 0x37, 0x16, 0x29, 0x4b, - 0xf5, 0x73, 0xb4, 0x50, 0x79, 0x82, 0xf4, 0x4a, 0x04, 0x4c, 0x54, 0x9b, - 0x31, 0x83, 0x3c, 0x59, 0x3b, 0xcc, 0x77, 0xfb, 0x66, 0x51, 0x8a, 0x38, - 0x4d, 0x55, 0x66, 0x23, 0x39, 0xe7, 0x40, 0x11, 0xb8, 0x7e, 0x9d, 0xe7, - 0x6e, 0x53, 0xc8, 0x4d, 0x37, 0xfe, 0xd6, 0xba, 0x29, 0x1f, 0x7d, 0x00, - 0x3b, 0x1d, 0xc2, 0x6d, 0x29, 0xbc, 0xec, 0x04, 0x5c, 0x01, 0xa1, 0x66, - 0xb4, 0x03, 0xa6, 0x2e, 0x4e, 0x73, 0x26, 0xa8, 0xfe, 0x1b, 0x15, 0x80, - 0x5b, 0x2c, 0x42, 0x57, 0x4b, 0xda, 0xaa, 0x51, 0x1f, 0x35, 0xcc, 0x78, - 0x23, 0xc0, 0x4b, 0x2d, 0x1f, 0xe0, 0x91, 0xaa, 0x12, 0xe2, 0xdf, 0x52, - 0xf2, 0xbc, 0x19, 0xd9, 0x85, 0x9d, 0x57, 0x0d, 0xce, 0x31, 0xae, 0x2e, - 0x80, 0x49, 0x8f, 0x72, 0x70, 0x91, 0x9c, 0x13, 0x42, 0xb0, 0x19, 0xb6, - 0xfc, 0x0c, 0x4a, 0x63, 0x5d, 0x6a, 0x35, 0xb8, 0xea, 0xc0, 0x56, 0xfe, - 0xc1, 0x24, 0x3b, 0x0a, 0x98, 0x62, 0x46, 0x99, 0x97, 0xdf, 0x31, 0x6d, - 0x58, 0x20, 0xa0, 0x03, 0xc0, 0xb8, 0xdf, 0x1e, 0x28, 0x48, 0xb6, 0x64, - 0x88, 0x1f, 0xc3, 0x6a, 0x41, 0x31, 0x7d, 0x88, 0xa8, 0xfa, 0xdc, 0x06, - 0xcd, 0x7e, 0x4c, 0x46, 0x59, 0xe5, 0x60, 0x44, 0x2c, 0xae, 0xc0, 0x00, - 0xd6, 0x08, 0xf3, 0xab, 0x90, 0xa5, 0x04, 0x7e, 0xdc, 0x92, 0xae, 0x81, - 0x2c, 0xc0, 0xa2, 0x1d, 0x3f, 0x83, 0x63, 0x1a, 0xb5, 0xac, 0x10, 0xc1, - 0xbb, 0x95, 0x02, 0x5e, 0x98, 0x32, 0xee, 0xd6, 0x72, 0xef, 0x95, 0x22, - 0x29, 0x62, 0xcf, 0x12, 0x7b, 0x8e, 0xed, 0x71, 0x56, 0xcc, 0xc9, 0xb5, - 0x38, 0x4e, 0x10, 0x2f, 0x52, 0x0d, 0xf3, 0x73, 0xee, 0x60, 0xc4, 0xa4, - 0xef, 0xbe, 0x4b, 0x5d, 0x3f, 0xa0, 0x7d, 0xbe, 0xb5, 0xe4, 0x5a, 0xe1, - 0xd5, 0xef, 0xff, 0xe2, 0xe4, 0x64, 0xd3, 0xd9, 0xa8, 0x40, 0x20, 0xf9, - 0xe7, 0xd8, 0x6c, 0x94, 0xaf, 0xfc, 0xa3, 0xde, 0xae, 0x72, 0x33, 0x0f, - 0xe5, 0xbe, 0xec, 0xf1, 0xaf, 0x80, 0xcb, 0x55, 0x4d, 0xc0, 0x44, 0xb7, - 0x4d, 0x49, 0x88, 0x66, 0x83, 0x58, 0xc7, 0x2f, 0x69, 0xa9, 0xb5, 0x84, - 0xfc, 0x0b, 0x08, 0xd2, 0xb1, 0x55, 0x3d, 0x73, 0xda, 0x77, 0xa0, 0x49, - 0x05, 0x82, 0xd3, 0x30, 0x83, 0x4a, 0x84, 0xf5, 0x44, 0x84, 0xbc, 0x2c, - 0xc9, 0xa5, 0xd8, 0x5c, 0x4d, 0xf4, 0x98, 0x99, 0x8c, 0x66, 0xa2, 0xc4, - 0x15, 0xd0, 0x85, 0xab, 0x7b, 0x77, 0x40, 0xc0, 0x07, 0xf2, 0x62, 0x68, - 0x69, 0xf0, 0x89, 0x66, 0x86, 0x6c, 0x62, 0xcf, 0xda, 0x58, 0xfc, 0x17, - 0xb1, 0xc9, 0x13, 0x38, 0x86, 0xd2, 0xe6, 0x0b, 0x1c, 0x45, 0x52, 0x39, - 0x6f, 0x27, 0x6b, 0x68, 0x44, 0x1e, 0x9d, 0xe9, 0x98, 0xa2, 0x2a, 0x95, - 0xa2, 0x18, 0x89, 0xd8, 0x33, 0xd2, 0xeb, 0x21, 0xbe, 0x72, 0xe3, 0xf5, - 0x4c, 0x25, 0xf7, 0x8d, 0x7c, 0x82, 0x85, 0x10, 0xa0, 0xf5, 0x56, 0xdd, - 0xa3, 0x6f, 0xfe, 0x36, 0x00, 0x8c, 0x15, 0x32, 0x65, 0xa8, 0xd8, 0x80, - 0xe6, 0xf7, 0x83, 0xf6, 0xa6, 0xed, 0x2b, 0xee, 0x20, 0x03, 0x3c, 0xe2, - 0x3e, 0xbd, 0xf5, 0xb8, 0x83, 0x4d, 0xae, 0xed, 0xf4, 0xa8, 0x02, 0x7e, - 0x6a, 0xb2, 0x25, 0xaf, 0x7f, 0x46, 0x98, 0x01, 0xf0, 0x31, 0x7c, 0x82, - 0xaa, 0x96, 0xde, 0x36, 0x45, 0x59, 0x8d, 0x82, 0x40, 0xb1, 0x03, 0x2c, - 0x7f, 0x75, 0x2c, 0xbe, 0xdc, 0x97, 0x3a, 0xf7, 0x06, 0xaf, 0x20, 0x19, - 0x98, 0x8e, 0xe4, 0x43, 0xa6, 0x40, 0xf3, 0xad, 0xa7, 0x65, 0x4f, 0x7f, - 0xc7, 0x50, 0xa4, 0x74, 0x35, 0x1b, 0x78, 0xe0, 0x01, 0xb8, 0x27, 0x14, - 0x38, 0x46, 0x2f, 0xf6, 0x83, 0xfa, 0x57, 0x29, 0x94, 0xc0, 0xb1, 0xe4, - 0xed, 0xaa, 0xa2, 0x43, 0xdc, 0x6a, 0xf3, 0xa1, 0xec, 0xe9, 0xe6, 0x21, - 0x25, 0x05, 0x3d, 0x26, 0x82, 0xac, 0xad, 0x5c, 0xa9, 0xf8, 0x90, 0xec, - 0x6f, 0xb4, 0x92, 0x65, 0x01, 0x72, 0xf3, 0x28, 0x21, 0x16, 0xb5, 0xbe, - 0x9d, 0x69, 0xbb, 0xb2, 0x10, 0x87, 0x17, 0x78, 0x9c, 0x1d, 0x8a, 0x59, - 0x33, 0x17, 0xf7, 0xcc, 0xa8, 0xe1, 0x6a, 0x19, 0x62, 0xe9, 0x92, 0x41, - 0xda, 0x11, 0xb1, 0xff, 0xb4, 0x9b, 0x5b, 0x56, 0x90, 0x19, 0xa8, 0x3d, - 0x96, 0x97, 0xc8, 0xfc, 0x81, 0x55, 0x20, 0x02, 0x6d, 0x7e, 0x9e, 0x1b, - 0xf6, 0x91, 0x49, 0x08, 0x32, 0x0c, 0x7e, 0x0d, 0x0c, 0x8f, 0xce, 0x2b, - 0x8b, 0x35, 0x34, 0x85, 0xc3, 0x7c, 0x96, 0x02, 0x55, 0xe9, 0x9e, 0x7e, - 0xf7, 0xaf, 0x67, 0x3a, 0x3e, 0xbb, 0xfb, 0x1e, 0x86, 0x64, 0xe8, 0x4d, - 0x2b, 0x80, 0x44, 0xed, 0x98, 0x38, 0xe9, 0xeb, 0xa5, 0x5c, 0x9d, 0x2f, - 0x11, 0x01, 0x7d, 0xa5, 0x7f, 0xdf, 0xc4, 0xe6, 0x99, 0x9f, 0x2e, 0x30, - 0x5f, 0x4d, 0x6a, 0x42, 0xe1, 0x4c, 0x76, 0x9d, 0x39, 0x1a, 0x23, 0xae, - 0x3d, 0xa7, 0xf7, 0x08, 0x4a, 0x98, 0x90, 0x18, 0xfb, 0xd9, 0xdf, 0xf3, - 0x22, 0x8d, 0x4f, 0x68, 0x1f, 0xa1, 0x4f, 0x5b, 0xce, 0xf7, 0x1c, 0xd6, - 0xff, 0x43, 0x8d, 0x5f, 0x4e, 0xa7, 0x59, 0x61, 0xc2, 0xb6, 0x3a, 0xf0, - 0x19, 0xcd, 0x61, 0x28, 0x1b, 0x05, 0x5e, 0x6a, 0x3b, 0x6e, 0x62, 0x55, - 0xac, 0xfa, 0xc2, 0x94, 0x00, 0x27, 0x78, 0x90, 0x17, 0x83, 0xb0, 0xd5, - 0xfa, 0x0b, 0x88, 0x5f, 0x2e, 0xf0, 0x93, 0x80, 0xf9, 0x2f, 0xee, 0xb7, - 0xdc, 0xcd, 0xe5, 0xde, 0x11, 0xd6, 0xdb, 0x49, 0xa4, 0x68, 0x4e, 0xdd, - 0x7d, 0xbf, 0x5a, 0x52, 0x4a, 0xc6, 0x5c, 0x8e, 0xd1, 0x60, 0xf9, 0xb8, - 0xfd, 0xf1, 0x6a, 0x04, 0x66, 0x25, 0xa9, 0xe3, 0xc3, 0xcb, 0x99, 0x2f, - 0xa0, 0x47, 0x71, 0xa0, 0x00, 0xc3, 0x6c, 0xfe, 0xbb, 0xa2, 0xc6, 0x25, - 0x37, 0xc0, 0x7d, 0x69, 0x5a, 0x79, 0xa7, 0xef, 0xba, 0xde, 0x9b, 0xa1, - 0x43, 0x76, 0xb0, 0x01, 0x42, 0x81, 0x65, 0x3b, 0x36, 0x2f, 0x6f, 0xf7, - 0x89, 0x68, 0x09, 0x4c, 0xa7, 0x00, 0x21, 0xaa, 0xa4, 0xfe, 0x96, 0xd1, - 0xf2, 0x81, 0x58, 0x6c, 0xd5, 0x87, 0xa6, 0x5a, 0x94, 0x97, 0x71, 0x7f, - 0xef, 0xe0, 0xbf, 0x4d, 0x85, 0x92, 0x7f, 0x9c, 0x60, 0xf2, 0x09, 0x45, - 0xde, 0x79, 0x1d, 0x62, 0x32, 0x2c, 0x6f, 0x7e, 0xac, 0x75, 0xfd, 0xb0, - 0x8d, 0x22, 0xb0, 0x25, 0xb3, 0xf9, 0xd1, 0x72, 0xcb, 0x97, 0xbb, 0x69, - 0x36, 0xb9, 0xc6, 0x93, 0x80, 0x7d, 0x01, 0xb2, 0xdb, 0x3d, 0xbf, 0x29, - 0x70, 0x12, 0x93, 0xe0, 0xf1, 0x5b, 0x41, 0x11, 0xc4, 0x9b, 0xd6, 0x93, - 0x70, 0xa7, 0x5e, 0x28, 0xea, 0x1a, 0xa8, 0x9a, 0xc4, 0x3e, 0xb6, 0xee, - 0x2f, 0x57, 0xc5, 0xb0, 0x77, 0xf9, 0x1b, 0xa0, 0xd5, 0xd4, 0xa5, 0x5e, - 0xb1, 0xdc, 0x4b, 0xc0, 0x37, 0xac, 0xbb, 0x0e, 0xe1, 0x02, 0x0b, 0xa6, - 0x69, 0x3b, 0x85, 0xa7, 0x19, 0x8b, 0x0c, 0x5b, 0x4f, 0x8e, 0xf4, 0x02, - 0xcb, 0x05, 0xff, 0x34, 0x64, 0x0a, 0x50, 0x7f, 0xcc, 0x15, 0x88, 0xd6, - 0x40, 0xc4, 0x19, 0x02, 0x9b, 0x2b, 0xea, 0x0f, 0xfb, 0xf8, 0x2e, 0x70, - 0xba, 0x87, 0x07, 0x5a, 0x6e, 0xb8, 0x97, 0xad, 0x1d, 0xaa, 0xab, 0x49, - 0x65, 0x76, 0x30, 0xa8, 0xdc, 0x43, 0xd8, 0x1d, 0x8d, 0xfa, 0x46, 0xd0, - 0xdc, 0x21, 0xe3, 0xcb, 0xe7, 0x56, 0x64, 0x9e, 0x2e, 0x7f, 0x0a, 0xf7, - 0x6f, 0x7a, 0x9f, 0xd1, 0xe0, 0xa0, 0x89, 0x73, 0xe9, 0xdc, 0x1a, 0x68, - 0x73, 0xde, 0x83, 0xe0, 0xb6, 0x8a, 0x41, 0xe5, 0xde, 0xc9, 0x68, 0xd9, - 0x5b, 0x5e, 0x99, 0x4c, 0x59, 0x10, 0xde, 0x29, 0x83, 0x5f, 0xcf, 0x62, - 0xe8, 0x9c, 0xb1, 0x44, 0xdd, 0x96, 0xe2, 0x5e, 0x99, 0xb1, 0x73, 0x9f, - 0x05, 0x62, 0x19, 0xf3, 0x7b, 0xf7, 0xca, 0x06, 0x75, 0x29, 0x6e, 0x78, - 0x31, 0xca, 0x88, 0x69, 0x6f, 0xd8, 0x7f, 0x17, 0xee, 0x4d, 0x08, 0x6f, - 0x5c, 0xf0, 0x24, 0x18, 0x92, 0xfd, 0x9a, 0x31, 0x7d, 0xff, 0x83, 0xbe, - 0xf5, 0x07, 0xd5, 0x15, 0xc6, 0x3a, 0x08, 0x49, 0xf9, 0x8c, 0x4c, 0x23, - 0x98, 0x4a, 0x2f, 0xbf, 0xb3, 0x9c, 0x1d, 0xf2, 0xcd, 0x8c, 0x69, 0xe5, - 0x1d, 0x0c, 0xe0, 0xc9, 0x48, 0x2f, 0x89, 0x90, 0x17, 0xc2, 0xff, 0xf9, - 0x71, 0x2a, 0xc6, 0x2a, 0x2a, 0x80, 0x94, 0xee, 0x61, 0x2b, 0x5f, 0x4f, - 0xeb, 0x2a, 0x4f, 0x1c, 0x26, 0x4f, 0x73, 0xff, 0x91, 0x8e, 0xc7, 0x38, - 0xe0, 0x6c, 0x0f, 0x43, 0xb4, 0x10, 0x01, 0x86, 0x23, 0x86, 0xe4, 0x58, - 0x48, 0xb9, 0x97, 0x52, 0x41, 0x22, 0x5e, 0xb5, 0x1f, 0x22, 0x89, 0x41, - 0x28, 0x20, 0x30, 0x3a, 0x97, 0x2f, 0x98, 0x12, 0x04, 0x7b, 0x00, 0x33, - 0xef, 0x95, 0xc4, 0x1c, 0xe0, 0x21, 0x96, 0x08, 0xdb, 0x09, 0xc7, 0xc1, - 0xbe, 0x5e, 0x9f, 0x5e, 0xdb, 0xa5, 0xf6, 0x08, 0xdc, 0x0f, 0x2c, 0x5f, - 0x58, 0x77, 0xc9, 0x63, 0xa7, 0x8f, 0xd5, 0x94, 0x8d, 0x14, 0xfb, 0xfb, - 0x50, 0x4c, 0xbd, 0x58, 0xb7, 0x1b, 0x62, 0xb1, 0xc4, 0x19, 0xe2, 0x58, - 0x32, 0x74, 0xdc, 0xf6, 0x39, 0xa6, 0x32, 0x3a, 0x5b, 0x86, 0x33, 0xa0, - 0xc6, 0x44, 0x1a, 0x4d, 0xc6, 0x3b, 0xf9, 0xc5, 0xca, 0xc5, 0xdc, 0x55, - 0x8a, 0xc9, 0xb7, 0x8e, 0xcd, 0x83, 0xdc, 0xab, 0x5f, 0x4c, 0x1a, 0x54, - 0xe2, 0x37, 0x8d, 0x6a, 0xa2, 0x6e, 0x35, 0x1e, 0x82, 0x05, 0x1b, 0xbd, - 0x84, 0x18, 0xac, 0x37, 0x2d, 0x46, 0x4d, 0xc6, 0xf1, 0x21, 0x8a, 0xc3, - 0xed, 0x8c, 0xf9, 0x73, 0x8e, 0x28, 0x9b, 0x40, 0x58, 0x64, 0x99, 0xf3, - 0xf5, 0xc1, 0x14, 0x82, 0x37, 0xd6, 0x9c, 0x1d, 0x57, 0x43, 0x4b, 0x30, - 0x86, 0x1c, 0x71, 0x53, 0x69, 0xc4, 0x87, 0xc3, 0x03, 0x66, 0x18, 0x51, - 0x15, 0x09, 0xcb, 0xe2, 0x0c, 0xaf, 0xc5, 0x6f, 0x06, 0xd4, 0xf1, 0x1e, - 0x15, 0x68, 0x6f, 0xaa, 0x9d, 0xd7, 0x6b, 0x69, 0x42, 0xd9, 0x68, 0xab, - 0x69, 0x94, 0x33, 0x7d, 0x53, 0x56, 0x75, 0x31, 0x20, 0x41, 0xd0, 0x90, - 0xeb, 0x77, 0x09, 0x3d, 0xf7, 0xff, 0xaa, 0x36, 0x57, 0xcd, 0xc0, 0x29, - 0x27, 0xaf, 0x75, 0x1a, 0xb3, 0x6f, 0x15, 0x35, 0x8d, 0x6a, 0xd3, 0x07, - 0xcd, 0x4b, 0x68, 0x38, 0x3e, 0x8f, 0xb1, 0x8a, 0x71, 0xc1, 0xb5, 0x76, - 0xdb, 0x2e, 0x17, 0x18, 0xab, 0x23, 0x9b, 0xdd, 0x41, 0xa0, 0xeb, 0xc4, - 0x52, 0x19, 0xdd, 0x60, 0x8d, 0x63, 0x00, 0xdf, 0x73, 0x2f, 0x27, 0x46, - 0x8d, 0x7c, 0xec, 0x8b, 0xba, 0x23, 0x53, 0x7c, 0x28, 0xe6, 0xc5, 0xd0, - 0xdf, 0xd9, 0x70, 0x31, 0x96, 0x82, 0xbb, 0x08, 0x77, 0x65, 0xf4, 0x95, - 0x10, 0x35, 0x8c, 0xc4, 0x0a, 0x17, 0x9a, 0x5b, 0xdd, 0xaa, 0x06, 0x3a, - 0xde, 0x1a, 0x27, 0xd4, 0xe7, 0xb9, 0xdc, 0x3e, 0xe2, 0x9c, 0x68, 0x4a, - 0xb4, 0x5a, 0x10, 0x71, 0x92, 0x44, 0x55, 0x96, 0x25, 0x0d, 0x9e, 0xa5, - 0x0f, 0xa2, 0xdb, 0xd5, 0x32, 0xf8, 0x6e, 0x4a, 0x7c, 0x3d, 0xd2, 0x05, - 0x3a, 0xda, 0x8a, 0x1a, 0x6e, 0x80, 0x2b, 0xfa, 0x5d, 0x15, 0xa5, 0x26, - 0xd1, 0xd2, 0xd8, 0x35, 0x84, 0xde, 0x5a, 0xb0, 0x8a, 0x75, 0x6c, 0xd1, - 0x46, 0x11, 0xfa, 0xa3, 0x71, 0x7a, 0xff, 0x53, 0x74, 0x1c, 0xa9, 0x4a, - 0x68, 0x0e, 0xe7, 0x66, 0xc8, 0x3b, 0x7d, 0x6d, 0xe2, 0xf7, 0x9e, 0x9a, - 0x45, 0x55, 0x36, 0xcb, 0x70, 0xe2, 0x00, 0x67, 0xf4, 0x50, 0xe0, 0x37, - 0xed, 0x52, 0x2e, 0x2c, 0xe3, 0xa5, 0x09, 0x60, 0x4b, 0x6f, 0xda, 0x5b, - 0xb7, 0xf8, 0x2f, 0x7f, 0x87, 0xb8, 0x3b, 0x5b, 0x0c, 0x5c, 0x75, 0x65, - 0xa1, 0xb3, 0x5b, 0x8a, 0x28, 0x4e, 0x85, 0xca, 0xe6, 0xe4, 0xa1, 0x2c, - 0xda, 0x82, 0x64, 0xe9, 0x1c, 0x9e, 0x50, 0xfd, 0xf7, 0x41, 0xc3, 0x8b, - 0x92, 0xa2, 0xe9, 0x3d, 0xe8, 0xa7, 0x5e, 0x7e, 0x4c, 0x9f, 0xf3, 0x5c, - 0x11, 0x6d, 0xd9, 0x04, 0x99, 0xff, 0x95, 0x42, 0x4d, 0x98, 0xd7, 0xd8, - 0x00, 0xb3, 0x69, 0x1a, 0x7d, 0x12, 0x62, 0x42, 0xde, 0x6e, 0x41, 0x89, - 0x2f, 0x85, 0xd1, 0x9a, 0xe2, 0xa3, 0xce, 0x8c, 0xa1, 0xcd, 0xfe, 0xb0, - 0x0c, 0x4a, 0xde, 0xfa, 0xb8, 0xf9, 0x0f, 0x06, 0x57, 0x7f, 0x05, 0xbd, - 0x0f, 0x85, 0xe0, 0x18, 0xed, 0x78, 0xa8, 0x09, 0x21, 0xcc, 0x03, 0x8e, - 0x66, 0xf8, 0x0d, 0x26, 0x3a, 0x01, 0x55, 0x81, 0x98, 0xa8, 0x94, 0x64, - 0x8d, 0x6b, 0x89, 0xc4, 0x37, 0x2c, 0xa3, 0x7d, 0xc8, 0x94, 0xee, 0x2f, - 0x49, 0xf1, 0xa2, 0x4b, 0xc6, 0x82, 0xdf, 0x51, 0xe6, 0xa1, 0x3d, 0x00, - 0x02, 0x33, 0x7f, 0x60, 0xfe, 0xa5, 0x94, 0xb2, 0x5f, 0x09, 0x44, 0x84, - 0x26, 0x57, 0x2f, 0x3c, 0x06, 0xfa, 0xdf, 0xa0, 0x06, 0xa8, 0x9f, 0xe0, - 0x50, 0xaa, 0xfd, 0x7f, 0x47, 0xaa, 0x49, 0x92, 0x5f, 0x61, 0xf6, 0xa4, - 0xc6, 0x52, 0xf5, 0xb4, 0x5e, 0x2f, 0x4d, 0x0d, 0x05, 0x1e, 0xb0, 0xd0, - 0x6c, 0x8c, 0xf1, 0x73, 0xa8, 0x0f, 0x12, 0x41, 0xfe, 0xf0, 0x96, 0xc9, - 0xd8, 0x12, 0x00, 0x72, 0x9b, 0x7c, 0x24, 0xfe, 0x11, 0xf5, 0x46, 0xb7, - 0xf4, 0xd6, 0x7c, 0xfe, 0xe7, 0x83, 0x06, 0xd1, 0x1a, 0x68, 0x77, 0xa4, - 0x02, 0xb3, 0xf6, 0x48, 0x6b, 0xea, 0x0a, 0x67, 0x7e, 0x5b, 0x05, 0xed, - 0x02, 0x04, 0x42, 0x47, 0x41, 0x4f, 0xa7, 0x5f, 0x31, 0x14, 0xc4, 0x3c, - 0xc3, 0x19, 0x0e, 0xc9, 0x84, 0xd9, 0x47, 0xf0, 0x1e, 0x33, 0x35, 0xb8, - 0xf7, 0xae, 0x3a, 0xf7, 0x4a, 0x58, 0xf0, 0x1a, 0x09, 0xb3, 0x38, 0x1f, - 0x14, 0x2d, 0x2b, 0x19, 0x69, 0x8d, 0x68, 0x8a, 0x2a, 0xd4, 0x9f, 0xe4, - 0x9a, 0xec, 0x20, 0xdb, 0x6e, 0x01, 0x40, 0x9b, 0xbb, 0x46, 0xfb, 0x9e, - 0x48, 0xeb, 0x09, 0x26, 0x10, 0x51, 0xc8, 0x72, 0x44, 0xcb, 0x48, 0xc6, - 0xfc, 0x6a, 0xb1, 0x0e, 0xe6, 0x3e, 0xbe, 0x02, 0xae, 0x1e, 0x82, 0xa1, - 0xc5, 0x1a, 0x77, 0xe3, 0x63, 0x02, 0x2e, 0x7d, 0x7d, 0x02, 0xb0, 0xd2, - 0x37, 0x49, 0x1f, 0x38, 0x5a, 0x3b, 0x17, 0xe5, 0x3f, 0x7b, 0xfc, 0xeb, - 0x57, 0xc5, 0xa2, 0xda, 0x3f, 0xb3, 0x35, 0x1b, 0x14, 0xb1, 0x37, 0xbf, - 0x00, 0x03, 0x78, 0xa9, 0xaa, 0x41, 0x0d, 0x88, 0xbe, 0x11, 0xb6, 0x81, - 0x23, 0x03, 0x2e, 0x6c, 0x6e, 0x7e, 0xa9, 0x69, 0x5a, 0x12, 0x50, 0xbb, - 0x80, 0xe7, 0x60, 0xb5, 0xfc, 0x9f, 0xd4, 0xb6, 0xca, 0xda, 0xb3, 0xf4, - 0xaa, 0xfb, 0x55, 0x87, 0xaf, 0x9b, 0x25, 0x1d, 0x90, 0xf9, 0xc3, 0x27, - 0x08, 0x5b, 0x6f, 0xde, 0x66, 0xb8, 0x44, 0x06, 0x99, 0xbc, 0x0e, 0xdd, - 0x91, 0x89, 0x5a, 0x18, 0xe5, 0xd7, 0x79, 0x95, 0xcc, 0xb9, 0xf4, 0x40, - 0x9d, 0x67, 0xd2, 0x16, 0x81, 0x66, 0x68, 0x6f, 0x4a, 0x5a, 0x59, 0x3b, - 0x7f, 0x21, 0x84, 0x68, 0x0c, 0xdb, 0xbb, 0x67, 0x69, 0xa0, 0x0c, 0x06, - 0x78, 0xa3, 0xe1, 0xc1, 0xc5, 0xb7, 0x8a, 0x37, 0xc3, 0x74, 0x2b, 0x73, - 0x37, 0xb2, 0x0f, 0xe7, 0x54, 0x27, 0x80, 0x3d, 0x42, 0xf0, 0xdd, 0x07, - 0x2c, 0xea, 0x87, 0xc5, 0xbf, 0xe3, 0xaf, 0xe4, 0x7a, 0xaa, 0xe5, 0x96, - 0x6c, 0xef, 0x3a, 0x17, 0x72, 0x61, 0x01, 0xcc, 0x86, 0x8c, 0x8d, 0x64, - 0x6b, 0xd3, 0x39, 0x8c, 0xe8, 0x30, 0x6a, 0x64, 0x18, 0x50, 0x8a, 0xce, - 0x7f, 0x94, 0x30, 0x5f, 0xd6, 0x28, 0x5b, 0x55, 0xc1, 0xe1, 0xa2, 0x3d, - 0xba, 0xed, 0x27, 0xde, 0x46, 0xbb, 0x34, 0x53, 0x08, 0x76, 0x55, 0xe3, - 0x88, 0x81, 0x7f, 0x82, 0x6a, 0xd5, 0x9e, 0x7c, 0xfd, 0xb1, 0xb0, 0x36, - 0xa0, 0x0f, 0xfc, 0x40, 0x32, 0xcf, 0x2e, 0xea, 0xc4, 0xdf, 0x9b, 0xd2, - 0xfa, 0x2d, 0x37, 0x86, 0xc5, 0xb7, 0x8b, 0x1d, 0x26, 0x27, 0x2e, 0xdd, - 0x03, 0xa4, 0x0e, 0xb5, 0xbf, 0x79, 0x2a, 0x05, 0x29, 0xc4, 0x3d, 0xf9, - 0x85, 0x0e, 0x3c, 0xe8, 0xfe, 0xab, 0xa4, 0xdc, 0x4e, 0xcb, 0x7a, 0xc7, - 0x70, 0x27, 0x5b, 0x04, 0xfa, 0x67, 0x65, 0x1d, 0x6c, 0x95, 0x77, 0xb0, - 0x6c, 0x70, 0xff, 0xef, 0xf9, 0xc4, 0x2a, 0xd6, 0x9e, 0x09, 0x0d, 0x8c, - 0x39, 0x62, 0xc0, 0xa8, 0x89, 0x41, 0xee, 0x9f, 0xf3, 0x16, 0xb7, 0x80, - 0x72, 0x3b, 0x76, 0x15, 0x3e, 0x89, 0x83, 0x49, 0x4f, 0x59, 0x0b, 0x38, - 0xb5, 0xd2, 0xe8, 0x11, 0x4d, 0x99, 0x68, 0xf5, 0x17, 0xa9, 0xa4, 0x7d, - 0xac, 0x60, 0xa6, 0x90, 0x05, 0x98, 0xf0, 0x75, 0x25, 0x33, 0xed, 0x93, - 0x31, 0xa3, 0xad, 0x40, 0xc2, 0xcb, 0x1f, 0x29, 0xf4, 0x85, 0x93, 0x7c, - 0x07, 0xa4, 0x78, 0xd2, 0x94, 0xad, 0xe5, 0x2c, 0xdb, 0x68, 0x49, 0xe5, - 0x7c, 0x29, 0x5d, 0x76, 0x81, 0x0b, 0x48, 0xe6, 0x41, 0x08, 0x17, 0xce, - 0x3f, 0x0c, 0x40, 0xb9, 0xd5, 0xb2, 0xa9, 0x6f, 0xe5, 0x40, 0xc6, 0xd0, - 0x79, 0x98, 0x99, 0x05, 0xdb, 0x6c, 0x18, 0x9b, 0xa5, 0x6d, 0x7b, 0xa6, - 0x01, 0x99, 0x15, 0xa3, 0xa6, 0x26, 0xb3, 0xf0, 0x55, 0x13, 0x9b, 0xe8, - 0x3a, 0x24, 0x66, 0xbb, 0xdc, 0x48, 0x34, 0x99, 0xf6, 0xb1, 0x55, 0x4f, - 0x7e, 0x7a, 0xa6, 0x48, 0xce, 0x10, 0xcd, 0xc7, 0x25, 0xbc, 0x88, 0x7e, - 0x12, 0xb3, 0xd1, 0xff, 0x27, 0xe9, 0xc9, 0x36, 0x4c, 0x7b, 0x7c, 0xc1, - 0x3f, 0xc1, 0xaf, 0x0e, 0x24, 0x39, 0xc6, 0xc3, 0x54, 0x2b, 0xa1, 0x98, - 0x20, 0x5e, 0x8a, 0xbe, 0xf5, 0x92, 0xb5, 0xb6, 0x9c, 0xf0, 0xec, 0x98, - 0x61, 0x29, 0x43, 0xff, 0x47, 0x3f, 0x5a, 0x0b, 0xae, 0x75, 0x5d, 0x48, - 0xaa, 0x8c, 0x02, 0x4c, 0x00, 0x72, 0xdb, 0x79, 0x2e, 0x1c, 0x85, 0x3e, - 0xea, 0xc0, 0x54, 0x25, 0xf8, 0x78, 0xc3, 0xce, 0x43, 0xf2, 0x35, 0xc8, - 0x75, 0x3c, 0xa7, 0x40, 0x2c, 0x56, 0xb9, 0x92, 0xf6, 0xec, 0xd1, 0xb9, - 0x23, 0x5d, 0x70, 0xa9, 0x2f, 0xd0, 0xd3, 0xe5, 0x8a, 0xa5, 0xb1, 0xf1, - 0xcf, 0x78, 0x86, 0xca, 0x42, 0x24, 0x41, 0x49, 0xd5, 0x35, 0xec, 0x9c, - 0x80, 0xd2, 0x6e, 0xb1, 0xb1, 0x90, 0xd7, 0xb0, 0x26, 0x7c, 0xeb, 0x36, - 0xba, 0xe0, 0x49, 0xf0, 0x57, 0xeb, 0x16, 0x9a, 0xc5, 0x6e, 0xa9, 0xcb, - 0x7e, 0xf0, 0xf2, 0x69, 0xdc, 0x75, 0x7b, 0x4d, 0x8f, 0xe3, 0xbb, 0xf9, - 0xc5, 0xad, 0x2d, 0x2f, 0xd0, 0xea, 0xd3, 0xa6, 0x21, 0xe1, 0xcf, 0x1b, - 0xb7, 0x8a, 0x26, 0xfe, 0x92, 0xd6, 0x13, 0x3c, 0xde, 0x8a, 0xc3, 0x44, - 0xf5, 0x35, 0xad, 0x9b, 0x29, 0xe5, 0x4f, 0x87, 0xb3, 0xe6, 0x55, 0xf0, - 0x2e, 0xe1, 0xe1, 0xf7, 0xc4, 0xff, 0xf4, 0xca, 0x1d, 0xef, 0xde, 0x40, - 0xc8, 0x20, 0x20, 0xb7, 0x5c, 0x6a, 0x18, 0x1c, 0x5a, 0x79, 0x6b, 0xea, - 0xcc, 0x29, 0xd9, 0x86, 0x77, 0xa2, 0x49, 0x58, 0x5c, 0x5a, 0x72, 0x4b, - 0x6b, 0x6f, 0x0f, 0x0e, 0xc1, 0xd1, 0x2e, 0xc2, 0x31, 0xda, 0x9a, 0xdb, - 0xb3, 0xb9, 0x47, 0x80, 0xf7, 0x65, 0x95, 0xb4, 0x50, 0xde, 0x1c, 0x70, - 0x31, 0xa0, 0x38, 0xba, 0x10, 0x22, 0x62, 0x66, 0x89, 0x57, 0x3e, 0x6d, - 0x25, 0xdb, 0x97, 0x90, 0x84, 0x01, 0x79, 0x73, 0x6f, 0x4c, 0x68, 0xf9, - 0xee, 0x07, 0xe1, 0xa1, 0x21, 0x79, 0x1a, 0xdf, 0xa3, 0xef, 0x71, 0x87, - 0xb6, 0x42, 0x09, 0x7d, 0xde, 0xad, 0x03, 0xa1, 0x23, 0xde, 0x55, 0x0d, - 0x2e, 0x0d, 0xb1, 0xd5, 0xf8, 0x93, 0x22, 0x8f, 0xc1, 0x71, 0x6f, 0x5c, - 0x25, 0x1f, 0x30, 0x9a, 0x90, 0x80, 0xa4, 0x00, 0x64, 0x70, 0x9b, 0xb1, - 0x43, 0x2a, 0xaf, 0xfb, 0x7e, 0x51, 0x3f, 0x32, 0x4c, 0x78, 0xee, 0xdd, - 0x89, 0x50, 0x90, 0x1c, 0xfe, 0xe3, 0xf5, 0x09, 0x80, 0xdb, 0x23, 0x14, - 0x0b, 0x9f, 0x7c, 0x78, 0xe5, 0x38, 0xb9, 0x07, 0xa3, 0x2e, 0xbb, 0xfd, - 0x1f, 0xb2, 0x52, 0xcd, 0xd8, 0x52, 0x9b, 0xa1, 0x62, 0x8f, 0x56, 0xc4, - 0xaa, 0xb2, 0x00, 0x06, 0x8f, 0x37, 0xb6, 0x95, 0x37, 0xbd, 0x5f, 0x03, - 0xce, 0x7a, 0xcd, 0x3e, 0x9f, 0x56, 0xab, 0x0a, 0xc8, 0x15, 0x96, 0xce, - 0xaf, 0x8c, 0xe6, 0xcd, 0x74, 0xbb, 0x6f, 0x95, 0xa2, 0xc8, 0xd0, 0x45, - 0x58, 0x6d, 0x6e, 0x7e, 0xcb, 0xf3, 0xe4, 0xa0, 0xd7, 0xfe, 0x9b, 0xac, - 0xa7, 0x49, 0x97, 0x88, 0xf4, 0x71, 0xd1, 0xab, 0xfd, 0xf5, 0x57, 0x1a, - 0x6e, 0x4c, 0xd5, 0x4c, 0x38, 0x91, 0x24, 0x4a, 0xeb, 0xa3, 0xe5, 0xbb, - 0xd2, 0x26, 0xf0, 0xb1, 0xa2, 0xc7, 0xcf, 0x20, 0x38, 0x01, 0x23, 0xb2, - 0x20, 0x65, 0x79, 0xfd, 0x46, 0x38, 0x5c, 0x4c, 0xd0, 0x43, 0x22, 0x06, - 0x01, 0x67, 0x0d, 0x7b, 0x0f, 0x2e, 0x06, 0xb0, 0x3e, 0x0f, 0xb7, 0x7a, - 0x2a, 0x7b, 0xd2, 0x1f, 0x03, 0xa5, 0x38, 0x35, 0x3f, 0xc1, 0x39, 0x19, - 0x6c, 0x4a, 0x68, 0x04, 0x62, 0xca, 0x9b, 0xfd, 0xa1, 0xf0, 0x25, 0x9f, - 0x76, 0xf9, 0x57, 0x8d, 0xdb, 0x91, 0xde, 0x8e, 0xf3, 0x9a, 0x42, 0x29, - 0xd8, 0x7a, 0xbb, 0xdf, 0x06, 0x41, 0xeb, 0x4c, 0x01, 0xec, 0xef, 0xda, - 0xf1, 0x49, 0xf7, 0x3f, 0xcd, 0xe4, 0x7f, 0x95, 0x3c, 0xc4, 0x89, 0x30, - 0x40, 0xb6, 0xa3, 0xe9, 0x53, 0x13, 0x72, 0x69, 0xa3, 0x83, 0x1f, 0x7e, - 0x42, 0x9c, 0xa0, 0xaf, 0x82, 0xab, 0xd9, 0x70, 0xc1, 0x8b, 0x2c, 0xa4, - 0x83, 0x77, 0xea, 0xc8, 0x91, 0xad, 0x8a, 0x4f, 0x13, 0xff, 0x0d, 0x8f, - 0xf3, 0x6f, 0x23, 0xbf, 0x04, 0x04, 0x99, 0xf6, 0x13, 0x51, 0x66, 0x66, - 0xee, 0xe9, 0x65, 0xe5, 0x61, 0x0c, 0xc7, 0x2b, 0x66, 0x7b, 0x0c, 0x9c, - 0x36, 0x9a, 0x76, 0x4c, 0x0e, 0x76, 0x53, 0xfb, 0x83, 0x67, 0x85, 0x3b, - 0x9b, 0xdd, 0x41, 0x6e, 0xd0, 0xdf, 0xe5, 0xec, 0x98, 0x1c, 0x47, 0x61, - 0x10, 0xdd, 0x05, 0x5c, 0xd4, 0x2e, 0x91, 0xa2, 0x1a, 0xde, 0x18, 0x21, - 0x63, 0x72, 0x9f, 0x13, 0x72, 0x6d, 0x29, 0x1c, 0xb7, 0xbe, 0xb6, 0x22, - 0x52, 0x05, 0xe2, 0xc8, 0xac, 0x43, 0xef, 0xe9, 0x3c, 0xac, 0x41, 0x72, - 0x38, 0xb9, 0xac, 0x8a, 0x20, 0x4c, 0x09, 0xe5, 0x0c, 0xb9, 0x21, 0x23, - 0x37, 0x3b, 0xe9, 0xb7, 0x3d, 0x9d, 0x42, 0x0e, 0x8c, 0x26, 0xe2, 0x14, - 0x3c, 0x06, 0xc6, 0x62, 0x76, 0xec, 0x03, 0xe7, 0xbf, 0x9f, 0x85, 0xbf, - 0x2d, 0xdb, 0xae, 0x17, 0x51, 0x4c, 0xf5, 0x2d, 0x6b, 0x22, 0x0a, 0xc1, - 0xd6, 0x45, 0xcf, 0xf1, 0xdb, 0x62, 0x7d, 0x2f, 0x94, 0x65, 0x55, 0xc1, - 0x3b, 0xfb, 0x02, 0xc3, 0x5b, 0x4b, 0x66, 0x1b, 0x21, 0x36, 0xea, 0x60, - 0x94, 0x7e, 0x5f, 0x43, 0xba, 0x29, 0x64, 0xf1, 0x27, 0xbb, 0xb9, 0xc6, - 0xcc, 0xaa, 0x37, 0x12, 0x26, 0x0e, 0x80, 0x28, 0x48, 0xa6, 0xc5, 0x26, - 0xb2, 0x8b, 0x70, 0x54, 0x8d, 0xfd, 0x9c, 0xd0, 0x3f, 0xa4, 0xc2, 0x3e, - 0x7b, 0xc1, 0xc7, 0x5f, 0x6a, 0x35, 0xbb, 0xff, 0x23, 0x14, 0x44, 0x4d, - 0xe4, 0xfd, 0xd2, 0xa3, 0x17, 0xd1, 0xca, 0x00, 0x92, 0xb5, 0x25, 0xbe, - 0xa5, 0xb4, 0x12, 0x4a, 0xb5, 0xae, 0x0b, 0x30, 0x14, 0xfb, 0x87, 0x0f, - 0xc5, 0x11, 0xf3, 0x37, 0xf8, 0xb4, 0xc5, 0x44, 0xb4, 0x77, 0x45, 0x8c, - 0x3b, 0xb7, 0x1d, 0xc1, 0xbc, 0x8d, 0x61, 0xda, 0x79, 0x11, 0xbe, 0x02, - 0xcb, 0xfb, 0xe8, 0xc2, 0xa4, 0x51, 0x8b, 0x79, 0xd4, 0x36, 0xb0, 0x82, - 0x57, 0x8b, 0x17, 0x11, 0xd6, 0x7a, 0xf5, 0xc3, 0x0f, 0x75, 0x99, 0x6f, - 0xb4, 0x25, 0x1d, 0x8c, 0x1a, 0x76, 0x2d, 0xc0, 0x50, 0xd3, 0xd1, 0x28, - 0xc9, 0x5b, 0x2a, 0x68, 0xa6, 0xf2, 0x54, 0xbd, 0x0a, 0xf3, 0xe1, 0xac, - 0x93, 0x0b, 0x55, 0x57, 0xba, 0x72, 0x45, 0xf1, 0xcf, 0x80, 0x99, 0x4e, - 0x46, 0x92, 0x7e, 0x5d, 0x61, 0xe5, 0x55, 0x08, 0xe6, 0x99, 0x64, 0xe5, - 0x49, 0xec, 0x7b, 0x9b, 0x7b, 0xc7, 0xe7, 0xab, 0xcb, 0x1d, 0xf2, 0x99, - 0x8d, 0x49, 0x2b, 0x37, 0xc3, 0x68, 0x8a, 0x59, 0x6d, 0x8c, 0xb9, 0xbd, - 0xdf, 0xb1, 0x93, 0xbb, 0xfb, 0xc9, 0x79, 0x21, 0xc7, 0xe3, 0xd4, 0x87, - 0xc9, 0x91, 0x75, 0x52, 0x35, 0xdb, 0x94, 0x13, 0xe3, 0xd0, 0x98, 0x18, - 0xb1, 0x0e, 0x58, 0x5a, 0xdd, 0x15, 0x0c, 0x29, 0x8f, 0xce, 0xec, 0x4c, - 0xa9, 0x6b, 0xf2, 0x13, 0x7a, 0x67, 0x46, 0x8c, 0xcd, 0xe9, 0xf1, 0x2a, - 0x01, 0x51, 0xe2, 0x22, 0xd1, 0x3e, 0x12, 0x4c, 0xa4, 0xa9, 0xb0, 0x29, - 0x66, 0x85, 0x98, 0x77, 0x13, 0x9a, 0xed, 0x54, 0x9a, 0xff, 0x7e, 0x72, - 0x34, 0x13, 0x75, 0xf1, 0x1a, 0x33, 0xdb, 0x45, 0xb9, 0x58, 0x78, 0xa4, - 0x96, 0x57, 0x7d, 0x7a, 0x8f, 0xa8, 0xd6, 0xc5, 0xf3, 0x37, 0x27, 0x81, - 0x1e, 0xd2, 0x60, 0x0b, 0xec, 0x06, 0xb3, 0x1b, 0xc5, 0x37, 0x59, 0xc3, - 0x8f, 0x38, 0xfe, 0xc6, 0xca, 0x11, 0x75, 0xf8, 0xad, 0xd5, 0xfe, 0xb9, - 0x27, 0x75, 0x3e, 0x11, 0xf5, 0x31, 0x06, 0x19, 0x39, 0xf2, 0x62, 0xb5, - 0xc1, 0x95, 0x6d, 0x18, 0xb4, 0x7a, 0x8b, 0xbc, 0x44, 0x7a, 0x70, 0x46, - 0x03, 0xe7, 0x15, 0x23, 0x31, 0x19, 0x20, 0xd2, 0x13, 0x8f, 0x13, 0x3a, - 0x66, 0x32, 0x58, 0x72, 0x1b, 0x64, 0xac, 0xef, 0xa0, 0x54, 0x0d, 0x7b, - 0xb6, 0xf7, 0x15, 0x9b, 0xb2, 0x69, 0x19, 0x1a, 0xe4, 0x35, 0xc3, 0x90, - 0xb5, 0xad, 0x51, 0x1f, 0x6e, 0xaf, 0x98, 0x38, 0x3f, 0x78, 0x81, 0x90, - 0xac, 0x22, 0xa4, 0x10, 0xd8, 0xa4, 0x7e, 0x00, 0x19, 0x1d, 0x6e, 0x92, - 0x92, 0x2a, 0x51, 0x5f, 0x91, 0x15, 0xa7, 0xc5, 0x9b, 0x61, 0x90, 0x56, - 0x43, 0x4c, 0xc7, 0xc0, 0x10, 0x77, 0x36, 0x67, 0x31, 0x60, 0x07, 0x48, - 0xd3, 0x7c, 0x6c, 0xde, 0x38, 0x1c, 0x04, 0x3e, 0x5d, 0xd1, 0x81, 0x15, - 0x34, 0xa1, 0x46, 0x54, 0xdd, 0x9c, 0xce, 0x10, 0x91, 0x27, 0x9c, 0x94, - 0xbd, 0xbb, 0xaf, 0x59, 0x6e, 0x7b, 0x4a, 0xd8, 0x60, 0xf0, 0x67, 0x83, - 0x21, 0xd7, 0x46, 0x17, 0xae, 0x6a, 0x9b, 0xaa, 0x7f, 0x1a, 0x47, 0x57, - 0xaa, 0x37, 0x39, 0x81, 0x50, 0xff, 0x60, 0x58, 0xfe, 0x1b, 0xee, 0xf7, - 0x22, 0xbf, 0x76, 0x34, 0x18, 0x6f, 0x80, 0xf7, 0x78, 0x46, 0x81, 0x9f, - 0x38, 0xd7, 0x77, 0x14, 0x0c, 0x9f, 0xba, 0xa0, 0x81, 0x47, 0x8e, 0xc5, - 0x44, 0x3e, 0x48, 0xf1, 0x68, 0x3b, 0xbf, 0x02, 0x14, 0x9e, 0x0f, 0x57, - 0x9b, 0xc6, 0x0e, 0x68, 0xc3, 0x98, 0xda, 0xb1, 0x38, 0xa9, 0x45, 0x54, - 0x28, 0x31, 0xae, 0x0f, 0x82, 0x6b, 0x1b, 0xaf, 0x2c, 0xe3, 0xa0, 0x94, - 0x0c, 0x39, 0xe5, 0x95, 0x1d, 0x7b, 0xf6, 0x0f, 0x84, 0xd0, 0x77, 0xad, - 0x90, 0xf7, 0x19, 0x40, 0x5a, 0x9c, 0x80, 0xb8, 0xce, 0xa4, 0x38, 0x3c, - 0x01, 0x1d, 0x46, 0xa6, 0xf6, 0x02, 0x74, 0x52, 0xf3, 0x18, 0xc6, 0x5a, - 0x58, 0xdb, 0x63, 0x41, 0x91, 0x17, 0xeb, 0x02, 0x18, 0x0b, 0xf9, 0xa9, - 0x23, 0x06, 0x31, 0x6c, 0x23, 0xb2, 0x1b, 0x4e, 0x40, 0x64, 0x65, 0x9e, - 0xa5, 0x40, 0xa1, 0xb1, 0x65, 0xb4, 0x21, 0x19, 0x90, 0x19, 0x95, 0x1c, - 0x32, 0x91, 0xb7, 0x91, 0xd5, 0x50, 0x95, 0x4a, 0xb8, 0xc0, 0x9d, 0x08, - 0xe4, 0x87, 0xd3, 0x5c, 0x60, 0x50, 0x0e, 0xb6, 0x93, 0xdd, 0x6f, 0x65, - 0x80, 0x66, 0xf0, 0x3d, 0x11, 0x5d, 0x0f, 0x06, 0x9a, 0xd3, 0x40, 0x7b, - 0x61, 0x78, 0x1c, 0x92, 0x6e, 0x1a, 0x8b, 0xd5, 0x75, 0x33, 0xb0, 0x6d, - 0xf6, 0x15, 0x01, 0x83, 0x8a, 0x7f, 0x23, 0x7a, 0x5d, 0x21, 0xb3, 0x08, - 0xb5, 0xe6, 0xf7, 0xa8, 0x82, 0x0d, 0x6e, 0x1e, 0x87, 0xe0, 0x84, 0x3a, - 0x71, 0x42, 0xd8, 0xcb, 0x5c, 0x82, 0x5f, 0xd5, 0xde, 0x66, 0xf0, 0x7d, - 0x44, 0x64, 0x13, 0x8c, 0x0c, 0x3c, 0x45, 0xe0, 0x8e, 0x46, 0x79, 0x5d, - 0x34, 0xef, 0x2a, 0x3e, 0x30, 0xff, 0x03, 0x6e, 0xb8, 0xc6, 0x8c, 0x69, - 0x7f, 0x20, 0x13, 0x8f, 0x38, 0x43, 0xa7, 0xd5, 0x61, 0x6f, 0x22, 0xce, - 0x22, 0x9e, 0x05, 0x60, 0x7e, 0x78, 0x32, 0xb5, 0x12, 0xfa, 0x93, 0x69, - 0x55, 0x79, 0x84, 0x4c, 0x0d, 0xd1, 0xda, 0x9c, 0xbc, 0x8d, 0x43, 0x9d, - 0x9a, 0xab, 0x1b, 0xda, 0x9f, 0x11, 0xd0, 0xdd, 0x07, 0xc1, 0xfa, 0xa7, - 0x95, 0xb6, 0x39, 0xe8, 0x6c, 0x7c, 0xc1, 0x5d, 0x3a, 0xd3, 0xf7, 0x37, - 0x7f, 0x4c, 0x46, 0xc2, 0x8c, 0x72, 0xe1, 0xc5, 0xbd, 0xc2, 0x7f, 0xf6, - 0x99, 0x4a, 0x79, 0xdb, 0xd0, 0x46, 0xe3, 0xbf, 0x0b, 0xd7, 0x16, 0x74, - 0x6c, 0xf5, 0x45, 0x8a, 0x90, 0x6c, 0x06, 0x71, 0xe7, 0x98, 0x7f, 0x65, - 0xf3, 0x31, 0x23, 0x82, 0xc6, 0x62, 0x6d, 0xfa, 0xc7, 0x4b, 0xf0, 0x0e, - 0x31, 0x55, 0x6e, 0xb8, 0x65, 0x19, 0xa9, 0x34, 0x0e, 0x5b, 0x73, 0x30, - 0x92, 0xab, 0xc4, 0x1b, 0x92, 0x66, 0x05, 0x09, 0x1c, 0x2a, 0x37, 0xdc, - 0x68, 0x28, 0x0c, 0xbb, 0xda, 0xa1, 0x96, 0x08, 0xf8, 0xd4, 0xa4, 0xd9, - 0xc5, 0xfa, 0x08, 0x9f, 0xfc, 0xa2, 0xfa, 0xab, 0xc6, 0x31, 0xce, 0xb2, - 0x04, 0xa4, 0xb8, 0x80, 0x26, 0x91, 0x83, 0x1d, 0xc1, 0x17, 0xcd, 0xf4, - 0x3f, 0x07, 0x2e, 0x8c, 0x09, 0x4e, 0x6b, 0xc0, 0x77, 0xc2, 0x84, 0x8f, - 0x85, 0xb1, 0x70, 0x82, 0xff, 0x32, 0xec, 0xcb, 0xb8, 0xe0, 0x4c, 0x70, - 0x83, 0x6f, 0x50, 0xdc, 0x91, 0x2c, 0x1c, 0xcb, 0x0b, 0xcb, 0x72, 0x18, - 0x82, 0x60, 0xa8, 0x3e, 0x84, 0xda, 0x22, 0xb1, 0x17, 0x86, 0x14, 0xfe, - 0xc2, 0x5b, 0xf8, 0xc3, 0x33, 0x77, 0x52, 0x4c, 0xf2, 0xf2, 0x0e, 0xb5, - 0x48, 0x08, 0x28, 0x16, 0x56, 0x95, 0x0f, 0x2e, 0x54, 0xa4, 0xad, 0x7f, - 0xe6, 0x05, 0xe8, 0x1d, 0xa1, 0xdb, 0x32, 0x62, 0xab, 0xf6, 0xe7, 0x43, - 0x52, 0xf9, 0xa7, 0x95, 0x59, 0xe6, 0x73, 0x14, 0xa2, 0x70, 0x4b, 0xab, - 0x1c, 0xe0, 0x0e, 0xa7, 0xab, 0xa5, 0xba, 0x13, 0x0a, 0x09, 0x28, 0x7c, - 0x78, 0x99, 0xee, 0x53, 0x35, 0xe0, 0xba, 0x8e, 0x5e, 0x0c, 0x11, 0xfb, - 0x09, 0x36, 0x3b, 0xc4, 0x2b, 0xe9, 0xd4, 0x76, 0x4a, 0x19, 0x44, 0x0d, - 0xb4, 0xf9, 0xa5, 0x5c, 0x75, 0x85, 0x38, 0x02, 0x23, 0xc5, 0xf2, 0xd4, - 0x62, 0x37, 0xcb, 0x1b, 0x68, 0x05, 0x5b, 0x71, 0x8c, 0x5f, 0x88, 0xed, - 0xf5, 0x75, 0x36, 0x6f, 0x30, 0x65, 0xad, 0xfb, 0x09, 0xc6, 0xcd, 0x76, - 0x52, 0x26, 0x3c, 0x61, 0x7b, 0x78, 0x4e, 0x8b, 0xe1, 0xa5, 0x88, 0xf7, - 0x87, 0x2d, 0xa6, 0x8a, 0x45, 0x29, 0xae, 0x29, 0x4a, 0x98, 0xa3, 0xf2, - 0xd2, 0xea, 0x29, 0xbf, 0x40, 0x86, 0xbf, 0x33, 0x6a, 0xd2, 0x32, 0x05, - 0xcc, 0x2e, 0x64, 0xd4, 0x3c, 0xdd, 0x94, 0x2d, 0xb1, 0xbd, 0x86, 0x23, - 0x4b, 0x90, 0xa1, 0x29, 0xe5, 0x1d, 0x72, 0xa2, 0x29, 0xcc, 0x7d, 0x31, - 0x5c, 0x9e, 0x25, 0x89, 0x96, 0x20, 0x7a, 0xb9, 0x27, 0xd4, 0x96, 0x8f, - 0x98, 0x15, 0x7f, 0x63, 0xab, 0x00, 0x70, 0x86, 0xcf, 0x28, 0x23, 0x81, - 0x24, 0xaf, 0xfa, 0x44, 0x59, 0x6f, 0xdc, 0x92, 0xc9, 0x82, 0x7c, 0xbe, - 0xe1, 0x17, 0x0f, 0xae, 0x87, 0x8e, 0x58, 0x3c, 0xd3, 0x74, 0x96, 0xb2, - 0xec, 0x6b, 0xb8, 0xf4, 0x95, 0x71, 0xc3, 0x3f, 0x5c, 0x21, 0x50, 0xb6, - 0x2d, 0x73, 0x4c, 0x17, 0x42, 0x09, 0x59, 0x34, 0x14, 0x05, 0x6d, 0x21, - 0x3d, 0x8f, 0xf6, 0x83, 0x60, 0xbf, 0xe6, 0xae, 0xf6, 0x51, 0xa6, 0x7a, - 0x12, 0xb8, 0x9d, 0x71, 0x9a, 0xcd, 0x3f, 0x72, 0x66, 0x24, 0xa6, 0xb0, - 0x15, 0x1f, 0x42, 0xb5, 0x7e, 0xf7, 0xec, 0x46, 0xe9, 0x4c, 0xd2, 0xc3, - 0xab, 0x45, 0x35, 0x88, 0x10, 0x4b, 0x59, 0x67, 0xc9, 0x9a, 0xf6, 0x41, - 0x91, 0x22, 0x3b, 0x15, 0x1d, 0xef, 0xb9, 0x55, 0xe7, 0x5b, 0xe7, 0x65, - 0x5f, 0x8e, 0x87, 0x7b, 0xf0, 0x61, 0xc7, 0x93, 0x5c, 0x67, 0xb1, 0xc0, - 0xea, 0xe2, 0xd8, 0x8b, 0x00, 0xe1, 0x11, 0x0a, 0x52, 0x31, 0xac, 0xc7, - 0x73, 0xe2, 0x25, 0x33, 0x43, 0xbb, 0x0a, 0x9e, 0x98, 0x2d, 0x33, 0x00, - 0xac, 0x22, 0x49, 0x3d, 0x75, 0x0a, 0xc5, 0xa3, 0xfb, 0xaf, 0xd9, 0x6b, - 0x1f, 0xd1, 0x0f, 0x8e, 0x8e, 0xa1, 0xae, 0xb9, 0x37, 0xde, 0x97, 0x1e, - 0x5b, 0x24, 0xa4, 0x30, 0x87, 0xb9, 0xa3, 0x28, 0xf0, 0x1c, 0x8e, 0xef, - 0x0c, 0xf4, 0xd1, 0x8f, 0xb3, 0x2c, 0x5c, 0x70, 0xfc, 0x8a, 0x8f, 0x5e, - 0x0c, 0x00, 0x7c, 0x9f, 0x70, 0x9e, 0x6c, 0x06, 0x8a, 0x67, 0x95, 0xbb, - 0x8a, 0x87, 0xac, 0x08, 0xea, 0x0a, 0xf7, 0x91, 0x86, 0xe2, 0xe5, 0x32, - 0x95, 0x77, 0x91, 0xd0, 0x7f, 0x89, 0xd8, 0x66, 0x04, 0x87, 0x05, 0xd6, - 0x91, 0xe8, 0xcc, 0x23, 0x4d, 0x96, 0xe2, 0x3d, 0x2c, 0x73, 0xc4, 0x18, - 0xde, 0xe2, 0x54, 0xbe, 0x9a, 0x5e, 0x03, 0xaa, 0x80, 0xe0, 0x4e, 0x73, - 0xcd, 0x8b, 0x45, 0x64, 0x07, 0xd3, 0x3c, 0x6f, 0x70, 0xed, 0xcd, 0xa7, - 0x9c, 0x0a, 0x08, 0xb3, 0x3d, 0xb2, 0xe4, 0x38, 0xc9, 0x55, 0xab, 0xc2, - 0x85, 0x4f, 0x8f, 0x27, 0x33, 0xbd, 0xa5, 0xeb, 0xc3, 0x03, 0xbc, 0x13, - 0x40, 0x99, 0x2a, 0xa7, 0xc1, 0x05, 0x2b, 0x28, 0x2a, 0x70, 0xdd, 0xf5, - 0xf2, 0xcb, 0x82, 0x46, 0x89, 0xf0, 0x4b, 0x36, 0xfc, 0x17, 0xb8, 0x68, - 0x05, 0xd3, 0xae, 0x51, 0x0a, 0x9e, 0x5e, 0x70, 0x0a, 0xfb, 0xe0, 0xfa, - 0xd8, 0x02, 0x16, 0x34, 0xd7, 0x2a, 0xef, 0x45, 0x29, 0xe9, 0x52, 0x47, - 0xaf, 0x73, 0x86, 0xab, 0xa7, 0x6f, 0x90, 0x34, 0xf8, 0x23, 0x31, 0xd1, - 0xb1, 0xc3, 0x3c, 0x2c, 0x23, 0x8f, 0x3b, 0x4c, 0xd6, 0x8a, 0x4a, 0x78, - 0x83, 0xdb, 0x5f, 0x13, 0xe3, 0x6d, 0x5a, 0x01, 0x60, 0x2d, 0xe3, 0x45, - 0x5b, 0x57, 0x99, 0x02, 0x1b, 0xed, 0x47, 0x9a, 0x34, 0xfb, 0x2e, 0xc3, - 0x1c, 0xe9, 0xe1, 0xe5, 0x03, 0x83, 0x7c, 0x28, 0xf1, 0xee, 0xd2, 0xb2, - 0xe7, 0xfe, 0xb1, 0xab, 0xa6, 0x19, 0x9e, 0x65, 0x58, 0xcc, 0x30, 0x56, - 0x6e, 0x1c, 0x28, 0x23, 0x97, 0x85, 0xad, 0x6b, 0x32, 0xa5, 0xa7, 0xa7, - 0x42, 0x7d, 0xa3, 0xdb, 0xad, 0x98, 0xc2, 0xf8, 0x22, 0x8a, 0x5f, 0x4e, - 0xa5, 0xfd, 0x0f, 0xc4, 0x38, 0x76, 0x82, 0x03, 0x8e, 0xb6, 0xb0, 0x1d, - 0xab, 0x02, 0xc9, 0x38, 0x99, 0xa1, 0x20, 0xfe, 0x78, 0x52, 0x4f, 0x36, - 0x73, 0x63, 0xf7, 0x0e, 0xc9, 0x46, 0x02, 0xd4, 0x83, 0x3b, 0xe0, 0x9d, - 0x99, 0xa7, 0x74, 0x3b, 0x58, 0x1e, 0x6e, 0xb2, 0x48, 0x1e, 0xa6, 0xa1, - 0x56, 0x45, 0xbb, 0xe3, 0x45, 0xc7, 0x77, 0xe8, 0xb8, 0x47, 0x81, 0x95, - 0x00, 0xe2, 0xd0, 0xc2, 0x46, 0xf7, 0x00, 0x94, 0x32, 0x81, 0x74, 0xe0, - 0x66, 0xfb, 0x1a, 0xb1, 0x04, 0xca, 0x08, 0x9a, 0xaa, 0xc5, 0x32, 0x21, - 0xc3, 0xcd, 0x60, 0x3c, 0x5d, 0xd1, 0xe5, 0xf1, 0x02, 0x30, 0x4f, 0x98, - 0x75, 0x30, 0xa8, 0x31, 0xe0, 0xe5, 0x85, 0x0e, 0x0a, 0xb9, 0xfc, 0x35, - 0x17, 0x27, 0x61, 0xa7, 0x4b, 0x35, 0x8d, 0x0c, 0x6c, 0x9f, 0x16, 0xb3, - 0xc9, 0x2c, 0x26, 0xc6, 0x24, 0x4a, 0x32, 0xbf, 0xdd, 0x92, 0x03, 0x6f, - 0xee, 0xc7, 0xfb, 0x17, 0x60, 0x81, 0x2c, 0xa0, 0xce, 0xdf, 0x78, 0xa8, - 0xaf, 0x17, 0xe7, 0x07, 0xbf, 0xa9, 0xa5, 0x4f, 0xc1, 0xad, 0x9f, 0xa2, - 0xf3, 0x0c, 0x00, 0xb1, 0xed, 0x7b, 0x6e, 0xe1, 0x61, 0xe8, 0x4f, 0x9c, - 0xf2, 0x68, 0x43, 0x59, 0xfa, 0x6c, 0x77, 0xe8, 0xf1, 0x3a, 0x85, 0x26, - 0x9d, 0xae, 0x47, 0xcf, 0x1c, 0x37, 0xc1, 0xbf, 0x84, 0x9b, 0x48, 0x22, - 0x3e, 0xeb, 0x84, 0x23, 0xd1, 0x20, 0x56, 0x92, 0x63, 0xcd, 0x77, 0xe7, - 0xda, 0x67, 0xce, 0xd6, 0x43, 0xef, 0xc4, 0x13, 0xa5, 0x5b, 0x39, 0xe8, - 0x19, 0xa7, 0xb5, 0xe6, 0x9d, 0x8a, 0x3d, 0x9c, 0xa1, 0xe3, 0xe8, 0x8c, - 0x15, 0x9e, 0xcb, 0xa5, 0xe7, 0x86, 0x6c, 0x76, 0x83, 0x48, 0xf6, 0x2a, - 0x83, 0x34, 0x4f, 0x47, 0x7f, 0x9e, 0x7f, 0xd4, 0xb8, 0x9d, 0x12, 0x9e, - 0xca, 0x7e, 0x5a, 0x46, 0x46, 0xa5, 0xc2, 0x13, 0xe9, 0xff, 0x38, 0x85, - 0x9a, 0xef, 0xea, 0xa6, 0x4e, 0xe9, 0xe1, 0x8b, 0x43, 0x94, 0x11, 0x34, - 0x58, 0xfa, 0xd2, 0x78, 0x9b, 0x34, 0x01, 0x2c, 0x7a, 0x26, 0xd8, 0x1a, - 0x90, 0xcd, 0x9b, 0x74, 0x86, 0xa5, 0x3e, 0xf5, 0x01, 0x2e, 0xe6, 0xaa, - 0x21, 0xfd, 0xaa, 0xe3, 0xbe, 0xe9, 0x09, 0x9e, 0x26, 0x95, 0xd7, 0x2c, - 0xfc, 0xb0, 0xe6, 0x40, 0x8d, 0x6a, 0xf0, 0x5c, 0xe6, 0x4d, 0x82, 0x69, - 0xea, 0x6d, 0xbb, 0xf1, 0x13, 0x61, 0xce, 0xc4, 0xd4, 0xed, 0xc4, 0x60, - 0x7f, 0x9f, 0x2d, 0xbb, 0xfc, 0x90, 0x63, 0x92, 0x5f, 0xb2, 0xff, 0x96, - 0xe8, 0x86, 0xd1, 0x3c, 0x50, 0x24, 0xe4, 0x88, 0xc5, 0x3a, 0x1c, 0xb5, - 0xfb, 0x02, 0x16, 0x40, 0xd7, 0xc8, 0x2f, 0xb1, 0x63, 0x4a, 0x68, 0x13, - 0x2d, 0xce, 0x78, 0x9a, 0xfc, 0x73, 0x79, 0xa9, 0x74, 0xfd, 0x1e, 0xe6, - 0x29, 0x00, 0x6e, 0x2f, 0xf8, 0x9e, 0x6a, 0xfe, 0x74, 0x62, 0xc6, 0x45, - 0xd7, 0xb3, 0x78, 0x1a, 0x4e, 0x58, 0x15, 0x35, 0x1e, 0x5b, 0xa1, 0x9c, - 0xfa, 0x1f, 0x08, 0xac, 0x16, 0x4f, 0x14, 0x2c, 0xd3, 0xb6, 0x2a, 0x7f, - 0x32, 0xd4, 0x34, 0xf7, 0x08, 0x72, 0xbf, 0xbd, 0xdd, 0x54, 0x03, 0xc8, - 0xd0, 0xdb, 0x81, 0xdd, 0x8e, 0x8c, 0x35, 0x5f, 0xb7, 0xdd, 0xdd, 0x2d, - 0x68, 0xa0, 0xbb, 0x64, 0x18, 0xce, 0x36, 0xd2, 0x6e, 0x76, 0x10, 0xcb, - 0x1a, 0x88, 0x14, 0x69, 0x29, 0x67, 0x31, 0x00, 0x1b, 0xcd, 0x92, 0xd7, - 0x4b, 0xfe, 0x27, 0xf1, 0x83, 0x5e, 0xce, 0x11, 0x4f, 0x1d, 0x42, 0x1e, - 0x52, 0x80, 0xff, 0x0e, 0x9b, 0x9c, 0x83, 0x6f, 0x44, 0xf6, 0x45, 0xa2, - 0xb8, 0x8b, 0x50, 0x75, 0x48, 0x54, 0x65, 0x32, 0x87, 0xe9, 0xb3, 0x74, - 0x19, 0x61, 0x04, 0x7a, 0xe5, 0x21, 0xca, 0x0b, 0xb6, 0x5e, 0x13, 0x85, - 0x2b, 0x45, 0xf5, 0xc2, 0x6d, 0x1d, 0xba, 0xfd, 0xef, 0x70, 0xf0, 0x86, - 0x30, 0x6d, 0x6f, 0x2d, 0xf8, 0xfc, 0xa7, 0x12, 0x50, 0x22, 0xa0, 0xe0, - 0x83, 0xc6, 0x69, 0x4b, 0x55, 0xce, 0x1c, 0x7d, 0x34, 0x50, 0xec, 0xbd, - 0x7e, 0xac, 0x32, 0xb3, 0x75, 0xc3, 0xd1, 0x5c, 0x25, 0x88, 0x51, 0x32, - 0x8f, 0x85, 0x60, 0x11, 0x8f, 0x63, 0xf1, 0x39, 0x85, 0x76, 0xd0, 0xac, - 0xa7, 0xb6, 0xe5, 0xe5, 0x52, 0xfa, 0x20, 0x13, 0xb4, 0x42, 0x5c, 0xd8, - 0x4d, 0x48, 0x70, 0xf3, 0x73, 0xfe, 0x02, 0xac, 0x1e, 0xa6, 0x3a, 0x76, - 0xa2, 0x70, 0xa6, 0xad, 0x8a, 0x76, 0x66, 0xc9, 0x5d, 0x7e, 0x94, 0x11, - 0x26, 0x57, 0xf6, 0x77, 0xa1, 0xcb, 0xcd, 0x6e, 0xf3, 0x7b, 0x49, 0x60, - 0x9f, 0xbf, 0x5a, 0xc1, 0x73, 0x8d, 0xd8, 0x1c, 0xe5, 0xe0, 0x04, 0x6e, - 0x9a, 0xb7, 0xc6, 0xfd, 0xc1, 0x45, 0xe7, 0x07, 0x5a, 0x77, 0xdd, 0xa2, - 0xbe, 0x1d, 0xb6, 0x3e, 0xb2, 0xfa, 0x0b, 0x30, 0xd2, 0x2e, 0x60, 0xf1, - 0xd7, 0x72, 0x1b, 0xb1, 0xda, 0x2a, 0x6a, 0x55, 0xbf, 0x38, 0x63, 0x70, - 0x4c, 0xe4, 0x78, 0x31, 0xaf, 0xf4, 0x8d, 0x8a, 0x77, 0x79, 0x63, 0x90, - 0x42, 0xde, 0x4e, 0x2d, 0xd5, 0x3d, 0x02, 0x77, 0xff, 0x97, 0x2c, 0xa4, - 0x38, 0x55, 0x63, 0x54, 0x16, 0xc6, 0xa2, 0x4f, 0x64, 0xed, 0x30, 0x01, - 0x87, 0xa6, 0x18, 0xb6, 0xf9, 0x62, 0x11, 0xaf, 0x1b, 0xd5, 0x0e, 0x8d, - 0x1d, 0x66, 0x4b, 0x66, 0x5e, 0xda, 0x64, 0x3c, 0x8d, 0x19, 0xff, 0x29, - 0xad, 0xb1, 0x6f, 0x1b, 0xcd, 0x7f, 0x94, 0x13, 0xaa, 0x01, 0x50, 0x66, - 0x54, 0x29, 0x16, 0xde, 0x08, 0x20, 0x93, 0x6b, 0x2b, 0x66, 0xb3, 0xd4, - 0x02, 0xfd, 0xae, 0x90, 0xe1, 0x5d, 0x74, 0xb6, 0xd3, 0x16, 0x38, 0x77, - 0x05, 0x65, 0x4e, 0xdc, 0x6b, 0x96, 0xde, 0xfc, 0x16, 0x40, 0x9b, 0xa0, - 0x0e, 0x18, 0x9b, 0xed, 0x29, 0xa2, 0x70, 0x7a, 0x55, 0x9a, 0xc9, 0x28, - 0xd2, 0x06, 0xf8, 0xee, 0x07, 0x85, 0xf0, 0xde, 0xe3, 0x55, 0x6a, 0x2a, - 0x2d, 0x91, 0xd2, 0x47, 0xab, 0x37, 0xf7, 0x94, 0x2f, 0x68, 0x37, 0x9b, - 0x31, 0x45, 0x36, 0x84, 0x65, 0x9e, 0x59, 0xcb, 0x75, 0x8a, 0x6b, 0x72, - 0xae, 0x00, 0xbf, 0x22, 0x97, 0x72, 0xd8, 0x00, 0x00, 0xbe, 0xde, 0x36, - 0x8a, 0xf2, 0x35, 0x96, 0x98, 0xa5, 0xe8, 0xa6, 0xe8, 0x24, 0x11, 0x6b, - 0x6d, 0xde, 0xb9, 0xc3, 0xda, 0xe5, 0x62, 0xd8, 0x54, 0x12, 0x73, 0xf1, - 0x7b, 0x18, 0x70, 0xb2, 0x43, 0x60, 0xbb, 0x74, 0xb5, 0x3a, 0x1a, 0xf4, - 0x46, 0xe8, 0x9c, 0x3d, 0x0c, 0xc6, 0x52, 0xb7, 0x2f, 0x33, 0xe1, 0x87, - 0xfb, 0x9a, 0xec, 0x09, 0x6f, 0x34, 0xdf, 0xf7, 0xbf, 0x16, 0x27, 0x3a, - 0xb6, 0xdd, 0xb6, 0x6f, 0x76, 0x9a, 0x4f, 0xb3, 0xa2, 0xea, 0x69, 0x6f, - 0xa9, 0x11, 0x7d, 0x03, 0x5e, 0x0e, 0x9b, 0x8d, 0x2a, 0x13, 0xfa, 0x1e, - 0x2c, 0xe0, 0x12, 0x04, 0xa0, 0xa0, 0xdf, 0x66, 0x24, 0xf7, 0x77, 0x58, - 0x54, 0xda, 0xb5, 0x22, 0x43, 0x26, 0x91, 0x35, 0xe4, 0xcc, 0x8e, 0x22, - 0x79, 0xd2, 0x67, 0xa0, 0x3e, 0x0c, 0xc7, 0x09, 0x67, 0x9b, 0xad, 0xd9, - 0xa7, 0xd5, 0x10, 0xf8, 0xc0, 0xc9, 0x6c, 0xc9, 0xd8, 0xe1, 0xcf, 0x1e, - 0x74, 0x73, 0xec, 0xef, 0xed, 0x99, 0x37, 0x3c, 0x5f, 0xf6, 0xe0, 0x2a, - 0x6e, 0xf9, 0xb0, 0x4e, 0x1e, 0x91, 0xf6, 0xb9, 0x24, 0x13, 0x43, 0xe5, - 0xc8, 0x9e, 0xc4, 0x71, 0xfb, 0x58, 0xc9, 0x16, 0x17, 0x70, 0x1e, 0x69, - 0x3e, 0x88, 0x93, 0xd1, 0xd7, 0x66, 0xde, 0x86, 0x9f, 0x20, 0x63, 0x31, - 0x6c, 0x33, 0xd6, 0x03, 0xc4, 0xd5, 0x0c, 0x3c, 0xdb, 0x53, 0x9e, 0xea, - 0x8c, 0x3d, 0x68, 0x6b, 0x74, 0xf2, 0x54, 0x23, 0x23, 0xca, 0x1d, 0xfd, - 0xa2, 0xb8, 0x7e, 0x8c, 0xf9, 0x4a, 0x3e, 0x02, 0x85, 0x0a, 0x63, 0x1e, - 0xd6, 0xea, 0xb7, 0x05, 0xcd, 0xec, 0x62, 0x7d, 0x98, 0x50, 0xae, 0xe3, - 0x0e, 0x9b, 0x2d, 0x47, 0x20, 0xb1, 0xb7, 0x64, 0x49, 0x9c, 0xaf, 0xfb, - 0x04, 0x5f, 0xff, 0xef, 0x3f, 0xa3, 0x1d, 0x28, 0x14, 0x8e, 0xbf, 0x40, - 0xf6, 0x76, 0xaf, 0x79, 0x12, 0x2e, 0x77, 0x86, 0x3c, 0xd7, 0xdf, 0xbd, - 0xaf, 0x2c, 0xdc, 0x0d, 0x23, 0x3d, 0x9e, 0xa2, 0x67, 0x08, 0x03, 0xc6, - 0x20, 0x22, 0xa9, 0xf8, 0xda, 0x8a, 0x40, 0x18, 0x2c, 0xda, 0xdf, 0xc3, - 0x56, 0x2b, 0xa1, 0x6c, 0x75, 0x08, 0x34, 0x17, 0x33, 0xb7, 0xac, 0xbb, - 0x9e, 0x22, 0xbc, 0xac, 0x14, 0xe8, 0x27, 0x47, 0xf1, 0x0c, 0x22, 0x9b, - 0xe1, 0xf1, 0x08, 0x63, 0x53, 0xcf, 0x43, 0x82, 0x6d, 0xc5, 0xd1, 0x82, - 0x96, 0x8f, 0x35, 0x56, 0xeb, 0x5c, 0xa5, 0xba, 0xa3, 0x4e, 0x75, 0x85, - 0x9b, 0x17, 0xe2, 0xc4, 0x2f, 0x8e, 0xaf, 0xee, 0x50, 0xac, 0x8c, 0x86, - 0x89, 0xd3, 0xf1, 0x6c, 0xcf, 0xa7, 0xaa, 0xc1, 0x96, 0xe5, 0x67, 0x37, - 0x52, 0xec, 0x75, 0x24, 0xf6, 0xce, 0xab, 0x2b, 0xa6, 0xfb, 0x7b, 0x31, - 0xbd, 0x45, 0x6a, 0x9f, 0x23, 0xfc, 0x88, 0x55, 0x8d, 0x6b, 0x9e, 0x4d, - 0x0c, 0x9d, 0xba, 0x25, 0x62, 0x11, 0x38, 0xef, 0x4d, 0xd5, 0x93, 0x40, - 0x23, 0xc6, 0xef, 0x5e, 0xfe, 0x25, 0x35, 0x29, 0xca, 0x39, 0x05, 0x85, - 0x3a, 0x90, 0xa5, 0x89, 0x85, 0xc1, 0xeb, 0x41, 0x4e, 0x89, 0xab, 0x20, - 0xbd, 0xc8, 0x1e, 0x6f, 0x8d, 0xec, 0xd7, 0x49, 0x36, 0x33, 0xa2, 0xa6, - 0xb6, 0x9f, 0x17, 0x6a, 0x50, 0xca, 0xe7, 0xc9, 0x49, 0xb0, 0x9c, 0xba, - 0x47, 0x42, 0xd4, 0x00, 0xd9, 0x8c, 0x9c, 0x05, 0x56, 0xa5, 0x54, 0x76, - 0xdb, 0xbb, 0x65, 0x8f, 0xe2, 0x97, 0x72, 0xda, 0x6d, 0x2c, 0x98, 0xd7, - 0x84, 0xcf, 0x8d, 0x18, 0x25, 0xbf, 0xe3, 0x43, 0x6f, 0xf0, 0x29, 0xb9, - 0xc4, 0x72, 0xa0, 0x55, 0xeb, 0xf7, 0xbb, 0x47, 0x3b, 0xf8, 0xfb, 0x0e, - 0x19, 0x3f, 0x06, 0xbc, 0x8d, 0x58, 0xe0, 0x58, 0xb9, 0xa7, 0x12, 0xa5, - 0x1a, 0x16, 0x26, 0x82, 0x8f, 0x70, 0xde, 0x03, 0x8b, 0xdf, 0x59, 0xd6, - 0xab, 0xe8, 0xa3, 0xe1, 0xcc, 0x38, 0xf0, 0x3e, 0xca, 0x21, 0x2c, 0xf4, - 0x44, 0xec, 0xf2, 0x54, 0x12, 0xfd, 0xf7, 0x00, 0xbd, 0x1e, 0xe2, 0xdb, - 0x55, 0x68, 0xf2, 0xeb, 0x84, 0xa7, 0x73, 0x03, 0x5f, 0xa9, 0x76, 0x68, - 0xd3, 0x57, 0x28, 0xe5, 0x25, 0xba, 0xe8, 0xe4, 0x2f, 0x65, 0x11, 0x98, - 0xc7, 0x4e, 0xb7, 0xe0, 0x9a, 0xbd, 0x41, 0xb7, 0xe5, 0x47, 0x5e, 0xba, - 0x72, 0x2c, 0xa8, 0xb2, 0xaa, 0xe1, 0xe0, 0x3b, 0xc6, 0xbc, 0xca, 0x9e, - 0xfa, 0xee, 0xee, 0xba, 0xae, 0x16, 0xb8, 0x74, 0xdf, 0x19, 0xf6, 0x21, - 0x9b, 0xe4, 0xbc, 0xef, 0x72, 0xb5, 0x39, 0xaa, 0x75, 0x18, 0x05, 0xd3, - 0x15, 0xe8, 0x45, 0xa8, 0x9e, 0x95, 0x51, 0x67, 0x77, 0x03, 0xa2, 0x2d, - 0x4f, 0xfa, 0x2d, 0xd8, 0x7e, 0xe1, 0x7f, 0xbb, 0x62, 0x92, 0x56, 0x53, - 0xb0, 0x77, 0xf1, 0xbd, 0x58, 0x7e, 0x5d, 0xdf, 0xaa, 0xa2, 0xec, 0x29, - 0x5b, 0xc0, 0x24, 0x2b, 0x62, 0x20, 0x3d, 0x92, 0xbb, 0x9e, 0x86, 0x5c, - 0x22, 0x05, 0xac, 0x3c, 0xde, 0x21, 0xce, 0xfc, 0xc8, 0x96, 0x37, 0xb3, - 0xa6, 0x11, 0x44, 0xd0, 0xd3, 0xcc, 0x83, 0x85, 0x3b, 0x6c, 0xa6, 0xbd, - 0x1f, 0x55, 0x4a, 0x1d, 0x6b, 0x9d, 0xad, 0xa0, 0x14, 0xf9, 0xa8, 0x48, - 0xac, 0x5d, 0x0b, 0x43, 0x2f, 0x27, 0xc4, 0x83, 0x70, 0x67, 0x68, 0x1c, - 0x69, 0x98, 0xd5, 0x87, 0x51, 0xca, 0x5a, 0x9a, 0xeb, 0x73, 0x44, 0x18, - 0x37, 0x2b, 0x30, 0xbe, 0x3b, 0x19, 0x53, 0xb2, 0xe1, 0x23, 0xbf, 0xa0, - 0x13, 0x24, 0xe7, 0x4c, 0x25, 0xdd, 0x62, 0xa9, 0x42, 0xa4, 0x76, 0x7e, - 0x2b, 0xd5, 0xd8, 0xb6, 0x8a, 0xba, 0xb0, 0x6a, 0xd4, 0xc2, 0x57, 0x18, - 0x1e, 0xfd, 0xc6, 0xfc, 0x30, 0x6c, 0x7a, 0x3e, 0x8b, 0x65, 0x93, 0xca, - 0xab, 0x10, 0xfb, 0xbb, 0x22, 0x18, 0xfb, 0x4b, 0x63, 0x85, 0x57, 0x4c, - 0x72, 0xa9, 0x44, 0x72, 0x3f, 0xcd, 0xbe, 0x22, 0xc9, 0x05, 0xa0, 0xee, - 0x79, 0x0e, 0xde, 0x37, 0x55, 0xd4, 0xca, 0xae, 0xc8, 0x4f, 0x38, 0xe0, - 0xe9, 0x80, 0x08, 0x85, 0x48, 0x07, 0x97, 0xdb, 0xfa, 0xc3, 0x8e, 0xe1, - 0xf0, 0x71, 0x24, 0xbb, 0x33, 0x2e, 0xab, 0x21, 0x36, 0x68, 0x73, 0x7e, - 0x3e, 0x78, 0xc3, 0x90, 0x40, 0xc0, 0x85, 0xbf, 0x21, 0xa7, 0xb7, 0xcc, - 0xb8, 0xf2, 0x96, 0xdf, 0x60, 0x97, 0x2b, 0x58, 0x53, 0x80, 0xa7, 0xfe, - 0x11, 0x33, 0x51, 0x12, 0xbd, 0xd9, 0x0a, 0xd6, 0x6b, 0x07, 0x03, 0x65, - 0xac, 0x6c, 0x6e, 0x70, 0x63, 0x75, 0x37, 0xbd, 0x08, 0x77, 0xca, 0x32, - 0x57, 0xdb, 0x14, 0x2d, 0xf2, 0x89, 0xe8, 0x9e, 0x5d, 0x27, 0x92, 0xa2, - 0xf0, 0x7c, 0x51, 0xca, 0x5a, 0x02, 0x75, 0xe9, 0x77, 0xcd, 0xd8, 0x79, - 0x40, 0x91, 0xba, 0x1e, 0xe9, 0xbf, 0x20, 0x86, 0xd1, 0x01, 0xb8, 0x4c, - 0x7b, 0x6e, 0xbd, 0x4e, 0x7f, 0x86, 0xf3, 0x77, 0x64, 0x34, 0x6c, 0x2f, - 0x62, 0xb9, 0xbf, 0x0b, 0x17, 0x94, 0x85, 0xf4, 0xcb, 0x22, 0x97, 0x0e, - 0xdc, 0xfd, 0x0f, 0x76, 0x88, 0x4e, 0x43, 0x67, 0x56, 0xad, 0x3e, 0x90, - 0x47, 0xfb, 0x66, 0x83, 0x80, 0x9e, 0x5f, 0x6f, 0xef, 0x6e, 0xca, 0x4c, - 0xec, 0x6f, 0x11, 0x7b, 0x48, 0xb0, 0xe0, 0xbd, 0x90, 0x9d, 0x57, 0xcd, - 0x52, 0xf2, 0xc5, 0xec, 0x9f, 0x2c, 0x8a, 0x97, 0x7f, 0xbb, 0xed, 0x81, - 0x8e, 0x89, 0xf6, 0xe2, 0x0d, 0x44, 0x27, 0xe6, 0xf0, 0xcf, 0x74, 0xa0, - 0x1a, 0x97, 0xf0, 0xe1, 0xf3, 0x96, 0x53, 0xe3, 0xcf, 0x25, 0xe5, 0x36, - 0x5b, 0xb7, 0x92, 0x32, 0xcb, 0x3a, 0x9b, 0x96, 0xe2, 0x9e, 0x13, 0x90, - 0x7e, 0x2c, 0x6e, 0x57, 0x20, 0x05, 0xb5, 0x71, 0x18, 0x06, 0x5a, 0x93, - 0xb4, 0xe0, 0x47, 0xaa, 0xdb, 0x05, 0x88, 0x43, 0x6e, 0x17, 0x84, 0x31, - 0x86, 0xdb, 0xc3, 0x1e, 0x7b, 0x24, 0x55, 0x8f, 0x77, 0xc3, 0x3b, 0xaa, - 0x91, 0x4f, 0xc7, 0x48, 0x54, 0xe7, 0xd1, 0x06, 0xf0, 0x14, 0x63, 0x5c, - 0x7a, 0x7a, 0x74, 0x18, 0xab, 0xbd, 0x3a, 0xc7, 0xd9, 0x01, 0x99, 0xe8, - 0x4e, 0xd1, 0x5a, 0xe6, 0xca, 0x65, 0x73, 0x66, 0x05, 0x8c, 0x72, 0xaa, - 0x5b, 0x01, 0x26, 0x35, 0x80, 0xe2, 0x2f, 0x6a, 0xe8, 0xfb, 0x2d, 0x39, - 0x50, 0xc3, 0x49, 0x81, 0x47, 0x61, 0xe0, 0x61, 0xdd, 0xf0, 0x19, 0x4a, - 0x57, 0x47, 0x56, 0x18, 0xe2, 0xd6, 0x60, 0xf8, 0x99, 0x5f, 0x73, 0x6e, - 0x65, 0xad, 0x41, 0xe0, 0xfd, 0x47, 0xc6, 0x08, 0x3f, 0xea, 0xca, 0x7c, - 0xab, 0xcd, 0x6d, 0x26, 0xc0, 0x5f, 0x16, 0x65, 0x24, 0xcf, 0x51, 0x5b, - 0xb5, 0x5c, 0x2c, 0xc9, 0xee, 0xce, 0x95, 0x6b, 0xa1, 0x39, 0xef, 0x6e, - 0xdd, 0x68, 0x61, 0xda, 0x50, 0x66, 0xaa, 0xae, 0xe6, 0x5b, 0x0b, 0xf8, - 0xc6, 0xa9, 0x7b, 0x63, 0x88, 0x65, 0xc3, 0xeb, 0xe7, 0x9f, 0x32, 0x08, - 0xc5, 0xbf, 0x80, 0xeb, 0xc3, 0x5f, 0xff, 0x17, 0xdf, 0xdb, 0x18, 0x41, - 0x54, 0x81, 0x56, 0x92, 0x42, 0x80, 0xc4, 0xfb, 0x82, 0x99, 0x7d, 0xc1, - 0xf9, 0xee, 0xdd, 0xd6, 0xbd, 0x09, 0x38, 0x5d, 0x6a, 0x1c, 0x23, 0x21, - 0x50, 0x47, 0x6f, 0xe7, 0x60, 0x6d, 0x82, 0x71, 0x46, 0x53, 0xce, 0x77, - 0x28, 0x91, 0x5a, 0x0e, 0xd7, 0x60, 0x32, 0x1d, 0x5c, 0x3b, 0xcf, 0x0d, - 0x2a, 0x15, 0xdc, 0x36, 0x74, 0xc4, 0x5a, 0xd3, 0x94, 0xf7, 0x10, 0x02, - 0x31, 0x8b, 0xca, 0x5a, 0x83, 0xcd, 0xa0, 0x0a, 0xcf, 0x0e, 0x4e, 0xdd, - 0x53, 0xd8, 0xb8, 0x5a, 0xb6, 0x7c, 0xfa, 0x43, 0xf8, 0x75, 0x50, 0x16, - 0xd2, 0x65, 0xd9, 0x23, 0x66, 0x2e, 0x26, 0xc5, 0x01, 0x13, 0x74, 0x44, - 0x7e, 0xb5, 0xc4, 0xca, 0xe2, 0x2e, 0x37, 0x0f, 0xea, 0xec, 0xe9, 0x32, - 0x6d, 0xf7, 0xbb, 0x51, 0xb6, 0x74, 0xc8, 0xc1, 0xce, 0x80, 0x15, 0x7f, - 0x5f, 0x1b, 0x16, 0xa7, 0x16, 0x94, 0x5f, 0xd0, 0xc4, 0x4e, 0x76, 0x51, - 0x49, 0x78, 0x50, 0xb2, 0x64, 0x3a, 0xd4, 0x66, 0xc1, 0x5f, 0xe6, 0x5d, - 0x76, 0x0d, 0x42, 0xe8, 0xae, 0xbd, 0xc8, 0xd4, 0xc5, 0x4b, 0xef, 0xc3, - 0x06, 0x1a, 0x51, 0x56, 0x99, 0x14, 0xe7, 0x1e, 0x02, 0x93, 0x20, 0x91, - 0x2a, 0x6d, 0x1b, 0x0b, 0x70, 0xf0, 0x61, 0x13, 0x87, 0x44, 0xe1, 0xfe, - 0x20, 0xdc, 0x7c, 0x42, 0x98, 0xb2, 0xe5, 0x59, 0x9e, 0xc5, 0xd5, 0xbc, - 0x75, 0xce, 0xaa, 0x2b, 0x48, 0x48, 0xcd, 0xd8, 0xa1, 0x9a, 0x56, 0x61, - 0xb4, 0x3a, 0x9f, 0xb4, 0x12, 0x0f, 0x75, 0x41, 0x6f, 0xe4, 0x94, 0x66, - 0xa9, 0x14, 0xed, 0x66, 0x51, 0xf0, 0xf6, 0xd5, 0xea, 0xe7, 0xbb, 0x0d, - 0xbc, 0x7d, 0x80, 0xbd, 0x59, 0x4d, 0x62, 0x6c, 0x40, 0x82, 0x0b, 0xd2, - 0x5e, 0x77, 0x48, 0x3b, 0x37, 0x4c, 0x4f, 0x3c, 0x21, 0x99, 0x90, 0x89, - 0x00, 0xb9, 0xa1, 0x61, 0x5a, 0xaf, 0x73, 0x8b, 0x8f, 0x15, 0xfa, 0x9a, - 0x92, 0xbd, 0x97, 0x92, 0x57, 0x07, 0x3b, 0xe7, 0x9f, 0x7c, 0x6a, 0xf9, - 0xd1, 0x2e, 0x3b, 0x56, 0x3f, 0xed, 0x77, 0xf8, 0xda, 0x94, 0x40, 0x7e, - 0xb7, 0x1f, 0x46, 0x74, 0xdd, 0x1f, 0x5a, 0xa1, 0xdc, 0x83, 0xf9, 0xe2, - 0xbb, 0xe5, 0xd5, 0x47, 0x13, 0x69, 0x82, 0xec, 0xaa, 0x08, 0xb1, 0x73, - 0x02, 0x1f, 0xdd, 0x25, 0x4a, 0x68, 0x1d, 0xc3, 0x3a, 0x77, 0x5b, 0x97, - 0xb0, 0xcb, 0xf9, 0xb1, 0xb4, 0x67, 0x51, 0x68, 0x94, 0xb6, 0x6c, 0x94, - 0x9b, 0x99, 0x41, 0x5f, 0x3b, 0x70, 0x5b, 0x72, 0x25, 0xf5, 0x97, 0x3e, - 0x09, 0x85, 0x22, 0xe4, 0x55, 0xd5, 0xb6, 0x9f, 0x51, 0x74, 0x18, 0x5c, - 0xf2, 0xfa, 0x6b, 0x93, 0xd7, 0x8a, 0xa4, 0x18, 0xd6, 0xf8, 0x28, 0x08, - 0x70, 0x69, 0xb5, 0x4e, 0xe6, 0xd0, 0xf3, 0x48, 0xc8, 0x54, 0x66, 0x50, - 0x1d, 0xb0, 0xd7, 0x93, 0x12, 0xbc, 0x30, 0x75, 0x2d, 0x0e, 0x33, 0xb3, - 0xc0, 0xe9, 0x44, 0x70, 0xa2, 0x22, 0xc8, 0xcf, 0x52, 0x13, 0x99, 0xbd, - 0xf7, 0x7e, 0xa8, 0xae, 0x1a, 0xa5, 0x4e, 0xec, 0x7f, 0x62, 0x03, 0x8f, - 0xaf, 0x93, 0x8f, 0x54, 0xfb, 0xb4, 0x92, 0x64, 0x1a, 0xfc, 0xdb, 0x97, - 0x9e, 0x71, 0x4a, 0xb4, 0x9a, 0x75, 0x55, 0x71, 0xde, 0xde, 0x31, 0x10, - 0x2c, 0x5e, 0xde, 0xa7, 0x2d, 0xb1, 0x6b, 0xae, 0xdf, 0x48, 0x54, 0xb8, - 0x59, 0x76, 0x34, 0x7b, 0x12, 0x1d, 0x01, 0xd2, 0x41, 0x31, 0x39, 0xdc, - 0xdd, 0xf3, 0xd5, 0x9b, 0x88, 0xdd, 0x9c, 0x9e, 0x35, 0xc6, 0x2c, 0xbe, - 0xe5, 0x88, 0x32, 0x0a, 0x58, 0xaf, 0x85, 0x3f, 0x6e, 0xf0, 0x1a, 0xf3, - 0x0b, 0x37, 0x72, 0xfc, 0x9f, 0x2c, 0x41, 0x35, 0x63, 0xfc, 0xc4, 0x8a, - 0x2b, 0x10, 0xd0, 0x84, 0x4a, 0xad, 0x6a, 0x13, 0xb2, 0xb5, 0xd8, 0x46, - 0x0a, 0x0b, 0xd3, 0x83, 0xe7, 0x58, 0x07, 0xf7, 0x1a, 0x94, 0xd4, 0x98, - 0x92, 0xbd, 0x52, 0x15, 0xfe, 0xaa, 0x6d, 0x89, 0xd0, 0x1e, 0x8d, 0x3c, - 0x5a, 0x87, 0xc8, 0xfd, 0x46, 0x39, 0xcb, 0x84, 0x3d, 0xec, 0x05, 0x39, - 0xd4, 0x3c, 0x0d, 0x03, 0x47, 0xba, 0xae, 0xd6, 0x7a, 0x8b, 0x2a, 0x6b, - 0x1c, 0xfe, 0x36, 0x8b, 0x83, 0xc1, 0x7b, 0x6b, 0xc0, 0xb1, 0xc8, 0x87, - 0x35, 0xb3, 0x82, 0x0b, 0x20, 0x7c, 0x50, 0x14, 0x31, 0x14, 0x31, 0x16, - 0x48, 0x18, 0xb5, 0xff, 0x35, 0x87, 0xc7, 0x24, 0x98, 0xb5, 0x47, 0xaf, - 0x86, 0x31, 0xdf, 0xc1, 0x58, 0xf8, 0x54, 0xbc, 0x62, 0x93, 0xc3, 0x46, - 0x94, 0x90, 0xd8, 0x61, 0xac, 0x47, 0x37, 0xa4, 0x50, 0xe0, 0x1c, 0x61, - 0x74, 0x66, 0xd3, 0xa8, 0x88, 0x14, 0x74, 0x79, 0x35, 0x49, 0x3d, 0x23, - 0xd6, 0x63, 0x88, 0x7a, 0xa5, 0x96, 0x1d, 0xff, 0x82, 0x1f, 0x5a, 0x91, - 0xa3, 0xbe, 0xa9, 0x59, 0xee, 0x93, 0xe8, 0x1f, 0x8e, 0xb5, 0x52, 0x68, - 0xbf, 0xc1, 0x10, 0x14, 0x30, 0x71, 0x4a, 0x5e, 0xa1, 0xc6, 0x84, 0xd6, - 0x93, 0x17, 0x35, 0x34, 0x83, 0x55, 0x0e, 0x2c, 0xd1, 0x9c, 0x9e, 0xe3, - 0x44, 0x67, 0x00, 0x00, 0xd1, 0xb4, 0xf8, 0x93, 0x96, 0xf8, 0x3d, 0x74, - 0x89, 0x87, 0xc0, 0x69, 0x6d, 0xf4, 0x48, 0x66, 0x55, 0xf2, 0xa0, 0x01, - 0x2c, 0x93, 0xf5, 0x50, 0xbf, 0x36, 0x29, 0x02, 0x77, 0xec, 0x52, 0x7f, - 0x6f, 0x30, 0xe8, 0xda, 0x36, 0x05, 0x5e, 0x1c, 0x36, 0xbe, 0xa7, 0xcf, - 0x07, 0xea, 0x43, 0x0c, 0xee, 0x18, 0xa0, 0xb3, 0x80, 0xa1, 0xc4, 0xbe, - 0x1d, 0x98, 0xcc, 0x69, 0xa1, 0x5d, 0x64, 0xaa, 0xd7, 0x82, 0xe3, 0x1f, - 0xd1, 0x70, 0x09, 0xb9, 0xf0, 0xc1, 0x2a, 0x11, 0x71, 0x36, 0x70, 0x97, - 0x34, 0x0a, 0x38, 0x08, 0xb7, 0x9a, 0x94, 0xe7, 0x96, 0x73, 0x90, 0xc8, - 0xf6, 0x4b, 0x82, 0x56, 0x32, 0x9f, 0x70, 0x7b, 0x27, 0xcc, 0x5e, 0x89, - 0x3b, 0x36, 0x7f, 0xa3, 0x46, 0xdc, 0x20, 0xe0, 0x6f, 0x75, 0x55, 0xfb, - 0x6e, 0xf1, 0x6f, 0xff, 0x54, 0x22, 0xc0, 0x8c, 0xcd, 0x8c, 0x93, 0x57, - 0x00, 0x01, 0x03, 0xe5, 0x9c, 0x3e, 0x13, 0xce, 0xc8, 0xec, 0xdf, 0xfe, - 0x57, 0x55, 0xc4, 0xbd, 0xa0, 0x3c, 0xd5, 0x2c, 0x35, 0xce, 0x25, 0x99, - 0xd4, 0x7a, 0x79, 0xc9, 0x00, 0xdd, 0xae, 0x39, 0x23, 0x91, 0x5d, 0xb6, - 0xe3, 0x43, 0xf8, 0xa5, 0xa5, 0xd9, 0x1d, 0x7a, 0x98, 0x14, 0xbc, 0x52, - 0x85, 0x22, 0x9e, 0x3e, 0x71, 0x8d, 0x31, 0x9d, 0x79, 0x6a, 0x13, 0xf3, - 0xed, 0x47, 0x1f, 0x99, 0x50, 0x25, 0x68, 0x52, 0xcb, 0x38, 0x8b, 0x84, - 0xf6, 0xc2, 0x88, 0x4e, 0x0a, 0xd1, 0x5d, 0x04, 0xb3, 0xca, 0xe1, 0xee, - 0xe6, 0x7b, 0x03, 0x68, 0x32, 0x35, 0xf1, 0xb3, 0xbb, 0x5d, 0x81, 0x29, - 0x0c, 0x5d, 0xf3, 0x1e, 0x65, 0xa2, 0x5f, 0x8c, 0xb5, 0xbe, 0x4a, 0x0c, - 0x6a, 0x4e, 0x45, 0x0b, 0xa0, 0x0d, 0x73, 0xee, 0xfc, 0xe2, 0xa3, 0x97, - 0xb6, 0x2a, 0x22, 0x86, 0x9f, 0xa8, 0x25, 0x9e, 0xef, 0xae, 0xb6, 0x8d, - 0xbf, 0xa5, 0x08, 0x12, 0xea, 0x7f, 0x15, 0xa8, 0x29, 0xb3, 0xcf, 0x6a, - 0xb9, 0x79, 0xc4, 0xbc, 0xfa, 0xb8, 0xba, 0x46, 0xf6, 0x2b, 0xed, 0xaa, - 0x96, 0x6d, 0x31, 0x0d, 0x28, 0x9d, 0x49, 0xd0, 0x5f, 0x73, 0x18, 0x4b, - 0x9f, 0xfa, 0xf0, 0xc9, 0xe0, 0x32, 0xab, 0xc1, 0xb3, 0x87, 0x0f, 0x70, - 0x61, 0x1c, 0x81, 0xf4, 0x9c, 0xa3, 0xa6, 0x3e, 0x4f, 0x19, 0xfb, 0x0f, - 0x76, 0xcf, 0x52, 0x07, 0x40, 0x07, 0xa5, 0xc0, 0xd3, 0x2a, 0x19, 0x07, - 0xcc, 0xaf, 0x31, 0x6f, 0x3e, 0xf8, 0x13, 0xbb, 0x51, 0xd1, 0x5e, 0xb6, - 0xf9, 0xcb, 0xaa, 0x04, 0xf2, 0xe1, 0x4d, 0x6e, 0x85, 0x35, 0x50, 0x0f, - 0x9d, 0x9d, 0x49, 0x61, 0x4d, 0x76, 0x01, 0xc9, 0x0d, 0x00, 0x2c, 0x82, - 0xfa, 0x59, 0xc7, 0x57, 0xd7, 0x74, 0xc3, 0x34, 0xb8, 0x31, 0x6f, 0x44, - 0x10, 0x72, 0x9c, 0x3b, 0x87, 0x82, 0x5b, 0xe9, 0xf9, 0x9a, 0x44, 0xd2, - 0xc7, 0xd2, 0xb7, 0x47, 0x13, 0xf2, 0xfa, 0x1e, 0x9d, 0xf6, 0x27, 0x13, - 0x43, 0x21, 0xd3, 0x33, 0x16, 0x0e, 0xb1, 0xe4, 0x01, 0xc2, 0x48, 0x27, - 0x20, 0x59, 0x37, 0x29, 0xf6, 0xb6, 0x1e, 0x7f, 0x02, 0x22, 0xc0, 0x8c, - 0xcd, 0x8c, 0x93, 0x57, 0x00, 0xd9, 0x03, 0xe5, 0x9c, 0x3e, 0x13, 0xce, - 0xc8, 0xec, 0xdf, 0xfe, 0x57, 0x55, 0xc4, 0xbd, 0xa0, 0x3c, 0xd5, 0x2c, - 0x35, 0xce, 0x25, 0x99, 0x37, 0xca, 0x53, 0x36, 0xe8, 0xd4, 0xfc, 0x7a, - 0x86, 0xb1, 0x86, 0xd9, 0x0e, 0xe8, 0x11, 0xf8, 0xc5, 0x46, 0x19, 0xb1, - 0x05, 0xd3, 0xcd, 0x16, 0xe3, 0xbe, 0x50, 0x5b, 0xca, 0x5f, 0x02, 0x53, - 0x62, 0xb1, 0x84, 0xc2, 0x2a, 0xd2, 0x9a, 0x17, 0xf7, 0x9f, 0x77, 0xe3, - 0x84, 0x55, 0xed, 0x43, 0xb2, 0x0c, 0x21, 0x67, 0x49, 0x72, 0x7c, 0x76, - 0xdb, 0x7a, 0x73, 0xaf, 0x50, 0x30, 0x83, 0xb7, 0x18, 0x24, 0x91, 0x03, - 0x45, 0x5e, 0xc9, 0x86, 0xc5, 0xc8, 0xf5, 0x4b, 0xa9, 0x42, 0x1b, 0xeb, - 0xb4, 0xae, 0xe2, 0xcc, 0x41, 0xaa, 0x07, 0x35, 0xde, 0x76, 0x12, 0xaa, - 0xf6, 0x7a, 0x73, 0x02, 0x70, 0xf3, 0xf7, 0xaf, 0xe4, 0xe3, 0x77, 0xbb, - 0x45, 0x2f, 0x2d, 0xf7, 0xf9, 0x84, 0x47, 0xa9, 0xe5, 0x36, 0x30, 0x0b, - 0x66, 0x07, 0xa2, 0x24, 0xb2, 0xc7, 0x1e, 0xb8, 0x09, 0x5f, 0xa7, 0x8f, - 0x65, 0xcf, 0xc1, 0x0b, 0xa3, 0xbe, 0xe5, 0x5f, 0x07, 0x59, 0x4d, 0x33, - 0xd8, 0x52, 0x75, 0x04, 0x2b, 0xb6, 0xbd, 0xd8, 0x76, 0x61, 0x97, 0xfd, - 0x37, 0x90, 0xb5, 0x5f, 0x7b, 0x34, 0x29, 0x95, 0x74, 0xef, 0x7d, 0xa1, - 0x0b, 0x62, 0x7e, 0x6b, 0xd4, 0xb9, 0x2d, 0x3b, 0x4f, 0x52, 0xa4, 0xb6, - 0xe7, 0x96, 0x10, 0x57, 0x53, 0xc4, 0xb5, 0x18, 0x4a, 0xf5, 0xfa, 0x21, - 0x17, 0xa7, 0xec, 0x18, 0x15, 0x91, 0x4f, 0x35, 0x4b, 0x64, 0x94, 0x08, - 0x2b, 0x74, 0x86, 0xc0, 0xd3, 0xb5, 0xca, 0x48, 0xcf, 0x16, 0x2f, 0x3f, - 0xef, 0x8c, 0x3f, 0xde, 0x51, 0xe3, 0xa9, 0xd5, 0xb9, 0xca, 0xb6, 0x09, - 0xed, 0x46, 0x08, 0x0a, 0x44, 0x00, 0x02, 0x61, 0x1a, 0xe1, 0xf6, 0xd4, - 0xdc, 0x53, 0x3b, 0x3c, 0x5a, 0xa7, 0x26, 0x01, 0xca, 0x3b, 0x7f, 0x0e, - 0x76, 0xcf, 0x52, 0x07, 0x76, 0x07, 0xa5, 0xc0, 0xd3, 0x2a, 0x19, 0x07, - 0xcc, 0xaf, 0x31, 0x6f, 0x3e, 0xf8, 0x13, 0xbb, 0x51, 0xd1, 0x5e, 0xb6, - 0xc1, 0xd7, 0xdf, 0x5e, 0x12, 0x6c, 0x31, 0xdb, 0xf4, 0x5d, 0x07, 0x8b, - 0xcb, 0xc7, 0xf0, 0xe4, 0x4c, 0x53, 0x3c, 0x7a, 0x6c, 0xc7, 0x44, 0xfe, - 0x8b, 0x63, 0xc0, 0xdb, 0x13, 0x89, 0x06, 0xbf, 0x29, 0x79, 0xd3, 0xf3, - 0x58, 0x5d, 0x34, 0x45, 0x55, 0xb7, 0x99, 0x75, 0xec, 0x52, 0x32, 0x30, - 0xe9, 0x34, 0xb0, 0x34, 0x1b, 0x8a, 0xa1, 0x6f, 0x3c, 0x7d, 0x30, 0x10, - 0x1e, 0x7b, 0x1f, 0xea, 0x44, 0xc8, 0x7b, 0x67, 0x80, 0x78, 0x05, 0xf6, - 0xa8, 0xd3, 0x42, 0xbf, 0x89, 0x21, 0xa9, 0x61, 0xb7, 0x16, 0x75, 0xb2, - 0xbb, 0x85, 0x81, 0x29, 0x0c, 0x5d, 0xf3, 0x1e, 0x65, 0xa2, 0x5f, 0x8c, - 0xb5, 0xbe, 0x4a, 0x0c, 0x6a, 0x4e, 0x45, 0x0b, 0xa0, 0x0d, 0x73, 0xee, - 0xfc, 0xe2, 0xa3, 0x97, 0x1d, 0x3d, 0x94, 0x65, 0xd1, 0x38, 0x3c, 0xe2, - 0xe9, 0x34, 0xcf, 0x8f, 0xa4, 0x0c, 0xae, 0x15, 0x14, 0x38, 0x10, 0xb8, - 0x0f, 0xfa, 0x8a, 0x2c, 0x3e, 0xa1, 0x09, 0x6b, 0xe9, 0x6a, 0x8c, 0x58, - 0x3f, 0xbf, 0x77, 0x8a, 0xa0, 0x7b, 0x28, 0x4d, 0xab, 0x51, 0xef, 0x0e, - 0x1f, 0xe3, 0x17, 0xac, 0x9f, 0xfa, 0xf0, 0xc9, 0xe0, 0x32, 0xab, 0xc1, - 0xb0, 0xdf, 0x0f, 0x70, 0x61, 0x1c, 0x81, 0xe7, 0x9c, 0xa3, 0xa6, 0x3e, - 0x4f, 0x19, 0xfb, 0x0f, 0x76, 0xcf, 0x52, 0x07, 0x40, 0x07, 0xa5, 0xc0, - 0xd3, 0x2a, 0x19, 0x07, 0xcc, 0xaf, 0x31, 0x6f, 0x3e, 0xf8, 0x13, 0xbb, - 0x51, 0xd1, 0x5e, 0xb6, 0x8d, 0x9a, 0x58, 0x53, 0xe3, 0x53, 0x4d, 0x64, - 0x41, 0xc0, 0x43, 0xb9, 0x49, 0xd2, 0x80, 0xda, 0x4d, 0x76, 0x01, 0xc9, - 0x0d, 0x00, 0x2c, 0x82, 0xfa, 0x59, 0xc7, 0x57, 0xd7, 0x74, 0xc3, 0x24, - 0x0f, 0x3f, 0x6d, 0xa7, 0xb8, 0x26, 0xf3, 0x1c, 0xc7, 0x9f, 0xb3, 0x1c, - 0x40, 0xe7, 0x9d, 0x9e, 0xca, 0x16, 0x24, 0x37, 0x0b, 0xbe, 0x64, 0x53, - 0x07, 0x78, 0x30, 0xe7, 0x41, 0xe6, 0x02, 0xf6, 0x16, 0x0e, 0xb1, 0xf4, - 0x01, 0xc2, 0x48, 0x27, 0x20, 0x59, 0x37, 0x29, 0xf6, 0xb6, 0x1e, 0x7f, - 0x02, 0x22, 0xc0, 0x8c, 0xcd, 0x8c, 0x93, 0x57, 0x00, 0xd9, 0x03, 0xe5, - 0x9c, 0x3e, 0x13, 0xce, 0xc8, 0xec, 0xdf, 0xfe, 0x57, 0x55, 0xc4, 0xbd, - 0xa0, 0x3c, 0xd5, 0x2c, 0x35, 0xce, 0x25, 0x99, 0x7a, 0xec, 0xa9, 0xf3, - 0x9e, 0x0d, 0xfc, 0xbf, 0x3e, 0x05, 0x35, 0xdf, 0xdc, 0xcf, 0x2a, 0x30, - 0xc5, 0x46, 0x19, 0xa1, 0x05, 0xd3, 0xcd, 0x16, 0xe3, 0xbe, 0x50, 0x5b, - 0xca, 0x5f, 0x02, 0x53, 0xc0, 0x86, 0xb9, 0x37, 0x54, 0x9e, 0x4d, 0xa1, - 0xbd, 0xbd, 0x63, 0x8e, 0xa7, 0x38, 0xcc, 0xdf, 0xf0, 0x59, 0x72, 0x43, - 0x4a, 0x78, 0xe4, 0x70, 0x39, 0xee, 0x20, 0xeb, 0xa1, 0x48, 0x60, 0x93, - 0x18, 0x24, 0x91, 0x03, 0x45, 0x5e, 0xc9, 0x86, 0xc5, 0xc8, 0xf5, 0x4b, - 0xa9, 0x9a, 0x1b, 0xeb, 0xb4, 0xae, 0xe2, 0xcc, 0x41, 0xaa, 0x07, 0x35, - 0xde, 0x76, 0x12, 0xaa, 0xf6, 0x7a, 0x73, 0x02, 0xb1, 0x7f, 0x6c, 0x1d, - 0x08, 0xd5, 0xa7, 0x40, 0x1f, 0x83, 0xd8, 0xd1, 0x59, 0xb2, 0xa4, 0xfa, - 0x35, 0x28, 0x47, 0x27, 0xcb, 0xc3, 0x7d, 0x01, 0x2b, 0x30, 0x6f, 0xd0, - 0x3b, 0x61, 0xf6, 0x8a, 0x49, 0x19, 0x61, 0xed, 0x1f, 0x82, 0x1f, 0xdb, - 0x2c, 0xba, 0x1b, 0x97, 0x1f, 0x21, 0x2f, 0xc1, 0x00, 0x26, 0xa7, 0x66, - 0x9c, 0xe2, 0x7d, 0xdb, 0xb3, 0xca, 0xe1, 0xee, 0xe6, 0x7b, 0x03, 0x68, - 0x32, 0x35, 0xf1, 0xb3, 0xbb, 0x5d, 0x81, 0x29, 0x0c, 0x5d, 0xf3, 0x1e, - 0x65, 0xa2, 0x5f, 0x8c, 0xb5, 0xbe, 0x4a, 0x0c, 0x6a, 0x4e, 0x45, 0x0b, - 0xa0, 0x0d, 0x73, 0xee, 0xfc, 0xe2, 0xa3, 0x97, 0xc0, 0xc0, 0xaf, 0x0c, - 0x51, 0x79, 0xa3, 0xef, 0x86, 0x0c, 0x35, 0xb0, 0x63, 0x2f, 0x84, 0x23, - 0x65, 0xab, 0x02, 0x2d, 0x49, 0x68, 0x5c, 0xbc, 0x98, 0xd2, 0x40, 0xc4, - 0x63, 0x83, 0xbe, 0x1d, 0x8f, 0x4a, 0xe2, 0x25, 0x5e, 0x4f, 0xf8, 0x38, - 0xaf, 0x98, 0xab, 0xa4, 0x4c, 0x21, 0x82, 0xb6, 0x1c, 0x80, 0x43, 0x1a, - 0x81, 0xd3, 0xb9, 0x0b, 0xa1, 0xb3, 0x95, 0xf5, 0x7b, 0x34, 0x29, 0x95, - 0xa3, 0x2e, 0xec, 0x7d, 0x14, 0xe9, 0x54, 0x3f, 0x70, 0xbe, 0x55, 0x2c, - 0x09, 0xf7, 0x84, 0x88, 0x20, 0xec, 0x4c, 0xa6, 0xac, 0xb2, 0x5e, 0xf0, - 0xaf, 0x3e, 0xbe, 0xcb, 0x83, 0xe5, 0x73, 0xcb, 0x6b, 0x45, 0x7e, 0x00, - 0x9d, 0x96, 0x42, 0x74, 0x24, 0x6f, 0x3f, 0x9d, 0x8d, 0x25, 0xb3, 0x28, - 0xc2, 0x1d, 0x41, 0x3d, 0x78, 0x09, 0x14, 0x77, 0x7a, 0x0e, 0x0a, 0x10, - 0x46, 0x1a, 0x37, 0x14, 0x3f, 0x51, 0xba, 0x84, 0x51, 0xae, 0x8a, 0x28, - 0x9f, 0xb6, 0x9c, 0xfe, 0x5a, 0x3e, 0xd7, 0xd0, 0xec, 0x84, 0x5f, 0x51, - 0xcb, 0xef, 0xf7, 0xed, 0x7d, 0x2d, 0xa1, 0x58, 0xe5, 0x8c, 0x89, 0x5d, - 0x07, 0x79, 0xcb, 0x95, 0x6c, 0x98, 0x0f, 0x7f, 0x0e, 0x16, 0xed, 0xab, - 0xe8, 0x0f, 0x5d, 0x7c, 0x5d, 0x5d, 0xbf, 0xbf, 0x9c, 0x55, 0x7c, 0x36, - 0x4d, 0xbd, 0x32, 0x40, 0xac, 0x81, 0x87, 0x71, 0x9f, 0xf5, 0xf5, 0xa4, - 0xf5, 0xac, 0x7b, 0x0e, 0x56, 0x7a, 0xb1, 0x57, 0x5f, 0x9a, 0x08, 0x28, - 0x30, 0xa9, 0x40, 0x81, 0x2f, 0x15, 0xb0, 0x2a, 0x5e, 0x42, 0x5b, 0x47, - 0x8c, 0x19, 0x2f, 0x01, 0x01, 0x0e, 0xc9, 0xa8, 0x57, 0xa9, 0x51, 0x1e, - 0x24, 0x82, 0xa2, 0x7a, 0x98, 0xda, 0x3d, 0xfe, 0xc1, 0x34, 0x1d, 0x95, - 0xeb, 0x63, 0x30, 0xc7, 0x28, 0xc7, 0xaa, 0xdb, 0xba, 0x52, 0x3a, 0x8d, - 0x9b, 0x49, 0x49, 0x04, 0xf8, 0x26, 0x6d, 0xc7, 0xb7, 0x12, 0x56, 0x51, - 0x77, 0x89, 0xd2, 0x2c, 0xb0, 0xed, 0xa1, 0xbd, 0x9b, 0x89, 0x96, 0x47, - 0xbc, 0x83, 0x9d, 0xfb, 0xd8, 0x2c, 0x6e, 0x98, 0xc2, 0x6f, 0x45, 0x64, - 0xf8, 0xb5, 0xe4, 0xf4, 0xe1, 0xbc, 0xaa, 0x34, 0x70, 0x90, 0x0e, 0x58, - 0x8b, 0x61, 0x25, 0x40, 0x13, 0x59, 0x47, 0xff, 0x47, 0x46, 0xd2, 0x7f, - 0x10, 0xb7, 0xd6, 0xd3, 0xf6, 0x54, 0x71, 0x99, 0x95, 0x24, 0x2b, 0x5f, - 0x20, 0xb2, 0x13, 0x4a, 0xa1, 0x39, 0x98, 0x6e, 0xae, 0xf1, 0xca, 0x4e, - 0xec, 0x32, 0x49, 0x97, 0x0a, 0xa9, 0xdc, 0x7f, 0xa6, 0x39, 0x56, 0x4b, - 0x4c, 0xf3, 0x74, 0x6e, 0x43, 0xc2, 0xd6, 0x99, 0x27, 0x16, 0x23, 0x1e, - 0xd8, 0x4e, 0x09, 0x43, 0xfc, 0xe4, 0x2c, 0xf6, 0x23, 0x22, 0xae, 0x93, - 0xf1, 0x2c, 0x2c, 0x2b, 0xea, 0x71, 0x30, 0x77, 0x1c, 0x48, 0xc2, 0x93, - 0x1c, 0x38, 0x20, 0xac, 0xb1, 0xdd, 0x73, 0x8c, 0xd2, 0x53, 0xba, 0x58, - 0xa8, 0x06, 0x7b, 0xb4, 0xf4, 0x5f, 0x36, 0x00, 0xb8, 0x4b, 0xe8, 0x1e, - 0x61, 0x82, 0xc6, 0x8c, 0x94, 0xc3, 0x93, 0x65, 0xf4, 0x17, 0x20, 0x68, - 0xc3, 0x52, 0xf6, 0x99, 0xbf, 0x03, 0x0e, 0x11, 0x63, 0x31, 0xb8, 0xb6, - 0xe6, 0x3c, 0xc3, 0xc9, 0xce, 0x0b, 0xb0, 0xb3, 0xce, 0x5c, 0x72, 0xe7, - 0x98, 0x01, 0xaa, 0x2a, 0x59, 0x9b, 0x3a, 0x29, 0x0f, 0x8e, 0xfd, 0xd6, - 0xae, 0x47, 0x15, 0xbb, 0x1f, 0x86, 0x25, 0xdd, 0xf7, 0x68, 0x05, 0xdc, - 0x5f, 0x8f, 0x91, 0x6c, 0x3b, 0x15, 0xef, 0x38, 0xf4, 0xae, 0x21, 0x59, - 0xa4, 0xb8, 0x56, 0x40, 0xd5, 0x66, 0xc9, 0x9e, 0x6a, 0x6d, 0x37, 0x99, - 0x1a, 0xf4, 0xed, 0xb7, 0xb0, 0x50, 0xed, 0x7a, 0xe7, 0xbc, 0xf8, 0x3e, - 0xbe, 0x5b, 0x34, 0x01, 0x23, 0x8f, 0x40, 0x05, 0x99, 0x89, 0xf4, 0xa2, - 0x3d, 0x65, 0x00, 0x25, 0x01, 0xd8, 0xe5, 0xaa, 0x66, 0x41, 0x86, 0x3a, - 0xc7, 0x45, 0xe3, 0xc0, 0x91, 0x3b, 0xd3, 0x07, 0xba, 0x4d, 0xe8, 0x6c, - 0x04, 0x6a, 0x4a, 0xc9, 0xc2, 0x4d, 0x1e, 0x45, 0x11, 0xb8, 0xb5, 0x81, - 0xe6, 0x19, 0xad, 0x61, 0x14, 0xdb, 0x22, 0x1d, 0xf9, 0xf1, 0xcc, 0x47, - 0x50, 0x39, 0xa2, 0x91, 0x8c, 0x62, 0xa3, 0x9c, 0x63, 0x39, 0x23, 0x28, - 0x11, 0x28, 0xf9, 0x09, 0x57, 0xc7, 0xf7, 0x1d, 0x84, 0xe7, 0x4d, 0xc6, - 0xa4, 0x13, 0x7c, 0x95, 0x5c, 0xe6, 0x03, 0x2b, 0x52, 0x58, 0x2d, 0x7e, - 0x74, 0x7f, 0x10, 0x02, 0x1d, 0xf3, 0x23, 0x60, 0xa1, 0x64, 0x40, 0xef, - 0x98, 0x49, 0x33, 0x8b, 0x62, 0xc6, 0x54, 0xe3, 0x06, 0x47, 0x1b, 0x2c, - 0x1e, 0x03, 0x08, 0x9e, 0x26, 0x23, 0x2a, 0x0b, 0x65, 0x4c, 0xc8, 0x8b, - 0x04, 0x6d, 0xac, 0xe9, 0xd0, 0x5f, 0xa9, 0x55, 0x4e, 0x6e, 0x06, 0x81, - 0x9e, 0xa8, 0xd4, 0x86, 0x4f, 0x36, 0x34, 0x60, 0xc9, 0xc8, 0xf7, 0x6b, - 0xa3, 0xa2, 0xab, 0xc1, 0x27, 0x82, 0xbe, 0x46, 0x9e, 0x36, 0xc7, 0x2f, - 0x34, 0x6e, 0xc4, 0x56, 0x98, 0xae, 0xce, 0xac, 0x8d, 0xa1, 0x97, 0xa5, - 0xa3, 0x95, 0x92, 0x2d, 0xfb, 0xe5, 0x31, 0x42, 0xa9, 0x26, 0x90, 0xe7, - 0x61, 0xba, 0x96, 0x17, 0x84, 0x5d, 0x74, 0x7b, 0xe6, 0x6e, 0x7c, 0x2f, - 0x17, 0x77, 0xc1, 0x81, 0xb7, 0xf9, 0xee, 0xbb, 0xef, 0x89, 0xbb, 0x8f, - 0x27, 0x81, 0xd5, 0x90, 0x19, 0xeb, 0x38, 0x6a, 0x5f, 0x9b, 0x7d, 0x4e, - 0xc5, 0xe4, 0x35, 0x01, 0x49, 0x15, 0x55, 0x67, 0x41, 0x71, 0xdf, 0x98, - 0x54, 0xbb, 0x27, 0xda, 0xf0, 0xc5, 0x79, 0x79, 0xec, 0x0d, 0x9a, 0x49, - 0xa7, 0x78, 0x03, 0x77, 0x22, 0xd2, 0xe6, 0xc0, 0x0b, 0xe6, 0x21, 0x58, - 0xe3, 0x91, 0x7a, 0x68, 0x38, 0xfb, 0x06, 0xdd, 0x83, 0xb7, 0x58, 0xe5, - 0x07, 0x1c, 0x55, 0x5f, 0xec, 0x0f, 0xe2, 0x52, 0xc2, 0xf1, 0x39, 0x10, - 0xf3, 0x42, 0xc4, 0x6c, 0xed, 0x15, 0xe8, 0x21, 0x72, 0x8b, 0x21, 0x6f, - 0x8d, 0x90, 0x34, 0xc6, 0xb0, 0x7c, 0x2b, 0x8b, 0x4f, 0xc7, 0xd7, 0x8b, - 0x78, 0xe0, 0x3e, 0x69, 0x49, 0xec, 0x07, 0xc4, 0xa0, 0x3a, 0x3d, 0x94, - 0x26, 0x68, 0x34, 0xe2, 0xcf, 0x66, 0xce, 0x86, 0xf9, 0x3b, 0xf5, 0x0b, - 0xc9, 0x1c, 0x09, 0xb8, 0x7c, 0x6f, 0xd3, 0x10, 0x7f, 0xbd, 0xd9, 0x54, - 0x86, 0x88, 0x7a, 0x98, 0x9f, 0xb3, 0x7d, 0x62, 0xd1, 0x04, 0x73, 0x41, - 0x04, 0xfe, 0xbd, 0x65, 0xcd, 0x6a, 0xf5, 0x8d, 0x12, 0x74, 0xc4, 0xd4, - 0x11, 0x45, 0x81, 0x81, 0xec, 0xa5, 0x36, 0xbd, 0xe9, 0x15, 0x6e, 0x52, - 0xa4, 0x21, 0x0a, 0x9b, 0xe5, 0x90, 0x6e, 0xfe, 0xc8, 0xb7, 0x4c, 0x66, - 0xcb, 0x1a, 0xd2, 0x00, 0x58, 0x13, 0x67, 0x73, 0x40, 0x45, 0x03, 0x82, - 0x7b, 0x9e, 0xb6, 0x71, 0x6f, 0x93, 0x9b, 0xd9, 0xf5, 0x54, 0x0d, 0x1f, - 0x42, 0xed, 0xe7, 0xb3, 0x94, 0xdd, 0x9c, 0x6e, 0xff, 0x3d, 0x53, 0xb5, - 0x53, 0xe7, 0x58, 0x7e, 0xab, 0xc9, 0xa1, 0x3e, 0xd2, 0xb7, 0x41, 0xf7, - 0x0a, 0x7c, 0xc3, 0x12, 0x93, 0x28, 0x8b, 0x6b, 0x7b, 0x25, 0xcc, 0xfe, - 0xfb, 0xd9, 0x46, 0x77, 0x0d, 0x66, 0x86, 0xd7, 0x31, 0x15, 0x95, 0x79, - 0x94, 0x04, 0x87, 0x18, 0xdc, 0x4f, 0x42, 0x06, 0xd9, 0x58, 0x6c, 0xec, - 0xde, 0xb9, 0xac, 0x77, 0x6e, 0x2f, 0x8e, 0xf4, 0x69, 0x84, 0xdb, 0x48, - 0x56, 0xd9, 0x2a, 0xbc, 0xf9, 0x57, 0x4d, 0x03, 0xea, 0x72, 0xcd, 0xa2, - 0x78, 0x1d, 0x41, 0x76, 0x8b, 0xe4, 0x34, 0xa6, 0x5c, 0x83, 0xeb, 0x16, - 0x30, 0x10, 0x13, 0x06, 0x15, 0xec, 0x59, 0x9a, 0xd9, 0x1e, 0x2a, 0xa8, - 0xae, 0x51, 0x3b, 0x7b, 0xee, 0x1f, 0x01, 0x70, 0xbd, 0x91, 0x7d, 0x49, - 0x14, 0xb3, 0xc5, 0x23, 0x1e, 0xde, 0x80, 0x79, 0xc1, 0xa8, 0x37, 0xbf, - 0x46, 0x05, 0x77, 0xf2, 0x0c, 0xdf, 0x32, 0x57, 0x79, 0x2d, 0x19, 0x95, - 0x6d, 0xf5, 0xf6, 0x4d, 0xa8, 0x2d, 0x8e, 0x24, 0x10, 0xbc, 0xca, 0xbd, - 0xb4, 0x8d, 0x83, 0x3f, 0x97, 0x9c, 0xf2, 0x14, 0x9b, 0x00, 0xe4, 0xcc, - 0x37, 0xbf, 0x91, 0x8a, 0xdc, 0xa1, 0xd5, 0xe1, 0x31, 0x13, 0x57, 0xba, - 0x10, 0x74, 0xc2, 0x12, 0x2c, 0x55, 0x25, 0xe3, 0xc5, 0xe5, 0xfc, 0xd3, - 0x4d, 0x22, 0x77, 0x2d, 0xc8, 0xac, 0x15, 0x79, 0x10, 0x82, 0x4f, 0xb3, - 0x6b, 0xd0, 0x7c, 0x53, 0x3c, 0x31, 0x4f, 0xb1, 0x53, 0x44, 0xc4, 0x1f, - 0x65, 0xdc, 0x30, 0x8e, 0xbd, 0x6f, 0xfd, 0x69, 0x0a, 0xc9, 0xac, 0x83, - 0x4c, 0x07, 0x57, 0xbb, 0x02, 0x20, 0x25, 0x54, 0x79, 0xf3, 0x06, 0x9c, - 0x73, 0xbd, 0x91, 0x8c, 0xc8, 0xfd, 0xce, 0xf3, 0xc0, 0x99, 0x67, 0xc6, - 0xd7, 0x78, 0xc8, 0x4b, 0xf4, 0x27, 0x2d, 0x0e, 0xc9, 0xda, 0xf4, 0xa8, - 0xa8, 0x55, 0xa0, 0x96, 0x40, 0xa0, 0x5b, 0x6c, 0xc2, 0x93, 0xe1, 0xd3, - 0xa3, 0x1f, 0x2d, 0xba, 0x9b, 0xf7, 0x69, 0xb8, 0x78, 0x1f, 0xbe, 0xf1, - 0x7c, 0x73, 0x17, 0x4b, 0xcf, 0xd6, 0xa0, 0x6c, 0x0c, 0xfe, 0xda, 0x84, - 0x24, 0xaa, 0x31, 0x38, 0x3a, 0xde, 0x3f, 0xc9, 0x65, 0x7f, 0x0c, 0xfc, - 0xae, 0x3b, 0xd6, 0x6f, 0x3e, 0x56, 0x6e, 0x9d, 0xf7, 0x76, 0xed, 0xad, - 0xc1, 0xbd, 0x02, 0x94, 0xaf, 0x2b, 0x62, 0x03, 0x82, 0x4f, 0xf0, 0x6c, - 0xe6, 0xa8, 0xb3, 0x66, 0xdf, 0x1c, 0xee, 0xc8, 0x1c, 0x5a, 0x18, 0x5f, - 0xc6, 0x23, 0x56, 0x49, 0x88, 0x2c, 0xf6, 0xf2, 0xbc, 0x10, 0xfe, 0x9d, - 0xd5, 0x47, 0x98, 0x62, 0xf2, 0x46, 0x4c, 0x90, 0x5a, 0x64, 0x8d, 0xa3, - 0xe2, 0x92, 0x4a, 0x56, 0xf9, 0x2e, 0xf0, 0xc4, 0x49, 0x8d, 0x6b, 0x1c, - 0xea, 0xf8, 0xd0, 0x65, 0x98, 0x6f, 0x58, 0x24, 0x14, 0x7f, 0x8c, 0x85, - 0xbc, 0xe7, 0x7c, 0x8b, 0x25, 0xff, 0x73, 0xe7, 0xf3, 0x30, 0x89, 0x5d, - 0x58, 0x2f, 0x6f, 0xb3, 0xa2, 0x92, 0x65, 0xf6, 0xb9, 0xc7, 0x37, 0xbc, - 0x29, 0x4b, 0x27, 0x94, 0x09, 0x9b, 0xfc, 0x50, 0x91, 0xbc, 0xf4, 0x60, - 0xd3, 0xb1, 0x1e, 0x31, 0xab, 0xca, 0x8f, 0x7c, 0x01, 0xbc, 0xb5, 0x4c, - 0xb6, 0xf3, 0x29, 0x78, 0x2c, 0x6c, 0xbf, 0x74, 0x93, 0xd4, 0xb1, 0xca, - 0xc7, 0xa8, 0xc2, 0xc7, 0x82, 0x92, 0xeb, 0x1e, 0x49, 0x42, 0xdf, 0x24, - 0xc1, 0x11, 0x98, 0xa1, 0xd5, 0xba, 0x31, 0x9f, 0xee, 0x3b, 0x5b, 0x2b, - 0x76, 0x88, 0x07, 0xa1, 0xdf, 0x26, 0xab, 0x06, 0xff, 0xaf, 0xc9, 0x6e, - 0xa2, 0x05, 0x31, 0xe7, 0x68, 0x66, 0xf1, 0xe4, 0x98, 0x29, 0xf3, 0xae, - 0x36, 0x66, 0x17, 0x2c, 0xe0, 0x55, 0x56, 0x8a, 0x4a, 0x21, 0x26, 0xa9, - 0xc5, 0xca, 0x18, 0x89, 0x3b, 0x71, 0x2d, 0xcf, 0x7b, 0xdf, 0x37, 0x41, - 0x94, 0x93, 0xdc, 0xe8, 0xa8, 0xb5, 0x7b, 0x8c, 0x35, 0xce, 0x89, 0xf7, - 0x55, 0x55, 0x2f, 0xd0, 0x2e, 0x11, 0xc3, 0x20, 0xec, 0x97, 0xb1, 0x12, - 0xfe, 0x6f, 0x93, 0x9d, 0x39, 0x04, 0x65, 0x11, 0x81, 0xe3, 0x3a, 0x35, - 0x71, 0x29, 0xf9, 0xf2, 0x05, 0xa2, 0xca, 0x21, 0x1a, 0x16, 0xba, 0xaf, - 0x7d, 0x2f, 0xb3, 0x6f, 0x3d, 0x99, 0x59, 0xa9, 0x32, 0xbd, 0x53, 0x6f, - 0x44, 0x82, 0xae, 0xce, 0x1a, 0x92, 0x0d, 0x76, 0x0c, 0xfc, 0xdf, 0x2c, - 0xf0, 0xa0, 0xc3, 0x2d, 0x62, 0xfb, 0x85, 0x56, 0x74, 0x87, 0xed, 0x9d, - 0xa4, 0x68, 0x34, 0xc2, 0x87, 0x33, 0x45, 0x59, 0x3f, 0xee, 0xb2, 0xae, - 0xe1, 0xf7, 0xb9, 0x2f, 0x0c, 0x80, 0xfb, 0x51, 0x05, 0x4c, 0x98, 0x91, - 0xe4, 0xbc, 0x70, 0xb0, 0x1e, 0x0c, 0x6f, 0x54, 0xda, 0x6b, 0xfd, 0xe6, - 0x24, 0xba, 0x4a, 0xb5, 0xe8, 0x6f, 0xa0, 0xee, 0xd9, 0xed, 0xbe, 0x53, - 0xb8, 0x5a, 0xe1, 0xad, 0xd0, 0x1f, 0x6c, 0x1d, 0xc2, 0x4f, 0xe9, 0x05, - 0x2b, 0xd9, 0x71, 0x9e, 0xd1, 0xf0, 0xde, 0xc7, 0x4c, 0x51, 0xbf, 0xfa, - 0x7b, 0x68, 0x5c, 0x30, 0x52, 0xe2, 0x73, 0x0c, 0x3a, 0x1b, 0x1e, 0x58, - 0xdd, 0x0f, 0x23, 0x3d, 0x4b, 0xb0, 0x82, 0xeb, 0xe3, 0x15, 0xca, 0xf4, - 0xfb, 0x69, 0x5f, 0x9b, 0x46, 0xe0, 0xf9, 0x88, 0xf1, 0xf8, 0xd1, 0x14, - 0x65, 0x4f, 0xf5, 0xa8, 0x0b, 0x15, 0xb1, 0xee, 0x3b, 0x1a, 0x96, 0x12, - 0xce, 0x9c, 0xe6, 0x67, 0x08, 0x04, 0x76, 0xa6, 0x22, 0x9a, 0xd1, 0xd1, - 0x16, 0x12, 0x76, 0xac, 0xbf, 0x83, 0x86, 0x44, 0x5a, 0xe2, 0x20, 0xa5, - 0x5b, 0xfb, 0x69, 0x56, 0x2e, 0x56, 0xea, 0xe7, 0x94, 0x82, 0x3b, 0xc5, - 0xce, 0x8a, 0x6e, 0xa8, 0x3f, 0x97, 0xef, 0x33, 0xcc, 0x66, 0xf4, 0xb6, - 0xe1, 0xa9, 0x29, 0x82, 0x25, 0x1d, 0x18, 0x91, 0x82, 0x96, 0xdf, 0xe9, - 0x5c, 0x86, 0x47, 0x11, 0x5c, 0x1c, 0x6a, 0x85, 0xc6, 0x93, 0xe4, 0x0d, - 0xc4, 0x90, 0xee, 0x17, 0x81, 0x5a, 0x2b, 0x9c, 0x8c, 0x66, 0x39, 0xb1, - 0xe8, 0x2c, 0xdb, 0x5a, 0x0d, 0x94, 0xac, 0x24, 0x8b, 0xf8, 0x7c, 0xe0, - 0x5f, 0xd5, 0x6a, 0x00, 0x73, 0x00, 0xc5, 0xda, 0x33, 0x1f, 0x64, 0xc7, - 0xc2, 0xf8, 0x37, 0x1b, 0x3b, 0xa0, 0x83, 0x01, 0x40, 0x61, 0x17, 0xe4, - 0x34, 0xb5, 0x4e, 0x92, 0xac, 0x89, 0x66, 0x7f, 0x67, 0x5e, 0x9f, 0x5a, - 0x1c, 0x75, 0xe4, 0x00, 0x36, 0x19, 0xc8, 0x02, 0xb0, 0xab, 0xb5, 0x0f, - 0x8b, 0xba, 0xd6, 0xbc, 0x69, 0x74, 0x7b, 0x8f, 0xab, 0xb4, 0x43, 0x01, - 0xd0, 0xf3, 0x9e, 0x85, 0x31, 0xc8, 0x5e, 0x01, 0x43, 0x56, 0x4e, 0xc8, - 0xfa, 0x79, 0xa2, 0xe1, 0xd2, 0xd4, 0xa4, 0x82, 0xa0, 0x89, 0xe1, 0x8e, - 0x55, 0xfe, 0xd6, 0xd4, 0xcd, 0xe2, 0x76, 0xf3, 0x31, 0x49, 0x3a, 0xcf, - 0xe4, 0x48, 0xca, 0xb8, 0x04, 0x4c, 0xaa, 0xe7, 0x56, 0x59, 0x7a, 0xf7, - 0x9a, 0xa2, 0xe8, 0x87, 0xa3, 0x2d, 0xe3, 0x24, 0x5a, 0x4d, 0x81, 0xcb, - 0xc2, 0xdf, 0xc5, 0x40, 0x91, 0xef, 0x04, 0x23, 0xe0, 0xb7, 0xee, 0xe1, - 0x90, 0x11, 0x23, 0x7f, 0x1f, 0x80, 0xab, 0xaf, 0x34, 0x4e, 0xa9, 0x0a, - 0xc7, 0x90, 0x70, 0xf5, 0x04, 0xaf, 0xc2, 0x81, 0xfc, 0xbf, 0x4b, 0x65, - 0xec, 0xd0, 0x0a, 0xd5, 0x85, 0xf1, 0x24, 0x92, 0x3f, 0xf2, 0xd3, 0x39, - 0xe9, 0x49, 0x14, 0x08, 0x39, 0x15, 0x01, 0xe1, 0x80, 0x30, 0xbf, 0x39, - 0xd3, 0x0e, 0x00, 0x9a, 0x94, 0x9b, 0x98, 0x0d, 0xe6, 0x51, 0xc8, 0x24, - 0x8f, 0xef, 0x18, 0x00, 0xbd, 0xf3, 0xd4, 0xc4, 0xa8, 0x35, 0x24, 0x7e, - 0xf9, 0x61, 0x2c, 0x39, 0x58, 0xbe, 0x23, 0xbc, 0xff, 0x72, 0x16, 0xa7, - 0xed, 0xd5, 0xec, 0xa8, 0x6c, 0x71, 0x28, 0x26, 0x8a, 0xcd, 0x48, 0x8f, - 0x02, 0xec, 0xd4, 0xf0, 0xa5, 0x2b, 0xc9, 0x47, 0xa5, 0xbf, 0x5e, 0xd6, - 0xb0, 0x58, 0xef, 0x7d, 0x4e, 0x11, 0xbb, 0xae, 0x9a, 0xa3, 0x7f, 0x21, - 0xf6, 0xc5, 0x1b, 0xd7, 0x5c, 0x44, 0xf2, 0xca, 0x50, 0x8b, 0x11, 0x0b, - 0xc0, 0x89, 0x95, 0x5c, 0xee, 0x4f, 0x51, 0x2c, 0x67, 0x90, 0x44, 0xca, - 0xfc, 0xb2, 0xa4, 0x05, 0x8b, 0x47, 0xe1, 0x26, 0xb8, 0x9a, 0x44, 0xe0, - 0xbd, 0x58, 0x4d, 0x57, 0x6e, 0x75, 0xe0, 0xde, 0x50, 0x93, 0x56, 0x4a, - 0x9a, 0x84, 0xb2, 0x22, 0xd5, 0x89, 0x52, 0x25, 0x76, 0x51, 0x02, 0x39, - 0xd8, 0x05, 0xc8, 0x67, 0x55, 0xd7, 0xbf, 0xaa, 0xd9, 0x56, 0xdc, 0x25, - 0xf1, 0x45, 0x40, 0x46, 0x9e, 0x2e, 0xf2, 0x6a, 0xb3, 0xb7, 0xfe, 0xd8, - 0x47, 0xf0, 0xe6, 0x75, 0xdc, 0x3d, 0xb3, 0x26, 0xc4, 0x12, 0xcf, 0x42, - 0x7a, 0x4e, 0x69, 0xb5, 0x9b, 0x28, 0x0d, 0x24, 0xd4, 0xbe, 0xab, 0xec, - 0x5c, 0x85, 0x74, 0xd3, 0xea, 0x94, 0xf1, 0xb2, 0xd9, 0x88, 0x80, 0xef, - 0xc9, 0xdf, 0x53, 0x96, 0x9a, 0xb8, 0x28, 0x69, 0x2c, 0x96, 0x44, 0x74, - 0x4d, 0xf1, 0x2a, 0x41, 0x48, 0x8b, 0xad, 0xda, 0x5e, 0xeb, 0x31, 0x2b, - 0xa9, 0xc8, 0xb9, 0x28, 0x6b, 0x89, 0x9e, 0x90, 0xce, 0x4e, 0xd2, 0xb0, - 0x94, 0x68, 0x0c, 0xc8, 0xba, 0x26, 0x5f, 0xe6, 0x6c, 0xbe, 0x94, 0x27, - 0x14, 0xd2, 0xe2, 0xb5, 0x80, 0x4c, 0xc6, 0xc6, 0x25, 0x3d, 0xee, 0xff, - 0x7a, 0xc3, 0x44, 0xb3, 0x7f, 0x9b, 0xeb, 0xea, 0xe7, 0x95, 0x1b, 0xd2, - 0xcc, 0x78, 0x10, 0x71, 0x13, 0xb7, 0x45, 0x3e, 0xea, 0xb7, 0x4f, 0xc7, - 0x9b, 0xfe, 0x53, 0x1a, 0xd5, 0xd1, 0x9c, 0x59, 0x3f, 0x5a, 0x64, 0xe1, - 0xd3, 0xf2, 0x4b, 0xf5, 0xa2, 0x97, 0x89, 0x13, 0xbe, 0x6b, 0xc3, 0x98, - 0x64, 0xb4, 0x13, 0xef, 0x95, 0x68, 0xa3, 0x59, 0xf5, 0x63, 0x50, 0x32, - 0x84, 0x78, 0x3d, 0x9c, 0xce, 0x0b, 0x7c, 0x02, 0xa3, 0x2c, 0x14, 0x04, - 0x12, 0xa1, 0x4c, 0x46, 0xb2, 0xda, 0xd7, 0x73, 0x9f, 0xd6, 0x96, 0xd9, - 0x5c, 0x2a, 0xde, 0x7c, 0x09, 0xc7, 0xb1, 0x8f, 0xf0, 0x3c, 0xd5, 0xdf, - 0xcf, 0xcc, 0xf4, 0x20, 0x98, 0x7f, 0x17, 0x32, 0xbf, 0xc7, 0x02, 0xf0, - 0x13, 0x33, 0xf2, 0x5f, 0x3e, 0x72, 0xfa, 0xe1, 0xf6, 0xb1, 0x5b, 0xd8, - 0xe4, 0x8f, 0x42, 0xb3, 0x3a, 0xe4, 0x29, 0x5e, 0xb6, 0x1d, 0xde, 0x3d, - 0xba, 0xaf, 0x7c, 0x6c, 0x31, 0x12, 0xc1, 0x50, 0xa4, 0x0b, 0x9c, 0x4c, - 0x7c, 0xc2, 0x24, 0xd8, 0x57, 0x70, 0xbf, 0xa7, 0xdb, 0xfb, 0x23, 0x09, - 0xfc, 0xb2, 0x44, 0x42, 0xdb, 0x67, 0x08, 0x6f, 0x7e, 0x5d, 0xe3, 0xc8, - 0xa5, 0x4f, 0xff, 0xba, 0x79, 0x1b, 0xe3, 0xee, 0x6e, 0xeb, 0x5b, 0x4d, - 0x1a, 0xc2, 0xc5, 0xf8, 0x50, 0x2d, 0x01, 0x3d, 0x2e, 0x4b, 0xac, 0xbe, - 0x30, 0x08, 0xf8, 0x7b, 0xc4, 0x41, 0xd2, 0xa8, 0x22, 0xfb, 0xd1, 0x2f, - 0xe0, 0xc1, 0x30, 0x22, 0x44, 0x54, 0x4b, 0xd3, 0x26, 0xa6, 0x5f, 0x11, - 0x67, 0x81, 0xf4, 0xbc, 0x0a, 0x86, 0xda, 0xf0, 0x23, 0x19, 0x85, 0x53, - 0x6f, 0x9f, 0x85, 0x1d, 0xe8, 0x08, 0x84, 0xbc, 0x6a, 0x30, 0xda, 0x73, - 0x1c, 0xb3, 0x08, 0x05, 0x19, 0x80, 0x21, 0x08, 0x39, 0x50, 0xe1, 0x43, - 0x19, 0xad, 0x0b, 0x86, 0xa3, 0x81, 0x62, 0xe0, 0x18, 0x73, 0xeb, 0x32, - 0x60, 0x62, 0x30, 0x6d, 0x4b, 0x31, 0x6e, 0x8f, 0xcb, 0x6e, 0x59, 0x0a, - 0xb0, 0xe1, 0xc5, 0x9b, 0xdd, 0x98, 0xf4, 0x03, 0x37, 0x6d, 0x2d, 0x33, - 0x42, 0xcc, 0x03, 0x33, 0x75, 0x29, 0x02, 0xec, 0x37, 0x51, 0x8a, 0x66, - 0x91, 0xdf, 0x92, 0xa8, 0xa4, 0x81, 0xa8, 0x02, 0x1f, 0x41, 0x44, 0xbe, - 0xc3, 0xb8, 0xc2, 0x23, 0x2b, 0xf1, 0x01, 0x2c, 0x33, 0x11, 0xa9, 0x6a, - 0x9b, 0x2c, 0x55, 0x50, 0xb0, 0x74, 0x9e, 0x09, 0xa4, 0x8e, 0x91, 0x72, - 0xfc, 0x3e, 0xeb, 0xb4, 0xd8, 0x13, 0xe5, 0x1d, 0xfd, 0x13, 0x81, 0x59, - 0xf5, 0xa1, 0x9f, 0x50, 0xc9, 0xa3, 0xd0, 0x0c, 0xde, 0x45, 0x07, 0x75, - 0x67, 0x2c, 0x83, 0x6a, 0x7d, 0x3b, 0xcf, 0xc7, 0xd2, 0xe4, 0x33, 0x6e, - 0xb1, 0x5d, 0x10, 0xe0, 0x17, 0x12, 0x86, 0x53, 0x49, 0x0a, 0x8b, 0xe0, - 0x03, 0xd4, 0x4f, 0x06, 0xec, 0x3b, 0x73, 0xd6, 0xdc, 0x95, 0x3a, 0x27, - 0x1c, 0x0e, 0x9a, 0x18, 0x60, 0xc8, 0xc2, 0x48, 0x8e, 0xce, 0xf1, 0x50, - 0x5f, 0x5e, 0x9f, 0x91, 0x2e, 0x64, 0xca, 0x08, 0x7b, 0xaa, 0x12, 0x9d, - 0x2a, 0x75, 0xbc, 0xc8, 0x19, 0x1e, 0xb1, 0xde, 0x31, 0x61, 0xfd, 0xce, - 0x9d, 0xb7, 0x87, 0xcd, 0xfd, 0xb6, 0x2a, 0xcb, 0x6a, 0x2c, 0xd2, 0x04, - 0x9b, 0x65, 0x47, 0x88, 0xa7, 0xb8, 0xda, 0x00, 0xa2, 0xff, 0xf0, 0x06, - 0x77, 0x1f, 0x96, 0x6d, 0xce, 0xc4, 0x97, 0x6c, 0x1c, 0x3b, 0x42, 0xda, - 0xd2, 0xd0, 0x2e, 0x5d, 0x6a, 0x32, 0x63, 0x02, 0xbd, 0x13, 0xc9, 0xd6, - 0x18, 0x24, 0x01, 0x3e, 0x25, 0x13, 0xa4, 0xaf, 0x1b, 0x5d, 0x3b, 0x58, - 0x0b, 0x0f, 0xf1, 0x09, 0x79, 0x26, 0xb4, 0xdc, 0x49, 0xd7, 0xd9, 0x29, - 0x5f, 0xc2, 0x3f, 0x69, 0x86, 0xec, 0x59, 0x5c, 0x78, 0xdd, 0xd8, 0xc0, - 0x5e, 0x41, 0x8a, 0x5c, 0x23, 0x31, 0x48, 0xbe, 0x55, 0xfc, 0xe2, 0x94, - 0x52, 0x74, 0x01, 0x47, 0xd5, 0x30, 0x88, 0x06, 0xa8, 0x9e, 0x5a, 0xce, - 0x50, 0xdd, 0xd3, 0xe2, 0x38, 0x6d, 0xf1, 0xde, 0x39, 0x64, 0x06, 0xe1, - 0x7c, 0xa9, 0x1f, 0xc1, 0x8a, 0x5c, 0x03, 0xfb, 0x5f, 0x96, 0xb8, 0xc7, - 0x6f, 0x82, 0xfc, 0xa7, 0x74, 0x08, 0xb2, 0x36, 0x5d, 0x4d, 0x7c, 0xe0, - 0xea, 0x91, 0xc0, 0xb8, 0x41, 0x65, 0x09, 0xe5, 0x15, 0xc9, 0x56, 0x83, - 0x42, 0xb6, 0xe7, 0x6e, 0x3f, 0x5a, 0xe3, 0x42, 0x41, 0x3b, 0x6a, 0x49, - 0x54, 0xe2, 0x1b, 0x29, 0xf3, 0x9b, 0xff, 0xf6, 0x89, 0x39, 0x7a, 0x2c, - 0xb6, 0x83, 0x8f, 0x36, 0x2f, 0x74, 0x66, 0x8b, 0xe9, 0xb9, 0xd8, 0x2b, - 0xba, 0x84, 0xad, 0x82, 0xd4, 0x4a, 0x39, 0x6c, 0xab, 0x24, 0xce, 0xf6, - 0x4c, 0x4d, 0x0f, 0xbb, 0xe0, 0x0a, 0x1c, 0xad, 0xe0, 0x18, 0x88, 0xea, - 0x88, 0xbc, 0xb7, 0x44, 0x33, 0x29, 0xbe, 0xc7, 0x8e, 0x74, 0xef, 0x8d, - 0xba, 0x22, 0x74, 0x9f, 0x8f, 0x7a, 0xd1, 0x42, 0x5b, 0x88, 0x00, 0xd2, - 0x7a, 0x66, 0x3f, 0x8f, 0xb0, 0x21, 0x3a, 0x2e, 0xee, 0xd7, 0x35, 0xfb, - 0xb8, 0x46, 0xbe, 0xbf, 0x99, 0xa7, 0x14, 0xba, 0xbc, 0xe7, 0x17, 0xf4, - 0x6f, 0x9a, 0xff, 0x36, 0xf7, 0x8c, 0xe6, 0xf8, 0xde, 0x97, 0x7c, 0x84, - 0x5e, 0xbd, 0x55, 0x63, 0xca, 0x88, 0x25, 0x82, 0x02, 0x7e, 0xd5, 0x1d, - 0x2e, 0xe1, 0x0a, 0x4c, 0x55, 0x8c, 0x94, 0x57, 0xce, 0xe0, 0xb0, 0x4e, - 0xc1, 0x6f, 0xcb, 0xc1, 0xed, 0xc3, 0x99, 0x0d, 0xad, 0xa3, 0xb0, 0x12, - 0xa2, 0xc5, 0x4d, 0xe2, 0x9d, 0x91, 0x96, 0x99, 0x78, 0x4b, 0x72, 0x98, - 0x40, 0x42, 0xb4, 0xc4, 0xcd, 0x2a, 0x07, 0x6b, 0x01, 0x09, 0x62, 0x71, - 0x9a, 0x23, 0x9f, 0x78, 0x85, 0x73, 0xf1, 0x71, 0x70, 0xf8, 0x8e, 0x60, - 0xbc, 0xe7, 0x01, 0x4b, 0xfe, 0xb5, 0x49, 0x44, 0x77, 0x13, 0x3b, 0xa4, - 0x28, 0xf9, 0x5d, 0x47, 0xb0, 0x3e, 0x5c, 0x1c, 0xad, 0xa3, 0x04, 0x9a, - 0xa6, 0x83, 0x49, 0x1e, 0x98, 0x2e, 0x6d, 0xdf, 0x51, 0x0c, 0x11, 0x17, - 0x39, 0xb5, 0x11, 0x6b, 0x87, 0x28, 0x76, 0x0f, 0x65, 0x4a, 0xe3, 0x07, - 0x60, 0xc6, 0x68, 0x3b, 0x62, 0x3b, 0x22, 0xc3, 0xb8, 0x2f, 0x67, 0x25, - 0xca, 0xed, 0x6f, 0xa9, 0x6e, 0x27, 0x6c, 0xb6, 0x16, 0x4f, 0x85, 0x77, - 0x5d, 0xe5, 0x23, 0xe2, 0x9d, 0x06, 0xfc, 0x2e, 0xfe, 0x0f, 0xc1, 0xe4, - 0x68, 0x59, 0xa4, 0xde, 0xca, 0x21, 0xdd, 0xa0, 0x9e, 0x85, 0x73, 0x1e, - 0xeb, 0xea, 0x75, 0xdf, 0x10, 0xb7, 0x94, 0x60, 0xc0, 0x5d, 0xba, 0x78, - 0xa9, 0xdf, 0x51, 0x91, 0xe6, 0xc9, 0x4f, 0x04, 0x73, 0x24, 0x17, 0x57, - 0x83, 0xb8, 0x27, 0x2e, 0xc2, 0x91, 0x3b, 0xf5, 0x28, 0x46, 0x6b, 0x35, - 0xf0, 0x2b, 0xe6, 0xc8, 0x66, 0xeb, 0x0d, 0x58, 0x8c, 0x15, 0xd6, 0x64, - 0x66, 0x02, 0x77, 0x02, 0xd4, 0x35, 0x97, 0xca, 0x3d, 0x71, 0x66, 0x0f, - 0xdf, 0x63, 0xc8, 0x72, 0xdb, 0x7b, 0x8f, 0xbe, 0x57, 0xcb, 0x47, 0xa4, - 0xa2, 0xae, 0xff, 0xd0, 0x31, 0xfe, 0xa0, 0x45, 0x17, 0xdb, 0xe8, 0x84, - 0x84, 0x28, 0xb2, 0x1b, 0xe8, 0x48, 0x44, 0x06, 0xf0, 0xef, 0xf4, 0xad, - 0xb3, 0x21, 0x13, 0xbe, 0xab, 0x77, 0x56, 0x88, 0xd9, 0xf5, 0xf2, 0xb1, - 0x84, 0xdd, 0xa0, 0x29, 0x78, 0xe8, 0x89, 0x97, 0x69, 0xc5, 0x6e, 0x5d, - 0x2d, 0xe0, 0xc8, 0x5a, 0x34, 0x84, 0xc9, 0x9f, 0xc5, 0x06, 0x15, 0xac, - 0xd6, 0x31, 0x7e, 0x97, 0xbd, 0xb0, 0x23, 0x15, 0x98, 0x0c, 0x31, 0xd9, - 0xc8, 0xf7, 0x0f, 0xe6, 0xd4, 0xe0, 0x6b, 0x99, 0x68, 0x7d, 0xe8, 0xe1, - 0xff, 0x88, 0x0d, 0xa3, 0xab, 0xc7, 0xe9, 0x93, 0xee, 0xbf, 0x23, 0x07, - 0x42, 0x2e, 0xcc, 0xed, 0xb9, 0x84, 0x6c, 0x3e, 0x87, 0xe8, 0xa6, 0xfc, - 0x3f, 0x37, 0x75, 0x15, 0x4f, 0x5f, 0x51, 0x6d, 0xb8, 0x8a, 0xa5, 0x2e, - 0x2e, 0xe5, 0xe4, 0x7e, 0x4f, 0x31, 0xb4, 0x91, 0xd5, 0x2b, 0x9e, 0xdd, - 0x01, 0x93, 0xf5, 0x05, 0xb2, 0xae, 0x8d, 0xe5, 0xc6, 0x04, 0x28, 0xa3, - 0xf5, 0xf5, 0xa0, 0xef, 0xc5, 0x9b, 0x9c, 0x92, 0x19, 0x80, 0x0f, 0xb1, - 0x78, 0xa0, 0x61, 0xe8, 0x33, 0x3a, 0x4e, 0x4d, 0xd7, 0x5e, 0xbd, 0x14, - 0xc4, 0x04, 0x0b, 0x29, 0xc7, 0x0c, 0xd1, 0x41, 0x91, 0x0e, 0xd3, 0x35, - 0x54, 0x86, 0x9d, 0x49, 0x71, 0xa6, 0xf9, 0x91, 0xfc, 0x61, 0xca, 0xa2, - 0x0e, 0x28, 0xdd, 0xbe, 0xb7, 0xea, 0x14, 0xcd, 0xcf, 0x69, 0xeb, 0xf9, - 0xad, 0xa1, 0x1f, 0x67, 0x95, 0x93, 0xaf, 0xa6, 0xca, 0xaf, 0x75, 0xaf, - 0xf0, 0x1f, 0x99, 0xfc, 0xec, 0x9d, 0xe6, 0x42, 0x8d, 0x1b, 0x62, 0xc2, - 0xe9, 0xe4, 0x08, 0x4f, 0xd0, 0x46, 0x44, 0x2a, 0x3d, 0x2f, 0x48, 0xc4, - 0xc2, 0xea, 0xe0, 0x9a, 0xfa, 0x73, 0xdf, 0x5a, 0x97, 0xe9, 0xc1, 0x94, - 0xad, 0x60, 0x26, 0xc0, 0xb9, 0x43, 0x7f, 0xbb, 0x65, 0x93, 0xa2, 0x75, - 0x24, 0xeb, 0x75, 0xa5, 0x05, 0x4f, 0x63, 0x98, 0x18, 0xf0, 0x74, 0xd4, - 0xd8, 0x4d, 0x55, 0xb0, 0x41, 0xe0, 0x2d, 0x4f, 0x78, 0xdf, 0xd3, 0x65, - 0xd4, 0xb0, 0xd2, 0x2a, 0x56, 0x12, 0x65, 0xd5, 0xbf, 0xc4, 0x8a, 0xdc, - 0xaa, 0x59, 0x9a, 0x7a, 0x3b, 0xd0, 0x72, 0x20, 0x81, 0xd7, 0x30, 0xfd, - 0xb7, 0xcd, 0x4a, 0xdc, 0x6e, 0x10, 0x0d, 0x78, 0x90, 0xdd, 0x36, 0xb3, - 0x25, 0x6b, 0x63, 0x36, 0x0c, 0x1a, 0x2e, 0xf3, 0x54, 0x41, 0x29, 0x03, - 0x2b, 0xd4, 0xdc, 0x16, 0x39, 0x9a, 0xf0, 0xf2, 0xa1, 0xa8, 0xba, 0xf0, - 0x01, 0x60, 0x5e, 0x85, 0x1d, 0x9d, 0xfa, 0x00, 0xd8, 0x9e, 0xc5, 0x8d, - 0xf5, 0x54, 0x1d, 0x7e, 0xa8, 0xc0, 0xe7, 0xb9, 0x17, 0xef, 0x43, 0x60, - 0xb0, 0xc5, 0x4a, 0x52, 0x66, 0x83, 0x16, 0xd2, 0x6a, 0xaa, 0xfa, 0xb6, - 0x35, 0x4f, 0x02, 0x6c, 0xde, 0x18, 0x79, 0xae, 0x0c, 0x64, 0x9e, 0x1e, - 0xb3, 0x48, 0x1a, 0x25, 0x4e, 0x4b, 0x76, 0xd4, 0x0c, 0x8f, 0x60, 0xa4, - 0x1d, 0x70, 0xd3, 0x6d, 0x87, 0x6b, 0xbf, 0x89, 0xfa, 0x0b, 0xdc, 0x73, - 0x36, 0xc5, 0x7c, 0x46, 0x26, 0x2c, 0x73, 0xf2, 0x37, 0x0d, 0x84, 0xd3, - 0xff, 0x71, 0x75, 0x92, 0x2c, 0x77, 0xbf, 0xb8, 0x96, 0x66, 0x24, 0x28, - 0x9b, 0x9e, 0xc8, 0x78, 0x69, 0x2d, 0xd4, 0xe8, 0xc9, 0x68, 0x0e, 0x7d, - 0xa3, 0x70, 0x6f, 0xb5, 0x13, 0x1d, 0x60, 0x35, 0x80, 0x2d, 0xb2, 0xa7, - 0xe5, 0xce, 0x61, 0xcb, 0xa0, 0xa4, 0xea, 0xef, 0x33, 0xf5, 0xa4, 0x15, - 0x68, 0x8a, 0xa7, 0xa7, 0x1c, 0xbf, 0x1d, 0xab, 0x23, 0x98, 0x5c, 0x02, - 0x6e, 0xbf, 0x6c, 0x80, 0x38, 0x34, 0xfd, 0x0c, 0x73, 0xd8, 0x63, 0x3b, - 0x02, 0xbd, 0x9c, 0xc2, 0x01, 0xa9, 0x31, 0x30, 0x4b, 0x4b, 0x0c, 0x0f, - 0x00, 0xfa, 0xdd, 0x6a, 0x50, 0x7c, 0xbc, 0x65, 0xf1, 0x1a, 0xfc, 0x62, - 0xe9, 0x00, 0x37, 0xbf, 0xc5, 0x1d, 0x1a, 0x07, 0x42, 0x17, 0x9f, 0x55, - 0xfe, 0xdb, 0x01, 0xf3, 0x3d, 0x98, 0x1a, 0x82, 0x85, 0x70, 0x20, 0x61, - 0x45, 0x3c, 0xe7, 0x90, 0xfe, 0x85, 0x07, 0x62, 0x02, 0x46, 0x26, 0xfe, - 0x87, 0xd4, 0xe9, 0x03, 0xda, 0x9f, 0xf0, 0x15, 0xa1, 0x4e, 0xa1, 0x72, - 0xca, 0xa3, 0x9c, 0xf7, 0x59, 0xeb, 0x66, 0x7c, 0xac, 0xb1, 0xe7, 0x0a, - 0x98, 0x00, 0x02, 0xd6, 0xce, 0x2f, 0xc4, 0xc5, 0x83, 0xb8, 0x37, 0xd1, - 0xce, 0xd0, 0xe8, 0x70, 0x39, 0x21, 0x53, 0xe6, 0x37, 0x5b, 0x05, 0xbf, - 0xca, 0x82, 0x4a, 0x77, 0x73, 0x31, 0x0b, 0x40, 0x95, 0xc8, 0x0c, 0x9c, - 0x7d, 0xe6, 0x35, 0x9e, 0xf5, 0x7a, 0x34, 0xa1, 0x2d, 0xf0, 0x00, 0x30, - 0x90, 0x92, 0x36, 0x89, 0x19, 0xc8, 0x57, 0xac, 0x62, 0xd6, 0xe2, 0x96, - 0xf9, 0x45, 0xde, 0x93, 0x14, 0x35, 0x36, 0xa3, 0x6e, 0xd7, 0xbb, 0xd5, - 0xc1, 0xe8, 0x71, 0x80, 0x13, 0x81, 0x73, 0x50, 0x7e, 0x66, 0x20, 0x6e, - 0xac, 0x0c, 0x72, 0x55, 0x3b, 0xdf, 0x77, 0x25, 0x5e, 0xb4, 0x4d, 0xc3, - 0xc7, 0x6e, 0x9c, 0xe2, 0x8e, 0x9d, 0x4a, 0x44, 0x7e, 0x08, 0xac, 0x0f, - 0x71, 0xa9, 0x48, 0x75, 0x15, 0xe3, 0xe3, 0x0b, 0x89, 0xe0, 0x0c, 0xb9, - 0x19, 0x13, 0xcb, 0xbb, 0x23, 0x23, 0x4d, 0xe9, 0x99, 0x40, 0xde, 0xfc, - 0xd0, 0x45, 0xf8, 0x62, 0x51, 0x11, 0x09, 0x8e, 0xd2, 0x39, 0xab, 0x52, - 0xff, 0x00, 0xd8, 0x5b, 0x28, 0xb1, 0x63, 0xb8, 0xd9, 0x38, 0xd7, 0x2d, - 0xf1, 0xe0, 0xb6, 0x5c, 0xd0, 0xf0, 0xe7, 0xde, 0x4b, 0xce, 0xcd, 0xb0, - 0x9f, 0x0a, 0x30, 0x55, 0x5c, 0x25, 0x27, 0xa4, 0xcd, 0xc8, 0x5b, 0x48, - 0x13, 0x9a, 0x13, 0x1b, 0x73, 0x31, 0x12, 0xd7, 0xaf, 0xd8, 0x9c, 0x4f, - 0x08, 0x58, 0xe8, 0xe9, 0x1d, 0xfb, 0x7f, 0x74, 0x81, 0xe4, 0x7f, 0x8d, - 0x4e, 0x33, 0xdc, 0xd0, 0xdf, 0x66, 0x93, 0xb7, 0x3d, 0x82, 0x7f, 0x18, - 0x61, 0xb8, 0xfd, 0x7c, 0x25, 0x37, 0x66, 0x67, 0xb6, 0x38, 0x8b, 0x8c, - 0x7f, 0x9a, 0xcb, 0x5e, 0x4e, 0x74, 0x73, 0x01, 0x87, 0x46, 0xbd, 0x0c, - 0x41, 0xc8, 0x45, 0x60, 0xad, 0x60, 0xb2, 0x58, 0x60, 0x31, 0xfd, 0x7c, - 0x87, 0x0e, 0x94, 0x73, 0x7d, 0x68, 0xd6, 0x36, 0x6e, 0xc7, 0x88, 0xd8, - 0xfd, 0xc2, 0xe1, 0xc0, 0x52, 0xd3, 0x0d, 0x6f, 0x2c, 0x0a, 0xae, 0x76, - 0x9a, 0xf9, 0xf2, 0x59, 0xf0, 0xfd, 0x23, 0xd1, 0x93, 0x38, 0x93, 0x1a, - 0x9a, 0x24, 0x76, 0x2c, 0x62, 0x84, 0xf7, 0x63, 0xd6, 0x16, 0xef, 0xed, - 0x8c, 0x71, 0x3a, 0x3a, 0xc2, 0xc0, 0xc4, 0x9e, 0x86, 0x78, 0xf2, 0x31, - 0x12, 0xcf, 0xe7, 0x51, 0x50, 0xb1, 0x2d, 0xfd, 0xff, 0x3d, 0x62, 0xe6, - 0x1d, 0x2c, 0x9a, 0x44, 0xad, 0x3e, 0x76, 0xe3, 0x9a, 0x95, 0x50, 0xaf, - 0x0d, 0x51, 0x28, 0x47, 0x43, 0x12, 0x02, 0x17, 0x79, 0x2c, 0x9c, 0x3f, - 0x39, 0x7a, 0xa0, 0x30, 0xde, 0xa2, 0xc8, 0x03, 0xe7, 0x2f, 0xe4, 0xb9, - 0xac, 0x77, 0x19, 0x02, 0x34, 0x32, 0x9d, 0x85, 0xb3, 0x01, 0x88, 0x4c, - 0xfb, 0xca, 0x50, 0xb3, 0xfb, 0x6d, 0x52, 0xc7, 0x92, 0x92, 0x29, 0x1b, - 0xe3, 0x68, 0xc5, 0x32, 0x17, 0x9e, 0x08, 0x1b, 0x8c, 0x81, 0x24, 0xc9, - 0xdf, 0x9b, 0x19, 0xd1, 0xdf, 0xa6, 0x6e, 0x75, 0x21, 0xa5, 0xb7, 0xec, - 0xdc, 0xab, 0x82, 0x0b, 0xb2, 0x21, 0xea, 0x09, 0x64, 0xbf, 0xf7, 0xc5, - 0xfc, 0x02, 0x42, 0xa2, 0x34, 0x2a, 0x0e, 0x8f, 0x5a, 0x4d, 0xa7, 0xa9, - 0x88, 0xe6, 0xd1, 0x5c, 0xa7, 0x35, 0xac, 0x38, 0xc3, 0x20, 0x23, 0xe2, - 0xa3, 0x54, 0x33, 0xa5, 0x61, 0x0a, 0x34, 0x80, 0x63, 0x80, 0x56, 0x13, - 0x54, 0xb4, 0xcf, 0x2c, 0xd9, 0x89, 0xf2, 0xde, 0x79, 0x1d, 0x08, 0xbb, - 0x3b, 0x74, 0x64, 0x73, 0x80, 0xbb, 0x9b, 0xb1, 0x35, 0xfd, 0x6b, 0x73, - 0xa7, 0x80, 0x95, 0x4d, 0xb3, 0xce, 0x3b, 0x69, 0xf8, 0xd7, 0x1a, 0xe6, - 0xf0, 0xb2, 0x8d, 0xec, 0x73, 0x62, 0xae, 0xc0, 0xc9, 0x87, 0x04, 0xc5, - 0x01, 0x99, 0x26, 0xe0, 0xd2, 0x91, 0x21, 0xef, 0x40, 0x4c, 0x35, 0x6e, - 0x76, 0x18, 0x23, 0xa9, 0x4b, 0xbb, 0x75, 0xe7, 0x6a, 0x0f, 0xfd, 0xe6, - 0xda, 0x15, 0xd5, 0x6d, 0xad, 0xa7, 0xd9, 0xe6, 0xa3, 0x5f, 0x2b, 0x46, - 0x2d, 0x86, 0x7f, 0x0a, 0x5a, 0xcb, 0x43, 0xc4, 0xa7, 0xa0, 0x3d, 0x7f, - 0x60, 0x27, 0xa7, 0xad, 0x3b, 0x7b, 0xbb, 0x0a, 0x14, 0xa9, 0xe3, 0xe7, - 0xd8, 0x83, 0x5c, 0xd2, 0x6b, 0xc6, 0x3b, 0x33, 0x1c, 0x7f, 0xc1, 0xdb, - 0x2b, 0xab, 0xf8, 0x9d, 0x61, 0xcc, 0xf4, 0x3b, 0x62, 0xe8, 0x3a, 0xa7, - 0x85, 0x8c, 0x87, 0x8e, 0xe3, 0xed, 0x51, 0xdd, 0x42, 0xc2, 0x4d, 0x1a, - 0x1e, 0x19, 0x31, 0x44, 0xab, 0x99, 0x91, 0xa1, 0x8d, 0x21, 0x98, 0x79, - 0xe5, 0x10, 0xfe, 0x2b, 0x50, 0x70, 0x12, 0xe8, 0x76, 0xa3, 0x68, 0x4d, - 0xd6, 0xd1, 0xaf, 0xe6, 0x6a, 0x63, 0x72, 0x97, 0x6e, 0x29, 0x7f, 0x90, - 0xfd, 0xec, 0xa1, 0xfa, 0x42, 0x1a, 0x87, 0xe9, 0x3e, 0xd7, 0x91, 0xda, - 0xc2, 0x94, 0xb8, 0xda, 0x77, 0x20, 0x55, 0x29, 0xd1, 0xa8, 0xfa, 0xbb, - 0x6f, 0xb7, 0x6c, 0xbe, 0x74, 0x8d, 0xf5, 0x64, 0x88, 0x2b, 0x66, 0x7d, - 0x36, 0x64, 0x2a, 0x54, 0x0a, 0x4e, 0xf5, 0x5a, 0x2c, 0x02, 0x69, 0xce, - 0xc1, 0x3c, 0x9d, 0x86, 0x28, 0x44, 0x3b, 0x80, 0xaa, 0x2e, 0x0b, 0x55, - 0xde, 0x5c, 0x43, 0xfc, 0x81, 0xbb, 0x43, 0xab, 0x99, 0x92, 0x2f, 0xda, - 0x40, 0xfe, 0x0b, 0x8e, 0x8f, 0x35, 0xd2, 0x40, 0xff, 0x07, 0x74, 0xab, - 0xa9, 0x57, 0x71, 0x3c, 0xb1, 0x5f, 0xd9, 0xc5, 0x13, 0xf7, 0x9b, 0xd0, - 0x78, 0xb8, 0xa2, 0x45, 0x72, 0xc0, 0xf8, 0x1d, 0x24, 0x6c, 0xab, 0xe4, - 0x8e, 0x10, 0xee, 0x38, 0xf6, 0x6c, 0xae, 0x60, 0x2c, 0x7b, 0xeb, 0x80, - 0x53, 0xce, 0xa3, 0xa5, 0xe1, 0x6f, 0x83, 0xde, 0x16, 0x92, 0xfa, 0xee, - 0x3b, 0x74, 0x7e, 0x92, 0x16, 0xf9, 0x01, 0xf7, 0x67, 0x4e, 0xca, 0x27, - 0x46, 0xfc, 0x6a, 0x9c, 0x2c, 0x8e, 0x9f, 0x2e, 0x86, 0x10, 0x03, 0x6a, - 0xc4, 0xb6, 0xc1, 0xd7, 0x98, 0x12, 0x73, 0x5a, 0x5d, 0xbf, 0x3b, 0x7a, - 0xf2, 0x82, 0x8c, 0x33, 0x23, 0xce, 0x3d, 0x92, 0xb6, 0xa2, 0x4a, 0x6f, - 0x65, 0xdb, 0x3f, 0x90, 0xa8, 0x9c, 0xee, 0x4c, 0xce, 0x8b, 0x30, 0xe0, - 0xc0, 0xfd, 0x45, 0xa0, 0x20, 0x0d, 0x46, 0x61, 0x6b, 0xee, 0xaa, 0x14, - 0x86, 0xa4, 0x08, 0x63, 0x87, 0x57, 0xc3, 0xbc, 0x5c, 0x0c, 0xd1, 0x24, - 0xbd, 0x5c, 0xde, 0xde, 0xcb, 0x08, 0xdb, 0x72, 0x80, 0xc7, 0x5a, 0x15, - 0x42, 0xb7, 0x13, 0x6b, 0x56, 0x08, 0x6c, 0xba, 0xe0, 0x5a, 0x93, 0x35, - 0x59, 0x6d, 0x70, 0x9b, 0x59, 0x7c, 0x05, 0x90, 0x55, 0xdb, 0x72, 0x63, - 0xed, 0x8f, 0x8d, 0x94, 0x50, 0x27, 0x44, 0x5e, 0x81, 0x5f, 0xd8, 0x9f, - 0x24, 0xaf, 0x8c, 0x25, 0x1c, 0xd1, 0xba, 0x4f, 0xa7, 0xfd, 0x0e, 0x57, - 0xe6, 0xde, 0xd7, 0xd4, 0xc4, 0x0f, 0x04, 0x97, 0x65, 0xf7, 0xe7, 0xe4, - 0xec, 0xbb, 0x1a, 0x01, 0xed, 0x52, 0xed, 0x98, 0xee, 0x71, 0x4c, 0x2f, - 0x69, 0x35, 0x4f, 0xbd, 0xfc, 0x42, 0xc8, 0x4e, 0xe9, 0xe9, 0x89, 0xa5, - 0x0b, 0x0b, 0x7f, 0x16, 0xae, 0xc2, 0x24, 0xc9, 0xcb, 0x4c, 0x88, 0x00, - 0xd1, 0xe0, 0xe5, 0xbc, 0x25, 0xb4, 0x58, 0x0b, 0x00, 0xe5, 0x74, 0xd5, - 0x73, 0xc1, 0x3b, 0x1d, 0x32, 0xd0, 0x66, 0xf0, 0xab, 0x72, 0x09, 0xb9, - 0xf7, 0xd9, 0x90, 0x74, 0xaf, 0x8b, 0xdd, 0xb2, 0xe0, 0x6a, 0xf1, 0x7b, - 0x59, 0xee, 0x99, 0xcd, 0xb3, 0x85, 0xa9, 0xb1, 0xcd, 0x52, 0xe1, 0x35, - 0xa2, 0x9b, 0xc4, 0x6a, 0xd5, 0xcf, 0x21, 0x48, 0x34, 0x24, 0x30, 0x57, - 0x0e, 0xb0, 0xe8, 0x51, 0x5c, 0x84, 0x93, 0x10, 0x3d, 0xb2, 0xdb, 0x90, - 0x7e, 0x09, 0xcd, 0xd9, 0xef, 0x60, 0xf5, 0x08, 0x3d, 0xfe, 0xf6, 0x84, - 0x7a, 0xac, 0x23, 0xef, 0x95, 0x77, 0xdf, 0xee, 0x26, 0x6b, 0xa4, 0xcb, - 0x30, 0x4e, 0x48, 0x9f, 0x78, 0x6c, 0x8d, 0x1d, 0x95, 0x7e, 0x70, 0x29, - 0x4a, 0x3f, 0xdd, 0x2e, 0x5d, 0x7d, 0x1f, 0xf5, 0xec, 0x39, 0xad, 0x78, - 0x66, 0x4a, 0xe4, 0x17, 0xb5, 0xb1, 0xc9, 0x6a, 0x8c, 0xeb, 0x39, 0x3a, - 0x38, 0xa6, 0x47, 0xc0, 0xd6, 0x61, 0xfb, 0xee, 0x8d, 0x2e, 0x86, 0x22, - 0x2d, 0x46, 0xa4, 0x83, 0xf8, 0xe7, 0x96, 0xf2, 0x40, 0xc4, 0x37, 0x82, - 0x50, 0xdc, 0x78, 0xd0, 0x86, 0x0b, 0x60, 0x5b, 0xb8, 0x77, 0xb1, 0xd5, - 0xa4, 0x8f, 0xc1, 0x66, 0xd2, 0xc2, 0x73, 0x17, 0xfc, 0x11, 0xec, 0x51, - 0x1e, 0x05, 0x97, 0xfe, 0x4e, 0x84, 0x26, 0xf0, 0x5a, 0x89, 0x0d, 0x6d, - 0x0d, 0x05, 0x26, 0x9f, 0xae, 0x24, 0xbb, 0xe3, 0x65, 0x10, 0x03, 0x65, - 0xee, 0xba, 0x5e, 0x7f, 0xa1, 0x7b, 0x18, 0x47, 0x85, 0x79, 0xcd, 0x95, - 0xf2, 0xe2, 0x0d, 0x30, 0xe5, 0xda, 0xd1, 0xc6, 0x27, 0x8f, 0x63, 0x7e, - 0xe9, 0xec, 0xca, 0xe1, 0xdc, 0x3b, 0x42, 0x89, 0xea, 0x55, 0xab, 0x37, - 0x3b, 0x3a, 0xec, 0x0e, 0x7c, 0x6a, 0x87, 0x04, 0x1a, 0xe3, 0x98, 0x89, - 0x1c, 0x57, 0x3f, 0xb9, 0xfc, 0x77, 0x1c, 0x46, 0x10, 0x28, 0x12, 0x85, - 0x58, 0xaa, 0x77, 0xfd, 0xd0, 0x96, 0x56, 0x11, 0xea, 0x16, 0xce, 0x73, - 0xf3, 0x52, 0x68, 0x05, 0x39, 0x62, 0xcf, 0x6f, 0x49, 0xd2, 0x05, 0xc1, - 0x16, 0x98, 0xaa, 0xb4, 0x05, 0xd1, 0x5d, 0x12, 0xb4, 0xa1, 0x1c, 0x80, - 0x2d, 0xc2, 0xf2, 0xfe, 0x65, 0xdf, 0x72, 0xbb, 0x57, 0x70, 0xed, 0x7b, - 0x87, 0xec, 0x45, 0x98, 0xcd, 0xe4, 0x80, 0x89, 0x47, 0x8c, 0x41, 0xa1, - 0x0b, 0xc9, 0xdc, 0x36, 0x10, 0xc7, 0x63, 0x57, 0x36, 0x05, 0xaa, 0xd3, - 0x49, 0x41, 0xfb, 0x93, 0x7d, 0xba, 0xf3, 0xb3, 0x67, 0x61, 0x74, 0x59, - 0x0f, 0x5e, 0x03, 0x08, 0x45, 0xe8, 0x78, 0xbd, 0xf3, 0x65, 0xe1, 0x03, - 0xa5, 0x16, 0x4b, 0x53, 0x96, 0xc1, 0xdd, 0x12, 0x73, 0x78, 0xb8, 0xb9, - 0x2c, 0x9c, 0x18, 0x6d, 0xfe, 0xf7, 0x2a, 0xf9, 0x22, 0x27, 0x9e, 0xf2, - 0x18, 0xf1, 0xdf, 0x30, 0x1c, 0xbc, 0xed, 0x69, 0x04, 0xde, 0xef, 0x1c, - 0xef, 0x7c, 0x84, 0xce, 0x57, 0x01, 0x6b, 0x0e, 0xf6, 0x01, 0x35, 0xb9, - 0xe0, 0x51, 0x21, 0x1e, 0x1e, 0xf5, 0xff, 0x9f, 0x23, 0x01, 0x56, 0xfd, - 0x32, 0xd0, 0x9f, 0xa2, 0xde, 0x90, 0xa2, 0xb4, 0xcc, 0x69, 0x82, 0x29, - 0x8e, 0x48, 0x32, 0x74, 0xf8, 0xc9, 0x3a, 0x8f, 0xaa, 0xbf, 0x60, 0xe9, - 0x4a, 0x0e, 0x9d, 0xda, 0x3c, 0x36, 0x10, 0xc6, 0x81, 0xc8, 0x00, 0x60, - 0x20, 0xf8, 0xa5, 0xb4, 0x5e, 0x07, 0xbb, 0x26, 0x96, 0x41, 0x9a, 0x0b, - 0xd4, 0x19, 0x18, 0xe4, 0xc2, 0x4c, 0xea, 0xff, 0x32, 0xed, 0x0a, 0x15, - 0xb8, 0x47, 0x7c, 0xd9, 0x50, 0x5e, 0xac, 0x58, 0x8e, 0x41, 0x3c, 0xfd, - 0x82, 0x36, 0x51, 0x24, 0x60, 0xf0, 0x70, 0x1c, 0x7d, 0xcd, 0xb3, 0xd6, - 0xef, 0xee, 0xb3, 0x7c, 0xa3, 0x4a, 0x8c, 0xbd, 0x77, 0x76, 0x8f, 0x46, - 0xb7, 0x98, 0xa7, 0x41, 0x5e, 0xff, 0xc4, 0xad, 0xd2, 0x34, 0x56, 0x30, - 0x98, 0xa6, 0xc6, 0x8a, 0x37, 0x3d, 0x13, 0x05, 0xe1, 0x14, 0xd1, 0xc8, - 0x51, 0x67, 0xa0, 0x9a, 0xca, 0x6c, 0xf2, 0x9f, 0xb6, 0xb0, 0x42, 0x67, - 0xb8, 0xc3, 0x29, 0x05, 0xc4, 0xc2, 0x5b, 0x09, 0x3f, 0xe0, 0x54, 0x2b, - 0x9a, 0xc2, 0xea, 0x9a, 0xef, 0x1c, 0x2f, 0x4f, 0xf2, 0x9c, 0x4e, 0x84, - 0x48, 0x13, 0x7e, 0x7a, 0x4a, 0x7b, 0x8c, 0x9f, 0x4b, 0xe2, 0x95, 0x32, - 0x03, 0x90, 0x74, 0x2f, 0xc0, 0x27, 0xa7, 0x74, 0x33, 0x25, 0x7f, 0x85, - 0xbf, 0x9d, 0x10, 0xf5, 0x3a, 0x31, 0x5e, 0x8e, 0x4d, 0x82, 0xe0, 0x22, - 0x0a, 0x8c, 0x3e, 0x21, 0x2e, 0x60, 0x31, 0x52, 0xa1, 0x6d, 0x34, 0x2b, - 0xa9, 0x36, 0x31, 0x95, 0x40, 0x21, 0xec, 0x17, 0x8a, 0x45, 0x9c, 0x30, - 0xed, 0x11, 0xd4, 0x9c, 0x2c, 0xb1, 0x67, 0x25, 0x64, 0x6d, 0x0a, 0x2c, - 0xba, 0x8b, 0x9d, 0x6a, 0x93, 0x6b, 0xb9, 0xc8, 0xe3, 0x7c, 0xf8, 0x8c, - 0x2e, 0xf0, 0x5d, 0x57, 0xc2, 0xd7, 0x3b, 0xca, 0x18, 0x24, 0xc7, 0x28, - 0xaa, 0xc8, 0x84, 0xc9, 0x34, 0xa1, 0x54, 0xab, 0xf8, 0xa1, 0x47, 0xe0, - 0x08, 0x94, 0x43, 0x71, 0xfb, 0xf6, 0x95, 0x80, 0x54, 0xc7, 0x40, 0x5e, - 0xa5, 0x5b, 0xd7, 0x50, 0x03, 0x22, 0x6e, 0x31, 0x3b, 0x1d, 0x52, 0xbf, - 0xb2, 0x27, 0x37, 0x35, 0x6a, 0x7e, 0xc4, 0xc0, 0x5b, 0x9e, 0xde, 0x04, - 0x1e, 0xa3, 0x5b, 0xb9, 0x48, 0x46, 0x03, 0xd6, 0x55, 0x9c, 0xc4, 0x4f, - 0x36, 0x54, 0x65, 0xdb, 0x5a, 0x7a, 0xc3, 0x90, 0xe2, 0xd3, 0x3f, 0x56, - 0x84, 0x17, 0xc4, 0x25, 0x13, 0x1d, 0xe2, 0x98, 0x0d, 0xf4, 0xf1, 0x44, - 0x39, 0x96, 0xcb, 0xc5, 0x19, 0x15, 0x44, 0xc5, 0x4f, 0x63, 0x83, 0x6f, - 0x0e, 0x2c, 0x18, 0x80, 0xaa, 0xd1, 0x5b, 0xf8, 0x94, 0x59, 0xd9, 0x30, - 0xa7, 0x95, 0x49, 0x5a, 0x1e, 0x00, 0x62, 0x00, 0x22, 0xc6, 0x3c, 0x9c, - 0x54, 0x86, 0x67, 0x1c, 0x14, 0x16, 0x2d, 0x11, 0x3b, 0x7e, 0x45, 0xfb, - 0x62, 0x5b, 0x3b, 0xa7, 0x79, 0x32, 0x40, 0x99, 0xab, 0x74, 0xef, 0x6f, - 0x2e, 0xb3, 0x9b, 0xb4, 0x3a, 0x11, 0x52, 0x9f, 0x9e, 0x81, 0x1a, 0xf4, - 0xd4, 0x36, 0xd9, 0xfe, 0xdd, 0x02, 0x5e, 0xb5, 0x4a, 0x14, 0x53, 0xce, - 0x01, 0x6a, 0x0f, 0xd1, 0x81, 0x5e, 0x94, 0x9d, 0xee, 0xee, 0x78, 0xa8, - 0x56, 0xff, 0xca, 0x83, 0xdd, 0xf0, 0x68, 0x6d, 0xae, 0xa1, 0x29, 0x97, - 0xfe, 0x88, 0x51, 0xb8, 0x5b, 0xe9, 0x19, 0xf0, 0x02, 0xbb, 0xd1, 0x41, - 0x6c, 0xa6, 0x04, 0x38, 0x96, 0x89, 0x71, 0x30, 0xa5, 0x10, 0x7e, 0x41, - 0x35, 0x75, 0xe0, 0x51, 0x05, 0x06, 0x63, 0xb3, 0x48, 0xbf, 0x24, 0xe7, - 0xa1, 0xcc, 0x3a, 0x5c, 0x5f, 0x10, 0x4e, 0x36, 0xa5, 0x1a, 0xa1, 0x89, - 0xa5, 0xba, 0xcf, 0x85, 0x2b, 0x8d, 0x6f, 0xfd, 0x0c, 0x03, 0xc1, 0x6d, - 0xd1, 0x78, 0xb0, 0xa3, 0x23, 0x75, 0x3f, 0x15, 0xad, 0xb5, 0x86, 0x60, - 0xe4, 0xa2, 0x22, 0x4a, 0x03, 0xfe, 0xfe, 0x71, 0x58, 0xac, 0x87, 0x11, - 0xa1, 0xc1, 0xa0, 0x26, 0x45, 0x51, 0xd5, 0xfa, 0x8e, 0x77, 0xe4, 0x47, - 0x62, 0x08, 0xa7, 0xaa, 0xd9, 0x2a, 0xa4, 0xce, 0x8c, 0xc5, 0xe3, 0x39, - 0x4b, 0x4a, 0x40, 0xed, 0xd2, 0xe3, 0xff, 0x9d, 0x6a, 0x1d, 0x70, 0x7d, - 0xa6, 0x06, 0x7a, 0xf8, 0x22, 0xa8, 0x3b, 0x15, 0x05, 0x10, 0x99, 0x5a, - 0x7e, 0xf0, 0x1b, 0xb1, 0x9a, 0x8a, 0x06, 0x17, 0x70, 0xe4, 0x93, 0x97, - 0xad, 0x12, 0x9f, 0x01, 0x9c, 0x6a, 0xf2, 0xf7, 0xa0, 0x7f, 0x27, 0xeb, - 0x4b, 0x32, 0x6b, 0xc2, 0x3d, 0x10, 0x2f, 0xa0, 0xe4, 0x02, 0x5c, 0x2e, - 0x8d, 0xd7, 0xdf, 0x29, 0x65, 0xe7, 0x85, 0x8a, 0xeb, 0xf4, 0xb7, 0x25, - 0x9b, 0xd8, 0xb9, 0x54, 0x8c, 0xb1, 0xaa, 0x34, 0xff, 0x6c, 0x5a, 0x46, - 0xbb, 0x30, 0xfc, 0x35, 0x1a, 0xcb, 0x15, 0x7c, 0x1d, 0x20, 0x5e, 0xad, - 0xd0, 0x33, 0x02, 0x6c, 0xdc, 0xdc, 0xfe, 0x4b, 0x05, 0x6b, 0xa5, 0x5e, - 0x3f, 0x83, 0xfc, 0xb8, 0x70, 0xda, 0xd4, 0x5f, 0xfa, 0x93, 0xc0, 0x48, - 0x2b, 0x6c, 0x6c, 0x74, 0x4b, 0xe2, 0x4b, 0xe6, 0xfa, 0x01, 0x7f, 0x0e, - 0x70, 0x2a, 0x8c, 0xcf, 0x27, 0xf0, 0xaa, 0x53, 0x53, 0xae, 0x56, 0xc0, - 0x46, 0xdd, 0x45, 0x1c, 0x18, 0x66, 0xe9, 0xa1, 0xa9, 0x17, 0x3c, 0x22, - 0x54, 0xbb, 0x32, 0x40, 0x51, 0x05, 0x75, 0xc2, 0x53, 0xdb, 0xb2, 0x62, - 0xc5, 0x93, 0x56, 0x4c, 0xe1, 0x44, 0x36, 0x0a, 0x9d, 0x96, 0x79, 0xe0, - 0x72, 0x6c, 0xcb, 0x3d, 0x48, 0x68, 0xf6, 0x65, 0x47, 0x23, 0xda, 0x8f, - 0x9d, 0x27, 0x39, 0x91, 0x16, 0xe6, 0x66, 0x80, 0xb7, 0x17, 0x80, 0xf8, - 0xd6, 0x65, 0x4e, 0xa9, 0xf7, 0xa2, 0x33, 0x17, 0x68, 0x1c, 0x9d, 0x75, - 0x2a, 0x94, 0xb1, 0x94, 0xf8, 0x91, 0x0f, 0xa8, 0x68, 0x72, 0xf1, 0xd8, - 0xa7, 0xe9, 0xc0, 0xb3, 0x6a, 0xb8, 0x40, 0x4b, 0x4b, 0xaa, 0x44, 0x3e, - 0x15, 0x25, 0x68, 0x3f, 0x67, 0x39, 0x40, 0x9a, 0xa9, 0xf2, 0x5e, 0x79, - 0x6b, 0xda, 0xcf, 0xf8, 0xdd, 0x46, 0x69, 0x1b, 0x44, 0xe7, 0x04, 0x99, - 0xb3, 0x4c, 0x22, 0xbb, 0x26, 0x28, 0xc3, 0xcc, 0x57, 0xf0, 0x78, 0x78, - 0x32, 0x10, 0xfb, 0x47, 0x99, 0x2d, 0x36, 0x02, 0x6a, 0x86, 0x50, 0xa4, - 0xa7, 0x95, 0xa8, 0xd7, 0xa2, 0x58, 0xfb, 0xd5, 0xfd, 0x00, 0xb2, 0x03, - 0x23, 0x69, 0x44, 0x75, 0x34, 0x17, 0xc7, 0xb4, 0x25, 0xdd, 0xb7, 0x75, - 0xc8, 0xfc, 0x1b, 0xcd, 0x08, 0xaf, 0xbe, 0x19, 0x48, 0xe1, 0xc7, 0x4b, - 0x07, 0x07, 0x1f, 0x00, 0x36, 0x59, 0x2b, 0x9d, 0x9a, 0xc7, 0x83, 0x3e, - 0x46, 0xb0, 0xd0, 0x85, 0x94, 0xee, 0xf4, 0x46, 0xfe, 0x13, 0x45, 0x57, - 0xe8, 0xef, 0x01, 0x30, 0x32, 0x75, 0x06, 0xc1, 0xe6, 0x5b, 0x49, 0x30, - 0xef, 0x56, 0x9a, 0x3c, 0xe8, 0x69, 0x54, 0x60, 0x42, 0x03, 0xa7, 0x5f, - 0x35, 0x00, 0xac, 0x4f, 0x99, 0x21, 0x7b, 0x1f, 0x1e, 0x89, 0xaa, 0x56, - 0x79, 0x54, 0x9c, 0x99, 0x49, 0x41, 0x71, 0x3d, 0x81, 0x3a, 0xf6, 0xcc, - 0x3e, 0xe8, 0x81, 0x64, 0xa6, 0x2d, 0x83, 0x54, 0xc0, 0x23, 0xed, 0xdf, - 0x74, 0xe9, 0x0c, 0xbf, 0xfb, 0x3a, 0x35, 0x94, 0xb8, 0xf5, 0x87, 0x84, - 0x45, 0xfe, 0x40, 0x58, 0x65, 0x87, 0x48, 0xf9, 0x86, 0x3e, 0xd9, 0x78, - 0xe5, 0xe8, 0x6b, 0x26, 0x34, 0xb9, 0xa0, 0xac, 0x5f, 0x3d, 0x49, 0x9b, - 0x90, 0x0e, 0xbe, 0x18, 0xdd, 0xd0, 0x43, 0x97, 0x78, 0xe6, 0x99, 0x6f, - 0xda, 0x1b, 0xca, 0x80, 0x20, 0xa1, 0x71, 0x94, 0x5c, 0xb8, 0xd8, 0x18, - 0x5d, 0x8d, 0x3b, 0xc1, 0x81, 0x7f, 0x22, 0xca, 0x36, 0xf4, 0x88, 0x36, - 0xec, 0xfa, 0x33, 0x84, 0x08, 0x0c, 0x55, 0xb7, 0xf9, 0x66, 0xcb, 0x4a, - 0xd4, 0x9f, 0xe5, 0x14, 0xf9, 0x3b, 0x64, 0xff, 0x84, 0x7a, 0xb9, 0x70, - 0xb3, 0xe9, 0x2d, 0x7d, 0xf0, 0x46, 0xfc, 0x0f, 0xda, 0x19, 0x37, 0x4b, - 0xbe, 0xd3, 0xbb, 0x91, 0xd1, 0x93, 0x71, 0xae, 0x61, 0x5f, 0xfb, 0x6c, - 0x79, 0x7d, 0xb4, 0xf0, 0xfa, 0xe6, 0xfb, 0xa9, 0x3e, 0xe8, 0x67, 0x36, - 0x1a, 0xb0, 0x1f, 0x0d, 0x1f, 0x6c, 0x67, 0x03, 0x8f, 0xfa, 0x9d, 0x13, - 0x55, 0xa5, 0x2b, 0x96, 0x6f, 0x33, 0xaa, 0xad, 0xb6, 0xc2, 0x26, 0xc6, - 0xcc, 0x7d, 0x5f, 0xd5, 0xcf, 0x95, 0x34, 0x41, 0x30, 0x54, 0x59, 0xcb, - 0xb5, 0xc3, 0x44, 0xae, 0x3c, 0x89, 0xc3, 0xda, 0xe0, 0xfd, 0x85, 0x06, - 0xab, 0xa2, 0xa2, 0x3b, 0xa2, 0x1c, 0xb6, 0xc3, 0x9c, 0x9a, 0xfb, 0x57, - 0x1c, 0x1c, 0x6d, 0x41, 0x7e, 0xcc, 0xa0, 0xf9, 0x00, 0xc4, 0x34, 0xcb, - 0xe1, 0x43, 0x07, 0x23, 0x57, 0xaf, 0xae, 0x95, 0xc0, 0x5c, 0xc4, 0x54, - 0xdc, 0xe8, 0xa8, 0x6f, 0x8a, 0x78, 0x25, 0x91, 0x1c, 0x64, 0xe3, 0x06, - 0x94, 0x74, 0x9f, 0x4a, 0xec, 0x35, 0x46, 0x8e, 0xef, 0xad, 0x69, 0xcb, - 0x67, 0x98, 0xbd, 0x99, 0xf8, 0x17, 0xd5, 0xb0, 0x30, 0x43, 0x60, 0xfa, - 0xd6, 0xdc, 0xc0, 0x36, 0xf5, 0xf8, 0x0b, 0xb4, 0x91, 0x83, 0x17, 0x17, - 0xfe, 0xc2, 0xb7, 0x9c, 0x9f, 0x03, 0x7b, 0x81, 0x5a, 0x4a, 0x7a, 0xf2, - 0x83, 0x66, 0x57, 0xd8, 0x3f, 0xea, 0x22, 0xc5, 0x53, 0x9e, 0x1c, 0x76, - 0xf6, 0x23, 0xaf, 0xd0, 0xff, 0x6f, 0x4a, 0xa4, 0x9a, 0x18, 0xb6, 0xeb, - 0xcf, 0xe8, 0x4d, 0x3a, 0x27, 0x1a, 0xdb, 0xa0, 0x46, 0x40, 0x31, 0x0f, - 0xbf, 0x4b, 0x31, 0x68, 0xad, 0x3a, 0x74, 0xfc, 0x8e, 0x11, 0x7e, 0x5f, - 0x39, 0x60, 0x8b, 0x02, 0xf3, 0x66, 0xb5, 0xdb, 0x5a, 0x94, 0x86, 0x90, - 0x0f, 0xf5, 0x55, 0x59, 0x7c, 0xec, 0x2f, 0x8b, 0x5c, 0x01, 0x63, 0xf0, - 0x7b, 0x28, 0x47, 0xbd, 0xd9, 0xf7, 0x58, 0x81, 0xd8, 0xb1, 0x47, 0x6d, - 0xdb, 0x25, 0x66, 0xe6, 0x25, 0x23, 0x25, 0x56, 0xc0, 0x1b, 0x3e, 0xbb, - 0x2f, 0x2d, 0x2b, 0xc8, 0xb5, 0x45, 0x2c, 0xbf, 0x7e, 0x29, 0x94, 0x3a, - 0xbe, 0xfb, 0x63, 0xe9, 0xf3, 0x0a, 0x14, 0x12, 0xea, 0xec, 0x91, 0xba, - 0x2f, 0x1c, 0x8d, 0x42, 0x11, 0xf6, 0x92, 0x5e, 0xe2, 0x61, 0xe7, 0x72, - 0x61, 0xe8, 0x04, 0xfa, 0xaf, 0x6f, 0x88, 0xc0, 0x82, 0x0d, 0xf3, 0x1f, - 0x5b, 0xdd, 0xd6, 0x4b, 0xda, 0x04, 0x64, 0xa9, 0x5c, 0x35, 0x9c, 0x10, - 0xaa, 0x5e, 0xae, 0x8f, 0xf4, 0x6a, 0x6c, 0x90, 0xf8, 0xd0, 0xcf, 0x2e, - 0x03, 0x17, 0xce, 0x01, 0x7b, 0xce, 0x84, 0x6e, 0x59, 0xc8, 0xd6, 0xa1, - 0x22, 0xfa, 0x2e, 0x5a, 0x61, 0xf6, 0xbe, 0xd7, 0x05, 0xe8, 0x03, 0xf6, - 0x8c, 0x60, 0x71, 0x4f, 0xb1, 0xaf, 0x29, 0xbd, 0xe6, 0x8b, 0x50, 0x3d, - 0x9b, 0x19, 0x2e, 0x6b, 0x19, 0x3f, 0xc7, 0xee, 0x06, 0x6d, 0xd9, 0x32, - 0x13, 0xb9, 0x2c, 0x95, 0xeb, 0x4d, 0xe5, 0x36, 0x70, 0x75, 0x12, 0x06, - 0xe2, 0x67, 0x97, 0x7c, 0xc1, 0xc3, 0x42, 0x7a, 0x39, 0x56, 0xa3, 0x74, - 0x2b, 0xb9, 0xff, 0x84, 0xba, 0xd3, 0xd3, 0x2d, 0x22, 0xbe, 0xab, 0x51, - 0x6f, 0xdf, 0x0b, 0x86, 0x5c, 0x91, 0x1c, 0x5c, 0x59, 0xc8, 0x5b, 0x15, - 0x3b, 0x84, 0x57, 0x36, 0x26, 0xe1, 0x4f, 0x97, 0x42, 0x6e, 0xd6, 0x6d, - 0x80, 0x23, 0x9f, 0x5d, 0xb5, 0xc7, 0x99, 0x7f, 0x34, 0x38, 0x56, 0x89, - 0x93, 0xa4, 0x1b, 0x04, 0x98, 0xdb, 0x31, 0x07, 0x25, 0x5e, 0xc2, 0x35, - 0x59, 0xd1, 0x83, 0x92, 0x40, 0x80, 0x0c, 0x05, 0x2d, 0x5b, 0x1a, 0x96, - 0x45, 0xcc, 0x62, 0x72, 0x07, 0xf3, 0xd3, 0x5f, 0x5b, 0x87, 0xfe, 0x96, - 0xfb, 0x31, 0x1d, 0xf8, 0x34, 0xa2, 0x02, 0xec, 0x26, 0x4c, 0xa9, 0x3f, - 0x69, 0xa6, 0xda, 0x93, 0xb8, 0x62, 0xd1, 0xcc, 0x5a, 0x63, 0x09, 0x50, - 0x81, 0xa6, 0xc0, 0xfa, 0xcf, 0xf6, 0x7d, 0x94, 0xf9, 0x8f, 0x33, 0x5e, - 0x9e, 0x5a, 0x9a, 0x52, 0x42, 0x60, 0x9b, 0x4d, 0xc4, 0xd1, 0x4f, 0xcd, - 0x22, 0xa7, 0x2b, 0x97, 0x3e, 0x85, 0x82, 0x56, 0x33, 0x28, 0xfe, 0xc2, - 0xc0, 0x75, 0x64, 0x9e, 0xb8, 0x4f, 0x18, 0xa6, 0x5e, 0xfa, 0x4e, 0xf0, - 0xc2, 0xf7, 0x50, 0x8f, 0x3d, 0x7a, 0xe7, 0xf5, 0x2a, 0x4c, 0x8d, 0x1c, - 0x2c, 0x13, 0x0f, 0xd3, 0x36, 0xbc, 0x9a, 0xd5, 0xa9, 0x70, 0x30, 0x92, - 0x46, 0x4e, 0xba, 0xf0, 0xe8, 0x95, 0x41, 0x3d, 0x51, 0x41, 0x7e, 0x65, - 0x53, 0xe7, 0xc6, 0xc9, 0x2c, 0xf2, 0xd2, 0x36, 0x52, 0xf1, 0x0a, 0xb7, - 0x3e, 0x89, 0xc1, 0x64, 0x11, 0xcb, 0xc7, 0x14, 0x42, 0xee, 0x76, 0x80, - 0xc7, 0x3c, 0x2e, 0xce, 0x89, 0x73, 0xac, 0x64, 0x61, 0xce, 0x78, 0xfb, - 0xc0, 0x3b, 0x24, 0x29, 0xcb, 0x78, 0x0e, 0x5f, 0xa3, 0x7e, 0x9d, 0x9e, - 0xe2, 0x89, 0x07, 0x51, 0xd2, 0xb3, 0x35, 0x76, 0xc0, 0xe9, 0x42, 0x2f, - 0x48, 0x68, 0xfd, 0x97, 0x64, 0x85, 0x56, 0xce, 0xfa, 0x5e, 0x24, 0xd2, - 0x93, 0x89, 0x87, 0x82, 0x67, 0xaf, 0xfa, 0xe6, 0xf4, 0x85, 0xe7, 0x09, - 0x72, 0xc1, 0x31, 0xbc, 0x6f, 0xb4, 0xd5, 0x8e, 0x0e, 0x2d, 0xd3, 0x18, - 0xbb, 0xaa, 0x9f, 0xa2, 0x93, 0xff, 0x40, 0x6b, 0xef, 0x33, 0xe9, 0x61, - 0x63, 0xdf, 0xe8, 0xfa, 0x93, 0x1b, 0x11, 0xcc, 0x85, 0x2b, 0xad, 0xee, - 0x5d, 0x96, 0x47, 0x90, 0x6d, 0xe7, 0x24, 0xcc, 0x5e, 0x77, 0x3c, 0x5f, - 0xb0, 0x04, 0x85, 0xfb, 0x71, 0xca, 0x24, 0xf4, 0xe0, 0x0d, 0x83, 0xe2, - 0x7b, 0x84, 0xea, 0x0c, 0x29, 0xbe, 0x01, 0x7a, 0xda, 0xcf, 0xe7, 0xb5, - 0x6c, 0x23, 0x91, 0xc2, 0x7c, 0x44, 0x87, 0x93, 0x6c, 0x7b, 0xa6, 0x07, - 0x14, 0x92, 0xa9, 0x4e, 0x03, 0x78, 0x06, 0x35, 0xc3, 0x08, 0x34, 0x49, - 0x73, 0xda, 0x9b, 0xab, 0xa3, 0x8c, 0x30, 0x8d, 0xf0, 0x71, 0x66, 0xee, - 0x24, 0xc1, 0xee, 0x9b, 0x7c, 0xaa, 0x92, 0xa4, 0xd3, 0x23, 0xbd, 0x49, - 0x41, 0x36, 0x48, 0x5b, 0x24, 0x33, 0xed, 0xf2, 0x5d, 0x78, 0xca, 0x60, - 0xf3, 0xf4, 0x95, 0xed, 0x22, 0xf1, 0x08, 0x08, 0xb3, 0x51, 0x26, 0x29, - 0xb3, 0x92, 0x3d, 0x58, 0xbc, 0xcc, 0xaa, 0x8a, 0x05, 0x06, 0x56, 0x73, - 0xeb, 0xa7, 0xfc, 0xf6, 0xa0, 0x6b, 0x77, 0x6e, 0x87, 0x3c, 0x14, 0x10, - 0x28, 0x42, 0x11, 0xa6, 0xd0, 0xe8, 0xc2, 0x0a, 0xee, 0x62, 0xd2, 0x21, - 0x89, 0x4c, 0x9a, 0xd9, 0x37, 0xcc, 0x31, 0x27, 0x76, 0x89, 0x56, 0x11, - 0x47, 0xbd, 0xcb, 0xc0, 0x48, 0x07, 0x62, 0x9f, 0x8f, 0x54, 0x1e, 0x17, - 0x76, 0xb7, 0x98, 0xa0, 0xd7, 0x62, 0x22, 0xbe, 0x6d, 0x00, 0xcb, 0x10, - 0x29, 0x02, 0x30, 0x77, 0xcd, 0x10, 0xe8, 0xb6, 0x6c, 0xfe, 0x62, 0x26, - 0x86, 0xd9, 0x62, 0x83, 0x3a, 0x90, 0x91, 0xf8, 0x62, 0x03, 0xcf, 0x40, - 0x50, 0x40, 0xb5, 0x26, 0x78, 0x93, 0xc8, 0x97, 0x4f, 0x1d, 0xb0, 0x7a, - 0x51, 0x15, 0x7c, 0xe7, 0x27, 0xf7, 0x0f, 0x0b, 0xe6, 0xa3, 0x32, 0x4f, - 0x27, 0xb7, 0x5b, 0x2d, 0xab, 0x6c, 0x4b, 0xf0, 0x73, 0x87, 0xd8, 0x0c, - 0xb7, 0xa3, 0x15, 0xd9, 0x8e, 0xf1, 0x52, 0x97, 0xb4, 0x8c, 0x49, 0xa4, - 0x18, 0x47, 0x45, 0x24, 0x86, 0x5e, 0x0f, 0x07, 0x95, 0x71, 0xe0, 0xc9, - 0xed, 0xe6, 0x07, 0xdc, 0x04, 0x19, 0x15, 0x2d, 0xca, 0xf3, 0xb4, 0x1b, - 0xc7, 0x6d, 0x3a, 0x6f, 0x59, 0x0f, 0x42, 0x12, 0x7b, 0x1f, 0xc0, 0xd7, - 0x21, 0xd5, 0xfb, 0xae, 0xe0, 0x74, 0x16, 0x3d, 0xca, 0xb2, 0xb3, 0x3d, - 0x8e, 0xf3, 0x6b, 0xae, 0x9e, 0xa7, 0x00, 0x3b, 0xea, 0x41, 0x6c, 0x9f, - 0xaa, 0x6b, 0xfc, 0xc6, 0xee, 0xab, 0x24, 0x01, 0x3c, 0x72, 0xef, 0x9a, - 0xf0, 0x83, 0x84, 0x75, 0x97, 0x10, 0xd6, 0xd5, 0x33, 0xec, 0x76, 0xe4, - 0x65, 0xd4, 0xc7, 0x71, 0x5b, 0x92, 0xd3, 0xaa, 0x6e, 0xc9, 0xc2, 0xae, - 0x78, 0xc3, 0xb9, 0xaf, 0xa9, 0xc5, 0x2a, 0x53, 0x59, 0xe6, 0x61, 0x79, - 0x24, 0x4a, 0xcd, 0xdd, 0x44, 0x28, 0x7b, 0xb9, 0xcb, 0xb6, 0x07, 0xd2, - 0x78, 0x62, 0xad, 0x79, 0xed, 0xbc, 0x26, 0x62, 0xc8, 0x86, 0x9e, 0x10, - 0x3c, 0x60, 0x11, 0x48, 0xc5, 0x20, 0x4a, 0xab, 0x46, 0x96, 0xd7, 0x09, - 0x70, 0x76, 0x01, 0x8d, 0x1e, 0xe7, 0xb1, 0xaa, 0xae, 0xf1, 0x1d, 0x46, - 0x6e, 0xd7, 0x20, 0xbf, 0xeb, 0xbd, 0x47, 0x41, 0xed, 0x79, 0x83, 0x80, - 0x11, 0x0f, 0xff, 0xed, 0x18, 0x45, 0xe0, 0x42, 0xdd, 0x4e, 0xad, 0xea, - 0xa0, 0x5f, 0x5e, 0xec, 0x12, 0x55, 0x64, 0x9b, 0xe5, 0xac, 0x08, 0xe9, - 0x27, 0xfc, 0xa3, 0xca, 0xfd, 0xb3, 0xea, 0x29, 0x27, 0x2f, 0xba, 0x4a, - 0x68, 0x82, 0x69, 0x77, 0xc7, 0xb3, 0xec, 0x8a, 0x7d, 0xdd, 0x63, 0xca, - 0x63, 0x8e, 0x4f, 0x18, 0x4c, 0xd2, 0x5a, 0x90, 0xb0, 0x6c, 0x6d, 0x57, - 0xa8, 0x00, 0x9f, 0x81, 0xc8, 0x48, 0xaa, 0x7d, 0x7b, 0xec, 0xc2, 0x13, - 0x7e, 0x28, 0xc6, 0x6d, 0x7e, 0xfc, 0xda, 0xae, 0x0a, 0xa4, 0x3d, 0x77, - 0xbc, 0x8c, 0xcc, 0x1a, 0x75, 0x9b, 0x10, 0xe0, 0x26, 0x3a, 0x72, 0xe0, - 0x88, 0xf6, 0xae, 0x9c, 0x48, 0x39, 0x06, 0x77, 0x81, 0x5b, 0xd3, 0xaa, - 0x6c, 0xef, 0x7e, 0xf4, 0x75, 0xd6, 0xe3, 0x33, 0x75, 0x6c, 0x74, 0xd5, - 0x75, 0x66, 0xe2, 0x17, 0x82, 0x37, 0x85, 0x0f, 0x19, 0xe2, 0x28, 0x38, - 0x0f, 0xad, 0x31, 0xd0, 0xa1, 0xde, 0x76, 0x7b, 0xe1, 0x08, 0xe9, 0x46, - 0x83, 0x94, 0x41, 0x14, 0x59, 0xe2, 0x7c, 0x5a, 0x2a, 0x8c, 0xd2, 0xd1, - 0xc9, 0x05, 0xf9, 0x4d, 0xc3, 0xd5, 0x7a, 0x01, 0x37, 0xd8, 0xdb, 0x60, - 0xe7, 0xb4, 0x8f, 0xd7, 0xaf, 0xa4, 0xb4, 0x73, 0xdf, 0xd8, 0x16, 0xa2, - 0x75, 0x0c, 0x27, 0xbb, 0x0b, 0x7c, 0xaa, 0x42, 0x79, 0x43, 0xed, 0x80, - 0x3a, 0xce, 0xd9, 0x4f, 0x0b, 0xec, 0xf7, 0xf1, 0x5d, 0xd4, 0xd8, 0x5b, - 0x50, 0xd8, 0x34, 0x86, 0xa3, 0x7f, 0xbc, 0xad, 0x93, 0x6d, 0x71, 0x14, - 0x0d, 0x1d, 0xdb, 0x14, 0x32, 0x13, 0xe9, 0xda, 0xf6, 0xb6, 0x8d, 0x4a, - 0x96, 0x67, 0xd9, 0xac, 0x95, 0xdc, 0xf5, 0xdf, 0xb3, 0x0c, 0x75, 0xa9, - 0x22, 0x3e, 0x8d, 0xcf, 0xd4, 0x85, 0x05, 0x9d, 0xb9, 0x4b, 0xe7, 0x92, - 0x97, 0x4d, 0xf2, 0x62, 0x98, 0xaa, 0xcd, 0x38, 0x7b, 0xc9, 0x73, 0x51, - 0x2a, 0xec, 0x51, 0x66, 0x60, 0x65, 0xa6, 0x8b, 0x83, 0x19, 0x44, 0x0a, - 0x49, 0x16, 0x03, 0xcf, 0x03, 0xe7, 0xb8, 0x91, 0x25, 0x51, 0x56, 0xcc, - 0x27, 0x68, 0x2c, 0x11, 0x6c, 0xbf, 0x0d, 0x1e, 0xf4, 0xc4, 0x9e, 0x9f, - 0x63, 0x2d, 0xb1, 0x58, 0x35, 0xa1, 0x0a, 0x51, 0x46, 0x64, 0xe9, 0x95, - 0xb2, 0xb1, 0x83, 0x59, 0x2c, 0x7f, 0xb0, 0xe3, 0x51, 0x01, 0x89, 0x14, - 0x6d, 0x9d, 0xa3, 0x6c, 0x50, 0xaa, 0xca, 0x5b, 0x3a, 0x7d, 0x43, 0xc0, - 0xed, 0xfd, 0x9c, 0x0b, 0x15, 0x95, 0xb8, 0xf3, 0x33, 0xc7, 0xc2, 0xe2, - 0xa8, 0xf3, 0x8d, 0x71, 0x7f, 0x08, 0x10, 0xab, 0xdc, 0xea, 0x1f, 0xd9, - 0x65, 0x33, 0x5a, 0x37, 0x89, 0x13, 0xfe, 0xb1, 0x7d, 0xa4, 0xd1, 0x71, - 0x0a, 0xc6, 0x3c, 0x7f, 0x58, 0x11, 0xdf, 0x81, 0x32, 0x91, 0x2c, 0x6d, - 0x63, 0x48, 0x70, 0xfc, 0x86, 0x30, 0x75, 0xca, 0xd5, 0x57, 0x21, 0x98, - 0x1f, 0x20, 0x80, 0x31, 0x60, 0x16, 0xdc, 0x3d, 0x4b, 0xe7, 0xe0, 0x1d, - 0x0e, 0xb1, 0x40, 0xd0, 0x21, 0x61, 0x02, 0x57, 0x86, 0xc8, 0x47, 0x3d, - 0x39, 0x02, 0x94, 0xdf, 0x05, 0xcc, 0x42, 0xea, 0x6a, 0x3f, 0x48, 0xb6, - 0x96, 0x2d, 0xcb, 0x05, 0x63, 0x3d, 0x0b, 0x1e, 0x13, 0x0d, 0xb0, 0xf4, - 0x8b, 0x2e, 0x15, 0xd9, 0x53, 0x2a, 0x53, 0x8a, 0xbe, 0x3a, 0xcf, 0xd1, - 0xe9, 0x09, 0xac, 0xd7, 0xd7, 0xbd, 0x0e, 0x26, 0x1d, 0x18, 0x12, 0xcd, - 0xef, 0x80, 0xaa, 0xa1, 0x09, 0xf3, 0x29, 0xb8, 0x89, 0x10, 0xa6, 0x4e, - 0x9e, 0x3c, 0x8b, 0x53, 0x0a, 0x27, 0x33, 0x2e, 0x38, 0x89, 0x26, 0x16, - 0xf6, 0x03, 0x24, 0x9c, 0xfa, 0x63, 0x70, 0x1e, 0x68, 0xb1, 0x22, 0x84, - 0x65, 0x72, 0xed, 0x6f, 0xe4, 0x63, 0xd5, 0x95, 0x6b, 0x9d, 0x53, 0x77, - 0x49, 0x27, 0x29, 0x82, 0x99, 0xa4, 0x1d, 0xda, 0x14, 0x37, 0x20, 0x96, - 0x36, 0xb9, 0x46, 0x0e, 0x78, 0x86, 0xff, 0x8b, 0x72, 0xa9, 0x56, 0xe8, - 0x0a, 0x6d, 0xb4, 0x9d, 0x75, 0xb4, 0x8b, 0xca, 0x7a, 0xee, 0x6d, 0x7a, - 0xe7, 0xfd, 0x29, 0x3e, 0x4c, 0x1d, 0xdc, 0xd2, 0x2e, 0x95, 0x5e, 0x40, - 0x7e, 0xca, 0x74, 0xa7, 0x0f, 0x38, 0xc4, 0xb4, 0x5b, 0x46, 0x58, 0x25, - 0xba, 0x97, 0xc2, 0x4c, 0x81, 0x49, 0x32, 0xfe, 0xba, 0x49, 0x7b, 0xb2, - 0x9f, 0xc4, 0xdf, 0x37, 0xa5, 0x80, 0x6c, 0xbd, 0x3f, 0x1b, 0xa4, 0x71, - 0x54, 0x41, 0x0a, 0x37, 0x8d, 0x65, 0x88, 0x6a, 0x3c, 0xd6, 0xd2, 0x56, - 0x3f, 0xaf, 0x18, 0x3c, 0x3b, 0x66, 0x4a, 0x21, 0x99, 0x1e, 0x3e, 0x2c, - 0xac, 0x64, 0xef, 0xda, 0x4a, 0xa8, 0x4e, 0x43, 0x8a, 0x76, 0x1b, 0x87, - 0xf2, 0x46, 0x4d, 0x94, 0xd1, 0xdf, 0xe7, 0x78, 0x8c, 0x52, 0xaa, 0x65, - 0x92, 0x5b, 0x89, 0x45, 0xec, 0x18, 0x8c, 0x0e, 0xda, 0x8e, 0x24, 0x84, - 0x12, 0x89, 0xa4, 0x6a, 0x11, 0xf2, 0x3b, 0x14, 0x19, 0x7a, 0xbd, 0xa9, - 0xb6, 0xa8, 0x71, 0xfe, 0xf6, 0xf5, 0x80, 0xa2, 0x12, 0xc0, 0x11, 0x1f, - 0x84, 0x94, 0x24, 0x2b, 0xe2, 0x70, 0xcf, 0xa4, 0x35, 0x87, 0xe0, 0xe3, - 0x7e, 0x08, 0xa9, 0x85, 0xe0, 0xcf, 0x93, 0x67, 0xbf, 0x31, 0x7f, 0xef, - 0x98, 0xa6, 0x3e, 0x68, 0x7a, 0x3d, 0xe2, 0x5d, 0x9e, 0x8b, 0x53, 0xbc, - 0x19, 0xd6, 0x69, 0x96, 0xa1, 0xd5, 0x89, 0x69, 0x38, 0x93, 0xac, 0xd9, - 0x16, 0x98, 0x3f, 0xa2, 0x03, 0xfe, 0xfb, 0x0d, 0xcf, 0xb1, 0xd1, 0xf7, - 0xb8, 0x4f, 0x26, 0x38, 0x6c, 0xef, 0xb1, 0x74, 0x27, 0xae, 0xc2, 0x7d, - 0xfb, 0xf2, 0xe1, 0x2a, 0x79, 0xaa, 0xb6, 0x35, 0x60, 0xa7, 0xf3, 0x5d, - 0x7f, 0x0e, 0xcf, 0x0e, 0x91, 0xe1, 0xea, 0x55, 0x62, 0x20, 0xf7, 0xc3, - 0xce, 0x98, 0x95, 0x5f, 0x77, 0x3b, 0x0f, 0x2e, 0xb0, 0xfe, 0x55, 0x2d, - 0xc7, 0x34, 0x35, 0x32, 0x71, 0x97, 0x64, 0xa7, 0x7a, 0xbf, 0xa2, 0x82, - 0x05, 0x88, 0xa8, 0x36, 0xb3, 0x59, 0x80, 0x83, 0x65, 0x59, 0xde, 0x16, - 0x26, 0x76, 0x34, 0x38, 0x30, 0xd8, 0xbe, 0xef, 0xf0, 0x39, 0xe1, 0x51, - 0x36, 0x53, 0x00, 0x85, 0xde, 0xd8, 0xbd, 0xe5, 0x20, 0xef, 0x31, 0x28, - 0x25, 0x35, 0xd3, 0x0a, 0xcf, 0xfc, 0x23, 0x7e, 0xce, 0x0e, 0x25, 0xae, - 0xf9, 0xf5, 0x67, 0xd0, 0xab, 0xaa, 0x02, 0xfe, 0xe1, 0x99, 0xb4, 0xd3, - 0xa5, 0x68, 0x75, 0xe0, 0xf6, 0xc5, 0x26, 0x86, 0xf8, 0xf1, 0x7d, 0x4a, - 0xc4, 0x4b, 0x9c, 0x70, 0xfb, 0xcc, 0xdb, 0x63, 0xa6, 0x70, 0x68, 0x4e, - 0x55, 0x3f, 0xa7, 0xc2, 0x0e, 0x24, 0xb4, 0x27, 0xe3, 0x08, 0x35, 0x8c, - 0xa5, 0x09, 0x4f, 0x61, 0x8f, 0x0b, 0xdd, 0x7a, 0x81, 0xd1, 0x16, 0xe0, - 0xab, 0x5c, 0xce, 0x1c, 0xc2, 0x5a, 0xf7, 0x63, 0x44, 0xca, 0xa2, 0x91, - 0x6b, 0x0c, 0xa0, 0x31, 0x38, 0x4b, 0xad, 0xb1, 0xaa, 0xa2, 0x2a, 0x9f, - 0x99, 0x9c, 0x75, 0x74, 0x40, 0xd9, 0xf1, 0xfe, 0xfb, 0x2a, 0xc5, 0xaf, - 0x67, 0x0a, 0x10, 0x0d, 0xe9, 0x2a, 0x07, 0x52, 0xa2, 0x72, 0x58, 0x55, - 0xe4, 0x43, 0x0e, 0x3c, 0xf6, 0x10, 0x41, 0x78, 0xcb, 0xd6, 0xd7, 0x21, - 0xa1, 0xd7, 0x55, 0x43, 0x70, 0x18, 0xae, 0xc8, 0x18, 0x61, 0x56, 0x20, - 0x4f, 0x40, 0x73, 0x7c, 0x43, 0x96, 0x2a, 0x44, 0x54, 0xb9, 0x52, 0x74, - 0xdd, 0x86, 0x47, 0xa5, 0x26, 0x71, 0x87, 0xe0, 0x6b, 0x60, 0xc6, 0x55, - 0x00, 0x6a, 0x94, 0x05, 0x46, 0x8e, 0x56, 0xac, 0xf3, 0x12, 0x18, 0x6f, - 0x65, 0x3c, 0x2f, 0x3e, 0xbd, 0x05, 0xf6, 0x26, 0x11, 0x00, 0x3e, 0x89, - 0x63, 0x26, 0x44, 0x3b, 0xfd, 0x41, 0x49, 0x3f, 0x3d, 0x0e, 0x00, 0xae, - 0xce, 0x90, 0xce, 0x30, 0x94, 0x50, 0xe0, 0x5a, 0xce, 0x1b, 0x40, 0x97, - 0x82, 0x6c, 0x8f, 0x71, 0xe8, 0x5a, 0x34, 0xbb, 0x3d, 0x40, 0xc4, 0x88, - 0x54, 0xe1, 0x79, 0x0f, 0x81, 0xca, 0xa2, 0x12, 0x48, 0xc9, 0x8f, 0x88, - 0xa3, 0xac, 0x87, 0x04, 0xab, 0x9b, 0x18, 0x80, 0xbd, 0xcd, 0xc7, 0xc8, - 0x86, 0x74, 0x40, 0x33, 0x05, 0x5c, 0x66, 0xc0, 0x89, 0xc5, 0x63, 0x41, - 0x28, 0xc8, 0x35, 0xf8, 0xe8, 0x0c, 0xf6, 0x82, 0xef, 0x1a, 0xe5, 0xf8, - 0x54, 0xd8, 0x8f, 0xed, 0x29, 0x02, 0x0f, 0x71, 0x86, 0xd3, 0xd2, 0xff, - 0xff, 0xd3, 0xe5, 0x66, 0x6f, 0x70, 0x9e, 0x32, 0xed, 0x78, 0xc4, 0xbc, - 0xfa, 0xb8, 0x8c, 0x92, 0x51, 0x8a, 0xc9, 0xab, 0x9a, 0xbc, 0x5f, 0x50, - 0xf7, 0x52, 0xc3, 0x73, 0xac, 0xd9, 0xfc, 0x18, 0x2e, 0xcb, 0x0e, 0xb8, - 0xb6, 0x17, 0x64, 0xef, 0x86, 0xbe, 0x51, 0xe8, 0x7f, 0xc7, 0xd1, 0x0c, - 0xd4, 0x7c, 0xc2, 0x0c, 0x80, 0xc6, 0x68, 0x6c, 0x06, 0x27, 0x55, 0xe2, - 0x1d, 0x24, 0x08, 0x48, 0x08, 0xaf, 0x0b, 0xb4, 0x50, 0x1f, 0x3a, 0xc9, - 0x8e, 0xda, 0xf3, 0xd4, 0xd7, 0x06, 0xaf, 0x52, 0xd2, 0xca, 0xda, 0x0c, - 0x31, 0x54, 0x2e, 0xee, 0x14, 0x5f, 0xe4, 0x41, 0x0b, 0x81, 0x93, 0xc0, - 0xa8, 0x1a, 0xd0, 0xfd, 0x21, 0x36, 0xcd, 0x75, 0xd9, 0x8d, 0xbc, 0xb0, - 0x1e, 0x80, 0xf3, 0xcc, 0x70, 0xc9, 0x59, 0x14, 0x70, 0xd9, 0x6d, 0x35, - 0x5a, 0x06, 0xd4, 0x64, 0xbc, 0x6c, 0xca, 0x23, 0xb1, 0xdf, 0x82, 0xf8, - 0xa0, 0x3f, 0x2f, 0x0b, 0xad, 0xbe, 0x17, 0x91, 0x4f, 0xa2, 0x30, 0xae, - 0x83, 0xe0, 0x9a, 0x1c, 0xf4, 0x90, 0x02, 0xec, 0xe7, 0x64, 0x83, 0x7d, - 0x36, 0x90, 0xbe, 0xd0, 0x14, 0x8e, 0xdc, 0x0e, 0xd2, 0x7f, 0xae, 0xd0, - 0x6b, 0xfb, 0x13, 0xd8, 0x23, 0x50, 0x6b, 0x5c, 0x07, 0xcb, 0x7d, 0xa3, - 0xd9, 0xaf, 0x47, 0x02, 0xb0, 0x34, 0x28, 0xc3, 0x47, 0x73, 0x37, 0x1c, - 0x96, 0xd0, 0xbb, 0x1e, 0xac, 0x16, 0x13, 0x76, 0xc7, 0x93, 0x1a, 0xdb, - 0x89, 0x0e, 0xfb, 0xe2, 0xed, 0xc2, 0x04, 0x75, 0xa3, 0x02, 0x78, 0x37, - 0x21, 0x92, 0xfa, 0x2d, 0xda, 0x6c, 0x36, 0x9c, 0xcb, 0x87, 0x24, 0x61, - 0x7a, 0x20, 0x98, 0xb8, 0x7d, 0x4e, 0x2c, 0xc8, 0xa9, 0x2a, 0x1f, 0x54, - 0x1c, 0xbb, 0xaf, 0x6c, 0x7a, 0x6f, 0xa3, 0x71, 0xe4, 0xd7, 0x1e, 0x0e, - 0x5d, 0xa4, 0x26, 0x54, 0x38, 0x27, 0xe5, 0xfb, 0xe8, 0x19, 0x52, 0xd4, - 0x5e, 0x47, 0xa6, 0xf7, 0xe2, 0x3e, 0xc6, 0xb1, 0x0a, 0xdf, 0x7f, 0x58, - 0x4c, 0xc2, 0x96, 0x1e, 0x81, 0x7d, 0x6f, 0xd7, 0x91, 0x9e, 0xb7, 0xce, - 0x06, 0xdc, 0xb0, 0x8b, 0xea, 0x0c, 0x8a, 0x22, 0x5e, 0xca, 0xe0, 0x09, - 0xbb, 0x4f, 0x86, 0x2b, 0xa8, 0x87, 0x46, 0xf0, 0xc0, 0xe3, 0xc2, 0x01, - 0x82, 0x57, 0xad, 0x31, 0xbd, 0x9e, 0xf2, 0x69, 0x46, 0xbd, 0x49, 0xe6, - 0xfc, 0x04, 0x7d, 0x88, 0xef, 0x01, 0x4d, 0x1a, 0xbe, 0x3d, 0xe7, 0xc5, - 0xc1, 0xaa, 0xbb, 0x9f, 0xdd, 0xb5, 0x64, 0xf4, 0x9a, 0x04, 0x6c, 0x90, - 0x3b, 0x4f, 0xad, 0x3a, 0x4c, 0x0b, 0x81, 0xf4, 0xb1, 0x84, 0x83, 0xc4, - 0x62, 0xa3, 0x9d, 0x1e, 0x52, 0x31, 0x75, 0x6e, 0x4d, 0xf2, 0x33, 0x1c, - 0xd5, 0xf7, 0x40, 0xdd, 0x91, 0x18, 0x82, 0xc4, 0x7a, 0xa9, 0xa5, 0xb6, - 0x48, 0xbb, 0xee, 0x24, 0x54, 0xc5, 0x1e, 0x2c, 0x14, 0x6c, 0xac, 0x53, - 0x11, 0x44, 0x28, 0x6f, 0x61, 0x9f, 0x01, 0xd4, 0x32, 0x6a, 0x96, 0xd5, - 0xa8, 0x18, 0x8a, 0x8d, 0x17, 0xdf, 0x4c, 0xc8, 0x6b, 0xc9, 0xad, 0x79, - 0x59, 0x85, 0x36, 0x04, 0xdc, 0x1c, 0x75, 0x4a, 0x2a, 0x28, 0x64, 0xae, - 0xa5, 0x61, 0x6b, 0x73, 0xc9, 0xc7, 0xb5, 0x78, 0x7a, 0x69, 0xbf, 0x93, - 0x45, 0xa7, 0x5f, 0x30, 0x41, 0x88, 0xb4, 0xb5, 0xf6, 0x26, 0x15, 0x2f, - 0x1f, 0x45, 0x0e, 0x3d, 0x98, 0xd2, 0xd6, 0xd6, 0xef, 0xaa, 0x5f, 0xcb, - 0x1e, 0x29, 0x49, 0x69, 0xe2, 0xb2, 0xbc, 0x67, 0x56, 0xd7, 0x6e, 0x25, - 0x39, 0xe0, 0x30, 0xfa, 0xa3, 0x8a, 0x14, 0xaa, 0x75, 0xc4, 0x62, 0xff, - 0x04, 0xae, 0x33, 0x7b, 0x6e, 0x86, 0x7b, 0x0e, 0xd2, 0x23, 0x6a, 0x49, - 0x33, 0xe3, 0x56, 0x7a, 0x9b, 0x4e, 0x26, 0xb5, 0x1f, 0x3c, 0x60, 0x1d, - 0xb3, 0x24, 0x08, 0x5f, 0x73, 0xba, 0x33, 0xa8, 0xe8, 0x16, 0x46, 0x9f, - 0x99, 0xf8, 0x10, 0x26, 0x87, 0xb9, 0x20, 0xcb, 0x1c, 0x2a, 0xd5, 0x9b, - 0xa1, 0xd9, 0xc2, 0x74, 0xd1, 0xa6, 0x1f, 0x41, 0x20, 0x3c, 0x4b, 0x17, - 0xc7, 0x7d, 0x1e, 0x44, 0xba, 0x17, 0xbe, 0x90, 0x3a, 0xd4, 0xca, 0xa0, - 0x72, 0xdd, 0x91, 0xea, 0xfb, 0x32, 0xc3, 0xb0, 0x01, 0x48, 0x43, 0x5e, - 0x05, 0x5c, 0x66, 0xc0, 0x89, 0xc5, 0x61, 0x55, 0x38, 0x5d, 0x61, 0x04, - 0x0a, 0x82, 0xf4, 0xec, 0xb6, 0x4e, 0xc7, 0xf6, 0x77, 0xe5, 0xe2, 0xe2, - 0x8b, 0x7c, 0x42, 0xfb, 0xd3, 0x24, 0xa7, 0xf3, 0xe9, 0x88, 0x64, 0xf5, - 0x20, 0xc8, 0x7f, 0xd1, 0xa7, 0xa8, 0x1a, 0xf8, 0x56, 0x26, 0xdf, 0x93, - 0x3e, 0xb4, 0x57, 0x94, 0x1d, 0x36, 0xab, 0x09, 0x94, 0xd9, 0x55, 0xb3, - 0xb6, 0x56, 0x23, 0x09, 0xaf, 0x70, 0x31, 0xc6, 0xfd, 0xdb, 0xb6, 0x32, - 0x1c, 0xbf, 0x5a, 0xfd, 0x14, 0xd3, 0x69, 0x82, 0xc2, 0x25, 0x0b, 0x51, - 0x8f, 0xe3, 0xa2, 0xc1, 0xc6, 0x0e, 0x0f, 0xf1, 0x19, 0x8d, 0x3c, 0x01, - 0x4d, 0x77, 0x8a, 0xa3, 0xfe, 0x38, 0x40, 0x64, 0x96, 0xf9, 0x30, 0xf5, - 0x5e, 0xa6, 0x7c, 0x1a, 0x06, 0xee, 0xc7, 0x0c, 0xb3, 0x49, 0xfc, 0x30, - 0xdd, 0x07, 0x6f, 0xc8, 0x84, 0xbc, 0x81, 0x40, 0x31, 0x3a, 0x48, 0x59, - 0x47, 0x49, 0x90, 0xa0, 0xee, 0x63, 0xe1, 0xa7, 0x5f, 0xa4, 0x96, 0xdc, - 0x53, 0x0a, 0x92, 0x5f, 0x20, 0xe0, 0xb0, 0x49, 0x47, 0x61, 0xba, 0x67, - 0x26, 0x03, 0x25, 0xc6, 0x73, 0xff, 0x13, 0x28, 0x2e, 0x63, 0xef, 0xef, - 0x98, 0x48, 0xed, 0x65, 0x2c, 0x2d, 0x3d, 0x8e, 0xdd, 0xb4, 0x8d, 0x2d, - 0x50, 0x3e, 0xd8, 0xc4, 0xd0, 0x8f, 0x93, 0xf1, 0xb7, 0x0a, 0xd1, 0x75, - 0xc5, 0xc3, 0xc1, 0x7a, 0x5f, 0x39, 0xc4, 0x94, 0xf1, 0x47, 0x29, 0xf3, - 0x46, 0x1d, 0xf0, 0x75, 0x5e, 0x75, 0x4c, 0x3f, 0x8b, 0xf8, 0x22, 0xdb, - 0x4c, 0x56, 0x73, 0x6a, 0x39, 0xbb, 0x61, 0xa4, 0x8b, 0x48, 0xc3, 0x2a, - 0x9d, 0x5f, 0x81, 0x6b, 0xe9, 0x1a, 0x98, 0x0c, 0xf4, 0x4c, 0x80, 0xb6, - 0x89, 0x71, 0xd1, 0xa7, 0x7b, 0x43, 0x89, 0x17, 0xbc, 0x61, 0xcb, 0x78, - 0x75, 0x60, 0x4f, 0xa2, 0x69, 0xaf, 0xef, 0x53, 0x8b, 0x32, 0x1e, 0xe2, - 0xe0, 0xdf, 0xb1, 0x24, 0xa1, 0xc9, 0xd5, 0x37, 0x34, 0xbf, 0x96, 0x31, - 0x97, 0xe0, 0xb8, 0x83, 0x75, 0x5a, 0x46, 0xd0, 0x88, 0xb9, 0xbb, 0x2f, - 0x51, 0x09, 0xeb, 0x32, 0xb8, 0x95, 0xba, 0xe9, 0xa6, 0x17, 0x9a, 0x10, - 0x5a, 0x3c, 0x85, 0x12, 0x72, 0x88, 0x6b, 0x32, 0xb1, 0xe5, 0xce, 0xbd, - 0xe3, 0xc1, 0xa2, 0xff, 0xc0, 0xdf, 0xab, 0xb2, 0x95, 0xc0, 0x75, 0x1b, - 0xf8, 0x75, 0x79, 0x4f, 0xca, 0x8f, 0x5d, 0x08, 0x19, 0xb3, 0xfe, 0x5d, - 0xd7, 0xa2, 0xd4, 0x8b, 0x92, 0x48, 0xdb, 0x28, 0xbc, 0xc5, 0x77, 0x29, - 0x66, 0xf8, 0x84, 0x4a, 0xce, 0xc2, 0xb9, 0x01, 0xb9, 0x08, 0xcd, 0x65, - 0x00, 0x22, 0xd0, 0x0d, 0x9e, 0x40, 0xda, 0x9a, 0x5a, 0x4a, 0x93, 0x80, - 0xcb, 0x16, 0x83, 0x21, 0x56, 0xd8, 0x3b, 0xa1, 0xbd, 0x3c, 0x85, 0xfe, - 0xfc, 0x88, 0xfb, 0x7a, 0xbe, 0x05, 0xf2, 0x10, 0x49, 0xd3, 0x85, 0xe7, - 0xf3, 0x8d, 0x55, 0x16, 0x2b, 0x44, 0x48, 0xc7, 0x64, 0xfb, 0x7b, 0xf3, - 0x32, 0x02, 0x2f, 0x89, 0x85, 0x5d, 0x9f, 0xaf, 0x4f, 0xab, 0x84, 0x55, - 0x06, 0xc4, 0xc9, 0xb0, 0x37, 0xcd, 0xda, 0x5c, 0x9e, 0x2d, 0x65, 0x60, - 0x5d, 0x21, 0x68, 0xf3, 0x4d, 0xa4, 0x75, 0xf1, 0x60, 0x92, 0xaa, 0xd9, - 0xf6, 0x9a, 0xbb, 0xb2, 0x8e, 0xf5, 0x70, 0x65, 0xe0, 0x06, 0xad, 0xdb, - 0x8b, 0x5d, 0x53, 0xb9, 0xc3, 0x1d, 0xcf, 0xf5, 0xf2, 0x60, 0xd1, 0x44, - 0x5d, 0xcd, 0x98, 0x18, 0x63, 0x23, 0xa2, 0x13, 0x47, 0xf1, 0x51, 0xb6, - 0x44, 0xb4, 0x1f, 0xa5, 0x38, 0x95, 0xf1, 0x83, 0xce, 0x96, 0x6d, 0x21, - 0x6b, 0x4c, 0xa0, 0xef, 0x9e, 0xe6, 0xd7, 0xd4, 0xd5, 0x19, 0x0c, 0x7e, - 0x92, 0x93, 0xc2, 0x64, 0x2c, 0xe1, 0x9b, 0xbd, 0x07, 0x1c, 0xf0, 0x7c, - 0x16, 0x35, 0xc8, 0xd8, 0x1b, 0x2f, 0x4a, 0x58, 0x87, 0x26, 0xad, 0x00, - 0x1f, 0xea, 0x4e, 0xad, 0x82, 0x01, 0x75, 0xc5, 0xbf, 0xfc, 0x2d, 0xfd, - 0x79, 0xe1, 0x60, 0x22, 0xdf, 0x99, 0xb8, 0x53, 0x2f, 0xc1, 0xab, 0xf4, - 0x66, 0xd8, 0x29, 0xb5, 0x67, 0xfa, 0xdb, 0x87, 0x87, 0xd2, 0x55, 0x3c, - 0xec, 0xab, 0x97, 0xa7, 0xcb, 0xff, 0x77, 0xee, 0x4f, 0x30, 0xa4, 0xd8, - 0x73, 0x40, 0xb9, 0x94, 0xe3, 0xd6, 0x60, 0xfd, 0x9b, 0x37, 0x14, 0x07, - 0xc6, 0x47, 0x04, 0xae, 0xd2, 0xce, 0x40, 0x3c, 0x5d, 0x94, 0x3b, 0x4d, - 0xd1, 0x49, 0x97, 0x54, 0xc2, 0xb9, 0x7f, 0x8f, 0x14, 0x51, 0x1a, 0x80, - 0xfe, 0xe0, 0x22, 0x6d, 0x57, 0x92, 0xde, 0x69, 0xf9, 0xcd, 0x7c, 0x13, - 0x0f, 0x23, 0x0c, 0x7e, 0xfd, 0x44, 0xe4, 0x80, 0x1b, 0x9a, 0xd9, 0x40, - 0x42, 0x23, 0x5b, 0x33, 0x03, 0xab, 0x5e, 0xbd, 0x76, 0x5d, 0x0a, 0xf8, - 0xa5, 0x2d, 0xad, 0xa6, 0x29, 0xbf, 0x96, 0xed, 0x01, 0x66, 0x37, 0x5c, - 0xf7, 0x41, 0x91, 0x8f, 0x3d, 0xd7, 0x2f, 0xef, 0x1e, 0x54, 0x48, 0x05, - 0x3a, 0xb2, 0x77, 0xbd, 0x88, 0x57, 0xca, 0x6b, 0x70, 0xc6, 0xc2, 0x05, - 0x8a, 0x94, 0x13, 0x20, 0xbc, 0x58, 0xbd, 0xe2, 0x07, 0xac, 0xe0, 0x2a, - 0xf3, 0xf1, 0xbd, 0xdf, 0x54, 0x31, 0x27, 0xaf, 0x51, 0x65, 0x9f, 0x7e, - 0x0f, 0xbe, 0xf6, 0x5f, 0xbb, 0xa4, 0xdc, 0x58, 0xba, 0xe4, 0xe0, 0x1c, - 0x95, 0xa8, 0xea, 0xba, 0xe7, 0x47, 0x0e, 0xe9, 0x85, 0x8c, 0xe4, 0x6c, - 0x62, 0x87, 0x14, 0xde, 0x2d, 0xed, 0x9b, 0xae, 0x31, 0x23, 0x05, 0x0e, - 0xbe, 0x26, 0xd7, 0x43, 0x6f, 0x9f, 0xa7, 0xd3, 0x8e, 0x2c, 0x34, 0xd1, - 0xf9, 0x76, 0x2d, 0x19, 0x05, 0xd4, 0x21, 0xff, 0xde, 0x1b, 0xa7, 0x9d, - 0x10, 0x7a, 0x39, 0x2f, 0x54, 0xac, 0xf4, 0xf0, 0x72, 0xcd, 0xb6, 0x96, - 0x92, 0xea, 0xe7, 0x8a, 0x91, 0xf1, 0x26, 0x26, 0xef, 0x86, 0x29, 0x1d, - 0x17, 0xa7, 0x6f, 0xc4, 0x8b, 0xde, 0xe9, 0xd5, 0x70, 0xda, 0x10, 0xb1, - 0xf2, 0x44, 0x6e, 0xbc, 0xe6, 0x49, 0xd5, 0x83, 0x41, 0x13, 0x7c, 0x87, - 0x7e, 0x3d, 0x55, 0x1e, 0x2d, 0x61, 0x88, 0xbe, 0x3d, 0x02, 0xf6, 0xee, - 0x97, 0x33, 0xd4, 0xd1, 0x81, 0x08, 0x91, 0xf5, 0xf9, 0xd0, 0xcb, 0xd2, - 0xeb, 0xbc, 0x94, 0x08, 0x8e, 0xcc, 0x1a, 0x5c, 0xe7, 0x75, 0xf0, 0x13, - 0x46, 0x5a, 0xa9, 0x21, 0xb1, 0xf7, 0x98, 0xe7, 0x5b, 0x6c, 0x7a, 0xee, - 0x7b, 0x8a, 0xa2, 0x7f, 0xde, 0x8e, 0x4b, 0x98, 0x7e, 0xc0, 0x2f, 0x35, - 0xcd, 0x50, 0x9a, 0x56, 0xec, 0x9f, 0x1a, 0xe3, 0x50, 0x56, 0x73, 0x74, - 0xbc, 0x7a, 0x9a, 0xd1, 0x81, 0xd5, 0x23, 0xaa, 0x94, 0x93, 0xaa, 0xb9, - 0x92, 0x8d, 0xc3, 0x66, 0x61, 0xe2, 0x66, 0x99, 0xf7, 0xb0, 0xb0, 0x79, - 0xb2, 0x9b, 0x02, 0xef, 0xdd, 0x91, 0xe4, 0xb6, 0x91, 0x4b, 0x78, 0xda, - 0x61, 0xe7, 0x9b, 0x9d, 0x2f, 0xf2, 0x5c, 0xc9, 0x98, 0x10, 0xd9, 0x21, - 0x4c, 0x80, 0x5f, 0x94, 0x74, 0xc8, 0x08, 0xd5, 0xbd, 0xb0, 0xad, 0x6f, - 0xec, 0xf8, 0x25, 0x2c, 0x1b, 0xd2, 0xd5, 0xd0, 0x7b, 0x26, 0xc2, 0xf4, - 0x5b, 0x41, 0x62, 0x94, 0x18, 0x13, 0x74, 0xfe, 0xa2, 0xc6, 0x63, 0x79, - 0x6d, 0xb2, 0x16, 0x4e, 0x0b, 0x9c, 0x52, 0x16, 0x26, 0xe6, 0xcf, 0x66, - 0x97, 0x72, 0x75, 0x58, 0x6b, 0x56, 0x04, 0x53, 0x4f, 0x86, 0x51, 0xba, - 0x91, 0x3e, 0xd7, 0xc7, 0x4d, 0x70, 0xc9, 0x01, 0xf0, 0x51, 0x77, 0xa0, - 0x13, 0xcb, 0xef, 0x03, 0x0b, 0x20, 0x67, 0x2d, 0xc0, 0x9d, 0x93, 0x82, - 0x4f, 0x24, 0x27, 0xdb, 0x4b, 0x24, 0xec, 0xe9, 0x69, 0x08, 0x64, 0x36, - 0x45, 0x74, 0xfc, 0x5c, 0xaa, 0x98, 0x9d, 0x76, 0x92, 0x49, 0x2c, 0x45, - 0xbe, 0xf7, 0x95, 0xa9, 0x1b, 0x8c, 0xb8, 0xce, 0xc7, 0xc5, 0xf7, 0x03, - 0x14, 0x07, 0x9d, 0xff, 0x89, 0x50, 0x87, 0x78, 0xf9, 0x9e, 0xfd, 0x95, - 0x55, 0xd0, 0x33, 0x08, 0x7b, 0xca, 0xf0, 0x5e, 0x58, 0x97, 0xc8, 0x54, - 0x5d, 0x47, 0x61, 0xa7, 0xba, 0x07, 0xa2, 0xae, 0x19, 0x83, 0xd1, 0x18, - 0x36, 0x17, 0xca, 0x6c, 0xde, 0x29, 0x8d, 0x4e, 0x63, 0xfd, 0xe2, 0x26, - 0xd7, 0x40, 0xfd, 0x61, 0x8c, 0xc1, 0x85, 0x52, 0xfb, 0xf7, 0x45, 0x20, - 0xee, 0xc4, 0xa6, 0xb3, 0x64, 0x65, 0x8f, 0x1b, 0x82, 0x19, 0x08, 0xce, - 0x3c, 0x0b, 0x19, 0xd0, 0x31, 0xcc, 0x61, 0x10, 0xcc, 0x69, 0x20, 0x9a, - 0xd7, 0x6d, 0x74, 0x62, 0x6e, 0x9f, 0x29, 0x17, 0x90, 0xa8, 0x81, 0x5f, - 0x4c, 0x67, 0x17, 0x75, 0x79, 0x48, 0xe4, 0xdc, 0x5d, 0x09, 0xa8, 0x8b, - 0x2b, 0xdf, 0x48, 0xd2, 0x11, 0xd2, 0x6e, 0x7d, 0xd1, 0x4b, 0x67, 0x7a, - 0x34, 0xc5, 0xf9, 0x97, 0x8c, 0xfb, 0x15, 0x25, 0x57, 0x6f, 0xc4, 0xf8, - 0xff, 0x99, 0x49, 0xef, 0x5b, 0xe9, 0xc9, 0x48, 0x4e, 0xf1, 0xf9, 0x04, - 0x5c, 0x64, 0x3d, 0xc4, 0x30, 0x66, 0x10, 0xcc, 0xac, 0x90, 0x2b, 0xe7, - 0x93, 0x74, 0x23, 0xbf, 0x1f, 0x4e, 0x1f, 0xa3, 0x01, 0x7d, 0xe5, 0xff, - 0x9d, 0x66, 0x4d, 0x08, 0x73, 0xb4, 0xe1, 0x29, 0x22, 0x9d, 0x79, 0xd8, - 0x18, 0x94, 0x69, 0xb1, 0xbe, 0x43, 0xd7, 0x3a, 0xf9, 0x6f, 0xde, 0xc2, - 0x16, 0xff, 0xb9, 0x52, 0xb6, 0x10, 0x48, 0xd6, 0x35, 0x20, 0xd2, 0x46, - 0xfe, 0xf6, 0xce, 0xd7, 0x24, 0x40, 0xad, 0x7f, 0x6c, 0x28, 0xa0, 0x33, - 0x00, 0xe8, 0x62, 0x7b, 0x94, 0x90, 0x68, 0x2f, 0xda, 0x6b, 0xd6, 0x5a, - 0xb8, 0x1d, 0x0f, 0xec, 0xde, 0x47, 0x5f, 0x5a, 0xdb, 0x51, 0x59, 0x5d, - 0x9d, 0xc2, 0x0c, 0x00, 0xd3, 0xec, 0x2e, 0xd4, 0x64, 0xff, 0xc1, 0x41, - 0x14, 0x66, 0x60, 0xca, 0x01, 0x4d, 0x50, 0x64, 0x44, 0xa0, 0x5f, 0x64, - 0x94, 0x9e, 0xc7, 0x60, 0x64, 0xda, 0x4d, 0xa7, 0x72, 0x6f, 0x95, 0x81, - 0x9e, 0x7e, 0x67, 0x93, 0x46, 0xdb, 0xb2, 0x28, 0xf4, 0x77, 0x89, 0x81, - 0xa9, 0xcf, 0x53, 0x0c, 0xe5, 0x2b, 0xd8, 0xbb, 0x45, 0x32, 0x95, 0xc8, - 0xfd, 0x66, 0x14, 0x5b, 0xa2, 0x82, 0xc4, 0xc3, 0x84, 0x6c, 0x60, 0xa6, - 0x7a, 0x66, 0x60, 0x22, 0x28, 0x0e, 0x42, 0x85, 0x7b, 0x21, 0x67, 0xb7, - 0x51, 0x64, 0x4f, 0x40, 0x45, 0x4b, 0x9d, 0xce, 0x1a, 0xab, 0xe6, 0x1e, - 0xe7, 0x1e, 0xb1, 0xed, 0xee, 0x22, 0x83, 0x1c, 0xa5, 0x56, 0xaf, 0x70, - 0xaa, 0xaa, 0xbf, 0x98, 0xd6, 0x57, 0x2b, 0x38, 0xe7, 0xe2, 0xfa, 0x41, - 0x81, 0xdc, 0x23, 0x34, 0x14, 0x16, 0xba, 0x67, 0xae, 0xb2, 0x4e, 0xa5, - 0xa9, 0xa7, 0xc0, 0x71, 0x0e, 0x91, 0x6a, 0xec, 0xb7, 0x43, 0x56, 0xe5, - 0x74, 0xe2, 0xa8, 0xe3, 0xa0, 0x35, 0x91, 0x9e, 0x6a, 0x9f, 0x25, 0xb8, - 0x8d, 0x36, 0xa6, 0xc9, 0xe9, 0xdc, 0x9f, 0xf2, 0xc0, 0xa1, 0x0f, 0x58, - 0xc6, 0xad, 0x45, 0xd5, 0xb3, 0x84, 0x31, 0x8a, 0x68, 0x91, 0x41, 0xc0, - 0x43, 0x9d, 0xba, 0xc2, 0xd9, 0x0c, 0xfe, 0x6f, 0xf2, 0x10, 0xe0, 0x4d, - 0xdd, 0x0c, 0x00, 0x3f, 0xad, 0x60, 0xb0, 0x1e, 0xdb, 0x6b, 0x26, 0x28, - 0xcd, 0xdc, 0xe8, 0xf0, 0x8a, 0x6c, 0x5f, 0x15, 0xe5, 0x6a, 0x07, 0x33, - 0x4a, 0x5e, 0xb7, 0xcf, 0x74, 0x04, 0x6c, 0xb2, 0x37, 0x00, 0xef, 0x93, - 0xd1, 0x42, 0x08, 0xdb, 0x63, 0x6f, 0xff, 0x61, 0x1b, 0xa2, 0xa8, 0xf6, - 0x78, 0x0c, 0xa5, 0x40, 0xe4, 0xb4, 0xea, 0xd3, 0x7a, 0xd2, 0xfb, 0xad, - 0x80, 0xd4, 0x41, 0x93, 0x41, 0x04, 0x83, 0x65, 0x0f, 0x8d, 0x7b, 0xee, - 0x9d, 0xc8, 0xbf, 0xaa, 0xbe, 0x0a, 0x3f, 0xea, 0x71, 0xb6, 0xf6, 0xb7, - 0xce, 0x50, 0xf0, 0x45, 0x0f, 0xe9, 0xee, 0x9a, 0xe6, 0x01, 0x43, 0x03, - 0x24, 0x3d, 0x51, 0x7e, 0x66, 0xfb, 0x83, 0x08, 0xb4, 0xc4, 0x24, 0xd4, - 0x65, 0x50, 0x99, 0x00, 0xb4, 0xd1, 0xde, 0xed, 0x33, 0x41, 0xdf, 0x88, - 0xf5, 0xa0, 0xf4, 0x15, 0x4b, 0x18, 0x93, 0xf5, 0xa4, 0x39, 0x92, 0x92, - 0x7d, 0x27, 0x76, 0x2f, 0xc9, 0x10, 0xbf, 0x0e, 0x76, 0x62, 0x7d, 0xe9, - 0xa9, 0x39, 0x64, 0x80, 0xa4, 0x0e, 0xc7, 0x95, 0xe8, 0xb7, 0x7e, 0x91, - 0x68, 0xd3, 0xac, 0x6c, 0x6d, 0x2f, 0x7d, 0x19, 0x4f, 0x09, 0xb5, 0xc9, - 0xae, 0x38, 0x03, 0xb4, 0x43, 0x88, 0xe5, 0x9d, 0xb4, 0xad, 0x26, 0xe3, - 0x68, 0xe9, 0x3e, 0x44, 0xff, 0xf2, 0x55, 0xd8, 0x31, 0xe6, 0x15, 0x4c, - 0x41, 0x74, 0xa5, 0x95, 0x94, 0xb7, 0x17, 0x01, 0xf0, 0x1c, 0xbd, 0x38, - 0xe5, 0xe0, 0xb6, 0xd2, 0x43, 0xd6, 0x28, 0x1c, 0xa8, 0x6c, 0xd0, 0xe2, - 0x68, 0x1f, 0xa7, 0x9b, 0x9b, 0x6b, 0x77, 0x12, 0xf4, 0x4c, 0x20, 0x6d, - 0xe9, 0xe6, 0x75, 0xf0, 0x2b, 0xef, 0x90, 0xb9, 0x21, 0x6f, 0x3c, 0x55, - 0x0e, 0x5c, 0xd3, 0x6d, 0x79, 0xbf, 0x62, 0xac, 0x7b, 0x1d, 0x7e, 0x1d, - 0xd9, 0x19, 0xe9, 0x18, 0x93, 0x47, 0xff, 0x48, 0x19, 0xe6, 0x21, 0x15, - 0x47, 0x70, 0x64, 0xb9, 0x98, 0x1e, 0x46, 0xb3, 0xa6, 0xaa, 0x17, 0x68, - 0x10, 0xf0, 0x22, 0x94, 0x0d, 0x94, 0x0a, 0x15, 0x5b, 0xb6, 0x2d, 0x3b, - 0x07, 0x1e, 0x5c, 0x9e, 0x66, 0xca, 0x4b, 0xc7, 0xb4, 0xd7, 0x1f, 0xf4, - 0x36, 0x51, 0xf6, 0x92, 0x62, 0x66, 0x69, 0x87, 0xf7, 0x90, 0xec, 0x6e, - 0xff, 0xed, 0xda, 0xef, 0x12, 0xcb, 0xf3, 0xf8, 0x28, 0x88, 0xad, 0x65, - 0x79, 0xdc, 0xef, 0x53, 0xa2, 0x1f, 0x1f, 0x94, 0x21, 0x43, 0xab, 0x15, - 0x0c, 0xe6, 0xfe, 0xdb, 0x12, 0xd8, 0x7a, 0xbc, 0x90, 0x47, 0x23, 0x1e, - 0x67, 0xc3, 0x0a, 0x0f, 0x60, 0xe1, 0x26, 0xd4, 0x26, 0x84, 0x9e, 0x7c, - 0x4a, 0x69, 0xbe, 0x39, 0x04, 0x82, 0x1c, 0x67, 0x54, 0x42, 0x2b, 0xbd, - 0xa6, 0x0e, 0xb8, 0x19, 0x98, 0xe2, 0x74, 0x80, 0x41, 0x37, 0x35, 0xb2, - 0x95, 0x76, 0x54, 0x05, 0x1a, 0x8d, 0x40, 0x85, 0x4a, 0xdc, 0xe7, 0x24, - 0x86, 0xea, 0x13, 0xd7, 0xba, 0x26, 0x2f, 0xec, 0xf7, 0xf6, 0xfa, 0x1b, - 0x12, 0x53, 0x68, 0xf2, 0xcc, 0x1b, 0xa3, 0x21, 0x86, 0x9b, 0x19, 0x86, - 0xe9, 0x5b, 0x55, 0x8f, 0xe5, 0x70, 0x0f, 0x42, 0xb5, 0xa8, 0x37, 0x85, - 0x15, 0x77, 0xe4, 0xca, 0x31, 0x49, 0x2d, 0xb5, 0x09, 0xd4, 0x0c, 0xa7, - 0x29, 0x17, 0xca, 0x56, 0x0d, 0x13, 0x17, 0xf8, 0xee, 0x05, 0x57, 0x38, - 0xfc, 0xda, 0x7c, 0xa9, 0x44, 0x2f, 0xa1, 0xd1, 0xa5, 0xa6, 0x85, 0xfb, - 0xa2, 0x58, 0xd5, 0x3e, 0xab, 0xb4, 0x5e, 0x6b, 0x90, 0xbe, 0x1a, 0xbf, - 0xff, 0xa3, 0x00, 0xbd, 0xda, 0x76, 0xaf, 0xc3, 0x5f, 0xfd, 0x3a, 0x32, - 0x73, 0xda, 0xce, 0xce, 0x74, 0xdb, 0xee, 0x15, 0xf0, 0x6c, 0xfb, 0xc0, - 0xa8, 0x53, 0x9d, 0xd6, 0x5d, 0xbd, 0x5d, 0x70, 0x0b, 0x98, 0xe9, 0x1e, - 0xdf, 0xf7, 0x0b, 0x57, 0xdd, 0x46, 0x79, 0x1b, 0xa2, 0x08, 0xbb, 0x1e, - 0x96, 0xef, 0x04, 0x3f, 0xb2, 0x22, 0xa5, 0x85, 0x35, 0xc3, 0x1e, 0x6c, - 0x99, 0xc8, 0x0b, 0x02, 0xb7, 0x5e, 0xf0, 0xe4, 0xe3, 0x4f, 0xf8, 0xf8, - 0x4e, 0x28, 0x18, 0xc5, 0xf5, 0x40, 0x76, 0xe9, 0x7b, 0xdd, 0x93, 0x02, - 0x57, 0x01, 0x77, 0x1c, 0x92, 0x9c, 0xe0, 0x29, 0x15, 0x9f, 0x18, 0xf8, - 0xa9, 0x1a, 0x44, 0xe0, 0x6a, 0xf3, 0x47, 0x98, 0xf1, 0x16, 0x54, 0xb2, - 0x45, 0x5b, 0x5b, 0xfc, 0xb9, 0x7c, 0x94, 0x5e, 0x4a, 0xd1, 0x1e, 0x37, - 0xc1, 0x99, 0x96, 0x02, 0x6e, 0xc5, 0x0c, 0x82, 0x46, 0x5b, 0xf8, 0x04, - 0x7f, 0xfb, 0x94, 0x40, 0x15, 0xdb, 0x1d, 0xcd, 0xa7, 0xd4, 0x0e, 0xd2, - 0x03, 0x6e, 0x2d, 0x31, 0x5d, 0x0d, 0xa6, 0x58, 0xc8, 0x41, 0xea, 0x0b, - 0x71, 0xf8, 0x03, 0x75, 0x6c, 0xf8, 0xf3, 0xe4, 0x91, 0x93, 0x84, 0x90, - 0xdd, 0x47, 0x02, 0x15, 0xdc, 0xb1, 0xf8, 0x56, 0xf7, 0x87, 0x33, 0xd7, - 0x78, 0xc1, 0x01, 0x39, 0x58, 0xfa, 0x2a, 0x65, 0xec, 0xc5, 0x4f, 0xf8, - 0x5a, 0x00, 0x05, 0x79, 0xce, 0x80, 0x6a, 0x48, 0xf9, 0x7a, 0x24, 0x2a, - 0x05, 0x26, 0x99, 0xad, 0x21, 0x00, 0xe7, 0x1d, 0xc4, 0x7b, 0xe0, 0xcd, - 0x73, 0x7a, 0x62, 0x12, 0xde, 0x74, 0x62, 0xe0, 0xed, 0xe5, 0xf0, 0x4c, - 0x53, 0x35, 0x8f, 0x02, 0x7a, 0xa3, 0x44, 0x12, 0xd0, 0xb9, 0x53, 0x1a, - 0xce, 0x45, 0x26, 0x6c, 0x09, 0xce, 0x83, 0x8b, 0x8c, 0x00, 0xbf, 0xd3, - 0x26, 0x79, 0x85, 0x75, 0x75, 0x86, 0xaf, 0x2b, 0x24, 0x32, 0x50, 0x9f, - 0x15, 0xe4, 0x17, 0x88, 0x8a, 0x5a, 0x7d, 0x46, 0x90, 0xaa, 0xd3, 0x48, - 0x3e, 0xe4, 0x75, 0xfd, 0x87, 0x01, 0x8d, 0x8f, 0x08, 0x4b, 0x85, 0xf1, - 0xc5, 0xc2, 0xc8, 0x30, 0x77, 0x50, 0xd8, 0xa1, 0x67, 0x1c, 0xfc, 0x7f, - 0x75, 0x7b, 0x26, 0xf0, 0x1f, 0x54, 0xf7, 0x46, 0xc2, 0xa8, 0x6b, 0x95, - 0x52, 0xa5, 0x91, 0x0a, 0x1c, 0x47, 0x10, 0xb0, 0xef, 0x01, 0x25, 0x6b, - 0xc5, 0x6d, 0xfe, 0x01, 0x81, 0x6e, 0x5a, 0xa1, 0x05, 0xed, 0xb1, 0x38, - 0x2a, 0xa9, 0xdb, 0x0a, 0x3c, 0xb6, 0x86, 0xd1, 0x7d, 0xed, 0x4d, 0xc0, - 0x90, 0x83, 0x4e, 0xd1, 0x78, 0x35, 0xe5, 0x35, 0xd8, 0xfb, 0xe5, 0x5b, - 0xe7, 0xa7, 0x55, 0x52, 0x50, 0x57, 0x2f, 0x62, 0x3d, 0xe1, 0x68, 0x41, - 0x4b, 0x32, 0xa3, 0x9d, 0xcb, 0x22, 0x2e, 0xa7, 0x51, 0xee, 0xad, 0xeb, - 0x1b, 0xbf, 0xc0, 0xd8, 0x71, 0xa6, 0x5d, 0xd2, 0x2d, 0x4a, 0x0c, 0x0e, - 0x46, 0x4c, 0xbc, 0xc0, 0x1f, 0xd8, 0x27, 0xde, 0xab, 0xe2, 0xfc, 0xed, - 0x30, 0x5b, 0x92, 0xdb, 0xe0, 0x88, 0x11, 0x61, 0x3e, 0xfc, 0x07, 0xd8, - 0x9b, 0x4a, 0xe1, 0xce, 0x64, 0x36, 0x5e, 0x9c, 0xe9, 0xaf, 0x12, 0xfe, - 0xd2, 0xca, 0x5d, 0x72, 0xa7, 0xf2, 0xe5, 0x11, 0x77, 0x56, 0x98, 0xb3, - 0xd3, 0x10, 0x00, 0x25, 0x8c, 0x6c, 0xf4, 0x17, 0x64, 0xc5, 0x26, 0x77, - 0x72, 0x0b, 0x9b, 0xe7, 0x67, 0xd1, 0x77, 0x15, 0x54, 0xbf, 0xbd, 0x77, - 0xe9, 0x13, 0x9b, 0xdb, 0xdd, 0x86, 0x41, 0x3c, 0x31, 0x8c, 0x66, 0xc3, - 0x52, 0x72, 0x23, 0xfd, 0x31, 0xb2, 0x8b, 0x4d, 0x5d, 0x4e, 0x68, 0x4a, - 0x18, 0x76, 0x17, 0x00, 0xc7, 0x03, 0xce, 0x30, 0x06, 0x7d, 0xe3, 0xd2, - 0x85, 0xce, 0xa9, 0x94, 0xaf, 0x73, 0x7b, 0x2f, 0xd2, 0xe0, 0xce, 0x2d, - 0x15, 0x6b, 0x63, 0xd3, 0x5d, 0x08, 0x22, 0x5a, 0xa1, 0x92, 0x30, 0x56, - 0xf7, 0x20, 0x42, 0x20, 0xad, 0xe0, 0x95, 0xbd, 0xbb, 0xea, 0x8f, 0x77, - 0x26, 0x2c, 0x08, 0xa6, 0x21, 0x3f, 0x83, 0x63, 0xb6, 0x49, 0xb5, 0x6f, - 0x98, 0x25, 0xcf, 0x84, 0xe9, 0x5d, 0x62, 0x76, 0x19, 0x59, 0x1b, 0x8e, - 0xd0, 0xf4, 0x66, 0x43, 0x99, 0xa9, 0xa3, 0x66, 0x38, 0x58, 0x28, 0x63, - 0x3e, 0x8a, 0xce, 0x65, 0x89, 0x55, 0x4f, 0x09, 0x43, 0x6a, 0x27, 0x7c, - 0xd3, 0x66, 0x10, 0x28, 0x0e, 0xa6, 0x5b, 0x41, 0xb7, 0x85, 0xfb, 0x2d, - 0xdb, 0xc8, 0xaa, 0xed, 0x46, 0x2c, 0x2e, 0x1f, 0x1b, 0x46, 0xff, 0x3a, - 0xdf, 0xef, 0xf8, 0x74, 0x8c, 0x42, 0x10, 0xb0, 0xc1, 0x99, 0xa9, 0x6a, - 0x62, 0xe0, 0x1f, 0x1e, 0x53, 0x2f, 0x80, 0x1f, 0x16, 0x34, 0x1e, 0x60, - 0x8e, 0x94, 0x76, 0xf9, 0x32, 0x3f, 0x3a, 0xc7, 0x00, 0x30, 0x3a, 0x19, - 0x81, 0x82, 0xe7, 0x2e, 0xf7, 0xd4, 0x5f, 0x15, 0x81, 0x40, 0xf9, 0xb3, - 0x8b, 0x91, 0xa3, 0x50, 0xb8, 0x74, 0x64, 0x2c, 0x48, 0x73, 0x0e, 0xb8, - 0x23, 0x77, 0xaa, 0xd9, 0x82, 0xac, 0x7c, 0xc0, 0x7f, 0xa3, 0x5b, 0x65, - 0x42, 0x35, 0x9b, 0x71, 0x8f, 0x3c, 0x48, 0x19, 0x36, 0xda, 0xd4, 0x15, - 0xcd, 0x2d, 0x36, 0x7f, 0x2e, 0xd0, 0x04, 0x9f, 0xa0, 0x83, 0xcd, 0x87, - 0xb0, 0x1a, 0xcb, 0xd0, 0x74, 0x90, 0xd2, 0x26, 0x02, 0xef, 0x25, 0xab, - 0x14, 0x3f, 0xb9, 0xe2, 0x0e, 0xcf, 0x91, 0xfe, 0xe7, 0x9e, 0x95, 0x5e, - 0xac, 0xf8, 0xac, 0x3f, 0x26, 0xd6, 0x8f, 0xc5, 0x16, 0x73, 0xa5, 0x71, - 0x87, 0x92, 0x6c, 0x92, 0x2a, 0x02, 0x49, 0x92, 0x83, 0xec, 0x42, 0xfe, - 0x50, 0xa7, 0x98, 0xe0, 0x0a, 0x6d, 0xf8, 0xa4, 0x08, 0x84, 0x4d, 0x03, - 0x3b, 0x51, 0x68, 0xc3, 0xa8, 0x28, 0x11, 0x5e, 0x41, 0x47, 0xe5, 0x03, - 0x86, 0xc2, 0x20, 0x80, 0x5e, 0xd5, 0xea, 0x48, 0x35, 0x7d, 0xc6, 0x93, - 0xe9, 0xf9, 0x03, 0x86, 0x8d, 0x50, 0x2f, 0xae, 0xe6, 0xca, 0x76, 0xb5, - 0xc4, 0xf9, 0xd3, 0x62, 0xf0, 0x57, 0x71, 0xe4, 0x71, 0x3d, 0x1e, 0x23, - 0xd0, 0x64, 0x11, 0xc1, 0x36, 0xbf, 0x1b, 0xe5, 0xb6, 0xda, 0x5a, 0x71, - 0x41, 0xb4, 0x09, 0xbc, 0x52, 0x5b, 0x6a, 0x2f, 0x4b, 0xa5, 0x6a, 0x7d, - 0xe5, 0x17, 0x80, 0x1b, 0x28, 0xa1, 0x01, 0xf5, 0x48, 0x6b, 0x10, 0x40, - 0x99, 0xc5, 0x1f, 0xa5, 0xc7, 0xc9, 0x36, 0x1a, 0x37, 0x4f, 0x6f, 0x86, - 0x39, 0x94, 0x1b, 0xd1, 0xb6, 0x28, 0x0a, 0xc9, 0x3d, 0x8d, 0x80, 0x10, - 0x63, 0x28, 0x4c, 0x1e, 0xd1, 0x71, 0xfa, 0xc7, 0x7c, 0x56, 0x03, 0x68, - 0x62, 0xfd, 0x84, 0x28, 0x80, 0x65, 0xd8, 0xd7, 0x38, 0xad, 0xfb, 0xde, - 0x7f, 0xe8, 0x18, 0xf7, 0x8e, 0x21, 0xe4, 0x26, 0x39, 0x2a, 0xd2, 0xae, - 0xf8, 0x42, 0xd9, 0xf7, 0xd5, 0x80, 0x1e, 0x1f, 0x10, 0x63, 0x1e, 0xf3, - 0x5a, 0x73, 0xfd, 0x2a, 0x09, 0xb3, 0xa1, 0xd6, 0xed, 0x39, 0x4f, 0xc3, - 0xa7, 0xd9, 0x17, 0x01, 0x59, 0x97, 0xfa, 0x9c, 0x3f, 0x93, 0xba, 0xac, - 0x7d, 0xfa, 0x83, 0x67, 0xe5, 0x94, 0x16, 0x5f, 0xd3, 0x9a, 0xe9, 0x7e, - 0x7c, 0x17, 0xe3, 0xdb, 0xe9, 0xd8, 0xbf, 0x2d, 0x08, 0x7f, 0xdd, 0xf2, - 0x2e, 0x49, 0x54, 0xac, 0x12, 0x90, 0x6c, 0x67, 0x4e, 0x6a, 0xad, 0x91, - 0x26, 0xba, 0x6d, 0x04, 0x70, 0x38, 0x2b, 0x6c, 0xc9, 0x34, 0x98, 0x75, - 0x68, 0xec, 0x46, 0xd4, 0xb9, 0xb4, 0x99, 0x0d, 0xb4, 0x39, 0x95, 0x4f, - 0x2c, 0x55, 0x48, 0x22, 0xd3, 0xa4, 0x17, 0x03, 0x3b, 0x9f, 0x2b, 0x70, - 0x4a, 0x55, 0xed, 0xff, 0x61, 0x6b, 0x15, 0xb7, 0xb1, 0x6c, 0x33, 0x78, - 0xf3, 0x3f, 0x94, 0xa1, 0x25, 0xd6, 0xa3, 0x14, 0x6e, 0xa8, 0xbe, 0x86, - 0x44, 0xf7, 0xc1, 0xfd, 0xee, 0x6a, 0x17, 0xab, 0x1d, 0x84, 0x61, 0x6a, - 0x77, 0xc5, 0x79, 0xc1, 0x62, 0x86, 0xe3, 0x38, 0x8b, 0x34, 0x1a, 0x74, - 0x88, 0x4b, 0xd9, 0xae, 0x58, 0x4a, 0x46, 0xf4, 0xef, 0xe7, 0xb0, 0xeb, - 0xcd, 0xfd, 0xb6, 0xad, 0xd7, 0x17, 0x27, 0x97, 0x66, 0x77, 0x7e, 0xc3, - 0x67, 0x1d, 0x24, 0x2a, 0x6a, 0x02, 0x4d, 0x8a, 0x71, 0xa8, 0x54, 0x2c, - 0x67, 0xa0, 0x8b, 0x57, 0x95, 0x26, 0x4c, 0x08, 0x60, 0xa7, 0xe4, 0xf3, - 0x07, 0x1c, 0xe6, 0x4f, 0x7a, 0x09, 0x3f, 0xc0, 0xb5, 0x8c, 0x1c, 0xfb, - 0x41, 0x19, 0xdf, 0xe8, 0x01, 0x4f, 0xc0, 0x57, 0x98, 0x8a, 0x80, 0xaf, - 0xe4, 0x4b, 0x3e, 0x69, 0x65, 0x33, 0x4d, 0xaa, 0x9b, 0x22, 0xd6, 0x29, - 0xc9, 0x4d, 0x78, 0xb8, 0xa7, 0x2d, 0xce, 0x99, 0x09, 0x64, 0xa9, 0x60, - 0xde, 0x75, 0x28, 0x68, 0xcc, 0x19, 0x25, 0x8f, 0x7f, 0x46, 0x4a, 0xfc, - 0xbe, 0x54, 0xa5, 0xa7, 0xca, 0xae, 0xeb, 0x85, 0xd1, 0x8d, 0x8a, 0xe3, - 0x2b, 0x06, 0xe2, 0x1f, 0xe2, 0x77, 0x91, 0x39, 0xd8, 0xd0, 0xf7, 0xeb, - 0x01, 0xe8, 0x0e, 0x70, 0x31, 0x6e, 0xa7, 0x75, 0xd9, 0xd1, 0x27, 0x1d, - 0xa2, 0x9f, 0x6e, 0xa0, 0x92, 0x98, 0xce, 0xab, 0x3d, 0x37, 0x5d, 0x39, - 0xf8, 0x33, 0xd6, 0xce, 0x7d, 0x96, 0x80, 0x64, 0x46, 0x00, 0xda, 0x7f, - 0xba, 0x24, 0x73, 0x0e, 0x40, 0x76, 0x0a, 0x1f, 0x3e, 0xd2, 0xf1, 0xf7, - 0x7a, 0xc7, 0xb2, 0x81, 0xc8, 0xa9, 0x47, 0x5c, 0x05, 0x3d, 0xbf, 0xc1, - 0x74, 0x45, 0xe7, 0xfc, 0xe7, 0xae, 0x71, 0xce, 0x4f, 0x33, 0x49, 0x63, - 0x2e, 0x4a, 0xa0, 0x7a, 0x31, 0x90, 0x7b, 0x6b, 0xf0, 0x69, 0x80, 0x92, - 0x65, 0xef, 0x8b, 0xce, 0x5e, 0x28, 0x10, 0xa1, 0x89, 0xb7, 0x30, 0x3e, - 0x8a, 0x83, 0xd7, 0x3c, 0x3d, 0x1c, 0xdc, 0x4d, 0xd0, 0xa4, 0x17, 0x50, - 0x45, 0x08, 0x4a, 0xf0, 0xfc, 0xb0, 0x46, 0xc5, 0x59, 0x27, 0x9a, 0x7e, - 0xde, 0xab, 0xeb, 0x20, 0x86, 0xa8, 0xcd, 0x5c, 0x43, 0x19, 0x67, 0x2f, - 0x6f, 0xbf, 0x34, 0x19, 0x73, 0xef, 0x26, 0x4e, 0xa2, 0xf7, 0x6e, 0xea, - 0x0b, 0x04, 0x12, 0xe1, 0x9f, 0xc9, 0xea, 0xf8, 0x6d, 0x02, 0x46, 0xa0, - 0xca, 0xf8, 0x32, 0x12, 0x79, 0xce, 0x37, 0xe2, 0x36, 0x9c, 0x58, 0x67, - 0x5b, 0xe8, 0x73, 0xd9, 0x81, 0x2f, 0x2b, 0xe5, 0x0b, 0x84, 0x12, 0xf2, - 0x9f, 0xc9, 0xea, 0xfe, 0x7b, 0x77, 0x71, 0x40, 0x9c, 0x75, 0x36, 0x84, - 0x8d, 0x98, 0x3e, 0x75, 0xff, 0xe6, 0x46, 0x35, 0xc1, 0x44, 0xc1, 0x6d, - 0x97, 0x31, 0x27, 0x4f, 0x91, 0x88, 0x51, 0x73, 0x46, 0xe2, 0x8f, 0xbd, - 0x1b, 0xa9, 0xac, 0xeb, 0xc0, 0x0a, 0x1a, 0x27, 0x9c, 0x22, 0x83, 0x09, - 0x8b, 0x14, 0x25, 0x3a, 0x8f, 0xd2, 0xbf, 0x65, 0xb5, 0x3a, 0x51, 0xdf, - 0x28, 0xa5, 0xf9, 0x1c, 0x7d, 0xeb, 0x9c, 0x10, 0x6a, 0x25, 0x41, 0x48, - 0xff, 0x11, 0x2f, 0xf2, 0x5e, 0x17, 0xfc, 0x27, 0x85, 0x60, 0x2e, 0x4c, - 0xc6, 0x7e, 0x8b, 0xf9, 0x64, 0x17, 0x81, 0x25, 0x0a, 0xc6, 0xc3, 0x41, - 0x3d, 0x10, 0x0e, 0xc3, 0x45, 0x86, 0xb8, 0x96, 0x38, 0xec, 0x81, 0xed, - 0xe3, 0x7e, 0x91, 0x9b, 0x3c, 0x99, 0x92, 0x89, 0xd1, 0xcf, 0x77, 0xe3, - 0x4d, 0x32, 0x25, 0x90, 0x59, 0x40, 0x3a, 0xab, 0x5b, 0x21, 0x17, 0x03, - 0xe8, 0x4d, 0x6a, 0x9f, 0x04, 0x28, 0x79, 0x55, 0xfd, 0xd3, 0x6b, 0xa8, - 0xb1, 0xdd, 0xd8, 0xac, 0xb8, 0x31, 0x64, 0xb2, 0xae, 0x82, 0x53, 0x79, - 0x86, 0x9d, 0x39, 0x09, 0x23, 0xe5, 0xe9, 0xc4, 0xf2, 0xf6, 0xd8, 0x97, - 0x43, 0xc8, 0x0b, 0x73, 0xf9, 0xc5, 0x5f, 0x17, 0xd6, 0x98, 0x60, 0x01, - 0xf8, 0x6d, 0x37, 0x76, 0x21, 0x91, 0xf0, 0x13, 0xe2, 0xe2, 0x30, 0xc8, - 0x09, 0x65, 0x03, 0xfa, 0x7e, 0x67, 0xa7, 0xa8, 0x33, 0x63, 0x74, 0xd0, - 0x6c, 0xc6, 0x77, 0xae, 0xf7, 0x72, 0xe4, 0x13, 0x7d, 0x7e, 0xf5, 0xc6, - 0xb5, 0x20, 0xc2, 0x52, 0x38, 0x48, 0x01, 0xc4, 0x29, 0xf6, 0x34, 0x38, - 0x16, 0xd6, 0x0b, 0xd3, 0xcb, 0x1b, 0xe8, 0x5c, 0x60, 0x7b, 0xf1, 0x23, - 0x6c, 0x28, 0xdc, 0xd3, 0x25, 0x1c, 0x3a, 0xc7, 0x7e, 0xb7, 0x11, 0xc8, - 0x05, 0xb3, 0xbd, 0x30, 0x29, 0x4e, 0x97, 0xa2, 0x74, 0xc2, 0xe9, 0xc1, - 0xbd, 0xff, 0x2a, 0x68, 0xf2, 0x2f, 0xd6, 0x26, 0xc3, 0x2a, 0x94, 0xcc, - 0x08, 0x93, 0xb3, 0x8c, 0x2d, 0x55, 0x3f, 0x72, 0x23, 0x21, 0x99, 0xa6, - 0x7a, 0xd1, 0x0c, 0xec, 0x5d, 0x90, 0x8f, 0xcd, 0x16, 0x3d, 0xe2, 0x6e, - 0x47, 0x26, 0x46, 0x32, 0xb4, 0x6e, 0x85, 0x28, 0x84, 0xa8, 0x3f, 0x43, - 0x5f, 0x29, 0x7d, 0x4a, 0x4a, 0x7a, 0xd5, 0x44, 0x75, 0x95, 0xab, 0x21, - 0x05, 0x85, 0x37, 0x7f, 0x13, 0xdf, 0x37, 0x79, 0xf7, 0x13, 0xaa, 0xc1, - 0x41, 0x94, 0x17, 0x22, 0x05, 0xfd, 0x88, 0x1c, 0x0d, 0x33, 0xe7, 0xf0, - 0xf2, 0x1a, 0x8b, 0x99, 0xd7, 0xbd, 0x80, 0xe7, 0xee, 0x8f, 0xeb, 0x54, - 0xf1, 0xa1, 0xbf, 0x54, 0xbc, 0x69, 0xa6, 0xeb, 0xa8, 0x29, 0x1d, 0x13, - 0xfd, 0x38, 0x19, 0xfe, 0x8f, 0x88, 0xa1, 0xbf, 0xe4, 0xd9, 0x33, 0x11, - 0xda, 0xd4, 0x4e, 0x1c, 0xb9, 0xa4, 0x85, 0xf5, 0xbc, 0x44, 0xeb, 0xed, - 0xc0, 0x1b, 0xd9, 0x31, 0x84, 0x0f, 0xef, 0xa9, 0x81, 0xf2, 0xf0, 0x66, - 0x40, 0xc2, 0xe6, 0xbf, 0xce, 0xdb, 0x9b, 0x0d, 0x8a, 0x56, 0xcf, 0xf0, - 0xb2, 0xba, 0xc4, 0x70, 0x46, 0xb5, 0x61, 0x95, 0x8b, 0xdb, 0x7d, 0xc6, - 0xc1, 0x05, 0xbf, 0x7b, 0x04, 0x2c, 0x81, 0xd3, 0x37, 0x3c, 0x27, 0x6b, - 0x74, 0x20, 0x90, 0xa4, 0x77, 0x42, 0x95, 0x03, 0xb5, 0x27, 0x7c, 0xba, - 0xc0, 0x59, 0xd9, 0xae, 0xc8, 0xe3, 0x94, 0x85, 0xa4, 0x70, 0x2d, 0xf7, - 0xeb, 0x4d, 0x13, 0x7f, 0x5a, 0xd6, 0xd5, 0x44, 0xaf, 0x24, 0x10, 0xcc, - 0x77, 0x5d, 0xb6, 0x50, 0x6a, 0xe1, 0x67, 0x10, 0xa5, 0xf2, 0xe2, 0x8b, - 0xf9, 0x99, 0x19, 0x8c, 0x9b, 0x6e, 0xc8, 0xe9, 0x84, 0x29, 0x95, 0xbc, - 0x19, 0xb5, 0x06, 0xf5, 0xb6, 0x35, 0x6c, 0x3c, 0x05, 0x92, 0x35, 0x3b, - 0x23, 0x79, 0x9c, 0x57, 0x30, 0xa9, 0x4f, 0xc9, 0xb0, 0x1d, 0xd3, 0xea, - 0x92, 0xf9, 0xda, 0xab, 0xcf, 0x37, 0x06, 0x8a, 0xe8, 0xc9, 0x02, 0xd5, - 0x2c, 0xbc, 0xf6, 0xc5, 0xbb, 0xdd, 0x5e, 0x94, 0xc1, 0xe0, 0xdd, 0x6a, - 0x19, 0xfe, 0xce, 0xeb, 0x63, 0x4d, 0xa1, 0x75, 0x32, 0x04, 0x26, 0x65, - 0xa7, 0xae, 0x99, 0x7a, 0xb2, 0x08, 0xb7, 0x04, 0xc3, 0xfd, 0x9c, 0xd5, - 0x32, 0x2b, 0x55, 0x80, 0xbc, 0x09, 0xb6, 0xf9, 0xce, 0x06, 0xd5, 0xee, - 0xdf, 0x6a, 0xc6, 0xc9, 0xaf, 0xc9, 0xb1, 0x49, 0xff, 0xc8, 0x87, 0x85, - 0xf4, 0x0b, 0x3e, 0xb2, 0x38, 0xc4, 0x44, 0x46, 0x40, 0x51, 0x6e, 0x88, - 0x5d, 0x32, 0xfc, 0xeb, 0x8a, 0xd4, 0x8d, 0x8e, 0x52, 0x7a, 0xa8, 0x5b, - 0x4a, 0x15, 0xb7, 0x49, 0x43, 0x50, 0x95, 0xbd, 0x76, 0x0c, 0xab, 0x3f, - 0x26, 0x26, 0x79, 0x95, 0xb0, 0xa0, 0x2f, 0xeb, 0xeb, 0x4f, 0xeb, 0x31, - 0x7e, 0xd0, 0x14, 0x60, 0xad, 0x96, 0x57, 0xba, 0xc4, 0xfe, 0x9c, 0x1d, - 0x28, 0xd2, 0xbd, 0xdd, 0xca, 0xfa, 0xaa, 0x1d, 0xbb, 0xba, 0xd7, 0x45, - 0x26, 0x2c, 0x58, 0x31, 0xb9, 0xaa, 0xdd, 0xc5, 0xf2, 0xd4, 0xc5, 0xbb, - 0x50, 0x48, 0x04, 0x9d, 0xf9, 0x56, 0x6e, 0xb6, 0x4b, 0x76, 0x5b, 0xef, - 0x56, 0x2f, 0xc1, 0x09, 0xc3, 0x35, 0x1e, 0xe2, 0xaa, 0x8f, 0xf9, 0x49, - 0xdf, 0x53, 0x94, 0xc0, 0x59, 0x2f, 0xcd, 0x52, 0xe1, 0xe7, 0x69, 0xe3, - 0x0a, 0x05, 0xe4, 0xbb, 0x0d, 0x8c, 0x2d, 0x8d, 0xda, 0xad, 0x49, 0xee, - 0xaa, 0xe9, 0xc7, 0xb0, 0x05, 0xfc, 0xa5, 0x06, 0xbb, 0x21, 0x95, 0x47, - 0xa2, 0x2a, 0xc7, 0xff, 0x32, 0x27, 0x05, 0x73, 0x1d, 0x8e, 0x0d, 0x97, - 0x29, 0xdd, 0x9f, 0x64, 0xd9, 0xac, 0xfe, 0xf4, 0x44, 0xb9, 0xb4, 0xec, - 0xce, 0xbb, 0x81, 0x4f, 0xcc, 0x65, 0xaa, 0xc9, 0xe2, 0x61, 0x98, 0x45, - 0x4c, 0xa9, 0xad, 0xcb, 0x5e, 0xe4, 0xb7, 0x5b, 0xe5, 0x4a, 0x75, 0x12, - 0x2a, 0x7f, 0x91, 0x7f, 0x15, 0x10, 0x73, 0x2f, 0xd3, 0x86, 0xce, 0x3c, - 0x93, 0x81, 0x09, 0xfd, 0x79, 0x6b, 0x22, 0x26, 0x86, 0x16, 0x66, 0xa4, - 0x24, 0x27, 0x4f, 0x48, 0xd3, 0xce, 0x51, 0x97, 0x7d, 0x91, 0xff, 0x34, - 0x30, 0x53, 0x21, 0x20, 0x3d, 0xd4, 0x21, 0x2d, 0x0b, 0xa8, 0x9e, 0xb6, - 0x23, 0x18, 0x78, 0xb7, 0x57, 0x40, 0xa1, 0x51, 0xed, 0xb9, 0xca, 0xce, - 0xd6, 0x33, 0x7d, 0x3d, 0x91, 0xde, 0x11, 0x9e, 0xcb, 0x0e, 0xeb, 0x3b, - 0x59, 0x96, 0x07, 0x35, 0x1c, 0x9a, 0x1c, 0x11, 0xa9, 0x35, 0xc8, 0xa1, - 0x93, 0x4f, 0x50, 0xb8, 0xf0, 0x1d, 0x17, 0x47, 0x1c, 0x3b, 0x9e, 0x10, - 0xf3, 0xdc, 0xaf, 0x30, 0xcc, 0x72, 0xf1, 0x6f, 0x26, 0x8c, 0xa7, 0xb5, - 0x9c, 0x87, 0x7a, 0x04, 0x17, 0x8c, 0x6d, 0x1d, 0x82, 0x3d, 0xbe, 0xad, - 0x19, 0x40, 0xce, 0x78, 0x01, 0xc2, 0xcb, 0x06, 0xd0, 0x2a, 0xfa, 0x59, - 0x54, 0x4d, 0x8a, 0x0b, 0x95, 0xac, 0x54, 0x10, 0x21, 0xd6, 0xce, 0xb4, - 0xaf, 0xa0, 0x35, 0x8e, 0xfa, 0x56, 0xb8, 0x61, 0x49, 0x6e, 0x61, 0x20, - 0xaf, 0x65, 0x05, 0xe0, 0x99, 0xb6, 0xcd, 0x79, 0xa0, 0xe6, 0xcb, 0x84, - 0x0f, 0xfb, 0x7f, 0x89, 0xb6, 0x55, 0x2f, 0xd9, 0x3a, 0x8f, 0x56, 0xcb, - 0xf0, 0xd3, 0xc3, 0xd6, 0x8a, 0x46, 0x09, 0xb1, 0xa7, 0xbf, 0x77, 0x0c, - 0xeb, 0xf4, 0x67, 0xca, 0x9d, 0x10, 0x0b, 0x52, 0x67, 0x45, 0x50, 0x13, - 0xb7, 0x8f, 0x0a, 0x2e, 0xc4, 0x81, 0x2b, 0xfc, 0xba, 0x63, 0xb5, 0x17, - 0x33, 0xf3, 0xfd, 0xed, 0xf8, 0xc1, 0x56, 0xa0, 0x78, 0xba, 0xb8, 0xb8, - 0x5e, 0x71, 0x26, 0x47, 0x8f, 0xe7, 0x25, 0x02, 0x83, 0xbe, 0x2f, 0xa0, - 0xfc, 0xf7, 0x0e, 0x2b, 0x95, 0x48, 0xef, 0xd8, 0xc5, 0xd9, 0x7b, 0x1a, - 0x47, 0x01, 0x71, 0xe5, 0xb9, 0xc6, 0xe7, 0x58, 0x00, 0x4d, 0xd5, 0x04, - 0xd8, 0x7e, 0x6f, 0x97, 0x49, 0xc2, 0xc6, 0x90, 0x3a, 0xd0, 0x20, 0x71, - 0x12, 0xd0, 0xb3, 0x0e, 0x2e, 0x89, 0x57, 0x87, 0xbc, 0x29, 0x58, 0x4d, - 0xe7, 0x10, 0xd1, 0xc7, 0x53, 0xa4, 0xba, 0xae, 0xd0, 0x63, 0x6c, 0x86, - 0xf2, 0xf7, 0xa6, 0xc0, 0x65, 0x7e, 0x74, 0x4e, 0xbb, 0x91, 0x29, 0x18, - 0xde, 0x51, 0xda, 0xbf, 0x7c, 0xb7, 0x15, 0x69, 0x46, 0x62, 0x22, 0xc4, - 0x75, 0x96, 0xfd, 0x37, 0x65, 0xe5, 0xfd, 0x50, 0xb5, 0x37, 0xb6, 0xa4, - 0x70, 0xff, 0x50, 0x6d, 0x0f, 0x97, 0x71, 0x4a, 0xb2, 0xbc, 0x30, 0x07, - 0x7b, 0x9a, 0x91, 0x0b, 0xb2, 0x53, 0x63, 0xb1, 0x31, 0xe9, 0x22, 0xb6, - 0x54, 0xac, 0x23, 0x0a, 0x0f, 0x13, 0x7d, 0xe6, 0x14, 0x15, 0x4d, 0x96, - 0xca, 0xc1, 0x00, 0xb0, 0x08, 0x53, 0x08, 0x80, 0xcb, 0x3b, 0x90, 0x9c, - 0x09, 0xe3, 0x8c, 0x63, 0x32, 0xcc, 0xdc, 0x57, 0xe6, 0x95, 0xd2, 0xa9, - 0xad, 0x03, 0x7f, 0xe9, 0x4d, 0x2a, 0x46, 0x6e, 0x0b, 0xb8, 0xd6, 0x83, - 0x42, 0xe6, 0xbf, 0xa2, 0x93, 0x38, 0x53, 0x5a, 0x35, 0xf9, 0x0f, 0xd5, - 0xc2, 0x50, 0x15, 0x2c, 0x48, 0xfd, 0x36, 0x0b, 0xfa, 0x33, 0xdf, 0xaf, - 0x7e, 0x14, 0xb3, 0x0f, 0x0c, 0x1a, 0xf1, 0xfb, 0x08, 0x6e, 0x6a, 0x51, - 0x8c, 0xc8, 0xf2, 0xe8, 0x6c, 0x6e, 0xe2, 0x8f, 0x53, 0x57, 0x42, 0x01, - 0x85, 0x6a, 0x53, 0x26, 0xd3, 0xc8, 0x08, 0x4e, 0x11, 0xe9, 0x1d, 0xe5, - 0x4e, 0x53, 0xa6, 0x23, 0xb7, 0xa6, 0x14, 0x80, 0x95, 0xc4, 0x1c, 0xe6, - 0xfc, 0xbd, 0xe5, 0x88, 0xae, 0xaf, 0x30, 0xaa, 0x0a, 0x5e, 0x28, 0xa4, - 0x60, 0x3d, 0xa9, 0xc2, 0x87, 0x16, 0xd5, 0xa1, 0xc0, 0xca, 0xec, 0x46, - 0x12, 0xe1, 0x64, 0x19, 0xa8, 0x09, 0x5c, 0x1d, 0xc4, 0x03, 0x72, 0xfa, - 0xbf, 0x5b, 0xec, 0x59, 0x81, 0x93, 0x5c, 0x4f, 0xb8, 0x27, 0x8e, 0xa3, - 0x36, 0x3e, 0x45, 0x54, 0x88, 0xef, 0xc2, 0xc2, 0xe0, 0xb0, 0x93, 0x9b, - 0x06, 0xdc, 0xd9, 0x15, 0x58, 0x55, 0xa5, 0x01, 0xab, 0xdb, 0xff, 0x45, - 0x23, 0x1e, 0x21, 0xb4, 0x12, 0x3b, 0x7d, 0x58, 0xd9, 0x08, 0xca, 0x89, - 0xd2, 0x16, 0xb8, 0xb3, 0x35, 0xc4, 0xbe, 0x90, 0x3b, 0xe8, 0xfd, 0xf7, - 0x99, 0x3c, 0x62, 0x2b, 0x9f, 0x7d, 0x0b, 0x64, 0xec, 0x0d, 0xb1, 0x52, - 0xb1, 0x4b, 0x7d, 0x37, 0x67, 0x0d, 0xec, 0xa5, 0x53, 0x46, 0xfc, 0xe8, - 0xb8, 0x7c, 0x1c, 0xb5, 0x58, 0x75, 0x38, 0x53, 0xdc, 0xb7, 0x5b, 0x32, - 0xfb, 0x2f, 0xec, 0xb8, 0xfd, 0x45, 0x8c, 0x22, 0xc5, 0x20, 0x67, 0xc9, - 0x77, 0xea, 0xd7, 0xf5, 0x02, 0x15, 0x5f, 0xc3, 0x0e, 0xe2, 0xcb, 0x33, - 0xbe, 0x8e, 0xa5, 0x27, 0xf5, 0x57, 0x44, 0x76, 0x33, 0xca, 0x5f, 0xc1, - 0xf0, 0x23, 0x4d, 0x58, 0x34, 0x2e, 0xdd, 0xdb, 0x07, 0x7c, 0x23, 0x71, - 0x3f, 0xae, 0xc6, 0xd5, 0x93, 0x55, 0x3a, 0x2d, 0x7a, 0x69, 0x09, 0x0b, - 0xff, 0xc1, 0x98, 0x91, 0x45, 0xd2, 0x05, 0x0c, 0x8e, 0xa3, 0xbc, 0xa1, - 0x2c, 0xd3, 0x30, 0xa8, 0x36, 0x1d, 0x01, 0x52, 0x0c, 0x1d, 0x5b, 0xbe, - 0x89, 0x46, 0xf7, 0x31, 0xa1, 0x3a, 0x79, 0x92, 0x05, 0x1b, 0x21, 0x2f, - 0x9c, 0xf1, 0x71, 0x03, 0xaa, 0x5c, 0x82, 0x0b, 0x65, 0x16, 0xe5, 0xc4, - 0x49, 0x44, 0xc6, 0x83, 0x54, 0x55, 0xf9, 0x0c, 0x8c, 0xc0, 0x23, 0xfe, - 0x81, 0x02, 0x50, 0xf2, 0xf5, 0xbe, 0xdf, 0x66, 0xd0, 0x50, 0xc8, 0x2d, - 0x00, 0xce, 0x9e, 0x1d, 0x16, 0xa5, 0x0f, 0x77, 0x64, 0x5a, 0x5c, 0xaf, - 0x6b, 0x1d, 0x3b, 0xc8, 0x2d, 0xe5, 0x28, 0xbf, 0x2e, 0x26, 0x73, 0xb4, - 0x7a, 0x1f, 0xbb, 0x95, 0xb1, 0xd3, 0x14, 0x5f, 0x99, 0x3d, 0x02, 0x3d, - 0x1d, 0x55, 0x76, 0x1a, 0x7d, 0x17, 0xa5, 0x64, 0xc4, 0x94, 0x6f, 0x20, - 0x4c, 0xc1, 0x01, 0x0f, 0x78, 0xa6, 0x2f, 0x5d, 0x6e, 0xae, 0x62, 0x14, - 0x46, 0x0a, 0x89, 0x10, 0x12, 0x92, 0xae, 0x14, 0xb2, 0x1b, 0xb9, 0x37, - 0x35, 0xcd, 0x1f, 0x42, 0x4a, 0x1b, 0x77, 0x6b, 0x89, 0x52, 0x3c, 0x12, - 0x76, 0xb3, 0x84, 0x34, 0x01, 0x76, 0xe5, 0xde, 0xdc, 0xd0, 0xd1, 0xce, - 0xcf, 0xab, 0x98, 0x10, 0x2e, 0x1b, 0x87, 0x38, 0xa7, 0x41, 0xfa, 0xc3, - 0x55, 0x78, 0x0e, 0x63, 0x42, 0xf6, 0x57, 0x41, 0xdc, 0xb6, 0x78, 0x7a, - 0xa4, 0xd1, 0xa6, 0x88, 0x1c, 0xbd, 0x89, 0x09, 0xb6, 0xf2, 0x83, 0xc2, - 0x14, 0x37, 0xde, 0x23, 0xbf, 0x2e, 0x33, 0x3c, 0xfa, 0xd7, 0x5f, 0xc4, - 0xe8, 0xc1, 0x86, 0x88, 0x4f, 0x72, 0xcb, 0x97, 0x13, 0x03, 0x5a, 0xe4, - 0x1f, 0xe8, 0xd4, 0x87, 0x07, 0xa1, 0xa0, 0x16, 0x95, 0xdf, 0x64, 0xc6, - 0x8d, 0x78, 0xb6, 0xdf, 0x4b, 0xdd, 0x3d, 0xe8, 0x0c, 0x28, 0xd4, 0x03, - 0x5d, 0x76, 0x5f, 0x5c, 0x82, 0xd2, 0x9e, 0x43, 0x72, 0xb3, 0x97, 0x46, - 0x4d, 0xfe, 0x40, 0xb9, 0x98, 0xc5, 0x80, 0x53, 0x03, 0x70, 0x10, 0xee, - 0xfb, 0x6e, 0x32, 0x2b, 0xad, 0x67, 0xde, 0x58, 0x93, 0x8d, 0x15, 0xd2, - 0xe9, 0x18, 0x19, 0x07, 0xd2, 0xdf, 0x8e, 0x12, 0xb7, 0x4c, 0x56, 0x5d, - 0x00, 0x36, 0xdf, 0xa9, 0xf6, 0xb3, 0x6c, 0x65, 0x79, 0xd9, 0xd0, 0x65, - 0x92, 0x6e, 0xe8, 0xd5, 0x92, 0xf1, 0x3b, 0x92, 0x1c, 0xbe, 0x3f, 0xc0, - 0x48, 0xc2, 0x57, 0x8e, 0x23, 0x03, 0xe7, 0x22, 0x95, 0xec, 0xe9, 0xcf, - 0x19, 0x5b, 0x42, 0x0c, 0x11, 0x5a, 0xea, 0x6a, 0x8a, 0x4d, 0x1b, 0x10, - 0xde, 0x5e, 0x9f, 0xad, 0xff, 0x18, 0x2f, 0x28, 0xea, 0x1b, 0xc7, 0x7d, - 0x85, 0xd3, 0x8d, 0x03, 0xfa, 0x06, 0xef, 0x2f, 0xe8, 0x6e, 0x7e, 0xa2, - 0x16, 0xfd, 0x85, 0x81, 0x39, 0xb0, 0x60, 0x76, 0x9e, 0xdd, 0x06, 0xd7, - 0xf3, 0x16, 0xe1, 0x87, 0x7f, 0x05, 0x71, 0x66, 0xc5, 0xb8, 0xbc, 0x7e, - 0x97, 0xa2, 0x92, 0x20, 0x4b, 0xc1, 0x42, 0xac, 0x55, 0x82, 0x13, 0xf9, - 0x75, 0x43, 0xc4, 0xf4, 0xd1, 0xee, 0xef, 0xaf, 0x0b, 0x6b, 0x55, 0xb8, - 0xec, 0x40, 0x93, 0x0e, 0x61, 0x15, 0x58, 0xcf, 0xca, 0xd7, 0x16, 0x53, - 0x7a, 0x9a, 0xbf, 0xe0, 0xf9, 0x62, 0x9c, 0xd2, 0x9b, 0x45, 0x5f, 0xd0, - 0x2a, 0x3e, 0x72, 0x0a, 0xf7, 0x6c, 0x95, 0x8c, 0xdf, 0x84, 0x34, 0x42, - 0x69, 0xf5, 0x46, 0x7f, 0xeb, 0x16, 0x62, 0xfc, 0x55, 0xea, 0x22, 0xec, - 0xaa, 0xf5, 0xd4, 0x4a, 0x00, 0x20, 0x61, 0x71, 0x56, 0x07, 0xaa, 0x10, - 0x54, 0xc0, 0x9e, 0x48, 0x51, 0x22, 0x88, 0xf2, 0x09, 0x89, 0xa8, 0xe9, - 0x4c, 0xd7, 0x23, 0x27, 0xca, 0xc3, 0x37, 0x7b, 0x63, 0x8d, 0xf5, 0x1e, - 0x8f, 0xb9, 0x95, 0xd4, 0x86, 0x0c, 0x8d, 0x8a, 0x6a, 0xe3, 0xbb, 0x03, - 0xbd, 0x9d, 0x91, 0xec, 0x9e, 0x50, 0x56, 0x3b, 0x5b, 0xdf, 0x96, 0x85, - 0x61, 0x12, 0x78, 0x19, 0x8f, 0x43, 0xed, 0xa9, 0x70, 0x59, 0x36, 0xc2, - 0xe3, 0x04, 0xe5, 0xf9, 0xf3, 0xe1, 0x9e, 0x72, 0x1e, 0x6b, 0xed, 0x2d, - 0x14, 0xa5, 0xa6, 0x63, 0x80, 0xa3, 0x6c, 0x6d, 0xa9, 0x24, 0x6f, 0xf7, - 0x46, 0x5a, 0xed, 0x6c, 0xd9, 0xb4, 0x54, 0xba, 0x25, 0x52, 0x83, 0xbe, - 0x1b, 0x1f, 0xc0, 0xdc, 0xd4, 0x36, 0x91, 0xe8, 0xfd, 0x15, 0x07, 0xd3, - 0x08, 0x03, 0xcb, 0x6a, 0x4d, 0xb9, 0x2b, 0x3a, 0xfe, 0x9c, 0x83, 0xaf, - 0x0d, 0xa0, 0x47, 0xff, 0x11, 0x4d, 0x7d, 0xa9, 0x68, 0x1c, 0x55, 0x8e, - 0xdb, 0x03, 0x81, 0x57, 0x3e, 0x98, 0x2e, 0x83, 0x00, 0xdb, 0xa9, 0x16, - 0xf8, 0x2f, 0x50, 0x15, 0x49, 0x4f, 0x86, 0x52, 0x85, 0x29, 0x8e, 0xc4, - 0xfd, 0xdf, 0x36, 0xed, 0xcc, 0xd5, 0xe7, 0x9b, 0xa7, 0x52, 0xc4, 0x46, - 0x43, 0x0c, 0x64, 0x07, 0xd4, 0xb2, 0x00, 0x0f, 0xf9, 0x41, 0x6e, 0xfa, - 0x1e, 0x1c, 0xd0, 0x33, 0x94, 0x47, 0xef, 0x33, 0x9d, 0xd2, 0x59, 0x2c, - 0x13, 0xc3, 0x5a, 0x69, 0x61, 0xcd, 0x87, 0x2d, 0x1f, 0xba, 0xef, 0xd1, - 0xaf, 0xcf, 0xfe, 0x78, 0x5b, 0x0c, 0xf6, 0xd6, 0x57, 0xb3, 0x3a, 0xd7, - 0x46, 0xc0, 0x0f, 0x74, 0x28, 0x13, 0xf3, 0x77, 0x08, 0x71, 0x0b, 0x5c, - 0x31, 0xc1, 0x4b, 0x47, 0x1e, 0x41, 0x6f, 0x79, 0xcb, 0x88, 0x99, 0xde, - 0xac, 0x26, 0x30, 0xee, 0x4b, 0xc3, 0x10, 0xbc, 0x47, 0x01, 0xac, 0xb9, - 0x5b, 0x79, 0x77, 0x00, 0xe3, 0x0e, 0x6f, 0xa1, 0x91, 0xc9, 0x7c, 0xc1, - 0xa5, 0xca, 0xea, 0xeb, 0x17, 0x49, 0x48, 0x14, 0xf7, 0x27, 0x05, 0x9d, - 0x22, 0xfe, 0x8d, 0x3d, 0xde, 0xa5, 0x99, 0xff, 0x28, 0x25, 0xfc, 0xa4, - 0xcf, 0xe4, 0x6c, 0x7f, 0x70, 0x24, 0x73, 0x90, 0xf7, 0xde, 0x78, 0x0f, - 0x38, 0x10, 0xef, 0x60, 0x99, 0x49, 0xa9, 0xd6, 0x4c, 0x50, 0xab, 0x61, - 0x02, 0x6e, 0x21, 0x8d, 0x1e, 0x2b, 0x3a, 0xa1, 0x52, 0x28, 0x78, 0xe9, - 0x9b, 0x8e, 0x9c, 0x17, 0x1d, 0x5c, 0xec, 0x3f, 0x08, 0x82, 0xf8, 0x99, - 0x1c, 0xdc, 0x51, 0xc5, 0x24, 0xf2, 0x01, 0x58, 0xe7, 0xaf, 0x76, 0x9f, - 0xf3, 0x39, 0xde, 0x1f, 0x7e, 0x3f, 0x90, 0x76, 0xb4, 0x70, 0x9d, 0x4e, - 0x10, 0x29, 0xcb, 0xe7, 0x2a, 0xdc, 0x33, 0x74, 0x20, 0xcd, 0xc2, 0x29, - 0x2d, 0xef, 0xfb, 0xe1, 0x80, 0x8d, 0x32, 0x7b, 0x1b, 0x49, 0xd5, 0x20, - 0x45, 0xc8, 0xb8, 0xc0, 0x09, 0x72, 0xc0, 0xa9, 0x27, 0x79, 0x26, 0x65, - 0x4f, 0x1c, 0xa7, 0x31, 0x67, 0x25, 0xd6, 0x29, 0x8f, 0x3f, 0xae, 0xee, - 0x01, 0x17, 0x33, 0xee, 0xc1, 0x12, 0x87, 0xeb, 0x52, 0x52, 0xf1, 0xd2, - 0x79, 0x7c, 0x2f, 0x28, 0xfb, 0x48, 0x90, 0x17, 0x68, 0x47, 0xae, 0x82, - 0x58, 0x98, 0x6d, 0x7c, 0x68, 0x4b, 0x96, 0x81, 0x29, 0x3e, 0x9f, 0x2a, - 0xbb, 0x95, 0x4c, 0xd0, 0x25, 0x38, 0x55, 0x64, 0x00, 0x62, 0x6d, 0x10, - 0x62, 0x0f, 0x83, 0x1b, 0xdb, 0x2b, 0x96, 0xb3, 0xdc, 0x72, 0x1d, 0x5a, - 0xe1, 0x9c, 0x94, 0x96, 0xfd, 0xd9, 0x72, 0xeb, 0x25, 0x37, 0x03, 0x14, - 0x7b, 0xe5, 0x29, 0xbc, 0x96, 0xb0, 0x6f, 0x31, 0x53, 0x75, 0x5c, 0x22, - 0x75, 0x37, 0x83, 0x89, 0x4e, 0xe7, 0x32, 0x25, 0x60, 0x6a, 0xe0, 0x1f, - 0x4c, 0xdc, 0x85, 0x62, 0xab, 0x3a, 0xd5, 0xd8, 0x4f, 0x8b, 0x7c, 0x82, - 0x23, 0xd2, 0x65, 0x32, 0x9a, 0x2c, 0x71, 0x47, 0xdc, 0xdb, 0x7e, 0x13, - 0x8e, 0x2a, 0xf9, 0xa9, 0xd8, 0x35, 0xf7, 0xd9, 0xe2, 0x49, 0xad, 0x08, - 0xf3, 0x03, 0x39, 0x78, 0x5a, 0x18, 0x26, 0x9b, 0x33, 0x43, 0x67, 0x2c, - 0xc6, 0xb1, 0x93, 0xc7, 0x1b, 0xc5, 0xd2, 0xbb, 0x4a, 0xb7, 0xab, 0x99, - 0x48, 0x1a, 0x74, 0xf8, 0x61, 0x37, 0x0d, 0x75, 0x7f, 0x20, 0xfa, 0x18, - 0x0d, 0xbb, 0x39, 0xb3, 0xcc, 0x94, 0x80, 0x8e, 0x1c, 0x6c, 0x41, 0xea, - 0xab, 0x9b, 0xa5, 0xd9, 0x0a, 0x4d, 0xd0, 0x24, 0x62, 0x9e, 0xd9, 0xf7, - 0xdf, 0x8f, 0x8c, 0x78, 0xc7, 0xcd, 0xf7, 0xfe, 0x20, 0xcb, 0xd3, 0xf9, - 0x6f, 0xb6, 0x0f, 0xec, 0x1e, 0xbc, 0x9d, 0x30, 0x5b, 0x8f, 0xa8, 0xed, - 0xbc, 0xab, 0x15, 0x8b, 0x83, 0x10, 0x00, 0xd6, 0x31, 0xd3, 0x8d, 0x1a, - 0xf6, 0xb9, 0x73, 0x7b, 0x36, 0xaf, 0xb6, 0xb3, 0x1b, 0x84, 0x4e, 0x52, - 0x83, 0xbd, 0xc6, 0xef, 0x4b, 0xbc, 0xcb, 0x35, 0xd0, 0x97, 0x97, 0xbd, - 0xe3, 0xd1, 0xec, 0x81, 0x94, 0xc2, 0xe0, 0xa5, 0xf7, 0xcd, 0x4c, 0x9a, - 0x65, 0x7b, 0x59, 0xb9, 0xd7, 0x1a, 0xd0, 0xeb, 0x31, 0x55, 0x7b, 0x2a, - 0xd1, 0x13, 0x85, 0x97, 0x46, 0x89, 0x17, 0x98, 0x7d, 0x38, 0x5c, 0x55, - 0x94, 0x37, 0xea, 0xbe, 0xef, 0x4e, 0x2f, 0xc1, 0x38, 0xc9, 0x76, 0xec, - 0x73, 0xf3, 0x51, 0x93, 0xc9, 0xa3, 0x17, 0xea, 0xdd, 0x18, 0x4a, 0x14, - 0x89, 0x71, 0x9e, 0x71, 0x35, 0x8a, 0xee, 0x06, 0x3c, 0xc8, 0x7f, 0x7c, - 0x17, 0x43, 0xd4, 0x73, 0x3b, 0x88, 0x09, 0x6e, 0x0e, 0x26, 0x34, 0x19, - 0x5a, 0xf1, 0x8e, 0x38, 0x25, 0x7a, 0x1d, 0x72, 0x15, 0x16, 0xd1, 0x85, - 0xa0, 0x91, 0xda, 0x59, 0x19, 0xb2, 0xf6, 0xb1, 0xdd, 0x26, 0xcc, 0x06, - 0x98, 0x90, 0x6e, 0x24, 0xb3, 0xe1, 0x54, 0x90, 0x91, 0x02, 0xf8, 0x47, - 0x65, 0xfa, 0x69, 0x8f, 0x80, 0xe9, 0xa5, 0xe6, 0x55, 0x33, 0x7b, 0xd3, - 0x2d, 0x36, 0x6c, 0x6b, 0xbc, 0xb3, 0xd0, 0x90, 0xd3, 0x98, 0x2f, 0x90, - 0xbd, 0x9b, 0x1c, 0xf7, 0x60, 0xe3, 0x41, 0xec, 0x1c, 0x1e, 0xd0, 0x08, - 0x6d, 0x9c, 0x32, 0xcf, 0x5b, 0x96, 0x6f, 0xcb, 0x5c, 0x46, 0x5a, 0x6f, - 0x49, 0xcf, 0x61, 0xae, 0xf0, 0x28, 0x55, 0x54, 0x9d, 0x97, 0x55, 0x5f, - 0x33, 0x06, 0xe7, 0x05, 0x57, 0xf0, 0x38, 0x9a, 0x9b, 0xd0, 0x3c, 0x4b, - 0xc9, 0x16, 0x38, 0x27, 0x5e, 0xff, 0x60, 0x74, 0x61, 0xd7, 0x21, 0xa5, - 0x02, 0x6a, 0xeb, 0x30, 0x05, 0xa3, 0x94, 0x53, 0x76, 0x80, 0x1b, 0x59, - 0x1b, 0x58, 0x08, 0xaf, 0x76, 0xd6, 0x06, 0x23, 0xd2, 0x26, 0x15, 0x78, - 0xa1, 0x2d, 0x49, 0x9d, 0x89, 0x7a, 0xeb, 0x45, 0xa9, 0x79, 0x96, 0x32, - 0x8b, 0x9d, 0x41, 0x3b, 0x3d, 0xc6, 0xfd, 0xa7, 0xef, 0x21, 0xe4, 0xd3, - 0xe8, 0x70, 0x1d, 0x31, 0x10, 0x3a, 0x4e, 0xdf, 0x37, 0x97, 0x78, 0x65, - 0x61, 0xce, 0xd1, 0x1c, 0x7d, 0xbd, 0x55, 0x1c, 0x0e, 0x17, 0x97, 0x2f, - 0x2b, 0x5e, 0x04, 0x4a, 0x72, 0x49, 0x7f, 0x9a, 0xe0, 0x56, 0x3c, 0x5a, - 0x84, 0xab, 0x46, 0x28, 0x29, 0xbf, 0x64, 0xd7, 0x8f, 0x3f, 0xaf, 0x44, - 0xa3, 0x9a, 0x97, 0xc6, 0x6b, 0x1d, 0xae, 0xcf, 0x02, 0xb4, 0x19, 0x5b, - 0xa6, 0x6d, 0xe0, 0x01, 0xf0, 0xc8, 0xf3, 0x35, 0x6d, 0xf4, 0xc9, 0x79, - 0x71, 0x8b, 0x41, 0x69, 0xe6, 0xaa, 0x1e, 0xb4, 0xbc, 0x32, 0x27, 0x53, - 0x85, 0xae, 0x3d, 0x8e, 0xa9, 0x18, 0xbd, 0x92, 0xbc, 0x35, 0x56, 0x52, - 0xa7, 0x6b, 0x8b, 0x6e, 0xe0, 0x3a, 0x7a, 0xac, 0x9a, 0x6d, 0x43, 0x9d, - 0xea, 0x0a, 0xaf, 0x8a, 0xef, 0x0e, 0xcb, 0xea, 0xf5, 0x3d, 0x90, 0x35, - 0x4e, 0xb8, 0xab, 0x2c, 0x49, 0x5b, 0x56, 0xee, 0xc3, 0xad, 0x30, 0x69, - 0x18, 0xb4, 0x66, 0xdf, 0x5b, 0x4d, 0x15, 0x45, 0xed, 0x1d, 0x22, 0x1d, - 0x80, 0xed, 0x50, 0x27, 0x55, 0x7c, 0x93, 0x8f, 0x6e, 0x7a, 0x8a, 0xb0, - 0x7e, 0x8a, 0x3d, 0x66, 0x6e, 0x48, 0x82, 0xc0, 0xd5, 0xe5, 0x4f, 0x39, - 0xdc, 0x9f, 0xd5, 0xbc, 0x0e, 0xc4, 0xbd, 0x22, 0xfd, 0xe8, 0x1a, 0x85, - 0xd1, 0xbc, 0xe0, 0xea, 0xa7, 0xcf, 0xe3, 0x77, 0x60, 0xfd, 0x35, 0x71, - 0xde, 0x2d, 0x2e, 0x86, 0xec, 0xaa, 0x12, 0x12, 0xc7, 0xc5, 0x8a, 0x45, - 0x5b, 0x31, 0xf7, 0xf5, 0xdc, 0xd5, 0x60, 0xd5, 0x66, 0xda, 0x1f, 0x49, - 0x9e, 0xac, 0x0c, 0x93, 0x07, 0xa2, 0xb3, 0xdb, 0x90, 0x8f, 0xd5, 0xee, - 0x4b, 0xc6, 0x7b, 0x63, 0xfa, 0x9b, 0xaa, 0x78, 0x72, 0xb0, 0xa0, 0xcb, - 0xeb, 0xb7, 0x13, 0x99, 0xaa, 0x3d, 0xda, 0x7e, 0x45, 0x0a, 0x57, 0xb0, - 0x4b, 0x6e, 0x2f, 0x45, 0x69, 0x4f, 0x67, 0x26, 0x5a, 0xab, 0x41, 0x7f, - 0x82, 0x4a, 0x59, 0xdb, 0x91, 0x4d, 0x2b, 0x40, 0x76, 0x39, 0x8b, 0x11, - 0xc7, 0xbb, 0x45, 0x59, 0x18, 0xd9, 0xd7, 0xb1, 0x3b, 0x4b, 0xaa, 0x70, - 0xf3, 0x12, 0x1c, 0x1b, 0x3d, 0x0f, 0xfb, 0xbf, 0xd4, 0xaf, 0xee, 0x82, - 0x9e, 0xda, 0x06, 0xa0, 0x0f, 0x1a, 0x71, 0xaf, 0xf5, 0x8f, 0xcf, 0x0a, - 0xe0, 0xaf, 0x98, 0x59, 0xf6, 0xf5, 0x24, 0xaf, 0x95, 0x61, 0xff, 0xe6, - 0xba, 0x6f, 0xc8, 0xb4, 0x35, 0x16, 0x9c, 0x9b, 0x24, 0x15, 0x9a, 0xd1, - 0xfa, 0xb1, 0xa6, 0xb8, 0xab, 0x4c, 0x19, 0xcc, 0x54, 0x73, 0xe4, 0xf8, - 0x6f, 0xab, 0xe9, 0xb5, 0x7f, 0x7f, 0xf9, 0xd4, 0x44, 0x19, 0xfd, 0x43, - 0xf1, 0x2a, 0x3a, 0x1d, 0x22, 0x66, 0xc6, 0x27, 0x4a, 0xca, 0x8b, 0xcc, - 0x1d, 0x96, 0xa5, 0x83, 0x70, 0xc9, 0xdf, 0xba, 0xb7, 0x83, 0xcf, 0xbd, - 0xc9, 0xa3, 0xd0, 0xaf, 0xb3, 0xcc, 0xfa, 0x6f, 0x33, 0x55, 0x6f, 0x0a, - 0xed, 0x01, 0x7d, 0x0e, 0xde, 0x12, 0x5e, 0x4b, 0xe3, 0x06, 0xf4, 0x47, - 0xa9, 0x44, 0xec, 0x68, 0x0f, 0x1f, 0x57, 0x23, 0xaa, 0x44, 0xe5, 0x0d, - 0xc2, 0x9f, 0x15, 0x91, 0xf3, 0xfa, 0x6e, 0x8e, 0xe1, 0xda, 0x0e, 0x75, - 0xef, 0x28, 0xd6, 0xe6, 0x8f, 0x48, 0x4e, 0x77, 0x1c, 0x5b, 0xec, 0x4a, - 0x0a, 0x17, 0x6c, 0x68, 0x10, 0x82, 0xaf, 0xb9, 0xdf, 0xd0, 0xcb, 0xbb, - 0x0f, 0x44, 0xc9, 0xf3, 0x78, 0x2d, 0x4d, 0x00, 0xec, 0x19, 0x8b, 0xb6, - 0x48, 0xd1, 0x2a, 0x80, 0x63, 0x8d, 0x4a, 0x1a, 0x2e, 0xa5, 0x2c, 0x95, - 0xf5, 0x5c, 0x3b, 0x6e, 0xfa, 0x34, 0xfe, 0x34, 0x3f, 0x64, 0x30, 0x4c, - 0x42, 0x5c, 0x10, 0x49, 0xdd, 0x06, 0x34, 0x03, 0xd2, 0xec, 0x5f, 0x78, - 0x81, 0x1c, 0xa9, 0xb9, 0x96, 0x3f, 0x89, 0x5e, 0xee, 0x20, 0x19, 0x62, - 0x0c, 0x6d, 0xd6, 0x3b, 0xa4, 0xb0, 0xc5, 0x83, 0x99, 0xdc, 0xf1, 0xee, - 0xef, 0xef, 0x50, 0x94, 0x8f, 0xe4, 0x2c, 0x30, 0x02, 0xfa, 0xfb, 0x8c, - 0xd2, 0x7a, 0x88, 0x2f, 0x4a, 0xcd, 0xda, 0x8a, 0xbb, 0x31, 0xe3, 0x47, - 0x42, 0x4f, 0xce, 0x09, 0x2c, 0xc4, 0x87, 0xa8, 0x7a, 0xba, 0x9d, 0xb2, - 0xeb, 0xca, 0x7b, 0xe4, 0x16, 0x17, 0xd1, 0x5e, 0x7e, 0x89, 0xa0, 0x9b, - 0x64, 0x20, 0xb1, 0x9a, 0xe0, 0xa5, 0x33, 0xb1, 0xbc, 0xb0, 0x05, 0xf6, - 0x5c, 0xcc, 0xd2, 0x0b, 0x9e, 0x06, 0x6f, 0x02, 0xbd, 0xbc, 0x66, 0x37, - 0x05, 0xa4, 0xf1, 0x0d, 0x65, 0x3f, 0xcd, 0x15, 0xd9, 0xb9, 0x5c, 0x6c, - 0x75, 0x68, 0x08, 0x72, 0xcd, 0xa0, 0xda, 0x2d, 0x74, 0x02, 0xed, 0xf7, - 0x57, 0x29, 0x09, 0x39, 0xd1, 0x1d, 0x41, 0xea, 0x60, 0x2e, 0xa5, 0x7c, - 0x28, 0x0f, 0x28, 0xf7, 0x70, 0x26, 0x77, 0xf1, 0x8f, 0xa3, 0xfd, 0x42, - 0x19, 0x83, 0x84, 0x4b, 0xa5, 0x23, 0x9c, 0x4d, 0x90, 0xbf, 0x36, 0x94, - 0xb8, 0x83, 0xc2, 0x5d, 0x28, 0x13, 0x1c, 0xc4, 0xfd, 0x2b, 0x0f, 0x4e, - 0xea, 0xd1, 0x82, 0xc7, 0xdb, 0x9b, 0x01, 0xce, 0x56, 0x5b, 0x6f, 0x6b, - 0x40, 0x29, 0x8b, 0x38, 0x0b, 0x6b, 0x00, 0xf5, 0x55, 0xbe, 0xf3, 0xb1, - 0x57, 0xa6, 0x94, 0x98, 0x4f, 0x43, 0xdd, 0xa0, 0x22, 0xed, 0xec, 0xa4, - 0xa8, 0x40, 0xbb, 0xd0, 0xcd, 0x8f, 0xe7, 0x25, 0xbb, 0xc5, 0x87, 0x0d, - 0x14, 0xc5, 0x2f, 0xb3, 0x28, 0xf3, 0x30, 0x4c, 0x82, 0x51, 0x3d, 0x90, - 0x09, 0x36, 0x3c, 0x1d, 0xbc, 0x59, 0x47, 0x33, 0xa3, 0x42, 0x0f, 0x13, - 0x3c, 0x9c, 0xf0, 0x86, 0x93, 0xbe, 0xdb, 0xac, 0xd3, 0x96, 0x7e, 0x1e, - 0xb7, 0xb2, 0x7c, 0xcb, 0x65, 0x48, 0xd5, 0xb6, 0xd7, 0xb9, 0xe8, 0xbd, - 0xce, 0xa0, 0xa6, 0xd6, 0x84, 0x67, 0xa4, 0x58, 0xe4, 0x8d, 0x65, 0x1e, - 0xb1, 0xa7, 0x36, 0xb1, 0xe8, 0x46, 0xf6, 0x18, 0x8c, 0xa3, 0x58, 0xdf, - 0xbb, 0xd9, 0x77, 0x2f, 0x2e, 0x77, 0xdd, 0xf6, 0xb8, 0xcb, 0x9d, 0x54, - 0x53, 0x27, 0xb6, 0x98, 0xf7, 0x5d, 0x9b, 0xe2, 0x65, 0x40, 0x7f, 0x34, - 0xd7, 0x77, 0x5f, 0x94, 0x62, 0x30, 0xd8, 0xd1, 0x1f, 0x19, 0x69, 0x51, - 0xc4, 0x93, 0x86, 0xe0, 0x68, 0xde, 0x69, 0xc3, 0xc2, 0x99, 0x92, 0x8d, - 0x2f, 0x8b, 0x59, 0x9b, 0xa2, 0xce, 0xa1, 0x7b, 0xdf, 0x11, 0x0e, 0xf9, - 0x12, 0x3f, 0x5c, 0xaa, 0x54, 0x29, 0x18, 0xc2, 0x0b, 0x3a, 0x52, 0x00, - 0x7b, 0x4f, 0x41, 0x37, 0xd0, 0x7c, 0x5a, 0x2e, 0xf5, 0x22, 0xad, 0x08, - 0xf7, 0xd6, 0x76, 0xf6, 0xba, 0x1f, 0xd6, 0xbe, 0x7c, 0xee, 0xc3, 0xb4, - 0x04, 0x51, 0xe6, 0x27, 0x70, 0x3a, 0x60, 0xf8, 0xe0, 0x52, 0xe2, 0x7e, - 0x57, 0xba, 0x3c, 0x55, 0xee, 0xc2, 0xdb, 0xe3, 0xcf, 0xb5, 0x16, 0x5a, - 0xc6, 0x73, 0xa7, 0x96, 0xec, 0x44, 0x4f, 0xc8, 0xe7, 0xea, 0xac, 0xcc, - 0x94, 0x85, 0x93, 0xb3, 0x78, 0xdc, 0xf7, 0x7b, 0x3c, 0x35, 0xbc, 0xf5, - 0x5d, 0x96, 0x4d, 0xf2, 0x26, 0xb1, 0xef, 0xc1, 0x07, 0x74, 0xd3, 0xba, - 0x4e, 0x4a, 0xc6, 0x30, 0x38, 0x7b, 0x1d, 0xb9, 0x14, 0xac, 0xae, 0xf3, - 0xac, 0xf8, 0xbc, 0x83, 0x4e, 0x3a, 0x5f, 0x98, 0xcf, 0xe5, 0x31, 0x28, - 0x67, 0xad, 0x0d, 0x3b, 0x21, 0x79, 0x54, 0x38, 0x64, 0x99, 0x2e, 0x82, - 0xe2, 0x14, 0xb0, 0x8d, 0x26, 0x2d, 0xd4, 0x42, 0xf7, 0xed, 0xdf, 0x37, - 0x90, 0x14, 0xbf, 0x3b, 0x76, 0x0c, 0x47, 0x41, 0x8d, 0xc8, 0xe5, 0x1d, - 0x70, 0xca, 0x80, 0x01, 0x22, 0x12, 0x1a, 0x40, 0xba, 0x0e, 0x41, 0x04, - 0x13, 0xa4, 0x07, 0xe7, 0x6f, 0x13, 0x5c, 0x09, 0x01, 0x3c, 0x96, 0x85, - 0x48, 0xbe, 0xe0, 0x40, 0x85, 0x03, 0x13, 0x78, 0x33, 0xb8, 0x88, 0xd6, - 0x54, 0xa6, 0x19, 0x98, 0x77, 0x25, 0xb9, 0xac, 0xc3, 0x70, 0x5b, 0x21, - 0xea, 0x47, 0x5a, 0x64, 0xa3, 0x88, 0x13, 0xa7, 0xe0, 0x7b, 0xb4, 0xd8, - 0x87, 0x90, 0xba, 0x25, 0x7e, 0x96, 0x9a, 0xa1, 0xdb, 0xd7, 0x94, 0x0e, - 0xf6, 0xcb, 0x97, 0x67, 0x39, 0x67, 0x5f, 0xe3, 0x32, 0xbe, 0xa0, 0xf9, - 0x14, 0xa0, 0xef, 0x10, 0x9e, 0x73, 0xc6, 0xbd, 0x2d, 0x14, 0xd2, 0xb1, - 0xe2, 0x0c, 0x2a, 0x6c, 0x7c, 0x7b, 0x37, 0x05, 0xa0, 0x93, 0x17, 0x75, - 0x01, 0x7d, 0x1b, 0xb9, 0x86, 0xa9, 0x1c, 0xc0, 0xa9, 0x0f, 0xa4, 0xde, - 0x29, 0x9e, 0xbd, 0x16, 0xd6, 0xba, 0xab, 0xef, 0x87, 0x15, 0x3c, 0x67, - 0x59, 0x8c, 0xad, 0x4a, 0xe5, 0x82, 0x2a, 0xf9, 0xac, 0x7f, 0xa1, 0x15, - 0x14, 0xd1, 0x57, 0xa0, 0x9b, 0xf3, 0xe2, 0x28, 0xe9, 0xf0, 0xb7, 0x34, - 0x35, 0xb5, 0x0a, 0x44, 0x35, 0x4d, 0x58, 0xbb, 0x2f, 0x44, 0x9a, 0xb9, - 0x51, 0xcb, 0x38, 0x18, 0x0d, 0xce, 0x0f, 0xa0, 0xc9, 0xab, 0x6a, 0xcb, - 0x14, 0x21, 0x2a, 0x11, 0x32, 0x0b, 0xa6, 0xc1, 0x0e, 0xe3, 0x86, 0x43, - 0x71, 0x15, 0x8b, 0x34, 0x8c, 0x94, 0x48, 0x63, 0x87, 0xf5, 0x56, 0xbc, - 0x71, 0x84, 0x47, 0x08, 0x69, 0x62, 0x51, 0x92, 0x9a, 0xef, 0xab, 0x54, - 0x8a, 0x40, 0xa1, 0xe3, 0xb8, 0x6f, 0x14, 0xcd, 0xa8, 0x37, 0xc3, 0x12, - 0x0a, 0xd3, 0xe4, 0x0c, 0xe9, 0x48, 0x05, 0xc3, 0x5e, 0xa3, 0x4e, 0x8d, - 0xf9, 0xfe, 0x52, 0x68, 0xd9, 0x96, 0xe8, 0xd3, 0x56, 0x27, 0x26, 0x7f, - 0x91, 0xe5, 0x47, 0xa4, 0x1a, 0x93, 0x93, 0xb2, 0xa6, 0xc0, 0x9c, 0x94, - 0xc1, 0xb7, 0x3b, 0x2a, 0x21, 0x4e, 0xcb, 0x67, 0x13, 0x6b, 0x5d, 0x00, - 0x99, 0xed, 0x4a, 0x71, 0xa9, 0x82, 0xcd, 0xc4, 0x1a, 0x87, 0xdc, 0x57, - 0x2d, 0x11, 0xa5, 0xbf, 0xb8, 0xd9, 0x3b, 0x92, 0x10, 0x63, 0x3f, 0x0a, - 0xc0, 0x97, 0xfc, 0x78, 0x72, 0xec, 0x88, 0xa6, 0x36, 0x64, 0x72, 0x22, - 0xd8, 0x7d, 0x7b, 0xca, 0x58, 0x04, 0x1a, 0x99, 0x6a, 0x62, 0x3e, 0xd4, - 0xa9, 0x9c, 0xc4, 0x06, 0x6f, 0xd8, 0x6a, 0x88, 0x03, 0x98, 0x9b, 0x42, - 0x5b, 0x8e, 0xab, 0x03, 0x7e, 0x71, 0x1d, 0x05, 0xae, 0x0d, 0x43, 0xa5, - 0xa6, 0x28, 0x97, 0x8f, 0x35, 0x62, 0x5e, 0xa5, 0x13, 0xde, 0xfe, 0x8d, - 0x42, 0x4f, 0x7e, 0x8c, 0x75, 0x03, 0x50, 0x34, 0x6c, 0x27, 0xec, 0x0a, - 0xaf, 0xf5, 0xaa, 0xf1, 0xc2, 0xaa, 0xd6, 0x69, 0x06, 0x53, 0x57, 0xd5, - 0x87, 0xa3, 0x4c, 0x52, 0x48, 0x12, 0x33, 0xcd, 0x45, 0x11, 0x32, 0x46, - 0xdc, 0x56, 0x8e, 0xbf, 0x90, 0xf0, 0xcf, 0x1e, 0xc0, 0x33, 0xaa, 0xb2, - 0x1f, 0xb3, 0xb9, 0xff, 0xe3, 0xa5, 0xff, 0xef, 0x6c, 0x4a, 0x25, 0x51, - 0xf6, 0xee, 0xf6, 0x0b, 0x9b, 0xc6, 0xda, 0x19, 0xf6, 0x21, 0x1b, 0xe7, - 0xa1, 0xf1, 0x9b, 0x69, 0x0d, 0x2e, 0xca, 0xc0, 0x8e, 0x31, 0xfe, 0x40, - 0x26, 0xd2, 0x9f, 0x23, 0x62, 0xf7, 0xd6, 0xcb, 0x51, 0x9b, 0x6c, 0x5e, - 0xad, 0x00, 0x89, 0x76, 0xa4, 0x61, 0x55, 0xdd, 0x81, 0x7b, 0x08, 0xdc, - 0xb8, 0x49, 0x8d, 0x65, 0x78, 0x9d, 0xec, 0x86, 0x90, 0x1f, 0x97, 0xa8, - 0xc7, 0xfa, 0xb2, 0xe5, 0xec, 0xfc, 0xf3, 0x91, 0xbb, 0xcd, 0xfb, 0xac, - 0x65, 0x3c, 0xd8, 0xad, 0xd1, 0xa3, 0x62, 0xe0, 0x93, 0xd9, 0x8b, 0x4c, - 0x7e, 0x35, 0xf7, 0x68, 0x0e, 0x8c, 0x7c, 0xa8, 0x11, 0xd3, 0x9f, 0xa0, - 0xe5, 0xf4, 0xeb, 0xd2, 0xd2, 0xb7, 0x3a, 0x29, 0x21, 0xb4, 0xf1, 0xba, - 0x9f, 0xc6, 0x89, 0xff, 0x1c, 0x49, 0x1c, 0xb9, 0xf5, 0xdc, 0x77, 0x97, - 0x52, 0x72, 0x89, 0xcb, 0xf0, 0x19, 0x7e, 0xa6, 0xce, 0xb0, 0x9b, 0xeb, - 0x1d, 0x35, 0x9e, 0x4b, 0x78, 0x5e, 0x80, 0xca, 0x20, 0x8d, 0x31, 0xd9, - 0x2b, 0x02, 0x6c, 0x87, 0x8b, 0x53, 0x0f, 0x69, 0x64, 0x48, 0x55, 0xad, - 0x87, 0x40, 0xf7, 0x5c, 0x0c, 0x91, 0xd2, 0x3a, 0x2c, 0xf8, 0x7a, 0x78, - 0x18, 0x9f, 0xba, 0x7b, 0x93, 0x46, 0x41, 0x13, 0xe4, 0xf8, 0xd9, 0x27, - 0xfc, 0xf0, 0x93, 0x03, 0x3d, 0x69, 0x34, 0x53, 0x47, 0x46, 0x08, 0xeb, - 0x82, 0x8e, 0x42, 0xda, 0x1a, 0xff, 0x5d, 0x4c, 0x72, 0x58, 0xca, 0x67, - 0x20, 0xe8, 0xe2, 0x11, 0x40, 0xa1, 0x19, 0x14, 0x99, 0xb4, 0x21, 0xed, - 0xeb, 0xe9, 0xe8, 0xa9, 0xf1, 0x8c, 0x61, 0x0f, 0xf3, 0x22, 0x1f, 0x47, - 0x09, 0x32, 0x4f, 0xce, 0x83, 0x6e, 0x92, 0xf6, 0x2a, 0xf8, 0x14, 0xd4, - 0xe1, 0x83, 0xb2, 0xc0, 0x86, 0x95, 0xe8, 0xa7, 0xb4, 0x44, 0x29, 0xbe, - 0x21, 0x47, 0x68, 0x52, 0x31, 0x6f, 0xe6, 0x02, 0x3c, 0x2d, 0x24, 0x4e, - 0x5b, 0x66, 0x83, 0x88, 0xfb, 0x8e, 0x48, 0x2c, 0x6c, 0x49, 0x36, 0x11, - 0xc4, 0x38, 0x6a, 0x46, 0x59, 0xaa, 0x50, 0x24, 0x85, 0xeb, 0x01, 0x42, - 0xc3, 0x41, 0x07, 0xd2, 0x3a, 0xe6, 0xdc, 0xf7, 0x5d, 0x0d, 0x10, 0xaa, - 0xea, 0x47, 0x7d, 0x75, 0x47, 0x9b, 0x29, 0x8e, 0x1d, 0x2c, 0xb7, 0x73, - 0x7e, 0xdc, 0x85, 0x41, 0x14, 0xb7, 0x27, 0x3f, 0x1d, 0x8b, 0xd0, 0xe1, - 0xd9, 0x22, 0xda, 0xd6, 0x17, 0x88, 0xed, 0x0a, 0xd4, 0xfb, 0x96, 0x6b, - 0x7a, 0x1f, 0x4d, 0x27, 0xb8, 0x56, 0xcc, 0xa6, 0x93, 0x13, 0x5a, 0xc1, - 0x32, 0x81, 0xb1, 0xea, 0x8f, 0x80, 0x44, 0xee, 0xbf, 0x8d, 0x15, 0x78, - 0x82, 0x0c, 0x40, 0x2c, 0x16, 0xb1, 0x0c, 0x6e, 0xad, 0x98, 0xa7, 0x78, - 0x75, 0x0a, 0x87, 0x01, 0x32, 0x56, 0x38, 0xd9, 0xf3, 0x68, 0xe5, 0x77, - 0x1d, 0xf7, 0x03, 0x43, 0x41, 0x77, 0x99, 0xd5, 0xde, 0x58, 0x84, 0xf3, - 0xdd, 0xd7, 0x18, 0x91, 0xf0, 0xda, 0x68, 0x57, 0xb5, 0xd0, 0x27, 0xd8, - 0xb5, 0x90, 0x17, 0x28, 0x4e, 0x33, 0x16, 0xcd, 0xa2, 0xbe, 0x27, 0x8d, - 0x32, 0x4d, 0xd6, 0x2a, 0xc3, 0x63, 0x38, 0x2a, 0x31, 0x14, 0xdd, 0x1b, - 0xb3, 0xfa, 0x7f, 0x6b, 0x13, 0x39, 0xd0, 0x66, 0xd0, 0x4f, 0xac, 0x27, - 0xae, 0x1b, 0xac, 0x02, 0xda, 0xb3, 0xf7, 0xd5, 0xff, 0x68, 0xe3, 0xfc, - 0x60, 0x8f, 0x17, 0xe7, 0xbe, 0x8a, 0xd0, 0x8f, 0x04, 0x4c, 0xd7, 0x07, - 0xa3, 0x89, 0x52, 0xdd, 0xd4, 0x6d, 0x6a, 0x3e, 0x88, 0x5c, 0xdd, 0xf5, - 0xdc, 0x37, 0x5f, 0x69, 0xcb, 0x0c, 0xd8, 0x33, 0x16, 0x34, 0x3e, 0x2d, - 0x6c, 0xe5, 0xde, 0x6d, 0x0d, 0x7a, 0x86, 0xcf, 0xcb, 0xc9, 0x8a, 0x80, - 0xb9, 0xb5, 0x5d, 0xab, 0x8c, 0xe7, 0xd6, 0x4d, 0x76, 0x14, 0xfb, 0xf4, - 0xc0, 0x30, 0x2f, 0xfa, 0x33, 0x88, 0x97, 0x68, 0x09, 0xdf, 0x17, 0xdc, - 0x62, 0xad, 0x7b, 0x13, 0xdb, 0xf9, 0xd2, 0x66, 0x4c, 0x4b, 0xcf, 0x49, - 0xa1, 0x6e, 0x4b, 0xd7, 0x29, 0x76, 0x53, 0x2b, 0x8e, 0x13, 0x19, 0xd3, - 0x1f, 0xb2, 0xd4, 0x5c, 0x28, 0x83, 0x7f, 0x6e, 0x2c, 0x47, 0x8d, 0xac, - 0x9b, 0x54, 0x2b, 0xa0, 0x7f, 0x67, 0x41, 0xcc, 0xa4, 0x02, 0xa4, 0x52, - 0x36, 0x72, 0xb0, 0x65, 0xf1, 0xf4, 0xc6, 0xc3, 0xaa, 0x5d, 0xd7, 0x4d, - 0x94, 0xaa, 0xc1, 0x0d, 0xb7, 0xb2, 0xc4, 0xbc, 0x1c, 0x11, 0x13, 0x3a, - 0x41, 0xf2, 0x0f, 0x21, 0xd9, 0xdf, 0xc0, 0xc9, 0x07, 0x91, 0xc0, 0x71, - 0xa0, 0x10, 0x76, 0x73, 0x00, 0xf2, 0x1f, 0xd9, 0x8d, 0x8d, 0xbb, 0x19, - 0x22, 0x2d, 0x74, 0xe0, 0x2d, 0x8a, 0x7c, 0x06, 0xab, 0x61, 0xf1, 0x2f, - 0xef, 0x3b, 0x7f, 0xbb, 0x25, 0x39, 0x9d, 0xe2, 0x83, 0x69, 0x9b, 0x42, - 0x78, 0xf9, 0x98, 0xa2, 0x0b, 0x89, 0x28, 0xc8, 0x77, 0x32, 0x5a, 0x2b, - 0xe2, 0x40, 0x19, 0x32, 0x29, 0x15, 0xef, 0xd0, 0x22, 0xa6, 0x90, 0x0c, - 0x33, 0xc3, 0x0f, 0x25, 0x41, 0xf2, 0xaf, 0x66, 0xe6, 0x8e, 0x38, 0x81, - 0xbf, 0x8a, 0xbe, 0xdb, 0x30, 0x7c, 0x90, 0xbb, 0xcf, 0x11, 0x8b, 0xb3, - 0xa8, 0x3d, 0x0c, 0x3b, 0xc1, 0x6d, 0xb1, 0xb2, 0x45, 0xb5, 0x45, 0xc7, - 0x97, 0xfb, 0xe0, 0x74, 0xb1, 0xf7, 0x8e, 0x13, 0x8d, 0xca, 0xb3, 0xa0, - 0xca, 0xe2, 0x6f, 0x2f, 0x2e, 0x9b, 0x9b, 0x4d, 0x9c, 0xf5, 0xff, 0x72, - 0x46, 0x87, 0x0d, 0x3c, 0x1c, 0xed, 0x2d, 0x17, 0x26, 0x91, 0x06, 0x36, - 0xb6, 0xa5, 0x87, 0x7a, 0xa5, 0x6d, 0xff, 0xa3, 0xb2, 0x4d, 0x8c, 0xa8, - 0x39, 0x6a, 0xb5, 0x5c, 0xcc, 0x77, 0xef, 0x9d, 0x24, 0xda, 0xc4, 0x1e, - 0x80, 0x25, 0x3a, 0xdd, 0x42, 0x58, 0xdc, 0x5b, 0xde, 0x28, 0x88, 0x66, - 0x77, 0xfd, 0xd8, 0xad, 0x32, 0xfe, 0xc2, 0x98, 0xe7, 0x83, 0xb7, 0x1d, - 0x82, 0xcc, 0x00, 0x1b, 0x61, 0x5c, 0x89, 0x94, 0x75, 0xd7, 0xf9, 0xca, - 0x85, 0x45, 0x8b, 0x8a, 0x91, 0x1b, 0x89, 0x71, 0x7a, 0xac, 0xe2, 0x94, - 0xe8, 0x76, 0x8a, 0x62, 0x19, 0xff, 0x3b, 0x9a, 0x0a, 0xf5, 0xda, 0x03, - 0x3d, 0x5c, 0xe8, 0xd1, 0xfa, 0x46, 0x66, 0xb8, 0xe6, 0xcb, 0x88, 0xb6, - 0xa2, 0xce, 0x18, 0x68, 0xba, 0xfb, 0x29, 0xe7, 0x92, 0x0a, 0xe4, 0xda, - 0xdf, 0x02, 0x04, 0x70, 0x08, 0xae, 0x07, 0x95, 0xf5, 0x01, 0x4e, 0x93, - 0x35, 0x77, 0x61, 0x6f, 0x2c, 0xf9, 0xda, 0x84, 0x18, 0x82, 0xe4, 0x80, - 0x88, 0xbc, 0xa1, 0xa0, 0xc8, 0xc4, 0xaf, 0x43, 0x2e, 0x76, 0xe1, 0xf8, - 0x58, 0xa7, 0xaa, 0xbe, 0x30, 0x17, 0xb7, 0xce, 0x9e, 0x64, 0x0b, 0x99, - 0x03, 0x63, 0x76, 0x26, 0xb4, 0x1c, 0x23, 0x4e, 0xfa, 0x8c, 0x93, 0x3d, - 0x61, 0xc5, 0x9b, 0xa5, 0xb8, 0x88, 0xa5, 0xe8, 0xe8, 0xae, 0xa9, 0xa0, - 0x83, 0xbe, 0xb8, 0x44, 0x16, 0xb6, 0x35, 0x5c, 0xb8, 0xa0, 0x3a, 0xfa, - 0x5a, 0xc5, 0xf5, 0x84, 0xa2, 0xa2, 0x0a, 0xb3, 0xf3, 0xbc, 0xce, 0x36, - 0x55, 0x91, 0xfa, 0xa2, 0xa5, 0xbd, 0xc1, 0xb6, 0x6f, 0x6e, 0x6e, 0xd7, - 0x92, 0x80, 0x83, 0xd5, 0x82, 0xef, 0x63, 0x7b, 0x5b, 0xcb, 0x18, 0xc9, - 0x6f, 0x5f, 0x8c, 0x1f, 0x97, 0xde, 0x91, 0xf1, 0x1d, 0x51, 0x74, 0xb0, - 0x9b, 0xf2, 0x68, 0x84, 0x57, 0x1c, 0xd6, 0x7c, 0x00, 0x62, 0x03, 0x77, - 0x18, 0xd4, 0xd1, 0xbe, 0x61, 0xf4, 0xd2, 0x78, 0x48, 0x12, 0xd7, 0x28, - 0xe8, 0xb4, 0xdd, 0x2e, 0x2f, 0x5b, 0x34, 0x55, 0x55, 0x4f, 0xbc, 0xff, - 0x62, 0x8f, 0x5b, 0x06, 0xda, 0x8b, 0xe6, 0x8d, 0xad, 0x8e, 0xd1, 0x0b, - 0x4b, 0x3d, 0x6a, 0xce, 0x06, 0xc3, 0x6f, 0x3b, 0xec, 0x80, 0x5d, 0x5f, - 0x30, 0x3e, 0x53, 0x75, 0xc7, 0xe3, 0x8d, 0x73, 0x5e, 0x9c, 0x19, 0xf5, - 0x2a, 0x55, 0xb2, 0x64, 0xe4, 0x34, 0xca, 0x06, 0x34, 0xe3, 0x64, 0x1e, - 0x9b, 0x31, 0x4d, 0xc8, 0x29, 0x29, 0x1d, 0xf9, 0x06, 0xd2, 0x27, 0x90, - 0x57, 0xf9, 0xb5, 0x2e, 0xf7, 0xf5, 0x8d, 0xdb, 0x01, 0x4d, 0xbc, 0x5e, - 0x9c, 0xa7, 0x85, 0x4e, 0x03, 0xbe, 0xf3, 0x40, 0x68, 0x6c, 0xf0, 0x0b, - 0xda, 0x15, 0x34, 0xc2, 0x64, 0x44, 0x94, 0x82, 0x7c, 0x72, 0x85, 0xe6, - 0x47, 0xfa, 0x8f, 0x9f, 0x2d, 0x97, 0x17, 0xb3, 0x34, 0x6a, 0x1a, 0x0b, - 0xa8, 0x9a, 0x30, 0xf6, 0x25, 0xed, 0x60, 0x9f, 0xfb, 0x29, 0xd5, 0x15, - 0x7e, 0x30, 0x01, 0x32, 0x5f, 0x6d, 0x5f, 0x08, 0x04, 0x06, 0x28, 0xe7, - 0x8b, 0x41, 0x62, 0x1c, 0x3a, 0xd1, 0x90, 0x1a, 0x2d, 0xf9, 0x63, 0x7f, - 0x9a, 0xa9, 0x3a, 0x79, 0x9e, 0xf4, 0x6b, 0xe4, 0xc9, 0x5e, 0x4c, 0xd1, - 0x75, 0x6b, 0x4b, 0x94, 0x46, 0x77, 0xc3, 0xef, 0xff, 0x5e, 0x2c, 0xb5, - 0xf8, 0x4e, 0x89, 0xbb, 0x5f, 0xf7, 0x1b, 0x50, 0xf2, 0x43, 0x00, 0x9c, - 0x42, 0x1a, 0x34, 0x56, 0x26, 0xe0, 0xb6, 0xab, 0x06, 0x3d, 0xe1, 0x26, - 0x67, 0xfa, 0x43, 0x2e, 0x04, 0xf9, 0xe1, 0xaf, 0x6b, 0xee, 0x2f, 0x2c, - 0xc8, 0x4d, 0x7c, 0xda, 0xb0, 0xed, 0x11, 0xe3, 0xbe, 0x79, 0x60, 0x76, - 0xfa, 0xcd, 0x9f, 0x9f, 0x85, 0xc9, 0x87, 0xdc, 0x62, 0xc7, 0xe5, 0xd3, - 0x6d, 0xa8, 0x22, 0x42, 0x5b, 0xd7, 0x7c, 0x9c, 0xc8, 0xe1, 0xce, 0x95, - 0xfe, 0xdd, 0xf1, 0x56, 0x49, 0xe0, 0x24, 0x76, 0x3e, 0x8a, 0x70, 0xdb, - 0x2b, 0x6d, 0x8f, 0x06, 0x3d, 0xd7, 0xf4, 0x5e, 0xdf, 0x25, 0xa2, 0x4f, - 0x65, 0x46, 0xc4, 0x2b, 0x9e, 0x8c, 0x19, 0x15, 0x3d, 0xe1, 0x5e, 0x95, - 0x5b, 0x3d, 0x45, 0xed, 0x08, 0xe6, 0xdd, 0x97, 0x85, 0xd8, 0x59, 0x6b, - 0x09, 0xe9, 0x39, 0x26, 0x98, 0x54, 0xa3, 0xe7, 0x05, 0x43, 0x7f, 0xa9, - 0xd3, 0x03, 0xad, 0x9d, 0x4f, 0xa6, 0xf3, 0xf3, 0x1a, 0x04, 0xc1, 0x39, - 0xf4, 0x6a, 0x6f, 0x57, 0x46, 0x92, 0x1d, 0x84, 0xa1, 0x63, 0x28, 0x8b, - 0x53, 0xd7, 0x53, 0xea, 0x0d, 0x73, 0x52, 0xd0, 0xb3, 0x35, 0xcd, 0xc6, - 0x24, 0xf2, 0x72, 0x89, 0x1c, 0xeb, 0x9e, 0xcb, 0x36, 0x3f, 0x0a, 0x46, - 0x71, 0xc0, 0xe4, 0x70, 0xaf, 0xe2, 0xab, 0xb5, 0xc6, 0x0d, 0x1c, 0x37, - 0x10, 0x22, 0x0c, 0x39, 0x8a, 0x19, 0x12, 0x67, 0xbd, 0x02, 0xb8, 0x2b, - 0x72, 0x42, 0x65, 0xdf, 0xdf, 0x97, 0x76, 0x2c, 0xf7, 0x84, 0x6f, 0x75, - 0x0e, 0x9b, 0xf1, 0xa4, 0xad, 0x95, 0xa0, 0xaf, 0x04, 0x07, 0x6b, 0x00, - 0xd7, 0x08, 0x32, 0x43, 0x71, 0xe8, 0x0f, 0xc1, 0x15, 0x29, 0xb0, 0x13, - 0xf0, 0xd0, 0xaa, 0x18, 0x66, 0x1c, 0x19, 0x0d, 0x6c, 0x5c, 0xe1, 0x4f, - 0xe0, 0xf1, 0x52, 0x50, 0x7f, 0x2b, 0x5d, 0x61, 0xaf, 0x96, 0xe2, 0x65, - 0x1e, 0xf3, 0xcf, 0xfe, 0x26, 0x61, 0xef, 0x7e, 0xbf, 0xcf, 0x38, 0x23, - 0x6a, 0xfd, 0x56, 0x7a, 0x5a, 0x65, 0xd3, 0x9d, 0xc0, 0x8b, 0xc9, 0x09, - 0x22, 0xbe, 0x35, 0xc5, 0x2a, 0x3a, 0x91, 0x09, 0x02, 0x11, 0x76, 0x84, - 0x85, 0xa2, 0x81, 0x2d, 0xe4, 0x24, 0x45, 0x88, 0xfc, 0x7e, 0x46, 0x67, - 0xb6, 0xf1, 0x14, 0xa7, 0x20, 0xb2, 0x81, 0x8c, 0x0c, 0x23, 0xfb, 0xc3, - 0x74, 0xe5, 0xc3, 0x03, 0xee, 0xa8, 0xd1, 0x95, 0x7b, 0x9f, 0xc6, 0xe6, - 0x50, 0xf4, 0xe5, 0xfc, 0x1b, 0xdf, 0xff, 0x32, 0xbf, 0x1e, 0x45, 0x92, - 0x0f, 0x9b, 0x83, 0x76, 0x9c, 0x75, 0xac, 0xf4, 0x33, 0xd4, 0xfc, 0xe1, - 0x0a, 0x40, 0x56, 0x9f, 0x2c, 0x17, 0xd3, 0x7a, 0xca, 0x1a, 0xe1, 0xc6, - 0xe6, 0xd4, 0xd3, 0x9c, 0xcd, 0x4c, 0xe4, 0x99, 0x11, 0xa3, 0x66, 0x47, - 0x7f, 0x56, 0x7b, 0x7c, 0x07, 0xa4, 0x4f, 0x0f, 0xe6, 0xe7, 0x4b, 0xe9, - 0x07, 0xf2, 0xbe, 0xca, 0x59, 0xac, 0x01, 0xcf, 0x75, 0x0a, 0x82, 0x06, - 0x86, 0x3a, 0xb9, 0xca, 0x6c, 0xe2, 0x74, 0x2f, 0x52, 0xdc, 0x72, 0xe3, - 0xe1, 0xda, 0x75, 0x5d, 0xf7, 0xa1, 0x72, 0x56, 0x73, 0xa2, 0x7a, 0xbb, - 0x70, 0xbf, 0x61, 0x54, 0x1f, 0x31, 0xb6, 0x81, 0xb3, 0x19, 0xab, 0x3e, - 0xab, 0x20, 0x85, 0x30, 0x6e, 0xc8, 0x14, 0x93, 0x0a, 0xef, 0x91, 0x69, - 0xa2, 0xeb, 0xf9, 0x9e, 0xdb, 0xd6, 0xfc, 0xd3, 0x53, 0x0b, 0xe1, 0x9d, - 0x3f, 0x1b, 0xbe, 0xb2, 0xcc, 0x98, 0x1e, 0x74, 0x61, 0xd5, 0x21, 0x77, - 0x7f, 0xcf, 0x41, 0x95, 0xd2, 0x0a, 0xf9, 0x71, 0xd4, 0xb8, 0x5f, 0x45, - 0x1d, 0x98, 0x22, 0xec, 0x18, 0xc3, 0xdd, 0xe2, 0x88, 0xfe, 0xbd, 0x85, - 0xbf, 0x62, 0x47, 0xf3, 0xf4, 0x08, 0x81, 0x5b, 0xe8, 0x7a, 0x19, 0x5f, - 0x00, 0x69, 0x71, 0xb5, 0xe0, 0x28, 0xc9, 0xa1, 0x81, 0xbd, 0x50, 0x2b, - 0x63, 0xc6, 0xba, 0x35, 0x9b, 0x31, 0xe8, 0x10, 0x7a, 0x31, 0xce, 0x65, - 0x6f, 0xe7, 0xe1, 0x36, 0x34, 0xa8, 0xb5, 0xc7, 0xce, 0xb4, 0x28, 0xc8, - 0xaf, 0x9a, 0x00, 0xce, 0x39, 0xe0, 0x97, 0x82, 0x08, 0x3d, 0x95, 0x3d, - 0xe4, 0x35, 0x01, 0x95, 0x74, 0x40, 0x6c, 0xb3, 0x3c, 0x61, 0xf7, 0xdc, - 0x55, 0x28, 0x43, 0x84, 0x90, 0x50, 0x46, 0xc7, 0x42, 0x98, 0xf7, 0x2e, - 0x25, 0x3f, 0x80, 0x64, 0x40, 0x9a, 0x3d, 0x53, 0x99, 0x15, 0x70, 0xb7, - 0x94, 0xc9, 0xd3, 0xfd, 0x51, 0x48, 0xb7, 0x22, 0xe9, 0xcb, 0xcf, 0x86, - 0x39, 0xb6, 0x5e, 0x08, 0x51, 0x03, 0x92, 0x65, 0x23, 0x4c, 0xa7, 0x6b, - 0x0e, 0x22, 0xc7, 0x7e, 0x93, 0xbd, 0x74, 0x2d, 0x13, 0xf9, 0xf9, 0x19, - 0xc2, 0x45, 0x03, 0x32, 0x30, 0x19, 0x72, 0x1e, 0x90, 0xdb, 0x92, 0x6a, - 0xc2, 0xd0, 0x4f, 0x24, 0xe2, 0x79, 0xe0, 0xe7, 0x4a, 0xff, 0x82, 0x80, - 0x3f, 0xd2, 0x1e, 0x86, 0xd1, 0x1c, 0x9f, 0xb8, 0xe5, 0xaf, 0x9f, 0x9e, - 0x5b, 0x0e, 0x3f, 0xc6, 0x78, 0xc5, 0xe1, 0x4f, 0xc7, 0xa3, 0x56, 0x47, - 0xa2, 0xd5, 0xde, 0x90, 0x8c, 0x9b, 0xb6, 0xf1, 0x13, 0x07, 0xbb, 0x73, - 0x2a, 0x56, 0x6d, 0x98, 0xca, 0x25, 0xc7, 0x81, 0x82, 0xd9, 0x3e, 0xf7, - 0xfe, 0x50, 0xee, 0xf4, 0x5f, 0xfe, 0x61, 0x90, 0x44, 0xdd, 0x5f, 0x50, - 0x36, 0xc3, 0x1d, 0x15, 0xd8, 0xa7, 0xb5, 0x98, 0x0a, 0x18, 0x75, 0x8d, - 0x71, 0x15, 0x4d, 0x93, 0x2d, 0x66, 0x43, 0x48, 0xb4, 0xf9, 0x95, 0x0d, - 0x0e, 0x13, 0x92, 0x0a, 0x8a, 0xb3, 0xc0, 0x95, 0x6a, 0xf0, 0x83, 0x50, - 0xd5, 0x4a, 0x17, 0x3f, 0xb6, 0xad, 0xfc, 0x59, 0xab, 0x06, 0xc6, 0x07, - 0x6d, 0x4f, 0xe8, 0xa5, 0xec, 0x0c, 0x56, 0x82, 0x0f, 0x81, 0x26, 0x06, - 0xce, 0x2e, 0x1b, 0xac, 0x28, 0xd7, 0xa8, 0x45, 0x53, 0x00, 0x2a, 0x06, - 0xff, 0x1f, 0xa3, 0x1c, 0x94, 0xf8, 0x85, 0xb5, 0xfa, 0x75, 0xc8, 0xb4, - 0x36, 0xdd, 0x83, 0x85, 0xa9, 0x38, 0x26, 0x3e, 0x1a, 0x17, 0x8a, 0xc7, - 0xf2, 0x0c, 0x12, 0xe2, 0xf4, 0x47, 0xd5, 0x89, 0x83, 0x61, 0xb4, 0x14, - 0x97, 0x77, 0xda, 0x19, 0xf3, 0x2c, 0xfd, 0x7a, 0x2e, 0xfc, 0xd8, 0xbf, - 0x2f, 0x42, 0x5e, 0x87, 0xc5, 0xe9, 0xde, 0x8a, 0x59, 0x22, 0xbe, 0x81, - 0x21, 0x49, 0xa9, 0x90, 0xe1, 0xe1, 0xf5, 0x22, 0xda, 0x95, 0xe3, 0x39, - 0xec, 0x12, 0x33, 0x97, 0x97, 0x95, 0x7a, 0x9a, 0xf5, 0xce, 0xdf, 0x1b, - 0x24, 0xc2, 0x4a, 0x76, 0x43, 0x40, 0xd3, 0x73, 0x54, 0xf8, 0xf0, 0xd8, - 0x7d, 0xf2, 0x3c, 0xb0, 0xcc, 0x15, 0xfc, 0xe3, 0x1e, 0x64, 0x0b, 0xae, - 0xeb, 0x8e, 0xd8, 0x61, 0x08, 0x9e, 0xc2, 0x96, 0x9b, 0x27, 0x78, 0xfe, - 0xb5, 0x95, 0x97, 0xcf, 0x03, 0xa6, 0x0e, 0x93, 0x99, 0xb5, 0xe3, 0x28, - 0x20, 0x4f, 0x25, 0xd5, 0x02, 0x31, 0x27, 0xc3, 0xe8, 0xf6, 0x9f, 0xf1, - 0x1f, 0xf2, 0xbc, 0xe2, 0x41, 0x00, 0x73, 0x9d, 0x3a, 0x5c, 0xf4, 0xf9, - 0x50, 0x85, 0xb4, 0x84, 0x99, 0xe3, 0xc1, 0x37, 0x3b, 0xc8, 0x39, 0xae, - 0x84, 0x56, 0x5a, 0x7b, 0xcb, 0xed, 0xba, 0x65, 0x40, 0x4a, 0xf8, 0xfe, - 0x27, 0x10, 0x50, 0x45, 0x32, 0x76, 0x5a, 0x4c, 0x72, 0x34, 0xba, 0x8f, - 0xc1, 0x0b, 0xe9, 0x8c, 0x72, 0x2c, 0x2e, 0xb4, 0xa2, 0x88, 0x76, 0xc0, - 0x30, 0xee, 0x08, 0x98, 0xa4, 0x37, 0x77, 0x01, 0x62, 0xd7, 0xc9, 0x8d, - 0x68, 0x01, 0x15, 0xa7, 0x98, 0x7f, 0x7e, 0x7b, 0x66, 0x66, 0x72, 0x7b, - 0x33, 0x6e, 0x07, 0xbe, 0xd3, 0x26, 0xcb, 0xb6, 0xd3, 0xe1, 0x29, 0x8b, - 0x6e, 0x8d, 0x0d, 0x56, 0x9f, 0x63, 0x23, 0x07, 0xb3, 0xb8, 0x3a, 0x8d, - 0x35, 0x91, 0xf0, 0xf0, 0xca, 0xa4, 0xd0, 0xfe, 0x7d, 0xf7, 0xbf, 0xa8, - 0x30, 0xa8, 0xc3, 0xa5, 0x35, 0xc6, 0xea, 0x33, 0x66, 0x7f, 0x89, 0x41, - 0x21, 0x8a, 0xc0, 0x52, 0xf7, 0x56, 0x06, 0x03, 0xe6, 0x3d, 0x85, 0xa2, - 0x83, 0x68, 0x89, 0x28, 0x1e, 0xf2, 0x99, 0xaf, 0xd3, 0x35, 0xb5, 0x4b, - 0x05, 0x5c, 0x72, 0x9c, 0xd1, 0xb5, 0x35, 0x12, 0xf7, 0x0e, 0x8e, 0xb5, - 0xe3, 0x01, 0xda, 0x5c, 0xd4, 0x0a, 0x06, 0x42, 0x5a, 0x26, 0x18, 0x9b, - 0xb3, 0x04, 0x8c, 0x3b, 0xd8, 0x13, 0x73, 0x61, 0x8b, 0x6a, 0x97, 0xe5, - 0xa8, 0xbc, 0xac, 0x05, 0x40, 0x6c, 0xc4, 0x82, 0xa5, 0x48, 0xe3, 0x03, - 0x03, 0x28, 0x9e, 0x70, 0x69, 0x92, 0x0c, 0xcd, 0x13, 0x05, 0xd1, 0xf1, - 0x4f, 0x68, 0xcf, 0x10, 0x5c, 0x36, 0x9e, 0xa2, 0x26, 0x84, 0xf6, 0xc0, - 0xd5, 0x82, 0x3e, 0xac, 0xab, 0x3c, 0x11, 0x88, 0xfb, 0x51, 0x9d, 0x8b, - 0x9a, 0xeb, 0xe8, 0x9d, 0x6b, 0x80, 0x7e, 0x08, 0x84, 0xf4, 0xb0, 0x9d, - 0xbc, 0x8a, 0x7e, 0xc9, 0x6f, 0x87, 0xdf, 0x28, 0x74, 0x66, 0xbb, 0x27, - 0x91, 0x61, 0x37, 0x7e, 0x72, 0xd1, 0x48, 0x99, 0x5c, 0x11, 0xac, 0x7f, - 0x85, 0x31, 0xfc, 0xe3, 0x81, 0xca, 0x74, 0x6b, 0x94, 0x35, 0xbe, 0x0e, - 0xaf, 0x4f, 0x7b, 0xd4, 0xdf, 0x25, 0xe1, 0x31, 0x27, 0x63, 0x24, 0x2b, - 0x6c, 0x6b, 0x39, 0xbe, 0xaf, 0x64, 0x66, 0x02, 0x0c, 0xa8, 0x15, 0xdf, - 0x34, 0x0f, 0x84, 0xc4, 0x71, 0xa3, 0x08, 0xfa, 0x63, 0x76, 0x34, 0x66, - 0xdf, 0xf0, 0xde, 0x8b, 0xe0, 0xa5, 0x8f, 0xde, 0x2f, 0x65, 0x53, 0x4c, - 0x63, 0xec, 0x9d, 0xf3, 0xef, 0x44, 0x64, 0x50, 0x50, 0x22, 0xff, 0x5c, - 0x0f, 0x67, 0xd3, 0x18, 0xbb, 0xaa, 0x9f, 0xa2, 0x93, 0xff, 0x40, 0x6b, - 0xef, 0x33, 0xe9, 0x61, 0x63, 0xdf, 0xe8, 0xfa, 0x93, 0x1b, 0x11, 0xcc, - 0x85, 0x2b, 0xad, 0xee, 0x5d, 0x96, 0x47, 0x90, 0x6d, 0xe7, 0x24, 0xcc, - 0x5e, 0x77, 0x3c, 0x5f, 0xb0, 0x04, 0x85, 0xfb, 0x71, 0xca, 0x24, 0xf4, - 0xe0, 0x0d, 0x83, 0xe2, 0x7b, 0x84, 0xea, 0x0c, 0x29, 0xbe, 0x01, 0x7a, - 0xda, 0xcf, 0xe7, 0xb5, 0xfe, 0xa6, 0x65, 0x4e, 0x52, 0xea, 0xd3, 0xc3, - 0x6f, 0x79, 0x1f, 0xa7, 0xa9, 0x5e, 0xcf, 0xa7, 0x7d, 0xf8, 0x47, 0x19, - 0x92, 0x1f, 0x28, 0x0c, 0x9d, 0xf7, 0x4d, 0x49, 0xfb, 0xa4, 0x08, 0x1d, - 0x3a, 0x08, 0x24, 0xd9, 0xa9, 0x1d, 0x53, 0x0f, 0x64, 0xa6, 0x30, 0x48, - 0xcd, 0xb2, 0x82, 0x4e, 0x9e, 0x57, 0x87, 0x64, 0x11, 0x37, 0xe3, 0xa8, - 0xd0, 0x58, 0x24, 0xe6, 0x83, 0x0d, 0x06, 0x51, 0xed, 0x41, 0x7b, 0x88, - 0xb5, 0x45, 0xa9, 0x10, 0x50, 0x2d, 0xa7, 0x31, 0x78, 0x8a, 0x99, 0xf9, - 0x73, 0x82, 0x11, 0x31, 0x78, 0xe5, 0x32, 0xfe, 0x0e, 0xf6, 0x1b, 0xb8, - 0xc6, 0xc0, 0x75, 0x3a, 0xc4, 0x7a, 0xf1, 0xe9, 0xcf, 0x58, 0xc9, 0xd7, - 0xff, 0x9a, 0x9f, 0xd2, 0x0b, 0x06, 0x48, 0x0f, 0xe0, 0xb4, 0x7a, 0xa2, - 0x12, 0xec, 0xbe, 0xf0, 0x80, 0x2e, 0x40, 0xe8, 0x83, 0x45, 0xce, 0x8c, - 0x2a, 0x0b, 0xdb, 0x27, 0xe4, 0xd6, 0x80, 0x18, 0x13, 0xa7, 0x77, 0x79, - 0x06, 0x93, 0x88, 0xd1, 0xca, 0x7c, 0xba, 0xa8, 0xa9, 0x95, 0x1d, 0xe0, - 0x6f, 0xd9, 0x4a, 0x92, 0x06, 0x8f, 0x18, 0xb5, 0xe5, 0xe7, 0xc9, 0xf6, - 0x79, 0xe5, 0xd1, 0x6c, 0x3d, 0x56, 0x99, 0x90, 0x12, 0xb8, 0x11, 0x9f, - 0x08, 0x09, 0x79, 0xa1, 0xf7, 0x38, 0x40, 0x7b, 0x3c, 0x26, 0x88, 0x10, - 0xc4, 0x7d, 0xf8, 0xa6, 0xe5, 0xfe, 0xde, 0xae, 0x86, 0x1c, 0x19, 0xb8, - 0x20, 0x2d, 0x90, 0x6c, 0x1a, 0xf1, 0x21, 0xba, 0x89, 0x3c, 0xd4, 0x4e, - 0x98, 0x15, 0xab, 0xf3, 0xc5, 0xec, 0x01, 0x84, 0x56, 0x7b, 0x5d, 0xa7, - 0x5d, 0x10, 0xf2, 0xe0, 0xf0, 0xeb, 0xbf, 0x99, 0x06, 0x82, 0xac, 0x10, - 0x9d, 0xe6, 0x42, 0xe1, 0x50, 0x3e, 0xee, 0x90, 0xe8, 0x71, 0x4d, 0x64, - 0xf2, 0x9e, 0xf5, 0x70, 0x5c, 0x55, 0x01, 0x66, 0x89, 0x5b, 0x47, 0xa1, - 0x14, 0xba, 0xb2, 0x97, 0x7e, 0x0f, 0x6f, 0xf2, 0x35, 0x68, 0x10, 0xda, - 0xcb, 0x78, 0x52, 0x12, 0x67, 0xee, 0x58, 0x27, 0x2c, 0x0a, 0xf3, 0xb3, - 0xdf, 0x50, 0x9b, 0xb3, 0x97, 0x52, 0x11, 0xfb, 0xe6, 0xcc, 0x95, 0x54, - 0xf7, 0xbf, 0x35, 0xa1, 0xf9, 0x77, 0x0f, 0x7c, 0xa3, 0xd5, 0x60, 0x5e, - 0x1a, 0x2b, 0xf5, 0x2f, 0x29, 0xed, 0xb8, 0x24, 0xea, 0x85, 0x05, 0x9b, - 0xb2, 0x9a, 0xe9, 0x0d, 0x68, 0x75, 0x17, 0xd7, 0xdb, 0x3d, 0x0f, 0x40, - 0xd6, 0xa3, 0xb2, 0x9c, 0x30, 0x6b, 0xd4, 0x40, 0x32, 0x89, 0xf0, 0x51, - 0xb8, 0x73, 0x0c, 0xeb, 0x99, 0x9c, 0x1b, 0x88, 0x40, 0x50, 0x17, 0x63, - 0x1f, 0x88, 0xc2, 0x55, 0x46, 0xd0, 0x4f, 0xc0, 0x2a, 0x71, 0x97, 0xb0, - 0xc0, 0xa9, 0xeb, 0x17, 0x38, 0xe8, 0x98, 0x75, 0xba, 0x07, 0xaa, 0x55, - 0x16, 0xe8, 0x3a, 0xf3, 0xaf, 0x17, 0x86, 0xc1, 0xd1, 0xf8, 0x09, 0x0c, - 0x55, 0x6a, 0xa0, 0x1a, 0x1f, 0xff, 0xf8, 0x67, 0x1a, 0xa1, 0x78, 0xd9, - 0xa0, 0x49, 0x1d, 0x68, 0xa2, 0x97, 0xb2, 0x58, 0xb2, 0x6d, 0x6e, 0xc7, - 0xee, 0x2a, 0x9e, 0x71, 0x26, 0x54, 0xab, 0x3e, 0x11, 0x8c, 0xf1, 0x77, - 0x89, 0xc0, 0xde, 0x92, 0x98, 0xbf, 0xd9, 0x00, 0x7e, 0x3c, 0xb1, 0x55, - 0x8d, 0x22, 0xf6, 0x90, 0xe4, 0xa1, 0xe2, 0x4b, 0x33, 0x1c, 0x65, 0x5a, - 0x01, 0x38, 0x51, 0xe7, 0x75, 0x36, 0x70, 0x84, 0x02, 0x8e, 0x3d, 0x4f, - 0xe7, 0x13, 0x73, 0xe5, 0x09, 0x1d, 0x26, 0xf0, 0xb5, 0xa0, 0x91, 0x6a, - 0x23, 0x8d, 0xb3, 0xf9, 0x25, 0x78, 0x3f, 0x17, 0x16, 0x67, 0x45, 0xf5, - 0xc8, 0xbb, 0xf4, 0xda, 0x56, 0x25, 0xe0, 0x2f, 0xe8, 0x3b, 0x18, 0x31, - 0x15, 0x69, 0xac, 0xed, 0x19, 0xe3, 0x35, 0x66, 0x0a, 0x4b, 0x03, 0x20, - 0x2b, 0x21, 0x40, 0x94, 0x4e, 0x13, 0x34, 0xbc, 0xb7, 0x83, 0x2f, 0xde, - 0x40, 0x28, 0x97, 0x57, 0x78, 0x99, 0x43, 0xd7, 0x36, 0x9b, 0x99, 0x4f, - 0x32, 0x2f, 0xcd, 0x29, 0x33, 0x49, 0xfb, 0x99, 0x0f, 0xaa, 0x12, 0x77, - 0x75, 0xdd, 0x0a, 0x50, 0xf2, 0x8a, 0x53, 0x3b, 0x1f, 0x2c, 0xba, 0x0a, - 0x40, 0xc8, 0xeb, 0x2e, 0xa1, 0x6b, 0xce, 0x34, 0x63, 0xce, 0xe1, 0x68, - 0x72, 0xb7, 0x74, 0xf6, 0xe9, 0x78, 0xfd, 0x87, 0x3f, 0x58, 0xd9, 0x95, - 0x28, 0xd0, 0x0e, 0xb4, 0x95, 0x14, 0x8f, 0xbe, 0x7a, 0xcf, 0x65, 0x0d, - 0x80, 0x74, 0x23, 0x9f, 0x5d, 0xb1, 0xa2, 0x5e, 0x12, 0x98, 0xe1, 0xab, - 0x43, 0xa1, 0xe8, 0xf9, 0xac, 0xb8, 0xd9, 0xbb, 0x2a, 0xd5, 0x73, 0xe2, - 0x63, 0xc1, 0x9b, 0x13, 0x9c, 0x87, 0x19, 0xb6, 0xd6, 0x21, 0x49, 0x9a, - 0x5f, 0x65, 0x20, 0x99, 0x22, 0x25, 0x61, 0xc0, 0x56, 0xca, 0x2d, 0xbb, - 0xe3, 0xce, 0x47, 0xd2, 0x6c, 0xd6, 0x65, 0x20, 0x19, 0xd8, 0x1b, 0x45, - 0xa8, 0x3e, 0x4a, 0xb9, 0xe8, 0xfe, 0xf9, 0x52, 0x09, 0x5d, 0x37, 0x9a, - 0x19, 0x80, 0xbb, 0xe1, 0x9d, 0x22, 0xc1, 0xa1, 0xbc, 0x19, 0x3b, 0x6c, - 0x01, 0x89, 0xb9, 0xec, 0x29, 0x69, 0x48, 0x42, 0x1f, 0x06, 0x63, 0xcd, - 0xb8, 0x3d, 0xc6, 0x3c, 0xca, 0x84, 0xb1, 0x37, 0x27, 0x5e, 0xff, 0xd0, - 0xfd, 0xae, 0x65, 0x57, 0xe1, 0x1d, 0x9c, 0xa6, 0x78, 0x38, 0x8a, 0xae, - 0x7e, 0x25, 0x49, 0x94, 0x00, 0xcb, 0x5f, 0x61, 0x47, 0x3d, 0x58, 0xc9, - 0x63, 0xa6, 0x94, 0xac, 0x23, 0xbb, 0xc5, 0x0d, 0xe9, 0x17, 0x7d, 0x94, - 0x22, 0x2c, 0xde, 0xef, 0x23, 0xed, 0x57, 0x1a, 0xb0, 0x6b, 0xb7, 0x13, - 0xcd, 0xc3, 0xdc, 0xb3, 0xb8, 0x1c, 0x48, 0xee, 0x8e, 0x64, 0x55, 0x19, - 0x8b, 0xbc, 0x82, 0xc4, 0x5d, 0xb1, 0x2d, 0xb1, 0x3d, 0x20, 0xd0, 0x21, - 0x2d, 0x8f, 0x64, 0xc5, 0x00, 0xcd, 0x1b, 0xeb, 0xef, 0x8a, 0x7c, 0x2a, - 0x8f, 0xdf, 0x7c, 0x93, 0x6e, 0x4b, 0x6c, 0xe7, 0xfd, 0x7a, 0x59, 0x80, - 0x25, 0xbf, 0x1c, 0x9e, 0x54, 0x36, 0x34, 0x8d, 0xb5, 0x9a, 0xe4, 0xfb, - 0xe1, 0x3b, 0x47, 0x4e, 0x32, 0xb5, 0x59, 0x15, 0x02, 0xda, 0xd3, 0x7e, - 0x36, 0x5d, 0xcb, 0x58, 0xf2, 0x50, 0x72, 0x80, 0x21, 0x77, 0xe2, 0xa1, - 0x83, 0x15, 0xf3, 0x3e, 0xd6, 0x77, 0xd0, 0x0e, 0x7b, 0x4c, 0xc1, 0x19, - 0x86, 0xe2, 0x40, 0xb6, 0x44, 0xa5, 0xab, 0x9a, 0x7d, 0x88, 0xdd, 0x42, - 0x35, 0x8d, 0xb7, 0xd9, 0x76, 0x8b, 0xb4, 0x00, 0x5a, 0x1d, 0x0c, 0x99, - 0xab, 0x2f, 0xf6, 0x93, 0xc4, 0x2a, 0xfc, 0x59, 0xcd, 0x14, 0xe6, 0x68, - 0xa3, 0x38, 0x73, 0xa6, 0x04, 0xa6, 0x32, 0x2c, 0xa1, 0x3b, 0x2d, 0x03, - 0x78, 0x40, 0xe4, 0xa9, 0xe0, 0x51, 0x19, 0x22, 0xee, 0x39, 0x68, 0xeb, - 0x10, 0xd1, 0x7b, 0x71, 0xb5, 0x55, 0xdb, 0xf5, 0x92, 0x57, 0x67, 0x97, - 0xe9, 0x87, 0xf7, 0xb8, 0x59, 0xaa, 0xa3, 0x79, 0x18, 0x12, 0xa0, 0xc7, - 0x8f, 0xd9, 0x61, 0xe6, 0x4b, 0x95, 0x23, 0x58, 0xd0, 0xf3, 0x63, 0xe5, - 0x8e, 0x78, 0xc1, 0xa8, 0xe3, 0x04, 0xa0, 0xf2, 0xd0, 0x2a, 0xa5, 0x23, - 0x1c, 0x60, 0x03, 0x9b, 0xab, 0xae, 0x25, 0x54, 0x9c, 0x62, 0xb8, 0x4f, - 0xa8, 0x95, 0x28, 0x40, 0xba, 0xc5, 0x49, 0x8c, 0x59, 0xbe, 0x04, 0x14, - 0x46, 0x8d, 0x28, 0xb2, 0x5c, 0xb9, 0xf2, 0x96, 0xa5, 0x56, 0xb3, 0xec, - 0x41, 0xa8, 0x17, 0x3a, 0x47, 0x87, 0x3a, 0xd4, 0x69, 0xae, 0xdb, 0x35, - 0x8c, 0xc3, 0x7c, 0x3f, 0x57, 0x74, 0xf5, 0x99, 0x2a, 0x92, 0xad, 0x20, - 0xca, 0xb5, 0x4a, 0x94, 0xfb, 0xae, 0xc2, 0xf7, 0xb7, 0xca, 0x1d, 0x9e, - 0x43, 0xa2, 0xd3, 0x5b, 0xeb, 0xc5, 0xd8, 0xff, 0xf5, 0x3b, 0x6c, 0xb1, - 0x8b, 0x14, 0xcb, 0x69, 0x76, 0x65, 0xba, 0xba, 0x68, 0x35, 0x6e, 0xd6, - 0x3c, 0x36, 0xbe, 0x36, 0x7e, 0xa2, 0x0e, 0x56, 0xc3, 0x5f, 0x90, 0x2f, - 0xed, 0x26, 0x60, 0x0d, 0x1d, 0x98, 0xcc, 0x22, 0x6c, 0xce, 0xd3, 0xdf, - 0x23, 0x0b, 0x8b, 0xff, 0x21, 0xf1, 0x0e, 0x95, 0x6c, 0x0a, 0x54, 0x95, - 0xab, 0x72, 0x6c, 0x3a, 0xec, 0xb1, 0x79, 0x8a, 0x5c, 0xb9, 0xf2, 0x96, - 0xa5, 0x56, 0xb3, 0xec, 0x6f, 0x9d, 0xff, 0x0f, 0x43, 0xd0, 0xee, 0x2f, - 0x07, 0x4c, 0x60, 0xbd, 0x65, 0xc4, 0x1f, 0x5e, 0x17, 0x68, 0x82, 0x5b, - 0x54, 0x0e, 0x2e, 0x65, 0x48, 0x3f, 0xa2, 0x06, 0xb4, 0x42, 0x44, 0x2b, - 0x48, 0x0e, 0x6e, 0xf5, 0x11, 0x0f, 0xf7, 0xa4, 0x94, 0x83, 0xb8, 0x0e, - 0xb0, 0xa3, 0x95, 0x8e, 0x95, 0x59, 0x1a, 0xb7, 0x61, 0x81, 0x0a, 0xa8, - 0xd3, 0x04, 0x4c, 0x68, 0xe3, 0x55, 0x9f, 0x3c, 0x0a, 0x68, 0xb7, 0xf1, - 0x31, 0xf0, 0x5f, 0x92, 0xe4, 0xbf, 0x64, 0x04, 0x6d, 0x27, 0xa6, 0xdf, - 0xa0, 0x8a, 0xcf, 0xfd, 0x96, 0xdb, 0xf0, 0xc0, 0x0b, 0xcd, 0xcc, 0xb0, - 0x8b, 0xfc, 0x62, 0x86, 0x27, 0x57, 0xb8, 0xaa, 0x6c, 0x1b, 0x3c, 0xce, - 0x84, 0x24, 0xda, 0x81, 0xc0, 0x9f, 0x3b, 0xc6, 0x85, 0xc3, 0x9b, 0xd1, - 0xaa, 0x69, 0xe5, 0x56, 0x45, 0x59, 0x8f, 0xc6, 0x43, 0xa8, 0xcc, 0x37, - 0x25, 0x63, 0x21, 0xbf, 0x4f, 0x92, 0xd1, 0xcf, 0xe0, 0xb5, 0x95, 0x26, - 0x85, 0x4a, 0x72, 0x61, 0xee, 0x63, 0x00, 0x2e, 0x68, 0x55, 0x59, 0x3c, - 0x74, 0x79, 0x51, 0x2a, 0x03, 0x76, 0x60, 0xfe, 0xc3, 0xb0, 0x87, 0xa8, - 0x27, 0xd7, 0x83, 0x66, 0x23, 0x6a, 0x18, 0x6d, 0x19, 0x4d, 0xfd, 0xe0, - 0x47, 0x5d, 0x70, 0xc9, 0x66, 0xce, 0x00, 0x4a, 0x16, 0xd8, 0x64, 0x22, - 0xb8, 0x5f, 0xb6, 0xb3, 0xc1, 0x81, 0x8b, 0xed, 0x9c, 0xf2, 0x71, 0xa7, - 0xd5, 0x2a, 0x29, 0xaf, 0xc4, 0xf7, 0x0d, 0x64, 0xef, 0x69, 0xee, 0xcc, - 0xfb, 0xfe, 0xb2, 0xe9, 0x0c, 0xce, 0xc3, 0x80, 0xbf, 0x61, 0xb7, 0x94, - 0x78, 0xcf, 0xc1, 0xf4, 0xae, 0x80, 0xeb, 0xb5, 0x29, 0x11, 0xbc, 0xab, - 0xf2, 0x90, 0xe4, 0x9b, 0x64, 0x0a, 0x27, 0x55, 0xf2, 0x53, 0xba, 0x0f, - 0xf8, 0x00, 0x97, 0x81, 0x3f, 0xeb, 0xb0, 0xe4, 0x7d, 0xc6, 0xae, 0x2c, - 0x58, 0x23, 0x7c, 0x7a, 0xe2, 0xb2, 0xbf, 0xee, 0x18, 0x98, 0xfb, 0x85, - 0xa8, 0x78, 0x8b, 0x6c, 0xc7, 0xa7, 0x39, 0xa4, 0x6a, 0x0f, 0x64, 0xc0, - 0xe4, 0xf6, 0xdc, 0xf8, 0x68, 0x18, 0x2b, 0x59, 0xb7, 0xf0, 0x87, 0x8d, - 0x03, 0xa7, 0x5d, 0xa4, 0xd3, 0x93, 0x5a, 0x6f, 0xeb, 0x47, 0xfa, 0xd6, - 0x0b, 0xd4, 0x32, 0xb9, 0xcc, 0x63, 0x6a, 0x91, 0xcd, 0x23, 0x8d, 0x50, - 0x56, 0xa7, 0x22, 0x0b, 0x4c, 0x58, 0x29, 0x27, 0x69, 0xae, 0x26, 0xea, - 0x32, 0x65, 0xa4, 0x19, 0x24, 0x99, 0xd6, 0x1b, 0x54, 0x8d, 0x0f, 0xde, - 0xf9, 0xf3, 0xcb, 0x7a, 0xc4, 0xb1, 0xc2, 0xdf, 0x80, 0xce, 0xfb, 0xb3, - 0x04, 0x47, 0x5e, 0xd4, 0xb3, 0x92, 0x4f, 0x25, 0x3e, 0x99, 0x44, 0x05, - 0xbd, 0x7c, 0xde, 0xa3, 0xab, 0xac, 0x97, 0xa3, 0xdf, 0x1a, 0x40, 0xa0, - 0x02, 0x24, 0x0f, 0x01, 0x3d, 0x87, 0xf1, 0xe7, 0x67, 0x55, 0x9b, 0x82, - 0xec, 0x40, 0xcc, 0xbe, 0x24, 0xfb, 0x42, 0x86, 0xe6, 0xb0, 0x79, 0x31, - 0x52, 0xa2, 0x16, 0x1d, 0x9d, 0x3e, 0x8d, 0x2a, 0x1e, 0xb3, 0x8d, 0xbf, - 0xbc, 0xf8, 0x38, 0x52, 0x1f, 0x98, 0xe2, 0x61, 0xb2, 0x07, 0xe6, 0xe7, - 0x2e, 0xf9, 0x16, 0x09, 0x01, 0x17, 0xa1, 0x08, 0x37, 0xbc, 0x71, 0x0f, - 0xc5, 0x7a, 0x49, 0x95, 0x02, 0x79, 0x93, 0x50, 0x1b, 0x75, 0xaf, 0xd4, - 0x3a, 0x0f, 0x4b, 0x37, 0xb7, 0x39, 0x07, 0xfb, 0x07, 0xe9, 0x44, 0x88, - 0xd5, 0xe5, 0x65, 0x3b, 0x44, 0xa2, 0x4c, 0x05, 0xe0, 0x05, 0x0b, 0x57, - 0x66, 0x4f, 0x7c, 0x96, 0x13, 0xbd, 0x1e, 0xae, 0xa5, 0x07, 0x4c, 0xe1, - 0x1c, 0xfe, 0xad, 0xcb, 0xe3, 0x6f, 0xba, 0x80, 0x0f, 0x99, 0x58, 0x79, - 0x1c, 0x13, 0x53, 0xf6, 0x3f, 0x01, 0xe8, 0x8c, 0x24, 0x0b, 0x89, 0xa0, - 0xc2, 0xba, 0xa7, 0x29, 0x60, 0xab, 0x4f, 0x49, 0xbd, 0xf9, 0x45, 0x10, - 0x6f, 0x3a, 0xa0, 0x08, 0x16, 0x97, 0x0f, 0xce, 0x64, 0x86, 0xb0, 0x52, - 0xa2, 0xf6, 0xd3, 0x55, 0xe6, 0x3b, 0x0c, 0xf9, 0x34, 0x1c, 0x61, 0x70, - 0x9d, 0xa8, 0x0e, 0xb1, 0xbd, 0x3d, 0x88, 0x49, 0x9f, 0x7e, 0x35, 0x76, - 0x7a, 0x0a, 0x50, 0x79, 0x81, 0x8c, 0x66, 0x35, 0xe9, 0xeb, 0x6d, 0x00, - 0x64, 0xf8, 0x16, 0x87, 0x9c, 0xbf, 0x96, 0xbc, 0xdd, 0x3e, 0x0f, 0xe6, - 0x16, 0x83, 0x39, 0x95, 0xc4, 0x3f, 0xbe, 0x56, 0x02, 0xe2, 0x9e, 0x50, - 0x5d, 0x79, 0xb3, 0x53, 0xa5, 0xf9, 0xa5, 0x1c, 0xc8, 0x6f, 0xcd, 0xdd, - 0xfd, 0xec, 0xea, 0x0a, 0xaa, 0xf9, 0xf7, 0x62, 0xfc, 0x99, 0x86, 0xcf, - 0x01, 0x25, 0x2c, 0x65, 0x86, 0xdf, 0x00, 0x1e, 0xe3, 0xfa, 0x79, 0xc5, - 0x5c, 0x2e, 0x84, 0xf7, 0xec, 0x92, 0x6c, 0x0a, 0xea, 0xa4, 0x74, 0x60, - 0x58, 0xab, 0xe5, 0x76, 0xcf, 0xc0, 0x9e, 0x73, 0xef, 0x09, 0x09, 0x78, - 0x32, 0x1e, 0x90, 0x8f, 0x36, 0x14, 0xc8, 0xa5, 0x71, 0xca, 0xbe, 0x19, - 0x08, 0x2a, 0xd6, 0xa3, 0x3d, 0x86, 0x89, 0x84, 0x14, 0xcf, 0x28, 0x5c, - 0xe1, 0x64, 0xc4, 0x3c, 0xfe, 0x18, 0x43, 0xfa, 0xb1, 0x33, 0xdd, 0x23, - 0xbc, 0xe7, 0x95, 0x73, 0xf9, 0xaf, 0x74, 0x41, 0xa4, 0x39, 0x84, 0x0d, - 0x07, 0x1b, 0x98, 0xcf, 0x06, 0xe8, 0xb8, 0x36, 0xcf, 0x9e, 0x69, 0xc8, - 0xe1, 0x74, 0xae, 0x5b, 0x71, 0x45, 0xdf, 0xbb, 0x3e, 0xe2, 0x3a, 0xb9, - 0x85, 0xdb, 0x02, 0x4c, 0x3b, 0x97, 0xeb, 0xad, 0xde, 0x12, 0x59, 0x79, - 0x30, 0x4a, 0x87, 0x7b, 0x17, 0x32, 0x2a, 0xec, 0xdb, 0x31, 0x7c, 0x8e, - 0xb4, 0x0d, 0xce, 0xd8, 0x3b, 0xe9, 0xfd, 0x8f, 0xdb, 0xc5, 0x1b, 0xb8, - 0x84, 0x32, 0xe6, 0x41, 0xc6, 0xc5, 0x0d, 0xab, 0x48, 0x2b, 0x22, 0xaf, - 0x42, 0x21, 0x42, 0x12, 0x1a, 0xa5, 0x8c, 0x70, 0xd9, 0x72, 0xa7, 0xdc, - 0x91, 0xb9, 0x29, 0xf1, 0xf7, 0x2a, 0x42, 0x40, 0x3c, 0x4c, 0x7e, 0xa5, - 0x49, 0xc2, 0xc6, 0xa8, 0xa8, 0x7e, 0x29, 0xed, 0x4d, 0x85, 0x72, 0x5e, - 0x86, 0x5e, 0xd7, 0x81, 0xde, 0xee, 0x9d, 0x47, 0x4e, 0x93, 0xd1, 0x7e, - 0xb1, 0x94, 0x81, 0x97, 0x38, 0xf6, 0x9a, 0x95, 0xe7, 0x5b, 0x4d, 0x14, - 0x9c, 0x17, 0x53, 0xe1, 0xa1, 0x0d, 0x6f, 0xd5, 0x73, 0xca, 0x49, 0x23, - 0x0b, 0x69, 0xd3, 0xba, 0x23, 0x7a, 0xba, 0xab, 0xff, 0xec, 0x71, 0x02, - 0x11, 0x67, 0x73, 0x72, 0x9e, 0xec, 0xbb, 0x5e, 0x07, 0x43, 0x71, 0x30, - 0x60, 0x13, 0xf1, 0x3e, 0xb2, 0x97, 0xad, 0xd4, 0x01, 0x5c, 0xb3, 0x12, - 0xbb, 0xcf, 0xbf, 0xad, 0x17, 0x36, 0x64, 0x6c, 0x82, 0xa0, 0x99, 0x36, - 0xae, 0xdd, 0x68, 0x62, 0xb5, 0x61, 0x10, 0xac, 0x50, 0xab, 0x25, 0xed, - 0x5a, 0x52, 0x4d, 0x86, 0xdb, 0xf8, 0xfb, 0x43, 0xe1, 0xa4, 0xeb, 0x7b, - 0x0e, 0x1e, 0x61, 0x90, 0xa0, 0xe9, 0x91, 0x84, 0x0e, 0xfd, 0xe9, 0x0a, - 0x22, 0xa5, 0x33, 0xfb, 0xd1, 0xec, 0xde, 0x24, 0xc7, 0x4b, 0xbf, 0x2b, - 0x14, 0x08, 0x1a, 0xf4, 0x8d, 0x6d, 0x2b, 0x93, 0x80, 0x45, 0x59, 0xef, - 0x54, 0x68, 0xf3, 0xcf, 0x48, 0xc8, 0x73, 0x6b, 0xe4, 0x3f, 0xf0, 0xb8, - 0xc2, 0xfd, 0xa0, 0x85, 0xac, 0x0d, 0xc3, 0x09, 0xea, 0x3a, 0x08, 0x4b, - 0xca, 0x77, 0x99, 0x2d, 0x1c, 0x18, 0x96, 0x52, 0x3d, 0xdb, 0xb8, 0x4e, - 0x97, 0x98, 0x48, 0x9b, 0xf7, 0xa7, 0x2c, 0x8a, 0xb1, 0x33, 0x4e, 0xfb, - 0x21, 0xc5, 0xc5, 0x45, 0x49, 0x39, 0xe5, 0x7c, 0x74, 0xbc, 0xcb, 0xe9, - 0xba, 0xfa, 0xf2, 0x8b, 0x78, 0x8e, 0xa1, 0x84, 0xdf, 0xe9, 0x72, 0xde, - 0xec, 0x6b, 0x34, 0x87, 0xc3, 0x9c, 0x87, 0x6e, 0xc3, 0x71, 0xa6, 0x6d, - 0x21, 0xf3, 0xb4, 0xbb, 0x87, 0xd5, 0xc6, 0x16, 0x2c, 0x32, 0x29, 0xdb, - 0x7e, 0x97, 0xf9, 0x81, 0x8c, 0xe2, 0xda, 0x47, 0x17, 0x67, 0x7d, 0x3a, - 0xed, 0x62, 0xa5, 0x54, 0x36, 0x4e, 0x76, 0xa1, 0xa2, 0xb2, 0xaa, 0x63, - 0x20, 0xf8, 0x81, 0xae, 0xc1, 0x95, 0x40, 0x91, 0xab, 0x69, 0x16, 0x6a, - 0x93, 0x1a, 0x8e, 0xfe, 0x26, 0x4a, 0x18, 0x10, 0xbc, 0x76, 0x1b, 0x76, - 0x05, 0x66, 0x54, 0x9f, 0x42, 0xe9, 0x40, 0x7a, 0x3a, 0x49, 0xc4, 0xac, - 0x5f, 0x74, 0x4a, 0xf4, 0xe1, 0x74, 0xe0, 0x17, 0xaa, 0x3a, 0x5d, 0x64, - 0x2b, 0x09, 0x2a, 0xb2, 0x97, 0x30, 0x0d, 0x1e, 0xbb, 0xc9, 0xef, 0x7c, - 0x8e, 0x58, 0xb1, 0x08, 0xe3, 0x6b, 0xb4, 0x9c, 0x28, 0x8e, 0xaa, 0xe8, - 0x53, 0x80, 0x61, 0x38, 0xe5, 0xfa, 0x43, 0x2f, 0xa2, 0xa8, 0x82, 0x27, - 0x88, 0x69, 0xb4, 0xec, 0x6d, 0x79, 0x67, 0x8a, 0x9e, 0x4e, 0x84, 0xb9, - 0x23, 0xf5, 0x29, 0xf9, 0x15, 0x7a, 0x5a, 0xec, 0x73, 0xba, 0x21, 0x0a, - 0x09, 0x02, 0xb9, 0xfa, 0xeb, 0xce, 0xbd, 0x69, 0xb5, 0x40, 0xa6, 0x04, - 0xec, 0x53, 0xeb, 0x89, 0xa2, 0xaa, 0xa6, 0xc8, 0x1b, 0x77, 0x93, 0xc2, - 0x13, 0x39, 0xba, 0x9d, 0xb3, 0x6e, 0x10, 0xa6, 0x35, 0x37, 0xe5, 0x8c, - 0x90, 0x5f, 0xa1, 0xac, 0x20, 0x00, 0xcd, 0x81, 0xfd, 0xdc, 0x6d, 0xbd, - 0x2a, 0x7c, 0xec, 0xec, 0xd7, 0xe0, 0x4e, 0x74, 0x33, 0x29, 0xf5, 0xbd, - 0x03, 0x3c, 0x34, 0x05, 0x9f, 0xe6, 0x9c, 0x8f, 0xe6, 0x3a, 0x75, 0x49, - 0x22, 0xa5, 0x5d, 0x98, 0x74, 0x44, 0xc9, 0xcc, 0x0c, 0xae, 0x00, 0x4c, - 0x02, 0x43, 0x9b, 0x58, 0x2a, 0xac, 0xa5, 0x48, 0xba, 0x1c, 0x34, 0xc9, - 0x2b, 0x9e, 0x50, 0xe2, 0x4d, 0xfb, 0x7b, 0x7d, 0xa3, 0x38, 0xa1, 0xf6, - 0x38, 0xb6, 0xd5, 0x94, 0x96, 0xbc, 0x57, 0x5f, 0xcc, 0x2f, 0xff, 0x91, - 0xd6, 0x02, 0x6c, 0xb4, 0x2a, 0xa9, 0x9d, 0x6f, 0x15, 0xeb, 0xfa, 0x69, - 0x04, 0x0b, 0xb3, 0xad, 0xf1, 0x47, 0x2c, 0x95, 0x50, 0x21, 0xa2, 0xbb, - 0xa3, 0x03, 0xa3, 0xa0, 0x81, 0xf7, 0x6c, 0xdc, 0xbc, 0x00, 0xde, 0x87, - 0xa0, 0x3a, 0xa4, 0x61, 0xea, 0x13, 0xbb, 0xe7, 0x63, 0xcf, 0xd1, 0xbb, - 0x49, 0xef, 0x30, 0x65, 0x8a, 0x55, 0x9a, 0x4d, 0x26, 0xe4, 0x4f, 0xbc, - 0x75, 0xe0, 0xc5, 0x5f, 0xdd, 0x91, 0x7c, 0x0c, 0x5a, 0xc0, 0x64, 0xee, - 0x58, 0xf3, 0x10, 0xea, 0xd9, 0xb7, 0x68, 0x02, 0xd4, 0x18, 0x6d, 0x39, - 0x8b, 0xef, 0xf1, 0xe5, 0xde, 0xef, 0x13, 0x48, 0x6e, 0xf4, 0x82, 0x31, - 0x79, 0x8e, 0x73, 0xc7, 0x80, 0xc9, 0x98, 0xa2, 0x9e, 0x47, 0xc7, 0x75, - 0xfb, 0xc0, 0x0f, 0x52, 0x0a, 0x08, 0xa2, 0xc2, 0xe9, 0x46, 0x73, 0x34, - 0xf5, 0xda, 0xeb, 0x97, 0xaa, 0xfd, 0x5c, 0xd2, 0x1c, 0x40, 0xe5, 0x73, - 0x7e, 0x0e, 0xd4, 0x19, 0x1d, 0xe3, 0x7c, 0xaa, 0xda, 0xf5, 0x44, 0xd9, - 0x69, 0x6b, 0x89, 0xa8, 0xbe, 0xa5, 0x44, 0x90, 0x44, 0x3a, 0x0e, 0xf6, - 0xff, 0x26, 0x56, 0xcd, 0x31, 0x79, 0x33, 0x1d, 0x2a, 0xf3, 0x45, 0xd9, - 0xbe, 0xd7, 0x1e, 0x31, 0xf8, 0x82, 0xb8, 0xda, 0xac, 0xb8, 0xbf, 0xe3, - 0x15, 0x5a, 0x86, 0xfa, 0xa7, 0x29, 0x61, 0xa5, 0x51, 0x96, 0x6b, 0x9f, - 0x93, 0x72, 0x3f, 0x08, 0x75, 0x97, 0xe0, 0xd1, 0xdf, 0xe9, 0x1e, 0x1a, - 0xc2, 0x07, 0xd7, 0x74, 0x2c, 0xcb, 0xde, 0x32, 0xf2, 0xab, 0x26, 0x9a, - 0xdc, 0xd0, 0x9a, 0x7d, 0x51, 0x0a, 0x7f, 0xb3, 0xe5, 0x59, 0x1a, 0xab, - 0xfb, 0x19, 0x4c, 0x19, 0xe1, 0x0b, 0x8f, 0x45, 0x64, 0x88, 0xa4, 0x7e, - 0xb4, 0xa4, 0x00, 0x08, 0xfe, 0x64, 0xb5, 0x46, 0xa4, 0xf6, 0xb3, 0xa9, - 0x33, 0xaa, 0x79, 0x38, 0x38, 0x94, 0x75, 0x6b, 0xd8, 0xf7, 0xfb, 0x9e, - 0xb1, 0x93, 0xb6, 0xa3, 0x94, 0xca, 0x5e, 0xef, 0xb5, 0x52, 0x8d, 0x94, - 0x82, 0x46, 0xab, 0xba, 0xd9, 0xb9, 0x78, 0xb6, 0x6e, 0xfe, 0x98, 0x1b, - 0xd7, 0x4e, 0x5a, 0x76, 0x6c, 0x61, 0xfc, 0xdb, 0x4d, 0x98, 0x75, 0xee, - 0x84, 0x74, 0xdf, 0x73, 0x29, 0xa8, 0xa2, 0xc2, 0x3f, 0xc9, 0xd9, 0x6b, - 0x20, 0x7e, 0x8a, 0x4a, 0x26, 0x56, 0xff, 0x20, 0x88, 0x57, 0xdb, 0x62, - 0x51, 0x83, 0x42, 0x09, 0x34, 0xa1, 0x5a, 0x36, 0x14, 0xbe, 0xf9, 0x6b, - 0xd4, 0xe4, 0x1a, 0xf1, 0x36, 0xa1, 0x00, 0x0d, 0x5f, 0x22, 0x7e, 0x00, - 0xaf, 0x85, 0x97, 0x90, 0xc7, 0x52, 0xe0, 0x8f, 0xb7, 0xea, 0xdf, 0xdf, - 0xb0, 0x4d, 0x60, 0x12, 0x5b, 0xc4, 0x12, 0x6d, 0x9a, 0x6c, 0xe3, 0xec, - 0x62, 0x3e, 0x7f, 0x4f, 0x85, 0xc6, 0x52, 0xc7, 0x18, 0xab, 0x81, 0x6f, - 0x14, 0xab, 0x2c, 0xce, 0x09, 0xff, 0x26, 0x50, 0x30, 0xd3, 0x2a, 0xcd, - 0xeb, 0x97, 0xff, 0xfc, 0x85, 0x06, 0xb9, 0x72, 0x27, 0x9c, 0x51, 0x6e, - 0xcc, 0x54, 0xa3, 0xd0, 0xdf, 0x3d, 0xba, 0x80, 0xbf, 0x59, 0x12, 0xe2, - 0xba, 0xeb, 0x43, 0x5d, 0x0e, 0xb0, 0x4d, 0x42, 0x5b, 0x0c, 0x3d, 0x2e, - 0x6a, 0x3b, 0x57, 0xc9, 0xdd, 0x6a, 0xb7, 0xbe, 0x7b, 0x48, 0x30, 0xfa, - 0x01, 0x44, 0x4a, 0xcf, 0xf3, 0x5e, 0xc2, 0x3a, 0xb5, 0x38, 0xa3, 0x13, - 0x0a, 0x92, 0x1a, 0x71, 0x4f, 0xe0, 0xfa, 0xf5, 0xc3, 0xfa, 0x98, 0x4e, - 0xee, 0x05, 0x26, 0x6c, 0xfb, 0x64, 0xdc, 0x8f, 0x8d, 0x1f, 0x8d, 0xcd, - 0xa2, 0x78, 0xa8, 0xeb, 0xaa, 0x62, 0xd0, 0x13, 0x98, 0xae, 0xdd, 0xe7, - 0x53, 0x5a, 0xc6, 0x06, 0xab, 0x33, 0xaf, 0xde, 0x57, 0x51, 0x8d, 0xf4, - 0x63, 0xd2, 0x8d, 0xbb, 0x67, 0xd6, 0xa5, 0x3e, 0x21, 0x4d, 0x03, 0x55, - 0xf8, 0x0d, 0x6c, 0x5b, 0xe9, 0x77, 0xb3, 0x97, 0xf3, 0x97, 0x66, 0xc7, - 0xe4, 0x2a, 0xe3, 0xdc, 0x97, 0x50, 0x50, 0xa4, 0x1e, 0xc1, 0x32, 0xf4, - 0x37, 0x0a, 0x7a, 0x44, 0x1f, 0xde, 0x50, 0x40, 0xb3, 0x29, 0x09, 0xa4, - 0x68, 0xbb, 0xcc, 0x83, 0x16, 0xa8, 0xbd, 0xe1, 0x76, 0x36, 0xca, 0xe2, - 0x92, 0x2d, 0x30, 0x6e, 0x06, 0x9f, 0xac, 0x4f, 0xc0, 0x0f, 0xf6, 0xd9, - 0x90, 0xbc, 0xe1, 0x7b, 0x51, 0x36, 0xb1, 0x21, 0xb8, 0x22, 0x6f, 0x36, - 0x79, 0x76, 0xb5, 0x4a, 0x31, 0x9c, 0x2b, 0x1b, 0x13, 0xea, 0xef, 0x77, - 0x45, 0x69, 0x3c, 0xfc, 0x2f, 0xb7, 0xd8, 0xee, 0xf2, 0x9e, 0x58, 0x91, - 0xe9, 0x1d, 0xfb, 0x12, 0x43, 0x91, 0xc5, 0x48, 0x07, 0xde, 0x3a, 0xd7, - 0x07, 0x0f, 0x12, 0xcd, 0x59, 0x05, 0x7e, 0x28, 0xf1, 0xf8, 0x05, 0xd8, - 0x8b, 0xfb, 0xe8, 0x39, 0x60, 0xfe, 0xcc, 0x64, 0xa0, 0xca, 0x66, 0xa3, - 0xfa, 0xe0, 0x97, 0x6e, 0x03, 0x90, 0xd9, 0x7b, 0xe6, 0x1a, 0x25, 0xaa, - 0xdd, 0x5d, 0x67, 0xd1, 0xfc, 0x6d, 0xab, 0xe8, 0xb1, 0xe8, 0x43, 0xf3, - 0x6a, 0xc9, 0xab, 0x25, 0x12, 0xe6, 0x21, 0xd8, 0x33, 0x66, 0xb8, 0x6a, - 0xb1, 0xd7, 0x34, 0x43, 0xff, 0x60, 0x7c, 0x20, 0x56, 0x2b, 0x14, 0xf4, - 0x50, 0x25, 0x6e, 0xdb, 0x7c, 0x84, 0x2a, 0xab, 0xef, 0xeb, 0x12, 0x6b, - 0xc8, 0x1b, 0xd7, 0x54, 0x5a, 0xf9, 0xf4, 0x74, 0x6a, 0xd9, 0xb0, 0xeb, - 0xa2, 0xd2, 0x34, 0xc8, 0x12, 0xd1, 0x03, 0x54, 0xde, 0x2e, 0xb8, 0xab, - 0x0a, 0x03, 0xe9, 0x10, 0xf6, 0xa5, 0xaf, 0xb1, 0x30, 0x6d, 0x06, 0xf1, - 0x5a, 0x46, 0xeb, 0xb5, 0xe7, 0x6d, 0xa6, 0xf0, 0x17, 0x25, 0xf7, 0xd1, - 0x0a, 0xfa, 0xac, 0xa4, 0x4e, 0x37, 0xa1, 0xd9, 0x0f, 0xbf, 0x6a, 0x1f, - 0x1c, 0xb7, 0x09, 0xd7, 0xd4, 0xfc, 0xf0, 0xc3, 0x3e, 0x80, 0x5a, 0x7f, - 0x8e, 0x04, 0xc8, 0x92, 0x94, 0x2c, 0xbb, 0xe9, 0x0d, 0xf3, 0x85, 0x69, - 0x56, 0x4e, 0xcf, 0xff, 0x66, 0x8c, 0x9f, 0x63, 0xd2, 0x6e, 0x66, 0x7d, - 0x35, 0x25, 0xe1, 0x75, 0xe0, 0xb6, 0xca, 0x99, 0xf3, 0x54, 0x6f, 0xd6, - 0xed, 0x38, 0xaa, 0x3f, 0x4c, 0x46, 0x9e, 0xcf, 0x8d, 0x5b, 0x9c, 0x32, - 0xe3, 0xd4, 0x38, 0xda, 0x0e, 0x98, 0x20, 0x4c, 0xbd, 0x99, 0xf5, 0xec, - 0x43, 0x30, 0x27, 0xaf, 0x9b, 0xa7, 0xed, 0xa6, 0xd2, 0x54, 0x2e, 0x03, - 0x69, 0x93, 0x2f, 0x35, 0x5c, 0x15, 0x7d, 0xde, 0x8e, 0xb9, 0xe6, 0xad, - 0xf5, 0x04, 0x6f, 0x2a, 0x4f, 0x27, 0xdf, 0xf5, 0xbc, 0xb3, 0xb6, 0x11, - 0x05, 0x4a, 0xd8, 0x98, 0x54, 0xc0, 0x42, 0xc8, 0xc0, 0xee, 0xcf, 0xd7, - 0xc9, 0xd6, 0xaf, 0x3a, 0x83, 0x57, 0xac, 0x75, 0x46, 0xfc, 0x05, 0x1b, - 0x73, 0xb3, 0x74, 0xc5, 0x20, 0x1d, 0x28, 0x43, 0x9d, 0x9c, 0x42, 0x5f, - 0x0f, 0xcd, 0xd3, 0xdc, 0x7d, 0xb1, 0xc7, 0xab, 0xf4, 0x39, 0x67, 0x85, - 0xaf, 0x96, 0xe2, 0xce, 0x58, 0x94, 0xa5, 0x83, 0x93, 0xf1, 0xbb, 0x83, - 0xfe, 0x41, 0xa7, 0x30, 0xfa, 0x16, 0xbb, 0x71, 0x26, 0x7e, 0x6a, 0x02, - 0xea, 0x59, 0x9d, 0xe0, 0xed, 0xc7, 0x30, 0x31, 0x91, 0xe4, 0x1a, 0x5b, - 0x31, 0x7f, 0xf0, 0x8d, 0xc0, 0x96, 0xd5, 0x9e, 0x84, 0xa8, 0x91, 0x46, - 0xa7, 0xa0, 0x97, 0x9c, 0x80, 0x7b, 0xcf, 0xa5, 0xe0, 0xd5, 0xa5, 0xcd, - 0xb4, 0xf7, 0x3c, 0x3b, 0x3c, 0xc2, 0x4e, 0x4a, 0xdd, 0x2f, 0x86, 0x4b, - 0xa4, 0xd4, 0xd7, 0x1f, 0x30, 0xd6, 0x2f, 0xd1, 0x05, 0xe3, 0xf3, 0xd3, - 0x8c, 0x12, 0x8d, 0x7f, 0xf5, 0x4a, 0x7b, 0x93, 0x8e, 0xc4, 0x1b, 0xd5, - 0x77, 0xa6, 0xd0, 0xbe, 0x2f, 0xcc, 0x2a, 0xbc, 0x9b, 0xf5, 0x8f, 0x1f, - 0x7f, 0x40, 0x11, 0xd7, 0x20, 0xc4, 0x11, 0x50, 0x37, 0x1a, 0xb1, 0xb0, - 0x7c, 0x2d, 0x7b, 0x9e, 0xab, 0xf3, 0xde, 0x75, 0xbe, 0xa5, 0xaf, 0x89, - 0x43, 0x06, 0x7e, 0xc1, 0x97, 0xda, 0xc9, 0x56, 0x74, 0xb1, 0x59, 0x0c, - 0xd4, 0x45, 0x5a, 0x46, 0x44, 0x4d, 0x6d, 0xce, 0xcf, 0x3b, 0xf1, 0x81, - 0x96, 0x37, 0xbf, 0x21, 0xdc, 0x33, 0x4b, 0xd6, 0x28, 0x3d, 0xa3, 0x98, - 0x8f, 0x04, 0x8d, 0xa0, 0x38, 0x36, 0x20, 0xd4, 0xb7, 0x18, 0xed, 0x60, - 0xa1, 0xba, 0x66, 0x67, 0xba, 0xf5, 0x86, 0x86, 0xaa, 0xa0, 0x11, 0x12, - 0x9e, 0xed, 0xd4, 0xfe, 0xb5, 0x1c, 0x2b, 0xd7, 0x98, 0xec, 0xfc, 0x7f, - 0x73, 0xc8, 0xfd, 0x58, 0x2f, 0xa5, 0x8c, 0xd2, 0xd4, 0x07, 0x94, 0x4d, - 0xe7, 0x6a, 0x62, 0x85, 0x76, 0x29, 0xe0, 0xd3, 0xac, 0x7a, 0xa0, 0xbc, - 0x5d, 0x79, 0x35, 0x5f, 0x37, 0x99, 0xaf, 0xe1, 0x56, 0x1b, 0xa2, 0x0b, - 0xf4, 0xc2, 0xb7, 0xe4, 0x3a, 0xe1, 0x29, 0xd1, 0x2a, 0x24, 0x76, 0xad, - 0x57, 0xb4, 0x32, 0x11, 0xe4, 0x41, 0x9a, 0xaf, 0x6d, 0xf6, 0xf5, 0xd2, - 0xcd, 0x2a, 0x43, 0xe6, 0x51, 0xce, 0x35, 0x4b, 0xf7, 0xba, 0xc8, 0x63, - 0x3c, 0xb4, 0x7e, 0x1a, 0x63, 0xb1, 0xe6, 0xfe, 0x35, 0x38, 0xd6, 0x0f, - 0xb4, 0x33, 0xeb, 0xb6, 0xaf, 0xc1, 0x09, 0x13, 0x8e, 0xd8, 0x91, 0x33, - 0xae, 0xd7, 0x46, 0x9d, 0x61, 0x08, 0xe9, 0xe8, 0x24, 0xe1, 0x75, 0xb2, - 0xa1, 0x0d, 0xca, 0x34, 0xef, 0x00, 0x08, 0x7b, 0x12, 0x6e, 0x9a, 0xe1, - 0x01, 0xcd, 0x5f, 0x14, 0x33, 0x35, 0xf4, 0x01, 0x17, 0x03, 0xb8, 0x29, - 0x6f, 0xed, 0xe3, 0x74, 0x36, 0x46, 0x58, 0xca, 0xac, 0x2e, 0x3b, 0x58, - 0x00, 0x08, 0x16, 0x14, 0x50, 0x0e, 0xad, 0xec, 0x88, 0x50, 0xcf, 0x9a, - 0x2b, 0xf5, 0x18, 0x81, 0xf0, 0x6f, 0x30, 0x2b, 0x85, 0x04, 0x82, 0xa6, - 0xce, 0xcc, 0xca, 0x67, 0x54, 0x8a, 0xc9, 0x23, 0x31, 0x02, 0xc5, 0xef, - 0xfe, 0x9f, 0x1a, 0x2b, 0x0f, 0xcd, 0xf2, 0x6a, 0xbf, 0x21, 0x0c, 0x97, - 0x89, 0x94, 0x4a, 0x9a, 0x48, 0x1a, 0x6c, 0x70, 0x7f, 0xa6, 0xa7, 0xfd, - 0x6b, 0xde, 0xa1, 0x56, 0xc7, 0x17, 0xa5, 0x54, 0x92, 0x85, 0xd2, 0x65, - 0x73, 0x13, 0x8f, 0x9b, 0x07, 0x9a, 0xc8, 0xf6, 0x98, 0x20, 0x15, 0x2b, - 0x6e, 0xf9, 0xce, 0xde, 0xd4, 0x8f, 0x6f, 0x1d, 0x36, 0x85, 0xa6, 0x64, - 0x29, 0xac, 0x91, 0x5f, 0x0d, 0xc3, 0x3c, 0x8b, 0xb6, 0x94, 0xe5, 0x97, - 0x36, 0x05, 0x3b, 0xa9, 0xcc, 0x04, 0xbe, 0x3d, 0xab, 0x96, 0x87, 0x29, - 0xea, 0xaf, 0x11, 0x68, 0x39, 0x05, 0x49, 0xcb, 0xdd, 0x7d, 0x4d, 0xf3, - 0x33, 0xdd, 0x19, 0xe0, 0x67, 0x8f, 0x9a, 0x91, 0xa1, 0x71, 0x0e, 0x99, - 0xd6, 0x62, 0xae, 0xf9, 0x9f, 0x91, 0x9e, 0x7b, 0x7a, 0x9a, 0x49, 0xfa, - 0xad, 0x84, 0xcc, 0xed, 0x15, 0x3d, 0x41, 0xe3, 0x9a, 0x6b, 0x8b, 0xe8, - 0xb7, 0x7d, 0xbe, 0xd8, 0xd9, 0x1e, 0x58, 0x6a, 0x02, 0x94, 0x0f, 0x74, - 0x15, 0xf9, 0xaf, 0x7e, 0x9b, 0x44, 0x94, 0x30, 0x07, 0xa5, 0x09, 0xd1, - 0xf5, 0x1a, 0xe8, 0xd7, 0xec, 0x3e, 0x22, 0x84, 0xe0, 0x7d, 0xb6, 0x05, - 0xc0, 0x7a, 0x18, 0xe0, 0xbc, 0xeb, 0x11, 0x09, 0xb1, 0x03, 0xd7, 0x24, - 0xe3, 0x1f, 0x6e, 0xef, 0x47, 0x3f, 0x09, 0xe3, 0x86, 0x3c, 0xad, 0xee, - 0x79, 0x50, 0x8b, 0xd1, 0x0a, 0x32, 0x81, 0x3e, 0xcb, 0x6e, 0xee, 0x59, - 0x38, 0x85, 0x95, 0x3a, 0xc0, 0x80, 0x4b, 0xde, 0xc4, 0x8f, 0x31, 0x12, - 0x7c, 0xd1, 0x04, 0x64, 0x1a, 0x76, 0xff, 0xde, 0x29, 0x52, 0xae, 0xf1, - 0x1c, 0xeb, 0x9b, 0x6f, 0xf5, 0x17, 0x1b, 0xdb, 0x13, 0xc0, 0x9c, 0xa4, - 0xaf, 0xc7, 0x8a, 0xfd, 0x15, 0x7f, 0xe9, 0x46, 0x9a, 0x22, 0xd6, 0xeb, - 0xb9, 0xf7, 0xd6, 0x3c, 0x79, 0x5b, 0xa4, 0x20, 0x72, 0x73, 0xe3, 0x1c, - 0x58, 0x4f, 0xb6, 0xee, 0xa8, 0x49, 0x33, 0x38, 0x83, 0x6e, 0x1b, 0x3c, - 0x8a, 0x3d, 0x4d, 0x32, 0xb9, 0x3b, 0x29, 0x91, 0x60, 0xa0, 0x73, 0x3f, - 0x87, 0x76, 0x11, 0x37, 0x57, 0x55, 0x5d, 0x66, 0xd7, 0x8c, 0xfd, 0x09, - 0xf2, 0xed, 0x31, 0xa1, 0xd9, 0x5e, 0xf5, 0x96, 0x51, 0x35, 0x7a, 0x14, - 0xb1, 0x5a, 0x07, 0x23, 0xbf, 0x03, 0x38, 0x55, 0xaf, 0x97, 0x5d, 0x3f, - 0xab, 0xd8, 0xa5, 0x5b, 0x9a, 0x6c, 0xa2, 0xd9, 0x50, 0xb3, 0xa3, 0x44, - 0xeb, 0xbc, 0xdd, 0xe6, 0xcc, 0x0d, 0xe0, 0x64, 0x51, 0x5d, 0xb0, 0xdf, - 0xe5, 0x3e, 0xe7, 0x84, 0xea, 0x6d, 0xc0, 0x5a, 0xb9, 0x2a, 0x1f, 0x16, - 0x98, 0x04, 0x3f, 0x72, 0x2a, 0x17, 0x6d, 0x84, 0x5d, 0x4b, 0xeb, 0xab, - 0x49, 0x1d, 0x99, 0x5e, 0xd0, 0xac, 0x52, 0xaa, 0xe1, 0x90, 0x9c, 0xb0, - 0xb2, 0xad, 0x57, 0x2c, 0xa8, 0xb7, 0xf1, 0xbc, 0x43, 0xd3, 0xb4, 0x75, - 0x7c, 0x8c, 0x2f, 0xca, 0xb4, 0xfc, 0x5e, 0x6c, 0xce, 0xec, 0x21, 0xdc, - 0x03, 0x13, 0x90, 0x3b, 0x69, 0x05, 0x7e, 0xf8, 0x6b, 0xbd, 0x92, 0xd6, - 0x27, 0x6f, 0xa1, 0x69, 0x98, 0x6f, 0x89, 0x76, 0x6c, 0x22, 0x34, 0xe0, - 0xc8, 0xaa, 0x37, 0x6e, 0xfb, 0x51, 0x1c, 0x85, 0x4a, 0xfc, 0x16, 0x25, - 0x60, 0x85, 0x92, 0xdf, 0x17, 0x1a, 0x4b, 0x9e, 0x43, 0x34, 0xea, 0x85, - 0x43, 0xcf, 0xca, 0xf2, 0x59, 0xf7, 0x6a, 0xbd, 0x47, 0x98, 0x05, 0x7e, - 0x12, 0xeb, 0x44, 0xa0, 0x78, 0xe4, 0x11, 0xe5, 0xa3, 0xc2, 0x11, 0xec, - 0x23, 0x89, 0xd8, 0xe2, 0x80, 0x80, 0xfd, 0x93, 0xd3, 0x28, 0x9c, 0x79, - 0x2d, 0x38, 0xcd, 0x9e, 0x69, 0xfc, 0xa0, 0x2c, 0x6f, 0x1a, 0x25, 0x2e, - 0x9c, 0x56, 0xbe, 0x5a, 0xd3, 0x31, 0xd0, 0x1b, 0xdc, 0xd8, 0xb8, 0x5a, - 0x93, 0xe5, 0x26, 0x6f, 0x61, 0x79, 0xa7, 0x4a, 0xcb, 0x3c, 0x91, 0x2a, - 0x5c, 0x3b, 0x78, 0x2a, 0xef, 0x49, 0x42, 0x4e, 0xe1, 0x80, 0xc0, 0xe2, - 0xdc, 0x09, 0xd4, 0xbf, 0x46, 0x97, 0x92, 0x18, 0x29, 0x92, 0xba, 0x5e, - 0x06, 0xfd, 0x76, 0x18, 0xf4, 0x14, 0x39, 0x0c, 0xb2, 0x53, 0xef, 0xfc, - 0x87, 0xfc, 0x81, 0x2b, 0x13, 0x40, 0x5e, 0x7c, 0xf7, 0xa2, 0xe9, 0xd2, - 0xbd, 0x8d, 0x7b, 0x2f, 0x1c, 0xf1, 0x5e, 0xdb, 0xf3, 0x24, 0xb8, 0x14, - 0x4a, 0x21, 0x2e, 0x43, 0x6b, 0xdd, 0x35, 0xf6, 0xfe, 0xa4, 0x9f, 0x98, - 0x86, 0xff, 0x55, 0xf4, 0xef, 0x69, 0xad, 0x1a, 0x4e, 0xa0, 0x16, 0x0a, - 0xd6, 0xd6, 0xe2, 0x40, 0xcc, 0x05, 0xbd, 0x59, 0x76, 0xa7, 0xd7, 0x94, - 0xa7, 0xd2, 0x2b, 0xd7, 0x27, 0x61, 0x13, 0x4b, 0x94, 0x69, 0x06, 0x15, - 0x56, 0x7b, 0x15, 0xbb, 0x28, 0x66, 0x75, 0x85, 0xb4, 0xf5, 0x8b, 0x57, - 0xaa, 0xcd, 0xfa, 0xf1, 0x15, 0x97, 0xef, 0xa6, 0xb5, 0x9b, 0xed, 0x06, - 0x4f, 0x2a, 0x79, 0xae, 0xba, 0xf8, 0x40, 0x77, 0x39, 0x8f, 0x18, 0x4f, - 0x33, 0x1b, 0x8e, 0xbd, 0x08, 0xba, 0x55, 0xb1, 0xe8, 0xca, 0xb0, 0xfd, - 0x36, 0x05, 0xdd, 0xbd, 0xd0, 0x2c, 0xa7, 0xb3, 0x12, 0x45, 0x64, 0xef, - 0xea, 0xde, 0x1e, 0xc4, 0xc8, 0xe7, 0x73, 0xaf, 0x21, 0x59, 0x6c, 0x65, - 0xa9, 0x02, 0xdf, 0x6a, 0xbf, 0xfa, 0x98, 0xc6, 0xdd, 0x04, 0xc3, 0x15, - 0x9b, 0x94, 0x71, 0x51, 0x65, 0x21, 0x2e, 0x03, 0x1b, 0x04, 0x14, 0x28, - 0x6c, 0x64, 0x58, 0x32, 0xf1, 0x7f, 0x25, 0x66, 0x7c, 0x2e, 0x61, 0xf5, - 0xaf, 0xd7, 0x45, 0x4a, 0x5a, 0x96, 0xa2, 0x5e, 0x37, 0x8c, 0xc2, 0xaf, - 0x4d, 0x7f, 0xfb, 0xe4, 0xd3, 0x04, 0x13, 0xa3, 0x2e, 0xa0, 0x44, 0xe8, - 0x64, 0x48, 0x67, 0xed, 0xb3, 0xc2, 0x3e, 0xff, 0xff, 0x80, 0xea, 0x64, - 0xb3, 0x4c, 0x3a, 0x6d, 0xa3, 0x9a, 0x37, 0xd0, 0xde, 0xef, 0x33, 0x94, - 0xad, 0x0b, 0x44, 0x3a, 0xe5, 0x65, 0x9a, 0x97, 0xdc, 0xf9, 0xae, 0x98, - 0x4b, 0x80, 0x0b, 0xab, 0x6a, 0x5a, 0xb0, 0xec, 0x1e, 0x3a, 0x1d, 0x62, - 0x55, 0x1c, 0x1d, 0x48, 0xf7, 0xc6, 0x76, 0xe6, 0xbb, 0x08, 0x12, 0x1a, - 0xbe, 0x9b, 0xdf, 0xf1, 0x6f, 0x26, 0xe7, 0xbf, 0xc3, 0x7d, 0xc6, 0xc9, - 0x7b, 0x4e, 0x8b, 0x81, 0x48, 0x68, 0x8d, 0xa1, 0x24, 0x24, 0xb2, 0x4f, - 0x34, 0x67, 0xd9, 0xf6, 0xca, 0xee, 0x38, 0x30, 0x17, 0x9f, 0x06, 0x02, - 0x8e, 0x13, 0xb7, 0xbb, 0xf7, 0x21, 0xe2, 0xf7, 0x67, 0x11, 0x90, 0xaf, - 0xb1, 0xdd, 0xdd, 0x9f, 0xd0, 0x0a, 0xcb, 0x51, 0xd8, 0xbb, 0x7c, 0x6d, - 0x74, 0x46, 0x40, 0x29, 0xca, 0x56, 0x5c, 0x3e, 0x6f, 0x49, 0x77, 0x02, - 0x81, 0xd7, 0xe8, 0xa2, 0xf9, 0x77, 0xd3, 0x4d, 0x27, 0xfa, 0x45, 0xdc, - 0x1c, 0x7f, 0x05, 0x49, 0x37, 0xf6, 0x61, 0x27, 0x0e, 0x98, 0x3a, 0x09, - 0xc8, 0x57, 0x75, 0x51, 0xba, 0x72, 0x97, 0xde, 0x1a, 0xe5, 0x2c, 0x64, - 0x87, 0x85, 0x91, 0xb3, 0x70, 0x2f, 0xc7, 0xcb, 0xa3, 0xd4, 0x5b, 0x03, - 0xb5, 0x5b, 0xad, 0xaf, 0x78, 0xab, 0x10, 0xfe, 0xd9, 0x81, 0xba, 0x6e, - 0xbd, 0x97, 0x78, 0x25, 0x57, 0x83, 0xed, 0x21, 0x78, 0xe0, 0x53, 0x9a, - 0xbb, 0x66, 0xb6, 0x44, 0x41, 0xaa, 0xe7, 0xca, 0xe9, 0xa0, 0x54, 0x3e, - 0x8f, 0x43, 0xad, 0xc1, 0x59, 0xf0, 0x43, 0xeb, 0xd9, 0xf0, 0x06, 0xa9, - 0x5e, 0xa4, 0x6e, 0x34, 0xec, 0x25, 0xdc, 0xd8, 0x22, 0x01, 0x6c, 0x7a, - 0x17, 0x33, 0xdd, 0xcf, 0x4c, 0xb4, 0x21, 0x64, 0xd6, 0x38, 0xb9, 0xa4, - 0x31, 0x0b, 0x01, 0x55, 0xd0, 0x04, 0x42, 0xa3, 0xcf, 0x69, 0x8a, 0xc6, - 0x4d, 0xd8, 0x61, 0x10, 0x6a, 0x4e, 0xdc, 0xbc, 0x91, 0xbf, 0x24, 0x26, - 0x7b, 0x88, 0xc6, 0xfe, 0x73, 0xe5, 0xe2, 0xa0, 0x33, 0x53, 0x81, 0x3a, - 0x28, 0xe9, 0x0c, 0x72, 0x79, 0xd8, 0x4e, 0x74, 0x11, 0xb3, 0x23, 0xcf, - 0x04, 0x99, 0x17, 0xcd, 0x57, 0xf0, 0x61, 0xa0, 0xce, 0xd1, 0x49, 0xdf, - 0xdf, 0xd3, 0x7b, 0xfc, 0x51, 0x23, 0x1b, 0x3f, 0x23, 0x35, 0x04, 0xbd, - 0x8a, 0x72, 0xbd, 0x4a, 0x37, 0x41, 0x0a, 0x4b, 0x8b, 0x49, 0x1f, 0xa8, - 0x26, 0x6c, 0x8f, 0x1e, 0xf1, 0xc1, 0xeb, 0xdd, 0x5b, 0x10, 0x09, 0x77, - 0x00, 0xe4, 0x44, 0x73, 0x74, 0x9c, 0x55, 0x85, 0xc8, 0x11, 0x15, 0xce, - 0x3f, 0xa9, 0x19, 0xfe, 0xee, 0x9f, 0x5e, 0xa1, 0x97, 0x90, 0x88, 0x3e, - 0x2a, 0xf6, 0x86, 0x8f, 0x8d, 0x1f, 0xf6, 0xc9, 0xa3, 0xd7, 0x40, 0xaf, - 0x2e, 0xe4, 0xd4, 0x56, 0x62, 0xc7, 0xd4, 0x55, 0x1d, 0x38, 0xa2, 0x28, - 0x51, 0x9d, 0xf3, 0x68, 0x20, 0xcd, 0x64, 0xfc, 0x66, 0x2b, 0x80, 0x8c, - 0x36, 0xf5, 0x54, 0xae, 0x4e, 0xa5, 0x2c, 0x4e, 0x2a, 0xa2, 0x17, 0x68, - 0x7f, 0xef, 0xee, 0x45, 0x21, 0x6c, 0xdc, 0x1b, 0x06, 0x1c, 0xf9, 0x59, - 0x09, 0xf8, 0x76, 0xf0, 0x80, 0x16, 0x4d, 0x2d, 0xdc, 0x70, 0x1e, 0x94, - 0x9f, 0x42, 0xb9, 0xa2, 0x87, 0x9a, 0x84, 0x7c, 0xb1, 0xa0, 0x1a, 0x8a, - 0x96, 0x41, 0x99, 0x55, 0xa5, 0x6c, 0x7c, 0xe0, 0x3a, 0x42, 0xce, 0x3c, - 0xc5, 0x60, 0xbe, 0x2c, 0xcc, 0xa8, 0x31, 0x44, 0x5f, 0x03, 0x00, 0xc2, - 0xaa, 0x98, 0x3b, 0x19, 0x3b, 0x29, 0xf6, 0x82, 0xb5, 0xe3, 0x50, 0x2d, - 0x10, 0xe8, 0xde, 0xab, 0x57, 0x68, 0x4a, 0x1b, 0xe0, 0x53, 0x9a, 0xae, - 0xf2, 0xf0, 0xfe, 0xad, 0xfb, 0xa2, 0x3c, 0xd6, 0x7c, 0xf5, 0x63, 0x11, - 0xdf, 0x39, 0xe3, 0xd9, 0xf0, 0xe6, 0x1c, 0x54, 0x08, 0x9a, 0x7d, 0x12, - 0xd6, 0xb8, 0xe8, 0x31, 0x62, 0xfa, 0x7d, 0xba, 0x6d, 0x63, 0x48, 0x30, - 0xc7, 0x2d, 0x22, 0x6b, 0x01, 0x24, 0x8b, 0x49, 0xa7, 0x82, 0xad, 0x95, - 0xb3, 0xae, 0xa3, 0xaf, 0x8a, 0xbd, 0xe2, 0x4e, 0xe2, 0xc2, 0xc5, 0x67, - 0xde, 0x04, 0xe0, 0x2a, 0xea, 0xb5, 0x37, 0x9c, 0xbf, 0xc4, 0x63, 0xa7, - 0xc6, 0xb0, 0xc0, 0x6d, 0x01, 0x6b, 0xdc, 0xcc, 0xb6, 0xf1, 0xd8, 0x19, - 0xa4, 0xf0, 0x7d, 0xc1, 0x82, 0xec, 0x27, 0x39, 0x04, 0x0f, 0x82, 0x3e, - 0x3a, 0x26, 0x90, 0x79, 0xf5, 0x5b, 0xc6, 0x4c, 0xd8, 0xf4, 0x2c, 0x03, - 0xee, 0x8e, 0x99, 0xe7, 0x68, 0xc0, 0x91, 0x8c, 0xb9, 0x69, 0xe1, 0xb5, - 0xfc, 0xde, 0x56, 0x01, 0xd8, 0xe4, 0x9b, 0xbe, 0x11, 0x54, 0x91, 0xb3, - 0x64, 0x23, 0xed, 0x99, 0x34, 0xcf, 0x21, 0x79, 0x94, 0xfe, 0xa2, 0x1d, - 0x2b, 0xbb, 0x6b, 0xe0, 0x99, 0x32, 0x8e, 0x2c, 0xe1, 0x84, 0xbc, 0x35, - 0xcf, 0x79, 0x11, 0xea, 0xc8, 0xab, 0x70, 0xcc, 0x7c, 0xcc, 0x6d, 0xfa, - 0x1c, 0xc5, 0x3d, 0x46, 0xab, 0xc0, 0xec, 0x37, 0x55, 0xf4, 0x8c, 0x3c, - 0x8b, 0xf3, 0xfa, 0x6d, 0xd6, 0xd5, 0xbd, 0xa4, 0xbc, 0xd1, 0x4f, 0x4a, - 0xe6, 0xd8, 0x61, 0x50, 0xf0, 0x15, 0xe1, 0xc1, 0x1b, 0xa0, 0x4a, 0x6f, - 0xf5, 0x84, 0x14, 0xfc, 0x99, 0xf8, 0x81, 0x3b, 0xbd, 0xc5, 0xb9, 0x47, - 0x66, 0xae, 0xa2, 0x23, 0x1f, 0xbd, 0x63, 0x14, 0xc1, 0xc0, 0x23, 0xbe, - 0x14, 0xc6, 0xbb, 0x21, 0xab, 0x4d, 0xd2, 0x13, 0x1c, 0x14, 0x6a, 0x16, - 0xc7, 0xf7, 0xab, 0xff, 0x00, 0x2a, 0x0c, 0x81, 0x43, 0x3d, 0xdb, 0x49, - 0x79, 0x2c, 0xb0, 0x61, 0x47, 0x34, 0x9e, 0xac, 0xdd, 0x97, 0x43, 0xd5, - 0x60, 0x14, 0xe3, 0xa7, 0xa4, 0x61, 0x6e, 0x82, 0x28, 0xc1, 0x2c, 0x7e, - 0x33, 0x96, 0x84, 0x53, 0xe5, 0xd5, 0x66, 0xe3, 0x64, 0x34, 0x6b, 0x15, - 0x70, 0x4c, 0x16, 0x6c, 0x4e, 0xde, 0x6f, 0x1a, 0x92, 0xe1, 0x65, 0x89, - 0xd1, 0x9e, 0xa6, 0xb7, 0x8c, 0xd8, 0x44, 0xeb, 0x75, 0xcd, 0xdc, 0x1e, - 0xcc, 0xd2, 0x8b, 0x4d, 0x7d, 0x94, 0x1a, 0xd4, 0xd0, 0x32, 0xb0, 0x1b, - 0x4f, 0xd1, 0x7a, 0x41, 0x9e, 0x00, 0x52, 0xb4, 0x1b, 0x5e, 0x0b, 0x81, - 0xc4, 0x0b, 0x56, 0x43, 0xde, 0xb6, 0xa3, 0xeb, 0x13, 0x29, 0xa9, 0x42, - 0x19, 0xaa, 0x4a, 0x94, 0x79, 0xd5, 0x63, 0x7d, 0xb4, 0xa6, 0x5f, 0xfe, - 0xc0, 0x51, 0x87, 0x80, 0xf8, 0xda, 0x09, 0x1e, 0xce, 0x9e, 0x8b, 0xac, - 0x8e, 0xac, 0x97, 0xf3, 0x28, 0x09, 0x1d, 0x4b, 0xfa, 0x9c, 0xdd, 0xe1, - 0xf0, 0xd9, 0x5c, 0x1f, 0x3e, 0xcb, 0x08, 0x6d, 0x53, 0x3e, 0xa6, 0xac, - 0xe6, 0x1d, 0x3a, 0x64, 0xe0, 0xa3, 0xa2, 0x6c, 0xb0, 0x62, 0x5e, 0xca, - 0x0e, 0x17, 0xb7, 0xfc, 0xcc, 0xf5, 0xa3, 0xf0, 0x17, 0xbc, 0xab, 0x18, - 0x10, 0x0e, 0x53, 0x9e, 0x67, 0x44, 0x07, 0x0e, 0x3c, 0x33, 0x6a, 0x5a, - 0x05, 0x0d, 0x91, 0x8f, 0x3a, 0x9f, 0xaf, 0x33, 0x26, 0xfb, 0x57, 0xeb, - 0x17, 0xab, 0x08, 0x25, 0x7a, 0x0c, 0xbc, 0xb7, 0xa5, 0xb8, 0x76, 0xa5, - 0x89, 0x53, 0x91, 0xfc, 0xc5, 0x25, 0xf0, 0xcf, 0xcc, 0xf6, 0x37, 0x29, - 0x5a, 0xa9, 0xe7, 0x29, 0x03, 0xf4, 0x13, 0x57, 0x85, 0xc0, 0x36, 0xff, - 0xfe, 0x5e, 0xe0, 0xf1, 0xc9, 0xc2, 0xf3, 0x32, 0x82, 0x85, 0x1a, 0x10, - 0x70, 0x0d, 0xcf, 0xaa, 0x3e, 0x7e, 0x5d, 0x8f, 0x2b, 0xf6, 0x18, 0xfc, - 0x36, 0xd0, 0x5d, 0x96, 0x53, 0xb2, 0xc1, 0xe8, 0x8f, 0x94, 0xd7, 0x65, - 0xe5, 0xb6, 0x11, 0x25, 0x62, 0x54, 0xad, 0xf4, 0x0b, 0x26, 0x4a, 0xba, - 0xc4, 0x1c, 0xc7, 0x72, 0xb5, 0xb1, 0xd3, 0x12, 0x31, 0x29, 0x22, 0x7b, - 0xb4, 0xb2, 0x3a, 0x42, 0xe1, 0x42, 0x68, 0x68, 0x6a, 0x67, 0x33, 0xec, - 0xaa, 0x2f, 0xb7, 0x34, 0xa7, 0xfe, 0xc5, 0x8c, 0x5d, 0xe8, 0x78, 0xfb, - 0x10, 0x9d, 0x22, 0x72, 0x81, 0x6a, 0x8c, 0x56, 0xbf, 0x59, 0x6e, 0x99, - 0xd2, 0x1d, 0x32, 0x1c, 0xe5, 0xe4, 0xb4, 0x10, 0x5b, 0xf7, 0xcd, 0x6c, - 0xb6, 0x88, 0x86, 0xa7, 0x04, 0x0b, 0x4f, 0x9b, 0x6e, 0x48, 0x24, 0x16, - 0xb8, 0x96, 0x3f, 0x02, 0x57, 0xc0, 0xac, 0x6e, 0x1e, 0xb4, 0xaf, 0x41, - 0xd7, 0x3d, 0x06, 0xca, 0x63, 0xd7, 0x5d, 0x49, 0xa8, 0xce, 0x59, 0x67, - 0x8a, 0x2c, 0xb8, 0x2d, 0x24, 0xbd, 0x39, 0x66, 0x89, 0x37, 0x4b, 0xf8, - 0x7d, 0xd3, 0x75, 0x87, 0x3b, 0x53, 0x1d, 0xd2, 0x0f, 0x68, 0x4b, 0xc2, - 0xaf, 0xe3, 0x39, 0xe2, 0xea, 0xe6, 0x96, 0x60, 0xfe, 0xf5, 0x92, 0x2c, - 0xaa, 0x0c, 0xd0, 0xc8, 0xdc, 0xdd, 0x14, 0x32, 0x28, 0x46, 0xc8, 0x34, - 0x05, 0x58, 0x5a, 0xbe, 0xc0, 0x0e, 0x09, 0xa8, 0x58, 0xe4, 0x5d, 0xaa, - 0x3e, 0xb0, 0x95, 0xa9, 0x58, 0x74, 0xd3, 0xad, 0x8b, 0x18, 0x36, 0x5b, - 0x87, 0xc7, 0x70, 0x1e, 0x67, 0x77, 0x31, 0xe7, 0xbf, 0x5a, 0xea, 0xf6, - 0xc7, 0x91, 0xc2, 0x90, 0x3d, 0xb6, 0x0a, 0x59, 0x5d, 0x98, 0x28, 0xf2, - 0xa5, 0x01, 0x0c, 0x92, 0xe5, 0x5c, 0x26, 0xa1, 0x32, 0xc9, 0xbb, 0x95, - 0x50, 0x90, 0xbd, 0x30, 0x94, 0x18, 0x79, 0x5c, 0x0a, 0x62, 0xe5, 0xcf, - 0xab, 0x58, 0x41, 0xbc, 0xcb, 0x82, 0x86, 0xac, 0x26, 0xf3, 0xec, 0x0a, - 0x5a, 0x4a, 0xb8, 0x80, 0x7d, 0x22, 0xdf, 0xf2, 0x01, 0xb8, 0xc1, 0x1c, - 0x4b, 0x21, 0xc8, 0x7b, 0x79, 0x2a, 0xf3, 0xaf, 0x66, 0xba, 0x2e, 0x80, - 0x93, 0x37, 0x41, 0xf4, 0x35, 0xdd, 0x53, 0x66, 0xe9, 0x39, 0xfa, 0x52, - 0x9b, 0x3d, 0x11, 0x38, 0x11, 0x76, 0x70, 0x92, 0x42, 0xbf, 0xd4, 0x35, - 0x28, 0x57, 0x66, 0x7a, 0x61, 0x53, 0xf6, 0x9d, 0x69, 0x40, 0xac, 0x63, - 0x32, 0x1f, 0x89, 0x0a, 0xf1, 0xd3, 0xfe, 0x55, 0xc9, 0x55, 0xc0, 0x66, - 0x48, 0x09, 0x5f, 0x75, 0xa6, 0xfe, 0xd7, 0x2f, 0x77, 0x7f, 0xc7, 0xcb, - 0xfb, 0xd1, 0x97, 0x79, 0xd7, 0x56, 0xdd, 0x73, 0x65, 0x4d, 0x1b, 0x6d, - 0x64, 0x5c, 0xc6, 0xd0, 0xc5, 0x07, 0x9d, 0xd8, 0x3a, 0xdf, 0xc7, 0x3d, - 0xd0, 0x4a, 0xc8, 0x41, 0xb5, 0x79, 0xd8, 0x55, 0x76, 0x89, 0xac, 0xd0, - 0x83, 0x45, 0x7e, 0x50, 0x17, 0x2e, 0xc7, 0xd2, 0xec, 0xf9, 0xa5, 0xce, - 0xce, 0xf6, 0x92, 0x7a, 0x7c, 0xa2, 0x7c, 0x3b, 0x0e, 0x27, 0xd5, 0x3a, - 0x84, 0x41, 0x99, 0x89, 0x97, 0xf3, 0x7a, 0x1a, 0x82, 0xd7, 0x33, 0xad, - 0x66, 0x84, 0xcc, 0x8d, 0xf6, 0xfa, 0x4b, 0x93, 0xd7, 0xce, 0x92, 0x03, - 0x06, 0xf7, 0x58, 0x73, 0x6d, 0x33, 0x72, 0x37, 0x2f, 0xb1, 0x26, 0xa6, - 0x36, 0x1c, 0x9e, 0x97, 0x2c, 0x6a, 0x4e, 0x87, 0x04, 0x9f, 0xd6, 0x43, - 0xcb, 0xbd, 0x80, 0x39, 0xe7, 0x45, 0x81, 0x74, 0x5b, 0x77, 0x87, 0x8d, - 0x86, 0x76, 0x0e, 0x21, 0x33, 0x01, 0x52, 0x29, 0x6f, 0xaa, 0xc9, 0xd3, - 0xbc, 0x71, 0xc8, 0xb2, 0xdd, 0xfd, 0x73, 0x05, 0xd9, 0x29, 0x17, 0x20, - 0xf2, 0x43, 0x28, 0x90, 0x44, 0xb5, 0x5f, 0xf6, 0xd4, 0x52, 0xf6, 0xb3, - 0x96, 0x7c, 0xd0, 0xc9, 0x04, 0xc8, 0x2b, 0x3e, 0x27, 0x62, 0xe2, 0xd6, - 0xa0, 0xcd, 0xe4, 0x20, 0x36, 0x8b, 0x3e, 0x7b, 0x5c, 0x49, 0xd5, 0xd1, - 0x0e, 0x59, 0xb0, 0x36, 0x13, 0x5b, 0x6b, 0x72, 0x66, 0x39, 0x02, 0xfc, - 0xb1, 0xb0, 0xab, 0x81, 0x73, 0x76, 0x5f, 0x94, 0xaa, 0x91, 0x99, 0xb7, - 0x36, 0x56, 0x7d, 0x6f, 0x1f, 0x6b, 0x1d, 0xce, 0xff, 0xcb, 0x55, 0x85, - 0x74, 0x12, 0x73, 0x30, 0x36, 0x17, 0x0c, 0xf2, 0xbd, 0x8d, 0x7b, 0xb9, - 0xca, 0xc9, 0x2c, 0x93, 0xb7, 0xb4, 0x5b, 0xe4, 0xfd, 0xf0, 0x1d, 0x54, - 0x93, 0x1b, 0xce, 0x36, 0xc2, 0x58, 0x36, 0x76, 0xbf, 0xac, 0x40, 0xbe, - 0x01, 0x4d, 0x71, 0x82, 0x5d, 0xa9, 0xd0, 0xfd, 0xdf, 0xee, 0x3f, 0x92, - 0x91, 0xee, 0xef, 0x7c, 0xbe, 0xa7, 0xd7, 0x8e, 0x3b, 0x7c, 0x16, 0xae, - 0x6f, 0xec, 0xfa, 0x37, 0x2f, 0x68, 0x52, 0x60, 0xcf, 0x9b, 0x55, 0x93, - 0xfd, 0xc3, 0x64, 0x3d, 0x4e, 0x06, 0x35, 0x04, 0xf3, 0x47, 0xe5, 0xef, - 0x3d, 0xca, 0xe6, 0x55, 0xa7, 0x4b, 0xf7, 0x20, 0xdb, 0x82, 0xaa, 0xb6, - 0x16, 0x8a, 0x1c, 0x2c, 0x69, 0xe4, 0x0b, 0xf7, 0xdb, 0x93, 0xaa, 0x67, - 0x0f, 0xbd, 0x95, 0x23, 0x7b, 0xff, 0x2c, 0xd1, 0xce, 0xee, 0xa9, 0xac, - 0x49, 0x60, 0xc1, 0x0e, 0x6f, 0x68, 0xc1, 0x1f, 0xa2, 0xa6, 0x3d, 0xec, - 0x42, 0xfa, 0x72, 0x12, 0xc1, 0x02, 0x36, 0xdf, 0x9a, 0x34, 0x37, 0xe7, - 0x64, 0xec, 0xbf, 0xb7, 0xa5, 0xd3, 0x74, 0xf0, 0x2b, 0x48, 0x1d, 0x5b, - 0x81, 0xcc, 0x70, 0x19, 0x5c, 0xb5, 0xf8, 0x26, 0x2f, 0xc9, 0x82, 0x36, - 0xaa, 0x64, 0xbd, 0x95, 0xe4, 0x81, 0xf1, 0x2e, 0x79, 0xae, 0x69, 0x24, - 0x2e, 0x35, 0xe7, 0x54, 0xc9, 0x41, 0x3a, 0xa6, 0x64, 0x7d, 0x16, 0x0b, - 0x7b, 0x74, 0x35, 0x6c, 0x5a, 0x83, 0x85, 0x97, 0xef, 0x17, 0xa6, 0xa5, - 0x0f, 0x06, 0x65, 0x5b, 0xfe, 0xd4, 0xcf, 0xd7, 0x39, 0x88, 0x9a, 0x9a, - 0x0c, 0xf7, 0xbf, 0x9b, 0xe8, 0x10, 0x8c, 0xba, 0xc4, 0x93, 0x77, 0x5c, - 0xf0, 0xa2, 0x1d, 0x55, 0x55, 0x27, 0x95, 0xce, 0xb1, 0x32, 0x24, 0x19, - 0x1c, 0xfa, 0x40, 0x4c, 0x30, 0x62, 0x09, 0x22, 0x4b, 0x2d, 0x8a, 0x95, - 0x4f, 0x1c, 0x6f, 0x46, 0xc4, 0x3f, 0xf7, 0x16, 0x43, 0x91, 0xb2, 0xd3, - 0x06, 0x6b, 0xc5, 0x4f, 0xef, 0xfa, 0x0e, 0x24, 0x4b, 0x75, 0x20, 0x01, - 0xc4, 0xec, 0x82, 0x0e, 0xb9, 0x08, 0xad, 0xfb, 0xbd, 0x6b, 0xfb, 0x18, - 0x27, 0x01, 0x9f, 0x76, 0x15, 0x27, 0x80, 0xec, 0x2c, 0x0c, 0xd3, 0xcc, - 0x82, 0x52, 0xa5, 0xa5, 0xc4, 0xe2, 0x73, 0x89, 0xff, 0xa3, 0xde, 0x8c, - 0x2e, 0x27, 0xff, 0x51, 0x75, 0x17, 0xba, 0xae, 0x78, 0x1c, 0xd5, 0x67, - 0x29, 0x5d, 0x44, 0x8f, 0x3a, 0xfa, 0x18, 0xc3, 0xe0, 0x77, 0xcd, 0x32, - 0x1b, 0x6c, 0xb4, 0xe2, 0x46, 0x28, 0x22, 0xd5, 0x24, 0x6d, 0xd4, 0xbb, - 0x3c, 0xf0, 0x88, 0x5f, 0x3e, 0x60, 0x2e, 0x13, 0xe5, 0xb4, 0x5a, 0x95, - 0x4f, 0xf5, 0x42, 0x58, 0x8d, 0x3f, 0xe3, 0x34, 0x5b, 0x1f, 0x2c, 0x71, - 0x05, 0x59, 0x70, 0x6b, 0xb1, 0x02, 0xa6, 0xdf, 0x53, 0x94, 0xc9, 0x15, - 0x1a, 0xe2, 0x94, 0x5d, 0x6c, 0xd5, 0x98, 0x84, 0x5c, 0x9f, 0x9f, 0xaf, - 0x53, 0xe0, 0xe4, 0xfb, 0x8c, 0xdb, 0x45, 0x71, 0x15, 0x38, 0xeb, 0x83, - 0x23, 0x96, 0xe4, 0x3a, 0x8c, 0xe7, 0xf6, 0x09, 0xd6, 0x0b, 0x07, 0xa1, - 0x25, 0xe6, 0x57, 0x59, 0x6d, 0x64, 0x95, 0x74, 0x63, 0x16, 0x4b, 0xba, - 0x84, 0x55, 0x85, 0x4a, 0xb2, 0x6f, 0x23, 0x9d, 0x0f, 0x20, 0x14, 0xd8, - 0x58, 0x32, 0xea, 0x6d, 0xa3, 0xf8, 0x71, 0xf8, 0x6f, 0x32, 0xdd, 0x69, - 0xb3, 0x2b, 0x6f, 0xf0, 0x67, 0x6f, 0xae, 0xd4, 0x70, 0x6e, 0x9f, 0x9e, - 0x1e, 0xbf, 0x38, 0x1e, 0xcd, 0x78, 0x1d, 0xab, 0xc1, 0x58, 0xb6, 0x9f, - 0xba, 0xbe, 0x49, 0x72, 0x1e, 0x4d, 0x45, 0x8f, 0x7a, 0xd4, 0xcf, 0xe3, - 0xff, 0x76, 0x99, 0xd9, 0x8a, 0x37, 0xe8, 0x46, 0x21, 0xe5, 0x19, 0x27, - 0x4a, 0x89, 0x27, 0xfe, 0x04, 0x5d, 0xa7, 0xc0, 0x82, 0x9d, 0x52, 0x80, - 0x21, 0x9d, 0xf3, 0x18, 0x57, 0x86, 0xd8, 0x17, 0x25, 0x15, 0xce, 0x92, - 0x00, 0x13, 0x69, 0xd7, 0x94, 0x95, 0x9d, 0x73, 0xd6, 0x7a, 0x6c, 0x89, - 0x9f, 0x4a, 0xc8, 0x2d, 0x82, 0xcb, 0x38, 0xd2, 0xd3, 0xc3, 0x4c, 0xce, - 0xd6, 0x0d, 0xd5, 0x37, 0xd2, 0xee, 0x87, 0xc3, 0xe1, 0xaf, 0x09, 0x0b, - 0x98, 0x58, 0x87, 0xb1, 0x7e, 0x36, 0xe8, 0xb5, 0x8a, 0xf1, 0xd7, 0x22, - 0x26, 0x69, 0x25, 0x2a, 0xc0, 0x2b, 0x82, 0xe7, 0x57, 0x73, 0x72, 0xe4, - 0x20, 0x61, 0xd0, 0x63, 0x92, 0xb9, 0x74, 0xd9, 0x7b, 0x02, 0x48, 0x13, - 0x7b, 0x9a, 0xbd, 0x9b, 0xc5, 0xc7, 0xcc, 0xb4, 0xc6, 0x7d, 0x06, 0x44, - 0x37, 0x81, 0x4b, 0x62, 0xf9, 0xef, 0xbe, 0xa9, 0xdf, 0xd7, 0x5d, 0xf3, - 0xce, 0x14, 0x8f, 0x7e, 0x82, 0xb3, 0xd3, 0xcd, 0x06, 0x03, 0x40, 0xc9, - 0x26, 0x8e, 0x53, 0xd2, 0x13, 0x5e, 0x21, 0xaf, 0x88, 0xa9, 0xd3, 0x18, - 0x28, 0x32, 0x02, 0xf9, 0x9f, 0xff, 0xbf, 0x60, 0x9e, 0x15, 0xf3, 0x47, - 0x4c, 0x0e, 0x40, 0x33, 0x1f, 0xe8, 0xbb, 0x71, 0xd9, 0xf0, 0x6a, 0x2c, - 0xaa, 0x37, 0x12, 0xb8, 0xa8, 0x52, 0xb7, 0x3f, 0xf6, 0xb0, 0x80, 0x5f, - 0x1a, 0x39, 0x44, 0xc7, 0x02, 0x59, 0x74, 0x9d, 0xc3, 0x8b, 0x20, 0xb8, - 0xb1, 0xac, 0x1b, 0xf2, 0x14, 0x5c, 0xba, 0x6c, 0x34, 0xb2, 0x67, 0x21, - 0x6d, 0x76, 0x7a, 0x66, 0xe0, 0x78, 0xe1, 0xb8, 0x6c, 0xb4, 0xcd, 0x70, - 0xc7, 0xb1, 0x35, 0xd1, 0x07, 0x0c, 0x6c, 0x56, 0x90, 0xbf, 0xe9, 0xc8, - 0x93, 0x7c, 0x7f, 0x9b, 0xff, 0x9f, 0xb3, 0x0a, 0xcf, 0xe5, 0x84, 0xd0, - 0xe4, 0xc6, 0xb2, 0x3a, 0xe4, 0xd6, 0x47, 0xc1, 0x2b, 0x7f, 0x9c, 0x43, - 0x61, 0x79, 0x73, 0xe8, 0xdf, 0x77, 0xb6, 0xa3, 0xc5, 0xed, 0xa1, 0x80, - 0x98, 0xf9, 0x5a, 0x08, 0xd6, 0xf5, 0x69, 0x03, 0xe9, 0x99, 0x7d, 0x48, - 0x11, 0xfc, 0x6f, 0x77, 0x3c, 0x2a, 0x4e, 0xe1, 0xc7, 0x8b, 0xd4, 0xe0, - 0xa6, 0x2a, 0x18, 0x91, 0xa8, 0x43, 0x63, 0x39, 0xea, 0xe3, 0xcb, 0x27, - 0xfc, 0x88, 0x67, 0xd9, 0x90, 0xa5, 0xa8, 0x75, 0xb8, 0x96, 0x6a, 0xe3, - 0x20, 0x44, 0xef, 0xf1, 0xc7, 0x3a, 0xfc, 0x7e, 0xbd, 0xbc, 0x1e, 0x72, - 0x07, 0xca, 0x22, 0xb5, 0xd6, 0x97, 0x8b, 0x9f, 0x40, 0x5c, 0x9c, 0xaa, - 0x31, 0xec, 0xe8, 0xa5, 0x91, 0x26, 0xc2, 0x93, 0x63, 0xc7, 0xa0, 0x84, - 0x54, 0x81, 0x4a, 0x5b, 0x91, 0x10, 0x6c, 0xfe, 0xf8, 0x3c, 0xe7, 0x26, - 0x87, 0x96, 0x0c, 0xfd, 0x45, 0x4f, 0xb9, 0x6d, 0x5e, 0x64, 0xfa, 0xf7, - 0x75, 0xda, 0x9b, 0xb7, 0x72, 0x7d, 0xab, 0x70, 0x65, 0xa4, 0x6a, 0xbc, - 0x0f, 0x98, 0xf2, 0x52, 0x28, 0xc7, 0x1c, 0x86, 0x7c, 0x4b, 0x0e, 0x4a, - 0xb7, 0x5a, 0x36, 0x49, 0x91, 0x54, 0x63, 0x45, 0xf5, 0x94, 0xd7, 0xb4, - 0x51, 0x88, 0x8d, 0xbf, 0xd6, 0x8d, 0xac, 0xc4, 0xb5, 0xc0, 0x64, 0x7e, - 0x75, 0x1d, 0x80, 0xdc, 0x90, 0x40, 0xf4, 0xa2, 0x65, 0xdb, 0xe3, 0x55, - 0x4e, 0xed, 0x95, 0x2e, 0xa7, 0x9c, 0x71, 0xe2, 0xfa, 0x3a, 0x56, 0x72, - 0x05, 0x08, 0x98, 0xd8, 0x10, 0x0b, 0x8c, 0x4d, 0x68, 0x68, 0x29, 0x64, - 0xb2, 0x60, 0x09, 0x27, 0x83, 0x05, 0x8b, 0xb2, 0x8f, 0x94, 0x7b, 0xb6, - 0xc4, 0xd2, 0x22, 0xba, 0x71, 0x78, 0xb4, 0x23, 0xdc, 0x7e, 0xc6, 0xb3, - 0xd7, 0x04, 0x47, 0x1e, 0x05, 0x1d, 0xb3, 0x12, 0xa9, 0x00, 0xed, 0xe5, - 0x89, 0x45, 0x7b, 0xb2, 0xf3, 0x45, 0x2b, 0x21, 0xa7, 0x4d, 0x3f, 0x63, - 0xb9, 0x0a, 0x5a, 0x5a, 0xa8, 0x73, 0x71, 0x30, 0x44, 0x04, 0xab, 0x9d, - 0x5a, 0xf4, 0xf0, 0xdc, 0xe0, 0x8b, 0xe4, 0xdf, 0x22, 0xc9, 0x99, 0xca, - 0x96, 0x2e, 0x62, 0xe7, 0x88, 0x93, 0xbf, 0x4b, 0x04, 0xd7, 0x10, 0xf4, - 0xe9, 0xbe, 0x1d, 0xf5, 0x82, 0x27, 0x20, 0x4d, 0x2c, 0x69, 0xc6, 0xd8, - 0x4b, 0xa6, 0xe8, 0xef, 0xbe, 0xb1, 0x0a, 0x94, 0xae, 0x09, 0x7c, 0xaa, - 0x06, 0x7f, 0xed, 0x9c, 0xbe, 0xf4, 0x3a, 0xc2, 0xd9, 0x62, 0xda, 0xdf, - 0x97, 0xe5, 0x00, 0x45, 0x2d, 0x78, 0x2b, 0x8d, 0xf4, 0xb8, 0x82, 0x87, - 0x7e, 0x8b, 0xe8, 0x27, 0xd5, 0x8b, 0xa6, 0x72, 0xa0, 0x16, 0xaf, 0x9e, - 0xf0, 0x61, 0x48, 0x28, 0x73, 0xb2, 0x9f, 0x9a, 0xf5, 0xc7, 0x4e, 0x5d, - 0xf0, 0x22, 0xeb, 0xff, 0xcb, 0xb9, 0x1a, 0xee, 0x4b, 0x8e, 0xfe, 0xb7, - 0xf5, 0xa6, 0x47, 0xad, 0x12, 0x35, 0x7c, 0x6f, 0x9a, 0xa8, 0xc1, 0x1c, - 0xda, 0x42, 0x5a, 0x91, 0x47, 0x02, 0xea, 0x00, 0x02, 0x33, 0x13, 0x01, - 0x78, 0x96, 0x9a, 0xb7, 0x87, 0xb8, 0xa3, 0x04, 0xdb, 0x94, 0x46, 0x2e, - 0xa5, 0xa9, 0x5e, 0x00, 0x62, 0x68, 0x50, 0x03, 0x3c, 0x55, 0x02, 0xd6, - 0x1c, 0xab, 0xda, 0x21, 0x6d, 0x08, 0xc2, 0x9a, 0x0c, 0x90, 0xa1, 0x7d, - 0xff, 0x8e, 0xec, 0x6c, 0x54, 0x6b, 0x1b, 0xfc, 0x10, 0xb2, 0xde, 0x8b, - 0xe5, 0x28, 0xc4, 0xcc, 0xdf, 0x72, 0xb6, 0xeb, 0xdd, 0x5f, 0x2a, 0xbf, - 0x53, 0xcf, 0x94, 0xed, 0x43, 0xc8, 0x19, 0xf4, 0x89, 0x9d, 0xb0, 0xc4, - 0x74, 0xef, 0x97, 0x96, 0x4d, 0x01, 0xd5, 0xc1, 0x5f, 0x27, 0xc5, 0x54, - 0xcd, 0x97, 0xca, 0xef, 0x46, 0xa2, 0xf0, 0x94, 0x4f, 0xd6, 0x4f, 0x16, - 0x25, 0xd4, 0x34, 0xd2, 0x4c, 0xa9, 0x88, 0xc1, 0x54, 0xaa, 0xa0, 0x4d, - 0xb1, 0xef, 0x5c, 0x53, 0xb5, 0xed, 0x19, 0x98, 0x5c, 0xbd, 0x3d, 0x2d, - 0x07, 0xd4, 0x2a, 0xd4, 0x7a, 0x7a, 0x6e, 0xa7, 0xe9, 0x08, 0x70, 0xce, - 0xb2, 0x04, 0x7f, 0x89, 0xcf, 0x74, 0x7c, 0x31, 0xa5, 0x3a, 0x1b, 0x95, - 0x6f, 0xa1, 0x5a, 0x96, 0x5d, 0xdc, 0xfb, 0x62, 0xaf, 0xb3, 0xc9, 0x08, - 0xc7, 0x7c, 0x39, 0x75, 0x23, 0xfa, 0x32, 0x59, 0xc4, 0x8e, 0x05, 0xe2, - 0x51, 0x78, 0x50, 0x49, 0xb0, 0xf8, 0x8a, 0xa7, 0x74, 0x26, 0x98, 0x88, - 0x51, 0x18, 0xbc, 0x27, 0x21, 0x54, 0x75, 0x66, 0xbf, 0x27, 0xd0, 0xa2, - 0xcd, 0x0f, 0x54, 0x7e, 0x8a, 0x1b, 0xd7, 0xab, 0x8e, 0x19, 0xad, 0x7d, - 0xb1, 0x77, 0xb1, 0x8e, 0x86, 0x53, 0x78, 0xef, 0xad, 0xe5, 0x7c, 0x15, - 0x2b, 0x8f, 0xeb, 0xaa, 0x74, 0xb2, 0x8d, 0x93, 0x78, 0x12, 0x56, 0xa0, - 0xfc, 0x28, 0xcb, 0x58, 0xe7, 0xcd, 0xb7, 0xa5, 0x08, 0xd9, 0xe5, 0x4a, - 0x65, 0x1d, 0xe9, 0x0c, 0x7d, 0xcd, 0x0e, 0xf6, 0xfe, 0x59, 0x56, 0xe0, - 0xbb, 0x41, 0x47, 0xd4, 0x60, 0x9c, 0x47, 0xc1, 0x59, 0x92, 0x6d, 0x63, - 0xfe, 0xf8, 0x9b, 0x91, 0x52, 0x4c, 0xef, 0x55, 0x53, 0xad, 0xfb, 0xf7, - 0x60, 0xa1, 0xde, 0x9a, 0x83, 0xf1, 0x4e, 0x32, 0xe3, 0xf9, 0x03, 0xfb, - 0xfb, 0xcc, 0x3a, 0x7a, 0xc2, 0xe6, 0xaa, 0x77, 0xe3, 0xa5, 0x84, 0x0d, - 0xf4, 0x38, 0x16, 0x07, 0x72, 0x4b, 0x9a, 0xaa, 0x2a, 0x90, 0xc0, 0xb4, - 0xf2, 0x2b, 0x49, 0xc6, 0x94, 0xb0, 0xf8, 0xe6, 0x6b, 0xb9, 0xf2, 0x24, - 0xcb, 0x69, 0x84, 0x6b, 0x2b, 0xeb, 0x4a, 0x2f, 0x08, 0x40, 0xc8, 0x98, - 0x2b, 0x2a, 0xcd, 0x86, 0x36, 0x97, 0x17, 0xa5, 0x57, 0x38, 0x90, 0x3a, - 0xfe, 0x5b, 0xae, 0xd5, 0x3b, 0xfd, 0x74, 0x70, 0x1a, 0xd2, 0xaa, 0x19, - 0x06, 0x88, 0x29, 0xbf, 0x21, 0xbc, 0x44, 0x2b, 0xdd, 0xb3, 0x7b, 0x05, - 0x34, 0xfa, 0xaa, 0xdf, 0x20, 0x73, 0xcd, 0xf5, 0xbd, 0x8b, 0x30, 0xfa, - 0xb4, 0x8d, 0x45, 0x8a, 0xeb, 0xe8, 0xcb, 0x20, 0xa5, 0x55, 0x15, 0x37, - 0x3d, 0xd3, 0xe3, 0x88, 0x30, 0x09, 0xe3, 0x56, 0x1d, 0x4f, 0x07, 0xa4, - 0x2d, 0x53, 0x89, 0xab, 0xc7, 0xfd, 0xff, 0x1c, 0x47, 0xbb, 0x3a, 0xa5, - 0x55, 0xe1, 0xbe, 0x1d, 0x5b, 0x01, 0xd3, 0x69, 0x52, 0xb8, 0x80, 0x3c, - 0xc8, 0xe8, 0xd9, 0xfc, 0xa2, 0x50, 0xff, 0x57, 0xd4, 0x5c, 0xdf, 0xcc, - 0xed, 0x9d, 0x56, 0x27, 0xb6, 0x99, 0x0b, 0x1c, 0xde, 0x12, 0x71, 0x0d, - 0xe1, 0x54, 0xc3, 0xc3, 0x61, 0xc8, 0xea, 0x14, 0x1e, 0x90, 0x03, 0x7e, - 0xb1, 0x40, 0xfb, 0x03, 0xe2, 0x2d, 0xe0, 0x01, 0xba, 0x81, 0xb0, 0xc4, - 0xde, 0x50, 0x7a, 0xa2, 0x5f, 0x65, 0x68, 0xcb, 0x9e, 0xd3, 0x85, 0x36, - 0x09, 0xc6, 0xb0, 0xa0, 0x2a, 0xac, 0x1b, 0x3c, 0xdf, 0x22, 0x23, 0x22, - 0x70, 0x8d, 0x5b, 0xc6, 0x2b, 0x7f, 0xf1, 0x96, 0xca, 0xa9, 0x9b, 0x9a, - 0x35, 0xc0, 0xf7, 0xe7, 0x1d, 0xc8, 0x4a, 0x50, 0x01, 0x91, 0x17, 0xcd, - 0xf9, 0xd4, 0x7e, 0x82, 0xf1, 0xd7, 0x30, 0xe9, 0x4c, 0xad, 0xb2, 0xbc, - 0x6c, 0x61, 0xd2, 0xcf, 0x7d, 0x17, 0x1c, 0xf3, 0x43, 0x0f, 0x7e, 0x5f, - 0xf5, 0x70, 0x15, 0x8d, 0x76, 0xb2, 0xa0, 0x21, 0xf9, 0xd1, 0xac, 0x68, - 0x14, 0xf6, 0x8b, 0x96, 0x43, 0xac, 0xb0, 0xfa, 0x3d, 0xb2, 0xd9, 0x93, - 0xa2, 0x70, 0x13, 0x32, 0x38, 0x53, 0xac, 0x48, 0xeb, 0x3b, 0x22, 0xfd, - 0xe9, 0xf4, 0xb8, 0xba, 0xad, 0xf4, 0x40, 0xd5, 0x40, 0xe3, 0xd8, 0x5c, - 0x61, 0x30, 0x34, 0x58, 0x4a, 0xf2, 0xca, 0x98, 0x33, 0xa6, 0x3c, 0x77, - 0x82, 0x9d, 0x8f, 0x23, 0xb6, 0x29, 0xde, 0x39, 0x6b, 0xb2, 0xa0, 0xe4, - 0xbc, 0x67, 0x55, 0xd5, 0xda, 0x3d, 0x6f, 0x31, 0xf2, 0x5b, 0x09, 0x78, - 0x4b, 0x53, 0x0c, 0x2f, 0x35, 0x3c, 0x8e, 0x64, 0x8c, 0x47, 0x9a, 0x35, - 0x6b, 0x7a, 0x7e, 0x1c, 0xc8, 0x79, 0x5f, 0x37, 0x18, 0x3d, 0x01, 0x21, - 0x48, 0xfa, 0xbe, 0x7f, 0xed, 0x95, 0xa0, 0x81, 0x97, 0x03, 0xb1, 0x54, - 0x94, 0xc8, 0x3b, 0x9a, 0x97, 0x75, 0x63, 0x33, 0x89, 0x8a, 0xd9, 0x1c, - 0x9f, 0x6a, 0x9f, 0xd0, 0x7e, 0xf1, 0x17, 0x32, 0x34, 0x82, 0x92, 0x2d, - 0xb5, 0x89, 0x35, 0xe1, 0xa7, 0xd6, 0x2d, 0x73, 0x53, 0x09, 0x6d, 0x72, - 0x6d, 0x0d, 0x16, 0x21, 0x05, 0x4d, 0x54, 0x39, 0x41, 0x88, 0x49, 0x05, - 0x7b, 0x5b, 0xb6, 0xb5, 0x59, 0x84, 0x39, 0x92, 0x5c, 0x66, 0xa7, 0xfc, - 0xd6, 0x91, 0xad, 0xdd, 0x99, 0x3f, 0xd5, 0xfb, 0x9e, 0x6f, 0xd2, 0x81, - 0x60, 0x71, 0x3a, 0xb1, 0x28, 0x56, 0xf2, 0xd7, 0x0e, 0x13, 0x05, 0xb4, - 0x8c, 0x9d, 0xab, 0x55, 0x1b, 0x7e, 0x6f, 0x17, 0x64, 0x43, 0x0a, 0x8a, - 0x0f, 0xc7, 0x00, 0xa0, 0x5e, 0x20, 0xe1, 0x88, 0x59, 0x93, 0x45, 0x5f, - 0xa0, 0x01, 0xdf, 0xa9, 0x3c, 0xbf, 0xfa, 0x86, 0x2e, 0x58, 0xf0, 0x82, - 0xc4, 0x61, 0x33, 0x29, 0x94, 0x3f, 0xcc, 0x91, 0xad, 0x44, 0x80, 0x0b, - 0xe5, 0xac, 0x34, 0xca, 0x0b, 0xfb, 0x31, 0x2c, 0xbd, 0x9d, 0xfa, 0x28, - 0xba, 0x2d, 0xc9, 0x48, 0x46, 0x72, 0x3b, 0xb4, 0x43, 0xaf, 0xdc, 0xb5, - 0xf7, 0x6b, 0x59, 0x8a, 0x0a, 0x62, 0xdc, 0x9c, 0x30, 0x4e, 0xf8, 0xa4, - 0x8a, 0x74, 0xa3, 0x95, 0x20, 0xdb, 0x5e, 0xd8, 0x26, 0xf2, 0x52, 0x70, - 0xef, 0x3b, 0xdf, 0xd0, 0x26, 0x2e, 0x70, 0xb2, 0xfe, 0x1b, 0xf8, 0xda, - 0x6f, 0x77, 0x1a, 0x7a, 0x11, 0x4f, 0x39, 0xb8, 0x8a, 0xa2, 0x8c, 0xb2, - 0xd8, 0x50, 0x2f, 0x96, 0xbb, 0xbd, 0xb2, 0xf8, 0xe3, 0x8a, 0xfb, 0x80, - 0x55, 0xc9, 0x27, 0xa0, 0x7f, 0x3b, 0x13, 0x5c, 0xed, 0xac, 0xef, 0xae, - 0xbd, 0x8d, 0xca, 0xd7, 0xe6, 0xb6, 0xf8, 0xf7, 0xfc, 0x07, 0x77, 0x9f, - 0xa4, 0x04, 0x9d, 0x02, 0xa0, 0x4a, 0x3f, 0x8e, 0x3a, 0x2b, 0xc1, 0xbd, - 0x0f, 0x39, 0xcb, 0x53, 0x0d, 0xe4, 0x5a, 0xea, 0x8c, 0xad, 0xa3, 0x97, - 0x55, 0xef, 0x79, 0x6c, 0xc2, 0x1c, 0xf4, 0x46, 0xa1, 0x5d, 0x44, 0x62, - 0xaa, 0x71, 0x8f, 0x4d, 0x67, 0x74, 0xb1, 0xd2, 0x04, 0x8f, 0xb0, 0x7a, - 0xa2, 0x0d, 0xf9, 0x14, 0x75, 0xa3, 0x13, 0x9e, 0x05, 0x92, 0x9d, 0x6d, - 0xe9, 0x16, 0xb3, 0x68, 0x5b, 0xa2, 0x5a, 0x73, 0x9f, 0x32, 0x43, 0x55, - 0x90, 0xc0, 0x30, 0xde, 0x84, 0x29, 0xa2, 0x07, 0xa6, 0xa1, 0x0f, 0xae, - 0x9d, 0x42, 0x1c, 0xbd, 0xa7, 0x7c, 0x34, 0x6d, 0x5e, 0xe8, 0x2a, 0xd1, - 0x05, 0x6e, 0x88, 0xe2, 0x0e, 0xc0, 0xff, 0x4d, 0xbb, 0x04, 0xd6, 0x3b, - 0x1f, 0x85, 0x1d, 0x0c, 0x27, 0xf8, 0x7b, 0xb0, 0x27, 0x77, 0xaf, 0xda, - 0x99, 0xe0, 0xbf, 0xca, 0x36, 0x0a, 0x64, 0xc4, 0xf5, 0x00, 0x21, 0x55, - 0x1b, 0x70, 0x91, 0x82, 0x1e, 0x59, 0x3f, 0xdc, 0xc7, 0x46, 0x8d, 0x7c, - 0x4d, 0xdc, 0x76, 0x19, 0x18, 0xe1, 0xbe, 0xaa, 0xda, 0xa6, 0x34, 0xa9, - 0x32, 0x8a, 0x18, 0xb5, 0x31, 0xe0, 0xaa, 0x3c, 0xc7, 0x06, 0xd4, 0x56, - 0xfd, 0x53, 0x9d, 0x43, 0x7f, 0xb9, 0xbf, 0x43, 0x99, 0x02, 0xc2, 0x99, - 0xd4, 0xd8, 0x2b, 0x14, 0xc3, 0x0d, 0x3b, 0xdc, 0x22, 0x8b, 0x89, 0xea, - 0x82, 0xd7, 0x89, 0xe4, 0xf2, 0xf4, 0x66, 0x50, 0xf6, 0x84, 0x84, 0x72, - 0x22, 0x77, 0xc7, 0x00, 0x36, 0x24, 0x47, 0x92, 0x4d, 0x5d, 0x2a, 0x9f, - 0x6f, 0xd9, 0x17, 0x1a, 0x80, 0xa6, 0xde, 0x2e, 0x98, 0xc2, 0xc9, 0xb7, - 0x81, 0xbb, 0x90, 0x37, 0x2b, 0x8b, 0x48, 0x99, 0x92, 0xd5, 0x1d, 0x17, - 0x25, 0xc3, 0x8c, 0x75, 0x6a, 0xb1, 0xa8, 0x16, 0x70, 0xe1, 0x52, 0x51, - 0x1f, 0x8a, 0xa0, 0x74, 0x1d, 0x00, 0x60, 0x7f, 0x94, 0x99, 0xdf, 0x3d, - 0x41, 0x50, 0x2d, 0x42, 0xf8, 0x4e, 0x6d, 0x2f, 0x57, 0xdf, 0xd1, 0xaa, - 0xab, 0x48, 0x47, 0x9e, 0xf7, 0xcb, 0x47, 0x25, 0x35, 0x07, 0xf6, 0x98, - 0x9f, 0x73, 0x37, 0x75, 0x23, 0xb9, 0xe6, 0x50, 0xde, 0x27, 0xb8, 0xe7, - 0x87, 0xb4, 0xd3, 0x2c, 0x91, 0x8d, 0x56, 0x63, 0x80, 0xc0, 0x00, 0x1b, - 0xa9, 0xc2, 0x55, 0x6c, 0x97, 0x0f, 0xb8, 0x4b, 0x69, 0xa8, 0x51, 0x1b, - 0x6f, 0xbb, 0x14, 0x65, 0x1a, 0x63, 0x04, 0x1c, 0x72, 0x27, 0xf1, 0xaf, - 0x4b, 0x61, 0x57, 0xd9, 0x4b, 0x82, 0xb2, 0xa0, 0x65, 0x07, 0x3b, 0x92, - 0x11, 0xa3, 0x87, 0xc0, 0xc1, 0x9b, 0x41, 0x8b, 0x5a, 0x81, 0xdf, 0x9a, - 0x95, 0x10, 0x9c, 0x5c, 0x30, 0xcd, 0xb3, 0xc6, 0xa5, 0xd6, 0x3f, 0xae, - 0xcd, 0x3c, 0x51, 0x3a, 0x38, 0xea, 0x9c, 0x28, 0xd3, 0x0a, 0x5d, 0xc6, - 0x95, 0x8c, 0x93, 0x5c, 0x86, 0x52, 0x8d, 0x2d, 0xd1, 0xa1, 0xf2, 0x4e, - 0x83, 0x5a, 0x2a, 0x32, 0xe4, 0xda, 0x16, 0xe1, 0xb1, 0xd9, 0x0c, 0x6e, - 0x50, 0x9d, 0x89, 0xb2, 0xc8, 0x3e, 0x1e, 0xa7, 0x3b, 0x1d, 0x06, 0x92, - 0x55, 0x58, 0x7d, 0x6b, 0x08, 0xfb, 0xf1, 0x28, 0x77, 0xe3, 0x0a, 0x35, - 0xce, 0x66, 0xb2, 0x6d, 0xe0, 0xfe, 0xc8, 0xf3, 0x4e, 0xae, 0x54, 0xa7, - 0xf2, 0x65, 0x07, 0x93, 0x6d, 0x07, 0xbb, 0x85, 0x5d, 0x8f, 0x81, 0x60, - 0xa9, 0x10, 0xa1, 0x46, 0x0f, 0x62, 0xea, 0x69, 0x7e, 0x8c, 0x7f, 0xfa, - 0x59, 0xd4, 0xd9, 0x09, 0xee, 0x17, 0xeb, 0x40, 0x69, 0x4c, 0xc1, 0x6b, - 0x56, 0x9d, 0xf0, 0xb8, 0x08, 0xbd, 0xed, 0x1c, 0xcd, 0x13, 0xbf, 0x45, - 0xc8, 0xb7, 0x29, 0x0b, 0x0d, 0xab, 0x3e, 0x40, 0x58, 0xc2, 0x7e, 0x54, - 0x6e, 0xc2, 0x09, 0x87, 0x1a, 0x2e, 0x36, 0xec, 0xcf, 0xd1, 0x34, 0x37, - 0xa0, 0x90, 0x82, 0xbe, 0x5e, 0x28, 0xf1, 0x9c, 0x16, 0x3a, 0xb7, 0x97, - 0xf1, 0x5c, 0x7a, 0x3b, 0x98, 0x8d, 0x0a, 0xaa, 0x45, 0x52, 0xcd, 0x69, - 0x68, 0x9f, 0xd5, 0x01, 0xf2, 0x06, 0x7f, 0x1c, 0xe2, 0x6b, 0xab, 0x31, - 0x85, 0x70, 0xa5, 0x3b, 0x01, 0x2a, 0x81, 0x12, 0x18, 0xd4, 0x84, 0x38, - 0xd7, 0xd3, 0x40, 0x35, 0x9b, 0x17, 0x9f, 0x2c, 0x3a, 0xf1, 0x24, 0x4f, - 0xfa, 0xa5, 0x2c, 0x22, 0x33, 0x18, 0xe5, 0xed, 0x8d, 0x23, 0x5e, 0xeb, - 0x90, 0xd1, 0xbb, 0xdd, 0xe0, 0xa4, 0x16, 0x0e, 0xdf, 0x5c, 0x13, 0xe4, - 0x8f, 0x86, 0xe4, 0x1e, 0x44, 0xa9, 0x6a, 0x72, 0x6f, 0xed, 0x91, 0xe0, - 0x24, 0x7f, 0x01, 0x37, 0x41, 0x97, 0xa2, 0x5e, 0x88, 0x02, 0x18, 0x2f, - 0x50, 0x79, 0xef, 0x1d, 0x02, 0x11, 0x84, 0x41, 0xf5, 0x8a, 0x88, 0x48, - 0x95, 0x6e, 0xb2, 0x55, 0xfe, 0x4d, 0x91, 0x57, 0x5f, 0xbc, 0xe3, 0x3f, - 0x60, 0x6b, 0x65, 0x40, 0xa6, 0xde, 0x6b, 0xd6, 0x37, 0x7f, 0xaa, 0x81, - 0xe0, 0x89, 0xcb, 0x00, 0x9f, 0x24, 0x47, 0x56, 0x09, 0x22, 0x72, 0xe5, - 0x5b, 0x89, 0x1e, 0x8a, 0x59, 0xef, 0xa2, 0x96, 0xaa, 0x01, 0x4c, 0x66, - 0xab, 0x5b, 0x6d, 0xc0, 0x11, 0xbc, 0x01, 0xc3, 0x1a, 0xd7, 0xdc, 0x15, - 0x53, 0xc5, 0x2b, 0x29, 0x13, 0x87, 0x32, 0xc5, 0x18, 0x9a, 0xb6, 0x95, - 0xaa, 0xc1, 0x1c, 0x56, 0x4d, 0x74, 0xd2, 0xe8, 0x0d, 0x27, 0x82, 0xb3, - 0xda, 0x74, 0xac, 0x03, 0x0f, 0xb7, 0xda, 0x26, 0xf6, 0xe5, 0xc0, 0x2a, - 0xf5, 0xef, 0x8d, 0xd4, 0x6c, 0x39, 0xa2, 0xaa, 0x2a, 0x8d, 0xb6, 0x16, - 0x11, 0x75, 0x7d, 0xb4, 0xab, 0x43, 0xcf, 0xdb, 0x2c, 0xcb, 0x20, 0xc5, - 0x31, 0x68, 0x21, 0x1a, 0x35, 0x2a, 0x01, 0x1a, 0xdd, 0x3b, 0x73, 0x1e, - 0x4e, 0x9d, 0x2b, 0xc0, 0xec, 0x5e, 0x85, 0x36, 0xd2, 0x2f, 0xad, 0xf5, - 0xb1, 0xac, 0x78, 0x25, 0xa8, 0xf0, 0xe3, 0x02, 0xec, 0xc9, 0x30, 0xdc, - 0xcf, 0x28, 0xc8, 0x4c, 0x6d, 0x74, 0x90, 0x94, 0x82, 0xc5, 0xdd, 0x85, - 0x7b, 0x94, 0x30, 0x83, 0xfb, 0x8c, 0x67, 0x64, 0xa1, 0x6b, 0x2d, 0xcd, - 0x21, 0x85, 0xfa, 0xe0, 0xd6, 0x57, 0x40, 0xf9, 0x89, 0x49, 0x8c, 0x7b, - 0x69, 0x60, 0xb7, 0xe1, 0x3e, 0x55, 0xf7, 0x02, 0x61, 0xf6, 0xc5, 0xd6, - 0xa9, 0x53, 0x74, 0xf1, 0x3f, 0x4e, 0x28, 0x19, 0x8a, 0x47, 0x4c, 0x43, - 0x36, 0x6f, 0xa3, 0x16, 0xae, 0xc6, 0x89, 0xba, 0x1c, 0x6e, 0xe6, 0x93, - 0x97, 0x42, 0xa2, 0x32, 0x06, 0x42, 0x3b, 0x42, 0x9a, 0x2c, 0xb7, 0xfb, - 0xa7, 0x64, 0xc8, 0xe3, 0x1c, 0x28, 0x76, 0xd2, 0x70, 0x04, 0x90, 0xdc, - 0x1c, 0x3d, 0x0b, 0xff, 0x9b, 0xb8, 0x30, 0x87, 0x82, 0xd8, 0x77, 0x0e, - 0x1f, 0x42, 0x90, 0x45, 0xf4, 0x70, 0x4b, 0x14, 0x7e, 0xbf, 0x2c, 0x78, - 0xc2, 0x1b, 0xa2, 0x97, 0x13, 0x7b, 0x97, 0xd1, 0xdd, 0x59, 0x21, 0x39, - 0x66, 0x8a, 0x17, 0xac, 0xd2, 0xda, 0xda, 0x66, 0x47, 0xa1, 0x13, 0xda, - 0xaf, 0x78, 0x3c, 0x6c, 0x16, 0x53, 0xbb, 0x00, 0xb3, 0xa7, 0x20, 0x32, - 0xe6, 0x4a, 0x40, 0x92, 0xbc, 0xc9, 0xa7, 0xa1, 0xd7, 0x11, 0x8d, 0x1d, - 0xfc, 0xf9, 0x46, 0x67, 0x09, 0x12, 0x0d, 0xa1, 0x91, 0x52, 0x9b, 0x3a, - 0xca, 0x09, 0x8c, 0x48, 0xb1, 0xe2, 0xbe, 0x33, 0x31, 0x03, 0xa8, 0x2c, - 0x87, 0x18, 0x8a, 0xa6, 0x8d, 0x7f, 0x2d, 0x4b, 0x18, 0xfc, 0xbb, 0xc0, - 0x04, 0x7f, 0x48, 0x70, 0x32, 0x6e, 0x9f, 0x9f, 0x1a, 0xf4, 0x8e, 0x77, - 0xc7, 0x88, 0xe6, 0x2c, 0xc6, 0xfd, 0x45, 0x21, 0x12, 0xef, 0x14, 0xee, - 0xb4, 0xf5, 0xa0, 0x1f, 0x34, 0xe8, 0xea, 0xc2, 0x61, 0xdb, 0x24, 0x00, - 0xad, 0x5f, 0x7e, 0x50, 0xf0, 0x3b, 0x0c, 0xd5, 0x57, 0x5b, 0xf5, 0x6a, - 0xdd, 0x06, 0x94, 0x68, 0xe2, 0x0b, 0xa0, 0xe1, 0xdc, 0xbc, 0x47, 0x71, - 0x2b, 0x28, 0x64, 0xbb, 0xe8, 0xca, 0x64, 0x4a, 0xe5, 0xdb, 0x38, 0xc6, - 0x6e, 0xdc, 0x10, 0x4c, 0xbd, 0xff, 0x4c, 0x1e, 0x97, 0x0b, 0x72, 0x75, - 0x22, 0x35, 0xfd, 0xc1, 0xc2, 0x51, 0x12, 0xfc, 0x23, 0xd9, 0x3b, 0x56, - 0x05, 0x04, 0xf3, 0x06, 0x5b, 0x88, 0x31, 0x16, 0x42, 0x21, 0x94, 0xca, - 0xf9, 0x9b, 0xef, 0x5e, 0xec, 0xf2, 0xd0, 0x37, 0x7c, 0xc0, 0xa3, 0x04, - 0x51, 0x50, 0x24, 0x09, 0x56, 0x5a, 0xff, 0x4b, 0x36, 0xfd, 0x62, 0x2d, - 0x05, 0x72, 0x07, 0x79, 0x6d, 0x84, 0xa5, 0x2f, 0x0b, 0x71, 0xcc, 0xb0, - 0x20, 0xfb, 0x13, 0x5a, 0x6c, 0xca, 0x4c, 0xda, 0x5a, 0xdc, 0x3c, 0x98, - 0x3f, 0x68, 0x34, 0x7c, 0x72, 0x03, 0xec, 0x42, 0x1a, 0x33, 0xb8, 0xbd, - 0x71, 0x53, 0xfa, 0x67, 0x2f, 0x83, 0x38, 0x96, 0xd9, 0x65, 0x58, 0xfe, - 0x67, 0xe4, 0xa4, 0x8a, 0x42, 0x20, 0xaa, 0xcc, 0xfd, 0x3e, 0x6b, 0x58, - 0xa7, 0x3c, 0x76, 0xae, 0x16, 0xd5, 0x16, 0x47, 0x7c, 0x79, 0xec, 0xc4, - 0xa3, 0xd6, 0x9a, 0x8a, 0x8d, 0x5f, 0x71, 0xf0, 0x22, 0x52, 0x70, 0xee, - 0x1f, 0x76, 0x57, 0xb2, 0x3f, 0xb2, 0xe5, 0x72, 0xe1, 0x2c, 0x4a, 0xe5, - 0xd2, 0x04, 0xea, 0xb1, 0xa1, 0xe6, 0xf1, 0x41, 0x94, 0x70, 0x7e, 0x76, - 0x57, 0xef, 0x86, 0x7e, 0x04, 0xf1, 0x2b, 0xb6, 0xed, 0x01, 0xa8, 0xe4, - 0x61, 0x0c, 0xb6, 0x91, 0xda, 0x8a, 0xe2, 0xce, 0xfe, 0x26, 0x05, 0x5c, - 0x73, 0x99, 0x02, 0xa4, 0x2b, 0xec, 0x3a, 0x47, 0x14, 0xae, 0x67, 0xc1, - 0x96, 0x27, 0x43, 0xf0, 0x6d, 0xd4, 0xb8, 0x42, 0xeb, 0x0c, 0x3e, 0xa8, - 0x29, 0xe4, 0x21, 0x57, 0x61, 0x00, 0x17, 0x15, 0x47, 0xf9, 0xb6, 0x78, - 0xeb, 0x4d, 0xa5, 0x81, 0xb8, 0x7e, 0x2b, 0xb5, 0x49, 0xe0, 0xc5, 0x9f, - 0x54, 0x1b, 0xe1, 0xec, 0x73, 0x34, 0x9d, 0x54, 0x78, 0x6c, 0x01, 0x3c, - 0x0d, 0x82, 0x90, 0xf3, 0xee, 0xe3, 0x37, 0xb3, 0x25, 0x72, 0xa0, 0x21, - 0xd4, 0x38, 0x0e, 0xdc, 0xd1, 0xc4, 0x99, 0xd0, 0x62, 0x07, 0x74, 0x82, - 0x29, 0x09, 0x86, 0x07, 0x90, 0xd4, 0x71, 0x85, 0xc7, 0x6b, 0x32, 0x80, - 0x24, 0x7a, 0x2d, 0xb5, 0xca, 0x77, 0x12, 0x84, 0x3c, 0x63, 0xf4, 0x92, - 0x33, 0x90, 0xdb, 0xba, 0x99, 0x9d, 0x74, 0x94, 0x40, 0xd9, 0xf1, 0xfe, - 0x43, 0xba, 0x04, 0xb0, 0x2e, 0x9b, 0xf1, 0x25, 0x5d, 0x5a, 0x3b, 0x10, - 0xf7, 0x5a, 0xea, 0x99, 0xb1, 0xac, 0x62, 0x37, 0x7f, 0xfe, 0x7e, 0xd6, - 0x5f, 0x5f, 0x5d, 0x8d, 0x3b, 0xf2, 0x70, 0x07, 0xd1, 0x61, 0x76, 0xc2, - 0x5b, 0xf3, 0xc8, 0x2f, 0xb5, 0xa5, 0x17, 0xcf, 0x41, 0x4a, 0x2c, 0x46, - 0xc7, 0xfd, 0xb4, 0x86, 0x19, 0x9b, 0xea, 0xca, 0x97, 0x27, 0xce, 0x80, - 0xab, 0x6e, 0x44, 0xe8, 0x24, 0xa8, 0x4c, 0x2c, 0x33, 0x69, 0xf2, 0x3a, - 0x66, 0x88, 0xf2, 0x40, 0x39, 0xe4, 0xb9, 0x15, 0xb4, 0xdf, 0xf1, 0x56, - 0x29, 0xfe, 0x81, 0xf4, 0x75, 0x6b, 0xcd, 0xa0, 0x01, 0x9e, 0x2f, 0xf4, - 0xda, 0x39, 0x50, 0xc2, 0x9e, 0x91, 0x10, 0xb4, 0x4d, 0xdb, 0xe4, 0xac, - 0x62, 0xa9, 0xc4, 0xa7, 0x86, 0x13, 0xf2, 0xf8, 0x1c, 0x7b, 0x65, 0x93, - 0x75, 0x13, 0x97, 0xe0, 0x54, 0x3a, 0xcb, 0x22, 0xaf, 0x40, 0xf6, 0xaa, - 0x80, 0x82, 0xf2, 0x95, 0x0b, 0x7d, 0x9f, 0xd3, 0x17, 0x11, 0xef, 0xa4, - 0x1f, 0x3b, 0x5a, 0x35, 0xb8, 0xc0, 0x7c, 0x81, 0xc9, 0x7f, 0x31, 0x0b, - 0x14, 0xdc, 0x42, 0xa3, 0xa8, 0xff, 0x13, 0x86, 0xf2, 0xd2, 0x08, 0x6c, - 0xdd, 0x7b, 0xea, 0x06, 0x60, 0x04, 0x4a, 0x80, 0x2d, 0x3f, 0x7b, 0x08, - 0xbe, 0x52, 0x05, 0x7c, 0xb7, 0xb0, 0x7e, 0x59, 0xdc, 0x07, 0x62, 0x6c, - 0xd4, 0x3d, 0x92, 0xe2, 0xdc, 0x5d, 0xd1, 0x84, 0xee, 0x59, 0xa7, 0x6f, - 0x2c, 0x5c, 0x17, 0x34, 0xd2, 0x85, 0x7f, 0xd6, 0x7a, 0x4e, 0x4d, 0x97, - 0x06, 0x33, 0xdc, 0x4e, 0x65, 0x90, 0x28, 0xb4, 0x3a, 0x05, 0xea, 0x70, - 0x1c, 0x62, 0x32, 0xab, 0x2c, 0x93, 0xf7, 0xf9, 0xe2, 0xa5, 0x6a, 0xcb, - 0xcc, 0x6e, 0xef, 0x53, 0x3d, 0x25, 0xb6, 0x4c, 0x86, 0xc3, 0xc1, 0xb7, - 0x89, 0x13, 0x0a, 0x74, 0xb7, 0x3b, 0x21, 0xf3, 0x21, 0xc0, 0xca, 0x42, - 0x77, 0xd4, 0x13, 0xfe, 0x61, 0x79, 0xe4, 0x72, 0x60, 0x1f, 0xfa, 0xa8, - 0xa8, 0xce, 0x12, 0xa1, 0x67, 0xf9, 0xb5, 0x95, 0xfe, 0xf7, 0x49, 0x31, - 0xa9, 0xb6, 0xc2, 0x32, 0xaa, 0x26, 0xcb, 0xde, 0x60, 0xfc, 0xf9, 0x87, - 0x23, 0x85, 0x9d, 0x5d, 0x84, 0x88, 0xeb, 0x63, 0xd5, 0x30, 0xcd, 0x80, - 0x68, 0x2c, 0x2e, 0x96, 0x5c, 0x5a, 0xa8, 0x59, 0x32, 0x4c, 0x23, 0x88, - 0xe0, 0x5c, 0x11, 0xe2, 0x27, 0x1a, 0x6e, 0x80, 0x4f, 0x49, 0x38, 0xbf, - 0x08, 0xcd, 0x33, 0xef, 0xa3, 0x16, 0x19, 0xc2, 0xd0, 0xa0, 0x4b, 0x24, - 0xfa, 0x58, 0x0f, 0x35, 0x9e, 0x6c, 0x34, 0xba, 0x59, 0xe0, 0x4c, 0xc1, - 0xf0, 0x75, 0x31, 0xd6, 0xf7, 0xd4, 0x7d, 0xb5, 0x80, 0x62, 0xe5, 0x34, - 0xaa, 0x1a, 0x7e, 0xe6, 0xd3, 0x41, 0x81, 0x59, 0xb8, 0xec, 0xe9, 0x55, - 0x87, 0x78, 0xb3, 0x64, 0xb5, 0xa1, 0x80, 0xf8, 0x4a, 0x61, 0x89, 0xec, - 0xbd, 0x36, 0x83, 0x68, 0xa9, 0xa8, 0xc4, 0xfa, 0x26, 0x96, 0x4f, 0xe4, - 0xb0, 0xdf, 0x32, 0x57, 0x68, 0xd0, 0xe5, 0x53, 0x4b, 0xdf, 0x24, 0xcf, - 0xef, 0x0e, 0x1d, 0xfb, 0xf3, 0xef, 0xd8, 0xc1, 0x94, 0xdd, 0x90, 0x3e, - 0x8a, 0x9e, 0x52, 0x1a, 0xde, 0xad, 0x6c, 0xaa, 0x50, 0xbb, 0xb5, 0xcd, - 0xdb, 0xd9, 0x0f, 0xb1, 0xf9, 0xb1, 0xa1, 0x34, 0x9c, 0x87, 0x7e, 0x26, - 0x11, 0x91, 0x17, 0x08, 0x3f, 0xcd, 0x3c, 0x9c, 0x15, 0x70, 0xc9, 0x61, - 0xa2, 0x84, 0x11, 0x73, 0xec, 0x52, 0x32, 0xdf, 0x9b, 0x51, 0xd3, 0x08, - 0x70, 0xf7, 0x17, 0x77, 0x7d, 0xbd, 0x3f, 0x5f, 0x17, 0x2e, 0x25, 0xaf, - 0x3a, 0x09, 0x77, 0x08, 0x19, 0xe1, 0xd8, 0x79, 0x51, 0x4a, 0x74, 0xb3, - 0xcc, 0xfa, 0x3d, 0x52, 0xfc, 0x33, 0x8c, 0x44, 0x99, 0xc8, 0xb4, 0xe0, - 0x7c, 0x50, 0x31, 0x63, 0xb6, 0x0e, 0x6b, 0x78, 0xf4, 0x41, 0xf1, 0x41, - 0x9f, 0xae, 0x5d, 0xc6, 0x55, 0x8b, 0x5c, 0xd5, 0x66, 0x39, 0xf4, 0x54, - 0xc5, 0xeb, 0xb4, 0x55, 0x48, 0xad, 0x20, 0xb6, 0x65, 0xca, 0xb6, 0xe5, - 0xad, 0x67, 0xe4, 0x05, 0x66, 0x5b, 0x28, 0xac, 0xed, 0x78, 0x05, 0xdc, - 0xde, 0x12, 0xcf, 0x15, 0x89, 0xf9, 0x16, 0x50, 0xb6, 0xf8, 0x71, 0xf2, - 0xbb, 0x45, 0x4b, 0xb3, 0xdd, 0x50, 0xe5, 0x24, 0x4b, 0x30, 0x8c, 0x7f, - 0x23, 0xc5, 0x45, 0x06, 0x41, 0xcb, 0xab, 0x33, 0x92, 0x29, 0x84, 0xa1, - 0x6d, 0x7a, 0xba, 0x0f, 0xcd, 0x15, 0x11, 0x59, 0xaa, 0xd0, 0x5a, 0xb6, - 0x49, 0x38, 0x12, 0x96, 0x1c, 0x1a, 0x5c, 0x4e, 0xfa, 0x04, 0xd9, 0xff, - 0xe3, 0x94, 0xa1, 0xff, 0xe0, 0x01, 0x80, 0x0b, 0xc2, 0x12, 0x9a, 0x0e, - 0x9a, 0xcf, 0xef, 0xd7, 0xe8, 0xa5, 0xa3, 0xc5, 0x03, 0x71, 0xee, 0xd6, - 0xbf, 0x9c, 0x88, 0x43, 0x1c, 0xed, 0xb6, 0xb1, 0x8f, 0xfe, 0xe9, 0x24, - 0x4d, 0xd0, 0x29, 0x75, 0x7a, 0xd5, 0xff, 0x60, 0xda, 0x52, 0x82, 0x05, - 0xb1, 0x06, 0x7c, 0x79, 0x9e, 0x26, 0x0a, 0x68, 0xae, 0x5c, 0xbf, 0xf5, - 0xed, 0xf7, 0x76, 0xd5, 0xac, 0x3f, 0x24, 0xf2, 0xa0, 0xbc, 0x23, 0x21, - 0xa0, 0x29, 0xa1, 0x67, 0x22, 0x41, 0x69, 0x1b, 0x41, 0xc5, 0xae, 0xdc, - 0x2c, 0xe7, 0x26, 0x4a, 0x9c, 0x3f, 0x29, 0xe3, 0x1f, 0xd1, 0x0a, 0xc7, - 0x61, 0xd6, 0x21, 0x32, 0xde, 0xa3, 0xaf, 0x23, 0x08, 0x99, 0xc5, 0x6b, - 0x38, 0x09, 0xfc, 0x6b, 0xbb, 0x9f, 0x44, 0x03, 0xcc, 0xef, 0x50, 0x20, - 0x9b, 0x53, 0x56, 0x59, 0xe4, 0x8d, 0x34, 0xc6, 0x99, 0x23, 0x6a, 0x6e, - 0x45, 0x7b, 0x7a, 0x80, 0x17, 0x67, 0xcd, 0x34, 0x99, 0xef, 0xac, 0x70, - 0x4e, 0xd8, 0xe6, 0x55, 0x74, 0xa8, 0x90, 0x25, 0xdb, 0xe3, 0x2b, 0x17, - 0xdd, 0xc7, 0x45, 0xf9, 0xa9, 0x79, 0x15, 0xc8, 0xf2, 0x76, 0x5e, 0xb9, - 0x0b, 0x62, 0xa3, 0xa4, 0xdc, 0xbb, 0x49, 0xfb, 0xd7, 0xce, 0x6e, 0xeb, - 0xd2, 0x8d, 0xa5, 0x09, 0xa9, 0x1e, 0x5d, 0x0b, 0x2a, 0x7d, 0x71, 0xee, - 0x39, 0x1a, 0x94, 0xff, 0x1b, 0xbd, 0xbf, 0xfe, 0xc5, 0xad, 0x21, 0x4b, - 0x7f, 0x9e, 0x83, 0x30, 0x81, 0x7f, 0x36, 0x10, 0xd3, 0x02, 0x22, 0xe7, - 0x6a, 0x5a, 0xee, 0xb1, 0x6a, 0x84, 0x72, 0xe4, 0x64, 0xe8, 0x5a, 0xfb, - 0x2e, 0x31, 0x2d, 0xb7, 0x8d, 0xaa, 0xad, 0xf5, 0x08, 0x52, 0xaf, 0x54, - 0x1f, 0x6b, 0x75, 0x02, 0x3a, 0x0e, 0xad, 0xc7, 0x3a, 0x95, 0x7d, 0x6e, - 0xd6, 0xdb, 0x81, 0x8f, 0x32, 0xab, 0x31, 0xb8, 0xc9, 0x0d, 0xbf, 0xfc, - 0xc9, 0x6a, 0xb2, 0xe1, 0x3d, 0x2f, 0xf7, 0x2b, 0xcc, 0x73, 0x87, 0x76, - 0xf8, 0xc5, 0xdc, 0xf0, 0x5d, 0x62, 0xe5, 0x09, 0xfa, 0x30, 0xc2, 0x1a, - 0x8c, 0xcd, 0x7c, 0xa7, 0x88, 0xd7, 0xf5, 0x34, 0x9c, 0x46, 0x7e, 0xec, - 0x37, 0xf0, 0x7b, 0x5d, 0x26, 0x11, 0x37, 0x1e, 0x04, 0x44, 0xa0, 0x14, - 0x5f, 0x40, 0x77, 0x3e, 0x2c, 0xd4, 0x57, 0x59, 0x57, 0x06, 0x05, 0x68, - 0x58, 0x91, 0x00, 0x34, 0xda, 0xb1, 0x38, 0x39, 0x42, 0x5a, 0x96, 0xe1, - 0x67, 0xd5, 0xbc, 0x9b, 0x35, 0x14, 0xef, 0x08, 0x9a, 0x5c, 0x07, 0x47, - 0x7a, 0x14, 0x3f, 0x02, 0x04, 0x3f, 0xd2, 0x7f, 0xad, 0x97, 0x79, 0x8d, - 0x51, 0x3c, 0x87, 0xa9, 0x3c, 0xee, 0x57, 0xc6, 0xd6, 0xc3, 0xf4, 0x32, - 0x26, 0x09, 0x6e, 0x80, 0x18, 0x11, 0x50, 0xcc, 0x20, 0xcf, 0x44, 0x7a, - 0x26, 0xdb, 0x46, 0xfb, 0xb5, 0x73, 0x50, 0xfe, 0xac, 0x4f, 0xe7, 0x0b, - 0x2e, 0xcc, 0x44, 0x01, 0x6d, 0x81, 0xc7, 0xed, 0xa4, 0x43, 0x49, 0x1e, - 0xd2, 0x85, 0x53, 0x5b, 0x18, 0xd9, 0xce, 0x9c, 0x68, 0x27, 0xa3, 0x5d, - 0xa2, 0x99, 0x24, 0x42, 0x03, 0xf1, 0x29, 0xcd, 0x40, 0x00, 0x4c, 0x3e, - 0x2e, 0x2f, 0x24, 0xd3, 0x4d, 0x41, 0xb7, 0xde, 0x25, 0x93, 0x7d, 0x4b, - 0x93, 0x61, 0x9a, 0x5e, 0xe4, 0x8d, 0x8f, 0x74, 0xa6, 0x19, 0xa1, 0x58, - 0x08, 0x01, 0x7c, 0xcc, 0x5c, 0xfd, 0x84, 0xa5, 0x7d, 0xd8, 0x1e, 0xa9, - 0x28, 0xef, 0x96, 0x20, 0xa7, 0xc1, 0xb4, 0xca, 0x02, 0xac, 0x60, 0xa4, - 0x49, 0xdb, 0x73, 0x93, 0x11, 0x82, 0xf5, 0x97, 0x2c, 0x27, 0xf4, 0x11, - 0x19, 0x09, 0xfa, 0xe6, 0x06, 0x58, 0xc4, 0x21, 0x77, 0x37, 0x7d, 0xda, - 0x6f, 0x62, 0xf4, 0x9d, 0x73, 0x8f, 0x59, 0x88, 0x30, 0x8b, 0x25, 0x5c, - 0x94, 0x99, 0x22, 0x94, 0xfd, 0x97, 0xb9, 0x44, 0x3d, 0xb9, 0x76, 0x83, - 0xa0, 0xb0, 0x58, 0x62, 0xfa, 0x5b, 0xcc, 0xc9, 0x45, 0x75, 0xbd, 0xe3, - 0x25, 0xa4, 0x33, 0xae, 0x69, 0x1e, 0x8c, 0x1e, 0x8f, 0x82, 0x46, 0xd4, - 0xf3, 0x7c, 0x3c, 0x9a, 0x25, 0x4a, 0xd8, 0xdd, 0x24, 0x9e, 0x92, 0xa0, - 0x4d, 0x67, 0x3f, 0x2e, 0xe8, 0xde, 0xbc, 0xf7, 0xca, 0x26, 0xc5, 0x3a, - 0xb4, 0x1a, 0x84, 0xee, 0x1c, 0x14, 0x00, 0x60, 0x68, 0x31, 0x46, 0xd5, - 0x9b, 0xca, 0xd0, 0x0a, 0x29, 0x70, 0xb2, 0xe8, 0xad, 0x25, 0xcf, 0xf1, - 0x6c, 0xd6, 0xd5, 0x6d, 0xab, 0xd6, 0x53, 0xe9, 0xeb, 0x2f, 0x8e, 0xca, - 0xe4, 0xb0, 0xe8, 0x67, 0xca, 0x4e, 0xfd, 0x46, 0x27, 0x11, 0xf5, 0x8b, - 0x1e, 0x74, 0x23, 0x09, 0x7f, 0x5f, 0xcc, 0x5d, 0x8e, 0x92, 0x69, 0x71, - 0x01, 0x1d, 0xf1, 0x34, 0xcf, 0xf4, 0x63, 0xd8, 0xfe, 0x45, 0xbc, 0x11, - 0xea, 0x8c, 0xa2, 0xea, 0x5d, 0x6c, 0x40, 0xb9, 0xee, 0x0e, 0x56, 0x62, - 0x09, 0xc8, 0x15, 0x49, 0x55, 0x53, 0x91, 0x89, 0x82, 0xf8, 0xbd, 0x26, - 0xf0, 0x9e, 0x0f, 0x91, 0xb8, 0xce, 0x85, 0x8c, 0x9f, 0x32, 0xee, 0x44, - 0xc3, 0xf4, 0x0a, 0x19, 0xae, 0x4b, 0x48, 0x80, 0xc9, 0xff, 0xdf, 0x54, - 0xfe, 0x24, 0x68, 0xcc, 0x72, 0xf5, 0x76, 0x5f, 0xd4, 0x78, 0x51, 0xba, - 0x2a, 0x57, 0xae, 0xed, 0xf4, 0xe3, 0xe6, 0x64, 0x14, 0xaf, 0x03, 0xf8, - 0xcc, 0xa8, 0x1d, 0x2b, 0xf4, 0x38, 0x14, 0x06, 0xfa, 0x64, 0x96, 0x49, - 0x0b, 0xea, 0x68, 0x5a, 0x13, 0xa6, 0x8d, 0xed, 0x61, 0x12, 0x11, 0x6f, - 0x62, 0x4c, 0xb0, 0x7e, 0x14, 0xd2, 0x35, 0xd8, 0xea, 0xb2, 0xda, 0xa6, - 0x8f, 0xe5, 0x68, 0xdd, 0x2a, 0xdf, 0x9f, 0x8c, 0x06, 0x96, 0xd0, 0xcb, - 0x74, 0x64, 0x0f, 0x33, 0x5e, 0xd6, 0x25, 0x5e, 0x8a, 0x0f, 0x68, 0xca, - 0x28, 0xae, 0x37, 0x67, 0xc2, 0x64, 0x0a, 0x66, 0x6e, 0xda, 0x30, 0xd3, - 0x9e, 0xcd, 0xe3, 0x8f, 0x70, 0x0f, 0x95, 0x84, 0xf8, 0x14, 0x25, 0x67, - 0x72, 0x68, 0x6e, 0x86, 0xc9, 0x30, 0xe6, 0x2b, 0x5a, 0xe7, 0x28, 0x4b, - 0x72, 0x03, 0xba, 0x37, 0xe6, 0x65, 0xd0, 0x40, 0x98, 0x9c, 0x8e, 0x80, - 0xf1, 0xef, 0x69, 0xd5, 0x8e, 0x27, 0xdf, 0x6d, 0x69, 0x19, 0xc5, 0x8c, - 0x0e, 0x27, 0x5a, 0xa4, 0x63, 0x65, 0xac, 0xcd, 0xd7, 0x16, 0xf7, 0x35, - 0x98, 0x2f, 0x64, 0x60, 0x99, 0x36, 0x83, 0x02, 0xde, 0xe9, 0x1a, 0x34, - 0x7a, 0x71, 0x54, 0xe3, 0x83, 0x63, 0x91, 0xa3, 0x89, 0xea, 0xc5, 0x44, - 0xad, 0x76, 0xbb, 0x67, 0x6c, 0x67, 0x72, 0x08, 0x26, 0xc8, 0x00, 0x94, - 0xfb, 0xe2, 0xdc, 0x46, 0xb2, 0xaa, 0x51, 0x75, 0xea, 0x58, 0x1f, 0xca, - 0xcc, 0x7f, 0xa5, 0x53, 0xc5, 0x0e, 0x19, 0x73, 0xbc, 0xa9, 0x94, 0xf3, - 0x7c, 0x3f, 0x88, 0x82, 0x09, 0x2d, 0x1a, 0x16, 0x48, 0x73, 0xea, 0x95, - 0x53, 0xa8, 0x61, 0x3e, 0x5e, 0x9b, 0x2a, 0xcf, 0x0a, 0xf3, 0x88, 0x28, - 0x0f, 0x58, 0xb7, 0x49, 0xf6, 0x5b, 0x7e, 0xe0, 0x95, 0xba, 0xc5, 0x5c, - 0xaf, 0xd2, 0x48, 0xbf, 0x3c, 0x9a, 0xc2, 0x16, 0x81, 0x9e, 0x35, 0x69, - 0x98, 0xa8, 0xd5, 0xe3, 0x13, 0xad, 0x7b, 0x6c, 0x91, 0x1c, 0x83, 0x51, - 0x87, 0x1d, 0x20, 0xbd, 0x94, 0x54, 0xfc, 0xac, 0xd6, 0x93, 0xf2, 0x87, - 0x2e, 0x64, 0x9c, 0x9e, 0x1f, 0x05, 0xe0, 0x3e, 0x32, 0x75, 0xc0, 0xc5, - 0x84, 0xf3, 0xc4, 0x48, 0x71, 0xd9, 0x10, 0x0f, 0x6e, 0xe3, 0x53, 0x16, - 0x10, 0x1f, 0xc1, 0x5d, 0x64, 0x11, 0x83, 0xaa, 0x61, 0x2d, 0x3b, 0x3f, - 0x1d, 0xab, 0xc6, 0x45, 0xab, 0xa3, 0x4f, 0x0a, 0x07, 0x72, 0x26, 0x2a, - 0x82, 0x0d, 0x1e, 0x9e, 0x9f, 0x9a, 0x1d, 0xed, 0x9b, 0x0d, 0x41, 0xdc, - 0xfe, 0x81, 0x9f, 0xf1, 0x96, 0x5d, 0x6c, 0x93, 0xf7, 0x7d, 0xb4, 0x09, - 0xe3, 0xe9, 0x89, 0x85, 0xa0, 0x85, 0x0d, 0x4d, 0x34, 0x40, 0x4a, 0x53, - 0x93, 0x9d, 0xd8, 0x27, 0x46, 0xd0, 0x55, 0x3f, 0xe5, 0x38, 0xb9, 0x34, - 0x70, 0xb1, 0xac, 0x9e, 0xc3, 0x4e, 0xf6, 0x69, 0xe7, 0x9b, 0x73, 0x6c, - 0xe9, 0x2c, 0x6e, 0x5e, 0x22, 0x0e, 0x91, 0x8c, 0x38, 0xfa, 0xed, 0x62, - 0xdb, 0x8e, 0xe4, 0x3c, 0x74, 0x41, 0x6e, 0x4c, 0xe2, 0x7c, 0x57, 0x1d, - 0x9f, 0xe4, 0x37, 0x84, 0xbd, 0x2e, 0xd1, 0x7a, 0xf2, 0x35, 0x5d, 0xbd, - 0xec, 0xcc, 0x1b, 0x60, 0x3d, 0x67, 0x6f, 0x23, 0x3d, 0x38, 0xf2, 0x21, - 0xb6, 0x78, 0x04, 0xdb, 0xc7, 0x89, 0x69, 0x59, 0x73, 0x4c, 0x65, 0xaf, - 0x9c, 0x96, 0x30, 0x9c, 0x1c, 0xbb, 0x50, 0x14, 0x6d, 0xd4, 0x67, 0x61, - 0x2e, 0x68, 0x90, 0x53, 0xfa, 0xcb, 0xf0, 0x09, 0xa7, 0xaf, 0x81, 0x34, - 0x5d, 0xba, 0x6e, 0x32, 0x7c, 0x2c, 0xf7, 0x6c, 0x3b, 0x58, 0x15, 0xa3, - 0xdb, 0xc2, 0xbd, 0x23, 0x37, 0x11, 0x50, 0xcf, 0x9a, 0x03, 0x39, 0x0c, - 0x2f, 0xee, 0xc7, 0x89, 0x48, 0x0e, 0x31, 0xb9, 0xfd, 0x7b, 0xb7, 0xc0, - 0xef, 0x51, 0x99, 0x65, 0x7c, 0x55, 0xcc, 0x6b, 0x9f, 0x72, 0x20, 0x59, - 0x7a, 0x12, 0xbe, 0x44, 0x9c, 0x5a, 0xee, 0xb3, 0x6a, 0x13, 0x29, 0x6d, - 0xce, 0xb3, 0x07, 0xd7, 0x5c, 0x2a, 0xb3, 0xd7, 0xa3, 0x46, 0x95, 0x9b, - 0x3d, 0xf7, 0x15, 0x4f, 0x56, 0x23, 0x22, 0xa5, 0x34, 0x1b, 0x60, 0x1e, - 0xa3, 0x49, 0x8e, 0x55, 0x92, 0x88, 0xc6, 0x2a, 0x58, 0x2e, 0x9c, 0xb6, - 0x78, 0x45, 0xd9, 0x21, 0x09, 0xe7, 0x9d, 0xa4, 0xcd, 0x9f, 0x88, 0x0b, - 0x0a, 0x0a, 0x1a, 0x08, 0xd2, 0x1b, 0x13, 0x00, 0xea, 0x10, 0xf8, 0x74, - 0x34, 0x96, 0x9c, 0x0d, 0x1d, 0x0d, 0x9e, 0x74, 0x6f, 0xee, 0xff, 0x4c, - 0x21, 0x71, 0x1a, 0xd5, 0x9f, 0x21, 0xc9, 0xf1, 0x59, 0x7a, 0x68, 0xeb, - 0xc6, 0xc6, 0x54, 0xfe, 0x23, 0x34, 0x03, 0xc0, 0xca, 0xbe, 0xa4, 0x34, - 0x5d, 0xc1, 0x8d, 0xec, 0xca, 0x70, 0x98, 0x91, 0xcb, 0xd8, 0x88, 0x92, - 0x64, 0x5d, 0xa9, 0x40, 0x15, 0x71, 0xff, 0x84, 0x79, 0xde, 0xa3, 0xa6, - 0xc3, 0x9c, 0xae, 0xb1, 0x17, 0xa6, 0x7a, 0x7a, 0x06, 0x23, 0x5c, 0xbb, - 0x5f, 0xe5, 0x48, 0x0b, 0x37, 0x38, 0x2f, 0x93, 0xf7, 0x4a, 0xfb, 0x48, - 0xbc, 0x06, 0x66, 0xbb, 0x4c, 0x96, 0x37, 0x76, 0xa8, 0x0c, 0x27, 0xaf, - 0x60, 0x34, 0xe6, 0x0e, 0x05, 0x8f, 0xe0, 0x79, 0x5e, 0x86, 0x81, 0x92, - 0x04, 0xa9, 0x71, 0x76, 0x35, 0x4e, 0x5a, 0x2f, 0x39, 0x37, 0x64, 0x76, - 0x89, 0x1e, 0x26, 0x0b, 0xdc, 0xc8, 0x0c, 0xda, 0x02, 0xd0, 0x6d, 0xc5, - 0xc3, 0x53, 0x1f, 0xae, 0xb9, 0xcd, 0x5c, 0xf5, 0xbc, 0x70, 0xfa, 0xf8, - 0x85, 0x08, 0xeb, 0xaf, 0x97, 0xd7, 0xb8, 0xf8, 0x7f, 0xd9, 0x8f, 0xe0, - 0x8f, 0x10, 0x53, 0xc8, 0x8f, 0x98, 0x3b, 0x26, 0x30, 0xd6, 0x52, 0xb9, - 0x15, 0x58, 0xec, 0x30, 0xe5, 0x38, 0x49, 0x90, 0x68, 0x5e, 0x71, 0x34, - 0x33, 0xa4, 0x55, 0xd1, 0x9f, 0xf7, 0xcc, 0x7a, 0xd4, 0xbf, 0x38, 0x29, - 0x27, 0xdc, 0xd2, 0x8c, 0x21, 0xc4, 0x53, 0x68, 0x81, 0x2c, 0x68, 0xc5, - 0x7e, 0x14, 0x0e, 0xc3, 0x21, 0xdc, 0xb1, 0xb8, 0x31, 0xc5, 0xac, 0x0c, - 0x29, 0x0c, 0xc5, 0x76, 0x0a, 0x65, 0xfc, 0x61, 0x7d, 0x9f, 0xd6, 0x64, - 0xa7, 0x97, 0x80, 0x20, 0x43, 0x77, 0xad, 0xdd, 0xb2, 0x89, 0x3d, 0x80, - 0xff, 0x10, 0x2d, 0xfe, 0x9d, 0xff, 0x98, 0xd2, 0x87, 0xb3, 0xa0, 0x58, - 0x7f, 0x7d, 0x2c, 0x97, 0x90, 0xab, 0x9c, 0xde, 0x65, 0x57, 0x18, 0x54, - 0x9a, 0x0d, 0x89, 0x79, 0x99, 0xce, 0x04, 0x00, 0xbb, 0xf8, 0x92, 0xc6, - 0x97, 0x5e, 0x1e, 0x58, 0x82, 0x67, 0x51, 0x1d, 0xf6, 0x0a, 0xee, 0x3e, - 0xa1, 0xde, 0x1c, 0xa1, 0xf1, 0x2c, 0x36, 0x49, 0x55, 0x42, 0xd7, 0xd6, - 0x91, 0x9b, 0x96, 0xaa, 0x54, 0xec, 0xf0, 0x1c, 0x34, 0x76, 0x7b, 0x72, - 0xf5, 0x1c, 0x07, 0x94, 0xf2, 0xf7, 0x26, 0x40, 0x37, 0x4c, 0x25, 0x59, - 0x07, 0xc2, 0x1c, 0xb6, 0xfb, 0xf1, 0xe9, 0x01, 0x07, 0x31, 0xae, 0x32, - 0xf7, 0xe8, 0xb7, 0xdb, 0x16, 0xe6, 0x89, 0x5b, 0xef, 0x3c, 0x4e, 0xd9, - 0xc0, 0x6f, 0xf4, 0x60, 0xf2, 0xe6, 0xfe, 0xb2, 0x31, 0x9c, 0x8d, 0xed, - 0x66, 0x83, 0x91, 0xbe, 0x62, 0x66, 0x69, 0x07, 0xf7, 0xdd, 0xb6, 0xdf, - 0x20, 0xa8, 0x19, 0x02, 0x04, 0x64, 0x0b, 0x87, 0x05, 0x0d, 0x6a, 0x3f, - 0xe6, 0x7f, 0x10, 0xf6, 0xb4, 0xf1, 0x62, 0x15, 0x6d, 0x2d, 0x09, 0x1b, - 0x34, 0x33, 0xe2, 0xe0, 0x89, 0xe2, 0x53, 0x57, 0xc8, 0xaf, 0xbb, 0x68, - 0x53, 0xa2, 0x58, 0x67, 0x9f, 0x32, 0x2b, 0x30, 0x46, 0xf5, 0x2b, 0xbd, - 0x63, 0x3a, 0x8b, 0x90, 0xa8, 0x7f, 0x20, 0x50, 0xd2, 0xc9, 0x91, 0x02, - 0x44, 0x0c, 0x5f, 0xa2, 0x2d, 0x94, 0x36, 0x66, 0xa6, 0x94, 0xd3, 0x0e, - 0x1a, 0xda, 0x50, 0x5b, 0x40, 0x4e, 0x1e, 0xe8, 0xfc, 0x4e, 0xd6, 0x1f, - 0x42, 0x65, 0x3f, 0x9e, 0xdd, 0xc8, 0x9d, 0x88, 0x03, 0xba, 0x9a, 0xff, - 0x24, 0xc7, 0xc3, 0xb2, 0xcd, 0x4c, 0x4e, 0xb9, 0xa8, 0x1b, 0xd6, 0x43, - 0xc6, 0x7d, 0xb2, 0xcc, 0xd0, 0x8c, 0xf6, 0x2a, 0x3c, 0x47, 0x37, 0xd5, - 0x6c, 0x5c, 0x07, 0x4e, 0xc4, 0xba, 0xa6, 0x11, 0x77, 0x27, 0x53, 0x25, - 0x94, 0xae, 0x13, 0xcc, 0xe3, 0x81, 0xda, 0xc8, 0x4b, 0x99, 0x86, 0x20, - 0x59, 0xd7, 0x67, 0xf6, 0xb6, 0x15, 0x67, 0x68, 0xe7, 0x6d, 0xd9, 0x3e, - 0x1e, 0xa7, 0x71, 0x45, 0x58, 0x27, 0xc5, 0xd5, 0x57, 0x7e, 0x20, 0xeb, - 0x10, 0xcf, 0x9c, 0x84, 0x7d, 0x18, 0xb3, 0xcf, 0x2a, 0x50, 0x88, 0x9d, - 0x9d, 0xbb, 0xca, 0x1f, 0x16, 0xde, 0x16, 0xe6, 0x9d, 0xde, 0x90, 0xe7, - 0x75, 0xf6, 0x29, 0x1b, 0x2e, 0xa9, 0x3b, 0x31, 0xcc, 0xd1, 0x25, 0x19, - 0x81, 0x28, 0x10, 0xec, 0xfb, 0xe1, 0xc4, 0x72, 0xd9, 0x32, 0x06, 0xd6, - 0x73, 0xa8, 0xbb, 0x2c, 0x1b, 0x2a, 0xa1, 0xff, 0x82, 0x4c, 0xa8, 0xce, - 0x68, 0xdc, 0xc1, 0x2b, 0x16, 0x8a, 0xf2, 0xda, 0x4a, 0x58, 0xe4, 0x0c, - 0x97, 0x5f, 0x59, 0x3a, 0xc4, 0xfa, 0x5c, 0x15, 0x58, 0xdb, 0x04, 0x12, - 0xf0, 0xe7, 0x0e, 0xc0, 0x95, 0x28, 0x9a, 0xc4, 0xb7, 0x73, 0x72, 0x3b, - 0x38, 0x5e, 0x62, 0x9f, 0x82, 0x2e, 0x24, 0xe9, 0x64, 0x8c, 0x88, 0xf0, - 0x8d, 0x57, 0xe0, 0x2a, 0xe5, 0xd8, 0x7c, 0x26, 0x2c, 0x4e, 0x8d, 0x3e, - 0x78, 0x9a, 0x8d, 0x14, 0xa8, 0x20, 0x1f, 0xa6, 0xe8, 0x90, 0xf3, 0x72, - 0x49, 0x92, 0x88, 0xac, 0xf1, 0x69, 0xe3, 0x32, 0xa0, 0xf0, 0x61, 0x73, - 0xf4, 0xfe, 0x89, 0xbf, 0xa3, 0x18, 0x09, 0x35, 0x21, 0x4f, 0x3f, 0x98, - 0xe4, 0xe4, 0x61, 0xfb, 0xc8, 0x97, 0xef, 0xc9, 0x21, 0x8a, 0x55, 0xe5, - 0x0c, 0xc5, 0xb6, 0xc5, 0x18, 0xe1, 0xdc, 0xad, 0x45, 0xe7, 0xb2, 0xf7, - 0x23, 0x87, 0x32, 0xb1, 0x2f, 0xf8, 0x1b, 0x26, 0x2d, 0x24, 0xd3, 0xb2, - 0x11, 0x81, 0x3d, 0x49, 0xb6, 0xa8, 0xc5, 0xf1, 0xd1, 0xaf, 0x58, 0x8d, - 0x63, 0x37, 0xc9, 0x34, 0xc1, 0xac, 0xa3, 0x80, 0x00, 0x7a, 0xf8, 0x0d, - 0x93, 0xa6, 0x16, 0x4a, 0x77, 0xd7, 0xc3, 0xcd, 0x6b, 0x5b, 0xa4, 0x39, - 0x57, 0x3c, 0xb3, 0x14, 0x7f, 0xd2, 0x4e, 0x85, 0x7e, 0x85, 0xb3, 0x7a, - 0xca, 0xad, 0x1b, 0xd9, 0xe8, 0x18, 0xbd, 0x14, 0xd3, 0x02, 0x43, 0x79, - 0x7a, 0x3e, 0xb6, 0x47, 0xfa, 0x52, 0xf1, 0xc7, 0xd2, 0xfd, 0x01, 0x91, - 0x98, 0xe6, 0xf7, 0x79, 0xe8, 0xa2, 0x09, 0x51, 0x6c, 0x7d, 0xa6, 0x65, - 0xbc, 0x71, 0xa5, 0x0b, 0xa5, 0xc7, 0xc5, 0x41, 0x73, 0xbb, 0xc9, 0x4d, - 0x30, 0xfd, 0x40, 0xdb, 0x73, 0x7a, 0xef, 0x39, 0x81, 0xa2, 0xce, 0xe9, - 0xcf, 0x5b, 0xba, 0x4d, 0x1c, 0xd2, 0xc9, 0xe7, 0x49, 0x89, 0xf6, 0x46, - 0x83, 0x08, 0x8c, 0x9c, 0xec, 0xef, 0xfa, 0xcf, 0x95, 0xd2, 0xe2, 0xd6, - 0x75, 0xb1, 0x41, 0x6a, 0x5c, 0x47, 0x50, 0x8a, 0x51, 0x81, 0x83, 0x33, - 0x99, 0x5c, 0xb4, 0xee, 0x03, 0x6e, 0x1e, 0xb2, 0x1a, 0xbe, 0x3e, 0x18, - 0x10, 0x21, 0xf9, 0xe3, 0xbb, 0xc8, 0xf8, 0x33, 0x96, 0x18, 0x12, 0x8c, - 0xa3, 0x7f, 0x88, 0x6c, 0xa3, 0x9b, 0x33, 0x02, 0xfa, 0xfd, 0x47, 0x15, - 0xa7, 0xc8, 0x6f, 0x8a, 0x6d, 0x97, 0x84, 0x07, 0x68, 0x4b, 0xcf, 0x51, - 0x2b, 0xc6, 0xea, 0x70, 0x9b, 0xeb, 0x9d, 0x0d, 0xd5, 0x1d, 0x2b, 0xcd, - 0xdb, 0xec, 0x60, 0x07, 0x6d, 0x06, 0x04, 0x61, 0xf1, 0x85, 0xdf, 0xe3, - 0x1e, 0x7a, 0x47, 0xe5, 0x5f, 0x05, 0x54, 0x1c, 0xff, 0x99, 0x36, 0x4c, - 0x08, 0xaf, 0x90, 0x36, 0x06, 0x9b, 0xea, 0x5f, 0x33, 0x14, 0xbd, 0x0c, - 0x28, 0x96, 0x59, 0x84, 0x45, 0x93, 0x0c, 0xd6, 0x3c, 0x5b, 0xd1, 0xc1, - 0x2f, 0x53, 0xb8, 0x84, 0x0b, 0x28, 0x7e, 0x21, 0x27, 0xaa, 0x94, 0x1c, - 0xe4, 0x56, 0xec, 0xd6, 0x30, 0x2f, 0x63, 0x69, 0xd3, 0xb4, 0x6c, 0x18, - 0xb9, 0x79, 0x0f, 0x76, 0x19, 0xf7, 0x71, 0xd7, 0x7d, 0x37, 0xa2, 0x3b, - 0xf2, 0x61, 0x94, 0xd2, 0x7c, 0x0f, 0xdd, 0x3e, 0xea, 0x55, 0x88, 0x86, - 0x4d, 0xd7, 0xbd, 0x66, 0x35, 0xa9, 0x37, 0x48, 0xc2, 0x48, 0x11, 0x9b, - 0x02, 0x1b, 0x81, 0x21, 0x6a, 0x36, 0x32, 0x12, 0x73, 0x72, 0x84, 0x2d, - 0x9f, 0x54, 0x20, 0xa5, 0x6e, 0x97, 0x60, 0xde, 0x4a, 0xfa, 0x16, 0xe5, - 0x54, 0x25, 0xd7, 0xec, 0xc8, 0x8e, 0x50, 0x3c, 0x16, 0x1f, 0x7c, 0xf7, - 0xb5, 0x01, 0xbc, 0x25, 0x84, 0x26, 0x6b, 0x18, 0x4e, 0x3b, 0xe3, 0xb7, - 0xd4, 0x6a, 0x54, 0xaf, 0x8b, 0xb9, 0xf0, 0x36, 0xcb, 0x9a, 0x92, 0x39, - 0x4b, 0x72, 0xf7, 0xe7, 0xfa, 0x50, 0x24, 0x22, 0x60, 0xe0, 0xdb, 0xcb, - 0x90, 0x7f, 0x33, 0x06, 0xf8, 0xf1, 0x0f, 0xbc, 0x95, 0xc9, 0x23, 0xd7, - 0x6d, 0xf8, 0xa3, 0xf9, 0xac, 0x9a, 0x98, 0x88, 0x67, 0x8f, 0x76, 0xce, - 0xd6, 0x28, 0xfe, 0x00, 0x98, 0x20, 0xe1, 0x67, 0x45, 0xea, 0xdb, 0x18, - 0x9c, 0x8a, 0x55, 0xc7, 0x2a, 0x06, 0x0d, 0xc5, 0xe2, 0xe9, 0x6d, 0x2b, - 0x0d, 0x98, 0x10, 0xc0, 0x0a, 0x0a, 0x20, 0xd7, 0x40, 0xc2, 0x1e, 0x46, - 0x4f, 0x9c, 0xf7, 0xcb, 0x15, 0xcb, 0xf8, 0xf4, 0x49, 0x1e, 0xcb, 0xd2, - 0xa5, 0x92, 0x36, 0x28, 0x08, 0x64, 0x24, 0x3c, 0x85, 0x7c, 0x7d, 0x09, - 0xcc, 0xb5, 0x59, 0xe4, 0x96, 0x86, 0xe5, 0xec, 0xad, 0xd5, 0x64, 0x11, - 0x47, 0xf6, 0x57, 0x84, 0x07, 0x79, 0xf1, 0xf0, 0x6d, 0x56, 0x8c, 0x54, - 0x27, 0xc5, 0x4c, 0x69, 0xa3, 0x8a, 0xb4, 0x75, 0x3c, 0xa6, 0x4d, 0x13, - 0x89, 0x46, 0x07, 0xec, 0xef, 0xf8, 0x40, 0x11, 0x20, 0x9c, 0x75, 0xa9, - 0x5b, 0xc2, 0x5c, 0x7e, 0xde, 0x49, 0x44, 0x7b, 0x82, 0x54, 0x7d, 0x35, - 0xca, 0x68, 0xd0, 0x80, 0x34, 0xc8, 0x80, 0x1f, 0x59, 0x30, 0xb7, 0x54, - 0xe5, 0x67, 0x64, 0x77, 0x80, 0x90, 0x87, 0x84, 0x3f, 0x1e, 0x93, 0x23, - 0x71, 0x6b, 0x28, 0x39, 0x07, 0xc4, 0xf0, 0x8c, 0xd2, 0x59, 0x64, 0x21, - 0x37, 0x1a, 0xa7, 0x6f, 0xb8, 0x62, 0x96, 0x5e, 0x1f, 0x8e, 0x19, 0x97, - 0x6e, 0xf0, 0x01, 0x61, 0xc3, 0x2f, 0x92, 0x72, 0xb0, 0x70, 0xf3, 0x23, - 0x08, 0xe6, 0xdb, 0xd9, 0x34, 0x4a, 0x81, 0x39, 0x10, 0x65, 0x5e, 0x97, - 0x95, 0x55, 0xe6, 0x7c, 0x5c, 0x85, 0x8a, 0xc3, 0xfe, 0xfb, 0x59, 0x88, - 0x3c, 0x13, 0x3a, 0x28, 0xb2, 0x34, 0xa7, 0x4c, 0x4e, 0x59, 0x42, 0x8e, - 0xf1, 0x83, 0xa4, 0xf2, 0x5a, 0xb9, 0x51, 0xd0, 0x11, 0x61, 0x2a, 0x60, - 0xf5, 0x01, 0x5e, 0x7d, 0xe7, 0x12, 0x97, 0x3f, 0x79, 0x13, 0x96, 0x6b, - 0xe8, 0x84, 0xff, 0xcf, 0xf4, 0xd3, 0x53, 0x87, 0x70, 0x8f, 0x13, 0xf7, - 0xa6, 0xb1, 0x42, 0x6c, 0x06, 0x4a, 0xe1, 0x62, 0x6c, 0x21, 0x96, 0x24, - 0x0a, 0x4b, 0xfe, 0x06, 0x2f, 0xd5, 0x4b, 0x41, 0xc1, 0x1e, 0x32, 0x61, - 0x2a, 0x34, 0x7b, 0x0d, 0x28, 0xa8, 0xd4, 0x70, 0xfc, 0xbe, 0x9c, 0x6d, - 0xdb, 0xf1, 0xbe, 0x31, 0x4a, 0x4d, 0x53, 0x89, 0x48, 0x7e, 0x2d, 0x2a, - 0x69, 0x4d, 0x49, 0x8a, 0x54, 0xcc, 0xc2, 0x80, 0xeb, 0x24, 0x51, 0x10, - 0xe6, 0xb9, 0x07, 0x73, 0x22, 0x8a, 0xed, 0x91, 0xc0, 0x98, 0x28, 0x99, - 0x7a, 0xc0, 0xc5, 0xac, 0xce, 0x78, 0x9c, 0x58, 0xf9, 0x86, 0xcf, 0xfa, - 0x87, 0x6c, 0xc8, 0x9c, 0xed, 0x1e, 0xa4, 0xdc, 0xa7, 0x78, 0x68, 0xbf, - 0x0e, 0x4c, 0xe4, 0xeb, 0xf6, 0x81, 0xab, 0xff, 0xcd, 0x73, 0x29, 0xdf, - 0xbd, 0xec, 0xf8, 0xc6, 0xec, 0xc9, 0x7c, 0x72, 0xf4, 0xbb, 0x77, 0xdd, - 0x9b, 0xd2, 0xfa, 0xe0, 0x47, 0xd2, 0x59, 0xdc, 0x82, 0x80, 0xa7, 0x11, - 0xd2, 0x27, 0x50, 0x07, 0x54, 0x22, 0x32, 0xd8, 0x92, 0x61, 0xa4, 0x6d, - 0x07, 0x90, 0xea, 0xd1, 0x7f, 0xa6, 0xcb, 0xb7, 0x25, 0xb2, 0x09, 0x69, - 0xa7, 0x34, 0xd2, 0xa9, 0xb2, 0x26, 0xd5, 0xd5, 0x3e, 0x17, 0x6c, 0x3e, - 0xfc, 0xa5, 0x0b, 0x24, 0x86, 0x6e, 0x24, 0xde, 0x18, 0xa1, 0x5e, 0x12, - 0xf7, 0x23, 0xb8, 0x30, 0xab, 0x63, 0x20, 0x36, 0x2e, 0xc9, 0x5d, 0x1c, - 0x12, 0xac, 0x57, 0x09, 0x23, 0x0b, 0x94, 0x07, 0xd4, 0xcd, 0x24, 0x66, - 0x0d, 0x6a, 0x47, 0x9e, 0xe0, 0x83, 0xca, 0xe7, 0x76, 0x87, 0x1a, 0x76, - 0xde, 0xe3, 0x63, 0x02, 0x63, 0x55, 0xc8, 0xf2, 0xd1, 0xc8, 0x26, 0x9b, - 0x75, 0x41, 0xff, 0x8f, 0xdd, 0x1a, 0xe5, 0x94, 0x96, 0xd5, 0x58, 0x93, - 0x3f, 0x26, 0xa1, 0xc2, 0x79, 0x9c, 0x64, 0xa8, 0xda, 0x11, 0x93, 0x8a, - 0xa9, 0x71, 0xaf, 0xa7, 0x5e, 0xf3, 0x16, 0xef, 0xff, 0xfd, 0x73, 0x52, - 0xd2, 0xc1, 0x17, 0xf9, 0x86, 0x07, 0xee, 0xc3, 0xa3, 0xe0, 0x54, 0xa9, - 0x0f, 0xee, 0x96, 0x38, 0xbe, 0xae, 0x90, 0x0f, 0x42, 0x74, 0x4b, 0x1d, - 0x70, 0x8d, 0x89, 0xbd, 0x49, 0xad, 0xed, 0x6d, 0x3b, 0x05, 0x8d, 0x1e, - 0x9a, 0x54, 0x55, 0x78, 0x7b, 0x89, 0x36, 0xe5, 0xd3, 0x25, 0xbe, 0xca, - 0xcd, 0xef, 0x8a, 0xb7, 0x0f, 0xec, 0x26, 0x94, 0x52, 0x24, 0xab, 0x92, - 0x2d, 0x81, 0x2d, 0xd2, 0x7a, 0xca, 0x51, 0x8b, 0x56, 0x7c, 0xfc, 0x91, - 0xde, 0x79, 0xa6, 0xde, 0xde, 0xd7, 0x8d, 0xc4, 0xd7, 0x2c, 0xc4, 0xb0, - 0x42, 0x1b, 0xbc, 0xa0, 0x6f, 0x1e, 0xe2, 0xa7, 0x61, 0xc5, 0x0c, 0xed, - 0x01, 0x2d, 0x48, 0xed, 0x56, 0xbe, 0x32, 0xc2, 0x08, 0x1e, 0x39, 0xa1, - 0x7f, 0xb4, 0x91, 0x66, 0x20, 0xe8, 0xaa, 0x4c, 0x27, 0xaa, 0x90, 0x0d, - 0x30, 0xb4, 0x7c, 0x0b, 0xa5, 0x70, 0xf6, 0x59, 0x29, 0xe2, 0xc2, 0x68, - 0x4a, 0xfb, 0x44, 0x21, 0x0a, 0x7c, 0x28, 0xe0, 0x92, 0x20, 0x8f, 0x45, - 0xc0, 0xed, 0x4b, 0x49, 0x3b, 0x63, 0x50, 0x6b, 0xc0, 0x9f, 0x11, 0x2a, - 0x77, 0xa3, 0xaa, 0xfd, 0xa6, 0xf0, 0xc5, 0x66, 0xef, 0x64, 0xb6, 0x40, - 0x86, 0x09, 0xba, 0x84, 0x46, 0x15, 0xee, 0x31, 0x9f, 0xf9, 0xd0, 0x96, - 0x2b, 0xc3, 0xfa, 0x6b, 0x09, 0xdf, 0x82, 0x24, 0x33, 0xbb, 0x15, 0x22, - 0xc7, 0x62, 0x24, 0xce, 0x91, 0x06, 0xc0, 0x7e, 0x94, 0xb9, 0x03, 0xa0, - 0x81, 0xcf, 0x13, 0x1d, 0xaf, 0x8a, 0xfc, 0x02, 0xe9, 0x85, 0x35, 0x0e, - 0x9a, 0x81, 0x2a, 0x1b, 0x01, 0x24, 0xa4, 0x82, 0xb6, 0x14, 0x20, 0x53, - 0xbe, 0x8d, 0x5f, 0x77, 0x67, 0x01, 0x38, 0x2d, 0x1e, 0x25, 0x6d, 0x7e, - 0xc5, 0xb2, 0x9a, 0xc1, 0x7e, 0x8f, 0xc9, 0xf1, 0xbb, 0x51, 0xee, 0x5c, - 0x54, 0x17, 0xfa, 0x1b, 0x20, 0xe1, 0x44, 0xc9, 0xad, 0xe2, 0x25, 0x79, - 0xba, 0x60, 0x7e, 0x5a, 0x53, 0x0c, 0xee, 0x99, 0x96, 0x4d, 0xd3, 0xc2, - 0x01, 0xa6, 0xc8, 0xde, 0x9a, 0x38, 0x73, 0x17, 0x83, 0x51, 0x49, 0x72, - 0xea, 0xc5, 0x3e, 0x4d, 0xf7, 0x9b, 0x71, 0x82, 0xed, 0xb0, 0x15, 0xc0, - 0x65, 0x04, 0xd6, 0x21, 0x45, 0x82, 0x51, 0x8a, 0x4c, 0x61, 0x43, 0xb1, - 0x1a, 0x4e, 0x97, 0x21, 0xf5, 0x23, 0x0c, 0x53, 0x71, 0x15, 0x0d, 0xcd, - 0x9a, 0xb7, 0x03, 0x85, 0x37, 0x1d, 0x28, 0x25, 0xee, 0x5e, 0xe6, 0x46, - 0x42, 0xcc, 0xcc, 0x3b, 0xfe, 0xfb, 0xa3, 0x6f, 0xae, 0xe6, 0x3d, 0x1c, - 0x51, 0x55, 0x32, 0xf5, 0xdb, 0xd7, 0x04, 0x51, 0x8b, 0x73, 0x09, 0x7c, - 0x07, 0x58, 0x71, 0xf2, 0x4c, 0x13, 0x59, 0x68, 0xad, 0xa0, 0x32, 0xe3, - 0xcd, 0xf1, 0xab, 0x25, 0xe6, 0x5c, 0xa2, 0x6f, 0x4e, 0x79, 0xe9, 0x4b, - 0x40, 0x53, 0xcf, 0x54, 0xe4, 0x36, 0x9c, 0x3d, 0xbb, 0xbf, 0xbe, 0x36, - 0xc9, 0x45, 0xa2, 0x63, 0x34, 0x21, 0x22, 0x33, 0xd9, 0xe5, 0x61, 0x4d, - 0x85, 0xba, 0xd8, 0x80, 0x68, 0xbf, 0xea, 0xb8, 0xdb, 0x5f, 0x2b, 0xa4, - 0x92, 0xe5, 0x41, 0x84, 0x65, 0xfe, 0x23, 0xbb, 0xa0, 0x02, 0x08, 0x75, - 0xbd, 0x2f, 0x2e, 0x7e, 0x9d, 0x7a, 0xee, 0x71, 0x3c, 0x60, 0x7a, 0xe9, - 0x6c, 0x95, 0x57, 0x5b, 0x89, 0xab, 0x3d, 0xa6, 0x8b, 0xda, 0xa7, 0x2f, - 0x2f, 0xba, 0x53, 0x9a, 0x35, 0xc3, 0x27, 0xd9, 0xbb, 0xe3, 0x58, 0x91, - 0xde, 0xa2, 0x3b, 0x18, 0x34, 0xeb, 0x54, 0x24, 0x8c, 0xf8, 0x1e, 0xe4, - 0x92, 0x73, 0xe6, 0x5c, 0xdd, 0xe1, 0xa0, 0xae, 0x88, 0x9b, 0x89, 0xf5, - 0xcb, 0x29, 0xdc, 0x72, 0xc1, 0xd4, 0x35, 0x48, 0x7c, 0xfc, 0xbc, 0x2a, - 0x5b, 0xd6, 0x92, 0x52, 0x3e, 0x8e, 0xc9, 0x50, 0xfb, 0xf9, 0x29, 0xf0, - 0x8c, 0x5e, 0xfe, 0x4c, 0x0d, 0x0e, 0x42, 0x35, 0xdc, 0x6e, 0xac, 0xf5, - 0xfe, 0x11, 0x85, 0xe3, 0x4a, 0x86, 0xb1, 0xc2, 0xe9, 0xab, 0x49, 0x98, - 0xfb, 0x17, 0xe8, 0x57, 0x46, 0x76, 0xfd, 0x60, 0x93, 0xc6, 0xac, 0x0e, - 0xdf, 0x90, 0xa5, 0xab, 0xa5, 0xfc, 0xed, 0x96, 0x15, 0xbc, 0x01, 0xc4, - 0x69, 0x4a, 0xd4, 0x6a, 0x3e, 0x9d, 0x3b, 0x4e, 0x74, 0x31, 0xab, 0xd2, - 0xc1, 0xfc, 0x0a, 0x9d, 0x93, 0x9c, 0x0f, 0x95, 0x7c, 0x30, 0xda, 0x14, - 0x0a, 0xea, 0x1f, 0xa3, 0x60, 0x23, 0xd1, 0xa9, 0xad, 0xa6, 0xc3, 0x81, - 0x1e, 0x7a, 0xf2, 0x36, 0xc4, 0xc7, 0xa4, 0x4a, 0x4a, 0x69, 0xda, 0x21, - 0x71, 0x1c, 0xec, 0x15, 0x65, 0xdd, 0xc8, 0xe7, 0x3e, 0xad, 0x63, 0x5e, - 0x22, 0x9d, 0x70, 0x9f, 0xdb, 0xff, 0x26, 0x32, 0x52, 0x41, 0x5c, 0xde, - 0x09, 0x3e, 0x03, 0x76, 0x70, 0x0c, 0x73, 0x02, 0xe2, 0x0c, 0xb2, 0x98, - 0xdb, 0x04, 0xfb, 0x94, 0xf6, 0xc8, 0xdf, 0x75, 0x20, 0xb2, 0x4d, 0x7e, - 0xfa, 0x36, 0xa6, 0x38, 0x89, 0x9d, 0xce, 0x3c, 0x3c, 0x19, 0xc3, 0x4a, - 0xdc, 0xbf, 0xa7, 0x51, 0x1e, 0xe1, 0x9d, 0xfb, 0xc3, 0xde, 0x30, 0x4c, - 0xad, 0x6f, 0xca, 0x3a, 0x21, 0x79, 0xfe, 0x17, 0x6a, 0x81, 0x8a, 0xa1, - 0xa5, 0x4c, 0x06, 0xdb, 0x78, 0xc8, 0x90, 0x96, 0x20, 0x88, 0xfe, 0xc8, - 0x43, 0x36, 0xd1, 0xc4, 0xf8, 0x59, 0xeb, 0x66, 0x5c, 0x2f, 0xfe, 0xf6, - 0x4a, 0xd5, 0x7c, 0xcc, 0x11, 0xa1, 0xf9, 0x06, 0x70, 0xf6, 0xe7, 0xb4, - 0x98, 0xb8, 0xfe, 0x8c, 0xb8, 0x78, 0x47, 0xbc, 0x91, 0x55, 0xf7, 0x55, - 0x3c, 0x08, 0x9c, 0x24, 0xf5, 0xca, 0x76, 0x3d, 0x6e, 0xf6, 0x84, 0x13, - 0x6c, 0xa9, 0x64, 0x3f, 0xf8, 0x4f, 0x08, 0x31, 0xd2, 0x3f, 0xd7, 0x9e, - 0x13, 0xd3, 0xeb, 0xf4, 0x8d, 0x41, 0xc4, 0xa2, 0x62, 0xfe, 0xb7, 0x11, - 0xce, 0x26, 0xf9, 0x07, 0x3c, 0xc5, 0xbe, 0x4c, 0xea, 0x5d, 0xf8, 0x47, - 0x6e, 0x12, 0x23, 0x05, 0x7c, 0xcd, 0x30, 0xf7, 0xb9, 0xf2, 0xe4, 0xcf, - 0x1d, 0xd7, 0x69, 0x8c, 0x72, 0x85, 0x29, 0x82, 0xa5, 0xe0, 0x65, 0xad, - 0x22, 0x0e, 0xa5, 0x8d, 0x36, 0xd8, 0x73, 0x86, 0x49, 0xe5, 0x47, 0x22, - 0xc0, 0xd9, 0x03, 0x6c, 0xe5, 0x8e, 0x69, 0x8b, 0x4c, 0x94, 0xb2, 0x45, - 0xfe, 0x4b, 0x2a, 0xa8, 0xab, 0x70, 0xfc, 0x83, 0x85, 0xe0, 0x3e, 0x93, - 0x50, 0xb7, 0x34, 0xb3, 0x57, 0x0d, 0x39, 0xa3, 0xcc, 0x61, 0x96, 0x7c, - 0x99, 0xf5, 0x27, 0xe4, 0xf6, 0x9e, 0xda, 0x56, 0xd1, 0xb7, 0x6f, 0xc0, - 0x8a, 0xdd, 0x6b, 0xb5, 0xaf, 0x8f, 0x0c, 0xa2, 0x87, 0xe7, 0xb4, 0x1a, - 0xae, 0x2a, 0x23, 0x2c, 0x38, 0x17, 0x3a, 0xff, 0xa5, 0xb7, 0x71, 0x0c, - 0xcd, 0x48, 0x54, 0xc4, 0xac, 0x8c, 0x4b, 0xb7, 0xa4, 0xe0, 0xfc, 0x73, - 0x2a, 0xb4, 0x8a, 0xbe, 0xec, 0xe7, 0x95, 0x98, 0xa2, 0xa3, 0xad, 0x57, - 0x02, 0x14, 0xb5, 0x0a, 0x75, 0x88, 0xef, 0x32, 0x48, 0x7f, 0x7e, 0x84, - 0x0c, 0x68, 0x8c, 0x12, 0xdb, 0xce, 0x75, 0x93, 0x3e, 0x09, 0x07, 0x33, - 0x8d, 0x0b, 0xef, 0xcd, 0x59, 0x55, 0x19, 0xce, 0x14, 0x5a, 0xca, 0x42, - 0xfe, 0x1c, 0x61, 0x4a, 0x26, 0x28, 0x86, 0x85, 0xca, 0xf3, 0x09, 0x0b, - 0x9b, 0x9b, 0x2a, 0x7c, 0x97, 0x5e, 0xbf, 0xb3, 0x7c, 0xef, 0x7d, 0x8c, - 0x81, 0xda, 0x4e, 0xfb, 0x86, 0x49, 0x36, 0x60, 0x97, 0xf1, 0x59, 0xb7, - 0x0e, 0x65, 0xea, 0x91, 0x71, 0xb3, 0xd8, 0x77, 0x84, 0xcd, 0x74, 0x31, - 0x2d, 0x7c, 0xbf, 0x86, 0x73, 0xdf, 0xcb, 0x85, 0xc6, 0xf5, 0x20, 0x1d, - 0x96, 0x92, 0x8a, 0xc3, 0xb6, 0x02, 0x61, 0x11, 0x78, 0x53, 0x53, 0xb7, - 0x72, 0xd2, 0x3e, 0x5a, 0x42, 0x65, 0xa9, 0x49, 0x73, 0xbe, 0xbd, 0xe3, - 0x8d, 0xbe, 0x1c, 0x6a, 0x24, 0x3d, 0xe7, 0x26, 0xf5, 0x06, 0x5f, 0xf1, - 0x0a, 0x45, 0xd5, 0x29, 0x51, 0x2f, 0xdf, 0x9b, 0x1f, 0x10, 0x54, 0x62, - 0xea, 0xdf, 0xa2, 0xca, 0xe3, 0x24, 0xa0, 0x25, 0xdf, 0xe5, 0xb3, 0x62, - 0x83, 0x44, 0x35, 0x6c, 0xe5, 0xb7, 0x9f, 0xe3, 0x61, 0xd1, 0x07, 0x6d, - 0x39, 0x20, 0x6a, 0xd6, 0x6b, 0x63, 0xd1, 0x02, 0x75, 0xb1, 0x7c, 0xe2, - 0x88, 0x41, 0x6b, 0x63, 0xcb, 0x8e, 0x32, 0xe1, 0x54, 0xbc, 0x82, 0x2d, - 0xaa, 0x4d, 0x21, 0xd5, 0x15, 0xd4, 0x06, 0xfa, 0xad, 0x73, 0xd1, 0x12, - 0xb1, 0x17, 0x5f, 0xc0, 0x62, 0x0c, 0xf6, 0x8b, 0xa6, 0xeb, 0xc4, 0xc6, - 0x1d, 0x7e, 0xb3, 0xa8, 0x8e, 0xc6, 0x63, 0xe1, 0x00, 0xa5, 0xf7, 0x27, - 0x3b, 0x24, 0xcd, 0x7e, 0x75, 0xf6, 0x5d, 0xea, 0x35, 0x01, 0x75, 0x48, - 0x6d, 0x55, 0xf4, 0x18, 0x7c, 0x1d, 0x37, 0x5b, 0x26, 0xee, 0x3b, 0xe1, - 0x2c, 0x97, 0x06, 0x54, 0x7c, 0x49, 0x7e, 0x6e, 0xca, 0xb5, 0xeb, 0x1d, - 0x2f, 0x5b, 0x95, 0x8c, 0x03, 0x7d, 0x58, 0x8e, 0x94, 0x0d, 0x17, 0x62, - 0x5e, 0x56, 0x37, 0xda, 0x9d, 0xf7, 0xa7, 0x7b, 0xfb, 0x12, 0x39, 0x6c, - 0xe7, 0xf0, 0x74, 0xb5, 0xee, 0x38, 0x9c, 0xe2, 0x03, 0x11, 0xa6, 0xda, - 0x8f, 0x0d, 0xb0, 0x1b, 0x1f, 0x08, 0x82, 0x11, 0x53, 0x99, 0x32, 0xf9, - 0x78, 0x7b, 0x99, 0x2c, 0x03, 0xa7, 0x8f, 0x33, 0xfc, 0xc5, 0x71, 0xb6, - 0x51, 0xa4, 0x4f, 0xd4, 0xb1, 0xfb, 0xce, 0x53, 0x26, 0x34, 0x47, 0x34, - 0xb7, 0xa2, 0x7c, 0xee, 0x3d, 0x4d, 0x11, 0x32, 0x9d, 0xab, 0xa0, 0x14, - 0x99, 0x63, 0x14, 0x72, 0xc0, 0xa0, 0x92, 0x07, 0xd7, 0x1f, 0x85, 0xe5, - 0x59, 0x2b, 0x01, 0x05, 0x04, 0xab, 0xe1, 0xb7, 0xa5, 0x8e, 0x56, 0xf6, - 0x39, 0x8a, 0x18, 0x35, 0x3f, 0x2d, 0x51, 0x0d, 0x44, 0x35, 0x1d, 0x72, - 0x47, 0xeb, 0x1f, 0xef, 0x0c, 0x52, 0x6f, 0xae, 0xd6, 0x8d, 0x74, 0x33, - 0xad, 0x12, 0xd7, 0x41, 0xb4, 0x76, 0x05, 0x00, 0x29, 0x5e, 0x67, 0x58, - 0xc2, 0x22, 0xf6, 0xf6, 0x50, 0xf5, 0x88, 0xe8, 0x8d, 0x97, 0x3d, 0x04, - 0xba, 0x8a, 0x0d, 0xb4, 0x3c, 0xaa, 0x20, 0xa2, 0xe0, 0x98, 0x9c, 0x9b, - 0x1e, 0xcc, 0xec, 0xfa, 0x4b, 0x7f, 0x83, 0x4c, 0xeb, 0xe9, 0x61, 0xd6, - 0xe6, 0xc3, 0x8f, 0xc0, 0x4d, 0x29, 0xd2, 0x41, 0x3d, 0xf9, 0x33, 0x67, - 0x5b, 0x2d, 0x65, 0x08, 0x86, 0x47, 0x89, 0x4a, 0xf2, 0xd8, 0x58, 0xb3, - 0x04, 0x5a, 0x8e, 0x26, 0x6d, 0x7d, 0xc1, 0x72, 0x8b, 0x51, 0x45, 0x37, - 0x6a, 0x16, 0x15, 0x2a, 0x99, 0xd0, 0xd3, 0x8b, 0x64, 0x64, 0xcf, 0x71, - 0xcf, 0xbf, 0x21, 0x7b, 0x82, 0xa2, 0x66, 0x92, 0x38, 0x5a, 0x40, 0x89, - 0x5e, 0x85, 0xbc, 0x80, 0x05, 0x59, 0x7b, 0x62, 0x51, 0x77, 0x56, 0xaf, - 0x46, 0x3f, 0x35, 0x76, 0x38, 0xbf, 0xfc, 0x5e, 0x9c, 0x20, 0x3e, 0x53, - 0xcd, 0x77, 0x04, 0x90, 0x0e, 0xa8, 0xa4, 0xbc, 0xd0, 0xef, 0xb5, 0x77, - 0x0c, 0x7e, 0x21, 0x8e, 0x90, 0xa6, 0x3a, 0xe9, 0x14, 0xec, 0xdd, 0x15, - 0x90, 0xc5, 0x3b, 0x0b, 0xa9, 0x4a, 0xfc, 0x61, 0x2b, 0x48, 0xaf, 0x13, - 0xc1, 0xb2, 0xaf, 0x88, 0x40, 0xb4, 0xff, 0x15, 0x8c, 0x32, 0xdb, 0xd7, - 0x07, 0xbc, 0xf1, 0x21, 0x43, 0xcf, 0x61, 0x79, 0x24, 0x72, 0xbc, 0x68, - 0x69, 0x39, 0xc0, 0x28, 0xa0, 0x67, 0xd2, 0x78, 0xcd, 0x3e, 0x89, 0x43, - 0xf1, 0xc5, 0xde, 0x90, 0x62, 0x24, 0xe5, 0x21, 0xf8, 0xe2, 0x57, 0x96, - 0x88, 0xb0, 0x5a, 0x2e, 0x09, 0x24, 0xe1, 0xf2, 0xa1, 0x6c, 0xfb, 0xce, - 0x3d, 0x42, 0x24, 0x70, 0x49, 0x2e, 0x08, 0x53, 0x9d, 0x89, 0xf2, 0x9b, - 0x1d, 0x7d, 0x33, 0x62, 0x8d, 0x2c, 0x5c, 0xed, 0x86, 0xd0, 0x60, 0xcb, - 0x85, 0x82, 0x86, 0xe3, 0xfe, 0xc5, 0x45, 0xa5, 0xe5, 0x6d, 0xa1, 0xa8, - 0x46, 0x10, 0x67, 0x50, 0x9c, 0x4c, 0xd4, 0xed, 0x9c, 0x89, 0x25, 0x25, - 0x89, 0x07, 0x37, 0xe4, 0xfe, 0xde, 0xd4, 0xed, 0x10, 0x2b, 0x46, 0x61, - 0x70, 0x72, 0x08, 0x30, 0x89, 0x51, 0x0a, 0xa0, 0xde, 0x2e, 0x6e, 0x8c, - 0xd7, 0x53, 0x50, 0x44, 0x91, 0x7d, 0xa2, 0x87, 0xf7, 0x6a, 0x5c, 0x95, - 0x2a, 0x42, 0x97, 0x74, 0x99, 0x7a, 0xf0, 0xd0, 0xb3, 0xea, 0x24, 0x3c, - 0x2f, 0xd6, 0x09, 0xe3, 0x78, 0xa9, 0xf4, 0x07, 0xff, 0x20, 0xfd, 0x82, - 0x4a, 0x2f, 0x77, 0xce, 0xf2, 0x05, 0x6c, 0x73, 0x06, 0x12, 0x71, 0x9f, - 0x92, 0x35, 0x56, 0x41, 0x07, 0x3c, 0xea, 0xc2, 0x4d, 0x42, 0x75, 0xbc, - 0xae, 0x18, 0x87, 0xc4, 0x66, 0xc4, 0x32, 0x01, 0xc1, 0xfb, 0xd4, 0x08, - 0x34, 0x59, 0x9a, 0x11, 0x2c, 0x2f, 0x55, 0x6a, 0x92, 0x9d, 0x0a, 0xaf, - 0xdf, 0x91, 0x94, 0xf7, 0xef, 0xa5, 0xec, 0xeb, 0x4f, 0x11, 0x52, 0xb9, - 0xda, 0x76, 0x67, 0xf1, 0x71, 0x14, 0x2a, 0x53, 0x9e, 0xde, 0x7b, 0xfa, - 0x47, 0x6e, 0x20, 0x6a, 0x42, 0x5d, 0x74, 0xbf, 0x3a, 0x53, 0x3b, 0x45, - 0x58, 0x6d, 0x51, 0xd1, 0x56, 0x98, 0x30, 0xcb, 0x96, 0xca, 0xb7, 0x88, - 0xbe, 0xb1, 0xc3, 0x99, 0xff, 0xe0, 0x5e, 0xb4, 0xab, 0xd9, 0x50, 0x6c, - 0x72, 0xfb, 0x5b, 0x61, 0x86, 0x14, 0xe0, 0x77, 0x77, 0xc9, 0x13, 0x2f, - 0x9c, 0xcc, 0x82, 0x1e, 0x6f, 0x6f, 0x19, 0xdc, 0xc9, 0x44, 0x93, 0x90, - 0x76, 0xc4, 0xf6, 0x67, 0xe7, 0x65, 0x7f, 0x6b, 0x2c, 0xe3, 0x29, 0x50, - 0xb4, 0xe0, 0x51, 0x58, 0xa6, 0xf4, 0x34, 0x3b, 0x44, 0xf0, 0xe4, 0xd7, - 0x51, 0xf6, 0x5a, 0x50, 0x75, 0x64, 0x87, 0xf8, 0xeb, 0xfb, 0x4f, 0xab, - 0x1d, 0x39, 0x4d, 0xb8, 0x28, 0x1a, 0x11, 0x61, 0x99, 0x16, 0xdb, 0xef, - 0x57, 0xce, 0x97, 0x09, 0x9e, 0x85, 0x61, 0xc1, 0x36, 0xc8, 0x89, 0x34, - 0x9c, 0x9b, 0x4f, 0x80, 0x05, 0xd5, 0x92, 0x97, 0xd9, 0xd3, 0x0a, 0x4f, - 0xd8, 0xba, 0x7d, 0x3c, 0x7e, 0xfd, 0x54, 0xd7, 0x8f, 0xe8, 0xd0, 0x87, - 0xdb, 0xe0, 0x62, 0x65, 0xcf, 0x29, 0x8c, 0xfc, 0x0d, 0x4c, 0x1a, 0xd0, - 0x01, 0x4c, 0xab, 0xa1, 0x4f, 0x52, 0xae, 0xf9, 0x2a, 0x01, 0xf8, 0xde, - 0xf5, 0x85, 0x39, 0x59, 0x4a, 0xeb, 0x74, 0xe3, 0xcf, 0xd8, 0x19, 0xce, - 0xa7, 0x26, 0xd4, 0x9a, 0x16, 0x7c, 0xf0, 0x54, 0xfd, 0x95, 0x2c, 0xa9, - 0x7b, 0x3a, 0xd1, 0xc8, 0xdb, 0xa2, 0x15, 0xcb, 0xa3, 0x8a, 0x87, 0x3d, - 0x65, 0x72, 0x59, 0x11, 0xad, 0xf3, 0x04, 0x44, 0xfe, 0x17, 0x4c, 0x89, - 0x71, 0x97, 0x94, 0x4f, 0x53, 0x9e, 0x9d, 0x0c, 0x60, 0xbc, 0xa2, 0x3f, - 0x0b, 0x95, 0xf4, 0x4c, 0xf0, 0xc4, 0x46, 0xb1, 0xe5, 0x24, 0xb9, 0x57, - 0x08, 0xaf, 0x3b, 0x00, 0x1b, 0xf7, 0x54, 0x86, 0x48, 0x29, 0x85, 0x6b, - 0x20, 0xc0, 0x8d, 0x12, 0xc3, 0x1d, 0xf9, 0x55, 0x88, 0xe2, 0xf7, 0xdd, - 0xab, 0xde, 0x0e, 0x63, 0x77, 0x44, 0x0c, 0x48, 0xfb, 0x89, 0x21, 0x33, - 0xd9, 0xfb, 0xaa, 0xa3, 0x7d, 0x77, 0x5c, 0x58, 0xf8, 0x9a, 0x3a, 0x6f, - 0x99, 0xaf, 0xbd, 0x55, 0xd8, 0xdd, 0x07, 0x40, 0x9d, 0x3c, 0x53, 0xe4, - 0x95, 0xb8, 0x4e, 0x1b, 0xac, 0x55, 0xb3, 0x39, 0x2d, 0x85, 0x42, 0x1e, - 0x07, 0x6f, 0x10, 0x18, 0x74, 0xc5, 0x22, 0x37, 0xc6, 0x7d, 0x5b, 0xb4, - 0x0f, 0xc8, 0xa4, 0x7a, 0x6a, 0xc6, 0x19, 0xf0, 0x51, 0xfb, 0x00, 0xaa, - 0x38, 0xd9, 0x5b, 0xff, 0x94, 0x2b, 0x15, 0xad, 0xc5, 0xda, 0xc5, 0x0d, - 0x78, 0x19, 0xca, 0xba, 0x1f, 0x4e, 0xfd, 0x30, 0x8f, 0xd0, 0x7e, 0x97, - 0x10, 0xb1, 0xbb, 0xd4, 0x0c, 0x2c, 0xe0, 0x26, 0x58, 0x50, 0x68, 0x8b, - 0x18, 0x4f, 0xfc, 0x38, 0xd7, 0x87, 0xba, 0xda, 0xfc, 0x7a, 0x18, 0xbf, - 0x7b, 0xca, 0x88, 0xe9, 0xba, 0xd3, 0x72, 0xd6, 0x74, 0xb5, 0x7c, 0x85, - 0x62, 0x42, 0xde, 0x7a, 0x35, 0x8f, 0x39, 0x6f, 0x37, 0x43, 0x84, 0x14, - 0x85, 0x93, 0x94, 0x55, 0x1d, 0x28, 0xc0, 0x28, 0xea, 0x8a, 0x22, 0x13, - 0x0a, 0x8e, 0x5b, 0xfb, 0x36, 0x8d, 0xe3, 0x91, 0x00, 0xb8, 0xfc, 0x6c, - 0xe2, 0x99, 0xac, 0x7d, 0x37, 0x82, 0xaf, 0xff, 0x5e, 0xd7, 0x71, 0x18, - 0x55, 0xe3, 0xd8, 0x00, 0x96, 0x16, 0x82, 0xbe, 0x13, 0x6c, 0x74, 0x75, - 0x0a, 0x31, 0x64, 0x67, 0xf1, 0x5d, 0xb4, 0x6e, 0xd1, 0xd8, 0x9d, 0xc1, - 0x4d, 0xf6, 0x16, 0x96, 0x8f, 0x77, 0x49, 0x69, 0x16, 0x8c, 0x87, 0xcd, - 0x5d, 0x18, 0x9d, 0x9d, 0xa5, 0x50, 0x6a, 0x37, 0x13, 0xc0, 0xe6, 0x84, - 0x5d, 0xa6, 0x31, 0x51, 0x8b, 0xf7, 0x6e, 0x57, 0x3c, 0x01, 0x48, 0x06, - 0xf8, 0xe5, 0x94, 0xb4, 0x3c, 0xf9, 0x2a, 0xcd, 0x64, 0x33, 0x0d, 0x31, - 0xca, 0x58, 0xa8, 0xff, 0x00, 0x73, 0xa0, 0xbe, 0x50, 0x2c, 0x41, 0x29, - 0x7f, 0x02, 0x5d, 0xc2, 0x64, 0x7d, 0xa5, 0x66, 0x9a, 0x5c, 0xfe, 0x1a, - 0xdd, 0x78, 0x3b, 0x02, 0x42, 0xa5, 0x95, 0x3d, 0x16, 0x17, 0x39, 0x4e, - 0xd8, 0xd3, 0xf7, 0xb7, 0x31, 0x80, 0x99, 0xf5, 0x09, 0x7c, 0xad, 0x30, - 0xdf, 0x1a, 0x1f, 0xb1, 0x75, 0x70, 0xc4, 0x91, 0x50, 0x49, 0xb8, 0xfe, - 0x3e, 0xea, 0xa2, 0x46, 0x1a, 0x39, 0xe2, 0xe1, 0x08, 0x62, 0x54, 0xe8, - 0x9e, 0x9d, 0xeb, 0xce, 0x8f, 0xed, 0xed, 0x15, 0x65, 0x8c, 0x80, 0x4d, - 0xaa, 0x14, 0xcd, 0x5a, 0x07, 0xda, 0xb9, 0x38, 0x2e, 0x3b, 0x0c, 0xde, - 0xd9, 0xe3, 0x83, 0xb5, 0x6b, 0x1d, 0xf8, 0x49, 0xc6, 0x15, 0x38, 0x60, - 0x9c, 0xdf, 0xe5, 0x2f, 0xeb, 0xbc, 0x3d, 0x6a, 0xbf, 0x22, 0x8d, 0x6e, - 0xd4, 0x02, 0x85, 0x8e, 0x2a, 0x02, 0xb3, 0x1e, 0x92, 0x5d, 0x99, 0xdd, - 0x78, 0xdd, 0x2c, 0xcb, 0x3a, 0xb6, 0xa1, 0x8b, 0x7f, 0xa0, 0x71, 0xac, - 0xff, 0xfb, 0xef, 0x92, 0x30, 0xe5, 0x0b, 0xd4, 0x0e, 0x9c, 0x42, 0x66, - 0xb7, 0x10, 0x7e, 0xd1, 0x75, 0x6c, 0xdf, 0xbf, 0xc7, 0x1e, 0x4b, 0x9f, - 0x5c, 0x31, 0xc7, 0xc3, 0xfd, 0x95, 0x9e, 0xf6, 0x95, 0xdf, 0x6f, 0x6c, - 0xfa, 0x78, 0x0e, 0x05, 0xfa, 0xb2, 0x4e, 0xa9, 0x64, 0x52, 0xb1, 0xf4, - 0x5f, 0x28, 0x97, 0xe9, 0x2b, 0xe3, 0x0e, 0x6d, 0x1a, 0xbd, 0x0b, 0x6b, - 0xa9, 0xf2, 0x5b, 0x3e, 0x34, 0xca, 0xc5, 0xf9, 0xca, 0x6c, 0x9a, 0x85, - 0x54, 0x2b, 0xc6, 0x9f, 0x75, 0x87, 0x31, 0x0d, 0x79, 0x73, 0xe3, 0xa1, - 0xa4, 0x41, 0x0e, 0x13, 0x02, 0x26, 0x04, 0x52, 0x41, 0x69, 0xbb, 0x35, - 0x1b, 0xf4, 0x0f, 0x68, 0x16, 0x35, 0x41, 0x99, 0x2f, 0x05, 0x57, 0xfc, - 0x4b, 0x02, 0x7b, 0x57, 0x6a, 0x19, 0xcb, 0x68, 0x2a, 0xc7, 0xb9, 0x08, - 0x9d, 0xa6, 0xfc, 0xf3, 0xae, 0x1b, 0x5c, 0xf0, 0x4a, 0x55, 0x1f, 0x72, - 0xf7, 0xf8, 0x4b, 0xfe, 0x87, 0x5a, 0xd4, 0x31, 0x4a, 0x76, 0xe4, 0x8f, - 0x1b, 0x6c, 0xc9, 0xe8, 0x90, 0x0d, 0x35, 0x2a, 0x86, 0x9d, 0x85, 0x8e, - 0xe4, 0x59, 0x24, 0x98, 0x2e, 0xc3, 0xc5, 0xd8, 0x12, 0x2e, 0x36, 0xf7, - 0xb3, 0xe4, 0x40, 0x6f, 0x20, 0x7d, 0xef, 0x12, 0x91, 0xe2, 0x1e, 0x71, - 0x6a, 0x51, 0x30, 0xbf, 0xe4, 0xcc, 0xa8, 0x06, 0xf8, 0x2c, 0x51, 0xb4, - 0xc4, 0x9c, 0xbd, 0xb5, 0x3b, 0xf4, 0x98, 0x9c, 0x20, 0x6b, 0x4d, 0x66, - 0xaa, 0xe8, 0xca, 0x7b, 0x8b, 0xaa, 0x7c, 0x57, 0x17, 0x27, 0x1f, 0xcf, - 0x4d, 0x1d, 0xe5, 0x88, 0xe1, 0xac, 0x58, 0xfc, 0x46, 0x22, 0xe6, 0x04, - 0xe6, 0x5c, 0xef, 0x54, 0x2a, 0x0c, 0x6e, 0xe8, 0xe9, 0x65, 0xc2, 0xa0, - 0x74, 0x30, 0x13, 0x91, 0x8e, 0x61, 0x92, 0x10, 0x2c, 0x22, 0x07, 0xf0, - 0x38, 0x51, 0xf9, 0x10, 0x37, 0xef, 0x66, 0xa9, 0x26, 0x97, 0xc7, 0xbf, - 0x88, 0x38, 0xa3, 0x2f, 0xea, 0x13, 0x23, 0x34, 0xe1, 0xd6, 0x48, 0xa5, - 0x38, 0xdb, 0x91, 0xe0, 0x12, 0x9d, 0x2f, 0x24, 0x87, 0x72, 0x82, 0x9c, - 0xd1, 0x08, 0x16, 0xb2, 0x4b, 0x0c, 0x8a, 0x05, 0x78, 0xb2, 0x34, 0x0e, - 0x9d, 0x4a, 0xea, 0xed, 0xf3, 0xd6, 0x48, 0x7a, 0xa2, 0x6d, 0x84, 0xea, - 0x63, 0xb3, 0x61, 0xc8, 0x4b, 0x97, 0x07, 0xc7, 0x7d, 0xd5, 0xbe, 0x30, - 0x91, 0x82, 0x60, 0xfd, 0x53, 0x19, 0x31, 0xb7, 0xb5, 0xd5, 0xff, 0xf8, - 0xae, 0xc9, 0x9b, 0x05, 0xe6, 0x1e, 0xe2, 0x65, 0xb0, 0x01, 0x1e, 0xbe, - 0x32, 0x59, 0x42, 0xc9, 0xa7, 0xb8, 0xb9, 0x19, 0xf2, 0xdd, 0x42, 0xcb, - 0xb8, 0x27, 0xee, 0x4e, 0x94, 0x9b, 0x29, 0xe5, 0xdb, 0xe3, 0x95, 0x49, - 0x4f, 0x19, 0x66, 0xe2, 0x0c, 0x9d, 0xeb, 0x58, 0xca, 0x0d, 0x19, 0x53, - 0xe2, 0x59, 0x9a, 0xef, 0xfd, 0xf4, 0x8f, 0x71, 0x5c, 0x18, 0x9b, 0x52, - 0x68, 0x8b, 0x44, 0x84, 0x54, 0x39, 0xdf, 0x26, 0x70, 0xf2, 0x25, 0xfa, - 0x49, 0xb9, 0xb0, 0xc1, 0xb5, 0x43, 0xfd, 0x6d, 0x00, 0xb2, 0x51, 0xc9, - 0x50, 0x4c, 0x26, 0x66, 0xf7, 0x4e, 0xdb, 0x97, 0x8a, 0x73, 0x93, 0xde, - 0xee, 0x00, 0x61, 0x1a, 0x05, 0x1e, 0x9b, 0x48, 0x23, 0x93, 0xe2, 0x35, - 0x2e, 0x7c, 0x97, 0x8d, 0x80, 0x04, 0xa8, 0x52, 0x72, 0x1b, 0x2c, 0x7b, - 0xbf, 0x9c, 0xf9, 0xa5, 0x82, 0x4a, 0x31, 0xf7, 0x00, 0xf4, 0xe9, 0x61, - 0x2f, 0xbf, 0xb8, 0x46, 0xd6, 0x0e, 0xbe, 0x09, 0x86, 0xa2, 0xd2, 0xe0, - 0x7c, 0xa9, 0x33, 0xfa, 0x42, 0x69, 0xcf, 0xe5, 0x71, 0x24, 0x0c, 0x87, - 0x03, 0x97, 0x25, 0x56, 0xb4, 0x48, 0xf3, 0x32, 0x9c, 0x96, 0xaf, 0x2d, - 0xb0, 0xe8, 0x91, 0xe6, 0xb5, 0x8f, 0xb8, 0xd1, 0x80, 0x9f, 0x47, 0x87, - 0xc7, 0xdc, 0x08, 0x4f, 0x51, 0x9c, 0xe3, 0xfd, 0xe4, 0x65, 0x46, 0x83, - 0x88, 0x62, 0xb1, 0x32, 0xec, 0x0b, 0xe9, 0x4e, 0xb2, 0xa3, 0xf6, 0x79, - 0xd2, 0xb8, 0x61, 0x52, 0x19, 0xad, 0x28, 0x0d, 0x36, 0xc2, 0xdd, 0xb0, - 0x97, 0x4d, 0xf4, 0xd1, 0xa2, 0xff, 0x8c, 0xe2, 0xc4, 0xc0, 0x25, 0x15, - 0x87, 0x8d, 0x2a, 0x20, 0x43, 0x2a, 0x66, 0xb1, 0xce, 0x80, 0xa1, 0x34, - 0x46, 0xe4, 0x92, 0x26, 0x30, 0x9d, 0xa0, 0xe8, 0x70, 0x19, 0x2a, 0xe2, - 0xc7, 0xc1, 0xa5, 0x57, 0x9d, 0xef, 0x6a, 0xd7, 0x9b, 0x13, 0xe8, 0x96, - 0x7b, 0x36, 0xf3, 0xf2, 0x5f, 0xb4, 0x59, 0x80, 0xd3, 0x30, 0xc0, 0xe6, - 0x0e, 0x58, 0xec, 0x3c, 0x8a, 0x10, 0x67, 0xbd, 0x06, 0x06, 0xf0, 0x79, - 0x7d, 0x05, 0x57, 0xc3, 0x3a, 0xc9, 0xa4, 0xea, 0xf0, 0xb6, 0x89, 0x65, - 0xab, 0x26, 0xd2, 0xab, 0x86, 0x88, 0x10, 0x0d, 0x6f, 0x53, 0xa6, 0xe2, - 0x28, 0x4f, 0x38, 0x18, 0x72, 0x1e, 0x8f, 0xe5, 0xb4, 0x24, 0xa0, 0xec, - 0x45, 0x66, 0x26, 0x19, 0xf0, 0x6a, 0xfe, 0xb4, 0x5b, 0x96, 0xa2, 0xaa, - 0x6b, 0x71, 0x36, 0xbb, 0x3a, 0xe3, 0xb0, 0x70, 0xeb, 0xf1, 0x5c, 0x33, - 0xe2, 0x84, 0xda, 0x54, 0xcf, 0x9c, 0xd2, 0x17, 0xba, 0xc4, 0xb6, 0x82, - 0x77, 0xca, 0x25, 0x24, 0xef, 0x9a, 0xba, 0x70, 0xa8, 0x77, 0x5a, 0xcb, - 0x88, 0x2c, 0x87, 0x8a, 0x21, 0x5c, 0xbb, 0xcc, 0xc3, 0x8c, 0xe0, 0x22, - 0x2b, 0x4b, 0x0a, 0xe6, 0xaa, 0x1b, 0x95, 0xb9, 0x33, 0xeb, 0x53, 0xa8, - 0x68, 0x8f, 0xef, 0xa5, 0xd6, 0x87, 0xc4, 0xe5, 0x76, 0x22, 0x14, 0xb8, - 0x45, 0xb1, 0xd3, 0xf1, 0x97, 0xfe, 0xd1, 0x5f, 0xeb, 0xe5, 0x2c, 0x1b, - 0x91, 0x7c, 0xb4, 0x05, 0x69, 0x65, 0xdf, 0x25, 0x1f, 0x23, 0x1a, 0x9c, - 0xbd, 0x10, 0xaf, 0x9e, 0x5c, 0xd2, 0xd2, 0x8f, 0x6e, 0xad, 0xe4, 0xe0, - 0xa4, 0x04, 0xeb, 0x48, 0x1f, 0x98, 0x96, 0x34, 0xf6, 0xbc, 0x25, 0xf9, - 0x5a, 0x49, 0x0f, 0x1d, 0xba, 0x93, 0xd4, 0x74, 0x2f, 0xb8, 0x1d, 0xf0, - 0xbf, 0x52, 0x7f, 0xd7, 0xf0, 0x49, 0x51, 0xb8, 0x98, 0x19, 0x85, 0xac, - 0xc2, 0x53, 0x33, 0xb0, 0x50, 0xd7, 0x52, 0x46, 0x66, 0xa7, 0xe9, 0xc7, - 0xcf, 0xad, 0x1e, 0xda, 0x75, 0xd8, 0x87, 0xee, 0x7e, 0xd4, 0x01, 0xf8, - 0xc9, 0xdc, 0xff, 0xcd, 0x4c, 0x3f, 0xbb, 0x5c, 0x42, 0x79, 0xa1, 0x22, - 0xc0, 0x7e, 0x7a, 0xbb, 0x33, 0x34, 0x5d, 0xf5, 0xa5, 0x70, 0x4b, 0x6d, - 0x97, 0x04, 0x66, 0x4d, 0x40, 0x4a, 0xce, 0x16, 0x16, 0x0e, 0x9a, 0x65, - 0x6d, 0x5d, 0x0a, 0x21, 0x16, 0x01, 0x8f, 0x86, 0x41, 0x01, 0xc7, 0x9a, - 0xb4, 0x53, 0x82, 0x75, 0x51, 0x59, 0x84, 0xda, 0xc2, 0xd6, 0xfb, 0xcc, - 0x7d, 0xae, 0xad, 0x52, 0x88, 0x50, 0xa0, 0x52, 0x1b, 0xbd, 0x05, 0x64, - 0x35, 0x66, 0xd2, 0x75, 0xfa, 0x6c, 0xc9, 0x15, 0x04, 0x01, 0xb6, 0x69, - 0x4d, 0xb8, 0x26, 0xb8, 0xdd, 0x35, 0xef, 0x59, 0xd2, 0xd7, 0x3a, 0xe9, - 0x92, 0xb5, 0x64, 0x92, 0xec, 0xd0, 0xca, 0xaf, 0x0c, 0xce, 0xf6, 0xdd, - 0xc4, 0x0f, 0x8e, 0x78, 0xc6, 0xae, 0x26, 0xec, 0x3e, 0x85, 0xdc, 0x73, - 0xb9, 0xea, 0x18, 0xc9, 0x14, 0xdb, 0x78, 0x79, 0x32, 0xf3, 0xa6, 0xb4, - 0x2e, 0x7f, 0x99, 0x3e, 0x40, 0x28, 0xe7, 0x67, 0xb5, 0xd8, 0x0b, 0xbe, - 0x66, 0x81, 0xce, 0xcb, 0x0b, 0x6b, 0x19, 0xf8, 0x32, 0xae, 0x94, 0x8c, - 0x92, 0xd5, 0xe6, 0x93, 0xfe, 0x0d, 0x1c, 0x5c, 0x8d, 0x52, 0xba, 0x01, - 0xbe, 0xbf, 0xb1, 0x81, 0xa1, 0x55, 0xc7, 0xe8, 0xae, 0xa6, 0x54, 0x10, - 0x7b, 0x5c, 0x3d, 0xdf, 0xdd, 0xe0, 0xb7, 0x95, 0xb4, 0x40, 0x87, 0x2a, - 0x8f, 0xa2, 0xee, 0x3f, 0x5e, 0x21, 0x49, 0x61, 0x52, 0x60, 0x64, 0x57, - 0xab, 0x71, 0xa2, 0xcd, 0x2a, 0x8b, 0x6c, 0x37, 0x43, 0x42, 0x9d, 0x1c, - 0x1c, 0x81, 0xfb, 0x32, 0x69, 0xf8, 0x4b, 0xe0, 0xf0, 0x96, 0x54, 0x46, - 0xb9, 0x56, 0xe4, 0x14, 0x5e, 0x29, 0xd2, 0x57, 0x3e, 0x42, 0xae, 0xf0, - 0x47, 0x1f, 0x18, 0x5f, 0x79, 0xf5, 0xd3, 0xaa, 0x8f, 0xce, 0x50, 0x5e, - 0x56, 0x0b, 0x33, 0x1c, 0xc7, 0xaa, 0xf0, 0xff, 0x59, 0xbb, 0xea, 0x37, - 0x70, 0x75, 0xac, 0x63, 0x4b, 0xc6, 0x07, 0xc8, 0xcf, 0x85, 0x73, 0xa0, - 0xda, 0x99, 0x4e, 0x08, 0x56, 0xff, 0x2a, 0xcd, 0x70, 0xcb, 0x78, 0x49, - 0xb5, 0x5c, 0x5f, 0xc9, 0x23, 0x0d, 0x19, 0x3c, 0xb1, 0x00, 0xc1, 0x68, - 0xff, 0xc5, 0x28, 0x4b, 0x2d, 0x7b, 0x56, 0x3a, 0x2d, 0x4f, 0xd6, 0x8c, - 0x84, 0xfc, 0xa2, 0xe3, 0xdc, 0x9c, 0xc3, 0x04, 0x9b, 0xa1, 0x8b, 0x8f, - 0x82, 0xf5, 0x49, 0xde, 0xa2, 0xf5, 0x30, 0x0a, 0xc0, 0x39, 0xc5, 0x0f, - 0xb4, 0x72, 0x5f, 0xae, 0xf9, 0x40, 0x1e, 0xb0, 0x17, 0x5c, 0xe4, 0x42, - 0x8f, 0x20, 0x8c, 0x6d, 0x40, 0x37, 0x00, 0x33, 0xa7, 0xff, 0xba, 0x06, - 0x1a, 0x09, 0x06, 0x72, 0x18, 0xbf, 0xa7, 0xbe, 0x23, 0x24, 0xaf, 0xd6, - 0xf8, 0xd2, 0x8d, 0x1c, 0x89, 0xea, 0x15, 0x03, 0x4a, 0x70, 0x09, 0xff, - 0x96, 0xd1, 0x27, 0x6e, 0x9b, 0x04, 0x23, 0x37, 0xd0, 0x3f, 0x41, 0x48, - 0x65, 0xa0, 0xd7, 0xf6, 0x47, 0x06, 0x75, 0x19, 0x06, 0xb1, 0xec, 0x06, - 0x69, 0x62, 0x80, 0x92, 0xbc, 0x19, 0x7a, 0xd9, 0xab, 0x26, 0x57, 0x63, - 0xf0, 0xc6, 0x92, 0xfb, 0xed, 0x65, 0xd4, 0x3b, 0x00, 0xff, 0x9f, 0xa5, - 0x02, 0x98, 0x6c, 0xca, 0xc0, 0xdb, 0x8e, 0xe6, 0x30, 0x64, 0xec, 0xb9, - 0x8d, 0x2c, 0x38, 0xd2, 0xef, 0x65, 0x04, 0xf3, 0xca, 0xc3, 0x1e, 0xd0, - 0x9a, 0xbd, 0xe4, 0xef, 0x47, 0x1d, 0x34, 0xb7, 0x10, 0x76, 0x8c, 0xca, - 0xeb, 0xa0, 0x7e, 0x56, 0xef, 0xa5, 0xd7, 0x7b, 0x80, 0x8e, 0x67, 0x90, - 0xae, 0xcb, 0x40, 0x28, 0x93, 0x94, 0xfb, 0x52, 0xfc, 0x5c, 0x24, 0x12, - 0x94, 0xff, 0xb4, 0xa4, 0xb4, 0x94, 0xaf, 0xa7, 0x78, 0x83, 0xfe, 0x86, - 0x32, 0xea, 0xad, 0xd2, 0x49, 0xdf, 0xe7, 0x80, 0xaf, 0x55, 0xbf, 0xc8, - 0x03, 0xc4, 0xb3, 0x1c, 0x1f, 0xf8, 0xa1, 0xf7, 0xce, 0x3c, 0x4c, 0x76, - 0x5e, 0xf6, 0x63, 0x90, 0xc3, 0xcf, 0x14, 0x30, 0xca, 0x2d, 0xab, 0xd2, - 0x4a, 0x99, 0x4f, 0x36, 0x5c, 0xac, 0xa4, 0x39, 0x3f, 0x7a, 0x19, 0xc4, - 0xfd, 0xa5, 0x6c, 0x17, 0x4f, 0x0f, 0x57, 0x35, 0x2c, 0xdd, 0xe3, 0x44, - 0x1f, 0xee, 0x49, 0x42, 0x2e, 0x01, 0xa8, 0x22, 0x14, 0x14, 0x66, 0x8e, - 0x97, 0x87, 0x3c, 0x75, 0xc5, 0x1c, 0x56, 0xc5, 0x86, 0x29, 0x8c, 0xcd, - 0x6a, 0x2b, 0x56, 0xbb, 0x16, 0x2a, 0xb4, 0x38, 0x1e, 0xe6, 0xee, 0x47, - 0x27, 0x9f, 0x92, 0xa4, 0xbd, 0xe1, 0x20, 0xbc, 0x76, 0x0d, 0x28, 0x11, - 0x87, 0x4f, 0x47, 0x4f, 0xbc, 0x61, 0xaf, 0xed, 0xb3, 0x61, 0x96, 0x0a, - 0x3b, 0x87, 0x51, 0x27, 0xe3, 0x7c, 0x07, 0x89, 0x30, 0xed, 0xcf, 0xa0, - 0x1b, 0x25, 0x79, 0xab, 0xb7, 0xd6, 0x92, 0xa6, 0x0c, 0x60, 0xe5, 0x53, - 0x53, 0x09, 0x08, 0x68, 0x55, 0x55, 0x78, 0xfa, 0x6f, 0x30, 0xa6, 0x7b, - 0x9a, 0xfe, 0x10, 0xda, 0x32, 0x28, 0xa7, 0x17, 0x1a, 0x7f, 0x53, 0x7a, - 0xd6, 0x64, 0x9b, 0x9c, 0xd6, 0xbb, 0xd0, 0xe4, 0x16, 0x6a, 0x95, 0x3d, - 0xad, 0x22, 0x89, 0x57, 0x6d, 0x52, 0x57, 0xec, 0xc2, 0xe6, 0xd0, 0xd1, - 0x11, 0xe1, 0xbc, 0xfe, 0xff, 0x0b, 0xfb, 0xe1, 0x09, 0x2a, 0x47, 0x8d, - 0x36, 0xb8, 0xde, 0x6c, 0xbc, 0x3d, 0x01, 0x9b, 0xfb, 0xb0, 0x12, 0x81, - 0xd5, 0x14, 0xa5, 0xda, 0xa0, 0xcb, 0xbb, 0xc3, 0xfa, 0x09, 0xbe, 0x9d, - 0x1c, 0x47, 0xb0, 0x6b, 0xc6, 0xc4, 0xe3, 0x2b, 0x31, 0x37, 0x16, 0x05, - 0x07, 0x6f, 0x0c, 0x79, 0x9b, 0xe6, 0x76, 0x27, 0x20, 0x88, 0xfd, 0xb3, - 0x8c, 0x4d, 0x71, 0xda, 0xd0, 0x88, 0xab, 0xa6, 0x9e, 0x04, 0x0a, 0xe8, - 0x5d, 0x57, 0xc8, 0x81, 0x3c, 0x25, 0x19, 0x81, 0xb4, 0x76, 0x55, 0x13, - 0xda, 0x84, 0x45, 0xd4, 0xee, 0x31, 0xb8, 0x0f, 0xfd, 0x85, 0x21, 0x9b, - 0x43, 0xf8, 0x2c, 0x0c, 0x45, 0x78, 0xd1, 0xb0, 0x4c, 0x87, 0x0c, 0xcb, - 0x54, 0x74, 0x2c, 0xc7, 0xea, 0xc0, 0x5f, 0xa3, 0x11, 0xb8, 0xe9, 0x82, - 0xde, 0x75, 0x63, 0xac, 0xb4, 0xf7, 0x4b, 0x00, 0x45, 0x43, 0x7d, 0x60, - 0x81, 0x25, 0x26, 0xab, 0x2d, 0x54, 0xe1, 0x7d, 0x1b, 0x97, 0x50, 0x1c, - 0xd8, 0x27, 0x5c, 0xb2, 0x33, 0xdf, 0x2b, 0x3e, 0xab, 0xd2, 0x68, 0x84, - 0xec, 0x02, 0xbe, 0x68, 0x70, 0x70, 0xf7, 0x97, 0x63, 0x4f, 0x61, 0x65, - 0x9c, 0xf8, 0xf4, 0x45, 0x6c, 0x3d, 0x3a, 0xd2, 0x17, 0x9d, 0x2e, 0x35, - 0x70, 0x20, 0xf5, 0xc8, 0xe7, 0xc1, 0xf5, 0x7a, 0x7d, 0x6c, 0xeb, 0xd3, - 0x00, 0x92, 0x8d, 0xdd, 0xd4, 0x82, 0xea, 0x27, 0xac, 0x1c, 0xc0, 0x8e, - 0x39, 0x41, 0x20, 0xe7, 0x09, 0xcf, 0x07, 0x2c, 0x66, 0xe6, 0xe2, 0x9c, - 0x31, 0x4c, 0x17, 0x47, 0xe3, 0xe4, 0xb5, 0x5e, 0xe0, 0xba, 0x61, 0xe4, - 0x61, 0x86, 0x7c, 0x13, 0xb4, 0x45, 0xdf, 0x8e, 0x64, 0xa1, 0x58, 0x5c, - 0x50, 0xd0, 0xda, 0x5b, 0xca, 0x58, 0x81, 0x29, 0x9a, 0x83, 0x8e, 0x6b, - 0x59, 0x64, 0x53, 0xe8, 0x71, 0xe9, 0x6c, 0xa5, 0x46, 0x9e, 0x1a, 0x09, - 0x7b, 0xad, 0x3f, 0x36, 0x25, 0xdb, 0x44, 0x47, 0xa1, 0x2e, 0xc4, 0x23, - 0x0a, 0x85, 0xa1, 0x31, 0x4e, 0x0e, 0xd6, 0x70, 0x84, 0x3f, 0x02, 0xfd, - 0x33, 0xac, 0x0b, 0x68, 0xe9, 0x07, 0xfe, 0x4c, 0x68, 0xe5, 0xa8, 0x2d, - 0xae, 0x5b, 0x0f, 0x95, 0x9d, 0x66, 0x0e, 0xdd, 0x46, 0xf0, 0xac, 0x3f, - 0xed, 0xe2, 0xc0, 0xf2, 0xe0, 0xc6, 0x0d, 0x31, 0x44, 0x61, 0x08, 0xee, - 0x36, 0xde, 0x43, 0x27, 0x5f, 0x6b, 0x99, 0x27, 0xc1, 0x3f, 0xff, 0x35, - 0x8c, 0xa6, 0x95, 0xc5, 0xb9, 0x62, 0x05, 0x05, 0xc1, 0xa0, 0xdd, 0x1d, - 0x63, 0xbc, 0x11, 0x4a, 0xf6, 0x63, 0x3a, 0x1e, 0x60, 0xd6, 0xc6, 0xac, - 0xc9, 0x3f, 0x55, 0xa6, 0xeb, 0xac, 0xc1, 0x50, 0xc7, 0x2e, 0xdb, 0xb6, - 0x7d, 0xaf, 0x4b, 0x4c, 0xea, 0xe5, 0x75, 0x3c, 0x1a, 0xde, 0xf9, 0x76, - 0x51, 0x0e, 0xf9, 0x26, 0xef, 0xae, 0x9b, 0xb1, 0xf0, 0xac, 0x24, 0x17, - 0xb0, 0x53, 0x1d, 0x56, 0x1c, 0x45, 0x95, 0x30, 0x50, 0x67, 0x5b, 0xb9, - 0xe5, 0x66, 0x8b, 0x6a, 0xa3, 0xd3, 0xdd, 0xdb, 0xfa, 0xac, 0x05, 0x6a, - 0x7d, 0x41, 0x79, 0x57, 0x8e, 0x5a, 0xe8, 0x63, 0xb5, 0xca, 0xe1, 0x26, - 0x89, 0xb7, 0x60, 0x7e, 0x06, 0x96, 0x66, 0xd9, 0x1d, 0xf2, 0xbf, 0xce, - 0x1e, 0x8b, 0x5b, 0x16, 0xd9, 0xa4, 0x4c, 0xe8, 0xbb, 0xad, 0xf6, 0x95, - 0x7a, 0x4a, 0xd5, 0x89, 0x81, 0x3a, 0x88, 0xa0, 0xe4, 0x00, 0xc0, 0x7c, - 0xe4, 0x0e, 0xf9, 0x43, 0xf3, 0x37, 0xea, 0xb4, 0x49, 0x3d, 0xe8, 0xeb, - 0xfa, 0xfa, 0x70, 0x7f, 0x63, 0x15, 0xe6, 0xd5, 0xac, 0xa8, 0xca, 0xe5, - 0x86, 0xc7, 0x92, 0x3b, 0x5f, 0x84, 0x3c, 0xba, 0x6d, 0x7e, 0xf6, 0x52, - 0x48, 0x4d, 0x8a, 0x51, 0x80, 0x8d, 0x7e, 0xaf, 0xbf, 0xcb, 0x3a, 0x10, - 0xc2, 0x06, 0xe2, 0xbb, 0x16, 0x8c, 0xb1, 0x9e, 0x06, 0x1e, 0x6d, 0x4b, - 0x88, 0x8a, 0xf4, 0x78, 0x5f, 0x0e, 0x73, 0x4d, 0x7d, 0xcd, 0x32, 0x77, - 0x9a, 0x5c, 0x02, 0x85, 0x71, 0x9e, 0xa1, 0xb5, 0x8c, 0xb8, 0x8e, 0xa3, - 0xd6, 0x17, 0x7a, 0xd4, 0xa9, 0xb5, 0x5e, 0x24, 0xaa, 0x05, 0x13, 0x3d, - 0x59, 0x7f, 0x6e, 0x98, 0xdd, 0x1d, 0xa2, 0xd7, 0xdb, 0xa4, 0x7b, 0xe2, - 0x78, 0xf4, 0xd0, 0xe9, 0x2b, 0xc8, 0x6b, 0xb1, 0x84, 0x47, 0x99, 0x7e, - 0xe1, 0x13, 0x1b, 0x5f, 0xd7, 0x60, 0xc2, 0xb6, 0x98, 0x5c, 0x1b, 0x9d, - 0x58, 0x21, 0xc0, 0xa6, 0x72, 0xfe, 0xe5, 0xeb, 0x22, 0x76, 0x34, 0xe9, - 0x68, 0x77, 0x50, 0xed, 0xfe, 0x01, 0xce, 0x2d, 0x71, 0x9d, 0xae, 0xcf, - 0xde, 0xb4, 0x11, 0x68, 0x56, 0x64, 0xd2, 0x1c, 0x4f, 0x72, 0x85, 0x4a, - 0x3c, 0x59, 0x36, 0x42, 0x38, 0x25, 0xdb, 0xe2, 0x7f, 0xfc, 0xdc, 0xf9, - 0x0b, 0x19, 0x0b, 0x39, 0x37, 0xfc, 0x7e, 0x77, 0x40, 0x86, 0xf4, 0xd3, - 0xf0, 0x42, 0xbf, 0x9c, 0x52, 0xee, 0x38, 0xbe, 0x82, 0x2f, 0x5a, 0xfa, - 0x63, 0xca, 0xdc, 0x66, 0xe1, 0xcb, 0x4f, 0xbe, 0x57, 0xd6, 0xb8, 0x5a, - 0xbe, 0x8e, 0x38, 0x2a, 0x17, 0x1f, 0x4c, 0xac, 0x21, 0x9f, 0x14, 0xe8, - 0x89, 0x51, 0x9f, 0x69, 0x1b, 0x78, 0xd5, 0xd6, 0x47, 0x0c, 0x4b, 0x6e, - 0x0e, 0xe2, 0x35, 0x9a, 0xb0, 0x16, 0x44, 0x24, 0xc1, 0x70, 0x89, 0xda, - 0x10, 0xb8, 0xfd, 0xcc, 0x84, 0x2b, 0x92, 0x0d, 0x30, 0xcd, 0x21, 0xe9, - 0x4a, 0x3c, 0x96, 0x2a, 0xee, 0x37, 0xcc, 0x81, 0xe2, 0xf7, 0x0d, 0xb2, - 0xe8, 0x51, 0x90, 0x6f, 0x93, 0x0d, 0x39, 0x80, 0x01, 0x5b, 0xf6, 0xe3, - 0x71, 0xd6, 0xa0, 0xc4, 0x4e, 0x3d, 0x48, 0x47, 0x7f, 0x5e, 0x25, 0x57, - 0x94, 0xcc, 0x20, 0xca, 0xdf, 0x68, 0x15, 0x8e, 0x88, 0x43, 0xa8, 0x24, - 0x9f, 0x39, 0xc9, 0xcb, 0xe9, 0xe3, 0x8a, 0x0f, 0x96, 0x3c, 0xe4, 0x80, - 0x02, 0xd3, 0xc2, 0xd2, 0xa4, 0x75, 0xa9, 0x8c, 0x91, 0x00, 0x16, 0x3a, - 0x44, 0xcc, 0x3d, 0xe6, 0x23, 0x49, 0x38, 0x23, 0xb2, 0xce, 0x74, 0xd8, - 0x39, 0x00, 0x3a, 0x0a, 0x54, 0x44, 0x68, 0xc7, 0x99, 0xa8, 0x61, 0x13, - 0x1c, 0xee, 0x2a, 0xb6, 0x09, 0x0d, 0x65, 0x1e, 0x7f, 0x73, 0xe4, 0xab, - 0x2a, 0x02, 0x29, 0xe5, 0xab, 0xb8, 0xd9, 0xac, 0x67, 0xca, 0x12, 0xe0, - 0x3a, 0xc3, 0x3d, 0x56, 0xf3, 0x66, 0x1d, 0x2b, 0xab, 0x49, 0xc0, 0xd9, - 0x90, 0x57, 0x45, 0x86, 0x5e, 0x95, 0x32, 0x39, 0x79, 0x4a, 0x28, 0x1b, - 0x05, 0x8b, 0xdb, 0x52, 0x6e, 0x5f, 0xaa, 0x7f, 0xfa, 0x73, 0x4f, 0xf1, - 0xd5, 0x06, 0x8c, 0xfd, 0x0a, 0x84, 0x1d, 0x5f, 0x84, 0xc3, 0xf6, 0xbb, - 0x73, 0x3c, 0xd9, 0xc2, 0x05, 0xa1, 0x67, 0xa2, 0x19, 0x3c, 0x6a, 0x70, - 0x1c, 0xa1, 0xcc, 0x00, 0x1f, 0x2e, 0x46, 0x2a, 0xf5, 0x14, 0xae, 0xef, - 0x2e, 0xca, 0xb3, 0xfc, 0x31, 0x40, 0xb6, 0xa8, 0xd1, 0x52, 0xc3, 0x77, - 0xf1, 0x56, 0x70, 0xbe, 0xe3, 0x5a, 0x4a, 0x4e, 0x83, 0x08, 0x9d, 0x98, - 0xbb, 0x2c, 0x1b, 0x68, 0x76, 0x33, 0x02, 0xd5, 0x74, 0xbb, 0x67, 0x96, - 0xcc, 0xb8, 0x00, 0xa2, 0x84, 0x55, 0x5a, 0xf7, 0x97, 0xff, 0x91, 0x0a, - 0xa7, 0x5f, 0xdc, 0x53, 0xc8, 0x02, 0xc4, 0x43, 0xec, 0x54, 0x12, 0x62, - 0xb2, 0x9d, 0x4c, 0x6f, 0x00, 0xae, 0x6a, 0x8d, 0xfd, 0x92, 0xb8, 0xdd, - 0x71, 0x0c, 0xae, 0xc4, 0x2e, 0x6c, 0xf2, 0x12, 0xe5, 0xff, 0x4e, 0x12, - 0x48, 0x2f, 0xe4, 0x50, 0x98, 0x38, 0xb3, 0x35, 0x6b, 0xd1, 0x03, 0x85, - 0xfd, 0xd5, 0xcd, 0xb6, 0x78, 0x21, 0x23, 0xfd, 0xc1, 0xff, 0x42, 0x79, - 0x63, 0xd1, 0x5c, 0xe0, 0x3d, 0xde, 0x0b, 0x99, 0xf1, 0xd3, 0x54, 0x11, - 0x6c, 0xb1, 0x2c, 0xa6, 0x47, 0xdf, 0x91, 0xe4, 0xc3, 0x8f, 0x00, 0xea, - 0xfd, 0xd6, 0x6b, 0x05, 0x2f, 0x26, 0x9f, 0x58, 0x9e, 0xae, 0xb3, 0xb2, - 0x8b, 0xff, 0x96, 0x03, 0x67, 0x4b, 0xd0, 0xef, 0x7b, 0x32, 0xdb, 0xb1, - 0x49, 0xe4, 0x0d, 0xd6, 0x5a, 0x2b, 0x64, 0x6e, 0x1a, 0x61, 0x29, 0x71, - 0x49, 0x60, 0xe9, 0x09, 0x8d, 0x8e, 0x00, 0x9f, 0xa4, 0x64, 0x94, 0xe0, - 0xc6, 0xfe, 0x8c, 0x0a, 0x56, 0x34, 0x02, 0xdc, 0x30, 0x46, 0xcd, 0xad, - 0x4b, 0xab, 0x42, 0x68, 0xe3, 0x58, 0xd7, 0x10, 0x1e, 0x5a, 0x22, 0xe7, - 0x15, 0x0a, 0x0e, 0xd1, 0x22, 0x87, 0xc3, 0x57, 0xcc, 0xf8, 0xbb, 0xf1, - 0xc0, 0x1f, 0x1b, 0x84, 0x51, 0xda, 0x99, 0x50, 0x46, 0x6e, 0xf7, 0xbc, - 0xdf, 0xa7, 0x30, 0x23, 0x17, 0x76, 0x03, 0xf7, 0xb7, 0x7a, 0x0b, 0x90, - 0xae, 0xbd, 0x8f, 0x5f, 0xf5, 0xbc, 0xef, 0xe1, 0x8d, 0x7f, 0x98, 0xe0, - 0x9c, 0x3f, 0x9b, 0x21, 0xb7, 0x3b, 0x54, 0x47, 0x1c, 0x09, 0xc3, 0x34, - 0x25, 0x2a, 0xed, 0xc4, 0xe8, 0x0c, 0xa9, 0xac, 0xe5, 0xac, 0xf1, 0x22, - 0x05, 0x6c, 0x29, 0xb5, 0xc5, 0xef, 0xff, 0x22, 0x71, 0x5f, 0xed, 0xd8, - 0x29, 0x89, 0x41, 0x48, 0x0d, 0x1d, 0xed, 0x66, 0x58, 0xec, 0x53, 0xec, - 0xcc, 0x44, 0x50, 0xdc, 0xb8, 0x78, 0x65, 0x57, 0x0e, 0xfb, 0xb4, 0xcd, - 0x25, 0x57, 0x51, 0xbe, 0x41, 0x9f, 0x24, 0x36, 0x56, 0x95, 0x12, 0x25, - 0x60, 0x49, 0xe1, 0xb8, 0xa2, 0xf2, 0x05, 0x8c, 0x1f, 0x85, 0x0a, 0xd6, - 0x8b, 0xbf, 0xb9, 0x03, 0xb9, 0xbe, 0x3c, 0x88, 0xa8, 0xe1, 0x92, 0x68, - 0x4f, 0x83, 0xad, 0xcb, 0x0f, 0x91, 0xa3, 0x22, 0x58, 0xcc, 0x33, 0x22, - 0x9b, 0xcd, 0x80, 0x06, 0xcc, 0x1e, 0x6d, 0xf2, 0xa4, 0x87, 0xb7, 0xfc, - 0xca, 0xa1, 0x90, 0xdf, 0xa9, 0x87, 0x44, 0xbc, 0x9e, 0xd0, 0xf9, 0x87, - 0x02, 0xb6, 0x8a, 0xaf, 0xd6, 0x68, 0x27, 0x00, 0x6a, 0x4f, 0xe7, 0x00, - 0x0f, 0x6a, 0x8b, 0x4b, 0x6d, 0x75, 0x5b, 0x0f, 0xab, 0xc2, 0x50, 0x59, - 0x39, 0x6f, 0xfd, 0xb8, 0xb6, 0x29, 0x64, 0x48, 0x7f, 0x60, 0x0d, 0x28, - 0xee, 0x26, 0xb5, 0x88, 0x12, 0x3d, 0x22, 0xaf, 0x65, 0x24, 0x0e, 0x7f, - 0x1c, 0x8a, 0x00, 0xb9, 0x25, 0x77, 0x86, 0xba, 0x78, 0xc8, 0x13, 0x2b, - 0x15, 0xbc, 0x25, 0x91, 0x9e, 0x91, 0x40, 0x51, 0x17, 0x86, 0x7a, 0xd3, - 0x2f, 0x8c, 0xc4, 0x8e, 0x09, 0xc0, 0x85, 0x87, 0x42, 0x74, 0x49, 0x4e, - 0x19, 0x84, 0x0b, 0xbe, 0xb5, 0x57, 0xe5, 0x6e, 0xc3, 0x97, 0x9c, 0xb9, - 0x7d, 0xd2, 0xee, 0xf1, 0x29, 0xbd, 0xc2, 0xdf, 0xe9, 0x6f, 0x76, 0x01, - 0xa6, 0xc0, 0x41, 0xb8, 0xd6, 0x21, 0xc4, 0x4f, 0xb8, 0x8e, 0x1d, 0x28, - 0xd6, 0x06, 0x29, 0x01, 0x2a, 0x21, 0x90, 0xe5, 0x77, 0xe6, 0xcc, 0x90, - 0xab, 0xca, 0x31, 0x45, 0xc3, 0x74, 0xfa, 0xf5, 0x75, 0xa0, 0xdb, 0x17, - 0x6d, 0x39, 0x63, 0xe5, 0xad, 0x97, 0xa2, 0xa5, 0xda, 0xa0, 0xb5, 0x61, - 0x90, 0xfe, 0x55, 0x23, 0xab, 0x4b, 0x71, 0x5c, 0x8b, 0x43, 0x16, 0xd8, - 0x94, 0x51, 0xac, 0x0c, 0xd7, 0x4f, 0xf4, 0x0c, 0xc1, 0xe3, 0xa8, 0xa0, - 0xa0, 0x8f, 0xcf, 0x51, 0xaf, 0xf6, 0xfa, 0x2d, 0x22, 0x57, 0x5f, 0x21, - 0xe5, 0x40, 0x66, 0xe2, 0xe1, 0x19, 0x1d, 0x9e, 0xec, 0xcd, 0x29, 0xb6, - 0x1e, 0x29, 0x2a, 0x63, 0x3f, 0xe6, 0xf5, 0xec, 0xe7, 0x48, 0x34, 0xe7, - 0xe7, 0x5c, 0x98, 0x41, 0x0e, 0xc2, 0x57, 0xf3, 0x47, 0x63, 0xa9, 0xe3, - 0x74, 0x41, 0x26, 0x07, 0xbc, 0x03, 0xff, 0x51, 0xad, 0xde, 0x61, 0xbb, - 0xd2, 0x67, 0xac, 0x11, 0x4d, 0x21, 0x27, 0x36, 0x8b, 0x9f, 0xc7, 0xf0, - 0x3f, 0x8a, 0x01, 0xcc, 0xcf, 0xc7, 0xb8, 0x9d, 0xc1, 0x25, 0xe0, 0xf0, - 0xc1, 0x3b, 0xe3, 0xf5, 0x24, 0xfe, 0x22, 0xeb, 0xc2, 0x90, 0x02, 0xde, - 0x0e, 0xef, 0x0e, 0x65, 0x68, 0x0f, 0x96, 0x1b, 0xfb, 0xf7, 0xaf, 0x8d, - 0x57, 0x72, 0xb5, 0x9c, 0xfd, 0xf9, 0x0e, 0x85, 0xc4, 0xd5, 0xcb, 0x91, - 0x5d, 0x7d, 0x2f, 0xdf, 0x0f, 0x8b, 0xdc, 0x42, 0x6a, 0x5a, 0x59, 0xbf, - 0xa6, 0x41, 0x21, 0x09, 0x44, 0x60, 0x98, 0x89, 0xf9, 0x34, 0x5e, 0xae, - 0x46, 0xe3, 0x59, 0x38, 0x2f, 0x40, 0xc5, 0xf4, 0xc7, 0x99, 0x64, 0x12, - 0x15, 0xa1, 0x92, 0x82, 0x8c, 0x31, 0xa8, 0xfd, 0x12, 0x87, 0x65, 0x45, - 0xec, 0x0f, 0xaf, 0x4e, 0x43, 0xcb, 0x78, 0x3b, 0xf2, 0x74, 0x59, 0x1b, - 0x0c, 0xc0, 0x39, 0xe2, 0x38, 0x3d, 0x5b, 0x3e, 0x62, 0xd3, 0x70, 0xb5, - 0x71, 0xde, 0x6d, 0x70, 0xd0, 0x6a, 0xf5, 0xa6, 0x16, 0xd1, 0x5d, 0xb1, - 0xe5, 0xc9, 0xe4, 0x45, 0xc6, 0xa0, 0x90, 0x43, 0xca, 0xd7, 0x2a, 0x9c, - 0x22, 0x07, 0xdf, 0x81, 0x66, 0xbd, 0xc7, 0x92, 0x74, 0x0e, 0x7a, 0x53, - 0xbc, 0x5d, 0x50, 0x1a, 0x12, 0xb6, 0xa0, 0x2f, 0x70, 0xa4, 0xab, 0x97, - 0x51, 0x6f, 0x64, 0x42, 0xfd, 0xf0, 0x68, 0xd7, 0x62, 0x0c, 0xd5, 0x2c, - 0xec, 0x21, 0xd5, 0x52, 0xda, 0x78, 0x20, 0xe9, 0x58, 0x22, 0xbd, 0x65, - 0x76, 0x80, 0x2e, 0x37, 0xd4, 0x9a, 0x3b, 0x2a, 0x73, 0x0b, 0xd0, 0xe1, - 0x63, 0x08, 0xf4, 0x35, 0x0c, 0x68, 0x6c, 0x5b, 0xef, 0x6b, 0x5f, 0xf9, - 0xd4, 0xa2, 0x2c, 0xea, 0xc9, 0x29, 0x64, 0x67, 0xb7, 0x21, 0x7b, 0x41, - 0xd7, 0x8a, 0xf9, 0xca, 0x52, 0x8e, 0x9c, 0x7b, 0xf0, 0x5c, 0xc5, 0xbd, - 0x4a, 0xd7, 0x13, 0xdd, 0x59, 0x60, 0x5e, 0x2f, 0xba, 0xca, 0xcd, 0x58, - 0x1d, 0x72, 0xa4, 0x89, 0x30, 0xea, 0x19, 0xcc, 0x4c, 0xb0, 0x4f, 0xe6, - 0x68, 0x47, 0x9a, 0xb9, 0x40, 0xc5, 0x81, 0xbb, 0x8d, 0x67, 0x82, 0xd8, - 0x1b, 0xda, 0xab, 0x6d, 0x38, 0xf2, 0xbf, 0x18, 0x3c, 0x05, 0xab, 0xce, - 0xa7, 0x90, 0x49, 0x25, 0xb3, 0x34, 0x1c, 0x28, 0x88, 0x6c, 0xc8, 0x8f, - 0x20, 0x60, 0x6e, 0xd8, 0xa3, 0xbb, 0x45, 0xcc, 0x77, 0x9f, 0xce, 0x65, - 0x13, 0x48, 0xb9, 0x09, 0xe6, 0x6c, 0xae, 0x55, 0x35, 0xf2, 0x77, 0xc3, - 0x6f, 0x49, 0x67, 0x99, 0x2d, 0xa6, 0x64, 0x55, 0x71, 0xf0, 0xba, 0x58, - 0x2e, 0x14, 0xcc, 0xae, 0x50, 0x3b, 0x97, 0xfe, 0x73, 0x3d, 0xb0, 0xde, - 0x7f, 0x51, 0xdd, 0x00, 0xfb, 0x23, 0x43, 0xde, 0x34, 0x95, 0x88, 0xd6, - 0x6c, 0x85, 0x50, 0x82, 0x71, 0x3e, 0xa9, 0xc5, 0xd3, 0x50, 0x85, 0x5f, - 0xc4, 0x3f, 0xa9, 0x27, 0xcd, 0xa6, 0xb3, 0x6c, 0x85, 0xd4, 0x75, 0x86, - 0xfb, 0xa9, 0xd9, 0x67, 0xa0, 0xd3, 0x02, 0x80, 0xb6, 0xbf, 0x98, 0xb9, - 0xfb, 0x14, 0x59, 0xde, 0x8b, 0xfd, 0xdc, 0x27, 0xee, 0x5f, 0x2b, 0xcd, - 0xa0, 0x6c, 0x60, 0xb1, 0xb3, 0xcc, 0x60, 0x3a, 0x11, 0xb1, 0xe2, 0x18, - 0x82, 0x8d, 0x8f, 0x02, 0xf6, 0xba, 0x1f, 0xde, 0x9f, 0x17, 0xa5, 0x14, - 0xfe, 0xe6, 0x76, 0xb4, 0x8d, 0xa9, 0x57, 0x08, 0xe7, 0x1a, 0xbc, 0xa9, - 0x6a, 0xb3, 0x7a, 0x01, 0x0d, 0xd2, 0x4d, 0x23, 0xae, 0x3d, 0x51, 0xb4, - 0xac, 0x05, 0x9c, 0x0b, 0x9e, 0x38, 0xdb, 0x83, 0x8e, 0x1d, 0x6d, 0x2c, - 0x9e, 0xda, 0x74, 0x75, 0x60, 0x40, 0x1b, 0x2c, 0xc9, 0xd4, 0xff, 0xe6, - 0x11, 0xdc, 0xbc, 0x17, 0xf0, 0x18, 0x24, 0xf4, 0xae, 0xfd, 0xaa, 0x14, - 0x36, 0x5a, 0x43, 0x1b, 0xd8, 0xc2, 0x4b, 0x77, 0x03, 0x67, 0x20, 0x97, - 0x0b, 0x5a, 0xc3, 0x5f, 0x51, 0xd1, 0xfd, 0xd2, 0x37, 0xe8, 0x63, 0x82, - 0x50, 0xe3, 0xe0, 0xd9, 0x10, 0xd2, 0xd4, 0x56, 0x4f, 0x88, 0x9a, 0xdd, - 0x1c, 0xc2, 0xfc, 0x9b, 0x85, 0x19, 0x72, 0xb3, 0xe6, 0xfd, 0xb2, 0x76, - 0x13, 0x1d, 0xc6, 0x5a, 0x79, 0x69, 0x3e, 0xf7, 0xb8, 0xd9, 0xb3, 0x9a, - 0xcb, 0x9b, 0x3e, 0x4d, 0xcb, 0x61, 0x0d, 0x07, 0x87, 0x0a, 0xdf, 0xa7, - 0x3f, 0x15, 0xd7, 0x2e, 0x65, 0x16, 0x93, 0x42, 0x53, 0xb6, 0xd4, 0x8a, - 0x9e, 0x5d, 0x0f, 0x6b, 0x94, 0x5e, 0xf5, 0x7f, 0x9b, 0xd8, 0x7c, 0x94, - 0xc0, 0xce, 0x6a, 0xb3, 0x50, 0x0f, 0x59, 0x74, 0x08, 0x3f, 0x55, 0xc3, - 0xe4, 0xd1, 0xd5, 0x55, 0x12, 0x73, 0xa0, 0xf2, 0x35, 0x0d, 0xc1, 0x36, - 0xe9, 0x1c, 0x49, 0x71, 0xb5, 0xff, 0x6d, 0x3c, 0xe1, 0x16, 0x4f, 0x2f, - 0x7e, 0xd7, 0xe9, 0xc5, 0xb7, 0x06, 0xae, 0xe9, 0xe6, 0x6c, 0xe2, 0x17, - 0x1e, 0xc3, 0x05, 0x1c, 0x4b, 0x48, 0x42, 0xd1, 0x79, 0xce, 0x4c, 0xea, - 0x11, 0xe1, 0x9f, 0x93, 0x78, 0x36, 0x68, 0xc5, 0x82, 0xb7, 0x88, 0x77, - 0xd8, 0x94, 0x2b, 0x77, 0x3d, 0x51, 0xef, 0x3f, 0x74, 0x72, 0x08, 0x62, - 0x30, 0xf5, 0xc9, 0xcc, 0xc3, 0x91, 0xb6, 0xac, 0x9b, 0x35, 0x34, 0x90, - 0xbd, 0x8e, 0x8b, 0xce, 0x51, 0xd1, 0x2d, 0x07, 0x54, 0xc4, 0xba, 0xb8, - 0xce, 0x4c, 0x2d, 0x58, 0xd7, 0x02, 0xf4, 0x9b, 0xc6, 0x57, 0xfe, 0xe3, - 0xab, 0x82, 0x71, 0x96, 0xff, 0x55, 0xc7, 0x85, 0x65, 0x79, 0x08, 0xc0, - 0x62, 0xad, 0xef, 0xbb, 0x8a, 0x47, 0x8c, 0x87, 0x25, 0x93, 0x58, 0xa0, - 0xd4, 0xf6, 0x06, 0xef, 0x96, 0x2b, 0xa0, 0x3c, 0xb2, 0x0b, 0x32, 0x38, - 0xad, 0x64, 0x9b, 0x43, 0xb6, 0x59, 0x78, 0x01, 0x6b, 0x63, 0x68, 0xda, - 0x57, 0x7d, 0x51, 0x75, 0x05, 0x35, 0xf5, 0xa1, 0xb9, 0x54, 0x08, 0x68, - 0xdb, 0xcd, 0xf0, 0x31, 0xf9, 0xe8, 0xbf, 0xe1, 0x24, 0x07, 0x1c, 0x28, - 0x8d, 0x88, 0xd3, 0x44, 0x5b, 0x9f, 0x1e, 0x3a, 0x55, 0x28, 0x74, 0xa1, - 0x29, 0xde, 0x6c, 0x9b, 0x98, 0xd0, 0xdb, 0x35, 0x8e, 0x6c, 0x51, 0xe3, - 0x8f, 0x10, 0xfa, 0x08, 0xa7, 0x99, 0x9e, 0x12, 0x50, 0x2d, 0x7a, 0x39, - 0x30, 0xb2, 0x4a, 0x5e, 0x69, 0x06, 0xec, 0x3d, 0x2a, 0x22, 0xd5, 0x0e, - 0xdb, 0x1b, 0x1c, 0x06, 0x16, 0x3e, 0x75, 0xf8, 0x42, 0xd7, 0x13, 0x15, - 0x87, 0xb1, 0x55, 0xee, 0x1e, 0x17, 0x94, 0xd0, 0x5d, 0xe9, 0x41, 0xc1, - 0x80, 0x9b, 0x6e, 0x7c, 0x97, 0x41, 0x0f, 0xe8, 0x4c, 0xf5, 0x5c, 0x96, - 0xe1, 0x95, 0xaf, 0x21, 0x9b, 0x1c, 0x7c, 0x14, 0x54, 0x08, 0xd5, 0xe1, - 0x01, 0xe5, 0x4c, 0x84, 0x3f, 0x00, 0x0c, 0x65, 0x97, 0xbd, 0xc8, 0xb7, - 0x38, 0xb5, 0xc2, 0x1b, 0xe2, 0xfd, 0xc2, 0xd0, 0x35, 0xdd, 0x35, 0xe7, - 0x18, 0x5f, 0xd7, 0xc5, 0x51, 0x82, 0x64, 0xe9, 0x5a, 0xb0, 0x07, 0x7b, - 0x50, 0x2d, 0x3c, 0x11, 0xa6, 0xe8, 0xbf, 0x66, 0xe2, 0xaf, 0x6e, 0x15, - 0xb1, 0xf0, 0x35, 0x31, 0xe0, 0xae, 0x2d, 0x70, 0x38, 0xab, 0x7e, 0x79, - 0x2c, 0x7c, 0xac, 0xe4, 0x1a, 0x04, 0xd6, 0x74, 0x5f, 0x8c, 0xf2, 0x36, - 0xbc, 0x89, 0x6a, 0x2d, 0x80, 0x15, 0xd3, 0x6f, 0x67, 0x1c, 0x18, 0xac, - 0x82, 0x44, 0xfd, 0x4d, 0x2f, 0x16, 0xf4, 0x73, 0x39, 0x81, 0xd0, 0x64, - 0x70, 0x18, 0xd5, 0xac, 0x1e, 0xfe, 0x91, 0x5d, 0x3b, 0xb7, 0xb7, 0xc9, - 0x87, 0x38, 0xed, 0x12, 0x59, 0xe9, 0xed, 0x7e, 0x09, 0x58, 0x21, 0x2e, - 0x69, 0x17, 0x4f, 0x83, 0x60, 0x7d, 0xd3, 0xdb, 0x6d, 0xe0, 0x12, 0xd2, - 0xb9, 0xf8, 0x8d, 0xd7, 0xe2, 0xb3, 0x8f, 0x67, 0xc2, 0x1c, 0x6e, 0x2b, - 0x1e, 0x56, 0xf1, 0x98, 0x36, 0xbf, 0xce, 0xba, 0xdd, 0xab, 0x73, 0xf7, - 0x6e, 0x7c, 0xcf, 0x5a, 0x41, 0xa5, 0x09, 0x83, 0x5d, 0x22, 0xd5, 0x83, - 0xd7, 0x1d, 0xc8, 0x1b, 0x3e, 0xa0, 0x9b, 0xf6, 0xa8, 0xcd, 0x85, 0xab, - 0x4f, 0x9e, 0xa6, 0x37, 0x13, 0x67, 0xad, 0x05, 0x10, 0x96, 0x59, 0x0f, - 0xc0, 0x86, 0xf0, 0xf0, 0xf4, 0x14, 0x83, 0x40, 0x86, 0x08, 0x69, 0xdd, - 0x22, 0x51, 0x60, 0x0e, 0xc6, 0x31, 0x6e, 0x5e, 0x60, 0xb2, 0x67, 0x61, - 0xe5, 0x34, 0x55, 0x9d, 0x76, 0x30, 0x83, 0x05, 0x23, 0x2b, 0x65, 0x3d, - 0xb4, 0x0a, 0x0d, 0xa0, 0x35, 0x71, 0xe6, 0xe9, 0x15, 0x32, 0x36, 0xe3, - 0xcf, 0xb8, 0x8a, 0x8c, 0xd8, 0xd6, 0x85, 0x95, 0xd6, 0x10, 0x4a, 0x3c, - 0x90, 0x97, 0xb1, 0x78, 0xa6, 0xe5, 0x22, 0x8c, 0x81, 0xc6, 0xeb, 0xbe, - 0xf2, 0x89, 0x1b, 0xa4, 0x97, 0xdd, 0xd3, 0x77, 0xff, 0xfa, 0x01, 0x81, - 0xa0, 0xbb, 0x50, 0xf1, 0x5f, 0x67, 0x39, 0x8c, 0xf8, 0xe2, 0xbb, 0x63, - 0x4c, 0xdd, 0xae, 0xec, 0x12, 0x84, 0x0d, 0xa2, 0xca, 0x4b, 0x0e, 0x8e, - 0xdf, 0xc0, 0xc8, 0xb2, 0x6a, 0x28, 0x11, 0xf3, 0x00, 0xd3, 0x90, 0x06, - 0x00, 0xbe, 0xd3, 0x0d, 0xf8, 0x92, 0xa0, 0xf7, 0x97, 0xd2, 0x77, 0x96, - 0xb9, 0x50, 0xea, 0xf5, 0x10, 0x57, 0xc7, 0xe7, 0xd2, 0x49, 0xec, 0xc7, - 0xcc, 0x3a, 0x85, 0xfd, 0xbf, 0xa5, 0xcc, 0x91, 0x7d, 0x04, 0xfb, 0xc8, - 0x83, 0xf1, 0x7b, 0x4d, 0x9d, 0x4a, 0x19, 0x53, 0xbc, 0xe6, 0xd9, 0x7c, - 0xe5, 0xd2, 0xe1, 0x1e, 0x4d, 0xcc, 0xf3, 0x09, 0x13, 0x3e, 0xda, 0x28, - 0xfa, 0x83, 0x69, 0xc6, 0xbe, 0xaa, 0x5f, 0x05, 0x6e, 0x4b, 0xc6, 0x54, - 0xc4, 0x14, 0xf2, 0x55, 0x9f, 0xa3, 0x5d, 0x39, 0x1b, 0x9e, 0x41, 0x8c, - 0xd8, 0x83, 0xa3, 0xce, 0x42, 0x16, 0x52, 0x35, 0x74, 0x80, 0x5d, 0xbe, - 0x4f, 0x12, 0x8c, 0xf4, 0xce, 0x03, 0x83, 0x94, 0x32, 0xde, 0xe9, 0xde, - 0x52, 0x31, 0xcd, 0x0c, 0x22, 0xba, 0x30, 0x54, 0xfc, 0xd1, 0x8c, 0xce, - 0x8a, 0x75, 0xfd, 0xeb, 0xc3, 0xf4, 0xac, 0x20, 0x67, 0xb8, 0xc7, 0xca, - 0x1e, 0x9b, 0xca, 0xd0, 0x8e, 0x21, 0x40, 0x26, 0xee, 0xfa, 0xd0, 0xd8, - 0x26, 0xb8, 0x24, 0x76, 0xdb, 0x32, 0xbc, 0x56, 0x81, 0x1a, 0xe8, 0xe3, - 0x8a, 0xc4, 0x04, 0x9e, 0x23, 0x48, 0x5a, 0xa0, 0xe9, 0xce, 0x0e, 0x20, - 0xc6, 0xc4, 0x40, 0x49, 0x68, 0xf4, 0x61, 0x5a, 0x1b, 0xdc, 0x2e, 0xe2, - 0xac, 0x9b, 0x4d, 0x4a, 0xd6, 0x5a, 0x25, 0x4c, 0x35, 0x25, 0xf4, 0x51, - 0x98, 0x7a, 0x51, 0xdd, 0x79, 0x11, 0xb3, 0x6e, 0x1c, 0xa9, 0xdd, 0xcf, - 0xf8, 0xcb, 0x0a, 0xa7, 0xc6, 0xfc, 0x3e, 0xcd, 0x91, 0x8c, 0x12, 0xb1, - 0x75, 0x6b, 0xd4, 0x7a, 0x9a, 0x6e, 0x38, 0x2a, 0x11, 0x57, 0xab, 0x15, - 0x9f, 0x9c, 0xdd, 0xcf, 0xab, 0xab, 0x95, 0xe4, 0xdb, 0xf6, 0x19, 0xa5, - 0x74, 0x89, 0xa9, 0xa5, 0x43, 0xbf, 0x9b, 0xb4, 0x96, 0x61, 0xa2, 0x9d, - 0xc8, 0x04, 0x71, 0x06, 0x92, 0xb4, 0x2d, 0xd0, 0xe8, 0x3e, 0x05, 0xd8, - 0xd1, 0xbc, 0xc1, 0x03, 0xbb, 0x1d, 0xcb, 0x5a, 0x23, 0x1f, 0x53, 0x97, - 0x14, 0xd8, 0x73, 0xd3, 0xcb, 0xab, 0xf9, 0x46, 0x96, 0xe8, 0xcd, 0x13, - 0xd6, 0x6f, 0x85, 0xe5, 0xaa, 0x81, 0x71, 0x46, 0x6f, 0xaa, 0xf7, 0xad, - 0x77, 0xa2, 0x20, 0xe5, 0x89, 0x79, 0x8e, 0xd3, 0xbd, 0x3b, 0x8b, 0x2e, - 0x2c, 0xdc, 0x80, 0x4b, 0xd4, 0x8f, 0x6b, 0x5f, 0xde, 0x58, 0x23, 0x16, - 0xf3, 0x4b, 0xd3, 0xdf, 0xa1, 0x71, 0x98, 0xc0, 0xfd, 0x63, 0x64, 0xbb, - 0x6e, 0x6e, 0xe6, 0x0e, 0xc2, 0xdc, 0xdf, 0x36, 0x68, 0x69, 0xc2, 0xbb, - 0xef, 0x0c, 0x85, 0x0f, 0x37, 0x0e, 0xd4, 0x78, 0x79, 0x83, 0x5e, 0xce, - 0xa6, 0xf1, 0x52, 0x17, 0x3f, 0x95, 0xf2, 0x99, 0x55, 0xc7, 0x5f, 0x37, - 0xcd, 0x26, 0xd0, 0xd0, 0x12, 0xcf, 0xcd, 0xf3, 0xa6, 0x1b, 0x28, 0x8b, - 0x53, 0xb1, 0x1b, 0x37, 0x3a, 0x57, 0xcc, 0x33, 0xc0, 0xae, 0xc9, 0x9b, - 0xfa, 0x67, 0xf6, 0x38, 0xd5, 0x3a, 0x0c, 0xf3, 0xec, 0xf3, 0xfd, 0x68, - 0xff, 0x67, 0xdc, 0x7a, 0x8a, 0xc0, 0xc9, 0x26, 0x63, 0xeb, 0xdf, 0xb8, - 0xd9, 0x54, 0xf3, 0xab, 0x19, 0x2b, 0x4e, 0xc4, 0xe4, 0x7f, 0xbf, 0x9e, - 0x97, 0xcf, 0x37, 0xa3, 0x9b, 0xd8, 0x3c, 0xa9, 0x65, 0x09, 0xd6, 0x89, - 0x53, 0x12, 0x1c, 0x8a, 0x75, 0x56, 0x7d, 0x82, 0xbd, 0x1b, 0x34, 0x97, - 0x54, 0x98, 0x37, 0xbc, 0x6a, 0xfb, 0x53, 0xe6, 0x5f, 0xb7, 0xa1, 0x22, - 0x9a, 0xcd, 0xe8, 0x69, 0xf0, 0x76, 0xd9, 0xa8, 0x87, 0x13, 0xf1, 0x4f, - 0x59, 0xe8, 0x69, 0x96, 0x89, 0x8a, 0x2d, 0x57, 0x96, 0x97, 0xa2, 0xd7, - 0xd5, 0x10, 0xd0, 0x07, 0x8f, 0xfb, 0x57, 0x20, 0x4e, 0x16, 0xdf, 0x36, - 0x0d, 0x86, 0x33, 0xef, 0x1c, 0x0d, 0x1b, 0xeb, 0x31, 0x4b, 0xe2, 0xcd, - 0x6e, 0x38, 0x78, 0x41, 0x05, 0x73, 0x4f, 0xeb, 0x6a, 0x5a, 0x30, 0xc2, - 0xc9, 0x47, 0x09, 0xc3, 0x2f, 0x8d, 0x74, 0x5d, 0x61, 0xbf, 0x3b, 0xe7, - 0x7f, 0x02, 0xb7, 0xc2, 0x91, 0xc5, 0x32, 0xae, 0xc2, 0x6d, 0xde, 0x07, - 0x09, 0x4d, 0xd2, 0x4b, 0x9d, 0xae, 0xc3, 0xaf, 0x49, 0x75, 0x5b, 0x17, - 0x4a, 0xaf, 0xb4, 0xcf, 0xc6, 0x31, 0xd8, 0xc9, 0x4c, 0xd1, 0xce, 0x15, - 0x5b, 0xbc, 0x4f, 0xfc, 0xaf, 0xf5, 0xab, 0x80, 0xda, 0x25, 0x92, 0x64, - 0xdb, 0xf4, 0x8e, 0xb8, 0x0b, 0x53, 0x60, 0x5e, 0x84, 0xa7, 0x9e, 0x23, - 0x7f, 0xca, 0x4c, 0x5f, 0x69, 0x5a, 0xbc, 0xda, 0x27, 0x68, 0xde, 0x25, - 0x62, 0x6c, 0xea, 0x4c, 0x99, 0x5b, 0xc8, 0xc3, 0x3b, 0xb0, 0xb1, 0x32, - 0x94, 0x64, 0x87, 0x0c, 0xb8, 0x7e, 0xbb, 0x28, 0xf2, 0x0d, 0xf0, 0x74, - 0x26, 0x51, 0x7f, 0x3d, 0xa6, 0xd9, 0x41, 0xe1, 0x8a, 0x52, 0x91, 0xa9, - 0xb0, 0x14, 0x87, 0x65, 0x37, 0xfc, 0xa6, 0xd3, 0x77, 0x98, 0x6b, 0xef, - 0xa5, 0x84, 0x3b, 0x33, 0xdc, 0x55, 0x4f, 0x3e, 0x4a, 0xf4, 0xb9, 0x14, - 0xbe, 0x56, 0xb4, 0x7c, 0xc0, 0x2d, 0x7e, 0xc2, 0x93, 0x77, 0x62, 0xf0, - 0xb0, 0x6e, 0xf9, 0xf2, 0xa0, 0xbe, 0x04, 0x8f, 0x90, 0xec, 0xa3, 0x3c, - 0x36, 0xbb, 0x13, 0x83, 0x13, 0x2c, 0xe3, 0xc7, 0x41, 0x68, 0x57, 0xaf, - 0x7d, 0x72, 0x49, 0x44, 0x18, 0xef, 0x28, 0x82, 0xf2, 0xc3, 0x13, 0x85, - 0xb0, 0x8a, 0x51, 0xc3, 0x02, 0xef, 0xa4, 0x91, 0x03, 0x0a, 0x04, 0x24, - 0x69, 0xea, 0xaf, 0x4a, 0x7b, 0x93, 0xad, 0xcc, 0x27, 0xdd, 0xd4, 0x29, - 0xb0, 0xc5, 0x11, 0xa4, 0xa5, 0xbd, 0x3d, 0x60, 0x23, 0xd7, 0x40, 0x5d, - 0xea, 0x30, 0xd2, 0xe0, 0x1f, 0x24, 0x34, 0x27, 0x8c, 0xc6, 0x2d, 0x1e, - 0x85, 0x55, 0x9a, 0x9b, 0xa1, 0x4c, 0x95, 0x9f, 0xde, 0xfa, 0x9b, 0xcd, - 0xd4, 0xcc, 0x62, 0x03, 0xb5, 0x02, 0x54, 0xab, 0x12, 0xbf, 0x1b, 0x40, - 0x15, 0xa7, 0x49, 0x5c, 0x18, 0x8c, 0x24, 0xa0, 0x11, 0xef, 0xa6, 0xd4, - 0xd4, 0x0b, 0x50, 0x54, 0x17, 0x98, 0xde, 0x1d, 0x4d, 0xe8, 0x79, 0x2c, - 0xb0, 0x65, 0x16, 0x18, 0x3f, 0xce, 0x63, 0xe2, 0x58, 0xcd, 0xbb, 0x1e, - 0xd6, 0xf1, 0xb5, 0xfc, 0x3f, 0xd1, 0x9f, 0x28, 0xf4, 0x98, 0x36, 0x93, - 0x0a, 0x39, 0xed, 0x7a, 0x74, 0x73, 0x4e, 0x1f, 0x65, 0x6a, 0xcb, 0x46, - 0x81, 0x46, 0xee, 0x61, 0x9b, 0xf5, 0xf7, 0x2a, 0xb6, 0xac, 0x44, 0xfb, - 0xc9, 0xa8, 0xa8, 0xdf, 0x56, 0x7d, 0xc3, 0x87, 0xf4, 0x26, 0xbc, 0xac, - 0xfd, 0x55, 0x3d, 0x8e, 0x88, 0xe9, 0x65, 0x6f, 0x85, 0xc5, 0x44, 0x4f, - 0xf0, 0x84, 0x02, 0xb3, 0x18, 0x72, 0x2a, 0x53, 0x3d, 0xe6, 0xa9, 0xeb, - 0x19, 0x34, 0x36, 0x02, 0x0e, 0x03, 0xbd, 0x99, 0x95, 0x18, 0xd7, 0x5b, - 0xbd, 0xb0, 0x6d, 0xae, 0x00, 0x6f, 0x1a, 0x27, 0x64, 0xf8, 0xd2, 0x22, - 0xd4, 0x7c, 0x0b, 0x07, 0xe2, 0xf8, 0x92, 0x42, 0xd0, 0xad, 0x98, 0xda, - 0x16, 0xce, 0xbc, 0x8d, 0x5c, 0x77, 0xf6, 0x07, 0xde, 0x91, 0xea, 0x75, - 0x75, 0xdb, 0xd6, 0x9d, 0xd1, 0x0b, 0x69, 0xb5, 0xb7, 0x15, 0x95, 0x70, - 0xc3, 0x7a, 0x80, 0x1e, 0x49, 0xcd, 0x49, 0x87, 0x64, 0x1a, 0x1f, 0x8c, - 0x6f, 0x5a, 0x82, 0x42, 0x97, 0x6c, 0x64, 0x6e, 0xa5, 0x6c, 0xd1, 0x5b, - 0xee, 0x26, 0xa1, 0x61, 0x03, 0x9c, 0xae, 0x9b, 0x20, 0x63, 0x98, 0x0c, - 0x03, 0x37, 0x4f, 0xe2, 0x78, 0x9e, 0x75, 0x22, 0x5c, 0x38, 0x1e, 0xe3, - 0xf8, 0xd5, 0x60, 0xcc, 0x1f, 0x20, 0x43, 0x67, 0xa3, 0xbc, 0x36, 0xba, - 0xd8, 0x09, 0x31, 0x26, 0x2d, 0x38, 0x5d, 0x28, 0x33, 0xd6, 0xc3, 0x28, - 0xe1, 0x8b, 0x12, 0xf6, 0x2b, 0x03, 0xcb, 0xb1, 0x65, 0x99, 0x9a, 0xf3, - 0x1f, 0x48, 0x25, 0x69, 0xd0, 0x9d, 0x4c, 0x80, 0xa3, 0x32, 0x3a, 0x3f, - 0x93, 0xb4, 0xd6, 0x1c, 0x20, 0x61, 0x57, 0xcb, 0xf0, 0xde, 0xee, 0xc5, - 0xed, 0x5d, 0x26, 0xbe, 0x07, 0x44, 0xcc, 0xc4, 0x00, 0x5a, 0x09, 0xc3, - 0x54, 0x55, 0xa9, 0x56, 0x77, 0x7c, 0xa8, 0xce, 0x8e, 0x57, 0xb2, 0x36, - 0x28, 0x16, 0x4b, 0xdc, 0xda, 0x88, 0xff, 0xca, 0xcf, 0xbf, 0x32, 0xe2, - 0x01, 0xfc, 0x6b, 0xa7, 0xe2, 0x85, 0xe6, 0xa1, 0xf2, 0x88, 0x65, 0x7f, - 0xdb, 0x5f, 0xe0, 0x05, 0x56, 0x90, 0xbe, 0x58, 0x77, 0xac, 0xb5, 0x26, - 0xc6, 0x89, 0xbe, 0xdb, 0x79, 0xa5, 0xef, 0x27, 0x53, 0xab, 0x9f, 0x79, - 0x9e, 0x01, 0x22, 0x58, 0x5f, 0x25, 0x3c, 0xdb, 0x3d, 0x7a, 0x42, 0x2d, - 0x69, 0xf5, 0xc4, 0x75, 0xbd, 0xa4, 0x15, 0x8f, 0x8a, 0xf9, 0x70, 0xf8, - 0xb7, 0x00, 0x8a, 0xe4, 0xf8, 0xa5, 0x00, 0x92, 0x6e, 0x30, 0xfd, 0xad, - 0xa3, 0x80, 0x62, 0x77, 0x63, 0x6b, 0x93, 0x8e, 0xeb, 0x92, 0xf5, 0x64, - 0x59, 0xba, 0x4d, 0x4d, 0x79, 0xdb, 0xe6, 0xb4, 0x37, 0x97, 0xa9, 0xbe, - 0x64, 0x97, 0x84, 0xec, 0xf6, 0xa7, 0x74, 0x7e, 0x4b, 0xa4, 0x2b, 0xd9, - 0x15, 0x26, 0xd1, 0x90, 0x29, 0xf3, 0x95, 0x17, 0x3b, 0x1d, 0xfd, 0x9c, - 0xfc, 0x7e, 0x5c, 0xbb, 0x97, 0xe8, 0xad, 0x77, 0x91, 0x35, 0xdf, 0x45, - 0x19, 0xe2, 0xb8, 0xff, 0x57, 0x57, 0x5f, 0x73, 0x8a, 0xaf, 0x48, 0x81, - 0x96, 0xa8, 0xa8, 0xb4, 0xa2, 0x58, 0xca, 0x50, 0xc7, 0x58, 0x98, 0x65, - 0x62, 0x6b, 0x68, 0xa9, 0x8a, 0x02, 0x65, 0xb2, 0xf9, 0x5b, 0xb8, 0x9d, - 0x8c, 0x1b, 0x25, 0xf4, 0xc9, 0xd2, 0x9a, 0x4b, 0xd1, 0xdc, 0x69, 0x97, - 0xcd, 0x30, 0xc0, 0x0b, 0xb1, 0xc1, 0x4f, 0x9c, 0xbe, 0x39, 0x18, 0x54, - 0x66, 0x38, 0x5a, 0x0f, 0x21, 0xf9, 0xdd, 0xe1, 0xe9, 0x58, 0x5d, 0x2c, - 0xab, 0x42, 0xc7, 0x69, 0x2e, 0x69, 0xb8, 0xcc, 0x5e, 0xf2, 0x8d, 0x81, - 0x88, 0x20, 0xc8, 0x2f, 0xa3, 0xb6, 0x14, 0xa5, 0x37, 0xce, 0xde, 0xc9, - 0x26, 0x87, 0x6b, 0x3a, 0xae, 0xdf, 0x01, 0x01, 0xf8, 0x70, 0x08, 0xb3, - 0xc1, 0xe8, 0x80, 0x20, 0x23, 0x31, 0xb1, 0xad, 0x94, 0x7d, 0xb1, 0x0a, - 0x34, 0x48, 0x6e, 0xe7, 0x3b, 0xe4, 0xcc, 0x14, 0x6e, 0x82, 0x9f, 0x9b, - 0xc6, 0xcd, 0x1c, 0xae, 0x08, 0xd6, 0x8f, 0x24, 0xf4, 0x71, 0x5f, 0x3c, - 0x67, 0xca, 0x0b, 0xca, 0x76, 0xe0, 0x35, 0x0a, 0xad, 0x91, 0xff, 0x45, - 0x69, 0x11, 0x5c, 0x3c, 0x8f, 0xa9, 0xf1, 0x68, 0x2d, 0x6c, 0xdb, 0x9f, - 0xdd, 0x7a, 0xbd, 0xdc, 0x34, 0x09, 0xa3, 0x29, 0xbe, 0x8b, 0x32, 0x72, - 0xf7, 0x4e, 0xd7, 0x6a, 0xd9, 0x27, 0xa3, 0x76, 0x09, 0xbd, 0x95, 0x86, - 0x89, 0x34, 0x97, 0x9f, 0x01, 0xbe, 0x5f, 0x7c, 0x34, 0xa6, 0x50, 0x8c, - 0xf1, 0x0f, 0x4b, 0x36, 0x81, 0xf3, 0x5f, 0x33, 0x39, 0xd1, 0x84, 0x25, - 0x4b, 0x9d, 0xd4, 0xfc, 0xa0, 0xf2, 0x1a, 0x94, 0xfd, 0xee, 0xbf, 0x3a, - 0x5d, 0xbb, 0x8f, 0x82, 0x89, 0x9b, 0x65, 0x77, 0xd8, 0x8b, 0x8f, 0x53, - 0x79, 0xe5, 0x83, 0x83, 0x72, 0x52, 0x9b, 0xc1, 0x28, 0x00, 0x39, 0x68, - 0x88, 0xca, 0xc7, 0x49, 0xc2, 0x85, 0xff, 0x2e, 0x79, 0x49, 0xfc, 0xb7, - 0x48, 0x30, 0x66, 0x1e, 0x75, 0xc4, 0x7e, 0x26, 0x0d, 0x6c, 0x86, 0xd8, - 0x4d, 0xf2, 0x31, 0x43, 0x9c, 0xc7, 0xdf, 0xc9, 0x20, 0xa7, 0x09, 0x27, - 0x14, 0x82, 0x4e, 0xac, 0xb7, 0x08, 0x45, 0xa9, 0x7e, 0x24, 0xdc, 0x39, - 0xc3, 0x0c, 0x65, 0x4f, 0x3a, 0x1c, 0xba, 0x29, 0xfc, 0x8a, 0x66, 0xd5, - 0x2d, 0x3e, 0xb1, 0x67, 0x35, 0x7d, 0x49, 0xdd, 0x86, 0x65, 0xe7, 0xf0, - 0x02, 0x71, 0xc7, 0x99, 0x13, 0x15, 0xae, 0x35, 0x3f, 0xce, 0x7d, 0xb3, - 0xd2, 0xbb, 0x1a, 0x31, 0x73, 0x5b, 0x49, 0x5f, 0x84, 0x21, 0xc9, 0xda, - 0x8f, 0xa1, 0x9a, 0x32, 0x12, 0xc4, 0x0e, 0x7e, 0xe4, 0x4c, 0x1e, 0x3d, - 0xa2, 0x29, 0x42, 0xda, 0xd1, 0xd1, 0x47, 0xd6, 0x8e, 0xcd, 0xa5, 0x8c, - 0xd1, 0x94, 0xa5, 0xfc, 0x74, 0x76, 0xe4, 0x04, 0xf4, 0xf4, 0xdf, 0xd4, - 0xd1, 0xa3, 0x33, 0x9b, 0x57, 0xa2, 0x70, 0x1d, 0x86, 0x95, 0x41, 0x51, - 0x02, 0x5a, 0x8a, 0xc2, 0xf7, 0x49, 0x2f, 0x2c, 0x8a, 0x83, 0x28, 0x4b, - 0x20, 0xe0, 0x2c, 0x25, 0x12, 0x6d, 0xb8, 0x29, 0xa3, 0xbd, 0xbb, 0xe7, - 0x51, 0xdc, 0xe5, 0x7a, 0x80, 0x12, 0x0d, 0xc5, 0x0d, 0xd8, 0x71, 0x4b, - 0xc8, 0x62, 0x52, 0x41, 0x6c, 0x5a, 0xbf, 0xc7, 0xf5, 0x64, 0xef, 0xa4, - 0x3b, 0xf1, 0x58, 0xb3, 0x20, 0xf2, 0x10, 0x8d, 0x94, 0xd2, 0xe6, 0xfa, - 0xf5, 0x89, 0x8d, 0x57, 0xc6, 0xc8, 0x3a, 0x3b, 0xb4, 0xaf, 0x83, 0x26, - 0xdd, 0x3c, 0x54, 0xca, 0xf3, 0x96, 0x8c, 0xd3, 0xb4, 0xa4, 0xa4, 0xc6, - 0x6c, 0x96, 0x86, 0xb6, 0x35, 0xf3, 0xc9, 0x63, 0x48, 0x8f, 0xcb, 0x34, - 0xdb, 0xf5, 0xbc, 0x02, 0x31, 0x9f, 0xcc, 0xc4, 0x98, 0x0c, 0xcb, 0x05, - 0x39, 0xca, 0x7e, 0xa1, 0xcd, 0x37, 0x8e, 0xf3, 0x51, 0x91, 0x53, 0xc3, - 0x00, 0x84, 0xba, 0x27, 0xf1, 0x04, 0x46, 0xa8, 0xed, 0x91, 0x3c, 0xb1, - 0xdb, 0xf0, 0xdd, 0x50, 0x75, 0xa7, 0x15, 0xd5, 0x4c, 0x1b, 0xd8, 0x5a, - 0x90, 0x17, 0x45, 0x3a, 0x4a, 0x58, 0xd6, 0xab, 0xb3, 0x55, 0xc8, 0x1b, - 0xcd, 0xeb, 0x31, 0xf2, 0xa1, 0x5e, 0x30, 0x9d, 0xf2, 0xfe, 0xa0, 0x52, - 0xc8, 0x8d, 0xba, 0x97, 0x7c, 0x3b, 0xc1, 0xb1, 0xa5, 0xa4, 0x59, 0x68, - 0xfe, 0x6f, 0x04, 0x32, 0x35, 0x75, 0xc4, 0x16, 0xf9, 0x6e, 0x2a, 0xfe, - 0x6c, 0x22, 0xdd, 0x47, 0xd5, 0xe3, 0xb9, 0x45, 0x9c, 0x4c, 0xba, 0xe4, - 0xa4, 0xf2, 0x96, 0xf6, 0x57, 0x86, 0x9f, 0xce, 0x0c, 0x69, 0x37, 0x20, - 0x57, 0x4a, 0xef, 0x9b, 0x59, 0xc3, 0x1e, 0x7d, 0x12, 0x4b, 0x71, 0xc7, - 0xb7, 0x9c, 0x30, 0xef, 0x66, 0x70, 0x68, 0x96, 0x47, 0x62, 0x60, 0xfe, - 0x12, 0x39, 0x0e, 0x69, 0x46, 0xa1, 0xd2, 0x73, 0xe1, 0xe6, 0xb2, 0x76, - 0xa1, 0xce, 0x3c, 0x60, 0x1d, 0xa2, 0xa1, 0x1b, 0x44, 0xfe, 0x65, 0x1f, - 0xa4, 0x28, 0xee, 0x4e, 0x2a, 0xa6, 0xee, 0xc4, 0xa3, 0x1e, 0x7b, 0xf6, - 0x4d, 0xbd, 0x26, 0x45, 0x7d, 0xdb, 0xa3, 0xde, 0xa0, 0x4f, 0x7b, 0xcf, - 0x2d, 0x24, 0x65, 0x26, 0x1d, 0x1d, 0xb5, 0x0c, 0xc8, 0xa0, 0x0e, 0xc3, - 0xa7, 0x8a, 0x8c, 0x9a, 0xa4, 0x18, 0x18, 0xad, 0x7b, 0x42, 0x61, 0xea, - 0x71, 0xad, 0xf8, 0x9e, 0x8c, 0xa6, 0x89, 0xed, 0xcc, 0xa5, 0xb2, 0x16, - 0x18, 0xb7, 0xe3, 0xcb, 0xa2, 0xa4, 0x6c, 0x52, 0x79, 0x69, 0x5c, 0xe2, - 0x34, 0xe9, 0xd7, 0xf7, 0xef, 0xd9, 0xc4, 0x4f, 0xf9, 0x39, 0x9d, 0xc2, - 0xe9, 0x03, 0xc5, 0x19, 0x32, 0xf9, 0x04, 0xe7, 0x36, 0x1a, 0x99, 0x16, - 0xd2, 0xf4, 0x40, 0x1f, 0xff, 0x49, 0x68, 0x56, 0xc8, 0x8c, 0x9d, 0xce, - 0x72, 0xe3, 0xea, 0x59, 0xde, 0xb3, 0xf3, 0xad, 0xb1, 0x02, 0xd8, 0xe7, - 0x6a, 0xc1, 0x3b, 0x3b, 0xa8, 0x17, 0x77, 0x8b, 0x7c, 0xd3, 0xba, 0xd2, - 0x3b, 0x8c, 0x46, 0x16, 0x57, 0x4c, 0xc5, 0xe1, 0x0d, 0x8e, 0x9a, 0xa5, - 0x2d, 0xed, 0x95, 0x36, 0xaa, 0x6a, 0xb3, 0x5e, 0x17, 0x70, 0xaf, 0x9b, - 0xc8, 0xbd, 0x65, 0xec, 0x17, 0xd5, 0x14, 0xb6, 0x10, 0x46, 0x46, 0xe9, - 0x4e, 0xca, 0x0d, 0x4b, 0xb7, 0x80, 0xff, 0x96, 0x63, 0x23, 0x55, 0x4f, - 0x8c, 0x33, 0x4b, 0x40, 0x7c, 0xb7, 0xc4, 0x3d, 0xe6, 0x2f, 0x55, 0x4e, - 0x89, 0x2d, 0xec, 0x22, 0xd8, 0x48, 0x57, 0xa3, 0xa4, 0x5a, 0xa2, 0x98, - 0xe0, 0xc6, 0x6c, 0x47, 0x2e, 0x8b, 0x2b, 0x7c, 0x56, 0x6e, 0x7e, 0x09, - 0xc5, 0x7b, 0x4c, 0xa4, 0x70, 0xf1, 0x2f, 0xc2, 0x55, 0x87, 0xb5, 0x67, - 0x9e, 0xf3, 0xd1, 0xbe, 0xbc, 0x02, 0x30, 0xd8, 0x7a, 0xa9, 0x5c, 0x8c, - 0xae, 0x03, 0x2c, 0xf9, 0xe9, 0xf3, 0xfa, 0x62, 0x46, 0x53, 0xae, 0x6d, - 0xa6, 0xee, 0xcf, 0xb3, 0x09, 0x51, 0xae, 0xcc, 0xe9, 0xb2, 0xf0, 0xb7, - 0x34, 0x45, 0x88, 0xcb, 0xbf, 0x35, 0x13, 0x0f, 0x54, 0xec, 0x28, 0x12, - 0x7f, 0xa8, 0xdd, 0x70, 0x2a, 0x46, 0x17, 0x35, 0xfc, 0xf6, 0x24, 0x90, - 0x16, 0xa6, 0x0b, 0x5f, 0x33, 0x54, 0x57, 0xc0, 0x44, 0x29, 0x68, 0xaa, - 0xd6, 0x97, 0xd8, 0x29, 0x00, 0x2a, 0x4d, 0x6a, 0x4e, 0x62, 0x75, 0xac, - 0x06, 0x1d, 0xfb, 0xa6, 0xd3, 0x74, 0x30, 0xee, 0xfd, 0xe4, 0x99, 0x20, - 0x41, 0x6a, 0x8e, 0x89, 0x40, 0xac, 0x22, 0xb4, 0xc0, 0x23, 0xc8, 0x30, - 0x1f, 0x11, 0xe1, 0x64, 0xbf, 0x7d, 0xdc, 0x65, 0xad, 0x30, 0x0f, 0xcc, - 0x93, 0x86, 0x4f, 0xff, 0x7f, 0x2b, 0x5f, 0x34, 0x77, 0x81, 0x72, 0xd3, - 0x7d, 0xe4, 0xc0, 0xbb, 0xbf, 0x62, 0x30, 0x14, 0x31, 0x0f, 0x24, 0x9e, - 0x11, 0xc0, 0x38, 0x08, 0xdf, 0x44, 0xde, 0x54, 0xc1, 0xea, 0x98, 0xa8, - 0xae, 0x65, 0xa4, 0xd0, 0xe1, 0xa6, 0xcf, 0x0c, 0x72, 0x35, 0x06, 0x22, - 0xd9, 0x50, 0x65, 0x7e, 0x1a, 0x5b, 0xe6, 0x91, 0x14, 0x2e, 0x60, 0x18, - 0x94, 0xbb, 0x35, 0x6a, 0x9e, 0x8a, 0xb9, 0x9d, 0x67, 0x31, 0xe9, 0x70, - 0x1b, 0x39, 0xb0, 0x11, 0xdd, 0x7b, 0x31, 0x56, 0x1d, 0x94, 0xda, 0xaf, - 0x8c, 0xf7, 0xd9, 0x0c, 0x0e, 0x36, 0x5b, 0x10, 0xe7, 0x6a, 0x57, 0xdf, - 0xaa, 0x7c, 0xad, 0xb0, 0x11, 0x20, 0x85, 0x4f, 0xaf, 0x35, 0xce, 0x78, - 0xf2, 0xe4, 0xcb, 0x9d, 0x3e, 0x27, 0x8c, 0x1a, 0xba, 0x08, 0xbc, 0x9b, - 0x3e, 0x6f, 0xd6, 0x08, 0x1b, 0x15, 0x2e, 0x8e, 0x87, 0x03, 0xa5, 0xef, - 0x9a, 0xf2, 0x87, 0x67, 0xc3, 0xa8, 0x0c, 0xaf, 0xdd, 0xab, 0x05, 0x61, - 0x16, 0x33, 0x62, 0x42, 0xdc, 0x69, 0x2b, 0xd9, 0x7a, 0xfd, 0x1a, 0xaf, - 0x16, 0xd2, 0x24, 0x24, 0x2d, 0x95, 0xcb, 0x30, 0x72, 0x4f, 0x4f, 0xde, - 0x5f, 0x16, 0xaf, 0x74, 0xea, 0x89, 0xf2, 0xf6, 0x85, 0xaa, 0xea, 0xee, - 0x37, 0x53, 0xb1, 0x6a, 0x83, 0x9f, 0xcb, 0x53, 0x17, 0xa9, 0xfb, 0x4d, - 0xc3, 0x7a, 0x31, 0xaa, 0xfd, 0xbd, 0x8f, 0xa8, 0x3b, 0x06, 0xc0, 0x5a, - 0x61, 0xcc, 0x2c, 0xb4, 0xb5, 0x5d, 0xf4, 0x58, 0xf9, 0x71, 0x68, 0x71, - 0x4b, 0xe3, 0x31, 0x52, 0xa0, 0x66, 0xf1, 0x4e, 0x0e, 0x9e, 0x16, 0xa3, - 0xa6, 0xb3, 0xb2, 0x35, 0x61, 0x97, 0xb6, 0x66, 0x07, 0x5d, 0x4d, 0x8e, - 0x92, 0xac, 0xa3, 0x60, 0x29, 0xbd, 0xbe, 0x5c, 0xbc, 0xf1, 0x64, 0x3f, - 0x9a, 0xe5, 0x93, 0x8c, 0xcc, 0xc0, 0xa1, 0xa0, 0x11, 0x9a, 0xf5, 0x48, - 0x4e, 0x96, 0x34, 0xff, 0x8b, 0xc6, 0x5f, 0xff, 0x4b, 0x61, 0xc4, 0x38, - 0x35, 0xdb, 0x09, 0x42, 0x2e, 0x88, 0x5a, 0xa1, 0x83, 0xfd, 0xb9, 0xa3, - 0x92, 0xef, 0x14, 0xa9, 0x1c, 0xd8, 0x71, 0x56, 0x43, 0x2b, 0x36, 0x05, - 0xa3, 0xd8, 0xaf, 0xe5, 0x7b, 0xc7, 0xaa, 0x6e, 0x23, 0xc1, 0x93, 0x8a, - 0x92, 0xb7, 0x6d, 0x94, 0x1b, 0x6a, 0x03, 0x69, 0x9e, 0xf3, 0x7f, 0xe8, - 0xae, 0x6f, 0xb3, 0x9a, 0xcc, 0x5e, 0xab, 0xa7, 0xee, 0x29, 0x5d, 0x35, - 0x60, 0x57, 0x51, 0xc9, 0x64, 0x38, 0x7a, 0x09, 0x6e, 0x96, 0x6a, 0x56, - 0x16, 0x09, 0xca, 0x45, 0x76, 0xfe, 0x39, 0xb0, 0x7c, 0xf2, 0x32, 0xe6, - 0x02, 0xf2, 0xa2, 0x2a, 0xad, 0xab, 0x77, 0x18, 0x1f, 0x54, 0x33, 0x44, - 0x46, 0xb7, 0x0e, 0x59, 0xfd, 0x63, 0x68, 0x79, 0x20, 0x8c, 0x16, 0x59, - 0x14, 0x9c, 0x2b, 0xe8, 0xa1, 0x11, 0x61, 0xc7, 0x1e, 0x53, 0x04, 0x00, - 0xae, 0xff, 0x5d, 0xf3, 0xf3, 0x55, 0x88, 0x3b, 0xaf, 0x29, 0xe6, 0x2f, - 0xdf, 0x6a, 0xac, 0x99, 0xdf, 0x4d, 0x2a, 0xa9, 0xc5, 0x79, 0xca, 0x4e, - 0xbf, 0xb4, 0xde, 0x25, 0x3f, 0xc7, 0xea, 0x27, 0x07, 0x96, 0x9c, 0x92, - 0xfe, 0x07, 0x7b, 0x86, 0x21, 0xaa, 0x62, 0xf9, 0xd3, 0x1e, 0x0f, 0x51, - 0xd7, 0xdd, 0x57, 0x61, 0xb1, 0x48, 0xc0, 0x11, 0x85, 0x10, 0xe3, 0x9d, - 0x16, 0x5d, 0xa1, 0x20, 0x90, 0x97, 0x26, 0x0e, 0xa1, 0x1c, 0x6b, 0xba, - 0x35, 0x70, 0x5e, 0xec, 0xd8, 0x50, 0x7e, 0x54, 0x26, 0x68, 0x2e, 0x1e, - 0x97, 0xf8, 0xd7, 0x3b, 0x1d, 0xd6, 0xac, 0x72, 0x7c, 0x9a, 0x23, 0xa3, - 0xb0, 0x86, 0xfd, 0x9d, 0x6e, 0x26, 0xf1, 0xad, 0x61, 0x0c, 0x58, 0x04, - 0x7f, 0x55, 0xcb, 0x32, 0x20, 0x68, 0x2d, 0x75, 0xc5, 0xfe, 0xed, 0x38, - 0x41, 0xcd, 0xdb, 0xf4, 0x71, 0xcc, 0x93, 0xc6, 0xd9, 0xb9, 0x8e, 0xe7, - 0x57, 0x94, 0xe7, 0x93, 0x0f, 0xfe, 0x1e, 0x72, 0x0c, 0xa4, 0x35, 0xb1, - 0xa7, 0xcc, 0xca, 0xdf, 0x14, 0xb9, 0x50, 0xc9, 0xeb, 0x34, 0x0d, 0x59, - 0xe7, 0x89, 0x2d, 0x61, 0xe6, 0x63, 0xe3, 0x7c, 0x61, 0x3f, 0xa8, 0xb9, - 0x78, 0xf9, 0x70, 0xa2, 0x46, 0xd8, 0xa0, 0xbd, 0x5d, 0x2d, 0x83, 0x4e, - 0x13, 0x4f, 0x58, 0x6a, 0x20, 0x94, 0xd4, 0x5c, 0x10, 0x1a, 0xec, 0xa4, - 0xfc, 0x5c, 0xa8, 0xa4, 0xa3, 0xdb, 0x95, 0x3a, 0xda, 0xdf, 0x22, 0xb3, - 0x12, 0x29, 0x68, 0x0f, 0xbb, 0x65, 0x53, 0x55, 0x10, 0x74, 0x43, 0x2d, - 0x5b, 0xe4, 0xe7, 0x32, 0xa5, 0x87, 0x1b, 0xb7, 0xe2, 0x91, 0x8a, 0xec, - 0x52, 0x6c, 0xb6, 0x01, 0xde, 0x43, 0x45, 0x99, 0x39, 0xeb, 0x67, 0x36, - 0x7c, 0x88, 0x65, 0x37, 0xdd, 0x57, 0x61, 0xf1, 0x74, 0x23, 0xc9, 0xd5, - 0x0c, 0x59, 0x55, 0x1b, 0x30, 0xf3, 0x43, 0x65, 0x10, 0xc5, 0x54, 0xde, - 0x44, 0xc7, 0x0b, 0xeb, 0x97, 0xa0, 0xba, 0x7f, 0x77, 0x09, 0x0c, 0xfd, - 0xbc, 0x92, 0x9a, 0xd7, 0x8d, 0x1a, 0x6f, 0x72, 0xb7, 0x81, 0x30, 0x47, - 0x61, 0xf7, 0x82, 0xfe, 0x69, 0x09, 0x66, 0x00, 0xca, 0xe2, 0xa0, 0x1e, - 0x5f, 0x7f, 0x6a, 0xb3, 0xbe, 0xb5, 0x41, 0x91, 0xe2, 0xf1, 0x7d, 0x35, - 0xeb, 0x57, 0xc4, 0x2a, 0x05, 0xe0, 0x08, 0x3e, 0xe2, 0x25, 0xa4, 0x12, - 0xff, 0x05, 0xfb, 0xde, 0x7d, 0xf0, 0x42, 0x0a, 0x1e, 0x20, 0x47, 0xf5, - 0x84, 0x73, 0x47, 0xa7, 0x9c, 0xd7, 0xf6, 0x73, 0x59, 0x5e, 0x53, 0xea, - 0xc2, 0x3b, 0xf1, 0x4b, 0x79, 0xc8, 0xb6, 0xf4, 0xcd, 0x9c, 0xae, 0x3b, - 0xa6, 0xd5, 0x5c, 0x79, 0x47, 0x36, 0x9b, 0x12, 0x86, 0x21, 0x03, 0x65, - 0x3a, 0x0d, 0x1e, 0x49, 0x96, 0xb1, 0xef, 0xca, 0x1f, 0xe5, 0x31, 0x29, - 0x31, 0x94, 0xb6, 0xcb, 0x66, 0x84, 0xe6, 0x7a, 0x06, 0xde, 0xde, 0xb7, - 0xdb, 0xcc, 0xe8, 0x3b, 0xaa, 0xbc, 0x34, 0x30, 0x39, 0x87, 0xb9, 0x7c, - 0xfa, 0x78, 0x99, 0xba, 0x09, 0xec, 0x69, 0x6c, 0xaf, 0x1a, 0x62, 0x07, - 0xa8, 0x4d, 0x25, 0x87, 0xfc, 0xd3, 0x67, 0x38, 0x91, 0x1d, 0x46, 0xe9, - 0x02, 0x6b, 0x15, 0xc2, 0x2d, 0xbc, 0x0b, 0x51, 0x30, 0x9a, 0x7d, 0x34, - 0x7e, 0x4a, 0x8a, 0x67, 0x18, 0x30, 0xc9, 0x8e, 0xa7, 0x8e, 0x17, 0xb7, - 0xe0, 0xf0, 0xfa, 0xe7, 0xef, 0x9e, 0xbd, 0x1e, 0xa4, 0x50, 0xe0, 0x1d, - 0x71, 0x83, 0x2e, 0x97, 0x29, 0x84, 0x96, 0x50, 0xc1, 0x86, 0x4c, 0x42, - 0xa5, 0xd0, 0x26, 0xde, 0x91, 0x8f, 0x49, 0xb7, 0xd6, 0x5e, 0x57, 0xad, - 0x32, 0x6e, 0x0e, 0x91, 0xae, 0x11, 0x96, 0x4f, 0x15, 0xdc, 0xef, 0xa5, - 0x24, 0x62, 0x65, 0x02, 0xf9, 0xba, 0x4b, 0x86, 0x3e, 0xf3, 0xb9, 0xda, - 0x78, 0x93, 0x03, 0xda, 0x83, 0x21, 0x46, 0x9f, 0x2b, 0xe8, 0x60, 0x47, - 0x1e, 0x5d, 0xd8, 0x2f, 0xa5, 0x15, 0x53, 0x42, 0x84, 0x29, 0x6f, 0x05, - 0x02, 0x34, 0x29, 0x17, 0xf9, 0xa0, 0xba, 0xb2, 0x0f, 0x05, 0x68, 0xfa, - 0x70, 0x66, 0x39, 0xe6, 0xd1, 0xbe, 0xef, 0xd5, 0x37, 0x37, 0x0a, 0xb6, - 0x06, 0xa5, 0x4c, 0x53, 0xb8, 0x64, 0x2b, 0xca, 0x7b, 0x52, 0x90, 0x26, - 0xdf, 0xba, 0xb2, 0x8e, 0x81, 0x8b, 0x05, 0x83, 0x7b, 0x39, 0x5e, 0xb4, - 0x85, 0xd2, 0xd5, 0xc6, 0xbe, 0x8d, 0xbe, 0xaa, 0x31, 0xc7, 0x98, 0x65, - 0x87, 0x9b, 0x5b, 0x22, 0x03, 0xb0, 0x6c, 0x76, 0x7f, 0x53, 0x01, 0xf1, - 0xcb, 0x2d, 0x91, 0x5e, 0x50, 0x8f, 0x2a, 0x07, 0x0b, 0x7b, 0xbd, 0x9b, - 0x5e, 0x98, 0x81, 0xfd, 0x08, 0x53, 0xf9, 0xba, 0x45, 0x42, 0xe2, 0xf9, - 0x8f, 0x33, 0xe2, 0x13, 0x6e, 0xa3, 0xb7, 0x63, 0x3d, 0xb3, 0xcb, 0xe5, - 0x5b, 0xd1, 0xef, 0xd8, 0x23, 0x77, 0xdc, 0xe9, 0xe6, 0x69, 0x2b, 0x9a, - 0xb9, 0xe5, 0x26, 0xd4, 0x26, 0x89, 0x62, 0xbd, 0xdc, 0xd0, 0xad, 0xf9, - 0xec, 0xc7, 0x56, 0xc5, 0x85, 0xa2, 0x32, 0x26, 0x78, 0xef, 0x9f, 0xab, - 0x5b, 0x24, 0x25, 0x34, 0xdf, 0xe3, 0xed, 0x5f, 0x73, 0x81, 0xea, 0x15, - 0xde, 0x91, 0x4d, 0xb3, 0x9e, 0xa8, 0xa2, 0x0d, 0xaf, 0x50, 0x12, 0xd9, - 0x64, 0xe9, 0x31, 0xb4, 0x73, 0xa0, 0x1e, 0xc2, 0xf0, 0xcb, 0x22, 0x07, - 0x8b, 0xaa, 0xad, 0x34, 0xd1, 0x76, 0xcc, 0x30, 0x4a, 0x6a, 0x1a, 0x44, - 0x09, 0x81, 0x3e, 0xf3, 0xf3, 0x8d, 0x9e, 0x62, 0x69, 0x69, 0x77, 0xee, - 0x10, 0xc4, 0x3f, 0x66, 0x6b, 0xf9, 0x5b, 0xa0, 0x14, 0x4b, 0xee, 0x74, - 0xd5, 0xe8, 0x79, 0x9e, 0x3e, 0xda, 0xdc, 0x86, 0xaa, 0xe9, 0xee, 0x1a, - 0x65, 0xb6, 0x5f, 0xe7, 0x78, 0x39, 0xc9, 0x10, 0x2e, 0x0b, 0x14, 0x5d, - 0x7e, 0xad, 0xe8, 0xec, 0x5b, 0xbd, 0xed, 0x84, 0x15, 0xcf, 0xad, 0x2b, - 0xd3, 0x3c, 0x36, 0x52, 0xb5, 0x2c, 0x6a, 0x54, 0xa6, 0xc2, 0xde, 0xeb, - 0xcd, 0x41, 0xe0, 0x8b, 0x8f, 0xd5, 0x5d, 0x30, 0x5e, 0xf1, 0x0a, 0x7b, - 0x33, 0xf0, 0xa8, 0x40, 0x60, 0x19, 0x23, 0xbf, 0xcb, 0x88, 0xa7, 0x42, - 0x9d, 0xbf, 0x36, 0xa1, 0x63, 0x31, 0xf1, 0x61, 0xb0, 0x76, 0x95, 0x28, - 0xd1, 0x54, 0xd2, 0xa7, 0x67, 0xb2, 0x7d, 0xc0, 0x5c, 0x02, 0xd3, 0xdd, - 0x17, 0xde, 0xd2, 0xa7, 0x50, 0xf6, 0x67, 0x4d, 0x47, 0xe0, 0x52, 0xd6, - 0x2f, 0xb7, 0x8c, 0xfc, 0xb7, 0xde, 0x69, 0xf1, 0x90, 0xb4, 0xf1, 0xc8, - 0x20, 0xd0, 0x70, 0xe5, 0x61, 0x6f, 0x63, 0x53, 0x38, 0xe5, 0x05, 0x55, - 0x6f, 0x60, 0x71, 0x90, 0x48, 0x9d, 0x19, 0x29, 0x3d, 0xa4, 0x0c, 0x6f, - 0x67, 0x4a, 0x42, 0xfc, 0x59, 0x1f, 0x00, 0x3f, 0xdc, 0x9d, 0x7f, 0x6f, - 0xb0, 0x5b, 0xb2, 0x68, 0x60, 0xca, 0xff, 0xb3, 0xba, 0xd1, 0x4f, 0x5e, - 0x28, 0x9c, 0x0b, 0xa0, 0x82, 0x79, 0x37, 0xe6, 0x68, 0xab, 0xe1, 0x44, - 0x34, 0xca, 0xa1, 0xbf, 0x38, 0xa8, 0x47, 0x0c, 0xbc, 0xb1, 0xa9, 0x23, - 0x94, 0x54, 0xda, 0xd0, 0xb5, 0xcc, 0x82, 0xc4, 0x67, 0x70, 0x33, 0x09, - 0xbc, 0x23, 0x7c, 0x74, 0xbd, 0xbe, 0x29, 0x2c, 0x27, 0x19, 0x09, 0x15, - 0xbf, 0x7f, 0x30, 0xf7, 0x9d, 0xdc, 0x0e, 0x6f, 0x94, 0xe6, 0x7d, 0xb0, - 0x9a, 0xa4, 0x2c, 0x5a, 0xaa, 0xd7, 0x15, 0xb7, 0xc8, 0x36, 0xac, 0x88, - 0x0d, 0x56, 0xed, 0x97, 0xb7, 0x16, 0xd9, 0xf5, 0x7b, 0xc7, 0xbe, 0xb6, - 0x13, 0x92, 0x0e, 0x2c, 0x57, 0x25, 0x29, 0x0e, 0x8a, 0x39, 0xb2, 0x22, - 0x8b, 0x6c, 0xbd, 0xbd, 0x96, 0x39, 0x27, 0xc7, 0xb4, 0x8c, 0x4b, 0x7e, - 0xed, 0x76, 0x3a, 0xf9, 0xf6, 0x24, 0x95, 0x87, 0x53, 0x9b, 0xcd, 0x2a, - 0xa6, 0x0c, 0x85, 0xd6, 0xa1, 0xda, 0xa7, 0x8e, 0xbb, 0xf9, 0x78, 0x7f, - 0xe5, 0x51, 0x67, 0x32, 0xed, 0x72, 0xc6, 0x7f, 0xfd, 0x9a, 0xfe, 0x04, - 0xba, 0xe3, 0x53, 0xf4, 0x63, 0xde, 0x2a, 0x35, 0x81, 0x2b, 0xde, 0x82, - 0x5f, 0x0c, 0x38, 0x79, 0x42, 0xa5, 0x0d, 0xf4, 0x4f, 0x12, 0x6d, 0xc9, - 0x45, 0xf9, 0x59, 0x14, 0xd2, 0x62, 0x43, 0xdf, 0x21, 0x85, 0xac, 0x58, - 0xdd, 0x90, 0x54, 0x0a, 0x67, 0xd3, 0x78, 0xaf, 0x3f, 0x08, 0x6e, 0x49, - 0xc1, 0xdf, 0x03, 0xcf, 0x73, 0x36, 0xa3, 0xf8, 0x35, 0x06, 0x98, 0xf5, - 0xe6, 0x3b, 0x00, 0x80, 0x6d, 0xd1, 0x8e, 0xb6, 0x46, 0x70, 0xf4, 0x70, - 0xd8, 0x57, 0xaf, 0xa8, 0xde, 0x0b, 0x3d, 0x4d, 0xd2, 0x45, 0x75, 0x62, - 0x20, 0xbb, 0x3c, 0x9b, 0xed, 0x34, 0xe2, 0x95, 0xc6, 0x1b, 0x2f, 0x57, - 0x2f, 0x3c, 0xfd, 0x04, 0xce, 0x7f, 0x08, 0x26, 0x55, 0x68, 0x9e, 0x60, - 0xd4, 0xfc, 0x57, 0x47, 0x9f, 0x53, 0xb8, 0x39, 0x2c, 0x4c, 0x78, 0x53, - 0x0f, 0xaf, 0x9e, 0x07, 0x43, 0x94, 0x20, 0x12, 0xbc, 0x6b, 0xa5, 0x38, - 0x38, 0x5a, 0x53, 0x9b, 0xd0, 0x39, 0x75, 0x12, 0x8e, 0xef, 0xf3, 0xff, - 0xe2, 0xe0, 0xa4, 0x93, 0x57, 0xb6, 0x06, 0x1a, 0x90, 0x0c, 0xfc, 0x51, - 0xe9, 0xf0, 0x1e, 0xb6, 0x7e, 0x75, 0xab, 0xca, 0x15, 0xae, 0xa8, 0x61, - 0x44, 0x99, 0x29, 0x72, 0xf6, 0x2a, 0xc3, 0xf5, 0x53, 0x8c, 0x43, 0x08, - 0xba, 0x4d, 0x87, 0x1d, 0xe6, 0xa2, 0xbb, 0x70, 0x91, 0x49, 0x5d, 0x2b, - 0x14, 0x1b, 0xa8, 0x7f, 0x2f, 0x03, 0x7e, 0x7e, 0xea, 0x7a, 0x1a, 0xee, - 0x7e, 0xef, 0x3f, 0xd5, 0x2d, 0xef, 0xf9, 0x46, 0xa9, 0x85, 0x82, 0xd2, - 0x29, 0x31, 0x7d, 0x9e, 0xfb, 0x3b, 0x68, 0x8c, 0xbc, 0xb3, 0x57, 0xd9, - 0xcf, 0xa7, 0xcb, 0xef, 0xfb, 0x43, 0x49, 0x27, 0x37, 0xe5, 0x57, 0xfe, - 0x48, 0x10, 0xca, 0x59, 0x2c, 0x66, 0x36, 0x4a, 0xf8, 0xa4, 0xb3, 0x5b, - 0xf5, 0x9e, 0xc0, 0x9b, 0x2f, 0xe0, 0x21, 0xf6, 0xc0, 0x42, 0x8e, 0x2a, - 0xa6, 0xd4, 0xb7, 0x4c, 0xf5, 0x6f, 0x40, 0x93, 0x99, 0xce, 0x66, 0x17, - 0xc2, 0x99, 0xa7, 0xfb, 0x7e, 0xcc, 0xe7, 0xd4, 0x14, 0x51, 0x21, 0x72, - 0x6b, 0xb8, 0x23, 0x8c, 0x61, 0x74, 0x3f, 0x3a, 0x1c, 0xd9, 0x31, 0xc7, - 0xa8, 0xd9, 0xda, 0x98, 0x8d, 0x6e, 0xff, 0xd8, 0x9f, 0x59, 0xa8, 0xb1, - 0xd6, 0xc8, 0x88, 0x13, 0x23, 0x02, 0x57, 0xc7, 0xf4, 0xd2, 0x2f, 0x11, - 0x95, 0xf7, 0xff, 0x03, 0x8e, 0x8c, 0xa1, 0x84, 0x1a, 0x88, 0xa4, 0xb1, - 0xad, 0x47, 0x13, 0xc1, 0x23, 0x9c, 0x53, 0xa9, 0xc3, 0xce, 0x0f, 0xbc, - 0x1f, 0x83, 0x84, 0x15, 0x77, 0x4e, 0x5c, 0x72, 0x93, 0xeb, 0xd1, 0x57, - 0x00, 0x61, 0x64, 0x66, 0x4d, 0xb2, 0x04, 0x83, 0xf7, 0x5b, 0x32, 0x83, - 0x5b, 0xf3, 0x3b, 0xa7, 0x85, 0xdb, 0xd1, 0x89, 0x5b, 0xe5, 0x75, 0x4a, - 0x9d, 0x32, 0x91, 0x27, 0x45, 0x53, 0x7f, 0x5b, 0x23, 0x72, 0xb7, 0xda, - 0x9b, 0x3f, 0x5c, 0xea, 0x16, 0x6d, 0x45, 0x89, 0x8f, 0x27, 0x2e, 0xa3, - 0xb5, 0xfb, 0x09, 0x33, 0x43, 0x66, 0xe8, 0x40, 0xea, 0x17, 0x92, 0x88, - 0x49, 0xb7, 0xa8, 0xaf, 0x0e, 0xc4, 0x04, 0xd6, 0x71, 0x25, 0x35, 0x50, - 0x1b, 0x26, 0x73, 0xc7, 0x51, 0x2f, 0x6e, 0xef, 0xeb, 0x00, 0x0b, 0x91, - 0xee, 0xf7, 0xde, 0x2e, 0x74, 0x6a, 0x53, 0x3e, 0x78, 0x24, 0xdb, 0x57, - 0x99, 0x78, 0xe1, 0x33, 0x3b, 0xc7, 0xf0, 0x22, 0xff, 0xf8, 0x9e, 0x19, - 0x2c, 0x7d, 0xc6, 0x17, 0x10, 0xb9, 0xc3, 0x00, 0x3e, 0x5d, 0x1c, 0xff, - 0x4d, 0x77, 0x8c, 0x5d, 0xb9, 0xd3, 0x9d, 0xa9, 0xa7, 0x9f, 0xb9, 0x49, - 0x4a, 0xba, 0x16, 0xca, 0xc0, 0x49, 0x19, 0xfe, 0xc3, 0x89, 0xae, 0x47, - 0xb7, 0xf6, 0x1c, 0x42, 0x31, 0x7b, 0xc9, 0x3f, 0xfc, 0x44, 0x20, 0x83, - 0x56, 0x4e, 0xcb, 0x8a, 0x80, 0x6c, 0x87, 0x09, 0xc6, 0x59, 0xf9, 0x7f, - 0xbb, 0x1d, 0xdf, 0x89, 0xc1, 0xe8, 0x77, 0x3f, 0xa2, 0x02, 0xc8, 0x24, - 0xaf, 0x56, 0x1d, 0x0b, 0x3c, 0x5c, 0xeb, 0xff, 0xf0, 0x03, 0x45, 0x18, - 0x00, 0x7d, 0x6c, 0x05, 0x18, 0x53, 0xc8, 0xb8, 0xd2, 0x46, 0xa0, 0xec, - 0xb5, 0x20, 0x02, 0xa0, 0xa5, 0xe9, 0xd3, 0x35, 0x2d, 0xac, 0x41, 0xc5, - 0x04, 0xe7, 0x64, 0x53, 0xe4, 0x2f, 0x12, 0x73, 0xbd, 0x0f, 0xd6, 0x8c, - 0x76, 0x04, 0x02, 0x52, 0xd0, 0xc6, 0x9e, 0x61, 0x21, 0x94, 0x11, 0x5a, - 0xc7, 0xd6, 0x2a, 0x84, 0x52, 0x33, 0x23, 0xed, 0x32, 0x6a, 0xfa, 0x3b, - 0xd5, 0xf1, 0xe8, 0x7f, 0xa4, 0x6e, 0x73, 0xae, 0x3b, 0x00, 0x4c, 0x68, - 0x54, 0x8c, 0x99, 0x7f, 0xd5, 0xdf, 0xe5, 0xc5, 0x80, 0x48, 0x0c, 0x0d, - 0xbd, 0x69, 0x64, 0x38, 0x68, 0xc8, 0x77, 0x44, 0x49, 0xf0, 0xd8, 0xe9, - 0x0c, 0x9d, 0x66, 0x3a, 0xa7, 0x90, 0x2a, 0x22, 0x64, 0xe8, 0x4d, 0xea, - 0x11, 0xdd, 0x77, 0xf0, 0x9d, 0xbc, 0x92, 0x35, 0x9b, 0x61, 0x7a, 0x17, - 0x03, 0x9a, 0x3a, 0x73, 0x0a, 0x83, 0x67, 0x05, 0x62, 0x97, 0x47, 0xe5, - 0xb2, 0xa6, 0x85, 0x33, 0xec, 0x76, 0x67, 0xea, 0xd9, 0xf2, 0x7c, 0xc6, - 0x79, 0x54, 0xc4, 0x36, 0xd6, 0xac, 0x2d, 0x92, 0x27, 0x43, 0xcf, 0xcd, - 0x84, 0x41, 0xca, 0xe1, 0x19, 0xa6, 0x9f, 0x54, 0x86, 0x64, 0xfc, 0x25, - 0xa5, 0x1d, 0x92, 0x1a, 0x32, 0xaa, 0x73, 0x4a, 0x15, 0x78, 0xad, 0x1e, - 0x61, 0xec, 0x46, 0xb0, 0x90, 0x7b, 0xaa, 0x08, 0x32, 0x81, 0x5e, 0x03, - 0xfc, 0xdd, 0xc6, 0xee, 0x20, 0x5f, 0x86, 0x26, 0xdc, 0x6b, 0x1d, 0xa2, - 0xdf, 0xd3, 0xc0, 0x87, 0x1b, 0xc2, 0x16, 0x5c, 0xdd, 0x34, 0x13, 0x7a, - 0xae, 0x97, 0xf5, 0x95, 0x5a, 0x8e, 0x90, 0x2f, 0x15, 0x2f, 0x34, 0xb9, - 0xa0, 0x6d, 0xae, 0x53, 0xe1, 0x05, 0xf9, 0x7f, 0x84, 0xe8, 0xdb, 0x5d, - 0xa3, 0xc0, 0xcc, 0xc0, 0x16, 0xae, 0xd1, 0xaf, 0x67, 0xbc, 0x85, 0x42, - 0xd4, 0x60, 0xe7, 0xde, 0x62, 0x7c, 0xa3, 0x4c, 0x52, 0xf1, 0x7b, 0x92, - 0x57, 0xf0, 0x0a, 0xf2, 0xec, 0x95, 0xe3, 0xf2, 0x51, 0xc5, 0x82, 0xe6, - 0x49, 0xfc, 0xc9, 0x74, 0x6f, 0x2d, 0x9b, 0x66, 0x64, 0x65, 0x75, 0x0a, - 0xb3, 0x34, 0xa6, 0x79, 0x54, 0xd5, 0x61, 0x48, 0x07, 0x7f, 0x5d, 0x45, - 0x98, 0x22, 0x68, 0x3f, 0xc0, 0x1a, 0xb2, 0xc3, 0xb5, 0x55, 0xa9, 0x16, - 0x0c, 0x17, 0xf6, 0xe5, 0x5b, 0x46, 0x00, 0x8b, 0x27, 0xc1, 0x43, 0xed, - 0x3a, 0xaf, 0xd0, 0x0e, 0xcc, 0xa9, 0xcc, 0xac, 0x6a, 0xfc, 0x78, 0x27, - 0xa3, 0xb3, 0xab, 0x02, 0xbd, 0x12, 0x8c, 0xcc, 0x63, 0xe1, 0x92, 0xfa, - 0x2e, 0x88, 0xa1, 0x17, 0x5d, 0x31, 0x98, 0xb4, 0x4e, 0xe2, 0x1e, 0x54, - 0x25, 0xcd, 0xb7, 0x3b, 0xa4, 0xb2, 0xbb, 0x00, 0xdb, 0x07, 0x39, 0x27, - 0xed, 0xdd, 0x7a, 0xb7, 0x58, 0xb0, 0xce, 0x9c, 0x66, 0xc2, 0x5e, 0xde, - 0xd5, 0x21, 0xe4, 0xee, 0xc2, 0x5d, 0xa8, 0x65, 0x52, 0xad, 0x09, 0x2e, - 0xb2, 0xc4, 0xcf, 0xd8, 0xf1, 0x6e, 0x54, 0x02, 0x99, 0x13, 0xd6, 0xdb, - 0x84, 0xcc, 0x2c, 0x9a, 0x9e, 0x36, 0xc7, 0x38, 0x75, 0xdd, 0x89, 0xa2, - 0x5f, 0x95, 0xe2, 0x70, 0x78, 0x03, 0x49, 0xf1, 0xab, 0x0d, 0xa4, 0x24, - 0x22, 0x58, 0xd2, 0x12, 0xd0, 0x34, 0xed, 0xd1, 0xb0, 0xea, 0x02, 0xe1, - 0xf0, 0xa1, 0xf3, 0xb2, 0x56, 0x43, 0x4a, 0xce, 0x99, 0x60, 0x2f, 0xac, - 0x40, 0x18, 0xa2, 0x67, 0x44, 0xf6, 0x9a, 0x10, 0x59, 0x61, 0xe3, 0x5d, - 0x2c, 0x3b, 0x90, 0x0f, 0x4b, 0xf6, 0xb4, 0x51, 0x85, 0xe0, 0x69, 0xc4, - 0x2c, 0xfb, 0xbc, 0x2f, 0x7d, 0x73, 0x0d, 0x72, 0x27, 0xd8, 0xff, 0xf9, - 0xd9, 0xff, 0x9d, 0x08, 0x1c, 0x84, 0xd0, 0x90, 0x87, 0x43, 0xde, 0xf3, - 0x61, 0x33, 0x34, 0x5b, 0x11, 0xed, 0xbd, 0x18, 0x62, 0x09, 0xed, 0x78, - 0xb9, 0x4f, 0x05, 0x61, 0x99, 0x1d, 0x21, 0x14, 0x0d, 0x5b, 0x73, 0xe5, - 0x04, 0xd9, 0xe2, 0x1a, 0xda, 0x34, 0xf6, 0x76, 0xe2, 0x6f, 0x2d, 0x5d, - 0xc5, 0x36, 0x1c, 0xf7, 0x7f, 0x10, 0xd9, 0x84, 0xc5, 0x6e, 0x4c, 0xa1, - 0x02, 0x3c, 0x2e, 0xf9, 0x32, 0xa1, 0x03, 0xad, 0x5e, 0x11, 0x78, 0xbe, - 0x6b, 0xb3, 0x01, 0x2b, 0x0f, 0x95, 0x1d, 0x5d, 0xee, 0x6e, 0x7f, 0xdc, - 0x0b, 0xd3, 0xf9, 0xff, 0x25, 0xbc, 0x12, 0xb9, 0xa7, 0xa6, 0x80, 0xb3, - 0xd3, 0xb6, 0x5c, 0xc5, 0x26, 0xc3, 0xfc, 0x66, 0xfd, 0x10, 0x5a, 0x33, - 0x02, 0x94, 0x6b, 0x27, 0xa9, 0x9e, 0x5b, 0x8d, 0x8f, 0xd3, 0x83, 0xce, - 0x9e, 0xe4, 0x43, 0x10, 0xf6, 0xab, 0x51, 0x9e, 0x1b, 0xe2, 0x5f, 0x58, - 0x62, 0x9a, 0xd5, 0x67, 0x76, 0x58, 0x6f, 0x5f, 0xba, 0xfc, 0xca, 0x62, - 0x36, 0x9b, 0xf7, 0xe0, 0x1b, 0xf8, 0xf3, 0xc7, 0x59, 0xda, 0x94, 0xac, - 0x1f, 0x5d, 0x7f, 0x25, 0xda, 0x50, 0x07, 0x2b, 0x41, 0xb0, 0x9d, 0x24, - 0xbc, 0xcf, 0x56, 0x64, 0x85, 0xed, 0xb3, 0xc9, 0x36, 0x2f, 0x33, 0x39, - 0xd2, 0xc6, 0x21, 0xff, 0x7f, 0x53, 0x00, 0x93, 0xa0, 0xb5, 0x0a, 0x02, - 0x0e, 0x71, 0xfc, 0x42, 0x13, 0xcb, 0xf1, 0xe3, 0x2f, 0xc8, 0x44, 0xa6, - 0xe6, 0xa6, 0xe0, 0x10, 0xe9, 0x75, 0xb7, 0x6c, 0xa5, 0xb9, 0xec, 0xdf, - 0x6a, 0x6a, 0xd3, 0x02, 0x24, 0xe7, 0xff, 0xbd, 0xe4, 0xed, 0x82, 0x33, - 0xcb, 0x75, 0xda, 0x30, 0xbc, 0x71, 0x1f, 0xac, 0x7d, 0xba, 0x98, 0x89, - 0x13, 0xb7, 0x3f, 0xf4, 0x81, 0x1d, 0xa4, 0x23, 0x91, 0x43, 0x13, 0xdd, - 0xa1, 0x31, 0x6e, 0x95, 0x5c, 0x98, 0xcf, 0xe9, 0x72, 0x42, 0x6d, 0x67, - 0x4f, 0xf0, 0x49, 0x22, 0x07, 0xa6, 0x5a, 0x2c, 0xa8, 0x8d, 0xed, 0xa5, - 0x89, 0xda, 0xd7, 0xf0, 0x8d, 0xd0, 0xa5, 0x14, 0xea, 0xcc, 0x9f, 0xdc, - 0x0a, 0xfd, 0x14, 0x91, 0x47, 0x01, 0x6f, 0x5c, 0xc3, 0x3f, 0x49, 0x02, - 0xc8, 0x70, 0xc9, 0xf9, 0x9e, 0x91, 0x80, 0xb3, 0x36, 0xce, 0x7a, 0xa9, - 0xc5, 0x2a, 0x0c, 0x2d, 0x70, 0x84, 0x96, 0x18, 0x2d, 0x5a, 0x31, 0xfd, - 0x1f, 0x82, 0x53, 0xbb, 0xe5, 0x57, 0x22, 0xae, 0xbc, 0xfe, 0xeb, 0x38, - 0xce, 0xf7, 0x9a, 0xfd, 0x5b, 0x74, 0x17, 0x6f, 0xfe, 0xa6, 0x29, 0xf7, - 0x86, 0xc9, 0x6f, 0x92, 0x9c, 0x53, 0x7f, 0x31, 0x38, 0xb8, 0x5f, 0x70, - 0x77, 0xc9, 0xd3, 0xf9, 0x0c, 0xfb, 0x14, 0xcf, 0x38, 0x61, 0x81, 0x23, - 0x20, 0x3f, 0x0a, 0xf6, 0x56, 0x67, 0xe5, 0xff, 0xbd, 0xf0, 0xd0, 0x67, - 0x04, 0x7c, 0x38, 0xf3, 0x60, 0x77, 0x05, 0x26, 0x15, 0x53, 0x43, 0xf3, - 0x9e, 0xb4, 0x6a, 0x51, 0x09, 0x9d, 0x22, 0x28, 0xb9, 0x23, 0xd4, 0x9b, - 0x48, 0xf0, 0xcb, 0xb8, 0x60, 0x33, 0x87, 0xab, 0xf6, 0x10, 0x7a, 0xae, - 0x09, 0xb7, 0x90, 0x0a, 0xee, 0xc4, 0x6e, 0xf4, 0x08, 0x43, 0x76, 0x52, - 0xec, 0xf3, 0x48, 0x95, 0x6f, 0xa9, 0xe2, 0x22, 0x73, 0x6e, 0x9c, 0xa9, - 0x9f, 0x24, 0x3a, 0xef, 0xd6, 0xfb, 0xfa, 0xb4, 0x6c, 0xdb, 0x3f, 0x67, - 0xcc, 0xe7, 0x12, 0xeb, 0x65, 0xd7, 0x52, 0xeb, 0x89, 0x6c, 0x8e, 0x06, - 0xef, 0x7e, 0xda, 0xfc, 0x91, 0x28, 0xd3, 0x27, 0x8e, 0x56, 0x65, 0xa3, - 0xcc, 0xb7, 0x37, 0x82, 0x2f, 0x1f, 0x14, 0x23, 0x58, 0x91, 0x6e, 0x78, - 0x0e, 0x8f, 0x7d, 0xef, 0xdc, 0xd4, 0xe4, 0x98, 0x2d, 0xeb, 0xf4, 0xd6, - 0xe3, 0xe8, 0x9f, 0x0a, 0x90, 0x57, 0xc2, 0x5f, 0xee, 0x3c, 0x86, 0xd4, - 0x19, 0xd8, 0x77, 0x2e, 0x38, 0x7b, 0xf4, 0x21, 0xa7, 0xd2, 0x7d, 0xf6, - 0x71, 0xac, 0xa2, 0xf8, 0x51, 0xf4, 0x7d, 0x5b, 0xd0, 0x55, 0xc4, 0x81, - 0x41, 0x56, 0x79, 0xd5, 0xbf, 0xa2, 0xeb, 0x7e, 0xa1, 0x1a, 0x68, 0xa6, - 0x36, 0xbb, 0x4a, 0x17, 0x85, 0xe3, 0x4c, 0x80, 0x8d, 0xdf, 0x81, 0xbe, - 0x12, 0x09, 0xd4, 0xbf, 0x71, 0x2f, 0xfe, 0x03, 0x27, 0x6b, 0x12, 0xb7, - 0x3e, 0x64, 0xcd, 0xb2, 0xb9, 0xe5, 0x0c, 0x0d, 0x42, 0x20, 0x69, 0xb8, - 0x30, 0xba, 0x1f, 0xc2, 0xed, 0x43, 0xba, 0x98, 0x38, 0x30, 0xb8, 0x0c, - 0x1a, 0x3c, 0x45, 0x53, 0xa1, 0x8e, 0xa5, 0x09, 0xdf, 0x62, 0x4e, 0x8b, - 0x66, 0x36, 0x63, 0xed, 0xeb, 0xaf, 0x8b, 0xd0, 0x4d, 0x38, 0x9c, 0x93, - 0x51, 0x21, 0x92, 0xa6, 0x49, 0xfe, 0x33, 0x0c, 0x3f, 0x55, 0x4d, 0x80, - 0xe6, 0xa6, 0x95, 0xac, 0xc3, 0x3d, 0xd8, 0x92, 0x56, 0x9e, 0xcc, 0x5e, - 0x0c, 0xcc, 0x2e, 0xe9, 0x2b, 0x49, 0x80, 0xa4, 0xad, 0x77, 0x18, 0xd1, - 0x78, 0x89, 0xe4, 0x32, 0x72, 0xa8, 0x66, 0x68, 0xbe, 0x7d, 0x6a, 0xf0, - 0xce, 0x43, 0x45, 0x20, 0xe1, 0x44, 0x7a, 0x0b, 0x1f, 0x0f, 0x48, 0x45, - 0xf5, 0x66, 0xe3, 0x7d, 0x7b, 0xf1, 0xd6, 0x0f, 0xf7, 0x91, 0xfb, 0x0e, - 0xa1, 0x08, 0x0e, 0x33, 0x76, 0xba, 0x80, 0x90, 0xf8, 0xa5, 0x58, 0x05, - 0x60, 0x43, 0x25, 0x49, 0x2e, 0x6e, 0x90, 0x78, 0xaf, 0xa5, 0x0a, 0x47, - 0xce, 0xd0, 0xc6, 0x55, 0x59, 0x6c, 0xb3, 0x61, 0x97, 0x08, 0x5c, 0xf6, - 0x25, 0x83, 0x69, 0xc9, 0xb8, 0x32, 0xc2, 0x9a, 0xec, 0x7c, 0x5c, 0xba, - 0xe5, 0x62, 0x0a, 0x7b, 0x1f, 0xa3, 0xa6, 0x06, 0x58, 0xf9, 0x52, 0xfc, - 0xb7, 0xcb, 0xf0, 0x2a, 0xb6, 0x8a, 0x2e, 0x40, 0x32, 0x3a, 0xd7, 0xd4, - 0xfd, 0x1b, 0xfa, 0xfd, 0x3f, 0x76, 0x67, 0xa3, 0x73, 0x7b, 0x55, 0xf0, - 0x20, 0x93, 0xf1, 0x25, 0x88, 0x78, 0x6d, 0x63, 0xdc, 0x58, 0x51, 0x23, - 0xbc, 0xe8, 0x44, 0xba, 0x1e, 0x94, 0xf3, 0xad, 0x18, 0x7e, 0x7f, 0x1c, - 0x56, 0xc9, 0x74, 0x63, 0x3a, 0xae, 0x92, 0xb4, 0xc4, 0xba, 0x42, 0x19, - 0x8e, 0x11, 0x7d, 0x17, 0x92, 0x3c, 0x5a, 0x1b, 0xcd, 0xc5, 0x74, 0xab, - 0x19, 0x44, 0x1d, 0xe0, 0x54, 0x82, 0xa6, 0x9f, 0x94, 0xf1, 0xb6, 0x39, - 0x6b, 0xcb, 0x00, 0x75, 0x70, 0x84, 0xdd, 0x25, 0x1e, 0xd8, 0xf4, 0x17, - 0xb5, 0xa6, 0x9f, 0xf9, 0x86, 0xe0, 0xd5, 0x24, 0x76, 0xc0, 0x24, 0x41, - 0xd4, 0x71, 0xd6, 0xab, 0xfe, 0xe8, 0x0e, 0x65, 0xfe, 0x1d, 0x40, 0x75, - 0xab, 0xe8, 0x97, 0x7f, 0x78, 0x19, 0xdc, 0x39, 0xd0, 0x42, 0x83, 0x61, - 0x58, 0x21, 0x0a, 0xc4, 0x64, 0x76, 0x9e, 0x04, 0xad, 0x87, 0xd2, 0x09, - 0xbf, 0x93, 0xa8, 0x05, 0xe9, 0x73, 0xd1, 0xbc, 0xaa, 0xdf, 0xf5, 0xf0, - 0x11, 0x18, 0x1e, 0x9e, 0x8e, 0xa6, 0x3a, 0x38, 0xdf, 0xe4, 0x37, 0x8d, - 0xe6, 0x64, 0x4e, 0xb5, 0x7e, 0x5d, 0x73, 0xda, 0x3f, 0x09, 0x02, 0xc6, - 0x77, 0x40, 0x64, 0x16, 0xc1, 0x09, 0x0c, 0xd7, 0x3d, 0x43, 0xad, 0xe5, - 0x5a, 0xeb, 0xa1, 0xb4, 0x59, 0xc1, 0x4f, 0x09, 0x04, 0xa7, 0x7d, 0xc1, - 0x96, 0xd8, 0x5b, 0xa4, 0xa3, 0xca, 0x6e, 0x91, 0x6b, 0xd0, 0xe1, 0x0a, - 0x7f, 0xc7, 0x0c, 0xff, 0xe1, 0xf1, 0x12, 0xa3, 0xe0, 0x5a, 0xed, 0x73, - 0xa6, 0x32, 0x36, 0x69, 0x12, 0xe4, 0x01, 0x1d, 0xc4, 0x73, 0x29, 0xd3, - 0xc3, 0x47, 0xeb, 0x7d, 0x24, 0xec, 0x9d, 0xb7, 0x43, 0x87, 0xcc, 0x82, - 0xdf, 0xff, 0xec, 0x0b, 0xcb, 0x08, 0xde, 0x7b, 0x40, 0x8a, 0x6d, 0xdc, - 0xb9, 0xbc, 0x6c, 0xb3, 0x0d, 0x6a, 0x99, 0x0a, 0x08, 0x33, 0x24, 0xa8, - 0xd5, 0x1a, 0xd5, 0x08, 0x98, 0x84, 0x25, 0x1e, 0xf9, 0x0b, 0x38, 0x6b, - 0x17, 0x49, 0x1b, 0x11, 0x8d, 0x01, 0x56, 0xb8, 0xf0, 0xd9, 0xcc, 0x9a, - 0xce, 0xc8, 0x65, 0x7f, 0x29, 0x49, 0x12, 0x74, 0xbc, 0x22, 0x9e, 0xd4, - 0x6e, 0x10, 0xd2, 0x86, 0xb8, 0x53, 0x00, 0x47, 0x2b, 0xbd, 0xd0, 0xdc, - 0xc5, 0xff, 0x25, 0xcb, 0x38, 0xda, 0xb6, 0x86, 0xa9, 0x5d, 0xb1, 0x6e, - 0xe8, 0xc7, 0x87, 0xb0, 0x53, 0x4c, 0x95, 0x80, 0x50, 0x4c, 0x41, 0x7c, - 0xff, 0xe7, 0x5f, 0x4a, 0xe7, 0x7f, 0xa0, 0x47, 0x9b, 0xc1, 0x12, 0x45, - 0x1c, 0x88, 0x91, 0xd4, 0x0d, 0x94, 0xac, 0x93, 0xb9, 0x4d, 0xae, 0xf0, - 0xfd, 0x20, 0xf9, 0x3a, 0xc8, 0x6b, 0xfa, 0x7b, 0x17, 0x2b, 0x33, 0x0a, - 0x70, 0xae, 0xe5, 0xf4, 0x6b, 0x25, 0xad, 0x58, 0xc2, 0x32, 0x1a, 0x91, - 0xc9, 0xf7, 0xf1, 0xd5, 0x07, 0xeb, 0x41, 0x1a, 0x67, 0xad, 0x02, 0x0f, - 0x92, 0x00, 0x12, 0x6a, 0x91, 0xfb, 0xc7, 0xeb, 0xa3, 0xa0, 0x26, 0xcf, - 0x00, 0x77, 0xd5, 0xc0, 0x86, 0xe2, 0x33, 0x65, 0x83, 0x3e, 0xfd, 0xe3, - 0x42, 0x3f, 0x07, 0x45, 0xb4, 0xba, 0xaa, 0x45, 0xa7, 0x85, 0x23, 0xa6, - 0xcd, 0xd0, 0xb3, 0xe1, 0xfa, 0xb6, 0xdd, 0x81, 0x6b, 0xdc, 0x21, 0xc1, - 0xa7, 0x4d, 0xf2, 0xd0, 0x5b, 0xd5, 0x89, 0xf7, 0x3e, 0xb9, 0xb9, 0x47, - 0x40, 0xf2, 0x78, 0x70, 0xd7, 0x65, 0x77, 0x16, 0xae, 0x69, 0xd2, 0xab, - 0x91, 0xa8, 0xb6, 0x35, 0xdb, 0x86, 0xbf, 0x2c, 0x7e, 0xf9, 0x29, 0x8e, - 0x6b, 0x19, 0x8c, 0x8c, 0x69, 0xf0, 0x5f, 0x02, 0x1c, 0x0f, 0x25, 0xad, - 0x42, 0xae, 0xbf, 0xd4, 0x44, 0xe8, 0x63, 0x6a, 0xcd, 0x5b, 0xf9, 0x2c, - 0x72, 0xa2, 0xc6, 0x8f, 0x37, 0x51, 0xb0, 0xab, 0x93, 0xa4, 0x50, 0x29, - 0x18, 0x8f, 0xac, 0x1e, 0x5a, 0xfc, 0x05, 0xdf, 0xa8, 0x5f, 0x21, 0xfb, - 0xf5, 0xb1, 0x04, 0x18, 0x67, 0x1d, 0x2a, 0xd3, 0x1d, 0x02, 0xa8, 0xec, - 0x94, 0xb0, 0x55, 0x87, 0xef, 0xc5, 0x3b, 0x49, 0x75, 0xd8, 0x03, 0x4a, - 0x37, 0xa5, 0xcc, 0x2b, 0xb7, 0x7b, 0xa0, 0x5e, 0x68, 0xd2, 0xa5, 0xa8, - 0xf3, 0x4b, 0x24, 0x1d, 0xf3, 0x44, 0x0d, 0xaa, 0x0a, 0xdc, 0x46, 0xc5, - 0x9d, 0xbd, 0x67, 0x04, 0x65, 0xdd, 0x4f, 0x0f, 0x8d, 0x07, 0x15, 0x86, - 0xfb, 0x4a, 0xf9, 0x17, 0x2c, 0x22, 0x24, 0xd4, 0x13, 0x3f, 0x8d, 0x1c, - 0xfd, 0xd0, 0x9d, 0x43, 0xf8, 0xa2, 0x3b, 0xd3, 0x49, 0xac, 0xc1, 0x58, - 0x0a, 0xe2, 0x03, 0xd6, 0x9b, 0x5f, 0xfc, 0x49, 0x17, 0xd3, 0x7e, 0x7a, - 0xaa, 0x0c, 0x62, 0x73, 0xbf, 0x30, 0x6d, 0x41, 0x74, 0x88, 0xcd, 0x8f, - 0xcb, 0xb3, 0x6d, 0x7b, 0x52, 0x2b, 0x04, 0x5e, 0xbd, 0x03, 0x64, 0x4a, - 0xf7, 0x52, 0x29, 0xd6, 0x1d, 0x42, 0x7e, 0xe6, 0xd2, 0xcd, 0xa8, 0xb0, - 0xdb, 0x9c, 0x92, 0xb2, 0x1c, 0x83, 0xa0, 0x5c, 0x9d, 0xdf, 0x01, 0xfd, - 0x2a, 0xd6, 0x97, 0x82, 0x4e, 0x18, 0x02, 0x3f, 0x4f, 0xb2, 0x18, 0x4b, - 0xb2, 0x4d, 0x58, 0x07, 0xd0, 0xa0, 0xd8, 0x87, 0x03, 0x31, 0x89, 0x6c, - 0xff, 0x7d, 0x8e, 0x43, 0x91, 0xf7, 0x15, 0x42, 0x86, 0xda, 0x7e, 0x82, - 0x6d, 0x6d, 0x42, 0x04, 0x4c, 0x56, 0xaf, 0x44, 0x7d, 0xe6, 0xde, 0x7a, - 0x39, 0xbb, 0x2b, 0xb8, 0x51, 0xf4, 0x74, 0x4e, 0xbf, 0xe7, 0x50, 0x50, - 0x67, 0x25, 0xf0, 0xe3, 0x0f, 0x55, 0xe9, 0x9c, 0x28, 0x28, 0x93, 0x44, - 0x4e, 0xa7, 0x9d, 0x08, 0xab, 0xbc, 0x6b, 0xfe, 0xab, 0x40, 0x8d, 0xb5, - 0xc9, 0x31, 0xfd, 0x37, 0xa0, 0x08, 0xef, 0xb2, 0x7d, 0xcc, 0x34, 0xb6, - 0x73, 0xd7, 0xc1, 0x1a, 0x29, 0x4e, 0x50, 0x22, 0x1c, 0x38, 0xca, 0x88, - 0x5c, 0xc0, 0x45, 0x7c, 0xb8, 0xcb, 0xfc, 0x43, 0xb7, 0xbe, 0x93, 0x09, - 0x80, 0xbf, 0x62, 0x1e, 0xb4, 0x8b, 0x3c, 0x71, 0x99, 0x4b, 0x7c, 0x12, - 0x0e, 0x6a, 0x77, 0x1f, 0xb9, 0xc8, 0xe4, 0x71, 0xe6, 0x02, 0x5d, 0xc5, - 0x61, 0x93, 0xc9, 0x67, 0x86, 0x09, 0xa3, 0xe7, 0xd1, 0x75, 0xa4, 0x82, - 0x1b, 0xce, 0x86, 0xe3, 0xa7, 0x6a, 0xd1, 0x69, 0xca, 0xe2, 0xa4, 0xd8, - 0x84, 0x7c, 0x41, 0x1b, 0xb7, 0x04, 0x6b, 0x3a, 0x14, 0xed, 0x75, 0xe6, - 0xad, 0x21, 0xf6, 0x18, 0x5a, 0xec, 0x40, 0x99, 0xb4, 0x43, 0xd7, 0x4c, - 0xe2, 0x15, 0x86, 0xfb, 0x07, 0x47, 0x87, 0xb7, 0xbf, 0xba, 0x70, 0xc8, - 0xfc, 0xcb, 0xa5, 0x29, 0xaa, 0x2f, 0xb1, 0xfe, 0x95, 0x0d, 0x3c, 0xb1, - 0x83, 0xf9, 0x57, 0xe5, 0xb2, 0x34, 0xdd, 0x0a, 0x86, 0xdb, 0x4d, 0x2b, - 0x86, 0x78, 0x2e, 0x87, 0x62, 0xcf, 0x52, 0xd8, 0x09, 0x05, 0xd7, 0xd4, - 0x31, 0xd6, 0xbc, 0xde, 0xf5, 0x32, 0x7b, 0xbc, 0xb0, 0x93, 0xbd, 0x47, - 0xb1, 0x1d, 0x96, 0xe3, 0xe3, 0xd2, 0x36, 0xf1, 0xf9, 0x83, 0x77, 0x6f, - 0x98, 0xc1, 0x11, 0x44, 0x96, 0xfb, 0x4d, 0x8b, 0x57, 0xe0, 0x30, 0x7b, - 0x18, 0x0e, 0x46, 0xc8, 0x8e, 0xe0, 0x75, 0x78, 0xdf, 0x39, 0x8e, 0x3e, - 0x17, 0xb0, 0x1f, 0x56, 0xf7, 0xcb, 0x7f, 0xcc, 0x4c, 0x56, 0x61, 0x23, - 0xc4, 0x2b, 0x04, 0x49, 0x1b, 0x6a, 0xeb, 0x90, 0xea, 0x23, 0x78, 0xcf, - 0x6e, 0x46, 0x32, 0xe4, 0x91, 0x5e, 0xd6, 0xa9, 0x60, 0x2c, 0x9d, 0x8e, - 0xac, 0xf1, 0xba, 0x49, 0xa1, 0xd2, 0x7e, 0x45, 0x2b, 0x7e, 0x70, 0x97, - 0x33, 0xa7, 0x86, 0xa3, 0x4b, 0x6e, 0xf1, 0xba, 0xba, 0x2d, 0xc6, 0xb7, - 0x20, 0xf7, 0x6e, 0xa0, 0xde, 0xf8, 0xa7, 0x66, 0x95, 0xd9, 0x15, 0x99, - 0x70, 0x35, 0xbb, 0xe2, 0x7f, 0x30, 0x9d, 0x9d, 0xb8, 0xf8, 0x0c, 0x22, - 0xd5, 0xf0, 0xe4, 0x87, 0xf0, 0xc4, 0xab, 0x12, 0x7d, 0xba, 0x90, 0x07, - 0xd3, 0x5e, 0xac, 0x84, 0xdb, 0x31, 0x6d, 0x5e, 0x7c, 0x40, 0x95, 0xcc, - 0x14, 0x3f, 0x1d, 0x4f, 0xd4, 0x72, 0x7a, 0x11, 0xa3, 0xa5, 0x0e, 0x2d, - 0x1b, 0x51, 0x49, 0x80, 0x22, 0x05, 0xfa, 0x73, 0xf2, 0x47, 0x65, 0xd4, - 0x25, 0x3d, 0xa6, 0x20, 0x13, 0xe0, 0xe7, 0xdc, 0x3b, 0x57, 0x1c, 0xd8, - 0xc1, 0x8b, 0x92, 0xbf, 0xb7, 0xfc, 0x6e, 0x65, 0x98, 0xe9, 0x25, 0x66, - 0xfe, 0xbf, 0x28, 0x67, 0x80, 0xcc, 0xa6, 0xa7, 0x67, 0x48, 0x35, 0x36, - 0xcb, 0xd9, 0x64, 0x3e, 0xeb, 0xcf, 0x5f, 0xd6, 0x60, 0x6a, 0x70, 0x8a, - 0xe2, 0xa7, 0xe4, 0xc4, 0xb4, 0x04, 0x95, 0x24, 0x94, 0x0f, 0x77, 0x93, - 0xfc, 0x1f, 0x6c, 0x16, 0xe7, 0x0a, 0x28, 0x3b, 0x39, 0x07, 0xd2, 0xa0, - 0xcc, 0x63, 0x11, 0x5e, 0xf9, 0x3f, 0x83, 0x2a, 0xb9, 0xe1, 0xdb, 0x0a, - 0x9c, 0x35, 0x18, 0x43, 0xc6, 0xb4, 0x3b, 0xf4, 0xc0, 0x69, 0xca, 0x96, - 0x7c, 0xdc, 0xb8, 0x69, 0x2f, 0xfd, 0x45, 0xe3, 0x85, 0x67, 0x28, 0x9a, - 0x1b, 0x6b, 0x86, 0x79, 0xd3, 0xbd, 0x4e, 0x0f, 0x9f, 0xf6, 0x1d, 0x6d, - 0x65, 0x90, 0x3b, 0x66, 0xfd, 0x09, 0x5e, 0xa7, 0x26, 0x03, 0xb0, 0x5d, - 0xe3, 0xc1, 0xf7, 0x84, 0x24, 0x63, 0xa5, 0x87, 0xec, 0x9c, 0x59, 0xa5, - 0x16, 0xac, 0x1a, 0x97, 0x6d, 0x20, 0xec, 0x6f, 0x55, 0x3d, 0x0e, 0x0f, - 0x17, 0x06, 0x26, 0x4b, 0x0b, 0xaf, 0x42, 0x72, 0xa9, 0x84, 0x3a, 0x34, - 0x3f, 0x4b, 0xee, 0xb2, 0xc7, 0xa6, 0x16, 0xfe, 0xa0, 0xe2, 0x48, 0x1b, - 0x05, 0x69, 0x85, 0xad, 0x20, 0x20, 0xc7, 0x93, 0x8c, 0xcc, 0x9a, 0x5b, - 0xc2, 0x25, 0x09, 0x80, 0x22, 0xaa, 0x13, 0x9b, 0xd2, 0xcb, 0x69, 0xee, - 0xe1, 0x7c, 0x34, 0xb1, 0x34, 0x71, 0x84, 0xbb, 0xbf, 0x59, 0x69, 0x53, - 0x9e, 0x18, 0x26, 0xfe, 0xae, 0x6f, 0x54, 0x60, 0x6d, 0xe2, 0xac, 0x76, - 0x6e, 0x34, 0x4f, 0x59, 0xe0, 0xc6, 0xf9, 0xdd, 0xbb, 0x5c, 0xd7, 0xe2, - 0xd4, 0x1d, 0xb2, 0xef, 0x0f, 0x2d, 0x3c, 0xcd, 0xee, 0xf7, 0x9f, 0xe8, - 0xdc, 0x58, 0x71, 0xa2, 0xa4, 0xb5, 0xa3, 0xbb, 0x95, 0xcc, 0x0a, 0xef, - 0xaa, 0x63, 0x80, 0xd2, 0x4c, 0xd9, 0xc0, 0x4b, 0xbf, 0x84, 0xf1, 0x1d, - 0x41, 0x32, 0xb7, 0x75, 0xad, 0xf0, 0xc4, 0xfe, 0x18, 0x0c, 0x3e, 0x06, - 0xae, 0x05, 0x9b, 0xbf, 0xa7, 0x65, 0xc1, 0x00, 0xa7, 0xe1, 0x00, 0x2e, - 0xa6, 0x1f, 0x03, 0x10, 0xe9, 0xee, 0xd1, 0x6c, 0x55, 0xc2, 0xee, 0xf1, - 0xd1, 0x0a, 0xad, 0xe1, 0x9b, 0xa9, 0xe4, 0xc4, 0x31, 0x38, 0x35, 0xa8, - 0x69, 0x29, 0x99, 0x66, 0x7b, 0x62, 0x99, 0x04, 0xbf, 0x01, 0xde, 0x78, - 0x1e, 0x50, 0x80, 0x5e, 0x92, 0x74, 0x1e, 0x5b, 0x9c, 0x03, 0xdb, 0x78, - 0x5a, 0x8a, 0x9f, 0x71, 0x3c, 0x8d, 0xaa, 0x44, 0xf3, 0xb8, 0x6d, 0x59, - 0xf9, 0x88, 0x66, 0x26, 0x76, 0xdc, 0xb0, 0x59, 0x6c, 0x0e, 0x64, 0x2c, - 0xe1, 0x5b, 0xc2, 0xfc, 0x44, 0x5d, 0x95, 0x02, 0x29, 0xd6, 0x67, 0x3c, - 0xd0, 0x92, 0x67, 0x2d, 0x48, 0x84, 0x01, 0xef, 0x69, 0x96, 0x53, 0x1c, - 0x28, 0x7b, 0x15, 0xcc, 0x10, 0xf6, 0xdf, 0xf4, 0x44, 0x34, 0x89, 0x89, - 0xc3, 0x1f, 0xa4, 0xdc, 0x92, 0xa4, 0x69, 0xbc, 0x90, 0xeb, 0x2d, 0x5c, - 0x10, 0x22, 0xa9, 0x4a, 0xf2, 0xd5, 0xcc, 0x32, 0xf6, 0xde, 0x42, 0x7b, - 0xae, 0x03, 0xc6, 0x1f, 0x24, 0xa5, 0xbc, 0xa3, 0xb5, 0x4f, 0x7c, 0x5d, - 0x18, 0x49, 0xa1, 0x30, 0x68, 0xf2, 0x52, 0x94, 0x38, 0xb6, 0xa5, 0x06, - 0x19, 0x8d, 0x85, 0x2a, 0xfc, 0x46, 0xc1, 0x56, 0x55, 0xbf, 0xe1, 0xf9, - 0x5c, 0x56, 0xff, 0x75, 0xb0, 0x15, 0x60, 0x67, 0x5d, 0xb7, 0x70, 0x6f, - 0x4f, 0x23, 0x53, 0x5d, 0xa2, 0x9d, 0x10, 0x61, 0x8d, 0x0f, 0x9b, 0x36, - 0x75, 0xe7, 0x69, 0x52, 0xc1, 0x07, 0xd4, 0x5c, 0xac, 0xf1, 0x89, 0x60, - 0xdf, 0x46, 0x76, 0xde, 0x4d, 0xb4, 0xf1, 0x6e, 0x3c, 0x26, 0x88, 0xff, - 0x86, 0x18, 0x8f, 0xa0, 0x51, 0x2c, 0xa8, 0xff, 0x3f, 0xd0, 0x10, 0xe7, - 0x05, 0x96, 0xcd, 0x9b, 0x82, 0x88, 0xb7, 0x50, 0x51, 0x95, 0xce, 0xc4, - 0x94, 0xd5, 0xb3, 0x47, 0xd3, 0x7d, 0x07, 0x24, 0x15, 0x80, 0x5b, 0x40, - 0xce, 0x33, 0x55, 0x35, 0xc4, 0x90, 0x56, 0x39, 0xea, 0x60, 0xbc, 0x51, - 0x48, 0x73, 0x9f, 0xa1, 0xd8, 0xfb, 0xe8, 0x82, 0x82, 0xff, 0x29, 0x3b, - 0xab, 0x82, 0x4e, 0x3a, 0xc7, 0x65, 0xa6, 0x1e, 0xe9, 0x4a, 0xdf, 0x86, - 0x30, 0xa6, 0x86, 0x65, 0x11, 0xde, 0xb4, 0x5a, 0x16, 0xe6, 0x4b, 0xdd, - 0x4b, 0x17, 0x20, 0xe3, 0x51, 0x07, 0xe3, 0xfb, 0x3c, 0xfb, 0x5b, 0x6b, - 0x56, 0xf3, 0x68, 0x97, 0x92, 0xe7, 0x57, 0x5f, 0x60, 0x9f, 0xa6, 0x14, - 0x36, 0x27, 0xd6, 0x8b, 0x2b, 0xb9, 0x9f, 0xec, 0x58, 0x55, 0xd6, 0x17, - 0xb1, 0x02, 0xf6, 0x6c, 0x7a, 0xfd, 0x1c, 0xdb, 0x95, 0xfe, 0x22, 0x10, - 0xd7, 0x35, 0xe8, 0x96, 0xd4, 0x5a, 0x36, 0x15, 0x97, 0x9b, 0xf5, 0x91, - 0x7f, 0xbe, 0xe3, 0xd2, 0xc8, 0xcc, 0xb1, 0x9c, 0x17, 0x46, 0xb0, 0xa2, - 0xa4, 0xea, 0x95, 0x00, 0x7c, 0x48, 0xcb, 0x75, 0x16, 0x68, 0x2a, 0xae, - 0xc4, 0xfe, 0x97, 0xf4, 0xfb, 0x85, 0x24, 0xcb, 0xf0, 0x4d, 0x52, 0x37, - 0x40, 0x35, 0xff, 0x95, 0x0f, 0x8c, 0xfc, 0xf7, 0x2b, 0x3b, 0x97, 0x8d, - 0x45, 0xcd, 0x8d, 0x37, 0x87, 0xdb, 0xf8, 0x72, 0x91, 0xd3, 0xdc, 0xc2, - 0x66, 0x1c, 0xef, 0xf6, 0xac, 0x00, 0xad, 0xd4, 0xd9, 0xb0, 0x4c, 0xd4, - 0x38, 0x03, 0x04, 0xdb, 0xfe, 0xb1, 0xd5, 0x15, 0x5b, 0x7d, 0x5b, 0xec, - 0xa3, 0x64, 0x5a, 0xff, 0x18, 0xba, 0xf6, 0x34, 0xe2, 0x51, 0xfb, 0x16, - 0x8a, 0x6c, 0xd1, 0x7b, 0x97, 0xcd, 0x5c, 0x4b, 0x83, 0xb3, 0x90, 0x44, - 0x94, 0x26, 0xdc, 0xe4, 0x51, 0x5e, 0x5f, 0x9e, 0x4c, 0x3a, 0xaf, 0x9d, - 0xd6, 0xfc, 0xad, 0x43, 0xf6, 0x04, 0xe6, 0x4b, 0x3e, 0xa4, 0x8e, 0x7a, - 0xf0, 0x16, 0x53, 0x45, 0x81, 0x4f, 0x7c, 0x74, 0xc2, 0xed, 0xfd, 0x01, - 0xe0, 0xcd, 0x33, 0xb0, 0x74, 0xae, 0xe3, 0x82, 0x3b, 0xfa, 0x90, 0xda, - 0xf4, 0x11, 0x40, 0x8c, 0xdc, 0x0c, 0x8e, 0x7c, 0x41, 0x82, 0x0c, 0x2d, - 0xb6, 0x1c, 0xd8, 0x83, 0x4a, 0xd6, 0xb4, 0xfe, 0x36, 0xae, 0xc1, 0xa0, - 0x72, 0x3e, 0x56, 0x22, 0x3c, 0x70, 0xe7, 0xe6, 0x76, 0x8c, 0x64, 0xae, - 0x61, 0xd5, 0x9e, 0x0f, 0x16, 0xe1, 0x3b, 0xbc, 0x2e, 0xdb, 0x61, 0xb4, - 0xf5, 0x8e, 0x57, 0x57, 0x1a, 0x22, 0xcd, 0x91, 0xaa, 0xcb, 0xfe, 0x06, - 0x1a, 0x65, 0x38, 0x5f, 0x40, 0xae, 0x90, 0xa8, 0x9c, 0xaf, 0xe2, 0xb1, - 0x3b, 0xc5, 0x03, 0xf6, 0x11, 0xeb, 0x18, 0xec, 0xeb, 0x1e, 0x50, 0x8b, - 0x2f, 0xa3, 0x99, 0x37, 0xad, 0x9c, 0x68, 0x91, 0x16, 0x5f, 0xb7, 0x71, - 0x44, 0xf5, 0x88, 0x7a, 0x3c, 0xa2, 0xa0, 0xb2, 0xc7, 0x1e, 0x78, 0x16, - 0x91, 0xc5, 0xac, 0x24, 0x66, 0x38, 0x8c, 0x8c, 0x03, 0x14, 0x30, 0x97, - 0xb6, 0x05, 0x77, 0x9e, 0x03, 0xc5, 0x8d, 0x70, 0x97, 0x44, 0x0e, 0xdb, - 0x53, 0x07, 0xf3, 0x36, 0xf2, 0xce, 0x33, 0x74, 0x89, 0x51, 0x6b, 0xd1, - 0x93, 0xba, 0xa4, 0x3f, 0x84, 0x8e, 0xe4, 0xdc, 0x3e, 0xc7, 0x63, 0xbf, - 0x0b, 0x61, 0xcd, 0x4d, 0x97, 0xde, 0x68, 0x5c, 0x31, 0x67, 0xc3, 0xbd, - 0xec, 0x58, 0xe5, 0xea, 0x36, 0x53, 0x4e, 0xe8, 0x81, 0x20, 0xe3, 0x69, - 0x1a, 0xd0, 0x39, 0x04, 0x9e, 0x92, 0x20, 0x74, 0x16, 0x03, 0x43, 0x35, - 0x5a, 0xe6, 0x12, 0x2f, 0x5c, 0x81, 0x2f, 0x31, 0xc4, 0x51, 0x0d, 0x8e, - 0xb9, 0x89, 0x2c, 0xf4, 0x9c, 0x79, 0x83, 0xc1, 0x06, 0xfe, 0x9d, 0x87, - 0x41, 0xfc, 0x72, 0x61, 0x7a, 0x99, 0x5b, 0x60, 0x4b, 0x07, 0x50, 0x9d, - 0x0e, 0x88, 0x66, 0x28, 0xce, 0xd7, 0x4a, 0x42, 0x00, 0xdf, 0x80, 0xf6, - 0x10, 0x8d, 0x04, 0x0a, 0x97, 0x9e, 0xd0, 0xe0, 0xbf, 0x0d, 0xfa, 0x86, - 0x27, 0x75, 0xea, 0x0d, 0xbe, 0x97, 0x89, 0x4c, 0xff, 0x1d, 0xd1, 0x02, - 0x34, 0xf1, 0xb1, 0x8e, 0x33, 0x9b, 0xf8, 0x00, 0x8e, 0x71, 0x30, 0x89, - 0xe4, 0xc4, 0x11, 0x02, 0x2c, 0x62, 0x0c, 0x10, 0xcc, 0x41, 0x07, 0x04, - 0xf5, 0x26, 0x22, 0x4a, 0x29, 0x3e, 0x1f, 0x4c, 0x6f, 0xec, 0xe8, 0x3f, - 0x90, 0x09, 0x97, 0x85, 0xf8, 0x34, 0x7f, 0xe3, 0xff, 0x80, 0x16, 0x31, - 0xe6, 0x34, 0x42, 0x1c, 0x1e, 0xf7, 0xc0, 0xb5, 0xee, 0xd6, 0x10, 0x08, - 0x14, 0xb9, 0x58, 0x34, 0x1f, 0xf6, 0xeb, 0x2f, 0xa5, 0x20, 0x3f, 0x53, - 0x51, 0x02, 0x90, 0xc9, 0x1f, 0x44, 0xfd, 0x98, 0x6f, 0xf5, 0xcd, 0x2d, - 0xfe, 0xa4, 0x64, 0xed, 0x8d, 0x65, 0x89, 0x6d, 0x1e, 0xab, 0x8c, 0x11, - 0x30, 0xfa, 0xa3, 0xf2, 0xfa, 0x41, 0xaa, 0x27, 0x19, 0xff, 0x24, 0x78, - 0xc5, 0x68, 0x8c, 0x44, 0x2f, 0xbc, 0xc8, 0x71, 0x87, 0xc4, 0x81, 0x15, - 0x81, 0xe5, 0x2b, 0xfd, 0x1b, 0xd4, 0x17, 0xa1, 0x01, 0x66, 0x42, 0x0e, - 0x10, 0x68, 0x6f, 0x75, 0x90, 0x54, 0x03, 0xf6, 0xd3, 0x16, 0x25, 0x85, - 0x36, 0xa9, 0x5c, 0xf1, 0x9e, 0x1b, 0x60, 0x9c, 0x79, 0xcc, 0x44, 0xd0, - 0x7e, 0xe7, 0xc2, 0x80, 0x33, 0x29, 0xa1, 0x81, 0x89, 0xf5, 0xde, 0x78, - 0x26, 0x9f, 0x32, 0x92, 0x8b, 0xec, 0xec, 0xa7, 0x03, 0x31, 0xfd, 0x1a, - 0x3b, 0x52, 0xc7, 0x2c, 0xe0, 0xe1, 0x06, 0xc7, 0x04, 0xc4, 0x79, 0xe3, - 0x5c, 0x25, 0xe1, 0xf1, 0x73, 0x64, 0x97, 0xc4, 0xc3, 0xa6, 0x1b, 0xf3, - 0x89, 0x07, 0x84, 0x11, 0xa1, 0xc5, 0xd5, 0xf0, 0x5f, 0x66, 0xa6, 0x3f, - 0x1f, 0xc5, 0x30, 0x8e, 0x02, 0xe4, 0x15, 0x0d, 0x7c, 0x76, 0x97, 0x75, - 0xdb, 0xa0, 0xc7, 0x01, 0x5d, 0xff, 0xdf, 0xed, 0xfb, 0x2e, 0x2e, 0xf5, - 0xe4, 0xfd, 0xc9, 0x31, 0x90, 0x29, 0xb4, 0xbf, 0x12, 0x8f, 0xc9, 0x34, - 0x07, 0xc0, 0x56, 0xa6, 0x89, 0x17, 0x72, 0x5d, 0x03, 0xf9, 0xac, 0x38, - 0x46, 0xa3, 0xcf, 0x42, 0x49, 0x29, 0x37, 0x2a, 0x81, 0xbf, 0x5b, 0x4f, - 0xfe, 0xfb, 0xb3, 0x65, 0xcd, 0xf7, 0x21, 0xd8, 0xbe, 0xba, 0xf3, 0x6b, - 0xa7, 0xdf, 0x79, 0x17, 0x6a, 0x74, 0xee, 0xbb, 0xcf, 0xe2, 0x95, 0x7b, - 0xe7, 0x36, 0x2e, 0xcc, 0x96, 0x8d, 0x66, 0xcc, 0x1d, 0x66, 0xa1, 0xc9, - 0x11, 0xa1, 0x2f, 0x15, 0x61, 0xa0, 0xd2, 0x08, 0x8f, 0x14, 0x0c, 0xa6, - 0xed, 0xdc, 0x52, 0x89, 0xb4, 0x71, 0xc4, 0x18, 0xc3, 0xd2, 0xfb, 0x68, - 0xae, 0x38, 0x8e, 0xde, 0x60, 0x98, 0xd1, 0xd6, 0xb0, 0x2a, 0xfa, 0x11, - 0x6a, 0x59, 0xc9, 0x3b, 0xdb, 0xa9, 0xd9, 0x5f, 0x01, 0x7a, 0xcf, 0xc3, - 0x8f, 0xd9, 0x2a, 0xaa, 0x6c, 0xac, 0xa8, 0x77, 0xff, 0x43, 0x2b, 0x97, - 0x92, 0xf2, 0xda, 0x1e, 0xf5, 0x98, 0x5b, 0x6a, 0x77, 0x20, 0xcf, 0xfb, - 0xaf, 0xbf, 0x25, 0xf8, 0xf9, 0x89, 0x14, 0xf3, 0x2c, 0x86, 0xed, 0xbf, - 0x67, 0x22, 0x27, 0x68, 0x8b, 0x3c, 0xd7, 0x8e, 0x04, 0x9e, 0xc5, 0xb8, - 0x08, 0x01, 0x63, 0x71, 0xaf, 0xc3, 0xc7, 0x48, 0x23, 0x02, 0x72, 0x78, - 0xd4, 0x39, 0x4f, 0xcb, 0x55, 0x77, 0x4b, 0x52, 0xbb, 0x07, 0xab, 0x91, - 0xc9, 0xc2, 0x76, 0xc2, 0xb3, 0xff, 0xd1, 0x5f, 0xab, 0x29, 0x19, 0x9b, - 0x44, 0x61, 0x9f, 0x49, 0x52, 0x90, 0x6a, 0xa0, 0x03, 0x4b, 0x11, 0xa1, - 0xdd, 0xad, 0x64, 0x6d, 0x51, 0xab, 0x00, 0x01, 0x2c, 0xc9, 0x4b, 0x1d, - 0x31, 0x72, 0x79, 0x4b, 0x52, 0xe8, 0xc2, 0x5e, 0xb3, 0xde, 0x41, 0xc8, - 0x92, 0x33, 0xa1, 0xce, 0xb6, 0x88, 0x0c, 0x16, 0x4b, 0xbf, 0x5a, 0x07, - 0xda, 0x0e, 0xaa, 0x74, 0x5a, 0x9c, 0x31, 0x19, 0xef, 0x79, 0x9d, 0x43, - 0x08, 0x16, 0x19, 0x42, 0xf1, 0x9f, 0xf0, 0x15, 0x35, 0x4c, 0xc3, 0x17, - 0x2b, 0xf9, 0x49, 0xac, 0x7d, 0x67, 0x35, 0xf9, 0x46, 0x7f, 0xe7, 0x5c, - 0x66, 0x24, 0x8f, 0xf0, 0x41, 0xcd, 0x5c, 0xe6, 0xc7, 0x92, 0x63, 0x00, - 0xab, 0xe1, 0x0e, 0x87, 0x41, 0x33, 0xd0, 0xb3, 0x8c, 0x66, 0x5a, 0x2b, - 0x0e, 0x49, 0xa4, 0x21, 0x69, 0xa0, 0x8d, 0x20, 0xf7, 0x0e, 0xb4, 0xce, - 0xc1, 0xf5, 0x7d, 0x3b, 0x33, 0xcd, 0xb5, 0xa2, 0x05, 0x00, 0x32, 0x25, - 0x0c, 0x2a, 0xd5, 0x7e, 0xc3, 0x38, 0x5a, 0xce, 0x48, 0xf6, 0xf4, 0xd6, - 0xed, 0xe9, 0x16, 0x27, 0x5e, 0x98, 0xf1, 0xb0, 0x79, 0xb5, 0x3a, 0xff, - 0x9a, 0x03, 0xbb, 0xcd, 0x08, 0x59, 0xa9, 0x6b, 0xb0, 0xd8, 0x52, 0x78, - 0x4e, 0x2e, 0x43, 0xcf, 0x93, 0xc4, 0xff, 0x40, 0x3b, 0x9c, 0x3b, 0xff, - 0x65, 0x70, 0xa8, 0x26, 0x3f, 0x8f, 0x68, 0xa8, 0xc0, 0x42, 0x15, 0x57, - 0x8f, 0x53, 0xd1, 0x22, 0x76, 0xd2, 0x19, 0x6c, 0x5f, 0x1a, 0x51, 0x0c, - 0x55, 0x5e, 0x87, 0x6b, 0x6b, 0x58, 0x6e, 0x55, 0xe8, 0x03, 0x86, 0x17, - 0x7f, 0xf7, 0x44, 0x72, 0x6b, 0xe3, 0xb6, 0x71, 0x11, 0x93, 0xed, 0x4c, - 0x41, 0xe2, 0x3c, 0x89, 0x60, 0xd1, 0x7e, 0xc4, 0x17, 0x35, 0x87, 0xe5, - 0x2c, 0xb9, 0x6d, 0x4d, 0xf8, 0x77, 0xa8, 0x9f, 0x90, 0x05, 0x17, 0xe4, - 0x6d, 0x3d, 0x83, 0x89, 0x7a, 0xb9, 0x73, 0x3a, 0xcd, 0x0d, 0x2a, 0xac, - 0xdd, 0xd5, 0xc3, 0x57, 0xbc, 0x27, 0xc9, 0xf5, 0xe7, 0x6d, 0x72, 0x7d, - 0x45, 0x99, 0x30, 0x94, 0x5c, 0xec, 0xfa, 0xbe, 0xf0, 0xde, 0xc5, 0x81, - 0x34, 0x9c, 0xd3, 0x4c, 0xad, 0x02, 0x40, 0x24, 0x63, 0x66, 0x84, 0x24, - 0x6a, 0x2a, 0x41, 0x75, 0x97, 0x22, 0x4e, 0x1d, 0xc0, 0x53, 0x0b, 0xf9, - 0x3c, 0x63, 0x35, 0xf3, 0x80, 0x06, 0x04, 0x51, 0x4b, 0xee, 0xbe, 0x34, - 0xf3, 0x49, 0x7c, 0x85, 0x3c, 0x2f, 0x44, 0x0d, 0x27, 0x67, 0x96, 0xf6, - 0xfe, 0xb2, 0x08, 0xbe, 0x39, 0xd0, 0x2f, 0x82, 0x09, 0xe1, 0xc6, 0xd4, - 0xc8, 0xe0, 0xef, 0x5e, 0x89, 0xbd, 0xfc, 0xc4, 0xa3, 0xe8, 0xbf, 0x65, - 0xf2, 0xdf, 0x7a, 0xcd, 0x61, 0x2a, 0x6e, 0x78, 0x08, 0xfb, 0x6a, 0x35, - 0x1d, 0xce, 0x39, 0xb2, 0xef, 0x52, 0xc6, 0xdb, 0xa1, 0x80, 0x9f, 0x3f, - 0xfc, 0x17, 0xdc, 0x13, 0x54, 0x22, 0x74, 0xc6, 0xfa, 0x63, 0xce, 0x0b, - 0x99, 0x14, 0x6c, 0x7f, 0x3a, 0x29, 0xfb, 0x8b, 0xa3, 0x7c, 0xaf, 0x9d, - 0xa6, 0x30, 0xe5, 0x72, 0xd6, 0x1f, 0xad, 0x20, 0x2a, 0x73, 0x97, 0x07, - 0x9a, 0xcd, 0x2f, 0xe4, 0xbd, 0xf6, 0x6e, 0xf0, 0xf9, 0x9f, 0x5a, 0x0b, - 0xef, 0x96, 0x64, 0x36, 0x9f, 0x41, 0xa3, 0x68, 0x1c, 0xbc, 0xc4, 0xaa, - 0x6a, 0x4b, 0x2c, 0xde, 0x05, 0x71, 0x51, 0xd9, 0xad, 0xcf, 0x1a, 0x42, - 0x8e, 0x57, 0xb4, 0x85, 0x78, 0x70, 0x4f, 0x57, 0xdd, 0xef, 0xc0, 0x78, - 0x46, 0x49, 0xf3, 0x76, 0x5d, 0x55, 0x00, 0x2f, 0x56, 0x04, 0xfd, 0x08, - 0x8c, 0x34, 0xa2, 0x2c, 0x43, 0xee, 0x33, 0xfe, 0x0d, 0x0f, 0xfc, 0x58, - 0xa1, 0x59, 0x0c, 0x19, 0x8b, 0x06, 0x58, 0x23, 0x72, 0xa6, 0x28, 0x9c, - 0x6d, 0x96, 0x29, 0x52, 0x3d, 0x12, 0x10, 0xb2, 0x27, 0x2b, 0x4e, 0xff, - 0x6f, 0x6b, 0xd8, 0xb2, 0x83, 0x41, 0x34, 0x18, 0xc9, 0xd3, 0x41, 0x93, - 0x1f, 0xab, 0xb1, 0x87, 0xb8, 0x3e, 0xf7, 0xcf, 0x97, 0x02, 0x30, 0x14, - 0xfe, 0x93, 0xc2, 0xe1, 0x0b, 0x05, 0xed, 0xa5, 0xa1, 0xf3, 0xd6, 0xc3, - 0x15, 0x0f, 0x4d, 0x18, 0x9d, 0x9d, 0xde, 0x0a, 0x52, 0x2d, 0x42, 0x33, - 0x06, 0x16, 0xf0, 0xad, 0x25, 0xd1, 0x7a, 0xb4, 0x78, 0x42, 0x16, 0x8d, - 0x38, 0x43, 0xbe, 0xf0, 0xd4, 0xdc, 0x04, 0xcb, 0xea, 0xd4, 0x09, 0xa5, - 0x99, 0x90, 0x68, 0xef, 0xdd, 0x01, 0xef, 0xbf, 0xd9, 0x50, 0x19, 0x7a, - 0xb7, 0xe1, 0x2b, 0xd4, 0x11, 0x18, 0x84, 0xb3, 0x02, 0xfe, 0x50, 0x63, - 0x49, 0xbf, 0xdf, 0x10, 0x55, 0xbc, 0x41, 0xce, 0x22, 0x0d, 0xe9, 0xda, - 0x17, 0x5c, 0xd5, 0x7f, 0x3a, 0xc5, 0x8a, 0x5d, 0xe2, 0x90, 0x6e, 0x66, - 0x4e, 0x13, 0x70, 0x17, 0x53, 0x99, 0x57, 0x90, 0xd4, 0x4d, 0x38, 0xc8, - 0x74, 0x6d, 0x38, 0x8a, 0x53, 0xa0, 0x1e, 0x48, 0x9b, 0xd9, 0x45, 0x1c, - 0x60, 0x10, 0x86, 0xb9, 0xaa, 0x93, 0xed, 0x42, 0x40, 0xfd, 0x0e, 0x19, - 0x48, 0xb1, 0x02, 0x8e, 0x7b, 0x7c, 0x55, 0xa9, 0x97, 0xd2, 0xc2, 0xac, - 0x62, 0x80, 0x80, 0x33, 0x2c, 0xe9, 0x6a, 0x24, 0xe5, 0x9e, 0x13, 0x53, - 0x05, 0xc0, 0xc4, 0x13, 0x68, 0x01, 0x2e, 0x40, 0xc8, 0xb7, 0xb9, 0xef, - 0x3b, 0x76, 0xd9, 0x0e, 0x99, 0xea, 0x3f, 0x83, 0x2e, 0xfc, 0x07, 0x8f, - 0x25, 0xdd, 0x7c, 0x67, 0xd6, 0x6b, 0x83, 0x2f, 0x56, 0xe3, 0x49, 0xd8, - 0xa3, 0x6a, 0xde, 0x43, 0x7b, 0x60, 0x23, 0xe4, 0x7f, 0x9e, 0x17, 0x7e, - 0xc2, 0xdd, 0x88, 0xff, 0x59, 0xb5, 0xe9, 0xf7, 0x15, 0x22, 0xc5, 0xa7, - 0xe6, 0xbf, 0x40, 0x2c, 0x1f, 0xa7, 0xfd, 0x5c, 0xa4, 0x72, 0xcc, 0xc8, - 0xf3, 0x41, 0xf1, 0x82, 0xee, 0x4e, 0xce, 0xdb, 0x51, 0x84, 0x03, 0x5e, - 0x16, 0x9d, 0x50, 0x6e, 0x19, 0xb8, 0x52, 0x73, 0x01, 0x0a, 0x5e, 0x7d, - 0xb7, 0xb3, 0x66, 0xe7, 0xb0, 0x8c, 0x70, 0x50, 0x1d, 0x06, 0xcf, 0xd5, - 0xa8, 0xcb, 0x01, 0x14, 0x0a, 0xc4, 0xd6, 0x63, 0xbe, 0x41, 0x02, 0xa8, - 0x3d, 0x6e, 0x55, 0x7a, 0xa6, 0x00, 0x43, 0xa3, 0x6c, 0xe1, 0x49, 0xa9, - 0x37, 0x3c, 0x27, 0x91, 0x41, 0xbc, 0xec, 0xb1, 0x67, 0x69, 0x5c, 0xd7, - 0x0c, 0x75, 0x21, 0xe8, 0xa0, 0xf8, 0x1b, 0xf9, 0x44, 0x9c, 0x4a, 0xba, - 0xef, 0x80, 0x7f, 0xb9, 0xca, 0xbc, 0x21, 0x60, 0x71, 0xfe, 0x9a, 0x45, - 0xb8, 0x24, 0x41, 0xfd, 0xac, 0x8a, 0xc3, 0x04, 0x64, 0x7f, 0x4d, 0x1b, - 0xaf, 0x76, 0xd8, 0x29, 0x36, 0x83, 0xec, 0x75, 0xef, 0x37, 0xd2, 0x21, - 0x94, 0x90, 0x2d, 0x38, 0x3c, 0x57, 0xd6, 0x0b, 0x2e, 0xc5, 0x23, 0x12, - 0x1e, 0x54, 0xe0, 0xe1, 0x1f, 0xd0, 0x62, 0xa5, 0x57, 0x93, 0xbd, 0xa9, - 0x79, 0x21, 0x4d, 0xf7, 0x6a, 0x03, 0x42, 0x9d, 0xf2, 0x6c, 0xa9, 0x40, - 0xdf, 0xaf, 0xc8, 0xcc, 0x0f, 0x2d, 0x1a, 0xc1, 0x51, 0x65, 0x39, 0x92, - 0x16, 0xd2, 0x5f, 0xef, 0xd9, 0xf5, 0x76, 0x57, 0xea, 0x5a, 0x67, 0x5c, - 0x93, 0xad, 0xef, 0x14, 0x1c, 0xbb, 0x6a, 0xb5, 0x9f, 0x56, 0x00, 0x1d, - 0xd3, 0x0f, 0xa2, 0x3a, 0x7f, 0x43, 0x30, 0x6f, 0xf2, 0x87, 0xa4, 0x82, - 0x94, 0x0f, 0x71, 0x37, 0x34, 0xa1, 0x66, 0xbc, 0xcb, 0x93, 0x1e, 0x1a, - 0x6a, 0x87, 0x21, 0x4e, 0x17, 0xb6, 0xc3, 0xa6, 0xf0, 0x76, 0xb7, 0x1a, - 0x2f, 0x8b, 0xcc, 0xd0, 0xd7, 0xfd, 0xae, 0xb2, 0x05, 0x0e, 0x0c, 0x02, - 0xb6, 0x62, 0xc2, 0xa1, 0xdf, 0x46, 0x7e, 0x70, 0x15, 0x8f, 0xba, 0x80, - 0x32, 0x02, 0x12, 0x4e, 0x05, 0x7a, 0xdb, 0x20, 0xa9, 0xc8, 0x7d, 0x1e, - 0x87, 0x0c, 0x19, 0x93, 0xf1, 0x89, 0x5a, 0xe8, 0x58, 0x2e, 0xa7, 0xf9, - 0xf7, 0x4e, 0x04, 0xcf, 0x73, 0xb6, 0xd1, 0xcd, 0x39, 0x1b, 0xeb, 0x37, - 0x33, 0x00, 0x53, 0x7b, 0xa4, 0xbb, 0xa7, 0x8e, 0x07, 0x45, 0x44, 0x50, - 0xd7, 0x65, 0x23, 0x0e, 0xcb, 0xd9, 0xdc, 0xd3, 0xcc, 0xb6, 0xb5, 0xc6, - 0x39, 0x1a, 0xd4, 0x3d, 0x45, 0x82, 0x98, 0xd6, 0x1b, 0x9d, 0x9c, 0x44, - 0xa8, 0x64, 0x9f, 0xca, 0x64, 0xee, 0xeb, 0xff, 0x2f, 0x6d, 0xf7, 0xfc, - 0x7f, 0x50, 0xa2, 0x58, 0xcf, 0xd4, 0x7c, 0x4d, 0x29, 0xb6, 0x72, 0x63, - 0x27, 0x3b, 0xca, 0xa5, 0xda, 0xc8, 0xe6, 0x1f, 0x92, 0xaf, 0x5f, 0xd3, - 0xbd, 0xf1, 0xf7, 0xd3, 0xfc, 0xe2, 0x6e, 0x18, 0x73, 0x4c, 0xbf, 0x74, - 0x9b, 0x72, 0x1a, 0x10, 0x49, 0x26, 0x67, 0x4e, 0x77, 0xac, 0xfe, 0x9c, - 0x37, 0x50, 0xf5, 0xba, 0x60, 0x76, 0xfb, 0xd0, 0x08, 0x9a, 0x2a, 0x52, - 0xff, 0x39, 0xd6, 0x02, 0xfa, 0xd5, 0x78, 0x9d, 0xa7, 0x68, 0x85, 0x0d, - 0xe7, 0xf0, 0x0b, 0x6a, 0xdf, 0x2a, 0x9e, 0xeb, 0x4f, 0x55, 0xdd, 0xc3, - 0xd1, 0x65, 0xc0, 0x4e, 0x25, 0x76, 0x75, 0x99, 0x89, 0x18, 0x67, 0xbb, - 0x3a, 0x4b, 0x96, 0xb1, 0xde, 0x97, 0xe1, 0xd0, 0x16, 0xc5, 0x9b, 0x9b, - 0x36, 0x7b, 0x09, 0xd0, 0x77, 0x2c, 0xb2, 0x11, 0x90, 0x7b, 0xf7, 0x3c, - 0xfe, 0x17, 0xf0, 0xc1, 0xba, 0xa7, 0x3f, 0x70, 0x64, 0x31, 0x44, 0x97, - 0x66, 0x47, 0x59, 0xc0, 0x9b, 0xef, 0xee, 0x99, 0x20, 0x5a, 0x82, 0x37, - 0x5d, 0x9f, 0x13, 0x78, 0x98, 0x7e, 0x15, 0x95, 0xcf, 0xec, 0xa0, 0x31, - 0xda, 0xb5, 0x18, 0xe3, 0x05, 0x21, 0x9e, 0x22, 0xbd, 0x4a, 0xd4, 0x09, - 0x51, 0x93, 0x9d, 0x3a, 0x28, 0x2d, 0xe3, 0x6c, 0xc8, 0x5a, 0xd5, 0x01, - 0xd4, 0x03, 0xda, 0x22, 0xaa, 0x1c, 0xc7, 0xd6, 0x13, 0x4b, 0x6d, 0x03, - 0x9c, 0x3a, 0xba, 0xfa, 0xb5, 0xa8, 0x5d, 0xe1, 0xcd, 0x5d, 0xd6, 0x3c, - 0xfe, 0xef, 0x13, 0xe5, 0x7c, 0x59, 0x38, 0x1f, 0x8f, 0x31, 0x77, 0xcc, - 0xdc, 0x8b, 0xa0, 0x6f, 0x78, 0xe3, 0x8f, 0xb0, 0xd3, 0xde, 0x1d, 0x91, - 0x6b, 0x5a, 0x22, 0x41, 0x68, 0x34, 0x25, 0xa8, 0x57, 0x8a, 0xdc, 0x48, - 0xb3, 0xc9, 0x00, 0x9f, 0x21, 0x1d, 0x02, 0xc0, 0x97, 0x09, 0xfa, 0x26, - 0x87, 0x91, 0xe9, 0xe9, 0x7d, 0x8e, 0x34, 0xcb, 0xe8, 0xa0, 0xfe, 0xee, - 0x00, 0xa9, 0xaf, 0x32, 0xfc, 0xdf, 0xd5, 0x16, 0x61, 0x35, 0x7b, 0x4c, - 0x18, 0xe6, 0x31, 0x26, 0x63, 0x12, 0x14, 0x16, 0x5b, 0xcd, 0x34, 0x66, - 0xf5, 0x95, 0xb8, 0x5c, 0x03, 0x97, 0x67, 0xea, 0xc4, 0x73, 0x14, 0xc2, - 0x0a, 0x06, 0xa6, 0xda, 0xd4, 0x38, 0x30, 0x5c, 0xc9, 0xb6, 0x6e, 0xa8, - 0x63, 0x72, 0xe3, 0xd1, 0x3f, 0x59, 0x8a, 0x2a, 0x9f, 0xca, 0xf3, 0xa7, - 0x07, 0x2e, 0xcc, 0xd1, 0xbb, 0x25, 0x43, 0xb5, 0xa6, 0xf1, 0xf6, 0x8f, - 0xa0, 0x45, 0xe6, 0x47, 0xc9, 0x11, 0xee, 0xc8, 0xd6, 0xee, 0x8c, 0x86, - 0x18, 0xdb, 0x71, 0x03, 0x38, 0x9b, 0xd4, 0x1e, 0x4f, 0x3d, 0xaa, 0xf9, - 0x63, 0xf4, 0xdc, 0x3b, 0x17, 0xd6, 0xeb, 0xb5, 0xb3, 0x7f, 0x2d, 0x26, - 0xf6, 0xb4, 0xe7, 0x87, 0xa2, 0x12, 0x10, 0x92, 0xa8, 0x92, 0x59, 0x5f, - 0xb9, 0xce, 0x09, 0x9e, 0x45, 0x40, 0x9a, 0x98, 0x3e, 0x37, 0x46, 0xeb, - 0x30, 0x60, 0x77, 0xb6, 0x0e, 0x2c, 0x92, 0x4f, 0x6f, 0xf8, 0x5c, 0xdf, - 0xd2, 0x50, 0x40, 0xe9, 0xc6, 0x27, 0x14, 0xef, 0xf7, 0x56, 0x06, 0x85, - 0x3b, 0xe5, 0x00, 0x41, 0xe5, 0x37, 0x9e, 0x84, 0xd3, 0xa8, 0xa7, 0xec, - 0x44, 0x38, 0x2d, 0x4b, 0xe3, 0xf6, 0x2b, 0x7a, 0x55, 0x45, 0x7c, 0x53, - 0x93, 0x15, 0x29, 0x85, 0x60, 0x60, 0x7f, 0x22, 0xdf, 0x49, 0xd5, 0x68, - 0xae, 0x68, 0x8f, 0x12, 0xee, 0xd5, 0x8b, 0x9e, 0x2e, 0xdf, 0x89, 0xc2, - 0x5d, 0x40, 0x3d, 0x0c, 0x01, 0xde, 0x88, 0xfb, 0xfa, 0x50, 0x0a, 0xec, - 0x07, 0xfa, 0x76, 0x9d, 0x7a, 0x70, 0x37, 0x72, 0xea, 0x0a, 0x6c, 0x0d, - 0xcd, 0xe9, 0x8c, 0xdc, 0xb6, 0x2e, 0x06, 0x27, 0xab, 0xa7, 0xbb, 0x65, - 0x6f, 0x13, 0xf7, 0x80, 0x41, 0x19, 0xb6, 0xa5, 0xa9, 0x30, 0x2b, 0x1f, - 0x5f, 0x25, 0x01, 0x22, 0xdc, 0x97, 0x2b, 0xd7, 0xf2, 0x78, 0xbe, 0x78, - 0xd0, 0xa6, 0x8f, 0x5c, 0x63, 0x5b, 0x2e, 0x42, 0x6b, 0xfb, 0xf3, 0xc2, - 0x3f, 0xba, 0xe2, 0x76, 0x49, 0x08, 0x1d, 0xd2, 0x9e, 0x76, 0xa6, 0x63, - 0x75, 0x2f, 0xc5, 0x54, 0xbd, 0x15, 0x7c, 0xa5, 0xa3, 0x68, 0xf3, 0xdc, - 0xeb, 0x44, 0x96, 0x0c, 0xf4, 0x67, 0xc4, 0xfb, 0xe1, 0x1c, 0xc4, 0xe4, - 0x17, 0xa8, 0x9d, 0x75, 0xe5, 0xf1, 0x38, 0x9e, 0x5b, 0x74, 0xe0, 0x50, - 0x62, 0x36, 0x96, 0x0e, 0x63, 0x1c, 0x3a, 0x71, 0xe4, 0x30, 0xf1, 0xc8, - 0xa1, 0x3e, 0xda, 0x1e, 0x08, 0x5a, 0x9e, 0x8b, 0x46, 0x80, 0x2b, 0xaf, - 0xfa, 0x8b, 0x4c, 0x71, 0xfd, 0xd9, 0x20, 0x2a, 0x09, 0xa7, 0xf7, 0x3a, - 0x1a, 0xab, 0xff, 0xf0, 0x6a, 0x03, 0x54, 0xb8, 0xce, 0xe5, 0xce, 0xaa, - 0x5e, 0xc4, 0xa1, 0xa1, 0x6f, 0x86, 0x10, 0x67, 0x4f, 0x5c, 0x6f, 0x92, - 0x83, 0x7f, 0x18, 0xd5, 0x8c, 0x84, 0x29, 0x88, 0x87, 0x5a, 0x9b, 0xc3, - 0x6e, 0x63, 0x4d, 0xe5, 0xed, 0x3a, 0x9b, 0xdb, 0xb6, 0x19, 0x9e, 0xc2, - 0x45, 0xdc, 0x52, 0xdd, 0xb2, 0xe6, 0x40, 0xbe, 0xa5, 0x11, 0x5e, 0x6d, - 0x84, 0x55, 0xe7, 0xf5, 0x8a, 0xde, 0xc9, 0x7b, 0xcc, 0x84, 0x60, 0xa2, - 0x62, 0x1c, 0xea, 0x96, 0x54, 0x1c, 0x55, 0x43, 0xba, 0x61, 0x37, 0xa1, - 0x7b, 0x5a, 0xcc, 0x00, 0x03, 0x95, 0x51, 0xaf, 0x53, 0xf0, 0x8b, 0x9f, - 0x1b, 0x27, 0xbf, 0xf5, 0x29, 0x8f, 0x47, 0xf1, 0xa5, 0xbe, 0x2c, 0xc0, - 0xba, 0xb4, 0x9d, 0x4a, 0x7c, 0x92, 0x2e, 0xcd, 0xbe, 0x8e, 0xbe, 0x8f, - 0xc8, 0xd1, 0x1a, 0x11, 0x11, 0xfc, 0x1f, 0x1d, 0xf6, 0x4a, 0x16, 0x5f, - 0x3f, 0x22, 0x97, 0x82, 0xae, 0x3c, 0xee, 0x72, 0xb7, 0x0d, 0xea, 0x6e, - 0x1e, 0xe2, 0xad, 0x4d, 0xfb, 0x7a, 0xb5, 0x5b, 0xf8, 0x19, 0x9d, 0x24, - 0x4d, 0x8c, 0x33, 0x15, 0xd7, 0x70, 0xe6, 0x94, 0xfc, 0xf4, 0x1a, 0x94, - 0xba, 0xb1, 0xcb, 0x04, 0x82, 0xb9, 0x07, 0xec, 0x46, 0xa8, 0x62, 0x90, - 0xd6, 0xc2, 0xe1, 0xe1, 0x0d, 0xa9, 0xae, 0x98, 0x33, 0x87, 0x04, 0x4b, - 0x1c, 0x47, 0x40, 0x06, 0x59, 0x83, 0x32, 0xe3, 0x51, 0x53, 0xdd, 0x02, - 0x49, 0x38, 0x9d, 0x9d, 0x4f, 0x34, 0x65, 0xd5, 0x64, 0xc1, 0xca, 0x62, - 0x01, 0x19, 0x25, 0xb3, 0xd1, 0xf8, 0x47, 0xef, 0x4f, 0xbc, 0xad, 0x7d, - 0xfe, 0xe9, 0xd5, 0xb3, 0x6f, 0xee, 0xbb, 0xb9, 0xff, 0xcc, 0x8a, 0x7e, - 0x4b, 0xde, 0x26, 0x59, 0x7e, 0x74, 0xfe, 0x78, 0xc6, 0x93, 0x34, 0xdc, - 0xbd, 0x4c, 0xd4, 0xcb, 0xf0, 0x73, 0x21, 0x9f, 0x20, 0x99, 0x38, 0x5b, - 0xf2, 0xbf, 0xfe, 0x40, 0xde, 0x21, 0x2f, 0xe7, 0x1f, 0x07, 0xd9, 0x59, - 0xcd, 0xfa, 0x96, 0x6c, 0x72, 0x15, 0x43, 0x74, 0x4e, 0xbb, 0x83, 0x92, - 0x72, 0xa9, 0xc8, 0x64, 0x19, 0xdd, 0x4a, 0xed, 0x0a, 0x9a, 0xa5, 0x7e, - 0x70, 0xb1, 0xe1, 0x66, 0x5d, 0x0e, 0x4d, 0x06, 0x23, 0x19, 0x67, 0x73, - 0x40, 0xb8, 0x39, 0x4f, 0xc8, 0x6d, 0xf9, 0xbf, 0xcc, 0xb7, 0xae, 0x69, - 0xa0, 0x7e, 0x20, 0x99, 0xb7, 0xa0, 0xa9, 0xc2, 0x0f, 0x9c, 0x62, 0x15, - 0x10, 0x48, 0xf7, 0x0e, 0xe7, 0x55, 0xd7, 0xc7, 0xda, 0x36, 0x02, 0x8a, - 0x3b, 0x06, 0x6a, 0x56, 0x78, 0x47, 0x06, 0xaf, 0x85, 0x09, 0x30, 0xb7, - 0x67, 0x20, 0x89, 0x2a, 0x32, 0xa7, 0xdb, 0x3c, 0x6c, 0x7e, 0x94, 0x2e, - 0xc7, 0xe0, 0x48, 0xee, 0xb4, 0x6c, 0xb2, 0x0a, 0x35, 0xb2, 0x7f, 0x8d, - 0x0d, 0x96, 0xee, 0x68, 0xfb, 0x47, 0x3f, 0x58, 0x85, 0xe1, 0x34, 0xec, - 0x93, 0x96, 0xea, 0x72, 0x78, 0xd2, 0xa0, 0xf6, 0x30, 0x0c, 0xaa, 0x87, - 0x27, 0x5d, 0x1c, 0x7f, 0xd8, 0x47, 0x85, 0x09, 0x19, 0xdf, 0xfd, 0x04, - 0x91, 0x09, 0xcf, 0x7b, 0x51, 0x3c, 0x22, 0xf8, 0x48, 0xc6, 0x1d, 0x03, - 0x8d, 0x63, 0x4e, 0x08, 0x94, 0x59, 0x90, 0x1b, 0x38, 0xb8, 0xcd, 0x51, - 0x4b, 0xb7, 0x58, 0xaf, 0x86, 0x5b, 0xa8, 0xd1, 0x16, 0x13, 0x7a, 0xdb, - 0x7d, 0xde, 0xaa, 0xc7, 0x50, 0x20, 0x93, 0x80, 0x93, 0x0a, 0x23, 0x91, - 0x01, 0xa8, 0x86, 0x88, 0xa1, 0x7a, 0xfa, 0x38, 0x33, 0x64, 0x33, 0xbb, - 0x58, 0x0c, 0x3d, 0x99, 0xa3, 0x46, 0x7c, 0xc6, 0x7c, 0x2a, 0x7f, 0x23, - 0x53, 0xcb, 0x0c, 0x28, 0x11, 0xf5, 0x8f, 0x51, 0x05, 0xef, 0x8f, 0x43, - 0x14, 0xa9, 0x84, 0x96, 0xe4, 0xb3, 0x18, 0x15, 0x45, 0x04, 0xec, 0xea, - 0xeb, 0x76, 0x03, 0x43, 0xc2, 0xd4, 0x2a, 0xc1, 0x12, 0xbc, 0x9a, 0x01, - 0x00, 0x91, 0x2a, 0x9b, 0x69, 0x14, 0xd1, 0xd2, 0x9b, 0xe6, 0x5b, 0x6c, - 0x0d, 0xab, 0x6c, 0x2f, 0x27, 0xe9, 0x27, 0x79, 0x0f, 0x0b, 0xc9, 0x55, - 0x17, 0x3c, 0x1d, 0x49, 0xc7, 0x5a, 0x81, 0x8e, 0x1c, 0x73, 0x4e, 0x4c, - 0x16, 0x50, 0xab, 0xf0, 0x6b, 0xdc, 0x14, 0x2c, 0xfa, 0xe2, 0xa6, 0xe7, - 0xaf, 0x29, 0x0b, 0xc5, 0xdc, 0xde, 0xb4, 0x5c, 0x9b, 0x42, 0xb6, 0x05, - 0x87, 0xa9, 0x75, 0xb3, 0xd2, 0x06, 0x58, 0x8c, 0x2f, 0x13, 0xcc, 0xf8, - 0xad, 0x73, 0xa9, 0xc7, 0xf6, 0x26, 0x5b, 0x1f, 0xa9, 0x76, 0x42, 0xf6, - 0x41, 0xb6, 0xfd, 0x8b, 0xed, 0xec, 0x95, 0xcb, 0x76, 0x8e, 0x5f, 0x7f, - 0xb9, 0x4e, 0x9a, 0xfe, 0x86, 0xed, 0x74, 0x14, 0xd2, 0x41, 0xb7, 0x27, - 0x17, 0xc5, 0x5b, 0x2c, 0xbb, 0x7d, 0xd0, 0xab, 0xd0, 0x5d, 0xc1, 0x13, - 0xe2, 0xba, 0x43, 0x53, 0x59, 0xaf, 0xbb, 0x5e, 0xb3, 0xca, 0x1e, 0x32, - 0xab, 0x5e, 0xa1, 0xf6, 0xa0, 0x29, 0xba, 0x6e, 0xfb, 0xc1, 0x34, 0xe3, - 0x36, 0xca, 0xe8, 0x17, 0x58, 0x78, 0xf2, 0x07, 0x1d, 0x56, 0xd9, 0x1f, - 0xea, 0x93, 0x22, 0xb6, 0x4c, 0xf9, 0x89, 0x53, 0x16, 0xae, 0xfd, 0x14, - 0x8a, 0xa0, 0xf5, 0x39, 0x05, 0xb9, 0x83, 0x78, 0x36, 0x20, 0x90, 0x37, - 0xc6, 0x94, 0x1a, 0xdd, 0x2a, 0x73, 0x1e, 0x74, 0x01, 0xff, 0x23, 0xec, - 0x44, 0xf7, 0x77, 0x79, 0xc5, 0x8a, 0x5c, 0x25, 0x52, 0x34, 0xcc, 0x70, - 0xf5, 0xdd, 0xba, 0x5d, 0x9c, 0x7e, 0x30, 0xef, 0x52, 0xd8, 0x44, 0xe0, - 0x33, 0x52, 0xb0, 0xd1, 0xe2, 0x66, 0x24, 0xc0, 0x8c, 0x4f, 0xf8, 0x27, - 0xbb, 0xc3, 0xc6, 0x0b, 0x29, 0x14, 0x3e, 0x44, 0xd5, 0x61, 0x2d, 0x2f, - 0x80, 0x32, 0x0d, 0x3e, 0x53, 0x5b, 0x47, 0x62, 0xeb, 0x4d, 0xc0, 0xca, - 0x6b, 0x82, 0xa5, 0x35, 0xb6, 0x9f, 0xf5, 0x84, 0x20, 0x61, 0x64, 0x9f, - 0x41, 0x19, 0x29, 0x06, 0x14, 0xba, 0x37, 0x34, 0x9f, 0x86, 0xb9, 0xd9, - 0x2f, 0x45, 0x84, 0x34, 0x62, 0x41, 0x2c, 0x14, 0xbb, 0x18, 0xf6, 0xc1, - 0x57, 0x93, 0x90, 0x1b, 0xc5, 0x4c, 0x51, 0x55, 0x4a, 0x31, 0xf4, 0x64, - 0x7c, 0x12, 0xd4, 0x41, 0x3f, 0x23, 0xef, 0x5b, 0xfe, 0x7f, 0xc0, 0x35, - 0x78, 0xc7, 0xce, 0x5f, 0x1c, 0x54, 0x4e, 0xfb, 0x6c, 0x42, 0x68, 0x4f, - 0x51, 0xbb, 0x6e, 0xf6, 0x9e, 0xf5, 0x88, 0x61, 0x8f, 0x20, 0xf8, 0x88, - 0x56, 0xd6, 0xaf, 0xbf, 0x2c, 0x7e, 0x9f, 0x5c, 0x9f, 0x71, 0x26, 0x48, - 0x11, 0x18, 0xaf, 0xe7, 0x27, 0x7c, 0x92, 0x50, 0x97, 0xfb, 0xa9, 0xd8, - 0xe1, 0x8a, 0x6f, 0xe7, 0x3f, 0x79, 0x9d, 0x41, 0x60, 0xd1, 0x8a, 0xa6, - 0x43, 0x4c, 0x2e, 0x21, 0x46, 0x30, 0xd3, 0x6d, 0x8b, 0x13, 0xd0, 0x9d, - 0x42, 0xdb, 0x10, 0x1a, 0x53, 0xa2, 0x55, 0x0d, 0x03, 0x8b, 0x9f, 0xc3, - 0x5d, 0xf4, 0x2f, 0x84, 0xd6, 0x3b, 0xda, 0x0d, 0x0e, 0x72, 0xe1, 0x7a, - 0xb1, 0x13, 0x59, 0xe2, 0xa0, 0x20, 0x2e, 0x98, 0x1f, 0x20, 0x1b, 0xdc, - 0x43, 0x5c, 0x3b, 0x45, 0x39, 0x0b, 0xc9, 0x82, 0x20, 0xab, 0xce, 0xff, - 0x7b, 0x63, 0xb5, 0x43, 0x45, 0xcf, 0x86, 0x67, 0x2c, 0x94, 0x40, 0x2b, - 0xbe, 0xe8, 0xdd, 0x79, 0x40, 0x87, 0xd1, 0x45, 0xe0, 0xc3, 0xe8, 0x91, - 0x21, 0x22, 0x8c, 0x0c, 0x18, 0x69, 0x39, 0x5f, 0x27, 0x74, 0xb4, 0x3c, - 0x39, 0x1d, 0x45, 0xc8, 0xeb, 0x39, 0xcf, 0x8f, 0x13, 0x46, 0x7f, 0xa6, - 0x63, 0xd3, 0xee, 0xda, 0x66, 0x95, 0xb6, 0x86, 0xd3, 0x6e, 0xcc, 0x11, - 0xc6, 0x9a, 0xf6, 0x96, 0x1f, 0xc0, 0x89, 0x99, 0x71, 0xcf, 0x66, 0xec, - 0x73, 0x46, 0xef, 0x4b, 0x44, 0x81, 0x0d, 0x9f, 0x02, 0x90, 0x58, 0xc5, - 0x7c, 0x73, 0x3c, 0x77, 0x77, 0x5e, 0xf5, 0x04, 0x70, 0x45, 0x16, 0xfa, - 0x8e, 0xd0, 0x35, 0x1c, 0x8b, 0xd6, 0x69, 0x19, 0x99, 0x5a, 0xf9, 0x1b, - 0x9f, 0x6d, 0x26, 0xfa, 0x23, 0xb1, 0x56, 0xa5, 0x27, 0xf4, 0x44, 0xd2, - 0x00, 0xbd, 0x16, 0xec, 0x36, 0xf7, 0x59, 0x4b, 0xff, 0xb2, 0xd8, 0xe5, - 0x39, 0x6d, 0xd7, 0x9f, 0x14, 0x0d, 0xbf, 0xa0, 0x6e, 0xba, 0x66, 0x26, - 0x82, 0x30, 0x49, 0xc0, 0x15, 0x3c, 0x65, 0x46, 0xbc, 0xf0, 0xf2, 0x61, - 0x7c, 0x73, 0x25, 0xa2, 0x3d, 0xc9, 0x12, 0x05, 0x49, 0x09, 0xcc, 0xfa, - 0xa0, 0xf9, 0x75, 0xe2, 0xa0, 0x30, 0x29, 0xfd, 0x66, 0x52, 0xc4, 0xb5, - 0xe4, 0x6a, 0xc1, 0xe9, 0x7b, 0xce, 0xea, 0x79, 0x05, 0x23, 0x22, 0x5f, - 0xde, 0xfc, 0x39, 0xdc, 0x7d, 0xc0, 0x36, 0xf9, 0x7b, 0xfb, 0x6f, 0x33, - 0xcb, 0x70, 0xac, 0x57, 0x2c, 0x64, 0x98, 0x77, 0xa5, 0xba, 0x6b, 0x52, - 0x44, 0x4f, 0xc5, 0xb9, 0x40, 0xb5, 0xae, 0x55, 0x1a, 0x5c, 0xb9, 0x10, - 0xfc, 0xf8, 0x45, 0xa9, 0x64, 0xcf, 0x56, 0xd7, 0x82, 0x24, 0x5d, 0x43, - 0x13, 0xc5, 0x29, 0x75, 0x29, 0x26, 0xa1, 0x02, 0x23, 0x66, 0x83, 0xea, - 0x2e, 0xc8, 0xb9, 0x18, 0x2a, 0xc1, 0xc7, 0xc4, 0xcd, 0xfe, 0x2b, 0xa4, - 0x99, 0x17, 0x50, 0xe4, 0x5b, 0x87, 0x31, 0x96, 0x05, 0xd1, 0x7a, 0xbf, - 0x6c, 0xd5, 0xb6, 0x0b, 0x99, 0xf9, 0xbb, 0x06, 0xdd, 0x05, 0x81, 0x31, - 0x60, 0x09, 0xe6, 0x06, 0xdd, 0x48, 0x86, 0xfa, 0x75, 0xba, 0x57, 0xc9, - 0x3d, 0x9b, 0x2a, 0x35, 0xcd, 0x9d, 0xc5, 0x7b, 0x38, 0x43, 0xa2, 0xdc, - 0xa9, 0xe7, 0x9e, 0xc8, 0xcc, 0xfb, 0xf5, 0x9b, 0x0a, 0x7a, 0xaa, 0x3f, - 0x03, 0xe5, 0x53, 0xea, 0xd4, 0xe1, 0xc7, 0x19, 0x99, 0x9e, 0xa9, 0x30, - 0xd1, 0x8b, 0x59, 0xb2, 0x61, 0x79, 0xe5, 0x42, 0x39, 0xfa, 0x13, 0xff, - 0xf3, 0x12, 0x35, 0xdb, 0x29, 0xf9, 0xed, 0x2f, 0xf4, 0xfb, 0xf7, 0xf1, - 0x52, 0xa7, 0x54, 0xaf, 0x49, 0x11, 0xff, 0xe5, 0x17, 0x00, 0xa2, 0xe7, - 0xa7, 0x21, 0xeb, 0xab, 0x07, 0x2a, 0x1b, 0xd6, 0x9c, 0x43, 0x0f, 0x1b, - 0x91, 0x83, 0x9a, 0x1c, 0xd9, 0xbd, 0x32, 0x13, 0x8b, 0xf1, 0x30, 0x64, - 0xa7, 0xe2, 0x8d, 0xc7, 0xe9, 0x23, 0x48, 0xca, 0x10, 0x70, 0xe1, 0x95, - 0x1b, 0xfc, 0x10, 0x78, 0xa5, 0xe6, 0x1a, 0xdb, 0x5b, 0x78, 0x44, 0x7b, - 0x54, 0x8e, 0xaf, 0xca, 0xf0, 0x15, 0xf3, 0x81, 0xc1, 0x31, 0xa3, 0xc3, - 0x45, 0xd2, 0x9c, 0x0f, 0x49, 0xbc, 0x7c, 0xc4, 0xb3, 0xfb, 0x9b, 0x26, - 0x41, 0x45, 0xd1, 0x68, 0x7f, 0x21, 0x0f, 0xe3, 0x31, 0x0e, 0xe9, 0x22, - 0x8a, 0x35, 0x93, 0x4a, 0x81, 0x93, 0xb3, 0xcb, 0x6d, 0xe6, 0x5d, 0xe6, - 0x10, 0x63, 0x5f, 0x28, 0x38, 0x91, 0x35, 0x90, 0xd1, 0x04, 0x1e, 0x81, - 0x9b, 0x85, 0x90, 0x58, 0x12, 0xf8, 0x7d, 0xd7, 0xda, 0x89, 0xdc, 0x68, - 0x22, 0x0c, 0x4b, 0xe9, 0x71, 0xfc, 0x1d, 0xbf, 0x5d, 0xd5, 0x07, 0x59, - 0x3e, 0xb7, 0x35, 0x24, 0x4d, 0xdc, 0x32, 0x1c, 0x2b, 0xdb, 0xda, 0x47, - 0xee, 0x3e, 0x9b, 0xe4, 0xfe, 0x15, 0x4b, 0x88, 0xb8, 0x11, 0x73, 0xdc, - 0xfd, 0xc3, 0x96, 0x7f, 0x8d, 0x10, 0xcb, 0xc2, 0xf7, 0xa0, 0xbc, 0x84, - 0x05, 0x31, 0x95, 0x29, 0xc8, 0x95, 0x56, 0x18, 0x04, 0x80, 0xca, 0x3e, - 0x85, 0x4f, 0x7b, 0xfc, 0x59, 0x24, 0x81, 0x4e, 0xaf, 0xe4, 0x1b, 0xca, - 0x22, 0xdf, 0x52, 0xb5, 0xba, 0x3b, 0x6a, 0x34, 0xf3, 0x43, 0x88, 0xce, - 0x46, 0xfd, 0xa5, 0xca, 0x7d, 0x8d, 0x63, 0x01, 0xbf, 0xf6, 0x05, 0xd6, - 0x4a, 0x6a, 0x89, 0x91, 0xdc, 0xd4, 0x77, 0xe8, 0xee, 0x3b, 0x84, 0x00, - 0xc2, 0xdf, 0xbd, 0x90, 0xeb, 0x0d, 0xb0, 0x13, 0xef, 0x25, 0x65, 0xc6, - 0xf1, 0x6f, 0xbf, 0x9b, 0xaf, 0x58, 0xf8, 0x56, 0xc8, 0x81, 0x5d, 0x0a, - 0xa9, 0x9d, 0x7b, 0x87, 0x42, 0x20, 0x38, 0x20, 0xeb, 0x3b, 0x23, 0x52, - 0xb4, 0xf2, 0x55, 0xeb, 0x01, 0x81, 0x9d, 0xae, 0xb6, 0xfa, 0xf3, 0x54, - 0x10, 0xa7, 0x98, 0x9a, 0xd3, 0xe4, 0xdc, 0xe9, 0xf2, 0x7e, 0xa6, 0x06, - 0x2d, 0x71, 0x7f, 0xaa, 0xf8, 0xfa, 0x88, 0x48, 0x23, 0x94, 0xd2, 0x17, - 0x35, 0x36, 0xcd, 0x49, 0x85, 0xc2, 0x8d, 0x8d, 0x0b, 0xef, 0x99, 0x92, - 0x12, 0xad, 0x4a, 0x7f, 0x50, 0xee, 0x68, 0xb2, 0x4a, 0x02, 0x90, 0x6f, - 0x53, 0x60, 0x50, 0xf2, 0xc6, 0xe1, 0xb2, 0xe6, 0xfd, 0x6d, 0xcd, 0x9d, - 0x9f, 0x3c, 0x50, 0xac, 0x78, 0xb7, 0xbc, 0xc9, 0x06, 0x7a, 0x3b, 0x4f, - 0xe5, 0x4d, 0x42, 0x6c, 0xf5, 0x72, 0xe9, 0xd5, 0x45, 0xbe, 0x31, 0x33, - 0x58, 0x85, 0x7f, 0x7a, 0x79, 0xf7, 0x32, 0x92, 0x36, 0x72, 0x0d, 0x84, - 0xb8, 0x4f, 0xec, 0xad, 0xf0, 0x28, 0xee, 0x41, 0x90, 0xe2, 0x2e, 0xaa, - 0xed, 0xe2, 0xa6, 0x9b, 0xd5, 0xf1, 0xbf, 0x3a, 0xe9, 0xa3, 0x92, 0x74, - 0xf5, 0x89, 0xb9, 0x3c, 0xa4, 0xf4, 0x44, 0xe6, 0xd1, 0xa0, 0x7a, 0xb1, - 0x95, 0x47, 0x33, 0xf2, 0xdd, 0xef, 0x1e, 0x7e, 0xb3, 0xdc, 0xcb, 0xb4, - 0xf2, 0x03, 0x27, 0x62, 0xac, 0xd6, 0x3e, 0x2c, 0x6e, 0x1d, 0x93, 0x72, - 0x11, 0x59, 0xf4, 0xe8, 0xfa, 0x76, 0x13, 0x58, 0x9d, 0xb9, 0x77, 0x39, - 0x37, 0xec, 0x2a, 0x83, 0x28, 0x22, 0x25, 0x95, 0x2c, 0x92, 0x9f, 0xe0, - 0xed, 0x15, 0xf7, 0xdf, 0x9c, 0xd1, 0x7d, 0x12, 0x96, 0x22, 0x88, 0xa4, - 0x64, 0x39, 0x7a, 0x55, 0x23, 0x9c, 0x50, 0xea, 0x12, 0x15, 0xe5, 0xef, - 0xe9, 0x79, 0xb2, 0x28, 0x9b, 0xb9, 0x6e, 0xd1, 0x2b, 0xef, 0xd2, 0xbb, - 0x06, 0x57, 0xfd, 0x73, 0x57, 0xdc, 0x3a, 0xbc, 0x05, 0x64, 0xeb, 0xf3, - 0x80, 0xff, 0xed, 0xc1, 0xfd, 0xf4, 0xcf, 0xf9, 0x96, 0xaa, 0xfe, 0xa5, - 0xe2, 0x08, 0xcf, 0xdb, 0xa2, 0x6a, 0xac, 0x37, 0x32, 0x08, 0x8f, 0xa6, - 0x11, 0xba, 0x7c, 0x97, 0x4f, 0xc7, 0x21, 0x17, 0x3e, 0x0f, 0x27, 0x12, - 0x9f, 0xd9, 0xdc, 0xf6, 0x6a, 0xbc, 0xf0, 0x1b, 0xc7, 0x72, 0x65, 0xfb, - 0x5a, 0xf0, 0x66, 0x80, 0x90, 0xe6, 0xf3, 0x94, 0x17, 0x9c, 0x6c, 0x14, - 0x29, 0x0b, 0x52, 0x3f, 0xbe, 0x3a, 0x6c, 0xd6, 0xa2, 0xf4, 0x1a, 0xb0, - 0x02, 0x2d, 0x52, 0x38, 0xae, 0xdb, 0x27, 0xd7, 0x5f, 0x94, 0x59, 0x50, - 0x5a, 0x09, 0xf0, 0x0d, 0x81, 0x9c, 0x17, 0x7b, 0xa0, 0x14, 0xa6, 0x72, - 0xdd, 0x84, 0x20, 0xdd, 0x02, 0x65, 0x88, 0x17, 0x34, 0xef, 0x1e, 0x5d, - 0xee, 0x9f, 0x21, 0x11, 0x86, 0x70, 0x29, 0x94, 0x95, 0x29, 0xf1, 0xa6, - 0x77, 0xc6, 0xf5, 0x22, 0xb7, 0x22, 0x31, 0xc6, 0x2e, 0x79, 0x0c, 0x26, - 0xda, 0xaa, 0xb5, 0x2f, 0x0c, 0x24, 0x48, 0x31, 0xda, 0x08, 0x8e, 0xc1, - 0xc1, 0x1f, 0xbd, 0x8b, 0xa8, 0x01, 0xc4, 0xf3, 0xb8, 0xf2, 0x05, 0x77, - 0xed, 0x7a, 0x8f, 0xa7, 0x5e, 0x37, 0x75, 0xe7, 0xd9, 0xce, 0xd4, 0xfb, - 0x9e, 0x63, 0xe1, 0x88, 0x91, 0x77, 0x55, 0x49, 0xf5, 0xa8, 0xc3, 0xc3, - 0x9e, 0x5b, 0x0b, 0xc1, 0x52, 0x16, 0x75, 0xaa, 0xa8, 0x94, 0xef, 0xa1, - 0xd1, 0x34, 0x10, 0xa1, 0x10, 0x9e, 0xc9, 0xe0, 0x5b, 0xe8, 0x0b, 0x64, - 0xc7, 0xb0, 0xe1, 0xda, 0xff, 0x37, 0xa7, 0xad, 0x37, 0xf0, 0x2f, 0xa8, - 0xc2, 0x9a, 0x47, 0xe7, 0x8c, 0xa8, 0xf3, 0x87, 0x3d, 0xf7, 0x4e, 0xdd, - 0xe1, 0x46, 0x7c, 0x61, 0xa8, 0x26, 0x48, 0x47, 0xec, 0x00, 0xe3, 0x4c, - 0xc3, 0x87, 0x37, 0x3b, 0xa6, 0xa5, 0xb3, 0x2e, 0xe7, 0xc5, 0x6f, 0x80, - 0x5f, 0xc5, 0xc0, 0x5a, 0xb1, 0x93, 0x84, 0xfb, 0x14, 0xde, 0x43, 0xef, - 0x1d, 0xe5, 0x8f, 0x3b, 0x9b, 0x5a, 0x4f, 0x98, 0xdf, 0xc0, 0x50, 0x14, - 0x82, 0x1d, 0x96, 0x72, 0x00, 0x61, 0xe1, 0x17, 0x29, 0xc0, 0x04, 0xdf, - 0x87, 0xa7, 0x6f, 0x43, 0xc7, 0x3c, 0x77, 0x88, 0xe3, 0xe6, 0x74, 0x47, - 0x89, 0x23, 0xa0, 0xbf, 0xb7, 0xe1, 0x4b, 0x72, 0x55, 0x20, 0xd8, 0x99, - 0x9f, 0xf6, 0xcd, 0x48, 0xff, 0xd9, 0xba, 0xda, 0x31, 0x2b, 0x46, 0x21, - 0x84, 0x7e, 0x3f, 0x1b, 0x8e, 0x99, 0xa4, 0x22, 0xaa, 0x8e, 0xef, 0x9b, - 0x2a, 0xc8, 0x75, 0x50, 0x11, 0x74, 0xed, 0xcc, 0x76, 0x0d, 0x44, 0xd2, - 0x32, 0x26, 0xd9, 0xbd, 0xf8, 0xec, 0x9b, 0xae, 0x88, 0x20, 0x6d, 0xe0, - 0xc3, 0x0f, 0xb2, 0x88, 0xe5, 0x31, 0x4a, 0x54, 0x86, 0xe5, 0x00, 0x1c, - 0xbf, 0x04, 0xe1, 0x37, 0x44, 0x07, 0xeb, 0xc2, 0x9e, 0x2f, 0xb3, 0x2a, - 0xee, 0x6f, 0xe5, 0x46, 0x46, 0x08, 0xbd, 0xef, 0xe1, 0x4b, 0xf8, 0x9d, - 0x52, 0xaa, 0x72, 0x58, 0xb3, 0xf4, 0x75, 0xa9, 0x0c, 0x5d, 0x4c, 0xe2, - 0xe5, 0xbe, 0x09, 0x42, 0x45, 0xbb, 0x14, 0x24, 0x2a, 0xc6, 0xca, 0xb4, - 0x92, 0xb5, 0x23, 0x82, 0x3c, 0x2d, 0x47, 0x43, 0xcb, 0x1c, 0xff, 0x4e, - 0x52, 0xad, 0xf3, 0xff, 0xf1, 0xd4, 0x07, 0xad, 0x70, 0x50, 0x0d, 0x6d, - 0xde, 0xd2, 0x98, 0xd4, 0xa3, 0xac, 0x9c, 0x72, 0x5a, 0x72, 0xd7, 0x32, - 0x39, 0x0e, 0xba, 0xbf, 0xf9, 0x53, 0xdf, 0x30, 0xc8, 0x49, 0xfd, 0x01, - 0x96, 0x45, 0xff, 0x8f, 0xe0, 0x9e, 0x98, 0x86, 0x5f, 0x46, 0xf9, 0xf8, - 0x45, 0x7b, 0xcf, 0xdb, 0x75, 0xe8, 0x24, 0x81, 0xd6, 0xdf, 0xe6, 0x4f, - 0x61, 0xcf, 0x08, 0xe2, 0xbc, 0xf6, 0xa5, 0xe1, 0x16, 0xb2, 0x27, 0x99, - 0x69, 0x93, 0xb0, 0x4f, 0xe6, 0x86, 0x47, 0x92, 0x16, 0x47, 0xa3, 0x63, - 0x86, 0x80, 0x73, 0x35, 0xfd, 0x5e, 0xfb, 0x28, 0xc1, 0x08, 0xb4, 0x8a, - 0x69, 0x01, 0xc8, 0xd0, 0x3c, 0x3d, 0xb1, 0x2b, 0x21, 0x4d, 0x37, 0x62, - 0x89, 0xda, 0x1e, 0x9a, 0x11, 0x2b, 0x42, 0xd4, 0x2d, 0xb9, 0xb5, 0xdc, - 0x88, 0xa8, 0x75, 0x0c, 0x85, 0xd0, 0xeb, 0xb3, 0xe6, 0x37, 0x96, 0xfb, - 0x8d, 0xfe, 0xf6, 0xc1, 0x85, 0x7b, 0x14, 0xd8, 0x2f, 0xd2, 0x28, 0x09, - 0x01, 0xf1, 0xb5, 0x15, 0xfd, 0x9d, 0xb1, 0xbc, 0x7c, 0x3a, 0xaa, 0xba, - 0x07, 0x48, 0xa4, 0xf2, 0xd6, 0x95, 0x98, 0x44, 0x69, 0xa8, 0xd6, 0xec, - 0x6b, 0x1e, 0x5c, 0xc1, 0x84, 0x4b, 0xf8, 0x21, 0x72, 0x77, 0x1f, 0xad, - 0xd9, 0x30, 0xbb, 0x7b, 0x1d, 0xde, 0xe3, 0x8c, 0x13, 0x7e, 0x75, 0xce, - 0xa2, 0x6d, 0xcc, 0x4c, 0xb1, 0x53, 0xe4, 0x99, 0x76, 0x7b, 0x11, 0x53, - 0x88, 0x7c, 0x39, 0x1f, 0x43, 0x96, 0x64, 0xe8, 0x66, 0xef, 0x37, 0x53, - 0x5c, 0xe8, 0x1a, 0x99, 0xaf, 0x2e, 0xe2, 0x55, 0xcc, 0x90, 0x7e, 0x35, - 0x8e, 0x09, 0x5b, 0xf0, 0x22, 0x3f, 0x8e, 0x92, 0xbd, 0x6e, 0xef, 0x40, - 0xa8, 0xf7, 0x6f, 0x3f, 0x28, 0xfc, 0x8b, 0xb3, 0x99, 0xa7, 0xd7, 0xc1, - 0x9b, 0x69, 0xfa, 0xb4, 0x12, 0xc6, 0xf1, 0x39, 0x4b, 0x9b, 0x69, 0x35, - 0xb2, 0x01, 0xb7, 0x28, 0x3b, 0x15, 0xaa, 0xa3, 0x52, 0x37, 0xfd, 0x03, - 0x23, 0xa0, 0x78, 0x3e, 0x7e, 0xfb, 0xf0, 0x61, 0xb1, 0x7e, 0x95, 0x3a, - 0x90, 0x81, 0x8f, 0xe1, 0xaa, 0xc5, 0xbe, 0xfd, 0x75, 0xcf, 0x76, 0xda, - 0x79, 0x6a, 0x34, 0x9c, 0x85, 0x0b, 0x5e, 0xa8, 0x5e, 0x0d, 0xef, 0x5e, - 0x88, 0x1e, 0x85, 0x26, 0xff, 0x37, 0x0e, 0x22, 0xf5, 0x7c, 0x9a, 0x4a, - 0xb7, 0xef, 0xd9, 0x72, 0x30, 0xbf, 0x16, 0x53, 0x6b, 0x29, 0xcd, 0xb3, - 0xf4, 0xc9, 0x2d, 0x78, 0x5d, 0x82, 0x0e, 0x89, 0xee, 0x4f, 0xe5, 0xe5, - 0xdc, 0xb4, 0x82, 0x8f, 0xe5, 0xe7, 0xbc, 0xca, 0xaf, 0xbd, 0x19, 0x8e, - 0xbe, 0x77, 0xb8, 0x84, 0xea, 0x4f, 0x30, 0x7b, 0xda, 0x00, 0xc8, 0xec, - 0x65, 0x47, 0xd2, 0x0f, 0xdd, 0xad, 0x51, 0xb1, 0x4d, 0x18, 0x9b, 0x5f, - 0xf8, 0x85, 0xaf, 0xcd, 0x89, 0x24, 0x6d, 0xd3, 0xfe, 0xdf, 0x51, 0x85, - 0xbd, 0xb1, 0x8b, 0x47, 0x51, 0x83, 0xb5, 0x1f, 0x68, 0x4a, 0xb1, 0xef, - 0x0e, 0x9b, 0x5e, 0x8d, 0x37, 0xa2, 0xe5, 0xa8, 0xef, 0xc7, 0x3b, 0xa8, - 0x37, 0x1c, 0xa7, 0xee, 0x97, 0x70, 0x36, 0x67, 0xb0, 0x40, 0x4b, 0x0e, - 0xdd, 0x94, 0x01, 0x3f, 0xa2, 0xb8, 0x93, 0x64, 0xe6, 0xae, 0xa8, 0x79, - 0x6e, 0x93, 0x19, 0x66, 0xa3, 0x31, 0x7e, 0xe2, 0x9e, 0x38, 0xc5, 0x09, - 0x0e, 0x7d, 0x37, 0xb5, 0xa7, 0x97, 0xc0, 0x89, 0x3c, 0xa6, 0x93, 0x0e, - 0xb3, 0xae, 0x8a, 0x5b, 0xee, 0xec, 0xcf, 0x2c, 0xb2, 0x65, 0x0e, 0xbb, - 0xf9, 0xb8, 0x6f, 0x15, 0x2b, 0x93, 0xef, 0x2e, 0x40, 0x1a, 0x7b, 0xf2, - 0x72, 0x63, 0x69, 0x04, 0x4a, 0x65, 0x6c, 0x3a, 0x39, 0xec, 0xd9, 0x3e, - 0x47, 0x0d, 0xf4, 0x98, 0x31, 0x3f, 0x5f, 0x94, 0xb3, 0xa4, 0x2b, 0x83, - 0xb4, 0x45, 0x3a, 0x00, 0x90, 0x83, 0xe9, 0x37, 0xa3, 0xca, 0xb6, 0xd0, - 0xbe, 0xf2, 0xe8, 0x9a, 0xcb, 0x78, 0xfc, 0x0f, 0xd4, 0xcb, 0x21, 0x5a, - 0xf1, 0x0e, 0x9e, 0x10, 0x71, 0x26, 0x25, 0xda, 0x37, 0xfb, 0x70, 0x8e, - 0xc3, 0xe8, 0xbf, 0x70, 0x71, 0x03, 0x85, 0xf0, 0x1b, 0x40, 0xc7, 0x68, - 0xef, 0xf0, 0x66, 0x99, 0xdd, 0xfc, 0x3f, 0x01, 0x9a, 0x78, 0x23, 0x2b, - 0xc4, 0x6f, 0x9b, 0x35, 0xfb, 0x17, 0x94, 0xc9, 0x56, 0x36, 0xe4, 0xd3, - 0xd8, 0x75, 0xc4, 0xa2, 0x2c, 0x34, 0x35, 0xac, 0xd2, 0x0b, 0x4e, 0x34, - 0xf8, 0xa1, 0xb7, 0xce, 0xef, 0xf4, 0x50, 0xda, 0x4a, 0x67, 0xfb, 0x36, - 0x52, 0x4c, 0x2d, 0x8d, 0x14, 0xa6, 0xcb, 0x25, 0x1b, 0xdd, 0x4d, 0xcb, - 0xfb, 0xa1, 0xe5, 0x32, 0xd4, 0x59, 0x9e, 0xe1, 0x53, 0x85, 0x8f, 0x79, - 0xa4, 0xcb, 0xa3, 0x5e, 0x8b, 0x17, 0xa2, 0x26, 0x4c, 0xd8, 0xd9, 0xc1, - 0x1e, 0xee, 0xb5, 0x59, 0xe6, 0x9c, 0x4c, 0xa4, 0x16, 0x1e, 0x96, 0x5f, - 0x14, 0x77, 0xb2, 0xeb, 0x87, 0xf0, 0xf5, 0x30, 0x28, 0x64, 0x7d, 0x2c, - 0x69, 0x22, 0x7b, 0x06, 0x5b, 0x20, 0xac, 0xf3, 0x6a, 0x41, 0xa2, 0x44, - 0x01, 0x17, 0xd4, 0xfc, 0xaa, 0xf4, 0x9b, 0xdc, 0xc4, 0xc8, 0x2a, 0xd7, - 0x0a, 0x0b, 0x19, 0x2b, 0x41, 0x3b, 0x29, 0x77, 0x89, 0x9f, 0x8b, 0x69, - 0xbe, 0xfc, 0xfa, 0x77, 0x69, 0x33, 0x30, 0xa8, 0xc8, 0x23, 0x5c, 0x79, - 0xc7, 0xc0, 0xf8, 0x43, 0xfc, 0x19, 0x80, 0x4d, 0xe5, 0x11, 0x28, 0x98, - 0x26, 0xda, 0xa1, 0xbd, 0x69, 0x9e, 0x44, 0xb5, 0xa7, 0xd5, 0xb3, 0xb3, - 0xc6, 0x51, 0x73, 0x55, 0xfe, 0x5e, 0x34, 0xa3, 0x26, 0xb9, 0x22, 0x54, - 0x03, 0x93, 0x77, 0xf4, 0x7b, 0x5a, 0x12, 0x1a, 0x02, 0x69, 0x49, 0x00, - 0x7e, 0xb0, 0x72, 0xb8, 0x42, 0xfb, 0x23, 0xcb, 0x6c, 0x1a, 0x54, 0x84, - 0x35, 0x2e, 0x74, 0x7f, 0xd5, 0xef, 0xea, 0xe4, 0x5b, 0x20, 0xac, 0xf3, - 0x6a, 0x99, 0xa2, 0x44, 0x01, 0x17, 0xd4, 0xfc, 0xaa, 0xf4, 0x9b, 0xdc, - 0x1c, 0x2b, 0x77, 0x0c, 0xd6, 0x79, 0x2d, 0x14, 0x76, 0xbe, 0xc3, 0x5a, - 0x12, 0xc9, 0x8c, 0xd7, 0xa7, 0x83, 0x7f, 0x12, 0x05, 0x97, 0xf3, 0xc9, - 0x3f, 0x9f, 0xac, 0xe0, 0x56, 0x45, 0x92, 0xff, 0xe5, 0x61, 0xfd, 0x57, - 0xb0, 0xe3, 0x61, 0x78, 0xe9, 0x77, 0xb9, 0x89, 0x21, 0x0f, 0xc0, 0x38, - 0xce, 0xae, 0x27, 0x91, 0x50, 0xa7, 0x7c, 0x93, 0xda, 0xcf, 0x8c, 0xea, - 0x66, 0x0b, 0x9e, 0x9c, 0x41, 0x39, 0x50, 0x2b, 0xb5, 0xc5, 0xe5, 0x88, - 0xad, 0x2a, 0x00, 0x47, 0x3f, 0x65, 0xcd, 0x04, 0x54, 0x84, 0x46, 0xed, - 0x55, 0x4f, 0xce, 0xf8, 0xcd, 0xaf, 0x1b, 0xa7, 0xc8, 0xa1, 0x18, 0x04, - 0xf6, 0x95, 0x4a, 0x75, 0x6d, 0x8f, 0xe5, 0xc9, 0x86, 0x6e, 0x46, 0xd8, - 0x8c, 0x29, 0xd5, 0x2e, 0x82, 0x90, 0x11, 0x43, 0x57, 0x28, 0x5a, 0xfb, - 0xe5, 0xf1, 0x71, 0x19, 0xa1, 0x92, 0x0b, 0xe0, 0xe2, 0xb8, 0x40, 0x30, - 0xb7, 0xb9, 0x91, 0x0f, 0x60, 0x5a, 0xc4, 0xc1, 0xfe, 0x72, 0x25, 0x30, - 0x64, 0x44, 0x23, 0xe8, 0x5f, 0x4d, 0xe0, 0xb1, 0x71, 0x83, 0x63, 0x96, - 0x96, 0x91, 0xb9, 0x48, 0x8c, 0xde, 0xe6, 0xe9, 0x62, 0x6a, 0xcf, 0x8d, - 0x13, 0x18, 0x37, 0xa0, 0xfd, 0x41, 0x41, 0xce, 0x41, 0x7f, 0x34, 0x1b, - 0xb1, 0xad, 0x62, 0xf1, 0x86, 0x33, 0x80, 0x42, 0x19, 0x26, 0x62, 0x9e, - 0xbc, 0x9a, 0x29, 0xe8, 0x07, 0x06, 0xe9, 0xcf, 0xbe, 0x3c, 0xb3, 0x41, - 0x11, 0x23, 0xd5, 0xa9, 0x95, 0x84, 0x2d, 0x83, 0xd5, 0x2b, 0xd1, 0x22, - 0xc1, 0x10, 0x91, 0x99, 0x7d, 0x64, 0x41, 0xed, 0x87, 0xc5, 0x3f, 0x08, - 0x50, 0x6d, 0x0d, 0x7b, 0x71, 0xf7, 0x31, 0x25, 0x56, 0x19, 0x57, 0x23, - 0xbd, 0xbf, 0x41, 0x6b, 0x34, 0x64, 0x93, 0x52, 0xd3, 0x90, 0x7b, 0x59, - 0xfa, 0xaa, 0xd5, 0xb2, 0x8e, 0x1f, 0x8f, 0x53, 0x44, 0x34, 0xa3, 0x52, - 0x90, 0x7b, 0x91, 0x60, 0x76, 0x48, 0x05, 0x54, 0x48, 0x7e, 0xcb, 0x7a, - 0x58, 0xe0, 0x4f, 0xa5, 0xf0, 0x70, 0x8f, 0x6e, 0x21, 0xe2, 0x9f, 0xa1, - 0x0f, 0x22, 0x0b, 0xd1, 0x75, 0xdf, 0xca, 0x7d, 0x62, 0x22, 0x9a, 0x40, - 0x51, 0xc2, 0x9e, 0xfa, 0xa6, 0x69, 0x6b, 0xed, 0x7b, 0x6c, 0x4c, 0x14, - 0x64, 0x6d, 0x4d, 0x7e, 0xc0, 0x59, 0x89, 0xa4, 0x52, 0x8b, 0x9f, 0x5e, - 0x8e, 0xaa, 0xbc, 0x2e, 0x17, 0x6d, 0xe7, 0x8f, 0xc4, 0x23, 0x96, 0x8a, - 0x5e, 0x89, 0x6e, 0xed, 0xc5, 0xdb, 0xe3, 0x47, 0x3b, 0xc2, 0x24, 0xaf, - 0x3d, 0xf4, 0x87, 0x42, 0xff, 0xb4, 0xe6, 0x12, 0x95, 0xd7, 0x22, 0x76, - 0x22, 0xc1, 0x5d, 0x19, 0x63, 0x87, 0x38, 0x99, 0x1c, 0xed, 0x63, 0xce, - 0x62, 0x93, 0xa1, 0xde, 0xaa, 0x6f, 0xb3, 0x6e, 0xb8, 0x09, 0xed, 0xd6, - 0xb5, 0xbe, 0x7f, 0x31, 0x40, 0x6b, 0x4b, 0x8d, 0x87, 0x5d, 0xb7, 0xb1, - 0x9f, 0xfc, 0xfc, 0xb1, 0x04, 0x1e, 0xae, 0xd7, 0xac, 0x84, 0xe4, 0xf1, - 0x92, 0x87, 0x9f, 0xf0, 0x4b, 0x2e, 0x70, 0xa4, 0x34, 0x8f, 0xa3, 0x65, - 0x3e, 0x38, 0x12, 0xf7, 0x45, 0x56, 0xf0, 0xd4, 0x52, 0x23, 0xcc, 0x87, - 0x1f, 0x92, 0x95, 0xfe, 0x3e, 0x6d, 0x36, 0xfe, 0xd7, 0x83, 0x0b, 0x3b, - 0x3a, 0x85, 0x1d, 0x8e, 0xda, 0x96, 0xcb, 0x09, 0x10, 0x45, 0x1d, 0xd7, - 0xbe, 0xec, 0xfb, 0xb9, 0x05, 0x65, 0x37, 0xd5, 0xd5, 0x5e, 0xa6, 0xa2, - 0x7d, 0xd8, 0x99, 0x36, 0xf2, 0x19, 0x38, 0x5b, 0xca, 0x52, 0xcb, 0x98, - 0xa2, 0x48, 0xd6, 0x52, 0x06, 0x22, 0x59, 0x96, 0x0a, 0xac, 0x05, 0x99, - 0x59, 0x9e, 0x1b, 0x88, 0x22, 0x2c, 0x26, 0x5f, 0x6f, 0xcd, 0x31, 0x08, - 0xd3, 0x21, 0x7c, 0x6a, 0x86, 0xca, 0xa3, 0xb6, 0xf5, 0x94, 0xfa, 0x1d, - 0x8b, 0x9b, 0x6f, 0x82, 0x15, 0x78, 0x89, 0x2b, 0xd1, 0xe5, 0x6d, 0x8c, - 0x01, 0x81, 0x5b, 0x8e, 0xe8, 0xe9, 0xe8, 0x37, 0xf8, 0xbe, 0x01, 0x98, - 0x8f, 0x8b, 0xfa, 0x1b, 0x9a, 0xc1, 0x88, 0xd4, 0x7a, 0x95, 0x04, 0x57, - 0x2c, 0x9a, 0x4b, 0x8d, 0x73, 0x9e, 0x40, 0x0b, 0x68, 0x43, 0xca, 0xec, - 0x76, 0x89, 0x44, 0xbe, 0xdb, 0xda, 0xd3, 0x0a, 0xd3, 0x31, 0xd2, 0x04, - 0x9b, 0xb6, 0x0f, 0xa7, 0xab, 0x88, 0x8b, 0x84, 0x05, 0x64, 0xd6, 0x33, - 0x8c, 0x56, 0x0b, 0xe4, 0xe5, 0x02, 0x47, 0x6b, 0x4e, 0xfc, 0x5f, 0x09, - 0x8f, 0xe8, 0x9b, 0xc6, 0x94, 0x79, 0x16, 0xd2, 0x9a, 0x13, 0x1f, 0x6c, - 0xb8, 0x01, 0x8d, 0xce, 0x0d, 0x5c, 0x42, 0xf9, 0xe6, 0xd5, 0x69, 0x17, - 0x5c, 0x56, 0x3c, 0x7b, 0x9d, 0x77, 0xca, 0x44, 0x59, 0xc4, 0xad, 0x80, - 0x35, 0x3e, 0xcd, 0x6e, 0x47, 0x95, 0x2b, 0x68, 0x64, 0x75, 0x53, 0x75, - 0xef, 0xe1, 0xc8, 0x4c, 0xee, 0x40, 0x63, 0xb8, 0xf2, 0xd7, 0x7c, 0x94, - 0xd6, 0x8f, 0xee, 0xcb, 0x8c, 0x4d, 0x3d, 0x32, 0xd7, 0xf2, 0x5f, 0xb1, - 0x33, 0xc4, 0x29, 0xe0, 0xb7, 0x09, 0x82, 0xf1, 0xfd, 0x03, 0x03, 0x71, - 0xa6, 0xab, 0x11, 0x6c, 0x60, 0x04, 0xa1, 0x25, 0x64, 0x7d, 0x8a, 0x37, - 0x0b, 0xcb, 0x52, 0x9b, 0x58, 0x22, 0x11, 0x2a, 0x3c, 0x07, 0xb7, 0x7e, - 0xe5, 0x67, 0x80, 0x9f, 0xf1, 0x30, 0x73, 0xbf, 0xbf, 0x87, 0x94, 0x0a, - 0xdf, 0x3d, 0x37, 0xe9, 0xeb, 0x72, 0xf1, 0x66, 0x1b, 0x9d, 0x94, 0x82, - 0xf4, 0x8d, 0xb1, 0x60, 0x0f, 0x29, 0xae, 0xa5, 0xf9, 0xf6, 0x05, 0x2f, - 0xea, 0x7e, 0xcb, 0xda, 0xdd, 0xb0, 0x64, 0x01, 0x2f, 0x66, 0xde, 0x83, - 0x58, 0x57, 0x8a, 0xbc, 0x71, 0xb8, 0xc5, 0xf2, 0xa4, 0x3e, 0x4a, 0xad, - 0x5d, 0xa5, 0xc6, 0xe1, 0x5f, 0x13, 0x79, 0xcd, 0x66, 0xc1, 0x60, 0xb1, - 0x1e, 0x98, 0xbd, 0xe6, 0x56, 0xdf, 0xca, 0xca, 0x6f, 0x11, 0x83, 0xbf, - 0x91, 0x45, 0xc7, 0x6a, 0xaa, 0x77, 0xdb, 0x29, 0xaa, 0x84, 0xe5, 0x31, - 0x74, 0x66, 0x7e, 0x0a, 0xd2, 0x7e, 0xa7, 0xfe, 0xc3, 0x83, 0x43, 0x96, - 0x81, 0x6a, 0x13, 0xb3, 0x75, 0x8a, 0xa3, 0xc7, 0x05, 0x27, 0xa6, 0xb9, - 0xa6, 0x8e, 0x65, 0xe4, 0x12, 0x40, 0xba, 0xfe, 0x63, 0xd8, 0x9d, 0xfb, - 0x04, 0x30, 0x64, 0x05, 0x23, 0x6f, 0xf0, 0x89, 0x13, 0xc0, 0x61, 0x3a, - 0xf1, 0x44, 0xca, 0xeb, 0x8c, 0xc2, 0xf9, 0x31, 0x76, 0xc6, 0xde, 0xf9, - 0xd0, 0x56, 0x41, 0xcf, 0xaa, 0xcd, 0x60, 0x25, 0x8f, 0x78, 0x00, 0x80, - 0x0e, 0x2b, 0x44, 0x15, 0x69, 0xd6, 0x38, 0xc6, 0xa7, 0x30, 0xe1, 0x7e, - 0x84, 0x73, 0x7d, 0x8b, 0x2b, 0xdb, 0x0f, 0x7a, 0xbc, 0x7f, 0x08, 0xb9, - 0xe3, 0x35, 0xcb, 0x1f, 0xbc, 0xc8, 0xd0, 0x18, 0xfd, 0x61, 0x5a, 0x0d, - 0x65, 0x04, 0x45, 0xce, 0xd1, 0x8e, 0xe2, 0x8e, 0x94, 0x23, 0x5f, 0x4e, - 0xf0, 0x7e, 0xec, 0xcc, 0x1b, 0x8f, 0x86, 0xcc, 0x0c, 0xb2, 0x49, 0x15, - 0x3a, 0x3f, 0x62, 0xa9, 0xb0, 0xdc, 0x43, 0x1d, 0x50, 0xdd, 0x85, 0x3c, - 0xe9, 0xd3, 0x40, 0xad, 0x97, 0x6e, 0x0b, 0x04, 0x17, 0x2f, 0x09, 0x74, - 0x60, 0xe9, 0x0b, 0xf3, 0x1e, 0xf7, 0x72, 0x9a, 0xdf, 0x68, 0x57, 0x70, - 0xc4, 0x75, 0x12, 0xdd, 0xc3, 0x2c, 0x4c, 0x88, 0x46, 0x1b, 0xd3, 0xae, - 0x4d, 0xa3, 0xdf, 0x11, 0xc0, 0x14, 0xca, 0xc8, 0x66, 0xf5, 0x3f, 0xa5, - 0x73, 0xff, 0x9a, 0x50, 0xee, 0x56, 0x55, 0x30, 0x32, 0xf1, 0x43, 0xa7, - 0xc5, 0xa3, 0xe3, 0x5f, 0x60, 0x8b, 0x15, 0xe8, 0x08, 0x89, 0xd2, 0x75, - 0x69, 0xa3, 0x98, 0xd5, 0x12, 0x26, 0x80, 0x27, 0x03, 0x53, 0x8e, 0x91, - 0x1b, 0xab, 0xfb, 0x73, 0x8a, 0xd8, 0xcb, 0x34, 0x96, 0x3a, 0xe7, 0xec, - 0xf5, 0x60, 0x27, 0x6d, 0xda, 0xb4, 0xa0, 0xa6, 0x72, 0xf8, 0xda, 0x79, - 0x95, 0x9d, 0x44, 0xee, 0xc4, 0x02, 0xa0, 0xe5, 0xc9, 0xb2, 0x7d, 0x90, - 0x03, 0x14, 0xc3, 0xaa, 0x1e, 0x89, 0x9b, 0x87, 0x8c, 0xac, 0x93, 0xa9, - 0xad, 0x12, 0x2a, 0x83, 0x6e, 0x62, 0x8e, 0x92, 0x3f, 0xd8, 0x89, 0xa4, - 0xc5, 0x0b, 0x97, 0x22, 0xcf, 0xb4, 0xee, 0x1e, 0xc0, 0x5e, 0x42, 0x1e, - 0x4b, 0x39, 0xef, 0x27, 0xc1, 0x7b, 0x41, 0xad, 0xd4, 0xa1, 0x67, 0xf5, - 0xa1, 0x10, 0x89, 0xd1, 0x07, 0x53, 0x18, 0x4c, 0x39, 0xd8, 0x4e, 0xb2, - 0x76, 0x18, 0xe3, 0xbf, 0xf9, 0xc1, 0x6e, 0x0c, 0x2c, 0x1b, 0xbb, 0x9f, - 0xb4, 0x62, 0x03, 0x2f, 0xa3, 0xc3, 0x44, 0x2c, 0xf5, 0x7b, 0xfb, 0xbc, - 0xa0, 0x1b, 0xe5, 0xe2, 0x92, 0x46, 0xfc, 0x94, 0x8f, 0x58, 0x86, 0xa4, - 0xa9, 0xe2, 0x1d, 0x2d, 0x81, 0xc5, 0x61, 0x0a, 0x81, 0x4c, 0xf9, 0x18, - 0xe9, 0xa0, 0x2d, 0x93, 0xd4, 0xb0, 0xb5, 0x46, 0x43, 0x55, 0x99, 0x84, - 0xef, 0x08, 0x5e, 0xcc, 0x69, 0x0b, 0x2f, 0x40, 0x75, 0x27, 0xf6, 0x3e, - 0xf1, 0x9a, 0xe4, 0x4d, 0x91, 0xf3, 0x2d, 0xd1, 0x6c, 0x6a, 0x2e, 0xdc, - 0x3d, 0xf2, 0x91, 0xae, 0xb8, 0xef, 0xfd, 0xde, 0xf9, 0x1d, 0xb3, 0x76, - 0x91, 0xfe, 0x1e, 0xe5, 0xe3, 0xa3, 0x3d, 0xc7, 0x8e, 0x80, 0xe9, 0x0b, - 0x61, 0x4b, 0x63, 0xba, 0xc9, 0xfa, 0xe5, 0xc0, 0xb6, 0x05, 0x6c, 0x6f, - 0x52, 0xb5, 0xc6, 0xaf, 0x47, 0xb5, 0x94, 0x93, 0x24, 0xb5, 0x31, 0x5e, - 0xaa, 0x8c, 0x95, 0xca, 0xeb, 0x76, 0xb5, 0xc5, 0xce, 0x1b, 0xd8, 0x99, - 0xea, 0x30, 0xd6, 0x29, 0x50, 0x0e, 0x5e, 0xd2, 0x4a, 0x78, 0xde, 0x21, - 0x61, 0xb3, 0x0d, 0x9e, 0xa4, 0x8a, 0x65, 0xeb, 0x11, 0x09, 0x2a, 0xc7, - 0xd9, 0x5c, 0x5a, 0xd0, 0x3d, 0xd8, 0xbc, 0x54, 0xec, 0x4f, 0xf2, 0x24, - 0xbd, 0xdd, 0xff, 0xfb, 0xf9, 0x65, 0x62, 0xed, 0xaa, 0x20, 0x39, 0xa1, - 0xa9, 0xf0, 0xe9, 0xa5, 0x06, 0xca, 0x6a, 0x8d, 0x6b, 0x0a, 0x5c, 0x29, - 0xcb, 0x8c, 0x15, 0x74, 0x84, 0xce, 0xc4, 0x59, 0xdc, 0xe3, 0xd6, 0x73, - 0xe7, 0x47, 0xad, 0x05, 0x55, 0xbe, 0xc5, 0xf1, 0xe1, 0xb0, 0xf5, 0x81, - 0x95, 0x08, 0xf3, 0xf0, 0x1f, 0xa3, 0x3f, 0xba, 0x31, 0xed, 0xfe, 0x6b, - 0x48, 0xa6, 0x19, 0x9d, 0xf9, 0xf6, 0x2c, 0x6b, 0xb7, 0xea, 0x01, 0x65, - 0x26, 0x1e, 0xb5, 0xf7, 0x81, 0xd4, 0x66, 0xfa, 0xbd, 0x15, 0x6f, 0xcf, - 0xcf, 0x0b, 0x35, 0xa2, 0x0d, 0x82, 0xab, 0xc4, 0x54, 0x01, 0x13, 0xcf, - 0x17, 0xda, 0xcc, 0xa3, 0xf2, 0xba, 0x5e, 0x8a, 0xbd, 0x11, 0x93, 0x79, - 0x6f, 0xf2, 0x3f, 0x18, 0xcf, 0xfd, 0x61, 0x23, 0xf8, 0x1e, 0xf5, 0xb9, - 0x8c, 0x27, 0x91, 0x61, 0x18, 0x6b, 0xb6, 0x86, 0x73, 0x72, 0x38, 0x38, - 0x76, 0x08, 0x34, 0xb0, 0x12, 0x3b, 0x32, 0xb2, 0x16, 0x48, 0xa5, 0x8e, - 0x9b, 0x7d, 0xc8, 0xf6, 0x8e, 0x54, 0x0a, 0x3d, 0xcf, 0x68, 0xc2, 0x8a, - 0x90, 0x5e, 0x07, 0xd0, 0xd7, 0xbd, 0xda, 0x87, 0x68, 0x15, 0x2a, 0x38, - 0xcf, 0x91, 0x81, 0xdf, 0x2e, 0xfd, 0x4a, 0x30, 0x6a, 0x60, 0x23, 0x7b, - 0x43, 0xf2, 0x58, 0xa0, 0xec, 0x5b, 0xa9, 0x63, 0x2e, 0xa2, 0x5c, 0x8b, - 0xf8, 0xb9, 0xa7, 0x6c, 0xa8, 0x29, 0x38, 0xb3, 0x36, 0xdd, 0x9a, 0xc8, - 0x95, 0x6a, 0x59, 0x6d, 0xf5, 0xc1, 0x01, 0xe7, 0xf7, 0xf9, 0x21, 0x4f, - 0x0a, 0x05, 0xe7, 0x24, 0x45, 0x6e, 0x97, 0xc6, 0x5a, 0x75, 0x41, 0xe3, - 0xdb, 0xe2, 0xd7, 0x60, 0x9f, 0xdc, 0x9a, 0x68, 0xbd, 0x3c, 0x6e, 0x05, - 0x4b, 0x90, 0x98, 0x17, 0x06, 0x9f, 0x77, 0x0e, 0xd6, 0xf0, 0xeb, 0x1c, - 0x47, 0x1d, 0x68, 0xb7, 0x73, 0xcb, 0x36, 0x1b, 0x89, 0xf8, 0x72, 0x53, - 0xcb, 0x0e, 0x26, 0xaa, 0xea, 0x3e, 0x98, 0x63, 0x9b, 0x44, 0x90, 0x4d, - 0x57, 0xd5, 0x8d, 0xc3, 0x1d, 0xfe, 0x51, 0xad, 0x77, 0xd9, 0xef, 0x58, - 0x87, 0xe1, 0xfe, 0xc3, 0xfe, 0x5c, 0xf6, 0x6c, 0x06, 0x43, 0x71, 0x2e, - 0xa9, 0x86, 0xc6, 0xaa, 0x17, 0x96, 0xb0, 0x06, 0x9e, 0xa1, 0xe4, 0x43, - 0x5c, 0x94, 0xa0, 0xf3, 0x58, 0x2b, 0x8c, 0x14, 0x20, 0xd0, 0x7b, 0x02, - 0xb2, 0x29, 0xeb, 0xa8, 0x72, 0xa2, 0x28, 0xdd, 0x62, 0xb7, 0x0f, 0x47, - 0x83, 0x89, 0x84, 0x02, 0x88, 0x11, 0x73, 0x51, 0x3b, 0xec, 0x94, 0xe2, - 0xc2, 0x56, 0x00, 0xa8, 0xe5, 0x7d, 0x77, 0x75, 0x5e, 0xd0, 0xf2, 0xc4, - 0x8f, 0x50, 0xa1, 0xc0, 0x1c, 0x56, 0x87, 0x40, 0xa8, 0xd4, 0xa6, 0x4f, - 0x1a, 0x54, 0x48, 0x00, 0xa6, 0x65, 0x46, 0x17, 0x73, 0x88, 0xc1, 0xb0, - 0xb9, 0x3c, 0x9d, 0x95, 0x5b, 0x38, 0x2f, 0x5f, 0xbb, 0x56, 0x74, 0x3c, - 0x08, 0x21, 0x74, 0x3b, 0x16, 0xb8, 0xe1, 0xdd, 0x7d, 0x05, 0xd5, 0x89, - 0xf9, 0xc0, 0x4c, 0xe5, 0xcd, 0xa0, 0x95, 0xb1, 0x18, 0xfa, 0x33, 0x92, - 0x55, 0x45, 0x2e, 0x5b, 0x67, 0x5d, 0x14, 0x66, 0x0f, 0x40, 0x72, 0xad, - 0xe3, 0xae, 0xda, 0x97, 0x7a, 0xb9, 0xe5, 0xb2, 0x86, 0x53, 0xdd, 0xa2, - 0xdd, 0xab, 0x04, 0x75, 0xb2, 0xe6, 0xcb, 0x8a, 0x9d, 0x94, 0x28, 0x9a, - 0xc8, 0x18, 0x62, 0xa8, 0x4b, 0x2a, 0x7e, 0x0e, 0xb9, 0xf8, 0xc4, 0x45, - 0x00, 0x25, 0xe7, 0xce, 0x8f, 0x61, 0x36, 0x53, 0x96, 0xa5, 0x2c, 0x71, - 0x5d, 0xf2, 0x62, 0x5a, 0xae, 0xfd, 0xab, 0xcb, 0xfe, 0x2e, 0x80, 0xa9, - 0xca, 0xc5, 0xfa, 0x2c, 0x0f, 0x87, 0x43, 0xd1, 0x55, 0xbd, 0x71, 0x6c, - 0x54, 0x72, 0xf9, 0x20, 0x95, 0x70, 0xbf, 0x10, 0x7d, 0x01, 0xfe, 0x30, - 0xf0, 0xab, 0xf2, 0x14, 0x02, 0xa8, 0x21, 0x1a, 0x5f, 0x23, 0xc4, 0x21, - 0x71, 0x52, 0xd4, 0xd1, 0x3d, 0xb1, 0x9d, 0x16, 0x68, 0xdc, 0x17, 0x3e, - 0xbb, 0x5a, 0x57, 0xf8, 0x5b, 0x7a, 0xf2, 0xd6, 0x3b, 0xe9, 0x6b, 0x3f, - 0x5b, 0xc1, 0x2d, 0x3a, 0xee, 0x10, 0x22, 0x0f, 0x72, 0x60, 0xee, 0x8a, - 0xbd, 0x17, 0x5b, 0x35, 0xda, 0x94, 0x53, 0x19, 0x67, 0x7e, 0x10, 0x6f, - 0x5a, 0x40, 0xbb, 0x8f, 0xa5, 0x66, 0x86, 0xdd, 0x0a, 0x0f, 0x1b, 0x81, - 0xfc, 0x25, 0x3f, 0x0a, 0xa5, 0xae, 0xf9, 0xe1, 0xb0, 0x7f, 0x1b, 0xe2, - 0x9e, 0xd2, 0x80, 0xd6, 0x26, 0x4e, 0x86, 0xe9, 0xce, 0xa0, 0xc8, 0x75, - 0xc4, 0x18, 0x9f, 0x7e, 0xb6, 0xae, 0x66, 0x4b, 0x85, 0xd8, 0x90, 0x1b, - 0xc0, 0x50, 0xb9, 0x22, 0x76, 0xeb, 0x7f, 0xdc, 0x30, 0x45, 0xdb, 0x2d, - 0x9f, 0x9b, 0x71, 0xb2, 0x9d, 0x20, 0x89, 0xf4, 0x78, 0x7e, 0x20, 0x4f, - 0xe5, 0x4a, 0x9b, 0xcb, 0xbd, 0x55, 0x4a, 0xc1, 0x8f, 0x6e, 0x3c, 0x4b, - 0x7e, 0xd8, 0x0c, 0xb2, 0xd5, 0x5a, 0x44, 0xc8, 0xec, 0xb6, 0x89, 0xd2, - 0x04, 0xab, 0x82, 0x6d, 0xfe, 0x6f, 0xad, 0xed, 0x6b, 0x0c, 0xe4, 0x9f, - 0x87, 0xf1, 0xbe, 0x97, 0x3d, 0xcc, 0x7f, 0x25, 0xf9, 0x32, 0x6c, 0xb5, - 0xc1, 0x3d, 0xd4, 0xdc, 0x13, 0xf0, 0x61, 0xe1, 0x04, 0x75, 0xfa, 0xb4, - 0x55, 0xd5, 0x2e, 0x5b, 0x67, 0x5d, 0x14, 0x67, 0x0f, 0x40, 0x72, 0xad, - 0xe3, 0xae, 0xda, 0x96, 0x7b, 0xf9, 0x7f, 0x85, 0xe7, 0xf0, 0xe0, 0xe8, - 0x99, 0x6f, 0xc6, 0x32, 0xa2, 0x22, 0xcb, 0x17, 0x81, 0x5f, 0xfd, 0xc9, - 0x83, 0x10, 0xbe, 0x4f, 0x92, 0x80, 0x56, 0x26, 0x3c, 0xa5, 0x6c, 0x4d, - 0x18, 0xd2, 0x01, 0xfd, 0x07, 0x88, 0x43, 0x18, 0x16, 0xb0, 0x97, 0x9d, - 0x00, 0xeb, 0xbb, 0xe0, 0xbb, 0x13, 0xbf, 0x9e, 0x47, 0xef, 0xb3, 0x1d, - 0x5c, 0x21, 0x49, 0x84, 0x78, 0x66, 0x9b, 0x9f, 0x2e, 0x1b, 0xc3, 0x00, - 0xaf, 0x07, 0x78, 0xdf, 0x8a, 0x87, 0x3c, 0x0a, 0xf9, 0x67, 0x81, 0xa8, - 0x7b, 0x70, 0x32, 0xb7, 0x04, 0x9f, 0x39, 0xfe, 0xf8, 0x64, 0x3a, 0x5f, - 0xfa, 0xee, 0x45, 0xd6, 0xb9, 0x55, 0xf7, 0x50, 0x33, 0xe3, 0xd7, 0xb5, - 0x90, 0x1e, 0x94, 0x62, 0xf1, 0x6f, 0xe5, 0x3e, 0x22, 0xd1, 0x80, 0xe0, - 0x17, 0x2e, 0x24, 0x48, 0x8f, 0x2a, 0x32, 0x4a, 0x4b, 0xd9, 0xac, 0x58, - 0xf2, 0xb5, 0xb5, 0x12, 0xcf, 0xe7, 0x18, 0xb1, 0xb7, 0x32, 0x8b, 0x5d, - 0x14, 0xcd, 0xb1, 0xe0, 0x9a, 0xc9, 0x9e, 0xa9, 0xe1, 0x88, 0x90, 0xb0, - 0x19, 0x11, 0x14, 0x42, 0x65, 0xd6, 0x16, 0xd1, 0xad, 0x02, 0x41, 0x3c, - 0xa1, 0xd1, 0xdf, 0x55, 0xab, 0x29, 0x1b, 0xb0, 0xf2, 0x04, 0x79, 0xf9, - 0x32, 0xfd, 0x13, 0x83, 0x7b, 0x9f, 0x9f, 0xb0, 0x6a, 0xb5, 0x31, 0x75, - 0xcd, 0x41, 0x55, 0xcf, 0x47, 0x18, 0x03, 0x57, 0xf9, 0xf8, 0x2d, 0xe2, - 0x9e, 0x81, 0x08, 0xe6, 0x31, 0x4e, 0x31, 0x00, 0xb4, 0x5d, 0xa4, 0xc2, - 0x61, 0xc4, 0x8a, 0x6c, 0x52, 0x71, 0xe2, 0x08, 0xf2, 0x4b, 0xeb, 0x14, - 0xbe, 0x7c, 0x61, 0x53, 0x9f, 0xaf, 0xcf, 0x48, 0x7d, 0x30, 0x30, 0xd8, - 0xae, 0x88, 0x6c, 0xcf, 0x69, 0xe8, 0x76, 0x21, 0x92, 0x49, 0x4e, 0xcf, - 0x8d, 0xe9, 0x9c, 0x75, 0x50, 0x20, 0x3c, 0xf0, 0x49, 0xab, 0xf7, 0xc5, - 0x6d, 0xac, 0xfa, 0x7d, 0x64, 0x89, 0x03, 0x94, 0x72, 0x38, 0xc6, 0xde, - 0x7d, 0xd7, 0x02, 0xa1, 0x45, 0xb4, 0x86, 0xc4, 0xd2, 0x96, 0xf6, 0x0b, - 0x30, 0xf6, 0x52, 0x14, 0x3b, 0xf5, 0x61, 0x40, 0x81, 0xf7, 0xd8, 0x5d, - 0xac, 0x37, 0x98, 0x21, 0x7c, 0x48, 0x99, 0xab, 0x4d, 0x3f, 0x87, 0x9e, - 0x75, 0x39, 0xa4, 0x47, 0xe9, 0x68, 0xca, 0x5c, 0x3e, 0x6a, 0x5d, 0x71, - 0x11, 0x43, 0x01, 0x27, 0x97, 0xbe, 0x95, 0x47, 0x60, 0x1f, 0x40, 0x4e, - 0x39, 0xcd, 0x39, 0x54, 0x24, 0xb5, 0x07, 0xa8, 0x6a, 0x34, 0x02, 0x81, - 0x8c, 0xe7, 0x17, 0x09, 0x6d, 0xbe, 0x59, 0x55, 0x84, 0x27, 0x2e, 0x81, - 0xc0, 0x30, 0x19, 0x4d, 0xe4, 0x77, 0x2c, 0x26, 0x7a, 0x51, 0xc5, 0x85, - 0x34, 0x70, 0x8e, 0x65, 0xd8, 0xde, 0xb7, 0x83, 0x26, 0x55, 0xff, 0xe1, - 0x27, 0x26, 0x4e, 0x51, 0x29, 0x25, 0x2f, 0x2d, 0x48, 0x79, 0x2c, 0xe5, - 0x4c, 0x6b, 0xc5, 0x3c, 0x8e, 0xf2, 0x77, 0x80, 0x29, 0x87, 0x36, 0xac, - 0x46, 0x52, 0x69, 0xe5, 0x0d, 0x34, 0xb3, 0x96, 0xb3, 0x5c, 0x17, 0x80, - 0x99, 0xc6, 0xa2, 0x26, 0x9d, 0xa2, 0x4e, 0x4e, 0xdb, 0x7f, 0xc0, 0xc5, - 0xbe, 0xed, 0xaf, 0x6c, 0x80, 0x40, 0x12, 0xc4, 0x4b, 0x18, 0x77, 0xc6, - 0xd3, 0xa3, 0xe5, 0x81, 0x61, 0xe9, 0x4a, 0x30, 0x7e, 0x3d, 0xd8, 0x1b, - 0x9b, 0xef, 0x68, 0xeb, 0xdb, 0x5e, 0xf9, 0x35, 0x32, 0xde, 0xc5, 0xf7, - 0xde, 0xc8, 0xae, 0xfa, 0x34, 0xd2, 0x71, 0x77, 0x57, 0x9a, 0x9f, 0xff, - 0xb0, 0x5f, 0x47, 0xff, 0x5d, 0x18, 0x15, 0xf1, 0x07, 0xf1, 0xb4, 0x96, - 0xf8, 0x47, 0x98, 0x50, 0x0d, 0xa6, 0x6d, 0x21, 0xb2, 0xcd, 0xf3, 0x77, - 0x01, 0xe1, 0xee, 0x4d, 0x8d, 0x06, 0x92, 0xec, 0x2d, 0xfc, 0xf3, 0xec, - 0x4e, 0x7b, 0x6e, 0x08, 0x3c, 0x55, 0xf6, 0x32, 0xa3, 0x90, 0x73, 0xd3, - 0x21, 0x02, 0x31, 0x5b, 0xd0, 0x57, 0x56, 0xbd, 0xa7, 0xc3, 0x8d, 0xe1, - 0x9f, 0x5d, 0x5f, 0x1f, 0xd6, 0x73, 0xf0, 0x28, 0x53, 0xa2, 0x94, 0x10, - 0x77, 0x17, 0x1b, 0xd9, 0x53, 0x5b, 0x1c, 0x8d, 0x89, 0xdb, 0x55, 0x4a, - 0xf0, 0x42, 0x90, 0xaa, 0x6b, 0xe7, 0xde, 0xf8, 0x9a, 0x32, 0xe2, 0x3e, - 0x82, 0xfe, 0x1a, 0x6e, 0xda, 0x0f, 0xcb, 0xde, 0xa9, 0x34, 0x92, 0xc6, - 0x87, 0x62, 0x4b, 0xd0, 0x3e, 0xc7, 0x4f, 0xfb, 0x8f, 0x09, 0xc4, 0xcc, - 0x9f, 0x52, 0xca, 0x7d, 0xf9, 0x00, 0x8f, 0x09, 0xf1, 0x89, 0xd5, 0xb8, - 0x7c, 0x00, 0x48, 0xb8, 0xa9, 0x63, 0x4c, 0x74, 0x93, 0x60, 0x48, 0xb7, - 0x77, 0x19, 0x01, 0xda, 0x15, 0xa8, 0x72, 0x15, 0x50, 0xf5, 0xfa, 0x71, - 0x5c, 0x00, 0x7a, 0xa1, 0x33, 0x18, 0xfb, 0xf8, 0xef, 0xc9, 0xf0, 0xa2, - 0x83, 0x3d, 0xdc, 0xca, 0x73, 0xc6, 0xe3, 0xe1, 0x21, 0x72, 0xad, 0x04, - 0x8f, 0x36, 0x3a, 0x0a, 0xf2, 0x1f, 0xd5, 0x1f, 0xc2, 0xb5, 0xcc, 0x85, - 0x08, 0x4b, 0x65, 0x44, 0xcd, 0x56, 0x19, 0xcb, 0xbb, 0x17, 0xdb, 0x2d, - 0xc9, 0x20, 0x29, 0x3a, 0x66, 0x0d, 0x87, 0xaf, 0x54, 0x1f, 0x27, 0xd5, - 0xc6, 0x65, 0xbb, 0x03, 0x92, 0x1f, 0x81, 0xde, 0x93, 0xe9, 0x51, 0x73, - 0xc7, 0xad, 0x56, 0x88, 0x54, 0x7d, 0xc4, 0x69, 0xcc, 0x34, 0xe6, 0xe4, - 0xf4, 0x39, 0x50, 0xaa, 0xba, 0xd0, 0x83, 0xac, 0x1e, 0x19, 0xb8, 0x1c, - 0x70, 0x29, 0x05, 0x6a, 0x57, 0xa9, 0x1c, 0x15, 0x35, 0x69, 0xae, 0x2b, - 0xf1, 0x02, 0x65, 0x02, 0xff, 0x30, 0x52, 0xd1, 0x97, 0xe2, 0x76, 0x8c, - 0x93, 0xe9, 0x34, 0xff, 0xda, 0x30, 0xa1, 0xd1, 0x5e, 0x96, 0x0b, 0xe8, - 0x5d, 0x2a, 0x07, 0x2f, 0xad, 0xb0, 0x4f, 0x39, 0xf8, 0x6d, 0xf7, 0x7b, - 0xf9, 0x71, 0xb5, 0x00, 0xf0, 0xc0, 0x66, 0xb6, 0xd4, 0x15, 0xd9, 0xb8, - 0xb9, 0x49, 0xc9, 0x79, 0xbf, 0xc2, 0xa5, 0xf4, 0x43, 0x05, 0xa4, 0xa6, - 0xad, 0x0d, 0xe3, 0x8e, 0x36, 0x43, 0x73, 0x35, 0x24, 0x32, 0xb4, 0x12, - 0xc1, 0x49, 0x55, 0x7f, 0xa4, 0x73, 0x13, 0x60, 0xdd, 0x88, 0x64, 0xd2, - 0x23, 0xad, 0x5f, 0x98, 0x26, 0xb5, 0xe1, 0xe5, 0x85, 0xf5, 0x29, 0x1d, - 0xd7, 0x94, 0x0c, 0xe0, 0x0b, 0x94, 0xa4, 0x92, 0xd0, 0xfa, 0xd4, 0x01, - 0xba, 0x67, 0xc3, 0x35, 0x01, 0x8d, 0x8e, 0xd7, 0xf7, 0xb8, 0xe6, 0x3d, - 0xb6, 0xfe, 0x02, 0xf2, 0x86, 0x38, 0x73, 0x07, 0xee, 0x04, 0x11, 0x39, - 0x18, 0x81, 0x1c, 0xff, 0x6a, 0x90, 0xa4, 0xdc, 0x63, 0x4c, 0x77, 0x7d, - 0xc9, 0xe8, 0xc2, 0xb6, 0x8e, 0xd5, 0x08, 0xec, 0xdb, 0x3d, 0xbe, 0xe7, - 0x72, 0x70, 0xef, 0xd2, 0x5f, 0x9d, 0xe1, 0xee, 0xa8, 0xac, 0x33, 0x98, - 0x6b, 0x30, 0xb0, 0x6e, 0x85, 0xf8, 0xec, 0x57, 0xe8, 0xc5, 0xca, 0x63, - 0xdc, 0xe9, 0x64, 0xea, 0xcb, 0x85, 0xc7, 0x7c, 0x83, 0x1c, 0xec, 0x03, - 0x3d, 0x42, 0xec, 0x4f, 0xb0, 0x34, 0xe7, 0x8c, 0xb3, 0x24, 0x7c, 0x6b, - 0x3a, 0x29, 0x69, 0xf0, 0x49, 0x94, 0xd8, 0xdc, 0x53, 0xa6, 0xc4, 0x7c, - 0x01, 0xf4, 0xdd, 0xff, 0x73, 0x0a, 0xaa, 0x07, 0x1c, 0x84, 0xba, 0xa5, - 0x10, 0xea, 0xf1, 0xf9, 0x81, 0x41, 0x4d, 0xa7, 0xc2, 0x7f, 0x49, 0x5f, - 0xbe, 0x11, 0x5c, 0x90, 0xf8, 0xb7, 0xdf, 0xe2, 0x73, 0x31, 0x55, 0x91, - 0x23, 0x31, 0x1d, 0xf6, 0x0b, 0x59, 0xd1, 0x08, 0xd5, 0x83, 0xa0, 0x38, - 0x6d, 0xe3, 0x9f, 0xc8, 0x1a, 0x3e, 0xb3, 0x5e, 0x66, 0xb3, 0x33, 0x0f, - 0x10, 0xf0, 0x24, 0x6f, 0xc7, 0xd2, 0xbe, 0x76, 0x1d, 0x39, 0x86, 0x34, - 0x7e, 0x8c, 0xfa, 0x43, 0x7e, 0x07, 0x4f, 0x8a, 0x57, 0x7a, 0x6a, 0xe8, - 0xbc, 0x50, 0x7a, 0x4e, 0xf4, 0x2a, 0x90, 0xf9, 0x63, 0xb5, 0x83, 0x9f, - 0x3e, 0x69, 0x0b, 0x52, 0x95, 0xb3, 0x13, 0xdc, 0x5e, 0x32, 0xec, 0xf2, - 0x2c, 0xf3, 0xab, 0xb4, 0x06, 0xca, 0x35, 0xa8, 0x63, 0xe9, 0x15, 0x71, - 0xc6, 0xe9, 0x04, 0xd1, 0x5d, 0x79, 0x0d, 0x2f, 0xd9, 0x29, 0x20, 0xa9, - 0xfc, 0x76, 0xab, 0xf8, 0x7c, 0x46, 0xf9, 0x09, 0xf2, 0x0e, 0x0d, 0x19, - 0x9a, 0x17, 0xc7, 0xef, 0x6f, 0x04, 0x04, 0x5f, 0x51, 0x5f, 0xad, 0x83, - 0xe3, 0x20, 0x7c, 0xc5, 0x3b, 0x2c, 0x18, 0xe9, 0x64, 0xdb, 0x0a, 0xed, - 0xf2, 0xcb, 0xb3, 0x8d, 0xb0, 0x0c, 0xca, 0xaa, 0x1f, 0x47, 0x8e, 0x23, - 0x5d, 0x32, 0x5a, 0xd8, 0x3e, 0x22, 0x97, 0x38, 0xd0, 0xef, 0xd8, 0x94, - 0x3d, 0xab, 0x63, 0x88, 0x59, 0xd7, 0xea, 0x77, 0x0e, 0xfa, 0x5a, 0x40, - 0x77, 0xc8, 0xf7, 0xe8, 0x40, 0x32, 0xd6, 0x66, 0xd0, 0x7f, 0x99, 0xf7, - 0x40, 0x97, 0x18, 0xe8, 0x10, 0x52, 0x55, 0xa1, 0x43, 0x75, 0x66, 0xd1, - 0x81, 0x3b, 0x6f, 0x8b, 0xf8, 0x0e, 0xe1, 0x14, 0x8e, 0x1c, 0xfb, 0xf5, - 0xb4, 0x55, 0x20, 0xe7, 0xa8, 0xd0, 0xaa, 0xbf, 0xad, 0xfc, 0xba, 0x23, - 0xb9, 0x60, 0x4a, 0xf5, 0x0c, 0x39, 0x94, 0xc7, 0xfb, 0x74, 0x5b, 0xb0, - 0xcf, 0x91, 0x1b, 0x99, 0x44, 0x1b, 0x5f, 0x37, 0xdb, 0x83, 0xc6, 0x44, - 0x91, 0x94, 0x45, 0x16, 0x0d, 0x28, 0x8f, 0x6d, 0xa5, 0xa8, 0xae, 0xf3, - 0x99, 0xc8, 0xc4, 0xe5, 0x64, 0xbc, 0x7e, 0x8a, 0xc5, 0x9f, 0x3a, 0xd6, - 0xcf, 0x1e, 0x7e, 0x8f, 0x9a, 0x73, 0xd6, 0x9f, 0x0f, 0x1d, 0xb7, 0x18, - 0x0d, 0x1d, 0x5e, 0x4c, 0xbc, 0x6b, 0x47, 0x8c, 0xd1, 0x49, 0xca, 0x78, - 0xd0, 0xcb, 0x89, 0x6b, 0xe3, 0xe1, 0x4e, 0x1b, 0xd7, 0x73, 0x1d, 0xcd, - 0x48, 0x6c, 0xbf, 0xb7, 0x1e, 0x4b, 0x42, 0xd7, 0xae, 0x8a, 0x79, 0x41, - 0x62, 0x5b, 0xdf, 0x02, 0x36, 0x91, 0xbf, 0x7a, 0x2a, 0xe6, 0x50, 0xbb, - 0x72, 0xcd, 0xd3, 0x57, 0xc6, 0xaa, 0xcd, 0xf3, 0xa5, 0x01, 0x53, 0x39, - 0x52, 0xd4, 0x72, 0x66, 0x0f, 0x4d, 0x74, 0x07, 0xe4, 0x80, 0x29, 0x24, - 0xe4, 0x03, 0x66, 0xfd, 0xaf, 0xda, 0x70, 0x63, 0x4d, 0xb0, 0x87, 0x7d, - 0x6f, 0x59, 0x1e, 0x1d, 0x05, 0xb5, 0xf9, 0x85, 0x71, 0x16, 0x41, 0xb7, - 0xca, 0x91, 0xcc, 0x15, 0x7f, 0x53, 0xf7, 0x32, 0xf7, 0xb7, 0x5e, 0x98, - 0x39, 0xb0, 0xff, 0x40, 0xfa, 0xd4, 0x5f, 0x2b, 0xd5, 0x94, 0x80, 0xcf, - 0xd4, 0xe4, 0x1d, 0xac, 0x38, 0xa8, 0x7e, 0x0c, 0xa5, 0x31, 0x5f, 0xb2, - 0x7b, 0x08, 0x98, 0xbb, 0x1f, 0xb8, 0xf3, 0x5e, 0x3f, 0xfd, 0xdd, 0x5e, - 0x59, 0x55, 0xd2, 0xf4, 0x3d, 0xeb, 0xfa, 0x69, 0x3c, 0xe4, 0xd4, 0x04, - 0x79, 0x41, 0x63, 0x6d, 0xd5, 0x90, 0x5e, 0x10, 0xd7, 0x85, 0xc6, 0xef, - 0x1d, 0xfb, 0x1f, 0xab, 0xb8, 0x5a, 0x0a, 0x0f, 0x80, 0x3b, 0xc2, 0x38, - 0xb9, 0x6c, 0x17, 0x4d, 0x0a, 0x94, 0x7d, 0x80, 0x38, 0xe7, 0xc3, 0xe3, - 0xd5, 0x4f, 0xb8, 0xda, 0x83, 0x47, 0x3a, 0xcb, 0x4d, 0xe8, 0xf6, 0x68, - 0xde, 0x8f, 0xe8, 0x90, 0x84, 0x74, 0xd8, 0xd0, 0xad, 0xa2, 0x66, 0x35, - 0x3a, 0xe6, 0x64, 0xaa, 0xcc, 0xda, 0x34, 0x2e, 0x42, 0x9b, 0xef, 0x66, - 0x78, 0xce, 0xbb, 0xbc, 0x49, 0x63, 0xce, 0x51, 0x0b, 0x13, 0xf8, 0x67, - 0x87, 0x66, 0x67, 0x78, 0x95, 0x9f, 0x56, 0x68, 0xbb, 0xe7, 0x07, 0x44, - 0xdf, 0x19, 0xdc, 0x85, 0xa6, 0x35, 0x2a, 0x19, 0xc5, 0xb1, 0xb9, 0x46, - 0x95, 0x47, 0x9c, 0x0f, 0x75, 0x82, 0x5e, 0x57, 0xf2, 0x95, 0x77, 0xa8, - 0x84, 0xe0, 0xc8, 0xdb, 0xfa, 0x3d, 0x83, 0x7a, 0x6e, 0x77, 0xdd, 0xea, - 0xec, 0xa8, 0x10, 0xda, 0x3f, 0xe4, 0xcd, 0xaf, 0x1e, 0x55, 0x9f, 0x6f, - 0x58, 0xe3, 0x43, 0xfc, 0x58, 0xab, 0x35, 0x52, 0xb7, 0xd4, 0x6e, 0x2b, - 0x9a, 0x8d, 0xcc, 0xda, 0x9f, 0xef, 0xb3, 0xaf, 0x51, 0x3b, 0x9f, 0x1d, - 0x0a, 0x1c, 0x54, 0x5c, 0x69, 0x81, 0x9e, 0xb6, 0x97, 0xfd, 0xcd, 0x94, - 0x04, 0xca, 0x52, 0xdb, 0x5d, 0x1e, 0x0b, 0xdc, 0x6d, 0xe8, 0x5b, 0x82, - 0xdd, 0x14, 0x8a, 0xc7, 0xab, 0x78, 0xec, 0x26, 0xb0, 0x6e, 0xf8, 0xa1, - 0x35, 0x8a, 0xbc, 0x45, 0xdf, 0xe7, 0xb9, 0x75, 0x4a, 0x99, 0x8d, 0x54, - 0xb0, 0xbf, 0x78, 0x2c, 0xbe, 0xfc, 0xf1, 0x81, 0x34, 0x4e, 0x8a, 0x4a, - 0x4e, 0xdd, 0xd3, 0x83, 0x47, 0x25, 0xa7, 0x8f, 0xb1, 0xd8, 0x46, 0xc3, - 0xda, 0x24, 0x00, 0xf1, 0x54, 0xcf, 0x8a, 0x51, 0x35, 0x10, 0xa0, 0x17, - 0x21, 0x9e, 0x6b, 0x98, 0x1b, 0x99, 0x80, 0x57, 0x99, 0x31, 0xa9, 0x66, - 0x51, 0x4b, 0xaf, 0xb8, 0x46, 0x44, 0xe4, 0x0c, 0xac, 0x35, 0xea, 0xb0, - 0x4c, 0x07, 0x37, 0x42, 0xf8, 0xe1, 0x01, 0x73, 0x4b, 0x90, 0x99, 0xf8, - 0x4f, 0xd0, 0x64, 0x98, 0x64, 0x66, 0xcc, 0xb8, 0x8f, 0x5e, 0x65, 0xf1, - 0xf7, 0xe9, 0x21, 0x62, 0xd3, 0x86, 0x58, 0xd2, 0x30, 0x21, 0x59, 0x49, - 0x2d, 0xd5, 0x7a, 0x13, 0xe9, 0xe5, 0xa6, 0x64, 0xf0, 0xa9, 0xa4, 0x6a, - 0x42, 0xb1, 0x72, 0x71, 0x7f, 0x91, 0x47, 0x7a, 0xba, 0x58, 0xd3, 0xa7, - 0xeb, 0x68, 0x78, 0x87, 0x3d, 0x76, 0x93, 0xc2, 0xb3, 0x2a, 0x19, 0xed, - 0x0a, 0x58, 0x35, 0x4e, 0x4e, 0xd7, 0x65, 0x8e, 0x98, 0x0a, 0x1f, 0xf1, - 0x18, 0x03, 0x01, 0x2e, 0x1b, 0xa9, 0x38, 0x4d, 0xd4, 0xa1, 0x17, 0x5d, - 0x84, 0xd5, 0xc9, 0x16, 0x43, 0x31, 0x0e, 0x5f, 0xdb, 0x45, 0x57, 0x89, - 0xe4, 0xca, 0x13, 0x69, 0x1a, 0xd6, 0xd0, 0xc9, 0xfa, 0x57, 0x8a, 0xef, - 0x0e, 0xb5, 0x41, 0xce, 0xb3, 0x05, 0x07, 0xb7, 0x1b, 0xd9, 0x58, 0xe0, - 0x52, 0x35, 0xfc, 0xca, 0x30, 0x10, 0x55, 0x13, 0xaa, 0xe3, 0x74, 0x15, - 0x37, 0xb0, 0xd2, 0xb5, 0xfb, 0x5b, 0xf5, 0x63, 0x18, 0x12, 0xfa, 0x48, - 0x62, 0xb9, 0x56, 0x03, 0x46, 0x40, 0x6d, 0xea, 0xab, 0xca, 0xa7, 0xb6, - 0xe5, 0x45, 0xb5, 0x53, 0x2d, 0x9b, 0x5c, 0x7d, 0xdf, 0x3e, 0xc3, 0xb8, - 0x45, 0x85, 0x1f, 0x63, 0x80, 0x36, 0x62, 0x23, 0x6e, 0xfb, 0x0d, 0xce, - 0x76, 0xcb, 0x02, 0xa1, 0x85, 0xc2, 0x40, 0x83, 0xdf, 0xa5, 0x91, 0x69, - 0x24, 0xac, 0xff, 0xbf, 0x02, 0xfe, 0x1e, 0x0f, 0x54, 0xc4, 0x37, 0xa7, - 0x60, 0x2f, 0x5a, 0xe5, 0x58, 0x6d, 0xdf, 0xc0, 0x12, 0xbb, 0xb3, 0xf4, - 0xe1, 0x02, 0x4f, 0x1f, 0xc0, 0xab, 0x1a, 0xb0, 0xa9, 0xdc, 0xa8, 0x00, - 0xd5, 0x2c, 0x78, 0xbd, 0xb9, 0xfb, 0x9f, 0xe8, 0x4d, 0x82, 0xa1, 0x31, - 0xb2, 0x03, 0xec, 0x39, 0x7f, 0x18, 0x5e, 0xa6, 0x92, 0x1b, 0xb2, 0x38, - 0x5c, 0xab, 0xf6, 0x3c, 0xc6, 0x19, 0x70, 0x43, 0x01, 0xde, 0x44, 0x0e, - 0x84, 0xcf, 0xb9, 0xec, 0xe1, 0x97, 0x9e, 0xc2, 0x3b, 0x15, 0x06, 0xb4, - 0x61, 0x8a, 0xe0, 0x30, 0x14, 0xc4, 0x9f, 0xff, 0x8b, 0xb6, 0x66, 0x8d, - 0xdd, 0xd9, 0xda, 0x05, 0xb5, 0x14, 0x59, 0xce, 0x40, 0x1b, 0x79, 0x84, - 0xed, 0x06, 0x78, 0x2c, 0x21, 0x58, 0xb3, 0x7a, 0x0b, 0xfc, 0x81, 0x4b, - 0x09, 0x0c, 0xd3, 0x86, 0x6f, 0x72, 0x2c, 0x87, 0xcb, 0x3e, 0x09, 0x94, - 0xe5, 0xc0, 0x38, 0xf0, 0x4e, 0xe1, 0x88, 0x17, 0x4b, 0x13, 0x1a, 0x8a, - 0xf7, 0xb3, 0x01, 0xaa, 0xf5, 0x16, 0xe6, 0x15, 0x98, 0xcb, 0x45, 0xd8, - 0xd3, 0xbc, 0x97, 0xe1, 0x01, 0x77, 0x65, 0x90, 0xaf, 0x4e, 0x07, 0xfb, - 0x7d, 0xb7, 0x19, 0x4d, 0x60, 0xe0, 0xec, 0xb3, 0x34, 0x46, 0x7a, 0x1e, - 0x3d, 0xa3, 0x16, 0xc9, 0xd4, 0x55, 0x57, 0xbd, 0xbe, 0x73, 0x03, 0xb7, - 0x99, 0xee, 0x51, 0x49, 0x91, 0x8b, 0x72, 0x2e, 0x2a, 0xc0, 0x63, 0xe3, - 0xf0, 0x28, 0xa4, 0x40, 0xde, 0x44, 0x98, 0x47, 0x0b, 0x1e, 0xbe, 0x8e, - 0xcf, 0x81, 0x46, 0x1f, 0xc5, 0xaf, 0xff, 0xf3, 0x72, 0x6b, 0xb8, 0xdb, - 0x4c, 0xe9, 0x7c, 0x3b, 0xd7, 0x2e, 0x2d, 0x84, 0x80, 0xe1, 0xdb, 0x31, - 0x51, 0xc2, 0x8d, 0x16, 0x63, 0x48, 0x03, 0xeb, 0x87, 0x6f, 0xd6, 0xa3, - 0x08, 0xa8, 0xc6, 0x80, 0x7a, 0x5d, 0xef, 0x0e, 0x6e, 0xc9, 0xb5, 0x1b, - 0xa0, 0x99, 0xa3, 0x84, 0xb5, 0x18, 0xb5, 0x34, 0x2f, 0x8a, 0xe9, 0x99, - 0x43, 0xdb, 0xb4, 0x62, 0x50, 0x43, 0xc4, 0xaf, 0xa5, 0x3c, 0xa6, 0x0f, - 0x6c, 0xe9, 0xea, 0x59, 0x94, 0x06, 0xce, 0x10, 0x6d, 0xf1, 0x17, 0x97, - 0x94, 0xf9, 0x22, 0x34, 0x9d, 0x35, 0x38, 0xd5, 0x37, 0xf5, 0x07, 0x2a, - 0x58, 0x68, 0xc2, 0x0b, 0x21, 0xb9, 0xab, 0xa8, 0xe9, 0xd8, 0xe7, 0xc0, - 0xde, 0x67, 0x1b, 0x2f, 0x3b, 0x9e, 0x15, 0x36, 0x1b, 0x20, 0xad, 0x12, - 0xce, 0x1e, 0xf8, 0xeb, 0xaa, 0x34, 0x76, 0x06, 0xa3, 0x70, 0x43, 0x60, - 0x1d, 0x7a, 0x10, 0xf3, 0xe0, 0x4e, 0x98, 0xc4, 0xfb, 0x6b, 0xe6, 0x37, - 0xa9, 0x00, 0x7b, 0xa5, 0x86, 0xe6, 0xbb, 0x80, 0xf5, 0x90, 0x89, 0x39, - 0xb5, 0x7c, 0xf7, 0x69, 0xa1, 0xd4, 0x6a, 0x88, 0x65, 0x69, 0xfe, 0x88, - 0x7b, 0x2b, 0x8c, 0xf9, 0xfb, 0x0f, 0x06, 0x64, 0x2e, 0xd3, 0x63, 0x32, - 0x20, 0xf4, 0x9f, 0xb1, 0x47, 0x14, 0x08, 0x9a, 0x71, 0x2e, 0xdd, 0x1b, - 0xb4, 0xfa, 0x76, 0x53, 0x68, 0xcd, 0x40, 0xb6, 0x02, 0x4f, 0x81, 0x1d, - 0xae, 0x4d, 0xdf, 0x8c, 0x19, 0xb5, 0x5b, 0xb5, 0x9d, 0x87, 0xe6, 0xc9, - 0x2b, 0xaa, 0x30, 0x98, 0xe4, 0x66, 0x79, 0x6f, 0x7f, 0x35, 0x8c, 0x3b, - 0xb3, 0x3a, 0xfd, 0x91, 0x7e, 0x74, 0x73, 0xd7, 0x04, 0x08, 0x07, 0x95, - 0x3f, 0x6e, 0x30, 0x91, 0x36, 0x44, 0x70, 0x77, 0xaf, 0x4d, 0x98, 0x58, - 0x2a, 0x2c, 0x68, 0xb1, 0xa1, 0xf6, 0xa7, 0x52, 0xd6, 0x31, 0x91, 0x7b, - 0x6f, 0xb6, 0xc8, 0x53, 0x6d, 0x17, 0xe6, 0x1f, 0x6a, 0x05, 0xec, 0xb8, - 0xe8, 0x77, 0xf5, 0x1c, 0xa4, 0xae, 0x84, 0xdc, 0x91, 0xbf, 0x2f, 0xd1, - 0xec, 0xa5, 0x22, 0x50, 0x78, 0x80, 0x08, 0x42, 0x83, 0x7f, 0x47, 0x63, - 0x08, 0x18, 0x0a, 0x86, 0x3e, 0x9f, 0x09, 0x4e, 0xae, 0x61, 0x96, 0xb2, - 0x0d, 0x21, 0xd4, 0xf6, 0x33, 0x14, 0xc8, 0xa2, 0x01, 0xee, 0xe1, 0x43, - 0xb1, 0xbb, 0x32, 0x5f, 0x74, 0x6d, 0x2b, 0x04, 0x6c, 0x65, 0xad, 0xa4, - 0xfb, 0x24, 0xb5, 0xbe, 0xd9, 0xaa, 0x89, 0x8e, 0x07, 0xbd, 0xf5, 0x46, - 0xa1, 0xb5, 0x4a, 0x2f, 0xeb, 0x72, 0x7a, 0x91, 0x38, 0xb2, 0xc1, 0x76, - 0xf6, 0x8e, 0xed, 0x86, 0x13, 0x72, 0xaf, 0x09, 0x68, 0xb7, 0xd6, 0x84, - 0x1d, 0xe6, 0xc4, 0x51, 0xf7, 0x6f, 0xbd, 0x53, 0x86, 0x5e, 0xc1, 0xd8, - 0xc2, 0x36, 0x5a, 0x66, 0x87, 0x9d, 0x94, 0xf1, 0xf1, 0xfe, 0x02, 0x52, - 0xb3, 0xeb, 0xfa, 0xb1, 0xe3, 0xba, 0x62, 0x6e, 0xcb, 0x42, 0xf7, 0x82, - 0xb1, 0x81, 0x6c, 0x91, 0x86, 0xbf, 0xcf, 0x91, 0xd2, 0xff, 0xc1, 0x1c, - 0x5d, 0xa7, 0x12, 0xe3, 0x4a, 0xd0, 0x4b, 0x7e, 0x01, 0xb1, 0x8b, 0x6e, - 0x72, 0x6d, 0xfc, 0x21, 0x3f, 0xca, 0x24, 0x49, 0xc0, 0xf9, 0xb5, 0x40, - 0x85, 0xa0, 0xd4, 0x94, 0x4f, 0xbf, 0x02, 0x51, 0xf7, 0xef, 0xbc, 0xe5, - 0xc2, 0x11, 0xf4, 0x01, 0x47, 0xe6, 0xdc, 0x04, 0x80, 0x0a, 0x6d, 0xc7, - 0xba, 0x5e, 0xf5, 0x69, 0xa0, 0x8b, 0x66, 0xd4, 0xf2, 0xd5, 0x23, 0x9a, - 0xeb, 0xb3, 0x00, 0xe8, 0x75, 0xc9, 0x78, 0x6d, 0x4f, 0x92, 0xb4, 0x31, - 0x61, 0x85, 0xa8, 0x5d, 0xb7, 0x7e, 0x23, 0xad, 0x2f, 0x3d, 0x8b, 0x5e, - 0x61, 0x51, 0xfd, 0x02, 0x32, 0xee, 0x8b, 0xf0, 0xde, 0x4c, 0x04, 0xa7, - 0x83, 0xb0, 0x28, 0x9d, 0xa5, 0xa5, 0x17, 0x62, 0x6b, 0xfc, 0x00, 0x4a, - 0x9d, 0x15, 0x85, 0x69, 0x92, 0xc6, 0x2a, 0x2a, 0x0d, 0x8d, 0xae, 0x14, - 0x0f, 0x0c, 0xcd, 0xa4, 0x00, 0xd8, 0x1d, 0x3c, 0x0b, 0xee, 0x8b, 0x0b, - 0x95, 0x72, 0xe9, 0xe8, 0xef, 0xcf, 0xf9, 0x29, 0x27, 0xd0, 0x9c, 0x0a, - 0x22, 0x3a, 0xa3, 0xa1, 0x4a, 0xe6, 0x0e, 0x7f, 0x63, 0xc8, 0x63, 0x0b, - 0xd9, 0xba, 0x5e, 0x37, 0xcd, 0xf2, 0xd6, 0x63, 0x8e, 0xe6, 0x86, 0xf7, - 0x70, 0xb2, 0x26, 0x82, 0x65, 0xb4, 0xf5, 0x86, 0x16, 0x92, 0xfe, 0xfe, - 0xd4, 0x29, 0x22, 0xd9, 0x26, 0x75, 0xcd, 0xd3, 0xdc, 0xd8, 0x2b, 0x3a, - 0x76, 0x7d, 0x09, 0x73, 0x2c, 0x0b, 0xaf, 0x57, 0x8f, 0x1c, 0xef, 0xfe, - 0x13, 0x85, 0x1a, 0x9d, 0xc8, 0xae, 0x01, 0x33, 0xd8, 0x4b, 0x24, 0x4f, - 0x20, 0x86, 0xef, 0x88, 0x35, 0xe1, 0x2c, 0x7f, 0x29, 0xcc, 0x18, 0x82, - 0x32, 0xa9, 0xda, 0x04, 0xb9, 0x9b, 0x55, 0x6d, 0x3b, 0x66, 0x85, 0x46, - 0x81, 0xff, 0x3c, 0x04, 0xd5, 0x9a, 0x0a, 0xd8, 0xdd, 0x6b, 0xed, 0x35, - 0x77, 0xa0, 0x93, 0xb5, 0x98, 0x57, 0xaa, 0xa6, 0x51, 0x2a, 0x73, 0xe8, - 0xdf, 0x66, 0x3a, 0xdf, 0x97, 0xd5, 0x77, 0xc8, 0x01, 0x22, 0xc3, 0x01, - 0x4b, 0x4c, 0xcd, 0xf0, 0xa1, 0xf8, 0xea, 0xbb, 0xf7, 0xee, 0xd2, 0x85, - 0x5c, 0xb5, 0x4b, 0x7c, 0x46, 0x3d, 0x0a, 0x0c, 0x2f, 0xb9, 0xbc, 0x4c, - 0xa9, 0x56, 0x02, 0x68, 0x46, 0xe1, 0x34, 0xc1, 0xd7, 0x3d, 0x3d, 0x9b, - 0xb8, 0xa1, 0x9c, 0xa4, 0xc7, 0xe6, 0x6f, 0xf6, 0xb0, 0x63, 0x8b, 0x6c, - 0x8e, 0x90, 0x13, 0xbc, 0x85, 0xff, 0x73, 0xb5, 0xeb, 0xb3, 0xf2, 0xdc, - 0x27, 0x0c, 0x1d, 0xbd, 0xb1, 0xa4, 0x66, 0x2b, 0x47, 0x6a, 0x8c, 0x94, - 0x29, 0x24, 0x79, 0xb2, 0x35, 0x82, 0x84, 0xff, 0x7b, 0x45, 0x22, 0x0d, - 0xe1, 0xb9, 0x89, 0x65, 0xc6, 0x17, 0x1c, 0x06, 0xb8, 0xd5, 0xfb, 0xb7, - 0xa1, 0x85, 0xc0, 0xf0, 0x89, 0x9f, 0x9c, 0xa5, 0x89, 0x2c, 0x53, 0xf0, - 0x00, 0xbf, 0x07, 0xbf, 0x31, 0x00, 0xc1, 0x8d, 0x5c, 0x5a, 0xbc, 0x1e, - 0x9a, 0xf9, 0xec, 0xf6, 0x5e, 0xc2, 0x2f, 0x37, 0xae, 0x31, 0x26, 0x3f, - 0x8e, 0x6b, 0xd2, 0xa2, 0xeb, 0xbc, 0xe6, 0xb8, 0x29, 0x1e, 0x42, 0x7d, - 0x0c, 0xf9, 0xfb, 0x8b, 0x08, 0x8a, 0x28, 0x55, 0x08, 0x5b, 0x53, 0xe0, - 0x77, 0x04, 0x9f, 0x13, 0x54, 0x04, 0xaa, 0x20, 0x33, 0xc3, 0x6d, 0x9a, - 0xe2, 0x76, 0xf2, 0x91, 0x27, 0x50, 0x29, 0xd9, 0x7d, 0xfa, 0x05, 0x3a, - 0x10, 0x4d, 0xc9, 0x3d, 0x0d, 0x36, 0x17, 0x27, 0xd1, 0x15, 0x02, 0x8e, - 0xf1, 0xf3, 0x8b, 0xb3, 0xbf, 0x93, 0x7a, 0x63, 0x57, 0xb0, 0xed, 0xb7, - 0x3c, 0xb4, 0x15, 0xfa, 0xaa, 0x78, 0x87, 0x3f, 0x21, 0xe2, 0xc0, 0x53, - 0x19, 0xd6, 0x72, 0x88, 0x2f, 0xba, 0x9f, 0xab, 0x6d, 0xdc, 0x91, 0x8b, - 0x5b, 0xbe, 0x82, 0xf1, 0xd9, 0xf7, 0x2a, 0xa5, 0x65, 0x97, 0xa5, 0x39, - 0x2a, 0x4c, 0xdc, 0xcd, 0x0a, 0x74, 0x77, 0x1c, 0x6f, 0xb6, 0x39, 0xab, - 0x03, 0xa5, 0xfb, 0x32, 0xe2, 0xbf, 0x18, 0xc8, 0x68, 0x88, 0x80, 0x8e, - 0x57, 0x57, 0x58, 0x59, 0x97, 0x7e, 0x29, 0x49, 0xd0, 0x39, 0xda, 0x47, - 0xcb, 0xe9, 0x85, 0xc0, 0x22, 0x2e, 0xa7, 0xc8, 0xb7, 0x1f, 0xf3, 0xd4, - 0xd7, 0x66, 0x77, 0xec, 0xe6, 0xee, 0x0e, 0x73, 0x83, 0x98, 0x6c, 0x09, - 0xb5, 0xbd, 0xcd, 0xdf, 0x25, 0xa5, 0x9e, 0x13, 0x33, 0x80, 0x62, 0x59, - 0x41, 0x83, 0x3a, 0x4f, 0xa1, 0x66, 0xa2, 0xed, 0x97, 0x90, 0x2c, 0x0d, - 0x70, 0x53, 0x03, 0x71, 0x85, 0xcc, 0x92, 0xc7, 0x62, 0x81, 0x11, 0xd0, - 0xe7, 0x6d, 0xb2, 0x81, 0x12, 0x37, 0xbd, 0xbe, 0xf2, 0xeb, 0x60, 0x1f, - 0x7c, 0x42, 0xb3, 0x1d, 0xa3, 0x61, 0x19, 0x94, 0xbd, 0xa0, 0xd5, 0x8c, - 0xa3, 0x9f, 0x08, 0x49, 0x32, 0x33, 0xce, 0x14, 0x06, 0x89, 0x2e, 0x9c, - 0x4d, 0xb2, 0x4c, 0x03, 0x00, 0x6e, 0xca, 0x14, 0xa4, 0x4b, 0xcb, 0x75, - 0xd1, 0x34, 0x57, 0x9e, 0xe7, 0x31, 0x95, 0x29, 0xd1, 0x77, 0x0e, 0x40, - 0x22, 0x46, 0x0c, 0xc7, 0xb3, 0x73, 0xf6, 0x2f, 0x7e, 0x5b, 0x38, 0xe8, - 0xec, 0x52, 0x00, 0xd5, 0xa9, 0x89, 0xb3, 0x64, 0x10, 0x99, 0x4d, 0x3a, - 0xda, 0x21, 0xff, 0x12, 0xb7, 0x56, 0x26, 0xd2, 0xbe, 0xc4, 0xb4, 0xaf, - 0x0c, 0xd2, 0x85, 0xc6, 0x96, 0x6d, 0x4f, 0x62, 0xe6, 0xcb, 0x4d, 0xd2, - 0xf0, 0xe8, 0x8c, 0x22, 0x3a, 0x26, 0x4e, 0x5e, 0xf6, 0xc5, 0x93, 0xb0, - 0x5e, 0x39, 0xf1, 0xbe, 0x84, 0x60, 0xc5, 0xaa, 0x68, 0x81, 0x72, 0x89, - 0x00, 0xff, 0x6b, 0xe1, 0x9a, 0xe2, 0xd4, 0x43, 0x4e, 0x75, 0xb2, 0x73, - 0x98, 0xc7, 0xf1, 0xfa, 0x69, 0x74, 0xa0, 0x53, 0x5b, 0x4c, 0x00, 0xf9, - 0x26, 0xfe, 0x0d, 0x7f, 0xec, 0x9a, 0x94, 0x87, 0x24, 0xfc, 0xd5, 0xcc, - 0x5c, 0x5c, 0x60, 0xd6, 0x8f, 0x65, 0x61, 0x1e, 0x82, 0x90, 0xc3, 0x49, - 0x65, 0x4d, 0x12, 0x09, 0x2a, 0x05, 0x4e, 0x5d, 0x9d, 0xda, 0xde, 0x9e, - 0xee, 0x3a, 0x28, 0x08, 0xa6, 0x52, 0xd8, 0x85, 0xaf, 0x28, 0xce, 0x48, - 0xaa, 0xbe, 0x41, 0xcd, 0x6c, 0x05, 0x96, 0x2e, 0x09, 0xba, 0x80, 0xea, - 0x80, 0x1f, 0x9c, 0xfc, 0x16, 0xd8, 0xf5, 0xf2, 0xce, 0xb5, 0xc5, 0xa0, - 0x73, 0x66, 0x06, 0x11, 0x6f, 0x07, 0x6a, 0xb8, 0x6b, 0x63, 0xdf, 0x04, - 0x1e, 0xef, 0xf8, 0x5c, 0x49, 0xde, 0x1e, 0xcc, 0xcb, 0x1f, 0x66, 0x75, - 0x48, 0x0a, 0x33, 0xf4, 0xb0, 0xe4, 0xc4, 0xa9, 0xd7, 0xa3, 0x4d, 0xf9, - 0x65, 0x6f, 0xdc, 0x77, 0x2a, 0x09, 0x0f, 0x45, 0x75, 0x25, 0x7e, 0x84, - 0xc9, 0x2e, 0x8e, 0xac, 0x75, 0x30, 0xb4, 0xbb, 0xff, 0x50, 0x84, 0x0c, - 0x06, 0x71, 0xa4, 0xd9, 0x46, 0x19, 0x1d, 0x82, 0x8f, 0xc8, 0x2f, 0x59, - 0xfe, 0x1f, 0x1c, 0x76, 0x86, 0x38, 0x03, 0x02, 0x45, 0xb9, 0x71, 0xb2, - 0x2b, 0x70, 0x7c, 0x2b, 0x8e, 0x18, 0xa7, 0xf2, 0x76, 0x4b, 0x81, 0x95, - 0xd6, 0xfa, 0x17, 0xb4, 0x27, 0xb1, 0xee, 0xf0, 0x50, 0x59, 0x12, 0xb2, - 0x51, 0x29, 0xa9, 0xed, 0xf6, 0x22, 0x46, 0x3f, 0x77, 0xe4, 0xb3, 0x3c, - 0xb8, 0x78, 0x5d, 0x3e, 0x1a, 0x0e, 0x68, 0x8b, 0xd9, 0x61, 0x8f, 0x0c, - 0xe0, 0xd4, 0x2a, 0xf5, 0xb0, 0xa8, 0xd2, 0xe2, 0x03, 0x80, 0xea, 0x77, - 0xf6, 0x18, 0x53, 0xd6, 0xdf, 0x23, 0x9b, 0x70, 0xb8, 0x67, 0x4c, 0x0b, - 0xad, 0x40, 0xee, 0x6d, 0x38, 0xef, 0xf1, 0xee, 0x82, 0x9f, 0xb7, 0xf2, - 0x17, 0x2a, 0x3e, 0x0f, 0x57, 0x60, 0x5c, 0xea, 0xd9, 0xf4, 0x75, 0xc6, - 0x3c, 0xdf, 0x7b, 0xb4, 0xb3, 0x6c, 0xcf, 0x7d, 0x61, 0xfb, 0x41, 0x79, - 0xaa, 0x04, 0x0d, 0x37, 0xaa, 0xa5, 0x84, 0xde, 0x1b, 0x73, 0x50, 0x2c, - 0x9e, 0xdc, 0xf8, 0xda, 0x8c, 0xe4, 0xde, 0x2d, 0xf5, 0x26, 0x79, 0xa2, - 0x20, 0x8b, 0x32, 0x3f, 0x5f, 0x70, 0x78, 0xca, 0x4e, 0x26, 0x82, 0x9f, - 0xa2, 0x10, 0x57, 0x71, 0x1d, 0xe3, 0x5c, 0x94, 0xc2, 0x39, 0x43, 0xb3, - 0x35, 0x62, 0xf3, 0xd2, 0xbf, 0xbe, 0xcc, 0x9b, 0x51, 0xc9, 0xe9, 0x71, - 0x1d, 0xa6, 0xe1, 0xa0, 0x14, 0x46, 0x6a, 0x73, 0x46, 0xe6, 0x60, 0x3f, - 0xe1, 0x1a, 0xf1, 0x4d, 0x1e, 0xfa, 0xde, 0x85, 0x76, 0x8d, 0x02, 0xf4, - 0xf0, 0x8c, 0x24, 0x3d, 0x98, 0x4e, 0xc9, 0x43, 0x51, 0x5b, 0x42, 0x97, - 0x74, 0x21, 0x2b, 0x2f, 0xa3, 0xe5, 0x62, 0xf4, 0xd7, 0x4d, 0xfd, 0x17, - 0xf8, 0xe7, 0x3d, 0x13, 0xe7, 0x3a, 0x0c, 0xa4, 0x95, 0x16, 0x11, 0x57, - 0xf5, 0x30, 0x0d, 0x7f, 0x50, 0xc8, 0x0c, 0x31, 0xde, 0xb5, 0x36, 0xf1, - 0x78, 0x10, 0x6d, 0x11, 0x24, 0xf4, 0x04, 0xf9, 0x32, 0xc7, 0x28, 0x9a, - 0x4d, 0x44, 0xe6, 0xad, 0xba, 0x67, 0x3c, 0x5f, 0x1d, 0x36, 0x6b, 0x78, - 0x6c, 0xde, 0xd8, 0xe4, 0x91, 0xb4, 0x2b, 0xe2, 0x7e, 0x65, 0x04, 0xc1, - 0x7b, 0xce, 0xec, 0x19, 0x70, 0x3a, 0x24, 0x25, 0xd2, 0x73, 0x83, 0x2d, - 0x62, 0x60, 0xc5, 0x81, 0x4d, 0x41, 0x42, 0x98, 0xcc, 0x4d, 0x13, 0xa9, - 0xa8, 0xeb, 0xe2, 0x0a, 0x1b, 0x01, 0x10, 0xc7, 0xbb, 0x30, 0xb1, 0x5b, - 0x15, 0x40, 0x44, 0x28, 0x42, 0xf4, 0xd9, 0x5e, 0x6f, 0x1f, 0xd7, 0xec, - 0x1b, 0xdf, 0x92, 0x63, 0x0b, 0x07, 0x4c, 0x54, 0x79, 0x7e, 0x70, 0x3a, - 0x09, 0x48, 0x1f, 0x2d, 0x85, 0x06, 0xa1, 0x9a, 0xbf, 0x6e, 0x97, 0xca, - 0x1a, 0x86, 0x0f, 0x02, 0xaf, 0x35, 0xca, 0xfd, 0x07, 0xda, 0x68, 0x27, - 0x3a, 0x78, 0xab, 0x28, 0x12, 0x34, 0x02, 0xbf, 0x55, 0x5b, 0x1f, 0x5b, - 0x46, 0x62, 0x21, 0x3e, 0x76, 0x33, 0x30, 0x72, 0xa2, 0xaa, 0x8a, 0x09, - 0x80, 0x2f, 0xe8, 0xa0, 0x93, 0x1c, 0xf4, 0xa7, 0x51, 0xdc, 0x2b, 0x28, - 0xfe, 0x42, 0x72, 0x8e, 0x5e, 0x99, 0xd9, 0x05, 0x45, 0x82, 0x70, 0xd1, - 0xc0, 0x8e, 0x2b, 0xc1, 0x7c, 0x5f, 0xf2, 0x37, 0x91, 0xfe, 0xa2, 0x7e, - 0x29, 0x68, 0x0e, 0x82, 0x45, 0xbb, 0x23, 0xf8, 0x10, 0xf5, 0x54, 0xf6, - 0xe0, 0x80, 0x30, 0xcb, 0xf1, 0xf6, 0x09, 0x31, 0xc3, 0x3e, 0xc6, 0xc8, - 0x50, 0xfc, 0x09, 0x2e, 0x78, 0x8f, 0x7c, 0xda, 0xbb, 0xda, 0x9a, 0x10, - 0xf2, 0xe0, 0x22, 0x8b, 0x8e, 0xf7, 0xad, 0x0e, 0xe6, 0x64, 0x16, 0xca, - 0xc0, 0xe4, 0x62, 0x1c, 0x25, 0x5b, 0x68, 0x05, 0xff, 0x49, 0xfe, 0x14, - 0xdf, 0x8a, 0xd0, 0x3c, 0x36, 0x2c, 0xa9, 0x7e, 0x44, 0x02, 0xb7, 0x96, - 0x05, 0xc3, 0xdc, 0x31, 0x89, 0x14, 0xb2, 0xea, 0x17, 0x6e, 0xae, 0x7c, - 0x23, 0x7d, 0xd0, 0x45, 0x7c, 0x8a, 0xbe, 0x31, 0x92, 0x58, 0xe8, 0x98, - 0xb3, 0x2f, 0xd9, 0xa4, 0xaa, 0x69, 0xb4, 0x80, 0x56, 0xd0, 0xfa, 0xe0, - 0xf6, 0x7b, 0x86, 0x51, 0x31, 0xac, 0xc4, 0x8c, 0xdf, 0xf8, 0x02, 0xde, - 0xe9, 0x3a, 0xb0, 0xba, 0xf6, 0x76, 0x1a, 0x59, 0xf0, 0x9b, 0x16, 0x3b, - 0x37, 0x0f, 0xe2, 0x7d, 0x85, 0xdf, 0x33, 0xb7, 0xbd, 0x15, 0x3e, 0xc2, - 0x33, 0xdc, 0x73, 0x47, 0x1d, 0xab, 0xc6, 0xf5, 0x4d, 0xb1, 0xef, 0x76, - 0x74, 0xf4, 0xa3, 0x9e, 0xb0, 0x03, 0xa3, 0xc0, 0x8f, 0x3c, 0x9e, 0xdf, - 0xd4, 0x8b, 0x48, 0xc4, 0x5a, 0x5f, 0xf4, 0x37, 0x46, 0xaf, 0x2a, 0x2b, - 0xeb, 0xb8, 0x16, 0xae, 0x22, 0xcb, 0xb9, 0x99, 0xd6, 0xd8, 0x91, 0x86, - 0x56, 0x4f, 0x7a, 0x58, 0xb7, 0x1e, 0x84, 0xd1, 0x16, 0x63, 0x00, 0xa7, - 0xe9, 0xe5, 0xd5, 0x09, 0x57, 0xc2, 0xd7, 0xf6, 0xbb, 0x42, 0xa5, 0x6f, - 0x3f, 0xf2, 0x71, 0x69, 0x07, 0x8c, 0x31, 0xe4, 0x5c, 0x3a, 0xb5, 0xa9, - 0x7d, 0xd0, 0x65, 0x11, 0xce, 0x5b, 0x96, 0x89, 0x43, 0x77, 0x93, 0x57, - 0x33, 0xa6, 0x84, 0xdc, 0xe6, 0x5e, 0x5b, 0x6b, 0x28, 0x2c, 0x2f, 0x44, - 0x1c, 0xdd, 0x8b, 0x59, 0x3a, 0xc1, 0xcb, 0x10, 0x35, 0xab, 0xa6, 0x0b, - 0xc7, 0xec, 0x9a, 0xb8, 0xb9, 0xa8, 0x8a, 0xd0, 0xef, 0xea, 0x20, 0x5a, - 0x4c, 0xab, 0x50, 0x4f, 0x21, 0xef, 0x4b, 0x0b, 0x21, 0xe6, 0xd8, 0x20, - 0x95, 0xef, 0x7f, 0x57, 0xef, 0x7d, 0x29, 0x96, 0x49, 0x46, 0x0e, 0x07, - 0x66, 0x1b, 0xaa, 0x1c, 0x63, 0x1a, 0xbb, 0xa6, 0xa3, 0x1d, 0xbd, 0x18, - 0x10, 0x1b, 0x64, 0x5c, 0xd0, 0xa4, 0xea, 0x36, 0x29, 0x59, 0x01, 0x91, - 0x15, 0x46, 0x21, 0xfe, 0x9a, 0x41, 0xbf, 0xa8, 0x1a, 0xe3, 0x28, 0x98, - 0x1a, 0xc4, 0x38, 0xfb, 0x30, 0x32, 0x51, 0x8b, 0x73, 0x5f, 0xb8, 0x7c, - 0x1c, 0xa7, 0x6f, 0xf2, 0x4a, 0xf2, 0x18, 0x80, 0xc2, 0x7c, 0x1e, 0x16, - 0xad, 0x83, 0x00, 0x11, 0xba, 0x0e, 0x44, 0x67, 0x2b, 0x1a, 0x44, 0xd7, - 0x68, 0x6b, 0x1f, 0xbe, 0xe4, 0x65, 0x95, 0xc6, 0xd5, 0x6f, 0xde, 0x8a, - 0xb6, 0xb1, 0x5d, 0xfe, 0x8b, 0x4a, 0x5a, 0x20, 0x3f, 0xff, 0xc1, 0xa4, - 0xc6, 0x01, 0x6c, 0x8a, 0x77, 0x52, 0x15, 0x6d, 0xf8, 0x6f, 0xb0, 0xa3, - 0xb9, 0x12, 0x7e, 0x5d, 0xec, 0xc6, 0x7f, 0x86, 0x3d, 0xf5, 0xa2, 0x27, - 0xcc, 0x05, 0x7f, 0x7b, 0x67, 0x06, 0x59, 0xe1, 0x0d, 0x37, 0x78, 0x3c, - 0x15, 0x38, 0x86, 0x93, 0x2a, 0xd7, 0xcd, 0x19, 0xbd, 0x90, 0x8f, 0xb7, - 0xa5, 0xa6, 0xf6, 0xba, 0xe6, 0xd0, 0x99, 0x26, 0x19, 0x86, 0xdd, 0x64, - 0x92, 0x31, 0xc0, 0x3f, 0xbc, 0x82, 0x79, 0x6b, 0x52, 0x7e, 0xbb, 0x92, - 0x16, 0xa4, 0x49, 0x66, 0xf4, 0x8c, 0x9e, 0xae, 0x27, 0x6f, 0x77, 0x0c, - 0x63, 0x40, 0xc1, 0xd4, 0x8a, 0xba, 0xb3, 0xe5, 0x9c, 0x91, 0xb5, 0x9c, - 0x45, 0xeb, 0xf1, 0x6f, 0x6a, 0xbe, 0x41, 0xff, 0x8f, 0x71, 0x6f, 0xcf, - 0xd9, 0xab, 0x3c, 0xa0, 0x34, 0xca, 0x30, 0x29, 0x53, 0x2b, 0x5a, 0x97, - 0xc6, 0xfd, 0xf2, 0xb6, 0x8b, 0xca, 0xc0, 0xa6, 0x70, 0x9d, 0x4e, 0x3b, - 0x43, 0x77, 0x5b, 0xee, 0xab, 0x60, 0x06, 0xfc, 0x29, 0x3e, 0x54, 0x1e, - 0x88, 0xfb, 0x96, 0xe5, 0x7d, 0x4b, 0xd1, 0xc2, 0xe6, 0xd5, 0xdd, 0xc4, - 0xaf, 0x72, 0x42, 0x6b, 0x22, 0x4e, 0xc2, 0x9d, 0x06, 0x7a, 0x54, 0x97, - 0x12, 0xd2, 0x3f, 0x56, 0xd4, 0x72, 0x01, 0xda, 0xfd, 0xcc, 0xda, 0x3c, - 0x7d, 0x16, 0x13, 0x36, 0xfd, 0x77, 0x17, 0x99, 0xf6, 0xfa, 0x96, 0x71, - 0x92, 0x77, 0xff, 0x18, 0x01, 0x22, 0x8d, 0xd7, 0x60, 0x97, 0x89, 0xf0, - 0x44, 0xfd, 0x66, 0x46, 0x30, 0x9f, 0x79, 0x76, 0xa9, 0x8c, 0x31, 0x74, - 0xcc, 0x37, 0xda, 0xdb, 0x74, 0x51, 0x81, 0x08, 0x32, 0xce, 0xad, 0xeb, - 0xf0, 0xe9, 0x18, 0x8b, 0xac, 0xf9, 0x4a, 0x08, 0x32, 0xc5, 0xa7, 0x3a, - 0xf2, 0xfa, 0x07, 0x42, 0xaa, 0xc2, 0x57, 0x82, 0xbf, 0x7e, 0x60, 0x82, - 0x7a, 0x78, 0x62, 0x33, 0xfe, 0x6b, 0xa6, 0xaf, 0x22, 0xaa, 0x56, 0x79, - 0xc9, 0x2c, 0x32, 0xd8, 0x08, 0x93, 0xd4, 0x78, 0xbe, 0x35, 0x0b, 0xa9, - 0x2e, 0x9b, 0xc4, 0x11, 0x35, 0xbd, 0x9f, 0x2f, 0x32, 0xda, 0x5b, 0xaa, - 0x94, 0x42, 0xf7, 0x54, 0xf1, 0xd4, 0x2b, 0x2d, 0x45, 0xc3, 0xcd, 0xdc, - 0xae, 0xdb, 0xec, 0x34, 0xc5, 0x12, 0xbd, 0x2f, 0xfa, 0x38, 0xd7, 0x61, - 0x12, 0x45, 0x84, 0x38, 0x61, 0xe0, 0x73, 0x87, 0xc4, 0xa1, 0xc6, 0x0e, - 0x2b, 0x6e, 0x3e, 0x07, 0x46, 0x07, 0x35, 0xc8, 0xf1, 0xf0, 0x3c, 0xf8, - 0xf3, 0xc9, 0x18, 0xfe, 0xd3, 0x14, 0xaa, 0xcd, 0x7e, 0x3a, 0x06, 0xb1, - 0xb1, 0x2c, 0x72, 0x8d, 0x84, 0x9c, 0x24, 0x38, 0x61, 0x76, 0x08, 0x85, - 0x8d, 0x45, 0x6a, 0x3b, 0x3f, 0x18, 0xda, 0xc7, 0xf5, 0xc7, 0x95, 0x9b, - 0xa9, 0xc3, 0xa8, 0x8d, 0x48, 0x51, 0x42, 0x4a, 0x83, 0x43, 0x4f, 0x03, - 0x5e, 0x30, 0x60, 0xb7, 0xe3, 0x9d, 0x25, 0xf2, 0x28, 0x0e, 0xa7, 0x74, - 0xd0, 0x9c, 0x48, 0x04, 0xa4, 0x01, 0xad, 0x87, 0x1d, 0xd3, 0xb7, 0x02, - 0xa6, 0xaa, 0x9f, 0x2e, 0x84, 0xf2, 0xdc, 0x38, 0xc1, 0x59, 0xce, 0x1c, - 0x58, 0x9d, 0x9d, 0xa7, 0x1d, 0x0f, 0xd5, 0x3d, 0x1f, 0x70, 0x9e, 0x1b, - 0x06, 0x79, 0x61, 0x67, 0x87, 0xe7, 0xd8, 0x59, 0x1c, 0xe3, 0x61, 0xc6, - 0x1a, 0xe0, 0xb1, 0x40, 0x16, 0x4e, 0x33, 0xf0, 0xb7, 0x4a, 0x91, 0xdc, - 0xac, 0x33, 0x15, 0x5e, 0x59, 0x19, 0x44, 0xdf, 0xb2, 0x8f, 0x72, 0xa4, - 0x43, 0x36, 0x3f, 0x6c, 0x0d, 0x4c, 0x6d, 0xa4, 0xe9, 0x5e, 0x3e, 0xe1, - 0x3a, 0x01, 0xb9, 0xdc, 0x48, 0x00, 0x1c, 0xfc, 0x10, 0x60, 0x4f, 0x4a, - 0xc6, 0x6b, 0xa5, 0x1b, 0x9b, 0xd5, 0x24, 0x68, 0x73, 0xd3, 0x24, 0x26, - 0x43, 0x24, 0xd1, 0x33, 0x02, 0x25, 0xed, 0x68, 0xc5, 0x7b, 0xdc, 0xbe, - 0xc5, 0xfa, 0xfb, 0x13, 0x84, 0x2c, 0x72, 0x8e, 0x68, 0xf3, 0x7b, 0x75, - 0xd0, 0xfc, 0xaa, 0xce, 0x49, 0x1c, 0x3a, 0x20, 0x43, 0x41, 0x9c, 0xf9, - 0x45, 0x77, 0x3d, 0xe5, 0x29, 0x4c, 0x50, 0x75, 0x0b, 0xa6, 0x50, 0x53, - 0xe9, 0x72, 0x1a, 0xf1, 0x17, 0x43, 0x38, 0x98, 0x94, 0x7c, 0xf7, 0x59, - 0x78, 0xbc, 0x8c, 0xee, 0xbb, 0x50, 0xb8, 0xf6, 0x55, 0x41, 0x75, 0x9f, - 0x39, 0x8c, 0x25, 0xff, 0x6c, 0xdb, 0xdc, 0xe7, 0xf2, 0xf7, 0x6c, 0xe5, - 0x9d, 0x6f, 0x55, 0x5f, 0x59, 0xcf, 0x54, 0x0d, 0xb2, 0xb4, 0x64, 0x51, - 0xf4, 0x65, 0xf6, 0x32, 0x70, 0x8a, 0x35, 0xf8, 0x00, 0x24, 0x3f, 0xcb, - 0x1b, 0xbe, 0x05, 0x01, 0x1a, 0xcc, 0xfc, 0xc7, 0x10, 0xf0, 0x91, 0x73, - 0x61, 0x7b, 0x0b, 0xaf, 0x97, 0x0c, 0x68, 0x75, 0x4d, 0x2c, 0xab, 0x8f, - 0x29, 0xf7, 0x6f, 0xf0, 0x0f, 0x95, 0xf8, 0xe0, 0xd4, 0x0e, 0x3d, 0x5b, - 0xee, 0x6a, 0xa2, 0x55, 0xae, 0x89, 0x06, 0x30, 0xff, 0xfa, 0x17, 0x80, - 0x93, 0xf9, 0x86, 0x6f, 0x11, 0x82, 0xd0, 0xcd, 0xb7, 0x47, 0xa6, 0x3b, - 0xfa, 0xd6, 0xec, 0x9b, 0x63, 0x33, 0x17, 0xfa, 0x1f, 0xc9, 0x43, 0x12, - 0x54, 0x8b, 0xd6, 0x3c, 0x20, 0xfa, 0x51, 0x30, 0x89, 0x5f, 0xa4, 0x47, - 0x8f, 0xba, 0x73, 0xd2, 0xa8, 0xde, 0x89, 0x14, 0xe4, 0x00, 0x5e, 0xde, - 0xf0, 0x35, 0xc8, 0x89, 0xe9, 0x62, 0x26, 0x9a, 0xf4, 0x0d, 0xed, 0x9b, - 0xc0, 0xd4, 0xa8, 0x66, 0x40, 0xab, 0x14, 0xe0, 0x67, 0x30, 0xcd, 0x64, - 0x5c, 0xdb, 0x71, 0xef, 0xe9, 0xcd, 0x41, 0x94, 0x8c, 0xcc, 0x41, 0x6b, - 0x87, 0x22, 0x7b, 0x2e, 0xcb, 0x35, 0xcf, 0x36, 0xf3, 0x06, 0xe8, 0x44, - 0x2d, 0xe1, 0x3b, 0x26, 0xbd, 0xc9, 0x3e, 0xf6, 0xf6, 0xed, 0xeb, 0x3e, - 0x03, 0x29, 0x7f, 0xb1, 0x77, 0xec, 0x69, 0xc6, 0xcc, 0x3c, 0x1c, 0xe2, - 0xaa, 0xeb, 0x0b, 0x94, 0xd8, 0xfd, 0x23, 0xe4, 0x9e, 0x1e, 0xac, 0x7d, - 0x5a, 0xf5, 0xdf, 0x76, 0x67, 0xb3, 0x9c, 0xdb, 0x65, 0x6c, 0xa3, 0x6d, - 0x65, 0xa7, 0xdc, 0xed, 0x2d, 0xec, 0xd0, 0xe5, 0x4c, 0xf4, 0x7f, 0xc2, - 0x4f, 0xee, 0x17, 0xae, 0x45, 0x5e, 0xfd, 0x5b, 0x54, 0xef, 0x21, 0xf8, - 0x2c, 0xbe, 0x22, 0x2f, 0x23, 0x44, 0xf6, 0x0e, 0x44, 0xc8, 0x46, 0x0b, - 0x4e, 0x69, 0x32, 0x96, 0x7f, 0x02, 0xf0, 0xcb, 0xb8, 0x13, 0xde, 0x78, - 0xd8, 0x77, 0xdc, 0x73, 0xe5, 0x77, 0xce, 0x5d, 0x0f, 0x0c, 0x2f, 0xfa, - 0x2b, 0x86, 0x6d, 0x83, 0xc8, 0x7e, 0x47, 0x31, 0xcd, 0x2e, 0x73, 0x4f, - 0x8f, 0x3b, 0x2c, 0x92, 0x4e, 0xa0, 0xac, 0x2a, 0x45, 0xe3, 0x51, 0x6e, - 0xa0, 0xbd, 0xf6, 0x59, 0xa5, 0xbc, 0xc2, 0xcc, 0x08, 0x4d, 0xa4, 0x45, - 0x67, 0x99, 0x68, 0xa7, 0x7c, 0xb4, 0x55, 0xbf, 0x4f, 0x73, 0xd4, 0xc8, - 0xe2, 0x5c, 0x7a, 0xd6, 0xe1, 0x67, 0xbf, 0xdd, 0xa3, 0xa4, 0x79, 0xb0, - 0xbe, 0x3d, 0x0e, 0xd0, 0xda, 0x34, 0x3e, 0xc6, 0x8f, 0x21, 0x45, 0x2a, - 0xb7, 0x62, 0xeb, 0xd6, 0x93, 0x6a, 0x58, 0xaf, 0xed, 0x39, 0x21, 0x0c, - 0x26, 0x4a, 0x67, 0x3a, 0x1b, 0x2e, 0x9a, 0x09, 0xc5, 0x88, 0x61, 0xd1, - 0x88, 0x11, 0x41, 0x1d, 0x37, 0xe6, 0xa3, 0x87, 0x56, 0x05, 0x42, 0xf7, - 0x40, 0x38, 0xd3, 0xee, 0x78, 0x27, 0x96, 0xb7, 0x9b, 0x2b, 0xaf, 0xfa, - 0x22, 0x8d, 0x84, 0xe1, 0xad, 0xd9, 0xc9, 0x04, 0xf5, 0x2f, 0xbd, 0x50, - 0x20, 0xbc, 0x66, 0xaa, 0xb9, 0xf9, 0x3e, 0x7c, 0x6c, 0x87, 0xb2, 0xd1, - 0x51, 0xdc, 0xf8, 0xa9, 0x8d, 0x3a, 0x7e, 0x10, 0xe7, 0x7d, 0xe0, 0x23, - 0x3f, 0xd1, 0x0a, 0x0c, 0x8a, 0x84, 0xa7, 0x9a, 0x9c, 0xde, 0xe0, 0x02, - 0x46, 0xd1, 0xf5, 0x07, 0x4b, 0x48, 0x68, 0x98, 0x28, 0x82, 0x2b, 0x7c, - 0x7c, 0x00, 0x94, 0x1c, 0x3b, 0xfd, 0x07, 0x69, 0xb2, 0x37, 0xc9, 0xbc, - 0xb9, 0xaf, 0xeb, 0xf7, 0x0d, 0x5e, 0x83, 0x78, 0x88, 0x92, 0x40, 0xf5, - 0x7d, 0xa8, 0x3f, 0x15, 0xb3, 0xb8, 0xb6, 0xd8, 0x0a, 0xcc, 0x9b, 0xd7, - 0x89, 0x4f, 0xc4, 0x11, 0x04, 0xfa, 0x15, 0xf1, 0x04, 0xd4, 0x21, 0x2d, - 0xb5, 0xf1, 0x3b, 0xf3, 0x1f, 0xb7, 0xf2, 0x0e, 0x79, 0x96, 0xd6, 0xc8, - 0x98, 0xbc, 0x12, 0x89, 0x69, 0x8e, 0x54, 0x66, 0x20, 0x37, 0x57, 0xe9, - 0x5f, 0xb1, 0xda, 0x6f, 0xb7, 0x43, 0xe7, 0xdc, 0x01, 0x74, 0x42, 0xfd, - 0xaa, 0xe8, 0x21, 0x28, 0x39, 0x73, 0x78, 0x97, 0x04, 0x13, 0x76, 0x1b, - 0x6f, 0x98, 0xdc, 0xcb, 0x8e, 0xcd, 0x69, 0x83, 0xd5, 0xfb, 0x1f, 0x28, - 0xea, 0x98, 0xd1, 0x06, 0x82, 0xf9, 0xbe, 0xd6, 0x42, 0xee, 0x43, 0x6e, - 0x9d, 0x6e, 0x96, 0xb9, 0xf3, 0x33, 0xa1, 0xc4, 0x76, 0xf0, 0xc5, 0x90, - 0xfc, 0x33, 0x24, 0x5d, 0x32, 0x42, 0x42, 0x38, 0x63, 0x16, 0xae, 0xc6, - 0xd1, 0xa7, 0xa4, 0x96, 0xc4, 0x8c, 0x6f, 0x8b, 0xf6, 0x28, 0x65, 0x12, - 0x8e, 0xaa, 0x50, 0xd4, 0x43, 0x9e, 0x2f, 0x35, 0x48, 0xe6, 0x55, 0xaf, - 0x00, 0x2a, 0x25, 0x6f, 0x3f, 0x11, 0x55, 0xc4, 0x6f, 0x27, 0x46, 0xf2, - 0xb8, 0x51, 0x49, 0x1a, 0x3d, 0x39, 0x20, 0xa2, 0x23, 0x83, 0x50, 0x5b, - 0x65, 0x4b, 0x02, 0xc9, 0x4e, 0xfd, 0xc6, 0x00, 0xed, 0x27, 0x3e, 0x24, - 0xb6, 0x25, 0x7b, 0x66, 0xfa, 0x26, 0x5a, 0x2a, 0x3c, 0xf3, 0xe5, 0x76, - 0x1f, 0xa0, 0x95, 0x87, 0xd8, 0x8c, 0x1c, 0xc4, 0x8d, 0x68, 0x56, 0x9c, - 0x48, 0xc9, 0xc5, 0x9f, 0xdf, 0x6d, 0xe2, 0x51, 0xd5, 0x55, 0xe1, 0x62, - 0x33, 0x99, 0x66, 0xb7, 0xbf, 0x12, 0xcc, 0x6e, 0x35, 0x1a, 0x26, 0xb4, - 0x68, 0xfe, 0xb5, 0x62, 0xbd, 0xbe, 0x07, 0x24, 0x2c, 0xfb, 0x84, 0x99, - 0x97, 0xd9, 0xb6, 0xdb, 0x51, 0xf1, 0x7d, 0x06, 0x14, 0x5c, 0x74, 0x22, - 0x0e, 0x4a, 0x2a, 0xa8, 0x95, 0x7c, 0x2e, 0x5c, 0x90, 0xa6, 0x32, 0x1d, - 0xbf, 0x28, 0x33, 0xae, 0x1e, 0xd2, 0xa8, 0x52, 0xc9, 0xb3, 0x49, 0x6e, - 0xd0, 0x40, 0x7f, 0x37, 0xd7, 0xe1, 0xe7, 0x4f, 0x67, 0xb0, 0x55, 0x47, - 0x9b, 0xf3, 0xd9, 0x0d, 0x0f, 0x48, 0xa0, 0x6b, 0xd3, 0x05, 0xee, 0xf6, - 0xd7, 0x41, 0x86, 0x4f, 0x5f, 0x74, 0x9d, 0xb0, 0x61, 0x6b, 0x3f, 0x64, - 0x61, 0x5b, 0x1d, 0xdd, 0xea, 0xcb, 0xe3, 0x41, 0xca, 0xca, 0xd5, 0x95, - 0x00, 0x67, 0xfb, 0x12, 0x1a, 0xad, 0x3f, 0x04, 0x6d, 0x3e, 0xcd, 0xbe, - 0x2d, 0xe8, 0x9f, 0x4f, 0x7b, 0x20, 0x80, 0xa0, 0x7c, 0x7a, 0xc6, 0xda, - 0xa3, 0x10, 0xea, 0x6c, 0xb3, 0x71, 0xc4, 0x0f, 0x5e, 0xf5, 0xf0, 0xd9, - 0x62, 0xd1, 0x40, 0x96, 0x0f, 0x57, 0x36, 0xf7, 0xa0, 0xde, 0x26, 0xe0, - 0xe8, 0xc8, 0x3f, 0x35, 0x96, 0x41, 0x3a, 0xe5, 0x8a, 0x34, 0x46, 0xe5, - 0x94, 0xda, 0xb9, 0xba, 0xfa, 0x44, 0xd4, 0xec, 0x75, 0xa9, 0x15, 0xd2, - 0x5a, 0xf6, 0x6c, 0x62, 0x85, 0x47, 0xaa, 0xe3, 0x32, 0x34, 0x25, 0x92, - 0x6b, 0xe5, 0xe5, 0x15, 0x63, 0xcc, 0x68, 0xf8, 0xc6, 0x69, 0x5d, 0x67, - 0xd7, 0x2b, 0x82, 0x7a, 0xe2, 0x30, 0xc7, 0x0d, 0xcd, 0x65, 0x39, 0x48, - 0xf6, 0x91, 0xe1, 0x39, 0xcc, 0xff, 0x82, 0x38, 0xf2, 0xe3, 0x8b, 0x1b, - 0xef, 0xc6, 0xe8, 0xd0, 0xdd, 0xe4, 0xe4, 0x8b, 0xdf, 0x2b, 0x6f, 0x90, - 0xa5, 0xc3, 0xee, 0x86, 0x76, 0x7e, 0xbf, 0x3d, 0x0e, 0x09, 0xd4, 0x23, - 0xe8, 0xe4, 0x3a, 0xfe, 0xf2, 0xb2, 0x58, 0x92, 0x6d, 0x8c, 0x00, 0xb4, - 0xbd, 0xfd, 0x7e, 0x56, 0x3e, 0x30, 0xfb, 0xc8, 0xf0, 0xe6, 0xb1, 0xf3, - 0x82, 0x7f, 0x8c, 0x55, 0x4e, 0xd8, 0x7b, 0x40, 0x00, 0x0a, 0x52, 0xf1, - 0x8e, 0xa5, 0x3f, 0xef, 0xc7, 0x06, 0x51, 0x3f, 0x8a, 0xe4, 0xbc, 0xb3, - 0xe5, 0xec, 0x9e, 0x97, 0xbc, 0x8e, 0x4d, 0x93, 0xec, 0xe6, 0x5f, 0x7b, - 0x85, 0xb3, 0xc3, 0x0c, 0x92, 0x5b, 0xc3, 0x71, 0xf4, 0x78, 0x18, 0xc2, - 0x49, 0x12, 0x26, 0x46, 0x0d, 0x36, 0x2d, 0x97, 0xbd, 0xac, 0x41, 0x8a, - 0xd8, 0x37, 0x7e, 0x30, 0x03, 0x3f, 0x8c, 0xe0, 0x57, 0x54, 0xc7, 0x59, - 0x09, 0x2f, 0x93, 0x20, 0x1f, 0xbf, 0xde, 0x87, 0xd5, 0xae, 0x7e, 0x9f, - 0x9a, 0xd5, 0x0c, 0x75, 0x0c, 0x9e, 0x5f, 0x16, 0x91, 0x75, 0x88, 0x94, - 0xe4, 0xaa, 0x38, 0xa5, 0xcb, 0x6c, 0x52, 0xa9, 0xd2, 0x97, 0x73, 0x5f, - 0xf4, 0xd8, 0xa7, 0xe9, 0xff, 0xec, 0xb3, 0x2f, 0x39, 0xf5, 0xf5, 0x0c, - 0x12, 0x90, 0x34, 0xd7, 0xe0, 0xa1, 0x97, 0xeb, 0xaa, 0x71, 0x51, 0x5c, - 0x3c, 0x12, 0xc1, 0x31, 0x6f, 0x95, 0x43, 0x4a, 0xc7, 0xb6, 0xba, 0xf4, - 0xc4, 0xe6, 0x1b, 0x57, 0x4f, 0x2a, 0x9d, 0x96, 0x4d, 0xa2, 0x0e, 0xc1, - 0xe4, 0xca, 0x03, 0x3a, 0x13, 0xc9, 0xac, 0xe2, 0xa7, 0xad, 0xfa, 0xd2, - 0x0e, 0x11, 0x1e, 0xb2, 0x74, 0x61, 0xca, 0x66, 0x01, 0x40, 0xe1, 0x32, - 0x77, 0x62, 0x93, 0xd6, 0x0e, 0x45, 0x68, 0x50, 0xb4, 0xb3, 0x55, 0x62, - 0xfb, 0x1c, 0x92, 0x4b, 0xe9, 0x29, 0x39, 0xc5, 0x79, 0xc8, 0x11, 0xcd, - 0x00, 0xf0, 0x68, 0x2c, 0x72, 0x76, 0x5e, 0xc9, 0xc4, 0xf7, 0x56, 0xce, - 0xe6, 0x8f, 0xc6, 0x66, 0xf0, 0x60, 0xca, 0x8e, 0x69, 0x7f, 0xd8, 0x37, - 0x97, 0x56, 0x3d, 0xc5, 0xae, 0x92, 0x25, 0xf7, 0x59, 0xcf, 0x1e, 0xd9, - 0x04, 0x1a, 0xd2, 0xf9, 0x8b, 0xce, 0xf7, 0x54, 0xa6, 0x71, 0x82, 0x8c, - 0xa3, 0xf1, 0xaa, 0x5c, 0x44, 0xb5, 0x7d, 0x7e, 0xe9, 0x20, 0x43, 0x30, - 0x74, 0x19, 0x7c, 0x30, 0x62, 0x87, 0xde, 0x4f, 0xb3, 0x19, 0x0d, 0x10, - 0xae, 0x6d, 0xa5, 0x79, 0xb4, 0xc6, 0xb2, 0x04, 0xb5, 0x20, 0x87, 0xb9, - 0x71, 0x4b, 0x55, 0x97, 0x1a, 0xea, 0x4b, 0xda, 0x08, 0xa3, 0x40, 0x02, - 0x1a, 0xce, 0x57, 0xa2, 0xc4, 0x47, 0x03, 0x39, 0x9c, 0xa6, 0x1e, 0x4b, - 0xd8, 0xe2, 0xbe, 0xb9, 0x65, 0x1a, 0x82, 0xbb, 0x28, 0x35, 0xa2, 0xa9, - 0x00, 0x72, 0x09, 0xe1, 0xc4, 0xa3, 0x51, 0xd0, 0xf5, 0xf0, 0xba, 0x5e, - 0x58, 0x3e, 0x78, 0xc2, 0x8e, 0xc9, 0x67, 0xd9, 0xf3, 0xf8, 0x85, 0x71, - 0xbd, 0x1c, 0xc2, 0xa5, 0xc4, 0x24, 0x4a, 0x86, 0x2b, 0x51, 0xa7, 0xf6, - 0x2a, 0xd3, 0x23, 0x29, 0x6b, 0x33, 0x29, 0x96, 0x89, 0x33, 0x45, 0x45, - 0x7b, 0x36, 0x9a, 0x9b, 0xef, 0x7d, 0x51, 0x83, 0x7b, 0x05, 0x86, 0x31, - 0x3c, 0x7a, 0x4e, 0x34, 0x50, 0x1f, 0xfd, 0xc4, 0xff, 0xba, 0x29, 0xfb, - 0x0e, 0x48, 0x93, 0x1b, 0x2e, 0x43, 0x83, 0xc6, 0x5a, 0x3d, 0x53, 0x01, - 0x11, 0x6e, 0x5f, 0xcd, 0xab, 0x39, 0x9f, 0x62, 0xa8, 0x80, 0x52, 0xc3, - 0x29, 0xd8, 0x4a, 0xe8, 0x10, 0x83, 0x6c, 0xcf, 0x7e, 0x5e, 0xda, 0x91, - 0x22, 0x37, 0x98, 0xca, 0xfd, 0x50, 0x47, 0x63, 0xda, 0x5e, 0xf4, 0x2f, - 0x22, 0x37, 0x4e, 0xac, 0xc2, 0xab, 0x3e, 0x96, 0x98, 0xbe, 0x3b, 0x57, - 0x5f, 0xd7, 0x01, 0xce, 0x10, 0xb3, 0xd4, 0x19, 0x51, 0x7f, 0x0d, 0x8c, - 0xa2, 0xf3, 0x0c, 0x62, 0xbd, 0xab, 0x75, 0x65, 0x3e, 0xe6, 0xc5, 0xbc, - 0xd9, 0x8c, 0xf6, 0x64, 0x51, 0xeb, 0x11, 0xd1, 0xb8, 0xbc, 0xe5, 0xd6, - 0x82, 0x29, 0x59, 0x42, 0xfd, 0xe4, 0x41, 0xe0, 0x00, 0x55, 0xb6, 0xb0, - 0x11, 0x7e, 0x61, 0x75, 0x09, 0xd6, 0x51, 0x86, 0xfe, 0xfc, 0x98, 0x0b, - 0x3c, 0x8f, 0x34, 0x71, 0xc0, 0xf3, 0x40, 0x41, 0xff, 0x43, 0x9d, 0x92, - 0x4f, 0xa9, 0x1d, 0x69, 0x31, 0x67, 0xac, 0x65, 0xc2, 0x97, 0xcf, 0x5d, - 0x19, 0x20, 0xf1, 0x18, 0x65, 0xc1, 0x5d, 0xc6, 0xe7, 0x0a, 0xbd, 0xbe, - 0x7f, 0xd4, 0x03, 0x0c, 0x23, 0x0f, 0xb5, 0x51, 0x60, 0xd3, 0x5a, 0x0f, - 0x58, 0x6d, 0xd6, 0x26, 0x31, 0x0d, 0xfd, 0x1e, 0x64, 0xc7, 0x1e, 0xc3, - 0xf9, 0x46, 0xfb, 0xaf, 0x2e, 0xf2, 0xa6, 0x99, 0x71, 0xe4, 0xc5, 0x81, - 0x64, 0x00, 0xde, 0xf9, 0xb0, 0xc8, 0xd3, 0xb7, 0x90, 0xa4, 0x60, 0x77, - 0x6c, 0x9d, 0x06, 0x93, 0x17, 0x4a, 0x42, 0x21, 0x5d, 0xa3, 0xd4, 0xa0, - 0x10, 0x50, 0x7e, 0x2d, 0x81, 0xf9, 0x57, 0x87, 0x22, 0x14, 0xaf, 0x1d, - 0x11, 0x88, 0x1d, 0x08, 0xf3, 0xd6, 0x8a, 0x0b, 0xdf, 0xe2, 0xc6, 0x80, - 0xbd, 0xf2, 0x76, 0x7b, 0xee, 0xb3, 0x7e, 0x1a, 0xe1, 0x4d, 0x21, 0xe4, - 0xf5, 0x99, 0x73, 0x6d, 0x26, 0x53, 0x1c, 0x33, 0x0b, 0xc2, 0xa4, 0xb3, - 0x10, 0x6c, 0xfb, 0x20, 0xc9, 0xd7, 0x35, 0x61, 0x9c, 0x93, 0xff, 0x15, - 0xc9, 0x15, 0x80, 0x10, 0x26, 0x06, 0x35, 0xa0, 0x57, 0xd5, 0x00, 0x91, - 0x90, 0x21, 0x03, 0x58, 0x2c, 0x09, 0x0c, 0x45, 0xc8, 0x0e, 0x50, 0x89, - 0x89, 0xbd, 0xa6, 0x6c, 0xb4, 0x73, 0x6c, 0x0a, 0x1c, 0x2b, 0x33, 0x36, - 0x42, 0x71, 0xc8, 0xf0, 0xac, 0xc0, 0xcc, 0x28, 0x81, 0xcf, 0x45, 0x62, - 0xf3, 0x2e, 0x69, 0x21, 0x34, 0x19, 0x8d, 0x1d, 0xdb, 0x9d, 0xde, 0xb1, - 0xfb, 0x87, 0xe8, 0xc2, 0x49, 0x8b, 0x78, 0x0a, 0xb0, 0xe5, 0x8c, 0xf3, - 0xbc, 0x8f, 0x2a, 0x0a, 0x9c, 0xb7, 0xe1, 0x65, 0xa0, 0xf0, 0x0e, 0xc9, - 0x96, 0x28, 0x25, 0xf4, 0x07, 0xb8, 0x0a, 0xa8, 0x4c, 0x35, 0x89, 0x09, - 0x67, 0x2a, 0xc9, 0xac, 0xa4, 0x48, 0x99, 0x57, 0x2a, 0xe6, 0xaf, 0xbc, - 0x60, 0x3e, 0x5a, 0xa0, 0x3f, 0xa4, 0xf6, 0xa0, 0x44, 0xfd, 0x16, 0xbf, - 0xfe, 0xbb, 0xfb, 0x8b, 0xe8, 0x60, 0x3c, 0x78, 0x74, 0x29, 0x8d, 0x89, - 0x8f, 0xe3, 0xa7, 0xbf, 0x28, 0xfb, 0x1a, 0xe9, 0x4e, 0x6d, 0x25, 0x31, - 0x7c, 0xf4, 0x8a, 0x77, 0x46, 0x13, 0x00, 0x4d, 0x37, 0xc0, 0xee, 0xdb, - 0xce, 0xb8, 0xbd, 0x5b, 0x31, 0x93, 0xf9, 0xc2, 0x0f, 0x68, 0x43, 0x9c, - 0xc5, 0xe0, 0xb8, 0x0a, 0xf1, 0xa9, 0x79, 0x23, 0xa4, 0x93, 0x6b, 0x6c, - 0x42, 0xe7, 0x00, 0x87, 0x5c, 0x91, 0x81, 0xd1, 0x2d, 0xc8, 0x35, 0x17, - 0xeb, 0xf0, 0x44, 0x5c, 0x02, 0x59, 0x96, 0x70, 0x99, 0x3e, 0x2c, 0x2f, - 0x74, 0x6b, 0xd4, 0x6c, 0x7d, 0xf6, 0x04, 0x52, 0xe9, 0x45, 0x00, 0xc6, - 0x9a, 0x5b, 0x61, 0xf8, 0x37, 0xd0, 0x60, 0x07, 0xd7, 0xca, 0x78, 0x4a, - 0xc9, 0x8c, 0x6e, 0x66, 0x66, 0xa9, 0x72, 0xfa, 0x2a, 0x7d, 0xbb, 0xa0, - 0x86, 0xbd, 0xfe, 0x79, 0x96, 0xe7, 0x8e, 0x61, 0xec, 0xd4, 0x29, 0xa7, - 0x5d, 0xdd, 0x9d, 0xc1, 0xe7, 0x1a, 0x88, 0x4d, 0x81, 0xef, 0x55, 0x9d, - 0xbb, 0xd1, 0x2f, 0xf9, 0x07, 0xb5, 0x87, 0x5a, 0x9b, 0x72, 0xa5, 0x9a, - 0x8f, 0xbf, 0x9f, 0x4f, 0x22, 0x41, 0xf4, 0x6d, 0x64, 0x1c, 0xdc, 0xb7, - 0x09, 0xb0, 0xaa, 0xf3, 0xae, 0xf2, 0x88, 0x76, 0x6f, 0x87, 0x3f, 0xf1, - 0x44, 0x21, 0x03, 0x89, 0x65, 0x55, 0xe6, 0x0a, 0x73, 0x66, 0x3a, 0xa3, - 0x33, 0x3e, 0xe8, 0x65, 0xc5, 0x16, 0x28, 0xc6, 0xb5, 0x96, 0x00, 0x28, - 0x42, 0x7a, 0x4e, 0x8f, 0x10, 0x4d, 0x1b, 0x54, 0x15, 0x68, 0x6e, 0xe2, - 0x54, 0x79, 0xa7, 0x32, 0xc2, 0x27, 0x23, 0xde, 0xc8, 0x62, 0xb5, 0x64, - 0x2a, 0xbc, 0xd4, 0x6d, 0xb2, 0x54, 0x2f, 0x39, 0x72, 0xeb, 0x77, 0x74, - 0x2c, 0xb1, 0x70, 0xb1, 0xba, 0x46, 0x52, 0x54, 0x82, 0x9b, 0x30, 0x24, - 0x95, 0xbd, 0xc2, 0xd2, 0xa1, 0x1f, 0xd8, 0x7f, 0x22, 0x3c, 0x76, 0xa0, - 0xc3, 0xa4, 0x7b, 0xc9, 0x73, 0x58, 0x0e, 0x70, 0x99, 0xc4, 0x58, 0xf6, - 0xb2, 0x12, 0x22, 0xa2, 0xa4, 0x7b, 0xe1, 0x59, 0x80, 0x59, 0x41, 0xbc, - 0x91, 0xee, 0x89, 0x70, 0x58, 0x41, 0x90, 0xb0, 0xa2, 0xeb, 0x58, 0xc4, - 0xb2, 0x63, 0x9b, 0x7a, 0x84, 0x91, 0xb5, 0x0d, 0xc9, 0xaf, 0x7b, 0xf3, - 0x83, 0xc7, 0xb0, 0x1e, 0x14, 0x70, 0x76, 0x8a, 0xb6, 0x8b, 0xfe, 0xa8, - 0x6f, 0xbb, 0xf5, 0x85, 0x13, 0xa5, 0x1f, 0xa5, 0x08, 0x8e, 0x36, 0xa9, - 0x68, 0x49, 0x2f, 0xe1, 0x77, 0xf7, 0x92, 0x83, 0xb0, 0x27, 0x7c, 0x0d, - 0x5f, 0x81, 0x6d, 0xd7, 0x14, 0xab, 0x9e, 0xcd, 0x5b, 0x22, 0xf0, 0xac, - 0x19, 0x11, 0xef, 0x0b, 0xd2, 0x17, 0x4c, 0xda, 0xe4, 0xf1, 0x4f, 0x89, - 0xc9, 0x5e, 0x25, 0xfb, 0x51, 0x97, 0x52, 0x87, 0xd6, 0x74, 0xf9, 0x6c, - 0xb3, 0x13, 0xcb, 0x9d, 0xb1, 0x3c, 0x85, 0x5b, 0x43, 0xe2, 0x86, 0xdf, - 0xe0, 0x47, 0x8b, 0x22, 0x3e, 0xf8, 0xb8, 0x02, 0x7e, 0x1d, 0x69, 0xc0, - 0xc8, 0xbf, 0xce, 0x8e, 0x00, 0xa9, 0x59, 0x5b, 0xea, 0x4a, 0x3d, 0x42, - 0x6f, 0x2d, 0x83, 0xbc, 0x4a, 0x84, 0x70, 0xe1, 0x0c, 0xe2, 0x86, 0x02, - 0xd5, 0x01, 0xad, 0xbb, 0xe0, 0xca, 0x34, 0xfa, 0x3d, 0x94, 0xcc, 0xdc, - 0xd0, 0x84, 0xf0, 0x3c, 0xb9, 0x5b, 0xe2, 0xec, 0x32, 0x1d, 0x45, 0x71, - 0x84, 0xed, 0xa3, 0x99, 0x94, 0x04, 0xfe, 0xe6, 0x8e, 0x72, 0x72, 0xf2, - 0x21, 0x77, 0x70, 0x48, 0xaa, 0x60, 0x2a, 0x0b, 0x46, 0x8e, 0xac, 0x47, - 0xe7, 0x89, 0xba, 0x19, 0x3e, 0x11, 0x11, 0xdf, 0x6d, 0x10, 0x23, 0x52, - 0x63, 0xfb, 0x70, 0x9c, 0x56, 0x7a, 0xfa, 0x2d, 0xae, 0x90, 0x37, 0xba, - 0xbd, 0xdb, 0x48, 0xad, 0xb4, 0x92, 0xc1, 0x79, 0x98, 0x7a, 0x5e, 0xff, - 0x96, 0xa4, 0xb4, 0x07, 0xb8, 0xf9, 0xf4, 0xbc, 0x0d, 0xc0, 0xd0, 0xd0, - 0x44, 0x34, 0x60, 0x8f, 0x36, 0xed, 0x7a, 0x52, 0x1a, 0x6f, 0x48, 0x05, - 0x6c, 0x4e, 0x6e, 0x9a, 0x5c, 0xe5, 0x6d, 0xb8, 0x10, 0x20, 0x04, 0x61, - 0x3b, 0x7f, 0x00, 0xcc, 0xcf, 0x2e, 0xfe, 0x48, 0x41, 0x9a, 0x7b, 0x8d, - 0xb8, 0x46, 0xd2, 0x02, 0x64, 0x73, 0xaa, 0x17, 0xa0, 0x17, 0xdd, 0x98, - 0x6a, 0x3c, 0xa4, 0xce, 0x0f, 0xfe, 0x8b, 0xf2, 0x78, 0xd1, 0xa4, 0xad, - 0xd9, 0xc0, 0x4f, 0xdd, 0x03, 0x1a, 0xbf, 0x50, 0x77, 0xaa, 0x5c, 0x4a, - 0xbb, 0xdc, 0x08, 0x10, 0x8f, 0xd7, 0x4f, 0xa9, 0xd7, 0x04, 0x45, 0x5a, - 0x0e, 0x57, 0xab, 0x27, 0x6b, 0x85, 0xba, 0xd3, 0x98, 0xff, 0x92, 0xae, - 0x12, 0x0a, 0xef, 0x22, 0xfb, 0xbd, 0xb3, 0x4f, 0x59, 0x02, 0xf4, 0x1d, - 0x46, 0x65, 0x1c, 0xbb, 0x8c, 0x9d, 0x8f, 0x02, 0x19, 0x2b, 0xab, 0x62, - 0xd8, 0x06, 0x06, 0xa1, 0xf8, 0x00, 0xef, 0x24, 0x6d, 0x00, 0xce, 0xf6, - 0x18, 0x03, 0x23, 0xf7, 0xd9, 0xc1, 0x6e, 0x00, 0xf4, 0xfd, 0x76, 0x6e, - 0x7b, 0x12, 0x5b, 0xd5, 0x75, 0x3c, 0x2c, 0xb7, 0xd1, 0x6b, 0x34, 0xe7, - 0x6e, 0xc5, 0x7c, 0x3a, 0xf3, 0x51, 0x47, 0x2b, 0x09, 0xf3, 0x1d, 0x63, - 0xfb, 0x58, 0xce, 0xbb, 0xdc, 0x8a, 0x93, 0x2f, 0x94, 0xce, 0x8f, 0x8e, - 0x97, 0x7d, 0xe7, 0x93, 0x2b, 0xa4, 0x0b, 0x6a, 0x27, 0x44, 0xf7, 0xf0, - 0x56, 0x3d, 0x5a, 0xb8, 0x72, 0x7d, 0xcd, 0xf7, 0xae, 0x11, 0x94, 0x61, - 0xa3, 0x26, 0x54, 0x20, 0x8a, 0xc7, 0x03, 0xb0, 0x0b, 0xbd, 0x76, 0x3f, - 0xcc, 0x55, 0x9c, 0x2c, 0x65, 0x2e, 0xb5, 0x9d, 0x70, 0x7f, 0xe6, 0xc0, - 0x19, 0xc7, 0xb1, 0x58, 0x44, 0xb0, 0xf5, 0x39, 0x16, 0x0d, 0x05, 0x39, - 0xaf, 0x6b, 0x37, 0x33, 0xa8, 0xb2, 0xf0, 0xc8, 0x78, 0x41, 0x96, 0x41, - 0xd8, 0x12, 0x06, 0xc2, 0x50, 0x66, 0x07, 0x23, 0x07, 0x3c, 0x8a, 0x5e, - 0xe2, 0xd4, 0xd4, 0xe8, 0x71, 0x32, 0x51, 0xc9, 0xab, 0x59, 0xfb, 0x89, - 0x5c, 0xcd, 0x17, 0x71, 0xe6, 0xa0, 0x5b, 0x2c, 0xc5, 0xb2, 0xe3, 0x1d, - 0x40, 0xbb, 0x70, 0x74, 0x93, 0x5c, 0x40, 0x60, 0xcc, 0xf8, 0x22, 0xf0, - 0xbf, 0x39, 0xcc, 0x3b, 0x1a, 0x83, 0x32, 0x5f, 0x60, 0xd3, 0x86, 0x46, - 0x5d, 0xc1, 0x41, 0x77, 0x8c, 0x05, 0xb1, 0x8f, 0xd7, 0x70, 0x03, 0x09, - 0xf3, 0xf0, 0x66, 0x2f, 0xfe, 0x72, 0x91, 0x40, 0xc9, 0xb6, 0x89, 0xc2, - 0xf8, 0x3d, 0xe4, 0x8e, 0xa0, 0xaa, 0xe8, 0x80, 0xbd, 0x12, 0xdf, 0xf9, - 0x7a, 0x35, 0xeb, 0xb5, 0x76, 0xa2, 0xb6, 0x4d, 0x81, 0x15, 0x5b, 0x8d, - 0xbc, 0x92, 0x89, 0x05, 0xa3, 0x27, 0xa9, 0xe2, 0x6b, 0x9e, 0x1e, 0x4f, - 0xaf, 0x2b, 0xc7, 0xb9, 0xaf, 0x89, 0x6b, 0x58, 0x42, 0x05, 0x11, 0x87, - 0xae, 0x7c, 0x1a, 0x99, 0x65, 0x27, 0x61, 0x5b, 0x35, 0x16, 0x7e, 0x90, - 0xc3, 0x3e, 0xe8, 0xd3, 0x16, 0x30, 0xce, 0xaf, 0xf2, 0xc0, 0xd2, 0xf0, - 0x53, 0xdf, 0x05, 0x97, 0xb6, 0xed, 0xa7, 0xb7, 0xa4, 0x3a, 0x82, 0x6d, - 0x82, 0xec, 0xf6, 0xd1, 0x8c, 0x2e, 0x21, 0xed, 0x6e, 0x34, 0x14, 0x73, - 0x77, 0x94, 0x31, 0x6d, 0x73, 0xa6, 0x7b, 0xad, 0xc2, 0xc6, 0x5b, 0x00, - 0x38, 0xbf, 0xe1, 0x9a, 0x66, 0x3c, 0xfc, 0x5e, 0xcc, 0xc0, 0xec, 0xe7, - 0x50, 0xd7, 0x30, 0x5b, 0x47, 0x49, 0x90, 0x27, 0xe3, 0x5c, 0x11, 0x8c, - 0x84, 0xab, 0x41, 0x99, 0x55, 0x01, 0x4f, 0xa3, 0xbc, 0xe1, 0xd7, 0x6f, - 0x5c, 0xcf, 0xe6, 0xb4, 0xe2, 0xaf, 0xc1, 0x4d, 0x60, 0x54, 0xb3, 0x5a, - 0x7b, 0x11, 0x78, 0xf7, 0xd3, 0x97, 0xe4, 0x82, 0xa3, 0x28, 0xb3, 0xcf, - 0x62, 0xa7, 0x89, 0xd5, 0x12, 0xd7, 0x9f, 0x04, 0xac, 0xc3, 0x18, 0x2d, - 0x68, 0x6b, 0x2f, 0xd3, 0xd2, 0x5d, 0x47, 0x33, 0x36, 0x84, 0x76, 0xaf, - 0xfe, 0x7c, 0xcb, 0xac, 0xf1, 0xb9, 0x64, 0xb6, 0x25, 0x13, 0xea, 0x77, - 0x8f, 0xe0, 0xf6, 0x22, 0x07, 0x5b, 0x67, 0x4b, 0x05, 0x0b, 0x73, 0x7b, - 0xeb, 0x1b, 0x4c, 0x25, 0x4b, 0x14, 0x9c, 0x50, 0xdd, 0x6e, 0x0b, 0x49, - 0x2d, 0xcf, 0x93, 0xfb, 0x96, 0xf3, 0x90, 0xed, 0xcf, 0x67, 0x2a, 0x29, - 0x14, 0x92, 0x5b, 0x0a, 0xd7, 0x44, 0x54, 0xc2, 0x94, 0xcb, 0x71, 0xd9, - 0xcb, 0xc8, 0x07, 0xb6, 0xfd, 0x1f, 0x0f, 0xc0, 0x17, 0xb9, 0x43, 0x6d, - 0x76, 0x7a, 0xe7, 0x7c, 0x9c, 0xd4, 0xbb, 0xea, 0x6c, 0x4c, 0x84, 0xa0, - 0xb2, 0x5c, 0x4e, 0x1a, 0x32, 0x8c, 0xc9, 0xd8, 0xa4, 0x1b, 0x91, 0x63, - 0xd2, 0x4a, 0x20, 0x9d, 0x3f, 0x45, 0x62, 0x4b, 0xd1, 0x88, 0xb4, 0xb8, - 0x9b, 0x82, 0xbc, 0xa8, 0x63, 0x43, 0x3f, 0x6c, 0x9c, 0x64, 0x2a, 0xfb, - 0x35, 0x8d, 0x6d, 0x78, 0x29, 0xe9, 0x53, 0x5d, 0x62, 0xde, 0xdc, 0xea, - 0x0b, 0xa0, 0xd2, 0x55, 0x4c, 0x9a, 0x4d, 0xac, 0x10, 0xb1, 0x72, 0x70, - 0xa8, 0xe7, 0xe2, 0x80, 0x6e, 0x56, 0x12, 0x63, 0xb2, 0x5f, 0x67, 0x5b, - 0xe9, 0xf1, 0x0a, 0xdb, 0xe8, 0xd3, 0xa8, 0x4f, 0xb6, 0xa3, 0xf3, 0x4e, - 0xa2, 0xa0, 0xc6, 0x6c, 0x35, 0xdc, 0xdc, 0x6c, 0xae, 0x26, 0xd5, 0x3e, - 0xc5, 0x7e, 0x5d, 0x89, 0xff, 0x3a, 0xa0, 0x6e, 0x4d, 0x80, 0x84, 0xa8, - 0x23, 0x59, 0x71, 0xf8, 0x1c, 0x53, 0xd9, 0x67, 0x6e, 0xbf, 0x05, 0x55, - 0x4c, 0xf8, 0x85, 0x84, 0x29, 0x9b, 0x59, 0xff, 0x75, 0x95, 0xf0, 0x63, - 0x83, 0x8f, 0x38, 0x97, 0xc8, 0x85, 0x26, 0xc7, 0xa8, 0x6c, 0x54, 0x8f, - 0x32, 0x08, 0x8f, 0x1a, 0x88, 0x3a, 0xeb, 0x6e, 0xeb, 0xfd, 0xc7, 0x83, - 0xa9, 0xaa, 0xb0, 0x5f, 0xae, 0xf0, 0xfe, 0x0d, 0xe9, 0x32, 0x54, 0x09, - 0xa8, 0x12, 0xd7, 0x30, 0x86, 0x3f, 0x06, 0x26, 0x48, 0x45, 0x7a, 0x64, - 0x55, 0x67, 0xad, 0xce, 0x81, 0xd0, 0x20, 0x5a, 0xea, 0x0a, 0x9f, 0x34, - 0x0e, 0xb9, 0x12, 0x22, 0xd9, 0x5b, 0xd0, 0xfc, 0xaf, 0xad, 0xba, 0x08, - 0x60, 0x22, 0x28, 0xfe, 0x7a, 0x25, 0x83, 0xa1, 0x39, 0xd9, 0x01, 0x87, - 0x10, 0xc8, 0x8a, 0x92, 0xa5, 0xac, 0x40, 0xb6, 0xb4, 0x30, 0x6b, 0xc9, - 0x47, 0x6f, 0xe3, 0xb8, 0x56, 0xbc, 0xe6, 0x42, 0x36, 0xc3, 0x66, 0x5c, - 0x5b, 0x2b, 0xb8, 0x4d, 0x0b, 0x64, 0xdc, 0xd9, 0x83, 0x29, 0x6e, 0x09, - 0xe2, 0x1b, 0xd7, 0xb1, 0x55, 0x39, 0x27, 0x30, 0xe9, 0x70, 0x13, 0xf8, - 0x2f, 0x8d, 0xc0, 0xd9, 0xca, 0xfe, 0x2a, 0xb4, 0xb1, 0x2d, 0xcd, 0x24, - 0x46, 0xa2, 0x1e, 0x38, 0x44, 0x73, 0x2e, 0x84, 0xee, 0x02, 0x43, 0x9a, - 0x47, 0x6f, 0x29, 0xd0, 0xaf, 0x95, 0xe5, 0x8c, 0xa6, 0x7e, 0x04, 0x77, - 0x12, 0xb6, 0x71, 0x34, 0x1b, 0x21, 0x4d, 0x41, 0xc8, 0x9f, 0x04, 0xca, - 0x2c, 0xb2, 0xd7, 0x1e, 0x09, 0xe0, 0xa7, 0xc5, 0x3b, 0x6b, 0x84, 0x6c, - 0xb9, 0xf7, 0xa4, 0xd2, 0xf9, 0x55, 0x7c, 0x41, 0x22, 0x39, 0xf8, 0x7e, - 0x73, 0x06, 0x44, 0x4c, 0x5e, 0x92, 0xd9, 0x3c, 0xa3, 0x81, 0xaf, 0x03, - 0xe4, 0x48, 0xe8, 0xd0, 0x2b, 0xd7, 0x24, 0x2d, 0x0b, 0xdd, 0xcc, 0x91, - 0x7e, 0xe4, 0x5c, 0xe6, 0xd5, 0x70, 0xee, 0x35, 0xa8, 0x24, 0x0f, 0x92, - 0xf0, 0xdf, 0x0e, 0x2c, 0x43, 0x17, 0x7f, 0x28, 0x97, 0xf9, 0xc9, 0x0f, - 0xc4, 0x0e, 0x80, 0x5b, 0x1e, 0x82, 0xb9, 0xcc, 0xa1, 0x29, 0x36, 0xbb, - 0xce, 0x7a, 0x07, 0x1a, 0x6f, 0x88, 0x01, 0xd9, 0xe0, 0xf8, 0x6a, 0x68, - 0x80, 0x33, 0xe3, 0xae, 0xa1, 0x14, 0x7b, 0x7a, 0x89, 0x97, 0x08, 0xcf, - 0x6d, 0x34, 0xe2, 0x6f, 0x75, 0xce, 0xb0, 0x8f, 0x28, 0x4e, 0x93, 0x16, - 0xe7, 0xf0, 0xd4, 0xfd, 0x8e, 0xe1, 0x24, 0xc5, 0x77, 0x67, 0x99, 0xdf, - 0x06, 0x5e, 0x4d, 0x9e, 0xe8, 0x4c, 0xc3, 0xbb, 0x6c, 0xf5, 0x9d, 0xcf, - 0xb7, 0x63, 0x70, 0xcd, 0xb0, 0xc1, 0x96, 0xd9, 0x3f, 0x45, 0x16, 0x63, - 0xda, 0x95, 0x1b, 0x25, 0x84, 0xa1, 0x80, 0x67, 0x49, 0xfd, 0x2a, 0xe2, - 0x49, 0xb9, 0x01, 0x72, 0x46, 0xad, 0xd9, 0xda, 0xfe, 0xbe, 0xf0, 0x77, - 0x0f, 0x72, 0xf1, 0x0a, 0xfa, 0xfa, 0x44, 0x36, 0x79, 0xf4, 0x9d, 0xe3, - 0x84, 0xfc, 0x9f, 0xef, 0xba, 0x66, 0xe2, 0x6b, 0x9f, 0x18, 0x9f, 0x5b, - 0xab, 0x18, 0x16, 0x52, 0x2e, 0x3b, 0xb6, 0xbb, 0xce, 0xd2, 0x53, 0xda, - 0x19, 0x9f, 0xf9, 0xe3, 0x18, 0x2c, 0x63, 0x1f, 0x16, 0x5c, 0x9d, 0xca, - 0x17, 0x86, 0xb3, 0x4e, 0x8c, 0x3d, 0x1b, 0x95, 0xf1, 0x7b, 0x21, 0x0c, - 0xc2, 0x75, 0xd1, 0x1e, 0x69, 0xe8, 0x24, 0x12, 0x2f, 0xfe, 0xe3, 0x7a, - 0xf9, 0x56, 0x9a, 0x40, 0x4f, 0xe0, 0x2a, 0x3a, 0x40, 0x3a, 0x5e, 0x47, - 0x92, 0xb9, 0x9f, 0x22, 0x8a, 0x17, 0xe1, 0x95, 0xa3, 0xe5, 0xcc, 0xb2, - 0x47, 0x02, 0xf3, 0xf1, 0xd4, 0x87, 0x49, 0xb9, 0x1a, 0x3d, 0x5f, 0x0e, - 0xcf, 0x17, 0xa3, 0x4a, 0xa7, 0xa4, 0x4e, 0x3d, 0x1c, 0x2b, 0xd7, 0x95, - 0x77, 0x16, 0x7a, 0x80, 0x07, 0xbd, 0xfc, 0x87, 0xeb, 0x7c, 0xac, 0x43, - 0xa8, 0xb9, 0x68, 0x9b, 0x14, 0xd2, 0xf5, 0xb0, 0x08, 0x6d, 0x36, 0xec, - 0xef, 0x44, 0xe9, 0x41, 0x32, 0xaf, 0xb4, 0xf7, 0xb0, 0x5f, 0x62, 0x8f, - 0x63, 0xe8, 0x5d, 0xfd, 0xa4, 0x65, 0x92, 0x8b, 0x31, 0x80, 0xc4, 0x72, - 0xd6, 0x21, 0x58, 0xf3, 0xb8, 0xd7, 0x37, 0xc0, 0xab, 0x6a, 0x3b, 0x1f, - 0x23, 0x0d, 0xcd, 0x7e, 0x00, 0xae, 0xa8, 0xce, 0x17, 0x51, 0x52, 0x9e, - 0x31, 0xad, 0x07, 0x3c, 0xc4, 0xb8, 0xb0, 0x80, 0x44, 0xeb, 0x38, 0xbf, - 0x3a, 0x14, 0x73, 0x4b, 0x2a, 0x30, 0xca, 0xfd, 0x47, 0x11, 0xcb, 0xe3, - 0x5e, 0x7a, 0x64, 0xdd, 0x69, 0x02, 0xe3, 0x2e, 0x5d, 0xea, 0xc2, 0xaf, - 0xc1, 0x5a, 0x65, 0xc9, 0xa8, 0x08, 0xaf, 0x29, 0x35, 0xb7, 0x61, 0xdf, - 0x66, 0x5e, 0x4d, 0x93, 0xb5, 0x93, 0x0a, 0xbc, 0x4c, 0x4e, 0xf7, 0xee, - 0x61, 0xd7, 0xa1, 0x21, 0x18, 0x6a, 0x5b, 0x3b, 0xc4, 0xd3, 0x44, 0x8a, - 0xa9, 0x2d, 0x79, 0x19, 0x43, 0x89, 0x8e, 0x78, 0x78, 0x5e, 0x0e, 0x23, - 0x92, 0x69, 0x09, 0x09, 0x4d, 0x5f, 0x66, 0x8b, 0x6b, 0x41, 0x2a, 0xb3, - 0x5f, 0x42, 0xb9, 0x1c, 0x7d, 0x26, 0x79, 0xa4, 0x5f, 0x9c, 0x40, 0x51, - 0x12, 0x66, 0xd7, 0x7b, 0x7b, 0x45, 0x06, 0xf9, 0x80, 0x19, 0xd4, 0xb1, - 0x2b, 0x13, 0xc8, 0xeb, 0x72, 0xb0, 0x22, 0x54, 0x3b, 0x41, 0xe1, 0x61, - 0x81, 0xf4, 0x8e, 0x8e, 0x49, 0xfb, 0xb7, 0xe4, 0x16, 0x8d, 0x4e, 0xf9, - 0xad, 0xf1, 0x59, 0xe8, 0x03, 0x50, 0x59, 0xe0, 0x7a, 0xff, 0x15, 0x4f, - 0x3b, 0x0b, 0xa4, 0x6b, 0x41, 0xc5, 0x61, 0x24, 0xf3, 0xcd, 0xf6, 0x17, - 0xbe, 0x2b, 0x46, 0xfd, 0xba, 0xda, 0x6b, 0x46, 0x19, 0x58, 0x5b, 0x05, - 0x35, 0xfe, 0x1e, 0x3a, 0x6d, 0xdb, 0xc3, 0x26, 0x48, 0x72, 0xbd, 0xe0, - 0xac, 0xd3, 0x2c, 0x6f, 0x6a, 0xc1, 0x67, 0xfc, 0x71, 0xc6, 0x37, 0xbe, - 0xb6, 0xa6, 0xd1, 0x88, 0x24, 0x43, 0x6e, 0x6e, 0xd9, 0xa2, 0x54, 0x40, - 0x2f, 0x6d, 0xf8, 0x25, 0x58, 0x82, 0xbe, 0x8f, 0x31, 0x7a, 0xad, 0x71, - 0x5e, 0xc9, 0xa5, 0xec, 0x6f, 0x96, 0xd2, 0xb7, 0xa3, 0x9f, 0x7e, 0x1f, - 0xee, 0xa6, 0x3a, 0x54, 0x1b, 0x26, 0xb6, 0x54, 0xfd, 0x16, 0x1e, 0x78, - 0x90, 0xf1, 0xde, 0x51, 0x06, 0x11, 0x55, 0xf4, 0xd7, 0xed, 0x14, 0x9e, - 0xe8, 0xc3, 0xea, 0x59, 0x0b, 0xe2, 0xe1, 0x2a, 0xd4, 0x1d, 0x2c, 0x5e, - 0x07, 0x57, 0xfd, 0x99, 0x04, 0x8b, 0xe9, 0x88, 0x5d, 0x73, 0x3d, 0xad, - 0x74, 0x79, 0x17, 0xc8, 0xb8, 0xc1, 0x2c, 0x38, 0x22, 0x3e, 0x4b, 0xb1, - 0x51, 0xe5, 0xd0, 0x27, 0x72, 0x3e, 0xb9, 0xaa, 0xc7, 0x5f, 0x4f, 0x4b, - 0x7c, 0x37, 0x6c, 0xfd, 0xfd, 0xec, 0x4a, 0x32, 0x63, 0x7a, 0x0c, 0xd3, - 0x42, 0x6f, 0xc9, 0x2d, 0x67, 0xe5, 0xe3, 0xd5, 0x73, 0x55, 0xb9, 0x22, - 0xbd, 0x82, 0x94, 0x68, 0x86, 0x61, 0x8f, 0x9d, 0x31, 0xc1, 0x18, 0x6a, - 0x12, 0xde, 0x6a, 0x81, 0x2b, 0x9d, 0xbe, 0x43, 0x27, 0x74, 0xa6, 0x27, - 0x22, 0x90, 0xe8, 0x8e, 0xc4, 0x00, 0x37, 0x02, 0xa3, 0x9b, 0xf2, 0x71, - 0xbc, 0xe2, 0xab, 0x25, 0x45, 0xed, 0xd2, 0xf1, 0x3a, 0x12, 0xfb, 0xae, - 0xe3, 0x9e, 0x39, 0x6d, 0xd5, 0xf1, 0xfa, 0x5d, 0x10, 0x34, 0x7b, 0x32, - 0xf0, 0x92, 0x56, 0x5c, 0x8b, 0xeb, 0xaa, 0x08, 0x6b, 0xaa, 0x5d, 0x1c, - 0xaf, 0x8d, 0x8d, 0x71, 0x49, 0xfe, 0x99, 0xdf, 0xda, 0x34, 0x05, 0xc8, - 0xd8, 0xd5, 0x74, 0x54, 0x20, 0x90, 0x8b, 0x2a, 0x39, 0x3d, 0x51, 0x96, - 0xec, 0x8b, 0x92, 0xac, 0x1c, 0x84, 0x13, 0xb0, 0x02, 0xa7, 0xee, 0xf4, - 0xc2, 0x68, 0x8c, 0xc5, 0x67, 0xb4, 0x7e, 0x65, 0xd4, 0xd0, 0x44, 0xb1, - 0x41, 0x0d, 0x0f, 0x5a, 0x78, 0x50, 0x15, 0x82, 0xa2, 0x09, 0x0c, 0x54, - 0x9f, 0xe0, 0x8f, 0x11, 0x47, 0x46, 0x52, 0x3a, 0x64, 0xa4, 0xba, 0xa8, - 0x82, 0x9d, 0xac, 0x3b, 0x58, 0x3f, 0x0e, 0x11, 0x8a, 0x33, 0x10, 0xc8, - 0x18, 0xa9, 0x55, 0x4c, 0xdc, 0x3b, 0x04, 0xaa, 0xfb, 0xd7, 0xc0, 0xc0, - 0x50, 0x67, 0xa3, 0x95, 0x91, 0x25, 0xe1, 0x4a, 0xb8, 0xf4, 0xc5, 0x23, - 0xf2, 0xd7, 0xbe, 0x96, 0x5f, 0x25, 0x38, 0x9a, 0x79, 0x41, 0x5c, 0x90, - 0x0a, 0xaf, 0xde, 0xbf, 0x56, 0x62, 0x34, 0x3a, 0x59, 0xc2, 0x83, 0x13, - 0xa2, 0xc9, 0x80, 0x96, 0xf2, 0x53, 0xac, 0xdd, 0xe0, 0x1f, 0xc9, 0x0f, - 0x4e, 0x10, 0x95, 0x28, 0xd9, 0x02, 0x24, 0xc0, 0x27, 0x56, 0x74, 0x5d, - 0xf6, 0xa5, 0x26, 0xd2, 0x10, 0x2e, 0x38, 0x3d, 0x8d, 0x6d, 0x02, 0x4e, - 0x4a, 0x59, 0x66, 0x82, 0x3d, 0x50, 0xe0, 0xf8, 0x7b, 0xfe, 0x47, 0xf2, - 0xd6, 0x03, 0xd0, 0xf3, 0x8e, 0xb0, 0x47, 0xfa, 0x58, 0x15, 0x85, 0x6a, - 0x30, 0x62, 0xc7, 0x9f, 0xf7, 0xf9, 0xe0, 0xa5, 0x3b, 0x7a, 0x46, 0xc0, - 0x4f, 0x74, 0x67, 0xdf, 0x0c, 0xf1, 0xa0, 0x9e, 0x18, 0xc3, 0x6c, 0xad, - 0xf3, 0xf5, 0x99, 0x45, 0xe4, 0x44, 0xce, 0xa1, 0xe7, 0xf0, 0x50, 0x63, - 0xa7, 0xc5, 0xf4, 0x81, 0x04, 0x6d, 0xbd, 0x19, 0x7f, 0x7c, 0x78, 0xe8, - 0xb9, 0x01, 0x04, 0x8c, 0x82, 0x4e, 0xc0, 0x40, 0xfe, 0x10, 0xf9, 0x50, - 0x63, 0x5e, 0xb6, 0xea, 0x3a, 0x51, 0x23, 0x24, 0x2a, 0xdc, 0xa4, 0x7f, - 0x5f, 0xdf, 0xd7, 0x71, 0xf4, 0x01, 0xba, 0xef, 0x7d, 0x16, 0xe7, 0xb8, - 0xed, 0x42, 0xcc, 0x5f, 0xa3, 0x45, 0xd1, 0x2c, 0x33, 0x1c, 0x73, 0x4b, - 0x20, 0xc7, 0x49, 0x41, 0xda, 0xdf, 0x8b, 0x1a, 0xfa, 0x40, 0x59, 0x1d, - 0x98, 0xeb, 0x9e, 0x1f, 0xd2, 0xf5, 0x44, 0xcb, 0x66, 0xbf, 0xbf, 0x20, - 0xbe, 0x0f, 0x36, 0xde, 0x3a, 0x7e, 0x7e, 0x15, 0xbd, 0x4e, 0xbb, 0x81, - 0x18, 0xb8, 0x2a, 0x8b, 0x57, 0x2c, 0xcd, 0x04, 0xe4, 0xf4, 0x22, 0xfb, - 0xb8, 0x54, 0xc2, 0x06, 0x96, 0x80, 0xbe, 0x9c, 0x09, 0x7f, 0xdc, 0x3b, - 0x07, 0xca, 0x6a, 0xb8, 0x20, 0xea, 0x73, 0xcd, 0xc5, 0xc3, 0x4d, 0x7c, - 0x87, 0x13, 0xf8, 0xec, 0x05, 0x2f, 0x01, 0xd3, 0xf2, 0xc2, 0x1d, 0xc6, - 0xf5, 0x2f, 0x28, 0x02, 0xce, 0x85, 0x0e, 0x12, 0x9d, 0xef, 0xf0, 0x1c, - 0xc3, 0xc5, 0xf5, 0x07, 0xab, 0x7b, 0x7b, 0x68, 0x11, 0x2d, 0x18, 0x0c, - 0x99, 0x64, 0x39, 0x6f, 0x90, 0xc7, 0xfd, 0x34, 0xcb, 0xd5, 0x38, 0xd2, - 0x12, 0x54, 0xed, 0x69, 0x32, 0x89, 0x53, 0x7d, 0xdb, 0xb8, 0x14, 0x70, - 0xb6, 0xbe, 0xf4, 0x46, 0xc5, 0x15, 0x82, 0xc2, 0x85, 0x38, 0x65, 0xe5, - 0xc3, 0xd3, 0x2f, 0x2e, 0xad, 0x14, 0x2b, 0x67, 0x1d, 0xbd, 0x7a, 0x43, - 0x30, 0xd1, 0x46, 0xa3, 0xee, 0x7b, 0x89, 0xab, 0xe4, 0xaf, 0x1d, 0xbc, - 0x3c, 0xdc, 0x9c, 0xf5, 0x47, 0x1c, 0xf7, 0x6f, 0x02, 0x86, 0x7a, 0x9d, - 0x19, 0x48, 0x4f, 0x97, 0xd0, 0xc1, 0x86, 0xde, 0xab, 0xda, 0x34, 0xcf, - 0x9b, 0x69, 0x41, 0x4c, 0x61, 0x06, 0x03, 0xe0, 0x4e, 0xf0, 0x5b, 0xb1, - 0xa1, 0xef, 0xdb, 0x0a, 0xe8, 0xe2, 0xec, 0x86, 0xd9, 0x7e, 0xe7, 0xe0, - 0xc6, 0x74, 0x16, 0x05, 0xd7, 0x8e, 0x70, 0x74, 0xfd, 0x21, 0x89, 0xdc, - 0x2f, 0x80, 0x6a, 0x22, 0xa4, 0x80, 0xbe, 0x34, 0x8c, 0xde, 0x7f, 0x7b, - 0x67, 0xbe, 0xe8, 0xed, 0x7d, 0x70, 0xfa, 0x68, 0xc5, 0x9a, 0xab, 0xfc, - 0xff, 0x5b, 0xe3, 0x91, 0x27, 0x57, 0x85, 0xdf, 0x96, 0x45, 0x52, 0xdc, - 0xdd, 0x0a, 0x0b, 0xa2, 0x54, 0x41, 0x0c, 0xd9, 0xcb, 0x4a, 0xed, 0x6b, - 0xdd, 0x63, 0xc1, 0x9b, 0x86, 0x69, 0xd9, 0xd6, 0xf0, 0x47, 0x95, 0xda, - 0x65, 0xb1, 0x08, 0xdc, 0xad, 0xfa, 0xba, 0x27, 0x51, 0xdd, 0x29, 0x2e, - 0x61, 0xdb, 0x1b, 0x60, 0x83, 0x1f, 0xe8, 0xaa, 0xa6, 0xbc, 0xed, 0xf0, - 0x12, 0x21, 0x2f, 0xda, 0xc0, 0xa9, 0xb3, 0xa7, 0x87, 0x11, 0x37, 0xd7, - 0x3a, 0xa8, 0xe2, 0x3f, 0x35, 0x2e, 0x1c, 0xdd, 0x66, 0x5d, 0xa3, 0xd5, - 0x06, 0x4a, 0x81, 0x43, 0x30, 0x85, 0x7b, 0xf1, 0xe1, 0xe4, 0x8e, 0xfc, - 0x40, 0x5a, 0x4f, 0x09, 0xad, 0xf3, 0xb6, 0xc8, 0xa7, 0x3f, 0x11, 0x62, - 0xf3, 0x95, 0x53, 0xe6, 0xf0, 0x5f, 0xbe, 0xcb, 0xc0, 0xa8, 0x2a, 0xbe, - 0xe7, 0x7f, 0xbc, 0x9b, 0xc7, 0xfc, 0xf6, 0x28, 0x01, 0x2d, 0xcc, 0xd1, - 0xa1, 0x00, 0xf3, 0x21, 0x41, 0xc9, 0xe9, 0x8c, 0x7e, 0x0a, 0x1e, 0x9c, - 0x90, 0xfd, 0xcb, 0xcf, 0xff, 0x1b, 0x06, 0xb0, 0x30, 0xfd, 0x4a, 0x6c, - 0x88, 0xce, 0x4a, 0x39, 0x15, 0xc8, 0xf6, 0x02, 0x0a, 0xd7, 0xa9, 0xa5, - 0x89, 0x09, 0x9f, 0x05, 0xea, 0xf7, 0x07, 0x40, 0xb6, 0xb2, 0x59, 0xc9, - 0xa6, 0xbf, 0xbc, 0x31, 0xc7, 0x72, 0xf1, 0x8f, 0xb7, 0x6a, 0x7b, 0x8a, - 0x19, 0xeb, 0x89, 0xae, 0x7d, 0x2c, 0xea, 0x41, 0x2e, 0xc5, 0xb1, 0x06, - 0x9e, 0xc2, 0x9b, 0x0a, 0xc3, 0x47, 0x63, 0x2d, 0xea, 0x5f, 0x34, 0x3f, - 0x4c, 0xce, 0x32, 0x5a, 0x94, 0x17, 0xd0, 0x6b, 0xe4, 0x4c, 0xc2, 0x4b, - 0x35, 0x95, 0xb4, 0xa4, 0xa3, 0x07, 0x75, 0xa2, 0x1b, 0x2c, 0x64, 0xfe, - 0x72, 0x51, 0xd1, 0x1c, 0x81, 0xa8, 0xe1, 0x2e, 0xb9, 0xb1, 0x83, 0x2d, - 0x2c, 0x96, 0x15, 0xf7, 0x92, 0x2e, 0x31, 0x2f, 0x8e, 0xb2, 0x51, 0xb4, - 0x7e, 0x10, 0x93, 0x35, 0x94, 0xf7, 0x37, 0xe4, 0xe1, 0xe8, 0x6a, 0x2e, - 0xe3, 0xe2, 0xce, 0xfa, 0x50, 0x7d, 0x8d, 0x57, 0xfb, 0x10, 0x96, 0xdc, - 0x7b, 0x43, 0x5b, 0xaa, 0x29, 0xed, 0xfa, 0x11, 0xd4, 0x3c, 0x6b, 0xda, - 0x35, 0x49, 0xd2, 0xaa, 0x65, 0x41, 0x34, 0x9c, 0x04, 0x79, 0xce, 0xc2, - 0x88, 0x79, 0x47, 0xf4, 0x41, 0x17, 0x33, 0x43, 0xec, 0x9e, 0x5d, 0x89, - 0xa3, 0x9b, 0x93, 0xda, 0x7e, 0xe8, 0xf4, 0x19, 0xa2, 0x6f, 0x58, 0xa3, - 0x87, 0x27, 0x82, 0x71, 0xe7, 0x04, 0xea, 0xee, 0xd7, 0xa0, 0xc5, 0xfb, - 0xe4, 0xfa, 0x75, 0x50, 0xab, 0x87, 0x5b, 0xed, 0xab, 0x23, 0x48, 0xbf, - 0x48, 0x33, 0xfc, 0x33, 0x80, 0x91, 0x08, 0x42, 0x3e, 0x35, 0x22, 0x87, - 0x88, 0xd6, 0x01, 0xe8, 0x6f, 0xcf, 0x96, 0xb1, 0x03, 0xbc, 0x1d, 0x0f, - 0x7f, 0x70, 0x64, 0x87, 0xcb, 0x42, 0x36, 0x1c, 0xed, 0x26, 0x54, 0x3b, - 0x8b, 0xf7, 0xd0, 0xc4, 0x32, 0xac, 0x9e, 0xa1, 0x4b, 0x93, 0x93, 0xcc, - 0x8a, 0xbd, 0xae, 0xad, 0x77, 0xaf, 0xe5, 0xb5, 0x0c, 0xed, 0xdb, 0x83, - 0x33, 0xb4, 0x2f, 0xef, 0x49, 0xfb, 0x0d, 0x07, 0x74, 0xbd, 0x7a, 0xdd, - 0xce, 0xda, 0xa6, 0x72, 0xd6, 0x28, 0x44, 0xd6, 0x88, 0xdc, 0xd8, 0x2c, - 0x04, 0x63, 0xf8, 0x7f, 0x0c, 0x6b, 0xe8, 0x0e, 0x68, 0xc2, 0x02, 0x5a, - 0x34, 0x9a, 0x02, 0x5d, 0xc5, 0x05, 0xbd, 0x6c, 0x0f, 0xda, 0x86, 0xc9, - 0x65, 0xa2, 0x11, 0xc2, 0xc8, 0xa1, 0x99, 0x01, 0x6a, 0xb0, 0x29, 0xa9, - 0xdf, 0x45, 0x5b, 0xf0, 0xa9, 0xad, 0x23, 0x51, 0x17, 0xc8, 0x88, 0xcf, - 0xbd, 0x1b, 0x29, 0xa8, 0xfa, 0x6a, 0x1d, 0xec, 0x4f, 0xe0, 0xca, 0x16, - 0xfe, 0x18, 0x0a, 0x44, 0xd5, 0x36, 0x69, 0x8d, 0x3c, 0x87, 0x96, 0x03, - 0xed, 0x17, 0x6d, 0x04, 0xf9, 0x25, 0xe6, 0xdd, 0xeb, 0xa1, 0x50, 0xc6, - 0x12, 0xfc, 0x5e, 0xdf, 0xc8, 0x98, 0x9c, 0x9b, 0xaa, 0x17, 0x4e, 0xea, - 0xfa, 0xcb, 0x05, 0xdb, 0xa7, 0x0e, 0x0f, 0xda, 0x68, 0xb6, 0xda, 0x6d, - 0xa7, 0xa2, 0xd4, 0x6d, 0xc6, 0x64, 0x92, 0xba, 0x92, 0x8e, 0xdb, 0x4f, - 0x52, 0xcc, 0x13, 0x68, 0xe6, 0xed, 0xf2, 0x2a, 0x9d, 0xc7, 0x0e, 0x91, - 0x69, 0x3f, 0x1d, 0x44, 0xd9, 0x9d, 0x70, 0xa9, 0x73, 0xba, 0x38, 0xad, - 0xf2, 0xbd, 0x8c, 0x55, 0x90, 0x65, 0x5f, 0xbf, 0x80, 0x0f, 0x05, 0xd2, - 0x10, 0x67, 0xb7, 0x0f, 0x29, 0xc8, 0x58, 0x31, 0x4d, 0xbf, 0xc4, 0xfa, - 0xaf, 0x07, 0xe6, 0x5b, 0x28, 0xe4, 0x93, 0xc0, 0xd4, 0xf5, 0xf8, 0xc2, - 0x05, 0xce, 0xca, 0x56, 0x59, 0x37, 0x4d, 0x3f, 0xe3, 0xf3, 0xc2, 0xc2, - 0x60, 0xe3, 0x9b, 0x65, 0x33, 0xf4, 0x46, 0xe4, 0xdc, 0x3c, 0x35, 0xa6, - 0x25, 0x4e, 0x22, 0xe0, 0x4c, 0xd9, 0x1e, 0x56, 0x7d, 0x04, 0xbe, 0x91, - 0x7a, 0x22, 0x75, 0x33, 0xcc, 0x0e, 0xaa, 0xad, 0x14, 0xa1, 0xda, 0x1d, - 0x82, 0x05, 0x30, 0x15, 0x0b, 0x6b, 0xc5, 0x8f, 0x06, 0x1d, 0xf6, 0x58, - 0x20, 0x6e, 0x82, 0x85, 0xcd, 0xb9, 0x8a, 0x3f, 0x2f, 0x4c, 0x65, 0x85, - 0x1d, 0x6b, 0x2f, 0xdf, 0xdc, 0x7b, 0xe6, 0x4b, 0x49, 0x78, 0xa7, 0xae, - 0x21, 0x4d, 0x98, 0xa8, 0x2e, 0x11, 0x7b, 0xe0, 0x5c, 0x43, 0xe1, 0xc4, - 0x60, 0xcf, 0xa6, 0xe0, 0x42, 0x64, 0x78, 0x61, 0x35, 0x20, 0x2e, 0x99, - 0x8d, 0x3e, 0xeb, 0xd7, 0x78, 0xcd, 0x2d, 0x30, 0x1e, 0xa6, 0x01, 0xfe, - 0x34, 0xf3, 0x0a, 0xc4, 0x83, 0x82, 0xde, 0x70, 0x88, 0x07, 0x60, 0x9d, - 0x58, 0x3b, 0x4f, 0x4a, 0xde, 0x2a, 0xa6, 0x57, 0x38, 0xe4, 0xac, 0xa9, - 0x1f, 0x3b, 0x13, 0xfd, 0xec, 0xae, 0xad, 0x9e, 0xf2, 0x33, 0x22, 0xe4, - 0x2a, 0x9f, 0xf9, 0x24, 0x52, 0x7c, 0x4b, 0xa5, 0x5f, 0x3b, 0x5f, 0x19, - 0x25, 0x25, 0x53, 0xde, 0xf5, 0x6a, 0xb5, 0x91, 0x24, 0x12, 0x51, 0xc4, - 0x90, 0x10, 0x93, 0x72, 0xcc, 0x9a, 0x7b, 0x9a, 0x3a, 0x2e, 0x66, 0x8b, - 0x54, 0x9d, 0x17, 0x71, 0xe8, 0x6a, 0x7b, 0x33, 0x59, 0x1a, 0x94, 0x9d, - 0x2b, 0xd7, 0x81, 0xe0, 0xca, 0x21, 0x88, 0x03, 0xe8, 0x7f, 0x47, 0x4c, - 0xb3, 0x00, 0x2c, 0xae, 0xea, 0xdb, 0xa7, 0x02, 0x1a, 0x89, 0xe6, 0x53, - 0x98, 0x4f, 0xf9, 0x5b, 0xae, 0x32, 0xee, 0x6e, 0x90, 0x1e, 0x45, 0x84, - 0x47, 0xbc, 0x98, 0x1e, 0x14, 0x1e, 0x3c, 0x79, 0x0c, 0x8b, 0x84, 0x37, - 0x03, 0x13, 0x2f, 0x2b, 0x58, 0x67, 0xbd, 0x55, 0xe8, 0xea, 0xd3, 0x71, - 0x09, 0x44, 0x93, 0xe2, 0xed, 0xbc, 0x03, 0x35, 0xd1, 0xfc, 0x75, 0xf8, - 0x59, 0x7f, 0x19, 0x6b, 0x82, 0x1d, 0x01, 0xcd, 0x59, 0xe9, 0x6e, 0x51, - 0xba, 0x5b, 0x36, 0x8a, 0xaf, 0x6d, 0x3e, 0x8b, 0xe9, 0x6c, 0x16, 0xcc, - 0xc1, 0xb1, 0xfc, 0x02, 0x2f, 0xf2, 0x36, 0x29, 0x67, 0x1f, 0xe3, 0x2a, - 0x28, 0xef, 0xff, 0x13, 0x28, 0x9c, 0x96, 0x3c, 0x8f, 0x36, 0x4b, 0x08, - 0x87, 0xf9, 0xe0, 0x84, 0x25, 0x17, 0x09, 0xe7, 0x68, 0xa2, 0xad, 0x51, - 0x01, 0xbb, 0xe0, 0x31, 0xbb, 0xc8, 0x62, 0x19, 0x10, 0x5f, 0x01, 0x7d, - 0x2d, 0x71, 0x15, 0x5c, 0x94, 0xd6, 0x60, 0x93, 0x51, 0x4c, 0xa1, 0x18, - 0x15, 0xd5, 0x11, 0x08, 0x48, 0xe9, 0x17, 0xb6, 0xbd, 0xe7, 0x3a, 0x8f, - 0x6e, 0xca, 0xd1, 0x7c, 0x4d, 0x7b, 0xe0, 0xb5, 0x66, 0xa0, 0xe7, 0xae, - 0x66, 0x3b, 0x37, 0xaf, 0x1a, 0x8b, 0x64, 0xa9, 0x00, 0xcd, 0x0b, 0xac, - 0xc0, 0xe2, 0x04, 0x4c, 0x37, 0x7a, 0x20, 0xba, 0x48, 0x28, 0x3a, 0xd5, - 0x85, 0x5a, 0x03, 0xd9, 0x9c, 0x52, 0x0c, 0xa1, 0x2c, 0x49, 0x83, 0xf2, - 0xb2, 0x2c, 0x7c, 0x0f, 0xea, 0xf4, 0x60, 0xe3, 0xb5, 0xec, 0x4c, 0x57, - 0xd6, 0x2f, 0x3a, 0x30, 0xfc, 0x69, 0x7e, 0x39, 0x32, 0x96, 0x30, 0x10, - 0x19, 0x64, 0xa9, 0x88, 0x4f, 0x0c, 0xba, 0x2d, 0x1d, 0xa5, 0xa9, 0x14, - 0x86, 0x0a, 0x19, 0x34, 0x5e, 0xa8, 0x56, 0xb9, 0x63, 0x96, 0xf3, 0x54, - 0xf2, 0x26, 0x28, 0x26, 0xfb, 0xdf, 0x7d, 0x63, 0x96, 0x80, 0xfe, 0x30, - 0x40, 0x1f, 0xf9, 0x7a, 0xa3, 0xf0, 0x87, 0xb5, 0x1e, 0xff, 0xae, 0x98, - 0xff, 0x9d, 0x2c, 0x88, 0x5a, 0x60, 0xb2, 0xc2, 0x78, 0x42, 0xa4, 0xc7, - 0xc8, 0x72, 0x6c, 0xc3, 0x5a, 0x44, 0x32, 0x8e, 0xcd, 0x48, 0x04, 0xee, - 0xfc, 0xd7, 0x3a, 0xeb, 0x86, 0x1e, 0xd7, 0x6f, 0xa8, 0xc8, 0x91, 0x94, - 0x9f, 0x82, 0x5f, 0xb8, 0x20, 0x65, 0x04, 0x35, 0x53, 0x65, 0x69, 0xa8, - 0xff, 0xd1, 0xbe, 0x7e, 0x2e, 0xba, 0xd2, 0x19, 0x3e, 0x8d, 0xcf, 0xd2, - 0x15, 0x6a, 0x34, 0xd8, 0x7c, 0x4f, 0x09, 0x9a, 0xe8, 0x86, 0x8c, 0xef, - 0x15, 0xfe, 0xf1, 0x73, 0x13, 0x2c, 0x8e, 0xcb, 0x57, 0x9c, 0x53, 0x6b, - 0x1a, 0xea, 0xfb, 0x7c, 0x6a, 0x82, 0xf1, 0xfd, 0xbd, 0x7b, 0x25, 0x63, - 0xeb, 0x85, 0x84, 0xca, 0x2e, 0x5f, 0x47, 0xe5, 0x1f, 0x40, 0x10, 0x19, - 0x4a, 0x10, 0xdd, 0x9d, 0x62, 0xff, 0x06, 0xbb, 0xef, 0x76, 0xdc, 0x03, - 0xdb, 0x14, 0x04, 0x6f, 0x13, 0xd1, 0x3a, 0x94, 0xd3, 0x36, 0xdd, 0xcf, - 0x36, 0xbf, 0x43, 0x2e, 0x71, 0x7b, 0x2f, 0x6e, 0x57, 0x06, 0x81, 0x75, - 0x12, 0x2a, 0x8d, 0x77, 0x1b, 0xd3, 0x58, 0xa7, 0xf9, 0x04, 0x99, 0x2c, - 0xeb, 0x8c, 0x93, 0x56, 0xa0, 0x21, 0x3b, 0x3b, 0x03, 0x1a, 0xf7, 0x06, - 0xe4, 0x56, 0x8e, 0x50, 0x28, 0x44, 0x81, 0x76, 0x44, 0x04, 0x5f, 0xad, - 0xa5, 0xc0, 0xa7, 0x3a, 0x91, 0x61, 0x18, 0x00, 0x0a, 0x2b, 0x0b, 0x43, - 0x44, 0x2d, 0x35, 0xd2, 0x3d, 0x88, 0x6c, 0xa2, 0x7b, 0xaa, 0x46, 0xab, - 0xb0, 0x7b, 0x33, 0xaf, 0x0a, 0x4b, 0x07, 0x41, 0xad, 0x65, 0x1d, 0x59, - 0x4c, 0xe0, 0xa8, 0x2a, 0x95, 0xb8, 0xd4, 0xaa, 0xd2, 0x31, 0xf4, 0x93, - 0xf0, 0x5e, 0xde, 0xc0, 0xb5, 0x0d, 0x73, 0x22, 0x93, 0xcc, 0x92, 0x59, - 0xdf, 0xe7, 0x40, 0xbb, 0x1b, 0x62, 0xdb, 0x11, 0xbf, 0x0f, 0x42, 0x1f, - 0x72, 0xa2, 0xb0, 0x90, 0x39, 0x1b, 0x7a, 0xab, 0x04, 0xed, 0x1f, 0x9d, - 0x08, 0xc9, 0x31, 0x07, 0xcd, 0x26, 0xf5, 0x9e, 0x87, 0x45, 0x4e, 0x43, - 0xc0, 0xe0, 0x5b, 0xaa, 0x79, 0xe4, 0x72, 0xe9, 0x1a, 0x8a, 0x3e, 0x81, - 0xf3, 0x4d, 0xa9, 0x7d, 0xef, 0x1c, 0xfe, 0xd5, 0xe9, 0xda, 0x8c, 0x67, - 0x69, 0xd7, 0x52, 0xb9, 0xc0, 0xda, 0xa2, 0x34, 0xa5, 0x14, 0x46, 0xd8, - 0x48, 0x41, 0xfa, 0xe2, 0x3a, 0x04, 0x33, 0xd1, 0x7c, 0xc9, 0x92, 0x71, - 0xde, 0xbd, 0x36, 0x90, 0x77, 0x09, 0xbd, 0xd5, 0x9e, 0xa7, 0x40, 0x8e, - 0x53, 0xf0, 0x46, 0x8b, 0x29, 0x8a, 0xbd, 0xb6, 0x33, 0x97, 0x78, 0xce, - 0xbd, 0xf5, 0xdb, 0x66, 0xe3, 0x39, 0x29, 0xfa, 0x1f, 0x7a, 0x62, 0x9c, - 0x87, 0x2c, 0xe9, 0x5e, 0x97, 0x92, 0xac, 0xb8, 0x96, 0xfe, 0x0e, 0xcb, - 0x7b, 0xf4, 0xbc, 0xd6, 0x0c, 0x33, 0xe7, 0x66, 0xae, 0x5f, 0x82, 0xf9, - 0x0d, 0x72, 0x8c, 0xed, 0x3d, 0xc1, 0x48, 0x57, 0x2b, 0x85, 0x52, 0x2e, - 0x04, 0xc7, 0xb0, 0x07, 0x1e, 0xe2, 0x96, 0xa1, 0x1f, 0x14, 0x11, 0x26, - 0x18, 0xdb, 0xc5, 0xf8, 0x37, 0x6a, 0x6a, 0xd5, 0x1f, 0x91, 0x0d, 0x49, - 0xf7, 0xb4, 0xc2, 0x33, 0x90, 0x47, 0xf9, 0x0e, 0x06, 0xe7, 0x0d, 0x2e, - 0xae, 0x0e, 0x8e, 0x42, 0x31, 0x6d, 0xe7, 0xfb, 0x5a, 0xc2, 0x72, 0x47, - 0xef, 0x84, 0xe0, 0x99, 0x2f, 0x4e, 0x5d, 0x19, 0x49, 0x6a, 0x4f, 0x62, - 0xae, 0x49, 0xb7, 0x1f, 0x87, 0x23, 0x98, 0xb9, 0xde, 0xce, 0xf8, 0x5d, - 0xfc, 0x8a, 0x03, 0xae, 0x7e, 0x3c, 0x7b, 0x05, 0xb0, 0x1c, 0x50, 0xe7, - 0xc1, 0x16, 0xb3, 0xa0, 0x21, 0x15, 0xba, 0xa3, 0x40, 0x33, 0xc6, 0x01, - 0x6f, 0x61, 0x19, 0x84, 0xab, 0x42, 0x11, 0xcf, 0x1f, 0xf7, 0xd0, 0xcd, - 0x72, 0xd8, 0x64, 0xd0, 0x8b, 0xb7, 0x8f, 0xe4, 0x17, 0xff, 0x6c, 0x95, - 0x9c, 0x2f, 0xbf, 0xa3, 0x47, 0x6c, 0x24, 0xa7, 0xfc, 0xa1, 0x67, 0xf0, - 0x90, 0xd6, 0x36, 0xa7, 0xc1, 0xcc, 0x8b, 0x42, 0x83, 0x98, 0xa6, 0xe6, - 0x4d, 0x87, 0xec, 0x48, 0x57, 0xc1, 0x5b, 0x14, 0xc0, 0x52, 0x1d, 0xde, - 0x6e, 0xae, 0xb0, 0xea, 0x8f, 0xb5, 0x28, 0x50, 0xe9, 0x2a, 0xcc, 0x86, - 0xbb, 0x3b, 0x97, 0xfb, 0xd0, 0xa6, 0x28, 0x43, 0x3a, 0x16, 0xb5, 0xbd, - 0x32, 0x35, 0xf5, 0x95, 0x00, 0x13, 0x7b, 0x5a, 0x34, 0x9b, 0x9b, 0x56, - 0xe6, 0x9c, 0xd7, 0x2e, 0x2f, 0xda, 0xff, 0x88, 0x9f, 0xc7, 0xa9, 0xdc, - 0x59, 0x18, 0x40, 0xbf, 0xcd, 0xb8, 0x22, 0x26, 0x13, 0xda, 0x8b, 0x3d, - 0x28, 0x32, 0xfe, 0x91, 0x59, 0x84, 0x25, 0xfe, 0xaf, 0xed, 0x5f, 0x52, - 0xd5, 0xc2, 0x57, 0x30, 0xa5, 0xa6, 0x15, 0xa0, 0xd9, 0xd0, 0xb2, 0xc3, - 0xf1, 0xe0, 0x24, 0xcf, 0x4f, 0x03, 0xe4, 0x03, 0xc9, 0x4f, 0xb9, 0xb2, - 0xd5, 0xf9, 0x28, 0x09, 0x87, 0x9a, 0x24, 0x17, 0x64, 0x77, 0x0f, 0x3c, - 0x96, 0x55, 0xf7, 0xb8, 0x9d, 0xe7, 0xf3, 0xc6, 0x98, 0xfa, 0xbb, 0x49, - 0xc3, 0x2c, 0x4b, 0x59, 0xc0, 0x1a, 0x81, 0x41, 0x7d, 0x76, 0xee, 0x3c, - 0xc1, 0xdd, 0xc5, 0x2f, 0x77, 0x35, 0xa5, 0x0c, 0xc4, 0xdc, 0x2d, 0xac, - 0x95, 0x01, 0x93, 0x93, 0x8c, 0x09, 0xaa, 0x29, 0x58, 0xbb, 0x2f, 0xac, - 0x7a, 0xfa, 0x8b, 0x6a, 0xf4, 0x66, 0xff, 0x77, 0x33, 0xb6, 0x80, 0x5d, - 0xad, 0x1a, 0x9a, 0x5a, 0xc9, 0xeb, 0xfc, 0xcd, 0xbf, 0xe2, 0xd1, 0xe0, - 0x5f, 0x15, 0x58, 0xe3, 0x6b, 0x16, 0xc4, 0x87, 0x90, 0xb2, 0x83, 0x9a, - 0x31, 0x7a, 0xbe, 0xea, 0x28, 0xa9, 0xad, 0x23, 0xd5, 0xf4, 0x93, 0x4d, - 0x07, 0xa5, 0x16, 0x9c, 0xe1, 0x01, 0x9e, 0xc9, 0x87, 0x53, 0xad, 0xd7, - 0xbd, 0x8e, 0x00, 0x99, 0x37, 0x22, 0xd6, 0xa5, 0x75, 0xf8, 0x99, 0x15, - 0x30, 0xe4, 0xc4, 0x1a, 0x92, 0xad, 0xea, 0x02, 0xef, 0x90, 0xc9, 0x6a, - 0x76, 0xff, 0x91, 0x1a, 0xfd, 0x2b, 0x6c, 0xae, 0xfa, 0xe2, 0x70, 0x20, - 0xad, 0x70, 0x66, 0xd5, 0xf7, 0x04, 0x2a, 0x8c, 0x1c, 0x4b, 0xd9, 0x6d, - 0xab, 0x93, 0x24, 0xf5, 0x56, 0xc5, 0xb5, 0xa2, 0x58, 0x63, 0x5b, 0x2d, - 0x00, 0x24, 0xf6, 0xf7, 0x6d, 0xdc, 0x80, 0x7c, 0x82, 0xfd, 0x84, 0xfa, - 0xa8, 0x77, 0xe5, 0x98, 0x2d, 0x24, 0x9b, 0x5b, 0xc1, 0xc3, 0xc6, 0x4a, - 0x1e, 0x96, 0x8f, 0x82, 0xf6, 0x10, 0x3a, 0x87, 0xec, 0xc6, 0x4a, 0xa6, - 0x40, 0x38, 0x24, 0x0a, 0x48, 0x40, 0x05, 0x6c, 0x1a, 0x78, 0xb6, 0xe2, - 0xb4, 0xc0, 0x74, 0x14, 0x50, 0xba, 0x43, 0xe6, 0x7a, 0x43, 0xbe, 0x43, - 0x75, 0xc8, 0x4a, 0xc2, 0x89, 0x89, 0x22, 0xa6, 0xe7, 0x9b, 0x66, 0x25, - 0x7a, 0x79, 0xbf, 0xf9, 0x4e, 0xb0, 0xea, 0x1a, 0x83, 0xa9, 0x63, 0x0a, - 0xdc, 0xe3, 0x89, 0x4b, 0xd9, 0x7c, 0x8f, 0xcb, 0xc2, 0x05, 0x3d, 0x86, - 0x05, 0x8a, 0xab, 0x7c, 0x9a, 0xe3, 0xd3, 0x21, 0x0a, 0x79, 0xb7, 0xf5, - 0xb1, 0x84, 0x78, 0x58, 0x15, 0x40, 0x07, 0x36, 0x54, 0xc5, 0xe3, 0x4f, - 0xb1, 0x2f, 0xb5, 0xb7, 0x6f, 0x30, 0x8d, 0x9e, 0xe9, 0xd9, 0x9a, 0x4d, - 0xee, 0x11, 0x09, 0xb3, 0x78, 0xb5, 0x43, 0x1a, 0x7c, 0xab, 0x7e, 0xa7, - 0x36, 0xfd, 0x3f, 0xed, 0xee, 0xf8, 0x14, 0x46, 0x42, 0xf1, 0x45, 0x97, - 0x07, 0x9a, 0xc1, 0xcb, 0x43, 0xca, 0xeb, 0xf0, 0x27, 0xa3, 0x13, 0x75, - 0x7f, 0x9d, 0x0b, 0x06, 0x37, 0x8f, 0xf5, 0x93, 0x72, 0x6b, 0x5e, 0xcc, - 0xdd, 0x5e, 0xcd, 0x15, 0xa3, 0x82, 0xd3, 0xa5, 0x61, 0x8d, 0x36, 0x39, - 0xd3, 0x5e, 0x7f, 0x25, 0x98, 0x43, 0x44, 0xbc, 0x5e, 0xc6, 0xac, 0xa5, - 0xb2, 0xff, 0x6e, 0x34, 0x6d, 0xe7, 0x68, 0x16, 0x23, 0x48, 0xd9, 0x1b, - 0x44, 0x95, 0xa8, 0x44, 0x1d, 0x93, 0x81, 0x24, 0x8b, 0x69, 0x87, 0x04, - 0x4e, 0x0c, 0x51, 0xd5, 0x0a, 0x14, 0x50, 0x83, 0x72, 0x31, 0xee, 0xcc, - 0xf5, 0xb6, 0xe6, 0x6c, 0x06, 0xaa, 0xe5, 0xa0, 0xde, 0xb5, 0xbc, 0x1e, - 0xee, 0x8d, 0x71, 0xe3, 0xc0, 0x75, 0x3c, 0x55, 0x4d, 0xa4, 0x31, 0x39, - 0xa8, 0xd4, 0x87, 0x5c, 0x05, 0x04, 0x3c, 0x43, 0x21, 0x9f, 0xaa, 0x6f, - 0x08, 0x72, 0x92, 0xc1, 0xd5, 0x89, 0xbd, 0xff, 0xf7, 0xf2, 0xbd, 0x14, - 0x77, 0x17, 0x6a, 0xed, 0xd5, 0x61, 0x81, 0x32, 0xb2, 0x91, 0x35, 0xbf, - 0xff, 0x1d, 0x8c, 0xe1, 0xc4, 0x4b, 0x7e, 0x64, 0x5c, 0xd2, 0x2c, 0x93, - 0x40, 0x6e, 0xdf, 0x08, 0x6d, 0xc6, 0xf4, 0x68, 0xd6, 0x98, 0xd3, 0x12, - 0xc9, 0x9e, 0x1c, 0xe9, 0x69, 0x1c, 0xca, 0x4f, 0xcf, 0x0f, 0x70, 0x2d, - 0x05, 0x15, 0x6b, 0xcc, 0xfc, 0x39, 0xef, 0xef, 0x40, 0xef, 0xc5, 0x47, - 0x6d, 0xb0, 0xdc, 0xce, 0x99, 0x87, 0xb0, 0xea, 0x84, 0x61, 0xd5, 0x9e, - 0xb0, 0xf9, 0x6e, 0xf5, 0x58, 0x9a, 0x2e, 0x81, 0x99, 0xb8, 0x5f, 0x9f, - 0x26, 0xd7, 0xf9, 0x83, 0xdb, 0xca, 0xda, 0x68, 0xc6, 0xcc, 0x5d, 0xca, - 0x42, 0x45, 0xf0, 0xa6, 0x1d, 0x55, 0xa6, 0x56, 0xf2, 0xc1, 0x03, 0xf6, - 0x67, 0x52, 0x92, 0xa5, 0x7d, 0x6f, 0xbe, 0x83, 0x63, 0x75, 0x12, 0x8c, - 0x97, 0xdb, 0xe6, 0x24, 0x54, 0x52, 0x41, 0xfa, 0x4d, 0x05, 0x05, 0xf2, - 0x18, 0xe5, 0xe3, 0xf7, 0x41, 0x3e, 0x1e, 0xe4, 0xb6, 0xf4, 0xb7, 0xcf, - 0x40, 0x38, 0x93, 0x8a, 0x07, 0xd5, 0x45, 0x71, 0xf1, 0x88, 0x02, 0xfb, - 0x02, 0x49, 0x87, 0x03, 0x65, 0xbb, 0xf9, 0x17, 0x66, 0xf6, 0xe3, 0x0d, - 0x63, 0xc9, 0xda, 0x94, 0xbf, 0xc3, 0xfa, 0xad, 0x0a, 0xe2, 0xad, 0x9f, - 0x40, 0x00, 0xfd, 0xe5, 0x2d, 0x2a, 0x21, 0x1f, 0x37, 0xd7, 0x98, 0x9b, - 0x21, 0xb7, 0x09, 0xaf, 0x55, 0x75, 0x0d, 0x4e, 0x28, 0x67, 0x8e, 0xb5, - 0xd4, 0xc0, 0xe1, 0x2f, 0x4a, 0xbf, 0x93, 0x6f, 0x3a, 0xaf, 0x79, 0x45, - 0x9b, 0xca, 0xc9, 0xcc, 0xea, 0x1c, 0x32, 0xf0, 0xaa, 0x96, 0x44, 0x73, - 0xbd, 0x32, 0x56, 0x81, 0x12, 0x17, 0x25, 0x4d, 0x83, 0xeb, 0x1e, 0x2f, - 0x62, 0x18, 0x4f, 0x68, 0x2e, 0x36, 0xb8, 0xa9, 0xa8, 0xb9, 0x57, 0x6c, - 0x51, 0x36, 0xe4, 0x19, 0x7b, 0x59, 0x4a, 0x6a, 0xb0, 0xfa, 0xce, 0x2b, - 0x02, 0xa4, 0x14, 0x53, 0x4e, 0xcd, 0x45, 0x3c, 0xf8, 0xfc, 0x21, 0xb8, - 0x18, 0x38, 0x58, 0xb0, 0x44, 0x0c, 0x3c, 0x77, 0x6c, 0x61, 0x57, 0x93, - 0x03, 0xf2, 0xe7, 0x3a, 0x6e, 0xe3, 0xd6, 0xe4, 0xe7, 0x7d, 0x4b, 0xc3, - 0x8e, 0xe8, 0xe7, 0xdb, 0x4e, 0xbb, 0x98, 0x0b, 0x53, 0x1c, 0x9b, 0x1b, - 0x41, 0x9e, 0xdf, 0xa4, 0xc5, 0x8f, 0xde, 0xe8, 0xd3, 0x3b, 0xb3, 0x18, - 0x9a, 0x74, 0xb6, 0x58, 0x7f, 0x8d, 0xa8, 0x93, 0x70, 0xf1, 0x1a, 0x72, - 0xa6, 0x36, 0x7c, 0xf6, 0xac, 0xd3, 0xf6, 0xd4, 0xd0, 0xf8, 0xd8, 0xb7, - 0xd7, 0x76, 0xbc, 0xed, 0x40, 0x20, 0x32, 0x3a, 0xf0, 0xff, 0xe3, 0x82, - 0x4f, 0xb7, 0xc6, 0x5c, 0x47, 0x8d, 0xdb, 0x93, 0x01, 0xed, 0x25, 0xff, - 0x7e, 0x07, 0xf3, 0xec, 0x27, 0xe7, 0x7e, 0x54, 0x95, 0x1b, 0xfc, 0xb3, - 0x57, 0xd4, 0x0c, 0xa6, 0xcd, 0xc3, 0x66, 0x0c, 0xb2, 0x5b, 0xcd, 0xa4, - 0xc5, 0xf5, 0x9b, 0x2b, 0xe9, 0xe6, 0x01, 0x32, 0x46, 0x51, 0xea, 0xba, - 0xe0, 0x4f, 0xfa, 0xea, 0xfc, 0x2d, 0xdf, 0x3d, 0xb8, 0xf2, 0xb6, 0xde, - 0x1a, 0xa9, 0xfb, 0xbe, 0x0f, 0xea, 0x53, 0x5e, 0x29, 0xf7, 0x48, 0x68, - 0xcd, 0xae, 0xd8, 0xf0, 0xb2, 0xba, 0x7b, 0x16, 0xc0, 0x66, 0x90, 0xdb, - 0x38, 0xcc, 0xe0, 0x99, 0xdd, 0xfd, 0x80, 0xcf, 0x5c, 0xcb, 0xb6, 0x4a, - 0x86, 0xf3, 0x3e, 0x0c, 0x81, 0x66, 0x73, 0x70, 0x1c, 0x04, 0x60, 0x80, - 0x52, 0xa1, 0xb4, 0xf7, 0x53, 0xba, 0x3a, 0x6a, 0xc2, 0x60, 0x43, 0xa3, - 0x7b, 0xa3, 0x6e, 0x14, 0x6c, 0xd9, 0x17, 0xc4, 0x44, 0x52, 0x3b, 0x43, - 0xcf, 0xb5, 0xd9, 0x81, 0x90, 0xa6, 0x52, 0x4a, 0x23, 0xe0, 0x36, 0x92, - 0x64, 0x5e, 0x55, 0xfa, 0x72, 0x71, 0x60, 0x28, 0x33, 0xf8, 0xe9, 0x61, - 0xb4, 0xb9, 0x89, 0xf0, 0x6f, 0x42, 0x46, 0x34, 0x2e, 0x7f, 0x8d, 0xcf, - 0x81, 0xa6, 0x3c, 0xd0, 0x0b, 0x2d, 0x4a, 0x4a, 0x07, 0x06, 0x13, 0x4a, - 0x8b, 0x59, 0xb2, 0xfe, 0x45, 0xe4, 0x52, 0xf8, 0x45, 0x27, 0x95, 0x38, - 0x96, 0xde, 0x36, 0xff, 0xb5, 0xfb, 0x5a, 0xec, 0x1c, 0x18, 0x5d, 0x00, - 0xf1, 0x5f, 0x89, 0x66, 0x26, 0x81, 0x1f, 0x03, 0x7e, 0x88, 0x86, 0xac, - 0x41, 0x4e, 0x3e, 0x8f, 0xca, 0xa2, 0x2b, 0x34, 0xae, 0xf4, 0x5d, 0x7c, - 0x00, 0xa3, 0x9e, 0xb0, 0xb4, 0x74, 0x04, 0x11, 0x1e, 0xe5, 0xc5, 0x3f, - 0xa2, 0x5f, 0x62, 0x5c, 0xc7, 0x9d, 0xf1, 0x14, 0x30, 0xbb, 0x7b, 0xe4, - 0xa3, 0x1f, 0xf1, 0xd2, 0xba, 0x7e, 0x58, 0x9d, 0xd1, 0xfe, 0x8f, 0x40, - 0x57, 0x14, 0x76, 0xde, 0x4b, 0xdb, 0xdc, 0xcb, 0x22, 0x1d, 0x11, 0xcd, - 0x40, 0xa0, 0x4b, 0xee, 0x5d, 0x62, 0x82, 0x9d, 0xfc, 0xf3, 0xe2, 0xd5, - 0x7d, 0x2c, 0x60, 0x3c, 0xad, 0x71, 0x4f, 0x65, 0xa2, 0xe3, 0x67, 0x6c, - 0xa4, 0x92, 0xd5, 0xc8, 0xaa, 0x6f, 0xc1, 0x2d, 0x0f, 0x3a, 0xf9, 0x2f, - 0x14, 0xad, 0xd7, 0xba, 0x46, 0x0b, 0x3d, 0xfc, 0x3d, 0x5d, 0xf7, 0xe0, - 0xc4, 0x1c, 0xcc, 0x1c, 0x81, 0x1b, 0xf5, 0x80, 0x2b, 0x85, 0x85, 0x62, - 0x78, 0x66, 0xb8, 0x92, 0xab, 0x97, 0x4e, 0x99, 0xb8, 0x99, 0x56, 0x84, - 0x8c, 0x7a, 0x88, 0x36, 0x0a, 0xe4, 0xfd, 0x44, 0xec, 0xfa, 0x47, 0xda, - 0xd2, 0xb1, 0xef, 0x81, 0xd5, 0xfe, 0x1b, 0x8f, 0xcb, 0x95, 0x01, 0xc6, - 0xc7, 0xc7, 0x1f, 0x74, 0x8a, 0x2e, 0x39, 0x23, 0xc0, 0x59, 0x0f, 0x6d, - 0x00, 0xe8, 0x3d, 0xfd, 0xd9, 0xb5, 0x28, 0x2c, 0x73, 0xdb, 0xfa, 0x79, - 0x56, 0x7b, 0xa2, 0xc1, 0x2a, 0x6c, 0x52, 0x9e, 0xd3, 0xd4, 0x89, 0x5d, - 0x8e, 0x73, 0x15, 0xe9, 0x9e, 0xb2, 0xe7, 0xdc, 0xa8, 0x3e, 0x71, 0x39, - 0x1c, 0x61, 0xf3, 0xd2, 0xcf, 0x11, 0x63, 0x00, 0x8a, 0x1a, 0xc4, 0x4f, - 0xdc, 0x06, 0x99, 0x67, 0x61, 0x89, 0xf5, 0x95, 0xa6, 0xd6, 0xbb, 0x73, - 0xcb, 0x51, 0xed, 0x8b, 0xb0, 0x99, 0x0a, 0x89, 0xd3, 0xb1, 0x3b, 0x17, - 0x83, 0x86, 0x13, 0x8a, 0xc2, 0x1d, 0x45, 0x3f, 0xe4, 0x2e, 0x06, 0xfe, - 0x3b, 0x36, 0xc5, 0x81, 0x9f, 0xce, 0xb3, 0x13, 0xa3, 0x6c, 0x84, 0x2b, - 0x3c, 0x55, 0xa3, 0x36, 0x3c, 0x9a, 0x8c, 0xea, 0x01, 0xdd, 0x8e, 0x59, - 0x22, 0x4e, 0xaf, 0xf5, 0xed, 0x1f, 0x5a, 0xf0, 0x74, 0x59, 0x0f, 0xd4, - 0xba, 0x04, 0xc4, 0x6e, 0xf8, 0x4a, 0x95, 0x38, 0x96, 0x23, 0xd6, 0x21, - 0xc5, 0x0e, 0x3c, 0x43, 0xca, 0x04, 0xf1, 0xb7, 0x52, 0xce, 0x30, 0x46, - 0x67, 0x39, 0x8b, 0x66, 0x88, 0x3a, 0xae, 0xc3, 0xe0, 0x95, 0x42, 0xd8, - 0x5c, 0xc5, 0x18, 0x4c, 0x32, 0x26, 0x2b, 0xfc, 0xd4, 0xe3, 0xd4, 0x0e, - 0x6b, 0x78, 0x73, 0x1c, 0xb8, 0x42, 0xcb, 0xb3, 0x69, 0x86, 0xc9, 0xd4, - 0xa8, 0x96, 0xa1, 0x8e, 0xff, 0xdb, 0xb0, 0x03, 0x8c, 0xac, 0x09, 0x27, - 0xab, 0xef, 0xa5, 0x51, 0x01, 0xec, 0xe6, 0x03, 0x4a, 0x30, 0x21, 0x47, - 0x97, 0x7b, 0xba, 0x7a, 0x78, 0xe4, 0x85, 0x83, 0x91, 0x7c, 0x15, 0xad, - 0xec, 0x56, 0x38, 0x77, 0xfc, 0xd0, 0x2b, 0x39, 0x81, 0x04, 0xbb, 0xbc, - 0xe1, 0xff, 0x5f, 0xf1, 0xf0, 0xe5, 0x4b, 0xd6, 0xfa, 0x28, 0x20, 0x53, - 0x90, 0x63, 0x70, 0xa6, 0x7c, 0xbf, 0xc7, 0x4c, 0xa5, 0xe9, 0xd4, 0x60, - 0x0e, 0x87, 0xa7, 0x2b, 0x1d, 0xa4, 0x0b, 0x9d, 0x0c, 0x53, 0xde, 0x4c, - 0xa9, 0x93, 0x7b, 0x00, 0x23, 0x5c, 0xd3, 0xae, 0xce, 0x63, 0x28, 0x55, - 0x99, 0x50, 0x6a, 0xe1, 0x89, 0xc3, 0x31, 0x01, 0x16, 0x0c, 0x91, 0x8b, - 0xab, 0x0e, 0xa7, 0x4f, 0x48, 0xd5, 0x9a, 0xc7, 0x12, 0x51, 0x63, 0x4c, - 0x40, 0x16, 0xc6, 0xc6, 0x63, 0x38, 0x42, 0x29, 0xde, 0x4b, 0x88, 0x30, - 0x3d, 0xee, 0x46, 0xe9, 0x1b, 0x42, 0x3b, 0x3f, 0xb4, 0x0a, 0x4c, 0x25, - 0x5a, 0x26, 0x74, 0x82, 0x33, 0xfa, 0xf9, 0x86, 0x33, 0xaa, 0x13, 0x4b, - 0x50, 0xd8, 0x3a, 0x5f, 0x77, 0x6d, 0xae, 0xb7, 0x2b, 0x4c, 0xb4, 0x91, - 0x05, 0x78, 0xf3, 0x50, 0x65, 0x46, 0x77, 0xe7, 0x8e, 0x52, 0x81, 0x25, - 0x2c, 0xe2, 0xdc, 0x0a, 0x5f, 0x27, 0x87, 0x64, 0xbb, 0xaa, 0x67, 0x23, - 0xfb, 0xed, 0x75, 0xfc, 0xf3, 0x8f, 0x72, 0x6e, 0x41, 0x3a, 0x1c, 0x9c, - 0x2a, 0x30, 0x41, 0x14, 0xd7, 0xb1, 0x1d, 0x88, 0x94, 0xbc, 0xd8, 0xbe, - 0xbb, 0xee, 0x7e, 0xda, 0xf7, 0x09, 0x39, 0x1c, 0x85, 0x47, 0xfa, 0x7d, - 0x88, 0x54, 0x27, 0xb1, 0x21, 0x6c, 0x77, 0xf8, 0xbd, 0x47, 0xcb, 0xe3, - 0xf7, 0x29, 0xc9, 0x8d, 0x0a, 0x40, 0xbd, 0xe9, 0x2e, 0x6c, 0x31, 0x13, - 0x1d, 0xfa, 0xb2, 0x68, 0x34, 0xaf, 0x9f, 0x5f, 0xa3, 0xe8, 0xe0, 0x17, - 0x4a, 0xed, 0x40, 0x6a, 0x12, 0x48, 0x1d, 0xdd, 0x0c, 0xcb, 0x1b, 0x4e, - 0x34, 0xb8, 0xd2, 0x64, 0xaa, 0x67, 0x52, 0xf1, 0x1a, 0x27, 0x25, 0x8c, - 0x3a, 0x4f, 0x68, 0x72, 0x72, 0x68, 0x3f, 0x09, 0x96, 0xf2, 0xe0, 0x8d, - 0xda, 0x41, 0x17, 0x6d, 0xb0, 0x14, 0x7d, 0xc9, 0xa0, 0xd2, 0xeb, 0x1b, - 0x5c, 0x1d, 0x87, 0xf5, 0x3f, 0x70, 0x3c, 0xc9, 0x1d, 0xd3, 0x41, 0xb0, - 0x45, 0xf1, 0x3c, 0xcd, 0x75, 0xef, 0x2a, 0x08, 0x96, 0x6a, 0x0d, 0x7d, - 0x51, 0x4a, 0x20, 0x8e, 0x76, 0x2e, 0xf1, 0x66, 0xf7, 0x68, 0xc5, 0xc9, - 0xba, 0xfc, 0x4a, 0x15, 0x45, 0x1f, 0x1b, 0xd8, 0xc5, 0xf3, 0xf1, 0xcd, - 0xa2, 0x05, 0x18, 0x80, 0xb9, 0x01, 0xc5, 0x29, 0xbe, 0x5c, 0x8e, 0x07, - 0x3b, 0xf0, 0x26, 0x14, 0xea, 0x4b, 0x8f, 0x77, 0xb5, 0x03, 0xac, 0x0e, - 0x59, 0xd5, 0x53, 0x2c, 0x2e, 0x54, 0x93, 0x79, 0xf1, 0xfc, 0x7d, 0x01, - 0x57, 0xd1, 0x21, 0xc6, 0x18, 0x82, 0x1f, 0xb9, 0xb2, 0xf8, 0x0c, 0x04, - 0x1a, 0x0b, 0xbd, 0x1d, 0x7b, 0x52, 0x2f, 0x81, 0x06, 0x66, 0x2c, 0x60, - 0xb9, 0xa4, 0xf1, 0xcd, 0x63, 0xe1, 0x72, 0x4d, 0xd8, 0xe5, 0xd7, 0xa4, - 0x16, 0x85, 0xa5, 0xaf, 0xfe, 0x3e, 0x8d, 0xae, 0x8b, 0xe8, 0x6d, 0xdd, - 0x81, 0x65, 0x36, 0x7b, 0xa1, 0x1d, 0x83, 0x25, 0xfa, 0x82, 0x16, 0xc6, - 0x12, 0xe2, 0xbd, 0x0a, 0x7d, 0xb5, 0x6b, 0xf2, 0xb1, 0xad, 0x37, 0x59, - 0x7c, 0x25, 0xf8, 0xd9, 0xff, 0x63, 0x2d, 0xa1, 0x54, 0x28, 0x03, 0xa9, - 0x8b, 0x4c, 0x2f, 0x48, 0xfe, 0x94, 0xf8, 0xf1, 0x86, 0x1e, 0x08, 0xea, - 0xa7, 0x78, 0x3c, 0x0f, 0x6f, 0xa1, 0x02, 0xf8, 0x2c, 0x9d, 0xf3, 0x42, - 0xa0, 0xd0, 0x7b, 0x7d, 0xfa, 0x23, 0x48, 0x5a, 0x0e, 0x25, 0x39, 0x7f, - 0xc8, 0x0f, 0x98, 0x69, 0xa4, 0xf5, 0x40, 0xd6, 0x25, 0x27, 0xe6, 0x47, - 0x25, 0x7c, 0x4a, 0xaf, 0x8b, 0x13, 0x9e, 0x97, 0x67, 0xc5, 0xfa, 0xad, - 0xea, 0x51, 0x4e, 0x4a, 0x7a, 0x59, 0x94, 0x1c, 0x75, 0xcd, 0x9e, 0x62, - 0x6d, 0x70, 0xc7, 0x8f, 0x62, 0xcf, 0x48, 0xa8, 0xbf, 0x40, 0xff, 0x02, - 0xe2, 0x16, 0x18, 0x1f, 0xf2, 0x5e, 0xfc, 0x02, 0x70, 0x4b, 0x21, 0x9f, - 0x70, 0xc0, 0x19, 0x97, 0x83, 0x4f, 0xac, 0x20, 0xf8, 0x5a, 0x7d, 0x38, - 0x4e, 0xe9, 0x0a, 0x2e, 0xec, 0x64, 0x2c, 0xbe, 0x58, 0x61, 0x52, 0x4c, - 0x06, 0x2a, 0x3b, 0xf2, 0x22, 0xa2, 0xcd, 0xdb, 0xd8, 0x3b, 0x15, 0x8a, - 0xa8, 0x34, 0xe3, 0x75, 0x3b, 0xd9, 0xb7, 0x57, 0x2d, 0xe6, 0xe1, 0xee, - 0xf7, 0x43, 0x78, 0xe6, 0x9a, 0x38, 0xdb, 0x7d, 0x81, 0xd7, 0xbe, 0xf8, - 0x22, 0x49, 0x69, 0xd4, 0x57, 0x25, 0xe3, 0x8f, 0x75, 0x8d, 0xfa, 0xba, - 0xf3, 0x31, 0x52, 0x3e, 0x6d, 0xa4, 0xc8, 0xf3, 0x18, 0x75, 0xf8, 0x5a, - 0xb6, 0x9b, 0x47, 0x0b, 0xca, 0x65, 0x7a, 0x72, 0x63, 0xfd, 0x93, 0x11, - 0x6a, 0x6b, 0x52, 0xc4, 0x09, 0x52, 0x63, 0xf0, 0xad, 0x3b, 0x35, 0xf6, - 0x23, 0xbe, 0xd3, 0x45, 0x5b, 0x23, 0xd5, 0x96, 0x47, 0x70, 0x2a, 0x83, - 0x74, 0x6c, 0x25, 0xd7, 0x18, 0x7e, 0xc0, 0x19, 0x35, 0x1d, 0x6d, 0xaf, - 0x16, 0x24, 0x6d, 0x6f, 0xdc, 0xa3, 0x8a, 0xa6, 0x57, 0x0f, 0x6a, 0xc0, - 0x73, 0x4a, 0x97, 0x85, 0xdd, 0x3c, 0xa2, 0x9c, 0xd6, 0xaf, 0x9d, 0xb6, - 0xee, 0x22, 0x9f, 0x00, 0x55, 0x45, 0xed, 0x43, 0x14, 0xed, 0x63, 0xa0, - 0x1f, 0xf6, 0xdf, 0xed, 0xae, 0xf7, 0xc0, 0x93, 0xf2, 0xb6, 0xf0, 0x6b, - 0x17, 0x32, 0x93, 0x22, 0x91, 0xa0, 0xec, 0x9c, 0xc2, 0xb0, 0x43, 0x18, - 0xdc, 0xa6, 0x08, 0xa2, 0x87, 0x18, 0x8a, 0x79, 0x82, 0x63, 0x7a, 0x78, - 0xc3, 0x73, 0xf9, 0x97, 0xc1, 0x85, 0x95, 0x13, 0xab, 0xdd, 0xa8, 0x58, - 0xe9, 0x5b, 0x71, 0xed, 0xe9, 0x76, 0x97, 0x10, 0xc9, 0x49, 0x07, 0xa5, - 0xa9, 0x4f, 0xaf, 0xea, 0xa0, 0x49, 0x40, 0xb5, 0x2e, 0x00, 0x09, 0x24, - 0x55, 0xb2, 0xc3, 0x24, 0x88, 0x50, 0x75, 0xa1, 0x13, 0xb5, 0x19, 0xd9, - 0xc6, 0xa3, 0x16, 0x29, 0xe7, 0xde, 0xcd, 0xbd, 0x99, 0xe4, 0x58, 0xac, - 0x36, 0x74, 0x29, 0x72, 0x08, 0x8a, 0x19, 0x4b, 0xae, 0xed, 0x0e, 0x9e, - 0x57, 0x2c, 0x48, 0xd8, 0x4d, 0x64, 0x84, 0xf4, 0xcf, 0x62, 0xc6, 0x5f, - 0xb9, 0xb4, 0x90, 0x3f, 0x85, 0x36, 0x65, 0xe0, 0xc2, 0x26, 0xff, 0x7d, - 0x4d, 0xb1, 0x01, 0x76, 0x98, 0xc0, 0xf0, 0xde, 0x16, 0x80, 0x49, 0x2b, - 0x4d, 0x0c, 0x34, 0xf1, 0xda, 0x89, 0xda, 0x73, 0x16, 0x49, 0x8b, 0x6e, - 0xf4, 0x0f, 0x5b, 0xe4, 0x07, 0xf7, 0xee, 0xe2, 0x37, 0x30, 0x10, 0x92, - 0x84, 0xbd, 0x73, 0x3a, 0x36, 0x5b, 0x1b, 0xcb, 0xdb, 0xb0, 0x43, 0x39, - 0x34, 0x66, 0x06, 0x22, 0x0e, 0x88, 0x53, 0xc4, 0xbc, 0x52, 0xcb, 0x7c, - 0x0c, 0xf4, 0x2a, 0x06, 0xbd, 0x19, 0xcf, 0x82, 0x8d, 0xd7, 0x00, 0xbd, - 0x19, 0x03, 0xf9, 0x47, 0x3d, 0xc2, 0x19, 0x1d, 0x33, 0xeb, 0xcd, 0x40, - 0x6b, 0x63, 0x56, 0xcb, 0x89, 0x9a, 0xf6, 0x5f, 0x84, 0x16, 0x96, 0x5f, - 0xb6, 0x20, 0x64, 0x57, 0x78, 0x56, 0xe6, 0xe0, 0x99, 0x4c, 0x70, 0xee, - 0x7d, 0xeb, 0x8a, 0x9a, 0xcb, 0x03, 0x3b, 0xad, 0x23, 0xaf, 0x25, 0x03, - 0x53, 0x78, 0xe3, 0x53, 0xf3, 0x84, 0x2c, 0x38, 0xdc, 0x40, 0x55, 0x33, - 0xa9, 0xc3, 0x62, 0xfb, 0x0a, 0xf6, 0xed, 0xdf, 0xd7, 0xad, 0xee, 0xb5, - 0xb2, 0x3f, 0x41, 0x1c, 0x11, 0xc7, 0xdd, 0xe7, 0x31, 0xec, 0x70, 0x6b, - 0xbc, 0xe6, 0x9a, 0xb5, 0xe2, 0xee, 0xfa, 0xeb, 0x49, 0xed, 0x7e, 0x15, - 0xe5, 0x09, 0x75, 0x51, 0x80, 0x64, 0xe3, 0x45, 0x66, 0xbf, 0xba, 0xaf, - 0xe5, 0xb5, 0xc2, 0xe1, 0xc6, 0x78, 0x70, 0x5d, 0xda, 0xaa, 0x93, 0x03, - 0xbd, 0xab, 0x3b, 0x48, 0x30, 0xcb, 0x78, 0xe1, 0x94, 0x56, 0x5e, 0xa8, - 0x4f, 0x4a, 0xf8, 0xdd, 0x54, 0x2b, 0xda, 0xcf, 0x89, 0x49, 0x01, 0xae, - 0x3c, 0xd2, 0xee, 0xe0, 0xc1, 0x8c, 0x1c, 0x9e, 0x4c, 0xbc, 0xe5, 0x3e, - 0x4e, 0xd6, 0x49, 0x5f, 0xdf, 0x49, 0xc6, 0xb8, 0x31, 0x2a, 0x9c, 0x51, - 0xbb, 0x05, 0x21, 0xbc, 0x12, 0x3a, 0x57, 0xc6, 0xf4, 0x94, 0x18, 0x95, - 0xe7, 0xfa, 0x5f, 0x57, 0xe5, 0xcf, 0xed, 0x9e, 0xa2, 0xa3, 0x57, 0x75, - 0x2c, 0xac, 0xe8, 0x16, 0x2b, 0x28, 0x59, 0x19, 0x6c, 0x5d, 0x8e, 0x6d, - 0x83, 0x5b, 0x66, 0x94, 0x41, 0x10, 0x54, 0x94, 0xac, 0x31, 0x2b, 0xec, - 0xdf, 0xd0, 0x8d, 0x91, 0x24, 0x27, 0xf0, 0xdd, 0x83, 0x83, 0xa5, 0x67, - 0x1c, 0xa5, 0xc5, 0xb9, 0x46, 0xb1, 0x01, 0x0b, 0xd8, 0x90, 0x08, 0xe1, - 0x8d, 0xc7, 0x44, 0x48, 0x93, 0x3c, 0x38, 0xdf, 0x56, 0x83, 0x99, 0xf5, - 0x79, 0xe8, 0xb2, 0x72, 0xb7, 0x35, 0x45, 0xae, 0xfb, 0xc0, 0x4d, 0x72, - 0x18, 0xcc, 0xcb, 0x6b, 0xc0, 0xd8, 0xf7, 0x5f, 0x12, 0xb5, 0xcb, 0xdb, - 0x86, 0x81, 0xfb, 0x97, 0x31, 0x77, 0xfe, 0x1b, 0xb7, 0x27, 0xdb, 0x76, - 0x07, 0x86, 0x80, 0x76, 0x72, 0x2e, 0xa4, 0x05, 0xed, 0x0c, 0x2b, 0xa7, - 0xe0, 0xde, 0x59, 0x57, 0x90, 0x58, 0x38, 0xae, 0x4e, 0xdc, 0x5f, 0xc8, - 0x73, 0x9c, 0xc4, 0xfb, 0x69, 0x7e, 0x79, 0x53, 0x1e, 0x60, 0x5d, 0x16, - 0x12, 0x10, 0x40, 0x1e, 0x66, 0xc0, 0x6b, 0x5f, 0x68, 0x6b, 0x7b, 0x0d, - 0x84, 0x09, 0x33, 0x66, 0x9a, 0x44, 0xec, 0x8d, 0x91, 0xe4, 0x8a, 0x6f, - 0x26, 0x65, 0xa2, 0xba, 0xca, 0x5f, 0xc0, 0xfb, 0x36, 0x93, 0xea, 0x35, - 0x62, 0xb6, 0x9a, 0xda, 0x43, 0x55, 0xc7, 0xce, 0x06, 0x85, 0x2c, 0x2d, - 0x8d, 0x3a, 0xed, 0x40, 0xf8, 0xc8, 0xe5, 0x0b, 0x96, 0x47, 0xdf, 0x16, - 0xe9, 0xfd, 0x7e, 0x09, 0xf4, 0x60, 0xaa, 0xe2, 0x40, 0x0a, 0x6c, 0x00, - 0xb1, 0x3f, 0xe3, 0xa7, 0xdb, 0xea, 0xa1, 0x79, 0x93, 0xab, 0x0b, 0xd7, - 0xf7, 0xd4, 0x56, 0x0a, 0xa2, 0xa3, 0xb0, 0x0c, 0x05, 0x31, 0xd7, 0x47, - 0x80, 0x32, 0xed, 0xbd, 0x78, 0x85, 0xcb, 0x90, 0xbe, 0xbe, 0x75, 0xe0, - 0xaf, 0xa2, 0x5e, 0x24, 0x2e, 0xb3, 0x2e, 0x34, 0xd3, 0xae, 0xdf, 0xf9, - 0x91, 0xb5, 0x42, 0xb1, 0xd1, 0xaa, 0xb7, 0x39, 0x5e, 0x2e, 0x42, 0xe3, - 0xf2, 0x3f, 0x4e, 0xf6, 0x0a, 0x83, 0x08, 0xb2, 0x50, 0x5e, 0x36, 0xf6, - 0xc5, 0x46, 0x58, 0x98, 0x52, 0xa8, 0x42, 0xeb, 0xad, 0x02, 0x9a, 0xef, - 0x1d, 0x25, 0x25, 0x98, 0x91, 0x12, 0x2c, 0xdd, 0x4f, 0x06, 0x66, 0x36, - 0xf2, 0xaa, 0xdb, 0xaf, 0x2c, 0x67, 0x7c, 0x79, 0xef, 0xa9, 0x2f, 0xa1, - 0xb4, 0x26, 0x6b, 0x3f, 0x8d, 0x7c, 0x5d, 0xd9, 0xb0, 0xed, 0x3e, 0x8e, - 0x87, 0x54, 0x30, 0xfa, 0x71, 0x69, 0x86, 0xc6, 0x0c, 0x6c, 0x46, 0xed, - 0x70, 0xd2, 0xb6, 0x4c, 0xff, 0x3c, 0x41, 0xc9, 0x1a, 0x11, 0x96, 0xf5, - 0x88, 0x23, 0x51, 0x7d, 0x14, 0x77, 0xaa, 0x76, 0x89, 0xb3, 0x9a, 0x9c, - 0x01, 0x14, 0x8e, 0xf4, 0x95, 0xa2, 0x7a, 0x51, 0xd3, 0x33, 0x01, 0x30, - 0x06, 0xe4, 0x4f, 0x86, 0x2c, 0x6a, 0x4f, 0xee, 0x66, 0xb2, 0xea, 0x29, - 0x67, 0x42, 0xd4, 0x31, 0xc1, 0x83, 0x5a, 0xdd, 0xba, 0x78, 0x3b, 0xc9, - 0x88, 0xf3, 0xbe, 0x99, 0x73, 0x96, 0xf3, 0x9d, 0x90, 0x4a, 0xad, 0xb0, - 0x32, 0x8c, 0xbf, 0xca, 0x11, 0x97, 0x26, 0x2e, 0x5f, 0xcc, 0xaf, 0x2b, - 0x88, 0xf8, 0x87, 0xd6, 0xc4, 0x20, 0x5c, 0x5f, 0x33, 0x7b, 0xed, 0x7d, - 0xa6, 0xe1, 0x07, 0x74, 0xe2, 0x09, 0x68, 0x15, 0x1b, 0x1b, 0xbd, 0x5a, - 0x01, 0x06, 0xc0, 0x93, 0xb0, 0x2d, 0xfc, 0x50, 0xb3, 0x08, 0xe3, 0x35, - 0xfd, 0xb5, 0x16, 0xd1, 0xee, 0xc7, 0x4f, 0x01, 0x0c, 0xd5, 0x57, 0xfc, - 0xfe, 0xcb, 0x95, 0xaa, 0xa4, 0x08, 0xd8, 0x18, 0x8f, 0xfd, 0xe9, 0x26, - 0x12, 0xf1, 0xae, 0x26, 0xb6, 0xac, 0xc8, 0xdc, 0xdc, 0x31, 0xc3, 0xd9, - 0x88, 0xf0, 0xdf, 0x01, 0xd0, 0x3e, 0x5b, 0x8a, 0xe1, 0xb3, 0x07, 0x14, - 0x89, 0xe3, 0xb1, 0xa7, 0x2d, 0x04, 0x9b, 0x1d, 0x2b, 0x1a, 0xb7, 0x5a, - 0x4c, 0x0c, 0xed, 0xe6, 0xb8, 0x5d, 0xb2, 0x3f, 0xc7, 0x7e, 0x76, 0x72, - 0x1b, 0x0b, 0x6c, 0x03, 0x82, 0xd7, 0x29, 0x8a, 0xed, 0xa4, 0x51, 0xb7, - 0xa5, 0x1f, 0xac, 0x84, 0xa7, 0x59, 0x6e, 0xb8, 0x8e, 0xe3, 0xab, 0xa6, - 0xf4, 0x9d, 0x3a, 0x18, 0xd6, 0x2c, 0x9c, 0x2f, 0x01, 0x95, 0x68, 0x5d, - 0x14, 0xe9, 0x42, 0xf5, 0x3f, 0x22, 0x6f, 0x5a, 0x98, 0x11, 0xeb, 0x87, - 0x29, 0x8a, 0x2a, 0x94, 0x74, 0x49, 0xb8, 0x5b, 0xb6, 0xd1, 0x7d, 0xbe, - 0x69, 0xc0, 0x19, 0xee, 0xff, 0xe7, 0x8f, 0x00, 0x20, 0x01, 0x85, 0xce, - 0xff, 0x27, 0x8a, 0x27, 0x7a, 0x52, 0xcd, 0x2e, 0x33, 0xdc, 0x47, 0x21, - 0x48, 0xe0, 0xbd, 0x99, 0x9e, 0xe4, 0x16, 0x57, 0xee, 0xe2, 0x1b, 0xe2, - 0xa5, 0x33, 0x09, 0x35, 0x9c, 0x21, 0x0d, 0x4b, 0x21, 0x12, 0xf2, 0x1c, - 0xf7, 0xb2, 0xc9, 0x7a, 0x33, 0x1d, 0x18, 0x1c, 0xe8, 0x93, 0xcf, 0x81, - 0x83, 0xfb, 0xec, 0xdc, 0xa0, 0x41, 0xf9, 0x9e, 0xcc, 0xf2, 0x60, 0x00, - 0xb0, 0x32, 0x1e, 0x22, 0x0c, 0x3f, 0x4f, 0x47, 0xc3, 0xc8, 0x45, 0xce, - 0x3e, 0xf6, 0xbd, 0x96, 0xc7, 0x06, 0x62, 0x68, 0xa6, 0xd6, 0x56, 0x3c, - 0x39, 0x36, 0xac, 0x2c, 0x75, 0xd4, 0xd2, 0x9c, 0xae, 0x0b, 0x7e, 0xc8, - 0x0f, 0xe3, 0x5d, 0xcb, 0x15, 0x38, 0x31, 0x62, 0xda, 0xc6, 0xc7, 0xfa, - 0x74, 0x47, 0x02, 0xfd, 0x2c, 0x11, 0xe4, 0xed, 0xaa, 0x26, 0xf1, 0x6c, - 0xe2, 0x6c, 0x0c, 0x32, 0x13, 0x23, 0x56, 0xc0, 0xa8, 0x53, 0xaa, 0x28, - 0x38, 0x12, 0x5f, 0xdc, 0xfe, 0x14, 0x29, 0x3b, 0x08, 0xb3, 0xa6, 0x26, - 0x32, 0x60, 0xa4, 0x13, 0xce, 0xac, 0x38, 0x30, 0xc9, 0x3e, 0x27, 0xc7, - 0x65, 0x02, 0xb2, 0x71, 0x16, 0x3f, 0x15, 0x1e, 0x60, 0xaa, 0xe7, 0xa9, - 0x24, 0x46, 0x9e, 0xe9, 0xa3, 0xfa, 0x21, 0x85, 0xea, 0xcf, 0xd9, 0x37, - 0x2b, 0xd2, 0xd2, 0x92, 0xd8, 0xb3, 0x81, 0x0f, 0x88, 0x59, 0x5b, 0xa0, - 0x27, 0xa0, 0x4b, 0xf0, 0x8d, 0x4b, 0xa1, 0xef, 0xcc, 0xbf, 0xdb, 0xd6, - 0x11, 0x90, 0x39, 0x00, 0x28, 0x16, 0xfd, 0x5a, 0xd2, 0x41, 0x30, 0x4f, - 0xde, 0x38, 0xa3, 0x19, 0xfa, 0xb6, 0xf1, 0x1c, 0x33, 0x09, 0x3f, 0xbe, - 0x25, 0x84, 0x66, 0x89, 0xd1, 0x52, 0xc3, 0x23, 0xdb, 0x05, 0xea, 0x67, - 0xd0, 0x6c, 0xd2, 0x99, 0xb2, 0x3c, 0xa8, 0xb3, 0xcc, 0xd9, 0x0d, 0x2c, - 0x59, 0xe8, 0xa3, 0x60, 0xf8, 0xe6, 0x14, 0xfc, 0x07, 0xb4, 0xb0, 0x97, - 0x8c, 0x6b, 0xcf, 0x38, 0xa0, 0x81, 0x52, 0x97, 0xce, 0x19, 0x47, 0x66, - 0x88, 0xc4, 0x1f, 0x53, 0x38, 0xb3, 0x55, 0xb7, 0xaa, 0xbb, 0x4f, 0x07, - 0x38, 0x12, 0xf4, 0xbd, 0x15, 0xde, 0x0e, 0x95, 0x0a, 0x33, 0xb3, 0x8b, - 0x19, 0x22, 0xa4, 0x54, 0x81, 0x5c, 0xfd, 0x49, 0xd3, 0x28, 0xc5, 0x72, - 0xf0, 0x13, 0x90, 0x4b, 0x33, 0x36, 0xff, 0x1f, 0x0e, 0x7a, 0xa2, 0x39, - 0x55, 0x2e, 0x21, 0x20, 0x92, 0xd2, 0x73, 0x93, 0xf3, 0x91, 0x9d, 0x01, - 0x34, 0xdc, 0xe5, 0xf1, 0x44, 0xdb, 0x6e, 0x00, 0x92, 0x3d, 0x8e, 0xbd, - 0xe1, 0x19, 0x92, 0xe4, 0x00, 0x10, 0x77, 0x9b, 0x99, 0x2d, 0x33, 0x3c, - 0xc8, 0xbb, 0xfb, 0x33, 0x89, 0xa5, 0xe6, 0x88, 0x9e, 0x4e, 0x9a, 0xb1, - 0x5e, 0xf3, 0x0e, 0x0f, 0x2f, 0xab, 0x64, 0x80, 0xc6, 0x78, 0xac, 0x4b, - 0x70, 0xcb, 0x29, 0x4e, 0xff, 0x0d, 0x21, 0xca, 0x69, 0xfe, 0x2c, 0x23, - 0x65, 0xeb, 0x05, 0x67, 0x38, 0x46, 0xc4, 0x67, 0x98, 0xe9, 0xee, 0x8c, - 0x06, 0x10, 0x87, 0x6a, 0xbc, 0xee, 0x22, 0xac, 0x0b, 0x21, 0x76, 0x32, - 0x07, 0xd3, 0x53, 0x98, 0x5e, 0x12, 0x61, 0xad, 0xb3, 0x6a, 0x65, 0xd6, - 0x58, 0x93, 0xdd, 0x25, 0x27, 0xfc, 0x51, 0xba, 0x8d, 0xca, 0x2d, 0xb1, - 0x93, 0x36, 0xec, 0xbd, 0x2e, 0x1c, 0x47, 0xb8, 0x7a, 0x38, 0x43, 0xcb, - 0x7d, 0xc7, 0xdb, 0xff, 0x91, 0xc6, 0x06, 0xf1, 0x8e, 0xa1, 0xb5, 0xcb, - 0xb8, 0xf0, 0xea, 0xf6, 0xa2, 0x97, 0x17, 0x0e, 0x9b, 0x18, 0x17, 0x3a, - 0x4e, 0x91, 0xfd, 0x6c, 0xca, 0x5a, 0xfa, 0x8a, 0x42, 0x13, 0x39, 0x6b, - 0x44, 0x0c, 0x5c, 0x7b, 0x0a, 0x05, 0xef, 0xba, 0xc3, 0xc2, 0xbd, 0xf8, - 0x89, 0x1b, 0x75, 0xca, 0x32, 0xe5, 0xed, 0x59, 0x57, 0x6f, 0x92, 0x87, - 0x78, 0x47, 0x50, 0xfe, 0x05, 0x9d, 0xf7, 0xa5, 0xbf, 0x78, 0xe8, 0x30, - 0xec, 0xec, 0xcd, 0x4d, 0xec, 0x21, 0xda, 0xf5, 0x96, 0x67, 0x8e, 0x4f, - 0x2d, 0x04, 0x9b, 0xfe, 0xdd, 0x16, 0x67, 0xa1, 0x37, 0x30, 0x28, 0xac, - 0x39, 0x7d, 0x10, 0x13, 0x4b, 0x89, 0xea, 0xe3, 0x9e, 0x7c, 0x2c, 0x37, - 0x5b, 0xbc, 0x48, 0x42, 0x53, 0xd9, 0xe9, 0x04, 0xf3, 0x0f, 0x84, 0x75, - 0x47, 0x27, 0x62, 0xd3, 0x55, 0x8f, 0x3c, 0xa4, 0x29, 0xaa, 0xa7, 0x07, - 0x52, 0xae, 0xe8, 0x6a, 0x4b, 0xbe, 0xe5, 0x5f, 0xcb, 0xb8, 0xcf, 0x89, - 0x8e, 0x1f, 0x85, 0xf4, 0x86, 0x5b, 0x21, 0x98, 0x1c, 0xfd, 0xf9, 0x41, - 0xa4, 0x01, 0x7f, 0x28, 0x7d, 0x46, 0xf6, 0x19, 0x4a, 0x03, 0x1c, 0xe2, - 0x58, 0xe0, 0xb5, 0x34, 0xd2, 0x17, 0xc6, 0xf5, 0x1b, 0x8e, 0x72, 0x97, - 0x3d, 0xea, 0x8f, 0x2b, 0x27, 0xea, 0x31, 0x05, 0xbe, 0x01, 0x99, 0xc2, - 0x1c, 0x4a, 0xde, 0x7e, 0x23, 0xcc, 0x90, 0xf6, 0xb3, 0x8b, 0x2d, 0xa2, - 0x0d, 0xe3, 0x84, 0x5e, 0x09, 0x4a, 0xda, 0xa0, 0x01, 0xe7, 0x0b, 0x20, - 0x2d, 0xcb, 0x53, 0x68, 0x22, 0x30, 0x14, 0x3a, 0x29, 0x70, 0x1d, 0xee, - 0xa2, 0x3a, 0xd3, 0xdb, 0x29, 0x19, 0xe1, 0x4c, 0xda, 0x23, 0xbc, 0x91, - 0xa8, 0x76, 0x7b, 0xa0, 0xd6, 0x81, 0x20, 0x32, 0x80, 0x37, 0x1a, 0x21, - 0x5c, 0x66, 0xd2, 0x9f, 0x52, 0x7f, 0x98, 0x49, 0x7e, 0xe5, 0x7c, 0x12, - 0xc3, 0x92, 0x80, 0x84, 0x30, 0x2a, 0x54, 0xab, 0x66, 0x01, 0xea, 0x67, - 0x32, 0xab, 0x62, 0x62, 0x66, 0xca, 0xae, 0x4c, 0x25, 0x67, 0x42, 0x83, - 0xd4, 0x6d, 0x64, 0x0a, 0x0f, 0x41, 0x3e, 0xcf, 0xac, 0x95, 0x69, 0x5b, - 0x79, 0x66, 0xe0, 0x33, 0x41, 0x19, 0xaf, 0x04, 0x15, 0xd2, 0x88, 0xe7, - 0xe7, 0x7a, 0x7e, 0xa2, 0xbf, 0xf5, 0x58, 0x7a, 0xae, 0x49, 0xac, 0x45, - 0x5a, 0xe7, 0x11, 0x26, 0x09, 0x60, 0x02, 0xda, 0x46, 0x21, 0xa0, 0x18, - 0x08, 0xdf, 0x78, 0x6c, 0xdd, 0x20, 0x86, 0xa4, 0x9c, 0xdb, 0x35, 0x98, - 0xa6, 0x77, 0xe1, 0xc5, 0xff, 0xa6, 0xc9, 0x64, 0xcc, 0x10, 0x1d, 0xf0, - 0xd7, 0xb9, 0x58, 0x30, 0xba, 0xc3, 0xe0, 0x95, 0x67, 0x65, 0x86, 0x82, - 0xe4, 0xe6, 0xd3, 0xef, 0x7f, 0x3a, 0x16, 0x0c, 0xb4, 0xea, 0xbb, 0x8d, - 0x48, 0xdd, 0x29, 0x67, 0x27, 0x53, 0x51, 0x82, 0x34, 0x56, 0x0a, 0x62, - 0x2d, 0xf9, 0xca, 0x02, 0x4c, 0x33, 0x24, 0x8d, 0xa3, 0x84, 0x4b, 0x61, - 0xf7, 0x2c, 0x05, 0xd5, 0xa7, 0x98, 0xc0, 0xfc, 0x63, 0x75, 0x28, 0xf0, - 0x6d, 0x27, 0xce, 0x52, 0x32, 0xb4, 0x6a, 0xa1, 0x2f, 0xf2, 0x56, 0xab, - 0x70, 0xd1, 0x34, 0x5f, 0x89, 0x3b, 0xe0, 0xce, 0xb3, 0x4a, 0x70, 0xe9, - 0x0d, 0x48, 0xfb, 0x49, 0x6e, 0x7b, 0xf3, 0x32, 0xa8, 0x23, 0xe7, 0x75, - 0xfe, 0xa8, 0xc4, 0x56, 0x3b, 0x1c, 0xff, 0x82, 0x17, 0x5c, 0x4f, 0x16, - 0xcf, 0x7b, 0x5b, 0x1c, 0xb0, 0x66, 0xaf, 0x9f, 0x0b, 0x24, 0x50, 0xa9, - 0xc9, 0xcc, 0xef, 0x67, 0x1c, 0xa8, 0x89, 0xc7, 0x83, 0xf2, 0x09, 0xa7, - 0x1b, 0x33, 0xcb, 0x91, 0x62, 0xc3, 0x68, 0x06, 0x6c, 0x02, 0x7c, 0x24, - 0x29, 0xad, 0x91, 0x04, 0xc7, 0xb5, 0x8c, 0xd9, 0x0d, 0xf4, 0x3d, 0x51, - 0x2b, 0x1c, 0xdd, 0xcc, 0x2a, 0x0a, 0xca, 0x67, 0x72, 0x20, 0x17, 0x43, - 0x5e, 0x42, 0x17, 0x7c, 0x3e, 0xd7, 0x43, 0x02, 0x9d, 0xa7, 0xad, 0x28, - 0x6e, 0xa1, 0x72, 0xab, 0x02, 0x74, 0xf5, 0x81, 0x8c, 0x09, 0x4e, 0x0e, - 0xdb, 0x1e, 0x56, 0xfe, 0x46, 0x5a, 0x67, 0x88, 0x41, 0x64, 0x2f, 0x16, - 0x3e, 0xd7, 0x43, 0xd7, 0x5e, 0x3b, 0x6b, 0x2c, 0xa6, 0x01, 0xf1, 0x0d, - 0x65, 0x33, 0xe0, 0x66, 0xf3, 0xa7, 0xf2, 0x40, 0x07, 0xa2, 0x0f, 0x45, - 0x7c, 0x13, 0x3e, 0x22, 0xae, 0x94, 0x44, 0x17, 0x37, 0x46, 0x42, 0x7f, - 0xa9, 0x6d, 0x27, 0x43, 0x49, 0xd7, 0xc6, 0x95, 0xa2, 0xc6, 0x7e, 0xb0, - 0x19, 0x6a, 0x61, 0xc9, 0xdf, 0xaa, 0x9c, 0x2d, 0x29, 0x00, 0x3e, 0x9f, - 0xee, 0xdf, 0xec, 0x91, 0xf6, 0x3c, 0x6a, 0x35, 0x93, 0xdd, 0x2d, 0x80, - 0x62, 0xf1, 0x67, 0x2b, 0x2b, 0xc3, 0x98, 0xc4, 0x09, 0x39, 0xe0, 0x34, - 0x71, 0x7e, 0x81, 0x8c, 0x91, 0xf9, 0x5f, 0xc1, 0x9d, 0x12, 0xd5, 0x77, - 0x68, 0xfb, 0x94, 0x8f, 0xa1, 0xa2, 0x9f, 0xc9, 0xc3, 0x89, 0xaa, 0x2e, - 0x6e, 0xfb, 0x0f, 0x2c, 0x73, 0x7a, 0x93, 0x12, 0x12, 0x07, 0x46, 0xab, - 0x4c, 0x88, 0x9c, 0xcd, 0xb9, 0x95, 0xc2, 0xa0, 0x50, 0x93, 0x20, 0xd2, - 0x7d, 0xf6, 0x1c, 0x80, 0x53, 0xdb, 0xa6, 0xab, 0xf3, 0xf5, 0xee, 0xbd, - 0xf2, 0x8e, 0x88, 0xc8, 0x48, 0xa3, 0x75, 0xc5, 0xf0, 0xfc, 0x18, 0x61, - 0xbc, 0x3d, 0x6e, 0xc5, 0x74, 0x27, 0x9d, 0x96, 0xbb, 0xb8, 0x3a, 0x1f, - 0xf9, 0x50, 0x59, 0x65, 0x87, 0xbd, 0x56, 0x43, 0x27, 0x9c, 0x4e, 0x43, - 0x95, 0x55, 0xf3, 0xa4, 0x1d, 0x6e, 0xb6, 0x70, 0x70, 0x90, 0xdc, 0x28, - 0xf5, 0xe3, 0xfc, 0x0e, 0x3b, 0x91, 0x9c, 0x09, 0x96, 0x88, 0x52, 0xb9, - 0xe8, 0xe9, 0x2d, 0x85, 0x04, 0x85, 0xa0, 0x99, 0xf8, 0x94, 0x88, 0x93, - 0x8c, 0x26, 0xfb, 0x1e, 0xc1, 0x14, 0x47, 0x92, 0x22, 0x51, 0x9d, 0xaf, - 0x73, 0x8a, 0x26, 0x90, 0x82, 0x47, 0xb2, 0xc8, 0x4e, 0xaa, 0xcd, 0x48, - 0x2e, 0xf2, 0x99, 0x54, 0x82, 0x59, 0x4e, 0x2b, 0x9f, 0xa2, 0x5d, 0xcb, - 0xc9, 0x6c, 0x05, 0x47, 0xd5, 0x4b, 0xe7, 0xbd, 0xa3, 0x45, 0x56, 0x6f, - 0x2b, 0x42, 0xff, 0x01, 0x42, 0xe3, 0xd1, 0x97, 0xa0, 0xde, 0x0c, 0x40, - 0xa2, 0xa5, 0xa3, 0x56, 0xde, 0x99, 0x28, 0xf6, 0x55, 0x61, 0x5c, 0x0c, - 0xd7, 0xf7, 0xc0, 0x3c, 0x48, 0x71, 0xa4, 0xcb, 0x07, 0x6e, 0xf9, 0x88, - 0x46, 0x86, 0x62, 0x76, 0x45, 0x4a, 0x20, 0xcd, 0x59, 0xf3, 0xbc, 0xa0, - 0xc2, 0x93, 0xd0, 0xee, 0x9a, 0x88, 0x6d, 0xc9, 0xc9, 0x60, 0xf5, 0x4a, - 0xe4, 0xf5, 0xd4, 0x06, 0x92, 0x95, 0xbd, 0x2c, 0x6a, 0x8c, 0x6e, 0x82, - 0x07, 0x85, 0xdd, 0x4d, 0x4f, 0xf5, 0x95, 0xa4, 0x54, 0xce, 0xaa, 0x76, - 0x9c, 0xb8, 0x24, 0xf9, 0xd5, 0xb8, 0x17, 0xc8, 0xb2, 0xa5, 0x59, 0xbd, - 0x3d, 0xea, 0x2f, 0x3b, 0xb3, 0x9c, 0xea, 0x45, 0x63, 0xa4, 0x17, 0x21, - 0x5a, 0x55, 0x93, 0x26, 0xf2, 0x21, 0x70, 0x45, 0x28, 0xf4, 0xbd, 0x81, - 0xb8, 0x1b, 0x12, 0x6b, 0xb6, 0x0d, 0xd5, 0x0a, 0x6c, 0x3b, 0x4a, 0x66, - 0xbf, 0x07, 0x5e, 0x28, 0x56, 0xca, 0x88, 0x9e, 0x07, 0x4e, 0xc9, 0xe3, - 0xfb, 0x75, 0xbf, 0xe3, 0x3e, 0x83, 0x83, 0x83, 0x9c, 0x9e, 0xb8, 0x97, - 0x1e, 0xcd, 0xaf, 0x8c, 0x21, 0x97, 0xb8, 0x42, 0xa0, 0x32, 0xfe, 0x12, - 0x0b, 0x06, 0x3d, 0xf3, 0x6c, 0xea, 0x09, 0x7d, 0x0e, 0x3b, 0x88, 0xe7, - 0xb9, 0xd1, 0xc0, 0x6c, 0xb2, 0x1d, 0x05, 0x5b, 0x52, 0x69, 0xbf, 0xce, - 0x95, 0x26, 0x2d, 0x1d, 0xaa, 0x85, 0x6f, 0x6e, 0xbc, 0xba, 0xe4, 0xa5, - 0xd2, 0x4b, 0x59, 0xb3, 0xff, 0xcd, 0x96, 0xb9, 0xd4, 0xa6, 0xc0, 0x8b, - 0x06, 0x0a, 0x6e, 0xd4, 0xde, 0x8d, 0x2e, 0x66, 0xc7, 0xa1, 0x56, 0xd8, - 0x77, 0x34, 0xe7, 0x63, 0x6f, 0x88, 0x1d, 0xdc, 0xa3, 0x89, 0xad, 0xa8, - 0x3f, 0x01, 0xad, 0xb1, 0xaa, 0xa2, 0x2a, 0x8f, 0x99, 0x9d, 0x75, 0x54, - 0x40, 0xd9, 0xf1, 0xfe, 0x81, 0xf6, 0xe9, 0xbb, 0xe3, 0x84, 0x57, 0x01, - 0x73, 0x5b, 0xdd, 0x87, 0x50, 0xdc, 0xef, 0xc1, 0xf1, 0x01, 0xcc, 0xc2, - 0x12, 0x53, 0xea, 0xf1, 0x5b, 0x46, 0x0e, 0x98, 0x00, 0x52, 0x7b, 0x90, - 0xf2, 0x99, 0xd1, 0x59, 0x8f, 0xb1, 0x1e, 0x3a, 0x8e, 0x6c, 0x24, 0x01, - 0x83, 0x75, 0x1e, 0xc5, 0xb4, 0x99, 0xaa, 0x53, 0x3a, 0x53, 0x7a, 0x07, - 0xc1, 0xa4, 0x67, 0x82, 0x12, 0x06, 0x96, 0xb3, 0x70, 0xa5, 0xc6, 0xa6, - 0x3c, 0x66, 0x04, 0x8e, 0x9f, 0xb3, 0x1b, 0x0a, 0x0d, 0x47, 0x07, 0x5e, - 0xe8, 0xdd, 0x5f, 0xfd, 0x1e, 0x2a, 0xf1, 0xba, 0x64, 0x83, 0x0a, 0x70, - 0x14, 0x5c, 0x92, 0xd5, 0x4a, 0xc8, 0x00, 0x47, 0x15, 0x5d, 0xbd, 0x94, - 0xf2, 0x70, 0x41, 0xe5, 0xd8, 0x4f, 0x87, 0xa6, 0xf7, 0x20, 0x73, 0x2d, - 0x12, 0x7b, 0x62, 0x88, 0xc7, 0xd8, 0xc4, 0x5a, 0x7e, 0x4e, 0x9e, 0xc4, - 0x7a, 0x5f, 0xbd, 0xc1, 0x25, 0x54, 0x60, 0x21, 0xa3, 0x26, 0x15, 0x82, - 0xfe, 0x58, 0xcc, 0x34, 0x48, 0x60, 0x06, 0x15, 0xef, 0x64, 0xf3, 0x18, - 0xbc, 0xb1, 0x99, 0xc3, 0x00, 0xc7, 0x5f, 0x6f, 0x87, 0x94, 0xac, 0xe6, - 0xf0, 0x0e, 0x1e, 0x26, 0x8d, 0xad, 0x9e, 0x55, 0xc5, 0x59, 0xc4, 0xe7, - 0x47, 0xdd, 0xe9, 0xbb, 0xde, 0x9a, 0xa5, 0x3e, 0x10, 0xfd, 0x5f, 0x8a, - 0x5f, 0x4e, 0x21, 0x3a, 0x65, 0xcb, 0xba, 0xef, 0xa2, 0xe4, 0xb7, 0x9a, - 0xbe, 0xb2, 0x0c, 0x8e, 0x7d, 0xe3, 0xd9, 0x00, 0x69, 0x28, 0xbd, 0xef, - 0xb0, 0x7d, 0x73, 0xb6, 0xff, 0xf6, 0x6c, 0x6c, 0x2f, 0xe1, 0x83, 0x07, - 0xe3, 0xea, 0x9f, 0x63, 0x8c, 0xee, 0x06, 0x19, 0x25, 0x9f, 0xec, 0x72, - 0x62, 0x66, 0x9b, 0x1f, 0x87, 0xda, 0xa3, 0x98, 0xd0, 0xae, 0xd4, 0xc7, - 0x7f, 0x09, 0x23, 0x87, 0x1c, 0x9d, 0x94, 0x13, 0xb7, 0x73, 0xc5, 0x59, - 0x67, 0x4f, 0xf4, 0xa8, 0xc3, 0x3f, 0x90, 0x1f, 0x75, 0x58, 0xe1, 0xa7, - 0x42, 0x6c, 0x97, 0x5e, 0x76, 0x36, 0x84, 0x0f, 0x12, 0xb6, 0xa2, 0x9d, - 0x02, 0x30, 0xc0, 0xdb, 0xf6, 0xb0, 0x73, 0x23, 0x98, 0x5d, 0x7c, 0x86, - 0x51, 0xe3, 0xeb, 0x19, 0x0e, 0x66, 0xe1, 0x67, 0xe9, 0x2f, 0x2e, 0xab, - 0xdc, 0x54, 0x77, 0xaa, 0x21, 0xb4, 0x6a, 0xc8, 0x3b, 0x19, 0xe4, 0x50, - 0x5b, 0x41, 0x31, 0x1f, 0x3c, 0x57, 0x0c, 0x76, 0xc1, 0xbe, 0xc5, 0x1e, - 0x2e, 0x0a, 0xb6, 0xbc, 0x60, 0xb4, 0x95, 0x22, 0xc7, 0x93, 0x6f, 0xdf, - 0x21, 0x39, 0x3e, 0xd8, 0xcb, 0xce, 0xd2, 0x24, 0xff, 0x9d, 0x68, 0x3b, - 0xf0, 0x3c, 0xd5, 0x3c, 0xed, 0xa0, 0x4e, 0x3a, 0x9d, 0x57, 0x04, 0x52, - 0xbe, 0xf6, 0x2c, 0x37, 0x8f, 0xa7, 0xb0, 0x0e, 0x7b, 0xc6, 0x62, 0x5f, - 0x73, 0xc5, 0x33, 0xd6, 0xe2, 0x7e, 0xaf, 0xed, 0x83, 0x2e, 0xc7, 0xc9, - 0x67, 0xa1, 0x53, 0xaf, 0xbb, 0x7a, 0xa7, 0xc6, 0x7e, 0xd8, 0xd4, 0x42, - 0x2a, 0x31, 0x1e, 0xe8, 0xea, 0x8d, 0xe3, 0xa4, 0xa1, 0xb6, 0x24, 0xdc, - 0xad, 0xc9, 0x86, 0xe7, 0xbc, 0xdd, 0xe8, 0xab, 0x73, 0x6f, 0x8d, 0x95, - 0x50, 0x4f, 0x47, 0x40, 0x46, 0x57, 0x69, 0x31, 0x46, 0x73, 0xef, 0x25, - 0x7b, 0xa1, 0x1f, 0x4c, 0x99, 0x7b, 0x38, 0x06, 0xfb, 0x6e, 0xce, 0xc4, - 0x63, 0x31, 0x57, 0xd6, 0xab, 0x93, 0xb4, 0x99, 0x18, 0x80, 0xc0, 0x7e, - 0x95, 0xb3, 0x30, 0x2b, 0x77, 0x23, 0x5f, 0xae, 0x88, 0x94, 0xc2, 0xff, - 0xf9, 0xce, 0xd4, 0x82, 0x8d, 0xb7, 0x0a, 0xcf, 0x68, 0x7f, 0x50, 0x64, - 0xf0, 0x86, 0x77, 0x95, 0x04, 0xa3, 0x30, 0x13, 0xe0, 0x79, 0x32, 0xd0, - 0xdf, 0x6d, 0x29, 0x03, 0x0f, 0x53, 0x4e, 0x79, 0x76, 0xa1, 0xb7, 0x37, - 0xe8, 0x7c, 0x78, 0x21, 0x69, 0xa5, 0x10, 0x78, 0x67, 0xd4, 0xe9, 0xea, - 0x13, 0xca, 0x09, 0x50, 0x2d, 0x62, 0xc5, 0x15, 0x8c, 0x80, 0xa0, 0x20, - 0x29, 0x0e, 0xc9, 0xa3, 0x8e, 0x73, 0xce, 0x23, 0x2a, 0x9b, 0xe5, 0x64, - 0x04, 0xcc, 0x17, 0x4f, 0x7c, 0xe0, 0x82, 0xa2, 0x2b, 0xef, 0xfb, 0x80, - 0xb4, 0xaa, 0x49, 0x09, 0x7a, 0xc9, 0x10, 0xef, 0xfd, 0xb1, 0xda, 0x1e, - 0x06, 0x5b, 0xff, 0x87, 0x3e, 0xaa, 0x6b, 0x8f, 0x94, 0x4a, 0xff, 0x55, - 0xdd, 0x72, 0x15, 0xfd, 0x17, 0x2f, 0x55, 0x94, 0x56, 0x8d, 0xce, 0x34, - 0x4f, 0x8b, 0x76, 0x17, 0x36, 0x52, 0xa3, 0xd9, 0x9c, 0xd5, 0xd9, 0x27, - 0x12, 0xd8, 0x29, 0xed, 0x95, 0x68, 0xfb, 0x6b, 0x06, 0x4e, 0x40, 0x3c, - 0x66, 0x7d, 0xb1, 0x8b, 0x92, 0x01, 0x6a, 0x78, 0x60, 0xb1, 0x83, 0x5e, - 0xa9, 0x9a, 0x38, 0x6e, 0x3e, 0xd3, 0xf0, 0xa5, 0xe5, 0x3e, 0x12, 0x95, - 0x40, 0x50, 0x74, 0xca, 0xb0, 0x94, 0x40, 0x5c, 0x46, 0x2f, 0x48, 0x5c, - 0xa3, 0xe7, 0x82, 0xe2, 0x67, 0xe8, 0x1c, 0xca, 0xfc, 0x18, 0x7a, 0x91, - 0xae, 0x3b, 0xa1, 0x2f, 0x85, 0x79, 0x22, 0xd8, 0x4c, 0x05, 0xc2, 0x68, - 0xdc, 0xb9, 0x01, 0x17, 0x06, 0x88, 0xc7, 0x62, 0xc3, 0x36, 0x3b, 0x73, - 0xbc, 0x19, 0xf7, 0x5d, 0x5b, 0x73, 0xaa, 0x63, 0x78, 0xbf, 0xab, 0x67, - 0xb5, 0xf9, 0xe7, 0x71, 0xbc, 0x93, 0xa6, 0x7c, 0xd6, 0x5b, 0x1c, 0xaf, - 0xa9, 0x35, 0x60, 0x7d, 0x82, 0x23, 0x35, 0x4a, 0x19, 0x23, 0xec, 0x17, - 0x80, 0x03, 0xca, 0x27, 0xeb, 0x29, 0x44, 0xbb, 0x7a, 0x2d, 0xa7, 0x68, - 0xcb, 0xad, 0x06, 0xd2, 0xb0, 0x7a, 0xdc, 0xed, 0x25, 0x69, 0x24, 0x1c, - 0xce, 0x7c, 0x6a, 0x38, 0x43, 0xf7, 0xd4, 0xf5, 0x7d, 0x9b, 0x8d, 0x8c, - 0xc7, 0x45, 0xcf, 0xc3, 0xf6, 0x50, 0x88, 0xb6, 0x39, 0x42, 0x74, 0x30, - 0x18, 0x93, 0xa5, 0x57, 0x15, 0x07, 0x6f, 0x58, 0xdc, 0x1e, 0xc1, 0x42, - 0xf4, 0x90, 0x98, 0xe2, 0x41, 0xb9, 0xc4, 0x2c, 0x0c, 0x3a, 0x68, 0xfb, - 0xc7, 0xee, 0x36, 0x1e, 0xc1, 0xfe, 0x6e, 0xb0, 0x00, 0xfd, 0x8f, 0x4b, - 0x78, 0xad, 0x15, 0xa9, 0xad, 0x93, 0x5d, 0x89, 0x7c, 0xe1, 0x47, 0xcb, - 0x9a, 0x1a, 0x21, 0xc1, 0xe5, 0x35, 0xb8, 0x06, 0xd0, 0x84, 0x0c, 0x23, - 0x50, 0x91, 0x79, 0xf6, 0xe5, 0x4d, 0x29, 0xa8, 0x72, 0xa9, 0xb2, 0x25, - 0x33, 0xb6, 0x9e, 0x74, 0x52, 0x6c, 0x9f, 0x1d, 0x8e, 0xac, 0xe7, 0xc3, - 0x2b, 0x74, 0x32, 0x1f, 0x0f, 0x32, 0x0e, 0x51, 0x59, 0xad, 0x8b, 0x90, - 0x22, 0xc1, 0x47, 0x1e, 0x2d, 0x89, 0xc3, 0x87, 0x89, 0x3a, 0xc3, 0xd4, - 0xf0, 0x19, 0xb5, 0x5a, 0x5e, 0xad, 0x3e, 0xfe, 0xda, 0x7e, 0xe0, 0x19, - 0x68, 0x19, 0x79, 0x09, 0x16, 0xf7, 0x01, 0x31, 0x59, 0x54, 0x48, 0x84, - 0x05, 0xec, 0x0a, 0x59, 0x0f, 0xd6, 0x6d, 0x34, 0x65, 0xa8, 0xe8, 0x28, - 0xa9, 0x29, 0x7e, 0x21, 0x68, 0xfe, 0xab, 0xa5, 0xaf, 0x7b, 0x02, 0x1d, - 0xaa, 0xe6, 0xbf, 0x99, 0x4a, 0x10, 0x89, 0xcb, 0xe1, 0xfa, 0x06, 0xfe, - 0xa9, 0xe7, 0x26, 0x86, 0x7d, 0x9c, 0x60, 0x6b, 0x6b, 0xbb, 0xf1, 0xca, - 0x51, 0xd4, 0x19, 0x1f, 0x14, 0x57, 0xa7, 0xd3, 0x52, 0xa6, 0xbe, 0x3b, - 0x9f, 0x76, 0xb2, 0xc1, 0x4b, 0x21, 0x18, 0xa3, 0xcc, 0xb5, 0xaf, 0x55, - 0x73, 0xd4, 0xb1, 0x76, 0x15, 0x05, 0x0a, 0x78, 0x98, 0x3b, 0x89, 0xf9, - 0xb4, 0x94, 0xb7, 0xf1, 0xce, 0x10, 0x41, 0x40, 0x1d, 0xd5, 0xdc, 0x29, - 0xae, 0x7a, 0xfd, 0x6c, 0x94, 0xd0, 0xe3, 0xd5, 0x8f, 0x58, 0xac, 0xa9, - 0x43, 0xfd, 0x8e, 0x4e, 0x3e, 0xde, 0xb4, 0xde, 0x14, 0x30, 0xf3, 0xb7, - 0xfe, 0x77, 0xc0, 0xdc, 0x2e, 0x0d, 0x5e, 0x38, 0xa3, 0xfd, 0x24, 0x61, - 0x80, 0xb4, 0x35, 0xa1, 0x8a, 0xfa, 0x7e, 0x02, 0x1a, 0xf6, 0xc5, 0xd5, - 0x75, 0xbb, 0x32, 0x15, 0xec, 0xf1, 0x4d, 0x65, 0x56, 0x7c, 0x86, 0x80, - 0x39, 0x5e, 0xa5, 0x1f, 0xfd, 0x6a, 0x08, 0x9a, 0x1b, 0x13, 0xd4, 0xa8, - 0x86, 0x6d, 0x21, 0x33, 0x81, 0xf5, 0x30, 0xbb, 0x02, 0xcf, 0x33, 0x89, - 0xd8, 0x72, 0x92, 0x41, 0x56, 0x34, 0x08, 0xeb, 0xba, 0x75, 0xab, 0x2c, - 0xbd, 0x38, 0xf6, 0x7e, 0x71, 0x6f, 0xd6, 0x1b, 0x5f, 0x08, 0x77, 0xa9, - 0x2b, 0x21, 0xce, 0x20, 0xc9, 0xe6, 0xeb, 0x2c, 0x6c, 0x66, 0xb7, 0x36, - 0xca, 0xe0, 0x77, 0x0b, 0x8b, 0x88, 0x3d, 0x17, 0xea, 0xf8, 0xe6, 0x45, - 0xa0, 0x43, 0x72, 0x5f, 0x31, 0xa1, 0x52, 0xa6, 0xf1, 0xb2, 0x37, 0x63, - 0x05, 0xfe, 0x6e, 0x45, 0x50, 0xca, 0xf2, 0x0f, 0x02, 0xe8, 0xd2, 0x3c, - 0xd9, 0x38, 0xfd, 0xf1, 0x33, 0xe0, 0xac, 0x4d, 0xe9, 0xf5, 0x5a, 0xb3, - 0xd4, 0xa0, 0x01, 0x31, 0xd4, 0x0c, 0xe9, 0xd6, 0x56, 0xed, 0x82, 0xdd, - 0x7e, 0x9f, 0xe5, 0x7d, 0x4e, 0x6b, 0xdb, 0x67, 0x2d, 0xef, 0xc3, 0x68, - 0x41, 0x3b, 0x37, 0x44, 0x83, 0x5f, 0x91, 0x48, 0xe5, 0xd8, 0x2f, 0x88, - 0x2c, 0x2a, 0x09, 0x31, 0xcd, 0xd4, 0xf1, 0xab, 0x20, 0x04, 0x0f, 0x63, - 0x30, 0x12, 0x55, 0xba, 0xab, 0x74, 0x70, 0x7f, 0x52, 0x5f, 0x59, 0xea, - 0xbe, 0x13, 0x00, 0x81, 0xbf, 0x2d, 0x38, 0xbf, 0x2a, 0xc2, 0xf0, 0xbd, - 0xa0, 0xbe, 0xf5, 0x96, 0x49, 0x5c, 0xcb, 0x14, 0x7e, 0xfc, 0x95, 0x8a, - 0xc9, 0xbf, 0x30, 0xdb, 0x98, 0x29, 0x7a, 0xae, 0xee, 0x8a, 0xd1, 0xd1, - 0x3e, 0xfe, 0x42, 0x0d, 0x92, 0xa9, 0xb1, 0x57, 0x9d, 0x86, 0x02, 0x52, - 0xc4, 0xe9, 0xcb, 0xc4, 0x42, 0xd6, 0xf3, 0x21, 0x54, 0x85, 0x55, 0x4f, - 0x52, 0x14, 0x7f, 0x40, 0x91, 0x62, 0x24, 0x82, 0x60, 0xed, 0x5f, 0x39, - 0xe6, 0x5b, 0x62, 0x48, 0xfb, 0xba, 0x1d, 0x63, 0xe3, 0x01, 0xe4, 0x27, - 0xf0, 0x77, 0x5b, 0x59, 0x11, 0x20, 0xa7, 0x56, 0x66, 0xc5, 0x9f, 0x96, - 0x5b, 0x4b, 0x7a, 0x1e, 0x7c, 0x97, 0x85, 0x73, 0x4c, 0x28, 0x19, 0x15, - 0x42, 0x9c, 0x46, 0x81, 0x21, 0x79, 0xc8, 0xfc, 0xe1, 0x01, 0x44, 0x38, - 0x5a, 0xbf, 0xf6, 0x1b, 0x72, 0x22, 0x35, 0x35, 0x81, 0x2a, 0x85, 0x60, - 0x31, 0x72, 0x11, 0xac, 0xa9, 0x40, 0xfc, 0xac, 0x7c, 0xb5, 0x53, 0x7a, - 0x20, 0x3b, 0xc7, 0x2b, 0x74, 0x96, 0xa7, 0x9b, 0x46, 0x56, 0x34, 0x86, - 0x02, 0x0a, 0x91, 0x6d, 0xf9, 0x80, 0xb5, 0xb8, 0xd3, 0xbe, 0xc5, 0x27, - 0xa1, 0xc7, 0x3a, 0x0d, 0xd4, 0xa5, 0xcd, 0x56, 0x2d, 0x49, 0x75, 0xea, - 0x8e, 0x51, 0x95, 0x63, 0x48, 0x87, 0xbd, 0x0d, 0x84, 0xcb, 0x35, 0xf6, - 0x8d, 0xa8, 0x59, 0x9a, 0x27, 0xa0, 0x40, 0xfb, 0x38, 0xa8, 0xa8, 0x53, - 0xf1, 0xa1, 0x0e, 0x61, 0x5c, 0x1d, 0x94, 0x77, 0x49, 0x17, 0x65, 0xdf, - 0x11, 0x3d, 0x5e, 0x79, 0xe2, 0xbf, 0xd4, 0xc9, 0x3b, 0x39, 0xd6, 0x4e, - 0x68, 0x53, 0x94, 0xe1, 0x73, 0xb9, 0x31, 0xa6, 0x80, 0xf6, 0x90, 0x85, - 0xe2, 0x76, 0x61, 0xe5, 0x82, 0x35, 0x83, 0x31, 0xe7, 0x47, 0xfe, 0x67, - 0x81, 0xe3, 0x14, 0x4a, 0x25, 0xa3, 0xe5, 0x16, 0x13, 0x5b, 0x93, 0x11, - 0x81, 0x24, 0x3e, 0xf9, 0x94, 0xab, 0x9c, 0xc5, 0xa4, 0xaf, 0x9d, 0xd0, - 0x60, 0x47, 0x89, 0xce, 0xca, 0x8d, 0xd2, 0x10, 0x72, 0x02, 0x4e, 0x54, - 0x25, 0x7d, 0xdc, 0xb7, 0x87, 0x01, 0x6e, 0xb1, 0x7a, 0xa2, 0x0d, 0xd5, - 0x32, 0x05, 0xb9, 0x1a, 0x0a, 0xe4, 0xcd, 0xee, 0x31, 0xcb, 0x5b, 0x72, - 0xae, 0x94, 0x1b, 0x44, 0x2c, 0x78, 0xb0, 0x6f, 0x7e, 0x45, 0xd3, 0x86, - 0xfa, 0xd6, 0xb0, 0x8d, 0x6a, 0x98, 0xbc, 0x08, 0x9f, 0xfb, 0xf1, 0x8e, - 0x91, 0x12, 0xe5, 0xc9, 0x24, 0x6c, 0x23, 0x32, 0x0a, 0x27, 0x6d, 0x4f, - 0x0e, 0x5b, 0xf6, 0x86, 0xc3, 0x3a, 0xa4, 0xb5, 0xe1, 0x7a, 0x5e, 0x8f, - 0x2c, 0x9a, 0xc3, 0x04, 0x02, 0x17, 0xb5, 0xf5, 0x4f, 0x49, 0x27, 0x09, - 0xbb, 0xf4, 0xf2, 0x55, 0x38, 0x05, 0x50, 0x50, 0x8e, 0xc4, 0xaa, 0x8c, - 0xe4, 0x3f, 0xe6, 0x94, 0xee, 0x9e, 0x3d, 0x59, 0x5c, 0x3d, 0x58, 0xf3, - 0x95, 0x43, 0x70, 0xa4, 0xc4, 0x90, 0xf4, 0x68, 0x05, 0x87, 0x2d, 0x63, - 0xee, 0x5f, 0xe0, 0x9f, 0xe0, 0x98, 0xbc, 0x3a, 0x55, 0xf5, 0xc6, 0xaa, - 0x21, 0xfe, 0xe1, 0x05, 0x79, 0xee, 0x09, 0xec, 0xa0, 0x42, 0x2b, 0x45, - 0xa2, 0x4a, 0xcc, 0x78, 0xf6, 0xc0, 0x25, 0x33, 0x03, 0xc2, 0x8c, 0xef, - 0xf5, 0xdc, 0xd3, 0x8d, 0xcf, 0xfe, 0x52, 0x21, 0xb4, 0x3a, 0x8b, 0xf5, - 0x60, 0xdc, 0xd0, 0x72, 0x6c, 0xb5, 0x6e, 0xce, 0x3b, 0x5d, 0x08, 0xf6, - 0xef, 0x35, 0x29, 0x3b, 0x0f, 0x61, 0xf3, 0x2d, 0x8c, 0x3a, 0xe8, 0x28, - 0x10, 0x91, 0x5c, 0x25, 0x51, 0x12, 0x5c, 0x8e, 0xd8, 0xaa, 0x7d, 0x74, - 0xf0, 0x1f, 0xd6, 0x09, 0xe0, 0x09, 0x30, 0xac, 0x3c, 0x77, 0xcb, 0x01, - 0x29, 0xf9, 0x6e, 0x27, 0x31, 0x21, 0xb2, 0x17, 0x58, 0x5d, 0x68, 0x02, - 0xc3, 0x91, 0x8a, 0x4d, 0xe0, 0x35, 0x83, 0x5d, 0x63, 0x86, 0x49, 0x9b, - 0x83, 0x73, 0x21, 0xbf, 0xc3, 0x94, 0x12, 0xc6, 0xa8, 0x16, 0x0d, 0x00, - 0x57, 0xd0, 0x5a, 0x5b, 0x15, 0xd4, 0xa8, 0xbb, 0x79, 0x17, 0xdb, 0xce, - 0x6e, 0xff, 0x7a, 0xf8, 0xd1, 0x44, 0x60, 0xc9, 0x31, 0xd0, 0xfa, 0x49, - 0x3c, 0xad, 0xb0, 0xae, 0x55, 0xf3, 0xdb, 0xbe, 0xb1, 0x91, 0x95, 0xa8, - 0xc0, 0x15, 0xab, 0x0f, 0x59, 0x3a, 0xc5, 0x6d, 0x58, 0x17, 0x51, 0x86, - 0x17, 0x4f, 0x76, 0x0a, 0xcd, 0xef, 0x6e, 0x20, 0x61, 0x9d, 0xd4, 0xdd, - 0xd0, 0xcc, 0x94, 0x26, 0x2a, 0xf0, 0x8b, 0x65, 0x9b, 0x08, 0x6d, 0x5e, - 0x64, 0x93, 0xde, 0x7c, 0x8c, 0xbf, 0x61, 0x1e, 0x35, 0x48, 0x3b, 0x32, - 0x5f, 0xe7, 0xce, 0x4d, 0x47, 0xf3, 0xcb, 0x69, 0xfb, 0x9f, 0xfc, 0xf0, - 0xba, 0x3c, 0x0b, 0xdc, 0x39, 0xad, 0xff, 0xe4, 0x73, 0xdf, 0xf4, 0x6c, - 0x3f, 0x4e, 0xe3, 0x8c, 0x75, 0xbb, 0x2d, 0x5d, 0xd9, 0x22, 0x7e, 0x3d, - 0x2f, 0xa4, 0xca, 0xcb, 0xc7, 0x8b, 0xb3, 0xb0, 0x91, 0xb3, 0x00, 0x54, - 0xcd, 0x4d, 0x4e, 0xca, 0x53, 0xf0, 0xd7, 0x81, 0x26, 0xea, 0x9d, 0x24, - 0xa7, 0x0d, 0x06, 0x2e, 0xd3, 0x9c, 0xf4, 0xe0, 0x80, 0xb1, 0x81, 0x7a, - 0xfd, 0xeb, 0xda, 0x23, 0xaf, 0x61, 0x14, 0x2c, 0xd3, 0xde, 0xf4, 0xc1, - 0xd0, 0x42, 0x0f, 0x6b, 0x59, 0xd3, 0x25, 0x56, 0xb5, 0xd0, 0x18, 0x0b, - 0xac, 0xb2, 0x90, 0x8e, 0x39, 0x0e, 0x33, 0x7d, 0xe1, 0x21, 0xd1, 0x6e, - 0x06, 0x1c, 0xb9, 0x51, 0x40, 0xdb, 0x86, 0x99, 0xe2, 0xd7, 0x90, 0x92, - 0x7d, 0x4c, 0x92, 0x67, 0x55, 0xa0, 0x4e, 0xb0, 0xca, 0xce, 0x66, 0xc0, - 0x24, 0xc6, 0xc7, 0x7d, 0xc0, 0x48, 0x96, 0x84, 0xad, 0x31, 0xb2, 0xba, - 0xf2, 0x3a, 0xc8, 0xc6, 0x1e, 0xd2, 0x53, 0xcf, 0x58, 0xc9, 0xec, 0x83, - 0xb1, 0x5e, 0x97, 0x8e, 0x63, 0x26, 0xca, 0xcc, 0x20, 0x5e, 0xfa, 0x03, - 0x72, 0x00, 0xe9, 0xca, 0xf6, 0x8e, 0x17, 0xf0, 0xae, 0x49, 0x70, 0x71, - 0x2e, 0xc1, 0x33, 0x69, 0x15, 0xce, 0xe8, 0xe6, 0x8f, 0xb0, 0x7a, 0x05, - 0x80, 0xb4, 0xf1, 0xcb, 0xe5, 0xb5, 0x48, 0x13, 0x02, 0x7d, 0x5d, 0x00, - 0xdd, 0xbd, 0xf2, 0x34, 0xad, 0x13, 0xd6, 0x38, 0xc4, 0xdc, 0xc7, 0x82, - 0xec, 0x45, 0x3f, 0xc3, 0xc3, 0x63, 0x73, 0xb0, 0xf4, 0x35, 0x72, 0x90, - 0x01, 0xa1, 0xc1, 0x1b, 0xa3, 0xaa, 0x97, 0xe7, 0x11, 0xb2, 0x42, 0xdc, - 0x89, 0x5a, 0xbd, 0xc9, 0xeb, 0x55, 0xcf, 0x69, 0x45, 0xa5, 0x76, 0x37, - 0x4a, 0xcd, 0xbe, 0x1f, 0xff, 0x42, 0x89, 0x12, 0x44, 0xe1, 0x79, 0xd3, - 0xc4, 0x1d, 0x27, 0x1b, 0xea, 0x65, 0x9f, 0x47, 0x53, 0x27, 0x2c, 0xdd, - 0x8f, 0x37, 0x22, 0x8c, 0xac, 0xff, 0xf9, 0xea, 0x66, 0x2a, 0xb9, 0x0e, - 0xd8, 0x0c, 0x0e, 0xb6, 0xae, 0xb2, 0x54, 0xdf, 0xfe, 0x5c, 0x15, 0x04, - 0xfc, 0xf3, 0xa2, 0x13, 0x7d, 0x6b, 0x18, 0xc3, 0x89, 0xa5, 0x35, 0x32, - 0x8f, 0x52, 0x8d, 0x56, 0x7e, 0x25, 0xfb, 0xc0, 0x58, 0x2d, 0x20, 0xb6, - 0x66, 0x23, 0x5a, 0x26, 0x55, 0x80, 0x7b, 0xd3, 0xb0, 0xa0, 0x73, 0xb8, - 0x8d, 0xb4, 0xc8, 0xc0, 0x1d, 0x9b, 0xbb, 0x4f, 0x8b, 0xa9, 0x93, 0x7d, - 0xf9, 0x69, 0x08, 0xb7, 0xf2, 0xf9, 0x79, 0xc9, 0xe4, 0x23, 0x03, 0x28, - 0x31, 0x54, 0xfd, 0xa5, 0x4f, 0x36, 0x71, 0xeb, 0xa5, 0x33, 0x14, 0xcf, - 0x52, 0x37, 0xa0, 0xb4, 0x56, 0x13, 0x96, 0x19, 0xa3, 0x57, 0x6f, 0xb7, - 0xb1, 0x80, 0x56, 0xe1, 0x72, 0x43, 0x2e, 0x0b, 0x79, 0x83, 0xbd, 0xf3, - 0xe4, 0xef, 0x0e, 0xcf, 0xfc, 0xb1, 0x3a, 0xff, 0xab, 0x3a, 0x0f, 0x4b, - 0x5c, 0xe1, 0xdf, 0x9e, 0xfd, 0x86, 0x9a, 0xee, 0xf1, 0xd2, 0xc6, 0x87, - 0xf3, 0xed, 0xa2, 0xb0, 0x20, 0xd2, 0x05, 0xe3, 0xd1, 0xde, 0xd9, 0xfa, - 0x9a, 0xdd, 0x4b, 0xed, 0x64, 0xf9, 0xc0, 0x91, 0x91, 0x14, 0xaa, 0xf0, - 0xd8, 0xc9, 0x16, 0x40, 0xee, 0x91, 0x68, 0x0a, 0x14, 0x86, 0x1b, 0x57, - 0xa6, 0xec, 0xfc, 0xb5, 0x7d, 0x5a, 0xab, 0x63, 0x13, 0x97, 0x18, 0xbd, - 0xbd, 0x8e, 0x95, 0x80, 0xae, 0x64, 0x03, 0xaa, 0xa7, 0xd7, 0x19, 0xfd, - 0xd9, 0x8e, 0xd0, 0xab, 0x96, 0xfe, 0xca, 0x26, 0xb9, 0x2a, 0xe0, 0x0a, - 0x3a, 0x6c, 0x49, 0x5d, 0xd8, 0x5c, 0x71, 0x02, 0xa4, 0x9d, 0xaf, 0x8d, - 0x0e, 0x4e, 0xad, 0x12, 0x6d, 0x98, 0xb3, 0x24, 0x01, 0xc9, 0xac, 0xe5, - 0x65, 0x1c, 0x18, 0xdf, 0x76, 0xfb, 0x4f, 0xc4, 0x82, 0xb9, 0x1c, 0xb9, - 0xd8, 0xc2, 0xde, 0x3d, 0xaa, 0x05, 0x89, 0x17, 0x65, 0xb1, 0xdf, 0xf3, - 0xe1, 0x6a, 0x29, 0xc6, 0xe6, 0x5a, 0xb8, 0xb9, 0x0f, 0xbd, 0x80, 0x7d, - 0xd4, 0x43, 0x6b, 0xfb, 0xc2, 0x37, 0xb0, 0x67, 0x00, 0xad, 0xb7, 0xea, - 0x74, 0x67, 0xca, 0xf9, 0x5d, 0x56, 0x80, 0xbb, 0x1e, 0x95, 0xef, 0x5a, - 0xd1, 0x6c, 0xa2, 0x90, 0x57, 0xb6, 0x4c, 0xf9, 0x0c, 0x19, 0x9f, 0xcc, - 0x73, 0xfd, 0xb9, 0x99, 0xc1, 0xad, 0x85, 0x6e, 0x07, 0x10, 0x4d, 0xc0, - 0x03, 0x54, 0x58, 0x1d, 0xbe, 0xe4, 0xe7, 0x63, 0xa5, 0x7f, 0x86, 0x96, - 0x51, 0xa9, 0xd9, 0x3e, 0xe5, 0xd3, 0x8e, 0x55, 0x33, 0xd6, 0x37, 0xfc, - 0xbc, 0x99, 0x94, 0x49, 0x2f, 0x5d, 0x30, 0xeb, 0xba, 0xef, 0x2c, 0x6a, - 0xab, 0x1b, 0xf4, 0x8d, 0x0a, 0xe0, 0x51, 0x87, 0x18, 0x6a, 0xc1, 0xdd, - 0xba, 0x57, 0x72, 0x9a, 0xf6, 0x76, 0x1b, 0xf7, 0x72, 0x3b, 0x63, 0x58, - 0x44, 0x2c, 0x1d, 0x5c, 0x45, 0x9d, 0xdb, 0xb9, 0xbc, 0xa2, 0x4b, 0xbf, - 0x2e, 0x2c, 0xb9, 0x9a, 0x88, 0x34, 0xe0, 0xe5, 0x07, 0xe1, 0x9a, 0x9b, - 0x29, 0xe5, 0xb7, 0x35, 0x87, 0xbf, 0xc6, 0x7d, 0x48, 0x8b, 0x4b, 0xc3, - 0xf6, 0x3c, 0xd9, 0x76, 0x77, 0x77, 0xc4, 0xc1, 0x08, 0x2f, 0x4b, 0x08, - 0xa6, 0xea, 0x49, 0x8e, 0x74, 0xbb, 0x6c, 0xe6, 0x8d, 0xd4, 0xf3, 0x09, - 0xb6, 0x11, 0x8f, 0x8f, 0x3c, 0x59, 0x16, 0xbd, 0x6b, 0x90, 0x10, 0x44, - 0xb1, 0xb7, 0x38, 0x3e, 0xd2, 0x17, 0xca, 0x82, 0xfc, 0x4d, 0xc9, 0x65, - 0xd8, 0x86, 0x31, 0xc3, 0x73, 0x52, 0xa6, 0xd9, 0x44, 0x1f, 0x32, 0x18, - 0xbe, 0xfb, 0x13, 0x46, 0x9a, 0xc5, 0x27, 0x13, 0xc6, 0x95, 0xa6, 0xf6, - 0x72, 0xc2, 0x52, 0xe7, 0x14, 0xd5, 0x86, 0xea, 0x67, 0xe5, 0xf3, 0x1f, - 0x82, 0x49, 0x24, 0xed, 0x02, 0x62, 0xdb, 0x45, 0x59, 0x9a, 0xb7, 0x8f, - 0x42, 0x5e, 0x12, 0x39, 0x2a, 0x94, 0x01, 0x0e, 0xa8, 0x1e, 0x0d, 0x2c, - 0x34, 0x06, 0xc5, 0x22, 0x21, 0x82, 0xf7, 0x5b, 0x90, 0x90, 0x12, 0xd4, - 0x9d, 0x86, 0xf7, 0x4e, 0x11, 0x9e, 0xbc, 0x73, 0x2c, 0xce, 0x2b, 0xdd, - 0x41, 0xbc, 0x03, 0x70, 0x2c, 0x94, 0xcb, 0x7c, 0x82, 0xaf, 0x2b, 0x07, - 0x5a, 0xac, 0x60, 0xbb, 0xe0, 0x22, 0x75, 0x5e, 0x1e, 0xfa, 0x38, 0x59, - 0xf2, 0x46, 0x04, 0x5d, 0xfc, 0xbf, 0x0f, 0x92, 0xaa, 0xb6, 0x80, 0x82, - 0xf4, 0x87, 0x06, 0xe5, 0x40, 0xc4, 0x55, 0x43, 0xed, 0x9f, 0x89, 0x39, - 0x0a, 0xf2, 0x17, 0x51, 0x2d, 0xba, 0x7a, 0xaa, 0x67, 0xbd, 0x8d, 0x2c, - 0xe6, 0x77, 0x75, 0x7b, 0xb0, 0xd9, 0x70, 0x18, 0x69, 0x18, 0x84, 0xb1, - 0x67, 0x8c, 0xdb, 0x75, 0x6d, 0xc7, 0x72, 0x0f, 0xac, 0x95, 0x16, 0x72, - 0xaa, 0x49, 0xde, 0xd0, 0x82, 0x8d, 0x87, 0x1b, 0x4b, 0x91, 0x44, 0x2a, - 0x0e, 0xf8, 0xca, 0xc4, 0x34, 0xef, 0x91, 0x48, 0xb2, 0xc7, 0x40, 0x2e, - 0x9d, 0x7c, 0xb9, 0x23, 0xa2, 0x91, 0xd3, 0xa9, 0xce, 0xb6, 0x68, 0x07, - 0x2e, 0x80, 0x94, 0x22, 0x03, 0x7b, 0xc0, 0xbd, 0x0e, 0x95, 0xf4, 0xda, - 0xdf, 0x5d, 0x77, 0xa8, 0xc0, 0x51, 0xc3, 0x32, 0x62, 0xe7, 0x09, 0x67, - 0xdc, 0xbe, 0x3c, 0xfb, 0x86, 0x42, 0xe1, 0xbd, 0x93, 0x1a, 0x66, 0xf0, - 0x65, 0xe6, 0x46, 0xdb, 0xe4, 0x08, 0x56, 0x89, 0x45, 0xf2, 0xc4, 0xbe, - 0xf4, 0x12, 0xc6, 0x37, 0x0c, 0xa0, 0xec, 0x45, 0x85, 0xf2, 0x86, 0xdd, - 0x4d, 0x69, 0xf2, 0x12, 0x94, 0x0a, 0x4a, 0x6c, 0xdf, 0x4c, 0x9d, 0x83, - 0x75, 0xd7, 0x1d, 0xad, 0x48, 0xf0, 0xa5, 0x71, 0x2a, 0x87, 0x5e, 0xf7, - 0xf0, 0xf7, 0x3d, 0x94, 0x58, 0x64, 0x91, 0xae, 0x77, 0x1f, 0x6c, 0x5f, - 0x05, 0xa8, 0x8a, 0x54, 0x54, 0xe9, 0xee, 0x72, 0x3b, 0x5a, 0x93, 0xcc, - 0xbf, 0x16, 0x0d, 0xc7, 0x20, 0xdb, 0x4a, 0x1c, 0x2e, 0xb7, 0xa9, 0x94, - 0xcf, 0xcd, 0x91, 0x3d, 0x19, 0xe0, 0x0c, 0x18, 0xa7, 0xd2, 0xd0, 0xc4, - 0x5c, 0x0d, 0xe7, 0x72, 0xbe, 0x86, 0xf1, 0x86, 0x10, 0xcd, 0xd7, 0x29, - 0x7b, 0x80, 0xb5, 0x97, 0xef, 0xce, 0xf8, 0x75, 0xea, 0xc6, 0x6f, 0xed, - 0x98, 0xb5, 0x38, 0x3c, 0x31, 0x9a, 0x10, 0xa0, 0xbb, 0x11, 0x2e, 0xaf, - 0x51, 0x30, 0x38, 0x41, 0xe5, 0xa6, 0x33, 0x7d, 0x3f, 0xb2, 0x04, 0x98, - 0x77, 0xe3, 0x0b, 0x94, 0x45, 0xd3, 0x74, 0x52, 0x8b, 0xf7, 0x94, 0x35, - 0x32, 0x0d, 0x1b, 0x05, 0x34, 0x2a, 0xa6, 0x28, 0x04, 0xd7, 0x41, 0xad, - 0xc6, 0x7b, 0x5f, 0x5b, 0x94, 0xd5, 0x79, 0xd1, 0xf7, 0xef, 0xe9, 0xad, - 0xf6, 0xd0, 0x86, 0x58, 0x7f, 0x4b, 0x59, 0x41, 0xdd, 0xdb, 0x20, 0xf2, - 0x52, 0x6d, 0x10, 0xe0, 0x50, 0x12, 0x75, 0x61, 0x5e, 0xcf, 0x6c, 0x59, - 0xae, 0x66, 0x36, 0x33, 0x09, 0xd7, 0x15, 0xfb, 0x05, 0xf1, 0x4a, 0x40, - 0x76, 0x28, 0xa7, 0xee, 0xd3, 0xd1, 0x24, 0x72, 0x9c, 0x1c, 0x01, 0x8f, - 0x03, 0xec, 0x64, 0xa7, 0xd4, 0x53, 0x5b, 0xdd, 0x7a, 0xef, 0xf6, 0x75, - 0x71, 0x11, 0x84, 0x3d, 0xda, 0xf9, 0xa2, 0x70, 0x27, 0x87, 0x25, 0xb0, - 0x00, 0x72, 0x44, 0x36, 0xf6, 0x0e, 0x85, 0xa7, 0xd1, 0xa0, 0x6c, 0x10, - 0xc9, 0x84, 0x3d, 0xd4, 0x21, 0x8c, 0x9e, 0xda, 0x25, 0x49, 0x17, 0x0d, - 0x7b, 0x41, 0xeb, 0x70, 0xcc, 0xab, 0x45, 0xa7, 0xd7, 0x73, 0x23, 0x65, - 0x28, 0x75, 0xdc, 0x09, 0xe0, 0x88, 0x2d, 0x05, 0x48, 0x3f, 0x95, 0x05, - 0xb9, 0x7e, 0x95, 0xa8, 0xd8, 0xd5, 0xab, 0x7f, 0x73, 0x8d, 0xd1, 0xbe, - 0xe3, 0x82, 0x23, 0x8a, 0x53, 0x74, 0xa9, 0x61, 0xac, 0x86, 0x82, 0x46, - 0x9f, 0x8c, 0x32, 0x17, 0x14, 0x93, 0xcc, 0x8a, 0xa7, 0xe1, 0x9f, 0x48, - 0x19, 0x64, 0x2a, 0x7f, 0xf7, 0x09, 0xdb, 0x1c, 0x97, 0xfd, 0xe5, 0xc4, - 0x8f, 0x09, 0x2e, 0x16, 0xa2, 0xb5, 0xf1, 0x3d, 0x80, 0x44, 0xf0, 0x48, - 0x04, 0x1e, 0xc9, 0x37, 0x5f, 0x47, 0x55, 0x11, 0xac, 0xd5, 0x0b, 0x33, - 0xea, 0x16, 0x63, 0x93, 0xb8, 0x0f, 0xb4, 0xfa, 0x8e, 0xcb, 0x09, 0xf9, - 0x10, 0x37, 0xa8, 0xf8, 0x5d, 0xde, 0xaa, 0xa3, 0xc8, 0x62, 0xc4, 0x0b, - 0xca, 0xef, 0xd4, 0xf4, 0xb6, 0xc5, 0xd8, 0x75, 0xc4, 0x84, 0xfa, 0x41, - 0xa7, 0x02, 0xd0, 0xf6, 0xd8, 0xd9, 0x99, 0x8b, 0x8a, 0xdf, 0xa2, 0x50, - 0xc8, 0x60, 0x39, 0x14, 0x82, 0x31, 0x80, 0x14, 0xe3, 0x83, 0x56, 0x3a, - 0x33, 0xd9, 0xa9, 0x66, 0xcc, 0x8b, 0x9c, 0x40, 0x86, 0x6a, 0xdf, 0xf3, - 0xa0, 0xce, 0x20, 0x51, 0xe1, 0x33, 0xec, 0x13, 0xa6, 0xd1, 0x71, 0x70, - 0x6b, 0x60, 0x22, 0x0d, 0x60, 0xb9, 0x71, 0xec, 0x61, 0x20, 0x4c, 0xd3, - 0x1c, 0x0f, 0x57, 0xfb, 0xb8, 0x97, 0x2a, 0x28, 0x56, 0x84, 0x23, 0x77, - 0xe4, 0x96, 0x26, 0x45, 0x77, 0x05, 0xa0, 0x98, 0xd3, 0xee, 0x9f, 0x49, - 0x1d, 0xac, 0x0b, 0x53, 0x43, 0x0e, 0xe6, 0x4b, 0x1b, 0x7a, 0x4b, 0x1c, - 0x5e, 0xd4, 0xf5, 0x71, 0xe1, 0x7d, 0x0f, 0xba, 0x1b, 0x08, 0x82, 0x9a, - 0x85, 0x9e, 0x2c, 0x9b, 0x52, 0xc4, 0x44, 0x86, 0x6b, 0x32, 0x1c, 0x04, - 0x5a, 0xcc, 0xda, 0xa2, 0x46, 0x85, 0x2f, 0x86, 0x90, 0xab, 0x57, 0xb5, - 0x10, 0x80, 0x10, 0x91, 0x34, 0xdb, 0xbb, 0x39, 0x61, 0xe1, 0x39, 0x51, - 0x52, 0x09, 0x0e, 0x2d, 0x13, 0xec, 0xdf, 0x45, 0x4d, 0x46, 0xff, 0x30, - 0xe1, 0x79, 0x30, 0x77, 0x03, 0xfb, 0x7a, 0xd3, 0xa0, 0x62, 0x85, 0xe1, - 0x8c, 0x64, 0xec, 0xbb, 0x28, 0x50, 0x3d, 0x6c, 0x65, 0xb7, 0x96, 0xab, - 0xec, 0xda, 0x6b, 0x28, 0x94, 0xdd, 0x95, 0xa1, 0xa9, 0x32, 0x38, 0xd3, - 0xa8, 0x30, 0xe4, 0x08, 0x83, 0xd0, 0x2a, 0xa0, 0xd3, 0xf3, 0xe0, 0x19, - 0x04, 0x1b, 0xa8, 0x3c, 0x61, 0x1b, 0x16, 0x88, 0x2b, 0x29, 0x8f, 0xcc, - 0x43, 0x42, 0x77, 0xf5, 0xbe, 0xfb, 0xf6, 0x21, 0x35, 0x3e, 0xaa, 0x23, - 0xd3, 0xe2, 0x76, 0xa9, 0x29, 0x29, 0x52, 0x15, 0x38, 0x29, 0xca, 0xbf, - 0x80, 0x75, 0x18, 0xce, 0x99, 0xb4, 0x97, 0xfc, 0x4f, 0xb1, 0x5b, 0xd1, - 0x36, 0xf3, 0xc6, 0xfa, 0x37, 0x7f, 0xab, 0x90, 0x8d, 0x18, 0x10, 0x03, - 0xad, 0x66, 0x15, 0x24, 0x0e, 0x65, 0x23, 0xad, 0x0b, 0x92, 0xe1, 0xd0, - 0xf6, 0xa7, 0xe0, 0x77, 0xc6, 0x3e, 0xa1, 0x5b, 0x5b, 0x5e, 0xa1, 0xe3, - 0xef, 0xd3, 0x1b, 0x95, 0x15, 0x51, 0x7f, 0x02, 0x4e, 0x9c, 0x1c, 0xd5, - 0xdc, 0x89, 0x32, 0xa9, 0xed, 0x5b, 0x6c, 0x59, 0x28, 0x18, 0x4b, 0xf5, - 0xc2, 0x5d, 0x7b, 0x05, 0x82, 0x50, 0x27, 0x55, 0x41, 0x51, 0x78, 0xdb, - 0x32, 0x83, 0x00, 0x37, 0x15, 0xd8, 0x78, 0x34, 0xfb, 0x95, 0x99, 0x2a, - 0xb0, 0x73, 0xb0, 0xc9, 0xfd, 0x79, 0xd6, 0xb5, 0x91, 0x08, 0xad, 0xac, - 0x00, 0xa5, 0xdb, 0xa4, 0x0d, 0xbc, 0xf7, 0x57, 0x7e, 0xdd, 0xbc, 0xde, - 0xe2, 0xb0, 0x83, 0x87, 0x5d, 0x2b, 0xf9, 0xb1, 0x68, 0x8c, 0xc8, 0x89, - 0x5c, 0xe6, 0xc5, 0xfb, 0x53, 0x3a, 0x18, 0x85, 0x1a, 0xbd, 0x86, 0x39, - 0x0c, 0x4d, 0x37, 0x2b, 0x1f, 0x41, 0x46, 0x34, 0x1f, 0xce, 0x4a, 0xc8, - 0x8f, 0x42, 0x9b, 0x45, 0x00, 0xcb, 0xa2, 0x51, 0x5d, 0xe8, 0xe5, 0xcf, - 0x51, 0x24, 0xd1, 0xef, 0x37, 0x7b, 0x9c, 0x44, 0x89, 0xef, 0xb5, 0x1a, - 0x64, 0x89, 0x20, 0x05, 0xfd, 0xda, 0x4e, 0x60, 0x57, 0x11, 0xb2, 0xdd, - 0x4f, 0x50, 0x5c, 0xe4, 0xe8, 0x93, 0x24, 0xe7, 0x2d, 0x03, 0x3f, 0x1a, - 0xac, 0xf1, 0x9e, 0x02, 0x34, 0xd3, 0x83, 0xfd, 0xa8, 0xf4, 0x47, 0x67, - 0xc5, 0x2d, 0x6e, 0xf8, 0xd6, 0xb0, 0xa6, 0xa7, 0xab, 0x1e, 0x18, 0x18, - 0x5d, 0x0c, 0xf4, 0x56, 0xe7, 0x74, 0x9f, 0xc4, 0x25, 0xf2, 0x2e, 0x7e, - 0xac, 0x31, 0x2f, 0x3d, 0x0b, 0x4e, 0x95, 0x6b, 0x8c, 0x39, 0xfe, 0x7a, - 0x23, 0xee, 0x2c, 0x6a, 0x4b, 0xc3, 0x6e, 0x30, 0x98, 0x63, 0xbf, 0xc3, - 0xb4, 0x88, 0xff, 0xe7, 0x3d, 0xdf, 0x73, 0x23, 0x7e, 0x0f, 0xd6, 0xbd, - 0x0c, 0x2e, 0xb1, 0x01, 0x6d, 0x9a, 0x82, 0xe8, 0x6a, 0xf2, 0x71, 0x2f, - 0x3c, 0x64, 0x93, 0x35, 0x56, 0x51, 0x05, 0x77, 0x7e, 0xdc, 0x53, 0xaf, - 0xc5, 0x2a, 0x32, 0x56, 0x7c, 0x4d, 0xe7, 0x63, 0x6a, 0xe7, 0x11, 0xc0, - 0x97, 0x13, 0x4a, 0x84, 0xdc, 0x09, 0xf7, 0x2b, 0xac, 0x7d, 0x3f, 0x89, - 0xac, 0x5e, 0x6f, 0x4c, 0xfb, 0xe3, 0x55, 0x89, 0x33, 0xfb, 0x66, 0x3d, - 0x6f, 0x5c, 0x1c, 0xea, 0xd7, 0x34, 0x32, 0xe9, 0xc1, 0xa6, 0xe5, 0x70, - 0x06, 0x49, 0x0b, 0x01, 0xb2, 0x79, 0xd2, 0xde, 0xcb, 0x34, 0xe4, 0xb4, - 0x18, 0xc3, 0x7c, 0xe7, 0xeb, 0x04, 0x1e, 0x3b, 0x0c, 0xbe, 0x41, 0x59, - 0xfe, 0xde, 0x39, 0x63, 0x43, 0x57, 0x11, 0x5c, 0xa5, 0x4b, 0xfb, 0x5c, - 0x02, 0x3f, 0x99, 0x27, 0x32, 0xf1, 0xa7, 0x85, 0x41, 0xa5, 0x2a, 0x3c, - 0x4a, 0x4e, 0x9c, 0xa6, 0x1f, 0x16, 0x06, 0xc5, 0x40, 0xb8, 0x30, 0x8f, - 0x7e, 0x24, 0x6d, 0x79, 0xab, 0xf5, 0x62, 0x13, 0x52, 0x43, 0x9c, 0x46, - 0xc7, 0x8d, 0x29, 0x0a, 0x4c, 0x89, 0x18, 0x7c, 0x11, 0x33, 0xe4, 0x43, - 0x19, 0xa8, 0x18, 0xb6, 0x1b, 0x31, 0x75, 0x08, 0x39, 0xac, 0xa5, 0xd6, - 0x8b, 0x63, 0x52, 0x4d, 0xb0, 0x94, 0x93, 0x54, 0x8f, 0x63, 0xae, 0x84, - 0xf7, 0xb3, 0x4d, 0x52, 0x51, 0x5e, 0xed, 0x92, 0x28, 0x78, 0x7a, 0x26, - 0x98, 0x9f, 0xc1, 0x24, 0xbd, 0x45, 0x41, 0x63, 0x0e, 0xd9, 0xd2, 0x33, - 0xb8, 0x70, 0xc7, 0xb5, 0xa8, 0x8d, 0x5f, 0xef, 0x4a, 0x26, 0x75, 0x9b, - 0x93, 0xe4, 0x31, 0x9a, 0xf1, 0xfb, 0x33, 0x8c, 0x2d, 0x09, 0x2f, 0xd4, - 0xb2, 0xee, 0x00, 0xed, 0x31, 0x10, 0x21, 0xea, 0xb1, 0x99, 0x5c, 0xaa, - 0xeb, 0x42, 0x1a, 0xa7, 0x58, 0x95, 0x8c, 0x6f, 0xcc, 0x7f, 0x56, 0x9f, - 0xc3, 0x42, 0x07, 0x80, 0x8c, 0xb3, 0xa3, 0x69, 0xf5, 0xc4, 0x68, 0x04, - 0x7a, 0xd5, 0xc8, 0xf3, 0xdc, 0x3d, 0x7a, 0xcc, 0xb5, 0xa8, 0x98, 0x73, - 0xec, 0x4b, 0xdf, 0x1e, 0xf6, 0x9b, 0x01, 0x44, 0xbc, 0x24, 0xd6, 0x27, - 0xf6, 0xce, 0x1a, 0xb5, 0xec, 0x93, 0x76, 0xf4, 0x11, 0xd4, 0x7d, 0xdd, - 0x12, 0xda, 0x48, 0x87, 0xde, 0xab, 0xad, 0x74, 0x36, 0x82, 0x79, 0xc7, - 0xc6, 0x90, 0x9f, 0x17, 0x9d, 0x60, 0x04, 0x6e, 0x07, 0x8b, 0xf8, 0xf4, - 0x32, 0x07, 0xa0, 0xa1, 0xb7, 0xe0, 0xab, 0x1e, 0xc8, 0x4f, 0x86, 0x5a, - 0x26, 0x3b, 0xef, 0xa8, 0x1a, 0x49, 0xf0, 0xe2, 0xc7, 0xb1, 0x03, 0x85, - 0x76, 0x73, 0x3f, 0xc6, 0xa3, 0x51, 0x31, 0x1f, 0x10, 0xf1, 0xba, 0x2f, - 0x4f, 0xb9, 0x9f, 0x54, 0x83, 0xce, 0xb6, 0xb1, 0xf7, 0x6c, 0x79, 0x10, - 0x78, 0x66, 0x0d, 0x01, 0x2c, 0x23, 0x47, 0x84, 0xca, 0xcc, 0xef, 0x12, - 0xa5, 0xad, 0x3f, 0x51, 0xa4, 0xda, 0x88, 0x1d, 0xff, 0x87, 0x0f, 0xab, - 0x13, 0x82, 0xcc, 0xc3, 0x2c, 0xb5, 0x93, 0x9d, 0xfc, 0xe9, 0x69, 0x21, - 0xd1, 0xd6, 0x3b, 0xec, 0xa1, 0xd4, 0x37, 0x95, 0xe2, 0x5c, 0x9e, 0x67, - 0x01, 0xda, 0x17, 0x5e, 0x3d, 0xda, 0x22, 0xd2, 0x5c, 0xdf, 0x5b, 0xfd, - 0x7d, 0x1b, 0xd0, 0x8b, 0x22, 0xdf, 0x71, 0xca, 0x16, 0xac, 0xdf, 0x8d, - 0x93, 0xfa, 0x81, 0xe5, 0x49, 0x79, 0x71, 0x95, 0xd9, 0xb2, 0xe8, 0x19, - 0xe3, 0x96, 0x48, 0xf6, 0x8e, 0x5a, 0x84, 0x6b, 0x82, 0x4b, 0xd1, 0x1c, - 0xca, 0xd3, 0x1e, 0x66, 0x11, 0x4e, 0xcc, 0xc5, 0x5b, 0xfd, 0xee, 0x94, - 0x6f, 0x78, 0x1a, 0x0d, 0x8d, 0x7a, 0x13, 0x7f, 0xb7, 0x54, 0xf1, 0x7d, - 0xb0, 0x00, 0x6a, 0x24, 0x7d, 0x18, 0xc1, 0xf2, 0xf1, 0xda, 0x2c, 0x21, - 0x13, 0xb7, 0x1d, 0x4e, 0x5c, 0x2c, 0x0c, 0x9b, 0xc4, 0xe8, 0x3b, 0xab, - 0x74, 0xb8, 0xe2, 0x61, 0xec, 0x7d, 0x24, 0xe2, 0x37, 0xcf, 0xab, 0x87, - 0xb3, 0xac, 0x0f, 0x1c, 0x1a, 0x74, 0x98, 0x8d, 0x32, 0x48, 0xae, 0xbf, - 0x74, 0x1e, 0x20, 0xcd, 0x16, 0xff, 0x53, 0x8b, 0x29, 0xfc, 0xc4, 0x23, - 0xdd, 0x36, 0x69, 0x35, 0xd9, 0x85, 0xe2, 0x34, 0x25, 0x9a, 0xaa, 0xb6, - 0x60, 0x72, 0x4a, 0x88, 0x89, 0x60, 0x83, 0xeb, 0x35, 0x6d, 0x72, 0xaa, - 0x7b, 0xf0, 0x12, 0x01, 0xc6, 0x19, 0x1f, 0xb0, 0xbb, 0x6f, 0x47, 0xb6, - 0x49, 0xcf, 0x8b, 0x2a, 0x8b, 0x18, 0xfc, 0x2e, 0x93, 0xc9, 0x7e, 0xa4, - 0x5a, 0xb6, 0xd4, 0x44, 0x57, 0x3f, 0x53, 0x1a, 0x46, 0x3f, 0xc3, 0x44, - 0xf0, 0x7d, 0xf8, 0x51, 0x93, 0xd0, 0xe9, 0x1e, 0x10, 0x58, 0x88, 0x1f, - 0xd3, 0xf2, 0xb4, 0x73, 0x9f, 0xc1, 0xa4, 0x64, 0x8e, 0xb9, 0x4d, 0x6a, - 0x6a, 0x35, 0x75, 0x85, 0x4e, 0x10, 0x17, 0xd8, 0x7d, 0xe6, 0x16, 0x96, - 0xf4, 0x1f, 0x31, 0xfa, 0xfc, 0x60, 0x07, 0x7d, 0x0c, 0xbc, 0x8c, 0xf5, - 0xf0, 0x8a, 0xcb, 0x56, 0x7a, 0x1e, 0xad, 0xd3, 0xde, 0xaf, 0x53, 0x10, - 0xcb, 0x6c, 0xe3, 0x07, 0x62, 0x34, 0x07, 0x76, 0x7a, 0xfe, 0xc4, 0xd4, - 0x77, 0x0e, 0x65, 0x7e, 0xb7, 0x64, 0xac, 0x34, 0x5c, 0x4d, 0xf5, 0x65, - 0xb7, 0x33, 0x70, 0xff, 0x0b, 0xda, 0x5a, 0xa7, 0xca, 0x31, 0xbc, 0x9e, - 0x08, 0x4b, 0xef, 0x07, 0x73, 0xe4, 0x7c, 0x0c, 0x15, 0xb8, 0xcb, 0x2c, - 0xdc, 0x47, 0xa1, 0x6e, 0xee, 0xa8, 0x4c, 0x58, 0xe4, 0xee, 0xb9, 0x9f, - 0x78, 0x00, 0xbb, 0xb7, 0x28, 0x65, 0x5b, 0x54, 0xe1, 0x75, 0x0c, 0x40, - 0xa1, 0xae, 0xb8, 0x32, 0x69, 0xf2, 0xb9, 0x46, 0x1e, 0x4e, 0x59, 0x12, - 0x27, 0xb8, 0x23, 0x94, 0xbe, 0x13, 0xda, 0xd1, 0xde, 0x62, 0x86, 0x87, - 0xd9, 0x53, 0x0b, 0x7d, 0x57, 0x3e, 0xa0, 0xd5, 0xcd, 0x05, 0x3d, 0x9a, - 0x0e, 0x98, 0x18, 0xc6, 0xb0, 0x07, 0x23, 0x7d, 0x6c, 0x7a, 0x1a, 0xe3, - 0x91, 0x44, 0xbc, 0x05, 0x5e, 0xd9, 0x71, 0xac, 0x9c, 0xc0, 0x0e, 0xc1, - 0x2e, 0x96, 0x99, 0x6f, 0x81, 0x54, 0xcb, 0xc4, 0xcf, 0x3e, 0xb4, 0x6d, - 0xac, 0x9f, 0x40, 0x6b, 0x6f, 0xa4, 0xc7, 0x25, 0x4e, 0x0e, 0x8b, 0xee, - 0x41, 0xfe, 0xe0, 0xf7, 0xee, 0x73, 0x27, 0x7c, 0x0a, 0x6e, 0x8b, 0x0a, - 0x12, 0x67, 0x26, 0x81, 0x62, 0x6b, 0x2c, 0x7d, 0x73, 0x38, 0x92, 0x9f, - 0x56, 0x17, 0x39, 0x62, 0x80, 0x6b, 0x21, 0xa4, 0x98, 0x30, 0x44, 0xce, - 0xfd, 0x83, 0x87, 0x34, 0x8a, 0xee, 0x49, 0x6a, 0xf1, 0x66, 0x50, 0xc7, - 0xef, 0x3b, 0x08, 0x51, 0xec, 0x11, 0x7b, 0xfb, 0xb8, 0x94, 0x65, 0xce, - 0xb4, 0x14, 0xe4, 0x73, 0x2f, 0x30, 0xc9, 0x0c, 0xd1, 0xff, 0x99, 0x53, - 0x0a, 0x24, 0x83, 0xbe, 0xe0, 0xb1, 0x36, 0x65, 0x9e, 0xdb, 0xab, 0xe3, - 0x36, 0xe4, 0xfa, 0x02, 0x9c, 0x03, 0xe1, 0xc5, 0xa6, 0x25, 0x54, 0xb5, - 0x02, 0xa2, 0x64, 0xe1, 0x44, 0xa4, 0x99, 0x70, 0x0c, 0xee, 0x79, 0x4a, - 0x58, 0xc5, 0x69, 0x08, 0x13, 0x8f, 0x3c, 0x6a, 0xbf, 0x3d, 0x6d, 0xa4, - 0x6c, 0x9d, 0xa0, 0x9a, 0x76, 0x4d, 0xb0, 0x72, 0xa5, 0x08, 0xf5, 0x5b, - 0xdd, 0x6b, 0xda, 0x80, 0x20, 0x9b, 0x07, 0xe9, 0x78, 0xde, 0x79, 0x6d, - 0xb1, 0x40, 0x8e, 0x67, 0xa7, 0x2b, 0xc7, 0xe4, 0x50, 0xb2, 0xfe, 0xd4, - 0x69, 0xba, 0x2c, 0x83, 0x8c, 0xe2, 0xdc, 0xaf, 0x41, 0x39, 0xd7, 0x36, - 0x51, 0xa4, 0xfe, 0x13, 0x92, 0x38, 0x07, 0x8d, 0xee, 0xb2, 0x93, 0x56, - 0xcb, 0xde, 0xd5, 0xf1, 0xe6, 0x5a, 0x2a, 0x36, 0x90, 0x59, 0xe1, 0x10, - 0x1a, 0x50, 0x03, 0x8e, 0xb9, 0x49, 0x90, 0x45, 0x6d, 0xc8, 0x53, 0xf7, - 0x21, 0x30, 0x05, 0x87, 0x3c, 0xd5, 0x37, 0xb0, 0x80, 0x41, 0x54, 0xd3, - 0x73, 0x15, 0x88, 0xee, 0x85, 0xa8, 0xc4, 0x1e, 0x28, 0xeb, 0x74, 0xf4, - 0x12, 0x1d, 0xc6, 0xf6, 0x13, 0x28, 0x4e, 0x02, 0xde, 0x8a, 0x5c, 0xae, - 0xa5, 0x44, 0x52, 0x99, 0x2d, 0xe8, 0x15, 0xff, 0xc7, 0x1b, 0xb8, 0xe9, - 0x81, 0x86, 0x97, 0xeb, 0x94, 0x43, 0x9c, 0x3a, 0x5e, 0x6d, 0x8e, 0x34, - 0xb0, 0x2a, 0xd8, 0xa1, 0x8a, 0xc7, 0xa0, 0x9d, 0x30, 0x61, 0x43, 0x35, - 0x46, 0x46, 0x28, 0xbf, 0xb6, 0x38, 0x36, 0x73, 0xb3, 0x0a, 0x50, 0xc2, - 0xb4, 0xf1, 0xb2, 0xcc, 0x47, 0x6f, 0xb8, 0xa9, 0x95, 0xe6, 0xa6, 0xcb, - 0x06, 0xb1, 0xc0, 0x4c, 0x5d, 0x45, 0x7a, 0x44, 0xb3, 0x73, 0x29, 0x7e, - 0xa6, 0x8a, 0x56, 0xd4, 0x41, 0x4e, 0x6b, 0xc6, 0x3e, 0x81, 0xe7, 0x4f, - 0x37, 0xf3, 0x51, 0xb6, 0x01, 0xa2, 0x34, 0xa0, 0x18, 0xc7, 0xdd, 0xb9, - 0x79, 0x45, 0x25, 0x35, 0x78, 0x43, 0xeb, 0x4a, 0x17, 0xa3, 0x24, 0x76, - 0xa6, 0x68, 0x7e, 0xba, 0x54, 0xa7, 0x5f, 0x28, 0x91, 0x28, 0xa8, 0x7f, - 0xc6, 0xbb, 0xc3, 0x43, 0xba, 0x9a, 0x5e, 0xe4, 0x81, 0x25, 0x4c, 0x89, - 0x23, 0x61, 0x32, 0x61, 0x31, 0x88, 0x9a, 0xf7, 0x2c, 0xb0, 0x63, 0xe9, - 0xd9, 0x60, 0xb1, 0x23, 0x5c, 0xb5, 0x45, 0x1e, 0x74, 0xe4, 0x27, 0xc9, - 0x08, 0x1f, 0xf2, 0xbf, 0xa5, 0x8a, 0x8f, 0x09, 0x10, 0xb7, 0x9d, 0x79, - 0x7b, 0x8f, 0xf1, 0x47, 0x6b, 0x2b, 0xb8, 0x36, 0x32, 0xaa, 0x29, 0x42, - 0xc9, 0x13, 0x99, 0x3e, 0x7d, 0x15, 0xea, 0x5a, 0xc6, 0xfa, 0xf0, 0x78, - 0x3d, 0xca, 0xd0, 0x5a, 0x95, 0x25, 0x0b, 0x5a, 0xbb, 0xd0, 0x81, 0x72, - 0x4c, 0xd6, 0xeb, 0xb0, 0xbc, 0x1b, 0x28, 0x07, 0x97, 0xd9, 0xfc, 0x6a, - 0x4d, 0x19, 0x94, 0x76, 0x0d, 0x55, 0x7a, 0xfe, 0x53, 0x53, 0x77, 0xa4, - 0xc6, 0x8f, 0x23, 0x80, 0x81, 0x6d, 0x1c, 0xe5, 0x8e, 0x26, 0x15, 0xf3, - 0xb2, 0x3e, 0xe1, 0x38, 0x79, 0x5e, 0x5b, 0x4c, 0x70, 0x08, 0x04, 0x28, - 0xba, 0x88, 0x3f, 0x39, 0x71, 0xd4, 0x01, 0x23, 0x85, 0xca, 0xe7, 0xfb, - 0xe8, 0xb1, 0x53, 0x18, 0x3f, 0xcc, 0x37, 0x74, 0xb6, 0xfe, 0xca, 0x93, - 0x2d, 0x88, 0x1c, 0x85, 0x05, 0xfc, 0x87, 0x9c, 0x3d, 0xb4, 0x77, 0xe5, - 0x18, 0x3a, 0x0d, 0x82, 0xd9, 0xc5, 0x15, 0xb6, 0x35, 0xc1, 0xe8, 0xb9, - 0x3e, 0xb6, 0xe4, 0xdf, 0xd8, 0x0a, 0xf2, 0x6e, 0xde, 0x10, 0x49, 0xf9, - 0x73, 0xf6, 0xaf, 0x04, 0xd2, 0xa1, 0xbb, 0x33, 0x4d, 0xd8, 0x10, 0x90, - 0xde, 0x3b, 0x08, 0xc9, 0xf7, 0x76, 0x78, 0x5e, 0xc0, 0x66, 0x17, 0xd3, - 0xe1, 0x6e, 0x4f, 0xdd, 0x6e, 0x4e, 0x32, 0x50, 0xe1, 0x6f, 0xb6, 0x52, - 0x76, 0x5e, 0x52, 0x8c, 0x14, 0x7a, 0xfe, 0x96, 0x9e, 0x60, 0x96, 0x10, - 0x7a, 0x2a, 0xf6, 0xd3, 0x70, 0x5d, 0x40, 0x34, 0xa7, 0xb7, 0x84, 0x6f, - 0xd4, 0x2b, 0xba, 0x5b, 0xb3, 0xcd, 0xf1, 0x2c, 0x8f, 0x47, 0x00, 0xae, - 0x15, 0xa4, 0xfb, 0x3d, 0x8b, 0xbe, 0xcf, 0xe2, 0x7d, 0x09, 0xa8, 0xa7, - 0xe1, 0x19, 0xd4, 0xe1, 0x24, 0x61, 0x1e, 0xdf, 0x17, 0x90, 0x00, 0xcd, - 0x69, 0x53, 0x82, 0x0f, 0x73, 0x31, 0x50, 0xd0, 0x75, 0xa8, 0x25, 0x6b, - 0x8c, 0x79, 0x8d, 0x07, 0xed, 0xec, 0x48, 0x13, 0x65, 0xf6, 0x86, 0xa8, - 0x63, 0x9f, 0x0c, 0xe0, 0x8e, 0x2a, 0x1b, 0x73, 0x29, 0xad, 0x84, 0x0f, - 0xd9, 0x52, 0x4e, 0x27, 0xb2, 0x3e, 0xe1, 0x38, 0x79, 0x5e, 0x5b, 0x4c, - 0x72, 0x81, 0x04, 0x28, 0xba, 0xe0, 0x3f, 0x39, 0x3b, 0x8e, 0xa6, 0x19, - 0x95, 0x53, 0x47, 0xba, 0x71, 0xb6, 0x2a, 0xea, 0xb8, 0x96, 0xa9, 0x3c, - 0xcb, 0x76, 0xf5, 0xe9, 0xd5, 0x06, 0xed, 0xfe, 0x1a, 0xed, 0x42, 0xf5, - 0x24, 0x1a, 0xfa, 0x8e, 0xe4, 0xfe, 0xd9, 0xd1, 0x2b, 0x3f, 0x6d, 0xa3, - 0x9f, 0xea, 0xc3, 0xf7, 0x3d, 0x17, 0xca, 0xa9, 0x5c, 0x39, 0x36, 0x5b, - 0x92, 0x49, 0x88, 0xc4, 0xed, 0x2a, 0x43, 0x5d, 0x98, 0xf9, 0xc0, 0x83, - 0x99, 0xf8, 0x3b, 0x5b, 0xef, 0x84, 0x30, 0xa6, 0xd6, 0x24, 0x16, 0xe0, - 0x45, 0xd9, 0xf9, 0xfb, 0xb1, 0xda, 0x6e, 0x9d, 0x6d, 0xfa, 0x0f, 0xae, - 0xe4, 0x2d, 0xf7, 0x8c, 0xf8, 0x58, 0xfa, 0xb9, 0xe3, 0x9b, 0x35, 0xb7, - 0xbc, 0x1d, 0xf3, 0xc8, 0x80, 0x1e, 0x56, 0x32, 0xd1, 0x74, 0x23, 0x8e, - 0xd8, 0xe4, 0x4e, 0x38, 0x22, 0x3b, 0xc0, 0x29, 0xd3, 0x38, 0x7d, 0x05, - 0xad, 0x27, 0x45, 0xac, 0x99, 0xab, 0x11, 0xc6, 0x9d, 0x39, 0x11, 0x07, - 0xe0, 0xbb, 0xfc, 0xc4, 0x9d, 0x56, 0xe6, 0xdf, 0x67, 0xe8, 0x6b, 0xfb, - 0x77, 0xfc, 0x73, 0xe9, 0xac, 0xe8, 0x89, 0xe7, 0x6c, 0x31, 0x93, 0xd8, - 0x3a, 0x62, 0xeb, 0xb7, 0xf1, 0x89, 0xe1, 0x3e, 0x55, 0x34, 0x5e, 0xa9, - 0x6f, 0x1b, 0x06, 0x33, 0xff, 0x00, 0x0f, 0x7f, 0x33, 0x9e, 0x73, 0x71, - 0x48, 0x9f, 0xd2, 0x51, 0x09, 0xbd, 0x5a, 0x2b, 0x13, 0xfd, 0x0a, 0xd8, - 0x10, 0x20, 0x0a, 0x87, 0xd3, 0x86, 0x4f, 0x0c, 0x15, 0x33, 0x06, 0x98, - 0xe9, 0x39, 0x02, 0x6f, 0xce, 0xfc, 0xb2, 0x69, 0x0c, 0x2d, 0x95, 0x9a, - 0x5f, 0x09, 0xb0, 0x1b, 0x92, 0xa4, 0x22, 0x59, 0x09, 0x7b, 0xc4, 0x5b, - 0xbb, 0x28, 0x47, 0x7f, 0xac, 0x25, 0x27, 0x3c, 0xf0, 0x1f, 0x06, 0x25, - 0xfb, 0x42, 0x02, 0x1b, 0x54, 0x54, 0xc7, 0x7d, 0x64, 0x8b, 0x2a, 0x0c, - 0x96, 0x9a, 0x33, 0x8d, 0xca, 0x3c, 0x9e, 0x25, 0xad, 0x5a, 0x21, 0xb9, - 0x15, 0x40, 0xd1, 0xa8, 0x5f, 0x50, 0xdd, 0x16, 0x76, 0x3b, 0x57, 0xd5, - 0x6e, 0x87, 0xdd, 0xcf, 0x70, 0x66, 0xc7, 0x94, 0x61, 0x72, 0x4b, 0x1c, - 0xd5, 0xea, 0x17, 0x5b, 0x78, 0xe9, 0x01, 0x77, 0xaa, 0x72, 0x42, 0x7f, - 0x20, 0x54, 0x3e, 0x8e, 0x6e, 0x04, 0xe6, 0xdd, 0xe0, 0xb7, 0x2f, 0xe4, - 0xe1, 0x00, 0x0c, 0x75, 0xbd, 0xd6, 0x00, 0xb6, 0x30, 0x3b, 0xe2, 0xac, - 0xe7, 0xb3, 0xad, 0x98, 0x66, 0x89, 0xa5, 0x7b, 0x00, 0x4d, 0xe0, 0x5f, - 0x0f, 0x8d, 0x72, 0xba, 0x92, 0xf8, 0x80, 0xc5, 0xc9, 0x6d, 0x39, 0x1b, - 0x64, 0x2a, 0x1d, 0x63, 0x71, 0xe6, 0xf4, 0xb4, 0x51, 0x7a, 0x94, 0xc9, - 0x80, 0x1f, 0xeb, 0xff, 0xc2, 0x77, 0x7e, 0x52, 0x5a, 0xfe, 0x8b, 0x28, - 0xd8, 0x39, 0xce, 0x86, 0x09, 0x23, 0x34, 0x2a, 0xea, 0x6c, 0xe6, 0x9d, - 0xea, 0xf8, 0x35, 0xbf, 0x8b, 0x89, 0x06, 0x50, 0x73, 0xa9, 0x51, 0x55, - 0x1f, 0x4a, 0xd8, 0x4f, 0xe7, 0xc0, 0xb7, 0xb7, 0xd3, 0x1b, 0x2c, 0x12, - 0x01, 0xc6, 0xff, 0xfb, 0x26, 0x20, 0xc0, 0x1c, 0xe3, 0x45, 0xa4, 0xdf, - 0x63, 0xb2, 0x22, 0xaf, 0x03, 0x03, 0x5f, 0xb0, 0xf1, 0x60, 0x0f, 0x9c, - 0x05, 0x5a, 0x51, 0x7f, 0xaa, 0xdc, 0xbb, 0x50, 0x7d, 0x5b, 0x5d, 0x03, - 0x40, 0x1f, 0x8c, 0xe2, 0xb0, 0xe6, 0xa7, 0xaa, 0x88, 0xa2, 0x3e, 0x0c, - 0xf9, 0xcb, 0x1c, 0xa0, 0xa1, 0xd1, 0x80, 0xc0, 0xea, 0xab, 0x11, 0xf1, - 0x3f, 0xa1, 0xc3, 0x16, 0x21, 0x8d, 0x81, 0xda, 0x39, 0x3e, 0x19, 0xc6, - 0x96, 0x89, 0xd7, 0x00, 0xeb, 0x4d, 0x0a, 0x34, 0x2c, 0x6d, 0x97, 0x09, - 0x91, 0x72, 0xed, 0x62, 0x32, 0x1c, 0x19, 0xbb, 0x3a, 0x39, 0x02, 0x65, - 0x48, 0x77, 0x74, 0x5c, 0xc9, 0x74, 0x0f, 0xce, 0xa2, 0x9f, 0xf4, 0xee, - 0x4f, 0x13, 0xab, 0x26, 0x26, 0xa4, 0xb9, 0x5b, 0xcb, 0xa8, 0xfc, 0xe3, - 0x0d, 0x02, 0x4a, 0x7d, 0xd7, 0x34, 0x2c, 0xbc, 0xc9, 0x1e, 0xbd, 0xc0, - 0x9c, 0xa7, 0x3f, 0x23, 0x20, 0x35, 0xf4, 0x3f, 0x74, 0x46, 0xed, 0x7c, - 0xb5, 0x58, 0xad, 0x13, 0x9f, 0xce, 0x52, 0x03, 0x91, 0xa1, 0x64, 0xdf, - 0xe9, 0xe5, 0xb1, 0x36, 0x2b, 0x90, 0x06, 0x2e, 0xe2, 0xd7, 0x00, 0xc6, - 0x7c, 0xd9, 0x79, 0x88, 0x12, 0x69, 0x6a, 0xd3, 0x6a, 0x3e, 0x31, 0x85, - 0x15, 0xaf, 0xea, 0xdf, 0xeb, 0x19, 0x01, 0x33, 0x2d, 0x06, 0x61, 0x82, - 0xe1, 0x35, 0xfe, 0x81, 0x7b, 0xbc, 0x5b, 0x21, 0x02, 0x87, 0x36, 0x1b, - 0x66, 0x5b, 0xdc, 0x4f, 0x13, 0x74, 0x67, 0xe0, 0xa9, 0xe9, 0x1e, 0x28, - 0xf3, 0x48, 0x02, 0x2d, 0x7d, 0x72, 0x5f, 0xb8, 0x79, 0x3f, 0xc5, 0x9d, - 0x2e, 0xef, 0x66, 0x2f, 0x15, 0xe4, 0x95, 0xa9, 0xe7, 0x89, 0x18, 0xf5, - 0x4a, 0xb3, 0x2d, 0x08, 0x0e, 0x63, 0xd0, 0x9f, 0x43, 0x50, 0x28, 0xf0, - 0x70, 0x67, 0xb1, 0xd6, 0x59, 0x44, 0x2c, 0xee, 0x76, 0x12, 0x93, 0x42, - 0xa2, 0xb3, 0x91, 0x94, 0xbc, 0x4c, 0x4c, 0x73, 0xae, 0xe9, 0x6e, 0x4c, - 0x53, 0x0a, 0xc2, 0x17, 0xd1, 0x9c, 0xb5, 0xc8, 0x9e, 0x75, 0x87, 0x26, - 0xd4, 0x33, 0x9e, 0x14, 0x73, 0x62, 0x5b, 0x74, 0xc5, 0x21, 0x39, 0x10, - 0x17, 0x77, 0xb2, 0x25, 0x45, 0x56, 0x1e, 0x7a, 0xcb, 0x5c, 0xa2, 0xbc, - 0xec, 0x5c, 0x1d, 0x91, 0x6c, 0x4f, 0x81, 0x8e, 0x55, 0xa7, 0x6b, 0x83, - 0x67, 0xe9, 0x26, 0x12, 0x94, 0xb4, 0xa1, 0xc2, 0x94, 0xbf, 0x0f, 0x3e, - 0xe4, 0x82, 0x88, 0x43, 0x81, 0xe8, 0x96, 0xc8, 0xf7, 0xa3, 0x66, 0x50, - 0x78, 0xd6, 0x73, 0x1a, 0x00, 0x5e, 0x35, 0x05, 0x61, 0x68, 0x00, 0xf0, - 0x9c, 0x75, 0xc5, 0xf5, 0x22, 0xf4, 0xae, 0x75, 0xe7, 0x8c, 0x2c, 0x61, - 0xc6, 0x45, 0x54, 0xc2, 0x4b, 0x86, 0x6a, 0x45, 0x76, 0x9d, 0xef, 0x77, - 0x09, 0x51, 0xb9, 0xfe, 0xca, 0x3c, 0xfc, 0x7a, 0x7a, 0x02, 0x6f, 0xf3, - 0x4a, 0xd6, 0xff, 0x8f, 0x31, 0xe2, 0x64, 0x34, 0x12, 0x19, 0x15, 0x95, - 0xb5, 0xc7, 0xbd, 0xa1, 0xc4, 0x46, 0x90, 0x1f, 0x78, 0x92, 0x37, 0x6d, - 0x03, 0x46, 0x2d, 0x08, 0xeb, 0x31, 0x13, 0x52, 0x73, 0x7f, 0x65, 0xcd, - 0x2f, 0x3f, 0xe6, 0xb2, 0x57, 0x02, 0x18, 0xd7, 0x0c, 0x1d, 0xed, 0x8e, - 0x8f, 0xed, 0xcd, 0x13, 0x22, 0x3e, 0x51, 0x35, 0x82, 0x79, 0x05, 0x78, - 0x86, 0x23, 0x4b, 0x25, 0x00, 0x1d, 0x1c, 0x10, 0xff, 0x4b, 0x65, 0xf7, - 0x47, 0xde, 0xf9, 0x36, 0xc9, 0xaf, 0x09, 0xff, 0x54, 0x92, 0x87, 0xaa, - 0x81, 0x8c, 0xf1, 0xef, 0xf6, 0x20, 0xfd, 0x01, 0xdb, 0xcc, 0x41, 0x8b, - 0x40, 0x4a, 0xc9, 0xc6, 0x91, 0xbb, 0xd7, 0x1c, 0x30, 0x00, 0x5d, 0x10, - 0x48, 0x4c, 0xd6, 0x3b, 0xe3, 0xb8, 0x47, 0x6a, 0x15, 0x41, 0x97, 0x28, - 0x02, 0x98, 0x5c, 0xf0, 0xbe, 0xaa, 0x6f, 0xf8, 0xcd, 0xdc, 0x8f, 0x6c, - 0x31, 0xf8, 0x7c, 0x8e, 0x29, 0x70, 0x2c, 0xe1, 0x69, 0xfb, 0x41, 0x4e, - 0x04, 0x1d, 0x0e, 0xe1, 0x52, 0xc5, 0x4e, 0xd3, 0xe5, 0xb8, 0x6d, 0xab, - 0x99, 0x17, 0x5e, 0x4a, 0xf0, 0x9b, 0xd7, 0xf4, 0xb5, 0xd3, 0xb5, 0xad, - 0x71, 0x97, 0x49, 0x04, 0x5d, 0xd9, 0x22, 0xba, 0x8a, 0xbc, 0xb9, 0x33, - 0x74, 0xf4, 0xf3, 0xa7, 0x60, 0x2f, 0xad, 0xe9, 0x0c, 0xe7, 0xc8, 0x91, - 0xd0, 0x4f, 0xc6, 0x0a, 0x77, 0x74, 0xaa, 0xd2, 0x90, 0x25, 0x3f, 0x7c, - 0x80, 0xe1, 0xad, 0x2b, 0x97, 0x42, 0x39, 0x60, 0x6e, 0x7a, 0x29, 0x39, - 0x29, 0x1d, 0x3c, 0x75, 0x07, 0xf3, 0x44, 0xd6, 0x6f, 0x3b, 0x9a, 0x00, - 0x76, 0xc9, 0x9d, 0x3b, 0x3e, 0x4a, 0x0b, 0x40, 0xc0, 0x6e, 0xdc, 0xdc, - 0xb7, 0x29, 0xa7, 0x3d, 0x59, 0x4a, 0x8f, 0xa0, 0xd4, 0xce, 0x47, 0xbe, - 0x85, 0x67, 0xf9, 0xd4, 0xd6, 0x1b, 0x5f, 0x9d, 0x53, 0x97, 0x4c, 0xfa, - 0x95, 0x22, 0xa8, 0x2f, 0x2d, 0x7f, 0x91, 0x68, 0xca, 0xfe, 0xc4, 0x6d, - 0x80, 0xc7, 0xed, 0x08, 0x87, 0x49, 0xef, 0x30, 0x0c, 0x2c, 0xf2, 0x72, - 0x73, 0x05, 0xe3, 0xf7, 0x33, 0x32, 0x7a, 0x40, 0x34, 0xe1, 0xdb, 0x9a, - 0xb0, 0x88, 0xcf, 0x10, 0x94, 0x62, 0xc4, 0x65, 0x88, 0xb3, 0x52, 0xa6, - 0x32, 0x0c, 0x7f, 0xdc, 0x37, 0xd0, 0x9c, 0xb9, 0x6f, 0x8f, 0x9a, 0x32, - 0x01, 0xba, 0x1b, 0xb0, 0xd5, 0xb8, 0xe9, 0xc0, 0x2c, 0x92, 0xe1, 0xe6, - 0xa1, 0x19, 0x25, 0xfe, 0x6f, 0x4d, 0x70, 0x6c, 0x6b, 0xb6, 0x9d, 0x37, - 0x76, 0x86, 0x01, 0x58, 0xa2, 0x0b, 0x25, 0xbc, 0x31, 0xe7, 0xfe, 0x6f, - 0x3d, 0x1f, 0xac, 0xde, 0xd7, 0xee, 0xdc, 0xbb, 0x7d, 0x52, 0x5f, 0x62, - 0x90, 0x19, 0xf4, 0xc6, 0x15, 0x32, 0x29, 0xbe, 0x34, 0x17, 0xe1, 0xda, - 0x2d, 0xf4, 0xcf, 0xa4, 0xae, 0xf7, 0x37, 0x79, 0xce, 0xf8, 0x27, 0x76, - 0xff, 0x49, 0x81, 0x18, 0x96, 0x2a, 0x7b, 0xe4, 0xf8, 0xda, 0x5a, 0xaa, - 0x45, 0x9a, 0x4a, 0xe4, 0xab, 0xee, 0x7e, 0x61, 0x9f, 0xf8, 0x3a, 0x70, - 0x4b, 0x79, 0xc7, 0xbc, 0xb0, 0x77, 0x39, 0x04, 0xd2, 0xc1, 0x23, 0x14, - 0x44, 0xe1, 0x2e, 0x2b, 0xdd, 0xd1, 0xd4, 0x46, 0xed, 0xf0, 0x06, 0x7e, - 0xed, 0x7d, 0xfe, 0x6e, 0x96, 0x6b, 0xea, 0x99, 0x80, 0xbc, 0x6a, 0xfe, - 0x79, 0x09, 0x7d, 0xfc, 0x15, 0x54, 0x0b, 0x2f, 0x9f, 0x70, 0x0d, 0x45, - 0x38, 0x75, 0x20, 0x7d, 0xa5, 0x71, 0x74, 0x94, 0x36, 0xab, 0xb6, 0x75, - 0x41, 0x8c, 0x33, 0x45, 0x69, 0x35, 0xa6, 0xb2, 0xa0, 0x80, 0xc5, 0x39, - 0x44, 0x0c, 0x7b, 0x07, 0x0b, 0x91, 0xf2, 0x6d, 0x40, 0xf2, 0xff, 0x8d, - 0xac, 0xa9, 0x48, 0xd4, 0x26, 0x22, 0x5b, 0x32, 0x10, 0x4c, 0xc3, 0xd7, - 0xc4, 0xa9, 0x23, 0xe2, 0xc8, 0xf5, 0x29, 0x1a, 0xf0, 0x89, 0x9b, 0xc3, - 0x27, 0x70, 0xc8, 0xf6, 0x3a, 0x2e, 0x9a, 0x4c, 0xca, 0xc7, 0xad, 0x49, - 0xce, 0x3a, 0x74, 0xec, 0x38, 0x14, 0x7d, 0x7c, 0x62, 0x88, 0x46, 0x69, - 0x37, 0x4a, 0xf5, 0x65, 0x4b, 0x3d, 0x38, 0x6f, 0xee, 0xc1, 0xe7, 0xf2, - 0x9f, 0x4f, 0xe9, 0x43, 0x9b, 0x61, 0x51, 0xac, 0xa6, 0xdf, 0x0f, 0x78, - 0xf3, 0xfb, 0x21, 0x03, 0x5a, 0x88, 0x1f, 0x44, 0x7f, 0xbf, 0xf2, 0x15, - 0xd5, 0x2b, 0x47, 0x1c, 0x49, 0xcb, 0xb6, 0xe1, 0x64, 0xa0, 0x87, 0x25, - 0xea, 0x13, 0x94, 0x4c, 0x1e, 0xe6, 0x01, 0x2b, 0x63, 0x3e, 0xeb, 0xfa, - 0x11, 0xe7, 0xcd, 0x9c, 0x39, 0xe3, 0x5f, 0x1d, 0xfb, 0x7c, 0x4a, 0x79, - 0x8c, 0x2c, 0x55, 0xda, 0x28, 0x34, 0x74, 0x40, 0x97, 0x80, 0x29, 0x64, - 0x43, 0xea, 0xef, 0x0a, 0x13, 0xac, 0x35, 0x8a, 0xd9, 0x0c, 0x0d, 0xd8, - 0x32, 0x45, 0x7a, 0x0f, 0xc7, 0xb8, 0x03, 0xd5, 0x63, 0x73, 0x0b, 0x2e, - 0xf8, 0xb8, 0xd7, 0x41, 0xc4, 0x27, 0x1f, 0x26, 0x3a, 0x4b, 0xda, 0x37, - 0xa4, 0xcb, 0xb6, 0xdd, 0xbf, 0x9d, 0xb1, 0xad, 0xd1, 0xe9, 0x35, 0xc4, - 0x89, 0x1d, 0xe2, 0x68, 0xa0, 0x39, 0x5b, 0xb6, 0xda, 0x43, 0x9b, 0x60, - 0x0d, 0xea, 0x45, 0x95, 0x4e, 0x33, 0xd9, 0x1b, 0xca, 0x52, 0x51, 0x85, - 0x9f, 0x74, 0x4d, 0xb8, 0xeb, 0x40, 0x4a, 0x50, 0xa8, 0x50, 0xe6, 0xf9, - 0x84, 0xba, 0x80, 0xa1, 0x0a, 0xf6, 0xba, 0x88, 0x9c, 0x5b, 0xce, 0xc3, - 0xe6, 0x34, 0x88, 0x95, 0x72, 0xcb, 0xdc, 0xd9, 0x8f, 0x38, 0x41, 0x9b, - 0x95, 0x19, 0x1c, 0xc5, 0xcb, 0x62, 0x69, 0x5a, 0x31, 0x35, 0xd9, 0x81, - 0xfe, 0x56, 0x11, 0xda, 0x19, 0xed, 0x9d, 0x04, 0x54, 0x66, 0x67, 0x85, - 0x1a, 0x0f, 0x97, 0x10, 0x36, 0x35, 0xb7, 0x60, 0x91, 0x3e, 0xe2, 0x12, - 0x98, 0x92, 0x7e, 0x97, 0x42, 0x2c, 0xb5, 0xdd, 0x80, 0xc5, 0x79, 0x81, - 0xe4, 0xa8, 0x0e, 0x1e, 0xc7, 0x8e, 0xaa, 0xd5, 0x15, 0x2b, 0xb5, 0x42, - 0x1f, 0xb7, 0xf6, 0x14, 0xad, 0xad, 0xa6, 0xa5, 0x8e, 0x0e, 0xa3, 0xfa, - 0x77, 0x81, 0x66, 0x5e, 0x79, 0x6b, 0xd2, 0xf5, 0x4b, 0x7b, 0xa5, 0xd0, - 0x30, 0xf8, 0x27, 0x76, 0x9a, 0x61, 0xad, 0x82, 0xea, 0x8f, 0x22, 0x54, - 0xc0, 0x35, 0xe5, 0x31, 0xeb, 0xed, 0x5d, 0x03, 0x5a, 0xf4, 0x41, 0xc3, - 0x81, 0xe0, 0xea, 0xeb, 0x74, 0x3d, 0x80, 0x92, 0xc9, 0x70, 0xa8, 0xf5, - 0x03, 0xfe, 0x57, 0xe3, 0x58, 0xd2, 0xc5, 0xd6, 0x5d, 0x2d, 0xb7, 0xc3, - 0xde, 0xd4, 0x7e, 0x6c, 0xc2, 0x28, 0xd3, 0x47, 0x73, 0x76, 0x98, 0x04, - 0xf6, 0xec, 0xbd, 0x64, 0x21, 0x4d, 0x6a, 0xe1, 0x8f, 0x4d, 0x7a, 0x0f, - 0xf0, 0xcd, 0x85, 0x29, 0x2e, 0x77, 0xb8, 0xce, 0x53, 0xde, 0x98, 0x7f, - 0x5e, 0xd9, 0x1d, 0x28, 0xa8, 0x5b, 0x11, 0xd5, 0x0f, 0xf7, 0x57, 0x22, - 0xe1, 0xf4, 0x81, 0xa9, 0x09, 0xee, 0x26, 0x19, 0xbf, 0x06, 0xcd, 0x4c, - 0xe1, 0xb5, 0xaf, 0x7a, 0x09, 0x66, 0xb7, 0x03, 0x5b, 0xb5, 0xa7, 0x6e, - 0x13, 0x2d, 0xc0, 0x34, 0x37, 0xa5, 0xfb, 0xa5, 0xf3, 0x94, 0xf0, 0xad, - 0x62, 0xe5, 0x08, 0xf6, 0x47, 0xc9, 0x1d, 0x09, 0x97, 0x92, 0xfb, 0x63, - 0x43, 0x3d, 0x91, 0xa3, 0x3c, 0x4c, 0x88, 0xef, 0x4d, 0xe0, 0x99, 0x0e, - 0x33, 0x4d, 0x0d, 0x64, 0xb0, 0x01, 0xd0, 0x0b, 0x7c, 0x88, 0x70, 0x93, - 0x47, 0x99, 0x71, 0xac, 0xba, 0x35, 0x3b, 0xa1, 0x11, 0xa7, 0x0c, 0xcb, - 0x54, 0xc9, 0x0f, 0x1f, 0xc6, 0x56, 0x7f, 0x46, 0x50, 0xc1, 0x7d, 0x33, - 0x04, 0x4c, 0xd6, 0x6c, 0xe2, 0x7a, 0x3d, 0xc4, 0xe7, 0xa4, 0x34, 0xa1, - 0xe3, 0x91, 0x5e, 0xa9, 0xaa, 0xb1, 0x93, 0x39, 0x1d, 0xbb, 0x84, 0xcf, - 0xef, 0xd8, 0x8d, 0x89, 0xb8, 0x20, 0x1d, 0x32, 0x77, 0xdd, 0x93, 0x58, - 0x05, 0x16, 0x72, 0x59, 0x02, 0xf3, 0x9d, 0x02, 0x64, 0xae, 0xe0, 0x4f, - 0xba, 0x1b, 0xae, 0x3b, 0x83, 0x22, 0xa2, 0x84, 0x6c, 0x56, 0xa4, 0xbf, - 0x57, 0x17, 0xa6, 0x5c, 0xb8, 0x9e, 0x57, 0xe3, 0x71, 0xcd, 0xd7, 0xcc, - 0xa2, 0x58, 0x7f, 0x8f, 0xb3, 0x68, 0x21, 0x76, 0xb3, 0xad, 0xce, 0xcf, - 0xd2, 0xf0, 0xf2, 0xd1, 0x67, 0x48, 0x4d, 0xb6, 0x85, 0x65, 0xc8, 0xa1, - 0x04, 0xad, 0xce, 0xad, 0x48, 0x71, 0xb0, 0xae, 0xec, 0x17, 0x1d, 0xde, - 0x8d, 0xe2, 0x18, 0x61, 0xef, 0x6e, 0x19, 0x6c, 0x93, 0x33, 0xb5, 0xf2, - 0xc0, 0x92, 0x4c, 0x3d, 0xe0, 0x8f, 0x17, 0x5a, 0x9b, 0x9c, 0x3b, 0x1d, - 0xc7, 0x5b, 0x89, 0x7f, 0x92, 0x13, 0x25, 0xa7, 0xc4, 0x2c, 0x0d, 0xf0, - 0x1e, 0xda, 0x75, 0xa9, 0x0a, 0xef, 0xa8, 0xbb, 0x83, 0x04, 0x5f, 0x22, - 0xe3, 0x93, 0x14, 0x49, 0x84, 0x4d, 0x7a, 0x32, 0x17, 0xa9, 0xb9, 0x47, - 0x35, 0xcc, 0x46, 0x4e, 0x5e, 0x20, 0x3a, 0xc7, 0xd1, 0xe4, 0x11, 0xa8, - 0x13, 0x4d, 0x4d, 0xd8, 0x07, 0xa6, 0xae, 0xb8, 0x59, 0x62, 0xa6, 0x00, - 0xaf, 0xfd, 0x6c, 0x5a, 0xc3, 0x89, 0xc4, 0xf3, 0xc0, 0x97, 0x1d, 0xfd, - 0x11, 0xcd, 0x53, 0x5c, 0x45, 0x44, 0x87, 0x33, 0xab, 0x24, 0xd1, 0x05, - 0xf5, 0x2f, 0xbb, 0x31, 0x1b, 0xf8, 0xc7, 0x6d, 0xda, 0xc9, 0x5a, 0x78, - 0x96, 0xfd, 0xb6, 0xce, 0xa7, 0x6e, 0xff, 0xed, 0xad, 0xf5, 0xce, 0x74, - 0x1b, 0x78, 0x40, 0x1f, 0x61, 0xe9, 0x3f, 0x87, 0xaa, 0x0e, 0xbd, 0x45, - 0x46, 0x03, 0x33, 0x1c, 0x38, 0x14, 0x38, 0xa4, 0xf2, 0xe3, 0xb6, 0xe3, - 0xe9, 0x7e, 0x82, 0xb5, 0xad, 0x39, 0x3f, 0x47, 0x92, 0x41, 0x25, 0xe6, - 0xf0, 0xeb, 0x4f, 0x36, 0xbd, 0xaf, 0xd2, 0xb4, 0xc9, 0x0c, 0x75, 0xd4, - 0xef, 0xcf, 0x70, 0x5f, 0x45, 0x4e, 0x28, 0xa1, 0xf0, 0x01, 0x99, 0xb1, - 0xaa, 0x51, 0x57, 0x33, 0x60, 0x55, 0xdf, 0x8a, 0x03, 0xe0, 0x56, 0xec, - 0x35, 0xbb, 0x08, 0x46, 0x99, 0x46, 0xb9, 0x3d, 0x3d, 0x3f, 0x52, 0x82, - 0x22, 0x8b, 0xf5, 0x8e, 0x24, 0x9d, 0x11, 0xb8, 0x42, 0x1e, 0x75, 0x61, - 0x1b, 0xe1, 0xbe, 0x6a, 0xd0, 0x08, 0xec, 0xfb, 0x3e, 0x44, 0x7d, 0xe7, - 0x12, 0x55, 0x8b, 0xee, 0xa5, 0x6a, 0x1f, 0x99, 0x51, 0x80, 0xac, 0x74, - 0x01, 0x27, 0x0f, 0x56, 0x43, 0x2b, 0xe6, 0xb1, 0x95, 0x0e, 0xfe, 0x6b, - 0xc3, 0x86, 0xf4, 0xe3, 0x2f, 0x1b, 0x53, 0x07, 0x6e, 0xb8, 0xc2, 0xba, - 0xad, 0x72, 0xa9, 0x12, 0x21, 0xff, 0x8e, 0xf8, 0x36, 0x70, 0x72, 0xa3, - 0xce, 0x96, 0xbf, 0x04, 0xd4, 0x79, 0x61, 0x1c, 0xca, 0x28, 0xf8, 0x29, - 0x24, 0x19, 0x0e, 0xbc, 0x0c, 0xec, 0x66, 0x26, 0xf5, 0x47, 0x7e, 0xa6, - 0xb4, 0xf6, 0x4e, 0xa9, 0x8b, 0x49, 0xe2, 0x83, 0xfe, 0xf7, 0x9e, 0x0d, - 0xcb, 0xec, 0x75, 0xb9, 0xae, 0xb5, 0x5d, 0xb4, 0x7f, 0x8f, 0xab, 0x13, - 0xe5, 0x6c, 0x7e, 0xe6, 0x75, 0xe5, 0x03, 0x0a, 0xa1, 0xe2, 0x89, 0x6b, - 0x8f, 0xcc, 0x03, 0x61, 0xd3, 0x4c, 0x26, 0x53, 0x72, 0xf4, 0x4f, 0xb8, - 0x8c, 0x32, 0xde, 0x88, 0xa7, 0x14, 0x12, 0x14, 0xbf, 0xe8, 0xd5, 0xce, - 0x1b, 0xea, 0x4f, 0xe3, 0xc2, 0x31, 0xd2, 0x47, 0xf0, 0xe9, 0x14, 0x2e, - 0x37, 0x59, 0xd9, 0x24, 0xe5, 0x47, 0xb7, 0xee, 0x59, 0x7c, 0xa6, 0x7c, - 0x78, 0x23, 0x3e, 0x04, 0xb7, 0xf3, 0x6b, 0x6a, 0x5e, 0x27, 0xab, 0x60, - 0xdc, 0x76, 0xdb, 0x99, 0x24, 0xd6, 0xb3, 0x2e, 0x52, 0x3c, 0x0d, 0x4a, - 0xc2, 0x94, 0x3f, 0x00, 0x66, 0xde, 0x9f, 0x28, 0x85, 0x73, 0x46, 0x91, - 0xcf, 0xe6, 0x87, 0xb3, 0x3f, 0x79, 0x59, 0x6e, 0xcc, 0x3f, 0xb1, 0xca, - 0x91, 0x93, 0x96, 0xf3, 0x90, 0x25, 0x82, 0xc1, 0x15, 0xc3, 0x9e, 0xde, - 0x0d, 0xd8, 0x37, 0xea, 0x30, 0x9f, 0x7f, 0xfb, 0xce, 0xfb, 0xc6, 0x8d, - 0xe7, 0xf2, 0xfa, 0x03, 0xf7, 0x29, 0x7d, 0x33, 0x5f, 0x89, 0x44, 0x74, - 0x98, 0x51, 0x2a, 0xe7, 0x3c, 0xd0, 0x4b, 0x02, 0x86, 0x77, 0xc2, 0x79, - 0xc2, 0x66, 0x10, 0xe2, 0x64, 0x6d, 0xc7, 0x57, 0x21, 0x2f, 0xe1, 0xb1, - 0xf3, 0xcd, 0xd2, 0xa7, 0xb7, 0x65, 0x12, 0x9c, 0xc2, 0x25, 0x67, 0x1f, - 0xe1, 0xaa, 0xa5, 0x15, 0xa9, 0xe0, 0xa7, 0xca, 0xed, 0x93, 0x77, 0x10, - 0x77, 0x88, 0x39, 0x11, 0xea, 0xdc, 0x31, 0x0d, 0xb1, 0xf0, 0x38, 0xaa, - 0x8d, 0xac, 0xae, 0xb8, 0x3b, 0x0d, 0x14, 0xf6, 0xe0, 0xc8, 0x6e, 0x04, - 0xf6, 0x72, 0x3f, 0x59, 0x42, 0xd2, 0xd9, 0x65, 0xd2, 0xdb, 0xc0, 0x8b, - 0x45, 0x5d, 0x03, 0x1f, 0xe1, 0x07, 0xb8, 0xf4, 0xe6, 0xbb, 0xa9, 0x52, - 0x2d, 0x9e, 0x9d, 0x0a, 0x51, 0x65, 0xc2, 0x00, 0x78, 0x6e, 0xc4, 0x02, - 0x85, 0x11, 0xa6, 0xff, 0xf8, 0xc5, 0xd6, 0x11, 0x62, 0x24, 0x33, 0xa5, - 0x4c, 0x7f, 0xb4, 0x7a, 0x2a, 0x78, 0x4d, 0xa5, 0xa7, 0x9d, 0x5f, 0x5c, - 0x65, 0xb2, 0xd1, 0x51, 0x86, 0x9c, 0x64, 0xfe, 0x70, 0xfb, 0xfb, 0xd0, - 0xe9, 0xc9, 0xed, 0x00, 0xba, 0x61, 0xe6, 0x14, 0xa5, 0x07, 0x4c, 0xbb, - 0xf8, 0x83, 0x76, 0x43, 0xa6, 0xb6, 0x20, 0xb7, 0x46, 0x96, 0x34, 0xe5, - 0x9c, 0x25, 0x72, 0x74, 0x42, 0x1d, 0x31, 0x96, 0xfc, 0xc2, 0xbf, 0x06, - 0x31, 0x00, 0x37, 0x8c, 0x87, 0x3f, 0x17, 0x86, 0xc2, 0xfa, 0x14, 0x55, - 0xb7, 0xc2, 0x42, 0x5d, 0xff, 0x68, 0x26, 0x20, 0xb2, 0x24, 0x9f, 0x6d, - 0xcf, 0x16, 0xdf, 0xf7, 0xbc, 0xe3, 0x3c, 0xec, 0xd0, 0x14, 0x0e, 0x2f, - 0x68, 0x9a, 0x21, 0xb0, 0x9f, 0x79, 0x19, 0x03, 0xe1, 0xfc, 0x59, 0xb6, - 0xfb, 0xc4, 0x7f, 0xc9, 0x9d, 0x8b, 0x7e, 0xca, 0x43, 0xe7, 0xda, 0x05, - 0xc6, 0x87, 0x74, 0x3d, 0xc9, 0x99, 0xc4, 0x3e, 0x6a, 0x1f, 0x5b, 0xec, - 0x19, 0xf7, 0xe3, 0xbe, 0xd4, 0xf4, 0x3e, 0xa0, 0xa6, 0x27, 0xfc, 0xa0, - 0xcf, 0xde, 0xe4, 0x6d, 0x4e, 0x3d, 0xec, 0x47, 0x96, 0x8b, 0x0c, 0x65, - 0xa5, 0x89, 0xd4, 0x54, 0x89, 0x0d, 0x06, 0x5a, 0xd2, 0xd7, 0x26, 0x08, - 0x50, 0x4c, 0xf5, 0x3a, 0x6e, 0xc0, 0xa5, 0x37, 0x85, 0x26, 0xe3, 0x0b, - 0xd6, 0x99, 0x75, 0x56, 0x89, 0xc0, 0x31, 0xa7, 0xab, 0x50, 0x54, 0x34, - 0x94, 0xda, 0x72, 0x8b, 0x8a, 0x0b, 0xb4, 0x00, 0xc0, 0xbe, 0x38, 0x9b, - 0x33, 0x1d, 0xd8, 0xa5, 0x3c, 0xd7, 0x1e, 0x22, 0x5b, 0xee, 0xad, 0x23, - 0x61, 0x17, 0x70, 0x95, 0x01, 0x05, 0xc1, 0xac, 0x4e, 0x3d, 0xf2, 0x34, - 0x63, 0x0f, 0x3c, 0x5f, 0xd6, 0xb1, 0x6e, 0xae, 0x3c, 0x0e, 0x09, 0x2e, - 0x65, 0x9a, 0xd4, 0xed, 0xf4, 0xcf, 0x9e, 0xbb, 0xb5, 0x40, 0x69, 0x08, - 0x95, 0x04, 0x37, 0x29, 0x3b, 0x9e, 0xba, 0xa7, 0xb2, 0x8b, 0xb8, 0xfb, - 0xa9, 0x27, 0xab, 0x18, 0x5c, 0xf9, 0xf7, 0xcd, 0xa1, 0x57, 0xf6, 0x23, - 0x50, 0xc4, 0xeb, 0xd3, 0xf1, 0x4c, 0x43, 0xfe, 0x0b, 0x1b, 0x79, 0xcb, - 0xa0, 0x50, 0xd2, 0x28, 0x30, 0x6a, 0xb0, 0xf2, 0xca, 0x8c, 0x47, 0x9f, - 0xc5, 0x8f, 0x1d, 0xb7, 0x27, 0x70, 0xef, 0xc6, 0x17, 0x77, 0x88, 0x0a, - 0xa7, 0xc2, 0xfc, 0xcb, 0xb5, 0x0f, 0xe1, 0x69, 0x89, 0x00, 0x42, 0x08, - 0x34, 0xa2, 0x60, 0x5b, 0x2b, 0xf8, 0xd7, 0x89, 0xda, 0x20, 0x20, 0x7a, - 0x66, 0xba, 0xcf, 0x61, 0xdd, 0xa5, 0x3a, 0x7e, 0x1a, 0x00, 0xba, 0xe4, - 0xa1, 0x3e, 0x82, 0x4e, 0x14, 0x2d, 0xe1, 0x30, 0x12, 0x36, 0xa9, 0xf3, - 0x51, 0x7b, 0x93, 0xe0, 0x84, 0x36, 0x5d, 0x89, 0xcc, 0xf0, 0xea, 0x52, - 0x75, 0xfd, 0x30, 0xf8, 0x25, 0xda, 0xad, 0x92, 0x9c, 0x2f, 0x61, 0x8a, - 0x81, 0xf0, 0xd9, 0x84, 0xec, 0x69, 0x88, 0xb6, 0x4f, 0x4d, 0x0f, 0x65, - 0xde, 0x32, 0xc5, 0xb2, 0x17, 0x02, 0xa6, 0x88, 0x29, 0xb2, 0x29, 0x86, - 0x7a, 0x24, 0x29, 0x2b, 0x96, 0x5f, 0x58, 0x0f, 0xe7, 0xf5, 0xdf, 0xe5, - 0x29, 0x74, 0xc5, 0x66, 0x8a, 0xc1, 0xf3, 0x58, 0x9c, 0x79, 0x60, 0x14, - 0x4a, 0xed, 0x8c, 0x69, 0xc1, 0x4d, 0xc8, 0xad, 0xa0, 0x94, 0x8f, 0x30, - 0x58, 0x48, 0x20, 0x41, 0xd5, 0x75, 0x24, 0x64, 0x76, 0x4c, 0x3f, 0xf6, - 0x51, 0x12, 0x1a, 0x5d, 0x93, 0xf2, 0xcf, 0x8e, 0xe2, 0xea, 0x38, 0x26, - 0x11, 0xa9, 0x08, 0xe9, 0x69, 0xce, 0xe8, 0x85, 0x0d, 0xab, 0x49, 0x57, - 0xd9, 0x16, 0x0f, 0xee, 0xc0, 0x3f, 0xdf, 0xf0, 0x3f, 0x69, 0x68, 0xfd, - 0xa7, 0x32, 0xc0, 0x0a, 0x42, 0xd6, 0x78, 0x93, 0x4b, 0xac, 0x52, 0xfb, - 0xe7, 0xf2, 0xc5, 0x25, 0x3b, 0x51, 0x80, 0xfd, 0x34, 0xc6, 0xd5, 0x84, - 0xff, 0x7f, 0x85, 0x1a, 0x3c, 0xc6, 0xbe, 0x02, 0x26, 0x62, 0xc2, 0x47, - 0x27, 0xba, 0x04, 0xd6, 0x34, 0x0c, 0xb6, 0x07, 0x99, 0x34, 0xc4, 0x18, - 0xd9, 0x7d, 0xed, 0x95, 0xa6, 0xbe, 0x68, 0xf5, 0xfe, 0xd5, 0xc8, 0x65, - 0x96, 0x40, 0x32, 0x14, 0xae, 0xcb, 0x6d, 0x3c, 0x6a, 0x64, 0xb7, 0x5b, - 0x3f, 0x45, 0xe8, 0xdc, 0xbd, 0x35, 0x86, 0x62, 0xeb, 0x9d, 0xac, 0xc1, - 0x57, 0x84, 0x22, 0x42, 0xa0, 0x48, 0x7b, 0x45, 0x77, 0x19, 0x22, 0xdf, - 0x56, 0x22, 0x1d, 0x44, 0x77, 0x36, 0x80, 0x06, 0x4a, 0xc6, 0xb5, 0xc8, - 0xa5, 0x12, 0x7b, 0x50, 0x7a, 0xcb, 0xcc, 0x40, 0x4e, 0x19, 0xf3, 0xaf, - 0xe0, 0xeb, 0x67, 0x20, 0x71, 0x38, 0x60, 0x05, 0x34, 0x7a, 0x8c, 0xfd, - 0x23, 0x41, 0x78, 0x07, 0x6d, 0x68, 0x8e, 0x87, 0xd6, 0x81, 0x1b, 0xb3, - 0xec, 0x8d, 0xf9, 0x5a, 0x79, 0x1b, 0xc3, 0x94, 0xd4, 0x88, 0xa9, 0x44, - 0xd1, 0x22, 0x56, 0xe7, 0xa8, 0x1f, 0x3b, 0x68, 0x07, 0x95, 0x88, 0x5b, - 0x76, 0x54, 0x72, 0x93, 0x2f, 0x08, 0x24, 0x33, 0xcd, 0x52, 0x18, 0x53, - 0xe0, 0xdd, 0x67, 0x54, 0x9e, 0x91, 0xdb, 0x17, 0x40, 0xcd, 0x1b, 0xf4, - 0x4f, 0xa9, 0xd9, 0x8f, 0xe3, 0x12, 0x97, 0xed, 0x24, 0xb6, 0x63, 0x64, - 0x7b, 0xc6, 0xce, 0x08, 0x03, 0xae, 0x21, 0xaa, 0x92, 0x03, 0xe2, 0x95, - 0x44, 0x9d, 0x00, 0xee, 0xdc, 0x54, 0xb3, 0xd9, 0xf0, 0xd9, 0x89, 0x1d, - 0xf4, 0xf4, 0x70, 0x32, 0x08, 0x7d, 0xf1, 0x7f, 0x5f, 0x28, 0x92, 0xbd, - 0x29, 0x10, 0x4c, 0x14, 0x3b, 0x56, 0x18, 0x40, 0x93, 0x53, 0x00, 0x50, - 0x2d, 0x9c, 0x94, 0x53, 0xd4, 0x28, 0xae, 0xe4, 0x12, 0x64, 0xa5, 0x43, - 0x48, 0xc4, 0xc7, 0x56, 0x0c, 0x16, 0x56, 0x0e, 0x8e, 0xbb, 0x02, 0xee, - 0x0c, 0x91, 0xfe, 0xfb, 0xb4, 0xc8, 0xae, 0x11, 0x41, 0xc7, 0xbe, 0xed, - 0xa5, 0x05, 0x94, 0x30, 0x63, 0x65, 0x5e, 0xa3, 0x93, 0x1c, 0xed, 0xde, - 0x59, 0x9e, 0xc0, 0xa3, 0x13, 0xa0, 0x42, 0x9f, 0xd0, 0xdf, 0x7b, 0x41, - 0x63, 0xdd, 0x08, 0xd5, 0x8d, 0x28, 0x5d, 0x50, 0x64, 0xe5, 0x9b, 0x6f, - 0x16, 0xdb, 0xa0, 0x85, 0x5a, 0x59, 0xe9, 0xde, 0x2c, 0x03, 0x5c, 0x75, - 0xfc, 0xa7, 0xa7, 0xc7, 0xe2, 0xa9, 0x98, 0xaa, 0xb2, 0x84, 0xc5, 0x61, - 0x0b, 0xa3, 0x0a, 0x8e, 0x39, 0x64, 0x16, 0x12, 0x06, 0x4b, 0x7d, 0x34, - 0x1a, 0x53, 0x9d, 0x34, 0x3f, 0x40, 0x8b, 0x40, 0x56, 0xc9, 0x43, 0xc9, - 0x40, 0xab, 0x6d, 0x72, 0x08, 0xc8, 0x10, 0x2c, 0x41, 0xe5, 0x0b, 0x8e, - 0x17, 0x2d, 0xc3, 0xb5, 0x0c, 0x96, 0x3d, 0x3a, 0xd1, 0xc9, 0x20, 0x2f, - 0xad, 0x13, 0x13, 0x68, 0x68, 0xf3, 0xed, 0x20, 0xb5, 0xc6, 0x6e, 0x0e, - 0x60, 0x0f, 0xcb, 0xc5, 0xf1, 0x5c, 0x0b, 0xbd, 0xef, 0xdc, 0x17, 0xc7, - 0x01, 0xa2, 0x97, 0x9f, 0xc5, 0x06, 0x71, 0x9e, 0x53, 0x5b, 0xeb, 0xde, - 0x23, 0xed, 0x34, 0x03, 0x0e, 0x11, 0x05, 0x79, 0x15, 0x7c, 0xd9, 0x0d, - 0x8c, 0xe3, 0xcd, 0xb5, 0xa4, 0xfd, 0xca, 0x32, 0x5e, 0xeb, 0x38, 0x37, - 0x02, 0x2e, 0x6e, 0xf4, 0x2c, 0x86, 0x23, 0xd6, 0x28, 0xd0, 0xea, 0x95, - 0x5f, 0x71, 0x50, 0x46, 0x18, 0x48, 0x6a, 0x2a, 0xcd, 0xe0, 0xab, 0x62, - 0x09, 0x25, 0x78, 0x1a, 0x4d, 0xcb, 0x10, 0x81, 0x96, 0xb8, 0xe1, 0xe1, - 0xe3, 0x89, 0x46, 0x26, 0x89, 0x44, 0xf4, 0x31, 0xf1, 0xe7, 0x37, 0x7c, - 0xfe, 0xc5, 0x27, 0x62, 0x0d, 0x09, 0x57, 0xbd, 0x38, 0xab, 0x1a, 0xac, - 0xcb, 0x9d, 0xe9, 0xa3, 0xa0, 0x7e, 0x60, 0x51, 0x03, 0x34, 0x9f, 0x81, - 0x66, 0x88, 0x86, 0x91, 0xbc, 0x86, 0x75, 0x4e, 0x8f, 0x21, 0x69, 0xfc, - 0x44, 0x72, 0xd8, 0x75, 0x6f, 0xdc, 0xc2, 0xba, 0xb8, 0xc9, 0x49, 0x5c, - 0xd1, 0xe2, 0x5d, 0xae, 0xaf, 0x8b, 0x63, 0x40, 0x28, 0x4f, 0xa1, 0x22, - 0x74, 0xdc, 0x42, 0xb1, 0xa0, 0x6f, 0x1f, 0xe3, 0x9f, 0xbc, 0x39, 0xf6, - 0x6b, 0x0d, 0x35, 0xe9, 0x54, 0x9f, 0xf0, 0xb6, 0xe8, 0x9d, 0xa2, 0x5a, - 0xda, 0x04, 0xf2, 0xd6, 0xed, 0x44, 0xd8, 0xc9, 0x65, 0x06, 0xd0, 0x8d, - 0x1a, 0x5e, 0xe9, 0x6d, 0x83, 0xbc, 0x3e, 0x7d, 0xbc, 0x8a, 0x2c, 0xed, - 0x6c, 0x4d, 0xc1, 0xd5, 0x97, 0x0a, 0x53, 0x35, 0x97, 0x33, 0xff, 0x2c, - 0x92, 0x25, 0xdf, 0xbf, 0xe6, 0x68, 0x9e, 0x05, 0x0d, 0x03, 0x90, 0x29, - 0xe5, 0x02, 0x95, 0xf4, 0xc4, 0x8a, 0x49, 0x7d, 0x38, 0x30, 0x16, 0xbe, - 0xba, 0x7f, 0x9d, 0x62, 0xc7, 0xf9, 0x2a, 0x6e, 0x7f, 0xd8, 0xc4, 0xe8, - 0x69, 0x9c, 0x9d, 0xa1, 0x8d, 0xe3, 0x3e, 0xe8, 0x2a, 0x9d, 0x1c, 0x74, - 0x18, 0x91, 0x6c, 0xf6, 0x83, 0xad, 0xd5, 0x59, 0x48, 0x17, 0x45, 0xfc, - 0xc9, 0x15, 0x53, 0xb4, 0x17, 0x3c, 0xc5, 0x6e, 0x05, 0x50, 0x7d, 0x79, - 0xf7, 0xab, 0x2a, 0x7e, 0x2f, 0xc4, 0xd2, 0xca, 0x7f, 0xff, 0x4c, 0x14, - 0x2a, 0xc6, 0xf0, 0xbc, 0xa1, 0xc1, 0xdb, 0x73, 0xee, 0xd7, 0x8a, 0x72, - 0xb7, 0x4b, 0x46, 0xfa, 0x8d, 0x2a, 0x8f, 0xf4, 0x64, 0x93, 0x56, 0x6a, - 0xfd, 0x67, 0xa3, 0x53, 0x48, 0xea, 0xd4, 0x8c, 0xe6, 0x98, 0x19, 0x62, - 0x0e, 0xfc, 0x37, 0xe9, 0x8d, 0x18, 0x9c, 0xf7, 0xd1, 0xfd, 0x35, 0x2a, - 0x8c, 0x04, 0x65, 0x90, 0x8e, 0x0e, 0xba, 0xfd, 0xa6, 0xb8, 0xa2, 0x5f, - 0x83, 0x10, 0x06, 0x40, 0x31, 0x22, 0x88, 0x7a, 0xd9, 0x4f, 0xfa, 0x6a, - 0xb2, 0x4b, 0xe0, 0x50, 0x3c, 0x1c, 0xc7, 0xcb, 0xbb, 0x83, 0x43, 0x94, - 0xd3, 0x81, 0x14, 0x04, 0x34, 0x8a, 0x08, 0x43, 0xf9, 0x67, 0x9c, 0x70, - 0x7d, 0xbc, 0x94, 0xa7, 0x29, 0x2b, 0xfa, 0xe7, 0x56, 0xc1, 0x2d, 0x37, - 0xca, 0xe2, 0xff, 0xff, 0xaf, 0x04, 0x14, 0x91, 0xef, 0xc0, 0xb8, 0xa8, - 0x80, 0x0f, 0x8e, 0xe0, 0xb8, 0x4d, 0x45, 0x3b, 0x5b, 0xcc, 0x2b, 0xfc, - 0x8d, 0xac, 0x8f, 0xbb, 0xeb, 0xa9, 0x5d, 0x38, 0x68, 0x5d, 0xcf, 0x7b, - 0xeb, 0x51, 0x23, 0x47, 0x23, 0x98, 0x75, 0x88, 0x2a, 0x3e, 0xf4, 0xd8, - 0x7d, 0x6b, 0x24, 0x26, 0xf5, 0x6f, 0xc9, 0x57, 0xf3, 0x65, 0x50, 0x75, - 0xfd, 0x75, 0x4c, 0x02, 0x03, 0x2c, 0xa3, 0x65, 0x42, 0x12, 0x9f, 0x8c, - 0x03, 0xe6, 0xc2, 0xff, 0xce, 0xb0, 0x3b, 0x67, 0x3a, 0xbf, 0xe2, 0xea, - 0x58, 0xa0, 0x1a, 0xdf, 0xa5, 0xb9, 0xf1, 0xd8, 0xb0, 0x04, 0xdb, 0x7e, - 0xaf, 0x1c, 0x92, 0x4a, 0xbc, 0x58, 0xdc, 0x50, 0xa6, 0x05, 0x4d, 0xc7, - 0xcd, 0x01, 0x71, 0x42, 0x6f, 0x76, 0x51, 0x67, 0x82, 0x95, 0xe7, 0x26, - 0x93, 0xf1, 0xab, 0x5f, 0xc8, 0x62, 0x00, 0x6f, 0xc2, 0x98, 0x08, 0xe5, - 0x5b, 0xa8, 0xe5, 0x07, 0xf3, 0xbb, 0x9a, 0x8d, 0x9e, 0x57, 0xa4, 0xe4, - 0xd7, 0xa3, 0x91, 0x2a, 0xfc, 0x75, 0xb3, 0xf6, 0xea, 0x96, 0xa1, 0x15, - 0x57, 0xef, 0xcf, 0xd6, 0xaa, 0x3b, 0x3a, 0x36, 0xc6, 0x68, 0x0d, 0xa0, - 0x1e, 0x18, 0xea, 0x56, 0x60, 0x8d, 0xa2, 0x93, 0xcc, 0x30, 0xef, 0xd9, - 0x0f, 0xfd, 0xc6, 0xaa, 0x4b, 0x76, 0x99, 0x50, 0x14, 0x10, 0xcb, 0xf5, - 0x24, 0xca, 0x35, 0x06, 0x51, 0xdd, 0xb9, 0x41, 0x9f, 0xc5, 0xf3, 0x2c, - 0x58, 0x7c, 0x07, 0x5e, 0x37, 0xb6, 0xc6, 0xcc, 0xb5, 0xe6, 0x28, 0x42, - 0x9a, 0x41, 0x5c, 0x35, 0x1a, 0x4c, 0xc9, 0x76, 0x90, 0x49, 0x6b, 0x2b, - 0xe6, 0x24, 0x98, 0x01, 0x7d, 0xbc, 0xbc, 0x02, 0x98, 0x7f, 0xca, 0xca, - 0xbb, 0xe6, 0x3c, 0xd1, 0xb8, 0xd9, 0x95, 0x57, 0x41, 0xf3, 0xdd, 0x55, - 0x3b, 0x59, 0xb0, 0x12, 0x20, 0x76, 0xc6, 0xf3, 0xb5, 0xe6, 0x28, 0x42, - 0x9a, 0x41, 0x5c, 0x32, 0x10, 0x5e, 0x5e, 0x4d, 0xed, 0x7f, 0x30, 0x06, - 0x01, 0xff, 0x90, 0xf0, 0x2c, 0x36, 0x25, 0x49, 0xff, 0xb4, 0xb9, 0xee, - 0x4a, 0x9f, 0x6f, 0x63, 0x8b, 0xdb, 0x6b, 0x73, 0xed, 0x30, 0x18, 0xbb, - 0x42, 0x3e, 0x8e, 0x8c, 0xfa, 0x37, 0x82, 0x7e, 0x06, 0xcf, 0xc2, 0xc0, - 0xd0, 0x5e, 0xff, 0xfa, 0x92, 0x99, 0x60, 0x9e, 0xf8, 0x69, 0x79, 0xe0, - 0xde, 0xdb, 0xfb, 0xf5, 0x73, 0x42, 0x9a, 0x92, 0xda, 0xe0, 0xde, 0xbc, - 0x5b, 0xe3, 0x5e, 0xbc, 0xb9, 0xec, 0x6d, 0x05, 0xd8, 0x93, 0xb6, 0x9e, - 0xd0, 0x36, 0x78, 0xfe, 0xb4, 0xf9, 0xe7, 0xec, 0x1a, 0xc8, 0x12, 0xbf, - 0x7e, 0xed, 0x8b, 0x00, 0x2a, 0xce, 0x92, 0xff, 0x30, 0xe0, 0x15, 0x79, - 0xca, 0xf1, 0xd8, 0xd3, 0x01, 0x0f, 0x17, 0xf4, 0x96, 0xfb, 0xe0, 0x03, - 0xd2, 0xf1, 0xba, 0x77, 0x4b, 0x02, 0x04, 0xd3, 0x39, 0x6f, 0x00, 0x3c, - 0x55, 0x50, 0x1f, 0x13, 0xc4, 0x15, 0x48, 0x1f, 0xea, 0xd7, 0x6b, 0xa6, - 0x2e, 0x61, 0x49, 0x83, 0x25, 0x45, 0x2c, 0x7c, 0x96, 0x32, 0x33, 0xa7, - 0x51, 0xbb, 0x87, 0x1d, 0xec, 0xde, 0xaf, 0xc4, 0x1e, 0x04, 0xe0, 0xd3, - 0xd2, 0x6d, 0xeb, 0x4e, 0x63, 0x77, 0x5c, 0xb9, 0x17, 0x0c, 0x77, 0x48, - 0x07, 0xb2, 0xdb, 0x32, 0x2a, 0x34, 0x14, 0x6f, 0x4a, 0xde, 0xe1, 0x3d, - 0x90, 0xc0, 0x19, 0x8a, 0x14, 0x72, 0x83, 0x77, 0xac, 0x67, 0x03, 0x6d, - 0x12, 0xcf, 0x30, 0xc4, 0x93, 0x09, 0xb5, 0x6f, 0x8d, 0xf0, 0x60, 0xe2, - 0x0d, 0x40, 0xd0, 0x32, 0x25, 0x42, 0x78, 0xc3, 0xef, 0xaa, 0x44, 0x69, - 0xa5, 0x4c, 0xaa, 0x2e, 0x4a, 0x04, 0xee, 0x14, 0xbb, 0x1e, 0x01, 0x12, - 0xc7, 0x68, 0xc1, 0x6e, 0x27, 0x6e, 0xcc, 0xb6, 0xcb, 0xf2, 0x13, 0x61, - 0xa1, 0xf9, 0xb7, 0xcc, 0x90, 0x12, 0x60, 0xaf, 0xf8, 0x34, 0xfc, 0xb7, - 0x87, 0x1d, 0x90, 0x3e, 0xa6, 0x49, 0xa0, 0xc5, 0x38, 0x4d, 0xd6, 0x2d, - 0xb2, 0x19, 0xf8, 0x74, 0x7c, 0xdc, 0x00, 0x2e, 0x11, 0xb0, 0x03, 0xb4, - 0x56, 0x24, 0x97, 0x40, 0x7c, 0x3b, 0xdb, 0x17, 0xaf, 0x9e, 0xe0, 0xcd, - 0x23, 0x15, 0xc5, 0x16, 0x4b, 0x63, 0x17, 0x15, 0xf5, 0xaf, 0xca, 0x3e, - 0x5f, 0xf8, 0x89, 0xd8, 0xc1, 0xf3, 0xf1, 0x46, 0xdb, 0xd9, 0xb8, 0x00, - 0x6a, 0x80, 0xc9, 0xc5, 0xe2, 0xab, 0xb4, 0x79, 0x0d, 0x19, 0x86, 0x2e, - 0xf7, 0x82, 0x58, 0xb3, 0x77, 0x04, 0x46, 0x7d, 0x6f, 0x89, 0xf2, 0x67, - 0x0c, 0x12, 0xc2, 0xdb, 0xe5, 0x0d, 0xe0, 0x9a, 0x3f, 0xce, 0x58, 0xd6, - 0xcc, 0x79, 0x5b, 0x65, 0x83, 0x7b, 0x17, 0xc2, 0x31, 0xe2, 0xd9, 0xaa, - 0x9a, 0x32, 0x6e, 0xb7, 0x1a, 0x77, 0x56, 0x93, 0x2d, 0xeb, 0x2d, 0xdf, - 0x23, 0x2e, 0x5c, 0xf3, 0x48, 0x5e, 0xee, 0x65, 0xbd, 0x9d, 0xcc, 0x9d, - 0x5d, 0x01, 0x16, 0x44, 0x49, 0xdd, 0x50, 0x08, 0xc1, 0x01, 0x90, 0x49, - 0xe0, 0xf2, 0xb3, 0x53, 0xaf, 0x1e, 0x90, 0xd4, 0x11, 0x46, 0xbf, 0x05, - 0x24, 0x9d, 0xc5, 0x46, 0x35, 0x44, 0x8c, 0xae, 0xcd, 0xa8, 0xbf, 0x47, - 0x47, 0x64, 0xc7, 0x0b, 0x78, 0xd9, 0x80, 0x91, 0xbe, 0xa5, 0x93, 0x32, - 0xd3, 0x25, 0xc6, 0x44, 0x3b, 0xbe, 0x59, 0x1f, 0x38, 0x6d, 0x20, 0xc6, - 0xa9, 0x34, 0x5b, 0x77, 0x64, 0xd1, 0xda, 0x05, 0xfa, 0x09, 0xf7, 0x67, - 0x1a, 0x6c, 0xe6, 0x06, 0xec, 0xfd, 0x5b, 0xc8, 0xad, 0xa2, 0x62, 0x3d, - 0x8a, 0x88, 0xdf, 0xe7, 0x7b, 0xfc, 0x7a, 0x0e, 0x7d, 0x20, 0xdb, 0x17, - 0x6a, 0x8d, 0xec, 0x49, 0x42, 0x4f, 0x77, 0xa1, 0xf6, 0x2b, 0x99, 0xa4, - 0x77, 0x7b, 0x5f, 0x70, 0x29, 0x54, 0x96, 0x36, 0x8b, 0xb9, 0xc9, 0x6d, - 0x02, 0x86, 0x06, 0x76, 0x8c, 0xe9, 0x91, 0xf1, 0x3b, 0xe5, 0x65, 0x19, - 0x3b, 0xec, 0xb6, 0xee, 0xb9, 0x99, 0xc7, 0x95, 0x4b, 0x8b, 0x47, 0x71, - 0x73, 0xfa, 0x95, 0x2d, 0xbd, 0x73, 0x10, 0xe5, 0x3a, 0xcb, 0x72, 0x8d, - 0x11, 0xca, 0xaa, 0xf2, 0x47, 0xa2, 0x28, 0x7a, 0x9e, 0x67, 0x09, 0x0a, - 0x81, 0x0b, 0x56, 0x03, 0x7f, 0x65, 0xed, 0x58, 0x85, 0xba, 0x1a, 0xad, - 0xbd, 0x72, 0xec, 0xd4, 0x42, 0xc0, 0x37, 0x4c, 0x9a, 0x4e, 0x06, 0xa3, - 0x3b, 0xe0, 0x75, 0xf4, 0xa6, 0xd5, 0x35, 0x06, 0xfa, 0xe6, 0xd1, 0x5b, - 0x53, 0x71, 0x6f, 0x2c, 0x16, 0xcf, 0xea, 0xb3, 0x0e, 0xc0, 0x62, 0x85, - 0x0c, 0xeb, 0x64, 0x66, 0x41, 0x33, 0x16, 0xd2, 0x54, 0xbf, 0x49, 0x62, - 0x8e, 0x4a, 0xa1, 0xf4, 0xbf, 0xe9, 0xbf, 0xcc, 0x96, 0x1e, 0xc8, 0x1b, - 0x13, 0xd1, 0xc6, 0xaf, 0x60, 0x30, 0x8a, 0x70, 0x54, 0xe5, 0x1a, 0x2b, - 0xef, 0x79, 0x02, 0x38, 0x7c, 0xb9, 0x45, 0xa2, 0xc0, 0xa6, 0x7b, 0x90, - 0xdc, 0x9d, 0x8e, 0xb9, 0x44, 0xff, 0xd9, 0xe2, 0xea, 0x02, 0xe3, 0x5e, - 0x95, 0xd8, 0xae, 0xa1, 0x16, 0x80, 0xa1, 0x25, 0x89, 0xb6, 0x53, 0xa5, - 0x9c, 0x30, 0x48, 0x21, 0x2b, 0xa7, 0x1d, 0xe5, 0xfc, 0x47, 0xec, 0x02, - 0x44, 0x8a, 0x76, 0x86, 0x54, 0x01, 0x3a, 0x53, 0x39, 0x09, 0x22, 0x06, - 0x2a, 0x6d, 0x3c, 0x34, 0x72, 0xea, 0x5d, 0xf2, 0xfc, 0xc2, 0x5d, 0x6a, - 0xd4, 0x03, 0xa0, 0xe5, 0xec, 0x6c, 0xe0, 0x12, 0x3a, 0xab, 0xf8, 0x3e, - 0x31, 0x5a, 0xef, 0x61, 0xae, 0xac, 0x9d, 0xe6, 0xac, 0xd2, 0x13, 0x77, - 0x1a, 0x85, 0x1b, 0x2c, 0x8c, 0x17, 0xf5, 0xf9, 0xdd, 0x91, 0xe0, 0x1a, - 0xc7, 0xfc, 0x38, 0x91, 0x08, 0xaf, 0xf4, 0x88, 0x46, 0xc1, 0x3e, 0x88, - 0x95, 0x40, 0xc7, 0xa6, 0x40, 0x92, 0x72, 0xf1, 0x70, 0x49, 0xec, 0xbd, - 0x5b, 0x5a, 0xb1, 0x7a, 0xab, 0xc1, 0x23, 0x27, 0x7b, 0x83, 0xa3, 0x4f, - 0xa9, 0x8f, 0xff, 0x25, 0xc0, 0x13, 0xed, 0x6d, 0xdf, 0xbf, 0xb1, 0xc3, - 0x1d, 0x31, 0xaa, 0x77, 0xc2, 0xa5, 0xfb, 0x9f, 0x28, 0xd9, 0x34, 0x07, - 0xe5, 0x0d, 0x3f, 0xc9, 0x04, 0xe9, 0x2f, 0xc0, 0x43, 0x9a, 0x71, 0x05, - 0xed, 0x41, 0xa7, 0xba, 0x20, 0x83, 0x89, 0x5a, 0xb2, 0x9c, 0x1e, 0x36, - 0xf1, 0xbc, 0x96, 0x38, 0x9c, 0x6d, 0xb1, 0xaf, 0xa7, 0xde, 0xfa, 0x08, - 0xd3, 0x3e, 0x82, 0x51, 0xef, 0xfb, 0xec, 0x93, 0x26, 0xe5, 0xe7, 0x25, - 0xad, 0x95, 0x6d, 0xd6, 0x0e, 0xd8, 0x8a, 0x3a, 0xd6, 0xe5, 0x89, 0xd8, - 0x1c, 0xfb, 0x39, 0x28, 0xe4, 0xc9, 0x4a, 0x7b, 0xc2, 0x0d, 0x8e, 0x77, - 0x13, 0x2a, 0x60, 0xc2, 0xf4, 0xdd, 0x81, 0xa0, 0x72, 0x1a, 0x12, 0x2b, - 0x6a, 0x5e, 0xad, 0xcf, 0x2a, 0x11, 0x59, 0x0a, 0xc4, 0x70, 0x32, 0xc5, - 0x66, 0xf9, 0x63, 0x7e, 0x74, 0x89, 0x78, 0x80, 0xa4, 0x46, 0x51, 0xaa, - 0x07, 0xcc, 0x48, 0xe4, 0xa8, 0x6f, 0xbb, 0xb0, 0x92, 0x1d, 0x7f, 0xae, - 0xd7, 0x6c, 0x87, 0xbe, 0xc3, 0x5b, 0x92, 0x92, 0x44, 0x05, 0x5b, 0x69, - 0x0f, 0x87, 0x07, 0x93, 0xeb, 0x48, 0x6a, 0x31, 0xa0, 0x4a, 0x59, 0xd5, - 0xe0, 0xb1, 0x31, 0xd5, 0x0e, 0xf3, 0x82, 0x74, 0x2a, 0x51, 0xab, 0xf1, - 0x39, 0xf7, 0x89, 0xf0, 0x7e, 0x02, 0x89, 0x80, 0x92, 0xc6, 0x19, 0x29, - 0xbc, 0x0e, 0x2f, 0x25, 0x8e, 0xa8, 0xae, 0xef, 0x1a, 0x32, 0xb5, 0x1c, - 0x3e, 0x8e, 0x24, 0x0b, 0x87, 0x77, 0x1f, 0xa6, 0x7f, 0x91, 0xa9, 0x7a, - 0x8f, 0x91, 0x39, 0x5f, 0x48, 0xe8, 0xcf, 0xe4, 0x1d, 0xd4, 0x21, 0x63, - 0x8d, 0x0d, 0x0f, 0xa0, 0x9f, 0x9b, 0x19, 0x66, 0xa9, 0x54, 0xd9, 0xcc, - 0x4c, 0x55, 0x2a, 0xd3, 0xef, 0x14, 0x02, 0xa6, 0xa4, 0xfb, 0x1d, 0x05, - 0xf0, 0x8a, 0x8f, 0xb7, 0x4a, 0xf4, 0x31, 0x23, 0x8a, 0x66, 0x40, 0x43, - 0x68, 0xd3, 0x63, 0xb7, 0xd4, 0x17, 0x09, 0xd3, 0x56, 0x3d, 0xd3, 0x6d, - 0x55, 0xdd, 0xfc, 0xa6, 0x83, 0x78, 0xf4, 0x86, 0x36, 0xf6, 0x85, 0x19, - 0xaa, 0x9b, 0xc0, 0xdb, 0xa1, 0x9b, 0xc4, 0x6a, 0x85, 0xcc, 0x12, 0x47, - 0x5c, 0x0b, 0xb7, 0x48, 0x06, 0xbb, 0xe7, 0x58, 0x5d, 0x0d, 0x5a, 0x94, - 0x2d, 0xa2, 0xa1, 0xe0, 0x95, 0xc7, 0x63, 0x46, 0x9e, 0xd5, 0x48, 0x39, - 0x10, 0x8e, 0x94, 0x93, 0x34, 0xbc, 0x36, 0x86, 0x45, 0x09, 0xb2, 0xdd, - 0x58, 0x3a, 0xd8, 0xa7, 0x70, 0xdf, 0x52, 0x70, 0xa8, 0x30, 0x86, 0xec, - 0x83, 0x32, 0xa9, 0x03, 0xaa, 0x43, 0x58, 0x4f, 0xed, 0xa8, 0xd0, 0x6d, - 0xd4, 0xe9, 0x7b, 0xf2, 0xda, 0x60, 0xb8, 0x3f, 0x37, 0x26, 0x4c, 0x0f, - 0xf8, 0xb3, 0xec, 0x53, 0x75, 0x03, 0x71, 0x06, 0xe1, 0xc7, 0xc9, 0x63, - 0xc3, 0xe5, 0xa7, 0x6a, 0x89, 0xc9, 0x7e, 0x21, 0xfa, 0x02, 0xda, 0x25, - 0x1d, 0xff, 0x58, 0x02, 0x19, 0x4b, 0xc1, 0x18, 0x9a, 0x05, 0x4e, 0xa6, - 0xa5, 0x99, 0xef, 0x72, 0xf9, 0xff, 0x4d, 0x67, 0x67, 0x9b, 0xf2, 0x97, - 0x50, 0x8f, 0x5d, 0x20, 0x2d, 0x4a, 0x2f, 0xa1, 0x41, 0x01, 0x1e, 0xf5, - 0x45, 0x56, 0x98, 0x16, 0xa3, 0x98, 0x7f, 0xf0, 0xb0, 0x22, 0x27, 0x13, - 0xca, 0x4c, 0x57, 0xe9, 0x05, 0x35, 0xdc, 0x68, 0x3f, 0xa1, 0xf6, 0x7a, - 0x54, 0xa1, 0x1a, 0x9d, 0x42, 0x57, 0x3a, 0x3a, 0x97, 0x80, 0xd8, 0x82, - 0x02, 0x47, 0x2d, 0x6c, 0xec, 0x3a, 0x9a, 0x78, 0x0f, 0x30, 0xe3, 0x13, - 0x62, 0xa4, 0x08, 0x93, 0x0a, 0x87, 0x73, 0xc1, 0x45, 0x67, 0x44, 0xe2, - 0xb1, 0xd2, 0x74, 0x08, 0x01, 0xd4, 0x34, 0x0b, 0x45, 0xd7, 0x4b, 0x00, - 0x25, 0x35, 0xa9, 0xf8, 0x76, 0x70, 0x1c, 0x8a, 0x9a, 0x55, 0xcf, 0xb2, - 0x2a, 0x90, 0x08, 0x28, 0x2c, 0xa3, 0xbd, 0xbd, 0xe0, 0xe8, 0x4a, 0x7d, - 0x79, 0xd8, 0xb7, 0x17, 0x57, 0xef, 0x07, 0xeb, 0x58, 0x7e, 0x15, 0x13, - 0x88, 0xcf, 0xbc, 0x10, 0x79, 0xbc, 0x4c, 0x89, 0x4b, 0xbd, 0xa3, 0xaa, - 0x69, 0x39, 0xb8, 0x1b, 0x1a, 0xdf, 0x44, 0xe7, 0xb3, 0xb0, 0x3f, 0x95, - 0x13, 0x33, 0xa5, 0xd0, 0x44, 0xea, 0x15, 0xbe, 0xff, 0x0c, 0x14, 0x44, - 0xfb, 0xc9, 0xb0, 0xa1, 0xd7, 0x30, 0xcc, 0xe3, 0x84, 0x87, 0x33, 0x9f, - 0xc3, 0x97, 0xdd, 0x49, 0xf4, 0xb6, 0x27, 0x8b, 0x50, 0x31, 0xf5, 0x4a, - 0x88, 0x2d, 0xe4, 0xb0, 0x42, 0x46, 0xe1, 0x43, 0x91, 0xda, 0x0f, 0x10, - 0x84, 0x94, 0x02, 0x53, 0x10, 0xa4, 0x65, 0x18, 0xa5, 0xd7, 0x18, 0x4f, - 0xe9, 0xcd, 0x81, 0xbb, 0x43, 0x3b, 0x5c, 0x3b, 0x25, 0xe6, 0xa5, 0xa7, - 0x6b, 0x7c, 0x47, 0x36, 0xc0, 0x00, 0xa6, 0x97, 0xda, 0x14, 0xec, 0x3b, - 0x18, 0xfc, 0x98, 0x0a, 0xf2, 0xa2, 0x36, 0x6b, 0xa9, 0xb4, 0x0f, 0x1d, - 0x08, 0x7f, 0xa1, 0xc3, 0xde, 0xb3, 0xb8, 0x40, 0x7c, 0x63, 0x12, 0xaa, - 0x18, 0xdb, 0x0a, 0x11, 0xca, 0x15, 0xc7, 0x5d, 0xe1, 0xff, 0x75, 0xfe, - 0xc8, 0x0e, 0x98, 0x07, 0x1a, 0x8f, 0x13, 0x55, 0xe7, 0x80, 0xd6, 0x59, - 0x79, 0x9a, 0x7d, 0xed, 0x04, 0x66, 0xe1, 0xf6, 0x5b, 0xad, 0xf5, 0x98, - 0x0a, 0xaf, 0xd9, 0x26, 0x35, 0x93, 0x45, 0x90, 0xd7, 0x88, 0x1a, 0x11, - 0x7e, 0x7f, 0x63, 0x2f, 0xf8, 0x60, 0x04, 0xed, 0x46, 0x92, 0x93, 0x1d, - 0x3b, 0x2d, 0x40, 0xf8, 0xe9, 0xa2, 0x04, 0xf8, 0xd6, 0x7d, 0x67, 0x47, - 0x6c, 0xcf, 0xe6, 0xaf, 0xcf, 0x8b, 0x18, 0xae, 0xf5, 0xd1, 0x21, 0x39, - 0xe2, 0x4e, 0x6e, 0xd8, 0x66, 0x52, 0xc9, 0xac, 0xc7, 0xbf, 0xd5, 0x69, - 0xf2, 0x28, 0x5d, 0x41, 0x73, 0x19, 0x58, 0x0c, 0xc6, 0xf6, 0x7d, 0xf4, - 0xca, 0xf2, 0x81, 0xbb, 0x70, 0x09, 0xcd, 0x09, 0x2d, 0x37, 0xb4, 0xb4, - 0x4c, 0x21, 0x0e, 0xc1, 0x2f, 0x2b, 0x1b, 0x2e, 0x79, 0xf6, 0x16, 0x05, - 0x6c, 0xc4, 0x9a, 0x7f, 0xe2, 0x7b, 0x4a, 0xdb, 0xf0, 0x5d, 0x3c, 0x4a, - 0x63, 0x78, 0x15, 0x3f, 0x3c, 0x78, 0x35, 0xca, 0x54, 0x94, 0x9f, 0x1b, - 0x62, 0x50, 0x1b, 0xf0, 0x51, 0x12, 0xce, 0x02, 0xdc, 0x19, 0x9d, 0xee, - 0x85, 0xb5, 0x38, 0x29, 0xc0, 0xd5, 0x3c, 0xf2, 0x66, 0xdf, 0x0f, 0xfe, - 0xa6, 0xd6, 0x3f, 0xbc, 0x90, 0x56, 0x5a, 0x4a, 0xe4, 0x9b, 0xf6, 0xa2, - 0xec, 0xa2, 0xbe, 0xa4, 0xf9, 0x53, 0xbc, 0xdf, 0x32, 0xaf, 0xf2, 0xca, - 0x89, 0xb2, 0x93, 0x79, 0x02, 0x24, 0x41, 0x2f, 0xd2, 0x87, 0x08, 0x26, - 0xec, 0x4a, 0xc3, 0x27, 0xed, 0x17, 0xd7, 0xe3, 0x47, 0xfe, 0x73, 0xf6, - 0xb1, 0xe5, 0x95, 0x8f, 0x51, 0x76, 0x62, 0x4b, 0x7a, 0x05, 0xff, 0x24, - 0x36, 0x59, 0x72, 0x71, 0x4f, 0x6d, 0xb2, 0xcb, 0xfe, 0x5b, 0x0b, 0xbe, - 0x4d, 0xb2, 0x9a, 0x6f, 0xd9, 0x8f, 0x29, 0x20, 0x3a, 0xe2, 0x5b, 0xa0, - 0x24, 0xf8, 0xc4, 0x78, 0x49, 0x35, 0x4b, 0xb1, 0xee, 0x9f, 0x95, 0x4a, - 0xdb, 0xf3, 0x77, 0x39, 0x59, 0x04, 0x09, 0xce, 0x44, 0xa6, 0x65, 0xa9, - 0x78, 0x6f, 0x6b, 0xb6, 0x8c, 0x5d, 0x29, 0x6e, 0x91, 0x0e, 0xd6, 0x1e, - 0xc6, 0xff, 0xe9, 0x3c, 0x37, 0xc9, 0xbc, 0xcf, 0x7f, 0x77, 0xa1, 0x01, - 0x6f, 0xb6, 0x88, 0x92, 0x9e, 0x3b, 0x53, 0xbc, 0xe1, 0xd5, 0x53, 0x35, - 0xe9, 0xf9, 0xd1, 0x10, 0x92, 0x60, 0x13, 0xe7, 0x53, 0xf2, 0x44, 0x42, - 0xe1, 0x62, 0x4f, 0x14, 0x7b, 0xf1, 0x90, 0xb0, 0x4d, 0x29, 0xa5, 0x7f, - 0x27, 0x20, 0x6a, 0xf5, 0xc6, 0xf7, 0x58, 0x35, 0xed, 0xbf, 0x24, 0xe3, - 0x61, 0x65, 0x52, 0xdf, 0xa3, 0x90, 0x0a, 0x21, 0xbb, 0xd2, 0x31, 0xa3, - 0xd5, 0x18, 0xba, 0x54, 0x56, 0xe9, 0x7a, 0x0f, 0x39, 0x23, 0x01, 0xaf, - 0x38, 0x8f, 0x5d, 0xfb, 0x2c, 0x61, 0xb3, 0xa7, 0x89, 0xba, 0x04, 0xca, - 0x63, 0xf6, 0xeb, 0xc7, 0xe4, 0x63, 0x5b, 0xf0, 0xde, 0x7c, 0x12, 0x69, - 0x83, 0x3d, 0x91, 0x1c, 0x09, 0x80, 0x17, 0xa6, 0x13, 0x32, 0x1d, 0xbd, - 0x03, 0x91, 0x5d, 0xca, 0x91, 0xf9, 0xd3, 0x12, 0x47, 0xc7, 0x80, 0x85, - 0x1c, 0x7f, 0x46, 0x26, 0xb8, 0x93, 0x1d, 0x04, 0x22, 0x31, 0x73, 0x43, - 0xf3, 0xe2, 0x8b, 0xf2, 0x8f, 0xda, 0x71, 0xd2, 0x24, 0x6d, 0xd6, 0xb3, - 0x93, 0xba, 0x7e, 0xbd, 0x13, 0x4c, 0x9f, 0x38, 0x61, 0xb8, 0xa2, 0x49, - 0x6d, 0xfd, 0x13, 0xa7, 0x11, 0x90, 0x1e, 0x76, 0x30, 0x11, 0x4e, 0x50, - 0x6a, 0x8e, 0x7b, 0xbc, 0xa5, 0xb1, 0x78, 0xf0, 0x4e, 0x5b, 0xef, 0x04, - 0x2c, 0x4c, 0x3c, 0xb2, 0x55, 0x33, 0xf2, 0x23, 0x8b, 0x7d, 0x0a, 0xd7, - 0xb7, 0x61, 0x2c, 0xd3, 0xc7, 0x47, 0x1e, 0xe1, 0xba, 0xfc, 0x6b, 0xc6, - 0xb9, 0x91, 0x8d, 0xc2, 0x9b, 0xb3, 0x88, 0xc7, 0x2a, 0x80, 0x3f, 0xe1, - 0xcb, 0x3f, 0x75, 0x7d, 0x4b, 0xf9, 0xfe, 0x55, 0x0f, 0xa3, 0xf6, 0x07, - 0x51, 0x71, 0x78, 0x23, 0x32, 0x28, 0x4e, 0xa9, 0x5f, 0x50, 0x5a, 0x47, - 0xc8, 0xbe, 0x2b, 0x2b, 0xce, 0x40, 0x5b, 0x3e, 0x02, 0x2b, 0x3d, 0xfe, - 0x93, 0x15, 0xad, 0x00, 0x32, 0x0e, 0xbb, 0x13, 0xf4, 0x3b, 0x76, 0xad, - 0xca, 0x6a, 0x56, 0xe5, 0xa6, 0x02, 0xf6, 0x48, 0x2f, 0x1d, 0x2b, 0xf1, - 0xba, 0xdd, 0x7b, 0x84, 0xe3, 0x2f, 0x89, 0x0b, 0x1e, 0x56, 0xad, 0xb3, - 0xd5, 0x7a, 0xad, 0xe9, 0xb6, 0xb0, 0xed, 0x0f, 0x27, 0xbe, 0x40, 0xcb, - 0xd9, 0xd6, 0x1f, 0x3c, 0xc2, 0x5b, 0x21, 0xf7, 0x8e, 0x6b, 0xda, 0xf8, - 0xa7, 0x38, 0xe7, 0x91, 0x61, 0x1a, 0xdf, 0x60, 0x01, 0x31, 0x81, 0xe6, - 0x5f, 0x58, 0x4c, 0x3c, 0xe4, 0x58, 0xea, 0xe5, 0x26, 0xb1, 0x18, 0xf1, - 0x5d, 0xc0, 0xa2, 0x60, 0x48, 0x46, 0x92, 0xe0, 0xb0, 0x79, 0xd2, 0xec, - 0xd8, 0x18, 0xdc, 0xa6, 0x40, 0x1e, 0x73, 0x82, 0x64, 0x56, 0x9e, 0x66, - 0x40, 0x25, 0xf6, 0x8f, 0x20, 0x3e, 0x3e, 0xf9, 0x79, 0x9b, 0x2d, 0x6b, - 0x2b, 0x5e, 0x7b, 0x7f, 0xd8, 0xea, 0x36, 0x77, 0xb3, 0x2e, 0xc8, 0xe5, - 0x17, 0xff, 0x34, 0x30, 0xbc, 0xb9, 0x3c, 0x2c, 0xa0, 0x9b, 0xb6, 0x30, - 0x54, 0xba, 0x92, 0xce, 0x3f, 0x02, 0x4d, 0x27, 0xec, 0xc0, 0x51, 0x0d, - 0x16, 0x58, 0xeb, 0xef, 0x52, 0x05, 0x83, 0xab, 0xb9, 0xf0, 0xec, 0x85, - 0x4c, 0xf7, 0x65, 0xe3, 0xf5, 0xd8, 0xda, 0xdc, 0x68, 0x10, 0x2c, 0xdf, - 0xc0, 0x92, 0xff, 0x0e, 0x25, 0x8a, 0x2a, 0x40, 0x12, 0x57, 0x26, 0x18, - 0x6d, 0x18, 0xf3, 0xcb, 0xc2, 0x16, 0xe5, 0x74, 0x03, 0x51, 0x11, 0xe1, - 0x20, 0x71, 0xcf, 0x64, 0x9f, 0xe4, 0x4b, 0x54, 0x19, 0xea, 0xe4, 0xe8, - 0xcf, 0xce, 0x8b, 0xad, 0xf5, 0x8d, 0x34, 0xe8, 0xf7, 0x63, 0xfd, 0xbe, - 0xb5, 0xba, 0xbb, 0x49, 0x48, 0x4f, 0xfc, 0x55, 0xb5, 0x67, 0x16, 0xa0, - 0xb3, 0x77, 0x36, 0x04, 0xc0, 0xf8, 0xdf, 0x09, 0x34, 0xc7, 0xe6, 0xb9, - 0x0a, 0x75, 0xca, 0x61, 0x34, 0x9f, 0x5e, 0xb9, 0xd7, 0x46, 0x33, 0x3e, - 0x4c, 0x30, 0x18, 0xb2, 0xe6, 0x02, 0xb2, 0x57, 0x0d, 0xc2, 0xbf, 0x0b, - 0x4a, 0x49, 0x34, 0x36, 0xa0, 0xa5, 0xa6, 0x3d, 0xa7, 0xea, 0x71, 0x86, - 0x5c, 0x6d, 0xe5, 0x27, 0x70, 0x2c, 0xef, 0x85, 0xf8, 0xa8, 0xde, 0x6a, - 0x5a, 0x9b, 0x13, 0xeb, 0xbd, 0xa6, 0xc2, 0xcc, 0xba, 0x71, 0x20, 0x36, - 0xfa, 0x1e, 0x7c, 0xc3, 0xf7, 0x82, 0x51, 0x4b, 0x65, 0xa3, 0xd2, 0x92, - 0x2e, 0x7d, 0x96, 0xc7, 0x62, 0x40, 0x91, 0x28, 0x5d, 0xe4, 0xbe, 0x10, - 0xe7, 0x6e, 0x0a, 0xfb, 0xb6, 0xbb, 0xdb, 0xa5, 0xf5, 0x98, 0x82, 0x59, - 0xd4, 0x5c, 0xe8, 0xa7, 0x80, 0x86, 0xaa, 0x4a, 0x2d, 0x4d, 0x3f, 0x1a, - 0xc9, 0x77, 0xcf, 0x9c, 0x4e, 0x1a, 0x7f, 0x20, 0x75, 0x47, 0x39, 0x1a, - 0x68, 0xf5, 0x1d, 0xca, 0xc9, 0x43, 0x23, 0x0a, 0x02, 0x70, 0x21, 0x8b, - 0xa7, 0x8e, 0xb3, 0x90, 0xd9, 0x0d, 0xb2, 0x17, 0xd3, 0xf4, 0xf3, 0xf2, - 0x85, 0x51, 0x03, 0x8e, 0x59, 0x3a, 0xa5, 0x33, 0x31, 0xf3, 0xae, 0xda, - 0xce, 0x40, 0xde, 0x6a, 0x5a, 0x9b, 0x13, 0xeb, 0xbd, 0xa6, 0xc3, 0x7c, - 0xba, 0x71, 0x20, 0x36, 0x75, 0x68, 0x3d, 0x6c, 0x57, 0xa6, 0x74, 0xc5, - 0x0f, 0x66, 0xf7, 0x9a, 0x1b, 0x91, 0x51, 0x77, 0xc7, 0xbb, 0x2b, 0x61, - 0x17, 0xaa, 0x98, 0x76, 0x95, 0x04, 0x7c, 0xb2, 0x35, 0x1d, 0x1b, 0xec, - 0x2e, 0xb1, 0xcc, 0xa8, 0xf0, 0xff, 0xbc, 0x4d, 0x8b, 0x9a, 0xfc, 0x25, - 0xc7, 0xba, 0x4f, 0xe8, 0x3b, 0xa2, 0x12, 0xaa, 0xb0, 0x71, 0xd9, 0x61, - 0x88, 0xd7, 0xb1, 0xa2, 0x28, 0x3b, 0xf9, 0x9a, 0x4e, 0x64, 0x84, 0x0b, - 0xba, 0x50, 0x0e, 0xbf, 0x05, 0xe3, 0x6c, 0xd9, 0xa2, 0xf0, 0x1b, 0x67, - 0x99, 0x32, 0x0c, 0x29, 0xdb, 0x11, 0x10, 0xa0, 0x99, 0x21, 0xa9, 0x82, - 0x21, 0x41, 0x6d, 0x5a, 0x43, 0xd3, 0xb1, 0x12, 0x4d, 0x79, 0x56, 0x67, - 0x6e, 0x6b, 0x78, 0x54, 0x76, 0x7c, 0x16, 0x56, 0xab, 0x2d, 0x30, 0x25, - 0xba, 0xf1, 0x54, 0xa4, 0xa7, 0x01, 0xcf, 0x09, 0xd6, 0x23, 0x5f, 0x8f, - 0xbb, 0x54, 0x96, 0xdf, 0x8a, 0x12, 0x5a, 0x92, 0xd6, 0x19, 0x5a, 0x83, - 0x06, 0x97, 0xcc, 0x19, 0xe5, 0x55, 0xb7, 0xfe, 0x58, 0xfa, 0xb0, 0xc0, - 0xe4, 0x2a, 0xca, 0x47, 0xc5, 0x5c, 0x0d, 0x6a, 0x75, 0x64, 0xcb, 0xee, - 0xc2, 0x8e, 0x08, 0xee, 0x40, 0xd7, 0xb5, 0x1f, 0x82, 0xfb, 0x35, 0xcc, - 0x59, 0x87, 0x26, 0xa1, 0xd2, 0xeb, 0xf1, 0xfa, 0x50, 0xc2, 0x4f, 0x4e, - 0x9a, 0x1f, 0x8b, 0x36, 0x5e, 0xf5, 0xf4, 0xd9, 0xc3, 0x35, 0x55, 0x0b, - 0x95, 0x0d, 0x35, 0x2a, 0xec, 0xd5, 0x1c, 0x32, 0x07, 0x7e, 0x00, 0x3f, - 0x39, 0x56, 0xbb, 0xb4, 0x5d, 0xca, 0x0c, 0x9f, 0x68, 0x23, 0x9b, 0x74, - 0xe3, 0x5f, 0x08, 0xf8, 0xdf, 0x1f, 0x1f, 0xd5, 0x88, 0x5e, 0xdf, 0x64, - 0xb2, 0x88, 0x4e, 0x67, 0xcb, 0x31, 0x48, 0x61, 0x98, 0x2f, 0xb7, 0x95, - 0x36, 0xab, 0xa8, 0xbd, 0x16, 0x26, 0xa6, 0xe0, 0x62, 0x94, 0xde, 0x5a, - 0xd4, 0xb9, 0x28, 0xe4, 0xde, 0xb0, 0xc9, 0xc7, 0x4a, 0xc8, 0x4f, 0x46, - 0x15, 0x84, 0x0c, 0x29, 0x2e, 0x51, 0xb4, 0xb6, 0x29, 0xdf, 0xd2, 0x60, - 0xad, 0xb2, 0xe7, 0xd6, 0xd9, 0x52, 0xbd, 0x43, 0x14, 0x36, 0x3f, 0x1c, - 0xe3, 0xf8, 0x14, 0x0a, 0xa5, 0x16, 0x10, 0x66, 0x2c, 0x9c, 0xb2, 0xb3, - 0xf1, 0x24, 0xce, 0x22, 0x50, 0xeb, 0x17, 0xe1, 0x20, 0x47, 0xe8, 0xe1, - 0x38, 0xab, 0xb6, 0x5a, 0xe4, 0x95, 0x71, 0x6c, 0x69, 0x92, 0x57, 0x2b, - 0x7f, 0x70, 0x48, 0xe8, 0x22, 0x4f, 0x62, 0xc4, 0xf8, 0x7a, 0x56, 0xef, - 0xaf, 0x8e, 0xbe, 0xa5, 0x47, 0x42, 0x13, 0x87, 0x18, 0x9d, 0xd2, 0x64, - 0xe3, 0x21, 0x3e, 0x86, 0x3d, 0x36, 0x41, 0xaa, 0xda, 0xd0, 0xbb, 0xf9, - 0x1e, 0x74, 0x3f, 0xba, 0x1c, 0x49, 0x70, 0x04, 0x17, 0x12, 0x28, 0xfe, - 0x41, 0x5a, 0xd5, 0xa8, 0x3a, 0x1f, 0x93, 0x7f, 0xe7, 0x4f, 0x06, 0x7f, - 0x49, 0x4b, 0xd9, 0x37, 0x0b, 0xde, 0x3d, 0x61, 0x4c, 0x70, 0xf2, 0xb6, - 0xb0, 0x59, 0x56, 0x02, 0x42, 0xf5, 0xb4, 0x32, 0x1f, 0x92, 0x28, 0xa2, - 0x98, 0xa8, 0x8f, 0x7e, 0x82, 0x93, 0x04, 0x8d, 0xf1, 0x31, 0xfd, 0x14, - 0x00, 0x74, 0x14, 0x1b, 0x18, 0xc5, 0x1d, 0x9e, 0xcb, 0x7a, 0xa7, 0x7e, - 0x20, 0x37, 0xa9, 0xd1, 0x39, 0x5a, 0x45, 0x2c, 0x2e, 0xc6, 0x27, 0xf1, - 0xeb, 0x52, 0x3b, 0x04, 0x0a, 0x89, 0xac, 0xa6, 0x4f, 0x3e, 0xfb, 0x1f, - 0x78, 0xd9, 0x5a, 0x2e, 0x4d, 0x6f, 0x1c, 0x04, 0x5f, 0x80, 0xee, 0x74, - 0x5b, 0x42, 0x07, 0x6e, 0xcc, 0x9e, 0x2d, 0xd1, 0x5f, 0x37, 0xf9, 0xe9, - 0xbc, 0xc2, 0xdb, 0xb9, 0x7f, 0xcf, 0xff, 0x1b, 0xfb, 0xd0, 0xbd, 0x08, - 0xe6, 0x76, 0x04, 0xcf, 0xf3, 0x3b, 0xf4, 0x39, 0xf0, 0x94, 0xce, 0x9d, - 0x1b, 0x77, 0x8a, 0x90, 0xea, 0x55, 0x8b, 0xd1, 0xb2, 0x88, 0xaa, 0x07, - 0xc1, 0x07, 0x1b, 0x02, 0xbf, 0x5e, 0x3b, 0x84, 0x2e, 0x38, 0xd6, 0xb2, - 0x96, 0x0d, 0x91, 0x90, 0xee, 0x24, 0xaa, 0xae, 0x0e, 0x39, 0x06, 0x5f, - 0x6e, 0xfe, 0x83, 0xac, 0x3d, 0xe6, 0x13, 0x73, 0x07, 0x3a, 0x4e, 0x2e, - 0x83, 0x10, 0x80, 0x95, 0x2b, 0x7c, 0x96, 0x2d, 0x43, 0xb6, 0xde, 0x0d, - 0x0a, 0x5d, 0x10, 0xe5, 0x89, 0xc2, 0x29, 0x5c, 0x44, 0xcd, 0x08, 0x60, - 0x8e, 0x6b, 0x3f, 0x83, 0x82, 0x97, 0x2b, 0x8d, 0xaf, 0x4c, 0x92, 0x91, - 0x18, 0x6c, 0x76, 0xe7, 0x57, 0xab, 0xfc, 0xe7, 0x5b, 0xb8, 0x71, 0x66, - 0xc1, 0x41, 0xf9, 0x9a, 0xa2, 0x84, 0xeb, 0x79, 0x59, 0x92, 0xeb, 0x31, - 0x3f, 0xbc, 0xe9, 0x82, 0xd2, 0xfc, 0xc0, 0x36, 0x2f, 0x34, 0xab, 0x98, - 0x74, 0x4e, 0x1d, 0x94, 0x2e, 0xed, 0xb1, 0xcb, 0x74, 0x9a, 0x3f, 0x36, - 0xca, 0x55, 0x15, 0x79, 0xc6, 0x7e, 0xa4, 0xa4, 0x5a, 0xd0, 0xf5, 0x68, - 0x2d, 0x08, 0xec, 0xc5, 0xa0, 0xb8, 0x79, 0xba, 0x73, 0x8e, 0x9d, 0x6f, - 0xb7, 0x35, 0xaa, 0x65, 0x6e, 0xb7, 0xc7, 0x69, 0x5c, 0x36, 0x80, 0xed, - 0x3d, 0xfd, 0x11, 0x8f, 0x59, 0x03, 0x9d, 0x28, 0x69, 0x5e, 0xca, 0xa6, - 0x98, 0xf1, 0x9e, 0x4c, 0x0e, 0x62, 0xe6, 0x7a, 0xb8, 0x6f, 0xa8, 0xee, - 0x10, 0x59, 0x4e, 0xec, 0xa3, 0x95, 0x1d, 0x0d, 0x9d, 0xcd, 0x22, 0x08, - 0x97, 0xcc, 0x5a, 0xbc, 0x58, 0x03, 0x78, 0x9a, 0x6e, 0xfe, 0x49, 0xb8, - 0x49, 0xd3, 0x78, 0xc8, 0x00, 0x60, 0x2d, 0xb1, 0x49, 0x7a, 0x93, 0xde, - 0x85, 0x11, 0x94, 0x7a, 0x76, 0xf6, 0x82, 0x9e, 0xb0, 0x0c, 0xd0, 0x4e, - 0x63, 0xba, 0x23, 0x99, 0x60, 0x60, 0xc1, 0xb6, 0xe9, 0x6b, 0x76, 0xb5, - 0xcd, 0x8d, 0x0f, 0x20, 0x5b, 0x91, 0x25, 0x44, 0x26, 0xfc, 0x01, 0x1c, - 0xad, 0xc4, 0x03, 0x36, 0xb2, 0xc1, 0xf3, 0xb1, 0x8b, 0xd2, 0x68, 0x3e, - 0x65, 0x38, 0xa5, 0xac, 0xbd, 0xc6, 0x12, 0xa2, 0xb9, 0xea, 0x2a, 0x80, - 0xf9, 0xc6, 0xeb, 0x57, 0xca, 0x55, 0xc5, 0x48, 0x36, 0xc5, 0x46, 0x45, - 0xba, 0xec, 0xca, 0xfb, 0x54, 0x55, 0x6e, 0xcb, 0xf7, 0xbc, 0x6a, 0x20, - 0x76, 0x47, 0x66, 0x0a, 0xdc, 0xa9, 0xe8, 0x2a, 0x09, 0xe2, 0x61, 0x63, - 0x65, 0xf7, 0xb9, 0x15, 0x0e, 0xd9, 0x6c, 0xb7, 0x94, 0x7c, 0x60, 0xa8, - 0x19, 0x09, 0x7f, 0x9a, 0xd7, 0xe5, 0x03, 0x74, 0x80, 0xc6, 0xcc, 0x8b, - 0x51, 0x50, 0x7e, 0xb9, 0xdd, 0xe3, 0xcd, 0x92, 0xf6, 0x56, 0x2d, 0xd2, - 0x76, 0x0e, 0xe7, 0xd5, 0x88, 0x60, 0x6b, 0x46, 0x0c, 0x3a, 0x6c, 0xc7, - 0x3a, 0x30, 0x87, 0x11, 0x43, 0xce, 0x74, 0x73, 0x7e, 0x15, 0xae, 0x88, - 0x7b, 0xfc, 0x11, 0x14, 0x0f, 0x78, 0x83, 0xef, 0x3a, 0xf5, 0x59, 0x32, - 0x2f, 0x69, 0x98, 0xf5, 0x04, 0x2a, 0x45, 0xb9, 0xfc, 0xb0, 0x2b, 0x24, - 0xc0, 0xda, 0x46, 0x54, 0xa7, 0x7a, 0x52, 0x59, 0x52, 0x8d, 0x0f, 0xfb, - 0x18, 0x70, 0x7d, 0xae, 0xcc, 0x17, 0xf6, 0x60, 0x61, 0xa2, 0xec, 0xe1, - 0x72, 0x27, 0xfa, 0x43, 0xbc, 0x83, 0x50, 0xee, 0x65, 0x82, 0xd4, 0xa7, - 0x2a, 0xd4, 0x27, 0x5e, 0x45, 0x7d, 0x0e, 0x5b, 0x2b, 0x78, 0xee, 0x5f, - 0x23, 0xa2, 0x0c, 0x9c, 0xa6, 0x82, 0xcf, 0xcc, 0xd0, 0x2a, 0xb7, 0x0a, - 0xee, 0x61, 0x2c, 0xcb, 0x41, 0x74, 0x09, 0x3c, 0x79, 0x20, 0xe8, 0xbc, - 0xe7, 0x79, 0xd5, 0x01, 0x8f, 0xd5, 0x28, 0xa3, 0x34, 0xb1, 0x67, 0xb7, - 0xc4, 0x90, 0xd3, 0x52, 0x12, 0x9b, 0x69, 0xca, 0xd9, 0x7b, 0x39, 0xc7, - 0xaa, 0x2b, 0x7d, 0xd8, 0x51, 0x0b, 0x38, 0xce, 0x91, 0x95, 0xad, 0xb7, - 0x55, 0x47, 0x61, 0x52, 0x97, 0x52, 0xe2, 0x01, 0xb8, 0x7a, 0xf0, 0x52, - 0x21, 0x63, 0xc5, 0x54, 0x18, 0x37, 0x1f, 0x4e, 0xdc, 0xcb, 0x6a, 0xfd, - 0xa4, 0x8f, 0x89, 0x13, 0xa3, 0x1a, 0x3d, 0xc7, 0x36, 0x21, 0x29, 0xbb, - 0xbf, 0x23, 0x47, 0x35, 0x57, 0x1d, 0x38, 0x70, 0x8a, 0x13, 0x69, 0xe6, - 0x02, 0xfb, 0xae, 0x1f, 0x79, 0xb6, 0xbd, 0xc5, 0xc1, 0x5e, 0xd9, 0x21, - 0xf0, 0x8c, 0x5c, 0xaf, 0x36, 0x3e, 0x7c, 0x38, 0x40, 0xc9, 0xf3, 0x70, - 0xcf, 0xa6, 0x43, 0x74, 0xf1, 0xd0, 0x31, 0x5a, 0x77, 0x6d, 0x16, 0xca, - 0x53, 0x6a, 0x29, 0xcf, 0x4a, 0xa1, 0xb6, 0x81, 0xff, 0x94, 0x95, 0xac, - 0xc9, 0xaf, 0xa5, 0x38, 0x4a, 0xb9, 0x48, 0x18, 0x24, 0x8a, 0x5d, 0x04, - 0x44, 0xfe, 0x41, 0x93, 0x47, 0x00, 0x6b, 0x62, 0xfa, 0x2a, 0x64, 0xd0, - 0x85, 0x43, 0x1f, 0x7a, 0xd4, 0x26, 0xe9, 0x9a, 0x05, 0x8e, 0x07, 0x60, - 0x00, 0x64, 0x72, 0x5f, 0xbf, 0x01, 0x53, 0x11, 0x7b, 0x82, 0x5b, 0xf3, - 0x26, 0x29, 0xda, 0xaa, 0x69, 0x3e, 0x8e, 0x76, 0x18, 0x31, 0x73, 0x9f, - 0xa7, 0x5e, 0x06, 0x31, 0x57, 0xd7, 0x17, 0xde, 0x3c, 0x8b, 0xaa, 0xc7, - 0xf7, 0x63, 0x3d, 0x26, 0xfb, 0x01, 0x9b, 0xee, 0xc3, 0xd9, 0xf1, 0xb1, - 0xae, 0xe2, 0xf2, 0x80, 0x1d, 0x7c, 0x83, 0x49, 0xec, 0x76, 0x18, 0x82, - 0xc6, 0x4a, 0x9e, 0xfb, 0x92, 0x32, 0x38, 0xd4, 0xeb, 0xe9, 0x59, 0x2e, - 0x33, 0x71, 0x43, 0x54, 0x48, 0x45, 0x2d, 0x7b, 0x11, 0x79, 0xc5, 0x16, - 0xaa, 0xcd, 0x62, 0x4d, 0x25, 0xda, 0xbf, 0x85, 0xe9, 0x62, 0x74, 0xcb, - 0xd6, 0x1b, 0x29, 0xee, 0x78, 0x03, 0x0a, 0xb7, 0x51, 0xe5, 0x7e, 0x9e, - 0x5f, 0x37, 0xae, 0xbe, 0x8b, 0x40, 0xdb, 0x5e, 0xd4, 0x6c, 0xdc, 0xcd, - 0xb5, 0x33, 0xf5, 0xc0, 0xb4, 0x02, 0x17, 0x17, 0x16, 0x06, 0x4a, 0xf2, - 0xcf, 0xae, 0xb3, 0x54, 0x43, 0xd6, 0xe9, 0x97, 0xc9, 0xb8, 0x0b, 0x08, - 0x0e, 0x87, 0xd1, 0x0d, 0x1a, 0x72, 0xd6, 0xc4, 0xe5, 0xbf, 0x7c, 0xff, - 0xfc, 0x0c, 0xa2, 0xd1, 0x16, 0x98, 0x46, 0x19, 0x93, 0xec, 0x0f, 0x1e, - 0x9c, 0x69, 0xae, 0xa1, 0x95, 0x3e, 0xcf, 0xd2, 0x43, 0x33, 0x32, 0xff, - 0x85, 0xdb, 0x31, 0xdf, 0x8b, 0x4c, 0x5e, 0xbd, 0x38, 0xd8, 0x6e, 0x66, - 0x9c, 0xe7, 0x2f, 0x82, 0x16, 0x27, 0x86, 0x7b, 0x9a, 0xce, 0xdf, 0x51, - 0xee, 0xf0, 0xc7, 0xf9, 0xb1, 0x2b, 0x01, 0x8e, 0xa6, 0xb2, 0x30, 0xa1, - 0xf1, 0xd7, 0x4b, 0x30, 0x23, 0x5c, 0x55, 0x13, 0xdb, 0x4d, 0x76, 0x47, - 0x95, 0x78, 0x84, 0x95, 0x81, 0x03, 0xa7, 0xdd, 0xfa, 0x8b, 0xdc, 0x5b, - 0x68, 0xba, 0xd4, 0x60, 0xde, 0x8b, 0xc4, 0xf2, 0x60, 0x38, 0x09, 0x04, - 0xce, 0xaa, 0xda, 0x67, 0x79, 0x1d, 0x17, 0x0f, 0xdf, 0x45, 0xbd, 0xa8, - 0x00, 0x65, 0xb1, 0x87, 0x1f, 0x2f, 0x2a, 0x33, 0x6b, 0x63, 0x63, 0xf4, - 0x22, 0x84, 0x59, 0x8a, 0x5f, 0x3c, 0x0e, 0x47, 0x48, 0xf4, 0x34, 0x31, - 0xf7, 0x3a, 0x37, 0xe1, 0x38, 0xa5, 0x79, 0x86, 0x01, 0x0f, 0xfa, 0x04, - 0x4a, 0x5c, 0xa6, 0x17, 0xed, 0xb5, 0x0e, 0x15, 0xbf, 0xe9, 0x55, 0xcb, - 0xcb, 0xa3, 0x8b, 0xcb, 0xe8, 0x4a, 0xc1, 0xec, 0xd7, 0x30, 0xe4, 0x66, - 0x79, 0xcb, 0xd6, 0x86, 0x1f, 0xec, 0xfa, 0x16, 0x39, 0x20, 0xdc, 0x1f, - 0x8d, 0x15, 0x87, 0x9a, 0x27, 0x08, 0xdc, 0xcd, 0x9e, 0xfb, 0xf7, 0x3a, - 0xd6, 0xa9, 0x14, 0xd9, 0xbd, 0xda, 0x45, 0xf6, 0xf0, 0xaf, 0x89, 0x0e, - 0x3e, 0xea, 0xbe, 0xff, 0x56, 0xf8, 0x8f, 0x9f, 0x05, 0x46, 0xcd, 0x97, - 0xf9, 0xd6, 0x9f, 0x19, 0x8e, 0xcf, 0xea, 0x5c, 0xa1, 0xac, 0x42, 0x95, - 0x2b, 0x74, 0x42, 0xac, 0x75, 0xb7, 0x1b, 0x92, 0x3f, 0x74, 0xf5, 0xc3, - 0x9f, 0x3f, 0xa2, 0x9e, 0x02, 0xfa, 0x11, 0x5f, 0xd9, 0xa9, 0x3c, 0xb5, - 0xb9, 0xf5, 0x54, 0x6e, 0x5d, 0x10, 0xb2, 0x04, 0x56, 0x73, 0x05, 0x37, - 0x98, 0x60, 0x59, 0x16, 0xbf, 0xe9, 0xf9, 0x87, 0xed, 0x7f, 0xe7, 0xa5, - 0x24, 0xde, 0xa8, 0x0e, 0xbb, 0xe7, 0xb7, 0x0f, 0xd3, 0xeb, 0xfb, 0x59, - 0x84, 0xb1, 0x9a, 0x37, 0xde, 0x74, 0xd7, 0xad, 0x67, 0xf6, 0xdc, 0x34, - 0x46, 0x41, 0xe6, 0xff, 0x2e, 0x85, 0xc9, 0x6c, 0xe2, 0xf6, 0x94, 0x7a, - 0x0c, 0x77, 0xad, 0x1e, 0x52, 0x5d, 0xd3, 0xef, 0xa2, 0xa2, 0x5f, 0xa1, - 0x5c, 0xed, 0x80, 0x59, 0xf7, 0x64, 0x23, 0x59, 0x35, 0xf1, 0x7b, 0x99, - 0x6a, 0x07, 0xeb, 0x5c, 0x33, 0x1b, 0xfc, 0x46, 0x12, 0x26, 0xab, 0x16, - 0x85, 0xeb, 0xde, 0xec, 0x15, 0x33, 0xf8, 0xe5, 0x0d, 0x92, 0x9f, 0x41, - 0x44, 0x0b, 0x2e, 0x3f, 0xc3, 0xe3, 0x56, 0x91, 0x1c, 0x4b, 0x85, 0x38, - 0xf8, 0x54, 0x17, 0xa5, 0x4b, 0x7c, 0xbf, 0x98, 0x52, 0xd8, 0xdd, 0xd6, - 0x87, 0xfd, 0xfb, 0xa5, 0x32, 0x8b, 0x4e, 0x01, 0xe1, 0x6c, 0x5d, 0x28, - 0x0b, 0xa2, 0xfc, 0xe5, 0x6e, 0xb3, 0x5f, 0xa2, 0xc0, 0xaf, 0xd9, 0x1a, - 0xc6, 0x8e, 0x3d, 0xc6, 0xaa, 0x6f, 0xa1, 0x93, 0xa0, 0xb6, 0xbb, 0xf9, - 0x65, 0x67, 0x66, 0x99, 0xee, 0x7c, 0x0a, 0x1a, 0x8a, 0xf7, 0xdb, 0x40, - 0x08, 0xc4, 0x2d, 0x3e, 0x80, 0x36, 0xaf, 0x7d, 0x6e, 0x83, 0x4b, 0x8b, - 0x96, 0xd5, 0x38, 0x97, 0x1b, 0x18, 0x6b, 0xde, 0x94, 0x1b, 0x18, 0x98, - 0x7f, 0x42, 0xef, 0x48, 0x45, 0x9e, 0x0c, 0xeb, 0x46, 0xb0, 0x7b, 0xae, - 0xef, 0x27, 0xe9, 0x9d, 0x84, 0x6c, 0x02, 0x60, 0x57, 0xb0, 0x34, 0x06, - 0xc0, 0x03, 0x40, 0x07, 0x1e, 0x49, 0x2a, 0x09, 0x1e, 0x05, 0xe5, 0xcd, - 0x0c, 0x9b, 0xa4, 0xe8, 0x99, 0x91, 0xf2, 0xe1, 0xaf, 0x3c, 0x85, 0x0d, - 0x89, 0x38, 0x11, 0x08, 0xdd, 0x08, 0x90, 0xee, 0x49, 0xdd, 0x9a, 0xe3, - 0x9f, 0x0b, 0x2b, 0xa8, 0x22, 0x0f, 0x74, 0xa9, 0x44, 0x1c, 0x08, 0xbf, - 0x4e, 0x4f, 0x1f, 0x2b, 0x55, 0x2d, 0xbb, 0xf8, 0x28, 0x86, 0xa8, 0x39, - 0x1a, 0x71, 0xaa, 0xc3, 0x6c, 0x30, 0x5c, 0xa8, 0x57, 0x8a, 0x0a, 0x6f, - 0xcf, 0xfd, 0x4e, 0xe9, 0xa0, 0xed, 0x15, 0x7a, 0xed, 0x7f, 0xcc, 0xda, - 0x96, 0x4d, 0x0a, 0x86, 0x4c, 0x7d, 0xe2, 0x04, 0xcd, 0x94, 0x80, 0x5e, - 0x73, 0x46, 0x9f, 0x07, 0x5e, 0x1d, 0x8f, 0x2d, 0x47, 0x7c, 0xea, 0xed, - 0xe2, 0x30, 0x5e, 0x48, 0x30, 0xf1, 0x1f, 0x68, 0x5a, 0xb7, 0xcb, 0xda, - 0x5a, 0x20, 0x84, 0x51, 0x48, 0x24, 0xdd, 0xd8, 0x06, 0x6e, 0xe7, 0x8a, - 0x16, 0x59, 0xf8, 0x02, 0x2e, 0x90, 0x61, 0x82, 0x12, 0x93, 0xc4, 0xb7, - 0xb0, 0xe4, 0x51, 0x76, 0x64, 0x2f, 0xfe, 0x3a, 0xb6, 0xd5, 0x6e, 0xdf, - 0x68, 0xe2, 0x28, 0xa2, 0xc4, 0xe3, 0x16, 0xda, 0xb1, 0x31, 0x16, 0x46, - 0xae, 0xd7, 0x72, 0x25, 0x3e, 0x01, 0x36, 0x07, 0xee, 0x98, 0x05, 0x96, - 0xd1, 0xe7, 0xa5, 0x91, 0xe3, 0x1d, 0x8e, 0xee, 0x63, 0x7b, 0xce, 0xca, - 0x43, 0x94, 0xaa, 0x65, 0xe1, 0x0d, 0xe1, 0xf5, 0x4e, 0xc3, 0x09, 0xdc, - 0xe0, 0x81, 0x26, 0xfa, 0x8e, 0x7e, 0xb6, 0xe0, 0x9f, 0xa8, 0xb0, 0x3d, - 0xa9, 0x6d, 0x54, 0x43, 0xa6, 0x50, 0x44, 0x2a, 0x61, 0x16, 0x08, 0xe1, - 0x75, 0xf0, 0xc0, 0x47, 0x0b, 0x71, 0x52, 0xc9, 0xab, 0xa8, 0x64, 0xe0, - 0xcb, 0x6c, 0x7c, 0x74, 0x09, 0xf7, 0xf1, 0xc9, 0xdd, 0xf0, 0x5c, 0xe3, - 0x33, 0x0c, 0x17, 0x69, 0x02, 0xef, 0x3d, 0xbd, 0xd1, 0x3d, 0xfa, 0x3e, - 0x41, 0xc3, 0x65, 0xf1, 0x13, 0x34, 0x67, 0xd8, 0x87, 0x0b, 0x4d, 0xc3, - 0x68, 0x67, 0x66, 0x3c, 0x8e, 0xfa, 0xf6, 0x68, 0x99, 0xa3, 0xbf, 0x85, - 0x47, 0x05, 0xd9, 0x0b, 0x76, 0xdd, 0x67, 0xad, 0xda, 0x64, 0x98, 0xee, - 0x98, 0x75, 0x64, 0x89, 0x82, 0xfe, 0x9f, 0x6a, 0x24, 0xb9, 0xda, 0xb1, - 0xac, 0xf0, 0xdd, 0xa4, 0x38, 0x99, 0xd7, 0xf6, 0x0e, 0x47, 0x77, 0x34, - 0xc9, 0x69, 0x93, 0xd5, 0x68, 0xcf, 0x2d, 0xa5, 0xfc, 0x44, 0xe6, 0x58, - 0x3b, 0x86, 0x23, 0x24, 0xb6, 0x7b, 0x70, 0x84, 0x43, 0x07, 0xe8, 0x58, - 0xcb, 0x72, 0x6f, 0x5d, 0xee, 0x22, 0xc2, 0x0d, 0xdb, 0x2e, 0x5f, 0x69, - 0x49, 0x41, 0xeb, 0x44, 0xf4, 0x2a, 0x2a, 0x6c, 0xc8, 0xc6, 0x10, 0x32, - 0x89, 0x96, 0x52, 0xca, 0x7e, 0x22, 0x6d, 0x62, 0x9f, 0x9c, 0x7e, 0x4e, - 0x4b, 0x82, 0x66, 0x61, 0xf7, 0x04, 0xee, 0x5a, 0x0b, 0x14, 0xac, 0x2a, - 0x50, 0xb1, 0x77, 0x38, 0xff, 0x87, 0x3d, 0xee, 0x96, 0x28, 0x47, 0x62, - 0x95, 0x02, 0xf6, 0x9d, 0xbd, 0x43, 0x1a, 0xa7, 0x93, 0x5d, 0xfd, 0x96, - 0x36, 0xc1, 0xaa, 0x77, 0x85, 0xe1, 0x92, 0xc4, 0xe3, 0x39, 0x3c, 0x22, - 0x25, 0x2a, 0xc0, 0x4d, 0xb0, 0xf3, 0x5a, 0x7c, 0xdd, 0xfd, 0x30, 0xcf, - 0x2c, 0xb0, 0x23, 0x75, 0x5e, 0xb9, 0xcf, 0xb2, 0x4f, 0xf3, 0x58, 0x5e, - 0x34, 0x93, 0xab, 0xfa, 0xa6, 0x1b, 0x3f, 0xf1, 0xf9, 0x60, 0x80, 0xbf, - 0x2f, 0xc8, 0x3d, 0xe6, 0xd3, 0x48, 0x31, 0x36, 0xdb, 0xfa, 0x6e, 0xd7, - 0x80, 0x33, 0x73, 0xb7, 0x22, 0x1b, 0x7c, 0x1d, 0xcb, 0xb6, 0xe8, 0xf9, - 0x2b, 0x30, 0x67, 0x8d, 0xc3, 0x0f, 0x68, 0x91, 0x08, 0xf7, 0x9b, 0x8c, - 0xbc, 0xf6, 0x94, 0x99, 0x2b, 0xe8, 0xb1, 0x5e, 0x7a, 0xd1, 0xf0, 0x37, - 0xfe, 0x63, 0x99, 0xeb, 0x0b, 0xbb, 0xa9, 0x3f, 0xfc, 0x8b, 0x1c, 0x93, - 0x4b, 0xf9, 0xbf, 0xb1, 0x31, 0x4d, 0xfd, 0x70, 0xea, 0x13, 0xcf, 0x97, - 0xcc, 0xc9, 0x5e, 0x57, 0xf0, 0xd9, 0xd7, 0x51, 0x28, 0x6b, 0xac, 0x9e, - 0x33, 0xce, 0x77, 0x38, 0xab, 0xc1, 0x9f, 0x1e, 0xa9, 0x03, 0x0b, 0xfb, - 0x7e, 0xb7, 0x3a, 0x1d, 0x22, 0xf7, 0xdf, 0xec, 0x92, 0x0f, 0x69, 0xb4, - 0x6b, 0xed, 0x4e, 0x11, 0x0d, 0xd0, 0x86, 0xfb, 0xe3, 0x1b, 0x32, 0xfa, - 0xf7, 0x7b, 0x9d, 0xa7, 0x68, 0x56, 0x43, 0x70, 0x23, 0x08, 0x8b, 0xca, - 0x27, 0x54, 0x13, 0xa4, 0xbc, 0xf5, 0x11, 0xf4, 0xd8, 0x7d, 0xd7, 0xe3, - 0xe4, 0xf1, 0x78, 0xfb, 0x20, 0x3a, 0x91, 0x10, 0x20, 0xdc, 0x8a, 0xae, - 0x09, 0x6c, 0xf1, 0x48, 0x9a, 0xea, 0x05, 0xe3, 0x37, 0x5f, 0xb6, 0xa3, - 0x5a, 0x7c, 0xa9, 0xe9, 0xa1, 0xfb, 0xff, 0xe8, 0xa6, 0x09, 0x8f, 0x6d, - 0x5f, 0x86, 0x28, 0xd4, 0x6f, 0xbb, 0x08, 0xd2, 0xea, 0x56, 0xc7, 0xed, - 0x5b, 0xca, 0xb4, 0xf5, 0xdd, 0x79, 0x9f, 0x92, 0x9d, 0xbc, 0x5b, 0x36, - 0x19, 0xad, 0x1f, 0x7a, 0xfe, 0xca, 0xc3, 0x25, 0x11, 0x71, 0x94, 0x0c, - 0x69, 0x3d, 0x91, 0xb1, 0x2b, 0xa6, 0x06, 0x43, 0xa3, 0xba, 0x88, 0xb0, - 0x3a, 0xcb, 0x71, 0xc1, 0x92, 0x67, 0x6c, 0x18, 0x4a, 0xb8, 0x49, 0x8f, - 0x8e, 0x0d, 0x5a, 0xa8, 0x37, 0x01, 0x06, 0x0a, 0xf1, 0xfa, 0x55, 0xcc, - 0x76, 0xbe, 0xb1, 0x2c, 0xa5, 0xeb, 0x08, 0x7a, 0x2e, 0xf5, 0xe5, 0xa8, - 0x75, 0x9b, 0xbd, 0xb6, 0xfb, 0x57, 0x60, 0x28, 0x35, 0x7f, 0x50, 0xf7, - 0xb9, 0x42, 0x18, 0xcb, 0x57, 0xf7, 0x6a, 0x6d, 0x44, 0x8f, 0x87, 0x71, - 0x4a, 0xb8, 0x66, 0x1e, 0x70, 0x3d, 0x96, 0x74, 0xc4, 0xbb, 0x10, 0x6b, - 0x5f, 0x28, 0x11, 0x71, 0xa5, 0xb3, 0x8f, 0xbc, 0x80, 0xd6, 0x08, 0xfc, - 0xaa, 0x39, 0x2b, 0x31, 0x30, 0x3c, 0xbb, 0xf1, 0x29, 0x69, 0xed, 0x1d, - 0xd8, 0x3d, 0xa6, 0x47, 0x22, 0x55, 0xb3, 0x55, 0x17, 0x11, 0x2d, 0x9d, - 0xf0, 0xae, 0xde, 0x50, 0xd3, 0xd3, 0xb1, 0x7a, 0x6e, 0xcb, 0x7d, 0x72, - 0x76, 0xcc, 0x07, 0x8f, 0x5e, 0x2e, 0x9c, 0x80, 0x2c, 0xc1, 0x1e, 0xc4, - 0xd0, 0x96, 0xb7, 0x5a, 0x55, 0x63, 0x5d, 0x96, 0x67, 0x84, 0xa3, 0x89, - 0xfc, 0xc5, 0xc8, 0x17, 0x5c, 0xe0, 0xf2, 0xab, 0x57, 0x8f, 0xc5, 0xa3, - 0x6a, 0xb5, 0xbc, 0xe1, 0x3d, 0xc5, 0x47, 0x84, 0xf5, 0x29, 0x0f, 0x45, - 0x1c, 0xc3, 0x73, 0x87, 0x47, 0x46, 0xaa, 0x82, 0xc7, 0xe0, 0xdb, 0xc8, - 0x82, 0xe1, 0x8c, 0xd0, 0x65, 0x9e, 0xb3, 0xb2, 0xdf, 0x23, 0xf6, 0xb5, - 0xd0, 0x9c, 0xd3, 0x02, 0x33, 0xca, 0xd7, 0xb2, 0x80, 0xe1, 0x33, 0x3b, - 0x8d, 0xe7, 0xc5, 0x90, 0x69, 0x64, 0x07, 0xcc, 0x45, 0x41, 0xee, 0x4c, - 0x83, 0x3e, 0xac, 0xe5, 0x90, 0xf1, 0x59, 0x46, 0xee, 0x0a, 0x5b, 0x65, - 0xf8, 0x4e, 0x36, 0x0c, 0xb3, 0x39, 0xd6, 0x21, 0xbb, 0x3a, 0x8b, 0xe7, - 0x2f, 0xc2, 0x7c, 0xc6, 0x81, 0xad, 0x5f, 0x49, 0x21, 0xff, 0x9a, 0xf7, - 0x0e, 0x68, 0xe1, 0xbf, 0x23, 0x15, 0xb6, 0xf3, 0x9e, 0x5f, 0x4f, 0x1b, - 0x37, 0xb5, 0x39, 0xf1, 0xb6, 0xcf, 0xbb, 0x2f, 0x4b, 0x52, 0x38, 0x49, - 0x6d, 0x95, 0x70, 0xdb, 0x19, 0xdc, 0xa9, 0x42, 0x38, 0xc3, 0x90, 0x8f, - 0x18, 0x9a, 0x54, 0xb3, 0x20, 0x07, 0x23, 0x9b, 0x75, 0xc6, 0x8c, 0xfe, - 0x04, 0x20, 0x17, 0x5e, 0x1c, 0x93, 0xb2, 0x2a, 0x43, 0x41, 0xff, 0x81, - 0xe0, 0x45, 0xed, 0x98, 0x26, 0xff, 0xda, 0x05, 0x41, 0x33, 0x96, 0x03, - 0x07, 0xec, 0x78, 0x0b, 0xf9, 0x00, 0xc8, 0xbc, 0x23, 0x05, 0xaf, 0x71, - 0xae, 0x62, 0x86, 0x4d, 0x24, 0x7b, 0xe1, 0x9e, 0x2e, 0xf0, 0x35, 0x13, - 0x57, 0x59, 0x3f, 0x96, 0x58, 0x1d, 0x10, 0x0b, 0x40, 0x53, 0x8b, 0xfe, - 0x76, 0xb7, 0x96, 0xa8, 0xfb, 0xcc, 0x9b, 0x62, 0xdf, 0x90, 0x86, 0xf7, - 0xbc, 0x23, 0x9d, 0xb5, 0x1a, 0xc3, 0xc9, 0x2c, 0x53, 0x32, 0xca, 0x41, - 0xd2, 0xc2, 0x63, 0x0a, 0xcd, 0x25, 0xd4, 0xd9, 0x0d, 0x8e, 0xd2, 0x1c, - 0xed, 0x39, 0x4a, 0x79, 0x84, 0x97, 0x06, 0x55, 0x95, 0x2b, 0xe5, 0xb3, - 0x25, 0xeb, 0xe1, 0xd3, 0x5d, 0x8a, 0x1e, 0x21, 0xe1, 0x05, 0xd6, 0xd9, - 0x44, 0x3e, 0xfc, 0x3b, 0x74, 0xbb, 0x0d, 0xe1, 0xc3, 0xdf, 0x58, 0x00, - 0x7c, 0x2c, 0xd6, 0x06, 0xc4, 0xa1, 0x8e, 0x19, 0x4e, 0xde, 0x63, 0xd4, - 0x61, 0xda, 0x42, 0xac, 0x22, 0x96, 0xd6, 0xd2, 0x6c, 0x4c, 0x71, 0x4a, - 0x4a, 0xc3, 0xd7, 0x99, 0x4e, 0x4e, 0xab, 0x08, 0xe9, 0xe9, 0x70, 0xc5, - 0x50, 0x15, 0xc0, 0x09, 0x52, 0xd4, 0x10, 0x0f, 0x00, 0x5c, 0xc0, 0x11, - 0x95, 0xef, 0xa1, 0x93, 0x8a, 0xf2, 0x0b, 0xe1, 0x76, 0x07, 0x0c, 0x94, - 0x66, 0x00, 0x0b, 0x65, 0x2f, 0x96, 0x1d, 0x93, 0x42, 0x79, 0xdc, 0x4d, - 0xf4, 0x94, 0xea, 0x8a, 0x85, 0xe3, 0xd8, 0x16, 0xc9, 0x08, 0xef, 0x63, - 0xac, 0xac, 0xfe, 0x8e, 0xdb, 0x86, 0x09, 0xad, 0xb9, 0x2e, 0x93, 0x6f, - 0x10, 0x9d, 0xb0, 0xca, 0xdf, 0xdd, 0x9f, 0x2a, 0xfc, 0x32, 0xc3, 0xc0, - 0x46, 0xbc, 0x72, 0xc4, 0x11, 0xf4, 0x11, 0x29, 0x7a, 0xbf, 0x8f, 0x29, - 0x37, 0xc5, 0x98, 0xc2, 0x59, 0x40, 0x78, 0xd4, 0xb2, 0x0e, 0x0a, 0x47, - 0xb5, 0xad, 0xa4, 0x7a, 0x7b, 0x9e, 0x5d, 0x17, 0x80, 0x75, 0x0c, 0x47, - 0x96, 0xa2, 0xc2, 0x6b, 0xb8, 0xb6, 0xcc, 0x15, 0xa5, 0x4a, 0x27, 0xae, - 0xe3, 0x9e, 0xe1, 0xc2, 0xcc, 0x12, 0x66, 0x4e, 0xdd, 0x74, 0x19, 0xd0, - 0x48, 0x70, 0xa7, 0x19, 0x93, 0x12, 0xf9, 0x81, 0xf7, 0x1e, 0xe0, 0x95, - 0x64, 0xc5, 0x92, 0x9d, 0x6b, 0xa2, 0x6f, 0xce, 0x57, 0x24, 0xd8, 0x71, - 0xe5, 0x34, 0xad, 0x8c, 0xc4, 0xa1, 0x30, 0x37, 0xdc, 0x5b, 0xd1, 0xdb, - 0xec, 0x9d, 0x7e, 0x38, 0x18, 0x38, 0xdb, 0x85, 0x78, 0x3c, 0xfd, 0x19, - 0x44, 0x53, 0x2e, 0x2a, 0x6b, 0x18, 0xfb, 0x7a, 0xb5, 0x86, 0x47, 0x46, - 0x5d, 0xa5, 0x44, 0x3f, 0x93, 0x6a, 0x36, 0x63, 0x12, 0x15, 0x94, 0x84, - 0x15, 0xc8, 0x73, 0x63, 0xc4, 0xfc, 0xa4, 0x37, 0x75, 0x56, 0x2d, 0xbf, - 0x95, 0x54, 0x84, 0xb1, 0x3c, 0xb1, 0xa7, 0x2b, 0x01, 0x20, 0xce, 0xab, - 0xe4, 0x79, 0x26, 0x66, 0x84, 0x60, 0xf7, 0x50, 0x81, 0x59, 0x0a, 0x75, - 0x32, 0x68, 0xe5, 0x66, 0x4e, 0xc0, 0x8c, 0xe3, 0x81, 0x1a, 0xd5, 0x34, - 0x0b, 0x2e, 0x37, 0x6d, 0x4d, 0x4b, 0x0e, 0xef, 0xb8, 0x5e, 0x08, 0x25, - 0xea, 0x86, 0x3b, 0x4d, 0xd9, 0x88, 0x6d, 0x1d, 0x93, 0x68, 0x3a, 0x50, - 0xba, 0xf0, 0x2f, 0x24, 0x19, 0x39, 0xcd, 0xe6, 0xcc, 0x78, 0xb7, 0x47, - 0x91, 0x1a, 0x6e, 0xbf, 0x7f, 0x72, 0xa2, 0xe9, 0x04, 0xfa, 0xcb, 0xca, - 0x8b, 0x04, 0xb8, 0x7e, 0x91, 0xc9, 0x9e, 0x0b, 0x63, 0x00, 0xa4, 0xd9, - 0x3a, 0xac, 0x15, 0x91, 0xc5, 0x6a, 0xa4, 0x31, 0x34, 0x89, 0xa3, 0x77, - 0x5d, 0x73, 0x6e, 0x14, 0xbe, 0x10, 0xf6, 0x40, 0x94, 0x4e, 0xd8, 0xad, - 0x5c, 0x64, 0x07, 0x87, 0xd5, 0x73, 0xf2, 0x6b, 0x49, 0x43, 0xae, 0x9d, - 0xca, 0x5e, 0x63, 0x65, 0x1b, 0xeb, 0xc3, 0x84, 0x55, 0x77, 0x72, 0xf8, - 0x68, 0xc6, 0xcb, 0xb2, 0xcf, 0xdf, 0x08, 0x74, 0xf0, 0xa2, 0xd9, 0xfa, - 0x07, 0x2d, 0x07, 0xd6, 0x71, 0x03, 0x22, 0x01, 0x09, 0x34, 0xd8, 0xfd, - 0x21, 0xd8, 0x68, 0x5c, 0x42, 0x16, 0x6a, 0x9f, 0xbe, 0x6e, 0xa5, 0xcc, - 0xa9, 0x49, 0x81, 0x77, 0xd5, 0x46, 0x8d, 0x3d, 0x47, 0x2e, 0x7d, 0x90, - 0x79, 0x5b, 0xab, 0x9c, 0xb2, 0x38, 0x1f, 0x09, 0x48, 0x8a, 0x4c, 0x98, - 0xb0, 0xca, 0xf4, 0x96, 0x92, 0x16, 0x3c, 0x59, 0x7c, 0xf1, 0xe7, 0xc9, - 0x15, 0x97, 0x58, 0x2b, 0xa7, 0xd4, 0xc4, 0x6c, 0x62, 0xb3, 0x46, 0x0b, - 0x48, 0x5f, 0xcb, 0x69, 0x7c, 0xe3, 0x4c, 0xbd, 0x82, 0xe4, 0xb1, 0xce, - 0x37, 0x34, 0xf1, 0x41, 0x58, 0x69, 0xba, 0x9d, 0x99, 0x49, 0x08, 0x16, - 0x67, 0x7c, 0xc0, 0x8a, 0xbb, 0x0a, 0x66, 0x3e, 0x81, 0x06, 0xcb, 0x3a, - 0x34, 0x1e, 0x0a, 0x46, 0x10, 0x96, 0xdf, 0x8e, 0xcd, 0x39, 0x60, 0x63, - 0x4e, 0xe8, 0x92, 0x0a, 0xce, 0xb2, 0x12, 0xe1, 0xa7, 0x73, 0x27, 0x11, - 0x22, 0x32, 0x16, 0xaa, 0xcc, 0x6b, 0xb4, 0xf7, 0x28, 0x60, 0x72, 0x59, - 0x93, 0x28, 0xf5, 0x81, 0x00, 0x9e, 0x50, 0x41, 0x16, 0x67, 0x9e, 0xce, - 0x73, 0x78, 0x1b, 0x72, 0x73, 0xad, 0x25, 0xab, 0xbc, 0x4d, 0x41, 0x43, - 0xcc, 0x67, 0x96, 0x3e, 0xfd, 0x67, 0x8d, 0x5a, 0xd2, 0x66, 0x0c, 0x66, - 0xa9, 0xd6, 0x72, 0xab, 0x7d, 0x73, 0xb3, 0xa8, 0xc9, 0xf7, 0xde, 0x51, - 0x76, 0xc4, 0x3b, 0xc6, 0xb5, 0x91, 0xa8, 0x71, 0x9a, 0xa1, 0x6e, 0xea, - 0x84, 0x93, 0x25, 0x60, 0x84, 0x48, 0x08, 0x43, 0x86, 0x9c, 0x58, 0xcc, - 0xb0, 0xe0, 0xbb, 0x15, 0xe1, 0xad, 0x31, 0x62, 0x6f, 0x24, 0xc1, 0xbb, - 0x7d, 0x26, 0x89, 0xb4, 0xc5, 0xc9, 0x68, 0xe3, 0x4a, 0x49, 0x32, 0xc6, - 0x55, 0xd3, 0x77, 0x18, 0x0a, 0x9c, 0xce, 0x4d, 0x2a, 0x3b, 0xc7, 0x6c, - 0x4b, 0xd9, 0x06, 0xa7, 0x00, 0xc8, 0x5b, 0x05, 0x4d, 0x73, 0x5a, 0x0e, - 0xba, 0x06, 0x00, 0xad, 0x74, 0xa5, 0x38, 0xba, 0xe9, 0x35, 0xa9, 0x6e, - 0xe4, 0x1c, 0x7b, 0x27, 0xec, 0x8d, 0x4c, 0xd7, 0xe9, 0xef, 0x77, 0x3a, - 0xb7, 0xb9, 0xf2, 0x79, 0xec, 0x8b, 0xf7, 0xda, 0x3e, 0x16, 0x6e, 0x22, - 0x82, 0xf4, 0x8d, 0x10, 0x8a, 0x67, 0xa9, 0x81, 0x04, 0x37, 0xd0, 0xa3, - 0x78, 0x71, 0x6a, 0xe1, 0x93, 0x77, 0x5c, 0xb5, 0xf9, 0xdd, 0xf6, 0x64, - 0xab, 0x2e, 0x3f, 0x90, 0x52, 0x56, 0xa9, 0xc3, 0x63, 0xdf, 0xc7, 0xa6, - 0xcb, 0xbf, 0x7a, 0xcd, 0xfa, 0x43, 0x5f, 0x98, 0x3c, 0xcf, 0xb1, 0x5b, - 0x3b, 0x95, 0x8c, 0xec, 0x68, 0x2e, 0xdf, 0xe8, 0x0e, 0x81, 0x64, 0x71, - 0x25, 0x1c, 0x8b, 0x24, 0x0c, 0x0f, 0x87, 0x62, 0xd2, 0xba, 0x02, 0x57, - 0x36, 0x5e, 0xfd, 0x81, 0x5d, 0x68, 0x18, 0x25, 0x91, 0xa1, 0x43, 0xdc, - 0x33, 0xe7, 0x3c, 0xa6, 0x47, 0x51, 0x97, 0xdc, 0x5f, 0x6b, 0x99, 0x7d, - 0x39, 0xb1, 0x9d, 0xb1, 0x78, 0x9b, 0x44, 0xf8, 0x5a, 0xdb, 0x79, 0x96, - 0xde, 0xa2, 0xe0, 0xaf, 0x73, 0x70, 0xae, 0x9d, 0x69, 0x7a, 0xb5, 0x77, - 0xc5, 0xc6, 0x9e, 0x28, 0xda, 0x79, 0x7b, 0x75, 0x15, 0x4c, 0x0d, 0x8f, - 0xff, 0xcd, 0x1f, 0x36, 0xe2, 0x9d, 0x81, 0xcc, 0x81, 0x7a, 0x1a, 0x8b, - 0x20, 0xa5, 0xd8, 0xc4, 0x48, 0x48, 0x8c, 0x1b, 0x7a, 0x7f, 0x23, 0x71, - 0x03, 0xa5, 0x34, 0x8e, 0xe1, 0x2b, 0xd7, 0x4e, 0xbe, 0x61, 0xe5, 0x3f, - 0xc8, 0x54, 0xa3, 0x93, 0x10, 0x35, 0x49, 0x88, 0xe5, 0xdc, 0x5a, 0xfb, - 0x1b, 0xb0, 0xb5, 0x15, 0x31, 0x3d, 0x81, 0x00, 0xc2, 0x69, 0xe1, 0x1d, - 0x39, 0xff, 0x38, 0x7f, 0x41, 0xd0, 0x30, 0xd2, 0x64, 0xf0, 0x78, 0xf8, - 0x42, 0xbe, 0x87, 0x6e, 0x6f, 0xff, 0x45, 0x32, 0xa3, 0x7a, 0x5e, 0x01, - 0x04, 0xa2, 0xba, 0x47, 0xa9, 0x59, 0x81, 0x83, 0x27, 0x4d, 0xc2, 0x49, - 0xca, 0x95, 0x30, 0x7b, 0x23, 0x5c, 0xf8, 0x0e, 0xea, 0x7b, 0x9a, 0x37, - 0x33, 0xb9, 0x61, 0xbb, 0xf3, 0xd6, 0xc6, 0x34, 0xba, 0xf7, 0xe4, 0x03, - 0xf4, 0x27, 0x4d, 0x20, 0x7e, 0xce, 0x03, 0x21, 0x79, 0xe2, 0x80, 0x38, - 0xdd, 0x94, 0x32, 0x07, 0x32, 0x56, 0x29, 0xea, 0x50, 0x1e, 0x57, 0xa9, - 0x8e, 0xef, 0x1d, 0xdd, 0x37, 0x0e, 0x80, 0x25, 0x56, 0x26, 0x73, 0xf5, - 0x27, 0x7c, 0xd6, 0x2c, 0x62, 0xc2, 0xb1, 0xce, 0x8a, 0x7b, 0x86, 0xc0, - 0xce, 0x7d, 0xd1, 0x1f, 0xc6, 0x89, 0x36, 0xe4, 0xcc, 0xc8, 0x75, 0xbb, - 0x00, 0x1c, 0xbc, 0x08, 0xff, 0x82, 0x3d, 0xf5, 0x13, 0xac, 0x14, 0xa9, - 0xeb, 0xc2, 0x9e, 0xf4, 0x47, 0x61, 0xad, 0x6b, 0xff, 0x2a, 0xa4, 0xa5, - 0xe7, 0xce, 0x31, 0xb9, 0xcb, 0x08, 0x67, 0xb4, 0xaf, 0x2d, 0xfe, 0x33, - 0x41, 0x35, 0x9d, 0x66, 0x77, 0x72, 0x4b, 0xe3, 0xb0, 0xb0, 0xf1, 0xb6, - 0x8c, 0xa1, 0xa7, 0x36, 0x00, 0x06, 0xff, 0x2c, 0xf8, 0xb0, 0xd4, 0xc5, - 0x23, 0x14, 0xc0, 0x8a, 0xd8, 0x23, 0x5a, 0x24, 0xc3, 0xa8, 0x42, 0x29, - 0xb0, 0x38, 0xe3, 0x41, 0xf6, 0xdb, 0x4d, 0x2b, 0xf7, 0x24, 0xe0, 0x2f, - 0x9a, 0xd3, 0xe3, 0xd4, 0xbd, 0xa7, 0x57, 0x61, 0xaf, 0xf5, 0x17, 0xb6, - 0x61, 0xba, 0x51, 0xec, 0x93, 0xbb, 0x76, 0xac, 0x73, 0x59, 0x28, 0xae, - 0x52, 0xd3, 0xde, 0x16, 0xeb, 0x59, 0x31, 0xa9, 0xb9, 0xbb, 0x38, 0xde, - 0x6d, 0xe0, 0xe1, 0x49, 0x23, 0x2a, 0x10, 0x54, 0x18, 0xe6, 0xa6, 0xe4, - 0x06, 0xd4, 0xac, 0x88, 0x4f, 0x87, 0xe6, 0xe0, 0x1c, 0x26, 0x51, 0xee, - 0x9a, 0x52, 0x61, 0x3d, 0x5e, 0xfb, 0xe2, 0x32, 0xfc, 0xf1, 0xc2, 0x1b, - 0xb1, 0x35, 0x7a, 0x0d, 0xdb, 0xb8, 0x34, 0xbf, 0x0e, 0xd7, 0x4d, 0xf0, - 0x2e, 0xa6, 0xc5, 0xa6, 0xd1, 0xb1, 0x70, 0xd8, 0x72, 0x5c, 0x33, 0x73, - 0xf9, 0x33, 0x51, 0xfe, 0xc4, 0x1f, 0x78, 0x42, 0xa1, 0xae, 0x7b, 0xa8, - 0x7b, 0xbd, 0x22, 0xcd, 0x4b, 0xf6, 0xd1, 0x28, 0x90, 0x70, 0x09, 0x99, - 0xf2, 0xe8, 0x17, 0xd4, 0x97, 0xbc, 0xa7, 0x5f, 0x21, 0xd8, 0x90, 0xd4, - 0x4d, 0x5e, 0x92, 0x57, 0x8b, 0x18, 0x2f, 0xd2, 0xb5, 0x46, 0x88, 0xbb, - 0x19, 0xa2, 0xad, 0xcf, 0x92, 0x74, 0x86, 0x2c, 0x06, 0x93, 0xbf, 0x40, - 0x63, 0x7e, 0xc3, 0xf7, 0x3b, 0xf1, 0x74, 0x9a, 0xe5, 0xff, 0x95, 0x7f, - 0x86, 0x32, 0xbd, 0x4e, 0xf4, 0x87, 0x61, 0x9a, 0xce, 0x25, 0x68, 0x5d, - 0xb3, 0xf3, 0xae, 0xb3, 0x51, 0x4a, 0x91, 0x49, 0x4b, 0xef, 0xca, 0x98, - 0xb0, 0x7e, 0xbe, 0xdb, 0x61, 0x09, 0xec, 0x55, 0x32, 0xca, 0x73, 0xad, - 0x87, 0xad, 0x16, 0x40, 0xd7, 0x48, 0x9a, 0x72, 0xc2, 0x51, 0x9d, 0xa3, - 0x2a, 0xf4, 0xdd, 0x37, 0xad, 0x5e, 0xb1, 0x65, 0x5b, 0x34, 0xf1, 0x33, - 0xaf, 0xde, 0xe4, 0xad, 0x3b, 0x65, 0x56, 0x57, 0x1e, 0xa8, 0x68, 0xf8, - 0x30, 0x1e, 0x1b, 0x96, 0x80, 0x27, 0x9c, 0x92, 0x19, 0x78, 0x4a, 0x4a, - 0x07, 0x5e, 0x40, 0x9c, 0xac, 0x7b, 0xb0, 0x6b, 0xc4, 0x4e, 0x2a, 0x83, - 0x27, 0x63, 0xeb, 0xfe, 0x72, 0x16, 0xf5, 0x7e, 0x49, 0xec, 0x27, 0x7c, - 0xfc, 0xda, 0xa8, 0x7d, 0x7f, 0xd0, 0x6f, 0xfb, 0xa1, 0xec, 0x2b, 0xd7, - 0xdb, 0xdc, 0x15, 0x3d, 0x4f, 0x53, 0x9d, 0x9a, 0xd9, 0x8c, 0x1a, 0x1a, - 0x55, 0x59, 0xbd, 0xfd, 0x16, 0x0c, 0xe5, 0x88, 0xa4, 0x25, 0xa3, 0x84, - 0x97, 0xb4, 0x1b, 0x0a, 0x5d, 0xe9, 0x00, 0x50, 0x57, 0xad, 0xab, 0x6a, - 0xce, 0xf3, 0x5f, 0xa6, 0x2f, 0x91, 0xf4, 0x3c, 0x6a, 0xab, 0x6b, 0xc3, - 0x85, 0xd2, 0x02, 0xf0, 0x05, 0x5f, 0xed, 0x34, 0x7f, 0xbe, 0xff, 0x4e, - 0x13, 0x7b, 0x6d, 0x04, 0xda, 0xc7, 0x25, 0x3a, 0x07, 0x34, 0x9b, 0xab, - 0x9d, 0x9d, 0x0c, 0x38, 0xf4, 0x88, 0xe6, 0x00, 0xb4, 0xdb, 0xf5, 0x3d, - 0x3e, 0x71, 0xd7, 0x1d, 0x47, 0x03, 0x6f, 0x88, 0xc4, 0x25, 0xa9, 0xed, - 0xb7, 0xd6, 0xec, 0xcd, 0xc4, 0x6e, 0x5d, 0xa3, 0x66, 0x3f, 0xab, 0xa0, - 0x72, 0x15, 0x4a, 0xfc, 0x1c, 0xe9, 0xae, 0xb8, 0x7f, 0xbb, 0x5d, 0xef, - 0x6e, 0x2e, 0x94, 0x47, 0xf0, 0x9f, 0xcf, 0x08, 0x70, 0x7f, 0xb3, 0xb0, - 0x8a, 0xd4, 0xcb, 0xb9, 0x37, 0x3e, 0xe7, 0x73, 0x05, 0x15, 0x57, 0x17, - 0xe5, 0xad, 0x0c, 0x79, 0x65, 0xf9, 0x41, 0xdd, 0xd5, 0x31, 0xe0, 0x1b, - 0x54, 0x96, 0xba, 0x36, 0xf1, 0x9b, 0xee, 0xb7, 0xeb, 0x87, 0x0d, 0xcc, - 0x1d, 0x70, 0xa1, 0xd0, 0x6d, 0x25, 0xae, 0x49, 0x71, 0x3e, 0x1a, 0x07, - 0xf3, 0xf3, 0x00, 0x15, 0xa9, 0xe1, 0x78, 0xe6, 0xa5, 0x75, 0xe1, 0xf3, - 0xdd, 0x82, 0xea, 0xc4, 0x8c, 0x33, 0x5b, 0x3c, 0x4a, 0x9d, 0x6f, 0x80, - 0xec, 0xb5, 0xf2, 0x74, 0x0b, 0x39, 0x9d, 0x99, 0xec, 0x77, 0x8e, 0x7a, - 0x5c, 0x9e, 0x48, 0x51, 0x92, 0xa0, 0x90, 0x3e, 0xc6, 0xd8, 0xef, 0xa2, - 0xea, 0x2f, 0x5a, 0xb8, 0xa5, 0x2e, 0xe7, 0x59, 0x2d, 0x56, 0x3e, 0x0d, - 0x39, 0x20, 0x8f, 0x1b, 0xa7, 0x81, 0xfe, 0x89, 0x3e, 0x12, 0x04, 0xb5, - 0x12, 0xc8, 0xb4, 0x74, 0x7b, 0x3c, 0x2d, 0x34, 0x2e, 0x7d, 0xcd, 0x69, - 0x4e, 0x3b, 0xdf, 0xda, 0x75, 0x93, 0x2e, 0x27, 0x4d, 0x11, 0xe2, 0xe3, - 0x12, 0x96, 0xa2, 0x8a, 0x1f, 0x99, 0x89, 0x40, 0x5f, 0xa0, 0xe5, 0x9f, - 0x00, 0xc3, 0x52, 0xa1, 0x75, 0x52, 0xe5, 0x1c, 0x18, 0xf3, 0x29, 0xfe, - 0xd4, 0xe0, 0xbc, 0x6c, 0x8a, 0xda, 0x44, 0xe7, 0x73, 0xc9, 0x57, 0xec, - 0xc2, 0x6b, 0x45, 0xd9, 0xcd, 0xcb, 0x93, 0xca, 0x0a, 0x25, 0x33, 0xc7, - 0xa0, 0x42, 0xb0, 0x37, 0xac, 0xf3, 0xce, 0x7f, 0x42, 0x39, 0x95, 0x10, - 0x7f, 0xe8, 0x49, 0xdc, 0xdc, 0x43, 0x2a, 0x94, 0x95, 0xf6, 0x1a, 0x4a, - 0xa7, 0xd6, 0x51, 0x5f, 0xaf, 0x49, 0x98, 0x80, 0x76, 0xfe, 0x9b, 0x26, - 0xe8, 0x00, 0xac, 0xe6, 0xd8, 0x18, 0xe0, 0xd5, 0xd0, 0xbb, 0x11, 0x4c, - 0xb0, 0x69, 0x3d, 0x36, 0x93, 0xa8, 0x67, 0x16, 0x33, 0xf8, 0xf7, 0xc7, - 0x13, 0xfe, 0x72, 0x9f, 0xe5, 0xd8, 0x5c, 0x7d, 0x4d, 0xbf, 0xd2, 0x36, - 0xcf, 0x38, 0xbd, 0x45, 0xd4, 0x94, 0xea, 0x21, 0xab, 0x76, 0xc5, 0x09, - 0x59, 0x8b, 0x9e, 0xa8, 0x94, 0x2e, 0x97, 0xa4, 0x9f, 0xc0, 0x3e, 0x7f, - 0x49, 0xf9, 0x8c, 0x23, 0xd6, 0xa6, 0xc5, 0xef, 0x77, 0x9a, 0xaf, 0xb6, - 0x06, 0x20, 0x54, 0x3e, 0x92, 0xbe, 0x50, 0x6b, 0xc5, 0x32, 0xe4, 0x30, - 0x0f, 0xea, 0xcf, 0xde, 0x13, 0x2f, 0xd4, 0xda, 0x17, 0xfe, 0xfb, 0xc8, - 0x92, 0x56, 0x5a, 0xff, 0x97, 0xaf, 0x2f, 0x6e, 0xa9, 0xfc, 0x26, 0xfc, - 0x94, 0x9f, 0x5b, 0x5c, 0x26, 0x1e, 0xea, 0xaa, 0x24, 0xfa, 0xd7, 0xa4, - 0x3c, 0xf9, 0xba, 0x18, 0x2e, 0x52, 0x58, 0x72, 0x8d, 0x39, 0xfe, 0x89, - 0x69, 0xa2, 0xba, 0xe5, 0x1f, 0xec, 0x82, 0xc4, 0x0f, 0x12, 0xdf, 0xfe, - 0x9d, 0x71, 0xe4, 0xf2, 0xd0, 0x53, 0x27, 0x69, 0xc1, 0xc9, 0x08, 0xf1, - 0x08, 0x05, 0x16, 0x51, 0x09, 0xd9, 0x50, 0x3c, 0x45, 0x5b, 0xc2, 0x41, - 0x36, 0xbf, 0xd9, 0xb5, 0x13, 0xe8, 0x9c, 0x3f, 0xde, 0x79, 0xfa, 0x73, - 0xd3, 0x95, 0x9d, 0x83, 0x75, 0xf3, 0xba, 0x16, 0xf2, 0x73, 0xf1, 0x1e, - 0xe5, 0x41, 0x95, 0xe9, 0xc7, 0x02, 0x61, 0xcb, 0x02, 0x6d, 0xe4, 0xa6, - 0x82, 0xf6, 0x06, 0x12, 0xa3, 0x85, 0x38, 0x9f, 0x30, 0xeb, 0x33, 0xdb, - 0xfa, 0x0e, 0xbd, 0xb0, 0xf9, 0x26, 0x38, 0x97, 0x90, 0xc3, 0x9a, 0x25, - 0xd7, 0x4a, 0x7c, 0xde, 0xaf, 0x3f, 0x9a, 0x88, 0x5f, 0x4b, 0x31, 0x88, - 0xe3, 0x23, 0xd8, 0xc7, 0xc4, 0xd7, 0x15, 0x6d, 0x48, 0x2a, 0x94, 0x94, - 0xec, 0x71, 0x9b, 0x0e, 0x31, 0xd4, 0x23, 0xe4, 0x4b, 0x9d, 0x15, 0x2d, - 0x51, 0xdc, 0x3e, 0x37, 0xc9, 0xb0, 0x54, 0x8f, 0x58, 0x7f, 0x34, 0x77, - 0x83, 0x67, 0xd9, 0x8d, 0x1c, 0x00, 0xeb, 0x4e, 0x61, 0xad, 0x26, 0x6e, - 0x53, 0x8f, 0xc6, 0x10, 0x25, 0x81, 0x16, 0x60, 0x32, 0xa6, 0x61, 0x2f, - 0xcd, 0xc3, 0xc8, 0x26, 0x98, 0x62, 0xf4, 0xbd, 0xc3, 0x0e, 0x21, 0x90, - 0x43, 0x97, 0xb2, 0x52, 0x07, 0xaf, 0x7d, 0x3e, 0xcd, 0xed, 0x5a, 0x01, - 0xc0, 0x1c, 0x5b, 0xb3, 0x07, 0x6e, 0x48, 0xa6, 0xb5, 0x8a, 0x8b, 0x41, - 0xf3, 0x5d, 0xa3, 0x0d, 0xde, 0x4f, 0xc6, 0x8c, 0x73, 0xab, 0x61, 0x0c, - 0x15, 0xd4, 0xac, 0x09, 0x32, 0x2f, 0xe0, 0xcf, 0xf3, 0xa4, 0x28, 0x3b, - 0xad, 0x33, 0xef, 0x9e, 0x17, 0x3b, 0x18, 0x15, 0xd4, 0xb1, 0x87, 0xb5, - 0x7e, 0x99, 0x9e, 0x1e, 0x13, 0xaf, 0x92, 0xc7, 0x42, 0xa9, 0x7f, 0xd0, - 0xc0, 0x55, 0xb3, 0xa3, 0x21, 0x05, 0xad, 0xb0, 0x48, 0xdc, 0x88, 0x47, - 0xa0, 0xcf, 0x83, 0x22, 0x8d, 0xaa, 0x05, 0xf8, 0xca, 0x1f, 0x7c, 0x5a, - 0xfb, 0x23, 0x51, 0xe1, 0xae, 0x3b, 0x28, 0x57, 0xb0, 0x6d, 0x7b, 0xc0, - 0x53, 0xf5, 0x99, 0xf7, 0x95, 0x00, 0xc2, 0xdd, 0x7e, 0x20, 0xd5, 0x0a, - 0x08, 0x88, 0xc7, 0xe2, 0x00, 0x38, 0x72, 0x04, 0x9b, 0xab, 0x13, 0xc3, - 0xfc, 0xd5, 0xef, 0x2a, 0x66, 0x69, 0x81, 0x0e, 0x4d, 0xdb, 0x4b, 0x7c, - 0x7a, 0x29, 0x9d, 0x43, 0x99, 0x1b, 0x92, 0xb2, 0xcb, 0xb6, 0xc2, 0x57, - 0x21, 0x63, 0x18, 0x37, 0x44, 0xbc, 0x21, 0x2b, 0x1e, 0x48, 0xea, 0x17, - 0x7c, 0xdc, 0xce, 0x8e, 0x2c, 0x5c, 0x3a, 0x45, 0x5b, 0x60, 0xe6, 0x49, - 0x75, 0x94, 0x5f, 0x95, 0xec, 0xf6, 0x67, 0xea, 0x31, 0xe5, 0x01, 0xb2, - 0xf0, 0xda, 0x5e, 0xfe, 0xbf, 0xd1, 0xd8, 0x15, 0xe9, 0x81, 0x4c, 0xc3, - 0x2d, 0x12, 0x3f, 0x4a, 0x14, 0xfb, 0xc1, 0xa7, 0xf4, 0x1f, 0x08, 0xdf, - 0x6a, 0x7c, 0xe7, 0x05, 0xc6, 0xb5, 0x74, 0x27, 0x12, 0x43, 0x53, 0xe1, - 0xe4, 0x7f, 0x9b, 0x71, 0x5e, 0x8f, 0xde, 0xaf, 0x04, 0xa6, 0x08, 0x88, - 0x40, 0x00, 0xad, 0x33, 0xdd, 0xfd, 0x32, 0xf4, 0xd2, 0x0a, 0xed, 0x8f, - 0x7b, 0x16, 0x5b, 0xa7, 0x7d, 0xa9, 0x77, 0x6e, 0xdc, 0x89, 0x18, 0x51, - 0x53, 0x00, 0x0c, 0xe3, 0x8e, 0xbc, 0x3a, 0xee, 0x1b, 0xf4, 0xda, 0x4c, - 0xe0, 0x5e, 0x83, 0x26, 0x23, 0xa6, 0x8c, 0x57, 0x47, 0x2f, 0xad, 0x23, - 0x78, 0x42, 0xa2, 0xc9, 0x2b, 0xd5, 0x27, 0xc4, 0x45, 0xb0, 0x05, 0xa3, - 0xbd, 0xd5, 0xf2, 0x10, 0x76, 0x4a, 0x57, 0xc0, 0xab, 0x81, 0x5c, 0xef, - 0x98, 0xd6, 0x1a, 0xdf, 0x24, 0xd3, 0x8c, 0x20, 0xd6, 0x36, 0xcb, 0x34, - 0x01, 0x3b, 0x62, 0x9d, 0x3e, 0xc7, 0x78, 0xcd, 0x88, 0x80, 0x6d, 0xd7, - 0x8a, 0x3f, 0x05, 0x3c, 0xbb, 0x7a, 0xd3, 0xb0, 0x73, 0x1b, 0x7e, 0xdf, - 0xc0, 0x6d, 0x59, 0x65, 0x75, 0x9d, 0x65, 0x4f, 0x2e, 0xb3, 0x3e, 0x91, - 0x08, 0x8d, 0xf0, 0x75, 0x22, 0x64, 0x74, 0xc4, 0x12, 0x61, 0x63, 0x60, - 0x72, 0xbf, 0xda, 0xe4, 0x54, 0xfb, 0x5a, 0xe3, 0x63, 0x44, 0xca, 0x14, - 0x10, 0x13, 0xc7, 0x83, 0x30, 0x25, 0xdd, 0xee, 0xaf, 0x34, 0x49, 0xe0, - 0x23, 0x72, 0xf3, 0xeb, 0x1b, 0x73, 0xd1, 0x7d, 0x86, 0xf8, 0x3b, 0x78, - 0x11, 0xfa, 0x0a, 0xc0, 0xd7, 0xa2, 0x2c, 0xca, 0xcd, 0xd8, 0x30, 0x3d, - 0xcc, 0x37, 0x4d, 0x6e, 0xc8, 0xaf, 0xbd, 0x8d, 0x25, 0x9b, 0xae, 0xa5, - 0x88, 0x25, 0x4e, 0x02, 0xd9, 0xcc, 0x66, 0x8e, 0x95, 0xc6, 0x75, 0x82, - 0x32, 0xe0, 0x88, 0xaf, 0xeb, 0x40, 0x26, 0xdb, 0x67, 0x6b, 0x10, 0xb9, - 0x36, 0xf1, 0x66, 0xbc, 0x9a, 0xd0, 0x9f, 0xe5, 0x5e, 0xbe, 0x80, 0x6a, - 0x72, 0x16, 0x9e, 0x16, 0x07, 0x7c, 0xe6, 0xe7, 0xe4, 0x82, 0xa6, 0x80, - 0xa2, 0x5f, 0x8a, 0x9a, 0xb0, 0xa7, 0x88, 0x5f, 0x30, 0x9e, 0xe9, 0xbc, - 0xaa, 0x71, 0x56, 0x83, 0x85, 0x44, 0x55, 0x33, 0xc2, 0x17, 0xb8, 0x96, - 0x39, 0x33, 0x8e, 0xe2, 0x8e, 0x82, 0x19, 0x4c, 0xdc, 0xdb, 0x20, 0xe0, - 0x05, 0x3f, 0x9f, 0x5d, 0x1c, 0x82, 0xf4, 0x60, 0x50, 0x80, 0xb2, 0xe1, - 0x29, 0xb6, 0x8b, 0xc8, 0x28, 0x1c, 0x1a, 0x58, 0xd0, 0x83, 0x2b, 0x04, - 0x86, 0x31, 0x90, 0x12, 0x40, 0x6a, 0x38, 0x57, 0x5d, 0x51, 0x42, 0x31, - 0x64, 0xe5, 0x8a, 0x3e, 0xc8, 0xcf, 0xd1, 0x1b, 0x53, 0x6a, 0x49, 0xad, - 0x9f, 0x09, 0x28, 0x3d, 0x8f, 0x6a, 0xa7, 0x26, 0x8f, 0x35, 0xba, 0x79, - 0x28, 0xb4, 0x49, 0xc7, 0x67, 0x6a, 0xc6, 0xe3, 0x39, 0x59, 0xda, 0x35, - 0x9f, 0xd2, 0xf2, 0xe5, 0x16, 0xb0, 0x35, 0x01, 0xcb, 0xd0, 0x27, 0x33, - 0x46, 0x8c, 0x3f, 0xc9, 0x49, 0x03, 0x0e, 0x6c, 0x57, 0xc0, 0x05, 0x4c, - 0xfd, 0x80, 0x60, 0x23, 0xa2, 0x5e, 0x0f, 0xa1, 0xf4, 0x99, 0x4c, 0x1a, - 0xaa, 0x82, 0xb6, 0x22, 0xc7, 0x4a, 0xce, 0x10, 0x48, 0x49, 0x8f, 0xda, - 0xd1, 0xfc, 0xf3, 0x03, 0x30, 0x6e, 0x7e, 0x5b, 0xc9, 0xa5, 0x0b, 0x47, - 0x4f, 0xd8, 0xc2, 0xe0, 0xe0, 0x93, 0xbc, 0xd8, 0x4d, 0x83, 0x2b, 0xa8, - 0x1c, 0xee, 0x6b, 0x7c, 0x65, 0xc6, 0xda, 0xff, 0xc8, 0xf2, 0xec, 0x64, - 0x3a, 0x03, 0x10, 0x84, 0x15, 0xf0, 0xd6, 0x97, 0x3c, 0x6a, 0xe3, 0x33, - 0x29, 0x63, 0x64, 0x3d, 0xf6, 0xa4, 0x45, 0x84, 0x15, 0xcc, 0x63, 0x60, - 0xe2, 0xb0, 0xa3, 0x1d, 0x91, 0xdd, 0x1e, 0x1b, 0xab, 0x5f, 0x57, 0x8f, - 0x33, 0x5c, 0x3c, 0x55, 0x48, 0xd1, 0x91, 0x23, 0x46, 0x95, 0xbb, 0x0e, - 0x05, 0x3e, 0x5d, 0x8d, 0xbc, 0x5e, 0xd3, 0x33, 0x5a, 0x30, 0xa8, 0xfc, - 0x65, 0x12, 0x0e, 0xcb, 0x56, 0x90, 0xf3, 0xd0, 0xb2, 0x50, 0x59, 0xf6, - 0x56, 0x07, 0xc0, 0x14, 0x61, 0x01, 0x70, 0x8d, 0x2f, 0x54, 0x43, 0xab, - 0xc9, 0x3b, 0xa9, 0x2a, 0x59, 0x42, 0x4c, 0x69, 0x68, 0xdd, 0x7a, 0x2a, - 0x86, 0xca, 0xae, 0x7b, 0x8e, 0xe8, 0xa8, 0x1f, 0xa2, 0xc8, 0x87, 0x05, - 0xe9, 0xe3, 0xa8, 0xd3, 0x6d, 0xe6, 0x72, 0x89, 0x7d, 0x13, 0x1b, 0x92, - 0xa1, 0x25, 0x60, 0x0d, 0xb5, 0x1d, 0x73, 0x69, 0x7c, 0xde, 0x21, 0x00, - 0xe9, 0x21, 0xe3, 0xa5, 0xa9, 0x91, 0x07, 0x1d, 0xe9, 0xdd, 0x24, 0xd2, - 0x70, 0xad, 0x5f, 0xf1, 0xc1, 0xbc, 0x27, 0xfe, 0x59, 0x8c, 0x61, 0xaa, - 0xa1, 0xe7, 0x96, 0xb3, 0xbe, 0x10, 0x72, 0x86, 0xad, 0xe8, 0x07, 0x93, - 0x14, 0x11, 0xe8, 0xd9, 0xf7, 0x39, 0xdf, 0x46, 0x23, 0x64, 0xb9, 0x1c, - 0x81, 0x49, 0x31, 0x6b, 0x82, 0x42, 0x5d, 0x9e, 0x4f, 0xd0, 0x84, 0x27, - 0x8d, 0x06, 0x5a, 0x9e, 0xcc, 0x02, 0x52, 0xed, 0x28, 0xb1, 0xbc, 0xa2, - 0x70, 0xd5, 0x87, 0xd4, 0xa5, 0xb8, 0x83, 0xda, 0xf5, 0xcb, 0x4a, 0xc5, - 0x9e, 0xa4, 0xef, 0x1b, 0x24, 0xdc, 0x98, 0x9f, 0x03, 0xc2, 0x84, 0x72, - 0x9a, 0x95, 0x06, 0xc2, 0x3b, 0x83, 0xda, 0x21, 0x6b, 0xba, 0xf5, 0x68, - 0xac, 0x31, 0xa6, 0x37, 0xf8, 0xd8, 0x2c, 0xbc, 0x04, 0x99, 0x9c, 0x3e, - 0x4c, 0x08, 0xc7, 0xfb, 0x96, 0xba, 0xab, 0x6c, 0x68, 0xc7, 0x17, 0x0b, - 0x19, 0xa0, 0x8c, 0xca, 0xa4, 0x15, 0x01, 0x4f, 0x84, 0xa9, 0x7a, 0x01, - 0x1c, 0xde, 0xf1, 0x3f, 0xf9, 0xe8, 0x3d, 0x9d, 0x92, 0x5c, 0x52, 0x4f, - 0xf9, 0x9a, 0x2e, 0x14, 0xe0, 0xc4, 0xde, 0x08, 0x5c, 0x08, 0x63, 0xa5, - 0x3d, 0x9f, 0x26, 0xa2, 0x5e, 0x0b, 0xec, 0xeb, 0x67, 0x77, 0x8c, 0xa3, - 0x8e, 0xb2, 0x66, 0xdf, 0xa7, 0x42, 0xcd, 0x31, 0x0c, 0xa9, 0x0c, 0xcb, - 0x62, 0x34, 0x17, 0x76, 0x0a, 0x85, 0x3c, 0x73, 0x22, 0xce, 0x50, 0xe6, - 0x97, 0x60, 0x65, 0xe4, 0x72, 0x00, 0xb1, 0x85, 0x48, 0xae, 0xa5, 0x12, - 0x4b, 0xab, 0x0e, 0x10, 0x69, 0x68, 0xf2, 0x51, 0x64, 0x69, 0x14, 0x0f, - 0x56, 0xc5, 0xe1, 0xfa, 0x87, 0xc7, 0xbc, 0xd9, 0x68, 0x2c, 0x28, 0xb0, - 0x20, 0xef, 0x38, 0x3c, 0x5e, 0xf1, 0x47, 0x9e, 0x4a, 0xc2, 0xd6, 0x33, - 0x6b, 0xe6, 0x67, 0xfa, 0x04, 0x01, 0x37, 0xdd, 0x41, 0x1a, 0xd6, 0x10, - 0xb9, 0xee, 0xb9, 0x6d, 0xc0, 0x86, 0x4b, 0xe3, 0xff, 0xd2, 0x2d, 0x38, - 0xb9, 0xd9, 0x1b, 0x05, 0xca, 0x3c, 0x16, 0x8a, 0xc4, 0x3d, 0xc3, 0x62, - 0xc5, 0xdd, 0x64, 0x15, 0x18, 0xa9, 0xc3, 0xe4, 0x8d, 0xf3, 0x7f, 0x92, - 0xf7, 0xdf, 0x26, 0xe2, 0xcc, 0xd0, 0xf8, 0x5b, 0x52, 0xb1, 0xf1, 0x12, - 0xec, 0x08, 0x84, 0xb6, 0x2f, 0xe4, 0xef, 0x55, 0x8c, 0xd0, 0x92, 0x9a, - 0x16, 0x26, 0x01, 0x44, 0x66, 0xdc, 0x3d, 0x94, 0xea, 0xb4, 0x61, 0x30, - 0xfd, 0x0b, 0xaa, 0x0e, 0xd4, 0xef, 0x85, 0xae, 0xc7, 0xbd, 0xcc, 0x6f, - 0x93, 0xcb, 0xa2, 0x75, 0xf3, 0xa7, 0x32, 0x41, 0xda, 0xd3, 0x2e, 0x38, - 0x8b, 0x9e, 0xc5, 0x68, 0xe8, 0x4d, 0x35, 0x04, 0xb2, 0xd9, 0x51, 0x40, - 0x4f, 0xd8, 0x77, 0xb5, 0x7b, 0xc2, 0x23, 0x18, 0x66, 0x1b, 0xed, 0xfb, - 0x1c, 0x19, 0xae, 0xb8, 0xa4, 0xa4, 0x78, 0xa7, 0x09, 0xc7, 0x70, 0x1a, - 0x63, 0xc6, 0xeb, 0x77, 0x13, 0x93, 0x9a, 0x6a, 0x1a, 0x9e, 0x1f, 0x53, - 0x01, 0x35, 0xa7, 0x5d, 0x8a, 0x1d, 0x25, 0xc7, 0x04, 0x2f, 0x6c, 0x2b, - 0xd4, 0xab, 0x59, 0x20, 0x5f, 0x73, 0x2a, 0xb7, 0x61, 0x1f, 0xdf, 0x73, - 0x9f, 0xcc, 0x22, 0x5f, 0x9a, 0x12, 0xbe, 0xdb, 0x53, 0x37, 0xdf, 0xe1, - 0xf9, 0x30, 0x1b, 0xb3, 0xea, 0x42, 0x9d, 0xe6, 0xac, 0xca, 0x8d, 0xbe, - 0x1d, 0xd1, 0x7a, 0x2f, 0x40, 0x4d, 0xd2, 0xb6, 0x36, 0x0d, 0xac, 0xf2, - 0x6b, 0xfa, 0xc5, 0x17, 0xa0, 0x42, 0xe4, 0x3a, 0x31, 0x54, 0x31, 0xca, - 0x7f, 0x89, 0xc8, 0x33, 0x9f, 0xc3, 0xbf, 0x53, 0x10, 0xb9, 0x02, 0xc3, - 0x17, 0x40, 0x46, 0x7a, 0x53, 0x36, 0xfa, 0x83, 0x5f, 0xb0, 0x97, 0xbe, - 0x10, 0xba, 0x31, 0xd1, 0x89, 0xf7, 0x72, 0x99, 0xf5, 0x39, 0x55, 0xcb, - 0x54, 0x64, 0x66, 0xfb, 0xa4, 0xe5, 0x20, 0x87, 0xf6, 0xaf, 0x67, 0x87, - 0xb5, 0x0d, 0xe4, 0x3e, 0x22, 0xe1, 0x45, 0x6a, 0x4e, 0xda, 0x95, 0x6e, - 0x10, 0xcf, 0xb2, 0x32, 0xfa, 0x52, 0x3a, 0x81, 0xd0, 0xe5, 0xf7, 0xd0, - 0xe3, 0xc3, 0x9e, 0x40, 0xcf, 0x07, 0x69, 0x25, 0x78, 0x81, 0x04, 0xca, - 0x86, 0xc0, 0x9b, 0x73, 0x3a, 0xbe, 0x1f, 0x65, 0x6a, 0xc7, 0xa3, 0xa4, - 0xac, 0xe5, 0xd7, 0x79, 0x51, 0xe4, 0x72, 0xda, 0x14, 0x6a, 0x5b, 0xda, - 0x16, 0xb5, 0xa0, 0xc1, 0xe6, 0x42, 0x03, 0xa2, 0x76, 0x20, 0x45, 0x94, - 0x84, 0xa6, 0x9a, 0x9c, 0xd8, 0x54, 0xe7, 0x57, 0xfe, 0x3c, 0x6e, 0xe0, - 0x44, 0x5c, 0x1e, 0xfd, 0x57, 0xd4, 0xd2, 0x37, 0x46, 0xc0, 0xa6, 0xa3, - 0x66, 0x5a, 0x72, 0x8d, 0x6e, 0xd9, 0xaa, 0x0f, 0x0b, 0x4e, 0xc5, 0xb9, - 0xac, 0x10, 0xa7, 0x60, 0x87, 0x5f, 0xab, 0xa8, 0x87, 0xb4, 0xb7, 0x4c, - 0x99, 0x9d, 0x90, 0xa1, 0xf0, 0x14, 0x67, 0x53, 0x6c, 0x9c, 0x62, 0xdb, - 0x40, 0x26, 0xc9, 0xbe, 0xed, 0xb2, 0xc4, 0xfc, 0xba, 0xd1, 0xce, 0xb4, - 0x4e, 0x9c, 0x6d, 0xd2, 0xe3, 0xc0, 0xcd, 0x0b, 0x0d, 0x43, 0x3f, 0x11, - 0x7b, 0x3d, 0x6b, 0xae, 0x55, 0x8e, 0x8a, 0x3d, 0xa4, 0xdb, 0x39, 0x86, - 0xcb, 0x0e, 0x0e, 0xe9, 0xdc, 0xb9, 0x33, 0x0e, 0x23, 0xd6, 0xc3, 0x7b, - 0x49, 0x09, 0x71, 0x2f, 0x09, 0xd8, 0xc4, 0xf6, 0x04, 0x35, 0xc4, 0x5b, - 0x84, 0xfe, 0x11, 0xf2, 0x74, 0x78, 0x3c, 0xb5, 0x63, 0x7b, 0xb3, 0x81, - 0x34, 0xb2, 0x80, 0x53, 0x00, 0x4e, 0xa9, 0x84, 0xb8, 0xd4, 0x4f, 0x05, - 0x1d, 0x65, 0x27, 0x4b, 0x9e, 0x3f, 0x7c, 0x47, 0x8c, 0x03, 0x09, 0x01, - 0x79, 0x00, 0x28, 0x47, 0x8e, 0x31, 0xe8, 0xc1, 0x3d, 0x46, 0x07, 0x7e, - 0x86, 0xef, 0x45, 0xca, 0x98, 0x48, 0xee, 0x6d, 0xb0, 0xff, 0x84, 0x18, - 0x9a, 0xb9, 0x93, 0x99, 0xae, 0x1c, 0x55, 0xab, 0x2e, 0xea, 0xb2, 0x7b, - 0x46, 0xb5, 0xb2, 0x21, 0x13, 0x6d, 0xc7, 0xdd, 0x03, 0x0b, 0xa0, 0x07, - 0xba, 0xe3, 0xe7, 0x95, 0xe5, 0xe2, 0xc3, 0x9a, 0x46, 0x02, 0xc2, 0x8d, - 0x8e, 0x86, 0x92, 0xbc, 0xb2, 0xa7, 0x40, 0xcf, 0xfa, 0x9d, 0xed, 0xd4, - 0xf4, 0x83, 0x48, 0x90, 0xd7, 0xc6, 0x94, 0x41, 0x54, 0xa0, 0x35, 0xb4, - 0x89, 0xdd, 0xae, 0x0d, 0x90, 0xac, 0x41, 0x1e, 0x12, 0x02, 0xa5, 0xd4, - 0x46, 0x56, 0x6d, 0x7e, 0x2e, 0x25, 0xb6, 0x0a, 0xe2, 0x72, 0xae, 0x69, - 0xa5, 0x0b, 0xf6, 0xaa, 0x29, 0x85, 0x27, 0xae, 0xdf, 0x97, 0xb2, 0x5f, - 0xde, 0xec, 0x34, 0x48, 0x2e, 0x85, 0x8f, 0xa5, 0xb3, 0xf6, 0x1e, 0xac, - 0xa2, 0xca, 0x52, 0xdd, 0x6d, 0x11, 0x0b, 0xe7, 0x92, 0xd6, 0x67, 0xdb, - 0x63, 0xd9, 0x54, 0x5d, 0xba, 0x1e, 0x12, 0xd4, 0x93, 0x1f, 0x31, 0x36, - 0x0a, 0x88, 0x45, 0x73, 0x61, 0x6a, 0x78, 0xc6, 0x91, 0x2f, 0x94, 0xd9, - 0xe2, 0x09, 0x26, 0x5e, 0xc1, 0xbd, 0xc2, 0x5b, 0x7c, 0x5f, 0x7c, 0xfa, - 0x92, 0xa5, 0xf8, 0xca, 0x78, 0x7d, 0x6a, 0x60, 0x74, 0xd9, 0xe1, 0xba, - 0xec, 0x2b, 0xc0, 0x95, 0xa1, 0x68, 0x24, 0xb1, 0xf1, 0xaa, 0x0c, 0xdd, - 0x81, 0x65, 0x75, 0x17, 0x77, 0xce, 0x78, 0xe1, 0x8f, 0xdb, 0x33, 0x24, - 0x0b, 0xc3, 0x96, 0x20, 0x0b, 0x37, 0x80, 0x4c, 0x5a, 0x8b, 0x56, 0x21, - 0x2d, 0xf4, 0x66, 0x0a, 0x66, 0x59, 0x52, 0xb0, 0xa3, 0x98, 0xd4, 0x93, - 0x7a, 0xfb, 0xa4, 0x86, 0xd0, 0x64, 0xc6, 0x42, 0xbb, 0xbe, 0xfd, 0x7a, - 0xb6, 0xc3, 0x2b, 0x75, 0x18, 0xa7, 0xc5, 0x9a, 0x31, 0x8b, 0xe6, 0x63, - 0x5a, 0x25, 0x56, 0x11, 0x7a, 0x50, 0xa6, 0x07, 0xec, 0x92, 0x89, 0x7a, - 0x68, 0xbb, 0x6a, 0xe1, 0xee, 0x1f, 0xaf, 0xd5, 0xc8, 0x98, 0x0d, 0xa0, - 0xa1, 0x84, 0x68, 0x0f, 0x8e, 0xe0, 0x20, 0x45, 0x45, 0x41, 0xda, 0x4a, - 0x9e, 0x6e, 0x78, 0x3d, 0x9a, 0x0a, 0x90, 0x6e, 0x7b, 0x49, 0xf8, 0x57, - 0xe8, 0xf6, 0x91, 0xca, 0x70, 0x32, 0x0e, 0x38, 0x60, 0xbb, 0xf7, 0xc8, - 0x88, 0x2f, 0x70, 0xc8, 0xad, 0xfa, 0x26, 0x76, 0x95, 0xf3, 0x0b, 0x51, - 0xf6, 0x48, 0xdd, 0x91, 0x3f, 0x2c, 0x44, 0x98, 0xfc, 0x50, 0x04, 0x0e, - 0xe1, 0xdc, 0x01, 0xe5, 0xdb, 0x7b, 0x5b, 0x33, 0xbc, 0x20, 0xff, 0xe2, - 0xac, 0x3d, 0xb7, 0xb2, 0x81, 0xd2, 0xb6, 0xd3, 0x50, 0xd3, 0x40, 0xd2, - 0x40, 0xf1, 0x7b, 0xf3, 0x0c, 0x26, 0x62, 0xc4, 0x7d, 0xd0, 0x66, 0xcc, - 0x3e, 0xad, 0xd2, 0x00, 0x21, 0xae, 0xd6, 0x97, 0x8a, 0x39, 0x9b, 0x97, - 0xbe, 0x1e, 0xfc, 0x69, 0x41, 0xb9, 0xf4, 0xb1, 0x2a, 0x81, 0x27, 0x07, - 0xe8, 0x0b, 0x9e, 0xcd, 0x78, 0x9c, 0x8d, 0xfb, 0x34, 0xc5, 0x8d, 0x23, - 0xb7, 0xbf, 0x8c, 0x99, 0xe3, 0x0e, 0x66, 0x75, 0xf3, 0xfa, 0x79, 0x5c, - 0x2c, 0xc7, 0xc5, 0xc9, 0xca, 0xd0, 0x3c, 0xed, 0x71, 0x1f, 0x23, 0x1f, - 0x95, 0x9f, 0xde, 0xf0, 0x01, 0x13, 0x07, 0x41, 0x98, 0xd4, 0xee, 0x4c, - 0x47, 0xf9, 0xbb, 0x94, 0x85, 0x64, 0xe1, 0x86, 0x9f, 0x36, 0xcf, 0xd2, - 0x04, 0xbe, 0x36, 0x23, 0x6b, 0x88, 0x88, 0x10, 0xf2, 0x8f, 0xe8, 0x73, - 0x6b, 0x96, 0x96, 0x31, 0x4e, 0x8f, 0x9b, 0x8c, 0xa4, 0xcf, 0xed, 0xc4, - 0x8d, 0x59, 0xdc, 0x3e, 0xf8, 0xe7, 0xf2, 0x74, 0xb3, 0x5d, 0xb9, 0x74, - 0x1e, 0x43, 0xda, 0xbe, 0x7d, 0xe1, 0xc3, 0x00, 0xb6, 0x88, 0xe4, 0x0c, - 0x53, 0xe6, 0x57, 0x95, 0xbc, 0x0f, 0xe2, 0x73, 0xcb, 0x7f, 0x10, 0xce, - 0xd7, 0xf9, 0x74, 0x23, 0x41, 0xb3, 0x48, 0x9b, 0xdb, 0x40, 0xde, 0x72, - 0x93, 0x07, 0x0a, 0x04, 0x7f, 0x43, 0xc8, 0x3e, 0xdf, 0x3c, 0x03, 0x35, - 0x4c, 0x86, 0xa5, 0x88, 0x4f, 0x6e, 0x59, 0x3e, 0xe3, 0xfd, 0xd1, 0x9b, - 0xc4, 0xf9, 0x08, 0x26, 0xf0, 0x5e, 0xe3, 0x1a, 0xff, 0x8c, 0xbc, 0xd1, - 0x7c, 0x06, 0xb2, 0x81, 0xeb, 0x4c, 0x42, 0x62, 0x0b, 0xc7, 0x40, 0x32, - 0xa7, 0x8c, 0x40, 0x84, 0xc6, 0x7f, 0x93, 0x31, 0x89, 0xdb, 0x30, 0xe4, - 0x96, 0x36, 0x30, 0x35, 0x3a, 0x19, 0x4c, 0x6f, 0xd7, 0x77, 0x9b, 0x37, - 0x14, 0x21, 0xdd, 0x5c, 0x07, 0xa9, 0xea, 0x18, 0xe6, 0x75, 0x9a, 0x83, - 0xd4, 0x4c, 0x1f, 0xf1, 0xaf, 0x0f, 0x31, 0x74, 0x78, 0xae, 0x54, 0x3d, - 0x35, 0x71, 0x6f, 0xe0, 0xe6, 0xc3, 0xf4, 0x52, 0xe1, 0xc4, 0x9e, 0x52, - 0xe9, 0xfc, 0x02, 0x80, 0xa0, 0xda, 0x2c, 0x63, 0x65, 0x68, 0x2a, 0x67, - 0x02, 0x0b, 0x7d, 0x99, 0x64, 0xf5, 0x11, 0x6d, 0x9c, 0xdc, 0x02, 0x0c, - 0x6a, 0x04, 0xa7, 0xfe, 0xf5, 0xe3, 0x2b, 0xcb, 0xf4, 0x57, 0xf3, 0x7a, - 0x44, 0xce, 0xbf, 0x15, 0xfc, 0x59, 0xac, 0x9c, 0x2b, 0x36, 0x52, 0xdd, - 0xac, 0xd5, 0xe2, 0xb7, 0xe0, 0x62, 0x60, 0x80, 0x7f, 0x97, 0x4a, 0xf4, - 0x7d, 0x77, 0x1d, 0xb7, 0xd6, 0xa8, 0x1e, 0xfe, 0xa8, 0x0f, 0xbc, 0xec, - 0x7b, 0xea, 0x91, 0xf5, 0xe9, 0x59, 0xd3, 0x39, 0xf2, 0x72, 0xac, 0x2e, - 0x20, 0xc0, 0x6e, 0xfe, 0xbb, 0x93, 0x0a, 0x00, 0xa9, 0x75, 0x08, 0xf5, - 0xcc, 0x9e, 0x7e, 0xd5, 0x0b, 0x58, 0x85, 0xed, 0x4d, 0x37, 0x6c, 0xe3, - 0x57, 0xfa, 0x48, 0xe4, 0x5c, 0x78, 0x92, 0xcd, 0x05, 0xf7, 0x48, 0xeb, - 0x07, 0xc2, 0x66, 0xfe, 0x60, 0x2d, 0x27, 0xae, 0x21, 0x71, 0xc7, 0x33, - 0x2f, 0x9a, 0xef, 0x19, 0x45, 0x05, 0x8c, 0xce, 0x1f, 0x6a, 0xee, 0x25, - 0x75, 0x4a, 0x1e, 0xc8, 0xda, 0xf0, 0x24, 0x95, 0x8b, 0x59, 0xb1, 0x4c, - 0x0b, 0x37, 0x17, 0xd7, 0x5f, 0xcb, 0xe5, 0x36, 0x25, 0x1c, 0x41, 0xab, - 0xc4, 0x59, 0x06, 0x9b, 0x1d, 0xd6, 0x1e, 0xe2, 0x18, 0xef, 0xc3, 0x40, - 0x0d, 0x00, 0x13, 0x64, 0xbf, 0xd3, 0x7b, 0xfa, 0xaa, 0x49, 0x40, 0x8f, - 0x6f, 0x60, 0xd2, 0x35, 0xc8, 0x36, 0x9b, 0xed, 0xf4, 0x0f, 0x03, 0x26, - 0x51, 0x7c, 0x80, 0x4e, 0x88, 0xd4, 0x89, 0x52, 0xb9, 0x79, 0xb7, 0x2d, - 0x56, 0xd4, 0x67, 0x4e, 0xe3, 0x86, 0x29, 0x9a, 0xb9, 0xa8, 0x81, 0x37, - 0xa1, 0x36, 0xb3, 0x82, 0x32, 0x5d, 0xc1, 0xb9, 0x65, 0xe7, 0x15, 0xdf, - 0x37, 0xfa, 0xff, 0x0e, 0x2b, 0x7c, 0x3a, 0x46, 0xea, 0x1b, 0x6e, 0xd0, - 0xba, 0xca, 0xbe, 0xb3, 0xf3, 0x88, 0x1a, 0x9d, 0x3e, 0xc2, 0x85, 0xab, - 0x13, 0xbb, 0x1e, 0xa3, 0xbe, 0xbd, 0x1d, 0xc5, 0x26, 0xb3, 0xd3, 0xf4, - 0x84, 0x16, 0xbd, 0x45, 0x3e, 0x1a, 0x05, 0xa3, 0x2a, 0xdd, 0x41, 0x5a, - 0x08, 0xa8, 0xde, 0x48, 0x0c, 0xc4, 0xe0, 0xb0, 0x03, 0x25, 0xbd, 0xc7, - 0x13, 0xf2, 0x85, 0xd2, 0x61, 0x53, 0xef, 0xa1, 0xf2, 0x00, 0xab, 0x00, - 0xdc, 0x54, 0x1f, 0xd5, 0xb4, 0x87, 0xbd, 0x6c, 0xfd, 0xb7, 0x48, 0x8e, - 0x46, 0x3f, 0xd9, 0x01, 0x02, 0x97, 0xe9, 0x1c, 0x2b, 0x17, 0x65, 0x5a, - 0x72, 0x6b, 0x0b, 0x12, 0xb0, 0x11, 0xfa, 0x14, 0x21, 0xce, 0x42, 0x25, - 0x9a, 0x08, 0xeb, 0x16, 0x6f, 0x3d, 0xe3, 0x9c, 0xb3, 0x66, 0xe1, 0x33, - 0x75, 0xc1, 0xe6, 0x84, 0x4b, 0x77, 0x82, 0x04, 0x34, 0x9f, 0xc8, 0xc6, - 0x74, 0x7e, 0x3d, 0x05, 0x25, 0x56, 0x3e, 0xe6, 0xc8, 0x73, 0x0a, 0xbd, - 0xea, 0xd8, 0xa2, 0x88, 0x3a, 0x7e, 0xe9, 0xef, 0x07, 0x20, 0x05, 0x69, - 0x65, 0x8e, 0x62, 0x3e, 0x81, 0xe9, 0x4c, 0xdc, 0x4b, 0x63, 0x29, 0x2a, - 0x9e, 0x87, 0x13, 0xa9, 0x55, 0x39, 0x4e, 0xc9, 0x31, 0x41, 0xda, 0xd6, - 0x75, 0x2b, 0x60, 0x17, 0x40, 0xe6, 0xa7, 0x7c, 0x72, 0x79, 0x34, 0xee, - 0x37, 0x73, 0x9f, 0xbb, 0x04, 0x6e, 0xc9, 0xbd, 0x0c, 0x2b, 0xe7, 0x83, - 0x9d, 0xaa, 0x17, 0x7c, 0xcf, 0x88, 0x41, 0xbb, 0x85, 0xd6, 0x72, 0xdd, - 0x8f, 0xca, 0x9e, 0x30, 0xa4, 0xbc, 0x2d, 0x63, 0x4c, 0x59, 0xb4, 0x4a, - 0xcc, 0x05, 0x7f, 0xfe, 0xeb, 0xd9, 0xad, 0x95, 0x97, 0x7b, 0x10, 0x89, - 0xd0, 0x6a, 0xb5, 0xfc, 0x85, 0x00, 0xcd, 0x22, 0xd3, 0x31, 0xdb, 0xcf, - 0x77, 0xc1, 0x65, 0x45, 0x0f, 0x15, 0xd1, 0x2d, 0xe2, 0x70, 0xdc, 0x9a, - 0xf3, 0x44, 0xcd, 0xe6, 0x82, 0x52, 0xd8, 0x32, 0x4b, 0x47, 0x35, 0xb0, - 0xcd, 0x0c, 0x35, 0x8c, 0xb6, 0x0a, 0x57, 0xe0, 0xe4, 0x39, 0x60, 0x02, - 0x90, 0xd2, 0x65, 0x2f, 0x0a, 0x24, 0xfc, 0x76, 0x83, 0xcb, 0xa0, 0x67, - 0xc0, 0xe8, 0xc4, 0x21, 0xa8, 0xef, 0x62, 0x86, 0x83, 0x68, 0x5b, 0x96, - 0x7d, 0x9c, 0x33, 0xf7, 0x79, 0x3d, 0xdb, 0xd3, 0xee, 0x05, 0x51, 0xc0, - 0x84, 0xaf, 0x66, 0x02, 0x92, 0xa6, 0x1c, 0x69, 0xba, 0xc6, 0xfb, 0x12, - 0xb3, 0x93, 0xed, 0x42, 0xc3, 0x81, 0x17, 0xc7, 0x60, 0x44, 0xe8, 0xfa, - 0x32, 0xbe, 0x21, 0xb8, 0x2d, 0x57, 0x61, 0xe2, 0xbb, 0xec, 0x5a, 0x27, - 0x18, 0xfa, 0x68, 0x32, 0xba, 0xa8, 0xac, 0x3f, 0x20, 0xe9, 0x39, 0x55, - 0xac, 0x59, 0x04, 0x9c, 0xc0, 0xbc, 0x17, 0xf0, 0x5c, 0x91, 0x87, 0x65, - 0x12, 0x59, 0x0b, 0x2a, 0xc9, 0xba, 0xa1, 0x58, 0xca, 0x6b, 0x95, 0x65, - 0xe0, 0x89, 0x94, 0xba, 0x57, 0x20, 0xa2, 0xf5, 0x59, 0x0f, 0xb1, 0x70, - 0x8b, 0x5d, 0xfa, 0x03, 0xc3, 0x14, 0x78, 0x9c, 0x88, 0x4f, 0x7e, 0xae, - 0x80, 0x59, 0xd9, 0xca, 0xc6, 0x53, 0x32, 0x02, 0xfb, 0xb8, 0x36, 0xe5, - 0xa8, 0xb1, 0x7e, 0x10, 0x95, 0xee, 0x39, 0xf4, 0x00, 0x83, 0x27, 0xdf, - 0x69, 0x0f, 0xec, 0x33, 0x1e, 0xe7, 0x12, 0x39, 0x59, 0xb2, 0x56, 0x7b, - 0xdb, 0x81, 0x03, 0x37, 0xa0, 0x01, 0x2d, 0x94, 0x17, 0x65, 0x2a, 0x59, - 0xf9, 0xd7, 0xa3, 0xb0, 0x7c, 0x6a, 0x3e, 0x1b, 0x19, 0xb7, 0x70, 0x6d, - 0x8f, 0x34, 0x3a, 0x5f, 0x3e, 0xd6, 0x5f, 0x42, 0xef, 0x65, 0xe1, 0xf2, - 0x11, 0x80, 0xa6, 0x35, 0xba, 0x5b, 0x36, 0x87, 0x35, 0x3f, 0x85, 0x9b, - 0x11, 0x3a, 0x34, 0x1c, 0x03, 0x57, 0x4b, 0x8a, 0xc8, 0x63, 0x70, 0xc3, - 0xb5, 0xb4, 0x10, 0x6b, 0x9a, 0xcf, 0x8c, 0xce, 0xc0, 0x29, 0xfd, 0x5d, - 0xcb, 0xcd, 0x2e, 0x60, 0x14, 0x7a, 0xe7, 0x2f, 0xdf, 0x91, 0xf2, 0xd0, - 0xc6, 0xd8, 0xd3, 0x8d, 0x08, 0xaa, 0x3d, 0x4f, 0xc1, 0x6f, 0x4f, 0x79, - 0x5a, 0xbc, 0x8a, 0x9e, 0x59, 0x80, 0x63, 0x19, 0x4c, 0x89, 0x4b, 0xb7, - 0xb5, 0x53, 0x91, 0x88, 0xfd, 0x53, 0x77, 0x4c, 0xa0, 0x59, 0x2f, 0x52, - 0xa3, 0xaf, 0xd7, 0xf6, 0x06, 0x4e, 0x52, 0x99, 0x94, 0xa1, 0x02, 0x22, - 0xb8, 0xdf, 0x6e, 0x94, 0x45, 0x07, 0x15, 0xbe, 0x38, 0xe8, 0x4d, 0x31, - 0x56, 0xef, 0xad, 0xbe, 0xbf, 0x44, 0x3c, 0x2b, 0x9f, 0x11, 0x97, 0x17, - 0x85, 0xa6, 0x69, 0x69, 0xe2, 0xd8, 0x57, 0xda, 0x85, 0xa0, 0x10, 0x37, - 0x00, 0x71, 0x4c, 0x0e, 0x86, 0xbf, 0x5d, 0x00, 0x24, 0xbd, 0x80, 0xb1, - 0xf5, 0x5a, 0x07, 0x43, 0xb8, 0x6f, 0x1d, 0x29, 0x71, 0x5e, 0xd0, 0xd9, - 0x37, 0x92, 0xa5, 0x03, 0x61, 0x0e, 0xaf, 0xa9, 0xec, 0x79, 0xaa, 0xef, - 0x7a, 0x9b, 0x6e, 0xcc, 0x24, 0x3d, 0x30, 0xcf, 0xfb, 0x27, 0x8f, 0x85, - 0xca, 0xf6, 0x91, 0x93, 0x39, 0x4b, 0x6a, 0x7a, 0xac, 0x6d, 0x82, 0xfc, - 0x36, 0xc0, 0x17, 0xff, 0x33, 0xba, 0x14, 0xd2, 0xf9, 0x36, 0xe3, 0x7f, - 0xf5, 0x42, 0xd7, 0xc9, 0x11, 0xd4, 0x50, 0xa5, 0x9b, 0x58, 0x37, 0x6f, - 0x6a, 0x78, 0x9f, 0x96, 0x2b, 0x73, 0x4c, 0x2e, 0x87, 0x7b, 0x1c, 0xad, - 0x7c, 0xcc, 0x5d, 0x50, 0x57, 0x72, 0x35, 0xbb, 0xf7, 0x32, 0x7c, 0x8d, - 0xc7, 0xe1, 0xcf, 0x40, 0x3d, 0x21, 0xf5, 0xd1, 0x08, 0x9f, 0x23, 0x8e, - 0x14, 0x18, 0x48, 0x2c, 0xf7, 0x4f, 0xe8, 0xe3, 0x97, 0xb2, 0xf0, 0xfc, - 0x7f, 0xfa, 0x0a, 0x77, 0x46, 0x33, 0x2e, 0x2d, 0x0e, 0xea, 0x80, 0x37, - 0x18, 0x59, 0x1a, 0x95, 0xc5, 0x40, 0x55, 0x46, 0xf2, 0x18, 0x4a, 0xa8, - 0xc2, 0xd3, 0x0a, 0x04, 0x14, 0x16, 0x5c, 0x4c, 0xc7, 0x65, 0x2f, 0xa8, - 0x06, 0x7f, 0xe1, 0xa9, 0x7b, 0x05, 0xb6, 0x29, 0xc9, 0x29, 0x08, 0xa7, - 0xdd, 0x4e, 0xcb, 0x85, 0xff, 0x85, 0x4c, 0xe0, 0xcb, 0x6b, 0xd9, 0xd8, - 0x56, 0xf6, 0x70, 0xa6, 0xb3, 0x68, 0x51, 0x8d, 0x77, 0xaf, 0x58, 0xab, - 0xa6, 0x7f, 0xad, 0xa1, 0x59, 0x8a, 0x9b, 0x04, 0x45, 0xa7, 0xe9, 0xf2, - 0x65, 0xf9, 0xa7, 0xd6, 0x3c, 0x0b, 0x19, 0x5b, 0x94, 0xc6, 0xc3, 0xb5, - 0xa5, 0x71, 0xd1, 0x2c, 0xe3, 0x0e, 0xe6, 0x10, 0x8f, 0x68, 0xe8, 0x8d, - 0x47, 0xa5, 0xd1, 0x3d, 0xbe, 0x45, 0xe5, 0x2e, 0x76, 0xbd, 0x64, 0x3c, - 0x49, 0xe5, 0x0f, 0xe4, 0x32, 0x54, 0x0d, 0x10, 0x80, 0x73, 0xc9, 0xa1, - 0x26, 0x5d, 0x1e, 0x4f, 0xcc, 0xe8, 0x67, 0x78, 0x54, 0x2e, 0x77, 0xb1, - 0x9f, 0xa8, 0xca, 0xc4, 0xc3, 0xd5, 0x9d, 0x1a, 0x22, 0x08, 0x0e, 0x0b, - 0x49, 0x2f, 0x11, 0xaa, 0xef, 0xdd, 0x2b, 0x96, 0x79, 0xbf, 0x23, 0x32, - 0x8b, 0x99, 0xc4, 0x99, 0x72, 0x65, 0xdd, 0xaf, 0x16, 0xe7, 0x3c, 0x2d, - 0x20, 0xb3, 0xbd, 0x70, 0xfc, 0x9d, 0xc7, 0xd0, 0x94, 0x9b, 0x96, 0xb2, - 0x37, 0x2d, 0xd8, 0x5a, 0x38, 0x75, 0x28, 0x35, 0x46, 0xad, 0xcd, 0xd6, - 0x6c, 0xc0, 0x91, 0xf4, 0x8a, 0xf6, 0x41, 0x45, 0xb0, 0x21, 0x11, 0x55, - 0xe6, 0xeb, 0x31, 0xe5, 0x00, 0xe8, 0xa3, 0xf0, 0xa7, 0xd1, 0x63, 0xd2, - 0x23, 0xd6, 0x12, 0x87, 0x7a, 0x8e, 0x73, 0x9f, 0xc0, 0x48, 0x5c, 0xa4, - 0xfc, 0xcd, 0x4a, 0xe1, 0xc3, 0xf9, 0x1b, 0x2f, 0x6e, 0x40, 0xad, 0xde, - 0xac, 0x2d, 0x8e, 0x7b, 0x29, 0xe8, 0x06, 0x39, 0xa3, 0xb8, 0x3a, 0xd5, - 0x77, 0xc5, 0x04, 0x27, 0x60, 0x02, 0xf6, 0xef, 0x6b, 0x22, 0x0f, 0x77, - 0x27, 0x04, 0x7a, 0xe2, 0xf5, 0x60, 0xa7, 0x82, 0x45, 0x58, 0x11, 0xb4, - 0x77, 0x46, 0x7e, 0x2b, 0x8a, 0xf3, 0xe3, 0x3e, 0x31, 0x19, 0x72, 0x91, - 0x29, 0x1f, 0xf4, 0xd1, 0x0d, 0x71, 0x6b, 0xcc, 0x33, 0x0a, 0xee, 0x28, - 0x4a, 0x0f, 0x9d, 0x01, 0x95, 0x58, 0x97, 0x53, 0x1c, 0x88, 0xdf, 0x2f, - 0x73, 0x2e, 0xb2, 0xa9, 0xfa, 0xec, 0xa9, 0x79, 0x8a, 0x12, 0x14, 0xf1, - 0x1d, 0x76, 0x2c, 0xd2, 0x6d, 0x26, 0xa9, 0x5f, 0x69, 0x62, 0xcd, 0x7b, - 0x27, 0xeb, 0xf8, 0x2d, 0x16, 0xc1, 0xf5, 0x04, 0x07, 0xee, 0x55, 0xb7, - 0x93, 0x61, 0xb5, 0xe0, 0x42, 0xf7, 0x05, 0x2b, 0xc6, 0xd9, 0x8e, 0x47, - 0x7a, 0xe1, 0xd0, 0x63, 0xef, 0x0d, 0xd4, 0x9c, 0xc3, 0x34, 0x29, 0x61, - 0x29, 0x5a, 0xb5, 0x26, 0x5b, 0x55, 0x8c, 0x4f, 0x57, 0x78, 0x11, 0x0b, - 0xdc, 0x8f, 0xca, 0xa0, 0x8c, 0x4e, 0x12, 0xff, 0x69, 0x13, 0x9a, 0x01, - 0xbe, 0xb5, 0xf4, 0x33, 0x0a, 0xc7, 0x7f, 0x2a, 0x70, 0xc5, 0xc4, 0xf5, - 0x56, 0x62, 0x92, 0x47, 0xa0, 0x20, 0x96, 0x3e, 0x3c, 0xf2, 0x03, 0x34, - 0x4b, 0x31, 0x44, 0x1c, 0xaf, 0x87, 0x8d, 0x9d, 0x95, 0x60, 0xab, 0xdf, - 0xdd, 0xe0, 0x92, 0xa8, 0x02, 0x76, 0x8b, 0xce, 0xc9, 0x60, 0x6a, 0xb7, - 0x44, 0xc1, 0xea, 0x8d, 0x39, 0xdd, 0x1b, 0x67, 0x69, 0x0c, 0xd4, 0xd5, - 0xca, 0x7c, 0xac, 0x2b, 0x2a, 0x74, 0x6a, 0xc2, 0xe1, 0x9c, 0x51, 0xf1, - 0x8e, 0x97, 0xae, 0x19, 0x53, 0xbc, 0x59, 0x98, 0xdb, 0xaa, 0x74, 0x26, - 0x83, 0x94, 0x0a, 0x18, 0xac, 0x19, 0x2c, 0x60, 0x69, 0x8c, 0xfa, 0xe0, - 0xaf, 0x6f, 0xf6, 0x75, 0x43, 0xdf, 0x51, 0xdb, 0x8f, 0xb4, 0x3a, 0x14, - 0x6e, 0x82, 0x5b, 0x4a, 0xbd, 0x36, 0x93, 0xe9, 0xe2, 0xa6, 0xd9, 0x26, - 0x59, 0x7f, 0x0d, 0xe6, 0xdf, 0xd2, 0x8c, 0x71, 0x5e, 0xbf, 0x28, 0x3f, - 0xa5, 0xe8, 0xcd, 0xea, 0xb6, 0xd0, 0xe7, 0xfb, 0xd5, 0x57, 0x12, 0xad, - 0x30, 0xa5, 0x0f, 0xf9, 0x77, 0xae, 0x8f, 0x49, 0x32, 0xee, 0x58, 0xbd, - 0xad, 0xe9, 0x0c, 0x7c, 0xae, 0xf0, 0x88, 0xa7, 0xc8, 0x2e, 0xcf, 0xc1, - 0xe1, 0x4c, 0x53, 0x0c, 0x25, 0xfb, 0xd7, 0x42, 0x9e, 0xc9, 0xe0, 0x1e, - 0x14, 0xe8, 0x65, 0x3e, 0x20, 0x31, 0xf3, 0x9a, 0x41, 0x2b, 0xab, 0x02, - 0x73, 0xdc, 0x43, 0x6f, 0x89, 0x60, 0xe6, 0x2b, 0x70, 0xc7, 0x39, 0xb5, - 0x17, 0x13, 0x0c, 0x51, 0x2a, 0x4a, 0x4f, 0xc3, 0x3c, 0x86, 0xb4, 0xd6, - 0x8d, 0x5a, 0xa5, 0x0a, 0xe2, 0x31, 0x0d, 0xa1, 0xf5, 0x08, 0xba, 0x72, - 0x91, 0x56, 0xc8, 0xa9, 0xbf, 0x07, 0x97, 0x4a, 0x7a, 0x5d, 0x18, 0x52, - 0x1f, 0x2d, 0x8b, 0xab, 0x06, 0x61, 0xc4, 0x0e, 0x36, 0xd2, 0xc6, 0xcd, - 0x12, 0x7d, 0x86, 0xdc, 0x11, 0xf5, 0x55, 0xdc, 0xf6, 0x18, 0x7f, 0xf7, - 0xcf, 0xa7, 0x8a, 0x45, 0x6c, 0x32, 0x4a, 0xc3, 0x17, 0x84, 0xce, 0x79, - 0xd8, 0x3a, 0x65, 0xa5, 0x5b, 0xa7, 0x05, 0xa1, 0xf0, 0x94, 0xed, 0x96, - 0xda, 0x93, 0x78, 0xe3, 0xe4, 0xe1, 0x94, 0x41, 0xf8, 0x18, 0x92, 0xcf, - 0x35, 0xf4, 0x81, 0xa8, 0x46, 0x9b, 0xcb, 0xba, 0x37, 0xb6, 0xa4, 0x9e, - 0x2f, 0x9a, 0x54, 0x0a, 0x8e, 0x69, 0x97, 0xb1, 0x68, 0xb2, 0x58, 0xee, - 0xfd, 0xb1, 0x7c, 0x0c, 0x51, 0xd7, 0xc6, 0x8c, 0x9a, 0x0f, 0xd5, 0x98, - 0x33, 0xca, 0xbc, 0xae, 0x3b, 0xae, 0x87, 0x02, 0x97, 0x58, 0x67, 0xa7, - 0x94, 0xf6, 0xf4, 0xe9, 0x91, 0xae, 0x28, 0xd1, 0x07, 0x1a, 0xd8, 0x59, - 0x6c, 0x75, 0xb3, 0x8c, 0x5a, 0x7f, 0x9d, 0xbb, 0x70, 0x53, 0x74, 0xb9, - 0x0f, 0x34, 0x0b, 0x35, 0x00, 0xe6, 0xda, 0x07, 0x48, 0x56, 0x07, 0xba, - 0x13, 0x47, 0x2d, 0xbc, 0x1f, 0x2b, 0xf3, 0x6e, 0xa5, 0xb6, 0x62, 0x5b, - 0x70, 0x9a, 0xf6, 0x33, 0xc5, 0x49, 0xac, 0x70, 0x5e, 0x9f, 0x6f, 0xa6, - 0x12, 0xe6, 0xf4, 0xb5, 0xe2, 0xa2, 0xe3, 0xa6, 0x46, 0x5a, 0x8f, 0x1d, - 0x8d, 0xaf, 0x4e, 0x16, 0xbe, 0xe9, 0x71, 0x9b, 0x7d, 0xa9, 0xa5, 0x1b, - 0x87, 0xf8, 0xae, 0xc3, 0x32, 0x03, 0x4d, 0xd0, 0xc8, 0xaf, 0xc5, 0xc6, - 0xb8, 0xc1, 0xef, 0x51, 0xe1, 0xaf, 0x12, 0x35, 0xc0, 0x0c, 0xfd, 0x77, - 0xf0, 0x0b, 0xa8, 0x78, 0xb4, 0x51, 0xe4, 0x1f, 0x61, 0xe7, 0x28, 0xa2, - 0x6b, 0x95, 0x47, 0x16, 0x2d, 0xc4, 0xf4, 0xdc, 0x4e, 0xdf, 0x1a, 0xb1, - 0x4c, 0xb0, 0xf8, 0xf8, 0x71, 0xd8, 0xe6, 0x0d, 0x65, 0xa3, 0x25, 0x0c, - 0x16, 0x4c, 0xfc, 0xe3, 0xf9, 0x84, 0xeb, 0xc2, 0x6e, 0xdf, 0x1b, 0x1a, - 0xdd, 0x31, 0x85, 0xb9, 0xfa, 0xb6, 0xc2, 0xf0, 0xd6, 0x43, 0xfc, 0xa6, - 0xd5, 0x94, 0x74, 0xea, 0x8e, 0xff, 0xd7, 0x66, 0x21, 0x67, 0x60, 0xe0, - 0x94, 0x19, 0xef, 0x04, 0x81, 0xe7, 0xda, 0x0c, 0x31, 0xc9, 0xd2, 0x6e, - 0xce, 0xb8, 0x71, 0x75, 0x95, 0x6a, 0xb1, 0xe0, 0x27, 0xc7, 0x29, 0x53, - 0xe9, 0xb9, 0xd1, 0x7f, 0x70, 0x7b, 0xb0, 0xd7, 0xcd, 0x5e, 0x5c, 0x89, - 0x68, 0xad, 0x38, 0x30, 0x67, 0xa1, 0x1f, 0x81, 0x11, 0x22, 0x73, 0x0e, - 0xa9, 0x9d, 0x4c, 0x01, 0x5e, 0xbc, 0xfd, 0x55, 0x72, 0xda, 0x5a, 0xad, - 0xd5, 0xc7, 0x39, 0x58, 0xd8, 0xa3, 0xef, 0xc6, 0x53, 0xfb, 0x23, 0xcd, - 0xec, 0xae, 0x50, 0x5b, 0xf7, 0x99, 0x8a, 0x0a, 0xd2, 0x4f, 0x62, 0xa4, - 0x8a, 0x2e, 0x49, 0x8b, 0x02, 0x05, 0x10, 0xb4, 0x8a, 0xc5, 0x6a, 0x61, - 0x88, 0xdf, 0xb5, 0x02, 0xc5, 0xc3, 0x50, 0x6c, 0x75, 0x81, 0x5e, 0xc3, - 0x7f, 0x3d, 0x72, 0xec, 0x43, 0xeb, 0xda, 0xc0, 0x5f, 0x86, 0xbd, 0xbd, - 0x46, 0xe2, 0x2c, 0xe9, 0x75, 0xa4, 0xf6, 0x37, 0x8e, 0xbd, 0xff, 0x84, - 0x81, 0x9c, 0xcd, 0xcc, 0xa8, 0xe8, 0xce, 0x52, 0xfe, 0xc0, 0xae, 0xce, - 0xf8, 0x5a, 0xdc, 0x0d, 0x10, 0xa1, 0x8f, 0x39, 0xb2, 0x11, 0xb8, 0xca, - 0x59, 0xf8, 0xfa, 0xb3, 0x47, 0x14, 0xe3, 0x35, 0x22, 0xf5, 0x35, 0x54, - 0x98, 0xb2, 0xf0, 0x92, 0xa4, 0xe0, 0x77, 0x21, 0x8c, 0x32, 0x50, 0x9e, - 0xf4, 0xb6, 0x4b, 0x09, 0x3f, 0xfc, 0xe8, 0xda, 0x1c, 0xe7, 0x5f, 0x53, - 0x1a, 0xca, 0x55, 0x6c, 0x01, 0x20, 0x67, 0x75, 0x61, 0xad, 0xef, 0x92, - 0xd8, 0x86, 0x6e, 0x23, 0x67, 0x0a, 0x45, 0x6e, 0xc0, 0xe5, 0x05, 0x00, - 0x7f, 0xf1, 0xd6, 0xcc, 0x65, 0x4d, 0x0b, 0xa7, 0xa2, 0xce, 0xfd, 0xb6, - 0xea, 0xd0, 0xaf, 0xbf, 0x84, 0x8a, 0x05, 0xbf, 0xcc, 0x06, 0x57, 0x26, - 0x03, 0x40, 0x42, 0x8e, 0x20, 0xa2, 0x7b, 0xfc, 0x5c, 0x0c, 0xde, 0xff, - 0xf8, 0x37, 0x4f, 0x05, 0x66, 0xff, 0x0f, 0x81, 0x44, 0xc4, 0x61, 0x7c, - 0x42, 0x99, 0x72, 0xa0, 0x70, 0x37, 0xe1, 0x0d, 0x24, 0xd8, 0x73, 0xc1, - 0x14, 0xd6, 0x1e, 0x2d, 0xd6, 0xe8, 0x4c, 0x85, 0x53, 0x22, 0x95, 0xb8, - 0x4b, 0x8f, 0xc3, 0x8d, 0x16, 0x9c, 0xa5, 0xda, 0x98, 0xee, 0x10, 0x00, - 0xed, 0xc5, 0x11, 0xa6, 0xc7, 0xa8, 0x03, 0xac, 0x18, 0x58, 0xfd, 0x49, - 0xc8, 0x87, 0xb7, 0xb6, 0x61, 0x8e, 0xc8, 0xbe, 0x74, 0x43, 0xb8, 0x4d, - 0x14, 0x28, 0x95, 0x36, 0xfa, 0x56, 0x90, 0xa6, 0x7b, 0x25, 0x9e, 0xe2, - 0x72, 0x5a, 0xa9, 0x48, 0x5c, 0x32, 0xf5, 0xa3, 0x4a, 0x6f, 0x3c, 0xfb, - 0x18, 0xf2, 0x11, 0x30, 0x65, 0x59, 0xdf, 0x6d, 0xb7, 0xd4, 0x57, 0xcb, - 0xd9, 0xcc, 0x5b, 0xdd, 0x08, 0x5f, 0xaa, 0xd7, 0xde, 0x1e, 0x0f, 0xe8, - 0x8a, 0x23, 0xa3, 0x43, 0xe2, 0x00, 0x9d, 0xab, 0x7e, 0xe4, 0x6d, 0xaa, - 0x20, 0xef, 0x5f, 0xd8, 0x56, 0x96, 0xbd, 0xd4, 0x2e, 0xaf, 0x75, 0x18, - 0x9a, 0x6d, 0xb9, 0xe6, 0x23, 0x5a, 0x6d, 0x53, 0xf8, 0xf3, 0x44, 0xde, - 0xeb, 0x0e, 0x53, 0x40, 0xaf, 0xd9, 0xb2, 0xa3, 0x45, 0xd9, 0xb6, 0x6b, - 0x51, 0xe0, 0xd9, 0x79, 0xa4, 0x6b, 0x21, 0x14, 0x2f, 0x66, 0x9c, 0xe0, - 0x4d, 0xa2, 0x18, 0x1b, 0x2f, 0x58, 0x7f, 0x3b, 0xd2, 0x0e, 0x62, 0x9e, - 0x52, 0x88, 0x4c, 0x65, 0x2f, 0xf2, 0x11, 0xf1, 0x02, 0x5e, 0x2b, 0xbc, - 0xbd, 0x3c, 0x26, 0x17, 0xe0, 0x20, 0xb7, 0xee, 0x0f, 0x75, 0xd9, 0x52, - 0xef, 0x06, 0x43, 0x3d, 0x8d, 0xfe, 0xea, 0x0b, 0xfb, 0x1b, 0x2d, 0x96, - 0x2a, 0x48, 0x47, 0xd6, 0x27, 0xcc, 0x67, 0x14, 0x9f, 0xc1, 0x73, 0x8d, - 0xf9, 0x84, 0xca, 0xe7, 0x66, 0xdc, 0x57, 0x04, 0xe6, 0x98, 0xb6, 0x4e, - 0xbb, 0x36, 0x3c, 0xfd, 0x6f, 0x7b, 0x1d, 0x24, 0xd1, 0xdf, 0xd3, 0xc7, - 0x39, 0xb8, 0x3f, 0x07, 0x5e, 0x36, 0xc3, 0xf1, 0x07, 0x2e, 0x60, 0x02, - 0x5b, 0x15, 0xaf, 0x3f, 0x55, 0x28, 0x77, 0x98, 0xae, 0xe5, 0x74, 0x1a, - 0x04, 0x89, 0xfa, 0x6a, 0x62, 0xc9, 0xba, 0xf8, 0x8c, 0xaf, 0x54, 0x34, - 0x0b, 0xa8, 0xd2, 0x15, 0x5f, 0x22, 0x32, 0x29, 0x36, 0x7f, 0xef, 0xdb, - 0x62, 0xde, 0x56, 0x2e, 0x11, 0xa9, 0x74, 0x83, 0xd7, 0xd2, 0x01, 0x79, - 0xd2, 0xec, 0xde, 0x3c, 0xad, 0x23, 0x9c, 0x80, 0x6a, 0x48, 0xde, 0x90, - 0x2e, 0xd6, 0xed, 0x43, 0x6e, 0x2b, 0x9b, 0x8a, 0xef, 0xc2, 0xad, 0xf6, - 0x6f, 0x7a, 0x85, 0x5b, 0x4b, 0x89, 0xf2, 0x77, 0x2d, 0x6c, 0x4f, 0x49, - 0x5d, 0x6f, 0x7c, 0x3d, 0xf4, 0x37, 0x99, 0x17, 0xb2, 0x12, 0x9e, 0x07, - 0x96, 0x33, 0x41, 0x87, 0xb8, 0x9d, 0x8c, 0x2d, 0x78, 0xc5, 0x50, 0x45, - 0x68, 0x45, 0x4e, 0x21, 0x3e, 0xcb, 0x0e, 0xd0, 0x12, 0x5d, 0x11, 0x4b, - 0x14, 0x4f, 0xe1, 0x78, 0x38, 0x92, 0x86, 0xda, 0x2a, 0x82, 0x82, 0x62, - 0x8a, 0x17, 0x3b, 0x08, 0x23, 0x36, 0x69, 0x9b, 0x4b, 0x0e, 0xda, 0xe1, - 0x77, 0xc2, 0xdf, 0x56, 0xa6, 0xa2, 0xd1, 0xb8, 0x8c, 0x9c, 0x66, 0x14, - 0xa4, 0x2e, 0x0b, 0x6a, 0x0e, 0x15, 0xfb, 0x5f, 0xcd, 0x07, 0xab, 0xdd, - 0xc0, 0x71, 0x54, 0xcc, 0xe3, 0x13, 0x72, 0x46, 0xa5, 0xcd, 0xf2, 0xb5, - 0x85, 0xd6, 0x44, 0x42, 0x7e, 0xa8, 0x3d, 0x00, 0x4e, 0x64, 0xf6, 0x65, - 0x01, 0x17, 0xea, 0x3f, 0xe4, 0xa8, 0x4f, 0x88, 0xe5, 0x57, 0x5b, 0xfa, - 0xaf, 0x8f, 0x86, 0xa2, 0xcf, 0x57, 0x90, 0x40, 0x1c, 0xdf, 0xeb, 0xf5, - 0x76, 0x57, 0x21, 0xe8, 0xe4, 0x43, 0x3c, 0xd7, 0xda, 0x07, 0x14, 0xfd, - 0x31, 0x06, 0x88, 0x7f, 0xd3, 0x3d, 0x45, 0xc1, 0xbe, 0x89, 0x23, 0xdb, - 0x5b, 0x39, 0xe8, 0xac, 0xb2, 0x9a, 0x1a, 0x25, 0x3b, 0xc6, 0x7a, 0xaa, - 0x0e, 0xdc, 0x69, 0xbc, 0x1a, 0x46, 0x83, 0x5d, 0xdb, 0xbf, 0x5e, 0xc5, - 0xa2, 0x31, 0xec, 0x90, 0x9a, 0x5f, 0xaa, 0x15, 0x3c, 0xd3, 0xe1, 0x47, - 0x58, 0xb7, 0x91, 0x22, 0xae, 0x11, 0x75, 0xc2, 0xfd, 0x43, 0x46, 0xd4, - 0x8a, 0x51, 0xd0, 0x80, 0xed, 0xe9, 0x41, 0xe9, 0x35, 0xa6, 0x8b, 0x0e, - 0x29, 0x89, 0xe8, 0xf8, 0xb9, 0x37, 0xfc, 0x22, 0xf8, 0x28, 0xda, 0x5f, - 0x8e, 0x02, 0xf9, 0x51, 0x6a, 0xee, 0xe7, 0xef, 0xb6, 0xd7, 0x6f, 0xde, - 0xef, 0xd1, 0x46, 0x22, 0x04, 0xf4, 0x44, 0x9d, 0x56, 0x8e, 0x65, 0x7b, - 0xfd, 0xfa, 0xbf, 0xad, 0x71, 0xb9, 0xe6, 0x2a, 0x90, 0x2f, 0xf4, 0x71, - 0x85, 0xae, 0xee, 0x27, 0xac, 0x7a, 0x95, 0x5b, 0x15, 0x85, 0xaa, 0x3c, - 0x6a, 0xf7, 0x0a, 0x01, 0x2f, 0x4a, 0xea, 0x5e, 0x9e, 0x38, 0x73, 0x9c, - 0x00, 0x7c, 0xaa, 0xac, 0xeb, 0x11, 0x4e, 0x92, 0xe5, 0xe4, 0x35, 0x9f, - 0x5f, 0x15, 0x80, 0xc7, 0x13, 0xe9, 0x3b, 0xe1, 0xb6, 0x83, 0x2c, 0xf6, - 0xae, 0x4e, 0xb3, 0xfc, 0xb8, 0xcd, 0x01, 0x92, 0xf3, 0x71, 0x7f, 0x2d, - 0x24, 0x80, 0x87, 0xc7, 0xa6, 0x0b, 0xc9, 0xf6, 0x4d, 0x32, 0x23, 0xad, - 0x1f, 0xe3, 0xdb, 0x82, 0x5a, 0x2d, 0x5d, 0x22, 0xb3, 0x8f, 0x1b, 0x77, - 0x8e, 0x36, 0x36, 0xd4, 0xea, 0xd4, 0xee, 0x71, 0x47, 0x25, 0xc1, 0xab, - 0x0e, 0xda, 0x45, 0xd4, 0xbc, 0xb1, 0xfc, 0xf7, 0xda, 0xbb, 0x7c, 0x6c, - 0xfa, 0xdc, 0xd8, 0xe3, 0xae, 0x15, 0x39, 0x4d, 0x3a, 0x09, 0x92, 0x04, - 0x13, 0xa7, 0x92, 0x5b, 0xbf, 0xa4, 0xd1, 0x17, 0xfb, 0xf7, 0xf7, 0xec, - 0x14, 0xff, 0x11, 0x29, 0x62, 0xda, 0x33, 0xc0, 0xe1, 0x87, 0x30, 0x96, - 0x17, 0x93, 0xde, 0x53, 0x76, 0xa6, 0x34, 0xb0, 0x76, 0x7a, 0x1d, 0xe8, - 0x87, 0x31, 0x27, 0xf4, 0x0e, 0x96, 0x01, 0xfe, 0x08, 0xb3, 0xe3, 0x94, - 0xdf, 0xfe, 0x6e, 0xbc, 0x4d, 0x04, 0x5e, 0xb3, 0x69, 0x8a, 0xd9, 0xcb, - 0x15, 0x26, 0xd2, 0x4e, 0xe3, 0xce, 0xee, 0x66, 0x0b, 0xc3, 0xc1, 0xc7, - 0xd8, 0x0d, 0xbd, 0xe8, 0x3c, 0xc0, 0x3d, 0x10, 0x2b, 0xf2, 0xf9, 0xcc, - 0x2e, 0x01, 0xc4, 0x49, 0xc8, 0x6c, 0x84, 0x9d, 0x3d, 0x21, 0xae, 0x7f, - 0x66, 0x11, 0x4c, 0xfd, 0xa5, 0xdd, 0x9e, 0x83, 0x7e, 0x60, 0x5d, 0x60, - 0x6c, 0x0f, 0x7d, 0x99, 0xcf, 0x1d, 0x01, 0xf1, 0xce, 0x8c, 0xef, 0xb0, - 0x00, 0x01, 0xc8, 0x5e, 0x81, 0x4c, 0x79, 0x66, 0x9d, 0x86, 0xf5, 0x0a, - 0x31, 0x6e, 0x28, 0xe0, 0x2a, 0x11, 0x35, 0xa9, 0x4d, 0x3b, 0xa2, 0xdb, - 0x72, 0xc7, 0xa4, 0x3e, 0xb8, 0x01, 0xb4, 0xc4, 0x98, 0x02, 0x32, 0x49, - 0x5d, 0xd7, 0x2f, 0x54, 0x8f, 0x0f, 0xb8, 0x35, 0x7d, 0x67, 0x39, 0xee, - 0xa6, 0xaa, 0x6c, 0x9d, 0xd9, 0x14, 0xe9, 0xf5, 0xd2, 0x79, 0xd8, 0x40, - 0xc4, 0x70, 0x84, 0xd1, 0xb2, 0x81, 0xa5, 0xf6, 0x15, 0x6d, 0x46, 0x30, - 0x7e, 0xc0, 0xd8, 0x3d, 0xb7, 0x5d, 0x91, 0x58, 0xd8, 0x6a, 0x4d, 0xd1, - 0xce, 0x3f, 0x4d, 0xfd, 0xe4, 0xd0, 0xa1, 0xc5, 0x8a, 0x72, 0x1a, 0x0d, - 0x17, 0x9f, 0x78, 0x11, 0x63, 0xe7, 0x7f, 0xa0, 0x07, 0x21, 0x92, 0x56, - 0x56, 0x7b, 0x70, 0x4d, 0xcc, 0xf0, 0xff, 0x40, 0x55, 0x06, 0x3c, 0x96, - 0x48, 0x39, 0x1e, 0x7e, 0x49, 0x2e, 0xeb, 0xed, 0x67, 0x1f, 0x01, 0x74, - 0x66, 0x17, 0xaa, 0xa0, 0xb3, 0xf3, 0x21, 0x35, 0x35, 0x86, 0x7e, 0x31, - 0x26, 0xac, 0x4f, 0xbd, 0x45, 0xc8, 0x4c, 0x18, 0x19, 0xf8, 0x7a, 0x9b, - 0x51, 0x08, 0x5c, 0xee, 0x95, 0x84, 0xcd, 0xb7, 0x2f, 0x5b, 0x96, 0xef, - 0x49, 0xde, 0xde, 0x90, 0xd1, 0x7c, 0xd7, 0xb0, 0x3a, 0x7e, 0x59, 0xf8, - 0x53, 0xf0, 0x22, 0x70, 0xbc, 0x28, 0x80, 0x1f, 0x56, 0x05, 0xab, 0xdb, - 0x54, 0x86, 0x98, 0x77, 0xca, 0xe0, 0x38, 0x0c, 0xd3, 0x10, 0xad, 0x53, - 0xeb, 0xc4, 0x93, 0x22, 0x73, 0x21, 0x41, 0x6e, 0x8a, 0xfa, 0xcb, 0xd8, - 0xaf, 0xce, 0xdc, 0xf2, 0x0b, 0x07, 0x67, 0x54, 0x60, 0xe4, 0x32, 0x5b, - 0xd1, 0x66, 0x94, 0x77, 0x1e, 0xac, 0x44, 0x03, 0x39, 0x59, 0x4d, 0xff, - 0x2b, 0x53, 0xd8, 0xc2, 0xf7, 0x64, 0x78, 0xa5, 0x23, 0x8f, 0xf0, 0xce, - 0xa0, 0xa3, 0xf0, 0x03, 0x93, 0x7d, 0x68, 0xf1, 0xfc, 0x0a, 0xbf, 0xdd, - 0x9e, 0xf5, 0x8e, 0x04, 0x88, 0xb4, 0xb2, 0xc7, 0x10, 0xfe, 0xd3, 0xf6, - 0x33, 0x2a, 0xa0, 0x8c, 0x24, 0x4e, 0x62, 0x2e, 0x21, 0x60, 0xc1, 0x0c, - 0x72, 0x1f, 0xda, 0xdb, 0x74, 0xf6, 0x33, 0xe9, 0xb3, 0xd9, 0xa9, 0xa7, - 0x5e, 0x57, 0xb5, 0x26, 0x40, 0xa6, 0x62, 0xfc, 0x12, 0x27, 0x30, 0x2f, - 0x72, 0x5c, 0xb3, 0x36, 0x3c, 0x42, 0xa5, 0x3e, 0xdc, 0xb3, 0x4d, 0x65, - 0xa9, 0x8c, 0x16, 0x93, 0x98, 0x41, 0x7e, 0x84, 0x79, 0x34, 0xa8, 0xe0, - 0xfc, 0x41, 0x5f, 0x3f, 0x6e, 0x26, 0x0f, 0xeb, 0xa4, 0x3c, 0x59, 0xf1, - 0x40, 0xb7, 0x22, 0xe7, 0x54, 0x95, 0xe1, 0x0f, 0xa5, 0x3b, 0xc0, 0x70, - 0x15, 0xee, 0x70, 0x53, 0xf0, 0x78, 0x5f, 0x0e, 0xd3, 0x78, 0x01, 0x26, - 0xd3, 0xf2, 0x9c, 0x45, 0x85, 0xc3, 0xdb, 0xe3, 0x5f, 0x50, 0x52, 0x79, - 0x78, 0x40, 0x77, 0x8e, 0x73, 0xff, 0x9c, 0xc7, 0x29, 0x17, 0x6b, 0x40, - 0xdd, 0x41, 0x95, 0x0f, 0x33, 0x76, 0x1c, 0x37, 0x89, 0x42, 0x60, 0xe1, - 0xa5, 0xaa, 0x91, 0xa1, 0xa1, 0x77, 0x2c, 0x09, 0xe7, 0x43, 0xba, 0x97, - 0x32, 0xc9, 0xd2, 0x95, 0xa9, 0xaf, 0xea, 0xfd, 0x48, 0xf8, 0x06, 0x4c, - 0x69, 0x99, 0x67, 0x98, 0x46, 0xce, 0x40, 0x42, 0x97, 0x22, 0x29, 0xc9, - 0x5b, 0x92, 0x9b, 0x47, 0x61, 0x4d, 0x09, 0xfa, 0xef, 0x48, 0xfe, 0xb5, - 0xe3, 0x51, 0x5d, 0xd5, 0x1c, 0xb3, 0xec, 0x9a, 0xe0, 0xbf, 0xc6, 0xcc, - 0x0d, 0x84, 0xcf, 0xad, 0x2a, 0x2a, 0xf0, 0x79, 0xed, 0xa3, 0x67, 0x72, - 0xb5, 0x8a, 0x6d, 0xa4, 0x37, 0x44, 0x2d, 0x5b, 0x7e, 0xa5, 0xa2, 0x90, - 0x56, 0xb2, 0x34, 0x33, 0x08, 0x36, 0x2f, 0xbe, 0x49, 0x26, 0x39, 0x80, - 0xdc, 0x46, 0x7a, 0x34, 0x0c, 0x8d, 0xc3, 0xf8, 0x0c, 0xd1, 0xe7, 0xae, - 0x63, 0xb5, 0xe9, 0xf2, 0xa0, 0x79, 0xad, 0xd8, 0xeb, 0xb5, 0x98, 0xe2, - 0x88, 0x67, 0x8f, 0x2c, 0xbd, 0x2f, 0x4d, 0xa0, 0x17, 0x7d, 0x5e, 0x16, - 0xa9, 0xe1, 0x8e, 0xe0, 0x0e, 0xb4, 0x65, 0x3f, 0x0e, 0x02, 0x1f, 0xec, - 0x39, 0x6c, 0x01, 0x3c, 0x24, 0x98, 0xb8, 0x9b, 0x1a, 0xe5, 0xdf, 0x2a, - 0xe3, 0x18, 0x1e, 0xf7, 0xfe, 0x49, 0x2d, 0xdb, 0x46, 0x3a, 0x91, 0xbe, - 0x94, 0x11, 0x9b, 0x00, 0x15, 0x30, 0x4e, 0xd8, 0x22, 0x33, 0x0b, 0x73, - 0x1a, 0x69, 0xc2, 0xc1, 0x74, 0x55, 0xb4, 0x5a, 0x14, 0x1b, 0x03, 0xb3, - 0x66, 0x4a, 0x64, 0xc3, 0x6d, 0x85, 0x6f, 0xb5, 0x85, 0xf6, 0x4c, 0x52, - 0x11, 0x09, 0xe3, 0x6b, 0x0b, 0x61, 0xa0, 0xf8, 0x2d, 0xeb, 0xd1, 0x8d, - 0xec, 0x04, 0xaf, 0x7e, 0x12, 0xfd, 0xc3, 0xdb, 0xfb, 0x44, 0xab, 0x43, - 0x19, 0xd3, 0xe2, 0x06, 0x2f, 0x89, 0x1f, 0xf1, 0xe6, 0xcc, 0x42, 0x6f, - 0x02, 0xad, 0xe4, 0xb1, 0xd3, 0xdf, 0x84, 0xc5, 0x77, 0xdb, 0xad, 0x18, - 0xdd, 0x13, 0x05, 0x49, 0x0a, 0xd4, 0x1a, 0x1a, 0xa9, 0x20, 0xd0, 0x3a, - 0x05, 0x34, 0x40, 0x5b, 0xb9, 0xe5, 0x29, 0x06, 0xfb, 0x07, 0x04, 0xd9, - 0x0a, 0x00, 0xe6, 0x5c, 0x78, 0x08, 0x87, 0x69, 0x50, 0x2f, 0xfd, 0x8b, - 0x2e, 0x25, 0x41, 0x11, 0xaa, 0xd8, 0x74, 0x6b, 0x75, 0xf3, 0xec, 0x14, - 0x29, 0xac, 0x48, 0x8d, 0xdc, 0xcb, 0xdf, 0x82, 0x77, 0x89, 0x00, 0xb8, - 0x45, 0x01, 0xa6, 0x1e, 0x9e, 0xc7, 0xa7, 0xc5, 0x88, 0xcf, 0x94, 0x8d, - 0x00, 0x2c, 0xeb, 0xd9, 0xaf, 0x14, 0x58, 0xe1, 0x13, 0x52, 0x5a, 0xf1, - 0x6f, 0xca, 0x52, 0x70, 0x67, 0xb5, 0x02, 0x6d, 0xe6, 0xec, 0x49, 0xe6, - 0x56, 0x87, 0xc6, 0x7a, 0x3d, 0x69, 0x50, 0x76, 0x89, 0xf4, 0xd4, 0x8d, - 0x40, 0xc8, 0x61, 0x7e, 0xfe, 0x9e, 0x63, 0x14, 0x38, 0x3c, 0x35, 0x5d, - 0x13, 0x82, 0xfb, 0x16, 0x90, 0xe6, 0x0c, 0x72, 0xe8, 0x4d, 0x97, 0x05, - 0x95, 0x53, 0xa2, 0xdd, 0x48, 0x7b, 0x96, 0x79, 0xb8, 0x56, 0x96, 0x13, - 0xb2, 0x23, 0x75, 0xc4, 0x1a, 0xca, 0xaf, 0x35, 0x7e, 0x4f, 0x01, 0xb3, - 0x3b, 0x33, 0xd2, 0x94, 0xa7, 0x5d, 0x75, 0x5a, 0x3d, 0xe3, 0x90, 0x1b, - 0xaa, 0xdb, 0x40, 0x59, 0x37, 0xab, 0x18, 0x05, 0x17, 0x02, 0xb5, 0xae, - 0xe5, 0xeb, 0xfd, 0x88, 0x3b, 0x6a, 0x41, 0x89, 0x5d, 0xa9, 0x02, 0x0c, - 0xd4, 0xf9, 0xd9, 0xfc, 0x41, 0x97, 0x17, 0x52, 0xe0, 0x9c, 0x08, 0x57, - 0x5f, 0xec, 0x29, 0x83, 0x43, 0x26, 0x66, 0xce, 0x86, 0x16, 0xb6, 0xfd, - 0x5d, 0x4d, 0x6d, 0x9a, 0x53, 0xa4, 0xc7, 0xf8, 0xfa, 0xc9, 0xa3, 0x51, - 0x93, 0x2f, 0xce, 0xbe, 0x66, 0xe8, 0xa1, 0x97, 0x04, 0x47, 0xa1, 0x3f, - 0x14, 0x97, 0xc7, 0xa0, 0x57, 0xa7, 0x3f, 0xdd, 0x2a, 0xea, 0x3d, 0x48, - 0x39, 0x84, 0x97, 0xb9, 0x0d, 0x13, 0xf8, 0x47, 0x38, 0x6c, 0x36, 0x01, - 0x36, 0x6b, 0x15, 0x58, 0x1d, 0x23, 0x8a, 0x11, 0x75, 0xcc, 0xa3, 0x64, - 0x2b, 0xe4, 0x45, 0x0b, 0x9d, 0xb3, 0xec, 0x52, 0x01, 0xcd, 0x61, 0x45, - 0x17, 0xf5, 0x5e, 0x72, 0xaf, 0x7e, 0xe3, 0xb2, 0x4a, 0x41, 0x8c, 0x0f, - 0x9a, 0xe8, 0xe2, 0x01, 0xe9, 0x1a, 0x69, 0x78, 0x84, 0xfa, 0x97, 0xbb, - 0x3d, 0xad, 0xfd, 0xfd, 0x5b, 0x4a, 0x43, 0x7e, 0x27, 0xe8, 0x44, 0x31, - 0x09, 0x46, 0x65, 0x76, 0xa5, 0xbd, 0xb3, 0xe6, 0xa0, 0xb0, 0xde, 0x9e, - 0x91, 0x81, 0xfc, 0xd1, 0x74, 0x6a, 0x78, 0x5f, 0x99, 0x7c, 0x42, 0x2e, - 0x16, 0x8d, 0xda, 0x47, 0x0e, 0x3c, 0x9e, 0xa1, 0x88, 0x9e, 0x4c, 0xf0, - 0x9e, 0x1e, 0xe4, 0x3f, 0xef, 0xbb, 0xc6, 0x2c, 0x34, 0x2f, 0xb6, 0xb9, - 0xb8, 0x09, 0x97, 0x5f, 0x3d, 0x5f, 0x40, 0xfc, 0xf0, 0x0b, 0x6e, 0x36, - 0x46, 0xa9, 0x2a, 0x73, 0x82, 0x8d, 0x68, 0x2a, 0x2d, 0xe0, 0x23, 0x58, - 0x11, 0x9a, 0x1f, 0x90, 0xa4, 0x66, 0x0c, 0x7b, 0xae, 0x75, 0xbf, 0x2e, - 0xbe, 0x85, 0xa9, 0xfd, 0x3f, 0x2a, 0xd0, 0x8b, 0x6e, 0x93, 0xe7, 0x5f, - 0x71, 0xcc, 0x71, 0xb1, 0x1b, 0x95, 0x31, 0xae, 0x2b, 0xfe, 0x24, 0x4b, - 0xde, 0xdd, 0x63, 0xe7, 0xb0, 0xae, 0x1b, 0xdb, 0x09, 0x41, 0xfa, 0x3e, - 0x79, 0xf8, 0x97, 0x59, 0x5f, 0xe6, 0x0c, 0xe6, 0x36, 0xbf, 0xf3, 0x0b, - 0xab, 0x09, 0x78, 0x28, 0xa1, 0x01, 0xa5, 0x87, 0x30, 0x4f, 0x92, 0x6f, - 0x8a, 0xb7, 0x37, 0xf7, 0x86, 0xe8, 0xd9, 0xf4, 0x0b, 0x48, 0x6f, 0x3b, - 0xc0, 0x1b, 0xf3, 0x9a, 0x7b, 0xf3, 0xb0, 0xcf, 0x39, 0x7e, 0x50, 0x56, - 0x88, 0xeb, 0x1b, 0xf3, 0x54, 0x2d, 0x2c, 0xdc, 0x45, 0x7f, 0x21, 0x5a, - 0x41, 0xd6, 0xdf, 0x4f, 0xf0, 0xed, 0xa0, 0xa0, 0xb3, 0x00, 0x44, 0xbc, - 0x0f, 0x73, 0x23, 0xc4, 0x11, 0x79, 0x56, 0x6b, 0x6f, 0xb0, 0xa9, 0x70, - 0xe6, 0x93, 0xdd, 0xd0, 0x90, 0x27, 0x75, 0x4c, 0x17, 0x99, 0x4d, 0xea, - 0x75, 0x48, 0xde, 0x4d, 0x87, 0x20, 0x82, 0x50, 0x87, 0xe5, 0xd6, 0xfe, - 0xba, 0x8b, 0x02, 0xc7, 0xb4, 0xb8, 0xe0, 0xb2, 0xff, 0x6a, 0xfc, 0x84, - 0x9d, 0x9a, 0xc9, 0xad, 0xc3, 0x3d, 0xed, 0xa1, 0x67, 0xe1, 0x15, 0x55, - 0x43, 0xb3, 0x60, 0xe0, 0x59, 0xcf, 0x4c, 0x6f, 0x20, 0x24, 0xf6, 0xdf, - 0x9d, 0xf2, 0xb3, 0x63, 0x53, 0xb1, 0xf9, 0x22, 0xcf, 0x34, 0xd2, 0x63, - 0xf3, 0xc5, 0x76, 0x92, 0xc3, 0xc6, 0x86, 0x98, 0x21, 0x3f, 0x18, 0xb1, - 0xfc, 0xae, 0x22, 0x64, 0x9b, 0x76, 0xac, 0xcf, 0xee, 0xc9, 0x24, 0x10, - 0x48, 0x34, 0x0f, 0x98, 0x62, 0xf1, 0x07, 0x37, 0xd6, 0x4e, 0x58, 0xee, - 0x27, 0xc9, 0x02, 0x24, 0x7d, 0x3b, 0x7b, 0xd1, 0x72, 0xb8, 0xe6, 0xea, - 0x9e, 0xf7, 0x9c, 0xee, 0xc9, 0xcb, 0xce, 0xed, 0xd2, 0x07, 0xd2, 0xbb, - 0x58, 0xc2, 0x8e, 0xbc, 0x7f, 0xa4, 0x20, 0xe2, 0xcb, 0x0b, 0x33, 0x17, - 0xca, 0x2f, 0x0a, 0x09, 0xcb, 0x74, 0xcf, 0x3a, 0x73, 0x90, 0x1a, 0x7d, - 0xa4, 0xc0, 0x27, 0xd5, 0x08, 0x28, 0xb5, 0x0a, 0x56, 0x6d, 0x45, 0x21, - 0x0d, 0xa8, 0x04, 0xa3, 0x12, 0x47, 0x9f, 0xe3, 0x82, 0xa2, 0x66, 0xce, - 0x4c, 0xe9, 0x5d, 0xa7, 0xc8, 0x3a, 0x1c, 0x48, 0xc7, 0x29, 0xd0, 0xa4, - 0x33, 0xd9, 0x95, 0x48, 0xe5, 0x4c, 0x0c, 0xde, 0xed, 0x90, 0x39, 0xa9, - 0x48, 0x70, 0x5e, 0x17, 0xe0, 0x85, 0x0d, 0x3f, 0x5a, 0x6c, 0x7e, 0xb1, - 0xc8, 0x61, 0x40, 0x1b, 0x90, 0x52, 0x05, 0x84, 0x82, 0xfd, 0x18, 0xbd, - 0x7f, 0x2d, 0xca, 0xe3, 0x1a, 0x10, 0xd0, 0x47, 0x78, 0xf5, 0xf7, 0xb9, - 0x7e, 0x7b, 0x5e, 0x99, 0x45, 0xc1, 0x16, 0x0a, 0x65, 0x1d, 0xcd, 0xe9, - 0x6a, 0x77, 0x98, 0x2b, 0x97, 0x05, 0x63, 0x46, 0x0d, 0xe2, 0x8a, 0x99, - 0x58, 0x67, 0x4e, 0xd1, 0x8b, 0x8e, 0x39, 0x96, 0x3c, 0x19, 0x83, 0xc4, - 0xe0, 0x84, 0xb4, 0x27, 0x30, 0x68, 0x23, 0x7f, 0x58, 0xd2, 0x4d, 0xf0, - 0x35, 0x4c, 0x9f, 0x2c, 0xd9, 0xdf, 0x73, 0xfa, 0x2b, 0xbc, 0x63, 0xef, - 0x4f, 0x74, 0xa4, 0x72, 0x71, 0x04, 0xc9, 0x33, 0x58, 0x94, 0x0f, 0xb6, - 0x2a, 0xc3, 0xdb, 0x1c, 0x14, 0x7e, 0x2b, 0x61, 0xfe, 0x27, 0x95, 0x33, - 0x51, 0x1b, 0x53, 0xa0, 0x44, 0x06, 0xb7, 0xe1, 0x47, 0x90, 0xb3, 0x44, - 0x56, 0x03, 0x22, 0xf0, 0xe7, 0xea, 0x86, 0x9f, 0x86, 0x1e, 0x4e, 0x48, - 0x81, 0x54, 0xf1, 0xd1, 0xc9, 0x0a, 0x73, 0xfc, 0xc2, 0x65, 0xb1, 0xd1, - 0x2b, 0x19, 0xf6, 0x62, 0xb2, 0x5b, 0x2d, 0xb0, 0x94, 0xab, 0xf6, 0x61, - 0xa3, 0xad, 0x7a, 0xf7, 0xf4, 0x0f, 0x1b, 0xcc, 0x13, 0x17, 0x52, 0x6d, - 0x4b, 0xa5, 0xfd, 0xd2, 0x1b, 0x58, 0xc0, 0xdc, 0x77, 0xc7, 0xe1, 0xa4, - 0x6b, 0xf0, 0x77, 0xa8, 0x98, 0xbd, 0x1d, 0x54, 0xd3, 0x86, 0x09, 0xe5, - 0xf6, 0x98, 0xc6, 0xb2, 0x5f, 0xa1, 0x36, 0x9e, 0x10, 0xa9, 0x0d, 0xe3, - 0x76, 0x1a, 0x56, 0x25, 0xf1, 0xe5, 0x11, 0x38, 0x1d, 0xed, 0xf8, 0x70, - 0xf4, 0x31, 0x3a, 0xce, 0x49, 0xfb, 0x7f, 0xc5, 0x5c, 0xa7, 0x5b, 0x7b, - 0x9a, 0x66, 0x6d, 0xf3, 0x60, 0x5f, 0x39, 0xcf, 0x6c, 0x35, 0x1f, 0xe3, - 0x64, 0xbf, 0x26, 0x0f, 0xf7, 0xef, 0x3e, 0xf5, 0x48, 0x94, 0x63, 0xed, - 0x2f, 0x15, 0x9a, 0x61, 0x18, 0x74, 0x2e, 0x6f, 0xdf, 0x60, 0xfd, 0x23, - 0xb5, 0x2b, 0x5a, 0x39, 0xee, 0xb4, 0x2e, 0x0d, 0x75, 0x34, 0xd9, 0xfc, - 0x96, 0x4d, 0x0a, 0x5a, 0xd6, 0x23, 0xd2, 0x78, 0xc7, 0xda, 0x0d, 0xf6, - 0xf3, 0x14, 0x8c, 0x88, 0xc4, 0x35, 0x4a, 0xc2, 0xe9, 0x32, 0x06, 0x6a, - 0xc6, 0xeb, 0x56, 0x90, 0x02, 0x37, 0x74, 0x8c, 0x98, 0xf0, 0x3b, 0x99, - 0x1e, 0x06, 0x32, 0x74, 0xce, 0x35, 0x16, 0x54, 0x14, 0x2d, 0x18, 0x6e, - 0xa8, 0x2c, 0xdc, 0x04, 0x42, 0x31, 0x36, 0x91, 0xd7, 0x81, 0x27, 0xfe, - 0x6d, 0x4d, 0x45, 0x1e, 0x21, 0x60, 0x4e, 0x49, 0xc1, 0xc5, 0x23, 0x82, - 0xd1, 0x5a, 0x71, 0xbe, 0x5b, 0x9b, 0xe2, 0xa9, 0x5b, 0xe5, 0xcc, 0x18, - 0x82, 0x8f, 0x1c, 0xc4, 0xd0, 0x77, 0xec, 0xb5, 0x9a, 0x7f, 0xe4, 0x37, - 0x86, 0x9a, 0xdf, 0xc2, 0x8f, 0x7c, 0x4c, 0x63, 0x69, 0x91, 0x79, 0xdf, - 0x45, 0x1e, 0xe6, 0x4a, 0xab, 0x6e, 0x44, 0xce, 0x94, 0x62, 0x6b, 0x13, - 0xf0, 0x39, 0xc3, 0x14, 0x3a, 0x78, 0x3b, 0xc2, 0xa4, 0x2d, 0x73, 0x1b, - 0xf6, 0xf8, 0x0c, 0x44, 0x71, 0xf7, 0x1b, 0x4e, 0xc4, 0x01, 0x87, 0xfc, - 0xb2, 0x49, 0x0c, 0x2d, 0x7b, 0x4b, 0x7a, 0x4e, 0x70, 0xde, 0x05, 0x3a, - 0x5c, 0xac, 0xb6, 0x6d, 0x73, 0x5d, 0x47, 0x09, 0x60, 0xc4, 0x39, 0xa7, - 0x8a, 0x96, 0xdb, 0x68, 0x71, 0x1b, 0xbc, 0xcc, 0xc6, 0x00, 0x62, 0x4a, - 0xf6, 0xc0, 0x26, 0x35, 0xf5, 0xb7, 0x86, 0xb1, 0x7d, 0xbd, 0xe1, 0x0a, - 0x06, 0xb9, 0xca, 0xff, 0x57, 0xd4, 0x1b, 0x17, 0x55, 0x96, 0xaa, 0x38, - 0xaf, 0xc5, 0x8c, 0x86, 0x8b, 0xb1, 0xda, 0xc1, 0x38, 0xbd, 0x27, 0x2b, - 0x86, 0x37, 0x88, 0xc5, 0x3f, 0x15, 0x64, 0x18, 0x41, 0xad, 0x41, 0x25, - 0xc5, 0xe5, 0xa7, 0xb2, 0xfb, 0x6c, 0x74, 0x62, 0xc9, 0xed, 0xb3, 0x8f, - 0xd3, 0x29, 0xbd, 0xd1, 0x76, 0x14, 0x64, 0x79, 0x21, 0xff, 0xcf, 0x02, - 0x97, 0x98, 0x79, 0x3d, 0x44, 0x7c, 0x1a, 0x4a, 0x97, 0x68, 0x01, 0x73, - 0xfb, 0x9f, 0xfd, 0x08, 0x37, 0x0d, 0x3a, 0x91, 0xd3, 0x95, 0x4f, 0x2a, - 0xc1, 0x5a, 0x0c, 0x79, 0x0e, 0x5f, 0x4e, 0x4e, 0x6c, 0x2e, 0xa0, 0x84, - 0xaa, 0xfe, 0x86, 0xa8, 0xab, 0xe4, 0xdc, 0x60, 0x46, 0x7a, 0xee, 0x92, - 0x93, 0xf8, 0x04, 0x6e, 0xba, 0xc5, 0x04, 0x61, 0x5a, 0xba, 0x1b, 0xf7, - 0xe7, 0x3a, 0x9f, 0x60, 0xe7, 0xa8, 0xdb, 0xd9, 0xe9, 0xb0, 0xa4, 0x78, - 0xc8, 0x93, 0xdf, 0xf8, 0x30, 0x17, 0x96, 0x27, 0x6d, 0xba, 0x78, 0x7b, - 0x05, 0x7f, 0xc4, 0xa1, 0x5a, 0x47, 0x33, 0x76, 0xd5, 0x4e, 0x73, 0x62, - 0x23, 0x5c, 0x9c, 0xeb, 0x73, 0xb4, 0x0f, 0xf4, 0x87, 0xee, 0xd2, 0xc0, - 0x4f, 0xaa, 0x97, 0xde, 0x69, 0x67, 0xea, 0xce, 0xd1, 0x43, 0x11, 0x72, - 0x41, 0x4c, 0x82, 0xff, 0xd0, 0x40, 0xe0, 0xcf, 0xf7, 0xf3, 0x99, 0x2e, - 0xd8, 0xcf, 0x4b, 0xd0, 0x53, 0x7c, 0xe5, 0x2e, 0x10, 0x7a, 0x3a, 0xca, - 0x33, 0x2e, 0x75, 0x7e, 0x74, 0x7e, 0x4e, 0x9f, 0xb6, 0xc7, 0xd5, 0xf6, - 0x52, 0xd2, 0x2f, 0x11, 0x8d, 0x04, 0xf4, 0x72, 0x3a, 0x7a, 0x62, 0x43, - 0x85, 0xd3, 0x87, 0xe9, 0x50, 0x0c, 0x8f, 0x7e, 0xce, 0x88, 0xd4, 0x3e, - 0x40, 0x1b, 0xf1, 0xd2, 0x2f, 0x4b, 0xd2, 0x32, 0x3f, 0x49, 0x1d, 0x39, - 0xf7, 0x4f, 0x6c, 0xcd, 0xcb, 0xed, 0xdd, 0xc4, 0x66, 0x07, 0xa2, 0x68, - 0x0c, 0xd3, 0x5b, 0x5a, 0x06, 0xe0, 0x89, 0xb6, 0x07, 0x68, 0xaf, 0x89, - 0x56, 0x34, 0x9f, 0xe7, 0xe4, 0xe6, 0xa6, 0xec, 0xad, 0xc1, 0x1b, 0x38, - 0x34, 0xcc, 0xb1, 0x15, 0xa1, 0x68, 0x38, 0xe0, 0x49, 0xe8, 0xdf, 0xaa, - 0x57, 0x55, 0xd8, 0x11, 0x0a, 0xfa, 0x76, 0x6c, 0xcc, 0x61, 0x1a, 0x82, - 0x6c, 0x5c, 0xad, 0x8b, 0x89, 0xb2, 0xe4, 0xf8, 0xba, 0xac, 0xd8, 0x38, - 0xd7, 0x1e, 0x4e, 0xa7, 0x9a, 0x57, 0x2b, 0x24, 0x69, 0x79, 0xef, 0x51, - 0x1c, 0x6d, 0x57, 0x9b, 0x4c, 0x4f, 0xf4, 0xba, 0xd5, 0x2d, 0xae, 0x36, - 0xb4, 0xfc, 0x80, 0xb4, 0xa0, 0x8d, 0xa8, 0x45, 0x9c, 0x0f, 0xa3, 0xbe, - 0xf3, 0x8b, 0xb9, 0x57, 0x8e, 0x7d, 0xd4, 0xbd, 0x3c, 0xe6, 0x2c, 0x1d, - 0x3a, 0xc7, 0x3f, 0x64, 0x2b, 0xa3, 0x95, 0x2e, 0xf2, 0x47, 0xe4, 0x23, - 0x81, 0xc0, 0xcc, 0x27, 0xa6, 0x8f, 0x32, 0xa1, 0xc7, 0xc9, 0xfa, 0xeb, - 0xde, 0xfe, 0x73, 0xfa, 0x8d, 0x4d, 0x41, 0xc1, 0xd9, 0xff, 0x37, 0x3a, - 0x9c, 0xe4, 0xce, 0x64, 0xdf, 0xb5, 0x98, 0x78, 0x67, 0xdb, 0xe8, 0xe8, - 0x93, 0x8c, 0xc9, 0xbd, 0xc6, 0x9e, 0xd9, 0xa9, 0x54, 0x02, 0xda, 0x20, - 0x94, 0x4d, 0xb7, 0x57, 0xa4, 0xe4, 0x65, 0x43, 0xdd, 0x7a, 0xf8, 0x2e, - 0x2b, 0x1f, 0xba, 0xf3, 0x28, 0xba, 0x99, 0x62, 0x77, 0xb2, 0x52, 0x4c, - 0xca, 0xf4, 0xd4, 0xc0, 0x16, 0x9e, 0xba, 0x4b, 0x81, 0x1f, 0x63, 0x75, - 0xc9, 0x49, 0xbc, 0xe8, 0xd0, 0xdc, 0xd3, 0xd5, 0x42, 0xe3, 0x0c, 0xe9, - 0xf8, 0x65, 0x4b, 0xd0, 0x92, 0x94, 0xa9, 0x4b, 0x4f, 0x6d, 0xc4, 0x25, - 0x62, 0x83, 0x32, 0xb8, 0xbd, 0x82, 0xd8, 0xb6, 0xec, 0x05, 0x16, 0x2f, - 0x09, 0x23, 0x4a, 0x54, 0x64, 0x63, 0xe6, 0xc2, 0x36, 0xf7, 0x90, 0xd5, - 0x89, 0x05, 0xa1, 0xb8, 0xb8, 0x93, 0xf1, 0xe7, 0x3c, 0xa5, 0x65, 0x6a, - 0xb2, 0x9b, 0x9b, 0xb7, 0x13, 0xae, 0x00, 0x8e, 0xb6, 0x3e, 0x1a, 0x0c, - 0xb5, 0x0d, 0x40, 0x17, 0x08, 0x6b, 0xee, 0x9e, 0xd3, 0x0a, 0x1e, 0x58, - 0xd2, 0x6f, 0xce, 0x79, 0x1a, 0x30, 0x84, 0xfc, 0x6a, 0xca, 0xe3, 0x54, - 0x77, 0xc8, 0x46, 0xf9, 0x39, 0xc4, 0x1c, 0x1f, 0xc4, 0xa7, 0xfb, 0x67, - 0x11, 0x98, 0x2e, 0xba, 0xf3, 0xdb, 0x26, 0xe9, 0x97, 0xae, 0x25, 0x14, - 0xed, 0x24, 0x71, 0xbd, 0x00, 0x69, 0x62, 0xfd, 0x1b, 0x1d, 0x70, 0xc6, - 0x7d, 0x75, 0xba, 0x68, 0xa9, 0x3e, 0x3c, 0x9d, 0x3c, 0x73, 0x7b, 0xc1, - 0x21, 0x4c, 0xfe, 0xdb, 0xe7, 0xba, 0x33, 0x78, 0x65, 0xc1, 0x8c, 0x2d, - 0x9a, 0x24, 0x34, 0x4c, 0x05, 0xff, 0x13, 0x19, 0x71, 0xb7, 0xb1, 0x36, - 0x62, 0x22, 0xa2, 0x20, 0xe3, 0x45, 0xde, 0x18, 0x75, 0x4f, 0x72, 0x71, - 0x1e, 0xf9, 0x08, 0x9c, 0xa2, 0x6a, 0x6e, 0xa5, 0x18, 0x8b, 0x9e, 0xd2, - 0x7b, 0x26, 0xc7, 0x13, 0xb7, 0xf7, 0x8a, 0xae, 0xc1, 0xbb, 0xd7, 0x03, - 0xa6, 0x06, 0x83, 0x0b, 0xb6, 0x24, 0x38, 0x9a, 0xc3, 0x95, 0xe7, 0xc8, - 0x69, 0x84, 0x5d, 0x93, 0x33, 0x7d, 0x3f, 0x5e, 0x15, 0x43, 0x4a, 0x19, - 0x35, 0xc9, 0xaa, 0xed, 0x8f, 0xbd, 0x37, 0xec, 0xd8, 0x8a, 0xc9, 0xa2, - 0x72, 0x64, 0x0f, 0xac, 0xe5, 0xf9, 0xcd, 0x2e, 0x57, 0xf4, 0xf6, 0xec, - 0xb4, 0x70, 0x96, 0x86, 0x82, 0x37, 0x6e, 0xd7, 0xf5, 0x34, 0xac, 0xbf, - 0xad, 0xcf, 0x2e, 0x89, 0x3b, 0x99, 0xce, 0x50, 0x7c, 0x3e, 0x85, 0x16, - 0x39, 0x50, 0x02, 0x57, 0xed, 0x62, 0x38, 0xc6, 0x9f, 0x52, 0xd7, 0xbf, - 0x59, 0xfc, 0x4f, 0x94, 0x57, 0xd5, 0xb4, 0xf4, 0xe1, 0x36, 0xdd, 0x29, - 0x65, 0x5e, 0x16, 0xb3, 0x1e, 0xc2, 0xc2, 0x18, 0x9f, 0x14, 0x25, 0x25, - 0xb9, 0xd5, 0xd3, 0x86, 0xdb, 0x27, 0xd1, 0xbd, 0x9b, 0x84, 0x49, 0x1e, - 0x66, 0x9d, 0xb1, 0xf5, 0xc3, 0xc4, 0x30, 0x7a, 0x3c, 0x70, 0xda, 0x63, - 0x08, 0x29, 0x57, 0xc6, 0x5c, 0x81, 0x5c, 0x0b, 0x21, 0x80, 0xbb, 0xd0, - 0x35, 0xb8, 0xc5, 0xc3, 0x8d, 0x2b, 0xb2, 0xec, 0xd1, 0xde, 0x92, 0x38, - 0x4d, 0x8d, 0x71, 0x02, 0x11, 0x5d, 0x8e, 0x18, 0x84, 0x55, 0xa4, 0x92, - 0x5a, 0x14, 0x4b, 0xdd, 0xdb, 0x43, 0x59, 0xf5, 0xc2, 0xa0, 0x39, 0x02, - 0x2e, 0x3e, 0xf2, 0xf6, 0xb6, 0xda, 0x10, 0x40, 0xbe, 0x2f, 0x7a, 0xf2, - 0x18, 0xb0, 0xa4, 0x2c, 0xe7, 0x4b, 0x44, 0x4c, 0xb0, 0x12, 0xfd, 0x80, - 0xee, 0x74, 0xf0, 0xff, 0x70, 0x0b, 0x2e, 0x17, 0xb0, 0xf5, 0xd9, 0xea, - 0x06, 0x1d, 0x0e, 0xfc, 0xf0, 0xfb, 0x9f, 0xe1, 0x8f, 0xe3, 0xea, 0xc7, - 0x25, 0xaf, 0x8c, 0x57, 0xcc, 0x5f, 0x82, 0x86, 0x9b, 0x53, 0x43, 0x0c, - 0xd1, 0xab, 0x88, 0xe1, 0x13, 0x8f, 0x31, 0x1b, 0xc8, 0xe7, 0x46, 0x6a, - 0x14, 0x7e, 0xd9, 0x84, 0xca, 0xbd, 0x71, 0xbd, 0x1f, 0xd0, 0xcd, 0xb2, - 0xc4, 0x01, 0x45, 0xd5, 0x53, 0x0d, 0xed, 0x1f, 0x91, 0xc8, 0x34, 0xdf, - 0x56, 0x04, 0x91, 0xc1, 0x5f, 0x05, 0x60, 0xd2, 0xfc, 0x43, 0x00, 0xe0, - 0xa3, 0x89, 0x3f, 0x92, 0xaf, 0x38, 0xc0, 0xf3, 0xb3, 0x8b, 0x9a, 0xdc, - 0x49, 0x53, 0x91, 0xbe, 0x8e, 0x49, 0x6a, 0xd4, 0x5e, 0x92, 0x10, 0x4b, - 0xc1, 0x4d, 0xac, 0xf1, 0x11, 0x2e, 0x9f, 0xa2, 0xe5, 0x56, 0x79, 0x80, - 0xe7, 0x50, 0x8a, 0xb6, 0xd2, 0xdf, 0xfb, 0x05, 0xcd, 0xed, 0x11, 0x6f, - 0x42, 0x7c, 0xbf, 0xe9, 0xdb, 0xc2, 0x35, 0xa8, 0x60, 0x17, 0xae, 0x81, - 0x5b, 0x22, 0xce, 0x7c, 0xe1, 0x82, 0x7d, 0x9d, 0x54, 0x04, 0xba, 0x90, - 0x27, 0x8a, 0x6c, 0xab, 0x9c, 0x40, 0xa1, 0x0d, 0xff, 0x47, 0xc9, 0xa6, - 0x1d, 0x66, 0x43, 0x82, 0xd8, 0xe8, 0x7d, 0x77, 0x09, 0x30, 0x90, 0xc4, - 0xcd, 0x4d, 0xa9, 0xf0, 0xea, 0xca, 0x86, 0xa9, 0x80, 0x33, 0xe3, 0xa1, - 0x86, 0x00, 0xea, 0x52, 0x87, 0x57, 0x77, 0x34, 0x0e, 0x94, 0x4f, 0xe5, - 0x9c, 0xe1, 0xe6, 0x1f, 0xcd, 0x16, 0x80, 0x3e, 0x1a, 0xc7, 0x6f, 0x10, - 0x85, 0x72, 0xc7, 0x99, 0x6f, 0xdd, 0xc0, 0xff, 0xe9, 0x6e, 0x68, 0x95, - 0x3c, 0x85, 0xef, 0x7b, 0x2d, 0x9a, 0xed, 0x6c, 0xe5, 0xfb, 0x1d, 0x90, - 0x48, 0xb7, 0x0a, 0x6b, 0x13, 0x31, 0x14, 0xc3, 0xcf, 0x0d, 0x79, 0x26, - 0x52, 0x74, 0xf8, 0x38, 0xad, 0xc4, 0xea, 0xa1, 0x01, 0x51, 0x83, 0x3c, - 0x94, 0xbd, 0xff, 0x93, 0xd4, 0x8f, 0x94, 0x88, 0xe5, 0x3c, 0xe7, 0x26, - 0x59, 0xf0, 0x83, 0x1c, 0xa2, 0x3f, 0xc2, 0xa0, 0x7e, 0x2e, 0x59, 0x1d, - 0xb3, 0x0b, 0x7f, 0x7f, 0xeb, 0x6d, 0x42, 0x6b, 0xbd, 0xde, 0xf0, 0xf4, - 0x21, 0xb3, 0xde, 0x96, 0x2b, 0xb8, 0xb8, 0xcc, 0xb7, 0xc7, 0xc7, 0x52, - 0x6d, 0x42, 0xbb, 0x98, 0x68, 0xb9, 0x13, 0xbb, 0xb4, 0x39, 0x7c, 0xe9, - 0xb4, 0xd2, 0x15, 0x35, 0x75, 0x61, 0x71, 0x7c, 0x3c, 0xa9, 0x02, 0x4b, - 0xe5, 0xd3, 0x13, 0x51, 0x75, 0x5f, 0x13, 0x92, 0x77, 0xb1, 0x87, 0x57, - 0xfd, 0x10, 0xc5, 0x30, 0x4e, 0x76, 0xb6, 0xc6, 0xd9, 0x63, 0x21, 0xae, - 0x9b, 0xfe, 0x5a, 0x6d, 0x24, 0x23, 0xc0, 0x6d, 0xa6, 0x09, 0x4d, 0x85, - 0xbf, 0xf0, 0x0e, 0x07, 0x0d, 0xca, 0xc0, 0xed, 0x9a, 0x84, 0xa5, 0x61, - 0x79, 0x93, 0x55, 0x4e, 0x3b, 0x2b, 0xaa, 0xc9, 0x67, 0x6b, 0xa9, 0x70, - 0x79, 0x87, 0x79, 0x88, 0x48, 0xbc, 0xd5, 0xd1, 0x05, 0x9f, 0x22, 0x73, - 0x26, 0x3e, 0x29, 0xf3, 0x52, 0xcb, 0x5c, 0xc4, 0xcc, 0x92, 0x0a, 0xbb, - 0x3c, 0x9c, 0x94, 0xd4, 0x97, 0x6a, 0x7c, 0x4c, 0x9e, 0x09, 0x60, 0x42, - 0xf2, 0x5f, 0xfc, 0x52, 0xc0, 0x2c, 0x49, 0xcd, 0xc1, 0x88, 0x2c, 0x73, - 0x91, 0x09, 0xa6, 0x34, 0xb7, 0xde, 0xb4, 0xaa, 0x5a, 0x1e, 0x8d, 0xc8, - 0x42, 0xd3, 0x62, 0xc6, 0x0e, 0x1a, 0x08, 0xff, 0x67, 0x88, 0x14, 0x50, - 0x38, 0x13, 0x08, 0x41, 0x63, 0x57, 0x77, 0xfe, 0xfa, 0x6c, 0x37, 0xfa, - 0x31, 0xef, 0xbe, 0x47, 0x1f, 0xe0, 0xae, 0x34, 0xf1, 0x85, 0x50, 0x07, - 0xa1, 0x96, 0x60, 0xcf, 0x79, 0x46, 0xb0, 0xa8, 0x4e, 0x3b, 0xf0, 0x69, - 0x27, 0x44, 0x6a, 0xe4, 0xb9, 0x00, 0xe6, 0xeb, 0x78, 0x46, 0x40, 0xe7, - 0xe5, 0x44, 0x49, 0x59, 0x3b, 0x2f, 0xdd, 0xca, 0x38, 0x61, 0x75, 0xfa, - 0x9d, 0x99, 0xa6, 0x21, 0xef, 0xc6, 0xe0, 0x50, 0x30, 0x1f, 0xde, 0xcd, - 0x2d, 0xd9, 0x00, 0xd1, 0xe5, 0xce, 0xcb, 0xd6, 0x64, 0xdc, 0xaf, 0xb0, - 0x07, 0x85, 0xfe, 0xff, 0x0d, 0x31, 0x03, 0x8d, 0xa5, 0x9c, 0x11, 0x40, - 0x4a, 0x6b, 0x31, 0xfb, 0xb5, 0x95, 0x99, 0x9d, 0xb7, 0x85, 0x1f, 0xd9, - 0x96, 0x54, 0xe7, 0x2c, 0xce, 0x92, 0xd4, 0x7a, 0xd9, 0xdb, 0x63, 0x3c, - 0x37, 0x00, 0x52, 0xbe, 0xe3, 0x83, 0x04, 0x76, 0x04, 0x93, 0xb8, 0xb1, - 0xac, 0xeb, 0x03, 0xfa, 0xb8, 0x71, 0x54, 0xea, 0x6b, 0xff, 0x1a, 0x5f, - 0xe6, 0x75, 0xbb, 0xd0, 0x01, 0xda, 0x6a, 0x93, 0x19, 0xc1, 0x17, 0x82, - 0x1b, 0xb8, 0x5d, 0x36, 0xa6, 0x57, 0x2d, 0xfe, 0x2a, 0x04, 0xc6, 0x74, - 0x49, 0x0b, 0xce, 0xeb, 0xca, 0x64, 0xc4, 0x40, 0xfd, 0x2d, 0x31, 0x38, - 0xff, 0x5b, 0xe1, 0xd5, 0x8d, 0xe8, 0xff, 0x95, 0x0a, 0xb9, 0xf9, 0xba, - 0xa7, 0x27, 0xb7, 0x3a, 0x50, 0x91, 0x3c, 0xfd, 0x48, 0xb9, 0x47, 0x52, - 0xb8, 0x72, 0x4e, 0xa5, 0xd7, 0x08, 0x9f, 0xed, 0xe3, 0x44, 0xcb, 0x66, - 0x29, 0xc4, 0x83, 0xb7, 0x47, 0xed, 0xf7, 0x9b, 0xc7, 0xad, 0xcb, 0x17, - 0x75, 0x8b, 0xac, 0xd7, 0xe5, 0xf5, 0x2f, 0x5f, 0xc4, 0xc9, 0x2f, 0x9e, - 0xe2, 0x7f, 0x25, 0xcb, 0xa8, 0x68, 0x12, 0xb7, 0x24, 0x1c, 0xda, 0x29, - 0x92, 0x05, 0xbc, 0x82, 0x4f, 0x38, 0xa3, 0xb2, 0x67, 0x2f, 0x94, 0xe0, - 0x6e, 0x2b, 0xd5, 0x84, 0xba, 0x2b, 0xa6, 0x6e, 0x2a, 0x7d, 0x33, 0xa3, - 0x20, 0x1f, 0x72, 0x92, 0x54, 0x68, 0xc8, 0xad, 0x1f, 0xb6, 0xb3, 0x89, - 0x45, 0x44, 0xca, 0xb6, 0x1c, 0xa4, 0x7a, 0xa0, 0x0b, 0xf8, 0x76, 0x7f, - 0x8d, 0xe8, 0xe8, 0x09, 0xda, 0x69, 0xc0, 0x6c, 0xc9, 0xd1, 0x8a, 0x21, - 0x6b, 0x7d, 0x16, 0xac, 0xa2, 0x50, 0x9b, 0xab, 0x1f, 0x99, 0x76, 0x91, - 0xbd, 0xa0, 0xde, 0xbe, 0x7b, 0x3d, 0x9c, 0x0c, 0x4b, 0xf5, 0xbf, 0xb2, - 0x24, 0x55, 0xd6, 0x84, 0xc5, 0xc7, 0xa2, 0x95, 0x46, 0xbd, 0x45, 0x4e, - 0x73, 0x12, 0x7b, 0x92, 0x06, 0x68, 0x07, 0xda, 0x84, 0x6f, 0x82, 0x94, - 0xb0, 0xf6, 0x6d, 0xbf, 0x0c, 0xee, 0xe5, 0x19, 0xa2, 0x22, 0x4d, 0x2f, - 0x7f, 0x48, 0xf1, 0x78, 0xb0, 0x93, 0x12, 0x89, 0x86, 0x98, 0xc9, 0x1b, - 0x16, 0x38, 0xb9, 0x0e, 0xb1, 0x9a, 0xb2, 0x0d, 0xd2, 0x21, 0x8c, 0xb9, - 0x2b, 0xc9, 0x7d, 0x05, 0xb7, 0xbf, 0x36, 0x54, 0x91, 0x4f, 0x32, 0xbe, - 0xf8, 0x9c, 0xd0, 0x12, 0xb2, 0x9e, 0x03, 0xc3, 0x7a, 0xa6, 0xdf, 0x28, - 0x78, 0xe2, 0x53, 0x97, 0xa8, 0xf4, 0xc4, 0xef, 0xc7, 0x9f, 0x1d, 0xfd, - 0x3b, 0x91, 0x19, 0xcd, 0xb9, 0xe3, 0xc9, 0x8b, 0x2f, 0x77, 0x56, 0x9d, - 0x75, 0xc8, 0x7e, 0xf3, 0x08, 0xb6, 0x65, 0xcc, 0x96, 0x83, 0xfc, 0xb7, - 0x17, 0xa3, 0xdb, 0xe3, 0x7e, 0x20, 0x69, 0xbb, 0x92, 0x8f, 0x4e, 0x4e, - 0x00, 0x80, 0x67, 0x0f, 0xf4, 0xfa, 0x4e, 0x8a, 0x74, 0xe4, 0xf1, 0x68, - 0x50, 0x3c, 0x0f, 0x11, 0xfd, 0xaf, 0x2f, 0x6e, 0x9e, 0x42, 0xe6, 0x24, - 0xf8, 0x72, 0x4f, 0x5f, 0x77, 0x7d, 0x32, 0xf3, 0x67, 0x8b, 0x13, 0xef, - 0x8e, 0x57, 0x28, 0x6a, 0x83, 0x63, 0x6e, 0x27, 0x2a, 0xf7, 0xda, 0x9d, - 0x09, 0xa2, 0xdb, 0xac, 0x81, 0x95, 0x2c, 0xde, 0xb1, 0x53, 0xc6, 0x93, - 0xf0, 0xc4, 0x33, 0x9f, 0x2d, 0x77, 0x5a, 0x1c, 0x02, 0x64, 0x77, 0xe3, - 0xf8, 0x10, 0xda, 0x2f, 0x46, 0x1a, 0x3f, 0xa8, 0xb0, 0x92, 0x96, 0x51, - 0x15, 0xb3, 0x1d, 0x2f, 0x08, 0x37, 0x42, 0xd1, 0xc9, 0x51, 0x02, 0xae, - 0xeb, 0x8b, 0x97, 0x35, 0x1b, 0x7f, 0xdb, 0xea, 0x77, 0xf9, 0xc7, 0x3a, - 0x80, 0x45, 0xa1, 0xca, 0xcc, 0x36, 0x5d, 0x6b, 0x7e, 0xc4, 0xa7, 0x50, - 0x8b, 0xac, 0xcd, 0xce, 0x5b, 0x4c, 0x55, 0x46, 0x02, 0xa8, 0x56, 0x81, - 0x3d, 0x29, 0x70, 0xe9, 0xe9, 0x14, 0xb7, 0xfe, 0x4a, 0xad, 0x46, 0xe4, - 0x3c, 0x4f, 0x88, 0x68, 0x04, 0xf1, 0x8e, 0x57, 0xbf, 0xbc, 0xde, 0x55, - 0xf3, 0xbc, 0x0d, 0x23, 0xc4, 0xc9, 0xe0, 0x41, 0xe0, 0x56, 0xc5, 0x07, - 0xbb, 0x45, 0x22, 0xe4, 0x65, 0xa7, 0x23, 0x0f, 0x87, 0xed, 0xf7, 0xdf, - 0x6d, 0x98, 0xb4, 0xb9, 0x47, 0x18, 0x60, 0xae, 0x3f, 0xd3, 0xa8, 0xe2, - 0x61, 0x5b, 0xb2, 0x20, 0x2e, 0x0d, 0x9d, 0x83, 0xd4, 0x7b, 0x1e, 0xe9, - 0x7a, 0xb3, 0x76, 0x48, 0x37, 0x23, 0x77, 0xd5, 0x2b, 0x8c, 0x40, 0x86, - 0x78, 0xa8, 0xdd, 0xa1, 0x76, 0x72, 0x50, 0x74, 0xa2, 0xa0, 0x28, 0x82, - 0x7b, 0xda, 0x74, 0x29, 0x69, 0xdf, 0x38, 0xc0, 0xe6, 0x2f, 0xc0, 0x06, - 0x2d, 0x06, 0x50, 0x73, 0x4f, 0xc1, 0xfb, 0x35, 0xf4, 0xa7, 0x4b, 0x5e, - 0xe2, 0x2d, 0x40, 0x87, 0x00, 0x32, 0xaa, 0x92, 0xd1, 0xf6, 0xfb, 0xd2, - 0x03, 0xbc, 0x1a, 0x95, 0x66, 0x34, 0x9d, 0xcc, 0x12, 0x43, 0x48, 0xe7, - 0x40, 0xdf, 0x11, 0xe6, 0x87, 0x43, 0x50, 0xf0, 0x9c, 0x51, 0xbe, 0x1b, - 0x4c, 0x5b, 0x3a, 0x04, 0x45, 0xf4, 0x08, 0xc7, 0x3f, 0x8e, 0xc5, 0x5b, - 0x32, 0xa3, 0xcd, 0xe9, 0xae, 0x77, 0xd0, 0x13, 0xdb, 0x10, 0xcf, 0x32, - 0x0b, 0xe2, 0x93, 0xe0, 0x55, 0xf3, 0x34, 0xbc, 0xf5, 0xc1, 0x93, 0xee, - 0x86, 0x45, 0xd6, 0x58, 0xc6, 0xbf, 0x27, 0x5e, 0xac, 0xba, 0x98, 0xfc, - 0xf9, 0xb5, 0x10, 0x75, 0xeb, 0x90, 0x9f, 0x8b, 0xfb, 0x57, 0xd8, 0x81, - 0xe8, 0xfa, 0xcd, 0x1e, 0x1f, 0x2d, 0x98, 0xe3, 0x6f, 0x29, 0xad, 0xdb, - 0x02, 0x86, 0x04, 0xac, 0x57, 0x09, 0x0c, 0xe2, 0xda, 0xf8, 0x17, 0x65, - 0x43, 0x9a, 0x7e, 0xd3, 0x66, 0x9a, 0x21, 0x8a, 0x83, 0x72, 0xee, 0xcd, - 0xa6, 0x01, 0x4c, 0xc7, 0xe1, 0xf4, 0x56, 0x89, 0xa8, 0xea, 0x74, 0x22, - 0xea, 0xc4, 0xb5, 0xbd, 0xd3, 0xfa, 0x91, 0x8d, 0x97, 0x02, 0x91, 0x7f, - 0xc7, 0x35, 0xda, 0xef, 0x09, 0x7f, 0x4f, 0x02, 0xc4, 0xf0, 0x98, 0x76, - 0xe6, 0xca, 0xe5, 0x2d, 0xf6, 0x6a, 0x54, 0xdc, 0x92, 0x33, 0x06, 0x1d, - 0xce, 0x93, 0x2e, 0x8d, 0xfb, 0x92, 0x5b, 0x23, 0x8b, 0xc2, 0xb0, 0x00, - 0xd8, 0x97, 0xb7, 0x2b, 0x0c, 0xed, 0x07, 0xec, 0x0a, 0x7f, 0xfc, 0xbd, - 0xd8, 0xdb, 0x0f, 0xc2, 0xdd, 0x6e, 0xff, 0x27, 0x01, 0xdd, 0x4c, 0x3d, - 0x27, 0x7d, 0x89, 0xfc, 0xf3, 0x90, 0xb6, 0x74, 0x3c, 0xde, 0xfb, 0x5c, - 0x07, 0x92, 0xfe, 0x3b, 0x47, 0x7c, 0xcc, 0x2b, 0xd5, 0x99, 0x41, 0xa7, - 0x34, 0x50, 0xfe, 0x0d, 0x62, 0xad, 0x25, 0xb1, 0xf6, 0x88, 0xf6, 0x54, - 0xe4, 0x9a, 0xdd, 0x2a, 0xc5, 0xcd, 0xfe, 0xe0, 0x37, 0xa0, 0xb5, 0x68, - 0x7c, 0x2a, 0xcf, 0x74, 0x68, 0x4f, 0x6b, 0xa2, 0xdd, 0xf1, 0x49, 0xe7, - 0x54, 0x21, 0xa1, 0x17, 0x1c, 0xaa, 0xab, 0x76, 0x6b, 0xe7, 0xaf, 0xde, - 0xd4, 0x44, 0x6c, 0x2b, 0x5c, 0xf7, 0x58, 0x24, 0x14, 0xbb, 0x28, 0x0c, - 0xa7, 0x30, 0x6d, 0x94, 0x40, 0xb1, 0x13, 0x79, 0xf9, 0x23, 0xab, 0xc6, - 0x6d, 0x3c, 0xbc, 0xcf, 0x27, 0x24, 0x1e, 0x92, 0xba, 0xb8, 0x21, 0x39, - 0x3c, 0x41, 0x09, 0xe9, 0x30, 0x84, 0x26, 0x32, 0xfb, 0x67, 0xbd, 0x7e, - 0xa1, 0x83, 0xf6, 0xa9, 0xb7, 0x70, 0xa0, 0x99, 0xa3, 0xc4, 0xcf, 0x2c, - 0x14, 0x21, 0x49, 0x5a, 0x18, 0xa4, 0x50, 0xf7, 0x56, 0x0d, 0xd4, 0x2a, - 0x04, 0x34, 0xe0, 0xec, 0xbf, 0x34, 0x52, 0x34, 0x0f, 0x34, 0x4e, 0x50, - 0x0b, 0xf1, 0x5d, 0x74, 0x7e, 0x34, 0x0d, 0x25, 0xf7, 0x06, 0x12, 0x9b, - 0x6d, 0x31, 0x65, 0xef, 0x31, 0x71, 0xcf, 0x29, 0xe2, 0xc8, 0x6a, 0x61, - 0x12, 0xf0, 0x92, 0x1a, 0x73, 0x87, 0xb3, 0xd0, 0x89, 0x21, 0x56, 0xe0, - 0xe0, 0x52, 0x05, 0x85, 0x67, 0x78, 0x8b, 0x35, 0x31, 0xd5, 0xd5, 0x12, - 0x56, 0xdc, 0xc1, 0x6a, 0x57, 0x7d, 0xb0, 0x23, 0xa5, 0xbf, 0xa0, 0xf4, - 0xf5, 0x6c, 0x6c, 0x8c, 0xb7, 0x5d, 0x82, 0xa5, 0x87, 0x5d, 0x76, 0x1b, - 0xc7, 0x9e, 0xfe, 0x72, 0xe9, 0xe8, 0xb0, 0xf9, 0x8f, 0x5b, 0x00, 0xf5, - 0x46, 0xb5, 0xd1, 0x8c, 0x9c, 0xb3, 0x3d, 0xa3, 0xb9, 0x81, 0x9a, 0x54, - 0x33, 0xa3, 0x44, 0x75, 0xc6, 0x6a, 0xfe, 0x52, 0x5a, 0xf0, 0xb1, 0x92, - 0x3c, 0xa8, 0x0c, 0x61, 0x2d, 0xe4, 0x63, 0xda, 0x9f, 0x42, 0x3e, 0x32, - 0x59, 0x15, 0x65, 0x4a, 0xe5, 0x3c, 0x30, 0xc9, 0x39, 0xf7, 0x86, 0xcf, - 0x5b, 0x2d, 0x33, 0xe9, 0x27, 0x8c, 0xc0, 0xc1, 0xeb, 0xc9, 0xb4, 0x32, - 0xe4, 0xd2, 0xc4, 0xda, 0x6f, 0x33, 0xbc, 0xc0, 0x57, 0x90, 0x48, 0x22, - 0xce, 0x27, 0xf0, 0xee, 0xc2, 0xd1, 0x77, 0x6f, 0xa4, 0xc1, 0xd7, 0xe8, - 0xe0, 0x04, 0xfe, 0x79, 0x1f, 0xbd, 0xfe, 0x45, 0x29, 0x94, 0xc8, 0x31, - 0x1d, 0xe2, 0x0d, 0x41, 0xb2, 0x9d, 0x91, 0x95, 0xfe, 0xaa, 0x21, 0x33, - 0xee, 0xe0, 0x9d, 0x1d, 0x5c, 0x83, 0x37, 0x7e, 0x3e, 0x10, 0xcd, 0x02, - 0x40, 0x42, 0x7f, 0xa2, 0x20, 0xbe, 0xf3, 0x10, 0x35, 0x27, 0x8b, 0x75, - 0xcb, 0x9a, 0xee, 0xe9, 0x2f, 0x87, 0x26, 0x54, 0xc8, 0xf4, 0x4c, 0x78, - 0x29, 0xe8, 0xee, 0x7a, 0x00, 0x82, 0x69, 0x12, 0xba, 0x36, 0xf6, 0x8c, - 0x76, 0x1d, 0x53, 0x91, 0xee, 0x15, 0xb9, 0x82, 0xd8, 0x68, 0x81, 0x4d, - 0xf4, 0x09, 0xc1, 0x61, 0xbb, 0xa2, 0xde, 0x73, 0x53, 0x19, 0x8d, 0x4f, - 0x94, 0xaa, 0x18, 0x1b, 0x8e, 0x0d, 0x74, 0x01, 0xc7, 0x58, 0x59, 0xfd, - 0xbd, 0x24, 0x08, 0x19, 0xfa, 0xa4, 0xe8, 0x14, 0x2f, 0x02, 0x9e, 0x3b, - 0x8f, 0x66, 0x5d, 0x53, 0x95, 0xdc, 0x6b, 0xc4, 0xdd, 0x35, 0x1a, 0xf4, - 0x26, 0x59, 0x97, 0x8d, 0xbb, 0x63, 0xec, 0x58, 0x21, 0xbb, 0x88, 0x73, - 0x90, 0xb5, 0x2d, 0xd1, 0xc7, 0xe1, 0x28, 0x28, 0xb6, 0xb9, 0xe1, 0x25, - 0x50, 0x6f, 0x91, 0x3e, 0x5e, 0x40, 0xb8, 0x6a, 0x92, 0x72, 0x8f, 0xb3, - 0x17, 0x61, 0x5f, 0x33, 0x90, 0x68, 0xdd, 0x51, 0xcf, 0xd2, 0x68, 0x81, - 0x78, 0xae, 0xe0, 0x83, 0x4c, 0xba, 0x0c, 0x0f, 0xe4, 0x0e, 0xea, 0x33, - 0xbe, 0x2d, 0x76, 0x6a, 0xb0, 0xa7, 0xa5, 0xe6, 0x96, 0x9e, 0x16, 0x7f, - 0xf1, 0xe5, 0xa7, 0xf8, 0x97, 0xf6, 0x56, 0x5a, 0x96, 0x29, 0x65, 0x0f, - 0xc7, 0xef, 0x8d, 0x19, 0x03, 0x4a, 0xe6, 0xfd, 0xdc, 0x92, 0x22, 0x69, - 0x3c, 0x8e, 0x19, 0xe6, 0x9c, 0xd7, 0x59, 0xde, 0x5c, 0x89, 0xfe, 0xa6, - 0xc8, 0xd3, 0x52, 0x29, 0x88, 0x19, 0x81, 0xbc, 0xcf, 0x6f, 0x99, 0xdf, - 0x8c, 0x1e, 0xdf, 0x9e, 0xb2, 0x8e, 0x8f, 0x8f, 0x34, 0x15, 0x75, 0xed, - 0x95, 0xca, 0x6f, 0xab, 0x9a, 0x5e, 0x70, 0x20, 0x0b, 0x07, 0x44, 0x55, - 0x72, 0x26, 0x62, 0x4d, 0xcf, 0xfa, 0x4e, 0x76, 0x8c, 0xdb, 0x4f, 0x33, - 0x4d, 0xdf, 0xae, 0x74, 0x31, 0x72, 0x6c, 0xec, 0x84, 0x4b, 0x60, 0x8c, - 0x26, 0xa3, 0x0b, 0xa9, 0x91, 0x0b, 0xb6, 0x2c, 0x78, 0x10, 0x02, 0x3b, - 0x9d, 0xcc, 0xe8, 0x66, 0x9d, 0x49, 0x9f, 0x0f, 0xea, 0xc1, 0x2d, 0xac, - 0xe7, 0x9f, 0xf4, 0xbf, 0x1f, 0xe2, 0x7d, 0x4d, 0xba, 0xcc, 0x41, 0x9a, - 0xda, 0xce, 0xba, 0x5c, 0x7d, 0x14, 0x5d, 0x2c, 0xa2, 0x8b, 0xcd, 0x0e, - 0x79, 0xfb, 0xcf, 0x13, 0xb5, 0x50, 0x0b, 0xe6, 0x3e, 0x7c, 0xf3, 0x3c, - 0x7e, 0x4b, 0x54, 0x12, 0x3f, 0x44, 0xc7, 0xdf, 0xba, 0xd8, 0x8d, 0xcb, - 0xcb, 0xe3, 0x1a, 0x56, 0xe9, 0xd0, 0xdf, 0x21, 0xc2, 0x7b, 0xd0, 0x83, - 0x36, 0xc9, 0x45, 0x4e, 0xf7, 0x2b, 0xbe, 0x0d, 0x75, 0x31, 0xd6, 0x38, - 0x9f, 0x23, 0xe4, 0x3b, 0xf9, 0x49, 0x52, 0x99, 0xa5, 0xa0, 0xa9, 0x3b, - 0x6a, 0x78, 0x1f, 0xbe, 0x53, 0x94, 0x32, 0x80, 0xae, 0xd0, 0x41, 0xee, - 0x1c, 0xec, 0xc0, 0xb9, 0x38, 0xfa, 0x57, 0x05, 0x1b, 0x9e, 0xbf, 0x45, - 0xc9, 0xda, 0xb3, 0xc1, 0x25, 0x09, 0x90, 0x61, 0x4d, 0xe7, 0x79, 0x7b, - 0xa9, 0x53, 0xa8, 0x88, 0x93, 0x32, 0xea, 0xb9, 0x7e, 0x34, 0x0d, 0xeb, - 0xdd, 0x9c, 0x09, 0x24, 0x4a, 0x61, 0xf6, 0x46, 0x33, 0x4a, 0xcd, 0x07, - 0x77, 0x6e, 0x2a, 0x10, 0x22, 0xa4, 0x05, 0xc1, 0x27, 0xd6, 0x2d, 0x60, - 0xe4, 0x25, 0x80, 0x78, 0x5c, 0xe7, 0x6b, 0xc0, 0xee, 0x75, 0xdf, 0x5d, - 0xa7, 0x45, 0xbf, 0x8b, 0xa7, 0x60, 0xf4, 0x3e, 0xde, 0x21, 0x3e, 0x0b, - 0x08, 0xff, 0xf7, 0xfe, 0x4e, 0x1b, 0x38, 0x8b, 0xc4, 0x26, 0x85, 0x10, - 0x44, 0x89, 0xd3, 0x62, 0xe4, 0xf8, 0xbf, 0x9e, 0xf1, 0xbe, 0x4f, 0x2e, - 0x91, 0xd2, 0x89, 0x6d, 0xbb, 0xe9, 0x64, 0xd0, 0xf3, 0xda, 0x11, 0x36, - 0x0e, 0xe5, 0x71, 0x8d, 0x12, 0xe3, 0xd1, 0xbf, 0xea, 0x9d, 0x40, 0xbc, - 0x76, 0xe2, 0x08, 0x31, 0xc2, 0x27, 0xb5, 0xf2, 0xba, 0x0b, 0xfc, 0x2c, - 0x2c, 0x96, 0x62, 0x53, 0xaf, 0x78, 0x03, 0xbf, 0xad, 0xd8, 0xac, 0x88, - 0x2d, 0xd4, 0xad, 0x7d, 0x77, 0xa9, 0x34, 0xbf, 0x0c, 0x60, 0x1c, 0x59, - 0x24, 0x31, 0xad, 0xaa, 0x3b, 0x37, 0xd5, 0x57, 0x39, 0xe8, 0xd5, 0xff, - 0x62, 0xea, 0x82, 0x8c, 0x6f, 0x71, 0xeb, 0xa0, 0x05, 0x67, 0xb4, 0x62, - 0x96, 0xe9, 0x00, 0xa1, 0xcd, 0x79, 0x5c, 0x1e, 0x0f, 0x52, 0xcc, 0xd3, - 0xdc, 0x9c, 0x94, 0xd4, 0x38, 0xc2, 0x81, 0xb9, 0x3c, 0xa9, 0x0e, 0xa8, - 0xc1, 0x07, 0x42, 0xc3, 0x6a, 0xe5, 0xbe, 0x67, 0xe2, 0xf2, 0x9e, 0xc9, - 0x54, 0x3d, 0xc6, 0xc8, 0x76, 0x51, 0x66, 0x2a, 0xf1, 0x6f, 0x61, 0x70, - 0xe8, 0xcd, 0x5b, 0x99, 0x20, 0x9f, 0x34, 0xe7, 0xb1, 0x80, 0x02, 0xdd, - 0x41, 0x6e, 0x17, 0x5e, 0x6a, 0xea, 0xcc, 0x79, 0x7d, 0xdb, 0x3f, 0x93, - 0xfd, 0xb5, 0x3d, 0xbc, 0xcb, 0x46, 0x4d, 0x06, 0x59, 0x8d, 0x9b, 0x61, - 0xb9, 0x39, 0xd2, 0x46, 0x76, 0x7c, 0x6b, 0x1e, 0x00, 0x3e, 0x8a, 0x60, - 0x7b, 0x10, 0xac, 0x1d, 0x2b, 0xc5, 0xa5, 0x19, 0x41, 0xcc, 0x5b, 0x26, - 0x60, 0x94, 0x62, 0xde, 0xf4, 0xcc, 0xaa, 0xaa, 0xf7, 0x3f, 0x0e, 0x62, - 0xc3, 0x07, 0x01, 0xc7, 0x88, 0x2c, 0x81, 0x8f, 0x9b, 0xd8, 0x48, 0xee, - 0x4a, 0xe5, 0xe2, 0xd3, 0xfa, 0xb9, 0xac, 0x61, 0x6f, 0x0f, 0x1e, 0x66, - 0x77, 0xdf, 0x17, 0xe1, 0x2b, 0x2c, 0x4e, 0x50, 0x3e, 0xe6, 0x2d, 0x68, - 0x46, 0xb5, 0x5f, 0xf6, 0x46, 0xbe, 0xc9, 0x63, 0x45, 0xf9, 0x33, 0xd4, - 0xa3, 0xa8, 0x5c, 0xd3, 0xc8, 0xc7, 0x70, 0x73, 0x61, 0x4a, 0xbd, 0x04, - 0xa6, 0x80, 0x0b, 0xca, 0x21, 0x5c, 0x7f, 0x83, 0x90, 0x80, 0x9c, 0x97, - 0x85, 0x34, 0x11, 0xf8, 0xb7, 0x27, 0x09, 0x7b, 0x0f, 0x61, 0xf5, 0xd4, - 0xf9, 0xc0, 0x0d, 0x22, 0x36, 0xfb, 0xa4, 0xda, 0xa0, 0xb8, 0x41, 0xf1, - 0xcd, 0xa1, 0x8b, 0x05, 0x9f, 0xb8, 0xce, 0xe2, 0x2a, 0x22, 0xbf, 0x8d, - 0x76, 0x14, 0xbd, 0x8f, 0xa0, 0x97, 0x46, 0x2b, 0x0b, 0x0e, 0xa1, 0x38, - 0x9f, 0xcb, 0x75, 0x4b, 0x0c, 0x2a, 0x07, 0xa0, 0x3f, 0x99, 0xa1, 0xca, - 0x3b, 0x1c, 0x37, 0x2a, 0xd9, 0xd5, 0x69, 0xf8, 0x70, 0xb2, 0x8c, 0xc8, - 0x1a, 0x79, 0x46, 0xe1, 0xb4, 0x0f, 0x47, 0x46, 0xdf, 0xe7, 0xac, 0xdb, - 0x3e, 0xb4, 0x6f, 0xb8, 0xca, 0x1c, 0xc0, 0x2b, 0x6d, 0x5b, 0xda, 0xc9, - 0xb8, 0xa4, 0xd8, 0xc0, 0x67, 0x1b, 0xa1, 0x89, 0xc2, 0xaf, 0xfb, 0xec, - 0xcf, 0xfa, 0xe3, 0xcf, 0xe3, 0x11, 0x5b, 0xe6, 0xf5, 0x99, 0x6e, 0x6e, - 0x08, 0x30, 0xa7, 0xce, 0x32, 0x4b, 0x64, 0x9f, 0x45, 0x8e, 0x7a, 0x7f, - 0x11, 0x80, 0xda, 0x8d, 0x81, 0xf9, 0xa5, 0xf1, 0x28, 0xd3, 0x84, 0x5c, - 0x73, 0x4e, 0x8a, 0x77, 0x1a, 0x76, 0xa9, 0x24, 0x83, 0x81, 0xdd, 0x8c, - 0x21, 0x1b, 0xb4, 0x8e, 0x8f, 0x2e, 0x8b, 0x6a, 0xb5, 0x84, 0x94, 0x98, - 0x02, 0xd9, 0x4b, 0xe4, 0xe9, 0xa4, 0x7d, 0xf5, 0x47, 0x76, 0x1a, 0xff, - 0xa6, 0x48, 0x6d, 0xf3, 0xd3, 0x8c, 0x73, 0x43, 0x34, 0x80, 0xbd, 0x70, - 0x5d, 0x3f, 0x6b, 0xfc, 0x19, 0x6f, 0xcf, 0xa7, 0xc8, 0x85, 0xf8, 0xab, - 0x78, 0x2b, 0x69, 0xe3, 0x16, 0x18, 0x15, 0x1c, 0x27, 0x32, 0xda, 0x96, - 0x1c, 0xb9, 0xa8, 0xae, 0x8e, 0xb1, 0x37, 0xdc, 0xd3, 0xb7, 0x62, 0xed, - 0xc3, 0x00, 0x89, 0xc1, 0xab, 0xc3, 0xdc, 0x5f, 0x73, 0xbb, 0x81, 0xb3, - 0x3f, 0x00, 0x2b, 0xdf, 0xe8, 0x30, 0xe9, 0xea, 0x6b, 0x77, 0xf8, 0xd7, - 0x75, 0x47, 0x68, 0xf8, 0xc9, 0x2e, 0x7f, 0x11, 0x83, 0x36, 0x9e, 0x15, - 0xce, 0xf6, 0xaa, 0x4d, 0x1b, 0x77, 0xa0, 0x5d, 0x2a, 0x48, 0xe9, 0xeb, - 0x86, 0xeb, 0xbe, 0x6a, 0x8c, 0x23, 0x55, 0x1c, 0xdc, 0x8e, 0x52, 0xfe, - 0x9f, 0x89, 0xde, 0xfa, 0x4e, 0xda, 0x3e, 0x88, 0xb3, 0x50, 0xc6, 0x17, - 0xba, 0x0f, 0x39, 0x15, 0xc9, 0x9a, 0xd8, 0x55, 0x11, 0xa6, 0x11, 0xe2, - 0x37, 0x94, 0xf0, 0xcb, 0x18, 0x6f, 0xb2, 0x42, 0xa3, 0x7e, 0x4e, 0xdd, - 0x02, 0x6e, 0x96, 0x8a, 0xb7, 0x05, 0x75, 0x99, 0xf8, 0x79, 0x49, 0xd5, - 0x8d, 0x89, 0xbb, 0xd5, 0xed, 0x65, 0x54, 0x18, 0x14, 0x81, 0x30, 0xad, - 0x22, 0xa6, 0xb5, 0x8e, 0x08, 0x77, 0x36, 0x64, 0x7d, 0xb2, 0x4f, 0x27, - 0xcd, 0x63, 0xf1, 0xca, 0x65, 0x13, 0x49, 0xc2, 0xdb, 0x17, 0xa9, 0x29, - 0x27, 0x11, 0x9b, 0x24, 0x59, 0x17, 0xd9, 0x79, 0xfb, 0x1a, 0xab, 0x79, - 0xbf, 0x13, 0xc0, 0xd4, 0x0a, 0xbe, 0x41, 0x88, 0x66, 0x5d, 0xb0, 0xb8, - 0xba, 0x40, 0x0c, 0xc9, 0x95, 0xba, 0xcd, 0x84, 0x95, 0xc7, 0x18, 0x0a, - 0xc9, 0x4b, 0x01, 0xbf, 0x2e, 0x67, 0x61, 0x13, 0x19, 0x3c, 0x2b, 0x68, - 0xe6, 0x74, 0x89, 0x11, 0x15, 0xc5, 0xda, 0xf3, 0xc1, 0x6d, 0x72, 0xcd, - 0x22, 0xa5, 0x2b, 0xe1, 0x97, 0x9c, 0x95, 0x16, 0xf2, 0x86, 0x92, 0x3c, - 0xfe, 0xdf, 0xbe, 0x83, 0x08, 0xa3, 0x53, 0x52, 0xcf, 0x0c, 0x6e, 0x57, - 0xe2, 0x2f, 0x88, 0x78, 0xf8, 0x78, 0x1a, 0xb7, 0x32, 0x6d, 0x02, 0xdd, - 0x45, 0xf5, 0x7c, 0x8a, 0x05, 0xb8, 0x87, 0x1a, 0x6f, 0x2d, 0x13, 0x88, - 0x69, 0x87, 0x12, 0x98, 0x63, 0x94, 0xce, 0x90, 0xf0, 0x7f, 0x2d, 0x13, - 0x1a, 0x2e, 0x5a, 0xb0, 0x5b, 0xe8, 0x85, 0xd5, 0x64, 0x62, 0x1d, 0x54, - 0x9a, 0x54, 0xe2, 0x7c, 0xa1, 0x5d, 0xa6, 0x78, 0x54, 0xee, 0x61, 0x81, - 0x2d, 0x46, 0xcb, 0x63, 0x23, 0x92, 0x1a, 0x6a, 0x08, 0x0d, 0x12, 0xc4, - 0xba, 0x20, 0xd5, 0x55, 0xd2, 0xb0, 0x84, 0x58, 0x4e, 0x96, 0x4d, 0xf7, - 0xa3, 0xbd, 0x11, 0xe1, 0x9b, 0xc6, 0x03, 0xcd, 0x06, 0x23, 0x53, 0xa8, - 0xce, 0x1f, 0xaa, 0x94, 0xaa, 0x4c, 0xed, 0x39, 0xa3, 0x1a, 0x99, 0x02, - 0xae, 0x43, 0xcd, 0x50, 0x8d, 0x40, 0xe6, 0x0c, 0xdc, 0xec, 0x25, 0xcd, - 0x97, 0x9a, 0x66, 0xdb, 0xe2, 0x8b, 0x37, 0x89, 0xa4, 0x75, 0x5d, 0x95, - 0x38, 0xa4, 0xf1, 0x59, 0xcf, 0x0e, 0x2b, 0x2a, 0x1f, 0x2a, 0xf8, 0x17, - 0xf1, 0xbf, 0x81, 0x90, 0xa5, 0x73, 0xc0, 0xc5, 0xf0, 0x55, 0x28, 0xc5, - 0x77, 0x18, 0x41, 0x56, 0x23, 0x21, 0x4a, 0x7a, 0x6d, 0xb4, 0x9e, 0x29, - 0x60, 0x3b, 0xf4, 0x22, 0x4f, 0x1b, 0x08, 0x34, 0x2e, 0xe6, 0xbf, 0x92, - 0xa5, 0x01, 0x0b, 0x17, 0x8b, 0xe5, 0xb9, 0x31, 0x7d, 0xef, 0xcf, 0x70, - 0x59, 0xb6, 0x7f, 0xdd, 0x76, 0xd8, 0x01, 0x69, 0x3e, 0x0b, 0x07, 0x04, - 0x44, 0x38, 0x2a, 0x03, 0x8e, 0xd0, 0x07, 0x46, 0x1f, 0xc9, 0x7d, 0x81, - 0x26, 0xc1, 0x2b, 0x38, 0xa9, 0xfc, 0xee, 0x85, 0x40, 0xac, 0xab, 0xcd, - 0xe4, 0x6e, 0xca, 0xd0, 0x93, 0xe1, 0x66, 0xf9, 0x0d, 0x83, 0x11, 0xaf, - 0xe0, 0x1d, 0xd2, 0x68, 0x10, 0xee, 0x4b, 0x6a, 0xbf, 0x41, 0x2f, 0xd4, - 0xeb, 0x4c, 0xe2, 0x9d, 0xdc, 0xa3, 0xb3, 0xdb, 0x76, 0x4f, 0x95, 0x83, - 0x3e, 0x88, 0xfc, 0xdc, 0x37, 0xec, 0x07, 0x71, 0x56, 0x34, 0x04, 0xe2, - 0xea, 0x98, 0x1c, 0x09, 0x9f, 0xd5, 0x22, 0xf0, 0x15, 0x47, 0x64, 0xbc, - 0xe9, 0x82, 0x42, 0xaa, 0x84, 0xc2, 0x0a, 0x56, 0x86, 0x99, 0xe4, 0x69, - 0x11, 0xe0, 0xf3, 0x5e, 0x5b, 0x88, 0x45, 0x27, 0x87, 0x85, 0xfd, 0xfa, - 0x5e, 0xa0, 0xbc, 0x88, 0xdb, 0xc3, 0x07, 0xff, 0x35, 0xe2, 0x39, 0x76, - 0x2a, 0x22, 0x0d, 0x92, 0x32, 0xfb, 0x5a, 0x0c, 0x66, 0x76, 0x82, 0xa8, - 0x61, 0x33, 0x51, 0x15, 0x9a, 0x10, 0x59, 0x6f, 0xef, 0x50, 0xa3, 0x55, - 0xe1, 0x11, 0x58, 0xd5, 0xca, 0x54, 0x03, 0x85, 0x72, 0x90, 0xd8, 0xe1, - 0x1e, 0x22, 0x81, 0x49, 0xc6, 0xb3, 0xe1, 0x2e, 0xfa, 0x11, 0x7f, 0x4c, - 0x6b, 0x89, 0x9d, 0x58, 0x31, 0x0f, 0x80, 0xbd, 0xb5, 0x55, 0x05, 0x1c, - 0xd9, 0xe7, 0x94, 0x8e, 0x08, 0x56, 0xde, 0x89, 0x35, 0x60, 0x98, 0xf7, - 0x0d, 0x4e, 0xe5, 0x82, 0x34, 0xe5, 0x9f, 0xd1, 0x37, 0x39, 0xca, 0x62, - 0x2e, 0xf8, 0x57, 0x9c, 0xa5, 0x4d, 0xa9, 0x4a, 0x38, 0x49, 0x4a, 0x4c, - 0xf0, 0x81, 0x9c, 0x40, 0x78, 0xe8, 0x5b, 0x77, 0x1c, 0x41, 0x84, 0xee, - 0xa4, 0x30, 0x9d, 0x92, 0x20, 0x11, 0x4a, 0x31, 0xb7, 0x39, 0x5a, 0xc8, - 0xed, 0x17, 0x80, 0x4f, 0xdc, 0x64, 0xcc, 0xbb, 0x8d, 0x6a, 0x67, 0x70, - 0xbf, 0x04, 0xc2, 0x5c, 0x4a, 0xd5, 0x1a, 0x89, 0xa9, 0x76, 0x4f, 0x4a, - 0x57, 0xa6, 0xba, 0x3b, 0x31, 0xfa, 0x9b, 0xfe, 0xfd, 0x0b, 0xc8, 0x1b, - 0xe0, 0x47, 0x95, 0x7c, 0xcf, 0xbf, 0x7a, 0xef, 0x75, 0xfe, 0xf4, 0x28, - 0x40, 0xff, 0xb4, 0xe9, 0x65, 0xc2, 0x66, 0x3d, 0x22, 0x44, 0x90, 0x6d, - 0xf9, 0x20, 0xc3, 0x29, 0xf2, 0x9f, 0x08, 0x9b, 0xcd, 0xd7, 0xfc, 0xc3, - 0x72, 0x33, 0x7e, 0x4c, 0x73, 0x1a, 0x31, 0x6a, 0xbb, 0x00, 0x93, 0xcd, - 0x09, 0x56, 0x35, 0x74, 0xb3, 0x52, 0x22, 0xda, 0x46, 0x21, 0x21, 0x7c, - 0xb6, 0xc6, 0x1a, 0x8d, 0xe6, 0x96, 0x80, 0x1a, 0xa0, 0xde, 0x8e, 0x1e, - 0x30, 0xaa, 0x8a, 0x80, 0xaa, 0x15, 0x19, 0x3c, 0xb3, 0x5c, 0x8d, 0xae, - 0x02, 0xf1, 0xc8, 0x06, 0x86, 0xaf, 0x29, 0x15, 0x7f, 0x42, 0xa1, 0x73, - 0x8f, 0x9b, 0xe0, 0x4b, 0xae, 0xba, 0xf3, 0x34, 0x5d, 0x43, 0x85, 0x36, - 0x4d, 0xdb, 0x0c, 0x22, 0xfe, 0xdb, 0xcb, 0x58, 0x85, 0xb2, 0x9b, 0x50, - 0x93, 0xba, 0x0d, 0x41, 0x27, 0x1e, 0x2c, 0x3a, 0xe6, 0x4f, 0x94, 0x3c, - 0x43, 0x81, 0x98, 0x55, 0x86, 0x11, 0xeb, 0x59, 0xeb, 0x79, 0x76, 0xc5, - 0x59, 0xe8, 0xca, 0xae, 0xe2, 0x64, 0x84, 0x6a, 0x64, 0xc0, 0x1f, 0xc0, - 0xa8, 0xb2, 0xcb, 0x79, 0xc1, 0xfc, 0xa0, 0x2c, 0x26, 0x82, 0x55, 0xa0, - 0x31, 0x2f, 0x0a, 0xde, 0x73, 0x54, 0x3a, 0x8a, 0x28, 0xf5, 0xd0, 0xe6, - 0xe0, 0xdd, 0xdc, 0x59, 0x43, 0x29, 0x7c, 0xba, 0x12, 0x60, 0xdf, 0x34, - 0xa7, 0x59, 0x2d, 0x3d, 0xab, 0x9a, 0xf2, 0x18, 0x19, 0x7d, 0x68, 0x3b, - 0xe0, 0xae, 0x45, 0x26, 0x54, 0x6d, 0x4f, 0xd0, 0xd4, 0xbf, 0x62, 0x8f, - 0xda, 0xbb, 0xfe, 0xd4, 0xf4, 0xf2, 0x1c, 0xbb, 0x06, 0xed, 0xc7, 0x1e, - 0x05, 0x16, 0x30, 0x5b, 0xe7, 0x6a, 0x42, 0x6c, 0xa2, 0xc2, 0xd7, 0x22, - 0x97, 0xf2, 0x8d, 0xd4, 0x59, 0x94, 0x37, 0xfa, 0xc1, 0x70, 0xc9, 0x21, - 0x8b, 0x91, 0x44, 0xd1, 0xba, 0xfe, 0xb7, 0xfc, 0x85, 0xde, 0x21, 0x1f, - 0x1d, 0x1f, 0xe8, 0x2a, 0xf0, 0x95, 0x29, 0x1b, 0x55, 0x48, 0x41, 0xe0, - 0x05, 0x3b, 0xf9, 0xb4, 0x6e, 0x41, 0x1e, 0xe6, 0x2d, 0x75, 0x0c, 0x2e, - 0x77, 0xd8, 0xd9, 0x97, 0x82, 0x70, 0x4a, 0xda, 0x6d, 0x75, 0xd6, 0xef, - 0x39, 0xeb, 0x81, 0xff, 0xf5, 0x61, 0xd0, 0x10, 0xf6, 0x6f, 0xa2, 0x0e, - 0xb2, 0xc0, 0x16, 0xd3, 0x27, 0xfd, 0xe2, 0xa1, 0x70, 0x10, 0xf8, 0x26, - 0x4b, 0x04, 0xfa, 0x9e, 0x0b, 0xb8, 0xdc, 0x41, 0x97, 0x0c, 0xe6, 0x2c, - 0xaa, 0x91, 0x5a, 0x22, 0xdb, 0x23, 0x28, 0xe6, 0x4f, 0xfb, 0x00, 0x17, - 0xfb, 0xd5, 0x65, 0x91, 0x22, 0x2d, 0xb6, 0x3c, 0xc6, 0xfb, 0x73, 0xea, - 0x47, 0xe9, 0x34, 0xcd, 0xe5, 0x23, 0xf6, 0x9f, 0x3d, 0x2d, 0xe1, 0x5a, - 0x82, 0x96, 0xb2, 0xec, 0xea, 0x52, 0xe1, 0x09, 0x31, 0x37, 0xe9, 0xb7, - 0xec, 0x4d, 0x34, 0xee, 0xc8, 0xfa, 0x62, 0xf4, 0x8f, 0x22, 0x21, 0xeb, - 0xb9, 0x34, 0x98, 0x8d, 0xf7, 0x55, 0x2a, 0x64, 0x94, 0x7a, 0x1b, 0xf1, - 0x4e, 0x5c, 0xa3, 0x4d, 0xbf, 0xf9, 0xef, 0x34, 0x5f, 0xe4, 0xa4, 0x68, - 0xbb, 0x14, 0xad, 0xde, 0xdd, 0xd0, 0x5c, 0xe4, 0xc5, 0x30, 0x78, 0xe9, - 0xfb, 0x00, 0x8b, 0xdc, 0x74, 0x03, 0x33, 0xfc, 0x6a, 0x71, 0xdb, 0x1e, - 0xa9, 0x4d, 0x61, 0x1e, 0x18, 0xd3, 0x27, 0xa6, 0x93, 0xc9, 0x40, 0x38, - 0xad, 0xa2, 0x47, 0x09, 0x2f, 0x65, 0x94, 0xf8, 0x11, 0xc6, 0xd6, 0xd4, - 0xf7, 0x43, 0x54, 0x85, 0x33, 0x97, 0x1b, 0x22, 0x5d, 0xfa, 0xc7, 0x27, - 0x65, 0xe9, 0xb9, 0x66, 0x9a, 0x8c, 0x53, 0x35, 0x91, 0x5f, 0xb0, 0xfd, - 0x02, 0x5b, 0x01, 0x86, 0xf0, 0x34, 0x45, 0x08, 0xba, 0xa1, 0x72, 0x7f, - 0x8c, 0x7b, 0xcf, 0xc2, 0xf1, 0x1d, 0x29, 0x9f, 0xf5, 0xc9, 0x85, 0x80, - 0x34, 0xc3, 0x36, 0xae, 0x3c, 0x00, 0xea, 0x14, 0x37, 0x80, 0xa0, 0xae, - 0xba, 0x9f, 0xba, 0x9b, 0x56, 0x13, 0xfc, 0x95, 0xf9, 0x1c, 0x08, 0xd3, - 0xbf, 0xfe, 0x4a, 0x48, 0x41, 0x74, 0xb8, 0x84, 0x76, 0x20, 0xd8, 0xf0, - 0x1a, 0xab, 0xdb, 0x20, 0x8e, 0x76, 0xee, 0x8f, 0xb2, 0x9f, 0x61, 0xd5, - 0x13, 0x97, 0x33, 0xde, 0xe1, 0x61, 0x78, 0xd2, 0xa1, 0xfc, 0x7d, 0x11, - 0xc6, 0x85, 0x96, 0x0f, 0xd1, 0x81, 0x1a, 0xea, 0x70, 0x68, 0x10, 0x03, - 0x1f, 0x3d, 0xf0, 0x95, 0x7a, 0x39, 0x13, 0x28, 0x18, 0x46, 0xf1, 0x3e, - 0x28, 0x50, 0xd8, 0x11, 0x99, 0x76, 0xf5, 0x89, 0xbe, 0x1c, 0x15, 0x9b, - 0x85, 0xb4, 0xc9, 0x07, 0x39, 0xfb, 0x42, 0x4b, 0x78, 0x01, 0xdd, 0x34, - 0x0a, 0xad, 0x5e, 0x72, 0x72, 0xc4, 0x0c, 0x0d, 0xcf, 0x20, 0xe1, 0x97, - 0x6d, 0xec, 0xc6, 0x5e, 0xd6, 0xc6, 0x24, 0xbf, 0x17, 0x42, 0x47, 0x1f, - 0xde, 0x62, 0xd0, 0x38, 0xed, 0x99, 0x82, 0xea, 0x5b, 0xe1, 0x20, 0x95, - 0x7c, 0x1b, 0xea, 0xdd, 0x60, 0xa8, 0x65, 0x5d, 0xda, 0xd3, 0x45, 0x65, - 0x38, 0xfb, 0xf5, 0x23, 0xdf, 0x72, 0x9e, 0x7d, 0x32, 0x5a, 0x2b, 0xcc, - 0xfb, 0xec, 0xbd, 0x2b, 0xe4, 0x93, 0x66, 0xcf, 0xef, 0x5a, 0xc5, 0x7d, - 0xa4, 0x55, 0x9e, 0x25, 0x46, 0xc0, 0x28, 0x9d, 0x5e, 0x92, 0xac, 0x22, - 0x6c, 0xdc, 0x2c, 0x69, 0x13, 0xea, 0xd9, 0x35, 0x1c, 0x3f, 0xd0, 0xa4, - 0x37, 0x7a, 0xc4, 0xea, 0xf5, 0x15, 0x3e, 0xa4, 0x8c, 0x94, 0xb6, 0x19, - 0xc8, 0xef, 0xcf, 0x20, 0x70, 0x4b, 0x63, 0x18, 0x79, 0x28, 0x80, 0xef, - 0x8d, 0x83, 0x1c, 0x2f, 0x45, 0xf5, 0x91, 0x40, 0x20, 0xff, 0xbe, 0x8d, - 0x3c, 0x8b, 0xd2, 0xc2, 0x9c, 0x3c, 0xd6, 0x42, 0x16, 0xb5, 0x2f, 0x15, - 0xef, 0x66, 0xe5, 0xfc, 0x6e, 0x53, 0x33, 0x92, 0xff, 0xda, 0x9b, 0x01, - 0x53, 0x08, 0x74, 0x6b, 0xb8, 0xed, 0x32, 0x09, 0xac, 0xe9, 0xe8, 0x7c, - 0x3f, 0x12, 0xb7, 0x22, 0xe5, 0x65, 0xa0, 0x4a, 0x52, 0xcf, 0x8e, 0x09, - 0x77, 0x50, 0xfd, 0x9d, 0xf0, 0x18, 0x7d, 0x8a, 0xf5, 0xf1, 0x91, 0xa6, - 0xe0, 0x59, 0xfe, 0xdb, 0x16, 0x68, 0x62, 0x0d, 0x54, 0xfa, 0x9c, 0x58, - 0xfc, 0x8b, 0x0b, 0x08, 0xd7, 0xb6, 0xa1, 0x64, 0xd1, 0x1d, 0xd1, 0xa6, - 0xab, 0x5a, 0x9c, 0x25, 0x6c, 0x0d, 0x94, 0xfa, 0x5f, 0xdd, 0x28, 0x9b, - 0x0e, 0xd9, 0x94, 0x97, 0xb1, 0xeb, 0xc6, 0xe1, 0xa1, 0x8f, 0x82, 0xe8, - 0x9f, 0x32, 0xc5, 0xdd, 0xda, 0x1f, 0xc9, 0xe0, 0xe3, 0xea, 0x8f, 0xc3, - 0xd8, 0xb3, 0x37, 0x31, 0xd0, 0xb7, 0xac, 0x03, 0xe2, 0x57, 0x62, 0xbf, - 0x93, 0xf4, 0xca, 0xdd, 0x5c, 0xa0, 0x1f, 0x5d, 0xd1, 0x2f, 0x94, 0x3e, - 0x9c, 0xeb, 0xb7, 0xe5, 0xa1, 0xba, 0x3d, 0x70, 0xac, 0xa0, 0xc6, 0x5a, - 0x99, 0x77, 0x60, 0x3f, 0xe7, 0x85, 0x81, 0x52, 0x92, 0x92, 0x98, 0x27, - 0x91, 0xe6, 0xf2, 0xfc, 0x62, 0xf4, 0x06, 0x68, 0x2f, 0xcb, 0x2a, 0x36, - 0x1f, 0xc3, 0xe4, 0x54, 0x99, 0xf0, 0x01, 0x83, 0x84, 0x05, 0x77, 0x58, - 0x73, 0x57, 0x63, 0xe0, 0x69, 0xc7, 0xac, 0xf0, 0xc3, 0x25, 0xdd, 0xe8, - 0x86, 0xa8, 0x00, 0x45, 0x60, 0x05, 0x36, 0x5b, 0x72, 0x7f, 0x77, 0x53, - 0x3d, 0x73, 0x45, 0x2c, 0x7a, 0xeb, 0x8e, 0x58, 0x21, 0xca, 0x4b, 0x52, - 0x8b, 0xa2, 0x2c, 0x78, 0x47, 0xea, 0xa9, 0x6a, 0xd2, 0x33, 0x09, 0x2a, - 0x99, 0x60, 0x1b, 0xe1, 0x9b, 0xe7, 0x56, 0x72, 0xe9, 0x18, 0x42, 0x75, - 0x57, 0x7c, 0x2d, 0x92, 0x5a, 0xcd, 0x1f, 0xc4, 0xa0, 0xd1, 0x04, 0xc2, - 0x98, 0xcb, 0xf7, 0xab, 0xf9, 0xc9, 0x3d, 0x7c, 0xc4, 0x99, 0xd0, 0xf1, - 0xc1, 0x70, 0x1f, 0xe9, 0x83, 0x08, 0x0f, 0xc6, 0x0d, 0x02, 0xb1, 0xc8, - 0xf6, 0xcf, 0xa0, 0xb4, 0xb0, 0xdf, 0x5e, 0x50, 0xc2, 0xd4, 0x95, 0x4f, - 0x13, 0xea, 0x35, 0x0a, 0xa7, 0xeb, 0x48, 0xf2, 0x56, 0x97, 0x16, 0x03, - 0xdb, 0xd2, 0x21, 0x32, 0x30, 0xa3, 0x43, 0x3c, 0x16, 0x66, 0xc7, 0x62, - 0x21, 0xf8, 0x3a, 0x0b, 0x63, 0x23, 0x6a, 0x6b, 0xee, 0x11, 0x00, 0xee, - 0x50, 0x78, 0x42, 0xfd, 0x94, 0xf6, 0x4c, 0x6a, 0x92, 0x58, 0xfa, 0x13, - 0xba, 0x5f, 0x2b, 0xeb, 0x05, 0x5b, 0x47, 0xfa, 0x33, 0x64, 0xd0, 0xaa, - 0xf9, 0x12, 0xef, 0x03, 0xff, 0x38, 0xb4, 0x75, 0x11, 0x3a, 0x69, 0xc9, - 0xc1, 0x5a, 0xeb, 0xf6, 0xc3, 0xb7, 0x05, 0xec, 0x14, 0x44, 0x96, 0x71, - 0xbd, 0x06, 0xb9, 0xda, 0x7f, 0x20, 0x08, 0x3b, 0x6f, 0x2e, 0x32, 0x20, - 0xc1, 0x4b, 0x96, 0xaf, 0x4c, 0x5e, 0x15, 0x24, 0x05, 0x9c, 0x72, 0x1c, - 0x3e, 0xfe, 0xf1, 0x11, 0xdb, 0xbd, 0xee, 0x5e, 0xc2, 0x7e, 0x8a, 0xb4, - 0xbc, 0xd2, 0xd5, 0x9f, 0x7c, 0x82, 0xf1, 0x5f, 0xd8, 0xd5, 0x55, 0x6a, - 0x9d, 0xd0, 0x6a, 0xbe, 0x81, 0x11, 0xbf, 0xac, 0xcf, 0x64, 0xeb, 0x75, - 0xf6, 0x43, 0xa4, 0x17, 0x81, 0x0b, 0xf7, 0xea, 0x44, 0xa9, 0x82, 0x20, - 0xe0, 0xf9, 0x09, 0x01, 0x79, 0xa2, 0x99, 0x24, 0x23, 0xc9, 0x09, 0xb6, - 0x36, 0x09, 0x75, 0x6a, 0xc9, 0x4f, 0x96, 0xb7, 0x7a, 0x9f, 0x94, 0xa3, - 0x93, 0xfc, 0x44, 0x11, 0x3d, 0x60, 0x79, 0x4d, 0x30, 0x97, 0x87, 0xa1, - 0x8e, 0x64, 0x9e, 0xb8, 0x7a, 0xf2, 0x45, 0xb8, 0xa9, 0xb1, 0x2e, 0x81, - 0x51, 0x94, 0xc8, 0x20, 0x14, 0x3e, 0x66, 0x2f, 0x88, 0x9e, 0x24, 0x7e, - 0xa4, 0x0b, 0x1e, 0x99, 0xcb, 0xd1, 0x4a, 0x5f, 0xd9, 0xe4, 0x97, 0xc1, - 0xc3, 0x8c, 0x9b, 0x28, 0x28, 0xd3, 0x5b, 0xa2, 0x96, 0x9f, 0xf7, 0xa4, - 0xb9, 0xb2, 0xa4, 0x0a, 0x7c, 0x6d, 0x40, 0x26, 0x51, 0xf4, 0x06, 0xab, - 0xd3, 0xaf, 0x8a, 0xf7, 0xaf, 0x70, 0x58, 0x6e, 0xf3, 0xa0, 0x51, 0x2e, - 0x2c, 0x2f, 0x9f, 0xb6, 0xbb, 0x1a, 0x35, 0xa1, 0xeb, 0x6c, 0xa1, 0x4f, - 0xf7, 0xf5, 0x71, 0x65, 0x44, 0xc3, 0xe6, 0x4c, 0xfc, 0xf1, 0x43, 0xcb, - 0x01, 0xb8, 0xb4, 0x2b, 0x17, 0x84, 0x9d, 0x6d, 0x10, 0x9f, 0x32, 0xaa, - 0x3d, 0x8f, 0xdf, 0xa4, 0x26, 0x5c, 0x15, 0x09, 0x40, 0xbd, 0x1e, 0x5b, - 0xb7, 0xe4, 0xf7, 0x4e, 0x41, 0x7e, 0x6f, 0x26, 0x51, 0xbd, 0x45, 0x14, - 0x38, 0x84, 0x24, 0xc2, 0x31, 0xb2, 0xf1, 0xf0, 0x6c, 0xf4, 0x8e, 0xac, - 0xdb, 0x35, 0x3a, 0x7f, 0x83, 0x9b, 0x88, 0x94, 0x39, 0x29, 0x1c, 0xae, - 0x2b, 0x3a, 0xf9, 0x0b, 0x8c, 0x6a, 0x37, 0x79, 0x48, 0x1e, 0x2f, 0xf3, - 0xc1, 0x52, 0x2f, 0x1c, 0xe6, 0x94, 0xa8, 0x6b, 0x63, 0xc3, 0x97, 0x13, - 0xd5, 0x6d, 0x8a, 0x85, 0x7a, 0xc0, 0x2b, 0x9e, 0xf0, 0x7f, 0xc8, 0x1c, - 0xd8, 0x30, 0x47, 0xc6, 0x7c, 0x7b, 0x59, 0xb2, 0xfe, 0xf2, 0xa7, 0x53, - 0x78, 0xa6, 0xa9, 0x7c, 0x31, 0x73, 0x76, 0x0a, 0x5a, 0x60, 0x8c, 0x83, - 0x19, 0x7d, 0xbc, 0x9c, 0xdd, 0xa0, 0x20, 0x88, 0x0b, 0xfe, 0x31, 0xd1, - 0xd2, 0x30, 0x51, 0x5f, 0xdb, 0x9e, 0x61, 0x8d, 0x04, 0x41, 0x2b, 0x17, - 0xb8, 0xd4, 0xbf, 0xfc, 0x26, 0x6f, 0x54, 0xa8, 0x3a, 0xbf, 0xba, 0x23, - 0x1b, 0x06, 0xa8, 0x07, 0x40, 0x37, 0x21, 0x32, 0x57, 0x35, 0xac, 0x0b, - 0x7a, 0xb9, 0xb7, 0x06, 0xcb, 0x27, 0x66, 0x7c, 0xdb, 0x49, 0x2b, 0xfc, - 0xed, 0x6a, 0x9d, 0x36, 0x2a, 0xdf, 0x58, 0x9a, 0xe5, 0xe6, 0x0d, 0xe9, - 0x12, 0x07, 0xb3, 0xbf, 0xa4, 0x8f, 0xb3, 0x9d, 0x7d, 0x3e, 0x5a, 0xf3, - 0x73, 0x9f, 0xbc, 0x12, 0x10, 0xd9, 0xba, 0x9d, 0x9a, 0xed, 0xe8, 0x1b, - 0xfc, 0x5f, 0x2f, 0x7b, 0xc0, 0xf4, 0xef, 0x7e, 0xa7, 0x0a, 0x0d, 0x35, - 0x89, 0xdf, 0x90, 0x6f, 0x26, 0x4b, 0x2d, 0x65, 0xec, 0x3f, 0x36, 0xb9, - 0x9a, 0xdb, 0x3e, 0x31, 0x32, 0xc1, 0x7f, 0x0d, 0x31, 0x9a, 0x61, 0x5e, - 0x2a, 0x9d, 0x17, 0x0a, 0x1a, 0xe1, 0x96, 0x0e, 0xc6, 0xf7, 0x3c, 0xfa, - 0xac, 0x09, 0xb4, 0x73, 0x93, 0xa7, 0xfc, 0x4d, 0x42, 0xee, 0x80, 0xfd, - 0xec, 0x71, 0xaf, 0x64, 0x92, 0x19, 0xd9, 0x4c, 0x8f, 0xff, 0x29, 0x5a, - 0x26, 0x00, 0x86, 0xcb, 0x97, 0x7b, 0xd2, 0xf1, 0x01, 0xa3, 0xc4, 0xb6, - 0xa7, 0xf4, 0xc1, 0xb9, 0x92, 0x8b, 0xca, 0x2e, 0x2b, 0xed, 0xb6, 0xdd, - 0x20, 0x5b, 0xdf, 0xb8, 0x8c, 0x33, 0x2c, 0xf4, 0xca, 0x08, 0x84, 0xb0, - 0xb3, 0x1b, 0x53, 0x34, 0x0f, 0xbb, 0x27, 0x64, 0x98, 0x9b, 0xcc, 0x20, - 0x87, 0x1b, 0x3e, 0xab, 0xe3, 0x0e, 0xa3, 0x27, 0x3c, 0x40, 0x58, 0x13, - 0xc9, 0xbc, 0x6a, 0xcb, 0x67, 0x5a, 0x38, 0x1e, 0xf2, 0xd1, 0xf1, 0xdf, - 0xb1, 0x50, 0x6a, 0x77, 0x13, 0x10, 0xb2, 0x73, 0xa2, 0xbd, 0x12, 0x12, - 0xba, 0xfe, 0x7e, 0x71, 0xcf, 0xea, 0x42, 0xb0, 0xa9, 0xdf, 0x9d, 0xfa, - 0xaf, 0xc7, 0x73, 0x03, 0x06, 0x51, 0x76, 0xcd, 0x60, 0xcd, 0x16, 0xff, - 0xb4, 0xda, 0xd4, 0x50, 0xd8, 0x81, 0x7b, 0x8c, 0xe2, 0x3f, 0x6d, 0x7a, - 0x0a, 0xb7, 0xc3, 0xe2, 0xfa, 0x96, 0x24, 0xee, 0xb4, 0x4d, 0x71, 0x7a, - 0x86, 0x6f, 0x38, 0x9d, 0x2c, 0x68, 0x0d, 0x23, 0xb4, 0xa3, 0xf3, 0x69, - 0xfe, 0xf5, 0x87, 0x82, 0x32, 0x1e, 0x02, 0x8d, 0x11, 0x05, 0xac, 0x38, - 0x4a, 0xcf, 0xb1, 0xdf, 0xc0, 0xfc, 0xaa, 0x83, 0xa0, 0x9a, 0x21, 0xb8, - 0x9f, 0x2f, 0x83, 0x89, 0xb8, 0x38, 0x39, 0x34, 0x32, 0x23, 0xe5, 0xb6, - 0x91, 0x97, 0x45, 0xb3, 0xc6, 0x35, 0x1b, 0x51, 0x45, 0x73, 0x6a, 0x35, - 0x79, 0x7b, 0xb9, 0x14, 0x01, 0x3f, 0xf3, 0x75, 0x92, 0x14, 0x21, 0xf4, - 0xc3, 0x99, 0x60, 0x50, 0x80, 0x75, 0x5b, 0x5c, 0xc3, 0xf0, 0xdc, 0xfd, - 0xc6, 0x21, 0xcb, 0xbf, 0x2e, 0x51, 0x68, 0x31, 0x23, 0x5d, 0xb3, 0x3e, - 0x1c, 0x34, 0x84, 0xc9, 0x85, 0xa3, 0x4e, 0x45, 0x14, 0x69, 0x5a, 0x1c, - 0x5d, 0x73, 0x3c, 0x17, 0x11, 0x4b, 0xf7, 0x39, 0x3e, 0xbc, 0x4e, 0x68, - 0xf3, 0x3a, 0xc0, 0xbd, 0xea, 0x07, 0xa9, 0xb5, 0xee, 0x76, 0x4c, 0x12, - 0xa2, 0x2f, 0x34, 0x05, 0x85, 0x33, 0x85, 0xbf, 0x98, 0x52, 0xae, 0x08, - 0x67, 0x22, 0x58, 0x75, 0x98, 0xa1, 0xbb, 0x3d, 0x82, 0x47, 0x1a, 0x2a, - 0x7d, 0xd7, 0x32, 0xd0, 0x9d, 0x96, 0x62, 0xa4, 0xfc, 0x99, 0x49, 0x4b, - 0x9a, 0x04, 0xb0, 0x91, 0x30, 0x60, 0x3d, 0xb9, 0xa1, 0x58, 0x15, 0x22, - 0x89, 0xbf, 0x2d, 0x72, 0xee, 0x2a, 0x5d, 0x3a, 0x06, 0xc9, 0x21, 0x9d, - 0x42, 0xaa, 0x7a, 0x55, 0xac, 0xc7, 0xc4, 0xcf, 0x18, 0xea, 0xc0, 0xac, - 0x3c, 0x48, 0xc0, 0xb3, 0x92, 0x93, 0xf7, 0x9b, 0x4d, 0x7e, 0xac, 0xa6, - 0x46, 0xf8, 0x53, 0x20, 0x4a, 0xae, 0x10, 0x19, 0x67, 0xde, 0x9e, 0xf0, - 0x21, 0x08, 0x00, 0x59, 0xd3, 0xa6, 0x48, 0xd2, 0xf5, 0x69, 0x77, 0xbf, - 0xf1, 0xed, 0x30, 0x2a, 0xdd, 0xa2, 0x6f, 0x59, 0x63, 0x11, 0x5e, 0xb5, - 0x89, 0x32, 0x35, 0xbc, 0x96, 0x0f, 0xf4, 0x58, 0x92, 0x89, 0x59, 0x4e, - 0xf3, 0xad, 0x30, 0xfe, 0xfc, 0xda, 0xee, 0xc1, 0x1d, 0x5e, 0x6c, 0x0d, - 0x19, 0x5e, 0xce, 0x84, 0xe3, 0x79, 0xe5, 0xfd, 0x1d, 0xda, 0xe5, 0x30, - 0x45, 0x98, 0x07, 0x01, 0x96, 0xa0, 0xd9, 0x84, 0xc6, 0x9c, 0x44, 0x90, - 0x64, 0x77, 0x3e, 0x17, 0xbe, 0x14, 0xcf, 0x67, 0x8d, 0xa5, 0xe9, 0xef, - 0xcb, 0xb2, 0xb6, 0x69, 0x7b, 0xff, 0xf8, 0x3a, 0x7b, 0x3e, 0x38, 0x54, - 0x06, 0x11, 0xd1, 0x86, 0x85, 0xd9, 0x79, 0x7f, 0xeb, 0x2d, 0x99, 0x58, - 0x03, 0x75, 0xb4, 0x09, 0x1e, 0x4b, 0xe9, 0xf9, 0xca, 0x94, 0x9d, 0x71, - 0x7d, 0x3f, 0x66, 0xba, 0x3e, 0x67, 0x5c, 0x3a, 0xce, 0x86, 0xce, 0xea, - 0xd6, 0x32, 0xb9, 0x1d, 0x2c, 0xc0, 0x63, 0xe6, 0xa9, 0x76, 0x8a, 0x2c, - 0x9c, 0x7d, 0x17, 0x44, 0x54, 0x08, 0x89, 0xd9, 0x99, 0xe4, 0xf4, 0xbc, - 0x19, 0x28, 0x5f, 0x6e, 0x9a, 0x5d, 0x57, 0x39, 0x19, 0x10, 0x0f, 0xc4, - 0xba, 0xd4, 0xbc, 0xb1, 0x06, 0x5a, 0x92, 0x8a, 0x63, 0x51, 0x98, 0xd1, - 0x2a, 0x0a, 0xc7, 0x08, 0x83, 0x19, 0xaf, 0x8e, 0xf4, 0xf7, 0xfc, 0x08, - 0xff, 0x93, 0xe0, 0xaa, 0x3c, 0x34, 0xd3, 0x47, 0x08, 0xd1, 0xe0, 0xc8, - 0x17, 0x5e, 0xd0, 0x21, 0xd0, 0x91, 0x05, 0x9e, 0x9c, 0xf9, 0xe9, 0x03, - 0xfc, 0x33, 0x05, 0x06, 0xa0, 0x19, 0xff, 0xfe, 0x6b, 0x42, 0xd1, 0xf9, - 0xc1, 0xd0, 0x17, 0xd7, 0x81, 0xc3, 0xc6, 0xce, 0x37, 0xd0, 0x90, 0x1d, - 0x34, 0x15, 0x8d, 0xb1, 0x06, 0x11, 0xc1, 0x4d, 0x27, 0x1a, 0x55, 0xd3, - 0xae, 0xdc, 0x59, 0xee, 0xf0, 0xf5, 0x3b, 0xc2, 0x8c, 0xaa, 0x22, 0x95, - 0x9d, 0x31, 0x71, 0xea, 0x39, 0x22, 0x86, 0x37, 0xa3, 0x89, 0x4a, 0x44, - 0x5f, 0xe4, 0x91, 0xd3, 0x5a, 0x96, 0x71, 0x52, 0xc0, 0x35, 0x8c, 0x26, - 0x88, 0xb7, 0x0f, 0x61, 0xf6, 0xfe, 0xf1, 0xe8, 0x1b, 0xa3, 0x86, 0x85, - 0xf1, 0xab, 0xf8, 0x50, 0xe1, 0x93, 0xaa, 0x17, 0x9c, 0x9b, 0x3c, 0xa3, - 0x3a, 0x15, 0xf6, 0x2d, 0x6b, 0x62, 0x7b, 0xb6, 0x4d, 0xc8, 0x24, 0x4e, - 0x00, 0x3b, 0xa9, 0x79, 0x85, 0xa7, 0xf4, 0x77, 0x64, 0x7a, 0x15, 0x2d, - 0x5b, 0x88, 0xb1, 0x0f, 0xd4, 0xdb, 0xfa, 0x13, 0x5e, 0x8e, 0x37, 0x4b, - 0xf6, 0x48, 0xa6, 0x0e, 0x6e, 0x06, 0x61, 0xd2, 0x16, 0xf0, 0x0f, 0xcb, - 0x7f, 0x35, 0x8d, 0xa3, 0xcc, 0x36, 0x73, 0x91, 0xcb, 0xfc, 0xf6, 0x8d, - 0xf4, 0x61, 0x35, 0xb4, 0x96, 0x55, 0x8c, 0x88, 0x8c, 0x20, 0x4a, 0xec, - 0x27, 0x09, 0x8e, 0xb7, 0x6e, 0xea, 0x42, 0xd2, 0xad, 0x46, 0xeb, 0x0e, - 0x19, 0x4f, 0x7e, 0xe0, 0x2f, 0x5c, 0xd8, 0x58, 0x09, 0xaa, 0x54, 0x86, - 0xe9, 0x8f, 0x99, 0xa2, 0x88, 0xd1, 0xe4, 0xec, 0x3d, 0x51, 0x34, 0x3e, - 0xa5, 0x03, 0xae, 0xce, 0x48, 0xbb, 0x98, 0xe0, 0xa6, 0x67, 0xf5, 0xd8, - 0x5b, 0xbe, 0x7e, 0xc5, 0xa7, 0x8e, 0x6d, 0xf2, 0x45, 0xf0, 0xb9, 0x43, - 0x02, 0x41, 0x20, 0xb1, 0x21, 0xf8, 0xe1, 0x14, 0x24, 0xcc, 0x93, 0xa4, - 0x56, 0x2e, 0xdf, 0xe2, 0xe8, 0x1a, 0xcf, 0x52, 0xe7, 0xba, 0xdd, 0xeb, - 0x58, 0x5c, 0x0f, 0xd1, 0x84, 0x3b, 0xbf, 0xb8, 0x44, 0xe5, 0x3b, 0xf1, - 0x7c, 0x50, 0x26, 0x8f, 0xd2, 0x28, 0xde, 0x0c, 0x85, 0xa8, 0x31, 0xaa, - 0xd6, 0x4b, 0x26, 0x25, 0x50, 0x19, 0x4f, 0x4c, 0xc5, 0xee, 0x8f, 0xc8, - 0x04, 0xbf, 0x53, 0x0c, 0x0b, 0x98, 0x61, 0xfc, 0x06, 0x43, 0x28, 0x1b, - 0x53, 0x5c, 0x08, 0x77, 0xcd, 0xdc, 0x65, 0xf5, 0xe9, 0x92, 0x86, 0xdc, - 0xbe, 0x98, 0x4c, 0x89, 0x8f, 0xdf, 0x79, 0x7f, 0x9e, 0xbc, 0xd5, 0xfa, - 0x61, 0xc9, 0x17, 0x71, 0xdb, 0x14, 0x1a, 0x22, 0xf8, 0x15, 0xda, 0x23, - 0x49, 0x99, 0x42, 0xec, 0x21, 0x41, 0xa7, 0x0d, 0xf6, 0xc8, 0xa2, 0x1c, - 0xdc, 0x62, 0x46, 0xc3, 0x61, 0x3f, 0x35, 0xa5, 0xa1, 0x56, 0xfe, 0x28, - 0xd3, 0xa4, 0xea, 0x3f, 0xa3, 0x12, 0x3c, 0x16, 0x3a, 0x54, 0x9b, 0xb1, - 0x2e, 0x28, 0xf7, 0x95, 0xf0, 0x9f, 0x77, 0xf9, 0xf4, 0xf7, 0x24, 0x3f, - 0x50, 0x18, 0x51, 0xbe, 0xdb, 0xbf, 0xd3, 0x6b, 0xf8, 0x0b, 0xf3, 0x4b, - 0x24, 0x68, 0xdf, 0xcc, 0xd2, 0xe6, 0x8d, 0x00, 0xf0, 0x37, 0xad, 0xaf, - 0x32, 0x21, 0x64, 0x7b, 0xbd, 0x1c, 0x2f, 0xf5, 0x30, 0xe9, 0x9c, 0x15, - 0x8c, 0xca, 0x86, 0x1f, 0x52, 0x29, 0x95, 0x75, 0xe4, 0x4e, 0x33, 0x2c, - 0xa5, 0xf5, 0x39, 0x47, 0x39, 0xd3, 0xa4, 0x73, 0x1b, 0x08, 0xfa, 0x18, - 0x34, 0x0f, 0x37, 0x2e, 0xcf, 0x0f, 0xa0, 0x20, 0x89, 0x5d, 0x9f, 0xe4, - 0x55, 0xc8, 0xc8, 0x17, 0xf6, 0xf0, 0x65, 0xbc, 0xeb, 0x1d, 0x25, 0xfd, - 0x3c, 0x01, 0x36, 0xe3, 0x16, 0x66, 0x97, 0x1e, 0x23, 0x0a, 0x9d, 0xc3, - 0x0e, 0x85, 0xaf, 0x91, 0x78, 0x4e, 0x7f, 0xe9, 0xac, 0xfe, 0x2b, 0x1f, - 0xf1, 0xbb, 0x20, 0xa3, 0xc4, 0x57, 0x44, 0x1d, 0x14, 0x61, 0x27, 0x6a, - 0x72, 0x7d, 0x6d, 0x65, 0xa0, 0xd9, 0xde, 0xe2, 0xd3, 0xe4, 0x4d, 0x43, - 0xd7, 0xa6, 0x42, 0x4b, 0x2b, 0x34, 0x4e, 0xf8, 0x35, 0x98, 0x0c, 0x88, - 0x78, 0x2d, 0x11, 0x77, 0x77, 0x45, 0x73, 0xef, 0x68, 0x91, 0x5f, 0x06, - 0x6c, 0x0a, 0x6b, 0x13, 0xd7, 0xf8, 0x09, 0x1e, 0x4b, 0x5a, 0xe5, 0x39, - 0xc0, 0x1e, 0x0b, 0x04, 0x1a, 0x0e, 0x8e, 0x02, 0xf3, 0x5d, 0xd6, 0x4f, - 0x8f, 0x9b, 0x45, 0xc5, 0xb7, 0x47, 0x32, 0x2d, 0xc1, 0xab, 0x63, 0xa0, - 0x70, 0x8d, 0x02, 0x4f, 0xee, 0x08, 0x9d, 0x00, 0x6a, 0x81, 0xf4, 0x14, - 0xce, 0xfa, 0xda, 0x5a, 0xc5, 0x98, 0xad, 0xab, 0xbf, 0x5d, 0x83, 0x05, - 0x96, 0x1f, 0x75, 0xa4, 0xf6, 0xf0, 0xac, 0xf7, 0xb0, 0x1e, 0x71, 0x93, - 0x12, 0xd2, 0xdb, 0x45, 0xd0, 0x3c, 0xe2, 0x93, 0xb7, 0x82, 0x52, 0x01, - 0xfc, 0x35, 0xd1, 0x91, 0x66, 0x7d, 0xcf, 0xd1, 0xbd, 0xca, 0x0f, 0x04, - 0x29, 0x4a, 0xb5, 0xf5, 0xec, 0x40, 0xd5, 0x04, 0x1f, 0x2b, 0xc5, 0x23, - 0x73, 0x77, 0x81, 0xd2, 0x2e, 0xb9, 0x4d, 0x33, 0xb2, 0x11, 0xa6, 0xdd, - 0x3f, 0xa7, 0x8d, 0xa8, 0x1d, 0x1f, 0x81, 0xb9, 0x40, 0x8c, 0xcb, 0x50, - 0x7d, 0xcb, 0xd6, 0xfc, 0xbb, 0x02, 0xe2, 0x8a, 0x54, 0x40, 0x1e, 0xec, - 0xd3, 0x62, 0xcb, 0xef, 0x59, 0x77, 0xb8, 0x34, 0xa4, 0x34, 0xcc, 0x69, - 0xbf, 0xc6, 0x2f, 0xe4, 0x3b, 0x1d, 0x82, 0xfc, 0x27, 0x01, 0xf0, 0x81, - 0x18, 0xb4, 0x35, 0x19, 0xe6, 0xe3, 0x5c, 0xe1, 0x26, 0xfe, 0xd7, 0x02, - 0x7e, 0x8d, 0x9f, 0xd1, 0x2a, 0xf1, 0xe8, 0xed, 0x37, 0x39, 0x65, 0xa7, - 0x8e, 0x6f, 0x31, 0x90, 0xce, 0x54, 0x64, 0xa3, 0x9c, 0xab, 0xda, 0x1a, - 0xfa, 0xff, 0x3a, 0x00, 0x7f, 0x7f, 0x26, 0x85, 0xfb, 0x84, 0x5c, 0xf2, - 0x7d, 0x8b, 0xea, 0x3c, 0xa1, 0x7b, 0x72, 0x14, 0x61, 0xe5, 0x24, 0x5f, - 0x59, 0xd7, 0x46, 0xa8, 0xa8, 0x7d, 0x2a, 0x03, 0xd1, 0x4d, 0x30, 0xd5, - 0xf5, 0xae, 0x49, 0x02, 0x14, 0xf1, 0x7f, 0x78, 0x2e, 0x05, 0xc4, 0x5c, - 0x80, 0x8b, 0x9c, 0x15, 0x6b, 0x73, 0x5a, 0xfe, 0xb7, 0x04, 0xc8, 0xc6, - 0x64, 0xbe, 0x9c, 0xe3, 0xc9, 0x09, 0xcc, 0xc6, 0x60, 0xa9, 0xa1, 0x0a, - 0xc6, 0xd4, 0x32, 0xe3, 0x45, 0x12, 0x69, 0xf2, 0x9b, 0x61, 0xce, 0xa2, - 0x18, 0x2c, 0xe1, 0xae, 0x3f, 0x7c, 0x2f, 0xa8, 0xec, 0x40, 0xba, 0xa1, - 0x32, 0x7b, 0x2c, 0x74, 0x87, 0x36, 0x35, 0x73, 0x0c, 0xc0, 0x96, 0x66, - 0x5f, 0xc0, 0x5f, 0x9c, 0xea, 0x51, 0xb1, 0x08, 0xde, 0x80, 0x51, 0x90, - 0x92, 0x70, 0x37, 0xe6, 0x9c, 0x04, 0xaf, 0x37, 0x3d, 0xd1, 0xb9, 0x63, - 0x23, 0x67, 0xa1, 0x05, 0x73, 0x2f, 0xe9, 0xb9, 0x06, 0x0c, 0x4e, 0x80, - 0xbb, 0x24, 0xe7, 0x67, 0x18, 0x47, 0xaa, 0x1b, 0xdf, 0xd3, 0xd2, 0x15, - 0xe8, 0x8e, 0xe7, 0xfb, 0x3d, 0xc0, 0x8e, 0x82, 0xa5, 0xb4, 0xe7, 0x99, - 0xb0, 0x18, 0x54, 0xa7, 0x23, 0x01, 0x2d, 0xea, 0x82, 0x97, 0x95, 0x19, - 0x12, 0xca, 0x69, 0x88, 0x9f, 0x94, 0xf1, 0xd7, 0xf7, 0x10, 0xd2, 0x41, - 0xe2, 0x1d, 0x52, 0x42, 0xb3, 0xad, 0xe4, 0x91, 0x30, 0xbd, 0x07, 0xd5, - 0x2f, 0x76, 0x3b, 0xc5, 0x2d, 0x61, 0x7a, 0x9d, 0x78, 0x32, 0x9c, 0xc7, - 0xd3, 0xb7, 0x2d, 0x34, 0x0c, 0xf8, 0xb4, 0xcf, 0xf5, 0xb0, 0x26, 0xec, - 0xa8, 0x63, 0xc1, 0x04, 0xc4, 0xe4, 0x68, 0x82, 0x06, 0x99, 0x73, 0x7d, - 0x32, 0x38, 0xab, 0x52, 0x9b, 0x8e, 0x00, 0x9f, 0x38, 0x68, 0xaf, 0x5c, - 0xd3, 0x4a, 0xda, 0x0b, 0xa2, 0x67, 0x50, 0x71, 0x3b, 0x66, 0x5a, 0x3e, - 0x94, 0xfb, 0x0b, 0x98, 0x02, 0xc0, 0xa9, 0xdf, 0xf5, 0xbd, 0xe6, 0xc9, - 0xc9, 0xc2, 0x9d, 0x12, 0x88, 0xfb, 0x3d, 0x55, 0xa3, 0x52, 0xc7, 0x4d, - 0xe2, 0xbe, 0x29, 0xd3, 0x1f, 0x48, 0x6a, 0x59, 0xd3, 0x0f, 0x78, 0x36, - 0xf1, 0x9b, 0xb7, 0xec, 0x46, 0x5a, 0x4a, 0x4d, 0x28, 0xb9, 0x3d, 0xe9, - 0xcf, 0x29, 0xdc, 0xc0, 0x06, 0x32, 0xd5, 0xcd, 0xb2, 0x1d, 0x3b, 0x9a, - 0x60, 0x3d, 0x51, 0x6d, 0x41, 0x82, 0x79, 0x8a, 0x33, 0xe6, 0xab, 0xb3, - 0x8d, 0xf1, 0x30, 0x99, 0xda, 0xdc, 0x7b, 0x2e, 0xf9, 0x3d, 0x72, 0x18, - 0xc2, 0x1e, 0x32, 0x66, 0xf7, 0x71, 0x28, 0x35, 0x6f, 0xbf, 0x97, 0x60, - 0xcc, 0x5a, 0x67, 0x85, 0x35, 0xa5, 0x88, 0xcf, 0xa2, 0xf7, 0x47, 0x05, - 0xbf, 0xf6, 0x6d, 0x48, 0x48, 0xcc, 0xc4, 0xd6, 0x09, 0x45, 0x41, 0xaa, - 0x09, 0x27, 0x28, 0x67, 0x8f, 0xd8, 0xcd, 0xe3, 0x19, 0xd9, 0x85, 0xf3, - 0xdd, 0xc2, 0x6c, 0x1a, 0x2e, 0xcd, 0x46, 0xc6, 0xd1, 0x1d, 0xb6, 0x2a, - 0x6b, 0x37, 0x6b, 0x2e, 0x6a, 0x19, 0x3d, 0xac, 0x56, 0x92, 0xb7, 0x1c, - 0x4b, 0x1c, 0x7e, 0x71, 0xf6, 0x2e, 0xec, 0xae, 0x3b, 0xec, 0xef, 0x23, - 0x87, 0x6f, 0xff, 0xec, 0x55, 0x2a, 0xcf, 0x39, 0x29, 0x68, 0x92, 0x15, - 0x14, 0x5b, 0x8d, 0x64, 0x8c, 0xe7, 0x69, 0x42, 0x7f, 0xaf, 0xad, 0x96, - 0xa5, 0x95, 0xfd, 0xe1, 0x80, 0x73, 0x22, 0xdf, 0x57, 0x3c, 0x9f, 0x32, - 0x19, 0x2d, 0xf2, 0xd6, 0x6e, 0xb6, 0xba, 0x26, 0x24, 0xce, 0x1e, 0x65, - 0x8c, 0x99, 0x86, 0xac, 0xf4, 0xe0, 0x45, 0x29, 0xeb, 0xf9, 0x0c, 0x48, - 0x9e, 0xfb, 0xdc, 0xff, 0x7e, 0x4a, 0xac, 0x41, 0x4f, 0x8d, 0xdf, 0x03, - 0x02, 0x80, 0xf3, 0x1a, 0xfc, 0xf3, 0x84, 0x88, 0x6c, 0x0a, 0xb6, 0x84, - 0x76, 0x97, 0xc1, 0xb5, 0xd6, 0xb5, 0xde, 0x1c, 0x3d, 0xfe, 0x4e, 0x29, - 0x40, 0x07, 0x03, 0x8c, 0x98, 0x56, 0xa3, 0x5d, 0xe1, 0x84, 0xd8, 0x8e, - 0x80, 0xe9, 0xd4, 0x57, 0xd4, 0x05, 0x4f, 0xe4, 0x0b, 0x90, 0x7a, 0xda, - 0x09, 0xcb, 0xea, 0xbd, 0x77, 0xbc, 0xc1, 0xb3, 0xb1, 0x00, 0xde, 0xa0, - 0x85, 0x0b, 0xc4, 0xdd, 0x73, 0xc2, 0x91, 0x26, 0x6c, 0xb3, 0x01, 0x37, - 0xee, 0x1b, 0x4c, 0x69, 0x9d, 0x6b, 0x82, 0x4f, 0xb5, 0x8a, 0x15, 0xc2, - 0xb1, 0x63, 0x02, 0x86, 0x0f, 0xa3, 0xdf, 0x34, 0xc2, 0x86, 0xfd, 0x9b, - 0x4f, 0xbd, 0x84, 0x6f, 0x41, 0x11, 0x40, 0x95, 0x08, 0xd5, 0x24, 0x95, - 0x71, 0x75, 0x9e, 0xc9, 0x8c, 0xd2, 0x2a, 0xd4, 0xbe, 0x8e, 0xa4, 0xaa, - 0x80, 0xbe, 0xde, 0x9c, 0x14, 0xdf, 0x7b, 0x5f, 0x87, 0xa4, 0x91, 0x6e, - 0xe3, 0x64, 0x82, 0x87, 0xbe, 0xb4, 0x03, 0xe7, 0xda, 0xda, 0xa6, 0xfa, - 0x2a, 0xa5, 0xae, 0x78, 0xf8, 0xd7, 0x5e, 0x2f, 0x8a, 0xb5, 0x9e, 0xc9, - 0x28, 0x9d, 0xa4, 0x27, 0x7e, 0x9d, 0x37, 0xac, 0x7c, 0x6e, 0x0a, 0x33, - 0xc9, 0x9b, 0x88, 0xfa, 0xbb, 0xa8, 0xd8, 0xa6, 0x9c, 0x62, 0xc8, 0x94, - 0x37, 0x02, 0x68, 0x8b, 0x3a, 0xdf, 0x9b, 0x0b, 0x48, 0x80, 0x88, 0x92, - 0xbf, 0x73, 0x05, 0xab, 0xed, 0x40, 0x9b, 0x4d, 0xa6, 0x01, 0xb7, 0x81, - 0x48, 0x7f, 0x35, 0x51, 0x44, 0xe6, 0xb7, 0x2f, 0xcd, 0xf2, 0x26, 0x88, - 0x99, 0x65, 0xd9, 0x26, 0x4d, 0xd1, 0x97, 0x6b, 0x10, 0xd1, 0xcc, 0x14, - 0x81, 0xbc, 0x68, 0x1a, 0x39, 0xbc, 0x27, 0x15, 0xda, 0x3e, 0x2d, 0x7e, - 0x79, 0xad, 0xfc, 0x3b, 0xeb, 0xf3, 0x60, 0x71, 0xe8, 0xba, 0xf5, 0xb2, - 0xbb, 0xee, 0xaf, 0x2b, 0xfc, 0xe7, 0x21, 0x77, 0xae, 0x76, 0x8e, 0xbc, - 0x4f, 0x61, 0xf2, 0xad, 0xf5, 0x79, 0xc0, 0x4b, 0xa9, 0x3f, 0xfd, 0xa8, - 0x66, 0x0e, 0x8e, 0xfb, 0x49, 0x0c, 0x97, 0x1b, 0x2d, 0x8e, 0x30, 0x19, - 0xb1, 0x8f, 0xb7, 0x31, 0xde, 0xb2, 0xfb, 0x8d, 0x27, 0xe6, 0xda, 0xe1, - 0xb4, 0x87, 0x84, 0xbb, 0xb6, 0xd5, 0x10, 0x46, 0x1c, 0x9f, 0xe6, 0xe3, - 0xb6, 0x14, 0x46, 0xee, 0x48, 0x28, 0xe3, 0x03, 0x6a, 0x58, 0x8d, 0x1b, - 0xf3, 0x95, 0x50, 0x58, 0xf1, 0xdc, 0xbb, 0xbe, 0x15, 0xda, 0x10, 0xc7, - 0x0f, 0x25, 0xc8, 0xdf, 0xd4, 0x12, 0xa0, 0xcd, 0xa0, 0x57, 0xba, 0x17, - 0xc1, 0x21, 0x98, 0xad, 0xae, 0x7f, 0x5c, 0xe9, 0x34, 0xde, 0x2b, 0xec, - 0x5b, 0x7b, 0x3e, 0xe4, 0xd0, 0x77, 0x97, 0xfa, 0x26, 0xe3, 0x93, 0xb2, - 0x94, 0xc1, 0x51, 0x67, 0x51, 0xda, 0xf8, 0x3e, 0xe6, 0xa8, 0xda, 0x6a, - 0xb4, 0x2b, 0x55, 0xe7, 0x0c, 0x45, 0xf5, 0xfa, 0x3a, 0x43, 0x3b, 0x59, - 0xd5, 0xb6, 0xf0, 0xa8, 0x8e, 0x04, 0x6a, 0xf8, 0x5e, 0x64, 0xd7, 0xa8, - 0xa8, 0xb5, 0x28, 0xf5, 0x40, 0x7b, 0x3c, 0x41, 0xf3, 0xaf, 0xb0, 0x76, - 0xfb, 0xa9, 0xd1, 0x3b, 0xd1, 0x02, 0xab, 0x55, 0x6e, 0x41, 0x60, 0xb6, - 0xa0, 0x5b, 0x4d, 0xce, 0x8d, 0x2f, 0xad, 0x5f, 0x49, 0xb6, 0xcb, 0x05, - 0xcb, 0xde, 0x71, 0x05, 0xfb, 0x50, 0xa3, 0x39, 0x9a, 0xcc, 0x6f, 0x17, - 0xd3, 0xba, 0xc8, 0x1c, 0x00, 0x65, 0x71, 0x6e, 0x56, 0x5a, 0xd3, 0xfa, - 0x93, 0xbd, 0x43, 0xe0, 0xcc, 0x26, 0x07, 0x0d, 0xb4, 0x82, 0x50, 0x80, - 0x71, 0xc9, 0xb8, 0xd1, 0x36, 0x24, 0x4c, 0x31, 0x80, 0x68, 0x77, 0xa2, - 0x04, 0xc1, 0xb8, 0x8c, 0x4f, 0xda, 0xa3, 0xa8, 0x93, 0xe2, 0xcd, 0x90, - 0x77, 0xa5, 0xb1, 0x7c, 0xfa, 0x23, 0xb4, 0xcc, 0x98, 0xbe, 0x63, 0xf5, - 0xee, 0x5f, 0xfc, 0x86, 0x81, 0xb8, 0x64, 0x16, 0x9f, 0xf6, 0x6e, 0x09, - 0xee, 0x8b, 0xab, 0x9a, 0xa6, 0x06, 0xbb, 0x1e, 0x2d, 0x92, 0xba, 0x95, - 0xd8, 0xd0, 0xa1, 0x3f, 0x9b, 0xaa, 0x05, 0x2f, 0x35, 0x99, 0xe8, 0xd1, - 0x14, 0xc6, 0x57, 0x09, 0x5a, 0x4e, 0x7c, 0x84, 0x0c, 0x93, 0x04, 0xca, - 0x8d, 0xe3, 0x9c, 0xb3, 0x1d, 0x5c, 0x35, 0x02, 0x1c, 0xa4, 0x94, 0xe8, - 0x39, 0xe2, 0xd9, 0xb5, 0x5d, 0xc2, 0xd6, 0x96, 0x98, 0x8e, 0xa1, 0xb1, - 0xaa, 0xb0, 0x2b, 0x7a, 0xbf, 0xf3, 0x2f, 0x0a, 0x29, 0x48, 0xee, 0xca, - 0xf0, 0xc7, 0x1b, 0x0c, 0xfe, 0x4c, 0x79, 0xd5, 0x9b, 0xd3, 0x56, 0x63, - 0xd3, 0x19, 0x95, 0xae, 0x08, 0xa9, 0x96, 0x49, 0x41, 0x5f, 0x83, 0x6d, - 0x63, 0x8d, 0x5e, 0xd0, 0x6a, 0x7b, 0x6f, 0x96, 0x65, 0xc9, 0x7c, 0x9a, - 0xeb, 0x6f, 0x4e, 0xfe, 0x44, 0xc8, 0xe8, 0x1d, 0x8c, 0x55, 0x38, 0xd2, - 0x54, 0xf2, 0x06, 0x38, 0xf2, 0x14, 0x92, 0x88, 0xe6, 0x30, 0xe4, 0xe3, - 0x07, 0xff, 0xd1, 0xd8, 0xdf, 0x37, 0xb9, 0x37, 0xf6, 0x63, 0xc3, 0x32, - 0x46, 0x68, 0x0a, 0xa7, 0xf2, 0xf3, 0x72, 0xf8, 0x7f, 0x63, 0x83, 0xc2, - 0x96, 0x08, 0x73, 0xe3, 0x05, 0xdc, 0x45, 0xbf, 0x0f, 0xd0, 0xb1, 0xa0, - 0x1f, 0x52, 0x4d, 0x46, 0x52, 0x8e, 0xa2, 0x23, 0xe3, 0x6a, 0x7c, 0xc5, - 0xd6, 0xa7, 0x78, 0xf9, 0xc3, 0xe0, 0x08, 0x0e, 0x03, 0x83, 0x08, 0x6a, - 0x04, 0x7d, 0x30, 0x58, 0xb0, 0x9d, 0x99, 0x10, 0x0b, 0xbb, 0xa2, 0x10, - 0x39, 0xc4, 0xfa, 0x65, 0x09, 0x45, 0x4d, 0x77, 0x41, 0x98, 0x80, 0x0f, - 0xb6, 0x54, 0x2d, 0x05, 0x91, 0x25, 0x36, 0x0a, 0x43, 0x01, 0x5d, 0xdf, - 0x57, 0x97, 0x98, 0x6d, 0xc8, 0xa0, 0xe9, 0xdf, 0x6d, 0xf8, 0x68, 0x5b, - 0xbc, 0x5f, 0x11, 0x1c, 0xcd, 0xa0, 0x83, 0xd8, 0x92, 0x8e, 0x2f, 0xdd, - 0xc5, 0x3e, 0x88, 0x94, 0xec, 0xb8, 0x5a, 0x08, 0x17, 0x5d, 0x39, 0xa5, - 0x82, 0x32, 0x55, 0x0d, 0x9b, 0x84, 0x40, 0x28, 0x31, 0x84, 0x39, 0x2d, - 0xdc, 0xbf, 0x41, 0x15, 0x6c, 0xeb, 0xbe, 0xc6, 0x17, 0x0c, 0xbb, 0x3a, - 0xeb, 0xb7, 0x71, 0x1e, 0xb0, 0xb7, 0x6d, 0xfe, 0x5e, 0xe4, 0x9d, 0x88, - 0x81, 0xc2, 0xb8, 0xf7, 0x4e, 0x7a, 0x63, 0xf9, 0x90, 0x47, 0x06, 0x46, - 0x1a, 0x85, 0x26, 0x4c, 0x28, 0x07, 0xc1, 0x4f, 0x15, 0x3e, 0x34, 0x66, - 0xd8, 0x8c, 0x4f, 0x7e, 0x69, 0x26, 0xe8, 0xee, 0x41, 0x90, 0xcf, 0x63, - 0x26, 0xa5, 0x96, 0x41, 0x28, 0x0f, 0xf1, 0x0f, 0x3b, 0x8b, 0xa2, 0xb1, - 0x34, 0x07, 0x11, 0xac, 0xbd, 0x49, 0xca, 0x9d, 0x68, 0xb5, 0x28, 0xfe, - 0x5e, 0xfd, 0xdc, 0x43, 0x33, 0xb1, 0xc5, 0xca, 0xd9, 0x01, 0x8d, 0x18, - 0xe9, 0x85, 0x6f, 0x85, 0x1b, 0xcb, 0x7e, 0x63, 0x5f, 0x48, 0x3f, 0xe1, - 0xa0, 0xea, 0xd1, 0xbd, 0x1e, 0xcc, 0xdc, 0xce, 0x72, 0xd3, 0x05, 0x26, - 0x36, 0x60, 0x8a, 0xc6, 0x2e, 0xd5, 0xd8, 0x51, 0xe5, 0x3e, 0xb8, 0x70, - 0x5d, 0xa1, 0x10, 0x8f, 0xc3, 0x7b, 0x5c, 0xae, 0x1e, 0x89, 0x7b, 0xe2, - 0xcf, 0x75, 0xfd, 0x33, 0x12, 0x2e, 0x8e, 0x10, 0x1f, 0xd0, 0x70, 0xd1, - 0x78, 0xd6, 0x69, 0xc2, 0xec, 0x45, 0x31, 0xde, 0x19, 0xe9, 0x32, 0x09, - 0x98, 0x31, 0xac, 0x77, 0x87, 0xdb, 0x01, 0x26, 0x90, 0x2f, 0xde, 0xd1, - 0x8a, 0x51, 0x1f, 0xa0, 0x2f, 0xad, 0xcc, 0xe6, 0x3a, 0x94, 0x0b, 0xef, - 0x92, 0x66, 0xd9, 0x74, 0x7f, 0x44, 0x6a, 0xd9, 0x6c, 0x01, 0x32, 0x57, - 0xb9, 0x04, 0x17, 0x69, 0xae, 0xf3, 0xba, 0x83, 0xc3, 0xe0, 0xaf, 0x13, - 0x44, 0xdb, 0x58, 0x89, 0x63, 0xd5, 0x28, 0xce, 0x2a, 0x3d, 0xad, 0x99, - 0xec, 0xef, 0x60, 0x45, 0x52, 0x89, 0xe4, 0xdd, 0x1b, 0x03, 0xea, 0xf7, - 0x42, 0xaf, 0x02, 0x89, 0x42, 0x41, 0xf4, 0xbc, 0x69, 0xfb, 0x06, 0x4c, - 0x7e, 0xf5, 0xfd, 0x8a, 0x16, 0x1e, 0x9f, 0xb4, 0xc7, 0x8a, 0x9e, 0xf4, - 0x82, 0x64, 0x09, 0x41, 0x99, 0xbb, 0x62, 0xd2, 0x4e, 0x4d, 0x0c, 0x04, - 0x18, 0xb0, 0x89, 0x6c, 0xa6, 0x7a, 0x31, 0x30, 0x87, 0x9c, 0x05, 0x1a, - 0x06, 0xca, 0x6e, 0x3c, 0xd0, 0x66, 0xc1, 0x91, 0x76, 0x10, 0x4e, 0x1a, - 0x52, 0x52, 0xad, 0xb9, 0xde, 0xeb, 0xdb, 0x3d, 0xce, 0x26, 0x2d, 0x7c, - 0x70, 0x03, 0x81, 0x3a, 0x86, 0xa6, 0x84, 0x2b, 0x57, 0xd3, 0x4d, 0x31, - 0x8e, 0xcf, 0x1c, 0x5c, 0xd7, 0xdd, 0x92, 0x0f, 0xc1, 0xaf, 0xca, 0x19, - 0x86, 0xd3, 0x5b, 0x94, 0x00, 0xbf, 0x2e, 0xce, 0x78, 0x45, 0x0f, 0x3c, - 0xe1, 0x7e, 0xd4, 0x0e, 0x22, 0xe8, 0x63, 0x34, 0xea, 0xcb, 0xf9, 0xd8, - 0xce, 0x01, 0x56, 0xa2, 0x0d, 0x52, 0x21, 0x40, 0x6b, 0x66, 0x2e, 0x10, - 0x8b, 0x0d, 0xcc, 0x6b, 0xfd, 0x26, 0xfb, 0x70, 0xdc, 0x33, 0xf4, 0xb4, - 0xef, 0xfa, 0x51, 0x9f, 0x7b, 0xe0, 0xb6, 0xf6, 0xa5, 0x5d, 0x90, 0x0b, - 0xdb, 0x2b, 0x30, 0xbc, 0x87, 0xa3, 0x4e, 0x45, 0x20, 0xec, 0xfd, 0xee, - 0xf6, 0xa6, 0xdf, 0x25, 0x90, 0x6b, 0xb9, 0xda, 0xfb, 0xe6, 0x35, 0x2b, - 0x55, 0x23, 0xd1, 0xc3, 0x1e, 0x29, 0x42, 0x57, 0x47, 0x07, 0x1c, 0x05, - 0xea, 0xc7, 0x96, 0xdd, 0xc9, 0xef, 0x21, 0x99, 0x7b, 0x40, 0x59, 0xfb, - 0x87, 0x90, 0xc5, 0xac, 0xa2, 0xa5, 0xbf, 0xf7, 0x65, 0x44, 0x71, 0x97, - 0xa6, 0xc8, 0x65, 0xc7, 0x7f, 0x2d, 0x5c, 0x78, 0xbd, 0xd8, 0xdb, 0x1b, - 0x1b, 0xf1, 0xfa, 0x81, 0x6a, 0x10, 0x4d, 0x6e, 0x99, 0x88, 0x13, 0xd2, - 0x00, 0x46, 0xb9, 0x82, 0x63, 0x37, 0xbe, 0x9a, 0x5b, 0x9e, 0xad, 0xe2, - 0x70, 0x9c, 0xbd, 0x25, 0x15, 0x69, 0xad, 0xfd, 0x7e, 0x17, 0xb0, 0xe2, - 0x29, 0xc8, 0x49, 0x56, 0x46, 0xaa, 0x6c, 0x7f, 0x03, 0x4c, 0x63, 0x58, - 0x75, 0x78, 0x14, 0xf2, 0x28, 0xac, 0x8d, 0x28, 0x07, 0x87, 0x85, 0x54, - 0xd1, 0xff, 0x1a, 0xa5, 0x3c, 0xa5, 0x9b, 0x4d, 0x88, 0xd3, 0x3a, 0x16, - 0x47, 0x46, 0x77, 0x50, 0xd8, 0x28, 0xce, 0x22, 0x22, 0xbe, 0xc7, 0x36, - 0x9d, 0x84, 0x8c, 0x1a, 0x03, 0xe2, 0xc0, 0xc4, 0x00, 0x8a, 0xb1, 0x97, - 0xd7, 0xf9, 0x15, 0x03, 0x79, 0x58, 0x40, 0x30, 0xb7, 0xd1, 0x0f, 0x65, - 0x4a, 0xda, 0xca, 0x88, 0x05, 0xb2, 0x45, 0xac, 0x9c, 0x2d, 0xc1, 0x31, - 0xaf, 0x5e, 0x02, 0x74, 0x26, 0x93, 0x4b, 0x1c, 0xc7, 0x8e, 0x39, 0xed, - 0x5b, 0x39, 0xf6, 0xe8, 0x47, 0xd7, 0x16, 0x64, 0x2a, 0xe8, 0x2a, 0x92, - 0x21, 0xbd, 0x91, 0xa3, 0xcf, 0xe1, 0x0e, 0x90, 0x0c, 0xa6, 0x9e, 0xeb, - 0xa5, 0x82, 0x3b, 0xf3, 0xee, 0xc1, 0x2a, 0x3e, 0xa4, 0x08, 0x15, 0x68, - 0xf0, 0xd2, 0x0a, 0x86, 0xf3, 0x8b, 0xc3, 0xb7, 0xde, 0xd8, 0x1e, 0xb8, - 0xc8, 0x0a, 0x32, 0xef, 0x94, 0x4d, 0xed, 0xed, 0x73, 0x3d, 0x33, 0xb9, - 0xb6, 0xcd, 0x64, 0x46, 0xb2, 0xa3, 0x77, 0x82, 0x0a, 0x68, 0x0f, 0x1e, - 0xdc, 0x4f, 0x97, 0x84, 0x6b, 0xff, 0x25, 0xc1, 0x73, 0xd0, 0x33, 0x2c, - 0x3d, 0xda, 0x12, 0x18, 0x3d, 0x22, 0x34, 0xb0, 0x17, 0xff, 0xac, 0x93, - 0xf6, 0x5e, 0xd8, 0x02, 0x8e, 0xa8, 0xc0, 0x9f, 0x2d, 0x13, 0x37, 0x9d, - 0x98, 0xb2, 0x2b, 0x5f, 0x22, 0x55, 0xfc, 0xb5, 0x9b, 0xee, 0xa6, 0x3e, - 0x13, 0xae, 0xb5, 0xe9, 0x4d, 0xde, 0x47, 0xb3, 0xab, 0x51, 0x30, 0x0b, - 0x52, 0xbe, 0x78, 0xf8, 0x45, 0x5d, 0xbb, 0x3b, 0x85, 0xfd, 0xb0, 0xe7, - 0x79, 0x8c, 0x07, 0x7a, 0x30, 0x4f, 0xcc, 0x7d, 0x8e, 0xfe, 0x32, 0x6d, - 0xa6, 0xf4, 0x71, 0x66, 0x9c, 0xb9, 0xf3, 0xc4, 0x45, 0x1e, 0x91, 0x47, - 0x24, 0xcf, 0xa4, 0xac, 0x8d, 0xbc, 0x3b, 0x5c, 0x5b, 0x69, 0x15, 0x0b, - 0x49, 0x3f, 0xee, 0xd4, 0xbd, 0xb9, 0x13, 0xac, 0xf8, 0x43, 0x03, 0x1e, - 0x11, 0x6f, 0xdb, 0xab, 0xfc, 0x37, 0x08, 0x81, 0x03, 0x55, 0x64, 0x85, - 0xc9, 0x33, 0x0c, 0x8d, 0x42, 0x5d, 0x74, 0xfa, 0xcc, 0x07, 0x27, 0x0e, - 0xdc, 0x77, 0xb1, 0x2a, 0x83, 0x68, 0xf0, 0x2b, 0x1b, 0x46, 0xff, 0xaa, - 0x71, 0xcf, 0xb5, 0x0a, 0xa2, 0x66, 0x91, 0x4c, 0xaf, 0xfb, 0xf9, 0xf4, - 0x8a, 0x99, 0x3b, 0xb5, 0x63, 0x87, 0x27, 0xde, 0x54, 0xcd, 0xbd, 0x12, - 0x83, 0xfd, 0xed, 0xf0, 0x62, 0x24, 0xaa, 0xa1, 0x6b, 0x70, 0x6b, 0xa5, - 0xe8, 0xa6, 0x04, 0x20, 0x31, 0xcc, 0x72, 0x51, 0x13, 0x69, 0x39, 0x36, - 0x01, 0xf4, 0xed, 0xc0, 0x28, 0x7f, 0x73, 0x37, 0xeb, 0xb4, 0xd8, 0xe4, - 0x79, 0xa9, 0x66, 0x27, 0x18, 0xd0, 0x79, 0x4e, 0x68, 0x49, 0x91, 0x81, - 0x3a, 0xec, 0x0e, 0x40, 0xaa, 0x94, 0x79, 0x28, 0xbd, 0xc7, 0x75, 0x6d, - 0xb3, 0xab, 0x79, 0x17, 0x34, 0xd8, 0x38, 0xc7, 0x78, 0xa2, 0x48, 0xef, - 0x2a, 0xe5, 0xae, 0xfc, 0x80, 0x2e, 0x94, 0xcf, 0x39, 0x59, 0xbf, 0x0d, - 0xa6, 0x0b, 0x1f, 0x2c, 0xf8, 0x6b, 0xfa, 0xba, 0x7d, 0x50, 0x7f, 0x30, - 0x6d, 0x7f, 0x7c, 0x22, 0x3e, 0x43, 0xfe, 0xc7, 0x7f, 0x7e, 0x4a, 0x09, - 0x23, 0x0f, 0x04, 0xa3, 0x40, 0xd5, 0x3d, 0x21, 0x27, 0x29, 0xf0, 0x4c, - 0xb9, 0x46, 0xb5, 0xb9, 0x9b, 0xbb, 0xd2, 0x8d, 0x58, 0xf1, 0x54, 0xb3, - 0xf2, 0xf8, 0xed, 0x9c, 0x1d, 0x93, 0xf7, 0xc8, 0xdb, 0xa0, 0x69, 0xed, - 0x3b, 0xf4, 0xe6, 0x06, 0x09, 0x67, 0x03, 0xcc, 0x61, 0xc8, 0x85, 0x1b, - 0x28, 0xb0, 0xa2, 0x12, 0xdf, 0xc0, 0xe9, 0x6d, 0x31, 0x2f, 0x7c, 0x54, - 0xcc, 0x44, 0xf2, 0x34, 0x55, 0xcd, 0x28, 0xfc, 0x8a, 0x04, 0x1d, 0x2a, - 0xff, 0x8b, 0x44, 0xdf, 0x42, 0x75, 0xaf, 0x14, 0xb8, 0x6e, 0x36, 0x53, - 0xd9, 0x6c, 0x4f, 0x53, 0x1c, 0xf3, 0x5d, 0x35, 0xc2, 0xb5, 0xcf, 0xad, - 0x84, 0xf3, 0x82, 0x6a, 0xe7, 0xfd, 0x42, 0x99, 0xb0, 0x27, 0xa9, 0x78, - 0x9b, 0x95, 0xea, 0x6f, 0x0a, 0xbc, 0x54, 0x6f, 0xe7, 0x2a, 0x01, 0xb9, - 0xd4, 0xf0, 0x1c, 0x2d, 0x96, 0x41, 0x1e, 0xbb, 0x8e, 0x61, 0x8b, 0x45, - 0x6d, 0xf4, 0x73, 0x7c, 0x9d, 0xcc, 0x34, 0x97, 0x13, 0xf4, 0x1f, 0x68, - 0xf0, 0xc3, 0xfc, 0x2d, 0xd1, 0x65, 0x91, 0x48, 0xa6, 0x35, 0xf9, 0x91, - 0x09, 0xc9, 0x4c, 0xf7, 0x21, 0x8d, 0xfa, 0x4f, 0xb1, 0x60, 0x47, 0xc2, - 0x00, 0x60, 0xe5, 0xe7, 0x9d, 0xf6, 0x5e, 0xc3, 0x27, 0x4d, 0x7b, 0x21, - 0x2d, 0x3e, 0x9b, 0x4f, 0xc1, 0xa2, 0xc4, 0xcf, 0x51, 0x18, 0x6e, 0xf7, - 0xfb, 0x80, 0x8f, 0xc5, 0xd2, 0x1a, 0xe0, 0x28, 0x07, 0x29, 0x96, 0x5c, - 0x9a, 0x30, 0x1b, 0x64, 0x7e, 0xb8, 0x64, 0xe7, 0x7a, 0xd4, 0x8c, 0xee, - 0xaa, 0x76, 0xad, 0x78, 0x33, 0x96, 0x92, 0x81, 0x12, 0x46, 0x39, 0xf0, - 0x97, 0xdc, 0x40, 0x9d, 0x5f, 0xa9, 0x30, 0xc4, 0x08, 0x9b, 0x2b, 0xcf, - 0x3f, 0x3b, 0x6e, 0x45, 0x13, 0x22, 0x8d, 0xc8, 0xd1, 0x5b, 0x29, 0x02, - 0x42, 0x9f, 0xe1, 0xd0, 0xd1, 0x66, 0xc9, 0x40, 0x76, 0x60, 0x3e, 0xd7, - 0xb7, 0xaf, 0x3d, 0x2c, 0x2a, 0x47, 0x9d, 0x2f, 0x95, 0xff, 0x34, 0x91, - 0x30, 0x9c, 0x72, 0xcd, 0x9d, 0xf7, 0x00, 0xed, 0x1b, 0x0c, 0x74, 0x3e, - 0x46, 0x4a, 0x2f, 0xa6, 0x36, 0x3a, 0xa8, 0x8a, 0xd6, 0x83, 0x20, 0xc7, - 0xd0, 0xc1, 0x2f, 0xe8, 0x5f, 0x51, 0x00, 0x3d, 0x49, 0x12, 0x6a, 0x9e, - 0x41, 0x28, 0xa5, 0x54, 0x46, 0x05, 0xfb, 0x67, 0x10, 0x84, 0x10, 0xde, - 0x3c, 0x58, 0xc8, 0x21, 0xdc, 0x33, 0x7e, 0x3e, 0x34, 0x4e, 0xf7, 0xe7, - 0x37, 0x73, 0xe4, 0x32, 0x62, 0x9a, 0x3c, 0xd9, 0x28, 0x77, 0x3c, 0x15, - 0x6b, 0x3b, 0x43, 0x16, 0xd3, 0xa2, 0x49, 0xa7, 0xb0, 0xa4, 0xab, 0xca, - 0xa1, 0x9a, 0xf3, 0x21, 0xda, 0xe9, 0x3a, 0x94, 0x5e, 0xe4, 0xe0, 0x2a, - 0x0b, 0xce, 0x1f, 0xda, 0x86, 0xa8, 0xd4, 0x82, 0x59, 0x67, 0x2e, 0xe4, - 0xb9, 0x47, 0x7a, 0xf0, 0x4b, 0xbd, 0x7a, 0x83, 0x23, 0xa3, 0x8e, 0x52, - 0x38, 0x5d, 0x04, 0x59, 0xa7, 0xe7, 0xef, 0x8c, 0xde, 0x10, 0x28, 0xd2, - 0x0e, 0xa0, 0x26, 0x51, 0xb4, 0x62, 0x3b, 0x50, 0x1e, 0x9f, 0x6e, 0x0a, - 0xb8, 0x3f, 0xca, 0x31, 0xa3, 0x8d, 0xe8, 0x43, 0x8a, 0xab, 0x9a, 0xb9, - 0x36, 0x57, 0x70, 0xb0, 0x3e, 0x60, 0x8c, 0xbf, 0x71, 0x64, 0xd6, 0x30, - 0x54, 0x88, 0x41, 0x84, 0x35, 0xcb, 0xd6, 0x5b, 0xff, 0x0f, 0x35, 0xb7, - 0xc6, 0x1b, 0xc0, 0x36, 0x98, 0xd4, 0x4f, 0x41, 0x77, 0x7a, 0xae, 0xe9, - 0xd6, 0xb7, 0x05, 0xb6, 0x6b, 0x83, 0x9b, 0x8a, 0x66, 0x5a, 0x9d, 0x34, - 0x85, 0x23, 0x62, 0x26, 0x99, 0x18, 0x34, 0x61, 0xc4, 0x53, 0xe1, 0x8b, - 0x5e, 0xdd, 0x32, 0x05, 0x42, 0x7e, 0x4b, 0xfd, 0x05, 0x8a, 0x6b, 0xc0, - 0xc9, 0xc1, 0x80, 0x10, 0x1d, 0x0e, 0x05, 0x93, 0x0d, 0x61, 0x3c, 0x57, - 0x39, 0xef, 0x4f, 0x51, 0x54, 0x12, 0xb7, 0x2e, 0x67, 0xa7, 0x12, 0xca, - 0x1c, 0x69, 0x3b, 0x76, 0x65, 0xa3, 0xd9, 0x7e, 0x6e, 0x5e, 0xc3, 0x34, - 0x79, 0x24, 0x50, 0x41, 0x8b, 0x77, 0x02, 0x4a, 0xcc, 0x8f, 0x99, 0xdf, - 0x7d, 0x62, 0x8a, 0xcc, 0x39, 0xae, 0xb2, 0x9b, 0x16, 0xf0, 0x72, 0x10, - 0x3f, 0x3b, 0xc6, 0x53, 0x05, 0xa7, 0xf5, 0x53, 0x49, 0xf8, 0x7c, 0x97, - 0xac, 0x76, 0x1b, 0x88, 0x83, 0xc4, 0x4b, 0x95, 0xdf, 0xcb, 0xa7, 0xe3, - 0xfb, 0x06, 0x25, 0x68, 0x26, 0x0f, 0x63, 0x93, 0xb7, 0x11, 0xac, 0x43, - 0x26, 0xdf, 0x09, 0x3d, 0xcb, 0xa6, 0x89, 0xd0, 0xc7, 0x09, 0x16, 0xf6, - 0xa7, 0x36, 0x77, 0xde, 0x49, 0xa2, 0xb1, 0xdd, 0x77, 0x8f, 0xd0, 0x02, - 0xed, 0xa6, 0x0d, 0x3f, 0xe0, 0xd4, 0xf4, 0xbb, 0xf3, 0x68, 0xab, 0xcc, - 0x0a, 0x34, 0x52, 0xc8, 0x68, 0x47, 0x05, 0xff, 0x67, 0xaa, 0x14, 0x36, - 0xc9, 0xc0, 0x35, 0x66, 0x3f, 0x03, 0xb3, 0x68, 0x0f, 0xb2, 0x76, 0x30, - 0x36, 0x72, 0xc6, 0x79, 0x69, 0xc0, 0x3f, 0x55, 0xba, 0x65, 0x4a, 0x06, - 0xa0, 0x2a, 0x84, 0xea, 0xab, 0xb7, 0xff, 0xf4, 0x3e, 0xc2, 0xd3, 0xa9, - 0x4f, 0x3e, 0xc7, 0xa5, 0x13, 0xe4, 0xed, 0x53, 0x9c, 0x53, 0xc1, 0xdf, - 0xb0, 0x73, 0xeb, 0x20, 0x1e, 0x11, 0x86, 0x2d, 0xaf, 0x11, 0x06, 0x27, - 0x75, 0x7a, 0xb0, 0x1d, 0xff, 0x8f, 0xb4, 0x94, 0xaf, 0xac, 0xa4, 0x69, - 0x93, 0xd9, 0x4b, 0x47, 0xad, 0xe1, 0x10, 0xe5, 0x5a, 0x34, 0xa8, 0xe9, - 0x1e, 0x14, 0xa4, 0x47, 0x5a, 0xc5, 0x0e, 0xe5, 0xe7, 0x02, 0x7d, 0xc0, - 0x65, 0x4c, 0x81, 0x42, 0x8c, 0x37, 0xa2, 0xad, 0xed, 0x1f, 0xad, 0x62, - 0x63, 0xd2, 0xac, 0xfa, 0x00, 0xdc, 0x88, 0x12, 0x65, 0x74, 0xe4, 0x7f, - 0xd9, 0xaa, 0x86, 0xf6, 0xcd, 0x6b, 0x00, 0xd5, 0x32, 0x44, 0x3d, 0x47, - 0x39, 0x3d, 0x7d, 0x2a, 0xd3, 0x83, 0x9f, 0xa9, 0x00, 0x41, 0xe3, 0x41, - 0x4a, 0x45, 0x91, 0xa9, 0x91, 0x2c, 0x3f, 0x83, 0x5f, 0x6c, 0xbe, 0xdc, - 0xd9, 0x14, 0x63, 0x87, 0xd4, 0x9c, 0x0e, 0x2c, 0x69, 0x9d, 0x66, 0x1e, - 0xae, 0x12, 0xd5, 0xba, 0x57, 0xc7, 0x0c, 0xf7, 0x37, 0x51, 0xb2, 0x53, - 0x7a, 0xce, 0xa0, 0xd7, 0x6a, 0x13, 0xfe, 0xa0, 0x8a, 0xa4, 0xfe, 0x0a, - 0x4e, 0x1d, 0x36, 0x02, 0x36, 0xa0, 0xf5, 0xf7, 0x6e, 0xa0, 0x1d, 0x86, - 0x08, 0xa8, 0x54, 0x9f, 0xa2, 0x7a, 0x99, 0xeb, 0x91, 0x63, 0x61, 0xe3, - 0xe1, 0x1e, 0x86, 0x84, 0x57, 0x02, 0x1f, 0x9a, 0xae, 0x29, 0x2f, 0xf2, - 0xad, 0x47, 0x6d, 0xc4, 0xed, 0xb6, 0xe7, 0x4f, 0xe1, 0x25, 0x1b, 0xba, - 0x72, 0x8c, 0x82, 0x5d, 0x19, 0x4f, 0xbf, 0xd2, 0x2c, 0x08, 0x48, 0xfe, - 0x4d, 0xb9, 0x45, 0xd8, 0xe1, 0xe9, 0xc5, 0x9d, 0x1c, 0x58, 0xfd, 0xa0, - 0x7e, 0xb5, 0x96, 0x52, 0x59, 0xa4, 0xdf, 0x43, 0xa1, 0x26, 0xd4, 0x82, - 0xbc, 0x41, 0xce, 0x0b, 0xf1, 0x32, 0xb7, 0xad, 0x01, 0x5a, 0x58, 0x7e, - 0xed, 0x26, 0xb3, 0x29, 0x78, 0x9f, 0x3c, 0xeb, 0x35, 0x2c, 0x2b, 0xae, - 0x59, 0xf2, 0xf3, 0x48, 0x5d, 0x50, 0xd2, 0x7b, 0x8b, 0x5b, 0x19, 0xb0, - 0x6d, 0xa9, 0x4d, 0xf9, 0xa9, 0x04, 0x82, 0xd0, 0xd1, 0x13, 0x75, 0xa9, - 0x7c, 0xff, 0x07, 0xb1, 0xbd, 0xb1, 0xf8, 0xea, 0x9c, 0x63, 0xa8, 0xa7, - 0xff, 0x9e, 0x54, 0xc9, 0xcd, 0x22, 0x5d, 0x5c, 0x5d, 0x34, 0x92, 0x8d, - 0x73, 0xa0, 0x0c, 0x2f, 0xb1, 0xe8, 0x2e, 0x49, 0x1d, 0xe0, 0x4c, 0x7a, - 0x76, 0xfe, 0xf4, 0x29, 0x3a, 0xc2, 0x36, 0x3b, 0x1d, 0xe6, 0x95, 0x3d, - 0x8d, 0xb3, 0x88, 0xab, 0x8d, 0xa6, 0x7b, 0x3b, 0x43, 0x5b, 0x62, 0x75, - 0x56, 0x0c, 0x47, 0xfb, 0x52, 0xe3, 0x8d, 0x36, 0xe2, 0x49, 0x20, 0xcf, - 0xbd, 0xd8, 0xee, 0x96, 0x23, 0x23, 0x96, 0x92, 0xce, 0x4c, 0x99, 0x4b, - 0x43, 0x9b, 0x39, 0x75, 0x05, 0x23, 0x16, 0x49, 0xed, 0x57, 0x03, 0x2d, - 0x47, 0x09, 0xf6, 0x9e, 0xa7, 0x31, 0xc6, 0x74, 0xd0, 0x7c, 0x91, 0x00, - 0x3d, 0x18, 0x8a, 0x8b, 0x85, 0x61, 0xca, 0x52, 0xcc, 0x8a, 0xc7, 0xeb, - 0x0b, 0xcb, 0xae, 0x59, 0x5c, 0x6d, 0xa8, 0x56, 0x5d, 0x27, 0xaa, 0x5a, - 0xc3, 0xf3, 0xd9, 0x75, 0x69, 0xb3, 0x9f, 0x71, 0x87, 0xaf, 0x0d, 0xe7, - 0x9a, 0xf2, 0x68, 0x08, 0xde, 0x90, 0x68, 0x4e, 0x25, 0xd3, 0x7e, 0x93, - 0x6c, 0xf9, 0xaf, 0xa4, 0xf5, 0x6d, 0x33, 0x26, 0x31, 0xb3, 0x9e, 0x8d, - 0x24, 0x54, 0x34, 0x77, 0xed, 0xc8, 0x77, 0x62, 0xa8, 0xe5, 0x66, 0x8a, - 0x5d, 0x4e, 0xff, 0xd6, 0x96, 0xe2, 0x7f, 0x26, 0x45, 0xa4, 0xd0, 0xd4, - 0x6a, 0x48, 0x83, 0x4d, 0x31, 0x1e, 0x5a, 0x5e, 0xfc, 0xcb, 0x25, 0xcb, - 0xd8, 0x9e, 0x00, 0x2c, 0xdf, 0x88, 0x63, 0xb9, 0x69, 0x99, 0x29, 0x96, - 0x36, 0x25, 0x8c, 0x1f, 0xfc, 0x38, 0x67, 0xda, 0x00, 0x06, 0xcc, 0xfc, - 0xbb, 0xc9, 0xb3, 0x8c, 0xe3, 0x10, 0xab, 0xdb, 0x07, 0xbe, 0xdf, 0x0b, - 0xd1, 0xa8, 0xd5, 0x1a, 0xb6, 0x75, 0x02, 0xd4, 0x29, 0x98, 0x3b, 0xaa, - 0xab, 0xae, 0x65, 0xbf, 0x22, 0xc5, 0xe5, 0xb5, 0x95, 0xca, 0x6e, 0x30, - 0x41, 0x3b, 0x8b, 0x82, 0xcc, 0xfe, 0x06, 0x68, 0x26, 0x52, 0xe4, 0xbe, - 0x71, 0x3e, 0xd7, 0x3b, 0x5d, 0x66, 0x9c, 0x4a, 0xf2, 0xf0, 0xa8, 0x22, - 0xc2, 0x72, 0x51, 0x0c, 0x4f, 0x72, 0x56, 0x9a, 0xbf, 0x72, 0xf0, 0xc9, - 0x34, 0x4c, 0xa4, 0xb8, 0x87, 0x16, 0xcb, 0x6d, 0x35, 0xb9, 0xb5, 0x2a, - 0x17, 0xa6, 0xbc, 0x5a, 0x0c, 0xc8, 0xb8, 0x76, 0x1d, 0x98, 0x9b, 0x57, - 0xe7, 0x68, 0x63, 0xf6, 0xe6, 0x5e, 0xc2, 0x0d, 0x3c, 0xf2, 0x85, 0xb3, - 0xf1, 0x94, 0xa3, 0x41, 0xb7, 0x12, 0x68, 0xd4, 0x20, 0x8d, 0xa7, 0x11, - 0x76, 0x6f, 0xd3, 0xf1, 0x3b, 0x28, 0xa8, 0x8b, 0xbd, 0x4d, 0x02, 0x4e, - 0x65, 0x36, 0xaa, 0xfa, 0xef, 0x11, 0xaf, 0x6a, 0x7d, 0x38, 0x27, 0x2d, - 0x51, 0xff, 0x3f, 0xcf, 0xb7, 0x15, 0xb9, 0xb0, 0xef, 0x8e, 0x52, 0xe8, - 0x39, 0x1a, 0x49, 0x50, 0x0b, 0x2a, 0xfe, 0x13, 0xa6, 0x88, 0xac, 0xe6, - 0x58, 0xf9, 0xd9, 0x65, 0x2e, 0xfe, 0x26, 0x80, 0x0f, 0xbd, 0x7f, 0xd3, - 0x58, 0x2b, 0x6b, 0x0c, 0xa2, 0x77, 0x43, 0xbd, 0x4f, 0x78, 0x4f, 0x08, - 0xee, 0x79, 0x17, 0x33, 0xd7, 0x2c, 0x6b, 0x3a, 0x82, 0xdd, 0x4c, 0xa8, - 0x00, 0x6c, 0xfb, 0x21, 0x0e, 0x8a, 0x43, 0x5d, 0xc4, 0x65, 0xae, 0xa5, - 0xaf, 0x8a, 0x27, 0xc9, 0xa2, 0xc2, 0xe6, 0x6d, 0xae, 0x57, 0xbd, 0xb7, - 0x76, 0xd0, 0xf7, 0x96, 0x3c, 0xbb, 0x2a, 0xe5, 0x10, 0x04, 0x2a, 0xcd, - 0xe5, 0x7d, 0x00, 0x2d, 0x17, 0x51, 0x9e, 0xa0, 0x67, 0x6c, 0xcf, 0x60, - 0x6e, 0xd1, 0xf3, 0x62, 0x2f, 0x6a, 0xfd, 0x89, 0xce, 0xbb, 0x38, 0xea, - 0x9c, 0xcc, 0x92, 0x5f, 0x3c, 0x3f, 0x93, 0xbe, 0x29, 0xe7, 0x44, 0x24, - 0xac, 0xae, 0x0e, 0x1e, 0x3b, 0xcb, 0x8c, 0x6e, 0xff, 0x9a, 0xcb, 0x01, - 0xca, 0xe5, 0xb3, 0xe7, 0xf9, 0x4b, 0x38, 0x70, 0x3e, 0x22, 0x57, 0xf4, - 0xb7, 0x6f, 0x66, 0xbb, 0x45, 0x3d, 0x7f, 0xbd, 0xea, 0x62, 0x6a, 0x1b, - 0x3c, 0x3e, 0xb1, 0x54, 0xd4, 0x8d, 0x93, 0x86, 0x3e, 0xa3, 0xdb, 0x7f, - 0xf7, 0xa5, 0x2d, 0x85, 0x5d, 0xf3, 0x3a, 0x17, 0xbc, 0x1d, 0x3d, 0x3d, - 0xee, 0x4b, 0xfe, 0xf8, 0xd1, 0x57, 0x7d, 0xfa, 0x9c, 0x2c, 0x5a, 0x90, - 0x95, 0x4d, 0x72, 0x02, 0x39, 0x99, 0xbb, 0x82, 0xa0, 0x71, 0x1b, 0xd4, - 0x61, 0xae, 0x14, 0x18, 0xec, 0xcf, 0xec, 0xa8, 0x46, 0x49, 0xab, 0x11, - 0xe4, 0xf3, 0xfa, 0x8c, 0xac, 0x32, 0x07, 0xb2, 0xcb, 0x36, 0xbe, 0x33, - 0x26, 0x0a, 0x9c, 0x08, 0x49, 0x32, 0x65, 0x98, 0xd7, 0x61, 0x7d, 0xb8, - 0x35, 0xca, 0x1d, 0x61, 0x3e, 0x9b, 0xf0, 0x43, 0x85, 0x35, 0x79, 0x2f, - 0xc1, 0x66, 0x62, 0x96, 0x67, 0xf5, 0xf7, 0xb8, 0xac, 0xbf, 0xfe, 0x11, - 0x0d, 0x2b, 0x4f, 0xb6, 0x5d, 0x35, 0xa7, 0x18, 0x28, 0x41, 0xb5, 0x2c, - 0x38, 0x6d, 0x95, 0x26, 0x40, 0x48, 0x87, 0x1f, 0xc2, 0x47, 0xb2, 0x66, - 0x47, 0x73, 0xdc, 0x56, 0x37, 0x75, 0x7a, 0x95, 0xf9, 0xf6, 0x70, 0x17, - 0xa3, 0x67, 0x37, 0x4b, 0x48, 0x6c, 0x8c, 0xc9, 0xb9, 0x5b, 0xd2, 0x30, - 0xa0, 0x04, 0x14, 0x68, 0x37, 0x06, 0x84, 0xc4, 0xee, 0x14, 0x6b, 0x80, - 0x70, 0xb6, 0x4c, 0x29, 0x80, 0x44, 0x90, 0x90, 0xb0, 0x83, 0x68, 0xdb, - 0x61, 0x6c, 0x2c, 0x3f, 0xcd, 0xb4, 0x43, 0xd3, 0x81, 0xc6, 0x2c, 0x16, - 0x05, 0x86, 0x73, 0xe6, 0x2c, 0x2a, 0x68, 0x0d, 0x99, 0x55, 0x67, 0x45, - 0x07, 0x38, 0x8e, 0xd8, 0xb7, 0x97, 0x18, 0x08, 0xec, 0x3a, 0x9a, 0xbf, - 0x53, 0x49, 0xbf, 0x07, 0x27, 0x1a, 0xcd, 0xa9, 0x42, 0x29, 0x61, 0xb5, - 0xb4, 0x2f, 0xfa, 0x8c, 0xf4, 0x9f, 0x6c, 0x72, 0xf7, 0x14, 0x83, 0x27, - 0x4c, 0xba, 0x48, 0xa2, 0xa5, 0x6e, 0x70, 0xb3, 0xcb, 0x11, 0x0e, 0x26, - 0x8e, 0xd5, 0x54, 0x81, 0x8a, 0xa1, 0x77, 0xb5, 0x68, 0x35, 0x61, 0x2d, - 0x69, 0x1d, 0x9f, 0xed, 0x18, 0xd5, 0xbc, 0x8e, 0x3e, 0x68, 0x51, 0xee, - 0xb1, 0xf9, 0x60, 0xf6, 0xba, 0x43, 0xeb, 0xbc, 0x99, 0xd0, 0x09, 0xe8, - 0x97, 0x1f, 0x4a, 0x79, 0xd3, 0x23, 0x7a, 0xa5, 0x10, 0x68, 0x99, 0x9c, - 0x5e, 0x4e, 0x37, 0x07, 0x31, 0x6d, 0x15, 0x7a, 0x7a, 0x8f, 0x12, 0x90, - 0x49, 0x0c, 0xd2, 0x24, 0x4b, 0xe3, 0x87, 0x7b, 0xb0, 0xd5, 0x8c, 0xc3, - 0x2b, 0xa2, 0xe8, 0x3a, 0xc4, 0xd9, 0xd2, 0xb0, 0xd7, 0x7b, 0x1b, 0xd3, - 0xac, 0x89, 0x51, 0xe4, 0xde, 0x7e, 0xa7, 0xb0, 0xf9, 0x39, 0xae, 0x37, - 0xeb, 0xe6, 0x85, 0x16, 0xe2, 0x40, 0x1a, 0x18, 0x67, 0x15, 0xf6, 0x35, - 0x0d, 0xbc, 0x2f, 0x7f, 0x5c, 0x2a, 0x99, 0x9b, 0x0f, 0x29, 0x20, 0x0c, - 0x13, 0x4a, 0xf0, 0xdd, 0xc8, 0x30, 0x3a, 0x35, 0x49, 0x4c, 0xff, 0x8d, - 0xcb, 0xe0, 0xd3, 0x88, 0x14, 0x50, 0xef, 0x51, 0x25, 0x00, 0x4c, 0x24, - 0x18, 0x23, 0xe6, 0xa5, 0x5b, 0x0e, 0xce, 0xaa, 0xed, 0x96, 0x07, 0xa7, - 0x5e, 0x4d, 0x6a, 0x08, 0x7b, 0xbe, 0x0a, 0x47, 0x31, 0xff, 0x0d, 0xeb, - 0xb7, 0x25, 0xf9, 0x87, 0xff, 0x7c, 0x87, 0x2f, 0x33, 0xda, 0x9e, 0xef, - 0x7a, 0xdb, 0xba, 0xa7, 0xd6, 0xd2, 0x67, 0xf9, 0x43, 0x21, 0x02, 0xf3, - 0x14, 0xe9, 0x84, 0xae, 0xce, 0xdb, 0xc0, 0xf7, 0xaf, 0x50, 0x5a, 0x5b, - 0xcb, 0xb1, 0x25, 0x46, 0xbe, 0x12, 0xaf, 0x16, 0x79, 0x59, 0x29, 0xb3, - 0xac, 0x31, 0x3e, 0x47, 0x93, 0x09, 0x08, 0x9f, 0x09, 0x1e, 0x2d, 0x1d, - 0x20, 0x10, 0xe3, 0xa5, 0x06, 0x74, 0x21, 0x91, 0x37, 0x99, 0xcb, 0xb9, - 0x39, 0x29, 0x67, 0x12, 0xeb, 0x60, 0x55, 0x5f, 0x93, 0xe0, 0x46, 0x82, - 0xb6, 0xdf, 0x27, 0xf8, 0xd2, 0x38, 0xc4, 0xd2, 0xc0, 0x31, 0xf2, 0x31, - 0x7b, 0xf5, 0x36, 0x7a, 0xdb, 0xf9, 0x63, 0xde, 0x5c, 0x5b, 0xf2, 0x06, - 0x29, 0x02, 0x0c, 0x2a, 0x20, 0xe2, 0x35, 0x45, 0xbc, 0x1d, 0xc8, 0xa5, - 0xe1, 0xb6, 0x09, 0x3d, 0x5e, 0x0e, 0x77, 0x27, 0x1b, 0xd2, 0x5f, 0x4b, - 0x0a, 0xbc, 0xfc, 0xfe, 0x10, 0x75, 0x04, 0x2c, 0xf8, 0x86, 0x65, 0x4b, - 0xeb, 0xb5, 0x3b, 0x0a, 0xfc, 0x75, 0xe6, 0x93, 0x3c, 0xc1, 0xb5, 0x7f, - 0x60, 0x95, 0x5f, 0xaf, 0x34, 0x8e, 0x99, 0x40, 0x70, 0x52, 0x59, 0x68, - 0x50, 0x9e, 0x72, 0x16, 0x83, 0x69, 0xc9, 0xdd, 0xff, 0x67, 0x68, 0x47, - 0x4c, 0xdb, 0x52, 0xef, 0x52, 0x58, 0xc8, 0xea, 0xb8, 0x9d, 0xb5, 0xa3, - 0x01, 0x2d, 0xf5, 0xf9, 0x1e, 0x1d, 0xc7, 0xb0, 0x4c, 0x9d, 0xd8, 0x0b, - 0x20, 0x66, 0x9f, 0x90, 0x59, 0xc1, 0x98, 0x15, 0x33, 0x22, 0xea, 0x51, - 0x74, 0x9c, 0xe5, 0xe3, 0x3e, 0xd5, 0x86, 0xa5, 0xee, 0xdb, 0xf9, 0x37, - 0x1d, 0x73, 0x8c, 0x11, 0xd1, 0x18, 0x3f, 0x0c, 0x52, 0x57, 0x98, 0x30, - 0x14, 0xc0, 0x72, 0x84, 0xd1, 0x4b, 0x9a, 0x91, 0x9d, 0xc0, 0xbe, 0x3e, - 0xb9, 0x53, 0x8e, 0x8d, 0xab, 0x7d, 0xd0, 0x75, 0x50, 0x98, 0xa2, 0x83, - 0x93, 0xc4, 0xdd, 0x4b, 0xe2, 0xe2, 0x3f, 0xb5, 0xea, 0xbb, 0x10, 0xed, - 0x9a, 0x28, 0x31, 0xf6, 0x1c, 0x7d, 0xb9, 0x7a, 0x1c, 0x8f, 0xc7, 0x22, - 0x61, 0xbf, 0xf6, 0xec, 0x99, 0x14, 0xd5, 0x74, 0xf8, 0xb3, 0x75, 0xc3, - 0x1a, 0xc7, 0x93, 0xf0, 0xb7, 0xcc, 0xf6, 0x79, 0x37, 0x82, 0x10, 0x47, - 0xc1, 0x13, 0xb3, 0x5d, 0x68, 0xa4, 0xcd, 0xd5, 0x1e, 0x27, 0xde, 0x1e, - 0xca, 0x47, 0xe7, 0xe3, 0x5e, 0x32, 0xab, 0xd0, 0xdc, 0xa4, 0x3f, 0xbf, - 0x01, 0xde, 0x9e, 0x1e, 0x77, 0x31, 0xa9, 0xa4, 0x98, 0x51, 0x31, 0xa7, - 0x30, 0x9b, 0xc6, 0xc3, 0xf1, 0x69, 0xc7, 0x40, 0x3d, 0x89, 0xa8, 0xf2, - 0xb1, 0x88, 0xe0, 0x68, 0x36, 0x08, 0x5b, 0x07, 0x96, 0x1f, 0xb7, 0x92, - 0x80, 0xbd, 0xef, 0x22, 0xfa, 0x7d, 0xa3, 0xdd, 0x00, 0x48, 0x8b, 0x70, - 0x34, 0x98, 0xcd, 0x74, 0xe2, 0x25, 0xb2, 0x9c, 0xb0, 0xc5, 0x0c, 0xf5, - 0xbb, 0x59, 0xe6, 0x82, 0xe1, 0x68, 0x03, 0x74, 0x58, 0xeb, 0xcc, 0x75, - 0x1e, 0x9f, 0xa0, 0xe0, 0xba, 0xf5, 0xfd, 0x0d, 0x4f, 0x95, 0x1b, 0x25, - 0xa5, 0x62, 0x89, 0xe4, 0x9b, 0x19, 0xac, 0xe2, 0xa9, 0x36, 0x2c, 0x0c, - 0x9d, 0x7c, 0x14, 0xf8, 0x04, 0x09, 0x0b, 0x53, 0xd1, 0x0d, 0x21, 0xb2, - 0xed, 0xb7, 0xb6, 0xc4, 0xa7, 0xd0, 0xce, 0xf4, 0x18, 0x21, 0x7d, 0xb9, - 0x13, 0xb9, 0xe9, 0x7e, 0x5f, 0x2b, 0x8d, 0x6d, 0x1c, 0x87, 0xef, 0x61, - 0x21, 0xe2, 0xe1, 0x8d, 0xab, 0x21, 0x68, 0x13, 0x7a, 0xa4, 0xe9, 0x65, - 0x4d, 0x96, 0x45, 0x73, 0x16, 0x30, 0x16, 0x86, 0xd0, 0xb8, 0x63, 0x8c, - 0x3b, 0x42, 0x34, 0xfe, 0x07, 0xa7, 0x2f, 0xf2, 0xe7, 0x1d, 0xfb, 0x34, - 0x7f, 0xaa, 0x5b, 0x29, 0x2d, 0x63, 0xee, 0xf2, 0x01, 0x74, 0x1c, 0xe5, - 0x2b, 0x62, 0xae, 0x47, 0xc7, 0xd1, 0xf1, 0xc7, 0xa0, 0x9a, 0x0b, 0x49, - 0x1c, 0x9f, 0x1c, 0x27, 0x21, 0xa1, 0x4b, 0x29, 0x7a, 0xcb, 0x69, 0x0c, - 0x2d, 0x2c, 0x27, 0xca, 0xd2, 0x09, 0x61, 0x6b, 0x1b, 0x38, 0x03, 0x17, - 0xdf, 0x39, 0xeb, 0x4c, 0x79, 0xbd, 0xcb, 0x35, 0x7b, 0xc9, 0x12, 0x2f, - 0xaa, 0xb1, 0xba, 0x36, 0xa2, 0x49, 0xc2, 0x09, 0xac, 0x2f, 0x3d, 0x89, - 0x97, 0xe9, 0x53, 0x82, 0xcd, 0xa2, 0x16, 0xd6, 0x6d, 0xdb, 0x53, 0xb7, - 0x91, 0x7c, 0xdd, 0xb0, 0xf4, 0xfa, 0xe6, 0x5a, 0xda, 0xcd, 0xc1, 0x97, - 0x8f, 0xbd, 0xba, 0xf0, 0xa5, 0xe8, 0xf8, 0x17, 0xcc, 0x5d, 0xeb, 0x9e, - 0x63, 0x2c, 0x35, 0x77, 0x27, 0xc9, 0xbd, 0x85, 0x4b, 0xae, 0xe7, 0xb5, - 0x64, 0x1f, 0x9b, 0x4b, 0x86, 0x10, 0x38, 0xa5, 0x0e, 0x55, 0xaa, 0x91, - 0x7a, 0xbb, 0x04, 0xf7, 0x7b, 0x04, 0xce, 0xcd, 0xe5, 0x9b, 0x3a, 0x0b, - 0x20, 0x91, 0x33, 0xb9, 0x1a, 0x49, 0x03, 0x77, 0xb1, 0x3c, 0xe8, 0xac, - 0xf4, 0x74, 0xf6, 0xf2, 0x53, 0x35, 0x91, 0xc1, 0xa9, 0xf6, 0x04, 0xae, - 0x1e, 0x56, 0xbe, 0xb9, 0xf6, 0x09, 0xf5, 0x8d, 0xee, 0x31, 0xd3, 0xe7, - 0x3c, 0x04, 0x7c, 0x7e, 0xb0, 0x5b, 0xae, 0x0c, 0x1c, 0xcd, 0x29, 0xd2, - 0x65, 0x48, 0x2b, 0x75, 0x7f, 0x67, 0xff, 0x43, 0x08, 0x27, 0x4f, 0x8c, - 0xad, 0x28, 0x3a, 0xd8, 0x72, 0x38, 0x4f, 0x0f, 0x95, 0xf9, 0x2b, 0xe5, - 0xaa, 0xb5, 0xc9, 0x2f, 0x37, 0x4f, 0x16, 0xc4, 0x35, 0x38, 0xdf, 0xd2, - 0x1d, 0xe2, 0xad, 0x57, 0xf0, 0xfe, 0x45, 0x11, 0xd3, 0x0e, 0xd6, 0x8c, - 0x6d, 0x34, 0x5a, 0x59, 0x6c, 0x54, 0x17, 0xa9, 0x25, 0x7c, 0x12, 0xad, - 0xf3, 0x02, 0x92, 0xa7, 0x81, 0x1b, 0x90, 0x7d, 0x92, 0x65, 0xac, 0xcc, - 0x12, 0xe4, 0x9d, 0xb7, 0x65, 0xe9, 0x07, 0xdd, 0x1c, 0x19, 0x62, 0x24, - 0x65, 0x82, 0x73, 0x1e, 0x79, 0xad, 0x87, 0xc8, 0xb6, 0x31, 0xd6, 0xc0, - 0x02, 0xc1, 0xb2, 0xf4, 0x16, 0xc9, 0xd4, 0x4d, 0xe1, 0x41, 0xe0, 0xc0, - 0x0e, 0x98, 0x6f, 0xb7, 0x54, 0xfb, 0xd8, 0xae, 0x28, 0x32, 0x8a, 0x83, - 0x82, 0x0f, 0x25, 0x6f, 0x83, 0x25, 0x4a, 0xca, 0xc5, 0xc0, 0xb2, 0x0e, - 0xcc, 0x35, 0xcb, 0x3c, 0x27, 0xdd, 0x2d, 0x38, 0xfd, 0x44, 0xf1, 0xfb, - 0xf6, 0xe1, 0xb8, 0x90, 0xb1, 0xe3, 0x64, 0x71, 0x70, 0x9c, 0x6a, 0xf6, - 0x63, 0x87, 0x0b, 0xbc, 0x1a, 0x25, 0x86, 0xc4, 0xba, 0xa9, 0x13, 0x77, - 0x44, 0xe0, 0xb0, 0xfc, 0x8b, 0xdf, 0x5e, 0x48, 0x3b, 0x8f, 0x05, 0x79, - 0x01, 0x74, 0x37, 0x35, 0x03, 0x7c, 0x3c, 0x21, 0x2b, 0xdd, 0x23, 0x3e, - 0x88, 0x67, 0xf7, 0x45, 0x6e, 0xc6, 0x8a, 0x2c, 0x5d, 0x61, 0x59, 0xbb, - 0xfd, 0x52, 0xc4, 0xc1, 0x23, 0xe2, 0xba, 0xfc, 0x20, 0xcc, 0x3c, 0xce, - 0xad, 0x9d, 0x68, 0x5c, 0xd7, 0xc6, 0x47, 0x71, 0x40, 0x5c, 0x21, 0xfe, - 0xe9, 0xaa, 0x68, 0xdd, 0x0f, 0x99, 0xca, 0x20, 0x27, 0x65, 0x9d, 0xf0, - 0x99, 0xb9, 0xfb, 0x64, 0x45, 0xa9, 0xbf, 0xf7, 0x26, 0x4b, 0x50, 0x68, - 0x27, 0x2e, 0xe8, 0x0f, 0xdb, 0xa3, 0xe8, 0xe5, 0xdc, 0xdf, 0x87, 0x1f, - 0xa1, 0x8d, 0x08, 0x93, 0x3a, 0x54, 0x88, 0x53, 0x20, 0x14, 0x1e, 0x18, - 0xe4, 0x6a, 0xb7, 0x7d, 0xda, 0xaa, 0x8c, 0x5c, 0x70, 0xfe, 0x02, 0x5b, - 0xbc, 0x9b, 0x76, 0x0a, 0x94, 0x89, 0x86, 0x22, 0xaa, 0xa6, 0x4a, 0x58, - 0xa4, 0x19, 0x9b, 0x63, 0xea, 0x25, 0x01, 0xdb, 0x90, 0x1e, 0x3d, 0x23, - 0x5b, 0x32, 0xbd, 0x3c, 0x32, 0xfa, 0x65, 0xdb, 0xdc, 0x07, 0xcc, 0xdb, - 0x3a, 0xb9, 0xe8, 0x17, 0x25, 0x9f, 0x1f, 0x9c, 0x97, 0xfb, 0x0f, 0xca, - 0x30, 0x11, 0xc4, 0x61, 0x81, 0xb2, 0xa1, 0x04, 0xd5, 0x05, 0x3b, 0x0f, - 0x88, 0x2e, 0x0f, 0xbd, 0x29, 0xf0, 0xa4, 0x8f, 0x96, 0x8c, 0xf4, 0xda, - 0x15, 0xb7, 0xf7, 0x53, 0x09, 0x67, 0xc7, 0x5e, 0x8d, 0x6b, 0x7e, 0x3e, - 0xfc, 0x64, 0x8f, 0xa8, 0x11, 0x85, 0x14, 0x62, 0x93, 0xd1, 0x6b, 0xbc, - 0x5d, 0x21, 0x9f, 0x58, 0xc2, 0x92, 0xda, 0xf3, 0xa7, 0x91, 0x33, 0x7b, - 0x15, 0x77, 0xf3, 0xcf, 0x89, 0x3e, 0xd5, 0x20, 0xb2, 0x80, 0x31, 0xf0, - 0x03, 0xb6, 0x99, 0x00, 0x8f, 0x53, 0x53, 0xc5, 0x15, 0xfb, 0x67, 0x17, - 0xa1, 0x81, 0xe1, 0x2a, 0xe1, 0x32, 0x2b, 0xda, 0x62, 0xa8, 0x64, 0xc2, - 0x54, 0xd1, 0xe8, 0xa5, 0x47, 0x4d, 0x79, 0x3c, 0x8f, 0xae, 0xb4, 0xe6, - 0xd1, 0x1e, 0x0d, 0x41, 0xe7, 0x1a, 0x56, 0x72, 0x93, 0xd4, 0x2d, 0x9f, - 0x9b, 0x40, 0x38, 0x1f, 0x94, 0xbe, 0x74, 0x3b, 0x23, 0x24, 0x27, 0x6a, - 0x1e, 0x0c, 0xd8, 0xe6, 0x75, 0xa5, 0x9d, 0xb2, 0xe1, 0x6b, 0xc8, 0xb5, - 0xa0, 0x84, 0x7f, 0xa8, 0x91, 0x3f, 0xde, 0x9b, 0xca, 0x6e, 0x2e, 0x4a, - 0x96, 0x9e, 0x4e, 0xe7, 0x14, 0x06, 0xba, 0xff, 0x20, 0x35, 0x9a, 0x04, - 0x1e, 0x48, 0xa4, 0xbc, 0x57, 0xa4, 0xab, 0xd2, 0x2d, 0x7f, 0x8e, 0x16, - 0x34, 0x92, 0xf2, 0x78, 0xac, 0xd3, 0x13, 0xe4, 0x4e, 0x59, 0x88, 0x6b, - 0x80, 0x02, 0xb7, 0x78, 0x00, 0x17, 0xf8, 0x64, 0x9f, 0xf6, 0x6d, 0xfa, - 0xa4, 0xc6, 0x36, 0x75, 0x31, 0xcb, 0xa3, 0x12, 0xac, 0x18, 0xd3, 0x72, - 0x3f, 0x69, 0x12, 0x5a, 0x2f, 0x1f, 0x6e, 0x34, 0xa5, 0xb1, 0x96, 0x42, - 0x65, 0x8d, 0x94, 0xa0, 0xcc, 0x66, 0xd3, 0x4a, 0x3b, 0x2b, 0x67, 0x10, - 0x69, 0x89, 0x82, 0x80, 0xa0, 0xd1, 0x68, 0xcb, 0x00, 0x47, 0xed, 0x49, - 0x08, 0x4a, 0x34, 0x74, 0xbb, 0xdc, 0x3a, 0x34, 0x37, 0xda, 0x9d, 0xca, - 0xf3, 0xd9, 0x81, 0xb3, 0x36, 0x07, 0x06, 0x4c, 0x1d, 0x16, 0x38, 0x49, - 0x0c, 0xb1, 0xb7, 0x31, 0x39, 0x19, 0xc9, 0xad, 0xf7, 0xb2, 0xa8, 0xd9, - 0x38, 0x51, 0xdb, 0x8d, 0xf4, 0x6b, 0x41, 0x08, 0xbe, 0x73, 0x62, 0x3c, - 0x2d, 0x9b, 0x7a, 0xad, 0xf6, 0x64, 0xa8, 0x85, 0x94, 0x28, 0x39, 0x9c, - 0x1e, 0x06, 0xaa, 0x3a, 0x70, 0x88, 0x20, 0x7d, 0x60, 0x36, 0xf1, 0x95, - 0x30, 0x64, 0xf4, 0x0f, 0x55, 0xf1, 0x5a, 0x4d, 0xa5, 0xd2, 0x6e, 0xe6, - 0xf7, 0x57, 0xb4, 0x8c, 0xdd, 0x86, 0x3c, 0x91, 0x95, 0x64, 0xad, 0xb3, - 0xd7, 0x3c, 0x45, 0xfc, 0xb7, 0x77, 0xa7, 0x35, 0xa4, 0x8a, 0x13, 0x11, - 0x73, 0x61, 0x0f, 0xcf, 0xa5, 0xd2, 0x6e, 0xe6, 0xf7, 0x57, 0xb4, 0xbc, - 0xdd, 0x86, 0x3c, 0x91, 0x95, 0x64, 0xad, 0xb3, 0xde, 0xc7, 0xce, 0xc2, - 0x7b, 0x22, 0x52, 0xff, 0x1c, 0x65, 0xd3, 0x1c, 0x0d, 0x5d, 0xee, 0x54, - 0xa5, 0xd2, 0x6e, 0xe6, 0xf7, 0x57, 0xb4, 0xdc, 0xdd, 0x86, 0x3c, 0x91, - 0x95, 0x64, 0xad, 0xb3, 0xe5, 0xd5, 0x11, 0x83, 0x6d, 0xee, 0xee, 0x4e, - 0x53, 0xe2, 0xa7, 0x03, 0x55, 0x04, 0xb7, 0x28, 0x87, 0x32, 0x5b, 0xae, - 0xe9, 0x45, 0x8a, 0xdf, 0xd7, 0xd5, 0xd6, 0xe8, 0xab, 0x6b, 0xb8, 0xb9, - 0x8a, 0x3e, 0x77, 0xce, 0xa9, 0x7e, 0x15, 0xee, 0xa8, 0x35, 0xe8, 0xdb, - 0x25, 0x80, 0xb1, 0x46, 0x77, 0x42, 0x3b, 0x4d, 0x78, 0x09, 0xd0, 0xd4, - 0x24, 0x76, 0xd6, 0x27, 0xc4, 0x56, 0xce, 0x10, 0x87, 0x32, 0x5b, 0xae, - 0xe9, 0x45, 0x8a, 0xdf, 0xd7, 0x75, 0xd6, 0xe8, 0xab, 0x73, 0xb8, 0xb9, - 0xbe, 0x55, 0x27, 0xba, 0xda, 0xdc, 0x13, 0x77, 0x3f, 0x64, 0xc0, 0x2b, - 0xe7, 0xc9, 0x46, 0x9a, 0x1e, 0xa6, 0xf2, 0x8c, 0x40, 0xf9, 0x0a, 0x85, - 0x88, 0x0b, 0x23, 0x14, 0x0c, 0x98, 0x15, 0xcf, 0x5f, 0x15, 0x61, 0x11, - 0xe9, 0x66, 0x01, 0xc1, 0x0c, 0x60, 0xc7, 0x9d, 0x42, 0xe1, 0x16, 0x64, - 0xc6, 0x6e, 0x6a, 0x88, 0x3f, 0x4b, 0xee, 0xb0, 0x62, 0x98, 0xc5, 0xc8, - 0x31, 0xa8, 0x16, 0xf0, 0x79, 0xcb, 0xbe, 0xa0, 0xf5, 0xa8, 0x93, 0x4d, - 0xd4, 0xc0, 0xfe, 0xd7, 0x8b, 0xa0, 0x09, 0x7b, 0xd7, 0xae, 0x4b, 0x11, - 0x21, 0xd8, 0xfe, 0xaf, 0x03, 0x8f, 0x9f, 0x43, 0x60, 0x9d, 0x01, 0xfa, - 0x4f, 0xa5, 0x62, 0x36, 0x21, 0x93, 0xac, 0x59, 0x0b, 0xb0, 0x79, 0x7e, - 0x87, 0x8f, 0x23, 0x39, 0x99, 0x3c, 0x7e, 0x63, 0xd8, 0x1c, 0xd7, 0x74, - 0xb8, 0x85, 0xdb, 0xf5, 0x77, 0xa4, 0xcf, 0x7c, 0x84, 0x1d, 0x19, 0x4a, - 0xf1, 0x35, 0xeb, 0x0f, 0x04, 0x2a, 0x87, 0x5d, 0xe9, 0x8d, 0x36, 0x75, - 0x72, 0x53, 0xa3, 0xbf, 0xc1, 0x20, 0x17, 0x8e, 0x24, 0x36, 0x12, 0x80, - 0xae, 0x1a, 0x03, 0x59, 0xbc, 0x13, 0xb5, 0xed, 0x62, 0x87, 0xb9, 0x55, - 0x64, 0x8c, 0xec, 0xd6, 0x9d, 0xd1, 0xeb, 0x56, 0x85, 0x86, 0x48, 0xb2, - 0x7e, 0xc9, 0xe3, 0x69, 0x5f, 0x31, 0x66, 0xca, 0x65, 0xb5, 0xed, 0x39, - 0xd8, 0xe5, 0xe6, 0xea, 0x92, 0x08, 0x27, 0xd4, 0x7f, 0x9e, 0xad, 0xb5, - 0x43, 0x94, 0x6e, 0x61, 0x38, 0xba, 0x2c, 0x4c, 0xbf, 0xbd, 0x97, 0x46, - 0xe8, 0xc2, 0x5a, 0x94, 0x2d, 0x2a, 0x00, 0xda, 0xfa, 0x41, 0xcd, 0x52, - 0x52, 0xc7, 0x71, 0x28, 0x63, 0xca, 0x2e, 0xce, 0xdf, 0xc4, 0x69, 0xf2, - 0x7d, 0x39, 0xba, 0x87, 0xcd, 0x2a, 0xa9, 0x24, 0x8f, 0xd0, 0x54, 0xf2, - 0x06, 0xee, 0x03, 0x65, 0xb4, 0x46, 0x3b, 0xbd, 0x74, 0x4a, 0xa2, 0x00, - 0x8f, 0x5e, 0x2f, 0xe8, 0xda, 0xbe, 0xe4, 0xee, 0x1f, 0x0f, 0xf3, 0x48, - 0xed, 0x53, 0xb7, 0x65, 0x8e, 0x3f, 0xf2, 0x10, 0x9b, 0xf8, 0xec, 0xb7, - 0xfd, 0x7f, 0xff, 0x4c, 0xb8, 0x7c, 0x32, 0x46, 0xbb, 0xd2, 0xf4, 0x06, - 0x1f, 0x25, 0x1c, 0x2a, 0xcb, 0xf9, 0xfb, 0x12, 0x87, 0x48, 0xe4, 0xdf, - 0xfc, 0x1a, 0x8a, 0xf5, 0x4f, 0x8e, 0x19, 0xbc, 0xd1, 0xc8, 0x79, 0x5e, - 0x1c, 0x9c, 0xeb, 0x95, 0x61, 0xa9, 0x2e, 0x9d, 0xfa, 0x67, 0x80, 0x35, - 0x6d, 0xce, 0x5e, 0x45, 0xae, 0xf8, 0x5a, 0x3c, 0x7c, 0xab, 0x0b, 0xd6, - 0xdd, 0x64, 0x0e, 0xe3, 0x2a, 0x2b, 0x46, 0x37, 0x8f, 0x47, 0xc2, 0x03, - 0x0f, 0xa4, 0x4a, 0x63, 0xe8, 0xa6, 0x5e, 0xe4, 0x00, 0xc8, 0xee, 0xd2, - 0xbf, 0xce, 0xad, 0x3f, 0xf1, 0xa8, 0x39, 0x39, 0x70, 0xc9, 0x24, 0x06, - 0xd6, 0xc5, 0x39, 0xf7, 0x0b, 0x6e, 0x6e, 0xf0, 0x66, 0x0f, 0x80, 0x41, - 0x0b, 0x49, 0x82, 0xb1, 0x7c, 0x58, 0x67, 0xf2, 0xde, 0x18, 0xab, 0x62, - 0xbe, 0xfe, 0x48, 0x2f, 0xf2, 0x0f, 0xb8, 0x9a, 0x21, 0xc8, 0x2d, 0xc8, - 0xf5, 0xe5, 0xf1, 0xb1, 0x45, 0xb7, 0x85, 0xdf, 0xf8, 0x4d, 0xe3, 0x34, - 0x1a, 0x10, 0xd9, 0x4c, 0x51, 0x41, 0xe7, 0x01, 0x8c, 0x7b, 0x3a, 0xcd, - 0xe3, 0x69, 0xf2, 0x23, 0xd2, 0xaa, 0xbf, 0xa2, 0xae, 0xb5, 0x4d, 0x52, - 0xc8, 0x8a, 0x4e, 0x50, 0x12, 0xbf, 0xc9, 0x52, 0x3a, 0xcb, 0xd0, 0x54, - 0x65, 0xb7, 0x43, 0x9f, 0xd5, 0xc0, 0xb0, 0x9e, 0xf2, 0x95, 0xe2, 0x87, - 0xc1, 0x21, 0x5a, 0xe2, 0x85, 0x75, 0xfa, 0x04, 0x8d, 0xdb, 0xd8, 0x5d, - 0x6d, 0x72, 0x30, 0xf8, 0x58, 0x54, 0x21, 0xa6, 0xbe, 0x8e, 0x4a, 0x15, - 0xb6, 0x4d, 0xfb, 0xcc, 0xea, 0xd6, 0xe5, 0xae, 0xc6, 0x5e, 0xd6, 0x6f, - 0x74, 0x4c, 0x79, 0x8c, 0x67, 0x6d, 0x94, 0x79, 0xcf, 0x4c, 0x5a, 0xf8, - 0xa8, 0xe3, 0x95, 0x3e, 0x09, 0xfb, 0x6d, 0x44, 0x09, 0x36, 0xc1, 0xf3, - 0x6e, 0x72, 0xbf, 0x95, 0x73, 0x0f, 0xec, 0xca, 0x06, 0x33, 0xb7, 0x1a, - 0x5b, 0xa3, 0x01, 0xaf, 0xaf, 0x83, 0x4d, 0xc8, 0x43, 0xa4, 0x6a, 0x68, - 0xc4, 0x84, 0x0d, 0x1e, 0x12, 0x89, 0xe9, 0x16, 0x61, 0x6f, 0x55, 0x1a, - 0x10, 0xe2, 0x6f, 0x77, 0x3b, 0x4f, 0x87, 0x33, 0xe6, 0xf1, 0x71, 0xaa, - 0xc6, 0x33, 0x8f, 0x28, 0x07, 0xfd, 0x1c, 0x21, 0x58, 0xc1, 0x3f, 0x69, - 0x71, 0xe5, 0x39, 0x21, 0x77, 0xa7, 0xe7, 0x3a, 0xb9, 0x38, 0x2a, 0x0b, - 0x83, 0xb2, 0x33, 0xe6, 0xb9, 0x03, 0x7e, 0xf7, 0x9f, 0xcd, 0xfa, 0x88, - 0xfb, 0x5b, 0x46, 0x3e, 0xf8, 0x65, 0xa6, 0x3f, 0x65, 0xbe, 0x59, 0x81, - 0x5b, 0x6f, 0x87, 0x49, 0x77, 0xf2, 0x3b, 0x4d, 0x65, 0x21, 0xb8, 0xa4, - 0x00, 0x50, 0x8e, 0x15, 0xa2, 0x45, 0xcd, 0x82, 0x67, 0x9b, 0x4b, 0x62, - 0x14, 0x0d, 0x8b, 0x40, 0x61, 0x20, 0x59, 0xcc, 0x63, 0xa6, 0xad, 0x5f, - 0x9c, 0x21, 0xe3, 0x5f, 0x55, 0xc8, 0x82, 0x5f, 0x7e, 0x04, 0xea, 0xfe, - 0x1b, 0x00, 0x1e, 0x9a, 0x30, 0xab, 0x5f, 0x0f, 0x60, 0xbe, 0xb7, 0xec, - 0x57, 0xba, 0xc7, 0xc6, 0x85, 0xaa, 0x8c, 0xbd, 0xb4, 0x10, 0x6d, 0x4c, - 0x27, 0xe0, 0xec, 0xc8, 0xed, 0xfe, 0xda, 0x39, 0x06, 0x9c, 0x45, 0xcd, - 0x7b, 0xe6, 0xbd, 0x1e, 0x91, 0x19, 0xd0, 0x7c, 0x50, 0x6b, 0x93, 0xf7, - 0xad, 0xe1, 0xf9, 0x0f, 0xe2, 0x76, 0x4e, 0x8c, 0x0b, 0xca, 0x96, 0x46, - 0xea, 0xee, 0xf0, 0x46, 0xbe, 0x63, 0xb0, 0x5e, 0x75, 0x0a, 0xdd, 0xba, - 0x08, 0x71, 0x2b, 0xef, 0x2b, 0xea, 0x19, 0x54, 0x2e, 0xbf, 0x03, 0xf5, - 0xf7, 0x7c, 0x03, 0xcc, 0xad, 0xaf, 0x52, 0x8e, 0x1e, 0xe3, 0x25, 0xdc, - 0x59, 0xfb, 0xd4, 0xc7, 0x8c, 0xd4, 0x0d, 0x79, 0xa1, 0xc1, 0x96, 0xd3, - 0xa1, 0x47, 0xd1, 0x1a, 0x79, 0xa9, 0x93, 0xe2, 0x46, 0x78, 0x12, 0x28, - 0x40, 0x1c, 0x77, 0xfc, 0xe3, 0x2f, 0xca, 0xe4, 0x81, 0xd1, 0xce, 0xd2, - 0x91, 0x89, 0x22, 0xa6, 0x5c, 0xd7, 0x9e, 0xdf, 0x1c, 0xce, 0x74, 0xe8, - 0x31, 0x9b, 0xa0, 0x76, 0xa4, 0x52, 0x65, 0xf7, 0x65, 0xb0, 0x69, 0xaa, - 0xb3, 0xaf, 0xf4, 0x57, 0xfb, 0x3d, 0x7b, 0x54, 0x52, 0xd9, 0xd0, 0x83, - 0xd6, 0xef, 0xe7, 0x87, 0x52, 0xde, 0xb9, 0x4d, 0xef, 0x51, 0xcf, 0x97, - 0x4b, 0xb7, 0x7a, 0x64, 0x92, 0x34, 0x52, 0x1f, 0xc3, 0x17, 0xce, 0x60, - 0x5d, 0x7a, 0xca, 0x2e, 0x75, 0xe7, 0x42, 0x25, 0xde, 0x96, 0xf3, 0xe1, - 0x4a, 0x42, 0xcb, 0x67, 0x45, 0x4a, 0xa7, 0x7f, 0x85, 0x75, 0xa3, 0x7c, - 0x32, 0x29, 0x77, 0x66, 0x73, 0x9b, 0x7b, 0x78, 0xaa, 0xe0, 0x12, 0x8a, - 0x0c, 0x6e, 0xef, 0x34, 0x89, 0x4a, 0x77, 0x2e, 0xb9, 0x2c, 0x8e, 0xce, - 0x5c, 0x6a, 0xc9, 0xaa, 0x21, 0x29, 0x36, 0x9d, 0xc3, 0xfa, 0xe0, 0xce, - 0x2a, 0x11, 0x58, 0xe5, 0x95, 0x91, 0xc3, 0x24, 0x67, 0x09, 0x1d, 0x5e, - 0x74, 0x5d, 0x6a, 0x50, 0xbc, 0xb8, 0x91, 0xd2, 0xc9, 0xfe, 0x27, 0x15, - 0xa8, 0xd9, 0xf2, 0xe0, 0xba, 0xa9, 0xba, 0x26, 0x13, 0xe2, 0x5b, 0x9f, - 0x12, 0x5e, 0x4d, 0xf2, 0x80, 0xfd, 0x14, 0x1d, 0x39, 0x1a, 0xe0, 0x34, - 0x2c, 0x4a, 0x19, 0x77, 0x18, 0x68, 0xff, 0x37, 0x52, 0xb5, 0x61, 0x95, - 0x50, 0x3a, 0x65, 0xab, 0x5d, 0xea, 0x15, 0xab, 0x45, 0xa7, 0x6b, 0x5c, - 0xdf, 0x53, 0x04, 0xd2, 0xe4, 0x92, 0xab, 0x45, 0xee, 0x80, 0x6a, 0xcf, - 0x69, 0x48, 0x1d, 0x0c, 0x33, 0x20, 0x58, 0x92, 0x0b, 0xaf, 0x9c, 0x50, - 0x4f, 0x86, 0x94, 0x57, 0x97, 0x50, 0x2d, 0xd2, 0xbd, 0xb4, 0x2b, 0xe0, - 0xa0, 0x45, 0x93, 0x79, 0x0c, 0xc1, 0x0b, 0x40, 0xb4, 0xb1, 0x2f, 0x13, - 0xa0, 0x71, 0xd0, 0x98, 0x70, 0x8d, 0x8b, 0x50, 0x83, 0xc8, 0xb0, 0xc2, - 0x9e, 0x48, 0xf6, 0x1c, 0xac, 0xb0, 0xae, 0xf5, 0xf2, 0x91, 0x2b, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x56, 0x80, 0xb8, 0x51, 0x8b, 0xca, 0x2e, 0x50, 0xe5, 0xd0, 0x54, 0xcb, - 0xa9, 0x8c, 0x03, 0xc4, 0xa6, 0xdd, 0xe9, 0xf3, 0xf5, 0x85, 0x8c, 0x41, - 0x2a, 0x7f, 0x53, 0x0f, 0xfc, 0xc7, 0xd6, 0xf0, 0x13, 0xc9, 0xc4, 0x2f, - 0xab, 0xa1, 0x97, 0x23, 0xab, 0x99, 0x3d, 0x73, 0x9c, 0xd8, 0xb9, 0x56, - 0xdf, 0x96, 0xee, 0x18, 0xdc, 0xf8, 0xb2, 0x8b, 0x80, 0x6c, 0x70, 0x3b, - 0xf5, 0x36, 0x1b, 0x3a, 0xde, 0x97, 0xef, 0x19, 0xdd, 0xf9, 0xb3, 0x8a, - 0x81, 0x6d, 0x71, 0x3a, 0xf4, 0x37, 0x1a, 0x3b, 0xc2, 0x1e, 0xbb, 0xf4, - 0xd8, 0x3f, 0xcc, 0x3d, 0x9b, 0x11, 0x0c, 0x26, 0x2f, 0xe5, 0xb2, 0xbe, - 0xc1, 0x1d, 0xb8, 0xf7, 0xdb, 0x3c, 0xcf, 0x3e, 0x98, 0x12, 0x0f, 0x25, - 0x2c, 0xe6, 0xb1, 0xbd, 0xc1, 0x1d, 0xb8, 0xf7, 0xdb, 0x3c, 0xcf, 0x3e, - 0x98, 0x12, 0x0f, 0x25, 0x2c, 0xe6, 0xb1, 0xbd, 0xc1, 0x1d, 0xb8, 0xf7, - 0xdb, 0x3c, 0xcf, 0x3e, 0x98, 0x12, 0x0f, 0x25, 0x2c, 0xe6, 0xb1, 0xbd, - 0x1b, 0xf1, 0x2b, 0xf5, 0x2e, 0x0e, 0xb8, 0x66, 0x7a, 0xbb, 0x99, 0x09, - 0xd6, 0x96, 0xfe, 0xcf, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x28, 0x26, 0x13, 0x43, - 0x54, 0xbf, 0xc0, 0x5f, 0xa5, 0x5e, 0xfd, 0xf2, 0x7c, 0x47, 0xd3, 0x69, - 0x1a, 0xf0, 0x2a, 0xf4, 0x07, 0xe8, 0xb0, 0x65, 0x57, 0x5d, 0x91, 0x0a, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x63, 0x8a, 0x1c, 0x37, 0xfc, 0xda, 0xcc, 0x02, - 0x3e, 0x08, 0xa4, 0xb6, 0x98, 0x3a, 0xc2, 0x75, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0xb7, 0x76, 0x93, 0x0a, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0xd5, 0x20, 0x98, 0x84, 0x30, 0x65, 0x5b, 0xa8, 0x5e, 0xc0, 0x1e, 0xb0, - 0x89, 0x0e, 0x50, 0x08, 0x1e, 0x22, 0xcf, 0x32, 0xe4, 0x65, 0x4a, 0xdd, - 0x1e, 0x48, 0x2e, 0xc3, 0x65, 0xee, 0xf8, 0x9b, 0xd3, 0xd0, 0x81, 0x3c, - 0x0f, 0x60, 0x28, 0x9c, 0xd4, 0x16, 0x2a, 0x0b, 0xb6, 0xca, 0xde, 0xdd, - 0x36, 0x3b, 0xc7, 0xff, 0xb8, 0xc1, 0x87, 0x44, 0x37, 0xda, 0xc9, 0xb5, - 0xb4, 0x00, 0x4b, 0x3a, 0x72, 0x78, 0x11, 0xb2, 0xc2, 0x27, 0x6a, 0x19, - 0x96, 0x01, 0xaf, 0xac, 0x3b, 0x30, 0x9e, 0x74, 0xbf, 0x12, 0x3b, 0x0d, - 0x74, 0x37, 0x39, 0x01, 0x00, 0x9f, 0x07, 0x45, 0x53, 0xff, 0x19, 0x2d, - 0x92, 0x82, 0xe7, 0xd8, 0x7d, 0xe0, 0x25, 0xe8, 0x70, 0xb4, 0xae, 0x5f, - 0x43, 0xb5, 0xcc, 0xdc, 0x13, 0x09, 0xe7, 0x3a, 0xe4, 0xae, 0x7e, 0xa8, - 0x3c, 0x65, 0x40, 0xe0, 0x90, 0x4f, 0x3a, 0x66, 0x1f, 0xc8, 0x62, 0x59, - 0x34, 0x9a, 0xc5, 0xad, 0xde, 0xcb, 0xad, 0x41, 0x53, 0x7e, 0xf6, 0xb3, - 0xb8, 0x41, 0x5f, 0x82, 0xd4, 0x7d, 0x08, 0x43, 0xd5, 0x33, 0x06, 0x50, - 0xd1, 0x31, 0x23, 0x2c, 0xee, 0x65, 0x6a, 0xc4, 0x43, 0xa2, 0x26, 0x7c, - 0x5c, 0x5e, 0xc9, 0x1e, 0xe1, 0xea, 0x96, 0x1d, 0xc6, 0x16, 0xc8, 0x7a, - 0x87, 0x2b, 0xf6, 0x8f, 0xd2, 0xb9, 0x93, 0x70, 0xb4, 0x20, 0x97, 0xcd, - 0x4c, 0xb1, 0x03, 0xe6, 0x4c, 0xda, 0x62, 0x2b, 0x9f, 0x83, 0x2c, 0x03, - 0x57, 0x17, 0x8d, 0xf1, 0xae, 0x4b, 0xd7, 0x02, 0xd5, 0x71, 0x68, 0xbb, - 0xb9, 0x86, 0xed, 0x0a, 0x4b, 0xa1, 0x1f, 0x10, 0x63, 0x15, 0x36, 0xba, - 0x87, 0xbe, 0xcd, 0xbd, 0x72, 0x16, 0xad, 0x8f, 0x13, 0xda, 0x15, 0xa7, - 0x6e, 0xeb, 0xe2, 0x0a, 0xa2, 0x1b, 0xea, 0xe5, 0xdb, 0x26, 0xc8, 0x87, - 0xf8, 0xcd, 0x3d, 0xc6, 0x9b, 0xdb, 0xeb, 0xc0, 0x6a, 0x5f, 0x0b, 0xb1, - 0xc6, 0xcd, 0xd6, 0xe5, 0x5d, 0xd8, 0x83, 0xd2, 0xe9, 0x55, 0x62, 0xea, - 0x83, 0xca, 0x48, 0x20, 0xaf, 0x66, 0xe6, 0x69, 0x05, 0xa4, 0xf2, 0x54, - 0xd7, 0x2f, 0xb0, 0x47, 0xac, 0xf0, 0x44, 0x88, 0xd9, 0xc9, 0x4d, 0x9a, - 0xba, 0xcf, 0xec, 0x97, 0x35, 0xc7, 0x44, 0xd5, 0x88, 0xcf, 0x68, 0xd6, - 0x1f, 0x24, 0xbc, 0xaa, 0x6f, 0x71, 0x0a, 0xcc, 0xc0, 0xfa, 0xba, 0xaf, - 0xb8, 0xf7, 0xa4, 0x53, 0x95, 0xc5, 0x5f, 0x4a, 0xea, 0x51, 0xc5, 0x20, - 0xd6, 0x42, 0x10, 0x5a, 0x0b, 0xca, 0x25, 0xe0, 0x72, 0xa6, 0xb6, 0x4a, - 0x08, 0x3c, 0x1e, 0x14, 0x37, 0x18, 0x30, 0xb0, 0xb1, 0x12, 0x85, 0xd5, - 0xb6, 0x4e, 0x3d, 0x53, 0x94, 0x1f, 0x8d, 0x79, 0x47, 0xc3, 0x8e, 0x47, - 0x54, 0x1f, 0x54, 0xfe, 0x82, 0x64, 0x91, 0xeb, 0x23, 0xbd, 0x00, 0xa4, - 0x44, 0xca, 0x23, 0x7c, 0xc4, 0x60, 0x72, 0x8b, 0xfa, 0x42, 0xcb, 0x5d, - 0x38, 0x42, 0x90, 0xe1, 0x1b, 0x01, 0x20, 0x27, 0x64, 0x40, 0xfd, 0x29, - 0xf6, 0xb3, 0x10, 0xd4, 0xf8, 0x6a, 0x02, 0x74, 0x91, 0x4f, 0x7d, 0x79, - 0xd2, 0x22, 0xc8, 0x95, 0x93, 0xe9, 0x8a, 0x85, 0x02, 0xcd, 0x44, 0x88, - 0x9f, 0x9b, 0xa9, 0x94, 0x50, 0x44, 0x1b, 0xaf, 0x30, 0x31, 0xcb, 0x59, - 0x60, 0x9a, 0xef, 0xc9, 0x95, 0x6f, 0x19, 0x55, 0x70, 0xd4, 0x70, 0x80, - 0xc4, 0xd1, 0x80, 0x93, 0x2f, 0x27, 0x4d, 0x58, 0xd3, 0x2f, 0xfd, 0xfa, - 0xdd, 0x16, 0x9c, 0xfe, 0xde, 0x3a, 0xcd, 0xda, 0x1c, 0x99, 0xb3, 0x14, - 0xa9, 0xe3, 0xdf, 0x08, 0x18, 0x6c, 0x8b, 0x0e, 0xcc, 0x1f, 0x06, 0x98, - 0xb1, 0x3e, 0xdc, 0x20, 0x94, 0x30, 0x91, 0xe0, 0x91, 0x76, 0xb2, 0x43, - 0xeb, 0xd5, 0xe8, 0xed, 0xed, 0x37, 0xfb, 0xa0, 0x2f, 0xef, 0x4d, 0xde, - 0xe6, 0xf3, 0x64, 0xa4, 0xa5, 0x00, 0xe1, 0x85, 0x6d, 0x9b, 0x39, 0x8e, - 0x5d, 0xdf, 0x5a, 0xf8, 0x10, 0xe1, 0x92, 0xac, 0x44, 0x5e, 0xdf, 0x50, - 0x3b, 0xbd, 0x2a, 0xb0, 0x41, 0x36, 0xa0, 0x2d, 0x51, 0xc6, 0x54, 0x8c, - 0x4f, 0xd3, 0x74, 0xc6, 0x01, 0x93, 0xde, 0xc7, 0xd0, 0xed, 0xf5, 0xe4, - 0x1a, 0x41, 0x64, 0x46, 0xcb, 0xe3, 0x14, 0xa8, 0x8a, 0xed, 0xac, 0x13, - 0x9c, 0xbd, 0x2f, 0x68, 0xdb, 0x3d, 0xa3, 0x7b, 0x4d, 0x20, 0x3b, 0x5f, - 0x5e, 0x8c, 0xe5, 0xad, 0xf2, 0x67, 0x0d, 0x29, 0xe6, 0x6d, 0xd2, 0x4a, - 0x25, 0x80, 0x93, 0x74, 0xb0, 0xe5, 0xbf, 0xee, 0x4f, 0xf4, 0xd9, 0x15, - 0x46, 0x91, 0x94, 0x69, 0xa7, 0x82, 0x00, 0xde, 0x78, 0xd5, 0xc6, 0xda, - 0xf7, 0xeb, 0x02, 0x56, 0x33, 0xc5, 0x0b, 0x88, 0x54, 0x2f, 0xe1, 0xd4, - 0x87, 0xf0, 0x0c, 0xac, 0x4d, 0xf4, 0x18, 0x95, 0xa0, 0xc0, 0x45, 0x37, - 0x91, 0x79, 0xc8, 0x48, 0x6f, 0x81, 0xa8, 0x2d, 0x7e, 0xb2, 0xee, 0x1e, - 0x3f, 0x46, 0xde, 0x68, 0x59, 0x73, 0x67, 0xf4, 0x66, 0x72, 0x11, 0x3e, - 0xbd, 0xa6, 0xea, 0x65, 0xc4, 0xd0, 0x07, 0x96, 0x4d, 0x1f, 0xb6, 0xaf, - 0x6f, 0x1c, 0xb1, 0x52, 0x00, 0x0b, 0x27, 0xe4, 0x27, 0x07, 0x23, 0x46, - 0x45, 0x91, 0x7e, 0x83, 0x11, 0x39, 0x5d, 0x3c, 0x35, 0x03, 0xb8, 0x33, - 0x64, 0x87, 0x71, 0x1b, 0xfb, 0x16, 0x3a, 0x27, 0x0f, 0x4e, 0xc5, 0x14, - 0x69, 0x0a, 0x78, 0x25, 0xc4, 0x1c, 0xe2, 0x39, 0xa6, 0x1f, 0xcb, 0xc8, - 0x2f, 0xda, 0xef, 0xcc, 0x95, 0xf7, 0x3a, 0xeb, 0x95, 0xf1, 0xdf, 0x20, - 0xbf, 0x16, 0xc7, 0x9e, 0xa7, 0x37, 0x1f, 0x53, 0x17, 0x44, 0xa2, 0x4e, - 0xeb, 0x58, 0x34, 0xbe, 0x8b, 0xf7, 0x25, 0xbe, 0x4d, 0x7f, 0x42, 0xdd, - 0xa9, 0xbf, 0xfc, 0x66, 0x63, 0x0b, 0x9b, 0x3f, 0xe3, 0xf5, 0x89, 0xaa, - 0x8a, 0x09, 0x79, 0xba, 0xc2, 0x94, 0x2e, 0x1f, 0x10, 0xeb, 0xa5, 0x90, - 0xf3, 0x93, 0xba, 0x34, 0xa2, 0xe4, 0xe5, 0x09, 0xe8, 0x2d, 0x37, 0xfc, - 0x8b, 0x52, 0xdf, 0x2e, 0x79, 0xb7, 0xbf, 0x7c, 0x0a, 0x26, 0xed, 0xe9, - 0x4b, 0x18, 0x12, 0x6c, 0x3e, 0xfb, 0xc7, 0xa7, 0x48, 0x67, 0x00, 0x22, - 0xe7, 0xa0, 0x67, 0x71, 0x53, 0xbd, 0xa7, 0x90, 0xfc, 0x4e, 0x1a, 0x2f, - 0x7d, 0xa9, 0x33, 0xf3, 0x8f, 0x8f, 0x93, 0x5d, 0xc9, 0x58, 0xe9, 0x8c, - 0xa2, 0xab, 0x4e, 0xa9, 0x74, 0x70, 0xeb, 0x5a, 0x8f, 0x32, 0xde, 0x57, - 0x57, 0x47, 0xc6, 0xe0, 0x57, 0x48, 0x86, 0xaa, 0xba, 0xea, 0xd2, 0x92, - 0x09, 0xfe, 0xbe, 0x5c, 0x42, 0x83, 0xfc, 0xcd, 0xc8, 0x8c, 0x0c, 0x97, - 0x77, 0x91, 0xbe, 0x99, 0x5d, 0x7b, 0xcb, 0xeb, 0x14, 0x44, 0x23, 0x4d, - 0x3d, 0x88, 0xe8, 0x5e, 0x11, 0xe0, 0x0c, 0x2c, 0x2c, 0xe2, 0xdb, 0x88, - 0x15, 0x91, 0xa6, 0x95, 0xc7, 0x16, 0xa0, 0x54, 0x71, 0x89, 0xb3, 0x5b, - 0x4c, 0x16, 0x7e, 0x30, 0x7d, 0x5c, 0x08, 0xc3, 0x41, 0x14, 0xd1, 0xe0, - 0x3d, 0xec, 0x6a, 0xc5, 0x0b, 0x59, 0xd2, 0x7d, 0x08, 0xc0, 0x7a, 0xb2, - 0x88, 0x51, 0x22, 0x2a, 0xdb, 0xdf, 0xc3, 0x07, 0x03, 0x83, 0xe7, 0xcb, - 0x73, 0x7f, 0x0a, 0xac, 0x93, 0xfe, 0x95, 0xa8, 0xfe, 0xe4, 0xa4, 0xce, - 0x08, 0x03, 0x78, 0xfa, 0x6c, 0x90, 0xbf, 0xbe, 0x44, 0xbf, 0xcd, 0x81, - 0x0b, 0xcf, 0x04, 0xfe, 0xc6, 0x36, 0x5a, 0x63, 0xe0, 0x20, 0xe4, 0x68, - 0x43, 0x48, 0x61, 0x62, 0x0e, 0xcc, 0xf9, 0x06, 0x9c, 0x1e, 0xd6, 0xf5, - 0xbe, 0x2c, 0x2f, 0x7e, 0x10, 0x03, 0x48, 0xc5, 0x40, 0x7d, 0xbb, 0x56, - 0x9d, 0xd0, 0xf3, 0xc4, 0xb7, 0x7a, 0xf2, 0xbd, 0x0a, 0xa6, 0x33, 0xa1, - 0xc7, 0x12, 0x0b, 0x8d, 0x29, 0xc7, 0x4e, 0x20, 0xfd, 0xab, 0x09, 0xcc, - 0xee, 0x22, 0x44, 0x3d, 0x06, 0xe2, 0x91, 0x48, 0x63, 0xb6, 0xfe, 0x49, - 0xd5, 0x28, 0xa7, 0x49, 0xf6, 0xdd, 0xc1, 0x34, 0xca, 0xde, 0x5a, 0xb0, - 0x36, 0x13, 0x11, 0xae, 0x65, 0x1e, 0x0e, 0xd8, 0x46, 0xcf, 0xd7, 0xe2, - 0x07, 0x73, 0xa5, 0x39, 0xcc, 0x83, 0xbc, 0x14, 0x92, 0xee, 0x8d, 0xe4, - 0xac, 0x41, 0x89, 0x44, 0x60, 0x7e, 0x15, 0x8f, 0xff, 0x57, 0x24, 0xb7, - 0x7e, 0x2c, 0x6a, 0x27, 0x3b, 0x69, 0x8b, 0x56, 0x2e, 0x5f, 0xd9, 0x3c, - 0xd5, 0xc5, 0xa6, 0xfd, 0xaa, 0x74, 0x25, 0x85, 0x45, 0xdf, 0xcb, 0x11, - 0xbd, 0x25, 0xb1, 0xda, 0x4b, 0x74, 0x32, 0x40, 0x9b, 0xba, 0x5d, 0x84, - 0xfb, 0x98, 0x3a, 0x18, 0x21, 0x69, 0x77, 0xf1, 0xfb, 0x88, 0x6d, 0xb0, - 0x58, 0x79, 0xae, 0x39, 0x45, 0xc3, 0x51, 0x5c, 0x81, 0x50, 0x8b, 0xee, - 0x9f, 0xbe, 0x1a, 0x55, 0xaa, 0xb1, 0xff, 0x69, 0x28, 0x41, 0x1d, 0xda, - 0x2e, 0xba, 0xc2, 0xfe, 0x0e, 0xca, 0x99, 0xf0, 0xe2, 0x0a, 0x64, 0x6d, - 0x49, 0x34, 0x87, 0xdd, 0x38, 0xc8, 0x0f, 0x3d, 0x57, 0xf1, 0x41, 0xdd, - 0x1a, 0x27, 0x37, 0x8e, 0x76, 0xbc, 0x0b, 0xa1, 0x55, 0x4c, 0xcf, 0xbb, - 0xa3, 0x0b, 0x3e, 0x71, 0x08, 0xd4, 0xf8, 0x94, 0xd6, 0x20, 0x09, 0x80, - 0x7b, 0xd7, 0x05, 0xa9, 0x76, 0x3a, 0xef, 0xe1, 0xf2, 0x7a, 0xa8, 0x6f, - 0x5d, 0x0e, 0x55, 0x3b, 0x07, 0xd9, 0x0f, 0x2b, 0x4d, 0x7a, 0x7f, 0x04, - 0x71, 0x10, 0xcb, 0x68, 0x03, 0x8b, 0xfc, 0x78, 0x05, 0x51, 0xcf, 0x2d, - 0xbb, 0x3f, 0x52, 0xbc, 0x7f, 0xf1, 0x10, 0x2d, 0x13, 0xdf, 0xdc, 0x20, - 0xbe, 0x7d, 0x65, 0xf8, 0x16, 0xaf, 0x0d, 0xe7, 0xd9, 0xe1, 0xce, 0x31, - 0xc6, 0xf9, 0xbe, 0x08, 0x76, 0x07, 0x7d, 0x63, 0x4a, 0x9c, 0x49, 0x0a, - 0x0c, 0x27, 0xe0, 0x53, 0xf9, 0x30, 0x5f, 0xe5, 0xf5, 0x64, 0xdd, 0x5a, - 0x03, 0x45, 0x4a, 0xc9, 0x20, 0xc1, 0x9c, 0x43, 0x6f, 0xf0, 0x26, 0x80, - 0xc1, 0x4b, 0x04, 0x42, 0x37, 0x29, 0x2d, 0x94, 0xef, 0x3d, 0x1b, 0x49, - 0x6e, 0x17, 0x31, 0x44, 0xcb, 0x31, 0x32, 0x16, 0x8a, 0x94, 0x57, 0x10, - 0x31, 0x38, 0xa9, 0x38, 0x4f, 0xe7, 0xe3, 0xbd, 0x92, 0xa5, 0x31, 0x42, - 0x85, 0x8b, 0x26, 0x58, 0xb6, 0xa4, 0x82, 0x11, 0x98, 0xdc, 0xcf, 0xa0, - 0x05, 0xf3, 0xf6, 0x42, 0x7c, 0x03, 0x5d, 0x2b, 0x0f, 0x0f, 0xa2, 0xf0, - 0xfc, 0xba, 0x9f, 0xf2, 0x64, 0x96, 0xc1, 0x45, 0x20, 0x89, 0x96, 0xb9, - 0x18, 0x3d, 0x28, 0x1e, 0xc1, 0x12, 0x51, 0x3b, 0x40, 0x84, 0xe1, 0x0d, - 0xb8, 0x60, 0xa5, 0xec, 0x4b, 0xd5, 0x90, 0x3a, 0x80, 0xd0, 0x85, 0x99, - 0xda, 0x46, 0x2c, 0x06, 0x4f, 0xe1, 0x5c, 0x66, 0xb0, 0x46, 0xbc, 0xf1, - 0xd1, 0x4a, 0xc1, 0xdc, 0xe8, 0x4b, 0x59, 0x6f, 0xcc, 0x68, 0x8b, 0x9e, - 0xba, 0xef, 0xf5, 0x42, 0xe2, 0x22, 0xc0, 0xfe, 0xbf, 0xfb, 0x52, 0x42, - 0x36, 0x77, 0x89, 0x5d, 0xfb, 0x75, 0xcb, 0xd2, 0xe4, 0x8d, 0x52, 0xf9, - 0x7c, 0x47, 0xfb, 0x50, 0x39, 0xd2, 0x0b, 0xbc, 0x39, 0x18, 0x55, 0xbf, - 0x9c, 0x14, 0xa6, 0x1b, 0x23, 0x9e, 0x74, 0xaa, 0xdd, 0x4d, 0x9f, 0x57, - 0xe4, 0x8f, 0xb5, 0x6c, 0x6d, 0xdb, 0x9f, 0x89, 0x23, 0xa0, 0x7c, 0x2e, - 0xff, 0xd4, 0xf5, 0x78, 0xdb, 0x52, 0x25, 0xe3, 0xf9, 0x6d, 0x3e, 0xeb, - 0xc2, 0xc8, 0xe1, 0x60, 0x60, 0x50, 0xf9, 0x03, 0xb5, 0xee, 0x0a, 0x6c, - 0xce, 0x6f, 0x59, 0x08, 0x68, 0x49, 0x4a, 0x07, 0x17, 0x17, 0x50, 0xb9, - 0xc5, 0x8a, 0x35, 0x2d, 0xe6, 0x85, 0xf2, 0xf0, 0xac, 0x7c, 0x87, 0x42, - 0xdd, 0x1d, 0x68, 0xb7, 0xbc, 0x2e, 0x48, 0x5f, 0x99, 0x51, 0x9e, 0xac, - 0xfb, 0x6d, 0x43, 0x06, 0x0d, 0xfb, 0x10, 0xed, 0xce, 0xac, 0x79, 0x4d, - 0xe2, 0xf2, 0x24, 0xde, 0x66, 0x61, 0xe2, 0xe7, 0x35, 0xc7, 0xac, 0x05, - 0xd5, 0x41, 0x1f, 0x84, 0x11, 0xc4, 0xd9, 0x07, 0xf9, 0x19, 0x71, 0x89, - 0x08, 0x94, 0x4f, 0x27, 0xcb, 0xa4, 0x73, 0xe1, 0x7a, 0x40, 0xbb, 0xa1, - 0x7b, 0xab, 0x14, 0x63, 0x62, 0x3c, 0x0d, 0x65, 0xf8, 0x5b, 0xf2, 0x73, - 0x07, 0x38, 0x4d, 0xd6, 0xf4, 0x0d, 0x7b, 0x37, 0x02, 0x25, 0x24, 0xbf, - 0x27, 0xef, 0x4d, 0x25, 0x91, 0x84, 0x8a, 0x36, 0xba, 0xf2, 0x9e, 0x74, - 0xae, 0xc3, 0xad, 0x92, 0xdb, 0x2c, 0x19, 0xc8, 0x8e, 0xb7, 0xaa, 0x44, - 0x8f, 0x29, 0xc0, 0x79, 0xce, 0x88, 0xa1, 0xc7, 0x50, 0xc3, 0x57, 0x09, - 0xb1, 0x97, 0x86, 0xec, 0x50, 0xff, 0x70, 0xa4, 0xe9, 0x1d, 0x92, 0x4e, - 0xfc, 0x42, 0xdd, 0x11, 0xa4, 0xd0, 0x36, 0x66, 0x6d, 0xb2, 0x70, 0x7a, - 0x46, 0xd5, 0x3c, 0xe8, 0x8e, 0xa7, 0x2d, 0x78, 0x8d, 0xbb, 0xf5, 0x83, - 0x0a, 0xe0, 0x07, 0xc5, 0x9f, 0xb8, 0x43, 0x9e, 0xa1, 0x75, 0xa5, 0x17, - 0xfe, 0x3c, 0x28, 0x03, 0x96, 0x45, 0xbc, 0xab, 0x26, 0x72, 0x1f, 0xff, - 0xad, 0x4f, 0x97, 0xe4, 0x20, 0x4d, 0xa8, 0x7c, 0xce, 0x84, 0xbe, 0xcd, - 0xed, 0xae, 0x21, 0xa0, 0x01, 0xc8, 0x15, 0x7e, 0xac, 0xee, 0x29, 0xbc, - 0x1f, 0x15, 0x51, 0xde, 0x51, 0x5f, 0x49, 0x74, 0x67, 0x2c, 0xdf, 0x89, - 0xb2, 0xad, 0x8f, 0x0c, 0xad, 0x89, 0x0a, 0xe9, 0x97, 0xad, 0x24, 0x04, - 0x43, 0x7d, 0xa6, 0xf8, 0x93, 0x5c, 0x18, 0xec, 0x80, 0xa3, 0x99, 0x91, - 0x20, 0xf0, 0xb5, 0xad, 0xb1, 0xb1, 0xd0, 0xc5, 0x7c, 0x8f, 0x83, 0xc5, - 0x5b, 0x5a, 0x5d, 0x01, 0x0e, 0xe1, 0xe6, 0xb7, 0x64, 0xdf, 0x02, 0x9d, - 0xf2, 0xc2, 0x9d, 0x7c, 0xf0, 0xf9, 0x54, 0xe6, 0x05, 0x11, 0x00, 0xb3, - 0xa4, 0xc6, 0x2c, 0x18, 0x68, 0xee, 0xd9, 0x7f, 0x1a, 0xfe, 0xa2, 0x2d, - 0x81, 0x18, 0x87, 0x11, 0xa8, 0x5c, 0x16, 0x90, 0xff, 0x35, 0xba, 0xf3, - 0x54, 0x74, 0xa0, 0x72, 0x0f, 0x9d, 0x6f, 0xaf, 0xd0, 0x08, 0x5f, 0x14, - 0x47, 0xfd, 0x89, 0xa0, 0x5e, 0x71, 0x6e, 0x5e, 0x70, 0x95, 0xb5, 0xc2, - 0xb1, 0x38, 0xce, 0x5c, 0xde, 0x6e, 0xa8, 0x3c, 0xdc, 0xaf, 0x60, 0xdb, - 0xc2, 0xd5, 0xd3, 0xac, 0x4f, 0x6f, 0xaa, 0xfc, 0xa9, 0x4a, 0x58, 0x69, - 0x4f, 0x8a, 0xe4, 0x3e, 0x22, 0x10, 0xfb, 0x4e, 0x6e, 0x14, 0x16, 0x20, - 0x64, 0x7a, 0x21, 0x5b, 0xb8, 0xa2, 0x2c, 0xe4, 0xfb, 0x44, 0x12, 0xea, - 0x59, 0x5d, 0xe1, 0xe2, 0x59, 0x21, 0x34, 0x54, 0x85, 0x55, 0x12, 0xbe, - 0x2f, 0x13, 0xdc, 0x5c, 0xb9, 0xc7, 0xc1, 0x1f, 0x3e, 0xfe, 0x93, 0xef, - 0x53, 0xd4, 0x28, 0x01, 0x30, 0xe3, 0x71, 0xc6, 0x87, 0xd9, 0xe3, 0xc4, - 0x3c, 0xb1, 0xf7, 0x7b, 0x4e, 0x3a, 0x37, 0xd2, 0x13, 0x10, 0x71, 0xa9, - 0xb7, 0x48, 0xfc, 0x71, 0xc8, 0xb9, 0xfb, 0xf1, 0x48, 0xae, 0x82, 0x08, - 0xce, 0x6c, 0xbd, 0xd4, 0x4f, 0x07, 0x9f, 0xc8, 0x66, 0xd4, 0xc8, 0xda, - 0xb3, 0x13, 0x91, 0x99, 0x2d, 0x6f, 0xe2, 0xca, 0xe2, 0x7a, 0x8d, 0xbc, - 0x28, 0xe2, 0xdd, 0xc8, 0x03, 0x98, 0xe9, 0x23, 0xf9, 0x13, 0x45, 0xdd, - 0x82, 0x36, 0x28, 0xe7, 0x89, 0x81, 0x07, 0xc1, 0x85, 0x66, 0xeb, 0xfb, - 0x0b, 0xd3, 0x6f, 0x61, 0xfe, 0x31, 0x44, 0x75, 0x3f, 0xfe, 0xe4, 0xad, - 0x57, 0xe6, 0x39, 0xaa, 0x2e, 0xb8, 0xf2, 0x7c, 0xb5, 0x43, 0xe2, 0x20, - 0xf3, 0x10, 0x5e, 0x26, 0xf6, 0x3c, 0xc2, 0x55, 0xfe, 0xec, 0x08, 0x3c, - 0x7a, 0xe3, 0x3b, 0xc2, 0xf1, 0x7d, 0xe6, 0xb8, 0xd4, 0x59, 0x25, 0x2c, - 0x24, 0xd4, 0x64, 0x24, 0x0d, 0xf2, 0x75, 0xef, 0x2c, 0xa8, 0x2d, 0x46, - 0xd0, 0x1b, 0xfc, 0x9f, 0x03, 0x07, 0xbb, 0xc1, 0x06, 0x44, 0xb8, 0x05, - 0x2c, 0xd5, 0xa6, 0xd7, 0xf6, 0x47, 0xcb, 0xbd, 0x0c, 0x8e, 0x15, 0x70, - 0xc2, 0xc9, 0xfd, 0x80, 0x63, 0x37, 0x13, 0xc6, 0x91, 0x89, 0xa0, 0x5f, - 0x91, 0x9e, 0x37, 0x65, 0xb9, 0x98, 0x15, 0x23, 0xb0, 0x4f, 0x6c, 0x54, - 0xc9, 0xe1, 0xc7, 0x6c, 0xa8, 0x66, 0x59, 0xc3, 0x35, 0x6c, 0x1f, 0xb5, - 0xdd, 0xe6, 0xe0, 0x93, 0xcf, 0xf3, 0xfe, 0x34, 0x4f, 0xc9, 0x0d, 0x0d, - 0xad, 0xda, 0x3e, 0x1e, 0x12, 0xae, 0x09, 0xfe, 0xa3, 0xf5, 0x3b, 0x80, - 0x72, 0x73, 0x19, 0x14, 0xc3, 0x2c, 0x39, 0x51, 0xe3, 0xf7, 0x0a, 0x9f, - 0x99, 0xef, 0x14, 0x3f, 0xd2, 0x32, 0x64, 0x77, 0x46, 0xc3, 0xc1, 0xc8, - 0x62, 0xe6, 0xe5, 0x73, 0x1f, 0xfd, 0x6f, 0x9b, 0x86, 0xa5, 0x7c, 0xd6, - 0x22, 0xb2, 0x99, 0x2a, 0xd9, 0xc6, 0x19, 0x5d, 0xda, 0x73, 0xbf, 0xf8, - 0x5e, 0xe3, 0xa6, 0x36, 0x8f, 0x51, 0x8f, 0x33, 0x7a, 0x44, 0xa3, 0xaf, - 0xad, 0x3a, 0xe3, 0x5e, 0x3a, 0xe3, 0xd9, 0x52, 0xf2, 0x01, 0xd0, 0x7f, - 0xc1, 0xe8, 0xc4, 0xb2, 0x8f, 0x53, 0x2c, 0xa0, 0x05, 0xa1, 0x06, 0x0c, - 0xc9, 0x00, 0x00, 0x5b, 0x66, 0x04, 0xe6, 0x90, 0x61, 0xd5, 0x82, 0x93, - 0xe0, 0xad, 0xda, 0x24, 0x5a, 0x34, 0xfb, 0x49, 0xee, 0x56, 0x00, 0x30, - 0x3a, 0xc2, 0xc7, 0x25, 0x64, 0xa8, 0xd4, 0x60, 0x6f, 0xd1, 0x9c, 0x2c, - 0xd9, 0xb1, 0x5c, 0x5f, 0xa2, 0x82, 0x7d, 0x45, 0xdd, 0x7d, 0x43, 0x8f, - 0x11, 0x0e, 0xd1, 0xac, 0x27, 0x58, 0x7b, 0x73, 0xe7, 0x9c, 0xa2, 0xd2, - 0x3a, 0x5d, 0xaf, 0x88, 0x7e, 0x9d, 0xda, 0xb0, 0xe9, 0x9b, 0xd1, 0xf6, - 0xcf, 0xce, 0x37, 0xd0, 0xfc, 0x1e, 0x84, 0x3a, 0x9b, 0x3e, 0x1e, 0xfe, - 0x31, 0xc1, 0xf8, 0x33, 0x09, 0x42, 0xd1, 0xb0, 0xf6, 0x79, 0x37, 0x54, - 0x6e, 0x3b, 0x81, 0x83, 0x64, 0x70, 0xb0, 0xcd, 0x34, 0x9c, 0x8b, 0xdc, - 0x7e, 0x2a, 0x4c, 0x7f, 0x65, 0x3c, 0x0b, 0x22, 0x29, 0x5b, 0x33, 0x1c, - 0x8f, 0x8a, 0x6e, 0xb2, 0x87, 0x64, 0xac, 0xb8, 0xec, 0x95, 0x8b, 0xcf, - 0xc5, 0xc1, 0x68, 0xf3, 0x1a, 0x19, 0xf1, 0x80, 0x29, 0x60, 0x85, 0x70, - 0x9a, 0x65, 0xe8, 0x03, 0xf5, 0x51, 0x6a, 0xa5, 0x43, 0x5d, 0xc8, 0xdd, - 0xf3, 0xef, 0xc7, 0xcd, 0x10, 0xba, 0xac, 0xc4, 0x2e, 0x1b, 0xd6, 0x06, - 0x1d, 0x55, 0x13, 0x7a, 0xdd, 0xe2, 0xdc, 0xd1, 0x32, 0xde, 0xb4, 0xe5, - 0xc3, 0xb5, 0x4d, 0xf7, 0x36, 0xc2, 0x76, 0x8b, 0x33, 0x68, 0x51, 0x5b, - 0x7a, 0x67, 0x81, 0xb4, 0xcc, 0xfa, 0x23, 0x91, 0x3f, 0x33, 0xf6, 0x01, - 0x1f, 0x19, 0xf7, 0xb9, 0xc2, 0x2e, 0x77, 0x06, 0xda, 0xbe, 0xc5, 0xdd, - 0x06, 0x26, 0xbd, 0xbc, 0xeb, 0xdb, 0x4b, 0x71, 0x7c, 0xbe, 0xed, 0x06, - 0x32, 0x9a, 0x29, 0x85, 0x86, 0x37, 0x14, 0x6e, 0x15, 0x0e, 0xbf, 0xa5, - 0x87, 0x1e, 0xc3, 0x55, 0x8a, 0x88, 0xc5, 0x96, 0x25, 0x4e, 0xd3, 0x3a, - 0xe0, 0xfd, 0xb3, 0x53, 0x43, 0x8e, 0x65, 0xbd, 0x0d, 0xbd, 0x8e, 0x59, - 0xf6, 0x24, 0x3d, 0x8e, 0x1d, 0x7c, 0xde, 0x44, 0xca, 0xec, 0x94, 0x19, - 0x81, 0xa8, 0xfb, 0xfe, 0xe3, 0x8a, 0x96, 0x93, 0x1d, 0x15, 0x3f, 0x01, - 0xa5, 0xfd, 0x21, 0x7e, 0x09, 0x3b, 0x0e, 0x29, 0xe9, 0x2b, 0xfc, 0x65, - 0x36, 0x67, 0xf5, 0x08, 0x1e, 0x20, 0xbc, 0xcd, 0x3c, 0xeb, 0xa7, 0x79, - 0xb5, 0x57, 0xf1, 0xac, 0x1d, 0x6c, 0x1a, 0xac, 0x1c, 0x0f, 0x7d, 0x8c, - 0x21, 0x87, 0xd4, 0x07, 0x2a, 0x11, 0xf8, 0x52, 0x1e, 0x90, 0x69, 0x0e, - 0x52, 0x4d, 0x15, 0x1b, 0x8d, 0x42, 0x3c, 0x7a, 0x12, 0x50, 0xc4, 0xf2, - 0xb6, 0x6e, 0xf2, 0x1a, 0x4a, 0x6a, 0xf0, 0xdc, 0xdc, 0x77, 0x6b, 0x1e, - 0x1d, 0x00, 0x98, 0x52, 0x61, 0xba, 0xcc, 0xa5, 0x6e, 0x9a, 0x12, 0x5d, - 0xaf, 0x4c, 0x1d, 0xfb, 0x75, 0x59, 0x94, 0x10, 0xa0, 0x11, 0xdd, 0x20, - 0x64, 0x2e, 0x01, 0x7c, 0x12, 0x33, 0x39, 0x3d, 0xce, 0xa3, 0x1d, 0x4e, - 0x22, 0x23, 0x6e, 0xd5, 0xde, 0x56, 0x11, 0x3e, 0x6d, 0xec, 0x58, 0x79, - 0xf7, 0x81, 0xfa, 0xc9, 0xa0, 0x0a, 0x15, 0x09, 0x3c, 0xdf, 0xd6, 0xa9, - 0x7e, 0x3d, 0xb2, 0x9c, 0x9c, 0x80, 0x32, 0x24, 0x87, 0x5d, 0x49, 0xb9, - 0x52, 0xf5, 0x27, 0x33, 0x06, 0x80, 0xe0, 0x02, 0xde, 0x69, 0x80, 0x98, - 0x80, 0x81, 0xa6, 0xe6, 0x54, 0x58, 0x6e, 0x24, 0x07, 0x02, 0x8e, 0xf9, - 0xc0, 0xdf, 0x04, 0x7f, 0x78, 0x58, 0xc4, 0xdf, 0x75, 0x75, 0x3d, 0x96, - 0xc6, 0x8b, 0xd1, 0xe8, 0xc2, 0x9b, 0xfb, 0x30, 0x72, 0xb1, 0x34, 0x54, - 0xd1, 0xc4, 0x8e, 0x95, 0x2f, 0xe2, 0xa2, 0xf6, 0x30, 0x98, 0x10, 0xe9, - 0xb5, 0xb9, 0xbe, 0x56, 0xc4, 0x1e, 0x00, 0x99, 0x2c, 0x91, 0x21, 0xeb, - 0x66, 0x6b, 0xc5, 0x88, 0x00, 0x15, 0x6f, 0x2f, 0x67, 0x30, 0x50, 0x65, - 0x00, 0x31, 0x30, 0xb6, 0xee, 0x6e, 0x06, 0x68, 0x72, 0x94, 0x32, 0x00, - 0x3c, 0xa5, 0xfd, 0xe7, 0x53, 0xf7, 0x42, 0x92, 0xad, 0xe0, 0x97, 0xb9, - 0xae, 0x02, 0x48, 0x0d, 0x18, 0xe3, 0x0b, 0x43, 0x37, 0x35, 0xb3, 0x7f, - 0x7d, 0xac, 0x23, 0xe3, 0xab, 0x5e, 0xd1, 0xc3, 0x4a, 0xcb, 0x37, 0x71, - 0x02, 0xa2, 0x46, 0xcc, 0x5a, 0x8c, 0xf5, 0x43, 0xda, 0x53, 0xe0, 0xd4, - 0x6b, 0x33, 0xa0, 0x03, 0x8f, 0x3e, 0x67, 0x24, 0x62, 0x1b, 0x33, 0x72, - 0x54, 0xef, 0x30, 0x10, 0x5c, 0xe3, 0xc2, 0x07, 0x89, 0xb2, 0x12, 0xcc, - 0xc1, 0x44, 0x5a, 0x04, 0xe8, 0x31, 0xb7, 0x99, 0x76, 0xc1, 0xd1, 0x55, - 0x00, 0x94, 0xc9, 0xcf, 0x6e, 0xdb, 0x80, 0x2c, 0x90, 0x18, 0xcb, 0x17, - 0x2e, 0xd1, 0x40, 0x97, 0x16, 0x7a, 0x06, 0x01, 0x90, 0x95, 0x6f, 0x80, - 0x0e, 0x6a, 0x2f, 0x0c, 0xe7, 0x26, 0x24, 0x64, 0xe8, 0xb5, 0x31, 0xe3, - 0x71, 0xd3, 0x4a, 0xcf, 0xc7, 0x71, 0xad, 0x59, 0x32, 0xbc, 0x6f, 0xe3, - 0x94, 0x00, 0x71, 0xd9, 0x68, 0xd6, 0x48, 0x55, 0xae, 0x0e, 0x16, 0x2f, - 0x2e, 0x22, 0xae, 0x1e, 0x26, 0xc3, 0x78, 0xc5, 0xae, 0xfe, 0x74, 0x09, - 0x2f, 0xc9, 0x93, 0x86, 0x9f, 0x63, 0x9d, 0x2c, 0xcd, 0x33, 0x78, 0xdc, - 0xfa, 0x46, 0xef, 0x1a, 0x77, 0x2b, 0xd8, 0x19, 0xbe, 0x31, 0xc4, 0x20, - 0xe3, 0x5a, 0x12, 0x97, 0x57, 0x12, 0x7f, 0x4d, 0x0b, 0x69, 0x8a, 0xf6, - 0x13, 0x5b, 0xcb, 0x66, 0x3d, 0xa0, 0x80, 0x61, 0xa5, 0x0f, 0x9a, 0x74, - 0xa7, 0xab, 0x83, 0x17, 0x92, 0x00, 0x83, 0x90, 0x8c, 0x67, 0x90, 0x03, - 0x63, 0xe5, 0x0e, 0xf0, 0xfe, 0x17, 0x73, 0x87, 0xf5, 0x71, 0x8e, 0xde, - 0x1e, 0x59, 0xb6, 0x29, 0x5f, 0x07, 0x80, 0x8e, 0x4c, 0x81, 0xf2, 0xaa, - 0x76, 0xde, 0xbb, 0xe2, 0x47, 0xfa, 0xc2, 0x55, 0x8b, 0x72, 0x5f, 0xbf, - 0x32, 0x2b, 0xd9, 0x39, 0x3b, 0xff, 0x51, 0x73, 0x2d, 0x10, 0x68, 0xdc, - 0xf5, 0xf5, 0x7b, 0x07, 0x0a, 0x49, 0x36, 0xd3, 0xac, 0x45, 0xb8, 0x99, - 0x21, 0x7f, 0x5e, 0x09, 0x57, 0xc8, 0x20, 0xe9, 0xe0, 0xa9, 0x6e, 0x35, - 0x11, 0x76, 0x00, 0x7a, 0xaa, 0x11, 0x46, 0xfb, 0x18, 0x96, 0x36, 0xe9, - 0x96, 0x02, 0x66, 0x76, 0x66, 0xaa, 0x5d, 0x0a, 0x19, 0x22, 0x1f, 0xa7, - 0xc9, 0x5f, 0x60, 0xb9, 0x6e, 0xb3, 0x47, 0x6f, 0xb5, 0xf8, 0x3e, 0x3d, - 0x48, 0xc1, 0x86, 0x45, 0xf8, 0x48, 0x65, 0x33, 0xbe, 0xf2, 0x11, 0x48, - 0x33, 0x21, 0x45, 0x31, 0x59, 0x5a, 0x3a, 0xe0, 0x3e, 0x78, 0x7d, 0x0f, - 0x18, 0x98, 0x82, 0x22, 0xa2, 0x1b, 0xe7, 0xc7, 0x42, 0xe2, 0x50, 0x20, - 0xd8, 0xc0, 0xd7, 0xc8, 0x2c, 0x5d, 0x64, 0xa3, 0xc3, 0xd7, 0xf4, 0x69, - 0xc4, 0x67, 0xc8, 0xa6, 0x45, 0x26, 0xfd, 0xbf, 0x01, 0xe3, 0x01, 0x2b, - 0xde, 0xdc, 0xed, 0xa7, 0xb3, 0xb4, 0x20, 0x87, 0xe9, 0x74, 0x12, 0x84, - 0xad, 0x8c, 0x27, 0x4d, 0xbc, 0x89, 0x81, 0x8c, 0x4c, 0x94, 0x79, 0xfd, - 0xf1, 0x9a, 0x17, 0x95, 0x18, 0x5c, 0x33, 0xc9, 0x25, 0x69, 0x86, 0x6e, - 0x4e, 0x3e, 0x5f, 0x42, 0x63, 0x00, 0x85, 0x5c, 0x86, 0x35, 0x21, 0x3b, - 0x89, 0x1e, 0x53, 0xe1, 0x38, 0x57, 0xd6, 0x51, 0x6a, 0xe4, 0x6b, 0xa9, - 0xc8, 0x76, 0x86, 0x7e, 0x7e, 0x3f, 0x67, 0xa5, 0x05, 0x53, 0x51, 0x2e, - 0xd2, 0xe0, 0x44, 0xd5, 0xea, 0x7d, 0x54, 0x88, 0xe7, 0xbc, 0xdf, 0x53, - 0xbf, 0xbd, 0x72, 0x98, 0x66, 0xb4, 0x19, 0xc9, 0x67, 0xf5, 0x8e, 0xf2, - 0x92, 0xb5, 0xe1, 0x93, 0x9c, 0x68, 0xc3, 0xe9, 0x4a, 0xb5, 0x1a, 0xe0, - 0x33, 0x9f, 0x5b, 0x88, 0x43, 0xa4, 0x7a, 0x72, 0xc3, 0xf2, 0x13, 0xf4, - 0x93, 0x5d, 0x26, 0x08, 0x4c, 0xd8, 0x35, 0x54, 0x78, 0x30, 0xea, 0xae, - 0xe2, 0xcb, 0x85, 0xff, 0xdc, 0x21, 0x25, 0xcc, 0x3b, 0x6b, 0xe0, 0x38, - 0x3c, 0x10, 0xd2, 0x64, 0x15, 0x2f, 0xc0, 0xa6, 0xe5, 0xf6, 0x9b, 0x71, - 0x58, 0x00, 0xc6, 0x0b, 0xdc, 0x98, 0x0a, 0x24, 0x3b, 0xc1, 0x7b, 0xaa, - 0xf1, 0xa6, 0x68, 0xa5, 0x2f, 0xa1, 0xee, 0xb2, 0x32, 0x7c, 0xe6, 0x31, - 0x70, 0xa4, 0xbc, 0x0a, 0x3b, 0x24, 0x1e, 0x76, 0x88, 0x53, 0x7d, 0xb1, - 0x3c, 0xef, 0xda, 0xb5, 0x09, 0x43, 0x74, 0x2a, 0xb3, 0xac, 0x1a, 0x16, - 0x02, 0xe9, 0x42, 0x4d, 0x70, 0xd8, 0x23, 0xc7, 0xb0, 0xac, 0x18, 0xba, - 0x84, 0x38, 0x1a, 0x21, 0x30, 0x89, 0x9e, 0x4b, 0x92, 0x9b, 0xb0, 0x5b, - 0x58, 0x9a, 0xe0, 0xec, 0x0d, 0x4d, 0xc6, 0xcc, 0x47, 0x3c, 0xdb, 0xb1, - 0x44, 0x76, 0x75, 0x90, 0x56, 0x98, 0xb1, 0x37, 0x52, 0x5e, 0xe5, 0x76, - 0x1b, 0xa4, 0xdd, 0xc2, 0xa1, 0x54, 0xda, 0xc7, 0xf6, 0xc3, 0xfc, 0xa1, - 0xd2, 0x76, 0x2e, 0xb5, 0x3f, 0x6b, 0xe2, 0x43, 0x08, 0xcc, 0x47, 0xa4, - 0x6a, 0x1b, 0xa4, 0x55, 0xdb, 0x8d, 0x54, 0x02, 0x3b, 0x2e, 0x61, 0x42, - 0x18, 0xf4, 0x8c, 0xab, 0xc8, 0x21, 0x78, 0x8e, 0x70, 0xa8, 0x10, 0x21, - 0x40, 0x58, 0x26, 0x0a, 0x8d, 0x54, 0x11, 0x43, 0x6e, 0x23, 0x6d, 0x34, - 0x37, 0x13, 0xf9, 0x55, 0xe5, 0x8d, 0x87, 0x88, 0xdc, 0x9d, 0x27, 0x96, - 0xbe, 0x02, 0x20, 0x5f, 0x46, 0x1b, 0xb6, 0xc1, 0x0d, 0xb9, 0x33, 0xbc, - 0x3b, 0x1e, 0xaf, 0xbb, 0x43, 0xc7, 0xc7, 0x71, 0x7d, 0xad, 0xd9, 0x2a, - 0x6c, 0x04, 0x36, 0x49, 0x43, 0xdd, 0x06, 0x86, 0xcb, 0xed, 0xf3, 0xdb, - 0x98, 0x1c, 0xe5, 0x70, 0x20, 0x24, 0x17, 0x8d, 0xca, 0x89, 0x3e, 0x3e, - 0x83, 0x3a, 0xbe, 0xf9, 0xc8, 0x27, 0x6b, 0xa2, 0x86, 0x69, 0x95, 0x8e, - 0x9a, 0x68, 0x66, 0x59, 0xcd, 0xb0, 0x25, 0x55, 0x1b, 0x70, 0x01, 0xe6, - 0x1e, 0x3d, 0x1b, 0x0f, 0xc0, 0xd2, 0x2d, 0xf0, 0xa4, 0xc3, 0x5e, 0x40, - 0xfe, 0x8d, 0x37, 0xc7, 0x35, 0x3b, 0xc9, 0xf4, 0x4a, 0xfd, 0x27, 0xaa, - 0x08, 0xc0, 0xe6, 0xc2, 0x56, 0xea, 0x09, 0xfe, 0xe9, 0x13, 0x24, 0x7c, - 0xc4, 0x95, 0xf1, 0x92, 0xab, 0x3b, 0xe1, 0x33, 0x2a, 0x87, 0x38, 0xd2, - 0x9e, 0xa7, 0x3e, 0x5e, 0x85, 0x7e, 0x60, 0x74, 0xfe, 0xd8, 0xbf, 0x23, - 0x08, 0x3e, 0x56, 0x2b, 0xb9, 0x6d, 0xa4, 0xef, 0x71, 0x97, 0x6a, 0x29, - 0x0e, 0x9c, 0x10, 0x31, 0xd7, 0xfd, 0xe3, 0x9c, 0x60, 0xca, 0xb9, 0xca, - 0xeb, 0x7f, 0x63, 0xe3, 0xa0, 0xa8, 0xbd, 0x20, 0xb9, 0x21, 0xbc, 0xb5, - 0xd4, 0x0c, 0x18, 0x55, 0x61, 0xfb, 0x16, 0x79, 0xa9, 0x48, 0x53, 0x37, - 0x47, 0xd7, 0xbe, 0x76, 0x2c, 0xe4, 0x22, 0xc9, 0xdd, 0xea, 0x07, 0xfa, - 0x79, 0xc9, 0xac, 0x08, 0x01, 0x59, 0xdd, 0x5f, 0x2c, 0xc8, 0x99, 0x47, - 0x1f, 0x59, 0xc7, 0x3b, 0x62, 0x34, 0xce, 0x67, 0xc6, 0xe4, 0x7e, 0x0c, - 0x9c, 0x08, 0xee, 0x7b, 0xd0, 0x25, 0x0e, 0x69, 0xb2, 0x57, 0xaa, 0xd3, - 0x3f, 0x28, 0xa6, 0x1d, 0x75, 0x27, 0x51, 0xb4, 0x67, 0xa5, 0x93, 0xc7, - 0xa3, 0x5f, 0x02, 0x80, 0x29, 0xd8, 0x62, 0x8d, 0xa0, 0x77, 0x95, 0xac, - 0x65, 0x22, 0xff, 0xcc, 0x44, 0x59, 0x63, 0x6a, 0xc0, 0xf7, 0x53, 0xc4, - 0xef, 0x40, 0xec, 0xd8, 0x75, 0x69, 0x59, 0x9b, 0xcf, 0x70, 0x51, 0xb5, - 0xc7, 0x55, 0x73, 0xf9, 0x18, 0x20, 0x95, 0xa3, 0xa3, 0x4d, 0x7a, 0x07, - 0x5b, 0xa1, 0x5d, 0x6e, 0x3f, 0x03, 0x3a, 0x33, 0xe6, 0x11, 0x44, 0x0c, - 0xaa, 0xdc, 0xbd, 0x91, 0xd2, 0x35, 0xba, 0xf8, 0xb0, 0xda, 0x02, 0x63, - 0xa7, 0xb0, 0xca, 0xcf, 0xad, 0xa0, 0xf9, 0xcf, 0x5e, 0xcd, 0xbd, 0x50, - 0xd4, 0xb2, 0x3f, 0x03, 0xb9, 0xd9, 0xea, 0xd0, 0x74, 0x4c, 0x26, 0x0c, - 0xa0, 0x7e, 0xc6, 0x05, 0xe2, 0x21, 0x12, 0x69, 0xeb, 0x03, 0x02, 0xef, - 0xb2, 0x7c, 0xc4, 0x31, 0xc9, 0xa0, 0xa3, 0x40, 0x85, 0x52, 0x23, 0xa4, - 0x05, 0x0d, 0x07, 0xef, 0x0e, 0x6c, 0x07, 0xb9, 0x1d, 0x88, 0xb4, 0xb2, - 0xdc, 0xc7, 0x0e, 0x90, 0xd4, 0xdd, 0xf2, 0xef, 0xac, 0xbb, 0x82, 0x22, - 0x0a, 0x9f, 0x48, 0x7b, 0x63, 0xd7, 0x31, 0xa6, 0xda, 0x42, 0x48, 0x19, - 0xa2, 0x07, 0xce, 0xad, 0x27, 0x6e, 0xdf, 0xed, 0x5e, 0x15, 0xae, 0x33, - 0xa9, 0x95, 0x1f, 0x75, 0x8c, 0x1f, 0xdf, 0x43, 0x41, 0x8f, 0x20, 0xc9, - 0x44, 0xa1, 0x2a, 0x30, 0x21, 0xfc, 0xc1, 0x61, 0xf7, 0x4e, 0xb7, 0x35, - 0x1e, 0x71, 0xc6, 0x14, 0x19, 0x24, 0x37, 0x98, 0x4a, 0x93, 0xe4, 0x9e, - 0xd2, 0x2d, 0x21, 0xa5, 0x13, 0xc6, 0xdc, 0xcb, 0xf0, 0xa2, 0x4a, 0x6e, - 0x7e, 0x42, 0xfc, 0x15, 0x6a, 0x0a, 0xbc, 0x8f, 0x44, 0x94, 0xab, 0x2d, - 0x83, 0xcd, 0x02, 0x35, 0xe8, 0x73, 0x8a, 0x1c, 0xa4, 0x36, 0x68, 0x71, - 0x9c, 0x13, 0xb9, 0x4c, 0xa2, 0x89, 0x4c, 0x79, 0xa0, 0x39, 0xdc, 0x4b, - 0x60, 0x27, 0x5b, 0xcb, 0xad, 0x85, 0x92, 0x57, 0x19, 0x55, 0x9a, 0xaf, - 0x07, 0x2d, 0xa3, 0xd2, 0xc0, 0x87, 0x41, 0xa5, 0xab, 0x25, 0x56, 0xa6, - 0xb6, 0xe8, 0x92, 0x18, 0x8d, 0x2d, 0xb5, 0x36, 0x19, 0x8e, 0xdf, 0xbf, - 0x1c, 0x55, 0xb8, 0xbd, 0x3d, 0xb5, 0xad, 0x49, 0x9d, 0xb6, 0x02, 0xdc, - 0xa4, 0x66, 0xc8, 0x8e, 0xe4, 0x9a, 0xa7, 0x83, 0x4c, 0xd0, 0x9c, 0x79, - 0x96, 0xe8, 0xdf, 0xcf, 0x22, 0xf2, 0x39, 0xe6, 0xca, 0x8d, 0x22, 0x70, - 0xa3, 0xba, 0xc6, 0x5f, 0x5e, 0x98, 0x76, 0x54, 0x21, 0xbf, 0xea, 0xce, - 0x28, 0x2f, 0xbd, 0x59, 0xb0, 0x3c, 0x11, 0xef, 0x6d, 0xa2, 0x00, 0x54, - 0x71, 0x9d, 0xfe, 0x59, 0x7d, 0xba, 0x0c, 0x27, 0xbe, 0x39, 0xcf, 0x69, - 0xc0, 0x8b, 0x79, 0xd4, 0xae, 0x11, 0x01, 0x3e, 0x3c, 0x71, 0xd8, 0x64, - 0xb5, 0x8f, 0x9e, 0xad, 0x38, 0xf0, 0x98, 0xab, 0xdd, 0xa3, 0x3d, 0x01, - 0xa8, 0x1b, 0x74, 0x43, 0xb6, 0x14, 0x01, 0x3b, 0xce, 0x85, 0x2b, 0x75, - 0x4a, 0x20, 0xd0, 0xf7, 0x0d, 0x84, 0xfc, 0x41, 0x6f, 0xff, 0xda, 0xee, - 0x78, 0x6b, 0xef, 0xfe, 0x11, 0xcf, 0x8b, 0x93, 0xf7, 0x20, 0x4d, 0xa5, - 0x92, 0x70, 0xc7, 0x5f, 0x96, 0x95, 0x87, 0xc3, 0x68, 0x30, 0x2a, 0xb8, - 0xcf, 0x92, 0x33, 0x06, 0xc2, 0x91, 0xbe, 0x1f, 0x37, 0xab, 0x5a, 0xf8, - 0x43, 0x24, 0x5e, 0x56, 0x7c, 0x78, 0xf3, 0x4b, 0xfa, 0x57, 0xaf, 0x95, - 0xa8, 0xb9, 0x7a, 0x31, 0x0e, 0xb9, 0x45, 0x09, 0xc7, 0xc7, 0xe6, 0x88, - 0x2b, 0x02, 0xbf, 0x5d, 0xfb, 0x9c, 0x1d, 0x1d, 0xc6, 0xd8, 0xe7, 0x7d, - 0x21, 0x76, 0x10, 0x53, 0x6e, 0xf7, 0x0b, 0xa3, 0x67, 0x4c, 0x9a, 0xc4, - 0x32, 0x8d, 0x7c, 0xc8, 0xb9, 0x1b, 0x7e, 0x88, 0x61, 0x8f, 0x53, 0xb3, - 0x5d, 0x5f, 0x3a, 0xf5, 0x31, 0x8d, 0x19, 0xef, 0x72, 0xe8, 0x86, 0xfb, - 0x98, 0xb8, 0x64, 0x5e, 0xa7, 0x79, 0xac, 0x54, 0xbb, 0x69, 0xf3, 0xb6, - 0x42, 0x9e, 0x48, 0xa0, 0x4e, 0x39, 0xe9, 0xdf, 0x14, 0x79, 0x33, 0x38, - 0x1e, 0xcb, 0x15, 0xb8, 0x9f, 0xf4, 0x0b, 0xb8, 0x13, 0xba, 0xa7, 0xa9, - 0xd6, 0x26, 0x66, 0xa3, 0x6b, 0xb7, 0xbf, 0x1c, 0x97, 0xc6, 0xe4, 0x47, - 0x02, 0x10, 0xaa, 0xfa, 0xf7, 0xe5, 0xf1, 0xe8, 0xa1, 0x1a, 0xf4, 0x81, - 0xb6, 0x11, 0xef, 0x92, 0x88, 0x14, 0x8a, 0x34, 0x80, 0x97, 0x00, 0xc4, - 0x05, 0xb5, 0x7b, 0xcb, 0xec, 0x86, 0x0a, 0x62, 0xda, 0x16, 0xb3, 0x33, - 0x99, 0xe2, 0x4a, 0xa4, 0x3b, 0xbd, 0x3f, 0x4d, 0x46, 0x6f, 0x00, 0xf0, - 0xcd, 0xd3, 0x18, 0xbb, 0x95, 0x9c, 0x9d, 0x58, 0x40, 0x3a, 0xd9, 0x51, - 0x35, 0x59, 0x15, 0xc5, 0x30, 0xf4, 0x4b, 0x66, 0xfc, 0x51, 0xcb, 0x67, - 0xf6, 0x6a, 0x79, 0xa2, 0x02, 0x90, 0x29, 0xb8, 0x64, 0x7a, 0x03, 0x44, - 0xcd, 0x04, 0xdf, 0xab, 0x85, 0x61, 0x72, 0x39, 0x88, 0xf7, 0x2e, 0x1f, - 0x40, 0x76, 0x0b, 0x21, 0xfd, 0xe5, 0x1e, 0xf2, 0x78, 0xb1, 0x48, 0x4f, - 0x4d, 0x88, 0x06, 0xc4, 0x0e, 0x8f, 0xd2, 0x8f, 0xbe, 0xde, 0x06, 0xe1, - 0x67, 0x52, 0x6b, 0xc5, 0x8c, 0x0e, 0xad, 0x91, 0x17, 0x5d, 0x7d, 0x01, - 0x32, 0x1d, 0x3a, 0x3d, 0xf9, 0xd5, 0x75, 0x10, 0x65, 0x73, 0xea, 0x67, - 0x08, 0xdb, 0x7e, 0xd1, 0x8f, 0x11, 0x41, 0xa3, 0x6f, 0x56, 0x5d, 0x43, - 0xc5, 0x0e, 0xdb, 0x43, 0x23, 0x66, 0x9f, 0x86, 0xde, 0xd7, 0x05, 0xa2, - 0x30, 0x84, 0x81, 0x04, 0x0e, 0x28, 0xd6, 0x54, 0x86, 0xe7, 0x63, 0xba, - 0x23, 0xc6, 0x35, 0x1e, 0x7a, 0xfc, 0xba, 0xdb, 0x3b, 0xb0, 0x0b, 0x64, - 0x63, 0xf1, 0x60, 0xa2, 0x08, 0x93, 0x4e, 0x9e, 0xcd, 0x60, 0x77, 0xda, - 0x51, 0x37, 0xca, 0x9d, 0x70, 0x0e, 0x8d, 0x54, 0xbd, 0x13, 0xa3, 0xa9, - 0x02, 0xe1, 0x54, 0x05, 0x2f, 0x7d, 0x04, 0xcd, 0x2a, 0x97, 0x7c, 0x19, - 0xa9, 0x46, 0xc5, 0x92, 0xb3, 0x08, 0xe4, 0x75, 0xa6, 0x72, 0xee, 0x75, - 0xd1, 0xab, 0x62, 0x02, 0xf6, 0xcf, 0x12, 0x2a, 0xef, 0xe5, 0x25, 0xad, - 0x38, 0x87, 0x2b, 0xb5, 0xb9, 0x0c, 0x7d, 0x80, 0x96, 0xf9, 0xc7, 0xbd, - 0x32, 0x05, 0x73, 0xcc, 0x9f, 0xb9, 0x9c, 0x7b, 0x1b, 0xbf, 0x74, 0x24, - 0xce, 0x58, 0x2c, 0xf0, 0x83, 0xbc, 0x75, 0xd5, 0x1f, 0x9e, 0x27, 0xa5, - 0xc8, 0x3c, 0x87, 0x76, 0x8e, 0xd9, 0x95, 0xc9, 0x43, 0x2c, 0x5b, 0x06, - 0x7d, 0xf6, 0xfc, 0x04, 0x87, 0xde, 0x67, 0x65, 0xd0, 0xea, 0x9e, 0x5e, - 0x34, 0xa1, 0xfb, 0x2e, 0x66, 0xa6, 0xbd, 0x0b, 0xb7, 0x06, 0xf5, 0x25, - 0xf5, 0xc3, 0xb8, 0xd8, 0xf5, 0x46, 0x7e, 0x64, 0xdb, 0xe6, 0xc7, 0x27, - 0xbe, 0xb7, 0xe5, 0xde, 0x5d, 0x9a, 0x30, 0x00, 0x07, 0x58, 0x31, 0xd6, - 0x81, 0x6a, 0x46, 0x4f, 0x9c, 0x54, 0xe8, 0x93, 0x4a, 0x22, 0x3a, 0x0c, - 0xed, 0x08, 0xc7, 0x55, 0xab, 0x67, 0xe6, 0x21, 0xc5, 0xf3, 0x66, 0x0f, - 0xfe, 0xd2, 0x0d, 0x7f, 0xac, 0xa8, 0x68, 0x22, 0x28, 0x7d, 0x25, 0xe6, - 0x88, 0x22, 0xfc, 0xfe, 0xf4, 0xd7, 0x91, 0xe0, 0x5a, 0x2f, 0x47, 0xdb, - 0x9f, 0xf6, 0x80, 0xd5, 0x0d, 0x00, 0xbb, 0x7b, 0x7c, 0x02, 0xf1, 0x99, - 0x15, 0xc5, 0x77, 0xfe, 0x6f, 0x3c, 0x3f, 0x11, 0x0e, 0xe7, 0x03, 0x10, - 0x57, 0x66, 0x69, 0xfe, 0x26, 0x5d, 0x7f, 0xdc, 0x8a, 0xf8, 0xc1, 0x6b, - 0x04, 0xea, 0x7c, 0x39, 0xd1, 0x0d, 0x2c, 0xf0, 0xce, 0x82, 0xde, 0x2f, - 0x02, 0x08, 0xe7, 0x49, 0xa5, 0xec, 0x4e, 0x7c, 0x93, 0x2a, 0x9d, 0x55, - 0x7c, 0xc1, 0x23, 0x5f, 0xa8, 0x41, 0x38, 0xb3, 0x97, 0x4f, 0x2e, 0xae, - 0x13, 0xf8, 0xc4, 0x36, 0x24, 0x5c, 0x61, 0xff, 0x72, 0x8a, 0x4d, 0x72, - 0x0e, 0x48, 0x6d, 0x3b, 0xb1, 0x41, 0xd2, 0xd1, 0x83, 0xc2, 0x21, 0xbe, - 0x25, 0xcd, 0x10, 0xcf, 0x74, 0x30, 0xc0, 0x14, 0xc4, 0x1b, 0x5a, 0x7d, - 0x27, 0xcc, 0x96, 0x4c, 0x19, 0x60, 0xc1, 0x1c, 0x99, 0xb2, 0x63, 0xba, - 0x23, 0xc6, 0x35, 0x1e, 0x24, 0x57, 0x3f, 0x1a, 0x0a, 0xa9, 0x1d, 0x45, - 0x36, 0x99, 0x41, 0xe7, 0x83, 0x21, 0xb5, 0x0d, 0x83, 0x60, 0x27, 0x29, - 0x71, 0x4a, 0x32, 0x41, 0xad, 0x2d, 0xde, 0x79, 0xf9, 0xea, 0xd7, 0x86, - 0x1e, 0x16, 0x63, 0x6a, 0x2d, 0xf3, 0xe9, 0x0c, 0xd3, 0xca, 0x36, 0x65, - 0xd0, 0xea, 0x9e, 0x5e, 0x5e, 0x46, 0xbb, 0x2c, 0xda, 0x36, 0x91, 0xb9, - 0xe3, 0x93, 0x74, 0xc0, 0xf2, 0x43, 0xee, 0x5d, 0xd9, 0xa3, 0x47, 0xf5, - 0xa5, 0x8e, 0xd2, 0x6d, 0x56, 0x4d, 0xa9, 0x85, 0xda, 0x55, 0xca, 0x68, - 0x2b, 0x2a, 0x03, 0x7e, 0xe5, 0x47, 0xc6, 0x33, 0x20, 0x28, 0x16, 0x7c, - 0x6d, 0x29, 0x90, 0x48, 0x94, 0x28, 0x3a, 0x75, 0x3b, 0x38, 0x38, 0x41, - 0xad, 0x2d, 0xde, 0x79, 0xf9, 0xea, 0xd7, 0x86, 0xb9, 0xec, 0x3f, 0x1d, - 0x92, 0xf5, 0x5e, 0x01, 0xc2, 0x71, 0xbd, 0x35, 0x23, 0xfe, 0x03, 0xcd, - 0xed, 0x8d, 0x71, 0x1d, 0x65, 0x73, 0xea, 0x67, 0x08, 0xdb, 0x7e, 0xd1, - 0x87, 0x0c, 0x5e, 0xf6, 0xb3, 0x61, 0xee, 0xfe, 0x39, 0x82, 0x6b, 0xd7, - 0xe5, 0xe6, 0x9d, 0xa8, 0x81, 0xde, 0x42, 0xf6, 0x99, 0x44, 0xde, 0xcc, - 0x69, 0x87, 0x7e, 0xdf, 0xbb, 0xe6, 0x94, 0xad, 0x94, 0xdc, 0x08, 0xae, - 0xea, 0x67, 0xf3, 0xbe, 0xc9, 0xc9, 0x6f, 0xa9, 0xfb, 0xcf, 0xe6, 0xb7, - 0xfc, 0x1b, 0x62, 0x4c, 0x5f, 0x90, 0x2d, 0xca, 0x9a, 0xbb, 0xdf, 0x35, - 0x39, 0x34, 0x29, 0xaf, 0xf7, 0xe1, 0xbd, 0xe8, 0xcf, 0xcb, 0xc3, 0x8e, - 0x79, 0x68, 0x41, 0x3a, 0xd0, 0x7a, 0x54, 0x8b, 0x93, 0x0d, 0xfa, 0xc5, - 0xf6, 0x06, 0x37, 0x36, 0xb8, 0x34, 0x30, 0x6a, 0xb6, 0xa4, 0xf8, 0x76, - 0x8f, 0x11, 0xf0, 0xbf, 0x95, 0xad, 0x5c, 0x30, 0x68, 0x66, 0xe8, 0x27, - 0x41, 0x93, 0x65, 0x89, 0x87, 0x0c, 0x5e, 0xf6, 0x8d, 0x06, 0x04, 0x9b, - 0xe5, 0x9d, 0x78, 0x90, 0xbb, 0xb6, 0x3c, 0x11, 0x90, 0x7f, 0xc9, 0xff, - 0x02, 0xa5, 0x7f, 0x58, 0x8f, 0xbb, 0x6a, 0xa4, 0x84, 0xfe, 0x63, 0x18, - 0x03, 0xeb, 0x22, 0x7d, 0xd8, 0x5f, 0x33, 0x7b, 0x27, 0x0d, 0x06, 0x78, - 0x3b, 0xff, 0xa2, 0x83, 0x99, 0x00, 0x2c, 0x6a, 0x1b, 0x43, 0xb8, 0x3e, - 0x49, 0x08, 0xdc, 0x90, 0x59, 0x76, 0x9b, 0x9e, 0x5a, 0xa1, 0x69, 0xc6, - 0x85, 0x4f, 0x24, 0x33, 0x35, 0x50, 0x16, 0x6f, 0x73, 0xed, 0xff, 0xb9, - 0xab, 0x78, 0x26, 0x6a, 0x1b, 0x5e, 0xc6, 0x1e, 0xb2, 0x91, 0x8b, 0x18, - 0xd1, 0x10, 0x98, 0x82, 0xe2, 0xf7, 0x2d, 0x59, 0x6a, 0xb9, 0x11, 0x17, - 0x05, 0x35, 0x85, 0x33, 0x3e, 0xa5, 0x88, 0x35, 0x7f, 0x6e, 0xbc, 0x56, - 0xc1, 0x6b, 0xee, 0xfe, 0x39, 0x82, 0x6b, 0xd7, 0xe5, 0xe6, 0x9d, 0xa8, - 0x81, 0xde, 0x42, 0xf6, 0xb8, 0xb6, 0xc1, 0x36, 0x3b, 0x15, 0x8c, 0xaa, - 0xcd, 0xa2, 0xec, 0x0f, 0x7c, 0xb2, 0x5d, 0xea, 0x9c, 0xc6, 0xdb, 0xb3, - 0x07, 0x68, 0x35, 0x3a, 0x3b, 0x9a, 0x6d, 0x03, 0xa3, 0x4c, 0x5b, 0x8e, - 0x3b, 0x71, 0xd9, 0xb1, 0x48, 0x4d, 0x20, 0x46, 0x8f, 0xdc, 0x94, 0x16, - 0x8f, 0x5c, 0xa6, 0x7a, 0x85, 0xb7, 0x91, 0x67, 0xb4, 0x50, 0x98, 0x7c, - 0xda, 0x6a, 0x7a, 0x7d, 0xa3, 0x39, 0x3a, 0xa5, 0x8e, 0x9b, 0xcb, 0xa4, - 0x4f, 0x7a, 0x68, 0x00, 0x09, 0xe2, 0x67, 0x03, 0xa3, 0x4c, 0x5b, 0x8e, - 0x3b, 0x71, 0xd9, 0xb1, 0x48, 0x4d, 0x20, 0x46, 0x8f, 0xdc, 0x94, 0x16, - 0x8f, 0x5c, 0xa6, 0x7a, 0x67, 0x9c, 0x97, 0x74, 0x6f, 0xbc, 0x5f, 0x96, - 0x08, 0xd9, 0xba, 0x55, 0x57, 0x2a, 0x87, 0x41, 0xcf, 0x17, 0x21, 0x26, - 0x37, 0x1a, 0x4e, 0x6a, 0x66, 0xef, 0xb5, 0xcb, 0xa1, 0x78, 0x26, 0x6a, - 0x1b, 0x5e, 0xc6, 0x1e, 0xb2, 0x91, 0x8b, 0x18, 0xd1, 0x10, 0x98, 0x82, - 0xe2, 0xf7, 0x2d, 0x59, 0x7b, 0x1e, 0x36, 0xc8, 0x0a, 0x86, 0x6d, 0xae, - 0x46, 0x8b, 0x75, 0x9c, 0xb6, 0x24, 0xc4, 0x76, 0xcf, 0x66, 0x55, 0xbb, - 0xed, 0x19, 0xf0, 0x73, 0x0e, 0xc1, 0x63, 0xc1, 0xb6, 0x48, 0x10, 0xb6, - 0x9c, 0xce, 0xcb, 0xa4, 0x4f, 0x7a, 0x68, 0x00, 0x09, 0xe2, 0x67, 0x03, - 0xa3, 0x4c, 0x5b, 0x8e, 0x3b, 0x71, 0xd9, 0xb1, 0x48, 0x4d, 0x20, 0x46, - 0x8f, 0xdc, 0x94, 0x16, 0x8f, 0x5c, 0xa6, 0x7a, 0xe1, 0xe1, 0x58, 0x46, - 0xa9, 0x74, 0x1c, 0x71, 0x5c, 0xfb, 0xb2, 0x32, 0xb1, 0x05, 0x3a, 0xe4, - 0xf8, 0x95, 0x15, 0x65, 0xa7, 0x1f, 0x5c, 0xb1, 0x9a, 0x10, 0x6e, 0xbf, - 0x6e, 0xad, 0xbf, 0x02, 0x8c, 0xd1, 0x93, 0xa1, 0x5a, 0x78, 0x22, 0x72, - 0x03, 0xe2, 0x67, 0x03, 0xa3, 0x4c, 0x5b, 0x8e, 0x3b, 0x71, 0xd9, 0xb1, - 0x48, 0x4d, 0x20, 0x46, 0x8f, 0xdc, 0x94, 0x16, 0x8f, 0x5c, 0xa6, 0x7a, - 0xe1, 0xe1, 0x58, 0x46, 0xa9, 0x74, 0x1c, 0x71, 0x5c, 0xfb, 0xb2, 0x32, - 0xb1, 0x05, 0x3a, 0xe4, 0x7a, 0xc8, 0xeb, 0x4d, 0x7d, 0xd6, 0x7d, 0xfd, - 0x7a, 0xa7, 0x6b, 0x32, 0x64, 0x1b, 0x14, 0xa6, 0xcd, 0x5d, 0x79, 0x23, - 0x22, 0x18, 0x04, 0x32, 0x63, 0xfa, 0xb7, 0x81, 0xd3, 0x72, 0x26, 0x6a, - 0x1b, 0x5e, 0xc6, 0x1e, 0xb2, 0x91, 0x8b, 0x18, 0xd1, 0x10, 0x98, 0x82, - 0xe2, 0xf7, 0x2d, 0x59, 0x7b, 0x1e, 0x36, 0xc8, 0x0a, 0x86, 0x6d, 0xae, - 0x46, 0x8b, 0x75, 0x9c, 0xb6, 0x24, 0xc4, 0x76, 0xcd, 0x1d, 0x9f, 0xa1, - 0x1d, 0xcd, 0x06, 0xd4, 0x15, 0x83, 0xdb, 0xfe, 0x5c, 0x0c, 0x16, 0xb8, - 0x22, 0xe2, 0xd8, 0x3e, 0xcb, 0x26, 0x62, 0xbe, 0xd4, 0x54, 0xd3, 0x08, - 0xd1, 0xa9, 0x3b, 0xe6, 0x53, 0xba, 0xb2, 0xcc, 0x5b, 0x26, 0x30, 0x67, - 0xfc, 0x96, 0xc5, 0xb8, 0x16, 0x88, 0xce, 0xd9, 0x78, 0x67, 0xc3, 0xb1, - 0xbe, 0x52, 0xf2, 0x4b, 0xbc, 0x72, 0x71, 0x1e, 0x7d, 0xd0, 0x08, 0x45, - 0xba, 0xe6, 0xac, 0x97, 0xc5, 0xd6, 0x3e, 0x46, 0x73, 0x4e, 0x02, 0xc3, - 0xfa, 0x28, 0x80, 0x00, 0x5a, 0xef, 0x4d, 0x72, 0xca, 0x72, 0x0b, 0x90, - 0xf6, 0x43, 0xcd, 0x09, 0xf0, 0x94, 0x85, 0xd1, 0x21, 0xd1, 0x34, 0x17, - 0xb0, 0x08, 0x70, 0xa1, 0xc2, 0x42, 0x26, 0xb3, 0x04, 0xb0, 0xd6, 0x6e, - 0x0e, 0xaa, 0xa5, 0x84, 0x63, 0x5e, 0x3a, 0x67, 0xfc, 0x96, 0xc5, 0xb8, - 0x16, 0x88, 0xce, 0xd9, 0x78, 0x67, 0xc3, 0xb1, 0xbe, 0x52, 0xf2, 0x4b, - 0xbc, 0x72, 0x71, 0x1e, 0x7d, 0xd0, 0x08, 0x45, 0xba, 0xe6, 0xac, 0x97, - 0xc5, 0xd6, 0x3e, 0x46, 0x73, 0x4e, 0x02, 0xc3, 0xfa, 0x28, 0x80, 0x00, - 0x5a, 0xef, 0x4d, 0x72, 0xca, 0x72, 0x0b, 0x90, 0xf6, 0x43, 0xcd, 0x09, - 0xf0, 0x94, 0x85, 0xd1, 0xa7, 0xb3, 0x8c, 0x29, 0xef, 0xb8, 0x57, 0x13, - 0xf7, 0x9d, 0xed, 0x5e, 0x8b, 0xc8, 0x83, 0xfc, 0x99, 0xd3, 0xd9, 0xf9, - 0x5f, 0x6d, 0x20, 0x38, 0x71, 0xe8, 0x67, 0x03, 0xa3, 0x4c, 0x5b, 0x8e, - 0x3b, 0x71, 0xd9, 0xb1, 0x48, 0x4d, 0x20, 0x46, 0x8f, 0xdc, 0x94, 0x16, - 0x8f, 0x5c, 0xa6, 0x7a, 0xe1, 0xe1, 0x58, 0x46, 0xa9, 0x74, 0x1c, 0x71, - 0x5c, 0xfb, 0xb2, 0x32, 0xb1, 0x05, 0x3a, 0xe4, 0x30, 0xea, 0x5f, 0x3c, - 0x64, 0x1f, 0xf3, 0x1e, 0xa6, 0x0b, 0x2b, 0xb3, 0xc0, 0xd4, 0xdf, 0x9d, - 0x39, 0x06, 0x6f, 0xaa, 0x5e, 0x10, 0x31, 0xcc, 0xc2, 0x05, 0x31, 0xdb, - 0x2d, 0x36, 0x54, 0x1f, 0xbd, 0xc7, 0xf3, 0x87, 0xe0, 0x54, 0x74, 0x31, - 0x8f, 0x1b, 0x6f, 0xc5, 0xd3, 0x8b, 0x15, 0xf8, 0xcc, 0x0e, 0xec, 0xf2, - 0x59, 0x95, 0xc6, 0x5a, 0x95, 0xaf, 0xc9, 0xe8, 0x56, 0xfc, 0x33, 0xbf, - 0xb9, 0x3d, 0x8b, 0x03, 0x6f, 0x66, 0x92, 0xef, 0x25, 0x51, 0xac, 0xda, - 0xf0, 0xf1, 0x25, 0xa1, 0x66, 0x9f, 0xb6, 0x62, 0x52, 0x2d, 0x4c, 0x2c, - 0x26, 0xaf, 0x9c, 0x98, 0x20, 0xa7, 0xdb, 0xf4, 0x9e, 0x10, 0xf7, 0xa4, - 0xca, 0x2e, 0x89, 0x4f, 0xed, 0xb1, 0x12, 0x06, 0xef, 0xa3, 0x3f, 0xba, - 0xb8, 0x6b, 0xcb, 0x87, 0xe3, 0xe2, 0x88, 0xd0, 0x7a, 0x1a, 0x88, 0xe0, - 0x39, 0x79, 0x12, 0x9d, 0x1c, 0xc9, 0x5e, 0xcd, 0xa7, 0xab, 0xdf, 0xae, - 0xeb, 0x07, 0x6f, 0xc5, 0x00, 0xab, 0x86, 0x1f, 0x52, 0xce, 0xad, 0xd0, - 0x4c, 0x9e, 0x20, 0x0e, 0x60, 0xf7, 0x61, 0x83, 0x99, 0x86, 0xca, 0xe6, - 0xa1, 0xe8, 0x14, 0xd4, 0x36, 0x3a, 0x56, 0xfb, 0x65, 0x39, 0x1f, 0x53, - 0x63, 0x5b, 0x57, 0x1a, 0xf5, 0x38, 0x35, 0xd4, 0xde, 0x22, 0x45, 0xdb, - 0x5a, 0x3e, 0x21, 0xa3, 0x80, 0xfb, 0xb4, 0x14, 0x60, 0xbb, 0xaf, 0x02, - 0x35, 0x57, 0xf3, 0xa8, 0xa7, 0x90, 0x8b, 0x18, 0x0e, 0x76, 0x52, 0xa0, - 0xf1, 0xcd, 0xf4, 0x16, 0xd2, 0xfe, 0x16, 0x99, 0x23, 0x5a, 0x5a, 0xd1, - 0x1b, 0xe6, 0x3b, 0x44, 0x0d, 0xa2, 0xd8, 0xaa, 0xfe, 0x5a, 0xa6, 0x49, - 0x78, 0x4e, 0x0c, 0x18, 0x31, 0xe6, 0x2e, 0x84, 0x8c, 0xf5, 0x53, 0x8a, - 0x4b, 0xc3, 0xa3, 0xb9, 0x0a, 0x09, 0x8a, 0xb5, 0x38, 0x6f, 0xae, 0x7f, - 0x82, 0x26, 0x5c, 0xf6, 0x7d, 0x89, 0x93, 0xd8, 0x48, 0x73, 0x96, 0xae, - 0xf9, 0x96, 0x0e, 0x39, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0xef, 0xdb, 0x91, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0xd8, 0x48, 0xce, 0x6d, - 0x82, 0xf4, 0x2a, 0x68, 0xc7, 0x1f, 0xb4, 0xac, 0x58, 0x61, 0xcb, 0xc8, - 0xea, 0x08, 0x65, 0xe8, 0x29, 0x8c, 0x47, 0xb0, 0x0a, 0x1c, 0x54, 0x2f, - 0x7d, 0x20, 0x2c, 0x84, 0xc8, 0x5a, 0xb5, 0xd1, 0xf5, 0x13, 0x54, 0x3f, - 0xfd, 0xb8, 0x88, 0x29, 0xce, 0xe0, 0x95, 0x86, 0xed, 0xb7, 0x6f, 0xb0, - 0x1f, 0xdb, 0x72, 0xc7, 0x6d, 0x17, 0x7c, 0x56, 0x44, 0xd9, 0xb5, 0xee, - 0xf0, 0x9a, 0x2b, 0xb6, 0xb6, 0xf6, 0x2f, 0x84, 0x61, 0x90, 0x61, 0x1f, - 0x53, 0x40, 0x0e, 0x8c, 0x73, 0x48, 0xdb, 0x5d, 0x40, 0x92, 0x83, 0x33, - 0xa0, 0xba, 0x70, 0x39, 0x31, 0xa0, 0x95, 0xcf, 0x0b, 0x76, 0x84, 0xa1, - 0x57, 0x9b, 0x32, 0x40, 0x40, 0x4b, 0x68, 0x2a, 0x22, 0x9b, 0xd0, 0xaf, - 0x85, 0x80, 0x37, 0xcc, 0x61, 0xf4, 0xe9, 0x87, 0xee, 0xa0, 0x2e, 0x44, - 0x64, 0x71, 0x2a, 0xda, 0x0f, 0xfc, 0xfb, 0x6a, 0x78, 0xb1, 0xb9, 0xfd, - 0x2c, 0x61, 0xce, 0x2b, 0xd1, 0xa2, 0x81, 0x1e, 0xd3, 0xc5, 0x7b, 0x9e, - 0x5a, 0xba, 0x6c, 0xda, 0x91, 0xff, 0xc9, 0xd3, 0xf0, 0xda, 0xea, 0x42, - 0x37, 0x45, 0x56, 0xeb, 0x7d, 0xd7, 0x51, 0x09, 0x5c, 0xbd, 0x0b, 0x9a, - 0xaf, 0x92, 0x69, 0xa9, 0x39, 0xc8, 0x1e, 0xf0, 0x4f, 0x16, 0xec, 0x04, - 0x75, 0x91, 0x6f, 0xd0, 0xcd, 0xb3, 0xc2, 0x0c, 0x7c, 0x3f, 0x39, 0xa8, - 0xaf, 0xd9, 0x36, 0x32, 0xee, 0x18, 0x96, 0xc5, 0x80, 0x5c, 0x93, 0x6c, - 0xa2, 0xcd, 0x67, 0x49, 0x93, 0x46, 0x54, 0xb7, 0xc9, 0x6b, 0x87, 0x35, - 0x0f, 0x5d, 0x64, 0x8c, 0x4d, 0xb4, 0x96, 0x05, 0x3c, 0xe2, 0x73, 0x53, - 0x11, 0x0c, 0x53, 0x37, 0x34, 0xa9, 0x0a, 0x23, 0xf0, 0xad, 0x02, 0x20, - 0xd4, 0xf1, 0x0f, 0xa0, 0x6f, 0x73, 0xc2, 0xf6, 0x2a, 0x1f, 0x4b, 0x56, - 0x2a, 0xf8, 0xf4, 0xb3, 0x1a, 0x1e, 0xab, 0x40, 0x20, 0x49, 0xf9, 0x0f, - 0xac, 0x1e, 0x25, 0x98, 0x0a, 0xb1, 0x9a, 0x02, 0x4a, 0xc0, 0x05, 0xab, - 0x62, 0xfa, 0xde, 0xb3, 0x6c, 0x6d, 0xe0, 0x55, 0xdf, 0xfc, 0x2f, 0x50, - 0x03, 0x59, 0x09, 0xaa, 0x33, 0x80, 0xb8, 0x6f, 0xb4, 0x8c, 0x50, 0xba, - 0x8e, 0x2b, 0xd2, 0x59, 0x5c, 0x5d, 0x59, 0x71, 0x5c, 0xf8, 0x15, 0xa6, - 0x1c, 0xd0, 0xa3, 0xeb, 0xbe, 0x41, 0x79, 0x11, 0x41, 0xb6, 0x6d, 0xf8, - 0x38, 0xfd, 0x77, 0x46, 0x63, 0x28, 0xa8, 0xaa, 0x7f, 0xa6, 0x04, 0xfd, - 0xaf, 0xb5, 0xc4, 0x88, 0xe8, 0xf1, 0xa2, 0xe5, 0xf6, 0x37, 0x19, 0x7e, - 0x65, 0x9d, 0xd9, 0x7a, 0xc0, 0xab, 0xc9, 0x35, 0x48, 0x59, 0x27, 0x08, - 0xa7, 0xff, 0x86, 0x9f, 0x8a, 0x3c, 0x55, 0x9b, 0xed, 0xfa, 0xdd, 0xdf, - 0x85, 0xeb, 0x2d, 0xfb, 0xf5, 0x94, 0x7e, 0x3b, 0x33, 0x6e, 0x7e, 0xf6, - 0x86, 0x10, 0xb4, 0xc1, 0x45, 0x48, 0xba, 0x47, 0xb2, 0x90, 0x10, 0xa5, - 0xd2, 0xce, 0xfa, 0xb7, 0x7f, 0xe5, 0x1e, 0x9e, 0xbb, 0x42, 0xdb, 0x17, - 0x9d, 0x43, 0x82, 0x13, 0xfe, 0x42, 0x1f, 0x2b, 0xa0, 0x99, 0x28, 0xf9, - 0xd9, 0x48, 0x10, 0xe3, 0xc2, 0x64, 0xad, 0xe6, 0x71, 0xe7, 0x09, 0x01, - 0x31, 0x61, 0x25, 0xdf, 0xe8, 0x42, 0xf7, 0x7a, 0xbd, 0x68, 0xe3, 0x08, - 0x1e, 0xef, 0xe4, 0xf4, 0x86, 0x14, 0x63, 0x42, 0x09, 0x07, 0x95, 0x84, - 0xea, 0xbb, 0x48, 0xcf, 0xac, 0x83, 0x7f, 0x86, 0x59, 0xac, 0xd7, 0x40, - 0xa6, 0x23, 0x77, 0x9e, 0x73, 0x5e, 0x86, 0xbf, 0x12, 0x3f, 0xc6, 0xd2, - 0xb1, 0xdb, 0x3b, 0x25, 0x5e, 0x50, 0x25, 0x43, 0xd1, 0xd0, 0x19, 0xe5, - 0x62, 0xda, 0xe3, 0xab, 0x97, 0x80, 0x33, 0x66, 0xbf, 0x1a, 0x00, 0xc4, - 0x41, 0x1a, 0x37, 0xb6, 0x6f, 0x61, 0x70, 0xac, 0x48, 0x49, 0x46, 0xd9, - 0x84, 0x06, 0x5c, 0x54, 0x0a, 0x2d, 0x77, 0x27, 0xe8, 0xdf, 0x90, 0xde, - 0xf3, 0xf1, 0xa4, 0xe7, 0xd8, 0x96, 0x90, 0x04, 0x6a, 0xbc, 0xed, 0x9c, - 0xf9, 0x47, 0xe1, 0xaa, 0x76, 0x24, 0x77, 0x3e, 0xf5, 0xc6, 0xf9, 0x60, - 0x6e, 0xa9, 0x1b, 0x88, 0x2d, 0x96, 0x55, 0x34, 0xb8, 0x71, 0x17, 0x6a, - 0xa5, 0x9d, 0x82, 0x8a, 0x00, 0x3e, 0x89, 0xc3, 0x42, 0xd6, 0x54, 0xe0, - 0x57, 0xda, 0xe0, 0xf2, 0x64, 0x82, 0xec, 0xba, 0x25, 0x5c, 0xb7, 0x0d, - 0xe3, 0x89, 0xd5, 0x32, 0xf8, 0x0d, 0xf1, 0xf5, 0x66, 0x14, 0x4e, 0x08, - 0x83, 0x1d, 0xeb, 0xc6, 0xfa, 0x10, 0x43, 0xfc, 0xfa, 0xe8, 0xf6, 0x59, - 0x0f, 0x4d, 0x97, 0x37, 0xd9, 0x56, 0x22, 0x4d, 0xfa, 0xbb, 0xc0, 0x6e, - 0x6c, 0xde, 0x50, 0xe8, 0xc8, 0xdc, 0x53, 0x85, 0x2f, 0x82, 0x8d, 0x9f, - 0x2e, 0xf2, 0x2f, 0xf8, 0x22, 0x33, 0xb8, 0x32, 0x46, 0xa7, 0x38, 0xb7, - 0x06, 0x92, 0xb0, 0x89, 0x4e, 0x87, 0xb3, 0xd8, 0x08, 0x08, 0x8f, 0x35, - 0xda, 0xb6, 0x3e, 0xa8, 0x8d, 0xa4, 0x47, 0x40, 0x61, 0x81, 0x01, 0x65, - 0x9a, 0xe4, 0x4d, 0xb2, 0xf6, 0x39, 0x27, 0xb5, 0xd3, 0xd2, 0xc3, 0xda, - 0x1b, 0xf1, 0x2a, 0xf5, 0x2e, 0x0e, 0xb8, 0x66, 0x7b, 0xbb, 0x98, 0x09, - 0xd0, 0x90, 0xf8, 0xc9, 0x5a, 0x77, 0xf7, 0x12, 0xc3, 0x34, 0xeb, 0x85, - 0xed, 0xe5, 0xe7, 0xd6, 0x30, 0x17, 0x37, 0x75, 0x98, 0xbc, 0x7a, 0xc3, - 0x54, 0x2e, 0x8d, 0xaf, 0x41, 0x2d, 0x0e, 0x34, 0xdf, 0x4d, 0x44, 0x0e, - 0xaa, 0x08, 0xa1, 0xe1, 0x4d, 0x5e, 0x42, 0xe5, 0xc4, 0x18, 0xfd, 0xcc, - 0x27, 0x98, 0x07, 0x2a, 0xfa, 0x2b, 0x65, 0xb0, 0x34, 0x75, 0x25, 0xac, - 0xaa, 0xcb, 0xa0, 0xc6, 0xfd, 0x9a, 0x63, 0x83, 0x3d, 0x8a, 0x6f, 0xa3, - 0x04, 0xc4, 0x35, 0xc0, 0x63, 0x38, 0xcb, 0xf4, 0x24, 0x69, 0x1f, 0x24, - 0x01, 0xd4, 0xd0, 0x5f, 0x0d, 0x3e, 0xab, 0x5e, 0x65, 0x45, 0x00, 0xf5, - 0x82, 0x82, 0x5e, 0x70, 0x61, 0x31, 0xe2, 0x68, 0xbb, 0x25, 0x9c, 0x5e, - 0x82, 0x93, 0x89, 0xef, 0x46, 0x1e, 0x13, 0x39, 0xc8, 0x87, 0xce, 0xe3, - 0x7e, 0x45, 0x1d, 0xd6, 0x2a, 0xdc, 0x61, 0x25, 0x5b, 0x18, 0x25, 0x2f, - 0x76, 0xcc, 0xbc, 0x0f, 0xc7, 0x97, 0x2c, 0xcd, 0x2d, 0x61, 0xbe, 0xc5, - 0xe6, 0x99, 0x12, 0xa0, 0xf5, 0x36, 0x6e, 0x6a, 0xe7, 0x12, 0xc8, 0x6e, - 0xe1, 0x8e, 0x30, 0xbd, 0x01, 0xe6, 0x87, 0x98, 0x24, 0x48, 0x6b, 0x7f, - 0x7c, 0x13, 0xcf, 0x4a, 0x72, 0xe1, 0xdf, 0x9e, 0xf3, 0x2f, 0x41, 0x6a, - 0x14, 0x61, 0x0a, 0xd4, 0xaf, 0xea, 0x3e, 0x7d, 0x48, 0x7a, 0xf6, 0x13, - 0x78, 0x06, 0x77, 0x04, 0x58, 0x7b, 0x9b, 0x47, 0xc4, 0xf3, 0xe6, 0x66, - 0xad, 0xc7, 0x05, 0xc8, 0x84, 0x99, 0xd8, 0xd7, 0xae, 0x5d, 0x8e, 0xa0, - 0xa2, 0x2a, 0xdc, 0xc9, 0x29, 0xdc, 0x77, 0x91, 0xfa, 0xde, 0x30, 0x95, - 0x53, 0x39, 0xe9, 0xbb, 0x48, 0x1a, 0x48, 0x6f, 0x10, 0xc9, 0xb3, 0x34, - 0x96, 0xe1, 0xdb, 0x58, 0x4d, 0xdf, 0xd9, 0x60, 0x0c, 0xd9, 0x73, 0x2f, - 0x02, 0xea, 0x1a, 0x16, 0xe7, 0x35, 0x87, 0xe3, 0x3f, 0x0d, 0xaf, 0x27, - 0x82, 0x91, 0x7f, 0xbd, 0x2f, 0x13, 0x43, 0xa5, 0x53, 0xba, 0xa3, 0x4f, - 0x62, 0xe2, 0xa6, 0x7a, 0x65, 0xde, 0x36, 0x49, 0x9e, 0x63, 0x45, 0xe3, - 0x51, 0xde, 0x11, 0x2d, 0xef, 0xcb, 0x96, 0xf7, 0x89, 0x1d, 0x73, 0xfe, - 0x99, 0x02, 0xdd, 0xa6, 0x15, 0xad, 0x24, 0x19, 0x53, 0x8b, 0x9d, 0xe4, - 0x0c, 0xee, 0x6f, 0xd8, 0x7d, 0x0d, 0xcb, 0xfb, 0x4d, 0x31, 0x19, 0x1e, - 0xe2, 0xdb, 0x91, 0x75, 0x85, 0x09, 0x74, 0x7c, 0x95, 0x1a, 0xda, 0x24, - 0x19, 0xb1, 0x23, 0x9b, 0x53, 0x8b, 0x9d, 0xe4, 0x0c, 0xee, 0x6f, 0xd8, - 0x7d, 0x0d, 0xcb, 0xfb, 0x4d, 0x31, 0x19, 0x1e, 0x1d, 0x0b, 0x5a, 0x6d, - 0xdc, 0xa1, 0xe3, 0x3c, 0xd1, 0x4f, 0xc4, 0x28, 0x10, 0x91, 0x6b, 0xf1, - 0xd1, 0xde, 0xd3, 0x0a, 0xf4, 0xa1, 0x46, 0xce, 0x3d, 0xd9, 0xfa, 0xbc, - 0x6d, 0x1f, 0x89, 0xaf, 0xe8, 0xd6, 0xf2, 0x73, 0x17, 0xb0, 0x4d, 0xd6, - 0xe4, 0x8a, 0x7b, 0x37, 0x12, 0xa7, 0x24, 0xbf, 0xb5, 0x52, 0xd3, 0x0a, - 0x90, 0x28, 0x46, 0xce, 0x59, 0x5f, 0xfa, 0xbc, 0x09, 0x9c, 0x89, 0xaf, - 0x52, 0x35, 0x30, 0xaa, 0x6e, 0x5b, 0x17, 0x49, 0x12, 0xf4, 0x1d, 0xe2, - 0x7f, 0x07, 0x74, 0x19, 0x11, 0x0b, 0x63, 0x90, 0x12, 0x58, 0x2c, 0x11, - 0xdf, 0x08, 0xd9, 0x2f, 0x80, 0xea, 0x52, 0x1b, 0x21, 0xe0, 0xf0, 0xe3, - 0xad, 0x75, 0x6b, 0x58, 0x92, 0xe4, 0xea, 0x9c, 0x1b, 0x8c, 0x4d, 0x0b, - 0x20, 0x97, 0x11, 0x5a, 0xc6, 0x89, 0x18, 0x8c, 0xe9, 0x42, 0xd8, 0xba, - 0xff, 0x9c, 0x8e, 0x8c, 0xa1, 0xcf, 0x63, 0xa6, 0x79, 0x54, 0xa5, 0xa9, - 0x61, 0xf2, 0xbd, 0x59, 0x73, 0x50, 0x52, 0xd1, 0x93, 0xd7, 0xca, 0x53, - 0x86, 0xa6, 0x3f, 0x02, 0xa2, 0xf1, 0x8c, 0x90, 0x0c, 0x16, 0x69, 0x17, - 0x93, 0xa9, 0x84, 0x7d, 0x9d, 0x39, 0x13, 0x57, 0xc3, 0x1a, 0xe1, 0xbe, - 0x46, 0x5b, 0xb0, 0x1c, 0x00, 0xd2, 0x49, 0x4b, 0xce, 0xa5, 0x92, 0xa4, - 0x90, 0x8d, 0x67, 0x80, 0x69, 0xc0, 0x61, 0x59, 0xc2, 0xd7, 0x46, 0x42, - 0x17, 0xd0, 0x84, 0xeb, 0x9a, 0x94, 0x26, 0xaa, 0x73, 0xb0, 0x49, 0x7f, - 0x32, 0x3c, 0xa4, 0x9a, 0xd4, 0xe7, 0xff, 0x44, 0xfd, 0xee, 0x2f, 0x21, - 0xb2, 0x82, 0x7d, 0x64, 0x68, 0x78, 0x28, 0x8a, 0xa6, 0xd5, 0xc1, 0xdc, - 0x29, 0xbb, 0x16, 0x44, 0x70, 0xb6, 0x18, 0x3b, 0xb1, 0x06, 0xca, 0xd5, - 0x53, 0xd9, 0xb5, 0x2f, 0x94, 0x89, 0x71, 0xa8, 0x7b, 0xb4, 0xd2, 0x59, - 0xf0, 0x9d, 0xc9, 0x1b, 0x62, 0xc2, 0xfb, 0xa6, 0x4a, 0x45, 0xa6, 0x8a, - 0x6d, 0x3a, 0x58, 0x85, 0x54, 0xd3, 0x1e, 0x3a, 0x93, 0xef, 0xd8, 0x40, - 0x44, 0x5f, 0xbd, 0xd5, 0xca, 0x4e, 0x3b, 0x20, 0x77, 0xbd, 0xb9, 0x3c, - 0xf5, 0x84, 0xf9, 0xa4, 0x24, 0xf5, 0xe0, 0x1a, 0xcc, 0xcf, 0xa0, 0x50, - 0x49, 0xac, 0xe4, 0x4c, 0xb7, 0xf0, 0x2e, 0x45, 0x3b, 0x0c, 0xcd, 0xf0, - 0x68, 0x27, 0xec, 0x91, 0xae, 0xea, 0xe4, 0xed, 0xff, 0xa5, 0x3f, 0x2a, - 0x8d, 0x93, 0x33, 0x8f, 0x26, 0x51, 0xc1, 0x5b, 0x5c, 0xc4, 0xfa, 0xf2, - 0x04, 0xd6, 0x44, 0x9f, 0xee, 0x91, 0x44, 0xbb, 0xe0, 0x81, 0xb4, 0x5c, - 0xa4, 0x17, 0xc3, 0x39, 0xeb, 0x4f, 0xff, 0xee, 0x21, 0xe3, 0x48, 0xe6, - 0x93, 0x32, 0xa1, 0xc6, 0xf4, 0x58, 0xb3, 0xbc, 0x26, 0x85, 0xc9, 0xe6, - 0x58, 0x1b, 0xec, 0x8f, 0x39, 0x0a, 0x28, 0x08, 0xff, 0xda, 0xb9, 0x7e, - 0xaa, 0x97, 0xcd, 0x1b, 0xf5, 0x68, 0x9a, 0xab, 0xc6, 0xc8, 0x12, 0x5a, - 0x70, 0x89, 0xdb, 0x83, 0x61, 0xb2, 0xe3, 0xaf, 0xe1, 0x9f, 0x66, 0xe0, - 0x41, 0x1d, 0x83, 0x1d, 0x47, 0x41, 0x2e, 0x38, 0x03, 0x61, 0xeb, 0x0a, - 0xfa, 0xdd, 0x51, 0xd3, 0x43, 0x11, 0x76, 0xdc, 0x3b, 0x95, 0x15, 0xd9, - 0xf1, 0x79, 0xd2, 0x3f, 0x14, 0x20, 0x69, 0x71, 0xc8, 0x59, 0xb7, 0xfc, - 0xde, 0x0a, 0xce, 0xf8, 0xd2, 0x86, 0xb5, 0x98, 0x2e, 0x9a, 0xd0, 0xa5, - 0x77, 0x08, 0xb0, 0x6a, 0x55, 0x38, 0x94, 0x6c, 0x1f, 0x06, 0x4b, 0x95, - 0xf4, 0x67, 0x05, 0xef, 0x59, 0x95, 0x59, 0x2c, 0x20, 0xc9, 0x17, 0x1a, - 0xbb, 0x8c, 0x01, 0x5f, 0xfd, 0xb0, 0x22, 0x71, 0x84, 0xee, 0x15, 0x2c, - 0x65, 0x53, 0x0a, 0xf8, 0x91, 0xa0, 0xde, 0xbb, 0xe2, 0x4a, 0xa0, 0xf8, - 0xca, 0x9b, 0xf0, 0x30, 0x25, 0x6a, 0x11, 0xd9, 0x60, 0x25, 0x42, 0x1b, - 0x30, 0xbc, 0x48, 0x3e, 0x0f, 0x92, 0x72, 0xdb, 0x0c, 0xdc, 0x08, 0x6c, - 0x11, 0xd1, 0xea, 0xad, 0xc8, 0xa5, 0x77, 0xf3, 0x86, 0x29, 0x58, 0x83, - 0x12, 0x21, 0x46, 0x98, 0xfd, 0xd7, 0xbc, 0xd3, 0xb6, 0x21, 0xc1, 0xbb, - 0xbe, 0xee, 0x92, 0x25, 0x25, 0x6a, 0x11, 0xd9, 0x60, 0x25, 0x42, 0x1b, - 0x30, 0xbc, 0x48, 0x3e, 0x0f, 0x92, 0x72, 0xdb, 0xc9, 0xa5, 0xd6, 0x25, - 0x21, 0x13, 0x0f, 0x32, 0xf9, 0xcc, 0xe2, 0x93, 0xd5, 0xb8, 0xac, 0xfc, - 0x29, 0xb3, 0xd2, 0x0b, 0xaa, 0x06, 0x79, 0x69, 0xdc, 0xf1, 0x6f, 0xc7, - 0x42, 0xb6, 0xbd, 0xd9, 0x19, 0x1e, 0x2f, 0xd2, 0xa6, 0xca, 0x93, 0x50, - 0xad, 0x11, 0x8b, 0xab, 0xd7, 0xe8, 0x7f, 0x0d, 0x36, 0x2a, 0x4a, 0xf9, - 0xce, 0x09, 0x0d, 0x8a, 0xc8, 0x2d, 0x2a, 0xaa, 0x23, 0x50, 0xce, 0x0c, - 0xb2, 0xdd, 0xde, 0xc4, 0x57, 0x8d, 0xbf, 0x1f, 0x1c, 0x61, 0xe3, 0xd6, - 0x85, 0x75, 0x7a, 0xbd, 0xdd, 0xb7, 0x65, 0x46, 0x92, 0x75, 0x6b, 0x8c, - 0x09, 0xea, 0x3d, 0x40, 0xa3, 0xc7, 0x41, 0xdb, 0x81, 0xcf, 0x6c, 0x16, - 0x9a, 0xa2, 0xf3, 0xe2, 0x74, 0x06, 0xcf, 0x9b, 0x5a, 0xc8, 0xa2, 0x99, - 0x83, 0x1f, 0x14, 0x56, 0xb0, 0x49, 0xe2, 0x3d, 0xf1, 0x47, 0xa0, 0xcc, - 0x05, 0xc4, 0xf9, 0x28, 0xc4, 0x79, 0x4a, 0x01, 0x8c, 0x3c, 0xf7, 0xdc, - 0x81, 0xd3, 0x39, 0x1d, 0xd2, 0x7b, 0x70, 0x7a, 0x93, 0x58, 0xa4, 0x8d, - 0xcd, 0x92, 0xcb, 0x0f, 0xc8, 0xf8, 0x76, 0xda, 0x29, 0x35, 0x4d, 0x4f, - 0x0d, 0xa3, 0xb4, 0xfa, 0xe3, 0x13, 0x7b, 0x8e, 0xf1, 0x2e, 0x75, 0x53, - 0x3e, 0x51, 0x40, 0x65, 0x93, 0xd9, 0x25, 0x8a, 0xbc, 0xfc, 0xfd, 0x4f, - 0x25, 0x65, 0x10, 0x44, 0x13, 0x4d, 0xff, 0x60, 0x06, 0xb5, 0x08, 0x69, - 0x1f, 0xa6, 0xdc, 0x5a, 0xa0, 0x86, 0x6b, 0xe1, 0x93, 0x92, 0xb4, 0x4a, - 0xb3, 0x0d, 0x3f, 0x4a, 0xf9, 0x7d, 0x14, 0x15, 0xfd, 0x2e, 0xe7, 0x65, - 0x32, 0xe7, 0x92, 0x7f, 0x1a, 0xf2, 0x28, 0xf7, 0x2c, 0x0b, 0xbc, 0x61, - 0xeb, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0xf5, 0x52, 0xf6, 0xb5, - 0xdb, 0x89, 0x58, 0xda, 0x4c, 0x17, 0x82, 0x53, 0x79, 0x88, 0x12, 0xfc, - 0x21, 0x89, 0xb8, 0x61, 0x8d, 0x28, 0x77, 0xff, 0xb5, 0x0a, 0x19, 0x52, - 0x60, 0x7c, 0x5a, 0x0c, 0x89, 0xfa, 0x4d, 0x09, 0x46, 0x2b, 0x61, 0xde, - 0x2d, 0xa9, 0x4b, 0x8f, 0x15, 0x03, 0xed, 0x40, 0x89, 0x33, 0x87, 0x24, - 0xec, 0xdf, 0x32, 0x6a, 0xab, 0xb7, 0xd8, 0x6d, 0x88, 0x74, 0x8b, 0xbd, - 0x82, 0x84, 0xba, 0xf4, 0xdc, 0xf9, 0xd3, 0xf8, 0xb4, 0x0b, 0x6d, 0xca, - 0x5e, 0x1c, 0xc7, 0x1f, 0x6e, 0xe3, 0x8b, 0x63, 0x84, 0x63, 0x25, 0xa9, - 0xd7, 0x34, 0x37, 0x01, 0xe8, 0x25, 0x9f, 0x72, 0x79, 0xfc, 0x48, 0x06, - 0xb6, 0xdf, 0x87, 0x2f, 0x06, 0xf2, 0x89, 0x2c, 0x53, 0xe0, 0x76, 0x2a, - 0x41, 0xbf, 0x29, 0xd4, 0x76, 0x62, 0x22, 0x46, 0xb7, 0xb4, 0xca, 0xf6, - 0xde, 0xef, 0x4e, 0x6a, 0x62, 0xe6, 0x86, 0xeb, 0x22, 0x12, 0xcb, 0x97, - 0xa5, 0x47, 0x5e, 0xdc, 0x07, 0x4b, 0x02, 0x1f, 0x73, 0xa5, 0x5a, 0x4c, - 0x43, 0x9a, 0x48, 0x9e, 0x03, 0x94, 0x31, 0x78, 0xb3, 0x18, 0x5b, 0x62, - 0x05, 0xaf, 0x46, 0x84, 0x4d, 0x70, 0x34, 0x40, 0xbb, 0xb4, 0xcb, 0xc1, - 0xcb, 0xff, 0x4e, 0x6a, 0x62, 0xe6, 0x86, 0xeb, 0x22, 0x12, 0xcb, 0x97, - 0xa5, 0x47, 0x5e, 0xdc, 0x07, 0x4b, 0x02, 0x1f, 0xac, 0x47, 0xa8, 0xc1, - 0xa3, 0xdc, 0x6d, 0xf3, 0x01, 0xf7, 0x5a, 0xa6, 0x96, 0x5b, 0x77, 0xfc, - 0x02, 0x91, 0xad, 0x7a, 0xc2, 0x0f, 0x2e, 0xaf, 0x8e, 0xc5, 0x93, 0x13, - 0x2d, 0x0b, 0x63, 0xd1, 0xff, 0x3b, 0x11, 0xa4, 0xfc, 0xb3, 0x4e, 0x46, - 0x73, 0x28, 0x67, 0x81, 0x37, 0x90, 0xa9, 0x39, 0x83, 0x34, 0xab, 0x89, - 0x05, 0x15, 0xe4, 0x11, 0x96, 0x0f, 0x1c, 0xa6, 0xb9, 0x1e, 0x33, 0x7c, - 0x21, 0xbe, 0x50, 0x9b, 0xc4, 0xe4, 0x22, 0xb5, 0x59, 0x2e, 0xec, 0xa1, - 0x8d, 0x4b, 0x89, 0x84, 0xec, 0xf5, 0xef, 0x0c, 0xd1, 0xb8, 0x46, 0x62, - 0x15, 0x54, 0xc7, 0x64, 0xcf, 0x33, 0x41, 0x75, 0x5d, 0x7e, 0x9c, 0xdb, - 0xaa, 0xd5, 0x00, 0xf9, 0x7a, 0x5d, 0x6f, 0xed, 0xac, 0xdb, 0x51, 0x57, - 0x17, 0x94, 0xb9, 0x13, 0x39, 0x1d, 0xd2, 0xcf, 0x85, 0x5e, 0xee, 0x06, - 0x76, 0xa6, 0xf6, 0xbe, 0xfd, 0xe3, 0x1c, 0x6d, 0x40, 0x76, 0xb5, 0xf5, - 0x6e, 0xfb, 0xc2, 0x1c, 0xbc, 0x3f, 0xee, 0xb5, 0xf5, 0x7b, 0x66, 0xea, - 0x23, 0x57, 0xab, 0xb1, 0x33, 0x48, 0x51, 0xb3, 0x37, 0xf5, 0x47, 0x2d, - 0x79, 0xa2, 0xcc, 0xd3, 0x01, 0x7c, 0x43, 0xe1, 0xe1, 0x62, 0x38, 0x8b, - 0xfe, 0x31, 0x22, 0xb8, 0x21, 0x58, 0x9e, 0x31, 0xbd, 0xb9, 0xf0, 0x33, - 0x62, 0x61, 0xf0, 0x6b, 0x3e, 0x15, 0x02, 0x67, 0x36, 0x83, 0xc4, 0xb6, - 0xd0, 0xd5, 0x90, 0xd2, 0xcb, 0x56, 0x47, 0xd9, 0x0b, 0x07, 0x29, 0xd7, - 0x70, 0x6f, 0x97, 0xfa, 0x89, 0xdf, 0xef, 0x0a, 0xc6, 0x20, 0x07, 0xa0, - 0xb1, 0x22, 0x1f, 0x24, 0x22, 0x01, 0x9f, 0x44, 0x8a, 0x0d, 0x52, 0x84, - 0xad, 0x7f, 0x26, 0x57, 0xb2, 0xd8, 0xb9, 0x5c, 0x16, 0x92, 0x00, 0x40, - 0x18, 0xa1, 0x4c, 0xaa, 0x2b, 0xca, 0xcc, 0x94, 0x64, 0x57, 0x9c, 0xc8, - 0x43, 0x80, 0x41, 0xfb, 0x31, 0xd0, 0x2a, 0xd2, 0xe8, 0x28, 0x05, 0x53, - 0xfe, 0x97, 0x6e, 0x95, 0x04, 0xa8, 0xf1, 0xa6, 0x24, 0x3d, 0x92, 0xa0, - 0xd7, 0x3a, 0x03, 0x63, 0x42, 0xa0, 0x28, 0x5f, 0xc3, 0xd5, 0x1e, 0x27, - 0x51, 0xc0, 0xd6, 0x49, 0x9c, 0x45, 0xf0, 0x5c, 0xc1, 0x34, 0xd2, 0x35, - 0x70, 0x6e, 0xbc, 0x93, 0x3d, 0x25, 0x21, 0x55, 0xb4, 0x03, 0x99, 0xbd, - 0xa4, 0x39, 0x6a, 0xea, 0x14, 0x5f, 0x24, 0x9c, 0x2d, 0x25, 0x63, 0xe5, - 0x33, 0x42, 0x47, 0xc5, 0xe5, 0x30, 0xb0, 0xf2, 0x8d, 0x70, 0xbe, 0xaa, - 0x39, 0x34, 0x41, 0x36, 0x26, 0x0b, 0xb8, 0x16, 0xaf, 0x89, 0x1a, 0x00, - 0x06, 0x98, 0xfe, 0xff, 0xfa, 0x31, 0xf8, 0x25, 0x69, 0xf1, 0x9f, 0x00, - 0x06, 0x12, 0x45, 0x9b, 0x5c, 0x73, 0x2f, 0x88, 0xce, 0xa3, 0x51, 0xf8, - 0xa5, 0x6f, 0x9b, 0x7c, 0xd2, 0xd0, 0xb8, 0xa3, 0x70, 0x0f, 0xc2, 0x34, - 0x34, 0x92, 0x3b, 0x6f, 0xdb, 0x41, 0x3d, 0x84, 0xda, 0x81, 0xdf, 0x78, - 0x99, 0x57, 0x35, 0x71, 0x0b, 0x44, 0xee, 0x2e, 0xc3, 0xcd, 0x94, 0x0b, - 0x2c, 0x63, 0xec, 0x13, 0x4d, 0x4a, 0xd1, 0xbb, 0x12, 0x50, 0x79, 0x1a, - 0x2d, 0x03, 0x01, 0x22, 0x54, 0xed, 0xb0, 0x69, 0xb6, 0x78, 0x3a, 0x3d, - 0x5f, 0xa1, 0x89, 0xe6, 0x09, 0x97, 0x57, 0x12, 0xf4, 0x68, 0xf6, 0x21, - 0xa5, 0x92, 0xfb, 0x56, 0x84, 0x1e, 0xcd, 0x23, 0xb5, 0x1a, 0xd1, 0x84, - 0x87, 0x72, 0x04, 0x51, 0x6f, 0x05, 0x9d, 0x52, 0x0c, 0xaf, 0x6b, 0xd2, - 0x7e, 0x08, 0x24, 0x15, 0x70, 0x7d, 0x09, 0x42, 0xf8, 0x79, 0x94, 0xd2, - 0x98, 0x08, 0xbc, 0x2f, 0x52, 0x62, 0x4c, 0x65, 0x19, 0xde, 0x2c, 0x4b, - 0x89, 0x91, 0xfe, 0xe4, 0x58, 0xc6, 0x8d, 0x69, 0x52, 0xba, 0xac, 0x40, - 0x22, 0xa9, 0xb9, 0xce, 0x7d, 0xd8, 0x34, 0x39, 0x64, 0xb8, 0x75, 0x2f, - 0x20, 0xc7, 0x98, 0x79, 0xbf, 0x28, 0x9f, 0xc7, 0x2c, 0xee, 0x98, 0xdb, - 0x2e, 0xc5, 0x4e, 0x66, 0x55, 0x1a, 0xe5, 0x25, 0x4d, 0x98, 0x0d, 0xfd, - 0xb5, 0x1b, 0x05, 0xc6, 0x0c, 0x66, 0x3b, 0x30, 0x30, 0xde, 0x1a, 0x7e, - 0x5b, 0x46, 0x8a, 0xcc, 0x6f, 0x40, 0xc6, 0x3f, 0x8a, 0xe8, 0x3b, 0x40, - 0x17, 0xbf, 0xe6, 0xaf, 0xae, 0xc7, 0x32, 0x68, 0x58, 0x3c, 0x81, 0x93, - 0xef, 0x21, 0x6b, 0x16, 0x47, 0xb9, 0x37, 0x04, 0xd9, 0x2b, 0xbf, 0x3e, - 0x50, 0x02, 0xca, 0x60, 0x6f, 0x58, 0xf3, 0xfa, 0xa4, 0x8a, 0x9b, 0xce, - 0x3c, 0x4b, 0x48, 0xd0, 0x52, 0x4b, 0x98, 0x5c, 0xd3, 0x35, 0xbc, 0xb6, - 0x65, 0xc1, 0x4f, 0x60, 0x09, 0x90, 0x71, 0xe2, 0x8e, 0x01, 0x19, 0x35, - 0xee, 0xef, 0x30, 0x70, 0x2c, 0xb4, 0x09, 0x03, 0x2b, 0x90, 0x41, 0x60, - 0x68, 0x20, 0x58, 0x1f, 0x18, 0x0c, 0x98, 0x17, 0x0c, 0x7b, 0x5d, 0x3f, - 0xb9, 0x88, 0x97, 0x8c, 0xb7, 0xea, 0xb2, 0x76, 0xc7, 0x27, 0xfc, 0x61, - 0xe1, 0x02, 0xb4, 0x31, 0xd8, 0xad, 0x74, 0xb5, 0x57, 0x94, 0xc6, 0xa3, - 0xbd, 0x6b, 0x2f, 0x84, 0x9a, 0x96, 0xc7, 0x3b, 0x59, 0x16, 0x97, 0x11, - 0x1f, 0x47, 0x04, 0xc5, 0x89, 0x94, 0xea, 0xd0, 0x96, 0x42, 0x03, 0xbb, - 0xd4, 0x99, 0x51, 0x0e, 0xd5, 0xc9, 0xbd, 0x7c, 0x83, 0x3a, 0xe1, 0x64, - 0xa0, 0x4a, 0xb8, 0x45, 0xcf, 0xae, 0x79, 0xb5, 0x1f, 0xee, 0x9a, 0xb6, - 0xc4, 0x27, 0x97, 0x4c, 0x62, 0x5d, 0xa9, 0xf9, 0x54, 0xac, 0x9f, 0xcf, - 0x05, 0x92, 0x7a, 0x3a, 0xee, 0xe7, 0xbf, 0x80, 0x05, 0x8b, 0xd7, 0xb9, - 0x39, 0xa7, 0x5b, 0xb8, 0xb5, 0x4d, 0xc2, 0x09, 0xa9, 0x88, 0x7c, 0x64, - 0x2a, 0x9a, 0xd8, 0x1c, 0xf3, 0x66, 0x1c, 0x2c, 0xdb, 0x77, 0x91, 0xd5, - 0xdd, 0x46, 0xca, 0x8d, 0x88, 0xe7, 0x49, 0x8c, 0x97, 0x19, 0x85, 0x60, - 0x59, 0xe0, 0x96, 0x0c, 0x5b, 0x18, 0x68, 0x78, 0x2c, 0x3c, 0x60, 0x7a, - 0x35, 0x16, 0x20, 0xb2, 0xfb, 0xe9, 0x2b, 0x5b, 0x6d, 0x3a, 0xc4, 0x8d, - 0xcf, 0x52, 0x7e, 0xe9, 0x7e, 0x8a, 0xcb, 0x3c, 0x97, 0xf8, 0x03, 0x1c, - 0xb7, 0x5e, 0xec, 0x41, 0x7e, 0x2c, 0x06, 0x07, 0x82, 0x6b, 0xb7, 0xb3, - 0xf2, 0x25, 0x60, 0xc0, 0x16, 0x7e, 0x76, 0xf5, 0x98, 0x56, 0x26, 0x12, - 0xcb, 0xec, 0x58, 0xad, 0xa3, 0x9c, 0xef, 0x2b, 0xbe, 0x9c, 0x7e, 0xa7, - 0x88, 0x16, 0xbf, 0xe7, 0x0b, 0x55, 0xb8, 0x75, 0x48, 0xf1, 0x64, 0x03, - 0x19, 0x98, 0xf4, 0x23, 0x09, 0x28, 0x05, 0x90, 0x0e, 0x27, 0x38, 0xa1, - 0x85, 0x66, 0x52, 0xdf, 0xa7, 0xc4, 0x0b, 0xb5, 0x59, 0x12, 0x54, 0xa2, - 0xe1, 0xa1, 0xc7, 0xa3, 0x7c, 0xc5, 0x76, 0xdd, 0xfe, 0x89, 0x41, 0x7d, - 0xbe, 0x1d, 0xbe, 0x56, 0x3e, 0x09, 0x45, 0x5c, 0x57, 0xa2, 0x18, 0x56, - 0xae, 0xfd, 0xfc, 0xff, 0xa4, 0xcc, 0x4b, 0xeb, 0x87, 0x1d, 0xad, 0x4f, - 0x6c, 0xa6, 0x53, 0x09, 0xce, 0xb8, 0x59, 0x4e, 0xf4, 0xf2, 0xf0, 0x74, - 0x5b, 0x09, 0xa0, 0xdb, 0x83, 0xec, 0x24, 0x9e, 0xf7, 0xf7, 0x28, 0x0e, - 0xb7, 0x7c, 0xf4, 0x71, 0xc2, 0x44, 0xe9, 0x95, 0x4a, 0x4e, 0xd3, 0x13, - 0xba, 0x38, 0x89, 0xab, 0x36, 0x36, 0x3a, 0xb0, 0x30, 0xcf, 0xbb, 0xbe, - 0x47, 0xee, 0xe8, 0xde, 0x86, 0x23, 0xf8, 0x8d, 0x9b, 0x82, 0xba, 0x81, - 0x17, 0x6f, 0x80, 0xd7, 0x92, 0x47, 0xb2, 0x61, 0xd2, 0x68, 0xd1, 0xac, - 0xc8, 0xe7, 0x6b, 0xb9, 0xb0, 0x92, 0xba, 0x9f, 0x02, 0x21, 0x24, 0x27, - 0xbc, 0xc8, 0x0b, 0x2d, 0x9c, 0x8f, 0x9d, 0x6f, 0x22, 0x52, 0xf2, 0x9b, - 0x82, 0x35, 0x4b, 0xbb, 0x36, 0x52, 0xfc, 0x48, 0xf9, 0xf7, 0xa4, 0x27, - 0x1d, 0x38, 0xba, 0x2a, 0x8a, 0x6c, 0xb1, 0x98, 0xac, 0xdb, 0x89, 0xeb, - 0x46, 0x16, 0x92, 0xdc, 0x6d, 0x40, 0x4c, 0x2f, 0x39, 0x5d, 0xe7, 0x7d, - 0x7b, 0x6b, 0xb9, 0xef, 0xde, 0x24, 0xb2, 0x9e, 0x24, 0xfe, 0xe4, 0xac, - 0x4a, 0x12, 0xe3, 0x8d, 0x6a, 0x91, 0x20, 0x32, 0xae, 0x06, 0xcc, 0x84, - 0xb6, 0xb0, 0x93, 0x9f, 0xd3, 0xea, 0x1f, 0x82, 0x67, 0xb6, 0x37, 0xbd, - 0xe8, 0xd0, 0x7f, 0x99, 0x3f, 0x41, 0x13, 0x87, 0x00, 0x1f, 0xf3, 0x89, - 0x20, 0x07, 0x5e, 0xb0, 0xc5, 0x69, 0x29, 0x54, 0x42, 0x85, 0xf5, 0x72, - 0x0c, 0xa6, 0xa3, 0xfb, 0x15, 0x7b, 0xfd, 0x40, 0xc7, 0xcd, 0xcd, 0xb9, - 0xf0, 0x65, 0xfb, 0x9c, 0x0c, 0xf3, 0xf2, 0xe2, 0xc1, 0x4e, 0x69, 0xb0, - 0xaf, 0x5f, 0xfe, 0x57, 0x5c, 0xc1, 0xe3, 0xa6, 0x10, 0x76, 0x4e, 0x6e, - 0x9a, 0x5a, 0x51, 0x1f, 0x0f, 0x67, 0x75, 0x9f, 0x24, 0x1b, 0x4b, 0x95, - 0x12, 0xc3, 0xca, 0xbe, 0x7f, 0x8b, 0x97, 0x9a, 0x46, 0x9f, 0x72, 0x74, - 0x5b, 0xf8, 0x77, 0x87, 0xee, 0xfd, 0x1a, 0xbd, 0x13, 0x45, 0xd0, 0xd3, - 0x8a, 0x62, 0x25, 0x93, 0xc5, 0x22, 0x54, 0xe9, 0xce, 0xa1, 0xa4, 0xb0, - 0x85, 0x35, 0xc3, 0xf7, 0x1f, 0x4f, 0xf5, 0xf8, 0x50, 0xab, 0x23, 0xd1, - 0x04, 0x4f, 0x78, 0x1e, 0x7d, 0xc9, 0x25, 0xec, 0xeb, 0x4b, 0x7d, 0xc9, - 0xb8, 0xf4, 0x45, 0x70, 0x2d, 0xa9, 0xe1, 0x24, 0x93, 0xc4, 0x4f, 0xdd, - 0x60, 0xd8, 0x48, 0x65, 0x9c, 0xfb, 0x71, 0x5d, 0xab, 0xce, 0x8b, 0x76, - 0xe6, 0x7f, 0xb0, 0xb9, 0xa3, 0x40, 0x6c, 0x3e, 0xde, 0x6c, 0x0e, 0x7a, - 0x72, 0xc5, 0xfe, 0x49, 0x55, 0x61, 0x4a, 0x09, 0xe6, 0xcc, 0x38, 0x8e, - 0xfc, 0x40, 0x65, 0x4d, 0x4c, 0xa9, 0x01, 0x41, 0x64, 0x64, 0x0a, 0x63, - 0xee, 0x8b, 0x3c, 0x33, 0xc8, 0xc2, 0x87, 0x73, 0x7f, 0x04, 0xc7, 0xa1, - 0x14, 0x3a, 0x57, 0xf7, 0x09, 0x8d, 0x72, 0xba, 0x7d, 0xdf, 0xb5, 0xd6, - 0x27, 0x9a, 0x1c, 0xab, 0x4d, 0xa2, 0x18, 0xce, 0x52, 0x04, 0xd2, 0xad, - 0x04, 0x45, 0xe2, 0xbb, 0x5f, 0x4b, 0x6e, 0x29, 0x80, 0xf3, 0x25, 0x14, - 0x15, 0xb0, 0x94, 0x12, 0x42, 0xe9, 0xc2, 0xbb, 0x52, 0xec, 0xca, 0x3a, - 0x75, 0xcd, 0xa3, 0x4c, 0x50, 0x21, 0x9e, 0x5a, 0x86, 0xa5, 0x05, 0xda, - 0xdc, 0x00, 0x70, 0xe5, 0xdc, 0x24, 0x48, 0x9c, 0x5c, 0x3b, 0x6e, 0xed, - 0xa2, 0xcb, 0x3d, 0x74, 0x16, 0x37, 0x53, 0x20, 0xfd, 0xee, 0xab, 0x31, - 0x22, 0x8b, 0xda, 0xb7, 0xc0, 0x80, 0x83, 0x5f, 0xa9, 0x70, 0x8c, 0xc2, - 0x59, 0x02, 0x0b, 0xd7, 0xe1, 0x19, 0x53, 0xfb, 0x2b, 0xce, 0x08, 0xf9, - 0x24, 0x35, 0x8e, 0xd8, 0x51, 0xa2, 0x8b, 0x76, 0x92, 0xf3, 0x37, 0x3f, - 0x10, 0x27, 0x85, 0xfc, 0xb9, 0x7d, 0x79, 0xaa, 0xec, 0x94, 0xab, 0x6b, - 0x63, 0x53, 0x50, 0x30, 0x81, 0xcf, 0x7a, 0x07, 0x86, 0x3d, 0x48, 0xcb, - 0x70, 0xdb, 0xf2, 0xf5, 0x86, 0xd4, 0xfd, 0x44, 0x8a, 0x13, 0xb7, 0x99, - 0x18, 0xb7, 0xd2, 0x43, 0xed, 0xa7, 0x30, 0xa4, 0x5e, 0x6a, 0x10, 0xf4, - 0xb4, 0x69, 0x0c, 0x07, 0x78, 0x31, 0x8b, 0xf8, 0x0a, 0xbb, 0xfe, 0x7e, - 0x0c, 0x9c, 0x90, 0x58, 0x08, 0x00, 0x00, 0x3c, 0xf7, 0x30, 0x39, 0x32, - 0x65, 0x6c, 0xda, 0x8b, 0x64, 0x32, 0x8a, 0xec, 0xd8, 0x5c, 0xc1, 0x24, - 0x15, 0x2c, 0x7b, 0x6a, 0x64, 0x64, 0xb8, 0xaa, 0x7d, 0xcd, 0xf6, 0x4a, - 0x38, 0x1a, 0xbb, 0x95, 0x25, 0xe1, 0x82, 0x84, 0xf2, 0xc5, 0xc7, 0xad, - 0x5a, 0xb8, 0xea, 0x70, 0xd2, 0x77, 0xfc, 0x60, 0x4d, 0x39, 0x02, 0xba, - 0x45, 0xdc, 0x4a, 0xb7, 0xb4, 0xb3, 0xd0, 0x98, 0xcf, 0xcf, 0x1f, 0xa6, - 0xb5, 0x60, 0xd5, 0x7c, 0xe0, 0x62, 0xe4, 0xd2, 0x10, 0xe2, 0x1e, 0xc0, - 0x5f, 0x16, 0x30, 0xb2, 0x1c, 0x1c, 0x75, 0x22, 0x1d, 0x37, 0x37, 0x4b, - 0x2f, 0x4d, 0x2a, 0xda, 0x25, 0xc4, 0x6d, 0x85, 0xa5, 0x0c, 0x40, 0x8d, - 0x14, 0x8e, 0x6d, 0x3b, 0xf3, 0xeb, 0x79, 0x29, 0x52, 0x0f, 0x12, 0xcc, - 0x9e, 0xe9, 0xa9, 0x16, 0xaf, 0xcf, 0x54, 0x53, 0x9c, 0x21, 0x57, 0x29, - 0x84, 0x71, 0xec, 0x26, 0x2c, 0x4f, 0x50, 0xc9, 0xc5, 0x43, 0x95, 0xf6, - 0x99, 0x72, 0xba, 0x57, 0x3e, 0x54, 0x72, 0xda, 0x65, 0x49, 0xa1, 0x57, - 0x9d, 0xcb, 0x9d, 0x70, 0xb0, 0x41, 0x8e, 0xae, 0xb4, 0x28, 0x58, 0xa7, - 0xc9, 0xd1, 0xef, 0xb6, 0xf9, 0x76, 0xff, 0x03, 0x46, 0xa4, 0xdf, 0xf3, - 0x71, 0x8e, 0x24, 0xa4, 0x8b, 0xb0, 0xbc, 0x19, 0x2f, 0x75, 0xbb, 0x79, - 0x3e, 0xd1, 0x7f, 0x98, 0x0e, 0xf5, 0x44, 0xff, 0x39, 0x6e, 0x86, 0xb1, - 0x44, 0x4c, 0x28, 0x5e, 0x01, 0xcf, 0x38, 0x0b, 0x37, 0x38, 0xdc, 0x0e, - 0xd5, 0x27, 0x2e, 0x5c, 0xd6, 0x3e, 0x0a, 0x25, 0xc7, 0x4d, 0x32, 0xed, - 0x85, 0x73, 0xbf, 0x21, 0x89, 0x55, 0x5d, 0x6a, 0x96, 0xb3, 0xfa, 0x91, - 0x42, 0x38, 0x12, 0x80, 0x33, 0xcf, 0xa3, 0x18, 0xec, 0x3c, 0x77, 0x05, - 0xa4, 0x4f, 0x48, 0x25, 0xff, 0x13, 0x87, 0xfb, 0x96, 0xe4, 0x42, 0x25, - 0x76, 0xe6, 0x9e, 0xa1, 0xed, 0x0e, 0x02, 0x89, 0x07, 0x25, 0x2a, 0x02, - 0xd0, 0xa3, 0xf1, 0xdd, 0xe3, 0xce, 0x5d, 0x1e, 0xd3, 0xd2, 0x3a, 0x46, - 0xc5, 0x0a, 0x34, 0x5f, 0x66, 0x36, 0x9e, 0xe6, 0xf8, 0x94, 0x42, 0xb6, - 0xa4, 0x02, 0xd4, 0x43, 0xdf, 0xb9, 0x3d, 0x39, 0x31, 0x74, 0x4d, 0x6e, - 0xd1, 0x8c, 0x4b, 0x67, 0x37, 0xfd, 0xcb, 0x57, 0x6c, 0x5f, 0xb6, 0x57, - 0x91, 0x13, 0x0a, 0x9e, 0xd2, 0x0b, 0x5e, 0xe9, 0x44, 0x02, 0xd2, 0x1e, - 0xe5, 0xcb, 0x0a, 0x29, 0x49, 0x81, 0x35, 0x0d, 0x39, 0xff, 0x41, 0x4b, - 0x2a, 0x54, 0xed, 0xcd, 0xee, 0xa0, 0x3e, 0xd3, 0xd1, 0x37, 0x12, 0xd2, - 0x3b, 0xde, 0xd2, 0x95, 0xda, 0xbd, 0x52, 0x65, 0x47, 0x62, 0xb7, 0x02, - 0x9d, 0x33, 0xbf, 0xba, 0xe8, 0x84, 0xf9, 0xb4, 0x10, 0x84, 0xc9, 0xbe, - 0xaf, 0x55, 0xa3, 0x8c, 0x84, 0xe9, 0x27, 0x67, 0xe9, 0xed, 0xca, 0xcc, - 0x4e, 0x3d, 0x72, 0x28, 0xaa, 0x63, 0x4c, 0x02, 0x2b, 0x76, 0xa1, 0xaa, - 0xb3, 0x95, 0x44, 0xcc, 0x8a, 0x64, 0xaf, 0xe8, 0xac, 0xde, 0x67, 0xfc, - 0x11, 0xd6, 0xfc, 0x89, 0x38, 0xef, 0x5a, 0xa5, 0xf3, 0x48, 0xcd, 0x3c, - 0x5d, 0x4d, 0xe8, 0x96, 0x1f, 0xfd, 0x53, 0x96, 0x1b, 0xe9, 0xa9, 0xbf, - 0x08, 0x64, 0xe2, 0x10, 0x58, 0x3d, 0xda, 0xbb, 0x6d, 0xb0, 0xe7, 0x5a, - 0xf5, 0xf5, 0xf8, 0xdb, 0x16, 0xd1, 0x8f, 0x4e, 0xe3, 0xac, 0x23, 0x33, - 0xd7, 0xa5, 0x14, 0x7e, 0x3d, 0x19, 0x48, 0x6f, 0x43, 0x2a, 0x58, 0x0b, - 0x00, 0x11, 0x0f, 0x48, 0x5e, 0xb5, 0x72, 0x23, 0xbf, 0xe1, 0xe6, 0x50, - 0xaf, 0x17, 0xd5, 0x58, 0x1e, 0x4a, 0x84, 0x9a, 0x92, 0x7a, 0x11, 0x04, - 0xfe, 0x9f, 0xf2, 0x32, 0x2f, 0xb2, 0xec, 0x25, 0x29, 0xb0, 0x61, 0x30, - 0x84, 0x15, 0x29, 0xeb, 0x4f, 0x7f, 0xcd, 0xac, 0x83, 0xa6, 0xd4, 0x6e, - 0x38, 0x56, 0x62, 0x93, 0x83, 0x60, 0x50, 0x76, 0x9c, 0x35, 0xe5, 0x2d, - 0x7d, 0xdb, 0x5d, 0x35, 0x22, 0x27, 0xdf, 0x89, 0x65, 0xee, 0xac, 0x42, - 0xc8, 0xe5, 0x8b, 0x62, 0xeb, 0xce, 0x1b, 0x8d, 0xe0, 0x06, 0xb2, 0x98, - 0x3c, 0x75, 0x01, 0x91, 0x07, 0xdf, 0x51, 0x1d, 0x95, 0xec, 0x0b, 0xc2, - 0xf9, 0x6a, 0xfb, 0x99, 0xbd, 0xbc, 0x8d, 0xff, 0x0a, 0x3b, 0x25, 0xb4, - 0x37, 0xdd, 0x9c, 0x19, 0x04, 0xce, 0x1a, 0x25, 0xd1, 0x2e, 0xd6, 0x2a, - 0x16, 0xae, 0xf9, 0x04, 0x48, 0x74, 0x27, 0x9d, 0x70, 0x17, 0x29, 0xc1, - 0x1c, 0x2e, 0x0f, 0x09, 0x81, 0xe0, 0xbc, 0x3b, 0xcb, 0x50, 0xbc, 0x06, - 0xad, 0x62, 0x05, 0x1b, 0x1a, 0xe1, 0xe7, 0x99, 0x0f, 0xf3, 0x7a, 0x16, - 0xeb, 0xdd, 0x16, 0xe7, 0x28, 0x29, 0x80, 0xf5, 0xeb, 0xe7, 0xea, 0x1e, - 0x20, 0x5c, 0x6a, 0x9a, 0x48, 0x16, 0x8a, 0xf6, 0x21, 0x8e, 0x3d, 0x1b, - 0xdc, 0xe9, 0xc8, 0x32, 0xa5, 0x17, 0xcd, 0x40, 0x1a, 0x74, 0xdb, 0x08, - 0x85, 0x88, 0xd3, 0x4a, 0x67, 0x16, 0xb8, 0xc1, 0x40, 0xdc, 0xed, 0x91, - 0x8d, 0x21, 0x7b, 0x11, 0x61, 0xf3, 0xa8, 0x79, 0x06, 0x9f, 0xd4, 0xa4, - 0x45, 0x7b, 0xb2, 0xd9, 0x23, 0xbe, 0x6f, 0xb7, 0x29, 0xc6, 0x44, 0xc7, - 0x2c, 0x31, 0x33, 0x92, 0x70, 0xfa, 0xfd, 0x78, 0x28, 0x1c, 0x9e, 0x9d, - 0x5a, 0x32, 0x58, 0x6d, 0x7f, 0x6f, 0xa6, 0x7f, 0x55, 0xa8, 0x35, 0x80, - 0x6e, 0x07, 0xbe, 0xc3, 0xa7, 0x3f, 0x75, 0x0e, 0xdf, 0xeb, 0x3f, 0xc5, - 0x06, 0x66, 0xe3, 0x7c, 0x5a, 0x37, 0x64, 0x8b, 0x14, 0xe6, 0xf2, 0x80, - 0xbb, 0x85, 0xc1, 0x21, 0xa3, 0xed, 0xf7, 0x59, 0x55, 0x63, 0x6f, 0x32, - 0xc6, 0xd3, 0x3f, 0x87, 0x88, 0x69, 0x65, 0x22, 0xe2, 0x0d, 0xf6, 0x8c, - 0x01, 0xfb, 0xe3, 0x5d, 0x42, 0x57, 0xbc, 0x98, 0xdf, 0xe1, 0x15, 0x9e, - 0xc8, 0x44, 0xd6, 0xd7, 0x0b, 0xe8, 0xaa, 0x76, 0x1e, 0xa3, 0xd5, 0xe8, - 0x8e, 0x92, 0x72, 0xfd, 0x97, 0x43, 0xe4, 0x39, 0x8f, 0x08, 0x6e, 0x95, - 0x81, 0xa4, 0x43, 0x1f, 0x4e, 0xdd, 0xfa, 0x6f, 0x40, 0xc5, 0x06, 0x08, - 0x4a, 0x9f, 0xbb, 0x13, 0x23, 0x35, 0x1c, 0x46, 0x4f, 0x5e, 0x83, 0x5c, - 0xfc, 0xec, 0x70, 0xe9, 0x7a, 0xdd, 0x48, 0x48, 0x6e, 0x09, 0x52, 0x95, - 0xab, 0x2a, 0x74, 0x25, 0x41, 0x93, 0x21, 0xe7, 0xcf, 0x30, 0x22, 0x90, - 0x2a, 0xf7, 0xa4, 0x94, 0x2c, 0x0b, 0x1d, 0x4d, 0xbb, 0xf1, 0xd3, 0xb9, - 0x14, 0xba, 0x0b, 0x3a, 0x7f, 0x85, 0x9f, 0x5c, 0x7b, 0xb4, 0xa3, 0xc0, - 0xa8, 0xec, 0x5a, 0x11, 0x2a, 0x14, 0x05, 0xa5, 0x34, 0x85, 0xdb, 0xe8, - 0x45, 0x9d, 0x34, 0xd1, 0x81, 0x30, 0xb1, 0x84, 0x84, 0xcc, 0xf6, 0x3b, - 0xc5, 0xb9, 0x4e, 0x3f, 0x11, 0x62, 0x39, 0xed, 0x64, 0x60, 0xf6, 0x65, - 0x41, 0x09, 0x1a, 0xb3, 0xe6, 0x3f, 0xa0, 0xf8, 0xd3, 0xe2, 0xb8, 0x8f, - 0x18, 0x20, 0xa7, 0xaf, 0xaf, 0xf9, 0x67, 0x65, 0xbc, 0xfc, 0xca, 0x32, - 0xc6, 0x38, 0xc4, 0x0a, 0x0e, 0xe2, 0xaf, 0x2c, 0x7c, 0x99, 0x9b, 0xdd, - 0x09, 0x6d, 0xe9, 0xfb, 0xa0, 0x33, 0x4b, 0x9b, 0xb2, 0x23, 0x1f, 0x42, - 0xc1, 0xc2, 0x6f, 0xf3, 0x6b, 0x81, 0xb6, 0x48, 0x1b, 0x45, 0x73, 0x29, - 0xa4, 0x4d, 0x9e, 0xc3, 0xd5, 0x03, 0xfd, 0xb6, 0xf1, 0xb8, 0xfb, 0x2a, - 0x5a, 0x0e, 0xfa, 0x1a, 0xac, 0xeb, 0x73, 0x49, 0x67, 0x74, 0x62, 0x02, - 0x9e, 0x97, 0x39, 0xca, 0x85, 0x55, 0xdc, 0xb7, 0xa8, 0xa0, 0xf9, 0x0b, - 0x76, 0x68, 0xe2, 0x70, 0x6d, 0x5b, 0xc9, 0x70, 0x20, 0xdb, 0x0b, 0x18, - 0xdc, 0xf4, 0x21, 0xc0, 0xeb, 0x45, 0x4d, 0x97, 0x00, 0x35, 0xdf, 0x72, - 0x60, 0x49, 0x6c, 0xbd, 0x6a, 0x78, 0xe3, 0x10, 0x61, 0xa3, 0xcb, 0x11, - 0x35, 0xab, 0x30, 0xca, 0x74, 0x7f, 0xdb, 0xb4, 0x56, 0xe5, 0x54, 0xd7, - 0x30, 0xbb, 0xed, 0x47, 0x4e, 0xae, 0x31, 0x40, 0x72, 0x36, 0xa8, 0x3b, - 0x05, 0xad, 0x86, 0x9f, 0x36, 0xd0, 0xb1, 0x8f, 0x6f, 0xc3, 0x9e, 0xd8, - 0x3c, 0x82, 0xc1, 0xb7, 0x4c, 0x5e, 0xcf, 0xf7, 0xd1, 0x4f, 0xfa, 0xe3, - 0x77, 0xde, 0xd6, 0xe8, 0x42, 0xb8, 0xfe, 0x64, 0xd2, 0xa5, 0x4c, 0x4d, - 0xc8, 0x34, 0x73, 0x3b, 0x8d, 0xa0, 0x48, 0x55, 0xea, 0xf4, 0x6d, 0xba, - 0xd0, 0x01, 0xca, 0xc9, 0x58, 0xdc, 0xfc, 0x1a, 0x0f, 0xd6, 0x1c, 0x70, - 0x8f, 0xf4, 0xcc, 0x27, 0xc8, 0x87, 0xd7, 0x12, 0xfe, 0x4e, 0xff, 0xd1, - 0x4a, 0xb7, 0x36, 0x60, 0x0c, 0x68, 0x4c, 0xd8, 0xfd, 0x04, 0x41, 0xbd, - 0x15, 0x35, 0x6b, 0x96, 0xf3, 0x5e, 0x77, 0x2c, 0xfe, 0xb7, 0x17, 0x8b, - 0x7c, 0xb0, 0xbb, 0x31, 0xcc, 0x21, 0xe8, 0x8c, 0xee, 0xf9, 0x1a, 0x2a, - 0x19, 0xd9, 0xe4, 0x0f, 0xad, 0x68, 0x61, 0x84, 0x5f, 0x71, 0x52, 0x59, - 0xaf, 0x3d, 0x6e, 0x21, 0xb4, 0x24, 0x44, 0x2a, 0x0a, 0x28, 0x2d, 0x07, - 0x68, 0xdb, 0xc9, 0x0b, 0xe7, 0xbd, 0x0f, 0x74, 0x8f, 0x33, 0x3f, 0x32, - 0x4a, 0xe0, 0xde, 0x99, 0x1a, 0x3d, 0x51, 0x98, 0xba, 0xb3, 0x32, 0x4f, - 0x53, 0x24, 0x28, 0x66, 0xed, 0x0a, 0xf1, 0x20, 0x5d, 0x6c, 0xfb, 0x68, - 0x15, 0xa1, 0x7e, 0xde, 0xc6, 0xc0, 0xd1, 0x71, 0xc6, 0x2d, 0x8a, 0x43, - 0x2a, 0xac, 0x97, 0x39, 0xa3, 0xad, 0x00, 0xd7, 0xa4, 0x75, 0xdd, 0x09, - 0x11, 0x24, 0x9b, 0x40, 0x46, 0xeb, 0x8b, 0xe2, 0x75, 0x5b, 0x29, 0xf9, - 0x30, 0xf0, 0x34, 0x7d, 0xed, 0x8f, 0xa9, 0xa4, 0xc5, 0x75, 0x03, 0x2b, - 0x3b, 0x85, 0xb7, 0x8e, 0xa1, 0x97, 0x7c, 0x66, 0xfe, 0x12, 0x2d, 0xd7, - 0x88, 0x50, 0x7e, 0xaa, 0x87, 0x94, 0xfc, 0x0f, 0xb3, 0xf5, 0xea, 0xcc, - 0x4b, 0x28, 0x44, 0xc9, 0x78, 0x85, 0xd6, 0x9c, 0xb9, 0x22, 0xa1, 0x6b, - 0x2f, 0xb4, 0xc1, 0x1b, 0xc4, 0xf7, 0xa2, 0xea, 0xe0, 0xbf, 0x7b, 0xe6, - 0xc4, 0x1c, 0x57, 0x59, 0xb8, 0x0f, 0xb1, 0x9d, 0x57, 0x62, 0x1e, 0x49, - 0x53, 0xbb, 0xe2, 0x1e, 0xcd, 0x9d, 0x62, 0x90, 0x7e, 0x72, 0x7d, 0xe3, - 0xd2, 0xcc, 0xcc, 0xf4, 0xa3, 0x0c, 0x26, 0x4d, 0xef, 0xad, 0x19, 0x99, - 0x41, 0x02, 0xe2, 0x47, 0xf7, 0xe0, 0xa6, 0xf9, 0x00, 0x6d, 0x92, 0x0e, - 0x50, 0x7b, 0xbc, 0x6f, 0x84, 0x65, 0xd5, 0x8b, 0x32, 0xe1, 0x41, 0x8b, - 0x7e, 0x88, 0x41, 0xf5, 0x80, 0x2c, 0xb5, 0xec, 0xb3, 0x2b, 0xf8, 0x34, - 0xf3, 0x54, 0xe3, 0xe4, 0x35, 0xc9, 0x1e, 0xcd, 0x85, 0xf4, 0xc8, 0xd2, - 0x7a, 0x75, 0x4f, 0xe6, 0xf2, 0x93, 0xa3, 0x31, 0xab, 0xbe, 0xa1, 0x02, - 0x72, 0xae, 0xca, 0x49, 0xba, 0x2a, 0xc9, 0xa3, 0x38, 0x81, 0xd6, 0xd0, - 0x82, 0x96, 0x9e, 0x2a, 0x4b, 0xf2, 0xcb, 0xdf, 0x93, 0x41, 0x4a, 0x9d, - 0x2a, 0x6b, 0x6a, 0xfa, 0x8c, 0x19, 0x05, 0x89, 0x28, 0x5b, 0xe2, 0x32, - 0xd2, 0x88, 0x7e, 0x1a, 0xad, 0xbf, 0x74, 0x25, 0xf6, 0x65, 0x44, 0x80, - 0x1c, 0x67, 0xa6, 0xfd, 0x45, 0x1d, 0xe4, 0xd2, 0x38, 0x21, 0x88, 0xc7, - 0x4a, 0x56, 0xfc, 0x60, 0x62, 0x35, 0xfd, 0x0c, 0xcf, 0x74, 0x78, 0xde, - 0x1a, 0x57, 0x5d, 0x92, 0x6a, 0x04, 0x95, 0x8b, 0xf5, 0x2d, 0xb2, 0xee, - 0xff, 0xe0, 0xa1, 0xc6, 0x76, 0x59, 0x76, 0x5a, 0xad, 0x37, 0x29, 0xd5, - 0x2c, 0x99, 0x02, 0x4b, 0x44, 0x11, 0x39, 0x79, 0xb8, 0xcc, 0xbc, 0x2c, - 0xc5, 0x6d, 0x51, 0x5b, 0x3c, 0x09, 0xe6, 0xae, 0xcd, 0x71, 0x65, 0x92, - 0x0e, 0x71, 0xad, 0xd2, 0xbf, 0x33, 0x1d, 0x53, 0x1d, 0xaf, 0xe1, 0xec, - 0x4b, 0x7b, 0x57, 0xe5, 0xa5, 0x80, 0xd9, 0xf3, 0x64, 0xd5, 0xf3, 0xc1, - 0xe4, 0x3e, 0x49, 0xe0, 0x63, 0xaf, 0x3b, 0x28, 0x99, 0x12, 0xc6, 0xb4, - 0x61, 0xa8, 0x5d, 0x3f, 0xdb, 0x0c, 0xb5, 0x81, 0xad, 0x68, 0x47, 0xa3, - 0x72, 0xd6, 0x49, 0x52, 0xe1, 0x40, 0xd9, 0x62, 0x83, 0x51, 0x2d, 0x1b, - 0x80, 0xd2, 0x6e, 0x79, 0xef, 0x3e, 0x4a, 0xe7, 0xaf, 0xa6, 0xe4, 0xa1, - 0x8c, 0x92, 0x18, 0x70, 0x0c, 0x8d, 0xdc, 0xb3, 0xa2, 0x20, 0x91, 0x52, - 0x95, 0x3b, 0x45, 0xba, 0xec, 0x67, 0x5b, 0x5b, 0x71, 0xb0, 0xb2, 0x7f, - 0x99, 0x52, 0xb4, 0xaa, 0xbe, 0xa3, 0x9f, 0xf2, 0x83, 0xb2, 0xcb, 0x4e, - 0x9b, 0xdc, 0x5c, 0xb7, 0x90, 0x78, 0x08, 0x7e, 0x87, 0xc2, 0xdf, 0x5c, - 0xa2, 0xd2, 0x2a, 0x0a, 0xbb, 0xdd, 0x25, 0x55, 0xfd, 0xc4, 0x34, 0xb1, - 0x2f, 0x82, 0xeb, 0xdb, 0xbf, 0xca, 0x6f, 0x66, 0x11, 0x58, 0xb1, 0xb5, - 0x76, 0x3c, 0xdb, 0x50, 0xc7, 0xe2, 0x4e, 0xef, 0x27, 0xdc, 0xe1, 0xf1, - 0x0f, 0x4e, 0xf0, 0x69, 0xaf, 0xaa, 0x49, 0x33, 0xe8, 0x75, 0x18, 0xe3, - 0xad, 0x94, 0xf4, 0xd6, 0x77, 0x7e, 0xea, 0x0f, 0x87, 0x00, 0x0e, 0xb9, - 0x21, 0x3e, 0xaa, 0xc8, 0x40, 0x98, 0x56, 0xee, 0x47, 0x43, 0xc9, 0x5b, - 0x54, 0x39, 0xac, 0x7c, 0x1f, 0xe7, 0x11, 0x86, 0xde, 0x4b, 0x7b, 0x88, - 0xac, 0x8f, 0xc8, 0x24, 0x88, 0xfc, 0xf3, 0x1d, 0x44, 0x2f, 0x46, 0xcf, - 0x8b, 0xee, 0xcd, 0xa9, 0x68, 0xd2, 0x41, 0xbc, 0x11, 0x86, 0x05, 0xa4, - 0xcc, 0x5b, 0xc1, 0xf8, 0x49, 0x15, 0x7a, 0xe3, 0x96, 0xd5, 0xa1, 0x4b, - 0xfd, 0xf3, 0x17, 0xb0, 0xe7, 0xc4, 0x3c, 0xc9, 0x85, 0x7d, 0xeb, 0xce, - 0x02, 0x80, 0x5d, 0xc6, 0x85, 0x9b, 0x52, 0x91, 0x04, 0x72, 0x6c, 0x69, - 0x2f, 0x2a, 0x10, 0x5c, 0xcb, 0x58, 0xc7, 0x4c, 0xb1, 0x66, 0xbd, 0xd9, - 0x3f, 0x1f, 0xba, 0x61, 0x70, 0xc8, 0x98, 0xad, 0x75, 0x44, 0x2b, 0x6b, - 0x98, 0x29, 0x9f, 0x57, 0x40, 0x9b, 0x4d, 0xe4, 0x4a, 0x8e, 0x96, 0xf1, - 0x7a, 0x20, 0xcc, 0x17, 0x42, 0x45, 0x8c, 0xa4, 0x19, 0xcb, 0x9b, 0xbc, - 0x95, 0x3e, 0x5e, 0xab, 0xf6, 0x72, 0xa8, 0xe9, 0xf5, 0xaf, 0x64, 0x59, - 0x4e, 0xc9, 0x37, 0xf8, 0x10, 0x79, 0x54, 0xaa, 0x84, 0xd7, 0x34, 0xb9, - 0x72, 0x04, 0x76, 0x18, 0x21, 0x69, 0x8d, 0xab, 0x2f, 0xe4, 0x0b, 0xba, - 0x6c, 0x7d, 0x36, 0xb7, 0x93, 0x0c, 0x26, 0x1c, 0x55, 0x3c, 0x8f, 0x9e, - 0xab, 0x8e, 0x29, 0xd0, 0xf7, 0xd8, 0xb7, 0x32, 0xc1, 0xa7, 0x7f, 0x75, - 0xd6, 0xbc, 0x25, 0xa9, 0x0e, 0xad, 0xa7, 0x85, 0x18, 0x5f, 0xfe, 0x1c, - 0x7b, 0x00, 0xcc, 0xa6, 0x0a, 0xa8, 0xcb, 0x0f, 0x97, 0x0e, 0xcb, 0xbb, - 0x43, 0xca, 0x6f, 0x81, 0xbf, 0xff, 0xf8, 0x48, 0xf7, 0x6b, 0x36, 0xa9, - 0xf6, 0x89, 0x56, 0x1a, 0x42, 0x1a, 0x71, 0xcd, 0x09, 0x85, 0x2f, 0x98, - 0x45, 0x08, 0x5c, 0x21, 0x47, 0x56, 0x42, 0x37, 0x29, 0x87, 0x21, 0x98, - 0xa3, 0xa7, 0x89, 0x1a, 0x13, 0xe4, 0xb5, 0x14, 0xb1, 0x79, 0x83, 0x55, - 0x07, 0xac, 0x3c, 0xed, 0xbc, 0xd7, 0xf0, 0x41, 0xf7, 0x89, 0x46, 0x10, - 0xa3, 0xfa, 0x90, 0x62, 0xe4, 0x67, 0xed, 0x1b, 0xef, 0x7a, 0xe2, 0xc1, - 0x62, 0x23, 0xd8, 0xf7, 0xd2, 0xee, 0x23, 0x20, 0x9d, 0x29, 0x83, 0x70, - 0x87, 0x8d, 0x89, 0xf3, 0x09, 0x11, 0xef, 0x72, 0xda, 0x43, 0xa6, 0xef, - 0xfa, 0x9d, 0xd9, 0xa5, 0xce, 0x93, 0xee, 0x86, 0xe9, 0x5c, 0x06, 0x1f, - 0xc4, 0xfd, 0x7a, 0xe7, 0xad, 0x57, 0xd7, 0x88, 0xb7, 0x30, 0x91, 0xe5, - 0x79, 0x92, 0x6b, 0x8a, 0x0e, 0xe2, 0xf4, 0x64, 0x1d, 0xce, 0xba, 0x6d, - 0x85, 0x60, 0x35, 0x99, 0xa6, 0x8c, 0x58, 0x09, 0xb9, 0xe7, 0x0c, 0x6c, - 0xff, 0x87, 0xc9, 0xdc, 0x65, 0xfb, 0x74, 0x7d, 0xfe, 0x17, 0xa7, 0x89, - 0x7f, 0x80, 0xe4, 0xfe, 0x96, 0xa8, 0x83, 0x04, 0x50, 0xb8, 0xcf, 0xd9, - 0xe7, 0xf1, 0x7a, 0x39, 0x31, 0xee, 0x7a, 0x64, 0x89, 0x0b, 0x26, 0x25, - 0xe4, 0xb5, 0x8c, 0xec, 0xa1, 0x29, 0x39, 0x67, 0xfb, 0xbd, 0x88, 0xc3, - 0x62, 0xe8, 0x99, 0xda, 0x9a, 0xc3, 0xe2, 0xb6, 0x37, 0x4e, 0xfb, 0xad, - 0x16, 0xfe, 0x0d, 0x0d, 0x71, 0xbb, 0x7b, 0xb2, 0x39, 0x8e, 0x32, 0x3a, - 0x4c, 0xf0, 0x77, 0x78, 0x2b, 0xda, 0x6c, 0xd7, 0x37, 0xa7, 0x2f, 0xd3, - 0x88, 0x83, 0xf1, 0x63, 0x91, 0x5d, 0x0f, 0xd7, 0x31, 0xa0, 0x7b, 0x15, - 0x33, 0x5f, 0xdc, 0xb0, 0xd4, 0xaa, 0x09, 0x3a, 0xed, 0xf1, 0x0b, 0xf7, - 0x49, 0x08, 0x41, 0x46, 0xa9, 0xcd, 0xe3, 0xc4, 0xfc, 0xc9, 0xbc, 0x7f, - 0xf5, 0x26, 0xb5, 0xfa, 0x5f, 0x8e, 0x50, 0x19, 0x4c, 0x98, 0x01, 0x48, - 0x66, 0x55, 0xe5, 0x03, 0x10, 0x36, 0x9b, 0xfc, 0xa2, 0xc0, 0xe7, 0x98, - 0x28, 0x86, 0x62, 0x85, 0x57, 0x14, 0x51, 0xd7, 0xab, 0x41, 0x17, 0x84, - 0xe2, 0x8e, 0x73, 0xf3, 0x01, 0xd9, 0xe7, 0xea, 0x28, 0x37, 0x5a, 0xa2, - 0x41, 0x99, 0x1b, 0x2b, 0x0e, 0xbd, 0x4a, 0x23, 0x77, 0x2b, 0x2d, 0xa3, - 0x4f, 0x9d, 0xc1, 0x82, 0xd7, 0x14, 0x79, 0x7d, 0x48, 0xe9, 0xdf, 0x81, - 0xc0, 0xbc, 0xbe, 0x73, 0x4e, 0x1a, 0x37, 0x25, 0x18, 0xe3, 0xa7, 0xf0, - 0x3b, 0xed, 0xb0, 0x23, 0x89, 0x12, 0x4b, 0xe4, 0x1c, 0xf3, 0x66, 0xf0, - 0xdf, 0xb6, 0x73, 0x46, 0x0b, 0x9a, 0xdb, 0x65, 0x87, 0x25, 0x23, 0xfd, - 0x07, 0x0c, 0x15, 0x66, 0xd7, 0xb5, 0x65, 0xde, 0x5c, 0xc2, 0xc5, 0x91, - 0xc1, 0xfb, 0xf9, 0x8d, 0xe8, 0xf1, 0xda, 0x34, 0xe6, 0xf9, 0xc0, 0x5c, - 0xf8, 0xb3, 0x36, 0x03, 0x7d, 0xcd, 0xf0, 0x83, 0x5a, 0x52, 0x2a, 0xf1, - 0xb2, 0xa5, 0xf2, 0x20, 0xb7, 0x06, 0xa8, 0xee, 0xae, 0xec, 0xb9, 0xc8, - 0x2c, 0x5d, 0x70, 0xbe, 0x2e, 0x31, 0xe7, 0x53, 0x67, 0x3a, 0xac, 0xda, - 0x5b, 0xbb, 0x83, 0x7b, 0xf6, 0xd7, 0x63, 0x55, 0x31, 0x45, 0x91, 0x53, - 0xc9, 0x4e, 0xc1, 0x9a, 0x81, 0x56, 0xed, 0x64, 0x63, 0xcc, 0x01, 0x45, - 0x62, 0xd8, 0xea, 0xdb, 0xb8, 0x6e, 0x7b, 0xe4, 0x9a, 0x34, 0x47, 0xaa, - 0xfb, 0xfa, 0x4b, 0x24, 0x1f, 0x4a, 0xfe, 0x95, 0xfa, 0x66, 0x2d, 0x0d, - 0x50, 0x22, 0x23, 0xa0, 0xe9, 0x83, 0x0c, 0xbe, 0xb3, 0xc6, 0x97, 0x6f, - 0x9a, 0xed, 0x49, 0x19, 0x11, 0x62, 0x71, 0xf3, 0x75, 0xb9, 0xd0, 0x73, - 0x47, 0x77, 0xef, 0xe8, 0xe8, 0xfa, 0x73, 0xc6, 0x15, 0x6a, 0xc7, 0xff, - 0xbf, 0x4c, 0xd0, 0x28, 0x09, 0x15, 0x18, 0xdb, 0xe2, 0xa8, 0x9c, 0x8d, - 0x60, 0x5c, 0x24, 0x20, 0x61, 0xe2, 0x27, 0x58, 0x8a, 0x17, 0x6f, 0xd3, - 0x86, 0x4d, 0xde, 0xf1, 0x01, 0x47, 0x0f, 0xcc, 0xca, 0xd3, 0x5e, 0x75, - 0xca, 0x15, 0x15, 0x72, 0xa6, 0xee, 0xdc, 0x35, 0xfd, 0x3a, 0x69, 0x3e, - 0x8f, 0xaa, 0x7c, 0x0e, 0xcc, 0xc6, 0xc8, 0xda, 0x13, 0xa5, 0x6f, 0x80, - 0x56, 0x3d, 0x3a, 0xa2, 0x8b, 0xfd, 0xd2, 0x31, 0xa2, 0x03, 0xed, 0xc8, - 0x4d, 0x67, 0xd8, 0xd5, 0xde, 0x40, 0x4f, 0x87, 0x79, 0x10, 0x5d, 0xdb, - 0xcc, 0x60, 0x9f, 0xce, 0x5c, 0xc0, 0x1e, 0xe3, 0x79, 0x8f, 0x07, 0xb5, - 0x16, 0xd0, 0x41, 0xb7, 0xe0, 0x01, 0x3f, 0x19, 0x88, 0x73, 0x4d, 0x4f, - 0x74, 0x03, 0x34, 0x5e, 0x05, 0x3a, 0x86, 0x17, 0x99, 0xce, 0x54, 0x26, - 0x6f, 0xd5, 0xa9, 0x5d, 0x24, 0xa2, 0xf6, 0x4d, 0x5b, 0xf0, 0x17, 0x78, - 0x36, 0x25, 0x0b, 0x4a, 0x6a, 0x51, 0xad, 0x3e, 0xa1, 0x65, 0x26, 0x57, - 0xad, 0xb5, 0x59, 0x2d, 0x72, 0xe0, 0xd8, 0xf7, 0xb8, 0x22, 0xfa, 0x4a, - 0x9b, 0x2b, 0x64, 0x78, 0xde, 0xd3, 0x56, 0x86, 0xe1, 0xbd, 0xe8, 0x76, - 0x83, 0xe8, 0x00, 0x07, 0x4c, 0xa2, 0x7c, 0x35, 0x03, 0xcd, 0x2d, 0x4e, - 0x80, 0x78, 0x02, 0x65, 0x8b, 0xfd, 0xca, 0xb4, 0xc5, 0xc3, 0xbc, 0x84, - 0xb2, 0x1e, 0x69, 0x60, 0xe8, 0xf4, 0xfd, 0x2d, 0xc2, 0x64, 0x41, 0x16, - 0xc7, 0xc8, 0x1a, 0x86, 0xfc, 0x8a, 0x77, 0xd2, 0xd8, 0xaf, 0x56, 0x88, - 0xb5, 0xb8, 0x0b, 0x3f, 0xd9, 0xea, 0x72, 0xda, 0x1f, 0xef, 0x71, 0x5a, - 0x9f, 0xdd, 0x95, 0xfc, 0xc3, 0xfb, 0xc4, 0xc8, 0xf8, 0x8f, 0x18, 0xcf, - 0x9b, 0xf2, 0xf0, 0x77, 0x09, 0xaf, 0x71, 0x4d, 0xb1, 0x28, 0x46, 0xe5, - 0x95, 0x40, 0x5b, 0x82, 0xc2, 0x3e, 0x07, 0x8b, 0x52, 0x19, 0x92, 0xa3, - 0x83, 0xf1, 0xa3, 0x57, 0xf5, 0x9b, 0x49, 0xb2, 0x02, 0x36, 0x81, 0xc6, - 0x3c, 0xb2, 0x98, 0x63, 0x0a, 0xaf, 0xb1, 0x22, 0x8c, 0x41, 0x62, 0x41, - 0x7f, 0xb8, 0xa4, 0x8d, 0x31, 0xac, 0x2f, 0x1e, 0x8b, 0xeb, 0x03, 0x6d, - 0xf8, 0x79, 0xb6, 0x3e, 0x32, 0x7e, 0x14, 0x2a, 0x0f, 0x78, 0x3e, 0x47, - 0x33, 0x04, 0xc3, 0xf2, 0xb7, 0x7c, 0xec, 0x38, 0x41, 0x71, 0xb3, 0xb6, - 0xab, 0x04, 0xb6, 0x96, 0x26, 0xdc, 0x1c, 0xb6, 0x71, 0x5f, 0xfc, 0x92, - 0x4c, 0x9c, 0xbc, 0xf1, 0xf7, 0x34, 0xe3, 0x79, 0x82, 0x6b, 0x52, 0x03, - 0x70, 0x18, 0xb8, 0x68, 0x1b, 0xde, 0xa4, 0x3e, 0x13, 0x4e, 0x73, 0xad, - 0x33, 0x9f, 0x89, 0x7a, 0x33, 0xaa, 0xa7, 0xd6, 0xac, 0xa4, 0x61, 0xb2, - 0xa5, 0x43, 0x48, 0x3a, 0xf7, 0xc8, 0xed, 0xb0, 0xdc, 0x6c, 0x1a, 0x12, - 0xec, 0xc7, 0x71, 0x44, 0xdb, 0x23, 0xd2, 0xb9, 0x94, 0xc3, 0x43, 0x36, - 0xc2, 0xf6, 0x78, 0x43, 0x6c, 0x78, 0x15, 0xdd, 0xf3, 0xea, 0x3f, 0xef, - 0x73, 0x1a, 0x5c, 0xdc, 0xe4, 0x09, 0xa3, 0xdd, 0xc0, 0x08, 0x9e, 0xbe, - 0x3b, 0x0d, 0x5d, 0x4b, 0x1d, 0xd4, 0xe3, 0x4c, 0xdc, 0x8a, 0xbb, 0x5b, - 0xe5, 0x64, 0xaf, 0x85, 0x83, 0x99, 0x67, 0x94, 0xfa, 0xa9, 0xe9, 0x08, - 0x05, 0x44, 0x84, 0x12, 0x2f, 0x5c, 0x7e, 0xb4, 0xb0, 0xe0, 0x6f, 0xf3, - 0x1d, 0x64, 0x72, 0x3c, 0xe8, 0xfe, 0xd7, 0x88, 0xab, 0x2f, 0xb5, 0x9e, - 0xc9, 0x18, 0xf0, 0x87, 0x80, 0x51, 0x05, 0xcc, 0x4c, 0x27, 0x1a, 0x61, - 0x18, 0x24, 0x7b, 0xcf, 0x31, 0x14, 0xc7, 0x79, 0x7f, 0x2c, 0x60, 0x62, - 0xec, 0xee, 0x08, 0x17, 0x6f, 0xaa, 0x36, 0x16, 0x92, 0xfa, 0x96, 0xe2, - 0x03, 0x99, 0xfa, 0x97, 0xa0, 0x49, 0x7f, 0xd8, 0xe1, 0x82, 0xcb, 0xda, - 0xf7, 0x1f, 0x1b, 0x56, 0xc8, 0x66, 0x7e, 0xd7, 0xbb, 0x20, 0x21, 0xd9, - 0xb6, 0x87, 0x3f, 0xa5, 0x2e, 0x56, 0xfd, 0xe6, 0x8c, 0x3a, 0x59, 0x2f, - 0x35, 0x6a, 0xe8, 0x87, 0xa7, 0xaf, 0x0f, 0xf0, 0xc1, 0xad, 0xd6, 0x89, - 0xf5, 0x1f, 0x24, 0xdd, 0xdc, 0xf5, 0x0b, 0x10, 0x8f, 0x75, 0xfb, 0x00, - 0xfb, 0xb6, 0x58, 0xe2, 0x27, 0x3e, 0x4b, 0x29, 0x46, 0x20, 0x43, 0x26, - 0x0b, 0x5e, 0xab, 0x5f, 0xeb, 0x7e, 0x46, 0x7f, 0xfa, 0xce, 0x4f, 0xf5, - 0x0c, 0x69, 0x68, 0xda, 0xd4, 0x31, 0x75, 0x1a, 0x00, 0xa7, 0x21, 0x8b, - 0x71, 0x55, 0x2e, 0x77, 0xb5, 0x50, 0xac, 0x17, 0x08, 0x8b, 0x1e, 0xf1, - 0x4a, 0x51, 0x7b, 0x6f, 0x20, 0xaa, 0x06, 0xdd, 0xfb, 0x51, 0x67, 0x2e, - 0x98, 0x5a, 0x14, 0xd0, 0x04, 0x9e, 0x46, 0x7d, 0x14, 0xbf, 0x2c, 0xdb, - 0xc2, 0xe4, 0x56, 0xe7, 0xe0, 0x19, 0xa1, 0x84, 0x87, 0x92, 0xe5, 0xea, - 0xf1, 0xb2, 0x06, 0x3a, 0x79, 0x0e, 0xfb, 0xe9, 0x48, 0x76, 0x3b, 0x55, - 0x62, 0xa1, 0xa5, 0x47, 0xbd, 0x09, 0xde, 0x1b, 0x8a, 0xc4, 0x97, 0x1d, - 0xc1, 0xe5, 0x4a, 0x84, 0x82, 0x93, 0x82, 0x8d, 0x28, 0x8b, 0x67, 0x3d, - 0x45, 0xc9, 0x79, 0xeb, 0xa5, 0xc5, 0xf7, 0x5e, 0xa0, 0x13, 0xff, 0x38, - 0xdb, 0xa1, 0x9a, 0x60, 0x6d, 0x02, 0x60, 0xe1, 0x4b, 0xd3, 0xf5, 0x33, - 0x44, 0x4d, 0x96, 0x87, 0x76, 0xa6, 0x06, 0x27, 0x85, 0x40, 0x3a, 0xae, - 0x4b, 0x95, 0x6a, 0x8b, 0xbd, 0x07, 0x00, 0xd5, 0x89, 0x2f, 0xc1, 0xc4, - 0x52, 0xa3, 0x7d, 0x12, 0xf2, 0x59, 0xcb, 0x11, 0x10, 0x85, 0x38, 0x8f, - 0x4b, 0xc8, 0x7b, 0x6a, 0xe8, 0x9b, 0xa7, 0xa4, 0x55, 0x7a, 0x25, 0x4c, - 0xe1, 0x6e, 0x5d, 0x42, 0xc7, 0x9a, 0x2b, 0x47, 0xaa, 0x5b, 0x68, 0xa9, - 0x3f, 0xe8, 0x37, 0xac, 0xbe, 0x7d, 0xf0, 0xfe, 0x9e, 0xec, 0x63, 0x90, - 0x1a, 0x58, 0xa9, 0x4a, 0xd7, 0x2e, 0x5a, 0x7d, 0x99, 0x49, 0x2f, 0xf9, - 0x57, 0x73, 0x15, 0x7c, 0xd7, 0x76, 0x71, 0x46, 0x52, 0xef, 0x95, 0xae, - 0xa0, 0x13, 0x80, 0x3c, 0xae, 0xb5, 0x31, 0xd0, 0x65, 0x03, 0x23, 0xbb, - 0x09, 0xf7, 0x3d, 0x78, 0x96, 0xc4, 0x70, 0x67, 0xe3, 0xbc, 0x97, 0xde, - 0x11, 0x91, 0x68, 0xb8, 0xb6, 0xf0, 0x73, 0x55, 0x4d, 0x5c, 0x87, 0x66, - 0xc0, 0x96, 0x94, 0xc4, 0x20, 0x75, 0xbc, 0x0d, 0x83, 0x86, 0x6b, 0xba, - 0x1c, 0x0b, 0x3f, 0x4f, 0xa7, 0x5b, 0xe0, 0x11, 0x40, 0x16, 0x31, 0x67, - 0x77, 0xb0, 0xdb, 0xce, 0xbb, 0xf5, 0x1d, 0xd2, 0xd5, 0xb6, 0x88, 0x16, - 0xe2, 0xca, 0xe9, 0xed, 0x1f, 0x7b, 0x34, 0xec, 0xe1, 0x42, 0xd3, 0x89, - 0x33, 0x5f, 0x3d, 0x3c, 0xb4, 0xd2, 0x50, 0xc0, 0xb1, 0x64, 0x06, 0x43, - 0x4c, 0xa1, 0x76, 0x99, 0x73, 0x64, 0xf4, 0xb9, 0x11, 0x03, 0xcd, 0xf8, - 0x17, 0x44, 0x26, 0x71, 0xf7, 0x8d, 0x68, 0x1a, 0x3f, 0xbd, 0x9b, 0x6d, - 0x83, 0x8c, 0xfe, 0x92, 0xbb, 0xc2, 0x1e, 0x78, 0x7b, 0xf8, 0x5d, 0x07, - 0xe4, 0xff, 0xcd, 0xc1, 0x5d, 0x61, 0x96, 0x8b, 0x14, 0x57, 0x4b, 0xfe, - 0x1f, 0x2f, 0x78, 0xfd, 0xa4, 0x25, 0x1c, 0x68, 0xd5, 0xc7, 0xf0, 0x8c, - 0xe9, 0xa4, 0xbb, 0x5d, 0x0e, 0xae, 0x4e, 0x0d, 0x5b, 0x87, 0x68, 0x38, - 0x40, 0xa8, 0x5f, 0x5b, 0x9d, 0x1a, 0x6f, 0x08, 0x96, 0x7c, 0x9e, 0x01, - 0x4d, 0x6c, 0x39, 0x78, 0x1d, 0xfb, 0xae, 0x6f, 0xff, 0xe5, 0x5e, 0x9d, - 0x8e, 0xed, 0x29, 0xd5, 0x55, 0x8f, 0x13, 0xbd, 0x48, 0xf1, 0xcf, 0xec, - 0xb2, 0xf5, 0x52, 0x99, 0xf0, 0x8b, 0x07, 0x49, 0xa2, 0x73, 0xfd, 0xd9, - 0xa4, 0x1f, 0xa1, 0x2f, 0x86, 0x29, 0xb5, 0x7b, 0x52, 0x80, 0x51, 0x28, - 0xb6, 0xed, 0xd7, 0x2b, 0xfd, 0xa3, 0xb8, 0x53, 0xa3, 0x6b, 0xa7, 0x19, - 0xd7, 0xd5, 0x8e, 0xa6, 0x5b, 0xc6, 0xb4, 0x2a, 0x8d, 0xa2, 0xb3, 0x00, - 0x20, 0xe5, 0xdd, 0xdd, 0xeb, 0x23, 0xc1, 0xff, 0xd7, 0x50, 0xd1, 0x73, - 0xde, 0x5a, 0x8b, 0xd0, 0x05, 0x76, 0x89, 0x5f, 0x2a, 0x44, 0xcf, 0x65, - 0x5c, 0xc9, 0xff, 0x2f, 0x03, 0xcd, 0x93, 0xe8, 0xd9, 0x99, 0x0c, 0x2d, - 0x66, 0x70, 0xb7, 0x23, 0xee, 0xe2, 0x86, 0x6f, 0xb1, 0xd5, 0x9d, 0x2e, - 0xe7, 0xf2, 0x96, 0xba, 0xa3, 0xcd, 0xd7, 0x62, 0xc6, 0x41, 0xda, 0x5e, - 0xf5, 0x76, 0xdb, 0x82, 0x25, 0x67, 0x77, 0xbb, 0xa9, 0x25, 0xd4, 0x68, - 0xd9, 0xd6, 0x14, 0xa1, 0xa2, 0x2a, 0x0e, 0xf9, 0x32, 0x59, 0x12, 0xa0, - 0x60, 0x77, 0xed, 0x27, 0x94, 0x6b, 0x72, 0xbc, 0x29, 0x53, 0x99, 0x83, - 0xc0, 0xc6, 0x1a, 0x9b, 0x78, 0xcf, 0xed, 0x9a, 0x36, 0xb0, 0x76, 0x1b, - 0x8f, 0xda, 0xf7, 0x59, 0x63, 0x85, 0x5f, 0x3f, 0x59, 0x74, 0x90, 0xc0, - 0x6d, 0x22, 0xa5, 0x1c, 0x1f, 0x03, 0x36, 0x8f, 0x5b, 0x6d, 0x86, 0x5b, - 0x0d, 0x13, 0xf9, 0x6f, 0x62, 0x01, 0x28, 0xe5, 0x6c, 0xce, 0xfe, 0x62, - 0xb5, 0x21, 0x64, 0x1d, 0xde, 0x23, 0x3e, 0x66, 0x8c, 0x60, 0x7a, 0xbb, - 0x98, 0x16, 0x11, 0xa7, 0xea, 0x52, 0x99, 0x81, 0x6f, 0xdb, 0x6f, 0xc2, - 0xd6, 0xb6, 0x28, 0xdc, 0x36, 0x1f, 0x75, 0x1b, 0x79, 0x32, 0x75, 0x4e, - 0x1d, 0xd2, 0x4a, 0x6e, 0x41, 0x17, 0x65, 0x6f, 0x13, 0x21, 0x0f, 0xef, - 0x78, 0x6b, 0xf9, 0xb9, 0x8c, 0x81, 0x29, 0x1b, 0x3d, 0xad, 0x2e, 0xd5, - 0xa9, 0x2e, 0x7c, 0xd7, 0x25, 0xb6, 0xc3, 0xc5, 0x27, 0x6b, 0x30, 0xc7, - 0x24, 0x76, 0x0b, 0x8f, 0xdd, 0x95, 0x4e, 0x14, 0x0c, 0xb2, 0x30, 0x0f, - 0x57, 0x2c, 0xb4, 0x87, 0x72, 0x4e, 0xf2, 0x95, 0x77, 0x48, 0x14, 0x61, - 0xaf, 0xc6, 0x51, 0x80, 0xa4, 0x00, 0x9b, 0x60, 0xf4, 0x76, 0xbb, 0x85, - 0x9a, 0xc5, 0x53, 0x35, 0x16, 0x74, 0x57, 0xc2, 0x94, 0x89, 0x57, 0xa9, - 0x56, 0x27, 0xc2, 0x6e, 0x78, 0x35, 0xd1, 0xf7, 0x97, 0x6d, 0x83, 0xe0, - 0xc0, 0x3c, 0x39, 0x58, 0x34, 0xac, 0xae, 0x44, 0xc3, 0xef, 0xb2, 0xe5, - 0x39, 0xbd, 0x44, 0xd7, 0x45, 0x8e, 0xcb, 0x9b, 0xa5, 0xdc, 0x86, 0x07, - 0xcb, 0x25, 0xe4, 0x03, 0x8b, 0x50, 0xe2, 0x48, 0x10, 0x93, 0xa8, 0x47, - 0x95, 0xb5, 0x78, 0x6f, 0x50, 0xea, 0xc9, 0x0c, 0x7b, 0x0b, 0xdc, 0xdd, - 0x78, 0x07, 0x51, 0xd0, 0x77, 0xc6, 0x01, 0xda, 0x8d, 0x8b, 0x7a, 0xb0, - 0x12, 0x11, 0x2c, 0x36, 0x03, 0x3a, 0x0b, 0x8d, 0x8b, 0x43, 0xcd, 0xf8, - 0x6d, 0x45, 0xa6, 0x7a, 0x62, 0x20, 0x72, 0xda, 0x1a, 0x45, 0xef, 0xc8, - 0x64, 0x0a, 0x3c, 0x73, 0x7f, 0x32, 0xb2, 0xb5, 0x0c, 0xe4, 0x9b, 0xaa, - 0x14, 0x66, 0x44, 0x2a, 0x80, 0xb7, 0xe8, 0x2b, 0xfc, 0x28, 0x8f, 0x0b, - 0x23, 0xc4, 0x43, 0x21, 0x40, 0x52, 0xd5, 0x43, 0x31, 0xba, 0xf8, 0x8c, - 0xda, 0x35, 0x87, 0x6e, 0x67, 0x46, 0x92, 0x45, 0xb2, 0x45, 0x29, 0xd6, - 0xd2, 0x03, 0x29, 0x68, 0x74, 0x39, 0x71, 0x1d, 0x0b, 0x3e, 0x42, 0xe2, - 0x00, 0x3d, 0xfd, 0x44, 0x95, 0xaa, 0x95, 0x76, 0x08, 0x36, 0x1a, 0xdd, - 0xf5, 0x49, 0xe2, 0xdc, 0xaf, 0x41, 0xc1, 0x92, 0xcc, 0x93, 0xe5, 0xa6, - 0xc4, 0xa7, 0xaf, 0x76, 0x3a, 0x7c, 0x71, 0x23, 0x3d, 0x18, 0xc3, 0xab, - 0xb0, 0xf9, 0x19, 0x8b, 0x5b, 0x93, 0x37, 0xc4, 0x7b, 0xa3, 0x0d, 0xc3, - 0xdf, 0xa5, 0x62, 0x6c, 0x72, 0xea, 0xf5, 0x46, 0x48, 0xef, 0x1b, 0xbc, - 0x70, 0xdd, 0xed, 0xb6, 0x07, 0xee, 0x76, 0x1e, 0x23, 0x0b, 0x75, 0x29, - 0x4d, 0x84, 0x3a, 0xbe, 0xf2, 0xb9, 0x81, 0x58, 0xde, 0x8c, 0xed, 0xb9, - 0xe2, 0x33, 0x36, 0x0e, 0x90, 0x1f, 0x12, 0xe8, 0x43, 0x24, 0x19, 0x76, - 0xf5, 0xe7, 0x14, 0xef, 0x74, 0xa2, 0xa0, 0xa4, 0x17, 0xb3, 0x0e, 0xa9, - 0x4d, 0xb4, 0xfb, 0xf8, 0xee, 0x06, 0x80, 0xf1, 0x0c, 0x2c, 0xcf, 0xa1, - 0x4b, 0x70, 0xfe, 0xb5, 0x75, 0xd7, 0x5d, 0xa7, 0x98, 0x2c, 0x82, 0xe7, - 0x88, 0x55, 0xbf, 0x73, 0xb1, 0x8f, 0xae, 0xa1, 0x21, 0xf1, 0x26, 0x17, - 0xfc, 0xfc, 0x3c, 0xe4, 0x49, 0x17, 0x90, 0xde, 0x41, 0xbd, 0xd5, 0x36, - 0x49, 0x89, 0x83, 0x22, 0xfd, 0x36, 0xb2, 0x45, 0x61, 0xc4, 0x42, 0x7f, - 0xb5, 0xec, 0x9a, 0x44, 0xeb, 0xe2, 0x2d, 0x8b, 0xb3, 0xe1, 0x66, 0xf3, - 0x5b, 0xf6, 0xdb, 0x95, 0x1f, 0x6e, 0x0b, 0x63, 0x38, 0x4e, 0xea, 0xa3, - 0x7b, 0xe8, 0x98, 0x7f, 0xd8, 0xdb, 0x79, 0x14, 0x92, 0x68, 0xcf, 0xaa, - 0x5e, 0x4a, 0x81, 0x78, 0x68, 0x27, 0xcb, 0x1f, 0xa7, 0x81, 0x7d, 0x8e, - 0x89, 0x90, 0x00, 0x8f, 0x26, 0xf3, 0xa8, 0xdb, 0x45, 0x6e, 0xf4, 0x8d, - 0x34, 0x7f, 0x60, 0x15, 0xb2, 0x60, 0xb4, 0xfe, 0x43, 0xe6, 0xfb, 0x9a, - 0x13, 0x3c, 0xe8, 0x10, 0x81, 0x85, 0x98, 0xaf, 0xc5, 0xef, 0xe2, 0x9c, - 0x0a, 0x01, 0xc0, 0x97, 0xd8, 0x04, 0xbf, 0xc1, 0x6e, 0x5f, 0x19, 0x59, - 0x81, 0x7f, 0x3d, 0x98, 0x6b, 0x4d, 0xbe, 0x94, 0x43, 0x6a, 0x5c, 0x33, - 0x26, 0xdb, 0x79, 0x8a, 0x09, 0xfb, 0x07, 0x35, 0x7b, 0x82, 0x08, 0x58, - 0x96, 0x90, 0x40, 0xa1, 0xb5, 0xcb, 0x92, 0xcc, 0x0d, 0x3b, 0xd1, 0x47, - 0x6d, 0x05, 0x40, 0xf7, 0x66, 0x7c, 0x8b, 0x5b, 0xe6, 0xc7, 0xdd, 0x6e, - 0x11, 0xcc, 0x21, 0xbf, 0xfe, 0x77, 0x75, 0x4a, 0xcf, 0x3c, 0xf1, 0x86, - 0x1d, 0x32, 0x15, 0xe4, 0xf4, 0x5a, 0x0d, 0x5f, 0xfe, 0x71, 0x26, 0xa2, - 0x70, 0xd6, 0xdd, 0xd7, 0xe3, 0xd1, 0x5c, 0x8b, 0xbf, 0x5d, 0x2e, 0xee, - 0x97, 0x7d, 0xdd, 0x98, 0x4c, 0xa0, 0xd5, 0x3d, 0x39, 0x43, 0xbc, 0xc2, - 0x6d, 0xbf, 0x31, 0x3e, 0xdd, 0x73, 0xbf, 0xa9, 0xc0, 0x0b, 0x83, 0xba, - 0xf0, 0x96, 0xae, 0x47, 0xde, 0x4b, 0xd8, 0x2f, 0xd7, 0x10, 0x82, 0x9a, - 0xd8, 0xcd, 0xec, 0x05, 0x95, 0xd5, 0xb4, 0x09, 0x67, 0x7c, 0x67, 0x51, - 0x7d, 0xa6, 0x6c, 0xdb, 0xd9, 0xb2, 0x02, 0x54, 0x2b, 0x7c, 0xb5, 0x59, - 0x61, 0x0f, 0xa1, 0xe0, 0xd2, 0x62, 0x11, 0x84, 0xb7, 0x32, 0xcc, 0x3c, - 0x46, 0x54, 0xa2, 0x18, 0x7a, 0x58, 0x80, 0x8a, 0x6e, 0xcc, 0xe5, 0x79, - 0xd2, 0xbe, 0x7b, 0x4f, 0x8d, 0xe9, 0x35, 0x31, 0xc1, 0x4f, 0xcd, 0x60, - 0x7f, 0x4a, 0x28, 0x66, 0xcd, 0xed, 0x47, 0x53, 0x98, 0x40, 0xc3, 0x49, - 0x7f, 0xa9, 0x65, 0x5d, 0x04, 0x85, 0xaa, 0xe4, 0x54, 0xd5, 0x23, 0x04, - 0xc4, 0xd0, 0x66, 0x2d, 0xc2, 0x4f, 0x03, 0x97, 0x21, 0xc5, 0x87, 0xdc, - 0xee, 0x4b, 0x0e, 0xf5, 0x22, 0x09, 0x3b, 0xb4, 0x9a, 0x38, 0x02, 0xa9, - 0xe2, 0xfc, 0x30, 0xa4, 0x8c, 0xc4, 0x13, 0x3e, 0x5e, 0x9a, 0x99, 0x50, - 0x02, 0x70, 0xe9, 0x3d, 0x5d, 0xa8, 0xd3, 0x16, 0xb5, 0x67, 0x7b, 0xb6, - 0xcf, 0x96, 0x1d, 0x48, 0x99, 0x15, 0x63, 0x1e, 0xde, 0xb1, 0xfc, 0x56, - 0x79, 0x65, 0xcf, 0x51, 0xc3, 0xa0, 0x39, 0xcf, 0xe0, 0xd3, 0xf5, 0x62, - 0x37, 0x6a, 0xe3, 0x0a, 0xd0, 0x43, 0xea, 0x42, 0x9d, 0x2a, 0x68, 0x90, - 0xc6, 0x0a, 0x71, 0x2b, 0x80, 0xeb, 0xa0, 0xd9, 0xf2, 0xa2, 0xff, 0x59, - 0x60, 0x3e, 0xe1, 0x41, 0xcf, 0xdc, 0xb7, 0x66, 0x7f, 0xd1, 0x68, 0x59, - 0x86, 0x75, 0x10, 0xf9, 0x43, 0xf9, 0xd3, 0x0f, 0x3a, 0x3d, 0xdc, 0x24, - 0xdc, 0xbf, 0x9a, 0xd7, 0x5d, 0x92, 0x05, 0x1b, 0x4d, 0x5e, 0x09, 0x8b, - 0xd2, 0xde, 0x19, 0x4f, 0xb4, 0x6d, 0xdc, 0x02, 0x67, 0x8b, 0xf1, 0x85, - 0x87, 0x23, 0x0e, 0x4a, 0x0d, 0x94, 0x8e, 0x46, 0x3d, 0xe0, 0xf6, 0x09, - 0x37, 0x48, 0x77, 0xb2, 0x12, 0x37, 0x22, 0xf1, 0xf0, 0x7a, 0xd3, 0xed, - 0x27, 0x94, 0xdb, 0xb4, 0xa8, 0x4e, 0x22, 0x82, 0x1a, 0xac, 0x5a, 0x3c, - 0x0f, 0x49, 0x1e, 0xc4, 0x18, 0x33, 0x52, 0x00, 0x20, 0x05, 0x35, 0xd7, - 0xff, 0x7f, 0xb6, 0x23, 0x99, 0x25, 0x30, 0x5d, 0xd4, 0x78, 0x50, 0x08, - 0x7b, 0xb3, 0x71, 0xb8, 0x7a, 0xaa, 0xec, 0x78, 0x69, 0x4c, 0x07, 0x22, - 0xdb, 0x81, 0xee, 0xf8, 0xf1, 0x7a, 0xfe, 0x39, 0x6f, 0x0f, 0x25, 0x5d, - 0xbc, 0x69, 0x79, 0xc0, 0x57, 0x11, 0x1c, 0x7d, 0x63, 0x3b, 0x77, 0x95, - 0x2c, 0x00, 0xb6, 0x99, 0x88, 0x9c, 0xf2, 0xbc, 0x5a, 0x3d, 0x0b, 0xa0, - 0x2a, 0x45, 0xbf, 0x61, 0x33, 0xae, 0xf0, 0xf9, 0xa9, 0xae, 0xd8, 0x83, - 0x7d, 0x0a, 0xd4, 0x8e, 0x45, 0x05, 0x2a, 0xfc, 0x97, 0x15, 0x64, 0x6c, - 0x1e, 0x6a, 0x8c, 0x73, 0x47, 0x7f, 0x1a, 0x98, 0x7e, 0x56, 0xa4, 0x33, - 0xb3, 0x57, 0x3f, 0xd1, 0xb9, 0x24, 0xc9, 0xd4, 0x30, 0xfa, 0x74, 0x11, - 0xaa, 0x44, 0x35, 0x2c, 0xdb, 0x8a, 0xf6, 0xcc, 0x2e, 0x1b, 0x2c, 0x9e, - 0x03, 0x3c, 0xcf, 0x42, 0x9a, 0xad, 0x36, 0x5a, 0xc2, 0xcc, 0x3c, 0xe3, - 0x67, 0xe2, 0xab, 0xdc, 0xbb, 0x53, 0xf6, 0x4a, 0x7b, 0xa7, 0xa2, 0x44, - 0xfe, 0xbb, 0x52, 0x30, 0x1d, 0x53, 0xd3, 0x83, 0x3b, 0x18, 0x59, 0xeb, - 0xc5, 0x16, 0x46, 0x1c, 0x84, 0x09, 0xe7, 0x59, 0xc9, 0x71, 0xab, 0x0c, - 0xe9, 0x2b, 0x0d, 0x28, 0xd4, 0x28, 0xbc, 0x01, 0x74, 0xbe, 0xe8, 0xaa, - 0xbb, 0xcf, 0x62, 0xc8, 0x3f, 0x70, 0x3c, 0x1b, 0xd2, 0x82, 0x27, 0x14, - 0x52, 0xd2, 0x6e, 0x16, 0x1c, 0xad, 0xc9, 0x12, 0xe1, 0x97, 0x12, 0x58, - 0x0f, 0x1d, 0xd0, 0xa1, 0xb6, 0x13, 0x55, 0xa4, 0x18, 0x04, 0x47, 0x19, - 0x89, 0x25, 0xf4, 0x37, 0x24, 0xa6, 0xc6, 0x93, 0x17, 0x34, 0xaf, 0x6f, - 0xbc, 0x3d, 0xd0, 0xb2, 0xf1, 0x6e, 0x5a, 0xfd, 0x94, 0x3a, 0x5f, 0xa1, - 0x4f, 0x5a, 0xa9, 0x7e, 0xc9, 0x93, 0xe5, 0x3d, 0x0c, 0x9c, 0x51, 0x50, - 0x92, 0xb2, 0x1c, 0xf6, 0xcc, 0xf8, 0x10, 0xea, 0xc1, 0xce, 0x86, 0xe0, - 0xcd, 0x31, 0x46, 0x2e, 0x72, 0xb1, 0xbc, 0x63, 0x14, 0xee, 0x7e, 0xcf, - 0xfd, 0xfa, 0x62, 0x01, 0x02, 0xa9, 0x0a, 0x51, 0x12, 0xb2, 0x0a, 0x0e, - 0x93, 0xcb, 0x64, 0xa0, 0x5c, 0x56, 0x6e, 0x2b, 0x96, 0x95, 0x20, 0x16, - 0x8c, 0x1d, 0x3d, 0x79, 0x04, 0x83, 0xbe, 0xd5, 0x46, 0xa7, 0xc3, 0x39, - 0xd5, 0x9f, 0x54, 0xf3, 0x1d, 0x3c, 0xdd, 0x43, 0xc3, 0x49, 0x15, 0x3d, - 0x71, 0x05, 0xc5, 0xf7, 0x68, 0xf8, 0x50, 0xa1, 0xce, 0xa6, 0x14, 0x2e, - 0xd4, 0x3f, 0x63, 0x99, 0xc8, 0xe2, 0x24, 0x4c, 0x25, 0x38, 0x18, 0xa6, - 0x5e, 0x8f, 0x86, 0x5b, 0x72, 0x5b, 0x52, 0xe4, 0x48, 0x86, 0xed, 0x55, - 0x25, 0x4e, 0xd0, 0xee, 0xc5, 0x23, 0xca, 0xbe, 0x9d, 0xd4, 0x05, 0x13, - 0xf4, 0xba, 0x3e, 0xeb, 0x3b, 0x3f, 0xe0, 0xea, 0x6d, 0x6d, 0x4c, 0xd9, - 0x97, 0x3c, 0x66, 0xae, 0x8d, 0x6b, 0x38, 0x3f, 0x9e, 0xb1, 0xbe, 0x60, - 0x4c, 0xcb, 0x21, 0x44, 0x04, 0x52, 0xe0, 0xfe, 0x82, 0x62, 0x50, 0xf6, - 0xa6, 0xe9, 0x1a, 0xb0, 0xc4, 0x23, 0xab, 0x07, 0x50, 0x59, 0xaa, 0xd0, - 0xd8, 0x5d, 0x51, 0xee, 0x53, 0xb6, 0x4e, 0x33, 0xe8, 0x4a, 0x91, 0x3e, - 0xf3, 0x59, 0x89, 0xe3, 0xa0, 0x32, 0xc1, 0xf0, 0x1d, 0x6e, 0x8f, 0x20, - 0x09, 0x28, 0x3a, 0x88, 0x1f, 0xaa, 0x3d, 0x07, 0x2a, 0xb6, 0x8a, 0xcd, - 0x64, 0xf8, 0xfc, 0x69, 0xc8, 0x75, 0xdc, 0x02, 0xe5, 0xd5, 0xab, 0xd7, - 0xc7, 0x4e, 0x77, 0x54, 0xf3, 0x9a, 0xab, 0x51, 0x77, 0x8f, 0xf9, 0x08, - 0x4b, 0x5a, 0x7d, 0x16, 0xbd, 0x8b, 0xef, 0xf5, 0x4c, 0x06, 0xdb, 0xd0, - 0xdd, 0xcb, 0xc3, 0xa4, 0x45, 0xda, 0x94, 0xb8, 0xfe, 0x54, 0x67, 0xe3, - 0xe1, 0xc3, 0x1a, 0x8c, 0x9d, 0x21, 0xff, 0x25, 0xe0, 0xdc, 0x99, 0x6a, - 0x46, 0xa5, 0x53, 0xe5, 0x6b, 0xa7, 0x16, 0xf3, 0xd6, 0x05, 0xdb, 0xba, - 0xc0, 0xd3, 0xe4, 0x8b, 0x7f, 0x36, 0x46, 0xa6, 0x8a, 0xdb, 0x58, 0xa4, - 0x93, 0x26, 0xc5, 0xac, 0x52, 0x22, 0x86, 0x94, 0xd4, 0xde, 0x0c, 0x9e, - 0x09, 0x55, 0xa2, 0x47, 0x04, 0xdd, 0x7f, 0x87, 0x1f, 0x31, 0x9e, 0xd0, - 0xf2, 0x33, 0x85, 0xd7, 0xfb, 0x57, 0x7d, 0x4d, 0xed, 0x33, 0xf1, 0xcd, - 0xfd, 0x71, 0x9c, 0x52, 0x8b, 0x8e, 0xba, 0x77, 0x02, 0x72, 0xe7, 0xa3, - 0x4b, 0xbe, 0x20, 0xb7, 0x18, 0x29, 0x88, 0x74, 0x27, 0xde, 0x2d, 0x93, - 0x6a, 0x0f, 0x74, 0x21, 0x5b, 0xfa, 0xc3, 0xb1, 0x32, 0x69, 0xe4, 0xd4, - 0x3c, 0xfb, 0x1e, 0xe3, 0x8c, 0x71, 0x69, 0x5f, 0x55, 0xe2, 0x7c, 0x64, - 0x0d, 0x09, 0x8a, 0x01, 0xee, 0x35, 0xa6, 0x50, 0xd8, 0xdc, 0x14, 0x40, - 0x1a, 0x7a, 0xdb, 0x2e, 0x23, 0x96, 0x43, 0x64, 0xfb, 0xc2, 0x2c, 0xa3, - 0x8a, 0xdb, 0x58, 0xa4, 0x91, 0x26, 0xc5, 0xac, 0x52, 0x22, 0x86, 0x94, - 0xd2, 0xde, 0x0c, 0x9e, 0x09, 0x55, 0xa2, 0x47, 0x04, 0xdd, 0x7f, 0x87, - 0x1f, 0x31, 0x9e, 0xd0, 0xf2, 0x33, 0x85, 0xd7, 0xef, 0x0c, 0x67, 0xf2, - 0x9f, 0xc2, 0xd1, 0x88, 0x38, 0x8e, 0x43, 0x83, 0xa3, 0x23, 0xba, 0xe7, - 0x7d, 0xd1, 0x3e, 0xbd, 0xc4, 0xde, 0xda, 0x10, 0x2a, 0xee, 0x0e, 0x08, - 0x87, 0xca, 0x20, 0xa3, 0x09, 0x24, 0x0b, 0xde, 0xf9, 0x7e, 0x2b, 0x5a, - 0x90, 0x81, 0x79, 0xe8, 0x97, 0xef, 0xc9, 0xa5, 0x49, 0xb1, 0x56, 0xa1, - 0xa6, 0xee, 0x3d, 0x82, 0x0f, 0x99, 0xd3, 0xdf, 0x0d, 0xed, 0xc9, 0xeb, - 0xc8, 0x6f, 0x17, 0x75, 0x7e, 0x3e, 0x32, 0x7b, 0xeb, 0x68, 0x4b, 0x16, - 0xc5, 0xdf, 0xc2, 0x82, 0x51, 0xe3, 0x3a, 0x67, 0xe6, 0x7d, 0x91, 0x89, - 0x9e, 0xd8, 0x46, 0xa4, 0xed, 0x31, 0xf1, 0x30, 0x2f, 0xf1, 0xbd, 0x27, - 0x42, 0x44, 0xfe, 0x98, 0x9d, 0x5c, 0x87, 0x29, 0xc3, 0x70, 0x8e, 0xd2, - 0xdd, 0xde, 0x65, 0xaf, 0x52, 0x9b, 0x97, 0xf6, 0x64, 0xb0, 0xf5, 0x08, - 0xc5, 0x33, 0x6c, 0xbb, 0x29, 0xfb, 0x3e, 0xfa, 0x5f, 0x95, 0x17, 0x2a, - 0xe0, 0xe1, 0x3e, 0x4f, 0x17, 0x90, 0xbf, 0x69, 0x61, 0x55, 0xc2, 0xa1, - 0x54, 0xb0, 0xeb, 0x98, 0xda, 0x49, 0x6a, 0xba, 0xd6, 0x42, 0xe0, 0x91, - 0xeb, 0xc7, 0xbd, 0x84, 0xe6, 0x89, 0x7e, 0xaa, 0x72, 0x16, 0x74, 0x38, - 0x1e, 0xb7, 0x54, 0x5a, 0xc4, 0x46, 0xde, 0x82, 0x3d, 0xcf, 0x9e, 0x77, - 0x77, 0xe8, 0x97, 0x32, 0x98, 0x07, 0x16, 0x85, 0xcc, 0x05, 0x03, 0xe5, - 0xa6, 0xed, 0x3f, 0x76, 0x36, 0xd6, 0x60, 0x5f, 0xe3, 0xda, 0x2a, 0x76, - 0xc2, 0x68, 0x2e, 0xbd, 0x34, 0x28, 0x82, 0x05, 0xa4, 0x50, 0x30, 0xd0, - 0x9a, 0x7c, 0x5e, 0xc9, 0xeb, 0x85, 0x8b, 0x52, 0xe8, 0x74, 0xa4, 0x7b, - 0x80, 0xa4, 0x5b, 0x2b, 0x58, 0xc8, 0x95, 0xdb, 0xcc, 0x1f, 0x2c, 0xb3, - 0x18, 0xf9, 0x33, 0xa3, 0xd1, 0xc7, 0xc4, 0x1e, 0x66, 0x1b, 0x4d, 0xff, - 0x01, 0xef, 0x0b, 0x5e, 0xe5, 0xec, 0xd9, 0x7d, 0x95, 0xaf, 0x59, 0x53, - 0x1b, 0xb4, 0x56, 0x6e, 0x78, 0x44, 0x82, 0x89, 0xa3, 0x5b, 0x6d, 0x7b, - 0x02, 0xa9, 0x4a, 0x39, 0x6c, 0x10, 0x9f, 0x9e, 0x23, 0x0f, 0x4f, 0x64, - 0xc7, 0xfc, 0x87, 0xcb, 0x50, 0x93, 0x24, 0xfe, 0x98, 0x07, 0xf5, 0x62, - 0x78, 0x69, 0x26, 0xf0, 0x6f, 0x77, 0xa4, 0xcc, 0x91, 0x5c, 0x42, 0x23, - 0xd1, 0x8e, 0xd8, 0x61, 0x64, 0xdf, 0x51, 0xa2, 0x4f, 0x74, 0xe1, 0x53, - 0xb2, 0x97, 0x7a, 0xc8, 0x79, 0x32, 0x3b, 0x80, 0x42, 0xf1, 0x2e, 0x40, - 0x06, 0xd4, 0xd7, 0x39, 0x92, 0x1e, 0x74, 0x5b, 0x45, 0x73, 0xb6, 0xeb, - 0x60, 0xf9, 0xbb, 0x64, 0x83, 0x1d, 0x65, 0xf5, 0xce, 0xd8, 0x6f, 0x0f, - 0xc3, 0xb1, 0x0b, 0xec, 0xac, 0x2d, 0x37, 0xd9, 0x5a, 0x78, 0xdc, 0x12, - 0xae, 0x1d, 0x19, 0x02, 0x84, 0x6e, 0x56, 0xc4, 0x06, 0x01, 0x6c, 0xb3, - 0xf4, 0x96, 0x33, 0x4c, 0xca, 0x66, 0xf9, 0xe0, 0x41, 0x33, 0x36, 0x10, - 0x72, 0xc5, 0x8a, 0x5a, 0xb5, 0x48, 0x0c, 0x12, 0xae, 0x66, 0x9e, 0xfe, - 0x6f, 0xd8, 0x5b, 0x7e, 0x88, 0xc1, 0x24, 0x90, 0xe3, 0x6e, 0x85, 0x69, - 0x18, 0x59, 0x02, 0xf6, 0x6a, 0x44, 0x02, 0x93, 0x15, 0x3b, 0xe1, 0xdc, - 0x94, 0x93, 0x61, 0x9e, 0xb6, 0x55, 0x95, 0xfa, 0x5b, 0x46, 0x52, 0x03, - 0x45, 0xa4, 0xde, 0x76, 0xa3, 0xb1, 0x6d, 0x49, 0x4d, 0xaa, 0xe0, 0x07, - 0xd8, 0xac, 0xd6, 0x02, 0x8e, 0xd9, 0xe0, 0xa3, 0xfe, 0xf2, 0x0c, 0xae, - 0x26, 0x1f, 0xd2, 0xb2, 0xc6, 0x69, 0x2c, 0xbc, 0x5d, 0x62, 0xa4, 0xe9, - 0x6e, 0xe1, 0x51, 0xd7, 0xe6, 0x48, 0x4d, 0x9b, 0x6f, 0xd2, 0xfc, 0x75, - 0x1e, 0x1b, 0xf8, 0xba, 0x88, 0x51, 0xb6, 0x80, 0x99, 0x11, 0xe4, 0x21, - 0xe9, 0x71, 0x53, 0xdc, 0x24, 0xcc, 0x0a, 0x99, 0x60, 0x9e, 0x90, 0x3e, - 0xb6, 0x86, 0x84, 0x46, 0x42, 0xfe, 0xcb, 0xab, 0x20, 0x6e, 0x5f, 0xdb, - 0xe5, 0x3a, 0xeb, 0x59, 0x60, 0x58, 0x8d, 0x21, 0xc3, 0xbc, 0xf4, 0xde, - 0x7f, 0x1a, 0x49, 0xe8, 0x7a, 0x6a, 0xbe, 0xc9, 0x9e, 0x33, 0x51, 0x23, - 0xd1, 0x8e, 0xd8, 0x61, 0x64, 0xdf, 0x51, 0xa2, 0x4f, 0x74, 0xe1, 0x53, - 0xb2, 0x97, 0x7a, 0xc8, 0x79, 0x32, 0x3b, 0x80, 0x6b, 0x1c, 0x02, 0x63, - 0xe1, 0x94, 0x95, 0x6f, 0x09, 0x08, 0x7b, 0x3d, 0x45, 0xf4, 0xc0, 0xf9, - 0x34, 0xe6, 0x77, 0xf5, 0x35, 0xd0, 0x35, 0x24, 0x71, 0x2b, 0xf4, 0xb0, - 0x38, 0xcd, 0x70, 0xb4, 0xa4, 0x2a, 0x28, 0xd3, 0x38, 0x07, 0xc8, 0x12, - 0xae, 0x1d, 0x19, 0x02, 0x84, 0x6e, 0x56, 0xc4, 0x36, 0x01, 0xb6, 0x6e, - 0x95, 0x5f, 0x23, 0x75, 0x7b, 0x18, 0x7c, 0xe6, 0x6a, 0xe9, 0x4b, 0x60, - 0x5e, 0xa8, 0x9a, 0xcd, 0x06, 0x78, 0x42, 0x99, 0x76, 0x2d, 0x6c, 0x4e, - 0x76, 0x88, 0xd0, 0xf3, 0xcd, 0x9f, 0x1e, 0xdb, 0x13, 0xa5, 0xac, 0xbc, - 0x0f, 0x7f, 0xff, 0xfa, 0x71, 0xd7, 0x37, 0x04, 0xe7, 0x29, 0x08, 0xf1, - 0xca, 0xee, 0xd2, 0x12, 0x2a, 0xa0, 0x8b, 0x26, 0x3b, 0xea, 0xb0, 0x0f, - 0x73, 0x40, 0xb0, 0xc0, 0x09, 0xb0, 0xb1, 0xcf, 0x28, 0x36, 0xed, 0xc1, - 0xd6, 0xd8, 0x63, 0xee, 0x7b, 0xc6, 0x65, 0x72, 0x30, 0xa5, 0x66, 0xef, - 0xc1, 0xca, 0x83, 0x83, 0x2a, 0x0e, 0x65, 0xb1, 0x5d, 0x62, 0xbc, 0xec, - 0x6d, 0x8f, 0x49, 0xc2, 0xfb, 0x52, 0x48, 0x94, 0x06, 0xc3, 0xfc, 0x75, - 0x1e, 0x1b, 0xf8, 0xba, 0x88, 0x51, 0xb6, 0x80, 0x99, 0x11, 0xe4, 0x21, - 0xe9, 0x71, 0x53, 0xdc, 0x70, 0x30, 0x84, 0x33, 0x70, 0x7a, 0x0c, 0x44, - 0xa5, 0xd1, 0xed, 0x24, 0xca, 0x14, 0xf6, 0xdf, 0xcb, 0xff, 0x03, 0xc2, - 0xad, 0x14, 0xad, 0x06, 0xdb, 0x16, 0x78, 0xa4, 0x45, 0xad, 0xca, 0xf0, - 0x85, 0x30, 0xba, 0x0f, 0x80, 0xee, 0xf4, 0xe3, 0x36, 0x89, 0x60, 0x8d, - 0xf4, 0xd5, 0x2d, 0x04, 0x4d, 0x4c, 0x11, 0xa6, 0xc2, 0x36, 0xed, 0x1e, - 0x65, 0xad, 0x68, 0xfd, 0x2c, 0x97, 0x18, 0x91, 0x5c, 0x34, 0xdf, 0xdb, - 0xab, 0x8b, 0x0b, 0x18, 0x28, 0x0d, 0xcb, 0xb2, 0x34, 0xca, 0xb9, 0xfb, - 0x99, 0x16, 0x05, 0x3a, 0x8f, 0x34, 0x79, 0x60, 0xf3, 0x7c, 0xe6, 0xe6, - 0x29, 0x1e, 0x57, 0xd6, 0xd9, 0xda, 0x96, 0xfb, 0xb4, 0xfe, 0xcf, 0x91, - 0xa5, 0x47, 0xb0, 0x2d, 0x3f, 0x0e, 0xb0, 0x10, 0xe9, 0xf5, 0xed, 0x9b, - 0x11, 0x6a, 0x60, 0x71, 0x38, 0x43, 0x6f, 0x4f, 0xf0, 0xb4, 0xef, 0x20, - 0x6e, 0xa6, 0xd3, 0x53, 0xd0, 0x4e, 0x87, 0x51, 0x31, 0x3f, 0xd7, 0x81, - 0xca, 0xb3, 0x10, 0x4e, 0x77, 0x15, 0x07, 0xfc, 0x09, 0xee, 0xd9, 0x28, - 0x19, 0x0f, 0xbc, 0x65, 0xb5, 0xbf, 0x3e, 0x45, 0x39, 0xd2, 0xca, 0x00, - 0x65, 0x73, 0x88, 0x23, 0x72, 0xf3, 0xe3, 0x94, 0x13, 0x5a, 0xc4, 0xad, - 0xd6, 0x3f, 0x48, 0xf0, 0x74, 0xfb, 0x2f, 0x29, 0xd6, 0xcf, 0x79, 0xec, - 0x38, 0xa6, 0x2f, 0xa2, 0xcb, 0xff, 0x03, 0xc2, 0xad, 0x14, 0xad, 0x06, - 0xdb, 0x09, 0x78, 0xa4, 0x45, 0xad, 0xca, 0xf0, 0x0b, 0x23, 0xe6, 0x61, - 0xe1, 0x09, 0x34, 0x09, 0x6c, 0xbb, 0xbb, 0x3c, 0xb8, 0x03, 0x67, 0x20, - 0xe8, 0xb0, 0xd7, 0x61, 0x7a, 0xfe, 0x66, 0xd2, 0x3e, 0xdb, 0x10, 0x7e, - 0x96, 0x2d, 0xcc, 0x6c, 0xef, 0xb2, 0xe7, 0x6b, 0x64, 0x5e, 0xf8, 0x2e, - 0xe7, 0x06, 0x0d, 0xb1, 0x54, 0x51, 0xe1, 0x54, 0x0e, 0xb6, 0xfc, 0x5f, - 0x13, 0x99, 0xb6, 0xae, 0x0f, 0xaf, 0x02, 0xff, 0x80, 0x54, 0x7e, 0x25, - 0xd9, 0xdb, 0x96, 0xfb, 0xb4, 0xfe, 0xcf, 0x91, 0xa5, 0x47, 0xb0, 0x2d, - 0x3f, 0x0e, 0xb0, 0x10, 0xe9, 0xf5, 0xed, 0x9b, 0x11, 0x6a, 0x60, 0x71, - 0x38, 0x43, 0x6f, 0x4f, 0xf0, 0xb4, 0xef, 0x20, 0x51, 0x2a, 0x56, 0xd4, - 0x43, 0xe4, 0xda, 0x5e, 0x7a, 0xe9, 0x45, 0xf8, 0x5b, 0x76, 0xec, 0x99, - 0x77, 0x15, 0x08, 0xe1, 0x1d, 0xf2, 0xae, 0x25, 0x11, 0x08, 0xa3, 0x6f, - 0xd7, 0xc0, 0x2d, 0x45, 0x39, 0xd2, 0xca, 0x00, 0x65, 0x73, 0x88, 0x23, - 0x72, 0xf3, 0xe3, 0x94, 0x13, 0x5a, 0xc4, 0xad, 0x35, 0xdf, 0x4f, 0xfa, - 0x4d, 0x84, 0xc4, 0x36, 0xae, 0xce, 0xd9, 0x1b, 0x13, 0xdd, 0xc1, 0xab, - 0xb6, 0xba, 0xc8, 0xe1, 0x5d, 0xac, 0xf3, 0x8e, 0x7d, 0x28, 0x1d, 0xeb, - 0xfc, 0xd5, 0x6e, 0x9b, 0xb0, 0xec, 0x38, 0x8d, 0xc7, 0x90, 0xa4, 0xe9, - 0x2e, 0xc6, 0x4d, 0xa0, 0x70, 0x56, 0xc8, 0xd4, 0x1d, 0x4e, 0xe7, 0xe0, - 0x6b, 0xad, 0x18, 0xa6, 0x20, 0x9b, 0xe3, 0x77, 0x0e, 0x88, 0x0a, 0xc5, - 0xe2, 0x6b, 0xe5, 0x3b, 0xce, 0x86, 0x8a, 0xe7, 0xed, 0x25, 0x23, 0xb8, - 0xab, 0xbf, 0x40, 0x62, 0x21, 0x89, 0x14, 0xeb, 0x16, 0x58, 0xf1, 0x14, - 0x4c, 0x6a, 0x75, 0x8c, 0x84, 0xd1, 0x99, 0x2c, 0xbc, 0xd7, 0xc0, 0xd6, - 0x1a, 0x10, 0x35, 0xac, 0x7c, 0x69, 0x77, 0xfe, 0xab, 0x22, 0x23, 0xe1, - 0x93, 0x70, 0x84, 0x56, 0x51, 0x3b, 0x77, 0x70, 0x7c, 0xa2, 0x67, 0xcf, - 0xfc, 0x0d, 0x64, 0x03, 0x23, 0x0c, 0x3c, 0xc3, 0x80, 0x18, 0x41, 0x22, - 0x70, 0xe5, 0x81, 0xc9, 0x61, 0x94, 0x97, 0x21, 0x45, 0x6f, 0x8e, 0x23, - 0x56, 0x67, 0x0a, 0xfd, 0x55, 0x0c, 0x26, 0x04, 0x13, 0xbe, 0xb3, 0x37, - 0xb0, 0xca, 0x96, 0xfb, 0xb4, 0xfe, 0xcf, 0x91, 0xa5, 0x47, 0xb0, 0x2d, - 0x3f, 0x0e, 0xb0, 0x10, 0x1a, 0xd3, 0x81, 0x9f, 0x5d, 0x3f, 0xba, 0x1e, - 0xbf, 0x3b, 0x98, 0x2b, 0xca, 0xd2, 0x91, 0x7b, 0xe7, 0xa5, 0x1f, 0xce, - 0xea, 0x37, 0x78, 0x85, 0x2c, 0xeb, 0x3c, 0x5c, 0x37, 0xbf, 0xf0, 0x4d, - 0x42, 0x9a, 0x15, 0x73, 0x24, 0xde, 0xc1, 0x21, 0x1d, 0x15, 0xce, 0x07, - 0x8e, 0x13, 0x8f, 0xc2, 0xed, 0x64, 0xbf, 0xba, 0x06, 0xbd, 0x53, 0x81, - 0x34, 0x07, 0xbf, 0x57, 0x46, 0x46, 0x32, 0x06, 0x0b, 0x35, 0xe2, 0x99, - 0x14, 0x3f, 0xb9, 0x07, 0x7e, 0x8d, 0xa4, 0x6c, 0xaf, 0xa8, 0xf9, 0xb1, - 0x18, 0x19, 0x6f, 0x02, 0x9f, 0x2f, 0xab, 0x53, 0x9d, 0x77, 0xf8, 0xda, - 0x69, 0x49, 0xf2, 0x84, 0xea, 0x94, 0x12, 0x89, 0x47, 0x03, 0x6c, 0x4f, - 0x00, 0x16, 0xc7, 0x27, 0x95, 0x5a, 0x97, 0x7b, 0xeb, 0x80, 0x03, 0x00, - 0x8c, 0xb9, 0xf8, 0x75, 0x17, 0xfb, 0x13, 0x2d, 0x8a, 0x7e, 0xcb, 0x6c, - 0x9b, 0x79, 0xb9, 0xde, 0xbb, 0x94, 0xd2, 0xda, 0xaf, 0x36, 0x4d, 0x45, - 0x86, 0x7d, 0x97, 0x75, 0x69, 0xdd, 0xd0, 0x3f, 0x15, 0x73, 0x31, 0x3e, - 0x6c, 0xa0, 0x38, 0xcb, 0x02, 0x8a, 0x8e, 0x20, 0xca, 0x07, 0x0c, 0x37, - 0x7d, 0x22, 0x3e, 0xe0, 0x88, 0x24, 0x2f, 0xc5, 0x15, 0x28, 0xe7, 0x0f, - 0x21, 0xc3, 0x95, 0xe5, 0xa4, 0x58, 0xa7, 0x6b, 0xd1, 0xa3, 0x94, 0x94, - 0xea, 0xd3, 0x19, 0xba, 0xfc, 0xdf, 0xe5, 0x3f, 0x1e, 0x9e, 0xc9, 0xb7, - 0x0b, 0x31, 0x9f, 0xc0, 0xa6, 0x14, 0xb8, 0xf6, 0x45, 0xc2, 0x46, 0x30, - 0x15, 0xb5, 0x59, 0x79, 0xc3, 0x9e, 0x18, 0xcc, 0xda, 0x32, 0x11, 0x5e, - 0xa6, 0x3f, 0xf8, 0xdb, 0x8b, 0x9f, 0x12, 0x59, 0xa0, 0x87, 0x12, 0x01, - 0xec, 0xa3, 0x5d, 0xd8, 0x77, 0xe9, 0x11, 0x7c, 0xd5, 0x23, 0x2a, 0x97, - 0x19, 0xee, 0x1d, 0x53, 0x01, 0x3e, 0x5b, 0x7e, 0x9d, 0x25, 0x1f, 0x84, - 0x68, 0xc2, 0x41, 0x12, 0xd0, 0x8d, 0xc5, 0x98, 0xb8, 0xc4, 0x47, 0x62, - 0xa2, 0xd4, 0x61, 0x2a, 0x2d, 0x32, 0x41, 0x7c, 0x66, 0x0c, 0xed, 0x65, - 0xe4, 0x1b, 0xc8, 0x5f, 0x7a, 0x68, 0xc5, 0x6e, 0x1b, 0x6c, 0xe3, 0xc2, - 0xb9, 0x8a, 0x84, 0x5f, 0xa8, 0x18, 0x3b, 0x21, 0x26, 0xa6, 0x70, 0xd0, - 0xe4, 0x42, 0x26, 0xf1, 0x58, 0x46, 0xbd, 0x9c, 0x77, 0x5c, 0x74, 0x4a, - 0x18, 0x59, 0x8a, 0x99, 0x5a, 0x07, 0xf4, 0x16, 0x36, 0x5c, 0x53, 0x07, - 0xca, 0x39, 0xe4, 0xb1, 0x41, 0xdd, 0x25, 0xf0, 0x70, 0xd0, 0x0b, 0x58, - 0x7e, 0xb8, 0xc8, 0x79, 0xc8, 0xdb, 0x7c, 0x52, 0xe0, 0x5c, 0x53, 0xed, - 0x5d, 0x98, 0x72, 0x7c, 0x04, 0x50, 0x7d, 0xe9, 0x46, 0x67, 0xbd, 0x69, - 0xe7, 0x9f, 0x07, 0x34, 0x26, 0x48, 0x3f, 0x86, 0x19, 0xe5, 0x29, 0x54, - 0x07, 0xe8, 0xce, 0xfd, 0xcb, 0xd2, 0x6e, 0x7f, 0xc2, 0x4e, 0xcd, 0xb6, - 0xa9, 0x5b, 0x89, 0x0d, 0x0e, 0x17, 0x19, 0xb0, 0x36, 0xe1, 0xf8, 0xd4, - 0xcf, 0x0b, 0xbe, 0x8a, 0x0a, 0x24, 0x56, 0xa7, 0x12, 0x13, 0x46, 0xdd, - 0xdb, 0x09, 0x9e, 0x17, 0x58, 0x50, 0x89, 0xc6, 0x2c, 0x62, 0x97, 0x23, - 0xab, 0x5c, 0x1a, 0x98, 0xbf, 0xea, 0x7c, 0x10, 0x5d, 0x1a, 0x53, 0xef, - 0xef, 0x08, 0x70, 0x91, 0x2a, 0xb4, 0xbc, 0x31, 0xa0, 0x57, 0xf9, 0x27, - 0x87, 0x3d, 0x83, 0xdf, 0x4e, 0x05, 0xed, 0x9b, 0xca, 0x6a, 0x9d, 0x23, - 0x24, 0xf9, 0xea, 0x7d, 0xd7, 0xf7, 0x7a, 0xaf, 0x3c, 0xa5, 0xc6, 0x46, - 0x69, 0x93, 0x84, 0x5c, 0x5e, 0x30, 0x03, 0x97, 0x60, 0x99, 0x91, 0x5e, - 0x3f, 0x4e, 0x6b, 0x7b, 0x68, 0xc1, 0xc5, 0x7e, 0xdf, 0x76, 0xd8, 0xa4, - 0xd7, 0xdc, 0xd5, 0xd5, 0xfb, 0xfe, 0x6d, 0x60, 0xd2, 0xa0, 0x27, 0xf3, - 0x0b, 0x46, 0xc9, 0x0e, 0x15, 0x5b, 0xcc, 0xb8, 0x33, 0x89, 0x40, 0x34, - 0x53, 0x2a, 0x37, 0x52, 0xf1, 0x28, 0x26, 0x88, 0x40, 0xab, 0xe3, 0xb6, - 0x7b, 0xeb, 0xe2, 0x9d, 0xfc, 0xb4, 0xd1, 0xf6, 0xb1, 0x38, 0x10, 0xfa, - 0xff, 0x61, 0x31, 0x7b, 0xe4, 0x63, 0xe1, 0x4a, 0x0e, 0x98, 0x61, 0x33, - 0x54, 0xed, 0x19, 0xb0, 0xc4, 0x7f, 0x68, 0xd0, 0xb0, 0xaa, 0x9b, 0xa1, - 0x2a, 0xcf, 0x90, 0x00, 0xd9, 0x81, 0x66, 0x8a, 0xba, 0x1c, 0x59, 0x36, - 0xb0, 0xd9, 0x89, 0xf5, 0xdd, 0x50, 0x2a, 0x7e, 0x89, 0x81, 0xac, 0x0a, - 0xcc, 0x78, 0xf7, 0xa0, 0x6e, 0xfb, 0x20, 0xa9, 0x1a, 0x53, 0x89, 0x25, - 0x4a, 0xeb, 0xa8, 0x12, 0x34, 0xe5, 0xcd, 0xdf, 0x9f, 0xc2, 0x1a, 0x17, - 0x91, 0x1b, 0xb5, 0x2c, 0xcf, 0xa4, 0xf7, 0xb4, 0x52, 0xdb, 0x89, 0x3c, - 0x77, 0xdb, 0x9c, 0x08, 0x59, 0x17, 0xf3, 0x54, 0xb1, 0xe5, 0x2e, 0xe1, - 0xc6, 0x0a, 0x8d, 0xbe, 0xc9, 0x8f, 0xb1, 0xdd, 0xc5, 0x05, 0xce, 0x5c, - 0x56, 0xbc, 0xd6, 0x63, 0xa9, 0x16, 0x8e, 0xbf, 0xf2, 0x00, 0x88, 0xbe, - 0xba, 0x04, 0xc1, 0x2f, 0x94, 0x38, 0x02, 0x6b, 0x01, 0x5b, 0xad, 0xdc, - 0xbd, 0xf0, 0x47, 0xbf, 0x84, 0x83, 0x70, 0x8e, 0x2a, 0x73, 0xc3, 0x9d, - 0x63, 0x4a, 0x43, 0x74, 0x82, 0xf6, 0x45, 0x5d, 0xd6, 0x28, 0x7c, 0xd6, - 0xf1, 0x66, 0x88, 0x48, 0xbf, 0x76, 0x15, 0xfa, 0x83, 0xeb, 0x57, 0x08, - 0xfe, 0x25, 0x71, 0x34, 0x30, 0x92, 0xf7, 0x06, 0xd8, 0x8f, 0x00, 0x9d, - 0xac, 0x8f, 0x97, 0x2d, 0x36, 0xc6, 0x16, 0x43, 0x44, 0xa4, 0x59, 0x19, - 0x74, 0xff, 0x81, 0x60, 0xc5, 0xd8, 0x7a, 0xe7, 0xe4, 0x5d, 0xc7, 0x68, - 0xf8, 0xa0, 0xd2, 0x7c, 0x96, 0x61, 0x49, 0xa4, 0xec, 0x1d, 0x0f, 0x5f, - 0x31, 0x67, 0x24, 0xfe, 0x3a, 0x27, 0x92, 0x16, 0xfd, 0xa1, 0x77, 0xa3, - 0x12, 0x95, 0x60, 0x8a, 0x90, 0x2f, 0x95, 0x63, 0x1d, 0xb1, 0x18, 0xff, - 0xfc, 0xbb, 0x4f, 0x85, 0x54, 0x79, 0xb1, 0x9a, 0x4e, 0x0a, 0xfc, 0x4b, - 0xe0, 0xce, 0xbf, 0x94, 0x1c, 0x02, 0xd0, 0x23, 0xc5, 0x08, 0x2f, 0xf7, - 0x39, 0x15, 0xdd, 0x18, 0x0c, 0xdf, 0xee, 0xce, 0xbf, 0x7d, 0x14, 0x5b, - 0x4a, 0xb2, 0x39, 0x24, 0x13, 0x58, 0xf1, 0x39, 0x5b, 0x19, 0x3a, 0xb0, - 0x7e, 0x79, 0xf4, 0x85, 0x54, 0xa8, 0xa9, 0xfe, 0xe0, 0xb7, 0xfb, 0x8b, - 0xa8, 0xbf, 0x65, 0x7b, 0x16, 0x93, 0xfd, 0x6e, 0xcb, 0x96, 0x55, 0x69, - 0x82, 0x5b, 0x23, 0xfb, 0x94, 0x38, 0x02, 0x6b, 0x01, 0x5b, 0xad, 0xdc, - 0xed, 0x64, 0x47, 0xbf, 0x84, 0x83, 0x70, 0x8e, 0x56, 0xbc, 0xd6, 0x63, - 0xa9, 0x16, 0x8e, 0xbf, 0xaa, 0x94, 0x88, 0xbe, 0xba, 0x04, 0xc1, 0x2f, - 0x19, 0x4b, 0x25, 0x3f, 0x51, 0xa3, 0xd3, 0x57, 0x89, 0x44, 0x1f, 0x54, - 0x6e, 0xa9, 0x71, 0x6c, 0x2f, 0x74, 0x52, 0x4f, 0xa8, 0x99, 0x38, 0xc8, - 0x22, 0x03, 0x43, 0xf4, 0xe7, 0x77, 0x05, 0x65, 0x38, 0xd1, 0x08, 0x04, - 0xa4, 0x0a, 0x8a, 0x6e, 0xce, 0xe8, 0xe4, 0x29, 0x68, 0x96, 0xe8, 0x5a, - 0xa1, 0x7f, 0x5d, 0xc0, 0x57, 0x02, 0x98, 0xb2, 0x43, 0x19, 0xf4, 0x2a, - 0x39, 0xe4, 0x93, 0x82, 0x38, 0xaa, 0x5e, 0x35, 0x30, 0xd9, 0xf3, 0x5d, - 0x38, 0xcc, 0x33, 0x24, 0x9b, 0x1d, 0xa3, 0x3d, 0x19, 0xea, 0xd8, 0x9d, - 0xe1, 0x99, 0xaf, 0x4f, 0x1b, 0x78, 0xbd, 0x07, 0xa7, 0xfb, 0x1b, 0x3e, - 0x63, 0x60, 0x25, 0xae, 0x99, 0xcc, 0xe2, 0x6a, 0x77, 0xac, 0x18, 0xc9, - 0x34, 0x17, 0x6e, 0x9c, 0x07, 0x8b, 0x6c, 0xac, 0xb2, 0x86, 0xd1, 0x6e, - 0x6b, 0xe9, 0x86, 0x14, 0x50, 0xc3, 0xff, 0xce, 0xc5, 0x30, 0xc6, 0xbd, - 0xe0, 0xd7, 0x1e, 0x2c, 0xcd, 0x71, 0xb9, 0xca, 0xfd, 0xca, 0xf4, 0x97, - 0xab, 0x66, 0x52, 0x7f, 0x44, 0xc2, 0x97, 0xda, 0x37, 0x11, 0xf6, 0xcf, - 0x8b, 0x1c, 0x72, 0x39, 0x91, 0x9f, 0x6f, 0xec, 0xa8, 0x73, 0x29, 0xf2, - 0x2b, 0x37, 0xf0, 0x6b, 0x27, 0x12, 0xc2, 0xab, 0x78, 0xf7, 0xa9, 0x51, - 0x12, 0x61, 0x16, 0x26, 0xb3, 0xee, 0x6f, 0x20, 0xd3, 0x47, 0xf4, 0x77, - 0x76, 0xb8, 0x03, 0x77, 0x99, 0xd3, 0x9a, 0x5d, 0x12, 0x83, 0xf5, 0xaf, - 0x10, 0xda, 0xc1, 0xa9, 0x54, 0xb0, 0x17, 0x3e, 0xa6, 0x26, 0x9c, 0x62, - 0xa6, 0x33, 0x4d, 0xb8, 0xc2, 0xd9, 0xc2, 0x81, 0x41, 0xaa, 0xaf, 0xb9, - 0xe3, 0xa9, 0xbc, 0x58, 0xf1, 0x2c, 0xb4, 0x8e, 0x2a, 0xd6, 0xdf, 0xee, - 0x99, 0x26, 0xdb, 0x67, 0x9e, 0x8b, 0x8a, 0xb9, 0x0b, 0xc8, 0x73, 0x2d, - 0x2c, 0xba, 0xc8, 0x6b, 0xd2, 0x7e, 0xf7, 0x7b, 0x26, 0xae, 0x3f, 0xb2, - 0xd4, 0x55, 0x1e, 0x57, 0x47, 0x2b, 0x74, 0xbe, 0x11, 0x34, 0x20, 0xa9, - 0xd4, 0xba, 0x21, 0xf8, 0xb1, 0x68, 0xba, 0x2b, 0xa5, 0xf8, 0x62, 0x7f, - 0x6d, 0x08, 0x88, 0xac, 0xbe, 0xca, 0xb3, 0x98, 0x46, 0xb8, 0x40, 0xab, - 0xee, 0x8e, 0xfb, 0xc0, 0x37, 0x58, 0x1c, 0x9e, 0x2d, 0x70, 0x90, 0x41, - 0x0a, 0x0d, 0xdc, 0x72, 0xd1, 0x4a, 0xe2, 0x65, 0x88, 0xcd, 0xc1, 0x71, - 0x06, 0x06, 0x0b, 0x64, 0x28, 0xe5, 0x63, 0xff, 0xd0, 0x95, 0x3d, 0xe7, - 0x75, 0x46, 0x85, 0x12, 0x09, 0x6e, 0x06, 0x6d, 0x41, 0x75, 0x16, 0x6d, - 0x55, 0x68, 0x30, 0xb8, 0xa1, 0x72, 0x16, 0x88, 0x99, 0x28, 0xdf, 0xfa, - 0x80, 0xcc, 0xc7, 0xf4, 0xbb, 0x59, 0xb9, 0x37, 0x89, 0x31, 0x4a, 0x22, - 0x65, 0xed, 0x52, 0xb1, 0x84, 0xb2, 0x15, 0xde, 0xf3, 0x71, 0xad, 0xad, - 0xfd, 0x70, 0x75, 0x42, 0x9c, 0xc3, 0x9a, 0x1f, 0x28, 0x20, 0x45, 0xea, - 0x01, 0x0f, 0xc0, 0x26, 0x26, 0x56, 0xb0, 0x16, 0x0d, 0x23, 0x96, 0xd6, - 0xe4, 0x82, 0x3a, 0x3d, 0x4d, 0x7a, 0x46, 0x0a, 0x4e, 0xc0, 0x58, 0x91, - 0xd9, 0x2b, 0xc1, 0xe4, 0xd8, 0x39, 0xe4, 0x7b, 0x92, 0x0d, 0xde, 0x14, - 0x62, 0xcf, 0xae, 0x63, 0x1d, 0xd1, 0x9c, 0x3c, 0x8e, 0x70, 0x1e, 0xac, - 0x2f, 0x24, 0x46, 0x7b, 0xed, 0xdf, 0x0d, 0x2c, 0x25, 0x48, 0xd3, 0xf5, - 0x31, 0x67, 0x40, 0x5a, 0x89, 0x8c, 0xae, 0x41, 0x0d, 0x20, 0x06, 0xb8, - 0xaa, 0x1e, 0xbf, 0x47, 0xbb, 0x77, 0xec, 0xd4, 0xa0, 0xcd, 0x74, 0x26, - 0x3d, 0x23, 0x0c, 0xb7, 0x5e, 0xd7, 0x7c, 0x79, 0xf4, 0xa0, 0xc3, 0xe5, - 0xbf, 0x47, 0xbc, 0x7b, 0x89, 0xb1, 0xf9, 0xd8, 0x36, 0x99, 0x6d, 0xf5, - 0x27, 0xf5, 0x36, 0x23, 0x3b, 0xd0, 0xf3, 0x07, 0x11, 0x34, 0x27, 0xaa, - 0xd4, 0xb2, 0x21, 0xf3, 0xb1, 0x68, 0xba, 0x2b, 0xa5, 0xf8, 0x62, 0x7f, - 0x35, 0x64, 0x72, 0xfb, 0x6c, 0xdc, 0xed, 0xbc, 0x91, 0x16, 0x01, 0x0d, - 0xf7, 0x0b, 0x1c, 0x0e, 0x37, 0x58, 0x1c, 0x9e, 0x2d, 0x70, 0x90, 0x41, - 0x0a, 0x7a, 0xdb, 0x02, 0xd1, 0x4a, 0xe2, 0x65, 0x30, 0xfc, 0xae, 0xbe, - 0xb3, 0x3f, 0x78, 0x41, 0x0e, 0x18, 0xf2, 0x5a, 0x31, 0x40, 0x01, 0xee, - 0x75, 0x4f, 0x85, 0x1d, 0x09, 0x6e, 0x06, 0xed, 0x43, 0x77, 0x16, 0x6d, - 0x55, 0x68, 0x30, 0xb8, 0xbe, 0xe9, 0x37, 0x38, 0x2c, 0xe6, 0xcd, 0x5b, - 0x7c, 0xc8, 0xae, 0xa4, 0x34, 0xc2, 0xc2, 0x65, 0xce, 0x2f, 0x25, 0x27, - 0x13, 0x76, 0x70, 0x3c, 0x34, 0x87, 0x61, 0xa3, 0x8c, 0xdf, 0x70, 0x20, - 0x91, 0xe1, 0xb9, 0x62, 0x9c, 0x81, 0x5a, 0xc5, 0x91, 0xf8, 0x24, 0x8f, - 0x34, 0xad, 0xa5, 0xbc, 0xe0, 0x82, 0x7b, 0xee, 0x81, 0xbc, 0xc1, 0x41, - 0x4b, 0x39, 0x87, 0xd3, 0x1e, 0x0b, 0xbe, 0x95, 0xaa, 0x6a, 0x7c, 0x86, - 0xd6, 0xb5, 0x77, 0xf7, 0x52, 0xef, 0x4f, 0x87, 0x17, 0xce, 0x52, 0x55, - 0x3a, 0xaf, 0x64, 0x62, 0x7f, 0x58, 0x5e, 0x9f, 0x27, 0xa7, 0x4d, 0xd8, - 0xb9, 0x35, 0xa9, 0x11, 0x1d, 0x41, 0xbe, 0x6d, 0x7c, 0x77, 0x0a, 0x2f, - 0x9c, 0x5e, 0xd7, 0x84, 0x51, 0xaf, 0x65, 0x99, 0xa7, 0xf3, 0xdf, 0x4c, - 0xd9, 0x18, 0x4e, 0x32, 0xae, 0x33, 0x53, 0x7f, 0xad, 0xe9, 0x4a, 0xd1, - 0x1a, 0x5a, 0xce, 0x10, 0x67, 0x1d, 0xf1, 0x75, 0x7b, 0x92, 0x68, 0x7f, - 0xd7, 0xe0, 0xf8, 0xbe, 0xf6, 0xb9, 0xb2, 0xa1, 0x99, 0x5f, 0xf2, 0x8a, - 0xf9, 0xf8, 0xd9, 0x1a, 0xe8, 0xca, 0xe4, 0x71, 0xcd, 0xc4, 0x64, 0x56, - 0x88, 0x7b, 0x36, 0xef, 0x74, 0x96, 0x11, 0xce, 0x6e, 0xbb, 0xb8, 0x91, - 0xb1, 0x9f, 0xf7, 0xe3, 0x35, 0x3b, 0xb4, 0x36, 0x26, 0xd3, 0xe5, 0xe8, - 0x54, 0x37, 0x29, 0x4f, 0xef, 0x15, 0xb1, 0x3b, 0xcb, 0x89, 0x8b, 0x1e, - 0x9f, 0x2e, 0x1b, 0xe1, 0x55, 0xc8, 0xba, 0xd1, 0xd9, 0x8e, 0x71, 0x14, - 0x7c, 0x73, 0x9b, 0x5f, 0xd9, 0xae, 0x90, 0x3c, 0xa7, 0x5c, 0x20, 0xac, - 0x80, 0xb0, 0x31, 0x88, 0xae, 0x60, 0x1e, 0x5f, 0xa9, 0x5d, 0x91, 0xe7, - 0x02, 0x47, 0x6a, 0x67, 0xf3, 0xad, 0xdc, 0xfa, 0xa4, 0x26, 0x05, 0x68, - 0x8e, 0x07, 0xd3, 0x0a, 0x3a, 0xd0, 0x9f, 0xb8, 0xca, 0x16, 0x00, 0xbb, - 0xbd, 0xa8, 0x15, 0x3c, 0x07, 0x3c, 0x6b, 0xa6, 0x3c, 0x28, 0xab, 0xb7, - 0x3e, 0xd3, 0x22, 0x25, 0xdd, 0x54, 0x02, 0x93, 0xce, 0xf1, 0xc5, 0xc9, - 0x5a, 0x3d, 0xd8, 0xb2, 0x64, 0x07, 0x67, 0x79, 0x68, 0x26, 0xe7, 0x89, - 0x0a, 0x59, 0x9c, 0x9f, 0xa8, 0xf6, 0x76, 0x20, 0x6d, 0xf0, 0x99, 0x59, - 0xd6, 0x6b, 0x68, 0xb1, 0x71, 0x4f, 0xa1, 0xbe, 0x27, 0x32, 0x9f, 0xc9, - 0x3c, 0xd3, 0xbd, 0x18, 0xa7, 0x6a, 0x6d, 0x87, 0x18, 0xf2, 0x52, 0x93, - 0x52, 0x47, 0xa6, 0x63, 0xe8, 0xa7, 0xf3, 0xf4, 0x67, 0xeb, 0x66, 0x6f, - 0x13, 0x03, 0xf5, 0xbb, 0x5a, 0x13, 0x74, 0x7a, 0x0f, 0x22, 0x06, 0xb8, - 0xaa, 0x1e, 0xbf, 0x47, 0x55, 0x99, 0xec, 0xd4, 0xa0, 0xef, 0x74, 0x26, - 0x35, 0xf5, 0xa1, 0xc9, 0xa2, 0x4d, 0xbf, 0x51, 0x9c, 0xd6, 0x87, 0x25, - 0xe9, 0x79, 0xd0, 0x72, 0x36, 0x5c, 0xa1, 0xbc, 0xeb, 0x64, 0xf4, 0x93, - 0xc4, 0x5f, 0x4e, 0x22, 0x14, 0xc6, 0x12, 0x81, 0xc4, 0xc2, 0x60, 0x54, - 0x88, 0x6d, 0x36, 0xf7, 0x74, 0x96, 0x11, 0xce, 0x6c, 0xeb, 0x98, 0x90, - 0xdd, 0xc9, 0xb0, 0xc3, 0x35, 0x20, 0xb6, 0x56, 0xf7, 0x23, 0xa7, 0x6a, - 0x96, 0x9b, 0xc3, 0x47, 0xae, 0x40, 0x79, 0x31, 0xa8, 0x97, 0x53, 0x9a, - 0x12, 0xac, 0x17, 0x50, 0xd6, 0xe7, 0xa1, 0x48, 0xc4, 0x60, 0xb6, 0x90, - 0x8c, 0xed, 0xf0, 0xf1, 0x08, 0x39, 0xe7, 0xb5, 0x15, 0x37, 0xa3, 0xaa, - 0x80, 0xb8, 0x31, 0x83, 0xae, 0x60, 0x1e, 0x5f, 0xa9, 0x0f, 0x91, 0xe7, - 0x02, 0x47, 0x6a, 0x67, 0xbb, 0xaf, 0x49, 0xa0, 0x9b, 0xb1, 0x15, 0x2e, - 0xf1, 0xea, 0x99, 0xd3, 0xd4, 0xb8, 0xc5, 0x3d, 0x60, 0xc4, 0x5c, 0x68, - 0xd2, 0x0e, 0x02, 0x46, 0x11, 0x43, 0x09, 0x88, 0xaf, 0x27, 0x31, 0xdb, - 0x09, 0xb7, 0x27, 0x24, 0xc1, 0x88, 0x6d, 0x16, 0x03, 0xc2, 0x76, 0xb8, - 0x67, 0xf0, 0xf8, 0xa0, 0x36, 0xf5, 0xf9, 0xca, 0x55, 0x47, 0x6d, 0x87, - 0xeb, 0x9a, 0xe5, 0x9d, 0x18, 0x6b, 0xc4, 0x83, 0xa6, 0xa2, 0x92, 0xf1, - 0x77, 0xf5, 0x65, 0x4b, 0x63, 0x94, 0x45, 0xbc, 0x5a, 0x56, 0x76, 0x30, - 0xcb, 0xb6, 0x73, 0x39, 0xee, 0x13, 0xbd, 0x0b, 0xdc, 0x22, 0x4e, 0xbe, - 0x68, 0xe4, 0x1d, 0x80, 0x83, 0xb0, 0xb2, 0x88, 0xea, 0xb7, 0x61, 0x0e, - 0x73, 0x49, 0xf3, 0xc7, 0x32, 0xaf, 0x16, 0x20, 0x96, 0x2a, 0x14, 0xaa, - 0x46, 0xe8, 0xf4, 0xf1, 0x3d, 0x06, 0xee, 0xe4, 0x30, 0xd0, 0x7c, 0x7b, - 0x56, 0xaf, 0x8e, 0xd8, 0x0d, 0x62, 0xbb, 0x33, 0x2b, 0x39, 0x9c, 0xd4, - 0xce, 0x51, 0x68, 0xbc, 0xab, 0xe8, 0x3b, 0xb1, 0x56, 0x88, 0x65, 0x6a, - 0x68, 0xc5, 0x4c, 0x7a, 0x4f, 0xcc, 0x68, 0x46, 0xac, 0x4a, 0x33, 0x7d, - 0x75, 0x36, 0xc8, 0x9a, 0x4a, 0x35, 0xf6, 0xae, 0xc9, 0x89, 0x77, 0x85, - 0xac, 0x71, 0x18, 0x63, 0x97, 0x1d, 0x5a, 0x18, 0xd3, 0xfc, 0x33, 0x41, - 0xc1, 0xca, 0x9b, 0x15, 0x52, 0xe2, 0x62, 0xe6, 0x2f, 0x27, 0x49, 0xc0, - 0x7b, 0xcd, 0x9f, 0x78, 0xd7, 0x97, 0xff, 0xce, 0x88, 0x52, 0x3d, 0x1f, - 0xd8, 0x11, 0x85, 0x15, 0x87, 0x41, 0x80, 0x27, 0xfc, 0x91, 0xba, 0x5c, - 0x80, 0xad, 0x31, 0x94, 0xae, 0x60, 0x1e, 0x5f, 0xab, 0x0f, 0xb1, 0xe6, - 0x02, 0x47, 0x6a, 0x67, 0xf3, 0xad, 0xdc, 0xfa, 0xa4, 0x26, 0x05, 0x68, - 0x8e, 0x07, 0xd3, 0x0a, 0x3a, 0xd0, 0x9f, 0xb8, 0x6d, 0x1a, 0x46, 0x9e, - 0x23, 0x2c, 0x03, 0x72, 0xd6, 0xe0, 0x1f, 0xcd, 0x23, 0x60, 0xc0, 0x11, - 0x44, 0xa7, 0x02, 0xb5, 0x19, 0xae, 0xfd, 0x6d, 0x1e, 0x38, 0x31, 0xcd, - 0xd3, 0x89, 0x1b, 0x5b, 0x64, 0x07, 0x67, 0x79, 0x6a, 0x26, 0xe7, 0x89, - 0x0a, 0x59, 0x9c, 0x9f, 0xa8, 0xf6, 0x76, 0x20, 0xd5, 0x83, 0xab, 0x5d, - 0xb2, 0x64, 0x17, 0xf4, 0x53, 0xd0, 0x07, 0xff, 0x28, 0x90, 0xd4, 0x26, - 0x5a, 0x0d, 0xeb, 0x4d, 0x27, 0x3e, 0xb7, 0x52, 0xf7, 0x3b, 0x71, 0x46, - 0x45, 0x10, 0xa0, 0x4d, 0xf6, 0xa7, 0xf3, 0xf4, 0x68, 0xeb, 0x66, 0x6f, - 0x13, 0x0e, 0xf5, 0xb8, 0x5a, 0x13, 0x74, 0x7a, 0x78, 0xbf, 0x3b, 0x17, - 0x09, 0x9d, 0x37, 0xeb, 0xe1, 0xb7, 0x16, 0x2f, 0x88, 0x83, 0xab, 0xb6, - 0x35, 0xf5, 0xa1, 0xc9, 0xa2, 0x4d, 0xbf, 0x51, 0x9c, 0xd6, 0x87, 0x2d, - 0xe9, 0x68, 0xd7, 0x02, 0xb6, 0xd7, 0x0c, 0xba, 0x1d, 0xb0, 0xf7, 0xa8, - 0xb4, 0x1f, 0x60, 0xa9, 0xc7, 0x56, 0x08, 0x64, 0xc4, 0xc2, 0x60, 0x54, - 0x88, 0x6c, 0x36, 0xf6, 0x74, 0x96, 0x11, 0xce, 0x6c, 0xe9, 0x98, 0x90, - 0xb6, 0x85, 0x08, 0x5b, 0x27, 0x5b, 0xf9, 0x41, 0x1d, 0xee, 0xba, 0xbc, - 0x50, 0x74, 0x8d, 0x65, 0x65, 0xc3, 0x7e, 0x97, 0x12, 0x22, 0x53, 0x2c, - 0x76, 0x73, 0x34, 0x76, 0x92, 0xda, 0x78, 0x3b, 0xd7, 0x75, 0xff, 0x0f, - 0xc0, 0x82, 0x4b, 0x95, 0xa0, 0xe4, 0xde, 0xd3, 0x28, 0xea, 0xdd, 0xa0, - 0x80, 0xbb, 0x31, 0x8c, 0xae, 0x60, 0x1e, 0x5f, 0xab, 0x0f, 0x91, 0xe7, - 0x02, 0x47, 0x6a, 0x67, 0xcf, 0x8d, 0x18, 0x56, 0xdd, 0xa1, 0x0a, 0x8b, - 0xfb, 0xac, 0xf7, 0xbe, 0xd0, 0x66, 0x71, 0xa2, 0x4e, 0x3c, 0x1f, 0x34, - 0x46, 0x45, 0x33, 0x9f, 0x0c, 0xc3, 0x25, 0xc3, 0x87, 0xc8, 0xb8, 0x1d, - 0x44, 0xa7, 0x02, 0xb8, 0x19, 0xae, 0xfd, 0x6b, 0x1e, 0x38, 0x31, 0xce, - 0xd3, 0x81, 0x1b, 0x50, 0xaf, 0x77, 0x07, 0xc7, 0x40, 0xea, 0x47, 0x36, - 0xc0, 0x08, 0x06, 0xf1, 0xd9, 0x15, 0xd5, 0x21, 0xe2, 0x30, 0x03, 0xe4, - 0xbf, 0x6a, 0xeb, 0xf1, 0xe2, 0x60, 0xe0, 0xfd, 0xa7, 0xff, 0x8e, 0x19, - 0xd0, 0xed, 0x46, 0x8d, 0xfa, 0x48, 0x95, 0x40, 0xbb, 0xe1, 0x95, 0x0f, - 0x5e, 0x6b, 0x00, 0x6c, 0xf6, 0xa7, 0xf6, 0xf4, 0x68, 0xeb, 0x64, 0x6f, - 0x13, 0x07, 0xf5, 0xb7, 0x5a, 0x13, 0x74, 0xfa, 0x84, 0x65, 0x21, 0xb1, - 0x7d, 0x88, 0x89, 0x1b, 0xe2, 0x44, 0x40, 0xc4, 0x2a, 0x12, 0xb6, 0x0c, - 0x56, 0x36, 0x4a, 0x64, 0x7d, 0xd6, 0xd7, 0x4c, 0x5c, 0x59, 0x88, 0x4e, - 0xbe, 0x67, 0xa6, 0x11, 0xcd, 0x90, 0x3d, 0x60, 0x26, 0x86, 0x05, 0xbc, - 0x23, 0x1b, 0xa3, 0x9a, 0xb2, 0xe7, 0x00, 0xdf, 0xc4, 0xc2, 0x60, 0x54, - 0x88, 0x69, 0x36, 0xfb, 0x74, 0x96, 0x11, 0x4e, 0x6c, 0xb9, 0x98, 0x90, - 0xc4, 0x72, 0x75, 0xc9, 0xfd, 0xd8, 0x94, 0x91, 0x9b, 0x19, 0x1d, 0x6b, - 0x46, 0xac, 0x3e, 0xc9, 0xde, 0x61, 0x3a, 0x6d, 0x29, 0xf6, 0x9c, 0xa8, - 0x16, 0x35, 0x62, 0xa8, 0x75, 0xfb, 0x5e, 0xa8, 0x32, 0xec, 0xc7, 0xed, - 0x8b, 0x2a, 0x25, 0x5d, 0x9b, 0x0e, 0x7d, 0x49, 0x19, 0xf3, 0xab, 0xf9, - 0xfa, 0xcd, 0x0d, 0xa4, 0xd2, 0xd6, 0x7d, 0x42, 0x46, 0xad, 0x90, 0x15, - 0xde, 0x14, 0x86, 0x87, 0xe0, 0xff, 0xc7, 0xfc, 0x6d, 0x3d, 0xbd, 0x51, - 0x64, 0xbf, 0xd2, 0x31, 0x1d, 0xe8, 0xd2, 0x6a, 0x1a, 0xd8, 0xda, 0x8b, - 0x2f, 0x78, 0xbe, 0x17, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x9c, 0xa6, 0x44, 0x15, 0xe8, 0x53, 0x1c, 0xbf, 0x24, 0x7f, 0x42, 0xdf, - 0xed, 0x4a, 0xe5, 0x3b, 0xa9, 0x77, 0x07, 0xc7, 0x42, 0xea, 0x67, 0x37, - 0xc0, 0x08, 0x06, 0xf1, 0xd9, 0x15, 0xd5, 0x21, 0xac, 0x5b, 0xcb, 0x12, - 0xd5, 0x01, 0x14, 0x4b, 0x27, 0x6c, 0xf0, 0xad, 0xa6, 0x14, 0x31, 0x78, - 0xbe, 0xd2, 0xdd, 0xeb, 0x58, 0x84, 0xbc, 0xff, 0x6a, 0x8e, 0xd7, 0x82, - 0xc9, 0xc4, 0x56, 0xd3, 0x1b, 0xff, 0xfc, 0x43, 0x4c, 0x97, 0x88, 0xb0, - 0xef, 0xb5, 0xef, 0x9e, 0x01, 0x42, 0xef, 0xb8, 0xb8, 0x49, 0x09, 0xc6, - 0xc8, 0x71, 0xb3, 0xcf, 0xc9, 0x32, 0x46, 0x92, 0x3a, 0x67, 0x34, 0x0a, - 0xc0, 0x10, 0x5a, 0xec, 0x21, 0x6d, 0x35, 0x04, 0xaa, 0x54, 0x08, 0x38, - 0x4e, 0x4a, 0xa5, 0x08, 0x13, 0xd9, 0xc5, 0x54, 0xd4, 0x6f, 0x7a, 0x77, - 0xdb, 0xa3, 0x2d, 0x9c, 0x28, 0xb5, 0x5e, 0x78, 0xcb, 0xc2, 0x60, 0x54, - 0x88, 0x61, 0x36, 0xf5, 0x72, 0x96, 0x11, 0xce, 0x6e, 0x89, 0x98, 0x90, - 0x22, 0x38, 0xba, 0x95, 0x33, 0xcf, 0xf6, 0x91, 0xae, 0x6c, 0x08, 0x13, - 0x78, 0x30, 0xaf, 0xd7, 0x37, 0x58, 0x1c, 0x9e, 0x2d, 0x70, 0x90, 0x59, - 0x0a, 0x0d, 0xdc, 0x72, 0xd1, 0x4a, 0xe2, 0x65, 0x0d, 0x80, 0x7e, 0xe9, - 0xef, 0x4a, 0xbb, 0x11, 0x12, 0x99, 0x04, 0x6d, 0xf6, 0xaa, 0x74, 0xb1, - 0x80, 0xba, 0x31, 0x8d, 0xa8, 0x60, 0x1e, 0x5f, 0xa9, 0x0f, 0x91, 0xe7, - 0x02, 0x47, 0x6a, 0x67, 0xcc, 0xe1, 0xb8, 0xbe, 0xd8, 0x50, 0xff, 0x21, - 0xf1, 0x96, 0x2d, 0xe3, 0x17, 0xac, 0x53, 0x74, 0xbd, 0x82, 0xff, 0x80, - 0x43, 0x4d, 0xbd, 0x6b, 0x97, 0x09, 0x41, 0x52, 0x4c, 0x9d, 0x67, 0xb8, - 0x36, 0xbf, 0xbc, 0xfb, 0x53, 0xb0, 0xca, 0xfb, 0x19, 0x4b, 0x72, 0xac, - 0x59, 0x01, 0xff, 0xe6, 0xa9, 0x77, 0x07, 0xc7, 0x42, 0xea, 0x47, 0x36, - 0xc0, 0x08, 0x06, 0xf1, 0xd9, 0x15, 0xd5, 0x21, 0x85, 0x79, 0x02, 0x5f, - 0x6f, 0x02, 0xb2, 0xa5, 0xb4, 0x20, 0xf8, 0xf0, 0x25, 0x16, 0x81, 0x60, - 0x93, 0x13, 0xe5, 0xfd, 0x9a, 0xf2, 0x27, 0x2e, 0xe3, 0x44, 0x23, 0x42, - 0x11, 0x57, 0x3b, 0x87, 0x1b, 0xff, 0xfc, 0x45, 0x4c, 0x97, 0x88, 0xb3, - 0xef, 0xbd, 0xef, 0x95, 0x01, 0x42, 0xef, 0xb8, 0x2c, 0xbd, 0x29, 0xe5, - 0x77, 0xbd, 0xda, 0x8a, 0x4d, 0x1d, 0x37, 0xa2, 0x7b, 0xbb, 0x7a, 0xd2, - 0x69, 0x47, 0xc2, 0x93, 0xf3, 0x04, 0xd5, 0x6c, 0x57, 0x93, 0xd7, 0x86, - 0x98, 0x51, 0x27, 0x62, 0xd8, 0x0a, 0xa4, 0x7e, 0x11, 0xda, 0x50, 0x18, - 0xcc, 0xe5, 0xe1, 0x8a, 0x1d, 0x6c, 0x86, 0x8e, 0xcb, 0xc2, 0x62, 0x54, - 0x88, 0x68, 0x36, 0xfa, 0x72, 0x96, 0x11, 0x4e, 0x6e, 0xe9, 0x98, 0x90, - 0x35, 0x64, 0x72, 0xfb, 0x82, 0x32, 0xed, 0xbc, 0x91, 0x34, 0x01, 0x0d, - 0xf7, 0x0b, 0x1c, 0x0e, 0xff, 0x5e, 0x20, 0xf3, 0xd7, 0xa6, 0x6c, 0x2b, - 0x34, 0xa8, 0x7f, 0x77, 0x8e, 0xe5, 0xd6, 0x47, 0x40, 0xa5, 0x6a, 0x64, - 0xfb, 0x35, 0x26, 0xdd, 0x14, 0x4f, 0x2f, 0xfb, 0x43, 0xe9, 0xb8, 0xda, - 0x80, 0xbf, 0x31, 0x80, 0xa8, 0x60, 0x1e, 0xdf, 0xa9, 0x5f, 0x93, 0xe7, - 0x02, 0x47, 0x6a, 0x67, 0xbb, 0xaf, 0x49, 0xa0, 0x9b, 0xb1, 0x15, 0x2e, - 0xf1, 0xea, 0x99, 0xd3, 0xd4, 0xb8, 0xc5, 0x3d, 0x8d, 0x66, 0xf3, 0xc1, - 0x6a, 0x4a, 0x01, 0x76, 0x83, 0x4c, 0xc6, 0xa5, 0xed, 0x60, 0x7d, 0x07, - 0xaf, 0x70, 0x2c, 0x7b, 0x44, 0xc0, 0x8e, 0xd2, 0x75, 0x1f, 0xba, 0xc4, - 0xc7, 0x05, 0x72, 0x2a, 0x91, 0x9f, 0x6f, 0xec, 0xa8, 0x73, 0x29, 0xf2, - 0x2b, 0x37, 0xf0, 0x6b, 0x27, 0x12, 0xc2, 0xab, 0x62, 0x7a, 0x2e, 0x0c, - 0x6a, 0x67, 0xe9, 0xa6, 0x87, 0x56, 0xb6, 0xe8, 0x75, 0xbd, 0xcb, 0x0b, - 0xbc, 0xa8, 0x15, 0x7a, 0xf4, 0xa3, 0x79, 0x65, 0x99, 0xe7, 0x24, 0x26, - 0xf8, 0x9f, 0x91, 0x0f, 0x17, 0x32, 0x23, 0xab, 0xd4, 0xa7, 0x21, 0xe4, - 0xb1, 0x68, 0xba, 0xab, 0xa5, 0xf8, 0x42, 0x7e, 0xa8, 0xdb, 0x6d, 0x95, - 0xbc, 0xcb, 0x76, 0x5b, 0x2d, 0xac, 0xd7, 0x0e, 0x45, 0xcc, 0xd1, 0x73, - 0xa9, 0x96, 0x0b, 0x7a, 0x21, 0x27, 0xfa, 0x1e, 0xfe, 0x7a, 0xd5, 0x3d, - 0xc4, 0xb1, 0xd4, 0x8e, 0xfe, 0x73, 0x7c, 0x51, 0x88, 0xd7, 0x9f, 0x13, - 0x22, 0x2a, 0x47, 0xec, 0x07, 0x1e, 0xc3, 0x3d, 0x26, 0x56, 0xb0, 0x16, - 0x0d, 0x23, 0x96, 0xd6, 0xe4, 0x82, 0x3a, 0x3d, 0x4d, 0x7a, 0x46, 0x0a, - 0xc4, 0x75, 0xd0, 0x8a, 0x60, 0x42, 0x20, 0x7e, 0x82, 0xd6, 0x04, 0xb5, - 0xf0, 0x21, 0x15, 0xd6, 0xb1, 0x46, 0xbf, 0x0c, 0x83, 0xf0, 0x01, 0xe6, - 0x66, 0xbe, 0x03, 0x94, 0xe9, 0xec, 0x66, 0x5f, 0x1b, 0x3e, 0x2a, 0xaf, - 0xd2, 0xa1, 0x25, 0xe6, 0xb1, 0x68, 0xba, 0x2b, 0xa5, 0xf8, 0x62, 0x7f, - 0xa8, 0xdb, 0x6d, 0x95, 0xbc, 0xcb, 0x76, 0x5b, 0x2d, 0xac, 0xd7, 0x0e, - 0x45, 0xcc, 0xd1, 0x73, 0x37, 0x58, 0x1c, 0x9e, 0x2d, 0x70, 0x90, 0x41, - 0x0a, 0x0d, 0xdb, 0x75, 0xd1, 0x4a, 0xe2, 0x65, 0xf9, 0x74, 0x7b, 0x56, - 0x88, 0xd7, 0x81, 0x13, 0x22, 0x2a, 0x48, 0xec, 0x07, 0x1e, 0xc4, 0x3d, - 0x26, 0x56, 0xb0, 0x16, 0x0d, 0x23, 0x96, 0xd6, 0xe4, 0x82, 0x3a, 0x3d, - 0x4d, 0x7a, 0x46, 0x0a, 0x4e, 0xc0, 0x58, 0x91, 0xd9, 0x2b, 0xc1, 0xe4, - 0xd8, 0x39, 0xe4, 0x7b, 0x92, 0x0d, 0xde, 0x14, 0xb1, 0x57, 0xbf, 0x7b, - 0x83, 0xf0, 0x01, 0xe6, 0x66, 0xbe, 0x03, 0x94, 0xe9, 0xec, 0x66, 0x5f, - 0x1b, 0x3e, 0x2a, 0xaf, 0xd2, 0xa1, 0x25, 0xe6, 0xb1, 0x68, 0xba, 0x2b, - 0xa5, 0xf8, 0x62, 0x7f, 0xdd, 0xc9, 0xb0, 0xc3, 0xdb, 0xce, 0xb6, 0x56, - 0xf7, 0x01, 0xa7, 0x6a, 0x96, 0x9b, 0xc3, 0x47, 0xe0, 0x2e, 0x71, 0xc1, - 0xe4, 0xf7, 0x16, 0xe7, 0x6a, 0x97, 0xb0, 0x3b, 0x49, 0x04, 0x45, 0xf1, - 0xf9, 0x74, 0x7b, 0x56, 0x88, 0xd7, 0x81, 0x1e, 0x22, 0x2a, 0x48, 0xea, - 0x07, 0x1e, 0xc4, 0x3e, 0x26, 0x56, 0xb0, 0x16, 0x0d, 0x23, 0x96, 0xd6, - 0xe4, 0x82, 0x3a, 0x3d, 0x4d, 0x7a, 0x46, 0x0a, 0x6e, 0xbc, 0xe8, 0xf7, - 0x8b, 0xe6, 0x09, 0x17, 0x3f, 0xf2, 0x1f, 0xc3, 0xee, 0xeb, 0x8e, 0xc2, - 0x8b, 0xb3, 0x0f, 0x34, 0x78, 0xac, 0xff, 0xbf, 0xeb, 0xf9, 0x4b, 0x48, - 0x63, 0xdf, 0x3b, 0x12, 0x1b, 0x3e, 0x2a, 0xaf, 0xd2, 0xa1, 0x25, 0xe6, - 0xb1, 0x68, 0xba, 0xab, 0xa7, 0xfa, 0x62, 0x7f, 0x3b, 0x1d, 0x6f, 0xcb, - 0xbe, 0xbe, 0x62, 0x69, 0xd4, 0x3d, 0xf4, 0x2c, 0xc0, 0x75, 0x01, 0xa0, - 0x16, 0x0a, 0x17, 0xff, 0x82, 0xb6, 0x85, 0xe6, 0x5c, 0xa1, 0x3a, 0x82, - 0x39, 0xfe, 0x28, 0x39, 0x92, 0xe2, 0xb7, 0x71, 0x91, 0x95, 0x41, 0xc9, - 0x8a, 0xf2, 0x29, 0x89, 0x3d, 0xb9, 0xa1, 0xaa, 0xe0, 0x82, 0x7b, 0xee, - 0x81, 0xbc, 0xc1, 0x41, 0x4b, 0x39, 0x87, 0xd3, 0x1e, 0x0b, 0xbe, 0x95, - 0xaa, 0x6a, 0x7c, 0x86, 0xd6, 0xb5, 0x77, 0xf7, 0x52, 0xef, 0x4f, 0x87, - 0x17, 0xce, 0x52, 0x55, 0xd6, 0x11, 0x65, 0x76, 0xeb, 0xde, 0x81, 0x32, - 0x41, 0x0a, 0xec, 0xb0, 0xfc, 0xad, 0x7f, 0x7d, 0xb8, 0x40, 0x3e, 0x78, - 0x7c, 0x21, 0xcc, 0x8a, 0x4a, 0x35, 0xf6, 0xae, 0xc9, 0x89, 0x77, 0x85, - 0xb5, 0xb0, 0xf7, 0x5a, 0x84, 0x07, 0x5d, 0x1a, 0x48, 0x26, 0x94, 0x74, - 0x1c, 0x13, 0xa3, 0x82, 0x52, 0xe2, 0x62, 0xe6, 0x2f, 0x27, 0x49, 0x10, - 0x7b, 0xcd, 0x98, 0x7f, 0xd7, 0x97, 0xff, 0xce, 0x78, 0xa9, 0xa4, 0xe8, - 0x6b, 0x7f, 0xf2, 0x9e, 0xb7, 0xf1, 0x3c, 0x97, 0xd4, 0x50, 0x5b, 0x2c, - 0x64, 0x07, 0x67, 0x79, 0x68, 0x74, 0xc7, 0x88, 0x0a, 0x59, 0x9c, 0x9f, - 0xa8, 0xf6, 0x76, 0x20, 0xbf, 0xaa, 0xbc, 0xb1, 0xf1, 0xef, 0x5a, 0x4b, - 0x51, 0xd8, 0x76, 0x2f, 0xc0, 0xa3, 0x9e, 0xac, 0x1c, 0xcb, 0x19, 0x4d, - 0x3c, 0xff, 0xdf, 0xd8, 0xdf, 0x29, 0x96, 0xd3, 0x0b, 0xaf, 0xff, 0xab, - 0xc1, 0xc8, 0x62, 0x5f, 0x8e, 0x7d, 0x35, 0xeb, 0x74, 0x96, 0x11, 0xce, - 0x6e, 0xbb, 0x98, 0x90, 0xf4, 0xaf, 0x04, 0xd1, 0x8c, 0x50, 0x28, 0x45, - 0x56, 0xb2, 0x50, 0xf8, 0xf9, 0x7a, 0x59, 0x21, 0xef, 0x15, 0xb1, 0x3b, - 0xcb, 0x89, 0x8b, 0x1e, 0x9f, 0x2e, 0x1c, 0xe6, 0x55, 0xc8, 0xba, 0xd1, - 0x3a, 0xd7, 0x32, 0x2b, 0xc9, 0x40, 0x08, 0x88, 0xc4, 0xfb, 0xc0, 0xc4, - 0x5c, 0x21, 0xdb, 0xac, 0x64, 0x07, 0x67, 0x79, 0x68, 0x26, 0xe7, 0x89, - 0x0a, 0x59, 0x9c, 0x9f, 0xa8, 0xf6, 0x76, 0x20, 0xc4, 0x57, 0xd0, 0x8a, - 0x60, 0x42, 0x20, 0x7e, 0x82, 0xd6, 0x04, 0xb5, 0xf0, 0x21, 0x15, 0xde, - 0xaf, 0x3d, 0x88, 0xf1, 0x98, 0xcc, 0xfc, 0xc0, 0x22, 0x63, 0x2a, 0x43, - 0xa8, 0x30, 0x5c, 0xfd, 0xc1, 0xc8, 0x6d, 0x52, 0x8e, 0x7d, 0x32, 0xed, - 0x74, 0x96, 0x11, 0xce, 0x6c, 0xe9, 0x98, 0x90, 0xdd, 0xc9, 0xb0, 0xc3, - 0x35, 0x20, 0xb6, 0x56, 0xf7, 0x23, 0xa7, 0x6a, 0x96, 0x9b, 0xc3, 0x47, - 0x67, 0xf8, 0x91, 0x4e, 0xf4, 0xec, 0xc9, 0x36, 0x63, 0x97, 0xad, 0x06, - 0xc9, 0xb5, 0xb7, 0x6b, 0x62, 0xcf, 0x06, 0x09, 0xf8, 0xbf, 0x5c, 0x92, - 0x77, 0x09, 0x43, 0xb1, 0x7c, 0xed, 0x45, 0xbe, 0x36, 0xf5, 0xf9, 0x4a, - 0x57, 0x47, 0x6d, 0x87, 0xeb, 0x9a, 0xe5, 0x9d, 0x18, 0x6b, 0xc4, 0x83, - 0x75, 0x91, 0x91, 0x64, 0xd7, 0x28, 0x2d, 0x65, 0xa5, 0xb6, 0x2e, 0xca, - 0x44, 0x19, 0xb9, 0x81, 0x5c, 0xed, 0x27, 0xcd, 0xa9, 0x82, 0x00, 0xe4, - 0xa5, 0xf1, 0x4a, 0xa5, 0xa3, 0x8f, 0x00, 0x55, 0xdf, 0xc8, 0x6d, 0x54, - 0x81, 0x7d, 0x35, 0xee, 0x74, 0x96, 0x11, 0xce, 0x6e, 0xe9, 0x98, 0x90, - 0x35, 0x64, 0x72, 0xfb, 0x82, 0x32, 0xed, 0xbc, 0x91, 0x34, 0x01, 0x0d, - 0xf7, 0x0b, 0x1c, 0x0e, 0xc4, 0xa1, 0x49, 0x18, 0xbd, 0xc6, 0x91, 0x69, - 0x47, 0xcd, 0x06, 0xc7, 0xeb, 0x95, 0xf7, 0x39, 0x0d, 0xb3, 0x23, 0x30, - 0xd5, 0x9c, 0x79, 0x1a, 0x09, 0xc8, 0x7c, 0xbe, 0x61, 0xe5, 0xfe, 0xb7, - 0x36, 0xf5, 0xf9, 0xca, 0x55, 0x47, 0x6d, 0x87, 0xeb, 0x9a, 0xe5, 0x9d, - 0x18, 0x6b, 0xc4, 0x83, 0xa6, 0xa2, 0x92, 0xf1, 0x77, 0xf5, 0x65, 0x4b, - 0x63, 0x94, 0x45, 0xbc, 0x5a, 0x56, 0x76, 0x30, 0x06, 0xac, 0xd5, 0xd4, - 0x59, 0x53, 0x34, 0x6f, 0x1a, 0xc1, 0xc8, 0xaa, 0x44, 0x1b, 0x15, 0x24, - 0xc1, 0xc8, 0x62, 0x52, 0x8e, 0x7d, 0x35, 0xed, 0x74, 0x96, 0x11, 0x4e, - 0x6e, 0xb9, 0x98, 0x90, 0x35, 0x64, 0x72, 0xfb, 0x82, 0x32, 0xed, 0xbc, - 0x91, 0x34, 0x01, 0x0d, 0xf7, 0x0b, 0x1c, 0x0e, 0xcc, 0x65, 0x0a, 0xc7, - 0x0b, 0x8c, 0x7d, 0x12, 0x4b, 0x1f, 0xdd, 0xf8, 0x6e, 0xb0, 0x21, 0x79, - 0x8d, 0xcf, 0x69, 0x75, 0x91, 0x9f, 0xcc, 0xbc, 0xe3, 0xad, 0xf7, 0x31, - 0x11, 0xfd, 0x19, 0xf4, 0xb9, 0xef, 0xdf, 0xcb, 0xe1, 0xe3, 0x76, 0x51, - 0x9f, 0x3f, 0x42, 0xc9, 0xaa, 0xb5, 0xbc, 0x63, 0x62, 0x7a, 0x2e, 0x0c, - 0x6a, 0x67, 0xe9, 0xa6, 0x87, 0x56, 0xb6, 0xe8, 0x75, 0xbd, 0xcb, 0x3b, - 0xa9, 0xb8, 0xbb, 0x88, 0x38, 0xd4, 0x63, 0xd7, 0x13, 0x86, 0xa8, 0x83, - 0x17, 0x93, 0xef, 0x41, 0xcd, 0xc4, 0x64, 0x56, 0x88, 0x7b, 0x36, 0xef, - 0x74, 0x96, 0x11, 0xce, 0x6c, 0xe9, 0xb8, 0x91, 0xf4, 0xaf, 0x04, 0xd1, - 0x8c, 0x50, 0x28, 0x45, 0x56, 0xb2, 0x50, 0xf8, 0xf9, 0x7a, 0x59, 0x21, - 0x67, 0xf8, 0x91, 0x4e, 0xf4, 0xec, 0xc9, 0x3e, 0x63, 0x86, 0xad, 0x71, - 0xc9, 0xb5, 0xb7, 0x6b, 0x47, 0xa3, 0x0c, 0xa1, 0x14, 0xba, 0xe6, 0x61, - 0x05, 0x32, 0x3c, 0xcb, 0xda, 0x92, 0x1f, 0x45, 0x64, 0x07, 0x67, 0x79, - 0x6a, 0x26, 0xe7, 0x89, 0x0a, 0x59, 0x9c, 0x9f, 0xa8, 0xf6, 0x76, 0x20, - 0xc0, 0x46, 0xe3, 0x2c, 0x73, 0xda, 0x76, 0xc0, 0x15, 0xfd, 0xfb, 0xa3, - 0xc4, 0xa8, 0x71, 0x01, 0x47, 0x44, 0x8d, 0xb7, 0xd2, 0x37, 0xd4, 0xce, - 0x50, 0xce, 0x90, 0xe3, 0xaa, 0x8b, 0x44, 0x2f, 0xdf, 0xc8, 0x6d, 0x52, - 0x81, 0x7d, 0x32, 0xed, 0x74, 0x96, 0x11, 0xce, 0x6c, 0xe9, 0x98, 0x90, - 0xf4, 0xaf, 0x04, 0xd1, 0x8c, 0x50, 0x28, 0x45, 0x56, 0xb2, 0x50, 0xf8, - 0xf9, 0x7a, 0x59, 0x21, 0x67, 0xf8, 0x91, 0x4e, 0xf4, 0xec, 0xc9, 0x3e, - 0x63, 0x86, 0xad, 0x71, 0xc9, 0xb5, 0xb7, 0x6b, 0x47, 0xa3, 0x0c, 0xa1, - 0x14, 0xba, 0xe6, 0x61, 0x05, 0x32, 0x3c, 0xcb, 0xda, 0x92, 0x1f, 0x45, - 0x64, 0x07, 0x67, 0x79, 0x6a, 0x26, 0xe7, 0x89, 0x0a, 0x59, 0x9c, 0x9f, - 0xa8, 0xf6, 0x76, 0x20, 0x11, 0x64, 0x12, 0x91, 0xd9, 0x7d, 0x06, 0x80, - 0x8c, 0xb3, 0xa2, 0xa4, 0xdb, 0x91, 0x95, 0x98, 0xa0, 0x12, 0x8e, 0xde, - 0x89, 0xac, 0xd7, 0xe4, 0xaf, 0x97, 0x20, 0xe7, 0xa9, 0x05, 0x9d, 0x32, - 0xdf, 0xc8, 0x6d, 0x54, 0x81, 0x7d, 0x32, 0xee, 0x74, 0x96, 0x11, 0xce, - 0x6c, 0xe9, 0x98, 0x90, 0xb6, 0x85, 0x08, 0x5b, 0x27, 0x5b, 0xf9, 0x41, - 0x1d, 0xee, 0xba, 0xbc, 0x50, 0x74, 0x8d, 0x65, 0x65, 0xc3, 0x7e, 0x97, - 0x12, 0x22, 0x53, 0x2c, 0x76, 0x73, 0x34, 0x76, 0x92, 0xda, 0x78, 0x3b, - 0x47, 0xa3, 0x0c, 0xa1, 0x14, 0xba, 0xe6, 0x6c, 0x05, 0x32, 0x3c, 0xcd, - 0xda, 0x92, 0x1f, 0x46, 0xaf, 0x77, 0x07, 0xc7, 0x40, 0xea, 0x47, 0x36, - 0xc0, 0x08, 0x06, 0xf1, 0xd9, 0x15, 0xd5, 0x21, 0xe2, 0x30, 0x03, 0xe4, - 0xbf, 0x6a, 0xeb, 0xf1, 0xe2, 0x60, 0xe0, 0xfd, 0xa7, 0xff, 0x8e, 0x19, - 0xab, 0xa3, 0xb4, 0x12, 0x55, 0xc1, 0x63, 0xa7, 0x2f, 0xbd, 0xd8, 0xec, - 0x47, 0x7f, 0x06, 0xab, 0xdf, 0xc8, 0x68, 0x52, 0x81, 0x7d, 0x30, 0xed, - 0x74, 0x96, 0x11, 0x4e, 0x6c, 0xe9, 0x98, 0x90, 0xc4, 0x72, 0x75, 0xc9, - 0xfd, 0xd8, 0x94, 0x91, 0x9b, 0x19, 0x1d, 0x6b, 0x46, 0xac, 0x3e, 0xc9, - 0x16, 0x0a, 0x17, 0xff, 0x82, 0xb6, 0x85, 0x9e, 0x5c, 0xa1, 0x3a, 0x82, - 0x39, 0xfe, 0x28, 0x39, 0x1d, 0xb7, 0xc8, 0xb8, 0x6a, 0x53, 0xc6, 0x24, - 0x87, 0x41, 0xb8, 0xbc, 0x17, 0x2a, 0x65, 0x33, 0x26, 0xa5, 0x31, 0x0a, - 0x70, 0x99, 0x99, 0xb8, 0x0f, 0x7e, 0xfb, 0x18, 0x73, 0x1d, 0xbf, 0x7f, - 0xaa, 0x48, 0x7c, 0x86, 0xd6, 0xb5, 0x77, 0xf7, 0x52, 0xef, 0x4f, 0x87, - 0x17, 0xce, 0x52, 0x2d, 0xd6, 0x11, 0x65, 0x76, 0xeb, 0xde, 0x81, 0x32, - 0x41, 0x0a, 0xec, 0xb0, 0xfc, 0xad, 0x7f, 0x7d, 0xb8, 0x40, 0x3e, 0x78, - 0x7c, 0x21, 0xcc, 0x8a, 0x4a, 0x35, 0xf6, 0xae, 0xc9, 0x89, 0x77, 0x85, - 0x54, 0xba, 0x24, 0x8b, 0x4c, 0x38, 0xd4, 0xde, 0x71, 0xed, 0x31, 0xd0, - 0x9e, 0x17, 0x7c, 0xef, 0x52, 0xe2, 0x62, 0xe6, 0x2f, 0x27, 0x49, 0x18, - 0x7b, 0xcd, 0x98, 0x7f, 0xd7, 0x97, 0xff, 0xce, 0x9c, 0xa6, 0x44, 0x15, - 0xe8, 0x53, 0x1c, 0xbf, 0x24, 0x7f, 0x42, 0xdf, 0xed, 0x4a, 0xe5, 0x3b, - 0xa9, 0x77, 0x07, 0xc7, 0x42, 0xea, 0x67, 0x37, 0xc0, 0x08, 0x06, 0xf1, - 0xd9, 0x15, 0xd5, 0x21, 0x43, 0x1b, 0x2a, 0x9c, 0x5d, 0xd5, 0x29, 0xab, - 0xa4, 0x9d, 0x2a, 0x3f, 0x87, 0xe0, 0xab, 0x9d, 0xa9, 0xa9, 0xcc, 0x20, - 0x70, 0x61, 0xf4, 0xed, 0x65, 0xcb, 0xa9, 0x43, 0x53, 0x06, 0xc4, 0xe0, - 0xc1, 0xc8, 0x6d, 0x52, 0x8e, 0x7d, 0x32, 0xed, 0x72, 0x96, 0x11, 0xce, - 0x6e, 0xe9, 0x98, 0x90, 0x34, 0xdd, 0x1d, 0xf5, 0xa8, 0xff, 0x21, 0xd1, - 0x91, 0xa3, 0xb2, 0x58, 0x42, 0x88, 0xcd, 0x9e, 0x37, 0x58, 0x1c, 0x9e, - 0x2d, 0x70, 0x90, 0x59, 0x0a, 0x0d, 0xdb, 0x75, 0xd1, 0x4a, 0xe2, 0x65, - 0x94, 0x28, 0xa2, 0xf0, 0x67, 0x96, 0x16, 0x73, 0x5c, 0x74, 0xfa, 0xb9, - 0x39, 0xa6, 0xa3, 0xf1, 0xa9, 0x77, 0x07, 0xc7, 0x42, 0x8a, 0x47, 0x36, - 0xc0, 0x08, 0x06, 0xf1, 0xd9, 0x15, 0xd5, 0x21, 0xc4, 0x57, 0xd0, 0x8a, - 0x60, 0x42, 0x20, 0x7e, 0x82, 0xd6, 0x04, 0xb5, 0xf0, 0x21, 0x15, 0xce, - 0xa9, 0xa9, 0xcc, 0x20, 0x70, 0x61, 0xf4, 0xed, 0x62, 0xcc, 0xae, 0x44, - 0x53, 0x06, 0xc4, 0xe0, 0xc1, 0xc8, 0x6d, 0x52, 0x8e, 0x7d, 0x32, 0xed, - 0x72, 0x96, 0x11, 0xce, 0x6e, 0xe9, 0x98, 0x90, 0x2a, 0x44, 0xee, 0xa1, - 0x2c, 0x56, 0x9d, 0xb3, 0x0f, 0x4e, 0x70, 0x64, 0x50, 0x8a, 0x55, 0x42, - 0xe0, 0x2e, 0x71, 0xc1, 0xe4, 0xf7, 0x16, 0xff, 0x6a, 0x97, 0xb0, 0x3b, - 0x49, 0x04, 0x45, 0xf1, 0x32, 0xbb, 0xb2, 0xe2, 0x47, 0xa4, 0xd1, 0xfc, - 0x13, 0x41, 0x7f, 0xaf, 0x5f, 0x11, 0xfb, 0xff, 0xa9, 0x77, 0x07, 0xc7, - 0x42, 0xea, 0x47, 0x36, 0xc0, 0x08, 0x06, 0xf1, 0xd9, 0x15, 0xd5, 0x21, - 0x85, 0x79, 0x02, 0x5f, 0x6f, 0x02, 0xb2, 0xa5, 0xb4, 0x20, 0xf8, 0xf0, - 0x25, 0x16, 0x81, 0x60, 0xc6, 0x0d, 0x86, 0xa0, 0x52, 0xf8, 0x42, 0x2a, - 0xe2, 0xaf, 0x08, 0xb4, 0x65, 0x45, 0x64, 0x8e, 0xc1, 0xc8, 0x6d, 0x54, - 0x8e, 0x7d, 0x32, 0xee, 0x72, 0x96, 0x11, 0xce, 0x6e, 0xe9, 0x98, 0x90, - 0xf6, 0xfd, 0x43, 0x0b, 0x52, 0x88, 0xf4, 0x9b, 0xea, 0x61, 0xb8, 0x39, - 0x6f, 0x0c, 0xa5, 0x38, 0xc4, 0xa1, 0x49, 0x18, 0xbd, 0xc6, 0x91, 0x71, - 0x47, 0xcd, 0x06, 0xc7, 0xeb, 0x95, 0xf7, 0x39, 0x60, 0x18, 0x57, 0x45, - 0x25, 0xb5, 0x59, 0xb7, 0xad, 0xb5, 0x82, 0x14, 0x01, 0x5b, 0xdf, 0x91, - 0x30, 0xf5, 0xf9, 0xca, 0x55, 0x45, 0x6d, 0x87, 0xeb, 0x9a, 0xe5, 0x9d, - 0x18, 0x6b, 0xc4, 0x83, 0x78, 0xaa, 0xae, 0x3b, 0x9d, 0xd4, 0x19, 0x4f, - 0x9c, 0xaf, 0x5a, 0x3d, 0x3e, 0x95, 0x62, 0x8b, 0x60, 0x81, 0x59, 0x74, - 0xd5, 0x9b, 0x5b, 0x05, 0x32, 0x6b, 0xaf, 0x06, 0xff, 0x06, 0xc5, 0x2b, - 0xc1, 0xcd, 0x6d, 0x52, 0x8e, 0x7f, 0x32, 0xed, 0x72, 0x96, 0x11, 0x4e, - 0x6e, 0xb9, 0x9a, 0x90, 0x35, 0x64, 0x72, 0xfb, 0x82, 0x32, 0xed, 0xbc, - 0x91, 0x34, 0x01, 0x0d, 0xf7, 0x0b, 0x1c, 0x0e, 0xcc, 0x65, 0x0a, 0xc7, - 0x0b, 0x8c, 0x7d, 0x12, 0x4b, 0x1f, 0xdd, 0xf8, 0x6e, 0xb0, 0x21, 0x79, - 0x35, 0xe5, 0x9d, 0xc7, 0xb8, 0x1f, 0x21, 0x44, 0x80, 0x35, 0x89, 0xf7, - 0x92, 0x6e, 0x31, 0xb7, 0xde, 0x11, 0xf7, 0xdb, 0x4b, 0x91, 0xa4, 0xe5, - 0xd1, 0x82, 0x7d, 0x74, 0x52, 0x76, 0xd8, 0x01, 0x29, 0x2c, 0x88, 0x35, - 0x99, 0x86, 0x10, 0x22, 0x4e, 0x15, 0x1d, 0xb7, 0x19, 0x1d, 0xb6, 0xae, - 0x53, 0xb0, 0xcb, 0xc2, 0xb5, 0xe6, 0x5d, 0x68, 0xd5, 0x01, 0x10, 0xe0, - 0x5b, 0x31, 0x11, 0xd8, 0x1b, 0xab, 0x9b, 0x40, 0x1a, 0xdb, 0xc9, 0xb6, - 0xf3, 0x4d, 0x48, 0x0a, 0xc4, 0xe9, 0x51, 0x74, 0xf6, 0x61, 0x8c, 0x42, - 0xf1, 0x28, 0x92, 0x79, 0x0f, 0x4e, 0x31, 0x96, 0xbe, 0xcb, 0xab, 0xc3, - 0xac, 0xb8, 0xd4, 0x8b, 0x14, 0xae, 0x0f, 0xad, 0xb0, 0xca, 0xba, 0xe0, - 0x1c, 0x47, 0x44, 0xc5, 0xe1, 0x01, 0xcc, 0xb6, 0xb4, 0x76, 0xbd, 0x35, - 0xb3, 0x16, 0xad, 0xb8, 0x91, 0x71, 0x8f, 0x03, 0xd9, 0x15, 0x50, 0xc5, - 0x5d, 0x2a, 0x72, 0x56, 0x15, 0x21, 0xa1, 0xd8, 0xd8, 0xe9, 0xb7, 0xf0, - 0xb4, 0x43, 0x52, 0xb0, 0x63, 0xfa, 0x55, 0x94, 0x13, 0x43, 0x4e, 0x82, - 0x85, 0x63, 0xe0, 0xea, 0x9f, 0xc6, 0x04, 0x40, 0xfb, 0x43, 0xa2, 0x9f, - 0x8a, 0xb6, 0x1d, 0x3f, 0x16, 0xb5, 0x30, 0x90, 0xc3, 0x2c, 0x20, 0x43, - 0x4d, 0xc0, 0x3c, 0xa3, 0xe7, 0xa1, 0x7f, 0xf2, 0x3d, 0x14, 0x7f, 0xac, - 0x34, 0xab, 0xc3, 0x31, 0x61, 0xa5, 0xd8, 0xa5, 0x9e, 0x8a, 0x7c, 0xe0, - 0x67, 0xc4, 0xc9, 0x53, 0xe2, 0x27, 0x0b, 0x87, 0x55, 0x5e, 0xaa, 0x42, - 0x47, 0xaa, 0x02, 0x2f, 0x62, 0x70, 0xa0, 0x6e, 0x86, 0x9b, 0x70, 0x57, - 0x6d, 0x21, 0xad, 0x64, 0xb7, 0xbf, 0xa9, 0x29, 0xe3, 0xdc, 0x66, 0x45, - 0xba, 0x87, 0xfe, 0x72, 0x8c, 0x3a, 0x0b, 0xb0, 0xa0, 0xa6, 0xb1, 0xec, - 0xd2, 0x46, 0x0d, 0x66, 0x0d, 0x26, 0x1d, 0x06, 0xcc, 0x64, 0x21, 0xee, - 0x99, 0x9f, 0x42, 0x31, 0x4c, 0x4d, 0x43, 0xcf, 0x07, 0x9c, 0xf1, 0xb7, - 0xfe, 0x69, 0x05, 0xc5, 0x1c, 0x05, 0x3e, 0xde, 0x3b, 0xd8, 0x7e, 0x47, - 0x3c, 0xb0, 0x1d, 0x34, 0xe2, 0x1a, 0x67, 0x8a, 0xe3, 0xfd, 0x39, 0xe3, - 0xd7, 0x7b, 0xf4, 0x20, 0xec, 0x65, 0x59, 0x28, 0x74, 0x3a, 0xd8, 0x1e, - 0x98, 0x7c, 0xbd, 0x49, 0x7d, 0x73, 0x88, 0x0c, 0xe7, 0xd5, 0x9f, 0x9f, - 0x94, 0x17, 0xdb, 0x69, 0x6f, 0x16, 0xac, 0x47, 0x80, 0xb6, 0x82, 0x3d, - 0xee, 0x19, 0x5e, 0xb5, 0x00, 0xf4, 0xe2, 0x92, 0x81, 0x7e, 0x30, 0x21, - 0xbc, 0xcb, 0xa1, 0x76, 0xe3, 0xf6, 0x79, 0x8e, 0x28, 0x71, 0x68, 0x0f, - 0x84, 0x50, 0x03, 0xd5, 0x6a, 0x30, 0x89, 0x59, 0x2f, 0x62, 0x94, 0xc1, - 0x5c, 0x7c, 0xfc, 0xf2, 0xae, 0x22, 0x74, 0x27, 0xbb, 0xae, 0xa7, 0xa3, - 0x59, 0x1d, 0xf3, 0xa1, 0x23, 0x40, 0x00, 0x30, 0x26, 0xae, 0x5b, 0xcf, - 0x5d, 0xc2, 0x40, 0x9a, 0xa1, 0x3a, 0xc4, 0x4c, 0xd1, 0xe4, 0xf8, 0xd2, - 0xf7, 0x71, 0x09, 0x98, 0x64, 0xb0, 0xc0, 0x33, 0x7e, 0x25, 0x9b, 0xbd, - 0x25, 0xa5, 0x94, 0x3c, 0x23, 0x33, 0x71, 0x37, 0x50, 0x35, 0xba, 0x0a, - 0x86, 0xd7, 0x4f, 0xa1, 0xea, 0xb3, 0x09, 0x05, 0x2c, 0x6b, 0x63, 0x4b, - 0x49, 0x50, 0xb0, 0x6c, 0x36, 0xa2, 0xc5, 0x1e, 0x37, 0x76, 0x4c, 0x7e, - 0xd0, 0x0a, 0x55, 0x8d, 0x6d, 0xc0, 0x18, 0x29, 0xec, 0x8a, 0xd2, 0x56, - 0xb6, 0x17, 0x0d, 0x43, 0x57, 0x68, 0x06, 0x74, 0x71, 0x5f, 0x8a, 0xf4, - 0x79, 0x49, 0x9c, 0xbc, 0xb1, 0x17, 0x67, 0x18, 0x9e, 0xe5, 0xfd, 0x37, - 0xc2, 0xca, 0x4d, 0x43, 0x79, 0xd7, 0xf9, 0x63, 0x59, 0x57, 0xaa, 0x1d, - 0x57, 0xe7, 0x79, 0x53, 0xdb, 0x00, 0x5f, 0xc8, 0xe2, 0x22, 0x0b, 0x85, - 0x55, 0x5c, 0xaa, 0x43, 0x47, 0xa0, 0x02, 0x2b, 0x65, 0x70, 0xa4, 0x6e, - 0xf5, 0x72, 0x99, 0x6f, 0xeb, 0x47, 0xb7, 0xa2, 0x7a, 0x7e, 0x31, 0x75, - 0x82, 0xcb, 0x0a, 0xe3, 0x08, 0x27, 0x83, 0x5b, 0x4b, 0x11, 0xca, 0x7c, - 0x0c, 0x78, 0x15, 0xe5, 0xe3, 0x12, 0x5d, 0x69, 0xb0, 0xf6, 0x9a, 0x02, - 0x6f, 0x68, 0xa4, 0xdd, 0x4a, 0xfa, 0xd7, 0x95, 0x0f, 0x87, 0x4c, 0x08, - 0xf9, 0xa0, 0xdc, 0xee, 0x96, 0xa8, 0x3a, 0xe8, 0xe5, 0x7c, 0x9b, 0x8f, - 0x9a, 0x76, 0x7f, 0x48, 0x0a, 0x69, 0xe0, 0x2f, 0x67, 0x9e, 0x2c, 0x93, - 0x0e, 0x54, 0xd4, 0x40, 0x2b, 0x1d, 0x37, 0xf8, 0xd8, 0x59, 0xf7, 0x28, - 0x8f, 0x5c, 0x21, 0xf8, 0x0c, 0xf4, 0x7c, 0xad, 0x0c, 0x5c, 0x81, 0x40, - 0x9d, 0x91, 0xfc, 0x93, 0xf4, 0xf5, 0x79, 0x43, 0x05, 0xc0, 0x3b, 0xf6, - 0xaf, 0xf2, 0xbe, 0xd9, 0xc6, 0x9f, 0xe4, 0x7b, 0xf6, 0xfe, 0x48, 0x82, - 0x60, 0x63, 0x50, 0x75, 0x78, 0xa2, 0x71, 0x76, 0x07, 0x06, 0x45, 0x35, - 0x54, 0xc8, 0x57, 0xb8, 0x20, 0x46, 0x0e, 0x09, 0xa9, 0xd5, 0xa9, 0x24, - 0x6d, 0xcf, 0xa2, 0x31, 0x4f, 0xa3, 0x37, 0x78, 0xad, 0x15, 0xc6, 0xe7, - 0x2a, 0xa9, 0xa0, 0x60, 0xbe, 0x7d, 0x76, 0x61, 0x61, 0xaf, 0xf5, 0xc1, - 0x63, 0x96, 0xf5, 0xbe, 0x1d, 0x25, 0xe1, 0x9d, 0x62, 0x67, 0x52, 0x80, - 0xd9, 0x88, 0x75, 0xf3, 0x24, 0x44, 0x63, 0x51, 0x30, 0xeb, 0x55, 0xaa, - 0x95, 0x54, 0x96, 0x2c, 0x12, 0x36, 0x16, 0xa9, 0x6e, 0x4a, 0xcb, 0xf6, - 0x39, 0x76, 0x14, 0x9a, 0xee, 0x9c, 0x9a, 0x0a, 0x7d, 0x9a, 0x98, 0x11, - 0xf4, 0xc4, 0x38, 0x84, 0x38, 0x17, 0xf9, 0xc7, 0xa4, 0xc6, 0x85, 0x6c, - 0x4b, 0x54, 0x05, 0x0b, 0x92, 0xa1, 0x2d, 0x82, 0xaa, 0xb3, 0xe1, 0x7b, - 0xe9, 0xc2, 0x52, 0x5f, 0xfc, 0x82, 0x14, 0xb2, 0x79, 0x39, 0x63, 0x05, - 0x92, 0xd6, 0xd8, 0x88, 0xc3, 0x2c, 0x21, 0x43, 0x4d, 0xca, 0x3c, 0xa3, - 0xe7, 0xa4, 0x7f, 0xf2, 0x3d, 0x16, 0x7f, 0xac, 0xe3, 0x38, 0x03, 0x40, - 0xa7, 0x92, 0xa4, 0x55, 0x8a, 0x3d, 0x58, 0x82, 0x75, 0x2f, 0xd1, 0xe5, - 0x06, 0x39, 0x8f, 0x15, 0xd3, 0x77, 0xb1, 0x1f, 0xcf, 0x6d, 0xde, 0xd3, - 0x15, 0x33, 0xd6, 0xa0, 0x76, 0x25, 0xf1, 0x8d, 0x66, 0xdd, 0x0f, 0x73, - 0xdc, 0x6c, 0x55, 0x97, 0x80, 0x26, 0x51, 0x62, 0xba, 0x87, 0xfe, 0x72, - 0x8c, 0x3a, 0x7b, 0xb7, 0xb0, 0xa6, 0xb0, 0xfc, 0xd2, 0x46, 0x0c, 0x76, - 0x0d, 0x26, 0x1d, 0x06, 0xcc, 0x64, 0x21, 0xee, 0x99, 0x9f, 0x42, 0x31, - 0x4c, 0x4d, 0x43, 0xcf, 0x12, 0x94, 0xed, 0x1e, 0x4b, 0x8d, 0x17, 0xd0, - 0xe3, 0xc4, 0x6f, 0xa5, 0x16, 0x69, 0x94, 0x04, 0x3d, 0xbf, 0x4b, 0x21, - 0x1d, 0x9f, 0x4e, 0xca, 0x1a, 0xd4, 0x35, 0xd5, 0x30, 0xfc, 0xda, 0xbb, - 0xe1, 0x45, 0xc5, 0xac, 0xa3, 0xe7, 0x0f, 0x13, 0x03, 0x69, 0xcc, 0x5b, - 0x30, 0xc4, 0x57, 0x74, 0xc6, 0x4d, 0xcb, 0x64, 0xb2, 0x2d, 0x48, 0xc6, - 0xbd, 0xe7, 0xc0, 0x17, 0x50, 0xa4, 0x2a, 0xd2, 0xee, 0x1c, 0x40, 0xb5, - 0x00, 0xf6, 0xed, 0x92, 0x81, 0x7e, 0x30, 0x21, 0xbc, 0xcb, 0xa1, 0x76, - 0x1c, 0x36, 0x82, 0xe0, 0xbc, 0xb9, 0xcc, 0xc2, 0x23, 0x86, 0x76, 0x2d, - 0xa9, 0x7f, 0xab, 0x84, 0x7e, 0x38, 0x04, 0x1e, 0xac, 0x17, 0x1f, 0x2e, - 0x02, 0xaf, 0x93, 0x81, 0x15, 0xc6, 0xfb, 0xb4, 0xd6, 0x4a, 0x1b, 0xd4, - 0x40, 0x7d, 0x93, 0x76, 0x39, 0x19, 0x8d, 0x83, 0xa5, 0x07, 0x41, 0xf0, - 0xff, 0x54, 0xe2, 0x4e, 0xdd, 0x36, 0xa1, 0xe0, 0x61, 0x57, 0x9c, 0x50, - 0x5a, 0xf3, 0x64, 0xfd, 0x07, 0x7c, 0xf1, 0xfa, 0x8e, 0xb1, 0xa8, 0xbc, - 0xd8, 0x93, 0xa6, 0x0a, 0x2b, 0x91, 0x32, 0xd1, 0xb1, 0x36, 0x7f, 0x87, - 0x18, 0xb9, 0xb5, 0xfb, 0x5e, 0xc4, 0x57, 0x2c, 0x3d, 0x07, 0x6c, 0x63, - 0x9b, 0xf9, 0x47, 0xc1, 0x00, 0x5d, 0xb5, 0x64, 0x15, 0xc2, 0x51, 0x04, - 0x5c, 0xb0, 0xf2, 0x9c, 0x97, 0xbe, 0x96, 0xde, 0x27, 0x09, 0x33, 0x75, - 0x93, 0x56, 0xba, 0x1c, 0xe6, 0x76, 0x3b, 0x28, 0x3d, 0xc5, 0x3b, 0x8b, - 0x11, 0x2f, 0xbd, 0x24, 0x08, 0x65, 0xfa, 0x13, 0x73, 0x68, 0x08, 0xda, - 0xac, 0x12, 0x96, 0xb6, 0xde, 0x12, 0xba, 0xba, 0xa6, 0x8d, 0x01, 0xc1, - 0xf5, 0xef, 0x23, 0xe7, 0x06, 0x3c, 0x8f, 0x15, 0xd3, 0x75, 0xb1, 0x1f, - 0xcf, 0x67, 0xde, 0xd7, 0x12, 0x33, 0xd6, 0xa0, 0x78, 0x98, 0xb4, 0x7a, - 0x01, 0x57, 0xa5, 0x3a, 0xa0, 0x3e, 0x78, 0x1b, 0x10, 0x4c, 0x6a, 0xed, - 0x08, 0x27, 0xe5, 0x5b, 0x4b, 0x61, 0xca, 0x7b, 0x0c, 0x78, 0x14, 0xe4, - 0xe3, 0x12, 0x5c, 0x6a, 0xb0, 0xf6, 0x9a, 0x02, 0x6f, 0x68, 0xa4, 0xdd, - 0x4a, 0xfa, 0xd7, 0x95, 0x0f, 0x87, 0x4c, 0x08, 0xe8, 0x61, 0xd9, 0x00, - 0xe5, 0x8b, 0xf1, 0x40, 0xff, 0x4c, 0x32, 0x3c, 0x74, 0x93, 0x17, 0x85, - 0xa1, 0xdc, 0xa1, 0xbf, 0xf8, 0x8b, 0xa7, 0x16, 0xbc, 0x4a, 0xcc, 0xc3, - 0x0a, 0xff, 0xc8, 0x62, 0x00, 0x01, 0x7a, 0xb2, 0x39, 0xec, 0x46, 0x16, - 0x9c, 0x41, 0x40, 0xc4, 0x45, 0x14, 0x9b, 0xad, 0xfc, 0x38, 0x3e, 0x64, - 0x00, 0xaa, 0xe2, 0xcc, 0x8d, 0x1c, 0xdd, 0xd6, 0xe6, 0xa6, 0x86, 0xb4, - 0xec, 0xb4, 0xe0, 0x36, 0xa9, 0xba, 0x9e, 0xdf, 0x38, 0xbf, 0x1a, 0xc3, - 0xc1, 0x35, 0x20, 0xf3, 0xa1, 0x26, 0x6e, 0x98, 0xa5, 0x64, 0x31, 0xe0, - 0x20, 0xe6, 0xfd, 0xb3, 0xa3, 0x7f, 0xe3, 0x00, 0xae, 0x31, 0x63, 0x3b, - 0x91, 0x89, 0x45, 0x4c, 0xfe, 0x4c, 0xe9, 0x75, 0x52, 0x3a, 0x84, 0xac, - 0x24, 0x5c, 0xe5, 0xb7, 0x7b, 0x4c, 0xfe, 0x9e, 0x63, 0xd7, 0x3b, 0x01, - 0x36, 0x3b, 0x3a, 0x42, 0xa1, 0x8b, 0xb9, 0x47, 0x28, 0x52, 0x61, 0xf3, - 0x5d, 0xb2, 0x3d, 0x13, 0x37, 0x9e, 0xd0, 0x09, 0xb1, 0x87, 0x79, 0x86, - 0xf1, 0x22, 0x1b, 0x6f, 0xc3, 0x77, 0x05, 0x66, 0xb6, 0xb7, 0x92, 0x96, - 0xb1, 0x3c, 0x7f, 0x83, 0x18, 0xbc, 0xb5, 0xf9, 0x5e, 0xc6, 0x57, 0x2d, - 0x3d, 0x0d, 0x6c, 0x63, 0x9d, 0x72, 0xaa, 0x45, 0xfc, 0x02, 0xae, 0x9e, - 0xce, 0xe1, 0x57, 0x24, 0xe0, 0x01, 0x9b, 0xc2, 0x0c, 0x4e, 0xa7, 0xd3, - 0xb6, 0xf9, 0x26, 0x3c, 0x23, 0x92, 0x62, 0x98, 0xbc, 0x71, 0x13, 0x6e, - 0x65, 0xbf, 0xd5, 0x60, 0x13, 0xdf, 0xf2, 0x28, 0xa2, 0xd9, 0xb2, 0x09, - 0x7a, 0xfd, 0x7e, 0x1a, 0x6b, 0x85, 0x0c, 0x14, 0xac, 0xf3, 0xde, 0x2c, - 0xb0, 0xf2, 0xc6, 0xe0, 0x1c, 0xcc, 0x82, 0x75, 0x11, 0xb6, 0xd2, 0x18, - 0x48, 0xa8, 0x9f, 0x71, 0xed, 0x64, 0x13, 0x9b, 0x6c, 0x35, 0x35, 0x2d, - 0xdf, 0xdf, 0xc6, 0xd3, 0x51, 0x70, 0x3f, 0x52, 0xb2, 0x7b, 0xfe, 0x08, - 0xbd, 0x59, 0xce, 0x9a, 0x95, 0x08, 0x05, 0x8f, 0xd9, 0xac, 0xf7, 0x68, - 0xe7, 0x5b, 0xda, 0x58, 0x04, 0xb0, 0xe2, 0xe2, 0x31, 0x51, 0x9f, 0xb8, - 0x73, 0x9d, 0x6c, 0xd7, 0xc7, 0x07, 0xc6, 0x30, 0x42, 0x2c, 0xf4, 0x9f, - 0x17, 0x00, 0x46, 0x01, 0x9f, 0xb0, 0x30, 0x97, 0xb5, 0x0e, 0xa5, 0x3d, - 0x0f, 0xbd, 0xd7, 0x03, 0x3d, 0xbf, 0x4b, 0x21, 0x1d, 0x95, 0x4e, 0xca, - 0x1d, 0xd4, 0x35, 0xd5, 0x30, 0xbc, 0x1a, 0xfb, 0xab, 0x51, 0x97, 0xce, - 0x25, 0xd2, 0xcf, 0x1a, 0x31, 0x0d, 0xf3, 0x18, 0xc4, 0x70, 0xb8, 0x6d, - 0xe7, 0xd5, 0xef, 0x98, 0x94, 0x07, 0xaa, 0x78, 0x6f, 0x16, 0xdd, 0x54, - 0x80, 0xb6, 0x82, 0x3d, 0xee, 0x19, 0x5e, 0xb5, 0x00, 0xf4, 0xe2, 0x92, - 0x81, 0x7e, 0x30, 0x21, 0xbc, 0xcb, 0xa1, 0x76, 0x5f, 0x31, 0xee, 0x92, - 0x06, 0x4a, 0x48, 0x40, 0x65, 0xf4, 0x55, 0xad, 0x70, 0x8c, 0x2e, 0x1e, - 0xbb, 0x90, 0x3e, 0x0d, 0x13, 0x56, 0xb9, 0xf4, 0xa4, 0x10, 0xbf, 0x65, - 0xc3, 0xe1, 0x13, 0x8b, 0x33, 0xa8, 0x7b, 0xf0, 0xb0, 0x51, 0xbf, 0x03, - 0xb6, 0xf4, 0x39, 0xcc, 0x8c, 0xe0, 0xe5, 0x38, 0xa1, 0x8b, 0xbb, 0x47, - 0x28, 0x52, 0x63, 0xf3, 0x5d, 0xb2, 0x3d, 0x13, 0x37, 0x9e, 0xd0, 0x09, - 0xb1, 0x87, 0x79, 0x86, 0xf1, 0x22, 0x1b, 0x6f, 0xc3, 0x77, 0x05, 0x66, - 0xb6, 0xb7, 0x92, 0x96, 0x8f, 0x9e, 0x7d, 0xe2, 0x7a, 0x92, 0xed, 0x04, - 0xb0, 0x60, 0x1b, 0x60, 0xbb, 0x22, 0x16, 0xde, 0xd8, 0xc3, 0x1b, 0x41, - 0x12, 0xc7, 0x99, 0xeb, 0xac, 0x50, 0xbc, 0x68, 0xca, 0x2a, 0x46, 0x7e, - 0x44, 0xf7, 0x1f, 0x86, 0x8a, 0x7b, 0xe0, 0x22, 0x42, 0x22, 0x3e, 0xf8, - 0xf3, 0x3e, 0xc0, 0x65, 0xc3, 0x2c, 0x21, 0x43, 0x4d, 0xc0, 0x3c, 0xa3, - 0xe7, 0xa1, 0x7f, 0xf2, 0x3d, 0x14, 0x7f, 0xac, 0x9c, 0xd0, 0xba, 0x3b, - 0x47, 0x12, 0xd2, 0xf7, 0x77, 0x19, 0x69, 0xbb, 0x90, 0xed, 0xd5, 0x6a, - 0x06, 0x39, 0x8f, 0x15, 0xd3, 0x77, 0xb1, 0x1f, 0xcf, 0x6d, 0xde, 0xd7, - 0x15, 0x33, 0xd2, 0xaa, 0x7c, 0x8f, 0x10, 0x07, 0xba, 0xdc, 0x54, 0x84, - 0xd9, 0x01, 0x88, 0x5a, 0x48, 0xc5, 0x53, 0xb9, 0xba, 0x87, 0xef, 0x05, - 0x8c, 0x3a, 0x7b, 0xb7, 0xa0, 0xb6, 0xb0, 0xed, 0xd2, 0x46, 0x0c, 0x66, - 0x0d, 0x26, 0x1d, 0x06, 0xcc, 0x64, 0x21, 0xee, 0x99, 0x9f, 0x42, 0x31, - 0x4c, 0x4d, 0x43, 0xcf, 0x7d, 0xa7, 0x29, 0xa2, 0xa9, 0x62, 0x1f, 0x14, - 0x96, 0xf6, 0xeb, 0x08, 0x5e, 0x23, 0x57, 0x2b, 0x6c, 0x3f, 0x43, 0x22, - 0xb9, 0x03, 0x23, 0x9b, 0xde, 0x77, 0x0e, 0x29, 0x13, 0xd7, 0x22, 0x15, - 0x53, 0x02, 0xba, 0x0a, 0xd2, 0x1d, 0xed, 0xc0, 0x11, 0x3d, 0xbf, 0x4d, - 0x6b, 0x8d, 0x04, 0x48, 0x41, 0xe8, 0x67, 0xa7, 0x55, 0x18, 0xa3, 0xa5, - 0xaf, 0x9b, 0xe1, 0x5b, 0xf3, 0xaf, 0xcc, 0x03, 0xec, 0xb4, 0xe0, 0x28, - 0xa9, 0xba, 0x9e, 0xd0, 0x38, 0xbf, 0x1a, 0xc3, 0xc1, 0x35, 0x20, 0xf3, - 0xb2, 0x97, 0x73, 0xbc, 0xa9, 0xbc, 0x79, 0xde, 0x79, 0xb3, 0x75, 0x0e, - 0x14, 0xe6, 0x2b, 0x58, 0x04, 0xb8, 0x4a, 0x4a, 0x56, 0xc2, 0xeb, 0x13, - 0xde, 0x58, 0x9b, 0x51, 0xdb, 0xa8, 0x0c, 0xba, 0xbc, 0x97, 0x33, 0xf2, - 0x72, 0x22, 0x73, 0x90, 0xee, 0x40, 0x0a, 0xf0, 0x7d, 0x89, 0x10, 0x59, - 0xb1, 0x8b, 0x4e, 0xf2, 0x4c, 0xc1, 0xa9, 0x72, 0x4f, 0x78, 0xeb, 0x9c, - 0xf6, 0xbd, 0x9f, 0x82, 0xb1, 0x87, 0x79, 0x89, 0xf1, 0x22, 0x1b, 0x6f, - 0xc3, 0x77, 0x05, 0x66, 0xb6, 0xb7, 0x92, 0x96, 0x8f, 0x9e, 0x7d, 0xe2, - 0x7a, 0x92, 0xed, 0x04, 0xb0, 0x60, 0x1b, 0x60, 0xbb, 0x22, 0x16, 0xde, - 0x31, 0xb7, 0x65, 0xda, 0x2c, 0xb5, 0xe6, 0xf0, 0xc5, 0x75, 0xc5, 0x01, - 0x2b, 0xad, 0xd0, 0x10, 0x9a, 0xbf, 0xa6, 0x35, 0x3d, 0xdd, 0x76, 0x96, - 0x69, 0xd5, 0x99, 0xf9, 0x2e, 0x8d, 0x5b, 0xca, 0x79, 0x49, 0x9c, 0xaf, - 0xb1, 0x17, 0x60, 0x18, 0x9e, 0xe5, 0xe3, 0x37, 0xc2, 0xca, 0x42, 0x43, - 0x8c, 0x15, 0x84, 0x3d, 0x71, 0x13, 0x86, 0xb0, 0xf6, 0xe7, 0x9c, 0x96, - 0x4d, 0xef, 0xee, 0x2f, 0x06, 0x3c, 0x8f, 0x17, 0xd3, 0x75, 0xb1, 0x1e, - 0xcf, 0x67, 0xde, 0xd7, 0x15, 0x33, 0xd6, 0xa0, 0xf0, 0x24, 0x2f, 0x7a, - 0xce, 0x1f, 0xae, 0xef, 0x68, 0x07, 0x00, 0xe6, 0x45, 0x8f, 0xe2, 0x74, - 0xc4, 0xc8, 0x26, 0x65, 0x23, 0x59, 0x57, 0x18, 0xa9, 0xfd, 0x52, 0xf9, - 0xb5, 0x3c, 0x5a, 0x49, 0x2d, 0x9f, 0xe7, 0xf3, 0xfc, 0x57, 0x69, 0x05, - 0x11, 0x13, 0xf2, 0xf3, 0xeb, 0x23, 0x68, 0x7c, 0xf4, 0x3c, 0xdd, 0x4b, - 0x2a, 0x92, 0x90, 0x28, 0x2e, 0x09, 0x62, 0xa7, 0x53, 0x18, 0x66, 0x3e, - 0xf3, 0xc9, 0xa8, 0x65, 0xb8, 0xc8, 0x5e, 0xc7, 0xbf, 0x03, 0xed, 0x32, - 0xdd, 0x1a, 0xdf, 0xd6, 0x35, 0x0e, 0x13, 0x10, 0x11, 0x86, 0x8c, 0x0a, - 0xa8, 0x9d, 0xac, 0x5a, 0x2a, 0x48, 0x1f, 0x02, 0x41, 0xe8, 0x67, 0xa7, - 0x45, 0x08, 0xb3, 0xb4, 0xbf, 0x8b, 0xf1, 0x4a, 0xf3, 0xaf, 0xcc, 0x03, - 0xee, 0x1c, 0x5e, 0xb5, 0x00, 0xf6, 0xe2, 0x92, 0x81, 0x7e, 0x30, 0x21, - 0xbc, 0xcb, 0xa1, 0x76, 0x6e, 0x7d, 0x56, 0xa6, 0xa5, 0x1c, 0xbf, 0xf1, - 0xbb, 0x82, 0xe8, 0x0e, 0x8d, 0xa5, 0x78, 0x57, 0xbb, 0x90, 0x3a, 0x17, - 0x13, 0x5c, 0xb9, 0xfe, 0xa4, 0x10, 0xbf, 0x65, 0xc3, 0xe1, 0x13, 0x8b, - 0x77, 0x2a, 0xfb, 0x92, 0x42, 0x0b, 0x0b, 0xbd, 0x8c, 0x57, 0xa5, 0x74, - 0x3a, 0x8c, 0xb4, 0xcc, 0xb1, 0x9b, 0xb9, 0x46, 0x38, 0x42, 0x61, 0xf3, - 0x5d, 0xb2, 0x3d, 0x13, 0x37, 0x9e, 0xd0, 0x09, 0x60, 0x28, 0xff, 0x2d, - 0x40, 0x39, 0x14, 0xc9, 0xaf, 0xf6, 0x80, 0x90, 0x27, 0x12, 0x7d, 0xc6, - 0xed, 0x14, 0x7f, 0x36, 0x50, 0xad, 0x25, 0xcc, 0x44, 0x09, 0x42, 0xd5, - 0x13, 0x68, 0x06, 0xf5, 0xb5, 0x3e, 0x81, 0x6d, 0xb2, 0x70, 0x43, 0xae, - 0x4c, 0x0b, 0x71, 0xe6, 0xcf, 0xb0, 0x41, 0x94, 0xa9, 0x8f, 0x74, 0xc3, - 0xa1, 0x47, 0x04, 0x8e, 0x95, 0xa8, 0xcb, 0x0b, 0xd9, 0x02, 0x31, 0xf3, - 0x3d, 0xbe, 0xf0, 0x99, 0x65, 0x7d, 0x5a, 0xd5, 0x55, 0x0c, 0xae, 0xa9, - 0xae, 0x01, 0x44, 0x4f, 0x87, 0x42, 0x81, 0x95, 0xcb, 0x1c, 0xd7, 0x27, - 0xbe, 0xd6, 0x4b, 0x86, 0x7e, 0x37, 0x63, 0x6d, 0x06, 0x39, 0x8f, 0x15, - 0xd3, 0x77, 0xb1, 0x1f, 0xcf, 0x67, 0xda, 0xc3, 0x12, 0x33, 0xd2, 0xa0, - 0x50, 0xbb, 0x80, 0x8a, 0x0f, 0xa9, 0xa0, 0xef, 0x60, 0x99, 0x45, 0x8d, - 0x66, 0x72, 0x30, 0x8e, 0x77, 0x60, 0xeb, 0x28, 0xf1, 0x6e, 0xfc, 0xfb, - 0x97, 0x01, 0xc7, 0xfd, 0x03, 0x27, 0xfe, 0xfc, 0xef, 0x1b, 0x14, 0x95, - 0x5c, 0x98, 0x63, 0x81, 0x96, 0xaa, 0x14, 0x4e, 0xf7, 0x0d, 0xd4, 0x6b, - 0xa0, 0x47, 0x35, 0xea, 0x7d, 0x0a, 0x55, 0x82, 0x04, 0x56, 0xf4, 0x22, - 0xf2, 0x9c, 0x5c, 0xf4, 0x6c, 0x3f, 0x43, 0x22, 0xb9, 0x09, 0x23, 0x8f, - 0xd9, 0x77, 0x0a, 0x23, 0x13, 0xd7, 0x22, 0x15, 0x8c, 0x27, 0x26, 0xdd, - 0x04, 0x5d, 0x36, 0x65, 0xe4, 0x38, 0xff, 0x9c, 0x29, 0x51, 0xa5, 0x0e, - 0x83, 0x3c, 0xd4, 0x8e, 0x34, 0xa9, 0xc2, 0xfd, 0x4a, 0x14, 0x50, 0x12, - 0xb7, 0xb2, 0x8e, 0x67, 0xf2, 0xae, 0x2b, 0x8a, 0xeb, 0xe9, 0xff, 0x29, - 0x4b, 0xe4, 0x51, 0x1c, 0x9b, 0xf4, 0xa4, 0x84, 0x2e, 0xb1, 0x2d, 0x63, - 0x09, 0x43, 0x7d, 0x4e, 0x61, 0x8c, 0xda, 0xf8, 0xb3, 0x41, 0x94, 0xaa, - 0x5a, 0x11, 0x5c, 0x55, 0x99, 0x28, 0x15, 0x4c, 0xc1, 0x4c, 0x01, 0xe7, - 0x92, 0xe1, 0xed, 0x98, 0x8f, 0x45, 0x77, 0x96, 0xb6, 0x9d, 0x83, 0x0c, - 0xf8, 0x71, 0xb1, 0xaa, 0xc3, 0xf6, 0x25, 0x6d, 0xff, 0x54, 0xe2, 0x4f, - 0xdd, 0x36, 0xa1, 0xe0, 0x61, 0x57, 0x9c, 0x50, 0x5a, 0xf3, 0x64, 0xfd, - 0x60, 0x2a, 0xf0, 0x2d, 0x40, 0x39, 0x14, 0xc9, 0xaf, 0xf6, 0x80, 0x90, - 0x27, 0x12, 0x7d, 0xc6, 0xed, 0x14, 0x7f, 0x36, 0x50, 0xad, 0x25, 0xcc, - 0x44, 0x09, 0x42, 0xd5, 0x13, 0x68, 0x06, 0xf5, 0xd5, 0x4e, 0xc4, 0xd6, - 0x23, 0x47, 0x40, 0x69, 0x77, 0x7d, 0xb8, 0x0d, 0xe0, 0x84, 0x41, 0xcf, - 0xa9, 0x8f, 0x74, 0xc3, 0xa1, 0x47, 0x73, 0xf9, 0x95, 0xa8, 0xcb, 0x0b, - 0xd9, 0x12, 0x31, 0xf3, 0x3d, 0xbe, 0xf0, 0x99, 0x65, 0x7d, 0x5a, 0xd5, - 0x55, 0x0c, 0xae, 0xa9, 0xae, 0x01, 0x44, 0x4f, 0x87, 0x42, 0x81, 0x95, - 0xcb, 0x1c, 0xd7, 0x27, 0xbe, 0xd6, 0x4b, 0x86, 0x7e, 0x37, 0x63, 0x6d, - 0x06, 0x39, 0x8f, 0x15, 0xd3, 0x77, 0xb1, 0x1f, 0xcf, 0x67, 0xda, 0xc3, - 0x12, 0x33, 0xd2, 0xa0, 0xd6, 0x15, 0x48, 0x5e, 0x07, 0xe6, 0xce, 0x1c, - 0xf5, 0x7d, 0x29, 0x2f, 0x49, 0x51, 0x5a, 0xbc, 0xe6, 0xc3, 0x76, 0xca, - 0xd3, 0x90, 0xc1, 0x18, 0xd5, 0x11, 0x9d, 0x9d, 0x07, 0xb3, 0x66, 0xa9, - 0x3a, 0x51, 0xed, 0x5e, 0x90, 0x0e, 0x5e, 0x34, 0xf8, 0x97, 0xca, 0x4d, - 0x74, 0xef, 0xf1, 0xd8, 0x95, 0x5e, 0x4a, 0xc9, 0xd1, 0xd0, 0x3a, 0x50, - 0x78, 0xb4, 0x70, 0x8d, 0x6f, 0x22, 0x02, 0x75, 0x34, 0x92, 0xdd, 0x29, - 0x0a, 0x11, 0xed, 0x73, 0xa1, 0x48, 0x78, 0xb7, 0x89, 0xb0, 0xd3, 0xe8, - 0xb7, 0x68, 0x3e, 0xd2, 0xe8, 0xd7, 0x11, 0x95, 0x73, 0x19, 0xbe, 0x62, - 0xc7, 0x14, 0x72, 0x39, 0xc2, 0xc0, 0xef, 0x7f, 0xe3, 0xf2, 0x61, 0xe9, - 0x03, 0x4b, 0xeb, 0x73, 0x6c, 0x00, 0x64, 0x91, 0x78, 0xf7, 0xa9, 0x51, - 0x12, 0x61, 0x16, 0x52, 0xfb, 0xfc, 0x27, 0x32, 0xd3, 0x47, 0xf4, 0x77, - 0xb0, 0x94, 0x59, 0x05, 0xb5, 0x1c, 0x12, 0xcb, 0xca, 0xc1, 0xef, 0xa7, - 0xa0, 0xe0, 0x55, 0x8a, 0xde, 0x7a, 0x6a, 0x64, 0x40, 0xb4, 0xb4, 0x6d, - 0x7a, 0xb7, 0x5b, 0xbb, 0x61, 0x7e, 0x63, 0x3b, 0xb3, 0xb0, 0xb9, 0x17, - 0xed, 0xc7, 0x7f, 0x6d, 0x1d, 0xd8, 0xac, 0xc5, 0x50, 0xca, 0x41, 0xc3, - 0x00, 0x1c, 0x2c, 0xdb, 0xdf, 0xa4, 0x3c, 0xff, 0x26, 0x23, 0x2d, 0x87, - 0x6c, 0x94, 0xb6, 0xb0, 0xe0, 0x2a, 0x1b, 0x8f, 0x9b, 0xf2, 0x99, 0xba, - 0xa8, 0xa8, 0xff, 0x56, 0x0c, 0xd1, 0xa1, 0x2d, 0x11, 0x34, 0x21, 0xa8, - 0xd4, 0xba, 0x21, 0xf8, 0xa1, 0x26, 0xba, 0x2b, 0x75, 0xd5, 0x62, 0x7f, - 0xd1, 0xb9, 0x4b, 0x1e, 0xdf, 0x13, 0x5a, 0x86, 0xd5, 0xc9, 0x28, 0x02, - 0x9e, 0x8c, 0xd5, 0x0a, 0x00, 0xf9, 0x77, 0xb8, 0x97, 0x57, 0xdf, 0x35, - 0x9d, 0xe5, 0x52, 0x01, 0x48, 0x96, 0x84, 0xf3, 0xad, 0x0a, 0x88, 0x88, - 0x53, 0x25, 0xc0, 0xa0, 0xca, 0xe2, 0xfb, 0xb0, 0x3a, 0x66, 0x75, 0x9e, - 0x76, 0x7b, 0xc4, 0x1c, 0x55, 0x5d, 0x3f, 0x8e, 0xc8, 0xaf, 0x86, 0x00, - 0xe5, 0x4c, 0xe4, 0x66, 0x6b, 0x0a, 0xe4, 0x43, 0x3a, 0x60, 0x5d, 0xee, - 0xf9, 0x3c, 0xba, 0xbc, 0x8c, 0xc7, 0xca, 0xca, 0xa0, 0xf6, 0x03, 0xe8, - 0x53, 0x8e, 0x84, 0xfd, 0xa9, 0xdb, 0xbe, 0xe9, 0x33, 0x77, 0x9b, 0x2a, - 0x7e, 0xda, 0x9c, 0x95, 0xef, 0x2c, 0x01, 0xa1, 0x43, 0xab, 0xcc, 0x90, - 0x17, 0xc3, 0x88, 0x07, 0x10, 0xe8, 0x62, 0xd6, 0xfd, 0xf8, 0x5c, 0xe4, - 0x0f, 0xa0, 0xb7, 0xda, 0xc0, 0xc0, 0xa2, 0xb3, 0x07, 0x38, 0xf3, 0xd1, - 0x0a, 0xc1, 0x65, 0x11, 0x49, 0x47, 0x4d, 0xb5, 0x4a, 0x01, 0x99, 0x31, - 0xf5, 0xe3, 0x0c, 0x60, 0xda, 0x54, 0xde, 0x18, 0xfa, 0x36, 0x95, 0x37, - 0x45, 0x99, 0x5f, 0x6c, 0x0e, 0x19, 0x37, 0x7b, 0xfd, 0x49, 0x11, 0xcf, - 0x8a, 0xf3, 0x0c, 0x04, 0x2b, 0xca, 0xa5, 0x9a, 0x2d, 0x7b, 0x35, 0x18, - 0xc7, 0xba, 0x6d, 0xa7, 0x07, 0x22, 0xc6, 0x72, 0x35, 0xe6, 0x49, 0x02, - 0x79, 0x90, 0x16, 0x97, 0x0b, 0xd4, 0x88, 0xbe, 0xf7, 0x27, 0x4d, 0x4c, - 0x44, 0x7f, 0x60, 0xbe, 0x75, 0xbb, 0x19, 0x83, 0xed, 0xae, 0x94, 0x38, - 0xc0, 0x35, 0xe3, 0x53, 0x5f, 0x3d, 0x78, 0x9b, 0x11, 0x34, 0x20, 0xaf, - 0xd4, 0xb2, 0x21, 0xf3, 0xa1, 0x26, 0xba, 0x2b, 0x75, 0xd5, 0x62, 0x7f, - 0xd3, 0x73, 0x3d, 0x6b, 0x76, 0x86, 0x91, 0x93, 0xda, 0xe7, 0x51, 0x09, - 0x0e, 0x31, 0xc7, 0xd9, 0x3d, 0x17, 0xfa, 0x20, 0xe3, 0xaf, 0x3c, 0x1c, - 0xd3, 0xe3, 0x70, 0x11, 0x55, 0x5d, 0xbb, 0x3f, 0x4b, 0xf0, 0x81, 0x16, - 0x6a, 0xa2, 0x45, 0x70, 0x97, 0xda, 0x46, 0xb9, 0x91, 0x7f, 0xe0, 0xf8, - 0x76, 0x72, 0xc4, 0x13, 0x55, 0x5d, 0x3f, 0x0e, 0xc8, 0x8f, 0x86, 0x00, - 0xe5, 0x4c, 0xe4, 0x66, 0x96, 0xaa, 0xa1, 0x78, 0xd7, 0x9b, 0x3e, 0x94, - 0xdb, 0x42, 0x08, 0x06, 0x17, 0xbf, 0x84, 0x10, 0x63, 0xdf, 0x6c, 0x9b, - 0x4d, 0x66, 0xb2, 0xcc, 0xb9, 0xbc, 0xe6, 0x78, 0x8f, 0xc8, 0x2d, 0xcd, - 0xb4, 0xcd, 0x43, 0x5b, 0x1b, 0x36, 0x99, 0xcb, 0x2a, 0x85, 0x92, 0x98, - 0xb2, 0x38, 0x8a, 0xd4, 0xd7, 0x09, 0x8d, 0xce, 0x4d, 0xf4, 0x23, 0x50, - 0x48, 0xfc, 0x27, 0x11, 0x38, 0x11, 0x2b, 0xd5, 0x66, 0xe2, 0xc8, 0x67, - 0x3e, 0x79, 0x0f, 0xc0, 0xc2, 0x6d, 0x7b, 0x82, 0x17, 0x15, 0xe7, 0x8b, - 0xc8, 0x6c, 0xc4, 0x9e, 0xa3, 0xf0, 0x32, 0xe7, 0x9c, 0xad, 0xc0, 0xcd, - 0xcb, 0x2f, 0x89, 0xff, 0x03, 0x41, 0xb1, 0x62, 0x73, 0x77, 0x0d, 0x28, - 0x9c, 0x5e, 0xd7, 0x84, 0x51, 0xaf, 0x65, 0x99, 0x60, 0xd3, 0x42, 0x7c, - 0x6c, 0x81, 0x94, 0xb3, 0x07, 0x9e, 0xa6, 0xda, 0x98, 0x09, 0xbb, 0xf7, - 0x1a, 0x5a, 0xce, 0x64, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0x92, 0x68, 0x7f, - 0xd7, 0xe0, 0xf8, 0xbe, 0xa4, 0xb9, 0x4c, 0x65, 0x85, 0x56, 0xe9, 0x4d, - 0xc6, 0x42, 0xb3, 0xbb, 0x34, 0x22, 0x4a, 0x91, 0xcd, 0xc4, 0x64, 0x56, - 0x88, 0x7b, 0x36, 0xef, 0x64, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0xb8, 0x91, - 0x8b, 0xc0, 0x6c, 0x08, 0xeb, 0x31, 0x65, 0xa0, 0x77, 0xf8, 0x69, 0x0b, - 0xed, 0x82, 0x0f, 0xd3, 0x79, 0x9d, 0x12, 0x60, 0x67, 0x08, 0x40, 0xf2, - 0x84, 0xa1, 0x85, 0x25, 0x28, 0xd7, 0xbd, 0x01, 0xd1, 0xfa, 0xc0, 0x77, - 0x32, 0xf6, 0x8d, 0x89, 0x07, 0x01, 0x59, 0xb3, 0xd6, 0x14, 0x2d, 0xc4, - 0x62, 0x96, 0x42, 0x1f, 0xbe, 0x64, 0xd6, 0x1e, 0xa4, 0xcb, 0xef, 0xe1, - 0x98, 0x46, 0x6e, 0x8a, 0x70, 0x80, 0x1b, 0x19, 0x37, 0xdf, 0x3f, 0x19, - 0x36, 0xab, 0xd5, 0x8b, 0xa0, 0xb8, 0xf0, 0x0e, 0x85, 0xe2, 0xd7, 0x7b, - 0x12, 0x3f, 0x20, 0x52, 0x6a, 0x09, 0x9e, 0xb8, 0xf0, 0x70, 0xdb, 0xd3, - 0x7e, 0x72, 0xcb, 0xa2, 0xfc, 0x6f, 0x47, 0x56, 0x73, 0x63, 0x3d, 0x0c, - 0x4d, 0xcb, 0x11, 0xc4, 0x7f, 0x2b, 0x91, 0xba, 0xe5, 0xb4, 0xed, 0xe3, - 0x24, 0xc3, 0xca, 0x51, 0x49, 0x95, 0xf4, 0xa8, 0xed, 0x91, 0x35, 0x8d, - 0x65, 0xa4, 0x77, 0x7c, 0x9c, 0x91, 0x32, 0xd4, 0xc1, 0xd3, 0xdf, 0x74, - 0x75, 0x00, 0x3e, 0x1d, 0xcd, 0xd0, 0x6d, 0xa9, 0xd1, 0x34, 0xed, 0x5b, - 0xbe, 0x14, 0x4a, 0x23, 0xbb, 0x5a, 0xf4, 0x93, 0xae, 0xea, 0x8e, 0x4d, - 0xa4, 0x63, 0x9f, 0x88, 0x31, 0x55, 0xac, 0x0a, 0x2d, 0x5b, 0x35, 0x18, - 0xc7, 0xba, 0x6d, 0xa7, 0xe9, 0xcc, 0xc6, 0x72, 0x35, 0xc4, 0x49, 0x02, - 0x15, 0xca, 0x3f, 0x6b, 0xe3, 0x44, 0x63, 0x3a, 0x2a, 0x7c, 0x8b, 0xb2, - 0x44, 0xf5, 0x32, 0xd8, 0x55, 0xc2, 0x55, 0xba, 0xd2, 0x19, 0x66, 0xb6, - 0x97, 0x5e, 0x8b, 0xf6, 0x9e, 0xe4, 0x26, 0xd6, 0xcb, 0xc2, 0x67, 0x50, - 0x88, 0x6d, 0x36, 0xf7, 0x64, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0x98, 0x90, - 0xd4, 0x70, 0xa5, 0xcc, 0x99, 0xcb, 0x42, 0x13, 0x97, 0x3a, 0xbb, 0xed, - 0x1a, 0xb7, 0xce, 0xd0, 0x2c, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x00, - 0xb7, 0xe8, 0x5d, 0x48, 0x0f, 0xbc, 0xc6, 0x12, 0xfc, 0x75, 0xac, 0xe2, - 0x1f, 0x0b, 0xe1, 0x36, 0x12, 0x70, 0x3c, 0x61, 0xbc, 0xa6, 0xf6, 0xa7, - 0x62, 0x9e, 0x42, 0x14, 0xbe, 0x64, 0xd6, 0x1e, 0xa4, 0xcb, 0xef, 0xe1, - 0x98, 0x46, 0x6e, 0x8a, 0x8d, 0xd3, 0xd4, 0x94, 0xe8, 0xd0, 0x91, 0xaf, - 0x48, 0x5f, 0x1b, 0x78, 0x61, 0x47, 0x60, 0x35, 0xf3, 0x71, 0x41, 0xc5, - 0x12, 0xd1, 0x41, 0x65, 0xdc, 0x93, 0xb0, 0xf7, 0x51, 0x01, 0x7a, 0x4e, - 0xc1, 0x33, 0xd2, 0xf0, 0x7c, 0x73, 0xee, 0x50, 0x51, 0x03, 0x52, 0x37, - 0xa3, 0x02, 0x4f, 0xa6, 0x2c, 0x2a, 0xb5, 0xe5, 0x49, 0x0e, 0xcc, 0x2d, - 0x59, 0xfa, 0xb4, 0xd6, 0xdf, 0x58, 0xe0, 0x94, 0x52, 0x86, 0x58, 0xf7, - 0x78, 0x8d, 0xb7, 0x9e, 0x4f, 0x0f, 0x61, 0xab, 0x25, 0xe7, 0x6e, 0xf1, - 0xd6, 0xed, 0x83, 0x44, 0x23, 0x6c, 0xfa, 0x5b, 0xba, 0xa3, 0xa5, 0x85, - 0x24, 0x69, 0xd8, 0xf6, 0xbb, 0x5a, 0xf4, 0x93, 0xae, 0xea, 0x8e, 0x4d, - 0xa4, 0x66, 0x9f, 0x85, 0x31, 0x55, 0xac, 0x8a, 0xbe, 0x3c, 0x51, 0x85, - 0x38, 0xc1, 0x9e, 0x9b, 0x2f, 0x45, 0xd4, 0x6a, 0x9b, 0x83, 0x40, 0x64, - 0x15, 0xca, 0x3f, 0x6b, 0xe3, 0x44, 0x63, 0x3a, 0x2a, 0x7c, 0x8b, 0xb2, - 0x44, 0x93, 0x32, 0xd8, 0xcf, 0x06, 0x9c, 0x55, 0xad, 0xfb, 0x82, 0xe9, - 0x60, 0x49, 0x77, 0xa4, 0x44, 0xbb, 0x95, 0x85, 0x60, 0xc6, 0x2f, 0x5e, - 0xd2, 0x15, 0xe1, 0xcb, 0x9e, 0x57, 0x0c, 0x26, 0xb6, 0xed, 0xb6, 0x56, - 0x52, 0x51, 0xac, 0xb3, 0xbf, 0xdb, 0x39, 0xbe, 0x7d, 0xe0, 0xad, 0x08, - 0xc6, 0x36, 0x4d, 0x84, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x27, 0x49, 0xc0, - 0x7b, 0xcd, 0x9f, 0x78, 0xd7, 0x97, 0xff, 0xce, 0xc6, 0x05, 0x5e, 0x2e, - 0x4b, 0x66, 0xef, 0x73, 0x3f, 0x9d, 0xbc, 0x39, 0xaf, 0x75, 0xef, 0x8c, - 0x62, 0x8b, 0x42, 0x03, 0xbe, 0x64, 0xd6, 0x1e, 0xa4, 0xcb, 0xcf, 0xe0, - 0x98, 0x46, 0x6e, 0x8a, 0x50, 0xdd, 0xbf, 0x0c, 0xcb, 0x08, 0xe7, 0xe8, - 0xc8, 0x0a, 0x1f, 0x0e, 0x3f, 0x3a, 0xff, 0x1e, 0x1b, 0xcb, 0xc0, 0xdd, - 0xde, 0xbd, 0x57, 0x63, 0xb8, 0x94, 0x2a, 0x63, 0x9a, 0x0f, 0xb9, 0x2c, - 0x79, 0x75, 0xcf, 0xa8, 0xe2, 0x71, 0x45, 0x53, 0x7c, 0x6c, 0x3c, 0x0e, - 0x4d, 0xcc, 0x11, 0xc2, 0x7f, 0x2b, 0x91, 0xba, 0xe5, 0xb4, 0xed, 0xe3, - 0x24, 0xc3, 0xca, 0x51, 0x49, 0x95, 0xf4, 0xa8, 0xee, 0x14, 0x85, 0xe8, - 0x29, 0xb0, 0x42, 0xa0, 0x51, 0xcf, 0x46, 0x65, 0x75, 0x6a, 0x85, 0xbe, - 0xda, 0x32, 0xb0, 0x79, 0x80, 0xe9, 0x55, 0x3f, 0xaa, 0x3d, 0x72, 0x94, - 0xac, 0x89, 0xb4, 0x13, 0x9e, 0xb6, 0xb4, 0x7b, 0x43, 0x82, 0xa4, 0xfb, - 0x22, 0x62, 0x3c, 0x38, 0x20, 0xec, 0x55, 0x88, 0x81, 0x15, 0xd1, 0x2a, - 0x5e, 0xbb, 0xe6, 0xfe, 0x06, 0x8d, 0xe4, 0x38, 0x4f, 0x5b, 0xb3, 0xf7, - 0xf9, 0x33, 0xc2, 0x68, 0x55, 0xa0, 0x97, 0xf0, 0x25, 0x8f, 0x58, 0x71, - 0x59, 0x48, 0x05, 0xe9, 0xbf, 0x96, 0x41, 0xaf, 0xfe, 0x7d, 0x1a, 0x5f, - 0x27, 0x55, 0xd0, 0xcd, 0xda, 0x1f, 0x6e, 0xf5, 0xc5, 0xcc, 0x67, 0x50, - 0x88, 0x6c, 0x36, 0xf6, 0x64, 0xd8, 0x11, 0xce, 0x9c, 0xe6, 0x98, 0x90, - 0x4f, 0x25, 0xef, 0x63, 0xd0, 0x12, 0xc8, 0x43, 0x6e, 0xef, 0x30, 0xf8, - 0xe8, 0x1f, 0xa1, 0x81, 0x89, 0x3b, 0x57, 0x22, 0x7a, 0x61, 0x99, 0xa6, - 0x08, 0xaf, 0x9e, 0x26, 0x5b, 0xd7, 0x1e, 0x4f, 0x94, 0xa7, 0x47, 0xa6, - 0x14, 0x8b, 0x79, 0x83, 0x6c, 0xcb, 0x68, 0xd7, 0x19, 0x55, 0x34, 0x63, - 0x62, 0x9d, 0x42, 0x1b, 0xbe, 0x64, 0xd6, 0x1e, 0x86, 0xcb, 0xef, 0xe1, - 0x98, 0x46, 0x6e, 0x8a, 0x52, 0xe4, 0xf2, 0xcd, 0x26, 0x7e, 0x13, 0xad, - 0x18, 0x6a, 0x80, 0x9a, 0x13, 0xf1, 0xe9, 0x2a, 0x40, 0x2d, 0xc0, 0x10, - 0xd6, 0x3b, 0xb7, 0xc8, 0x09, 0x27, 0xe4, 0x70, 0x34, 0x3f, 0x18, 0xfe, - 0x7e, 0x72, 0xcb, 0xa8, 0xfc, 0x6f, 0x47, 0x53, 0x73, 0x63, 0x3d, 0x0e, - 0x4d, 0xc4, 0x11, 0xc9, 0x87, 0x8c, 0x9b, 0xd1, 0x41, 0xc2, 0x15, 0x44, - 0x64, 0x04, 0x8f, 0x6b, 0x7d, 0xb8, 0x98, 0x80, 0xfb, 0x05, 0xd5, 0x7b, - 0xab, 0x98, 0x3d, 0xfc, 0x43, 0x5e, 0xbf, 0x7c, 0x46, 0xfd, 0xb1, 0x30, - 0x91, 0x55, 0xf1, 0xe5, 0xce, 0xe4, 0x19, 0x61, 0x0a, 0x58, 0x0c, 0xba, - 0x93, 0x0a, 0x9c, 0x4c, 0x9e, 0xb6, 0xb4, 0x7b, 0x43, 0x82, 0xa4, 0xfb, - 0x22, 0x6b, 0x3c, 0x37, 0x20, 0xec, 0x55, 0x08, 0x17, 0x69, 0x97, 0x43, - 0xb2, 0xc0, 0x4a, 0xe1, 0x5f, 0xf3, 0x7c, 0x8c, 0x4e, 0x49, 0x67, 0xb8, - 0xb4, 0x5e, 0x18, 0xef, 0xc7, 0x0f, 0x9f, 0x93, 0x87, 0xd6, 0x91, 0x6c, - 0x10, 0x71, 0x88, 0x8e, 0x1d, 0x22, 0x96, 0x55, 0x93, 0xd9, 0xf9, 0x9d, - 0x8e, 0x1b, 0xdb, 0xae, 0x72, 0x87, 0xa9, 0x4c, 0xc4, 0xcd, 0x67, 0x50, - 0x88, 0x69, 0x36, 0xfb, 0x64, 0xd8, 0x11, 0x4e, 0x9c, 0xe6, 0x98, 0x90, - 0x8e, 0xa1, 0x0d, 0x23, 0x28, 0x06, 0x4f, 0x4e, 0x7e, 0xdb, 0x74, 0x18, - 0x80, 0x18, 0x12, 0x1e, 0xbe, 0x5e, 0x49, 0xa4, 0x9c, 0x8e, 0xf7, 0x89, - 0x9a, 0x4d, 0x8d, 0x13, 0x9a, 0x58, 0xb3, 0x88, 0x31, 0xef, 0xd7, 0xe9, - 0x86, 0x20, 0x31, 0x5d, 0x80, 0x0b, 0x77, 0x49, 0x10, 0xe4, 0xaf, 0xe9, - 0x95, 0x73, 0xb2, 0xd8, 0xaf, 0xec, 0x4e, 0x6f, 0xe8, 0xa2, 0x51, 0x05, - 0x48, 0xee, 0xee, 0x75, 0xe0, 0xff, 0xc7, 0xfc, 0x6d, 0x3d, 0xbd, 0x51, - 0x64, 0xbf, 0xd2, 0x45, 0x55, 0xfa, 0x9a, 0x78, 0x1a, 0xd8, 0xda, 0x8b, - 0x2f, 0x78, 0xbe, 0x17, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0xe2, 0x15, 0x90, 0x14, 0xff, 0xe5, 0xdd, 0x37, 0xc1, 0xdf, 0x6e, 0xe4, - 0xb7, 0x8c, 0x42, 0x3c, 0xe1, 0x8c, 0x9b, 0xd1, 0x41, 0xc2, 0x35, 0x45, - 0x64, 0x04, 0x8f, 0x6b, 0x7d, 0xb8, 0x98, 0x80, 0x00, 0xc8, 0xd9, 0x9b, - 0xd4, 0x67, 0xb3, 0x63, 0xed, 0xeb, 0x5c, 0x1a, 0x9a, 0x57, 0xaa, 0xd9, - 0xdc, 0x76, 0x42, 0x88, 0xac, 0x00, 0xcb, 0x6a, 0x1b, 0x75, 0x37, 0xb1, - 0x4b, 0x29, 0x4e, 0x5f, 0xa5, 0x44, 0xf9, 0x96, 0xa1, 0xe5, 0x88, 0x4f, - 0xa4, 0x69, 0x9f, 0x8d, 0x57, 0x55, 0xac, 0x0a, 0xd3, 0x89, 0x22, 0xef, - 0x4a, 0x52, 0xbf, 0xeb, 0x93, 0x6c, 0x9b, 0x0f, 0xbe, 0x09, 0xb0, 0x67, - 0x4a, 0x39, 0xef, 0x87, 0x88, 0x4d, 0xa6, 0x33, 0x39, 0x84, 0x02, 0xb0, - 0xed, 0xe4, 0xdb, 0xa8, 0x82, 0x6b, 0x57, 0x6a, 0x85, 0x7d, 0x22, 0x65, - 0xd4, 0xa3, 0xc4, 0x88, 0x81, 0x2d, 0xf7, 0xdd, 0xcb, 0xc2, 0x67, 0x50, - 0x88, 0x61, 0x36, 0xf5, 0x02, 0xd8, 0x11, 0xce, 0xbe, 0xe6, 0x98, 0x90, - 0x1a, 0x44, 0x07, 0xbb, 0xa7, 0xe1, 0xc3, 0x87, 0xdb, 0xc2, 0x5a, 0xa4, - 0x45, 0xe2, 0x43, 0x53, 0x2c, 0x55, 0xb8, 0x72, 0x7d, 0x86, 0x3c, 0x18, - 0xb7, 0xf9, 0x5a, 0x38, 0x0f, 0xbc, 0xc6, 0x12, 0x9d, 0x48, 0xb9, 0x5e, - 0x73, 0x33, 0x1f, 0xb6, 0x18, 0xb8, 0xec, 0x2a, 0x6f, 0x4c, 0x6d, 0xbf, - 0x62, 0x9c, 0x42, 0x1a, 0xd8, 0x64, 0xd6, 0x1e, 0xa4, 0xcb, 0xef, 0xe1, - 0x98, 0x46, 0x6e, 0x8a, 0x13, 0xaf, 0x65, 0x6c, 0x1a, 0x39, 0x8c, 0x7f, - 0x8c, 0x81, 0x60, 0x67, 0xd1, 0x80, 0xda, 0xd0, 0x12, 0x77, 0x20, 0xa3, - 0xd1, 0x4e, 0xef, 0xbf, 0x1c, 0x68, 0x37, 0x21, 0x05, 0xb4, 0xd1, 0x59, - 0x96, 0x0a, 0xa9, 0x1b, 0xf5, 0xdc, 0x06, 0xb3, 0xd2, 0xeb, 0xd9, 0xc1, - 0xc2, 0x96, 0x03, 0x05, 0xe1, 0x8c, 0x9b, 0xd1, 0x41, 0xc2, 0x15, 0x44, - 0x64, 0x04, 0x8f, 0x6b, 0x7d, 0xb8, 0x98, 0x80, 0xb3, 0x5b, 0x0a, 0x20, - 0xdb, 0xc3, 0xd8, 0x83, 0x1d, 0x9f, 0x67, 0x05, 0x4b, 0x78, 0x58, 0x2c, - 0xe0, 0x78, 0x48, 0x67, 0x17, 0x11, 0xa4, 0x6e, 0x1a, 0x68, 0x38, 0xb1, - 0xfc, 0xfb, 0x39, 0x12, 0xa5, 0x44, 0xfb, 0x96, 0xa1, 0xe5, 0x89, 0x4f, - 0xa4, 0x61, 0x9f, 0x86, 0x57, 0x55, 0xac, 0x0a, 0xbe, 0x9b, 0x78, 0xce, - 0xa1, 0x30, 0xc3, 0x2d, 0xb9, 0xa0, 0xe8, 0x2b, 0xbe, 0xc2, 0x27, 0x1a, - 0x15, 0xca, 0x3f, 0x6b, 0xe3, 0x44, 0x63, 0x3a, 0x2a, 0x7c, 0x8b, 0xaa, - 0x44, 0x93, 0x32, 0xd8, 0xdf, 0x1f, 0xe4, 0x4e, 0x1d, 0x54, 0x0d, 0x80, - 0x48, 0xdc, 0x4a, 0x67, 0xf6, 0x76, 0xd0, 0x07, 0xcb, 0xc2, 0x67, 0x50, - 0x88, 0x68, 0x36, 0xfa, 0x02, 0xd8, 0x11, 0x4e, 0xbe, 0xe6, 0x98, 0x90, - 0xd3, 0x73, 0x3d, 0x6b, 0x98, 0x68, 0x91, 0x93, 0xda, 0xc5, 0x51, 0x09, - 0x0e, 0x31, 0xc7, 0xd9, 0x23, 0xce, 0xc0, 0xd8, 0x63, 0x91, 0x64, 0x56, - 0x41, 0x9c, 0xd0, 0x7e, 0x67, 0xef, 0xbb, 0x7f, 0x65, 0x4d, 0x77, 0x80, - 0x49, 0xf5, 0x29, 0x19, 0xdc, 0x6f, 0xbc, 0xf7, 0xa3, 0x26, 0xb2, 0x29, - 0x62, 0x99, 0x42, 0x17, 0xd8, 0x64, 0xd6, 0x9e, 0xa4, 0xcb, 0xed, 0xe1, - 0x98, 0x46, 0x6e, 0x8a, 0x8d, 0xd3, 0xd4, 0x94, 0xe8, 0xd0, 0x91, 0xaf, - 0x48, 0x5f, 0x1b, 0x78, 0x61, 0x47, 0x60, 0x35, 0xab, 0x9c, 0xfd, 0x3d, - 0xbd, 0x34, 0x65, 0xf7, 0xb0, 0x7e, 0xac, 0xe7, 0xa2, 0x0c, 0x8c, 0x7c, - 0x4e, 0x07, 0xb5, 0x31, 0x97, 0x43, 0xbc, 0xfc, 0xe7, 0x21, 0x2d, 0x6d, - 0x9e, 0xf1, 0xfd, 0xdb, 0x7a, 0xe1, 0xa6, 0x59, 0x1c, 0x57, 0xd3, 0x0e, - 0x5f, 0xf7, 0x8a, 0xda, 0xaf, 0xc9, 0x8b, 0xc1, 0xc1, 0xf4, 0x57, 0x8f, - 0x9e, 0x31, 0xfc, 0x74, 0x6b, 0x93, 0x45, 0xd3, 0x1f, 0x9b, 0x0d, 0xa5, - 0x95, 0xf4, 0xfb, 0x73, 0x4f, 0xa5, 0x33, 0x6f, 0x54, 0x87, 0x74, 0xd6, - 0xcf, 0x7b, 0xdd, 0xc3, 0x91, 0x36, 0x05, 0xe7, 0x32, 0x87, 0xc5, 0x9d, - 0x4a, 0x52, 0x73, 0x39, 0x1f, 0x48, 0xc3, 0x6b, 0x76, 0x9b, 0xc3, 0x9e, - 0xa8, 0x30, 0x69, 0x3e, 0x1f, 0x2f, 0x49, 0x49, 0x04, 0xa1, 0xe0, 0xe1, - 0xbc, 0xae, 0xb9, 0x22, 0xda, 0x66, 0x02, 0x97, 0x5d, 0xcf, 0x25, 0x8b, - 0x17, 0x0b, 0x14, 0x4e, 0x85, 0xff, 0xf3, 0xbb, 0x4c, 0xef, 0x41, 0x21, - 0xcd, 0x65, 0xa5, 0xd8, 0xfa, 0x7d, 0x00, 0x6e, 0xa4, 0xdf, 0xfb, 0xf9, - 0x1e, 0x2d, 0xe1, 0x22, 0x35, 0xdd, 0x41, 0x37, 0xc4, 0x31, 0x5b, 0xba, - 0xd6, 0x3f, 0xd2, 0x55, 0x0d, 0x91, 0xb4, 0x6f, 0xce, 0xa9, 0xcb, 0xbc, - 0xa7, 0x72, 0x49, 0xbd, 0x4c, 0x83, 0x24, 0x9b, 0x4b, 0xbe, 0xed, 0x5b, - 0x2f, 0xf9, 0xa8, 0x54, 0x6f, 0x64, 0xd6, 0xeb, 0x9c, 0x16, 0x41, 0xeb, - 0x45, 0x7f, 0x42, 0x2f, 0xf3, 0x77, 0x1a, 0x99, 0x90, 0xa8, 0xb2, 0xa3, - 0x59, 0xeb, 0xdf, 0x9a, 0xd3, 0x9a, 0x2b, 0xf3, 0xb8, 0x4d, 0x64, 0x9c, - 0x2f, 0xdf, 0x35, 0x83, 0x72, 0x8e, 0x81, 0x17, 0x9f, 0x4e, 0xa1, 0xaf, - 0x67, 0x17, 0x3f, 0x9b, 0x22, 0x44, 0x7e, 0x65, 0x4e, 0x8b, 0x55, 0xbd, - 0xd1, 0xad, 0x1d, 0xe3, 0xa1, 0x7d, 0x38, 0x41, 0x6d, 0x68, 0xd8, 0x3e, - 0xb0, 0xc6, 0x09, 0x16, 0x32, 0xdb, 0x86, 0xf7, 0xbc, 0xe0, 0x7f, 0x6d, - 0x5d, 0x08, 0x3b, 0x38, 0x3a, 0xe8, 0x94, 0x19, 0x71, 0xac, 0xfb, 0xfe, - 0xf3, 0x8e, 0x96, 0x93, 0x0d, 0x11, 0x3f, 0x01, 0x59, 0xef, 0x44, 0x23, - 0x74, 0x68, 0x57, 0x81, 0xd1, 0xb9, 0xf0, 0xf3, 0xdd, 0xcf, 0xef, 0x40, - 0x2d, 0xee, 0x07, 0xfa, 0x89, 0xcd, 0xac, 0x08, 0x11, 0x5d, 0xdd, 0x5f, - 0x3c, 0xcc, 0x99, 0x47, 0x78, 0x3f, 0x5e, 0x04, 0x83, 0x78, 0xb1, 0x3c, - 0xd8, 0x15, 0x0c, 0x02, 0xd2, 0x68, 0xee, 0x76, 0xcc, 0x8b, 0x08, 0x3e, - 0x21, 0x59, 0x47, 0x54, 0x2a, 0x26, 0x87, 0x73, 0x49, 0x56, 0x6d, 0xb6, - 0xd2, 0xef, 0xeb, 0xfa, 0x05, 0x63, 0x88, 0xce, 0x07, 0xf8, 0xcd, 0x55, - 0xbe, 0x4f, 0x81, 0x86, 0x7e, 0x8a, 0xf6, 0xb9, 0x03, 0x76, 0x44, 0x72, - 0x4d, 0xad, 0x85, 0xec, 0xac, 0x1d, 0x2d, 0x64, 0xb0, 0xfc, 0x7e, 0xfe, - 0x8b, 0x66, 0x56, 0xcb, 0x50, 0xa7, 0x3c, 0xaa, 0x99, 0x2f, 0x93, 0xaa, - 0x73, 0x0c, 0x15, 0x92, 0x54, 0xa8, 0xf1, 0xb8, 0xaa, 0xb2, 0x3f, 0x5a, - 0x50, 0xce, 0xfa, 0xef, 0xec, 0xa7, 0xbf, 0xf0, 0x6e, 0x83, 0x66, 0x3d, - 0x6c, 0x3e, 0xda, 0x83, 0xec, 0xb9, 0x8f, 0xf9, 0xe2, 0x77, 0xa3, 0xb5, - 0xdf, 0x8f, 0x3a, 0x76, 0xc8, 0x41, 0x11, 0x35, 0xd3, 0x24, 0x1c, 0x25, - 0xc7, 0xd1, 0x67, 0x29, 0xa8, 0x08, 0xd1, 0x50, 0xba, 0xaa, 0x22, 0xa0, - 0xfe, 0xb1, 0x53, 0x8d, 0x45, 0x8a, 0xe7, 0xd7, 0x47, 0xac, 0x07, 0x0e, - 0x78, 0x1a, 0x75, 0x24, 0x0d, 0x4a, 0xd8, 0xec, 0x64, 0xf0, 0x32, 0xb9, - 0x0b, 0x1b, 0x6f, 0xe9, 0xf5, 0x52, 0xa7, 0xec, 0xb7, 0x66, 0xae, 0x69, - 0x6a, 0x1f, 0x1f, 0xc4, 0x21, 0x84, 0xfa, 0xed, 0xf7, 0xd7, 0xe3, 0x4d, - 0xec, 0xd4, 0x19, 0x39, 0x0a, 0x45, 0xc5, 0x22, 0xf7, 0xa1, 0x5e, 0x0f, - 0x8f, 0x48, 0xa6, 0xd5, 0xf5, 0xe5, 0x7d, 0xa6, 0xba, 0x72, 0xfd, 0x05, - 0x27, 0x7d, 0x55, 0x5d, 0x2b, 0x24, 0x26, 0x31, 0x05, 0xd8, 0xaa, 0x9c, - 0x0c, 0x3d, 0xec, 0x43, 0xae, 0x04, 0x5f, 0x64, 0xdd, 0x27, 0x14, 0x49, - 0x29, 0xeb, 0xef, 0x7b, 0x7c, 0xf8, 0x4f, 0x81, 0xc3, 0xf8, 0x43, 0x1c, - 0x87, 0x1b, 0x8f, 0x01, 0x31, 0xa6, 0x88, 0x97, 0x2d, 0x71, 0x84, 0xe8, - 0x73, 0x7a, 0x48, 0x82, 0x01, 0x6c, 0x58, 0x32, 0xa1, 0x41, 0x79, 0xbb, - 0xcb, 0xd5, 0xeb, 0x1d, 0x39, 0x92, 0x95, 0xd0, 0x48, 0x68, 0x44, 0x0f, - 0x6c, 0xc3, 0xe3, 0x29, 0x5d, 0x41, 0x3c, 0x5f, 0xc3, 0x4c, 0x10, 0xb0, - 0x83, 0xd5, 0xd5, 0x0d, 0x48, 0x51, 0x18, 0xf2, 0xa4, 0xe5, 0xae, 0x81, - 0xa3, 0xd3, 0x53, 0x4c, 0x51, 0x66, 0x8f, 0xdc, 0x9c, 0x58, 0x31, 0x8d, - 0xd1, 0x7a, 0x86, 0xd5, 0x1f, 0x28, 0x29, 0xba, 0xd4, 0x06, 0xb8, 0xbe, - 0x6f, 0x96, 0xa7, 0xcc, 0xbb, 0x1c, 0xd7, 0x88, 0x8f, 0x30, 0x50, 0xf2, - 0x49, 0xc8, 0xf2, 0x42, 0xc0, 0x5d, 0x3e, 0x19, 0xe4, 0xfb, 0x16, 0x60, - 0x09, 0x8d, 0xaf, 0x83, 0x9c, 0x69, 0xaa, 0xab, 0x00, 0x8a, 0x74, 0xfb, - 0x18, 0x9a, 0x80, 0x96, 0x63, 0x60, 0xc2, 0x50, 0x0c, 0x74, 0xf5, 0xc4, - 0x94, 0x91, 0x0a, 0x5b, 0xa3, 0xdb, 0x81, 0x52, 0x08, 0x7d, 0x1e, 0x0b, - 0x24, 0xca, 0x42, 0x78, 0x00, 0x5a, 0x9d, 0x88, 0x95, 0xdf, 0x2d, 0xc7, - 0xdb, 0xc0, 0x56, 0x71, 0x08, 0x9b, 0x4e, 0xe8, 0x7b, 0xa3, 0x97, 0x07, - 0xfd, 0x58, 0xc5, 0x59, 0x61, 0xd9, 0x58, 0x88, 0xdf, 0xd1, 0xdd, 0x94, - 0x10, 0x96, 0x37, 0xf3, 0x74, 0x70, 0x62, 0xdd, 0x0f, 0x86, 0xd1, 0xd2, - 0x52, 0xbb, 0x2b, 0x4b, 0xe9, 0x5a, 0x68, 0x96, 0x0a, 0x3a, 0x63, 0x1e, - 0xbc, 0x7d, 0xd4, 0xa0, 0xfb, 0xca, 0x67, 0x64, 0xbd, 0xf4, 0x86, 0xc9, - 0x7b, 0x26, 0x32, 0x49, 0xee, 0xbc, 0x5b, 0x95, 0xc7, 0xa5, 0x0d, 0xce, - 0xff, 0xab, 0x60, 0x0f, 0xe4, 0x5b, 0xf2, 0x73, 0x1b, 0x38, 0x4d, 0xd6, - 0xe8, 0x0d, 0x7b, 0x37, 0x1e, 0x25, 0x24, 0xbf, 0xe0, 0xed, 0xd9, 0x33, - 0x35, 0x34, 0xfa, 0x6d, 0xbd, 0x2b, 0x0c, 0xdd, 0x22, 0x42, 0x90, 0x73, - 0x28, 0x30, 0x5b, 0xce, 0x47, 0x80, 0x1b, 0x42, 0xe2, 0x26, 0x88, 0xfa, - 0xf0, 0xe1, 0xa3, 0xff, 0x54, 0x0c, 0x80, 0xd5, 0x47, 0xc2, 0xc0, 0x04, - 0x6e, 0x41, 0x02, 0x59, 0x14, 0x13, 0x39, 0x7e, 0xe6, 0xa6, 0xcb, 0x4d, - 0x19, 0xd2, 0xf8, 0x13, 0x01, 0x38, 0x4d, 0xf4, 0xb1, 0x88, 0x63, 0x4b, - 0xdd, 0x42, 0x11, 0x93, 0x7f, 0x54, 0x17, 0x0c, 0x50, 0xea, 0x88, 0xfc, - 0xf3, 0x87, 0x27, 0x28, 0x6d, 0x31, 0x03, 0x6e, 0x48, 0x17, 0xcf, 0x0f, - 0xb8, 0x30, 0x70, 0xfc, 0xec, 0x32, 0x88, 0x6a, 0x29, 0x93, 0x37, 0xcd, - 0xb3, 0x44, 0x48, 0xb2, 0xf3, 0x32, 0xae, 0x87, 0x4c, 0x78, 0xa9, 0x06, - 0xb2, 0x3d, 0x59, 0xf3, 0xbb, 0xb6, 0x56, 0xa8, 0x8c, 0xe0, 0x1a, 0x5a, - 0xde, 0xfa, 0xc9, 0xbe, 0x7a, 0xb4, 0xf2, 0xf7, 0x3e, 0x60, 0xa2, 0x06, - 0x1c, 0x51, 0x40, 0xa2, 0xa8, 0x40, 0x6d, 0x57, 0x5f, 0x3f, 0xeb, 0x1e, - 0xe0, 0x30, 0xf7, 0xef, 0x93, 0xc5, 0xf2, 0x2b, 0x97, 0xf3, 0x88, 0x39, - 0xc5, 0x4d, 0xc2, 0x4b, 0xed, 0xff, 0x5c, 0xb3, 0x13, 0x49, 0xc0, 0xc0, - 0x1f, 0xdf, 0x71, 0x3d, 0xd5, 0x05, 0xb1, 0x1d, 0x6f, 0x83, 0x3c, 0x11, - 0x9a, 0x3c, 0x6a, 0xdf, 0x6d, 0x1b, 0xc4, 0xce, 0x7d, 0x1e, 0xc5, 0xa0, - 0xf8, 0x02, 0x00, 0x7a, 0xdc, 0x60, 0xdc, 0x57, 0x52, 0xff, 0xff, 0xd6, - 0xf1, 0xba, 0x42, 0x34, 0x3c, 0x8c, 0x31, 0xff, 0x3f, 0xd1, 0x95, 0xc5, - 0x56, 0xb0, 0x0c, 0x6c, 0x08, 0x18, 0xef, 0x78, 0x88, 0xde, 0x46, 0xef, - 0x46, 0xa2, 0x30, 0x47, 0x3f, 0xd7, 0xe9, 0xf0, 0x9e, 0xce, 0x4e, 0x50, - 0xb8, 0xb6, 0x73, 0x6b, 0xa4, 0x2e, 0x1f, 0x7b, 0xf1, 0x96, 0xbe, 0xd4, - 0xb6, 0x8e, 0x8d, 0xf5, 0x8f, 0x6a, 0x96, 0x99, 0xb1, 0x17, 0xd8, 0x03, - 0x47, 0xaf, 0x6b, 0x18, 0x12, 0x70, 0xe9, 0x58, 0xed, 0x8b, 0x10, 0xad, - 0x8c, 0xc9, 0xd2, 0x4c, 0xef, 0xaf, 0xef, 0x23, 0x92, 0xdb, 0x13, 0xba, - 0xc6, 0xb0, 0xfb, 0x68, 0x3a, 0xf1, 0x50, 0xa1, 0xde, 0xf9, 0x81, 0xa1, - 0x52, 0x32, 0xd5, 0x2b, 0x46, 0xf5, 0x70, 0xe1, 0xfc, 0xe6, 0x35, 0xc6, - 0x0e, 0x77, 0xc4, 0x2d, 0xfe, 0xdf, 0x06, 0xf4, 0xb5, 0x16, 0xb4, 0xc3, - 0x98, 0xc1, 0xd9, 0xf1, 0xea, 0x2f, 0xaa, 0xb6, 0xab, 0xa9, 0x53, 0x71, - 0x28, 0x8c, 0x53, 0x15, 0x3c, 0x00, 0x4a, 0xd2, 0x5f, 0x5d, 0xa4, 0x6a, - 0x9b, 0xd3, 0x58, 0xec, 0xe3, 0xc3, 0xd5, 0x83, 0xcd, 0x6c, 0xd2, 0x6d, - 0x9e, 0x61, 0x56, 0x83, 0xd0, 0xe0, 0x5f, 0xa8, 0x98, 0xcb, 0x06, 0x54, - 0x03, 0x1f, 0x0c, 0x80, 0x4c, 0x5c, 0xd0, 0x14, 0xd6, 0xee, 0xb7, 0xb2, - 0xfc, 0xfb, 0xa1, 0x4e, 0xef, 0xdd, 0x6a, 0xa0, 0xde, 0x7b, 0x19, 0xf9, - 0xe0, 0x4e, 0xe5, 0xf5, 0x9e, 0x67, 0x09, 0x83, 0x58, 0x77, 0x73, 0xee, - 0x1c, 0xc2, 0xb1, 0xd0, 0x12, 0x53, 0x97, 0x7d, 0xc5, 0xd7, 0xd2, 0xac, - 0x8f, 0x82, 0xe2, 0x7a, 0xe0, 0xb5, 0x93, 0x20, 0x34, 0xeb, 0x34, 0x10, - 0x4d, 0x97, 0x46, 0xbe, 0xd9, 0x21, 0x05, 0xea, 0xf2, 0xdb, 0xea, 0x8c, - 0x29, 0xbc, 0xbe, 0xc3, 0x54, 0xb9, 0xbb, 0xee, 0x75, 0x2f, 0x2d, 0x87, - 0xad, 0xce, 0x3d, 0x53, 0x49, 0x62, 0xbf, 0x02, 0x3a, 0x60, 0x48, 0x59, - 0xf8, 0xb4, 0xa2, 0x1e, 0xc5, 0x52, 0x32, 0x14, 0x0b, 0x3c, 0xa4, 0x38, - 0x8e, 0x07, 0x5f, 0x64, 0x27, 0x26, 0x49, 0xb1, 0x49, 0xed, 0x7b, 0x44, - 0x29, 0x28, 0x1f, 0x8c, 0x47, 0xd6, 0x77, 0x62, 0xc7, 0x25, 0xc5, 0xd7, - 0xe3, 0xdf, 0x00, 0xfc, 0xc3, 0x90, 0x96, 0x8c, 0x36, 0x6c, 0x9b, 0x62, - 0xc1, 0x4a, 0x6d, 0x03, 0x2d, 0x67, 0xe8, 0xb9, 0x97, 0xca, 0xfc, 0x42, - 0x62, 0xc6, 0xe4, 0xf5, 0xda, 0xed, 0x59, 0xa6, 0xf6, 0x92, 0x6c, 0xd8, - 0x84, 0x11, 0xb3, 0x38, 0xda, 0xd8, 0x45, 0x6a, 0x3c, 0xb7, 0x7c, 0x40, - 0x46, 0x5d, 0xfb, 0x84, 0xa9, 0x28, 0xec, 0x8f, 0x3e, 0x4e, 0xad, 0xcb, - 0xae, 0x47, 0xb6, 0xd5, 0x14, 0x23, 0x20, 0xdf, 0x57, 0xde, 0x65, 0xb8, - 0xef, 0xca, 0x8d, 0xd5, 0x0a, 0xbb, 0xea, 0xcc, 0x2d, 0xd2, 0x9e, 0xbf, - 0x8d, 0xe3, 0x6d, 0xed, 0x2e, 0x43, 0xea, 0xd9, 0xba, 0x9b, 0x0c, 0x32, - 0x1c, 0x03, 0xae, 0xe4, 0x68, 0x41, 0xfa, 0x10, 0xd8, 0x70, 0x42, 0x15, - 0xd1, 0xdf, 0xef, 0x10, 0xed, 0x27, 0x52, 0x9e, 0x68, 0x4b, 0x90, 0x15, - 0x22, 0x95, 0x0b, 0x20, 0x31, 0xcd, 0x14, 0x7d, 0xb5, 0xc9, 0x9b, 0x97, - 0x1f, 0x00, 0x2b, 0x0f, 0xfb, 0x75, 0xb9, 0xd2, 0x91, 0xd0, 0x12, 0x96, - 0x57, 0xa7, 0x6e, 0x69, 0x82, 0x88, 0x17, 0x64, 0x72, 0x19, 0xec, 0x89, - 0x93, 0x45, 0x15, 0x70, 0x6a, 0xa3, 0xba, 0x9d, 0x0b, 0x33, 0xd7, 0xef, - 0xd7, 0x75, 0x4f, 0xb8, 0xae, 0x58, 0x6b, 0x64, 0xe7, 0x49, 0x97, 0x9e, - 0x5b, 0xbd, 0x8c, 0xc0, 0x79, 0x14, 0x0b, 0x95, 0xf0, 0x0f, 0x16, 0x21, - 0x24, 0x07, 0x90, 0x35, 0xb2, 0x83, 0x41, 0x43, 0x64, 0xaa, 0x4e, 0x58, - 0xb9, 0x82, 0x66, 0x93, 0xae, 0x48, 0x91, 0x21, 0x8e, 0x56, 0x6d, 0xd1, - 0x19, 0xfe, 0x78, 0xc7, 0xa0, 0x91, 0x85, 0x19, 0x98, 0xce, 0xd6, 0xe0, - 0x67, 0xcc, 0x56, 0xd0, 0x10, 0x02, 0xa9, 0xe4, 0x3f, 0x9e, 0x2a, 0xc8, - 0x89, 0x48, 0x5f, 0xd4, 0x73, 0x29, 0x1b, 0xa1, 0x66, 0x6c, 0xb4, 0x53, - 0x89, 0xd4, 0x10, 0xb8, 0xf2, 0xc1, 0x52, 0x47, 0x3e, 0x6f, 0x56, 0x26, - 0x7c, 0x39, 0xb4, 0x50, 0xe2, 0xe4, 0xc6, 0x24, 0xff, 0x4f, 0x14, 0xf8, - 0xfb, 0x90, 0x61, 0x7a, 0x0e, 0x8d, 0x6f, 0x95, 0x23, 0x6a, 0x2b, 0x76, - 0x22, 0x54, 0x3c, 0xe5, 0x77, 0x78, 0x78, 0x7c, 0xf7, 0xa9, 0xc7, 0x95, - 0x01, 0xf5, 0xcd, 0x04, 0xf6, 0xdf, 0x73, 0x0d, 0x15, 0xcd, 0xc4, 0x31, - 0x2b, 0x53, 0x3d, 0x09, 0xff, 0x85, 0xce, 0x8c, 0x8c, 0x34, 0xf5, 0xa7, - 0x83, 0x71, 0x66, 0x13, 0x8c, 0xb0, 0xe0, 0x49, 0x57, 0x6c, 0x03, 0x8a, - 0x46, 0xdf, 0x5d, 0xd6, 0xec, 0x08, 0x04, 0xdb, 0xd2, 0x50, 0xc9, 0x8e, - 0x2e, 0xda, 0xa1, 0x40, 0x64, 0x61, 0xad, 0xf3, 0x06, 0x82, 0x75, 0xad, - 0x08, 0x53, 0x82, 0x40, 0xc0, 0xa1, 0x51, 0xea, 0x41, 0x93, 0xfb, 0xa7, - 0xbf, 0x52, 0x4b, 0x99, 0xa7, 0x86, 0xe3, 0x1d, 0x3b, 0x83, 0x50, 0x9c, - 0x34, 0x81, 0xa6, 0xba, 0x6d, 0x87, 0x06, 0x8c, 0x78, 0xe7, 0xb0, 0xd5, - 0x49, 0x1d, 0x82, 0xf5, 0x52, 0x5a, 0xce, 0x27, 0x99, 0xe4, 0x1e, 0x73, - 0x94, 0x9d, 0xd8, 0x3b, 0x9a, 0xe9, 0x12, 0x08, 0x5b, 0x70, 0x7e, 0xe2, - 0x68, 0x84, 0xda, 0xb2, 0x3b, 0xa0, 0x50, 0x88, 0x1c, 0xb0, 0x49, 0x31, - 0x1b, 0x5c, 0xbc, 0x66, 0x67, 0xa0, 0xf6, 0xb2, 0x9d, 0x25, 0x7f, 0x2b, - 0xbd, 0xe6, 0x32, 0xf5, 0x25, 0x07, 0xf1, 0xdf, 0x3a, 0xf5, 0x99, 0xee, - 0xda, 0xce, 0x5e, 0xe6, 0x24, 0x42, 0x0a, 0x1f, 0xad, 0x0e, 0x9e, 0xb8, - 0xa5, 0xbf, 0x4d, 0x43, 0xba, 0xc6, 0x17, 0x9e, 0x26, 0x69, 0x3e, 0x18, - 0xdf, 0xa1, 0x7e, 0xb6, 0xee, 0xac, 0x5a, 0x8f, 0xe0, 0x10, 0xc5, 0x99, - 0x45, 0x02, 0x71, 0xd2, 0xad, 0x54, 0xab, 0x99, 0x8e, 0x0a, 0xbd, 0xa6, - 0x36, 0x8c, 0x3e, 0x7a, 0xe5, 0x7b, 0x3a, 0xf2, 0x64, 0x68, 0x24, 0x68, - 0x27, 0xb4, 0x2e, 0x24, 0x29, 0x80, 0x47, 0xd5, 0x1b, 0x3f, 0xab, 0x89, - 0x87, 0x1f, 0xc6, 0xfa, 0x99, 0x89, 0x33, 0x35, 0x66, 0x53, 0xd7, 0x4b, - 0x82, 0x69, 0x06, 0xda, 0xfa, 0xb7, 0x13, 0xaa, 0x91, 0x4d, 0xaa, 0xd1, - 0xd9, 0xd6, 0x29, 0x3f, 0x1c, 0x93, 0x59, 0x56, 0x45, 0x03, 0xd7, 0x6e, - 0x6e, 0x5b, 0x11, 0x54, 0x99, 0x45, 0x5f, 0x95, 0x9e, 0xd5, 0xe9, 0x3f, - 0xc7, 0x29, 0x95, 0x34, 0x2f, 0x24, 0xd5, 0x95, 0xe3, 0xf7, 0xc5, 0xf6, - 0x17, 0x0b, 0xa0, 0x94, 0xf0, 0xe2, 0x0b, 0x51, 0x26, 0x3e, 0x5d, 0x40, - 0x46, 0xb7, 0x0e, 0xf6, 0x76, 0x7d, 0x24, 0x41, 0x8f, 0x32, 0x34, 0x8f, - 0xfa, 0x8d, 0xd8, 0x0e, 0x51, 0x9a, 0x86, 0x11, 0x86, 0x38, 0x32, 0x37, - 0x4f, 0x2b, 0xc9, 0xd3, 0xb3, 0x1a, 0xc9, 0xb5, 0x30, 0x54, 0x2a, 0x27, - 0x40, 0x65, 0x2c, 0xa4, 0x6e, 0x6f, 0x42, 0x28, 0x00, 0xcf, 0x4e, 0x80, - 0x93, 0xc4, 0x16, 0xfd, 0xe8, 0x07, 0x66, 0x37, 0x1a, 0xe5, 0x50, 0xa2, - 0xdb, 0x7c, 0xbe, 0x01, 0x9b, 0x4f, 0x23, 0x37, 0xdd, 0xd1, 0x98, 0x52, - 0x7e, 0xd7, 0x8d, 0xb7, 0x5e, 0xd7, 0x2e, 0xc3, 0x41, 0xf3, 0x4f, 0xc0, - 0xbb, 0x7b, 0x69, 0x32, 0x04, 0xa5, 0x08, 0x71, 0xa1, 0xe1, 0xd7, 0x8f, - 0x38, 0xd0, 0x59, 0xcb, 0x3b, 0x95, 0xe4, 0xc5, 0x69, 0x5f, 0xac, 0x95, - 0x5d, 0xd6, 0xc7, 0x7a, 0xdf, 0x65, 0x8c, 0xb8, 0x08, 0x6c, 0xb9, 0xd1, - 0x9f, 0x1a, 0x61, 0xe5, 0x55, 0xfb, 0x14, 0x2c, 0x81, 0x4a, 0x6c, 0xcc, - 0x35, 0x2a, 0xed, 0x53, 0x2f, 0x8b, 0x51, 0xb7, 0x95, 0x64, 0x1d, 0xc5, - 0xad, 0xc0, 0xdf, 0x26, 0x45, 0x14, 0x47, 0x0b, 0x8a, 0xbd, 0x22, 0xe6, - 0xcc, 0xbe, 0x6b, 0x96, 0xa4, 0x03, 0x20, 0x9c, 0xed, 0x97, 0x33, 0x04, - 0x8a, 0x03, 0x86, 0x52, 0xcf, 0x33, 0xde, 0x6e, 0x21, 0x8b, 0x49, 0xae, - 0xd8, 0xe9, 0xf0, 0x6c, 0x83, 0xda, 0x3d, 0x51, 0xfe, 0x6d, 0x14, 0x39, - 0x14, 0xa9, 0x80, 0xbe, 0xde, 0xac, 0x40, 0x57, 0x3c, 0x1c, 0xfe, 0x45, - 0xb7, 0x8e, 0xc4, 0x20, 0x2d, 0xb1, 0xaf, 0x19, 0x03, 0xd2, 0x63, 0x0f, - 0x78, 0x3b, 0x2e, 0x90, 0xae, 0xf0, 0x2b, 0x72, 0x5b, 0xbd, 0x47, 0xcf, - 0x92, 0xc4, 0x40, 0xd5, 0x18, 0x0a, 0x7d, 0x1a, 0x94, 0x12, 0x19, 0xaf, - 0x33, 0xef, 0xd6, 0xec, 0xf1, 0xde, 0x75, 0x0d, 0xfc, 0xf3, 0x2e, 0xec, - 0x9e, 0x70, 0xba, 0xe4, 0x89, 0xa4, 0xff, 0xde, 0x3a, 0xc9, 0xca, 0x48, - 0xd2, 0x5f, 0xe5, 0x9c, 0xf7, 0x1c, 0x26, 0x26, 0x31, 0x56, 0x4f, 0x1a, - 0x71, 0xd5, 0x19, 0x9f, 0x12, 0xa0, 0x5d, 0xb1, 0x18, 0x50, 0x22, 0x25, - 0x4f, 0x5e, 0x81, 0xca, 0x91, 0xbd, 0xfc, 0x0a, 0x16, 0x75, 0xef, 0x17, - 0xb4, 0xf0, 0xe0, 0x86, 0xf5, 0x94, 0x49, 0xa3, 0xb7, 0x49, 0x21, 0xfb, - 0xf3, 0x07, 0x49, 0x82, 0xd4, 0xe7, 0x6f, 0xa6, 0xab, 0x3f, 0x42, 0x9a, - 0x18, 0x1f, 0x9c, 0x97, 0x00, 0xff, 0xa6, 0xd2, 0xfe, 0x9a, 0xc7, 0x0c, - 0x65, 0xe4, 0xe2, 0x48, 0xea, 0x70, 0xa8, 0x6e, 0x64, 0x7d, 0x92, 0x50, - 0x55, 0xcf, 0x60, 0x14, 0x74, 0x80, 0x80, 0xb6, 0xbb, 0xf0, 0xdb, 0xa9, - 0x8a, 0x97, 0xf2, 0xe8, 0x05, 0x34, 0x0a, 0x6c, 0x20, 0xb8, 0x26, 0xa4, - 0x45, 0x8f, 0xc3, 0x6c, 0x37, 0x2b, 0x0e, 0xab, 0x89, 0xfb, 0x06, 0x41, - 0x9b, 0x13, 0x4f, 0x9f, 0x03, 0xcc, 0x78, 0xc0, 0x31, 0x1e, 0x2a, 0x51, - 0x32, 0x51, 0xff, 0x77, 0x27, 0xf5, 0xfa, 0xe5, 0x2b, 0x63, 0x90, 0x03, - 0xea, 0x14, 0xb0, 0x7a, 0x8a, 0x6e, 0x13, 0x73, 0xee, 0x83, 0x3a, 0x8a, - 0x29, 0x74, 0x4e, 0x1e, 0x04, 0xaf, 0x27, 0x6b, 0xfc, 0x9f, 0x38, 0x98, - 0xa6, 0xb0, 0x07, 0xfa, 0xe9, 0xe4, 0x7f, 0xa6, 0x2b, 0x94, 0xfd, 0xd1, - 0x3a, 0x5f, 0xc4, 0x8d, 0x71, 0x58, 0x71, 0x49, 0xaf, 0x54, 0x1a, 0x1d, - 0x07, 0x31, 0x9d, 0x9c, 0xee, 0x9e, 0xc5, 0xdc, 0xae, 0x19, 0x90, 0x3f, - 0x82, 0x68, 0x90, 0x6f, 0x13, 0xb3, 0x5d, 0x4a, 0x0c, 0x8a, 0x4a, 0x79, - 0xf0, 0x5c, 0x23, 0x47, 0x61, 0xf9, 0x60, 0xfc, 0xd6, 0xcf, 0xdb, 0xef, - 0x28, 0x3b, 0x11, 0x3e, 0xdc, 0x86, 0x7d, 0xad, 0x7b, 0xcf, 0x70, 0x63, - 0xa4, 0x60, 0x65, 0x08, 0x35, 0x19, 0x11, 0x2b, 0x6e, 0x24, 0xe6, 0xc5, - 0xef, 0xcc, 0xee, 0x63, 0xb3, 0x20, 0x61, 0x38, 0x08, 0x50, 0xa6, 0xaf, - 0x99, 0x76, 0x05, 0xc1, 0x5a, 0xe3, 0x35, 0xf6, 0x49, 0x2a, 0xea, 0x5d, - 0x1c, 0x80, 0x8d, 0x5b, 0xfd, 0x1f, 0x73, 0xb9, 0xd2, 0x09, 0x96, 0x40, - 0x3e, 0x5b, 0x36, 0x39, 0xb7, 0x63, 0x50, 0x59, 0xae, 0x62, 0x7e, 0x0c, - 0xc5, 0xf7, 0xd5, 0x7d, 0x22, 0xf6, 0x8c, 0x21, 0xa4, 0xee, 0xac, 0xb2, - 0x78, 0x03, 0xeb, 0x90, 0x69, 0xb7, 0xd7, 0x0d, 0x78, 0x9d, 0x8f, 0x5d, - 0x14, 0xf1, 0x45, 0x51, 0x05, 0x6d, 0xb0, 0x8a, 0xd8, 0x04, 0xfc, 0x83, - 0x28, 0xfc, 0x0e, 0xed, 0x25, 0xfe, 0x29, 0x4c, 0xc0, 0x25, 0xda, 0x7b, - 0x2e, 0xd7, 0x59, 0xc3, 0x61, 0x39, 0xab, 0x21, 0x09, 0x62, 0x5d, 0x06, - 0xb1, 0xa3, 0xac, 0xd5, 0xf5, 0x7a, 0x02, 0x51, 0x31, 0xf0, 0x3c, 0xba, - 0x00, 0x62, 0xf3, 0x30, 0x2a, 0xcd, 0xe7, 0x68, 0xf1, 0x2c, 0x4a, 0x6f, - 0x7b, 0x09, 0x0f, 0x08, 0xf2, 0xc6, 0x68, 0x52, 0x4d, 0xab, 0x1c, 0x07, - 0xb6, 0x57, 0x42, 0x18, 0xf8, 0x66, 0x29, 0x84, 0x64, 0xe2, 0xd4, 0x61, - 0xe7, 0xe7, 0xb0, 0x35, 0x4e, 0x26, 0xe0, 0x73, 0x30, 0x68, 0x74, 0xe9, - 0xfa, 0x62, 0xf6, 0x9d, 0x43, 0xfc, 0x5e, 0x65, 0x9a, 0x8a, 0xf9, 0x53, - 0x86, 0xb4, 0x7f, 0x26, 0xb7, 0xfc, 0x8c, 0xca, 0x27, 0x9b, 0x7b, 0xf5, - 0x32, 0xa4, 0xd8, 0x5b, 0x7a, 0x60, 0xd5, 0x00, 0xb0, 0x14, 0xe6, 0xa3, - 0xba, 0x5e, 0x6c, 0xe4, 0x49, 0x0f, 0x72, 0x47, 0x36, 0x5b, 0x41, 0x76, - 0xd2, 0x05, 0x50, 0xa7, 0x06, 0x00, 0xa1, 0xc3, 0x9c, 0x26, 0xae, 0x03, - 0x34, 0x52, 0x6f, 0x2f, 0x3b, 0x70, 0xfb, 0xc5, 0x1f, 0xfe, 0xd6, 0x0c, - 0x05, 0x73, 0x16, 0x5a, 0x51, 0xc7, 0x29, 0xc2, 0x57, 0xaa, 0x52, 0x70, - 0x69, 0xd2, 0xa1, 0x79, 0x17, 0xa3, 0x62, 0xae, 0xd6, 0xdb, 0xfb, 0x2c, - 0xcc, 0xe6, 0xcc, 0x09, 0x7f, 0xc5, 0x9c, 0x4d, 0x51, 0x89, 0x13, 0x79, - 0x07, 0x4a, 0x45, 0x43, 0x0c, 0x09, 0x2e, 0x51, 0x7d, 0xef, 0xde, 0x44, - 0xc2, 0x0c, 0x2c, 0x52, 0xcf, 0xd3, 0x74, 0xa1, 0x91, 0x17, 0x4f, 0xa0, - 0x51, 0x2f, 0x73, 0xc9, 0x06, 0xc8, 0x1f, 0x66, 0x5e, 0x0e, 0x27, 0x34, - 0x0d, 0xf4, 0xa3, 0xbb, 0xe5, 0x3a, 0xb1, 0xac, 0x36, 0x19, 0x11, 0x63, - 0x8d, 0x01, 0x6d, 0xe8, 0x61, 0x45, 0xa1, 0x50, 0xfe, 0xd4, 0x38, 0x88, - 0x73, 0x7f, 0xb7, 0x8c, 0x92, 0x38, 0xc5, 0xb0, 0xab, 0xbb, 0x57, 0x61, - 0xef, 0x6b, 0x84, 0x74, 0x9e, 0x62, 0x27, 0xa8, 0x63, 0x1a, 0x16, 0x83, - 0x67, 0xc7, 0x01, 0x09, 0x06, 0x8e, 0x92, 0xe8, 0x25, 0x57, 0xda, 0xd8, - 0xd4, 0x7e, 0x42, 0x3e, 0xde, 0xda, 0x57, 0x56, 0x33, 0xac, 0x20, 0x3f, - 0x87, 0xde, 0x94, 0x5a, 0xd2, 0xf1, 0xca, 0xcb, 0x39, 0x24, 0x4a, 0xe0, - 0x4e, 0x06, 0x0f, 0x0c, 0x79, 0xa6, 0x12, 0x55, 0x09, 0x87, 0xb3, 0x80, - 0x3c, 0x50, 0x00, 0x7a, 0x0b, 0x05, 0x24, 0x5b, 0xfd, 0x42, 0xf1, 0x83, - 0x84, 0x0c, 0xe7, 0x28, 0xe6, 0xf1, 0xb0, 0xf2, 0x74, 0x46, 0x01, 0x67, - 0xd3, 0xbb, 0xbd, 0xad, 0x34, 0x79, 0x96, 0xc5, 0x72, 0x8c, 0xb4, 0x1e, - 0x2d, 0xbc, 0xdb, 0xc1, 0xde, 0xa6, 0x84, 0x18, 0x6b, 0xa3, 0xe3, 0xad, - 0x56, 0x96, 0xf5, 0xc8, 0xa0, 0xa1, 0x8f, 0x63, 0x30, 0x31, 0x0f, 0xc0, - 0x30, 0x81, 0x7a, 0x35, 0x8c, 0x8b, 0xf3, 0xfc, 0x42, 0x5a, 0x27, 0xb9, - 0xe1, 0x89, 0x7b, 0x90, 0xeb, 0xbe, 0xb6, 0x1e, 0xb7, 0xd8, 0xdf, 0x46, - 0xee, 0xde, 0x79, 0xf4, 0x01, 0x07, 0xef, 0x10, 0x45, 0xa7, 0x57, 0xcf, - 0xf3, 0x7c, 0x8e, 0x8f, 0x40, 0x2a, 0x67, 0x94, 0xee, 0x3e, 0x7b, 0xbf, - 0xa4, 0xe5, 0x61, 0xb4, 0x62, 0x15, 0x1e, 0xb4, 0xd5, 0x4a, 0x3b, 0x89, - 0x85, 0xe0, 0x7b, 0xb0, 0x9f, 0x9c, 0x84, 0xde, 0xef, 0xb5, 0x62, 0x56, - 0xf0, 0x86, 0xe3, 0xab, 0xd9, 0xfc, 0xb9, 0x9e, 0x67, 0x6f, 0xd6, 0xd9, - 0xb2, 0xef, 0x3a, 0xdf, 0xc9, 0xc7, 0xe6, 0x1e, 0x29, 0x17, 0x41, 0xa6, - 0x8b, 0xd8, 0x5f, 0x60, 0x98, 0x25, 0x6e, 0xab, 0x14, 0x56, 0xd9, 0x1a, - 0x7b, 0x08, 0x08, 0xba, 0x69, 0xcb, 0x9e, 0x83, 0x97, 0x85, 0x34, 0xb1, - 0x27, 0x86, 0xa5, 0x86, 0x80, 0xad, 0x8f, 0x52, 0x88, 0xc4, 0xb8, 0x62, - 0xc3, 0x99, 0xdc, 0xd9, 0x04, 0xe8, 0xbb, 0x68, 0xb8, 0xf6, 0x95, 0x9d, - 0xac, 0xb9, 0xd2, 0xdb, 0x20, 0xac, 0x27, 0xda, 0x68, 0x84, 0xb4, 0xd1, - 0xc4, 0x1b, 0xfa, 0xd3, 0xbd, 0xe6, 0x7a, 0xef, 0x2a, 0x44, 0xc7, 0x82, - 0x22, 0x36, 0x8a, 0x44, 0x00, 0x71, 0x14, 0xdf, 0x36, 0x64, 0x12, 0x65, - 0x52, 0x71, 0x0c, 0x5e, 0xe9, 0x7d, 0xfe, 0xd3, 0x67, 0x79, 0xb2, 0x4c, - 0xa3, 0x96, 0x71, 0x95, 0xf7, 0x0d, 0x4e, 0xed, 0x59, 0x7b, 0x58, 0x2c, - 0x33, 0xf3, 0x55, 0x9f, 0xc6, 0xc1, 0x9d, 0x0a, 0xe9, 0xb5, 0x81, 0xf2, - 0xf5, 0x13, 0x21, 0x57, 0xbd, 0xd0, 0x81, 0x4f, 0x9d, 0x92, 0xd2, 0x2f, - 0xc0, 0xd7, 0xd2, 0x20, 0x15, 0x95, 0x3b, 0x53, 0x33, 0x08, 0x85, 0xb0, - 0x98, 0x27, 0x35, 0x73, 0x2c, 0x28, 0x41, 0xeb, 0xe3, 0x3d, 0x06, 0x65, - 0x7b, 0xc0, 0xa2, 0xbc, 0xf0, 0x9a, 0xcf, 0xd0, 0x74, 0xb2, 0xff, 0xa0, - 0x4d, 0xbe, 0x45, 0x76, 0x15, 0x6d, 0x7c, 0x86, 0xe2, 0x08, 0xd8, 0x9a, - 0x70, 0x29, 0xf7, 0x1e, 0xcc, 0xf2, 0x97, 0x0e, 0x88, 0x74, 0xae, 0x5c, - 0x88, 0xa4, 0xfe, 0xcd, 0x0c, 0xe1, 0x3a, 0x2b, 0x2d, 0xd3, 0xb2, 0x65, - 0x68, 0xd6, 0xf1, 0xa8, 0xb8, 0x49, 0x40, 0xbb, 0xde, 0xb4, 0x4f, 0x86, - 0x97, 0x24, 0xab, 0xde, 0xa8, 0x86, 0x93, 0x71, 0xb3, 0x5f, 0xf8, 0x86, - 0xd2, 0xb4, 0x37, 0x4a, 0x61, 0xff, 0x13, 0xf9, 0x90, 0x82, 0x4f, 0x8b, - 0x9e, 0xbd, 0x3f, 0x56, 0xdb, 0xf5, 0x79, 0x18, 0x1d, 0x26, 0x8d, 0x39, - 0x5d, 0xda, 0x14, 0x90, 0xbb, 0x84, 0xf3, 0x07, 0x3b, 0x6f, 0xe6, 0x4d, - 0xc9, 0xf8, 0xb0, 0x25, 0x79, 0xc2, 0x54, 0x2f, 0xd0, 0xff, 0x15, 0xaf, - 0xa6, 0x21, 0x1e, 0xd8, 0xf4, 0xff, 0xf6, 0x4d, 0x77, 0x63, 0x3a, 0x8a, - 0x14, 0xea, 0xe4, 0x52, 0xc3, 0x10, 0x56, 0xf2, 0xdd, 0x0f, 0x7f, 0x26, - 0x3e, 0x5a, 0x4b, 0xae, 0x11, 0xff, 0xf1, 0xb0, 0xe2, 0x3f, 0x47, 0x6d, - 0x76, 0xa3, 0x4f, 0x82, 0xf3, 0x0d, 0x3e, 0x9f, 0x20, 0x7c, 0xe6, 0x5a, - 0xdc, 0xc8, 0x33, 0x15, 0x82, 0xcc, 0x0d, 0x00, 0x95, 0xf4, 0x23, 0x63, - 0xe0, 0x88, 0xd1, 0x47, 0xc4, 0x66, 0xbf, 0x0a, 0x71, 0xb2, 0xcc, 0x6b, - 0xc9, 0x20, 0xd5, 0x96, 0xde, 0xe3, 0xd2, 0xe2, 0x60, 0xf6, 0x52, 0x87, - 0x39, 0xa8, 0xff, 0xa1, 0xf5, 0x9a, 0x16, 0x48, 0xe1, 0xe6, 0x7e, 0x30, - 0xea, 0xb0, 0x9a, 0x80, 0x63, 0x18, 0xae, 0x2c, 0x02, 0xdf, 0x31, 0xf1, - 0xb2, 0xdd, 0x06, 0xc7, 0xb8, 0xab, 0x21, 0x0a, 0xee, 0x67, 0x30, 0xf4, - 0x7c, 0x5f, 0x04, 0x19, 0xe7, 0x3d, 0x0c, 0xbf, 0xd9, 0x22, 0x72, 0x45, - 0xb0, 0xe5, 0xbb, 0x55, 0xec, 0xde, 0x21, 0x42, 0x7a, 0xc1, 0xc0, 0x44, - 0x5c, 0x3b, 0x97, 0x02, 0xef, 0xc3, 0x1a, 0x4c, 0x03, 0x93, 0xad, 0x9d, - 0x84, 0xe1, 0x88, 0xa5, 0x4e, 0x4a, 0x2c, 0x64, 0xdd, 0x80, 0xb6, 0x72, - 0x4c, 0xde, 0xf3, 0xa6, 0xe7, 0x6c, 0x97, 0x44, 0xa2, 0xf9, 0xe5, 0x6d, - 0x41, 0x71, 0x26, 0x4a, 0x80, 0xed, 0xc2, 0xd7, 0x48, 0x22, 0xcf, 0x7c, - 0xf8, 0xcc, 0x33, 0x25, 0x83, 0x67, 0x89, 0x88, 0x84, 0x92, 0x6d, 0x2a, - 0xda, 0xbd, 0x15, 0xf6, 0x66, 0xad, 0xfb, 0xfc, 0xcf, 0x21, 0x55, 0x12, - 0xc3, 0x7f, 0xd4, 0x37, 0xbf, 0x29, 0xf7, 0x9c, 0xa1, 0xec, 0xc7, 0xa7, - 0x70, 0xb7, 0x03, 0xdb, 0x8c, 0x32, 0xf2, 0x85, 0xec, 0xfc, 0xde, 0x90, - 0xa6, 0xd3, 0xcf, 0x78, 0x60, 0x12, 0xba, 0x0d, 0x29, 0x34, 0x1e, 0xb6, - 0x61, 0x44, 0xa6, 0xb2, 0x7f, 0xe6, 0xfd, 0x2e, 0xe4, 0x22, 0xd1, 0x63, - 0x4a, 0x42, 0x90, 0x9f, 0xc1, 0x7d, 0xb9, 0x34, 0x5d, 0x9a, 0xf7, 0xf9, - 0x66, 0xab, 0xba, 0x7e, 0x99, 0x7c, 0x6c, 0x2c, 0x50, 0x41, 0x32, 0xa0, - 0x2e, 0x2b, 0x9d, 0x3e, 0x69, 0x5c, 0x44, 0x88, 0xcb, 0x7a, 0x13, 0x25, - 0x9b, 0xab, 0x94, 0x50, 0x59, 0x0f, 0x61, 0x41, 0xeb, 0x6d, 0x9d, 0x81, - 0xd0, 0xdb, 0x54, 0x56, 0xd3, 0x60, 0xb4, 0xc6, 0xb1, 0x45, 0x8e, 0xce, - 0x2d, 0x51, 0x64, 0x1e, 0xdd, 0x7b, 0xfa, 0xc7, 0x8c, 0x91, 0x72, 0xa7, - 0x86, 0xd2, 0x0f, 0x24, 0xcb, 0x5b, 0xdd, 0x83, 0xd9, 0x9c, 0x7f, 0xd5, - 0xc0, 0x00, 0xd6, 0x0f, 0x9d, 0x92, 0x4a, 0xfa, 0x1d, 0x6a, 0x0b, 0x57, - 0x0d, 0xec, 0x09, 0xcc, 0x46, 0xb6, 0x2e, 0xfa, 0x09, 0xca, 0x1e, 0xc5, - 0x3c, 0xe7, 0x3b, 0x81, 0xa9, 0x6a, 0x68, 0xf3, 0xf3, 0xc2, 0x3c, 0xa5, - 0xf4, 0x21, 0x2f, 0x00, 0xca, 0x81, 0x76, 0x62, 0x70, 0xfb, 0x67, 0x62, - 0xdb, 0x6d, 0x17, 0x9e, 0xe9, 0xad, 0x9f, 0xd0, 0x7c, 0x0e, 0x76, 0xbd, - 0x1f, 0x90, 0x37, 0x6e, 0x92, 0x3c, 0x58, 0xdb, 0xdb, 0x03, 0xd8, 0x32, - 0x98, 0x53, 0x93, 0x81, 0x13, 0xa4, 0xfb, 0xe6, 0x6e, 0x21, 0xeb, 0x0b, - 0x86, 0x92, 0x3b, 0x71, 0xfb, 0x92, 0x93, 0x8b, 0xfa, 0xbc, 0xbb, 0x95, - 0x7b, 0xc3, 0xbf, 0x52, 0x44, 0x87, 0x27, 0x04, 0x0d, 0x6e, 0x94, 0x3b, - 0xb2, 0xde, 0xb1, 0xec, 0x92, 0xb7, 0x60, 0x86, 0x1e, 0x87, 0xdd, 0x87, - 0x4f, 0x43, 0x21, 0x7b, 0x42, 0x32, 0x89, 0x9f, 0x9e, 0x03, 0xbb, 0x2b, - 0x5d, 0xe4, 0xf8, 0x7d, 0x41, 0x49, 0x94, 0xf6, 0xf9, 0x99, 0x8b, 0xf1, - 0x03, 0x2f, 0x9a, 0x32, 0x50, 0x9c, 0xf2, 0x8f, 0x41, 0x99, 0xdf, 0x0f, - 0xf9, 0xed, 0x6e, 0x33, 0x73, 0x69, 0xe0, 0x00, 0x7a, 0xf9, 0x7a, 0x68, - 0x36, 0x46, 0x89, 0xd1, 0xe7, 0xa8, 0xb8, 0x5b, 0xc4, 0xf6, 0xca, 0xba, - 0xfe, 0x0b, 0x61, 0x1d, 0xc9, 0x11, 0x03, 0x15, 0x0a, 0xbc, 0x03, 0xb0, - 0x14, 0x3f, 0xd2, 0x8b, 0x2a, 0x53, 0xb4, 0x3e, 0x9a, 0xc2, 0xb0, 0xcd, - 0x6e, 0x04, 0xc2, 0xd2, 0x1a, 0x90, 0x6a, 0x18, 0xd6, 0x42, 0x39, 0x4e, - 0x35, 0x05, 0xfa, 0x70, 0x7b, 0xc1, 0x60, 0x81, 0x24, 0xe0, 0x2c, 0x96, - 0xe5, 0x9b, 0xfd, 0x29, 0x30, 0x7f, 0x0b, 0x5d, 0xf4, 0x62, 0xe6, 0x9a, - 0x74, 0x8b, 0x04, 0x58, 0x20, 0xfb, 0x89, 0xee, 0x7f, 0x35, 0x4e, 0x47, - 0xa8, 0x91, 0xde, 0xb2, 0x2b, 0x2c, 0x78, 0xe3, 0x50, 0xa0, 0x34, 0x01, - 0x64, 0xdd, 0xae, 0xcd, 0xb7, 0x74, 0xbc, 0xa5, 0x40, 0x3e, 0x8a, 0x48, - 0x1d, 0xc8, 0x13, 0xae, 0x88, 0x0b, 0x3f, 0xe5, 0x00, 0x64, 0xc0, 0x18, - 0x3a, 0x93, 0xd5, 0x28, 0xe8, 0x2c, 0xea, 0x8d, 0x62, 0x25, 0x6f, 0xbf, - 0x57, 0x22, 0xea, 0xfd, 0x41, 0x2a, 0x84, 0xe1, 0xa4, 0xcf, 0x24, 0xf0, - 0x56, 0x6d, 0xe9, 0x7e, 0x31, 0x43, 0x57, 0xf2, 0x67, 0x05, 0xf9, 0x46, - 0xd4, 0x08, 0x00, 0x9f, 0x45, 0x62, 0x6a, 0xb9, 0xf8, 0x47, 0xdf, 0xc8, - 0x9d, 0x58, 0x93, 0xe1, 0xd0, 0x9d, 0x35, 0x4b, 0x36, 0xb9, 0x5f, 0xbe, - 0x93, 0xa2, 0x01, 0xed, 0x4d, 0x21, 0xbb, 0x51, 0x02, 0x32, 0x77, 0xf2, - 0x02, 0x3e, 0x24, 0x0e, 0x23, 0x6c, 0xd0, 0x64, 0x57, 0xfb, 0x90, 0xe8, - 0x7c, 0xdb, 0x94, 0xac, 0xa1, 0x6c, 0xc8, 0xba, 0x56, 0xa9, 0x88, 0x8b, - 0x87, 0x2c, 0xf1, 0xa1, 0xe5, 0xe0, 0x23, 0x43, 0x4e, 0xcb, 0xab, 0x1c, - 0x12, 0x06, 0x31, 0x69, 0x56, 0x98, 0xda, 0x99, 0x77, 0x60, 0xb0, 0x42, - 0x4b, 0xe1, 0x34, 0x77, 0x83, 0x87, 0x0d, 0x01, 0xa9, 0xcc, 0x28, 0x07, - 0xe0, 0xe4, 0xe4, 0x23, 0x78, 0x5a, 0xe8, 0x09, 0x59, 0x9b, 0x73, 0x16, - 0x74, 0x2a, 0x18, 0xb8, 0x62, 0x03, 0xc0, 0x94, 0xab, 0xf0, 0x1c, 0x0c, - 0xed, 0x6d, 0xc0, 0x54, 0x88, 0x48, 0x1b, 0x21, 0x5c, 0xd4, 0x13, 0xc5, - 0x10, 0xab, 0x55, 0x58, 0x07, 0x7c, 0xf3, 0x1a, 0x20, 0x4f, 0x0e, 0xea, - 0x94, 0x5a, 0xbd, 0x6f, 0x4f, 0x6c, 0xc8, 0x32, 0x93, 0xe7, 0x2a, 0x4b, - 0xa8, 0x85, 0x77, 0x80, 0xf3, 0xfa, 0x59, 0xfc, 0x52, 0xf3, 0xea, 0xd4, - 0x17, 0x36, 0x34, 0x39, 0xfd, 0x1b, 0x6c, 0xe1, 0x19, 0x0a, 0x75, 0x7d, - 0xc2, 0x56, 0xe4, 0x31, 0x58, 0x05, 0xc2, 0x54, 0xc5, 0x48, 0x64, 0xfb, - 0xbf, 0xc1, 0x59, 0x6f, 0xd9, 0xe5, 0xb6, 0xd7, 0x89, 0xca, 0x32, 0x06, - 0xac, 0x87, 0x68, 0x0c, 0xd0, 0x6c, 0x2e, 0x2c, 0x38, 0x5e, 0x31, 0xd3, - 0x1d, 0xc0, 0x77, 0x60, 0x81, 0x53, 0x49, 0xf0, 0xc4, 0x7a, 0x50, 0xa0, - 0x68, 0xb9, 0x78, 0xbe, 0xe4, 0xa5, 0xb5, 0x70, 0x78, 0x3b, 0x34, 0x83, - 0x4b, 0x84, 0xaa, 0x74, 0x94, 0x1e, 0x0d, 0x64, 0xba, 0x1d, 0xcc, 0x16, - 0x4b, 0x12, 0x9c, 0x76, 0xfb, 0x69, 0xf0, 0x7f, 0xda, 0x07, 0xca, 0x76, - 0x92, 0x4c, 0xc5, 0xf3, 0xc0, 0x1c, 0xe4, 0x4d, 0xf7, 0x01, 0x85, 0xe6, - 0x23, 0x91, 0x45, 0x76, 0x97, 0xcd, 0xed, 0x0e, 0xb9, 0x07, 0xd7, 0xf6, - 0xaa, 0x74, 0xa7, 0x4c, 0x2f, 0x7d, 0xf5, 0x90, 0x5c, 0xfd, 0xad, 0x7d, - 0xc0, 0x30, 0xcb, 0xae, 0x73, 0x77, 0x08, 0x7c, 0xee, 0xd0, 0xf9, 0x54, - 0x3e, 0x99, 0x72, 0x29, 0x2a, 0xa5, 0x5e, 0x5f, 0x21, 0x9d, 0x82, 0x82, - 0x02, 0xa8, 0x20, 0x3f, 0xa9, 0x0c, 0xd1, 0xa3, 0x36, 0x46, 0x0d, 0x0a, - 0x12, 0x04, 0xb8, 0x51, 0xa7, 0xb1, 0x09, 0xd6, 0xd5, 0x0a, 0x2e, 0xb9, - 0x3e, 0xc9, 0xd2, 0x4f, 0xae, 0x24, 0x48, 0xf5, 0xe7, 0x17, 0xc6, 0xfc, - 0x06, 0x5b, 0x16, 0x3a, 0x9f, 0xaa, 0x16, 0x01, 0x89, 0xbc, 0xb0, 0xa8, - 0x61, 0xda, 0x20, 0x97, 0xcb, 0x0b, 0x75, 0x39, 0x87, 0x64, 0xac, 0xb8, - 0xec, 0x95, 0x8b, 0xcf, 0xc5, 0xc1, 0x68, 0xf3, 0x1a, 0x19, 0xf1, 0x80, - 0x29, 0x60, 0x85, 0x70, 0x9a, 0x65, 0xe8, 0x03, 0xf5, 0x51, 0x6a, 0xa5, - 0x43, 0x5d, 0xc8, 0xdd, 0xf3, 0xef, 0xc7, 0xcd, 0x14, 0x3e, 0xb9, 0x96, - 0x9c, 0x64, 0x5f, 0xd9, 0x8e, 0x45, 0xf6, 0x1c, 0x06, 0x4c, 0x2a, 0xd6, - 0xc6, 0xab, 0x5d, 0x0a, 0xb9, 0x23, 0x1f, 0xa7, 0x69, 0x5e, 0x60, 0xb9, - 0x6e, 0xb3, 0x47, 0x6f, 0xb5, 0xf8, 0x3e, 0x3d, 0x48, 0xc1, 0x86, 0x45, - 0xf8, 0x48, 0x65, 0x33, 0xbe, 0xf2, 0x11, 0x48, 0x33, 0x21, 0x45, 0x31, - 0x59, 0x5a, 0x3a, 0xe0, 0x3e, 0x78, 0x7d, 0x0f, 0x18, 0x98, 0x82, 0x22, - 0x6e, 0xd5, 0xa2, 0xc0, 0xeb, 0xbd, 0x12, 0xde, 0xaf, 0xaa, 0x7e, 0x11, - 0x32, 0x3c, 0x1d, 0x5e, 0xb1, 0x6b, 0xc6, 0x72, 0x62, 0x27, 0x1e, 0x7a, - 0xff, 0xe3, 0xc3, 0xaf, 0x7d, 0x88, 0x84, 0xa7, 0xbb, 0x1b, 0x55, 0x78, - 0xf7, 0xbb, 0xee, 0x3b, 0x61, 0x02, 0xff, 0xf2, 0x6c, 0xd6, 0x34, 0x1f, - 0x43, 0x95, 0xfb, 0xee, 0x8b, 0x75, 0xd3, 0x7e, 0x6c, 0xd5, 0x53, 0x53, - 0xd7, 0x96, 0x15, 0x9d, 0xc5, 0x02, 0x7f, 0xec, 0x58, 0x59, 0xbe, 0x4d, - 0xa9, 0x63, 0x25, 0x53, 0xe7, 0x11, 0xa6, 0x09, 0x8e, 0x12, 0xbc, 0x3c, - 0x18, 0x8f, 0x95, 0x5d, 0x90, 0x22, 0x34, 0xc8, 0x86, 0xbb, 0x64, 0xc8, - 0x95, 0xa9, 0xa3, 0x18, 0xb4, 0x8b, 0x92, 0xa8, 0x33, 0x8a, 0x74, 0x5f, - 0x0c, 0x25, 0xab, 0x9c, 0xd5, 0x96, 0xc3, 0xf5, 0xb9, 0x5b, 0xc8, 0x74, - 0x5f, 0xff, 0x4f, 0x0e, 0x33, 0x1d, 0xc4, 0x19, 0x4d, 0x73, 0x64, 0x14, - 0xfc, 0x2a, 0x07, 0x99, 0xfd, 0xa7, 0xc0, 0xec, 0x9f, 0x01, 0x04, 0xec, - 0xec, 0xd7, 0x8a, 0x6c, 0x39, 0xeb, 0x3d, 0x30, 0x93, 0x9a, 0x44, 0xc7, - 0xa0, 0x31, 0x4b, 0x52, 0x50, 0x8f, 0x1f, 0xd5, 0xc1, 0xc6, 0x64, 0x1e, - 0x09, 0x1f, 0xac, 0x92, 0x4b, 0x9b, 0xb0, 0xe0, 0x06, 0xa5, 0x04, 0xc4, - 0x8d, 0x1e, 0xc9, 0xff, 0x0b, 0xda, 0xeb, 0xe1, 0xaf, 0xe4, 0x53, 0x69, - 0x27, 0x55, 0x56, 0x23, 0x6f, 0x60, 0x9a, 0xa1, 0x81, 0x09, 0xa3, 0x2a, - 0x0f, 0x4e, 0x1a, 0xc2, 0x74, 0xe9, 0x90, 0x8b, 0x9e, 0xda, 0x87, 0x47, - 0xc4, 0x72, 0x8e, 0x1b, 0x3d, 0xe6, 0xe6, 0xea, 0xf3, 0xff, 0xdd, 0x01, - 0x71, 0xfb, 0x62, 0x3a, 0xd7, 0x08, 0x02, 0xce, 0x4c, 0x7a, 0x02, 0xc0, - 0x2f, 0xb3, 0x13, 0x09, 0x99, 0x8c, 0x76, 0x95, 0x1c, 0x2a, 0x70, 0x3d, - 0x03, 0x73, 0x3d, 0xce, 0xe2, 0xc2, 0x0e, 0x17, 0x08, 0xe5, 0x05, 0x98, - 0x62, 0xcb, 0x11, 0xd2, 0x98, 0xc5, 0xd7, 0xd2, 0xc5, 0x07, 0xc7, 0x6f, - 0x8e, 0x60, 0x1b, 0x63, 0xfb, 0x7e, 0x08, 0xb3, 0xca, 0x27, 0x8f, 0xb7, - 0x25, 0x4e, 0xf4, 0xc3, 0x2a, 0x1b, 0x0e, 0xc2, 0xbf, 0xc5, 0xff, 0x57, - 0x3b, 0x0e, 0xea, 0x9c, 0x91, 0xa2, 0x9a, 0xa1, 0x3d, 0x85, 0x2e, 0xd2, - 0x3b, 0xb8, 0x65, 0x81, 0x08, 0x1c, 0x59, 0xda, 0x17, 0xc7, 0xf5, 0x0b, - 0xed, 0xef, 0x1d, 0x43, 0x2a, 0xe5, 0x1a, 0x05, 0xbb, 0x71, 0x2d, 0x05, - 0xc5, 0x09, 0xa1, 0x77, 0xf9, 0x4f, 0xf8, 0xf5, 0x80, 0x6b, 0x90, 0x35, - 0xcd, 0xb8, 0xb3, 0x19, 0x2c, 0xa7, 0x39, 0x5b, 0x19, 0x94, 0x6d, 0xe3, - 0x32, 0x43, 0x05, 0x37, 0xb4, 0xb8, 0x44, 0xb3, 0x40, 0x48, 0x39, 0xed, - 0x92, 0xf2, 0x3c, 0xbf, 0x72, 0x26, 0x75, 0x7f, 0x26, 0x3a, 0x33, 0x6d, - 0xe4, 0xde, 0xcd, 0x7d, 0x3c, 0xfd, 0x9b, 0x1c, 0x66, 0x21, 0xa3, 0x42, - 0xb2, 0xfb, 0x62, 0xb4, 0xd3, 0xd3, 0x52, 0x36, 0xca, 0xeb, 0x76, 0x17, - 0xe7, 0x6a, 0xc8, 0x81, 0x12, 0x2b, 0x02, 0x34, 0xba, 0x25, 0x80, 0xb2, - 0x3b, 0xf0, 0x1b, 0x63, 0x71, 0x1f, 0x1b, 0x35, 0xa9, 0x97, 0xfb, 0xf1, - 0xd1, 0x7a, 0x67, 0x34, 0xc1, 0x46, 0x01, 0xcf, 0x2c, 0xc4, 0xb9, 0x69, - 0x79, 0x67, 0x22, 0x3d, 0x7a, 0xf0, 0xa8, 0x78, 0xfc, 0x7f, 0x86, 0xdb, - 0x4a, 0x68, 0xcb, 0x5d, 0x57, 0x7d, 0xbd, 0x36, 0xc5, 0x21, 0x45, 0x08, - 0xde, 0x7b, 0xa5, 0xac, 0x19, 0x9b, 0x76, 0xb3, 0xe8, 0x12, 0x75, 0xc0, - 0x5d, 0x68, 0x0e, 0x82, 0x84, 0x12, 0x61, 0xd7, 0xfa, 0x4e, 0xc0, 0xfc, - 0x8b, 0xc8, 0x4e, 0x9f, 0x67, 0xf0, 0x4e, 0xee, 0x15, 0x5a, 0x83, 0xaa, - 0xf6, 0x98, 0xac, 0xd0, 0xc0, 0xf2, 0x90, 0x9f, 0x17, 0x85, 0xfd, 0x4a, - 0x3e, 0x52, 0xd1, 0xe0, 0xd5, 0x25, 0x84, 0x41, 0x91, 0x48, 0xa5, 0xa4, - 0x55, 0x7a, 0xe4, 0x47, 0x38, 0xc9, 0x25, 0x1d, 0xbd, 0xf8, 0x5f, 0x58, - 0x25, 0xa2, 0x61, 0xfb, 0x54, 0x61, 0xb3, 0x17, 0x4c, 0x37, 0x36, 0x88, - 0xfa, 0xec, 0x00, 0x5d, 0xe6, 0xe0, 0xa4, 0xa2, 0xe6, 0xbc, 0x3e, 0xa3, - 0xc0, 0x93, 0x8e, 0x80, 0x89, 0xf8, 0x05, 0x2b, 0x2b, 0x24, 0x01, 0x30, - 0xf3, 0x15, 0xae, 0x83, 0x03, 0x2d, 0xcb, 0xe7, 0x7c, 0x3f, 0x00, 0x50, - 0xc0, 0x3e, 0x01, 0x35, 0xf2, 0xf2, 0x59, 0x11, 0x95, 0x71, 0x31, 0xc7, - 0x8b, 0xce, 0x47, 0xa5, 0x35, 0x0e, 0xe3, 0x69, 0x2b, 0x8a, 0x70, 0x0c, - 0x4d, 0x20, 0xba, 0xf0, 0xa3, 0xa4, 0x7f, 0x92, 0xf9, 0xba, 0x94, 0xe7, - 0xcd, 0x4e, 0x32, 0x26, 0x90, 0x56, 0x05, 0x58, 0xe4, 0xff, 0x96, 0x5a, - 0xdd, 0x06, 0xf9, 0x0a, 0xc7, 0x31, 0xec, 0xaa, 0x45, 0x64, 0x0e, 0xca, - 0x67, 0x88, 0x37, 0x0b, 0x2c, 0xc9, 0x52, 0x1d, 0x3d, 0x80, 0x77, 0xa4, - 0x49, 0x9f, 0x94, 0x43, 0x5d, 0xec, 0x59, 0x67, 0xd3, 0x08, 0x6a, 0x66, - 0x94, 0xff, 0x3c, 0xad, 0x0c, 0xd7, 0xce, 0x5c, 0x69, 0xdd, 0x1d, 0xbf, - 0x11, 0xa2, 0x9d, 0x07, 0xcc, 0x2f, 0xb1, 0x4c, 0xdc, 0xf6, 0xb2, 0x6e, - 0xea, 0x12, 0x19, 0x6d, 0x98, 0x13, 0xce, 0x85, 0x97, 0xf2, 0xbe, 0x41, - 0xdb, 0xca, 0x3d, 0x30, 0x46, 0xd0, 0x5a, 0xae, 0x24, 0xf0, 0xd5, 0xfe, - 0x97, 0x13, 0x89, 0x54, 0xfe, 0xfe, 0xcd, 0xb3, 0x8d, 0x13, 0x4d, 0xda, - 0x45, 0xe4, 0x0f, 0x5c, 0xdd, 0x9f, 0x0b, 0x20, 0xad, 0x74, 0x80, 0xa3, - 0xb4, 0x83, 0xd5, 0x9d, 0xaa, 0xb7, 0x5b, 0x33, 0xff, 0x70, 0xa2, 0xbe, - 0xbc, 0xb7, 0x8b, 0x09, 0xd9, 0xb9, 0xe9, 0x29, 0xe7, 0x8c, 0x1f, 0x3e, - 0x3c, 0x2f, 0x1e, 0x0b, 0x40, 0xaf, 0xe6, 0xda, 0x59, 0x87, 0x94, 0x36, - 0x24, 0x24, 0x30, 0x21, 0xdd, 0xa8, 0x86, 0x99, 0xa4, 0x7e, 0xac, 0x6f, - 0x52, 0xf6, 0x71, 0x35, 0x24, 0x24, 0x30, 0x21, 0x91, 0x90, 0x8e, 0xd2, - 0x6b, 0x58, 0x0b, 0x2e, 0x55, 0xe3, 0xcd, 0x74, 0xea, 0x0b, 0x73, 0x93, - 0x04, 0x08, 0xe4, 0x4f, 0x6f, 0xae, 0xeb, 0xfb, 0x18, 0x3c, 0x43, 0x46, - 0x10, 0x8b, 0x3b, 0x52, 0x1b, 0x1c, 0x32, 0x82, 0x81, 0xb0, 0xa0, 0x55, - 0x81, 0xd0, 0x26, 0x27, 0xb9, 0x6d, 0x64, 0xe7, 0xa8, 0x81, 0xc6, 0xc3, - 0xb0, 0xde, 0xbf, 0x70, 0x8c, 0x44, 0x60, 0x8c, 0xe4, 0xf2, 0x15, 0x34, - 0x35, 0xce, 0xc4, 0x20, 0x1a, 0x8f, 0x41, 0x46, 0x38, 0x1e, 0x59, 0x6f, - 0x11, 0x81, 0xde, 0x3b, 0x00, 0x59, 0xb2, 0xfe, 0xd3, 0xe0, 0x2e, 0xa4, - 0x36, 0x79, 0x6c, 0xb7, 0x47, 0xb6, 0xa8, 0x84, 0xd3, 0x52, 0x16, 0x12, - 0x4e, 0x6f, 0x8e, 0xe8, 0x5e, 0xf6, 0x05, 0x4a, 0x42, 0x8b, 0x9f, 0xa0, - 0x84, 0x45, 0x90, 0x8e, 0xcc, 0x40, 0xab, 0x29, 0xc7, 0x6c, 0xa5, 0x9c, - 0x54, 0x09, 0x27, 0x54, 0xe1, 0x35, 0x52, 0xe5, 0x92, 0x77, 0x47, 0x70, - 0xd8, 0x39, 0x0a, 0xc6, 0x5f, 0x47, 0xf8, 0x0f, 0xe2, 0xe6, 0x47, 0x0f, - 0x26, 0xc7, 0x7d, 0x2f, 0x25, 0xb3, 0xcd, 0xf4, 0xbc, 0x50, 0x71, 0xfd, - 0xf4, 0xfa, 0x4d, 0x3a, 0x84, 0x94, 0x69, 0x7d, 0x05, 0xa2, 0x14, 0x49, - 0xe6, 0x23, 0x80, 0xac, 0x74, 0x11, 0xa2, 0x88, 0x26, 0x84, 0xa1, 0x2a, - 0x7d, 0xf0, 0x8b, 0x5b, 0xdf, 0x95, 0xe8, 0x58, 0x1f, 0x2e, 0x42, 0x9f, - 0xc6, 0x98, 0xe1, 0xad, 0xce, 0x21, 0x8d, 0xf3, 0x66, 0x5c, 0xfa, 0x3e, - 0xe6, 0x2f, 0xd8, 0xba, 0x5a, 0xca, 0x2a, 0xe2, 0x28, 0x9d, 0x06, 0x8f, - 0xb5, 0xfb, 0x57, 0xa5, 0x1a, 0x94, 0x04, 0x64, 0x8b, 0x21, 0x57, 0xa0, - 0xd8, 0x10, 0x8f, 0xea, 0xfc, 0xa5, 0x14, 0x73, 0xfb, 0x4d, 0xc3, 0x40, - 0x2b, 0xa4, 0x29, 0x17, 0xe6, 0xca, 0x2f, 0x7d, 0xce, 0xbf, 0xab, 0xce, - 0xb6, 0x26, 0x8d, 0x01, 0xb4, 0xf2, 0x11, 0x6a, 0xcc, 0xf9, 0xe7, 0xf4, - 0x32, 0x29, 0xa2, 0xd8, 0xfc, 0xa8, 0x43, 0x01, 0x79, 0xd7, 0xe3, 0x90, - 0x80, 0xb4, 0x72, 0xe6, 0x60, 0x2b, 0x06, 0x34, 0xfc, 0x79, 0xe0, 0x3f, - 0x6e, 0x19, 0x4d, 0x35, 0xfa, 0xd7, 0x64, 0x17, 0xa0, 0x03, 0xf0, 0x7e, - 0xa0, 0xda, 0x8d, 0x8b, 0x76, 0xa1, 0x2a, 0xa8, 0xc4, 0x72, 0xe1, 0xec, - 0xbc, 0x36, 0x68, 0x39, 0x55, 0xda, 0xea, 0x8b, 0xee, 0xa4, 0x6c, 0xb9, - 0xea, 0xa5, 0x09, 0x0c, 0x62, 0x71, 0xd0, 0x44, 0xc8, 0x0b, 0x02, 0xf4, - 0xb7, 0xda, 0xd9, 0x54, 0x33, 0x9b, 0xef, 0x06, 0xa9, 0x5b, 0x9f, 0x8e, - 0xd4, 0xae, 0x1d, 0x35, 0x9a, 0xf0, 0xe3, 0xa7, 0x29, 0x8b, 0x2f, 0xf6, - 0x95, 0xb6, 0xb2, 0xcb, 0x58, 0x84, 0x54, 0x5a, 0xb4, 0x3a, 0x62, 0x24, - 0xf1, 0xe5, 0x03, 0x25, 0x16, 0x20, 0xf8, 0xda, 0xd0, 0x46, 0xf9, 0xe5, - 0x09, 0x65, 0xaf, 0x84, 0x56, 0x29, 0x95, 0x4a, 0xa4, 0xe4, 0x53, 0xbc, - 0xa4, 0xd9, 0x8d, 0x7a, 0x7c, 0xfa, 0xdb, 0x1b, 0x26, 0x26, 0xe3, 0x45, - 0xb2, 0xf8, 0x22, 0xb3, 0xa4, 0xd9, 0x8d, 0x7a, 0x7c, 0xfa, 0xdb, 0x1b, - 0x26, 0x26, 0xe3, 0x45, 0xb2, 0xf8, 0x22, 0xb3, 0x36, 0x93, 0xfb, 0xa0, - 0x69, 0x36, 0x58, 0x99, 0x59, 0xa6, 0x6f, 0xac, 0x93, 0xfc, 0x6c, 0x6a, - 0xf1, 0x0b, 0x6f, 0xc7, 0x4f, 0x94, 0x21, 0x48, 0xb7, 0x66, 0xc9, 0x8e, - 0x6a, 0x98, 0xd7, 0xe9, 0x0f, 0xfb, 0x53, 0x4b, 0x57, 0x46, 0xc7, 0x38, - 0x36, 0x4f, 0x1e, 0xd9, 0x61, 0x24, 0x91, 0xa9, 0x9e, 0xf1, 0xe6, 0x62, - 0xe9, 0x82, 0x87, 0x91, 0xe2, 0xab, 0xfb, 0x4e, 0xb7, 0x7c, 0x86, 0xb8, - 0xe3, 0xb5, 0xb0, 0xee, 0x7a, 0xbb, 0x99, 0x7c, 0x50, 0x40, 0x12, 0x6f, - 0xcc, 0xf3, 0x3b, 0xbc, 0x6c, 0x3a, 0x65, 0xb3, 0xd1, 0x6d, 0x2d, 0x0d, - 0xc5, 0xd5, 0xa5, 0x12, 0x6f, 0xd5, 0x2b, 0xeb, 0x40, 0x98, 0xfa, 0xc0, - 0x10, 0xd4, 0x15, 0xb1, 0x38, 0x34, 0xc9, 0x0c, 0x0d, 0x94, 0xff, 0x57, - 0xb7, 0x1b, 0xff, 0xf9, 0x6a, 0xf6, 0x52, 0x18, 0x72, 0x86, 0x41, 0x5a, - 0x7b, 0x37, 0xe5, 0xf7, 0x4a, 0xdc, 0xf6, 0xe7, 0xc7, 0x0a, 0x54, 0x75, - 0x80, 0x83, 0xf8, 0xd3, 0xe6, 0x13, 0xa2, 0xea, 0x74, 0x03, 0x84, 0x02, - 0x2f, 0x2d, 0x2c, 0x88, 0xe7, 0x40, 0xda, 0x68, 0x43, 0x1e, 0x3e, 0x50, - 0xcf, 0x72, 0xa0, 0x26, 0x0c, 0x89, 0x8c, 0xd9, 0x52, 0xbf, 0xef, 0x4a, - 0x2c, 0xe2, 0x58, 0x0e, 0xc6, 0xa4, 0x89, 0x29, 0xc3, 0x86, 0x0e, 0xff, - 0xb9, 0x87, 0x71, 0x5e, 0xa9, 0x8d, 0x13, 0x6e, 0x55, 0xef, 0xf6, 0xb2, - 0xba, 0x28, 0x03, 0xbe, 0xc5, 0x38, 0xb7, 0x12, 0x45, 0xfd, 0x27, 0x62, - 0xca, 0x2f, 0x43, 0x59, 0xd6, 0x85, 0x01, 0x66, 0xf6, 0x9f, 0x1e, 0x2f, - 0x41, 0x61, 0xb4, 0x19, 0xf6, 0xae, 0x6d, 0x1b, 0x65, 0xcb, 0x86, 0x5a, - 0x9b, 0x63, 0x1d, 0x66, 0x6e, 0x09, 0xb8, 0xdc, 0xc2, 0x1c, 0x2a, 0x0c, - 0x2d, 0x75, 0x6c, 0xc8, 0xee, 0xcb, 0x9a, 0x73, 0x43, 0x43, 0x7d, 0xa4, - 0x90, 0x4f, 0xb6, 0xb7, 0xc5, 0x49, 0x3c, 0x42, 0x29, 0xab, 0x3a, 0x5d, - 0x60, 0x99, 0xc4, 0x20, 0x96, 0x04, 0x8b, 0xfd, 0x34, 0x65, 0x3f, 0x51, - 0x7e, 0x11, 0x54, 0x6c, 0xcd, 0x34, 0x80, 0x19, 0x5e, 0xe7, 0xe5, 0x1f, - 0x07, 0x9f, 0x6f, 0xec, 0xe9, 0x05, 0x11, 0xf5, 0x60, 0x99, 0xc4, 0x20, - 0x69, 0x1c, 0x38, 0x4c, 0x0a, 0x89, 0xea, 0x47, 0x2a, 0x24, 0x5c, 0x76, - 0x03, 0xb8, 0x7d, 0xeb, 0xa3, 0x0e, 0x03, 0xda, 0x2f, 0x92, 0xa2, 0x67, - 0xb5, 0xb2, 0x15, 0xd0, 0xae, 0x0b, 0xa7, 0x94, 0x2e, 0x33, 0x41, 0xb6, - 0x23, 0x74, 0x81, 0xea, 0xd1, 0x3f, 0xb7, 0x43, 0xe2, 0x36, 0xbb, 0x58, - 0xc7, 0x94, 0xd3, 0x1b, 0x30, 0xb3, 0x6a, 0x8a, 0x71, 0xea, 0x40, 0xc2, - 0x8d, 0xd3, 0x0a, 0x1d, 0xd1, 0x83, 0x27, 0x13, 0xd4, 0xc3, 0xbc, 0xa4, - 0x9a, 0xdd, 0x45, 0xe6, 0x07, 0x25, 0x97, 0x8d, 0xd3, 0x28, 0xfd, 0x4f, - 0x27, 0x09, 0x83, 0x14, 0xa6, 0x28, 0x43, 0x77, 0x2f, 0xc3, 0x9f, 0x41, - 0xba, 0xe4, 0xa0, 0x8d, 0xf1, 0x36, 0x5a, 0x1c, 0x98, 0xd8, 0x96, 0x89, - 0xda, 0xba, 0x46, 0x62, 0x98, 0x2d, 0x5f, 0x82, 0x63, 0x19, 0xdb, 0x25, - 0xdc, 0x92, 0xab, 0x5a, 0xd3, 0x16, 0x6b, 0x0e, 0xae, 0xe5, 0x84, 0x8a, - 0x15, 0xb0, 0x1c, 0x64, 0xe1, 0x28, 0xd5, 0x7f, 0x5e, 0x4b, 0x0c, 0xc9, - 0x83, 0x8e, 0xe3, 0xe7, 0x40, 0xdd, 0x30, 0x89, 0x08, 0x32, 0x2f, 0xbd, - 0x56, 0x60, 0x4e, 0xe1, 0x81, 0x59, 0x77, 0xe1, 0x90, 0x1a, 0xd9, 0x0d, - 0x99, 0x7c, 0x9e, 0x0b, 0xfa, 0xd1, 0xd2, 0x6d, 0x76, 0xec, 0xf6, 0x9e, - 0x75, 0xa3, 0xe0, 0xf8, 0xc5, 0x7d, 0x07, 0x9e, 0xd2, 0xb4, 0x3b, 0xb9, - 0xce, 0xc0, 0x7f, 0xbe, 0xd3, 0x49, 0x01, 0xa0, 0xfa, 0x47, 0x29, 0x62, - 0xab, 0xdd, 0xe0, 0xbc, 0x94, 0x78, 0x65, 0x36, 0x3a, 0xd3, 0x93, 0x2d, - 0xad, 0xc5, 0xb5, 0x19, 0xbe, 0x50, 0x13, 0x48, 0x0b, 0xa6, 0x4c, 0xb1, - 0x99, 0x3d, 0x24, 0x1b, 0x42, 0xfe, 0xcb, 0xb3, 0x41, 0x57, 0xd4, 0x36, - 0x4a, 0x96, 0xcd, 0x15, 0x59, 0xc5, 0xc2, 0x1b, 0x40, 0x08, 0x61, 0xae, - 0x9d, 0x76, 0x2a, 0xcf, 0xba, 0x73, 0xd6, 0x2e, 0xdf, 0xd0, 0x6c, 0xa4, - 0x5d, 0xe2, 0xd6, 0x6f, 0x85, 0xfa, 0xec, 0x82, 0xe3, 0x4c, 0xa8, 0x78, - 0x79, 0x73, 0x61, 0x8b, 0x4d, 0x36, 0x62, 0x76, 0x19, 0x31, 0xe7, 0x67, - 0xdd, 0x92, 0x56, 0x71, 0xf4, 0x78, 0x17, 0xe9, 0xf5, 0x7a, 0x4e, 0x97, - 0xa7, 0x40, 0x79, 0x0a, 0x24, 0x34, 0xc6, 0x7c, 0xbb, 0x11, 0x97, 0xe0, - 0x82, 0xd4, 0x31, 0x2b, 0x3c, 0xd3, 0x81, 0x6c, 0x0b, 0xa0, 0x76, 0x89, - 0x98, 0x5b, 0x55, 0x25, 0x2f, 0x4d, 0xa3, 0xab, 0x35, 0x9c, 0x0c, 0xe1, - 0x6d, 0xb4, 0x99, 0x40, 0x37, 0xa9, 0xf1, 0xf4, 0xb2, 0x9f, 0xd6, 0xc9, - 0x3d, 0x61, 0x19, 0xff, 0xbf, 0x8a, 0x3a, 0x44, 0xcf, 0xa9, 0xd5, 0x9d, - 0x2b, 0x0a, 0xdc, 0xbc, 0xbe, 0x7e, 0x8c, 0x11, 0x4c, 0xbb, 0xe8, 0xd0, - 0xd0, 0xc3, 0x68, 0xe1, 0x53, 0x87, 0x5a, 0x42, 0xc6, 0x42, 0xb8, 0xb7, - 0x35, 0x17, 0x54, 0x02, 0x50, 0x10, 0xbe, 0xfb, 0xb4, 0xb6, 0x1c, 0x44, - 0x0f, 0xe8, 0x0d, 0xe6, 0x8c, 0x0d, 0xfc, 0xc2, 0x77, 0x9b, 0xb0, 0x67, - 0x04, 0x1e, 0x48, 0xe7, 0x41, 0x6b, 0xe5, 0x35, 0x62, 0xfb, 0x04, 0xab, - 0xea, 0x3a, 0xa8, 0x99, 0xaa, 0x80, 0x0d, 0xe6, 0x89, 0x8c, 0x2c, 0x06, - 0xd2, 0xb8, 0x0d, 0x6b, 0x90, 0xa6, 0x4c, 0x0b, 0x30, 0x9b, 0xb1, 0xe1, - 0x80, 0x63, 0xf4, 0x0a, 0x12, 0xb3, 0x8d, 0x91, 0x91, 0xa2, 0xfc, 0xb4, - 0xd0, 0xcb, 0x01, 0xfc, 0x26, 0x48, 0x6e, 0x27, 0x78, 0x0a, 0x05, 0x72, - 0xce, 0x2c, 0xe0, 0x9d, 0x0e, 0xdd, 0xcb, 0x47, 0xac, 0x63, 0xa3, 0x52, - 0x87, 0x28, 0x22, 0x54, 0x4f, 0xac, 0xf9, 0x74, 0xa9, 0xf5, 0x51, 0xca, - 0x13, 0x92, 0x35, 0xa5, 0x90, 0x58, 0xe3, 0x4b, 0xa5, 0x75, 0x6d, 0x99, - 0x42, 0x26, 0xac, 0x40, 0xdb, 0x33, 0xd8, 0x90, 0x67, 0x82, 0x70, 0xc9, - 0x95, 0x78, 0x80, 0xce, 0xd6, 0xfd, 0xeb, 0x98, 0x37, 0xd1, 0x79, 0x46, - 0xf1, 0x43, 0x65, 0x54, 0x8d, 0x01, 0x3e, 0xeb, 0xba, 0xa4, 0xfe, 0xf9, - 0x24, 0xcb, 0xd0, 0x08, 0xc6, 0x88, 0x62, 0x60, 0x2c, 0x67, 0x68, 0xcd, - 0xb7, 0xad, 0x35, 0xcc, 0xf2, 0x82, 0x57, 0x7c, 0xed, 0x88, 0x97, 0xf3, - 0x91, 0x20, 0x04, 0xa3, 0x09, 0x62, 0x44, 0x5f, 0xc4, 0x0e, 0x2e, 0x34, - 0x53, 0xb4, 0xf2, 0x63, 0x09, 0xa0, 0xd3, 0xce, 0x84, 0x8d, 0x8d, 0x1d, - 0xaf, 0xd7, 0x19, 0xa9, 0x37, 0xab, 0x85, 0x63, 0xfd, 0x6e, 0xac, 0xfa, - 0xf7, 0xb2, 0x38, 0x11, 0x46, 0xbf, 0x1c, 0x6b, 0x6e, 0xc2, 0x6c, 0x86, - 0xde, 0x9a, 0xc6, 0x73, 0xd8, 0x21, 0xd5, 0xf8, 0x46, 0xeb, 0x74, 0x10, - 0x30, 0x54, 0x68, 0x93, 0x3e, 0x1d, 0xc9, 0xf0, 0x51, 0x8f, 0xf4, 0xe0, - 0x3e, 0xea, 0xbc, 0x54, 0x0c, 0xe2, 0x79, 0xad, 0x73, 0xbc, 0xd0, 0x08, - 0xe8, 0x51, 0xe3, 0x22, 0x83, 0x34, 0x1f, 0xce, 0x64, 0x84, 0xaf, 0xfd, - 0x2e, 0xab, 0xea, 0x38, 0xd6, 0xb2, 0xf5, 0x5c, 0xc8, 0xd5, 0x96, 0x60, - 0x5c, 0x03, 0x85, 0x22, 0xf0, 0x22, 0xd0, 0x17, 0x8f, 0xb2, 0x1c, 0x98, - 0xa8, 0x00, 0x5d, 0x69, 0x1a, 0xf0, 0x2a, 0x04, 0x2f, 0x0f, 0xb9, 0x97, - 0x7b, 0xba, 0x98, 0xf8, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0xa5, 0x02, 0xf9, 0x89, 0xf8, 0xdc, 0x48, 0x23, 0xea, 0x1a, 0x0b, 0xcb, - 0xe3, 0x03, 0x26, 0x32, 0x36, 0xe4, 0x8d, 0x93, 0x98, 0x42, 0xc8, 0x22, - 0x05, 0x6c, 0xf1, 0xc0, 0x7c, 0x03, 0x5d, 0x2b, 0x34, 0xf2, 0x98, 0x02, - 0x37, 0x50, 0x25, 0x4a, 0x0b, 0x0a, 0x74, 0xae, 0x01, 0xb9, 0xc1, 0xdd, - 0x56, 0xe7, 0xd5, 0x60, 0xb3, 0x29, 0xf1, 0xf9, 0x10, 0x92, 0x4e, 0x8b, - 0xb3, 0x57, 0x66, 0x6e, 0x9c, 0x19, 0xa5, 0xa7, 0x40, 0x76, 0x2a, 0xd5, - 0xeb, 0xcb, 0xfd, 0xa4, 0x4d, 0x1b, 0x2e, 0x0b, 0xf4, 0xad, 0xaa, 0x9f, - 0xe9, 0x67, 0x9c, 0xf5, 0x0e, 0xf9, 0xbe, 0x37, 0x89, 0x90, 0x54, 0xf7, - 0xdd, 0x35, 0x07, 0xff, 0xb2, 0x0b, 0x97, 0xfc, 0xba, 0x78, 0xc5, 0x6c, - 0xe4, 0x7e, 0xd0, 0x56, 0x40, 0x3e, 0x75, 0x60, 0xe5, 0xe2, 0x70, 0xcb, - 0x6c, 0x68, 0xce, 0x91, 0x27, 0x93, 0x84, 0x3d, 0xc2, 0x5b, 0xba, 0x66, - 0x2f, 0xf9, 0x33, 0x60, 0x27, 0x00, 0x8b, 0x16, 0x20, 0x57, 0x02, 0x7e, - 0xa6, 0xf8, 0x94, 0x40, 0xfa, 0x68, 0x9e, 0xf1, 0xac, 0x0f, 0xba, 0x3f, - 0x26, 0x7d, 0x52, 0x75, 0xbe, 0xa0, 0xc9, 0x7d, 0x79, 0x75, 0xf7, 0x16, - 0x78, 0x16, 0x1a, 0x20, 0x7b, 0x3a, 0xa9, 0xa0, 0x83, 0x1e, 0x5d, 0x77, - 0x2b, 0x38, 0x11, 0x6e, 0x8c, 0xce, 0x97, 0x86, 0x12, 0x73, 0xd7, 0x57, - 0x67, 0x8c, 0x76, 0x82, 0xfb, 0xc6, 0xed, 0x5d, 0x76, 0x1f, 0xc2, 0xbc, - 0xfe, 0x22, 0x0e, 0x1a, 0x82, 0x88, 0x25, 0xf5, 0xe7, 0xd4, 0x33, 0xf1, - 0x9a, 0xd9, 0x7e, 0x66, 0xad, 0xd3, 0xef, 0x5f, 0xd8, 0xd3, 0xbf, 0xf2, - 0x61, 0xd0, 0x48, 0x25, 0x6a, 0xf5, 0x6e, 0x45, 0xdf, 0x1d, 0x73, 0x4a, - 0x38, 0x20, 0xbf, 0xe8, 0xec, 0xc1, 0xf3, 0xfc, 0xa8, 0x20, 0x49, 0x39, - 0x24, 0xf7, 0xbb, 0xa8, 0x02, 0x1a, 0x4d, 0x7a, 0x96, 0x6b, 0x87, 0xa9, - 0xd3, 0x95, 0x91, 0xa5, 0x51, 0xca, 0x1f, 0x31, 0x5c, 0x74, 0x21, 0xea, - 0x4e, 0x55, 0x25, 0x0f, 0x83, 0x20, 0x75, 0x4a, 0x0b, 0x76, 0x2a, 0x70, - 0x6d, 0xc4, 0x72, 0xae, 0x3d, 0xff, 0xbc, 0x11, 0xef, 0x59, 0x04, 0x91, - 0x37, 0x4b, 0xc2, 0x10, 0xc4, 0xb8, 0x50, 0x5b, 0x83, 0xf1, 0xcd, 0x81, - 0xd2, 0xbc, 0x45, 0x36, 0xaf, 0x7c, 0xad, 0x13, 0x0a, 0xdf, 0x04, 0x9b, - 0xb3, 0x87, 0xb6, 0xee, 0xac, 0x3c, 0xb2, 0xe5, 0x46, 0xeb, 0x74, 0x10, - 0x30, 0x54, 0x68, 0x93, 0x3e, 0x1d, 0xc9, 0xf0, 0x51, 0x8f, 0xf4, 0xe0, - 0x3e, 0xea, 0xbc, 0x54, 0x0c, 0xe2, 0x79, 0xad, 0x73, 0xbc, 0xd0, 0x08, - 0xe8, 0x51, 0xe3, 0x22, 0x83, 0x34, 0x1f, 0xce, 0x64, 0x84, 0xaf, 0xfd, - 0x2e, 0xab, 0xea, 0x38, 0xd6, 0xb2, 0xf5, 0x5c, 0xc8, 0xd5, 0x96, 0x60, - 0x04, 0x5e, 0x40, 0xbf, 0xcb, 0x76, 0xaa, 0x30, 0xea, 0x2d, 0x7f, 0x40, - 0x24, 0x74, 0x00, 0x74, 0x27, 0xb4, 0x9a, 0xff, 0xe6, 0xad, 0x87, 0xde, - 0x38, 0x84, 0xfe, 0x1a, 0xad, 0x8d, 0xf7, 0x17, 0x82, 0x88, 0x25, 0xfa, - 0xe7, 0xd4, 0x33, 0xf1, 0x9a, 0xd9, 0x7e, 0x66, 0xac, 0xd3, 0xf0, 0xdf, - 0xd8, 0xd3, 0xbf, 0xf2, 0x61, 0xd0, 0x48, 0x25, 0x6a, 0xf5, 0x6e, 0x45, - 0xdf, 0x1d, 0x73, 0x4a, 0x38, 0x20, 0xbf, 0xe8, 0xec, 0xc1, 0xf3, 0xfc, - 0xa8, 0x20, 0x49, 0x39, 0x24, 0xf7, 0xbb, 0xa8, 0x02, 0x1a, 0x4d, 0x7a, - 0x96, 0x6b, 0x87, 0xa9, 0xd3, 0x95, 0x91, 0xa5, 0x51, 0xca, 0x1f, 0x31, - 0x5c, 0x74, 0x21, 0xea, 0x4e, 0x55, 0x25, 0x0f, 0x83, 0x20, 0x75, 0x4a, - 0x0b, 0x76, 0x2a, 0x70, 0x7e, 0xc7, 0x7b, 0xba, 0x24, 0x16, 0x9f, 0xd0, - 0xb8, 0xc9, 0x02, 0x22, 0xf1, 0xd7, 0x24, 0x15, 0x7f, 0x0b, 0x83, 0x01, - 0xe0, 0x38, 0x85, 0xb5, 0xdd, 0x83, 0x8a, 0x95, 0xb5, 0x0a, 0x80, 0xa1, - 0x91, 0x62, 0x6e, 0xfc, 0x61, 0x59, 0x78, 0x0e, 0xfe, 0xa3, 0xf4, 0x05, - 0x6f, 0xbc, 0x64, 0x05, 0xbc, 0xe0, 0xb9, 0x08, 0x5f, 0x92, 0xfb, 0x7a, - 0xe0, 0x13, 0xac, 0x2f, 0xdc, 0x8b, 0x4e, 0xab, 0x3a, 0x4f, 0x3a, 0xd6, - 0xa9, 0xde, 0x01, 0x3b, 0xbc, 0x0c, 0x1e, 0x79, 0xdc, 0xc2, 0xad, 0x32, - 0xc3, 0x26, 0x52, 0x9c, 0x21, 0x17, 0x7f, 0xe9, 0x16, 0xfb, 0x4d, 0x07, - 0x39, 0xfb, 0x8f, 0xd6, 0x33, 0x4b, 0xf3, 0x15, 0x1a, 0x03, 0xb3, 0x5a, - 0x67, 0x22, 0xbb, 0x6e, 0xc5, 0xd1, 0xea, 0x2d, 0x72, 0x30, 0xa4, 0xe1, - 0xdf, 0xd3, 0x38, 0x29, 0xb7, 0xaa, 0x61, 0xe3, 0x2d, 0xe8, 0x65, 0xfd, - 0x1c, 0xb4, 0x0b, 0x4a, 0x4f, 0xd2, 0x1f, 0x71, 0xcb, 0x3c, 0x49, 0x20, - 0x70, 0x90, 0xb0, 0x9b, 0xb4, 0x68, 0x48, 0xe7, 0x93, 0x9f, 0x8f, 0xe4, - 0xb9, 0xd1, 0x75, 0x52, 0x6d, 0x79, 0x61, 0x17, 0xbf, 0x20, 0x03, 0x66, - 0x3d, 0x02, 0x79, 0x09, 0x33, 0x14, 0xba, 0xdb, 0x0e, 0xd8, 0x8d, 0xd0, - 0xc0, 0xc0, 0xf2, 0xd7, 0xf6, 0x2d, 0xd9, 0xac, 0xc1, 0xda, 0x7a, 0xb5, - 0x53, 0x75, 0xf0, 0x7a, 0x08, 0xf5, 0x31, 0xac, 0x0e, 0xea, 0x16, 0xa1, - 0x28, 0xb0, 0xf5, 0x3b, 0xf5, 0xa2, 0xe5, 0x80, 0xdc, 0x2c, 0x2a, 0x67, - 0x95, 0x63, 0xc7, 0xd7, 0x1d, 0xad, 0xef, 0xb6, 0xdd, 0x6f, 0x39, 0x6d, - 0xaf, 0xff, 0x47, 0x75, 0xad, 0x8c, 0xd4, 0x50, 0xad, 0x1f, 0x15, 0x46, - 0xb5, 0x91, 0xd6, 0x84, 0x92, 0x71, 0x14, 0xcc, 0xc3, 0x7c, 0x21, 0x9f, - 0x74, 0x89, 0xc2, 0x29, 0x0a, 0xc0, 0xed, 0x32, 0x04, 0xe2, 0x8e, 0xc6, - 0xa9, 0xc0, 0xe2, 0x83, 0x0c, 0x4a, 0xbd, 0x61, 0x10, 0xfb, 0xe1, 0xdc, - 0xaf, 0xfd, 0x4a, 0x75, 0xad, 0x8c, 0xd4, 0x50, 0xad, 0x1f, 0x15, 0x46, - 0xb5, 0x91, 0xd6, 0x84, 0x92, 0x71, 0x14, 0xcc, 0xc3, 0x7c, 0x21, 0x9f, - 0x74, 0x89, 0xc2, 0x29, 0x0a, 0xc0, 0xed, 0x32, 0xec, 0x62, 0xe4, 0x80, - 0xae, 0x3e, 0xda, 0xbe, 0xc3, 0x4b, 0xa7, 0xeb, 0xe8, 0xa6, 0x49, 0xb4, - 0x06, 0x77, 0x5c, 0x50, 0x0b, 0xc1, 0xf4, 0xfb, 0x5f, 0x0d, 0x57, 0x58, - 0x4e, 0x58, 0xb1, 0x81, 0x9d, 0xd7, 0x2a, 0xa5, 0x19, 0xdb, 0xe5, 0xea, - 0x3d, 0xcc, 0x3c, 0x89, 0xe7, 0x05, 0x6e, 0x0d, 0xe8, 0xe7, 0xf4, 0x8d, - 0xad, 0x6d, 0x06, 0xa5, 0x8e, 0xa3, 0xb6, 0x09, 0xc5, 0x84, 0xaf, 0xe7, - 0xaa, 0xc8, 0x8c, 0x09, 0x18, 0x6a, 0xda, 0x3e, 0x42, 0xb9, 0x10, 0xb8, - 0x3c, 0x25, 0xa8, 0x79, 0x7a, 0xac, 0x82, 0xae, 0xb1, 0x99, 0xf8, 0xb5, - 0x99, 0xe1, 0x30, 0x80, 0xc7, 0xe4, 0x72, 0x34, 0x5b, 0x31, 0x6d, 0xc3, - 0xa4, 0x17, 0x44, 0x8b, 0xc1, 0xf2, 0x34, 0x5b, 0x98, 0x64, 0x96, 0xc9, - 0x7f, 0x77, 0x6e, 0x49, 0x8a, 0x6d, 0xda, 0xc9, 0xa5, 0x9b, 0x17, 0x77, - 0xc9, 0x69, 0x3c, 0x98, 0x7f, 0x5d, 0x13, 0xf8, 0x0d, 0xd8, 0xa2, 0x4d, - 0xe7, 0x01, 0xbf, 0xbc, 0x1b, 0x7a, 0xdd, 0xd3, 0x14, 0x26, 0x2d, 0x44, - 0x06, 0x35, 0x3e, 0xa7, 0x2e, 0x56, 0xc0, 0x03, 0x82, 0xc3, 0xf6, 0x08, - 0xf3, 0x70, 0xc8, 0xf9, 0xde, 0xa1, 0x37, 0xfc, 0xe0, 0x4a, 0x94, 0x56, - 0x33, 0xf0, 0xda, 0xb4, 0x95, 0x0b, 0x28, 0xe3, 0xec, 0x5b, 0x8f, 0x90, - 0x11, 0x29, 0x92, 0xa9, 0x48, 0xa0, 0x85, 0xff, 0x14, 0x26, 0x2d, 0x44, - 0x00, 0x35, 0x3e, 0xa7, 0xf6, 0x59, 0xc0, 0x03, 0x82, 0xc3, 0xf6, 0x08, - 0xf3, 0x70, 0xc8, 0xf9, 0xde, 0xa1, 0x37, 0xfc, 0xe0, 0x4a, 0x94, 0x56, - 0x33, 0xf0, 0xda, 0xb4, 0x95, 0x0b, 0x28, 0xe3, 0xec, 0x5b, 0x8f, 0x90, - 0x11, 0x29, 0x92, 0xa9, 0x48, 0xa0, 0x85, 0xff, 0x14, 0x26, 0x2d, 0x44, - 0x00, 0x35, 0x3e, 0xa7, 0xf6, 0x59, 0xc0, 0x03, 0x82, 0xc3, 0xf6, 0x08, - 0xf3, 0x70, 0xc8, 0xf9, 0xde, 0xa1, 0x37, 0xfc, 0xe0, 0x4a, 0x94, 0x56, - 0x33, 0xf0, 0xda, 0xb4, 0x95, 0x0b, 0x28, 0xe3, 0xec, 0x5b, 0x8f, 0x90, - 0x11, 0x29, 0x92, 0xa9, 0x48, 0xa0, 0x85, 0xff, 0x14, 0x26, 0x2d, 0x44, - 0x00, 0x35, 0x3e, 0xa7, 0xf6, 0x59, 0xc0, 0x03, 0x82, 0xc3, 0xf6, 0x08, - 0xf3, 0x70, 0xc8, 0xf9, 0xde, 0xa1, 0x37, 0xfc, 0xe0, 0x4a, 0x94, 0x56, - 0x33, 0xf0, 0xda, 0xb4, 0x95, 0x0b, 0x28, 0xe3, 0xec, 0x5b, 0x8f, 0x90, - 0x11, 0x29, 0x92, 0xa9, 0x48, 0xa0, 0x85, 0xff, 0x14, 0x26, 0x2d, 0x44, - 0x00, 0x35, 0x3e, 0xa7, 0xf6, 0x59, 0xc0, 0x03, 0x82, 0xc3, 0xf6, 0x08, - 0xf3, 0x70, 0xc8, 0xf9, 0xde, 0xa1, 0x37, 0xfc, 0xe0, 0x4a, 0x94, 0x56, - 0x33, 0xf0, 0xda, 0xb4, 0x95, 0x0b, 0x28, 0xe3, 0xec, 0x5b, 0x8f, 0x90, - 0x11, 0x29, 0x92, 0xa9, 0x48, 0xa0, 0x85, 0xff, 0x14, 0x26, 0x2d, 0x44, - 0x00, 0x35, 0x3e, 0xa7, 0xf6, 0x59, 0xc0, 0x03, 0x82, 0xc3, 0xf6, 0x08, - 0xf3, 0x70, 0xc8, 0xf9, 0xde, 0xa1, 0x37, 0xfc, 0xe0, 0x4a, 0x94, 0x56, - 0x33, 0xf0, 0xda, 0xb4, 0x95, 0x0b, 0x28, 0xe3, 0xec, 0x5b, 0x8f, 0x90, - 0x11, 0x29, 0x92, 0xa9, 0x48, 0xa0, 0x85, 0xff, 0x14, 0x26, 0x2d, 0x44, - 0x00, 0x35, 0x3e, 0xa7, 0xf6, 0x59, 0xc0, 0x03, 0x82, 0xc3, 0xf6, 0x08, - 0xf3, 0x70, 0xc8, 0xf9, 0xde, 0xa1, 0x37, 0xfc, 0xe0, 0x4a, 0x94, 0x56, - 0x33, 0xf0, 0xda, 0xb4, 0x95, 0x0b, 0x28, 0xe3, 0xec, 0x5b, 0x8f, 0x90, - 0x11, 0x29, 0x92, 0xa9, 0x48, 0xa0, 0x85, 0xff, 0x14, 0x26, 0x2d, 0x44, - 0x00, 0x35, 0x3e, 0xa7, 0xf6, 0x59, 0xc0, 0x03, 0x82, 0xc3, 0xf6, 0x08, - 0x30, 0x09, 0xbe, 0x70, 0x3c, 0xd1, 0x9e, 0x42, 0xf9, 0xc1, 0xd0, 0xdc, - 0xbe, 0x45, 0x70, 0x90, 0x49, 0x5c, 0xdb, 0xf7, 0xbf, 0xea, 0xd4, 0xb7, - 0x77, 0x49, 0x64, 0xec, 0xc5, 0x3a, 0x82, 0xec, 0xdf, 0x89, 0xa6, 0x32, - 0x25, 0x56, 0x9b, 0x43, 0x70, 0xf2, 0x99, 0xb3, 0x2d, 0xcc, 0x6e, 0x8b, - 0x6f, 0xa4, 0xee, 0x8b, 0xff, 0x40, 0x83, 0xd5, 0x77, 0x28, 0x95, 0x3e, - 0x15, 0x7b, 0x93, 0xc7, 0x0d, 0x9d, 0xf6, 0x5d, 0x1c, 0xcd, 0xcd, 0x69, - 0xbe, 0xa5, 0xfc, 0xfd, 0xd8, 0xc8, 0x5b, 0x19, 0x4a, 0xb8, 0xf5, 0x9b, - 0x40, 0x92, 0x3e, 0xf4, 0x29, 0x54, 0x12, 0x4d, 0xb0, 0x70, 0x5f, 0xfe, - 0x35, 0x58, 0x98, 0x18, 0xe7, 0x1a, 0xdd, 0x11, 0x63, 0x7c, 0x6d, 0xff, - 0x8e, 0xa5, 0xfc, 0xc9, 0xd0, 0xa6, 0x07, 0xa0, 0x83, 0x85, 0x7d, 0xd7, - 0x6c, 0x06, 0x3e, 0xfc, 0x0a, 0x23, 0xf4, 0xf1, 0x4c, 0xaf, 0x75, 0xfc, - 0xc4, 0xb7, 0xc2, 0x75, 0xa5, 0xc9, 0x33, 0x31, 0x85, 0x96, 0xdc, 0xca, - 0x20, 0x27, 0x28, 0x19, 0x7d, 0x1d, 0x8b, 0xc8, 0xfc, 0xaa, 0xdf, 0x92, - 0x09, 0x33, 0x3e, 0xb9, 0x03, 0xde, 0xe5, 0x53, 0x6e, 0x35, 0x8a, 0x85, - 0x61, 0x91, 0x90, 0xd0, 0xcc, 0x25, 0xbe, 0x4d, 0x49, 0x34, 0x02, 0xbd, - 0x4c, 0x91, 0x85, 0x84, 0x50, 0xd4, 0x2f, 0xc7, 0xf3, 0x85, 0xb4, 0x7b, - 0x32, 0xa2, 0x05, 0x46, 0xb8, 0xa2, 0xc9, 0x7d, 0x61, 0x23, 0x88, 0x2e, - 0x77, 0x3a, 0x13, 0xce, 0x5a, 0x27, 0x4b, 0x0e, 0x71, 0xa6, 0x7e, 0xa3, - 0x8f, 0x1e, 0x41, 0xc8, 0x2f, 0xbb, 0xeb, 0xb2, 0xa2, 0xfa, 0xdb, 0x04, - 0xfd, 0x6f, 0x65, 0xa3, 0xbf, 0x66, 0x98, 0x35, 0xb0, 0x27, 0x18, 0xf0, - 0x21, 0x8e, 0x2e, 0x8e, 0x45, 0x74, 0x89, 0xd7, 0x31, 0xec, 0xe3, 0x10, - 0x31, 0x64, 0x81, 0xe4, 0x79, 0x1c, 0xdb, 0xf7, 0x88, 0xd5, 0xeb, 0x88, - 0xac, 0xa4, 0x50, 0xd3, 0xc5, 0x3a, 0x82, 0xec, 0x4e, 0xec, 0xef, 0xc8, - 0xbf, 0xea, 0xd4, 0xb7, 0x77, 0x49, 0x64, 0xec, 0xc5, 0x3a, 0x82, 0xec, - 0x35, 0x03, 0x1f, 0xda, 0x4e, 0xaf, 0xca, 0x47, 0x99, 0xa9, 0x1a, 0x63, - 0x35, 0xd5, 0xd5, 0x13, 0x71, 0x30, 0x7e, 0x28, 0xe4, 0xcd, 0xd4, 0x7f, - 0xff, 0x83, 0x17, 0xa9, 0x68, 0x6e, 0x3a, 0x8d, 0x71, 0xec, 0xef, 0xc8, - 0xbf, 0xea, 0xd4, 0xb7, 0x77, 0x49, 0x64, 0xec, 0xc5, 0x3a, 0x82, 0xec, - 0x4e, 0xec, 0xef, 0xc8, 0xbf, 0xea, 0xd4, 0xb7, 0x77, 0x49, 0x64, 0xec, - 0xc5, 0x3a, 0x82, 0xec, 0x9b, 0x23, 0x22, 0x09, 0x7b, 0x31, 0xc4, 0xb5, - 0x1c, 0x57, 0xa8, 0x13, 0x0c, 0x56, 0xb6, 0xce, 0xf3, 0x93, 0x16, 0x57, - 0x14, 0x01, 0xf4, 0x49, 0xaa, 0x4f, 0x2a, 0x2d, 0x73, 0x30, 0xc9, 0x9a, - 0x02, 0x2c, 0xc1, 0x19, 0xec, 0xc7, 0x8a, 0xaf, 0x07, 0xe7, 0xb2, 0x65, - 0xf2, 0xb8, 0x31, 0x7f, 0x85, 0x97, 0xc9, 0xf1, 0xc9, 0x6d, 0xa3, 0x8c, - 0xb1, 0xaa, 0xe1, 0x8f, 0xbf, 0x5b, 0x6a, 0x21, 0x51, 0x71, 0x76, 0x6d, - 0xf4, 0xd7, 0x76, 0x18, 0xed, 0xe1, 0x28, 0x94, 0x6d, 0x5d, 0xe6, 0x11, - 0x2c, 0xf2, 0xa5, 0x4a, 0xcc, 0x75, 0xef, 0x5d, 0x99, 0x7e, 0xe8, 0xcd, - 0x6a, 0xfe, 0x4d, 0x20, 0x7d, 0x7a, 0x43, 0xc5, 0x15, 0xa9, 0x48, 0x88, - 0xb8, 0x8c, 0x25, 0xd4, 0xe9, 0xf2, 0xea, 0xd6, 0xfd, 0x0d, 0xeb, 0xba, - 0xd7, 0x60, 0xb7, 0xb5, 0x3f, 0x49, 0xe0, 0xd3, 0xdb, 0x5f, 0x93, 0xd2, - 0x0c, 0x2a, 0x75, 0x56, 0x94, 0x33, 0xd6, 0x28, 0x6d, 0x12, 0xe7, 0x63, - 0x71, 0x1f, 0xf4, 0x66, 0x8d, 0xac, 0xd0, 0x18, 0x69, 0x23, 0x54, 0x4f, - 0x1a, 0x9c, 0x52, 0x21, 0x75, 0x42, 0x4c, 0x2d, 0x32, 0x79, 0x54, 0xf3, - 0xc1, 0xa1, 0xc7, 0xbf, 0x08, 0xce, 0x83, 0xc6, 0xc4, 0xd7, 0xbd, 0x4b, - 0x9a, 0xfd, 0xa0, 0x6f, 0x5d, 0x0a, 0x93, 0x5b, 0x09, 0xc4, 0xa5, 0xbb, - 0xab, 0xaa, 0xab, 0x2f, 0xe9, 0xe4, 0xce, 0x6f, 0xfd, 0xb3, 0xa6, 0x15, - 0x0b, 0x79, 0x85, 0x50, 0x71, 0x36, 0x42, 0x0d, 0x23, 0xf5, 0xca, 0xe9, - 0x05, 0x76, 0xb5, 0x14, 0x0c, 0xce, 0xba, 0xb3, 0xb4, 0xec, 0xf0, 0x12, - 0x5d, 0xc0, 0x84, 0xbd, 0x27, 0x8b, 0x90, 0x85, 0xfd, 0x6f, 0xbe, 0x29, - 0x6f, 0x36, 0x69, 0x1b, 0xe9, 0x29, 0x73, 0xb5, 0x1a, 0x4e, 0x0a, 0x39, - 0x4b, 0xaa, 0xb7, 0xe3, 0xbe, 0xfc, 0x2d, 0xf5, 0xf6, 0xcd, 0x32, 0xb7, - 0x04, 0x14, 0xfc, 0x9b, 0x04, 0x2f, 0x6f, 0x49, 0x8b, 0x00, 0x43, 0x88, - 0x5b, 0x3e, 0x0c, 0x33, 0xdd, 0x78, 0xe3, 0xc4, 0x8d, 0xbe, 0xb4, 0x6b, - 0x86, 0x72, 0xd7, 0xf8, 0x3f, 0x24, 0x1d, 0xb7, 0x29, 0x41, 0x30, 0xa4, - 0xb1, 0xf7, 0xa8, 0x3f, 0x22, 0x25, 0x98, 0x9a, 0x86, 0x9d, 0x7b, 0x56, - 0xde, 0x37, 0x49, 0xf1, 0x82, 0x96, 0x45, 0x2b, 0x92, 0x95, 0x91, 0xc7, - 0xa7, 0x77, 0xd7, 0x27, 0x68, 0xa4, 0xcc, 0x5f, 0x98, 0x0d, 0x09, 0xc7, - 0xb4, 0xd2, 0x26, 0xac, 0xa8, 0xbe, 0x69, 0x2d, 0x8f, 0xfa, 0x03, 0x94, - 0xd3, 0xda, 0x1d, 0x12, 0x40, 0x18, 0x45, 0x74, 0xa6, 0xea, 0xb4, 0xd7, - 0x66, 0x07, 0xcc, 0x5e, 0x29, 0x17, 0x2b, 0x62, 0xa4, 0xf3, 0x8a, 0xf0, - 0x71, 0x91, 0x07, 0x58, 0xcf, 0xce, 0xac, 0xbf, 0x42, 0x89, 0x97, 0x66, - 0x72, 0x34, 0xc2, 0x19, 0x91, 0x24, 0x47, 0x68, 0x76, 0xd0, 0xeb, 0xdd, - 0x17, 0x2a, 0x73, 0xf4, 0xc8, 0xb6, 0xae, 0x18, 0x13, 0xbd, 0x24, 0xd7, - 0x46, 0x40, 0x42, 0x6c, 0x63, 0x3e, 0x1a, 0x2d, 0xc2, 0x77, 0x69, 0xe4, - 0xcd, 0x7d, 0x53, 0x1b, 0x5a, 0x80, 0x85, 0x9d, 0x5b, 0xcd, 0x28, 0x93, - 0x58, 0xb8, 0x8c, 0xfe, 0xb7, 0x07, 0xf5, 0xdb, 0xa3, 0xca, 0x8f, 0x5f, - 0xf8, 0x55, 0x0c, 0x7c, 0x15, 0x09, 0x96, 0x8f, 0x73, 0x62, 0xd6, 0x13, - 0x60, 0x66, 0x4b, 0xcb, 0x04, 0x0f, 0x9d, 0x0b, 0xdc, 0xcb, 0xe7, 0x4e, - 0xd6, 0xe7, 0x4a, 0xba, 0xe1, 0xa1, 0x2d, 0x9d, 0x68, 0x5c, 0x32, 0x75, - 0xdb, 0xc7, 0xf4, 0xa1, 0xa2, 0xe8, 0xf4, 0xc7, 0xae, 0xb1, 0x65, 0x67, - 0x6f, 0x9a, 0x87, 0xc6, 0xea, 0x38, 0xac, 0xa4, 0x72, 0xa0, 0x24, 0x9a, - 0x76, 0x5c, 0xcd, 0x73, 0xaf, 0xbf, 0xdc, 0x5f, 0x0d, 0xbf, 0xb8, 0x35, - 0x09, 0x0c, 0x90, 0x6e, 0xb6, 0xf0, 0x02, 0x33, 0x48, 0xf6, 0x4a, 0xe1, - 0x1f, 0x69, 0x89, 0xc7, 0xfc, 0x0b, 0x75, 0xe5, 0x30, 0x2e, 0xce, 0x32, - 0xd2, 0xfb, 0x85, 0x47, 0x1e, 0xf2, 0xc7, 0xae, 0xbd, 0x03, 0xed, 0x65, - 0x80, 0x7c, 0x1b, 0x3e, 0x1e, 0x72, 0x9c, 0xd6, 0x63, 0xad, 0x41, 0x14, - 0xf9, 0xcb, 0xa8, 0x71, 0x35, 0x0e, 0x9b, 0x3c, 0xed, 0x42, 0xe5, 0x5e, - 0xc7, 0x59, 0x8c, 0xe5, 0x20, 0xee, 0x7b, 0x14, 0x3c, 0x30, 0xb6, 0xcd, - 0x89, 0x9d, 0x08, 0xd9, 0xd0, 0xb1, 0x2e, 0x4e, 0x75, 0xaa, 0x06, 0x8d, - 0x31, 0x95, 0x64, 0x93, 0x9f, 0x3b, 0xdc, 0x44, 0xbf, 0x55, 0xfc, 0x02, - 0x5b, 0xa7, 0x52, 0x30, 0xba, 0x19, 0x5b, 0xf2, 0x55, 0x98, 0x65, 0x42, - 0xc7, 0xef, 0x30, 0x97, 0xac, 0x09, 0x87, 0xda, 0x69, 0x92, 0x56, 0x97, - 0x9a, 0x4f, 0xd4, 0x5a, 0x42, 0xc5, 0x82, 0xc2, 0x33, 0xbb, 0x6e, 0xcf, - 0xb3, 0x53, 0xbd, 0x48, 0x6c, 0x52, 0x2e, 0xfb, 0xf4, 0x59, 0x93, 0x24, - 0xdb, 0x97, 0x3c, 0xc8, 0x28, 0x57, 0xf5, 0x13, 0x7c, 0x38, 0xbc, 0xc5, - 0xee, 0x55, 0x66, 0x4f, 0xfa, 0xcb, 0xe5, 0x30, 0xf4, 0x74, 0x97, 0xbf, - 0x74, 0xfa, 0xb0, 0xbe, 0xb3, 0x56, 0x2a, 0xdd, 0xde, 0x46, 0x07, 0x52, - 0x7a, 0x13, 0x25, 0xab, 0xe0, 0x77, 0x83, 0x07, 0xd0, 0xd8, 0x32, 0xb2, - 0x73, 0xf5, 0x76, 0x9d, 0x32, 0x3e, 0xc8, 0x99, 0x67, 0x33, 0xc7, 0x2a, - 0x33, 0x16, 0x60, 0x61, 0xc8, 0xed, 0xaa, 0x30, 0x64, 0xf0, 0x77, 0x6a, - 0xd6, 0xc6, 0xde, 0x2c, 0x9c, 0x7d, 0x8e, 0x20, 0x17, 0x3a, 0x0e, 0x42, - 0xb4, 0x9e, 0x34, 0xb4, 0x0a, 0xa4, 0x4e, 0x2e, 0x0c, 0xa0, 0xa9, 0x97, - 0x93, 0x26, 0x50, 0xc7, 0xb2, 0x95, 0x5f, 0xa6, 0xd1, 0x44, 0x90, 0xd6, - 0xc8, 0xeb, 0xaa, 0xf0, 0xe7, 0xa0, 0x63, 0x8b, 0xb1, 0xad, 0xac, 0x73, - 0xc0, 0xc7, 0x88, 0xcd, 0x09, 0xbb, 0x36, 0xd8, 0xa6, 0x43, 0x93, 0x7d, - 0xd3, 0xe5, 0x43, 0x8e, 0x78, 0xe1, 0x68, 0x2c, 0x39, 0xae, 0x70, 0x07, - 0xd7, 0x16, 0xf7, 0x05, 0x89, 0x76, 0xbc, 0xb9, 0xb7, 0x11, 0x74, 0x17, - 0x0a, 0x73, 0x81, 0x78, 0x43, 0xad, 0x10, 0x9e, 0xc7, 0x95, 0x94, 0x88, - 0x40, 0x8b, 0x8d, 0xce, 0xcf, 0x56, 0x70, 0x41, 0x8f, 0xf7, 0xc4, 0xa5, - 0xe5, 0x0e, 0x83, 0xef, 0x85, 0x52, 0xb4, 0x78, 0x17, 0x81, 0xbe, 0x87, - 0x48, 0xdd, 0x11, 0x29, 0x51, 0x55, 0x74, 0x97, 0x65, 0xca, 0x38, 0x43, - 0xe9, 0xdc, 0xbb, 0x01, 0xbf, 0xe5, 0x5d, 0x26, 0x07, 0x41, 0x07, 0x8f, - 0x00, 0xe6, 0x61, 0xa8, 0x99, 0xc2, 0x55, 0x0f, 0xe9, 0x5d, 0x4b, 0xe6, - 0xb7, 0x86, 0xca, 0x6c, 0x64, 0xb6, 0x0b, 0xec, 0xce, 0xb2, 0xe0, 0x3c, - 0x1d, 0x07, 0xba, 0x5a, 0xf0, 0x5c, 0x9b, 0x40, 0x7c, 0x19, 0x7b, 0xfc, - 0xe1, 0xc5, 0xe5, 0xda, 0xb0, 0x86, 0x6c, 0x7a, 0xa9, 0xe3, 0x5b, 0xb4, - 0x13, 0xc5, 0x2a, 0x7b, 0xe8, 0xb5, 0x8f, 0x11, 0xfe, 0xa5, 0x6b, 0xcb, - 0xbc, 0x5f, 0x07, 0xf5, 0xdc, 0x70, 0x6b, 0xc6, 0x9a, 0x80, 0xd4, 0x6f, - 0x30, 0x59, 0xff, 0x37, 0x52, 0xf9, 0x23, 0xa1, 0x73, 0x5a, 0x00, 0xf6, - 0x72, 0x80, 0x91, 0x3d, 0x7c, 0x86, 0xc7, 0x78, 0xa9, 0x31, 0xf0, 0xe2, - 0x6d, 0x41, 0x1f, 0xe3, 0x19, 0x44, 0xbd, 0xe0, 0x0b, 0xf8, 0x8d, 0x30, - 0xdb, 0x0b, 0xfd, 0xad, 0x43, 0xb7, 0xf6, 0x67, 0xe4, 0xc0, 0x80, 0x0c, - 0x99, 0xde, 0xd9, 0xd1, 0xe7, 0xe8, 0xec, 0xb7, 0xc2, 0xf8, 0x27, 0x21, - 0x9c, 0xdb, 0x9a, 0xb8, 0x87, 0xe9, 0xd3, 0xfa, 0xca, 0x84, 0x6b, 0x17, - 0x3a, 0xfd, 0xe9, 0x4d, 0x7f, 0x3c, 0xa5, 0x0f, 0x3a, 0x29, 0xaf, 0x23, - 0xec, 0xcd, 0x7a, 0x3c, 0x89, 0x33, 0x61, 0x8e, 0xad, 0x51, 0x81, 0x25, - 0xc5, 0xe5, 0xb2, 0xd5, 0x9a, 0x25, 0xc1, 0xf2, 0x51, 0xaf, 0xd7, 0x17, - 0x51, 0xa4, 0xf6, 0x67, 0x6b, 0x02, 0xe0, 0x7c, 0x36, 0xf8, 0xa9, 0xc4, - 0x64, 0xa6, 0x16, 0x55, 0x52, 0xa8, 0x04, 0xc8, 0x39, 0x3d, 0xc6, 0x40, - 0x80, 0x63, 0x72, 0x1f, 0x3c, 0x7c, 0xc1, 0xf5, 0x1d, 0x0c, 0x8b, 0x7f, - 0x59, 0xf4, 0xc1, 0x4c, 0xc7, 0x0b, 0x98, 0xd1, 0x54, 0x12, 0x36, 0x3b, - 0xb0, 0x8e, 0xd6, 0x57, 0x23, 0xce, 0x2e, 0xe8, 0xcf, 0x06, 0x6d, 0x89, - 0x35, 0xa3, 0xf8, 0xb6, 0xe6, 0x39, 0xf5, 0x8d, 0xf6, 0xb5, 0xc3, 0xbc, - 0xea, 0xa9, 0x82, 0xd1, 0xca, 0x17, 0x6c, 0x0a, 0xff, 0xf6, 0xb3, 0x34, - 0x4f, 0x2c, 0xec, 0xd2, 0x22, 0x09, 0x7b, 0x17, 0xcb, 0xb6, 0xfa, 0xf7, - 0xef, 0x8f, 0xe3, 0xc3, 0x53, 0xf7, 0xfe, 0x41, 0xc6, 0xe5, 0x35, 0xc1, - 0xf2, 0x16, 0xfa, 0x86, 0x02, 0xcc, 0x37, 0x31, 0xd3, 0x48, 0x86, 0x8b, - 0x1d, 0x33, 0x29, 0xef, 0x41, 0x65, 0x1a, 0xb1, 0x48, 0x81, 0x36, 0xa0, - 0x7b, 0x6d, 0xcb, 0x8a, 0x91, 0x52, 0xe5, 0x6e, 0x7f, 0x9a, 0x2f, 0x4d, - 0xf6, 0x9e, 0xd3, 0xea, 0x92, 0x44, 0x96, 0x6e, 0x37, 0xb8, 0x0d, 0x07, - 0x2e, 0x3b, 0xfd, 0xb7, 0x17, 0x4f, 0x29, 0x30, 0xc7, 0x61, 0x42, 0xda, - 0x40, 0x04, 0xc4, 0x08, 0x0e, 0xe2, 0x7c, 0xd6, 0xdc, 0x39, 0x71, 0xf6, - 0xb4, 0x47, 0x44, 0xaa, 0x56, 0xa1, 0xdf, 0x45, 0xc3, 0x17, 0xfe, 0x34, - 0xee, 0x2c, 0x12, 0xe3, 0xa9, 0xef, 0x10, 0xbc, 0xcc, 0xa5, 0x2d, 0xf0, - 0xbd, 0x5a, 0xc0, 0xef, 0x9a, 0x50, 0x01, 0xd2, 0x03, 0x1f, 0x28, 0x1c, - 0x43, 0xb1, 0x0f, 0xda, 0x02, 0xda, 0x42, 0x03, 0x82, 0xa6, 0x67, 0x36, - 0xac, 0x3a, 0xba, 0x02, 0x53, 0x50, 0x04, 0x96, 0xc1, 0x4e, 0x99, 0x5c, - 0xd8, 0x8f, 0x55, 0x15, 0x11, 0xd3, 0xe2, 0x6c, 0xd5, 0xba, 0x3b, 0x66, - 0x97, 0xdc, 0x04, 0xd6, 0xe6, 0x93, 0xa0, 0x5a, 0xa3, 0x2b, 0xac, 0x68, - 0xd0, 0x64, 0xd4, 0x05, 0x35, 0xf5, 0x30, 0x16, 0x38, 0x5b, 0x67, 0x06, - 0x41, 0xec, 0xf7, 0x3a, 0x34, 0xeb, 0xe3, 0x67, 0x30, 0x69, 0x79, 0x8c, - 0x6c, 0x55, 0x57, 0xa0, 0xa2, 0x3b, 0x6d, 0x96, 0x03, 0xc9, 0xd6, 0xfc, - 0x58, 0x61, 0x64, 0x13, 0x0a, 0x39, 0x33, 0x03, 0x1e, 0xa3, 0xdb, 0xfa, - 0x84, 0xcf, 0x93, 0xb9, 0x88, 0xe5, 0x41, 0x11, 0xa7, 0x85, 0x5a, 0x81, - 0x1d, 0xfd, 0x4f, 0xf7, 0xef, 0xc1, 0x85, 0xf3, 0xdc, 0x16, 0x03, 0xc3, - 0x9b, 0xb4, 0x7d, 0xfb, 0x8f, 0x87, 0xcc, 0xfb, 0xcb, 0x23, 0x31, 0xa6, - 0x63, 0x99, 0x60, 0x17, 0x00, 0x2e, 0xb8, 0x8c, 0x72, 0xe7, 0x72, 0x71, - 0x17, 0x0f, 0x41, 0xcc, 0x71, 0xd5, 0x23, 0x66, 0xec, 0xaa, 0x07, 0x70, - 0xf2, 0x91, 0xe0, 0x2c, 0x5b, 0x72, 0xb8, 0xd1, 0x47, 0xc6, 0xd4, 0x10, - 0xcc, 0x89, 0x1e, 0x37, 0x6b, 0x01, 0x7e, 0xac, 0xe9, 0x17, 0x44, 0x3f, - 0x9d, 0xff, 0x57, 0x93, 0x01, 0x4f, 0xf6, 0xa1, 0x23, 0x76, 0x90, 0x1a, - 0x4f, 0x15, 0xf8, 0x8f, 0xa0, 0xeb, 0x57, 0xaa, 0xd6, 0xfb, 0xce, 0xce, - 0xb6, 0x31, 0x4f, 0x1b, 0x04, 0xf1, 0x5e, 0x45, 0xa1, 0x0a, 0xf6, 0x8a, - 0xbd, 0x39, 0x23, 0x32, 0x14, 0xf5, 0x16, 0xe8, 0x51, 0xde, 0xe5, 0x3d, - 0x0f, 0x96, 0xaf, 0xfb, 0x08, 0x9a, 0x70, 0xc1, 0x94, 0x58, 0x81, 0x2c, - 0x8d, 0x94, 0xf6, 0x6e, 0xe1, 0x66, 0x36, 0x8c, 0x86, 0x8f, 0xbb, 0xfa, - 0xc0, 0x05, 0x5f, 0xaf, 0x8a, 0xeb, 0xaf, 0x8e, 0x79, 0xe2, 0xef, 0x15, - 0xa1, 0x25, 0x4b, 0xef, 0x8a, 0x29, 0x9c, 0x74, 0x60, 0xc0, 0x3a, 0xdb, - 0x1f, 0xec, 0xa7, 0x40, 0xc0, 0xf3, 0x0b, 0x3e, 0x0c, 0x1a, 0x97, 0x21, - 0x55, 0x96, 0xbf, 0x61, 0xad, 0xe1, 0x05, 0xf1, 0x5e, 0xb2, 0x40, 0x9b, - 0x39, 0x14, 0x9e, 0x90, 0x35, 0x48, 0x88, 0x31, 0x39, 0xa9, 0x8e, 0xf7, - 0xe9, 0x3c, 0x19, 0x84, 0x2f, 0xb8, 0x5a, 0x41, 0xd3, 0xe3, 0x04, 0x52, - 0xdb, 0x4d, 0x5b, 0x03, 0x5a, 0xc1, 0x31, 0x58, 0x97, 0x55, 0xce, 0x7e, - 0x94, 0x82, 0x03, 0x09, 0x6f, 0xae, 0x26, 0xc2, 0xc4, 0x13, 0xff, 0x2f, - 0x57, 0x57, 0xd1, 0x6b, 0x3a, 0x3f, 0x68, 0xda, 0x4a, 0x7f, 0xe1, 0x7e, - 0xc9, 0x61, 0x7f, 0xf4, 0xa7, 0xa8, 0x84, 0xcd, 0xd7, 0xde, 0x72, 0xe2, - 0x62, 0xac, 0x3d, 0xd6, 0x8d, 0x3f, 0x7f, 0xc6, 0xe0, 0x09, 0x92, 0xbe, - 0x15, 0x49, 0x30, 0xcd, 0xcd, 0xf6, 0xcc, 0xc0, 0x54, 0x3d, 0x80, 0x86, - 0xfa, 0x1d, 0x91, 0x2b, 0xea, 0x7f, 0x61, 0xec, 0xab, 0x0b, 0x04, 0x7e, - 0xd1, 0x08, 0x46, 0x62, 0x37, 0xda, 0x5e, 0x7a, 0x12, 0x95, 0xc3, 0x3f, - 0xca, 0xa0, 0x52, 0xe4, 0x1b, 0x38, 0x9c, 0x3a, 0xc5, 0x52, 0x5f, 0xe2, - 0x9c, 0x3e, 0x2e, 0x35, 0xdd, 0xf6, 0x49, 0x91, 0x5f, 0x3b, 0xda, 0x74, - 0x03, 0x24, 0x33, 0x31, 0x1d, 0xd0, 0xa4, 0xc3, 0xa0, 0x9f, 0xa9, 0xb4, - 0x45, 0xea, 0x47, 0x69, 0x74, 0x21, 0x4c, 0xc8, 0xcb, 0x4b, 0xf3, 0xde, - 0xc7, 0xdf, 0x27, 0x9a, 0xe1, 0xb9, 0xe1, 0x93, 0xfc, 0x30, 0x6a, 0xa6, - 0xf2, 0x71, 0x91, 0xa8, 0xa3, 0xa9, 0x6f, 0xf4, 0x04, 0x80, 0x48, 0x5e, - 0x40, 0x04, 0x3e, 0x67, 0x74, 0x49, 0x79, 0x26, 0xd8, 0x5a, 0x03, 0x94, - 0xb7, 0x18, 0xa7, 0xcd, 0x2e, 0x74, 0x2a, 0xa4, 0x24, 0x62, 0xc6, 0x0d, - 0x5f, 0xf4, 0x2e, 0x54, 0xc2, 0x18, 0x1c, 0x88, 0xdb, 0x5e, 0x64, 0x9e, - 0xfa, 0xb5, 0x77, 0x2c, 0xa2, 0xcb, 0xbf, 0xe5, 0xd8, 0x7e, 0x15, 0xbd, - 0x66, 0x5c, 0x51, 0x9a, 0x94, 0x7b, 0xa0, 0xae, 0x24, 0x6c, 0xa3, 0xab, - 0xd7, 0xd3, 0x16, 0x2e, 0xd1, 0x63, 0x63, 0x79, 0xae, 0x09, 0xd5, 0x0d, - 0xdb, 0x2c, 0xd2, 0xe2, 0x66, 0xbd, 0x75, 0x93, 0x1b, 0xf6, 0x89, 0x3a, - 0x34, 0x93, 0x86, 0xae, 0xde, 0xf8, 0x65, 0x0f, 0xbc, 0x0b, 0x67, 0x91, - 0x5b, 0x23, 0xea, 0x8f, 0xaa, 0x36, 0xc4, 0x0a, 0xa3, 0x50, 0xcd, 0x18, - 0x70, 0x29, 0x5b, 0xaa, 0xae, 0xe6, 0x76, 0x64, 0xd2, 0x3b, 0xef, 0xa8, - 0x4c, 0x99, 0x8a, 0xc3, 0xd6, 0x83, 0xf0, 0xee, 0xd2, 0x21, 0x31, 0x6a, - 0x00, 0x3d, 0x6a, 0xd8, 0x9b, 0xbe, 0xc9, 0x49, 0xf6, 0xb8, 0xd0, 0x7c, - 0x68, 0x74, 0x81, 0xa0, 0x34, 0x98, 0x18, 0x4c, 0x79, 0x1d, 0xfa, 0x30, - 0xf1, 0xa9, 0x1f, 0xca, 0x27, 0x02, 0xd2, 0xd4, 0xb3, 0xe1, 0x4b, 0x62, - 0x3a, 0x93, 0x61, 0x7e, 0xe7, 0x0d, 0xd1, 0xdd, 0x87, 0xc9, 0x30, 0x9c, - 0xa2, 0xd0, 0x29, 0xba, 0x28, 0xd8, 0x5d, 0x8d, 0x7a, 0x1b, 0xb9, 0x2e, - 0xe1, 0xeb, 0xf0, 0x4d, 0x38, 0x57, 0x8f, 0xc9, 0x19, 0xbf, 0x8e, 0xf7, - 0xda, 0x97, 0x90, 0xcc, 0x1e, 0x3c, 0xe0, 0xcb, 0x9a, 0xb4, 0x0c, 0x93, - 0xeb, 0x2b, 0xbc, 0x75, 0xc2, 0x62, 0x57, 0xee, 0x59, 0x94, 0xc1, 0x4c, - 0xc7, 0x0b, 0x98, 0xd1, 0x54, 0x12, 0x36, 0x3b, 0x90, 0x89, 0xd6, 0x57, - 0x16, 0x3d, 0x69, 0x7f, 0x83, 0x2a, 0x25, 0x6c, 0x6f, 0xca, 0xbb, 0x57, - 0x61, 0xff, 0xbc, 0x43, 0x9b, 0x6f, 0xf8, 0xb8, 0x7c, 0x07, 0x4d, 0x32, - 0xc9, 0xe1, 0xb6, 0xc1, 0x4b, 0x68, 0xd7, 0xf7, 0xb3, 0x16, 0xb0, 0xcc, - 0x9e, 0x03, 0xb8, 0x95, 0x30, 0x68, 0x64, 0xf2, 0xea, 0x98, 0x03, 0xa5, - 0x24, 0x3e, 0x2c, 0x95, 0x48, 0x37, 0xb6, 0x10, 0xdd, 0xe5, 0x3d, 0x8d, - 0x5b, 0x64, 0x8b, 0x9f, 0xcc, 0x13, 0xd7, 0xed, 0xe7, 0xb4, 0xde, 0x9b, - 0xd0, 0x8a, 0xaf, 0xe5, 0xdd, 0x93, 0x45, 0xa8, 0xfd, 0x16, 0x95, 0xeb, - 0xbd, 0xfd, 0xad, 0x75, 0xc5, 0xd6, 0x4a, 0xe6, 0x58, 0x86, 0xd9, 0xf8, - 0x16, 0xa4, 0x33, 0x77, 0x8a, 0x43, 0x1f, 0xbc, 0xf8, 0x6a, 0x14, 0xa0, - 0xfa, 0x76, 0x27, 0xc6, 0x80, 0x2c, 0x8c, 0x80, 0xbf, 0xcc, 0x0e, 0x2f, - 0x3b, 0x63, 0x40, 0xb6, 0x7a, 0xb9, 0xcc, 0xf3, 0xa4, 0xdc, 0xff, 0xdd, - 0xb0, 0x8f, 0xc2, 0x18, 0x39, 0x6d, 0xca, 0x6a, 0xba, 0x63, 0xb6, 0x15, - 0xd7, 0x20, 0x55, 0xd9, 0xd0, 0x94, 0xe8, 0xa6, 0x8f, 0xe3, 0x8e, 0xdb, - 0x1e, 0xa3, 0xe5, 0x55, 0xd6, 0xe5, 0x0e, 0xf1, 0x33, 0x04, 0x90, 0x29, - 0xaf, 0x84, 0x4e, 0x51, 0x74, 0xc6, 0xdb, 0x38, 0xc0, 0xa4, 0x04, 0xde, - 0xf8, 0xab, 0x6c, 0x6f, 0xd6, 0x27, 0x00, 0xa2, 0x4a, 0xc0, 0xab, 0x80, - 0xbf, 0x1e, 0x2c, 0x82, 0xe3, 0xf4, 0x8d, 0x61, 0xe8, 0x57, 0x6b, 0xbb, - 0x37, 0x6d, 0x0b, 0xfa, 0x33, 0xea, 0x06, 0x78, 0x2e, 0x7c, 0x2e, 0xc1, - 0x37, 0xb8, 0x58, 0x74, 0x39, 0xf7, 0x4c, 0xb1, 0x75, 0x6f, 0x96, 0x95, - 0xdd, 0x57, 0x77, 0x61, 0x3e, 0x39, 0x08, 0xc3, 0x60, 0xf9, 0x50, 0xe4, - 0x8d, 0xac, 0x4f, 0x29, 0x2a, 0xca, 0xe9, 0x55, 0x1e, 0x2b, 0x7b, 0x38, - 0xbd, 0xab, 0xf5, 0x2a, 0x79, 0x4a, 0xf6, 0x35, 0x0b, 0x0e, 0xfc, 0x77, - 0xb5, 0x8a, 0x69, 0x45, 0x7d, 0xa0, 0xb0, 0xc4, 0x0a, 0x7d, 0x05, 0x94, - 0xac, 0xb3, 0xe5, 0x58, 0xe1, 0x0e, 0x8c, 0x4b, 0xc2, 0x4a, 0xff, 0x3a, - 0x57, 0x57, 0xd1, 0x75, 0x3a, 0x3f, 0x68, 0xda, 0x4a, 0x7f, 0xc1, 0x3f, - 0xc9, 0x61, 0x7f, 0xf4, 0xd6, 0xb1, 0xf6, 0x40, 0x82, 0x46, 0xd9, 0x67, - 0xc6, 0xd1, 0xf0, 0xa1, 0xd2, 0xcd, 0xbf, 0xc0, 0x69, 0xf8, 0x83, 0xce, - 0xae, 0xaf, 0xad, 0x50, 0xb6, 0xd0, 0x4b, 0xe0, 0xfb, 0xa4, 0x87, 0xf3, - 0x90, 0x09, 0x69, 0xa0, 0xb6, 0xbe, 0xfe, 0x91, 0x23, 0x98, 0x45, 0x01, - 0xa2, 0x01, 0xc6, 0xbc, 0x2a, 0x6c, 0x76, 0x1c, 0x76, 0x49, 0xcf, 0x75, - 0x70, 0xc7, 0x79, 0xec, 0x78, 0x3f, 0x77, 0xd8, 0x3a, 0x6e, 0xc5, 0xe3, - 0xdc, 0x12, 0x95, 0x83, 0x2e, 0x6c, 0x52, 0x2e, 0x01, 0x71, 0x23, 0xea, - 0x4a, 0x44, 0x74, 0x10, 0xfd, 0xf6, 0xda, 0xb8, 0x11, 0xab, 0xfc, 0xfa, - 0x8c, 0xdb, 0x20, 0xbf, 0x54, 0x84, 0x72, 0x19, 0xdf, 0x50, 0x43, 0xf2, - 0x9d, 0x19, 0x5a, 0x4c, 0x34, 0xcc, 0x52, 0xcf, 0x88, 0xbf, 0x76, 0x8d, - 0x4a, 0x81, 0x46, 0x47, 0x03, 0x26, 0x22, 0x9f, 0xd9, 0xd9, 0x94, 0x56, - 0x3a, 0x65, 0x68, 0x7e, 0xab, 0xb5, 0xb3, 0x8a, 0x20, 0x8a, 0x81, 0xb0, - 0x8b, 0xd1, 0xc7, 0x38, 0x86, 0x17, 0xb4, 0x29, 0x58, 0x57, 0xd3, 0xd1, - 0xf7, 0x9b, 0xb6, 0x1b, 0xdf, 0x88, 0xcb, 0xf1, 0x82, 0x5a, 0xb0, 0x22, - 0x3b, 0x99, 0x2a, 0x96, 0xa6, 0x2d, 0xde, 0x64, 0x70, 0xb9, 0x0a, 0x51, - 0x04, 0x0b, 0x90, 0x46, 0xd5, 0x81, 0x9c, 0x1a, 0x16, 0x41, 0xb0, 0xd5, - 0xef, 0xf7, 0xb8, 0xec, 0x93, 0xda, 0x39, 0x6e, 0x21, 0x75, 0xc1, 0x4a, - 0x45, 0xfc, 0x5f, 0xf8, 0x34, 0x19, 0x38, 0xe8, 0x8b, 0xc4, 0x9e, 0x7d, - 0x19, 0xbe, 0x87, 0x96, 0x78, 0xb4, 0x72, 0xfe, 0x19, 0xfe, 0x9a, 0xf5, - 0x20, 0xed, 0xe5, 0x9c, 0x64, 0xe5, 0x7c, 0x2f, 0x4e, 0xb3, 0x91, 0x29, - 0xb2, 0xee, 0xf7, 0xba, 0xe9, 0xba, 0x7f, 0xa7, 0xbb, 0x00, 0x12, 0xb9, - 0x0e, 0x0f, 0x00, 0xfe, 0x37, 0xb0, 0xd8, 0x68, 0x21, 0xf7, 0x70, 0x07, - 0x76, 0xb9, 0xa7, 0x19, 0xee, 0x37, 0x91, 0x65, 0x61, 0x75, 0x13, 0xe7, - 0xc5, 0x55, 0xc0, 0x49, 0x0d, 0xf4, 0xe5, 0x33, 0xa4, 0x21, 0x86, 0x83, - 0x62, 0x5c, 0xbc, 0x20, 0x88, 0xcc, 0x54, 0x04, 0x89, 0x76, 0xc7, 0xdb, - 0xc1, 0xb6, 0xef, 0x29, 0x42, 0xde, 0x3b, 0x62, 0x15, 0x04, 0xd1, 0xb7, - 0x72, 0x8e, 0xa8, 0xa9, 0xe6, 0xff, 0x3e, 0xad, 0xd2, 0xa2, 0xe1, 0xcc, - 0xee, 0x33, 0x67, 0x38, 0x7f, 0x47, 0x13, 0xea, 0x09, 0x63, 0x88, 0x88, - 0x14, 0xea, 0x80, 0x4a, 0x5b, 0x31, 0x3c, 0x7c, 0xcb, 0x47, 0xfb, 0xad, - 0x8b, 0x28, 0x13, 0x43, 0x32, 0x7e, 0x22, 0x94, 0xe9, 0x7e, 0x5a, 0x85, - 0x80, 0x2f, 0x5e, 0xac, 0x1b, 0x14, 0xad, 0xed, 0xbb, 0xb8, 0x92, 0xd0, - 0x30, 0x8b, 0x87, 0xe0, 0x56, 0x2e, 0xe4, 0x7c, 0xb0, 0x0f, 0xea, 0x8a, - 0x45, 0xb8, 0x84, 0x6c, 0x06, 0xc9, 0x20, 0x0d, 0x2b, 0x32, 0x39, 0xb5, - 0xb7, 0x85, 0x44, 0x71, 0xb5, 0x24, 0xd4, 0xa1, 0x50, 0x97, 0x9c, 0x94, - 0x12, 0xe3, 0x1f, 0x75, 0x7b, 0x41, 0x3f, 0x58, 0x1d, 0xb0, 0x69, 0xd2, - 0xad, 0xb0, 0xf0, 0x13, 0x36, 0x14, 0x27, 0x38, 0x93, 0x4d, 0xf1, 0x3b, - 0x5c, 0x13, 0x33, 0xcc, 0x3d, 0x92, 0xf3, 0x0d, 0x23, 0x50, 0x34, 0x67, - 0xa2, 0x25, 0xf2, 0x7e, 0xe7, 0x34, 0x97, 0x08, 0x97, 0xbb, 0xd3, 0x82, - 0x51, 0xb5, 0x8a, 0xd8, 0x0d, 0xc5, 0xba, 0xde, 0xa4, 0x1d, 0xff, 0x5f, - 0x9b, 0x38, 0x61, 0xff, 0x03, 0x8d, 0x9d, 0xf4, 0x2a, 0x80, 0x5b, 0x16, - 0x24, 0x43, 0xa5, 0x18, 0x97, 0xeb, 0xf8, 0x3d, 0x46, 0x97, 0x6a, 0xc3, - 0x1d, 0x64, 0xbb, 0x3b, 0x23, 0x59, 0x0b, 0xde, 0x44, 0x78, 0x9f, 0x37, - 0x1e, 0x74, 0x8f, 0x48, 0xdc, 0x90, 0xd2, 0x0c, 0x41, 0xd7, 0xca, 0xa5, - 0x5e, 0xed, 0x8e, 0xa0, 0xc1, 0xc8, 0x51, 0x01, 0x49, 0xe2, 0xb7, 0x57, - 0x74, 0x56, 0x8f, 0x60, 0x1d, 0x2e, 0x15, 0x86, 0x9e, 0x1c, 0x63, 0x3d, - 0x5a, 0x9e, 0xfa, 0xbe, 0x5e, 0x29, 0x4e, 0xee, 0x42, 0x44, 0xac, 0xcd, - 0x84, 0x62, 0xec, 0x1b, 0xfa, 0xcd, 0xa5, 0x1f, 0x74, 0x34, 0x7f, 0x1e, - 0x63, 0x25, 0xe0, 0xcb, 0x6d, 0x63, 0xff, 0xef, 0x01, 0x77, 0x24, 0x0d, - 0x8e, 0x6f, 0x91, 0x06, 0x4f, 0xef, 0xa0, 0x08, 0xfd, 0x96, 0xc8, 0xc4, - 0x10, 0x87, 0x7f, 0xf0, 0x39, 0xc0, 0x9e, 0x24, 0x80, 0x61, 0xa1, 0xc8, - 0xaa, 0x9c, 0x5f, 0x52, 0xf2, 0x4d, 0x9d, 0xa1, 0x42, 0x09, 0x15, 0x27, - 0xb6, 0xce, 0x8f, 0x47, 0xb2, 0x79, 0x44, 0x66, 0x75, 0x5d, 0x0e, 0xde, - 0xaf, 0xc2, 0x74, 0xba, 0x85, 0x4e, 0x7a, 0x41, 0x9d, 0x2f, 0x15, 0xa6, - 0x95, 0xbb, 0x58, 0x32, 0xc0, 0x61, 0x11, 0x84, 0x42, 0x39, 0xc8, 0x59, - 0x9c, 0xc0, 0xa1, 0x0e, 0xeb, 0x58, 0x8e, 0xaf, 0x33, 0x72, 0x37, 0xfc, - 0x9f, 0x62, 0xe4, 0x80, 0xbb, 0x7e, 0x49, 0x93, 0xf3, 0xaa, 0xe8, 0x00, - 0x56, 0xaf, 0x30, 0x99, 0xdc, 0xd4, 0xba, 0xd5, 0x00, 0x63, 0x92, 0xb6, - 0x96, 0x79, 0x17, 0x7a, 0xc6, 0x79, 0x15, 0x85, 0x89, 0xc5, 0x8b, 0xe6, - 0x93, 0x5f, 0xaf, 0xa4, 0xd2, 0xfd, 0x1c, 0x07, 0x9d, 0x49, 0x02, 0x17, - 0x34, 0xf3, 0xf3, 0x38, 0x42, 0x63, 0x0a, 0x87, 0xe4, 0xd1, 0xe5, 0x88, - 0xa8, 0x9e, 0x96, 0x58, 0x41, 0x39, 0xc8, 0x59, 0x8c, 0xc7, 0xa1, 0x0e, - 0xe8, 0x58, 0x8e, 0xaf, 0x33, 0x72, 0x37, 0xfc, 0xa4, 0x76, 0xb1, 0x62, - 0x12, 0x6a, 0x30, 0x08, 0x33, 0xf5, 0x03, 0x67, 0xe7, 0x66, 0xc7, 0xf5, - 0x1e, 0x0b, 0x3b, 0x01, 0x07, 0x0b, 0xc4, 0x1b, 0xf4, 0xf3, 0x56, 0xf9, - 0x2c, 0xba, 0x31, 0x94, 0x37, 0x41, 0x21, 0x7d, 0x7e, 0xca, 0x24, 0x18, - 0x63, 0x1b, 0x54, 0x03, 0xd0, 0x84, 0x43, 0xcd, 0xc9, 0xda, 0xa3, 0x05, - 0x86, 0x37, 0x43, 0x2b, 0x68, 0x96, 0x6b, 0x91, 0xb6, 0x62, 0xbb, 0xf9, - 0x40, 0x39, 0xc8, 0x59, 0x58, 0xc6, 0xa1, 0x0e, 0xe9, 0x58, 0x8e, 0xaf, - 0x33, 0x72, 0x37, 0xfc, 0x7f, 0xfe, 0x0d, 0xd8, 0xbf, 0xc3, 0xd2, 0x3e, - 0xb9, 0xfd, 0xe7, 0xce, 0x8a, 0x49, 0x3b, 0x8a, 0xc1, 0x18, 0x42, 0x9f, - 0x9e, 0xab, 0x15, 0x9d, 0xa9, 0x18, 0xab, 0x0d, 0xc2, 0x52, 0xe1, 0xf8, - 0x52, 0x13, 0xe0, 0x70, 0xbc, 0x31, 0x6e, 0xb5, 0x57, 0xae, 0x51, 0x6b, - 0x1b, 0xc3, 0x6d, 0x99, 0x09, 0xb4, 0x1b, 0xe5, 0xce, 0x27, 0x18, 0xbf, - 0x88, 0xb4, 0xd6, 0x67, 0x71, 0x95, 0x06, 0x41, 0x47, 0x39, 0xc8, 0x59, - 0x74, 0xc5, 0xa1, 0x0e, 0xee, 0x58, 0x8e, 0xaf, 0x33, 0x72, 0x37, 0xfc, - 0xac, 0x5d, 0x8b, 0x6d, 0x4c, 0xdc, 0x11, 0x38, 0xb1, 0xf7, 0x2f, 0x17, - 0xa2, 0x48, 0xfd, 0x32, 0xf6, 0xb5, 0x45, 0x38, 0x85, 0x0f, 0x45, 0x3c, - 0x7b, 0x05, 0x6f, 0x70, 0x50, 0x6c, 0xd9, 0x31, 0xaa, 0xa9, 0x97, 0x1f, - 0xf2, 0x45, 0x1c, 0x17, 0xa7, 0x2c, 0x53, 0x44, 0x04, 0xf9, 0xc9, 0xc6, - 0xd9, 0x12, 0xfc, 0xab, 0xdf, 0x39, 0x67, 0xc6, 0xfc, 0x34, 0x69, 0xa9, - 0x40, 0x5a, 0x14, 0xd7, 0x35, 0x23, 0x9e, 0x83, 0x01, 0x3e, 0x79, 0xe4, - 0x68, 0x4f, 0x6a, 0x48, 0x26, 0x68, 0x32, 0xf1, 0x98, 0xf6, 0x29, 0x86, - 0x50, 0x02, 0x8f, 0xe7, 0x4d, 0xe7, 0x4c, 0xda, 0x39, 0xc7, 0xa7, 0x6f, - 0x47, 0x68, 0xd5, 0x30, 0x31, 0x6d, 0x8e, 0x60, 0x33, 0xae, 0x99, 0xcc, - 0x97, 0x21, 0x6a, 0x2e, 0xe0, 0x10, 0x44, 0xc3, 0x03, 0x3a, 0xf4, 0x32, - 0xf2, 0x92, 0x82, 0x6a, 0x61, 0x81, 0x20, 0x0b, 0x23, 0x92, 0x89, 0x95, - 0x64, 0xa5, 0xbc, 0x8c, 0x48, 0x92, 0x59, 0xc7, 0xcd, 0x61, 0x69, 0x57, - 0xc8, 0xf7, 0x86, 0x41, 0x95, 0x7d, 0x3a, 0x66, 0x9e, 0xc4, 0x64, 0xf9, - 0x85, 0x49, 0x9d, 0x42, 0x5b, 0x2c, 0x1d, 0x55, 0x84, 0xc4, 0x9c, 0xd9, - 0xda, 0x02, 0xb3, 0xc7, 0x5f, 0x06, 0x46, 0x26, 0xf5, 0x5a, 0x7c, 0xed, - 0x40, 0x0b, 0xac, 0x64, 0x5d, 0x51, 0xd9, 0xfa, 0x0c, 0x33, 0xc4, 0x6a, - 0x88, 0x92, 0x81, 0x84, 0xe8, 0x2c, 0xe0, 0xf0, 0xc0, 0xb4, 0x7d, 0xec, - 0xd6, 0x57, 0x16, 0x72, 0xcc, 0x25, 0x41, 0x8b, 0x66, 0x5e, 0xf8, 0xc3, - 0x6d, 0xe3, 0x4d, 0xbf, 0xfc, 0x30, 0x2e, 0xe4, 0xd9, 0xd4, 0x55, 0x32, - 0xe8, 0xb3, 0x1d, 0x62, 0xd8, 0x00, 0x24, 0x85, 0x05, 0x70, 0x87, 0xc1, - 0xb4, 0x17, 0x68, 0x18, 0x24, 0x8e, 0x8b, 0xb8, 0xb9, 0xab, 0x5d, 0x0e, - 0x94, 0x40, 0x71, 0xb3, 0x9a, 0xf6, 0x29, 0x86, 0x98, 0x0d, 0x8f, 0xe7, - 0x4f, 0xe7, 0x4c, 0xda, 0x39, 0xc7, 0xa7, 0x6f, 0xb3, 0x62, 0x03, 0x4f, - 0x49, 0x89, 0xbd, 0x2a, 0xda, 0x48, 0x3a, 0xf0, 0x1b, 0xa2, 0x99, 0x23, - 0xb8, 0x25, 0x92, 0x0f, 0xff, 0x5a, 0x43, 0xcc, 0xcc, 0x64, 0x99, 0x1e, - 0xec, 0x97, 0x13, 0x68, 0xd0, 0xfc, 0xa4, 0x09, 0xc3, 0x4a, 0x3b, 0x7f, - 0x77, 0x84, 0xc5, 0x7f, 0xec, 0x3a, 0x88, 0xc7, 0x13, 0xaf, 0xa7, 0x53, - 0x12, 0xbf, 0x25, 0xa9, 0x51, 0x63, 0x08, 0xb5, 0xa3, 0xfb, 0xcd, 0x6d, - 0x45, 0x7d, 0x70, 0xb4, 0xe7, 0xe6, 0x99, 0x2e, 0x41, 0xf1, 0x33, 0x2e, - 0xc5, 0xab, 0xca, 0x47, 0xc4, 0x7c, 0x54, 0x37, 0xe0, 0xc2, 0x9a, 0xa7, - 0xbd, 0x8c, 0x81, 0xa2, 0x9e, 0xc0, 0xf1, 0x9b, 0x2b, 0xff, 0x28, 0x58, - 0xb9, 0x1a, 0x39, 0x16, 0x24, 0xfd, 0x7c, 0xc9, 0x9e, 0x52, 0x46, 0x01, - 0x20, 0x35, 0x0f, 0x5a, 0x1b, 0x3c, 0x26, 0x8a, 0x6a, 0x18, 0xaf, 0x1d, - 0x66, 0x9a, 0xb5, 0x52, 0xad, 0x53, 0x17, 0x57, 0x21, 0x43, 0x7a, 0xdd, - 0x2d, 0xd4, 0xe1, 0x72, 0x71, 0x49, 0xa6, 0x71, 0xb1, 0xf6, 0xa7, 0x4a, - 0x78, 0x64, 0xad, 0x88, 0xae, 0x80, 0x5f, 0x9f, 0xaf, 0x82, 0x87, 0x44, - 0xe8, 0x7d, 0x7e, 0x60, 0x68, 0xcc, 0x58, 0xc5, 0xff, 0x26, 0xb2, 0x8d, - 0xa5, 0xf7, 0xb5, 0xf6, 0x04, 0x19, 0x76, 0xe1, 0x8a, 0xbe, 0x5a, 0x56, - 0x51, 0xc2, 0x17, 0xb3, 0x84, 0x59, 0x68, 0x50, 0x0e, 0xdd, 0x27, 0x0f, - 0xdf, 0x71, 0xd1, 0xe6, 0x28, 0xf8, 0x0b, 0xdc, 0x4c, 0x4b, 0xc5, 0x92, - 0x9c, 0x53, 0x9d, 0xe0, 0x77, 0xa3, 0xfd, 0xa5, 0x2b, 0xd6, 0x38, 0xfd, - 0xc0, 0x8a, 0x6c, 0xa1, 0x86, 0x6a, 0x31, 0xbd, 0xd9, 0x2d, 0x05, 0xa5, - 0xdb, 0xc4, 0x8a, 0xbe, 0xf9, 0x38, 0x32, 0xa4, 0x3f, 0x40, 0xf6, 0x3f, - 0xd0, 0x43, 0xea, 0x54, 0xc3, 0xd2, 0x08, 0xeb, 0x0d, 0x1a, 0x4a, 0x48, - 0xaa, 0x7f, 0x1d, 0xfb, 0xde, 0xfc, 0xde, 0x0f, 0xbc, 0x94, 0x80, 0x40, - 0x1c, 0x0e, 0xaa, 0x2c, 0x82, 0xf6, 0x94, 0x4a, 0x15, 0x64, 0x8d, 0x88, - 0x74, 0x80, 0x1e, 0x9f, 0xaf, 0x82, 0x87, 0x44, 0xe8, 0x7d, 0x7e, 0x60, - 0x68, 0xcc, 0x58, 0xc5, 0xff, 0x26, 0xb2, 0x8d, 0xa5, 0xf7, 0xb5, 0xf6, - 0x48, 0xa1, 0x8e, 0xd2, 0x9b, 0xe0, 0x1d, 0x47, 0xbe, 0xa5, 0xb2, 0xdb, - 0x88, 0x4b, 0x51, 0xb7, 0xda, 0x1f, 0xe8, 0x1c, 0x5a, 0x6e, 0xb6, 0x6a, - 0xed, 0x63, 0x94, 0x4a, 0x35, 0x4c, 0x6b, 0xa9, 0xe7, 0x23, 0xf4, 0x61, - 0x95, 0x9e, 0xea, 0x89, 0x6b, 0x11, 0x90, 0xa2, 0x94, 0xff, 0x32, 0x1b, - 0x77, 0xff, 0x56, 0x76, 0xde, 0x34, 0xa2, 0x73, 0x7a, 0xf3, 0xfe, 0xb6, - 0x01, 0x64, 0x6e, 0x0d, 0xd3, 0xe1, 0xa8, 0x9d, 0x57, 0x93, 0xa4, 0x8c, - 0xf2, 0x49, 0x18, 0xdd, 0x8f, 0x5e, 0x90, 0x1f, 0x1b, 0x32, 0x1c, 0xea, - 0x05, 0x4d, 0xea, 0xb2, 0xfb, 0x3d, 0x3c, 0xff, 0xdf, 0xf3, 0x34, 0xbe, - 0x1b, 0x8c, 0xab, 0x9e, 0x88, 0x4d, 0xb6, 0xca, 0x14, 0x93, 0x01, 0xbb, - 0x78, 0x95, 0xec, 0x09, 0xb9, 0x21, 0x20, 0xf7, 0xa3, 0x44, 0x33, 0x8a, - 0x4f, 0xdb, 0x9c, 0xf0, 0xc5, 0xd4, 0x39, 0x2b, 0x4e, 0x42, 0x09, 0xc9, - 0xbc, 0xae, 0x2d, 0xa8, 0xe7, 0xce, 0x0e, 0x92, 0x04, 0xef, 0x92, 0x23, - 0xa0, 0x2a, 0xf8, 0x7f, 0x1c, 0x75, 0xdb, 0xd5, 0xe7, 0x70, 0x9e, 0x95, - 0xdc, 0x70, 0x17, 0xb9, 0x5f, 0xb6, 0x4d, 0xe6, 0x85, 0xfc, 0xd6, 0x44, - 0x24, 0xf5, 0xab, 0x99, 0x41, 0x38, 0xb2, 0xbf, 0x94, 0x2b, 0x87, 0x4a, - 0xe7, 0xd6, 0x43, 0xc2, 0x6c, 0x84, 0x53, 0x22, 0x74, 0x82, 0x46, 0xe6, - 0x17, 0x8b, 0x05, 0x56, 0x30, 0x8d, 0xdb, 0xef, 0xf4, 0x88, 0xf8, 0x62, - 0xc4, 0x0e, 0xc3, 0x6d, 0xd0, 0x4a, 0xef, 0x01, 0xa1, 0xf5, 0x38, 0x12, - 0x01, 0xe5, 0x53, 0x26, 0xa9, 0x6c, 0xf0, 0x9f, 0x7d, 0x25, 0x2d, 0xfa, - 0xc4, 0x43, 0x3a, 0x24, 0x3f, 0xd4, 0xe1, 0x44, 0x8c, 0x4d, 0x16, 0x3f, - 0x02, 0xc4, 0x69, 0xc1, 0x66, 0xa6, 0xa4, 0x8f, 0xb8, 0x22, 0x39, 0x2d, - 0x08, 0x08, 0x07, 0x2d, 0xd6, 0xeb, 0xc8, 0x1a, 0x6a, 0x99, 0x5e, 0xdc, - 0x69, 0x07, 0x66, 0x19, 0xf1, 0x4a, 0xea, 0xd5, 0x6a, 0xd8, 0x69, 0x76, - 0xc9, 0xb9, 0x17, 0x91, 0xd7, 0x11, 0xe7, 0x0d, 0x6c, 0x54, 0xf8, 0xa0, - 0xc9, 0x88, 0x1e, 0x0e, 0x9e, 0xdc, 0xb2, 0x84, 0xd2, 0x2a, 0x58, 0xd7, - 0x80, 0x07, 0x81, 0x66, 0xda, 0x1f, 0xe8, 0x1c, 0x43, 0x6e, 0xb6, 0x6a, - 0xed, 0x63, 0x94, 0x4a, 0x35, 0x4c, 0x6b, 0xa9, 0x59, 0xb8, 0x80, 0xac, - 0x1f, 0x12, 0xb0, 0x9d, 0xbc, 0x25, 0xe9, 0x96, 0x0d, 0xd9, 0x87, 0x8b, - 0x70, 0xad, 0x86, 0xa3, 0xac, 0xd8, 0x4f, 0x47, 0x3f, 0x45, 0x13, 0xd5, - 0xc6, 0xd9, 0x42, 0xf4, 0xf8, 0x4d, 0xdd, 0x55, 0x6f, 0x1b, 0xcb, 0x45, - 0xad, 0x57, 0x9d, 0x47, 0x09, 0x83, 0xad, 0x51, 0xd2, 0xff, 0x41, 0x71, - 0xa0, 0x72, 0x17, 0xe9, 0x78, 0x73, 0x9d, 0x2d, 0xb9, 0x6e, 0xfd, 0x5c, - 0xbc, 0xaf, 0xfe, 0xe4, 0x46, 0xdc, 0xf8, 0x25, 0xae, 0x82, 0xee, 0x88, - 0x06, 0x4d, 0xcc, 0xf5, 0x65, 0x1b, 0x37, 0x6d, 0x59, 0x29, 0x77, 0x41, - 0xd8, 0x7e, 0x83, 0x2c, 0x82, 0x18, 0xd9, 0x0d, 0xd8, 0xdf, 0x5e, 0xf1, - 0x87, 0xda, 0xd7, 0xdc, 0x9d, 0x45, 0xa0, 0x2f, 0x4c, 0xe8, 0xd6, 0xb2, - 0x23, 0x04, 0x12, 0xaa, 0xc2, 0x88, 0x7c, 0xbe, 0xb8, 0x98, 0x26, 0x3e, - 0x37, 0x8f, 0x5b, 0xee, 0x95, 0x1b, 0x83, 0xec, 0x41, 0x77, 0xd7, 0x18, - 0xcb, 0xe0, 0xc9, 0xbc, 0x33, 0x9d, 0xdc, 0x8a, 0x86, 0x3e, 0x85, 0x81, - 0x25, 0x35, 0xf3, 0xf7, 0x19, 0x49, 0x48, 0xe8, 0x20, 0xa2, 0x73, 0x5d, - 0xab, 0x7c, 0x47, 0x74, 0x37, 0x66, 0x18, 0x71, 0x65, 0x42, 0x7b, 0xd3, - 0x03, 0x02, 0x9f, 0x7b, 0x30, 0x7f, 0x88, 0x4a, 0xf4, 0xd7, 0xbf, 0xa2, - 0xce, 0xfd, 0x3f, 0xee, 0xd6, 0xba, 0xe2, 0x5e, 0x62, 0x31, 0xb1, 0xa5, - 0xf0, 0x9a, 0xa4, 0xcc, 0x37, 0xc5, 0x80, 0x9b, 0x6c, 0x50, 0xef, 0xbe, - 0xae, 0x94, 0x85, 0xab, 0x20, 0x67, 0x4c, 0x69, 0x26, 0xb9, 0x1f, 0xdb, - 0xfa, 0xdb, 0xad, 0xf9, 0x71, 0x28, 0xcd, 0xd0, 0x44, 0x1a, 0x6c, 0x8f, - 0xb2, 0xf0, 0x2e, 0x19, 0x99, 0x83, 0xe6, 0xd6, 0xdc, 0x3c, 0xe0, 0x55, - 0x4e, 0x06, 0xca, 0xda, 0x90, 0x4b, 0x02, 0x29, 0x01, 0xb3, 0xc8, 0x57, - 0x29, 0xe2, 0xaa, 0x93, 0x75, 0x78, 0xc8, 0xa6, 0x52, 0x27, 0x58, 0x28, - 0xa6, 0xe4, 0x08, 0x11, 0xea, 0xc4, 0x4e, 0x49, 0xff, 0x71, 0x9d, 0xc4, - 0x4b, 0x3e, 0xaf, 0xe1, 0xda, 0xb6, 0xe4, 0xb3, 0xa3, 0x78, 0xe4, 0x5c, - 0x4c, 0x42, 0xc7, 0x42, 0x6a, 0x48, 0x48, 0x98, 0x0c, 0x74, 0x83, 0xcf, - 0x2c, 0xb2, 0xdb, 0x89, 0xe2, 0x1b, 0x49, 0x72, 0x2a, 0x08, 0x05, 0x67, - 0xcc, 0xf6, 0x0c, 0x8b, 0xe7, 0x19, 0xa7, 0x45, 0xf8, 0x77, 0x4c, 0x51, - 0x2b, 0xea, 0x0c, 0xd3, 0x4f, 0xea, 0x64, 0x6e, 0xbb, 0x2a, 0xc2, 0x08, - 0xc8, 0x0f, 0x11, 0xb0, 0x74, 0xa4, 0xb0, 0xfa, 0xbb, 0x76, 0xd1, 0x37, - 0x33, 0x49, 0x9d, 0x05, 0xaa, 0xea, 0x72, 0x3f, 0xf6, 0x45, 0xbe, 0x09, - 0x05, 0xb5, 0xd5, 0x34, 0x32, 0xed, 0xe4, 0x44, 0x2f, 0x16, 0x60, 0x90, - 0x81, 0x03, 0x08, 0xdf, 0xd8, 0xeb, 0xc0, 0x42, 0xec, 0x07, 0x62, 0x6d, - 0x49, 0xb6, 0x55, 0xe0, 0x06, 0x29, 0xbf, 0x8a, 0xcd, 0x40, 0x3b, 0x40, - 0x33, 0x35, 0xf5, 0x36, 0xb8, 0xb1, 0x27, 0x8d, 0x81, 0x65, 0x79, 0xa2, - 0x13, 0x78, 0x12, 0x6a, 0xb6, 0x57, 0x9b, 0x83, 0x27, 0xa8, 0x5a, 0x31, - 0xa8, 0x86, 0xe8, 0xd6, 0xc7, 0x25, 0xb0, 0x61, 0x40, 0x9b, 0x40, 0xe5, - 0x07, 0x89, 0x60, 0x53, 0xdb, 0x22, 0x3e, 0x2f, 0xd8, 0x00, 0x44, 0x3f, - 0xff, 0x67, 0xc7, 0x66, 0x46, 0x8a, 0x99, 0x68, 0xd3, 0x31, 0xb1, 0x36, - 0x07, 0x31, 0x23, 0x1a, 0xa0, 0x74, 0xed, 0x9a, 0x3d, 0x04, 0x15, 0x31, - 0xd1, 0x4d, 0x44, 0x0a, 0x8b, 0x26, 0x01, 0xfd, 0x54, 0xb3, 0x54, 0x79, - 0x40, 0x60, 0x83, 0x5e, 0x1a, 0x23, 0x9d, 0x22, 0xa4, 0x4b, 0x6b, 0xe6, - 0xfe, 0x52, 0xe5, 0x93, 0xd9, 0x23, 0x85, 0x8c, 0xe9, 0x43, 0x79, 0xfd, - 0xbb, 0x28, 0x7f, 0x82, 0x06, 0x13, 0x94, 0xeb, 0x9c, 0x08, 0x26, 0xff, - 0x7f, 0x78, 0xc6, 0x34, 0x9e, 0xa7, 0x62, 0x25, 0xca, 0x7a, 0xcc, 0x4e, - 0x37, 0x13, 0x59, 0xce, 0xfa, 0x6f, 0x56, 0x9c, 0x4a, 0x0b, 0x0d, 0xb2, - 0xba, 0xd8, 0x92, 0xaa, 0xf6, 0x6b, 0x2d, 0x39, 0xb7, 0x3c, 0xc5, 0x42, - 0x67, 0xcd, 0x55, 0x76, 0xc2, 0x65, 0xcb, 0x2a, 0x6e, 0x2c, 0xf9, 0xce, - 0x00, 0xeb, 0x42, 0xbe, 0x68, 0xfd, 0xd2, 0x1a, 0x02, 0xb7, 0xc3, 0xfc, - 0xfc, 0x37, 0xac, 0x0c, 0x1c, 0x36, 0x33, 0x10, 0x63, 0xf2, 0x14, 0x57, - 0x03, 0x5a, 0xa1, 0xb5, 0x7b, 0xa4, 0xcc, 0x33, 0x6f, 0xc4, 0x63, 0xe8, - 0xbe, 0x5e, 0x8c, 0xbb, 0xe2, 0xd3, 0x14, 0xe4, 0xcd, 0xbd, 0x31, 0x44, - 0xdc, 0x1c, 0xbc, 0xa9, 0x47, 0x4f, 0xd7, 0x95, 0x45, 0xe5, 0x71, 0xe6, - 0x67, 0x16, 0x77, 0xa7, 0x3d, 0x77, 0x46, 0x8c, 0x9c, 0xe3, 0xd2, 0xbc, - 0xb9, 0x0f, 0xf4, 0x36, 0xf1, 0x3d, 0x2a, 0x83, 0x87, 0x67, 0xe7, 0x82, - 0x62, 0x89, 0x4a, 0x32, 0xf5, 0x7f, 0x57, 0x4e, 0x02, 0x9c, 0xf5, 0x89, - 0x29, 0x18, 0xf1, 0x92, 0x96, 0x93, 0x56, 0x7e, 0xd0, 0x49, 0xe5, 0x38, - 0xf7, 0x0e, 0xaf, 0xe4, 0x9f, 0xf8, 0x0e, 0x7d, 0x38, 0xa5, 0x56, 0x21, - 0xab, 0x5e, 0x9a, 0x2d, 0x03, 0x37, 0x5a, 0x13, 0x8e, 0x39, 0x03, 0x33, - 0x34, 0xfc, 0x46, 0x4c, 0xca, 0x13, 0x21, 0xf2, 0xad, 0xa7, 0x53, 0xb9, - 0x06, 0xde, 0xbb, 0xdd, 0x57, 0x88, 0x99, 0xa3, 0xc8, 0x81, 0xe4, 0x6d, - 0xb1, 0xb7, 0xda, 0x57, 0xcd, 0x31, 0x58, 0x16, 0xdd, 0x3d, 0x76, 0x84, - 0x2c, 0x7d, 0xb0, 0x63, 0x04, 0x64, 0xaf, 0x1f, 0x75, 0xfc, 0x29, 0xaa, - 0xb7, 0x75, 0x5c, 0xa1, 0x0d, 0xd8, 0x68, 0xeb, 0x67, 0xd6, 0x29, 0xef, - 0x64, 0xd0, 0x3e, 0x02, 0x21, 0x79, 0x67, 0x25, 0x79, 0x13, 0x99, 0x2c, - 0xc7, 0x72, 0x6e, 0xb2, 0x03, 0x59, 0x85, 0xb0, 0x18, 0x8f, 0x06, 0x22, - 0x2f, 0x7b, 0xc9, 0x50, 0xe0, 0xbf, 0xc7, 0x1b, 0x49, 0xc2, 0x86, 0x98, - 0x96, 0xb4, 0x61, 0x56, 0x7f, 0x80, 0xbd, 0xa7, 0xa4, 0x62, 0xf2, 0xf8, - 0xbe, 0x8b, 0x17, 0xec, 0xa6, 0x73, 0x81, 0xd0, 0x0b, 0xe4, 0xc4, 0x02, - 0xd3, 0x51, 0xef, 0x46, 0x12, 0xef, 0x80, 0x8b, 0x81, 0xff, 0xfe, 0x8c, - 0x7d, 0xb8, 0xa2, 0xce, 0xf6, 0xa3, 0x31, 0x8d, 0x68, 0x07, 0x02, 0x44, - 0x88, 0x63, 0xab, 0xda, 0xd7, 0x9f, 0xc9, 0x74, 0xf6, 0x24, 0x32, 0xb9, - 0x1e, 0xc4, 0x08, 0x9a, 0x3a, 0x2f, 0xa6, 0x00, 0xfd, 0xd3, 0x4a, 0x6f, - 0x52, 0x10, 0xa2, 0xea, 0xf5, 0xf4, 0x6b, 0x65, 0x1c, 0x29, 0x3f, 0xed, - 0x90, 0x46, 0xd5, 0x2b, 0x3c, 0x40, 0xeb, 0xb0, 0xc6, 0x45, 0xbd, 0x4f, - 0x62, 0x52, 0x72, 0xac, 0x07, 0xca, 0x2e, 0xeb, 0x13, 0x46, 0x0c, 0xde, - 0x86, 0xa5, 0x6b, 0x19, 0x22, 0x77, 0xec, 0x0d, 0x94, 0xed, 0xfb, 0xeb, - 0x0d, 0x5c, 0x46, 0x6b, 0x90, 0xd1, 0xd4, 0x8f, 0x87, 0xaa, 0x78, 0x35, - 0x5d, 0xb8, 0x5c, 0x64, 0xaa, 0x29, 0x09, 0xc7, 0x9a, 0xf6, 0x67, 0x0d, - 0x98, 0xff, 0xd6, 0x5c, 0xe0, 0x03, 0xe1, 0x71, 0x73, 0x98, 0x07, 0x97, - 0x8a, 0xe5, 0x33, 0x6f, 0xee, 0x1b, 0x84, 0xf5, 0x75, 0xc4, 0xb6, 0x86, - 0x22, 0x9a, 0xa0, 0xd6, 0xf8, 0xfe, 0xac, 0x03, 0x7d, 0x74, 0x18, 0xd4, - 0x8f, 0x34, 0x07, 0x57, 0xb1, 0xf0, 0xab, 0xda, 0x81, 0x52, 0x07, 0xed, - 0x58, 0x62, 0x75, 0x6f, 0x56, 0x88, 0xf2, 0x76, 0x62, 0xa6, 0x47, 0x74, - 0xbd, 0xa3, 0xc0, 0xfc, 0x2d, 0xa1, 0x97, 0x18, 0xd6, 0xb3, 0xe2, 0x5e, - 0x1b, 0xbc, 0x05, 0x88, 0x10, 0x15, 0x6a, 0xa1, 0xb1, 0xc8, 0x0c, 0x08, - 0x33, 0x47, 0xcf, 0x04, 0xa2, 0x36, 0x7e, 0xf3, 0x53, 0x2e, 0x9f, 0xc7, - 0x5b, 0xec, 0x28, 0x0b, 0x6b, 0x43, 0x98, 0xc1, 0xca, 0xce, 0x8a, 0xc5, - 0x75, 0x6d, 0x22, 0xf2, 0x1b, 0xd9, 0x49, 0xb5, 0x68, 0xeb, 0x06, 0x20, - 0xcf, 0x03, 0x73, 0xf7, 0x89, 0xea, 0x38, 0xa0, 0x12, 0xa3, 0x43, 0x2d, - 0x0e, 0x51, 0x12, 0x07, 0x95, 0x5a, 0xe4, 0x43, 0x88, 0x87, 0x41, 0xbc, - 0x74, 0xf0, 0x98, 0xd5, 0xbf, 0x72, 0xa7, 0x2a, 0xe7, 0xd4, 0x2a, 0x8f, - 0xdb, 0xaf, 0x68, 0x79, 0xb8, 0xa2, 0xdf, 0x6d, 0xe8, 0x9e, 0x0b, 0xd5, - 0x2a, 0xb0, 0xb6, 0x2c, 0x7a, 0xa5, 0x42, 0xf5, 0xeb, 0x55, 0xce, 0xa5, - 0xd6, 0x4b, 0xa8, 0x6e, 0x6d, 0xa8, 0x26, 0xc0, 0x18, 0x2d, 0xbf, 0x71, - 0x83, 0x0a, 0xfb, 0x71, 0xb5, 0x53, 0x69, 0x30, 0x6e, 0x9e, 0xc9, 0x45, - 0x6b, 0x2f, 0xfd, 0x11, 0x25, 0x0f, 0xd4, 0x7e, 0xe1, 0xeb, 0xfc, 0xc0, - 0x22, 0x85, 0x8c, 0x60, 0xb9, 0x99, 0x3c, 0xdc, 0xa2, 0x4d, 0xd9, 0xfb, - 0xb4, 0xd7, 0xb0, 0x59, 0xa2, 0x94, 0xce, 0xfc, 0x63, 0xb8, 0x28, 0xde, - 0x20, 0x47, 0x78, 0x56, 0xa7, 0xd5, 0x52, 0x82, 0x97, 0xb9, 0xbb, 0x84, - 0x13, 0x43, 0x9b, 0x78, 0x5f, 0xb0, 0x29, 0x5b, 0x6f, 0x99, 0x75, 0x39, - 0x03, 0x4d, 0xa0, 0xb5, 0x5f, 0x2e, 0x8e, 0x9d, 0x98, 0xef, 0xb7, 0xbc, - 0x45, 0x36, 0x63, 0x04, 0x71, 0x4e, 0xea, 0x4e, 0x39, 0x51, 0xad, 0x14, - 0x3b, 0xec, 0x6b, 0xa4, 0xf1, 0xee, 0x3d, 0x61, 0x12, 0x3e, 0xc0, 0xc3, - 0x93, 0x93, 0x63, 0xf0, 0x62, 0x68, 0x32, 0x13, 0xac, 0x14, 0x5d, 0x34, - 0xfe, 0x1a, 0x0f, 0x68, 0xe9, 0xf2, 0xfe, 0x76, 0xc8, 0x78, 0x3c, 0x6f, - 0x75, 0x56, 0x3e, 0xe4, 0xc1, 0x0a, 0xd6, 0xeb, 0x58, 0xf5, 0xb7, 0x19, - 0xe4, 0x52, 0xcf, 0x6b, 0x91, 0xaf, 0x5f, 0x86, 0x09, 0xbd, 0x81, 0xd3, - 0x75, 0x9e, 0xc3, 0xcc, 0xd3, 0xa3, 0x46, 0x1e, 0x5a, 0x3b, 0x02, 0x60, - 0x1c, 0xcf, 0x43, 0x06, 0x65, 0x49, 0x98, 0x9e, 0x11, 0xca, 0x85, 0x64, - 0xaf, 0x8f, 0x38, 0xbb, 0x35, 0x5c, 0x08, 0xb0, 0xc3, 0xbb, 0x03, 0x5b, - 0xee, 0xd0, 0xb6, 0xe0, 0x31, 0x0c, 0xe2, 0x06, 0x1b, 0x55, 0x54, 0x72, - 0xfe, 0xc6, 0xec, 0xcf, 0x0b, 0x24, 0xf4, 0xcc, 0x8a, 0x15, 0xcd, 0x89, - 0xbd, 0x38, 0x1b, 0x6c, 0x98, 0xf1, 0xfb, 0xa4, 0x7f, 0x5b, 0xaa, 0x13, - 0x20, 0x4b, 0xa8, 0xd7, 0x7d, 0xe8, 0x11, 0xfc, 0x14, 0xbd, 0x19, 0x4e, - 0x20, 0x4c, 0x24, 0xc7, 0x2c, 0x7d, 0xb0, 0x63, 0xce, 0x64, 0x2f, 0x1f, - 0xf5, 0xfc, 0xa9, 0xaa, 0xb7, 0x75, 0x5c, 0xa1, 0x0d, 0xd8, 0x68, 0xeb, - 0x67, 0xd6, 0x29, 0xef, 0x64, 0xd0, 0x3e, 0x02, 0x21, 0x79, 0x67, 0x25, - 0x79, 0x13, 0x99, 0x2c, 0xc7, 0x72, 0x6e, 0xb2, 0x03, 0x59, 0x85, 0xb0, - 0x18, 0x8f, 0x06, 0x22, 0x2f, 0x7b, 0xc9, 0x50, 0xe0, 0xbf, 0xc7, 0x1b, - 0x49, 0xc2, 0x86, 0x98, 0x96, 0xb4, 0x61, 0x56, 0x7f, 0x80, 0xbd, 0xa7, - 0xa4, 0x62, 0xf2, 0xf8, 0xbe, 0x8b, 0x17, 0xec, 0xa6, 0x73, 0x81, 0xd0, - 0x0b, 0xe4, 0xc4, 0x02, 0xd3, 0x51, 0xef, 0x46, 0x12, 0xef, 0x80, 0x8b, - 0x81, 0xff, 0xfe, 0x8c, 0x47, 0x7a, 0xbf, 0xd5, 0x72, 0x4a, 0x23, 0xa2, - 0x85, 0xe1, 0xb3, 0x56, 0x50, 0x99, 0x7a, 0x31, 0x03, 0x41, 0x86, 0x7f, - 0x12, 0x40, 0x94, 0x91, 0x7b, 0x54, 0x0f, 0xb4, 0xa0, 0xfd, 0x28, 0xb9, - 0x1d, 0xe2, 0x45, 0x27, 0xc9, 0xb6, 0x43, 0x3d, 0xb3, 0xbe, 0x99, 0x39, - 0x78, 0x84, 0x4b, 0xf2, 0x8b, 0x1c, 0x04, 0x10, 0x97, 0x76, 0xb2, 0xb8, - 0x3d, 0x2c, 0xfc, 0x0e, 0x62, 0x9c, 0xf9, 0xab, 0x07, 0xca, 0x2e, 0xeb, - 0xd8, 0x46, 0x8d, 0xde, 0x06, 0xa5, 0xeb, 0x19, 0x22, 0x77, 0xec, 0x0d, - 0x94, 0xed, 0xfb, 0xeb, 0x0d, 0x5c, 0x46, 0x6b, 0x90, 0xd1, 0xd4, 0x8f, - 0x87, 0xaa, 0x78, 0x35, 0x5d, 0xb8, 0x5c, 0x64, 0xaa, 0x29, 0x09, 0xc7, - 0x9a, 0xf6, 0x67, 0x0d, 0x98, 0xff, 0xd6, 0x5c, 0xe0, 0x03, 0xe1, 0x71, - 0x73, 0x98, 0x07, 0x97, 0x8a, 0xe5, 0x33, 0x6f, 0xee, 0x1b, 0x84, 0xf5, - 0x75, 0xc4, 0xb6, 0x86, 0x22, 0x9a, 0xa0, 0xd6, 0xf8, 0xfe, 0xac, 0x03, - 0x7d, 0x74, 0x18, 0xd4, 0x8f, 0x34, 0x07, 0x57, 0xb1, 0xf0, 0xab, 0xda, - 0x81, 0x52, 0x07, 0xed, 0x58, 0x62, 0x75, 0x6f, 0x56, 0x88, 0xf2, 0x76, - 0x62, 0xa6, 0x47, 0x74, 0xbd, 0xa3, 0xc0, 0xfc, 0x2d, 0xa1, 0x97, 0x18, - 0x05, 0x76, 0xc5, 0xc6, 0xb5, 0x2e, 0xb1, 0x4c, 0x13, 0xad, 0x82, 0x35, - 0x37, 0xae, 0x3e, 0x3b, 0x7f, 0x8a, 0xc8, 0xdf, 0xe4, 0xe2, 0x2c, 0x03, - 0xf5, 0x41, 0x03, 0x02, 0xe6, 0xd4, 0xe6, 0x70, 0xc5, 0x35, 0x28, 0x52, - 0xb9, 0x23, 0x35, 0x14, 0x86, 0xa3, 0x25, 0x11, 0x3a, 0xef, 0x5a, 0xe3, - 0x81, 0xea, 0xd2, 0x61, 0x3a, 0x43, 0xc5, 0xbc, 0xf6, 0x07, 0xcb, 0x8a, - 0x13, 0x8e, 0x6a, 0x57, 0x23, 0x02, 0x2b, 0xdc, 0x8d, 0x05, 0xdb, 0x18, - 0x01, 0xa2, 0x14, 0xb6, 0x44, 0x7d, 0x0c, 0x8b, 0x92, 0x29, 0xda, 0x4f, - 0xeb, 0x6e, 0x95, 0x40, 0xc0, 0x4a, 0xdc, 0x62, 0xf9, 0x4a, 0xbf, 0xe1, - 0x20, 0xba, 0xfc, 0x3e, 0x96, 0x89, 0xe3, 0x01, 0x12, 0x0d, 0xb2, 0x02, - 0xfc, 0x29, 0xd4, 0x32, 0xf1, 0x04, 0x46, 0xfa, 0xdb, 0x09, 0x45, 0x02, - 0xc0, 0xf0, 0xc4, 0xf2, 0xe4, 0x43, 0x11, 0xb1, 0x30, 0x3f, 0xff, 0x06, - 0x24, 0x80, 0x3e, 0xea, 0xea, 0xa4, 0xb3, 0xb1, 0xde, 0xca, 0x86, 0x2c, - 0x9b, 0xe0, 0x76, 0xf1, 0x47, 0xd6, 0xb2, 0x16, 0x36, 0xc7, 0xbf, 0x98, - 0xa7, 0x43, 0xf8, 0x92, 0xc4, 0xfc, 0xb5, 0x81, 0x03, 0xa5, 0x6c, 0xc6, - 0x92, 0x90, 0xcc, 0xac, 0x4e, 0x7b, 0x83, 0xd4, 0x73, 0x70, 0x91, 0xe3, - 0xe5, 0xad, 0x79, 0x92, 0x51, 0x14, 0x0e, 0x3a, 0x22, 0xa9, 0xda, 0x21, - 0x5d, 0xfc, 0x50, 0xf6, 0x18, 0x9a, 0x95, 0xf6, 0xd9, 0xf7, 0xbe, 0x1a, - 0xfe, 0xba, 0xc3, 0x20, 0x52, 0x9e, 0x3a, 0x6c, 0xba, 0x7d, 0xc9, 0xae, - 0xe8, 0xdc, 0x18, 0xfb, 0x03, 0xc5, 0x77, 0x8c, 0x39, 0xe5, 0x71, 0x0a, - 0xd1, 0x42, 0xac, 0x4f, 0x40, 0xe1, 0x08, 0xf2, 0x61, 0xe5, 0xbc, 0xad, - 0x74, 0xa2, 0x6c, 0x18, 0xb9, 0x45, 0x3a, 0x24, 0x2e, 0x4c, 0x32, 0x46, - 0x95, 0x74, 0xc4, 0x56, 0x84, 0xf4, 0xbc, 0x6e, 0x1d, 0xec, 0x7a, 0x0f, - 0x77, 0x11, 0xfe, 0xbd, 0xc5, 0x19, 0x53, 0xae, 0xf7, 0xe2, 0x66, 0x05, - 0xc4, 0x03, 0x61, 0xf3, 0xa1, 0xee, 0x8d, 0xe9, 0xac, 0x9a, 0x32, 0xd2, - 0xcf, 0xac, 0xd6, 0x7d, 0x69, 0x0c, 0x3d, 0xb2, 0x7f, 0xeb, 0x45, 0x68, - 0xf6, 0xf9, 0x6e, 0xa2, 0xa7, 0x0f, 0xb6, 0x71, 0xb9, 0x99, 0xdb, 0x88, - 0x3d, 0x19, 0x5f, 0xfc, 0x54, 0x4e, 0xdb, 0x51, 0x1e, 0xb1, 0x7f, 0xe2, - 0x72, 0x6c, 0x9d, 0xea, 0xb5, 0xad, 0x31, 0x69, 0x2d, 0xd9, 0x35, 0xc1, - 0xf9, 0x8a, 0x3b, 0xc6, 0x18, 0xd2, 0xf6, 0x54, 0xf1, 0xee, 0x0c, 0xe2, - 0xdd, 0x93, 0x83, 0x43, 0x25, 0xaf, 0x2f, 0x61, 0xe0, 0x07, 0xf4, 0x3a, - 0xa9, 0xf9, 0x3f, 0xf4, 0x47, 0x07, 0x79, 0x31, 0x92, 0x45, 0x14, 0x2d, - 0x1c, 0x37, 0x5f, 0x96, 0x7e, 0x4f, 0x00, 0xee, 0xed, 0x12, 0xc5, 0x80, - 0x93, 0x82, 0xe7, 0x6e, 0x29, 0xd4, 0xfd, 0x7c, 0xa3, 0xa1, 0xc3, 0x17, - 0xd9, 0x2b, 0x15, 0xee, 0x7d, 0xe2, 0xc0, 0x76, 0x85, 0x66, 0xae, 0x07, - 0xc3, 0x9d, 0x6d, 0x5b, 0xb6, 0xe8, 0x1b, 0x94, 0xdf, 0xad, 0x3c, 0x38, - 0x2b, 0xa4, 0x64, 0xe3, 0x0a, 0x06, 0xee, 0x88, 0x13, 0x05, 0x5a, 0xb3, - 0x4a, 0x98, 0x5f, 0x22, 0x48, 0x7c, 0xeb, 0x64, 0xf6, 0x1b, 0x8d, 0x4b, - 0xb5, 0xb0, 0x25, 0x89, 0x98, 0x5c, 0x0a, 0x16, 0x4e, 0x31, 0x11, 0x55, - 0xec, 0x2a, 0x76, 0x57, 0x88, 0xbb, 0xf0, 0x02, 0xc5, 0x58, 0x42, 0xba, - 0x5e, 0xf8, 0xa6, 0xbd, 0xd5, 0x9c, 0x41, 0xf2, 0x08, 0xb4, 0xee, 0x3e, - 0x04, 0x75, 0x85, 0x05, 0x95, 0x1d, 0x2f, 0x56, 0xdf, 0xea, 0xb1, 0x97, - 0xed, 0xa0, 0x9b, 0x68, 0xac, 0xf5, 0xe3, 0x0a, 0x14, 0xa9, 0x35, 0xf8, - 0x21, 0x6e, 0x33, 0x5e, 0xb1, 0x27, 0xb9, 0x63, 0x70, 0x71, 0xf9, 0x33, - 0x58, 0x50, 0x8c, 0x28, 0xea, 0x0c, 0x87, 0xf9, 0xa3, 0x7e, 0x43, 0xad, - 0x39, 0x5c, 0x0e, 0xd7, 0x3f, 0x28, 0x03, 0xa3, 0xc9, 0x80, 0x02, 0x28, - 0x17, 0x90, 0x88, 0x66, 0xd5, 0x64, 0xa4, 0xc4, 0x40, 0x93, 0x52, 0x9a, - 0x5d, 0xbc, 0x35, 0x5f, 0x89, 0x94, 0xd6, 0x6d, 0x50, 0xed, 0x35, 0x29, - 0x4a, 0x05, 0x72, 0x9d, 0xea, 0x10, 0x7b, 0xb5, 0x70, 0x6e, 0x68, 0xd0, - 0x90, 0x3c, 0x88, 0x75, 0x64, 0x98, 0x72, 0xf7, 0x74, 0x7f, 0xf0, 0x7d, - 0xc7, 0xe9, 0x0e, 0xb6, 0x51, 0x2e, 0x83, 0x55, 0xdf, 0x88, 0x6a, 0xb6, - 0x48, 0x6d, 0x21, 0xad, 0x94, 0xfd, 0x0f, 0xe1, 0xe2, 0xb7, 0x89, 0x5a, - 0x7f, 0xef, 0x4b, 0x39, 0xfe, 0xa1, 0x0d, 0x0c, 0xe3, 0x9b, 0x7a, 0xba, - 0x58, 0x5f, 0x3d, 0x7c, 0x34, 0x20, 0x3f, 0x4a, 0x8f, 0xf4, 0x49, 0xfe, - 0x59, 0x9a, 0xc6, 0xc0, 0x48, 0xd5, 0xe0, 0xf4, 0x19, 0x55, 0x17, 0x76, - 0xb0, 0x3e, 0x29, 0xd1, 0x8e, 0x19, 0x7f, 0x7a, 0x99, 0x32, 0x75, 0x1e, - 0x93, 0x09, 0x76, 0xb7, 0x66, 0x2c, 0xba, 0x9b, 0xfe, 0xec, 0xc2, 0x28, - 0x7c, 0x98, 0x77, 0x9d, 0x3a, 0xc1, 0x8f, 0x16, 0x71, 0x8c, 0x24, 0x7b, - 0x10, 0x98, 0x8c, 0xbf, 0x66, 0xbf, 0x56, 0x5a, 0x49, 0xf1, 0xa1, 0x60, - 0x82, 0x23, 0xb4, 0x7f, 0x36, 0x07, 0xbe, 0x01, 0x24, 0xd3, 0x01, 0xb4, - 0xea, 0x6f, 0xf1, 0xff, 0xa6, 0x96, 0xf8, 0x66, 0x69, 0x62, 0x69, 0x0e, - 0x55, 0x0d, 0x73, 0x40, 0xba, 0x50, 0x0b, 0x28, 0xb2, 0x07, 0x5e, 0x11, - 0x8d, 0x4a, 0x34, 0x58, 0xbe, 0x63, 0xc3, 0x1b, 0x39, 0xa0, 0x7a, 0xc5, - 0xab, 0xac, 0xd8, 0x72, 0x08, 0x60, 0xa2, 0x6f, 0xe1, 0x36, 0xaf, 0x06, - 0x9b, 0xe3, 0x29, 0x80, 0xfb, 0x59, 0x86, 0xd2, 0x24, 0x8d, 0xf9, 0x8b, - 0x85, 0xac, 0x56, 0x55, 0x66, 0x61, 0xc0, 0xf9, 0x50, 0x51, 0xcb, 0x1c, - 0xbc, 0x85, 0x6f, 0x36, 0x8b, 0x60, 0x1a, 0xd2, 0xa8, 0xf0, 0x94, 0xdb, - 0x8c, 0xb9, 0x09, 0x48, 0xa7, 0xaa, 0x4a, 0x0a, 0x94, 0x89, 0x09, 0x68, - 0x59, 0x0a, 0xbc, 0x3f, 0xce, 0x5f, 0x9b, 0x87, 0x8c, 0xdf, 0xe1, 0x53, - 0x4f, 0x3d, 0xf0, 0x96, 0x31, 0x85, 0xff, 0xd8, 0x87, 0xe5, 0xc0, 0x9f, - 0xc6, 0x13, 0x12, 0x11, 0xce, 0xf7, 0x83, 0xf1, 0xf1, 0x45, 0xdc, 0x6b, - 0xe2, 0xc3, 0x95, 0x52, 0x55, 0xdf, 0x18, 0x6c, 0xd5, 0x06, 0xe0, 0x08, - 0x58, 0x09, 0x74, 0x57, 0x22, 0xee, 0x71, 0xdf, 0xb6, 0x18, 0xd7, 0xb3, - 0x00, 0x92, 0x89, 0xbc, 0x87, 0xc6, 0x65, 0x56, 0x73, 0x3d, 0x8e, 0x08, - 0xfb, 0x8b, 0x44, 0x93, 0x9c, 0x05, 0x5b, 0xd0, 0xc2, 0xdb, 0xee, 0x23, - 0x60, 0x25, 0x47, 0x03, 0x6a, 0x52, 0xd5, 0x68, 0x07, 0x6c, 0xbc, 0xd9, - 0xa0, 0x82, 0xef, 0x4f, 0xff, 0x02, 0xbb, 0x65, 0x7d, 0x81, 0x5a, 0xf7, - 0xe7, 0x88, 0x6f, 0x22, 0x59, 0xaa, 0x36, 0xaf, 0xe8, 0xb0, 0xea, 0x42, - 0x61, 0x10, 0x98, 0x4c, 0x81, 0xc3, 0x05, 0x85, 0x00, 0x75, 0x34, 0xf5, - 0xae, 0x84, 0x3f, 0xcb, 0x5c, 0x62, 0xfa, 0x40, 0x6d, 0x21, 0x95, 0x25, - 0x9b, 0xe5, 0xea, 0x25, 0xfd, 0x43, 0x81, 0x1c, 0x31, 0xf2, 0x6f, 0x1d, - 0x95, 0xbd, 0xfc, 0x1d, 0x80, 0x30, 0x58, 0x0b, 0xdf, 0x5e, 0xaa, 0xec, - 0x3f, 0xc3, 0xaf, 0xe7, 0x63, 0xe9, 0xb8, 0x87, 0x3f, 0x5a, 0x4c, 0xe7, - 0x4c, 0x83, 0xa9, 0xc4, 0x8b, 0x13, 0xdd, 0x45, 0xcc, 0x27, 0xfe, 0x1e, - 0xb0, 0xb6, 0x0d, 0xcd, 0xb3, 0x97, 0x02, 0x17, 0x7e, 0x79, 0xb0, 0x18, - 0x1b, 0xab, 0x03, 0xb1, 0x3e, 0x72, 0x9c, 0xad, 0x95, 0xe3, 0x0c, 0xb7, - 0x40, 0x40, 0xf0, 0x14, 0xb6, 0xd2, 0x10, 0xb4, 0xca, 0xa2, 0xce, 0x04, - 0xf6, 0x62, 0x0b, 0xc9, 0xc9, 0xe4, 0xfc, 0x41, 0xb7, 0xdd, 0x8a, 0x55, - 0x3f, 0xe9, 0x92, 0x53, 0xdc, 0xc4, 0xd7, 0xe2, 0x50, 0x37, 0x73, 0x3e, - 0x0d, 0x25, 0x76, 0xc7, 0xfc, 0x4d, 0xfb, 0x56, 0x5d, 0x98, 0x2f, 0x76, - 0xef, 0xe6, 0xf4, 0xe1, 0x58, 0x54, 0x39, 0x8a, 0xc4, 0xb1, 0x06, 0xc3, - 0xca, 0xc8, 0xa7, 0x0f, 0x35, 0xfe, 0x45, 0x1f, 0x02, 0xe4, 0x9d, 0xdb, - 0xba, 0xb7, 0x0b, 0xa4, 0x61, 0x00, 0xbb, 0xbe, 0x76, 0x81, 0xcd, 0x70, - 0x77, 0xb1, 0x60, 0xed, 0xa7, 0x60, 0x60, 0x5e, 0x76, 0x19, 0x75, 0x26, - 0xc1, 0x37, 0x05, 0x37, 0x8e, 0xf9, 0xc2, 0x6a, 0x43, 0x5c, 0x1f, 0xd0, - 0x73, 0x13, 0x39, 0x88, 0x68, 0x48, 0x0e, 0x5b, 0x77, 0x1c, 0x06, 0x44, - 0x7b, 0xc2, 0x13, 0xdd, 0xfc, 0x7e, 0xf3, 0x2a, 0xbe, 0xfe, 0x85, 0x49, - 0x8d, 0x2c, 0x39, 0xb1, 0x7e, 0xba, 0x54, 0x65, 0x16, 0x5f, 0x9d, 0xc2, - 0x1b, 0xa0, 0xfe, 0x78, 0x06, 0x27, 0x58, 0xdb, 0x79, 0xb7, 0x0b, 0xa4, - 0x61, 0x00, 0xbb, 0xbe, 0x76, 0x81, 0xcd, 0x70, 0x77, 0xb1, 0x60, 0xed, - 0xa7, 0x60, 0x60, 0x5e, 0x76, 0x19, 0x75, 0x26, 0xc1, 0x37, 0x05, 0x37, - 0x8e, 0xf9, 0xc2, 0x6a, 0x43, 0x5c, 0x1f, 0xd0, 0x73, 0x13, 0x39, 0x88, - 0x68, 0x48, 0x0e, 0x5b, 0x77, 0x1c, 0x06, 0x44, 0x7b, 0xc2, 0x13, 0xdd, - 0xfc, 0x7e, 0xf3, 0x2a, 0xbe, 0xfe, 0x85, 0x49, 0x92, 0xc3, 0x7e, 0x96, - 0xe9, 0xa0, 0xb9, 0x91, 0x34, 0x7a, 0xcf, 0x8d, 0x9e, 0xfe, 0x09, 0x5f, - 0x5d, 0x23, 0xee, 0xe6, 0xe4, 0xc8, 0xca, 0xde, 0x19, 0xaf, 0xa9, 0xfe, - 0xd3, 0xfe, 0x5b, 0xc9, 0x47, 0x16, 0x7e, 0xb2, 0xc3, 0xc7, 0xdb, 0x6a, - 0xd7, 0x8b, 0x45, 0xbf, 0x2f, 0x41, 0x19, 0x29, 0x29, 0x9a, 0xc7, 0x9f, - 0x75, 0x42, 0x96, 0x0b, 0x5c, 0x0c, 0x95, 0xf5, 0x38, 0xee, 0xf4, 0xe3, - 0xf7, 0xbb, 0xa9, 0x65, 0x36, 0xef, 0x40, 0xc5, 0xe4, 0x17, 0xab, 0xdc, - 0xee, 0x2b, 0x66, 0x17, 0xbe, 0x15, 0x21, 0x96, 0xca, 0xc0, 0xd3, 0x63, - 0x60, 0x10, 0xb9, 0x09, 0x6b, 0x0d, 0x08, 0xc6, 0x20, 0x6b, 0x38, 0x6b, - 0x69, 0xd6, 0x5f, 0x39, 0x44, 0xb7, 0x17, 0x49, 0x34, 0x34, 0x4a, 0x90, - 0x7f, 0x03, 0x7c, 0xa1, 0x89, 0xd1, 0xbc, 0xd1, 0x43, 0x58, 0xb2, 0x63, - 0x9c, 0xb7, 0x8b, 0x04, 0x1e, 0x97, 0x09, 0xe5, 0x0b, 0xba, 0xca, 0x12, - 0x5a, 0x02, 0x3d, 0xa5, 0x2a, 0xcd, 0x33, 0x0c, 0x90, 0x4d, 0xfa, 0x77, - 0x73, 0x8d, 0x54, 0x2a, 0x7f, 0x46, 0x20, 0x0a, 0xc9, 0x05, 0x2a, 0x43, - 0x4d, 0x28, 0x77, 0x3e, 0xbc, 0x40, 0xfe, 0x4d, 0xbd, 0x5b, 0xcd, 0x41, - 0x54, 0x98, 0x21, 0xd4, 0x14, 0xba, 0x04, 0x80, 0xf4, 0xc9, 0x44, 0x95, - 0x54, 0x31, 0x2d, 0x3d, 0x07, 0x00, 0xf0, 0x2a, 0x07, 0xb1, 0xc3, 0x89, - 0x65, 0x5b, 0xd9, 0x44, 0x65, 0x02, 0x4b, 0xbe, 0xd2, 0x3d, 0x7f, 0x6e, - 0x95, 0xd2, 0x17, 0xf8, 0x01, 0xe0, 0xda, 0x03, 0xec, 0x98, 0x88, 0x10, - 0x87, 0x87, 0xbd, 0xb3, 0x0d, 0x6b, 0x31, 0xee, 0xf4, 0x78, 0x92, 0xbf, - 0x52, 0x7b, 0x85, 0x30, 0xf3, 0xd9, 0x50, 0x68, 0x16, 0x14, 0x00, 0x02, - 0xc0, 0xa2, 0x18, 0xf7, 0x03, 0x18, 0xe2, 0xfa, 0x8d, 0x52, 0xfc, 0x1c, - 0x80, 0x84, 0xca, 0x6c, 0xe5, 0x40, 0xc1, 0xcd, 0x73, 0x30, 0x30, 0x46, - 0x6d, 0x77, 0x92, 0x24, 0x06, 0x67, 0xe9, 0x95, 0x78, 0xa0, 0x8f, 0x6c, - 0x30, 0x4f, 0x05, 0x50, 0xc3, 0x51, 0x12, 0xe0, 0x8e, 0x96, 0x55, 0x26, - 0xcc, 0x4a, 0xc7, 0xa5, 0xef, 0x06, 0xcf, 0x1c, 0xd9, 0xd4, 0xed, 0xde, - 0x9a, 0x0a, 0xf5, 0xfb, 0x87, 0xdd, 0x1b, 0x2e, 0xaa, 0xa8, 0xaa, 0x39, - 0x1b, 0x05, 0xb4, 0x12, 0xc6, 0xc9, 0x60, 0x36, 0x5e, 0x47, 0xf4, 0xa3, - 0x0e, 0x38, 0xdc, 0x2a, 0xb7, 0xe4, 0x33, 0x3c, 0x29, 0x47, 0x82, 0xa7, - 0x33, 0xd5, 0x23, 0x81, 0x19, 0xd8, 0xee, 0x59, 0x73, 0x05, 0x63, 0xcd, - 0x0d, 0xb4, 0x29, 0x59, 0xfa, 0x9f, 0x70, 0x67, 0x52, 0x49, 0x21, 0x95, - 0xed, 0x03, 0x69, 0x4f, 0x4c, 0xea, 0xc5, 0x73, 0xca, 0x91, 0xf9, 0x4b, - 0xac, 0x4d, 0x51, 0x68, 0x85, 0x29, 0x1f, 0x82, 0x9a, 0xca, 0xa2, 0x45, - 0xf1, 0x07, 0x5b, 0x42, 0x2b, 0x74, 0x80, 0xec, 0xd5, 0xe9, 0xec, 0xe7, - 0x88, 0xc4, 0x66, 0xda, 0x99, 0xe3, 0xd7, 0x99, 0xf5, 0x90, 0x4f, 0x42, - 0xcd, 0xe4, 0x86, 0x7d, 0x9f, 0x41, 0xda, 0x93, 0x7b, 0xa4, 0xfe, 0x7e, - 0x54, 0x0b, 0x5f, 0x7b, 0x0d, 0x1f, 0x17, 0x5f, 0x77, 0xac, 0x1a, 0xee, - 0xa9, 0x6e, 0xe2, 0xe3, 0x2e, 0x9b, 0xa2, 0x92, 0x7a, 0x67, 0x0f, 0xb7, - 0x0d, 0xff, 0x9a, 0x9f, 0x38, 0xb3, 0x95, 0x75, 0x19, 0xbd, 0xef, 0xef, - 0x1e, 0x3a, 0x48, 0xa9, 0x54, 0xfa, 0x59, 0x6c, 0x55, 0x8a, 0x7b, 0x4b, - 0xfe, 0xbd, 0xf8, 0x4a, 0x41, 0x88, 0x6a, 0xc9, 0x64, 0xdc, 0x39, 0x34, - 0x55, 0x73, 0x61, 0x09, 0xea, 0x07, 0x7a, 0x20, 0xe2, 0x0e, 0xa0, 0x11, - 0xf0, 0x9b, 0x6e, 0xa1, 0x76, 0x1d, 0x7e, 0x27, 0x7a, 0x43, 0xa6, 0x5b, - 0x6c, 0xd2, 0x6e, 0x89, 0x27, 0x4b, 0x97, 0x39, 0xbb, 0xf6, 0xea, 0x79, - 0xcb, 0x7b, 0xae, 0x9f, 0x2c, 0xb1, 0x3b, 0xe0, 0xd3, 0xba, 0xef, 0x38, - 0x92, 0x41, 0x0d, 0xcf, 0x57, 0xaa, 0xab, 0xcb, 0xa1, 0x2f, 0xc8, 0xb8, - 0xf0, 0x99, 0x6e, 0xa3, 0x76, 0x1d, 0x7e, 0x27, 0x7a, 0x43, 0xa6, 0x5b, - 0x6c, 0xd2, 0x6e, 0x89, 0x61, 0xfd, 0x76, 0xf1, 0x4f, 0xf7, 0xb6, 0xc2, - 0xa2, 0x44, 0x5b, 0xd4, 0xeb, 0x9c, 0x23, 0xbe, 0x92, 0x0a, 0xf7, 0x60, - 0xe1, 0xe7, 0x18, 0xad, 0x83, 0xae, 0x86, 0xc8, 0xf4, 0x45, 0xe3, 0xf3, - 0x15, 0x75, 0xbe, 0xaa, 0x6e, 0x95, 0xc7, 0xdf, 0xf8, 0x47, 0x48, 0xd1, - 0xe3, 0x7b, 0xc1, 0x0e, 0xf6, 0xfb, 0x1f, 0xf0, 0x4f, 0xf7, 0xb6, 0xc2, - 0xa2, 0x44, 0x5b, 0xd4, 0xeb, 0x9c, 0x23, 0xbe, 0x94, 0x7a, 0xbe, 0x4b, - 0xd4, 0x25, 0x5f, 0xb2, 0xe4, 0xc5, 0x9d, 0x5b, 0xea, 0x6a, 0xf9, 0x3d, - 0xbd, 0xbd, 0xa2, 0xe2, 0x58, 0xba, 0x58, 0xb5, 0xa5, 0xd6, 0x1f, 0xa7, - 0x86, 0x38, 0xc4, 0x00, 0xd5, 0xcf, 0x40, 0x1c, 0x7f, 0x1c, 0x2d, 0x61, - 0xe5, 0x06, 0xc4, 0x2c, 0x02, 0x55, 0xb1, 0x1f, 0x7f, 0xdc, 0x39, 0x34, - 0x52, 0x73, 0x61, 0x09, 0xea, 0x07, 0x7a, 0x22, 0xe2, 0x0c, 0xa0, 0x11, - 0xf0, 0x9b, 0x6e, 0xa1, 0x76, 0x1d, 0x7e, 0x27, 0x7a, 0x43, 0xa6, 0x5b, - 0x6c, 0xd2, 0x6e, 0x89, 0xbf, 0x5a, 0x67, 0x5e, 0xc0, 0xc6, 0x31, 0x9f, - 0x11, 0x9b, 0xcf, 0xf8, 0xfe, 0x7c, 0x5b, 0xbf, 0x3d, 0xf1, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x5c, 0xbb, 0x98, 0x0a, 0xd7, 0x94, 0xf9, 0x4c, - 0x5f, 0x61, 0x1e, 0x1b, 0x6b, 0x48, 0x30, 0xed, 0xb3, 0x52, 0x8f, 0x8f, - 0x6c, 0xc5, 0xd5, 0x04, 0x1a, 0xf0, 0x2a, 0xf4, 0xbf, 0xf6, 0xb3, 0x65, - 0x23, 0x40, 0x92, 0x0a, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x8b, 0xa8, 0xb9, 0xe9, 0xcb, 0x46, 0x52, 0x9d, 0x15, 0x1f, 0xe1, 0x2a, - 0x20, 0x49, 0x36, 0xd6, 0x5c, 0x47, 0x4e, 0x4d, 0x61, 0xdc, 0x94, 0xad, - 0x69, 0xc0, 0xcf, 0xed, 0x97, 0xec, 0x0e, 0x91, 0x36, 0x7a, 0x20, 0xf6, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x52, 0x60, 0x7c, 0x0a, 0xd6, 0x8c, 0x5c, 0xdc, 0x2e, 0x72, 0x3b, 0x16, - 0xdc, 0xe4, 0x01, 0x20, 0x31, 0x42, 0x86, 0x57, 0x7a, 0xb3, 0x94, 0xba, - 0xb0, 0x58, 0x18, 0xa1, 0x4a, 0x76, 0x8f, 0x28, 0x74, 0x1b, 0xd6, 0x9a, - 0xf0, 0x16, 0xc5, 0x83, 0x09, 0xf9, 0x7d, 0x7e, 0xb8, 0xb4, 0xfa, 0xcd, - 0x3d, 0x0a, 0x15, 0xf2, 0x7a, 0x4b, 0xbc, 0x4f, 0xcb, 0x43, 0x3d, 0x52, - 0x55, 0xd4, 0x9c, 0xe5, 0x5a, 0x42, 0xe9, 0x44, 0x6b, 0x4a, 0xd5, 0x36, - 0xd7, 0x9e, 0xe5, 0x16, 0x5e, 0x3d, 0x3e, 0x81, 0x6e, 0x56, 0xa5, 0x86, - 0x16, 0x6a, 0xd1, 0xc8, 0xfc, 0xcb, 0x5c, 0x92, 0x0f, 0x97, 0x9e, 0xc7, - 0x84, 0x8e, 0x7f, 0xc6, 0x5d, 0x97, 0xa2, 0xb6, 0xc8, 0xc0, 0x37, 0x43, - 0x19, 0xa2, 0x40, 0x00, 0xf0, 0xf2, 0xda, 0x9b, 0xe8, 0x98, 0xee, 0xd4, - 0xcc, 0xfa, 0xc5, 0xf2, 0x63, 0x38, 0x24, 0x2e, 0x1a, 0xf0, 0x2a, 0xcb, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x45, 0x85, 0xdc, 0xeb, 0x3e, 0xa5, 0x41, 0x97, 0x05, 0x97, 0xe0, 0xed, - 0xd9, 0xe6, 0xe2, 0xf6, 0xea, 0x03, 0x1d, 0x3b, 0xdc, 0xc6, 0xb9, 0x1a, - 0x37, 0xdd, 0xb4, 0xe4, 0x67, 0xd7, 0x63, 0x6e, 0x9d, 0x84, 0xb0, 0xee, - 0x24, 0x4c, 0xec, 0xb1, 0x41, 0x68, 0xb8, 0x39, 0xa9, 0xf4, 0x80, 0xa7, - 0x6e, 0xaa, 0xbc, 0x97, 0xf2, 0xf5, 0xa2, 0x57, 0x60, 0x84, 0xb7, 0x4b, - 0xd7, 0xbb, 0x73, 0xde, 0x61, 0xae, 0x5d, 0xdd, 0x02, 0x25, 0xab, 0xab, - 0x25, 0xb8, 0x32, 0x25, 0x39, 0x1a, 0xf0, 0x27, 0x95, 0x6c, 0xb1, 0xb1, - 0xf9, 0x09, 0xaa, 0x0d, 0x0d, 0xf7, 0x8e, 0x96, 0xe0, 0x15, 0x3c, 0xc4, - 0x00, 0x40, 0x08, 0x00, 0x04, 0x01, 0x00, 0x5f, 0x72, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x5f, 0x32, 0x30, 0x32, 0x30, 0x30, 0x38, 0x31, - 0x34, 0x31, 0x36, 0x33, 0x36, 0x34, 0x39, 0x00, 0xfc, 0x3f, 0x06, 0x00, - 0x00, 0xc4, 0x09, 0x02, 0x04, 0x01, 0x00, 0x5f, 0x72, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x5f, 0x32, 0x30, 0x32, 0x30, 0x30, 0x38, 0x31, - 0x34, 0x31, 0x36, 0x33, 0x36, 0x34, 0x39, 0x00, 0xbc, 0xbc, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_rom_patch.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_rom_patch.h deleted file mode 100644 index becc846ed3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7615_rom_patch.h +++ /dev/null @@ -1,931 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR mt7615_rom_patch[] = { - 0x32, 0x30, 0x31, 0x38, 0x30, 0x35, 0x31, 0x38, 0x31, 0x30, 0x30, 0x36, - 0x30, 0x34, 0x61, 0x0a, 0x41, 0x4c, 0x50, 0x53, 0x8a, 0x10, 0x8a, 0x10, - 0x00, 0x00, 0x00, 0x10, 0x4b, 0x61, 0xff, 0xe1, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x68, 0x2d, 0x00, 0x00, 0x60, 0xd2, 0x01, 0x00, 0x0c, 0xca, - 0x01, 0x00, 0xd8, 0xcd, 0x01, 0x00, 0x90, 0xca, 0x01, 0x00, 0x8c, 0xc7, - 0x01, 0x00, 0xc8, 0x99, 0x00, 0x00, 0x80, 0x2d, 0x00, 0x00, 0x1c, 0x23, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xc8, 0xdf, 0x01, 0x00, 0xe8, 0xde, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0f, 0x08, 0x00, 0x8c, 0xd2, - 0x01, 0x00, 0x58, 0x0d, 0x08, 0x00, 0x7c, 0x0c, 0x08, 0x00, 0x44, 0x09, - 0x08, 0x00, 0xd8, 0x06, 0x08, 0x00, 0x8c, 0x10, 0x08, 0x00, 0x7c, 0x0f, - 0x08, 0x00, 0x70, 0x10, 0x08, 0x00, 0xf0, 0x10, 0x08, 0x00, 0x76, 0x11, - 0x08, 0x00, 0xfc, 0x11, 0x08, 0x00, 0x82, 0x12, 0x08, 0x00, 0x08, 0x13, - 0x08, 0x00, 0x8e, 0x13, 0x08, 0x00, 0x14, 0x14, 0x08, 0x00, 0xc8, 0x05, - 0x08, 0x00, 0x40, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x0f, - 0xe4, 0x00, 0x46, 0x10, 0x00, 0x82, 0x58, 0x10, 0x8b, 0x30, 0x3e, 0x2f, - 0xe4, 0x10, 0xd5, 0x03, 0xa2, 0xc9, 0xaa, 0xc1, 0xe2, 0x02, 0xe9, 0xfd, - 0xdd, 0x9e, 0x3e, 0x0f, 0xe4, 0x10, 0x3e, 0x2f, 0xe5, 0x28, 0x84, 0x20, - 0xd5, 0x02, 0xaa, 0x41, 0xe2, 0x02, 0xe9, 0xfe, 0xdd, 0x9e, 0xef, 0xf8, - 0x46, 0x18, 0x00, 0xa0, 0x96, 0x03, 0xa8, 0x09, 0x46, 0x08, 0x00, 0xa0, - 0xa0, 0x42, 0xf1, 0x81, 0xf1, 0x01, 0x54, 0x10, 0x80, 0x02, 0xc9, 0xfb, - 0xec, 0x08, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x80, 0xe0, 0x90, 0x10, 0x49, 0xff, 0xff, 0xeb, 0x96, 0x3b, 0x49, 0xff, - 0xff, 0xe8, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xfc, 0x84, 0xc0, 0x81, 0x00, 0x50, 0x90, 0xff, 0xfe, - 0xd5, 0x0e, 0x38, 0x04, 0x18, 0x00, 0x84, 0x2a, 0x4c, 0x00, 0xc0, 0x05, - 0x84, 0x0d, 0x49, 0xff, 0xff, 0xe4, 0x38, 0x04, 0x18, 0x00, 0x9d, 0xb1, - 0x49, 0xff, 0xff, 0xdf, 0xe2, 0xc9, 0xe9, 0xf2, 0xec, 0x04, 0x3a, 0x6f, - 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0xef, 0xf8, 0x46, 0x18, 0x00, 0x00, - 0x04, 0x20, 0x80, 0x42, 0x46, 0x08, 0x00, 0xa0, 0x58, 0x21, 0x00, 0x80, - 0x14, 0x20, 0x80, 0x42, 0xa0, 0x83, 0x44, 0x3f, 0xff, 0xcf, 0xf2, 0x81, - 0x80, 0x20, 0xf2, 0x01, 0x40, 0x21, 0x0c, 0x02, 0xf2, 0x81, 0xf2, 0x01, - 0xa8, 0x83, 0x44, 0x00, 0x00, 0xad, 0xa8, 0x0c, 0xec, 0x08, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x98, 0x3c, 0x84, 0x60, 0x40, 0x40, 0x88, 0x09, - 0x80, 0x40, 0xd5, 0x06, 0xb4, 0xa2, 0x84, 0xdf, 0xde, 0x05, 0x9c, 0xd9, - 0x9c, 0x94, 0xe2, 0x64, 0xe9, 0xfa, 0x9a, 0x10, 0x90, 0x02, 0x9a, 0x08, - 0x3a, 0x6f, 0x98, 0x04, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xe4, - 0x3e, 0x6f, 0x43, 0xc0, 0xb4, 0x26, 0xf0, 0x85, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x04, 0xa0, 0xdd, 0x21, 0xb4, 0x26, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x04, 0xd8, 0xdd, 0x21, 0xb4, 0x26, 0x3e, 0xaf, 0xec, 0x00, - 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x05, 0x00, 0xdd, 0x21, 0x80, 0x0a, - 0xa3, 0xc1, 0x44, 0x10, 0x08, 0x00, 0x05, 0xc3, 0x00, 0x00, 0x49, 0xff, - 0xff, 0xcc, 0x80, 0x80, 0x46, 0x0d, 0xea, 0xdb, 0x58, 0x00, 0x0e, 0xef, - 0x40, 0x53, 0x80, 0x03, 0x44, 0x80, 0x00, 0x4f, 0x44, 0x70, 0x00, 0x58, - 0x40, 0x14, 0x14, 0x1a, 0x40, 0x13, 0x94, 0x1b, 0x80, 0x4a, 0x80, 0xa1, - 0x44, 0x30, 0x08, 0x00, 0x3e, 0x1f, 0xf4, 0x00, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x05, 0x30, 0xdd, 0x3c, 0xb4, 0x26, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x04, 0xa0, 0xdd, 0x21, 0xb4, 0x26, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x05, 0x4c, 0xdd, 0x21, 0xb4, 0x26, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x05, 0x70, 0xdd, 0x21, 0xf2, 0x05, 0x3e, 0x6f, 0x4b, 0x68, - 0x50, 0x11, 0x00, 0x08, 0xf2, 0x84, 0x50, 0xa1, 0x00, 0x10, 0x83, 0x81, - 0xa1, 0xf4, 0x85, 0x00, 0xc7, 0x46, 0xb4, 0x07, 0xb4, 0x20, 0x46, 0xf0, - 0x00, 0x82, 0x04, 0x37, 0x81, 0x69, 0x4c, 0x11, 0xc0, 0x0b, 0x46, 0xf0, - 0x00, 0x82, 0x04, 0x17, 0x81, 0x6b, 0xa0, 0x81, 0x40, 0x11, 0x04, 0x03, - 0x5c, 0x80, 0x80, 0x01, 0xa0, 0x7b, 0x8c, 0x08, 0x49, 0xff, 0xff, 0x7f, - 0xf1, 0x05, 0x45, 0xe0, 0x00, 0x58, 0x44, 0x30, 0x00, 0x4f, 0x81, 0x20, - 0x41, 0xe1, 0xa0, 0x1b, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x05, 0xb4, - 0xc1, 0x0d, 0xa0, 0xf1, 0xf2, 0x04, 0xb6, 0x62, 0xa0, 0x79, 0xa8, 0x51, - 0xb4, 0x47, 0xb6, 0x5c, 0xa0, 0xfb, 0xbb, 0x81, 0x14, 0x85, 0x00, 0x01, - 0xb7, 0x2a, 0xb4, 0x66, 0x04, 0x83, 0x80, 0x03, 0xa1, 0x79, 0xb4, 0xe7, - 0x20, 0x41, 0x80, 0x03, 0x20, 0x11, 0x80, 0x00, 0x20, 0x21, 0x80, 0x01, - 0x20, 0x31, 0x80, 0x02, 0x14, 0x8f, 0x80, 0x01, 0xb6, 0xff, 0x14, 0x9f, - 0x80, 0x02, 0x15, 0xef, 0x80, 0x03, 0x3c, 0x7d, 0xd0, 0xf0, 0xdd, 0x27, - 0xf0, 0x04, 0x50, 0x63, 0x00, 0x20, 0x8c, 0x18, 0x3e, 0x1f, 0x4b, 0xe8, - 0xf0, 0x84, 0x51, 0xce, 0x00, 0x18, 0x8d, 0x58, 0x4c, 0x60, 0xff, 0xae, - 0x3c, 0x1d, 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x05, 0xd8, - 0xdd, 0x21, 0xec, 0x1c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x2e, 0x07, - 0x46, 0x67, 0xc0, 0x09, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x10, 0x00, 0x19, - 0x58, 0x10, 0x84, 0x00, 0x14, 0x10, 0x00, 0x19, 0xdd, 0x9e, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0xea, 0x00, 0x3e, 0x6f, 0xe4, 0x88, - 0xb4, 0x06, 0xdd, 0x20, 0xd5, 0xfe, 0x84, 0xa1, 0xd0, 0x05, 0x84, 0x22, - 0x4c, 0x00, 0xc0, 0x0a, 0xd5, 0x05, 0xb4, 0x21, 0x3c, 0x1f, 0xdf, 0x1f, - 0xd5, 0x04, 0x3c, 0x0d, 0xd0, 0xc8, 0xb6, 0x02, 0xdd, 0x9e, 0x92, 0x00, - 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, - 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, - 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0xd5, 0xf0, 0x92, 0x00, 0x3a, 0x6f, - 0x98, 0xbc, 0x3e, 0x6f, 0x43, 0xc0, 0xb4, 0x26, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x06, 0x10, 0xdd, 0x21, 0x3e, 0x0f, 0xe4, 0x00, 0xb4, 0x00, - 0xc0, 0x06, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0xd5, 0xfc, - 0xb4, 0x26, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x06, 0x28, 0xdd, 0x21, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x3c, 0x2d, 0xd0, 0xf0, 0x46, 0x10, 0x00, 0x82, 0x58, 0x10, 0x86, 0x94, - 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x06, 0x40, 0xdd, 0x22, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x54, 0x82, 0x00, 0xff, 0x97, 0xe8, 0x02, 0x4f, 0x80, 0x14, 0x96, 0x48, - 0x97, 0x80, 0xf1, 0x81, 0x81, 0x23, 0x80, 0x23, 0x81, 0x42, 0x80, 0x06, - 0x80, 0x48, 0x80, 0x67, 0xb6, 0x9f, 0x03, 0xcf, 0x80, 0x16, 0x49, 0xfc, - 0xe6, 0xb2, 0xb4, 0x9f, 0xc0, 0x28, 0x44, 0x00, 0x0f, 0xff, 0x4c, 0x40, - 0x00, 0x04, 0x4d, 0xc0, 0x40, 0x0c, 0x46, 0x18, 0x20, 0x6c, 0x04, 0x20, - 0x80, 0x1a, 0x84, 0x00, 0x42, 0x21, 0x7c, 0x08, 0x14, 0x20, 0x80, 0x1a, - 0xd5, 0x19, 0x50, 0x05, 0x7f, 0xfc, 0xe6, 0x02, 0xe8, 0x14, 0x80, 0x24, - 0x80, 0x5c, 0x80, 0x06, 0x49, 0xfc, 0xe5, 0x6d, 0xf1, 0x01, 0x80, 0x06, - 0x80, 0x4a, 0x80, 0x69, 0x80, 0x88, 0x80, 0xa7, 0x49, 0xfc, 0xe5, 0x3b, - 0x92, 0x00, 0x56, 0x00, 0x00, 0x01, 0x5c, 0x00, 0x00, 0x01, 0xd5, 0x02, - 0x84, 0x00, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xf4, 0x96, 0x48, 0x97, 0x80, 0x54, 0x82, 0x00, 0xff, - 0x97, 0xe8, 0x81, 0x23, 0x81, 0x42, 0xf1, 0x81, 0x80, 0x06, 0x80, 0x23, - 0x80, 0x48, 0x80, 0x67, 0x03, 0xcf, 0x80, 0x14, 0x49, 0xfc, 0xe6, 0x71, - 0xc0, 0x24, 0x44, 0x00, 0x0f, 0xff, 0x4d, 0xc0, 0x40, 0x0c, 0x46, 0x18, - 0x20, 0x6c, 0x04, 0x20, 0x80, 0x1a, 0x84, 0x00, 0x42, 0x21, 0x78, 0x08, - 0x14, 0x20, 0x80, 0x1a, 0xd5, 0x17, 0xe7, 0x42, 0xe8, 0x14, 0x80, 0x3c, - 0x80, 0x06, 0x44, 0x20, 0x0f, 0xff, 0x49, 0xfc, 0xe5, 0x30, 0xf1, 0x01, - 0x80, 0x06, 0x80, 0x4a, 0x80, 0x69, 0x80, 0x88, 0x80, 0xa7, 0x49, 0xfc, - 0xe4, 0xfe, 0x56, 0x00, 0x00, 0x01, 0x5c, 0x00, 0x00, 0x01, 0xd5, 0x02, - 0x84, 0x00, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x3c, 0x2d, 0xd0, 0xf0, 0x80, 0xc0, 0x46, 0x10, 0x00, 0x82, - 0x58, 0x10, 0x86, 0x80, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x06, 0x40, - 0xdd, 0x22, 0x84, 0xa2, 0xd6, 0x1d, 0xe6, 0xc3, 0xe8, 0x05, 0xc6, 0x0c, - 0x84, 0xa1, 0xde, 0x27, 0xd5, 0x0c, 0x84, 0x04, 0x4c, 0x60, 0x00, 0x19, - 0xe2, 0xc0, 0xe9, 0x1a, 0x84, 0xa5, 0xde, 0x1f, 0xd5, 0x1c, 0x49, 0xff, - 0xff, 0x34, 0xd5, 0x1b, 0x84, 0x00, 0x80, 0x20, 0x46, 0x20, 0x00, 0x82, - 0x58, 0x21, 0x06, 0x48, 0x44, 0x30, 0x08, 0x92, 0x49, 0xfc, 0x13, 0x11, - 0xd5, 0x10, 0x84, 0x00, 0x64, 0x06, 0x18, 0x03, 0xd5, 0x0c, 0x44, 0x05, - 0x00, 0x00, 0x49, 0xfc, 0x03, 0xee, 0x44, 0x00, 0x12, 0x34, 0xb4, 0x20, - 0xb6, 0x20, 0xd5, 0x03, 0x49, 0xff, 0xff, 0x35, 0x3a, 0x6f, 0x98, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x44, 0x50, 0x00, 0xff, - 0xd8, 0x05, 0x80, 0x01, 0x49, 0xff, 0xff, 0xbb, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x3c, 0x3c, 0x00, 0x17, 0x96, 0x00, 0xb6, 0x1f, 0x80, 0xc2, 0x80, 0xe1, - 0xe2, 0x03, 0xe9, 0x04, 0x84, 0x01, 0x48, 0x00, 0x01, 0x25, 0xc9, 0x0a, - 0x80, 0x01, 0x46, 0x20, 0x00, 0x82, 0x58, 0x21, 0x06, 0x48, 0x44, 0x30, - 0x07, 0xd2, 0x49, 0xfc, 0x12, 0xd8, 0xce, 0x0b, 0x80, 0x06, 0x80, 0x26, - 0x46, 0x20, 0x00, 0x82, 0x58, 0x21, 0x06, 0x48, 0x44, 0x30, 0x07, 0xd3, - 0x49, 0xfc, 0x12, 0xcd, 0xa7, 0x3c, 0xa6, 0xb2, 0xa6, 0x70, 0x46, 0x00, - 0x38, 0x00, 0x40, 0x21, 0x74, 0x08, 0x54, 0x42, 0x00, 0x1f, 0x40, 0x10, - 0xdc, 0x08, 0x40, 0x10, 0x80, 0x02, 0xa6, 0xf1, 0x40, 0x42, 0x08, 0x04, - 0x00, 0x83, 0x80, 0x06, 0x40, 0x42, 0x04, 0x04, 0x46, 0x11, 0xc0, 0x00, - 0xa6, 0xbf, 0xb4, 0xbf, 0x40, 0x31, 0xe8, 0x08, 0x40, 0x31, 0x84, 0x02, - 0x40, 0x84, 0x14, 0x08, 0x40, 0x12, 0xa0, 0x08, 0x40, 0x42, 0x0c, 0x04, - 0x00, 0x53, 0x80, 0x0d, 0x54, 0x84, 0x00, 0xff, 0x40, 0x21, 0x30, 0x08, - 0x40, 0x42, 0x20, 0x04, 0x54, 0x21, 0x30, 0x00, 0x46, 0x08, 0x20, 0xe0, - 0x40, 0x42, 0x08, 0x04, 0x58, 0x00, 0x00, 0x14, 0x44, 0x27, 0x00, 0x00, - 0x40, 0x52, 0xc0, 0x08, 0x40, 0x52, 0x88, 0x02, 0x98, 0xc8, 0xb4, 0x63, - 0x40, 0x42, 0x14, 0x04, 0x46, 0x88, 0x20, 0xe0, 0x46, 0x50, 0x07, 0x8c, - 0x00, 0x23, 0x80, 0x09, 0x40, 0x31, 0x94, 0x02, 0x89, 0x01, 0x40, 0x42, - 0x0c, 0x04, 0x14, 0x8f, 0x80, 0x01, 0xc2, 0x03, 0x58, 0x42, 0x01, 0x00, - 0x00, 0x23, 0x80, 0x0a, 0xc2, 0x03, 0x58, 0x42, 0x02, 0x00, 0x00, 0x23, - 0x80, 0x0b, 0xc2, 0x03, 0x58, 0x42, 0x04, 0x00, 0x00, 0x23, 0x80, 0x0c, - 0xc2, 0x03, 0x58, 0x42, 0x08, 0x00, 0x03, 0xe3, 0x00, 0x04, 0x02, 0x93, - 0x00, 0x05, 0xa4, 0x73, 0xa4, 0xf7, 0x02, 0x83, 0x00, 0x08, 0x03, 0xc3, - 0x00, 0x02, 0xa5, 0x76, 0x02, 0x03, 0x00, 0x09, 0x40, 0xaf, 0x20, 0x09, - 0x40, 0x60, 0xb0, 0x08, 0x40, 0x94, 0x90, 0x08, 0x40, 0x21, 0x90, 0x09, - 0x40, 0x94, 0x80, 0x13, 0x54, 0xa5, 0x00, 0x0f, 0x40, 0x84, 0x20, 0x08, - 0x40, 0xa5, 0x24, 0x04, 0x40, 0x84, 0x30, 0x08, 0x93, 0x14, 0x40, 0x84, - 0x20, 0x08, 0x54, 0x91, 0x00, 0xff, 0x40, 0x31, 0xf0, 0x08, 0x40, 0x15, - 0x0c, 0x04, 0x40, 0x24, 0xa0, 0x04, 0x46, 0x30, 0x0f, 0xff, 0x46, 0x80, - 0xff, 0xf0, 0x40, 0x52, 0xc0, 0x08, 0x40, 0x63, 0x0c, 0x02, 0x40, 0x32, - 0xa0, 0x02, 0x41, 0xef, 0x60, 0x08, 0x40, 0x30, 0x8c, 0x04, 0x55, 0xce, - 0x0f, 0xff, 0xb4, 0x3f, 0x41, 0xcf, 0x70, 0x04, 0x40, 0x00, 0x50, 0x08, - 0x47, 0xe8, 0x20, 0xf9, 0x81, 0x1e, 0x81, 0x48, 0x80, 0xa8, 0x81, 0x25, - 0x40, 0x6e, 0x18, 0x04, 0x40, 0x21, 0x00, 0x04, 0x58, 0x00, 0xa0, 0x00, - 0x14, 0x4f, 0x00, 0x08, 0x14, 0x64, 0x00, 0x09, 0x14, 0x35, 0x00, 0x0a, - 0x14, 0x22, 0x80, 0x0b, 0x14, 0x04, 0x82, 0x0c, 0x84, 0xc0, 0x9d, 0xb1, - 0x44, 0x21, 0x00, 0x00, 0x84, 0x01, 0x04, 0xa4, 0x82, 0x0c, 0x4c, 0x61, - 0x00, 0x06, 0x49, 0xfd, 0x0e, 0x88, 0x4e, 0xa5, 0xff, 0xf6, 0x46, 0x28, - 0x20, 0xf9, 0x58, 0x21, 0x08, 0x20, 0xb4, 0x62, 0xf5, 0x01, 0x42, 0x31, - 0xf0, 0x08, 0xb6, 0x62, 0x50, 0x02, 0x80, 0x0c, 0x50, 0x12, 0x80, 0x6c, - 0x00, 0x53, 0x80, 0x08, 0x46, 0x60, 0x01, 0xf0, 0x00, 0x33, 0x80, 0x0e, - 0x40, 0x52, 0xc0, 0x08, 0x40, 0x52, 0x98, 0x02, 0x46, 0x60, 0x70, 0x00, - 0x00, 0x83, 0x80, 0x00, 0xa7, 0x39, 0x40, 0x31, 0xe0, 0x08, 0x40, 0x31, - 0x98, 0x02, 0xa7, 0xba, 0x40, 0x32, 0x8c, 0x04, 0x54, 0x84, 0x00, 0x07, - 0xa7, 0x7b, 0x95, 0x23, 0x40, 0x31, 0xa0, 0x04, 0x54, 0x42, 0x00, 0x38, - 0x95, 0xb6, 0x40, 0x31, 0x90, 0x04, 0x54, 0x63, 0x01, 0xc0, 0xb4, 0x80, - 0x40, 0x52, 0xa4, 0x08, 0x46, 0x8f, 0x8e, 0x0f, 0x40, 0x31, 0x98, 0x04, - 0x54, 0x52, 0x8e, 0x00, 0x40, 0x31, 0x94, 0x04, 0x40, 0x42, 0x20, 0x02, - 0x40, 0x31, 0x90, 0x04, 0xb6, 0x60, 0x44, 0x5f, 0xff, 0x9f, 0xa6, 0xfd, - 0xb4, 0x81, 0x94, 0xdd, 0x40, 0x42, 0x14, 0x02, 0x54, 0x31, 0x80, 0x60, - 0x40, 0x32, 0x0c, 0x04, 0xb6, 0x61, 0xb4, 0x22, 0x42, 0x10, 0xf0, 0x09, - 0xb6, 0x22, 0x84, 0x00, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xdc, 0x3c, 0x3c, 0x00, 0x17, - 0x96, 0x00, 0xf0, 0x83, 0x80, 0xc2, 0x80, 0xe1, 0xe2, 0x03, 0xe9, 0x04, - 0x84, 0x01, 0x48, 0x00, 0x01, 0x8c, 0xc9, 0x0a, 0x80, 0x01, 0x46, 0x20, - 0x00, 0x82, 0x58, 0x21, 0x06, 0x48, 0x44, 0x30, 0x06, 0x7a, 0x49, 0xfc, - 0x11, 0xa2, 0xa6, 0xbd, 0xa7, 0x3c, 0x40, 0x21, 0x20, 0x08, 0xf0, 0x03, - 0x40, 0x21, 0x10, 0x04, 0x00, 0x13, 0x80, 0x22, 0x46, 0x48, 0x20, 0xe0, - 0x40, 0x30, 0x20, 0x08, 0x40, 0xa1, 0x90, 0x00, 0xc1, 0x03, 0x42, 0x21, - 0x7c, 0x08, 0xc6, 0x3e, 0x00, 0x43, 0x00, 0x09, 0x47, 0xe0, 0x03, 0xf0, - 0x40, 0x42, 0x40, 0x08, 0xa6, 0x75, 0x40, 0x42, 0x78, 0x02, 0x40, 0x21, - 0x10, 0x04, 0xc1, 0x03, 0x42, 0x21, 0x58, 0x08, 0x00, 0x13, 0x00, 0x08, - 0x46, 0x30, 0x18, 0x00, 0x40, 0x10, 0xdc, 0x08, 0xa7, 0x34, 0x40, 0x10, - 0x8c, 0x02, 0x40, 0x21, 0x04, 0x04, 0xc4, 0x03, 0x42, 0x21, 0x64, 0x08, - 0xa7, 0x33, 0xc4, 0x03, 0x42, 0x21, 0x68, 0x08, 0xa7, 0x32, 0xc4, 0x03, - 0x42, 0x21, 0x6c, 0x08, 0xa7, 0x31, 0xc4, 0x03, 0x42, 0x21, 0x70, 0x08, - 0xa7, 0x36, 0xc4, 0x03, 0x42, 0x21, 0x74, 0x08, 0xa7, 0x30, 0xc4, 0x03, - 0x42, 0x21, 0x78, 0x08, 0x00, 0x43, 0x00, 0x0a, 0xa6, 0x77, 0x84, 0xa4, - 0x95, 0xa4, 0x97, 0xb0, 0x40, 0x40, 0x84, 0x1a, 0x40, 0x42, 0x84, 0x1b, - 0x40, 0x62, 0x18, 0x04, 0xd5, 0x0a, 0x80, 0x6a, 0xa2, 0x5a, 0x46, 0x47, - 0xff, 0xf0, 0x40, 0x10, 0x90, 0x02, 0xb4, 0x63, 0x40, 0x21, 0x04, 0x04, - 0x00, 0x93, 0x80, 0x00, 0xa7, 0x3e, 0x14, 0x9f, 0x80, 0x07, 0x01, 0xe3, - 0x80, 0x01, 0x15, 0xef, 0x80, 0x06, 0xa6, 0x3a, 0xf0, 0x85, 0xa6, 0x7b, - 0xf1, 0x84, 0xc4, 0x03, 0x58, 0x63, 0x00, 0x01, 0xa7, 0x3f, 0xc4, 0x03, - 0x58, 0x63, 0x00, 0x02, 0x00, 0x43, 0x80, 0x08, 0xc4, 0x03, 0x58, 0x63, - 0x00, 0x08, 0x02, 0x93, 0x80, 0x05, 0x00, 0x83, 0x80, 0x09, 0x46, 0x30, - 0x1f, 0xf0, 0x40, 0x94, 0xc0, 0x08, 0x40, 0x94, 0x8c, 0x02, 0x40, 0x84, - 0x20, 0x08, 0x00, 0x43, 0x80, 0x0c, 0x40, 0x84, 0xa0, 0x04, 0x40, 0x64, - 0x18, 0x04, 0xc4, 0x03, 0x42, 0x63, 0x64, 0x08, 0x00, 0x43, 0x80, 0x0d, - 0xc4, 0x03, 0x42, 0x63, 0x68, 0x08, 0x00, 0x43, 0x80, 0x24, 0xc4, 0x03, - 0x42, 0x63, 0x6c, 0x08, 0x00, 0x43, 0x80, 0x25, 0xc4, 0x03, 0x42, 0x63, - 0x70, 0x08, 0x00, 0x43, 0x80, 0x0e, 0xc4, 0x03, 0x42, 0x63, 0x74, 0x08, - 0x00, 0x43, 0x80, 0x0f, 0xc4, 0x03, 0x42, 0x63, 0x78, 0x08, 0x00, 0x43, - 0x80, 0x10, 0xc4, 0x03, 0x42, 0x63, 0x7c, 0x08, 0x50, 0x55, 0x00, 0x0c, - 0xb5, 0x05, 0x46, 0x96, 0x71, 0xf0, 0x00, 0x43, 0x80, 0x11, 0x58, 0x94, - 0x8f, 0xff, 0x40, 0x84, 0x24, 0x02, 0xc4, 0x03, 0x58, 0x84, 0x10, 0x00, - 0x00, 0x43, 0x80, 0x12, 0xc4, 0x03, 0x58, 0x84, 0x20, 0x00, 0x00, 0x43, - 0x80, 0x13, 0xc4, 0x03, 0x58, 0x84, 0x40, 0x00, 0x00, 0x43, 0x80, 0x14, - 0xc4, 0x03, 0x42, 0x84, 0x3c, 0x08, 0x00, 0x43, 0x80, 0x15, 0xc4, 0x03, - 0x42, 0x84, 0x54, 0x08, 0x00, 0x43, 0x80, 0x16, 0xc4, 0x03, 0x42, 0x84, - 0x58, 0x08, 0x00, 0x43, 0x80, 0x17, 0xc4, 0x03, 0x42, 0x84, 0x5c, 0x08, - 0x00, 0x43, 0x80, 0x18, 0xc4, 0x03, 0x42, 0x84, 0x6c, 0x08, 0x00, 0x43, - 0x80, 0x19, 0xc4, 0x03, 0x42, 0x84, 0x70, 0x08, 0x00, 0x43, 0x80, 0x1a, - 0xc4, 0x03, 0x42, 0x84, 0x7c, 0x08, 0x50, 0x05, 0x00, 0x6c, 0xb4, 0x80, - 0x00, 0x33, 0x80, 0x20, 0x42, 0x12, 0x78, 0x09, 0x42, 0x10, 0xfc, 0x09, - 0xc3, 0x03, 0x42, 0x10, 0xf8, 0x08, 0x00, 0x43, 0x80, 0x21, 0xc4, 0x03, - 0x42, 0x10, 0xfc, 0x08, 0x46, 0x98, 0x20, 0xf9, 0x58, 0x94, 0x88, 0x20, - 0xb4, 0x69, 0x47, 0xc8, 0x20, 0xf9, 0x42, 0x41, 0xf0, 0x08, 0xb6, 0x89, - 0xb4, 0x7c, 0x50, 0x45, 0x00, 0x08, 0xf4, 0x81, 0x42, 0x41, 0xfc, 0x08, - 0xb6, 0x9c, 0xf3, 0x01, 0xb6, 0xc3, 0xb7, 0x05, 0xb6, 0x20, 0xb4, 0xdc, - 0x42, 0x63, 0x7c, 0x09, 0xb6, 0xdc, 0x50, 0x45, 0x00, 0x14, 0xb4, 0xc9, - 0x46, 0x1f, 0xf8, 0x73, 0x42, 0x63, 0x70, 0x09, 0xb6, 0xc9, 0x58, 0x10, - 0x8f, 0xff, 0xb4, 0xc4, 0x00, 0x43, 0x80, 0x1b, 0x40, 0x63, 0x04, 0x02, - 0xc4, 0x03, 0x58, 0x63, 0x40, 0x00, 0x00, 0x43, 0x80, 0x26, 0xc4, 0x03, - 0x42, 0x63, 0x3c, 0x08, 0x00, 0x43, 0x80, 0x1c, 0xc4, 0x03, 0x42, 0x63, - 0x4c, 0x08, 0x00, 0x43, 0x80, 0x1d, 0xc4, 0x03, 0x42, 0x63, 0x50, 0x08, - 0x00, 0x43, 0x80, 0x1e, 0xc4, 0x03, 0x42, 0x63, 0x54, 0x08, 0x00, 0x43, - 0x80, 0x1f, 0xc4, 0x03, 0x42, 0x63, 0x58, 0x08, 0x50, 0x45, 0x00, 0x18, - 0xb4, 0x84, 0xf3, 0x05, 0xf1, 0x06, 0xf4, 0x85, 0x40, 0x50, 0xa0, 0x08, - 0x40, 0x11, 0xc0, 0x08, 0x50, 0x35, 0x00, 0x1c, 0x05, 0xef, 0x80, 0x04, - 0xb4, 0x63, 0x04, 0x9f, 0x80, 0x07, 0x40, 0x52, 0x84, 0x04, 0xf3, 0x84, - 0x50, 0x15, 0x00, 0x20, 0x40, 0x4f, 0x60, 0x08, 0x40, 0x52, 0xa4, 0x04, - 0x47, 0xc8, 0x20, 0xf9, 0x81, 0x5c, 0x46, 0x98, 0x20, 0xf9, 0x40, 0x52, - 0x90, 0x04, 0x05, 0xe0, 0x80, 0x00, 0xf4, 0x03, 0xba, 0x84, 0x14, 0x55, - 0x00, 0x05, 0x14, 0x64, 0x80, 0x08, 0x46, 0x78, 0x20, 0xf9, 0x04, 0x9f, - 0x80, 0x05, 0x14, 0x93, 0x80, 0x09, 0x46, 0x38, 0x20, 0xf9, 0xf2, 0x04, - 0x46, 0x18, 0x20, 0xf9, 0x81, 0x01, 0x58, 0x02, 0x28, 0x00, 0x14, 0x21, - 0x80, 0x0a, 0x15, 0xe0, 0x80, 0x0b, 0x14, 0x04, 0x02, 0x0c, 0x84, 0xc0, - 0x9d, 0xb1, 0x44, 0x31, 0x00, 0x00, 0x84, 0x01, 0x04, 0x94, 0x02, 0x0c, - 0x4c, 0x61, 0x80, 0x06, 0x49, 0xfd, 0x0c, 0x9b, 0x4e, 0x95, 0xff, 0xf6, - 0x84, 0x00, 0xec, 0x24, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xfc, 0x46, 0x18, 0x20, 0xf9, 0x04, 0x30, 0x82, 0x08, - 0x80, 0x41, 0x42, 0x31, 0xf0, 0x08, 0x14, 0x30, 0x82, 0x08, 0xb4, 0x22, - 0x54, 0xa0, 0x00, 0xff, 0x42, 0x00, 0xfc, 0x08, 0xb6, 0x02, 0x46, 0x98, - 0x20, 0xf9, 0x05, 0xc1, 0x00, 0x00, 0x81, 0x09, 0x80, 0xe8, 0x80, 0xc7, - 0x80, 0xa6, 0x80, 0x85, 0x46, 0x38, 0x20, 0xf9, 0x84, 0x20, 0x58, 0x31, - 0x88, 0x30, 0x43, 0xce, 0x78, 0x08, 0x58, 0x05, 0x28, 0x00, 0x15, 0xc1, - 0x00, 0x00, 0x14, 0x14, 0x80, 0x04, 0x14, 0x14, 0x00, 0x05, 0x14, 0x13, - 0x80, 0x08, 0x14, 0x13, 0x00, 0x09, 0x14, 0x12, 0x80, 0x0a, 0x14, 0x12, - 0x00, 0x0b, 0xb6, 0x03, 0x80, 0xc1, 0x81, 0x03, 0x9d, 0xb1, 0x44, 0x11, - 0x00, 0x00, 0x84, 0x01, 0xb5, 0x28, 0x4c, 0x60, 0x80, 0x06, 0x49, 0xfd, - 0x0c, 0x56, 0x4e, 0x95, 0xff, 0xf7, 0x46, 0x58, 0x20, 0xe0, 0x40, 0x05, - 0x20, 0x08, 0x58, 0x52, 0x80, 0x08, 0x99, 0x05, 0x46, 0x38, 0x20, 0xe0, - 0x58, 0x31, 0x80, 0x6c, 0x50, 0x51, 0xff, 0xa0, 0x98, 0x83, 0x98, 0xc5, - 0x46, 0x58, 0x20, 0xe0, 0x58, 0x52, 0x80, 0x10, 0x84, 0x20, 0x98, 0x05, - 0xb6, 0x24, 0xb6, 0x23, 0xb6, 0x20, 0xb6, 0x22, 0x46, 0x08, 0x20, 0xf9, - 0xb4, 0x40, 0x42, 0x21, 0x7c, 0x09, 0xb6, 0x40, 0xb4, 0x40, 0x42, 0x21, - 0x78, 0x09, 0xb6, 0x40, 0x80, 0x20, 0x04, 0x00, 0x82, 0x08, 0x42, 0x00, - 0x70, 0x09, 0x14, 0x00, 0x82, 0x08, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x3c, 0x2c, 0x00, 0x17, - 0x96, 0x00, 0xe2, 0x02, 0xe9, 0x03, 0x84, 0x01, 0xd5, 0x20, 0x84, 0xa1, - 0xd9, 0x04, 0x58, 0x00, 0x40, 0x00, 0xd5, 0x09, 0xc9, 0x04, 0x42, 0x00, - 0x3c, 0x08, 0xd5, 0x05, 0x84, 0xa2, 0xd9, 0x03, 0x58, 0x00, 0x10, 0x00, - 0x46, 0x18, 0x20, 0xf9, 0x58, 0x80, 0x88, 0x30, 0xb6, 0x08, 0x84, 0xc0, - 0x9d, 0xb1, 0x44, 0x11, 0x00, 0x00, 0x84, 0x01, 0xb5, 0x28, 0x4c, 0x60, - 0x80, 0x06, 0x49, 0xfd, 0x0c, 0x00, 0x4e, 0x95, 0xff, 0xf7, 0x84, 0x00, - 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xf4, 0x97, 0x80, 0x84, 0x60, 0x80, 0x06, 0x81, 0x21, - 0x81, 0x02, 0x50, 0x1f, 0x80, 0x04, 0x80, 0x5f, 0xb6, 0x7f, 0xf3, 0x81, - 0x54, 0x73, 0x00, 0x03, 0x49, 0xfc, 0x25, 0x81, 0x84, 0xa1, 0xd7, 0x18, - 0x84, 0xa2, 0xd7, 0x16, 0x84, 0xa3, 0xdf, 0x14, 0x54, 0x63, 0x00, 0x30, - 0x92, 0xc4, 0xe6, 0xc2, 0xe8, 0x09, 0xf1, 0x01, 0xb4, 0x1f, 0x58, 0x10, - 0xac, 0xb0, 0x58, 0x00, 0x0b, 0x2c, 0xf1, 0x81, 0xd5, 0x06, 0x84, 0xa3, - 0xde, 0x05, 0xb4, 0x1f, 0x58, 0x00, 0x0b, 0x2c, 0xb6, 0x1f, 0xf0, 0x01, - 0xb6, 0x09, 0xb4, 0x1f, 0xb6, 0x08, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x46, 0x15, 0x00, 0x14, 0x04, 0x20, - 0x83, 0x00, 0x44, 0x34, 0x40, 0x00, 0x40, 0x21, 0x0c, 0x04, 0x14, 0x20, - 0x83, 0x00, 0x46, 0x05, 0x00, 0x02, 0x58, 0x00, 0x00, 0x88, 0xb4, 0x40, - 0x44, 0x3f, 0xff, 0x1f, 0x40, 0x21, 0x0c, 0x02, 0xb6, 0x40, 0x44, 0x3f, - 0x8f, 0xff, 0xb4, 0x40, 0x46, 0x15, 0x00, 0x00, 0x40, 0x21, 0x0c, 0x02, - 0xb6, 0x40, 0x04, 0x20, 0x80, 0x98, 0x46, 0x37, 0x00, 0x00, 0x40, 0x21, - 0x0c, 0x04, 0x14, 0x20, 0x80, 0x98, 0x46, 0x10, 0x00, 0x80, 0x58, 0x10, - 0x8e, 0xac, 0x84, 0x04, 0x3c, 0x1f, 0xd1, 0xa7, 0x49, 0xfc, 0x2d, 0xab, - 0x46, 0x08, 0x00, 0x21, 0x04, 0x20, 0x00, 0x4c, 0x84, 0x20, 0x58, 0x21, - 0x20, 0x00, 0x14, 0x20, 0x00, 0x4c, 0x84, 0x81, 0x3c, 0x3d, 0xd1, 0xa7, - 0x80, 0x41, 0x84, 0x04, 0x49, 0xfc, 0x2e, 0x11, 0x84, 0x21, 0x84, 0x04, - 0x49, 0xfc, 0x2d, 0xe1, 0x84, 0x04, 0x49, 0xfc, 0x2d, 0x9c, 0x3a, 0x6f, - 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x84, 0x01, 0x49, 0xfc, 0x44, 0xb4, 0x44, 0x50, 0x00, 0x18, 0xd0, 0x10, - 0x3c, 0x2d, 0xd0, 0xcd, 0x84, 0x20, 0x84, 0x03, 0xdd, 0x22, 0x46, 0x08, - 0x00, 0x21, 0x04, 0x10, 0x00, 0x4c, 0x42, 0x10, 0xf8, 0x08, 0x14, 0x10, - 0x00, 0x4c, 0x49, 0xfc, 0x46, 0x1a, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfb, 0xfb, 0x51, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xf4, 0x50, 0x0f, 0x80, 0x04, 0x49, 0xfb, 0xfb, 0x2f, - 0xf0, 0x01, 0xec, 0x0c, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x84, 0x41, 0x4c, 0x11, 0x00, 0x08, 0x40, 0x61, 0x00, 0x0c, - 0x84, 0x02, 0x4c, 0x10, 0x40, 0x21, 0xd5, 0x0c, 0x46, 0x28, 0x10, 0x40, - 0x04, 0x31, 0x00, 0x46, 0x40, 0x00, 0x80, 0x0c, 0x40, 0x00, 0x0c, 0x04, - 0x14, 0x01, 0x00, 0x46, 0xd5, 0x1e, 0x49, 0xff, 0xff, 0xde, 0x46, 0x18, - 0x10, 0x40, 0x58, 0x10, 0x81, 0x18, 0xb4, 0x41, 0x40, 0x33, 0x18, 0x05, - 0x40, 0x63, 0x08, 0x04, 0xb6, 0xc1, 0xb4, 0x41, 0x40, 0x21, 0x88, 0x02, - 0xb6, 0x41, 0x49, 0xff, 0xff, 0xc4, 0xd5, 0x0b, 0x46, 0x18, 0x10, 0x40, - 0x04, 0x00, 0x80, 0x46, 0x40, 0x63, 0x18, 0x05, 0x40, 0x63, 0x00, 0x02, - 0x14, 0x60, 0x80, 0x46, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x00, 0x80, 0x20, 0x49, 0xff, 0xff, 0xc5, - 0x3c, 0x0d, 0xf9, 0x22, 0xdd, 0x20, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x49, 0xff, 0xf9, 0x36, 0x49, 0xff, - 0xf9, 0x42, 0x49, 0xff, 0xf9, 0x84, 0x46, 0x10, 0x00, 0x80, 0x58, 0x10, - 0x82, 0x74, 0x3c, 0x1f, 0xd0, 0xe9, 0x3c, 0x1d, 0xd0, 0xf0, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x06, 0x60, 0xdd, 0x21, 0x49, 0xff, 0xff, 0x2b, - 0x46, 0x10, 0x00, 0x80, 0x58, 0x10, 0x84, 0xa4, 0x3c, 0x1f, 0xd1, 0x0c, - 0x44, 0x10, 0x03, 0xcf, 0x3c, 0x18, 0x00, 0x62, 0x44, 0x10, 0x04, 0x92, - 0x3c, 0x18, 0x00, 0x66, 0x44, 0x10, 0x01, 0x86, 0x3c, 0x18, 0x00, 0x61, - 0x46, 0x08, 0x00, 0x00, 0x58, 0x00, 0x01, 0x40, 0xb4, 0x20, 0x92, 0x22, - 0x94, 0x4a, 0xb6, 0x20, 0xb4, 0x20, 0x58, 0x10, 0x80, 0x01, 0xb6, 0x20, - 0x46, 0x10, 0x00, 0x80, 0x58, 0x10, 0x8d, 0xb4, 0x3c, 0x1f, 0xd1, 0x88, - 0x84, 0x21, 0x3e, 0x17, 0x46, 0x7c, 0x84, 0x20, 0x3c, 0x1f, 0xdc, 0x77, - 0x3c, 0x1d, 0xd1, 0x45, 0x84, 0x01, 0xdd, 0x21, 0x49, 0xfc, 0x27, 0x2f, - 0x3c, 0x0d, 0xd1, 0x8d, 0xdd, 0x20, 0x3c, 0x1d, 0xd1, 0x45, 0x84, 0x03, - 0xdd, 0x21, 0x49, 0x00, 0x08, 0x22, 0x46, 0x10, 0x00, 0x80, 0x58, 0x10, - 0x86, 0xbc, 0x3c, 0x1f, 0xd1, 0x00, 0x46, 0x10, 0x00, 0x80, 0x58, 0x10, - 0x84, 0x78, 0x3c, 0x1f, 0xd0, 0xea, 0x46, 0x10, 0x00, 0x80, 0x58, 0x10, - 0x84, 0x90, 0x3c, 0x1f, 0xd0, 0xeb, 0x46, 0x10, 0x00, 0x80, 0x58, 0x10, - 0x84, 0x94, 0x3c, 0x1f, 0xd0, 0xec, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x00, 0x49, 0xff, - 0xf9, 0x4a, 0x84, 0x00, 0x49, 0xfc, 0x08, 0xc3, 0xec, 0x04, 0x3b, 0xff, - 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x84, 0x01, - 0x49, 0xfc, 0x2c, 0x9b, 0x46, 0x65, 0x00, 0x00, 0x46, 0x15, 0x00, 0x00, - 0x80, 0x01, 0x58, 0x63, 0x02, 0x58, 0xa1, 0xcd, 0x04, 0x80, 0x00, 0x7f, - 0xb4, 0x06, 0x96, 0x04, 0xc0, 0x0c, 0x3c, 0x0d, 0xd1, 0xa5, 0xdd, 0x20, - 0xb4, 0x06, 0x58, 0x00, 0x00, 0x01, 0xb6, 0x06, 0xb4, 0x06, 0x42, 0x00, - 0x04, 0x09, 0xb6, 0x06, 0x54, 0x04, 0x00, 0xff, 0xc0, 0x04, 0x3c, 0x0d, - 0xd1, 0xa6, 0xdd, 0x20, 0x42, 0x03, 0xf8, 0x0b, 0xc0, 0x03, 0x49, 0xfc, - 0x44, 0x14, 0x97, 0xfc, 0xc7, 0x03, 0x49, 0xfc, 0x43, 0xf6, 0x84, 0x01, - 0x49, 0xfc, 0x2c, 0x79, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, - 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, - 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, - 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, - 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1f, - 0xe4, 0x74, 0x84, 0x01, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1f, 0xe4, 0x70, - 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0f, 0xe4, 0x18, - 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, - 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, - 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, - 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, - 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, - 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, - 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, - 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, - 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, - 0x3e, 0x1f, 0xe4, 0x74, 0x84, 0x02, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1f, - 0xe4, 0x70, 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0f, - 0xe4, 0x18, 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, - 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, - 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, - 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, - 0x00, 0x04, 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, - 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, - 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, - 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, - 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, - 0x00, 0x09, 0x3e, 0x1f, 0xe4, 0x74, 0x84, 0x03, 0x14, 0x00, 0x80, 0x00, - 0x3e, 0x1f, 0xe4, 0x70, 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, - 0x3e, 0x0f, 0xe4, 0x18, 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, - 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, - 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, - 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, - 0x64, 0x00, 0x00, 0x04, 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, - 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, - 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, - 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, - 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, - 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1f, 0xe4, 0x74, 0x84, 0x04, 0x14, 0x00, - 0x80, 0x00, 0x3e, 0x1f, 0xe4, 0x70, 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, - 0x80, 0x00, 0x3e, 0x0f, 0xe4, 0x18, 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, - 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, - 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, - 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, - 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, - 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, - 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, - 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, - 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, - 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1f, 0xe4, 0x74, 0x84, 0x05, - 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1f, 0xe4, 0x70, 0x50, 0x0f, 0x80, 0x04, - 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0f, 0xe4, 0x18, 0x04, 0x00, 0x00, 0x00, - 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, - 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, - 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, - 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, 0x3b, 0xff, 0xfc, 0x7c, - 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, - 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, - 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, - 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, - 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1f, 0xe4, 0x74, - 0x84, 0x06, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1f, 0xe4, 0x70, 0x50, 0x0f, - 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0f, 0xe4, 0x18, 0x04, 0x00, - 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, - 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, - 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, - 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, 0x3b, 0xff, - 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, - 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, - 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, - 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, - 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1f, - 0xe4, 0x74, 0x84, 0x07, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1f, 0xe4, 0x70, - 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0f, 0xe4, 0x18, - 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, - 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, - 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, - 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x3e, 0x7f, 0xe4, 0x70, 0xb4, 0x07, - 0x3e, 0x6f, 0x43, 0xc0, 0xa0, 0x42, 0xb4, 0x46, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x06, 0xa4, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xa0, 0x43, - 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x06, 0xb8, 0xdd, 0x22, 0xb4, 0x07, - 0xb4, 0x46, 0xa0, 0x44, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x06, 0xcc, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xa0, 0x45, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x06, 0xe0, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xa0, 0x46, - 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x06, 0xf4, 0xdd, 0x22, 0xb4, 0x07, - 0xb4, 0x46, 0xa0, 0x47, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x07, 0x08, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x08, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x07, 0x1c, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, - 0x04, 0x10, 0x00, 0x09, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x07, 0x30, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x0a, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x07, 0x44, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, - 0x04, 0x10, 0x00, 0x0b, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x07, 0x58, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x0c, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x07, 0x6c, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, - 0x04, 0x10, 0x00, 0x0d, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x07, 0x80, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x0e, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x07, 0x94, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, - 0x04, 0x10, 0x00, 0x0f, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x07, 0xa8, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x10, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x07, 0xbc, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, - 0x04, 0x10, 0x00, 0x11, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x07, 0xd0, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xa0, 0x41, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x07, 0xe4, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xb4, 0x20, - 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x07, 0xf8, 0xdd, 0x22, 0xb4, 0x07, - 0x04, 0x70, 0x00, 0x11, 0x50, 0x83, 0x81, 0x90, 0x80, 0x27, 0xb4, 0x66, - 0xa2, 0xb9, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x08, 0x0c, 0xdd, 0x23, - 0x4c, 0x74, 0x7f, 0xf8, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x3e, 0x7f, 0xe4, 0x70, 0xb4, 0x07, 0x3e, 0x6f, - 0x43, 0xc0, 0xb4, 0x40, 0xb4, 0x66, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, - 0x08, 0x30, 0x84, 0x20, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x81, - 0x84, 0x21, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x08, 0x48, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x82, 0x84, 0x22, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x08, 0x60, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x83, - 0x84, 0x23, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x08, 0x78, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x84, 0x84, 0x24, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x08, 0x90, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x85, - 0x84, 0x25, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x08, 0xa8, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x86, 0x84, 0x26, 0x46, 0x00, 0x00, 0x82, - 0x58, 0x00, 0x08, 0xc0, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x87, - 0x84, 0x27, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x08, 0xd8, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x08, 0x84, 0x28, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x08, 0xf0, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, - 0x04, 0x20, 0x00, 0x09, 0x84, 0x29, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, - 0x09, 0x08, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x0a, - 0x84, 0x2a, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x09, 0x20, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x0b, 0x84, 0x2b, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x09, 0x38, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, - 0x04, 0x20, 0x00, 0x0c, 0x84, 0x2c, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, - 0x09, 0x50, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x0d, - 0x84, 0x2d, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x09, 0x68, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x0e, 0x84, 0x2e, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x09, 0x80, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, - 0x04, 0x20, 0x00, 0x0f, 0x84, 0x2f, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, - 0x09, 0x98, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x10, - 0x44, 0x10, 0x00, 0x10, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x09, 0xb0, - 0xdd, 0x23, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x46, 0x08, - 0x20, 0x6c, 0x58, 0x00, 0x00, 0x64, 0x3c, 0x2d, 0xf9, 0x1e, 0xb4, 0x20, - 0x40, 0x21, 0x7c, 0x08, 0x42, 0x10, 0xfc, 0x09, 0x40, 0x10, 0x88, 0x04, - 0xb6, 0x20, 0x3c, 0x2d, 0xf9, 0x1f, 0x46, 0x37, 0x00, 0x00, 0x40, 0x21, - 0x70, 0x08, 0xb4, 0x20, 0x40, 0x21, 0x0c, 0x02, 0x46, 0x38, 0xff, 0xff, - 0x58, 0x31, 0x8f, 0xff, 0x40, 0x10, 0x8c, 0x02, 0x40, 0x11, 0x04, 0x04, - 0xb6, 0x20, 0xdd, 0x9e, 0x92, 0x00, 0x3e, 0x1f, 0xe4, 0xa0, 0x00, 0x00, - 0x80, 0x14, 0xc0, 0x14, 0x00, 0x00, 0x80, 0x2c, 0xc8, 0x03, 0x84, 0x01, - 0xd5, 0x0f, 0x00, 0x00, 0x80, 0x44, 0xc8, 0x03, 0x84, 0x02, 0xd5, 0x0a, - 0x00, 0x30, 0x80, 0x5c, 0x84, 0x43, 0x44, 0x10, 0x00, 0xff, 0x40, 0x01, - 0x0c, 0x1a, 0x40, 0x00, 0x8c, 0x1b, 0xdd, 0x9e, 0x92, 0x00, 0x3c, 0x2d, - 0xf9, 0x1c, 0x3e, 0x1f, 0xe4, 0xb4, 0x84, 0x00, 0xa7, 0x08, 0x9c, 0xc1, - 0xc4, 0x07, 0xa7, 0x09, 0xc4, 0x05, 0x04, 0x40, 0xff, 0xfb, 0xb4, 0xa2, - 0xd4, 0x06, 0x96, 0x1a, 0x84, 0xa4, 0x8c, 0x38, 0xd8, 0xf4, 0x84, 0x1f, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x3e, 0x6f, 0x43, 0xc0, - 0xb4, 0x26, 0x83, 0x80, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x09, 0xc8, - 0x3e, 0x9f, 0xe4, 0xa0, 0xdd, 0x21, 0x15, 0xcf, 0x80, 0x01, 0x81, 0x46, - 0x3e, 0x7f, 0xe4, 0xb4, 0x80, 0xc9, 0x85, 0x00, 0xa6, 0x38, 0xc0, 0x0e, - 0xa1, 0x71, 0xa6, 0xba, 0xa6, 0xf9, 0xb4, 0x86, 0x05, 0xc5, 0x00, 0x00, - 0x9d, 0x69, 0x80, 0x28, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x09, 0xf8, - 0xdd, 0x3c, 0x8d, 0x01, 0x84, 0x04, 0x8c, 0xf8, 0x8c, 0xd8, 0x4c, 0x80, - 0x7f, 0xed, 0x05, 0xcf, 0x80, 0x01, 0x84, 0x00, 0xb7, 0x3c, 0xec, 0x0c, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x84, 0xc1, 0x3c, 0x6f, 0xf9, 0x1e, 0x3c, 0x0d, 0xf9, 0x08, 0xdd, 0x20, - 0x3c, 0x0f, 0xf9, 0x20, 0x3c, 0x0d, 0xf9, 0x0a, 0xdd, 0x20, 0x49, 0xff, - 0xff, 0xac, 0x3c, 0x1d, 0xf9, 0x20, 0xe6, 0x26, 0xe8, 0x06, 0xe6, 0x23, - 0xe8, 0x07, 0x84, 0xa2, 0xd9, 0x13, 0xd5, 0x06, 0x84, 0xa7, 0xd9, 0x10, - 0xd5, 0x0d, 0x84, 0x42, 0xd5, 0x0e, 0x2e, 0x5f, 0xe4, 0x0c, 0xd8, 0x03, - 0x84, 0x40, 0xd5, 0x09, 0x4e, 0x05, 0x00, 0x0a, 0x3c, 0x6f, 0xf9, 0x1f, - 0xd5, 0x06, 0x84, 0x43, 0xd5, 0x02, 0x84, 0x44, 0x3c, 0x2f, 0xf9, 0x1f, - 0x2e, 0x17, 0xe4, 0x90, 0xc1, 0x12, 0x3c, 0x1d, 0xf9, 0x1f, 0x84, 0xa3, - 0xd9, 0x0e, 0x84, 0x20, 0x3e, 0x17, 0xe4, 0x90, 0x3c, 0x0d, 0xf9, 0x1c, - 0x3c, 0x1f, 0xf9, 0x1e, 0x9c, 0x04, 0xb4, 0x20, 0x42, 0x10, 0xac, 0x09, - 0xb6, 0x20, 0xd5, 0x1a, 0x3c, 0x1d, 0xf9, 0x1f, 0xc9, 0x08, 0x3c, 0x1d, - 0xf9, 0x10, 0x96, 0x00, 0xdd, 0x21, 0x84, 0x3f, 0x3e, 0x17, 0xe4, 0x0c, - 0x3c, 0x0d, 0xf9, 0x1d, 0xc0, 0x0b, 0x84, 0xa6, 0xd0, 0x09, 0x46, 0x08, - 0x20, 0x6c, 0x04, 0x10, 0x00, 0x19, 0x58, 0x10, 0x81, 0x00, 0x14, 0x10, - 0x00, 0x19, 0x49, 0xff, 0xff, 0x26, 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, - 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0xe6, 0x04, 0xe9, 0x0a, 0x3c, 0x1d, 0xd0, 0xf0, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x0a, 0x28, 0xdd, 0x21, 0x84, 0x06, 0xd5, 0x12, - 0x44, 0x30, 0x00, 0x18, 0x42, 0x30, 0x0c, 0x24, 0x3e, 0x2f, 0xe4, 0xa0, - 0x98, 0xda, 0x80, 0x43, 0xaa, 0x51, 0x84, 0x00, 0x50, 0x11, 0x80, 0x10, - 0x84, 0x61, 0xb6, 0x02, 0xae, 0xcc, 0xae, 0x0e, 0xae, 0xcd, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0xe6, 0x04, 0xe9, 0x0a, 0x3c, 0x1d, 0xd0, 0xf0, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x0a, 0x50, 0xdd, 0x21, 0x84, 0x06, 0xd5, 0x0e, - 0x44, 0x10, 0x00, 0x18, 0x42, 0x10, 0x04, 0x24, 0x3e, 0x0f, 0xe4, 0xa0, - 0x98, 0x48, 0x8c, 0x30, 0xa6, 0x0c, 0xc0, 0x04, 0x84, 0x01, 0xae, 0x0d, - 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0xe6, 0x04, 0xe9, 0x0a, 0x3c, 0x1d, - 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x0a, 0x50, 0xdd, 0x21, - 0x84, 0x06, 0xd5, 0x0e, 0x44, 0x10, 0x00, 0x18, 0x42, 0x10, 0x04, 0x24, - 0x3e, 0x0f, 0xe4, 0xa0, 0x98, 0x48, 0x8c, 0x30, 0xa6, 0x0c, 0xc0, 0x04, - 0x84, 0x00, 0xae, 0x0d, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0xe6, 0x04, - 0xe9, 0x0a, 0x3c, 0x1d, 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, - 0x0a, 0x28, 0xdd, 0x21, 0x84, 0x06, 0xd5, 0x15, 0x44, 0x40, 0x00, 0x18, - 0x84, 0x63, 0x42, 0x30, 0x0c, 0x24, 0x42, 0x00, 0x10, 0x24, 0x3e, 0x4f, - 0xe4, 0xa0, 0x98, 0x04, 0x9c, 0xd9, 0xaa, 0x44, 0x94, 0xdb, 0x84, 0x21, - 0x98, 0xdc, 0xae, 0x46, 0xae, 0x45, 0xae, 0x44, 0xa8, 0x99, 0x84, 0x00, - 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0xe6, 0x04, 0xe9, 0x0a, 0x3c, 0x1d, - 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x0a, 0x50, 0xdd, 0x21, - 0x84, 0x06, 0xd5, 0x0e, 0x44, 0x20, 0x00, 0x18, 0x42, 0x00, 0x08, 0x24, - 0x3e, 0x3f, 0xe4, 0xa0, 0x98, 0x83, 0x00, 0x01, 0x00, 0x14, 0xc0, 0x04, - 0x9e, 0x49, 0xa8, 0x51, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x0d, 0xf9, 0x1e, - 0xc8, 0x0a, 0x3c, 0x1d, 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, - 0x0a, 0x7c, 0xdd, 0x21, 0x84, 0x1f, 0xd5, 0x0c, 0x3c, 0x1d, 0xf9, 0x1c, - 0x9c, 0x4c, 0xb4, 0x81, 0x84, 0x60, 0x42, 0x42, 0x2c, 0x09, 0xb6, 0x81, - 0x3c, 0x3f, 0xf9, 0x1e, 0x80, 0x03, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x0d, 0xf9, 0x1e, - 0xc8, 0x0a, 0x3c, 0x1d, 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, - 0x0a, 0x94, 0xdd, 0x21, 0x84, 0x1f, 0xd5, 0x0c, 0x3c, 0x1d, 0xf9, 0x1c, - 0x84, 0x60, 0x9c, 0x4c, 0xb4, 0x81, 0x80, 0x03, 0x58, 0x42, 0x08, 0x00, - 0xb6, 0x81, 0x3c, 0x3f, 0xf9, 0x1e, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x3c, 0x0d, 0xf9, 0x0b, - 0xdd, 0x20, 0xd5, 0x04, 0x3c, 0x0d, 0xf9, 0x22, 0xdd, 0x20, 0x3c, 0x0d, - 0xf9, 0x1e, 0x84, 0xa1, 0xd0, 0xfa, 0x3c, 0x0d, 0xf9, 0x0c, 0xdd, 0x20, - 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x0d, 0xf9, 0x1e, 0xc8, 0x0a, 0x3c, 0x1d, - 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x0a, 0x94, 0xdd, 0x21, - 0x84, 0x03, 0xd5, 0x04, 0x49, 0xff, 0xfc, 0xb1, 0x84, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x96, 0x48, 0x80, 0x60, 0x40, 0x40, - 0x04, 0x17, 0xc0, 0x03, 0x84, 0x05, 0xd5, 0x11, 0x84, 0xa1, 0xd9, 0x03, - 0xa6, 0x58, 0xd5, 0x0c, 0x84, 0xa2, 0xd9, 0x05, 0x42, 0x31, 0x80, 0x09, - 0xa4, 0x58, 0xd5, 0x06, 0x84, 0xa4, 0xd9, 0x05, 0x92, 0x62, 0x94, 0xda, - 0xb4, 0x23, 0xb6, 0x22, 0xdd, 0x9e, 0x96, 0x90, 0x80, 0x60, 0x40, 0x40, - 0x08, 0x17, 0xc0, 0x03, 0x84, 0x05, 0xd5, 0x12, 0x84, 0xa1, 0xda, 0x04, - 0x96, 0x48, 0xae, 0x58, 0xd5, 0x0d, 0x84, 0xa2, 0xda, 0x06, 0x42, 0x31, - 0x80, 0x09, 0x96, 0x49, 0xac, 0x58, 0xd5, 0x06, 0x84, 0xa4, 0xda, 0x04, - 0x92, 0x62, 0x94, 0xda, 0xb6, 0x23, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0x98, 0xbc, 0x80, 0x60, 0x3c, 0x3f, 0xf9, 0x21, 0x80, 0x01, 0x84, 0x20, - 0x80, 0xc2, 0x80, 0x41, 0xdd, 0x23, 0xb6, 0x06, 0x84, 0x00, 0x3a, 0x6f, - 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x84, 0x44, 0x3c, 0x2f, 0xf9, 0x1f, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0a, 0xf0, 0x3c, 0x2f, 0xf9, 0x06, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0c, 0xf4, 0x3c, 0x2f, 0xf9, 0x05, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x07, 0xfc, 0x3c, 0x2f, 0xf9, 0x07, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0f, 0xac, 0x3c, 0x2f, 0xf9, 0x08, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0e, 0x44, 0x3c, 0x2f, 0xf9, 0x09, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0e, 0x14, 0x3c, 0x2f, 0xf9, 0x0a, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x08, 0x60, 0x3c, 0x2f, 0xf9, 0x0b, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0f, 0xf8, 0x3c, 0x2f, 0xf9, 0x0c, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x09, 0x20, 0x3c, 0x2f, 0xf9, 0x0d, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x09, 0x68, 0x3c, 0x2f, 0xf9, 0x0e, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x09, 0xa8, 0x3c, 0x2f, 0xf9, 0x0f, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0f, 0xb8, 0x3c, 0x2f, 0xf9, 0x10, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x09, 0xe8, 0x3c, 0x2f, 0xf9, 0x11, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0a, 0x38, 0x3c, 0x2f, 0xf9, 0x12, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0f, 0x60, 0x3c, 0x2f, 0xf9, 0x15, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0a, 0x78, 0x3c, 0x2f, 0xf9, 0x16, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0a, 0xb4, 0x3c, 0x2f, 0xf9, 0x17, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0d, 0x00, 0x3c, 0x2f, 0xf9, 0x13, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0e, 0xd0, 0x3c, 0x2f, 0xf9, 0x14, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0b, 0x1c, 0x3c, 0x2f, 0xf9, 0x18, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0b, 0x48, 0x3c, 0x2f, 0xf9, 0x19, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0b, 0x78, 0x3c, 0x2f, 0xf9, 0x1a, - 0x46, 0x20, 0x00, 0x81, 0x58, 0x21, 0x0b, 0xac, 0x84, 0x00, 0x3c, 0x2f, - 0xf9, 0x1b, 0x3c, 0x0f, 0xf9, 0x1e, 0x64, 0x06, 0xe0, 0x03, 0xdd, 0x9e, - 0x92, 0x00, 0x46, 0x08, 0x00, 0x00, 0x64, 0x06, 0xe0, 0x03, 0x84, 0x00, - 0xdd, 0x9e, 0x80, 0x40, 0xe6, 0x12, 0xe9, 0x0b, 0x44, 0x00, 0x00, 0x1f, - 0x4c, 0x20, 0x00, 0x04, 0x84, 0x02, 0xd5, 0x0a, 0x64, 0x12, 0x64, 0x03, - 0x84, 0x00, 0xd5, 0x06, 0x3c, 0x3d, 0xf9, 0x1c, 0x84, 0x00, 0x38, 0x11, - 0x8a, 0x0a, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x44, 0x50, 0x00, 0x39, 0xd1, 0x4d, 0x5c, 0xf0, 0x80, 0x3a, 0xe8, 0x1b, - 0x8e, 0xa8, 0xd1, 0x3c, 0x5c, 0xf0, 0x80, 0x32, 0xe8, 0x0e, 0x9f, 0x6f, - 0xd1, 0x2e, 0x5c, 0xf0, 0x80, 0x2b, 0xe8, 0x04, 0x9f, 0x69, 0xd9, 0x56, - 0xd5, 0x25, 0x9d, 0x69, 0xd1, 0x29, 0x9d, 0x69, 0xd9, 0x51, 0xd5, 0x29, - 0x9c, 0xaa, 0x4c, 0x11, 0x00, 0x30, 0xe2, 0x22, 0xe9, 0x2a, 0x9d, 0x51, - 0xd9, 0x49, 0xd5, 0x2d, 0x8c, 0xa9, 0xd1, 0x3d, 0x5c, 0xf0, 0x80, 0x43, - 0xe8, 0x0e, 0x9f, 0x6e, 0xd1, 0x32, 0x5c, 0xf0, 0x80, 0x3d, 0xe8, 0x06, - 0x9f, 0x6a, 0xd1, 0x27, 0x9d, 0x69, 0xd9, 0x3a, 0xd5, 0x27, 0x9d, 0x6d, - 0xd9, 0x37, 0xd5, 0x2a, 0x9d, 0x69, 0xd1, 0x2e, 0x9d, 0x69, 0xd9, 0x32, - 0xd5, 0x2e, 0x64, 0x06, 0x00, 0x03, 0xd5, 0x35, 0x64, 0x06, 0x04, 0x03, - 0xd5, 0x32, 0x64, 0x06, 0x08, 0x03, 0xd5, 0x2f, 0x64, 0x06, 0x0c, 0x03, - 0xd5, 0x2c, 0x64, 0x06, 0x20, 0x03, 0xd5, 0x29, 0x64, 0x06, 0x24, 0x03, - 0xd5, 0x26, 0x64, 0x06, 0x28, 0x03, 0xd5, 0x23, 0x64, 0x06, 0x2c, 0x03, - 0xd5, 0x20, 0x64, 0x06, 0x40, 0x03, 0xd5, 0x1d, 0x64, 0x06, 0x44, 0x03, - 0xd5, 0x1a, 0x64, 0x06, 0x48, 0x03, 0xd5, 0x17, 0x64, 0x06, 0x4c, 0x03, - 0xd5, 0x14, 0x64, 0x06, 0x60, 0x03, 0xd5, 0x11, 0x64, 0x06, 0x64, 0x03, - 0xd5, 0x0e, 0x64, 0x06, 0x68, 0x03, 0xd5, 0x0b, 0x64, 0x06, 0x6c, 0x03, - 0xd5, 0x08, 0x3c, 0x2d, 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, - 0x0a, 0xb8, 0xdd, 0x22, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x3e, 0x7f, 0xe4, 0xb4, 0x44, 0x60, - 0x00, 0x29, 0xa6, 0x38, 0xc0, 0x07, 0xa6, 0x39, 0xc0, 0x05, 0x80, 0x26, - 0x84, 0x00, 0x49, 0xff, 0xff, 0x7e, 0x9d, 0xb1, 0x44, 0x50, 0x00, 0x2d, - 0x8c, 0xf8, 0xde, 0xf4, 0x84, 0x00, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x3e, 0x8f, 0xe4, 0xa0, - 0x50, 0x94, 0x00, 0x14, 0x51, 0xc4, 0x00, 0x08, 0x44, 0x60, 0x00, 0x29, - 0x84, 0xe0, 0x46, 0xa0, 0x00, 0x81, 0x58, 0xa5, 0x0d, 0x28, 0x00, 0x04, - 0x80, 0x00, 0xc0, 0x26, 0x00, 0x04, 0x80, 0x01, 0xc0, 0x23, 0xb4, 0x08, - 0x50, 0x13, 0x00, 0x08, 0xdd, 0x2a, 0x04, 0x04, 0x00, 0x01, 0x50, 0x13, - 0x00, 0x10, 0xdd, 0x2a, 0xb4, 0x1c, 0x50, 0x13, 0x00, 0x18, 0xdd, 0x2a, - 0x00, 0x04, 0x80, 0x02, 0xc8, 0x03, 0x84, 0xe2, 0xd5, 0x0e, 0xb8, 0x01, - 0xc8, 0x03, 0x84, 0xe3, 0xd5, 0x0a, 0x84, 0xa1, 0xd8, 0x03, 0x84, 0xe5, - 0xd5, 0x06, 0x56, 0x00, 0x00, 0x02, 0x84, 0x27, 0x40, 0x70, 0x80, 0x1a, - 0x80, 0x07, 0x80, 0x26, 0xdd, 0x2a, 0x9d, 0xb1, 0x44, 0x50, 0x00, 0x2d, - 0x8d, 0x38, 0x8d, 0x18, 0x51, 0xce, 0x00, 0x18, 0xde, 0xd1, 0x84, 0x00, - 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0xe6, 0x12, - 0xe9, 0x3f, 0x44, 0x50, 0x00, 0x3e, 0xd0, 0x39, 0x5c, 0xf0, 0x00, 0x3f, - 0xe8, 0x0e, 0x9f, 0x6b, 0xd0, 0x2b, 0x5c, 0xf0, 0x00, 0x3c, 0xe8, 0x04, - 0x8e, 0xbc, 0xd8, 0x13, 0xd5, 0x14, 0x9d, 0x69, 0xd0, 0x26, 0x9d, 0x69, - 0xd8, 0x0e, 0xd5, 0x26, 0x9d, 0x6e, 0xd0, 0x15, 0x5c, 0xf0, 0x00, 0x45, - 0xe8, 0x04, 0x9f, 0x69, 0xd8, 0x06, 0xd5, 0x0a, 0x9d, 0x69, 0xd0, 0x10, - 0x9d, 0x69, 0xd0, 0x11, 0x84, 0x42, 0xd5, 0x24, 0x64, 0x02, 0x64, 0x02, - 0xd5, 0x03, 0x64, 0x06, 0x20, 0x02, 0xb6, 0x01, 0x84, 0x40, 0xd5, 0x1c, - 0x64, 0x06, 0x24, 0x02, 0xd5, 0xfb, 0x64, 0x06, 0x28, 0x02, 0xd5, 0xf8, - 0x64, 0x06, 0x2c, 0x02, 0xd5, 0xf5, 0x64, 0x06, 0x00, 0x02, 0xd5, 0xf2, - 0x64, 0x06, 0x04, 0x02, 0xd5, 0xef, 0x64, 0x06, 0x08, 0x02, 0xd5, 0xec, - 0x64, 0x06, 0x0c, 0x02, 0xd5, 0xe9, 0x3c, 0x3d, 0xf9, 0x1c, 0x84, 0x40, - 0x38, 0x31, 0x82, 0x02, 0xb6, 0x61, 0x80, 0x02, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x3c, 0x0d, 0xf9, 0x1e, 0x84, 0xa1, 0xd8, 0x0a, 0x3c, 0x1d, - 0xd0, 0xf0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x0a, 0xd4, 0xdd, 0x21, - 0x84, 0x04, 0xd5, 0x15, 0x49, 0xff, 0xfc, 0x11, 0x92, 0x00, 0x3c, 0x2d, - 0xf9, 0x0d, 0x3e, 0x07, 0xe4, 0x0c, 0x64, 0x12, 0xa4, 0x02, 0xdd, 0x22, - 0x2e, 0x3f, 0xe4, 0x0c, 0x84, 0x26, 0x5e, 0x31, 0x80, 0x00, 0x84, 0x40, - 0x40, 0x01, 0x0c, 0x1a, 0x40, 0x00, 0x8c, 0x1b, 0x3a, 0x6f, 0x98, 0x84, - 0xdd, 0x9e, 0x64, 0x02, 0x64, 0x02, 0x54, 0x00, 0x00, 0x0f, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x44, 0x20, 0x00, 0x18, - 0x96, 0x40, 0x42, 0x00, 0x88, 0x24, 0x3e, 0x3f, 0xe4, 0xa0, 0x98, 0x03, - 0x00, 0x30, 0x00, 0x14, 0xcb, 0x0a, 0x3c, 0x2d, 0xd0, 0xf0, 0x46, 0x00, - 0x00, 0x82, 0x58, 0x00, 0x0a, 0xfc, 0xdd, 0x22, 0x84, 0x01, 0xd5, 0x06, - 0x84, 0x20, 0x49, 0xfc, 0x3e, 0x98, 0x92, 0x00, 0x84, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x49, 0x00, - 0x00, 0x54, 0x44, 0x50, 0x11, 0x08, 0xd0, 0x19, 0x49, 0x00, 0x00, 0x4f, - 0x44, 0x50, 0x11, 0x07, 0xd8, 0x11, 0x3c, 0x0d, 0xf9, 0x1f, 0x9e, 0x01, - 0xe6, 0x02, 0xe8, 0x0c, 0x3c, 0x0d, 0xf9, 0x1c, 0x84, 0x41, 0x3e, 0x27, - 0xe4, 0x90, 0x9c, 0x04, 0xb4, 0x20, 0x58, 0x10, 0x88, 0x00, 0xb6, 0x20, - 0xd5, 0x04, 0x3c, 0x0d, 0xf9, 0x09, 0xdd, 0x20, 0x84, 0x24, 0x3c, 0x1f, - 0xf9, 0x1f, 0x49, 0xff, 0xfb, 0x90, 0x84, 0x00, 0x3c, 0x0f, 0xf9, 0x1d, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x48, - 0x20, 0x6c, 0x80, 0x44, 0x80, 0x22, 0x80, 0x61, 0x84, 0x00, 0x14, 0x02, - 0x00, 0x1a, 0x14, 0x01, 0x00, 0x1b, 0x14, 0x00, 0x80, 0x1c, 0x14, 0x01, - 0x00, 0x1b, 0x14, 0x00, 0x80, 0x1c, 0x14, 0x01, 0x80, 0x19, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x10, 0x00, 0x82, - 0x58, 0x10, 0x80, 0xd4, 0x3c, 0x1f, 0xf9, 0x22, 0x46, 0x10, 0x00, 0x82, - 0x58, 0x10, 0x80, 0x4c, 0x3c, 0x1f, 0xf9, 0x23, 0x49, 0xff, 0xff, 0xdd, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3c, 0x0d, - 0xf9, 0x02, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x3c, 0x1d, - 0xd0, 0xf0, 0x80, 0xc0, 0x46, 0x00, 0x00, 0x82, 0x58, 0x00, 0x0b, 0x14, - 0xdd, 0x21, 0x84, 0x00, 0x80, 0x66, 0x80, 0x20, 0x44, 0x20, 0x00, 0xff, - 0x49, 0xfb, 0xf9, 0x3d, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xf4, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x10, 0x00, 0x1a, - 0x3c, 0x1f, 0xf9, 0x02, 0x4e, 0x12, 0x01, 0xd0, 0x84, 0xc0, 0x44, 0x00, - 0x11, 0x08, 0xf6, 0x81, 0x2e, 0x37, 0xe4, 0x10, 0x4c, 0x10, 0x00, 0xb4, - 0x5c, 0xf0, 0x91, 0x09, 0xe8, 0x32, 0x9f, 0x47, 0x4c, 0x12, 0x80, 0x85, - 0x5c, 0xf0, 0x91, 0x02, 0xe8, 0x19, 0x44, 0x50, 0x10, 0x03, 0x4c, 0x12, - 0x80, 0xcd, 0x5c, 0xf0, 0x90, 0x04, 0xe8, 0x08, 0x9f, 0x6a, 0x4c, 0x12, - 0x80, 0xad, 0x9d, 0x69, 0xd9, 0x65, 0x48, 0x00, 0x00, 0xb9, 0x9c, 0xea, - 0x4c, 0x11, 0x80, 0xdb, 0xe2, 0x23, 0x4e, 0xf3, 0x00, 0xcd, 0x9d, 0x59, - 0xd9, 0x5b, 0x48, 0x00, 0x00, 0xdf, 0x9f, 0x44, 0x4c, 0x12, 0x81, 0x48, - 0x5c, 0xf0, 0x91, 0x05, 0xe8, 0x07, 0x9f, 0x46, 0xd1, 0x64, 0x9f, 0x45, - 0xd9, 0x4f, 0x48, 0x00, 0x00, 0x78, 0x9f, 0x42, 0xd1, 0x6d, 0x5c, 0xf0, - 0x91, 0x07, 0x4e, 0xf2, 0x00, 0x7e, 0xd5, 0x60, 0x44, 0x50, 0x11, 0x10, - 0x4c, 0x12, 0x81, 0x02, 0x5c, 0xf0, 0x91, 0x11, 0xe8, 0x18, 0x9d, 0x43, - 0x4c, 0x12, 0x81, 0x16, 0x5c, 0xf0, 0x91, 0x0c, 0xe8, 0x07, 0x9d, 0x41, - 0xd1, 0x73, 0x9d, 0x42, 0xd9, 0x35, 0x48, 0x00, 0x00, 0xc6, 0x9d, 0x46, - 0x4c, 0x12, 0x80, 0xd6, 0x5c, 0xf0, 0x91, 0x0f, 0x4e, 0xf2, 0x00, 0xdf, - 0x9d, 0x44, 0xd9, 0x2a, 0x48, 0x00, 0x00, 0xca, 0x44, 0x50, 0x12, 0x01, - 0xd1, 0x28, 0x5c, 0xf0, 0x92, 0x02, 0xe8, 0x0c, 0x44, 0x50, 0x11, 0x19, - 0x4c, 0x12, 0x81, 0x1b, 0x9d, 0x69, 0x4c, 0x12, 0x81, 0x31, 0x8e, 0xa9, - 0xd9, 0x19, 0x48, 0x00, 0x00, 0xe4, 0x44, 0x50, 0x1f, 0x01, 0x4c, 0x12, - 0x81, 0x22, 0x9d, 0x69, 0x4c, 0x12, 0x80, 0xf6, 0x44, 0x50, 0x12, 0x02, - 0xd1, 0x02, 0xd5, 0x0c, 0x46, 0x08, 0x20, 0x6c, 0x46, 0x1e, 0x1e, 0x1e, - 0x58, 0x10, 0x81, 0xe1, 0x14, 0x10, 0x00, 0x1b, 0x84, 0x00, 0x49, 0xfc, - 0x00, 0x0e, 0x84, 0xc0, 0x48, 0x00, 0x01, 0x27, 0x46, 0x08, 0x20, 0x6c, - 0x46, 0x1e, 0x2e, 0x2e, 0x58, 0x10, 0x82, 0xe2, 0x14, 0x10, 0x00, 0x1b, - 0x80, 0x06, 0x49, 0xff, 0xf0, 0x84, 0x48, 0x00, 0x01, 0x1a, 0x3e, 0x0f, - 0xe4, 0x04, 0xd5, 0x03, 0x3e, 0x0f, 0xe4, 0x14, 0xb4, 0x00, 0xdd, 0x20, - 0x80, 0xc0, 0x48, 0x00, 0x01, 0x10, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x00, - 0x00, 0x1b, 0x3e, 0x1f, 0xe4, 0x38, 0x48, 0x00, 0x00, 0xd7, 0x46, 0x08, - 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, 0x3e, 0x1f, 0xe4, 0x3c, 0x48, 0x00, - 0x00, 0xcf, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, 0x00, 0x1b, - 0x04, 0x10, 0x80, 0x1c, 0x3c, 0x2d, 0xf9, 0x0d, 0x96, 0x00, 0xdd, 0x22, - 0xd5, 0x0a, 0x3e, 0x0f, 0xe4, 0x58, 0xd5, 0xdd, 0x3e, 0x0f, 0xe4, 0x5c, - 0xd5, 0xda, 0x3c, 0x0d, 0xf9, 0x15, 0xdd, 0x20, 0x80, 0xc0, 0x3c, 0x0d, - 0xf9, 0x09, 0xdd, 0x20, 0x48, 0x00, 0x00, 0xe5, 0x46, 0x78, 0x20, 0x6c, - 0x3c, 0x3d, 0xf9, 0x19, 0x04, 0x03, 0x80, 0x1b, 0x84, 0x21, 0x50, 0x2f, - 0x80, 0x04, 0xdd, 0x23, 0xf3, 0x01, 0x80, 0xc0, 0x14, 0x33, 0x80, 0x1b, - 0x48, 0x00, 0x00, 0xd5, 0x46, 0x78, 0x20, 0x6c, 0x58, 0x73, 0x80, 0x6c, - 0x3c, 0x3d, 0xf9, 0x19, 0xb4, 0x07, 0x84, 0x22, 0x48, 0x00, 0x00, 0xaa, - 0x46, 0x78, 0x20, 0x6c, 0x3c, 0x3d, 0xf9, 0x19, 0x04, 0x03, 0x80, 0x1b, - 0x84, 0x24, 0x40, 0x2f, 0x84, 0x00, 0xdd, 0x23, 0xf1, 0x01, 0x80, 0xc0, - 0x14, 0x13, 0x80, 0x1b, 0x48, 0x00, 0x00, 0xbb, 0x46, 0x08, 0x20, 0x6c, - 0x80, 0x20, 0x04, 0x00, 0x00, 0x1b, 0x3c, 0x3d, 0xf9, 0x1a, 0x04, 0x10, - 0x80, 0x1c, 0x84, 0x41, 0xd5, 0x16, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, - 0x04, 0x00, 0x00, 0x1b, 0x3c, 0x3d, 0xf9, 0x1a, 0x04, 0x10, 0x80, 0x1c, - 0x84, 0x42, 0xd5, 0x0b, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, - 0x00, 0x1b, 0x04, 0x10, 0x80, 0x1c, 0x3c, 0x3d, 0xf9, 0x1a, 0x84, 0x44, - 0xdd, 0x23, 0x48, 0xff, 0xff, 0x87, 0x46, 0x78, 0x20, 0x6c, 0x3c, 0x2d, - 0xf9, 0x14, 0x04, 0x03, 0x80, 0x1b, 0x50, 0x1f, 0x80, 0x04, 0xdd, 0x22, - 0xf2, 0x01, 0x80, 0xc0, 0x14, 0x23, 0x80, 0x1b, 0x48, 0x00, 0x00, 0x89, - 0x3e, 0x0f, 0xe4, 0x60, 0x48, 0xff, 0xff, 0x72, 0x46, 0x08, 0x20, 0x6c, - 0x04, 0x00, 0x00, 0x1b, 0x46, 0x18, 0x20, 0x6c, 0x3c, 0x3d, 0xf9, 0x11, - 0x04, 0x10, 0x80, 0x1c, 0x96, 0x00, 0x84, 0x41, 0xd5, 0x19, 0x46, 0x08, - 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, 0x46, 0x18, 0x20, 0x6c, 0x3c, 0x3d, - 0xf9, 0x11, 0x04, 0x10, 0x80, 0x1c, 0x96, 0x00, 0x80, 0x46, 0xd5, 0x0c, - 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, 0x00, 0x1b, 0x04, 0x10, - 0x80, 0x1c, 0x3c, 0x3d, 0xf9, 0x11, 0x96, 0x00, 0x84, 0x42, 0xdd, 0x23, - 0xd5, 0x5d, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, 0x00, 0x1b, - 0x04, 0x10, 0x80, 0x1c, 0x3c, 0x2d, 0xf9, 0x12, 0x96, 0x00, 0xdd, 0x22, - 0x48, 0xff, 0xff, 0x29, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, - 0x00, 0x1b, 0x3c, 0x2d, 0xf9, 0x13, 0x04, 0x10, 0x80, 0x1c, 0xdd, 0x22, - 0x48, 0xff, 0xff, 0x34, 0x3c, 0x1d, 0xf9, 0x07, 0x50, 0x0f, 0x80, 0x04, - 0xdd, 0x21, 0x80, 0xc0, 0xf3, 0x01, 0x46, 0x08, 0x20, 0x6c, 0x14, 0x30, - 0x00, 0x1b, 0xd5, 0x38, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, - 0x3e, 0x1f, 0xe4, 0x40, 0xb4, 0x21, 0x96, 0x00, 0xdd, 0x21, 0x48, 0xff, - 0xff, 0x1d, 0x46, 0x78, 0x20, 0x6c, 0x46, 0x18, 0x20, 0x6c, 0x58, 0x73, - 0x80, 0x6c, 0xb4, 0x07, 0x3c, 0x3d, 0xf9, 0x1b, 0x04, 0x10, 0x80, 0x1c, - 0x50, 0x2f, 0x80, 0x04, 0xdd, 0x23, 0x80, 0xc0, 0xf0, 0x01, 0xb6, 0x07, - 0xd5, 0x1b, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, 0x49, 0xff, - 0xfe, 0x4e, 0xd5, 0x14, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, - 0x3e, 0x1f, 0xe5, 0x00, 0x38, 0x00, 0x8e, 0x0a, 0x46, 0x08, 0x20, 0x6c, - 0x9c, 0xd9, 0x04, 0x40, 0x00, 0x1c, 0x96, 0xd8, 0x9c, 0x19, 0x38, 0x40, - 0x8e, 0x0a, 0x3e, 0x07, 0xe4, 0x10, 0x3c, 0x0d, 0xf9, 0x02, 0x44, 0x50, - 0x11, 0x1a, 0xd0, 0x04, 0x84, 0x20, 0x3e, 0x17, 0xe4, 0x10, 0x46, 0x08, - 0x20, 0x6c, 0x84, 0x20, 0x14, 0x10, 0x00, 0x1a, 0x46, 0x08, 0x20, 0x6c, - 0x58, 0x00, 0x00, 0x64, 0xb4, 0x20, 0x44, 0x2f, 0xff, 0x0f, 0x95, 0xb4, - 0x40, 0x10, 0x88, 0x02, 0x97, 0xb0, 0x40, 0x63, 0x04, 0x04, 0xb6, 0xc0, - 0xb4, 0x40, 0xb4, 0x20, 0x9c, 0x91, 0x54, 0x21, 0x00, 0x0f, 0x92, 0x24, - 0x94, 0x4c, 0x40, 0x11, 0x04, 0x04, 0xb6, 0x20, 0xec, 0x0c, 0x3a, 0x6f, - 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x80, 0x60, 0x99, 0x5a, 0xd3, 0x04, - 0x18, 0x11, 0x80, 0x01, 0xd5, 0xfd, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x43, 0x50, 0x55, 0x20, 0x4d, - 0x4f, 0x44, 0x45, 0x20, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x20, 0x49, 0x4e, - 0x46, 0x4f, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x69, 0x6e, 0x20, - 0x62, 0x79, 0x74, 0x65, 0x29, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, - 0x4e, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x49, 0x5a, - 0x45, 0x20, 0x20, 0x50, 0x45, 0x41, 0x4b, 0x20, 0x20, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x52, 0x49, 0x54, 0x59, 0x0a, 0x00, 0x00, 0x00, 0x3b, 0x30, - 0x78, 0x25, 0x78, 0x20, 0x20, 0x30, 0x78, 0x25, 0x78, 0x20, 0x20, 0x25, - 0x64, 0x20, 0x20, 0x25, 0x64, 0x20, 0x20, 0x25, 0x63, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x3b, 0x54, 0x41, 0x53, 0x4b, 0x20, 0x53, 0x54, 0x41, 0x43, - 0x4b, 0x20, 0x49, 0x4e, 0x46, 0x4f, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, - 0x20, 0x69, 0x6e, 0x20, 0x62, 0x79, 0x74, 0x65, 0x29, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x3b, 0x54, 0x41, 0x53, 0x4b, 0x20, 0x20, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x4e, 0x44, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x49, 0x5a, 0x45, 0x20, - 0x20, 0x50, 0x45, 0x41, 0x4b, 0x20, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, - 0x52, 0x49, 0x54, 0x59, 0x0a, 0x00, 0x53, 0x54, 0x41, 0x43, 0x00, 0x00, - 0x00, 0x00, 0x4b, 0x45, 0x4e, 0x44, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x25, - 0x63, 0x25, 0x63, 0x25, 0x63, 0x25, 0x63, 0x20, 0x20, 0x30, 0x78, 0x25, - 0x78, 0x20, 0x20, 0x30, 0x78, 0x25, 0x78, 0x20, 0x20, 0x25, 0x64, 0x20, - 0x20, 0x25, 0x64, 0x20, 0x20, 0x25, 0x63, 0x0a, 0x00, 0x00, 0x3b, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, - 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, - 0x70, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x20, - 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, - 0x70, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x25, 0x73, 0x3a, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x61, 0x74, 0x63, 0x68, 0x2f, 0x73, 0x79, 0x73, 0x5f, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x62, 0x69, 0x6e, 0x5f, 0x74, 0x2e, - 0x63, 0x00, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x75, 0x61, 0x72, 0x74, - 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x2e, 0x2e, 0x0a, 0x00, 0x64, 0x65, - 0x62, 0x75, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5f, 0x74, 0x65, - 0x73, 0x74, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x5f, 0x74, 0x65, 0x73, - 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x32, 0x38, 0x20, - 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x32, 0x39, 0x20, 0x30, 0x78, 0x25, 0x78, - 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x33, 0x30, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x31, 0x35, 0x20, - 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x33, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x34, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x35, 0x20, 0x30, - 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x36, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x37, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x38, 0x20, 0x30, - 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x39, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x31, 0x30, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x30, 0x20, 0x30, - 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x31, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x32, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x33, 0x31, 0x20, - 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x50, 0x53, 0x57, 0x20, 0x30, 0x78, 0x25, 0x78, - 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x50, 0x43, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x44, 0x2e, 0x53, 0x20, 0x44, 0x3a, 0x30, 0x78, - 0x25, 0x78, 0x20, 0x25, 0x25, 0x4c, 0x45, 0x20, 0x25, 0x25, 0x4c, 0x4f, - 0x4e, 0x47, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x50, 0x43, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x50, 0x53, 0x57, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x32, 0x38, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x32, 0x39, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x33, 0x30, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x31, 0x35, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x33, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x34, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x35, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x36, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x37, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x38, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x39, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x31, 0x30, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x30, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x31, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x32, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x4e, 0x75, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x6e, - 0x62, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x0a, 0x00, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x20, 0x20, 0x25, 0x64, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x25, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x25, 0x64, 0x20, 0x30, 0x78, 0x25, 0x78, 0x20, 0x20, 0x20, - 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x79, - 0x20, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x20, 0x62, 0x72, - 0x65, 0x61, 0x6b, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x6f, 0x75, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x20, - 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x69, - 0x73, 0x20, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x69, - 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x65, 0x62, - 0x75, 0x67, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, - 0x73, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x78, - 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x4e, 0x6f, 0x20, 0x42, 0x50, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x5b, 0x44, 0x49, 0x5d, 0x20, 0x73, - 0x65, 0x6e, 0x64, 0x5f, 0x77, 0x6d, 0x74, 0x5f, 0x63, 0x6d, 0x64, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0xcc, 0x1b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, - 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7622_firmware_e2.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7622_firmware_e2.h deleted file mode 100644 index 0e5558460e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7622_firmware_e2.h +++ /dev/null @@ -1,25031 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR MT7622_FirmwareImage_E2[] = { - 0xf9, 0xce, 0x67, 0x00, 0xd4, 0x1f, 0xaf, 0x5e, 0x8a, 0xc2, 0xf9, 0x99, - 0x10, 0xcd, 0x29, 0xa6, 0xa4, 0x4c, 0x1c, 0x77, 0x28, 0x9d, 0x99, 0x65, - 0xba, 0x65, 0x61, 0xf3, 0xdc, 0xc6, 0x45, 0x20, 0xe0, 0x08, 0xf4, 0x60, - 0x9a, 0xd6, 0xc9, 0xd1, 0x44, 0x66, 0x77, 0xa3, 0x37, 0xa0, 0xb7, 0x91, - 0x13, 0x14, 0xb0, 0xa8, 0xc2, 0x85, 0x21, 0x26, 0xc5, 0xb1, 0xcc, 0xf4, - 0x38, 0x6f, 0xad, 0xa3, 0x48, 0xe1, 0x57, 0xb8, 0x6b, 0xc8, 0x19, 0x3c, - 0x10, 0x02, 0xd7, 0x08, 0x53, 0x10, 0x36, 0x38, 0xba, 0x54, 0xc2, 0x37, - 0x28, 0x27, 0xf7, 0xd6, 0x5f, 0xee, 0x0c, 0x65, 0xef, 0xba, 0x53, 0x7b, - 0xfd, 0x66, 0x0c, 0x6d, 0xdc, 0xbe, 0xeb, 0xe2, 0x33, 0xb3, 0xd3, 0x31, - 0x2a, 0xcb, 0xe7, 0x59, 0x12, 0x4d, 0xf4, 0x90, 0x94, 0xe4, 0xf9, 0xd7, - 0x90, 0xc6, 0x0e, 0x6c, 0x59, 0x42, 0x4a, 0xb8, 0x76, 0x58, 0x73, 0x56, - 0xd4, 0x07, 0x7f, 0x51, 0x4d, 0x96, 0x6b, 0x19, 0xeb, 0xb7, 0x1b, 0x35, - 0x5b, 0x1e, 0x9b, 0x19, 0x10, 0x9a, 0xeb, 0x03, 0x8b, 0x97, 0x31, 0x70, - 0x92, 0x6d, 0x9c, 0x80, 0x22, 0x6e, 0x53, 0x84, 0x36, 0xc2, 0xae, 0x49, - 0x28, 0xe0, 0x43, 0x36, 0x3b, 0xd5, 0xd0, 0x9a, 0x44, 0x81, 0x11, 0x5f, - 0x7a, 0xc1, 0x19, 0x4c, 0xfd, 0x46, 0x4f, 0x00, 0x65, 0x27, 0x19, 0xa2, - 0x5c, 0xf5, 0xa6, 0x7f, 0x3a, 0xbd, 0x7e, 0x2a, 0xbd, 0xf8, 0x6b, 0xd5, - 0x58, 0xbc, 0xb3, 0x5b, 0xef, 0xdd, 0xeb, 0x6c, 0x43, 0xd8, 0x2f, 0x6a, - 0xff, 0x56, 0x27, 0x4b, 0x9b, 0xba, 0xd2, 0x2b, 0x5d, 0x78, 0xee, 0x17, - 0x81, 0x67, 0x72, 0x6d, 0x7e, 0x5a, 0xac, 0x6a, 0x2a, 0x9e, 0x6f, 0xea, - 0x89, 0x06, 0x4f, 0xd5, 0x25, 0xfe, 0x5c, 0xf7, 0xe0, 0x60, 0x69, 0x88, - 0x33, 0x16, 0x69, 0x2f, 0x3a, 0x6e, 0x54, 0x0c, 0xac, 0xc4, 0xfd, 0x8f, - 0x33, 0xff, 0xc5, 0x92, 0x68, 0x53, 0x6b, 0xd3, 0x2a, 0xd7, 0x80, 0x00, - 0xbf, 0x9c, 0x4b, 0x77, 0x1f, 0xaa, 0xdd, 0xa4, 0xb8, 0x46, 0x9c, 0x5c, - 0x5b, 0x72, 0x58, 0x57, 0x8b, 0xed, 0xf8, 0xb8, 0x9c, 0x39, 0x40, 0x5f, - 0x2a, 0x2e, 0x4f, 0xec, 0x7b, 0x3a, 0x7d, 0x0b, 0x8d, 0xb6, 0xd3, 0x12, - 0x28, 0xdc, 0x98, 0x1e, 0x8e, 0xb4, 0x18, 0x7e, 0x2c, 0xd2, 0x1c, 0xea, - 0x62, 0x2b, 0x54, 0x96, 0xd9, 0x89, 0x87, 0xd2, 0xbb, 0xa5, 0xb8, 0x64, - 0x6a, 0x14, 0x1c, 0x64, 0x06, 0xa9, 0x05, 0xb8, 0x99, 0x6a, 0x83, 0xcf, - 0xb7, 0x0a, 0xed, 0x7d, 0xa5, 0xe6, 0xc4, 0x7c, 0x22, 0xe3, 0x02, 0xc7, - 0x7b, 0x80, 0x8c, 0x0c, 0x08, 0x49, 0xdd, 0xd6, 0xd2, 0xfd, 0x42, 0x6f, - 0x34, 0x8d, 0x89, 0xcf, 0x26, 0xa7, 0xeb, 0xc2, 0x81, 0x6f, 0xdc, 0xe3, - 0x4a, 0x00, 0xcb, 0xb6, 0x47, 0x94, 0xbc, 0x72, 0x76, 0x8c, 0xac, 0x9a, - 0x08, 0x91, 0x63, 0x58, 0x19, 0xe6, 0x8f, 0xba, 0x0f, 0x39, 0x1a, 0xae, - 0x59, 0xb6, 0x92, 0xc4, 0x53, 0xa6, 0x38, 0x46, 0x9e, 0xa2, 0x21, 0xa3, - 0xbb, 0x69, 0xaa, 0xd1, 0x91, 0xb9, 0x81, 0x18, 0x1d, 0xf7, 0xff, 0xbf, - 0x10, 0x92, 0xae, 0x1d, 0x13, 0x5a, 0xa8, 0xf8, 0x1e, 0x76, 0xef, 0x61, - 0x12, 0x4a, 0x58, 0xac, 0x3a, 0x42, 0xa1, 0x84, 0x3d, 0x2b, 0x09, 0xd3, - 0x32, 0xb7, 0x47, 0xb0, 0xfb, 0x51, 0x58, 0x75, 0xc5, 0x04, 0x04, 0x42, - 0xdc, 0x10, 0x8f, 0xa9, 0xe9, 0x8e, 0x8d, 0x0b, 0xe4, 0x66, 0x24, 0xb4, - 0xbc, 0x06, 0xf1, 0xea, 0xb6, 0x79, 0x2a, 0xa5, 0x22, 0x08, 0x79, 0x8b, - 0xf1, 0xb5, 0xbd, 0xe6, 0x2c, 0x94, 0x68, 0xcd, 0x2c, 0x46, 0xa4, 0xe8, - 0x6d, 0x9c, 0x31, 0x13, 0x27, 0xf8, 0x3f, 0x6d, 0x5f, 0x58, 0xf0, 0xde, - 0x5a, 0x32, 0x3d, 0x56, 0x4b, 0x5d, 0xa5, 0xf0, 0xc6, 0x45, 0x41, 0xb1, - 0x8f, 0xd2, 0xcd, 0xee, 0x88, 0x7c, 0x91, 0x05, 0xbd, 0xe3, 0xc8, 0x88, - 0x04, 0xf8, 0x18, 0xe7, 0xf9, 0xa0, 0x5f, 0x25, 0x05, 0x29, 0x0c, 0xab, - 0x42, 0xf9, 0x2f, 0x80, 0x0a, 0x1b, 0xba, 0x71, 0x29, 0x15, 0x4c, 0x60, - 0x6a, 0x21, 0x00, 0x99, 0xc4, 0xf0, 0x7c, 0x20, 0xdc, 0x16, 0xb0, 0x7b, - 0xd2, 0xbd, 0x6a, 0xad, 0x54, 0x6a, 0x9d, 0xb6, 0x6a, 0x7e, 0xd9, 0x0b, - 0x49, 0xe3, 0xe3, 0x1f, 0xd3, 0xf9, 0x69, 0xd5, 0x51, 0xab, 0x67, 0x37, - 0xf1, 0x67, 0xd0, 0x35, 0x9b, 0xa5, 0x98, 0x3c, 0x5c, 0x0b, 0x79, 0x96, - 0xaf, 0xf1, 0xae, 0xdc, 0xfb, 0x28, 0x35, 0x94, 0xd0, 0xf2, 0x24, 0x14, - 0xbc, 0x3b, 0xc0, 0xea, 0x60, 0x20, 0x03, 0x35, 0x95, 0x46, 0xc9, 0xe5, - 0xb7, 0x23, 0x5a, 0xd0, 0xd8, 0xf7, 0xbb, 0x7a, 0xd0, 0x3d, 0x16, 0xfa, - 0xa3, 0xc5, 0x0e, 0xc0, 0x78, 0x54, 0x53, 0xb2, 0xfc, 0x22, 0x16, 0x94, - 0xb3, 0x15, 0xfe, 0xa3, 0x4b, 0xc6, 0x6c, 0x99, 0x94, 0x7a, 0x30, 0x0a, - 0xba, 0xbd, 0x05, 0x51, 0x60, 0xa0, 0x79, 0x5a, 0x4e, 0xb6, 0xdc, 0x4f, - 0xdd, 0x01, 0xc7, 0x7a, 0x34, 0x18, 0x52, 0xb9, 0x97, 0xa6, 0x21, 0x28, - 0x6b, 0x8d, 0x45, 0x9f, 0x57, 0x4c, 0x86, 0xa1, 0x64, 0xf7, 0xe1, 0x7d, - 0x60, 0xef, 0xd1, 0xa6, 0x06, 0x54, 0x9e, 0xc6, 0xeb, 0x2a, 0x42, 0xca, - 0xf8, 0xa3, 0x8c, 0x5d, 0x6d, 0x6e, 0x16, 0x29, 0x42, 0x8a, 0x83, 0xd8, - 0x3b, 0xa7, 0x85, 0x87, 0x04, 0xef, 0xec, 0xaa, 0xb4, 0x7c, 0xbf, 0x93, - 0xdb, 0xfb, 0x52, 0x06, 0x6c, 0xfd, 0x40, 0x12, 0x4c, 0x0d, 0xa8, 0xec, - 0xf1, 0x6a, 0x08, 0xce, 0x5d, 0x7e, 0x6e, 0x24, 0xaa, 0x8f, 0x63, 0x66, - 0x20, 0xb8, 0x28, 0xca, 0xad, 0xdd, 0x67, 0x1d, 0xd2, 0x68, 0x0c, 0x85, - 0x6e, 0x5d, 0x5f, 0xdd, 0x7b, 0x55, 0xcd, 0x2d, 0xbb, 0x38, 0x0d, 0xcd, - 0x1e, 0x59, 0x3c, 0x05, 0x65, 0x92, 0xc9, 0x7f, 0x03, 0x44, 0x16, 0xa3, - 0x88, 0x17, 0x75, 0x93, 0x60, 0x97, 0x97, 0x71, 0x36, 0x53, 0xa8, 0x75, - 0xae, 0x36, 0xe3, 0x55, 0x91, 0xa7, 0x4f, 0x6c, 0x8d, 0x05, 0x5f, 0x92, - 0x14, 0xf2, 0x14, 0x11, 0xd5, 0x86, 0xa0, 0x93, 0x54, 0xe1, 0x25, 0xa6, - 0x64, 0xe5, 0x1c, 0x2c, 0x4d, 0xd3, 0xd2, 0xd2, 0xec, 0xe5, 0x38, 0xb0, - 0x0a, 0x90, 0xf6, 0x61, 0xf2, 0x47, 0x68, 0xfe, 0xf9, 0x65, 0x41, 0x0b, - 0xd5, 0xf0, 0xfc, 0xe7, 0x62, 0xf5, 0xe7, 0xd4, 0x89, 0x8e, 0xde, 0x73, - 0x0e, 0x9e, 0x00, 0x42, 0xc5, 0xfe, 0xe6, 0x22, 0x57, 0x24, 0x3c, 0xca, - 0xe9, 0x61, 0x5b, 0xc3, 0x9b, 0xb5, 0x18, 0x3a, 0xea, 0x2f, 0x95, 0xf9, - 0x9b, 0xa3, 0x79, 0x07, 0xa1, 0x64, 0x8c, 0x50, 0x80, 0xc6, 0x4c, 0x86, - 0x70, 0xcb, 0x44, 0xc0, 0x57, 0x52, 0xad, 0x67, 0xa8, 0xd0, 0x6c, 0x68, - 0xe9, 0xbf, 0x60, 0x8a, 0x6c, 0x15, 0x11, 0xbd, 0x38, 0xc8, 0xbe, 0x0a, - 0xf9, 0x3f, 0x4f, 0x6c, 0xac, 0x7a, 0x4d, 0x2f, 0xec, 0x80, 0xf5, 0xa7, - 0x13, 0x13, 0x54, 0x25, 0x22, 0x12, 0x92, 0xe4, 0xd7, 0x06, 0xd4, 0x0f, - 0x0c, 0x3a, 0x93, 0x6c, 0x24, 0x04, 0x29, 0x9f, 0x31, 0x88, 0x36, 0xb3, - 0xbf, 0xaa, 0xef, 0xf8, 0x64, 0x6f, 0x77, 0xb0, 0x49, 0xfd, 0xc6, 0xcb, - 0x62, 0x91, 0x35, 0x41, 0x89, 0x69, 0xf0, 0x3e, 0xd1, 0x1f, 0xba, 0xc7, - 0x5c, 0xf7, 0x54, 0xaa, 0x79, 0x0f, 0xe4, 0xf0, 0xc5, 0x98, 0xb2, 0x54, - 0x11, 0x8c, 0x1d, 0xb8, 0x41, 0xd7, 0x6d, 0x85, 0x77, 0x6a, 0x73, 0x09, - 0xb4, 0x34, 0xa3, 0xed, 0xf8, 0x5c, 0x31, 0xa4, 0x5b, 0x6b, 0xc4, 0xf9, - 0xb5, 0x7c, 0x3e, 0x84, 0xd7, 0xb2, 0xbe, 0x6f, 0x72, 0x92, 0x29, 0x46, - 0x89, 0xaa, 0xae, 0xd6, 0x6b, 0x9d, 0xc5, 0x9f, 0x57, 0x4c, 0x86, 0xa1, - 0x57, 0x10, 0xfc, 0x42, 0xcf, 0x4d, 0xed, 0x62, 0x47, 0x5f, 0x86, 0xf0, - 0x6c, 0x97, 0xb0, 0xd7, 0x4c, 0x65, 0x70, 0xfd, 0x2e, 0x8a, 0x62, 0x59, - 0xba, 0x1a, 0xb2, 0x91, 0xd3, 0xae, 0x58, 0x3e, 0x26, 0x52, 0x3f, 0x94, - 0xb0, 0xf8, 0x21, 0xd1, 0x0c, 0xda, 0x9d, 0xef, 0xb1, 0x51, 0x9c, 0xc9, - 0xf3, 0xd5, 0xc5, 0xad, 0x7e, 0x20, 0x26, 0xf2, 0x23, 0x06, 0x60, 0x1d, - 0xbb, 0x25, 0xf7, 0x9c, 0x54, 0xfb, 0xf0, 0x7e, 0xfe, 0x40, 0x86, 0x64, - 0x15, 0x51, 0xd2, 0xec, 0x54, 0x0d, 0x77, 0x91, 0x5f, 0x03, 0x13, 0xdb, - 0xf1, 0x99, 0x68, 0x98, 0x1f, 0xaa, 0x67, 0xb8, 0x71, 0xf4, 0x10, 0x8f, - 0xb7, 0xfd, 0xef, 0xda, 0x94, 0xf9, 0x08, 0xbf, 0xbe, 0x35, 0x34, 0x92, - 0xe4, 0x42, 0x7a, 0xfb, 0x5e, 0xe4, 0xea, 0x43, 0xbe, 0xf8, 0x46, 0x24, - 0xe8, 0xe5, 0xe3, 0xd1, 0x2b, 0xa4, 0x03, 0x1b, 0x28, 0x02, 0x68, 0x1a, - 0xcc, 0x82, 0x4a, 0xf7, 0x0c, 0x6c, 0x54, 0xe5, 0x18, 0xd5, 0x39, 0xcc, - 0xc6, 0xcb, 0xff, 0xa7, 0x5b, 0x7b, 0xc4, 0xf9, 0xb5, 0x79, 0x12, 0x84, - 0xd7, 0xb2, 0xbe, 0x6f, 0x72, 0x92, 0x29, 0x46, 0x89, 0xaa, 0xae, 0xd6, - 0x6b, 0x9d, 0xc5, 0x9f, 0x57, 0x4c, 0x86, 0xa1, 0xdd, 0x84, 0x24, 0x69, - 0x8a, 0x26, 0xf4, 0xab, 0xf0, 0xdc, 0xd7, 0x1b, 0xcb, 0x3e, 0x64, 0xb4, - 0xe4, 0xff, 0x80, 0x50, 0x41, 0x30, 0xf9, 0xe3, 0xa8, 0xc3, 0x37, 0x80, - 0x18, 0x3b, 0x8d, 0xc5, 0x4a, 0xfe, 0xfa, 0xe5, 0xba, 0x95, 0x12, 0x70, - 0x5e, 0x32, 0xf4, 0xdb, 0x4e, 0x98, 0x1f, 0x6d, 0x58, 0x23, 0x16, 0xba, - 0xb2, 0x39, 0x7a, 0x89, 0x23, 0xb9, 0x3f, 0xd7, 0xb0, 0x30, 0x73, 0x70, - 0x1a, 0xd0, 0xf7, 0xfb, 0xd0, 0xd8, 0x76, 0xd2, 0x98, 0x3b, 0x34, 0x28, - 0x2a, 0x08, 0xef, 0x1a, 0x84, 0x35, 0x94, 0xcd, 0x24, 0x54, 0x81, 0xfd, - 0x01, 0x4d, 0xf9, 0x80, 0x7b, 0x5e, 0xf2, 0x1d, 0xfd, 0x3c, 0x79, 0x59, - 0x5c, 0x0e, 0xc1, 0x3b, 0x2c, 0xd4, 0xe6, 0x72, 0x58, 0xb7, 0x3a, 0xca, - 0x60, 0x44, 0x87, 0x30, 0xaf, 0xee, 0xae, 0xbc, 0x34, 0x8c, 0xc8, 0x3e, - 0x85, 0x78, 0x59, 0xeb, 0xdf, 0x26, 0xbb, 0x2d, 0xfb, 0x3e, 0x50, 0xdf, - 0xee, 0x91, 0xb8, 0x35, 0xf8, 0x85, 0x0b, 0x5f, 0x5f, 0xcf, 0x9d, 0x1c, - 0xb1, 0x9c, 0xf0, 0xfe, 0x38, 0xa0, 0xc1, 0x24, 0x4e, 0x9e, 0xf7, 0x7c, - 0x5d, 0xf3, 0x14, 0xf7, 0xdd, 0x88, 0x00, 0x48, 0x83, 0xde, 0x9d, 0x8e, - 0xdd, 0x0d, 0xa6, 0x22, 0xd7, 0x48, 0x4d, 0xc7, 0x5f, 0x1d, 0x8b, 0x7c, - 0x5f, 0x2f, 0xb5, 0xeb, 0xeb, 0x10, 0xc7, 0xd2, 0x4a, 0xc6, 0x6b, 0x76, - 0x90, 0x44, 0xd8, 0xe6, 0x95, 0x6b, 0x37, 0x6e, 0xb5, 0x1b, 0xaf, 0x42, - 0xca, 0x1a, 0xe4, 0x77, 0x30, 0xa1, 0x75, 0x18, 0x95, 0x86, 0xaa, 0xba, - 0x4d, 0xd6, 0x1b, 0xc2, 0xea, 0x7a, 0xc5, 0x42, 0x18, 0x05, 0x3a, 0xdd, - 0xe0, 0x9c, 0xfc, 0xa9, 0xff, 0x4d, 0x57, 0xaf, 0x52, 0xae, 0x96, 0x71, - 0x8c, 0x62, 0xbd, 0x99, 0x62, 0xe1, 0xd8, 0x00, 0x29, 0x53, 0x88, 0x59, - 0x10, 0x56, 0x2a, 0xc1, 0x86, 0x10, 0x95, 0x1f, 0x99, 0x0f, 0x3b, 0x83, - 0x49, 0xfd, 0xf5, 0x7b, 0xa8, 0x0f, 0x01, 0xf5, 0x8b, 0x36, 0x28, 0xb6, - 0x8f, 0xac, 0xcf, 0xcc, 0x3d, 0x07, 0xb3, 0xed, 0x93, 0xea, 0xec, 0xa6, - 0x4b, 0x4f, 0xdd, 0xb4, 0x13, 0x27, 0x19, 0xf0, 0x27, 0x34, 0xc7, 0x90, - 0x00, 0xc8, 0x34, 0x0f, 0xce, 0xd7, 0x3b, 0x24, 0xcb, 0x98, 0x1d, 0x10, - 0xe0, 0xb3, 0x74, 0x43, 0xb2, 0x11, 0xb5, 0x28, 0xf0, 0xeb, 0x4c, 0x4f, - 0x1b, 0xf7, 0xc0, 0xfd, 0xf0, 0x61, 0x1a, 0x91, 0xeb, 0xaf, 0x7a, 0x50, - 0x4c, 0x6c, 0x9c, 0xfe, 0x74, 0xbf, 0x62, 0x18, 0x55, 0x58, 0xd1, 0xb9, - 0xd1, 0xe9, 0x22, 0x23, 0x44, 0x2c, 0x66, 0xc0, 0x17, 0xd7, 0xc8, 0xe1, - 0xe1, 0x74, 0xea, 0x42, 0xb0, 0x95, 0x27, 0xab, 0x91, 0x94, 0x42, 0xdb, - 0x5c, 0xdb, 0x76, 0x14, 0x41, 0x10, 0x07, 0xac, 0x22, 0xcf, 0x17, 0x67, - 0x8a, 0xd2, 0xda, 0x82, 0x2e, 0xb1, 0xe5, 0xc2, 0xd1, 0xa5, 0x63, 0x7e, - 0xf9, 0x6c, 0xcf, 0x59, 0xeb, 0x37, 0xfe, 0x97, 0x1a, 0xb4, 0x77, 0x6b, - 0xa7, 0x83, 0x2d, 0x51, 0x5f, 0xd4, 0x2f, 0xeb, 0xb6, 0x19, 0x1a, 0xbe, - 0xda, 0x2e, 0x93, 0xf6, 0x33, 0xf6, 0x3e, 0x93, 0x45, 0xf1, 0x83, 0xd0, - 0xc4, 0x8f, 0xe4, 0x91, 0xe8, 0x0d, 0x10, 0xbd, 0x2d, 0xa0, 0xcf, 0x6a, - 0xb8, 0xda, 0xbe, 0xcc, 0xfb, 0xe8, 0xce, 0x49, 0x30, 0x33, 0x66, 0x9f, - 0xd0, 0x72, 0xff, 0x1b, 0x8b, 0x14, 0x0b, 0x52, 0x2c, 0x0d, 0x3a, 0x8b, - 0xf4, 0x58, 0xa2, 0xa8, 0x51, 0x0e, 0xc1, 0x13, 0x77, 0x0a, 0xbc, 0xa2, - 0x48, 0xb3, 0x9a, 0x8f, 0xa5, 0x25, 0x17, 0xe1, 0x8f, 0x74, 0x31, 0xb7, - 0x49, 0x65, 0xc3, 0x77, 0x2f, 0xa2, 0x58, 0xe4, 0x08, 0x29, 0x14, 0x5c, - 0x24, 0x4e, 0x03, 0x89, 0x1c, 0x9e, 0x5a, 0xfc, 0x88, 0x57, 0xd8, 0xc6, - 0x98, 0x91, 0x3e, 0x38, 0xbb, 0xa9, 0x65, 0x4c, 0xd8, 0xdf, 0x66, 0x4c, - 0x2a, 0x81, 0x91, 0xd3, 0x95, 0xbd, 0x68, 0x4b, 0xbf, 0xf1, 0x05, 0x43, - 0xd4, 0x34, 0xfd, 0x7b, 0xca, 0x3c, 0x13, 0xfb, 0xa3, 0xe0, 0x44, 0xef, - 0xeb, 0xd8, 0xfa, 0x7e, 0x83, 0x7c, 0x7c, 0x3a, 0x7e, 0x46, 0xcc, 0x87, - 0x20, 0x01, 0xca, 0xc6, 0x5e, 0x06, 0xd1, 0x6a, 0x0c, 0x4a, 0xc4, 0x39, - 0xf3, 0x19, 0xb2, 0x96, 0x9a, 0x6a, 0xf3, 0x76, 0xd8, 0x0b, 0x7c, 0xd8, - 0xb8, 0xae, 0xa1, 0x72, 0xb6, 0xb7, 0x43, 0x17, 0x21, 0xeb, 0x23, 0x11, - 0x03, 0x18, 0xb0, 0xea, 0x23, 0x27, 0x27, 0x0d, 0x3a, 0xf8, 0x8a, 0x66, - 0xd1, 0x9e, 0xc4, 0x74, 0x3e, 0x6d, 0x3a, 0x19, 0xa5, 0x79, 0xab, 0x89, - 0x6c, 0x51, 0x7f, 0x74, 0x83, 0xc0, 0x4a, 0xf4, 0xba, 0xc5, 0x55, 0x82, - 0x48, 0x25, 0x5e, 0x3b, 0x2f, 0xb4, 0x52, 0x76, 0x57, 0x3e, 0x82, 0x10, - 0xba, 0xb3, 0x88, 0x47, 0xa4, 0xb2, 0x3b, 0x2a, 0x7d, 0x40, 0x92, 0x3b, - 0x9b, 0xf0, 0xd2, 0xc0, 0xb5, 0x3c, 0x58, 0x90, 0x65, 0x41, 0xdc, 0x4f, - 0xf6, 0xa0, 0x17, 0x82, 0xa3, 0x31, 0x44, 0x74, 0xbb, 0xe9, 0x36, 0xf6, - 0x9c, 0xd3, 0x17, 0x54, 0xcf, 0xad, 0x9c, 0x46, 0x30, 0xaf, 0xc9, 0xae, - 0x27, 0x19, 0xbf, 0x80, 0xd6, 0xe2, 0xfa, 0x72, 0xab, 0x1f, 0x78, 0xc4, - 0xaf, 0x0b, 0x28, 0xae, 0x58, 0xea, 0x12, 0x02, 0x07, 0xe7, 0xfe, 0x61, - 0xf4, 0xae, 0x09, 0x22, 0xed, 0x62, 0xf1, 0x45, 0xae, 0x79, 0xeb, 0xbd, - 0x0c, 0xc2, 0x4d, 0x6e, 0x30, 0x8e, 0x17, 0xdf, 0x73, 0xc6, 0xeb, 0x80, - 0x91, 0x6f, 0x4a, 0x76, 0xd1, 0xd3, 0xef, 0x49, 0x6c, 0xe7, 0x5f, 0xcc, - 0x4a, 0xb8, 0xd9, 0xfe, 0x34, 0x94, 0xb9, 0x62, 0x4e, 0x3b, 0xb2, 0xb3, - 0x9e, 0xd5, 0x15, 0x41, 0xa4, 0x52, 0x00, 0xcb, 0x9d, 0xe7, 0x8f, 0xa6, - 0x15, 0x27, 0x3d, 0x43, 0xdb, 0xba, 0x7a, 0x7d, 0x87, 0x41, 0x14, 0x3c, - 0x72, 0x31, 0x6e, 0x06, 0xa3, 0xed, 0x6a, 0x9c, 0x18, 0x48, 0xfb, 0xe6, - 0x9d, 0x1c, 0xf8, 0x1e, 0x06, 0x1a, 0x3d, 0x1c, 0x2c, 0x63, 0x4e, 0x24, - 0x12, 0x1d, 0x38, 0x75, 0x8e, 0x4a, 0x26, 0xa7, 0xa3, 0x7e, 0xa6, 0xb6, - 0xf9, 0x88, 0x91, 0x21, 0x15, 0xcc, 0x9a, 0x06, 0x41, 0x9c, 0x3c, 0x02, - 0x61, 0xb9, 0x7e, 0x17, 0xa6, 0xc1, 0x87, 0x54, 0x70, 0x2b, 0x78, 0x32, - 0xa8, 0xb6, 0x8f, 0xa6, 0xef, 0x31, 0x8d, 0x8d, 0x14, 0x03, 0x56, 0xd5, - 0xfe, 0x31, 0x79, 0xa9, 0xbe, 0xc7, 0xd6, 0x50, 0xd9, 0xae, 0xe6, 0xbe, - 0x0e, 0x48, 0xf5, 0x7a, 0xdc, 0x0d, 0x31, 0xb7, 0xde, 0x60, 0xad, 0xda, - 0x4d, 0xf2, 0x06, 0xa4, 0x22, 0x44, 0xcd, 0x38, 0xd2, 0xfd, 0x9c, 0x6d, - 0xdf, 0x30, 0x5b, 0xc5, 0x88, 0x56, 0x96, 0x6d, 0x02, 0x27, 0x25, 0x89, - 0xf5, 0x6e, 0xef, 0xcf, 0x0e, 0x2e, 0xd7, 0x5d, 0x21, 0x4f, 0x50, 0x34, - 0xfd, 0xd8, 0x90, 0x2c, 0xe1, 0xf4, 0x51, 0xf5, 0xaf, 0x67, 0x6f, 0xf6, - 0x36, 0x75, 0x41, 0x62, 0x0b, 0x13, 0x01, 0x5e, 0xe9, 0xf0, 0x85, 0xb0, - 0x58, 0x08, 0xe7, 0xe8, 0x64, 0x75, 0x90, 0x0a, 0x5d, 0xff, 0x87, 0x66, - 0xd8, 0xa1, 0x39, 0x3f, 0x5e, 0xab, 0x47, 0x00, 0xe5, 0xb6, 0x52, 0xba, - 0x0f, 0x0b, 0xee, 0x6f, 0x8b, 0xe9, 0xca, 0x1f, 0x7c, 0x75, 0x64, 0x28, - 0x0a, 0xec, 0x80, 0x65, 0xcb, 0xbd, 0xc2, 0xe6, 0x0e, 0x22, 0xba, 0x32, - 0x42, 0xbf, 0xfe, 0x1e, 0x35, 0x19, 0x76, 0xae, 0xc4, 0xfa, 0x02, 0x47, - 0xac, 0xaa, 0x57, 0x28, 0x10, 0xa2, 0x5f, 0x37, 0xd9, 0xa5, 0xcb, 0xc0, - 0x1a, 0x82, 0xf2, 0xa0, 0xe2, 0x7c, 0xd7, 0x31, 0x4f, 0xa5, 0x0a, 0xdb, - 0xf9, 0x36, 0x3b, 0x2d, 0x1d, 0x1c, 0x2e, 0x8f, 0xa4, 0x6b, 0x0c, 0x6f, - 0xc0, 0xc1, 0xb1, 0x2f, 0xf9, 0x9a, 0x34, 0x0e, 0x19, 0xae, 0xe5, 0xfa, - 0xea, 0xa2, 0x4f, 0x47, 0x9b, 0xd7, 0x01, 0x1b, 0x66, 0xd0, 0x55, 0xe3, - 0xe4, 0x60, 0xbf, 0x6a, 0x71, 0x0b, 0x06, 0x84, 0x66, 0x31, 0x8d, 0x09, - 0xab, 0x46, 0xc5, 0x97, 0x1a, 0x01, 0x5e, 0x88, 0x6c, 0x21, 0xb0, 0x66, - 0x65, 0xd6, 0xa8, 0x8e, 0x0a, 0x7b, 0x11, 0xca, 0x56, 0x4e, 0x83, 0x6e, - 0xb4, 0x0d, 0xdc, 0xe1, 0xd3, 0x3f, 0x25, 0x79, 0xed, 0x2b, 0x8c, 0x11, - 0x70, 0xaa, 0x6c, 0xe8, 0xf9, 0x9b, 0xa4, 0xa4, 0x87, 0x93, 0x1a, 0xdd, - 0xd0, 0x2b, 0x9a, 0xa6, 0xc5, 0x8f, 0xd0, 0x53, 0xd4, 0x3f, 0xdc, 0x61, - 0x3b, 0xd8, 0xc5, 0xdd, 0x8e, 0x86, 0xd8, 0xe3, 0x37, 0x65, 0x0a, 0xb9, - 0xb3, 0x96, 0x6c, 0x81, 0xb6, 0x9e, 0x47, 0x57, 0x3c, 0x2d, 0x89, 0xd5, - 0x5d, 0x6d, 0xaf, 0x5e, 0x1a, 0xdd, 0x31, 0xf2, 0xe3, 0xe3, 0x8b, 0x72, - 0x38, 0xac, 0x94, 0x38, 0x3a, 0x91, 0x8f, 0xf5, 0x0d, 0xf9, 0x86, 0xba, - 0xb8, 0x4d, 0xc4, 0x7e, 0xb0, 0xeb, 0x90, 0x7b, 0x1c, 0x5b, 0xfc, 0x6f, - 0x6e, 0xbc, 0x2e, 0x3f, 0x30, 0x11, 0xce, 0xb0, 0xab, 0xc9, 0x69, 0x96, - 0xb7, 0x17, 0x4c, 0xbf, 0xcf, 0x8f, 0xc6, 0x1a, 0xbe, 0xe3, 0x31, 0x72, - 0x52, 0x82, 0x14, 0x1d, 0xe8, 0xc2, 0x81, 0x25, 0x0f, 0x55, 0xab, 0x06, - 0x66, 0x74, 0x1b, 0x6d, 0xb5, 0x02, 0x9c, 0x3a, 0x9c, 0x53, 0x4d, 0xf2, - 0x1a, 0xde, 0x9b, 0x1c, 0x61, 0x50, 0x9c, 0x1c, 0x83, 0x41, 0x2c, 0xd0, - 0x56, 0xc0, 0x5d, 0x01, 0x75, 0x9f, 0x06, 0x3a, 0x70, 0x69, 0x2a, 0xd7, - 0x93, 0x94, 0xde, 0x90, 0xdd, 0x68, 0x8a, 0x14, 0x02, 0x83, 0x6f, 0xb1, - 0xe0, 0x22, 0x4f, 0xcd, 0x62, 0xd3, 0x1c, 0x6f, 0xc8, 0x8b, 0x4e, 0x5b, - 0x83, 0x19, 0x51, 0xb0, 0xa4, 0x48, 0x02, 0x1a, 0x32, 0x1b, 0xff, 0xa1, - 0x8a, 0xb0, 0x2f, 0x07, 0xc4, 0xed, 0x74, 0xd1, 0xa8, 0x5d, 0x7a, 0x9d, - 0xa9, 0xdf, 0x52, 0x73, 0xd6, 0x27, 0x6f, 0x8f, 0x3e, 0x97, 0xcd, 0x6a, - 0xed, 0xfa, 0x85, 0x19, 0x52, 0xac, 0x4c, 0x0f, 0x31, 0x8a, 0x13, 0xa6, - 0x42, 0xc6, 0x6a, 0x58, 0x21, 0x7c, 0x6a, 0xa8, 0xd0, 0x12, 0x90, 0x06, - 0x28, 0xe4, 0x4c, 0x07, 0xd1, 0x70, 0xf6, 0xb6, 0xd8, 0x41, 0xbf, 0x2b, - 0xb0, 0xb2, 0x6b, 0x81, 0x97, 0x9e, 0xd5, 0xe4, 0xec, 0x8e, 0x39, 0x19, - 0x8c, 0x1f, 0xfe, 0xe2, 0x75, 0x8b, 0x48, 0x3b, 0x89, 0x27, 0x66, 0xef, - 0x8e, 0x12, 0xfc, 0x75, 0x05, 0x97, 0xdd, 0x3c, 0x22, 0x98, 0xa3, 0x18, - 0x59, 0xa5, 0x93, 0x31, 0xc6, 0xfb, 0x17, 0x2e, 0xc6, 0xf2, 0xba, 0xe8, - 0x67, 0x42, 0x8e, 0xd1, 0x13, 0x3f, 0x3c, 0x36, 0xdd, 0x13, 0x0d, 0x51, - 0x31, 0xd9, 0xb4, 0x18, 0x43, 0xf5, 0x3c, 0x94, 0xf7, 0x6e, 0x2f, 0xef, - 0x4e, 0xb7, 0xc7, 0x0f, 0xfc, 0xfa, 0x66, 0x11, 0xa8, 0x9f, 0xda, 0x6c, - 0xe9, 0x1e, 0x8d, 0x5c, 0x4c, 0x4d, 0x27, 0x7b, 0x26, 0x05, 0x58, 0xac, - 0xe3, 0xb4, 0x58, 0x1f, 0xb8, 0xd0, 0x02, 0x41, 0xe6, 0x0c, 0xf8, 0x29, - 0x21, 0x30, 0xaf, 0x5b, 0x41, 0xa4, 0xba, 0x07, 0x2b, 0x29, 0x91, 0x35, - 0xb2, 0x2c, 0xb1, 0x10, 0xd7, 0xf7, 0xe5, 0xa8, 0xef, 0x82, 0x1e, 0x09, - 0xea, 0x58, 0x64, 0xe0, 0x33, 0x40, 0xfc, 0x03, 0x05, 0x02, 0x45, 0x3b, - 0x71, 0x75, 0x90, 0xfe, 0xad, 0xd1, 0x61, 0x80, 0xfb, 0x00, 0x53, 0xd4, - 0x00, 0xcc, 0xb4, 0x4d, 0x78, 0x2e, 0x9d, 0x81, 0x8e, 0x06, 0xbf, 0xfa, - 0xbc, 0xc7, 0x76, 0x29, 0xa7, 0x60, 0x6d, 0x01, 0xe4, 0x21, 0xe1, 0x42, - 0xe3, 0x7a, 0x25, 0xbe, 0xf6, 0xdd, 0xf4, 0xfe, 0xab, 0xb9, 0x7b, 0x20, - 0xcb, 0x8a, 0xbb, 0x9a, 0xf0, 0x5c, 0x6a, 0x8b, 0x50, 0xef, 0xa7, 0x69, - 0x88, 0xbc, 0x18, 0xfa, 0x2d, 0x7a, 0xf3, 0xcf, 0x87, 0x02, 0xe0, 0xae, - 0xef, 0xc9, 0xe7, 0x51, 0xf1, 0x2b, 0x4a, 0x81, 0xa8, 0xc8, 0x39, 0x23, - 0x4a, 0xc1, 0x1d, 0xd5, 0xf2, 0xb6, 0x72, 0x20, 0x20, 0x59, 0x65, 0x1f, - 0x97, 0x56, 0x2e, 0xe9, 0x3d, 0xa8, 0xd6, 0xd7, 0x0e, 0xa2, 0xae, 0x24, - 0x6d, 0x14, 0x23, 0x52, 0xbd, 0x7a, 0x7e, 0xaa, 0x09, 0x39, 0xdb, 0x15, - 0xf0, 0xcf, 0xea, 0xd6, 0x22, 0xc3, 0xce, 0x80, 0x98, 0xd0, 0x69, 0x4c, - 0xaf, 0xed, 0xb1, 0x64, 0xfc, 0x54, 0xad, 0xbd, 0x26, 0xba, 0xe4, 0x5c, - 0x68, 0xd0, 0xf1, 0x2a, 0x7e, 0x0d, 0xbe, 0x73, 0xb4, 0x96, 0xd4, 0x98, - 0xfa, 0xfa, 0x09, 0xa8, 0x45, 0x35, 0x37, 0xae, 0x7f, 0x50, 0xe9, 0xbe, - 0xdf, 0x18, 0xbd, 0x22, 0x61, 0x6b, 0xf3, 0x43, 0x4a, 0x07, 0xf1, 0x00, - 0xe7, 0x2f, 0x28, 0xf8, 0x63, 0x83, 0xa0, 0x64, 0x15, 0x88, 0x1d, 0x5d, - 0x8d, 0x65, 0x01, 0xc3, 0x6b, 0xf4, 0x72, 0xa8, 0x1e, 0x60, 0x1b, 0xc0, - 0x72, 0x67, 0x7a, 0x16, 0x5e, 0xc0, 0x56, 0xad, 0x5e, 0x6d, 0x8d, 0xa8, - 0x49, 0x96, 0x9f, 0x9e, 0x40, 0x0d, 0xfd, 0xff, 0x87, 0x77, 0x53, 0x39, - 0xdd, 0x4d, 0x5e, 0x22, 0x55, 0xf3, 0x06, 0x6d, 0xe9, 0x13, 0x85, 0x71, - 0xf3, 0x27, 0x3b, 0xec, 0xd3, 0x8b, 0xeb, 0x5d, 0x74, 0xf4, 0xd8, 0x69, - 0xe6, 0x09, 0x1c, 0x84, 0x76, 0x9c, 0x39, 0xa0, 0xc6, 0x6f, 0x07, 0xd8, - 0x9a, 0x24, 0x51, 0x09, 0x79, 0xa4, 0x4e, 0x9e, 0x0a, 0xd7, 0x69, 0x73, - 0xf9, 0x63, 0x80, 0x56, 0x4c, 0x8e, 0xfc, 0x4e, 0x20, 0x5c, 0xcd, 0x30, - 0x10, 0x6d, 0x83, 0x9a, 0x66, 0xc9, 0xf9, 0xf7, 0x44, 0xc6, 0x9d, 0x71, - 0x2f, 0x17, 0x0b, 0x81, 0x70, 0x5b, 0xcc, 0x8a, 0xd2, 0x8e, 0xae, 0x2b, - 0x62, 0xc1, 0x38, 0xab, 0x50, 0x01, 0x14, 0x76, 0x89, 0x4b, 0xc0, 0x4f, - 0x09, 0x34, 0xf4, 0x1c, 0x1e, 0xf6, 0xb7, 0x16, 0xca, 0x4d, 0xf6, 0xa1, - 0x32, 0xbe, 0x0f, 0xdd, 0x68, 0x2b, 0x3e, 0x04, 0x99, 0x5f, 0x0f, 0x81, - 0xee, 0x0d, 0xa8, 0x15, 0x5a, 0x28, 0x33, 0x26, 0x32, 0x1e, 0xc3, 0x0b, - 0x12, 0x54, 0x38, 0x63, 0x5d, 0x63, 0x27, 0x0e, 0xb7, 0x42, 0x12, 0x5e, - 0x16, 0xa5, 0x6f, 0x45, 0xf0, 0x92, 0xe7, 0x2c, 0x75, 0xb3, 0x36, 0xe1, - 0xb0, 0x66, 0x40, 0xdc, 0x3c, 0x0d, 0x7a, 0xf6, 0x29, 0xfe, 0x6e, 0x6a, - 0x88, 0xf9, 0xe7, 0x14, 0xdd, 0xb4, 0x64, 0xda, 0xac, 0x0e, 0xb0, 0x49, - 0x5a, 0xee, 0x9c, 0x46, 0xa0, 0x1c, 0x6c, 0xa8, 0xc3, 0x55, 0xc8, 0xaf, - 0xa4, 0xc0, 0xee, 0x26, 0x91, 0x5a, 0xfd, 0xa8, 0x88, 0x6f, 0x14, 0xc2, - 0x04, 0x6f, 0x93, 0x5e, 0xef, 0xd7, 0x57, 0x31, 0x08, 0x60, 0x76, 0xac, - 0x85, 0x95, 0x3f, 0xc3, 0x97, 0x80, 0x45, 0xc1, 0x58, 0x34, 0xb2, 0x32, - 0xfa, 0xc6, 0x0f, 0xcb, 0x83, 0xb8, 0xe9, 0x0f, 0x40, 0xb2, 0xa9, 0xaa, - 0xa7, 0xcc, 0x3a, 0xe5, 0x2c, 0x6a, 0x5e, 0x31, 0xbd, 0x46, 0x9d, 0x04, - 0x52, 0x49, 0x5e, 0xc7, 0x94, 0x1c, 0x33, 0xee, 0xd1, 0xbf, 0x2d, 0xda, - 0xe9, 0x55, 0xa2, 0x18, 0x5e, 0xe8, 0xcc, 0xc9, 0xe7, 0xe8, 0x3e, 0x21, - 0x9f, 0x1c, 0x35, 0xa1, 0x3a, 0x5c, 0xdc, 0x04, 0x1b, 0x1d, 0x0b, 0x66, - 0x8b, 0x97, 0xee, 0x71, 0x8d, 0xc5, 0x50, 0x10, 0x7f, 0x72, 0x4d, 0x9b, - 0x64, 0xc2, 0x0a, 0xc0, 0x0c, 0x47, 0x67, 0xe0, 0xc8, 0x00, 0xe8, 0xc7, - 0x97, 0xe2, 0x88, 0x8a, 0x48, 0x2b, 0x3b, 0x0a, 0xba, 0xb4, 0x99, 0x23, - 0x8f, 0xb1, 0x25, 0x94, 0xfe, 0x6b, 0xee, 0xb8, 0x56, 0x6b, 0xbb, 0xd2, - 0xeb, 0x07, 0x46, 0x6e, 0x4d, 0xb3, 0xa3, 0x49, 0x29, 0xf5, 0xb5, 0xed, - 0xd3, 0x2c, 0x33, 0x4c, 0xb2, 0xcf, 0xaf, 0x32, 0xe9, 0x45, 0xea, 0x2a, - 0xc6, 0x22, 0x70, 0xa2, 0x69, 0x52, 0x79, 0x4a, 0x1e, 0xe8, 0x2a, 0x91, - 0x02, 0x3c, 0x97, 0x62, 0x29, 0x03, 0xc9, 0xd8, 0xc2, 0x2d, 0x06, 0xce, - 0x6b, 0xcb, 0xc9, 0xaf, 0x07, 0x8b, 0xb4, 0x96, 0x64, 0x87, 0x7c, 0x6f, - 0x9a, 0x05, 0xf7, 0xda, 0xf9, 0xdd, 0x9a, 0xfc, 0x93, 0xd6, 0xfe, 0xaa, - 0x67, 0xbb, 0xa8, 0x52, 0x85, 0x2f, 0xcc, 0xbe, 0x41, 0x42, 0x8b, 0x83, - 0x0c, 0x42, 0xf3, 0xb7, 0x72, 0x31, 0x04, 0x6c, 0x1c, 0x8f, 0xcb, 0xb4, - 0xde, 0x7f, 0x5a, 0xfd, 0xb2, 0xc6, 0xe3, 0xc3, 0xe5, 0xaa, 0xb0, 0x18, - 0x5f, 0x70, 0xd7, 0x87, 0x18, 0x32, 0x25, 0xb3, 0x67, 0x39, 0x3a, 0x72, - 0xaf, 0x93, 0xea, 0xf2, 0x7e, 0x83, 0xb2, 0x32, 0xbf, 0x5e, 0x4c, 0x45, - 0x86, 0xc0, 0x7a, 0x7c, 0xeb, 0xc7, 0x80, 0x3e, 0x31, 0xcf, 0xa3, 0x52, - 0x45, 0xf2, 0x0d, 0xf6, 0x7a, 0x27, 0x8e, 0x9a, 0xa7, 0x38, 0x40, 0x51, - 0xcc, 0xfc, 0xe2, 0x1f, 0x56, 0x7f, 0x5f, 0xcc, 0x99, 0x40, 0x62, 0x97, - 0xcd, 0xef, 0xf7, 0x7a, 0xc4, 0x80, 0x1a, 0x4f, 0x47, 0xfe, 0xb1, 0xf7, - 0x30, 0x1e, 0x2d, 0xd6, 0xfd, 0xad, 0xd1, 0x6b, 0x35, 0x4a, 0x81, 0x28, - 0x02, 0x30, 0x1a, 0xd4, 0xcb, 0xd6, 0xa3, 0x1f, 0x0d, 0xc3, 0xc8, 0x8d, - 0x4a, 0xda, 0x56, 0xb7, 0x29, 0xb8, 0x5d, 0x46, 0x28, 0xaa, 0x16, 0xf1, - 0x7e, 0x70, 0x58, 0xd9, 0xde, 0x9a, 0xa9, 0x8a, 0xe6, 0x75, 0xe8, 0x44, - 0x82, 0x1b, 0xbe, 0xd7, 0x4a, 0x52, 0xce, 0xb0, 0x4c, 0xd6, 0xe3, 0xb1, - 0xe3, 0x85, 0x32, 0x51, 0x42, 0xaf, 0x9b, 0x3c, 0x3a, 0x51, 0xc7, 0x5d, - 0xa4, 0x8c, 0x56, 0x63, 0x1e, 0x5d, 0xe0, 0x2c, 0xbb, 0x10, 0x18, 0x66, - 0x05, 0x0f, 0x8b, 0x54, 0xc1, 0xe0, 0x4b, 0xac, 0xc8, 0xd5, 0xfb, 0xe1, - 0xe9, 0x1d, 0x63, 0xe3, 0x1b, 0xdb, 0xc7, 0x50, 0x85, 0xd1, 0xff, 0x20, - 0xae, 0x2f, 0x37, 0x54, 0x92, 0x3b, 0x9d, 0x18, 0xcc, 0x6d, 0xe0, 0xe6, - 0xbb, 0x5f, 0x60, 0x53, 0xe2, 0x60, 0x7a, 0xb8, 0x77, 0x6f, 0xa6, 0x78, - 0x22, 0xac, 0x5d, 0x6c, 0x0a, 0xcc, 0x1b, 0xd2, 0x3e, 0x49, 0xfc, 0x15, - 0xc6, 0x16, 0x59, 0x85, 0x0e, 0x66, 0x44, 0xd9, 0xe5, 0xee, 0x16, 0x7f, - 0x64, 0xf9, 0x6f, 0xfb, 0x34, 0x74, 0xc8, 0xea, 0xd8, 0x42, 0xdb, 0x66, - 0x94, 0xff, 0xd6, 0x50, 0x9f, 0xeb, 0x9a, 0x18, 0x9d, 0xaa, 0xc9, 0xd0, - 0xbf, 0xb2, 0x39, 0xfa, 0xf5, 0x9a, 0xc5, 0x32, 0x03, 0xf6, 0xf9, 0x64, - 0xed, 0x57, 0x47, 0xe7, 0x33, 0x65, 0x77, 0x80, 0xb1, 0x53, 0xad, 0x57, - 0x20, 0x4a, 0xde, 0x96, 0x17, 0x49, 0xc3, 0x0c, 0x25, 0xa2, 0x16, 0x9f, - 0x83, 0x18, 0x36, 0x2f, 0xb7, 0xb8, 0xd6, 0xea, 0xec, 0xe1, 0x1e, 0x91, - 0x92, 0x0c, 0xe3, 0xc4, 0xf5, 0xe8, 0x92, 0xc5, 0x68, 0x4c, 0x73, 0x49, - 0xea, 0x91, 0xad, 0x7e, 0xc5, 0xa4, 0x39, 0x6a, 0x0b, 0xee, 0x92, 0x59, - 0x77, 0x05, 0x28, 0x1f, 0x34, 0x92, 0xce, 0xd8, 0x76, 0xcd, 0x2c, 0x16, - 0xa9, 0x58, 0x1e, 0x9f, 0xf3, 0xf3, 0xd6, 0x79, 0x93, 0x4d, 0x9c, 0x03, - 0xc3, 0x87, 0x2b, 0x1a, 0xb3, 0x32, 0xad, 0xa4, 0x3f, 0xf5, 0xd6, 0x43, - 0x1c, 0xb7, 0x33, 0xab, 0xf4, 0x41, 0xea, 0xeb, 0xe7, 0xc4, 0xf0, 0x0b, - 0xed, 0xfb, 0x9d, 0x3d, 0xa0, 0xd4, 0xd6, 0xc5, 0x05, 0x44, 0x2a, 0x1e, - 0x66, 0x4d, 0x87, 0x12, 0xd3, 0xfa, 0x8f, 0x8f, 0x9f, 0xc9, 0x3e, 0xac, - 0x05, 0x60, 0xc2, 0x39, 0xb2, 0xa4, 0x76, 0x8a, 0x54, 0x57, 0x59, 0x55, - 0x8d, 0x83, 0x62, 0x8d, 0x4f, 0x5d, 0x38, 0x4d, 0x8a, 0x31, 0x49, 0x4e, - 0xf3, 0xa6, 0xf6, 0x3f, 0x40, 0xc2, 0xe1, 0x14, 0x4e, 0xda, 0x61, 0xb3, - 0xeb, 0x9c, 0xdc, 0x41, 0x25, 0x5d, 0x79, 0x59, 0x9a, 0xa3, 0x1c, 0x39, - 0x60, 0x43, 0x9f, 0x27, 0x97, 0x11, 0x0f, 0x39, 0xf3, 0xa1, 0x12, 0xa7, - 0x07, 0x6b, 0xc5, 0xb0, 0xd6, 0xd3, 0xb4, 0x11, 0x72, 0x5f, 0x01, 0xd0, - 0x9a, 0xc4, 0x87, 0xe6, 0x23, 0x71, 0xc5, 0xb5, 0x52, 0x31, 0xe8, 0x52, - 0xb3, 0xe2, 0xcc, 0x26, 0x17, 0x67, 0x27, 0x30, 0x16, 0x8b, 0x77, 0xfb, - 0xf2, 0x2e, 0x1e, 0x50, 0xa0, 0xf4, 0x4f, 0x84, 0x2d, 0xc2, 0x92, 0x4c, - 0x1f, 0x00, 0x2f, 0x6a, 0xa0, 0x2b, 0x1d, 0x40, 0xb3, 0xf4, 0x7c, 0x78, - 0xbe, 0x34, 0x27, 0x4e, 0x19, 0x67, 0x89, 0xcc, 0x8b, 0x59, 0x96, 0xd3, - 0xf0, 0x3c, 0xd1, 0xe3, 0x0b, 0x86, 0x32, 0x33, 0x75, 0xf0, 0xc3, 0x66, - 0xf8, 0xc9, 0xf2, 0x47, 0xcf, 0xe9, 0x87, 0x1d, 0xfd, 0x57, 0x63, 0x49, - 0x4e, 0xd1, 0x9b, 0xbf, 0x6c, 0x37, 0x24, 0x73, 0x6c, 0x12, 0x53, 0xc8, - 0xe8, 0xe6, 0xf6, 0x91, 0x63, 0x3a, 0xfa, 0x5a, 0xd2, 0xfd, 0x42, 0xfc, - 0xf0, 0xe3, 0x27, 0xc4, 0xcf, 0x82, 0x17, 0x1e, 0xe0, 0xaa, 0x6d, 0x3b, - 0x08, 0x8d, 0x63, 0xef, 0x03, 0xfa, 0x8b, 0x27, 0x34, 0xf1, 0x21, 0xe3, - 0xaf, 0xd2, 0xec, 0xdf, 0x01, 0x12, 0x82, 0xfa, 0x86, 0x4f, 0xd9, 0x15, - 0xb9, 0xcc, 0x63, 0xe6, 0xb6, 0xfa, 0x8d, 0xdb, 0x7e, 0xd0, 0x36, 0x13, - 0x47, 0xc3, 0x8f, 0x1d, 0xeb, 0x7c, 0xd8, 0x07, 0x76, 0x1e, 0x6e, 0x95, - 0xf7, 0x4e, 0x29, 0x7d, 0x45, 0x06, 0x2a, 0x61, 0x15, 0x05, 0xc5, 0x17, - 0x9b, 0xf9, 0xba, 0xa2, 0xd5, 0x12, 0x78, 0x91, 0xa3, 0x01, 0x3d, 0x37, - 0x01, 0x01, 0xda, 0x84, 0x77, 0x7f, 0xf4, 0xb7, 0xc6, 0xcc, 0xa5, 0xaf, - 0x5f, 0x32, 0xdf, 0x8b, 0x65, 0x4f, 0xcd, 0xf3, 0x36, 0x36, 0xf4, 0x46, - 0x52, 0xec, 0x8d, 0x6f, 0x03, 0x04, 0x35, 0xe3, 0x9c, 0x40, 0x6d, 0x08, - 0x58, 0x31, 0xe1, 0x3d, 0x70, 0xf2, 0x2d, 0x21, 0x9d, 0x08, 0x60, 0xf7, - 0x31, 0xf1, 0x31, 0xda, 0x27, 0x12, 0x95, 0x2c, 0x6a, 0x78, 0xa1, 0x6c, - 0x74, 0x5f, 0x55, 0x03, 0xfa, 0x85, 0x0b, 0x5d, 0x92, 0xc4, 0x17, 0x0d, - 0x39, 0x32, 0x8e, 0x8e, 0x15, 0x69, 0x91, 0x13, 0x9a, 0xae, 0xdc, 0x8a, - 0xe5, 0xc4, 0x55, 0x17, 0xb9, 0x33, 0x5c, 0x66, 0x7f, 0x63, 0xe0, 0x47, - 0xc3, 0xae, 0xcb, 0x8f, 0xb2, 0xfa, 0x36, 0xe3, 0x7e, 0x60, 0x6a, 0xdb, - 0x69, 0x88, 0x78, 0xcc, 0x1c, 0x96, 0x2d, 0x5a, 0x2c, 0x82, 0xcc, 0x48, - 0x2c, 0x74, 0xfc, 0xdd, 0x08, 0x27, 0xe4, 0x35, 0xe9, 0x8b, 0xc9, 0x66, - 0x10, 0xb3, 0x50, 0x01, 0x9b, 0xd7, 0xb6, 0x68, 0xd2, 0xda, 0xc5, 0x72, - 0x9c, 0x79, 0x13, 0x21, 0x79, 0xb3, 0x64, 0xa2, 0xba, 0xbf, 0x94, 0x0a, - 0x2e, 0x6a, 0xe2, 0x0f, 0x69, 0xb4, 0xcd, 0xe5, 0x0f, 0xe8, 0x4f, 0x7b, - 0xbe, 0x9a, 0x4e, 0xcd, 0x53, 0xdf, 0x1d, 0x80, 0xd8, 0x09, 0x5c, 0xf8, - 0x0a, 0x6d, 0xf2, 0x8d, 0x1d, 0xff, 0x93, 0x63, 0x51, 0x7c, 0x8b, 0x7c, - 0xcc, 0x4a, 0x44, 0x58, 0x06, 0x0d, 0x9f, 0x03, 0x64, 0xeb, 0x7b, 0x52, - 0x0e, 0xba, 0x15, 0x97, 0x8b, 0xeb, 0xff, 0x09, 0x94, 0xf6, 0xe3, 0xe8, - 0x83, 0xc4, 0x85, 0xe0, 0xed, 0x02, 0xc6, 0x38, 0x1b, 0x23, 0x93, 0x34, - 0xa1, 0x88, 0x3d, 0x9b, 0x8b, 0x42, 0x1f, 0x54, 0xea, 0x66, 0xed, 0x55, - 0xc7, 0x0c, 0x91, 0xb5, 0x49, 0x3f, 0xa9, 0x7c, 0x39, 0xe8, 0x17, 0x37, - 0x39, 0x99, 0x48, 0xd7, 0xef, 0xb8, 0x06, 0x33, 0xf3, 0x96, 0x41, 0xe0, - 0x8c, 0x80, 0xbf, 0x65, 0x08, 0x65, 0x7d, 0x26, 0x22, 0x1c, 0xe9, 0x7a, - 0xea, 0x9b, 0xb8, 0x81, 0x95, 0x70, 0x7d, 0x59, 0x7b, 0xe2, 0x47, 0xd1, - 0x96, 0x53, 0x9e, 0x85, 0x3f, 0x3b, 0x25, 0xbb, 0x64, 0x1a, 0x42, 0xee, - 0x38, 0x44, 0xd2, 0x97, 0xcb, 0x48, 0xae, 0x15, 0xb7, 0xb0, 0x68, 0xc6, - 0x53, 0xe1, 0x98, 0x5b, 0xc6, 0xbb, 0x3a, 0x62, 0xc5, 0x96, 0x8f, 0xc3, - 0xc9, 0xdf, 0x01, 0x4f, 0xfd, 0x3d, 0x3f, 0xb8, 0x8d, 0xbc, 0xc7, 0x9e, - 0x3a, 0x97, 0x9b, 0xc1, 0x1f, 0x17, 0xd9, 0xc2, 0x24, 0x0f, 0x81, 0x90, - 0xb6, 0x15, 0x54, 0xdd, 0x8f, 0x2b, 0x3e, 0x83, 0x49, 0x26, 0x39, 0x8c, - 0x3f, 0x20, 0x6e, 0x3e, 0x87, 0xb8, 0x52, 0x33, 0x49, 0x2a, 0xbf, 0x25, - 0xa8, 0x2b, 0x06, 0x5f, 0x41, 0x46, 0xf1, 0x95, 0xb6, 0xbb, 0x5e, 0x76, - 0xcf, 0x94, 0x5c, 0x65, 0x31, 0xb8, 0xa4, 0x4b, 0x0e, 0x44, 0xfd, 0xbf, - 0x76, 0x16, 0xc0, 0xd1, 0xea, 0xfb, 0xe7, 0x43, 0x92, 0x60, 0xee, 0x7c, - 0xbd, 0xfe, 0x01, 0x53, 0xc8, 0xa4, 0xc3, 0xb2, 0x9f, 0x3a, 0xa9, 0x0f, - 0x98, 0x70, 0xa3, 0x9a, 0x8e, 0x40, 0xe0, 0x0e, 0x12, 0xa8, 0x54, 0xd0, - 0xdc, 0xf6, 0xb1, 0xe0, 0xfb, 0xba, 0xc4, 0x5a, 0x2e, 0x66, 0x69, 0x28, - 0xbc, 0xdb, 0x4a, 0x80, 0xbf, 0x09, 0x79, 0xd4, 0xa3, 0x81, 0xdf, 0xae, - 0xd4, 0xe7, 0xdb, 0x31, 0x9a, 0xa4, 0x8c, 0xbb, 0x77, 0x26, 0x5c, 0x30, - 0x4b, 0xcd, 0x6e, 0xfd, 0xd5, 0xe1, 0x86, 0xfa, 0x45, 0x4c, 0x6b, 0x73, - 0x33, 0x8d, 0xc0, 0x74, 0x7c, 0x36, 0xd4, 0x12, 0xb6, 0xae, 0xf9, 0x94, - 0xdd, 0xdb, 0xb6, 0x3d, 0xff, 0x4e, 0xf4, 0x29, 0xc8, 0x1e, 0x5d, 0x20, - 0x48, 0xa9, 0x34, 0x96, 0xc4, 0xa7, 0x00, 0x22, 0x65, 0x3f, 0x57, 0xb1, - 0x26, 0x1f, 0x8e, 0x86, 0x33, 0x4b, 0xca, 0xf3, 0x8e, 0xa8, 0xbe, 0x40, - 0x07, 0x12, 0xfd, 0x39, 0x4e, 0x14, 0xec, 0x52, 0x72, 0xdc, 0x38, 0xc7, - 0x23, 0x4b, 0x81, 0x39, 0xf3, 0x56, 0xce, 0x5d, 0x6c, 0xb8, 0x46, 0x97, - 0x9f, 0xe4, 0x0d, 0xdb, 0x46, 0xe1, 0xba, 0xbf, 0x5a, 0x7c, 0x0d, 0x9e, - 0xdf, 0xa9, 0x18, 0x94, 0x26, 0x99, 0x21, 0x56, 0x99, 0x33, 0xfa, 0xb8, - 0x3e, 0x55, 0x95, 0xcc, 0x2b, 0xde, 0x9f, 0xe9, 0x5d, 0xa0, 0xff, 0xd2, - 0xb2, 0xce, 0x30, 0x46, 0xb0, 0x8c, 0xee, 0xd8, 0x62, 0x6c, 0x74, 0x36, - 0x03, 0xe2, 0x93, 0x1e, 0x00, 0x0d, 0xc5, 0x52, 0xc9, 0x76, 0x28, 0x2b, - 0x81, 0x9c, 0xd5, 0xb5, 0x97, 0x15, 0x35, 0x46, 0xb3, 0x20, 0xeb, 0xa1, - 0xe4, 0xc0, 0x67, 0x96, 0x23, 0x82, 0x5a, 0x33, 0x38, 0xa9, 0xa6, 0x2d, - 0xd9, 0x16, 0xb4, 0x5c, 0xf1, 0xb8, 0xc5, 0x3d, 0x3b, 0xeb, 0x82, 0x7a, - 0xba, 0x46, 0x6b, 0x77, 0x81, 0x64, 0xa2, 0x8f, 0x91, 0x49, 0xb5, 0x23, - 0x82, 0x5a, 0xc7, 0xf1, 0xef, 0x0e, 0x6b, 0xca, 0xe7, 0xa8, 0xdd, 0x1b, - 0xae, 0xab, 0xb8, 0x8a, 0x8a, 0xf3, 0xf2, 0x1d, 0xba, 0xc9, 0x27, 0xd7, - 0x8d, 0xf5, 0x63, 0xcc, 0x62, 0x5f, 0x85, 0x25, 0x05, 0x92, 0x7b, 0xd1, - 0x86, 0xc1, 0x25, 0x0a, 0x34, 0xb3, 0xf6, 0x35, 0xd6, 0xf1, 0xcc, 0xda, - 0x1c, 0xfe, 0xb6, 0x65, 0x5b, 0xa9, 0x7f, 0xa7, 0x3b, 0x2d, 0x5d, 0x82, - 0x4d, 0x3d, 0xf1, 0x86, 0xee, 0x33, 0x90, 0x3e, 0x52, 0x72, 0x35, 0xb5, - 0x24, 0x18, 0x6f, 0x8c, 0x3c, 0xf4, 0x32, 0xa0, 0xbf, 0x71, 0x97, 0x2e, - 0x5b, 0x79, 0xc1, 0xde, 0xcc, 0x39, 0x26, 0x8f, 0xb4, 0x62, 0x8d, 0x2f, - 0xb0, 0x30, 0x6d, 0x1f, 0x51, 0x30, 0xe5, 0xf1, 0x0a, 0xf3, 0xdc, 0x76, - 0xfc, 0x1c, 0x83, 0x05, 0x49, 0x08, 0x14, 0x44, 0xec, 0x34, 0x4d, 0x12, - 0x30, 0x4e, 0x39, 0x42, 0x51, 0xc7, 0xd8, 0x7d, 0x12, 0xe3, 0x71, 0x64, - 0xd5, 0x38, 0xfc, 0x0e, 0xde, 0x6a, 0xd5, 0xe6, 0xf5, 0xba, 0x64, 0xe8, - 0xe8, 0xf3, 0x8f, 0x73, 0x35, 0xb3, 0xe0, 0xa8, 0x0d, 0x39, 0x14, 0x44, - 0x63, 0xe7, 0xf8, 0x9d, 0x30, 0x0b, 0xb3, 0x8d, 0x69, 0xd2, 0x9b, 0x9b, - 0x59, 0xa0, 0x12, 0xcd, 0xbd, 0x04, 0x3f, 0x74, 0x53, 0xf0, 0x8a, 0xb0, - 0x19, 0x89, 0xb6, 0xb5, 0x3c, 0x70, 0xe2, 0x04, 0x22, 0x2f, 0x89, 0x52, - 0x7d, 0x2e, 0x91, 0x6c, 0x40, 0xe2, 0x0a, 0x7d, 0x75, 0x6c, 0x3a, 0xcc, - 0xc5, 0xc5, 0x2f, 0x77, 0x4b, 0xc5, 0xe4, 0x45, 0xf5, 0x3f, 0x53, 0x11, - 0xd6, 0x54, 0xc5, 0x9b, 0x07, 0x81, 0xb8, 0x20, 0x8c, 0x21, 0xc5, 0x72, - 0x88, 0x3a, 0x94, 0xc9, 0x93, 0xad, 0xf6, 0x82, 0x18, 0x45, 0x7b, 0x9d, - 0x8c, 0xfb, 0x07, 0x66, 0xd4, 0xdc, 0x32, 0xb1, 0x71, 0x67, 0x34, 0x94, - 0x9f, 0xe6, 0xbd, 0xf0, 0xae, 0xa2, 0xf1, 0xe5, 0x80, 0x48, 0x6d, 0x1d, - 0xd0, 0xba, 0x9c, 0xa9, 0x52, 0x8b, 0x10, 0x00, 0xa5, 0xf1, 0x10, 0x5e, - 0x01, 0xc1, 0x3d, 0xcc, 0xc8, 0xf2, 0xec, 0x0c, 0xa1, 0x19, 0x5b, 0x12, - 0x8d, 0xd0, 0x0f, 0x6b, 0x64, 0x2d, 0x58, 0x61, 0x07, 0x13, 0xb9, 0x49, - 0x93, 0xbb, 0x77, 0x4f, 0x90, 0xc2, 0xe0, 0x89, 0xd2, 0x60, 0x8c, 0x7e, - 0x24, 0xc4, 0x75, 0x10, 0x8d, 0x23, 0xab, 0x77, 0x47, 0x2e, 0xfc, 0x02, - 0xcc, 0x47, 0x52, 0xfd, 0xfd, 0x28, 0x31, 0xd3, 0xeb, 0x81, 0xaa, 0xf7, - 0xa3, 0xa4, 0x30, 0x7a, 0x42, 0x02, 0x69, 0xde, 0xe2, 0x58, 0xdb, 0x59, - 0x81, 0xf8, 0xbd, 0xc6, 0x74, 0xdd, 0x43, 0x2c, 0x14, 0xb0, 0xfb, 0x15, - 0x63, 0xac, 0x79, 0xd7, 0xb2, 0x13, 0x27, 0x5e, 0x2a, 0xd8, 0xb0, 0x0a, - 0x12, 0x63, 0x43, 0xbd, 0x6a, 0xc6, 0x76, 0x29, 0x01, 0xab, 0xdd, 0x8d, - 0x9a, 0xac, 0x3f, 0xc2, 0xab, 0xb5, 0x35, 0xc1, 0x18, 0x91, 0xfa, 0x0b, - 0xc1, 0x78, 0x32, 0x04, 0x8c, 0x6e, 0x02, 0xc2, 0xd3, 0x8a, 0xb5, 0x04, - 0xc9, 0x65, 0x12, 0xcb, 0x57, 0x53, 0x5c, 0x7c, 0xe4, 0x6e, 0xfd, 0x64, - 0x70, 0x33, 0x8b, 0x44, 0xea, 0x45, 0x21, 0xed, 0x05, 0xd7, 0x46, 0xe4, - 0x80, 0xd3, 0x06, 0xab, 0x8d, 0x8d, 0x52, 0x4d, 0x3b, 0x9e, 0x95, 0x95, - 0x8f, 0xd2, 0x57, 0x61, 0xe7, 0xfb, 0xce, 0x65, 0x2d, 0x42, 0x1c, 0xd0, - 0x46, 0x2f, 0x49, 0xb7, 0x9a, 0x0b, 0xd4, 0x71, 0x8f, 0x43, 0x41, 0x5b, - 0xe1, 0x31, 0x47, 0x09, 0x38, 0xd9, 0x63, 0x6f, 0xa0, 0x5b, 0x5d, 0x29, - 0x08, 0x6c, 0xd3, 0xba, 0x22, 0x1d, 0xa8, 0x2c, 0xb7, 0x12, 0x56, 0x07, - 0xc3, 0x88, 0x82, 0x70, 0xf9, 0x7d, 0x80, 0x67, 0xda, 0x57, 0xf5, 0x66, - 0x80, 0xa2, 0x60, 0x73, 0x18, 0xed, 0xf4, 0xe9, 0x3f, 0xf6, 0xc6, 0x09, - 0xf4, 0x6b, 0x61, 0xd1, 0x90, 0xec, 0x49, 0x6a, 0x7c, 0x6b, 0x96, 0x50, - 0x3b, 0x4d, 0xb3, 0xaf, 0x9d, 0x06, 0x2b, 0xf6, 0x8f, 0x66, 0x44, 0x2f, - 0x09, 0x37, 0xd5, 0x08, 0xac, 0xf3, 0xd4, 0x43, 0xe4, 0xf9, 0x01, 0xfc, - 0x08, 0x7c, 0x09, 0x41, 0x73, 0x58, 0xd8, 0x4c, 0x83, 0x94, 0x2e, 0x83, - 0x19, 0x5e, 0x48, 0x51, 0x48, 0x2d, 0xe4, 0x6d, 0x4b, 0xb1, 0xa2, 0x29, - 0xf3, 0xa4, 0x96, 0xd9, 0xf0, 0xfa, 0x87, 0x49, 0xf4, 0x5f, 0x3a, 0xde, - 0x0b, 0x03, 0xfb, 0x8d, 0x09, 0xbf, 0x23, 0x99, 0xd9, 0x1b, 0xd9, 0xcc, - 0x8a, 0x73, 0x42, 0x92, 0xda, 0x7b, 0xc5, 0xd5, 0xe4, 0x3f, 0x29, 0x27, - 0xaa, 0x47, 0xe3, 0xc8, 0x35, 0xfc, 0x96, 0xf7, 0xca, 0x88, 0xe5, 0xca, - 0x6c, 0x0a, 0x4f, 0xe1, 0x3c, 0xdf, 0x2a, 0x5d, 0x2a, 0x5b, 0x78, 0x5f, - 0x45, 0xeb, 0x37, 0xb6, 0xf4, 0xfb, 0x0b, 0x8b, 0x0e, 0x5a, 0xaa, 0x05, - 0xbd, 0x3c, 0xf4, 0xab, 0x74, 0x93, 0xb3, 0x0c, 0xe6, 0x46, 0x82, 0x3c, - 0x7e, 0x3f, 0x04, 0x85, 0xa0, 0xe8, 0xee, 0xb7, 0x76, 0x34, 0xb4, 0xc0, - 0xe9, 0x21, 0x3c, 0x27, 0x42, 0xa5, 0x5c, 0x98, 0xa1, 0x5a, 0xd6, 0x65, - 0x25, 0x5b, 0x85, 0xfc, 0x3b, 0x3b, 0xa9, 0x3e, 0x4c, 0x99, 0x87, 0x3a, - 0x59, 0x01, 0xf6, 0x6b, 0x44, 0x14, 0x95, 0x85, 0x2b, 0x9b, 0x06, 0x4a, - 0x90, 0x92, 0x75, 0xaa, 0x51, 0x48, 0x93, 0x42, 0xe5, 0xcb, 0x92, 0x51, - 0x9d, 0xa8, 0x30, 0x7b, 0xb0, 0x9e, 0x1a, 0xaa, 0xf4, 0x42, 0x60, 0x04, - 0xa5, 0xdf, 0x4c, 0xaf, 0x7a, 0x1d, 0xb3, 0xa6, 0x98, 0x41, 0x8f, 0x7c, - 0x7f, 0xd3, 0x65, 0x6f, 0x9e, 0xb3, 0xc2, 0x4d, 0xf7, 0xf7, 0xc1, 0x17, - 0x54, 0xe6, 0xdd, 0xe3, 0xe5, 0xf2, 0x53, 0xff, 0xaf, 0xba, 0xbd, 0xd9, - 0x53, 0x6f, 0x0c, 0x80, 0x00, 0x3f, 0x3b, 0x94, 0xbf, 0x0c, 0xa7, 0x57, - 0x43, 0x79, 0x1e, 0x39, 0x20, 0x4a, 0x2b, 0x46, 0x73, 0x41, 0x1f, 0xfe, - 0xf7, 0xc0, 0xcc, 0x78, 0x68, 0xbc, 0xb4, 0x6b, 0xb4, 0xe3, 0x86, 0xbf, - 0x0b, 0xf5, 0xf1, 0x59, 0x2a, 0xc5, 0x80, 0x68, 0x81, 0x5d, 0x64, 0x6d, - 0x94, 0x0e, 0xa9, 0x20, 0xd8, 0x98, 0x63, 0xb9, 0x48, 0x89, 0xfb, 0x23, - 0x00, 0x11, 0x16, 0x2d, 0x15, 0xfd, 0x7b, 0x68, 0x98, 0x44, 0x32, 0x28, - 0x5c, 0x1c, 0x03, 0x44, 0xeb, 0x6e, 0x46, 0x25, 0xde, 0x95, 0x75, 0xf1, - 0x3f, 0xe8, 0x76, 0xa6, 0x62, 0x93, 0x02, 0x1e, 0x14, 0x4f, 0x5c, 0xa8, - 0x2c, 0x2f, 0x8f, 0x7a, 0xf4, 0x90, 0xf4, 0x2b, 0x79, 0xd2, 0xc8, 0x47, - 0x9a, 0x74, 0xe9, 0xd8, 0xad, 0xca, 0xf1, 0xab, 0x89, 0xe6, 0xb5, 0xd2, - 0x32, 0x67, 0x2e, 0x5d, 0x31, 0x19, 0x89, 0xff, 0xf7, 0x8b, 0x45, 0x85, - 0x57, 0xcf, 0x9c, 0x79, 0xad, 0x27, 0x8b, 0xd5, 0x54, 0xff, 0x62, 0x4e, - 0xa0, 0xe2, 0x36, 0x80, 0xac, 0x25, 0xaa, 0xcd, 0xf6, 0x48, 0xb0, 0x4d, - 0x8e, 0x4c, 0x40, 0x77, 0xc8, 0xd9, 0x9c, 0xe7, 0x9e, 0xa9, 0x55, 0xba, - 0x60, 0xb4, 0x97, 0x56, 0xff, 0xe2, 0xb7, 0xd1, 0xaf, 0x78, 0x83, 0x83, - 0xca, 0x60, 0xc1, 0x86, 0x76, 0x04, 0xc1, 0x3c, 0x8f, 0x89, 0x71, 0x67, - 0xf9, 0x25, 0x78, 0x28, 0x52, 0xc9, 0x70, 0xf4, 0xaf, 0xf1, 0x40, 0x39, - 0x24, 0xc1, 0x66, 0x2d, 0xea, 0x62, 0xc0, 0xd5, 0x38, 0x3c, 0x7d, 0xcc, - 0x97, 0x50, 0x31, 0xea, 0x0d, 0xaf, 0x00, 0x5d, 0xc9, 0x9f, 0x5a, 0xc2, - 0x6f, 0x09, 0x57, 0x36, 0x17, 0x07, 0xbe, 0x14, 0x0c, 0xdc, 0xce, 0x68, - 0xe7, 0x33, 0x5a, 0x2b, 0x06, 0x99, 0xe7, 0x4f, 0x1d, 0x42, 0x44, 0x76, - 0xd0, 0x12, 0x89, 0xc3, 0x52, 0x09, 0xb8, 0xf3, 0x47, 0x8b, 0xcd, 0x6a, - 0x36, 0xe7, 0x47, 0xd5, 0x00, 0xef, 0x05, 0xd4, 0xe2, 0x41, 0x7d, 0x99, - 0xf0, 0x33, 0xbd, 0x65, 0xfe, 0x79, 0x97, 0xd9, 0x42, 0x73, 0x51, 0x7a, - 0x33, 0x4c, 0x40, 0x2c, 0x41, 0xc2, 0x21, 0x08, 0x45, 0x2b, 0x91, 0x1c, - 0x50, 0x29, 0x44, 0x87, 0x1d, 0x7a, 0x6b, 0xc4, 0x4e, 0x1c, 0xc1, 0x60, - 0xdd, 0xf7, 0xd2, 0x4d, 0xb6, 0x14, 0xf9, 0xec, 0x93, 0xa2, 0x98, 0x08, - 0xb1, 0x37, 0x78, 0x46, 0x5e, 0x9e, 0x55, 0xfb, 0x6a, 0x8f, 0x6c, 0xb8, - 0x6d, 0x16, 0x0c, 0x66, 0x0a, 0xdb, 0x48, 0x63, 0x56, 0x33, 0xf8, 0x78, - 0x80, 0xba, 0xee, 0x08, 0xae, 0x12, 0x32, 0x75, 0xd1, 0x8c, 0x07, 0x3b, - 0x9f, 0x6d, 0xf7, 0xd8, 0x4f, 0x4d, 0x6a, 0xcf, 0x48, 0xb7, 0xd9, 0x9c, - 0x1d, 0x33, 0x99, 0xf7, 0xff, 0x04, 0xdd, 0x61, 0xf1, 0x55, 0xd6, 0xd3, - 0xf0, 0xae, 0xbf, 0x78, 0xe1, 0x84, 0x46, 0x5c, 0xef, 0x30, 0xc1, 0xc8, - 0x0b, 0xb7, 0x13, 0x32, 0xd8, 0x48, 0xb7, 0x73, 0xff, 0x11, 0x09, 0xff, - 0xb7, 0x3f, 0x4d, 0xe2, 0x80, 0x3d, 0xd5, 0xc6, 0xbf, 0xea, 0x5c, 0x9d, - 0x65, 0xe8, 0xd3, 0xcd, 0x79, 0xd8, 0x0b, 0x1b, 0xf7, 0x0a, 0x41, 0xeb, - 0x0c, 0xe6, 0xed, 0xd9, 0x2c, 0x85, 0x4c, 0xea, 0x65, 0xe6, 0x24, 0x35, - 0x4e, 0x69, 0x7b, 0x63, 0x9f, 0x62, 0x38, 0xf9, 0xc4, 0xb4, 0x09, 0xce, - 0xaa, 0x9b, 0xf6, 0x43, 0x2f, 0xca, 0xe7, 0x38, 0x7e, 0xef, 0x12, 0x0d, - 0x45, 0x14, 0xa5, 0x25, 0xb3, 0x37, 0x98, 0x17, 0x40, 0xec, 0x3f, 0x0f, - 0x89, 0xe0, 0xd8, 0x0e, 0x59, 0x08, 0x1c, 0xcf, 0x11, 0x7d, 0x9b, 0xcf, - 0x04, 0xc6, 0x06, 0xdf, 0x3b, 0xb1, 0xb7, 0xde, 0x78, 0xf3, 0x40, 0x12, - 0x2b, 0x47, 0x4f, 0x4c, 0xd2, 0xbd, 0x28, 0x60, 0xfd, 0xc3, 0x84, 0x60, - 0xc6, 0x52, 0x02, 0xfd, 0x51, 0x7a, 0x71, 0x93, 0x96, 0x37, 0x9b, 0x05, - 0x72, 0xcd, 0x2b, 0xd9, 0x96, 0xab, 0x54, 0xeb, 0x06, 0x22, 0x89, 0x33, - 0xbd, 0xfa, 0x97, 0x28, 0x92, 0x5e, 0x20, 0xc0, 0x5d, 0x9f, 0x35, 0x70, - 0x9e, 0x06, 0xcf, 0xfb, 0xf1, 0x50, 0xce, 0x9b, 0x96, 0x1c, 0xad, 0x42, - 0x6f, 0xbf, 0x4c, 0xa9, 0xbd, 0x6e, 0x54, 0x59, 0x76, 0x73, 0x62, 0xd0, - 0xd0, 0x9d, 0x2f, 0xcb, 0xe9, 0xa0, 0x49, 0x7b, 0x98, 0x75, 0x02, 0xa5, - 0xa5, 0xb8, 0x56, 0xdc, 0x72, 0xa2, 0x31, 0x62, 0xe8, 0x83, 0xbe, 0x3a, - 0x15, 0xf0, 0x77, 0xf1, 0x05, 0xaa, 0xbd, 0x1a, 0x44, 0xeb, 0xea, 0x8a, - 0xcc, 0xd9, 0x78, 0x67, 0x3a, 0xd3, 0xb9, 0x1a, 0x56, 0x2b, 0xa4, 0x7b, - 0xf9, 0x07, 0x52, 0xe8, 0x59, 0x9c, 0x56, 0xa1, 0xa9, 0x44, 0xd1, 0x7b, - 0x9f, 0x6f, 0xe0, 0x67, 0x14, 0x75, 0x82, 0x89, 0x23, 0x72, 0xea, 0x45, - 0x2b, 0xbc, 0xc8, 0xe3, 0x0a, 0x89, 0x57, 0xc6, 0xbe, 0x8b, 0x8e, 0xd5, - 0x6b, 0xcf, 0xb2, 0xfb, 0x6b, 0x44, 0x2e, 0x05, 0xd6, 0xe5, 0x07, 0x01, - 0xc3, 0x38, 0xaf, 0xae, 0xa0, 0x74, 0xc1, 0x5c, 0x44, 0x4b, 0xb7, 0xd4, - 0xf7, 0x16, 0x64, 0x47, 0x4f, 0xf7, 0x33, 0x67, 0xe5, 0xe9, 0xd6, 0x09, - 0x7e, 0xab, 0x9d, 0xf3, 0x09, 0x4f, 0x96, 0x2d, 0x7e, 0x6c, 0x80, 0x88, - 0xc7, 0xf0, 0x1c, 0x16, 0xd4, 0xb3, 0xbb, 0x6a, 0xa7, 0xf2, 0xfd, 0xfc, - 0xb1, 0xaf, 0x5c, 0xc4, 0xba, 0x7d, 0xa9, 0xfb, 0xcc, 0x9d, 0x84, 0x62, - 0x8d, 0xae, 0xdd, 0xfe, 0xcc, 0x88, 0x5d, 0x05, 0xc4, 0xae, 0x26, 0x7d, - 0x1f, 0x44, 0xba, 0xc0, 0xf6, 0xe4, 0x9d, 0x10, 0x13, 0xc0, 0x5b, 0x20, - 0xb7, 0x6d, 0x27, 0x35, 0x28, 0xbd, 0x49, 0x1f, 0x08, 0x7b, 0x0b, 0xab, - 0x05, 0x8b, 0x74, 0x39, 0x58, 0x44, 0x45, 0xcc, 0x8d, 0xba, 0xc1, 0xe9, - 0x25, 0xa6, 0x8e, 0xee, 0x2e, 0x20, 0x23, 0xa7, 0xce, 0x10, 0x50, 0x97, - 0x6f, 0x39, 0x5d, 0xbf, 0xb8, 0xdb, 0x8d, 0x19, 0xc1, 0xf0, 0x4f, 0xb0, - 0x5a, 0xc7, 0xa5, 0x1a, 0x2f, 0x2d, 0x19, 0x89, 0xf8, 0xf0, 0xfc, 0x7e, - 0x62, 0x01, 0x99, 0x5e, 0x0a, 0xf8, 0xf1, 0xc9, 0xfb, 0x1b, 0x48, 0x3b, - 0xdc, 0x67, 0xae, 0x0f, 0x09, 0x2c, 0x60, 0x5d, 0x50, 0xaf, 0x72, 0x6f, - 0xba, 0xa7, 0xd5, 0xc9, 0x1a, 0xb1, 0x50, 0xdf, 0x5c, 0xd5, 0xcf, 0xfc, - 0x1f, 0xa5, 0xc7, 0x59, 0x2e, 0xc7, 0x96, 0xda, 0xb7, 0xda, 0x19, 0x6c, - 0x07, 0x9d, 0xfa, 0x15, 0x2c, 0xaa, 0x31, 0xde, 0x8c, 0x0d, 0xa0, 0xd6, - 0x25, 0x7c, 0xf4, 0x26, 0x98, 0x51, 0xa2, 0x88, 0xe7, 0x10, 0x49, 0x4e, - 0x25, 0x31, 0x53, 0x7e, 0x45, 0xbd, 0xe0, 0x10, 0x34, 0x4f, 0xa9, 0xa9, - 0xd4, 0x43, 0xb6, 0x1e, 0xa4, 0x66, 0x79, 0xbe, 0xaf, 0xc4, 0xd0, 0x52, - 0x46, 0x0a, 0x56, 0x63, 0x25, 0x70, 0x41, 0x1a, 0xd5, 0x33, 0xc2, 0x80, - 0x0b, 0xb5, 0x86, 0x26, 0x25, 0x2e, 0x26, 0x2c, 0x80, 0x77, 0x44, 0x1d, - 0xb0, 0x57, 0x75, 0xaf, 0x84, 0x2e, 0x18, 0x81, 0x4f, 0x5d, 0xf1, 0x7a, - 0x00, 0xc7, 0x7a, 0x56, 0xea, 0xf9, 0x3f, 0xe2, 0xdf, 0x76, 0x19, 0x43, - 0x51, 0x8e, 0x94, 0x04, 0x26, 0x2e, 0xf9, 0x94, 0xeb, 0x06, 0x9a, 0xf0, - 0xa2, 0x2b, 0x33, 0x0e, 0xae, 0x05, 0x49, 0x92, 0xc2, 0xa1, 0x3a, 0xd8, - 0x53, 0x86, 0x3c, 0x8e, 0xa1, 0xea, 0xa8, 0x31, 0x48, 0xf5, 0x5d, 0x57, - 0xce, 0x1c, 0xbe, 0x3d, 0xa2, 0x55, 0x16, 0x93, 0x19, 0x3e, 0x6b, 0xee, - 0x3c, 0x44, 0x97, 0xfd, 0xc3, 0x80, 0x0b, 0x54, 0x76, 0xab, 0xfd, 0x44, - 0xf2, 0x12, 0x5c, 0x1f, 0x68, 0x59, 0x48, 0x28, 0x8b, 0x3a, 0x6a, 0x36, - 0x81, 0xd2, 0x74, 0x16, 0x0f, 0x22, 0xe4, 0xb3, 0x08, 0x28, 0x02, 0x71, - 0x71, 0xfc, 0x38, 0x57, 0x5e, 0x58, 0x61, 0xdb, 0xf2, 0x10, 0x56, 0x0e, - 0x83, 0xf7, 0xe2, 0xf8, 0xad, 0x49, 0x08, 0x92, 0xcf, 0x0c, 0xaa, 0xef, - 0x56, 0xd8, 0xce, 0x6b, 0x72, 0x94, 0x8c, 0xfc, 0xb1, 0x08, 0x7e, 0x97, - 0x75, 0x73, 0xd9, 0xc7, 0x76, 0xc0, 0x24, 0x56, 0xda, 0x74, 0xa8, 0x38, - 0x40, 0xab, 0x4e, 0x34, 0xcc, 0xe0, 0x3b, 0x9a, 0x26, 0xa4, 0xcb, 0xcd, - 0x3f, 0x34, 0xff, 0xd6, 0xc1, 0x04, 0x9f, 0x25, 0x33, 0xd3, 0x87, 0xff, - 0x12, 0x47, 0x3f, 0x1a, 0x49, 0xe8, 0xb5, 0xc0, 0xd4, 0x43, 0x72, 0xb3, - 0xbf, 0x6c, 0xea, 0x0e, 0x44, 0x49, 0x68, 0x1d, 0xc4, 0x03, 0xe6, 0x22, - 0xe7, 0xc5, 0x83, 0xe5, 0x67, 0xa9, 0x52, 0xef, 0x03, 0x63, 0x81, 0x4f, - 0xa5, 0x28, 0xcb, 0xa1, 0x9b, 0xae, 0x8b, 0x2b, 0xf7, 0x63, 0x03, 0x0d, - 0x5c, 0x37, 0x1b, 0x05, 0xf2, 0xcd, 0xab, 0xd9, 0x96, 0xab, 0x54, 0xeb, - 0x06, 0x22, 0x89, 0x33, 0x6e, 0x00, 0x00, 0xd9, 0x3d, 0x50, 0xfe, 0x4e, - 0x7d, 0x83, 0xe6, 0x82, 0x7f, 0xc3, 0x3c, 0x6c, 0xbc, 0xc3, 0xf6, 0xbb, - 0x29, 0x7d, 0x12, 0x64, 0x62, 0x80, 0x84, 0x31, 0x18, 0x26, 0x64, 0x20, - 0xec, 0xc7, 0x53, 0x13, 0x15, 0x60, 0x87, 0xd5, 0x46, 0x93, 0xf7, 0xd8, - 0x5f, 0xde, 0xe7, 0x71, 0x63, 0x51, 0x46, 0x9a, 0x16, 0x1d, 0x2d, 0x43, - 0x6f, 0xbf, 0x4c, 0xa9, 0xbd, 0x6e, 0x54, 0x59, 0x76, 0x73, 0x62, 0xd0, - 0xd0, 0x9d, 0x2f, 0xcb, 0xe9, 0xa0, 0x49, 0x7b, 0x98, 0x75, 0x02, 0xa5, - 0xa5, 0xb8, 0x56, 0xdc, 0x72, 0xa2, 0x31, 0x62, 0xe8, 0x83, 0xbe, 0x3a, - 0x15, 0xf0, 0x77, 0xf1, 0x05, 0xaa, 0xbd, 0x1a, 0x44, 0xeb, 0xea, 0x8a, - 0xcc, 0xd9, 0x78, 0x67, 0x3a, 0xd3, 0xb9, 0x1a, 0x82, 0xe8, 0x73, 0x58, - 0x98, 0xf2, 0x9e, 0x87, 0x6f, 0x40, 0x3c, 0x4c, 0x2b, 0x8e, 0xba, 0x6b, - 0x1d, 0x65, 0xfa, 0x3f, 0x15, 0xce, 0xbc, 0xe2, 0x3a, 0x9f, 0x49, 0x0a, - 0x0a, 0x8d, 0xcb, 0x9f, 0xfb, 0x5e, 0xba, 0x90, 0xde, 0xcf, 0xd7, 0x81, - 0x22, 0x0e, 0xc9, 0xe0, 0xf8, 0xa2, 0x17, 0x12, 0x56, 0x32, 0x91, 0x65, - 0xee, 0x5e, 0xb5, 0x27, 0xff, 0xd3, 0x97, 0xe5, 0x29, 0x18, 0x69, 0xcc, - 0x3c, 0x16, 0xe5, 0x47, 0xcf, 0xf7, 0xb3, 0x67, 0xe5, 0xe9, 0xd6, 0x09, - 0x7e, 0xab, 0x9d, 0xf3, 0xa4, 0xb7, 0xb8, 0x87, 0xe7, 0xf1, 0x31, 0x8f, - 0x2a, 0x3a, 0xd8, 0x08, 0xfc, 0xb4, 0xc3, 0x76, 0x6d, 0xf8, 0x72, 0x91, - 0x5b, 0x87, 0x1b, 0xac, 0xf4, 0xd9, 0x07, 0x9d, 0xfc, 0x90, 0x56, 0x18, - 0xcd, 0x02, 0x51, 0x26, 0x12, 0x71, 0xef, 0x17, 0x93, 0x45, 0x16, 0x4f, - 0x4e, 0xc7, 0x42, 0x8f, 0x3d, 0xf3, 0x76, 0xfd, 0x32, 0xae, 0xdd, 0xc5, - 0xba, 0x7d, 0xa9, 0xfb, 0xcc, 0x9d, 0x84, 0x62, 0x8d, 0xae, 0xdd, 0xfe, - 0xcc, 0x88, 0x5d, 0x05, 0xc4, 0xae, 0x26, 0x7d, 0x1f, 0x44, 0xba, 0xc0, - 0xf6, 0xe4, 0x9d, 0x10, 0x13, 0xc0, 0x5b, 0x20, 0xb7, 0x6d, 0x27, 0x35, - 0x28, 0xbd, 0x49, 0x1f, 0x08, 0x7b, 0x0b, 0xab, 0x05, 0x8b, 0x74, 0x39, - 0x58, 0x44, 0x45, 0xcc, 0x8d, 0xba, 0xc1, 0xe9, 0x92, 0x27, 0xce, 0x8f, - 0x39, 0x77, 0xb5, 0x90, 0xe9, 0x93, 0x2c, 0x1e, 0xb2, 0x3c, 0x79, 0xff, - 0x73, 0xa6, 0x15, 0x22, 0x15, 0x9c, 0xeb, 0x22, 0x9c, 0x29, 0x8e, 0xf9, - 0x91, 0x7c, 0x5e, 0x53, 0xe2, 0x3d, 0x02, 0x4d, 0xea, 0x5e, 0x14, 0xe5, - 0xf2, 0x43, 0xb7, 0x74, 0x10, 0x04, 0x4c, 0xb4, 0xb3, 0xc6, 0xaf, 0x1b, - 0x59, 0x10, 0xef, 0x71, 0xf5, 0x1d, 0x0f, 0xfb, 0x63, 0xd3, 0xcb, 0x63, - 0x1c, 0xb4, 0xd0, 0xea, 0x46, 0x07, 0xde, 0x12, 0xa1, 0x0f, 0x86, 0x38, - 0xcc, 0x42, 0x24, 0x3a, 0x1d, 0xfc, 0x16, 0xdc, 0x8d, 0x63, 0xb0, 0x35, - 0x2d, 0x2e, 0xc2, 0x90, 0x65, 0x78, 0x51, 0x49, 0x9a, 0xf0, 0x61, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x97, 0xb8, 0x20, 0xf4, 0x4f, 0x4b, 0xa6, 0x31, - 0xdb, 0x78, 0xbb, 0xba, 0x49, 0xa1, 0x0e, 0x84, 0xc3, 0xce, 0x5d, 0x96, - 0xdb, 0xd2, 0xa9, 0x29, 0x36, 0x71, 0x1e, 0x94, 0x7e, 0xa0, 0x45, 0x72, - 0x68, 0x51, 0xf3, 0x89, 0x7c, 0x63, 0x0e, 0x3e, 0x48, 0x61, 0xc1, 0x6a, - 0x63, 0x79, 0x82, 0x2a, 0x6a, 0x71, 0x2b, 0xb1, 0x75, 0x9d, 0x18, 0xac, - 0xea, 0x8b, 0x09, 0x42, 0x26, 0x32, 0x60, 0x43, 0x02, 0x53, 0x08, 0x73, - 0x97, 0x69, 0xcd, 0x75, 0x2b, 0x19, 0x63, 0x64, 0x6d, 0x20, 0x4b, 0xe7, - 0x03, 0x21, 0xa4, 0x14, 0x3c, 0x8d, 0x52, 0x28, 0xea, 0xca, 0xdc, 0x6b, - 0x9c, 0x22, 0x8b, 0x5d, 0xe6, 0x17, 0xf4, 0x72, 0x7b, 0xa0, 0x68, 0xe0, - 0xc7, 0x21, 0x92, 0x59, 0xf8, 0x1f, 0x7e, 0x15, 0x43, 0x74, 0x6b, 0xe5, - 0x67, 0x35, 0x0b, 0x95, 0x67, 0x43, 0x63, 0x82, 0xe6, 0x15, 0x5b, 0x24, - 0x7b, 0xe2, 0x2f, 0x09, 0x5f, 0x3f, 0x35, 0x68, 0x43, 0xa5, 0xc4, 0xab, - 0x88, 0x74, 0xd2, 0x45, 0x7b, 0xc9, 0xe5, 0x7e, 0x4a, 0x05, 0x38, 0xaa, - 0xfc, 0x75, 0xe9, 0x74, 0x1f, 0x4a, 0xa1, 0xcf, 0xab, 0x28, 0x15, 0xcf, - 0xb1, 0x29, 0xf5, 0x35, 0x3b, 0x69, 0x9e, 0xe0, 0x5f, 0x48, 0x7d, 0xf6, - 0x99, 0x61, 0xf5, 0x1a, 0x0c, 0x72, 0xbd, 0xe5, 0xee, 0xfc, 0x17, 0xd0, - 0xe2, 0xc7, 0x96, 0x15, 0xbc, 0xd8, 0xfb, 0xd7, 0x47, 0xad, 0x90, 0x31, - 0xc1, 0x3f, 0x8d, 0x74, 0x8c, 0x01, 0xbc, 0x71, 0xb8, 0xc2, 0x32, 0x3a, - 0x83, 0xf1, 0xf5, 0x45, 0x07, 0x5e, 0xc8, 0x4d, 0x66, 0xc1, 0x2b, 0x40, - 0xd6, 0x2e, 0xa3, 0x5e, 0xb8, 0xf1, 0xbe, 0x81, 0x11, 0x09, 0x98, 0x55, - 0x8d, 0x69, 0xfd, 0xa5, 0x17, 0x4d, 0x7b, 0xb2, 0xc5, 0x0c, 0x93, 0x73, - 0x0e, 0xb1, 0x09, 0x91, 0xf9, 0xbe, 0x76, 0x26, 0x87, 0x72, 0xbd, 0xe8, - 0x3d, 0x80, 0xfd, 0x6f, 0xaf, 0x28, 0xb3, 0x4b, 0x8a, 0x20, 0x04, 0x7b, - 0xd1, 0x10, 0xd4, 0x3d, 0xca, 0xd5, 0x18, 0x03, 0xcb, 0xbb, 0xc5, 0xdb, - 0x51, 0x20, 0x59, 0x53, 0x96, 0xce, 0x4c, 0x5b, 0x86, 0x16, 0x5f, 0xd5, - 0xb4, 0xc6, 0xc5, 0x19, 0x8d, 0x67, 0xf0, 0x73, 0x0c, 0x49, 0xf1, 0x64, - 0x5f, 0x8b, 0x4c, 0x0c, 0xda, 0x13, 0xd0, 0x0b, 0xd5, 0x44, 0x6d, 0x89, - 0xdb, 0x17, 0xaf, 0xe8, 0x3b, 0xc1, 0x62, 0xfa, 0x95, 0xc5, 0xc3, 0x1c, - 0x50, 0xc1, 0xee, 0xdb, 0x19, 0x66, 0xe2, 0x9d, 0xda, 0x78, 0x43, 0x19, - 0x8b, 0x70, 0xbb, 0x60, 0x34, 0x86, 0x21, 0xd5, 0xb4, 0x38, 0x56, 0x32, - 0x1d, 0xe7, 0x1a, 0x5c, 0xda, 0xb3, 0xd1, 0xec, 0xbf, 0x6f, 0xa1, 0x54, - 0x51, 0xf5, 0xea, 0xb1, 0x1d, 0x64, 0xe7, 0x0d, 0xea, 0xc9, 0xaf, 0x52, - 0x20, 0x74, 0xd6, 0x16, 0xf1, 0xed, 0x66, 0xc4, 0x58, 0xf3, 0x2d, 0xcf, - 0xfe, 0xec, 0x0d, 0x5f, 0xbf, 0x2d, 0xbb, 0x5f, 0x00, 0x04, 0x56, 0x80, - 0xb4, 0xd4, 0x37, 0x3c, 0x59, 0x4e, 0x83, 0xa1, 0x6a, 0x1a, 0xd1, 0x22, - 0x2d, 0xa6, 0x37, 0x41, 0x01, 0xf1, 0x5f, 0xab, 0x0d, 0xc6, 0x72, 0x03, - 0xb2, 0x27, 0x81, 0x9c, 0xf7, 0xcb, 0xe6, 0x91, 0x4d, 0xb1, 0xeb, 0x75, - 0xfe, 0x38, 0xf3, 0x53, 0x25, 0x13, 0x7b, 0x83, 0x5f, 0x83, 0x8c, 0x70, - 0x38, 0xe3, 0x31, 0x33, 0xa9, 0x6d, 0xce, 0x1e, 0x36, 0x79, 0x5a, 0x7d, - 0xac, 0xca, 0xed, 0x84, 0xab, 0x15, 0x16, 0xa6, 0xec, 0xaa, 0x76, 0x06, - 0x23, 0x25, 0x37, 0x68, 0x20, 0xfd, 0x18, 0xa0, 0xe5, 0x51, 0xaf, 0x45, - 0x9b, 0x33, 0x20, 0x47, 0x27, 0xf4, 0x1d, 0xb8, 0x08, 0x26, 0x50, 0x6d, - 0x6e, 0x88, 0xbe, 0xaf, 0x3f, 0x72, 0x46, 0x05, 0xd3, 0x79, 0x84, 0xee, - 0x89, 0x61, 0xaa, 0xc6, 0x16, 0x0d, 0x2f, 0x7e, 0xdf, 0xc5, 0xdd, 0xb1, - 0x66, 0xfe, 0x8c, 0x6b, 0x9f, 0x63, 0x28, 0x02, 0x7a, 0x89, 0x6f, 0xc2, - 0xaf, 0x1a, 0xa2, 0xd5, 0x19, 0x03, 0xb1, 0xc7, 0xe5, 0x61, 0x14, 0xb2, - 0xf6, 0xb3, 0x4f, 0xd1, 0xa2, 0xcd, 0x43, 0x63, 0xe5, 0x6c, 0x14, 0x01, - 0xe8, 0xf4, 0x34, 0xce, 0x6e, 0xcb, 0x32, 0x0d, 0x2e, 0x9d, 0xf3, 0xf1, - 0x99, 0xc3, 0x07, 0x4e, 0xb9, 0x1e, 0x27, 0x21, 0xa5, 0x3a, 0x62, 0x84, - 0xe1, 0x48, 0xf0, 0x5b, 0x16, 0xc6, 0x24, 0x72, 0xb0, 0x0c, 0xf0, 0xbc, - 0x51, 0xc9, 0x75, 0x44, 0x6d, 0x14, 0x75, 0x4d, 0xd0, 0x64, 0x9e, 0x9b, - 0xcb, 0x8e, 0x34, 0x4a, 0x64, 0x7c, 0xce, 0xb2, 0x33, 0xcd, 0xec, 0x17, - 0xf6, 0x8f, 0xdb, 0x94, 0x96, 0x3f, 0x66, 0x7f, 0xad, 0x9a, 0x00, 0x26, - 0xfc, 0x29, 0xff, 0xd1, 0x5d, 0x19, 0x00, 0x91, 0x4b, 0xe3, 0x18, 0x12, - 0xc7, 0x9c, 0x7a, 0xc5, 0x7a, 0x72, 0x32, 0x72, 0xaa, 0x3c, 0x77, 0xb2, - 0x19, 0xf0, 0x89, 0x5f, 0xef, 0x9c, 0x6d, 0xed, 0x46, 0xc8, 0x7e, 0x2b, - 0x26, 0x04, 0xc7, 0x85, 0xee, 0x11, 0x92, 0x9a, 0x07, 0x66, 0x79, 0xf0, - 0x1e, 0x9d, 0x8f, 0x6a, 0x9d, 0xe1, 0x25, 0x2b, 0xb5, 0x97, 0xb4, 0x0b, - 0x69, 0x31, 0xbb, 0x12, 0x69, 0xf2, 0x78, 0x17, 0xd2, 0xbb, 0x2c, 0xad, - 0xc2, 0xa6, 0xea, 0xa8, 0xc7, 0x4e, 0x3b, 0xd6, 0x23, 0x0f, 0xd5, 0xa3, - 0xb4, 0x4e, 0x97, 0x20, 0x91, 0x51, 0x50, 0x52, 0xb1, 0x29, 0xf5, 0x35, - 0x3b, 0x69, 0x9e, 0xe2, 0x5f, 0x48, 0x7d, 0xf6, 0x4d, 0x15, 0xcc, 0x73, - 0xf3, 0x7a, 0x4b, 0x72, 0xa9, 0x22, 0x3d, 0xa8, 0x9f, 0x61, 0xb4, 0x63, - 0xb3, 0xff, 0x2f, 0x82, 0x02, 0xf5, 0xb4, 0x24, 0x5b, 0xd8, 0xa3, 0xdc, - 0x92, 0x7c, 0xe7, 0x74, 0xc1, 0x29, 0xda, 0x8f, 0x4d, 0x62, 0xe2, 0x56, - 0x33, 0x41, 0xa6, 0xaf, 0x2c, 0x0c, 0x03, 0x9e, 0x64, 0x91, 0x7c, 0x08, - 0x14, 0x4a, 0x74, 0x13, 0x06, 0x11, 0x9a, 0xb6, 0x22, 0x61, 0x5b, 0xdf, - 0xce, 0xf0, 0x83, 0x7a, 0x03, 0x55, 0x91, 0x13, 0xfc, 0x3b, 0xc4, 0xe0, - 0xb6, 0x8e, 0x25, 0x41, 0xa4, 0x80, 0x3b, 0x97, 0xea, 0x18, 0xf5, 0x98, - 0x8f, 0x08, 0xe3, 0xcf, 0xd8, 0xce, 0x16, 0x42, 0x9d, 0x2d, 0x04, 0xa5, - 0x54, 0xe3, 0x56, 0xc9, 0xbf, 0x04, 0x8b, 0xcb, 0x86, 0xe1, 0xef, 0x11, - 0x92, 0xf6, 0xad, 0xb4, 0xbe, 0xa7, 0xa4, 0x99, 0xc0, 0x9d, 0x60, 0x34, - 0x1c, 0x48, 0xdb, 0x58, 0x51, 0x4f, 0xd0, 0x32, 0x48, 0x4d, 0x88, 0x00, - 0xc4, 0x6a, 0x6d, 0xa8, 0xee, 0xb9, 0x52, 0x19, 0xab, 0x87, 0x6a, 0x3f, - 0xcd, 0x4a, 0xa8, 0x05, 0x6d, 0xfe, 0x68, 0x38, 0xa0, 0xc0, 0x8f, 0xc0, - 0x57, 0xae, 0x82, 0x62, 0xc3, 0xe8, 0x8e, 0x62, 0x23, 0x83, 0xd0, 0x32, - 0xf0, 0x23, 0x05, 0x01, 0x40, 0x5c, 0xff, 0x27, 0x8f, 0x53, 0x53, 0x9b, - 0x1b, 0x3a, 0xcc, 0x47, 0xa9, 0xdb, 0xd0, 0xed, 0x9f, 0xa4, 0x89, 0xb8, - 0x2f, 0x59, 0x8b, 0xbd, 0xbc, 0x5a, 0x69, 0x49, 0x34, 0xf7, 0xdb, 0xc1, - 0x0f, 0x83, 0xfd, 0xa2, 0xdd, 0x8e, 0x11, 0xa8, 0xc1, 0x43, 0xb2, 0x3b, - 0x85, 0x74, 0x92, 0x77, 0xd7, 0x0d, 0x4e, 0x60, 0xde, 0xf8, 0xed, 0x26, - 0x52, 0x1b, 0x7d, 0x99, 0x51, 0x2f, 0x16, 0x36, 0xeb, 0x7b, 0x52, 0xa6, - 0xbf, 0xfa, 0xce, 0xcc, 0xfe, 0x1d, 0x89, 0xaf, 0x48, 0xed, 0xef, 0xf8, - 0x88, 0x03, 0x58, 0x1e, 0x38, 0xc4, 0x7b, 0x1e, 0xfb, 0x5d, 0x3a, 0x2c, - 0xd7, 0x41, 0xad, 0xe7, 0x09, 0xdf, 0x11, 0x40, 0x97, 0x40, 0x99, 0x1a, - 0x27, 0xee, 0xe0, 0x45, 0x69, 0xf3, 0x9c, 0xa0, 0xf8, 0x06, 0x26, 0x38, - 0x73, 0x8a, 0x50, 0xc0, 0x33, 0x46, 0x03, 0xd7, 0x77, 0x49, 0x7f, 0x19, - 0x5e, 0xf6, 0xa6, 0x4d, 0xb6, 0x3e, 0x96, 0x06, 0xbd, 0x6a, 0x3e, 0xc9, - 0x0b, 0x8f, 0x1d, 0x3d, 0x49, 0x11, 0xc6, 0x8a, 0xc0, 0x92, 0x86, 0x0a, - 0xbc, 0x97, 0x2c, 0x92, 0xe1, 0x90, 0xcb, 0x2a, 0x33, 0xe1, 0x4b, 0x98, - 0x4e, 0x8f, 0xa2, 0xa5, 0x14, 0x5f, 0x39, 0xdb, 0xf8, 0xca, 0x0c, 0xd2, - 0xeb, 0xb4, 0x88, 0xe8, 0xd8, 0x3c, 0xc2, 0x70, 0x6f, 0x51, 0xb1, 0x66, - 0x7c, 0xff, 0x58, 0xd3, 0xfa, 0x71, 0x09, 0xa9, 0x9b, 0x4b, 0x8a, 0x75, - 0x19, 0x39, 0x3b, 0x46, 0x9f, 0xee, 0x20, 0x6d, 0xbb, 0x8e, 0x3a, 0x5e, - 0x17, 0x4a, 0x89, 0xd4, 0x32, 0x23, 0xc4, 0x37, 0xdc, 0x08, 0x74, 0x78, - 0x16, 0x12, 0x4d, 0x86, 0xcd, 0xd7, 0xb6, 0x57, 0x73, 0x73, 0x6e, 0x60, - 0xa2, 0xb7, 0xa9, 0xa3, 0xb2, 0xab, 0xed, 0xc0, 0xa7, 0xd0, 0xd0, 0x03, - 0x58, 0xdf, 0xf8, 0x3f, 0xb2, 0xea, 0x25, 0xdd, 0xab, 0x7d, 0x56, 0xdc, - 0xcd, 0x9e, 0x70, 0xe2, 0x02, 0xe9, 0x3e, 0xb9, 0xe2, 0xd2, 0x2b, 0x08, - 0xe3, 0x2a, 0x87, 0xd0, 0xf0, 0xb2, 0x41, 0xe5, 0x5d, 0x43, 0x5b, 0xf7, - 0xbc, 0xd9, 0xa6, 0xb6, 0xfe, 0xeb, 0x11, 0xed, 0xd2, 0xae, 0x9a, 0x54, - 0x96, 0x21, 0xb3, 0x86, 0x8b, 0xe1, 0x14, 0x9d, 0x38, 0xd1, 0x32, 0x08, - 0x36, 0x9d, 0x08, 0xd1, 0xce, 0x72, 0x8b, 0x72, 0xa7, 0x70, 0x40, 0x29, - 0x72, 0x97, 0xca, 0xf7, 0xba, 0x11, 0xb8, 0x60, 0x0f, 0xff, 0xd4, 0x18, - 0x70, 0x9f, 0x83, 0xe6, 0xa7, 0x82, 0x25, 0xef, 0xd7, 0x09, 0xc5, 0x2f, - 0x78, 0xce, 0xb5, 0x77, 0xa8, 0x23, 0xae, 0x2d, 0x51, 0x8a, 0x7a, 0xfc, - 0x3f, 0xd9, 0x51, 0x42, 0xfc, 0x1e, 0xd7, 0x03, 0xcb, 0xba, 0x64, 0x81, - 0x28, 0xae, 0x99, 0xe4, 0x5e, 0xdf, 0xee, 0xd7, 0x26, 0x18, 0x5c, 0x3d, - 0xee, 0xf2, 0x2a, 0xfd, 0x80, 0x89, 0x44, 0x15, 0xc1, 0x87, 0xec, 0x99, - 0x65, 0x53, 0x62, 0xf6, 0xe0, 0x0d, 0x0f, 0x2c, 0x2a, 0x76, 0xf2, 0x02, - 0x7c, 0xca, 0xd0, 0xd7, 0x05, 0x4d, 0x7a, 0x89, 0x36, 0x56, 0x6d, 0xc8, - 0x21, 0x01, 0xcd, 0x0b, 0x25, 0xa9, 0xac, 0x0c, 0xb6, 0x75, 0x04, 0xf8, - 0x97, 0xb6, 0xb9, 0x65, 0x47, 0xe0, 0xd8, 0xef, 0x54, 0x68, 0x27, 0x00, - 0x34, 0x65, 0x05, 0x95, 0xd5, 0xd5, 0xe6, 0xb3, 0x51, 0x46, 0x40, 0x1c, - 0x8f, 0x8e, 0x74, 0x6b, 0xca, 0x03, 0x1b, 0x7d, 0x8a, 0x5f, 0xd3, 0xfa, - 0x0c, 0x0f, 0x31, 0x18, 0xda, 0x66, 0xb5, 0xc3, 0x43, 0x07, 0x29, 0x91, - 0x74, 0x3b, 0xa7, 0x96, 0x62, 0x93, 0xdc, 0xdb, 0xbe, 0xa3, 0xea, 0xd1, - 0x7d, 0x12, 0x1b, 0x21, 0xaf, 0x0a, 0x71, 0x7a, 0x29, 0x96, 0xb7, 0x86, - 0x55, 0x93, 0x53, 0x3c, 0x48, 0xdf, 0x3e, 0x03, 0xbd, 0xe1, 0x0d, 0x3b, - 0x47, 0x1f, 0x57, 0xfe, 0x32, 0xda, 0x50, 0x43, 0x45, 0xc1, 0x3c, 0xea, - 0xcb, 0x0a, 0xcd, 0x92, 0x02, 0x84, 0x8e, 0x9e, 0xa1, 0x2b, 0xc8, 0xc7, - 0xe2, 0xab, 0x7e, 0x5d, 0x37, 0xa9, 0x03, 0x6e, 0x89, 0xdc, 0x53, 0x2f, - 0x37, 0xbf, 0xe6, 0x21, 0x00, 0x85, 0x1c, 0xfe, 0xc7, 0x67, 0xca, 0xdf, - 0x48, 0x91, 0xfb, 0x75, 0x6a, 0x6b, 0x37, 0xaa, 0x21, 0xeb, 0x01, 0x0d, - 0x6f, 0x0c, 0x4a, 0xbe, 0xde, 0xa0, 0xf3, 0xa0, 0x68, 0x06, 0x42, 0xbb, - 0x08, 0x6c, 0xf1, 0xdc, 0x40, 0x70, 0xe2, 0x71, 0xd9, 0x9c, 0xb1, 0xae, - 0xd7, 0xb0, 0x22, 0x85, 0xa8, 0xc9, 0x19, 0x66, 0x17, 0xd9, 0xd5, 0x5b, - 0xd9, 0xe6, 0x0f, 0x6a, 0xb1, 0xbc, 0x51, 0xcd, 0xb5, 0xb5, 0x48, 0x02, - 0xf1, 0x21, 0xcb, 0xd7, 0x18, 0x2e, 0x1b, 0xeb, 0x78, 0x78, 0xe1, 0x3a, - 0xea, 0x26, 0x88, 0xc8, 0x74, 0x87, 0xd8, 0xce, 0x5f, 0xa5, 0xd6, 0xf6, - 0x97, 0x50, 0xf0, 0x72, 0x30, 0xcc, 0xa7, 0x3e, 0x67, 0xfd, 0xe6, 0x44, - 0x6d, 0xdc, 0xe6, 0xb2, 0x92, 0x2a, 0x45, 0x36, 0x69, 0x99, 0x6a, 0xf5, - 0xcf, 0xc4, 0x49, 0xe4, 0x8e, 0xe2, 0x4d, 0x75, 0x9d, 0x2e, 0x4b, 0xec, - 0x16, 0xbc, 0xaf, 0xd6, 0x96, 0x13, 0x7b, 0xfe, 0xf2, 0x4d, 0xf5, 0x72, - 0xcd, 0x0a, 0x20, 0x43, 0xd8, 0xa1, 0x0f, 0x92, 0x77, 0x88, 0x32, 0x88, - 0x66, 0xdc, 0x09, 0x16, 0x65, 0x61, 0x3f, 0xaf, 0x83, 0x01, 0xfa, 0x2d, - 0xeb, 0x4e, 0x72, 0x6f, 0xf4, 0x38, 0x02, 0x03, 0x99, 0xeb, 0x89, 0xa9, - 0x55, 0xe0, 0xb7, 0x97, 0x26, 0xa0, 0x70, 0xd4, 0x17, 0x37, 0x4d, 0x29, - 0x3d, 0x22, 0x2a, 0x43, 0x5e, 0x4b, 0x45, 0x3c, 0x02, 0xed, 0x82, 0x9c, - 0x65, 0x02, 0x56, 0x42, 0x73, 0x1f, 0xfe, 0xdf, 0xff, 0x8b, 0xe5, 0xfc, - 0x08, 0x4f, 0x02, 0x11, 0x50, 0xba, 0x56, 0xe1, 0x9a, 0xdb, 0x02, 0xe5, - 0x4b, 0xe3, 0xe4, 0x2f, 0x8d, 0xfb, 0x5f, 0x0a, 0x73, 0xd4, 0xfe, 0xd2, - 0x8e, 0x65, 0x7f, 0x37, 0x92, 0xd0, 0x3d, 0x11, 0x49, 0x28, 0xac, 0x0f, - 0xc0, 0xf4, 0x98, 0x74, 0xa6, 0x2f, 0x92, 0x23, 0x02, 0x3d, 0xf9, 0xdb, - 0x9b, 0x5f, 0x88, 0x71, 0x6a, 0xa1, 0x8b, 0xb9, 0x7e, 0xaf, 0x1e, 0xf4, - 0x5a, 0x65, 0x2a, 0x8d, 0x95, 0xe5, 0x9a, 0x1c, 0x8a, 0xd3, 0xc2, 0x21, - 0x57, 0xde, 0xfb, 0x08, 0x7b, 0xb0, 0xa7, 0x77, 0x94, 0x89, 0x96, 0xaa, - 0x31, 0x4b, 0x75, 0x43, 0xb4, 0xdb, 0x04, 0xde, 0x3e, 0x83, 0xe2, 0x09, - 0x15, 0x51, 0x2d, 0xb7, 0x7d, 0x67, 0x68, 0x96, 0xdd, 0x67, 0xe8, 0xce, - 0x1e, 0xc6, 0x5e, 0xc8, 0x80, 0xe3, 0x54, 0xe0, 0x32, 0x62, 0xe6, 0x5f, - 0xf3, 0x04, 0x4e, 0x18, 0xfc, 0xcd, 0xfd, 0x29, 0x2d, 0x27, 0x19, 0x75, - 0xd6, 0x73, 0x7b, 0xa2, 0xbd, 0xf1, 0xa4, 0x3b, 0x07, 0x03, 0x30, 0xc9, - 0xf0, 0xf8, 0xed, 0xa7, 0xd2, 0x23, 0x0d, 0x7f, 0x58, 0x90, 0x8a, 0x74, - 0xfc, 0x5b, 0x87, 0x82, 0x1c, 0x87, 0xd2, 0xdb, 0x3f, 0x67, 0x76, 0x87, - 0xc9, 0x7f, 0xf9, 0x5c, 0x1b, 0x20, 0xbe, 0x6a, 0xfa, 0x4f, 0xc6, 0x8f, - 0x02, 0xa6, 0x55, 0x6d, 0x78, 0x1d, 0xdb, 0xb3, 0xd8, 0x2b, 0xe2, 0xa2, - 0xce, 0x45, 0x97, 0x24, 0x38, 0x1e, 0x48, 0xd7, 0x24, 0x4b, 0x43, 0xd0, - 0xba, 0xbd, 0xc1, 0xee, 0x84, 0x91, 0xb2, 0x1a, 0x4c, 0x25, 0x42, 0xa3, - 0xf6, 0x29, 0x1f, 0xd8, 0x20, 0x0a, 0x86, 0xe6, 0xcc, 0x2e, 0xdd, 0xef, - 0xb4, 0x56, 0x20, 0x5a, 0x1d, 0xd9, 0xb8, 0x09, 0x14, 0x1f, 0x45, 0x4a, - 0x99, 0xa6, 0xe0, 0x11, 0xa4, 0xba, 0xf7, 0x6f, 0x07, 0x7a, 0x9b, 0x7d, - 0x43, 0x30, 0x15, 0xb9, 0x1c, 0x22, 0x62, 0xf9, 0x6e, 0x6e, 0xe5, 0xcd, - 0x5a, 0xd2, 0xa1, 0x26, 0x65, 0xa1, 0xa3, 0x95, 0xb3, 0x2f, 0x41, 0x7e, - 0x2d, 0xc4, 0x64, 0x88, 0xe3, 0xf8, 0x94, 0x08, 0xfc, 0x5c, 0x9f, 0x68, - 0xb7, 0x67, 0xef, 0x76, 0x87, 0x31, 0x46, 0xdc, 0xf5, 0xef, 0xb0, 0x4c, - 0x84, 0xfb, 0xa6, 0x00, 0x84, 0x34, 0xe1, 0x1f, 0x8f, 0x44, 0xfe, 0x52, - 0xae, 0x86, 0xdd, 0x36, 0x82, 0xa7, 0xce, 0x8a, 0x8a, 0x9d, 0x4b, 0x3c, - 0xbf, 0x76, 0x85, 0x97, 0x47, 0x42, 0xda, 0x7f, 0xc7, 0xf7, 0xbc, 0xe5, - 0xe7, 0xfd, 0x2e, 0xff, 0x7f, 0xe6, 0xc6, 0x6c, 0x5f, 0x3f, 0x6c, 0x76, - 0xff, 0xe2, 0xaa, 0x0a, 0xf9, 0x9f, 0x99, 0xbc, 0x17, 0x16, 0xef, 0x88, - 0xbc, 0x85, 0xa7, 0x70, 0xbf, 0x6b, 0x49, 0x23, 0x36, 0xf3, 0x81, 0x81, - 0x57, 0xd0, 0xf3, 0x7d, 0x7a, 0xc3, 0x42, 0x15, 0x12, 0xe7, 0x60, 0x75, - 0xb4, 0x3a, 0xa4, 0xa9, 0x95, 0x74, 0xfb, 0xa4, 0x63, 0x9a, 0xce, 0xcd, - 0x6b, 0x05, 0x36, 0x38, 0xac, 0x4a, 0x64, 0x30, 0x19, 0x49, 0x3d, 0xa3, - 0x50, 0x29, 0xb9, 0x63, 0xd4, 0x26, 0x49, 0xf3, 0xf1, 0xda, 0x97, 0x52, - 0x4d, 0xe0, 0xc3, 0x1f, 0x39, 0x26, 0xd6, 0xcd, 0xda, 0x75, 0x0d, 0x8f, - 0xcb, 0xb2, 0x25, 0xa0, 0xc0, 0xbf, 0xc6, 0x91, 0x70, 0xa0, 0x73, 0xc8, - 0x73, 0x0d, 0x96, 0x7c, 0xb6, 0x45, 0xb1, 0xb9, 0x11, 0xb3, 0xb1, 0xb0, - 0x35, 0xda, 0x60, 0x29, 0x13, 0xce, 0x76, 0xc7, 0x6c, 0xae, 0xec, 0xd3, - 0x36, 0xa5, 0xdb, 0x26, 0xf2, 0xd2, 0x4b, 0xdd, 0x1c, 0x8f, 0x49, 0xf0, - 0x23, 0xa4, 0x3e, 0xbb, 0x56, 0x2c, 0xd4, 0xa9, 0x8c, 0xd8, 0x37, 0x96, - 0x82, 0x25, 0xf7, 0x84, 0x74, 0x60, 0x54, 0x6d, 0xab, 0xb7, 0x6e, 0xd1, - 0xb5, 0x54, 0xe2, 0x14, 0x15, 0xb0, 0xf7, 0xab, 0xdb, 0x15, 0x89, 0x14, - 0x39, 0xb2, 0xdc, 0xb6, 0x44, 0xef, 0x5c, 0x5f, 0x18, 0xa9, 0x61, 0x85, - 0x48, 0xdd, 0xfc, 0x29, 0x31, 0x34, 0xcb, 0x69, 0x5e, 0x4a, 0x7a, 0xb9, - 0xd0, 0x01, 0x1b, 0xf4, 0xe5, 0x0a, 0xa4, 0x73, 0x7d, 0x20, 0x18, 0xc3, - 0x7b, 0x88, 0xde, 0x0a, 0x8c, 0x19, 0xf3, 0xbc, 0xf3, 0xb3, 0x48, 0x7b, - 0x88, 0x30, 0xe0, 0x34, 0x3e, 0x37, 0x4e, 0x2c, 0x65, 0x6d, 0x87, 0x81, - 0x65, 0xd6, 0xf0, 0x50, 0x67, 0x5b, 0x9b, 0x1d, 0x5d, 0xb1, 0x80, 0x31, - 0x41, 0x91, 0xdd, 0xce, 0x70, 0xe1, 0x36, 0x4f, 0x81, 0x96, 0xd1, 0x01, - 0x87, 0xc9, 0x74, 0xdd, 0x9c, 0x24, 0x06, 0xdb, 0x23, 0xef, 0x73, 0x54, - 0x8f, 0x3a, 0x1b, 0xbe, 0x2b, 0xac, 0x2e, 0xcb, 0xdf, 0x2b, 0x98, 0x20, - 0x98, 0x6f, 0x6d, 0x4b, 0xef, 0xb5, 0xd6, 0xbb, 0x0b, 0x4b, 0x71, 0xe0, - 0x18, 0x7a, 0x28, 0xef, 0xa6, 0x85, 0x03, 0x98, 0x8e, 0x6a, 0xbd, 0xc2, - 0x72, 0x59, 0x7e, 0x00, 0x20, 0x30, 0x9c, 0x4b, 0x37, 0xf4, 0x40, 0x03, - 0x6b, 0x89, 0xe9, 0x6b, 0x04, 0x41, 0xfd, 0x78, 0x76, 0xce, 0x72, 0x56, - 0xb9, 0xf6, 0x75, 0xbf, 0xa5, 0x10, 0xed, 0x90, 0x44, 0x28, 0xe9, 0x31, - 0xc0, 0x18, 0xc2, 0x3c, 0x09, 0xd4, 0xcb, 0xae, 0xf4, 0x60, 0x4c, 0xcf, - 0xcd, 0x02, 0xb4, 0x32, 0xb7, 0xfa, 0xaa, 0xe7, 0xb4, 0xd8, 0x14, 0x9f, - 0xc6, 0x84, 0x1c, 0x96, 0xd4, 0xc3, 0x37, 0xe6, 0x3f, 0xd9, 0xbd, 0x40, - 0x5e, 0x47, 0xfb, 0xb3, 0x10, 0x80, 0x97, 0xbe, 0xfe, 0x5f, 0x7b, 0xa1, - 0x48, 0xa7, 0x66, 0x9c, 0x05, 0xf6, 0x31, 0x8e, 0xe7, 0xcc, 0xc1, 0x63, - 0xa3, 0x72, 0x51, 0xf8, 0x3e, 0xdc, 0x2a, 0xff, 0xdf, 0x71, 0x34, 0x29, - 0xc1, 0x12, 0xa9, 0xf1, 0x9f, 0x94, 0xdb, 0x26, 0x34, 0xd8, 0xb6, 0x6a, - 0x25, 0x75, 0xb8, 0x45, 0xd2, 0x88, 0xbe, 0x03, 0x10, 0x2f, 0x59, 0xa4, - 0xe7, 0x38, 0x77, 0xb9, 0xaf, 0x74, 0xa4, 0xdc, 0x4f, 0x4b, 0x12, 0x6d, - 0x1c, 0x2e, 0x82, 0x40, 0x2c, 0xb3, 0x59, 0x57, 0x41, 0xca, 0xb1, 0xbf, - 0x94, 0x0f, 0xd2, 0x19, 0xfe, 0x3c, 0xb7, 0x32, 0x4c, 0x02, 0xd0, 0x5f, - 0xc1, 0xab, 0xc1, 0xbe, 0xb0, 0x41, 0xc2, 0x2b, 0xe9, 0x7d, 0x0a, 0xd1, - 0xd7, 0xa1, 0x1c, 0x01, 0xa2, 0xef, 0x15, 0xf1, 0xd0, 0x78, 0x08, 0x15, - 0x31, 0x03, 0xec, 0xa7, 0xfe, 0x7f, 0x97, 0x3e, 0x65, 0xee, 0x5f, 0x49, - 0x4e, 0x63, 0xff, 0x00, 0x05, 0x68, 0xc9, 0xa2, 0xc7, 0x69, 0x63, 0xcd, - 0x11, 0x43, 0xcb, 0x2b, 0xef, 0x97, 0x5f, 0x89, 0x77, 0x73, 0xe5, 0x7c, - 0x11, 0x3a, 0x69, 0x1a, 0x52, 0xf2, 0xff, 0xa8, 0x2b, 0xbc, 0x63, 0xbb, - 0xc0, 0xa9, 0x93, 0xc4, 0xe2, 0xa9, 0x24, 0x49, 0xbb, 0xf8, 0x7a, 0x20, - 0x48, 0x5f, 0x95, 0x22, 0x07, 0xcc, 0x9f, 0x57, 0x71, 0x9d, 0x0c, 0x98, - 0xf9, 0x02, 0xce, 0xc3, 0xe0, 0xce, 0xf4, 0x78, 0xe7, 0x25, 0xca, 0xaf, - 0x31, 0x57, 0xb9, 0xf4, 0xd2, 0xad, 0xd9, 0x94, 0x15, 0x2d, 0x39, 0x2a, - 0x76, 0xf7, 0x5d, 0xc8, 0x10, 0x72, 0x7e, 0xdb, 0x3a, 0x66, 0x8f, 0xad, - 0xa1, 0xdf, 0x90, 0x74, 0x60, 0x35, 0x0b, 0x81, 0x4f, 0x35, 0x19, 0xae, - 0x41, 0x7b, 0x45, 0xcb, 0x93, 0xad, 0x2e, 0x7f, 0xb5, 0x33, 0x37, 0xec, - 0xb6, 0xcc, 0x6b, 0xfd, 0x0e, 0x3b, 0xb0, 0xcd, 0x26, 0x69, 0xbe, 0x7c, - 0xdf, 0x0e, 0xe0, 0x19, 0xa2, 0x6f, 0xfa, 0x24, 0xf6, 0x3a, 0xb1, 0xd1, - 0x9e, 0x9e, 0x69, 0xb3, 0xb5, 0x47, 0x17, 0x8c, 0xf4, 0x15, 0x4e, 0xa7, - 0x38, 0x0a, 0x46, 0xb7, 0x19, 0x79, 0x0b, 0x3a, 0xb0, 0x6b, 0x12, 0x83, - 0x83, 0x13, 0x06, 0x1c, 0x05, 0x7f, 0x1c, 0x48, 0x3d, 0x80, 0x94, 0x3a, - 0x62, 0x03, 0xbd, 0x56, 0xf6, 0x8d, 0x78, 0x21, 0xad, 0xad, 0x84, 0xa3, - 0xc4, 0xc4, 0xf3, 0x2a, 0xa0, 0xb5, 0x6f, 0x3f, 0x72, 0x09, 0xba, 0xf7, - 0x0b, 0xfd, 0xb0, 0x10, 0x20, 0x8b, 0xe8, 0xb6, 0xe6, 0x3c, 0xef, 0xb1, - 0xfd, 0x7d, 0x5e, 0x9d, 0xcb, 0xb3, 0xfa, 0xfe, 0x67, 0x27, 0x7e, 0x04, - 0xc0, 0x4c, 0xdc, 0x6c, 0x2f, 0xeb, 0x45, 0xee, 0xcb, 0xf9, 0x71, 0x10, - 0xf9, 0x73, 0x5a, 0xc3, 0xae, 0x66, 0x3e, 0xb1, 0x52, 0x65, 0x44, 0x85, - 0x51, 0xec, 0xfc, 0x63, 0x7d, 0x10, 0xf0, 0x97, 0x6b, 0xbd, 0xcc, 0xff, - 0xa0, 0x83, 0xd8, 0x0a, 0x05, 0x46, 0xba, 0x46, 0x77, 0x12, 0x7c, 0x06, - 0x7d, 0xa5, 0x37, 0xb3, 0xad, 0x69, 0x7a, 0xfa, 0xd9, 0x0d, 0x74, 0x78, - 0xb3, 0x53, 0x33, 0x2e, 0x88, 0x26, 0x52, 0x26, 0xc7, 0x02, 0xdb, 0x0a, - 0x2c, 0x4d, 0x9d, 0xb9, 0x07, 0xbd, 0x4a, 0x28, 0x2d, 0xd3, 0x97, 0xc1, - 0x37, 0x4b, 0xde, 0x83, 0xa7, 0xb9, 0x0c, 0x6f, 0x87, 0xd9, 0xcd, 0x31, - 0x1e, 0xe1, 0x6d, 0x72, 0x7e, 0xf1, 0xdd, 0x00, 0x0e, 0x00, 0x95, 0x35, - 0x87, 0x3f, 0x87, 0x0d, 0xfa, 0x19, 0x3d, 0xe2, 0x61, 0x0d, 0x54, 0x69, - 0xf3, 0xdc, 0x2e, 0x72, 0x3a, 0x8d, 0xe5, 0x49, 0xd7, 0xdc, 0xdf, 0x3e, - 0x39, 0xfd, 0x34, 0x3c, 0x1e, 0xb4, 0x0a, 0xaa, 0xdb, 0x33, 0x89, 0xde, - 0xaa, 0xcf, 0xe4, 0xb3, 0x57, 0x67, 0x9b, 0xef, 0x15, 0xce, 0x53, 0x8c, - 0x6b, 0x43, 0x0f, 0x8b, 0x41, 0x45, 0xf7, 0x50, 0x31, 0x10, 0x3a, 0x6d, - 0x05, 0x5a, 0xfb, 0x75, 0xc8, 0x46, 0xcc, 0x12, 0x37, 0x6f, 0x6e, 0xcd, - 0x21, 0x8f, 0x87, 0xb2, 0x8f, 0x80, 0xf5, 0x77, 0x9f, 0x25, 0xb8, 0xda, - 0xac, 0xac, 0x24, 0xf2, 0x65, 0x95, 0x81, 0x20, 0x8a, 0x59, 0xf6, 0xe6, - 0xb3, 0x36, 0xc1, 0x75, 0x5e, 0x73, 0x2f, 0x64, 0xd0, 0x01, 0x0a, 0x88, - 0x32, 0xff, 0x1d, 0x23, 0xe0, 0x7f, 0x48, 0x49, 0xad, 0xf5, 0xfe, 0x81, - 0xc6, 0x6e, 0x37, 0x76, 0xa5, 0x3a, 0x4a, 0xf0, 0xeb, 0xb5, 0x0f, 0x72, - 0x9a, 0xc6, 0x52, 0x2f, 0xcd, 0x12, 0xd6, 0x71, 0x98, 0x59, 0x40, 0xb6, - 0x96, 0xde, 0xda, 0x1a, 0x63, 0xa5, 0xc5, 0xbb, 0x35, 0xc9, 0x80, 0x10, - 0x87, 0x4b, 0x0f, 0x31, 0x93, 0x58, 0x34, 0xcb, 0x5c, 0x6f, 0xf6, 0xfa, - 0x06, 0xff, 0x1c, 0x31, 0xc1, 0x90, 0x97, 0x40, 0xb7, 0xa4, 0x4d, 0x06, - 0xbd, 0x4e, 0xbe, 0xc3, 0xf2, 0x91, 0x6d, 0xcb, 0x89, 0xab, 0x9c, 0x3d, - 0x1e, 0xaf, 0x07, 0xcd, 0x15, 0x14, 0x5a, 0x0b, 0xa9, 0x7d, 0xc6, 0xb3, - 0xb9, 0x7e, 0xb8, 0x57, 0x5f, 0x60, 0xb2, 0xf1, 0x86, 0xc0, 0xf2, 0x6e, - 0x1d, 0x0d, 0xfa, 0x16, 0xbd, 0x42, 0xb6, 0x01, 0x9f, 0x51, 0x01, 0xc7, - 0x8c, 0x8e, 0x95, 0xa7, 0x8b, 0x10, 0xb9, 0x56, 0x4b, 0xa5, 0x8d, 0x54, - 0xdc, 0xa2, 0xef, 0x53, 0xc1, 0x4a, 0xab, 0x6a, 0xf0, 0x1d, 0xef, 0x20, - 0xcf, 0xea, 0x6e, 0x30, 0xde, 0x03, 0x62, 0x7b, 0xe3, 0x86, 0x4c, 0x54, - 0x95, 0x7a, 0x6b, 0xe9, 0x2e, 0x08, 0x40, 0xcf, 0xef, 0x88, 0xf8, 0x6d, - 0xc0, 0x26, 0x23, 0xe6, 0xd8, 0xd7, 0xf0, 0x67, 0x38, 0xfe, 0x73, 0x05, - 0xad, 0x35, 0x53, 0x12, 0xd3, 0xef, 0x7e, 0xb2, 0xf4, 0x44, 0x5b, 0x71, - 0x11, 0xa2, 0xe9, 0x4b, 0xea, 0x81, 0x2a, 0xe7, 0x28, 0xaf, 0x0a, 0x6a, - 0x88, 0x98, 0x5a, 0x48, 0x37, 0x26, 0x39, 0x61, 0xa2, 0xae, 0x90, 0x23, - 0x94, 0xe5, 0x39, 0x64, 0x13, 0xe1, 0x0a, 0x7f, 0xdf, 0xb8, 0x70, 0xca, - 0x7b, 0x14, 0xc0, 0xeb, 0xb3, 0x12, 0x40, 0x6a, 0xe8, 0x6f, 0xb2, 0xb4, - 0xfd, 0x7a, 0x52, 0x50, 0x6f, 0x51, 0xb1, 0x9d, 0x31, 0xf6, 0xef, 0xe2, - 0x66, 0xff, 0xb8, 0x67, 0x6f, 0x76, 0x86, 0x40, 0x0d, 0xb2, 0xed, 0x4a, - 0x48, 0xae, 0x63, 0x3b, 0x5d, 0x5c, 0x87, 0xeb, 0xb2, 0xde, 0xf8, 0xb8, - 0x99, 0x57, 0xde, 0x38, 0x21, 0x8b, 0x7f, 0x91, 0x87, 0x01, 0x92, 0x63, - 0x3b, 0x60, 0xad, 0x95, 0xa4, 0x08, 0x06, 0xe4, 0x88, 0x84, 0xd3, 0xc2, - 0x0f, 0x18, 0x9c, 0x69, 0x15, 0x64, 0x05, 0x71, 0x77, 0x7b, 0x5d, 0x23, - 0x75, 0x20, 0x8d, 0xdb, 0xbe, 0x06, 0x14, 0xc1, 0x47, 0x6c, 0x69, 0xba, - 0xad, 0xcd, 0xa0, 0xb2, 0xde, 0x7a, 0x6f, 0x43, 0x90, 0x22, 0xa5, 0xba, - 0x2a, 0x3f, 0xf1, 0xe3, 0x28, 0xe5, 0x78, 0x91, 0xd7, 0xbd, 0x0b, 0xd7, - 0x90, 0x1c, 0x62, 0x9f, 0xd3, 0xec, 0x6e, 0x85, 0x65, 0x6f, 0x8b, 0xcb, - 0xd1, 0xcc, 0x95, 0x0b, 0xa0, 0x51, 0xf6, 0x59, 0x72, 0x29, 0xd1, 0xb0, - 0xa3, 0xcb, 0x2c, 0x47, 0xec, 0xe4, 0x6e, 0xa8, 0x14, 0x5b, 0xcf, 0xfc, - 0x98, 0xd4, 0x13, 0x7b, 0x41, 0xb6, 0xe1, 0x68, 0x23, 0x3c, 0x95, 0xf9, - 0x47, 0x4e, 0x5a, 0xee, 0x1b, 0xc2, 0xd5, 0xda, 0xd4, 0x6e, 0x5d, 0xd9, - 0x59, 0x32, 0x7f, 0xaf, 0x81, 0x64, 0x50, 0x90, 0xd2, 0xd8, 0xae, 0x28, - 0x5b, 0x79, 0xb6, 0x40, 0x0f, 0x61, 0xee, 0x2d, 0xd4, 0x19, 0x1c, 0x45, - 0x23, 0xae, 0xb9, 0x9c, 0x57, 0x73, 0x22, 0x13, 0xe8, 0x6e, 0x5f, 0x89, - 0x19, 0xdf, 0xc7, 0x83, 0x08, 0xae, 0xa8, 0xcb, 0x74, 0xf3, 0xf2, 0x5d, - 0xa8, 0x2b, 0x93, 0x2b, 0xf7, 0x77, 0xb6, 0xf5, 0x26, 0xb6, 0x77, 0x4b, - 0x8f, 0xae, 0xd0, 0xcf, 0x61, 0x39, 0xab, 0x65, 0x4a, 0x6d, 0x0e, 0xb7, - 0xca, 0xdd, 0x97, 0xfe, 0x0c, 0xa2, 0x93, 0x48, 0x91, 0x14, 0x79, 0xa8, - 0x8c, 0xb8, 0xe8, 0x3e, 0x74, 0x36, 0x3d, 0x63, 0x74, 0x80, 0xea, 0x3c, - 0xb0, 0x5c, 0x25, 0x09, 0x47, 0x18, 0x8d, 0x47, 0x19, 0xb6, 0x0e, 0x69, - 0x9d, 0x1a, 0x62, 0x8e, 0xf8, 0x51, 0xe8, 0xba, 0x09, 0x7e, 0x3d, 0x81, - 0xce, 0xd4, 0x70, 0xc3, 0xd7, 0xf5, 0x10, 0xc0, 0x7a, 0xd9, 0x71, 0xc4, - 0xef, 0x4c, 0xf5, 0xfd, 0xd0, 0xf9, 0xc2, 0x58, 0x1a, 0x95, 0xde, 0xf2, - 0xa6, 0xe0, 0x27, 0xe2, 0xe0, 0x61, 0x14, 0x74, 0x2c, 0x9f, 0x4f, 0xb2, - 0x55, 0x84, 0x9e, 0x49, 0x32, 0xba, 0x61, 0x43, 0xfd, 0x6c, 0xb9, 0x61, - 0x82, 0x03, 0xd6, 0x24, 0xb9, 0x7d, 0x1d, 0x6c, 0xef, 0xf5, 0xa0, 0xb1, - 0x8b, 0xe7, 0x04, 0x7b, 0x44, 0x3e, 0x15, 0x88, 0x08, 0x70, 0xd1, 0x7a, - 0xe8, 0x2f, 0x58, 0x34, 0x4a, 0x2d, 0x7c, 0x26, 0xbd, 0xaa, 0xe5, 0x38, - 0x32, 0xb2, 0xeb, 0x10, 0x73, 0xf9, 0x03, 0xdd, 0x62, 0x6c, 0xd4, 0x11, - 0x6d, 0xc5, 0xb8, 0x54, 0x93, 0xfb, 0x4a, 0x9d, 0x3f, 0x94, 0x93, 0x47, - 0x31, 0x11, 0xf0, 0xdd, 0x23, 0x9c, 0x9e, 0xf6, 0x7e, 0xda, 0x5d, 0x8e, - 0xbd, 0xe4, 0xd7, 0xb0, 0xee, 0x81, 0xc9, 0xca, 0xd7, 0xb7, 0xc5, 0x45, - 0x59, 0xdf, 0xc4, 0x20, 0x3e, 0x1e, 0xc6, 0xa5, 0xf0, 0x8a, 0xdd, 0x85, - 0xe1, 0x25, 0xe7, 0xb6, 0x4d, 0xcb, 0x77, 0x86, 0x33, 0x03, 0x20, 0xff, - 0xf7, 0x09, 0x4c, 0x06, 0x31, 0x21, 0x3d, 0x06, 0xa2, 0xaf, 0x8d, 0x4e, - 0xc9, 0x43, 0x0d, 0x70, 0x51, 0x46, 0xc8, 0xfa, 0x8e, 0x95, 0xbd, 0x0d, - 0x64, 0x04, 0xcb, 0xc5, 0x9d, 0x9a, 0xdd, 0x81, 0x71, 0x2b, 0xd5, 0x22, - 0x37, 0x0e, 0xf9, 0x70, 0x56, 0x96, 0x02, 0xca, 0xb1, 0x37, 0x2e, 0x6c, - 0xd3, 0xd8, 0xdf, 0xbe, 0x7b, 0x7c, 0xee, 0xdc, 0x3c, 0xf4, 0xe3, 0x95, - 0xf8, 0xcd, 0xb0, 0xc0, 0xb0, 0xa9, 0x58, 0x28, 0xd6, 0x58, 0xa2, 0x87, - 0x83, 0x5f, 0x1b, 0xc6, 0x78, 0x03, 0xb3, 0x06, 0x90, 0x76, 0x43, 0x42, - 0xc5, 0xae, 0x3d, 0x36, 0x9e, 0xaf, 0xe5, 0xcb, 0xb9, 0x2b, 0x95, 0x1f, - 0x4d, 0x43, 0x11, 0x7c, 0xc7, 0x58, 0x3d, 0xde, 0xa9, 0x6d, 0x1d, 0xb2, - 0xc3, 0xf7, 0xee, 0x93, 0x60, 0xcc, 0xec, 0x22, 0xa5, 0xf0, 0xc5, 0x34, - 0x96, 0x96, 0xc1, 0xb8, 0x33, 0xeb, 0x1b, 0xee, 0x82, 0xd6, 0x7e, 0x72, - 0x35, 0x99, 0xa9, 0x4b, 0x20, 0x0b, 0x6c, 0xbe, 0x15, 0x1c, 0xcb, 0x6e, - 0x8a, 0x3f, 0x38, 0x33, 0xb1, 0xae, 0x54, 0xd0, 0x82, 0x83, 0xdf, 0x4f, - 0x23, 0x51, 0x3c, 0x0b, 0xe0, 0x8e, 0xb1, 0xd5, 0xc8, 0x23, 0xc7, 0xb0, - 0xd6, 0x82, 0x31, 0x32, 0x5b, 0x21, 0x7d, 0x68, 0x72, 0x61, 0x02, 0xb8, - 0xd7, 0x0b, 0x31, 0xda, 0xdd, 0x9f, 0xa9, 0xee, 0xfa, 0xae, 0x05, 0x54, - 0x4d, 0x51, 0xaf, 0x9f, 0x68, 0x67, 0xe4, 0x85, 0xc5, 0x5f, 0x0d, 0xa3, - 0x26, 0x96, 0x2f, 0xe8, 0x43, 0x10, 0xce, 0x95, 0x92, 0xfc, 0x1b, 0xe6, - 0xa0, 0xca, 0xdf, 0x4c, 0x68, 0xa6, 0x16, 0x5b, 0x7a, 0xc3, 0xa4, 0x51, - 0x3a, 0x44, 0x2d, 0x74, 0x85, 0x2b, 0xc5, 0x54, 0x24, 0x21, 0x06, 0xf7, - 0xc0, 0xb9, 0x97, 0x73, 0x60, 0x76, 0xd3, 0xbc, 0x55, 0xed, 0x24, 0xe4, - 0xaa, 0x67, 0xa5, 0xa7, 0xd3, 0x47, 0xab, 0x80, 0xc6, 0x48, 0x2d, 0x2d, - 0xa5, 0xf8, 0xbc, 0x19, 0x65, 0xa3, 0x62, 0xdc, 0x8e, 0xb9, 0x00, 0x8a, - 0x87, 0x62, 0x3c, 0x44, 0xee, 0xcf, 0xaf, 0x0e, 0x60, 0x48, 0x5e, 0x06, - 0x5f, 0x49, 0x29, 0x1a, 0x01, 0x08, 0x60, 0x3d, 0x44, 0x85, 0xbb, 0xb0, - 0x61, 0x98, 0xfc, 0xa8, 0x80, 0x62, 0x24, 0x1c, 0xc4, 0xfc, 0xb1, 0x09, - 0xee, 0x93, 0x10, 0xef, 0xf4, 0xa4, 0x55, 0x9a, 0x2e, 0x73, 0x3f, 0x97, - 0x5f, 0x4b, 0x76, 0x06, 0x0c, 0xb3, 0x37, 0xfd, 0xbd, 0x61, 0x1d, 0x63, - 0x1f, 0x0b, 0x15, 0xa9, 0x44, 0xaf, 0x0c, 0xed, 0x0c, 0x46, 0x65, 0x8e, - 0x60, 0x8d, 0x23, 0x02, 0x2b, 0xd9, 0x94, 0x9d, 0x3e, 0x65, 0xf7, 0xbf, - 0x60, 0xb5, 0x3e, 0x59, 0x0f, 0xe5, 0x12, 0x79, 0xe4, 0x8d, 0x83, 0x58, - 0xcb, 0xcb, 0x79, 0x14, 0x81, 0x1d, 0x43, 0x62, 0x5c, 0x2f, 0xe8, 0x6f, - 0x99, 0x75, 0xb1, 0x26, 0xca, 0x82, 0x80, 0x36, 0xc6, 0x50, 0x24, 0x68, - 0x11, 0xf7, 0xf8, 0xbe, 0xbf, 0x14, 0x0f, 0x8b, 0x7b, 0x64, 0x30, 0x27, - 0x28, 0x3f, 0x84, 0x55, 0xd8, 0xec, 0x95, 0x90, 0x7d, 0xd9, 0xd6, 0x38, - 0xdf, 0xfb, 0xa8, 0x22, 0x64, 0xe9, 0x6e, 0x4d, 0xc5, 0xf4, 0x91, 0xcc, - 0xca, 0x37, 0x72, 0x63, 0xba, 0xde, 0xa0, 0xc2, 0x0d, 0x6a, 0x22, 0x84, - 0xff, 0x17, 0xa8, 0xc8, 0x7c, 0xaf, 0x31, 0x76, 0x23, 0x88, 0x4c, 0x13, - 0xfe, 0x81, 0x76, 0xa7, 0x47, 0x1a, 0xe1, 0x0c, 0xb4, 0xff, 0x38, 0x8b, - 0xe2, 0x63, 0x3e, 0xf6, 0x3a, 0x05, 0xc6, 0x2c, 0x52, 0x68, 0x7e, 0x10, - 0x07, 0xf2, 0x1d, 0xd7, 0x9a, 0x6f, 0xa3, 0x7f, 0xbe, 0xdb, 0x45, 0x00, - 0xcf, 0x9d, 0xef, 0x47, 0xa7, 0xe0, 0xe0, 0x70, 0xb7, 0x52, 0x2e, 0x34, - 0x06, 0xd6, 0xef, 0xe2, 0x30, 0xfd, 0x5d, 0xfb, 0xd6, 0xf1, 0x42, 0x17, - 0xad, 0xc4, 0x94, 0xce, 0xdd, 0xde, 0x0a, 0x5e, 0x2d, 0xe3, 0xc6, 0x36, - 0x69, 0xdf, 0xed, 0xdd, 0x09, 0xee, 0xd5, 0x0e, 0x31, 0xff, 0x58, 0xa4, - 0x76, 0x1d, 0x46, 0x29, 0x6d, 0x93, 0xac, 0x4d, 0xb9, 0x25, 0xd7, 0x67, - 0xe4, 0x71, 0xe2, 0xa7, 0xd7, 0x9c, 0xe3, 0x8b, 0xd0, 0xb3, 0xd9, 0xd4, - 0x9b, 0xbd, 0xee, 0x96, 0x8c, 0xd9, 0xe4, 0xd2, 0xc6, 0x01, 0x5b, 0x6e, - 0x09, 0x94, 0x06, 0xe7, 0x81, 0x84, 0xa2, 0x26, 0x51, 0x63, 0xc3, 0x8d, - 0xd2, 0xd3, 0x8c, 0xd3, 0x07, 0xbf, 0x39, 0xee, 0x1b, 0x9c, 0xac, 0xe8, - 0x96, 0x41, 0xc1, 0x3d, 0x8c, 0xf1, 0x0f, 0xdc, 0x60, 0x90, 0x96, 0xa8, - 0x98, 0xce, 0x2b, 0xc0, 0xbb, 0xbf, 0x19, 0x24, 0x71, 0x12, 0x01, 0x59, - 0x65, 0x41, 0x82, 0x26, 0xe9, 0x64, 0xe2, 0xa0, 0x10, 0xec, 0x2b, 0x32, - 0x1c, 0x5e, 0x48, 0x97, 0x86, 0x0d, 0x44, 0xe2, 0x95, 0xdf, 0xcb, 0xa3, - 0x1d, 0xb0, 0x00, 0x37, 0x66, 0x44, 0xb7, 0x0b, 0x0b, 0xbc, 0x6e, 0x29, - 0x6d, 0x5c, 0xb7, 0xc0, 0xd6, 0xd1, 0x9a, 0x08, 0x89, 0xd4, 0xde, 0x81, - 0xf4, 0x65, 0xb1, 0xc2, 0x39, 0x80, 0x7c, 0x46, 0xc5, 0xfc, 0xca, 0x44, - 0x5c, 0x7f, 0x35, 0x3e, 0x69, 0x8d, 0x99, 0xa4, 0x18, 0x94, 0x97, 0xb9, - 0x0c, 0xa5, 0x42, 0x79, 0x2a, 0xd0, 0xd6, 0x92, 0xec, 0x32, 0x6e, 0xa0, - 0x69, 0x59, 0x1a, 0x18, 0xc4, 0xd9, 0x73, 0x2a, 0x52, 0xc0, 0xfd, 0x74, - 0xc6, 0xb0, 0xc8, 0x1a, 0x7f, 0x63, 0xf1, 0xa6, 0x15, 0x65, 0x8b, 0xe8, - 0x9b, 0x13, 0x99, 0xdf, 0x07, 0xed, 0x9c, 0xbb, 0xee, 0x1b, 0xb2, 0x79, - 0x08, 0x2a, 0x74, 0x8c, 0xf9, 0x0f, 0x23, 0x00, 0x63, 0xfa, 0x4c, 0x3a, - 0x1d, 0x11, 0x6e, 0x2d, 0x23, 0x2d, 0x10, 0xae, 0xc8, 0xc9, 0x82, 0x24, - 0x32, 0x68, 0xff, 0x50, 0xcd, 0x4c, 0x0c, 0x85, 0x5d, 0xee, 0xdb, 0x56, - 0x48, 0x62, 0x75, 0xb8, 0x88, 0x59, 0xab, 0x1e, 0x41, 0x39, 0x6e, 0x42, - 0x6b, 0x18, 0xa4, 0xa5, 0x20, 0xa0, 0x31, 0x5b, 0xf0, 0x30, 0x9c, 0x54, - 0x8d, 0x3c, 0x3d, 0x27, 0x07, 0x55, 0x79, 0x27, 0x0d, 0x4a, 0x33, 0x36, - 0x8c, 0x61, 0x6e, 0xb2, 0x7c, 0x10, 0xbe, 0xce, 0xab, 0x75, 0x65, 0xb7, - 0xd0, 0xa9, 0xcb, 0x84, 0xff, 0xdf, 0x07, 0x9a, 0x35, 0x03, 0x2f, 0x3d, - 0xe2, 0x06, 0x63, 0xde, 0x0b, 0xc3, 0x85, 0x71, 0xb8, 0x1e, 0x2c, 0x7d, - 0xc2, 0x6b, 0xfa, 0xcb, 0x58, 0x44, 0x3d, 0x4d, 0xe5, 0xe5, 0x44, 0x83, - 0x60, 0x50, 0x0a, 0xe3, 0x97, 0xe4, 0x0e, 0x86, 0xe5, 0x7b, 0xa0, 0xbe, - 0x84, 0xec, 0x5b, 0x1b, 0xcb, 0xc9, 0xca, 0x70, 0x3e, 0x8f, 0xfa, 0xa5, - 0x09, 0x62, 0x62, 0xd5, 0x8c, 0x20, 0x43, 0x17, 0x84, 0xeb, 0xc6, 0x4a, - 0xbf, 0xb6, 0xc4, 0x36, 0x0e, 0x05, 0xae, 0x1e, 0xaf, 0x38, 0x85, 0x2a, - 0x87, 0x48, 0x18, 0xcd, 0x27, 0xc5, 0x53, 0x8d, 0x7e, 0x2d, 0x33, 0x41, - 0x71, 0xe2, 0x5b, 0x90, 0xf8, 0x60, 0x47, 0x0a, 0x7d, 0x63, 0x6b, 0xba, - 0x8c, 0x2e, 0x24, 0x9a, 0x11, 0x31, 0xe8, 0x30, 0xaf, 0xc8, 0x69, 0xe0, - 0x34, 0x05, 0x60, 0x94, 0xb2, 0x1e, 0x0e, 0x5d, 0xd8, 0x8f, 0x5a, 0x55, - 0xba, 0x4a, 0x01, 0x9d, 0xbf, 0x73, 0x53, 0x1e, 0xd5, 0x56, 0x7c, 0x82, - 0xba, 0xf5, 0xd2, 0x56, 0xf7, 0x06, 0xec, 0x6a, 0x65, 0xba, 0x68, 0xca, - 0x27, 0xee, 0x19, 0xae, 0x4b, 0x92, 0x71, 0x98, 0x8b, 0x07, 0x2d, 0x6d, - 0x64, 0xfe, 0x06, 0xf8, 0xc8, 0xb4, 0x87, 0x8d, 0x95, 0x67, 0xcc, 0x2c, - 0xb9, 0x6a, 0xa0, 0x68, 0x73, 0xc4, 0xae, 0x20, 0x91, 0x39, 0x61, 0xef, - 0xdf, 0x63, 0x15, 0x36, 0x8e, 0xaa, 0x72, 0xf0, 0x1e, 0x9d, 0xe2, 0x86, - 0xa8, 0x1a, 0x05, 0x05, 0x5d, 0xfe, 0x0b, 0xb5, 0x91, 0x78, 0x29, 0x9e, - 0x4b, 0x89, 0xab, 0x81, 0xa7, 0x21, 0x91, 0xc6, 0x9c, 0x05, 0x8d, 0x7d, - 0x9b, 0xfe, 0x2d, 0x6c, 0x78, 0xab, 0x37, 0xf8, 0xee, 0x70, 0x1b, 0x36, - 0x55, 0x7a, 0x6d, 0x56, 0xaf, 0x95, 0x05, 0x9d, 0xa4, 0x1f, 0x29, 0xc6, - 0xde, 0x74, 0x83, 0xfd, 0x5c, 0xb6, 0x5e, 0x2f, 0xd5, 0x24, 0x26, 0xa8, - 0x61, 0xd0, 0xb8, 0xac, 0xad, 0x81, 0x4c, 0xf9, 0x2f, 0x95, 0x0c, 0x21, - 0x13, 0x72, 0x07, 0xc3, 0x21, 0x00, 0x08, 0x5f, 0xdb, 0x06, 0x39, 0xb2, - 0x03, 0x77, 0x97, 0x9d, 0xa6, 0x3d, 0x41, 0x33, 0x6a, 0x05, 0xbe, 0x14, - 0xc5, 0x2d, 0xe8, 0x77, 0x11, 0x9b, 0xa4, 0x26, 0x23, 0xc4, 0x51, 0x77, - 0x19, 0xf9, 0x7f, 0xcc, 0x9e, 0x5b, 0x06, 0xd9, 0x79, 0x82, 0x05, 0x33, - 0xfc, 0xcd, 0x35, 0xea, 0xc3, 0x79, 0xc1, 0xe5, 0x33, 0xbe, 0xbd, 0x1c, - 0x6a, 0x23, 0x7a, 0xb5, 0xa2, 0xd0, 0x1a, 0x97, 0x76, 0xb3, 0x9c, 0x28, - 0x46, 0xec, 0xfe, 0x84, 0xa7, 0xee, 0x5a, 0x04, 0x07, 0x0f, 0xeb, 0x43, - 0xf6, 0x3c, 0xbf, 0x81, 0xcb, 0x90, 0x2c, 0xf4, 0xfe, 0xae, 0x1d, 0xec, - 0xde, 0xe8, 0x0f, 0x25, 0xf5, 0xf9, 0xed, 0x74, 0xba, 0xe3, 0xba, 0x18, - 0x1b, 0xfb, 0x15, 0xb0, 0xef, 0x94, 0xa6, 0xed, 0xfe, 0xed, 0x06, 0x4b, - 0x86, 0x63, 0xb0, 0x64, 0x4c, 0xde, 0x9c, 0xad, 0xfd, 0x43, 0xf1, 0x46, - 0x4a, 0xf1, 0x96, 0xa4, 0x0a, 0x2d, 0x1b, 0x97, 0xf3, 0xeb, 0x79, 0x5d, - 0xf1, 0x7d, 0x79, 0x01, 0x93, 0x1b, 0xec, 0xcf, 0xf9, 0xdd, 0x8d, 0x49, - 0xc2, 0x3b, 0xef, 0x96, 0xdd, 0x03, 0x13, 0x36, 0xd4, 0x6d, 0xf6, 0x87, - 0x12, 0x60, 0x8e, 0xc9, 0xe6, 0x5a, 0x15, 0x66, 0xd4, 0xba, 0x75, 0x57, - 0xe1, 0xe7, 0xed, 0x1b, 0xb4, 0x8c, 0x75, 0x35, 0x83, 0xb6, 0x7e, 0x71, - 0x40, 0x9d, 0x70, 0x18, 0xf3, 0xeb, 0x0b, 0xac, 0x8d, 0x5e, 0xd5, 0x38, - 0x3f, 0x8e, 0x25, 0x5c, 0x49, 0x90, 0xed, 0x5c, 0xc1, 0xe7, 0x56, 0x4a, - 0xea, 0xa9, 0x8c, 0x5f, 0x17, 0x24, 0x77, 0x40, 0x04, 0x8c, 0x97, 0x83, - 0x49, 0x47, 0x26, 0x8d, 0xa2, 0x65, 0xbc, 0x8e, 0xb5, 0x2f, 0x54, 0xbc, - 0x5c, 0x0f, 0xe1, 0xf9, 0x8f, 0xaf, 0x35, 0xc2, 0xdf, 0x1b, 0x06, 0x06, - 0x11, 0x39, 0x9d, 0xfd, 0xc7, 0x8d, 0xea, 0xba, 0x24, 0xdc, 0xb4, 0x9f, - 0x3f, 0xd3, 0x89, 0x9e, 0x78, 0x1f, 0x03, 0x6d, 0x01, 0x4a, 0x26, 0xda, - 0x58, 0xa4, 0xa0, 0x11, 0x6c, 0xb4, 0x25, 0x2f, 0x9c, 0x21, 0xc4, 0xbd, - 0x15, 0xe2, 0xe5, 0xfd, 0xe4, 0x5f, 0x7a, 0x63, 0xdd, 0x8a, 0xca, 0xea, - 0x4b, 0x72, 0x36, 0x83, 0xa4, 0x51, 0x1b, 0x0b, 0x53, 0x7b, 0x4d, 0x67, - 0xf7, 0xeb, 0x7c, 0x8c, 0x40, 0x44, 0x35, 0x5f, 0x80, 0x96, 0xe9, 0xff, - 0xbe, 0xee, 0x43, 0xb7, 0x0d, 0xec, 0x1a, 0x6a, 0x85, 0x5f, 0xa9, 0x1e, - 0x36, 0x08, 0x34, 0x45, 0xa0, 0x51, 0x48, 0x6a, 0x06, 0xc7, 0xad, 0x8b, - 0x16, 0xc6, 0x32, 0x09, 0xe3, 0x0f, 0x51, 0x10, 0xf3, 0x15, 0xb5, 0xc2, - 0x1f, 0x46, 0xc9, 0x5a, 0xa2, 0x96, 0x2e, 0x1b, 0x4b, 0x34, 0x5b, 0x6b, - 0x3e, 0x11, 0xeb, 0x37, 0x39, 0xd3, 0xa7, 0x28, 0x9e, 0xe1, 0xd6, 0x08, - 0x38, 0x20, 0x4c, 0x9d, 0x6d, 0xb9, 0x01, 0x0b, 0x76, 0xe2, 0xab, 0xe0, - 0x0d, 0x72, 0x5d, 0xbd, 0xcc, 0xa5, 0x9b, 0x98, 0x9a, 0x7b, 0x7d, 0x89, - 0x4c, 0x4d, 0xce, 0x3c, 0x00, 0xe2, 0xd6, 0xa5, 0x01, 0x87, 0x52, 0x5d, - 0x49, 0x59, 0xe8, 0xcb, 0x6c, 0x32, 0x80, 0x25, 0x69, 0xce, 0xc0, 0x67, - 0x3c, 0x47, 0x7a, 0xa3, 0x0e, 0xad, 0x78, 0xc6, 0xb7, 0x90, 0xe2, 0x62, - 0x29, 0xdc, 0x90, 0xe9, 0x3d, 0xa2, 0xe4, 0x79, 0x33, 0x1c, 0xcf, 0x2d, - 0x03, 0x98, 0x31, 0x38, 0x5f, 0x86, 0x77, 0x4e, 0xf9, 0x37, 0x3c, 0x57, - 0x5c, 0x7b, 0x02, 0xb6, 0xf1, 0x25, 0x90, 0xe1, 0xbe, 0x96, 0xfa, 0x8f, - 0x71, 0x84, 0x62, 0xd5, 0x5e, 0x24, 0x9e, 0x78, 0xad, 0x43, 0xb3, 0x72, - 0xab, 0xd6, 0xf7, 0x1b, 0x7d, 0xba, 0x96, 0x1d, 0x6c, 0x5f, 0xed, 0xb2, - 0x8b, 0x43, 0x61, 0x72, 0xd0, 0x5d, 0x39, 0xf3, 0xd3, 0xb3, 0xd5, 0xb6, - 0x0b, 0xb4, 0xd9, 0xf4, 0xbe, 0xd1, 0x70, 0x0b, 0x5a, 0xc3, 0x6c, 0x87, - 0x28, 0xb2, 0xfb, 0x83, 0x40, 0xe4, 0x92, 0x7a, 0xe2, 0x71, 0x98, 0x4b, - 0xf3, 0xfb, 0x75, 0xd8, 0x7f, 0x9a, 0x5a, 0x91, 0x55, 0xb0, 0x6e, 0x3e, - 0x78, 0x65, 0x39, 0x51, 0x2a, 0x7c, 0x9d, 0xc3, 0x10, 0x33, 0xd3, 0x94, - 0xb8, 0xad, 0x28, 0xd3, 0x91, 0xdd, 0x16, 0xb9, 0x31, 0xb0, 0x81, 0x91, - 0x20, 0x9a, 0x32, 0x28, 0x0f, 0x98, 0x9a, 0xe4, 0x32, 0xde, 0xd0, 0x5d, - 0xc6, 0x64, 0x7d, 0x19, 0xcc, 0x8a, 0x71, 0x6e, 0xc1, 0x2b, 0xdf, 0x73, - 0x65, 0x1f, 0xd3, 0x37, 0xed, 0x7f, 0xd2, 0xae, 0xf7, 0x02, 0x95, 0x4b, - 0xd8, 0x6f, 0x7a, 0x1a, 0x6c, 0x5d, 0x4d, 0x31, 0xf7, 0x33, 0x12, 0x03, - 0xe1, 0xaf, 0xc6, 0x37, 0x53, 0x93, 0x4d, 0x90, 0xf8, 0xb8, 0x74, 0x96, - 0x99, 0xa9, 0x9b, 0xd3, 0x11, 0x0a, 0x6e, 0x9c, 0xe9, 0x91, 0xc6, 0xd6, - 0x4b, 0xf7, 0x00, 0x21, 0xc4, 0x39, 0xea, 0xc3, 0x42, 0x6e, 0x21, 0x41, - 0x37, 0x72, 0x54, 0xd6, 0x89, 0xe7, 0x22, 0x81, 0x51, 0x75, 0x78, 0xe5, - 0x07, 0xf2, 0xf0, 0xd9, 0x24, 0xf0, 0x68, 0xc4, 0x40, 0xb5, 0x0d, 0xbc, - 0x2c, 0xdf, 0x83, 0x07, 0xfd, 0x20, 0x27, 0x8d, 0x5e, 0xe7, 0xa2, 0x52, - 0xe7, 0xec, 0xf9, 0xad, 0xff, 0xda, 0x73, 0xe8, 0xf4, 0x4c, 0x54, 0x91, - 0x37, 0x92, 0xe7, 0x06, 0xb2, 0x4a, 0xad, 0x46, 0x48, 0x67, 0x8e, 0x6b, - 0x15, 0x1f, 0xa0, 0x26, 0xef, 0xf3, 0x88, 0xe9, 0x48, 0xa7, 0xd7, 0x07, - 0xba, 0x4a, 0xc9, 0x5b, 0xc2, 0x16, 0x79, 0x0b, 0x2e, 0x31, 0x85, 0x48, - 0xab, 0xb3, 0x4c, 0x72, 0x02, 0xa3, 0x87, 0xd2, 0x82, 0x45, 0xd9, 0x21, - 0x2d, 0xb8, 0x36, 0x2a, 0xf4, 0xf7, 0x0b, 0x05, 0xee, 0x83, 0xf6, 0xb7, - 0x7b, 0x61, 0xc6, 0x5b, 0xa7, 0x0f, 0x5c, 0x05, 0x5e, 0xeb, 0x13, 0xce, - 0xfd, 0xf8, 0x2b, 0xdb, 0xd1, 0x9a, 0xda, 0x37, 0xf4, 0x91, 0xdd, 0xf3, - 0xa1, 0xd7, 0xcf, 0x6f, 0x7d, 0x90, 0x2e, 0x01, 0x6a, 0x1f, 0x52, 0xef, - 0x2a, 0x34, 0xb1, 0x45, 0x80, 0x45, 0x28, 0x79, 0x23, 0xde, 0xdc, 0x44, - 0xcd, 0xcc, 0x91, 0xa8, 0x6d, 0x99, 0x1c, 0x05, 0xe1, 0x03, 0x74, 0x6b, - 0xee, 0x7f, 0x78, 0xff, 0x65, 0x8a, 0xbd, 0x63, 0x20, 0x34, 0xea, 0xac, - 0x43, 0xad, 0x02, 0x7d, 0xfc, 0x9b, 0xdd, 0x41, 0x3c, 0xa5, 0x8b, 0x1a, - 0x40, 0xb2, 0xd4, 0x20, 0xda, 0xbf, 0x06, 0x44, 0x9d, 0x95, 0x75, 0xbe, - 0xdd, 0xf0, 0x8d, 0x98, 0x81, 0xa6, 0xae, 0x7a, 0xc9, 0x9f, 0x00, 0x80, - 0x1a, 0x99, 0x4f, 0x20, 0x37, 0x3d, 0xfc, 0x92, 0x56, 0x95, 0x1c, 0x5d, - 0xfc, 0x04, 0x0d, 0xdb, 0x13, 0xb5, 0x48, 0x7e, 0x16, 0x3c, 0x31, 0x58, - 0x9d, 0x62, 0x0c, 0x40, 0x29, 0x6e, 0xdf, 0x27, 0xea, 0x3f, 0x19, 0xc1, - 0x63, 0x0b, 0x3e, 0x4e, 0x4e, 0x2c, 0x77, 0xb4, 0x9f, 0x9d, 0x46, 0xfa, - 0xd5, 0x76, 0x25, 0x6d, 0xed, 0x6c, 0x90, 0x3b, 0xd5, 0x7c, 0x8e, 0x3f, - 0x35, 0xb3, 0x75, 0x09, 0xfc, 0x84, 0xe8, 0xbe, 0x41, 0x53, 0x65, 0xf4, - 0xaf, 0x2c, 0x3a, 0x66, 0xed, 0xef, 0x08, 0x47, 0x64, 0xcb, 0x3a, 0x04, - 0xdb, 0x0d, 0xf7, 0x05, 0xd7, 0xf2, 0x2d, 0x69, 0x54, 0x1f, 0x0a, 0xa1, - 0x54, 0xb4, 0x1f, 0xc0, 0x02, 0x96, 0x46, 0x20, 0x82, 0x8e, 0x93, 0x07, - 0xc2, 0x99, 0xaf, 0x92, 0x99, 0x5a, 0x6a, 0x75, 0xb8, 0xd8, 0x9d, 0x49, - 0x07, 0x9c, 0xd3, 0x5c, 0xcb, 0xb3, 0x91, 0xd6, 0xbd, 0xc3, 0x31, 0xc1, - 0x51, 0xbb, 0xb6, 0x2a, 0x96, 0xbb, 0xdc, 0xd4, 0x30, 0xd8, 0x96, 0x75, - 0x21, 0x19, 0xf1, 0x18, 0x3b, 0xb0, 0xc5, 0x6c, 0x73, 0x9d, 0x43, 0x13, - 0x3e, 0xe2, 0x67, 0x88, 0x97, 0x37, 0x0c, 0xa7, 0x64, 0x6d, 0xb2, 0x55, - 0x1f, 0xf2, 0x2e, 0x6d, 0x00, 0x6c, 0x09, 0x58, 0xa8, 0xd0, 0xcb, 0x71, - 0x05, 0x68, 0x71, 0xd4, 0xf4, 0x7f, 0x3a, 0x08, 0x17, 0x5b, 0x1f, 0x5c, - 0xd5, 0xd9, 0xcf, 0xd4, 0x8a, 0x41, 0x0f, 0x32, 0x59, 0xde, 0xcd, 0xf2, - 0xcd, 0x58, 0xaf, 0x61, 0x2e, 0x19, 0x38, 0xe8, 0x8a, 0x5b, 0xc0, 0xa5, - 0x84, 0xa2, 0x4f, 0xd4, 0x8a, 0x6b, 0xd4, 0x6e, 0x5f, 0x0a, 0x8a, 0x63, - 0xf9, 0xc2, 0x70, 0x89, 0x07, 0x3b, 0xfa, 0x3e, 0x1e, 0x84, 0xd3, 0x3a, - 0x79, 0xdb, 0x52, 0xa5, 0x8f, 0xe3, 0xec, 0xa1, 0x81, 0x5b, 0x8c, 0xa1, - 0xc4, 0x14, 0x87, 0xad, 0xd7, 0xad, 0x5d, 0x98, 0x95, 0x85, 0xe1, 0x06, - 0x23, 0xe8, 0x0a, 0xf5, 0xcb, 0x29, 0x85, 0x30, 0xe6, 0x83, 0x76, 0x20, - 0xe1, 0x13, 0xd2, 0xf1, 0x74, 0x9b, 0x2d, 0xb2, 0x5a, 0x48, 0x4c, 0xfd, - 0xb4, 0x7c, 0x8f, 0x83, 0x44, 0xce, 0x7e, 0xcd, 0x44, 0xdc, 0x36, 0x80, - 0x90, 0xae, 0x71, 0xf1, 0x6a, 0x8e, 0x60, 0x6c, 0xc8, 0x17, 0x9e, 0xd1, - 0xb8, 0x4b, 0x87, 0x37, 0xc2, 0xce, 0xe2, 0x46, 0x27, 0x56, 0x4e, 0xc0, - 0x9f, 0xc8, 0x35, 0x4a, 0xba, 0x3a, 0x9e, 0xc7, 0xc6, 0xad, 0x5b, 0xd6, - 0x55, 0xe8, 0x88, 0xc2, 0x52, 0xa6, 0x81, 0x82, 0xe9, 0x2c, 0x8d, 0x0a, - 0xe1, 0x6a, 0xd9, 0x3c, 0xa4, 0x8e, 0x97, 0xe3, 0xaa, 0x9b, 0xc7, 0x0a, - 0x29, 0x0a, 0xb0, 0x09, 0xc0, 0xc2, 0x8a, 0xac, 0xe4, 0x3e, 0x88, 0xfe, - 0x74, 0x4a, 0xe8, 0x39, 0x65, 0xea, 0x19, 0x68, 0x67, 0x31, 0x18, 0xee, - 0xda, 0x5f, 0xd5, 0x3a, 0xd6, 0x70, 0x66, 0x15, 0xb9, 0x05, 0x86, 0xc5, - 0xb3, 0x45, 0xcd, 0xd4, 0xeb, 0xdd, 0x28, 0x8a, 0x29, 0xe6, 0x13, 0x7c, - 0x5c, 0xe6, 0x63, 0x80, 0x44, 0xed, 0x41, 0x5e, 0x0f, 0xf9, 0xf2, 0xa3, - 0xfc, 0xd6, 0x89, 0x8c, 0xaa, 0x55, 0x48, 0x80, 0x8c, 0x9a, 0x81, 0x7c, - 0xfe, 0x7e, 0x80, 0x4f, 0x9f, 0xed, 0xb6, 0x42, 0xfc, 0x7a, 0x61, 0x6b, - 0xbe, 0x71, 0x54, 0xb8, 0x3e, 0xda, 0xf7, 0x41, 0x13, 0xa5, 0x51, 0x38, - 0x36, 0x58, 0x59, 0x53, 0xe6, 0x3b, 0x66, 0xa1, 0x57, 0x71, 0x9a, 0xf2, - 0xe9, 0xc9, 0xe8, 0x86, 0xe3, 0x04, 0x13, 0xf3, 0xa3, 0xde, 0x68, 0x27, - 0x27, 0x00, 0x0c, 0x38, 0x25, 0x1f, 0x0d, 0x96, 0xb8, 0xe2, 0x25, 0x44, - 0x0c, 0xe4, 0x37, 0x7e, 0x45, 0xf6, 0xd9, 0x0b, 0xd2, 0xf8, 0x12, 0xcf, - 0x94, 0x53, 0xf3, 0xc8, 0xdb, 0x17, 0xee, 0x04, 0x5d, 0x7e, 0x47, 0xe1, - 0x73, 0xb6, 0x07, 0x9a, 0x73, 0x4d, 0x3f, 0x4a, 0xc7, 0x0c, 0xa5, 0x1c, - 0xcc, 0x67, 0x61, 0x5f, 0x7d, 0x5f, 0x7c, 0xda, 0x31, 0x57, 0xf6, 0xf6, - 0x9c, 0x38, 0x72, 0xfa, 0x4d, 0x4a, 0xcf, 0x69, 0x41, 0x6b, 0xa5, 0xc1, - 0x00, 0xcc, 0x74, 0xe1, 0x1f, 0xd7, 0xce, 0xdc, 0xb3, 0xa2, 0x24, 0x6f, - 0x6e, 0xd1, 0x29, 0xe1, 0xc6, 0xc9, 0x23, 0x51, 0x4c, 0xc6, 0xb8, 0x3f, - 0x31, 0xc7, 0x50, 0x0f, 0xaf, 0x72, 0x9b, 0x0f, 0x6e, 0x6e, 0xa0, 0xbf, - 0x10, 0xe9, 0xfa, 0x24, 0x02, 0x21, 0x2b, 0xcc, 0x6c, 0xf5, 0xe4, 0xd4, - 0x97, 0x3e, 0x00, 0x5d, 0x06, 0x6c, 0x74, 0x03, 0x05, 0x8e, 0x98, 0xee, - 0x8c, 0x96, 0x1b, 0x53, 0xec, 0xc6, 0x7b, 0xca, 0xf7, 0x82, 0xb5, 0x4f, - 0xaa, 0xa2, 0x8f, 0xf5, 0xc1, 0x5c, 0xf2, 0x37, 0x98, 0x8a, 0x22, 0xc9, - 0x6d, 0xaf, 0xe6, 0x05, 0x6d, 0xd0, 0x55, 0x0f, 0x5c, 0x48, 0xd4, 0x0a, - 0x83, 0x3f, 0xd0, 0x97, 0x36, 0x1f, 0xeb, 0x02, 0x62, 0x20, 0xc4, 0x7d, - 0x9b, 0xc9, 0xe9, 0x7a, 0x3e, 0xe2, 0x40, 0x03, 0x32, 0x5f, 0x0a, 0x68, - 0xfb, 0xfa, 0xbb, 0x29, 0x46, 0x52, 0xf0, 0x5b, 0x29, 0x56, 0xc5, 0xe1, - 0x18, 0x7d, 0x38, 0x17, 0x69, 0xd3, 0x71, 0x4e, 0xbd, 0x80, 0xfb, 0xcf, - 0xe4, 0x1e, 0x93, 0x89, 0x87, 0x3a, 0x15, 0x7b, 0x71, 0x32, 0xe4, 0xbc, - 0x01, 0x73, 0xed, 0xd4, 0xa8, 0x30, 0xf3, 0x61, 0xcd, 0x10, 0x91, 0xfe, - 0x66, 0xdf, 0xa3, 0xed, 0x2b, 0x7a, 0xb6, 0x7e, 0x86, 0x95, 0xf6, 0x98, - 0xe7, 0xd7, 0x79, 0x82, 0xf2, 0xb7, 0x85, 0xe1, 0x34, 0xa9, 0xb2, 0x77, - 0xe1, 0xfc, 0x32, 0x3c, 0xae, 0x89, 0x2a, 0x31, 0x45, 0x84, 0xab, 0x18, - 0x3c, 0x21, 0xe9, 0x60, 0x1f, 0xe2, 0x89, 0x9b, 0xfc, 0xe9, 0x77, 0xca, - 0x06, 0x39, 0x91, 0xec, 0xad, 0x69, 0x41, 0x53, 0x51, 0xc2, 0x3a, 0xb0, - 0x6f, 0x47, 0x3d, 0x9c, 0x35, 0xd6, 0x93, 0x0a, 0x5b, 0xac, 0x40, 0x98, - 0xd3, 0xf9, 0xfc, 0x15, 0x44, 0x88, 0xf1, 0x65, 0x12, 0xc7, 0x94, 0xd5, - 0x60, 0x24, 0x96, 0xeb, 0xcc, 0x0c, 0xdb, 0x88, 0xf4, 0x54, 0xee, 0x0f, - 0x65, 0x94, 0xec, 0x04, 0x07, 0x01, 0x90, 0x24, 0x54, 0xd4, 0x15, 0x3c, - 0x01, 0x61, 0xf2, 0xf6, 0x20, 0x8d, 0x2c, 0x82, 0x3f, 0x82, 0xe4, 0xb6, - 0x7b, 0x4b, 0x1d, 0x6f, 0x44, 0xc6, 0x6c, 0x3c, 0xf1, 0x9c, 0xe1, 0x32, - 0xff, 0x4c, 0x80, 0xe1, 0x01, 0x71, 0x40, 0xc9, 0xdc, 0xa5, 0x89, 0x44, - 0xf3, 0x10, 0xea, 0xe0, 0xc1, 0x84, 0x45, 0x29, 0xc9, 0x36, 0xc2, 0xd6, - 0xaa, 0x26, 0xb8, 0xfc, 0xb5, 0x01, 0x3f, 0xe8, 0x0b, 0xbe, 0xcd, 0xc0, - 0x84, 0xc2, 0xc3, 0xb7, 0x4a, 0xd7, 0xe3, 0x0b, 0x68, 0x83, 0xa3, 0x9f, - 0xc0, 0x5f, 0x84, 0x3c, 0xe5, 0x2d, 0x45, 0x14, 0x90, 0xd6, 0xfd, 0x3c, - 0xaf, 0xc5, 0x69, 0x06, 0xd8, 0x22, 0x19, 0x03, 0xce, 0xa2, 0x1e, 0x84, - 0xe8, 0x5f, 0xf6, 0xcb, 0xdf, 0x5a, 0x92, 0xd6, 0x84, 0x57, 0xc1, 0x5b, - 0xb7, 0xea, 0xff, 0x38, 0xde, 0x02, 0xd3, 0xc2, 0xb0, 0xc5, 0x1c, 0x36, - 0xc7, 0x6b, 0xfd, 0x6a, 0x64, 0xf2, 0x42, 0x1c, 0xba, 0x2e, 0x42, 0x13, - 0xd1, 0xc1, 0x0f, 0x39, 0x92, 0x9d, 0xbb, 0x62, 0xdd, 0xd9, 0xfb, 0xce, - 0x81, 0x96, 0x65, 0x2e, 0xa5, 0x9a, 0x6e, 0x57, 0xf5, 0xa8, 0x67, 0xf3, - 0x6e, 0x9b, 0xb6, 0xd3, 0xcd, 0x89, 0xa1, 0x35, 0xa4, 0x4e, 0xb9, 0x30, - 0x6f, 0x38, 0xbf, 0x83, 0x5b, 0xdd, 0x1c, 0xa9, 0x0d, 0xe0, 0xa1, 0xb8, - 0xc7, 0x14, 0x08, 0x58, 0x5c, 0x89, 0xe6, 0x73, 0xfe, 0xef, 0xa8, 0xea, - 0x76, 0x46, 0xe3, 0xbe, 0x21, 0x14, 0xa2, 0xc0, 0xee, 0x2c, 0xfc, 0xa8, - 0x7c, 0x5f, 0x4c, 0x56, 0xec, 0xce, 0x1f, 0x74, 0x49, 0xff, 0xb4, 0xa8, - 0x02, 0x3a, 0xde, 0x0a, 0x34, 0xc5, 0x6c, 0x1e, 0xb7, 0x92, 0x86, 0x22, - 0x0b, 0xe8, 0xb0, 0x59, 0x2f, 0xbd, 0xf1, 0xf6, 0xa3, 0xbf, 0x6e, 0x87, - 0x35, 0xd7, 0x81, 0x08, 0x36, 0xfa, 0x5d, 0x73, 0xcc, 0xee, 0xfc, 0xf9, - 0x95, 0x41, 0x0e, 0x03, 0x7e, 0xd2, 0x41, 0xcd, 0xb0, 0x55, 0x76, 0xb4, - 0x2c, 0xf5, 0x36, 0xf7, 0xfc, 0xe7, 0x6f, 0x4f, 0xad, 0xe7, 0x67, 0x0d, - 0x96, 0x48, 0xd9, 0xf5, 0x90, 0x28, 0x6d, 0x19, 0xaa, 0x14, 0x61, 0x23, - 0x3e, 0x66, 0x74, 0xd9, 0x46, 0xcb, 0x47, 0x27, 0x84, 0xb2, 0x75, 0x94, - 0xf4, 0x4a, 0xb1, 0x09, 0x7b, 0xc8, 0x00, 0xfc, 0x51, 0x42, 0xa0, 0xe3, - 0xc7, 0x53, 0xe3, 0x45, 0x62, 0x48, 0xd7, 0xfe, 0xed, 0x6b, 0xdc, 0x4e, - 0x97, 0x6d, 0x7a, 0xa7, 0x30, 0xc4, 0x88, 0x27, 0x14, 0x22, 0x83, 0xee, - 0xba, 0xd7, 0x48, 0x3c, 0x10, 0xb4, 0x52, 0x29, 0x29, 0xd9, 0x5d, 0xd8, - 0x21, 0xe2, 0x4c, 0x1f, 0x88, 0xe2, 0xc8, 0x0e, 0x08, 0x52, 0x03, 0x3d, - 0x19, 0xd1, 0x93, 0xf8, 0xe0, 0x79, 0xc8, 0xea, 0x6f, 0x1a, 0xde, 0xeb, - 0x54, 0xc8, 0x7f, 0x53, 0x42, 0x9a, 0x3b, 0x65, 0xdb, 0x87, 0xe3, 0x5a, - 0x5b, 0x7b, 0xf5, 0x6a, 0x99, 0x48, 0x9e, 0x84, 0x32, 0x5f, 0x3d, 0xdc, - 0x92, 0xaf, 0x8e, 0x97, 0xd5, 0x7b, 0x8b, 0xc2, 0x69, 0x29, 0xf6, 0x43, - 0x75, 0x0b, 0xe2, 0x4e, 0xb4, 0x7f, 0xc6, 0x3d, 0xcd, 0x6e, 0x37, 0xe2, - 0x21, 0x93, 0x10, 0x86, 0xdf, 0xc7, 0x4d, 0x4b, 0x84, 0x66, 0x66, 0xd7, - 0x1c, 0x6d, 0x9d, 0xf3, 0x23, 0xd0, 0x1a, 0x96, 0x62, 0xbe, 0xd1, 0x1b, - 0x2e, 0xa0, 0xde, 0xbb, 0xac, 0xbf, 0x53, 0xc2, 0x1f, 0x20, 0x30, 0x65, - 0x03, 0xb0, 0x39, 0x15, 0xf6, 0x9c, 0x91, 0x60, 0x7c, 0xef, 0xb1, 0xe6, - 0x2c, 0xfd, 0x9e, 0xe3, 0x09, 0x4c, 0xf2, 0x54, 0xc6, 0x1b, 0xf4, 0x48, - 0x20, 0x75, 0x2d, 0x97, 0x90, 0x17, 0xd9, 0x50, 0xf1, 0x6b, 0x89, 0x9d, - 0xc0, 0x08, 0x6e, 0x75, 0x86, 0x41, 0xcb, 0xb2, 0x1e, 0xb7, 0x88, 0x3d, - 0xe1, 0xc0, 0x63, 0xcc, 0x11, 0x63, 0x82, 0xcc, 0xba, 0x2e, 0x94, 0xea, - 0x67, 0x02, 0x0f, 0xe5, 0xd1, 0xb2, 0x47, 0x1b, 0xa5, 0xe9, 0xaa, 0x28, - 0x54, 0x8c, 0x9d, 0xc9, 0x82, 0xa7, 0x53, 0x7c, 0x7c, 0x07, 0x21, 0x76, - 0xfe, 0xe4, 0x74, 0x7d, 0x98, 0xb4, 0x68, 0x4f, 0xe2, 0xa4, 0x3b, 0x5e, - 0x24, 0xae, 0xf7, 0x1d, 0x79, 0xd8, 0x6b, 0x90, 0x8b, 0x7d, 0x30, 0x85, - 0x18, 0xed, 0x45, 0xdc, 0xb6, 0x59, 0x0f, 0x30, 0xb8, 0xc2, 0xd2, 0x09, - 0x9c, 0x00, 0xf2, 0xc3, 0x56, 0x50, 0xce, 0x1a, 0x5d, 0xe0, 0x85, 0xaa, - 0xe8, 0x42, 0x53, 0xe3, 0x9c, 0xaf, 0x7d, 0x2a, 0xe7, 0x12, 0x68, 0xd1, - 0xd8, 0xbe, 0x29, 0x5b, 0xfa, 0x97, 0x66, 0xa4, 0x1f, 0x87, 0xac, 0xc3, - 0x5c, 0xc7, 0x44, 0x4c, 0x2e, 0x84, 0x27, 0xbd, 0x68, 0x16, 0x51, 0x53, - 0xd5, 0x8f, 0x54, 0xac, 0x87, 0x0a, 0xd0, 0xc1, 0x7c, 0xa8, 0x33, 0x08, - 0x28, 0xd7, 0x43, 0xd0, 0x70, 0x0e, 0x57, 0x2e, 0x1b, 0x66, 0xd5, 0x69, - 0x5e, 0x79, 0xdd, 0x24, 0xf4, 0xd7, 0x8f, 0x4c, 0x61, 0x24, 0xd8, 0xa4, - 0x6d, 0xcf, 0x0c, 0x8f, 0x16, 0x16, 0x37, 0x28, 0xd5, 0xd4, 0x96, 0xc9, - 0x75, 0xd0, 0x55, 0xdc, 0x0b, 0x9d, 0x4e, 0x6b, 0xbd, 0x5b, 0x3c, 0x66, - 0x34, 0x4f, 0xcc, 0x77, 0xea, 0x1f, 0x64, 0x0e, 0x30, 0x90, 0x6f, 0x17, - 0x91, 0xe7, 0x76, 0xd3, 0xb9, 0x51, 0x28, 0x17, 0x98, 0x71, 0x78, 0x51, - 0x9f, 0x85, 0x38, 0xca, 0xd2, 0xf4, 0xc3, 0x72, 0x34, 0x55, 0x30, 0x7a, - 0x0f, 0xf0, 0x55, 0xf8, 0x23, 0x4e, 0xa3, 0x14, 0xdf, 0xc4, 0xa5, 0x2a, - 0x3e, 0x03, 0x35, 0xb4, 0xea, 0xbb, 0x8b, 0x94, 0xb4, 0x5b, 0x1c, 0x06, - 0x1c, 0x69, 0x4d, 0xa6, 0xe9, 0x17, 0x35, 0xdb, 0x81, 0xf9, 0xda, 0x65, - 0x0f, 0x69, 0xdd, 0x0d, 0x79, 0xba, 0xf2, 0x36, 0x64, 0x36, 0x7e, 0xd8, - 0x01, 0xcd, 0x55, 0xc7, 0x69, 0xed, 0x5e, 0x4c, 0xa2, 0x9b, 0x79, 0xe7, - 0x74, 0x99, 0x12, 0x09, 0xb9, 0x62, 0xe6, 0xa3, 0xcc, 0x47, 0xd6, 0x0f, - 0x07, 0x44, 0xe5, 0xc7, 0x27, 0x5a, 0xf5, 0x56, 0xb1, 0xba, 0xee, 0x27, - 0xb7, 0x6d, 0x00, 0xf4, 0xd8, 0xcc, 0x14, 0x28, 0xfa, 0x2e, 0x2d, 0xcf, - 0x88, 0x2e, 0xea, 0x63, 0x9b, 0xd6, 0xcc, 0xca, 0xab, 0xa0, 0x93, 0x98, - 0x37, 0xa9, 0x40, 0xe5, 0xac, 0x91, 0x60, 0x2b, 0xaa, 0x35, 0x61, 0x4b, - 0xa8, 0x19, 0xa9, 0xbd, 0xdc, 0x93, 0xe0, 0xbf, 0x7b, 0x33, 0x4b, 0xa2, - 0x1e, 0x4a, 0xa8, 0x7c, 0xdc, 0x31, 0x04, 0x43, 0x5a, 0xbd, 0x89, 0x04, - 0x57, 0xa9, 0xbe, 0xb8, 0xe6, 0x0e, 0x94, 0xcb, 0xb2, 0x6d, 0xa0, 0x85, - 0x18, 0xa9, 0xb5, 0x32, 0x07, 0x08, 0xcc, 0x4e, 0xde, 0x21, 0x59, 0x96, - 0x54, 0x85, 0x85, 0xe0, 0xb9, 0x77, 0xc9, 0xfa, 0x67, 0xbe, 0xc0, 0x01, - 0x6e, 0x9c, 0x62, 0xa5, 0xbc, 0x80, 0x32, 0x71, 0xc0, 0xc1, 0x7f, 0xc7, - 0x4e, 0xf3, 0xe3, 0x33, 0xe5, 0x3d, 0x6f, 0xc2, 0x8e, 0x5f, 0x30, 0x40, - 0xdc, 0xa9, 0xc0, 0xcf, 0xa5, 0x6c, 0xfa, 0x5f, 0xc1, 0xb2, 0x4a, 0xe5, - 0xad, 0x35, 0x06, 0xaf, 0xe1, 0xbb, 0x6d, 0x05, 0x55, 0xb3, 0x06, 0x8e, - 0xd4, 0x04, 0x1b, 0x03, 0x0c, 0x8e, 0x3a, 0x4e, 0x16, 0x3e, 0x65, 0xb3, - 0x44, 0xaa, 0x65, 0xdb, 0x7e, 0x1e, 0xae, 0x8f, 0xc0, 0xfe, 0x38, 0xcc, - 0x8f, 0xba, 0x3f, 0x5e, 0x1a, 0x2b, 0xd0, 0x8c, 0x19, 0xb2, 0x04, 0xf3, - 0xd5, 0xc4, 0x4d, 0x8f, 0xda, 0x37, 0x1f, 0xcf, 0x73, 0x85, 0xbd, 0xb0, - 0xd3, 0x89, 0x0f, 0xeb, 0x0b, 0x9b, 0xee, 0x1c, 0x2c, 0xb6, 0x98, 0x20, - 0x48, 0xe2, 0xf2, 0x04, 0x76, 0xf6, 0x1b, 0xc9, 0x10, 0x1d, 0xde, 0x86, - 0xfc, 0x4c, 0x7c, 0x20, 0xc9, 0x31, 0xc8, 0x39, 0x0b, 0x5f, 0x6c, 0x80, - 0x3f, 0x9a, 0x88, 0x11, 0xc2, 0x8f, 0x86, 0x1f, 0xe8, 0xc8, 0x94, 0xb3, - 0xd0, 0xf0, 0x41, 0x29, 0xd4, 0xf9, 0x3e, 0x06, 0x6b, 0x71, 0x3d, 0xcc, - 0xd0, 0xac, 0xa1, 0x3c, 0x0c, 0x5b, 0xde, 0xdd, 0xce, 0x55, 0xbe, 0xf0, - 0x61, 0xef, 0x24, 0x1d, 0xb1, 0x62, 0x6d, 0x99, 0xd4, 0x72, 0x74, 0xa7, - 0x1b, 0x46, 0xe5, 0x18, 0x66, 0xbe, 0xbb, 0x88, 0xd2, 0xd1, 0x34, 0x7a, - 0x4f, 0xdd, 0x0c, 0x2b, 0xe3, 0x47, 0xe2, 0x10, 0xb3, 0x4d, 0xa2, 0x0a, - 0x8d, 0x93, 0xe2, 0x35, 0x72, 0x5b, 0x32, 0xec, 0x11, 0xd2, 0x05, 0xd6, - 0x7f, 0x50, 0xeb, 0x62, 0xb5, 0x42, 0x08, 0x63, 0xaf, 0xdb, 0x48, 0x01, - 0x30, 0x6d, 0x4f, 0x49, 0x68, 0x92, 0x23, 0x5f, 0x0e, 0x64, 0xef, 0xb6, - 0x0c, 0xf5, 0x49, 0x23, 0x37, 0x96, 0x04, 0xab, 0x6c, 0xff, 0x95, 0xa0, - 0x3c, 0x79, 0x42, 0xeb, 0x10, 0xa5, 0xa4, 0x6f, 0x21, 0x6b, 0xb0, 0xfe, - 0x45, 0xf2, 0x1d, 0xcb, 0x70, 0x9c, 0x51, 0x5f, 0xcf, 0x58, 0xbb, 0xea, - 0x2e, 0xf8, 0x3f, 0x18, 0xb8, 0x56, 0xf2, 0xee, 0x6f, 0xcf, 0x56, 0x77, - 0x18, 0x4a, 0x4d, 0x09, 0xdb, 0xf9, 0x24, 0x6f, 0x5b, 0xb5, 0x6c, 0x18, - 0xd4, 0xf0, 0xe0, 0x02, 0xcf, 0xec, 0xe5, 0x01, 0x84, 0x1b, 0x30, 0x12, - 0xcf, 0x0d, 0x9e, 0xf3, 0xa9, 0xdf, 0xbf, 0x5b, 0x09, 0x3d, 0x7b, 0x06, - 0xb8, 0x3d, 0xef, 0xb9, 0x84, 0x97, 0x88, 0x6b, 0x86, 0xbf, 0x83, 0xa3, - 0xca, 0x2a, 0xba, 0x67, 0x39, 0x12, 0x24, 0x9f, 0xe3, 0x65, 0xee, 0xdd, - 0x45, 0xc7, 0xbb, 0x0b, 0xf5, 0xc3, 0x23, 0x20, 0xc7, 0x48, 0x6b, 0x9d, - 0xd4, 0xb4, 0x7e, 0x99, 0x7e, 0x5a, 0x0c, 0xa0, 0x86, 0x12, 0xea, 0x09, - 0xec, 0xcf, 0x0d, 0x09, 0xbe, 0x4d, 0x82, 0x13, 0xce, 0x42, 0x5f, 0x39, - 0x91, 0xf3, 0x53, 0x49, 0x46, 0xbe, 0x7a, 0xbf, 0x35, 0xea, 0xeb, 0x2d, - 0xad, 0xdb, 0x39, 0xb4, 0x5e, 0x78, 0x92, 0x4d, 0xe4, 0xc6, 0x79, 0xb5, - 0xa7, 0x95, 0xf2, 0xb8, 0x54, 0xfe, 0xf9, 0x08, 0x9d, 0xb6, 0x94, 0xc2, - 0xde, 0xf6, 0x80, 0x35, 0xdc, 0x53, 0xc3, 0x78, 0x76, 0x3a, 0xf7, 0x7c, - 0x8c, 0x24, 0x2e, 0xa0, 0x8f, 0x16, 0xff, 0x05, 0xb4, 0xf5, 0x35, 0x1c, - 0x2f, 0x11, 0x94, 0x61, 0x84, 0x7d, 0x93, 0x5c, 0x1d, 0x6a, 0x60, 0x4b, - 0x2e, 0x55, 0xb4, 0x18, 0xdb, 0x55, 0x7a, 0xa9, 0xbc, 0xf4, 0xf0, 0x2a, - 0x0b, 0xbe, 0x69, 0x61, 0x4e, 0x53, 0x92, 0xd2, 0xba, 0xc7, 0xdf, 0x09, - 0x36, 0xb7, 0xc7, 0xb7, 0xf3, 0x7b, 0x33, 0xb5, 0x5c, 0x9e, 0x16, 0x62, - 0x91, 0x29, 0x26, 0xa0, 0xaa, 0xc9, 0x87, 0x05, 0x34, 0x24, 0x82, 0x2d, - 0xb4, 0x4f, 0xf7, 0xe0, 0x2d, 0x2b, 0xfc, 0xd7, 0xfa, 0x4d, 0xed, 0x3c, - 0x6a, 0x70, 0xca, 0x85, 0x05, 0x1b, 0x8b, 0xf7, 0x59, 0x3b, 0xc9, 0x39, - 0x6d, 0xf9, 0x98, 0xfc, 0x7d, 0xfb, 0xbc, 0x04, 0x4d, 0xd9, 0x2c, 0xac, - 0x0f, 0xd0, 0x55, 0x2f, 0xd5, 0x15, 0x98, 0xff, 0x73, 0xe4, 0xe4, 0x0f, - 0x84, 0xda, 0x04, 0xaf, 0xea, 0x2a, 0x69, 0xcb, 0x26, 0x8c, 0x6e, 0x4e, - 0xc6, 0xa9, 0xdd, 0x6d, 0x89, 0x7b, 0x99, 0x38, 0x2b, 0x34, 0xb0, 0x5e, - 0x6c, 0x96, 0xf2, 0xf5, 0xd8, 0x41, 0x31, 0xa8, 0x79, 0xa6, 0x29, 0x86, - 0x86, 0xbf, 0x83, 0xa3, 0xca, 0x2a, 0xba, 0x67, 0x3c, 0x18, 0x24, 0x9f, - 0xe3, 0xe5, 0xee, 0xdd, 0x48, 0x5f, 0x10, 0x60, 0x43, 0x65, 0x57, 0xf2, - 0x58, 0x9d, 0xc0, 0x82, 0x4b, 0x8e, 0xd5, 0x64, 0xed, 0x7c, 0xa6, 0xa3, - 0x65, 0xc2, 0x5b, 0xca, 0x92, 0x8d, 0x52, 0x8f, 0x4a, 0x0a, 0x10, 0x72, - 0xc6, 0x57, 0x59, 0xa7, 0xea, 0x2c, 0xb3, 0xf9, 0xc8, 0xcf, 0x21, 0xd6, - 0x48, 0xd5, 0x01, 0xfc, 0xce, 0x0a, 0xa7, 0xe2, 0x51, 0xeb, 0x0e, 0x16, - 0x58, 0xa4, 0x41, 0xd5, 0x9a, 0xf3, 0x2e, 0x7f, 0x68, 0xc9, 0x67, 0x72, - 0xe6, 0xd7, 0xb6, 0xfd, 0x22, 0x89, 0xa0, 0xa1, 0x8d, 0x77, 0x5d, 0x86, - 0x61, 0xf1, 0x76, 0x8e, 0x62, 0xfa, 0x3b, 0x9a, 0x13, 0xef, 0xa3, 0x51, - 0x0c, 0x06, 0xff, 0x65, 0xc1, 0x73, 0xca, 0x1e, 0x81, 0xc1, 0xdb, 0xe5, - 0x3b, 0x30, 0xcd, 0x39, 0x43, 0x47, 0x39, 0x23, 0x2c, 0xf7, 0xb9, 0x2e, - 0x05, 0x78, 0x5f, 0xb8, 0x31, 0x78, 0xff, 0x7d, 0xfa, 0xbd, 0xd6, 0xf1, - 0x86, 0xbf, 0x83, 0xa3, 0xca, 0x2a, 0xba, 0x67, 0x32, 0x01, 0x24, 0x9f, - 0xe2, 0x2d, 0xee, 0xdd, 0x63, 0x5a, 0xf0, 0xc7, 0xd5, 0x01, 0xb7, 0x1f, - 0xf8, 0xaf, 0x67, 0xc5, 0x42, 0x8f, 0x99, 0x63, 0xed, 0x0d, 0x90, 0x6f, - 0xf5, 0x84, 0xd1, 0x9b, 0x34, 0x7c, 0x1e, 0x41, 0xe5, 0xe8, 0xfd, 0x69, - 0x75, 0x66, 0x23, 0xda, 0x8f, 0x15, 0xb3, 0x04, 0xcf, 0x47, 0x9a, 0xa4, - 0x57, 0x26, 0xe5, 0x92, 0x6c, 0x49, 0x39, 0x48, 0x2e, 0x9b, 0xb8, 0x61, - 0x97, 0x22, 0xa5, 0x35, 0xf9, 0x4c, 0x01, 0x6c, 0xcc, 0x49, 0x72, 0xfe, - 0x53, 0xf5, 0x73, 0x90, 0xc2, 0x9c, 0x70, 0x2e, 0x67, 0xc5, 0x89, 0xc4, - 0x88, 0x22, 0x64, 0x0b, 0xd9, 0xc4, 0x2b, 0x1a, 0x71, 0x89, 0xee, 0x1e, - 0x60, 0x54, 0x08, 0x15, 0xeb, 0x4c, 0x08, 0x1f, 0xc4, 0xdd, 0xbf, 0x15, - 0x97, 0x57, 0x06, 0xa9, 0xd7, 0x17, 0x5b, 0x81, 0x21, 0x7f, 0x50, 0xd1, - 0x3a, 0x70, 0x37, 0x76, 0xbd, 0x25, 0x7a, 0x7c, 0x47, 0x00, 0xba, 0x0d, - 0x40, 0xa0, 0x2a, 0xf9, 0x99, 0x0f, 0x5e, 0xe8, 0x68, 0x1f, 0xf7, 0x39, - 0x7c, 0x07, 0xff, 0x7e, 0xa0, 0xa4, 0xfe, 0x17, 0x10, 0xac, 0x48, 0xaf, - 0xa2, 0x3b, 0x1f, 0x69, 0xcb, 0xc8, 0x02, 0x53, 0x61, 0x5a, 0x6b, 0x61, - 0xe4, 0x0a, 0xa2, 0x28, 0x81, 0xb1, 0xed, 0xed, 0xe6, 0x33, 0x78, 0xd1, - 0xf3, 0xcc, 0x1b, 0xaa, 0x0c, 0x4e, 0x27, 0x30, 0x37, 0x35, 0x88, 0x11, - 0x7a, 0x83, 0xc5, 0x42, 0xe0, 0xce, 0x36, 0xe3, 0x2d, 0x3f, 0xfa, 0xc8, - 0xf3, 0xa9, 0x76, 0x05, 0x3d, 0xfa, 0x4d, 0x29, 0x52, 0x17, 0x16, 0x9e, - 0x9b, 0xeb, 0xc6, 0xed, 0x3e, 0x1e, 0x33, 0xb5, 0x6e, 0x13, 0x79, 0x8c, - 0x87, 0x4a, 0x6c, 0x88, 0x03, 0x1b, 0xb6, 0x8f, 0x64, 0xd7, 0xae, 0x2e, - 0x22, 0x87, 0xc7, 0xa8, 0x87, 0xb9, 0x93, 0xb8, 0xee, 0x1f, 0x61, 0x2b, - 0x32, 0x70, 0xb2, 0x7c, 0xa7, 0xb9, 0xa1, 0x06, 0xce, 0x1f, 0xae, 0x47, - 0x73, 0xed, 0x42, 0xc7, 0x90, 0x15, 0x7c, 0xc1, 0x5b, 0x5b, 0x92, 0x59, - 0x64, 0x24, 0xe3, 0xfd, 0xc5, 0x65, 0xc5, 0xda, 0x52, 0xd6, 0x01, 0x8b, - 0x0b, 0x73, 0xe4, 0xc4, 0xfd, 0x69, 0xde, 0xa9, 0x20, 0x25, 0x4c, 0xc0, - 0x49, 0x72, 0x39, 0x52, 0xf9, 0x57, 0xea, 0x9a, 0x22, 0x63, 0x71, 0x52, - 0xa4, 0x18, 0x3b, 0x3e, 0xfc, 0x7d, 0x43, 0x1a, 0xea, 0xa5, 0x98, 0xd5, - 0x82, 0x4b, 0xcd, 0xfd, 0x93, 0xca, 0x6e, 0x8b, 0xaf, 0x31, 0x15, 0x00, - 0x09, 0xde, 0xba, 0x69, 0x1c, 0xd1, 0xee, 0xc2, 0x5e, 0x6c, 0xa1, 0x1e, - 0x74, 0x81, 0x46, 0x7d, 0x88, 0xe9, 0xd9, 0x15, 0xee, 0xb4, 0xf4, 0x4d, - 0xad, 0xf9, 0xcb, 0xa8, 0xf8, 0x7b, 0x2f, 0xcc, 0xe7, 0xc1, 0x4a, 0xa0, - 0xbb, 0xd1, 0x51, 0x93, 0x27, 0x29, 0xcf, 0x34, 0x6e, 0x37, 0x91, 0x33, - 0x12, 0x2b, 0x1d, 0xc7, 0x2b, 0x2e, 0x6b, 0x3d, 0x45, 0xf0, 0x4e, 0x97, - 0xec, 0xc1, 0xad, 0x13, 0xaf, 0x7b, 0xc2, 0x78, 0xc3, 0xc3, 0x2e, 0x51, - 0x8d, 0x84, 0x45, 0x83, 0x44, 0xae, 0x4a, 0xe6, 0x65, 0xbd, 0x78, 0x0e, - 0x65, 0xed, 0xa8, 0x94, 0x30, 0xc4, 0x02, 0xde, 0x5f, 0xe4, 0x29, 0xbc, - 0xef, 0x4e, 0xa1, 0xf0, 0x41, 0xe4, 0x0b, 0xb1, 0x83, 0x8f, 0xc4, 0x6f, - 0x78, 0x25, 0x22, 0xd7, 0x27, 0xd9, 0x17, 0xb2, 0x6f, 0x74, 0x04, 0x88, - 0xdb, 0xc3, 0xb3, 0x67, 0xfe, 0x28, 0x98, 0xc8, 0x41, 0xed, 0xc1, 0x49, - 0x04, 0xc4, 0xb9, 0x06, 0xcc, 0xfd, 0x26, 0x2c, 0x23, 0x59, 0xa7, 0x7f, - 0x47, 0xc0, 0x05, 0xfc, 0xa2, 0x9b, 0x65, 0x71, 0x7a, 0x2d, 0x83, 0x63, - 0x30, 0x43, 0xbe, 0x7c, 0x7e, 0x67, 0x95, 0xa5, 0xc6, 0x46, 0x14, 0xe6, - 0x37, 0x45, 0xa9, 0x0d, 0x43, 0x35, 0x22, 0x54, 0x60, 0x33, 0x87, 0x0e, - 0xf3, 0x19, 0xaf, 0x2e, 0x1c, 0xf4, 0xd5, 0x51, 0x51, 0xe4, 0x2b, 0xe9, - 0x9c, 0x62, 0x0d, 0x18, 0xfc, 0x5c, 0xe7, 0x49, 0x6f, 0x4e, 0x9e, 0x6d, - 0xe3, 0xaa, 0x7b, 0x55, 0x0d, 0x91, 0x04, 0x4b, 0x00, 0x70, 0xbe, 0x8a, - 0x11, 0xe7, 0xdb, 0xef, 0x5b, 0xee, 0x4a, 0x73, 0x67, 0x39, 0xd7, 0x03, - 0x7b, 0x45, 0x3c, 0x6b, 0xa8, 0x64, 0xc7, 0x0d, 0x28, 0x44, 0x2c, 0x81, - 0xcc, 0x67, 0xc9, 0xef, 0xd3, 0xc2, 0x24, 0x88, 0x36, 0xfc, 0xad, 0x80, - 0x36, 0x90, 0x86, 0xf5, 0x84, 0xba, 0xfe, 0x5f, 0xeb, 0x56, 0x8a, 0xa8, - 0x12, 0x20, 0x36, 0xea, 0xca, 0xf7, 0x97, 0x48, 0x5a, 0x0f, 0x22, 0x72, - 0x01, 0x74, 0x1a, 0x04, 0xb8, 0xb5, 0xc1, 0xa9, 0x58, 0x9f, 0x44, 0x27, - 0x6f, 0xee, 0x73, 0xaf, 0xdf, 0xa2, 0x5d, 0x1c, 0x5b, 0x5e, 0xd9, 0xbf, - 0x98, 0x02, 0xd5, 0x0d, 0x65, 0x80, 0x89, 0xc1, 0xb7, 0x9e, 0x20, 0xa7, - 0xf2, 0xad, 0x6d, 0x4a, 0xa5, 0x64, 0x4a, 0x2e, 0xc6, 0x9b, 0xd1, 0x0d, - 0x05, 0x6b, 0x31, 0x9b, 0x09, 0xa8, 0x25, 0xab, 0x33, 0x12, 0x7a, 0x4f, - 0xe9, 0x72, 0xe0, 0xa8, 0xe1, 0x66, 0x0c, 0xf9, 0x94, 0xcb, 0xe4, 0x6f, - 0x2e, 0x4c, 0x15, 0x39, 0xa3, 0x89, 0x8d, 0xc2, 0x65, 0x60, 0xf6, 0x4b, - 0x2b, 0x89, 0xcf, 0x15, 0x8b, 0x3b, 0x7f, 0x79, 0x49, 0x3e, 0x46, 0x13, - 0x7b, 0x18, 0x51, 0xda, 0x6f, 0x28, 0xe9, 0x62, 0x5b, 0x87, 0x4c, 0x92, - 0xd1, 0x1d, 0x54, 0xe0, 0xb4, 0x11, 0x80, 0x36, 0x13, 0xc1, 0xc8, 0xca, - 0xb1, 0xd3, 0xe2, 0x5a, 0x4d, 0xe0, 0x14, 0xcf, 0x90, 0x2c, 0x84, 0x7f, - 0x55, 0xe5, 0xad, 0xa0, 0x12, 0x16, 0xe3, 0x96, 0xfc, 0x82, 0x9e, 0xe6, - 0x07, 0x9b, 0x41, 0x0d, 0xaa, 0xb6, 0xc7, 0x35, 0x11, 0xa7, 0xa4, 0x09, - 0x4c, 0xc4, 0xd7, 0x55, 0xdb, 0xed, 0xcc, 0xa1, 0x37, 0x97, 0x44, 0x5b, - 0xaf, 0x71, 0x0e, 0xae, 0xab, 0x3e, 0xa0, 0xf5, 0x5d, 0x68, 0x6f, 0x6b, - 0x50, 0x7a, 0xf3, 0xd3, 0xfe, 0xc8, 0xe9, 0x74, 0x05, 0x3e, 0x8f, 0x09, - 0xdd, 0xed, 0xbf, 0x0b, 0x78, 0x07, 0x3c, 0x36, 0xf8, 0xab, 0x11, 0x2b, - 0x7e, 0x0f, 0x1d, 0x96, 0x46, 0x3c, 0xd7, 0xd6, 0x43, 0x76, 0x37, 0x84, - 0x54, 0xe2, 0xa1, 0x05, 0xd2, 0x26, 0x4e, 0x36, 0x0e, 0xf9, 0x50, 0x16, - 0xc1, 0x90, 0x09, 0x06, 0xa9, 0xe1, 0xec, 0xed, 0xb8, 0xda, 0x94, 0xce, - 0x2b, 0x58, 0x55, 0x79, 0xd7, 0x56, 0x04, 0x4d, 0xaa, 0x21, 0xdb, 0x09, - 0xb7, 0xe3, 0xdf, 0x05, 0x8c, 0x89, 0xeb, 0x32, 0x4f, 0x77, 0xca, 0x2e, - 0xc6, 0x9a, 0x97, 0xca, 0xff, 0x19, 0xbd, 0xc7, 0x64, 0xda, 0x9c, 0xdb, - 0x75, 0x54, 0x6f, 0xda, 0x21, 0xf3, 0xec, 0x4f, 0xd4, 0xa5, 0xc2, 0x09, - 0x50, 0xa8, 0x2b, 0xb3, 0x6b, 0xcb, 0xff, 0x0c, 0x82, 0x4b, 0x31, 0x70, - 0x46, 0x60, 0xdc, 0xcf, 0xa1, 0x23, 0xc5, 0x72, 0xc1, 0x89, 0x57, 0xe8, - 0x4d, 0x5e, 0x8a, 0x47, 0x12, 0x8f, 0x11, 0x66, 0x3f, 0x58, 0x30, 0x2e, - 0x83, 0x25, 0x9d, 0x54, 0x6f, 0x0f, 0x41, 0x28, 0x58, 0x07, 0x0b, 0xe6, - 0x74, 0xf6, 0x52, 0x31, 0x3b, 0x9a, 0x3d, 0x60, 0x48, 0x01, 0x28, 0xfa, - 0xdb, 0x12, 0xa6, 0x74, 0x69, 0xd9, 0x21, 0xba, 0xe3, 0x80, 0x2f, 0x05, - 0x21, 0x5e, 0x64, 0x25, 0xdf, 0xbc, 0x86, 0xaa, 0x24, 0x66, 0x04, 0x17, - 0x80, 0xcb, 0xbf, 0x84, 0x84, 0x02, 0x42, 0xed, 0xdb, 0x3c, 0x82, 0x09, - 0x60, 0x9d, 0xf4, 0x1b, 0xb7, 0xc8, 0x9f, 0xfc, 0x2a, 0x8e, 0x31, 0xc0, - 0x50, 0x35, 0x7f, 0x90, 0x96, 0x2e, 0x25, 0xa1, 0x4e, 0x39, 0xe8, 0xf3, - 0x05, 0xaa, 0x88, 0x46, 0x1e, 0x8b, 0x9d, 0x46, 0x3d, 0xed, 0x54, 0x76, - 0x68, 0x61, 0x6d, 0x7a, 0x65, 0xc9, 0xbf, 0xcf, 0xcc, 0x7e, 0x41, 0x6e, - 0xcc, 0x34, 0x0e, 0x45, 0x41, 0xd6, 0xe8, 0xfc, 0x66, 0x06, 0x5c, 0x0a, - 0x60, 0xa8, 0xae, 0x61, 0x82, 0x2c, 0xf3, 0x54, 0x75, 0xa3, 0x2e, 0x1b, - 0xeb, 0xa3, 0x94, 0x34, 0xf6, 0xd4, 0x7f, 0xb0, 0x49, 0x93, 0x61, 0x5b, - 0x1a, 0x84, 0x74, 0xc9, 0x22, 0x6d, 0x31, 0x30, 0x2f, 0x4e, 0xaf, 0x0c, - 0x4d, 0x20, 0xfa, 0x56, 0x40, 0x1b, 0xf3, 0x2d, 0x0f, 0x27, 0x60, 0x14, - 0x76, 0x82, 0x01, 0xa3, 0xcf, 0x0d, 0xe2, 0x9f, 0x73, 0xa3, 0x4d, 0x2f, - 0xa6, 0x40, 0xb2, 0xb8, 0xf9, 0x97, 0x5b, 0x60, 0xd8, 0x55, 0xe3, 0x82, - 0x6d, 0x74, 0x18, 0x7d, 0xd5, 0x9e, 0x0f, 0xab, 0x1b, 0x82, 0xb4, 0xd6, - 0x15, 0xba, 0x2d, 0x80, 0xf3, 0x09, 0x31, 0x34, 0x3a, 0x69, 0xd4, 0x29, - 0x7e, 0x93, 0xa2, 0xb4, 0x34, 0x67, 0xd8, 0x78, 0xf1, 0x0d, 0x4c, 0x17, - 0xc1, 0x30, 0x11, 0xd1, 0x43, 0x03, 0xca, 0x74, 0xbb, 0xed, 0x36, 0x61, - 0xc8, 0xa1, 0x55, 0xb5, 0xeb, 0x03, 0xd7, 0xfe, 0x0a, 0x48, 0x25, 0x08, - 0xba, 0xc6, 0x0a, 0xf6, 0xb5, 0xf6, 0x7d, 0x99, 0xf9, 0x7e, 0x29, 0xe3, - 0xec, 0x3d, 0x72, 0x7e, 0x59, 0xb8, 0x89, 0xe1, 0x37, 0x3d, 0x00, 0xb3, - 0x2b, 0x10, 0xca, 0xba, 0x02, 0x1b, 0x19, 0x7f, 0xdd, 0x56, 0xa1, 0x64, - 0x64, 0x66, 0x43, 0x0b, 0x64, 0x78, 0x21, 0x3d, 0xff, 0x2f, 0x3e, 0x2d, - 0x97, 0x90, 0xd8, 0xd2, 0x75, 0x56, 0x1d, 0x2e, 0xb1, 0x73, 0xb7, 0x4d, - 0xdc, 0x6f, 0x7c, 0x44, 0x1f, 0x01, 0x07, 0x98, 0xeb, 0x04, 0xaf, 0x73, - 0xf7, 0x9f, 0xd9, 0x6f, 0xcb, 0x11, 0x34, 0x8b, 0x24, 0xc4, 0x87, 0xcb, - 0x74, 0xe2, 0x5d, 0x95, 0xe0, 0x99, 0xea, 0x68, 0x1f, 0x26, 0x39, 0xf2, - 0x97, 0xb7, 0xb1, 0x77, 0x93, 0x68, 0x31, 0x88, 0x88, 0x64, 0x93, 0xc5, - 0x5e, 0x2b, 0xc9, 0x74, 0x0c, 0xde, 0xf4, 0x7c, 0xb3, 0x67, 0x79, 0xd7, - 0x61, 0x62, 0x24, 0x7d, 0x87, 0xcb, 0xf2, 0xbc, 0x39, 0x5a, 0x4b, 0x99, - 0x86, 0x5b, 0x6d, 0xf1, 0x8c, 0x00, 0x85, 0xcd, 0x16, 0x61, 0xe7, 0xef, - 0x0d, 0x09, 0xd2, 0x90, 0x4f, 0x88, 0xf6, 0xa6, 0x8b, 0xb9, 0x76, 0x99, - 0x81, 0x82, 0xb0, 0xd9, 0xcd, 0x2c, 0x71, 0x1a, 0xb0, 0xab, 0x5e, 0xcc, - 0xe0, 0x86, 0x45, 0x95, 0x29, 0x93, 0x34, 0x02, 0xde, 0x07, 0x12, 0x41, - 0xd7, 0x78, 0x93, 0x56, 0x5f, 0x68, 0xc4, 0xf2, 0xbf, 0xff, 0x80, 0x05, - 0xbe, 0x11, 0x90, 0x22, 0x2b, 0xb2, 0xf9, 0x5b, 0x3e, 0xc9, 0x71, 0x33, - 0x7e, 0x84, 0x32, 0x40, 0x88, 0xf6, 0x08, 0x7f, 0xde, 0x80, 0x1b, 0x8e, - 0x49, 0xaf, 0x8d, 0x87, 0x2b, 0xe1, 0x2b, 0x05, 0x58, 0x7e, 0xc4, 0x9a, - 0x8e, 0xc9, 0xfe, 0xf3, 0x81, 0x51, 0x37, 0xb0, 0x9c, 0x3d, 0x84, 0x62, - 0x4c, 0x61, 0x76, 0x19, 0x7b, 0xd9, 0x58, 0xe1, 0xe7, 0x2e, 0x5b, 0x0f, - 0xb4, 0xbd, 0xfd, 0x8b, 0xf0, 0x47, 0x65, 0xda, 0xb4, 0xc1, 0x0e, 0x7a, - 0x7b, 0x85, 0x50, 0x09, 0x31, 0x8a, 0x21, 0x3c, 0x86, 0x5b, 0x3f, 0xf4, - 0xb3, 0x0c, 0xec, 0x15, 0xef, 0xc5, 0x4f, 0x37, 0x95, 0x9d, 0x57, 0x99, - 0x12, 0xc8, 0x2d, 0x26, 0x32, 0x5f, 0x4b, 0xee, 0x0a, 0x71, 0xee, 0x27, - 0x3d, 0xcb, 0x8a, 0x5c, 0x76, 0xfa, 0x57, 0x9d, 0x97, 0x38, 0x6a, 0x23, - 0x9c, 0xfa, 0x0b, 0x43, 0xc2, 0xea, 0x42, 0xb5, 0x17, 0x63, 0xc2, 0xc5, - 0x0b, 0xe2, 0x4b, 0x2a, 0xda, 0x4b, 0xbc, 0xe9, 0xc0, 0xa3, 0xc2, 0xcb, - 0xf9, 0x9e, 0xd3, 0x56, 0x0e, 0x8f, 0x85, 0x50, 0x0b, 0xf7, 0x0e, 0x48, - 0x8c, 0xc9, 0xfc, 0x5c, 0x3a, 0xcf, 0xfe, 0x48, 0x56, 0x58, 0xcc, 0x79, - 0x36, 0x09, 0x5f, 0x37, 0x54, 0x6f, 0x97, 0x6c, 0x33, 0xec, 0x23, 0x58, - 0x03, 0x8f, 0xad, 0x14, 0x03, 0xe4, 0xc9, 0xcc, 0xfe, 0x58, 0x6a, 0x5c, - 0x05, 0x65, 0x60, 0x1b, 0xea, 0x85, 0xe8, 0x69, 0xae, 0xe0, 0x9c, 0x19, - 0xe9, 0x73, 0xfe, 0xa2, 0x60, 0x69, 0xfb, 0xc3, 0x72, 0xbb, 0x4d, 0x2d, - 0xb2, 0x72, 0xa9, 0x06, 0xb7, 0xf4, 0xa3, 0x66, 0xcc, 0xd7, 0x27, 0x15, - 0x0f, 0xf5, 0xd6, 0x8d, 0x07, 0x5c, 0x3b, 0x76, 0x08, 0x0e, 0xca, 0x12, - 0x7a, 0x2b, 0x38, 0x76, 0x87, 0xa9, 0x99, 0x03, 0x47, 0x9e, 0x6f, 0x7f, - 0x6a, 0x04, 0xe7, 0x13, 0x2e, 0x76, 0xe7, 0x20, 0x34, 0x01, 0x81, 0x30, - 0xc0, 0xbe, 0xbe, 0x6d, 0x6f, 0xe4, 0x9e, 0x5a, 0x29, 0x4f, 0xa3, 0x09, - 0x5d, 0x31, 0x94, 0xed, 0x58, 0x3b, 0xbd, 0x0c, 0x95, 0x45, 0xc2, 0x4f, - 0xa2, 0xe8, 0x90, 0xb2, 0xba, 0xf9, 0xd6, 0x39, 0xb8, 0x8f, 0x48, 0xfa, - 0x19, 0x90, 0x56, 0x0a, 0xc1, 0xc5, 0x3a, 0xd9, 0x0c, 0x8e, 0xf7, 0x18, - 0xf6, 0xac, 0xfd, 0xe1, 0xec, 0xeb, 0xca, 0xde, 0xbd, 0x05, 0x20, 0x2f, - 0x3b, 0x12, 0xcf, 0x2d, 0x36, 0x1d, 0x4a, 0x4e, 0x6e, 0x9c, 0xd0, 0x53, - 0xc0, 0x74, 0x04, 0x32, 0xbb, 0x6d, 0x6c, 0x10, 0x07, 0x92, 0xae, 0x1c, - 0x2a, 0x90, 0xcd, 0xa0, 0x27, 0x06, 0x8e, 0x1a, 0x52, 0x09, 0x84, 0xd7, - 0xfe, 0x32, 0xf5, 0xb5, 0x8e, 0xd3, 0x26, 0x31, 0xce, 0xfb, 0x59, 0xa1, - 0xab, 0x5d, 0xb9, 0x24, 0x2e, 0xfc, 0xa4, 0xbf, 0xb8, 0x3c, 0x0e, 0x7c, - 0x85, 0x69, 0x79, 0x08, 0xe7, 0xde, 0xfe, 0xd3, 0xc2, 0x10, 0xbd, 0xb4, - 0x70, 0x17, 0x52, 0xe9, 0xa4, 0x20, 0xa3, 0xbb, 0x6a, 0xf8, 0xe2, 0x69, - 0x83, 0x50, 0x88, 0x51, 0xbf, 0x21, 0x17, 0xa8, 0x5c, 0x5a, 0x14, 0x8d, - 0x97, 0x21, 0x2e, 0x3d, 0x8c, 0x85, 0x6e, 0xf5, 0xa9, 0x89, 0x5b, 0xd4, - 0x55, 0xf3, 0xb5, 0x67, 0x27, 0x07, 0xaf, 0x6d, 0xbe, 0x19, 0x4e, 0x7a, - 0xea, 0x13, 0x8a, 0x80, 0xb9, 0x3e, 0xcb, 0xa8, 0x1a, 0x7b, 0x04, 0xc1, - 0xe3, 0x90, 0xe1, 0x54, 0xeb, 0xd8, 0x29, 0x42, 0xe8, 0x10, 0x43, 0x21, - 0x62, 0x16, 0x82, 0x3b, 0xe6, 0x23, 0xa3, 0x89, 0x52, 0xbf, 0x84, 0xea, - 0xad, 0x90, 0xe3, 0x94, 0x8b, 0xf5, 0x27, 0x1f, 0x56, 0x58, 0x70, 0x64, - 0x20, 0x1a, 0xcb, 0x66, 0xff, 0x66, 0xe1, 0x9e, 0x1c, 0x42, 0x7d, 0xff, - 0x2e, 0xec, 0x45, 0x32, 0xc8, 0xe0, 0x75, 0x79, 0x3c, 0x76, 0x7d, 0x94, - 0x62, 0x59, 0x54, 0x18, 0xd5, 0x88, 0x32, 0x3a, 0xac, 0x31, 0x8e, 0xef, - 0x49, 0x87, 0x3f, 0x08, 0x72, 0x6f, 0xa0, 0xef, 0xde, 0x7b, 0xf8, 0xd5, - 0x1b, 0x66, 0x39, 0x37, 0x53, 0xec, 0xb7, 0x27, 0x13, 0x9b, 0xfa, 0x5e, - 0x34, 0xbb, 0x66, 0xd5, 0xbf, 0x97, 0xa1, 0xe1, 0x7a, 0x37, 0xd8, 0xb9, - 0xd4, 0x73, 0xe7, 0xe9, 0x35, 0x6f, 0x45, 0x9c, 0x8c, 0x44, 0x9b, 0x75, - 0xb8, 0x68, 0xa0, 0x21, 0x5a, 0xa2, 0x31, 0xb3, 0x36, 0xa9, 0x8c, 0x47, - 0x9d, 0x18, 0xff, 0xdb, 0xdc, 0xf2, 0xda, 0x5c, 0x6d, 0x1a, 0x8a, 0x02, - 0x58, 0x37, 0x50, 0xc4, 0x0c, 0x81, 0x87, 0x0b, 0x5c, 0x1c, 0x0d, 0xe8, - 0xf0, 0xdf, 0xc1, 0xaf, 0x33, 0x7c, 0x79, 0x70, 0x75, 0x06, 0x00, 0x84, - 0x9f, 0x1b, 0x25, 0xe4, 0x10, 0x14, 0x10, 0x78, 0x2d, 0x86, 0x8a, 0xa4, - 0xd5, 0x6f, 0x42, 0xde, 0x93, 0xbb, 0xdf, 0xd3, 0x80, 0x6c, 0xa7, 0x36, - 0x08, 0xec, 0xa0, 0x9a, 0xc8, 0x39, 0x8a, 0xc5, 0x3c, 0x2e, 0x49, 0x5c, - 0xcd, 0x36, 0xdd, 0xdc, 0xc5, 0xc9, 0x28, 0x83, 0xaa, 0x7e, 0xd2, 0xb4, - 0x7d, 0xa4, 0xa3, 0x1b, 0xd7, 0x89, 0x94, 0x2e, 0x12, 0x28, 0xca, 0x87, - 0x79, 0x87, 0x06, 0x74, 0x91, 0xb2, 0xa2, 0x1e, 0x59, 0x74, 0xdc, 0x32, - 0x74, 0xc7, 0x0f, 0xd8, 0xa1, 0xf2, 0xd8, 0x5f, 0x09, 0x22, 0x5f, 0x2b, - 0x2d, 0x53, 0x21, 0x0f, 0x3f, 0x75, 0xc1, 0x83, 0xf9, 0xdc, 0xd8, 0x65, - 0x39, 0xf0, 0xe7, 0x4f, 0x0d, 0x98, 0x30, 0xdf, 0x54, 0xdf, 0x86, 0x08, - 0x02, 0x60, 0x17, 0x8c, 0xcc, 0x74, 0x6c, 0x05, 0xcd, 0xf3, 0xfb, 0xe6, - 0xe1, 0xd3, 0x0f, 0xaf, 0x7f, 0xe9, 0xae, 0x14, 0x57, 0x74, 0xa6, 0xa3, - 0xdb, 0x4c, 0x53, 0xd5, 0xd1, 0x49, 0xea, 0x6f, 0xfd, 0x3a, 0x74, 0x46, - 0x55, 0x22, 0x7e, 0x85, 0x61, 0xb2, 0x54, 0x9e, 0x00, 0xd4, 0x88, 0xea, - 0x23, 0x6a, 0xda, 0x8d, 0x50, 0x84, 0x12, 0x09, 0x89, 0x46, 0xf9, 0x94, - 0xe3, 0x2e, 0x0f, 0xa8, 0xbe, 0x29, 0x88, 0x0e, 0x7b, 0x21, 0xe5, 0x32, - 0x47, 0x34, 0x5d, 0x6f, 0x50, 0x64, 0x31, 0x81, 0xb4, 0x22, 0x15, 0xfb, - 0xc4, 0xc1, 0x63, 0x3e, 0x72, 0xa7, 0x46, 0x4d, 0x1d, 0x5e, 0x52, 0xf9, - 0x07, 0x01, 0x57, 0xd3, 0x86, 0x7f, 0x49, 0xa9, 0x88, 0x06, 0x05, 0x1a, - 0x82, 0xb6, 0xbe, 0xb2, 0xe2, 0xb4, 0x71, 0x71, 0x45, 0x4f, 0xd3, 0xe5, - 0xe5, 0x3e, 0x06, 0x42, 0x63, 0x26, 0x50, 0x31, 0x54, 0xb4, 0x13, 0x3e, - 0x64, 0x60, 0x59, 0x32, 0x87, 0xbc, 0x76, 0x32, 0x54, 0x7d, 0x19, 0xb4, - 0x85, 0xc9, 0x0a, 0x44, 0x00, 0x5b, 0x5b, 0x8a, 0xd3, 0xc7, 0x13, 0xcf, - 0x70, 0x84, 0x18, 0xe3, 0x2c, 0xb5, 0xf0, 0x32, 0x9e, 0x01, 0x4e, 0x23, - 0x31, 0x9c, 0xbc, 0x84, 0xd0, 0xa9, 0xeb, 0x23, 0x4c, 0xbd, 0x5f, 0x64, - 0x2d, 0x5b, 0xb3, 0x1b, 0x3a, 0x2a, 0x6d, 0x45, 0x0f, 0xb9, 0x64, 0x22, - 0x8b, 0x93, 0xd2, 0xe7, 0x61, 0xaa, 0xd7, 0x3c, 0x68, 0x1e, 0xe0, 0xac, - 0x46, 0xee, 0x8c, 0x94, 0x1e, 0xb6, 0xc5, 0xeb, 0x51, 0xd6, 0xcf, 0x1f, - 0x3b, 0x89, 0x96, 0x89, 0x9e, 0x8b, 0xb7, 0xde, 0x38, 0xdb, 0x13, 0xd5, - 0x35, 0x21, 0xf8, 0xee, 0xb0, 0x0e, 0x73, 0x3a, 0x87, 0xee, 0x28, 0x5a, - 0xca, 0xe3, 0x72, 0x13, 0x59, 0x02, 0x40, 0x41, 0x2f, 0xb0, 0xd3, 0xc9, - 0x3b, 0x7f, 0x9e, 0x68, 0x13, 0x0c, 0x3a, 0x4e, 0xdb, 0x84, 0x70, 0x2a, - 0x78, 0x66, 0x1c, 0x68, 0xad, 0x23, 0x4f, 0x60, 0xa2, 0x83, 0xa3, 0x29, - 0xf0, 0xa8, 0x97, 0xd8, 0xf0, 0xf2, 0xf3, 0x09, 0x43, 0x22, 0x53, 0xec, - 0xff, 0x79, 0x37, 0x12, 0x18, 0xec, 0xe5, 0xee, 0xf7, 0x07, 0xb9, 0xea, - 0x42, 0xbd, 0x80, 0x49, 0x9a, 0x76, 0x2b, 0x59, 0x87, 0x6c, 0x83, 0xc8, - 0x87, 0x21, 0xb0, 0xc9, 0xcf, 0x86, 0x9b, 0x7d, 0x43, 0x76, 0xe2, 0xe5, - 0xdf, 0xc8, 0x3f, 0x8a, 0xe9, 0xe0, 0xe2, 0xd5, 0xe6, 0xfc, 0xc4, 0x6a, - 0x61, 0xe5, 0x46, 0x3e, 0xf1, 0x38, 0x0b, 0xa1, 0x79, 0xa2, 0x0d, 0x9f, - 0x01, 0x25, 0xa3, 0xdd, 0xb3, 0xf3, 0x35, 0x91, 0x4f, 0x8c, 0x8f, 0xe2, - 0xc1, 0x5a, 0xcc, 0xb3, 0xab, 0x43, 0x41, 0xeb, 0x12, 0x2a, 0xf1, 0xc1, - 0x53, 0x5b, 0xdf, 0x0c, 0x6a, 0x6e, 0xa4, 0x3f, 0xaa, 0x57, 0xe8, 0x55, - 0xb5, 0x12, 0x96, 0x85, 0xb1, 0xd9, 0x78, 0xda, 0x5a, 0xdb, 0x8a, 0x82, - 0x43, 0x70, 0x7b, 0x14, 0x2a, 0xf4, 0xcc, 0x4f, 0x48, 0x34, 0x85, 0x9b, - 0xec, 0x96, 0x8b, 0x83, 0x88, 0x33, 0x6c, 0x52, 0x93, 0xd9, 0x44, 0xaf, - 0xf6, 0x16, 0xc6, 0xcb, 0xed, 0xa4, 0xcb, 0xd8, 0xd2, 0x65, 0xd9, 0xaa, - 0xaf, 0x2e, 0xf6, 0xba, 0xfc, 0xa5, 0x3a, 0x0d, 0x6c, 0x44, 0xf6, 0x27, - 0x1b, 0xf7, 0x00, 0xf2, 0xf2, 0x25, 0x02, 0xbc, 0x53, 0xa2, 0xbd, 0x22, - 0x90, 0x69, 0xb5, 0x71, 0xd4, 0x5f, 0x51, 0xed, 0x4c, 0x7d, 0x69, 0x50, - 0x8c, 0xb7, 0x7f, 0x80, 0x78, 0x98, 0xf8, 0x4c, 0x9c, 0xdc, 0xe6, 0x6a, - 0x27, 0x45, 0x83, 0xf6, 0xf6, 0xe9, 0xe6, 0x05, 0x42, 0x39, 0xd1, 0xd7, - 0x3c, 0x47, 0x7e, 0xd7, 0x4b, 0x85, 0xc0, 0xe8, 0x0d, 0xf2, 0x2c, 0xa9, - 0x0c, 0x52, 0x39, 0xcd, 0xb1, 0xfe, 0x13, 0xd3, 0x15, 0xc6, 0x18, 0xfd, - 0x53, 0xed, 0xd7, 0x87, 0xa5, 0x74, 0x89, 0x7f, 0x2f, 0xf3, 0x3b, 0x4d, - 0xc1, 0x43, 0xe0, 0xde, 0x8c, 0x3f, 0x96, 0x67, 0xe2, 0x7a, 0x72, 0x67, - 0xd7, 0x4a, 0x1c, 0x2d, 0x76, 0x7c, 0x59, 0x93, 0xef, 0xaf, 0xf5, 0xa2, - 0x64, 0xc0, 0x47, 0xcb, 0x68, 0x70, 0xbc, 0x21, 0x48, 0xa8, 0x56, 0xda, - 0x2b, 0x42, 0x3d, 0x0c, 0xc8, 0x8a, 0x4b, 0x1c, 0xd6, 0xd5, 0xef, 0x7e, - 0xc7, 0xa0, 0x1d, 0x97, 0x8f, 0x4e, 0x90, 0x63, 0x6a, 0x0a, 0x06, 0x2a, - 0xfc, 0xe4, 0xe4, 0x13, 0xc6, 0xaa, 0x72, 0xde, 0x60, 0x1b, 0xce, 0xad, - 0x1b, 0xe6, 0x54, 0xd7, 0x9c, 0x23, 0xbc, 0x12, 0xd5, 0x60, 0xe5, 0x4b, - 0xdd, 0x84, 0x95, 0x53, 0xc6, 0x10, 0xb1, 0x02, 0xdf, 0x6c, 0xce, 0x67, - 0xda, 0x9f, 0x4b, 0xc5, 0x07, 0x80, 0x95, 0xe6, 0xc9, 0x0f, 0x80, 0x41, - 0x13, 0x77, 0x9b, 0x3c, 0x26, 0xdd, 0x15, 0xb6, 0xbe, 0x4a, 0xec, 0x56, - 0x0d, 0xe1, 0xbc, 0x73, 0xb1, 0x67, 0x5c, 0xb6, 0xc9, 0x67, 0x92, 0x3d, - 0x08, 0x95, 0x07, 0x92, 0x6a, 0x98, 0x4c, 0x62, 0x9b, 0x9f, 0xe4, 0x2d, - 0x3c, 0x61, 0x76, 0xc8, 0x4d, 0x56, 0x97, 0x48, 0x68, 0xb9, 0xa0, 0xb4, - 0x93, 0xb8, 0xea, 0xac, 0x87, 0x97, 0x38, 0x2d, 0xfd, 0x31, 0xd6, 0x5b, - 0x3f, 0x4f, 0x74, 0x29, 0x12, 0xc7, 0x99, 0xc2, 0x7b, 0x05, 0x36, 0xf1, - 0x9e, 0xf3, 0xf6, 0x67, 0x3f, 0x4c, 0x4f, 0x61, 0xb0, 0x3c, 0x49, 0x10, - 0x0a, 0x6d, 0xb3, 0x06, 0x4f, 0xea, 0xab, 0x6b, 0xe2, 0x54, 0x80, 0x9c, - 0x83, 0x73, 0x47, 0xfd, 0x77, 0x03, 0x84, 0xbc, 0xf6, 0xd8, 0x25, 0x37, - 0x62, 0x46, 0xf3, 0xcd, 0x23, 0x16, 0xfc, 0x3e, 0xc5, 0xc3, 0x35, 0xb0, - 0x53, 0x22, 0xb2, 0xd7, 0x59, 0x60, 0x5a, 0xe3, 0x3b, 0x8c, 0xf3, 0xb7, - 0x5f, 0xf0, 0x5b, 0x59, 0x09, 0xdf, 0xdf, 0xed, 0x5e, 0xe3, 0x04, 0x16, - 0xae, 0x94, 0x7d, 0x8c, 0x04, 0x8e, 0x7c, 0xec, 0xee, 0x33, 0x83, 0x46, - 0x8f, 0x91, 0x17, 0xa4, 0x9a, 0xd7, 0x8b, 0x9d, 0x69, 0xd7, 0x2e, 0x9e, - 0x2e, 0x35, 0xbf, 0x0f, 0x12, 0xf0, 0xbe, 0xca, 0x76, 0x01, 0xa7, 0xa1, - 0x51, 0xc4, 0xe0, 0xc2, 0x28, 0x19, 0x82, 0x81, 0x49, 0x17, 0x6c, 0x5d, - 0xea, 0x63, 0x73, 0xc1, 0x3b, 0x2c, 0x52, 0x58, 0x02, 0x36, 0xb9, 0xf6, - 0xf1, 0x25, 0x9c, 0x7f, 0xf3, 0x40, 0x22, 0x0e, 0x38, 0xf7, 0xb8, 0x22, - 0xea, 0x58, 0x1f, 0x81, 0xc3, 0x45, 0x5a, 0xbb, 0x13, 0xcb, 0x25, 0x0b, - 0x17, 0xdd, 0xdd, 0x50, 0x29, 0xf3, 0xf6, 0x99, 0x00, 0x48, 0xe0, 0x85, - 0x1b, 0x89, 0xfe, 0x11, 0x0e, 0xdb, 0x9d, 0xe8, 0x08, 0x5a, 0xdb, 0xaa, - 0x67, 0xa0, 0x65, 0xa0, 0x46, 0x55, 0xe6, 0x60, 0xf0, 0x7a, 0x43, 0xd2, - 0xb0, 0xcd, 0x41, 0x52, 0xdd, 0x6b, 0x00, 0xa9, 0xc6, 0x86, 0x3c, 0x6b, - 0x38, 0x44, 0xab, 0xde, 0x3d, 0x5c, 0xce, 0x60, 0x2a, 0x2e, 0xbd, 0x8d, - 0xc0, 0xa1, 0x74, 0x4c, 0xc8, 0x01, 0x4a, 0x68, 0x9a, 0xa1, 0x43, 0x7a, - 0xa3, 0x8b, 0xd7, 0x85, 0xdb, 0x6f, 0x63, 0x62, 0x3e, 0x00, 0xe7, 0x4a, - 0xa5, 0xfd, 0xc3, 0x27, 0xdd, 0x68, 0xb3, 0x93, 0x57, 0x7d, 0xc5, 0x04, - 0x5e, 0x25, 0x1e, 0x6f, 0x3b, 0x80, 0xe7, 0xaa, 0x1a, 0x5b, 0x71, 0xfd, - 0x31, 0xa7, 0xd4, 0x3a, 0x2a, 0xf6, 0x38, 0xf3, 0x92, 0xb3, 0x43, 0x2c, - 0xb9, 0x60, 0x14, 0x0d, 0xd4, 0x35, 0x09, 0xdc, 0x23, 0x24, 0xaa, 0x99, - 0x57, 0x4e, 0x42, 0x4b, 0x3f, 0x92, 0x80, 0xa7, 0x37, 0x4d, 0xda, 0xa7, - 0xe3, 0x60, 0xb5, 0xb3, 0x15, 0xa8, 0xb2, 0xb9, 0x8e, 0x22, 0x58, 0x04, - 0xf7, 0x4f, 0x6f, 0xce, 0x12, 0xf1, 0xc1, 0x5d, 0x62, 0x20, 0x24, 0x70, - 0x83, 0xda, 0xcd, 0x32, 0x8e, 0xb0, 0x58, 0xfc, 0xd8, 0x8a, 0x11, 0xbd, - 0xab, 0xb9, 0x92, 0x89, 0xd7, 0xc8, 0xc6, 0x1b, 0x1f, 0xe0, 0xa3, 0x88, - 0xe7, 0x10, 0xc7, 0x49, 0x95, 0x3a, 0xdd, 0x73, 0xe8, 0x58, 0xd6, 0x29, - 0x55, 0x49, 0x20, 0x3c, 0xa8, 0x97, 0x3e, 0x01, 0x4b, 0x22, 0x43, 0xd9, - 0xa3, 0xad, 0xf8, 0x09, 0xb1, 0x81, 0xee, 0xbc, 0x70, 0x4e, 0x93, 0x13, - 0x50, 0x82, 0x1b, 0xe5, 0xf9, 0xa6, 0x86, 0x72, 0x5f, 0x39, 0xba, 0xfc, - 0x7f, 0xb9, 0x4b, 0xeb, 0x8b, 0xda, 0x09, 0x17, 0x70, 0xbb, 0x7a, 0xd1, - 0x89, 0x29, 0x69, 0xd3, 0xf8, 0xcf, 0xa7, 0x48, 0x35, 0xcd, 0x03, 0xfa, - 0x47, 0x6f, 0x0a, 0xf0, 0xc7, 0x3c, 0x10, 0xb4, 0x45, 0x68, 0x53, 0x47, - 0xc2, 0x6f, 0xcb, 0x41, 0xb3, 0x26, 0x5a, 0x66, 0xad, 0xbe, 0x7c, 0x77, - 0x70, 0x7a, 0x24, 0x59, 0xfc, 0x34, 0xa4, 0xa1, 0x8c, 0x43, 0xbf, 0x08, - 0x9e, 0x5a, 0x71, 0xda, 0xae, 0x45, 0x1b, 0x70, 0x4c, 0x86, 0x38, 0x10, - 0x8a, 0x23, 0xd3, 0x11, 0xa6, 0xab, 0xa5, 0xad, 0xdc, 0x47, 0x40, 0xa9, - 0x92, 0xf8, 0x45, 0x0a, 0xb7, 0x24, 0xa4, 0x8d, 0xc1, 0x32, 0xe1, 0x80, - 0x9d, 0x40, 0xfe, 0x1f, 0x3c, 0xb7, 0x9e, 0x70, 0x5b, 0xf4, 0xcf, 0xd1, - 0xe2, 0xd3, 0x0c, 0x04, 0xb6, 0x54, 0x87, 0x77, 0xa7, 0x67, 0x69, 0x38, - 0x90, 0x46, 0xe3, 0x88, 0x9a, 0xa5, 0x0a, 0x76, 0x54, 0x3c, 0x34, 0xa0, - 0xdb, 0xa9, 0x0b, 0x4b, 0x4b, 0x95, 0xda, 0xb3, 0x6f, 0x7f, 0x06, 0x89, - 0xcd, 0x9e, 0xfa, 0xac, 0xb0, 0x87, 0x2b, 0xa4, 0x54, 0x7c, 0x02, 0x88, - 0x63, 0xb6, 0xf7, 0xc8, 0x87, 0xa0, 0xf5, 0x29, 0x8b, 0x00, 0xd1, 0xe9, - 0x3f, 0xb9, 0x6e, 0x4c, 0xdc, 0x49, 0xa1, 0xe8, 0x24, 0xe6, 0xf3, 0xfb, - 0xac, 0xa9, 0x65, 0x49, 0xce, 0x4f, 0xcf, 0x9a, 0x08, 0x7f, 0x55, 0x72, - 0x80, 0x60, 0x3d, 0xef, 0x79, 0xbb, 0x38, 0x5d, 0x1e, 0xd8, 0xbc, 0x48, - 0xdb, 0x95, 0x19, 0xd8, 0x16, 0x08, 0x29, 0x80, 0x37, 0x8b, 0x70, 0x0e, - 0x70, 0xf7, 0x31, 0x1e, 0x87, 0xe9, 0xab, 0x22, 0xb2, 0xb1, 0x4a, 0x9d, - 0x75, 0xaa, 0x5c, 0xae, 0xd5, 0xda, 0x28, 0xd3, 0xf2, 0xf9, 0xc3, 0x0f, - 0x40, 0x69, 0x32, 0x6d, 0xbb, 0xf0, 0x72, 0x79, 0x9e, 0x5f, 0x56, 0xbc, - 0xd2, 0x44, 0xa5, 0xfc, 0xcb, 0xf6, 0x3a, 0x1e, 0x42, 0xd0, 0x24, 0x3f, - 0xce, 0x33, 0x4c, 0xdb, 0xd9, 0x27, 0x95, 0x43, 0xde, 0x79, 0xef, 0xd3, - 0xa6, 0x37, 0x24, 0x7a, 0xe3, 0x25, 0xa6, 0x31, 0x2b, 0xcc, 0x30, 0x1b, - 0x43, 0xb9, 0x58, 0xb3, 0x94, 0x1d, 0xc2, 0x95, 0x7f, 0x7c, 0xd9, 0x98, - 0xaf, 0x9a, 0x49, 0x27, 0x96, 0x1e, 0xf2, 0x1c, 0xf0, 0x41, 0x8e, 0xe1, - 0x74, 0x26, 0xc7, 0xb1, 0xb0, 0xf3, 0x3d, 0x01, 0xd0, 0xe2, 0x43, 0x3b, - 0xdd, 0x63, 0x86, 0x62, 0x45, 0x54, 0xef, 0x7e, 0x52, 0x83, 0x39, 0x21, - 0x7e, 0xa7, 0x57, 0x86, 0x1b, 0xa4, 0x73, 0x92, 0x96, 0x77, 0x6e, 0x85, - 0x05, 0x8e, 0x27, 0xbd, 0xeb, 0xf5, 0xdb, 0xf0, 0xab, 0x7e, 0xbb, 0x7e, - 0xcb, 0x7a, 0xf3, 0xde, 0x0a, 0x03, 0xf1, 0xb1, 0xf2, 0xfc, 0xe0, 0x21, - 0xb7, 0xdd, 0xe4, 0x18, 0xd8, 0xb9, 0xd5, 0xa4, 0x97, 0x69, 0x71, 0x7b, - 0xfe, 0x1b, 0xe4, 0x39, 0x14, 0x6e, 0xf7, 0xb0, 0x1b, 0x21, 0x4a, 0xe3, - 0x80, 0x19, 0xca, 0x89, 0x9d, 0x6a, 0x20, 0x04, 0x48, 0xfe, 0xbd, 0xbd, - 0xd1, 0x47, 0xdd, 0x2f, 0x9c, 0x5e, 0x18, 0xe4, 0x0c, 0x60, 0x54, 0x74, - 0x3a, 0x85, 0xe2, 0xc1, 0x25, 0x46, 0xe4, 0x47, 0xc7, 0xe4, 0x3c, 0xab, - 0x66, 0x7d, 0xc8, 0x8b, 0x48, 0x2f, 0x4a, 0x59, 0xc4, 0x37, 0xd1, 0x0d, - 0xb4, 0x58, 0x11, 0x87, 0x9e, 0x53, 0x56, 0xe0, 0xb6, 0x4a, 0xe7, 0xf9, - 0xc5, 0xd8, 0xaa, 0xac, 0xc8, 0xc4, 0xb2, 0x0c, 0x5d, 0xa0, 0x7c, 0x0e, - 0xbe, 0xb3, 0xff, 0x03, 0xa8, 0x6b, 0xc4, 0xaa, 0x18, 0x59, 0x11, 0xfb, - 0xc7, 0x91, 0x5e, 0xf3, 0x3d, 0x89, 0xcd, 0x7c, 0xf9, 0x13, 0x05, 0x05, - 0xf8, 0x25, 0x61, 0x00, 0x10, 0x2d, 0xc7, 0x8a, 0xda, 0xf1, 0xfa, 0x96, - 0xca, 0x74, 0xec, 0xb1, 0x30, 0x25, 0x15, 0xda, 0x8d, 0x7f, 0x2f, 0x63, - 0xf3, 0x05, 0x6c, 0x65, 0x6f, 0xda, 0x3c, 0x94, 0x4c, 0x5c, 0x09, 0x6d, - 0xb7, 0x0e, 0xf3, 0x2b, 0x8f, 0x59, 0x40, 0xb7, 0xca, 0x69, 0xa1, 0x5c, - 0x27, 0x3c, 0x5a, 0xa2, 0x8b, 0x39, 0x86, 0x6d, 0xc3, 0x03, 0x91, 0x69, - 0xa2, 0xe1, 0x94, 0x6e, 0xe4, 0xbe, 0x61, 0x88, 0x5e, 0x14, 0x6a, 0x49, - 0x37, 0x8b, 0x70, 0x0e, 0x70, 0xf7, 0x31, 0x1e, 0x86, 0x1d, 0xab, 0x22, - 0xb1, 0x01, 0x4a, 0x9d, 0x4a, 0x94, 0xb0, 0x8c, 0x34, 0x3d, 0x90, 0x34, - 0xff, 0xfc, 0xee, 0xcb, 0x3e, 0x73, 0xbf, 0xf7, 0x30, 0x8d, 0xba, 0x96, - 0x36, 0x82, 0xce, 0x66, 0x2c, 0x98, 0xdf, 0xe0, 0x7a, 0xea, 0x96, 0x13, - 0x59, 0x31, 0x7e, 0x6a, 0xd5, 0x49, 0xd4, 0x15, 0x2f, 0xb5, 0x0f, 0xb0, - 0x12, 0x8d, 0x27, 0x68, 0xba, 0xaa, 0xa7, 0xd7, 0xa3, 0x94, 0x19, 0x10, - 0xa8, 0x1e, 0xb7, 0x6e, 0xbe, 0xa5, 0xd4, 0xf8, 0xef, 0x4b, 0xbd, 0x6e, - 0x63, 0xb3, 0x1c, 0xed, 0xb0, 0x15, 0x09, 0xe0, 0x34, 0xa1, 0x0f, 0xcb, - 0xcf, 0xb1, 0x8b, 0x2c, 0xef, 0x53, 0x99, 0x99, 0xc2, 0x6e, 0x9d, 0xdc, - 0x7c, 0xda, 0x70, 0xbc, 0x60, 0xf0, 0xe0, 0x55, 0x0f, 0x98, 0xfe, 0x69, - 0xa5, 0xb9, 0x90, 0x22, 0xea, 0xa6, 0x6b, 0xee, 0x03, 0x33, 0xec, 0x12, - 0xd2, 0x5f, 0xac, 0x28, 0xb8, 0x38, 0xfc, 0x76, 0x9d, 0x55, 0x23, 0x10, - 0xdc, 0x21, 0x54, 0x0f, 0x35, 0xd4, 0xa8, 0x77, 0x65, 0x8d, 0xc9, 0xb2, - 0xa3, 0x8b, 0x1c, 0x40, 0xe3, 0xc3, 0x7d, 0xa1, 0xf0, 0x2e, 0xf7, 0xd7, - 0x50, 0xfc, 0xf3, 0xe7, 0x14, 0x5f, 0xd3, 0x63, 0xa0, 0xa0, 0xbf, 0xe6, - 0x7e, 0x67, 0x25, 0xe1, 0x1e, 0xe5, 0xe0, 0x6f, 0x6a, 0xd7, 0xeb, 0x39, - 0xb7, 0x3c, 0xbc, 0x6c, 0x7e, 0xe0, 0xbf, 0x46, 0x36, 0x06, 0x01, 0x4e, - 0x79, 0x94, 0xc8, 0x78, 0x69, 0xb6, 0x50, 0x24, 0xf2, 0x8e, 0x75, 0x28, - 0xb4, 0x9a, 0x44, 0xe7, 0x8d, 0xc0, 0x80, 0x8b, 0x26, 0x17, 0xe5, 0xdd, - 0x0e, 0x16, 0x2c, 0xa2, 0xc0, 0x44, 0x7b, 0x07, 0xb6, 0xa2, 0x93, 0xd2, - 0x9c, 0xf4, 0x2e, 0x74, 0x07, 0x45, 0xef, 0x80, 0x1a, 0x71, 0x09, 0x34, - 0x45, 0x2d, 0xa6, 0x5f, 0x33, 0x12, 0x5f, 0xa9, 0x9e, 0xaa, 0x75, 0x7c, - 0x57, 0xda, 0x3b, 0xa2, 0x1c, 0x3d, 0x36, 0x3d, 0x9f, 0x68, 0x58, 0xbe, - 0xcb, 0x69, 0x45, 0x71, 0x14, 0x33, 0xee, 0x7a, 0xb3, 0x48, 0x2e, 0x1c, - 0xce, 0x5e, 0xb2, 0x4f, 0xcb, 0x1f, 0xbf, 0xfa, 0x0c, 0x3e, 0x6b, 0x72, - 0xdd, 0xee, 0x25, 0xe0, 0xeb, 0xea, 0xaa, 0x1b, 0x33, 0x79, 0x5b, 0x2f, - 0x76, 0x83, 0x97, 0x68, 0x7a, 0xcb, 0x66, 0x57, 0x2f, 0xde, 0xec, 0x0f, - 0x4c, 0x02, 0x98, 0x79, 0x7d, 0x93, 0x5d, 0x39, 0xbc, 0xab, 0x75, 0x90, - 0xc5, 0x31, 0x3b, 0x5c, 0xf5, 0xe7, 0xac, 0xbc, 0x62, 0x9d, 0xf4, 0x17, - 0x55, 0xb3, 0xb1, 0x73, 0x82, 0x0d, 0x2d, 0xcb, 0x95, 0xc2, 0xfc, 0x38, - 0xc1, 0xa6, 0xed, 0x03, 0xaa, 0x10, 0x9a, 0x87, 0xfb, 0xfb, 0xaa, 0x47, - 0x0f, 0xa4, 0x22, 0x88, 0x28, 0xc7, 0xcc, 0x90, 0x1a, 0x7e, 0x58, 0x06, - 0xf1, 0x10, 0x74, 0x41, 0x9c, 0xf9, 0x1b, 0xff, 0xa8, 0x29, 0x65, 0xc3, - 0xe4, 0xfc, 0x5f, 0x43, 0x6e, 0x12, 0x1b, 0x94, 0xcf, 0x0e, 0xcd, 0x31, - 0x17, 0xb9, 0x71, 0x2e, 0xf4, 0x10, 0xee, 0xba, 0xee, 0x6c, 0xa1, 0x7e, - 0xdd, 0xec, 0x05, 0x86, 0xdc, 0x37, 0xde, 0xb9, 0x01, 0x7f, 0xe1, 0x2f, - 0xc2, 0xe7, 0x60, 0x61, 0xb9, 0x72, 0xda, 0x29, 0xb7, 0xf5, 0xfa, 0x24, - 0xe0, 0x90, 0xd3, 0x27, 0xb0, 0x5c, 0xcd, 0x46, 0x56, 0xe4, 0x7d, 0xad, - 0x35, 0x0c, 0x4e, 0x5c, 0x3c, 0x2f, 0xd7, 0x89, 0x16, 0xcc, 0xb1, 0x19, - 0x1e, 0xfb, 0x1f, 0x07, 0xbc, 0x32, 0x01, 0xfb, 0x3d, 0x22, 0x67, 0x5c, - 0x82, 0x87, 0xc8, 0x88, 0xd1, 0xcf, 0x3f, 0xf0, 0x7a, 0x6f, 0x63, 0xab, - 0x5c, 0x7b, 0x97, 0x3f, 0xdb, 0xa4, 0x94, 0xa9, 0xd9, 0x5c, 0xb4, 0x54, - 0x58, 0x10, 0xc8, 0x61, 0x3a, 0x5f, 0x55, 0x5e, 0x97, 0x13, 0x10, 0xd3, - 0xcd, 0x17, 0x3b, 0xbc, 0x89, 0xaf, 0xe5, 0x12, 0x17, 0x94, 0x5f, 0x95, - 0xf8, 0xf9, 0x07, 0x4f, 0x60, 0x4b, 0x65, 0xf9, 0xfd, 0x78, 0x46, 0x28, - 0x79, 0x5c, 0x65, 0x35, 0xc1, 0x1c, 0xfe, 0x02, 0x27, 0x70, 0x9f, 0x8c, - 0x7f, 0x7d, 0x38, 0x49, 0xa7, 0x1f, 0x1e, 0x67, 0xbd, 0x99, 0x6a, 0xff, - 0xe0, 0xc3, 0x6f, 0x2d, 0x19, 0xde, 0x92, 0x4b, 0x6f, 0x82, 0x36, 0xe1, - 0x97, 0xce, 0x96, 0x55, 0x90, 0x96, 0x38, 0x7a, 0x66, 0x57, 0x78, 0x5e, - 0xa1, 0xa8, 0x5c, 0xaa, 0x2b, 0x03, 0xbb, 0xc9, 0x94, 0xf7, 0xdf, 0x33, - 0x03, 0x3b, 0x17, 0x8f, 0x45, 0xbb, 0x57, 0xdf, 0x43, 0xa2, 0xc8, 0x39, - 0x11, 0x51, 0xa8, 0xe3, 0xe6, 0x21, 0x9a, 0xfa, 0x13, 0x3a, 0x06, 0x81, - 0xae, 0x8a, 0x5d, 0xdb, 0xde, 0x5b, 0x51, 0xe3, 0xe7, 0xea, 0x9c, 0xf8, - 0x70, 0x18, 0x4b, 0xbc, 0xb3, 0x0a, 0x23, 0x34, 0x00, 0x02, 0x37, 0x5d, - 0x28, 0x10, 0xaa, 0xbe, 0x43, 0xda, 0x4f, 0xd9, 0x4e, 0x81, 0x71, 0xb1, - 0xb7, 0x94, 0xbc, 0x08, 0x7a, 0xda, 0x6f, 0x6c, 0xe2, 0xfc, 0x5e, 0xbc, - 0x87, 0xb4, 0x85, 0x06, 0x74, 0x98, 0x9e, 0x6a, 0x9a, 0xf5, 0x31, 0x93, - 0xf1, 0x7f, 0x5a, 0x02, 0xb3, 0x37, 0x39, 0x93, 0x37, 0xe9, 0x96, 0x17, - 0x8a, 0xea, 0xe6, 0x22, 0xec, 0x9a, 0xe2, 0x43, 0x1d, 0xd0, 0x04, 0x73, - 0xfd, 0xf4, 0x4b, 0xad, 0x9b, 0x89, 0x7b, 0x18, 0xb3, 0x5f, 0x94, 0x44, - 0x3e, 0x3f, 0x60, 0xee, 0x52, 0xad, 0xa6, 0x90, 0x3a, 0xf9, 0xe4, 0x53, - 0xca, 0x25, 0x7a, 0xb0, 0x1e, 0x2b, 0x9b, 0x8f, 0xbd, 0xff, 0x8d, 0x87, - 0x24, 0x74, 0x62, 0xb5, 0xc9, 0x69, 0x37, 0x65, 0x0a, 0x63, 0xa4, 0x34, - 0xee, 0xf6, 0x86, 0xde, 0x77, 0x5f, 0x4d, 0xce, 0x61, 0x77, 0x2f, 0xee, - 0xb0, 0x83, 0x55, 0xbd, 0x3e, 0xe6, 0x82, 0x9d, 0x2a, 0x88, 0x59, 0x5c, - 0xa2, 0x56, 0xca, 0x90, 0x8f, 0x61, 0x75, 0x5a, 0xd0, 0xda, 0xde, 0x6e, - 0xe5, 0x27, 0x01, 0x43, 0xc7, 0xa3, 0x76, 0xeb, 0x36, 0xfe, 0x56, 0x89, - 0x50, 0x08, 0x26, 0x4c, 0x6b, 0x7c, 0xdc, 0x81, 0x73, 0x80, 0x39, 0x67, - 0x2c, 0xfa, 0x7d, 0x17, 0xba, 0x2f, 0x54, 0x6f, 0x20, 0x86, 0x9a, 0x72, - 0x58, 0xd9, 0x6f, 0x31, 0xe2, 0xb6, 0xe5, 0x6e, 0x5b, 0xba, 0x01, 0x90, - 0xce, 0x7c, 0x17, 0x2f, 0x39, 0xb8, 0xcc, 0x3e, 0x5d, 0x62, 0x4e, 0xbb, - 0x10, 0xab, 0x5c, 0x21, 0xfa, 0x2b, 0xac, 0x84, 0x8f, 0xac, 0x8a, 0xaa, - 0x91, 0x19, 0x73, 0x47, 0x96, 0x52, 0xed, 0xe9, 0xfc, 0xe6, 0x75, 0xc2, - 0xf8, 0xc9, 0x46, 0x47, 0xaa, 0x51, 0x8a, 0x9d, 0xb0, 0x54, 0x7c, 0x2c, - 0xb1, 0xfe, 0xe6, 0x0d, 0x61, 0xd1, 0xfc, 0xe0, 0xba, 0xd1, 0x91, 0x26, - 0x6d, 0xc8, 0xa4, 0x6b, 0x2d, 0x47, 0x4f, 0x76, 0xb6, 0xf8, 0xbc, 0xac, - 0x5e, 0x94, 0x5f, 0xb4, 0x69, 0x13, 0xb6, 0xf2, 0xd2, 0x87, 0xea, 0x68, - 0x9c, 0x56, 0xbb, 0x8a, 0xf6, 0x2b, 0xfc, 0xde, 0x10, 0xd3, 0xdf, 0x95, - 0xae, 0x9c, 0x71, 0x4b, 0x17, 0x97, 0x6e, 0xe7, 0x93, 0x62, 0x51, 0xe9, - 0x2d, 0xa8, 0x5c, 0xb2, 0x0e, 0x46, 0x9d, 0x0d, 0x23, 0xae, 0xdd, 0x9d, - 0xee, 0xbc, 0x83, 0x60, 0x53, 0x54, 0x5a, 0x03, 0xd7, 0x30, 0x8d, 0xc3, - 0xbb, 0x6c, 0x85, 0x2b, 0xaa, 0x2f, 0x67, 0x39, 0x89, 0xac, 0x66, 0xee, - 0x7c, 0x0d, 0xb5, 0x78, 0xeb, 0x56, 0x7f, 0x51, 0xdb, 0x94, 0x85, 0x73, - 0x73, 0xe6, 0xb6, 0x25, 0x38, 0x58, 0x0b, 0xb6, 0x32, 0x74, 0x68, 0xe4, - 0x8e, 0x7a, 0xa1, 0xc7, 0x43, 0x4a, 0xe4, 0x31, 0xe9, 0x7f, 0xdc, 0xda, - 0xc2, 0x8f, 0x93, 0x79, 0x1e, 0xd8, 0x42, 0xc6, 0x2d, 0x7f, 0xc4, 0xfd, - 0x1c, 0xf1, 0x7c, 0xd6, 0x00, 0x99, 0xa7, 0xfd, 0xe5, 0x5d, 0xc2, 0x5d, - 0xe9, 0x9b, 0x17, 0x85, 0x9b, 0x14, 0x32, 0xe1, 0x40, 0xe1, 0x5a, 0xd2, - 0x05, 0x42, 0xb7, 0xe3, 0x01, 0x96, 0x50, 0xbb, 0xbb, 0x4b, 0x49, 0x5d, - 0x38, 0x53, 0x62, 0x61, 0x48, 0x3c, 0x6e, 0xb3, 0x6e, 0xf4, 0x47, 0x28, - 0x14, 0xd2, 0x21, 0x11, 0x7e, 0x51, 0x7e, 0x2a, 0x38, 0xa4, 0x2a, 0xd0, - 0xce, 0x33, 0x5c, 0x4b, 0x78, 0xb2, 0xfe, 0x1e, 0x11, 0x74, 0x24, 0x04, - 0x59, 0x52, 0xb3, 0x99, 0x01, 0x1a, 0xba, 0x27, 0xfe, 0xee, 0x72, 0x96, - 0x63, 0x23, 0x78, 0xab, 0xbb, 0x61, 0x3a, 0xcc, 0x7c, 0xc0, 0x61, 0x13, - 0xb1, 0x14, 0x06, 0xb3, 0x6e, 0xc2, 0x08, 0x77, 0xe9, 0x2b, 0x2b, 0x40, - 0x5e, 0x2c, 0xa4, 0x48, 0x97, 0x83, 0xdc, 0x72, 0x33, 0x4e, 0xe8, 0x79, - 0x46, 0x8e, 0x5d, 0x8f, 0x2c, 0x65, 0x28, 0x50, 0xda, 0x3a, 0xbb, 0x9b, - 0x93, 0x7e, 0x4f, 0xd1, 0x35, 0xa1, 0x26, 0xbd, 0x22, 0x5f, 0x00, 0xb6, - 0x9f, 0x05, 0x89, 0x91, 0x04, 0xa1, 0xa1, 0xd3, 0xa7, 0xd1, 0xac, 0xa3, - 0xfd, 0x1d, 0x2a, 0x84, 0x4d, 0xe9, 0xba, 0xe4, 0x2c, 0x35, 0xf6, 0x0c, - 0xce, 0x62, 0x87, 0x2b, 0x1a, 0xbc, 0x70, 0x16, 0x00, 0x4c, 0x17, 0xfb, - 0xce, 0x50, 0x10, 0x24, 0x58, 0x74, 0x3a, 0xbe, 0xa1, 0x9e, 0x51, 0x5d, - 0x6c, 0x23, 0x4a, 0xe5, 0x52, 0x71, 0xb1, 0x0b, 0xa2, 0xc3, 0xc6, 0xe6, - 0xf5, 0x62, 0x5c, 0x14, 0x60, 0xa2, 0x16, 0xc2, 0xdb, 0x81, 0xc9, 0xec, - 0x91, 0x83, 0x54, 0xc3, 0x86, 0xc8, 0xa9, 0x6b, 0xfe, 0x4c, 0xb5, 0x7e, - 0x84, 0xe3, 0x0f, 0xf8, 0x19, 0x18, 0xba, 0xa5, 0xf7, 0x53, 0xe3, 0x56, - 0x75, 0x6b, 0xf3, 0x61, 0x9a, 0xb0, 0x70, 0x39, 0x2b, 0x03, 0x93, 0xe6, - 0x35, 0x05, 0x2f, 0x84, 0xb2, 0x75, 0x7f, 0xa8, 0x38, 0xb5, 0x69, 0x06, - 0xf6, 0x85, 0x11, 0xfa, 0x91, 0x77, 0xe9, 0x5a, 0x44, 0x12, 0x30, 0xb5, - 0xe0, 0xcf, 0xfe, 0xa3, 0xa2, 0xab, 0xcd, 0xd6, 0x44, 0x20, 0xfe, 0xae, - 0x09, 0x6c, 0x1b, 0x2a, 0x65, 0x5b, 0x79, 0x77, 0x26, 0xe0, 0x22, 0x80, - 0xc4, 0xcd, 0x86, 0x0c, 0xae, 0xce, 0x65, 0x75, 0xc6, 0x72, 0x57, 0x72, - 0x3d, 0x99, 0xc3, 0x58, 0x12, 0x40, 0xdd, 0xb0, 0x5c, 0xdd, 0xf7, 0x94, - 0x9f, 0xa6, 0x5a, 0xaf, 0xa9, 0x7e, 0x8b, 0x51, 0x22, 0x79, 0xdf, 0xff, - 0x55, 0x86, 0x5f, 0x83, 0x23, 0x47, 0x18, 0x59, 0xf5, 0x74, 0x10, 0x51, - 0x6d, 0x0b, 0xf7, 0x32, 0xd7, 0xce, 0x50, 0xb2, 0x0f, 0x0d, 0x82, 0x80, - 0xe7, 0x1f, 0xba, 0xfc, 0x1c, 0x31, 0x8c, 0xe9, 0xcd, 0x7c, 0x09, 0x40, - 0xf4, 0xdb, 0x75, 0x5f, 0x52, 0x46, 0xfa, 0x49, 0x4a, 0x66, 0xfd, 0x63, - 0x78, 0x7f, 0x23, 0x83, 0x7a, 0x33, 0x31, 0x4f, 0x2a, 0xd2, 0x02, 0xe6, - 0x26, 0xb6, 0x13, 0xc6, 0x29, 0xf0, 0xe3, 0xa9, 0xee, 0x09, 0x5c, 0xa2, - 0x9a, 0x0f, 0xe3, 0x79, 0x47, 0x7b, 0x64, 0x76, 0x17, 0x4d, 0xe7, 0x26, - 0x08, 0x45, 0x18, 0xc7, 0xa0, 0x37, 0xec, 0xae, 0x27, 0x1a, 0xbc, 0x61, - 0x3c, 0x0f, 0xdf, 0x0e, 0xac, 0x5f, 0x78, 0x38, 0x49, 0x14, 0x62, 0x30, - 0x47, 0x54, 0x49, 0xe5, 0x77, 0xb8, 0x68, 0xb2, 0x4e, 0xec, 0xf1, 0xeb, - 0x9f, 0x3b, 0xe3, 0xc1, 0xf8, 0x41, 0xbf, 0x34, 0x7e, 0x08, 0x6d, 0x24, - 0x7c, 0x9c, 0x84, 0xe2, 0x4b, 0x9e, 0xdc, 0xbf, 0xc6, 0x10, 0x73, 0x72, - 0xee, 0x13, 0xb9, 0x22, 0x54, 0x5c, 0xea, 0x7f, 0x45, 0x5a, 0x69, 0x48, - 0x82, 0x28, 0xf8, 0x42, 0x2d, 0x33, 0x9f, 0xc2, 0x36, 0xee, 0x1e, 0xf3, - 0x5a, 0xef, 0xbf, 0x35, 0x76, 0x65, 0x4d, 0xe2, 0xc3, 0xa2, 0x09, 0x93, - 0x27, 0xca, 0x52, 0x5e, 0xa2, 0x40, 0x3a, 0x19, 0x96, 0xbc, 0x72, 0x83, - 0x17, 0x34, 0x83, 0xf2, 0x7f, 0x61, 0xd8, 0x5c, 0x32, 0xaf, 0x96, 0x7c, - 0x60, 0xe0, 0x81, 0xe0, 0xea, 0x47, 0x40, 0x4d, 0xef, 0x42, 0x3f, 0x7d, - 0x2f, 0xc8, 0xc8, 0x0d, 0x46, 0x96, 0x46, 0xd2, 0x21, 0x35, 0x3b, 0x3d, - 0x91, 0x7b, 0xd5, 0xc9, 0xfc, 0x46, 0xe4, 0x03, 0x80, 0x4c, 0xb5, 0xf7, - 0xde, 0xdf, 0x61, 0x2d, 0x28, 0xb3, 0x25, 0xbb, 0x04, 0xec, 0x13, 0x11, - 0xc3, 0x15, 0x78, 0xd5, 0x15, 0xc3, 0xe9, 0xc0, 0x98, 0xbc, 0x7f, 0x21, - 0x70, 0x6a, 0x8e, 0xbc, 0xee, 0xd0, 0x35, 0xa6, 0xd2, 0xed, 0x98, 0x2c, - 0xcf, 0x02, 0xa0, 0x82, 0x7e, 0x06, 0xa8, 0xc0, 0xd1, 0xad, 0x49, 0x52, - 0xa9, 0x8b, 0x9a, 0x96, 0xbd, 0x05, 0x41, 0xf4, 0xdc, 0x53, 0xbb, 0x7e, - 0x28, 0x17, 0x97, 0xe1, 0xfc, 0xf8, 0x39, 0x8e, 0x18, 0x2e, 0xee, 0x8b, - 0xb8, 0x05, 0xe3, 0x32, 0x5e, 0xcf, 0x53, 0x69, 0x22, 0xf5, 0x2a, 0x55, - 0x11, 0x46, 0xf0, 0x1a, 0x1f, 0xaf, 0xd1, 0x8c, 0x60, 0x63, 0x32, 0x22, - 0x7b, 0xf4, 0xc2, 0x88, 0x93, 0xd7, 0x1d, 0x86, 0x4b, 0x16, 0xe7, 0x40, - 0x90, 0xd5, 0x3f, 0x41, 0xb2, 0x5c, 0x6c, 0xd8, 0x2e, 0xc9, 0x3c, 0x06, - 0xb6, 0x6a, 0x9e, 0x70, 0xdc, 0x6b, 0xb5, 0x87, 0x2d, 0x92, 0xd9, 0x2c, - 0x6f, 0xe9, 0xd1, 0x9b, 0x98, 0x64, 0xe2, 0x2a, 0xf6, 0xd3, 0x40, 0x70, - 0xb1, 0x3e, 0x41, 0xab, 0x97, 0xfd, 0x2d, 0x5d, 0x1c, 0x78, 0xaa, 0x31, - 0x7d, 0xe0, 0x14, 0x41, 0x30, 0x95, 0x5f, 0x89, 0xfd, 0xac, 0x08, 0xf4, - 0x04, 0x9b, 0xca, 0x82, 0xe0, 0x90, 0x2c, 0xe5, 0x0f, 0x3b, 0xb0, 0xac, - 0x8b, 0xae, 0x32, 0x78, 0x38, 0x21, 0xe5, 0x6a, 0x4f, 0x3e, 0x55, 0xc9, - 0xf9, 0x67, 0xf0, 0x97, 0xb1, 0x12, 0x81, 0xe9, 0x9e, 0x92, 0x22, 0x0d, - 0x82, 0xd6, 0x93, 0xb6, 0x6e, 0x11, 0x9b, 0xba, 0xc8, 0x05, 0xe6, 0x8d, - 0x1c, 0x58, 0x1e, 0x07, 0x34, 0x21, 0xab, 0x5b, 0x57, 0xe5, 0xde, 0x31, - 0x9a, 0xd9, 0x99, 0x43, 0xe9, 0x80, 0x15, 0xa8, 0x0d, 0xd3, 0x1c, 0xc3, - 0x74, 0x35, 0x27, 0xeb, 0x18, 0x7f, 0x83, 0x1a, 0x1f, 0x8f, 0x53, 0xb7, - 0xd4, 0x07, 0xca, 0x73, 0x2c, 0x9e, 0x06, 0x1b, 0x08, 0xbd, 0x7c, 0x82, - 0x13, 0xa8, 0xb5, 0xc3, 0x6a, 0x56, 0x7c, 0x16, 0x6b, 0x06, 0x47, 0x03, - 0x6a, 0xfb, 0x34, 0x1f, 0xda, 0x68, 0xd6, 0xf5, 0x5c, 0x99, 0x62, 0x8a, - 0x61, 0x21, 0x38, 0x38, 0x6e, 0x20, 0x87, 0xbb, 0xc0, 0xbc, 0xd2, 0x3a, - 0x8f, 0xb7, 0xa7, 0x6f, 0xa8, 0x23, 0x93, 0x9f, 0xde, 0x1f, 0xfa, 0x34, - 0x25, 0x55, 0x4d, 0x39, 0xae, 0xe4, 0xa3, 0xce, 0x62, 0x60, 0x16, 0x68, - 0x2e, 0xdb, 0xc3, 0xa0, 0x7f, 0x0a, 0x8c, 0x4f, 0xe8, 0x0e, 0x33, 0x2c, - 0xc9, 0x41, 0x62, 0x89, 0x86, 0xbe, 0xcc, 0xa2, 0x95, 0x46, 0x64, 0xb6, - 0xa4, 0x72, 0x47, 0x30, 0x1a, 0xa3, 0xd9, 0xf3, 0x79, 0x30, 0xd6, 0xb4, - 0x52, 0x97, 0xd2, 0x1b, 0xdd, 0x6a, 0x2a, 0x0f, 0x0a, 0xe8, 0xe9, 0xc7, - 0xc5, 0x4f, 0xc3, 0xc7, 0xb4, 0xef, 0x81, 0xa0, 0xaa, 0xdd, 0x68, 0x2d, - 0xfe, 0x54, 0x24, 0x26, 0x62, 0xe9, 0xa0, 0xfe, 0x91, 0xfc, 0xe5, 0x9f, - 0xfe, 0x5a, 0xc9, 0x8a, 0x3f, 0x37, 0xc3, 0xbb, 0x82, 0x26, 0xad, 0xf6, - 0xce, 0xc5, 0xa4, 0x91, 0x69, 0x3d, 0x0d, 0x4d, 0xea, 0xf7, 0x8d, 0x37, - 0x16, 0x10, 0xd4, 0xad, 0x54, 0x8f, 0x55, 0xb4, 0xb9, 0xbb, 0xfc, 0x9b, - 0xd7, 0xea, 0x6a, 0x53, 0xf9, 0x60, 0xc0, 0x78, 0xc6, 0xef, 0x92, 0xe3, - 0x2e, 0x7f, 0x5e, 0x87, 0x70, 0xb4, 0x10, 0x7e, 0xba, 0x75, 0x7e, 0x58, - 0x00, 0x39, 0x36, 0xf3, 0xa2, 0x7b, 0xf4, 0x73, 0x5b, 0x79, 0x15, 0x74, - 0x04, 0xf0, 0x0f, 0x95, 0xba, 0x00, 0x48, 0x2f, 0x57, 0x00, 0xc2, 0x5b, - 0xf5, 0x94, 0xf8, 0x30, 0x83, 0x0f, 0xfc, 0xc5, 0x0c, 0x7a, 0xb2, 0x73, - 0x77, 0x0e, 0x4e, 0xda, 0xb5, 0x82, 0x09, 0xe0, 0x90, 0x58, 0xea, 0xde, - 0x21, 0x54, 0xcd, 0x70, 0xab, 0xe9, 0x27, 0x3d, 0x3e, 0xd8, 0xe1, 0xc9, - 0xf1, 0x59, 0xc4, 0xd8, 0x61, 0x02, 0xc6, 0x93, 0x27, 0x05, 0xf4, 0x24, - 0x8d, 0x06, 0xbb, 0x19, 0x9f, 0xa0, 0xa1, 0x07, 0xe7, 0x7d, 0x65, 0xfa, - 0xda, 0xb4, 0x52, 0xd7, 0xcf, 0x22, 0x05, 0xa4, 0xa1, 0x03, 0x49, 0x91, - 0x8f, 0x85, 0x7e, 0x07, 0xf4, 0x24, 0xd5, 0x3c, 0xaa, 0x25, 0x6b, 0x78, - 0x41, 0xc6, 0x04, 0xca, 0xac, 0x0b, 0x6a, 0x81, 0x9d, 0x43, 0x61, 0x18, - 0x28, 0x45, 0x34, 0xd4, 0xa7, 0x16, 0x90, 0xaa, 0x7a, 0x8f, 0x53, 0x13, - 0x21, 0x4a, 0xf2, 0xf1, 0xd2, 0xdc, 0x57, 0x08, 0x3c, 0xfc, 0xb1, 0xaa, - 0x81, 0x58, 0xec, 0xe9, 0xcd, 0x53, 0x60, 0x45, 0x66, 0x53, 0xb8, 0x2b, - 0x70, 0x3d, 0x30, 0xb2, 0x1f, 0xf6, 0x1d, 0xdb, 0x23, 0xdc, 0xe4, 0x3b, - 0xbe, 0x75, 0xb5, 0x19, 0x27, 0x3c, 0x0c, 0x9c, 0x58, 0x77, 0xaf, 0x8b, - 0x3f, 0x25, 0xf4, 0xa1, 0x93, 0xe9, 0x0c, 0x0b, 0xd2, 0xd6, 0xd0, 0x69, - 0xf4, 0xdc, 0x0c, 0x83, 0x67, 0x2d, 0x88, 0x1c, 0x68, 0x28, 0xdc, 0xbb, - 0xea, 0x14, 0xcf, 0xe8, 0x29, 0x56, 0x6d, 0x7d, 0x7b, 0xab, 0xf5, 0x01, - 0x41, 0xf4, 0xbe, 0x05, 0xb0, 0x8f, 0x5a, 0x13, 0xc2, 0x94, 0x2c, 0x26, - 0xb4, 0xc2, 0x9f, 0xb6, 0x3f, 0x1a, 0x2e, 0x72, 0x13, 0x6d, 0x33, 0x9a, - 0xc2, 0xec, 0x7a, 0xc1, 0x18, 0xa7, 0x4b, 0x79, 0xca, 0xa3, 0xe3, 0xaf, - 0x13, 0x5a, 0x2a, 0x3a, 0x5b, 0xfc, 0x1e, 0x56, 0x34, 0xf4, 0x71, 0x4c, - 0x87, 0xd7, 0x5d, 0xff, 0xd4, 0xf9, 0x3d, 0x0f, 0x75, 0xa9, 0xb2, 0xd8, - 0x1e, 0xb6, 0x13, 0xc9, 0x0c, 0x18, 0xff, 0x18, 0xef, 0x3d, 0x9b, 0x57, - 0x68, 0xc2, 0x41, 0x7c, 0x70, 0xcc, 0x55, 0xa6, 0x71, 0x2d, 0xeb, 0x53, - 0xb0, 0x62, 0x8f, 0x12, 0x9c, 0xc6, 0x22, 0xc5, 0x9a, 0xdc, 0x5b, 0xb6, - 0xe6, 0x2c, 0x9b, 0x8f, 0x12, 0xfb, 0x53, 0x45, 0xad, 0xc9, 0xf7, 0x0b, - 0x9a, 0x5e, 0x11, 0x8d, 0x49, 0xc2, 0x05, 0x38, 0x15, 0x7f, 0x08, 0x65, - 0x5a, 0x11, 0xd4, 0x53, 0xab, 0xc3, 0x0b, 0xd7, 0xe4, 0x67, 0x01, 0xd5, - 0xaf, 0x62, 0x4d, 0x30, 0xbc, 0x7a, 0xda, 0x3a, 0x90, 0xb7, 0xbb, 0x90, - 0x1f, 0x85, 0x4b, 0xda, 0xe5, 0x6d, 0xf3, 0xa9, 0xdb, 0x43, 0x51, 0xe3, - 0xa0, 0x1c, 0xa5, 0x44, 0x1c, 0x7d, 0xfa, 0xb4, 0x27, 0x3a, 0x4e, 0x0f, - 0x0a, 0x30, 0xbf, 0x0c, 0xa0, 0x86, 0x5f, 0x77, 0x0f, 0x8d, 0x42, 0xef, - 0x91, 0xaf, 0x01, 0xc6, 0xde, 0x54, 0xa7, 0x2a, 0x19, 0xaf, 0xdb, 0xa1, - 0x10, 0x4c, 0xce, 0x69, 0xd9, 0xcb, 0x2c, 0x56, 0x75, 0x8f, 0x94, 0x21, - 0x6d, 0x97, 0xc2, 0x8e, 0x5b, 0x56, 0x27, 0xe5, 0x5d, 0x7f, 0x6f, 0xda, - 0x64, 0x05, 0xc1, 0x95, 0x59, 0xf8, 0xb2, 0x78, 0x51, 0x19, 0xa9, 0xda, - 0x9a, 0x54, 0xa3, 0xaf, 0x4c, 0x07, 0x02, 0x5d, 0x8b, 0xa1, 0xe7, 0x62, - 0x6d, 0xd2, 0x45, 0xa4, 0xfa, 0xda, 0xa2, 0x73, 0xa8, 0xe3, 0x2d, 0xbb, - 0x7e, 0xcf, 0xb1, 0xe6, 0x5c, 0x13, 0xc5, 0xeb, 0x14, 0x75, 0x3a, 0x28, - 0x4b, 0xd3, 0x39, 0x61, 0xfa, 0xd6, 0x91, 0xc1, 0xc5, 0xab, 0x29, 0xc2, - 0x30, 0x35, 0xc5, 0xcc, 0xf4, 0xe4, 0x7c, 0x63, 0x41, 0xbd, 0x7f, 0x90, - 0x95, 0x2f, 0x68, 0x6a, 0x22, 0x7c, 0xdb, 0x84, 0x97, 0x64, 0x6e, 0x1b, - 0xb4, 0x2b, 0xae, 0x72, 0x4a, 0xb2, 0x55, 0x21, 0x90, 0x7a, 0x52, 0x83, - 0x53, 0xda, 0xbb, 0xb8, 0xd5, 0x4c, 0xb6, 0x78, 0xf8, 0xed, 0xdf, 0x6f, - 0x7a, 0x1d, 0xac, 0x0a, 0x6e, 0x59, 0x76, 0x3c, 0xe8, 0x57, 0x43, 0x39, - 0xfc, 0xc7, 0x26, 0x23, 0x3f, 0x43, 0x9d, 0x7e, 0xb2, 0xe9, 0xeb, 0xb6, - 0x7c, 0x60, 0x0f, 0xcc, 0x11, 0xd1, 0x8e, 0xcf, 0x31, 0x91, 0x7a, 0xbe, - 0x20, 0xdb, 0xe9, 0xa9, 0x56, 0x91, 0x55, 0xd9, 0xe5, 0x89, 0x70, 0x29, - 0x00, 0x44, 0xf4, 0xec, 0xea, 0x2a, 0xad, 0x50, 0x36, 0x46, 0x77, 0x44, - 0xe8, 0x7f, 0xeb, 0xaf, 0x96, 0x81, 0xbd, 0xdd, 0x2e, 0x98, 0x9f, 0xb5, - 0xfe, 0x0f, 0xc4, 0xd2, 0xf1, 0x15, 0x7b, 0xad, 0x9c, 0x89, 0x6c, 0xae, - 0xf7, 0x9a, 0x2f, 0xe6, 0x0a, 0xdc, 0xbf, 0xda, 0xb8, 0x67, 0x89, 0x46, - 0x2f, 0x58, 0x2f, 0x58, 0xd9, 0xc8, 0x00, 0xc9, 0xb5, 0x46, 0xc6, 0x81, - 0x0e, 0xac, 0x5f, 0xfe, 0xd7, 0x45, 0xed, 0xd5, 0xeb, 0xba, 0x51, 0x11, - 0xf4, 0x26, 0x2b, 0x8f, 0xfa, 0xd1, 0x10, 0xe5, 0x00, 0x8a, 0x66, 0x15, - 0x01, 0xeb, 0xc2, 0x92, 0x2c, 0x8c, 0x76, 0x30, 0x94, 0x04, 0xe5, 0x3d, - 0xbe, 0xd1, 0xcb, 0x68, 0x85, 0xb4, 0x11, 0xbc, 0x77, 0xf9, 0x3a, 0x61, - 0x5e, 0x59, 0xc1, 0xda, 0x70, 0x02, 0x33, 0x64, 0x44, 0x83, 0x4b, 0x8e, - 0xbc, 0xcc, 0x57, 0x17, 0xc2, 0xd9, 0xae, 0x18, 0xd1, 0x47, 0xaa, 0xfd, - 0x7f, 0x47, 0xbf, 0x3c, 0xf3, 0xe2, 0xa2, 0x12, 0x8f, 0xd4, 0xbe, 0xbd, - 0x9d, 0xd8, 0x0f, 0x7b, 0x43, 0x5a, 0x1b, 0xbe, 0xd2, 0x06, 0xd5, 0x8b, - 0x46, 0xcc, 0xb0, 0x92, 0x36, 0x7a, 0x9a, 0x3d, 0xd3, 0x11, 0x8a, 0x24, - 0x86, 0x32, 0xa8, 0x67, 0xcd, 0x48, 0xfc, 0x41, 0x7e, 0xe0, 0xd0, 0xe8, - 0x20, 0x60, 0x1e, 0xef, 0xd7, 0xa3, 0x26, 0xc7, 0x35, 0x6c, 0x08, 0x6a, - 0x7f, 0xb1, 0x2b, 0x2d, 0xb9, 0x0d, 0x58, 0x84, 0xbb, 0x6b, 0x70, 0x09, - 0x77, 0x4d, 0x34, 0xf2, 0xd0, 0xa7, 0xea, 0x81, 0xed, 0x53, 0xaa, 0x30, - 0x64, 0x3e, 0x7f, 0x86, 0xbc, 0x79, 0x07, 0x91, 0x3b, 0x23, 0x3e, 0x4b, - 0xee, 0x87, 0x3f, 0x71, 0x82, 0x69, 0x15, 0x3e, 0x0b, 0x4b, 0x24, 0xa9, - 0x9b, 0x52, 0x68, 0xcb, 0xc2, 0x2e, 0xe4, 0xa0, 0x7b, 0xa1, 0x4c, 0x48, - 0xbf, 0xae, 0x5d, 0x25, 0xc9, 0x44, 0xce, 0x4e, 0x63, 0x41, 0xaa, 0xcc, - 0x85, 0x0e, 0xe5, 0x01, 0x1c, 0xf3, 0x2d, 0x49, 0x99, 0x51, 0x1f, 0x89, - 0xdc, 0x97, 0xfb, 0x02, 0xdd, 0x8d, 0x71, 0x58, 0xf4, 0x62, 0x88, 0x2c, - 0x2a, 0x32, 0x28, 0x21, 0x0a, 0x47, 0xd0, 0x91, 0xd6, 0x86, 0x8d, 0x29, - 0x4b, 0xe2, 0x54, 0x02, 0xaa, 0x40, 0xf7, 0x1e, 0xc2, 0xc1, 0x6c, 0xaf, - 0x67, 0x64, 0x18, 0x94, 0x41, 0xe8, 0x4d, 0xe1, 0x50, 0xf4, 0xce, 0xd0, - 0xea, 0xbb, 0x1d, 0xe3, 0x68, 0xbe, 0x2b, 0x82, 0xf8, 0x6d, 0x2e, 0xb9, - 0x81, 0x29, 0xee, 0x15, 0x36, 0x1a, 0xca, 0xda, 0x46, 0xf0, 0xf6, 0x24, - 0x15, 0xde, 0xa8, 0xd9, 0x96, 0x1d, 0x94, 0x12, 0x76, 0x5b, 0x6c, 0xe9, - 0x76, 0xeb, 0xa9, 0xa3, 0xc0, 0x29, 0x43, 0x69, 0xf0, 0x47, 0xf4, 0xc4, - 0xe4, 0x80, 0x94, 0x33, 0x53, 0xe5, 0xff, 0xc0, 0x7b, 0x7d, 0xac, 0x55, - 0x36, 0x0a, 0xfe, 0x3e, 0x5e, 0xa3, 0x40, 0x95, 0x95, 0x57, 0x75, 0x9a, - 0x39, 0xac, 0x0f, 0x9d, 0xd3, 0x29, 0xbe, 0x76, 0xde, 0x2c, 0x28, 0x99, - 0x58, 0x76, 0x2b, 0x31, 0x2e, 0x23, 0x6f, 0x27, 0xab, 0x74, 0xa9, 0x7f, - 0x6d, 0x24, 0x53, 0xc4, 0x2e, 0xa9, 0x4f, 0x23, 0xf1, 0xf6, 0xb2, 0x17, - 0x53, 0xc8, 0x2f, 0x9e, 0x5e, 0x30, 0xd3, 0x1d, 0x74, 0x04, 0x27, 0x7b, - 0x75, 0xcc, 0x10, 0x63, 0x3d, 0x94, 0xc5, 0x66, 0x16, 0x39, 0x25, 0x54, - 0xa3, 0x21, 0xbc, 0x0a, 0x18, 0xae, 0xb7, 0xc6, 0x25, 0x26, 0x80, 0x9c, - 0xf1, 0xed, 0xb0, 0x26, 0xa9, 0x6d, 0x4f, 0x1c, 0x5f, 0x42, 0x29, 0xd0, - 0x63, 0x5e, 0xb9, 0x72, 0x97, 0xbf, 0x13, 0x1f, 0x52, 0x91, 0x37, 0xe4, - 0x64, 0x0f, 0x6b, 0xd5, 0xee, 0xdb, 0xc7, 0x04, 0x94, 0xca, 0xac, 0x1b, - 0x8d, 0x77, 0x22, 0xdc, 0x4a, 0x09, 0xdb, 0x27, 0x50, 0xa2, 0x72, 0xcc, - 0x11, 0x05, 0x5c, 0x1c, 0xa2, 0x9b, 0xd9, 0xc8, 0x64, 0xa7, 0x69, 0xbe, - 0xce, 0xa5, 0xba, 0xb5, 0x39, 0x84, 0x77, 0x79, 0x2d, 0xd4, 0x12, 0xc9, - 0x12, 0xdd, 0x33, 0x89, 0x1e, 0x26, 0xcb, 0x2e, 0xf3, 0x51, 0x66, 0xfa, - 0x62, 0x4e, 0x2f, 0x07, 0xf3, 0x31, 0xa8, 0xc9, 0xfa, 0x22, 0x5e, 0xee, - 0xd1, 0xd0, 0x62, 0x38, 0xe5, 0xa0, 0xcc, 0x83, 0x21, 0x32, 0x9c, 0xff, - 0x68, 0x98, 0x9f, 0x1b, 0xf2, 0xd5, 0x48, 0x7f, 0xca, 0xd4, 0x7c, 0xce, - 0xdb, 0x88, 0x95, 0x19, 0x13, 0x60, 0x1c, 0xc2, 0x02, 0x14, 0x0c, 0xaa, - 0xa9, 0xf4, 0x90, 0xe2, 0x9a, 0xf0, 0x85, 0x9c, 0xc2, 0x5a, 0x6c, 0xe1, - 0x00, 0xd3, 0xc9, 0x64, 0x13, 0x80, 0x3a, 0xb1, 0x65, 0x23, 0x40, 0x54, - 0x76, 0xed, 0x8b, 0xed, 0x5e, 0x0d, 0x09, 0xa8, 0xb4, 0xc1, 0x76, 0x05, - 0x11, 0x09, 0x9e, 0x70, 0x92, 0x5a, 0x21, 0x6f, 0x22, 0x77, 0xeb, 0xd6, - 0xb0, 0xb4, 0x91, 0x8e, 0x67, 0x82, 0xee, 0x6d, 0x4b, 0xdf, 0x9e, 0x3f, - 0x02, 0x4f, 0xf4, 0x1b, 0xbd, 0xe3, 0x63, 0x33, 0x7f, 0x47, 0x8c, 0x89, - 0x4f, 0x46, 0x17, 0x2a, 0xd2, 0x36, 0xb8, 0xce, 0xa3, 0x45, 0xa0, 0x58, - 0xef, 0x32, 0xf7, 0x37, 0x9e, 0x8f, 0xbe, 0xfe, 0x61, 0x81, 0x41, 0x92, - 0x10, 0xad, 0x0a, 0xe6, 0x02, 0x26, 0x87, 0x31, 0x7b, 0x7c, 0xce, 0x6f, - 0x17, 0x6a, 0xe6, 0x18, 0xd1, 0x24, 0x65, 0xe9, 0xf5, 0x4f, 0xdf, 0xe1, - 0x45, 0x26, 0xe0, 0xae, 0xa9, 0xfa, 0xd3, 0xea, 0x92, 0xa0, 0x41, 0x1f, - 0xca, 0xb4, 0x7e, 0x85, 0xe3, 0x04, 0x0f, 0xa0, 0x71, 0x25, 0x43, 0x0a, - 0xc0, 0xab, 0xd2, 0x62, 0x7d, 0xfc, 0x4a, 0x51, 0x00, 0xe2, 0x30, 0xdb, - 0x24, 0x64, 0xbe, 0xcd, 0x21, 0xd9, 0x85, 0x9d, 0xaa, 0x55, 0xfa, 0x1e, - 0x7f, 0xf1, 0x42, 0xc5, 0x50, 0xf4, 0xb5, 0xd1, 0x89, 0x88, 0x07, 0x1d, - 0x3f, 0x3e, 0x4b, 0x43, 0x84, 0x18, 0xc2, 0xe0, 0x19, 0xc4, 0x14, 0x69, - 0x58, 0xb7, 0xce, 0x72, 0x9c, 0x9d, 0x3d, 0x29, 0x7e, 0xc2, 0xac, 0xff, - 0x16, 0x00, 0x08, 0x4f, 0x8a, 0x67, 0xeb, 0x21, 0xb0, 0xac, 0xa7, 0x1f, - 0xd8, 0x1c, 0xce, 0x45, 0x4a, 0x86, 0x5c, 0x50, 0xdc, 0xdc, 0xf7, 0xa7, - 0xb3, 0xb4, 0x08, 0x88, 0x75, 0x83, 0x20, 0xdd, 0xdd, 0x56, 0x3d, 0xd4, - 0xc0, 0x48, 0xe8, 0x4c, 0x9c, 0x56, 0xf4, 0x71, 0x68, 0x48, 0xfe, 0xea, - 0x99, 0x22, 0x98, 0xb4, 0xea, 0x71, 0x47, 0x5e, 0xe6, 0xe7, 0xf3, 0x68, - 0xd8, 0x01, 0x93, 0x1a, 0x03, 0x04, 0xb8, 0x0a, 0x40, 0x72, 0x44, 0x6b, - 0xaa, 0xc6, 0xeb, 0x09, 0x9a, 0xc9, 0xce, 0x86, 0x80, 0x29, 0x36, 0x0a, - 0xe8, 0xf8, 0x27, 0x6e, 0x19, 0x24, 0x3a, 0x2a, 0x09, 0x3d, 0x53, 0x7c, - 0x1b, 0x35, 0x2e, 0x33, 0x76, 0x97, 0x06, 0x10, 0x73, 0x5e, 0x63, 0x85, - 0xe4, 0x37, 0xe8, 0x9d, 0xa5, 0x35, 0xba, 0xc3, 0xfd, 0xb0, 0xbe, 0x6f, - 0xc5, 0x2f, 0x49, 0x88, 0x47, 0x7b, 0xd9, 0x7c, 0x44, 0x03, 0x8c, 0x14, - 0x54, 0xf9, 0xfe, 0x2b, 0x4f, 0x55, 0x0b, 0x84, 0xae, 0x89, 0xa1, 0xdb, - 0x45, 0xb8, 0xd1, 0x3a, 0x87, 0xd9, 0x88, 0xf4, 0x90, 0xae, 0xae, 0x21, - 0x17, 0x09, 0x02, 0x6a, 0x13, 0x3a, 0x39, 0x50, 0x83, 0xae, 0x42, 0x5d, - 0xbf, 0xa8, 0x51, 0xf9, 0xca, 0x7c, 0xcb, 0x12, 0x52, 0x2d, 0x89, 0x03, - 0xc4, 0xae, 0xb1, 0x13, 0xf2, 0x1c, 0x87, 0x45, 0xcb, 0x35, 0x83, 0xc4, - 0x01, 0xeb, 0xa4, 0xac, 0x5d, 0x43, 0x6f, 0x88, 0xdf, 0x07, 0x8e, 0x32, - 0x19, 0x6e, 0x1d, 0xd6, 0x0b, 0xc2, 0xb0, 0xb4, 0x11, 0x3b, 0x7d, 0x2b, - 0xf5, 0x14, 0x23, 0x2b, 0x2e, 0xbf, 0xd1, 0x01, 0x88, 0x9f, 0x55, 0xb0, - 0xae, 0xd7, 0xb9, 0xd9, 0x27, 0x3f, 0x52, 0xc7, 0x34, 0x35, 0x51, 0xea, - 0xa9, 0x8b, 0x14, 0x61, 0x5c, 0x62, 0xfd, 0x4f, 0x37, 0x74, 0x9c, 0x37, - 0x51, 0xb8, 0x95, 0xa5, 0xf6, 0x69, 0xf8, 0x73, 0xa7, 0x58, 0x25, 0xfd, - 0x7f, 0xed, 0xfc, 0x1e, 0x80, 0x24, 0xeb, 0x79, 0x72, 0xd2, 0x77, 0xf2, - 0x4f, 0x7a, 0xf6, 0x11, 0xee, 0x16, 0x69, 0x7e, 0x85, 0xd4, 0x15, 0xf6, - 0xc0, 0xcf, 0x14, 0xb9, 0xb6, 0xf5, 0x90, 0x7d, 0xa0, 0xf7, 0xa5, 0x5b, - 0x48, 0x2a, 0x95, 0x9f, 0x91, 0x41, 0x18, 0xcf, 0x13, 0x58, 0x96, 0x39, - 0x93, 0xc6, 0x48, 0x87, 0x66, 0xfc, 0x99, 0x6e, 0x49, 0x14, 0x46, 0xd7, - 0xf9, 0x2f, 0x76, 0xb9, 0xe0, 0x5e, 0x80, 0xb6, 0xc1, 0xda, 0x6f, 0x7a, - 0xd3, 0x2e, 0x6e, 0x6d, 0xef, 0xea, 0xa2, 0x2e, 0x96, 0xb6, 0x29, 0xe3, - 0x18, 0xdb, 0xe4, 0x7e, 0x5e, 0xc5, 0x30, 0x1d, 0x33, 0x32, 0x27, 0x49, - 0xd0, 0xb4, 0x21, 0xd0, 0x05, 0xe7, 0xaa, 0x17, 0xf6, 0x31, 0xbc, 0x64, - 0x78, 0x3d, 0xdd, 0xbe, 0x18, 0x62, 0x0b, 0xe7, 0x78, 0xfd, 0xf0, 0xbe, - 0xe6, 0x18, 0xe1, 0x8d, 0x5e, 0x5c, 0xc7, 0xc4, 0xc6, 0x50, 0x2d, 0x62, - 0x9a, 0xad, 0xf5, 0x1c, 0x59, 0xce, 0x55, 0x4e, 0x41, 0x64, 0x7b, 0xe7, - 0x3f, 0x1a, 0xf3, 0xff, 0xd5, 0x31, 0x2e, 0x42, 0xf4, 0xcd, 0x21, 0x17, - 0xa8, 0xbd, 0x3d, 0x5c, 0xf3, 0x0d, 0x68, 0x25, 0x23, 0x99, 0xf1, 0x50, - 0xc8, 0x2b, 0x99, 0x9e, 0xe1, 0xa3, 0x8f, 0x99, 0xb6, 0xb0, 0x2c, 0xe4, - 0x95, 0x4a, 0x49, 0x7f, 0x23, 0x82, 0x36, 0xf0, 0xf0, 0x9e, 0x3d, 0x1d, - 0x82, 0xd8, 0x49, 0xc7, 0x78, 0x42, 0x48, 0x21, 0x8e, 0xbf, 0xe5, 0xc7, - 0x94, 0xdd, 0xeb, 0x0c, 0xad, 0x71, 0x5b, 0xc5, 0x18, 0xe3, 0xb0, 0xd0, - 0xe3, 0x8d, 0xe1, 0x67, 0x8a, 0x4c, 0xd5, 0x87, 0x7b, 0xb1, 0x3c, 0xe7, - 0x7e, 0x96, 0xd1, 0x47, 0xdf, 0x34, 0x23, 0x6c, 0x27, 0xa6, 0x80, 0x77, - 0xf5, 0x6f, 0xba, 0x4e, 0xe6, 0xc7, 0xbe, 0xdc, 0xa5, 0x43, 0x5c, 0xc5, - 0xdb, 0x5b, 0x5d, 0xc7, 0x74, 0xfe, 0x10, 0xd2, 0xad, 0xc3, 0x8a, 0x19, - 0x20, 0x12, 0x5d, 0x94, 0x3c, 0xc7, 0x52, 0x90, 0xee, 0x96, 0x80, 0xf0, - 0x53, 0xbe, 0xbe, 0x20, 0xd7, 0xd9, 0xb2, 0x68, 0x15, 0x48, 0xa1, 0xf2, - 0x86, 0x28, 0x0e, 0x0e, 0xdb, 0x7b, 0xd3, 0x32, 0xa0, 0xb6, 0x27, 0x3d, - 0x9b, 0x98, 0xf6, 0x13, 0x9e, 0xf1, 0x11, 0x52, 0x10, 0xd3, 0x17, 0x30, - 0xb0, 0x23, 0xd6, 0xc8, 0x94, 0x02, 0xcb, 0xe8, 0x11, 0x0d, 0x55, 0xad, - 0x53, 0xcd, 0xa5, 0x37, 0xa6, 0x82, 0x29, 0x6a, 0x61, 0xf8, 0xb6, 0x4a, - 0x14, 0x64, 0xe4, 0xa4, 0x99, 0x27, 0x12, 0xe5, 0x91, 0x98, 0x0f, 0x61, - 0x45, 0xb6, 0x71, 0xde, 0xfa, 0x80, 0x9e, 0x6e, 0xe8, 0xe6, 0xb3, 0x87, - 0x15, 0x85, 0xb4, 0x12, 0x6a, 0x64, 0x28, 0x57, 0x23, 0x71, 0xcd, 0xa8, - 0x64, 0x5f, 0x1f, 0x26, 0x16, 0x05, 0xff, 0xde, 0x77, 0x5e, 0xfa, 0x98, - 0x8e, 0x90, 0x48, 0x71, 0xf4, 0x93, 0xd1, 0xc0, 0xe8, 0xed, 0x1a, 0x8a, - 0x37, 0xe5, 0xa5, 0x41, 0x93, 0xa2, 0x3a, 0xbe, 0xc0, 0x48, 0x1b, 0xaf, - 0x41, 0x36, 0x7d, 0x30, 0x10, 0x5e, 0xfd, 0x46, 0x65, 0xa0, 0x45, 0x0c, - 0xa1, 0x2c, 0xe1, 0x18, 0xd8, 0x52, 0x62, 0x68, 0x09, 0x7c, 0xe4, 0x9d, - 0xd2, 0xde, 0x46, 0xd4, 0x98, 0x39, 0x27, 0xb8, 0xc7, 0x84, 0x5f, 0x4d, - 0x7b, 0x13, 0x27, 0x7a, 0xad, 0xd3, 0x3e, 0xd3, 0xff, 0x32, 0x8b, 0xd7, - 0xb1, 0x86, 0x1c, 0x58, 0x91, 0xcf, 0x57, 0xab, 0x73, 0x33, 0x9b, 0xc3, - 0xf6, 0x0b, 0x46, 0xea, 0xca, 0xee, 0xaf, 0x7e, 0x5c, 0x96, 0x2c, 0xe3, - 0x70, 0xe8, 0x61, 0x43, 0x69, 0x0e, 0x39, 0xf8, 0xa8, 0x70, 0xbd, 0x04, - 0x5f, 0xcd, 0x42, 0xe4, 0x94, 0xe7, 0xb2, 0xa3, 0x6b, 0x8c, 0x81, 0x3a, - 0xb7, 0x7d, 0x71, 0xc0, 0xf2, 0x64, 0x22, 0x9b, 0x0c, 0x83, 0x6a, 0x78, - 0x04, 0x9f, 0xb2, 0xbe, 0xa0, 0x54, 0x19, 0x47, 0x28, 0xf3, 0x39, 0x25, - 0xb9, 0x40, 0xbe, 0x54, 0xbe, 0xfb, 0x54, 0x7a, 0x54, 0xe9, 0x73, 0xd0, - 0xf9, 0x43, 0x6f, 0x79, 0xff, 0xf2, 0x58, 0xd8, 0x92, 0xa4, 0x76, 0x89, - 0xe4, 0xd5, 0x0c, 0x65, 0x71, 0x63, 0x60, 0xf7, 0x06, 0x57, 0x91, 0xd2, - 0x5f, 0xe7, 0xa5, 0x7a, 0x2e, 0x2a, 0x47, 0x1b, 0x74, 0xaa, 0xeb, 0x12, - 0xe0, 0x9c, 0xb4, 0xd6, 0xa4, 0xc7, 0x2f, 0xcf, 0x9a, 0xaf, 0x87, 0xf3, - 0xa8, 0xfd, 0x36, 0x02, 0x59, 0x1b, 0xec, 0xfd, 0xe7, 0x3e, 0xc1, 0xba, - 0xc4, 0xaa, 0x27, 0xf7, 0xb0, 0x5c, 0x87, 0x79, 0x99, 0xba, 0x10, 0x0a, - 0x5c, 0xce, 0xb1, 0x27, 0xa8, 0x64, 0xe2, 0xfc, 0xf0, 0x30, 0x5f, 0xfd, - 0x90, 0x07, 0x25, 0x25, 0xcb, 0x41, 0x46, 0x39, 0x99, 0xbb, 0xab, 0x38, - 0x01, 0x45, 0xe3, 0x30, 0x62, 0x39, 0x14, 0x53, 0x0a, 0x01, 0x80, 0x35, - 0x21, 0x8c, 0x3d, 0x46, 0x7c, 0x84, 0x79, 0x5f, 0xcb, 0x78, 0x31, 0xa4, - 0x8e, 0x36, 0x5c, 0x88, 0x51, 0xcd, 0x5c, 0xda, 0x3f, 0xbb, 0x25, 0x66, - 0xae, 0xd9, 0xc5, 0x7c, 0x9d, 0xf0, 0xb8, 0x53, 0x0d, 0x09, 0xdf, 0xc6, - 0x3a, 0xf7, 0xcf, 0x28, 0xad, 0x75, 0xce, 0xca, 0x57, 0xb9, 0x32, 0xbd, - 0x09, 0xbf, 0xe2, 0x7c, 0x1d, 0xf3, 0xec, 0xd8, 0x0e, 0xe0, 0x86, 0x85, - 0x6f, 0xac, 0x09, 0xdd, 0xdc, 0xec, 0x16, 0x85, 0x1c, 0xa9, 0x99, 0xf0, - 0x15, 0xf8, 0x07, 0x5d, 0x78, 0xa0, 0x53, 0xd6, 0x6c, 0xdc, 0x72, 0x57, - 0xe4, 0xb1, 0x41, 0xb3, 0xcc, 0xb1, 0x23, 0x4d, 0x81, 0xf0, 0x24, 0x55, - 0x8e, 0xb0, 0x7b, 0x76, 0x44, 0xc9, 0x6b, 0x37, 0x70, 0xe8, 0xd7, 0x2f, - 0xa4, 0x53, 0x12, 0xec, 0x38, 0x35, 0x8e, 0xc5, 0xee, 0x0a, 0x04, 0x4d, - 0xe6, 0xe3, 0xf6, 0x88, 0xe1, 0x9f, 0x34, 0xba, 0x65, 0xec, 0x0c, 0x61, - 0xae, 0x88, 0x3b, 0xa3, 0x7b, 0x6d, 0x05, 0xfc, 0x9e, 0x32, 0x0b, 0xb0, - 0x86, 0xe0, 0x30, 0x8d, 0xf6, 0x9d, 0x3c, 0xff, 0xe2, 0xc9, 0xa8, 0x33, - 0x4e, 0x4f, 0x72, 0x82, 0x76, 0x2e, 0x00, 0xd1, 0x3e, 0x1f, 0x41, 0x8e, - 0x35, 0x02, 0xc9, 0xd0, 0x3a, 0x8c, 0xe7, 0x4b, 0x0e, 0xd8, 0xac, 0x50, - 0xb0, 0x9b, 0xff, 0x97, 0x53, 0xca, 0x15, 0x55, 0x11, 0xb0, 0xc6, 0x49, - 0x14, 0xc8, 0x6f, 0x24, 0x3e, 0xaa, 0xf8, 0xa8, 0x80, 0x04, 0x51, 0x6f, - 0x74, 0x20, 0x60, 0x70, 0x19, 0x81, 0x32, 0xab, 0xcb, 0x1c, 0x4e, 0x74, - 0xbd, 0x0c, 0x5d, 0xb9, 0x59, 0x3d, 0x28, 0xf3, 0x42, 0x89, 0xd9, 0x52, - 0x2c, 0x0d, 0xda, 0xb2, 0x7e, 0x80, 0xe0, 0xc5, 0x31, 0x25, 0x9a, 0x04, - 0xa0, 0x85, 0x11, 0x56, 0x61, 0x21, 0xc3, 0xd9, 0x2d, 0xd9, 0x40, 0x01, - 0xb9, 0x93, 0x19, 0x7a, 0x1a, 0x35, 0xc7, 0x30, 0x2e, 0x29, 0x64, 0x11, - 0x3f, 0x77, 0xe2, 0x5d, 0xd8, 0x73, 0x53, 0x93, 0xfc, 0x17, 0xb3, 0x64, - 0xf3, 0x9c, 0xca, 0x87, 0xdc, 0x13, 0xbb, 0x1c, 0x20, 0x34, 0x5e, 0xa0, - 0xa1, 0xed, 0x88, 0xba, 0x6c, 0xee, 0x36, 0x50, 0x9c, 0xbe, 0x15, 0x55, - 0x14, 0x4a, 0x27, 0x30, 0xde, 0xdf, 0x25, 0x13, 0xea, 0x7b, 0xe1, 0x28, - 0x6f, 0x29, 0x9b, 0x9a, 0x18, 0x00, 0x63, 0x07, 0x93, 0xef, 0x69, 0xf2, - 0xff, 0x89, 0x73, 0x1e, 0xd1, 0x39, 0x74, 0x2c, 0x68, 0x14, 0xbd, 0x65, - 0x27, 0xbe, 0x69, 0x04, 0x48, 0xda, 0x96, 0x73, 0x9c, 0xb8, 0x9b, 0x9f, - 0x9e, 0x94, 0x4a, 0xc8, 0x35, 0x61, 0x68, 0xa8, 0x99, 0xed, 0xfa, 0xb7, - 0x18, 0xc5, 0xaa, 0x4a, 0x3d, 0xdc, 0xb9, 0x6d, 0xef, 0xb8, 0xe2, 0xdc, - 0xdf, 0x54, 0x25, 0x26, 0xe6, 0x82, 0x00, 0x31, 0xf6, 0x03, 0x13, 0x77, - 0x3b, 0x21, 0x9e, 0x4f, 0x8b, 0x7e, 0xfc, 0x08, 0x6c, 0x32, 0x5e, 0x16, - 0x9c, 0x4d, 0x83, 0x32, 0xb2, 0x90, 0xdc, 0x30, 0x8d, 0x3f, 0xdd, 0x4a, - 0xbc, 0x3b, 0x9e, 0x29, 0x2a, 0xd2, 0x37, 0x63, 0xfe, 0x0e, 0x27, 0x41, - 0x6e, 0xb2, 0x2c, 0x55, 0xfe, 0x89, 0x43, 0xb5, 0x53, 0xc3, 0x9a, 0x0f, - 0xf0, 0x7b, 0x9e, 0xcd, 0xac, 0xf0, 0xb6, 0x0e, 0xc6, 0xd7, 0x22, 0x9e, - 0x13, 0x6b, 0xae, 0xbe, 0x5a, 0xd4, 0xa0, 0xe8, 0xdd, 0x46, 0x69, 0x17, - 0x9b, 0xd8, 0x57, 0x99, 0xf9, 0x81, 0xf7, 0x80, 0x7f, 0xc2, 0xf6, 0x98, - 0x88, 0x9c, 0x7c, 0x3d, 0x86, 0x0e, 0xca, 0xc8, 0x92, 0x03, 0x0d, 0x17, - 0xf9, 0x61, 0xf4, 0x11, 0x2a, 0x6a, 0x04, 0xfb, 0x1c, 0x7e, 0x5a, 0xac, - 0x50, 0x26, 0x1c, 0x21, 0xdd, 0x04, 0xfc, 0xc9, 0x2c, 0x2f, 0xb1, 0xd5, - 0xe2, 0x48, 0x57, 0x16, 0xc7, 0x0f, 0xd7, 0xab, 0x5c, 0x1b, 0x85, 0x61, - 0xc7, 0x52, 0x60, 0x01, 0xd7, 0x9b, 0xfa, 0x9e, 0xb1, 0xbe, 0xac, 0xe4, - 0xbf, 0x8a, 0xa0, 0x71, 0x2b, 0x92, 0xc3, 0xdd, 0xe4, 0xec, 0x28, 0x9c, - 0x37, 0xd0, 0xd9, 0xbc, 0x6b, 0x9e, 0x3c, 0x36, 0xe7, 0x05, 0x53, 0xdd, - 0x4c, 0x8e, 0x27, 0x49, 0x6a, 0x5a, 0x60, 0x3e, 0xa8, 0xf1, 0x3c, 0x04, - 0xe4, 0x2d, 0xd0, 0x10, 0xdb, 0x7f, 0xee, 0x7d, 0x4e, 0x34, 0x83, 0x9a, - 0x4d, 0x4c, 0x8e, 0x34, 0x23, 0x55, 0xd3, 0x48, 0x89, 0x0e, 0xbc, 0x1b, - 0x66, 0xd5, 0x8d, 0x74, 0x54, 0x82, 0x1e, 0xb5, 0x1a, 0x58, 0x4c, 0xa1, - 0x4c, 0x82, 0xe3, 0x75, 0x98, 0x9f, 0xeb, 0xa9, 0xf4, 0xfc, 0xfe, 0x7a, - 0xd8, 0xa0, 0xf2, 0xbe, 0xb7, 0xea, 0xc7, 0x9e, 0x3d, 0x61, 0xec, 0x89, - 0xcf, 0x6a, 0x71, 0x97, 0x2f, 0x16, 0x11, 0xc4, 0x7a, 0x9a, 0xf5, 0xf9, - 0x3c, 0xeb, 0xc3, 0x69, 0x95, 0x31, 0x91, 0x28, 0x06, 0x05, 0xf8, 0xd0, - 0x1f, 0xe8, 0x47, 0xf9, 0x38, 0x33, 0xba, 0xcb, 0xaa, 0xb5, 0x60, 0x47, - 0x25, 0xb5, 0x2e, 0x56, 0xa6, 0x8d, 0x80, 0xb1, 0xb1, 0x33, 0x4e, 0xe2, - 0xfd, 0xe1, 0x0a, 0xc7, 0x6b, 0xf5, 0xf2, 0x33, 0x8a, 0x52, 0x59, 0x45, - 0x86, 0xca, 0x46, 0xd8, 0x69, 0x75, 0x71, 0xf3, 0x4f, 0x8b, 0x87, 0x17, - 0x7f, 0xf2, 0x95, 0x1b, 0xe1, 0x34, 0x0d, 0xfb, 0x7b, 0xfb, 0x7b, 0xa0, - 0xa5, 0x0c, 0x20, 0xe3, 0x78, 0x83, 0x88, 0x23, 0x9c, 0xff, 0x52, 0x94, - 0xed, 0x83, 0x55, 0x54, 0x23, 0xf4, 0x8f, 0x33, 0x38, 0xf0, 0xf5, 0x87, - 0x83, 0xda, 0x1a, 0x05, 0xcb, 0xa2, 0x90, 0x9d, 0x1d, 0x4d, 0xc5, 0xef, - 0x5d, 0x4c, 0x79, 0x84, 0x18, 0x78, 0xf4, 0x36, 0xcb, 0xfc, 0x7e, 0x81, - 0xe1, 0x1b, 0x67, 0x5a, 0x1a, 0x3d, 0x23, 0x33, 0xde, 0x48, 0x17, 0xe1, - 0xaf, 0xee, 0xc6, 0x34, 0x58, 0x27, 0xf4, 0xba, 0xfc, 0xdf, 0x0e, 0x92, - 0xe1, 0x9f, 0x99, 0x56, 0xaf, 0x24, 0x9a, 0x5e, 0x2c, 0x78, 0xd1, 0xed, - 0x05, 0x28, 0xfa, 0x08, 0x59, 0x0e, 0x89, 0x8b, 0x12, 0xac, 0x66, 0x38, - 0x38, 0x89, 0x80, 0x2f, 0x80, 0x13, 0x59, 0xc4, 0x89, 0x49, 0x3f, 0xd8, - 0xa2, 0x44, 0x7b, 0x5c, 0xd9, 0xf1, 0x12, 0x12, 0xd1, 0x2b, 0x1f, 0x0a, - 0x89, 0xea, 0x48, 0x99, 0x80, 0x2e, 0xc9, 0xe1, 0x63, 0xfa, 0xdc, 0xbc, - 0x16, 0x39, 0xbf, 0x62, 0xac, 0xa2, 0xbe, 0x9f, 0xb4, 0x20, 0x1d, 0xfe, - 0x6e, 0x9b, 0x4f, 0x12, 0x93, 0xb4, 0x8a, 0xd8, 0x8c, 0xa7, 0xdf, 0x0d, - 0x91, 0x72, 0x6d, 0xa6, 0x14, 0x5e, 0xf1, 0x1d, 0x56, 0x21, 0x16, 0xf8, - 0x43, 0x75, 0x7c, 0x35, 0xc0, 0xb5, 0x95, 0x41, 0x51, 0x58, 0x61, 0x49, - 0xf6, 0xa7, 0xcf, 0x08, 0xf2, 0x5e, 0x0d, 0x2e, 0x9f, 0xd8, 0xef, 0xb5, - 0x7b, 0xeb, 0xd9, 0x3c, 0xad, 0xab, 0x77, 0x18, 0x48, 0x72, 0x51, 0x1f, - 0x54, 0x27, 0x31, 0x1f, 0xc3, 0xea, 0x0e, 0x56, 0x6b, 0xeb, 0x6a, 0xbb, - 0x70, 0xdb, 0x1e, 0x36, 0x51, 0x61, 0x69, 0xce, 0x06, 0xfc, 0x7b, 0x2a, - 0xfa, 0x22, 0x90, 0x50, 0xeb, 0xfa, 0x57, 0xa8, 0x26, 0x72, 0x4c, 0xe6, - 0xea, 0x45, 0x38, 0x3d, 0xd1, 0xec, 0x52, 0xdb, 0x5a, 0x5e, 0x2d, 0x94, - 0xe6, 0xe0, 0x34, 0xfb, 0xe7, 0xa9, 0x1d, 0x03, 0xc2, 0x7b, 0x80, 0x92, - 0x4c, 0x79, 0x81, 0x68, 0x0b, 0xb3, 0xff, 0x47, 0x13, 0x67, 0x08, 0x64, - 0xc6, 0xa2, 0x68, 0x09, 0xc0, 0xa8, 0x2c, 0xed, 0xe8, 0x7b, 0x05, 0xf0, - 0xd3, 0x43, 0xb3, 0xb0, 0xea, 0xe1, 0x66, 0x85, 0x6d, 0x92, 0x65, 0x85, - 0xb6, 0x9e, 0xf2, 0x00, 0x0a, 0x8d, 0xd8, 0x31, 0x93, 0xd9, 0xdf, 0x62, - 0xbd, 0x3b, 0x2d, 0x76, 0x80, 0xf2, 0x78, 0x62, 0xeb, 0x2e, 0xa5, 0x8c, - 0x63, 0x4f, 0x45, 0x98, 0x53, 0xab, 0x51, 0x0c, 0x8d, 0xe2, 0x2a, 0x1a, - 0x6f, 0xd9, 0x7b, 0xc9, 0x49, 0x0d, 0x9b, 0x9e, 0x49, 0x49, 0xa6, 0xa6, - 0xd1, 0x83, 0x2f, 0xb8, 0x01, 0xa5, 0x6f, 0x0c, 0x6e, 0xb7, 0x70, 0x5c, - 0x2c, 0x01, 0x0d, 0xdf, 0x4d, 0x80, 0x09, 0x19, 0x4e, 0x6b, 0x18, 0xd7, - 0x13, 0x1d, 0x7c, 0xe3, 0x0c, 0x76, 0x71, 0xe3, 0xe0, 0xe4, 0x60, 0xcc, - 0x32, 0xec, 0xfc, 0xae, 0xe7, 0xde, 0x21, 0x97, 0x71, 0xc4, 0x9d, 0xda, - 0x2c, 0x93, 0x53, 0x91, 0xf9, 0xe4, 0x2b, 0x3a, 0xc5, 0xfd, 0x54, 0x91, - 0xbf, 0x36, 0x2b, 0x5d, 0xe8, 0xe2, 0xc2, 0xfc, 0x3e, 0x3f, 0x87, 0xc7, - 0x0f, 0x9f, 0xad, 0xd3, 0xff, 0xe6, 0x0e, 0xa2, 0xa7, 0x1b, 0xa5, 0x82, - 0x2b, 0x8a, 0x72, 0x04, 0x51, 0x66, 0x75, 0xdd, 0x70, 0xb9, 0xa6, 0x69, - 0xa8, 0xa8, 0x81, 0xf5, 0x05, 0x72, 0x62, 0x55, 0x67, 0x94, 0x97, 0x9f, - 0x14, 0xf4, 0xa6, 0x6b, 0xb6, 0xfd, 0x9f, 0x5f, 0xf5, 0x32, 0x22, 0x4a, - 0xb5, 0xa6, 0x71, 0xb7, 0x9b, 0xa7, 0x7e, 0xf9, 0x65, 0x8b, 0x66, 0x24, - 0xc0, 0xab, 0x25, 0x13, 0xf9, 0x70, 0xb7, 0xbe, 0x85, 0x0f, 0x93, 0xcf, - 0x83, 0x13, 0xf2, 0x38, 0x79, 0xa2, 0x95, 0x85, 0x9b, 0xb8, 0x4f, 0xc0, - 0x20, 0xce, 0xa3, 0x59, 0x8a, 0xcb, 0xed, 0xd4, 0x41, 0xd6, 0xf8, 0xa0, - 0x8b, 0x0f, 0xcf, 0x5a, 0x89, 0x4b, 0x0c, 0xfc, 0xb2, 0x97, 0x11, 0x46, - 0xf8, 0x2a, 0x34, 0xf8, 0xcd, 0x9a, 0xd1, 0x32, 0x85, 0x4a, 0xfd, 0x7d, - 0x2a, 0x27, 0x66, 0x80, 0x6e, 0x1f, 0xce, 0x8f, 0x63, 0x30, 0xa9, 0x8a, - 0x2d, 0xf0, 0xa6, 0x3d, 0x6c, 0x0f, 0x45, 0x05, 0x02, 0x41, 0x43, 0xf2, - 0x58, 0x85, 0xc8, 0xa4, 0xe1, 0x38, 0x7a, 0x1b, 0x2b, 0x60, 0xf4, 0x6e, - 0xf9, 0x6c, 0x8b, 0x62, 0x4f, 0xb5, 0x49, 0x29, 0x15, 0x5d, 0xd1, 0x6b, - 0x62, 0xbc, 0xa2, 0xab, 0xbc, 0xdf, 0x68, 0x5e, 0xc2, 0xc6, 0xbe, 0x87, - 0xd0, 0x9e, 0x93, 0x37, 0xac, 0x32, 0xf4, 0x18, 0x28, 0x0d, 0xc5, 0x75, - 0x0b, 0x54, 0x50, 0x19, 0x68, 0xc0, 0xd7, 0xca, 0xba, 0x0f, 0x2b, 0xf0, - 0x91, 0x81, 0x7e, 0x38, 0xf1, 0xa6, 0x1c, 0x32, 0x9d, 0xcf, 0xc3, 0xa2, - 0xd0, 0xd8, 0x8f, 0x8a, 0xd5, 0x0e, 0xe0, 0xf4, 0xb9, 0x21, 0x46, 0x8c, - 0x24, 0xb9, 0x53, 0x8a, 0x7b, 0x44, 0xbb, 0x71, 0xb0, 0xc4, 0x3f, 0xcd, - 0x10, 0x6e, 0xd3, 0x78, 0x78, 0x0e, 0x16, 0x55, 0x63, 0x60, 0xea, 0xd2, - 0x5b, 0x37, 0x97, 0x00, 0xef, 0x14, 0xdb, 0xe3, 0xb1, 0xb9, 0x5f, 0xaf, - 0x50, 0x68, 0x71, 0x44, 0xf4, 0xa2, 0x31, 0xb1, 0xff, 0xc5, 0x1a, 0xc0, - 0xbb, 0x3a, 0x8e, 0xd5, 0x31, 0x98, 0x0f, 0xee, 0x3c, 0xaf, 0x9e, 0x06, - 0x45, 0xf8, 0x4e, 0xce, 0x03, 0x48, 0xed, 0xd5, 0x96, 0x00, 0x0a, 0x33, - 0x15, 0xf0, 0x6f, 0x62, 0x8f, 0x80, 0x15, 0x4b, 0xf5, 0x7b, 0xb8, 0xc6, - 0x89, 0x0f, 0x89, 0x60, 0x9e, 0x29, 0x2e, 0xb0, 0xd6, 0x62, 0x68, 0x4f, - 0x70, 0xb5, 0xaf, 0x03, 0x5b, 0x98, 0x54, 0x60, 0x72, 0x87, 0xec, 0xbd, - 0x7e, 0x4d, 0xb8, 0x11, 0x29, 0xc6, 0x19, 0xca, 0x08, 0x0c, 0xe2, 0x0c, - 0x09, 0xf9, 0x41, 0xa3, 0x99, 0x12, 0x5a, 0x2d, 0x81, 0xc3, 0xc2, 0x32, - 0x73, 0x63, 0x4a, 0x84, 0x72, 0x78, 0x90, 0xd2, 0x74, 0xac, 0x00, 0xbd, - 0xcd, 0x8a, 0xb0, 0xb4, 0xbf, 0x97, 0x76, 0x54, 0x4c, 0xe9, 0x6c, 0x16, - 0xed, 0x25, 0xf7, 0x6c, 0x8b, 0xad, 0xad, 0xa0, 0x13, 0xa7, 0xe5, 0x3a, - 0x97, 0xe3, 0xa3, 0x23, 0x4a, 0x02, 0x99, 0xb1, 0xb3, 0x2e, 0x7b, 0xf8, - 0xea, 0x25, 0xd6, 0x0c, 0xf1, 0xae, 0x9d, 0x25, 0x01, 0xc7, 0x26, 0x69, - 0x44, 0x69, 0x6b, 0x75, 0x3d, 0xaf, 0xc1, 0x00, 0x57, 0x3a, 0x78, 0x25, - 0xa1, 0x9d, 0x8c, 0xdc, 0x98, 0x85, 0xce, 0xbc, 0x7b, 0x1e, 0x7c, 0xa0, - 0x6e, 0x92, 0xdc, 0x29, 0xf6, 0x01, 0xda, 0x85, 0x7d, 0xb4, 0x62, 0x60, - 0xd3, 0x0e, 0xd2, 0x48, 0xc4, 0x8f, 0x28, 0xd6, 0xd4, 0x14, 0xa3, 0x31, - 0x8f, 0x32, 0x01, 0xbe, 0xe8, 0x8a, 0x86, 0x3a, 0x7c, 0x70, 0x92, 0x20, - 0x96, 0x58, 0x85, 0xb1, 0xf2, 0xb6, 0xb3, 0x39, 0x68, 0x94, 0x4f, 0x92, - 0x34, 0x7a, 0xb4, 0x35, 0x81, 0xb7, 0x35, 0x44, 0x19, 0x4e, 0x8d, 0xce, - 0xc5, 0x44, 0x01, 0x52, 0x5d, 0x1f, 0x83, 0x81, 0xd8, 0x7f, 0x59, 0x4f, - 0x97, 0xf7, 0x79, 0x2a, 0x9d, 0xf5, 0xab, 0xc1, 0xc2, 0xb3, 0xf7, 0xc5, - 0x84, 0xe9, 0x19, 0x11, 0x71, 0xcb, 0xaf, 0xfd, 0x28, 0xf1, 0x78, 0xc9, - 0x8e, 0x5c, 0x97, 0x83, 0x40, 0x17, 0x16, 0x36, 0x4d, 0x1a, 0xfd, 0x9d, - 0x84, 0x3d, 0xaf, 0x07, 0x98, 0x79, 0x74, 0xce, 0xf2, 0x43, 0xf9, 0x46, - 0xa3, 0x1a, 0xb0, 0xa1, 0x2b, 0x8e, 0x36, 0xcb, 0x89, 0x93, 0x09, 0xde, - 0xa0, 0x1e, 0x96, 0xcc, 0x05, 0x88, 0x5d, 0x1e, 0x6e, 0x23, 0xa6, 0xe4, - 0x73, 0x66, 0x9a, 0xb8, 0x9a, 0xa6, 0x16, 0xa3, 0xbc, 0x0b, 0x1e, 0x5b, - 0xfe, 0x68, 0x50, 0x04, 0x9c, 0xf2, 0x9c, 0x74, 0x00, 0xf5, 0x5b, 0x8c, - 0xb4, 0xb2, 0x50, 0xdd, 0xab, 0xd1, 0xb7, 0x56, 0xa5, 0x09, 0x95, 0x55, - 0x63, 0x30, 0x64, 0x9e, 0xb6, 0x22, 0x7f, 0x68, 0x55, 0x14, 0xba, 0x11, - 0x45, 0xb3, 0x20, 0x6c, 0xda, 0xf3, 0x2b, 0xe8, 0x31, 0xf2, 0x7d, 0x8b, - 0xb3, 0xc6, 0x34, 0x80, 0xdc, 0xe1, 0xe1, 0x6d, 0xd6, 0xd7, 0x77, 0xf8, - 0xe0, 0xa0, 0x62, 0x5f, 0x37, 0xcd, 0xe8, 0x3f, 0xaa, 0x09, 0x6b, 0x32, - 0xac, 0x53, 0x89, 0xb6, 0x22, 0xba, 0xb6, 0x26, 0x1c, 0x0d, 0xd5, 0x52, - 0xec, 0x61, 0x49, 0xe6, 0x8b, 0x49, 0x47, 0x34, 0x32, 0x82, 0x36, 0x9b, - 0x65, 0x5c, 0x94, 0xdb, 0x56, 0x7b, 0x26, 0x4e, 0xe1, 0x6d, 0xd3, 0xe2, - 0xb0, 0x10, 0x67, 0xa6, 0x17, 0xe9, 0x0c, 0xca, 0x45, 0xeb, 0x04, 0x61, - 0x71, 0x4f, 0x94, 0xed, 0xab, 0x3b, 0xe8, 0xa8, 0x72, 0xbf, 0x93, 0x65, - 0x10, 0x89, 0xdb, 0x7e, 0x68, 0xc0, 0x10, 0x6c, 0xfe, 0xcf, 0x12, 0xc5, - 0x3a, 0x38, 0xc2, 0x2b, 0xd3, 0x92, 0x0b, 0xdb, 0xbd, 0x60, 0x92, 0x2d, - 0xe2, 0x45, 0x0d, 0xec, 0x45, 0x16, 0x43, 0x2f, 0xfa, 0x8b, 0x39, 0xc8, - 0x48, 0xad, 0x4b, 0x43, 0xf3, 0x67, 0x0f, 0x99, 0x52, 0xe4, 0x58, 0x6c, - 0x3c, 0xac, 0xa3, 0x93, 0xa2, 0xf8, 0x2e, 0x83, 0xc6, 0x97, 0x4e, 0xad, - 0xbe, 0x9d, 0x95, 0x26, 0xf1, 0x42, 0x50, 0x25, 0xcd, 0xfe, 0x5c, 0x9a, - 0xa7, 0x8b, 0x0a, 0xad, 0xde, 0x6f, 0x15, 0x0f, 0x6a, 0x1e, 0x33, 0xd4, - 0xc9, 0x2b, 0x5a, 0x6e, 0xe7, 0xe4, 0x24, 0x80, 0x76, 0x2e, 0xe3, 0xa1, - 0x3a, 0x71, 0x6c, 0x7f, 0x76, 0x4d, 0x66, 0x6f, 0xd9, 0xc4, 0xb2, 0x5e, - 0x8c, 0x3d, 0x89, 0xe7, 0xc3, 0x99, 0xbb, 0x56, 0x1e, 0x2a, 0xfc, 0xf4, - 0x0a, 0xd9, 0x37, 0x4e, 0x10, 0xc8, 0x31, 0x10, 0x34, 0x2d, 0x55, 0xde, - 0xeb, 0xd7, 0x5d, 0x73, 0xb5, 0x49, 0x78, 0x11, 0xa5, 0x6e, 0x4c, 0xfe, - 0xf8, 0x57, 0x57, 0xdd, 0x9e, 0x03, 0x9f, 0xe9, 0x27, 0xdf, 0xe2, 0x0d, - 0x80, 0x4b, 0x6e, 0xb4, 0xc0, 0xf2, 0xf5, 0x62, 0xd9, 0xe3, 0xe2, 0xe2, - 0x7d, 0x89, 0x99, 0xed, 0x23, 0xa6, 0x5f, 0x2a, 0x82, 0x39, 0x39, 0x59, - 0xc7, 0x4a, 0x09, 0x39, 0x77, 0x1b, 0x47, 0x90, 0x16, 0x68, 0xbf, 0x9d, - 0x33, 0x40, 0x82, 0xdb, 0x83, 0xff, 0xca, 0x1c, 0xcf, 0xab, 0x36, 0xab, - 0x75, 0xa8, 0xaa, 0xa7, 0xab, 0x78, 0xe8, 0x6a, 0xff, 0x2e, 0xa5, 0x95, - 0x6c, 0x8e, 0xa9, 0x5e, 0x60, 0x50, 0xad, 0xe7, 0x6a, 0x81, 0xdc, 0xf0, - 0xef, 0xe2, 0x5e, 0x22, 0x47, 0xb1, 0x6d, 0x49, 0xa3, 0x5a, 0x81, 0x06, - 0x76, 0xa1, 0xb5, 0x8e, 0xa0, 0x0f, 0x27, 0x7a, 0x5f, 0x35, 0x99, 0x18, - 0x7a, 0xbb, 0x7e, 0x26, 0x64, 0xc7, 0xd1, 0x2b, 0x93, 0x4f, 0x45, 0x74, - 0x34, 0x22, 0xd7, 0x46, 0x0a, 0x33, 0x5b, 0xbf, 0x9c, 0xd4, 0x34, 0xc5, - 0xaf, 0xdb, 0x40, 0xec, 0x96, 0x40, 0x04, 0xd3, 0x9c, 0x3c, 0x67, 0x35, - 0xd8, 0x85, 0x97, 0xcc, 0x3b, 0xaf, 0x27, 0x7d, 0x0f, 0xa5, 0x5c, 0xd2, - 0xb5, 0x67, 0x8f, 0x80, 0x5e, 0x25, 0xa2, 0x44, 0x0e, 0xd2, 0xe2, 0x26, - 0xd0, 0xf4, 0xaa, 0x43, 0xe9, 0xcd, 0x01, 0x95, 0x5e, 0x81, 0xab, 0x8d, - 0x5c, 0x0f, 0xbe, 0x2a, 0xac, 0x08, 0xb3, 0xf0, 0xf4, 0x43, 0x1a, 0x34, - 0xe0, 0x20, 0x17, 0x7b, 0xbb, 0x1d, 0x69, 0x30, 0x01, 0x69, 0x50, 0x18, - 0xdf, 0x17, 0xbd, 0x7f, 0xb4, 0x12, 0x6d, 0xd5, 0x70, 0xb0, 0xa1, 0x85, - 0xd2, 0x53, 0xda, 0xd0, 0x56, 0x13, 0xc0, 0x21, 0xac, 0x66, 0xe2, 0x4a, - 0xd0, 0x80, 0xc5, 0x6a, 0x3b, 0x43, 0x40, 0xe5, 0xd9, 0x8d, 0xf2, 0xe5, - 0x74, 0xc0, 0xb8, 0x27, 0x8f, 0xb7, 0xa7, 0x1d, 0x30, 0x9a, 0xaa, 0x17, - 0xca, 0xd6, 0xb4, 0xea, 0x58, 0x40, 0x0a, 0xb0, 0xd8, 0xb1, 0x36, 0xd1, - 0x70, 0x65, 0xd0, 0x2f, 0x8e, 0x40, 0xa9, 0x68, 0x3a, 0xb9, 0xe1, 0x71, - 0x91, 0x14, 0xf3, 0x80, 0x91, 0xd8, 0x08, 0xf9, 0xd7, 0xdc, 0xac, 0x69, - 0xff, 0x14, 0x2d, 0xe6, 0x6b, 0x23, 0xce, 0xb8, 0x82, 0x31, 0x70, 0x67, - 0x3e, 0x0f, 0xdd, 0x34, 0xf1, 0xb1, 0xff, 0x6b, 0x3e, 0x23, 0x3e, 0x47, - 0xcb, 0x6f, 0x52, 0x27, 0x97, 0x74, 0x53, 0x34, 0x5b, 0x9d, 0xf7, 0x9f, - 0xbb, 0x26, 0x1a, 0x2f, 0x83, 0x13, 0xe1, 0x76, 0x74, 0x50, 0x0b, 0x62, - 0x04, 0x80, 0x13, 0xda, 0x2b, 0xfd, 0x50, 0x9e, 0x66, 0xe3, 0x61, 0x2b, - 0x42, 0x07, 0xcc, 0xa3, 0x0c, 0x37, 0x13, 0xa6, 0x5c, 0x8f, 0xf4, 0x39, - 0x1a, 0xa0, 0xca, 0x2e, 0xdb, 0xff, 0x2d, 0x06, 0x39, 0x78, 0x1b, 0xd0, - 0x36, 0xb4, 0x6b, 0xa1, 0x10, 0xce, 0x15, 0x8a, 0x82, 0x1b, 0x2b, 0xd7, - 0x59, 0x98, 0x96, 0xff, 0x72, 0xa7, 0x3d, 0x4c, 0xd1, 0x52, 0x5c, 0x27, - 0x3f, 0xfd, 0x73, 0xd5, 0xbc, 0x7c, 0xd9, 0x50, 0xa5, 0xb0, 0xe6, 0xd0, - 0xa7, 0x21, 0xbd, 0x35, 0x96, 0x08, 0xd8, 0xe7, 0xac, 0xad, 0xc0, 0x61, - 0xad, 0x95, 0xb8, 0x31, 0x0d, 0xea, 0x6c, 0x70, 0xd5, 0x1f, 0x3d, 0x2e, - 0xd0, 0xc0, 0xc3, 0x3d, 0xe9, 0x0e, 0xc7, 0x6d, 0x51, 0x50, 0xff, 0x12, - 0xe5, 0x51, 0x78, 0xbe, 0x89, 0x1d, 0xcb, 0xa0, 0x25, 0x13, 0x63, 0x19, - 0x89, 0xe6, 0x3d, 0xbc, 0xf3, 0x89, 0x34, 0x2d, 0xfd, 0xdd, 0x4f, 0xb5, - 0x4f, 0x4f, 0x02, 0x4f, 0xa8, 0x8e, 0x99, 0x07, 0xf8, 0xac, 0xd8, 0x28, - 0xea, 0x60, 0x00, 0xd3, 0x01, 0xfd, 0x21, 0x03, 0xb7, 0x2c, 0x80, 0xc5, - 0x35, 0xbf, 0x35, 0x31, 0xe3, 0xcb, 0x3c, 0x0a, 0x63, 0xc8, 0xaf, 0x88, - 0x20, 0xfd, 0x24, 0x13, 0x9c, 0x76, 0x46, 0x97, 0x4c, 0x0f, 0x06, 0x7b, - 0x87, 0x87, 0xf0, 0x15, 0x81, 0x15, 0x06, 0x7d, 0xbe, 0x2a, 0x5f, 0x6e, - 0xd4, 0xc7, 0x24, 0x9e, 0xb0, 0xe8, 0xb9, 0xbb, 0x56, 0x0e, 0xc2, 0x88, - 0x60, 0x58, 0xb3, 0x86, 0x45, 0xe1, 0xb8, 0x7e, 0xe3, 0x94, 0x8f, 0xcc, - 0x5a, 0xef, 0x93, 0x1b, 0xc5, 0x22, 0xae, 0xc2, 0xc0, 0x9e, 0xc3, 0x17, - 0x64, 0x31, 0x48, 0x2b, 0x7e, 0xa2, 0xf7, 0xab, 0x3c, 0x41, 0x99, 0x43, - 0x71, 0xc7, 0x61, 0x1f, 0x65, 0x18, 0x86, 0x8b, 0xf0, 0xd1, 0x23, 0x8b, - 0x98, 0x6e, 0x53, 0xd7, 0x65, 0x48, 0x34, 0x2f, 0xdd, 0xe0, 0x56, 0x2f, - 0xc3, 0x6a, 0x76, 0xc8, 0xae, 0x9d, 0x94, 0xb2, 0x8b, 0x2d, 0x61, 0x22, - 0x90, 0x7e, 0x22, 0xba, 0x3c, 0x31, 0x23, 0x40, 0x11, 0xa6, 0x9c, 0xaa, - 0xdb, 0x0a, 0xcd, 0x25, 0xb7, 0xd3, 0x57, 0x6f, 0xaf, 0x15, 0xcf, 0x87, - 0x99, 0xa3, 0xd5, 0x8d, 0xe4, 0x35, 0x01, 0x7b, 0x7a, 0xdd, 0x8d, 0x4a, - 0xbc, 0x1f, 0xa6, 0xb7, 0x77, 0xa5, 0x85, 0x9d, 0x3a, 0x15, 0x99, 0x01, - 0x4a, 0x3a, 0x5f, 0xeb, 0x37, 0x90, 0x31, 0x53, 0x8f, 0x26, 0xaf, 0xe6, - 0xf7, 0x7e, 0x5a, 0x5e, 0xa7, 0x52, 0x56, 0xbd, 0x8b, 0xc8, 0x8f, 0xb8, - 0xad, 0x5a, 0x2d, 0x93, 0xf0, 0x3b, 0x71, 0xef, 0x3b, 0x0d, 0x4b, 0xf8, - 0xb0, 0x66, 0xdf, 0xa2, 0x28, 0x86, 0xdb, 0x74, 0x67, 0xe8, 0xa5, 0xaf, - 0x46, 0x77, 0xc6, 0x0e, 0xb3, 0xd7, 0xb7, 0x73, 0x06, 0x03, 0x6d, 0x4c, - 0x42, 0x0a, 0xbe, 0x2b, 0xea, 0xcd, 0x56, 0x28, 0x76, 0xcc, 0xa8, 0xfb, - 0xcc, 0x4d, 0x26, 0xb1, 0x0a, 0xec, 0x75, 0x33, 0x25, 0x0d, 0xc8, 0xb0, - 0x2d, 0x29, 0xed, 0x3c, 0x3a, 0x02, 0x72, 0x2f, 0x07, 0x99, 0x00, 0x3f, - 0xb5, 0xd5, 0x45, 0x40, 0x04, 0x81, 0xa6, 0x05, 0x1c, 0x25, 0xda, 0x27, - 0x9c, 0xec, 0x65, 0x96, 0xc1, 0xd9, 0x42, 0xe0, 0xda, 0xe5, 0xff, 0xc2, - 0x9c, 0xc7, 0x89, 0xcc, 0xeb, 0xed, 0xf4, 0xe3, 0xb4, 0x7d, 0xf3, 0x57, - 0xe0, 0xfd, 0xc4, 0x37, 0x76, 0x5c, 0xdd, 0xb4, 0x00, 0xa6, 0x7a, 0x5b, - 0x76, 0xd1, 0xea, 0xc8, 0xf8, 0x6a, 0x07, 0x6e, 0x73, 0xe5, 0xde, 0xd9, - 0x7a, 0x33, 0x74, 0xd1, 0x0b, 0x33, 0x08, 0xdf, 0x42, 0x30, 0xc2, 0x0e, - 0x03, 0xf3, 0x33, 0xda, 0xc9, 0xdf, 0xbe, 0x25, 0xbd, 0x23, 0xc3, 0xe6, - 0xf9, 0x1e, 0x22, 0x9c, 0xce, 0x7a, 0x79, 0xc8, 0x3c, 0x4b, 0xdb, 0x0d, - 0xa5, 0x28, 0xad, 0xad, 0xe9, 0xbf, 0x3a, 0x93, 0x6e, 0x80, 0x55, 0x46, - 0x72, 0x01, 0x30, 0x9b, 0x70, 0x3d, 0xa8, 0xf7, 0x02, 0xf8, 0x14, 0xf9, - 0x53, 0x79, 0x38, 0x32, 0xe0, 0x82, 0xac, 0xcf, 0xbd, 0x19, 0x6b, 0xa8, - 0x0a, 0x8a, 0x10, 0x3c, 0x3a, 0xfb, 0x89, 0x3e, 0x51, 0x0d, 0x11, 0xd8, - 0x8f, 0x00, 0x31, 0x9c, 0xbd, 0xe3, 0xa7, 0x42, 0x2d, 0x1e, 0x10, 0xbe, - 0xd3, 0x2a, 0x99, 0x1e, 0x7a, 0xae, 0xe3, 0x3a, 0x05, 0xb3, 0x25, 0xec, - 0xf8, 0x34, 0x51, 0xed, 0x07, 0x83, 0x81, 0xb0, 0xbb, 0x3e, 0xae, 0xc3, - 0xfa, 0x35, 0x18, 0x30, 0x66, 0x29, 0xb1, 0x3e, 0x63, 0x66, 0xce, 0x2d, - 0x08, 0xda, 0xb2, 0x3a, 0x78, 0x32, 0xf4, 0xf4, 0x1b, 0x7a, 0xb0, 0x22, - 0x70, 0x62, 0xb9, 0xa8, 0xad, 0x59, 0x5e, 0x6e, 0x04, 0x2b, 0xb0, 0x18, - 0x54, 0xbf, 0x04, 0x40, 0xc6, 0xff, 0x83, 0xbc, 0x3c, 0xd2, 0x3d, 0x57, - 0xf6, 0xb7, 0x73, 0x1e, 0xbb, 0x18, 0xff, 0x9b, 0xb2, 0x75, 0x3a, 0xc1, - 0x04, 0x45, 0xfe, 0xa2, 0xe1, 0x70, 0x18, 0x9f, 0xbb, 0xdf, 0x89, 0x0e, - 0x29, 0x10, 0x60, 0x9f, 0x8a, 0xa1, 0x20, 0x32, 0xf6, 0xb1, 0x92, 0x94, - 0xec, 0x1a, 0xf5, 0x03, 0xf6, 0x55, 0xb0, 0x5a, 0x8d, 0x5c, 0x62, 0xe0, - 0xca, 0x25, 0x51, 0x7a, 0xed, 0x2f, 0xac, 0x88, 0x3b, 0x9a, 0xe5, 0x0b, - 0xed, 0x7a, 0x55, 0x64, 0x1e, 0x27, 0xf9, 0x93, 0xd0, 0xaa, 0xbc, 0x60, - 0x30, 0xe5, 0x67, 0x67, 0xdc, 0xfd, 0xea, 0xbe, 0x6c, 0x9f, 0x63, 0x78, - 0xc7, 0xe0, 0xf4, 0x94, 0x68, 0x61, 0x0d, 0x9e, 0xcb, 0x36, 0xad, 0x9b, - 0x4a, 0xdd, 0x80, 0xfa, 0x82, 0x9a, 0x48, 0xa1, 0x04, 0x51, 0x84, 0x3e, - 0xa8, 0x14, 0xb3, 0x6d, 0x3c, 0x8a, 0x09, 0xd2, 0xa3, 0x1e, 0xe7, 0xd0, - 0xc6, 0x08, 0x06, 0x81, 0xb6, 0x5b, 0x67, 0x96, 0x35, 0xb5, 0x1e, 0x19, - 0xd5, 0x70, 0x53, 0xb7, 0xe9, 0x2e, 0x40, 0xfe, 0x82, 0x84, 0xb6, 0xdc, - 0x03, 0xc5, 0x08, 0x1e, 0xc7, 0x9c, 0xa9, 0x77, 0xb3, 0x29, 0x77, 0x36, - 0x2d, 0xbe, 0x80, 0x74, 0x22, 0x7a, 0x0b, 0xe4, 0xc1, 0xfd, 0xde, 0xa5, - 0x61, 0x27, 0x25, 0xed, 0x73, 0x9c, 0x64, 0xf7, 0x52, 0x3f, 0xd6, 0x38, - 0xc6, 0xb9, 0x6f, 0xd3, 0xcb, 0xf1, 0x54, 0xf3, 0x01, 0x3b, 0xca, 0xa3, - 0x1f, 0x57, 0x01, 0x8a, 0x2c, 0xa4, 0xd6, 0x85, 0xff, 0x76, 0x51, 0x32, - 0xa5, 0x21, 0x2e, 0x7f, 0xd5, 0x17, 0x8d, 0x25, 0x07, 0x0f, 0x23, 0x7d, - 0x48, 0xa4, 0xba, 0x41, 0xa1, 0x18, 0xea, 0x9d, 0xb4, 0xa3, 0xa6, 0x69, - 0xda, 0x45, 0x84, 0xe4, 0xe4, 0x7a, 0x07, 0x91, 0x98, 0x30, 0x5b, 0x11, - 0x5b, 0x86, 0x71, 0xdb, 0x97, 0x09, 0xbf, 0x58, 0x57, 0x40, 0xd8, 0xd9, - 0xc9, 0x0a, 0x96, 0xbf, 0x7c, 0xaf, 0xf2, 0xc8, 0x80, 0x87, 0xcc, 0xbb, - 0x4c, 0x26, 0xdb, 0x4f, 0xfc, 0xaf, 0x6c, 0xc2, 0xed, 0x5a, 0x80, 0xa4, - 0xd3, 0x7d, 0x1c, 0x23, 0x9e, 0x54, 0xb9, 0xa7, 0x06, 0xc7, 0x73, 0x9b, - 0x22, 0x78, 0xb7, 0x1f, 0xdd, 0xe5, 0x09, 0xb0, 0xc3, 0x36, 0xb4, 0xa5, - 0x00, 0x9c, 0x33, 0xf4, 0x3a, 0x72, 0x27, 0x68, 0x24, 0x35, 0x63, 0x1c, - 0x0c, 0x09, 0x91, 0x1b, 0x87, 0xa7, 0x71, 0x57, 0x19, 0xb2, 0x1a, 0x7a, - 0xa4, 0x86, 0xe2, 0x90, 0xe4, 0x3c, 0x17, 0xc2, 0xde, 0xa3, 0xe3, 0x24, - 0xc7, 0x3a, 0x45, 0xba, 0xc7, 0xd0, 0x6c, 0x61, 0x59, 0x0f, 0x45, 0x6b, - 0x76, 0x15, 0x1f, 0x52, 0x31, 0x17, 0x05, 0xb0, 0x77, 0x25, 0x15, 0x36, - 0xb2, 0xc9, 0xd9, 0x0d, 0x83, 0xb5, 0xf6, 0xf1, 0xaa, 0x99, 0x6c, 0xcb, - 0xc0, 0x8e, 0x5d, 0x04, 0x0d, 0x35, 0xff, 0xd1, 0xb3, 0xc9, 0x22, 0xcf, - 0x3a, 0x90, 0x5a, 0x92, 0x5e, 0x96, 0x7b, 0xb9, 0x25, 0x43, 0xc3, 0x3f, - 0x14, 0x01, 0xb2, 0x5c, 0x26, 0x88, 0x04, 0x1b, 0x5c, 0x77, 0x63, 0x64, - 0xec, 0x64, 0x1a, 0x1c, 0xe9, 0x6b, 0xe7, 0x64, 0x0b, 0x4d, 0x51, 0x50, - 0xd1, 0x95, 0xfe, 0x5e, 0x21, 0x2d, 0x7f, 0x99, 0xc2, 0x97, 0x60, 0xd1, - 0xbf, 0x6d, 0xe9, 0xad, 0x17, 0xd6, 0xc4, 0xbf, 0x5d, 0x2d, 0x2a, 0xb0, - 0xd0, 0xbd, 0x26, 0xcd, 0x57, 0x24, 0x59, 0x43, 0x4f, 0x90, 0xf1, 0x9e, - 0x18, 0xd2, 0x81, 0xf9, 0x5b, 0x62, 0x28, 0x07, 0x41, 0x61, 0xc2, 0xef, - 0x88, 0x9e, 0x42, 0x4f, 0x0f, 0xc1, 0xf9, 0x69, 0xf8, 0x68, 0x1c, 0x27, - 0x86, 0x09, 0xa3, 0xa8, 0x27, 0xe9, 0x57, 0x4b, 0xf3, 0x2f, 0x3f, 0x0e, - 0xe2, 0xb5, 0xb2, 0x36, 0xfc, 0x01, 0x53, 0x07, 0xf6, 0xc1, 0x3c, 0xef, - 0x02, 0xdf, 0x30, 0xb3, 0x67, 0x4d, 0xe2, 0x6e, 0x6e, 0x9e, 0x1d, 0x8e, - 0x6d, 0x48, 0x59, 0x27, 0x55, 0x33, 0x40, 0x40, 0x15, 0x25, 0x3b, 0x6f, - 0xa6, 0xd1, 0x1c, 0xfb, 0xb1, 0x54, 0x97, 0x9f, 0xc7, 0x11, 0x49, 0x8d, - 0xce, 0x3d, 0x9f, 0xf4, 0xd9, 0xee, 0xbe, 0x18, 0xe3, 0xf2, 0x98, 0xf7, - 0x3f, 0x78, 0x30, 0xeb, 0xf2, 0x5f, 0x29, 0x9d, 0x64, 0xe1, 0xaf, 0x5c, - 0x0f, 0x2b, 0x4f, 0xa3, 0x82, 0xca, 0x16, 0xe1, 0x8a, 0x9c, 0x60, 0xac, - 0x43, 0x43, 0x84, 0xb2, 0xcb, 0xf6, 0x54, 0x09, 0x5b, 0x7c, 0xfc, 0x26, - 0x8c, 0x65, 0xae, 0x0a, 0xf2, 0xb6, 0x8d, 0x36, 0x84, 0xd5, 0xfd, 0x58, - 0x12, 0xf3, 0xa7, 0xb2, 0x12, 0x62, 0x67, 0xc5, 0x4c, 0x4c, 0x88, 0x74, - 0xb3, 0x5a, 0xb1, 0x24, 0x37, 0x0f, 0x93, 0x3c, 0x17, 0x4f, 0xfc, 0x35, - 0xca, 0xf0, 0x5c, 0xa2, 0x59, 0xde, 0x6d, 0x0e, 0x27, 0x74, 0xe9, 0xae, - 0x53, 0xc9, 0x80, 0xf3, 0xcd, 0x88, 0x7a, 0xac, 0x7b, 0xc1, 0x8d, 0xce, - 0x0b, 0x3b, 0x93, 0xc7, 0x27, 0x99, 0x54, 0x6c, 0x83, 0x53, 0xf1, 0x7b, - 0xe4, 0x71, 0x67, 0xe4, 0x4c, 0xb6, 0x2b, 0x1b, 0x82, 0x4e, 0xb7, 0x2b, - 0x6b, 0x51, 0x50, 0x33, 0xa1, 0xdb, 0x37, 0xe1, 0xee, 0x59, 0xb3, 0x03, - 0x55, 0x99, 0x63, 0xfc, 0x3f, 0x89, 0x02, 0x3f, 0x86, 0xea, 0x69, 0x7d, - 0xec, 0xb2, 0x08, 0x41, 0x58, 0x36, 0x3f, 0x58, 0x8f, 0x68, 0x54, 0x01, - 0x8f, 0xad, 0x81, 0xe0, 0xca, 0x18, 0xaa, 0xd0, 0x06, 0x52, 0x57, 0xa6, - 0x72, 0x0f, 0x9a, 0xe7, 0x53, 0x39, 0x80, 0x13, 0xc1, 0x79, 0xbd, 0x48, - 0x5c, 0x0f, 0xc6, 0x93, 0x83, 0x33, 0x81, 0x55, 0x81, 0x6f, 0x95, 0x35, - 0x54, 0x69, 0xc7, 0x7c, 0xf5, 0x4c, 0x87, 0x23, 0x10, 0x73, 0x97, 0xbe, - 0x69, 0x2f, 0x8d, 0x31, 0x22, 0x86, 0x8d, 0x74, 0x3a, 0x44, 0xa9, 0xc5, - 0x64, 0x29, 0x2a, 0x5c, 0x6f, 0xce, 0xe9, 0x7f, 0x84, 0xea, 0x56, 0x8c, - 0xc4, 0x0e, 0x06, 0xfc, 0xa9, 0xb9, 0xe2, 0x9a, 0x4e, 0x1a, 0x57, 0x15, - 0xa5, 0x37, 0x3e, 0xfc, 0x89, 0xf6, 0xa1, 0xe2, 0xa4, 0x83, 0xa7, 0xc1, - 0xe8, 0x18, 0xbb, 0x88, 0xc0, 0x11, 0xd2, 0x30, 0xb6, 0x64, 0xa0, 0x48, - 0x89, 0x59, 0xf7, 0xc5, 0x9e, 0xbb, 0xa7, 0x97, 0x54, 0x35, 0xde, 0x95, - 0xf1, 0xfa, 0xe0, 0xe3, 0x3c, 0xd0, 0xb7, 0x05, 0x10, 0xae, 0xa2, 0x27, - 0x4e, 0x6a, 0x8f, 0x51, 0x77, 0xb3, 0x2a, 0xd4, 0x31, 0xee, 0xbd, 0xcf, - 0x92, 0x86, 0x29, 0x59, 0xb0, 0xb0, 0x84, 0xa6, 0xa6, 0x4d, 0xf9, 0x8e, - 0x9c, 0x63, 0xfd, 0x1d, 0x0e, 0x09, 0x44, 0x7b, 0xca, 0x24, 0x72, 0x7c, - 0x68, 0x79, 0x26, 0xfb, 0xde, 0xf3, 0x81, 0x67, 0xfa, 0x57, 0x5b, 0xcb, - 0x08, 0xda, 0x05, 0x37, 0x45, 0x91, 0xe3, 0x09, 0x71, 0xb0, 0x45, 0xa2, - 0xf4, 0x97, 0xd7, 0xb7, 0x2a, 0x84, 0xac, 0xd0, 0xe1, 0xb6, 0xaf, 0xaf, - 0x69, 0x17, 0x8a, 0x4a, 0x43, 0x3c, 0x4f, 0xcc, 0xc9, 0xc3, 0xde, 0x38, - 0x08, 0x62, 0xe7, 0x02, 0x9e, 0xef, 0xf1, 0x2f, 0x8b, 0x74, 0xfd, 0x64, - 0xeb, 0x20, 0x4a, 0x60, 0xb2, 0xd9, 0x41, 0x3a, 0x45, 0xde, 0x61, 0xab, - 0x49, 0x99, 0xb6, 0x5a, 0xa8, 0xe5, 0xc2, 0xc1, 0xa8, 0xa8, 0xf3, 0x1e, - 0xea, 0x1e, 0x08, 0xc0, 0x2c, 0x56, 0xb0, 0xa8, 0x42, 0x46, 0xae, 0x77, - 0x8b, 0xfd, 0xa0, 0x91, 0x4e, 0xd4, 0xa0, 0xfc, 0x2c, 0x0a, 0xde, 0x72, - 0x31, 0xf2, 0xd4, 0x75, 0x94, 0x76, 0x53, 0xf0, 0x40, 0x90, 0x7e, 0x99, - 0xbc, 0x10, 0x62, 0xbb, 0x7d, 0x85, 0x9f, 0x05, 0x39, 0xb6, 0x2f, 0x61, - 0xc3, 0xa9, 0xd5, 0x3b, 0xcf, 0x69, 0x29, 0x88, 0x50, 0xd3, 0x34, 0x90, - 0xc9, 0x2d, 0x56, 0x58, 0xfc, 0x2c, 0xa6, 0x6c, 0x36, 0xc2, 0x4a, 0x12, - 0xe6, 0xfb, 0x9b, 0xdf, 0x49, 0x37, 0x3e, 0x45, 0x69, 0x81, 0xb7, 0x87, - 0x6e, 0xea, 0x2f, 0x08, 0x19, 0xf7, 0xec, 0xdd, 0x4b, 0xc1, 0xb2, 0xd3, - 0xf7, 0x7e, 0x77, 0x77, 0x3f, 0xd4, 0x33, 0x86, 0x65, 0x4c, 0x80, 0xc0, - 0x60, 0x7d, 0x04, 0x48, 0x51, 0x22, 0xa0, 0xf0, 0xae, 0x9e, 0xc7, 0x58, - 0xc7, 0x75, 0x05, 0x3c, 0xac, 0x15, 0xfa, 0x70, 0x60, 0xf7, 0xf7, 0x7e, - 0x25, 0xde, 0x90, 0x84, 0x31, 0xc6, 0x04, 0xa2, 0xd7, 0xcb, 0x4c, 0xe9, - 0xea, 0x8e, 0x77, 0xc0, 0x5c, 0xab, 0x6a, 0x87, 0xad, 0x36, 0xa8, 0x41, - 0xc6, 0x1d, 0x54, 0x14, 0x87, 0x77, 0xd2, 0xd5, 0x52, 0x39, 0x2c, 0x56, - 0xc3, 0x58, 0xb1, 0x59, 0x29, 0x1b, 0x6c, 0x23, 0x72, 0x66, 0xe8, 0xdc, - 0x38, 0x68, 0x73, 0xf7, 0xde, 0x2c, 0x42, 0x16, 0x70, 0x8b, 0x35, 0x76, - 0xbe, 0xf3, 0x66, 0xa9, 0x9f, 0x1d, 0xad, 0x14, 0xe2, 0x31, 0xbd, 0xed, - 0x5f, 0x5b, 0x8a, 0x0d, 0x17, 0x6c, 0x42, 0x96, 0x80, 0x5f, 0xa5, 0x2e, - 0x23, 0x30, 0x22, 0x50, 0x52, 0x52, 0xdb, 0xcc, 0xc0, 0x60, 0x59, 0x06, - 0x8f, 0x58, 0x98, 0x26, 0xfe, 0x1d, 0x69, 0x01, 0xbd, 0xfb, 0xf0, 0x88, - 0xac, 0xa9, 0xca, 0x78, 0xd4, 0x3b, 0x90, 0x97, 0x18, 0xa8, 0x5a, 0xd0, - 0xe3, 0x09, 0xaf, 0x74, 0xe0, 0x9c, 0xe3, 0xd2, 0x32, 0x38, 0x8d, 0x0a, - 0x02, 0xe7, 0xb2, 0xa1, 0xbe, 0xdb, 0x92, 0x41, 0x34, 0x5d, 0xb9, 0xfb, - 0xfa, 0x73, 0xa4, 0xe7, 0x1e, 0xf7, 0x66, 0x66, 0x00, 0x43, 0xa1, 0xc6, - 0xfc, 0x7f, 0xbd, 0x45, 0x3a, 0x62, 0x97, 0xe5, 0x79, 0x89, 0x08, 0xd2, - 0xff, 0x17, 0xfe, 0x72, 0x12, 0xa6, 0x64, 0x44, 0xe4, 0x51, 0x27, 0x14, - 0x6b, 0x3f, 0xc3, 0xae, 0xe7, 0x40, 0xe1, 0xf9, 0x44, 0x2b, 0xb1, 0xb6, - 0x01, 0xe0, 0x12, 0x4a, 0xd0, 0x88, 0xb4, 0xfd, 0x90, 0x89, 0xff, 0x29, - 0x57, 0x6e, 0x5a, 0x9e, 0x12, 0xbe, 0x92, 0xe1, 0x31, 0xac, 0x4a, 0xf7, - 0x07, 0x38, 0x1a, 0x54, 0xad, 0x67, 0x53, 0xb1, 0x60, 0xbc, 0x85, 0x5f, - 0xf8, 0x35, 0x8b, 0x76, 0xda, 0x7b, 0x7e, 0x9c, 0x4f, 0x67, 0x97, 0x5f, - 0x4d, 0x92, 0x97, 0xba, 0x48, 0xa2, 0x93, 0x49, 0x71, 0x0b, 0xda, 0x33, - 0x14, 0x14, 0x87, 0x84, 0xc1, 0x38, 0x0e, 0xfa, 0x82, 0x69, 0xc2, 0x13, - 0x2a, 0x39, 0xd4, 0x91, 0x86, 0xac, 0x1d, 0x81, 0xc1, 0xfe, 0x51, 0x23, - 0x92, 0x0c, 0x51, 0xad, 0xa8, 0xd3, 0xd5, 0x11, 0x94, 0xa7, 0x80, 0xdf, - 0x57, 0x24, 0x63, 0x5f, 0x77, 0x36, 0xd1, 0x7e, 0x7f, 0x59, 0x34, 0x03, - 0x59, 0x1b, 0x65, 0x60, 0xa1, 0x82, 0x8b, 0x64, 0x19, 0xf5, 0x80, 0xe4, - 0xd8, 0x61, 0x25, 0xf1, 0x5b, 0xa9, 0xb6, 0x9b, 0xa6, 0x71, 0xd5, 0x60, - 0x28, 0x7a, 0xe8, 0xc6, 0x68, 0x4f, 0xbd, 0x40, 0xf3, 0x72, 0x97, 0x3a, - 0x4b, 0xcd, 0xc2, 0xbd, 0xe9, 0xbd, 0x96, 0x6c, 0x1b, 0x01, 0xbc, 0xd1, - 0x38, 0x74, 0xa8, 0xda, 0x89, 0x11, 0xfe, 0x21, 0x3d, 0x0c, 0xfb, 0x03, - 0x85, 0x77, 0x37, 0xd2, 0xbd, 0x08, 0x67, 0x43, 0x74, 0x13, 0x87, 0x6b, - 0x55, 0xd6, 0x48, 0x79, 0xe9, 0x24, 0xe3, 0x6e, 0x03, 0xec, 0xf2, 0x54, - 0x6e, 0x01, 0x3c, 0x00, 0xd9, 0xab, 0x1a, 0xc0, 0x65, 0x2d, 0x55, 0x18, - 0xee, 0xfe, 0xea, 0xba, 0xc8, 0x6e, 0xfc, 0x7a, 0x59, 0x62, 0x00, 0x17, - 0x9a, 0x86, 0x2a, 0x3a, 0x48, 0x42, 0xdd, 0xb4, 0x5d, 0xb0, 0x16, 0x03, - 0x63, 0xca, 0xfa, 0x6c, 0x5f, 0x96, 0x83, 0xc7, 0x76, 0x2a, 0x34, 0x06, - 0xf0, 0x4f, 0xa5, 0xc1, 0xf7, 0xc2, 0x32, 0xe7, 0x77, 0x49, 0x4e, 0xfd, - 0x84, 0xe4, 0x14, 0xdd, 0xd5, 0xf8, 0xa7, 0xc6, 0x62, 0xe6, 0x94, 0x64, - 0x6d, 0x51, 0x48, 0xd0, 0xc0, 0xd4, 0x65, 0x08, 0x41, 0x02, 0xcd, 0x43, - 0x29, 0xfb, 0x3e, 0x94, 0xf9, 0x3f, 0x09, 0x33, 0x65, 0x56, 0xf8, 0x59, - 0x6a, 0x91, 0x5d, 0x73, 0x42, 0x25, 0xef, 0xb3, 0xb9, 0x6a, 0x2f, 0xc4, - 0xf3, 0xdf, 0x60, 0xad, 0x97, 0xba, 0xd5, 0xb0, 0x1f, 0xdc, 0xe4, 0xa0, - 0x7f, 0x62, 0xa0, 0xd0, 0xb0, 0xf1, 0x83, 0x4d, 0x09, 0x69, 0x76, 0x77, - 0x00, 0xfe, 0x91, 0x50, 0xd5, 0x75, 0x5e, 0xef, 0xa9, 0x08, 0xed, 0x19, - 0xbb, 0x43, 0x11, 0x9f, 0x20, 0xa3, 0x40, 0x50, 0x95, 0xb1, 0x4e, 0x53, - 0x7e, 0x10, 0xc3, 0x21, 0x5b, 0x39, 0x0a, 0x7a, 0x9b, 0xf0, 0xcf, 0x74, - 0x8b, 0x76, 0xc0, 0x09, 0xd1, 0xac, 0x44, 0xe7, 0x03, 0xca, 0x88, 0x98, - 0x20, 0x11, 0x41, 0x9c, 0xef, 0xb7, 0x41, 0x1d, 0x54, 0x9a, 0x7f, 0x88, - 0x25, 0xa4, 0xca, 0xd7, 0xb7, 0x9f, 0x8b, 0x58, 0x5e, 0x61, 0x07, 0xc1, - 0x01, 0x24, 0xaf, 0xc5, 0xb5, 0x6a, 0x9e, 0x65, 0xb7, 0x70, 0x52, 0x48, - 0x5b, 0x4e, 0xea, 0x5f, 0x91, 0xea, 0xab, 0xe4, 0x83, 0xde, 0x26, 0x8c, - 0x9b, 0x17, 0x0d, 0x95, 0x38, 0x17, 0x54, 0x80, 0x66, 0x31, 0x6f, 0xf3, - 0xe6, 0xfe, 0x9a, 0x85, 0xe1, 0xe4, 0xee, 0x4c, 0x28, 0x45, 0x93, 0x73, - 0xab, 0xcd, 0x94, 0xcd, 0x97, 0xd1, 0xf2, 0x87, 0x2f, 0x9e, 0x96, 0x4f, - 0xe4, 0x2a, 0x45, 0x50, 0x9f, 0x2d, 0x76, 0xeb, 0x70, 0x97, 0x25, 0x62, - 0xcd, 0x2c, 0x46, 0xb0, 0x20, 0x55, 0x6c, 0xd8, 0xa4, 0x43, 0x0d, 0x13, - 0x46, 0xe9, 0x4f, 0x18, 0x9d, 0x3a, 0xa1, 0x23, 0xdb, 0xb8, 0x1a, 0xd4, - 0x4f, 0xed, 0xd1, 0x94, 0x51, 0x80, 0xe8, 0xff, 0x4a, 0xc3, 0x91, 0x8f, - 0x37, 0x45, 0xf6, 0xda, 0xd3, 0x71, 0x89, 0xf2, 0xad, 0xa9, 0x54, 0x41, - 0x48, 0x85, 0x53, 0x42, 0x65, 0x43, 0xf9, 0x01, 0xf4, 0xf4, 0xcd, 0x0a, - 0x55, 0x9e, 0xed, 0x7e, 0x97, 0x09, 0x61, 0xb1, 0x59, 0xf1, 0x50, 0x94, - 0xc0, 0xbd, 0x02, 0x86, 0xdb, 0x2c, 0xe5, 0x97, 0xd1, 0xce, 0xfe, 0xed, - 0xa7, 0x31, 0xc3, 0xba, 0x8c, 0xb6, 0x81, 0xab, 0x45, 0xd6, 0xc6, 0xe4, - 0xbb, 0x14, 0xba, 0xab, 0xdc, 0x44, 0x57, 0x7a, 0x3e, 0xa7, 0x36, 0xac, - 0xf2, 0xe0, 0xf4, 0xd7, 0x2a, 0x96, 0x99, 0x50, 0x10, 0x04, 0xa6, 0xda, - 0x25, 0x70, 0x94, 0x9b, 0xdc, 0x46, 0xfa, 0x6f, 0xba, 0x7b, 0x9a, 0xe9, - 0x54, 0x73, 0x8d, 0x7d, 0xd1, 0x36, 0xb0, 0xb2, 0xb3, 0x10, 0x70, 0x61, - 0x6d, 0x10, 0xbb, 0x6b, 0xd5, 0x47, 0x1f, 0x90, 0xcb, 0xc2, 0x59, 0x04, - 0x09, 0x1f, 0x22, 0x00, 0xd5, 0x11, 0x8f, 0x59, 0xa8, 0x05, 0x2b, 0xda, - 0x51, 0xd5, 0x8f, 0x59, 0x95, 0xcd, 0x64, 0x8b, 0xa5, 0x92, 0xf8, 0x47, - 0x45, 0x2b, 0xb5, 0x24, 0x91, 0x0c, 0xff, 0x25, 0x88, 0xcf, 0x50, 0x50, - 0xbb, 0xc3, 0xb9, 0xe2, 0xaf, 0x6d, 0x82, 0x2a, 0x5d, 0x93, 0xf5, 0x2b, - 0xc8, 0x2e, 0x29, 0x54, 0x16, 0x4a, 0x96, 0x3b, 0x0c, 0xf7, 0x5a, 0x40, - 0x9d, 0x0e, 0x73, 0xdb, 0x4b, 0xa0, 0x10, 0x1c, 0xf1, 0x6c, 0x44, 0xa5, - 0xa0, 0x66, 0x3b, 0x25, 0xd7, 0x36, 0x32, 0x84, 0x5d, 0x08, 0x91, 0xee, - 0xbe, 0x01, 0xa0, 0xda, 0x90, 0x61, 0xb1, 0x11, 0x9a, 0x4f, 0x00, 0x6d, - 0x34, 0x7c, 0xbe, 0xd8, 0xda, 0x00, 0x7b, 0x00, 0x15, 0xd5, 0xa5, 0xb5, - 0x4d, 0x62, 0x77, 0x22, 0x8f, 0x11, 0xf6, 0x41, 0xa0, 0x0b, 0xe7, 0x92, - 0x13, 0xce, 0x60, 0xd9, 0xac, 0xeb, 0xf5, 0x75, 0xd2, 0xab, 0xc7, 0x08, - 0x46, 0x34, 0x31, 0xc6, 0xde, 0xeb, 0x04, 0x55, 0xe8, 0x74, 0xe6, 0xc6, - 0x44, 0x07, 0xef, 0xe3, 0xe9, 0x4b, 0xf1, 0x3a, 0x7e, 0x7e, 0xd3, 0x82, - 0x7f, 0xec, 0xf3, 0x3b, 0x7f, 0x4f, 0x26, 0xdd, 0x2f, 0xa1, 0x1a, 0x84, - 0x4e, 0x8c, 0x92, 0x85, 0x27, 0xd7, 0x49, 0xb6, 0xbb, 0x76, 0xc7, 0xb1, - 0x45, 0x3d, 0x93, 0x77, 0x6b, 0xda, 0xde, 0xee, 0xd1, 0xa9, 0x35, 0xeb, - 0x28, 0x4e, 0xcc, 0xae, 0x74, 0x45, 0xca, 0xf2, 0xd8, 0x58, 0xdc, 0x0c, - 0xb3, 0x34, 0x44, 0x36, 0x23, 0x1a, 0xef, 0x38, 0x46, 0xe2, 0xb8, 0xaf, - 0xd7, 0xc4, 0xd2, 0x2b, 0xa7, 0x9e, 0xde, 0xa3, 0x10, 0x67, 0xe9, 0xf0, - 0xc1, 0xe9, 0x6d, 0xe5, 0x84, 0xdb, 0x64, 0x4a, 0x98, 0xdd, 0x3a, 0x7b, - 0x70, 0x79, 0x8c, 0xf2, 0x54, 0x71, 0xb7, 0x07, 0x89, 0x42, 0x32, 0x6d, - 0x6c, 0x48, 0x83, 0xae, 0x28, 0x5b, 0x13, 0xe2, 0xa8, 0x70, 0x35, 0x8e, - 0x25, 0x3b, 0xbb, 0x3e, 0xf7, 0x0c, 0xa4, 0x10, 0xb1, 0x24, 0xe0, 0xf1, - 0xcb, 0xe6, 0xfc, 0xf7, 0xb5, 0x9c, 0x16, 0x71, 0x95, 0xe5, 0x95, 0x9f, - 0x09, 0x1c, 0x79, 0xd4, 0xb5, 0x61, 0x5a, 0x74, 0x3c, 0xc2, 0xef, 0x0d, - 0x68, 0x8a, 0x4a, 0x67, 0x87, 0x0d, 0xe9, 0x76, 0x35, 0x45, 0xd3, 0xe6, - 0xa7, 0x02, 0x59, 0x64, 0x10, 0xea, 0xd5, 0xf9, 0xbd, 0x02, 0x38, 0x58, - 0x0e, 0xe4, 0xb9, 0xa7, 0x03, 0xb5, 0x96, 0x63, 0x48, 0x6a, 0x7e, 0xfc, - 0x49, 0xc4, 0x75, 0x1a, 0x8c, 0xe2, 0xd6, 0x11, 0x22, 0x83, 0xd8, 0xe3, - 0x95, 0x87, 0x1d, 0x50, 0x87, 0xc2, 0x58, 0x56, 0x2e, 0x5c, 0x23, 0x39, - 0x3d, 0xd5, 0x68, 0x19, 0x93, 0x7d, 0xbe, 0xbd, 0xbe, 0xe8, 0xe6, 0x7d, - 0xdd, 0x1c, 0x4f, 0x73, 0x9b, 0x2f, 0x81, 0x7f, 0x12, 0xff, 0x7e, 0x11, - 0x3e, 0xec, 0x1d, 0x6b, 0x99, 0x74, 0xde, 0x4e, 0x50, 0xaa, 0x01, 0xa0, - 0x9f, 0xfd, 0x9b, 0x1c, 0xbc, 0x6e, 0xd0, 0xdb, 0x8b, 0x02, 0x35, 0x53, - 0x90, 0xa0, 0xaa, 0x57, 0x9c, 0xa3, 0xe4, 0xf8, 0xc8, 0x01, 0x9f, 0xd7, - 0x4d, 0x54, 0x30, 0x3d, 0x2c, 0x24, 0x2f, 0x1b, 0xb5, 0x30, 0xd3, 0x7a, - 0x90, 0x08, 0x4b, 0x27, 0xce, 0xd5, 0x13, 0xca, 0xc1, 0x5c, 0xec, 0x43, - 0x0b, 0xd1, 0xa4, 0xbe, 0x83, 0x1d, 0x72, 0xe9, 0x22, 0x27, 0x4f, 0x50, - 0x31, 0x1d, 0x17, 0x52, 0xb8, 0x2f, 0xdb, 0xd8, 0x7b, 0xc9, 0x53, 0x1b, - 0xc6, 0x55, 0xa3, 0x4f, 0xde, 0x26, 0xd0, 0x0c, 0xfb, 0x4f, 0x18, 0x20, - 0xd0, 0x4c, 0x00, 0xf6, 0x74, 0x43, 0x9c, 0x51, 0x4e, 0xe7, 0x2d, 0x3d, - 0x09, 0x9d, 0xd2, 0x66, 0xec, 0x3f, 0xd0, 0xe2, 0x53, 0x37, 0x0a, 0xac, - 0xe0, 0x08, 0x0d, 0xce, 0xa4, 0x05, 0x41, 0x90, 0xb6, 0x6a, 0xff, 0x60, - 0xe7, 0xdd, 0x2f, 0x0e, 0xaa, 0xf7, 0x47, 0x91, 0xb0, 0x1b, 0x7f, 0x31, - 0x84, 0x36, 0xbf, 0x9f, 0x3f, 0xfc, 0x41, 0x01, 0xf8, 0xf0, 0x99, 0x68, - 0x39, 0xd4, 0x2a, 0xf1, 0x1e, 0xb3, 0x4c, 0x0d, 0x18, 0xc2, 0x22, 0xd4, - 0x43, 0x5c, 0x48, 0xf1, 0x10, 0x0f, 0x2c, 0x81, 0x9c, 0xa2, 0x74, 0x3f, - 0xe6, 0x73, 0x23, 0xef, 0xeb, 0xca, 0x2e, 0x7c, 0x07, 0x3c, 0xe4, 0x1c, - 0x17, 0x0e, 0x0f, 0xee, 0xa8, 0x39, 0x7d, 0x23, 0xe7, 0xbd, 0xa8, 0xef, - 0xcf, 0xc1, 0x96, 0xdc, 0xe6, 0x70, 0x8a, 0x60, 0xdb, 0x19, 0xb9, 0x51, - 0xd1, 0x21, 0xf9, 0x47, 0xdf, 0x27, 0xe5, 0x03, 0x1e, 0xa9, 0xd5, 0x69, - 0xda, 0x99, 0x83, 0x49, 0x80, 0x67, 0xf0, 0x8d, 0x34, 0xf6, 0x6c, 0xc3, - 0x49, 0xba, 0x00, 0xc5, 0x6f, 0x68, 0x94, 0xb8, 0xa3, 0x06, 0xca, 0xe3, - 0x96, 0x30, 0x62, 0x19, 0xb3, 0x63, 0x11, 0xef, 0x0b, 0xdf, 0x72, 0xb4, - 0xda, 0xe9, 0x92, 0xf0, 0x2b, 0x4e, 0x65, 0x3f, 0x2e, 0xc3, 0x8f, 0x76, - 0x21, 0x85, 0xb0, 0x9f, 0x13, 0x4d, 0x74, 0x41, 0x2c, 0x5f, 0xb8, 0x56, - 0xe6, 0xe2, 0x1f, 0xd1, 0x78, 0x6d, 0x83, 0x27, 0xd2, 0x1a, 0x20, 0xec, - 0x4f, 0x42, 0x23, 0x48, 0x5d, 0xd3, 0x3a, 0x91, 0x25, 0x70, 0x01, 0xb2, - 0xe2, 0x40, 0xd1, 0xbd, 0x8a, 0x39, 0x20, 0xcd, 0x86, 0xdf, 0x4b, 0xa2, - 0x8e, 0x4c, 0x24, 0x36, 0x83, 0xa6, 0xcd, 0xe9, 0x43, 0x3e, 0xea, 0x58, - 0x13, 0xe9, 0x96, 0xc1, 0x27, 0xb2, 0x50, 0x19, 0xe9, 0x9f, 0xb5, 0x14, - 0x25, 0x11, 0x3c, 0xf0, 0x03, 0x03, 0x57, 0x1d, 0xa6, 0x1e, 0x6e, 0x0a, - 0x2f, 0xf9, 0xc2, 0x57, 0xba, 0x38, 0x77, 0xbb, 0xac, 0x8f, 0x79, 0x74, - 0x65, 0x68, 0x48, 0x16, 0x3a, 0xb5, 0x3a, 0xc0, 0xf5, 0x6d, 0xee, 0xe5, - 0xc7, 0xfc, 0xb5, 0x82, 0xa0, 0xbb, 0x68, 0x7b, 0xa6, 0x5c, 0x6e, 0x61, - 0x70, 0x2c, 0x2c, 0x71, 0x61, 0xf3, 0x96, 0x26, 0xb2, 0xd4, 0xce, 0x05, - 0xd6, 0x90, 0x10, 0x9b, 0xd3, 0x4f, 0x69, 0x7b, 0xc0, 0xb0, 0xca, 0x35, - 0x6a, 0x24, 0x04, 0x5c, 0x4c, 0x2d, 0x22, 0x57, 0x79, 0x0f, 0x0f, 0x26, - 0xd2, 0x44, 0x05, 0xed, 0x4d, 0x82, 0xe5, 0xba, 0x85, 0x7c, 0xc3, 0x73, - 0x80, 0x9a, 0x8d, 0x8c, 0x74, 0x61, 0x4f, 0x48, 0x57, 0x20, 0xae, 0xab, - 0xb5, 0xaa, 0xcb, 0x4d, 0xba, 0x19, 0xb5, 0xe2, 0xa2, 0x60, 0xd2, 0x21, - 0x2f, 0xff, 0x78, 0xcb, 0x69, 0x4a, 0x6f, 0xc1, 0xf4, 0xc2, 0x28, 0xef, - 0x5e, 0x36, 0x82, 0x9c, 0x76, 0xfc, 0xca, 0x13, 0x37, 0xba, 0x2e, 0x50, - 0xc2, 0xa6, 0xb2, 0xc6, 0x4a, 0x44, 0xf6, 0x24, 0xe0, 0x8f, 0xe0, 0x0a, - 0xcd, 0x31, 0xed, 0x5a, 0xdd, 0xc3, 0x77, 0x55, 0x46, 0x36, 0xc3, 0xad, - 0x0a, 0x3a, 0x41, 0xb9, 0x88, 0x8d, 0x57, 0xaf, 0x3b, 0xab, 0x5e, 0x81, - 0x5e, 0x11, 0x23, 0xe0, 0x68, 0x5a, 0xd9, 0x1f, 0x90, 0x80, 0x0b, 0xac, - 0xb5, 0x29, 0xa4, 0x7a, 0x09, 0x40, 0x82, 0x73, 0x49, 0xc6, 0x2f, 0x91, - 0x07, 0x3e, 0xfa, 0x8e, 0x06, 0x9f, 0x90, 0x05, 0x02, 0x8f, 0x56, 0x61, - 0xd4, 0x91, 0xaa, 0x20, 0x6d, 0xab, 0xb4, 0xa9, 0x91, 0xc0, 0xb1, 0x41, - 0xb0, 0x7c, 0xd0, 0xda, 0xf9, 0xc1, 0xaa, 0x85, 0x52, 0x0c, 0x86, 0xf5, - 0x17, 0x9a, 0x36, 0x77, 0xc6, 0xf5, 0x12, 0xdb, 0x43, 0xc9, 0xbe, 0x2b, - 0x10, 0x8b, 0x4a, 0xd2, 0xd5, 0x44, 0xeb, 0x86, 0x99, 0x1b, 0x07, 0x66, - 0x63, 0xba, 0x67, 0xd9, 0xd8, 0xa6, 0x64, 0xf7, 0x65, 0x93, 0xa4, 0x2c, - 0x1e, 0x06, 0xc3, 0x96, 0x33, 0x4f, 0x4a, 0x26, 0x49, 0xdf, 0x8d, 0x07, - 0x3d, 0xd8, 0xcf, 0xc8, 0xf8, 0x59, 0x22, 0xe9, 0x15, 0x21, 0x9b, 0x63, - 0xad, 0x04, 0x53, 0x6e, 0x2b, 0x32, 0x03, 0x7e, 0x6c, 0x87, 0x0b, 0x29, - 0x60, 0x82, 0x39, 0x06, 0xb9, 0xdf, 0xe0, 0x5b, 0x59, 0xb9, 0x8e, 0xcb, - 0xd2, 0xb1, 0x32, 0xb1, 0x00, 0x4c, 0x1c, 0xe3, 0xa4, 0x1a, 0xbc, 0x99, - 0xe1, 0x1f, 0x72, 0xef, 0xa5, 0xaa, 0x2d, 0xb8, 0x66, 0xe2, 0xa4, 0xc9, - 0x00, 0xcf, 0x72, 0x82, 0x4a, 0x08, 0x18, 0xa9, 0xe1, 0xa9, 0x9f, 0xdd, - 0x75, 0x34, 0x08, 0xea, 0x29, 0xed, 0xaf, 0x45, 0xa1, 0x76, 0xb3, 0xae, - 0xce, 0x12, 0x8a, 0xd1, 0xc3, 0x10, 0xc1, 0xb5, 0xac, 0x3f, 0xe3, 0xbd, - 0xd3, 0x06, 0x9e, 0x1f, 0x05, 0x34, 0x10, 0x8b, 0x3a, 0x84, 0x78, 0xde, - 0xc3, 0xe5, 0xbb, 0x40, 0x58, 0x59, 0x10, 0xc7, 0x13, 0x70, 0xab, 0x7a, - 0x37, 0x48, 0x29, 0x86, 0x49, 0x33, 0xa7, 0x45, 0x41, 0x8b, 0xbc, 0xb3, - 0xb9, 0xed, 0xcc, 0xbb, 0xe4, 0x6d, 0x86, 0x7b, 0x75, 0x14, 0x02, 0x28, - 0x45, 0xbb, 0xe9, 0xbd, 0xd7, 0xa4, 0xb9, 0xa7, 0x2b, 0x80, 0x49, 0x4a, - 0x23, 0xa5, 0x84, 0xf7, 0x15, 0xaa, 0xfd, 0x71, 0x82, 0xce, 0xbd, 0x5a, - 0x02, 0x0f, 0x94, 0x71, 0xbb, 0x72, 0x81, 0x5c, 0x9f, 0x38, 0xcd, 0x9e, - 0xc4, 0x7f, 0x41, 0x6b, 0xa6, 0xe8, 0x89, 0xd4, 0x26, 0x15, 0xb9, 0x6e, - 0x63, 0xd4, 0xc3, 0xeb, 0x9b, 0xfb, 0x69, 0x92, 0xd2, 0x18, 0x31, 0xb3, - 0xfa, 0xe1, 0xd9, 0xb4, 0x27, 0xb4, 0x0a, 0xf8, 0xbe, 0x46, 0xb7, 0x3d, - 0xfe, 0x38, 0x0a, 0xa6, 0xdc, 0xd3, 0xef, 0xac, 0xc3, 0xb1, 0xa6, 0x94, - 0x86, 0x1a, 0xac, 0xb8, 0xd0, 0xa3, 0x16, 0x8f, 0xdd, 0x5b, 0x92, 0x26, - 0x98, 0x62, 0x3a, 0x53, 0x8a, 0x27, 0xd2, 0xe8, 0xa8, 0x3d, 0x2c, 0xe7, - 0x2c, 0x2e, 0xa5, 0x0c, 0x70, 0x3b, 0x03, 0x56, 0xdc, 0x8c, 0x67, 0x29, - 0x36, 0x98, 0x40, 0x00, 0xba, 0xac, 0xfb, 0x13, 0xaf, 0x37, 0x76, 0x3f, - 0xad, 0x13, 0x85, 0x29, 0x72, 0x94, 0x3a, 0x77, 0x98, 0x35, 0x18, 0x34, - 0x7f, 0xe4, 0xef, 0x1b, 0x31, 0x2e, 0xa0, 0x41, 0xe9, 0xc2, 0x03, 0xa0, - 0x65, 0xca, 0xf6, 0x6b, 0x4a, 0x58, 0x00, 0x37, 0x51, 0xb2, 0x5e, 0xeb, - 0x91, 0xcd, 0x6f, 0x9c, 0x10, 0x29, 0xd0, 0x4f, 0x17, 0x65, 0xb3, 0x23, - 0x38, 0x66, 0x78, 0x09, 0x73, 0xa9, 0xc6, 0x41, 0x65, 0x63, 0x38, 0x3f, - 0x9c, 0x2c, 0x59, 0xe2, 0xe5, 0x07, 0xcd, 0xad, 0xcf, 0x4b, 0xb3, 0x04, - 0xbb, 0x09, 0x9e, 0xf6, 0x3b, 0xd6, 0x09, 0xc6, 0x37, 0x34, 0x58, 0x86, - 0xf7, 0x9e, 0x18, 0x28, 0xa7, 0xb2, 0xdf, 0xb7, 0xee, 0x01, 0xec, 0xa7, - 0xcf, 0x22, 0x85, 0x34, 0x47, 0xb4, 0x02, 0x1f, 0xe7, 0x3d, 0x09, 0xb8, - 0x50, 0x93, 0xb9, 0xdd, 0x3a, 0xd4, 0xe3, 0x61, 0x62, 0x7e, 0xe3, 0x42, - 0x95, 0x6d, 0x7b, 0x9c, 0xa6, 0x9f, 0x94, 0x8a, 0xd0, 0x78, 0xd9, 0xe5, - 0x7e, 0x3a, 0x36, 0x7e, 0x0e, 0x23, 0x34, 0x2b, 0xf0, 0x3a, 0x62, 0xf2, - 0xd7, 0x60, 0xa0, 0x8a, 0xcd, 0x55, 0xdd, 0x31, 0x14, 0xdb, 0x22, 0x40, - 0x82, 0x07, 0xdf, 0x6b, 0x28, 0x3d, 0xb9, 0x9d, 0x0d, 0xb1, 0x2a, 0xa0, - 0x3b, 0xfd, 0x20, 0x9e, 0x6f, 0xab, 0xb5, 0x99, 0x42, 0x91, 0x68, 0xea, - 0x55, 0x9e, 0x8f, 0xd0, 0x55, 0xc8, 0xdc, 0xa5, 0xcb, 0x3c, 0x64, 0x01, - 0xe1, 0xa9, 0x9e, 0x11, 0xae, 0x1f, 0xfb, 0x78, 0xad, 0x6f, 0xcd, 0xc0, - 0xbe, 0x58, 0x5f, 0x8b, 0xdd, 0xca, 0x46, 0x24, 0xd0, 0x79, 0xc3, 0x82, - 0x65, 0x02, 0x21, 0x16, 0x3f, 0xa0, 0xc9, 0x58, 0xf0, 0x10, 0xcc, 0x7b, - 0xbe, 0xe2, 0xf9, 0xfa, 0xda, 0x63, 0x85, 0x32, 0xa6, 0xac, 0x1a, 0x96, - 0xd3, 0xa8, 0xa9, 0xf7, 0x54, 0x22, 0xc8, 0xff, 0xcf, 0xe9, 0x1e, 0xb1, - 0x33, 0xe0, 0x00, 0x12, 0x34, 0x94, 0x23, 0x68, 0x3d, 0x1c, 0x8f, 0x08, - 0x15, 0x56, 0x44, 0x33, 0x61, 0xb8, 0x09, 0x54, 0x08, 0x68, 0xdb, 0x6a, - 0xc8, 0x3b, 0xdf, 0x65, 0x36, 0x7d, 0x93, 0x8f, 0xf2, 0x35, 0x4b, 0xd8, - 0xc0, 0x16, 0x1f, 0x70, 0xd2, 0x0a, 0xd1, 0xea, 0x1d, 0xfb, 0x03, 0x8c, - 0x07, 0xe8, 0x8a, 0x45, 0x1c, 0x2c, 0xfb, 0x72, 0x61, 0x13, 0x10, 0xf8, - 0xc8, 0xcf, 0xf0, 0x98, 0x40, 0xed, 0xd5, 0x94, 0x75, 0xc3, 0xae, 0x11, - 0x7d, 0xe6, 0xf4, 0xa7, 0xf7, 0x66, 0x05, 0x61, 0x14, 0x88, 0xd6, 0xdf, - 0xd3, 0x1b, 0xfb, 0x46, 0x9e, 0x7d, 0x11, 0x3e, 0x72, 0x25, 0x5a, 0x67, - 0x0f, 0xdd, 0x34, 0x01, 0xa7, 0xa6, 0xa5, 0xb0, 0x37, 0xea, 0x7d, 0x96, - 0x14, 0x80, 0x2f, 0x7d, 0x42, 0xc7, 0x45, 0xec, 0xc6, 0x9e, 0x0b, 0x01, - 0xfa, 0x7a, 0x63, 0x5d, 0xa2, 0x38, 0xa7, 0x88, 0x66, 0x81, 0x98, 0x41, - 0x62, 0xbc, 0xf6, 0x05, 0xbf, 0x82, 0xf4, 0x2d, 0xd2, 0x17, 0x25, 0x52, - 0xa3, 0x88, 0x5d, 0xcc, 0xc0, 0xa8, 0x60, 0x0b, 0x57, 0xa3, 0xa4, 0x07, - 0xcd, 0x3f, 0xae, 0x99, 0x4f, 0x97, 0x0e, 0x42, 0xac, 0x79, 0x37, 0x39, - 0x4e, 0x9a, 0xa2, 0x9c, 0xca, 0x8e, 0x40, 0x03, 0x37, 0x20, 0xbb, 0xe5, - 0x6b, 0x6b, 0x8e, 0x87, 0x6a, 0xd2, 0x9e, 0x0c, 0x3b, 0x1b, 0xf8, 0xca, - 0x25, 0x3c, 0xda, 0x46, 0x22, 0x84, 0xc8, 0xf7, 0x04, 0xdf, 0x4b, 0x8f, - 0x81, 0xb5, 0xd5, 0xb7, 0x89, 0x6d, 0xbb, 0xee, 0x0b, 0xc7, 0x52, 0x5d, - 0xfe, 0x68, 0x1c, 0x42, 0xb7, 0x59, 0xe7, 0xbc, 0x43, 0x12, 0x61, 0xa9, - 0x53, 0xec, 0x22, 0x79, 0xae, 0x39, 0xba, 0x8d, 0x85, 0x2c, 0x1c, 0x3b, - 0x15, 0x96, 0xe9, 0xe2, 0x7b, 0x04, 0xdb, 0x89, 0xad, 0x19, 0x07, 0xcc, - 0x26, 0xce, 0x50, 0xf0, 0xf4, 0x4d, 0x8e, 0xd0, 0xf0, 0xac, 0x38, 0x24, - 0xac, 0x20, 0x3b, 0xf4, 0x1c, 0x6a, 0xae, 0x49, 0x7e, 0x37, 0x25, 0x6e, - 0xe7, 0x5b, 0xcd, 0x5c, 0xce, 0xa1, 0xae, 0x41, 0x9c, 0xfb, 0xeb, 0x47, - 0x27, 0x8c, 0xdf, 0x64, 0x5b, 0xfc, 0x26, 0xeb, 0xbc, 0x30, 0x90, 0xa1, - 0x7b, 0x90, 0x37, 0x94, 0xa7, 0x3d, 0x47, 0xc8, 0x8e, 0xdd, 0xa6, 0xf3, - 0xb3, 0x0d, 0xd2, 0x0e, 0x98, 0x26, 0x61, 0x23, 0x65, 0x25, 0x0e, 0x6d, - 0x30, 0x57, 0xa6, 0xc4, 0x2e, 0xff, 0xe2, 0xb6, 0x2b, 0x7b, 0x8a, 0x29, - 0x79, 0x23, 0x19, 0x0e, 0x82, 0xf5, 0x15, 0x77, 0xf8, 0x0d, 0x1e, 0xd7, - 0xaa, 0x06, 0xd3, 0xb4, 0x2f, 0xd3, 0xc4, 0x43, 0x61, 0x0c, 0x79, 0x68, - 0x2c, 0x8b, 0xa8, 0x66, 0xf3, 0x32, 0xf9, 0x78, 0xf7, 0x1c, 0x01, 0x20, - 0x70, 0x8a, 0xea, 0x09, 0x59, 0x77, 0x78, 0x94, 0xa3, 0x3f, 0x59, 0x55, - 0x36, 0xb1, 0x19, 0x75, 0xdb, 0x17, 0xba, 0x65, 0x07, 0xe3, 0x8f, 0x93, - 0x7c, 0x89, 0x4c, 0x50, 0x87, 0xe4, 0x9e, 0xaa, 0xe9, 0x23, 0x58, 0xb9, - 0x27, 0xb8, 0x49, 0x52, 0xc2, 0x25, 0x49, 0xa9, 0xc3, 0xba, 0xea, 0x1b, - 0x59, 0x85, 0x97, 0x05, 0xf6, 0xea, 0x87, 0x57, 0x46, 0x63, 0x6f, 0xab, - 0x49, 0x7f, 0x9a, 0x4f, 0x87, 0x8c, 0x0c, 0x38, 0x66, 0xe6, 0xdb, 0xb8, - 0x86, 0x01, 0x1a, 0x29, 0x93, 0x1c, 0x70, 0x92, 0x59, 0x51, 0x9f, 0x00, - 0x55, 0x7c, 0x10, 0xf6, 0x7d, 0x70, 0xe3, 0x16, 0x98, 0x9b, 0xb0, 0xa9, - 0x29, 0x03, 0x5d, 0x66, 0x7b, 0x9f, 0x1c, 0xdc, 0x08, 0x23, 0xd6, 0x5d, - 0x2f, 0xdf, 0x9d, 0xda, 0xb3, 0x27, 0xab, 0x1a, 0x07, 0x18, 0xac, 0x14, - 0x88, 0x6a, 0x1e, 0x26, 0xb9, 0x2d, 0xc4, 0x08, 0x88, 0xfc, 0x9b, 0x99, - 0x84, 0x15, 0x88, 0xd4, 0xea, 0xaa, 0x41, 0xcb, 0xa5, 0x6d, 0x2d, 0xa4, - 0x60, 0x09, 0xfc, 0xb8, 0x46, 0x8d, 0xb7, 0xa9, 0xc0, 0xb1, 0x4a, 0xa0, - 0xba, 0xd8, 0x0c, 0x37, 0x7b, 0x25, 0x69, 0x11, 0x9b, 0x70, 0x9f, 0x3c, - 0x64, 0xa0, 0xa8, 0xe7, 0xa6, 0x42, 0x53, 0x68, 0x5a, 0x50, 0x25, 0xee, - 0xa2, 0x67, 0xef, 0x03, 0xe1, 0x54, 0x97, 0x71, 0x6d, 0x20, 0x3d, 0xac, - 0x9e, 0xfa, 0x8c, 0x5e, 0x44, 0xf4, 0x4c, 0x7c, 0x3c, 0x8b, 0x78, 0x9a, - 0xc1, 0x0a, 0x13, 0xda, 0x0f, 0x47, 0xab, 0x65, 0x88, 0x21, 0x59, 0x72, - 0x9b, 0x38, 0xb6, 0x8e, 0x80, 0xc7, 0x88, 0x3b, 0xa3, 0xdd, 0xcf, 0x70, - 0x6b, 0xfd, 0xcd, 0xcb, 0x4d, 0xf1, 0xf1, 0x10, 0x25, 0x45, 0x40, 0x6f, - 0x39, 0x0d, 0x25, 0x91, 0x3a, 0xb3, 0x79, 0xb5, 0x7c, 0xc7, 0x80, 0x29, - 0xb0, 0x3e, 0xe0, 0xa5, 0xd2, 0xe9, 0xbb, 0x66, 0x6e, 0xab, 0xaa, 0x92, - 0x74, 0xc3, 0x7a, 0x38, 0x50, 0x5a, 0x49, 0xdb, 0xcd, 0xcc, 0xa8, 0x22, - 0xc4, 0x14, 0x6e, 0x23, 0x3a, 0xd7, 0xc3, 0xd3, 0x79, 0x30, 0x87, 0xd6, - 0xa1, 0x7d, 0x3a, 0x52, 0x57, 0x59, 0xfe, 0xe1, 0x29, 0xbe, 0xae, 0xa3, - 0xb2, 0xce, 0x44, 0x7c, 0xa4, 0x17, 0x48, 0x38, 0x25, 0xa2, 0x2d, 0xf8, - 0x26, 0xd3, 0xb6, 0x52, 0x05, 0xbd, 0xd2, 0x85, 0x40, 0xe2, 0x6c, 0x22, - 0x13, 0xe8, 0xce, 0xe1, 0x17, 0x06, 0x5b, 0xa5, 0xab, 0x6c, 0x2f, 0x6c, - 0x22, 0xf8, 0x99, 0x27, 0x60, 0x76, 0xa9, 0x58, 0x0a, 0x1a, 0x86, 0x21, - 0x75, 0xd4, 0x44, 0x11, 0xfd, 0x56, 0x1d, 0xec, 0x80, 0xc5, 0x5d, 0x1b, - 0x09, 0xa0, 0xe0, 0xe6, 0xbb, 0xca, 0xc9, 0xbc, 0x27, 0xdf, 0xb5, 0x1d, - 0x6a, 0x9f, 0x7c, 0x4f, 0xf2, 0x9a, 0x33, 0x45, 0x04, 0x6a, 0x16, 0x8c, - 0x91, 0x9f, 0xc1, 0xd2, 0x94, 0x26, 0x1c, 0xee, 0x67, 0x3b, 0xce, 0x54, - 0xa9, 0x9e, 0x99, 0x81, 0xaf, 0xbf, 0x14, 0x7f, 0xfb, 0x00, 0xf3, 0xfa, - 0x06, 0x34, 0x8a, 0x9c, 0x63, 0xa4, 0x65, 0xaf, 0xc4, 0xdb, 0x9e, 0x24, - 0xa8, 0x93, 0x8b, 0xc5, 0xee, 0xa7, 0xbc, 0x96, 0x71, 0x89, 0x5d, 0xce, - 0x9c, 0xef, 0xec, 0x56, 0x99, 0xb0, 0xfb, 0x7b, 0x7f, 0x67, 0x2e, 0xfb, - 0xa5, 0x3c, 0xf1, 0xa5, 0xf1, 0x5e, 0x88, 0x0f, 0x7b, 0x1a, 0x4d, 0x70, - 0xe8, 0x9e, 0x1f, 0xde, 0x7b, 0x40, 0x7e, 0x9f, 0x4d, 0xaa, 0x82, 0x11, - 0x06, 0xc4, 0x53, 0xbd, 0xa8, 0xb9, 0xdf, 0xe2, 0x50, 0x14, 0xd0, 0xe6, - 0x4c, 0x24, 0x41, 0x04, 0x19, 0xb1, 0xf2, 0xc8, 0xe4, 0xf9, 0x91, 0x07, - 0x3a, 0x07, 0x1f, 0xc7, 0x7d, 0x56, 0x4d, 0x96, 0xde, 0xb0, 0x20, 0x6d, - 0x1d, 0xd2, 0xa3, 0x66, 0xae, 0xa6, 0x93, 0x9f, 0xd9, 0x6f, 0xe3, 0x46, - 0xbb, 0xc1, 0x43, 0x73, 0x46, 0xc2, 0x57, 0x99, 0x7b, 0xcc, 0xed, 0xb1, - 0x8f, 0xe9, 0xd4, 0x3a, 0x9a, 0xc3, 0xb5, 0xf3, 0x0e, 0xa5, 0x76, 0x37, - 0x3d, 0x5d, 0xdf, 0xc1, 0x5b, 0xcd, 0xda, 0x1f, 0xd2, 0x34, 0x91, 0x07, - 0x3d, 0xc4, 0x1b, 0x03, 0xb8, 0x38, 0x95, 0x8d, 0x85, 0xf4, 0x23, 0xb5, - 0x74, 0x13, 0xbf, 0xa1, 0xcc, 0x91, 0xc9, 0x00, 0x14, 0xbe, 0xf2, 0x50, - 0x04, 0xf9, 0x59, 0xc7, 0xc4, 0xfc, 0xae, 0x2a, 0xfc, 0x33, 0x75, 0xf5, - 0xca, 0x4b, 0xdd, 0x57, 0x2b, 0x06, 0xf0, 0xed, 0x0e, 0x5a, 0x82, 0xfa, - 0x4d, 0xbf, 0xcc, 0xf6, 0xef, 0x83, 0x8e, 0xe7, 0xbf, 0x77, 0x91, 0x57, - 0x19, 0xe1, 0x15, 0xe1, 0x18, 0xfd, 0x0a, 0x81, 0xf4, 0x2a, 0x93, 0xb9, - 0xc6, 0xa6, 0xe6, 0xa8, 0x5d, 0xd8, 0x49, 0x08, 0x1e, 0xa9, 0xd2, 0xc5, - 0x54, 0xe0, 0xfa, 0xd5, 0xab, 0x63, 0x91, 0x72, 0x3d, 0x09, 0x44, 0xe0, - 0x52, 0xa4, 0x37, 0xe9, 0x88, 0x68, 0x33, 0x91, 0x78, 0x5f, 0xef, 0x3b, - 0xd3, 0xe6, 0x55, 0x9d, 0xc4, 0x04, 0x05, 0x5d, 0x7f, 0x4f, 0x6e, 0xf4, - 0x7e, 0xf8, 0xbf, 0x72, 0x56, 0xb1, 0x35, 0x7d, 0x7e, 0x27, 0x71, 0xd0, - 0x2f, 0x9f, 0x0d, 0xfa, 0x68, 0xdf, 0xb6, 0x37, 0x3e, 0x61, 0xdf, 0x22, - 0xe5, 0x7e, 0x8c, 0x96, 0x60, 0xb4, 0x76, 0x66, 0xe0, 0x95, 0x39, 0x35, - 0x49, 0x09, 0x1d, 0x36, 0x01, 0x5c, 0x99, 0xa1, 0x01, 0xe5, 0x99, 0x6f, - 0x3f, 0x3e, 0x8f, 0xb6, 0x3d, 0xd7, 0xe4, 0x57, 0x4c, 0x9e, 0x63, 0x1f, - 0x4b, 0x0b, 0xe1, 0xbf, 0xd6, 0x3c, 0x68, 0x6f, 0x89, 0x9c, 0xfe, 0x78, - 0x3b, 0xa3, 0xb0, 0x8b, 0x69, 0x8b, 0xc1, 0xc8, 0x6c, 0x4c, 0x5e, 0x96, - 0xa4, 0x80, 0x33, 0x81, 0x57, 0x2f, 0x80, 0x7d, 0xa0, 0xc5, 0xc0, 0x9e, - 0xb9, 0xb0, 0x98, 0x7b, 0x97, 0xb1, 0x8f, 0x55, 0x40, 0x5a, 0xae, 0x78, - 0xdd, 0xe0, 0xc2, 0x08, 0xba, 0x57, 0xe9, 0x24, 0x02, 0xe7, 0x07, 0xf7, - 0x40, 0x1c, 0x07, 0xba, 0x55, 0x39, 0x26, 0x9f, 0xdd, 0xaa, 0x38, 0xa5, - 0x38, 0x1d, 0x51, 0x88, 0x32, 0x35, 0xad, 0xad, 0x6a, 0x31, 0xdb, 0x70, - 0x63, 0x78, 0x9b, 0x4c, 0x80, 0xf0, 0x57, 0x62, 0x35, 0x03, 0x6b, 0xc7, - 0x17, 0xff, 0xb1, 0xb5, 0xd1, 0x77, 0x60, 0x0f, 0x36, 0x71, 0x81, 0xa1, - 0xd9, 0xb7, 0xbf, 0x31, 0x33, 0x6c, 0x07, 0x07, 0x2d, 0xd8, 0x10, 0xd6, - 0xdb, 0x18, 0x0e, 0x72, 0xcd, 0x83, 0x5f, 0xeb, 0x08, 0xbe, 0x9f, 0x80, - 0x8c, 0x67, 0x3a, 0xe6, 0x5c, 0x76, 0x98, 0xce, 0xa9, 0x35, 0x37, 0x32, - 0xf2, 0x3d, 0x86, 0xa6, 0xee, 0x11, 0xda, 0xf3, 0x37, 0x97, 0xd2, 0xa0, - 0x49, 0xfe, 0x4b, 0x37, 0x82, 0xe5, 0xd3, 0x95, 0x18, 0x9a, 0x91, 0x9b, - 0x64, 0x6d, 0x0d, 0xa3, 0xbf, 0x80, 0x44, 0x8e, 0x63, 0xc7, 0x51, 0xd9, - 0x4e, 0x85, 0xaa, 0x35, 0xc3, 0x1b, 0xa3, 0xa1, 0x16, 0xf9, 0xea, 0x88, - 0xff, 0x6e, 0xb6, 0x29, 0x71, 0xce, 0x3e, 0x22, 0x02, 0xa4, 0xae, 0x44, - 0xea, 0x8f, 0x7c, 0x15, 0xc6, 0x7f, 0x93, 0x01, 0xeb, 0xfe, 0xb3, 0xf0, - 0xc1, 0x5b, 0x0f, 0xb6, 0x81, 0xbc, 0x67, 0x2d, 0x82, 0x26, 0x04, 0xc5, - 0x53, 0xce, 0x60, 0xe4, 0x2b, 0x12, 0x93, 0x47, 0xed, 0xc9, 0xb9, 0xd9, - 0xec, 0xe6, 0x8e, 0x3d, 0x4b, 0x9c, 0x6e, 0xc5, 0x99, 0x5c, 0x28, 0x57, - 0xaa, 0x9f, 0x02, 0xab, 0x6d, 0x09, 0x81, 0xf0, 0xcd, 0x31, 0x93, 0x94, - 0xc3, 0x78, 0x3d, 0xe1, 0x2c, 0x53, 0x7b, 0xbd, 0x7e, 0xe8, 0xa8, 0xc6, - 0x79, 0x67, 0x53, 0xc5, 0x63, 0x67, 0x82, 0xdf, 0xef, 0x3b, 0x60, 0xdc, - 0x47, 0xef, 0x6f, 0xc8, 0xb9, 0xf3, 0x12, 0x0c, 0x9d, 0xda, 0xa1, 0x4c, - 0xa1, 0x7f, 0x98, 0x8d, 0xcc, 0xd5, 0x67, 0xa0, 0xa4, 0x34, 0xb8, 0xda, - 0x58, 0xdf, 0xbb, 0xdc, 0x87, 0x81, 0xb0, 0xaf, 0xbb, 0x46, 0xef, 0x97, - 0x12, 0xa9, 0xa6, 0x22, 0xb6, 0xda, 0x0d, 0xa4, 0x86, 0x7f, 0xf7, 0x1a, - 0x5c, 0x21, 0xc1, 0xe1, 0x27, 0xc2, 0xe1, 0x5d, 0x72, 0xff, 0x03, 0x80, - 0xd3, 0x38, 0x57, 0xaa, 0x26, 0x25, 0xaf, 0x1b, 0x80, 0x1d, 0xed, 0x3d, - 0x41, 0x81, 0xd8, 0x23, 0xf1, 0xb8, 0x13, 0x17, 0xce, 0xf4, 0xe7, 0x73, - 0x41, 0x38, 0x6b, 0x72, 0xeb, 0xc4, 0xf1, 0x36, 0x92, 0xb7, 0x6d, 0xd9, - 0x9d, 0xee, 0xfa, 0x17, 0x4e, 0xd0, 0x5e, 0x30, 0xc6, 0xa0, 0x4e, 0xb8, - 0x78, 0x55, 0x17, 0xb2, 0xaa, 0xdb, 0xf2, 0x6d, 0x19, 0x85, 0x95, 0x22, - 0x6f, 0x8a, 0x64, 0x8c, 0x1d, 0x06, 0xc8, 0x02, 0x8d, 0x3e, 0x33, 0xd6, - 0xe3, 0x77, 0x23, 0xa1, 0x66, 0x96, 0x9b, 0x26, 0x47, 0x73, 0xa5, 0xbe, - 0xc4, 0xc6, 0xab, 0x65, 0xc2, 0x5a, 0xd3, 0xf5, 0xda, 0x20, 0x22, 0x97, - 0x10, 0x7a, 0x5e, 0x62, 0x4d, 0x54, 0x45, 0xec, 0x21, 0x69, 0x8e, 0x14, - 0xd8, 0xdb, 0x39, 0xd2, 0x32, 0x54, 0xe0, 0x91, 0x80, 0x68, 0x47, 0x25, - 0xb9, 0x95, 0x00, 0xb1, 0x1c, 0x1b, 0xde, 0x00, 0xcb, 0x12, 0xc9, 0xff, - 0x5f, 0x5f, 0xd2, 0x83, 0x8f, 0xcb, 0x8d, 0x93, 0x72, 0x0f, 0x5e, 0x16, - 0x53, 0xb9, 0x4f, 0x2d, 0x32, 0x5d, 0xdf, 0x4f, 0xad, 0xa9, 0x43, 0xee, - 0xd5, 0xd6, 0xc8, 0xbc, 0xbb, 0x34, 0xd9, 0x4e, 0x26, 0xd7, 0xed, 0xf5, - 0xfa, 0x18, 0x78, 0xc7, 0xda, 0x6b, 0xf1, 0xf7, 0xc9, 0x74, 0xe2, 0xd7, - 0x60, 0x89, 0xb0, 0x21, 0x87, 0x12, 0xff, 0x9f, 0x5c, 0x04, 0x80, 0x0f, - 0x47, 0x01, 0xf4, 0xb5, 0x6a, 0x9d, 0x5c, 0xc0, 0x82, 0x77, 0x33, 0x0b, - 0x99, 0x00, 0xfe, 0x26, 0x2c, 0xba, 0x50, 0x08, 0x04, 0xb5, 0xe4, 0xed, - 0x66, 0x03, 0xca, 0xd5, 0xc0, 0x7a, 0x64, 0xc0, 0x1c, 0xbf, 0xe1, 0x4a, - 0xbd, 0x92, 0xbd, 0x7d, 0x8c, 0x3f, 0x74, 0xe9, 0x5a, 0x8e, 0xad, 0x98, - 0x13, 0xde, 0xde, 0x8b, 0x48, 0x0f, 0x2a, 0xdf, 0xf9, 0x5d, 0x23, 0xd4, - 0x05, 0x12, 0x7e, 0x5e, 0x8e, 0xd3, 0x3a, 0xba, 0x5f, 0x50, 0xa7, 0xdc, - 0x01, 0x29, 0x6c, 0x75, 0x86, 0xe4, 0x29, 0xb0, 0x61, 0x3a, 0x2d, 0xc7, - 0x78, 0xae, 0xce, 0x09, 0x57, 0x0a, 0xd9, 0x45, 0x77, 0x6b, 0x18, 0x8b, - 0x2b, 0x9f, 0xd7, 0x65, 0x12, 0xc5, 0x05, 0x02, 0x7e, 0xb5, 0xd3, 0x5a, - 0x50, 0xf0, 0x42, 0x38, 0x35, 0xfa, 0x4f, 0xa0, 0xe2, 0x2e, 0x45, 0x2a, - 0xb3, 0x38, 0x6d, 0x6a, 0xa0, 0xa5, 0xd6, 0xa3, 0x6b, 0x33, 0x4f, 0xad, - 0x59, 0x4a, 0xbb, 0x32, 0xca, 0x27, 0x7e, 0x11, 0xd5, 0xe9, 0x04, 0x40, - 0xf8, 0x3d, 0x0a, 0xc7, 0x14, 0xa2, 0xee, 0x11, 0x59, 0xd9, 0xab, 0xb3, - 0xfb, 0x70, 0x7d, 0xc5, 0x8e, 0xf0, 0x64, 0xb2, 0xe3, 0x3b, 0xd2, 0xec, - 0xe4, 0x87, 0xa7, 0xc6, 0xf4, 0x0f, 0xca, 0x23, 0x6d, 0x4c, 0xff, 0xd8, - 0x73, 0x76, 0x83, 0xcf, 0x56, 0x2c, 0x8f, 0xe1, 0x47, 0xd0, 0x6d, 0x34, - 0xf7, 0x86, 0xc0, 0xc1, 0x19, 0x7a, 0x7d, 0xa3, 0x79, 0xc5, 0xbe, 0xf5, - 0xee, 0x88, 0x4a, 0x74, 0xe6, 0x9a, 0x81, 0xa4, 0x0b, 0x81, 0xad, 0x8b, - 0xc0, 0x28, 0xeb, 0x23, 0xe8, 0x97, 0xe1, 0xe8, 0xa1, 0x91, 0xdc, 0xdc, - 0x1c, 0xb6, 0xe3, 0xa9, 0xaa, 0xaa, 0xc6, 0xfd, 0x7e, 0xe4, 0x09, 0x6f, - 0x50, 0x3a, 0xcf, 0x29, 0x44, 0x2e, 0x8b, 0x30, 0x3f, 0x9e, 0x3d, 0xa3, - 0x49, 0x61, 0x3e, 0xd2, 0xbc, 0xcc, 0xd6, 0xaf, 0xb5, 0x02, 0xe3, 0x5e, - 0x94, 0x36, 0xbb, 0x9d, 0xa7, 0xe8, 0x59, 0x9a, 0xed, 0x31, 0x1a, 0x1d, - 0x58, 0xe1, 0x78, 0x2b, 0xd4, 0x60, 0x6e, 0xf1, 0x6d, 0x7f, 0xbb, 0x59, - 0x08, 0xbf, 0xaf, 0x27, 0xa7, 0x5a, 0x13, 0x39, 0x4c, 0x4a, 0x3e, 0x5c, - 0x15, 0x6a, 0x24, 0xbf, 0x28, 0x8d, 0x52, 0x8a, 0x8e, 0x20, 0x81, 0x90, - 0x3c, 0x9e, 0x3f, 0x82, 0x37, 0x10, 0x69, 0x77, 0x3b, 0x55, 0xb1, 0xff, - 0xe8, 0x8e, 0xb0, 0x4b, 0xbc, 0x5d, 0x61, 0x06, 0xfd, 0xa5, 0x41, 0xc0, - 0x15, 0xdc, 0x52, 0x0f, 0x99, 0x9f, 0xb4, 0xa8, 0x36, 0xd8, 0x31, 0xa0, - 0x2b, 0x6b, 0x2d, 0x2f, 0x7f, 0x85, 0xee, 0x90, 0x03, 0xc8, 0x10, 0x14, - 0x4e, 0xd8, 0x8b, 0xe5, 0x1f, 0xf6, 0xed, 0xd2, 0xfe, 0x13, 0x55, 0x91, - 0x21, 0xf0, 0x83, 0x36, 0x87, 0xc0, 0xb1, 0x9f, 0xe1, 0x5e, 0x50, 0xb7, - 0x78, 0x28, 0x41, 0xdb, 0xa4, 0x59, 0xb1, 0x77, 0x43, 0x3c, 0x0e, 0x26, - 0xf4, 0x74, 0x1a, 0x84, 0xa1, 0x53, 0xfd, 0x6b, 0x24, 0xa7, 0x26, 0xcf, - 0xad, 0x43, 0xb7, 0xf2, 0x36, 0x9a, 0xe3, 0xde, 0xc0, 0x52, 0x82, 0xd8, - 0x04, 0xa7, 0x13, 0xa1, 0x8f, 0x3f, 0x87, 0x37, 0x94, 0xad, 0x1c, 0x3a, - 0x15, 0x6c, 0xd1, 0x1b, 0x9f, 0x0e, 0x34, 0x46, 0xae, 0x7a, 0x31, 0xd1, - 0x7b, 0xc4, 0x5c, 0x5e, 0x23, 0x96, 0xa8, 0xbf, 0x0e, 0xaa, 0x25, 0xf5, - 0x83, 0x50, 0x39, 0xba, 0x7a, 0xcc, 0x6a, 0x95, 0xe6, 0x5b, 0xe0, 0x46, - 0x9a, 0x73, 0x90, 0xeb, 0x75, 0x56, 0x0d, 0x57, 0x78, 0x9c, 0x1e, 0xcd, - 0x56, 0xa0, 0x8b, 0x43, 0x47, 0x4f, 0xdc, 0x67, 0x09, 0x55, 0x36, 0xe8, - 0x31, 0x06, 0x77, 0x74, 0x8f, 0x9b, 0x74, 0x6c, 0x04, 0xb3, 0x95, 0xf5, - 0x15, 0xb6, 0xd2, 0x54, 0xff, 0xde, 0xae, 0x4d, 0xae, 0x0a, 0xb1, 0x0c, - 0x88, 0xcf, 0x18, 0x9e, 0xf2, 0x18, 0x06, 0x73, 0xfb, 0x00, 0x60, 0xb8, - 0x72, 0x0f, 0xe5, 0xb6, 0xf2, 0xec, 0x24, 0x2c, 0xe4, 0x15, 0xfa, 0xa2, - 0x0a, 0xe9, 0x4f, 0x1f, 0x9b, 0xf9, 0x42, 0x7a, 0x0f, 0xb2, 0x9a, 0xc9, - 0xdb, 0x63, 0x8f, 0x24, 0x23, 0xaf, 0x8f, 0xb7, 0x44, 0x6c, 0x90, 0x19, - 0xbf, 0xa8, 0xcc, 0x5c, 0x6a, 0x9e, 0x15, 0xe9, 0x59, 0xd1, 0x6f, 0x7e, - 0x72, 0x6c, 0x3d, 0x66, 0x64, 0xfd, 0xdd, 0xeb, 0x9d, 0x0d, 0x2e, 0xab, - 0x60, 0x38, 0x60, 0x66, 0x6f, 0xde, 0x8e, 0xef, 0xe6, 0x51, 0x3b, 0x0a, - 0xd6, 0x7c, 0x27, 0xef, 0xe1, 0xaf, 0xca, 0x39, 0x53, 0xc0, 0xe2, 0x0d, - 0x89, 0x27, 0xf5, 0x98, 0xac, 0xec, 0x9d, 0xd3, 0x76, 0x5b, 0xd4, 0xdd, - 0xb1, 0xab, 0xed, 0x87, 0x16, 0x64, 0xd8, 0xbf, 0x29, 0xb0, 0x85, 0xb5, - 0x46, 0x11, 0x93, 0x38, 0xd0, 0x9f, 0xc8, 0xf9, 0x37, 0x73, 0x9c, 0x41, - 0x20, 0x5a, 0xe4, 0x96, 0xc3, 0x81, 0xda, 0xd4, 0x38, 0xc4, 0xbb, 0x9d, - 0xc6, 0x01, 0xc1, 0x29, 0xd5, 0xe7, 0x95, 0x99, 0x5d, 0xcc, 0x92, 0xd6, - 0x4d, 0x3c, 0x2b, 0xa0, 0x41, 0xac, 0xd2, 0xcc, 0xa3, 0x2c, 0xac, 0x67, - 0x45, 0x51, 0x08, 0x7f, 0x34, 0x34, 0xec, 0x34, 0xeb, 0x68, 0x56, 0x68, - 0x16, 0x50, 0x06, 0x3e, 0x74, 0x83, 0x6f, 0x8e, 0x9d, 0x84, 0xc7, 0x15, - 0x18, 0xba, 0x37, 0x5e, 0x0a, 0xdb, 0xeb, 0x64, 0xd9, 0x37, 0x2d, 0x78, - 0x25, 0xe3, 0x5b, 0x7a, 0xbd, 0x76, 0x79, 0xde, 0x98, 0xde, 0x62, 0x45, - 0x37, 0x06, 0x7c, 0x58, 0x3e, 0xaa, 0xec, 0xb4, 0x25, 0x53, 0xf5, 0x5b, - 0xd7, 0x9b, 0x95, 0x2e, 0xc7, 0xf3, 0xdd, 0x1d, 0x37, 0x4b, 0x01, 0x4b, - 0xf6, 0xcd, 0xda, 0x93, 0x47, 0x79, 0x35, 0xb2, 0xa6, 0x90, 0xc6, 0x89, - 0xa8, 0x03, 0x9c, 0x65, 0x2d, 0x5a, 0xc8, 0x23, 0xed, 0x8b, 0xee, 0x0e, - 0x83, 0x11, 0x87, 0x4a, 0xf0, 0xbb, 0x04, 0xd2, 0x31, 0x18, 0xc6, 0x38, - 0xb1, 0x7a, 0xe0, 0xf7, 0x7b, 0xd3, 0xb9, 0x7a, 0x2c, 0xbf, 0xfc, 0x83, - 0xf8, 0xb3, 0x0c, 0xf1, 0x0e, 0xde, 0xf5, 0x69, 0xb2, 0xa1, 0x04, 0xc8, - 0x0c, 0xbb, 0x10, 0x61, 0xd6, 0x72, 0xd7, 0x95, 0x19, 0x3f, 0xf2, 0x42, - 0x84, 0x61, 0x29, 0xa9, 0x20, 0x7f, 0xba, 0xca, 0x1c, 0xdf, 0x1f, 0xb6, - 0xa8, 0x85, 0x46, 0x67, 0x88, 0xe9, 0x5b, 0x96, 0xf8, 0x5c, 0xb5, 0x50, - 0x92, 0x79, 0x4e, 0x53, 0x9b, 0xbd, 0xa6, 0x22, 0x71, 0x38, 0xbd, 0x52, - 0xc1, 0xcb, 0x2c, 0x0b, 0x67, 0xa0, 0x9a, 0x74, 0xbd, 0xc2, 0xd9, 0x76, - 0x53, 0x1c, 0x84, 0xd1, 0x35, 0x51, 0xb1, 0x24, 0x52, 0x12, 0x69, 0xe0, - 0x18, 0xc2, 0x78, 0x5e, 0x36, 0xd6, 0xb6, 0x67, 0x8e, 0x8f, 0xc3, 0x95, - 0x85, 0x04, 0x49, 0xcd, 0xad, 0xd5, 0xac, 0x3a, 0x7c, 0x10, 0x46, 0xd8, - 0xbe, 0xe8, 0x39, 0x86, 0x70, 0x9b, 0x6f, 0x08, 0xf2, 0x31, 0xc2, 0x94, - 0xc6, 0xf6, 0xf1, 0xad, 0xe5, 0x4d, 0x67, 0x26, 0x4c, 0x95, 0x05, 0xe6, - 0xf6, 0x9e, 0x98, 0xce, 0xa4, 0xd6, 0x19, 0x4f, 0xd5, 0xe6, 0xfc, 0x26, - 0xd3, 0xf3, 0xf9, 0xef, 0x6a, 0x6a, 0xa1, 0x69, 0x9e, 0x4c, 0x46, 0x86, - 0xd9, 0xb0, 0xcd, 0x39, 0xed, 0xf2, 0xaf, 0x75, 0xab, 0x7c, 0x7c, 0x83, - 0x17, 0x77, 0xf3, 0xaf, 0x29, 0x66, 0x02, 0x0e, 0x19, 0x50, 0xc7, 0xb0, - 0x7b, 0x6c, 0x1a, 0xa9, 0x9f, 0x66, 0xb5, 0x2c, 0x8d, 0x50, 0x10, 0xad, - 0x2c, 0x7a, 0xfe, 0xea, 0x14, 0x38, 0xbf, 0x1f, 0xf1, 0x8b, 0x51, 0xdf, - 0x66, 0x66, 0xff, 0x1b, 0xcd, 0x39, 0x09, 0x25, 0x64, 0x58, 0xc3, 0xfd, - 0xf9, 0x7e, 0x84, 0x91, 0x95, 0x1d, 0xf4, 0xb7, 0x66, 0xb2, 0x65, 0x53, - 0x26, 0xa1, 0xab, 0xe6, 0x56, 0x86, 0xe3, 0x6f, 0x41, 0x42, 0xba, 0xf2, - 0x6f, 0x21, 0x2a, 0x88, 0x8e, 0x80, 0x19, 0x5f, 0xcc, 0xd1, 0x64, 0x90, - 0x5a, 0x7d, 0xdc, 0xe1, 0xcd, 0x57, 0xb5, 0x89, 0x47, 0xf8, 0x84, 0xb0, - 0x08, 0xa2, 0xcd, 0x2b, 0x43, 0x17, 0x9b, 0x4b, 0x76, 0xef, 0xdd, 0x59, - 0x3c, 0x63, 0x84, 0x14, 0x79, 0xac, 0xcc, 0x69, 0x9a, 0xd7, 0x8d, 0x50, - 0xde, 0xa9, 0xd8, 0x11, 0x75, 0xcd, 0xef, 0x7e, 0x7c, 0xeb, 0x3d, 0xaa, - 0xf0, 0x75, 0x30, 0xe4, 0x24, 0x71, 0x25, 0x02, 0x0a, 0x19, 0x88, 0x87, - 0xa6, 0x98, 0x78, 0x2e, 0x79, 0x11, 0x3e, 0x60, 0xe0, 0x31, 0x23, 0xbc, - 0xdb, 0x35, 0x2b, 0x74, 0xeb, 0x60, 0x18, 0x32, 0xb1, 0x22, 0xdc, 0x93, - 0x36, 0x93, 0x1c, 0x87, 0xfd, 0xca, 0xa8, 0x3d, 0x3e, 0xc2, 0xfe, 0x6d, - 0xf1, 0x03, 0x61, 0xc8, 0x07, 0x1f, 0x18, 0x93, 0x72, 0x3c, 0xf7, 0xa4, - 0x19, 0xe8, 0x37, 0xbb, 0x82, 0xab, 0x97, 0x76, 0x17, 0xa5, 0xa3, 0x4b, - 0x54, 0x6a, 0xac, 0x80, 0xac, 0x6e, 0x55, 0x39, 0x09, 0x11, 0xfc, 0x54, - 0xaa, 0xbb, 0x25, 0x9d, 0xf3, 0xc9, 0xa4, 0xa4, 0x8c, 0x67, 0x95, 0x1c, - 0x24, 0x30, 0x8d, 0x27, 0x56, 0xde, 0xa1, 0xd4, 0x8e, 0x50, 0x7f, 0xd1, - 0x93, 0x39, 0xad, 0x39, 0x10, 0x8d, 0x6c, 0x40, 0xe5, 0x6c, 0xab, 0xb4, - 0x4b, 0xa5, 0x5b, 0x6c, 0x29, 0xea, 0x12, 0x40, 0x16, 0xa6, 0xdb, 0xfb, - 0x61, 0x1a, 0x79, 0x96, 0x05, 0xd2, 0x10, 0xd2, 0x86, 0xbf, 0xef, 0x8d, - 0xba, 0x75, 0xc2, 0xd9, 0xcb, 0xd7, 0xc1, 0xe4, 0xc4, 0xa0, 0x2e, 0x98, - 0xbe, 0xbc, 0x5c, 0x9a, 0xcc, 0xbf, 0xbe, 0x91, 0x1d, 0x27, 0x6c, 0x77, - 0xeb, 0xe3, 0x2b, 0x37, 0x8d, 0x34, 0x36, 0x67, 0x84, 0x5f, 0x72, 0x7a, - 0x9b, 0x19, 0x70, 0x79, 0x56, 0x14, 0xd9, 0x87, 0x00, 0x6f, 0x70, 0xc3, - 0xe7, 0x0c, 0x77, 0xd1, 0x11, 0x09, 0x1d, 0x4a, 0xd7, 0x07, 0xc4, 0x98, - 0xf5, 0x43, 0x4c, 0x55, 0x04, 0xa0, 0x1e, 0xae, 0xda, 0xd4, 0xb3, 0xa4, - 0xad, 0xa2, 0xdc, 0xf3, 0xd7, 0xb4, 0xcf, 0x1e, 0x6b, 0x85, 0x5d, 0x10, - 0xbb, 0x75, 0x40, 0x80, 0x74, 0x3d, 0x27, 0x7d, 0x19, 0xa9, 0xe4, 0xb6, - 0x27, 0xaf, 0xc2, 0x60, 0x0c, 0xa0, 0xdb, 0xb4, 0x14, 0x91, 0xb4, 0x21, - 0x7b, 0xa3, 0xb0, 0x81, 0xd6, 0x65, 0xb4, 0x7b, 0x3b, 0xb6, 0xf4, 0x07, - 0xf1, 0xd1, 0x53, 0xfb, 0x27, 0x4f, 0x61, 0x8c, 0x81, 0x9f, 0x25, 0x89, - 0x9a, 0x61, 0x63, 0x2f, 0x74, 0x5c, 0x96, 0xe7, 0x73, 0x83, 0x19, 0x11, - 0x6b, 0xe3, 0x8d, 0x33, 0x9e, 0x04, 0xfa, 0x3c, 0xe5, 0x97, 0xf5, 0xf4, - 0x6c, 0x91, 0x9f, 0xf8, 0x8f, 0xdf, 0x02, 0xb5, 0xd3, 0x35, 0x68, 0xa4, - 0x33, 0xfa, 0x19, 0x6e, 0x13, 0x52, 0xa1, 0x3a, 0xc8, 0xb1, 0xb5, 0x2a, - 0xd4, 0xc1, 0xd2, 0x2d, 0x1a, 0x8f, 0x1f, 0xd7, 0x05, 0xb2, 0x93, 0x1e, - 0xd5, 0xe8, 0x3d, 0xe5, 0x49, 0xa6, 0x8c, 0x7e, 0xf9, 0x57, 0x98, 0x36, - 0xa4, 0xcc, 0x62, 0xa3, 0x2a, 0xb4, 0xbe, 0x81, 0xff, 0xcf, 0xe7, 0x4f, - 0x0b, 0xf8, 0x61, 0x1b, 0x77, 0xd4, 0x78, 0x75, 0x4b, 0xc1, 0x18, 0x7b, - 0x3c, 0x42, 0x6f, 0x7d, 0x64, 0x1f, 0x72, 0x65, 0xaf, 0x69, 0x08, 0x56, - 0xcc, 0x77, 0x4f, 0x85, 0xe3, 0x8b, 0x90, 0xc2, 0x6d, 0x77, 0x20, 0x9d, - 0x5a, 0x69, 0xa5, 0x70, 0xcf, 0x81, 0x6b, 0x4e, 0xc4, 0x44, 0x3b, 0xb3, - 0x90, 0xdc, 0x36, 0x78, 0xe9, 0xe0, 0xe7, 0xb9, 0xdb, 0xec, 0x49, 0x6f, - 0x04, 0x44, 0xfb, 0xf2, 0xfd, 0x69, 0xd2, 0xe8, 0x2a, 0xde, 0xd6, 0xa2, - 0xf1, 0x8f, 0x9f, 0xe7, 0x19, 0x4e, 0x85, 0x38, 0xc5, 0x05, 0xed, 0x3c, - 0xcb, 0x8b, 0x7c, 0x78, 0x7c, 0x9c, 0xf6, 0xdd, 0x21, 0xd2, 0xdb, 0x5f, - 0x28, 0xd5, 0x85, 0x4e, 0xba, 0x98, 0x9a, 0x21, 0xf0, 0x80, 0xed, 0x69, - 0xd2, 0xc1, 0xf3, 0x4d, 0x4c, 0x60, 0xaa, 0x33, 0xf4, 0x6d, 0x45, 0x81, - 0x86, 0xa7, 0x96, 0x9b, 0xd7, 0xdd, 0x1e, 0xf3, 0xe0, 0x67, 0x6c, 0xe1, - 0xed, 0x6e, 0x57, 0x03, 0x3d, 0xd7, 0x02, 0xb2, 0x93, 0x4f, 0x30, 0xba, - 0xe4, 0x43, 0x82, 0xfd, 0x95, 0x7d, 0x21, 0xfb, 0x56, 0xa3, 0xf8, 0x92, - 0xea, 0xd0, 0xdf, 0x98, 0x6b, 0x33, 0x1f, 0xf9, 0x9e, 0xe8, 0xc9, 0x1d, - 0xcc, 0xfb, 0x95, 0xb1, 0x1f, 0x5e, 0x9a, 0x3e, 0x86, 0x3c, 0x6f, 0xfa, - 0x39, 0x97, 0x31, 0x29, 0x98, 0xd9, 0x89, 0x94, 0xe3, 0xbf, 0xd2, 0xae, - 0xe8, 0xd2, 0x0c, 0x97, 0xad, 0xae, 0x3c, 0x1e, 0x51, 0x2a, 0xff, 0x98, - 0xec, 0x05, 0x63, 0xd1, 0xcc, 0xa7, 0x05, 0x9f, 0xe3, 0xe4, 0xfa, 0x12, - 0x43, 0x89, 0xf8, 0x4a, 0x3a, 0x66, 0x82, 0xcf, 0x7e, 0x0a, 0x99, 0x1a, - 0x41, 0xef, 0xb2, 0xed, 0x2a, 0xf3, 0xb1, 0x3d, 0xba, 0xc4, 0x03, 0x7e, - 0x8c, 0x91, 0xb1, 0x97, 0xb6, 0x1b, 0x5d, 0x8f, 0x43, 0x3a, 0x7f, 0x82, - 0x25, 0xeb, 0xef, 0x4f, 0xb2, 0x90, 0xb1, 0xd3, 0xf8, 0x85, 0xdd, 0x0f, - 0x9e, 0xb6, 0xd7, 0xd5, 0x88, 0xcc, 0x86, 0xa6, 0x05, 0xc3, 0x87, 0xa3, - 0xb2, 0x43, 0xc1, 0xda, 0x58, 0x92, 0x95, 0x6d, 0xb8, 0x1e, 0x09, 0x48, - 0x4d, 0x08, 0x28, 0xb5, 0x05, 0x2c, 0x02, 0xc6, 0xda, 0xc1, 0x18, 0xc3, - 0x54, 0x4a, 0x47, 0x8a, 0xfc, 0xe2, 0x87, 0x04, 0x89, 0x07, 0x98, 0x13, - 0xed, 0x96, 0xcc, 0xbe, 0x24, 0xaf, 0xee, 0xba, 0xfb, 0xc6, 0x3d, 0x82, - 0x47, 0x22, 0x20, 0x75, 0x21, 0xee, 0x1c, 0x30, 0x4e, 0x21, 0x72, 0x23, - 0x3d, 0x5b, 0x7c, 0xd8, 0x8b, 0x0d, 0x6b, 0x3a, 0xf1, 0xd9, 0x3b, 0x1b, - 0xf4, 0xda, 0x4a, 0xf7, 0x8f, 0x38, 0x0e, 0x9e, 0xe3, 0xfe, 0x4e, 0xc5, - 0x7a, 0x14, 0x91, 0x90, 0xba, 0x8d, 0x9c, 0xe8, 0x47, 0xce, 0xbd, 0x2b, - 0x23, 0xeb, 0xf8, 0x5a, 0x51, 0xc5, 0xc2, 0x14, 0x1c, 0x78, 0x78, 0xbf, - 0xa2, 0xf3, 0x87, 0xc0, 0x10, 0x9a, 0xd7, 0x35, 0xbd, 0xdf, 0xab, 0x7e, - 0x0e, 0x55, 0xa8, 0x2f, 0xb3, 0x3f, 0x86, 0x19, 0x42, 0x09, 0x6c, 0x65, - 0x99, 0x39, 0x4c, 0x43, 0x5f, 0xf3, 0xf0, 0xb4, 0x37, 0x1b, 0xb2, 0x67, - 0xb1, 0x25, 0x6b, 0x85, 0x60, 0xc4, 0x95, 0xef, 0x92, 0x45, 0xc6, 0x75, - 0x73, 0x08, 0x52, 0x65, 0x4b, 0x97, 0x3c, 0xd5, 0x6c, 0xb2, 0xbf, 0x46, - 0x28, 0x69, 0x65, 0xad, 0x7e, 0x23, 0x0c, 0x5d, 0x84, 0x3c, 0x3d, 0x96, - 0x02, 0xc1, 0xa4, 0x27, 0x58, 0x90, 0x15, 0x41, 0x6a, 0x47, 0xf7, 0xd8, - 0x49, 0x6e, 0x78, 0x75, 0x37, 0x55, 0x41, 0xbe, 0x1a, 0x61, 0x49, 0x62, - 0xa7, 0xa0, 0xff, 0xae, 0xd7, 0x44, 0xba, 0x8f, 0xcb, 0x80, 0xbf, 0xa7, - 0x6a, 0xf4, 0xea, 0x1b, 0xc1, 0xdd, 0x1f, 0xb4, 0xe9, 0x46, 0x6f, 0x9a, - 0x3d, 0xb7, 0xd9, 0xde, 0x8c, 0x6f, 0xd2, 0x4a, 0x9e, 0xa1, 0x8c, 0xd9, - 0x36, 0x21, 0x2c, 0x7a, 0xd4, 0x85, 0x1e, 0x4f, 0x7e, 0x83, 0x97, 0xda, - 0xe6, 0xa4, 0xac, 0x6f, 0xe8, 0xdd, 0xe4, 0xc6, 0x24, 0x63, 0xcd, 0x0c, - 0x73, 0x17, 0x86, 0xa4, 0x86, 0xe0, 0x23, 0xdc, 0xaa, 0xa2, 0x8a, 0xea, - 0x80, 0xff, 0xfd, 0xcd, 0x74, 0x1c, 0x74, 0xa1, 0x65, 0xa3, 0x86, 0xdf, - 0x75, 0x23, 0x8c, 0x7f, 0xc3, 0x3d, 0x1b, 0x40, 0x9d, 0x77, 0x28, 0xcf, - 0x42, 0xd5, 0xa8, 0x0d, 0x1d, 0x83, 0xa6, 0x3b, 0xe7, 0x22, 0x68, 0x95, - 0x66, 0x5c, 0x06, 0xba, 0x8b, 0x18, 0x95, 0xa1, 0x6f, 0x8f, 0xfa, 0xd3, - 0x0a, 0x39, 0xa4, 0x8d, 0x99, 0xd8, 0xb5, 0x7c, 0xcd, 0x93, 0x36, 0x8c, - 0xae, 0x09, 0xba, 0xbe, 0x7f, 0x5d, 0x7a, 0x70, 0xc8, 0xda, 0x51, 0x7c, - 0x3a, 0xd4, 0x2b, 0x33, 0x37, 0x63, 0xed, 0x4a, 0x48, 0xf8, 0xe6, 0xe0, - 0xf0, 0x2c, 0x70, 0x48, 0xa6, 0x5f, 0xdb, 0x88, 0xc8, 0x99, 0x71, 0x1d, - 0x34, 0x54, 0xe9, 0xf0, 0x06, 0x56, 0x70, 0x4a, 0xbc, 0x01, 0xfd, 0x88, - 0x7d, 0x2b, 0xa0, 0x5b, 0x2b, 0x4d, 0xa9, 0xc6, 0x97, 0xd2, 0xc9, 0x64, - 0xa2, 0x7f, 0xe0, 0xc9, 0x0e, 0xac, 0x43, 0x94, 0x5a, 0x75, 0xf6, 0x97, - 0xad, 0xbe, 0x38, 0xe3, 0x72, 0x15, 0x44, 0x22, 0x33, 0xa5, 0xe1, 0x56, - 0x6b, 0x6c, 0x8c, 0x28, 0x56, 0xec, 0x6b, 0x29, 0xc3, 0x8c, 0x42, 0x6b, - 0x5d, 0x3e, 0xe6, 0xc3, 0xe6, 0x15, 0x32, 0x84, 0x23, 0xf6, 0x57, 0xa7, - 0x16, 0xc2, 0x0c, 0x11, 0x12, 0x4f, 0xee, 0x17, 0xb9, 0x2b, 0xc2, 0xd6, - 0x28, 0xc1, 0x47, 0x59, 0x1c, 0x70, 0x59, 0xd2, 0x2e, 0xec, 0x21, 0x5c, - 0xe3, 0x7f, 0x82, 0x99, 0x26, 0x98, 0x0e, 0x07, 0x5a, 0xf3, 0x18, 0x36, - 0x25, 0x4f, 0x95, 0x67, 0x11, 0x58, 0xe1, 0x40, 0xe9, 0xf0, 0x42, 0xf9, - 0x54, 0x36, 0x77, 0xb6, 0xdf, 0xd1, 0xe7, 0x6a, 0x44, 0xaa, 0xb3, 0x8c, - 0x07, 0x64, 0xf3, 0xc1, 0xb5, 0xbf, 0xbf, 0x57, 0x74, 0x10, 0x33, 0x4c, - 0xfb, 0xef, 0x01, 0x41, 0xed, 0x37, 0xbe, 0xe6, 0xeb, 0xbc, 0xb8, 0x54, - 0x80, 0x7e, 0x0a, 0x9e, 0x47, 0xc9, 0x7f, 0xd2, 0x74, 0x5d, 0x93, 0xad, - 0x2b, 0xb4, 0x5d, 0xa4, 0x8d, 0xba, 0x0f, 0xe7, 0x22, 0x11, 0x22, 0xd3, - 0xc8, 0x3f, 0x3e, 0xbf, 0xac, 0x18, 0xaf, 0x87, 0x11, 0xb1, 0xd6, 0xe5, - 0xc5, 0xdc, 0xc7, 0xb7, 0xce, 0x5c, 0x4c, 0x57, 0x52, 0x05, 0xdd, 0xd3, - 0xf0, 0x16, 0x50, 0xee, 0x80, 0xd0, 0xe9, 0xc4, 0x12, 0xb8, 0x99, 0xcb, - 0xbe, 0x7e, 0x8d, 0x57, 0x8b, 0x83, 0x92, 0x9a, 0x24, 0x29, 0x1d, 0xdd, - 0xe6, 0x6f, 0xfa, 0x35, 0x59, 0x1f, 0xce, 0x45, 0xee, 0x87, 0xb2, 0x3d, - 0xea, 0x35, 0x1a, 0xff, 0x01, 0xea, 0xda, 0xd0, 0xc0, 0xd6, 0xf4, 0xd7, - 0x59, 0xdc, 0x81, 0xef, 0x2f, 0xb3, 0xdf, 0x32, 0x12, 0x21, 0x8a, 0xac, - 0x31, 0x8b, 0xdd, 0x51, 0x02, 0x11, 0xc2, 0xfe, 0x9d, 0xd8, 0xb1, 0xf3, - 0xb8, 0x56, 0x0d, 0x19, 0x85, 0x5d, 0xe7, 0x32, 0x61, 0x80, 0x94, 0x4c, - 0x18, 0x0d, 0xa8, 0xb8, 0xd8, 0x93, 0x3c, 0x34, 0xf0, 0x1d, 0x90, 0xf7, - 0xfe, 0xdc, 0x75, 0x21, 0x12, 0xe2, 0xf2, 0xb7, 0x2b, 0xd9, 0x85, 0xeb, - 0xf2, 0x30, 0x6b, 0x4a, 0x77, 0x06, 0x79, 0x33, 0xa4, 0x19, 0x5d, 0x8f, - 0xa6, 0x87, 0xcb, 0xf6, 0xae, 0x2b, 0xe6, 0xc4, 0x66, 0x2e, 0xd3, 0x33, - 0xce, 0xef, 0x5b, 0xf1, 0xa2, 0x79, 0x2c, 0x36, 0x51, 0xe4, 0xab, 0xa6, - 0x65, 0xc6, 0xac, 0x9c, 0x19, 0xe4, 0xf6, 0xe7, 0xef, 0x1a, 0xfe, 0x9a, - 0xb8, 0x0a, 0x66, 0xc4, 0x0f, 0x4f, 0x6f, 0x7a, 0x25, 0x14, 0xf9, 0x83, - 0x2e, 0xbd, 0x2d, 0x31, 0x95, 0x3e, 0x3c, 0x80, 0xc7, 0x55, 0xd0, 0x9f, - 0x51, 0xe0, 0xe2, 0xbc, 0x30, 0x29, 0x0b, 0x9c, 0xe8, 0x8d, 0xf0, 0xe1, - 0x13, 0xef, 0xf5, 0x91, 0x52, 0xe8, 0x72, 0xd2, 0x40, 0xb7, 0x18, 0x5f, - 0xae, 0x5c, 0x2f, 0xdb, 0x76, 0xb8, 0xcc, 0x28, 0xdf, 0x64, 0x1d, 0x34, - 0x8c, 0xce, 0x92, 0x82, 0xa9, 0x6f, 0x5c, 0x84, 0x44, 0x53, 0xe6, 0x41, - 0x86, 0x15, 0xc1, 0x16, 0x10, 0xd5, 0xbe, 0xff, 0xff, 0x71, 0xf1, 0x5b, - 0x00, 0x02, 0x52, 0x3f, 0x40, 0xe3, 0xf0, 0xf1, 0xef, 0xaf, 0x4c, 0x83, - 0xe9, 0x8e, 0x2d, 0x4d, 0x0b, 0x00, 0xff, 0x7d, 0x25, 0x81, 0x02, 0x86, - 0xb0, 0x3c, 0x78, 0xf7, 0x60, 0x0f, 0x0a, 0x65, 0x7a, 0x1e, 0xc1, 0xd4, - 0x06, 0xf4, 0xdd, 0x56, 0xd2, 0x97, 0xd7, 0x78, 0xf9, 0x1b, 0x80, 0x10, - 0x33, 0xa1, 0xc8, 0xa3, 0x17, 0x78, 0x40, 0x09, 0xa0, 0xd4, 0x62, 0x3d, - 0xd6, 0x2c, 0xad, 0xb0, 0x9d, 0x58, 0xb7, 0x93, 0x65, 0x94, 0x27, 0x0f, - 0x6d, 0x28, 0xd7, 0xef, 0x45, 0x2d, 0xbf, 0x5a, 0xad, 0xac, 0xab, 0x71, - 0x6a, 0x63, 0xb6, 0x8e, 0xfb, 0x72, 0x0d, 0xb6, 0x0a, 0xbd, 0x11, 0x70, - 0x02, 0x28, 0x49, 0x60, 0x03, 0x2b, 0x5d, 0x4a, 0x55, 0x69, 0xa6, 0x5f, - 0xa1, 0x3f, 0x6d, 0xd3, 0xa3, 0x47, 0x2f, 0x68, 0x21, 0xf0, 0xbd, 0x20, - 0x84, 0x33, 0x92, 0x27, 0x3e, 0xfc, 0x6a, 0x5e, 0x15, 0x92, 0x44, 0x4c, - 0x1b, 0x62, 0x11, 0x73, 0x0c, 0x87, 0xe1, 0xf4, 0x12, 0xe3, 0x78, 0x7b, - 0x43, 0xd8, 0xb7, 0x2e, 0x54, 0x82, 0xbb, 0x2c, 0xd4, 0x1c, 0xb5, 0xf6, - 0x77, 0xcd, 0x52, 0x29, 0xee, 0xc7, 0x12, 0xd2, 0x7d, 0x53, 0x74, 0x8e, - 0x56, 0x1a, 0xcc, 0x8f, 0xb6, 0x4b, 0x0d, 0x4a, 0x5f, 0x38, 0xd6, 0x28, - 0x19, 0xef, 0x1b, 0xec, 0x5c, 0x84, 0x59, 0xe8, 0xee, 0xce, 0x51, 0x97, - 0xce, 0xfc, 0x7c, 0x41, 0x9e, 0xae, 0x54, 0xda, 0x66, 0x4e, 0xc3, 0x96, - 0xdb, 0xd6, 0xb7, 0xba, 0x9c, 0x98, 0x99, 0x77, 0x6e, 0x3f, 0x11, 0xfc, - 0x97, 0xab, 0xd4, 0x7b, 0xe5, 0x7c, 0x83, 0xe0, 0x11, 0x81, 0xef, 0x7c, - 0xc3, 0x97, 0x98, 0x40, 0xa2, 0xab, 0x43, 0x49, 0x73, 0x7c, 0x58, 0x2f, - 0xfc, 0x7a, 0x42, 0x68, 0x7d, 0x06, 0xd4, 0xf8, 0xd9, 0x05, 0xe3, 0x86, - 0x38, 0x96, 0xc9, 0x2b, 0xf8, 0x4b, 0xe2, 0x73, 0x3e, 0xc1, 0x98, 0x9b, - 0xd8, 0x28, 0xae, 0xf2, 0x1d, 0xfd, 0x1d, 0xb0, 0x69, 0xa5, 0xbf, 0x69, - 0x51, 0xe1, 0x28, 0x09, 0x7f, 0xd0, 0xd9, 0x8b, 0xd9, 0x09, 0x28, 0x3e, - 0x50, 0xca, 0x14, 0x69, 0xd3, 0xc8, 0x62, 0x5a, 0x0e, 0x9b, 0xd7, 0x62, - 0xda, 0x97, 0x9a, 0xf0, 0x0c, 0xe9, 0x2a, 0x47, 0x50, 0x95, 0x6e, 0x6e, - 0x54, 0xb3, 0x1d, 0x5e, 0xf5, 0xa1, 0xd3, 0x85, 0xb6, 0xa2, 0x8b, 0xd7, - 0x62, 0x09, 0xdd, 0xcc, 0xcd, 0xd6, 0x46, 0xa5, 0x5f, 0x3f, 0x9f, 0xf9, - 0xd2, 0x20, 0x7a, 0x70, 0x64, 0x28, 0x4d, 0x33, 0xd5, 0xa6, 0x20, 0x60, - 0x4d, 0xde, 0xfb, 0x40, 0xed, 0x35, 0x25, 0xac, 0x33, 0x67, 0x78, 0xa5, - 0x5c, 0xd4, 0x95, 0x44, 0x5b, 0xf7, 0x8a, 0x05, 0x85, 0xc2, 0xd6, 0x8c, - 0x85, 0x3c, 0x40, 0x9e, 0x7b, 0x44, 0xe1, 0xb1, 0x43, 0x2a, 0xc9, 0x3c, - 0x26, 0x04, 0x1d, 0x5b, 0xd3, 0x74, 0x21, 0xfd, 0x48, 0x58, 0x17, 0x2d, - 0xa6, 0xf8, 0x5d, 0xa7, 0x09, 0xf7, 0xc1, 0x1f, 0xcd, 0x75, 0x48, 0x17, - 0x29, 0x65, 0x73, 0xc4, 0x5f, 0x30, 0xa2, 0xe8, 0xf6, 0x53, 0x5b, 0xd0, - 0x6b, 0x19, 0xf8, 0xc3, 0x77, 0xd8, 0x10, 0xd7, 0x0d, 0xe5, 0x76, 0xfe, - 0x84, 0x94, 0x55, 0x45, 0x3d, 0x23, 0x6f, 0xd5, 0x01, 0xb4, 0x97, 0xda, - 0x8e, 0x79, 0xba, 0x92, 0xf3, 0x33, 0x04, 0x60, 0x10, 0x6c, 0x1d, 0x33, - 0x3b, 0xd6, 0xa1, 0xbb, 0x03, 0xe6, 0xf7, 0x6a, 0x0d, 0x49, 0x09, 0x6c, - 0xa4, 0x25, 0x29, 0xc6, 0xf5, 0x16, 0x53, 0xbf, 0xad, 0x1f, 0x63, 0x2d, - 0x1d, 0x44, 0x4d, 0x26, 0x8c, 0xd0, 0x02, 0x9a, 0x17, 0xc4, 0x85, 0xf4, - 0x7e, 0x45, 0x2e, 0x62, 0x3e, 0x57, 0x96, 0x8c, 0x0b, 0x39, 0x26, 0x79, - 0x04, 0x8f, 0xb3, 0x81, 0x85, 0xb6, 0x2c, 0xa8, 0x2d, 0xe5, 0x46, 0xad, - 0x88, 0xcb, 0xf0, 0xc8, 0xd7, 0x33, 0xf0, 0x5c, 0xc5, 0x55, 0xc6, 0x72, - 0x7e, 0x41, 0xde, 0xd9, 0xc4, 0x53, 0x73, 0x97, 0xdc, 0x5e, 0x82, 0xce, - 0xa2, 0xb6, 0xc7, 0x9e, 0x59, 0x14, 0x78, 0xc7, 0x76, 0x1f, 0x13, 0x8e, - 0x1a, 0xdb, 0x91, 0xff, 0xe5, 0xd7, 0x68, 0x11, 0xe2, 0x1b, 0x1d, 0xd0, - 0xfc, 0x22, 0x94, 0xd9, 0x46, 0xfa, 0x8c, 0xc7, 0xe2, 0xf4, 0x10, 0xd0, - 0x21, 0x54, 0x5c, 0x8f, 0xcc, 0x4e, 0x67, 0x29, 0x2a, 0x23, 0x7d, 0x9d, - 0x41, 0x07, 0xec, 0xc0, 0x7a, 0x46, 0xbb, 0x84, 0x5a, 0xd5, 0xf3, 0x3c, - 0x16, 0xe6, 0xa9, 0x21, 0xaf, 0x5f, 0x18, 0x50, 0x4f, 0x7a, 0x22, 0x62, - 0x17, 0x7d, 0x5d, 0x74, 0xfd, 0x33, 0x69, 0x6b, 0x6d, 0x44, 0x0c, 0x29, - 0x8d, 0x6e, 0xde, 0xe7, 0x20, 0x61, 0x2e, 0x19, 0xb5, 0x33, 0x1b, 0x9b, - 0xdc, 0x33, 0x4d, 0x5d, 0x4b, 0x01, 0x2e, 0x0e, 0x09, 0x81, 0x39, 0x26, - 0xf9, 0x1f, 0x90, 0x7b, 0x95, 0x2a, 0xc6, 0x4b, 0x19, 0x94, 0x35, 0xc5, - 0xf9, 0x38, 0xb2, 0x01, 0xa7, 0x77, 0x33, 0x68, 0xc3, 0x95, 0xea, 0xeb, - 0x21, 0xd4, 0x0e, 0x05, 0xe0, 0xb7, 0x13, 0xaa, 0x24, 0xeb, 0x3d, 0x38, - 0x24, 0xc7, 0xab, 0x9c, 0xfe, 0xc0, 0x14, 0xcb, 0x67, 0x20, 0x27, 0x02, - 0xc0, 0x9b, 0x8d, 0x76, 0xf7, 0x2c, 0x75, 0x94, 0x0c, 0xa3, 0xda, 0x67, - 0x9c, 0x31, 0xa2, 0x22, 0x81, 0x93, 0x0a, 0xc4, 0xb2, 0x20, 0x99, 0xc7, - 0x8c, 0xa4, 0x61, 0x4f, 0xc8, 0x93, 0x3c, 0xe1, 0x3c, 0x89, 0x39, 0x4d, - 0x6b, 0xe3, 0x68, 0x9a, 0x28, 0xbc, 0xb4, 0xc7, 0xb3, 0x38, 0x56, 0xb2, - 0xc0, 0x22, 0xf3, 0xcb, 0x9b, 0x91, 0x8c, 0xab, 0xab, 0x3f, 0x9f, 0x6e, - 0x4f, 0x30, 0x9f, 0xd7, 0x46, 0x33, 0x8a, 0x16, 0x75, 0xb8, 0x8d, 0x65, - 0xb8, 0x44, 0x66, 0x47, 0xfa, 0x87, 0x89, 0x48, 0x18, 0xf1, 0xba, 0x68, - 0x67, 0x49, 0x64, 0x32, 0x23, 0xea, 0x57, 0xe7, 0x79, 0x8a, 0x82, 0x7c, - 0x3f, 0x36, 0x6f, 0xd5, 0x9a, 0xfb, 0xf0, 0xe0, 0x42, 0x72, 0x0d, 0x51, - 0x5c, 0x48, 0x51, 0x57, 0x71, 0x3a, 0xcc, 0x06, 0x19, 0xe2, 0x65, 0x7a, - 0xd4, 0x9e, 0x9a, 0x0f, 0x5c, 0xf8, 0x06, 0xe2, 0x22, 0xa5, 0xfb, 0x13, - 0x53, 0x2a, 0x15, 0xcd, 0xb5, 0x12, 0x5c, 0x48, 0x2e, 0x4b, 0xd2, 0x5c, - 0x21, 0x59, 0xc2, 0xd6, 0x9b, 0xd6, 0xc9, 0xe3, 0x51, 0x1c, 0xd4, 0x53, - 0x5e, 0x15, 0xd4, 0x67, 0xd4, 0x80, 0x48, 0x6b, 0xdf, 0xb3, 0x22, 0xc2, - 0x71, 0x61, 0xae, 0x0a, 0xf0, 0x4a, 0x38, 0x03, 0xf9, 0xe3, 0xb1, 0xb2, - 0x89, 0x1a, 0x1b, 0x7e, 0x34, 0x8f, 0xb2, 0xf3, 0x30, 0xa3, 0x3c, 0x78, - 0xbc, 0x7d, 0x15, 0x1d, 0xca, 0x97, 0xa9, 0xe5, 0x9a, 0x7a, 0x1a, 0xe7, - 0xa2, 0xbf, 0x01, 0xd5, 0x31, 0x70, 0x93, 0x6c, 0x07, 0x7e, 0x34, 0x46, - 0x03, 0x5f, 0x3d, 0x8f, 0xc5, 0x81, 0x22, 0x02, 0xc6, 0x8d, 0xc6, 0x89, - 0xd3, 0xa3, 0x74, 0xbb, 0x48, 0x4d, 0xd1, 0x44, 0x0d, 0xe9, 0x42, 0xb8, - 0x02, 0x35, 0x43, 0xe8, 0xe8, 0x5e, 0x22, 0x61, 0x50, 0xd2, 0x91, 0x17, - 0x78, 0x15, 0x53, 0x5c, 0x9d, 0x99, 0x52, 0x74, 0x48, 0x7d, 0x46, 0x7f, - 0x40, 0x7c, 0xd7, 0xd2, 0x26, 0x90, 0x66, 0xf2, 0xe4, 0xf2, 0xa2, 0x38, - 0x2a, 0xd2, 0x54, 0x78, 0x86, 0xda, 0x85, 0x01, 0x78, 0x18, 0x0a, 0xb8, - 0xf7, 0xa8, 0xce, 0x2e, 0xd8, 0xe7, 0x73, 0x61, 0x0b, 0x99, 0x39, 0x98, - 0x4e, 0x93, 0xd6, 0x41, 0xd9, 0xd3, 0x43, 0xcc, 0xb9, 0x08, 0xa8, 0xd7, - 0xdb, 0x3d, 0xbc, 0xb6, 0x31, 0x47, 0x83, 0x8f, 0x55, 0x8f, 0xcf, 0xbb, - 0x58, 0xcb, 0xf2, 0xa2, 0x42, 0x6a, 0x7f, 0xf4, 0x9e, 0x0a, 0x35, 0x79, - 0xa2, 0x6a, 0x90, 0x54, 0x8f, 0x07, 0x34, 0x3b, 0xa5, 0x2d, 0xe0, 0x97, - 0xf5, 0x7c, 0x79, 0x79, 0x52, 0xb9, 0xb0, 0xd9, 0x88, 0x4d, 0xe0, 0xfa, - 0xf5, 0x89, 0x99, 0xaf, 0x68, 0xd3, 0x9e, 0x7a, 0x7a, 0xeb, 0xed, 0x40, - 0x46, 0x32, 0xb5, 0x4a, 0xe0, 0x6d, 0x85, 0x94, 0xa0, 0x9e, 0xd7, 0xaf, - 0xc7, 0x0a, 0x6b, 0x98, 0xbd, 0x83, 0x58, 0xe7, 0x46, 0x27, 0x26, 0x82, - 0x32, 0x41, 0x08, 0x12, 0xf3, 0x49, 0xdb, 0x1a, 0x61, 0xa5, 0xaf, 0x5b, - 0x65, 0x2a, 0x8f, 0x20, 0xaf, 0x9c, 0x93, 0x44, 0xa1, 0xe6, 0xd0, 0x75, - 0xe7, 0xce, 0x70, 0xeb, 0xa3, 0x01, 0xd5, 0xbb, 0xd4, 0x71, 0x72, 0x59, - 0x54, 0xa1, 0xb1, 0xb2, 0x91, 0x47, 0x7d, 0x3b, 0x58, 0x82, 0x99, 0x48, - 0x81, 0xf3, 0xc5, 0x66, 0x9f, 0x64, 0x1a, 0xf7, 0xf1, 0x8b, 0x26, 0xab, - 0xf1, 0xa1, 0xe8, 0x10, 0x6a, 0xcd, 0x10, 0x95, 0xc9, 0x57, 0x02, 0xcd, - 0xaf, 0x48, 0x3d, 0xa5, 0x14, 0x74, 0x26, 0x49, 0xdd, 0x4c, 0x58, 0x4b, - 0xfd, 0x23, 0x9c, 0x48, 0x89, 0x14, 0x9d, 0x1a, 0xe6, 0xa3, 0x38, 0xa3, - 0x29, 0x9e, 0x44, 0x01, 0x95, 0x91, 0x9b, 0xf5, 0xe6, 0x5d, 0xef, 0x64, - 0xe0, 0xc1, 0xab, 0x83, 0x03, 0x66, 0x89, 0x97, 0x50, 0xfe, 0xad, 0xd9, - 0x99, 0x18, 0x1f, 0x29, 0xe8, 0xf0, 0xae, 0xca, 0x0c, 0x3b, 0x25, 0xbd, - 0xa8, 0x96, 0x23, 0xa0, 0xd6, 0x22, 0xdf, 0x98, 0x5a, 0x2f, 0xdf, 0xf3, - 0x5b, 0xb0, 0xc5, 0x3a, 0xf5, 0xb5, 0x15, 0x02, 0x35, 0x4a, 0xbe, 0x2f, - 0x4b, 0xba, 0xa1, 0x35, 0xb6, 0x27, 0x3e, 0x0b, 0xed, 0xe9, 0x23, 0x08, - 0xcd, 0xbc, 0x7b, 0x34, 0x77, 0xf5, 0x53, 0xb9, 0xc8, 0x05, 0x0e, 0x0e, - 0x0b, 0xb9, 0x00, 0xf1, 0x61, 0xe5, 0x9c, 0x5f, 0xb3, 0xbd, 0x64, 0xd1, - 0x4f, 0xf6, 0x78, 0x89, 0xdb, 0xeb, 0xd9, 0xdd, 0x6d, 0x98, 0xfb, 0x5f, - 0x27, 0x8c, 0xdd, 0x52, 0xe7, 0x52, 0x83, 0x8e, 0x6b, 0x4f, 0x4c, 0x1b, - 0x62, 0x72, 0x4f, 0x7e, 0xd9, 0x30, 0x14, 0xc5, 0x6c, 0x3b, 0xc4, 0x8c, - 0xe9, 0x0d, 0x30, 0xaa, 0xa4, 0x13, 0x62, 0xd3, 0x34, 0x69, 0x02, 0xd3, - 0x1d, 0x93, 0x0b, 0xfd, 0x77, 0x25, 0x73, 0x19, 0x18, 0xd3, 0xd6, 0x97, - 0xe8, 0x4d, 0xd1, 0xde, 0x6b, 0xdd, 0xa3, 0xfe, 0xb4, 0x18, 0xaa, 0x4f, - 0x2b, 0xc0, 0xcc, 0x03, 0x69, 0xe5, 0xa6, 0xcb, 0x8b, 0xb7, 0x27, 0xe4, - 0xa4, 0xc8, 0x8f, 0xfa, 0x1e, 0x15, 0x21, 0x41, 0xc0, 0x38, 0xa4, 0xc9, - 0xf6, 0xa6, 0x0d, 0xc6, 0x4f, 0x3f, 0x25, 0xd4, 0x17, 0xea, 0x92, 0x74, - 0xff, 0x53, 0x65, 0x3f, 0xb4, 0x5e, 0x57, 0xc9, 0x9b, 0x41, 0xf9, 0x90, - 0x1e, 0xb1, 0x7a, 0x0f, 0x1d, 0x13, 0x23, 0xa2, 0x77, 0x44, 0x68, 0x75, - 0xb8, 0xcd, 0x58, 0x22, 0x81, 0x75, 0x81, 0x25, 0xa1, 0x7e, 0xdb, 0x14, - 0xa2, 0x66, 0xaa, 0x2e, 0xbc, 0x93, 0x0c, 0x60, 0x3d, 0xc6, 0x34, 0x3c, - 0x84, 0x36, 0xb1, 0x1c, 0x53, 0xdd, 0xba, 0x8a, 0xfb, 0xf8, 0x3c, 0x16, - 0xc9, 0x70, 0x64, 0xf4, 0x10, 0x34, 0xb3, 0x94, 0x74, 0x95, 0xe7, 0x21, - 0xb8, 0xdd, 0x91, 0xd0, 0x6b, 0xbf, 0x03, 0x3a, 0x69, 0x1d, 0x55, 0xa9, - 0xc4, 0x42, 0x3c, 0x6b, 0xcd, 0x18, 0x0b, 0x67, 0xcb, 0x33, 0x14, 0xa0, - 0x74, 0x83, 0x15, 0x31, 0xfe, 0x3b, 0xf5, 0x15, 0x38, 0xa7, 0x4c, 0x93, - 0x53, 0x8a, 0xbc, 0xdd, 0xde, 0xc3, 0x25, 0x41, 0x19, 0x56, 0x02, 0x9a, - 0xdb, 0x8f, 0x80, 0xa3, 0xf5, 0x00, 0xa2, 0x60, 0x0b, 0x93, 0xb8, 0x23, - 0x7b, 0xb0, 0x21, 0xc2, 0x25, 0x0f, 0xe8, 0x18, 0xed, 0xaf, 0xd3, 0x30, - 0x9f, 0xac, 0xd7, 0xa1, 0x79, 0x70, 0xe7, 0x61, 0x0a, 0x76, 0xd3, 0x13, - 0xbc, 0xff, 0xce, 0x31, 0xd1, 0xe7, 0x92, 0x89, 0x21, 0x9f, 0xe7, 0xb9, - 0xfb, 0x95, 0x5e, 0x84, 0x23, 0x80, 0xb5, 0xbc, 0x5f, 0x6d, 0x1a, 0x48, - 0x93, 0x17, 0xbd, 0xf5, 0x59, 0x73, 0x6b, 0xf8, 0x32, 0x6d, 0x12, 0x5a, - 0xa4, 0xff, 0x5a, 0x3f, 0xaf, 0x02, 0x68, 0x95, 0xf9, 0x4e, 0xe1, 0xbd, - 0x42, 0x3a, 0x6c, 0xcd, 0x49, 0xf9, 0x9b, 0xa8, 0xfe, 0xd3, 0xa3, 0x6a, - 0x6e, 0x62, 0x52, 0x2b, 0xbc, 0xab, 0x68, 0x27, 0x33, 0x9d, 0x51, 0xab, - 0xe4, 0x89, 0x5f, 0xde, 0xd9, 0x30, 0xcc, 0xee, 0x6f, 0xc9, 0x71, 0x85, - 0x30, 0x67, 0xd5, 0x72, 0xe8, 0x4e, 0x63, 0xda, 0xaa, 0xbc, 0x3f, 0xe2, - 0x2b, 0xe6, 0xb2, 0x26, 0x1f, 0x45, 0x45, 0x28, 0x36, 0x6e, 0x6a, 0x1f, - 0x5a, 0x9b, 0x13, 0xa4, 0x6c, 0xb6, 0xaf, 0x9f, 0xbe, 0x9e, 0x8f, 0xe7, - 0x1b, 0x00, 0xe1, 0x3e, 0x65, 0xba, 0xd3, 0x9a, 0x0f, 0x95, 0x23, 0xf4, - 0x41, 0x0b, 0xa8, 0xfe, 0xf3, 0xf8, 0xd7, 0xe0, 0x75, 0xba, 0x53, 0x92, - 0xb1, 0xce, 0xde, 0xdc, 0xe0, 0x9e, 0xbd, 0xaa, 0x7f, 0xb9, 0x87, 0x7a, - 0xe0, 0xab, 0x7b, 0xff, 0xda, 0x88, 0x16, 0xc1, 0xaf, 0x84, 0x13, 0xb1, - 0x42, 0xe8, 0xe9, 0x5e, 0x3b, 0x4c, 0xc7, 0x9f, 0x28, 0x4c, 0xe2, 0xae, - 0xc0, 0xe8, 0x37, 0x4e, 0x00, 0xfe, 0x67, 0x57, 0x2c, 0x90, 0xca, 0x50, - 0x61, 0xc8, 0x9c, 0xc4, 0x08, 0x59, 0xbc, 0x93, 0xf1, 0x64, 0x3d, 0x5e, - 0xf2, 0x90, 0x69, 0x34, 0x38, 0xd7, 0xad, 0xdc, 0x03, 0x74, 0xa5, 0x97, - 0x5c, 0xa3, 0x89, 0xc0, 0x32, 0x24, 0x8e, 0xa3, 0x04, 0xc9, 0x47, 0x63, - 0x80, 0x74, 0xdd, 0xae, 0x31, 0x39, 0x19, 0x3e, 0x6c, 0xae, 0xa4, 0xcf, - 0x90, 0x99, 0x5f, 0x73, 0x66, 0x80, 0x6d, 0xc6, 0xfb, 0xa5, 0xc7, 0x2f, - 0x92, 0xde, 0xf5, 0x88, 0xac, 0x5a, 0x4c, 0x86, 0x6b, 0x84, 0xbe, 0x47, - 0x93, 0x0d, 0xf1, 0xd6, 0xdd, 0xcf, 0xee, 0xa4, 0x85, 0x57, 0xe5, 0xdb, - 0x2c, 0xb1, 0x81, 0x03, 0x62, 0x1b, 0x16, 0x2d, 0x50, 0xde, 0x94, 0x90, - 0x04, 0xe7, 0xaa, 0x66, 0xdc, 0x24, 0x23, 0x07, 0x30, 0xd0, 0x44, 0x89, - 0xfb, 0x8e, 0xbb, 0xde, 0xca, 0xca, 0x03, 0xc1, 0x82, 0x00, 0x4c, 0x83, - 0x1d, 0x1e, 0x3c, 0x16, 0x84, 0x5d, 0x31, 0x6f, 0x07, 0xb2, 0x5d, 0xd5, - 0x90, 0x0c, 0x62, 0x2d, 0x23, 0x67, 0x71, 0xf6, 0x2a, 0x42, 0xe7, 0x44, - 0x45, 0x55, 0xcd, 0x92, 0x8a, 0xe5, 0x10, 0xc3, 0xd9, 0x1a, 0xbc, 0xfe, - 0xfc, 0x65, 0x43, 0x0c, 0x18, 0xa7, 0xbd, 0x5b, 0x33, 0x74, 0xb4, 0x96, - 0xbb, 0x55, 0x97, 0xe7, 0xcd, 0x74, 0xed, 0xa5, 0x58, 0x69, 0xd5, 0x27, - 0x0b, 0x58, 0xd3, 0x25, 0x57, 0x73, 0x4a, 0xe0, 0xfd, 0x38, 0x87, 0x0b, - 0xd5, 0xf3, 0x33, 0xf3, 0x3b, 0x9e, 0xad, 0xcf, 0x85, 0x45, 0xfb, 0x02, - 0x5a, 0x8b, 0xfe, 0xe8, 0xbe, 0x8c, 0xa6, 0x28, 0x43, 0xcf, 0x46, 0x2e, - 0x57, 0x00, 0x7d, 0x9d, 0x93, 0x7c, 0x34, 0x1d, 0xec, 0x38, 0xb8, 0xb9, - 0xc4, 0x9a, 0x53, 0x26, 0x99, 0xff, 0xcd, 0x74, 0x52, 0xa7, 0x68, 0x9d, - 0xa2, 0xb1, 0xad, 0x16, 0x19, 0x1e, 0xb4, 0xf1, 0x67, 0x22, 0xba, 0x25, - 0xe5, 0xb9, 0xce, 0xb5, 0x72, 0x08, 0x1e, 0x62, 0xb7, 0xe5, 0x72, 0x0e, - 0x86, 0xa1, 0xa6, 0xc8, 0xe0, 0x47, 0x6e, 0x4f, 0xd2, 0xec, 0xea, 0x47, - 0xa8, 0x69, 0x46, 0xfc, 0xe3, 0x15, 0x38, 0xe0, 0xc4, 0xd4, 0xd4, 0x63, - 0x59, 0x4e, 0x59, 0xdc, 0xfd, 0x04, 0x63, 0x3b, 0xdb, 0x6c, 0xea, 0xa6, - 0x75, 0xb7, 0x4b, 0x8b, 0x9c, 0x79, 0x6e, 0x6b, 0x60, 0xc5, 0xf5, 0x66, - 0xfa, 0x56, 0x46, 0x85, 0x35, 0x7e, 0xb7, 0x43, 0xda, 0xc1, 0x71, 0x88, - 0x1b, 0x1b, 0x25, 0xc9, 0x5f, 0x80, 0xfd, 0x86, 0xb8, 0x5f, 0xf3, 0x4a, - 0x90, 0x99, 0x5f, 0x73, 0x66, 0x80, 0x6d, 0xc6, 0xfc, 0xd5, 0xc7, 0x2f, - 0x92, 0x4e, 0xf5, 0x88, 0xa6, 0x23, 0xf0, 0x86, 0x25, 0x4a, 0x26, 0x60, - 0x10, 0xc6, 0x69, 0xf5, 0xb5, 0x33, 0xe6, 0xea, 0x5a, 0xb1, 0x1e, 0x95, - 0xfa, 0x92, 0x0f, 0x34, 0x08, 0x09, 0x15, 0x7a, 0x7c, 0xde, 0x03, 0x8a, - 0x51, 0x4b, 0xf3, 0x08, 0xe6, 0xdd, 0xa5, 0x39, 0xca, 0xf5, 0x56, 0xe8, - 0x4e, 0x53, 0x42, 0x42, 0xa2, 0xb7, 0x14, 0x08, 0xa4, 0xa4, 0x30, 0x95, - 0x9a, 0x61, 0x5c, 0xf9, 0x70, 0x3d, 0xe4, 0x77, 0xa2, 0xa5, 0xb8, 0x08, - 0xaa, 0x88, 0x68, 0x41, 0x27, 0xa1, 0x18, 0x2f, 0x11, 0x70, 0xdf, 0x61, - 0x17, 0x63, 0x37, 0x60, 0x70, 0xaf, 0xa5, 0xe7, 0xfa, 0x07, 0xef, 0x3a, - 0x17, 0xf6, 0xf7, 0x34, 0x64, 0x49, 0xee, 0x60, 0x7b, 0xa2, 0xee, 0x2d, - 0x59, 0xfd, 0xd9, 0x29, 0x1f, 0x80, 0x26, 0x10, 0x46, 0xc6, 0xbe, 0x36, - 0x18, 0xe4, 0xc1, 0xc5, 0x43, 0x11, 0xaf, 0xee, 0xee, 0x55, 0x5b, 0x87, - 0xf9, 0x5d, 0x27, 0xe1, 0x4d, 0xc9, 0x04, 0x22, 0x19, 0xcc, 0x34, 0x1c, - 0x6e, 0xa3, 0x16, 0xc9, 0xcc, 0x68, 0xe2, 0x89, 0x01, 0xa3, 0xf5, 0x28, - 0x68, 0x16, 0x85, 0x73, 0x2c, 0x15, 0xd2, 0x61, 0x92, 0xa7, 0x1c, 0x37, - 0x2e, 0xae, 0x79, 0x87, 0x0b, 0x3e, 0x79, 0xf2, 0x6a, 0x6c, 0xa0, 0x25, - 0xa5, 0x35, 0x72, 0x7b, 0x56, 0x38, 0x82, 0x93, 0x25, 0x46, 0xd9, 0xc9, - 0xc7, 0xcb, 0xc5, 0xd2, 0xa9, 0xb2, 0xb8, 0x28, 0x15, 0x7e, 0xf0, 0xe8, - 0xf4, 0x58, 0xa9, 0xb0, 0x93, 0xc7, 0x74, 0x44, 0x6d, 0xc7, 0xc3, 0x4b, - 0x8c, 0xa1, 0x17, 0x06, 0xde, 0x34, 0xfe, 0x75, 0xa9, 0x08, 0xb0, 0xb0, - 0x59, 0x3d, 0xbd, 0xe5, 0x5f, 0x3d, 0x3f, 0xcf, 0x72, 0x26, 0xf7, 0x07, - 0x68, 0x1b, 0xa8, 0x3e, 0xf5, 0x7c, 0x69, 0x5f, 0x58, 0x06, 0x4a, 0x75, - 0xe9, 0x46, 0x87, 0x83, 0x94, 0xb3, 0x77, 0xc3, 0x28, 0x92, 0x2d, 0x44, - 0x1c, 0x95, 0xed, 0xe2, 0xef, 0x17, 0x12, 0xd0, 0xc9, 0xde, 0x1b, 0xfa, - 0xee, 0x88, 0xd1, 0x53, 0xee, 0x3c, 0x2e, 0x93, 0x4a, 0x87, 0xca, 0x5b, - 0x32, 0xbc, 0xb7, 0xf5, 0xe1, 0x8f, 0x3f, 0xda, 0x13, 0xc4, 0xa4, 0xa3, - 0x29, 0x06, 0xf8, 0x14, 0xb5, 0xf2, 0x56, 0x70, 0xb6, 0xef, 0x8f, 0xaa, - 0xb8, 0x6b, 0xb6, 0x23, 0xb2, 0x43, 0x8e, 0xc0, 0xd0, 0x4f, 0x93, 0xdb, - 0x71, 0x86, 0x6f, 0x10, 0x88, 0xcf, 0x88, 0xfe, 0xc8, 0xe9, 0xf4, 0xd8, - 0xd0, 0xea, 0x06, 0x15, 0xb9, 0x14, 0xf4, 0x74, 0xfa, 0x15, 0xad, 0x1d, - 0x39, 0xe9, 0x7f, 0x3c, 0x77, 0x72, 0x25, 0xb5, 0x3e, 0x1b, 0x77, 0x7e, - 0x0b, 0x35, 0x7f, 0xd6, 0xc5, 0x4f, 0x72, 0xe8, 0xa6, 0xea, 0x9f, 0xfb, - 0xdc, 0x53, 0x64, 0xa9, 0x6a, 0x40, 0xc4, 0x99, 0x47, 0x26, 0xc6, 0x5f, - 0xb9, 0x5d, 0x3c, 0xda, 0xf1, 0x5e, 0x4c, 0x3c, 0x85, 0x00, 0x94, 0x04, - 0x44, 0xd1, 0xad, 0x2a, 0xb7, 0xc6, 0x02, 0xe5, 0xa6, 0xf3, 0x17, 0x0e, - 0x4b, 0x57, 0xa8, 0xc7, 0xef, 0x11, 0x2b, 0xf0, 0x9c, 0x68, 0x63, 0x2e, - 0x8f, 0x48, 0x43, 0xe6, 0x6c, 0x3f, 0xf2, 0xed, 0x05, 0x84, 0xcb, 0x7a, - 0x62, 0x3b, 0xe5, 0x46, 0xeb, 0x6c, 0x31, 0x56, 0x60, 0x91, 0x34, 0x28, - 0x78, 0x7d, 0xa4, 0x58, 0xd3, 0x4f, 0xa9, 0xc8, 0x15, 0x49, 0xc7, 0x4c, - 0x73, 0xf5, 0x4c, 0xec, 0xb9, 0x6e, 0x88, 0xd0, 0x21, 0x73, 0xe3, 0x19, - 0xe1, 0x94, 0x62, 0x88, 0x37, 0xdb, 0x66, 0xaf, 0x1b, 0x3d, 0x39, 0x9c, - 0x89, 0xa1, 0xd8, 0x20, 0x2c, 0xa9, 0xf7, 0x54, 0x6c, 0x83, 0x1c, 0x54, - 0x9e, 0x93, 0xc8, 0x25, 0xff, 0x1c, 0x1f, 0x4f, 0x9e, 0x81, 0xfb, 0xc0, - 0x4f, 0xff, 0xaf, 0x2a, 0x2b, 0x72, 0x7f, 0x41, 0x43, 0x2e, 0xf8, 0xb8, - 0x1f, 0xeb, 0x4a, 0x70, 0xd3, 0xf8, 0xed, 0x74, 0x96, 0xfe, 0x7a, 0xf4, - 0x9a, 0x12, 0xf0, 0xcb, 0xe7, 0xe7, 0xaa, 0xa1, 0x5d, 0x36, 0xbb, 0x2c, - 0x7c, 0x3a, 0x95, 0x40, 0x6f, 0x0b, 0xb7, 0x55, 0x38, 0x5b, 0x5b, 0x16, - 0x23, 0x7f, 0x2b, 0x33, 0x04, 0x0e, 0x36, 0x98, 0x29, 0x11, 0x2e, 0xd9, - 0x2e, 0x63, 0x91, 0x2b, 0xfb, 0x47, 0xf8, 0x15, 0x55, 0x58, 0xe8, 0x0a, - 0xa1, 0x89, 0x96, 0xe3, 0xfb, 0xb0, 0xe5, 0xc4, 0xf8, 0x4a, 0x18, 0x05, - 0x5a, 0x64, 0xe9, 0x94, 0x2b, 0xb7, 0x55, 0xa9, 0x3f, 0xc3, 0x63, 0x05, - 0xa0, 0x76, 0x2d, 0xc7, 0xd5, 0x67, 0x18, 0x11, 0x51, 0xce, 0xdf, 0x3e, - 0xdc, 0x1c, 0x1b, 0x11, 0x0e, 0x84, 0xc1, 0x85, 0x5a, 0xee, 0xce, 0xdc, - 0x5c, 0xfe, 0x4b, 0x16, 0xa4, 0xc1, 0x29, 0x2a, 0xea, 0x85, 0x1c, 0xf8, - 0xbe, 0x75, 0x14, 0x69, 0xd6, 0xb3, 0x98, 0x87, 0x22, 0xea, 0x08, 0x9d, - 0x5b, 0x72, 0x54, 0xdc, 0xd9, 0x51, 0x03, 0x3b, 0xa6, 0x58, 0x80, 0xc7, - 0x81, 0x4a, 0xc6, 0xec, 0x1b, 0xf2, 0x5c, 0x92, 0xd0, 0x0f, 0x1e, 0xf8, - 0xff, 0x6d, 0x44, 0x8d, 0x10, 0xad, 0x6b, 0x47, 0x90, 0xa1, 0x47, 0x95, - 0x71, 0x7a, 0xb8, 0x4b, 0x67, 0x0d, 0x6a, 0x5c, 0x43, 0x75, 0xa7, 0xe9, - 0x6f, 0xe7, 0xfb, 0xd9, 0x00, 0xc8, 0x19, 0xbb, 0xfc, 0x77, 0xcc, 0x46, - 0xad, 0x9f, 0x8e, 0x63, 0x5b, 0xfd, 0xb1, 0xa3, 0xfd, 0x17, 0x1b, 0x15, - 0x85, 0xda, 0x0a, 0xde, 0x47, 0xa1, 0xf0, 0x88, 0x63, 0x2d, 0x63, 0x4b, - 0xea, 0xf3, 0x00, 0xcc, 0x05, 0x15, 0x48, 0x37, 0x2d, 0xd7, 0x1a, 0x14, - 0xfe, 0xac, 0x0d, 0x83, 0xc7, 0xd3, 0xb9, 0xb6, 0x7c, 0x58, 0xb1, 0xff, - 0x7d, 0x82, 0x46, 0x3e, 0x02, 0xbd, 0x10, 0x9e, 0x1b, 0xbe, 0x4e, 0x3d, - 0x68, 0x16, 0x3c, 0xd7, 0xc1, 0x48, 0x98, 0x59, 0xf6, 0xff, 0x6c, 0x6c, - 0x1b, 0x5a, 0x77, 0x31, 0x62, 0xec, 0x01, 0xdf, 0xe7, 0x5f, 0x30, 0x36, - 0xda, 0xb2, 0x1c, 0xa8, 0x47, 0xb8, 0x83, 0xfd, 0x4d, 0x6c, 0xda, 0x03, - 0xfa, 0xb6, 0xdb, 0x12, 0x1a, 0x5d, 0x33, 0x57, 0x10, 0x2a, 0x9b, 0x3a, - 0x1e, 0x3d, 0x37, 0xc7, 0x32, 0xc9, 0xe9, 0x55, 0x24, 0x35, 0xfb, 0xd2, - 0x2c, 0xfb, 0x40, 0x30, 0x7c, 0x1f, 0x27, 0x2e, 0x93, 0x5a, 0xf3, 0x99, - 0x47, 0x69, 0xbc, 0xea, 0x6d, 0x81, 0x1e, 0xc7, 0x28, 0x4d, 0x64, 0xa9, - 0xa0, 0xab, 0xc0, 0xf4, 0x1c, 0x62, 0xd1, 0xf2, 0xbb, 0x3c, 0xe0, 0xd3, - 0x22, 0xd0, 0xaa, 0xa5, 0xbe, 0xf3, 0x92, 0x55, 0x07, 0x3b, 0x2c, 0x15, - 0xb7, 0x7f, 0x8b, 0xe3, 0x88, 0x72, 0xc4, 0xcc, 0x05, 0xce, 0x9a, 0xcb, - 0x0c, 0x13, 0x51, 0x58, 0x7d, 0x13, 0x0e, 0x25, 0xa1, 0x90, 0xaa, 0x39, - 0x59, 0x54, 0x10, 0x56, 0x16, 0x73, 0xb0, 0x33, 0x25, 0x62, 0xe6, 0x73, - 0x00, 0x38, 0x06, 0xe2, 0x9c, 0x93, 0xc2, 0xdf, 0x3a, 0xbb, 0x37, 0x48, - 0xc3, 0xf6, 0xab, 0x7a, 0xec, 0x02, 0xf4, 0xfa, 0x16, 0x94, 0x6e, 0x6c, - 0x1a, 0x46, 0x26, 0x97, 0x99, 0xb1, 0x7f, 0x19, 0x36, 0xe9, 0xb1, 0xfa, - 0x73, 0xdc, 0x42, 0x5d, 0x8f, 0xed, 0x3f, 0xbd, 0x13, 0x21, 0x37, 0xa3, - 0x6d, 0x70, 0x4b, 0x5e, 0x4f, 0x51, 0x31, 0x00, 0x16, 0xf0, 0x62, 0x26, - 0x89, 0x72, 0xaf, 0x27, 0x2e, 0xee, 0x8e, 0xf3, 0x5b, 0x83, 0x69, 0xf9, - 0x71, 0x99, 0x42, 0xdc, 0xd8, 0xca, 0xb3, 0xef, 0x15, 0x0f, 0x9c, 0x83, - 0x97, 0x04, 0xf6, 0x78, 0xf9, 0x16, 0x73, 0x35, 0xbc, 0x5d, 0xfc, 0x79, - 0x44, 0x03, 0x68, 0x68, 0xbf, 0x2c, 0x72, 0xea, 0x9e, 0x64, 0x9f, 0xbd, - 0xae, 0xfb, 0xb9, 0x40, 0xe0, 0x7e, 0x4f, 0x98, 0xa1, 0xf9, 0x6e, 0xa4, - 0xf5, 0x69, 0xbe, 0x0e, 0x02, 0x56, 0xea, 0x51, 0x99, 0xa1, 0xbf, 0xaf, - 0xd8, 0x31, 0x4c, 0x1e, 0xbf, 0x44, 0xcb, 0x69, 0x83, 0x15, 0x56, 0xf2, - 0x9c, 0x0c, 0xef, 0x20, 0x38, 0x69, 0x8f, 0x2c, 0x57, 0xe8, 0xeb, 0xef, - 0xb3, 0x44, 0x8b, 0x8d, 0xa7, 0xd7, 0xec, 0xa5, 0x0a, 0xa7, 0xcb, 0x79, - 0xf6, 0x40, 0x71, 0xd8, 0x88, 0xf3, 0x21, 0xc4, 0x3e, 0x6a, 0xaa, 0x69, - 0xb5, 0xa0, 0xf4, 0x95, 0xd7, 0x63, 0xf9, 0x38, 0x75, 0xe5, 0x23, 0x5a, - 0x7b, 0x56, 0xd8, 0xa3, 0x4b, 0x62, 0xd7, 0xb0, 0x4e, 0x90, 0x8f, 0x8f, - 0xe4, 0xe7, 0x4d, 0xff, 0xe7, 0xe9, 0x59, 0x8f, 0xb4, 0x6c, 0x90, 0x36, - 0xab, 0x98, 0xff, 0x52, 0xba, 0xbd, 0x16, 0x27, 0x35, 0xc5, 0xc6, 0xc0, - 0x25, 0x14, 0x4b, 0x78, 0x4b, 0x23, 0x8e, 0x9e, 0xc7, 0xd6, 0xcb, 0x3a, - 0xee, 0xf0, 0xed, 0xd1, 0x42, 0xf4, 0x77, 0x35, 0x1a, 0xda, 0xfd, 0x81, - 0x25, 0x36, 0xc0, 0xc1, 0xb5, 0x40, 0x76, 0x1c, 0x17, 0x7a, 0xcb, 0xab, - 0xc5, 0x00, 0x45, 0x2e, 0x3c, 0xb5, 0x9f, 0xf6, 0xa6, 0x8a, 0xff, 0x3c, - 0xb3, 0xae, 0x35, 0xc6, 0xe7, 0x11, 0xb4, 0x24, 0x4b, 0x4e, 0x85, 0x79, - 0xfb, 0xa9, 0x54, 0xf0, 0x52, 0x93, 0xa9, 0x2e, 0x58, 0x0f, 0xc0, 0xed, - 0x4f, 0x5b, 0x5d, 0x9e, 0x03, 0xe5, 0xbb, 0xb7, 0x17, 0x3f, 0x17, 0x5a, - 0x86, 0xa0, 0xe9, 0xa2, 0xea, 0x9c, 0x48, 0x80, 0xee, 0xde, 0xf8, 0xcf, - 0xae, 0x6e, 0xc6, 0xd8, 0x87, 0xe0, 0x58, 0x5e, 0x79, 0x55, 0x15, 0x83, - 0x75, 0xc1, 0xdc, 0x41, 0xb3, 0x30, 0xd9, 0x26, 0x17, 0x4b, 0x62, 0x05, - 0xed, 0x9c, 0xc9, 0x87, 0x71, 0x2b, 0x9e, 0xdc, 0xb9, 0xec, 0x64, 0x43, - 0x9e, 0x32, 0x37, 0x77, 0x5e, 0x1e, 0x3e, 0xcf, 0xda, 0x1f, 0x58, 0xc8, - 0x59, 0x25, 0x1b, 0x07, 0x8d, 0x31, 0xeb, 0xaa, 0x73, 0x51, 0x8f, 0xf8, - 0x0e, 0x51, 0xa4, 0x36, 0x2f, 0xfa, 0x83, 0xf4, 0x44, 0x12, 0x19, 0xf2, - 0xf2, 0xde, 0xb8, 0x50, 0x82, 0xd7, 0xc8, 0x3f, 0x3f, 0x1c, 0x49, 0x90, - 0xdd, 0x2a, 0x99, 0x15, 0x40, 0xb3, 0x6e, 0x6b, 0x87, 0xc1, 0x63, 0x77, - 0x23, 0x6e, 0x00, 0x5b, 0x07, 0xc4, 0x95, 0xc5, 0xac, 0x02, 0xfb, 0xd2, - 0xf0, 0xcf, 0x88, 0x3d, 0xdd, 0x69, 0x98, 0xf8, 0x3f, 0xa6, 0x9e, 0xd6, - 0x5e, 0xdb, 0x94, 0x43, 0x40, 0xd8, 0x7b, 0x3f, 0xd1, 0x07, 0x03, 0xbb, - 0x16, 0xaf, 0x58, 0x96, 0x87, 0xda, 0x7c, 0x64, 0x7b, 0x37, 0x07, 0x9d, - 0x08, 0x31, 0x57, 0x49, 0x63, 0x85, 0x46, 0x3f, 0x86, 0x03, 0x5e, 0x1f, - 0x35, 0x8f, 0x92, 0x2f, 0xe2, 0x43, 0xec, 0x25, 0x1f, 0xc3, 0xc8, 0x3e, - 0x18, 0x07, 0x2e, 0x76, 0xb9, 0x37, 0x58, 0xf2, 0x81, 0x86, 0x15, 0x60, - 0x6e, 0x77, 0x75, 0x12, 0x07, 0x30, 0x07, 0x4a, 0xb9, 0x7a, 0x82, 0xba, - 0x45, 0x19, 0x4a, 0xa8, 0x87, 0xa2, 0xdf, 0xc0, 0xac, 0xa7, 0xf5, 0xb3, - 0x05, 0xa8, 0xc6, 0x92, 0x89, 0xe7, 0xff, 0x04, 0xf8, 0xae, 0x9b, 0x1f, - 0x01, 0x63, 0xb8, 0x6a, 0x8d, 0xae, 0xec, 0x50, 0x8a, 0x3c, 0x24, 0xe8, - 0x3a, 0x35, 0xaf, 0x2a, 0x18, 0x60, 0x55, 0x0a, 0x75, 0xf4, 0x03, 0x56, - 0x3a, 0x8e, 0xb0, 0x40, 0x2e, 0xd8, 0x85, 0x06, 0x98, 0x8d, 0x17, 0xe0, - 0x91, 0x05, 0xc1, 0x59, 0x54, 0xf6, 0x6f, 0x92, 0x4d, 0xf7, 0x4f, 0xe0, - 0x34, 0xdc, 0x67, 0x05, 0x11, 0x2b, 0xb5, 0x90, 0x2b, 0xb9, 0xdf, 0xa7, - 0xaa, 0x7a, 0xa5, 0xe6, 0xe4, 0x00, 0x0d, 0x80, 0xd6, 0x4c, 0x00, 0x04, - 0x3d, 0x67, 0x9c, 0xe0, 0x43, 0x1f, 0x4c, 0x16, 0xac, 0x81, 0xe9, 0xa9, - 0x4b, 0x64, 0x88, 0x1d, 0x4e, 0x33, 0x70, 0xc6, 0xc8, 0x87, 0x32, 0x8b, - 0xb4, 0xc2, 0x0f, 0xa6, 0xb1, 0x04, 0xc2, 0x7a, 0x9d, 0x95, 0x45, 0x7e, - 0xd5, 0x2c, 0x02, 0xb2, 0x25, 0x94, 0x92, 0xef, 0x22, 0x58, 0x9b, 0xeb, - 0x28, 0x00, 0x50, 0xdf, 0x99, 0x71, 0x79, 0x3d, 0xba, 0xa0, 0xe9, 0x32, - 0xc3, 0x18, 0x9e, 0x91, 0x65, 0x07, 0x7c, 0x73, 0x9e, 0x2d, 0x24, 0x25, - 0xe4, 0x3c, 0x35, 0xb4, 0x67, 0x7e, 0x3c, 0x08, 0x30, 0xd2, 0x41, 0xfc, - 0xd3, 0x27, 0x39, 0x2f, 0xc9, 0x25, 0x86, 0x1a, 0x77, 0x68, 0x35, 0x75, - 0x4d, 0x69, 0xe0, 0xd2, 0x2d, 0x6a, 0x8e, 0x44, 0xe6, 0x9b, 0x4c, 0x1f, - 0x0b, 0x57, 0x7d, 0x8f, 0xfe, 0xb7, 0x99, 0x4e, 0xb9, 0x7a, 0x1c, 0xbb, - 0x20, 0xb0, 0x02, 0xcb, 0x45, 0x74, 0x16, 0x6a, 0xde, 0xca, 0xf2, 0xf0, - 0x4a, 0xd0, 0xb3, 0xfd, 0x92, 0x6f, 0x54, 0x74, 0xbb, 0x5b, 0x05, 0x23, - 0x34, 0xc2, 0x3c, 0xad, 0x90, 0x05, 0xc7, 0xa0, 0x48, 0xfe, 0x85, 0x3b, - 0x60, 0x3d, 0x84, 0x4f, 0x9d, 0x73, 0x70, 0xc6, 0x78, 0xa1, 0x4e, 0x24, - 0x92, 0x75, 0x11, 0x16, 0xf9, 0x2c, 0x75, 0x32, 0x97, 0xd7, 0x5b, 0x1d, - 0x00, 0x4c, 0xa8, 0x2b, 0x3c, 0x07, 0x71, 0x79, 0x71, 0xf3, 0x4e, 0xb7, - 0x46, 0xfd, 0xac, 0x25, 0x07, 0x64, 0x95, 0x72, 0x88, 0x0c, 0x7a, 0x15, - 0x86, 0x28, 0x61, 0x32, 0xff, 0xe5, 0x47, 0x7c, 0x62, 0xdd, 0x85, 0x28, - 0x76, 0x2d, 0x2d, 0x3d, 0x03, 0x4a, 0xde, 0x2b, 0x95, 0xfa, 0x11, 0x3d, - 0x80, 0x97, 0x44, 0x72, 0x9a, 0x4e, 0xa3, 0x68, 0xdd, 0xa1, 0xe6, 0x73, - 0xde, 0x6a, 0x45, 0xad, 0x56, 0x86, 0x8a, 0xb2, 0x5d, 0x11, 0x2e, 0x54, - 0xa5, 0xf5, 0x18, 0x26, 0x80, 0xee, 0x1b, 0x2f, 0x96, 0xb3, 0x33, 0x49, - 0xac, 0x17, 0xed, 0x3a, 0x73, 0xe3, 0x69, 0xf8, 0x30, 0xdd, 0x6a, 0x8a, - 0xcb, 0xb6, 0x1f, 0x26, 0xc6, 0xed, 0x95, 0xcd, 0x30, 0x46, 0x20, 0x0c, - 0x8c, 0xb3, 0xdd, 0x4d, 0x92, 0xa4, 0xa3, 0xb6, 0xca, 0x79, 0xdc, 0x5a, - 0xdf, 0x0c, 0x93, 0xd7, 0x53, 0xbb, 0xd7, 0x44, 0xd2, 0xce, 0xa9, 0xb9, - 0xb7, 0x90, 0x29, 0x8e, 0x97, 0xf1, 0x90, 0xa0, 0xaf, 0x9a, 0xc2, 0x77, - 0xd0, 0x27, 0x22, 0x10, 0x7e, 0xb4, 0x50, 0x83, 0xfa, 0xac, 0x1a, 0x8b, - 0x45, 0x83, 0x02, 0x95, 0x36, 0xe5, 0x66, 0x64, 0xa1, 0x31, 0x7b, 0x7a, - 0x56, 0x23, 0x64, 0x69, 0x14, 0x9a, 0x9a, 0x97, 0x56, 0x4f, 0x5f, 0xc5, - 0x44, 0x78, 0xb8, 0x1b, 0x72, 0x7e, 0x6f, 0x77, 0xd4, 0x85, 0x23, 0x91, - 0xac, 0x78, 0xf4, 0xdd, 0x17, 0x24, 0x80, 0xd4, 0xd9, 0xb5, 0x2f, 0x5d, - 0x0d, 0x56, 0xa8, 0x78, 0xc4, 0xb6, 0x2a, 0x76, 0x5f, 0xd8, 0xca, 0x4e, - 0xbc, 0xf6, 0x26, 0x7a, 0x73, 0x57, 0xfa, 0xf0, 0x57, 0x0d, 0x8a, 0x82, - 0x38, 0x1f, 0xcf, 0xcd, 0x8d, 0xfd, 0xbf, 0xbb, 0xd6, 0x0f, 0x79, 0xbd, - 0x3e, 0x06, 0x80, 0xc8, 0x42, 0x36, 0x6d, 0xa1, 0x06, 0xb1, 0xfe, 0x17, - 0x8b, 0x7f, 0xc7, 0xf9, 0x06, 0x75, 0x67, 0x93, 0x9d, 0x5b, 0x62, 0xf4, - 0x27, 0x6c, 0xd9, 0x46, 0x16, 0x8a, 0x02, 0xc2, 0xef, 0x22, 0x97, 0x69, - 0xcd, 0xd8, 0xbe, 0x5b, 0x40, 0x85, 0xb7, 0x59, 0x03, 0xd0, 0x49, 0xb5, - 0x3a, 0x99, 0x1a, 0x84, 0x91, 0x4f, 0x43, 0xc1, 0x73, 0x96, 0x82, 0xda, - 0x50, 0xb3, 0x20, 0xc6, 0x80, 0xd0, 0x97, 0x92, 0x03, 0xe2, 0x99, 0xa0, - 0x55, 0x24, 0x62, 0x19, 0x31, 0x97, 0x7c, 0xbf, 0x8f, 0x24, 0x83, 0xe8, - 0x45, 0x82, 0x11, 0xb7, 0xea, 0xf0, 0xde, 0x50, 0x31, 0x26, 0xf8, 0x5d, - 0x30, 0x41, 0xd0, 0x03, 0x76, 0xa3, 0xcf, 0x3b, 0x2f, 0xaa, 0xaf, 0x34, - 0xca, 0x43, 0x8a, 0x16, 0x5c, 0x28, 0xf3, 0x55, 0xec, 0x20, 0x13, 0x38, - 0xef, 0x44, 0xa6, 0xd4, 0xba, 0xe6, 0x79, 0x9c, 0xa1, 0xd0, 0xe2, 0xdd, - 0x73, 0x67, 0x2d, 0xad, 0xfa, 0x5b, 0xa8, 0xba, 0x16, 0xf1, 0x15, 0xde, - 0xb1, 0x8f, 0xb3, 0xe2, 0x7a, 0xc1, 0x60, 0x65, 0x0e, 0xfc, 0x7c, 0x5c, - 0x57, 0x95, 0xa2, 0xb8, 0x0a, 0x95, 0x56, 0x2f, 0x0b, 0xd8, 0x4f, 0x0a, - 0xe7, 0xa3, 0x7d, 0x53, 0xa0, 0x87, 0x52, 0x5f, 0x29, 0x35, 0xd6, 0x7a, - 0x79, 0xef, 0x80, 0xe9, 0xf9, 0xc0, 0xe2, 0x5e, 0x31, 0x97, 0x7c, 0xbf, - 0x8f, 0x24, 0x83, 0xe8, 0x45, 0x82, 0x11, 0xba, 0xea, 0xf0, 0xd9, 0x98, - 0x0e, 0x0f, 0x54, 0xb1, 0x88, 0x63, 0x2f, 0x3d, 0x55, 0xed, 0x41, 0x0e, - 0x1c, 0x58, 0x3a, 0x96, 0xfd, 0x94, 0x89, 0xae, 0x67, 0x4b, 0x23, 0x1c, - 0xbe, 0x91, 0xb1, 0x2b, 0xfc, 0x79, 0xe9, 0x06, 0x40, 0xf2, 0x0a, 0xe9, - 0xb0, 0xd0, 0xdf, 0xcd, 0xd5, 0x07, 0x07, 0x3e, 0xa1, 0x5e, 0xff, 0x5c, - 0x47, 0xb5, 0x5f, 0x1f, 0x72, 0x44, 0xc8, 0xbc, 0xa7, 0x47, 0x86, 0x7f, - 0x11, 0x01, 0x88, 0x22, 0x18, 0xf1, 0xac, 0x57, 0x1b, 0x53, 0x34, 0xfe, - 0x85, 0x8c, 0x2b, 0x1f, 0x7a, 0xe1, 0x57, 0x6b, 0x0e, 0x31, 0x77, 0x17, - 0x55, 0xb9, 0xce, 0x29, 0x0d, 0x02, 0xc4, 0xad, 0xb5, 0xde, 0xef, 0xa3, - 0xc9, 0xee, 0xd9, 0x5d, 0xe0, 0x84, 0xed, 0x19, 0xe7, 0xe7, 0x1d, 0xb2, - 0xf9, 0x6c, 0x9f, 0x82, 0xdc, 0x5c, 0xc9, 0x79, 0x33, 0x3e, 0x94, 0x5f, - 0x38, 0xe1, 0xfc, 0x34, 0x21, 0xbf, 0x31, 0x97, 0x3b, 0x03, 0x19, 0xee, - 0xe5, 0xe9, 0x11, 0x15, 0xeb, 0x07, 0x4a, 0xcd, 0x2f, 0xab, 0x23, 0xc0, - 0x27, 0x2b, 0x6a, 0x85, 0x1b, 0xc8, 0x00, 0xc9, 0xa0, 0x14, 0xaf, 0x96, - 0x63, 0x90, 0xdd, 0xc9, 0x9d, 0x17, 0x96, 0xdb, 0xbb, 0x49, 0x93, 0x8c, - 0x54, 0x3a, 0x99, 0x3c, 0x5c, 0xec, 0x1a, 0x9d, 0x31, 0x2b, 0x36, 0x52, - 0x6e, 0x9c, 0xfd, 0xb6, 0x97, 0x0c, 0x2d, 0x1e, 0xa4, 0xb4, 0x87, 0xde, - 0x06, 0xef, 0x79, 0x0e, 0xb3, 0x4b, 0x08, 0x74, 0x1c, 0x6d, 0x5b, 0x83, - 0x3c, 0xbf, 0x94, 0xbc, 0x04, 0x51, 0x26, 0x8d, 0x8a, 0xa4, 0x9a, 0x91, - 0xdf, 0x70, 0x70, 0x07, 0x9a, 0xee, 0xbb, 0x11, 0xff, 0x3d, 0x39, 0xac, - 0xe9, 0x86, 0xbc, 0x77, 0x8c, 0xad, 0x69, 0xe0, 0x1e, 0xf6, 0x5b, 0x4f, - 0xc9, 0xad, 0xd1, 0xf3, 0x94, 0xe8, 0xca, 0x5c, 0x70, 0x0a, 0x64, 0x25, - 0xdc, 0xb8, 0xa0, 0x74, 0xa7, 0x29, 0x49, 0x75, 0x68, 0x42, 0x3a, 0x34, - 0x59, 0xb1, 0xba, 0x9a, 0xad, 0x24, 0xb6, 0x25, 0x9a, 0x12, 0x94, 0x15, - 0x2e, 0xc1, 0xc0, 0xe6, 0xcc, 0xba, 0x59, 0x60, 0x32, 0xc7, 0x69, 0x09, - 0x19, 0xd6, 0xdd, 0x29, 0xae, 0xf6, 0xfc, 0xe5, 0x7c, 0xc8, 0x04, 0xd4, - 0x22, 0xa1, 0x7f, 0x3a, 0x55, 0x16, 0x0e, 0x11, 0x0c, 0xde, 0x5b, 0xc0, - 0x04, 0xae, 0xeb, 0x96, 0x40, 0x5c, 0x30, 0xaf, 0x54, 0xdd, 0x7b, 0x43, - 0xb5, 0xa1, 0x93, 0x10, 0x23, 0x37, 0xa1, 0xc6, 0x06, 0x4f, 0x69, 0x29, - 0x60, 0xaf, 0x93, 0xdb, 0xfc, 0xcd, 0x58, 0x16, 0x4a, 0x4d, 0x01, 0x42, - 0x7f, 0x02, 0xcb, 0xdd, 0xf2, 0xca, 0x2c, 0xa5, 0xd7, 0xb0, 0xec, 0xca, - 0x77, 0x84, 0x5c, 0x6b, 0x5b, 0xdb, 0x73, 0xcd, 0x4e, 0x75, 0x9f, 0x04, - 0x88, 0x86, 0x73, 0x1c, 0xa1, 0xd6, 0x4b, 0xd6, 0xb3, 0xf2, 0x12, 0x28, - 0xcd, 0xab, 0x36, 0x5b, 0x0e, 0x36, 0x1f, 0x42, 0x51, 0x4b, 0xf7, 0xce, - 0xfc, 0xde, 0xfd, 0x6c, 0x9f, 0xd2, 0xd8, 0xee, 0x4a, 0x62, 0x32, 0x8a, - 0xbd, 0x1d, 0x02, 0xde, 0xea, 0x95, 0x71, 0x9e, 0x41, 0x38, 0x69, 0x8d, - 0xb1, 0x9b, 0x0b, 0x03, 0x5e, 0x14, 0x12, 0x77, 0x9a, 0x9a, 0xe3, 0xd6, - 0xbe, 0x43, 0xd9, 0x44, 0x07, 0x6d, 0xd8, 0xee, 0x00, 0xb6, 0x02, 0x44, - 0x15, 0x69, 0x21, 0xc0, 0x3b, 0x5a, 0xa1, 0x46, 0xea, 0x40, 0xa0, 0x1f, - 0xa2, 0xcf, 0x22, 0x69, 0xf4, 0xec, 0xc6, 0xde, 0x2c, 0x4b, 0x05, 0x0c, - 0x94, 0xda, 0x53, 0x2d, 0xa5, 0x07, 0x01, 0x90, 0x18, 0x12, 0x6b, 0x76, - 0xa0, 0xa9, 0x7a, 0x0a, 0xda, 0xd0, 0x8f, 0x74, 0xd6, 0xdf, 0x99, 0x02, - 0xda, 0xeb, 0xa1, 0xd6, 0x1a, 0xde, 0x02, 0xf2, 0x11, 0x7c, 0x39, 0x7e, - 0x4f, 0x39, 0x93, 0xf3, 0x7a, 0x8d, 0x05, 0x5d, 0x0b, 0x7d, 0x18, 0x03, - 0x85, 0xdd, 0x3a, 0x0c, 0xd0, 0x8d, 0x48, 0xf1, 0xfe, 0xee, 0xa4, 0x03, - 0xc0, 0x12, 0x0f, 0xe9, 0x69, 0x1c, 0x51, 0xf8, 0xbf, 0x45, 0x12, 0xab, - 0x09, 0x30, 0x99, 0x10, 0x49, 0xf1, 0x00, 0xa0, 0x06, 0x81, 0xde, 0xf5, - 0x79, 0xc2, 0x59, 0x7e, 0x28, 0xf8, 0xad, 0xa8, 0x43, 0xf8, 0x3f, 0xa3, - 0x22, 0xc9, 0xdf, 0x29, 0xf5, 0x00, 0x7a, 0x6a, 0xb1, 0xb6, 0xe4, 0x59, - 0x0a, 0x20, 0x6a, 0x7c, 0x04, 0xc0, 0xcd, 0x96, 0x4f, 0x67, 0xfc, 0x28, - 0xb1, 0xaf, 0x14, 0x36, 0xbd, 0x5e, 0xeb, 0x84, 0xbc, 0x6f, 0x9d, 0x7f, - 0xbd, 0x34, 0x4b, 0xbc, 0x5a, 0x79, 0x3b, 0x93, 0x86, 0xc6, 0x79, 0x87, - 0x64, 0x18, 0xfb, 0x3a, 0x2d, 0x1d, 0x27, 0xc9, 0x35, 0xda, 0xc7, 0x00, - 0xd4, 0xb0, 0x5f, 0x11, 0xb0, 0xb5, 0x8e, 0xa9, 0xa2, 0x76, 0x80, 0xbd, - 0xab, 0x26, 0x76, 0x4c, 0x59, 0x9a, 0xd8, 0xca, 0x9b, 0x2e, 0x57, 0xbb, - 0x32, 0x06, 0x1e, 0xfb, 0xb2, 0x6a, 0x40, 0x9c, 0x23, 0x29, 0x2e, 0x4e, - 0x99, 0xa6, 0x33, 0x81, 0x4e, 0x4b, 0x77, 0x99, 0xc7, 0x95, 0x8f, 0xda, - 0xd5, 0x31, 0x3a, 0x73, 0x33, 0x47, 0xd3, 0x1b, 0x3a, 0x4f, 0x08, 0x14, - 0x64, 0x7c, 0x99, 0x39, 0x0e, 0xef, 0x45, 0x27, 0x81, 0xd9, 0xc3, 0x5e, - 0x7a, 0xa5, 0xb7, 0x50, 0xc9, 0x8e, 0xc3, 0x63, 0x83, 0x7a, 0xe2, 0xca, - 0xa2, 0x4e, 0xbd, 0xfb, 0x9b, 0xa4, 0x7a, 0x71, 0xfa, 0x60, 0xe5, 0x3f, - 0x6d, 0xc4, 0x7c, 0xac, 0x8f, 0xc8, 0xec, 0xbc, 0xb8, 0xfb, 0xec, 0xc9, - 0x06, 0xb0, 0x51, 0x2f, 0xc8, 0x0d, 0xd1, 0xad, 0x0b, 0xfb, 0xd5, 0x44, - 0xe3, 0x87, 0x5e, 0x43, 0x75, 0xe4, 0x67, 0xd2, 0x53, 0x88, 0xb8, 0x4c, - 0x67, 0xce, 0xef, 0x63, 0x9e, 0x9d, 0x3e, 0x31, 0xf9, 0x9a, 0xda, 0x15, - 0x82, 0x54, 0xeb, 0x76, 0x65, 0x8f, 0xdb, 0x55, 0x5e, 0x82, 0x7d, 0xcb, - 0x61, 0x03, 0x17, 0xb2, 0x17, 0xba, 0x17, 0x3e, 0xb4, 0x64, 0x1e, 0x5d, - 0x45, 0x68, 0x32, 0xe3, 0x86, 0xd5, 0x7b, 0x32, 0x0a, 0x63, 0x55, 0x39, - 0x37, 0xab, 0x92, 0x02, 0x7b, 0xa1, 0xa4, 0x88, 0xc2, 0xb3, 0x8a, 0x81, - 0x75, 0x7c, 0x08, 0x20, 0x10, 0xf8, 0xca, 0x02, 0x5a, 0x30, 0x41, 0xe6, - 0x9a, 0xcd, 0x6e, 0xa1, 0x8f, 0x3c, 0x3a, 0x58, 0xcf, 0x93, 0x13, 0xeb, - 0x60, 0x97, 0x14, 0xe9, 0x59, 0xdf, 0x86, 0x30, 0xc4, 0xb5, 0x59, 0xe1, - 0xed, 0x0c, 0xee, 0x73, 0x5a, 0xb1, 0x47, 0xa5, 0x3f, 0x84, 0xdc, 0xfb, - 0xfb, 0x11, 0x20, 0x72, 0x26, 0xe0, 0x4d, 0xa5, 0xde, 0xac, 0x64, 0xa7, - 0x69, 0xf3, 0x16, 0x6d, 0xa1, 0x32, 0x5f, 0x8e, 0x94, 0x5c, 0xcd, 0x8b, - 0x98, 0x3c, 0x6c, 0x3e, 0x8b, 0x65, 0x48, 0x16, 0x1e, 0x5c, 0x87, 0xe5, - 0xfd, 0x56, 0x43, 0x78, 0x14, 0x42, 0x43, 0x0a, 0xbb, 0x43, 0x35, 0xab, - 0x89, 0x6b, 0x11, 0x61, 0x1f, 0xf3, 0x18, 0x43, 0x29, 0xea, 0x40, 0x16, - 0xe3, 0x51, 0x5c, 0x48, 0xb9, 0xf3, 0x27, 0x12, 0xa7, 0x36, 0x22, 0x8b, - 0x56, 0x56, 0xdd, 0x51, 0xaf, 0x00, 0x7d, 0xdc, 0x93, 0x51, 0x1f, 0xcd, - 0x28, 0x83, 0x44, 0xb5, 0x4b, 0xf0, 0x8f, 0x4a, 0x83, 0x16, 0xba, 0x92, - 0x10, 0x59, 0x0c, 0x7c, 0xcf, 0x3a, 0x39, 0xc8, 0x5b, 0xd5, 0x41, 0xea, - 0x83, 0xe0, 0x3c, 0xd5, 0xb8, 0x17, 0x2e, 0xc6, 0x02, 0x86, 0xf0, 0x24, - 0x22, 0x32, 0xfc, 0xfb, 0x3c, 0x1d, 0x18, 0xf0, 0x65, 0x60, 0xcc, 0xb1, - 0x4f, 0x21, 0x7f, 0x65, 0x3a, 0x64, 0xeb, 0x90, 0x02, 0x61, 0xfc, 0xb9, - 0x0f, 0x80, 0xd2, 0xb1, 0xee, 0x66, 0xf2, 0x8c, 0x5b, 0x16, 0x07, 0xc5, - 0x74, 0x01, 0xba, 0x94, 0xa6, 0xad, 0x03, 0x3a, 0x86, 0xef, 0x7a, 0x9e, - 0x6b, 0x59, 0xc9, 0x92, 0xa3, 0x97, 0xdf, 0x50, 0x81, 0xb9, 0xe8, 0x31, - 0x0a, 0x89, 0xf1, 0xd0, 0xaa, 0xd9, 0x1d, 0x21, 0x86, 0x42, 0x2e, 0xd5, - 0x27, 0x98, 0x99, 0x38, 0xec, 0xdb, 0x2d, 0x02, 0xf6, 0x4d, 0x63, 0xda, - 0x36, 0x65, 0xa3, 0x1a, 0x07, 0x02, 0xbc, 0x49, 0x2b, 0x7d, 0xac, 0x2d, - 0x8c, 0x52, 0x97, 0x1e, 0xc0, 0xeb, 0x2e, 0xd4, 0x55, 0xb8, 0xff, 0x06, - 0x3d, 0xe5, 0x41, 0x5e, 0x00, 0x5b, 0xa2, 0x8f, 0xab, 0xfa, 0x4b, 0x42, - 0xc6, 0xf9, 0x09, 0x40, 0x9c, 0xd6, 0x67, 0xc6, 0x0c, 0x01, 0xa6, 0x08, - 0x5e, 0xf3, 0xd3, 0x3c, 0xc0, 0x75, 0xef, 0x74, 0x84, 0x79, 0xea, 0x8c, - 0x83, 0x19, 0xa9, 0x31, 0x42, 0xe6, 0x55, 0xb4, 0x17, 0xf9, 0xa8, 0x16, - 0x90, 0x04, 0x9d, 0xa3, 0x13, 0x8e, 0xca, 0x78, 0xdb, 0xa1, 0x0d, 0x57, - 0x2f, 0x8a, 0x11, 0xc3, 0xd9, 0x3b, 0xb8, 0x7d, 0x1f, 0x34, 0xf1, 0x04, - 0xb7, 0xc1, 0xc5, 0xe3, 0x37, 0xf8, 0x15, 0x65, 0x51, 0xbd, 0xa9, 0xbf, - 0x45, 0x98, 0x0e, 0xe0, 0x30, 0x72, 0x4e, 0x62, 0xe6, 0xd6, 0x7c, 0x16, - 0x9f, 0xfa, 0x7f, 0xd1, 0x18, 0x57, 0x44, 0xbe, 0xff, 0x21, 0x1a, 0x1d, - 0x45, 0xe6, 0xec, 0x46, 0xd5, 0xef, 0x8e, 0xe0, 0xbf, 0xc2, 0x30, 0x36, - 0x19, 0xc3, 0x67, 0x7b, 0xcf, 0xa7, 0xda, 0x70, 0x3e, 0x19, 0xfa, 0x1c, - 0xf1, 0x9e, 0x38, 0x98, 0xe5, 0xe6, 0xe4, 0xd6, 0xad, 0xef, 0x31, 0xdb, - 0x8a, 0x8e, 0xf0, 0x98, 0x03, 0x14, 0x2e, 0xf4, 0x1d, 0x8b, 0xac, 0x7d, - 0xd5, 0xbe, 0xdd, 0x6e, 0xae, 0xa7, 0x14, 0x70, 0xcd, 0x7b, 0x44, 0x38, - 0x29, 0x9a, 0x20, 0xdf, 0xd1, 0x10, 0x5f, 0x51, 0xa4, 0x91, 0x62, 0xc5, - 0xa8, 0x16, 0x63, 0x86, 0xd6, 0x89, 0x5e, 0x75, 0x2d, 0xdb, 0xc3, 0x98, - 0x97, 0x11, 0x3b, 0xd7, 0x28, 0xe4, 0x55, 0xd9, 0x13, 0x90, 0x1c, 0x70, - 0x3d, 0x18, 0xfa, 0x28, 0xc9, 0xb8, 0x99, 0x5c, 0x51, 0x14, 0x39, 0x06, - 0x2c, 0xc3, 0xf7, 0xb6, 0xd2, 0xc6, 0x3d, 0xd7, 0xb7, 0xc0, 0x4f, 0xbc, - 0x7a, 0xc7, 0x4b, 0x0d, 0xd9, 0x8b, 0x3a, 0xdd, 0x6e, 0x04, 0x64, 0x0e, - 0x9d, 0x99, 0xe8, 0x4f, 0x3d, 0x7e, 0x4e, 0x96, 0x2f, 0xc8, 0x6f, 0x7a, - 0x90, 0xfd, 0x7d, 0x6d, 0xd4, 0x62, 0x15, 0x4b, 0xfb, 0x2b, 0x88, 0x8f, - 0xa9, 0x00, 0xc4, 0xe8, 0xad, 0x3a, 0xf5, 0x8e, 0xf1, 0x1e, 0x17, 0x12, - 0x9e, 0x71, 0xb7, 0x9e, 0xb1, 0x67, 0x67, 0xba, 0x8d, 0x1e, 0x23, 0xf9, - 0xd4, 0xcb, 0x7a, 0xd1, 0x95, 0x71, 0x5f, 0x07, 0x7b, 0x41, 0x27, 0x94, - 0x92, 0x59, 0x9b, 0xdb, 0x95, 0xa2, 0x8d, 0x1e, 0x29, 0x13, 0x1c, 0xf8, - 0x85, 0x87, 0x6e, 0x28, 0x2a, 0x5f, 0x84, 0x1d, 0xdd, 0x8d, 0x9a, 0x7c, - 0x63, 0xcd, 0x38, 0x9b, 0x75, 0xc4, 0x79, 0x9d, 0xc0, 0x30, 0xfe, 0x36, - 0x22, 0xa7, 0x3e, 0x86, 0xbf, 0xc3, 0xca, 0x6c, 0xd2, 0xe5, 0x8a, 0x6b, - 0x80, 0x5a, 0xa7, 0xca, 0xe7, 0x5b, 0xc6, 0xd8, 0x6b, 0xd4, 0xe6, 0x48, - 0xd1, 0x00, 0x1c, 0xc5, 0x01, 0xee, 0x27, 0xeb, 0xdf, 0x24, 0x60, 0x44, - 0x74, 0x84, 0x05, 0x0e, 0x3c, 0xb5, 0xa0, 0xd8, 0xbb, 0xde, 0xc2, 0xc7, - 0xfd, 0x53, 0xb2, 0x14, 0x15, 0xa0, 0x27, 0x34, 0x0c, 0xd8, 0x3b, 0x72, - 0x50, 0xab, 0x57, 0xfe, 0x11, 0xd3, 0xaf, 0xb0, 0xe7, 0x99, 0xf8, 0xa7, - 0xe1, 0x16, 0xce, 0x4a, 0xe9, 0x04, 0x93, 0xd0, 0x2a, 0x28, 0xf7, 0x7a, - 0x29, 0x45, 0x47, 0x8f, 0x37, 0xf8, 0xd4, 0xe5, 0x35, 0xc7, 0x98, 0xe6, - 0x92, 0x9f, 0xd8, 0x7b, 0xc7, 0xe4, 0x8d, 0x37, 0xc7, 0xb6, 0x56, 0x98, - 0x86, 0x15, 0x06, 0xc8, 0xc9, 0x76, 0xf9, 0xf3, 0x08, 0xf3, 0xa4, 0x2e, - 0x2e, 0x23, 0x34, 0x7d, 0x2d, 0xcf, 0xf7, 0x4a, 0x58, 0xab, 0x61, 0x35, - 0x35, 0x27, 0x94, 0x1f, 0xc3, 0xea, 0x5c, 0x13, 0x72, 0x8e, 0xf6, 0x39, - 0x53, 0xd1, 0x90, 0x63, 0x59, 0x9f, 0xbb, 0x24, 0x90, 0xea, 0x69, 0x68, - 0x60, 0xa5, 0x9d, 0x8f, 0x76, 0xe6, 0x75, 0x9b, 0x7b, 0xa9, 0xb9, 0x73, - 0x0b, 0xf7, 0x58, 0x33, 0xee, 0x8b, 0x9b, 0xc7, 0xe6, 0x23, 0xf8, 0x54, - 0x14, 0x2c, 0x1f, 0xc3, 0x81, 0x0d, 0xaf, 0xbe, 0xf8, 0xdd, 0xbc, 0x9a, - 0x32, 0x00, 0xa2, 0xbd, 0xd6, 0x55, 0x13, 0x6c, 0x84, 0xa1, 0x59, 0xaf, - 0x65, 0xa7, 0x3e, 0xde, 0x8b, 0x4d, 0x66, 0xd9, 0x62, 0xf7, 0xfb, 0xaa, - 0x4d, 0x58, 0x81, 0x3c, 0x75, 0xaf, 0x37, 0x6f, 0x83, 0xcf, 0x21, 0xe0, - 0xc4, 0x45, 0xf3, 0xa1, 0x1e, 0xb7, 0xe4, 0x47, 0x54, 0xe3, 0x02, 0xfd, - 0xeb, 0x46, 0x5d, 0x03, 0xf5, 0xcd, 0x06, 0x88, 0x37, 0xbf, 0xf3, 0x30, - 0x4f, 0x52, 0x05, 0x0b, 0x5f, 0x0c, 0xd0, 0x65, 0x6d, 0x46, 0x7c, 0x5b, - 0xb8, 0x2f, 0xe7, 0x72, 0xf2, 0x69, 0x8e, 0xd0, 0xf5, 0x5d, 0x83, 0xd2, - 0x92, 0xa7, 0xa4, 0xce, 0x4f, 0x60, 0xee, 0xa8, 0x2c, 0x68, 0x82, 0x5c, - 0x9b, 0x6b, 0x80, 0x3c, 0xe0, 0x6d, 0x94, 0x34, 0x62, 0x29, 0xc0, 0x72, - 0x6e, 0x89, 0xb7, 0x01, 0x45, 0x8c, 0x47, 0xce, 0xd5, 0xa5, 0xa0, 0x28, - 0xd4, 0xd7, 0x73, 0xb3, 0xc9, 0xad, 0x4d, 0xdf, 0x8a, 0x1f, 0xf1, 0x53, - 0x34, 0x3c, 0x7b, 0x5b, 0x98, 0x38, 0x03, 0x82, 0x66, 0x0b, 0xdb, 0x15, - 0xed, 0xb7, 0x5b, 0x40, 0xfa, 0xa4, 0x9c, 0xce, 0x4d, 0xf0, 0x8a, 0xe0, - 0xe2, 0x8b, 0x19, 0xfc, 0x01, 0xd0, 0x46, 0x47, 0xb6, 0xa4, 0x1a, 0xb1, - 0x12, 0x4d, 0xfe, 0x0e, 0x7f, 0xd8, 0x84, 0x4d, 0xe2, 0xab, 0x1f, 0x06, - 0x75, 0xfa, 0xa8, 0x1c, 0x8b, 0x76, 0xec, 0xa5, 0xab, 0x58, 0xf7, 0xe4, - 0x5c, 0xd6, 0xc3, 0xa9, 0x4f, 0xf8, 0xf5, 0x8c, 0x2a, 0xe9, 0x54, 0xa7, - 0x46, 0x77, 0xb8, 0x6c, 0x1a, 0xe1, 0x13, 0x71, 0x2f, 0xe4, 0x4b, 0x86, - 0xf0, 0x62, 0x12, 0x70, 0xcf, 0x7a, 0xf9, 0x3c, 0x56, 0x76, 0xc1, 0x70, - 0x10, 0xae, 0xa1, 0x20, 0x75, 0xfc, 0xda, 0xbc, 0xf1, 0xfd, 0x47, 0x23, - 0x12, 0x2a, 0x84, 0x1d, 0xd6, 0xfe, 0xa7, 0x6a, 0x85, 0xa7, 0x9a, 0x82, - 0xfc, 0xb3, 0xf2, 0x8f, 0x72, 0xa3, 0x3b, 0x2d, 0x12, 0xa6, 0x9d, 0xe3, - 0x32, 0x33, 0xea, 0x1b, 0xd6, 0x76, 0xde, 0x6a, 0x2d, 0xb8, 0x66, 0x7a, - 0x51, 0x41, 0x57, 0x26, 0xfc, 0x0b, 0xa9, 0x87, 0x3b, 0xdd, 0x46, 0xfd, - 0x7e, 0x59, 0x69, 0xf7, 0xe7, 0x65, 0x13, 0xee, 0x9d, 0x01, 0x07, 0x89, - 0x78, 0x10, 0xde, 0xac, 0x24, 0xfc, 0x2f, 0x3a, 0x95, 0xf9, 0x54, 0x5c, - 0x07, 0xcb, 0xc3, 0x70, 0xe4, 0x71, 0x5d, 0x6c, 0x93, 0xc5, 0x87, 0xb7, - 0xdc, 0x7b, 0xf2, 0x10, 0xee, 0x2a, 0x8b, 0xa5, 0xda, 0x80, 0xc3, 0xd9, - 0x26, 0xd3, 0x62, 0x74, 0xb7, 0x73, 0xdc, 0x3d, 0x5a, 0x4b, 0x85, 0xaa, - 0xe3, 0xbe, 0xb1, 0x99, 0x9f, 0xc1, 0x8c, 0xf8, 0xfe, 0xb8, 0x8c, 0x7b, - 0xc7, 0x3f, 0xdf, 0x13, 0x8b, 0xa2, 0x9a, 0xc2, 0xf3, 0xf4, 0x0c, 0xe6, - 0x5d, 0x2c, 0xbe, 0xdc, 0x5a, 0x28, 0x89, 0x48, 0x9a, 0x7e, 0x8c, 0x74, - 0x2e, 0xd3, 0x68, 0x0d, 0xdc, 0x1b, 0x2f, 0xf8, 0xf2, 0x4a, 0x5a, 0xa5, - 0x85, 0x25, 0x83, 0xc1, 0xe2, 0x18, 0x5d, 0x0f, 0xdd, 0xea, 0x57, 0xc8, - 0xa8, 0x5e, 0x8b, 0x5f, 0x70, 0x42, 0x26, 0x82, 0xb0, 0x73, 0x88, 0x0c, - 0x05, 0x20, 0x79, 0x44, 0xe8, 0x8f, 0x11, 0x33, 0x7c, 0x68, 0x06, 0x98, - 0x27, 0xe3, 0x41, 0x8f, 0xa0, 0xc2, 0xee, 0xfb, 0x31, 0x60, 0xcc, 0x5c, - 0x4b, 0xa1, 0xa4, 0x0a, 0x86, 0x57, 0x10, 0x0c, 0xbf, 0xc3, 0x04, 0x46, - 0x08, 0x77, 0x9c, 0xce, 0x3b, 0x57, 0xce, 0x9e, 0xb4, 0x05, 0x0b, 0x74, - 0x8d, 0x5c, 0x1f, 0x05, 0xee, 0x92, 0x03, 0xe3, 0xfe, 0x9b, 0x8f, 0xc0, - 0x11, 0xee, 0x96, 0x96, 0x9b, 0x68, 0xaf, 0x3c, 0x5c, 0xc1, 0x5e, 0xf4, - 0x04, 0x02, 0x16, 0x0e, 0xad, 0x9c, 0x9c, 0x9d, 0xb5, 0x6e, 0x28, 0x08, - 0x11, 0x75, 0xd0, 0x58, 0x9b, 0x64, 0x45, 0x3e, 0x31, 0x4f, 0xe2, 0xf6, - 0xdb, 0xe7, 0xc4, 0x74, 0x6b, 0xca, 0x89, 0xd0, 0xc8, 0x90, 0xa9, 0x2f, - 0xf5, 0xb4, 0xe2, 0x27, 0xe0, 0x7b, 0xee, 0x87, 0x36, 0xe8, 0xeb, 0x15, - 0x93, 0x6b, 0xb3, 0xc9, 0x83, 0xe8, 0xff, 0x8e, 0xd4, 0x57, 0x64, 0x02, - 0xa1, 0x8e, 0x66, 0x7c, 0xea, 0x32, 0xfa, 0x5a, 0x94, 0x94, 0xe4, 0xf8, - 0x95, 0x62, 0xb3, 0x8e, 0x47, 0x63, 0x83, 0xc2, 0xb5, 0xa7, 0x0a, 0x31, - 0x07, 0x3e, 0x20, 0x77, 0xeb, 0xe1, 0xa6, 0xaf, 0x7e, 0x59, 0x66, 0xbf, - 0x8a, 0x7d, 0xf7, 0x98, 0x9b, 0x18, 0xd4, 0xc9, 0xe7, 0xf4, 0x10, 0x5e, - 0x47, 0xa7, 0xe2, 0x92, 0x3b, 0xc2, 0xb3, 0x26, 0x3c, 0x3a, 0x80, 0x8b, - 0x7b, 0xfa, 0x85, 0x95, 0x69, 0x2a, 0xc2, 0x84, 0xd6, 0xab, 0x9a, 0xe8, - 0xce, 0xfc, 0xde, 0x7b, 0x1f, 0xec, 0x22, 0xde, 0xf7, 0xa2, 0x97, 0x38, - 0x7e, 0x65, 0x46, 0x35, 0x3a, 0xe9, 0x0c, 0xcc, 0x81, 0x6a, 0x5a, 0x87, - 0x24, 0x2f, 0x1f, 0xa2, 0x47, 0xbf, 0x55, 0xff, 0xea, 0x80, 0x06, 0x64, - 0x5d, 0x72, 0x3c, 0x6d, 0x3d, 0x2d, 0x77, 0x9c, 0xfd, 0x89, 0x60, 0x87, - 0xf4, 0x6c, 0x8c, 0x09, 0x59, 0x7f, 0xb4, 0x68, 0xf5, 0x91, 0xd7, 0x23, - 0x85, 0x3d, 0xd4, 0x84, 0xc0, 0xb6, 0x85, 0x55, 0x15, 0x97, 0x7b, 0x96, - 0xe9, 0xfe, 0x4a, 0x40, 0xf6, 0xb5, 0xd6, 0x03, 0x32, 0xd1, 0x1b, 0xbd, - 0x86, 0x70, 0x75, 0x53, 0x8f, 0x4a, 0xa0, 0x9a, 0x13, 0x49, 0x1b, 0xb1, - 0x5d, 0x46, 0xa5, 0xb1, 0x23, 0xa0, 0x85, 0x5d, 0x8c, 0x5d, 0x27, 0x63, - 0xe2, 0x80, 0x4a, 0x9d, 0x51, 0xaa, 0x27, 0xd3, 0xef, 0xe4, 0x57, 0xf0, - 0xdf, 0x13, 0x27, 0x01, 0x2e, 0x59, 0x57, 0x37, 0x75, 0xcd, 0x5d, 0x74, - 0x58, 0x93, 0x51, 0x4b, 0xae, 0x3a, 0xb4, 0x31, 0x0d, 0x6f, 0xa0, 0xf5, - 0x52, 0x34, 0x9b, 0x20, 0x3f, 0xdc, 0xd5, 0x2b, 0x70, 0x4e, 0xfd, 0x85, - 0x1a, 0xee, 0xa1, 0x02, 0xa9, 0xb5, 0x89, 0xae, 0x12, 0x79, 0x0f, 0x95, - 0x4f, 0x0e, 0x70, 0x14, 0xae, 0x19, 0x98, 0x39, 0x1c, 0x74, 0x54, 0xdf, - 0x11, 0x7c, 0x22, 0x54, 0x0e, 0x1a, 0x58, 0x7d, 0x02, 0x5e, 0xa8, 0x5a, - 0x9d, 0xd4, 0x14, 0xab, 0xf2, 0xc1, 0xac, 0x25, 0x8f, 0x00, 0x2c, 0x0d, - 0xf5, 0x02, 0x89, 0xc8, 0xe4, 0xd4, 0xe2, 0x32, 0x40, 0xb7, 0xdd, 0xd5, - 0xf2, 0x96, 0xe0, 0xe8, 0x3f, 0xaa, 0x73, 0x51, 0x37, 0x99, 0xd1, 0xb7, - 0xdb, 0x36, 0xb8, 0xaf, 0x9c, 0x81, 0xfa, 0x83, 0xaa, 0x8a, 0x76, 0xf2, - 0x02, 0x0a, 0x62, 0xff, 0xfa, 0x82, 0x70, 0xd0, 0xd5, 0xa4, 0xbf, 0xa0, - 0xdd, 0x77, 0x3d, 0xe9, 0x09, 0x90, 0x13, 0xd6, 0x4d, 0x78, 0x04, 0xa5, - 0x97, 0xbd, 0xa8, 0x45, 0xd1, 0x73, 0xab, 0x6d, 0x7c, 0x33, 0x92, 0xcb, - 0x48, 0xa3, 0x55, 0x5d, 0xbd, 0x2b, 0x81, 0xc4, 0xac, 0x81, 0x3f, 0xc7, - 0xca, 0xbd, 0xeb, 0x06, 0x7d, 0x0b, 0x0e, 0xd8, 0x01, 0x55, 0x4f, 0x48, - 0xaa, 0x44, 0x44, 0x66, 0x60, 0x17, 0xd1, 0x90, 0xce, 0x39, 0x13, 0x68, - 0x14, 0xd7, 0x11, 0xa4, 0x33, 0x09, 0x9e, 0x5c, 0x1d, 0xe4, 0x87, 0x44, - 0xd4, 0x25, 0xc3, 0x4b, 0xe8, 0x97, 0xbc, 0x13, 0x75, 0xf2, 0x9f, 0x67, - 0xc7, 0x5d, 0xb5, 0xf9, 0xff, 0xf6, 0x63, 0x9d, 0x82, 0xde, 0x48, 0x89, - 0x8e, 0xcd, 0xaa, 0x9d, 0xf3, 0x08, 0x7c, 0x60, 0x7f, 0xbc, 0x88, 0xd7, - 0xbd, 0x9d, 0xcb, 0x44, 0x65, 0x5a, 0xce, 0x94, 0x6d, 0x97, 0x60, 0xde, - 0xb8, 0x2e, 0xf3, 0xa6, 0x28, 0x06, 0x59, 0xee, 0xa3, 0x97, 0xdc, 0x6c, - 0x1c, 0xa7, 0xfb, 0xb9, 0x34, 0x3f, 0x10, 0xce, 0xcd, 0x5f, 0x70, 0x58, - 0x71, 0x16, 0xba, 0x3a, 0xdf, 0x07, 0xc8, 0x01, 0x69, 0x55, 0xa0, 0x61, - 0xa7, 0x04, 0xe8, 0x8c, 0x10, 0x26, 0xf7, 0x39, 0xd7, 0x07, 0x67, 0x80, - 0x04, 0xd5, 0x71, 0x8b, 0xd0, 0x01, 0xc2, 0x02, 0x5f, 0x40, 0xd0, 0x74, - 0x43, 0xd9, 0xf2, 0x1e, 0x67, 0xd6, 0x02, 0xf7, 0x73, 0x7c, 0x81, 0x50, - 0x4b, 0x9b, 0xd4, 0x85, 0xbb, 0x55, 0xda, 0x2c, 0x31, 0x6c, 0x56, 0x3c, - 0x9a, 0x82, 0x57, 0x98, 0xed, 0xfd, 0xca, 0x61, 0xcc, 0x3a, 0x67, 0x8c, - 0xb8, 0x1f, 0x03, 0xe6, 0xb6, 0x20, 0x0e, 0xde, 0x2e, 0xdd, 0x10, 0x03, - 0xa0, 0xe1, 0xff, 0x19, 0xf0, 0x6c, 0x7e, 0x37, 0x73, 0x0e, 0x27, 0x18, - 0x54, 0x48, 0x0f, 0xd8, 0x24, 0x99, 0x41, 0x9d, 0xc4, 0xc9, 0xce, 0x62, - 0xb2, 0x18, 0x56, 0x4e, 0x7b, 0x37, 0x50, 0x46, 0xcf, 0x73, 0x2b, 0x1b, - 0xf8, 0xce, 0x7d, 0xe6, 0x2e, 0xd8, 0x85, 0xaa, 0xbb, 0x68, 0x12, 0x93, - 0xec, 0x32, 0x85, 0x28, 0x65, 0xcf, 0x4a, 0xb5, 0xee, 0x8c, 0x0c, 0x88, - 0x46, 0xbb, 0x5b, 0x03, 0xeb, 0x76, 0xb9, 0x0c, 0x35, 0xc1, 0xce, 0x9a, - 0x1a, 0x73, 0x33, 0x5f, 0x17, 0x4a, 0x69, 0x8a, 0xc3, 0x09, 0x4a, 0x32, - 0xcd, 0x67, 0x91, 0x1c, 0x70, 0x6f, 0xd1, 0x0b, 0xa0, 0xf1, 0xf4, 0x62, - 0xd2, 0x1e, 0xd0, 0xcc, 0xf4, 0x20, 0x7b, 0x64, 0x41, 0xf1, 0x13, 0x38, - 0x14, 0xf5, 0x54, 0x39, 0xe6, 0xaf, 0x45, 0xa5, 0x4e, 0x50, 0x06, 0xd6, - 0x28, 0xac, 0x8d, 0xc0, 0x1e, 0x2f, 0x45, 0xfa, 0xd6, 0xc3, 0x2f, 0x44, - 0x85, 0x24, 0xb8, 0xb7, 0x58, 0xda, 0xf4, 0x49, 0x37, 0x52, 0xe0, 0xdb, - 0xa2, 0x00, 0xa9, 0x35, 0x2a, 0xd6, 0xc1, 0xdf, 0x80, 0xbc, 0x95, 0xaa, - 0x05, 0xbc, 0x3a, 0x7e, 0x8f, 0x95, 0xc2, 0x4e, 0x59, 0x91, 0x10, 0xb2, - 0xe3, 0xd3, 0x20, 0x1c, 0xd0, 0xf4, 0x43, 0xb5, 0xa6, 0xa3, 0xb2, 0x2f, - 0x74, 0x9b, 0x48, 0x7b, 0x75, 0x00, 0x25, 0xcf, 0x90, 0xda, 0x1b, 0x64, - 0xd2, 0x7f, 0x5f, 0xe2, 0x65, 0x73, 0x5b, 0xec, 0xe6, 0xec, 0x67, 0x05, - 0x8b, 0x3f, 0xed, 0xe9, 0xbb, 0x52, 0x55, 0x39, 0x32, 0x3e, 0xde, 0xd4, - 0x32, 0xa4, 0xbf, 0x94, 0x22, 0xf0, 0x8f, 0x3f, 0x7a, 0x44, 0x38, 0xcf, - 0xb7, 0x92, 0xc7, 0xe8, 0x33, 0x71, 0xb3, 0xeb, 0xef, 0x72, 0xc0, 0x8e, - 0x85, 0xa3, 0xbe, 0x1d, 0xe2, 0x4f, 0xc8, 0xcf, 0xf4, 0x4f, 0xe9, 0x44, - 0x2e, 0x2b, 0x2c, 0x61, 0x59, 0xf1, 0x03, 0x3c, 0xfe, 0x69, 0xb8, 0x75, - 0x07, 0xf6, 0xe5, 0x7d, 0x7d, 0x38, 0x32, 0xc4, 0x3b, 0xb4, 0x9e, 0xc5, - 0x53, 0x67, 0xe1, 0xbb, 0xe5, 0x53, 0xa7, 0x52, 0xd0, 0x47, 0xba, 0x7e, - 0x51, 0x74, 0xa4, 0x43, 0x67, 0xd7, 0x14, 0x4c, 0x81, 0x9f, 0xb7, 0x66, - 0xac, 0x6e, 0x1d, 0xe1, 0xef, 0x7c, 0x59, 0x3d, 0xf6, 0x74, 0x8b, 0xcf, - 0xb8, 0x43, 0xe0, 0x9c, 0xaf, 0xb1, 0xfe, 0xc3, 0x38, 0x4d, 0xc3, 0x15, - 0xb0, 0xf8, 0x0c, 0x79, 0x00, 0xfd, 0x08, 0x65, 0x8b, 0x19, 0xa0, 0xd5, - 0xab, 0x84, 0x4f, 0x19, 0x7c, 0xb0, 0x50, 0x48, 0x91, 0x2a, 0xde, 0xbf, - 0x2e, 0x54, 0x03, 0x22, 0x1f, 0x09, 0x64, 0x59, 0x58, 0x02, 0x16, 0x30, - 0x47, 0xc8, 0xae, 0x8e, 0x96, 0x79, 0x35, 0xc9, 0x91, 0x35, 0x7e, 0x85, - 0x8d, 0x85, 0x53, 0x71, 0x68, 0xff, 0x82, 0x8b, 0xc2, 0xd6, 0xe3, 0x8c, - 0xb7, 0x0f, 0xd3, 0xcb, 0x5a, 0x41, 0xa9, 0xde, 0xdb, 0xdd, 0x7f, 0x6a, - 0x22, 0x7f, 0x0f, 0x43, 0x8f, 0x68, 0x23, 0x37, 0xf3, 0xf7, 0x5e, 0x33, - 0xa7, 0x3f, 0x97, 0x50, 0x03, 0x4b, 0xcc, 0x1e, 0x5e, 0x9f, 0x1c, 0x07, - 0x2b, 0x45, 0xfb, 0x29, 0xa9, 0xa1, 0x6a, 0xb2, 0x18, 0x9d, 0x7f, 0xa3, - 0x00, 0x12, 0xcd, 0x78, 0xac, 0x6a, 0x56, 0xeb, 0xaa, 0x01, 0xa5, 0x53, - 0x31, 0x1d, 0x4b, 0x6c, 0x5b, 0xc5, 0xab, 0x60, 0xc6, 0x64, 0xf2, 0x67, - 0xfe, 0xeb, 0x36, 0xd6, 0x62, 0x19, 0x63, 0xaa, 0x69, 0x15, 0x88, 0x87, - 0xdc, 0xde, 0x9f, 0x15, 0xdf, 0xf3, 0xd5, 0x8f, 0x16, 0x52, 0xb6, 0x49, - 0xee, 0x48, 0x6e, 0xfb, 0x1c, 0xbc, 0x79, 0x92, 0x2b, 0x5c, 0xaa, 0xa1, - 0xf6, 0xeb, 0x86, 0x80, 0xa6, 0xf4, 0x56, 0x4d, 0x6e, 0xdc, 0x12, 0x55, - 0x98, 0x08, 0xeb, 0xae, 0x43, 0x3b, 0x36, 0x9e, 0x63, 0x42, 0xb2, 0x56, - 0x30, 0xa9, 0xef, 0x61, 0x80, 0x16, 0xff, 0x12, 0x9d, 0xc8, 0xda, 0x04, - 0x4e, 0x2c, 0xd9, 0xe1, 0x1f, 0xa8, 0xfc, 0xa3, 0x0d, 0xe4, 0x3a, 0x36, - 0x03, 0x78, 0x89, 0x09, 0xcf, 0xb7, 0xb7, 0x30, 0x82, 0x0b, 0x3e, 0x8b, - 0xbc, 0xfd, 0x14, 0x04, 0xf8, 0x25, 0xa0, 0x72, 0xf6, 0x1e, 0x2e, 0xbf, - 0x8d, 0xb9, 0x84, 0xfd, 0xb8, 0x35, 0x63, 0x0e, 0xfd, 0x50, 0x4b, 0x43, - 0x4d, 0xd9, 0xb9, 0x88, 0x4c, 0xa4, 0x4e, 0xf6, 0x80, 0x72, 0xfc, 0xc8, - 0x0c, 0xdd, 0x11, 0x9f, 0x09, 0x2d, 0xf9, 0xc5, 0x6f, 0x60, 0x27, 0x6a, - 0x45, 0x8a, 0x56, 0x4e, 0x61, 0x11, 0x19, 0x7f, 0xb9, 0x02, 0x26, 0xd8, - 0xd6, 0x06, 0x04, 0x1d, 0x24, 0xb1, 0x58, 0xbd, 0xd4, 0x73, 0x9c, 0x3b, - 0x30, 0x5d, 0xc2, 0x3f, 0x26, 0xdf, 0xfd, 0x15, 0xad, 0x8f, 0x84, 0xbe, - 0xf6, 0x50, 0xa5, 0x87, 0x68, 0x40, 0x90, 0xd7, 0x64, 0x2f, 0x55, 0x5c, - 0x40, 0x19, 0x04, 0x56, 0x78, 0x52, 0xa0, 0x78, 0xa5, 0xa3, 0xa4, 0xa2, - 0x9f, 0x20, 0xd9, 0xa2, 0x1a, 0x1e, 0x8c, 0x9f, 0x00, 0x3e, 0xce, 0xd2, - 0x4e, 0x56, 0x85, 0x04, 0xf6, 0x0f, 0x8a, 0x94, 0xd3, 0xee, 0xef, 0xf7, - 0x6a, 0x79, 0xb5, 0x64, 0xe8, 0xb4, 0xf7, 0xc3, 0x2a, 0x85, 0x27, 0x91, - 0xdc, 0xcf, 0x13, 0xb2, 0xb7, 0x91, 0x05, 0x9c, 0xd2, 0x63, 0xbd, 0xb8, - 0xea, 0x9a, 0x71, 0xc1, 0x17, 0x1f, 0x3d, 0xa6, 0xf9, 0x15, 0x34, 0x91, - 0x70, 0x14, 0xcd, 0x2d, 0x81, 0x18, 0x59, 0xe9, 0x96, 0xd7, 0x87, 0x78, - 0xea, 0x0a, 0xb1, 0x2b, 0x66, 0x9e, 0x62, 0x46, 0xa1, 0x9e, 0xe5, 0xbb, - 0x9a, 0x28, 0x41, 0x3b, 0x6b, 0x81, 0xb4, 0x1a, 0x15, 0xba, 0x48, 0xc6, - 0x8b, 0x46, 0x24, 0x89, 0xeb, 0x57, 0xd3, 0x64, 0x8b, 0x2c, 0xee, 0x8c, - 0x27, 0x88, 0xed, 0xc1, 0xa6, 0x0f, 0x03, 0xe0, 0x73, 0x5c, 0xaa, 0x9c, - 0x27, 0xde, 0x04, 0x9c, 0x99, 0xf5, 0x6d, 0x97, 0xd6, 0xd8, 0xc7, 0xa6, - 0xbb, 0x55, 0x8f, 0x33, 0x73, 0xe1, 0xb4, 0xde, 0x67, 0x75, 0xcb, 0x7d, - 0x45, 0x3f, 0xa2, 0x09, 0x2e, 0x18, 0xdb, 0xcf, 0xde, 0x07, 0x53, 0x1b, - 0xff, 0xfe, 0xf5, 0xb9, 0x69, 0x8b, 0x9b, 0x86, 0xab, 0xfc, 0x53, 0x4c, - 0x41, 0xb5, 0x33, 0xef, 0xfd, 0x36, 0xd0, 0x9c, 0x0b, 0x7f, 0x98, 0xd4, - 0xaa, 0x05, 0xc4, 0x86, 0xf5, 0xf6, 0xb1, 0x7c, 0xe9, 0x1c, 0x27, 0x62, - 0xc5, 0x6f, 0xa2, 0xba, 0x78, 0x01, 0xf0, 0x3c, 0x7d, 0x7c, 0x59, 0x60, - 0x28, 0x62, 0xea, 0x61, 0x74, 0xf9, 0x78, 0xf6, 0xf4, 0xe0, 0x4f, 0x9c, - 0x5f, 0xf0, 0xcd, 0x8e, 0x43, 0xc5, 0x75, 0xc0, 0x71, 0x27, 0x6f, 0x36, - 0xd9, 0x99, 0xf9, 0xc5, 0x0d, 0xbe, 0xbf, 0x21, 0x3b, 0x7c, 0x86, 0x27, - 0xb3, 0xaf, 0xe4, 0x5d, 0xa0, 0x2d, 0x65, 0x27, 0x84, 0x54, 0xc9, 0x89, - 0x00, 0x1c, 0x37, 0x54, 0x96, 0xc9, 0x45, 0x0e, 0x24, 0xcd, 0xb7, 0x08, - 0xdb, 0xdb, 0x1d, 0x7c, 0xab, 0x81, 0x11, 0x86, 0xa0, 0x69, 0x78, 0x07, - 0x22, 0x0b, 0xa1, 0x13, 0x72, 0xb8, 0x07, 0xe5, 0x48, 0x8f, 0x62, 0xa8, - 0x4e, 0xb1, 0xf2, 0xf0, 0x97, 0xc5, 0x58, 0xd5, 0x95, 0x7b, 0x05, 0xf9, - 0xae, 0xc4, 0x31, 0x00, 0x3d, 0x39, 0x2f, 0x77, 0x91, 0x90, 0x4b, 0x01, - 0x17, 0x5f, 0x8a, 0xf3, 0x96, 0x4b, 0x41, 0xbc, 0x96, 0x45, 0x6e, 0xc0, - 0x4e, 0x45, 0xfb, 0x4f, 0x87, 0x72, 0x2c, 0xf8, 0xd5, 0x20, 0x1b, 0x34, - 0xb4, 0xec, 0xba, 0x38, 0x88, 0x91, 0xb7, 0x25, 0x54, 0x20, 0x38, 0xb0, - 0x9f, 0x51, 0x1a, 0x6f, 0x69, 0xb5, 0x77, 0xc0, 0x3f, 0xc9, 0x3c, 0xbb, - 0x32, 0xd4, 0xd2, 0xa8, 0x85, 0x71, 0x29, 0xf4, 0x58, 0x03, 0x42, 0x3b, - 0x91, 0x9d, 0xe2, 0x4d, 0x9f, 0x24, 0x42, 0x67, 0xd6, 0x12, 0x60, 0x3b, - 0x53, 0x88, 0xff, 0x77, 0xba, 0x33, 0x33, 0xb4, 0x95, 0x99, 0xf8, 0x13, - 0x06, 0x4a, 0x9f, 0xef, 0xb6, 0xbc, 0x6a, 0x8e, 0xc1, 0x6c, 0xe8, 0x10, - 0xc1, 0x99, 0x48, 0xf4, 0x6a, 0x7b, 0x3f, 0xd7, 0x98, 0x21, 0x24, 0x0a, - 0xa1, 0xc9, 0xfa, 0x91, 0x33, 0x0d, 0x91, 0xc1, 0x05, 0xae, 0x2b, 0x5f, - 0xad, 0xa9, 0xcc, 0xdb, 0x2e, 0x67, 0xe1, 0xa1, 0x6e, 0xf7, 0x28, 0xeb, - 0x5b, 0x57, 0x6b, 0x98, 0x47, 0xdc, 0x49, 0xc2, 0x49, 0xc1, 0xf7, 0xea, - 0x0c, 0x1a, 0x9d, 0x07, 0x15, 0x5a, 0x08, 0x41, 0x2f, 0x0a, 0xab, 0xa8, - 0x82, 0x07, 0x7b, 0xa7, 0x52, 0xba, 0x2f, 0x0f, 0xb3, 0x41, 0xd3, 0x47, - 0x69, 0x0f, 0x5e, 0xd9, 0x7a, 0x3b, 0x2d, 0xa0, 0xc4, 0x6c, 0xd8, 0xe4, - 0x4d, 0x70, 0x8e, 0x2a, 0x98, 0xbd, 0x56, 0xd8, 0xe9, 0xa3, 0x62, 0x13, - 0x4e, 0xe7, 0xb6, 0x50, 0x0f, 0xd1, 0x21, 0x26, 0x28, 0x69, 0x16, 0x8a, - 0xff, 0x91, 0x9d, 0x38, 0xf4, 0x50, 0xef, 0xf7, 0xf7, 0xe4, 0x71, 0x72, - 0x1d, 0x36, 0xd3, 0xa9, 0x35, 0xf2, 0xf0, 0x57, 0x76, 0xda, 0xa8, 0x50, - 0x5e, 0x15, 0xd4, 0x3c, 0x98, 0xd7, 0xb2, 0x2f, 0x0f, 0xdc, 0x96, 0xd9, - 0x25, 0x79, 0xe9, 0x5b, 0x76, 0xa3, 0xe6, 0x7c, 0x4d, 0x63, 0x45, 0xea, - 0xa9, 0xab, 0x30, 0x35, 0x97, 0xb9, 0xdd, 0xb0, 0x43, 0x6f, 0x70, 0x42, - 0x2a, 0x23, 0x91, 0xd0, 0x8b, 0x54, 0x54, 0x3d, 0xbc, 0x1a, 0x67, 0x51, - 0x40, 0x75, 0x39, 0x7a, 0x81, 0xb1, 0xfe, 0xd3, 0xcf, 0xa3, 0xdd, 0x9a, - 0x35, 0xa0, 0xd1, 0xe3, 0x8f, 0x62, 0x1e, 0x30, 0xb8, 0x53, 0x76, 0x19, - 0x76, 0xb4, 0xcd, 0x4c, 0xf1, 0x69, 0xdb, 0x87, 0x33, 0x2e, 0x70, 0xc1, - 0xa7, 0x78, 0xf4, 0x6b, 0x05, 0xa9, 0x46, 0x08, 0xd8, 0x29, 0x50, 0x4f, - 0x58, 0xa8, 0x7e, 0x72, 0x88, 0xfd, 0x87, 0x5a, 0xdd, 0xce, 0x8d, 0xca, - 0xc0, 0xea, 0x67, 0x35, 0x6f, 0x99, 0xf1, 0xed, 0x7a, 0x2f, 0x29, 0xe6, - 0x91, 0xb8, 0x1c, 0xb6, 0xa4, 0x2c, 0xf3, 0x10, 0x56, 0x8e, 0xff, 0x3c, - 0x8b, 0xf8, 0x2e, 0xc6, 0x7a, 0x8d, 0xd6, 0x32, 0xe8, 0xd2, 0x13, 0x01, - 0xc1, 0x9f, 0xb5, 0xce, 0xfa, 0x81, 0x07, 0x30, 0xb2, 0x66, 0x7a, 0xcc, - 0x4d, 0xf6, 0xb7, 0x89, 0xd2, 0xd1, 0x11, 0x67, 0x14, 0x74, 0xbb, 0x4b, - 0xdc, 0x24, 0x3d, 0xfd, 0xfc, 0x38, 0x68, 0xa7, 0x04, 0x86, 0xd5, 0x04, - 0x46, 0xad, 0x02, 0x03, 0x91, 0xb0, 0xb1, 0x4e, 0xa9, 0x18, 0xe3, 0xe7, - 0x74, 0x29, 0x54, 0x35, 0x4b, 0x06, 0xba, 0x40, 0xd1, 0xf0, 0x40, 0xa5, - 0xcf, 0x92, 0xa9, 0x5f, 0x29, 0x38, 0x74, 0x94, 0x01, 0x6f, 0xa3, 0x7a, - 0x1a, 0xf4, 0xaf, 0x21, 0x56, 0x36, 0x43, 0xf1, 0x2d, 0x95, 0xfd, 0x01, - 0xdf, 0xac, 0x90, 0x55, 0x85, 0x5c, 0x51, 0x2f, 0x46, 0xf2, 0x27, 0x86, - 0x78, 0x18, 0xf9, 0x46, 0xd9, 0xed, 0x55, 0x40, 0xe5, 0x46, 0xef, 0xc3, - 0xb6, 0x8a, 0xb3, 0xa0, 0x00, 0x90, 0x62, 0xf9, 0x4c, 0x1e, 0xc0, 0xd8, - 0x78, 0x8a, 0xef, 0xdf, 0x8e, 0x9f, 0xab, 0xf2, 0xf6, 0x06, 0x9f, 0x52, - 0x5a, 0xdd, 0xbe, 0x8b, 0x4a, 0xba, 0xbd, 0xd1, 0x7b, 0x62, 0xd2, 0x78, - 0xbc, 0x4b, 0x77, 0x04, 0x4f, 0x44, 0x82, 0x6a, 0x52, 0x19, 0xf1, 0xa6, - 0x6b, 0x92, 0x75, 0x22, 0xa2, 0xb1, 0x43, 0x3c, 0xf9, 0x3f, 0xbb, 0x08, - 0x20, 0x38, 0xfa, 0x90, 0x25, 0x6a, 0x41, 0x37, 0x69, 0x7b, 0x43, 0x88, - 0xe0, 0x35, 0xf7, 0xf7, 0x1b, 0xd8, 0x9f, 0x98, 0xa6, 0xc6, 0xb6, 0x91, - 0xbf, 0xfb, 0xcf, 0xca, 0x74, 0x5f, 0x37, 0x47, 0x7b, 0x18, 0x01, 0x5a, - 0x1a, 0xfe, 0x39, 0x8d, 0xf2, 0x05, 0xb7, 0x91, 0xaf, 0xdb, 0x8e, 0xde, - 0xc4, 0x73, 0x1c, 0x7b, 0x3e, 0x46, 0xcd, 0xd3, 0xed, 0x8a, 0x74, 0x7f, - 0xa9, 0x3b, 0x61, 0x7e, 0x61, 0x34, 0x0e, 0x3b, 0x34, 0x80, 0xf4, 0xfe, - 0xfc, 0x10, 0x7f, 0x4f, 0xf7, 0xd2, 0x47, 0x37, 0x5d, 0xd3, 0x9a, 0xf6, - 0xef, 0x5d, 0xbf, 0xcd, 0x85, 0x32, 0x37, 0x83, 0xf1, 0x05, 0xb2, 0x51, - 0x22, 0x19, 0xbf, 0x84, 0xac, 0xdb, 0x71, 0xce, 0xc9, 0xde, 0x39, 0x1d, - 0xba, 0xab, 0x71, 0x92, 0xcc, 0x57, 0x86, 0x6c, 0x24, 0xa4, 0xee, 0xdb, - 0xd0, 0xe8, 0xb7, 0xcf, 0x60, 0x1e, 0xd8, 0xd5, 0xdf, 0x49, 0xb2, 0x51, - 0xdd, 0x15, 0xad, 0x3f, 0x9c, 0xa4, 0xea, 0xf0, 0x4f, 0x7b, 0x25, 0x52, - 0xf2, 0x9f, 0xb8, 0x75, 0x23, 0xa1, 0x5f, 0x56, 0x84, 0x6d, 0x30, 0x75, - 0xe5, 0x50, 0xe1, 0x31, 0xb4, 0x6f, 0x0a, 0xbb, 0x15, 0x15, 0xb6, 0x5b, - 0x39, 0xe8, 0x5d, 0xac, 0x20, 0xc6, 0xcb, 0xbc, 0x1a, 0x9d, 0x58, 0x19, - 0xc3, 0xa4, 0x2c, 0xa1, 0xf6, 0x84, 0xec, 0x65, 0xb2, 0xc7, 0x3e, 0x3e, - 0x4b, 0x2b, 0x59, 0xda, 0x6f, 0xb7, 0x68, 0x09, 0x34, 0x4e, 0x42, 0x10, - 0x85, 0x9c, 0xf6, 0xa4, 0xf9, 0x1f, 0xfc, 0x33, 0x6a, 0xa1, 0xe8, 0x70, - 0x3a, 0x65, 0x0a, 0x4d, 0x19, 0x84, 0xb9, 0xaf, 0x6b, 0xb3, 0x23, 0x76, - 0x73, 0x5c, 0xf5, 0xb3, 0xca, 0x6e, 0xde, 0x55, 0x0f, 0xd3, 0x65, 0x44, - 0x2a, 0x0d, 0x5b, 0x75, 0xb1, 0x6d, 0xd3, 0xb2, 0x9e, 0xac, 0xcb, 0x73, - 0x55, 0x37, 0xa6, 0x51, 0x1d, 0x07, 0xaf, 0xcc, 0xcc, 0x49, 0x74, 0x76, - 0xc9, 0xa8, 0x5b, 0xfc, 0x90, 0x1a, 0x76, 0x66, 0xa3, 0x14, 0x6b, 0x6f, - 0x9c, 0xba, 0x9c, 0x3a, 0x3f, 0xa6, 0x99, 0xd3, 0x56, 0xfb, 0xbb, 0xa8, - 0x40, 0x1e, 0x8b, 0xf2, 0x93, 0xc3, 0xb8, 0xfe, 0x82, 0x60, 0x59, 0x67, - 0x15, 0x8b, 0xda, 0x11, 0xf7, 0x83, 0x04, 0x8d, 0x8f, 0x43, 0x43, 0x7e, - 0x11, 0xe4, 0xa2, 0x11, 0x04, 0x85, 0x97, 0xc2, 0x7a, 0xc7, 0x08, 0xb4, - 0x4a, 0x6a, 0xb8, 0x2c, 0x38, 0xd7, 0xd3, 0x59, 0xaa, 0x87, 0x72, 0x09, - 0xbb, 0x52, 0x85, 0x54, 0x25, 0xcf, 0x75, 0x8f, 0x7f, 0xbb, 0x0c, 0x42, - 0x9b, 0x67, 0xe3, 0xbd, 0x05, 0xba, 0x3d, 0xb3, 0x50, 0x24, 0x0d, 0x68, - 0xe2, 0xa2, 0x48, 0x58, 0x3b, 0x87, 0x2e, 0x17, 0x66, 0xee, 0x9c, 0x2c, - 0x45, 0xfd, 0x56, 0x15, 0xdf, 0xe8, 0xa8, 0xef, 0x3b, 0xb6, 0x7d, 0x3a, - 0xf9, 0xa3, 0x03, 0x14, 0x10, 0xd8, 0xef, 0x95, 0x36, 0x37, 0x1f, 0x46, - 0x8c, 0xf8, 0x2c, 0xe4, 0x47, 0x00, 0x25, 0xb5, 0xb5, 0xad, 0x4d, 0x33, - 0xc4, 0xfa, 0x55, 0x8f, 0xf1, 0xa3, 0xe3, 0xb5, 0xda, 0x9f, 0x58, 0xc6, - 0x62, 0xe6, 0x41, 0xcd, 0x02, 0x3c, 0x2b, 0x5d, 0x6f, 0x7e, 0xc2, 0x8a, - 0x3a, 0x9f, 0xd9, 0x37, 0xc7, 0x21, 0x6a, 0x27, 0x52, 0x28, 0x75, 0x3c, - 0x15, 0xbe, 0xd0, 0x9a, 0x8a, 0x3d, 0x30, 0x2d, 0x4a, 0x48, 0x93, 0x6b, - 0x8c, 0xb6, 0xde, 0xb8, 0x85, 0xa3, 0x12, 0x21, 0xb2, 0xef, 0xe9, 0x5c, - 0x15, 0xa2, 0x91, 0x39, 0xe7, 0x4a, 0x29, 0x30, 0xcd, 0x8e, 0x33, 0x49, - 0x8e, 0x24, 0x75, 0x59, 0x9b, 0xbb, 0x27, 0x2c, 0xaa, 0x4f, 0x5c, 0x0d, - 0xfb, 0x85, 0x97, 0x2c, 0xa1, 0xbd, 0x19, 0x5b, 0xf2, 0xc3, 0x0b, 0xf8, - 0x15, 0x66, 0x49, 0x22, 0x96, 0x29, 0x5c, 0x5d, 0xfd, 0x5a, 0x99, 0xfd, - 0x95, 0xc0, 0x4c, 0x4c, 0xb9, 0x9e, 0xaf, 0x7f, 0xd7, 0x0a, 0xb2, 0x01, - 0xc5, 0x52, 0x8a, 0x21, 0xc9, 0x86, 0xed, 0x9b, 0x14, 0x91, 0x0f, 0x23, - 0x37, 0xeb, 0xc1, 0x73, 0x47, 0xe2, 0x02, 0x25, 0x32, 0xf5, 0x92, 0x9d, - 0x65, 0x42, 0x6f, 0xc5, 0x68, 0x9f, 0xed, 0x5b, 0xfe, 0x5d, 0x8a, 0x8a, - 0xd1, 0x6c, 0x8e, 0xa9, 0xe4, 0x80, 0xd7, 0xb8, 0xe9, 0xe7, 0xe4, 0x1a, - 0x14, 0xdc, 0x7a, 0x63, 0x0b, 0xfc, 0x02, 0x37, 0xa7, 0xf2, 0x82, 0xf9, - 0xed, 0x86, 0x85, 0x09, 0xe3, 0x59, 0xac, 0x3d, 0xab, 0x7d, 0x63, 0xeb, - 0x15, 0x55, 0xfe, 0xe6, 0x2c, 0xff, 0x54, 0xc2, 0x41, 0xa8, 0xe7, 0x9f, - 0x07, 0x80, 0x4c, 0xf8, 0x71, 0x9f, 0x2e, 0x5c, 0x37, 0x80, 0xe1, 0xff, - 0x60, 0x5d, 0xbe, 0x6d, 0x1b, 0x38, 0x35, 0xfa, 0x4d, 0x1e, 0xa6, 0xbe, - 0xfb, 0x0f, 0xa5, 0xf9, 0x2c, 0x4c, 0x2d, 0x9c, 0xe8, 0x17, 0x3d, 0x0a, - 0x95, 0x71, 0x66, 0xca, 0x9b, 0xfe, 0xd7, 0x70, 0x61, 0x1f, 0x42, 0x84, - 0xc8, 0x48, 0x7f, 0xc9, 0x6f, 0x85, 0x38, 0x9d, 0x70, 0x85, 0x53, 0xd7, - 0x33, 0xac, 0xd9, 0x2e, 0x8b, 0x94, 0x27, 0x16, 0xc0, 0xa2, 0xeb, 0x53, - 0xae, 0x50, 0x4f, 0x84, 0x0f, 0x66, 0x0c, 0x35, 0xc6, 0xf7, 0x7e, 0x35, - 0xd4, 0x8f, 0x33, 0xbc, 0x28, 0x43, 0x61, 0x93, 0x3a, 0x4f, 0x20, 0x4f, - 0xb2, 0x7e, 0x09, 0xbc, 0x98, 0x61, 0xf8, 0xc7, 0xd0, 0x97, 0x4c, 0x7e, - 0x90, 0x71, 0x0a, 0xa9, 0xa8, 0xc6, 0xff, 0x64, 0x5b, 0xc3, 0xc4, 0x91, - 0x30, 0xca, 0x4b, 0x43, 0x83, 0xc2, 0x24, 0x4e, 0xde, 0x54, 0xc7, 0x4b, - 0x92, 0x1a, 0xed, 0x0a, 0x28, 0x00, 0x76, 0xe0, 0xf0, 0x87, 0x50, 0xad, - 0x05, 0x28, 0xba, 0xcd, 0xb8, 0xef, 0x6b, 0x55, 0xb6, 0xdb, 0x98, 0x8e, - 0x79, 0xfe, 0x01, 0x95, 0x5c, 0xa7, 0x72, 0x5b, 0x53, 0x25, 0x2b, 0xa0, - 0xbd, 0xef, 0x1b, 0x4d, 0x7d, 0x5c, 0xa3, 0x22, 0x86, 0x7a, 0x94, 0xdd, - 0xc3, 0xe6, 0xd4, 0x71, 0x25, 0x3b, 0x3f, 0x2d, 0x94, 0x64, 0x1d, 0x9a, - 0xae, 0x3a, 0xb6, 0xeb, 0xf9, 0x9c, 0x76, 0x91, 0xe1, 0x80, 0x25, 0xdd, - 0x3b, 0xb2, 0x4f, 0x79, 0x98, 0x62, 0xe3, 0x51, 0xd9, 0x90, 0x05, 0x53, - 0x6a, 0xb3, 0xf4, 0x15, 0xbc, 0x32, 0x54, 0xa1, 0x26, 0x68, 0x84, 0x7d, - 0x02, 0xb6, 0xfd, 0x75, 0x1c, 0xbb, 0x0f, 0x00, 0x07, 0x5c, 0x9a, 0x9f, - 0x95, 0xdf, 0x5f, 0xa9, 0x9e, 0x47, 0xf8, 0x7c, 0xff, 0xf1, 0x26, 0x1e, - 0x21, 0x58, 0x03, 0xce, 0x60, 0x7b, 0xe1, 0x96, 0xc1, 0x0c, 0xf7, 0xd0, - 0xfd, 0x44, 0x31, 0xf9, 0x6c, 0x64, 0x9c, 0x1a, 0xaf, 0xb3, 0x17, 0x88, - 0x87, 0xe6, 0x7e, 0x12, 0x38, 0x7b, 0x4f, 0x02, 0x45, 0x9e, 0xda, 0x44, - 0xc0, 0x59, 0x79, 0xe8, 0x1e, 0x24, 0xd2, 0x35, 0x12, 0x6c, 0x8d, 0xea, - 0xac, 0xd8, 0x24, 0x21, 0x9c, 0xc1, 0xbc, 0x6b, 0xd8, 0xac, 0x96, 0xab, - 0x03, 0x05, 0x9d, 0x29, 0xd3, 0x01, 0x15, 0x51, 0x17, 0xd2, 0xfb, 0xec, - 0x04, 0x93, 0x64, 0xdf, 0x78, 0xbf, 0x94, 0x7a, 0x59, 0x9c, 0x64, 0x0d, - 0x6b, 0xe1, 0x07, 0xcf, 0xbd, 0x47, 0x0b, 0xf0, 0x1f, 0xf2, 0x4f, 0x54, - 0x51, 0xa7, 0x74, 0x5f, 0x20, 0x3d, 0xcc, 0xbc, 0x98, 0x42, 0x07, 0x94, - 0xed, 0xf8, 0xf9, 0xed, 0x84, 0x94, 0x13, 0x3b, 0x06, 0x8e, 0x2c, 0x91, - 0xfe, 0x4a, 0xbf, 0xbe, 0x50, 0xd1, 0x7e, 0xec, 0xc0, 0x60, 0xe9, 0x6a, - 0x50, 0x60, 0xf3, 0x15, 0x57, 0x3d, 0x2f, 0xbd, 0xda, 0x0c, 0x08, 0x30, - 0xe2, 0x3e, 0x57, 0xb5, 0xd9, 0x82, 0x73, 0x9d, 0x02, 0xff, 0x64, 0xce, - 0xd3, 0x38, 0x57, 0x61, 0x4a, 0xc7, 0xe2, 0x01, 0xae, 0x25, 0x74, 0x8c, - 0x5b, 0xfc, 0x8c, 0x3c, 0x50, 0x8d, 0x9a, 0x08, 0xbe, 0xc0, 0xb4, 0x6f, - 0xd6, 0x0d, 0xd2, 0x0a, 0x08, 0xcd, 0x36, 0xfe, 0x85, 0x18, 0xa3, 0x13, - 0x91, 0x8b, 0x84, 0xb2, 0x8c, 0x03, 0xb3, 0xc8, 0xcb, 0xd6, 0x82, 0x2d, - 0x00, 0xcc, 0xc3, 0x7c, 0x96, 0x40, 0x1d, 0x5f, 0x94, 0x8b, 0x73, 0x00, - 0x5c, 0x2a, 0xa7, 0x81, 0x41, 0xa3, 0x3a, 0x24, 0x63, 0xc8, 0xf7, 0xf2, - 0xc0, 0x02, 0xb9, 0x65, 0x28, 0x8f, 0x9c, 0x16, 0x16, 0xe6, 0x8b, 0xad, - 0x1a, 0xb4, 0x47, 0xb2, 0xd4, 0xa8, 0xde, 0xfd, 0xf0, 0x11, 0x5b, 0xb7, - 0x0e, 0xec, 0x5d, 0xc1, 0xb7, 0x3f, 0x8c, 0xc4, 0x89, 0x40, 0x49, 0x65, - 0x25, 0x87, 0x9f, 0x25, 0xe9, 0xe8, 0xae, 0x05, 0xe0, 0xdf, 0xa4, 0x4c, - 0x75, 0xd4, 0x65, 0x67, 0xac, 0xda, 0x5a, 0x16, 0xc8, 0x28, 0xf7, 0x67, - 0xcf, 0xa9, 0xa1, 0x14, 0xcc, 0x2f, 0xcc, 0xb6, 0x1d, 0x66, 0x56, 0x20, - 0x23, 0x23, 0x39, 0x32, 0x10, 0xb4, 0x6d, 0x5c, 0xe7, 0x4b, 0xdb, 0xb9, - 0xa2, 0x9c, 0xae, 0x46, 0xaf, 0xad, 0xc4, 0x24, 0x61, 0x05, 0x52, 0x6f, - 0x8c, 0x89, 0xac, 0xa6, 0x08, 0xbe, 0xcd, 0x3e, 0x27, 0x0f, 0x7f, 0x7d, - 0x0e, 0x63, 0x76, 0xee, 0x56, 0x3c, 0x74, 0xad, 0x58, 0x06, 0xed, 0xc3, - 0x6b, 0xb4, 0xea, 0x51, 0x47, 0x28, 0x80, 0xe2, 0x7b, 0x37, 0x50, 0x46, - 0xcf, 0x73, 0x2b, 0x1b, 0xfd, 0xfb, 0x7d, 0xe6, 0x29, 0x00, 0x85, 0xaa, - 0x0c, 0x84, 0xc9, 0x66, 0x0d, 0x59, 0xe6, 0x00, 0xb2, 0x8f, 0x83, 0x98, - 0x62, 0xc3, 0x8a, 0xf7, 0x69, 0x5b, 0x50, 0x9d, 0x93, 0xae, 0x3d, 0x7c, - 0x31, 0x65, 0x9e, 0xfe, 0x37, 0x55, 0x23, 0x7a, 0xc8, 0x39, 0x60, 0x9e, - 0x7e, 0x3c, 0xa5, 0xad, 0x6e, 0xf1, 0xd8, 0x90, 0x20, 0x18, 0xd6, 0x6a, - 0x36, 0xc5, 0x29, 0x7d, 0xc3, 0x90, 0x13, 0x09, 0x8f, 0x4b, 0x28, 0x95, - 0x6e, 0x34, 0xc2, 0xd9, 0x5f, 0x5d, 0x8d, 0x86, 0x5e, 0xf2, 0x35, 0xfe, - 0xcf, 0xdc, 0xca, 0x97, 0x29, 0xa9, 0xe3, 0xf9, 0x30, 0x51, 0x76, 0x37, - 0x6e, 0x9e, 0x0b, 0x11, 0xe8, 0xf9, 0x0c, 0xf9, 0x35, 0x23, 0x33, 0x4f, - 0x0a, 0x2a, 0x65, 0x98, 0x62, 0x4f, 0xac, 0x48, 0xd4, 0x92, 0x22, 0x1a, - 0xdb, 0xfe, 0xae, 0x60, 0xef, 0x38, 0x76, 0x4b, 0x95, 0xd9, 0xf9, 0x04, - 0x3e, 0xc0, 0x79, 0x57, 0xa3, 0xc3, 0xf5, 0x93, 0x81, 0xdf, 0xef, 0xda, - 0x11, 0xe8, 0x73, 0x44, 0x30, 0x2c, 0xcd, 0x8b, 0x2b, 0xfc, 0xed, 0x8b, - 0x61, 0x2e, 0x8e, 0x54, 0x80, 0x7e, 0x44, 0xb6, 0x9f, 0x1f, 0xbc, 0xcc, - 0x82, 0x1b, 0x62, 0xdc, 0x9f, 0xdc, 0x35, 0xc8, 0x93, 0x25, 0x2d, 0x4f, - 0x3d, 0x84, 0x30, 0xce, 0x0b, 0xf1, 0xe4, 0x64, 0x26, 0x06, 0x24, 0x0e, - 0xa1, 0x19, 0xe8, 0x9e, 0x39, 0x02, 0xe0, 0x70, 0x7a, 0x0f, 0x1b, 0x46, - 0x55, 0xd4, 0xa2, 0xfb, 0x46, 0x5b, 0x15, 0x22, 0x1c, 0xa1, 0x5d, 0xd9, - 0x5b, 0xd3, 0x74, 0xee, 0x8e, 0x53, 0x1d, 0x9c, 0xd8, 0x27, 0xff, 0x96, - 0x12, 0xd3, 0xa7, 0xf0, 0x68, 0x95, 0x24, 0xd4, 0x25, 0xb9, 0x0d, 0x1f, - 0x26, 0xf3, 0x38, 0x84, 0x1f, 0x43, 0x55, 0x8b, 0xbd, 0x5f, 0x9f, 0xfd, - 0x6e, 0x8a, 0xf5, 0xd6, 0xd6, 0xef, 0x36, 0xd5, 0x02, 0x40, 0xda, 0x40, - 0x56, 0x5f, 0x90, 0xc5, 0x91, 0x46, 0xec, 0xdd, 0x3c, 0xe1, 0x1b, 0xf6, - 0x68, 0x9c, 0x56, 0x8f, 0x8c, 0xea, 0xc5, 0xaa, 0x9a, 0x22, 0xf2, 0x0f, - 0x17, 0x45, 0x89, 0x4e, 0x1b, 0x9b, 0x0d, 0xcb, 0x56, 0x3c, 0x78, 0x90, - 0x1c, 0x2f, 0x95, 0xbc, 0x18, 0x89, 0xa0, 0x26, 0xf0, 0xdf, 0xf0, 0x6d, - 0x85, 0xf7, 0xd0, 0x48, 0x67, 0xad, 0x71, 0x0f, 0x5a, 0x3a, 0x1a, 0xf4, - 0xc2, 0x16, 0xe7, 0xf7, 0x86, 0x42, 0xcd, 0x0a, 0x9e, 0xd9, 0xca, 0x7a, - 0xbf, 0x1d, 0xe6, 0x73, 0xd9, 0xed, 0x54, 0xdf, 0x4d, 0xae, 0x64, 0xb4, - 0xc6, 0x33, 0xda, 0x8e, 0xe4, 0x1b, 0xf8, 0x40, 0xff, 0xf8, 0x3e, 0x5e, - 0x3c, 0xcc, 0xd8, 0xc2, 0x31, 0x1a, 0x74, 0x93, 0x1d, 0x96, 0x24, 0x45, - 0x67, 0x2b, 0xe3, 0x51, 0x25, 0x85, 0xe2, 0x6a, 0xc2, 0xac, 0xb7, 0x2f, - 0x09, 0x8d, 0x2f, 0xe2, 0x07, 0xcd, 0xd3, 0x07, 0xbe, 0xb6, 0x1d, 0xa3, - 0x15, 0x0a, 0x65, 0xb3, 0x1f, 0x44, 0xf9, 0x15, 0x31, 0x53, 0x83, 0x22, - 0x18, 0xa7, 0x5b, 0xe2, 0x38, 0xd1, 0xb4, 0x92, 0xd7, 0xe7, 0x8d, 0x17, - 0xd4, 0x10, 0xcf, 0x10, 0x26, 0xc3, 0x7a, 0xb5, 0x60, 0x34, 0xb1, 0xd4, - 0xbb, 0x4d, 0xbf, 0xbb, 0x2c, 0xce, 0xda, 0x5c, 0x31, 0xdb, 0x3c, 0xd3, - 0xac, 0xb1, 0x94, 0x8f, 0x0f, 0x6e, 0x67, 0x61, 0x15, 0x36, 0xe8, 0x0d, - 0x25, 0x4b, 0x75, 0xe6, 0xdf, 0x4c, 0x8c, 0x7d, 0x8e, 0x93, 0x63, 0x27, - 0x0c, 0x95, 0x51, 0x6a, 0xfd, 0xa6, 0x4f, 0x4b, 0x08, 0x45, 0xfd, 0x95, - 0x92, 0x19, 0x2d, 0x75, 0x45, 0x47, 0xaa, 0x04, 0x96, 0x54, 0x14, 0x8a, - 0xe8, 0xb2, 0xa5, 0x70, 0x12, 0xc5, 0xbf, 0x1d, 0x89, 0x4d, 0x42, 0x19, - 0x33, 0x9a, 0x48, 0xe8, 0x8a, 0x09, 0x60, 0x00, 0x0f, 0x7a, 0x2c, 0x3e, - 0x44, 0x90, 0x33, 0xff, 0x42, 0xad, 0x83, 0xdf, 0x8c, 0xab, 0x3f, 0x33, - 0xa4, 0x8e, 0xb1, 0x76, 0x86, 0xcd, 0x10, 0x32, 0x91, 0xa5, 0x47, 0xdd, - 0x19, 0xf9, 0xdb, 0xf0, 0x00, 0x5b, 0xe0, 0x7a, 0x84, 0x58, 0x59, 0x6a, - 0xb2, 0xc8, 0x05, 0x87, 0xf8, 0x7f, 0x52, 0x3e, 0x30, 0x42, 0x44, 0x41, - 0x22, 0x1b, 0xb4, 0xdd, 0x8d, 0x08, 0x28, 0x8d, 0xbf, 0x0b, 0x5f, 0x15, - 0x74, 0xd4, 0x21, 0x3b, 0x61, 0x6f, 0x6f, 0x71, 0xd4, 0x63, 0x8e, 0x9e, - 0x73, 0x6a, 0x96, 0x4c, 0x6a, 0x3b, 0x06, 0x30, 0x96, 0x7b, 0xfc, 0xab, - 0x90, 0xd0, 0x70, 0xe9, 0x6c, 0xf5, 0x5e, 0x61, 0xb0, 0x96, 0x87, 0x21, - 0x45, 0x2e, 0x03, 0x26, 0x33, 0xbc, 0xff, 0x60, 0xde, 0x66, 0x99, 0x08, - 0xbf, 0xe7, 0x99, 0xd4, 0xf9, 0x65, 0xe5, 0x43, 0x5d, 0xf9, 0x59, 0xdd, - 0xd7, 0xbd, 0xe2, 0x30, 0x84, 0x62, 0xbc, 0x93, 0xf7, 0xcf, 0xa1, 0xc6, - 0x11, 0x42, 0x49, 0xc8, 0x99, 0x1f, 0x2c, 0x41, 0x3a, 0xa0, 0xbf, 0x65, - 0xa2, 0xcf, 0x7c, 0xc2, 0x82, 0xe8, 0x56, 0x02, 0xdd, 0x98, 0x01, 0xc2, - 0x6f, 0x7b, 0xb6, 0xf8, 0x25, 0xc5, 0xe1, 0x08, 0x34, 0x82, 0x5e, 0xcc, - 0x72, 0xed, 0xbb, 0xea, 0x75, 0x27, 0x99, 0xbb, 0xef, 0x61, 0x37, 0x4b, - 0x9f, 0x5e, 0x77, 0xe7, 0xc2, 0x39, 0x77, 0x38, 0x78, 0x25, 0x3c, 0x90, - 0xc9, 0x4a, 0x1b, 0x5e, 0xd6, 0xc7, 0xac, 0x97, 0xf5, 0x1e, 0xcc, 0xc0, - 0xa9, 0xb9, 0x8b, 0xe9, 0xfa, 0x74, 0x72, 0x9e, 0x3f, 0x01, 0xa6, 0xc0, - 0x82, 0xf2, 0x1e, 0xbf, 0xf9, 0x5c, 0x5f, 0xc0, 0x52, 0xa6, 0xb9, 0xba, - 0x84, 0x62, 0x76, 0x4f, 0xf0, 0x5d, 0x45, 0x79, 0x2e, 0xe1, 0x7a, 0xf4, - 0x8a, 0x08, 0x59, 0x61, 0x13, 0xe9, 0x67, 0x1b, 0xd6, 0x97, 0x9f, 0x5b, - 0xec, 0x04, 0x7c, 0xce, 0x6e, 0xbd, 0xb4, 0xb1, 0xe8, 0x16, 0x7c, 0xa2, - 0x81, 0x39, 0x62, 0xdf, 0x3c, 0x03, 0x15, 0x48, 0x51, 0x7a, 0x8a, 0x9c, - 0xba, 0x5d, 0xd9, 0xfb, 0x48, 0x5f, 0x35, 0xb9, 0x12, 0x7b, 0xad, 0xc0, - 0x2e, 0x0b, 0x35, 0x21, 0x10, 0x43, 0xac, 0xd0, 0x77, 0x0c, 0x8f, 0xa6, - 0x5b, 0x2d, 0x50, 0x4f, 0x87, 0xc9, 0x63, 0xf2, 0x26, 0x63, 0xe8, 0xb5, - 0xb9, 0x03, 0x4a, 0x85, 0xf7, 0x68, 0xb4, 0x50, 0x20, 0x95, 0xe7, 0xf0, - 0x67, 0xbb, 0x04, 0x19, 0x15, 0x9e, 0x30, 0xea, 0xc2, 0xd4, 0x82, 0x59, - 0x81, 0xa9, 0x5d, 0xba, 0xf0, 0x34, 0xf0, 0x9d, 0x7c, 0x53, 0x04, 0x03, - 0xe4, 0x59, 0xa0, 0x2e, 0xcb, 0x1e, 0x64, 0xac, 0xdd, 0xd9, 0x32, 0x73, - 0xb7, 0xf9, 0xe0, 0x21, 0x22, 0x82, 0x22, 0x24, 0x68, 0x96, 0x85, 0xa6, - 0x7e, 0xa6, 0xc2, 0xd4, 0xac, 0x97, 0xb8, 0x81, 0xfe, 0xa8, 0x86, 0x79, - 0xa1, 0x22, 0xfa, 0x23, 0xe6, 0x67, 0x7e, 0xaa, 0xb4, 0xbe, 0x63, 0x1d, - 0x8a, 0x09, 0x1b, 0x15, 0x3e, 0xa9, 0xc8, 0x9c, 0x3f, 0xac, 0xdd, 0x10, - 0x3b, 0x9d, 0x89, 0x4e, 0x27, 0xd4, 0xb8, 0xe7, 0xdb, 0xbd, 0xdb, 0x4c, - 0x70, 0x00, 0x48, 0x0d, 0x53, 0xfe, 0xc3, 0xa8, 0x75, 0xb6, 0x6a, 0x8d, - 0xfd, 0x8b, 0xf9, 0x38, 0x9b, 0xed, 0x6e, 0xf2, 0xfa, 0x5f, 0xe4, 0xc7, - 0x25, 0x9e, 0x8a, 0xca, 0xf7, 0xf4, 0x52, 0x26, 0x60, 0x26, 0xd6, 0x40, - 0xcc, 0x29, 0x30, 0xa6, 0x6a, 0x28, 0xec, 0x22, 0x59, 0x9f, 0xab, 0x30, - 0x28, 0x0d, 0x69, 0x6b, 0x88, 0x2f, 0xc9, 0xb2, 0xd0, 0xe8, 0x9e, 0x0e, - 0x52, 0x9c, 0x63, 0x07, 0xbf, 0x2c, 0xdd, 0x14, 0xb8, 0xa7, 0xdd, 0xd1, - 0xb0, 0xfd, 0xe3, 0xf4, 0x16, 0x4c, 0x01, 0xd1, 0x4c, 0x39, 0x8c, 0xa9, - 0x0a, 0x9d, 0x3c, 0x78, 0x35, 0x2e, 0xfa, 0x3f, 0x8c, 0x97, 0x1e, 0x9e, - 0x14, 0xa8, 0x8f, 0xc5, 0x7e, 0x1f, 0x24, 0x63, 0xff, 0x99, 0x2e, 0x7a, - 0xec, 0x2d, 0xfc, 0xe5, 0x39, 0xf9, 0x31, 0x2e, 0x7e, 0x38, 0xff, 0x1f, - 0x0b, 0x3a, 0x53, 0x5c, 0x44, 0xb5, 0xba, 0x11, 0x4e, 0x0b, 0x57, 0x6b, - 0xbf, 0x5a, 0x05, 0x3e, 0xff, 0x4a, 0x06, 0xc4, 0x39, 0x94, 0x5b, 0x17, - 0xaf, 0xe3, 0x84, 0x26, 0x2b, 0xc3, 0x84, 0xc7, 0xdf, 0xd8, 0xea, 0xf1, - 0xaa, 0x80, 0x99, 0x98, 0x23, 0xd0, 0x46, 0x99, 0x56, 0x3f, 0xfb, 0x70, - 0x73, 0x96, 0x5a, 0xe3, 0x3b, 0x15, 0x7b, 0x40, 0xd0, 0x77, 0xac, 0x73, - 0xd5, 0xc4, 0xbd, 0x44, 0x54, 0x1e, 0x95, 0xf9, 0xa3, 0x3f, 0xb9, 0xdc, - 0xc9, 0xd4, 0xe4, 0x61, 0x5d, 0x5b, 0xa2, 0xef, 0x0d, 0x49, 0x32, 0xe3, - 0x09, 0xc0, 0xc7, 0x2b, 0x68, 0x20, 0xab, 0x2a, 0x05, 0x28, 0xc9, 0xf3, - 0x3a, 0xb0, 0xd3, 0x02, 0x40, 0x82, 0xb6, 0xfe, 0x5b, 0x00, 0x98, 0x48, - 0xec, 0xc4, 0x6b, 0x77, 0xb8, 0x9f, 0xd1, 0x5f, 0xd9, 0xa6, 0x5e, 0x2b, - 0x62, 0xcd, 0xc3, 0xfe, 0x72, 0xf3, 0x3d, 0xa5, 0xc1, 0xdf, 0x62, 0x0d, - 0xdd, 0x72, 0x6d, 0xa2, 0x08, 0x4e, 0x49, 0x6a, 0x6c, 0x75, 0x0b, 0x85, - 0x4b, 0x20, 0x70, 0x4b, 0x43, 0x51, 0x50, 0xf9, 0x84, 0x09, 0x5f, 0xfe, - 0x64, 0xb3, 0x4e, 0xa8, 0x62, 0x18, 0xc6, 0xe4, 0x1c, 0xe1, 0xe4, 0x71, - 0xfc, 0x75, 0x39, 0x4c, 0x4b, 0xca, 0x46, 0x4e, 0x03, 0xbc, 0xb5, 0x1b, - 0x94, 0x0e, 0x17, 0x23, 0xfc, 0x72, 0x42, 0xe3, 0xbb, 0x43, 0x64, 0x86, - 0x17, 0x6f, 0x3a, 0x97, 0x34, 0x82, 0xc3, 0x6a, 0x0d, 0xab, 0xa6, 0x2a, - 0xed, 0xce, 0xe2, 0x5a, 0x65, 0x43, 0x0d, 0x2d, 0xfa, 0xdb, 0x3f, 0x14, - 0x89, 0xe1, 0xcb, 0xe3, 0x95, 0x1c, 0x4d, 0xf0, 0x2f, 0x4b, 0x2b, 0xb5, - 0x25, 0x04, 0x88, 0x14, 0xad, 0x0a, 0x8e, 0x4e, 0xe0, 0x98, 0x64, 0xba, - 0x56, 0x32, 0xc3, 0x5d, 0x36, 0x67, 0x20, 0x91, 0xb2, 0xad, 0x55, 0x0b, - 0xa5, 0x65, 0x77, 0xbc, 0x03, 0x59, 0xc2, 0xb2, 0x2e, 0x0a, 0xd0, 0x20, - 0xce, 0x8e, 0xd8, 0x81, 0xca, 0x2b, 0xda, 0x36, 0xeb, 0xe0, 0xae, 0xba, - 0xb8, 0x4b, 0x8d, 0x99, 0xd3, 0xea, 0xdd, 0xe3, 0x61, 0x6a, 0xcc, 0x5f, - 0x13, 0x2d, 0x48, 0xff, 0x34, 0xc2, 0x18, 0x00, 0x87, 0x29, 0x52, 0xe0, - 0x5e, 0xf7, 0xea, 0x4e, 0x37, 0x4a, 0xcc, 0x43, 0x3c, 0x91, 0x09, 0x27, - 0x3e, 0x57, 0x7c, 0x7b, 0xd5, 0x47, 0xab, 0x9b, 0xef, 0x7a, 0xdd, 0xa6, - 0xe5, 0xc7, 0x98, 0x73, 0xdd, 0x8a, 0x81, 0x36, 0x01, 0xc6, 0x92, 0x18, - 0xe9, 0x5d, 0x3e, 0xa3, 0x2f, 0xd3, 0x8f, 0xfe, 0x8d, 0x44, 0x7c, 0x8b, - 0x99, 0x6d, 0x68, 0xb6, 0xbf, 0x3e, 0xb0, 0xbb, 0xd4, 0xb6, 0x1b, 0xda, - 0xd4, 0x35, 0x7c, 0xd4, 0xa5, 0x35, 0x14, 0x31, 0xeb, 0x13, 0x7e, 0x47, - 0xf7, 0x6e, 0x53, 0xa7, 0xb3, 0x9f, 0x86, 0x28, 0x81, 0xcb, 0x5e, 0x10, - 0xa9, 0x4a, 0x9a, 0x2b, 0x56, 0x73, 0xb3, 0xa3, 0xe3, 0xe1, 0xd4, 0x01, - 0x9c, 0x2e, 0xf1, 0x61, 0xad, 0x72, 0x30, 0x83, 0x12, 0x1e, 0x8a, 0x61, - 0x57, 0x70, 0x75, 0x31, 0xb8, 0x12, 0xa8, 0xcf, 0xaa, 0x1b, 0x8a, 0x75, - 0xc9, 0x3e, 0xc4, 0xdd, 0x33, 0x94, 0x8a, 0x3a, 0xaf, 0x4e, 0xa6, 0xd2, - 0xc0, 0xcf, 0x03, 0x8e, 0x17, 0x33, 0x0f, 0x81, 0x77, 0x53, 0xc8, 0xac, - 0xec, 0x2a, 0xc1, 0x64, 0x63, 0xc9, 0x6c, 0x45, 0x7e, 0xf5, 0x12, 0xf9, - 0xe6, 0xd0, 0xac, 0x3e, 0xa5, 0x47, 0x7e, 0x65, 0x7a, 0x17, 0xf8, 0x4d, - 0xb3, 0xb4, 0x80, 0x4c, 0xe7, 0xd2, 0xca, 0x16, 0xa4, 0xcc, 0xce, 0xb4, - 0x41, 0x82, 0x51, 0x87, 0x95, 0x4f, 0x7c, 0xa7, 0xf6, 0x15, 0xe3, 0x93, - 0xf5, 0x39, 0xa7, 0xcf, 0x17, 0xe5, 0x29, 0x90, 0xc8, 0x94, 0x55, 0xb1, - 0x8a, 0x59, 0x02, 0x86, 0x3c, 0x1e, 0x98, 0x39, 0x31, 0xd3, 0x01, 0x51, - 0x27, 0x7b, 0x36, 0x20, 0x00, 0xfe, 0x1e, 0x0a, 0xa0, 0x8e, 0x9e, 0x6c, - 0x38, 0xd2, 0x84, 0xd0, 0x35, 0xc2, 0x9d, 0x95, 0x52, 0xe6, 0xbb, 0x2d, - 0x99, 0xc7, 0x68, 0x48, 0x19, 0xd3, 0x91, 0x96, 0x69, 0x90, 0xac, 0x8f, - 0xdb, 0xad, 0xbf, 0xac, 0x76, 0x92, 0xd3, 0x84, 0x56, 0x46, 0xe2, 0xb5, - 0x23, 0x86, 0x0c, 0x05, 0x2c, 0xfc, 0xb8, 0x70, 0x9d, 0x2b, 0xe0, 0x70, - 0x27, 0x5d, 0x88, 0x3d, 0xa9, 0x85, 0xc8, 0x60, 0xe9, 0x46, 0xeb, 0xe1, - 0x32, 0xc3, 0xe3, 0x1f, 0x21, 0xe4, 0x86, 0xff, 0xcf, 0xa9, 0x8c, 0xf7, - 0x8f, 0x14, 0x99, 0x50, 0x31, 0x70, 0xea, 0x34, 0x9b, 0xb7, 0x31, 0xbf, - 0x9f, 0x73, 0xde, 0xd5, 0x0d, 0xba, 0x37, 0xb1, 0x28, 0x58, 0x86, 0xa3, - 0xa9, 0x1d, 0x49, 0x2f, 0x64, 0xde, 0x2a, 0x6a, 0xa8, 0x6f, 0xc5, 0xa7, - 0x43, 0x33, 0x46, 0x0a, 0xf3, 0x4f, 0xa8, 0x0f, 0x42, 0x70, 0x71, 0x81, - 0xbc, 0x3b, 0x91, 0x9c, 0x3c, 0x57, 0xe9, 0x55, 0x6c, 0x62, 0x9e, 0xc6, - 0xd1, 0xc7, 0x86, 0x46, 0x64, 0x0d, 0xb1, 0x2e, 0xd0, 0x3f, 0xb0, 0x10, - 0x2a, 0xf5, 0xf3, 0x35, 0xb6, 0x4f, 0xac, 0xf5, 0x41, 0x29, 0x69, 0x0e, - 0xfb, 0x30, 0x6a, 0xf7, 0x87, 0xb9, 0x3c, 0x80, 0xa2, 0xe2, 0xd3, 0x6a, - 0x94, 0x4e, 0x29, 0x7e, 0x2b, 0x16, 0x0d, 0x4b, 0xe5, 0xc3, 0x1f, 0x21, - 0x7a, 0x09, 0x64, 0x4e, 0x89, 0xe8, 0x7b, 0x1d, 0xed, 0x45, 0x9e, 0x4b, - 0x1e, 0x0f, 0x8b, 0x5d, 0x39, 0x76, 0xa4, 0x90, 0x6d, 0x75, 0xf1, 0x7e, - 0x74, 0x04, 0x3e, 0x9e, 0xc6, 0xe2, 0x4f, 0x23, 0x0d, 0x23, 0x2b, 0x79, - 0x5e, 0x29, 0x90, 0x57, 0x34, 0x28, 0x75, 0xac, 0xd7, 0x7c, 0x2a, 0xff, - 0x07, 0x6e, 0xc1, 0x94, 0xc3, 0x45, 0x2d, 0xb6, 0x07, 0x68, 0x9f, 0xee, - 0x28, 0x24, 0x87, 0x21, 0x44, 0x09, 0x22, 0x2c, 0x00, 0x01, 0x5b, 0xb2, - 0xd2, 0x5e, 0x35, 0x5b, 0x5d, 0xe3, 0x9c, 0x59, 0x18, 0xd6, 0xe6, 0xc6, - 0x5e, 0xf5, 0x6c, 0xa8, 0xb5, 0x2a, 0xf8, 0x3d, 0x52, 0xf9, 0x57, 0xf1, - 0x30, 0x4d, 0xb1, 0x52, 0x8e, 0x40, 0xc4, 0xd2, 0xa3, 0xab, 0xef, 0x97, - 0x44, 0x42, 0xc2, 0x59, 0x14, 0xd1, 0x47, 0x11, 0xb3, 0x1f, 0x69, 0xad, - 0xd0, 0xc4, 0xd0, 0x95, 0x6b, 0x7e, 0xcd, 0x5d, 0xf2, 0xd4, 0x1a, 0x8f, - 0xa5, 0xd2, 0x08, 0xb1, 0xa5, 0xe7, 0xf5, 0x7c, 0xd4, 0xb2, 0x40, 0x4d, - 0xab, 0x9e, 0x01, 0x69, 0xd1, 0x15, 0x47, 0xa2, 0xea, 0x6e, 0x6f, 0x0c, - 0x1c, 0x6f, 0x65, 0xa3, 0x42, 0x74, 0xd8, 0x68, 0xbd, 0xb4, 0xd4, 0x12, - 0x46, 0xdf, 0x0c, 0xbd, 0x94, 0x12, 0x2b, 0xe1, 0x29, 0x1f, 0xe1, 0xf4, - 0xf5, 0xac, 0x12, 0xe8, 0x7f, 0x79, 0x7b, 0xeb, 0xd4, 0x24, 0x81, 0xc7, - 0x7a, 0x92, 0x73, 0xda, 0xb8, 0x97, 0x6a, 0x17, 0x1c, 0x4e, 0x23, 0xef, - 0x65, 0x7d, 0x25, 0xad, 0xcd, 0x72, 0x7b, 0x31, 0xc7, 0x44, 0x34, 0xbf, - 0x3a, 0xd7, 0xb7, 0x4b, 0x18, 0x7d, 0xdf, 0x8f, 0x94, 0x10, 0xda, 0xea, - 0xd3, 0x90, 0x5e, 0x9f, 0x51, 0x89, 0x12, 0x70, 0x85, 0x51, 0xfc, 0x8b, - 0x57, 0xe2, 0xab, 0xa4, 0x7a, 0xa0, 0xa1, 0x0a, 0xff, 0x84, 0x7b, 0x03, - 0xc4, 0x20, 0xca, 0x5a, 0x6c, 0x57, 0x16, 0x11, 0xcd, 0x92, 0x8f, 0x67, - 0xb6, 0x9b, 0x2e, 0x03, 0x1d, 0x4b, 0x8b, 0xbb, 0x0c, 0xa6, 0xf1, 0x3f, - 0xb3, 0x64, 0xbb, 0xef, 0x77, 0xf7, 0x02, 0x46, 0x7e, 0x67, 0xb5, 0xd9, - 0x94, 0x52, 0x29, 0x09, 0xab, 0xfc, 0x55, 0x86, 0xa0, 0xfd, 0xf0, 0x50, - 0x6b, 0x7e, 0x0c, 0xa4, 0xe0, 0x9f, 0x4b, 0x83, 0xf1, 0xd6, 0xb0, 0xa5, - 0x53, 0xaa, 0x6b, 0x8b, 0xe5, 0xfd, 0xd7, 0xc4, 0xf3, 0xf1, 0x25, 0x61, - 0xf1, 0xb7, 0x94, 0xd4, 0x1c, 0xc0, 0x6a, 0xef, 0x86, 0x1c, 0xb5, 0xbe, - 0x55, 0xcc, 0x97, 0xa7, 0x7d, 0x7c, 0x4d, 0x9d, 0x50, 0x6e, 0x38, 0x7b, - 0x51, 0x33, 0x64, 0x86, 0xbb, 0x6e, 0xa7, 0xe6, 0xe6, 0x64, 0x84, 0x04, - 0x5b, 0x2f, 0xca, 0xf3, 0x4c, 0x34, 0xf6, 0x56, 0x80, 0x34, 0x5b, 0xfb, - 0x5d, 0x15, 0x8c, 0x86, 0x69, 0xa5, 0xee, 0x32, 0x5f, 0x30, 0xee, 0x9b, - 0xc9, 0x72, 0xe6, 0x4b, 0x11, 0xb6, 0x0a, 0x37, 0x5f, 0xf2, 0x16, 0xb8, - 0xd7, 0x53, 0xdb, 0x8e, 0xec, 0xdb, 0xf0, 0x05, 0x6f, 0x42, 0xa0, 0x22, - 0xa9, 0x03, 0xdb, 0x63, 0x47, 0x5b, 0xdd, 0x57, 0x97, 0x9c, 0xd1, 0xe1, - 0xdb, 0x51, 0x63, 0x86, 0xd3, 0xbb, 0xca, 0x39, 0x52, 0xf4, 0x18, 0x9a, - 0xbe, 0x9b, 0xa4, 0x4b, 0x52, 0x19, 0xf5, 0x4c, 0xfd, 0xfc, 0x88, 0x15, - 0xd0, 0x06, 0x3e, 0x35, 0x8b, 0x8c, 0x47, 0xc5, 0x5d, 0x0e, 0x61, 0x96, - 0x5e, 0x5e, 0xcb, 0x4f, 0xcf, 0xa4, 0x76, 0x58, 0xca, 0xe4, 0x17, 0x65, - 0x2a, 0x95, 0xc4, 0x6f, 0x8c, 0xab, 0x0c, 0x86, 0x0a, 0x8b, 0x0f, 0xf4, - 0x7b, 0x8b, 0xef, 0xfc, 0x9c, 0x7c, 0x54, 0x9c, 0xf6, 0xec, 0x62, 0x8f, - 0x79, 0x23, 0xc4, 0x80, 0x90, 0x01, 0xdd, 0x20, 0x39, 0x22, 0x38, 0x65, - 0x72, 0xc1, 0x89, 0x19, 0x09, 0x28, 0x5f, 0x6d, 0x4b, 0x91, 0xb7, 0xd5, - 0xa1, 0x3c, 0x25, 0xbd, 0x92, 0x91, 0x6e, 0xd2, 0x54, 0xd9, 0xf3, 0x90, - 0x69, 0xa8, 0xed, 0xf0, 0xb5, 0x38, 0xf8, 0x28, 0xb8, 0x2e, 0xf9, 0xf8, - 0x74, 0xe3, 0x7b, 0x95, 0xd2, 0x66, 0x1a, 0xfc, 0xb1, 0x07, 0xac, 0xd3, - 0xb3, 0x8f, 0x6a, 0xd6, 0x18, 0xe9, 0x24, 0xc2, 0xab, 0x3b, 0x7e, 0x7c, - 0xae, 0x15, 0x4b, 0x61, 0x94, 0x1f, 0xb0, 0xa5, 0x77, 0xda, 0x2f, 0xab, - 0x2d, 0x94, 0xb0, 0x60, 0xea, 0xf7, 0xa9, 0x04, 0xf6, 0x27, 0x15, 0xd8, - 0x02, 0xb3, 0x0a, 0x78, 0x67, 0x70, 0x3d, 0xd5, 0xac, 0xea, 0x3b, 0xfd, - 0xb6, 0xe9, 0xbf, 0x32, 0x1f, 0xa5, 0xad, 0x06, 0x2e, 0x55, 0xbf, 0x9d, - 0xb1, 0xd5, 0x61, 0xf1, 0xa0, 0x91, 0xfb, 0xde, 0x76, 0x4c, 0x26, 0xa8, - 0x34, 0x7f, 0x89, 0x8b, 0x83, 0x72, 0xc3, 0xaf, 0x8e, 0x6b, 0xf5, 0x2a, - 0xa0, 0x1f, 0x26, 0x70, 0x04, 0x22, 0x68, 0xa8, 0x22, 0x09, 0x31, 0x22, - 0x27, 0x0b, 0x04, 0x58, 0x75, 0x8e, 0x01, 0x8a, 0xc2, 0xf8, 0xea, 0x84, - 0xc9, 0xe4, 0xd3, 0xc1, 0x60, 0x89, 0x73, 0x74, 0x26, 0x8c, 0xaa, 0xa5, - 0xc3, 0xec, 0x88, 0xba, 0x49, 0x0c, 0x97, 0x72, 0xe6, 0xfc, 0x00, 0x16, - 0x5b, 0x72, 0x91, 0xa5, 0x55, 0x24, 0xe7, 0xb9, 0x7c, 0x33, 0xa2, 0x67, - 0x0e, 0x3c, 0x05, 0xda, 0xd0, 0xe6, 0xbc, 0x4d, 0x85, 0x6b, 0x8f, 0x06, - 0x7f, 0xe6, 0x15, 0x7d, 0x23, 0x7f, 0xee, 0xd2, 0x44, 0x95, 0x4c, 0x29, - 0x41, 0x73, 0xfd, 0x27, 0x1f, 0x84, 0x51, 0x3a, 0x79, 0x16, 0x65, 0xbf, - 0xfa, 0xe5, 0x32, 0xde, 0x5d, 0x53, 0x3a, 0xa8, 0xb5, 0x4c, 0xe6, 0x46, - 0xcf, 0x95, 0x57, 0xbb, 0x8c, 0x81, 0xc2, 0xa1, 0xf3, 0x6a, 0x97, 0xc7, - 0x96, 0xb0, 0x9b, 0x55, 0xb7, 0x7e, 0x48, 0x75, 0xbc, 0x8f, 0xb9, 0xe6, - 0x64, 0xd9, 0xce, 0x2f, 0x7a, 0xd8, 0x20, 0x91, 0xc4, 0x8d, 0xb5, 0x95, - 0xa8, 0xfe, 0x4b, 0x47, 0xbf, 0xde, 0xea, 0x8f, 0x19, 0x33, 0xef, 0x53, - 0x06, 0x66, 0x12, 0x99, 0x89, 0x93, 0x86, 0x34, 0x93, 0x39, 0x31, 0x51, - 0xb5, 0x27, 0xa7, 0xf0, 0x29, 0x23, 0x4a, 0x9d, 0x23, 0x1a, 0x81, 0xed, - 0x01, 0xc9, 0xd6, 0x45, 0x6a, 0x1f, 0x0b, 0xa0, 0xc7, 0xa9, 0x2f, 0x0f, - 0xb2, 0x47, 0x47, 0xae, 0x17, 0x5c, 0x22, 0x4f, 0x69, 0xc8, 0xf3, 0xfc, - 0x23, 0xfc, 0xa2, 0x5c, 0x97, 0x97, 0xd0, 0xe2, 0x3e, 0x09, 0x8d, 0x81, - 0xfa, 0x7b, 0x12, 0x89, 0x2c, 0x96, 0xdc, 0x40, 0xb0, 0x80, 0x43, 0x2c, - 0x38, 0x5d, 0xc4, 0xe8, 0x7f, 0x65, 0x43, 0x73, 0xc1, 0xed, 0xbe, 0xf0, - 0xb1, 0xbe, 0x2b, 0x89, 0x2f, 0xff, 0x59, 0x6f, 0x1c, 0x8f, 0x0f, 0x4b, - 0xb7, 0xc5, 0xed, 0xf0, 0x93, 0x0f, 0xbf, 0xe7, 0xe1, 0x95, 0xb2, 0x0b, - 0xb4, 0x7e, 0xb9, 0xa2, 0x2b, 0xb7, 0xd6, 0x3c, 0xce, 0x08, 0xbc, 0x24, - 0x89, 0x97, 0x44, 0x67, 0xf4, 0xfd, 0x58, 0xb7, 0x47, 0xa3, 0x44, 0xe4, - 0x29, 0x42, 0xbf, 0x27, 0x55, 0xb1, 0x97, 0xe5, 0x7d, 0x05, 0xd9, 0x18, - 0x29, 0xa4, 0xef, 0x40, 0x42, 0x9e, 0xe9, 0x57, 0xe9, 0x77, 0x2a, 0xed, - 0x6a, 0x22, 0xef, 0xf4, 0x7f, 0xc3, 0x07, 0xd8, 0xd0, 0x90, 0x39, 0xdd, - 0xb6, 0xb0, 0xad, 0x24, 0xa7, 0x7c, 0x4e, 0x9e, 0xa5, 0xb1, 0x0b, 0x05, - 0x0f, 0x94, 0xdd, 0x21, 0xca, 0xff, 0xb7, 0x3c, 0xb6, 0x43, 0x83, 0x00, - 0xe8, 0x4f, 0x87, 0xd1, 0x81, 0x6a, 0xba, 0x1c, 0x89, 0xb4, 0x88, 0x54, - 0xa9, 0xc3, 0xe5, 0x0c, 0x7c, 0xb0, 0xa6, 0x3d, 0x61, 0x3d, 0x7c, 0x51, - 0x0b, 0x58, 0x86, 0xd5, 0x30, 0x9f, 0x12, 0x3f, 0x89, 0xe9, 0x54, 0xdd, - 0xd5, 0x5d, 0x52, 0xcc, 0x55, 0xc5, 0x6d, 0x15, 0xaf, 0x64, 0x20, 0xed, - 0x5f, 0xff, 0x01, 0x18, 0x88, 0x1f, 0x5a, 0x48, 0x61, 0xdd, 0xa9, 0xac, - 0x63, 0x16, 0x8e, 0x24, 0xfc, 0xe5, 0x86, 0xc7, 0x14, 0xf8, 0xbf, 0x40, - 0x7a, 0x3f, 0xc3, 0x23, 0x41, 0x92, 0xff, 0x23, 0xb5, 0xcb, 0xb4, 0xb3, - 0xfd, 0x55, 0xdd, 0xef, 0x65, 0x94, 0x5e, 0x9b, 0x07, 0x82, 0x0f, 0xab, - 0x8e, 0x94, 0xf6, 0xe0, 0x66, 0x2e, 0x64, 0xb2, 0x0b, 0xdd, 0xf8, 0x5d, - 0xad, 0x67, 0x87, 0xd8, 0x42, 0xe9, 0xda, 0x89, 0x58, 0xfd, 0x36, 0x80, - 0xc3, 0x7e, 0x47, 0x14, 0x4a, 0x4d, 0x02, 0xa5, 0x81, 0x87, 0x77, 0xa9, - 0x0a, 0xc5, 0x2b, 0x42, 0xc7, 0x94, 0xe3, 0xb7, 0x2a, 0xe4, 0x36, 0xf1, - 0x88, 0x43, 0x02, 0x6c, 0x8a, 0x6d, 0x59, 0x87, 0xe9, 0x68, 0xab, 0x54, - 0x25, 0xcd, 0xef, 0x74, 0x9c, 0x0e, 0xba, 0x60, 0x00, 0x7f, 0xc4, 0x68, - 0x7a, 0xd5, 0x89, 0x67, 0xe2, 0xb0, 0x02, 0x2a, 0xf8, 0x9b, 0x01, 0x85, - 0x67, 0x75, 0x9b, 0xfd, 0x03, 0x8c, 0xc5, 0x65, 0xac, 0xbe, 0xea, 0xd7, - 0xd8, 0x36, 0x33, 0x97, 0x40, 0xed, 0xdc, 0x7c, 0x8d, 0x87, 0x99, 0xb6, - 0xd3, 0x97, 0xba, 0xee, 0xa5, 0xd6, 0x84, 0x9c, 0x2f, 0xe2, 0xf8, 0xd3, - 0x87, 0xf8, 0xc2, 0xa9, 0x88, 0x84, 0xfd, 0x0b, 0x05, 0x59, 0x6c, 0xc2, - 0xb4, 0x98, 0xaf, 0x68, 0x81, 0xa0, 0xfb, 0x13, 0xca, 0xd4, 0xe9, 0xde, - 0x39, 0x7d, 0x54, 0xa3, 0x08, 0x9e, 0x6d, 0xf2, 0xf5, 0xac, 0x67, 0x0d, - 0x2e, 0x96, 0x4f, 0x38, 0x6c, 0x79, 0x5a, 0x33, 0x4a, 0x15, 0xb7, 0xb8, - 0x91, 0x15, 0x9b, 0xaa, 0x73, 0xb1, 0xdd, 0xc7, 0xc4, 0x9f, 0xaa, 0x7a, - 0xe5, 0x82, 0x15, 0x5f, 0x5f, 0xc6, 0x5f, 0x92, 0x19, 0x3b, 0xd8, 0x19, - 0x80, 0x68, 0xf8, 0xbd, 0xa8, 0xdd, 0xb7, 0x9a, 0x0f, 0x68, 0xfe, 0xfd, - 0xcb, 0x92, 0x10, 0xfe, 0x99, 0x0f, 0xbf, 0x97, 0x23, 0x13, 0xe1, 0x70, - 0x23, 0xda, 0xba, 0x21, 0x97, 0x5e, 0x0e, 0xd1, 0x38, 0x20, 0xcf, 0x3e, - 0x05, 0x1a, 0x34, 0x65, 0x71, 0x73, 0x45, 0x23, 0x93, 0x5b, 0xea, 0x11, - 0xa7, 0xf9, 0x22, 0x4f, 0xb6, 0x0a, 0x4e, 0x6d, 0xc3, 0xd4, 0x21, 0x51, - 0xc3, 0x21, 0x96, 0x41, 0xf9, 0x14, 0x4f, 0xe1, 0x6d, 0xbf, 0x25, 0x27, - 0x0f, 0x7b, 0x75, 0x60, 0xf3, 0xb5, 0x58, 0xef, 0x99, 0x93, 0xff, 0xe6, - 0xe6, 0x1e, 0x2f, 0x70, 0x9f, 0x3f, 0xb2, 0x77, 0x41, 0xec, 0x3e, 0xc6, - 0xbd, 0xb1, 0x0b, 0x30, 0x3b, 0x04, 0x3e, 0xa0, 0x60, 0xd3, 0xd2, 0x3a, - 0xef, 0x47, 0x34, 0x8b, 0xed, 0x53, 0x57, 0xf3, 0x95, 0x39, 0xce, 0x06, - 0x3c, 0x8b, 0xc2, 0xf9, 0x86, 0x65, 0xb8, 0x2f, 0x76, 0x8e, 0x3e, 0x0b, - 0xda, 0xfb, 0xc8, 0x48, 0x63, 0xb6, 0x96, 0x7e, 0x4d, 0xbf, 0x73, 0x77, - 0x22, 0xe2, 0x88, 0xc6, 0x70, 0x49, 0x11, 0x7c, 0xe8, 0x26, 0xee, 0xb8, - 0xb6, 0x8d, 0x66, 0xee, 0xa4, 0x2f, 0x64, 0x6f, 0x4e, 0x49, 0xd4, 0x93, - 0x7f, 0x5f, 0xcc, 0x5b, 0x51, 0x04, 0xcf, 0x37, 0x67, 0xff, 0x31, 0xd1, - 0x68, 0xf1, 0xdf, 0xf9, 0x11, 0x38, 0x46, 0x82, 0x9f, 0x5a, 0xba, 0xc1, - 0x14, 0x7e, 0x98, 0xad, 0x26, 0xba, 0x52, 0x4a, 0xd3, 0x5d, 0xf5, 0xea, - 0xdc, 0x85, 0x67, 0xb8, 0xd2, 0x00, 0x47, 0xdd, 0xbd, 0x47, 0xf3, 0xb1, - 0x58, 0x82, 0x64, 0x3d, 0x28, 0xf5, 0xe5, 0xa8, 0x1e, 0xc4, 0xdb, 0x62, - 0xc8, 0xd2, 0x44, 0xa7, 0xbd, 0xa6, 0x98, 0x1c, 0x31, 0x1a, 0x4d, 0x0d, - 0xd8, 0x27, 0xab, 0x95, 0xb5, 0x43, 0x63, 0xbc, 0x38, 0xa3, 0x36, 0xc9, - 0xb5, 0x42, 0xdb, 0x6b, 0xa6, 0x5f, 0xfe, 0xf0, 0x0e, 0xe2, 0x52, 0x18, - 0xc9, 0x5e, 0x07, 0x58, 0x94, 0xc4, 0x35, 0xfb, 0x7c, 0x80, 0x45, 0x30, - 0x8b, 0x56, 0xfa, 0xe5, 0x3d, 0xbe, 0x2d, 0xe0, 0xb2, 0x40, 0x69, 0x9f, - 0xd8, 0xf3, 0x72, 0xcd, 0x6e, 0x27, 0x64, 0xec, 0x96, 0xb5, 0xff, 0xfe, - 0xae, 0xd9, 0xcd, 0x01, 0x09, 0x05, 0xaa, 0x5d, 0xfb, 0x59, 0xb1, 0x2e, - 0xe3, 0x73, 0xf9, 0xe3, 0x4d, 0xe7, 0xff, 0x2e, 0xf1, 0xd9, 0xf8, 0x64, - 0x46, 0x15, 0xe6, 0x1b, 0x1d, 0xde, 0x62, 0xfd, 0xe4, 0x20, 0x1e, 0xe5, - 0x13, 0xa1, 0x4e, 0x1a, 0xf6, 0xe1, 0x7c, 0xc3, 0x47, 0xa8, 0x81, 0x29, - 0xba, 0xe7, 0x3a, 0x23, 0x81, 0x2d, 0xdd, 0x1e, 0xdd, 0x5b, 0xe6, 0xd3, - 0xf5, 0x55, 0x98, 0x9c, 0x56, 0x0e, 0xb9, 0x5a, 0x95, 0x26, 0x53, 0x20, - 0x0b, 0x40, 0x65, 0x22, 0x0d, 0xe7, 0x72, 0x54, 0x62, 0x33, 0x77, 0x04, - 0x2e, 0x02, 0x02, 0x01, 0xd1, 0xdf, 0xc5, 0x66, 0xbb, 0x01, 0x5d, 0xb5, - 0x0d, 0xd1, 0xfc, 0x0d, 0x43, 0xf8, 0x15, 0x58, 0xd0, 0x3f, 0x9e, 0xf5, - 0x8e, 0x87, 0x15, 0x43, 0x01, 0x33, 0x4f, 0xf7, 0x45, 0xe4, 0x47, 0xfb, - 0x35, 0x3f, 0x83, 0xa0, 0x48, 0xb7, 0xe6, 0x14, 0x97, 0xb6, 0xc6, 0x8c, - 0x4e, 0xb9, 0xa9, 0x28, 0x67, 0xb4, 0xd4, 0x93, 0x48, 0x84, 0x5a, 0xb6, - 0x36, 0x28, 0x83, 0x65, 0xff, 0xb9, 0xf9, 0xda, 0xb5, 0xf9, 0x6c, 0x81, - 0x4c, 0x5d, 0x0f, 0x9b, 0x5b, 0xb8, 0x46, 0x2e, 0x83, 0x5b, 0x98, 0xe1, - 0xda, 0x2d, 0x7e, 0x17, 0xc4, 0x16, 0xd9, 0x30, 0x31, 0x76, 0x20, 0xf4, - 0x30, 0x3b, 0x21, 0xa6, 0xa4, 0xde, 0x5c, 0xc5, 0x62, 0x2a, 0x7c, 0x75, - 0xdf, 0x17, 0xc4, 0xc9, 0xf9, 0xe0, 0xc4, 0xe7, 0x9c, 0x9c, 0xed, 0x9c, - 0x9f, 0xeb, 0xcc, 0xc9, 0x45, 0x5a, 0x29, 0x04, 0x15, 0x57, 0x74, 0xd7, - 0xbd, 0xd7, 0x2a, 0x4c, 0x7b, 0x84, 0x2a, 0x8c, 0x3f, 0xdd, 0x26, 0xf0, - 0xa7, 0x49, 0xc2, 0x5c, 0x7b, 0xf3, 0xef, 0x80, 0x6d, 0xf0, 0xb7, 0x9e, - 0x1b, 0x56, 0xea, 0x92, 0x1b, 0x8d, 0x17, 0xd5, 0x09, 0xcf, 0xeb, 0xe0, - 0xb8, 0x60, 0x81, 0x61, 0xbe, 0x5d, 0x09, 0x49, 0xd4, 0x50, 0xaa, 0x1a, - 0x88, 0x63, 0x7e, 0x78, 0x6d, 0x70, 0xdc, 0xad, 0x47, 0x9e, 0x84, 0xc3, - 0x06, 0x8c, 0xfa, 0xe6, 0x88, 0x31, 0xd0, 0x44, 0xa8, 0x46, 0x05, 0xf7, - 0xe9, 0x16, 0x8d, 0x3d, 0x6f, 0x4d, 0xe0, 0x28, 0xc1, 0xd5, 0x16, 0xc8, - 0x73, 0xf2, 0xf9, 0xad, 0x5d, 0x32, 0x9d, 0xe7, 0xe4, 0x14, 0x80, 0xe9, - 0xa7, 0x21, 0xf2, 0x38, 0xca, 0x1d, 0x9f, 0xa1, 0x95, 0xdf, 0xd1, 0xac, - 0x40, 0xe4, 0xca, 0xc3, 0x0d, 0xb1, 0xcf, 0x9a, 0x7f, 0x77, 0x4e, 0xba, - 0xbc, 0x90, 0xc1, 0x2c, 0xee, 0x29, 0x74, 0x0b, 0xcf, 0x58, 0x5a, 0xf6, - 0x07, 0x34, 0xe8, 0x94, 0x35, 0x58, 0x92, 0x6e, 0x62, 0x26, 0xcf, 0x73, - 0x65, 0x12, 0x22, 0x47, 0xae, 0xb7, 0xa0, 0x3e, 0x4f, 0x5b, 0xb5, 0x81, - 0x96, 0x67, 0x11, 0x96, 0x23, 0x50, 0xe7, 0x21, 0xa9, 0x46, 0xcd, 0x00, - 0xbd, 0x8e, 0xa7, 0x19, 0xf0, 0xff, 0x04, 0xa4, 0x05, 0x74, 0xb0, 0xb4, - 0x11, 0x53, 0xfe, 0x7d, 0xe3, 0xfb, 0xc2, 0x3c, 0x50, 0x3f, 0xfc, 0x00, - 0xe3, 0xe9, 0xfb, 0x01, 0x12, 0x1c, 0x51, 0x55, 0x07, 0x77, 0x8b, 0x01, - 0x60, 0x0b, 0xc8, 0x04, 0x0f, 0xa2, 0xc9, 0x6e, 0x80, 0xce, 0x32, 0x9c, - 0xc5, 0x79, 0xd4, 0xf6, 0x86, 0x7c, 0x6d, 0xdd, 0xfa, 0x63, 0x27, 0x52, - 0x49, 0xfa, 0x82, 0x61, 0x29, 0x5c, 0xc0, 0xca, 0xe4, 0x8f, 0x02, 0x70, - 0xec, 0x54, 0xb5, 0x60, 0x1d, 0x3b, 0x05, 0x00, 0xef, 0x26, 0x51, 0xd6, - 0x50, 0x19, 0xff, 0xb5, 0xd4, 0x7c, 0xe1, 0x9f, 0x3e, 0x7c, 0x04, 0x4e, - 0x99, 0x9a, 0x5b, 0x78, 0xc0, 0x55, 0x31, 0x3c, 0xaa, 0x2c, 0x9e, 0x19, - 0x9e, 0xac, 0x24, 0x90, 0x03, 0x08, 0x24, 0xed, 0xab, 0xab, 0xba, 0xa2, - 0xc5, 0x15, 0x48, 0x60, 0x1c, 0xd5, 0xb3, 0xa1, 0xdf, 0x24, 0x71, 0x87, - 0x04, 0x8a, 0xd7, 0x29, 0xc3, 0xc1, 0x1a, 0x7d, 0xfb, 0xd5, 0xa7, 0xff, - 0xcb, 0x78, 0x15, 0x0a, 0x35, 0x5d, 0xba, 0xb2, 0x81, 0x65, 0xdd, 0x80, - 0x6c, 0xcd, 0x82, 0x6f, 0x4f, 0x71, 0x17, 0x1a, 0x3e, 0x73, 0x34, 0x4b, - 0xf5, 0x5f, 0x91, 0x27, 0xc4, 0x34, 0x7e, 0x0d, 0xf0, 0x22, 0x88, 0x39, - 0x30, 0x5d, 0x76, 0x77, 0x2c, 0x0c, 0x91, 0x1b, 0xc1, 0x21, 0x44, 0x6b, - 0x37, 0xa7, 0x0e, 0xca, 0x7d, 0x99, 0x2e, 0x5a, 0x80, 0xff, 0x3f, 0xb8, - 0x91, 0x6f, 0xb9, 0x2c, 0xde, 0x29, 0x4d, 0xf4, 0xe5, 0x17, 0x20, 0x77, - 0xff, 0x46, 0xa0, 0x9b, 0x16, 0x52, 0x63, 0xad, 0xf9, 0x7d, 0x75, 0x08, - 0xbf, 0x03, 0xfb, 0x37, 0xaa, 0x73, 0x7b, 0x8b, 0x16, 0xbc, 0x85, 0x02, - 0x29, 0x9c, 0xd9, 0x01, 0x81, 0xe4, 0x07, 0xde, 0x48, 0x5d, 0xc2, 0x31, - 0x40, 0x30, 0x3e, 0x53, 0xc6, 0x89, 0xf5, 0x83, 0xad, 0x96, 0x1e, 0x32, - 0xfc, 0x15, 0x59, 0xe6, 0x69, 0x77, 0xdd, 0x84, 0x91, 0x5b, 0xb5, 0x53, - 0x6c, 0x5a, 0x7a, 0xfa, 0x9c, 0x19, 0x43, 0x97, 0xc6, 0xaa, 0xca, 0x43, - 0xc0, 0x0c, 0xfc, 0xed, 0x51, 0xc9, 0x20, 0x57, 0x72, 0x42, 0xef, 0xe7, - 0xd2, 0x01, 0xb6, 0x30, 0xe0, 0x9d, 0xc2, 0x02, 0xeb, 0x19, 0xec, 0x85, - 0xd1, 0x96, 0xda, 0x00, 0x7a, 0xb7, 0x18, 0xfc, 0xb5, 0x1d, 0x6b, 0x8b, - 0xa4, 0x97, 0x5f, 0x1a, 0x7a, 0xc5, 0xd1, 0x06, 0x03, 0x9c, 0x8c, 0x01, - 0xff, 0x85, 0xa6, 0x32, 0x8c, 0xe1, 0x14, 0xcc, 0x1f, 0x89, 0xf0, 0x45, - 0x05, 0x04, 0x8b, 0x1b, 0x94, 0x5f, 0x8d, 0x0d, 0xea, 0x0f, 0xfd, 0xe7, - 0x67, 0xed, 0xfb, 0x69, 0x04, 0x77, 0x25, 0x73, 0xd6, 0x56, 0x0c, 0x39, - 0xbd, 0x38, 0x39, 0xe3, 0x57, 0x53, 0xe2, 0xad, 0xa8, 0x66, 0x1e, 0xde, - 0x70, 0x2f, 0xdf, 0x4e, 0x27, 0x9c, 0xc6, 0x6c, 0xba, 0x7f, 0x13, 0x02, - 0x56, 0x13, 0xbd, 0x7c, 0xed, 0x6f, 0x90, 0x9f, 0x22, 0x6f, 0x3e, 0xcf, - 0x29, 0x7e, 0xe0, 0x0e, 0xb8, 0x71, 0x52, 0xfc, 0x49, 0xba, 0x9b, 0x07, - 0x3e, 0x6d, 0x16, 0x1b, 0xb5, 0xf8, 0xc4, 0x5d, 0x9c, 0x22, 0xfd, 0x74, - 0xe4, 0x5a, 0x8c, 0x39, 0xcb, 0xda, 0x3b, 0x53, 0x8d, 0x27, 0x1a, 0x71, - 0x98, 0x09, 0x32, 0x6f, 0xc9, 0xf0, 0x2e, 0xb3, 0x2c, 0xb3, 0xe7, 0x2f, - 0xe2, 0x87, 0x50, 0x70, 0xfd, 0x38, 0x89, 0x6f, 0x8e, 0xb8, 0xb5, 0x2a, - 0x85, 0x05, 0x0d, 0x5d, 0x45, 0xd9, 0x5b, 0xbf, 0x30, 0x69, 0x2c, 0xb4, - 0x82, 0xcf, 0x53, 0x24, 0xcc, 0x5f, 0x67, 0xd5, 0xf3, 0x37, 0xcd, 0xf6, - 0xa0, 0x1b, 0x26, 0x53, 0x24, 0x3a, 0x0f, 0xf3, 0x23, 0xed, 0xfd, 0x93, - 0x33, 0x24, 0xd2, 0x2b, 0xe5, 0x2b, 0x05, 0xc2, 0x69, 0x7c, 0x1c, 0x10, - 0xcc, 0xd9, 0x85, 0xc7, 0xc8, 0x33, 0xa8, 0xfd, 0xb2, 0xcb, 0xda, 0xfc, - 0xf1, 0x52, 0x87, 0x0b, 0xc3, 0xc1, 0x11, 0x7e, 0xfc, 0xe7, 0x4a, 0x0e, - 0xe0, 0x75, 0x15, 0x67, 0x5e, 0x97, 0xe8, 0x41, 0xd8, 0x4a, 0x58, 0x98, - 0x7e, 0xab, 0x20, 0xe6, 0x56, 0x05, 0x50, 0x4d, 0x5c, 0xdf, 0xb6, 0x7f, - 0x06, 0xd6, 0xc5, 0x17, 0x35, 0x2c, 0x04, 0x0f, 0xe1, 0xd8, 0x4e, 0xe9, - 0xec, 0xf1, 0x9e, 0xd1, 0x87, 0x3d, 0x9b, 0x4a, 0xa4, 0xb5, 0xdf, 0x4e, - 0x5e, 0x29, 0xa1, 0x8e, 0x79, 0x59, 0x05, 0xfc, 0x34, 0x44, 0xac, 0xcf, - 0x9f, 0x2b, 0xfe, 0x30, 0x46, 0x77, 0x2a, 0x06, 0x88, 0xfe, 0xdb, 0xac, - 0x66, 0x8f, 0xbd, 0xbf, 0x6a, 0x51, 0xf3, 0xf8, 0x5e, 0xb6, 0xf2, 0x23, - 0x37, 0x33, 0xa6, 0xb5, 0xc2, 0xf1, 0xe6, 0xc3, 0x49, 0x98, 0x73, 0x0a, - 0x80, 0x23, 0xee, 0xd0, 0x58, 0x06, 0x5a, 0x0c, 0xa1, 0x95, 0x38, 0xb8, - 0xac, 0x90, 0x3c, 0x7b, 0xbe, 0x58, 0x20, 0x64, 0x41, 0x1e, 0x21, 0xee, - 0xdd, 0xa7, 0x53, 0xd4, 0x72, 0x33, 0xbf, 0xf1, 0xfc, 0xb4, 0x0d, 0x0d, - 0xa5, 0x6b, 0x50, 0x59, 0x50, 0x92, 0xbd, 0x73, 0x4a, 0x7d, 0x9d, 0x8f, - 0x8e, 0xb2, 0xd2, 0x2d, 0xa6, 0x9f, 0xbe, 0xa3, 0x6d, 0x6d, 0x58, 0xd5, - 0x20, 0xbe, 0x6f, 0xe0, 0xa8, 0xc5, 0x71, 0x5a, 0x0f, 0x2e, 0x7e, 0x08, - 0x43, 0x9b, 0x7b, 0x4d, 0x43, 0xb8, 0x07, 0x10, 0xbb, 0x03, 0x45, 0x14, - 0xd7, 0x77, 0x29, 0x7a, 0xe4, 0x0e, 0xda, 0x0c, 0xe5, 0xe1, 0x2a, 0x1c, - 0xec, 0x20, 0x1d, 0xf8, 0x63, 0x9c, 0x04, 0x6e, 0x59, 0x8f, 0x10, 0xa7, - 0xe3, 0x5d, 0x25, 0x78, 0x5d, 0xab, 0xca, 0x84, 0xbd, 0x8b, 0xf0, 0x4d, - 0x4b, 0xa7, 0x4d, 0x86, 0xd2, 0x45, 0x63, 0xbd, 0x7e, 0x6b, 0x64, 0x02, - 0x30, 0xfa, 0x5f, 0xd1, 0xef, 0x64, 0x15, 0x80, 0x76, 0xb6, 0xc2, 0x43, - 0x24, 0xe7, 0x49, 0xe7, 0x68, 0x98, 0x35, 0x39, 0xa1, 0xb1, 0xd7, 0xc6, - 0x0e, 0xe5, 0x5c, 0xae, 0x88, 0xfd, 0x1c, 0x7e, 0x32, 0xc5, 0xf8, 0xcf, - 0xf2, 0x9b, 0xd4, 0xa9, 0x56, 0xa9, 0x0e, 0x06, 0xef, 0xa4, 0xc6, 0x19, - 0xcf, 0xb6, 0x3c, 0xc4, 0x37, 0xde, 0x30, 0xf1, 0x19, 0x5b, 0x43, 0x2f, - 0x3a, 0xbf, 0x84, 0x71, 0xd9, 0x91, 0x21, 0x06, 0x5a, 0x55, 0x37, 0xfa, - 0x0a, 0xde, 0xe1, 0xd3, 0x2c, 0x93, 0xd5, 0x76, 0xe5, 0xe2, 0x17, 0xec, - 0xf1, 0x74, 0x7c, 0x3d, 0xdf, 0x7b, 0xef, 0xb0, 0x1f, 0x7d, 0xf7, 0x5d, - 0xa4, 0x64, 0x27, 0x95, 0xbd, 0xd0, 0x6e, 0xef, 0xda, 0xd7, 0xc5, 0x30, - 0x71, 0x86, 0x23, 0x86, 0x2f, 0x92, 0x89, 0x5b, 0xe6, 0x4c, 0x4e, 0x14, - 0x08, 0x43, 0x57, 0xda, 0x77, 0x28, 0x0c, 0xde, 0x15, 0xca, 0xe5, 0x9e, - 0x59, 0x03, 0x9f, 0x56, 0x9e, 0x02, 0xb9, 0x8e, 0xe5, 0xe2, 0xea, 0xff, - 0x4c, 0xef, 0x82, 0x2c, 0xbf, 0x96, 0x86, 0x71, 0x39, 0xf2, 0x98, 0x49, - 0x34, 0x16, 0x92, 0x32, 0x8c, 0xe6, 0x48, 0x3d, 0x3e, 0xe1, 0x74, 0xd6, - 0x12, 0x49, 0x92, 0x89, 0xbd, 0x35, 0x6f, 0x14, 0x04, 0x0f, 0x6d, 0xb4, - 0x18, 0xf1, 0x66, 0x83, 0xe3, 0xf3, 0xff, 0x0f, 0xf2, 0xff, 0x4f, 0x44, - 0x6f, 0xcf, 0x31, 0xfd, 0x94, 0x2d, 0x05, 0xba, 0x4a, 0x81, 0x32, 0x22, - 0x3e, 0xf3, 0x21, 0x0b, 0x3a, 0x2b, 0x2d, 0x15, 0x0e, 0x64, 0x4c, 0xa5, - 0xb0, 0x8e, 0x63, 0x8b, 0xd6, 0x13, 0x31, 0x88, 0xc2, 0xde, 0xea, 0x2d, - 0xe5, 0xa7, 0x26, 0x95, 0x52, 0xf9, 0xc6, 0xcb, 0x6f, 0x62, 0x3b, 0x2d, - 0xff, 0x14, 0xa2, 0xc0, 0xa4, 0x40, 0xf8, 0x0c, 0xc8, 0x6b, 0x02, 0xec, - 0x47, 0x61, 0x5b, 0x4e, 0xcd, 0xe1, 0x40, 0xe1, 0x4b, 0x7e, 0x79, 0x98, - 0x24, 0x97, 0x82, 0x6b, 0xda, 0x9e, 0xfa, 0x18, 0xe7, 0xa9, 0xbb, 0xdb, - 0xc3, 0xc2, 0xee, 0x67, 0x91, 0xa8, 0x98, 0xf5, 0x01, 0x9b, 0xb6, 0xa1, - 0x12, 0x3d, 0xcf, 0xee, 0x63, 0xdc, 0x66, 0xb5, 0xb5, 0xba, 0x20, 0x6f, - 0xba, 0x5e, 0xd4, 0x5a, 0xd3, 0x3d, 0x37, 0xb7, 0x9d, 0xd9, 0x87, 0x68, - 0x5a, 0xa3, 0x21, 0x56, 0xd6, 0xe8, 0xeb, 0x99, 0x44, 0x32, 0x20, 0x6e, - 0xdc, 0x10, 0xc1, 0x42, 0x31, 0x6f, 0x23, 0x4f, 0x2c, 0x09, 0x17, 0x3f, - 0xc6, 0x0b, 0x89, 0xb2, 0x0d, 0xcf, 0xd1, 0xcd, 0x2f, 0x1a, 0xe8, 0x4c, - 0xd3, 0x5d, 0xe2, 0xec, 0x7a, 0xad, 0x96, 0xf1, 0x49, 0x16, 0x8e, 0x11, - 0x19, 0x4c, 0x16, 0xe2, 0xbd, 0x42, 0x11, 0xd5, 0xeb, 0x8d, 0x74, 0xb6, - 0xec, 0x3c, 0x22, 0x75, 0xdd, 0xc2, 0x7d, 0x6c, 0x5e, 0x83, 0xfd, 0x7a, - 0xa1, 0x5b, 0xee, 0x0b, 0xac, 0x30, 0x40, 0x34, 0x2d, 0x2a, 0x1e, 0x56, - 0x29, 0x4d, 0x28, 0x92, 0xb8, 0xc8, 0x58, 0xd1, 0x41, 0xb8, 0x76, 0xe2, - 0x93, 0xc3, 0xd2, 0xf9, 0xf7, 0xe4, 0xb2, 0x73, 0x88, 0x78, 0x49, 0xee, - 0x91, 0x17, 0xf8, 0x2f, 0x10, 0xdb, 0xbd, 0x51, 0xfd, 0x3d, 0xf8, 0xda, - 0x26, 0x04, 0x07, 0xdd, 0xdb, 0x50, 0x2c, 0x81, 0x6f, 0x18, 0x7a, 0x3f, - 0x51, 0x14, 0xee, 0xd2, 0xbe, 0xb6, 0x33, 0x1e, 0x3a, 0x56, 0xaa, 0x10, - 0xfd, 0x3d, 0xa8, 0xd2, 0xb9, 0xed, 0xe2, 0xa1, 0xd9, 0x2a, 0x11, 0x8e, - 0xe6, 0x04, 0x8a, 0x55, 0xb2, 0x04, 0xef, 0x3b, 0x84, 0xca, 0x62, 0x4d, - 0x33, 0xe8, 0xbb, 0xe3, 0xa3, 0xf8, 0x75, 0xfb, 0x84, 0x88, 0xf7, 0xba, - 0xcb, 0x81, 0xf9, 0x1d, 0x25, 0xf8, 0x49, 0xdb, 0x76, 0x62, 0x19, 0xff, - 0x16, 0x66, 0xc2, 0xc1, 0xea, 0xbe, 0x71, 0x60, 0x3c, 0xf2, 0x81, 0x2e, - 0x73, 0x68, 0x5c, 0xa5, 0xc9, 0x10, 0x41, 0x42, 0xf3, 0xa3, 0x44, 0xf2, - 0x77, 0x52, 0x01, 0x53, 0xfc, 0x33, 0xb6, 0xfa, 0x14, 0x21, 0xba, 0x8f, - 0xa6, 0xf8, 0x45, 0x78, 0x18, 0xba, 0xbe, 0x7c, 0x02, 0xaf, 0x68, 0x4f, - 0x1f, 0x81, 0x3c, 0x58, 0x32, 0x93, 0x1e, 0x50, 0x8f, 0x36, 0x12, 0x44, - 0xbe, 0x7a, 0x6e, 0x63, 0x25, 0xa4, 0xb4, 0xd8, 0x33, 0x72, 0x6b, 0x74, - 0x79, 0x57, 0xcd, 0xb7, 0xb1, 0x96, 0x2d, 0xb2, 0x49, 0x1f, 0x4a, 0xa4, - 0x7f, 0xff, 0x8e, 0xf6, 0x2a, 0x49, 0xa6, 0x5c, 0xc7, 0x0e, 0x7d, 0x86, - 0xd4, 0x10, 0x1c, 0xad, 0xd9, 0xbe, 0x17, 0x67, 0xec, 0x08, 0x86, 0x85, - 0x91, 0x0b, 0x06, 0x89, 0x21, 0x22, 0xce, 0x84, 0x58, 0x96, 0x29, 0xbc, - 0xc0, 0xc2, 0xaa, 0x2a, 0x0b, 0x56, 0x17, 0xd9, 0x4a, 0xef, 0x5d, 0x86, - 0x74, 0xf2, 0x52, 0x85, 0xcc, 0x27, 0xbb, 0xbd, 0x5b, 0x7f, 0x51, 0x54, - 0xfa, 0xf2, 0xd7, 0x8a, 0xfb, 0x07, 0xb7, 0x79, 0xcd, 0xa7, 0x8f, 0xfa, - 0xd3, 0xd7, 0xf2, 0x90, 0x18, 0x5f, 0x6c, 0x0d, 0x5f, 0xe7, 0x20, 0xfc, - 0x9c, 0xd0, 0x77, 0x23, 0x95, 0x62, 0xa6, 0x9b, 0x19, 0x97, 0x4a, 0xc6, - 0xa8, 0x1d, 0x17, 0xc8, 0x3b, 0x86, 0x7e, 0x90, 0xf2, 0xbe, 0x24, 0x0b, - 0xa8, 0x9e, 0xc8, 0xad, 0xea, 0xef, 0xaf, 0x54, 0x22, 0xbd, 0xc1, 0x04, - 0x94, 0xda, 0x6a, 0xa9, 0x6a, 0x17, 0xcc, 0x4a, 0x56, 0xbf, 0xd1, 0xd3, - 0x70, 0x82, 0xe6, 0x4b, 0x78, 0xa3, 0x94, 0xe1, 0xe0, 0x0c, 0x9f, 0x7a, - 0xaf, 0xbe, 0x83, 0x42, 0x57, 0xe2, 0xd6, 0x6c, 0xa4, 0x13, 0x7b, 0x8f, - 0x02, 0xbd, 0x11, 0x5e, 0xcc, 0xf0, 0xbb, 0x2b, 0x25, 0x98, 0xc9, 0xa8, - 0x69, 0xc0, 0xa1, 0xeb, 0xa2, 0x81, 0xb3, 0x3b, 0x92, 0xdf, 0x83, 0xe4, - 0x58, 0x70, 0x7f, 0x92, 0x7a, 0x15, 0x01, 0xb5, 0x84, 0x65, 0x64, 0x1b, - 0x52, 0x67, 0xe4, 0xb9, 0xc2, 0x2b, 0xd3, 0x1b, 0x0a, 0x54, 0x54, 0x31, - 0xc5, 0xde, 0x4e, 0xcd, 0xe7, 0xd6, 0x32, 0x43, 0x32, 0x71, 0xba, 0xc2, - 0xfd, 0xe2, 0x8f, 0x0e, 0x22, 0x9b, 0xa4, 0x63, 0xc2, 0x45, 0xd8, 0xf4, - 0xcb, 0x13, 0xbf, 0xaa, 0xdb, 0xc5, 0x75, 0x0c, 0x0b, 0x13, 0x7c, 0xff, - 0x0e, 0x37, 0x7e, 0x46, 0xc7, 0x3a, 0x29, 0x95, 0xe3, 0x2a, 0x2f, 0xa0, - 0x59, 0xdd, 0xcf, 0x15, 0xdd, 0xe0, 0x8a, 0x2b, 0x03, 0x14, 0xd3, 0x1b, - 0xd7, 0x49, 0xb5, 0x7b, 0xa5, 0x56, 0xc1, 0xa8, 0x7c, 0xac, 0x47, 0xde, - 0xf8, 0xbe, 0xa1, 0x6e, 0x38, 0x53, 0xa2, 0xb3, 0xb6, 0xea, 0x06, 0xe5, - 0x42, 0x0b, 0xac, 0x64, 0x88, 0x81, 0xdb, 0xf7, 0x41, 0xf7, 0x80, 0x0c, - 0x88, 0x67, 0xd1, 0x18, 0x75, 0x5b, 0x5a, 0x14, 0x89, 0xc0, 0x3a, 0x8d, - 0x14, 0xcc, 0x4d, 0xaf, 0xa0, 0x9c, 0xfa, 0x8f, 0x95, 0x25, 0xc1, 0xa7, - 0xae, 0x97, 0x9e, 0x70, 0x86, 0x19, 0x71, 0xff, 0xf0, 0x96, 0x4e, 0x18, - 0x03, 0x39, 0xc1, 0xf1, 0x53, 0xa7, 0xac, 0x46, 0xbf, 0xd9, 0x01, 0xf7, - 0xab, 0x94, 0xe8, 0xd7, 0x8d, 0x92, 0xef, 0x09, 0x62, 0x7f, 0x3e, 0xb5, - 0x3f, 0xac, 0x04, 0xc3, 0x3e, 0x6a, 0x3d, 0x5b, 0xdc, 0xad, 0x15, 0x3c, - 0x74, 0xcb, 0x31, 0x7a, 0xd1, 0x57, 0xb5, 0xef, 0x39, 0xa3, 0x26, 0x06, - 0xd1, 0x35, 0x1e, 0x73, 0xda, 0x91, 0x09, 0x6b, 0x63, 0xce, 0x62, 0xe8, - 0xdf, 0x78, 0x34, 0x5c, 0x84, 0xb5, 0xc9, 0xce, 0x3a, 0x95, 0xd4, 0x42, - 0x13, 0x80, 0x35, 0x62, 0x08, 0xab, 0x10, 0x42, 0x03, 0x51, 0x10, 0xf2, - 0x07, 0x16, 0xa8, 0x17, 0x82, 0x2a, 0x61, 0x88, 0x7c, 0xfb, 0x3e, 0xc5, - 0xae, 0xa8, 0xef, 0x55, 0xb3, 0xa1, 0xcd, 0x71, 0x01, 0xcf, 0x28, 0xaa, - 0x13, 0xf1, 0x67, 0xc5, 0x64, 0xf5, 0x5d, 0x47, 0x27, 0xd5, 0xc9, 0x8f, - 0x0b, 0xbb, 0xd4, 0xf5, 0xba, 0x1a, 0x1d, 0xbf, 0xc1, 0xd9, 0xb1, 0x9c, - 0x37, 0xfb, 0x6f, 0xcf, 0x4e, 0xa1, 0xcb, 0x1d, 0x41, 0x92, 0x0b, 0x25, - 0xaa, 0x7a, 0x3f, 0x67, 0x38, 0xe7, 0x27, 0xcf, 0xbc, 0xb2, 0xce, 0xfb, - 0x13, 0x97, 0x58, 0xfd, 0xf5, 0x24, 0xe0, 0x85, 0x13, 0x7b, 0x89, 0x4a, - 0x17, 0x45, 0xac, 0x62, 0x13, 0x9a, 0xcd, 0x1f, 0x9e, 0x29, 0xd1, 0xc5, - 0xc6, 0x0f, 0xf8, 0x5b, 0x2f, 0x24, 0x9b, 0xca, 0x75, 0xd1, 0x75, 0x06, - 0xba, 0x6f, 0x86, 0x56, 0x3a, 0x39, 0xf2, 0x75, 0xd9, 0xb3, 0x38, 0x4e, - 0x3f, 0x26, 0x89, 0xf6, 0x75, 0xd5, 0xca, 0xb9, 0xf0, 0x86, 0xf9, 0x50, - 0xe2, 0x03, 0x5e, 0x63, 0x4a, 0xff, 0x18, 0x17, 0x5a, 0xb9, 0xb9, 0xf8, - 0x7b, 0x0b, 0x93, 0x3a, 0xcb, 0xd0, 0xa4, 0x30, 0x8e, 0x14, 0xa9, 0x6f, - 0x1d, 0x8f, 0x87, 0xa2, 0x79, 0x4b, 0x55, 0x4b, 0xeb, 0x84, 0xbc, 0x29, - 0x15, 0x90, 0xfc, 0x93, 0xc4, 0xff, 0x01, 0x54, 0x5d, 0xb3, 0xf0, 0xef, - 0x87, 0x3c, 0x3d, 0x85, 0xf5, 0x6c, 0x2d, 0x1d, 0xee, 0xf5, 0x21, 0xe8, - 0xec, 0x16, 0x26, 0x21, 0x71, 0x61, 0x1f, 0x7c, 0xd2, 0xe3, 0x71, 0x1e, - 0xbc, 0x2e, 0x37, 0x7d, 0x75, 0xfc, 0xa4, 0xc8, 0xfb, 0x25, 0x20, 0x8a, - 0xf8, 0xee, 0x17, 0x77, 0x41, 0x9f, 0x08, 0x67, 0x74, 0x71, 0xde, 0xee, - 0xa5, 0x9b, 0x2b, 0x8d, 0x15, 0x4a, 0x94, 0xf6, 0x7e, 0x48, 0x58, 0xb3, - 0xab, 0xbf, 0x45, 0x3d, 0xd7, 0x04, 0x89, 0xe4, 0x42, 0xd3, 0xa0, 0x27, - 0x3e, 0x5b, 0x1b, 0x04, 0xc3, 0x8b, 0x99, 0x24, 0x7e, 0x5d, 0x1e, 0x02, - 0x07, 0x64, 0xd9, 0x83, 0x66, 0xad, 0x6b, 0x7e, 0xd3, 0x28, 0xfd, 0x8d, - 0xe1, 0xaf, 0x48, 0xbb, 0xc2, 0x00, 0xa5, 0x8e, 0xd7, 0x95, 0xd0, 0x8a, - 0xb2, 0x25, 0x2d, 0x8b, 0x9a, 0x9b, 0x56, 0x7c, 0x3a, 0x86, 0x5b, 0x3d, - 0x9d, 0x06, 0x29, 0x27, 0x68, 0x0a, 0xad, 0x68, 0xbb, 0x7a, 0xe6, 0x1d, - 0xb9, 0x8b, 0xea, 0xeb, 0x05, 0xd2, 0xb4, 0x69, 0x87, 0x72, 0x08, 0x39, - 0x6e, 0x64, 0x25, 0xf9, 0xbd, 0xbe, 0xb8, 0x17, 0xeb, 0x41, 0xc1, 0x29, - 0xf0, 0x20, 0x25, 0x22, 0x43, 0x75, 0xc1, 0xfa, 0xf8, 0xa5, 0xdb, 0xc7, - 0x54, 0x72, 0x79, 0xd6, 0xad, 0xac, 0x9b, 0x6f, 0xf2, 0xc2, 0x82, 0xaa, - 0xd0, 0x6c, 0xbf, 0x83, 0x24, 0xa2, 0x82, 0x14, 0xec, 0x95, 0xf9, 0xf3, - 0x15, 0xa4, 0x65, 0xed, 0x05, 0x04, 0x8b, 0x55, 0x41, 0x59, 0xf2, 0x53, - 0xd8, 0x15, 0x0e, 0xc7, 0x54, 0x96, 0x7d, 0x37, 0x8e, 0x73, 0x8f, 0x56, - 0x64, 0xea, 0x09, 0x25, 0xdd, 0xbc, 0x7f, 0x5f, 0x74, 0xe1, 0x22, 0x16, - 0x2e, 0xbe, 0xcd, 0x98, 0x36, 0xff, 0xaa, 0x2a, 0xb9, 0x9d, 0x9e, 0xa6, - 0xf9, 0xed, 0x29, 0x76, 0x87, 0x9b, 0x5f, 0x5f, 0x8a, 0xf0, 0x82, 0x55, - 0xa5, 0x51, 0xc2, 0xba, 0x77, 0x2a, 0x0c, 0x5d, 0x9d, 0x94, 0xc0, 0x68, - 0x62, 0xf2, 0x4e, 0x1b, 0x1d, 0xfc, 0xf3, 0xd4, 0x3b, 0x8f, 0xd7, 0x34, - 0xac, 0xd8, 0x6c, 0xd0, 0x77, 0x2e, 0x72, 0x78, 0xbd, 0x26, 0x79, 0xfb, - 0x4b, 0xd8, 0x20, 0x60, 0xba, 0x20, 0x65, 0x56, 0x6b, 0x6c, 0xd6, 0xaa, - 0x63, 0x7b, 0x70, 0x1f, 0xda, 0x6e, 0x4d, 0x7a, 0xfb, 0x7e, 0x72, 0x24, - 0x28, 0xcc, 0x8f, 0xe1, 0x51, 0xd8, 0x57, 0xe7, 0x0a, 0x47, 0x78, 0xd5, - 0x06, 0x71, 0x18, 0xab, 0x69, 0x20, 0xe0, 0x54, 0x37, 0xb8, 0x52, 0x78, - 0xe0, 0xbe, 0x0a, 0x98, 0xfc, 0x48, 0x49, 0xde, 0x27, 0x06, 0x6c, 0x86, - 0xf6, 0x72, 0x62, 0xe8, 0xfc, 0x0b, 0x24, 0xa1, 0xb9, 0x85, 0xb7, 0x01, - 0xfb, 0x90, 0x14, 0xc8, 0x7f, 0x06, 0x95, 0x56, 0x57, 0x8e, 0x0d, 0x39, - 0x32, 0xa7, 0x69, 0xcb, 0x91, 0x55, 0x8d, 0x36, 0xa1, 0x43, 0x54, 0xcb, - 0x3a, 0xf2, 0xcf, 0x5e, 0x27, 0x1a, 0x55, 0x23, 0x1c, 0xae, 0x6f, 0x1a, - 0xfa, 0xf7, 0x8e, 0xcd, 0x6c, 0x20, 0xad, 0xfc, 0x43, 0x1c, 0xc8, 0x85, - 0xc1, 0x0c, 0x6a, 0x12, 0xca, 0x3e, 0x5c, 0x4f, 0x30, 0xa9, 0xfd, 0x42, - 0x2a, 0x2a, 0x37, 0xb5, 0x91, 0xe8, 0xe1, 0xec, 0x12, 0xd1, 0x59, 0x52, - 0x09, 0x2d, 0x12, 0x68, 0x78, 0x4a, 0x81, 0xdc, 0x30, 0x5a, 0x99, 0x79, - 0xad, 0x48, 0x14, 0x7a, 0x47, 0xc7, 0xf5, 0xe4, 0x52, 0x8e, 0xc7, 0x7b, - 0xaa, 0x5d, 0x34, 0x72, 0xce, 0x09, 0xef, 0xd7, 0x2d, 0x7e, 0x41, 0x1e, - 0x23, 0x58, 0x33, 0xc5, 0xd4, 0xe4, 0xf0, 0x79, 0x42, 0x52, 0xef, 0xc5, - 0xe2, 0x25, 0xbf, 0xf3, 0x27, 0xd3, 0x0c, 0x83, 0xce, 0x8f, 0xfc, 0x27, - 0x91, 0x67, 0x96, 0x33, 0x51, 0x56, 0xe3, 0x0c, 0x87, 0xd9, 0x98, 0xc3, - 0xe8, 0x0b, 0x9b, 0x11, 0x12, 0xbc, 0xb2, 0x26, 0xbe, 0xe3, 0x46, 0x8a, - 0x2d, 0x36, 0xf4, 0x13, 0x47, 0x33, 0xcd, 0x0a, 0x66, 0x85, 0xd4, 0xb8, - 0xd1, 0x19, 0x1f, 0x77, 0xbd, 0xf4, 0x76, 0x44, 0x61, 0x34, 0x5f, 0x0e, - 0x70, 0xa3, 0x57, 0xc9, 0x7f, 0x9c, 0x96, 0x68, 0x51, 0x13, 0x1d, 0x33, - 0xde, 0x2b, 0x48, 0xdd, 0x63, 0x91, 0xa2, 0xf3, 0x31, 0x5e, 0x0b, 0x49, - 0x27, 0x76, 0xd6, 0xca, 0xdd, 0xdc, 0xe6, 0xfa, 0x32, 0xf0, 0x2e, 0x93, - 0x3e, 0x32, 0x1b, 0xd1, 0xe4, 0x06, 0x18, 0xa7, 0x9c, 0x55, 0xec, 0xbf, - 0x6d, 0xb2, 0xb7, 0x42, 0xfb, 0xbc, 0xcc, 0xa3, 0x55, 0x58, 0x3b, 0xd0, - 0x7d, 0x4f, 0xcd, 0x53, 0x1d, 0xef, 0xf4, 0x49, 0x48, 0xb5, 0x41, 0x65, - 0x06, 0x6e, 0x35, 0x0d, 0xa3, 0xfe, 0x8c, 0xc9, 0x61, 0x73, 0xf1, 0xec, - 0x0e, 0xd6, 0x99, 0x36, 0x9c, 0xe0, 0x71, 0x29, 0x3e, 0x29, 0xf2, 0x13, - 0xe4, 0x83, 0xae, 0xef, 0xe4, 0xd1, 0x87, 0x70, 0x57, 0x05, 0xcb, 0xa3, - 0xad, 0xd0, 0xcb, 0x33, 0x73, 0x84, 0xfb, 0x31, 0xa1, 0x08, 0x1c, 0x9e, - 0xd4, 0x4e, 0xbf, 0x90, 0xfd, 0x34, 0x04, 0x07, 0x83, 0x25, 0x13, 0xc3, - 0xdd, 0x26, 0x01, 0xf0, 0xc7, 0x27, 0x28, 0x6e, 0x21, 0x2c, 0xe9, 0x70, - 0x29, 0xfa, 0xa6, 0x63, 0x2d, 0xba, 0x24, 0xa4, 0x98, 0x4a, 0xfe, 0x85, - 0xf5, 0x6d, 0x23, 0x1d, 0xb1, 0x1c, 0x8b, 0xe1, 0x66, 0x9b, 0xb5, 0x95, - 0x62, 0xcf, 0x28, 0xbd, 0xcf, 0xbd, 0x02, 0xd1, 0xf9, 0xea, 0x58, 0x7b, - 0xde, 0x9b, 0x45, 0xf2, 0x76, 0x65, 0x69, 0xd2, 0xea, 0x11, 0xc4, 0x6f, - 0x76, 0x46, 0xfa, 0x86, 0x82, 0xee, 0xfc, 0x2e, 0x6e, 0x7d, 0x81, 0x74, - 0x78, 0xf9, 0x8e, 0xa5, 0x5b, 0x98, 0xf5, 0xcb, 0x55, 0x05, 0x7e, 0xe9, - 0x20, 0x20, 0x23, 0x6f, 0x98, 0x96, 0xf0, 0x7e, 0x7c, 0x11, 0x27, 0x76, - 0x7f, 0xcb, 0x53, 0x76, 0xc4, 0x04, 0x6d, 0x5d, 0xcc, 0xaf, 0x27, 0x79, - 0x55, 0xce, 0x2e, 0x6f, 0xd2, 0xfe, 0xa4, 0xe1, 0x1c, 0x4d, 0x58, 0xb1, - 0xd3, 0xd0, 0x00, 0x0c, 0x74, 0x65, 0x87, 0x6b, 0x23, 0xfe, 0x47, 0x2d, - 0x2e, 0x33, 0xc9, 0x71, 0x46, 0x39, 0xf0, 0x52, 0x30, 0xa9, 0xd9, 0xfd, - 0xa5, 0xd2, 0x0b, 0xe5, 0x61, 0x6e, 0x44, 0x38, 0xcd, 0x72, 0x46, 0x90, - 0x39, 0x7f, 0x38, 0xfd, 0x14, 0xcb, 0x18, 0x46, 0x24, 0x7e, 0xe5, 0xc7, - 0xbf, 0x16, 0x67, 0x04, 0x4e, 0x63, 0x31, 0xfa, 0xd5, 0x3e, 0x3b, 0xe9, - 0x06, 0x37, 0x18, 0xb3, 0x41, 0x03, 0x84, 0xd8, 0xda, 0xd0, 0x78, 0xc1, - 0xf9, 0x34, 0xce, 0xf8, 0x53, 0xbe, 0x72, 0x72, 0xef, 0x36, 0xe4, 0x87, - 0x06, 0x60, 0x4b, 0x8e, 0x8d, 0x1f, 0xf3, 0x42, 0xa4, 0x01, 0x72, 0x14, - 0x58, 0xdd, 0xd2, 0xdb, 0x2e, 0x91, 0xdc, 0x12, 0x43, 0x4a, 0x63, 0x8f, - 0x5f, 0xb4, 0xef, 0xf8, 0xa9, 0x10, 0xdd, 0x65, 0x4a, 0x40, 0xbd, 0xd6, - 0x41, 0xc1, 0xaa, 0x57, 0x77, 0x96, 0xbf, 0xba, 0xc0, 0x76, 0x0c, 0x69, - 0xc4, 0x53, 0x49, 0x9b, 0x1c, 0xca, 0x5c, 0x38, 0x55, 0x9b, 0x52, 0xf8, - 0xe9, 0x4e, 0xca, 0x2f, 0x0f, 0x51, 0x5c, 0xbf, 0x5b, 0xe8, 0xc7, 0xe0, - 0xbf, 0xd0, 0x12, 0x00, 0xf9, 0xfb, 0xdf, 0x24, 0x19, 0xd8, 0x81, 0xf4, - 0x2c, 0x76, 0x78, 0xb7, 0x24, 0x71, 0x5a, 0x80, 0x20, 0x44, 0x3a, 0xe9, - 0xb0, 0x67, 0xf4, 0xb6, 0x9d, 0x86, 0xfa, 0xcb, 0x83, 0x62, 0x68, 0x7c, - 0x14, 0xfd, 0x3d, 0xfe, 0x86, 0xbf, 0x51, 0x9d, 0xf1, 0x67, 0x0b, 0x9e, - 0x69, 0xd5, 0x32, 0x7d, 0x8f, 0x63, 0x98, 0x92, 0x29, 0xd9, 0xa8, 0x6a, - 0x60, 0x3e, 0xcd, 0xa7, 0xf8, 0x03, 0xf2, 0x62, 0x26, 0xd2, 0xd0, 0x24, - 0x9e, 0x97, 0xd2, 0xed, 0x50, 0xdf, 0xa3, 0x5b, 0xf9, 0x81, 0xf1, 0xb9, - 0x6e, 0x19, 0xcc, 0x92, 0x5f, 0xf2, 0xc5, 0x91, 0x0f, 0x06, 0xda, 0x9d, - 0xee, 0xc1, 0x7e, 0x77, 0x28, 0x95, 0x03, 0x12, 0xe5, 0xad, 0x03, 0xde, - 0xf0, 0x1c, 0xfc, 0x56, 0x05, 0xc9, 0x99, 0x8d, 0xac, 0x14, 0xab, 0xd2, - 0xdb, 0xfd, 0x38, 0x2f, 0x13, 0x28, 0xde, 0x4e, 0x76, 0x88, 0xb1, 0xba, - 0x89, 0xe7, 0x01, 0x54, 0xc8, 0x7e, 0xca, 0xfe, 0xd8, 0x87, 0x34, 0xaa, - 0xfe, 0x4c, 0x88, 0xd5, 0xb2, 0xca, 0x6e, 0x34, 0x0d, 0xe5, 0xf1, 0x86, - 0xd4, 0xed, 0x94, 0xc2, 0x1e, 0x00, 0x41, 0x15, 0x57, 0xda, 0x40, 0xb6, - 0x47, 0xce, 0xd4, 0x18, 0x1a, 0xcc, 0x67, 0xe6, 0xed, 0xfa, 0x7f, 0x9f, - 0x7d, 0x78, 0x84, 0x29, 0xf9, 0xed, 0xfb, 0x15, 0x0e, 0xe6, 0xef, 0x64, - 0x4a, 0x27, 0x24, 0xa6, 0x83, 0x16, 0x46, 0x46, 0xc6, 0x12, 0x84, 0x66, - 0x31, 0xe1, 0x60, 0x3d, 0xb3, 0x4a, 0x22, 0xdc, 0x2e, 0x9d, 0xee, 0x5b, - 0xa0, 0xa7, 0xe7, 0x42, 0x8b, 0xc4, 0xba, 0xaf, 0xa2, 0xeb, 0x38, 0xbe, - 0xfd, 0x36, 0xd7, 0xaa, 0x9f, 0x9a, 0x51, 0xa0, 0x5f, 0x11, 0xc5, 0xb1, - 0xfa, 0x77, 0x63, 0x18, 0x56, 0xb8, 0xf1, 0xa6, 0x67, 0x0a, 0xfd, 0x7b, - 0xed, 0x7c, 0xc6, 0x8e, 0x87, 0x11, 0x80, 0x58, 0xf1, 0x6e, 0xde, 0x52, - 0xf3, 0xb4, 0x46, 0x4c, 0x1d, 0xeb, 0xcc, 0xd4, 0x53, 0x6d, 0xd2, 0x68, - 0x03, 0x9c, 0xcc, 0xad, 0xfd, 0x5e, 0xcc, 0xf9, 0xbf, 0x4a, 0x42, 0x2f, - 0x7d, 0xdf, 0x40, 0x20, 0xf9, 0xd3, 0x72, 0x44, 0x03, 0xf9, 0xe9, 0x6f, - 0x9f, 0x98, 0xc4, 0x50, 0xc4, 0x04, 0x89, 0x91, 0x7f, 0x24, 0x50, 0x77, - 0x65, 0x82, 0xc3, 0x75, 0x05, 0xed, 0xb2, 0x58, 0x5f, 0xbf, 0x31, 0xce, - 0x1f, 0x1d, 0x9b, 0xa3, 0x01, 0xbd, 0x8d, 0x10, 0xc2, 0x10, 0x1f, 0xd2, - 0xef, 0x5f, 0x20, 0x2e, 0xb6, 0xd8, 0xae, 0xb5, 0xd0, 0x30, 0x80, 0xc0, - 0x1a, 0xea, 0xe7, 0xc5, 0xf3, 0xc3, 0xa7, 0x96, 0x0c, 0x96, 0xf9, 0x91, - 0x3c, 0xfc, 0x6b, 0x3c, 0x4e, 0x46, 0x06, 0x48, 0xa8, 0x35, 0x59, 0x22, - 0xdc, 0x35, 0x7b, 0x32, 0x52, 0x28, 0xe5, 0x5b, 0x9f, 0x98, 0x7b, 0x30, - 0x51, 0x99, 0xfc, 0x9c, 0xba, 0x4b, 0x55, 0x56, 0xde, 0xe0, 0x91, 0x30, - 0xe2, 0x47, 0x5a, 0xf2, 0xe2, 0x36, 0x1e, 0x30, 0x4c, 0x86, 0x87, 0xde, - 0x3c, 0xa5, 0x86, 0x59, 0x05, 0x2f, 0xc4, 0x81, 0x26, 0x44, 0x4e, 0x80, - 0xde, 0x54, 0x14, 0x19, 0xff, 0xfa, 0x9c, 0x58, 0xe7, 0xeb, 0xba, 0x21, - 0x8f, 0x38, 0xa6, 0x35, 0x36, 0x68, 0xd0, 0x67, 0x7e, 0x5b, 0x6c, 0x46, - 0x03, 0x30, 0x1b, 0x60, 0xa6, 0x93, 0x71, 0xea, 0xd5, 0x5e, 0x7f, 0x07, - 0x7c, 0xcd, 0xeb, 0x3f, 0x76, 0x31, 0x2b, 0x36, 0x3d, 0x84, 0xc9, 0xd0, - 0xbf, 0xa3, 0xcd, 0xcb, 0xe6, 0x53, 0x7d, 0x6c, 0xb1, 0x25, 0x5e, 0xa1, - 0x92, 0x86, 0x69, 0xc1, 0x07, 0x28, 0x8e, 0x71, 0x80, 0x91, 0xb7, 0xc3, - 0xbf, 0xd6, 0xa7, 0xd6, 0x32, 0x22, 0xd5, 0xfa, 0x39, 0xf8, 0x74, 0xd8, - 0xb7, 0x2c, 0x25, 0xaa, 0x13, 0xed, 0x66, 0xd7, 0x5d, 0xe8, 0x06, 0x8b, - 0xa3, 0xaf, 0x07, 0x40, 0x19, 0x71, 0xd3, 0xbc, 0x00, 0xc0, 0x41, 0x3f, - 0x6a, 0xd5, 0x8b, 0xbd, 0xc5, 0xa2, 0xa0, 0x0e, 0x9f, 0x70, 0x28, 0x42, - 0xea, 0xcc, 0x34, 0x8d, 0x75, 0xcd, 0x80, 0x9a, 0x45, 0x40, 0xc4, 0xc0, - 0x49, 0x95, 0xd6, 0x99, 0xd7, 0xb9, 0x83, 0x56, 0x96, 0xe6, 0xd1, 0xc0, - 0xaf, 0x15, 0xd1, 0x1d, 0xd1, 0x10, 0x21, 0x1b, 0xeb, 0x3d, 0x20, 0xa3, - 0xa0, 0x03, 0x9e, 0x96, 0x9c, 0xa8, 0x37, 0x0b, 0x1a, 0xa0, 0x2c, 0x23, - 0x1b, 0x6b, 0x64, 0x7a, 0x2f, 0x2d, 0x56, 0x5a, 0xe0, 0xa7, 0xab, 0xb9, - 0xe6, 0xe4, 0x0e, 0x0f, 0x07, 0x03, 0x47, 0x57, 0xba, 0x1d, 0x31, 0x26, - 0x95, 0x05, 0xb7, 0xc7, 0x35, 0x7f, 0x60, 0x41, 0x1c, 0x67, 0xc1, 0x60, - 0xda, 0xff, 0xfd, 0x11, 0x47, 0x80, 0x4d, 0x21, 0x31, 0x37, 0xb3, 0x5f, - 0x99, 0x78, 0x91, 0xa6, 0x8e, 0x90, 0x11, 0x06, 0x69, 0x23, 0x93, 0x58, - 0x3d, 0xf0, 0x33, 0x6f, 0xe9, 0x61, 0x49, 0x33, 0x5a, 0xbb, 0x9b, 0xa0, - 0xc6, 0x81, 0x1c, 0xdb, 0x93, 0x42, 0x8e, 0x3c, 0x78, 0x3a, 0xc9, 0x28, - 0x13, 0x7b, 0x58, 0x7e, 0xa1, 0x1d, 0x35, 0xfc, 0x0d, 0xb1, 0x6c, 0x5f, - 0xa6, 0x44, 0x20, 0xdd, 0xa7, 0xe8, 0x08, 0x99, 0x56, 0x87, 0x64, 0xfe, - 0x63, 0x33, 0xae, 0x86, 0xf9, 0x29, 0x96, 0xad, 0xc6, 0x9c, 0x58, 0xc4, - 0x86, 0xb9, 0x09, 0xf9, 0x50, 0x34, 0xba, 0xbf, 0xb7, 0x76, 0x37, 0xff, - 0x03, 0xb6, 0xff, 0xf7, 0xa3, 0xdf, 0x49, 0x6c, 0x44, 0x6e, 0x16, 0xc8, - 0xfe, 0xb0, 0x87, 0xa6, 0x5c, 0x04, 0x5f, 0x2d, 0xa3, 0x0c, 0xde, 0x59, - 0xf3, 0x35, 0xeb, 0x69, 0x88, 0x29, 0x9f, 0xc3, 0x91, 0xa1, 0xb0, 0xf4, - 0x27, 0x95, 0xb1, 0xe6, 0x00, 0xbb, 0x4d, 0x89, 0x1e, 0xb5, 0x1d, 0xfb, - 0x66, 0x11, 0xe8, 0x68, 0xc6, 0xa3, 0x2c, 0x55, 0xbb, 0xc2, 0x1d, 0xce, - 0x4a, 0x76, 0x2c, 0xde, 0xcb, 0x1a, 0x5c, 0x85, 0xec, 0xd2, 0xf9, 0xf5, - 0xa0, 0x84, 0xa3, 0xa0, 0xae, 0x90, 0xd6, 0x81, 0x59, 0x8e, 0x31, 0xc8, - 0x04, 0x77, 0xd2, 0x6e, 0xa2, 0x58, 0x90, 0xce, 0x56, 0x93, 0x77, 0x64, - 0x2a, 0xe6, 0x9b, 0x55, 0x2b, 0x98, 0xec, 0x16, 0x3a, 0x77, 0xaa, 0x06, - 0x37, 0x40, 0x2d, 0xb3, 0x9b, 0xa2, 0x5b, 0x7c, 0x24, 0xce, 0x8f, 0xec, - 0x7b, 0xcc, 0x92, 0x58, 0x13, 0xdd, 0xa7, 0x8c, 0x80, 0x5d, 0xf2, 0xf4, - 0xfd, 0xfb, 0x4b, 0x1d, 0x4e, 0xbd, 0x21, 0xf7, 0x02, 0xf6, 0xd9, 0x96, - 0xa0, 0x09, 0xf1, 0x4e, 0x5d, 0xaf, 0xfe, 0x90, 0x09, 0x8a, 0x0f, 0x72, - 0x60, 0x7c, 0x28, 0x1e, 0x2e, 0xc2, 0xa0, 0x47, 0xfe, 0x5f, 0x6e, 0xb7, - 0xb6, 0x0b, 0xe7, 0xe1, 0xc7, 0x24, 0x8b, 0x4e, 0x03, 0x82, 0xcb, 0xb0, - 0xe0, 0xaf, 0xfc, 0xb9, 0xc4, 0x23, 0xb7, 0xd1, 0x47, 0x97, 0x32, 0x0c, - 0xf9, 0x26, 0x6e, 0x0b, 0x0b, 0x30, 0xc3, 0x3b, 0xbb, 0x2c, 0x8f, 0x39, - 0x1a, 0x83, 0x5b, 0x45, 0x48, 0x9a, 0x99, 0xba, 0xe2, 0x39, 0xd0, 0xc9, - 0x56, 0x27, 0x01, 0xbb, 0x72, 0xb3, 0x40, 0x6e, 0xe1, 0x39, 0x20, 0xde, - 0x0a, 0x55, 0x52, 0x07, 0xda, 0xac, 0xbf, 0xe1, 0x2e, 0xd1, 0x1a, 0xfb, - 0x6a, 0xa1, 0x9d, 0x95, 0x2f, 0xba, 0x51, 0x73, 0xe1, 0x35, 0xa7, 0xaa, - 0xe4, 0x70, 0x21, 0xa2, 0xea, 0x30, 0xa2, 0x80, 0xfb, 0x7a, 0x87, 0x70, - 0xcf, 0x23, 0xbe, 0x46, 0x4c, 0x11, 0x71, 0xca, 0x4f, 0xd2, 0xbd, 0xd4, - 0x91, 0xef, 0xcf, 0x2e, 0xf7, 0x63, 0xd7, 0xe2, 0x31, 0x45, 0x4b, 0xd5, - 0x8c, 0x1b, 0x77, 0xb1, 0x2a, 0x82, 0xb2, 0x4b, 0xcd, 0x35, 0x2e, 0x60, - 0x0f, 0x06, 0xda, 0x9d, 0xee, 0xc1, 0x7e, 0x47, 0x28, 0x95, 0x03, 0x12, - 0xe5, 0xad, 0x03, 0xde, 0x72, 0x85, 0x22, 0x22, 0x15, 0x01, 0x81, 0x7f, - 0xa5, 0x65, 0x16, 0x51, 0xb4, 0x90, 0xac, 0x8a, 0x02, 0xa4, 0x9d, 0x34, - 0x9d, 0x86, 0x04, 0x9f, 0x07, 0xec, 0x2a, 0x50, 0x5a, 0x53, 0xb0, 0xd8, - 0xd8, 0x87, 0x34, 0xaa, 0xfe, 0x4c, 0x88, 0xd5, 0xb2, 0xca, 0x62, 0x34, - 0x0d, 0xe5, 0xf1, 0x86, 0xd4, 0xed, 0x94, 0xc2, 0x1e, 0x00, 0x41, 0x15, - 0x57, 0xda, 0x40, 0xb6, 0x47, 0xce, 0xd4, 0x18, 0x8b, 0xab, 0x0d, 0x50, - 0xe8, 0x23, 0xbe, 0xbc, 0xdc, 0xca, 0x88, 0x40, 0x35, 0xdb, 0xbb, 0x70, - 0xd5, 0xc5, 0x8e, 0xa3, 0x49, 0xb9, 0x4e, 0xc6, 0xf0, 0x90, 0x39, 0xdb, - 0x8c, 0xdf, 0x0e, 0x5e, 0x04, 0x15, 0x47, 0x8e, 0xb4, 0xc9, 0xe6, 0x21, - 0xcb, 0x31, 0xae, 0x61, 0xcb, 0xab, 0x80, 0xcb, 0xf9, 0x92, 0x9a, 0xcc, - 0x57, 0x72, 0xa1, 0xd5, 0x84, 0x3d, 0x00, 0xa4, 0x4b, 0x63, 0xb0, 0x7b, - 0xd9, 0xaa, 0x06, 0xdc, 0xa4, 0x30, 0x82, 0x69, 0xab, 0x3c, 0x7a, 0x77, - 0x06, 0x44, 0xd9, 0xe6, 0x15, 0xb2, 0xd8, 0xde, 0x45, 0x78, 0xa1, 0xd4, - 0x84, 0x3d, 0x00, 0xa4, 0x4b, 0x63, 0xb0, 0x7f, 0x6b, 0xe0, 0xf9, 0x00, - 0xb8, 0x4a, 0xc5, 0x09, 0x19, 0x13, 0xbf, 0x18, 0xf6, 0x68, 0x7d, 0x3c, - 0xb5, 0x9d, 0x4a, 0xf1, 0x38, 0x8d, 0xeb, 0xd2, 0xbd, 0x16, 0x9f, 0x0a, - 0x72, 0x9f, 0x9e, 0x94, 0x25, 0x83, 0x05, 0x3c, 0x83, 0x42, 0x3c, 0x2b, - 0x78, 0x7b, 0xbc, 0x4a, 0x5b, 0x41, 0x5f, 0xbb, 0x02, 0x84, 0x00, 0x74, - 0x71, 0x14, 0x3a, 0xb9, 0x2e, 0xd7, 0x0b, 0x94, 0xa9, 0xc1, 0xed, 0x41, - 0x60, 0x51, 0x89, 0xab, 0x19, 0x81, 0xe2, 0x1d, 0xff, 0x5e, 0x30, 0x73, - 0x12, 0xde, 0xc8, 0x49, 0x8f, 0x92, 0x64, 0x9d, 0xe1, 0x67, 0x52, 0xf2, - 0x5f, 0x4f, 0x3c, 0xdd, 0x13, 0x0d, 0x1d, 0x40, 0x19, 0x9e, 0xec, 0x4a, - 0x8e, 0xe1, 0x22, 0x55, 0xf4, 0xa9, 0x41, 0x53, 0x27, 0x3a, 0x40, 0xa8, - 0x76, 0xc5, 0x73, 0x98, 0x21, 0x93, 0xed, 0x94, 0x03, 0xed, 0x79, 0x09, - 0xe1, 0xb7, 0xd7, 0x32, 0x1c, 0xf9, 0x4e, 0x84, 0x2f, 0x22, 0x19, 0x2a, - 0x91, 0xe4, 0x36, 0xd2, 0x7f, 0xcd, 0xa8, 0xdd, 0xdc, 0x04, 0xe5, 0xa7, - 0x5b, 0x0c, 0x64, 0x0c, 0x82, 0x6f, 0x8a, 0x99, 0x64, 0xb6, 0x25, 0xe4, - 0x95, 0x6b, 0xe9, 0x54, 0xdc, 0x38, 0x50, 0xfc, 0x19, 0xe7, 0xc7, 0x86, - 0xb9, 0x1a, 0xe2, 0xa6, 0xc2, 0x44, 0x6e, 0xa6, 0x14, 0xce, 0xdf, 0x09, - 0x27, 0xa0, 0x8a, 0x9d, 0x6a, 0x22, 0xdb, 0x09, 0x5d, 0xe3, 0xa8, 0x60, - 0x9c, 0xfd, 0xf1, 0x93, 0xa5, 0x6f, 0x2e, 0xed, 0x55, 0x72, 0xd0, 0x47, - 0x4b, 0x45, 0xaf, 0x6b, 0x5c, 0x60, 0x10, 0x78, 0x5b, 0x70, 0x4a, 0xe0, - 0xec, 0x62, 0xdb, 0xf7, 0x9b, 0xe9, 0x94, 0x93, 0xd8, 0xba, 0xee, 0x67, - 0x89, 0xeb, 0xf2, 0x74, 0x3c, 0x27, 0xa5, 0x14, 0xdf, 0xb3, 0x12, 0x1e, - 0x33, 0xa9, 0x3c, 0x8f, 0x60, 0xe4, 0x8a, 0xb9, 0x52, 0x4e, 0x75, 0x07, - 0xa7, 0xca, 0xaa, 0xca, 0x26, 0xff, 0x7f, 0xa5, 0x76, 0x30, 0xb4, 0x36, - 0x89, 0x78, 0xfa, 0x59, 0x09, 0xe5, 0xc5, 0x81, 0x91, 0x62, 0x3c, 0x75, - 0x97, 0xea, 0xab, 0x29, 0x0a, 0x70, 0xe5, 0x79, 0x72, 0x14, 0xcd, 0xbb, - 0x77, 0xee, 0xf8, 0xf6, 0xaa, 0x3c, 0x1b, 0xec, 0xe6, 0xae, 0x4b, 0x60, - 0x1c, 0x60, 0xeb, 0x7e, 0xba, 0x32, 0x1a, 0xd1, 0x10, 0x1b, 0x3a, 0x1f, - 0x19, 0x6b, 0xee, 0x95, 0xfc, 0xb9, 0x07, 0x31, 0x39, 0x2d, 0xea, 0xbe, - 0x51, 0x78, 0x6d, 0x3b, 0x85, 0x7c, 0x54, 0xa5, 0x03, 0x5f, 0x56, 0xc0, - 0xaa, 0x56, 0xb0, 0x45, 0xea, 0x23, 0x39, 0x9b, 0xa5, 0xf4, 0x44, 0xc3, - 0x7a, 0xf9, 0x1f, 0xc0, 0x5a, 0x5a, 0x29, 0x9e, 0x38, 0xcf, 0x1a, 0x8b, - 0xc6, 0x1f, 0x1d, 0x8e, 0xcf, 0x02, 0x40, 0x57, 0x23, 0xe7, 0x7e, 0x10, - 0x4d, 0xff, 0x71, 0x37, 0x0f, 0x2b, 0xe0, 0xf9, 0x80, 0x00, 0x1c, 0x7b, - 0xa4, 0xac, 0x5c, 0xd7, 0xcc, 0xec, 0x8e, 0x0b, 0xf9, 0xb8, 0x10, 0x7e, - 0x7f, 0xfb, 0x7f, 0x88, 0xee, 0x49, 0x44, 0x57, 0xec, 0x64, 0xa7, 0xa3, - 0xdc, 0x8a, 0x89, 0x3d, 0x37, 0x69, 0xc5, 0x64, 0xd0, 0x16, 0xca, 0x9d, - 0x65, 0x34, 0xb8, 0x4e, 0x13, 0x1f, 0x83, 0x74, 0x8d, 0x83, 0xa7, 0xfd, - 0x24, 0x55, 0x3e, 0xdb, 0xfd, 0xec, 0xc0, 0x51, 0x8c, 0x66, 0x65, 0x28, - 0xd1, 0x90, 0xf7, 0x11, 0x25, 0x76, 0xbe, 0xc1, 0x7c, 0x28, 0x71, 0xae, - 0x1f, 0xa9, 0xdc, 0xaa, 0xb7, 0x64, 0xfd, 0x65, 0x50, 0xbe, 0x94, 0x7e, - 0xe2, 0x20, 0x35, 0x77, 0x59, 0x9f, 0x3e, 0x3a, 0x35, 0x8a, 0x83, 0x1c, - 0xfd, 0x29, 0xc4, 0x9d, 0xf6, 0x66, 0x39, 0xd8, 0x65, 0x1a, 0x7d, 0x2a, - 0x2b, 0x3f, 0x97, 0x6c, 0xf2, 0x99, 0x4c, 0xdd, 0x8b, 0xe6, 0x5f, 0xa0, - 0x41, 0xff, 0xe7, 0x90, 0xac, 0x11, 0xa9, 0x3d, 0x03, 0x79, 0xa4, 0x95, - 0xca, 0xaa, 0x59, 0x50, 0x83, 0x2d, 0x2b, 0xb0, 0x6c, 0x27, 0xa3, 0xe8, - 0xd6, 0x9b, 0xe4, 0x6a, 0x6d, 0x44, 0x9e, 0xbe, 0x6f, 0xad, 0xc9, 0x98, - 0x3d, 0x74, 0x82, 0xac, 0x8e, 0x1e, 0x6b, 0x5b, 0xb9, 0xc1, 0x22, 0xcb, - 0x92, 0xb4, 0xb6, 0x23, 0x57, 0x23, 0xb8, 0xf5, 0x72, 0x5e, 0xce, 0x6a, - 0x71, 0x13, 0xea, 0x82, 0x2a, 0x75, 0xf0, 0xbd, 0x58, 0x63, 0x16, 0x7f, - 0x02, 0xf6, 0xfe, 0xc3, 0x67, 0xc4, 0x4c, 0xbe, 0x8f, 0x4c, 0x0e, 0xe9, - 0x96, 0xc8, 0xc2, 0x64, 0x8d, 0x1b, 0x2c, 0x05, 0xcc, 0x34, 0xa2, 0x97, - 0x72, 0x17, 0x6a, 0x03, 0xbc, 0x5b, 0x1c, 0x38, 0xca, 0x59, 0x09, 0xa3, - 0xb5, 0x5d, 0x17, 0xe6, 0x88, 0x7a, 0x39, 0x96, 0xf6, 0xcb, 0xfa, 0x18, - 0x61, 0xf1, 0xb2, 0x75, 0xf3, 0x20, 0xba, 0x75, 0x6f, 0x8b, 0x0a, 0x79, - 0x5d, 0xf0, 0x78, 0xf5, 0x80, 0x66, 0x73, 0x03, 0xad, 0xf3, 0xf0, 0x69, - 0x2a, 0x35, 0x75, 0xa8, 0xa1, 0xeb, 0x94, 0x6f, 0x74, 0x64, 0xf4, 0x77, - 0x48, 0x4e, 0xf6, 0x40, 0x9d, 0x5f, 0xf4, 0xd7, 0x05, 0x91, 0x32, 0x7b, - 0xa6, 0x5e, 0xfe, 0xdf, 0x15, 0xc9, 0x08, 0xb4, 0xe5, 0x86, 0x80, 0xe8, - 0x15, 0x3f, 0x3c, 0x5e, 0xd1, 0x08, 0x9c, 0x13, 0xd5, 0xcd, 0x8f, 0x7a, - 0x74, 0xc5, 0x3d, 0x08, 0xe2, 0x4e, 0xe9, 0x52, 0xff, 0x96, 0xee, 0xa8, - 0x60, 0x27, 0x9d, 0x0e, 0x86, 0xa7, 0xf8, 0x8b, 0xdd, 0xdb, 0x18, 0x93, - 0x0d, 0x57, 0x28, 0x6b, 0xd1, 0x6b, 0x4c, 0x53, 0xee, 0xa5, 0xdd, 0x4a, - 0x5b, 0x93, 0xa4, 0x98, 0x40, 0xf1, 0x5b, 0xf8, 0x74, 0x17, 0xf3, 0xb7, - 0xac, 0x6c, 0x56, 0x46, 0xe7, 0x18, 0xc0, 0x71, 0x12, 0xf2, 0x02, 0xb9, - 0x3e, 0x9e, 0xf8, 0xa0, 0xbc, 0x2e, 0xd0, 0x07, 0x6a, 0x54, 0xdc, 0x69, - 0x71, 0xe1, 0x35, 0x7f, 0x61, 0x2b, 0x05, 0xbc, 0x5c, 0x88, 0xe9, 0x8e, - 0x82, 0xe3, 0xcc, 0x06, 0x5d, 0x0a, 0x86, 0x76, 0x66, 0x18, 0x48, 0x39, - 0x90, 0xb7, 0xb5, 0x22, 0x9c, 0x11, 0x37, 0x2a, 0x3b, 0x6f, 0x63, 0xe8, - 0xa5, 0xdb, 0x9c, 0xf7, 0x18, 0xa2, 0x6b, 0x0e, 0x3c, 0x49, 0x51, 0x25, - 0xa9, 0x05, 0x96, 0x66, 0x77, 0x9b, 0xb2, 0xfe, 0x2b, 0x4d, 0x37, 0x5f, - 0xba, 0x9b, 0x0f, 0x66, 0x37, 0xc1, 0xb7, 0x75, 0xfa, 0x2d, 0x25, 0x94, - 0x7b, 0xe0, 0x3d, 0xbd, 0x94, 0xe6, 0x49, 0x71, 0x25, 0x60, 0xab, 0xd1, - 0xbb, 0x22, 0x19, 0x6f, 0x46, 0xc9, 0x13, 0x39, 0xf9, 0x72, 0xa9, 0x4b, - 0x63, 0xf1, 0x19, 0x2b, 0xf1, 0x61, 0x2c, 0x77, 0xcf, 0x22, 0xdd, 0x33, - 0xce, 0xe1, 0x3b, 0x7a, 0x3f, 0xa6, 0xf1, 0x81, 0x6d, 0x83, 0x30, 0xe8, - 0x8a, 0x99, 0xe1, 0x5f, 0x56, 0xaf, 0x21, 0x78, 0x45, 0x7e, 0x4a, 0x37, - 0x96, 0xe0, 0x92, 0xf2, 0xff, 0x1b, 0xea, 0x06, 0x42, 0x02, 0x54, 0xb9, - 0x2a, 0xe9, 0x87, 0x1c, 0x29, 0x4d, 0x22, 0xf7, 0xe8, 0x98, 0x0b, 0x8a, - 0xb2, 0xb9, 0x30, 0xcc, 0xd5, 0x16, 0x68, 0xc6, 0xd9, 0x08, 0xbb, 0xf1, - 0x80, 0xb7, 0x10, 0x6f, 0x7d, 0xb0, 0x8b, 0xb1, 0xba, 0x92, 0xf8, 0xa9, - 0xa1, 0xcb, 0x0c, 0x50, 0xae, 0xf6, 0x05, 0x8b, 0x54, 0x19, 0x22, 0xae, - 0xe4, 0x4e, 0x08, 0x93, 0xf1, 0x85, 0x38, 0x70, 0xaa, 0xf2, 0x03, 0x26, - 0xf5, 0x0b, 0x18, 0x19, 0xf8, 0xe2, 0x1f, 0x1f, 0x55, 0x8c, 0xda, 0x67, - 0x1e, 0xb8, 0x7b, 0x23, 0x52, 0x3d, 0xa0, 0x02, 0xfa, 0x55, 0xf0, 0xe2, - 0x3c, 0x08, 0xcb, 0xa1, 0x41, 0x62, 0x18, 0x49, 0x8e, 0x85, 0x83, 0xf8, - 0x49, 0xa9, 0xe8, 0xc4, 0x59, 0xdc, 0x3d, 0x72, 0xeb, 0x8e, 0x1f, 0x10, - 0xa5, 0xeb, 0xb3, 0xe6, 0x4c, 0x02, 0xa4, 0xb4, 0xef, 0xf2, 0xa2, 0xe7, - 0x3b, 0xe2, 0x3f, 0x07, 0xaa, 0xda, 0xaa, 0xa5, 0x1d, 0x83, 0x37, 0xcd, - 0x10, 0x59, 0x36, 0x8e, 0x96, 0x3f, 0x61, 0x76, 0x88, 0x08, 0xba, 0x4e, - 0xb2, 0xbf, 0x06, 0xba, 0x46, 0xd0, 0x2d, 0x95, 0xd7, 0xe1, 0x82, 0x4d, - 0x2e, 0x84, 0x1a, 0x08, 0x21, 0x01, 0xfe, 0xc5, 0x97, 0x6b, 0x5c, 0x4c, - 0x43, 0x6a, 0xc6, 0x97, 0x98, 0x9f, 0xab, 0x6c, 0x46, 0x14, 0xa2, 0xe4, - 0xbd, 0xc9, 0x52, 0xd8, 0x36, 0xc4, 0xf9, 0x69, 0x6b, 0x8c, 0xcd, 0x8d, - 0x8f, 0x14, 0x4a, 0x48, 0xc8, 0x3b, 0x35, 0x5c, 0xd2, 0x14, 0xfc, 0x42, - 0x4f, 0xf8, 0x0c, 0x6e, 0xcf, 0x20, 0x96, 0x93, 0xd0, 0x73, 0xcf, 0xf9, - 0x85, 0x61, 0xc2, 0xd5, 0xbc, 0xa6, 0x37, 0xf3, 0x4a, 0x0c, 0xa8, 0x3c, - 0x55, 0x70, 0x76, 0xba, 0x4e, 0x1f, 0xa6, 0x3b, 0x4b, 0x33, 0x17, 0x7b, - 0xfc, 0xe0, 0xc7, 0x9e, 0x7c, 0xa0, 0xab, 0xcf, 0x47, 0xf1, 0x8b, 0xde, - 0x37, 0xa6, 0xc2, 0xe8, 0xd4, 0x1b, 0x1a, 0x6b, 0x83, 0x70, 0x3a, 0xd7, - 0x69, 0x7a, 0x8b, 0x32, 0x23, 0xf9, 0x76, 0x5b, 0xca, 0xf6, 0xd8, 0x1e, - 0xda, 0x8a, 0xc9, 0x25, 0x10, 0x2a, 0x24, 0x84, 0x28, 0x48, 0x3b, 0xea, - 0xaf, 0xf1, 0x45, 0x46, 0x54, 0x13, 0x85, 0xbd, 0x2a, 0x7e, 0x2f, 0x42, - 0x30, 0x06, 0x7e, 0x67, 0xa3, 0x7a, 0x72, 0xa6, 0xfa, 0x94, 0x50, 0x22, - 0x1d, 0x77, 0x67, 0x0b, 0x18, 0x57, 0x20, 0x0f, 0x01, 0xa8, 0xaf, 0xf2, - 0xe1, 0xd2, 0xc5, 0x12, 0xff, 0xc3, 0xaa, 0xba, 0x28, 0x4a, 0x2f, 0xcb, - 0x79, 0xe9, 0xee, 0x18, 0xb7, 0x04, 0xc3, 0x0a, 0xad, 0x4c, 0xc6, 0x68, - 0x6a, 0xac, 0xa2, 0x16, 0x06, 0x18, 0x04, 0xd4, 0xa4, 0xdd, 0x31, 0xd1, - 0xdd, 0x96, 0xf6, 0x5a, 0x75, 0xfc, 0xb3, 0x49, 0x6e, 0x7c, 0xa1, 0x78, - 0x38, 0x81, 0x3f, 0x9f, 0x64, 0x35, 0x1d, 0xc0, 0xd8, 0xb2, 0xdd, 0xfb, - 0xca, 0x43, 0x16, 0x71, 0x05, 0x4e, 0x20, 0xcb, 0x8c, 0x17, 0x30, 0x71, - 0x23, 0x8b, 0x6f, 0x4c, 0x98, 0x1b, 0xa6, 0xee, 0x68, 0x85, 0xdf, 0x16, - 0x02, 0x7e, 0xa8, 0x20, 0x58, 0x0a, 0xee, 0xae, 0x83, 0xfb, 0x3a, 0x09, - 0x4d, 0x2e, 0x28, 0x37, 0x3a, 0xc8, 0x35, 0x1c, 0x76, 0x44, 0x03, 0x7f, - 0xf2, 0x49, 0x11, 0xda, 0xb5, 0x2f, 0x1b, 0xbd, 0xe5, 0xa8, 0x41, 0x69, - 0x1d, 0xde, 0x5a, 0xda, 0xeb, 0x2b, 0x5f, 0xf2, 0xe8, 0xad, 0x7e, 0xef, - 0x32, 0x7c, 0xcb, 0x82, 0x93, 0x0f, 0x4b, 0x42, 0x6f, 0x41, 0x30, 0xff, - 0x36, 0xf1, 0x65, 0x6c, 0x00, 0xe2, 0xde, 0x79, 0x3e, 0xcc, 0x29, 0xae, - 0xf1, 0x6a, 0x77, 0x7a, 0xff, 0xbd, 0xf4, 0x4b, 0x4d, 0x38, 0x09, 0xfd, - 0xb9, 0x13, 0x6a, 0xe6, 0x9b, 0xce, 0x7b, 0xfc, 0x36, 0x01, 0x29, 0x12, - 0x90, 0x07, 0x92, 0x01, 0x2e, 0x9d, 0xfd, 0xd1, 0x04, 0xa5, 0x40, 0x87, - 0x34, 0x84, 0xf3, 0xa1, 0x06, 0xcc, 0xe1, 0x50, 0x00, 0xee, 0x4e, 0x34, - 0x38, 0x8d, 0x03, 0x01, 0xd9, 0x7d, 0xfc, 0x50, 0x59, 0xc8, 0xea, 0xf8, - 0x43, 0x5a, 0xa3, 0xa9, 0x28, 0xbb, 0xae, 0xfe, 0x5c, 0xb0, 0xb6, 0x4a, - 0x9c, 0xc6, 0xd6, 0x75, 0xde, 0xf8, 0x41, 0xb7, 0xcf, 0x68, 0x30, 0xe5, - 0x6c, 0xe7, 0xfb, 0xc6, 0x63, 0x92, 0xa4, 0x26, 0xb0, 0x27, 0x82, 0x0f, - 0xf9, 0x60, 0x1d, 0xb9, 0x36, 0x7d, 0xd4, 0xed, 0xd8, 0x6b, 0xf6, 0xf6, - 0xb2, 0x98, 0x74, 0x47, 0xbb, 0x5c, 0x67, 0x27, 0x25, 0x2b, 0xeb, 0x99, - 0x8c, 0xbe, 0x3c, 0x02, 0x0b, 0x4f, 0xff, 0xa1, 0xfc, 0x39, 0xe3, 0x46, - 0x47, 0xf5, 0xb0, 0xd1, 0xc8, 0xf3, 0x05, 0x18, 0xf0, 0x36, 0x44, 0x78, - 0xe4, 0x7c, 0x03, 0x0f, 0xb1, 0x35, 0xd3, 0xd8, 0x66, 0x62, 0xa1, 0xe3, - 0x2c, 0x6b, 0x73, 0x47, 0x55, 0xa2, 0x36, 0x99, 0x4b, 0x55, 0xb6, 0x94, - 0x8a, 0x4f, 0xd1, 0x48, 0x16, 0xb8, 0x66, 0x51, 0x38, 0xfb, 0x5e, 0xc7, - 0x5c, 0x2c, 0xa3, 0xa4, 0x06, 0x0d, 0x27, 0xb0, 0x83, 0x1e, 0x7a, 0x1f, - 0xc1, 0x78, 0xd8, 0xac, 0xae, 0x17, 0xd5, 0xc3, 0x8f, 0xb5, 0xf1, 0x96, - 0x97, 0x53, 0x1a, 0xb3, 0x06, 0xb7, 0x6f, 0x95, 0x91, 0x60, 0x89, 0xdf, - 0xa8, 0x7a, 0xfd, 0xf2, 0xa4, 0x27, 0x3d, 0xee, 0x04, 0x6d, 0xa0, 0xf6, - 0x44, 0x4e, 0x89, 0xed, 0xe2, 0x30, 0xb9, 0x93, 0x12, 0x56, 0x20, 0x7c, - 0xc9, 0x97, 0x57, 0x65, 0x99, 0xf7, 0x46, 0x69, 0x79, 0x1d, 0xc2, 0xc1, - 0x21, 0xb2, 0x12, 0xb1, 0x37, 0x94, 0x42, 0x2b, 0x92, 0x54, 0x3e, 0x38, - 0x7a, 0xf6, 0x7b, 0x81, 0x31, 0xa3, 0x3b, 0x92, 0xf8, 0x70, 0x1d, 0xb2, - 0x6b, 0x17, 0x5b, 0x6d, 0x16, 0x29, 0x30, 0x62, 0x1d, 0xe3, 0x4b, 0x98, - 0x79, 0x8b, 0x80, 0x89, 0x12, 0xd9, 0xf1, 0x45, 0xe5, 0x62, 0x7d, 0xf2, - 0xc7, 0xea, 0xf5, 0x6d, 0xd2, 0x2c, 0x9d, 0xa1, 0x2c, 0x3e, 0x3d, 0xff, - 0xa8, 0xcb, 0xbf, 0x4b, 0xee, 0x43, 0x11, 0x1f, 0xf1, 0x9e, 0xae, 0x4c, - 0x9c, 0xd7, 0xd6, 0x10, 0x96, 0x15, 0x1b, 0x29, 0x05, 0x40, 0xaf, 0xd7, - 0x95, 0x08, 0xaa, 0x84, 0x6c, 0x7f, 0xf8, 0x56, 0x6e, 0x90, 0xee, 0x75, - 0x8d, 0x8d, 0xec, 0x59, 0x6f, 0x4b, 0xd1, 0x20, 0xcf, 0x64, 0x1d, 0xc9, - 0xd5, 0x79, 0xd2, 0x84, 0x2a, 0xe0, 0xdc, 0x65, 0xb6, 0x4a, 0x5b, 0x57, - 0xee, 0x8d, 0x7d, 0x65, 0xda, 0xa1, 0x79, 0x24, 0x0b, 0xae, 0x63, 0x99, - 0xbf, 0x03, 0x08, 0x40, 0x59, 0xaf, 0x61, 0xf7, 0xc9, 0x40, 0x43, 0xfe, - 0xd9, 0x75, 0x00, 0x16, 0xdc, 0xed, 0x62, 0x46, 0x06, 0x64, 0x5d, 0xec, - 0xa4, 0xf9, 0x7f, 0xd2, 0xc0, 0xff, 0xa7, 0x93, 0xda, 0xbd, 0x54, 0xa6, - 0x22, 0x44, 0xe9, 0x25, 0x76, 0x61, 0xd4, 0x6b, 0xb7, 0x07, 0x0c, 0x75, - 0x51, 0xf4, 0x6b, 0xbf, 0x5c, 0xeb, 0x95, 0xb8, 0xa7, 0x51, 0xc5, 0xd1, - 0x3e, 0xdd, 0x57, 0xbe, 0xdd, 0x14, 0x3f, 0xd6, 0x2b, 0x6e, 0xbf, 0x11, - 0x67, 0xc4, 0xa9, 0x5b, 0x46, 0xa4, 0xf2, 0xd8, 0xd6, 0xd6, 0x7c, 0xd2, - 0x85, 0xe3, 0xf8, 0x60, 0xd9, 0x7b, 0x0e, 0x30, 0x81, 0xc6, 0x15, 0xe6, - 0x3c, 0x1a, 0xde, 0xc3, 0xcd, 0x97, 0x99, 0x7e, 0x83, 0xa7, 0x1b, 0x41, - 0x55, 0x73, 0xf2, 0x44, 0xb3, 0x0b, 0xa7, 0xb7, 0x1e, 0x60, 0x3c, 0x1c, - 0xac, 0xfb, 0xff, 0x5b, 0x13, 0x70, 0xde, 0x44, 0x7a, 0x19, 0x12, 0xf9, - 0x5a, 0x1c, 0x1a, 0x16, 0x1d, 0x35, 0x6e, 0x36, 0xd9, 0x88, 0x9b, 0x8b, - 0x85, 0xce, 0xcb, 0xf1, 0x8f, 0x2a, 0xf2, 0x69, 0x57, 0xbd, 0xc1, 0xbd, - 0x3b, 0x7e, 0x08, 0xe6, 0x13, 0xa6, 0xb3, 0x7c, 0x72, 0x48, 0xca, 0xa7, - 0x18, 0xe4, 0xaf, 0xe0, 0xda, 0xad, 0x66, 0xc5, 0x34, 0x8f, 0xf1, 0x11, - 0xb3, 0xb1, 0x88, 0x20, 0x22, 0x63, 0x33, 0xaa, 0xd7, 0x5d, 0xf8, 0x7b, - 0x4c, 0x3d, 0x21, 0xdf, 0x53, 0x7a, 0xdc, 0x44, 0xff, 0xa4, 0xcf, 0x22, - 0xe8, 0x3d, 0xcb, 0x99, 0x65, 0x7d, 0xf2, 0x9b, 0x48, 0x34, 0xa1, 0x33, - 0xca, 0xa4, 0x3e, 0x9b, 0xb9, 0x13, 0x7a, 0x70, 0x84, 0x55, 0x67, 0xbb, - 0xa3, 0x18, 0xfc, 0x88, 0x46, 0xb5, 0x02, 0x22, 0x21, 0xe7, 0xab, 0xe3, - 0x4d, 0x6b, 0xdf, 0x62, 0x27, 0xa3, 0xe9, 0xb2, 0xea, 0xc0, 0x84, 0xce, - 0x24, 0x1d, 0x1b, 0x0e, 0x7a, 0x4c, 0x18, 0xe4, 0x25, 0x3f, 0x31, 0xc6, - 0xd5, 0xd9, 0xcb, 0x4f, 0xde, 0x6c, 0xe8, 0xe1, 0xb1, 0xd1, 0xee, 0x0c, - 0x10, 0xfa, 0xa4, 0xb7, 0xa7, 0xa2, 0x47, 0xdc, 0xe2, 0x70, 0x2c, 0x18, - 0xa4, 0x73, 0xaa, 0xdf, 0x18, 0x24, 0x98, 0x61, 0xb9, 0x72, 0xbb, 0x88, - 0x02, 0xe7, 0x46, 0x36, 0x62, 0x75, 0x57, 0xef, 0x6b, 0xf5, 0xc0, 0x3c, - 0x9f, 0xf7, 0x70, 0x24, 0x41, 0x2c, 0xb2, 0xa4, 0xc6, 0x98, 0xda, 0x01, - 0xef, 0xea, 0xcd, 0xbe, 0x55, 0xb8, 0x56, 0x4f, 0x6b, 0x5e, 0x33, 0x6a, - 0x6e, 0xc1, 0xc7, 0x4b, 0x47, 0x82, 0x29, 0x61, 0x54, 0x7d, 0x76, 0x1d, - 0x75, 0x33, 0x27, 0xe7, 0xac, 0x48, 0xdd, 0x10, 0xbe, 0xc8, 0xaa, 0xa5, - 0x62, 0x64, 0x71, 0xc9, 0xbc, 0x3c, 0x02, 0x1b, 0x6c, 0x3d, 0x9e, 0x2d, - 0x5f, 0xe2, 0xde, 0x28, 0xba, 0x6f, 0x3a, 0x59, 0x66, 0x43, 0xb3, 0x47, - 0x2d, 0x23, 0xc1, 0xb4, 0xee, 0x71, 0xd5, 0x6c, 0x4c, 0x6e, 0xe3, 0x40, - 0x9d, 0xe3, 0x04, 0xd3, 0xb1, 0x2d, 0x40, 0x94, 0x07, 0x7d, 0xe0, 0xe5, - 0xd4, 0x8b, 0x60, 0xb7, 0x97, 0x6f, 0x89, 0x56, 0x3c, 0x6b, 0x68, 0xcc, - 0xe4, 0xdd, 0x00, 0xdd, 0x69, 0x89, 0xc1, 0xcc, 0x9b, 0x18, 0xbf, 0xd7, - 0x19, 0x7f, 0xfd, 0x6c, 0x9a, 0x2d, 0x12, 0xc6, 0xb1, 0x46, 0xbb, 0x86, - 0x83, 0x34, 0x46, 0x34, 0x71, 0xb8, 0x7a, 0x7c, 0x90, 0x3f, 0xab, 0x69, - 0x3c, 0x70, 0xdc, 0x8b, 0x3e, 0x0b, 0x91, 0x4c, 0xe8, 0x19, 0x57, 0xa1, - 0xb1, 0xd1, 0xe0, 0xeb, 0x39, 0x57, 0x7b, 0x5d, 0x40, 0x12, 0x30, 0xaa, - 0x56, 0x58, 0x9e, 0xba, 0xe4, 0x0f, 0x4a, 0x0e, 0xa2, 0xd8, 0x97, 0xe2, - 0x91, 0x51, 0x05, 0x4f, 0xca, 0xf7, 0xd9, 0x26, 0xcc, 0x08, 0x42, 0xfa, - 0x13, 0x2a, 0x27, 0xdd, 0x6a, 0xac, 0xf0, 0x9b, 0xde, 0xed, 0x8d, 0x01, - 0x38, 0x7a, 0x8f, 0x63, 0xd3, 0x96, 0xa6, 0xe6, 0x18, 0xbc, 0x7f, 0x66, - 0x87, 0xb9, 0x43, 0x9b, 0xa6, 0xc2, 0x3b, 0xf6, 0xee, 0xad, 0x54, 0xe7, - 0x1c, 0x15, 0x99, 0x0b, 0x51, 0xeb, 0xdf, 0xd0, 0x00, 0x0c, 0x86, 0x7e, - 0x32, 0x8f, 0x88, 0xc4, 0x3d, 0x5a, 0x71, 0x3b, 0x11, 0xa4, 0x7e, 0x3b, - 0xa0, 0x42, 0xb6, 0x41, 0xe4, 0xe2, 0x0d, 0x81, 0xeb, 0xcc, 0x21, 0xca, - 0xe1, 0xde, 0xc4, 0xfc, 0xc8, 0xc6, 0x2b, 0xd8, 0x82, 0x47, 0x68, 0x68, - 0xd9, 0xf0, 0xe6, 0x0c, 0xa9, 0xc7, 0x00, 0x33, 0xc6, 0xdd, 0xbf, 0x91, - 0x41, 0xaa, 0x36, 0xf4, 0x4e, 0x5b, 0x51, 0x8c, 0x46, 0x89, 0xaa, 0xd6, - 0xca, 0xa2, 0xdc, 0x3b, 0x0b, 0x0a, 0xda, 0xd6, 0x73, 0x12, 0x86, 0x59, - 0x42, 0x86, 0x04, 0xee, 0x05, 0x8e, 0x5d, 0x53, 0xb1, 0x2a, 0x06, 0x25, - 0x5d, 0xd6, 0xb8, 0x8b, 0xdc, 0x72, 0x27, 0x4f, 0x1b, 0x9d, 0x00, 0x3f, - 0xff, 0xc6, 0xb8, 0x62, 0x83, 0x04, 0xe4, 0x27, 0x70, 0x6b, 0x51, 0x01, - 0x8b, 0xd6, 0x39, 0x80, 0xab, 0xfe, 0xb8, 0x94, 0xee, 0xa6, 0x61, 0xe9, - 0x4a, 0x2e, 0x34, 0xd2, 0x41, 0x71, 0xfc, 0x70, 0x60, 0x82, 0xc0, 0x73, - 0xd5, 0x8c, 0x2a, 0xc4, 0x75, 0x2a, 0x2e, 0x69, 0x5e, 0x53, 0x09, 0x34, - 0xe6, 0x2c, 0xea, 0x46, 0x07, 0x8e, 0x51, 0x14, 0xeb, 0x99, 0x09, 0xc5, - 0xf6, 0x2f, 0xd2, 0x3f, 0x0b, 0xa6, 0x92, 0xc1, 0xb8, 0xbc, 0x41, 0x47, - 0x39, 0x47, 0x18, 0x8c, 0x5a, 0x98, 0x58, 0x35, 0x04, 0x68, 0x64, 0xe0, - 0x1a, 0x0d, 0x36, 0x1c, 0x21, 0xe7, 0xe7, 0x17, 0x4a, 0x24, 0x49, 0x39, - 0x8a, 0xfa, 0x64, 0xd4, 0x90, 0x03, 0x0e, 0x16, 0xa0, 0xf7, 0x25, 0x2c, - 0xc9, 0x02, 0x74, 0x6d, 0xd2, 0xa1, 0x67, 0xe0, 0x2e, 0x50, 0xb6, 0x68, - 0x65, 0x2b, 0x05, 0xe0, 0x2b, 0x35, 0x21, 0x14, 0xbf, 0xfb, 0x99, 0xf8, - 0x7e, 0x1b, 0x34, 0xd3, 0xf6, 0x14, 0x55, 0x7b, 0x4b, 0x06, 0x8c, 0x74, - 0x55, 0xe7, 0x55, 0x9a, 0x54, 0xbd, 0x0a, 0x78, 0x58, 0xb1, 0xd6, 0xeb, - 0x3f, 0x00, 0x17, 0x33, 0x57, 0xe4, 0x1c, 0x9f, 0x30, 0x6e, 0x56, 0x34, - 0xfa, 0x91, 0x10, 0x4e, 0x4f, 0x2b, 0x1b, 0x50, 0x27, 0xde, 0x8d, 0x54, - 0x4c, 0x16, 0x22, 0xca, 0x89, 0x22, 0xf5, 0xc6, 0x59, 0x1a, 0xc3, 0x96, - 0xbe, 0x4e, 0x6e, 0xb7, 0xea, 0x0c, 0x22, 0x0a, 0x28, 0xa0, 0x58, 0x2b, - 0x8f, 0x9b, 0x9a, 0x94, 0x58, 0x86, 0xbc, 0x0d, 0x1e, 0x7f, 0x7b, 0x69, - 0x7a, 0x23, 0x82, 0x54, 0x78, 0xbf, 0xd6, 0x85, 0x3c, 0xbc, 0x5f, 0x26, - 0x07, 0xeb, 0xf1, 0xb1, 0x7d, 0xd2, 0x4e, 0xb8, 0xc6, 0xf2, 0x2e, 0x5c, - 0xbc, 0xfb, 0xd5, 0x84, 0x36, 0x0c, 0x84, 0xcf, 0x37, 0x31, 0x99, 0xbb, - 0x6c, 0x84, 0xed, 0x72, 0xd9, 0x12, 0x09, 0xdc, 0x51, 0xea, 0x60, 0xf4, - 0x13, 0xa9, 0xf7, 0x51, 0xd7, 0xc4, 0x15, 0x3b, 0x6a, 0x74, 0x87, 0xb6, - 0xea, 0xcc, 0xdc, 0x7e, 0x15, 0x80, 0xfe, 0x6d, 0x34, 0x38, 0xa5, 0x15, - 0x40, 0x13, 0xc2, 0x22, 0x9c, 0x33, 0x6b, 0x6c, 0x13, 0x72, 0xb8, 0xf9, - 0x10, 0x54, 0x35, 0xc6, 0xf1, 0xf1, 0x52, 0x18, 0x2b, 0xa8, 0xcc, 0xe6, - 0x24, 0x50, 0x29, 0xee, 0x3b, 0x1f, 0x99, 0x8b, 0x4c, 0x6f, 0xc0, 0xd9, - 0xd0, 0xbd, 0x8e, 0xee, 0x5f, 0xe4, 0xad, 0x61, 0x12, 0xaf, 0xb9, 0x8c, - 0xd9, 0x9e, 0xab, 0xba, 0x87, 0x35, 0x04, 0x05, 0x71, 0x36, 0xd8, 0x12, - 0x0e, 0x34, 0x4f, 0x87, 0x10, 0xda, 0x5c, 0x9a, 0xb8, 0x0c, 0x46, 0xfe, - 0x23, 0xf4, 0xf1, 0x2b, 0x7a, 0x6e, 0xfd, 0x04, 0xab, 0x63, 0xac, 0xcd, - 0x65, 0xd5, 0xac, 0x82, 0xee, 0x62, 0xa7, 0xb6, 0x5e, 0x3f, 0x71, 0x97, - 0x10, 0x5d, 0xef, 0x03, 0x50, 0x0e, 0xbf, 0x42, 0x1a, 0xb1, 0xc8, 0x09, - 0xe7, 0x38, 0xb9, 0xdd, 0x1a, 0x2e, 0x0e, 0x7e, 0x0c, 0xfd, 0x38, 0x22, - 0x58, 0x55, 0x17, 0x49, 0xcb, 0x69, 0x74, 0x9a, 0xf7, 0xc2, 0x95, 0xfc, - 0x50, 0xde, 0x7e, 0xdd, 0x7f, 0xad, 0xdb, 0x9d, 0x04, 0x21, 0x84, 0x72, - 0x8d, 0x4a, 0x32, 0x8c, 0xa1, 0x95, 0xdb, 0x34, 0x77, 0x65, 0x72, 0xa7, - 0xbf, 0x8c, 0xb6, 0x4e, 0x51, 0x51, 0xd1, 0x71, 0xd8, 0x02, 0x5c, 0x76, - 0x25, 0xd2, 0x87, 0xdf, 0xc5, 0xe1, 0x16, 0x13, 0xf9, 0xbf, 0x6a, 0x82, - 0xab, 0xb5, 0x30, 0x1e, 0xdc, 0x61, 0x56, 0xe2, 0xcc, 0x77, 0x02, 0x68, - 0xe5, 0x2a, 0x49, 0x3e, 0xb5, 0x8a, 0x5c, 0x28, 0x95, 0x78, 0xef, 0x55, - 0x6e, 0xdd, 0x8c, 0xbc, 0x70, 0x57, 0x07, 0x26, 0x9d, 0xc7, 0xef, 0x40, - 0x8a, 0x16, 0xce, 0x23, 0xca, 0x87, 0xa0, 0x35, 0x2d, 0xea, 0x51, 0x51, - 0x98, 0x18, 0x41, 0xea, 0x73, 0xca, 0xec, 0x55, 0xb2, 0x49, 0xde, 0xae, - 0x2a, 0xc8, 0xfa, 0x6c, 0xcf, 0x27, 0x28, 0xd9, 0xd6, 0x5b, 0x69, 0x07, - 0x65, 0x1c, 0x33, 0x53, 0x83, 0x4a, 0x93, 0xf3, 0x25, 0x5b, 0x7e, 0xfb, - 0xca, 0xa2, 0x94, 0xe8, 0xdf, 0xdd, 0x2b, 0xb1, 0xf1, 0x92, 0x5d, 0x17, - 0x5b, 0xfb, 0x91, 0xb4, 0x9f, 0xa5, 0x10, 0x2c, 0xb9, 0x03, 0x7c, 0x79, - 0x8b, 0xbb, 0xe7, 0xe8, 0x51, 0xad, 0xef, 0xab, 0x19, 0xea, 0x54, 0x79, - 0x42, 0xa6, 0x4d, 0x26, 0x77, 0xa4, 0x11, 0xf9, 0xa9, 0xb0, 0x6c, 0x0d, - 0xec, 0x32, 0x63, 0xef, 0x32, 0xe0, 0x61, 0x18, 0xca, 0x61, 0x6e, 0xb4, - 0x18, 0x6a, 0xe0, 0xc6, 0x55, 0xad, 0x92, 0x59, 0xdd, 0x99, 0x84, 0xaf, - 0x16, 0xbc, 0xb3, 0x27, 0x48, 0x77, 0x67, 0x48, 0xb8, 0xfa, 0xa8, 0x5a, - 0x57, 0x97, 0x15, 0xcd, 0x37, 0xb8, 0x95, 0x1c, 0x42, 0xbb, 0x9f, 0x71, - 0x21, 0x24, 0xf0, 0x73, 0xd8, 0x05, 0x54, 0x6b, 0x10, 0xdd, 0x39, 0x92, - 0x1d, 0xfc, 0xdd, 0x21, 0x98, 0x24, 0x3b, 0xb9, 0x92, 0x29, 0xb4, 0x8a, - 0x49, 0xb2, 0xc0, 0xf2, 0xda, 0xe5, 0x6e, 0x4b, 0x4c, 0x33, 0x51, 0xaf, - 0x2c, 0xc9, 0x5e, 0xcc, 0xd3, 0x5a, 0xa9, 0xd3, 0x99, 0xa4, 0x98, 0xb9, - 0x17, 0x8c, 0x54, 0x04, 0x6e, 0xeb, 0x67, 0xf4, 0x9f, 0x41, 0x66, 0xe8, - 0x51, 0x2a, 0x30, 0xdf, 0x5b, 0xb0, 0x7e, 0x89, 0x7b, 0xa2, 0x56, 0x75, - 0x42, 0x22, 0x09, 0x5d, 0x10, 0x51, 0x7b, 0x00, 0x22, 0xc2, 0x23, 0x39, - 0xe1, 0xd9, 0x22, 0xe7, 0x1f, 0xd2, 0x24, 0xe3, 0x5f, 0x54, 0x45, 0x44, - 0x65, 0x2c, 0xff, 0x32, 0x7a, 0xb0, 0xdf, 0xc9, 0xeb, 0xd4, 0x1a, 0x67, - 0xcc, 0x93, 0x16, 0x36, 0x33, 0x4a, 0x24, 0x4c, 0x10, 0xd5, 0xce, 0xbd, - 0xa9, 0xfd, 0x71, 0x26, 0x06, 0xdc, 0x01, 0xb9, 0xec, 0x52, 0x0a, 0xd8, - 0x9e, 0xaa, 0x67, 0xf4, 0x65, 0xe4, 0xb2, 0x56, 0x78, 0x91, 0xe6, 0x0b, - 0xae, 0x59, 0xf9, 0xb2, 0x88, 0x93, 0xfa, 0x09, 0xe9, 0x3d, 0x69, 0xa8, - 0xe0, 0x5d, 0x25, 0xb4, 0x06, 0x5e, 0x9e, 0x1d, 0xef, 0x11, 0xf4, 0xca, - 0xb9, 0x3a, 0x56, 0x67, 0x66, 0xb2, 0xfd, 0xa7, 0x29, 0x73, 0xa8, 0xbc, - 0xca, 0x54, 0x90, 0x68, 0x0b, 0xec, 0xca, 0x08, 0x25, 0xac, 0x20, 0x92, - 0x03, 0x33, 0x60, 0x77, 0xb5, 0x9b, 0xf9, 0x6c, 0x58, 0x0b, 0x1a, 0x18, - 0x00, 0x1f, 0x66, 0xec, 0x0d, 0xab, 0xe3, 0x17, 0x6a, 0xe3, 0xf1, 0xb0, - 0x34, 0x67, 0x23, 0x19, 0x0f, 0x25, 0x04, 0x7a, 0x31, 0x77, 0x24, 0x38, - 0xe3, 0x59, 0xec, 0x54, 0xab, 0x7c, 0xd3, 0xaf, 0xe4, 0xbe, 0x64, 0x06, - 0xde, 0x4a, 0x76, 0x3f, 0x0c, 0x3b, 0xc5, 0x2b, 0x95, 0xb4, 0xe0, 0x73, - 0x60, 0x19, 0xde, 0x3b, 0x16, 0x46, 0x13, 0x49, 0xfe, 0xbe, 0x07, 0xbd, - 0xb1, 0xdb, 0x61, 0x8c, 0x42, 0x5d, 0x5d, 0xd5, 0x57, 0xc7, 0xf9, 0xc6, - 0x2c, 0x85, 0x68, 0x83, 0xf7, 0xa0, 0x9b, 0xf3, 0xc8, 0x38, 0x71, 0x6f, - 0xc3, 0xea, 0xbe, 0x12, 0x8d, 0x16, 0x64, 0x38, 0x53, 0xcc, 0x09, 0x43, - 0x10, 0x35, 0x24, 0xb3, 0x3d, 0xaa, 0xa8, 0x55, 0xbc, 0x64, 0xdc, 0x8e, - 0xd6, 0xf4, 0x97, 0x2f, 0x3e, 0xe5, 0xa6, 0x00, 0xda, 0xec, 0xde, 0x24, - 0xa5, 0xed, 0xd2, 0x4b, 0x18, 0xd4, 0x10, 0xed, 0x98, 0xe1, 0x87, 0x54, - 0x42, 0x0a, 0x97, 0x08, 0xc4, 0xd0, 0x97, 0xa5, 0x82, 0xab, 0x70, 0xec, - 0x61, 0xf9, 0x8d, 0xb6, 0xe2, 0x63, 0x15, 0x72, 0x0e, 0x74, 0xea, 0xb6, - 0x16, 0xd6, 0xc2, 0x1b, 0x15, 0x1c, 0xcf, 0x86, 0x43, 0x4e, 0x76, 0xa5, - 0xf0, 0x4b, 0x2c, 0x0f, 0x89, 0xe4, 0x4c, 0xd9, 0xf0, 0xe7, 0x61, 0xae, - 0xb7, 0x77, 0x05, 0x27, 0x81, 0xcc, 0x99, 0xf6, 0x97, 0x8a, 0x9a, 0x3e, - 0xea, 0x31, 0x5f, 0x04, 0x78, 0xb1, 0x6d, 0xb2, 0x94, 0xc5, 0x98, 0x3a, - 0xbe, 0x47, 0x3e, 0x86, 0xd1, 0x3a, 0x4c, 0xf3, 0xf3, 0xdf, 0x0c, 0xc6, - 0xb2, 0xc0, 0x7a, 0xa6, 0x63, 0x0c, 0x7e, 0xbc, 0x7a, 0xc7, 0x2b, 0x7f, - 0xe6, 0x95, 0x33, 0x3b, 0xfb, 0xec, 0xcb, 0x2c, 0xb1, 0xe5, 0x5b, 0xbb, - 0x5c, 0x5f, 0xf1, 0xf5, 0x8f, 0x08, 0x61, 0x53, 0x0b, 0x1b, 0x93, 0x53, - 0x3c, 0xde, 0x76, 0xe6, 0x41, 0xdb, 0x3b, 0xe1, 0xe1, 0x35, 0xd4, 0x59, - 0xf6, 0xc3, 0x70, 0x8a, 0x94, 0x5e, 0x96, 0x68, 0x42, 0x6a, 0x93, 0x63, - 0xa4, 0x67, 0x1b, 0xfa, 0x75, 0x8e, 0xfe, 0x6a, 0x4f, 0x1c, 0xcf, 0xbc, - 0xa1, 0x93, 0xca, 0x2e, 0x3d, 0xf0, 0x9a, 0x51, 0xe5, 0xf7, 0x1f, 0x94, - 0x45, 0xc3, 0x69, 0x1b, 0xff, 0x2f, 0x2b, 0x53, 0x2e, 0xe3, 0xdc, 0x60, - 0x1d, 0x26, 0xfe, 0x4f, 0x39, 0x4b, 0x0a, 0xb7, 0xe6, 0x93, 0x75, 0xa3, - 0xee, 0x64, 0xaf, 0x6c, 0xce, 0xbc, 0x50, 0x0d, 0xd2, 0xd7, 0x75, 0xd3, - 0xd0, 0xc1, 0xec, 0x9f, 0x48, 0xfc, 0xda, 0xe9, 0xaf, 0xe9, 0x7f, 0x6e, - 0x10, 0x7b, 0x1e, 0xbc, 0xee, 0xda, 0x35, 0x4d, 0xcb, 0x38, 0x83, 0xa2, - 0x0d, 0x1d, 0x3b, 0x6d, 0xef, 0xb8, 0xf6, 0xf1, 0x02, 0x16, 0x2e, 0x87, - 0xa1, 0xa6, 0xcb, 0xeb, 0x7b, 0xb4, 0xd0, 0xa5, 0x2e, 0x6e, 0xe9, 0x68, - 0x6f, 0x16, 0x43, 0x66, 0xc5, 0x8d, 0x6f, 0xa2, 0xe1, 0x58, 0xbe, 0xe9, - 0x19, 0x30, 0x38, 0x34, 0x74, 0x2a, 0x2d, 0x25, 0x11, 0x6e, 0x22, 0x6c, - 0xfe, 0x32, 0x0a, 0xd6, 0xc2, 0x49, 0x9e, 0x30, 0x40, 0x1f, 0x6a, 0x4a, - 0xe6, 0x90, 0x2f, 0xe4, 0xd4, 0xaf, 0x87, 0x20, 0x9a, 0x25, 0xdd, 0x39, - 0x0f, 0xaa, 0x03, 0x0a, 0x64, 0x8a, 0x0b, 0x4a, 0xf0, 0x43, 0x4a, 0xc2, - 0x6d, 0x0d, 0x79, 0x78, 0x3a, 0xd0, 0x95, 0xca, 0xb4, 0xe7, 0xad, 0xed, - 0xa8, 0x05, 0x68, 0x3f, 0xff, 0xef, 0xf3, 0xd7, 0xe8, 0x87, 0x32, 0x1c, - 0xf9, 0xae, 0xea, 0x71, 0xac, 0x9e, 0x8f, 0x0c, 0x38, 0xa9, 0x43, 0x14, - 0xe6, 0xb4, 0xd8, 0x12, 0xa8, 0x6d, 0x01, 0xc1, 0x20, 0xe0, 0x1b, 0xfa, - 0x9a, 0x47, 0xb9, 0xaf, 0xdb, 0x0c, 0x5a, 0xe7, 0xbc, 0x33, 0x29, 0xb8, - 0xcc, 0x9e, 0xc8, 0xe0, 0x14, 0xbe, 0xf2, 0x50, 0x14, 0xa2, 0xf3, 0x16, - 0x6f, 0x9b, 0x49, 0x41, 0xad, 0xc2, 0xd5, 0x59, 0x69, 0xbc, 0xe5, 0xb9, - 0x2e, 0x37, 0x07, 0x28, 0xf8, 0x73, 0x91, 0xa1, 0x10, 0x75, 0xc5, 0xa0, - 0xbc, 0x20, 0x27, 0xaf, 0x59, 0x3a, 0x2c, 0x2d, 0x7c, 0xde, 0x9a, 0x25, - 0x5d, 0xfa, 0xb4, 0xd3, 0x6b, 0xce, 0xba, 0x0c, 0x28, 0xfd, 0x30, 0xe2, - 0x69, 0x4c, 0x1f, 0x63, 0x66, 0x8f, 0xa7, 0x98, 0xbd, 0x66, 0x7d, 0x79, - 0xc2, 0xec, 0xe0, 0x34, 0x49, 0xeb, 0x27, 0xe0, 0x99, 0x74, 0xef, 0x99, - 0x8d, 0x7b, 0xb2, 0x2d, 0x20, 0x33, 0x79, 0x9f, 0xae, 0x39, 0xdb, 0x49, - 0xb1, 0xe2, 0x73, 0xec, 0x03, 0x38, 0xba, 0xbf, 0xb2, 0x5d, 0xc0, 0x06, - 0x6a, 0xe6, 0x3d, 0x37, 0xc3, 0xea, 0x52, 0xad, 0x16, 0x81, 0x21, 0xd0, - 0x1c, 0xfc, 0x35, 0xb5, 0x03, 0x21, 0xe7, 0xfb, 0x03, 0x03, 0xf1, 0xe2, - 0xcf, 0xe7, 0x10, 0x41, 0x1e, 0xda, 0x40, 0x05, 0x7a, 0x51, 0x1d, 0x20, - 0xd5, 0xd6, 0xb8, 0xdb, 0xbe, 0xed, 0x35, 0x2a, 0xe4, 0x42, 0xe1, 0x32, - 0xb8, 0x34, 0x33, 0xb4, 0xb8, 0xf8, 0xa5, 0x17, 0x2e, 0xe8, 0x5a, 0xc9, - 0xb9, 0x8f, 0x0b, 0x44, 0xdd, 0xb3, 0x33, 0x70, 0x16, 0xb4, 0x90, 0x5e, - 0x07, 0xe9, 0xc6, 0x37, 0x99, 0xd9, 0x2a, 0xed, 0xc8, 0x97, 0x86, 0xe7, - 0x7b, 0xe1, 0x99, 0x67, 0x9b, 0x42, 0xf6, 0x15, 0xd7, 0xf9, 0x81, 0x41, - 0x24, 0x45, 0x8f, 0xb5, 0xbb, 0xb2, 0x9f, 0xf5, 0x23, 0x1b, 0x93, 0x17, - 0xb6, 0x0a, 0x96, 0xbf, 0x6f, 0x9d, 0x1a, 0x00, 0xf2, 0xc1, 0x13, 0xce, - 0x3a, 0x0d, 0xd9, 0x7a, 0x1c, 0x49, 0x4e, 0xbc, 0xa3, 0xd2, 0x70, 0x7d, - 0xc9, 0x46, 0x21, 0x14, 0x23, 0x5b, 0x16, 0xce, 0x30, 0x39, 0x97, 0xd6, - 0x13, 0x78, 0x96, 0x91, 0x63, 0xa4, 0x4e, 0xc5, 0x98, 0x37, 0xde, 0x2c, - 0xfd, 0xbb, 0x95, 0xf5, 0x4d, 0xf1, 0xd7, 0x37, 0x04, 0xff, 0x09, 0xb1, - 0x0e, 0x88, 0x83, 0x9d, 0x17, 0xcd, 0xb0, 0x8b, 0x58, 0x4d, 0x1d, 0xd4, - 0xc8, 0x16, 0xd5, 0xf9, 0xbb, 0x3b, 0x09, 0x05, 0xbc, 0xaa, 0xe3, 0x52, - 0xcd, 0x81, 0x30, 0x4d, 0xb2, 0x71, 0xcb, 0x2d, 0xe0, 0xea, 0xba, 0xb4, - 0x10, 0x92, 0x4e, 0x2f, 0x9d, 0x63, 0x43, 0xf1, 0xf2, 0x42, 0x67, 0x04, - 0x22, 0x20, 0x38, 0x36, 0xc5, 0x67, 0x63, 0x88, 0xd5, 0xfa, 0x9e, 0x30, - 0xf7, 0x6d, 0x9e, 0x5b, 0x28, 0xd1, 0x6e, 0xe7, 0x46, 0x26, 0x29, 0x21, - 0x15, 0x91, 0xc8, 0x1a, 0x43, 0x15, 0xf0, 0xfb, 0xc3, 0xa3, 0x76, 0x7f, - 0x8b, 0x22, 0xc6, 0x6e, 0x96, 0x99, 0x2a, 0xe6, 0x17, 0x70, 0xf5, 0x92, - 0x34, 0x93, 0xfb, 0xa4, 0xa2, 0xbf, 0x4c, 0x4c, 0x5c, 0xc2, 0xd9, 0xb8, - 0x56, 0xad, 0x2b, 0x4b, 0x02, 0x52, 0x98, 0x51, 0xc3, 0x9f, 0x62, 0xb1, - 0x8a, 0x58, 0xa3, 0xf7, 0x10, 0x3b, 0x98, 0x5a, 0x15, 0x58, 0xdf, 0x0a, - 0x61, 0x45, 0x9d, 0x97, 0x19, 0xa6, 0x21, 0x1e, 0x27, 0xbc, 0x2c, 0x68, - 0xde, 0xdc, 0x84, 0x68, 0xb7, 0xec, 0x1e, 0x0b, 0xec, 0x06, 0xeb, 0xc3, - 0x6a, 0xe6, 0xc3, 0x32, 0x2f, 0x99, 0xce, 0x5f, 0x2c, 0x86, 0xd7, 0xef, - 0xe1, 0x8f, 0xd8, 0xc1, 0xfe, 0xda, 0xb6, 0x6e, 0xd0, 0xcb, 0x56, 0x1b, - 0xc5, 0xb2, 0x87, 0x27, 0x52, 0x90, 0x48, 0x52, 0x70, 0x8d, 0x49, 0x55, - 0xe7, 0x2b, 0x2a, 0xb4, 0xd7, 0x03, 0x6a, 0xfb, 0xd0, 0xe8, 0x47, 0x31, - 0x91, 0xb0, 0xfb, 0xa2, 0x17, 0xe9, 0x53, 0xa7, 0x7f, 0x10, 0x63, 0x01, - 0x5a, 0x94, 0x55, 0x2f, 0x64, 0x1d, 0x21, 0x7a, 0xc0, 0x9e, 0x03, 0xd3, - 0x2e, 0x93, 0x4b, 0x66, 0xb1, 0x7f, 0xab, 0x23, 0xba, 0xc3, 0x63, 0x4b, - 0xf0, 0x5b, 0x7a, 0x56, 0x4e, 0xb1, 0xe4, 0xaa, 0x28, 0x61, 0x6b, 0x6d, - 0x97, 0x10, 0x96, 0x61, 0xab, 0x20, 0x1c, 0xc7, 0xbd, 0xe6, 0x58, 0x26, - 0x22, 0x91, 0xd6, 0x71, 0x72, 0xcb, 0x50, 0x64, 0x78, 0x8f, 0x33, 0xc9, - 0xb9, 0xaa, 0x48, 0xad, 0x50, 0x2e, 0x11, 0xf5, 0x77, 0x9d, 0xb2, 0x77, - 0xf9, 0xb6, 0xeb, 0x58, 0xc8, 0x9d, 0x5d, 0xa3, 0xc3, 0x8c, 0x26, 0xfc, - 0xd6, 0x55, 0x22, 0xeb, 0x19, 0x9f, 0xa8, 0xb0, 0xe6, 0x73, 0xda, 0x9c, - 0x76, 0xe5, 0x95, 0x6d, 0x23, 0xe9, 0xaf, 0x43, 0xa7, 0x19, 0xa0, 0x22, - 0x40, 0x47, 0xa9, 0x37, 0xb8, 0x14, 0x0c, 0xcc, 0xd5, 0x08, 0x08, 0x58, - 0x2a, 0x63, 0xd7, 0x56, 0xee, 0x3e, 0xd6, 0x84, 0x59, 0x8a, 0xe1, 0xac, - 0xbb, 0xe7, 0x45, 0x6c, 0xd4, 0x4c, 0xb6, 0xc0, 0xa7, 0x74, 0xa1, 0x56, - 0x95, 0x6f, 0x64, 0x5a, 0x7d, 0xa3, 0xd5, 0x6e, 0xf1, 0x58, 0xac, 0x17, - 0xb1, 0x83, 0x7c, 0xf2, 0x28, 0xd5, 0x5f, 0x27, 0x89, 0x83, 0x31, 0x8c, - 0x06, 0x7a, 0xb4, 0x4a, 0xbd, 0x15, 0xed, 0xdb, 0x68, 0x68, 0x19, 0x12, - 0x91, 0x31, 0xcb, 0xfe, 0xf8, 0x3d, 0x5a, 0x54, 0x18, 0x08, 0x76, 0x3b, - 0xe8, 0x5a, 0x3a, 0x6b, 0x50, 0x63, 0x7c, 0xd1, 0x36, 0xad, 0xe0, 0x33, - 0x10, 0x5a, 0xd4, 0x40, 0xb4, 0xb4, 0x8d, 0xbc, 0xe9, 0x47, 0x68, 0x32, - 0xb9, 0xe2, 0xaf, 0x0e, 0xa2, 0x14, 0x77, 0x31, 0xbc, 0xac, 0x8c, 0x31, - 0x53, 0x82, 0x20, 0x83, 0x4c, 0xc2, 0x6d, 0xf1, 0xab, 0xba, 0x2f, 0x07, - 0x67, 0x4c, 0xdb, 0xda, 0x55, 0x17, 0x53, 0xe4, 0x6b, 0x27, 0xd3, 0x1e, - 0x85, 0x91, 0xe7, 0x7a, 0xa4, 0x1f, 0x5c, 0xbf, 0x19, 0xb5, 0xb2, 0x2d, - 0x93, 0x55, 0x80, 0xed, 0x60, 0xae, 0x1c, 0x0e, 0x64, 0xe7, 0xdc, 0x0a, - 0x82, 0x5e, 0x4d, 0x5c, 0x2b, 0x53, 0x65, 0x14, 0xa4, 0x3d, 0x2a, 0x0d, - 0x35, 0xc1, 0x59, 0x5f, 0xf6, 0xa3, 0xa5, 0xef, 0x0c, 0x3d, 0x84, 0xeb, - 0x4f, 0x17, 0x12, 0x74, 0x7c, 0x69, 0xe5, 0xd6, 0x2a, 0xe7, 0xfc, 0x00, - 0x31, 0x62, 0x8b, 0xf7, 0xa1, 0x23, 0x04, 0xb4, 0x57, 0xb4, 0x80, 0x19, - 0x59, 0x5d, 0x25, 0xa9, 0x33, 0x70, 0x81, 0xb1, 0xee, 0x41, 0xb2, 0xf6, - 0x7e, 0x16, 0xe5, 0x60, 0x0b, 0x54, 0xf5, 0x5f, 0xef, 0x3d, 0xf9, 0x7a, - 0x1c, 0xc1, 0xee, 0x7b, 0x9a, 0x7e, 0x59, 0x96, 0x59, 0xb8, 0x97, 0x39, - 0x4c, 0x82, 0x9f, 0xe0, 0xd0, 0x4b, 0x45, 0xa7, 0xdc, 0x3a, 0x66, 0xf2, - 0x98, 0x90, 0x7a, 0x8b, 0x60, 0xcb, 0xce, 0x3b, 0xc5, 0x27, 0x3e, 0x13, - 0xff, 0x61, 0x4f, 0xd3, 0xe8, 0x30, 0xa4, 0xb4, 0xe5, 0x34, 0xf5, 0x43, - 0x8a, 0x61, 0xdb, 0x28, 0x20, 0x38, 0x8c, 0xd0, 0x3d, 0xad, 0x7b, 0x76, - 0xe0, 0x86, 0xf3, 0x00, 0xed, 0xda, 0x5a, 0x58, 0x5f, 0x24, 0x1d, 0xd1, - 0x45, 0xe7, 0x6f, 0xac, 0x27, 0x34, 0xfa, 0xb7, 0xbe, 0x9a, 0x35, 0x5f, - 0x58, 0x54, 0x5e, 0xfa, 0xb2, 0x9b, 0xf9, 0xea, 0xfe, 0x84, 0x26, 0x11, - 0x7b, 0x3c, 0x91, 0xf9, 0x4d, 0x45, 0x61, 0x3b, 0xdf, 0xa3, 0x0b, 0x71, - 0x05, 0xf8, 0x36, 0xcc, 0xfc, 0x61, 0x86, 0x48, 0xaf, 0xcd, 0xdf, 0xf6, - 0xeb, 0xc6, 0x04, 0x86, 0x9c, 0x9b, 0x82, 0xf7, 0x9d, 0x6d, 0x62, 0x8b, - 0xc9, 0x5a, 0x49, 0xb8, 0xa4, 0xd9, 0xe3, 0x8c, 0x07, 0x69, 0xaa, 0x54, - 0x40, 0x1d, 0xc3, 0xc6, 0x1a, 0x97, 0xc5, 0x8d, 0x53, 0x06, 0xbc, 0xd0, - 0x8a, 0x0d, 0xc9, 0xc8, 0xd0, 0x94, 0xe6, 0x44, 0x97, 0x3e, 0x7a, 0xa7, - 0xd9, 0x7b, 0x4f, 0x66, 0xe0, 0x95, 0xc1, 0xa6, 0xe3, 0x19, 0x84, 0xbd, - 0xb2, 0x78, 0x90, 0xe2, 0x89, 0xb9, 0xe4, 0xa2, 0x1d, 0x18, 0x7c, 0xa3, - 0xda, 0xdc, 0x8f, 0xa0, 0x6e, 0x12, 0x7e, 0x86, 0x6b, 0x4c, 0xcb, 0xee, - 0x21, 0x80, 0x24, 0x9e, 0xa6, 0xae, 0x09, 0xe1, 0xaa, 0x56, 0xdb, 0xa0, - 0xc9, 0x34, 0x67, 0x09, 0x4f, 0x94, 0x43, 0xbc, 0xef, 0xfd, 0x41, 0x9e, - 0x9f, 0xa5, 0x4f, 0xa0, 0x95, 0x22, 0x6f, 0x72, 0xb0, 0x8e, 0xc7, 0xe9, - 0x28, 0x6e, 0x27, 0xaf, 0x48, 0x50, 0xda, 0xeb, 0xbd, 0xcc, 0xc7, 0x25, - 0xca, 0xa2, 0xf6, 0xbd, 0x6e, 0x00, 0x6a, 0xc7, 0xe7, 0x6b, 0xd9, 0x19, - 0x19, 0x7f, 0x01, 0xd4, 0xde, 0x68, 0xc3, 0xa8, 0x3b, 0x29, 0x61, 0x26, - 0x6c, 0xe5, 0xf6, 0xf8, 0x53, 0x02, 0x40, 0xbe, 0x42, 0xdd, 0x3e, 0x18, - 0x9f, 0xed, 0x5a, 0xec, 0xfb, 0x29, 0xf2, 0x93, 0xa4, 0x38, 0x6c, 0x95, - 0xc9, 0x3e, 0xe2, 0x42, 0x6a, 0x3a, 0x62, 0x88, 0x7a, 0x5d, 0x0f, 0xf8, - 0x16, 0x4e, 0x9a, 0x3f, 0x5e, 0xf2, 0x44, 0x14, 0xe9, 0x40, 0x4a, 0x5e, - 0x45, 0x9d, 0xdb, 0xa0, 0x28, 0x32, 0x99, 0xb4, 0x8c, 0xc1, 0xc1, 0x22, - 0x88, 0x8c, 0xbe, 0x5e, 0x74, 0x6a, 0xe7, 0xe7, 0x1f, 0x9d, 0xf9, 0x4d, - 0x32, 0x7d, 0x30, 0x25, 0x1a, 0xe2, 0x0c, 0x91, 0xb5, 0x22, 0x83, 0x42, - 0x44, 0xc6, 0xce, 0xc9, 0x4e, 0xbc, 0x6f, 0x6b, 0x16, 0xc0, 0xaa, 0x31, - 0x5a, 0x2c, 0xcd, 0x6e, 0xbc, 0x10, 0x8c, 0xd9, 0x6e, 0x9e, 0xd3, 0x10, - 0x9a, 0xdc, 0xa1, 0x4e, 0x99, 0xf8, 0xd7, 0xa7, 0x5a, 0x31, 0xf1, 0x26, - 0x56, 0x13, 0xd3, 0xc8, 0xe7, 0x63, 0x62, 0x97, 0xa7, 0x8d, 0x1f, 0x32, - 0x57, 0x25, 0xad, 0x6f, 0x0d, 0xc1, 0xee, 0x79, 0xc8, 0xf2, 0x80, 0x87, - 0x38, 0xf2, 0xfe, 0xc8, 0x9d, 0xb4, 0xeb, 0xda, 0x35, 0xa6, 0x75, 0xcc, - 0x33, 0x53, 0x15, 0x47, 0x23, 0xf5, 0xf9, 0x84, 0x9b, 0x88, 0x3a, 0xbd, - 0x3c, 0x90, 0x89, 0x52, 0x2e, 0xbd, 0x1b, 0x44, 0x3a, 0xe1, 0xe1, 0x28, - 0xe8, 0x16, 0x03, 0x2e, 0xfb, 0x06, 0x3b, 0xf6, 0x0d, 0xa6, 0x83, 0xe0, - 0x96, 0x9c, 0xdf, 0x41, 0x2e, 0x94, 0xe6, 0x2c, 0x56, 0x2f, 0x56, 0xdf, - 0x5d, 0x7c, 0xe5, 0x24, 0x33, 0xff, 0x90, 0x6c, 0xe7, 0x53, 0x77, 0x6b, - 0x3d, 0xe1, 0x20, 0xe3, 0x9d, 0x45, 0x50, 0x50, 0xcc, 0x30, 0xc9, 0x48, - 0x3a, 0x78, 0x01, 0x95, 0x72, 0x63, 0x4f, 0xbd, 0x5b, 0x97, 0xed, 0x92, - 0xc8, 0xc7, 0x24, 0xaa, 0x28, 0xba, 0x2a, 0x18, 0x09, 0x19, 0x0a, 0xb2, - 0x5f, 0x4c, 0xc8, 0xf6, 0xbe, 0xe9, 0xcf, 0xe8, 0x5d, 0x20, 0x17, 0xf8, - 0x6a, 0xd2, 0xdb, 0xc5, 0x1f, 0x15, 0x6f, 0x6c, 0x1f, 0xba, 0xb0, 0x2a, - 0xe5, 0x77, 0x4c, 0xa7, 0xf3, 0x81, 0x3b, 0x0d, 0x1a, 0x6c, 0x8b, 0x5d, - 0x5e, 0xe9, 0x4c, 0x8b, 0xb2, 0xca, 0xab, 0x20, 0x9e, 0x24, 0xd0, 0x12, - 0xd4, 0xb1, 0x91, 0xa2, 0x9e, 0x5d, 0x34, 0xff, 0x70, 0x76, 0x0c, 0xd1, - 0xfe, 0x2b, 0x72, 0x03, 0xf4, 0xae, 0x91, 0x75, 0x06, 0xbd, 0x67, 0x29, - 0x46, 0xaf, 0x08, 0xc9, 0x2a, 0xf5, 0x18, 0xc9, 0x43, 0x2b, 0xaf, 0x48, - 0x6a, 0xda, 0xc0, 0x7c, 0x89, 0xb3, 0xfc, 0x5d, 0x38, 0xd4, 0xa4, 0xff, - 0x7a, 0xf4, 0xa1, 0x9a, 0x7d, 0x91, 0x44, 0x55, 0x6f, 0x87, 0x20, 0x5c, - 0xf1, 0xfc, 0x90, 0x2c, 0xbd, 0x7a, 0x53, 0x5e, 0x39, 0x90, 0xfb, 0xb6, - 0xb2, 0xc6, 0x1e, 0x2d, 0x6e, 0xba, 0x27, 0x48, 0x6a, 0x4f, 0x8c, 0x56, - 0x82, 0xad, 0x2b, 0xfd, 0x19, 0xc0, 0x9e, 0x00, 0x92, 0xa5, 0xf9, 0xa5, - 0x43, 0x56, 0xeb, 0xfd, 0x20, 0x12, 0x03, 0x39, 0x6c, 0x1b, 0x05, 0x4f, - 0x5e, 0x89, 0x15, 0x46, 0xf4, 0x64, 0x71, 0x05, 0x8f, 0xc5, 0x1b, 0xf6, - 0x3c, 0xc8, 0x71, 0x91, 0x2f, 0x56, 0xa8, 0xaf, 0x78, 0x17, 0x3b, 0xc4, - 0x0b, 0x79, 0xea, 0xc7, 0xb9, 0xba, 0x30, 0x16, 0xdd, 0x23, 0xbd, 0x5a, - 0x3f, 0xb7, 0xb0, 0x4c, 0xf1, 0x9a, 0x79, 0x20, 0x17, 0x88, 0xe0, 0x4c, - 0x62, 0x52, 0xec, 0x2c, 0x4c, 0x6b, 0xcf, 0x02, 0x51, 0xee, 0x06, 0xe9, - 0xf8, 0x19, 0x62, 0xa4, 0xd7, 0x80, 0x09, 0x25, 0x66, 0x8e, 0x5e, 0xc8, - 0xa5, 0xbd, 0xed, 0xe9, 0xbf, 0x7a, 0xcc, 0xe7, 0xe1, 0x54, 0x42, 0x44, - 0xd9, 0x62, 0x13, 0xd6, 0x0d, 0x6f, 0x1e, 0x38, 0x68, 0xc8, 0xd2, 0xc7, - 0x2b, 0x71, 0x62, 0x8a, 0x9d, 0x6b, 0x71, 0xd2, 0xf4, 0x30, 0xcc, 0x0b, - 0x5a, 0xda, 0x74, 0x40, 0x0e, 0xba, 0x50, 0x2a, 0x91, 0xba, 0x75, 0x8f, - 0x36, 0x4b, 0x76, 0xfb, 0x6c, 0xcd, 0xea, 0x18, 0xff, 0x2e, 0x37, 0x8e, - 0x7e, 0xce, 0xe5, 0x29, 0x1b, 0xd5, 0x39, 0xe0, 0xb5, 0xa2, 0xa4, 0xac, - 0xd5, 0xe5, 0xb0, 0xb1, 0x6c, 0xe7, 0xb1, 0xcb, 0x88, 0x1d, 0x60, 0x6b, - 0x1b, 0x78, 0xe4, 0x3f, 0x91, 0x0d, 0xa5, 0x2c, 0x8e, 0xf6, 0x56, 0x95, - 0x31, 0x31, 0x7e, 0x73, 0xa4, 0x43, 0x2f, 0xa3, 0x4b, 0x85, 0x5b, 0x6b, - 0xc0, 0xad, 0xe3, 0x4d, 0x81, 0xf3, 0x26, 0x37, 0xf0, 0x8d, 0xb8, 0x68, - 0xc6, 0x66, 0x54, 0xe9, 0x97, 0x8c, 0x57, 0x81, 0x95, 0xae, 0xb4, 0x59, - 0x83, 0xa5, 0xbe, 0x58, 0x00, 0x29, 0xd3, 0x49, 0x68, 0x71, 0x64, 0x32, - 0x5f, 0x0b, 0xa4, 0x5b, 0x45, 0x16, 0xd6, 0x8d, 0xd5, 0x3c, 0x6d, 0x18, - 0x3b, 0xde, 0xe5, 0x76, 0x11, 0x1b, 0x24, 0x14, 0x33, 0x58, 0x1d, 0xb2, - 0xc7, 0x82, 0x17, 0x0a, 0x63, 0x7c, 0xbe, 0x15, 0x24, 0xb6, 0x81, 0x6b, - 0xae, 0x2f, 0x72, 0x31, 0xf3, 0x82, 0x98, 0x85, 0x4b, 0x74, 0xcf, 0x66, - 0xd4, 0x06, 0x73, 0x6c, 0xa5, 0x25, 0x7a, 0x1a, 0x34, 0xc4, 0xfe, 0x52, - 0x44, 0x23, 0xcd, 0x32, 0x77, 0xaa, 0xe4, 0x3a, 0x34, 0x4e, 0x18, 0x8e, - 0x24, 0xb5, 0x72, 0xe6, 0x1f, 0xd7, 0xa0, 0x22, 0x68, 0xb0, 0x04, 0xeb, - 0x94, 0x82, 0xce, 0x4c, 0x18, 0xa6, 0x7c, 0x7b, 0x28, 0xb2, 0xc0, 0xd6, - 0xbb, 0x9e, 0xaa, 0xb2, 0xdf, 0x16, 0x71, 0xd7, 0xb6, 0xf8, 0x63, 0x55, - 0x2c, 0x24, 0x40, 0x1d, 0x59, 0xad, 0x88, 0xfa, 0x3d, 0x4a, 0x18, 0x58, - 0x27, 0x2c, 0xe5, 0x19, 0xc4, 0x77, 0x3b, 0x0e, 0x4e, 0x3c, 0x2b, 0x50, - 0xfc, 0x1f, 0x4f, 0xf5, 0xac, 0x59, 0xf4, 0x50, 0xef, 0x37, 0xe2, 0x18, - 0xd3, 0x61, 0x84, 0x9b, 0xe9, 0x4d, 0x55, 0x4c, 0xd5, 0x08, 0x4a, 0x54, - 0xf3, 0xac, 0x82, 0x21, 0x40, 0x56, 0x84, 0xd2, 0x6b, 0xe8, 0xf4, 0x66, - 0xef, 0x52, 0x94, 0xdd, 0xc2, 0x86, 0xc1, 0xb9, 0xfb, 0x70, 0x26, 0x0a, - 0x0f, 0x00, 0x33, 0xd6, 0x90, 0x80, 0x35, 0x4e, 0xa9, 0x7e, 0xe7, 0x65, - 0xca, 0xdf, 0x52, 0xb8, 0x30, 0x2b, 0xd4, 0x07, 0x77, 0x35, 0x86, 0xe2, - 0x6d, 0x87, 0x0c, 0xe5, 0x00, 0xfd, 0xd5, 0x27, 0xb0, 0xf2, 0xb7, 0x16, - 0xb7, 0x0d, 0x33, 0xd5, 0x1a, 0x5d, 0x0c, 0x15, 0x2d, 0x2f, 0x66, 0x28, - 0xf5, 0xf6, 0x63, 0x77, 0x43, 0x6b, 0x71, 0x2e, 0x06, 0x5c, 0x15, 0x6f, - 0xe6, 0x2b, 0xf8, 0x08, 0xf0, 0x90, 0xd8, 0x51, 0x74, 0x03, 0xae, 0x64, - 0xf0, 0xba, 0x1b, 0x1b, 0xf6, 0x44, 0x69, 0x06, 0x0a, 0xab, 0x3c, 0xf0, - 0xf3, 0x98, 0xc0, 0xef, 0x51, 0xb5, 0x94, 0x31, 0xad, 0x66, 0x72, 0x92, - 0x0b, 0x45, 0xd4, 0xa1, 0x68, 0x5f, 0xd1, 0x1a, 0x17, 0x7c, 0x48, 0xba, - 0xfd, 0x0b, 0x02, 0x7e, 0x2d, 0x05, 0xe6, 0x65, 0x8e, 0x72, 0xca, 0x3a, - 0xd7, 0x13, 0xfb, 0xbd, 0x38, 0x75, 0x56, 0x57, 0x88, 0x66, 0x25, 0x81, - 0x20, 0x19, 0xe2, 0x01, 0xe4, 0x34, 0xe3, 0x5b, 0x27, 0xb2, 0x75, 0x5b, - 0x54, 0xd4, 0x8e, 0x2d, 0xb7, 0xb1, 0x62, 0xfd, 0xa4, 0x03, 0xe8, 0x3b, - 0x8e, 0xca, 0x00, 0xb2, 0x8d, 0xf9, 0x88, 0x88, 0xb4, 0x1d, 0xe0, 0x02, - 0x4b, 0x10, 0xa8, 0x5e, 0x00, 0xc4, 0x2f, 0xcf, 0xab, 0xb4, 0x9b, 0xa5, - 0x49, 0xe0, 0xe9, 0x4e, 0x09, 0xba, 0x2c, 0x03, 0xd4, 0x4d, 0xce, 0xc4, - 0xfb, 0xdf, 0xdc, 0x79, 0xb9, 0x60, 0x26, 0x88, 0x81, 0x36, 0x46, 0x3f, - 0x9e, 0x43, 0x51, 0xe1, 0xb1, 0x13, 0x53, 0xd7, 0x2a, 0xe2, 0x3c, 0x31, - 0x2a, 0xc7, 0x5c, 0x30, 0x86, 0x19, 0xa1, 0x95, 0x78, 0xcf, 0x94, 0x27, - 0xd8, 0x45, 0x4c, 0x54, 0x27, 0xb7, 0x7d, 0x09, 0xa2, 0x22, 0x21, 0x7d, - 0x99, 0x76, 0x68, 0xd8, 0xe4, 0x6a, 0xaa, 0x83, 0x90, 0x4b, 0x6d, 0x54, - 0xdb, 0xa5, 0x3c, 0xbf, 0x66, 0xff, 0xa4, 0x2d, 0x97, 0x96, 0xb0, 0xaa, - 0x01, 0x6c, 0x2e, 0x18, 0x8c, 0x73, 0x66, 0x1e, 0x69, 0x2e, 0x2e, 0x41, - 0xe4, 0x4b, 0x49, 0x39, 0xc1, 0x04, 0x61, 0xc0, 0xfc, 0x6b, 0xbe, 0x50, - 0x1d, 0xa5, 0xb6, 0x4e, 0x7b, 0x89, 0xef, 0xda, 0xeb, 0xed, 0x22, 0xeb, - 0xc1, 0x35, 0x32, 0x9a, 0x75, 0xfa, 0xb2, 0xf2, 0x69, 0x90, 0xdb, 0x60, - 0x5d, 0x5f, 0x83, 0x26, 0x2b, 0x84, 0x2e, 0x62, 0xa0, 0x54, 0x0f, 0xe4, - 0x89, 0xc0, 0x28, 0xb1, 0x8d, 0xeb, 0xad, 0xc8, 0x30, 0xf3, 0xc9, 0x39, - 0x69, 0xfc, 0x45, 0x02, 0xdb, 0x56, 0xa1, 0x9f, 0x28, 0x40, 0xa3, 0xac, - 0xff, 0xeb, 0x26, 0x37, 0x6a, 0x06, 0x9a, 0x7a, 0x0e, 0xf1, 0xd2, 0x31, - 0x27, 0xaa, 0x79, 0x2f, 0x00, 0xdf, 0x1f, 0xc4, 0x21, 0x7c, 0x58, 0xc1, - 0x99, 0xda, 0xa0, 0x13, 0x7a, 0x21, 0x4d, 0x7b, 0x46, 0xee, 0x2e, 0x58, - 0xb2, 0x99, 0x19, 0x5b, 0x8d, 0x7b, 0xb6, 0xa6, 0xe8, 0xf8, 0x13, 0xb4, - 0x10, 0xa9, 0xcf, 0x60, 0x8b, 0x38, 0xfd, 0x98, 0x2d, 0x67, 0xfb, 0x0f, - 0x2e, 0x32, 0xbc, 0xf8, 0x62, 0x15, 0x1c, 0xaf, 0x2b, 0x2a, 0x09, 0x10, - 0x7d, 0x8a, 0x7e, 0xc1, 0xb9, 0x66, 0x5d, 0x67, 0x23, 0x98, 0x38, 0x83, - 0xc8, 0x06, 0x20, 0xc2, 0x54, 0x19, 0x07, 0x39, 0x29, 0x71, 0xed, 0x1f, - 0xa3, 0x65, 0xa6, 0x46, 0xed, 0x34, 0x83, 0x82, 0x4b, 0x51, 0xf4, 0x1c, - 0x6a, 0xad, 0x98, 0x0f, 0xb6, 0xe3, 0x3d, 0xfe, 0x90, 0x6a, 0x5d, 0xbf, - 0x2a, 0x93, 0xf4, 0xda, 0x99, 0x3c, 0x23, 0x74, 0xb7, 0x5c, 0xd1, 0x08, - 0x20, 0x19, 0x2f, 0xa1, 0x5f, 0x9e, 0x62, 0x24, 0x2c, 0x83, 0x2d, 0xd8, - 0x5b, 0x28, 0xdc, 0x72, 0x52, 0x23, 0xab, 0x06, 0xb2, 0x0a, 0xa1, 0x11, - 0x46, 0x65, 0xec, 0x62, 0xe3, 0xba, 0x96, 0xd4, 0x19, 0x3f, 0x7c, 0xb6, - 0x86, 0x67, 0xc4, 0x72, 0x48, 0xfd, 0xf7, 0xbf, 0x9a, 0xb5, 0xaf, 0xf6, - 0x85, 0x8b, 0x7c, 0x07, 0xbd, 0xda, 0xdf, 0x54, 0xcf, 0x71, 0x2f, 0x3d, - 0x13, 0xe5, 0x82, 0x14, 0xa0, 0xf6, 0xf9, 0x91, 0xbe, 0xd5, 0xcd, 0x65, - 0x2d, 0x51, 0xae, 0xda, 0x94, 0x8e, 0x87, 0x60, 0x85, 0x7b, 0x4c, 0x90, - 0x84, 0x7f, 0x72, 0x82, 0x95, 0xb3, 0xed, 0x73, 0x03, 0xe2, 0x0f, 0x06, - 0x8f, 0xa9, 0x36, 0x10, 0x7e, 0x6a, 0x8a, 0xc4, 0x37, 0xa5, 0x46, 0x8c, - 0x5d, 0xa6, 0xe7, 0x02, 0x7a, 0xd4, 0xc0, 0x62, 0xca, 0x70, 0x53, 0x19, - 0x5d, 0x78, 0xab, 0x6c, 0x4e, 0xe8, 0xd9, 0x80, 0x2f, 0x16, 0x1d, 0x97, - 0x03, 0x1d, 0x66, 0xb0, 0x19, 0xd7, 0x7e, 0xf6, 0xa2, 0xaf, 0x81, 0x7c, - 0xdf, 0xd2, 0x57, 0xb2, 0x8c, 0x42, 0x4d, 0x00, 0x42, 0x8a, 0xaa, 0xbd, - 0x38, 0x8d, 0x9a, 0x45, 0xf9, 0xcc, 0x71, 0xa8, 0x4c, 0x72, 0xc2, 0x8e, - 0xd6, 0xdb, 0xb5, 0xed, 0xf5, 0x6c, 0x08, 0x5b, 0xa6, 0x23, 0xbf, 0x6e, - 0x52, 0x2d, 0x36, 0xed, 0xc5, 0xf4, 0x61, 0x51, 0x63, 0x28, 0x21, 0x04, - 0xb6, 0x6c, 0x95, 0x50, 0x7d, 0x1d, 0x11, 0xb3, 0x71, 0x83, 0x38, 0x86, - 0x86, 0xf2, 0x7f, 0x6c, 0x88, 0xf0, 0x9a, 0x06, 0x6e, 0x5d, 0x2b, 0x87, - 0x13, 0x32, 0x4b, 0x03, 0xbb, 0x2a, 0xc8, 0x82, 0x75, 0x7a, 0xfb, 0x1e, - 0x6f, 0x44, 0x7d, 0xf0, 0x78, 0x5a, 0x34, 0xb0, 0x28, 0x1d, 0xf5, 0xc0, - 0x09, 0x40, 0x40, 0x11, 0x96, 0xd7, 0xbb, 0x5d, 0x71, 0x9d, 0x8e, 0x77, - 0x06, 0xbd, 0xb6, 0xd8, 0xfe, 0x41, 0x6c, 0xb7, 0xeb, 0x54, 0xd8, 0xe3, - 0x21, 0x65, 0xe0, 0x32, 0x2e, 0xd5, 0xf2, 0xb7, 0x9c, 0xd8, 0x75, 0xe1, - 0x14, 0xb3, 0x21, 0x9d, 0xd5, 0x1c, 0x9c, 0x31, 0x9e, 0xa7, 0xd0, 0x9f, - 0x50, 0x40, 0xbf, 0x5a, 0xff, 0xb3, 0xd1, 0x8d, 0xdb, 0x04, 0x67, 0x2a, - 0x5c, 0xbc, 0x9e, 0x7b, 0x3b, 0xb6, 0xba, 0xc5, 0x69, 0x40, 0xdd, 0x23, - 0x28, 0x42, 0x48, 0x75, 0x0d, 0xe2, 0x61, 0x2f, 0x79, 0xe5, 0x72, 0x01, - 0x17, 0x81, 0xfd, 0xbe, 0x32, 0xa4, 0xc5, 0xa0, 0x6d, 0x31, 0xa9, 0x05, - 0x7d, 0x25, 0xff, 0xd6, 0xd6, 0xe2, 0x02, 0xd3, 0x7e, 0x6e, 0xbf, 0x8a, - 0x7b, 0x43, 0x5b, 0x21, 0xdc, 0xb5, 0x40, 0x1e, 0xf5, 0x16, 0x4c, 0xde, - 0x99, 0x49, 0x3f, 0x1f, 0x61, 0xa8, 0x60, 0xa2, 0x55, 0x2a, 0xf8, 0x69, - 0x8c, 0xe6, 0xbf, 0x62, 0x0c, 0x90, 0x35, 0xfe, 0x67, 0xfd, 0x58, 0xd2, - 0x88, 0xb3, 0xf3, 0xa8, 0x96, 0x31, 0x4d, 0x81, 0xa7, 0xb2, 0xfa, 0xfd, - 0x0c, 0x74, 0xa4, 0xd7, 0xe2, 0x58, 0xb8, 0xff, 0x52, 0x6b, 0x69, 0xa6, - 0x50, 0x2b, 0x91, 0x80, 0x4a, 0x92, 0x2a, 0xc4, 0x66, 0x13, 0xb1, 0x6e, - 0x7a, 0xbb, 0xd3, 0xf8, 0xfc, 0x1e, 0xfa, 0x49, 0xf8, 0xcf, 0x85, 0x65, - 0xb9, 0x9f, 0xd4, 0x59, 0x07, 0xfb, 0x48, 0x09, 0xd2, 0x28, 0x3e, 0xd9, - 0x9b, 0x35, 0x57, 0xfd, 0x68, 0x8a, 0xd9, 0x7b, 0x84, 0x5f, 0x8b, 0xba, - 0x60, 0xb8, 0x98, 0xd2, 0x83, 0x1d, 0x35, 0xf8, 0x1f, 0xc7, 0x05, 0x47, - 0x9f, 0x4f, 0x08, 0xca, 0xa3, 0x56, 0xb3, 0x47, 0x2b, 0xad, 0x8d, 0xd8, - 0x7a, 0x78, 0xe5, 0x5b, 0x06, 0x6c, 0xc7, 0x90, 0xdf, 0x02, 0xea, 0xd6, - 0x9c, 0x1f, 0x60, 0xc5, 0x3a, 0x67, 0xd3, 0x77, 0xcb, 0x49, 0x58, 0x0e, - 0x8a, 0xda, 0x62, 0xf3, 0xd2, 0xb6, 0x22, 0x9b, 0x5f, 0x48, 0x4d, 0x59, - 0x78, 0x11, 0x6f, 0x51, 0xc2, 0x2d, 0x8a, 0xb1, 0xb3, 0x50, 0xce, 0x4f, - 0x9a, 0xd1, 0x1c, 0x31, 0x8c, 0xb1, 0x6d, 0xed, 0x9d, 0x58, 0x3d, 0xba, - 0x57, 0xba, 0x07, 0xf6, 0x51, 0x1e, 0xb6, 0xd0, 0xec, 0xb1, 0xcb, 0xfd, - 0x0f, 0xbf, 0x99, 0x08, 0xb2, 0x33, 0x8c, 0x18, 0x33, 0x03, 0x3b, 0x8f, - 0x57, 0x2e, 0xcd, 0x6d, 0xba, 0xb3, 0x38, 0xef, 0xe1, 0x50, 0xdd, 0xae, - 0xd1, 0x28, 0xa5, 0xae, 0x43, 0xc4, 0xb0, 0x16, 0x59, 0x68, 0xdd, 0xdd, - 0xfb, 0x37, 0x62, 0x62, 0x45, 0x51, 0x08, 0xc9, 0x17, 0xc5, 0x2d, 0x8f, - 0x96, 0xe7, 0x76, 0x12, 0x86, 0x67, 0xc8, 0x90, 0x21, 0xb2, 0x07, 0x70, - 0xdc, 0x76, 0x45, 0x98, 0x3b, 0x1f, 0x07, 0xb8, 0x68, 0xbc, 0x1a, 0x6d, - 0xb5, 0xaa, 0x46, 0xb3, 0xf7, 0xdb, 0xf4, 0x92, 0x69, 0x51, 0xcd, 0x82, - 0xe0, 0x78, 0x07, 0x71, 0x4f, 0x79, 0x7c, 0xca, 0x36, 0x91, 0xc9, 0x7d, - 0x39, 0x60, 0xa8, 0x6b, 0xf0, 0x68, 0xb7, 0xdd, 0x04, 0x12, 0x3f, 0xbf, - 0x09, 0x48, 0x3b, 0x5b, 0xfe, 0x25, 0x75, 0x23, 0x02, 0xe4, 0xb9, 0x57, - 0xd4, 0x2a, 0x90, 0x62, 0x4c, 0xcb, 0x8d, 0xd7, 0x63, 0xfe, 0x50, 0x96, - 0xd1, 0x1c, 0x73, 0x8a, 0x21, 0x6b, 0x72, 0x13, 0xa3, 0x32, 0x45, 0xed, - 0x67, 0xf9, 0xcc, 0x5e, 0x13, 0xee, 0x80, 0x20, 0xf3, 0x35, 0xb5, 0x89, - 0x5d, 0x99, 0x5e, 0x40, 0x0a, 0xb7, 0x55, 0xa6, 0xe7, 0xfd, 0x7c, 0x4d, - 0x49, 0xcf, 0xb0, 0xc6, 0xa7, 0x29, 0x3f, 0xb0, 0xd3, 0xee, 0x42, 0x37, - 0xc5, 0xdf, 0x31, 0x37, 0x8a, 0xf7, 0x2a, 0xfd, 0xbb, 0x00, 0x01, 0xab, - 0x63, 0x08, 0x33, 0x26, 0x27, 0x9c, 0x30, 0x84, 0x2e, 0x2c, 0x9c, 0xa8, - 0x4e, 0xae, 0x33, 0x12, 0xee, 0x62, 0x8f, 0x9f, 0x31, 0xf9, 0x07, 0xec, - 0x41, 0x93, 0xe8, 0x75, 0xfe, 0x23, 0x64, 0xe1, 0xa8, 0xfd, 0xfa, 0xbf, - 0xd2, 0xd2, 0x13, 0xa2, 0xc7, 0x0c, 0x82, 0x59, 0xd4, 0x33, 0xc4, 0xc6, - 0x71, 0xf9, 0x20, 0x0e, 0x4c, 0xb2, 0xeb, 0x26, 0x0c, 0x1b, 0x25, 0x01, - 0xab, 0x49, 0xa0, 0xc5, 0x43, 0x15, 0x1c, 0xc7, 0x10, 0x7e, 0x55, 0x3d, - 0x77, 0x9c, 0x0c, 0xa3, 0x54, 0x31, 0x4b, 0xc4, 0x6a, 0xa8, 0x35, 0x97, - 0xce, 0x67, 0xa4, 0x87, 0xe9, 0xf4, 0xd8, 0xf7, 0x89, 0x2a, 0x4f, 0x58, - 0x9b, 0xe0, 0xf7, 0x74, 0xd8, 0x85, 0x43, 0xe8, 0xd3, 0xa0, 0xae, 0x23, - 0x8f, 0x4d, 0x17, 0x85, 0x6c, 0x31, 0xdb, 0x42, 0x9d, 0xa7, 0x52, 0xbf, - 0xe0, 0x4f, 0xfa, 0xd9, 0xdb, 0xd2, 0x22, 0xdb, 0x99, 0x65, 0xc1, 0x88, - 0xb0, 0x8c, 0x33, 0x70, 0x9f, 0xfa, 0xda, 0xcf, 0x5b, 0xce, 0xe0, 0xcb, - 0xff, 0x00, 0x33, 0x61, 0x68, 0x2b, 0x29, 0x72, 0xd8, 0xe7, 0xb3, 0xea, - 0xd7, 0x5e, 0x66, 0x6a, 0xba, 0xe5, 0xa4, 0x0e, 0xc2, 0x31, 0xd7, 0x24, - 0x38, 0x7c, 0xfc, 0xb9, 0xc5, 0x91, 0xac, 0x8a, 0x13, 0x72, 0xe9, 0x7c, - 0x6c, 0x93, 0xd3, 0xa9, 0x0f, 0xd8, 0x13, 0xb8, 0x92, 0x6e, 0xbb, 0x69, - 0x13, 0x18, 0x04, 0x44, 0xd6, 0x12, 0x01, 0x7e, 0xe5, 0xb0, 0xc3, 0xf9, - 0x74, 0x2b, 0x87, 0x5a, 0x84, 0x06, 0xaf, 0xfa, 0xc7, 0x42, 0x79, 0x07, - 0x3d, 0xaf, 0x25, 0xa5, 0x97, 0x60, 0x5e, 0x0a, 0x27, 0x08, 0x5b, 0x9c, - 0x02, 0x10, 0x55, 0x4f, 0xf3, 0xc5, 0xa6, 0x9b, 0x47, 0x85, 0x0b, 0x35, - 0xa9, 0xb0, 0x56, 0xa5, 0xa7, 0x08, 0x67, 0x21, 0x1c, 0xa4, 0x96, 0xc2, - 0xdc, 0x43, 0x21, 0x2e, 0xba, 0x9c, 0xaa, 0x13, 0xf8, 0x87, 0xa7, 0x43, - 0x40, 0x2d, 0xa3, 0x0b, 0x59, 0x05, 0x2d, 0x88, 0x5b, 0x63, 0xcd, 0x7a, - 0xa2, 0xe4, 0xd0, 0xe5, 0x4d, 0x78, 0xc4, 0xc1, 0xe3, 0x50, 0x0b, 0xfe, - 0x3b, 0x06, 0xeb, 0xec, 0xb2, 0x7e, 0x76, 0x55, 0x67, 0x98, 0x40, 0x61, - 0x97, 0x1c, 0xac, 0xec, 0xc9, 0x63, 0x5b, 0x4d, 0x2c, 0x26, 0xa4, 0x26, - 0x16, 0x98, 0x70, 0x9b, 0x4b, 0xd8, 0x11, 0x2e, 0x89, 0x8c, 0x5f, 0x22, - 0xf2, 0xc2, 0x56, 0x33, 0x9e, 0x35, 0x4c, 0xda, 0x9e, 0xdb, 0xbb, 0x10, - 0xa1, 0x9a, 0x99, 0xf3, 0x10, 0x54, 0x4c, 0xf8, 0xc3, 0x42, 0xee, 0x5e, - 0x6b, 0xcd, 0x5c, 0xb2, 0xc4, 0x61, 0xa6, 0x68, 0x70, 0xd5, 0x31, 0x57, - 0x43, 0x34, 0xcf, 0x1d, 0x42, 0x27, 0x76, 0x66, 0xf0, 0xdd, 0xe2, 0x41, - 0x48, 0x7e, 0xab, 0xda, 0xb0, 0xa9, 0x76, 0xfd, 0xff, 0xa8, 0x81, 0xc3, - 0x92, 0x87, 0x66, 0x9f, 0x5f, 0x12, 0x44, 0x90, 0x3a, 0x9f, 0x19, 0x81, - 0x21, 0x72, 0x03, 0xfc, 0x25, 0x61, 0x33, 0x41, 0xbe, 0x1f, 0xd5, 0xe3, - 0xa3, 0x9a, 0x25, 0x48, 0x27, 0xbb, 0xd4, 0x60, 0x16, 0x90, 0x5d, 0x63, - 0x20, 0xcd, 0x91, 0x9f, 0x87, 0x5f, 0xbb, 0xc7, 0x3c, 0x30, 0xc5, 0x30, - 0x33, 0xcd, 0xb4, 0xdf, 0xa0, 0x6c, 0x1e, 0x1d, 0x78, 0xca, 0x82, 0x2e, - 0x3f, 0x84, 0x2f, 0xe7, 0x50, 0x2e, 0x5d, 0xd3, 0x45, 0x36, 0x7d, 0x3e, - 0xcf, 0xff, 0x44, 0x66, 0x74, 0xe2, 0x79, 0xe5, 0xe0, 0xfd, 0x22, 0x30, - 0x28, 0xbd, 0xe4, 0x80, 0xd8, 0x14, 0xde, 0x8a, 0x8d, 0xa1, 0xac, 0xc0, - 0x78, 0xb3, 0x5b, 0x65, 0xaa, 0x6c, 0x0c, 0x25, 0x8b, 0x9b, 0xcc, 0xad, - 0x56, 0x72, 0xa5, 0xbd, 0xf9, 0xa9, 0x4f, 0x78, 0x0e, 0xfe, 0x89, 0xfd, - 0xea, 0x75, 0x0c, 0x48, 0x80, 0xbc, 0xe9, 0x19, 0x69, 0x82, 0xe1, 0x49, - 0x4e, 0xe2, 0xb6, 0x0d, 0x6b, 0xba, 0x90, 0x98, 0x7d, 0xfe, 0x31, 0x1c, - 0x7c, 0x2e, 0x64, 0x94, 0x6f, 0x79, 0xda, 0x8e, 0x3b, 0x77, 0x70, 0x98, - 0x74, 0x31, 0xf9, 0x47, 0x33, 0xde, 0x6e, 0xcb, 0x59, 0xb5, 0x9f, 0x32, - 0xbe, 0xd2, 0x81, 0x24, 0xdb, 0xe5, 0xb7, 0x8d, 0x94, 0x54, 0xc0, 0x7e, - 0x34, 0x7e, 0x1b, 0xa3, 0x52, 0xb5, 0x73, 0xb4, 0x17, 0x2d, 0xc5, 0x29, - 0x2e, 0x4e, 0x4b, 0x41, 0xfa, 0xa3, 0x49, 0xc6, 0xe2, 0x98, 0xda, 0xef, - 0x16, 0x27, 0x43, 0x34, 0x39, 0xbd, 0x6d, 0x35, 0xef, 0x35, 0x70, 0xf1, - 0x04, 0xe7, 0x86, 0x4f, 0x7c, 0x10, 0x01, 0xc3, 0x0b, 0xff, 0x91, 0x27, - 0x1c, 0xe0, 0xc4, 0x2e, 0x55, 0x3c, 0x58, 0x6e, 0x21, 0xb1, 0x0a, 0x17, - 0x12, 0x59, 0xf6, 0xc9, 0x8d, 0xba, 0x1a, 0x53, 0x3f, 0x88, 0xd9, 0xb7, - 0xf4, 0xda, 0x8c, 0xc3, 0xe1, 0x42, 0x01, 0x1d, 0xde, 0x9b, 0xc0, 0xdc, - 0xb0, 0x90, 0xb7, 0xdd, 0x71, 0x47, 0x67, 0xe9, 0x42, 0x19, 0x94, 0xe2, - 0x63, 0xc3, 0x4f, 0xb6, 0xa8, 0xce, 0xe9, 0x3c, 0x41, 0x43, 0x6b, 0x65, - 0x70, 0xef, 0xfb, 0x6d, 0xd2, 0x9d, 0x7c, 0x9d, 0xe3, 0x80, 0x53, 0xfc, - 0x4d, 0xc1, 0x2a, 0x24, 0x54, 0xad, 0xeb, 0x46, 0xa4, 0x48, 0x4e, 0xf2, - 0x3c, 0x0f, 0xe4, 0xbe, 0x26, 0xb0, 0x74, 0x81, 0x1f, 0x74, 0xe0, 0xf6, - 0x03, 0x9b, 0x5d, 0xaa, 0x6e, 0x8b, 0xa2, 0x44, 0xd4, 0xf9, 0x0d, 0xab, - 0xe8, 0x79, 0xdb, 0x1a, 0xbf, 0xfb, 0xab, 0x3c, 0x90, 0x72, 0xd0, 0x4a, - 0x48, 0xb5, 0xfb, 0x92, 0x5d, 0xb8, 0xbf, 0x4d, 0x0f, 0x31, 0xe5, 0x06, - 0x10, 0xa8, 0xde, 0x50, 0x87, 0x3c, 0xe3, 0x98, 0xa1, 0x10, 0xb1, 0xf8, - 0xbf, 0xa4, 0xa9, 0x47, 0x0f, 0xca, 0xc8, 0x74, 0x97, 0xac, 0x3c, 0xd1, - 0x38, 0xe8, 0xed, 0xe0, 0xbc, 0x36, 0x4e, 0x63, 0x73, 0x2c, 0x09, 0xdc, - 0xb4, 0xa1, 0x08, 0x5a, 0xf0, 0x77, 0x51, 0x2c, 0xce, 0x5d, 0xc1, 0x96, - 0x55, 0xcb, 0x19, 0x38, 0xcc, 0x4f, 0xad, 0x66, 0xa4, 0x4f, 0x76, 0x71, - 0xd3, 0xa8, 0xb3, 0xfc, 0xfa, 0x1b, 0x2a, 0x45, 0x01, 0xc4, 0x48, 0xba, - 0x54, 0xd7, 0x5c, 0xa6, 0x4d, 0xa3, 0x04, 0xac, 0xff, 0xae, 0x08, 0xa0, - 0xf1, 0xb8, 0xa1, 0xbb, 0xae, 0x4e, 0x10, 0xd2, 0x5d, 0x97, 0x27, 0x38, - 0x24, 0x6c, 0x33, 0xab, 0x32, 0x1c, 0x49, 0x03, 0xab, 0x7d, 0x2a, 0xa8, - 0xda, 0x25, 0x78, 0x1a, 0xd1, 0x35, 0xb8, 0x9a, 0x95, 0x12, 0xeb, 0xf0, - 0x4a, 0x3d, 0x76, 0xcb, 0x73, 0x1d, 0x9f, 0x76, 0xd3, 0xcf, 0xaa, 0xbb, - 0xff, 0x62, 0x5a, 0x01, 0xb2, 0xa9, 0x22, 0x2f, 0x29, 0xc0, 0x84, 0xdc, - 0x41, 0xd9, 0x33, 0x06, 0x64, 0x98, 0x48, 0xc8, 0xe3, 0x9a, 0x36, 0x12, - 0xd5, 0x45, 0x08, 0x5e, 0x2a, 0x5b, 0xc3, 0x70, 0xb2, 0x3c, 0x3b, 0xd3, - 0xc9, 0x63, 0x29, 0x68, 0x05, 0xa6, 0xbd, 0xb9, 0xd5, 0x7a, 0xf8, 0xb6, - 0x26, 0xd7, 0x67, 0x7b, 0x4c, 0x1f, 0x93, 0x1a, 0xc0, 0xdd, 0x3c, 0xc6, - 0xca, 0xb7, 0x55, 0xb0, 0x59, 0x97, 0x31, 0xba, 0x0a, 0x8e, 0x22, 0xf7, - 0xc3, 0xe6, 0xb4, 0x74, 0xd5, 0x33, 0x55, 0xfd, 0xda, 0x40, 0xc4, 0x3b, - 0x42, 0x6e, 0x02, 0x07, 0xa7, 0x70, 0x21, 0x03, 0x0b, 0x8a, 0x06, 0x8f, - 0x1c, 0xb4, 0x1e, 0x08, 0xe7, 0x22, 0x04, 0x3e, 0xe2, 0x49, 0x4b, 0x10, - 0x8c, 0x8a, 0xdc, 0x34, 0xc0, 0x07, 0x02, 0x10, 0xc4, 0xf8, 0xf0, 0x27, - 0xc7, 0xf5, 0x08, 0x5b, 0x8c, 0x56, 0x54, 0xe6, 0x4c, 0x02, 0x61, 0xa9, - 0x24, 0x92, 0x37, 0x06, 0x2a, 0x8b, 0x15, 0xb3, 0x22, 0xdf, 0x3a, 0x60, - 0xe5, 0x73, 0x8d, 0x47, 0xb3, 0x77, 0x30, 0xbb, 0x72, 0xa6, 0xcb, 0xfd, - 0x18, 0xdf, 0xbe, 0x99, 0x9f, 0x62, 0x71, 0xea, 0xc6, 0x26, 0xa1, 0x7e, - 0xda, 0xd9, 0xd9, 0x7b, 0x88, 0x88, 0xfe, 0x26, 0xa8, 0x84, 0x33, 0x33, - 0x27, 0x99, 0xe3, 0x4d, 0x2d, 0x25, 0xf6, 0x68, 0xf5, 0xe2, 0xc8, 0x5b, - 0x8a, 0xd8, 0x7f, 0xe4, 0x44, 0x81, 0xce, 0xd7, 0xe1, 0x9f, 0xff, 0xd8, - 0x7f, 0x41, 0x20, 0x62, 0x38, 0xc5, 0x6d, 0x43, 0xa5, 0xdc, 0x62, 0xb0, - 0x10, 0xbe, 0x6c, 0xe3, 0x9e, 0x42, 0x64, 0x33, 0x2c, 0xd7, 0xd2, 0x83, - 0x0e, 0xf5, 0x05, 0x94, 0x0b, 0xbf, 0xa2, 0x26, 0x56, 0x96, 0x69, 0x1f, - 0x1d, 0x46, 0x5b, 0xbb, 0x47, 0xb6, 0xce, 0x57, 0x5a, 0x43, 0xd7, 0xfa, - 0xe0, 0xfe, 0xa3, 0x87, 0x9f, 0xe4, 0xcc, 0xdb, 0x36, 0x10, 0x69, 0x0b, - 0xdb, 0x09, 0x2f, 0xdb, 0x9b, 0x9b, 0xb2, 0x76, 0xed, 0x35, 0xcd, 0x64, - 0xf3, 0x85, 0xda, 0x89, 0xee, 0x78, 0x3d, 0x73, 0x5f, 0x16, 0x22, 0xad, - 0x0b, 0x40, 0xef, 0x7d, 0x70, 0x13, 0xa6, 0x82, 0x07, 0x3c, 0x73, 0xf1, - 0xa6, 0xde, 0x88, 0xe1, 0xa8, 0xd6, 0x12, 0x03, 0x30, 0x8f, 0xf9, 0x2f, - 0x08, 0x04, 0x84, 0xe1, 0xd6, 0x3e, 0xe6, 0x28, 0x4e, 0xae, 0x00, 0x39, - 0x60, 0xe2, 0x3a, 0x4f, 0x2c, 0x36, 0xe7, 0x0d, 0x41, 0xe3, 0xb4, 0x6d, - 0x91, 0xd8, 0x8d, 0x30, 0x3d, 0xeb, 0xa6, 0xfa, 0x26, 0xd0, 0x97, 0x76, - 0xd7, 0xe9, 0x0b, 0x50, 0x18, 0x2b, 0xa1, 0x84, 0x1f, 0x56, 0x90, 0x93, - 0x3f, 0x30, 0x7a, 0xe8, 0x60, 0x44, 0x06, 0x09, 0xb7, 0x2e, 0xaf, 0x9d, - 0xc9, 0x22, 0xda, 0x71, 0xa5, 0xa1, 0xcd, 0xf3, 0xfa, 0x98, 0xda, 0x62, - 0xe0, 0x34, 0xa8, 0xc8, 0x1a, 0x17, 0x28, 0xa1, 0x7b, 0x76, 0xe4, 0x1d, - 0x38, 0xba, 0xe5, 0x3b, 0x10, 0xc4, 0xbc, 0xbc, 0x7d, 0x6c, 0xe3, 0xf8, - 0x38, 0x41, 0xa8, 0xa3, 0x41, 0x3d, 0x3a, 0x70, 0x31, 0x80, 0x26, 0xa0, - 0x3f, 0xda, 0xf1, 0x7d, 0xb5, 0x47, 0x6d, 0x3b, 0x46, 0xc1, 0xfe, 0x9b, - 0x70, 0x4a, 0xe1, 0xe2, 0xe3, 0xfb, 0x6b, 0xfc, 0x32, 0xff, 0x04, 0xb6, - 0x5b, 0xc7, 0x2e, 0x55, 0xf2, 0x11, 0x0a, 0xbe, 0xe3, 0x7b, 0xdb, 0xc0, - 0x60, 0x0f, 0x5a, 0x11, 0x29, 0xc0, 0xf8, 0xad, 0xf9, 0x64, 0x19, 0xac, - 0xc8, 0x97, 0xab, 0xb1, 0xcb, 0x75, 0x85, 0x28, 0x44, 0xb3, 0x95, 0xfb, - 0x2c, 0x99, 0xaf, 0x93, 0x36, 0x9b, 0xf8, 0x4d, 0xaa, 0xc4, 0xae, 0x6c, - 0xb1, 0x2e, 0x40, 0x5a, 0xf2, 0xbf, 0xec, 0xff, 0x47, 0x39, 0x0d, 0x21, - 0xa2, 0x11, 0xc6, 0xa1, 0xc9, 0x28, 0x36, 0x2a, 0x12, 0x73, 0x4f, 0x7d, - 0x9e, 0x70, 0x5f, 0x8c, 0xe4, 0xbe, 0x67, 0xc9, 0x3a, 0xdf, 0x72, 0x79, - 0x75, 0x2b, 0x8d, 0xbc, 0xbc, 0xa4, 0xf0, 0x50, 0x58, 0x73, 0x17, 0x4e, - 0xa1, 0xfa, 0x3c, 0x29, 0xcd, 0xc1, 0xf0, 0x2f, 0x9f, 0xde, 0x6b, 0x09, - 0x5a, 0x0c, 0x0c, 0x77, 0x5d, 0x92, 0xa7, 0xf7, 0xcf, 0x89, 0x0e, 0x58, - 0xc4, 0xd9, 0x27, 0x4f, 0x92, 0xf0, 0x27, 0x42, 0x1f, 0x47, 0x3e, 0xc4, - 0x06, 0x98, 0x5b, 0xb5, 0xac, 0x83, 0xf0, 0xef, 0xc6, 0x5a, 0x8e, 0xe2, - 0x1d, 0xd2, 0x75, 0xf0, 0x88, 0x28, 0xc8, 0x76, 0x64, 0xeb, 0xdb, 0xb2, - 0xc2, 0xc1, 0xcf, 0xf9, 0x48, 0x6f, 0xb9, 0x61, 0xa5, 0x06, 0xa2, 0xcc, - 0x7f, 0xf3, 0x41, 0xd6, 0x68, 0x83, 0x3f, 0xc0, 0xf1, 0x75, 0x7a, 0xa2, - 0x20, 0x7a, 0xbc, 0x91, 0xc7, 0x34, 0xa8, 0x53, 0xc2, 0xc8, 0x68, 0xad, - 0x02, 0x80, 0x3d, 0xfd, 0x16, 0x3a, 0x59, 0xfd, 0x62, 0x94, 0xd3, 0x42, - 0x8d, 0xb3, 0x93, 0x9e, 0x86, 0x41, 0x28, 0xfc, 0xef, 0x99, 0xe6, 0x6c, - 0x82, 0xc0, 0xd5, 0xa3, 0xa5, 0x48, 0x1c, 0x97, 0x6d, 0x72, 0xac, 0x64, - 0xac, 0x21, 0x2b, 0x06, 0xcb, 0x91, 0x75, 0xdd, 0xc2, 0x1b, 0x18, 0xa5, - 0xeb, 0x37, 0xd3, 0x66, 0xba, 0x9a, 0x35, 0x60, 0xa2, 0x61, 0x0d, 0xfe, - 0x79, 0x44, 0xe9, 0x91, 0xba, 0x63, 0x15, 0xe0, 0xf7, 0xa8, 0x56, 0xb7, - 0x55, 0xb1, 0xda, 0x1d, 0xec, 0xfa, 0x31, 0x61, 0xc3, 0x51, 0xeb, 0xb1, - 0x8d, 0x71, 0x9d, 0x7d, 0x62, 0x52, 0x6a, 0x13, 0x7d, 0x9d, 0x6e, 0x83, - 0xa8, 0x72, 0x52, 0x24, 0x79, 0x87, 0x14, 0x7b, 0x68, 0x6a, 0x4f, 0x97, - 0xda, 0xfe, 0xb9, 0x2a, 0xee, 0x5d, 0x4f, 0x1d, 0x96, 0x32, 0x92, 0xd1, - 0x70, 0x15, 0x16, 0xd5, 0x0c, 0xd1, 0xa9, 0x5d, 0x2f, 0xda, 0xe0, 0x56, - 0xb8, 0x26, 0x84, 0xc7, 0xb8, 0x03, 0x8b, 0x02, 0xb1, 0xeb, 0x91, 0x55, - 0xbd, 0x51, 0x30, 0xcb, 0x9b, 0xe4, 0xff, 0xd7, 0xa8, 0xbb, 0x0e, 0xb7, - 0x7d, 0x05, 0x1a, 0x4d, 0x8a, 0x9d, 0xd3, 0x82, 0x8b, 0x35, 0xd4, 0xa4, - 0x22, 0xf5, 0x24, 0x53, 0xb3, 0x4b, 0xaf, 0xb0, 0xb8, 0x13, 0xd9, 0x3e, - 0x21, 0x2d, 0x7d, 0xcb, 0x32, 0x81, 0xd5, 0xf5, 0x99, 0x58, 0x61, 0x4e, - 0xee, 0x79, 0x13, 0x67, 0x28, 0x86, 0xe0, 0x8d, 0x48, 0xb8, 0x16, 0xfe, - 0x70, 0x88, 0xa6, 0x5f, 0x32, 0x4f, 0xe4, 0x34, 0x9f, 0x2a, 0xcc, 0x3e, - 0xb8, 0x0b, 0x72, 0xd5, 0xdc, 0xeb, 0xfb, 0x85, 0x00, 0xc1, 0xdb, 0x57, - 0x20, 0xb4, 0x24, 0x93, 0x39, 0x1f, 0xbb, 0xb5, 0xd9, 0x37, 0x39, 0x10, - 0x6d, 0x96, 0x37, 0x9a, 0x7c, 0x3f, 0x1c, 0x7a, 0xef, 0x1b, 0x6b, 0x5c, - 0x3b, 0x2b, 0x56, 0xb6, 0xf4, 0xe9, 0x4d, 0x17, 0x7c, 0x12, 0xa8, 0x28, - 0x04, 0x55, 0x97, 0xc6, 0xfd, 0x9e, 0x78, 0xf9, 0x9f, 0xe1, 0xff, 0xcd, - 0x57, 0x8d, 0x2d, 0xe1, 0xa5, 0x14, 0x34, 0x09, 0xef, 0xd4, 0x95, 0xec, - 0xfd, 0xde, 0x20, 0x86, 0x4a, 0x3e, 0x07, 0x64, 0x61, 0xbc, 0xb1, 0x9c, - 0x03, 0x6c, 0xdf, 0x8c, 0x2d, 0x04, 0x1f, 0x8e, 0xa6, 0x5a, 0x4b, 0x95, - 0xc4, 0x71, 0xc1, 0x1a, 0xd4, 0x1d, 0x88, 0x8b, 0xa0, 0x49, 0xf7, 0x48, - 0x9e, 0xed, 0x7f, 0x18, 0x1a, 0x35, 0xd0, 0xb3, 0x32, 0xf1, 0xa9, 0x5a, - 0x26, 0xc2, 0x59, 0x82, 0xd6, 0xe2, 0x25, 0xcb, 0x59, 0xcc, 0x5a, 0xfd, - 0x5e, 0xd0, 0xb9, 0x9b, 0x7f, 0x9e, 0xf9, 0x3f, 0x83, 0x7f, 0x69, 0x00, - 0x9e, 0x1b, 0xb0, 0x6a, 0xe9, 0x9c, 0x8b, 0x28, 0x70, 0x63, 0x18, 0xbf, - 0x04, 0x6b, 0xe3, 0x61, 0x14, 0xb4, 0xb5, 0x64, 0x49, 0x70, 0xc1, 0x18, - 0x7b, 0xde, 0xe1, 0x4f, 0xf4, 0xfe, 0xfa, 0x1d, 0xb3, 0x6d, 0x96, 0x6a, - 0x8f, 0xc0, 0x26, 0x45, 0xe1, 0x24, 0x26, 0xc0, 0x40, 0x65, 0x56, 0x9c, - 0xcd, 0x1e, 0xcf, 0x49, 0xf3, 0xc7, 0x2e, 0x3b, 0x54, 0x21, 0xc5, 0x21, - 0x01, 0x94, 0x21, 0x14, 0x48, 0xd4, 0xea, 0xaf, 0xe4, 0x8a, 0x9d, 0xad, - 0xf1, 0x54, 0xe1, 0x28, 0x47, 0xb0, 0x31, 0xbd, 0x2f, 0x77, 0x0e, 0x5d, - 0x05, 0x68, 0xd9, 0x1a, 0xc6, 0x8d, 0xca, 0x83, 0xe2, 0xeb, 0xe4, 0xbc, - 0xf5, 0xa9, 0x2d, 0x71, 0x64, 0x02, 0x84, 0xdd, 0xcd, 0x46, 0x5e, 0x63, - 0x23, 0x46, 0x45, 0x53, 0x9e, 0xd7, 0xb0, 0x66, 0x36, 0xa3, 0x97, 0x67, - 0x05, 0x73, 0xf4, 0x26, 0x36, 0x98, 0xf5, 0xea, 0x9a, 0xb6, 0xad, 0xed, - 0x80, 0x79, 0x70, 0x52, 0x05, 0xd8, 0x42, 0x65, 0x7d, 0xab, 0xd5, 0x7e, - 0x6c, 0xea, 0x5c, 0x7d, 0xcb, 0x44, 0xc7, 0xc7, 0x26, 0xbf, 0x06, 0x1f, - 0x21, 0x66, 0xe0, 0x94, 0x7f, 0x45, 0x53, 0xdf, 0x15, 0xd2, 0x70, 0xc2, - 0x9f, 0xeb, 0x47, 0x79, 0x63, 0xbf, 0x70, 0x56, 0x42, 0xe0, 0x6b, 0xce, - 0xc8, 0x30, 0xe8, 0xa5, 0xef, 0x4f, 0x78, 0x14, 0x69, 0xc1, 0xf3, 0x0a, - 0xdc, 0x2b, 0xc0, 0xb4, 0x2c, 0x89, 0xa5, 0xfb, 0xbf, 0x7e, 0x1c, 0x78, - 0x99, 0x2c, 0x38, 0x5e, 0x58, 0xc5, 0x10, 0xe8, 0x9b, 0x68, 0x0d, 0xd4, - 0x23, 0x94, 0x27, 0xf7, 0xe8, 0x9a, 0x35, 0x76, 0xe8, 0x51, 0x72, 0x33, - 0x4a, 0xf6, 0x4c, 0xeb, 0xc1, 0xa8, 0x63, 0x30, 0x1f, 0x67, 0x3f, 0x10, - 0x83, 0xfe, 0x63, 0xbf, 0x7b, 0xf6, 0x41, 0x79, 0x1b, 0xc5, 0x0d, 0x67, - 0x3a, 0x69, 0xd6, 0x94, 0x99, 0x92, 0xb7, 0x70, 0xaf, 0x8c, 0xc7, 0x24, - 0x1b, 0xaf, 0xe3, 0x2a, 0xad, 0x55, 0x36, 0x99, 0x9e, 0x54, 0xb2, 0xe5, - 0xf3, 0xe5, 0xba, 0xf8, 0xdc, 0x27, 0x43, 0x99, 0x6d, 0x62, 0xcf, 0xd5, - 0xf1, 0xd7, 0xf3, 0xfe, 0x05, 0x2b, 0x06, 0x09, 0x8b, 0xb3, 0x39, 0xd7, - 0x62, 0x8e, 0xce, 0xfe, 0x20, 0x1a, 0xa8, 0x89, 0x92, 0x1c, 0x6d, 0xe7, - 0xbb, 0x66, 0xfc, 0xc6, 0x49, 0xe5, 0x88, 0xbd, 0x38, 0x65, 0x5a, 0xae, - 0x75, 0x7f, 0xe3, 0x55, 0x29, 0x12, 0x0f, 0x96, 0x15, 0x03, 0x88, 0x14, - 0x4e, 0xe8, 0x92, 0xe3, 0xac, 0x63, 0xeb, 0x79, 0x47, 0x47, 0x0c, 0x1d, - 0xb9, 0xa9, 0xdb, 0x34, 0x4b, 0x22, 0xcc, 0x01, 0xe7, 0x61, 0x82, 0x77, - 0x65, 0xa4, 0xf8, 0x4f, 0xf0, 0x65, 0x50, 0x1a, 0x6a, 0xd6, 0x68, 0x9a, - 0x98, 0x76, 0x0f, 0x73, 0xc1, 0x68, 0x90, 0x21, 0xf2, 0x9d, 0xca, 0x96, - 0x82, 0x02, 0x5b, 0xcd, 0xc2, 0xe5, 0xcd, 0x70, 0x9d, 0xa2, 0x59, 0x33, - 0xb6, 0x25, 0xd9, 0x02, 0x1f, 0xf2, 0xbd, 0xcd, 0x54, 0xe6, 0x15, 0xb2, - 0xea, 0xc7, 0x2c, 0xa5, 0x8e, 0x5a, 0x45, 0x3f, 0xb8, 0x63, 0x4f, 0x20, - 0x08, 0xdf, 0xf5, 0x46, 0xf8, 0x3c, 0x13, 0x41, 0xb2, 0xbc, 0xa5, 0xb4, - 0x75, 0x30, 0x98, 0x10, 0x59, 0x09, 0xda, 0xf5, 0x97, 0x61, 0xcb, 0x18, - 0xb6, 0x39, 0x1e, 0xc4, 0x15, 0xc3, 0x15, 0xf4, 0xcb, 0xd3, 0x8f, 0xe4, - 0xb0, 0x45, 0xb4, 0x3e, 0x7c, 0x8c, 0xb6, 0x99, 0xf7, 0x50, 0x60, 0x9b, - 0x56, 0x29, 0xff, 0x06, 0xea, 0xd5, 0x05, 0xee, 0xeb, 0x88, 0x91, 0x88, - 0x07, 0x10, 0x86, 0x27, 0xab, 0x0a, 0x64, 0x91, 0x7e, 0x8f, 0xea, 0xaf, - 0xa4, 0xa1, 0x89, 0x6e, 0x7b, 0x7b, 0xd5, 0x38, 0x0c, 0xf3, 0x2a, 0xff, - 0xac, 0x3e, 0x55, 0xcc, 0x3d, 0xa0, 0xc6, 0x38, 0xa0, 0x3b, 0x1f, 0x9b, - 0x42, 0xa7, 0x1b, 0x20, 0xe3, 0x21, 0xde, 0x5a, 0xd0, 0x92, 0xf2, 0xfd, - 0x9f, 0xdf, 0x42, 0x3d, 0xd5, 0x04, 0xcb, 0x81, 0x29, 0x8d, 0xb6, 0x93, - 0xfa, 0x44, 0x79, 0x0c, 0xbe, 0x54, 0x2a, 0x2f, 0xf6, 0xbd, 0xab, 0x6b, - 0xd2, 0xd7, 0xbb, 0x1a, 0x43, 0xcf, 0x8f, 0x29, 0xc4, 0xb6, 0xd6, 0xb7, - 0x27, 0xac, 0xc4, 0x7d, 0xa5, 0x8f, 0x71, 0x21, 0x06, 0x52, 0x9d, 0x0d, - 0xb3, 0x21, 0x87, 0xb6, 0x3d, 0x61, 0x8d, 0xaf, 0x2c, 0xc2, 0x57, 0x9f, - 0xa6, 0xf3, 0xa7, 0x63, 0xda, 0xde, 0x50, 0x75, 0xf1, 0xa4, 0x4a, 0xd0, - 0x28, 0xa4, 0x17, 0x68, 0x3f, 0x07, 0xb8, 0x59, 0xab, 0xd9, 0xdb, 0x8c, - 0x3f, 0xe8, 0x07, 0x8b, 0xb8, 0x2a, 0xb0, 0x35, 0xdc, 0xa4, 0xc6, 0xff, - 0xd5, 0x20, 0x48, 0x6c, 0xef, 0xbb, 0x32, 0x86, 0x9c, 0x80, 0x70, 0x13, - 0xe9, 0x89, 0xe9, 0x89, 0x57, 0x5b, 0x2f, 0x04, 0x59, 0xde, 0x69, 0x7a, - 0x26, 0xc7, 0x3e, 0x88, 0xb9, 0x1a, 0x0d, 0xf6, 0xb2, 0x81, 0x4b, 0x60, - 0xc1, 0x6d, 0x48, 0xf7, 0x2f, 0xbc, 0xf0, 0x7a, 0x75, 0x46, 0x12, 0x09, - 0xc8, 0x6a, 0xaa, 0x83, 0x44, 0x47, 0x91, 0x42, 0x19, 0x58, 0xc2, 0x4b, - 0xa8, 0xc2, 0xd0, 0x79, 0x88, 0xe7, 0xd4, 0xcf, 0xcb, 0xe8, 0xe2, 0xb5, - 0xe3, 0x0d, 0xe2, 0x0e, 0xc0, 0xdf, 0x17, 0x64, 0x72, 0x43, 0xe6, 0x49, - 0xdc, 0x9d, 0x41, 0x01, 0x04, 0x5c, 0x06, 0x3e, 0xfa, 0xeb, 0x7d, 0x6b, - 0x22, 0xf5, 0x50, 0x7c, 0x82, 0xc2, 0x49, 0x63, 0x27, 0xe2, 0x1a, 0x80, - 0x89, 0x68, 0x0b, 0xc3, 0xef, 0x34, 0x7f, 0x3c, 0xdb, 0xcc, 0xec, 0x4b, - 0xee, 0x09, 0x6e, 0x04, 0xb5, 0xf1, 0x5f, 0xf4, 0xc6, 0x1c, 0x69, 0x46, - 0x83, 0x93, 0x34, 0xaf, 0xa9, 0xdd, 0xec, 0xf9, 0xbd, 0x2c, 0x4a, 0x79, - 0x4f, 0x6f, 0x32, 0x6d, 0xc4, 0xe5, 0x85, 0x38, 0x2e, 0xc1, 0xc9, 0x03, - 0xf9, 0x3a, 0x0e, 0xd6, 0x14, 0x20, 0xf3, 0x14, 0x74, 0xf7, 0x2c, 0x9e, - 0xd1, 0x14, 0x37, 0x27, 0x07, 0xb3, 0x8f, 0xfd, 0x8c, 0xd8, 0xc4, 0xa5, - 0x11, 0x78, 0x03, 0x12, 0xe9, 0x2c, 0xc3, 0x18, 0xba, 0xef, 0x71, 0xbb, - 0x8e, 0xf8, 0x3d, 0x8e, 0x3e, 0x12, 0x00, 0x1b, 0x0d, 0x14, 0x69, 0xc4, - 0xab, 0xf9, 0xba, 0xac, 0x38, 0xc6, 0x7c, 0x00, 0x29, 0x41, 0xed, 0x66, - 0xe2, 0xcb, 0x3c, 0x15, 0x93, 0x04, 0x3e, 0x2c, 0x6a, 0x83, 0x93, 0xe9, - 0x85, 0x7d, 0x31, 0x2a, 0x89, 0xa9, 0x91, 0x1e, 0x43, 0x88, 0x5f, 0xf2, - 0x49, 0xe6, 0x7d, 0x3a, 0x82, 0xb2, 0x8d, 0xe5, 0xe9, 0xfe, 0xd2, 0x06, - 0x57, 0xca, 0x24, 0x75, 0xf4, 0x8e, 0x0a, 0xb9, 0x8c, 0x95, 0x96, 0xdb, - 0x07, 0x0a, 0xc0, 0xc4, 0x3d, 0xd5, 0x1f, 0x98, 0xb8, 0xc8, 0xaf, 0x8d, - 0xd9, 0x09, 0xa6, 0x86, 0xbd, 0xee, 0x65, 0xe7, 0x27, 0xa0, 0x38, 0x7a, - 0x6b, 0x87, 0xce, 0xc1, 0x8e, 0x16, 0xd0, 0x6e, 0xf6, 0xc9, 0xca, 0x05, - 0x31, 0x22, 0xa3, 0xd7, 0x82, 0x80, 0xc6, 0xc6, 0x32, 0x2a, 0xca, 0x8a, - 0xdb, 0x46, 0x02, 0xce, 0x13, 0x3e, 0x85, 0xe2, 0xdb, 0x5c, 0xcc, 0x20, - 0x5f, 0x57, 0x39, 0x1f, 0x27, 0x2c, 0x25, 0x0b, 0x9a, 0xf3, 0x4b, 0xc7, - 0xcc, 0xf3, 0x1a, 0x01, 0x4d, 0xc9, 0x6d, 0xbb, 0xff, 0x2a, 0xd7, 0xd9, - 0xfd, 0x8a, 0x9b, 0xe3, 0x77, 0x03, 0x57, 0x3a, 0x32, 0xb4, 0x18, 0xe7, - 0x8f, 0xa3, 0x47, 0x28, 0x76, 0xad, 0x43, 0x16, 0x9f, 0xd8, 0x20, 0x53, - 0x2b, 0x46, 0xa0, 0x04, 0x8e, 0x50, 0xf8, 0xd5, 0x42, 0x2c, 0x4f, 0xa0, - 0x8e, 0xdd, 0x45, 0x87, 0xeb, 0x37, 0xbd, 0xd1, 0x01, 0xf9, 0x26, 0x40, - 0xf7, 0x55, 0x06, 0xc1, 0x54, 0x0a, 0x48, 0x20, 0x41, 0xaa, 0x6f, 0xb6, - 0x8e, 0xc3, 0x01, 0x23, 0x5f, 0x83, 0x82, 0x50, 0xe0, 0x99, 0x7b, 0x41, - 0x1f, 0x4a, 0xbe, 0xc2, 0x47, 0xd1, 0xfa, 0xc6, 0xce, 0x3b, 0x46, 0x93, - 0x1a, 0xa6, 0x6f, 0xcf, 0x58, 0x1e, 0xfe, 0x01, 0xb8, 0x46, 0x62, 0x03, - 0xa6, 0xc8, 0x3d, 0x80, 0x27, 0xd2, 0x95, 0x2e, 0x73, 0xd1, 0x70, 0x42, - 0xcb, 0xde, 0x5a, 0xc3, 0x96, 0x49, 0xc7, 0x1b, 0xa0, 0x6d, 0xbb, 0xb6, - 0x0c, 0xd1, 0x68, 0xbe, 0xd8, 0xa4, 0x29, 0x23, 0x5f, 0xd9, 0x34, 0x9f, - 0xb0, 0xf9, 0xc6, 0xf6, 0x72, 0x06, 0x26, 0xb2, 0x8b, 0xa7, 0x70, 0x32, - 0x8d, 0xbf, 0xc2, 0x61, 0xe6, 0x30, 0x61, 0x35, 0x7b, 0x4f, 0x82, 0x87, - 0x51, 0x2a, 0x8e, 0x07, 0x99, 0x2e, 0x3f, 0x3e, 0xee, 0x8f, 0xd3, 0xca, - 0x0f, 0x41, 0x63, 0xa0, 0x7d, 0x6e, 0x07, 0xbd, 0x86, 0xc3, 0xe5, 0x42, - 0x37, 0x74, 0x33, 0x68, 0xed, 0x90, 0xba, 0xe0, 0x4c, 0xe9, 0x11, 0x3a, - 0xb1, 0x0e, 0xbd, 0xd8, 0x53, 0x63, 0x3b, 0x35, 0xd0, 0x9d, 0x8b, 0x8d, - 0x72, 0x1e, 0x9a, 0xd6, 0xf7, 0xcd, 0x08, 0x92, 0x54, 0xbe, 0xae, 0x89, - 0x86, 0x88, 0x0f, 0x1b, 0x5f, 0xca, 0xe2, 0x50, 0x6a, 0x9a, 0x60, 0xc0, - 0xb1, 0x17, 0xc5, 0x75, 0x82, 0x2c, 0x97, 0x9c, 0x48, 0xfe, 0xde, 0xb4, - 0xf8, 0xc2, 0xcb, 0xd9, 0xe9, 0xc1, 0x7e, 0x7d, 0xbf, 0x2e, 0x6c, 0xe7, - 0x57, 0xbc, 0x62, 0xa4, 0x07, 0x7f, 0xe0, 0x65, 0xad, 0x9c, 0x42, 0xd8, - 0xa4, 0xb0, 0xae, 0xc6, 0x22, 0x9d, 0xf9, 0x5a, 0x9d, 0x5f, 0x4d, 0x7a, - 0x13, 0x68, 0xc2, 0x3d, 0xca, 0x94, 0x4c, 0x78, 0xe4, 0x14, 0xf7, 0x06, - 0x54, 0xe9, 0x54, 0xac, 0x73, 0xcb, 0xd3, 0xd7, 0x83, 0x5b, 0x1d, 0xaa, - 0x89, 0x62, 0xd9, 0xca, 0x1e, 0xb2, 0xf5, 0x3c, 0xd9, 0x76, 0x74, 0x6e, - 0xb7, 0xef, 0xd8, 0x6d, 0xd8, 0x66, 0xab, 0xb1, 0x24, 0xf8, 0xa5, 0xe9, - 0x43, 0xfd, 0x89, 0xe8, 0xad, 0x40, 0x78, 0x20, 0x85, 0x6b, 0xb9, 0x42, - 0xcd, 0xac, 0xaa, 0xa3, 0xd7, 0x88, 0x59, 0x0d, 0x58, 0x3a, 0x53, 0x17, - 0x01, 0x93, 0xb8, 0xed, 0x2e, 0x34, 0xcd, 0x1c, 0x19, 0x16, 0x6a, 0x0d, - 0xca, 0x84, 0x34, 0xc0, 0x37, 0x9d, 0x30, 0x1c, 0xb2, 0x63, 0x02, 0x45, - 0x93, 0x82, 0x69, 0xb5, 0xcd, 0x57, 0x88, 0x58, 0x7b, 0x3a, 0xd3, 0x1b, - 0x97, 0xd1, 0x18, 0x1c, 0xa5, 0x02, 0xb7, 0xb9, 0xea, 0x5c, 0xd6, 0x85, - 0xc3, 0x36, 0xae, 0xcd, 0x5d, 0x76, 0xbc, 0xbc, 0x0f, 0x13, 0x94, 0xc7, - 0x44, 0x7f, 0x7c, 0x5c, 0xa3, 0x34, 0x43, 0xcc, 0xe5, 0x1f, 0xa6, 0xec, - 0xff, 0x76, 0xc3, 0x97, 0xec, 0x80, 0xc9, 0xf4, 0xc7, 0x23, 0x37, 0xa0, - 0xbe, 0xaf, 0xab, 0xa3, 0x5f, 0xea, 0x2d, 0xbf, 0x16, 0x64, 0xab, 0xa6, - 0xca, 0x82, 0x14, 0x4c, 0x0a, 0x30, 0x34, 0x2d, 0xf7, 0x9d, 0xc6, 0x4f, - 0xfc, 0x02, 0x00, 0x5e, 0x82, 0x23, 0x7e, 0xe3, 0x2c, 0x22, 0x1e, 0x49, - 0x7a, 0xde, 0x2a, 0x6c, 0x94, 0x11, 0x27, 0x91, 0x5b, 0x64, 0x73, 0x39, - 0x3a, 0xcc, 0x28, 0xe9, 0x29, 0x41, 0x94, 0xbc, 0xcf, 0xed, 0xf5, 0x66, - 0x14, 0x2f, 0xd2, 0xc7, 0xd1, 0x95, 0xf4, 0x0d, 0x1f, 0x44, 0x27, 0xd0, - 0x05, 0xf1, 0xfb, 0xaf, 0x2d, 0xe9, 0x9e, 0x0a, 0x67, 0xa0, 0x5c, 0x3a, - 0xf4, 0x91, 0x0d, 0x4d, 0x2d, 0x25, 0x9b, 0x04, 0x44, 0x77, 0x91, 0xed, - 0xd8, 0xb5, 0x2d, 0xd2, 0x56, 0xfa, 0xa4, 0x06, 0xec, 0x36, 0x1f, 0x1e, - 0xbd, 0xe3, 0x04, 0x1f, 0x8d, 0x04, 0xc3, 0x75, 0xa7, 0x54, 0xf0, 0x9a, - 0x4b, 0xb7, 0x20, 0xbb, 0x54, 0xc2, 0x0e, 0xb4, 0x8b, 0x01, 0x0e, 0x17, - 0x54, 0x02, 0xdd, 0x95, 0xac, 0x2c, 0x32, 0x0e, 0xfe, 0xda, 0xde, 0x36, - 0xd9, 0x18, 0xa2, 0x06, 0x52, 0x58, 0x25, 0xd2, 0xac, 0x8b, 0x5f, 0xb4, - 0x56, 0x10, 0x8e, 0xef, 0x03, 0xb3, 0x9d, 0x30, 0x7c, 0xb4, 0xd3, 0xe7, - 0x57, 0x1f, 0x5e, 0xd3, 0x64, 0x65, 0x5b, 0x6b, 0x0b, 0xb0, 0x0d, 0xde, - 0x11, 0xa9, 0xd7, 0x72, 0x4d, 0xe8, 0xcb, 0xbf, 0x8c, 0xdd, 0xd6, 0xf0, - 0x3f, 0x3c, 0x52, 0xc6, 0x3a, 0x58, 0xde, 0x4a, 0xa9, 0xd4, 0xc6, 0x25, - 0xf4, 0x91, 0x6d, 0x2b, 0x27, 0x5f, 0x87, 0x3b, 0xa7, 0xa5, 0x6a, 0x55, - 0xeb, 0xbc, 0x32, 0x42, 0x11, 0xfc, 0x51, 0xb4, 0x70, 0x32, 0xd5, 0x69, - 0x28, 0x5b, 0xb1, 0x85, 0xc2, 0x53, 0xbb, 0x25, 0xf9, 0xdf, 0x39, 0x05, - 0x17, 0x45, 0xc7, 0xdc, 0xb6, 0x52, 0x90, 0xa8, 0xec, 0xbf, 0xb9, 0x9d, - 0x02, 0xa8, 0x13, 0x0b, 0xa0, 0x6d, 0x25, 0x55, 0x22, 0x15, 0xf4, 0x37, - 0x37, 0x1c, 0x8c, 0xfe, 0x23, 0xc9, 0xfd, 0xa9, 0x10, 0x2f, 0x98, 0xa7, - 0xcd, 0x32, 0x56, 0xef, 0xa7, 0xc6, 0x25, 0x70, 0xc9, 0xd0, 0x8f, 0x7a, - 0x60, 0x45, 0xab, 0x11, 0x9e, 0xf3, 0xf4, 0x08, 0x9a, 0xaa, 0xd3, 0x74, - 0x19, 0xe5, 0x38, 0x59, 0xef, 0xdf, 0x13, 0x9f, 0x87, 0x79, 0x7c, 0x49, - 0x02, 0xaa, 0xe7, 0xed, 0xbf, 0x16, 0xc9, 0x90, 0x4a, 0xb1, 0x7e, 0x8c, - 0x34, 0xc6, 0x2e, 0x89, 0xa5, 0x5f, 0x95, 0xbc, 0x99, 0xc8, 0xde, 0x47, - 0xde, 0xd4, 0xda, 0xe5, 0xba, 0xbf, 0xc0, 0x30, 0xaa, 0x80, 0x62, 0xce, - 0xee, 0x3e, 0x87, 0x67, 0x9c, 0x2f, 0x51, 0xf5, 0x29, 0x2f, 0xa6, 0xf1, - 0x2e, 0x18, 0xcb, 0x23, 0xf4, 0x8b, 0xa4, 0xe7, 0xaa, 0x94, 0x8e, 0xc9, - 0xf9, 0x42, 0x4b, 0xe7, 0x6f, 0x7f, 0xd3, 0xff, 0x7d, 0x25, 0x31, 0x06, - 0x2c, 0x0f, 0x5a, 0x82, 0x64, 0x55, 0x54, 0xbc, 0x07, 0x7c, 0x08, 0x18, - 0xbd, 0xa0, 0x61, 0x0e, 0x19, 0xc7, 0x7e, 0x43, 0x7b, 0x40, 0x49, 0x17, - 0x83, 0x1a, 0x0f, 0x3d, 0x92, 0x17, 0xac, 0x10, 0x9a, 0x55, 0xb0, 0xe4, - 0x1e, 0x87, 0xf8, 0x5d, 0xba, 0x58, 0x90, 0x7e, 0x13, 0x8e, 0x15, 0xbd, - 0xa7, 0x85, 0x28, 0x05, 0x92, 0x67, 0x5a, 0x1d, 0xbf, 0x15, 0x2d, 0xb8, - 0x2a, 0x78, 0xa9, 0xfe, 0x1e, 0x92, 0xaf, 0x65, 0x42, 0xc5, 0x0a, 0x53, - 0x05, 0x2d, 0xad, 0xbb, 0xf6, 0x66, 0x03, 0x85, 0x0b, 0x47, 0x6f, 0xd8, - 0x4e, 0xe5, 0x9c, 0xdd, 0x71, 0xf3, 0x54, 0xeb, 0xc6, 0x8f, 0x04, 0x6b, - 0x99, 0xda, 0x22, 0x55, 0x6f, 0x2c, 0x0d, 0xc7, 0x23, 0xd3, 0xe7, 0xcb, - 0x62, 0xbb, 0xc6, 0xae, 0x98, 0x9d, 0xba, 0xd0, 0x56, 0xc6, 0x86, 0x5a, - 0x85, 0x3d, 0xf2, 0x97, 0xa6, 0x9c, 0xb6, 0xe9, 0xd6, 0xba, 0x13, 0xbf, - 0x31, 0x1e, 0xf3, 0x22, 0x73, 0xd7, 0xf2, 0x2d, 0xf7, 0xb2, 0xec, 0xdf, - 0xc6, 0xc5, 0x3b, 0x6b, 0x35, 0x8b, 0xa7, 0x30, 0x46, 0xda, 0x03, 0x59, - 0xc6, 0xf9, 0x1b, 0xdc, 0x85, 0x13, 0x4d, 0xbb, 0x89, 0x25, 0x6c, 0x85, - 0x43, 0xd9, 0x3c, 0xcb, 0xd7, 0x5d, 0x7c, 0xe0, 0x7c, 0x32, 0xfc, 0x3d, - 0xfb, 0xa8, 0xff, 0x87, 0x33, 0xd0, 0x41, 0x0f, 0x3e, 0x49, 0x47, 0x42, - 0x4c, 0xa3, 0x6e, 0x1a, 0x2e, 0xa8, 0xcb, 0x30, 0x3a, 0x2c, 0x21, 0x04, - 0x2a, 0xe9, 0x4b, 0x81, 0xc4, 0x05, 0x7c, 0x60, 0xcc, 0x11, 0x20, 0xfc, - 0xbd, 0x8e, 0x9f, 0x25, 0x97, 0x1b, 0xfb, 0xf9, 0x52, 0xbd, 0x5d, 0x4c, - 0x84, 0xf4, 0xf5, 0x8b, 0xde, 0xda, 0x10, 0x81, 0x1d, 0x76, 0xf8, 0x27, - 0x3c, 0x6d, 0x16, 0x71, 0x51, 0x61, 0x5f, 0x23, 0xb4, 0xb3, 0x03, 0xca, - 0xf9, 0xb9, 0xc1, 0x11, 0x1e, 0x5b, 0x8f, 0xc2, 0x51, 0x1b, 0x27, 0x1b, - 0x6b, 0xe6, 0xe1, 0x83, 0x06, 0x39, 0x28, 0x50, 0xda, 0xb1, 0xc0, 0x6c, - 0xb0, 0xcc, 0xba, 0x77, 0x57, 0x33, 0x10, 0xe2, 0x52, 0x64, 0xc5, 0x5f, - 0xc0, 0xa2, 0xa0, 0x82, 0x25, 0x2b, 0x8e, 0x16, 0xf9, 0x79, 0x18, 0x65, - 0x9a, 0xbe, 0xa2, 0x2e, 0x83, 0xb6, 0x5d, 0xe9, 0x23, 0x82, 0xc2, 0x57, - 0x91, 0x1d, 0x77, 0x90, 0x14, 0x6b, 0x27, 0x57, 0xa5, 0xac, 0x3d, 0x97, - 0x19, 0x5d, 0x96, 0x14, 0xb2, 0xb6, 0x3e, 0x4e, 0xfc, 0xd8, 0xbc, 0x22, - 0xd6, 0xcc, 0x8e, 0x9d, 0xc4, 0x4a, 0xd6, 0x40, 0x4d, 0x28, 0x18, 0x6c, - 0x41, 0xc4, 0x99, 0x13, 0xc2, 0xdb, 0x87, 0xff, 0xc5, 0x51, 0xbb, 0x9c, - 0xfc, 0x17, 0xc9, 0xfa, 0xb7, 0xde, 0x27, 0xf9, 0x56, 0x54, 0x0a, 0x8f, - 0x61, 0xcc, 0x2b, 0x33, 0x77, 0x5f, 0xdf, 0xaf, 0x96, 0x49, 0x8c, 0xf9, - 0x21, 0x2c, 0x7f, 0xef, 0x29, 0xa5, 0x41, 0xfb, 0x9e, 0xf3, 0xf0, 0x6a, - 0x7b, 0x04, 0x1f, 0x70, 0x5c, 0xbc, 0x2b, 0x84, 0xee, 0x90, 0x7d, 0xab, - 0x1e, 0x69, 0x49, 0x11, 0xf4, 0xef, 0xbc, 0xfd, 0x3d, 0x86, 0xcc, 0x46, - 0x79, 0xcd, 0xd3, 0x93, 0x49, 0x01, 0x8b, 0x5d, 0xa2, 0xf2, 0xa3, 0x5d, - 0x91, 0x19, 0xa5, 0x26, 0x89, 0x17, 0x1f, 0x13, 0x89, 0xad, 0xd9, 0xd0, - 0x4d, 0x3c, 0x08, 0x1b, 0xdb, 0x64, 0xcb, 0x10, 0x21, 0xb3, 0x2c, 0xf3, - 0xa6, 0x85, 0xc3, 0x19, 0x95, 0xf6, 0xf3, 0x56, 0x56, 0x2b, 0x2c, 0x8d, - 0xd5, 0xba, 0x58, 0xd7, 0xbe, 0x5d, 0xe4, 0x9c, 0x3b, 0x7c, 0x7f, 0xd5, - 0x14, 0x1f, 0x53, 0xca, 0xd3, 0x71, 0x65, 0xdc, 0xe7, 0xc3, 0xe7, 0xb9, - 0xeb, 0x84, 0x77, 0x22, 0xdd, 0x1f, 0x9f, 0xf2, 0x2e, 0xd2, 0x52, 0x36, - 0x26, 0x78, 0xee, 0x48, 0x19, 0x9a, 0x01, 0x00, 0x0d, 0xc5, 0x2b, 0x79, - 0x80, 0xac, 0x97, 0x52, 0x9b, 0x2a, 0x97, 0x58, 0x04, 0xaa, 0x12, 0x41, - 0x43, 0xe6, 0xe9, 0x6f, 0x00, 0xe0, 0xd7, 0x0d, 0x8a, 0x46, 0x0c, 0x7f, - 0x8f, 0xe7, 0xe3, 0xa1, 0xa1, 0xfc, 0xf3, 0x8c, 0x26, 0x13, 0x1f, 0xaf, - 0x5e, 0x73, 0xcf, 0xfa, 0x71, 0xdf, 0x58, 0xc1, 0x40, 0xf3, 0x99, 0x36, - 0xeb, 0x4e, 0x59, 0x72, 0xd2, 0xd5, 0x3b, 0x51, 0xc8, 0x22, 0x8f, 0xbc, - 0xa5, 0x78, 0x71, 0x87, 0xa8, 0x1f, 0x0f, 0x3b, 0x3e, 0xa8, 0x67, 0xc2, - 0xd2, 0xc4, 0xd9, 0x6a, 0x68, 0x79, 0x3c, 0xe0, 0xf2, 0x3e, 0x9b, 0x49, - 0xfd, 0x99, 0xa4, 0xef, 0xc8, 0x64, 0x0b, 0x0f, 0x4f, 0x46, 0x53, 0x27, - 0xb0, 0xd4, 0x2b, 0x09, 0x63, 0x9e, 0xca, 0x48, 0x69, 0x95, 0x51, 0x5f, - 0x6d, 0xa6, 0x06, 0x8d, 0xce, 0x86, 0x85, 0x21, 0x03, 0x70, 0x59, 0x8d, - 0x4a, 0x16, 0x0e, 0x7f, 0x1a, 0xf2, 0x83, 0x05, 0x1c, 0x47, 0xd4, 0xec, - 0x56, 0x9c, 0xf0, 0xac, 0xd7, 0x7f, 0xb7, 0x9b, 0xdd, 0x93, 0x64, 0x84, - 0xd7, 0x6a, 0x4c, 0xb1, 0xbe, 0x06, 0x70, 0x1b, 0x1c, 0x05, 0x15, 0x96, - 0xc1, 0x90, 0xfc, 0xcb, 0x60, 0x07, 0x5d, 0x39, 0x24, 0x91, 0x23, 0x1f, - 0x58, 0x3b, 0x5f, 0x0d, 0xd6, 0xb2, 0xb9, 0x54, 0xf7, 0xbf, 0x28, 0x94, - 0xbb, 0x56, 0x14, 0x0c, 0xbf, 0x9a, 0x84, 0x2a, 0xb0, 0x18, 0x31, 0xec, - 0x02, 0x37, 0xd7, 0x3b, 0x54, 0x73, 0x23, 0x01, 0x9b, 0x49, 0x5e, 0xb4, - 0xf8, 0x17, 0xeb, 0x61, 0xf9, 0xff, 0xa8, 0xc1, 0x69, 0xcb, 0xe2, 0x31, - 0x05, 0xfe, 0x15, 0x28, 0x6a, 0x30, 0x5b, 0x35, 0x84, 0x44, 0x67, 0xe9, - 0xd7, 0x0e, 0xbf, 0x85, 0xa1, 0x23, 0xec, 0x4d, 0x4f, 0x8c, 0x09, 0x2e, - 0x2a, 0xc2, 0x7b, 0xcd, 0x8c, 0x87, 0xdd, 0xa3, 0x07, 0x37, 0xfa, 0xe2, - 0x2c, 0x73, 0x45, 0xad, 0xc2, 0x89, 0x86, 0xca, 0xa7, 0x86, 0x9a, 0xae, - 0xc3, 0x6c, 0xc7, 0x1c, 0x0f, 0xc8, 0x36, 0xa1, 0xe2, 0x12, 0xd0, 0x42, - 0xaa, 0x39, 0x37, 0xdb, 0x0d, 0x9a, 0x79, 0x1c, 0x80, 0x2e, 0x4a, 0x42, - 0x18, 0x63, 0xb5, 0x67, 0x1d, 0x76, 0xd0, 0x3f, 0x22, 0x9c, 0x5f, 0x4b, - 0x1d, 0xf8, 0xb6, 0x3d, 0xf7, 0x3c, 0xe7, 0xcb, 0x3d, 0xb3, 0xfd, 0x66, - 0x71, 0x51, 0xc9, 0xa0, 0x31, 0xf1, 0x43, 0x4c, 0x2b, 0x6a, 0xa0, 0x59, - 0xf6, 0x64, 0x9a, 0x69, 0x35, 0x6a, 0xeb, 0xe4, 0x60, 0x7a, 0xa7, 0xdb, - 0x1d, 0x80, 0xc6, 0xe4, 0x13, 0xcf, 0xdb, 0xcb, 0xe2, 0x56, 0x3b, 0xec, - 0x3f, 0x37, 0xbd, 0x31, 0x79, 0x26, 0x96, 0x0b, 0x21, 0x21, 0xb7, 0x77, - 0x27, 0xe9, 0x51, 0x9d, 0x5b, 0xba, 0x33, 0x36, 0xb3, 0xf6, 0xbd, 0x83, - 0x68, 0xdf, 0xf5, 0x88, 0x86, 0x4a, 0xbb, 0x91, 0x54, 0xfd, 0x6a, 0x3f, - 0xca, 0x82, 0x11, 0xa2, 0xe5, 0x28, 0xfc, 0xb7, 0x21, 0x19, 0x18, 0xeb, - 0x87, 0xb7, 0xec, 0xfd, 0x98, 0xc0, 0x42, 0x50, 0x04, 0xda, 0xf7, 0xc1, - 0xf9, 0x59, 0xcd, 0xb9, 0x8a, 0xae, 0x9b, 0x35, 0x03, 0x45, 0x10, 0xce, - 0x99, 0xee, 0xf6, 0x45, 0x89, 0xb2, 0xb7, 0xc7, 0xd2, 0x71, 0x4d, 0x23, - 0x19, 0xef, 0x58, 0xed, 0x7c, 0x80, 0x34, 0xad, 0x46, 0x4b, 0xc1, 0xd2, - 0xeb, 0xe9, 0xc2, 0xc8, 0xf7, 0x2b, 0x4a, 0x2e, 0x9b, 0x28, 0xe3, 0x83, - 0x86, 0x20, 0xd1, 0x74, 0x50, 0x5c, 0x73, 0xfa, 0xa8, 0x2f, 0x21, 0x63, - 0x2c, 0x6f, 0x79, 0xe7, 0x7f, 0xe9, 0xb3, 0x37, 0x9b, 0x2d, 0x39, 0x01, - 0x5d, 0xfb, 0x49, 0xc7, 0xd0, 0xb0, 0x83, 0xb3, 0xdc, 0x54, 0x2f, 0x81, - 0x30, 0x18, 0xc8, 0x73, 0xae, 0xe0, 0xcf, 0xc4, 0x4c, 0xb4, 0x3c, 0x11, - 0x2f, 0x01, 0x8a, 0xfc, 0x9a, 0xce, 0x94, 0x47, 0x59, 0x0f, 0x05, 0xca, - 0xce, 0x79, 0xb2, 0x28, 0xbc, 0x75, 0xcb, 0x11, 0xc4, 0xfc, 0x12, 0xd1, - 0xe0, 0x90, 0xfb, 0xd4, 0x64, 0x91, 0x7a, 0x5b, 0x29, 0xfa, 0xd8, 0xd3, - 0x6b, 0x53, 0x4d, 0x26, 0x6b, 0xa0, 0x43, 0xfc, 0xf1, 0xd6, 0x0a, 0xbd, - 0xce, 0x0e, 0x95, 0x76, 0x72, 0x8d, 0xd3, 0x48, 0x03, 0x54, 0x12, 0x61, - 0x29, 0x55, 0x92, 0x22, 0xbb, 0x82, 0x31, 0x59, 0x46, 0xba, 0xa9, 0xd5, - 0xdd, 0x64, 0x49, 0xf7, 0x43, 0x3b, 0xda, 0xae, 0xb6, 0xff, 0xaf, 0xab, - 0x42, 0xed, 0x98, 0xea, 0xef, 0x39, 0xac, 0xb6, 0x1b, 0x1b, 0xd9, 0x73, - 0x2c, 0x59, 0x7f, 0x3c, 0x8d, 0xe3, 0x33, 0xed, 0xaf, 0x5d, 0x74, 0xe5, - 0x34, 0x7b, 0x88, 0x4b, 0x0c, 0xb6, 0x3d, 0xe0, 0x74, 0x4a, 0xb3, 0x7c, - 0x95, 0x76, 0x5a, 0xb2, 0xe0, 0x1f, 0x2a, 0x34, 0x0e, 0xe1, 0xc6, 0x90, - 0x1c, 0x1c, 0xd3, 0x2d, 0x0d, 0x32, 0xbe, 0x85, 0x3f, 0x93, 0x04, 0x1a, - 0x17, 0x53, 0x6b, 0xa1, 0xe4, 0x22, 0x9a, 0xdf, 0xc9, 0xfd, 0xac, 0xac, - 0xbb, 0xbf, 0x08, 0x8b, 0xa7, 0x5e, 0xaa, 0x69, 0x1d, 0xb5, 0x3a, 0xe1, - 0x2c, 0x31, 0x4d, 0x4f, 0x58, 0x8b, 0x6c, 0x0f, 0x83, 0x1f, 0x9b, 0x5c, - 0x94, 0x24, 0xe4, 0x01, 0xab, 0xcb, 0xa9, 0xd8, 0xdb, 0x77, 0x83, 0xbf, - 0x8e, 0xa5, 0x8a, 0xe9, 0x91, 0xf2, 0xc9, 0xdb, 0x25, 0x4d, 0x4b, 0x9f, - 0xca, 0x16, 0x20, 0x2a, 0x04, 0x7d, 0x7f, 0xf1, 0x60, 0x07, 0x5a, 0x5c, - 0x5f, 0xaf, 0x54, 0x6c, 0x0d, 0x1b, 0x16, 0x51, 0x12, 0xfd, 0x6f, 0x77, - 0x2b, 0xc7, 0x6c, 0x93, 0x48, 0xa1, 0x55, 0xe7, 0x35, 0xea, 0x16, 0xd3, - 0x02, 0xb7, 0x3d, 0x2f, 0x25, 0xe6, 0x41, 0x87, 0x56, 0x8f, 0xdc, 0x39, - 0x1a, 0x48, 0xb9, 0x99, 0xb8, 0x4d, 0x14, 0x55, 0x47, 0xee, 0x18, 0x52, - 0x09, 0xd1, 0x50, 0xec, 0x87, 0x8c, 0x9f, 0x86, 0x35, 0x1a, 0xaf, 0x55, - 0x7d, 0x6c, 0xef, 0x57, 0x1a, 0xd0, 0x5f, 0x40, 0x2c, 0xc3, 0xbe, 0xfa, - 0xbd, 0x93, 0xb8, 0xa2, 0xa5, 0xd8, 0xb4, 0xca, 0xb8, 0x13, 0x3e, 0x45, - 0x16, 0x13, 0xca, 0x27, 0x36, 0x05, 0x71, 0x3a, 0x88, 0xe9, 0x66, 0xa2, - 0xdf, 0xd3, 0x92, 0x70, 0x2a, 0x8c, 0x35, 0xf5, 0x79, 0x4c, 0xcf, 0x87, - 0x4a, 0x7d, 0xb4, 0x7b, 0x86, 0xde, 0x95, 0x22, 0x72, 0xd2, 0x94, 0xf5, - 0x4d, 0xd8, 0xcf, 0x5e, 0x89, 0x22, 0xe9, 0x87, 0xa9, 0x91, 0xde, 0x68, - 0x4f, 0x28, 0x5a, 0x25, 0xe1, 0x98, 0x40, 0xfd, 0x49, 0xe9, 0x10, 0x26, - 0x18, 0x7d, 0x05, 0xa4, 0xb7, 0xe3, 0x14, 0x22, 0xab, 0x5d, 0x5c, 0x1d, - 0xf0, 0xc9, 0x93, 0x56, 0x16, 0xbe, 0x8b, 0xda, 0x3f, 0x46, 0x1a, 0x98, - 0xc9, 0xe9, 0x8b, 0x12, 0x4f, 0xfc, 0x7c, 0xb7, 0xf7, 0xd8, 0xcc, 0xbd, - 0x59, 0x65, 0xa7, 0x0e, 0x0d, 0x67, 0x97, 0xe6, 0x54, 0x2d, 0xa6, 0x25, - 0x6d, 0xa8, 0xdb, 0xbb, 0xcd, 0xde, 0xaf, 0x8c, 0x69, 0x7c, 0xff, 0x08, - 0x1a, 0xeb, 0x94, 0xea, 0x7d, 0x28, 0xb1, 0x72, 0x2b, 0x1a, 0x7b, 0x95, - 0x31, 0x88, 0x25, 0x6d, 0xbb, 0xd2, 0x66, 0xda, 0x2b, 0x14, 0x5b, 0x33, - 0x09, 0xde, 0xea, 0x8f, 0x78, 0x3c, 0x45, 0x1d, 0xf4, 0xdc, 0xb0, 0x26, - 0xd7, 0x2e, 0xf7, 0x29, 0x17, 0xff, 0xf5, 0xae, 0x29, 0x01, 0xae, 0x2a, - 0x3c, 0x7c, 0xad, 0x9c, 0x4f, 0x6d, 0xf4, 0xa1, 0xed, 0xcc, 0xee, 0xbd, - 0x54, 0xbf, 0xc2, 0x25, 0x85, 0xac, 0x95, 0xe2, 0x74, 0x18, 0xd7, 0x30, - 0xc2, 0x71, 0x93, 0xc8, 0xb3, 0xbd, 0xfd, 0x43, 0x25, 0x31, 0x83, 0x92, - 0x50, 0x95, 0xd9, 0x62, 0x9f, 0x31, 0x8c, 0x5a, 0x1e, 0xe1, 0xf4, 0x44, - 0x98, 0xa9, 0x13, 0x6e, 0xdb, 0xe0, 0x9e, 0x3e, 0x5a, 0xe2, 0xff, 0x4d, - 0x0e, 0x72, 0x6c, 0xa3, 0xeb, 0x7c, 0xb9, 0x99, 0x17, 0x7a, 0x56, 0x54, - 0xd0, 0x51, 0x3a, 0xb8, 0x56, 0xc4, 0x7a, 0xce, 0x0c, 0xa4, 0xcc, 0xc4, - 0xf4, 0x4c, 0x55, 0x7b, 0x18, 0x95, 0x71, 0x12, 0xa6, 0xe7, 0x6a, 0x97, - 0xe1, 0x1f, 0xf6, 0x8c, 0x0b, 0xd4, 0x99, 0xde, 0x2b, 0x45, 0x20, 0x7e, - 0x87, 0x94, 0xd4, 0xd2, 0x61, 0xdd, 0xf4, 0x49, 0x30, 0x82, 0x27, 0xc9, - 0xcb, 0x6e, 0xde, 0x37, 0x83, 0x52, 0x50, 0x26, 0x3d, 0x65, 0x8a, 0xfe, - 0xeb, 0xfc, 0x7e, 0x15, 0xdc, 0x6c, 0x0c, 0x45, 0x52, 0xf2, 0x79, 0x8a, - 0x1f, 0x70, 0xf7, 0x3f, 0x0f, 0x1e, 0x83, 0x7c, 0xc3, 0x26, 0x15, 0x05, - 0xa1, 0x8f, 0x42, 0x99, 0x0c, 0x9f, 0x57, 0x1a, 0xb3, 0xea, 0xa6, 0x40, - 0x98, 0xaa, 0xe5, 0xbf, 0x07, 0xb6, 0x93, 0xc3, 0x6b, 0x92, 0xdb, 0x22, - 0x35, 0x8a, 0xf4, 0x5c, 0xa1, 0xc9, 0xb6, 0xae, 0xff, 0x99, 0xde, 0xb9, - 0xd8, 0xe3, 0x53, 0xfb, 0xaf, 0x7d, 0xcd, 0x80, 0xd4, 0x9f, 0x71, 0xcb, - 0x6d, 0x03, 0x80, 0x3e, 0x8c, 0x9b, 0x49, 0x90, 0xfb, 0xd7, 0xda, 0xe3, - 0x02, 0x10, 0xe2, 0x6f, 0x18, 0x9f, 0x62, 0x8f, 0xbd, 0x3d, 0x2c, 0x4f, - 0x49, 0x1d, 0x28, 0xf0, 0xfd, 0x78, 0x8e, 0x70, 0xfa, 0x2e, 0x05, 0x16, - 0x19, 0xeb, 0xa3, 0x8a, 0xcc, 0x7b, 0x27, 0x36, 0x9a, 0x0c, 0x72, 0x9f, - 0xbc, 0x58, 0xb0, 0x39, 0x63, 0xaa, 0xaf, 0xfe, 0xa0, 0xfc, 0xcc, 0xad, - 0xde, 0x91, 0x70, 0x8e, 0xfe, 0xce, 0xd7, 0x9e, 0xd1, 0x76, 0x1a, 0x50, - 0x72, 0xf0, 0xfc, 0x29, 0x6c, 0x90, 0x89, 0xd0, 0xd6, 0x17, 0xf5, 0x71, - 0x76, 0x01, 0x7b, 0xf3, 0x44, 0x91, 0x44, 0x2b, 0x93, 0xe2, 0x21, 0x21, - 0x6c, 0xd5, 0x10, 0x1f, 0xc0, 0xab, 0x1b, 0x0a, 0x6e, 0xf8, 0x7a, 0x9c, - 0x0c, 0xa7, 0xfc, 0x64, 0xc7, 0x7e, 0x35, 0x12, 0xe6, 0xaf, 0xb4, 0xa9, - 0x3b, 0xd7, 0xc5, 0xbc, 0xea, 0xdd, 0x8c, 0x3a, 0x86, 0x56, 0xa4, 0xf5, - 0x2c, 0xdf, 0x6a, 0x3b, 0xb0, 0xf4, 0x25, 0x8f, 0x3e, 0x42, 0x73, 0xa4, - 0xa4, 0xe9, 0x4a, 0x03, 0xce, 0x87, 0x40, 0xfc, 0xc5, 0x26, 0x2f, 0x79, - 0xca, 0x1b, 0x99, 0x65, 0x63, 0xcf, 0x50, 0x3b, 0x62, 0x0b, 0x05, 0x0c, - 0xc9, 0xdd, 0xd1, 0xe2, 0x48, 0x35, 0xb1, 0x88, 0x37, 0x7f, 0x3e, 0x23, - 0x6d, 0x92, 0x7b, 0xbf, 0x93, 0x81, 0x94, 0x7f, 0x60, 0x6e, 0x0e, 0x96, - 0x37, 0x28, 0x5a, 0x84, 0x25, 0xe8, 0x16, 0x9c, 0x22, 0x95, 0x09, 0x19, - 0xd7, 0xe8, 0xfe, 0xb6, 0x72, 0x50, 0xbf, 0xae, 0xfa, 0xd2, 0xe3, 0x33, - 0x06, 0x3b, 0x8e, 0x9c, 0x17, 0x9c, 0x62, 0x03, 0xbf, 0xd6, 0x05, 0x1f, - 0x5b, 0x2e, 0x5c, 0xb2, 0xfd, 0xcd, 0x38, 0x39, 0x42, 0x5c, 0x58, 0xc4, - 0x32, 0x82, 0xda, 0xec, 0x92, 0x9a, 0x74, 0x8a, 0x06, 0x66, 0x11, 0xb0, - 0x3f, 0xd0, 0xcf, 0xd0, 0x9c, 0x46, 0x35, 0x6a, 0x5d, 0xf8, 0x9c, 0xe7, - 0x24, 0x2b, 0x83, 0x45, 0x34, 0xc5, 0x9b, 0xb0, 0xc5, 0x9f, 0xd7, 0x08, - 0xb8, 0xe7, 0x3c, 0x3c, 0x02, 0xd6, 0x84, 0xf9, 0x01, 0xb2, 0xa1, 0xa2, - 0x80, 0xe2, 0x12, 0x3e, 0xa4, 0xf5, 0x74, 0x2e, 0xcf, 0x10, 0x6f, 0xb0, - 0x86, 0x82, 0xcc, 0x25, 0xb8, 0x18, 0x70, 0xdc, 0x9b, 0x1e, 0x0a, 0x55, - 0xc2, 0x25, 0x6f, 0x33, 0xe2, 0x10, 0x31, 0xfb, 0x3d, 0x97, 0xd0, 0x15, - 0xf6, 0x23, 0xf6, 0xaa, 0xf6, 0x48, 0xc0, 0xc0, 0xa4, 0x2a, 0x77, 0x22, - 0x99, 0x67, 0xcc, 0x7b, 0x36, 0x3d, 0x5b, 0xc1, 0x04, 0xc0, 0xbf, 0xdd, - 0xd4, 0x1b, 0x80, 0xbf, 0x89, 0xf5, 0x40, 0xaa, 0xce, 0xce, 0x63, 0xf0, - 0x95, 0xe6, 0xca, 0xe4, 0x69, 0xf1, 0x93, 0x25, 0x74, 0x2f, 0x89, 0x4b, - 0x76, 0xb9, 0xe5, 0x01, 0xd9, 0xfb, 0xb4, 0x39, 0x3b, 0x5d, 0x42, 0xaf, - 0x90, 0xaf, 0x25, 0xaa, 0x3d, 0x7c, 0x37, 0xea, 0x3e, 0x27, 0x76, 0xeb, - 0x60, 0xbd, 0x08, 0xa5, 0x2c, 0x73, 0xce, 0x1f, 0x1a, 0x2e, 0x0d, 0x49, - 0xd0, 0xff, 0xa9, 0x22, 0x3b, 0xc9, 0xf1, 0x44, 0x57, 0x4e, 0x2a, 0x89, - 0xe7, 0x77, 0xe4, 0x9c, 0x1a, 0xb5, 0x85, 0xfc, 0x17, 0xa9, 0xd3, 0x75, - 0x2e, 0x23, 0xd4, 0x88, 0x64, 0xa3, 0x83, 0x8d, 0xf0, 0xd7, 0x44, 0xf6, - 0x98, 0x44, 0x3e, 0xfe, 0x6c, 0xa3, 0x3e, 0x6b, 0xf1, 0xb2, 0x12, 0x18, - 0xb2, 0x69, 0xdc, 0x1c, 0xa2, 0x37, 0x2a, 0x1f, 0x64, 0x72, 0x69, 0xb5, - 0xdd, 0x5e, 0x04, 0xea, 0xe7, 0xea, 0x74, 0x27, 0x10, 0x40, 0x08, 0x13, - 0x1d, 0xf3, 0x03, 0x68, 0x5b, 0x25, 0x83, 0xfa, 0xf9, 0x93, 0xc4, 0x39, - 0x86, 0xcb, 0x32, 0xa3, 0xf3, 0xbe, 0xd6, 0x15, 0xb0, 0x4f, 0xff, 0x6a, - 0x9b, 0xc1, 0x19, 0xb0, 0x50, 0x30, 0xdc, 0x7b, 0x2a, 0xdd, 0xfb, 0x2d, - 0xda, 0x49, 0x72, 0x45, 0x18, 0x95, 0x4c, 0x0d, 0x9e, 0xba, 0x07, 0x22, - 0xf4, 0xc3, 0x04, 0x08, 0x05, 0x7f, 0x7d, 0x23, 0xad, 0xaf, 0x1e, 0xa7, - 0x77, 0x66, 0x9c, 0xbb, 0x8b, 0xe9, 0xa1, 0x5f, 0xda, 0x68, 0x39, 0x62, - 0x19, 0xee, 0xe1, 0x78, 0x1f, 0x9f, 0x6e, 0x7f, 0x01, 0xc7, 0x6f, 0x37, - 0xeb, 0xd2, 0x1a, 0xb8, 0x1b, 0xf2, 0x13, 0xc7, 0x65, 0x9e, 0x13, 0x56, - 0x2f, 0x8b, 0xbe, 0x15, 0xcc, 0xfb, 0x81, 0x3c, 0x97, 0x58, 0x72, 0xc5, - 0x22, 0x24, 0x34, 0x1f, 0xeb, 0x67, 0xc5, 0x27, 0x44, 0x36, 0xda, 0xbc, - 0x77, 0x3d, 0x55, 0x7f, 0xd4, 0x60, 0xc1, 0xeb, 0xe6, 0x10, 0x61, 0x73, - 0x1e, 0x44, 0x04, 0xe9, 0x8e, 0x63, 0xb8, 0xe0, 0x35, 0x21, 0x79, 0x51, - 0x7f, 0xf9, 0xdf, 0x01, 0x2a, 0x90, 0x30, 0xdb, 0x5e, 0x68, 0xc9, 0x12, - 0x48, 0x73, 0x35, 0xe3, 0xa3, 0x5a, 0xab, 0x4f, 0x62, 0xc8, 0xe2, 0xbe, - 0x01, 0x88, 0xd4, 0x29, 0xa7, 0xab, 0x5e, 0x59, 0x44, 0xb5, 0xd0, 0x26, - 0x1f, 0x65, 0xa5, 0xa0, 0x24, 0x54, 0x11, 0x14, 0xad, 0x5a, 0xab, 0x6a, - 0x05, 0xe0, 0x85, 0x87, 0x69, 0x13, 0x05, 0xfc, 0xee, 0x44, 0x89, 0x24, - 0xdb, 0xc1, 0x2a, 0x46, 0x96, 0x2b, 0x44, 0x51, 0x3c, 0x4a, 0x52, 0xe3, - 0xaf, 0xdd, 0xb7, 0x1e, 0x2c, 0xaa, 0xad, 0xe0, 0x4e, 0x31, 0xa1, 0x73, - 0xea, 0x50, 0x91, 0x88, 0x05, 0x54, 0x2f, 0x56, 0x59, 0x9b, 0xfd, 0xbf, - 0x0e, 0x25, 0x0b, 0xa9, 0x47, 0x66, 0x4e, 0xc1, 0x65, 0x5c, 0x32, 0x4e, - 0xb8, 0x58, 0xbc, 0xdf, 0xcd, 0x97, 0x73, 0x24, 0xa1, 0xc8, 0x19, 0x72, - 0x4d, 0xa1, 0x83, 0x45, 0x5f, 0xb5, 0x16, 0xf0, 0x62, 0x8b, 0xa4, 0xc4, - 0x0b, 0x0b, 0x86, 0x0e, 0xfd, 0x66, 0xa6, 0x30, 0x2b, 0xd1, 0xb7, 0xa9, - 0xff, 0x0f, 0xd2, 0x29, 0xfc, 0xee, 0x7b, 0xab, 0x0e, 0xf2, 0xfe, 0xf7, - 0x90, 0x37, 0x2d, 0xae, 0xc4, 0x33, 0xfc, 0xcf, 0x45, 0x54, 0xc9, 0x4c, - 0x80, 0xd4, 0xb0, 0xe7, 0xb8, 0xcb, 0xba, 0x55, 0x0f, 0x0b, 0x16, 0xa4, - 0x95, 0x83, 0x96, 0xa4, 0x8d, 0x6d, 0x47, 0x12, 0x98, 0x25, 0x67, 0x55, - 0x98, 0x6b, 0xbc, 0x17, 0x42, 0x92, 0x88, 0x0b, 0x8d, 0x58, 0x91, 0x97, - 0xad, 0xee, 0x58, 0x4c, 0x9a, 0x07, 0xeb, 0xee, 0xd7, 0x9d, 0xe8, 0x39, - 0xee, 0x47, 0x41, 0x63, 0xc4, 0xa1, 0x6b, 0x2c, 0x7f, 0x61, 0xfd, 0xb5, - 0x6a, 0x18, 0x0a, 0x38, 0xf8, 0xf9, 0x07, 0xf0, 0x32, 0xfa, 0xd9, 0x91, - 0xc4, 0xe6, 0x15, 0x9a, 0x31, 0xb7, 0x7c, 0x8b, 0x9f, 0x6a, 0xd4, 0xb0, - 0xf5, 0x84, 0x25, 0x5a, 0xd0, 0xba, 0xf5, 0x4e, 0x4a, 0xb2, 0xef, 0xac, - 0x48, 0xee, 0xdb, 0x2f, 0x98, 0x3d, 0x0e, 0x00, 0x9a, 0x2e, 0xd6, 0x4b, - 0x58, 0x1c, 0x6d, 0x67, 0x2f, 0x66, 0xd2, 0xe9, 0xa8, 0x9b, 0x52, 0xb9, - 0xc2, 0x95, 0xeb, 0xee, 0x30, 0x8e, 0x26, 0x9a, 0xae, 0x14, 0x75, 0xb5, - 0xb7, 0x75, 0x25, 0xf4, 0xfd, 0xdc, 0x08, 0x13, 0x2a, 0x16, 0x80, 0x1c, - 0x3a, 0xb2, 0x25, 0x75, 0x8c, 0x58, 0x28, 0x70, 0x2c, 0xee, 0xe6, 0x6f, - 0xe4, 0x3a, 0xf6, 0x69, 0x3c, 0xd9, 0x6d, 0x45, 0x2e, 0xa7, 0x74, 0x74, - 0xb5, 0xf1, 0xb0, 0xb6, 0x56, 0x98, 0x89, 0xb1, 0x29, 0xbf, 0x84, 0xd3, - 0xe2, 0xd4, 0x9a, 0x26, 0x8f, 0x5d, 0xd0, 0xfd, 0xd0, 0x39, 0x2b, 0x7e, - 0x9f, 0x68, 0x0f, 0x66, 0x37, 0x85, 0x6b, 0xca, 0x22, 0x4e, 0x15, 0xe2, - 0xdf, 0xae, 0x1e, 0x2c, 0xac, 0xdc, 0x54, 0xcb, 0xba, 0xfd, 0xca, 0x20, - 0x4a, 0x92, 0x55, 0x97, 0xa2, 0xe0, 0xf8, 0x5a, 0xfa, 0x92, 0x92, 0x7e, - 0xfd, 0xd8, 0x45, 0x9a, 0xb3, 0x30, 0x03, 0x69, 0x8c, 0xa0, 0xfd, 0x79, - 0x6b, 0x0c, 0xfb, 0x47, 0x1f, 0x88, 0x80, 0x98, 0xc8, 0x79, 0x7c, 0x58, - 0xc7, 0x17, 0x43, 0xe2, 0x36, 0x3f, 0x57, 0x63, 0xd6, 0x33, 0xf5, 0x0c, - 0xc0, 0x53, 0xde, 0x6c, 0x77, 0xbc, 0xb8, 0x5b, 0x18, 0x85, 0x94, 0x05, - 0x33, 0x47, 0x6e, 0xf9, 0x2c, 0xda, 0x6b, 0x01, 0xe3, 0xd9, 0x29, 0x33, - 0x45, 0x33, 0x57, 0x75, 0x28, 0xad, 0xf9, 0x62, 0x47, 0x19, 0x53, 0x35, - 0x3b, 0xfd, 0x30, 0x30, 0xce, 0x57, 0x33, 0x86, 0x39, 0x24, 0xdd, 0x66, - 0x6d, 0x1b, 0x9c, 0xe2, 0x3f, 0x0d, 0xf0, 0xa7, 0x05, 0x54, 0x47, 0xd9, - 0x27, 0x71, 0x20, 0xcc, 0x48, 0x4c, 0xa7, 0x22, 0xa7, 0x7d, 0x6b, 0xb4, - 0xcb, 0xfd, 0xcf, 0xd7, 0x9e, 0x65, 0x70, 0xdd, 0x72, 0x48, 0x9f, 0xaf, - 0x92, 0x57, 0xf2, 0x2c, 0xe3, 0x07, 0x06, 0x71, 0x97, 0xdf, 0x66, 0x04, - 0xea, 0xf3, 0x2d, 0xc9, 0x9d, 0x97, 0x79, 0xbd, 0x7c, 0x56, 0x05, 0xfc, - 0xfb, 0x0d, 0x6c, 0x3d, 0x4f, 0x62, 0x42, 0xeb, 0x14, 0x7d, 0xee, 0x49, - 0xac, 0xf5, 0xd0, 0x0d, 0xa9, 0x05, 0x7c, 0x16, 0x9a, 0x32, 0xd6, 0x04, - 0x05, 0x3a, 0xbb, 0x54, 0xa8, 0x3f, 0xbb, 0xdb, 0x1b, 0xe0, 0x76, 0x98, - 0xf0, 0x74, 0xd9, 0xd6, 0x43, 0xa5, 0xa3, 0xe5, 0xbb, 0x34, 0x7b, 0x1d, - 0xa5, 0x26, 0xc8, 0xd6, 0xd2, 0xed, 0x01, 0x77, 0x58, 0xa6, 0x9c, 0x3c, - 0xdf, 0xa8, 0xb2, 0x7a, 0x20, 0xcf, 0xd7, 0x0f, 0x6b, 0x05, 0x5a, 0xba, - 0x39, 0x0b, 0xc2, 0x49, 0xae, 0x6b, 0x7b, 0xdf, 0x5a, 0xcb, 0xbb, 0x65, - 0x1e, 0xf5, 0xb5, 0x12, 0x5d, 0xc2, 0x6b, 0xdb, 0x0d, 0x50, 0xa9, 0xab, - 0xc7, 0x62, 0x8f, 0x02, 0x28, 0x71, 0x79, 0x57, 0xa8, 0x45, 0x00, 0xa9, - 0xa7, 0xb2, 0x8c, 0xa6, 0xff, 0xd8, 0xa1, 0x28, 0x1b, 0xe7, 0x97, 0x4f, - 0xa9, 0x5f, 0x6e, 0xae, 0x54, 0x7b, 0x47, 0x4d, 0xc2, 0x76, 0xce, 0x0d, - 0x1e, 0xa0, 0x05, 0x04, 0x4c, 0xcf, 0x82, 0xb7, 0x0a, 0xe8, 0x91, 0x3d, - 0x1a, 0xa0, 0x2f, 0x7b, 0x57, 0xff, 0xe5, 0xab, 0x06, 0x9e, 0xfb, 0x87, - 0xad, 0x53, 0xc2, 0x08, 0xa9, 0x8d, 0x34, 0x0b, 0xd7, 0x6f, 0xcc, 0xa3, - 0x1f, 0xc6, 0x80, 0x21, 0xee, 0xb0, 0x75, 0x8a, 0x2d, 0x03, 0x07, 0x02, - 0x43, 0x54, 0x16, 0x3b, 0x5a, 0x85, 0x38, 0x83, 0xeb, 0xb2, 0x44, 0xc0, - 0xee, 0xda, 0xc9, 0x12, 0x4d, 0x34, 0x23, 0xdd, 0x66, 0xf0, 0x49, 0xc1, - 0xa3, 0x92, 0x2a, 0x76, 0x6c, 0xa8, 0x4b, 0xd9, 0x6b, 0x78, 0x8b, 0x7f, - 0x4a, 0x4f, 0x2f, 0x33, 0xf1, 0x26, 0x04, 0xb9, 0x5e, 0x0a, 0xbc, 0xac, - 0xd2, 0x7b, 0xaa, 0x1c, 0x8f, 0x8e, 0xad, 0x21, 0x88, 0x18, 0xd1, 0x25, - 0x7e, 0x22, 0x47, 0xd4, 0xa4, 0x1c, 0x76, 0x96, 0xd7, 0x81, 0x60, 0xd5, - 0x74, 0x7f, 0x84, 0x0e, 0x1d, 0x25, 0x30, 0x2d, 0xc5, 0x0f, 0x9c, 0xb7, - 0x3d, 0x96, 0x41, 0xdc, 0x7f, 0x87, 0xfd, 0x6e, 0x24, 0x3e, 0x80, 0xf6, - 0x6a, 0xdd, 0x9b, 0x1d, 0xb4, 0x51, 0xad, 0x9f, 0x39, 0x16, 0xcc, 0x36, - 0xc4, 0xe9, 0x4b, 0xd0, 0x2a, 0x58, 0x88, 0x1b, 0xd0, 0x6c, 0xed, 0x0c, - 0xc1, 0x74, 0x4f, 0xef, 0x28, 0x1d, 0x2c, 0x07, 0x07, 0x0a, 0x45, 0x38, - 0x35, 0x2b, 0x04, 0x22, 0x61, 0x16, 0x07, 0x38, 0x4a, 0x34, 0x0c, 0xe1, - 0x33, 0xe5, 0x97, 0x75, 0x91, 0x6b, 0xb7, 0xb1, 0x91, 0x01, 0x7d, 0x4f, - 0xf4, 0xc2, 0xcf, 0x7f, 0xe3, 0x61, 0xfb, 0x76, 0x1c, 0x3b, 0x01, 0x00, - 0x56, 0xa9, 0x23, 0xd0, 0x91, 0x21, 0xa5, 0x04, 0x94, 0xd6, 0x25, 0x70, - 0x6d, 0x84, 0x0b, 0xc6, 0x35, 0xa7, 0x17, 0x3d, 0x30, 0xa5, 0x4c, 0xbf, - 0x60, 0xa4, 0x97, 0xa1, 0x80, 0x8c, 0xa3, 0x21, 0x7b, 0x2a, 0x6e, 0x4d, - 0xe3, 0xfb, 0x77, 0xa0, 0x86, 0xe0, 0xf0, 0x4f, 0xca, 0xac, 0x36, 0x62, - 0x84, 0x48, 0x52, 0xbc, 0x6b, 0x70, 0x49, 0x3f, 0x69, 0xab, 0xeb, 0x6f, - 0x5f, 0xd1, 0xc7, 0x46, 0x1a, 0x8f, 0x0d, 0x7e, 0xe9, 0xfb, 0x55, 0x0b, - 0xa0, 0xa6, 0x54, 0x40, 0xf8, 0x10, 0x92, 0x76, 0x57, 0x6a, 0x8a, 0x17, - 0x4a, 0xe0, 0x9d, 0x00, 0xfd, 0x1a, 0x77, 0x0e, 0xbf, 0xce, 0x2f, 0xca, - 0x43, 0x88, 0xff, 0x38, 0x10, 0xdd, 0xbb, 0x58, 0x4c, 0x5b, 0x59, 0x4f, - 0x5f, 0x05, 0xc9, 0xd5, 0x15, 0x0d, 0x91, 0x00, 0x43, 0xf3, 0x7c, 0xd5, - 0x93, 0x96, 0x77, 0x2b, 0x1e, 0xd0, 0xf4, 0xb0, 0x42, 0x21, 0x41, 0x75, - 0x53, 0xd7, 0xd3, 0x07, 0xab, 0x41, 0x86, 0x80, 0x7c, 0x5b, 0xc4, 0xec, - 0x46, 0xfa, 0xf1, 0x90, 0xdd, 0x7e, 0x71, 0xa8, 0x3d, 0x87, 0xf1, 0x79, - 0x71, 0x17, 0x29, 0xb7, 0xce, 0x21, 0x87, 0xef, 0x44, 0xe8, 0x44, 0xdf, - 0xbb, 0x35, 0x88, 0x37, 0x10, 0xdc, 0xce, 0xf4, 0x9a, 0x4f, 0x96, 0x53, - 0x6d, 0x5d, 0xb8, 0x0e, 0x38, 0xf7, 0x48, 0x06, 0xbe, 0xca, 0xc9, 0x8f, - 0xa6, 0x49, 0xf9, 0x2c, 0x7a, 0xe0, 0x94, 0xad, 0xac, 0x62, 0x93, 0x4e, - 0xde, 0x61, 0xe0, 0xb8, 0x7d, 0x51, 0xc9, 0xcc, 0x8e, 0x0c, 0x20, 0x55, - 0xa9, 0x36, 0xc3, 0x93, 0xa6, 0xea, 0x38, 0x80, 0x94, 0x2b, 0x0d, 0xa7, - 0x3a, 0x45, 0x93, 0x26, 0x01, 0x9b, 0x65, 0x8f, 0x66, 0xdc, 0x73, 0x68, - 0x8d, 0x7c, 0x33, 0xa9, 0x22, 0x1b, 0x04, 0x5c, 0x83, 0x5b, 0x04, 0xd6, - 0x11, 0x8c, 0x65, 0x08, 0x69, 0xf5, 0xd4, 0x94, 0x66, 0x1f, 0x61, 0x8a, - 0x55, 0xbf, 0xf8, 0x0f, 0x84, 0x05, 0x86, 0xf7, 0x46, 0xf6, 0xe1, 0x97, - 0x05, 0x24, 0x2a, 0x37, 0xa8, 0x5d, 0xb6, 0x7f, 0xf5, 0xaa, 0xb3, 0x4f, - 0x10, 0x65, 0x09, 0xb3, 0x3d, 0x0d, 0x2e, 0xff, 0x11, 0xfd, 0x2c, 0x12, - 0xf3, 0x03, 0x6b, 0xd3, 0xd1, 0xc9, 0x8b, 0x6d, 0x56, 0x80, 0x64, 0x74, - 0x03, 0x3b, 0xb2, 0x0b, 0xe5, 0x08, 0xfa, 0x0c, 0x9a, 0x23, 0xe6, 0x88, - 0xc0, 0xbe, 0x5a, 0x22, 0xe1, 0x0e, 0xbc, 0xd7, 0xba, 0x48, 0x95, 0x24, - 0xc5, 0x9c, 0x3f, 0xa4, 0xff, 0x8a, 0x56, 0x34, 0x4e, 0x7c, 0x45, 0x0c, - 0xee, 0xf3, 0xe4, 0x1f, 0x48, 0xe9, 0xbf, 0xa2, 0x3e, 0xc0, 0x90, 0xa8, - 0xf2, 0xd8, 0x56, 0x92, 0xe3, 0x0b, 0x4d, 0x37, 0x97, 0x98, 0xfc, 0x67, - 0x92, 0x0a, 0x6c, 0x81, 0xd1, 0x33, 0x37, 0x64, 0xbd, 0xa6, 0xa6, 0xdf, - 0xf0, 0x69, 0x73, 0x83, 0x3c, 0x6e, 0x88, 0xfe, 0xb9, 0x4a, 0x22, 0xe1, - 0x96, 0x1e, 0x5a, 0x90, 0x3f, 0x72, 0x2e, 0xe8, 0xf2, 0x79, 0x84, 0x5c, - 0x61, 0x97, 0x28, 0x86, 0xc7, 0xbb, 0x07, 0xb5, 0x53, 0x63, 0xa2, 0xb0, - 0xb1, 0x2d, 0x56, 0xc9, 0x66, 0x6d, 0x53, 0xaa, 0x3b, 0xb5, 0xc0, 0x80, - 0x69, 0x6d, 0x9c, 0xa6, 0xb9, 0x0c, 0xc8, 0x2d, 0xcb, 0xd7, 0xa1, 0xec, - 0x73, 0xc7, 0x23, 0xc0, 0xf0, 0x8d, 0x97, 0xb6, 0x72, 0xdc, 0x58, 0x47, - 0x67, 0x3c, 0xde, 0xa6, 0x67, 0xa7, 0x09, 0x50, 0x7b, 0x65, 0xf2, 0x02, - 0x7f, 0xd4, 0xb2, 0x6f, 0x8c, 0x4e, 0x49, 0x75, 0x8e, 0x4d, 0x1c, 0xc0, - 0xc4, 0x14, 0xb1, 0xca, 0x95, 0x31, 0x73, 0xf5, 0x7d, 0xc6, 0x9b, 0x13, - 0xf9, 0xdb, 0x51, 0x1c, 0x76, 0xa7, 0xe4, 0x94, 0xbc, 0x89, 0xeb, 0x32, - 0xb5, 0xad, 0x5a, 0x48, 0x25, 0xf2, 0x24, 0x0f, 0x38, 0xcf, 0x75, 0x91, - 0x3a, 0x2a, 0x3b, 0xd4, 0xf2, 0x43, 0x99, 0xa6, 0x5b, 0x49, 0xba, 0xc9, - 0xd4, 0xbd, 0x80, 0x99, 0x34, 0x79, 0xf3, 0xd2, 0x71, 0x23, 0x0f, 0x4d, - 0x7d, 0x2a, 0x93, 0xb2, 0xd1, 0x5e, 0xf4, 0x10, 0xa1, 0xe8, 0x78, 0x96, - 0x00, 0x98, 0x8e, 0x9a, 0xe6, 0x5f, 0x46, 0x6a, 0x61, 0xa3, 0xb1, 0x76, - 0xa1, 0xa3, 0x52, 0x3d, 0x77, 0xef, 0x68, 0x9a, 0xec, 0x84, 0xad, 0xcb, - 0xb4, 0xbf, 0x2c, 0xcb, 0x2f, 0x41, 0x82, 0x6d, 0x30, 0xcc, 0xdd, 0x3a, - 0x66, 0x94, 0x84, 0x53, 0xdf, 0x07, 0x49, 0xf4, 0x6b, 0xd2, 0x01, 0xa8, - 0xff, 0x6f, 0x1c, 0xb9, 0x7e, 0xe4, 0x24, 0x30, 0x31, 0x2f, 0xb4, 0x3a, - 0x0b, 0x53, 0xec, 0xad, 0xe2, 0xf0, 0x2c, 0xba, 0xae, 0x0a, 0xa1, 0xd7, - 0x4a, 0x6d, 0xaf, 0xb7, 0x9e, 0xf9, 0xcc, 0x27, 0xe1, 0xb3, 0xa1, 0xe8, - 0xc8, 0x8f, 0xad, 0x75, 0x71, 0xdf, 0x84, 0x1f, 0x6b, 0xe0, 0xfd, 0xe7, - 0x12, 0xf1, 0x93, 0x3a, 0x8d, 0x9e, 0xc8, 0x26, 0xad, 0x29, 0x5c, 0xdf, - 0x40, 0x72, 0x62, 0x0a, 0x77, 0x4d, 0xe7, 0x66, 0x8a, 0x02, 0xed, 0x68, - 0x48, 0xee, 0xa3, 0xe5, 0x8b, 0x23, 0xca, 0x0f, 0xd6, 0x6b, 0xe9, 0x71, - 0x2c, 0xc2, 0x3d, 0x20, 0x2b, 0x67, 0x68, 0x5d, 0x4d, 0xa8, 0x14, 0x07, - 0x88, 0x6f, 0x93, 0x73, 0x5b, 0x2c, 0x1f, 0x34, 0xd1, 0xb1, 0x51, 0xa5, - 0xab, 0xf9, 0x81, 0xa3, 0xcf, 0x67, 0x1f, 0x8f, 0xd1, 0xee, 0xe1, 0x9f, - 0x14, 0x9a, 0xb5, 0xca, 0x24, 0x68, 0x5d, 0x47, 0x59, 0x57, 0x87, 0x3c, - 0x1e, 0xcd, 0x25, 0x24, 0x86, 0x97, 0x2a, 0xa5, 0xb6, 0x27, 0xb1, 0x75, - 0xb9, 0xd7, 0x1f, 0xd7, 0x1d, 0x7a, 0xad, 0xab, 0xbf, 0x09, 0x4d, 0x32, - 0xe4, 0x57, 0x07, 0xe8, 0xe8, 0x57, 0x6f, 0x05, 0xdb, 0xd0, 0xc7, 0xc6, - 0xa3, 0x93, 0x29, 0x57, 0xa0, 0xec, 0xbb, 0xe7, 0x3a, 0x93, 0xaa, 0x60, - 0x6a, 0x2c, 0x70, 0x28, 0x4a, 0xb4, 0x85, 0xe0, 0x63, 0xa7, 0x26, 0xef, - 0xca, 0x27, 0x6a, 0x82, 0x5c, 0x2d, 0x81, 0x7d, 0x9e, 0x0e, 0x3c, 0xaf, - 0x75, 0x69, 0x73, 0x86, 0xa8, 0x65, 0xda, 0x31, 0xe4, 0xbd, 0x07, 0x1e, - 0x47, 0x3e, 0x35, 0x6c, 0x29, 0x1c, 0x79, 0x3c, 0xe0, 0x8b, 0x76, 0x86, - 0x4e, 0x99, 0xa6, 0x33, 0xce, 0xbd, 0xf8, 0x1b, 0xc9, 0x69, 0x5b, 0x5d, - 0x06, 0x98, 0xb0, 0xf1, 0xad, 0xee, 0xe1, 0x9a, 0x0b, 0xb7, 0x89, 0x7f, - 0x56, 0x66, 0x90, 0xca, 0x3a, 0x4f, 0xcb, 0x07, 0x40, 0x79, 0xca, 0xd0, - 0xed, 0xa3, 0x14, 0x71, 0x6e, 0xe7, 0x43, 0x20, 0x4f, 0xb2, 0xc1, 0x36, - 0xa7, 0xcd, 0x62, 0x07, 0x7a, 0xbb, 0x91, 0x7c, 0xf6, 0x0a, 0xd0, 0xc8, - 0x1d, 0xff, 0xc3, 0xeb, 0xdb, 0x5a, 0x52, 0xba, 0x62, 0xfa, 0x82, 0xea, - 0xd0, 0xcb, 0xe0, 0x1e, 0xcc, 0x7c, 0x43, 0xf3, 0xe3, 0xb4, 0xe3, 0xc9, - 0xce, 0x43, 0x83, 0xee, 0xfb, 0x6a, 0x90, 0xa5, 0xe9, 0x70, 0x51, 0x9f, - 0x6d, 0xea, 0xa9, 0x02, 0x62, 0xad, 0xea, 0xc4, 0x7a, 0xf4, 0x74, 0xfd, - 0x99, 0xdb, 0xa8, 0x50, 0x64, 0x28, 0x9a, 0x4a, 0xd3, 0x52, 0xe1, 0x30, - 0xe9, 0x4a, 0xc4, 0xc1, 0xde, 0x99, 0x28, 0x1a, 0x1b, 0x1f, 0x8f, 0x81, - 0x56, 0xf6, 0x82, 0xc5, 0x03, 0x0d, 0x84, 0xa9, 0x0d, 0x7a, 0x4d, 0xbf, - 0xcd, 0x95, 0x3b, 0xa9, 0xbe, 0x64, 0x4f, 0x70, 0xfd, 0x4a, 0xfa, 0x37, - 0x97, 0x44, 0x6b, 0x80, 0x95, 0x8e, 0x2a, 0xfa, 0xe0, 0x37, 0x09, 0x8e, - 0x61, 0xf1, 0x1e, 0x0b, 0xfb, 0x95, 0xb8, 0xde, 0x0d, 0x59, 0x4b, 0xd2, - 0x0d, 0x4a, 0x1b, 0x30, 0x0b, 0x2b, 0xe0, 0xde, 0x0b, 0x90, 0xec, 0x45, - 0x21, 0xc4, 0xb8, 0xcc, 0xd8, 0xbb, 0x46, 0xc1, 0x57, 0xbf, 0x05, 0x30, - 0x3c, 0x5b, 0x68, 0x38, 0x7b, 0x38, 0xbf, 0x5a, 0x70, 0x85, 0xbf, 0xef, - 0x81, 0x85, 0x8c, 0xb0, 0x15, 0x8a, 0x34, 0x00, 0x02, 0xe5, 0xbe, 0x6a, - 0x09, 0xe7, 0xc4, 0xec, 0xd8, 0x5e, 0x7a, 0x7d, 0xa8, 0xea, 0xb2, 0x67, - 0x4a, 0x44, 0x7f, 0x2e, 0x97, 0x7d, 0x5b, 0xf2, 0xac, 0x69, 0x65, 0x61, - 0x4b, 0xa6, 0x89, 0x48, 0xe6, 0x3f, 0x42, 0xe5, 0xa4, 0xa8, 0x24, 0xdd, - 0x4e, 0x02, 0x99, 0x23, 0xbd, 0x9f, 0x1d, 0xb7, 0x94, 0x67, 0xbf, 0x66, - 0xe7, 0xab, 0x87, 0xb6, 0x12, 0x1a, 0xfa, 0xd2, 0x14, 0x65, 0x3a, 0x3e, - 0x69, 0x59, 0x30, 0xc7, 0xe4, 0xab, 0xf2, 0x42, 0xfb, 0x1b, 0xa8, 0x57, - 0xe5, 0x61, 0x78, 0x0d, 0x79, 0xaf, 0xc3, 0xd8, 0x67, 0x5a, 0x79, 0xb0, - 0x94, 0x6c, 0x23, 0xdf, 0x35, 0x9e, 0x72, 0xed, 0x3b, 0x5a, 0x71, 0x42, - 0xac, 0x3a, 0x02, 0x36, 0x5e, 0x82, 0xa7, 0x05, 0x0a, 0x87, 0xcb, 0xd5, - 0xbe, 0x01, 0x61, 0x29, 0xff, 0x6d, 0x85, 0x57, 0x72, 0x50, 0x53, 0x87, - 0xff, 0x05, 0xa2, 0xed, 0x0c, 0x0c, 0x9a, 0x41, 0x36, 0x29, 0x55, 0x21, - 0xdf, 0x2c, 0xf9, 0x9a, 0xb2, 0x07, 0xca, 0xd7, 0x3f, 0x2b, 0xab, 0x25, - 0xcb, 0x97, 0xdf, 0x45, 0xc7, 0x40, 0x1d, 0x44, 0x65, 0xb6, 0x65, 0x00, - 0xac, 0x91, 0x9e, 0x17, 0x3f, 0xb2, 0xdc, 0xe0, 0x82, 0x46, 0x68, 0xe6, - 0x47, 0x99, 0x57, 0xd0, 0x52, 0xf0, 0x9b, 0x2a, 0x5f, 0x4f, 0x2a, 0x21, - 0xee, 0x81, 0xd6, 0x30, 0x72, 0x37, 0x4e, 0xa8, 0x77, 0x39, 0xde, 0x8b, - 0x02, 0xe3, 0x81, 0xa7, 0x0b, 0x2d, 0xf4, 0x67, 0xea, 0xc9, 0x57, 0x65, - 0x0a, 0xb7, 0xbe, 0xaf, 0x8c, 0x1a, 0xd0, 0x26, 0x53, 0x80, 0x01, 0x41, - 0x2d, 0xfd, 0xb2, 0xc1, 0x07, 0x6f, 0xc9, 0x8d, 0x21, 0x6c, 0x9c, 0x1f, - 0x8c, 0x5a, 0x95, 0xda, 0xd6, 0x48, 0xbf, 0x7b, 0xa0, 0xdb, 0xba, 0xff, - 0xe7, 0xe4, 0x65, 0xf4, 0xd9, 0x98, 0xce, 0xdb, 0xc9, 0x68, 0xc2, 0xa3, - 0x1b, 0x79, 0xff, 0xc1, 0x09, 0xc3, 0x5d, 0x7c, 0x34, 0xb9, 0xad, 0x23, - 0x52, 0x19, 0x36, 0x27, 0x5c, 0x96, 0x3a, 0xab, 0xd3, 0x21, 0xc1, 0x76, - 0x08, 0x2e, 0x14, 0x8a, 0xac, 0x5a, 0x6a, 0x4f, 0xc6, 0x06, 0x25, 0x61, - 0x2c, 0xdd, 0x5b, 0x37, 0x49, 0xce, 0xb4, 0x6c, 0x89, 0xb8, 0xc0, 0xa2, - 0xa0, 0xa1, 0x6b, 0xa5, 0xb3, 0x97, 0x38, 0x44, 0x5d, 0xdb, 0xec, 0x51, - 0xc2, 0x12, 0xb6, 0x9b, 0x93, 0x1e, 0x99, 0xcc, 0x70, 0xe7, 0xf1, 0xca, - 0x96, 0xc9, 0x1a, 0xaf, 0xb5, 0xb0, 0x11, 0x30, 0xcb, 0xce, 0xee, 0x20, - 0xd0, 0x85, 0x33, 0x2b, 0xbe, 0xf6, 0x8b, 0xb9, 0xb1, 0x60, 0xa1, 0x2d, - 0xb3, 0xf3, 0x84, 0xa4, 0xc1, 0x59, 0x6d, 0x2a, 0x61, 0x44, 0xbd, 0x18, - 0x93, 0xf6, 0xd7, 0xa8, 0x89, 0xe9, 0xc5, 0x91, 0xac, 0xf0, 0xcf, 0x26, - 0x82, 0x65, 0x56, 0x2d, 0xc5, 0x1b, 0x18, 0x13, 0x96, 0x9a, 0x32, 0xc5, - 0xb8, 0x86, 0x50, 0x47, 0x12, 0xca, 0x39, 0x08, 0xd7, 0xaa, 0xab, 0xf9, - 0x3a, 0x1a, 0x42, 0x19, 0x59, 0xe9, 0x02, 0x8f, 0x2e, 0xc7, 0x7e, 0xc1, - 0x87, 0x98, 0x85, 0x79, 0x9c, 0x46, 0x7d, 0x3f, 0x42, 0xe1, 0xeb, 0x58, - 0x19, 0x45, 0xcb, 0x1c, 0x22, 0xb4, 0x80, 0xc4, 0x8d, 0xec, 0xab, 0xa8, - 0xad, 0x5a, 0x0b, 0xfd, 0x83, 0x18, 0xc2, 0x6d, 0xce, 0xb1, 0xe6, 0x2a, - 0x83, 0x3a, 0xbd, 0x9e, 0xf9, 0x67, 0x84, 0x0a, 0x16, 0xc5, 0xa9, 0xb7, - 0x3a, 0xc7, 0x29, 0xee, 0xd6, 0x95, 0xad, 0x4d, 0x83, 0x00, 0x78, 0x9d, - 0xdf, 0x38, 0x5d, 0xf7, 0xce, 0x52, 0x65, 0x19, 0x7c, 0x4e, 0xef, 0x4d, - 0x05, 0xd3, 0x9a, 0x55, 0x0a, 0x84, 0xec, 0xe2, 0x3b, 0x45, 0x23, 0xbc, - 0x09, 0xc2, 0xf3, 0xec, 0xd3, 0xad, 0x10, 0x7c, 0x73, 0x44, 0xec, 0x29, - 0xab, 0x70, 0x75, 0xe4, 0xd3, 0x8d, 0x5c, 0xf1, 0xdb, 0x2c, 0x83, 0x4e, - 0x75, 0x96, 0xf5, 0x30, 0x67, 0xa7, 0xbf, 0xff, 0xd2, 0xf6, 0x40, 0x0c, - 0x37, 0x22, 0x5b, 0x47, 0x70, 0x4e, 0x37, 0xe0, 0xd7, 0xe1, 0x8d, 0x96, - 0xa4, 0x0e, 0x1c, 0x15, 0xd1, 0x9b, 0x5d, 0x2f, 0x71, 0x8a, 0xb9, 0x38, - 0xcc, 0x62, 0x17, 0x1c, 0x37, 0xb5, 0x9b, 0x1a, 0xf5, 0x3d, 0x64, 0x83, - 0xc7, 0xa2, 0x69, 0x85, 0xa9, 0xa0, 0xdb, 0x99, 0xa8, 0x20, 0x59, 0x4b, - 0xe0, 0x74, 0x92, 0xc1, 0xf7, 0x5d, 0x8f, 0x25, 0x00, 0x62, 0x58, 0xc6, - 0x6c, 0xb0, 0xf7, 0xce, 0x87, 0xe9, 0x86, 0x13, 0x6c, 0xbd, 0xcf, 0x81, - 0xef, 0x0f, 0x1d, 0xad, 0x25, 0xd1, 0xdf, 0x42, 0x93, 0xdd, 0x0e, 0x0c, - 0x79, 0x2e, 0xba, 0x3d, 0xdf, 0x6e, 0xe5, 0x15, 0x07, 0x81, 0x7e, 0xd4, - 0x70, 0x0a, 0x32, 0x16, 0x29, 0xf9, 0x68, 0xb4, 0x98, 0x6e, 0xf2, 0xe4, - 0xca, 0x34, 0x1c, 0x34, 0x50, 0x52, 0x00, 0x86, 0x40, 0xa5, 0xcf, 0xe2, - 0xd6, 0xf1, 0xb2, 0x37, 0x25, 0x5e, 0xe4, 0x13, 0x0c, 0x5e, 0xc2, 0x1c, - 0x12, 0x59, 0x96, 0xe8, 0x5c, 0x69, 0x2d, 0xe3, 0x6c, 0x00, 0x99, 0x1f, - 0x75, 0x8a, 0x19, 0xaf, 0x7a, 0x54, 0x3d, 0xd3, 0xc2, 0x86, 0x19, 0xa2, - 0xce, 0x84, 0xbe, 0xa6, 0x53, 0x81, 0x43, 0x5c, 0xd5, 0x0e, 0xba, 0x34, - 0xe1, 0x85, 0x2f, 0x4e, 0x84, 0x69, 0x38, 0x58, 0x91, 0xb5, 0xd2, 0xaa, - 0xac, 0xba, 0xd4, 0x8f, 0x2d, 0x96, 0x39, 0x6b, 0x8c, 0x64, 0xde, 0x3c, - 0x42, 0xbc, 0xc4, 0x42, 0x91, 0x7c, 0x50, 0x88, 0xbf, 0x16, 0x66, 0xf7, - 0x21, 0xd6, 0xa6, 0x95, 0x3e, 0xf4, 0xd8, 0x5a, 0xe8, 0xd5, 0x07, 0x94, - 0x3a, 0xb7, 0x1c, 0x84, 0xe2, 0x29, 0x60, 0x51, 0x9d, 0xb6, 0x2d, 0x58, - 0x10, 0x0b, 0x9c, 0x49, 0xbd, 0x59, 0x95, 0xef, 0x5e, 0xe1, 0xc6, 0x55, - 0x11, 0x7b, 0x51, 0x2d, 0x60, 0x5b, 0xc2, 0xf3, 0x20, 0x95, 0x77, 0xa6, - 0xe1, 0xbb, 0xff, 0x4f, 0xfe, 0xd8, 0xc7, 0xa4, 0x1e, 0x20, 0x10, 0xb7, - 0x88, 0x3f, 0xe2, 0x3a, 0x5c, 0xdb, 0x8d, 0x36, 0xb6, 0x8b, 0x25, 0xa7, - 0x9e, 0xe2, 0xbf, 0x86, 0x05, 0x6a, 0xc1, 0x01, 0x19, 0xfc, 0xf7, 0x3b, - 0x4e, 0x6d, 0xb3, 0x12, 0x81, 0x0e, 0x77, 0x75, 0xc1, 0xce, 0x4c, 0x03, - 0xb1, 0x53, 0xc3, 0x1d, 0x5a, 0x29, 0x6a, 0x60, 0x4d, 0xee, 0x5c, 0x1e, - 0xf0, 0x59, 0x75, 0xc9, 0xc0, 0x54, 0x30, 0x9b, 0xa9, 0x3c, 0x20, 0xeb, - 0x95, 0x75, 0x2b, 0x3e, 0xb3, 0x80, 0x60, 0x26, 0xf4, 0xc4, 0xb7, 0xbe, - 0x59, 0xf6, 0xf9, 0xa9, 0x93, 0xb4, 0x30, 0x71, 0xa4, 0x77, 0xdf, 0xd9, - 0x07, 0x4a, 0x17, 0x02, 0x9b, 0x11, 0xf2, 0x10, 0x2f, 0x1d, 0xde, 0x3e, - 0x8f, 0x7c, 0x0f, 0xf3, 0x4f, 0x04, 0x5f, 0xa5, 0x26, 0xb0, 0x38, 0xeb, - 0xa5, 0xaf, 0xbb, 0xfb, 0xaf, 0xad, 0xf9, 0x7b, 0x82, 0x57, 0x24, 0x0d, - 0x16, 0xab, 0x83, 0xd0, 0x21, 0xae, 0xc2, 0x66, 0x20, 0xe5, 0x0a, 0x4b, - 0x04, 0x09, 0x68, 0xcd, 0x78, 0x71, 0xe4, 0x6e, 0x6b, 0xd1, 0x4d, 0xf4, - 0xa3, 0x31, 0x57, 0x7a, 0xec, 0xfa, 0x45, 0x54, 0x3a, 0x8a, 0x03, 0x81, - 0x6b, 0x43, 0x67, 0x22, 0xcb, 0xbc, 0x9e, 0x68, 0xaa, 0x7c, 0xd7, 0xbf, - 0xab, 0xbc, 0x94, 0xc5, 0xb9, 0x28, 0x81, 0x1e, 0x3d, 0x2a, 0xd7, 0x10, - 0xf5, 0x4a, 0xc4, 0x60, 0x6f, 0x99, 0x86, 0xcd, 0x99, 0xdb, 0x5a, 0xa3, - 0x66, 0x79, 0xe8, 0x16, 0xa8, 0xcc, 0x76, 0x1e, 0x85, 0x34, 0xbf, 0xe2, - 0x20, 0xc6, 0x78, 0xcb, 0x3f, 0x3e, 0x87, 0x0e, 0x46, 0x7b, 0x24, 0x0d, - 0x07, 0x66, 0x6d, 0xd3, 0x1e, 0x86, 0x6d, 0xd3, 0x84, 0x42, 0xcd, 0xdd, - 0xf3, 0x1d, 0xb6, 0x37, 0x5e, 0x1f, 0x1e, 0x8e, 0x83, 0xec, 0x3a, 0xc7, - 0x9e, 0xd6, 0x4b, 0x2c, 0xc8, 0x41, 0x0e, 0xe1, 0x1d, 0xc6, 0x04, 0x7d, - 0x68, 0xbd, 0xc9, 0x81, 0x6f, 0xb8, 0x98, 0x53, 0x93, 0x4f, 0x57, 0xe9, - 0x28, 0x23, 0x64, 0x9a, 0x38, 0xc1, 0x58, 0x58, 0x4f, 0x21, 0x32, 0x1a, - 0x2f, 0x8c, 0x16, 0x4f, 0x42, 0x0d, 0x0b, 0xc1, 0xbe, 0x57, 0xbe, 0xf0, - 0x1d, 0xb5, 0x65, 0x2e, 0x2a, 0x70, 0xcd, 0x20, 0xdd, 0x18, 0x52, 0x7e, - 0x05, 0xdb, 0x88, 0x19, 0x46, 0x1f, 0x67, 0x85, 0x1f, 0x53, 0xc5, 0x7a, - 0xec, 0xf4, 0xc6, 0xb9, 0x53, 0xb4, 0x7a, 0x1b, 0x7a, 0x71, 0x19, 0x3c, - 0x66, 0x5d, 0x8c, 0x49, 0xde, 0x0b, 0xda, 0xf6, 0x60, 0x6b, 0xbb, 0x4a, - 0xc2, 0xe4, 0x2f, 0xe6, 0x29, 0xa0, 0xc3, 0x94, 0xa0, 0x0e, 0xc8, 0x86, - 0xf9, 0xa7, 0x73, 0xf8, 0xeb, 0xc8, 0x85, 0x2b, 0xe1, 0x76, 0x83, 0x3c, - 0xd5, 0xf5, 0x79, 0xa8, 0xf7, 0x45, 0xea, 0x87, 0xd1, 0xa0, 0xf8, 0x6f, - 0x20, 0x6b, 0xe1, 0x08, 0x29, 0x55, 0xb3, 0x82, 0x38, 0xee, 0xde, 0x54, - 0xcc, 0xff, 0x32, 0x81, 0x01, 0x2c, 0x3c, 0x6a, 0x40, 0x66, 0x97, 0xc6, - 0x3e, 0x7c, 0x6a, 0x82, 0xa8, 0x0a, 0xbe, 0xb9, 0x84, 0x21, 0xc8, 0x1a, - 0x51, 0xed, 0xfc, 0x21, 0xdc, 0xe8, 0xd5, 0xe0, 0xa0, 0xdf, 0x00, 0xd3, - 0xc8, 0x72, 0x2a, 0x1c, 0xad, 0x77, 0xa3, 0x81, 0x39, 0x90, 0xd8, 0x5f, - 0x8c, 0xa0, 0x8b, 0x3f, 0x5b, 0x0c, 0x0c, 0xa2, 0xaa, 0x75, 0x3c, 0xaa, - 0x6a, 0x2c, 0x6a, 0x18, 0x33, 0x8c, 0x9e, 0x3f, 0xbb, 0xa4, 0x4a, 0x98, - 0x62, 0xce, 0xa5, 0x91, 0xd7, 0x04, 0x09, 0xb8, 0x24, 0xa5, 0x24, 0x89, - 0x24, 0xa9, 0xc6, 0x68, 0x5f, 0x37, 0x3f, 0xf2, 0x08, 0xf4, 0xc5, 0x7f, - 0x92, 0x28, 0xea, 0x49, 0x76, 0x50, 0x72, 0x1c, 0x14, 0x14, 0x2e, 0xdf, - 0x16, 0x31, 0x28, 0xb0, 0x83, 0x76, 0x3d, 0xa9, 0xd3, 0x08, 0x80, 0x29, - 0x09, 0x89, 0x01, 0x49, 0xa9, 0x4f, 0x8b, 0x07, 0x61, 0x57, 0x28, 0xe6, - 0xfa, 0xc1, 0x5c, 0x1b, 0xea, 0x32, 0x47, 0x84, 0x5e, 0x43, 0xd8, 0x51, - 0x32, 0x51, 0xf6, 0x37, 0x7b, 0x09, 0x49, 0x42, 0x20, 0xf6, 0xbc, 0x1d, - 0x98, 0xdc, 0x42, 0x77, 0x15, 0xab, 0xf3, 0xbb, 0xb4, 0x5b, 0xba, 0x53, - 0x68, 0xd6, 0x0d, 0x8a, 0x3d, 0xae, 0x01, 0x1b, 0x99, 0xbe, 0x4a, 0xdb, - 0xbb, 0x05, 0xb7, 0xca, 0xda, 0x2d, 0x57, 0xa5, 0x6b, 0x8a, 0x82, 0x5d, - 0x59, 0x80, 0x30, 0xf1, 0xb3, 0x76, 0xad, 0x6b, 0x1f, 0x42, 0x98, 0xae, - 0x01, 0xaa, 0x7d, 0x75, 0xd3, 0x03, 0xde, 0xa4, 0x55, 0xeb, 0xb5, 0x45, - 0x42, 0x62, 0xfa, 0x43, 0xa0, 0xc8, 0x07, 0xb7, 0x21, 0x13, 0xf7, 0x70, - 0x9e, 0x9d, 0x06, 0xca, 0xa3, 0x8f, 0x32, 0xde, 0xd8, 0x3b, 0x5f, 0xc8, - 0xea, 0x50, 0xc8, 0x8a, 0x5c, 0x5d, 0xd4, 0x9a, 0x97, 0xae, 0x51, 0xf0, - 0x42, 0x6d, 0x4f, 0xd2, 0x40, 0xde, 0xe9, 0x3f, 0x0c, 0x95, 0x03, 0xac, - 0x57, 0x13, 0x8d, 0x53, 0xf9, 0x3a, 0xa6, 0x5f, 0x35, 0x5d, 0xc3, 0x45, - 0x11, 0x3e, 0xe1, 0x61, 0xf4, 0x8b, 0xf5, 0xed, 0x40, 0xfc, 0x2d, 0xfe, - 0xcb, 0x12, 0xbb, 0xbc, 0xd2, 0x9a, 0xfb, 0x0b, 0x84, 0xe0, 0x48, 0x00, - 0x7e, 0x30, 0xb8, 0xfe, 0xab, 0xd2, 0xeb, 0x63, 0x6e, 0x94, 0xd9, 0xed, - 0xbf, 0x03, 0x7a, 0x0e, 0x47, 0x3f, 0xbf, 0x6c, 0x0e, 0x7d, 0x47, 0xcc, - 0x3a, 0xc6, 0x45, 0xcd, 0xa4, 0xc4, 0xed, 0xa7, 0xcc, 0x41, 0x6c, 0x98, - 0x4e, 0xff, 0x4a, 0xf6, 0x99, 0xdc, 0x8e, 0xcd, 0xb4, 0x80, 0x70, 0x27, - 0x3c, 0x8f, 0xfd, 0xbc, 0x0b, 0x65, 0x58, 0xc2, 0x89, 0x12, 0x2e, 0xe8, - 0x5f, 0xb6, 0x90, 0x81, 0x19, 0xbb, 0x85, 0xf8, 0xcf, 0xe5, 0x5d, 0x77, - 0xf3, 0x9e, 0x9a, 0xc5, 0x6c, 0xf8, 0x3c, 0x73, 0xe4, 0x06, 0xe0, 0xbf, - 0x78, 0xdf, 0x12, 0x27, 0x1a, 0x57, 0x93, 0xc8, 0xb4, 0xb1, 0x36, 0xf3, - 0x72, 0xf2, 0xc2, 0x8c, 0xb0, 0x8b, 0xcb, 0xc0, 0x27, 0xd3, 0xec, 0x9a, - 0x25, 0x0f, 0x73, 0x44, 0x9b, 0x28, 0xde, 0xd9, 0x5d, 0x78, 0x48, 0xd2, - 0xf4, 0xa5, 0x62, 0x23, 0xd8, 0xb7, 0xb5, 0xd9, 0xad, 0xed, 0x1a, 0x2e, - 0x14, 0x3c, 0x7e, 0xd5, 0x33, 0xde, 0x5f, 0x29, 0x28, 0x4f, 0x0d, 0x3c, - 0x77, 0x50, 0x6a, 0x12, 0x5d, 0x35, 0xf6, 0x29, 0xaf, 0xe4, 0xb9, 0xa3, - 0x8c, 0xa7, 0x9c, 0x5f, 0xa5, 0x7f, 0x06, 0x2a, 0x24, 0xd5, 0x5f, 0x0a, - 0x99, 0x88, 0xf6, 0xa3, 0x86, 0x3a, 0x18, 0xac, 0x3f, 0x59, 0x4b, 0x67, - 0x96, 0xab, 0x6b, 0xbe, 0xbf, 0xa4, 0xe3, 0x7a, 0x26, 0x7d, 0x8f, 0x9d, - 0xb3, 0x00, 0xab, 0x9f, 0x02, 0x9c, 0x25, 0xdd, 0xd2, 0x8b, 0x87, 0x85, - 0xb3, 0x02, 0x6f, 0x33, 0x15, 0x7f, 0x95, 0xb6, 0xad, 0x5e, 0x9a, 0x7f, - 0xea, 0x59, 0x37, 0x0e, 0xb3, 0xca, 0x7f, 0x33, 0x79, 0xda, 0x9d, 0xd4, - 0x1b, 0xc7, 0x18, 0xb2, 0x67, 0x7c, 0x9f, 0x73, 0x1b, 0xaf, 0x1f, 0x01, - 0x31, 0xb8, 0xc8, 0xff, 0x52, 0xf2, 0xbd, 0x4a, 0x43, 0x23, 0x65, 0x02, - 0x5d, 0x66, 0x40, 0x9a, 0xc8, 0x39, 0x6a, 0xd4, 0xb0, 0x56, 0x33, 0xab, - 0x09, 0x41, 0xa1, 0x6a, 0xd5, 0x09, 0x91, 0x36, 0xd1, 0x7b, 0xad, 0xf9, - 0xcc, 0x7c, 0x6c, 0x0f, 0x5e, 0xf0, 0x26, 0x96, 0x8f, 0xc7, 0x75, 0xb1, - 0x9b, 0x0c, 0x06, 0x25, 0x7c, 0x80, 0x1c, 0xbf, 0x53, 0xb6, 0xbc, 0xe9, - 0xd3, 0xb8, 0x34, 0xa2, 0x49, 0xce, 0xed, 0x62, 0x09, 0xfe, 0x3c, 0x98, - 0x13, 0x00, 0x36, 0xfd, 0xbf, 0x75, 0x53, 0x8c, 0xee, 0x87, 0xdb, 0x24, - 0xae, 0x87, 0xb6, 0x47, 0x5d, 0x21, 0x4a, 0xb7, 0xaa, 0x18, 0xe5, 0xfa, - 0xb5, 0x7c, 0xdb, 0x80, 0x33, 0xaa, 0x57, 0x13, 0x24, 0x64, 0x54, 0xc2, - 0x74, 0x5e, 0xb0, 0x09, 0x74, 0x0f, 0xd0, 0xc7, 0x72, 0x82, 0x6a, 0xdf, - 0x93, 0xda, 0x03, 0x37, 0x2d, 0xbe, 0x70, 0x45, 0xc4, 0x09, 0x2a, 0xae, - 0xf0, 0xb2, 0xf3, 0xec, 0x0b, 0xa8, 0x7a, 0x4c, 0x6f, 0x36, 0xb8, 0x39, - 0x44, 0xf0, 0xee, 0x07, 0xbc, 0x44, 0x55, 0xdc, 0x07, 0x4f, 0x4b, 0x4a, - 0x75, 0xd8, 0xb2, 0x8f, 0xea, 0xfb, 0x2c, 0xa5, 0x46, 0x0c, 0x37, 0x2f, - 0xde, 0x3d, 0x28, 0x0c, 0x11, 0x01, 0x56, 0xee, 0xe5, 0x8f, 0xaf, 0x20, - 0xc5, 0x6f, 0x83, 0x47, 0x66, 0x63, 0x6a, 0xae, 0xa1, 0xd2, 0xf7, 0x2a, - 0x81, 0xbb, 0x65, 0xcf, 0x02, 0xe4, 0x3e, 0x53, 0xa6, 0xff, 0xde, 0xf5, - 0x1c, 0xe0, 0xff, 0x09, 0xc7, 0x8f, 0xa6, 0xf4, 0xb6, 0xe5, 0x45, 0xc3, - 0x2d, 0x66, 0x1e, 0x97, 0x8e, 0x36, 0x1a, 0x56, 0xb4, 0xad, 0x7f, 0x09, - 0xb2, 0xb1, 0x32, 0x51, 0xa0, 0x84, 0x70, 0xb5, 0x21, 0x3d, 0x09, 0x0c, - 0x10, 0x03, 0x26, 0xc2, 0x39, 0x12, 0x92, 0xf6, 0x16, 0xf1, 0xd0, 0x65, - 0xd2, 0x21, 0x84, 0xe0, 0xe0, 0x90, 0x10, 0xb8, 0x17, 0x2d, 0xfb, 0x08, - 0xff, 0x5a, 0x10, 0x25, 0x06, 0xf4, 0x74, 0xbc, 0x6a, 0x95, 0x3d, 0x81, - 0x2a, 0x62, 0x24, 0xfd, 0x10, 0x25, 0xa7, 0xf7, 0x86, 0x97, 0xea, 0xbd, - 0xf4, 0xe8, 0xa6, 0xde, 0x2e, 0x2d, 0x5d, 0x24, 0xfe, 0x71, 0xbf, 0xa4, - 0xf7, 0x40, 0x6c, 0xde, 0x89, 0xce, 0x4b, 0x63, 0x5d, 0x80, 0x60, 0xdf, - 0xca, 0x4a, 0x47, 0x72, 0x09, 0xbb, 0xd6, 0xc3, 0x0d, 0x5b, 0xf0, 0xfb, - 0x59, 0x76, 0x33, 0x9e, 0xfc, 0x36, 0x36, 0x55, 0x93, 0xf2, 0x43, 0xdc, - 0x62, 0xe8, 0x9c, 0x35, 0x97, 0x92, 0x49, 0x18, 0x5c, 0xd2, 0x0b, 0x61, - 0xfb, 0x0c, 0xb3, 0x61, 0x8f, 0x5a, 0x87, 0x1e, 0x41, 0x73, 0xd3, 0xb3, - 0x71, 0xb7, 0xe8, 0x3d, 0x3d, 0x79, 0x70, 0xdb, 0xe2, 0x48, 0x98, 0xbd, - 0xa3, 0xb2, 0x95, 0x23, 0x0e, 0x8c, 0x75, 0x2d, 0x1f, 0x7a, 0x96, 0x27, - 0x9d, 0x38, 0x64, 0x15, 0x92, 0x3a, 0x19, 0xc2, 0x28, 0xff, 0x99, 0x12, - 0x68, 0xd8, 0xce, 0x40, 0x5d, 0xd4, 0xa1, 0x80, 0x20, 0x07, 0x93, 0x5c, - 0x38, 0x1d, 0x55, 0x75, 0xdb, 0x26, 0xf7, 0x25, 0xf6, 0x1b, 0x5d, 0x0f, - 0xb3, 0x3f, 0x80, 0x87, 0x3f, 0x3b, 0xfa, 0xc7, 0x99, 0xc3, 0x82, 0xff, - 0x7d, 0x03, 0x3f, 0xcf, 0x7c, 0x7b, 0x8b, 0x96, 0x58, 0x05, 0x4e, 0xce, - 0xe7, 0x60, 0xdf, 0xdf, 0x30, 0x8e, 0x33, 0x1d, 0xd1, 0x36, 0x95, 0xec, - 0xc0, 0xaa, 0xbd, 0x17, 0xbf, 0x69, 0xe6, 0xa3, 0x09, 0xf6, 0x02, 0x8d, - 0xbc, 0xb0, 0x16, 0x1a, 0x5f, 0x89, 0x39, 0x1d, 0x55, 0xb2, 0x79, 0xfb, - 0x4a, 0xc7, 0x02, 0x58, 0xb6, 0x96, 0x4c, 0x9b, 0x1f, 0x36, 0x72, 0x63, - 0x8b, 0x69, 0x95, 0x60, 0x91, 0x35, 0x3e, 0x54, 0x68, 0x28, 0xde, 0x95, - 0x08, 0x97, 0xa1, 0x95, 0x0a, 0x93, 0x6c, 0xe6, 0x89, 0xad, 0xda, 0xc6, - 0x86, 0x68, 0x1a, 0x7f, 0x90, 0x79, 0x43, 0xcb, 0x40, 0x05, 0xa9, 0x94, - 0x05, 0x49, 0x1f, 0xa8, 0x17, 0xe7, 0x82, 0xcf, 0x4a, 0xa5, 0x49, 0xaf, - 0xad, 0x5e, 0xf6, 0x7d, 0x43, 0xd1, 0x99, 0x31, 0x2d, 0x54, 0x65, 0x09, - 0xdd, 0x37, 0x82, 0x89, 0xf4, 0x6f, 0xd6, 0x0e, 0x53, 0x99, 0x65, 0x77, - 0xa1, 0x6e, 0xcc, 0xf0, 0x64, 0x86, 0x90, 0x81, 0xd6, 0x49, 0x80, 0x64, - 0x46, 0x40, 0x07, 0x26, 0xaf, 0x16, 0x34, 0xfa, 0xb7, 0x4a, 0x94, 0x37, - 0xab, 0x42, 0xd4, 0x33, 0xc5, 0x63, 0x54, 0xa1, 0x16, 0x11, 0xd1, 0x33, - 0x67, 0xcd, 0x27, 0xf1, 0xcc, 0x95, 0x35, 0xc3, 0xcf, 0x46, 0x60, 0x3b, - 0x37, 0x80, 0x0c, 0x96, 0xcd, 0xd6, 0x0b, 0x13, 0xa5, 0x5a, 0x5d, 0x02, - 0x26, 0x53, 0x27, 0x25, 0x39, 0xe8, 0xa2, 0x3b, 0x4e, 0x5a, 0xbe, 0xc1, - 0x3a, 0xb0, 0xec, 0x15, 0x98, 0x81, 0x0b, 0xee, 0x2e, 0x31, 0x06, 0x31, - 0xee, 0xb6, 0x68, 0x33, 0x12, 0x0f, 0xa0, 0xb6, 0x7f, 0xdd, 0x8f, 0x88, - 0x67, 0x6d, 0x06, 0x99, 0x4f, 0xeb, 0xda, 0x80, 0x02, 0x0c, 0xa7, 0xaa, - 0x7d, 0x1d, 0xf9, 0x79, 0x10, 0x6e, 0x09, 0x2a, 0x8b, 0x94, 0x33, 0xf0, - 0x15, 0x3f, 0x9c, 0xef, 0xdb, 0x45, 0x52, 0x71, 0x4e, 0xdc, 0x06, 0x65, - 0xc5, 0xf1, 0x60, 0x7c, 0x00, 0xc9, 0x5e, 0xdd, 0x1d, 0x41, 0xe2, 0x96, - 0x8a, 0xd3, 0x54, 0x73, 0xe8, 0x21, 0xf6, 0x83, 0xc3, 0x26, 0xd4, 0xb3, - 0xac, 0x4d, 0xea, 0xe6, 0xb0, 0x36, 0x6e, 0x8a, 0x9f, 0x55, 0xac, 0x0a, - 0x53, 0xcf, 0x5f, 0x46, 0xde, 0x3c, 0x50, 0xba, 0x58, 0x50, 0x73, 0xac, - 0xc7, 0x67, 0xb9, 0x17, 0xab, 0x24, 0x63, 0x9e, 0x11, 0x92, 0x1e, 0x7b, - 0x2f, 0x72, 0xa1, 0xf2, 0x59, 0x74, 0xe3, 0x2b, 0xf3, 0x28, 0xc5, 0x26, - 0xe4, 0x35, 0x75, 0x14, 0xfa, 0x05, 0x0d, 0x98, 0x77, 0xdb, 0xf6, 0xc5, - 0xb7, 0xae, 0x4e, 0x9b, 0xd7, 0x40, 0x0f, 0x4e, 0x31, 0x22, 0x1c, 0x1b, - 0x0d, 0x10, 0x07, 0x86, 0x20, 0x7f, 0x6e, 0x40, 0x33, 0x51, 0x16, 0x43, - 0xfe, 0x13, 0x43, 0xd2, 0xef, 0x89, 0xd8, 0x79, 0x69, 0x54, 0x26, 0xe1, - 0xa6, 0xcf, 0x23, 0x2c, 0xb7, 0x18, 0x3d, 0xd2, 0x0a, 0xb9, 0xea, 0x5c, - 0x9a, 0x7b, 0xd7, 0x18, 0xaf, 0x3b, 0x37, 0x24, 0xc1, 0x74, 0xea, 0x03, - 0xbb, 0x2b, 0x83, 0x78, 0xab, 0x79, 0xda, 0xf1, 0x67, 0xc5, 0x98, 0x86, - 0x5e, 0x19, 0x08, 0xe1, 0xf7, 0x61, 0x4f, 0xd2, 0x00, 0xe4, 0x14, 0xf3, - 0x46, 0x3e, 0x56, 0x41, 0x88, 0xb8, 0x30, 0x4e, 0x4d, 0xa5, 0x2f, 0x9e, - 0x24, 0xda, 0x6b, 0xe1, 0x2d, 0xa4, 0x31, 0x68, 0x32, 0x97, 0x0b, 0x08, - 0xd5, 0xcb, 0x4e, 0x3e, 0xc2, 0xbb, 0x49, 0x58, 0xb4, 0x33, 0x33, 0x80, - 0xeb, 0xae, 0xae, 0xda, 0x3e, 0x7d, 0x3a, 0xaf, 0xfc, 0xc7, 0xe7, 0x48, - 0x1b, 0x61, 0xba, 0xea, 0x4e, 0xd7, 0x3f, 0x01, 0xea, 0x8e, 0x49, 0x78, - 0xb4, 0xa8, 0x01, 0x64, 0x27, 0x13, 0xaf, 0xbe, 0xb3, 0x23, 0xc0, 0x26, - 0xb0, 0x04, 0x8c, 0xcf, 0x99, 0x6e, 0xd3, 0xe5, 0x27, 0x55, 0xc1, 0xe4, - 0xf8, 0x6f, 0xea, 0xfe, 0x01, 0xb4, 0x3a, 0xe5, 0x12, 0xe1, 0x86, 0x7a, - 0x62, 0x47, 0xb1, 0x8a, 0xb7, 0xf7, 0xc2, 0x85, 0x52, 0xb9, 0xa6, 0xcf, - 0x3b, 0x8c, 0x92, 0x76, 0x67, 0x25, 0x4c, 0x20, 0x8e, 0xbd, 0xf9, 0x5e, - 0xc9, 0x70, 0x51, 0x9e, 0xad, 0x8a, 0x45, 0x46, 0xc6, 0x98, 0x8e, 0x72, - 0x1c, 0xe3, 0x30, 0x29, 0x17, 0x8b, 0x7e, 0xf1, 0xe4, 0x41, 0x6f, 0xc4, - 0xe7, 0xad, 0x6b, 0x51, 0xec, 0x0b, 0x85, 0x32, 0xfa, 0x87, 0xa9, 0xec, - 0x05, 0x60, 0x69, 0x9b, 0xc1, 0x52, 0x0d, 0x6c, 0xbc, 0x89, 0x9b, 0x6e, - 0xe3, 0x3a, 0x7e, 0x78, 0xdc, 0x89, 0xda, 0x43, 0xb3, 0x05, 0xff, 0xe5, - 0x5a, 0x1d, 0x9f, 0xbd, 0x5d, 0xb8, 0x32, 0xce, 0xd9, 0x95, 0x01, 0xf0, - 0xb2, 0x1b, 0xe6, 0x65, 0xe8, 0xbc, 0x85, 0xa5, 0xf8, 0x13, 0x42, 0xdb, - 0xec, 0x23, 0xd4, 0xfb, 0x6f, 0x52, 0x47, 0x39, 0x1e, 0xda, 0x10, 0xbe, - 0x60, 0xc5, 0x26, 0x37, 0x3c, 0x36, 0xd6, 0x90, 0x42, 0xb7, 0xf6, 0xb2, - 0x00, 0x86, 0x23, 0x1e, 0x83, 0x1b, 0x0f, 0x2d, 0x24, 0x3a, 0x9a, 0x17, - 0xc6, 0xbd, 0xe1, 0x09, 0xb0, 0x94, 0x62, 0xa3, 0x0f, 0x1c, 0xb0, 0xdd, - 0x74, 0x81, 0xbe, 0x76, 0x14, 0xb9, 0xd4, 0x1c, 0x94, 0xae, 0x80, 0x2a, - 0x4c, 0x4f, 0xec, 0x20, 0x6c, 0x76, 0xb0, 0xf6, 0x2c, 0xd9, 0x1b, 0x44, - 0x57, 0x10, 0xab, 0x15, 0x09, 0xd7, 0x9c, 0xff, 0xae, 0xf3, 0x47, 0x88, - 0xbd, 0xed, 0x12, 0x27, 0xfc, 0x2b, 0xe7, 0x52, 0x71, 0xfd, 0xf0, 0x54, - 0x34, 0x73, 0x88, 0x19, 0xae, 0x78, 0x56, 0xd9, 0x71, 0x81, 0xe1, 0x3d, - 0x80, 0x38, 0x2f, 0x94, 0xb8, 0x18, 0x1c, 0x8c, 0x14, 0x47, 0x78, 0x69, - 0xdc, 0x26, 0xb6, 0xf8, 0xd6, 0x30, 0xc1, 0xaa, 0xac, 0x32, 0x12, 0xf0, - 0x8f, 0x31, 0x68, 0x7f, 0x85, 0xc2, 0x1d, 0x2e, 0x65, 0xe5, 0x76, 0xc2, - 0xa6, 0xcc, 0x29, 0xda, 0xeb, 0xcd, 0xcf, 0x29, 0x4e, 0x8d, 0x5a, 0x50, - 0xbf, 0xa6, 0x1e, 0x04, 0x70, 0x94, 0x21, 0x51, 0xec, 0x67, 0x6b, 0xdd, - 0x0e, 0xc9, 0xf0, 0x9f, 0xd3, 0xd2, 0xfd, 0x2e, 0xe9, 0xde, 0xb8, 0x72, - 0x8a, 0x29, 0xca, 0xd4, 0x8d, 0xd4, 0x4d, 0xec, 0x09, 0x36, 0xde, 0x94, - 0xe6, 0x28, 0x02, 0x0d, 0x94, 0xb2, 0x2c, 0x97, 0xb6, 0x6a, 0x2b, 0xb6, - 0x4a, 0x6a, 0x4a, 0x8f, 0x3d, 0x7a, 0x0e, 0x1c, 0xc8, 0x02, 0x1e, 0xeb, - 0xf5, 0xab, 0xed, 0x25, 0x0c, 0x79, 0x1f, 0xc3, 0xb9, 0xe1, 0x01, 0xaa, - 0x4c, 0xde, 0x1e, 0xbd, 0x49, 0x80, 0x62, 0x84, 0x47, 0xf8, 0x16, 0x37, - 0xe7, 0xb7, 0x4c, 0x8f, 0xd2, 0x4f, 0xc6, 0xf6, 0xcf, 0x5a, 0xab, 0xc1, - 0xd4, 0xa6, 0x46, 0x52, 0x62, 0x8b, 0xcb, 0x93, 0x8e, 0x57, 0xc3, 0xf1, - 0x77, 0x8f, 0x1f, 0x92, 0x64, 0x7d, 0x16, 0x87, 0xe0, 0x3d, 0xd3, 0xc6, - 0x6f, 0xf2, 0x4a, 0x47, 0xa7, 0x15, 0x9c, 0x1e, 0x46, 0xdf, 0x4b, 0x0d, - 0x8e, 0xb1, 0x73, 0x86, 0xd5, 0x1f, 0x41, 0x00, 0x3a, 0xf7, 0xd6, 0x30, - 0x1b, 0xa0, 0x17, 0xda, 0x34, 0xa4, 0xe8, 0x81, 0x5d, 0x4c, 0x12, 0xa1, - 0x90, 0xf3, 0x4a, 0xad, 0x3c, 0xb6, 0x1f, 0xca, 0xf7, 0xcf, 0x18, 0xfa, - 0x60, 0x82, 0xf2, 0x17, 0x95, 0x74, 0xb2, 0x85, 0xd9, 0xcb, 0xa4, 0xd8, - 0x9f, 0x12, 0x8f, 0xd6, 0x14, 0xa8, 0xef, 0x03, 0xcf, 0x07, 0x56, 0x2e, - 0xbe, 0xad, 0x65, 0x67, 0x19, 0x53, 0xea, 0xbc, 0x74, 0x5f, 0xcf, 0x30, - 0x44, 0x7a, 0xb7, 0xdc, 0x0d, 0xbe, 0x5e, 0xbd, 0x43, 0x28, 0xe8, 0xd4, - 0x0a, 0x22, 0x28, 0x75, 0xc2, 0xdd, 0xc9, 0x01, 0xf8, 0x14, 0x1d, 0xf1, - 0xbf, 0x5b, 0xb3, 0x07, 0x17, 0xba, 0x5b, 0x31, 0x46, 0x23, 0x9e, 0xad, - 0xa2, 0x61, 0xc0, 0x50, 0x98, 0x93, 0x3e, 0x18, 0x7e, 0xe3, 0xe3, 0x74, - 0x8c, 0x05, 0xc2, 0x78, 0x5b, 0x4c, 0xe8, 0xbf, 0x4d, 0xee, 0xf8, 0xce, - 0x90, 0x81, 0x16, 0x00, 0x26, 0xa4, 0xa0, 0xce, 0xef, 0xea, 0x5b, 0x97, - 0x40, 0xd4, 0x1b, 0x90, 0x3c, 0xd7, 0x10, 0x6a, 0xb2, 0x6b, 0xa9, 0xb2, - 0x84, 0xd6, 0x97, 0x12, 0x23, 0x0a, 0xea, 0x23, 0x97, 0x2d, 0x05, 0x81, - 0x80, 0x0f, 0xc2, 0x55, 0x9c, 0x23, 0x32, 0x8f, 0x3a, 0xd0, 0x34, 0x04, - 0x77, 0x6e, 0x59, 0x3f, 0x20, 0xbc, 0x3c, 0xa3, 0xe8, 0xca, 0xdd, 0x95, - 0x22, 0xa9, 0x87, 0x5e, 0xdf, 0x24, 0xd0, 0x00, 0x81, 0xe9, 0xe3, 0x6b, - 0x43, 0xb2, 0xb9, 0x0c, 0x06, 0x0e, 0x4e, 0xb4, 0x35, 0xb0, 0x84, 0xb7, - 0x38, 0xe4, 0xf0, 0xb2, 0x59, 0x17, 0xa2, 0x28, 0x61, 0x5a, 0xb9, 0x4e, - 0x6f, 0x77, 0x82, 0x84, 0x5e, 0x4d, 0x2d, 0x1d, 0x39, 0x06, 0xe9, 0x9f, - 0xf0, 0xc5, 0x70, 0x2f, 0xe6, 0x99, 0x75, 0xe2, 0xc3, 0x9c, 0xfc, 0xee, - 0x91, 0x46, 0x63, 0xb6, 0x53, 0x15, 0x99, 0xc2, 0xee, 0xc0, 0x16, 0x3e, - 0xcd, 0x6b, 0xbe, 0xb5, 0x8f, 0x51, 0x84, 0x1d, 0xb0, 0xe7, 0x7c, 0x49, - 0x2c, 0x59, 0xd3, 0xe3, 0xec, 0x85, 0xd6, 0x64, 0x81, 0xa5, 0x59, 0x71, - 0xd3, 0x6b, 0x9e, 0x77, 0x49, 0xe5, 0x98, 0x3d, 0x39, 0x35, 0x32, 0x05, - 0x2d, 0x27, 0x09, 0x08, 0x62, 0x3d, 0x5c, 0x29, 0x75, 0xde, 0xb8, 0xb2, - 0xe9, 0x68, 0xca, 0x4d, 0xb2, 0x29, 0x99, 0xc3, 0xf8, 0xb1, 0xde, 0x00, - 0x80, 0x70, 0x69, 0x25, 0xc2, 0x42, 0x89, 0x77, 0x39, 0x28, 0x41, 0xc4, - 0x52, 0x62, 0x3b, 0x4e, 0x73, 0x52, 0x87, 0xad, 0xab, 0xf4, 0xbe, 0x56, - 0xf1, 0x82, 0x32, 0x03, 0xcd, 0xca, 0x2c, 0x6b, 0x4f, 0x3f, 0x7d, 0xc5, - 0xe7, 0xc7, 0x8e, 0x5f, 0x85, 0xc3, 0x7f, 0x5f, 0x4f, 0xd0, 0x08, 0xb2, - 0x00, 0x56, 0x3f, 0xef, 0x0c, 0xc8, 0xb8, 0xbb, 0xef, 0x10, 0xd0, 0xfb, - 0x38, 0x95, 0x10, 0x03, 0x14, 0xf2, 0x8c, 0x36, 0xf8, 0xaa, 0xc2, 0xe0, - 0x0e, 0xb3, 0x71, 0x3c, 0x7a, 0x1d, 0xa3, 0xf8, 0x73, 0x7b, 0x7d, 0xc6, - 0x9a, 0x96, 0x8a, 0x90, 0x77, 0x2b, 0x8f, 0xdd, 0x12, 0xd4, 0xf0, 0xb5, - 0x3d, 0x8e, 0xce, 0x4b, 0x84, 0x61, 0x1f, 0x7e, 0x29, 0x0d, 0x36, 0xa1, - 0xf8, 0xb9, 0x0b, 0xf4, 0x15, 0xfa, 0x46, 0x7e, 0xdc, 0x73, 0x2e, 0x8c, - 0xc0, 0x79, 0xf1, 0x4d, 0x98, 0xbd, 0x0b, 0x3f, 0xcd, 0x50, 0x15, 0xd1, - 0x42, 0x6f, 0x21, 0x1f, 0x5a, 0x24, 0xe0, 0x26, 0x74, 0xba, 0xa5, 0x00, - 0x7c, 0x52, 0xc8, 0x7f, 0xf5, 0xc1, 0xa3, 0x6d, 0xe4, 0xd2, 0x4a, 0x2d, - 0x73, 0x6f, 0xe5, 0xf7, 0x9e, 0xfe, 0x77, 0x50, 0xc1, 0xe0, 0xdc, 0xe2, - 0x29, 0x73, 0xf2, 0xd4, 0x9e, 0x9c, 0x50, 0x70, 0x4a, 0x3f, 0xb3, 0xcf, - 0x63, 0xdc, 0xe1, 0x41, 0x28, 0x20, 0xb6, 0x3e, 0xc1, 0x39, 0x14, 0xce, - 0xb1, 0x4b, 0xc6, 0x62, 0x20, 0x40, 0x13, 0x10, 0x5f, 0x9b, 0x76, 0xcc, - 0x8b, 0xb3, 0x2d, 0x5e, 0xc5, 0x17, 0xc4, 0x7d, 0x32, 0xd3, 0xda, 0x57, - 0x15, 0x50, 0xc9, 0xb8, 0x23, 0x04, 0x8e, 0x9f, 0x7e, 0xc8, 0x79, 0x3c, - 0xa2, 0xb2, 0x1a, 0xcb, 0x63, 0x2a, 0x85, 0x84, 0x15, 0xb9, 0x16, 0x56, - 0xf0, 0xc9, 0x0c, 0x3f, 0xeb, 0xf2, 0x31, 0xff, 0xc0, 0x4c, 0x05, 0xb5, - 0x47, 0xb3, 0x9e, 0x8a, 0x58, 0x25, 0xc8, 0xc7, 0x2a, 0x65, 0xf5, 0x1e, - 0x3c, 0xd5, 0xd7, 0x9e, 0x55, 0x34, 0xb4, 0x57, 0x63, 0x48, 0xc9, 0x1d, - 0xe2, 0x44, 0xa0, 0xf3, 0x8f, 0xeb, 0x09, 0xc3, 0x03, 0x3d, 0xc0, 0xf9, - 0xfc, 0x2c, 0xd2, 0xb4, 0x2c, 0x16, 0x6a, 0x13, 0x2c, 0xf5, 0xb5, 0xdf, - 0xe1, 0x0f, 0x85, 0x01, 0x60, 0x51, 0x78, 0xe1, 0xe6, 0x5f, 0xf9, 0xb3, - 0x2e, 0xe8, 0x77, 0x43, 0xb7, 0x04, 0x4c, 0x94, 0xd8, 0x8e, 0xb5, 0x22, - 0xd6, 0x25, 0x45, 0xca, 0xc4, 0xb4, 0x59, 0x51, 0xa8, 0x4f, 0xb6, 0x58, - 0x71, 0xf1, 0xa5, 0x7f, 0x54, 0x70, 0xfd, 0x31, 0x81, 0x88, 0x1d, 0xc9, - 0x73, 0x13, 0x2c, 0x5c, 0x32, 0x51, 0x57, 0x23, 0xde, 0x51, 0x73, 0x49, - 0x74, 0x45, 0x2d, 0xdc, 0x14, 0xaa, 0xd1, 0x06, 0x17, 0x67, 0x3c, 0x8f, - 0x1d, 0x2e, 0x52, 0x40, 0x29, 0x79, 0xa8, 0x49, 0x5b, 0x5f, 0x55, 0xf2, - 0xed, 0x56, 0x59, 0xb3, 0x59, 0xfe, 0x0b, 0xa4, 0x98, 0xbe, 0xaf, 0xce, - 0x3b, 0xe5, 0xd6, 0xb6, 0x58, 0xc1, 0xbe, 0x2e, 0xa2, 0xb1, 0x21, 0xa8, - 0x1f, 0x98, 0x5a, 0xe8, 0x6d, 0xa9, 0x9c, 0x7b, 0xfa, 0xfd, 0x72, 0x0d, - 0x97, 0xdb, 0x46, 0x40, 0xb3, 0xce, 0x4a, 0x86, 0x24, 0xa7, 0x27, 0xb0, - 0xfc, 0x36, 0xf1, 0x3e, 0xa3, 0xd6, 0x20, 0xa2, 0xee, 0x22, 0x6c, 0x26, - 0x51, 0x80, 0xb7, 0x18, 0xa2, 0xa8, 0xda, 0xa7, 0xca, 0x8c, 0x93, 0xb1, - 0x55, 0x41, 0x36, 0x15, 0xe9, 0x61, 0xdd, 0xf4, 0x39, 0x7d, 0x33, 0x9c, - 0x69, 0x77, 0xe7, 0x2b, 0x23, 0x06, 0x87, 0xbb, 0xd7, 0xfe, 0x09, 0x40, - 0x7d, 0x51, 0x71, 0x85, 0x27, 0x22, 0x11, 0x2d, 0xec, 0xda, 0x20, 0x79, - 0x88, 0x3d, 0x13, 0xc6, 0xc3, 0xeb, 0x00, 0x12, 0x81, 0x80, 0x06, 0x9d, - 0x1d, 0x8c, 0x31, 0x89, 0x71, 0xce, 0x78, 0xf9, 0x38, 0xdf, 0x47, 0x24, - 0x89, 0xbc, 0x96, 0x3f, 0xa0, 0x6c, 0x8e, 0x44, 0x04, 0x0a, 0x2a, 0x77, - 0xc5, 0x12, 0x83, 0xbe, 0x35, 0x0b, 0xcd, 0x27, 0x79, 0x23, 0xe4, 0x68, - 0xb7, 0xc1, 0x9b, 0xbe, 0x2a, 0x6e, 0xdd, 0xa2, 0x21, 0xf6, 0xdc, 0x10, - 0x10, 0x6a, 0xa7, 0x60, 0x23, 0x91, 0x04, 0xb0, 0xb5, 0x56, 0x9c, 0x85, - 0x3a, 0xa4, 0xcc, 0xc1, 0x67, 0x8e, 0xd9, 0x22, 0x55, 0xe3, 0x78, 0x6b, - 0xec, 0x80, 0x8f, 0xed, 0xe2, 0xb4, 0x82, 0x1d, 0xe1, 0x13, 0xdb, 0x84, - 0xe4, 0x32, 0xf4, 0x8c, 0x76, 0x63, 0x7f, 0xac, 0xdd, 0x1b, 0xdc, 0x53, - 0xda, 0xd6, 0xae, 0x64, 0x0f, 0xc6, 0xf7, 0xee, 0x70, 0xdc, 0xb4, 0xdf, - 0x59, 0x3a, 0x9e, 0xc6, 0xcf, 0x3e, 0x42, 0x65, 0x60, 0xb4, 0xa8, 0x37, - 0xb2, 0x75, 0x56, 0x61, 0x9f, 0xfa, 0x2e, 0x82, 0x63, 0x60, 0xca, 0x30, - 0x5f, 0xb6, 0xb9, 0x0c, 0xd5, 0x9e, 0x63, 0x92, 0x97, 0x8c, 0x75, 0x9e, - 0xbd, 0x34, 0x9b, 0x19, 0x41, 0x3c, 0xfb, 0x80, 0x6e, 0xf0, 0x0e, 0xae, - 0xa7, 0xab, 0xc2, 0xbc, 0x40, 0x6a, 0x6c, 0x61, 0xa4, 0x13, 0xf5, 0x16, - 0xdc, 0xcb, 0x01, 0x22, 0x1a, 0xd2, 0xdf, 0x62, 0x4b, 0x31, 0x25, 0xcb, - 0x17, 0x9f, 0xff, 0x97, 0xbf, 0xcc, 0x6a, 0xb8, 0xc9, 0x52, 0xa7, 0xb6, - 0x38, 0x64, 0xb8, 0x68, 0xa0, 0x55, 0xf5, 0xa2, 0x85, 0x8f, 0xc5, 0x78, - 0xdb, 0xf4, 0x5d, 0x8f, 0x99, 0x23, 0xf3, 0x2f, 0xea, 0x5f, 0x64, 0x62, - 0x4b, 0x44, 0x07, 0x99, 0x18, 0xb3, 0xc1, 0x86, 0x14, 0xdb, 0x55, 0x85, - 0x35, 0xb2, 0x89, 0xbd, 0x01, 0x8d, 0xd7, 0x0e, 0xd7, 0xcb, 0x98, 0x40, - 0x6a, 0xb9, 0xc7, 0x44, 0x96, 0xf7, 0x79, 0x8a, 0x06, 0x6b, 0x61, 0xfa, - 0xc9, 0x47, 0x3c, 0x8f, 0x67, 0x10, 0x69, 0xb2, 0x4b, 0x98, 0x84, 0x41, - 0x05, 0xfd, 0x2b, 0xc9, 0x81, 0xf4, 0xfc, 0x27, 0x03, 0xb1, 0x6e, 0x35, - 0xf6, 0x72, 0x5a, 0x3f, 0xb7, 0xbc, 0xfd, 0x96, 0xec, 0x91, 0x75, 0xd0, - 0x2c, 0xdf, 0xf9, 0x5b, 0x10, 0x63, 0xe0, 0xc4, 0xd9, 0x92, 0x19, 0x6b, - 0xc1, 0xbc, 0x5b, 0x29, 0x55, 0x26, 0x96, 0x51, 0xd3, 0x09, 0xb8, 0x5c, - 0x9d, 0x67, 0x0a, 0xab, 0x7e, 0xbf, 0x1f, 0x52, 0xd3, 0x3d, 0x72, 0x65, - 0x20, 0x3d, 0xcc, 0x68, 0x9b, 0xc1, 0x10, 0x60, 0xc0, 0x29, 0x5a, 0x5a, - 0x53, 0x03, 0xb4, 0xa8, 0x5c, 0x9b, 0x77, 0x84, 0x59, 0xc3, 0x64, 0xd6, - 0xa7, 0x1c, 0xed, 0xaa, 0xea, 0xdb, 0x45, 0x3e, 0x43, 0xd0, 0xda, 0x2a, - 0xc6, 0x51, 0x54, 0xb2, 0x15, 0xc6, 0xb2, 0x49, 0x4a, 0x32, 0x71, 0xef, - 0x0a, 0xb8, 0xc0, 0xed, 0x6a, 0x7f, 0xb9, 0x4c, 0x0c, 0xd5, 0x1d, 0x5e, - 0xff, 0x92, 0xa7, 0x91, 0x22, 0xe6, 0x86, 0xb3, 0xf1, 0x45, 0x80, 0xd0, - 0xee, 0x72, 0xc6, 0x45, 0x31, 0xc2, 0xb6, 0xbe, 0x59, 0xbc, 0x0e, 0x91, - 0xa4, 0xfe, 0x05, 0x31, 0x86, 0x42, 0xef, 0x5a, 0x7b, 0x85, 0xf9, 0x01, - 0xfd, 0xb4, 0x0d, 0xe1, 0xf4, 0xe4, 0x3a, 0xa8, 0xfc, 0xf8, 0xdb, 0x34, - 0xfe, 0x61, 0x30, 0x39, 0xb9, 0x0a, 0xad, 0x20, 0x66, 0x0b, 0xa9, 0x68, - 0x1c, 0xdc, 0x81, 0xec, 0xca, 0xfe, 0x18, 0x7f, 0x0f, 0xb0, 0x0e, 0x3d, - 0x0e, 0xf7, 0x6f, 0xe7, 0x16, 0xad, 0xc8, 0x1d, 0x07, 0xd4, 0x02, 0x1e, - 0x7f, 0x5f, 0x48, 0x7b, 0xf4, 0x1a, 0xba, 0xd6, 0x47, 0x4b, 0xa2, 0xeb, - 0x26, 0x9a, 0x93, 0x7c, 0xb4, 0xe1, 0xb4, 0xbd, 0x24, 0x8d, 0x15, 0x59, - 0xf5, 0xdb, 0x98, 0x18, 0x14, 0x6a, 0xf9, 0xc3, 0x30, 0x41, 0xcd, 0xca, - 0xc8, 0x0b, 0x2b, 0xb2, 0xe2, 0x46, 0x34, 0xfb, 0x3d, 0xaa, 0x1d, 0xc7, - 0x51, 0xd5, 0xb2, 0xbc, 0xd7, 0xe8, 0x51, 0x7d, 0x5a, 0x93, 0x10, 0xfa, - 0xd3, 0xb9, 0x77, 0x98, 0x63, 0x3b, 0x63, 0xdb, 0x21, 0xba, 0x06, 0x42, - 0x4a, 0x6c, 0xe5, 0x5d, 0x16, 0x67, 0xdd, 0xa7, 0x7f, 0x19, 0x30, 0x6e, - 0x30, 0xb0, 0x05, 0x4a, 0x76, 0x40, 0x54, 0x7f, 0x3c, 0x75, 0x41, 0x8d, - 0x36, 0x65, 0x75, 0x0d, 0xc2, 0x50, 0xd0, 0xcb, 0x28, 0x56, 0xd2, 0x2c, - 0x3e, 0x39, 0x86, 0x39, 0xce, 0xd4, 0xb1, 0x71, 0x1b, 0x54, 0xe9, 0x36, - 0x63, 0x5c, 0xe2, 0x0f, 0x1e, 0x3f, 0xef, 0x6e, 0x0a, 0xe9, 0x9b, 0x12, - 0x89, 0x18, 0x54, 0xc2, 0x24, 0xfc, 0x93, 0xfd, 0xd2, 0x8f, 0x05, 0x7c, - 0x5d, 0xd2, 0x30, 0x37, 0xed, 0x53, 0x2d, 0xa3, 0x29, 0x70, 0x81, 0x54, - 0xb4, 0x0b, 0xcf, 0x44, 0xeb, 0x8a, 0xd5, 0xd0, 0x2c, 0x78, 0xd6, 0x56, - 0xe1, 0xd3, 0x7e, 0xee, 0xeb, 0xc1, 0xbf, 0x5f, 0xc9, 0x71, 0x42, 0x2e, - 0xeb, 0xd0, 0xd2, 0x92, 0xdf, 0xe6, 0xc1, 0xff, 0xaf, 0x96, 0x5e, 0x68, - 0xc0, 0x11, 0x4e, 0x58, 0x75, 0xd6, 0xf9, 0xf0, 0xdb, 0xe2, 0x24, 0xcc, - 0xdd, 0xdc, 0x3c, 0xdc, 0x20, 0xc7, 0x2c, 0xc9, 0x3c, 0x22, 0x9e, 0x09, - 0x64, 0x81, 0x04, 0x22, 0xd9, 0xf9, 0x29, 0x82, 0xad, 0x38, 0xbd, 0x37, - 0xac, 0xb2, 0xaf, 0xe3, 0x2c, 0x47, 0x4e, 0x8d, 0x1a, 0x92, 0x5a, 0xe8, - 0x8c, 0xba, 0x0e, 0x73, 0x4c, 0x59, 0x5d, 0xad, 0x2c, 0xe7, 0x20, 0xbf, - 0xbc, 0x74, 0x45, 0x16, 0x5e, 0x2a, 0xfc, 0x2d, 0x8c, 0xb2, 0x41, 0x7b, - 0x01, 0xe7, 0xb3, 0x8c, 0x70, 0x66, 0x87, 0xdc, 0xfa, 0x03, 0xf9, 0x16, - 0x91, 0x7c, 0xe0, 0x47, 0xd4, 0xad, 0xf9, 0x68, 0xfb, 0xf8, 0x30, 0xc4, - 0x18, 0x8e, 0x94, 0xd5, 0x13, 0xd1, 0x5c, 0x49, 0xce, 0x5f, 0x23, 0x04, - 0x39, 0x86, 0xf0, 0x01, 0x76, 0x95, 0x49, 0xcb, 0xf4, 0xa9, 0x7f, 0x8c, - 0xdc, 0x66, 0x92, 0x29, 0x64, 0x45, 0x7e, 0xf8, 0x60, 0xaf, 0x49, 0xdd, - 0xd4, 0x85, 0x92, 0x2e, 0x57, 0x78, 0x55, 0x2d, 0xf3, 0x28, 0x95, 0x1e, - 0x4b, 0xa6, 0x6b, 0x55, 0xb1, 0xdf, 0xd8, 0x9b, 0x84, 0x72, 0x4d, 0xe3, - 0x4e, 0x00, 0xac, 0x06, 0x21, 0xe9, 0xd7, 0x8b, 0xef, 0x76, 0xb2, 0xe3, - 0xf4, 0x28, 0xa9, 0xed, 0xe1, 0xc1, 0x41, 0x74, 0xf0, 0xbe, 0x3e, 0x6f, - 0x6c, 0x43, 0x64, 0xca, 0x84, 0xa2, 0xb3, 0xe1, 0xe9, 0x50, 0x22, 0x42, - 0xea, 0xb8, 0x99, 0xe2, 0x79, 0xf0, 0x26, 0x2c, 0xdf, 0x81, 0xc1, 0xd0, - 0x2d, 0xcc, 0xd3, 0xef, 0x6e, 0x66, 0x14, 0xa0, 0x64, 0x64, 0x7c, 0x4f, - 0x0b, 0x53, 0x8a, 0xba, 0x32, 0xf2, 0xc2, 0x21, 0x67, 0xc3, 0x8f, 0x6b, - 0x49, 0x51, 0xba, 0xa6, 0x59, 0xc1, 0xe6, 0x60, 0xe1, 0x90, 0x58, 0xf9, - 0x7d, 0x58, 0x97, 0x51, 0xf0, 0x35, 0x2b, 0xdb, 0xc8, 0x92, 0xa2, 0x53, - 0xb1, 0xe4, 0xce, 0x23, 0x5c, 0x0b, 0x83, 0xb2, 0x68, 0xb6, 0x87, 0xaf, - 0xa1, 0xd3, 0xe7, 0x8d, 0xdf, 0x88, 0x21, 0x8c, 0x80, 0x8f, 0x37, 0x58, - 0xb6, 0x97, 0x11, 0x35, 0x6f, 0x7b, 0x99, 0xf9, 0xad, 0x87, 0xb3, 0x09, - 0x62, 0x46, 0xe6, 0xf0, 0x9c, 0x2e, 0x11, 0x6f, 0xf7, 0x71, 0xbe, 0x5c, - 0x8e, 0x11, 0xb9, 0x2f, 0xf5, 0x98, 0x4d, 0x25, 0xaf, 0x23, 0x3b, 0xa5, - 0x06, 0x96, 0x03, 0x18, 0x36, 0x2b, 0x5b, 0x4c, 0x74, 0x34, 0xb6, 0xf5, - 0x80, 0x07, 0x0f, 0x7b, 0xf9, 0x73, 0xc0, 0xca, 0xb0, 0xd6, 0xbf, 0x20, - 0xb1, 0xfd, 0xd0, 0xed, 0xd9, 0xdf, 0x09, 0xb2, 0x82, 0x72, 0x5b, 0xf2, - 0x93, 0x6d, 0x7c, 0xb8, 0xa9, 0xd4, 0xff, 0x2c, 0x94, 0x4e, 0xf5, 0xea, - 0x09, 0x83, 0x8a, 0x6a, 0x35, 0x6e, 0x20, 0xce, 0xe1, 0x09, 0xfd, 0xcd, - 0xd2, 0x75, 0x8c, 0x92, 0x7a, 0xe1, 0xce, 0xce, 0x55, 0xb9, 0x9a, 0xb8, - 0x9e, 0x1f, 0xfd, 0xf6, 0x22, 0x46, 0x76, 0xe8, 0xeb, 0x4d, 0x56, 0x8c, - 0x67, 0x1e, 0x1c, 0x62, 0xa9, 0x00, 0x40, 0xcd, 0xf8, 0xd9, 0x93, 0x9d, - 0xaa, 0xe1, 0xf4, 0x2c, 0x75, 0x69, 0xdd, 0x59, 0x5a, 0x10, 0x5d, 0x9e, - 0x5a, 0xaa, 0xf5, 0xf3, 0xe2, 0xc5, 0xef, 0xcf, 0x9c, 0x69, 0x15, 0x4c, - 0xad, 0xf8, 0x32, 0x91, 0x9a, 0xb6, 0xcb, 0x0a, 0x0a, 0x3c, 0x22, 0xf5, - 0x85, 0xb8, 0x9f, 0xf5, 0x5f, 0xe0, 0xae, 0xc1, 0xaa, 0x70, 0xb7, 0x8a, - 0x53, 0x8d, 0xe5, 0xb9, 0x45, 0x09, 0x74, 0xb2, 0x10, 0x70, 0xe1, 0x6f, - 0xb9, 0x19, 0xde, 0x4a, 0xbb, 0xbe, 0xb7, 0x9f, 0x5a, 0xa9, 0x16, 0x54, - 0x6e, 0x97, 0x51, 0x53, 0x1f, 0xe6, 0xfa, 0xe3, 0x5e, 0x62, 0x00, 0x0f, - 0x13, 0xd0, 0xa0, 0xf6, 0x2c, 0xba, 0x5d, 0xc0, 0x90, 0x00, 0xc8, 0x6b, - 0x53, 0xfc, 0x0d, 0xfc, 0xff, 0x99, 0xbf, 0xed, 0x98, 0x3b, 0xbb, 0xe6, - 0x80, 0x6b, 0xb6, 0xa5, 0xc2, 0x70, 0xb0, 0xcd, 0x91, 0xc5, 0x43, 0xf4, - 0x84, 0x6d, 0xb1, 0x2f, 0x1c, 0xfb, 0x84, 0xe3, 0x57, 0xd8, 0xae, 0x73, - 0x19, 0x69, 0x6a, 0x87, 0x67, 0xcb, 0x4d, 0x4e, 0xbe, 0xcb, 0xa2, 0xd6, - 0x72, 0xcd, 0x96, 0xc3, 0x07, 0x68, 0xb5, 0x09, 0x8d, 0x10, 0x49, 0x7e, - 0xc6, 0x1f, 0x6b, 0x92, 0x5e, 0x33, 0x30, 0x00, 0xa3, 0x35, 0x56, 0x57, - 0x5a, 0x1a, 0x0b, 0x40, 0xd4, 0x0a, 0x06, 0xdb, 0x24, 0x51, 0x1d, 0x39, - 0x4d, 0xf4, 0x72, 0x5f, 0xbf, 0x3d, 0xd5, 0x21, 0xd0, 0x73, 0x68, 0x42, - 0x66, 0x20, 0x86, 0x3f, 0xb9, 0xd7, 0x6e, 0x7d, 0x63, 0x43, 0xfb, 0x21, - 0x6b, 0x7e, 0x69, 0xaf, 0xef, 0xf3, 0x6e, 0xd9, 0xae, 0x6a, 0x00, 0x2e, - 0x92, 0x03, 0x21, 0x11, 0x95, 0x9a, 0xe9, 0x7d, 0xc4, 0x8c, 0xaa, 0xa1, - 0x9e, 0xd6, 0x30, 0x84, 0x8f, 0xe5, 0x8f, 0x3f, 0x1a, 0x73, 0x53, 0xb2, - 0x5c, 0xb0, 0x73, 0x41, 0x23, 0x01, 0x80, 0xac, 0x17, 0xa4, 0x73, 0xd5, - 0xd9, 0x07, 0xff, 0xcf, 0xd2, 0x5f, 0xbf, 0x15, 0xc0, 0x8c, 0x62, 0xe1, - 0x67, 0x34, 0xf7, 0x00, 0xe4, 0x62, 0x62, 0x29, 0x71, 0xa2, 0xc2, 0x6f, - 0xfd, 0xb1, 0xd9, 0x60, 0x93, 0x34, 0xf0, 0x24, 0x06, 0x0e, 0x62, 0x93, - 0xfd, 0xb3, 0x7d, 0x24, 0x56, 0x05, 0x53, 0x07, 0x56, 0x84, 0x24, 0x19, - 0xfe, 0x76, 0xbf, 0xbe, 0x86, 0x57, 0xca, 0x50, 0x41, 0x21, 0x87, 0x5e, - 0x91, 0x2d, 0x3b, 0xd1, 0xbd, 0x1f, 0x73, 0xb9, 0x6f, 0x4b, 0x71, 0x6a, - 0x6b, 0x90, 0xce, 0x19, 0xc3, 0x45, 0x45, 0xa5, 0xdb, 0xe6, 0x4f, 0xac, - 0x4b, 0x83, 0x02, 0x38, 0xff, 0x2b, 0xb1, 0x36, 0xd4, 0xc2, 0x7d, 0x29, - 0x73, 0x5f, 0xcb, 0x84, 0xf9, 0x64, 0xb0, 0x85, 0x49, 0x34, 0x8e, 0xa8, - 0x87, 0x37, 0xfe, 0xb2, 0xd7, 0x14, 0xe5, 0x7c, 0x78, 0x28, 0x2f, 0x86, - 0x29, 0xe2, 0x29, 0x6e, 0x3d, 0x80, 0x73, 0x14, 0xc5, 0xa6, 0xde, 0x56, - 0x3f, 0xb3, 0xd2, 0x60, 0x8c, 0x5f, 0x1f, 0x36, 0x2f, 0xd2, 0x2a, 0x39, - 0x5d, 0xff, 0x09, 0x1a, 0x64, 0x70, 0x9a, 0x56, 0xb0, 0x3e, 0x5d, 0xee, - 0x20, 0xe8, 0xb4, 0x20, 0x13, 0x9a, 0x1b, 0x51, 0x23, 0xb9, 0xa8, 0x55, - 0xa4, 0xed, 0xc7, 0xea, 0x16, 0x18, 0x9a, 0x89, 0x39, 0x7e, 0x97, 0xa4, - 0x52, 0xb7, 0x42, 0x4d, 0x84, 0x76, 0x54, 0x8d, 0x2f, 0x34, 0x91, 0xca, - 0xaa, 0x42, 0x74, 0x2f, 0x69, 0x2f, 0x6f, 0x8b, 0x6e, 0xf0, 0x07, 0x87, - 0xa4, 0xef, 0x33, 0x58, 0x06, 0x14, 0x01, 0xba, 0xf3, 0x83, 0x0e, 0x5c, - 0xb0, 0xb9, 0x1d, 0xe3, 0x0b, 0x9b, 0x1b, 0xe9, 0x7c, 0x64, 0x51, 0x81, - 0xeb, 0xa8, 0x56, 0x88, 0xd8, 0xcb, 0xf4, 0xfc, 0x88, 0x64, 0x3c, 0xa8, - 0x6c, 0x18, 0x19, 0x9d, 0x7c, 0x35, 0xc4, 0x81, 0xda, 0xa1, 0x4b, 0x34, - 0xd8, 0xb9, 0x68, 0x81, 0x88, 0xb9, 0x67, 0xdf, 0xcd, 0x1c, 0xbd, 0x0a, - 0x8b, 0x5f, 0xb2, 0xfd, 0xb4, 0xe5, 0x0e, 0xde, 0x8e, 0xa9, 0x4c, 0x69, - 0x65, 0x04, 0xb0, 0x64, 0xf7, 0xc0, 0xea, 0x2e, 0x35, 0xf3, 0x97, 0xe9, - 0xd9, 0x6b, 0x0b, 0x4e, 0x97, 0x36, 0x55, 0x02, 0xf9, 0x7f, 0x04, 0x2e, - 0x4d, 0x15, 0x84, 0x3f, 0x4e, 0xc0, 0xcb, 0xff, 0x99, 0xf0, 0x0a, 0xd4, - 0xeb, 0x64, 0x7c, 0x28, 0xa5, 0x05, 0x5d, 0xa0, 0x44, 0xdd, 0x4b, 0x13, - 0x03, 0xcf, 0x4c, 0x4b, 0x35, 0x76, 0xc4, 0x20, 0x86, 0xd5, 0xc4, 0x42, - 0xb0, 0x47, 0x1a, 0x83, 0xfd, 0xbf, 0xd6, 0x30, 0x87, 0xff, 0x23, 0xab, - 0xc7, 0x9b, 0xd3, 0x2c, 0x30, 0x3b, 0x58, 0x54, 0xa8, 0x05, 0x27, 0xb0, - 0x1e, 0x10, 0x3e, 0xde, 0xad, 0x13, 0x34, 0xf6, 0x77, 0xe5, 0xee, 0x9b, - 0x17, 0xe4, 0xe8, 0x8c, 0x1e, 0x1e, 0x1e, 0xcc, 0xee, 0xb0, 0xb8, 0x69, - 0xe4, 0x67, 0xc3, 0xd1, 0x22, 0xd7, 0xa4, 0x13, 0x86, 0xf5, 0xc9, 0xb3, - 0x90, 0x15, 0xfb, 0xb6, 0x9d, 0xdf, 0x0a, 0x15, 0xa5, 0xdc, 0xc3, 0x3d, - 0xcd, 0x5b, 0x68, 0xc1, 0xd3, 0x9f, 0xa3, 0x9b, 0xd5, 0x13, 0xfc, 0x2e, - 0x34, 0x22, 0xb7, 0xcc, 0x39, 0x22, 0xb8, 0x78, 0x2f, 0x4e, 0x05, 0xeb, - 0x07, 0x2f, 0xad, 0x07, 0x30, 0xcf, 0x2a, 0x8f, 0x64, 0x1c, 0x3b, 0xc2, - 0x38, 0xa0, 0x1f, 0x07, 0x78, 0x48, 0x2b, 0x6f, 0x13, 0x7d, 0x7a, 0x57, - 0x52, 0xdb, 0xfa, 0xe6, 0x74, 0x96, 0x18, 0x2c, 0x51, 0x69, 0x29, 0x7b, - 0x40, 0xde, 0xf2, 0x60, 0x2d, 0xf3, 0x01, 0x61, 0xaa, 0x52, 0x0d, 0x10, - 0x03, 0xe2, 0x3d, 0xed, 0x57, 0xe9, 0xe1, 0xc8, 0x9e, 0x1f, 0xb4, 0x98, - 0xc1, 0x6b, 0x96, 0xd2, 0xd9, 0xf2, 0x8c, 0xc2, 0x92, 0x15, 0x71, 0x44, - 0x6c, 0xea, 0x9a, 0xc3, 0xb3, 0xa0, 0xf0, 0xaa, 0x23, 0x9e, 0x48, 0x1f, - 0x11, 0x3a, 0xbb, 0x72, 0x93, 0x18, 0x31, 0x50, 0x96, 0x2f, 0x6b, 0x11, - 0xd6, 0x8a, 0x4d, 0x99, 0xcf, 0x41, 0x4d, 0x90, 0x9e, 0xb8, 0x85, 0x9c, - 0x3c, 0x47, 0x8a, 0x8d, 0x05, 0xa8, 0xba, 0xea, 0x20, 0x82, 0x35, 0xd3, - 0xff, 0xf2, 0xf4, 0x38, 0x87, 0x2b, 0x83, 0xf1, 0xb2, 0x55, 0x17, 0xab, - 0x82, 0x65, 0x09, 0xb9, 0xfe, 0xa7, 0x75, 0xdc, 0x71, 0xef, 0xb8, 0x92, - 0xe0, 0xf2, 0xe2, 0xcf, 0xc9, 0x31, 0xeb, 0x21, 0x48, 0xca, 0xb6, 0xb1, - 0x98, 0xda, 0x73, 0x16, 0x7b, 0x95, 0xa8, 0xf8, 0x20, 0x49, 0xea, 0x00, - 0xcb, 0x51, 0x4f, 0x25, 0x23, 0x67, 0x75, 0xec, 0xf7, 0xd0, 0xd5, 0x10, - 0xa7, 0x48, 0x6f, 0x4b, 0x3f, 0x0d, 0x01, 0xf2, 0x14, 0xda, 0x8a, 0x61, - 0x92, 0x0f, 0x9e, 0x2f, 0x6f, 0xe4, 0x6b, 0x56, 0xf7, 0x49, 0x14, 0x6d, - 0xa1, 0x0c, 0x44, 0x07, 0x3a, 0x0a, 0x52, 0xb0, 0x4f, 0x97, 0x05, 0xc1, - 0x3c, 0x31, 0x7b, 0x5e, 0x53, 0x1f, 0x6a, 0x4e, 0x6e, 0xe2, 0xd3, 0x86, - 0x74, 0x5f, 0x85, 0xa4, 0x02, 0x42, 0x59, 0x2a, 0xbe, 0xe6, 0x10, 0x85, - 0x41, 0x8a, 0x9c, 0xfe, 0xa5, 0x6e, 0x86, 0x84, 0x1a, 0xe8, 0x51, 0x89, - 0xa1, 0xf7, 0x80, 0xf3, 0x87, 0xb1, 0x3b, 0x84, 0x47, 0x63, 0xdc, 0x78, - 0x5a, 0xb8, 0x20, 0xac, 0x5a, 0x3b, 0xfb, 0xec, 0xcb, 0x21, 0x1f, 0xd2, - 0x3d, 0xbd, 0x76, 0x77, 0xf1, 0x73, 0x9b, 0x23, 0x16, 0x16, 0xe0, 0xbc, - 0xe7, 0x20, 0x75, 0x3d, 0xe1, 0xb2, 0xf6, 0x7c, 0x7c, 0x0f, 0xf8, 0xc5, - 0x74, 0x20, 0x47, 0xf5, 0x88, 0xfb, 0xf0, 0xc6, 0x7b, 0xee, 0x2c, 0x45, - 0xb5, 0xb8, 0x12, 0x1b, 0x16, 0x4b, 0x25, 0x72, 0xa2, 0xde, 0x53, 0x89, - 0xaf, 0x13, 0x86, 0x2e, 0xbd, 0x33, 0xbd, 0x6c, 0x91, 0x51, 0x0d, 0x4c, - 0x7d, 0x12, 0x4b, 0x6d, 0xcd, 0x17, 0x33, 0x09, 0x77, 0xb4, 0x60, 0x30, - 0xd3, 0x35, 0x70, 0x0e, 0xa4, 0x52, 0x37, 0x31, 0x52, 0xb1, 0x0b, 0x26, - 0xb1, 0xf5, 0x45, 0x2b, 0xe9, 0xec, 0x51, 0xd3, 0x28, 0xf7, 0xd0, 0x45, - 0x93, 0x3e, 0x63, 0xf2, 0x60, 0x13, 0xc5, 0xd8, 0x22, 0xfd, 0xd2, 0x9b, - 0x22, 0x70, 0x56, 0xd4, 0xae, 0x91, 0x8c, 0xb2, 0xa4, 0xe8, 0x0b, 0x43, - 0xd2, 0x91, 0x32, 0xe9, 0x42, 0x34, 0x85, 0x15, 0x87, 0x95, 0x12, 0x1c, - 0xac, 0x50, 0xe0, 0xc7, 0x08, 0xfa, 0x34, 0x9f, 0x72, 0x30, 0xa8, 0x12, - 0x18, 0x65, 0x2c, 0x26, 0x7b, 0xe9, 0x91, 0x52, 0x3a, 0xbf, 0xbe, 0x1a, - 0xcc, 0xac, 0x05, 0x7b, 0x3b, 0xfd, 0xf4, 0x63, 0xce, 0x40, 0xed, 0x69, - 0xb2, 0x0f, 0x69, 0x22, 0xad, 0x6f, 0x81, 0x9a, 0x73, 0x73, 0x7e, 0x89, - 0x37, 0x70, 0x24, 0xd8, 0x8e, 0x90, 0x9d, 0xe5, 0xce, 0xaf, 0xdb, 0xb1, - 0x99, 0x8c, 0x42, 0xad, 0x9b, 0xc8, 0x60, 0x1d, 0x86, 0x0f, 0x33, 0x88, - 0x7e, 0x14, 0x46, 0x3d, 0x04, 0xfa, 0x02, 0x10, 0x8b, 0x89, 0x15, 0x15, - 0xff, 0x3d, 0x55, 0x09, 0x48, 0xb2, 0x25, 0xd3, 0x10, 0x93, 0x03, 0x02, - 0xe7, 0x13, 0xdb, 0x71, 0xc4, 0x1a, 0x34, 0x16, 0xb0, 0xac, 0x64, 0x72, - 0xb1, 0x41, 0xee, 0x5a, 0xb6, 0xed, 0x6b, 0x25, 0x80, 0xf1, 0x87, 0x59, - 0x76, 0xad, 0x73, 0x15, 0x66, 0xcc, 0xff, 0x2b, 0x1e, 0xd0, 0x50, 0xf8, - 0xe3, 0xae, 0x06, 0x7b, 0xaf, 0xda, 0x1f, 0xe6, 0x4f, 0xbe, 0x60, 0x2e, - 0x41, 0xce, 0xd4, 0x81, 0x34, 0x46, 0x68, 0x40, 0x19, 0x8e, 0x56, 0x30, - 0xe4, 0xaf, 0xe1, 0x05, 0x0a, 0x9f, 0x42, 0xbc, 0xf8, 0x95, 0x7d, 0x8c, - 0xb5, 0xf6, 0xb2, 0x06, 0x46, 0x20, 0x54, 0x8f, 0xac, 0x40, 0xee, 0xdf, - 0xa0, 0x11, 0xdc, 0x2e, 0x65, 0xe0, 0x57, 0x96, 0x50, 0xa9, 0xba, 0x70, - 0x2e, 0x74, 0xf3, 0xe6, 0xa5, 0xf7, 0x7a, 0xb0, 0x5d, 0x4c, 0x07, 0x83, - 0x2b, 0xed, 0xe5, 0x34, 0x3b, 0xf9, 0xfa, 0x4b, 0x84, 0x8a, 0x35, 0x12, - 0xce, 0xa0, 0x5a, 0x5d, 0x99, 0x37, 0x0b, 0x64, 0x8a, 0x8e, 0x93, 0xf9, - 0xea, 0x19, 0xc2, 0xa0, 0x3a, 0x7d, 0xe3, 0x55, 0xaa, 0x49, 0xd1, 0xdf, - 0x88, 0xde, 0x32, 0x74, 0x59, 0x0f, 0x96, 0xc1, 0xf0, 0x4c, 0x55, 0xf2, - 0x8e, 0xd8, 0xa3, 0xb5, 0x08, 0x45, 0x79, 0x0b, 0x37, 0x63, 0x8a, 0x61, - 0xec, 0x06, 0xc5, 0x28, 0x1f, 0x79, 0x27, 0xcd, 0xe3, 0xd7, 0x22, 0xc2, - 0x4f, 0xc3, 0xd6, 0xba, 0x42, 0x2a, 0x45, 0xa3, 0x54, 0x9d, 0x12, 0x86, - 0xcb, 0xb3, 0xbf, 0xfc, 0xf6, 0x04, 0x6b, 0xf7, 0x66, 0x41, 0xc0, 0x55, - 0x7b, 0xab, 0xd6, 0x66, 0xc2, 0x36, 0x28, 0xd0, 0x33, 0x07, 0x05, 0x14, - 0x45, 0x0d, 0x3e, 0x5c, 0x6a, 0xe6, 0x50, 0xae, 0x30, 0x71, 0x8a, 0x5a, - 0x03, 0xe5, 0x07, 0xec, 0x35, 0x17, 0xb3, 0x3c, 0x95, 0xd6, 0x5b, 0x6e, - 0xcc, 0xc7, 0xb4, 0x26, 0x94, 0xab, 0xd7, 0x4c, 0xfb, 0x25, 0x76, 0x2c, - 0x1c, 0x93, 0xa1, 0x44, 0x91, 0x7e, 0x74, 0x6f, 0xf4, 0x71, 0xfe, 0xff, - 0x41, 0x5c, 0xd1, 0xfe, 0x93, 0x21, 0x74, 0x78, 0x96, 0xf9, 0x9d, 0xa7, - 0xd8, 0x86, 0xfc, 0x4a, 0xd1, 0xbc, 0xe7, 0x01, 0x4f, 0x23, 0x1f, 0x1e, - 0x36, 0x27, 0x74, 0xd4, 0xd1, 0xbb, 0x5e, 0xc5, 0xe9, 0xe2, 0xc5, 0x63, - 0x79, 0x20, 0x3e, 0xdd, 0xe0, 0x2f, 0x45, 0xb2, 0x3a, 0x10, 0x69, 0x69, - 0x11, 0x61, 0x6a, 0xcd, 0xf6, 0x97, 0x14, 0x38, 0xb4, 0xbd, 0x84, 0x03, - 0xce, 0xba, 0x36, 0xa0, 0x82, 0x9a, 0xcb, 0xb3, 0xab, 0x30, 0x5a, 0xd2, - 0x51, 0x3b, 0x16, 0x0b, 0xfe, 0x74, 0x3a, 0x5c, 0x57, 0xa7, 0xce, 0x81, - 0xf4, 0xd5, 0x91, 0x68, 0xb6, 0x37, 0xc3, 0xba, 0x4d, 0xb3, 0xe4, 0xe0, - 0x5d, 0x7c, 0x82, 0xfd, 0x45, 0x2e, 0x3d, 0x2d, 0x4f, 0xc6, 0xc6, 0x50, - 0x9d, 0xb3, 0xe6, 0x72, 0x51, 0x88, 0x4d, 0x97, 0x04, 0x93, 0xa3, 0x45, - 0x44, 0x7a, 0x8b, 0x7c, 0x85, 0x2a, 0x97, 0x15, 0x06, 0x1b, 0x97, 0x7e, - 0x18, 0x52, 0xe6, 0xec, 0xbc, 0xa4, 0x3a, 0x04, 0x95, 0x78, 0x3b, 0xca, - 0xf1, 0x90, 0xa8, 0x6b, 0x6d, 0xde, 0x6d, 0x67, 0x46, 0x42, 0x04, 0x46, - 0xc0, 0x1d, 0x34, 0xc1, 0xe1, 0x6c, 0xf2, 0xe3, 0xa6, 0x56, 0xfe, 0x3c, - 0x7b, 0x40, 0x69, 0x16, 0x71, 0xc1, 0x83, 0x4c, 0x2c, 0x11, 0x50, 0xfd, - 0x7a, 0x3f, 0xd7, 0xca, 0xeb, 0x55, 0x8e, 0x70, 0x57, 0x9b, 0x67, 0x9e, - 0x1e, 0x04, 0x0b, 0x0c, 0x63, 0x35, 0x3d, 0x72, 0x56, 0x5a, 0xc9, 0x50, - 0x09, 0x3c, 0x1c, 0x04, 0x59, 0x6e, 0x50, 0xaf, 0x3a, 0x90, 0x36, 0xa5, - 0x20, 0x92, 0x79, 0x89, 0xcc, 0xc8, 0xa5, 0xc9, 0x23, 0x46, 0xb1, 0x0a, - 0xfc, 0x98, 0x99, 0xff, 0x67, 0x70, 0x85, 0xcb, 0x24, 0xfd, 0xfd, 0xad, - 0xb5, 0xa8, 0xaf, 0x77, 0xbf, 0xe7, 0xab, 0x9d, 0x3c, 0x7c, 0x56, 0x96, - 0xd6, 0xab, 0x84, 0x20, 0xd6, 0x5d, 0xca, 0xf5, 0x70, 0xeb, 0x91, 0xcd, - 0xb9, 0x5e, 0xc0, 0x2d, 0xd2, 0x8c, 0xe4, 0x70, 0xc1, 0xad, 0x94, 0x60, - 0x66, 0xdb, 0x11, 0x41, 0x79, 0xd4, 0xc4, 0x22, 0x94, 0x7e, 0xad, 0x24, - 0x75, 0x48, 0xbc, 0xc5, 0x4c, 0xc7, 0x40, 0x0f, 0x72, 0x65, 0x27, 0x2a, - 0xbe, 0x60, 0xb7, 0x20, 0x53, 0x1f, 0x1f, 0x09, 0x83, 0x82, 0xca, 0x18, - 0xba, 0xcc, 0x75, 0x24, 0x2a, 0x78, 0x0a, 0xbd, 0x7d, 0x0a, 0x50, 0x7f, - 0x16, 0x4b, 0x87, 0x66, 0x64, 0x42, 0xc7, 0x53, 0x9d, 0x70, 0x1b, 0xa8, - 0x5f, 0x73, 0xda, 0xbc, 0xd8, 0x64, 0x5c, 0x73, 0x15, 0x3a, 0x30, 0x55, - 0x6b, 0x1b, 0xd0, 0x60, 0x64, 0x13, 0x58, 0x71, 0x66, 0xb8, 0x56, 0xad, - 0x87, 0x9f, 0xc5, 0x30, 0x35, 0x63, 0xbb, 0xc5, 0xf7, 0x26, 0x20, 0xef, - 0x53, 0xfe, 0x69, 0xbe, 0xd3, 0x7d, 0x55, 0x87, 0x2d, 0xbf, 0xd8, 0xc1, - 0x79, 0x66, 0xaa, 0x88, 0x51, 0x95, 0x85, 0x98, 0x87, 0xb3, 0x21, 0xd0, - 0x87, 0x5d, 0xa4, 0xcb, 0x5f, 0xde, 0xbf, 0xfe, 0x54, 0xbe, 0x94, 0x02, - 0x5b, 0x1b, 0xc4, 0x59, 0x57, 0xaf, 0x77, 0xa9, 0x06, 0x23, 0x80, 0xff, - 0x34, 0xe1, 0x80, 0x83, 0x12, 0xb5, 0x64, 0x74, 0x83, 0x24, 0xc7, 0x55, - 0x40, 0x79, 0x2e, 0x4f, 0x04, 0xfa, 0x61, 0x8b, 0xe2, 0xa9, 0xc9, 0x69, - 0x22, 0x4e, 0x28, 0x23, 0x3a, 0xa3, 0x51, 0xea, 0x29, 0x10, 0x50, 0xbf, - 0x0d, 0x32, 0x63, 0x86, 0x21, 0xe2, 0x50, 0x3a, 0x3b, 0xff, 0xf6, 0xaa, - 0x1c, 0xbb, 0x1e, 0x62, 0x84, 0x72, 0xaf, 0x65, 0x03, 0x6f, 0x13, 0x64, - 0xc9, 0xdc, 0xc3, 0xc9, 0x9b, 0x7e, 0xfc, 0x67, 0xe0, 0x9c, 0xf5, 0x8a, - 0x85, 0xf5, 0x80, 0xc6, 0xde, 0xda, 0xb6, 0x91, 0x46, 0x2e, 0xda, 0x57, - 0x02, 0x20, 0x0b, 0x86, 0xc9, 0x32, 0x2e, 0xab, 0x30, 0xdd, 0x48, 0xd7, - 0x6c, 0x53, 0x0a, 0xa0, 0x4e, 0x7b, 0x0e, 0x7c, 0x55, 0x90, 0xc3, 0x05, - 0x92, 0x77, 0x49, 0xfe, 0x7d, 0xaa, 0xc8, 0xa2, 0x1b, 0x52, 0x88, 0x85, - 0xb7, 0xdd, 0x6d, 0x76, 0x02, 0x7d, 0x06, 0x56, 0x9e, 0xd0, 0xa5, 0x38, - 0x77, 0x2b, 0xc8, 0x33, 0x9f, 0x29, 0x01, 0x19, 0xc9, 0xf9, 0x48, 0xfb, - 0x9f, 0x99, 0x9b, 0x66, 0x12, 0xb8, 0x19, 0x3d, 0x21, 0xf9, 0x18, 0x88, - 0x2f, 0x4d, 0x10, 0x09, 0x56, 0x92, 0xa4, 0x90, 0xf0, 0x9d, 0x6f, 0x71, - 0x9a, 0xc9, 0xc1, 0xc3, 0x57, 0x4e, 0xf1, 0x33, 0x45, 0xa8, 0x9b, 0x3a, - 0x94, 0xf0, 0xb2, 0x95, 0x0a, 0xbd, 0x29, 0x05, 0xc8, 0x3a, 0x6f, 0x87, - 0xa8, 0x62, 0x82, 0x11, 0x06, 0x9a, 0xeb, 0xec, 0x14, 0x30, 0xe8, 0x40, - 0xb3, 0xb4, 0x0f, 0xdd, 0xb8, 0x43, 0x96, 0x2b, 0xa4, 0x9b, 0x34, 0x37, - 0xd5, 0x60, 0xa8, 0x27, 0x04, 0x5f, 0x73, 0x02, 0x05, 0x78, 0x91, 0x51, - 0x2b, 0xf9, 0xb8, 0x09, 0x69, 0x28, 0xac, 0x61, 0x3f, 0xe3, 0x46, 0xea, - 0xbb, 0x34, 0x4e, 0x0c, 0x1e, 0xa7, 0x58, 0xbc, 0x4f, 0x70, 0x7c, 0x7f, - 0xb5, 0xd4, 0x6d, 0x5f, 0x25, 0x22, 0xc4, 0xd2, 0xf9, 0x15, 0x67, 0x33, - 0xc5, 0x0e, 0x26, 0x18, 0x24, 0xea, 0x1a, 0xee, 0xb1, 0x9f, 0xfe, 0xae, - 0x15, 0x1a, 0x40, 0xb9, 0x06, 0xc6, 0x48, 0xac, 0x06, 0xd2, 0xf1, 0xe7, - 0xdb, 0x2d, 0x43, 0x0f, 0xc8, 0xfb, 0x0f, 0xab, 0x70, 0x52, 0x46, 0x1b, - 0x99, 0x48, 0x61, 0x27, 0xcf, 0x19, 0xdc, 0x48, 0x0f, 0x57, 0x4c, 0xc3, - 0x74, 0x98, 0xc3, 0xa4, 0xa4, 0xce, 0x6c, 0x46, 0x43, 0x42, 0x45, 0x81, - 0xa0, 0xd5, 0x77, 0xac, 0xb7, 0xc6, 0x43, 0x13, 0x96, 0xad, 0x99, 0x9b, - 0xfb, 0xda, 0xbd, 0xbb, 0xf6, 0x75, 0xa1, 0x3c, 0xc8, 0x89, 0x72, 0xa0, - 0x2d, 0x6c, 0x02, 0xda, 0x14, 0x44, 0xeb, 0x87, 0x0f, 0x61, 0xc2, 0x27, - 0x8e, 0x67, 0x64, 0xd7, 0xb2, 0xd2, 0x16, 0xea, 0xed, 0xce, 0xaf, 0xad, - 0x83, 0x4e, 0xc7, 0x01, 0xd3, 0x17, 0x6f, 0x27, 0x6a, 0xa6, 0x6c, 0x12, - 0x06, 0x20, 0x91, 0x5c, 0x81, 0x05, 0x54, 0xe3, 0xc1, 0xd8, 0xbb, 0xb1, - 0x45, 0xef, 0x31, 0x14, 0x99, 0xb8, 0xe1, 0xc2, 0x93, 0x9e, 0x01, 0xe2, - 0xb1, 0x91, 0xe7, 0xcc, 0x7c, 0x5f, 0xf9, 0xef, 0x77, 0x42, 0x93, 0x48, - 0x9d, 0x8e, 0x99, 0x04, 0xe3, 0xba, 0xd4, 0x03, 0xb7, 0x27, 0xbd, 0x43, - 0x74, 0xf8, 0x13, 0x17, 0x57, 0xc4, 0xb8, 0x4d, 0xd6, 0xd5, 0xe0, 0x52, - 0x93, 0xf0, 0x87, 0xb9, 0xc4, 0xbd, 0x45, 0x26, 0xdc, 0x26, 0xc6, 0xa9, - 0x22, 0x8a, 0x8e, 0x0c, 0xa4, 0xb6, 0xf5, 0x39, 0x28, 0x46, 0x26, 0xd9, - 0x6e, 0x68, 0xd6, 0xb3, 0xf4, 0xfa, 0xa4, 0xa4, 0xbd, 0x66, 0xe4, 0x69, - 0x3d, 0x9d, 0x9b, 0x20, 0x50, 0x66, 0x61, 0x75, 0x39, 0x7a, 0xb4, 0x97, - 0xd0, 0x68, 0xa5, 0xba, 0xd0, 0x26, 0x8b, 0x42, 0x41, 0xab, 0x78, 0x03, - 0xd8, 0x83, 0x6d, 0x69, 0x59, 0x68, 0x4a, 0x92, 0x07, 0xdf, 0xb0, 0x2f, - 0x6f, 0x47, 0x93, 0x6f, 0xd4, 0x85, 0x53, 0xad, 0x3b, 0x18, 0xfb, 0xd4, - 0xac, 0x73, 0x71, 0xac, 0x2e, 0x32, 0x4b, 0x87, 0xfd, 0xa9, 0x15, 0xdd, - 0xfe, 0x1a, 0x0e, 0x5b, 0x54, 0xdb, 0x3f, 0x01, 0xbd, 0x81, 0xee, 0x2f, - 0x3b, 0xb8, 0xad, 0xe6, 0x97, 0xc5, 0xb6, 0x39, 0x8a, 0x40, 0xf6, 0x44, - 0xed, 0x62, 0xc0, 0x9b, 0xf4, 0xa3, 0xe4, 0x3a, 0x75, 0x1c, 0xfd, 0x99, - 0xd6, 0x8f, 0xa0, 0x27, 0xb1, 0x8c, 0xad, 0x80, 0xba, 0x01, 0xb8, 0xd9, - 0x32, 0xc8, 0x8c, 0xe7, 0x7f, 0x13, 0x67, 0x56, 0x76, 0x7b, 0x2d, 0x39, - 0x76, 0x06, 0x08, 0xfe, 0x51, 0xcd, 0xcf, 0x9d, 0x59, 0x97, 0x65, 0x22, - 0xa1, 0xa9, 0x97, 0x31, 0x18, 0x77, 0x48, 0x86, 0xfa, 0x79, 0x44, 0xda, - 0xeb, 0xfa, 0xb7, 0x27, 0x48, 0x5f, 0x6c, 0x3b, 0xde, 0x56, 0xc1, 0xe9, - 0x74, 0xf5, 0x9a, 0x7f, 0xfc, 0xf4, 0xb3, 0x51, 0xc8, 0x98, 0x4a, 0xc2, - 0x73, 0x24, 0xee, 0xee, 0x5d, 0x66, 0x30, 0x54, 0xfb, 0x2b, 0xc8, 0xd0, - 0x43, 0xa7, 0x24, 0x73, 0x77, 0x32, 0x33, 0xb8, 0x29, 0xfc, 0x31, 0x92, - 0x25, 0xfd, 0x33, 0x95, 0x5c, 0xfc, 0x74, 0x57, 0x57, 0x00, 0x96, 0xa5, - 0x01, 0xbe, 0xf0, 0x3c, 0xcf, 0xee, 0x39, 0x81, 0x0f, 0x11, 0x81, 0x2d, - 0x86, 0xd1, 0xd3, 0x94, 0xb7, 0x43, 0xd1, 0x97, 0x59, 0x91, 0x93, 0xd9, - 0x3f, 0xb4, 0x1a, 0x04, 0xd2, 0x77, 0x65, 0xda, 0x2f, 0x24, 0x9b, 0xfd, - 0xfa, 0x37, 0x3f, 0x1d, 0xda, 0x1a, 0x46, 0x61, 0x99, 0xef, 0xc2, 0xba, - 0xfa, 0x76, 0xdf, 0x13, 0xe7, 0xc9, 0x20, 0x8d, 0xed, 0x07, 0xc5, 0x35, - 0x66, 0x5d, 0xf5, 0xe9, 0xe0, 0x54, 0x2d, 0x1e, 0xed, 0x75, 0x0f, 0x11, - 0x24, 0xc2, 0xd0, 0x59, 0xab, 0x27, 0x38, 0x6e, 0x48, 0x84, 0x0d, 0xec, - 0xf0, 0xf3, 0x61, 0xfa, 0x37, 0xfb, 0x45, 0xb7, 0xe6, 0x15, 0xfe, 0xfc, - 0x85, 0x0e, 0xf6, 0x50, 0x77, 0x86, 0xef, 0x3f, 0xad, 0x95, 0x25, 0xa3, - 0xb8, 0x15, 0xbd, 0x7d, 0x7e, 0x6a, 0x56, 0x4c, 0xa6, 0xe7, 0xde, 0xb9, - 0xc7, 0xe3, 0x6b, 0x97, 0x20, 0xe9, 0x54, 0x9e, 0xa8, 0x5a, 0xa0, 0x83, - 0x45, 0x44, 0x74, 0x49, 0xd1, 0xf3, 0xb7, 0x63, 0x3d, 0xe7, 0x51, 0x72, - 0x52, 0xe6, 0x9d, 0x5c, 0xe1, 0x59, 0xcb, 0x2a, 0xda, 0xf5, 0x33, 0xfc, - 0xe4, 0xa6, 0x6f, 0x78, 0x3a, 0xdb, 0xcb, 0x47, 0xd0, 0x37, 0x57, 0x56, - 0x63, 0x4a, 0x6d, 0xc0, 0x2f, 0x9e, 0x0b, 0xdd, 0xc5, 0x6f, 0x59, 0x71, - 0x25, 0x55, 0x1b, 0x07, 0x88, 0x1e, 0xf6, 0xdf, 0xc1, 0x32, 0xec, 0x7e, - 0x19, 0x90, 0xa6, 0xc5, 0x18, 0x04, 0xa5, 0x2e, 0x35, 0xcc, 0x59, 0xb4, - 0x3f, 0x80, 0x16, 0xa8, 0xc1, 0x2a, 0x74, 0x44, 0x4c, 0x00, 0x23, 0x6e, - 0xb5, 0xee, 0xc2, 0xbe, 0x6b, 0x54, 0x92, 0xe0, 0x96, 0x87, 0xae, 0x9a, - 0xb2, 0xeb, 0x48, 0x9a, 0x7e, 0x49, 0xfb, 0x76, 0x12, 0xb4, 0x99, 0x98, - 0x39, 0x3a, 0x29, 0x97, 0xcc, 0x44, 0x66, 0xee, 0x7d, 0xc7, 0xbf, 0xc5, - 0x97, 0xff, 0x4f, 0x58, 0xc5, 0x8f, 0xc6, 0x57, 0xe9, 0x35, 0x46, 0x7d, - 0xa3, 0xb2, 0xc2, 0x68, 0x4b, 0x44, 0xd4, 0xda, 0xf3, 0x5e, 0x78, 0xf6, - 0x74, 0xe8, 0x88, 0x7f, 0x44, 0x05, 0x74, 0x8d, 0xab, 0xc5, 0x53, 0x5e, - 0xe8, 0xb5, 0x73, 0xd2, 0x8d, 0x76, 0x4e, 0x2e, 0x2b, 0x96, 0xe9, 0xb1, - 0xb9, 0x26, 0x30, 0x2e, 0x22, 0xdf, 0x4f, 0x1c, 0x57, 0x8a, 0x37, 0x76, - 0x9b, 0xc6, 0xd5, 0x5f, 0xb8, 0xb8, 0x4c, 0x22, 0x38, 0x2a, 0x5a, 0x5b, - 0xf2, 0x9e, 0x2a, 0x7a, 0x33, 0x89, 0xdd, 0x8e, 0x16, 0xcd, 0xa5, 0xc4, - 0xfc, 0xbc, 0xf5, 0x62, 0x45, 0x52, 0xf9, 0x17, 0x52, 0x47, 0x5f, 0xed, - 0x17, 0x8d, 0xb3, 0x56, 0x45, 0xbd, 0x09, 0x4d, 0x7d, 0x7a, 0x9a, 0xa1, - 0x1e, 0x71, 0xbb, 0x54, 0xb7, 0x63, 0xab, 0x69, 0x15, 0x99, 0xb1, 0x8d, - 0xe0, 0xa5, 0x34, 0xd0, 0x2d, 0x52, 0x1f, 0x1d, 0x61, 0x49, 0xfd, 0x7b, - 0x99, 0x28, 0xc6, 0x59, 0xde, 0x31, 0xe1, 0xe7, 0xc3, 0x0a, 0xd3, 0xab, - 0x8f, 0x0c, 0xbf, 0x19, 0xd3, 0x56, 0xf5, 0x43, 0xbb, 0xa3, 0xb7, 0xfc, - 0x2a, 0x0d, 0xdb, 0x07, 0x4a, 0x44, 0x6c, 0x6c, 0xf0, 0x65, 0xc3, 0x41, - 0x61, 0xe4, 0x43, 0xb0, 0x60, 0x03, 0x46, 0xa7, 0x23, 0x95, 0x2d, 0xe1, - 0xcb, 0x9e, 0x22, 0xd6, 0xc3, 0x9d, 0xbe, 0x07, 0x6c, 0xc3, 0x1e, 0xc6, - 0xd3, 0x52, 0x30, 0x85, 0x22, 0x29, 0xca, 0x3d, 0xf8, 0x04, 0xaa, 0x4c, - 0xd1, 0xd1, 0x52, 0x1a, 0xd4, 0xa6, 0x27, 0xbf, 0x9b, 0x50, 0xd6, 0x30, - 0x7f, 0xa0, 0x41, 0xf4, 0x2b, 0x56, 0x16, 0x28, 0xf4, 0x9d, 0x83, 0x12, - 0x43, 0x9a, 0x2a, 0xd6, 0x02, 0xf9, 0x5e, 0x09, 0x59, 0x6d, 0xb2, 0x62, - 0x43, 0xb7, 0x00, 0x94, 0x09, 0x75, 0x34, 0x1b, 0x3a, 0x08, 0x93, 0x76, - 0x9b, 0x74, 0x07, 0x3f, 0x7d, 0x02, 0x4c, 0xc2, 0x8e, 0x6c, 0xd7, 0xbb, - 0xb1, 0x30, 0x1e, 0xd6, 0xb3, 0xbc, 0x5b, 0x1b, 0xfb, 0x25, 0xd5, 0xb0, - 0xd7, 0x97, 0x39, 0x8e, 0xa3, 0xb2, 0x71, 0x33, 0xcb, 0xb4, 0x02, 0x8c, - 0x9d, 0xcc, 0x88, 0x46, 0x2f, 0x5f, 0x2f, 0x02, 0xd1, 0x8b, 0x80, 0xba, - 0x79, 0xb2, 0x8a, 0x1d, 0xf0, 0x91, 0x34, 0xef, 0xc9, 0x8e, 0x4e, 0x81, - 0xed, 0xe8, 0xa4, 0x83, 0xd4, 0x65, 0x78, 0x14, 0x96, 0x76, 0x7c, 0x56, - 0xfe, 0x9b, 0x22, 0x79, 0x2b, 0xe4, 0xd3, 0x87, 0x03, 0xa4, 0xd7, 0xe5, - 0xf9, 0xa8, 0xb8, 0x10, 0x9a, 0x73, 0x6f, 0x95, 0xff, 0xf1, 0xfd, 0x19, - 0x7f, 0x61, 0xa8, 0x35, 0xa9, 0x0a, 0xbb, 0x98, 0x9f, 0x55, 0x61, 0x19, - 0xc4, 0xd0, 0xc6, 0xb2, 0xa7, 0x83, 0x79, 0x7a, 0xe8, 0x57, 0xf9, 0x39, - 0x4f, 0x72, 0xfa, 0xb7, 0x2b, 0xad, 0x47, 0x80, 0x79, 0x2f, 0x93, 0x33, - 0x28, 0x4d, 0x3c, 0x27, 0x8a, 0xba, 0xf7, 0x65, 0x1c, 0x31, 0xb3, 0x36, - 0x91, 0x61, 0x19, 0xc3, 0x9a, 0x8a, 0x06, 0x4d, 0x50, 0x29, 0x6d, 0x37, - 0x97, 0x9d, 0xff, 0xa9, 0x13, 0xd1, 0xd5, 0xa1, 0x53, 0x5d, 0x2c, 0x3e, - 0xef, 0x62, 0x91, 0x95, 0x55, 0x67, 0xb3, 0xf2, 0xb7, 0x22, 0x0b, 0xce, - 0x8e, 0x5b, 0x19, 0x0c, 0xe8, 0x27, 0xde, 0x6b, 0x0a, 0x5f, 0xc8, 0x47, - 0x6b, 0x24, 0x78, 0xa2, 0xcd, 0xf1, 0xf7, 0x08, 0xf8, 0x38, 0xbc, 0xaa, - 0x0d, 0xc0, 0x08, 0x67, 0x88, 0x7a, 0x89, 0x50, 0x66, 0xa1, 0xd1, 0x1b, - 0xc4, 0x8f, 0x06, 0xda, 0x9e, 0x7b, 0xa6, 0x61, 0x00, 0xc4, 0xcc, 0xb4, - 0xed, 0x35, 0x30, 0x89, 0x45, 0x88, 0x3c, 0x49, 0xd0, 0x91, 0xdd, 0xf1, - 0x48, 0x45, 0xd2, 0xa3, 0x01, 0xd1, 0xb0, 0x70, 0x6c, 0xe8, 0xe1, 0x33, - 0x42, 0x30, 0x5b, 0x03, 0x7f, 0x47, 0xda, 0x2f, 0x74, 0x71, 0x25, 0x04, - 0x36, 0x45, 0x08, 0xf1, 0x12, 0x7c, 0x61, 0xc8, 0x8a, 0xe7, 0xe9, 0x9b, - 0xed, 0x67, 0x76, 0x4e, 0x84, 0xac, 0x61, 0x3f, 0x9b, 0x3b, 0x33, 0x4c, - 0x96, 0x67, 0xf5, 0x47, 0x5c, 0x12, 0xff, 0x83, 0x61, 0x3d, 0x02, 0x92, - 0x00, 0x4d, 0x30, 0x62, 0xc5, 0xdd, 0xe5, 0x83, 0xa6, 0xfc, 0x7b, 0x46, - 0x66, 0x29, 0xd7, 0x39, 0xe0, 0xe8, 0xb8, 0x5c, 0x4c, 0xfb, 0x6b, 0x45, - 0xc7, 0x3d, 0xcd, 0xb3, 0x5e, 0x6c, 0xa2, 0xe8, 0xd1, 0x7e, 0xc8, 0x27, - 0xef, 0x21, 0x9a, 0x16, 0xdf, 0x2a, 0xca, 0x21, 0xf9, 0x75, 0x74, 0xc2, - 0xc5, 0x14, 0xf7, 0x88, 0x15, 0x94, 0xe5, 0xd1, 0xb9, 0x34, 0x38, 0xa0, - 0x5e, 0x59, 0xf1, 0x41, 0xda, 0xde, 0x3a, 0xd1, 0xcb, 0x0e, 0xa2, 0x26, - 0xa4, 0xd3, 0x6f, 0x04, 0xc9, 0xd9, 0xf9, 0x34, 0x14, 0x43, 0x2f, 0xc7, - 0x50, 0x0a, 0x67, 0xeb, 0x2f, 0x96, 0x98, 0x84, 0x60, 0xa4, 0xbf, 0x12, - 0xb7, 0x65, 0xb0, 0xfa, 0xbb, 0x15, 0xdd, 0xdf, 0x5b, 0x0e, 0xa2, 0x6c, - 0x23, 0x38, 0xd5, 0x46, 0x68, 0xed, 0xf3, 0xec, 0x15, 0x12, 0x52, 0xce, - 0x01, 0xe3, 0xf2, 0x65, 0x6f, 0x00, 0x91, 0x4f, 0x60, 0x34, 0x67, 0x21, - 0x8d, 0x85, 0x5b, 0xe1, 0xa2, 0xe3, 0xc4, 0x36, 0x60, 0xe1, 0xb7, 0xa8, - 0x6a, 0x60, 0x8c, 0x03, 0x2e, 0x83, 0x36, 0x02, 0x32, 0x8f, 0x08, 0xd5, - 0x9d, 0x59, 0xa1, 0xf2, 0xfa, 0xdc, 0x78, 0xb2, 0xe7, 0xaf, 0xe8, 0x18, - 0x6d, 0x30, 0x4f, 0xd6, 0x49, 0xfa, 0xd8, 0xe2, 0xf2, 0xff, 0x4c, 0xb5, - 0x9b, 0x70, 0x51, 0x61, 0x56, 0x6e, 0xd6, 0xa3, 0xc9, 0x53, 0xfe, 0x03, - 0x3d, 0xed, 0x77, 0xa4, 0xf2, 0xcb, 0x2b, 0x33, 0xa2, 0x97, 0x09, 0x40, - 0x92, 0xa2, 0x3a, 0xc4, 0x60, 0xb5, 0x7d, 0x2e, 0xf8, 0x52, 0xe6, 0xa1, - 0x69, 0xec, 0x28, 0x95, 0x89, 0xa8, 0x00, 0x66, 0x20, 0x12, 0xb7, 0xc5, - 0xba, 0xf0, 0x81, 0x7f, 0x4c, 0x4c, 0x12, 0xa6, 0xdb, 0x76, 0xc1, 0x09, - 0x74, 0x45, 0x80, 0x68, 0xbb, 0xda, 0x57, 0x45, 0xce, 0x35, 0x29, 0x62, - 0x4c, 0x9f, 0x88, 0x9e, 0xef, 0x85, 0xd5, 0x65, 0x81, 0x33, 0x59, 0x46, - 0x8d, 0x84, 0xf2, 0x75, 0x91, 0x09, 0x11, 0x80, 0xdf, 0x0d, 0x77, 0xa6, - 0xd1, 0x3a, 0xa0, 0x24, 0xc6, 0xf0, 0xca, 0x66, 0x17, 0x89, 0x0d, 0x3c, - 0x68, 0x43, 0xc7, 0xe0, 0xc4, 0x2b, 0xb4, 0xe7, 0xcf, 0x03, 0xfe, 0x6b, - 0xb4, 0x93, 0x28, 0xa5, 0xc3, 0xde, 0xa2, 0x3d, 0x98, 0xfd, 0x4d, 0xda, - 0x34, 0x77, 0x41, 0x2b, 0x81, 0x0e, 0x01, 0x7b, 0xf2, 0xf5, 0x8c, 0x06, - 0x3f, 0x0c, 0x4d, 0xb5, 0x81, 0x3c, 0xfc, 0xfd, 0xab, 0x20, 0x70, 0x89, - 0x18, 0x1c, 0x1f, 0xfd, 0xa6, 0xff, 0x6e, 0x91, 0x86, 0xe2, 0xaa, 0xab, - 0xd9, 0xde, 0x26, 0xfe, 0xd1, 0x79, 0x14, 0x94, 0x0c, 0x1b, 0x8c, 0x8a, - 0xd6, 0x27, 0x24, 0x02, 0x52, 0x44, 0xb4, 0xed, 0xe8, 0xca, 0x55, 0x06, - 0x14, 0x57, 0xa6, 0x89, 0x27, 0x2f, 0x63, 0xbb, 0xe1, 0xc6, 0x23, 0xa5, - 0xff, 0x3b, 0x8e, 0xb1, 0xc2, 0x8b, 0xb4, 0x49, 0x81, 0x36, 0x81, 0x53, - 0x13, 0xd0, 0xe1, 0xa5, 0x2c, 0x53, 0x35, 0xdf, 0x50, 0xe3, 0x2a, 0x76, - 0xaa, 0xb7, 0x2f, 0x72, 0xba, 0xc8, 0xab, 0x6d, 0x68, 0xef, 0xdb, 0xcf, - 0xbd, 0xf8, 0x0d, 0x59, 0xa0, 0x4b, 0xd5, 0xdc, 0x9f, 0x08, 0x79, 0xcf, - 0x4d, 0xeb, 0x03, 0x39, 0x31, 0x90, 0x69, 0xac, 0xf0, 0x2e, 0x0c, 0xf4, - 0x68, 0xd7, 0xb4, 0x44, 0x82, 0x52, 0x91, 0x20, 0x2f, 0x49, 0x4e, 0xc6, - 0xf2, 0x81, 0x07, 0xe5, 0x64, 0x7d, 0xa4, 0xfa, 0xfa, 0x42, 0xcf, 0xe5, - 0x8f, 0x5f, 0x3c, 0x8a, 0xd4, 0x12, 0x7a, 0xc3, 0x5a, 0x72, 0x8d, 0x00, - 0x40, 0x34, 0x21, 0x65, 0x89, 0x1e, 0x83, 0x78, 0x50, 0x38, 0x98, 0xaa, - 0x59, 0xd4, 0x63, 0x1a, 0x3d, 0x74, 0x66, 0x47, 0xfa, 0x3b, 0x9a, 0xe2, - 0x14, 0x5d, 0x3e, 0x43, 0x90, 0x6a, 0x81, 0xfe, 0x68, 0x22, 0xbd, 0x1e, - 0x92, 0x6b, 0x2e, 0xb6, 0x4f, 0xdd, 0x5b, 0xe6, 0x22, 0x33, 0xcf, 0x78, - 0x3c, 0x52, 0x7f, 0x18, 0xee, 0x38, 0xee, 0xcb, 0x72, 0xfb, 0x45, 0x48, - 0x1f, 0x79, 0x9f, 0xdb, 0x62, 0x11, 0x72, 0xb5, 0x8d, 0xa5, 0x02, 0x5d, - 0x04, 0x24, 0x70, 0xce, 0xc1, 0x27, 0xbd, 0x9d, 0x62, 0x96, 0x74, 0x9f, - 0x98, 0x43, 0x92, 0x08, 0x96, 0xd4, 0x84, 0x3d, 0x0c, 0xe9, 0xc9, 0xa6, - 0x69, 0xb8, 0x60, 0x61, 0x8c, 0x5b, 0xce, 0xc9, 0x29, 0xc5, 0xe0, 0x68, - 0x39, 0x73, 0x0c, 0xbb, 0xa3, 0x87, 0x20, 0xdc, 0xa1, 0xc9, 0x12, 0x11, - 0xff, 0x55, 0xf9, 0x83, 0x66, 0xa4, 0xc9, 0xdc, 0xde, 0x2a, 0x4f, 0x06, - 0x57, 0x9d, 0xf4, 0x5c, 0x6e, 0xa4, 0x50, 0x36, 0xa5, 0xe9, 0x67, 0x06, - 0x86, 0x65, 0xc0, 0x7f, 0x6e, 0xeb, 0xa1, 0x69, 0x98, 0x00, 0x32, 0xe3, - 0xd7, 0x5a, 0x09, 0x7f, 0x00, 0x3a, 0xa4, 0x12, 0x64, 0xf4, 0x24, 0x05, - 0x8c, 0xb7, 0xbd, 0x84, 0x30, 0x1a, 0xf1, 0x3e, 0xf7, 0xf9, 0xbb, 0x08, - 0xcd, 0x41, 0xf7, 0x7b, 0xd1, 0x7b, 0xfa, 0x19, 0xaf, 0x8b, 0x25, 0x9c, - 0xc4, 0x32, 0x29, 0x34, 0xc4, 0xaa, 0x1a, 0xce, 0xa5, 0x29, 0x6c, 0x3c, - 0x85, 0x86, 0x73, 0x65, 0x92, 0x27, 0x42, 0x13, 0x0f, 0x41, 0x1d, 0xe0, - 0x53, 0x17, 0x8e, 0x06, 0x55, 0xb5, 0xf1, 0xbe, 0x9e, 0x54, 0x74, 0x27, - 0xc4, 0xff, 0x1a, 0x51, 0x57, 0x8e, 0x6a, 0x5e, 0xbd, 0xc7, 0x57, 0x34, - 0x73, 0x24, 0x82, 0xf6, 0x73, 0x32, 0x11, 0xb9, 0x2d, 0xe2, 0x2c, 0xea, - 0x6f, 0x67, 0xfe, 0x56, 0xc0, 0xe4, 0x87, 0xba, 0xdd, 0x2d, 0x2a, 0xe4, - 0xcc, 0xa7, 0x2d, 0xda, 0xdc, 0x15, 0xe4, 0x9f, 0x8d, 0x95, 0x8d, 0xe7, - 0x7f, 0x7b, 0x47, 0x6f, 0x17, 0x8a, 0x8a, 0xc6, 0xdb, 0xe2, 0x19, 0xb0, - 0x15, 0x9c, 0x19, 0x27, 0xac, 0xd0, 0xbc, 0x1c, 0xd6, 0x27, 0x2c, 0xbd, - 0x60, 0xf7, 0x37, 0x52, 0x9f, 0xb1, 0x16, 0x6e, 0x2a, 0x7e, 0x3b, 0xd9, - 0x4f, 0x03, 0x5f, 0xdd, 0x7d, 0x33, 0x4a, 0xb4, 0x99, 0xb5, 0x14, 0x74, - 0x8e, 0xde, 0x17, 0xae, 0xae, 0xc9, 0x84, 0x98, 0x98, 0x92, 0x95, 0x45, - 0xd3, 0x59, 0xc7, 0x44, 0xa1, 0x20, 0xd2, 0xcb, 0x55, 0xbe, 0x39, 0x85, - 0x83, 0x72, 0x9d, 0xfc, 0x38, 0x27, 0x2d, 0x3f, 0xa3, 0x33, 0x20, 0x4a, - 0x17, 0xef, 0xca, 0x93, 0x31, 0xf6, 0x21, 0x74, 0x14, 0x81, 0x0a, 0xd8, - 0xae, 0xd5, 0xf0, 0x04, 0xb6, 0x74, 0xc0, 0x20, 0x5a, 0xa5, 0x38, 0xee, - 0x5a, 0x4a, 0x7e, 0x29, 0x98, 0x8c, 0xd7, 0x0e, 0xe8, 0xa6, 0x94, 0xe7, - 0x0a, 0xe9, 0x59, 0x39, 0x23, 0xe0, 0xb0, 0xc2, 0x61, 0x52, 0x7f, 0x52, - 0xf3, 0xc4, 0x00, 0x34, 0x89, 0xac, 0xdd, 0xcd, 0x34, 0x37, 0x15, 0xd8, - 0x22, 0x32, 0x14, 0x79, 0xec, 0x18, 0x8b, 0x42, 0xd3, 0xaa, 0x13, 0xe6, - 0x8d, 0x8f, 0x4c, 0x32, 0xf9, 0x5c, 0x91, 0xc1, 0x2e, 0x46, 0xec, 0xd6, - 0xac, 0xd3, 0x66, 0x5d, 0xe1, 0x49, 0xe0, 0xff, 0xe3, 0xe1, 0x3c, 0x0b, - 0xef, 0x63, 0xdc, 0x53, 0x05, 0x4a, 0xd8, 0x81, 0xe8, 0xd9, 0x8c, 0x22, - 0x35, 0x0d, 0x67, 0x4e, 0xf1, 0xc2, 0x5c, 0x58, 0x26, 0x9a, 0x2d, 0x8b, - 0x30, 0x7e, 0x50, 0xc5, 0xae, 0xef, 0x59, 0x4b, 0xbe, 0x14, 0x5e, 0xbd, - 0x9e, 0xa8, 0xc1, 0xa4, 0x48, 0x23, 0x11, 0xcf, 0x51, 0xcb, 0x67, 0x48, - 0xf6, 0x4a, 0x6f, 0x6c, 0x99, 0x92, 0x50, 0xa8, 0xdc, 0xa4, 0xce, 0x3d, - 0x35, 0xbc, 0x58, 0xa7, 0x88, 0xdb, 0xdd, 0x30, 0xae, 0x08, 0x66, 0xac, - 0x73, 0xc9, 0xba, 0x1f, 0xde, 0x9b, 0xd6, 0x76, 0x1a, 0x78, 0x04, 0x2f, - 0xc9, 0xc3, 0x04, 0xf4, 0x76, 0x9f, 0x17, 0x57, 0x88, 0xaa, 0xb2, 0xd1, - 0x98, 0x34, 0x4b, 0x8c, 0x6a, 0xb7, 0x0f, 0x7f, 0xab, 0xba, 0xb1, 0x3d, - 0xe6, 0x4b, 0xf3, 0xc2, 0x8d, 0x06, 0x74, 0xdb, 0xeb, 0x17, 0x19, 0x85, - 0x7a, 0x4b, 0x1e, 0x93, 0x5f, 0x98, 0x7a, 0x3f, 0x55, 0x24, 0xf7, 0x51, - 0x21, 0xea, 0x4b, 0x5c, 0x77, 0xb7, 0x18, 0xc7, 0xd9, 0x1b, 0x2f, 0xf4, - 0x93, 0x91, 0x46, 0x84, 0x5b, 0x05, 0x41, 0xb2, 0x2c, 0x6a, 0x7d, 0xb1, - 0x57, 0x61, 0x3b, 0xe1, 0x71, 0xf6, 0x80, 0x3d, 0x56, 0x5e, 0x27, 0xe8, - 0x17, 0x20, 0x35, 0xf9, 0x5e, 0x39, 0x6c, 0xc5, 0x0b, 0xc7, 0xba, 0xa8, - 0x23, 0xac, 0xb2, 0x08, 0x91, 0xb7, 0x73, 0x73, 0x5c, 0x1c, 0xd5, 0x9e, - 0x3e, 0xd5, 0x10, 0x7d, 0x4f, 0x83, 0xf0, 0x4d, 0x8d, 0xb0, 0xb6, 0x38, - 0x34, 0xd4, 0x61, 0x6f, 0x2e, 0xe4, 0x56, 0x96, 0xba, 0x2f, 0x55, 0x99, - 0xec, 0x39, 0x76, 0x37, 0x8d, 0x8d, 0xf7, 0x07, 0x31, 0x01, 0x9f, 0x4e, - 0xf5, 0x0c, 0x9e, 0xb6, 0x20, 0x61, 0x27, 0xec, 0x38, 0xa9, 0x8d, 0xee, - 0xeb, 0xf8, 0xaf, 0xbd, 0x1b, 0x4a, 0x81, 0x4a, 0x70, 0x58, 0x79, 0xbc, - 0xc1, 0xba, 0x20, 0x42, 0x77, 0x47, 0x7d, 0x41, 0x17, 0xe9, 0x80, 0x1f, - 0x72, 0x62, 0x77, 0xe1, 0xb4, 0xc1, 0xe0, 0x23, 0x7a, 0x7c, 0x9c, 0x25, - 0xff, 0x94, 0xd6, 0xe5, 0x92, 0xb6, 0x50, 0x41, 0x53, 0x25, 0x04, 0x64, - 0x3e, 0xef, 0x6e, 0xc6, 0xb6, 0x17, 0xa2, 0xd2, 0x9c, 0xcd, 0x1c, 0x01, - 0xcd, 0xf8, 0x72, 0x8d, 0x4a, 0xd7, 0x77, 0xd7, 0x76, 0xe9, 0x28, 0xbe, - 0xe5, 0x69, 0xf9, 0xc4, 0xfb, 0xe5, 0x66, 0xd5, 0xe0, 0x9b, 0xaf, 0x72, - 0x4f, 0xfb, 0x01, 0x67, 0x16, 0xb2, 0xf4, 0xa3, 0xa1, 0x52, 0xb6, 0x99, - 0x0a, 0xe6, 0xfd, 0x1c, 0xd6, 0xb6, 0xec, 0x45, 0x83, 0x6d, 0x31, 0x1a, - 0x58, 0xd0, 0xc3, 0x33, 0x49, 0xdb, 0x14, 0x0d, 0xf1, 0x56, 0x00, 0x51, - 0x07, 0xd7, 0xb5, 0xf8, 0xf4, 0x95, 0x2d, 0xf3, 0x12, 0xeb, 0x95, 0x09, - 0xc7, 0x52, 0x9b, 0x1e, 0xfe, 0xdd, 0x7e, 0xed, 0xca, 0xf9, 0x08, 0xbb, - 0xcf, 0x04, 0x6d, 0x88, 0x64, 0x46, 0x59, 0x8f, 0x35, 0x23, 0x62, 0xb9, - 0x77, 0xc0, 0x28, 0xc0, 0x19, 0x91, 0x56, 0x5b, 0x95, 0xeb, 0x7c, 0x55, - 0x12, 0x1b, 0xd1, 0xc4, 0xf7, 0x5a, 0x26, 0x66, 0x30, 0xdb, 0x1e, 0xbc, - 0xb1, 0x91, 0x42, 0x6b, 0x43, 0xdd, 0x3c, 0xc5, 0x3c, 0x1d, 0xf7, 0x5b, - 0x6d, 0xad, 0x97, 0xa7, 0xa5, 0x92, 0xc0, 0xdd, 0x0f, 0x30, 0x69, 0xd1, - 0xea, 0x29, 0x72, 0xba, 0xc7, 0x4b, 0xf3, 0x92, 0x02, 0x05, 0xd5, 0x26, - 0x1b, 0xc5, 0x16, 0xa3, 0x18, 0x6a, 0xcf, 0xe1, 0x41, 0x71, 0x35, 0x62, - 0xdf, 0x77, 0xd9, 0x11, 0x9b, 0x0d, 0x2e, 0x32, 0xb9, 0xd5, 0xfe, 0xad, - 0xd1, 0x4b, 0xf7, 0x33, 0xa6, 0x91, 0xe4, 0xf1, 0xd9, 0xe2, 0x04, 0x7b, - 0xca, 0x68, 0xed, 0xb3, 0x52, 0x3a, 0x0c, 0x01, 0x89, 0x46, 0x55, 0x7b, - 0xf4, 0x36, 0xbe, 0xf5, 0xd7, 0xdd, 0x14, 0x26, 0x3f, 0x5f, 0xc8, 0x3f, - 0x40, 0x9d, 0x4f, 0xa3, 0x1f, 0x65, 0x87, 0x28, 0xd4, 0x64, 0x68, 0xc5, - 0x27, 0x7c, 0x98, 0xfe, 0xe7, 0x6b, 0x53, 0x53, 0x9e, 0xb4, 0xed, 0x41, - 0xfa, 0xfe, 0x69, 0xc4, 0xc3, 0x59, 0xda, 0x9e, 0x39, 0xe1, 0x90, 0xd3, - 0x7f, 0x17, 0x5b, 0x4c, 0xeb, 0xd7, 0xd0, 0x4d, 0xcb, 0xba, 0xdb, 0x8b, - 0x5a, 0x9f, 0x11, 0x41, 0x7a, 0x80, 0xbf, 0x3f, 0x8c, 0xf0, 0x31, 0x6c, - 0xd3, 0xd1, 0x16, 0x91, 0x7e, 0x32, 0xf2, 0x87, 0xa8, 0x31, 0x17, 0x0a, - 0x61, 0xe4, 0x73, 0x25, 0xe2, 0x17, 0x43, 0x64, 0xe3, 0x02, 0x4e, 0xb5, - 0xae, 0xd8, 0x2a, 0x99, 0xcd, 0x4d, 0x78, 0x0e, 0x1a, 0x89, 0x74, 0x22, - 0x2d, 0xc1, 0xf5, 0x32, 0x45, 0x2c, 0x2a, 0x08, 0x8a, 0x96, 0x02, 0x5b, - 0x6f, 0x75, 0x9a, 0x5c, 0xb8, 0xf5, 0x12, 0xa3, 0x4e, 0xe7, 0x30, 0x31, - 0x8a, 0x47, 0x4c, 0x19, 0x7e, 0xa6, 0x02, 0xa2, 0xd0, 0x0f, 0xd4, 0x3a, - 0xa9, 0x03, 0x30, 0xe3, 0x1e, 0x1a, 0xdd, 0x4f, 0x8c, 0xe5, 0xef, 0x6d, - 0x53, 0x7c, 0xf3, 0xa7, 0x2d, 0x13, 0x47, 0x20, 0x40, 0x24, 0x15, 0xec, - 0x19, 0x3a, 0x9c, 0xa7, 0xba, 0xb7, 0x31, 0xb2, 0x7d, 0x2c, 0x4a, 0xb5, - 0xb0, 0x0d, 0x46, 0x25, 0x94, 0xd5, 0x13, 0x69, 0x4f, 0xc9, 0x15, 0x7f, - 0x7a, 0x34, 0x84, 0xaf, 0x40, 0x47, 0xea, 0xc8, 0x8f, 0x64, 0xa0, 0xb7, - 0x98, 0x00, 0x76, 0x9d, 0xda, 0xce, 0xf9, 0x08, 0xa3, 0x4f, 0x26, 0x8a, - 0xf7, 0x2a, 0x92, 0x80, 0x1d, 0x8f, 0x4f, 0xb2, 0x97, 0xdc, 0xf3, 0xb4, - 0x8e, 0xef, 0xcd, 0x82, 0xab, 0x9b, 0x7d, 0xa5, 0x5b, 0x0a, 0x68, 0x09, - 0x83, 0x7d, 0xca, 0x03, 0xa0, 0x39, 0xb5, 0x97, 0x53, 0x8d, 0x71, 0x05, - 0xe3, 0xc1, 0x9a, 0xe2, 0x0d, 0x4b, 0x91, 0x85, 0x8b, 0x05, 0xf1, 0x3c, - 0x20, 0xf4, 0x4f, 0x30, 0x98, 0x6d, 0xd1, 0xad, 0x2e, 0xa2, 0x5b, 0xf6, - 0x40, 0x50, 0x07, 0xae, 0x10, 0x93, 0x08, 0x93, 0xe3, 0x97, 0x0e, 0xfe, - 0x71, 0xbb, 0x48, 0x18, 0xbd, 0xb2, 0xcc, 0xf0, 0x1e, 0xc4, 0xd8, 0x82, - 0x9b, 0x6b, 0x88, 0x9e, 0x88, 0xbb, 0x62, 0xd9, 0x98, 0x07, 0x49, 0x51, - 0x9f, 0x62, 0x9a, 0x54, 0x8e, 0x1d, 0x67, 0x88, 0x4e, 0x28, 0x0d, 0x77, - 0xb4, 0x40, 0x10, 0x0f, 0x4d, 0x5a, 0x5c, 0xa8, 0x27, 0x19, 0x09, 0xa7, - 0xa9, 0xd3, 0xfe, 0xee, 0xf2, 0x22, 0xd0, 0x6f, 0x18, 0x7f, 0x18, 0x3c, - 0x6d, 0xb0, 0x91, 0xbd, 0x50, 0xd2, 0x35, 0xc9, 0xce, 0x72, 0x6d, 0xfb, - 0x10, 0x77, 0x3d, 0x5f, 0x90, 0xb6, 0xdc, 0xb5, 0xa2, 0x0b, 0xc5, 0x1c, - 0x2e, 0xd3, 0x83, 0x26, 0x69, 0xdf, 0xa8, 0xc1, 0xa2, 0x21, 0xc3, 0x05, - 0x02, 0xff, 0xe6, 0xfa, 0x63, 0x59, 0xeb, 0xf1, 0xee, 0x20, 0xa1, 0x98, - 0x49, 0x0b, 0xc1, 0x04, 0xa8, 0x7d, 0x6a, 0x53, 0xc1, 0x67, 0xc7, 0x6d, - 0xe8, 0x11, 0xf4, 0xab, 0x48, 0xca, 0xfa, 0x0b, 0x6c, 0xfd, 0x3e, 0x83, - 0xf8, 0xb6, 0xdd, 0x34, 0xb5, 0x8b, 0xd7, 0x8d, 0xb7, 0x8e, 0xcd, 0x92, - 0x4f, 0x40, 0x87, 0xd6, 0x12, 0x03, 0xa0, 0xd5, 0x21, 0xb6, 0xa8, 0x57, - 0xff, 0xf8, 0x62, 0x4b, 0x68, 0x2e, 0x1b, 0xee, 0xcc, 0x7a, 0x81, 0x69, - 0x14, 0x3c, 0xf9, 0xa8, 0xad, 0x03, 0xf8, 0xc3, 0x3c, 0xac, 0x3c, 0x33, - 0x9c, 0x3a, 0x7f, 0x30, 0x58, 0x79, 0xf1, 0x04, 0xbb, 0x69, 0xed, 0xfa, - 0x77, 0x19, 0x60, 0x45, 0x1c, 0x56, 0xfc, 0x64, 0x8b, 0xb2, 0x1f, 0x6d, - 0xad, 0xb1, 0xdf, 0xde, 0xf8, 0x7b, 0xce, 0x76, 0x45, 0xd8, 0x0b, 0xcb, - 0x3f, 0x9b, 0xe3, 0xf5, 0x3a, 0x0a, 0xb3, 0xf6, 0x8d, 0xfd, 0x51, 0x45, - 0xdc, 0x7a, 0x3f, 0xc2, 0x2e, 0xb6, 0x75, 0x2a, 0xfc, 0x57, 0x86, 0xea, - 0xfc, 0x53, 0xd0, 0x52, 0x00, 0x60, 0x4b, 0x0e, 0xa2, 0x65, 0x23, 0xb5, - 0x72, 0x6d, 0xa3, 0x56, 0x15, 0x2e, 0xa7, 0x7b, 0x43, 0x4b, 0xa5, 0x31, - 0x41, 0x93, 0x48, 0xf9, 0x11, 0x52, 0xa3, 0x80, 0x26, 0xa8, 0xec, 0xaa, - 0x65, 0xd3, 0xb0, 0xf6, 0x2d, 0x29, 0xbe, 0x7d, 0x9c, 0x5e, 0x75, 0xc7, - 0xe9, 0xe2, 0xa4, 0xbc, 0xea, 0xc6, 0x83, 0xee, 0xb6, 0xb6, 0xa0, 0x53, - 0x6c, 0x11, 0x28, 0x37, 0xb7, 0xe1, 0xe8, 0xff, 0x3e, 0x86, 0x49, 0xee, - 0xf5, 0xc3, 0x3a, 0x16, 0x73, 0x81, 0xe5, 0x15, 0x58, 0xcc, 0x93, 0x42, - 0x42, 0x53, 0x43, 0x92, 0x8b, 0xfd, 0x76, 0xf2, 0x62, 0x8c, 0xc0, 0x5b, - 0x2b, 0x9d, 0xa8, 0x6e, 0x59, 0x61, 0x90, 0xb4, 0x7a, 0x15, 0x90, 0x1d, - 0x70, 0x5f, 0x05, 0x6f, 0xb9, 0x39, 0xa6, 0xd1, 0x0a, 0xa3, 0x95, 0xe9, - 0x56, 0x3b, 0x1c, 0x83, 0xc1, 0x17, 0x63, 0x46, 0xae, 0xd3, 0x68, 0x7b, - 0xa4, 0x0f, 0x81, 0xf9, 0xd3, 0x8f, 0xb0, 0x79, 0x0f, 0x43, 0xa2, 0xcb, - 0xfb, 0x9c, 0x72, 0xe4, 0x49, 0x77, 0x0d, 0xa1, 0xae, 0xda, 0xe3, 0x4f, - 0x60, 0xca, 0x6d, 0xc1, 0xf8, 0x87, 0xbe, 0xa0, 0x77, 0xce, 0xe4, 0x1e, - 0x36, 0xbf, 0x18, 0x7e, 0x54, 0xdd, 0xb0, 0x8e, 0x5a, 0x39, 0xe6, 0x2d, - 0xda, 0x13, 0x5f, 0xca, 0x31, 0x5a, 0x09, 0x7c, 0xcc, 0x88, 0xb5, 0x82, - 0xfe, 0x22, 0x06, 0x04, 0xc4, 0x78, 0xe5, 0x5e, 0x8d, 0xff, 0x43, 0x5a, - 0x25, 0xaf, 0xee, 0x01, 0x22, 0xd0, 0xf5, 0xd5, 0x6e, 0x99, 0x13, 0x0c, - 0xf5, 0x19, 0x44, 0x77, 0x7e, 0x8e, 0x29, 0x59, 0x42, 0x8d, 0x8f, 0x1f, - 0xc4, 0x78, 0xe5, 0x5e, 0x25, 0xcb, 0x46, 0xf4, 0x0b, 0xc8, 0x71, 0xe2, - 0x4e, 0x79, 0x46, 0x1d, 0x65, 0x81, 0x30, 0x8f, 0xa7, 0xea, 0x53, 0xe3, - 0xe1, 0xb0, 0x45, 0xc7, 0xe9, 0xea, 0xb8, 0xe6, 0x86, 0x91, 0x77, 0x83, - 0x09, 0xfb, 0x33, 0x7b, 0x87, 0xd9, 0x97, 0x31, 0x52, 0xc0, 0x9d, 0xb3, - 0xbd, 0x04, 0x93, 0xbb, 0x05, 0x8f, 0xb9, 0x3e, 0x5c, 0x6b, 0x3d, 0xd0, - 0x67, 0x44, 0xaf, 0x2d, 0xe3, 0xc5, 0xe9, 0xdc, 0x76, 0xf7, 0x1c, 0xf5, - 0x0b, 0xba, 0xf2, 0x2c, 0x4e, 0x0a, 0xca, 0x16, 0x65, 0x81, 0x30, 0x8f, - 0x7f, 0xf7, 0xbb, 0x0a, 0x81, 0xd1, 0x5a, 0x79, 0x37, 0xb6, 0x88, 0x91, - 0x4e, 0x12, 0x7f, 0xf0, 0xf5, 0x1b, 0x44, 0x47, 0x7d, 0x8e, 0x29, 0xdb, - 0x42, 0xbf, 0x8f, 0x17, 0xc4, 0x78, 0xe5, 0x5e, 0x9d, 0x40, 0x7e, 0x86, - 0x7c, 0xd8, 0xeb, 0xad, 0x5b, 0x53, 0xa0, 0x6f, 0x13, 0x0d, 0x5d, 0xe0, - 0x2a, 0x72, 0x1e, 0x26, 0xe6, 0xa7, 0xef, 0x35, 0x00, 0xfa, 0x19, 0x80, - 0x71, 0xa6, 0x21, 0x5f, 0xa2, 0x12, 0x2b, 0x3f, 0x4b, 0xaf, 0x33, 0xb9, - 0x0f, 0xf6, 0xac, 0x9d, 0x8f, 0x5e, 0xf2, 0x8f, 0x38, 0x76, 0x2a, 0x56, - 0xd8, 0xe2, 0x11, 0x91, 0x2b, 0x98, 0x25, 0xea, 0xcd, 0x2a, 0xd2, 0xb5, - 0x7a, 0xef, 0xfd, 0xf5, 0xc4, 0xca, 0xf9, 0xde, 0x75, 0x7b, 0x08, 0x4e, - 0xc5, 0x5c, 0xee, 0x96, 0x0d, 0xb2, 0x12, 0xa3, 0xfe, 0xed, 0x46, 0xeb, - 0x7b, 0x16, 0x4f, 0x65, 0xca, 0xf9, 0xa5, 0x3f, 0xae, 0xb7, 0x40, 0xf2, - 0xa8, 0x08, 0x6c, 0x0d, 0xf0, 0xec, 0xb1, 0xc7, 0x43, 0x13, 0x75, 0xe6, - 0x04, 0x9d, 0x4e, 0x32, 0x39, 0xfa, 0x93, 0x3c, 0xc0, 0xb6, 0xd9, 0xbe, - 0x31, 0xee, 0xd8, 0xa0, 0x2e, 0x51, 0x52, 0x66, 0xf8, 0xa2, 0x5b, 0x28, - 0x2b, 0xd8, 0x89, 0x75, 0x82, 0xed, 0x3f, 0x46, 0xeb, 0xb6, 0xd9, 0x1e, - 0x57, 0x64, 0x9d, 0x4a, 0x49, 0xa7, 0x43, 0xd2, 0x17, 0x16, 0xdc, 0xe7, - 0xed, 0x0c, 0xab, 0x3a, 0x52, 0xdc, 0x5d, 0x7d, 0x2b, 0x21, 0xa5, 0x5a, - 0x5b, 0xfb, 0x0a, 0x5d, 0x20, 0xc1, 0xd5, 0x95, 0x60, 0x43, 0xed, 0x84, - 0x63, 0x2f, 0xb7, 0x03, 0x35, 0xd2, 0xd5, 0xf2, 0x2f, 0x70, 0xc0, 0xe4, - 0xc7, 0x99, 0xa0, 0x90, 0xf5, 0x00, 0x38, 0x27, 0x77, 0x8d, 0x34, 0xfb, - 0x90, 0xd7, 0xd1, 0x8f, 0x74, 0x07, 0xed, 0x84, 0x63, 0xf3, 0xb7, 0x03, - 0x35, 0xd3, 0xd5, 0xf2, 0xdf, 0xf3, 0xf2, 0xd1, 0x29, 0x36, 0x9f, 0x04, - 0x23, 0xc3, 0x61, 0x15, 0x0b, 0x4c, 0x61, 0xec, 0x90, 0xd7, 0xd1, 0x8f, - 0x74, 0x06, 0xed, 0x84, 0x63, 0xf3, 0xb7, 0x03, 0x35, 0xd0, 0xd5, 0xf2, - 0xd4, 0xf2, 0xff, 0x4e, 0x68, 0xb9, 0x99, 0xb1, 0xea, 0xf8, 0x33, 0x64, - 0x9b, 0x3e, 0xd6, 0x62, 0x48, 0x60, 0x33, 0xbb, 0x7c, 0x72, 0xfb, 0x78, - 0xbd, 0xa8, 0x9c, 0xa3, 0x41, 0xe1, 0xc1, 0x8e, 0xb0, 0x03, 0x1c, 0x5a, - 0x29, 0x51, 0xab, 0xb2, 0x0e, 0xbd, 0x53, 0xa0, 0xb6, 0x22, 0x34, 0xef, - 0x7b, 0x92, 0x15, 0xe4, 0x3f, 0x1c, 0x1a, 0xbe, 0x38, 0xe1, 0x49, 0xcd, - 0x2e, 0x83, 0x41, 0xbe, 0xb9, 0x19, 0x64, 0x50, 0x6d, 0x82, 0x57, 0x00, - 0xfa, 0xcf, 0xcd, 0x2f, 0x3f, 0xfd, 0xa0, 0x60, 0x74, 0x05, 0x49, 0x66, - 0x4f, 0xc2, 0xd7, 0x20, 0x05, 0x77, 0xe6, 0x49, 0x4b, 0x21, 0x15, 0xb4, - 0x1f, 0x14, 0xef, 0xd3, 0x3a, 0xfa, 0x06, 0xd6, 0xdd, 0x83, 0xe8, 0xe5, - 0x7a, 0x58, 0x18, 0xd0, 0x98, 0xfe, 0x9a, 0x9f, 0x80, 0xd1, 0x96, 0x0f, - 0x53, 0xca, 0xe6, 0x0c, 0x2c, 0xa6, 0x0b, 0x13, 0x1d, 0x39, 0x25, 0x12, - 0x66, 0x10, 0x39, 0x63, 0xfa, 0xb5, 0x81, 0x5c, 0x33, 0x78, 0x44, 0xcb, - 0x66, 0xd7, 0xdb, 0x45, 0xb4, 0x69, 0xad, 0xf1, 0x43, 0xb4, 0xc8, 0xdd, - 0xa1, 0x56, 0x71, 0xaa, 0x04, 0xb1, 0x2d, 0xa8, 0x6f, 0xf6, 0x56, 0xfe, - 0xd7, 0xe8, 0xc5, 0x5c, 0x84, 0x79, 0xbb, 0xf7, 0x35, 0x16, 0x40, 0x59, - 0x9f, 0xb9, 0x6a, 0x9a, 0x5a, 0xa6, 0xfd, 0xf5, 0xc1, 0x65, 0xf1, 0xa5, - 0x6f, 0xe6, 0x49, 0xd9, 0x38, 0x8a, 0xdc, 0x44, 0xe2, 0xb7, 0xba, 0x63, - 0xfa, 0x79, 0x77, 0xc5, 0x18, 0x18, 0xb0, 0x38, 0xc6, 0x53, 0x76, 0xc9, - 0x0f, 0xdc, 0x86, 0xe1, 0x39, 0x08, 0xce, 0xb2, 0x5a, 0x40, 0xe7, 0x3c, - 0x83, 0x29, 0x89, 0xec, 0xe6, 0x9b, 0x6b, 0x17, 0x80, 0xef, 0x3f, 0x66, - 0xc4, 0x73, 0xf3, 0x0f, 0x75, 0x50, 0xc4, 0x92, 0x58, 0x31, 0xee, 0xc0, - 0xd6, 0xb9, 0xde, 0x98, 0x64, 0x96, 0xc2, 0x9c, 0x7f, 0xbd, 0xf6, 0xbd, - 0x54, 0xf9, 0xb9, 0x48, 0x5a, 0x0b, 0x17, 0xe8, 0x0d, 0x69, 0x6a, 0xe0, - 0x67, 0xfa, 0xd0, 0x33, 0xb6, 0xd0, 0x83, 0x1d, 0xf2, 0x77, 0xf6, 0xac, - 0x56, 0xdf, 0x24, 0xee, 0x6b, 0xb5, 0x07, 0xdd, 0xdc, 0xee, 0x32, 0x95, - 0xa8, 0xdf, 0x6d, 0x18, 0x1a, 0xf0, 0x62, 0x6f, 0x30, 0x3e, 0xf7, 0xe1, - 0xe6, 0x8d, 0x1d, 0xd5, 0x33, 0x39, 0x9f, 0x6b, 0xbc, 0x97, 0x1c, 0x8b, - 0xcb, 0xc1, 0xd5, 0x9e, 0x2c, 0x72, 0xcb, 0x46, 0x55, 0x2e, 0xa2, 0xee, - 0x0f, 0xa4, 0x26, 0xc9, 0x2e, 0x83, 0xcb, 0x2e, 0x8d, 0xef, 0xa5, 0xb8, - 0x39, 0x64, 0x57, 0xa9, 0x1a, 0xda, 0x62, 0xe9, 0xc3, 0x81, 0xb9, 0xcb, - 0x44, 0xf2, 0x11, 0x71, 0x26, 0x65, 0x51, 0xa0, 0x41, 0xb7, 0xd4, 0xa5, - 0x47, 0xa9, 0xdb, 0x4b, 0x48, 0x54, 0x7c, 0x81, 0x27, 0x60, 0x94, 0x11, - 0xfa, 0x06, 0x5c, 0x93, 0x62, 0x22, 0x23, 0x88, 0x0a, 0xf4, 0xe3, 0xc1, - 0xae, 0xc6, 0x09, 0x48, 0x2e, 0xb2, 0xb1, 0xd9, 0xcd, 0x14, 0x1e, 0x4e, - 0xa6, 0x67, 0xd3, 0x35, 0x64, 0xb5, 0x71, 0x1a, 0xa1, 0xd9, 0x54, 0xd1, - 0x66, 0x8a, 0xb4, 0xb4, 0x26, 0x35, 0x75, 0xe9, 0xe5, 0xb9, 0xe3, 0x7c, - 0x63, 0xc4, 0x37, 0x4b, 0x79, 0xf3, 0xa1, 0xf9, 0x27, 0xdd, 0x07, 0x4b, - 0xce, 0xcb, 0x80, 0xcf, 0xc5, 0xc2, 0x49, 0xef, 0x5c, 0x28, 0x6a, 0x0a, - 0x8a, 0xa7, 0x74, 0x03, 0xc9, 0x1d, 0x17, 0x05, 0x55, 0x26, 0x75, 0xf9, - 0xc9, 0x1f, 0x51, 0xb5, 0xcb, 0xbd, 0xc9, 0x53, 0x92, 0x42, 0x5f, 0x8f, - 0xa0, 0x70, 0xd0, 0x46, 0xb0, 0x5b, 0xb3, 0xe7, 0xc3, 0xfa, 0x2f, 0x41, - 0xc0, 0x0c, 0x9f, 0x85, 0x4d, 0xd2, 0x41, 0x5e, 0xdc, 0x89, 0xe9, 0xe4, - 0x45, 0xc2, 0x3b, 0x00, 0xbb, 0x1e, 0xea, 0xcf, 0x18, 0x13, 0xbf, 0x99, - 0x2d, 0xf4, 0xb0, 0x00, 0x52, 0x09, 0x63, 0x63, 0x5b, 0xbe, 0xa8, 0x05, - 0xaf, 0xf0, 0x07, 0x0d, 0x4e, 0xe6, 0x82, 0x8c, 0xaf, 0x0d, 0x22, 0x76, - 0x00, 0x1a, 0xfb, 0x31, 0xad, 0xe3, 0x73, 0x1b, 0xb6, 0x3e, 0x0b, 0xeb, - 0x0d, 0x36, 0x7a, 0xe3, 0x4d, 0xd8, 0xe1, 0xb9, 0x7a, 0x70, 0x85, 0x1b, - 0x62, 0x24, 0x9c, 0x25, 0x47, 0x17, 0xd1, 0x19, 0x72, 0x36, 0xca, 0x58, - 0x54, 0xb7, 0x92, 0x9f, 0x15, 0x7c, 0xa8, 0x9c, 0x6f, 0x69, 0xd1, 0x6d, - 0x85, 0xb9, 0x54, 0xf1, 0xc3, 0xc3, 0x8c, 0xd5, 0x54, 0x11, 0x10, 0xea, - 0xd1, 0x50, 0x88, 0x08, 0x86, 0x56, 0x63, 0x7b, 0x3a, 0x54, 0x67, 0x12, - 0x99, 0xa4, 0xad, 0x2c, 0x8b, 0x71, 0xc5, 0xd4, 0x8e, 0xd1, 0xd3, 0x5d, - 0x7c, 0x28, 0x96, 0x1f, 0xb4, 0x4f, 0xf9, 0xa3, 0x92, 0xbc, 0x25, 0x0f, - 0x22, 0xf6, 0x03, 0x4b, 0x6e, 0xbd, 0x33, 0xce, 0xeb, 0xf5, 0xfb, 0xcc, - 0x0e, 0x12, 0x96, 0x79, 0x97, 0xa1, 0xe9, 0x4e, 0xc5, 0x10, 0xc8, 0x5d, - 0xbc, 0xa4, 0xb8, 0xb9, 0xa0, 0xe7, 0xb4, 0xdc, 0x67, 0x23, 0x9c, 0xd4, - 0x40, 0xf4, 0x39, 0x20, 0xe6, 0xdc, 0x68, 0xe3, 0x9a, 0xe2, 0x8f, 0x00, - 0xdd, 0x20, 0xd7, 0xaa, 0x3b, 0xce, 0xeb, 0xfd, 0xda, 0x5c, 0x19, 0xf5, - 0x26, 0x3b, 0x40, 0x62, 0x4f, 0x63, 0x5d, 0x49, 0x2b, 0xd4, 0xa8, 0x3a, - 0x61, 0xeb, 0xb2, 0xe9, 0x1e, 0x79, 0xf6, 0x2c, 0x62, 0x9e, 0x0f, 0x6e, - 0x20, 0x8e, 0x74, 0x4c, 0x0d, 0x10, 0x0a, 0x21, 0xe0, 0x12, 0xc7, 0x04, - 0x7e, 0x96, 0x01, 0xbd, 0xbe, 0x75, 0x52, 0xc9, 0x3a, 0x8c, 0x0f, 0xa4, - 0x63, 0xac, 0x84, 0x9d, 0xe5, 0x9b, 0x42, 0x30, 0x18, 0xd9, 0x26, 0x10, - 0x24, 0x97, 0x29, 0x9d, 0xda, 0x6f, 0x69, 0xcf, 0x82, 0xc1, 0x1d, 0x03, - 0x94, 0x9a, 0x2d, 0xe8, 0xa4, 0xbb, 0x0d, 0x04, 0x36, 0x69, 0xd5, 0x99, - 0xf2, 0xf4, 0xc5, 0x64, 0x5b, 0x4b, 0x22, 0xc5, 0x6f, 0xfb, 0x5b, 0xfe, - 0x30, 0x3a, 0x95, 0xe0, 0xe8, 0xf2, 0xe2, 0x2c, 0x83, 0x13, 0x04, 0x11, - 0x34, 0x7e, 0x95, 0xcb, 0xe6, 0x98, 0xdc, 0x2e, 0x75, 0x42, 0xe5, 0xff, - 0xcc, 0xf0, 0x23, 0xf9, 0x82, 0xc9, 0xb2, 0x28, 0xbd, 0x34, 0x66, 0xc6, - 0xc9, 0xab, 0xc5, 0xe1, 0x30, 0x43, 0x35, 0x2b, 0x98, 0xa5, 0x42, 0x35, - 0xdb, 0x33, 0x3e, 0xfe, 0x5f, 0x35, 0xe4, 0xac, 0x25, 0x28, 0x55, 0x37, - 0xe1, 0x44, 0x79, 0x86, 0x7a, 0x31, 0xf1, 0xdc, 0x69, 0x6f, 0x2d, 0x43, - 0xb8, 0x53, 0x95, 0xd2, 0xc3, 0x2d, 0xe8, 0x6c, 0x80, 0x5e, 0xa9, 0xc9, - 0x5a, 0x53, 0x60, 0x2a, 0xc2, 0xca, 0x6f, 0x5b, 0x46, 0xa6, 0xd3, 0x5a, - 0x85, 0x83, 0xf2, 0xdc, 0x44, 0x85, 0x42, 0xe2, 0x2b, 0x06, 0x23, 0xda, - 0x7d, 0xc7, 0xc5, 0x91, 0xd7, 0x4c, 0xc2, 0xfd, 0x22, 0x89, 0x82, 0x01, - 0x53, 0xce, 0xa5, 0xb3, 0x04, 0xcc, 0x06, 0x97, 0x2c, 0x4e, 0x25, 0x96, - 0x0e, 0x1d, 0x86, 0x28, 0xa2, 0xbc, 0x23, 0xab, 0xbe, 0x63, 0xc9, 0x5f, - 0x6a, 0x7b, 0xd3, 0xee, 0xdc, 0x72, 0xff, 0xb4, 0x6f, 0xd7, 0x7b, 0x77, - 0x03, 0x74, 0x52, 0xa6, 0xfa, 0xf0, 0x50, 0xbe, 0xe1, 0x6e, 0xee, 0x18, - 0xd4, 0x01, 0x32, 0x98, 0x1c, 0x24, 0xb8, 0x14, 0x5c, 0x71, 0xa3, 0xb8, - 0xad, 0x39, 0x1e, 0xd8, 0x3b, 0xf9, 0xc3, 0xc5, 0x04, 0x17, 0x8b, 0xcb, - 0xdb, 0x06, 0x82, 0xb1, 0xc4, 0x15, 0x0d, 0xa7, 0xec, 0x99, 0xd6, 0x0c, - 0x1f, 0x68, 0xc5, 0x62, 0x0a, 0x86, 0x0d, 0x0f, 0x7d, 0x98, 0x4a, 0x26, - 0x1d, 0xb7, 0x60, 0xee, 0x6e, 0x04, 0x8c, 0x00, 0xfe, 0x9b, 0xc5, 0x32, - 0x1e, 0x6f, 0xeb, 0x4f, 0xab, 0x63, 0x2c, 0x64, 0x50, 0xe4, 0x5b, 0x38, - 0x22, 0x9b, 0xe5, 0xc1, 0x81, 0x9a, 0xdd, 0xa4, 0x4d, 0xf9, 0x4a, 0x93, - 0xd3, 0xc9, 0x4e, 0xa8, 0xfa, 0x42, 0xf6, 0x28, 0x3e, 0xad, 0xd2, 0x85, - 0x3c, 0x4b, 0x75, 0x00, 0xe3, 0x3f, 0xf7, 0x22, 0x46, 0xf0, 0x53, 0x57, - 0xb4, 0x8f, 0x63, 0xb7, 0x83, 0x6d, 0x71, 0xc3, 0x1e, 0x83, 0x14, 0xa7, - 0x61, 0x2e, 0x0c, 0xc3, 0xae, 0x07, 0x52, 0xb2, 0x23, 0x9e, 0x54, 0x20, - 0xe9, 0xb0, 0x8e, 0x4a, 0x91, 0x06, 0xb7, 0x57, 0xe6, 0x27, 0x62, 0xd4, - 0xd4, 0xe2, 0xcd, 0x42, 0x63, 0xbc, 0x51, 0xfe, 0xad, 0x7a, 0xf9, 0x4a, - 0x32, 0x86, 0x81, 0xbf, 0xbc, 0x6e, 0x6a, 0x5b, 0x1b, 0xa0, 0xd9, 0x75, - 0x27, 0x4b, 0xb8, 0x72, 0x75, 0x34, 0x71, 0x78, 0x36, 0xc5, 0x6b, 0x56, - 0x52, 0xad, 0xfc, 0xfb, 0xd1, 0xf7, 0x0b, 0x52, 0x16, 0xe8, 0x1d, 0xa9, - 0x93, 0xdd, 0x2a, 0x3e, 0x6a, 0x0a, 0x77, 0x00, 0x33, 0x96, 0x08, 0x65, - 0xe6, 0x44, 0x4c, 0xed, 0xac, 0xed, 0xd4, 0x65, 0xc1, 0x7b, 0x34, 0x2b, - 0x1a, 0x94, 0xae, 0xd5, 0x4c, 0x1e, 0x0d, 0xf4, 0x46, 0x39, 0xd8, 0xfe, - 0xe0, 0x33, 0x38, 0x61, 0x42, 0x97, 0xe6, 0xfc, 0x71, 0xf4, 0x8b, 0xf9, - 0x83, 0x25, 0xc1, 0x94, 0xd8, 0x4d, 0xfc, 0xa4, 0x8f, 0xc5, 0x38, 0x0b, - 0x6d, 0x19, 0xa1, 0x25, 0x09, 0xb7, 0x15, 0x15, 0x4c, 0xc2, 0x46, 0xae, - 0x0a, 0x92, 0xba, 0xa2, 0xa1, 0xcf, 0x70, 0x39, 0x65, 0x9d, 0x62, 0x53, - 0x56, 0x53, 0x74, 0xe3, 0xf4, 0x9b, 0x07, 0xd7, 0xf8, 0x6b, 0x6f, 0x86, - 0xd2, 0x7e, 0x34, 0x5f, 0x64, 0x8c, 0x16, 0x2c, 0x57, 0x6a, 0x46, 0x4c, - 0x43, 0xfb, 0x46, 0x49, 0x9a, 0xd1, 0x1a, 0xd1, 0x19, 0xc0, 0x4a, 0x6a, - 0x35, 0x62, 0x9c, 0xcf, 0x0d, 0xe8, 0x7d, 0xe7, 0x6f, 0x25, 0xe0, 0x6f, - 0xd4, 0xab, 0x09, 0x9c, 0xac, 0x5b, 0xe6, 0xec, 0x5f, 0x83, 0x72, 0xf4, - 0x8c, 0x5f, 0xcf, 0x9f, 0x9d, 0x08, 0x95, 0x64, 0xa1, 0x07, 0xfd, 0xc4, - 0xa8, 0x92, 0x64, 0xa1, 0x7d, 0xd1, 0x93, 0xf7, 0x46, 0x9e, 0x4f, 0xeb, - 0xa5, 0x5c, 0x33, 0x0a, 0xf3, 0x7a, 0xd7, 0xb8, 0xf3, 0xbf, 0x91, 0xa2, - 0xdd, 0x5a, 0xa5, 0x87, 0x93, 0x56, 0xb2, 0x38, 0x7a, 0xc4, 0xcb, 0x79, - 0x00, 0x0e, 0x58, 0xa9, 0x85, 0xbb, 0x41, 0xb3, 0xa5, 0xf6, 0x03, 0x24, - 0xdf, 0xd6, 0xdf, 0xe5, 0xc2, 0xc1, 0x15, 0x84, 0x34, 0x43, 0x29, 0x93, - 0x2a, 0x23, 0x3a, 0x7a, 0xa1, 0x8d, 0x4f, 0x7b, 0x18, 0x71, 0x4f, 0x84, - 0x88, 0xa3, 0x55, 0x09, 0x75, 0x9e, 0x4d, 0x61, 0x58, 0x39, 0x80, 0x7c, - 0x75, 0x04, 0x26, 0xcb, 0x91, 0x88, 0xd0, 0xb6, 0x43, 0x47, 0x45, 0x81, - 0x3b, 0x42, 0x2b, 0x85, 0xe3, 0x05, 0x76, 0x24, 0x61, 0xdb, 0x46, 0x5c, - 0x70, 0x64, 0x34, 0x06, 0x07, 0x9a, 0xa9, 0x29, 0x23, 0x25, 0xbf, 0x6e, - 0x77, 0xe0, 0x06, 0xd8, 0x62, 0x03, 0xc0, 0x7d, 0xc0, 0x49, 0x50, 0x2a, - 0x1b, 0x9b, 0x60, 0xb6, 0x2c, 0xc7, 0x9c, 0x1f, 0x4f, 0x90, 0xa8, 0x36, - 0x3a, 0x35, 0x63, 0x7f, 0xe3, 0x47, 0x4f, 0xc9, 0x77, 0x19, 0x44, 0x16, - 0x64, 0xd1, 0x5e, 0x88, 0xf4, 0xd7, 0xbf, 0x6c, 0xb5, 0xf6, 0x7a, 0x03, - 0x01, 0xa1, 0x25, 0x4b, 0xe9, 0xf5, 0x8e, 0x25, 0xaf, 0x0d, 0x51, 0x4a, - 0xa3, 0x9a, 0xf4, 0xc1, 0x36, 0x7d, 0x27, 0x13, 0xea, 0xc5, 0x8b, 0x1b, - 0x43, 0xe1, 0x2e, 0xa8, 0xc5, 0xdc, 0x02, 0xa8, 0xb1, 0xbb, 0x5e, 0x22, - 0x26, 0x24, 0x43, 0xfc, 0x6b, 0xb9, 0x8d, 0x62, 0x9e, 0x55, 0x7b, 0x08, - 0x69, 0xaa, 0x55, 0xc4, 0xce, 0xcd, 0x8f, 0x41, 0x8d, 0xe2, 0x43, 0x09, - 0x1f, 0xf6, 0xdd, 0x1b, 0x64, 0x79, 0x17, 0xc4, 0xaf, 0x38, 0xee, 0x1d, - 0x51, 0xf2, 0x21, 0x50, 0x6b, 0xd0, 0x33, 0x21, 0xea, 0xd1, 0x5c, 0x71, - 0x67, 0x29, 0x92, 0xf6, 0x99, 0x20, 0x82, 0x6c, 0x89, 0x40, 0x06, 0x8a, - 0xbd, 0xa9, 0x25, 0x45, 0xb4, 0x72, 0x82, 0x36, 0xf6, 0xc7, 0x76, 0xb7, - 0x13, 0x00, 0x97, 0xb1, 0x27, 0x9f, 0x3c, 0xee, 0x0a, 0x6f, 0x3d, 0x25, - 0x66, 0xa9, 0x16, 0x57, 0x87, 0x82, 0x55, 0x58, 0x99, 0xec, 0xd7, 0x6f, - 0x8e, 0xd8, 0xcd, 0x58, 0x34, 0xb3, 0x00, 0xde, 0x1f, 0x7a, 0x4b, 0x53, - 0xe0, 0xe1, 0x15, 0xb2, 0x84, 0x40, 0xc5, 0xdf, 0xfb, 0x60, 0x6a, 0x76, - 0x26, 0x66, 0xd9, 0xaa, 0xbc, 0x5a, 0xd7, 0x6c, 0x64, 0x69, 0xff, 0x4f, - 0x97, 0xa7, 0x09, 0x51, 0x15, 0x45, 0xfd, 0xb5, 0xb8, 0x7d, 0x18, 0xc4, - 0x01, 0xd1, 0x6d, 0xc1, 0x19, 0x7d, 0x28, 0x0b, 0x16, 0x82, 0x5b, 0x5a, - 0x4e, 0x51, 0x4c, 0x32, 0xf8, 0x86, 0x1c, 0xe0, 0x14, 0x17, 0x26, 0x26, - 0x0a, 0x84, 0xbb, 0x31, 0xdc, 0x9c, 0x22, 0x58, 0xad, 0xa1, 0x45, 0x60, - 0x27, 0x19, 0xb3, 0x22, 0x0c, 0xe3, 0x7a, 0x5c, 0x8d, 0x71, 0x74, 0xe5, - 0xab, 0x64, 0xfb, 0x74, 0x5b, 0xa1, 0x4c, 0x2c, 0x8b, 0xc7, 0x9d, 0xcd, - 0x52, 0x9a, 0xb8, 0x2d, 0x6b, 0x26, 0xf0, 0xc5, 0xfe, 0x10, 0x2e, 0xd4, - 0x99, 0x19, 0x78, 0x9b, 0xb2, 0xd6, 0x49, 0xeb, 0xb4, 0x1f, 0xa3, 0x88, - 0x90, 0x0d, 0xbb, 0x9f, 0x5e, 0xde, 0xb0, 0x62, 0xc3, 0xb4, 0x40, 0xba, - 0x08, 0xfc, 0x43, 0x8a, 0x0e, 0x39, 0x5b, 0xc4, 0x24, 0xeb, 0x99, 0x5c, - 0x7f, 0xe7, 0x24, 0xd7, 0x59, 0x67, 0xae, 0x8a, 0x94, 0x7b, 0x0c, 0xe2, - 0x8b, 0x42, 0x96, 0x6b, 0xd5, 0xcf, 0x4d, 0xa1, 0xa6, 0x75, 0xad, 0x5c, - 0xd7, 0x95, 0xdd, 0x8a, 0xae, 0x8d, 0x73, 0x60, 0x55, 0x60, 0xcf, 0x75, - 0x45, 0x7b, 0xda, 0xfc, 0x8c, 0x01, 0xfe, 0x9c, 0x2c, 0xf6, 0xbe, 0xf6, - 0x35, 0x93, 0x46, 0xb5, 0xa1, 0x6c, 0x49, 0x7d, 0xfe, 0x6a, 0xb7, 0xb9, - 0x1f, 0x08, 0x17, 0x1f, 0x23, 0xf6, 0x38, 0xc6, 0xd8, 0xda, 0xca, 0x56, - 0x93, 0x0e, 0xc9, 0xe5, 0x31, 0x38, 0x5d, 0x27, 0xfc, 0xb8, 0x22, 0xb4, - 0x27, 0xad, 0x8a, 0x99, 0xce, 0x1a, 0xf1, 0x12, 0x73, 0xf2, 0x4a, 0x47, - 0x6c, 0xe7, 0x13, 0x1f, 0x1c, 0x7e, 0x5b, 0xe6, 0x26, 0x70, 0x84, 0xd2, - 0x3f, 0x71, 0xf3, 0xf2, 0xaf, 0x8b, 0x6e, 0x0a, 0xd7, 0xe0, 0x7a, 0xd1, - 0x95, 0xc7, 0x9f, 0x84, 0x33, 0x8d, 0xf1, 0xa3, 0xa2, 0x0e, 0x14, 0x42, - 0x2a, 0x43, 0x2e, 0xb0, 0x7f, 0x04, 0x2c, 0x7a, 0x20, 0x2a, 0xc7, 0x85, - 0x64, 0x4b, 0x46, 0x9a, 0xb4, 0x8e, 0x79, 0x0d, 0x33, 0xae, 0x9a, 0x2a, - 0xcb, 0xda, 0x6a, 0x03, 0x7b, 0x8e, 0x41, 0xde, 0x82, 0xa7, 0xb0, 0x32, - 0x3d, 0x58, 0x4b, 0x14, 0xc0, 0xb7, 0x33, 0x12, 0x2b, 0x6e, 0x06, 0x4c, - 0xb3, 0x50, 0x7d, 0x88, 0xc7, 0xa0, 0x9c, 0x2a, 0x91, 0x6b, 0xb9, 0x76, - 0xb4, 0x5a, 0x97, 0x01, 0xfb, 0x87, 0x5c, 0xa3, 0xcc, 0xa4, 0xbe, 0x52, - 0x31, 0x4c, 0x1c, 0x5f, 0x1d, 0x07, 0x10, 0xdc, 0x02, 0xc3, 0xd9, 0xad, - 0x93, 0x35, 0xd3, 0xc9, 0xf3, 0xf6, 0xdb, 0x06, 0x26, 0x5c, 0x48, 0xc4, - 0xcc, 0x5d, 0xff, 0x71, 0x21, 0xf5, 0xa7, 0x39, 0x7d, 0xeb, 0x8d, 0x77, - 0xf2, 0x98, 0xd4, 0x50, 0x7a, 0x67, 0x72, 0x2c, 0x05, 0x56, 0x48, 0xc4, - 0xe6, 0x9e, 0x75, 0x36, 0x9b, 0x46, 0x9d, 0xf5, 0x70, 0xee, 0x3e, 0x35, - 0x16, 0x1b, 0xc7, 0x3e, 0xeb, 0x94, 0xc8, 0x1a, 0x03, 0x51, 0x21, 0x40, - 0x43, 0xe0, 0xc9, 0x29, 0x51, 0x7d, 0x54, 0xdf, 0x0a, 0xac, 0xe0, 0x00, - 0x0b, 0x36, 0x32, 0xb1, 0x9a, 0x46, 0x73, 0x38, 0x93, 0x66, 0xec, 0x48, - 0xf9, 0x48, 0x20, 0x90, 0x96, 0x2d, 0x65, 0xad, 0x85, 0x01, 0x0e, 0x98, - 0x41, 0xc6, 0x7a, 0x5a, 0x02, 0xd2, 0x33, 0xd3, 0x5a, 0x9c, 0x55, 0x5b, - 0xf4, 0x6a, 0x04, 0x86, 0x88, 0x18, 0xfc, 0x38, 0x8f, 0x0c, 0x7f, 0x1a, - 0x0d, 0x8c, 0x3d, 0x6f, 0x9f, 0xed, 0x8f, 0xad, 0xd9, 0xb6, 0x53, 0x58, - 0x64, 0xf5, 0x86, 0xb4, 0xfb, 0x73, 0x3f, 0xd9, 0x7c, 0xd3, 0x57, 0x29, - 0x2d, 0xe8, 0xe3, 0x78, 0x98, 0x4f, 0xf7, 0x89, 0x36, 0xee, 0x40, 0x6f, - 0xec, 0x12, 0x15, 0x4a, 0x1e, 0xfa, 0x9a, 0xb9, 0xb7, 0x4c, 0x7e, 0x83, - 0x6c, 0x5b, 0xd8, 0x60, 0x28, 0xe9, 0x83, 0xcc, 0x3f, 0x6c, 0x4d, 0x9a, - 0x6d, 0xf8, 0x31, 0xef, 0x38, 0xec, 0x84, 0x5f, 0x82, 0xc2, 0x8f, 0x0a, - 0x75, 0x57, 0x80, 0xae, 0x87, 0x6e, 0xdf, 0x20, 0x78, 0x1b, 0x45, 0xb6, - 0x40, 0xc0, 0x62, 0x46, 0x82, 0x4d, 0x1a, 0x64, 0x68, 0xdb, 0x37, 0x0c, - 0x9f, 0x94, 0xbb, 0x60, 0xab, 0x18, 0x40, 0x8a, 0xab, 0xd4, 0x55, 0xc8, - 0x82, 0x18, 0x9c, 0x94, 0x8f, 0x05, 0x41, 0xd5, 0x01, 0xfc, 0x3b, 0xf4, - 0xb5, 0x7e, 0xc8, 0x1c, 0x17, 0x15, 0x03, 0xd4, 0x3c, 0x7a, 0x95, 0xcc, - 0x0b, 0x66, 0xb0, 0xe1, 0x9a, 0x05, 0x37, 0xe3, 0xef, 0x1d, 0x23, 0xdd, - 0xbc, 0x0f, 0x7d, 0x5f, 0x8b, 0xb8, 0xf2, 0xc7, 0xb8, 0x61, 0x66, 0x77, - 0x95, 0x94, 0xed, 0x6a, 0x31, 0xe7, 0x89, 0x0b, 0x88, 0xcb, 0x25, 0xfd, - 0xbf, 0x74, 0x33, 0xc3, 0x56, 0xee, 0x49, 0xdc, 0xe3, 0xf1, 0xa1, 0x7f, - 0x0a, 0xb4, 0x89, 0xf5, 0xd5, 0x1c, 0x66, 0x04, 0x91, 0xc5, 0x50, 0x7f, - 0xc8, 0x48, 0x4c, 0xd0, 0x59, 0x66, 0x68, 0x1f, 0x9c, 0xa8, 0xbb, 0xc8, - 0xfc, 0x5b, 0x45, 0xd9, 0xb4, 0x53, 0xc9, 0x7d, 0x04, 0x61, 0x93, 0x47, - 0xe6, 0xb5, 0xb1, 0x4b, 0x15, 0xdc, 0x30, 0x57, 0xdb, 0x16, 0x63, 0xdb, - 0xda, 0x8d, 0x10, 0x0c, 0xf8, 0x26, 0xef, 0xb7, 0xa4, 0xa1, 0x73, 0x53, - 0x0d, 0xa5, 0x50, 0xbf, 0x5c, 0x17, 0x1b, 0x93, 0xb0, 0x50, 0x87, 0x11, - 0xc3, 0x33, 0xa2, 0xaf, 0x9b, 0x07, 0x7b, 0x1d, 0xec, 0x03, 0xe0, 0xfd, - 0x1f, 0x21, 0x50, 0x92, 0x54, 0x23, 0xde, 0xb5, 0xfe, 0x51, 0x81, 0xc3, - 0xdb, 0x09, 0xf6, 0x3d, 0xe7, 0x2f, 0x12, 0xe9, 0x66, 0x4b, 0x96, 0x70, - 0xff, 0x9e, 0xe4, 0x69, 0x8a, 0x36, 0x62, 0x62, 0x93, 0x93, 0x77, 0xe9, - 0x15, 0x0b, 0x58, 0x61, 0xec, 0x14, 0x15, 0xe8, 0x48, 0x3b, 0x61, 0xfd, - 0x31, 0x61, 0x15, 0x2c, 0x72, 0x03, 0x7f, 0xa3, 0x1e, 0x59, 0x7e, 0xd5, - 0xf9, 0x9c, 0x08, 0xb0, 0xdf, 0xcb, 0xb6, 0x5f, 0x37, 0x0e, 0x82, 0x92, - 0x7e, 0x80, 0x3a, 0xeb, 0xd3, 0x98, 0x9a, 0x32, 0xa2, 0x31, 0xd2, 0x69, - 0x9d, 0xdf, 0x7b, 0x61, 0x10, 0x84, 0xe7, 0x8f, 0x34, 0xe9, 0xa2, 0x84, - 0xc9, 0x0b, 0xf2, 0x04, 0x9c, 0xbe, 0xb0, 0x9c, 0xdd, 0x29, 0xb0, 0x3b, - 0x9b, 0x9a, 0xf3, 0x9e, 0x50, 0x08, 0xd1, 0x95, 0xb0, 0x58, 0xf8, 0x25, - 0xab, 0xe7, 0x18, 0x36, 0x45, 0xf5, 0xf7, 0xc1, 0xb0, 0x7f, 0xfc, 0x40, - 0xb3, 0xf2, 0x00, 0xe9, 0x6c, 0x7b, 0x7e, 0xd1, 0xaf, 0x95, 0x69, 0x5f, - 0x38, 0xbb, 0x23, 0xd7, 0xf6, 0x1e, 0xd4, 0xd5, 0x42, 0x98, 0x12, 0x23, - 0xcf, 0x63, 0x94, 0x59, 0x27, 0x24, 0x9d, 0x0f, 0xcd, 0xd4, 0xc5, 0x0e, - 0xa9, 0x92, 0x65, 0x5f, 0x7d, 0x6a, 0xa8, 0x6c, 0xc7, 0x52, 0x38, 0x7f, - 0x5b, 0x57, 0xb3, 0x4a, 0xd9, 0xc2, 0x16, 0x10, 0x1b, 0x07, 0x08, 0x93, - 0xb7, 0x12, 0xff, 0x91, 0x3e, 0x7c, 0x92, 0x13, 0x7a, 0x73, 0xae, 0x53, - 0x46, 0x31, 0x01, 0x81, 0xa2, 0xc7, 0xb4, 0x89, 0xa2, 0x9a, 0x75, 0x85, - 0xe3, 0xe3, 0x0a, 0x01, 0xb1, 0x9c, 0xd9, 0x82, 0x30, 0x8e, 0xca, 0xc9, - 0x58, 0x92, 0x28, 0x97, 0x2e, 0x8f, 0xb9, 0xe6, 0x9c, 0x1a, 0xe6, 0x8b, - 0x43, 0x72, 0x18, 0x28, 0x47, 0x61, 0x0e, 0x48, 0x5d, 0xa7, 0x7c, 0xf1, - 0xc0, 0xc0, 0xb9, 0x2e, 0xc0, 0x6f, 0x0f, 0xd5, 0x5a, 0x3f, 0xfe, 0x37, - 0x69, 0xda, 0x96, 0x5a, 0x00, 0x89, 0x74, 0xd9, 0xdf, 0x14, 0x07, 0x15, - 0x38, 0xcb, 0x38, 0x28, 0x76, 0x46, 0xb2, 0x4d, 0x03, 0x4e, 0x4f, 0x5b, - 0x40, 0xf4, 0x4a, 0xb1, 0x96, 0x65, 0x29, 0x28, 0x95, 0x90, 0x4b, 0x7b, - 0xc9, 0x86, 0x46, 0x85, 0x97, 0x23, 0x54, 0xba, 0xbe, 0x48, 0x28, 0x2c, - 0x0a, 0x85, 0xbc, 0x1f, 0xc9, 0x04, 0x4d, 0xb9, 0x2c, 0x4d, 0x05, 0xe0, - 0xdf, 0xd9, 0x84, 0x77, 0x18, 0x61, 0x8c, 0xc2, 0x85, 0x7e, 0x95, 0x6f, - 0x8a, 0x9f, 0xdd, 0xa5, 0xb4, 0x3d, 0xdc, 0x4c, 0x61, 0x00, 0x57, 0xf0, - 0x6b, 0xc2, 0x50, 0x5b, 0xaf, 0x4a, 0xfc, 0xde, 0x4c, 0x13, 0x80, 0x4c, - 0x7f, 0x34, 0x64, 0x76, 0x04, 0xb2, 0xbc, 0x60, 0x4c, 0x6c, 0x80, 0xef, - 0x2d, 0x8d, 0x5d, 0x06, 0x73, 0x79, 0xbb, 0x48, 0xd7, 0x86, 0x29, 0xe7, - 0x78, 0x40, 0xe4, 0xf6, 0x79, 0x51, 0x2f, 0x50, 0xff, 0xb4, 0x45, 0xd8, - 0x68, 0x4f, 0x8e, 0xaf, 0xe4, 0xdc, 0x22, 0xdf, 0x48, 0x7b, 0x7f, 0x9e, - 0x8a, 0xbe, 0xac, 0x42, 0x2c, 0x5f, 0xf2, 0x94, 0x86, 0xff, 0xf7, 0xef, - 0xb4, 0xce, 0xcb, 0xd6, 0x75, 0xfc, 0xa3, 0x20, 0x46, 0x54, 0x20, 0xe1, - 0x98, 0xe0, 0xea, 0xee, 0x71, 0x71, 0xbd, 0x60, 0x2f, 0xe5, 0xda, 0x4a, - 0x95, 0xe0, 0x5d, 0x1b, 0x4b, 0x74, 0x27, 0x43, 0xed, 0xae, 0x07, 0xe4, - 0x2d, 0xee, 0xd8, 0x22, 0x3a, 0xe9, 0xec, 0x97, 0x9a, 0x23, 0xd2, 0x5e, - 0xfb, 0x41, 0x1b, 0x58, 0x20, 0x94, 0x23, 0xaf, 0xe7, 0x75, 0x7b, 0x64, - 0x48, 0x0c, 0x61, 0x49, 0x40, 0xd5, 0xde, 0xfc, 0x64, 0x6e, 0x97, 0x96, - 0x2c, 0xe1, 0x2c, 0x46, 0x1c, 0x6a, 0xb3, 0x82, 0x29, 0xd2, 0x25, 0xbb, - 0x21, 0x2e, 0x06, 0xea, 0x45, 0x62, 0x17, 0xa0, 0x55, 0xf8, 0xb0, 0x92, - 0x02, 0x29, 0x7e, 0x80, 0xe6, 0x6e, 0xee, 0xd8, 0xee, 0xc1, 0xaf, 0xcd, - 0xdc, 0xc0, 0xf9, 0x78, 0xfe, 0x8c, 0x79, 0xbd, 0x64, 0x9a, 0x2a, 0x1b, - 0x4d, 0x93, 0xb6, 0xd4, 0x6f, 0x31, 0x7a, 0xbb, 0x19, 0x09, 0xac, 0xdf, - 0x89, 0x43, 0x37, 0x97, 0xc9, 0x6e, 0x04, 0xf7, 0xe7, 0x84, 0xcc, 0xb7, - 0x98, 0xa7, 0xf6, 0x6a, 0xec, 0xf2, 0x1d, 0xc1, 0x32, 0x7a, 0x74, 0x5f, - 0x38, 0x88, 0xf0, 0xb6, 0x76, 0xe6, 0x53, 0x3a, 0xa5, 0x06, 0xa8, 0x69, - 0xe8, 0xb1, 0x50, 0xb9, 0x7f, 0x1f, 0xa6, 0xcb, 0xc9, 0xc6, 0xb2, 0xb9, - 0x83, 0xcb, 0x78, 0xcb, 0x8e, 0x90, 0x59, 0xb7, 0xb6, 0x05, 0xa4, 0x17, - 0xcb, 0x65, 0xd2, 0x94, 0xa1, 0x24, 0xb5, 0xc7, 0xc5, 0x75, 0x2a, 0x80, - 0x60, 0x3a, 0x0e, 0xe5, 0x92, 0x94, 0xd8, 0xdd, 0x7c, 0xcb, 0x0e, 0x75, - 0x86, 0x28, 0x6d, 0xa4, 0x5c, 0xbf, 0x0e, 0x07, 0x5e, 0x90, 0xa7, 0xac, - 0xb1, 0xb1, 0x3a, 0x85, 0x8a, 0xbc, 0xb0, 0xf6, 0xb6, 0x9a, 0xbc, 0x0c, - 0x02, 0xc9, 0xfa, 0xeb, 0x2c, 0x1d, 0xec, 0x8e, 0x0b, 0x7f, 0x36, 0xec, - 0x5a, 0x4e, 0xbe, 0x4b, 0xef, 0x8b, 0x77, 0x8c, 0x20, 0xe8, 0xe2, 0xbd, - 0x27, 0x72, 0x51, 0xed, 0x24, 0x26, 0x22, 0x15, 0x0b, 0xab, 0xd8, 0x4d, - 0x08, 0x63, 0x0e, 0xde, 0x61, 0x65, 0x25, 0xe0, 0x62, 0xa7, 0x76, 0xd5, - 0x03, 0xef, 0xd4, 0xbc, 0x33, 0x37, 0x03, 0x21, 0xa9, 0xb7, 0x61, 0x32, - 0x42, 0xcb, 0xe9, 0xc3, 0x9a, 0x07, 0x08, 0x76, 0x54, 0x9d, 0xb6, 0xa6, - 0xb0, 0x28, 0xf3, 0x3a, 0x30, 0xde, 0xa8, 0x89, 0x0a, 0xa2, 0xc4, 0x15, - 0x4d, 0x44, 0x27, 0xc7, 0x0d, 0x7a, 0x9d, 0xad, 0xd5, 0x39, 0x45, 0x1a, - 0x72, 0x3e, 0x14, 0x4f, 0x84, 0x21, 0xf9, 0x28, 0x43, 0xc1, 0x61, 0xe2, - 0x08, 0xdb, 0x9c, 0xed, 0xf2, 0xf4, 0x68, 0xb7, 0x21, 0xc9, 0x7e, 0x69, - 0x43, 0xc0, 0xb0, 0xf9, 0x01, 0xf0, 0x8a, 0xfd, 0xea, 0x4a, 0x80, 0xa3, - 0xf9, 0x4a, 0x87, 0x05, 0x4e, 0xba, 0xa9, 0xd1, 0x45, 0x99, 0x5f, 0x41, - 0x7d, 0x70, 0x2d, 0x53, 0xc6, 0x99, 0xc1, 0xc0, 0xb7, 0x7d, 0x1d, 0xb4, - 0x8d, 0x89, 0xa5, 0xae, 0xfd, 0x84, 0x6c, 0xaa, 0x18, 0x94, 0x64, 0xa9, - 0x4e, 0x5f, 0x4b, 0xf9, 0x1e, 0xf7, 0xaa, 0xc8, 0xde, 0x81, 0x26, 0x75, - 0xdb, 0xe6, 0x95, 0x0e, 0x0f, 0xd5, 0x4b, 0xcc, 0xd5, 0xb1, 0x6e, 0xae, - 0x2e, 0xd5, 0xdc, 0xea, 0xb9, 0x00, 0x9f, 0x6e, 0x3b, 0x82, 0xaf, 0x31, - 0x90, 0xa5, 0x1c, 0xb5, 0x4d, 0x34, 0x37, 0xf9, 0x43, 0x90, 0x94, 0x38, - 0xea, 0x62, 0x8d, 0xfd, 0xf9, 0xe3, 0xf9, 0x12, 0x21, 0xbe, 0x9b, 0x8c, - 0xa0, 0x70, 0x17, 0x58, 0x78, 0x70, 0x32, 0x9b, 0xd7, 0xcd, 0xc5, 0x55, - 0x98, 0x2e, 0xfc, 0x5e, 0xec, 0xf3, 0x12, 0x32, 0x45, 0xbc, 0x5e, 0x29, - 0xb0, 0x14, 0x4d, 0xf6, 0x04, 0x81, 0x22, 0x6c, 0xde, 0x1d, 0xa7, 0x81, - 0xbc, 0xe1, 0xf4, 0xf6, 0x10, 0x49, 0xe9, 0x2e, 0xaa, 0xda, 0x3f, 0xee, - 0x1d, 0x60, 0x36, 0x81, 0x86, 0xf2, 0xe3, 0xc3, 0xa7, 0xd7, 0x6e, 0x83, - 0x53, 0xcd, 0xda, 0xf6, 0xb9, 0x61, 0x57, 0xa0, 0xdb, 0x1e, 0xd0, 0xed, - 0x19, 0xf0, 0x00, 0x01, 0xad, 0x43, 0x56, 0x91, 0x81, 0x63, 0x27, 0xae, - 0xd5, 0xd9, 0x4f, 0x5a, 0xe1, 0xbb, 0x59, 0x44, 0x20, 0x3a, 0xff, 0x78, - 0xbd, 0x1a, 0xad, 0xb6, 0x32, 0x3c, 0x39, 0x10, 0xa1, 0x7a, 0x9a, 0xdd, - 0xb6, 0x32, 0x97, 0x49, 0xb8, 0x70, 0xc8, 0x57, 0x30, 0x3d, 0xed, 0xc2, - 0xc7, 0x38, 0x82, 0x97, 0xd9, 0x5e, 0x4a, 0x16, 0x2a, 0xc5, 0x49, 0xb9, - 0x64, 0xc6, 0x1e, 0xd3, 0x4e, 0x52, 0xce, 0xf4, 0x1c, 0x1e, 0xa8, 0xf6, - 0x51, 0x6b, 0xf7, 0x47, 0x00, 0x93, 0xcb, 0x3e, 0x92, 0xa7, 0x66, 0x50, - 0x40, 0xc5, 0xae, 0x68, 0x44, 0xec, 0x3b, 0xca, 0xcf, 0x90, 0xc2, 0x93, - 0xb7, 0xbd, 0xa5, 0x80, 0x9c, 0x30, 0x8a, 0xdb, 0x28, 0x4b, 0x3d, 0x86, - 0xff, 0xa7, 0x41, 0x0a, 0x5e, 0x93, 0x7e, 0xa7, 0x3b, 0xb2, 0x9a, 0xb1, - 0x6c, 0x7d, 0xca, 0x80, 0x87, 0xb8, 0x23, 0x18, 0x7e, 0x61, 0x70, 0xc7, - 0x24, 0x3b, 0xdf, 0xf2, 0xf7, 0x8f, 0x34, 0x82, 0x3a, 0x31, 0xf0, 0xa2, - 0xf3, 0x56, 0x59, 0xe9, 0x46, 0x4f, 0x8b, 0xb4, 0xb0, 0x91, 0x07, 0xb0, - 0x07, 0x34, 0x68, 0xbe, 0x21, 0x3b, 0xa7, 0xf1, 0x41, 0x14, 0x8d, 0xac, - 0x19, 0x0f, 0x9a, 0x7d, 0xbf, 0xa0, 0xfb, 0x99, 0x21, 0x9c, 0xee, 0x2f, - 0x0c, 0xfe, 0x25, 0xf9, 0x49, 0x89, 0x5e, 0x87, 0x19, 0x02, 0xe8, 0xeb, - 0x74, 0x72, 0x77, 0xdc, 0xd1, 0xce, 0xc0, 0x02, 0x78, 0x9a, 0xdc, 0x34, - 0x86, 0xd6, 0x75, 0x71, 0x8d, 0xc8, 0x64, 0x5a, 0xac, 0xf8, 0x38, 0x00, - 0x9f, 0xc0, 0x45, 0x04, 0xc3, 0x57, 0x1f, 0xb4, 0x29, 0xb1, 0x58, 0xc9, - 0x45, 0x13, 0xe6, 0xca, 0xa1, 0x13, 0x57, 0x0b, 0xf9, 0xdb, 0x00, 0x6a, - 0x58, 0xab, 0x10, 0x8b, 0xf8, 0x45, 0x9b, 0xfd, 0xfb, 0x22, 0xe8, 0x73, - 0xa1, 0x57, 0x7e, 0xa5, 0x7f, 0x84, 0x3b, 0xea, 0x4a, 0x70, 0x14, 0x12, - 0xc8, 0x91, 0x2e, 0x8d, 0x91, 0x62, 0x35, 0xb3, 0x6a, 0x21, 0x4b, 0x8c, - 0x5d, 0xbc, 0x1c, 0xaa, 0xad, 0x66, 0xb6, 0x7b, 0x6d, 0x09, 0x94, 0xcd, - 0xa2, 0x71, 0xbb, 0x79, 0x78, 0x2d, 0x2d, 0x43, 0xdf, 0xbc, 0xdf, 0xc5, - 0x4f, 0xf5, 0x41, 0x60, 0x09, 0x65, 0x19, 0x3a, 0xf4, 0x57, 0x8e, 0xf8, - 0x30, 0x65, 0x3f, 0x77, 0x76, 0x09, 0x29, 0x77, 0x16, 0xf6, 0x10, 0xc9, - 0xa1, 0x13, 0x35, 0xb2, 0x5c, 0xd7, 0x1e, 0xa7, 0xe3, 0xf8, 0xb4, 0x95, - 0x98, 0x33, 0x59, 0x0f, 0xfd, 0xd6, 0xcb, 0x7e, 0xa4, 0xc8, 0x92, 0x17, - 0x9a, 0x09, 0x98, 0x59, 0x35, 0xbc, 0xdf, 0xa7, 0xc8, 0x45, 0x12, 0xf6, - 0x92, 0x79, 0xc2, 0xb9, 0x82, 0x7c, 0x69, 0xc3, 0x02, 0xfe, 0xc1, 0x7d, - 0x41, 0xea, 0x5f, 0xf3, 0x25, 0xac, 0x9d, 0x91, 0xb0, 0x98, 0xdf, 0xc1, - 0x63, 0x0d, 0x5d, 0xdd, 0x5a, 0xd0, 0xc2, 0xa6, 0x07, 0x69, 0xf0, 0xba, - 0xb6, 0x72, 0xcd, 0xc3, 0x93, 0x9a, 0x03, 0xdc, 0x43, 0x33, 0x4e, 0x82, - 0x86, 0x2d, 0xc1, 0xe2, 0x16, 0x8c, 0xaa, 0x51, 0xda, 0xbf, 0x14, 0x19, - 0xf6, 0x3c, 0x49, 0x04, 0x5d, 0x01, 0xee, 0x21, 0xcd, 0x1f, 0x43, 0x13, - 0xd2, 0xff, 0x0f, 0x71, 0x6b, 0xbd, 0xfa, 0x6b, 0x4f, 0x9b, 0x70, 0x1a, - 0xa7, 0xf7, 0x23, 0x86, 0x17, 0xee, 0x07, 0x51, 0x04, 0xf2, 0x81, 0x45, - 0xbb, 0x7f, 0xcf, 0x41, 0x94, 0x01, 0x5c, 0xaf, 0x7e, 0x37, 0x52, 0x75, - 0x94, 0x2e, 0x52, 0x83, 0x29, 0x02, 0xa9, 0x0b, 0x60, 0x6a, 0x55, 0xd0, - 0x85, 0x3c, 0xc8, 0xae, 0x6b, 0xdb, 0xfb, 0xb4, 0xff, 0x66, 0xca, 0xe8, - 0xac, 0xdd, 0x7c, 0x7b, 0xef, 0xde, 0x9a, 0x10, 0x3b, 0x1e, 0x70, 0x1d, - 0x59, 0x2c, 0xac, 0x22, 0x3d, 0xa0, 0x7f, 0x05, 0xfb, 0x9b, 0x20, 0x63, - 0x0a, 0x69, 0x3c, 0x4c, 0xbc, 0xd7, 0xc5, 0x99, 0x0a, 0xca, 0xbc, 0x7e, - 0x03, 0x5f, 0xbd, 0x56, 0x60, 0x24, 0x8f, 0x59, 0xf1, 0x7f, 0xf4, 0x1c, - 0x57, 0x10, 0x22, 0x27, 0x40, 0x11, 0xeb, 0xaf, 0x1c, 0x5c, 0xb7, 0x2c, - 0xe2, 0x78, 0x99, 0x7e, 0x9e, 0x3c, 0xfd, 0xb1, 0x54, 0xf8, 0x24, 0x5b, - 0x4d, 0x0b, 0xf3, 0x37, 0xa5, 0xcf, 0xaf, 0x68, 0x3e, 0x29, 0x3d, 0xd0, - 0xa8, 0x8d, 0xa8, 0x96, 0x86, 0x53, 0xf0, 0x01, 0xef, 0x28, 0x7d, 0x57, - 0x45, 0x1f, 0x43, 0x22, 0xef, 0xea, 0xe9, 0x05, 0xad, 0x94, 0x98, 0x73, - 0x52, 0xfa, 0x94, 0x56, 0xb9, 0x78, 0x4d, 0x51, 0x72, 0xcf, 0xa3, 0xa9, - 0x04, 0x5d, 0x78, 0x41, 0xb6, 0xd5, 0x47, 0xfb, 0xab, 0x58, 0x22, 0xc6, - 0xd5, 0x88, 0x5a, 0xac, 0x85, 0x02, 0x5e, 0xb6, 0xf8, 0xbc, 0x8d, 0xf4, - 0x2d, 0xcc, 0x40, 0xdd, 0xa1, 0x24, 0x7e, 0xdb, 0x04, 0x56, 0x50, 0x8a, - 0x3d, 0x98, 0x56, 0xdf, 0x4d, 0xc2, 0x80, 0x82, 0x56, 0x4e, 0x46, 0x68, - 0x39, 0x9b, 0x2f, 0x87, 0xb1, 0x44, 0xf0, 0x0c, 0x88, 0xed, 0x26, 0xfa, - 0x4f, 0xdd, 0xc2, 0xa7, 0xbf, 0xfb, 0x10, 0x25, 0x87, 0x4c, 0x66, 0x1b, - 0x98, 0x09, 0x71, 0xe7, 0xe6, 0xec, 0x3a, 0xb9, 0x2d, 0xb8, 0x38, 0x87, - 0xcf, 0xfe, 0x4a, 0x5a, 0xdf, 0x86, 0xa3, 0x58, 0xe2, 0xb6, 0x9e, 0x5b, - 0x6a, 0x8f, 0x06, 0xc4, 0xf9, 0x94, 0x65, 0x75, 0xe7, 0xb1, 0x34, 0xb5, - 0x6d, 0x5a, 0xc1, 0x0e, 0x9d, 0x21, 0xb8, 0xa6, 0x8b, 0x9b, 0xef, 0xdc, - 0x58, 0xd1, 0x82, 0x60, 0x33, 0xbe, 0x04, 0x8c, 0x5b, 0x00, 0x3f, 0x9a, - 0xcb, 0xcc, 0x0c, 0xf5, 0x86, 0xa6, 0x30, 0xdb, 0x71, 0x81, 0x1f, 0x00, - 0x87, 0x81, 0x43, 0x7d, 0xa5, 0x6c, 0x71, 0xa3, 0xfa, 0xb5, 0xc5, 0xbf, - 0x89, 0x61, 0x07, 0x53, 0x53, 0xa3, 0xff, 0x70, 0x9b, 0x49, 0x42, 0x1a, - 0xb0, 0x79, 0xb0, 0xba, 0x9a, 0x95, 0xcc, 0xdb, 0xd2, 0xdb, 0x69, 0x9d, - 0xec, 0x04, 0xe1, 0xc1, 0x09, 0x65, 0xd9, 0x17, 0xa4, 0x59, 0xe3, 0x09, - 0xc1, 0xce, 0xe1, 0x78, 0xf2, 0x07, 0xd5, 0xec, 0x40, 0xba, 0x6b, 0x44, - 0xbd, 0x94, 0xba, 0xd0, 0xeb, 0x77, 0x2c, 0x8c, 0xf6, 0x4f, 0x1a, 0x85, - 0x6d, 0x06, 0xd0, 0x5b, 0xf4, 0xe9, 0x1c, 0x4f, 0x5d, 0x3a, 0xec, 0xe7, - 0x93, 0x08, 0xc7, 0xad, 0xfb, 0xf4, 0xcc, 0xdf, 0x3d, 0xef, 0x72, 0xd1, - 0xc2, 0x5d, 0xd8, 0x2c, 0x50, 0xd0, 0xde, 0x16, 0x97, 0x40, 0x65, 0x45, - 0x5c, 0xcb, 0xd2, 0xdc, 0x34, 0x02, 0x29, 0x00, 0xc6, 0x82, 0x36, 0x08, - 0x7a, 0xed, 0x9d, 0xd5, 0xd1, 0x93, 0xcd, 0x05, 0xf4, 0xe9, 0x1e, 0xff, - 0x84, 0x7b, 0xfd, 0xfe, 0x06, 0xc7, 0xc1, 0xde, 0x05, 0xa8, 0xde, 0x84, - 0x79, 0xd9, 0x10, 0xc1, 0x5a, 0x22, 0xb3, 0x78, 0x17, 0x1a, 0x61, 0x51, - 0x2e, 0x21, 0xa7, 0x51, 0x2f, 0xc5, 0x54, 0x27, 0x35, 0x88, 0x82, 0x03, - 0x7e, 0x3f, 0xdc, 0x16, 0x29, 0xf0, 0x63, 0xcb, 0x58, 0xb1, 0x96, 0x1e, - 0xdd, 0xf1, 0xe7, 0xe7, 0x2b, 0x11, 0x4c, 0x28, 0x61, 0x05, 0x8f, 0xd7, - 0x16, 0x90, 0x22, 0xf3, 0xd2, 0x34, 0xa8, 0xbf, 0x6f, 0xac, 0x81, 0x6f, - 0x8a, 0xfb, 0x83, 0x6b, 0x40, 0x3d, 0x74, 0xc4, 0x0e, 0x90, 0xc0, 0x8a, - 0x2c, 0x61, 0x26, 0xf4, 0x74, 0xf5, 0x10, 0x96, 0x2b, 0x27, 0x4a, 0xd9, - 0x90, 0xa8, 0x46, 0xd0, 0xf9, 0x5d, 0xed, 0x41, 0x7f, 0xcb, 0x31, 0x01, - 0xdd, 0xad, 0xa1, 0x05, 0xe6, 0x8c, 0xae, 0x84, 0xcc, 0xc2, 0x7c, 0x0f, - 0xfc, 0xf2, 0x51, 0xa3, 0x23, 0x93, 0x61, 0x27, 0xd8, 0xe0, 0x69, 0x57, - 0xd1, 0xe1, 0xd3, 0xe3, 0x47, 0xf2, 0xcb, 0x83, 0xac, 0x53, 0x3b, 0x72, - 0xcd, 0x48, 0xdd, 0x63, 0xc9, 0x3f, 0x0e, 0xa3, 0xbd, 0x29, 0xa9, 0xff, - 0xa2, 0xaf, 0x79, 0x6c, 0xfb, 0xb1, 0xd5, 0xfe, 0xba, 0x53, 0xbe, 0x97, - 0x02, 0x6a, 0x52, 0x8f, 0xd8, 0x3c, 0x98, 0x86, 0x9b, 0xdd, 0x0c, 0xca, - 0xe5, 0xd5, 0x39, 0x6b, 0x60, 0xc2, 0x86, 0xaf, 0x1f, 0xfc, 0x9f, 0x48, - 0x07, 0x84, 0x64, 0x8d, 0x68, 0x40, 0xf9, 0x38, 0xb2, 0x01, 0xb3, 0x32, - 0xbf, 0x6f, 0x22, 0x63, 0x6b, 0x37, 0x49, 0x51, 0x67, 0x79, 0xe8, 0xe2, - 0x3c, 0x1c, 0x67, 0xa3, 0x54, 0x56, 0x70, 0x60, 0x40, 0x0f, 0xeb, 0x9a, - 0x89, 0x38, 0xd2, 0x4d, 0xcf, 0x20, 0x22, 0x90, 0x33, 0x6f, 0x0c, 0x61, - 0x4e, 0xdb, 0x0f, 0xcb, 0xa7, 0xc5, 0x7e, 0x95, 0x33, 0x0e, 0x35, 0x31, - 0x57, 0x89, 0xf8, 0x9f, 0x82, 0xba, 0x66, 0x76, 0xf7, 0x71, 0x22, 0x39, - 0x12, 0xac, 0x2e, 0x5c, 0x3b, 0x9b, 0x8d, 0x31, 0x08, 0x31, 0xba, 0x9a, - 0x26, 0x03, 0x5c, 0xf7, 0x6d, 0xab, 0x69, 0xc3, 0x44, 0x5b, 0xe2, 0x71, - 0x1c, 0x0c, 0xc8, 0xf7, 0xab, 0xfa, 0xef, 0x7f, 0xca, 0x53, 0xb4, 0xf1, - 0xe0, 0xf4, 0x0f, 0xbe, 0x0c, 0x52, 0xd6, 0x52, 0x8e, 0xa9, 0x6a, 0x10, - 0xc1, 0xf9, 0xbb, 0x1d, 0x44, 0x9f, 0xb8, 0xc4, 0x96, 0x6a, 0x46, 0x37, - 0x0b, 0xda, 0x58, 0xe9, 0xf8, 0xee, 0xf8, 0x91, 0x75, 0xb5, 0xd8, 0x8f, - 0xeb, 0x6d, 0x0d, 0x07, 0xaf, 0x0e, 0xe6, 0xda, 0x29, 0xfe, 0xcb, 0x4a, - 0xe2, 0xcf, 0xe7, 0xd6, 0x90, 0xe0, 0xed, 0x75, 0xee, 0x61, 0xb1, 0xf0, - 0x94, 0x1a, 0x86, 0x70, 0x0d, 0x68, 0xc4, 0x13, 0x0a, 0x96, 0xeb, 0x0f, - 0xad, 0x7a, 0xe1, 0x20, 0x09, 0xb8, 0xda, 0xec, 0xa8, 0xc8, 0x8f, 0x64, - 0xfe, 0x17, 0x01, 0x3a, 0xda, 0x8d, 0x85, 0x20, 0xfc, 0xa1, 0x86, 0x38, - 0x1c, 0xb9, 0x48, 0x8e, 0x39, 0xa9, 0x76, 0x3c, 0x60, 0x56, 0x38, 0xc9, - 0x36, 0x76, 0xbc, 0xec, 0xfe, 0x81, 0x1d, 0x63, 0xc5, 0x79, 0x0e, 0xa5, - 0xb2, 0xf1, 0x51, 0x8b, 0x59, 0x37, 0x92, 0x6c, 0xe7, 0xd4, 0xa9, 0x99, - 0x3f, 0x86, 0x44, 0xc0, 0xa6, 0x15, 0x6d, 0xf6, 0xca, 0x06, 0x8f, 0xd3, - 0x72, 0x30, 0x63, 0xa5, 0xe0, 0xb6, 0xeb, 0x26, 0x1f, 0x54, 0x03, 0x67, - 0x88, 0xc8, 0x55, 0x98, 0x78, 0x8d, 0x09, 0x3a, 0x4c, 0x20, 0x8d, 0xd1, - 0xc0, 0x8b, 0xd0, 0x6d, 0x6a, 0x87, 0xd6, 0xc3, 0xbd, 0x25, 0x4f, 0x97, - 0x6f, 0x75, 0x40, 0xbb, 0x9c, 0xc3, 0x24, 0x36, 0x5d, 0xe5, 0xd9, 0xaa, - 0xb7, 0xf3, 0xa1, 0x82, 0x96, 0xe4, 0x91, 0xf3, 0x10, 0xa5, 0x57, 0x79, - 0x71, 0xa2, 0x4b, 0xeb, 0x68, 0x36, 0xef, 0x71, 0x3f, 0x7b, 0xf2, 0x3b, - 0x3a, 0x22, 0x33, 0xaf, 0x27, 0xe9, 0x1a, 0x16, 0xc4, 0x6e, 0xf0, 0x59, - 0xbf, 0x10, 0xc4, 0x90, 0xad, 0x06, 0x8c, 0x0c, 0xea, 0x8c, 0x6e, 0x75, - 0xed, 0x15, 0x57, 0xe3, 0xbb, 0xee, 0x62, 0x99, 0x4c, 0x62, 0x6d, 0xb1, - 0x4c, 0x78, 0x83, 0xe7, 0xd4, 0xc2, 0x47, 0x03, 0xca, 0x98, 0x58, 0xac, - 0x6e, 0x50, 0xcf, 0xc5, 0x66, 0x81, 0xec, 0xbf, 0x35, 0x88, 0x89, 0x37, - 0x13, 0x77, 0x32, 0x80, 0xfc, 0xc0, 0xe4, 0x99, 0xa4, 0xe6, 0xd0, 0xe1, - 0x54, 0x00, 0xc4, 0x05, 0x71, 0x22, 0x62, 0x57, 0xbd, 0x10, 0x0e, 0xc2, - 0x36, 0x6d, 0x81, 0xf3, 0x0d, 0xf9, 0x98, 0xcb, 0x00, 0x2d, 0x25, 0x66, - 0xd4, 0x8f, 0x43, 0xdb, 0x49, 0x4e, 0xa7, 0x9a, 0x48, 0xb5, 0x7e, 0xc6, - 0xd4, 0x31, 0x6d, 0xba, 0x4e, 0x9a, 0xb1, 0x69, 0x04, 0x41, 0x40, 0xe7, - 0x4b, 0xd4, 0x64, 0x43, 0x5f, 0x63, 0x77, 0xae, 0x4e, 0x67, 0x6d, 0x30, - 0xa2, 0x11, 0x32, 0xb5, 0xed, 0x61, 0x42, 0xb2, 0x8c, 0x5a, 0x00, 0x85, - 0x71, 0xe9, 0x8b, 0xf1, 0xd1, 0xf8, 0xbd, 0xf9, 0x7a, 0x72, 0x5a, 0x80, - 0x95, 0xaf, 0xc9, 0x56, 0x05, 0xc7, 0x59, 0xca, 0x93, 0x2d, 0x08, 0x4c, - 0xf4, 0x79, 0xbe, 0x52, 0xbe, 0xc6, 0xf0, 0x4c, 0x64, 0x38, 0x5b, 0xd6, - 0x5e, 0xfa, 0x7a, 0x06, 0xd9, 0x2c, 0x16, 0x11, 0xa4, 0x30, 0xcc, 0x7a, - 0x6d, 0xd3, 0x56, 0xfa, 0xb9, 0x50, 0xef, 0x9f, 0x1c, 0x37, 0xdc, 0x40, - 0x5b, 0x2f, 0xfd, 0x56, 0x83, 0x85, 0xec, 0x65, 0x84, 0xe0, 0x9b, 0x06, - 0x4d, 0x10, 0x55, 0x96, 0xb5, 0x72, 0xb5, 0x1d, 0x9a, 0x35, 0xc3, 0xc9, - 0xf7, 0x49, 0x3c, 0x3f, 0xcc, 0xab, 0x1b, 0x34, 0xae, 0x58, 0xa3, 0x4e, - 0x2c, 0x2b, 0x57, 0x36, 0x1f, 0x9d, 0x13, 0x45, 0x63, 0x93, 0x87, 0x42, - 0x67, 0xce, 0x84, 0xda, 0x2e, 0x80, 0x5e, 0xab, 0x32, 0x10, 0xfb, 0xac, - 0x1e, 0x7d, 0xeb, 0x88, 0xad, 0x23, 0x5f, 0x56, 0xbc, 0xfd, 0xfc, 0x42, - 0x30, 0x91, 0x25, 0x0f, 0xf4, 0x78, 0x27, 0x3d, 0x29, 0x4a, 0xd6, 0xf7, - 0x5a, 0x9f, 0x04, 0x6e, 0x90, 0x4d, 0x5d, 0x69, 0x89, 0x51, 0x2e, 0xd3, - 0x0a, 0xa9, 0x82, 0xf9, 0x25, 0x9f, 0x6f, 0x4a, 0x0c, 0x67, 0xa5, 0x62, - 0x5d, 0xd7, 0x3d, 0xa7, 0xd6, 0x7a, 0x79, 0xcb, 0x45, 0x39, 0x80, 0x27, - 0xb7, 0x9e, 0x1e, 0xa8, 0x47, 0x77, 0x6a, 0x3f, 0xaa, 0x50, 0x2e, 0x94, - 0x4e, 0x25, 0x79, 0x04, 0xd8, 0x4e, 0x88, 0xd6, 0xed, 0x2d, 0x10, 0xb1, - 0x5f, 0xe6, 0xb4, 0x22, 0xe5, 0xae, 0x20, 0x1a, 0x3b, 0x56, 0xd0, 0xf2, - 0xfc, 0x15, 0x79, 0x91, 0xa0, 0x16, 0x1e, 0x4e, 0x00, 0x8e, 0x13, 0x2c, - 0xe0, 0xce, 0xab, 0x95, 0x89, 0x16, 0x59, 0xae, 0x85, 0x3e, 0xe1, 0x5b, - 0x44, 0x74, 0x00, 0x85, 0x8c, 0xc8, 0x24, 0xf8, 0xbc, 0x31, 0x72, 0x29, - 0x48, 0x4e, 0xac, 0x28, 0x31, 0x0d, 0x23, 0x1d, 0x30, 0x45, 0x6a, 0x4c, - 0x09, 0x71, 0x0c, 0xc9, 0x30, 0x67, 0xd7, 0x45, 0xa1, 0x04, 0x86, 0x52, - 0x2d, 0xcb, 0x83, 0x91, 0x2a, 0xd7, 0xc9, 0xe8, 0x3d, 0x0c, 0x9a, 0x14, - 0x0a, 0xd7, 0x69, 0x6b, 0x68, 0xf7, 0x81, 0x15, 0x0d, 0xd0, 0x6e, 0x39, - 0x82, 0x54, 0x48, 0xf4, 0xaf, 0x0d, 0x65, 0xed, 0xde, 0xc7, 0x7c, 0xbd, - 0x42, 0xf9, 0xcd, 0xa1, 0xf9, 0xa7, 0x23, 0xc0, 0xa4, 0x22, 0x84, 0x6e, - 0xfe, 0x17, 0x39, 0xa4, 0x9a, 0xc6, 0xdc, 0x62, 0x12, 0x12, 0x8d, 0xc2, - 0x26, 0xd6, 0xde, 0x89, 0xe2, 0xba, 0x77, 0xf2, 0x5e, 0xbd, 0x67, 0xdb, - 0x32, 0x38, 0xc0, 0xf3, 0x29, 0x76, 0xa5, 0x7f, 0x29, 0xbc, 0x8e, 0xe5, - 0xbf, 0x5d, 0x77, 0xf3, 0x7c, 0x80, 0xbf, 0xd4, 0x98, 0xc1, 0x26, 0x5e, - 0xd9, 0x02, 0x9d, 0x02, 0xa9, 0x37, 0x9f, 0x48, 0x2f, 0xec, 0xe1, 0x45, - 0xd3, 0xd8, 0x13, 0x8d, 0xd1, 0xc2, 0xe8, 0x6d, 0x1e, 0x66, 0xa3, 0x32, - 0x2b, 0xd2, 0x78, 0x0d, 0xc6, 0x8c, 0xad, 0x39, 0x45, 0xcf, 0xd2, 0xe6, - 0xf2, 0x8d, 0xea, 0x51, 0x2a, 0x57, 0x0c, 0x46, 0x53, 0xd5, 0x8b, 0xbb, - 0x61, 0x84, 0x73, 0xce, 0x3b, 0x77, 0xa7, 0xde, 0xf3, 0x95, 0x21, 0x12, - 0xbc, 0x2f, 0x87, 0xbd, 0xbf, 0x0c, 0xfd, 0xd5, 0xcf, 0xde, 0xfa, 0x01, - 0xf1, 0x94, 0x67, 0xbf, 0xac, 0x15, 0xf0, 0xb9, 0x26, 0xde, 0xa0, 0x01, - 0xa3, 0x68, 0x33, 0x5e, 0x0c, 0x8c, 0x6d, 0x0b, 0xcf, 0xa3, 0x15, 0x8a, - 0x45, 0x31, 0x6a, 0xc9, 0xec, 0x09, 0xbd, 0x30, 0x2b, 0xdf, 0x8d, 0xa3, - 0x3e, 0x9d, 0xc9, 0xa1, 0x4e, 0x4f, 0xd9, 0x90, 0xb1, 0xbf, 0xd2, 0x92, - 0xe5, 0x45, 0x82, 0xa5, 0x37, 0xc3, 0x50, 0x6c, 0x13, 0x43, 0x29, 0x30, - 0x38, 0xcf, 0xe0, 0xe6, 0x28, 0x36, 0x92, 0x59, 0x54, 0x78, 0xc9, 0x3f, - 0x45, 0x68, 0x6c, 0x06, 0x40, 0xb8, 0x7a, 0xb7, 0xc2, 0x4d, 0xfc, 0x46, - 0x45, 0x00, 0x42, 0xa7, 0x30, 0xda, 0x84, 0x17, 0xcd, 0x34, 0x67, 0xd5, - 0x27, 0x85, 0xa1, 0x0c, 0x9b, 0x65, 0x76, 0x06, 0xdd, 0x6d, 0xc7, 0x26, - 0xfa, 0x77, 0x67, 0xb9, 0xe6, 0x11, 0x2a, 0x8d, 0xa8, 0xa3, 0xfd, 0x1a, - 0x71, 0x72, 0x39, 0x9d, 0xfa, 0x69, 0xca, 0x4f, 0xc0, 0x07, 0x33, 0x9b, - 0x64, 0x14, 0x76, 0x5f, 0x0b, 0x4f, 0xc1, 0xec, 0xf7, 0xf9, 0x7d, 0x59, - 0x7e, 0x3e, 0x2e, 0xc6, 0x5e, 0x52, 0xc7, 0x2b, 0xd2, 0x36, 0x20, 0xea, - 0xfb, 0x74, 0xf4, 0x45, 0xa8, 0xbb, 0x6a, 0xfe, 0xf4, 0x33, 0x53, 0xb2, - 0xc3, 0x53, 0xf5, 0x4e, 0x3e, 0x02, 0x27, 0x2f, 0xe1, 0x79, 0x43, 0x6e, - 0xac, 0x68, 0x33, 0x11, 0x6e, 0x5a, 0x33, 0x68, 0x7f, 0xf3, 0x78, 0x43, - 0x39, 0x91, 0x28, 0x8c, 0xb3, 0x28, 0x23, 0x58, 0x18, 0xfa, 0x1c, 0x3b, - 0x12, 0x12, 0x7e, 0xf2, 0x4b, 0xf8, 0x02, 0xb0, 0xe0, 0x1e, 0x24, 0x98, - 0x91, 0x36, 0xb1, 0xd2, 0xf4, 0x1c, 0x13, 0x06, 0xe1, 0xf4, 0x33, 0xcb, - 0x9d, 0x0e, 0x7e, 0x5d, 0xa9, 0xfc, 0x94, 0x22, 0x80, 0x56, 0x17, 0x02, - 0xf2, 0xaa, 0xe5, 0xae, 0xfe, 0x39, 0x5b, 0x88, 0xd1, 0xd7, 0x80, 0xd3, - 0xfe, 0x5e, 0xa7, 0x08, 0x70, 0xdf, 0xfb, 0x04, 0x79, 0x56, 0xdc, 0x7b, - 0x02, 0x1a, 0xbe, 0xee, 0xc1, 0x97, 0xf1, 0x2e, 0xeb, 0x3c, 0x27, 0x2d, - 0x79, 0x1b, 0xd8, 0xbc, 0x20, 0x8d, 0xdb, 0x19, 0x16, 0x66, 0x69, 0xb2, - 0x6f, 0xa1, 0x5f, 0x3c, 0x86, 0xc4, 0x47, 0x21, 0x88, 0xc7, 0x8a, 0x7e, - 0x90, 0x6c, 0x3e, 0x00, 0x3b, 0x65, 0xe0, 0xd2, 0x4a, 0x32, 0xb9, 0xdf, - 0xa7, 0xfa, 0xf8, 0x2a, 0x8c, 0x2d, 0xfc, 0x3c, 0xe9, 0xd9, 0xa7, 0xed, - 0xb4, 0xce, 0x10, 0xa8, 0x2b, 0xb2, 0xf7, 0xb2, 0x3e, 0xe1, 0x7c, 0x90, - 0x43, 0x5b, 0x99, 0xc8, 0x4c, 0xcf, 0x8c, 0x1c, 0x54, 0x55, 0x67, 0x42, - 0x8b, 0x42, 0x48, 0x1d, 0x8d, 0x1a, 0x4f, 0xcd, 0xc4, 0x9e, 0x48, 0x4e, - 0xe6, 0x03, 0x41, 0x56, 0x10, 0x4b, 0x45, 0x14, 0xcd, 0x58, 0x04, 0xc1, - 0x24, 0xaf, 0xf4, 0xde, 0x34, 0x3f, 0xfa, 0x8e, 0xca, 0xba, 0xa2, 0x4e, - 0x97, 0xfa, 0x26, 0xad, 0xcd, 0x97, 0x9e, 0x62, 0x4a, 0x64, 0x94, 0x8d, - 0x2a, 0xfd, 0x4c, 0x56, 0xbd, 0xc1, 0x8d, 0x9b, 0xcc, 0x24, 0xba, 0xc5, - 0x38, 0xdb, 0x1a, 0x5f, 0x9c, 0x16, 0x15, 0x53, 0xce, 0x9a, 0x56, 0x72, - 0x78, 0xad, 0x30, 0xb8, 0x7e, 0x7b, 0x14, 0xd7, 0xc7, 0x6f, 0x62, 0x43, - 0x47, 0x05, 0x54, 0xf5, 0x54, 0x9f, 0x65, 0x93, 0x6c, 0xaa, 0x4a, 0x4c, - 0x28, 0x92, 0x65, 0x62, 0x9e, 0x82, 0x15, 0xe8, 0x99, 0xec, 0xe8, 0x04, - 0xd2, 0x62, 0x90, 0xe2, 0x7d, 0x53, 0xdc, 0x12, 0x9a, 0xee, 0x18, 0x33, - 0x6b, 0xb0, 0x11, 0xd9, 0x0e, 0x13, 0x2c, 0xff, 0xf9, 0x9f, 0xb4, 0x82, - 0xd6, 0x32, 0x67, 0xfa, 0xb3, 0x78, 0xe4, 0x16, 0x22, 0x72, 0xe0, 0x22, - 0xcc, 0xb6, 0xc2, 0xa3, 0x9a, 0x55, 0x0e, 0xa3, 0x8d, 0x74, 0x7b, 0x72, - 0x83, 0x08, 0x48, 0xe5, 0xcb, 0x4a, 0x20, 0xa1, 0x0a, 0xcc, 0x03, 0xb4, - 0x53, 0x6c, 0x57, 0x29, 0xb4, 0x21, 0x67, 0x13, 0x77, 0xe7, 0xc1, 0x26, - 0xb0, 0xda, 0xd9, 0xac, 0x0f, 0x00, 0xb5, 0x17, 0x7a, 0x9b, 0x17, 0xbf, - 0x7a, 0x8a, 0x6f, 0x83, 0x22, 0x0e, 0x21, 0x22, 0x27, 0xd1, 0x30, 0x7b, - 0xb6, 0x3d, 0x0a, 0x1f, 0xc2, 0x80, 0xa4, 0x20, 0x45, 0x2a, 0xf1, 0xf5, - 0x4c, 0x90, 0xc1, 0xd8, 0x1f, 0x73, 0x60, 0x2c, 0x3f, 0x32, 0x13, 0x2a, - 0xed, 0x38, 0x9f, 0xda, 0x4c, 0x72, 0xe6, 0xb8, 0xcf, 0x31, 0x90, 0x96, - 0xc1, 0xee, 0xff, 0x95, 0x09, 0xe0, 0x10, 0x00, 0x09, 0xcb, 0x68, 0xf2, - 0x87, 0x48, 0xe3, 0x44, 0x6f, 0xd2, 0xc2, 0x1a, 0x91, 0x83, 0x85, 0xa1, - 0x97, 0xe4, 0x5b, 0x4c, 0x3a, 0x65, 0x73, 0x75, 0xe2, 0xca, 0xa2, 0x32, - 0xf2, 0xb7, 0xc4, 0x68, 0xd8, 0x3d, 0x93, 0x69, 0x77, 0x7c, 0x22, 0x82, - 0x95, 0x4e, 0x13, 0xbb, 0x35, 0x56, 0xd6, 0x80, 0x8f, 0x86, 0x58, 0x6a, - 0x65, 0xb2, 0x5a, 0xd4, 0x0f, 0x7a, 0x6d, 0x4b, 0x29, 0x82, 0x9e, 0xf0, - 0x51, 0x17, 0x3f, 0x2e, 0xf5, 0xd8, 0x8c, 0x10, 0x78, 0xdc, 0x8b, 0xf5, - 0x53, 0x81, 0xe4, 0xd9, 0x06, 0x57, 0x14, 0x31, 0xc9, 0x23, 0xcb, 0x1a, - 0xfe, 0x80, 0x39, 0xcd, 0xc7, 0xf0, 0x23, 0x44, 0x36, 0x63, 0xeb, 0x2e, - 0xc5, 0x55, 0x6d, 0x79, 0x77, 0x59, 0xbb, 0x86, 0x2b, 0x0f, 0x7e, 0x50, - 0xc2, 0x32, 0xd5, 0xf3, 0x8f, 0x95, 0x19, 0xad, 0x3c, 0xa4, 0x8f, 0x08, - 0xc4, 0x2c, 0x22, 0x64, 0x1e, 0xd6, 0xb1, 0x38, 0x05, 0xe8, 0x56, 0x72, - 0x2b, 0x60, 0x56, 0x73, 0x4d, 0xf8, 0x06, 0x2f, 0x9c, 0xb4, 0x08, 0x8e, - 0x25, 0xe2, 0xb0, 0x04, 0x26, 0x2c, 0x3d, 0xc1, 0x94, 0x56, 0x88, 0x69, - 0x0c, 0x6d, 0x85, 0xed, 0xf1, 0x2d, 0x7a, 0xc1, 0x75, 0x2f, 0x3e, 0x12, - 0xf8, 0x24, 0x99, 0x17, 0xc6, 0x20, 0x5d, 0x97, 0xe9, 0x68, 0xe5, 0xfd, - 0x2b, 0x51, 0x27, 0x27, 0x2b, 0xc8, 0xfc, 0x3e, 0x1f, 0x46, 0x76, 0x99, - 0xea, 0x2f, 0x17, 0x62, 0x48, 0x0e, 0x8f, 0xd4, 0x88, 0x01, 0xf2, 0xf9, - 0x62, 0xad, 0x8c, 0x71, 0xf9, 0xc9, 0x17, 0x74, 0xd2, 0xdc, 0x7b, 0xa3, - 0x24, 0x78, 0x3f, 0x7b, 0x80, 0x8e, 0xad, 0x22, 0xc5, 0x8f, 0x4a, 0x93, - 0x7b, 0x34, 0x3e, 0x73, 0x91, 0x03, 0xa6, 0xed, 0x67, 0x35, 0x91, 0x08, - 0x2d, 0x32, 0x90, 0x6b, 0xa1, 0xb2, 0xeb, 0xe4, 0xfb, 0x61, 0x57, 0x4d, - 0x0c, 0xfa, 0xcf, 0x06, 0x65, 0xcc, 0x67, 0x90, 0xcb, 0xe7, 0xe8, 0xb7, - 0xec, 0x4b, 0xc7, 0xc9, 0x55, 0x3a, 0x36, 0xac, 0x4f, 0x01, 0xe0, 0xa9, - 0x9a, 0xc6, 0x35, 0x48, 0x2e, 0x08, 0x90, 0x74, 0xb7, 0x34, 0x0c, 0x5c, - 0xc3, 0xc4, 0x5d, 0x2f, 0x09, 0x16, 0x23, 0x7c, 0x3c, 0x96, 0xf9, 0xb0, - 0xc1, 0x7f, 0xcf, 0xad, 0x8b, 0x79, 0xf9, 0x47, 0x4a, 0x07, 0xce, 0x66, - 0x30, 0x5c, 0xd9, 0x91, 0xa3, 0x4d, 0x1c, 0x31, 0xad, 0xb4, 0xa6, 0xaa, - 0x64, 0x62, 0xff, 0xe0, 0x89, 0xdf, 0xee, 0x93, 0x1c, 0xb1, 0xe0, 0xb7, - 0x74, 0xf8, 0x69, 0xa1, 0xa7, 0x38, 0x01, 0xf9, 0x7d, 0xe4, 0x36, 0x91, - 0x72, 0xeb, 0xe7, 0x45, 0x63, 0x28, 0x5e, 0x64, 0x2f, 0xe0, 0xe6, 0x59, - 0x4e, 0xc6, 0x48, 0x37, 0x44, 0x61, 0xe2, 0x95, 0x16, 0x21, 0xff, 0xe8, - 0x5d, 0xb5, 0x78, 0xbd, 0x62, 0xf4, 0xb4, 0x9c, 0xf9, 0x9b, 0x2d, 0x6c, - 0x04, 0x4c, 0xf5, 0xef, 0xd2, 0xf5, 0x21, 0xc4, 0x02, 0x40, 0x29, 0xd6, - 0x42, 0xee, 0xb8, 0x0c, 0x4f, 0xb5, 0xc3, 0x33, 0x3f, 0x5f, 0xa4, 0x5e, - 0xec, 0x19, 0xfc, 0x7c, 0xe6, 0x24, 0x07, 0xd1, 0xd9, 0x31, 0xf9, 0xab, - 0xf7, 0x5b, 0xe6, 0xb5, 0x98, 0x0b, 0x76, 0xe3, 0x30, 0x90, 0x35, 0x0d, - 0x5b, 0x89, 0x51, 0x4d, 0xc7, 0xfd, 0x59, 0x5b, 0xbe, 0xef, 0x50, 0xe1, - 0xa2, 0x3f, 0x49, 0x7a, 0x16, 0x5e, 0xbe, 0x31, 0x97, 0xb5, 0x56, 0x09, - 0x84, 0xd7, 0x3f, 0xfa, 0x2a, 0x87, 0x43, 0x0a, 0xb5, 0x34, 0x74, 0xe7, - 0x1a, 0xe8, 0x85, 0xd5, 0x9d, 0x1a, 0x3f, 0xc9, 0xc7, 0x2c, 0x1d, 0x98, - 0xf3, 0x4a, 0xc1, 0x9b, 0x41, 0x3b, 0x35, 0x99, 0xb9, 0xa0, 0xc9, 0x57, - 0x51, 0x4c, 0x5b, 0x0c, 0xe9, 0x59, 0x3a, 0x16, 0xc7, 0x52, 0x03, 0x6d, - 0x70, 0xf7, 0x4d, 0x79, 0x63, 0x0d, 0xa2, 0xba, 0x78, 0xd1, 0x41, 0xf4, - 0xe6, 0xdb, 0xf0, 0xde, 0x45, 0xe9, 0x3d, 0x6a, 0x19, 0x9b, 0x0b, 0xb0, - 0xb8, 0xeb, 0x57, 0xd3, 0x5e, 0x85, 0x2e, 0x76, 0x2a, 0xd3, 0x35, 0xde, - 0xe3, 0xcc, 0x17, 0x7f, 0x34, 0xef, 0xd6, 0xc9, 0xd9, 0xac, 0xbe, 0x99, - 0x48, 0xd1, 0x05, 0x9a, 0x9e, 0xf8, 0x39, 0xd8, 0x9c, 0x37, 0x06, 0x0f, - 0xd3, 0xdf, 0x5f, 0x31, 0x54, 0x60, 0x33, 0x5f, 0xcf, 0x2a, 0x15, 0x71, - 0x6d, 0x47, 0x43, 0xa2, 0x8c, 0x19, 0x1f, 0x0f, 0x39, 0x43, 0x43, 0xf8, - 0xcd, 0xc8, 0xb7, 0xb5, 0x0b, 0xeb, 0xe6, 0x28, 0x1c, 0x7a, 0x17, 0xb7, - 0x3a, 0x12, 0x9c, 0xbe, 0xb9, 0xd8, 0x6e, 0x3c, 0x3d, 0x2b, 0x1c, 0x93, - 0x21, 0xff, 0x2d, 0x5f, 0x6f, 0x50, 0x0c, 0xbf, 0x00, 0x92, 0x2e, 0x57, - 0x30, 0x5a, 0xd0, 0x2b, 0xb5, 0xaa, 0xdf, 0x2e, 0x13, 0xbb, 0x42, 0xbd, - 0xe4, 0x21, 0x86, 0x1d, 0x19, 0xad, 0x53, 0xa8, 0x35, 0xae, 0xd9, 0xc6, - 0xcf, 0x20, 0xa1, 0xce, 0x89, 0x3a, 0x4b, 0xa6, 0x07, 0x86, 0xc7, 0xe2, - 0xcd, 0x19, 0xe8, 0x9a, 0xef, 0x51, 0xd6, 0xc2, 0x08, 0x4f, 0x50, 0xe7, - 0xd2, 0xf3, 0xde, 0x18, 0xf9, 0x0c, 0xde, 0x6a, 0x2c, 0xdb, 0x11, 0x81, - 0xd2, 0x86, 0x1d, 0x6a, 0xc2, 0xbd, 0xa1, 0x5f, 0x8e, 0x13, 0x61, 0xd0, - 0x85, 0x30, 0xd2, 0x67, 0x2f, 0x12, 0xe7, 0x7d, 0xb5, 0x98, 0x4b, 0x67, - 0x1d, 0x16, 0x72, 0x67, 0x1c, 0x72, 0xa3, 0xbc, 0x12, 0x9e, 0x0f, 0x8c, - 0x27, 0x36, 0xe7, 0x3c, 0x26, 0x63, 0x54, 0x61, 0x37, 0x65, 0xf6, 0x83, - 0x61, 0x20, 0x0f, 0xe8, 0xa3, 0x65, 0xbe, 0x48, 0x01, 0x82, 0x98, 0xad, - 0x53, 0xc3, 0xd0, 0xeb, 0x19, 0x60, 0x06, 0x9b, 0x19, 0xea, 0x57, 0xd3, - 0x61, 0x61, 0x8f, 0x0e, 0x51, 0xc9, 0x28, 0xf7, 0x9d, 0xad, 0xff, 0x82, - 0xfb, 0xb5, 0x06, 0x3a, 0x38, 0x36, 0x96, 0xdb, 0x21, 0x9c, 0x68, 0xc1, - 0x0b, 0x87, 0x44, 0xab, 0x75, 0x2f, 0x45, 0x52, 0x4e, 0x39, 0x0f, 0xc2, - 0x4e, 0x79, 0x02, 0xc7, 0xbc, 0xf8, 0x76, 0x99, 0xa2, 0x44, 0x60, 0x29, - 0x5d, 0x60, 0xc1, 0x50, 0xa0, 0xf1, 0xf7, 0xa3, 0x87, 0x84, 0x03, 0x11, - 0x4c, 0x31, 0x21, 0xa4, 0x6d, 0x26, 0x59, 0x0a, 0xc0, 0x22, 0xea, 0xe5, - 0x4f, 0xe4, 0x8d, 0x4e, 0x61, 0x0e, 0xf9, 0x6e, 0xb2, 0x5e, 0x58, 0x17, - 0xc4, 0x80, 0x30, 0xac, 0x0c, 0x35, 0x27, 0x92, 0xdc, 0x47, 0x39, 0x97, - 0x73, 0xad, 0x36, 0x06, 0x62, 0x0f, 0xb2, 0x62, 0x00, 0x46, 0x05, 0x11, - 0x22, 0x4e, 0xd8, 0x5e, 0xe0, 0xf4, 0x2c, 0x05, 0x85, 0x0a, 0x17, 0x55, - 0x18, 0xa6, 0x83, 0x64, 0x1a, 0xb1, 0xeb, 0x97, 0xb1, 0x81, 0x5f, 0xd1, - 0x6e, 0x01, 0x38, 0x95, 0x4a, 0x63, 0xcf, 0x9d, 0x46, 0xdb, 0x87, 0xb5, - 0xe9, 0x1a, 0x22, 0xef, 0x48, 0x42, 0x11, 0xe7, 0xaf, 0x0b, 0x89, 0x38, - 0xdb, 0x98, 0x26, 0xbd, 0x2e, 0x7c, 0x59, 0x0b, 0xdf, 0x25, 0x57, 0x00, - 0x14, 0xd4, 0xa5, 0xea, 0xc0, 0x87, 0xbe, 0x54, 0x3c, 0x0d, 0x84, 0x6d, - 0xe2, 0xbb, 0xeb, 0x19, 0x5b, 0x7f, 0x23, 0xdb, 0xa3, 0x4c, 0xa7, 0xd5, - 0x9a, 0x6a, 0x14, 0x3b, 0xff, 0x9c, 0xbe, 0xae, 0x6e, 0xf0, 0x8e, 0xaa, - 0x99, 0x5a, 0x0f, 0x0c, 0x73, 0xad, 0x36, 0x06, 0x62, 0x0f, 0xb2, 0x62, - 0x00, 0x46, 0x05, 0x11, 0x22, 0x4e, 0xd1, 0x5e, 0xec, 0x23, 0x0c, 0x3c, - 0x7a, 0xb6, 0xce, 0xa2, 0xdc, 0x58, 0x7c, 0x6b, 0x38, 0xb4, 0x5d, 0xd2, - 0x11, 0x71, 0x60, 0xa8, 0x89, 0x7a, 0x76, 0x7f, 0x49, 0xc8, 0x92, 0xb2, - 0xb4, 0xde, 0xef, 0xe0, 0xd2, 0x30, 0x83, 0x14, 0x79, 0xd1, 0x41, 0xbb, - 0x00, 0x90, 0xa7, 0xf8, 0x38, 0x71, 0x0f, 0x49, 0x38, 0x9a, 0x11, 0xc3, - 0xba, 0xd9, 0x2f, 0x34, 0x73, 0x36, 0xe9, 0x6b, 0xdf, 0xa9, 0x97, 0x77, - 0x67, 0xe8, 0x9b, 0x0a, 0xfb, 0xd3, 0xd3, 0xbe, 0x1a, 0x5f, 0xc9, 0x80, - 0x4a, 0xff, 0x73, 0x7c, 0x84, 0xb5, 0x38, 0xd3, 0x56, 0xbf, 0xfc, 0x39, - 0xdb, 0x1c, 0x8b, 0x31, 0x7c, 0x80, 0x5c, 0x06, 0x9a, 0xf9, 0x44, 0xc0, - 0x71, 0x95, 0x7d, 0x0e, 0xd6, 0xd1, 0x09, 0xcc, 0x4d, 0x69, 0x3a, 0x92, - 0xab, 0xa1, 0xf8, 0xe3, 0xb4, 0x7d, 0x32, 0x31, 0x64, 0xea, 0xd6, 0xce, - 0x5c, 0xd0, 0x6c, 0xdb, 0x5a, 0xcf, 0x2b, 0xc5, 0xa6, 0x4b, 0x46, 0x95, - 0x10, 0x7a, 0xce, 0x7b, 0xa0, 0x91, 0x19, 0xf2, 0xc0, 0xd3, 0xae, 0x3a, - 0x28, 0xfb, 0xd9, 0x1b, 0x63, 0x14, 0x89, 0x7b, 0x98, 0xac, 0x42, 0xa1, - 0x4f, 0xe9, 0x45, 0x8a, 0x8e, 0xa5, 0x6c, 0x1c, 0xf2, 0x66, 0x9b, 0xe9, - 0x6e, 0xd1, 0xc6, 0xc1, 0x8d, 0xae, 0x9b, 0xbf, 0xf7, 0xc2, 0xb7, 0x87, - 0xf3, 0xe7, 0xc5, 0xfd, 0x8c, 0x30, 0x55, 0xd9, 0x24, 0xf0, 0xef, 0xd4, - 0x0d, 0x3d, 0xdc, 0xa7, 0xa5, 0x72, 0xd5, 0x9c, 0x6d, 0x35, 0x5c, 0x79, - 0x75, 0xf2, 0x20, 0xda, 0xc7, 0xce, 0xa7, 0x96, 0x60, 0x9d, 0xc7, 0x3e, - 0xa1, 0x6c, 0xd9, 0x1a, 0x3a, 0x83, 0x78, 0x6a, 0xe6, 0x65, 0xcc, 0xf5, - 0x61, 0x8e, 0x8b, 0x40, 0x07, 0x79, 0x04, 0x4b, 0xd5, 0x54, 0x76, 0x7a, - 0xd7, 0x29, 0xa0, 0x55, 0x66, 0x77, 0xd5, 0x9c, 0xa6, 0xf1, 0x10, 0xb5, - 0xaa, 0x82, 0xc0, 0x6f, 0x50, 0x26, 0x85, 0x51, 0x5b, 0xba, 0xd6, 0x0d, - 0x87, 0x19, 0xfb, 0xbd, 0xf3, 0x50, 0xc2, 0xe2, 0x3a, 0xee, 0x4b, 0xcc, - 0xfa, 0xe4, 0x9c, 0x7f, 0x88, 0xcb, 0xcd, 0xb6, 0x9c, 0x41, 0xa3, 0x9b, - 0x38, 0xa1, 0xb6, 0xa3, 0xce, 0xb0, 0x8c, 0x70, 0x01, 0x4e, 0xf3, 0x54, - 0x24, 0xe4, 0x44, 0xbb, 0xaf, 0x43, 0x85, 0x21, 0xf9, 0x06, 0x4a, 0x19, - 0x94, 0x4a, 0x99, 0x38, 0x6f, 0x60, 0x0c, 0xf1, 0xb9, 0xcf, 0x15, 0xbb, - 0xd3, 0x74, 0xc0, 0x62, 0xdc, 0x75, 0x4b, 0xd7, 0x53, 0x8c, 0xb4, 0xb3, - 0xed, 0xf1, 0x48, 0xa0, 0xff, 0x4b, 0x14, 0xaa, 0xde, 0xae, 0x2b, 0xbd, - 0x13, 0xc0, 0xf6, 0xf5, 0xe2, 0xf3, 0xd5, 0x99, 0x1f, 0x93, 0xfc, 0x39, - 0x26, 0x32, 0x78, 0x9a, 0x50, 0x8c, 0xbf, 0x8d, 0x7f, 0x74, 0xca, 0x63, - 0xc7, 0x2b, 0x24, 0xf3, 0x19, 0x22, 0x6b, 0x4b, 0xf5, 0xbc, 0xd3, 0x3a, - 0x94, 0xe7, 0xdd, 0x75, 0x59, 0x2c, 0x3f, 0xfd, 0x34, 0x4c, 0xba, 0xf3, - 0x65, 0x11, 0x73, 0x8c, 0x61, 0x24, 0x9c, 0x60, 0x3e, 0x6d, 0xa9, 0xc3, - 0x18, 0x8b, 0xbb, 0x15, 0xf7, 0xa5, 0x13, 0xaa, 0x55, 0xbd, 0x39, 0x02, - 0xa0, 0x91, 0x8f, 0x2f, 0x64, 0xf7, 0x40, 0x6b, 0xc1, 0x88, 0xbe, 0xe5, - 0x85, 0x10, 0x52, 0x4d, 0x77, 0x04, 0xc0, 0x88, 0xcf, 0x36, 0x79, 0x38, - 0x54, 0x9c, 0xe7, 0xb4, 0x99, 0x35, 0x93, 0xc3, 0x67, 0x2d, 0xf9, 0x8a, - 0xef, 0xad, 0x7e, 0x25, 0xf0, 0xe4, 0xf6, 0x1a, 0x22, 0x7c, 0xab, 0xec, - 0x05, 0xf6, 0x0f, 0x66, 0x1d, 0x5c, 0xff, 0x2f, 0x80, 0xb6, 0x95, 0x9e, - 0x24, 0x47, 0x7f, 0x63, 0x69, 0x51, 0x67, 0x85, 0x9b, 0x61, 0x54, 0x06, - 0x83, 0x32, 0xe8, 0x49, 0x53, 0x60, 0x2a, 0x9e, 0xa5, 0x8a, 0x7a, 0x25, - 0x9a, 0x9c, 0xac, 0x89, 0x74, 0x65, 0xe2, 0xa8, 0x33, 0xb3, 0x88, 0xb1, - 0xaa, 0x7d, 0x2b, 0x94, 0xad, 0x3b, 0x23, 0xc6, 0x3b, 0x1b, 0xff, 0x48, - 0x44, 0x40, 0xac, 0xbf, 0xe0, 0x6a, 0xff, 0x3a, 0x31, 0xf0, 0x9a, 0x29, - 0xc8, 0x50, 0xe1, 0x20, 0x50, 0x37, 0xec, 0x17, 0x06, 0xee, 0x97, 0x40, - 0x2a, 0xf5, 0x1b, 0xa1, 0x92, 0xdd, 0x3c, 0x96, 0x4f, 0xce, 0xd6, 0x82, - 0xb8, 0xe6, 0x39, 0xaa, 0x32, 0xb6, 0xb3, 0x97, 0x84, 0x53, 0x4b, 0x1d, - 0xc2, 0x87, 0x8e, 0x88, 0xae, 0x9f, 0xc8, 0x41, 0xc2, 0x22, 0xd0, 0x91, - 0x7a, 0x23, 0x68, 0xa9, 0x53, 0x69, 0x05, 0x28, 0x42, 0xfa, 0xe5, 0x1e, - 0x0b, 0xc4, 0xbb, 0xb0, 0x08, 0xc3, 0xdc, 0x59, 0x21, 0x52, 0xed, 0xe0, - 0x17, 0x71, 0xeb, 0xdf, 0x08, 0x0f, 0x68, 0xb5, 0x0e, 0xd7, 0x92, 0xda, - 0x8b, 0xac, 0xee, 0xc4, 0x34, 0xb7, 0xfa, 0x28, 0xb6, 0x14, 0x15, 0x01, - 0xa2, 0xc0, 0x83, 0x8a, 0x65, 0x5c, 0xda, 0x78, 0x95, 0x55, 0xc8, 0xeb, - 0xa0, 0xd8, 0x40, 0x31, 0x68, 0x18, 0xa4, 0x5f, 0xc9, 0x3b, 0x35, 0x0b, - 0x49, 0xc0, 0x5a, 0x56, 0x3f, 0xc7, 0xff, 0x7b, 0x6c, 0x31, 0xbe, 0x9a, - 0xc3, 0xa2, 0xe8, 0x2c, 0xee, 0x33, 0xc2, 0x99, 0x4c, 0x21, 0x2c, 0x14, - 0xf3, 0x62, 0x3f, 0x8a, 0x3a, 0x81, 0xee, 0x49, 0x4f, 0x2d, 0xaf, 0x13, - 0xeb, 0x7c, 0x73, 0x45, 0x77, 0xcb, 0xe9, 0xfd, 0x60, 0xb3, 0xf9, 0xee, - 0x3f, 0xfa, 0xfb, 0xed, 0xa8, 0xb3, 0x0c, 0x02, 0x42, 0x76, 0x59, 0x1a, - 0xfe, 0x12, 0xcf, 0x60, 0x1a, 0x6b, 0x93, 0xc2, 0x19, 0xa9, 0x08, 0xba, - 0xae, 0x10, 0x93, 0x14, 0xe1, 0x3c, 0x2a, 0x39, 0x34, 0xef, 0x80, 0x7a, - 0x86, 0x26, 0x4e, 0x58, 0xec, 0x17, 0x25, 0xb3, 0xd6, 0xd4, 0x38, 0x31, - 0xf5, 0x68, 0x59, 0xc0, 0x69, 0xea, 0x10, 0x3d, 0x5c, 0x31, 0xb8, 0x0a, - 0x8f, 0xb7, 0x95, 0x30, 0x02, 0xd8, 0x58, 0xc7, 0x19, 0x53, 0x18, 0x18, - 0x15, 0x94, 0x7f, 0x97, 0xef, 0x19, 0x62, 0x63, 0x16, 0x45, 0xab, 0xe8, - 0xef, 0x40, 0x2a, 0x0b, 0xc5, 0xe1, 0xc7, 0xa1, 0x15, 0x1d, 0xd6, 0x8b, - 0x18, 0xc6, 0x61, 0x99, 0xe5, 0xe5, 0xce, 0xb4, 0xc9, 0xd8, 0xd7, 0x3b, - 0x53, 0x8a, 0xa6, 0xe0, 0x31, 0x11, 0x4c, 0xf1, 0x37, 0xe2, 0x32, 0x52, - 0x4b, 0xb2, 0xfb, 0x82, 0x85, 0x73, 0xfd, 0x68, 0xee, 0xa1, 0x48, 0x7d, - 0xe4, 0x39, 0xa7, 0xe2, 0x7f, 0x54, 0xbd, 0x32, 0x9d, 0x24, 0x47, 0x67, - 0xdc, 0x6c, 0x1b, 0x7a, 0x6c, 0x5b, 0x66, 0xdb, 0xd0, 0xd0, 0x2f, 0x50, - 0xcd, 0xc6, 0xe9, 0xf5, 0x67, 0xa0, 0xd9, 0x6a, 0xb0, 0x7c, 0xab, 0x09, - 0x67, 0x74, 0xe6, 0x24, 0x1c, 0x14, 0x26, 0xe9, 0x9a, 0x41, 0x60, 0x9f, - 0x16, 0xc6, 0x40, 0xd1, 0x14, 0x2e, 0x70, 0xf5, 0xe0, 0x4d, 0x75, 0x6c, - 0xf6, 0x05, 0x66, 0xeb, 0xfd, 0x4a, 0xb2, 0x01, 0xb8, 0xf5, 0xa6, 0xf1, - 0xe9, 0x02, 0x2e, 0xf3, 0x9a, 0xa7, 0xa9, 0x3a, 0x2e, 0x1a, 0xc4, 0x88, - 0x36, 0x17, 0xce, 0x90, 0x7e, 0x7f, 0x7f, 0xfc, 0xc1, 0xe9, 0xb3, 0x18, - 0x40, 0xef, 0x9f, 0x07, 0x40, 0xea, 0x63, 0xb3, 0x10, 0x4e, 0x40, 0x97, - 0x57, 0x9b, 0xd2, 0xbb, 0x2b, 0xb5, 0x51, 0x64, 0x8c, 0xc8, 0xea, 0xad, - 0x0f, 0x4f, 0xd3, 0x80, 0xbf, 0x18, 0x62, 0x98, 0x13, 0x71, 0x0f, 0xc1, - 0x6a, 0x26, 0xdc, 0x74, 0x37, 0xd8, 0x27, 0x57, 0xa8, 0xed, 0xa8, 0xfe, - 0xbb, 0xec, 0x36, 0x4f, 0x6e, 0xd6, 0x03, 0x33, 0xee, 0xda, 0xbb, 0xe6, - 0xbf, 0xfd, 0x11, 0xcb, 0xb6, 0x06, 0x8a, 0xe5, 0x37, 0x4d, 0x02, 0x0d, - 0x15, 0xd8, 0xa5, 0xd0, 0x12, 0xf5, 0x3a, 0x26, 0xd1, 0x73, 0xbe, 0x2f, - 0x42, 0x0a, 0x60, 0xbb, 0x08, 0x08, 0x86, 0x2c, 0x94, 0x7e, 0xa5, 0xb8, - 0xf2, 0xc0, 0xfb, 0x10, 0x1b, 0x2f, 0x01, 0x72, 0x64, 0x31, 0x2a, 0xd9, - 0x4b, 0x5a, 0xef, 0x89, 0x11, 0x3a, 0xe9, 0x22, 0xf0, 0x24, 0x6e, 0x1e, - 0x23, 0xf4, 0x3c, 0x0f, 0x2d, 0xd4, 0x1a, 0x55, 0xf7, 0x6b, 0x6e, 0xb9, - 0x1c, 0x3b, 0x94, 0x32, 0x46, 0xbb, 0x2c, 0xf5, 0x5e, 0x4c, 0x66, 0x1a, - 0x7a, 0x04, 0x3d, 0xdc, 0x67, 0xca, 0xe7, 0x69, 0xa7, 0x98, 0xc7, 0x31, - 0x49, 0x0f, 0xad, 0x0f, 0x12, 0x98, 0xd6, 0xb5, 0x39, 0x37, 0xf4, 0x90, - 0x5a, 0x29, 0x38, 0x01, 0x85, 0xc7, 0x1c, 0x9c, 0xe0, 0x86, 0x19, 0xf6, - 0xbd, 0x4f, 0x4d, 0x82, 0x7e, 0x57, 0x7d, 0xd6, 0xbd, 0xc0, 0xcf, 0xf4, - 0xf5, 0xed, 0x65, 0x81, 0x57, 0xc8, 0x74, 0x87, 0xa8, 0xd4, 0x66, 0xa0, - 0xb3, 0xa4, 0x38, 0x49, 0xc5, 0xca, 0x54, 0xaf, 0x9a, 0x1d, 0x2a, 0x7c, - 0xbc, 0x46, 0x7c, 0xdc, 0xf4, 0xe6, 0x53, 0x8f, 0x34, 0x1e, 0x31, 0x2a, - 0x77, 0x3f, 0x81, 0x9d, 0x53, 0x71, 0x03, 0x0a, 0x93, 0xca, 0x18, 0xcf, - 0xfd, 0x10, 0xd1, 0x87, 0xf7, 0x84, 0x8c, 0x96, 0x5c, 0xdf, 0x15, 0xd2, - 0x61, 0x55, 0x69, 0xa2, 0x14, 0x75, 0x97, 0xef, 0x48, 0x30, 0x50, 0x98, - 0x1f, 0x84, 0x7a, 0xac, 0x9a, 0x4e, 0x0f, 0x17, 0x5b, 0xd4, 0x44, 0x55, - 0xf7, 0xff, 0xc5, 0x62, 0x2b, 0x22, 0x99, 0x08, 0x22, 0x73, 0x10, 0x6f, - 0x23, 0x4a, 0xf0, 0x31, 0x4f, 0xf5, 0x68, 0x3a, 0xdc, 0x38, 0xb1, 0x4d, - 0xb1, 0xe6, 0xaf, 0xf4, 0xcf, 0xfa, 0xe3, 0x08, 0xcd, 0xa4, 0x60, 0x38, - 0x99, 0x44, 0x54, 0x24, 0xe4, 0x6f, 0xdf, 0xc9, 0x28, 0xec, 0xb4, 0xf0, - 0xd5, 0x48, 0x04, 0xed, 0x32, 0xa6, 0x8c, 0x45, 0x85, 0x92, 0xda, 0x46, - 0xd9, 0x70, 0x22, 0x07, 0xdc, 0xc7, 0xd4, 0x5b, 0x31, 0xa7, 0xa7, 0xf0, - 0x19, 0xe5, 0x11, 0x25, 0xb7, 0xa2, 0x73, 0xa6, 0x41, 0x70, 0x23, 0x6e, - 0x0f, 0xec, 0x5d, 0xe5, 0x8c, 0x6a, 0x54, 0x57, 0x85, 0xe1, 0xba, 0xdb, - 0x3b, 0x49, 0x48, 0xa1, 0x3e, 0x52, 0x27, 0x26, 0x7e, 0xbd, 0x35, 0x47, - 0x04, 0xf0, 0xae, 0x00, 0x32, 0xdd, 0x28, 0x3b, 0x70, 0x1c, 0xaa, 0x68, - 0xd2, 0x47, 0x5b, 0xd1, 0xe1, 0x1f, 0x78, 0x90, 0x3c, 0x3d, 0xe8, 0xce, - 0xa2, 0x0f, 0x07, 0x71, 0x02, 0xfe, 0x81, 0xa5, 0xec, 0xca, 0x04, 0x4e, - 0x75, 0x5f, 0x54, 0xb4, 0x4a, 0x34, 0x11, 0x30, 0x0f, 0x76, 0xc1, 0x05, - 0xb7, 0xfb, 0x20, 0xbb, 0x8f, 0xb4, 0x49, 0x20, 0xa1, 0x6c, 0xd0, 0xa1, - 0xbe, 0xfa, 0x52, 0x7a, 0xd4, 0x1d, 0x8a, 0x7c, 0xe6, 0x81, 0x48, 0xaa, - 0x96, 0x75, 0x98, 0xd0, 0x50, 0xd6, 0x2d, 0xb8, 0xfb, 0x3a, 0x67, 0x3a, - 0x05, 0xfd, 0xb9, 0x05, 0xef, 0x59, 0x30, 0xfa, 0x95, 0xb5, 0x57, 0xa3, - 0xfd, 0xd3, 0x2b, 0xa7, 0x90, 0x8e, 0x34, 0xab, 0x3f, 0xb3, 0x4a, 0x8b, - 0xd2, 0x10, 0x8a, 0xea, 0xa9, 0x5b, 0x8c, 0x5d, 0xc3, 0xff, 0xf0, 0x06, - 0x43, 0x22, 0x16, 0xea, 0xbe, 0xaa, 0x28, 0xc3, 0xa3, 0x60, 0xae, 0x14, - 0x8e, 0x77, 0xad, 0x8d, 0x5a, 0x14, 0x8d, 0x0b, 0x09, 0x0b, 0x7f, 0x51, - 0x35, 0x4e, 0xb8, 0x17, 0x24, 0xb9, 0xfb, 0x32, 0xfe, 0x77, 0x3e, 0x38, - 0x86, 0xa4, 0xd8, 0xa1, 0x93, 0xed, 0x0b, 0x1c, 0xc4, 0x1c, 0x4f, 0x3e, - 0x08, 0x2a, 0x65, 0x56, 0xed, 0xbd, 0x13, 0xae, 0xc5, 0xb5, 0x55, 0x71, - 0xfd, 0xd1, 0x48, 0x89, 0x39, 0x32, 0xff, 0x25, 0xfd, 0xb2, 0x6e, 0xe5, - 0x2c, 0xab, 0x33, 0x86, 0x76, 0xf8, 0xb8, 0xf2, 0xea, 0x01, 0x93, 0x51, - 0xb4, 0x10, 0xc3, 0x96, 0xe4, 0xaf, 0xdd, 0xf9, 0xf0, 0xab, 0x97, 0xdf, - 0xd8, 0x79, 0xff, 0xa0, 0x77, 0x79, 0xf6, 0x88, 0x42, 0xb5, 0xad, 0x4a, - 0xc9, 0x3c, 0xa3, 0x75, 0x77, 0x02, 0xc4, 0x3d, 0xcf, 0xb0, 0xa4, 0x22, - 0x51, 0x07, 0x81, 0xc9, 0x53, 0xe5, 0x75, 0x53, 0x1b, 0x4d, 0xf2, 0x7c, - 0xca, 0x12, 0x34, 0x48, 0xeb, 0xcf, 0x37, 0x88, 0x16, 0x45, 0x5b, 0x28, - 0xe9, 0xb5, 0x2d, 0xb8, 0xe3, 0x09, 0xbd, 0x82, 0xc6, 0x78, 0x9c, 0x59, - 0x4b, 0xd3, 0xc5, 0xd0, 0x0b, 0x06, 0x82, 0xff, 0x80, 0xd0, 0x06, 0xb7, - 0xaa, 0x66, 0xe0, 0x33, 0x9f, 0x8f, 0xdf, 0x18, 0x8a, 0x05, 0x1b, 0xf6, - 0x8a, 0x86, 0x46, 0xb0, 0x94, 0xc2, 0x59, 0x9b, 0xb3, 0xa9, 0x15, 0x54, - 0xc1, 0x8f, 0xc5, 0x92, 0xf5, 0x29, 0xa5, 0x8b, 0xd0, 0xdf, 0x72, 0xc8, - 0x3b, 0x1a, 0xc2, 0xee, 0x83, 0x45, 0x54, 0x3d, 0x15, 0xf4, 0xf5, 0xb1, - 0x27, 0x18, 0x05, 0x7f, 0x50, 0xd8, 0x60, 0x1d, 0xeb, 0xd7, 0xbd, 0xe4, - 0x7e, 0x69, 0x33, 0xaf, 0x0a, 0x03, 0x49, 0x8c, 0x7f, 0x9a, 0x0c, 0x1a, - 0x32, 0x48, 0x4b, 0xfd, 0x69, 0x23, 0xa3, 0x03, 0xd5, 0x7f, 0xcb, 0x7f, - 0x99, 0x7d, 0x82, 0xe4, 0x08, 0xed, 0x07, 0x65, 0xf4, 0xfe, 0x78, 0x0c, - 0x19, 0xe8, 0x7f, 0xd0, 0x3e, 0xba, 0x91, 0x4f, 0x4b, 0x60, 0xca, 0x1a, - 0xdd, 0x66, 0x62, 0x0b, 0xa4, 0xbb, 0x46, 0x34, 0xb8, 0xd9, 0x67, 0xa7, - 0xf2, 0xa0, 0x37, 0xa1, 0x1a, 0x26, 0x28, 0x1f, 0x67, 0x43, 0xd8, 0xe2, - 0x30, 0x44, 0x39, 0x66, 0xa6, 0x8b, 0xee, 0xfd, 0x87, 0x80, 0x15, 0xe3, - 0xcd, 0xf4, 0xfa, 0xf2, 0x9e, 0x91, 0xb8, 0x2b, 0x48, 0x20, 0xb6, 0x0c, - 0xf8, 0x99, 0xeb, 0xd0, 0xb3, 0x06, 0x03, 0xcb, 0x9b, 0x9f, 0xf7, 0x9d, - 0x1b, 0x7b, 0x71, 0x4b, 0x3f, 0x65, 0xd6, 0x40, 0x42, 0x1f, 0x60, 0x4d, - 0xb3, 0x8a, 0x1c, 0xd2, 0x92, 0x67, 0x72, 0x49, 0xe9, 0x99, 0x6d, 0x2e, - 0x20, 0x1a, 0xaf, 0x8b, 0x57, 0x74, 0xce, 0xd8, 0x71, 0xd6, 0xa0, 0x16, - 0xd2, 0xe2, 0x0e, 0xac, 0x8c, 0xa5, 0xed, 0xdd, 0x43, 0x05, 0xbf, 0xf6, - 0x0a, 0x5e, 0x10, 0xfe, 0x99, 0x6a, 0xe6, 0x19, 0xb1, 0x9a, 0x82, 0xba, - 0x82, 0x19, 0x28, 0xfe, 0xe2, 0xd9, 0x77, 0x7f, 0x48, 0x61, 0xdb, 0xea, - 0x7a, 0xdb, 0xd2, 0xaf, 0xc5, 0x5d, 0x76, 0x40, 0xa1, 0x69, 0xca, 0x73, - 0x99, 0xfd, 0xff, 0xfb, 0xac, 0xc5, 0x9f, 0x4f, 0xce, 0x3a, 0x67, 0xa6, - 0x03, 0x85, 0xc0, 0x39, 0x91, 0x2a, 0x70, 0x8a, 0xea, 0x9c, 0xac, 0x84, - 0x16, 0x4a, 0x30, 0x86, 0xf7, 0x1e, 0x5f, 0x09, 0x00, 0x73, 0x9b, 0xbf, - 0xab, 0x74, 0x56, 0xdd, 0xd4, 0xc5, 0x3f, 0xfd, 0xa0, 0x02, 0xb0, 0xe2, - 0x23, 0x30, 0xeb, 0x0b, 0xfc, 0x0d, 0x82, 0xba, 0x4f, 0x2d, 0x60, 0x54, - 0xb7, 0xb4, 0x57, 0x5c, 0xaf, 0x32, 0xd6, 0xd4, 0x26, 0xec, 0xdd, 0x29, - 0xc7, 0xd3, 0x40, 0xd1, 0x64, 0xb4, 0xe7, 0x76, 0xbe, 0xf2, 0x75, 0x99, - 0x0c, 0xae, 0xb8, 0xa8, 0x41, 0x96, 0xce, 0x79, 0x24, 0x53, 0x9e, 0xbe, - 0xf8, 0xcc, 0xc9, 0xfc, 0x05, 0x39, 0xcf, 0x2e, 0xd1, 0xe1, 0xa7, 0x3e, - 0x65, 0x8f, 0x24, 0x31, 0xb1, 0xe0, 0xcd, 0x93, 0x0d, 0x33, 0x25, 0x5a, - 0x27, 0xf7, 0x90, 0x65, 0x20, 0x65, 0x51, 0xe0, 0x0a, 0x04, 0xa0, 0xea, - 0x5c, 0x72, 0xcd, 0x9a, 0x06, 0x0a, 0x1c, 0x9b, 0xc0, 0x71, 0x49, 0x49, - 0x42, 0x67, 0xe8, 0x41, 0x3c, 0x47, 0x1e, 0x52, 0xbc, 0x62, 0x81, 0x7f, - 0xc0, 0xa0, 0x78, 0xe6, 0xc9, 0xe1, 0x48, 0xa4, 0xe5, 0xad, 0xa8, 0x6d, - 0x76, 0x9a, 0x80, 0x94, 0x1d, 0x05, 0x43, 0xa1, 0x1d, 0x2b, 0x00, 0x26, - 0x95, 0x19, 0x14, 0xbd, 0xf2, 0x66, 0xe5, 0x40, 0xbc, 0x39, 0xfc, 0x7a, - 0x58, 0xec, 0x6d, 0x55, 0x22, 0xa8, 0x0c, 0x99, 0x33, 0xff, 0xde, 0x80, - 0x7d, 0xce, 0x1a, 0x58, 0xf7, 0x5e, 0x6d, 0xba, 0x7f, 0x57, 0x8b, 0x61, - 0x98, 0x39, 0x2d, 0x3f, 0x96, 0x41, 0x47, 0x39, 0x28, 0x63, 0x13, 0x13, - 0xe0, 0x0a, 0xa2, 0x75, 0x96, 0x53, 0x79, 0x32, 0x8c, 0xc1, 0xc9, 0xab, - 0x61, 0x17, 0x62, 0xba, 0xa2, 0x8c, 0x6f, 0x92, 0x9c, 0xec, 0xaa, 0xad, - 0x22, 0x9f, 0x35, 0xa5, 0x24, 0x0a, 0x90, 0xfb, 0x3c, 0xcb, 0x5f, 0x6d, - 0x11, 0x7d, 0x10, 0x17, 0x05, 0x43, 0x20, 0xe9, 0xe0, 0xab, 0x8b, 0x39, - 0xf8, 0x3a, 0x29, 0x2b, 0x7d, 0x20, 0xb9, 0x39, 0x9f, 0x5d, 0x65, 0xb8, - 0xea, 0x57, 0x5a, 0xe3, 0x79, 0xec, 0xe5, 0xdf, 0x20, 0x20, 0xb4, 0xd0, - 0xde, 0x89, 0xf1, 0x9d, 0xfc, 0xd7, 0x4e, 0xde, 0xf0, 0x94, 0xea, 0x9f, - 0x0e, 0x0c, 0xbf, 0xf4, 0x75, 0x71, 0xd7, 0x66, 0x68, 0x35, 0x8d, 0x37, - 0x78, 0x57, 0x89, 0x5e, 0x7c, 0x6f, 0x57, 0xdd, 0xd1, 0x76, 0x1d, 0xcc, - 0x74, 0x0c, 0x5d, 0xc1, 0x27, 0xd4, 0x42, 0xa1, 0x94, 0x33, 0x8b, 0xff, - 0x82, 0xec, 0xcf, 0x8c, 0x87, 0xeb, 0x57, 0x26, 0xbc, 0x85, 0xdf, 0x10, - 0x02, 0xb4, 0xfa, 0x28, 0x68, 0x2f, 0x2d, 0x46, 0x8c, 0x51, 0xfb, 0x44, - 0xe7, 0x9b, 0xd6, 0x51, 0xd6, 0x9e, 0x70, 0x14, 0xa9, 0x7c, 0x85, 0x6d, - 0x25, 0x08, 0x73, 0x00, 0x4a, 0x7f, 0x70, 0x83, 0x2a, 0xe9, 0x7e, 0xa3, - 0x96, 0xe1, 0x10, 0x07, 0x2a, 0x5b, 0x88, 0xb5, 0xe3, 0x67, 0xdb, 0x19, - 0x2c, 0xe7, 0x99, 0x4c, 0x80, 0x46, 0xda, 0x1c, 0xe3, 0xbb, 0xbe, 0x52, - 0x26, 0xc2, 0xd6, 0x34, 0x75, 0xf6, 0xeb, 0xff, 0x7c, 0x29, 0x76, 0xae, - 0xf8, 0x17, 0x1f, 0xcb, 0x8a, 0x7a, 0x03, 0x2e, 0x40, 0x8a, 0xec, 0xd2, - 0x04, 0xf4, 0xad, 0x58, 0x9c, 0x81, 0x28, 0x3b, 0x57, 0x89, 0xef, 0x43, - 0xfb, 0xf0, 0x76, 0xc7, 0xbe, 0x1b, 0x61, 0xb6, 0xed, 0xa1, 0x6a, 0xa3, - 0x04, 0x3a, 0xe1, 0x53, 0xe7, 0x6e, 0xd2, 0xe7, 0xe3, 0xbf, 0x93, 0xdb, - 0x66, 0xb4, 0xc9, 0x13, 0x0e, 0x96, 0x31, 0x70, 0xd9, 0xaf, 0xa7, 0x4a, - 0x2a, 0x30, 0xa1, 0xb1, 0x67, 0x1f, 0x13, 0x00, 0xf9, 0xbc, 0xd7, 0xc5, - 0x92, 0x93, 0x40, 0x30, 0xb1, 0xef, 0x25, 0x67, 0x37, 0x9f, 0x94, 0x43, - 0xdd, 0xe0, 0x51, 0xe6, 0x63, 0x45, 0x4b, 0x00, 0xdf, 0xfd, 0xfe, 0xe9, - 0xc6, 0xd8, 0xdd, 0x41, 0xa8, 0x3b, 0x1b, 0x18, 0xc6, 0x08, 0x19, 0x3d, - 0xc8, 0x8b, 0xd1, 0x30, 0x6b, 0x38, 0x26, 0x98, 0xec, 0x38, 0xc8, 0x33, - 0xb8, 0xd7, 0x28, 0xab, 0xfb, 0x2f, 0x5c, 0x17, 0x0f, 0x06, 0x5e, 0x41, - 0x33, 0x8f, 0x04, 0x22, 0x28, 0xe5, 0x80, 0x52, 0x23, 0x4a, 0xfb, 0x35, - 0x30, 0xaa, 0x0e, 0xfc, 0x8f, 0x51, 0x83, 0x8d, 0x73, 0xe2, 0xfa, 0x1f, - 0x94, 0x46, 0xc9, 0xd1, 0xdb, 0x67, 0x0a, 0xf6, 0x78, 0xde, 0x16, 0xa4, - 0xac, 0x78, 0x77, 0xe6, 0x79, 0x87, 0xac, 0x61, 0x6c, 0x0a, 0x6e, 0x5a, - 0x20, 0x03, 0x54, 0x1c, 0xf2, 0x0c, 0xdf, 0xcc, 0x84, 0x10, 0x4d, 0x0f, - 0xe4, 0x03, 0x3d, 0x9b, 0x83, 0xc4, 0xb1, 0x15, 0xb6, 0x3e, 0x71, 0x85, - 0xb4, 0xff, 0x2e, 0x0c, 0xb5, 0x7b, 0xfd, 0x47, 0x9f, 0xa7, 0x90, 0x82, - 0x9e, 0x01, 0x27, 0x5d, 0xc0, 0x56, 0x9d, 0x6c, 0x7a, 0x71, 0x40, 0xf1, - 0x6c, 0x36, 0x31, 0xc0, 0x3c, 0x72, 0xd7, 0x30, 0x58, 0x40, 0x7f, 0x4e, - 0xed, 0xd8, 0xf4, 0xcb, 0xa0, 0xf4, 0xb5, 0xe9, 0x58, 0x99, 0xd7, 0xbe, - 0x20, 0x43, 0xf0, 0xfd, 0x6e, 0xef, 0xa6, 0xc2, 0x2c, 0xba, 0x7a, 0xd2, - 0xa2, 0xc9, 0xb3, 0x1d, 0x9b, 0x30, 0x91, 0x70, 0x38, 0x25, 0xd9, 0x42, - 0xac, 0xc1, 0xb9, 0x66, 0x79, 0x37, 0x25, 0x3f, 0x72, 0xfe, 0x87, 0xa4, - 0xba, 0xae, 0x40, 0xdf, 0xa0, 0x03, 0xb6, 0xd8, 0xdb, 0xef, 0xcc, 0x5b, - 0x5c, 0xcc, 0xa4, 0x7a, 0x4f, 0x1b, 0x63, 0xb1, 0x12, 0x5e, 0x9b, 0xb0, - 0x74, 0x46, 0x20, 0xac, 0x0d, 0x42, 0xf6, 0x84, 0x58, 0x9c, 0x3d, 0x3f, - 0x98, 0xb3, 0x8d, 0xfe, 0xcc, 0xea, 0x08, 0xdc, 0xa3, 0xb6, 0x3a, 0x38, - 0x76, 0x2b, 0xef, 0x29, 0x19, 0x98, 0x79, 0xc7, 0x30, 0x9a, 0xd3, 0x17, - 0x46, 0xf2, 0x49, 0x9a, 0x30, 0x8e, 0xaa, 0xa3, 0x22, 0x65, 0xb6, 0x12, - 0xc2, 0xd6, 0x6a, 0x9a, 0xfd, 0xba, 0x90, 0x31, 0x82, 0x23, 0xcb, 0x13, - 0x71, 0x24, 0x51, 0xc4, 0xea, 0xce, 0xef, 0x7a, 0x47, 0x76, 0x0e, 0xdd, - 0xf5, 0x2a, 0x5b, 0x21, 0x6c, 0x6a, 0x61, 0x55, 0x6f, 0x0b, 0x0e, 0x4f, - 0x7d, 0x8a, 0x60, 0x21, 0x59, 0x15, 0x8a, 0x33, 0x87, 0x5c, 0x99, 0xce, - 0xc5, 0x5b, 0xb2, 0xbf, 0xd8, 0x9d, 0xfd, 0x51, 0xe9, 0xd4, 0xc6, 0xe2, - 0x91, 0x50, 0x8c, 0x49, 0xe4, 0x2f, 0xcf, 0x72, 0x25, 0xb6, 0xd5, 0xc5, - 0x3c, 0x1f, 0xd2, 0xa2, 0x5e, 0xc7, 0x00, 0xd3, 0xaf, 0xf2, 0xbe, 0x69, - 0x5b, 0x1d, 0x54, 0xfe, 0xc2, 0x3e, 0x81, 0xe4, 0x3d, 0x31, 0x46, 0xf4, - 0xb1, 0x88, 0x46, 0x33, 0xd0, 0xd6, 0x41, 0x54, 0x6a, 0x9e, 0x71, 0x8f, - 0x90, 0x43, 0xff, 0x42, 0x42, 0x70, 0x6f, 0xe3, 0x84, 0x4a, 0x85, 0x4e, - 0x5e, 0x6c, 0x15, 0x07, 0xc7, 0x95, 0x27, 0xc3, 0xc6, 0xff, 0x34, 0x47, - 0xec, 0xd0, 0x19, 0x9f, 0xb4, 0x64, 0x31, 0x60, 0x5e, 0x35, 0x5b, 0x24, - 0xb8, 0x4c, 0x39, 0xaa, 0x41, 0xd5, 0xba, 0x10, 0xab, 0x59, 0xa7, 0x8d, - 0x1c, 0x04, 0xf4, 0x84, 0xd9, 0x5a, 0xad, 0x63, 0x1b, 0xae, 0xd9, 0x7a, - 0xb7, 0x57, 0x93, 0x01, 0x06, 0x33, 0xc7, 0x62, 0x83, 0x13, 0x53, 0x18, - 0x14, 0x98, 0xde, 0x62, 0x80, 0xc7, 0x24, 0xf2, 0x6e, 0x34, 0xd3, 0x7f, - 0x53, 0xcb, 0x12, 0xca, 0x11, 0xef, 0xb9, 0xad, 0xbb, 0x5a, 0x23, 0x94, - 0xe8, 0xe5, 0x8c, 0x23, 0xe4, 0xa8, 0x76, 0x41, 0xc8, 0x9e, 0x5e, 0xad, - 0x89, 0xe5, 0xc0, 0xb2, 0x90, 0x14, 0xa6, 0xff, 0x5c, 0xe3, 0x36, 0xc3, - 0x68, 0x67, 0x51, 0xb4, 0x20, 0xe0, 0x42, 0x45, 0x99, 0x7c, 0xe7, 0xc8, - 0xde, 0x10, 0xce, 0x33, 0xf8, 0xad, 0x9f, 0xe2, 0x39, 0xb5, 0x7b, 0x9a, - 0xe7, 0xe7, 0xe6, 0xce, 0x13, 0xae, 0x19, 0x51, 0x53, 0xa8, 0x01, 0xb7, - 0x17, 0x6a, 0xbc, 0x4b, 0xe7, 0xdf, 0xef, 0xac, 0x7a, 0x0e, 0x2d, 0xd7, - 0x31, 0x35, 0x63, 0x73, 0x96, 0xb6, 0x05, 0xa6, 0x50, 0x9e, 0x2b, 0xd6, - 0x37, 0xd4, 0x37, 0x95, 0x0f, 0xbd, 0x13, 0x87, 0x2d, 0xd2, 0xf7, 0xd5, - 0xe6, 0x09, 0xb9, 0x9b, 0x5a, 0xc8, 0xb5, 0xc5, 0x7b, 0x38, 0x64, 0xc0, - 0x0a, 0x0c, 0xb5, 0xf5, 0x0f, 0x27, 0xdb, 0x07, 0xcc, 0x41, 0x58, 0x21, - 0x90, 0xeb, 0x74, 0x98, 0x50, 0x38, 0xe2, 0x45, 0x0e, 0xe6, 0x2b, 0xc4, - 0xf9, 0x53, 0x09, 0x11, 0x48, 0xee, 0xef, 0xe0, 0xd3, 0xb6, 0x80, 0x8a, - 0xd2, 0x7d, 0x0e, 0x5a, 0x2d, 0x68, 0x06, 0xf5, 0x6c, 0xf1, 0xe9, 0xaa, - 0x3d, 0xad, 0x4e, 0x1f, 0x69, 0x5a, 0xc7, 0x14, 0xa0, 0x4a, 0xdb, 0x30, - 0xe0, 0x7e, 0xed, 0xa6, 0xdc, 0xf8, 0xee, 0x6e, 0x9a, 0x25, 0xfe, 0xed, - 0x3f, 0xb4, 0xb0, 0x87, 0x69, 0x32, 0x34, 0x8f, 0x3b, 0x0e, 0xf9, 0xf8, - 0x00, 0x14, 0x56, 0x71, 0xda, 0x3f, 0x6b, 0xdc, 0x14, 0xed, 0x8b, 0x65, - 0x3b, 0x60, 0xc7, 0xd4, 0xd4, 0x44, 0xb7, 0x79, 0x9d, 0x0d, 0xa8, 0x5d, - 0xdf, 0x69, 0x86, 0x58, 0x70, 0xe8, 0x8d, 0x7a, 0x23, 0x0a, 0x80, 0x66, - 0x58, 0x86, 0x9d, 0xbe, 0xc0, 0x27, 0xa4, 0xb9, 0xe0, 0x7a, 0x73, 0x20, - 0x47, 0x0f, 0x09, 0xe1, 0x98, 0xf6, 0x2b, 0xc2, 0xd5, 0xec, 0x09, 0xa4, - 0x6c, 0x7b, 0x0b, 0xa4, 0x9c, 0x75, 0x51, 0x85, 0x0c, 0xd8, 0xba, 0xd6, - 0xac, 0x97, 0xcb, 0xcb, 0xd1, 0xb7, 0xa7, 0x39, 0x8a, 0x4b, 0x7d, 0xd8, - 0x3a, 0x36, 0xd9, 0x7a, 0xf0, 0x65, 0xcb, 0xcd, 0x6b, 0xcf, 0x4b, 0x5a, - 0xab, 0x29, 0x0c, 0x95, 0x7d, 0xc2, 0x42, 0x48, 0xcb, 0x83, 0x88, 0x37, - 0xeb, 0x6f, 0x99, 0x2f, 0xe3, 0xb3, 0x30, 0x72, 0x0b, 0x2e, 0x2c, 0x16, - 0xc3, 0x03, 0x6e, 0xe2, 0x52, 0x3d, 0x8d, 0x0b, 0x8a, 0x58, 0x26, 0xab, - 0x62, 0xa9, 0xb2, 0xcc, 0x3b, 0x47, 0x02, 0xde, 0xfe, 0x8f, 0x4c, 0xf5, - 0xd8, 0xcf, 0xaa, 0x92, 0x93, 0xe5, 0xee, 0x92, 0x3f, 0xf7, 0x24, 0xd5, - 0x5f, 0x95, 0xe3, 0x0b, 0x50, 0xfd, 0x78, 0x63, 0xa5, 0x74, 0xa7, 0x2e, - 0x2a, 0x62, 0xcd, 0xf9, 0x5a, 0xf0, 0xad, 0xc4, 0x01, 0x1d, 0x5d, 0xe1, - 0xc3, 0xef, 0x2f, 0xca, 0xe0, 0xf1, 0xb1, 0x38, 0xe9, 0x33, 0x18, 0x0c, - 0xc5, 0x53, 0x74, 0x6b, 0xf4, 0x0a, 0x5c, 0x4b, 0x84, 0x20, 0x2f, 0xc8, - 0x6a, 0x50, 0xc8, 0x2e, 0x01, 0xf0, 0x81, 0x26, 0xb8, 0x42, 0x24, 0xd3, - 0x32, 0xa4, 0x78, 0x22, 0x2e, 0xce, 0x0b, 0xab, 0x5d, 0x80, 0x7b, 0xc4, - 0xae, 0x9b, 0x5c, 0x3b, 0x77, 0x06, 0xcb, 0xda, 0xf7, 0xd0, 0xcb, 0xfb, - 0xff, 0x14, 0x2d, 0x5d, 0xa3, 0x07, 0x6c, 0xd6, 0x1a, 0xb5, 0xa7, 0x12, - 0x44, 0x45, 0xfd, 0x5c, 0xb8, 0x58, 0x3d, 0xd0, 0x41, 0xa9, 0x80, 0xbf, - 0xbc, 0x78, 0x7e, 0x6d, 0x20, 0xd6, 0x30, 0x9d, 0x08, 0x0e, 0x41, 0xba, - 0x93, 0x1e, 0xc9, 0xac, 0xb4, 0x90, 0x37, 0xe7, 0xa3, 0x88, 0xe5, 0x4d, - 0x3a, 0x50, 0xc9, 0x3b, 0x65, 0xa7, 0x4b, 0x70, 0x87, 0x89, 0x07, 0x48, - 0xd8, 0x0c, 0x91, 0x50, 0x5d, 0x6d, 0xcf, 0x34, 0x54, 0xc4, 0x8c, 0xe8, - 0x64, 0xcb, 0x4c, 0x42, 0xba, 0xb8, 0x2b, 0x9e, 0x49, 0x73, 0xc6, 0x54, - 0xc6, 0x1a, 0x0a, 0xac, 0x82, 0x5d, 0x44, 0x73, 0x77, 0xa4, 0x6a, 0x8d, - 0x84, 0x8b, 0x9b, 0xbb, 0xfe, 0x49, 0x5e, 0xf8, 0xaf, 0xa6, 0x44, 0x83, - 0x7c, 0x1b, 0x50, 0x1a, 0xd7, 0xd8, 0x08, 0xa1, 0xab, 0x66, 0x1e, 0x6e, - 0xa2, 0x48, 0xe5, 0x21, 0x78, 0xa5, 0xa2, 0x75, 0x78, 0xaf, 0x1a, 0x60, - 0x8a, 0x2c, 0x18, 0xc6, 0x68, 0xa9, 0x99, 0xd5, 0x45, 0x70, 0xfb, 0x67, - 0x4c, 0xca, 0x28, 0x8a, 0x3c, 0x37, 0xd8, 0x22, 0xca, 0x34, 0xb7, 0x10, - 0x4a, 0x3f, 0x88, 0x9d, 0x63, 0x77, 0xcf, 0x04, 0x9b, 0xd1, 0xe5, 0x22, - 0x06, 0x92, 0x80, 0x45, 0x0c, 0x82, 0xd8, 0xe2, 0xb7, 0xfb, 0x39, 0xbc, - 0x33, 0xd2, 0xbf, 0x6b, 0x67, 0xbf, 0x33, 0x52, 0x56, 0x77, 0x9b, 0x50, - 0xbe, 0x89, 0xb1, 0x8d, 0x26, 0x36, 0x11, 0xc9, 0x4c, 0xcd, 0xd4, 0x8b, - 0xac, 0x96, 0x8c, 0xab, 0x45, 0xd5, 0x8d, 0xc4, 0xd3, 0x03, 0x3a, 0xcf, - 0x10, 0x1c, 0x05, 0x7d, 0xad, 0xfe, 0x0f, 0x76, 0x66, 0xf7, 0x0b, 0xdf, - 0x0f, 0xa6, 0x42, 0xd5, 0x1b, 0x08, 0x03, 0x73, 0x09, 0x59, 0x8f, 0x43, - 0x35, 0xa7, 0x80, 0x46, 0x6d, 0x03, 0xe0, 0x32, 0xf2, 0x45, 0xfa, 0xf5, - 0x13, 0xd9, 0x4e, 0x5b, 0x64, 0xd5, 0x4d, 0x0e, 0xde, 0xf5, 0xbe, 0x62, - 0x85, 0x8d, 0x42, 0x7f, 0x4b, 0x5e, 0x15, 0xee, 0x9a, 0xba, 0x16, 0x6b, - 0x14, 0x9b, 0x29, 0xdb, 0xe9, 0xa0, 0xf4, 0xa2, 0xe1, 0xd0, 0xeb, 0x74, - 0xfa, 0x32, 0xd2, 0xd4, 0xfe, 0xdc, 0xc2, 0x6b, 0xcb, 0xf3, 0xd4, 0x84, - 0x3a, 0xd7, 0x9f, 0xcc, 0x3c, 0x79, 0x9c, 0x0b, 0xae, 0x48, 0x3d, 0xeb, - 0x6a, 0x29, 0x2e, 0x1e, 0xeb, 0x4d, 0x20, 0x27, 0x08, 0xdf, 0xc9, 0xce, - 0x8b, 0x05, 0x58, 0xf9, 0x66, 0x88, 0x5f, 0x58, 0x3b, 0xc7, 0x58, 0xd9, - 0x8f, 0xd8, 0xdf, 0x10, 0x2f, 0x01, 0xb9, 0x3e, 0x51, 0xbb, 0x79, 0xc3, - 0x29, 0xa0, 0xbd, 0xfa, 0x2a, 0x24, 0xab, 0x20, 0x33, 0x9b, 0xcf, 0x2f, - 0x5c, 0x36, 0x15, 0x53, 0x49, 0xea, 0x9b, 0xe0, 0x01, 0xe9, 0x0f, 0x7a, - 0xd9, 0xdb, 0x71, 0x7b, 0x39, 0x31, 0x06, 0x13, 0xa7, 0x79, 0x75, 0x6e, - 0x4f, 0x70, 0xc4, 0xd1, 0x2c, 0xd6, 0xf1, 0x69, 0xf8, 0x76, 0x1e, 0x2b, - 0x25, 0x16, 0x0d, 0x93, 0x05, 0x95, 0xde, 0x55, 0x6f, 0x99, 0x07, 0xfc, - 0xe4, 0x1e, 0xd5, 0x88, 0x5d, 0xb2, 0x54, 0x56, 0x7e, 0xf8, 0x3e, 0x05, - 0x3f, 0x81, 0xb3, 0xf7, 0x2a, 0xfc, 0xe4, 0x75, 0x12, 0x47, 0x9a, 0x71, - 0x74, 0x41, 0x43, 0x8e, 0xc7, 0xa9, 0x65, 0x89, 0xaf, 0x42, 0x2d, 0x08, - 0x06, 0x4a, 0x68, 0x94, 0x6a, 0xdb, 0x07, 0x86, 0xc8, 0x8d, 0x3c, 0x70, - 0x0a, 0x03, 0x39, 0x9e, 0x0f, 0x8a, 0x80, 0x6d, 0x68, 0xca, 0x91, 0xce, - 0x5f, 0x6d, 0x22, 0x9c, 0xa0, 0xe4, 0x1e, 0xce, 0x06, 0x6a, 0x32, 0xba, - 0x79, 0xdf, 0x9a, 0xc5, 0xf1, 0xf3, 0x35, 0x30, 0x22, 0x77, 0xcd, 0x10, - 0x53, 0x6d, 0x80, 0x3b, 0x36, 0x7b, 0x25, 0x20, 0x07, 0x78, 0x67, 0xbe, - 0xc1, 0x6c, 0x93, 0x8c, 0xe6, 0x79, 0x00, 0x0e, 0x50, 0x8e, 0x80, 0xcc, - 0x82, 0xb0, 0x75, 0x86, 0x8e, 0x2b, 0x72, 0x58, 0xc4, 0x68, 0x7b, 0x42, - 0xea, 0x2c, 0x8b, 0x1b, 0x9f, 0x15, 0xda, 0x8d, 0x39, 0x6b, 0x17, 0x8d, - 0x93, 0x36, 0xfd, 0xdd, 0xbb, 0x79, 0x33, 0xc9, 0xf2, 0x94, 0x13, 0x79, - 0x79, 0x2c, 0x7a, 0x87, 0x73, 0xcd, 0xd9, 0x31, 0xe8, 0x1a, 0x68, 0x38, - 0x0b, 0x1c, 0x2e, 0x3b, 0xcb, 0xa8, 0x64, 0x9e, 0x78, 0x35, 0x06, 0xdb, - 0xcf, 0x56, 0x9f, 0xcf, 0x8b, 0x1d, 0x7b, 0xe6, 0x1e, 0xa4, 0x78, 0xb1, - 0x31, 0x78, 0x9f, 0x3e, 0x58, 0xbe, 0xd3, 0x17, 0x6c, 0x29, 0x31, 0x85, - 0x28, 0x86, 0xc5, 0x5d, 0x8c, 0xb2, 0x04, 0x5a, 0x57, 0xf2, 0xec, 0x69, - 0x88, 0x4b, 0x1e, 0x3c, 0xab, 0x8e, 0x1c, 0x82, 0x97, 0x7a, 0xa4, 0x86, - 0xe1, 0x28, 0xd2, 0x4c, 0x18, 0x70, 0x23, 0x6d, 0x09, 0x96, 0x11, 0x24, - 0x5b, 0x59, 0xd2, 0x81, 0x59, 0x3f, 0x84, 0xe3, 0x13, 0xe7, 0x2f, 0xd0, - 0xdc, 0x00, 0xb8, 0x56, 0x1f, 0x55, 0xa9, 0x68, 0x9e, 0x63, 0xbd, 0x79, - 0xa4, 0x88, 0x82, 0x5f, 0x41, 0xf0, 0xc1, 0x37, 0xef, 0x57, 0xf2, 0x08, - 0x57, 0x61, 0x27, 0x4f, 0x6e, 0x0e, 0xa0, 0xc4, 0x65, 0x6c, 0xd9, 0x57, - 0xc4, 0xe5, 0xd5, 0x2f, 0x3b, 0x29, 0xcc, 0x86, 0xe1, 0x6e, 0xd7, 0xc3, - 0xd4, 0x78, 0x34, 0x9c, 0x36, 0xbc, 0xa9, 0xf6, 0x33, 0xcd, 0xa5, 0xac, - 0x1f, 0x43, 0x97, 0x8c, 0x5e, 0x5d, 0x98, 0x76, 0xa0, 0xd7, 0x99, 0xbe, - 0x86, 0xf4, 0x12, 0xf6, 0x08, 0x22, 0x51, 0x06, 0x7d, 0x74, 0x1b, 0x9a, - 0x63, 0x76, 0xd7, 0x8b, 0xc3, 0x47, 0x87, 0x57, 0x44, 0x7a, 0xc5, 0xc7, - 0x88, 0x49, 0x2d, 0xf6, 0x81, 0x25, 0x6d, 0x04, 0x61, 0xe0, 0xdf, 0x1d, - 0xa3, 0x15, 0xbd, 0x79, 0xa5, 0x6e, 0x6d, 0x66, 0x56, 0x2d, 0x69, 0xf7, - 0xc8, 0x04, 0x6d, 0xa1, 0xaf, 0x61, 0x87, 0x76, 0x1d, 0xf7, 0x5e, 0xe1, - 0xac, 0x73, 0xba, 0x3c, 0xda, 0xcd, 0x8c, 0xe3, 0x99, 0x59, 0x05, 0xb9, - 0xa2, 0x1f, 0xa0, 0x49, 0xc9, 0x9e, 0x1e, 0x97, 0xa3, 0x56, 0xaf, 0x4c, - 0x2d, 0xc5, 0xfb, 0x35, 0x9a, 0x93, 0x9e, 0x1c, 0xa8, 0x71, 0x86, 0x9d, - 0x31, 0x34, 0x34, 0x83, 0xcf, 0xc3, 0xf5, 0xde, 0xd0, 0x6a, 0x01, 0xc5, - 0x05, 0x44, 0x58, 0xe3, 0xf5, 0xa7, 0xc7, 0xf5, 0x13, 0x19, 0x4d, 0xaa, - 0x82, 0x13, 0x78, 0xc8, 0xf4, 0xfb, 0x95, 0x72, 0x8d, 0x27, 0x0c, 0x1f, - 0x07, 0x3f, 0x2a, 0x1b, 0xae, 0xa1, 0x3b, 0xa6, 0x9d, 0xf9, 0x15, 0xe1, - 0x0f, 0x07, 0xb2, 0x6e, 0x63, 0x4d, 0x2d, 0x7f, 0xa0, 0xea, 0x97, 0x59, - 0xae, 0xcb, 0xa0, 0xfc, 0x0a, 0xb5, 0x5b, 0xc9, 0xec, 0x26, 0x97, 0x01, - 0x46, 0x86, 0x18, 0xfd, 0x0a, 0x5f, 0x59, 0x8b, 0xb5, 0x3a, 0x09, 0x35, - 0x16, 0xa1, 0x94, 0x48, 0x15, 0x67, 0x07, 0xdd, 0x44, 0x21, 0x65, 0x02, - 0xb0, 0x44, 0x63, 0x73, 0xb9, 0x91, 0x78, 0x49, 0x3f, 0xd8, 0x9f, 0x78, - 0x4d, 0x44, 0xfc, 0x3d, 0x41, 0xd1, 0x51, 0x51, 0x3d, 0x1a, 0x5f, 0xf5, - 0x39, 0x6c, 0x15, 0xf4, 0xff, 0xae, 0xe0, 0xa8, 0x37, 0x20, 0x34, 0x44, - 0x0e, 0x5a, 0x49, 0x17, 0x8c, 0x6e, 0xa7, 0xd3, 0x30, 0xb7, 0x40, 0xf8, - 0xf9, 0xb1, 0x52, 0xe5, 0x0e, 0x80, 0x62, 0xfb, 0x89, 0x2b, 0xb6, 0xcd, - 0xfc, 0xc5, 0x31, 0xd0, 0x2a, 0xa5, 0x6b, 0x68, 0x62, 0xf9, 0x09, 0xda, - 0x46, 0x4a, 0x06, 0x1b, 0x8d, 0xba, 0x25, 0x46, 0x1f, 0x2b, 0x3f, 0xa0, - 0x6c, 0xa9, 0x06, 0x39, 0x49, 0x3b, 0xb2, 0x29, 0x4a, 0x93, 0x4d, 0xd7, - 0x22, 0x0c, 0xa3, 0x95, 0xe5, 0xd9, 0x1e, 0x4e, 0x24, 0x8c, 0x3e, 0xd8, - 0xaf, 0xe6, 0x9b, 0xed, 0x57, 0x90, 0x63, 0x6c, 0x20, 0x78, 0xaf, 0xee, - 0x0a, 0x7d, 0x59, 0x72, 0x55, 0xb7, 0xc2, 0x4e, 0xbb, 0xc2, 0x17, 0x44, - 0x56, 0x51, 0x5a, 0x84, 0xf9, 0x24, 0xb0, 0x08, 0x95, 0xf1, 0x4c, 0x59, - 0xdc, 0xd1, 0xd4, 0x5a, 0x10, 0xce, 0x96, 0x11, 0x62, 0x51, 0xe2, 0xa8, - 0x47, 0x53, 0x63, 0x68, 0x6b, 0x87, 0xd6, 0xb8, 0x59, 0xd2, 0x53, 0x5e, - 0x90, 0x86, 0xfc, 0x45, 0xa9, 0x95, 0x55, 0x8f, 0x72, 0x2b, 0x40, 0x2f, - 0x76, 0x7c, 0xa5, 0x97, 0xf4, 0x05, 0x97, 0x77, 0x43, 0x5c, 0x1e, 0x3e, - 0x20, 0xc0, 0x9c, 0x5c, 0x12, 0x3d, 0xc2, 0xbc, 0xfe, 0x43, 0x96, 0xe0, - 0xb3, 0x3e, 0x0a, 0x17, 0x85, 0xe3, 0xb6, 0xfa, 0x26, 0xbb, 0x61, 0x74, - 0x4e, 0x2d, 0x90, 0xa4, 0xd1, 0xdb, 0xe2, 0xdd, 0xdc, 0x47, 0xfa, 0x21, - 0xbc, 0x01, 0x3b, 0x8d, 0xf2, 0x51, 0x6f, 0x0e, 0x7d, 0x32, 0xfc, 0x01, - 0x0b, 0xc5, 0x0a, 0xbd, 0xea, 0xe3, 0x3b, 0xe9, 0x92, 0x17, 0x50, 0x47, - 0xc8, 0x4b, 0x3c, 0x90, 0xb5, 0x93, 0xe6, 0x2c, 0x02, 0x8f, 0xc9, 0xae, - 0x7f, 0xaf, 0x92, 0x6a, 0x05, 0x30, 0x70, 0xf0, 0x42, 0x11, 0x6c, 0xa3, - 0x53, 0x35, 0x19, 0x85, 0x54, 0x82, 0x30, 0xe9, 0x8c, 0x8e, 0xe6, 0xcf, - 0x88, 0x54, 0x09, 0xab, 0x51, 0x5d, 0xeb, 0x1a, 0xcb, 0x06, 0xab, 0x7b, - 0x98, 0x56, 0x78, 0xb5, 0xe7, 0x2f, 0xec, 0x23, 0xed, 0xae, 0xa8, 0xc5, - 0x28, 0xd6, 0xdb, 0x4e, 0xa1, 0xf8, 0x6b, 0xb5, 0x05, 0xfa, 0x03, 0x7b, - 0xe2, 0xb3, 0x3a, 0x00, 0x5c, 0x15, 0xad, 0x38, 0x11, 0x45, 0xc8, 0x6d, - 0x3c, 0x1b, 0x28, 0x8c, 0x4d, 0x81, 0xf0, 0x8c, 0x63, 0x4a, 0xe0, 0xac, - 0x49, 0x55, 0xab, 0x09, 0x1d, 0x86, 0x1e, 0x38, 0x02, 0xc1, 0xe4, 0x53, - 0xb0, 0x78, 0xb7, 0x4d, 0x00, 0xd7, 0xe7, 0x71, 0x00, 0x62, 0x48, 0xea, - 0x6d, 0x22, 0x8f, 0x6a, 0x80, 0x24, 0x53, 0xfa, 0xf6, 0x36, 0xee, 0xa8, - 0xa6, 0xb6, 0x86, 0xb5, 0x34, 0x4e, 0x05, 0xfc, 0x64, 0xce, 0x40, 0xb4, - 0xd6, 0xdc, 0xa0, 0x26, 0xb5, 0xbb, 0xdb, 0xda, 0x54, 0x19, 0x55, 0x02, - 0xaf, 0x75, 0x72, 0x5d, 0x5a, 0x6c, 0xd8, 0x9b, 0x09, 0x30, 0x3e, 0x6c, - 0x5e, 0x7d, 0x45, 0xe1, 0x57, 0xf3, 0xcd, 0x60, 0xf9, 0x2f, 0x09, 0x53, - 0x01, 0x08, 0x03, 0x92, 0xeb, 0xce, 0x65, 0xf2, 0xab, 0x44, 0x30, 0x26, - 0x4f, 0xe2, 0x02, 0xed, 0xea, 0x79, 0xbf, 0x9e, 0x7e, 0x2e, 0x53, 0x2d, - 0x88, 0xf8, 0xaa, 0x38, 0x08, 0x2f, 0x18, 0x3b, 0x32, 0x84, 0xb8, 0x3f, - 0xa7, 0xb4, 0x3d, 0x64, 0xed, 0x21, 0x5b, 0x16, 0xae, 0x1f, 0x7d, 0x9a, - 0x06, 0xd8, 0xed, 0x58, 0x09, 0x17, 0x5b, 0x11, 0x7c, 0x3a, 0x82, 0xbd, - 0x3a, 0x4c, 0x8f, 0x3f, 0x4f, 0x04, 0x54, 0x95, 0x7c, 0xd4, 0x53, 0x3f, - 0xb7, 0xdd, 0x45, 0x86, 0x78, 0xd0, 0xbe, 0xb1, 0x30, 0x4b, 0x1d, 0x76, - 0x2e, 0xcb, 0x68, 0xfa, 0x7c, 0x25, 0x76, 0x0c, 0x05, 0x16, 0xc1, 0xc2, - 0xa6, 0x9d, 0x87, 0x3a, 0xdb, 0x2d, 0x1f, 0x40, 0x61, 0x10, 0x95, 0x19, - 0xc1, 0x51, 0xc4, 0x1f, 0x03, 0x84, 0x84, 0x5f, 0x9f, 0x88, 0xa6, 0x8c, - 0xc2, 0xf0, 0x30, 0x0a, 0xd0, 0x15, 0x88, 0x81, 0xb0, 0x70, 0x48, 0x85, - 0x25, 0xe0, 0x2a, 0xd8, 0x08, 0x72, 0x2e, 0xdf, 0x1d, 0xca, 0xc6, 0x6f, - 0x17, 0xf8, 0xd9, 0x3a, 0x3d, 0xfc, 0x9f, 0x4b, 0x0e, 0xf5, 0x53, 0x09, - 0xc4, 0x4b, 0x6d, 0xfe, 0x67, 0x27, 0x20, 0x8e, 0xe6, 0x40, 0xaf, 0x56, - 0xe7, 0x48, 0xef, 0x4f, 0x29, 0x12, 0x92, 0x32, 0xb4, 0xe4, 0x54, 0xd2, - 0x6d, 0x22, 0xca, 0x97, 0xb5, 0x64, 0x6d, 0x75, 0xdb, 0xbd, 0xb4, 0x24, - 0xe0, 0xac, 0x2d, 0x01, 0xb6, 0x57, 0x55, 0xc2, 0x2d, 0xb2, 0x2d, 0x2b, - 0xc6, 0x9a, 0xc7, 0xa0, 0x9a, 0xc7, 0xad, 0x49, 0x19, 0x8a, 0x53, 0xdf, - 0x58, 0x89, 0x90, 0xfe, 0xcd, 0xeb, 0x69, 0xdf, 0x3f, 0x0f, 0xf4, 0xb9, - 0xd1, 0xb1, 0x33, 0x10, 0x25, 0xd7, 0x4e, 0xbf, 0xd7, 0x0b, 0xc0, 0x6e, - 0x76, 0x3b, 0x54, 0xd5, 0xea, 0xef, 0x5d, 0x19, 0x42, 0xb5, 0xed, 0x88, - 0x15, 0x52, 0x10, 0x68, 0x44, 0x58, 0xdf, 0x47, 0x32, 0xc1, 0xcb, 0x42, - 0x26, 0x22, 0x71, 0x18, 0xac, 0x7b, 0xb7, 0x2b, 0x05, 0xd7, 0x56, 0x97, - 0x4f, 0xf0, 0xff, 0x68, 0xc8, 0x5a, 0x58, 0x44, 0x4c, 0xb7, 0xcd, 0x8d, - 0x13, 0x7d, 0xd2, 0xa1, 0x7c, 0x47, 0xc9, 0x18, 0x82, 0xca, 0x6b, 0xe1, - 0x15, 0xf7, 0xcb, 0x75, 0x0e, 0xd8, 0x19, 0x75, 0x5c, 0x38, 0x89, 0xa4, - 0xe7, 0x54, 0xb6, 0x83, 0xcc, 0xbe, 0x7d, 0x08, 0x34, 0xdc, 0x6f, 0xab, - 0x2c, 0x6c, 0x83, 0xa8, 0xf9, 0x60, 0x48, 0x06, 0x74, 0x9a, 0x3f, 0x43, - 0x23, 0xb7, 0xe2, 0x8f, 0x78, 0x2b, 0xb4, 0x0b, 0xe1, 0x38, 0xfc, 0xe0, - 0x23, 0x59, 0x2a, 0xe1, 0xbd, 0x6f, 0x39, 0x22, 0xaf, 0x1e, 0x42, 0xb7, - 0x9c, 0x92, 0x20, 0xb7, 0x27, 0x8c, 0xf6, 0xb5, 0xc4, 0x77, 0x9d, 0x7b, - 0xd5, 0x36, 0xee, 0x45, 0x10, 0x64, 0xab, 0x4f, 0x77, 0x41, 0xe3, 0x0e, - 0xa7, 0x6e, 0x2e, 0x7b, 0x9a, 0xc0, 0xeb, 0x20, 0xb0, 0xe6, 0xe8, 0xff, - 0xca, 0x26, 0xfd, 0xe8, 0xa5, 0x72, 0xdf, 0x6f, 0xca, 0x98, 0xac, 0xd4, - 0xb9, 0xdc, 0x29, 0xe5, 0xb7, 0x56, 0xb9, 0x35, 0x36, 0x1d, 0x0b, 0xae, - 0xaa, 0x09, 0x35, 0xc2, 0x3f, 0xf4, 0x83, 0xa2, 0xeb, 0xaf, 0x2f, 0xb7, - 0x85, 0x63, 0x49, 0x76, 0x9b, 0xab, 0x7b, 0x9f, 0x79, 0xdd, 0x65, 0x42, - 0x40, 0x76, 0xba, 0xd1, 0x28, 0x1e, 0x68, 0xc9, 0x0e, 0xc7, 0x55, 0x2b, - 0x76, 0x86, 0xd8, 0xd0, 0x40, 0x07, 0xf4, 0x44, 0x46, 0x41, 0xaf, 0x0e, - 0xb2, 0x29, 0x3d, 0x0c, 0x4b, 0x1d, 0xc5, 0xb1, 0xbb, 0x29, 0x1a, 0x4b, - 0xb8, 0xda, 0x47, 0x6e, 0xf8, 0x25, 0x7d, 0x99, 0x5a, 0x4b, 0xff, 0x77, - 0xf4, 0xe6, 0x3a, 0x79, 0x35, 0x04, 0x3e, 0x06, 0xdb, 0x90, 0xbc, 0x02, - 0x9a, 0x4e, 0x70, 0x4c, 0xed, 0x49, 0x96, 0x0d, 0x6a, 0x08, 0xf1, 0x34, - 0x15, 0xd0, 0x25, 0x89, 0xe8, 0x79, 0x2c, 0x9d, 0xa7, 0x46, 0xe4, 0x08, - 0x63, 0xb2, 0x33, 0xb4, 0x4e, 0x00, 0xfb, 0x8d, 0xa4, 0x20, 0xc8, 0x29, - 0x94, 0x89, 0xfb, 0xd3, 0x77, 0xe2, 0xb6, 0xa9, 0xed, 0x36, 0xbd, 0xcf, - 0x3c, 0x97, 0x99, 0x08, 0xd2, 0xb5, 0xd9, 0x9e, 0x33, 0x8c, 0x72, 0xb6, - 0x82, 0x09, 0xb2, 0x96, 0xc8, 0x85, 0x94, 0x42, 0x90, 0xdd, 0x69, 0x06, - 0xfb, 0x40, 0xa6, 0x32, 0x43, 0x5f, 0xec, 0xaa, 0x4c, 0x96, 0x26, 0x0e, - 0xb0, 0x68, 0x52, 0x19, 0x8f, 0x1b, 0x6f, 0x9e, 0xa7, 0x28, 0x6f, 0xac, - 0x9a, 0xca, 0x06, 0xa6, 0x41, 0x9d, 0xe8, 0x59, 0x9f, 0x73, 0x75, 0xc8, - 0xde, 0x23, 0xe8, 0x44, 0xc7, 0xe8, 0x65, 0x1c, 0x2f, 0xbe, 0xbc, 0x33, - 0xdb, 0xc7, 0xe0, 0x04, 0x06, 0x45, 0x6e, 0x53, 0xca, 0x39, 0xec, 0x4d, - 0x9f, 0x0e, 0x2c, 0xd6, 0x69, 0x8c, 0x73, 0xa4, 0x19, 0xdb, 0x67, 0xb4, - 0x68, 0x2a, 0xb7, 0x4b, 0x63, 0xa1, 0x86, 0x4f, 0x6a, 0x48, 0x9d, 0xe4, - 0x5c, 0x99, 0x91, 0x83, 0xf3, 0x87, 0xca, 0x79, 0x1a, 0xfd, 0x16, 0x1d, - 0x66, 0x13, 0x2c, 0x19, 0x17, 0xed, 0x10, 0x0c, 0xcf, 0xbf, 0x7d, 0x17, - 0x92, 0xbc, 0xda, 0x6d, 0x2b, 0xde, 0x1e, 0xca, 0x4c, 0x56, 0x32, 0xaf, - 0x5d, 0x19, 0x64, 0x95, 0xbd, 0x96, 0x15, 0x6e, 0x6e, 0x98, 0x60, 0x62, - 0xe9, 0x57, 0xeb, 0xa1, 0x30, 0xe8, 0x9c, 0x29, 0x90, 0x9d, 0x4d, 0xff, - 0xaa, 0x2c, 0x23, 0xe2, 0x16, 0x27, 0xec, 0xac, 0x04, 0xbb, 0x7b, 0x3a, - 0xce, 0x54, 0x56, 0x19, 0x82, 0xe6, 0xdd, 0x04, 0x2b, 0xcc, 0x89, 0xda, - 0xd3, 0xc0, 0x16, 0xd4, 0x67, 0x75, 0x56, 0xd4, 0x2f, 0x85, 0x53, 0x46, - 0xc1, 0xc9, 0x8c, 0x4c, 0x1c, 0x87, 0xaa, 0xbf, 0x5e, 0x1c, 0x58, 0x19, - 0x2c, 0x9c, 0xc4, 0x5c, 0x0a, 0x31, 0x09, 0x84, 0x84, 0x8c, 0x8c, 0x66, - 0xf5, 0x67, 0x40, 0x91, 0x2c, 0xd2, 0x38, 0x21, 0x34, 0xa0, 0x82, 0xd6, - 0x33, 0x7b, 0x43, 0x4f, 0xb6, 0x3e, 0x37, 0xe7, 0x38, 0x41, 0xdd, 0x0f, - 0xd6, 0x54, 0x52, 0x0c, 0x61, 0x01, 0xff, 0x34, 0x51, 0x85, 0xfc, 0x51, - 0x27, 0x95, 0x09, 0xdb, 0x56, 0xaa, 0x0e, 0xcb, 0x39, 0x5b, 0xc2, 0xa8, - 0x49, 0xce, 0xda, 0x04, 0x5e, 0x7e, 0x08, 0x74, 0x55, 0x78, 0xcc, 0x29, - 0xa6, 0x8f, 0x54, 0x87, 0x02, 0xc9, 0x47, 0x52, 0x26, 0xc0, 0x48, 0x98, - 0x2d, 0x19, 0x89, 0x63, 0xa8, 0xe5, 0x66, 0xdd, 0x6b, 0x1e, 0x19, 0x52, - 0xc2, 0xc3, 0xa1, 0x90, 0xc5, 0x96, 0x59, 0xc1, 0x38, 0x96, 0x1b, 0x01, - 0xf0, 0xf7, 0x91, 0x03, 0x96, 0x12, 0x79, 0x9f, 0x68, 0xb7, 0xbf, 0xbe, - 0x7f, 0x3b, 0x6e, 0x01, 0x6b, 0xac, 0xc6, 0x92, 0x5b, 0x31, 0x80, 0xb7, - 0x46, 0xc1, 0x4f, 0xf7, 0x40, 0x16, 0xde, 0x0c, 0xf2, 0x20, 0x71, 0x40, - 0xbc, 0x96, 0xab, 0xb9, 0xf2, 0xe8, 0x4a, 0xb5, 0x36, 0x1b, 0x44, 0xe8, - 0xfd, 0x78, 0xb5, 0x76, 0xf1, 0x49, 0x72, 0xc2, 0xbb, 0x2f, 0xd0, 0xb1, - 0xac, 0x60, 0x4b, 0xca, 0xaa, 0x25, 0x6b, 0x8c, 0xc2, 0x77, 0xea, 0x44, - 0xb1, 0x08, 0xc7, 0x63, 0x3a, 0x50, 0x4f, 0xd8, 0x64, 0xc0, 0xb0, 0x71, - 0x7a, 0x3f, 0x21, 0xb9, 0x9c, 0x64, 0x2f, 0x0b, 0x1a, 0x2c, 0x45, 0x1f, - 0xb9, 0x7b, 0xa0, 0x77, 0xdf, 0x1f, 0xa2, 0xd0, 0x92, 0xc2, 0xb4, 0x4d, - 0x02, 0x66, 0x0f, 0x96, 0x99, 0x8d, 0xb3, 0x11, 0x38, 0xbb, 0x3b, 0x81, - 0xa9, 0x8d, 0x84, 0xea, 0x2a, 0xf3, 0x82, 0x41, 0xe5, 0xb3, 0x51, 0x73, - 0xa8, 0x6a, 0x47, 0xd7, 0x12, 0x7d, 0x2f, 0x9d, 0x9b, 0xe0, 0x7a, 0xbc, - 0xc0, 0xe2, 0x8a, 0x24, 0x98, 0x24, 0xb5, 0xd5, 0x0c, 0x0f, 0x48, 0x6c, - 0x23, 0xfb, 0x3f, 0xfd, 0xf6, 0x30, 0x40, 0xc0, 0xb8, 0xc3, 0x45, 0xe2, - 0xdc, 0x85, 0x47, 0xa0, 0x45, 0xd5, 0xc8, 0x80, 0xf1, 0xb9, 0x6a, 0xa8, - 0x03, 0x52, 0xbb, 0xe3, 0xdb, 0x8a, 0x48, 0x9d, 0xef, 0x9c, 0x6e, 0x60, - 0x05, 0xe7, 0x70, 0x76, 0x09, 0x6a, 0x6e, 0x0d, 0x17, 0xfc, 0x7b, 0xe7, - 0xfe, 0x05, 0x6f, 0x6b, 0x1e, 0xa1, 0xd1, 0xa7, 0xb9, 0x1b, 0xa0, 0x3b, - 0x45, 0x94, 0xfa, 0xe6, 0x46, 0x5c, 0xab, 0xbb, 0x2c, 0x02, 0x77, 0xec, - 0xf5, 0xd7, 0x00, 0xc8, 0x8b, 0x3b, 0xc5, 0xde, 0x7c, 0x2e, 0x16, 0x9f, - 0xb1, 0xc1, 0xa2, 0xdb, 0xa6, 0xc3, 0x4e, 0xd8, 0x2f, 0xfa, 0x9e, 0x51, - 0xcb, 0x19, 0xb0, 0xd6, 0x42, 0xf4, 0xad, 0x8e, 0x04, 0xce, 0x91, 0x20, - 0x84, 0x27, 0xc1, 0x0f, 0x6f, 0x7c, 0x2f, 0x18, 0x86, 0x43, 0x5a, 0xb8, - 0xfc, 0x26, 0x39, 0x51, 0xe0, 0xae, 0x5f, 0xed, 0x1d, 0x58, 0x7c, 0xb1, - 0x5f, 0x20, 0xed, 0x79, 0xdc, 0x5b, 0xb8, 0xf2, 0xf9, 0x62, 0x12, 0x25, - 0x07, 0x87, 0x39, 0xeb, 0xd6, 0xa0, 0xf2, 0x42, 0x93, 0xe7, 0x47, 0xde, - 0x0a, 0x72, 0x3d, 0x67, 0xff, 0xfc, 0xc0, 0x16, 0xa5, 0x01, 0x73, 0x66, - 0x9d, 0xb2, 0x7c, 0x02, 0xb6, 0xfc, 0x77, 0x90, 0xfd, 0x8e, 0x40, 0x97, - 0xb4, 0x1c, 0x87, 0xe1, 0xc4, 0xdb, 0xe3, 0x9f, 0xcf, 0x35, 0x73, 0x46, - 0xef, 0xd5, 0xc4, 0xc2, 0xb2, 0x91, 0x79, 0x82, 0x5a, 0xf1, 0x54, 0x5c, - 0xf7, 0xd9, 0x55, 0xf7, 0x1e, 0xa1, 0x4d, 0x11, 0x22, 0x1f, 0x76, 0x47, - 0xe6, 0x32, 0x12, 0xea, 0x57, 0x95, 0x86, 0x9d, 0x26, 0xdf, 0x58, 0x11, - 0x98, 0x0e, 0xc3, 0x58, 0xd9, 0xc0, 0x9d, 0x39, 0x48, 0x72, 0xa5, 0x0f, - 0x00, 0x51, 0xef, 0x16, 0x10, 0x78, 0x6c, 0x6d, 0x8f, 0x49, 0x87, 0xa4, - 0xfe, 0xb0, 0xed, 0xcd, 0x88, 0x91, 0x58, 0x8c, 0x9e, 0x4e, 0xde, 0xad, - 0x6d, 0xea, 0x8f, 0x21, 0x6e, 0x9a, 0x1b, 0xa3, 0x27, 0x07, 0xf4, 0x8e, - 0xef, 0xf5, 0x33, 0x62, 0xe9, 0x50, 0x61, 0xd6, 0x86, 0x1b, 0x07, 0x7c, - 0x90, 0x52, 0x00, 0xef, 0x0f, 0x2a, 0x86, 0x65, 0x0e, 0x28, 0xcc, 0x31, - 0x89, 0x5f, 0xa8, 0x07, 0xda, 0xe7, 0x12, 0x09, 0x32, 0xa3, 0xd8, 0x95, - 0xe3, 0xd8, 0x77, 0xdd, 0x23, 0x01, 0xb7, 0xf9, 0x04, 0x95, 0x48, 0x86, - 0x6a, 0xc6, 0xc4, 0xf2, 0xd8, 0x8b, 0x68, 0x1c, 0xa9, 0x14, 0xb1, 0x45, - 0xd3, 0x36, 0xe4, 0xef, 0x99, 0x9a, 0x70, 0x0e, 0x85, 0x3d, 0x30, 0xcc, - 0x26, 0x91, 0xbe, 0x09, 0xbd, 0xa2, 0x09, 0xac, 0x37, 0x02, 0x2c, 0x00, - 0x68, 0xf5, 0x06, 0x3b, 0x6e, 0x28, 0x3a, 0x94, 0x92, 0x31, 0xc3, 0x90, - 0x58, 0x85, 0x1d, 0x0d, 0x33, 0x41, 0x54, 0x63, 0xf1, 0x12, 0xe7, 0xac, - 0xbf, 0x2c, 0x48, 0x2e, 0x0e, 0x1f, 0xa4, 0xd5, 0xcf, 0x81, 0xf2, 0xa4, - 0x48, 0x8e, 0x66, 0x16, 0xd1, 0x9c, 0x80, 0x17, 0x6a, 0xbe, 0xf8, 0x88, - 0x3c, 0x76, 0x24, 0xea, 0x90, 0x58, 0x95, 0x42, 0x8f, 0xca, 0x80, 0xe4, - 0x26, 0xc7, 0xf9, 0xf8, 0xb7, 0x72, 0xa0, 0x1b, 0x3f, 0xc9, 0x00, 0x9d, - 0x13, 0xeb, 0x53, 0xef, 0x07, 0xe9, 0x5e, 0x33, 0xd4, 0x29, 0x74, 0xf3, - 0x68, 0x09, 0x8f, 0x8c, 0xc2, 0x25, 0xb9, 0xb9, 0x2d, 0x66, 0x2f, 0x54, - 0xa1, 0x6a, 0xaa, 0xd7, 0x60, 0xc8, 0x8e, 0xad, 0xe4, 0xd2, 0x30, 0xcd, - 0x78, 0x14, 0x16, 0xf8, 0x67, 0x70, 0xb2, 0xc2, 0x66, 0x06, 0x66, 0x5f, - 0xf0, 0x7c, 0x29, 0xd0, 0x4c, 0x21, 0xf3, 0x47, 0x2f, 0x72, 0x41, 0x68, - 0x0d, 0x82, 0xfb, 0x61, 0xcb, 0xf7, 0xd9, 0x6d, 0xef, 0xc2, 0xdd, 0x88, - 0x69, 0x38, 0x38, 0xc3, 0x82, 0x59, 0xec, 0x35, 0xc5, 0x02, 0xe4, 0x7b, - 0xcb, 0x33, 0x81, 0x4b, 0x18, 0x86, 0xf5, 0x14, 0xa6, 0x05, 0x49, 0x20, - 0xc6, 0x28, 0xff, 0xdb, 0x81, 0x70, 0xe9, 0x8b, 0x4c, 0xb4, 0x58, 0x57, - 0x29, 0x20, 0x11, 0xa9, 0x02, 0x9b, 0xd9, 0xb3, 0x77, 0xec, 0x16, 0x81, - 0xcb, 0x4b, 0xe2, 0x87, 0x39, 0x35, 0x12, 0xd5, 0x2e, 0x78, 0xe4, 0xf3, - 0x62, 0x90, 0x57, 0xc6, 0x38, 0x93, 0x69, 0x54, 0xed, 0x03, 0x11, 0x38, - 0x94, 0x5b, 0xee, 0xea, 0xe6, 0x66, 0xec, 0x00, 0x74, 0x6a, 0xa8, 0x59, - 0x14, 0x0d, 0x38, 0x92, 0x66, 0xe0, 0xce, 0x08, 0x1a, 0x09, 0x68, 0xc7, - 0x95, 0x55, 0x3f, 0xb7, 0x26, 0x50, 0x3e, 0x27, 0x52, 0x99, 0xd8, 0xd3, - 0x67, 0xf5, 0x04, 0x50, 0xa0, 0x8c, 0x99, 0x01, 0x18, 0x17, 0x4d, 0x1d, - 0x12, 0xe6, 0x38, 0x53, 0x1d, 0x35, 0x3c, 0x6d, 0x79, 0xd3, 0x1a, 0x6d, - 0x10, 0xc9, 0x32, 0x2b, 0xe8, 0xb8, 0x4c, 0x5b, 0x86, 0xda, 0x5d, 0xdb, - 0x61, 0xdf, 0x3a, 0x80, 0x93, 0x72, 0x80, 0x1f, 0xe8, 0x35, 0x4f, 0xbe, - 0x1b, 0x5b, 0x6b, 0x06, 0xf9, 0x4e, 0xb0, 0x38, 0xa6, 0x18, 0x03, 0xca, - 0x23, 0xb1, 0x6d, 0x40, 0xcd, 0x42, 0xf7, 0x90, 0x02, 0xeb, 0x03, 0xcb, - 0x31, 0x06, 0xe6, 0x59, 0x81, 0x0d, 0xf7, 0xce, 0x00, 0x42, 0x52, 0x4c, - 0xc2, 0xa2, 0xfc, 0x60, 0xba, 0xeb, 0x74, 0xb8, 0xa8, 0xfa, 0xfd, 0xdf, - 0x8f, 0x72, 0xc1, 0x47, 0xe3, 0xf7, 0x6f, 0x13, 0x13, 0x19, 0xf0, 0xcb, - 0x63, 0xdc, 0x51, 0x95, 0xdd, 0x9e, 0xa7, 0x8d, 0x9f, 0x2f, 0x14, 0x09, - 0xa4, 0xb9, 0x6a, 0x32, 0xc8, 0xdb, 0xbc, 0xe4, 0xfa, 0x6b, 0x2d, 0x1d, - 0x04, 0x0c, 0x13, 0x8f, 0x6f, 0x97, 0x40, 0x39, 0x8f, 0x97, 0x50, 0xae, - 0x6c, 0xb1, 0xf2, 0x0a, 0xb1, 0xd9, 0xd5, 0x26, 0x8e, 0x94, 0x4c, 0x2f, - 0xcb, 0xfa, 0x8e, 0x10, 0xf4, 0x3d, 0x92, 0x04, 0x99, 0xcb, 0x34, 0xd1, - 0xce, 0x66, 0x07, 0xe5, 0xa9, 0x47, 0xe5, 0x49, 0x50, 0xfd, 0xf9, 0x14, - 0xf0, 0xd7, 0x08, 0x43, 0x4b, 0x7c, 0x90, 0xb4, 0xab, 0xe5, 0x67, 0xcd, - 0x4e, 0xfc, 0x2e, 0xec, 0x57, 0x3e, 0x4e, 0x18, 0x85, 0xa0, 0x17, 0xb8, - 0x7f, 0x5f, 0x2e, 0xed, 0x99, 0xe8, 0x38, 0x02, 0xe4, 0xbd, 0x45, 0x9b, - 0x4a, 0xc5, 0xae, 0x13, 0x72, 0xec, 0xb7, 0x4d, 0x00, 0x45, 0x6f, 0x32, - 0x8f, 0x9c, 0x35, 0x57, 0xd8, 0x89, 0x10, 0x98, 0xd9, 0x22, 0x8e, 0xb9, - 0x40, 0x6d, 0x80, 0x0e, 0x55, 0xf5, 0x50, 0x28, 0x81, 0x16, 0xaa, 0xa5, - 0x20, 0x2f, 0xd3, 0xc1, 0xce, 0x49, 0x12, 0xf2, 0xf5, 0x66, 0x42, 0xe9, - 0x5c, 0xb2, 0x64, 0x9f, 0x01, 0xbd, 0x30, 0x96, 0x2d, 0x12, 0x8e, 0x11, - 0x39, 0x0f, 0xca, 0x44, 0x22, 0x4d, 0x83, 0xd0, 0xb3, 0x58, 0xd0, 0x4a, - 0xf0, 0x1c, 0xf3, 0xfe, 0x88, 0x04, 0xd1, 0xa3, 0xdd, 0xc1, 0xf0, 0x6d, - 0x33, 0x5c, 0x13, 0x85, 0xf4, 0xd7, 0x21, 0x43, 0x57, 0x78, 0xe2, 0x9c, - 0xb0, 0x03, 0x7f, 0xf4, 0x05, 0x17, 0xef, 0x77, 0x0f, 0xc2, 0xc8, 0x21, - 0x31, 0xa8, 0x8f, 0xd4, 0x81, 0x1d, 0xbb, 0x38, 0x83, 0xbf, 0x1d, 0x90, - 0x9d, 0xef, 0x6b, 0x09, 0x88, 0xd8, 0xd1, 0x6c, 0x19, 0xd0, 0x63, 0xc1, - 0x29, 0xce, 0xc4, 0x4e, 0x4c, 0x0c, 0xa9, 0x71, 0x74, 0x83, 0x8e, 0x27, - 0xf1, 0x97, 0xee, 0x18, 0xd3, 0xa6, 0x91, 0x82, 0x82, 0xd6, 0xbb, 0xe5, - 0x2d, 0x6f, 0x64, 0xee, 0x52, 0x82, 0x5f, 0x51, 0x1a, 0xdf, 0xcd, 0x17, - 0x32, 0x97, 0xa8, 0x9f, 0x24, 0x8d, 0x9d, 0x47, 0xbb, 0xbe, 0xe4, 0xfa, - 0x2d, 0xa8, 0xfb, 0xc9, 0x39, 0xbb, 0xce, 0x15, 0x12, 0x7f, 0xd2, 0x11, - 0xcd, 0x2b, 0xc4, 0x19, 0xdd, 0x28, 0x49, 0xfc, 0x66, 0x38, 0xb0, 0xf6, - 0x4f, 0x3e, 0x6f, 0x14, 0x22, 0xb9, 0x15, 0x05, 0x62, 0x95, 0x0f, 0xce, - 0x8e, 0xde, 0xab, 0x4d, 0x81, 0x70, 0x18, 0xbe, 0xf8, 0xf4, 0xcf, 0x9d, - 0x28, 0x27, 0x37, 0x8e, 0x82, 0x54, 0x43, 0x0a, 0x02, 0x0f, 0x58, 0xc0, - 0x0e, 0x7c, 0x88, 0xf4, 0xaf, 0xd7, 0x4a, 0x1d, 0x89, 0xe0, 0x7a, 0x02, - 0x05, 0xc7, 0x0f, 0xc3, 0x72, 0xbc, 0x39, 0x5e, 0x49, 0x16, 0x68, 0x7f, - 0x3d, 0xcb, 0x8e, 0xae, 0x1b, 0xc7, 0x70, 0x22, 0xc0, 0x04, 0x1f, 0x9b, - 0x6b, 0xdd, 0x93, 0x2d, 0x20, 0xd0, 0xdc, 0xe6, 0x76, 0x5a, 0x22, 0x58, - 0x7d, 0x88, 0xa9, 0x40, 0xff, 0xa2, 0xc0, 0x9c, 0x53, 0x9f, 0xc6, 0x5a, - 0x1f, 0xef, 0xa4, 0x6c, 0x0e, 0x7d, 0x7a, 0x81, 0x38, 0x64, 0x56, 0x48, - 0x50, 0xd7, 0x7e, 0x02, 0xbc, 0x2e, 0xc4, 0xff, 0x38, 0xfd, 0xe6, 0x4e, - 0xad, 0x26, 0x65, 0x91, 0x23, 0xa9, 0x7e, 0xf1, 0xd3, 0xec, 0x00, 0xb9, - 0x1c, 0x56, 0x23, 0xb0, 0x4d, 0xc8, 0xe5, 0x85, 0xed, 0x5b, 0xd8, 0x17, - 0xc2, 0x0a, 0xfc, 0x5c, 0xef, 0xdf, 0xab, 0xad, 0x74, 0x20, 0x82, 0x5b, - 0x6a, 0x39, 0x2b, 0xc2, 0x3d, 0xaf, 0x3f, 0xdb, 0xb4, 0xb6, 0x2f, 0xd0, - 0x2e, 0x51, 0xe8, 0x9c, 0xb6, 0x81, 0xb7, 0x20, 0xd5, 0x16, 0x9c, 0x35, - 0x6b, 0x45, 0x85, 0x38, 0xd2, 0xf7, 0x74, 0x20, 0x1b, 0xaa, 0xe2, 0xd2, - 0x06, 0x39, 0x0a, 0xde, 0xc6, 0x77, 0xb8, 0xe9, 0xd6, 0xc3, 0x55, 0x08, - 0x89, 0x95, 0x41, 0x75, 0x1f, 0x32, 0x3c, 0x2a, 0xf2, 0xe9, 0x39, 0x54, - 0x12, 0x07, 0x4a, 0xc3, 0xd6, 0x98, 0xd5, 0xc3, 0x48, 0x96, 0xb5, 0xe0, - 0x1d, 0x2d, 0x90, 0x1d, 0x4c, 0xd8, 0xf2, 0xb1, 0x0e, 0x95, 0x71, 0x1d, - 0x0d, 0x61, 0x7a, 0xeb, 0x42, 0xb5, 0x92, 0x93, 0x0a, 0x35, 0x6b, 0x92, - 0x2d, 0x3c, 0xed, 0xa7, 0xd1, 0x5a, 0x39, 0x9a, 0x85, 0x1f, 0x4d, 0x15, - 0xa4, 0x3c, 0xa4, 0x58, 0x9d, 0xa9, 0x1c, 0x95, 0x26, 0x23, 0x25, 0xb0, - 0x84, 0xa1, 0x61, 0x5c, 0x70, 0x67, 0x21, 0x73, 0x76, 0xfd, 0xf3, 0xf4, - 0xd9, 0x50, 0xa2, 0xeb, 0x13, 0x15, 0x32, 0x07, 0xfb, 0xa6, 0x26, 0x38, - 0x27, 0xe5, 0x29, 0xa0, 0x16, 0xc0, 0xcf, 0x8d, 0xe5, 0x11, 0xfb, 0x6f, - 0x2c, 0x0c, 0x8c, 0x31, 0x0e, 0x90, 0xd9, 0x6d, 0xa5, 0x5f, 0x6d, 0x75, - 0xfa, 0xad, 0x2d, 0x11, 0x0e, 0x0f, 0xd0, 0xfd, 0x86, 0x6d, 0x14, 0xcc, - 0x70, 0xe5, 0x59, 0xff, 0x83, 0xdc, 0x95, 0xec, 0x8b, 0x0c, 0x71, 0xc6, - 0x45, 0x50, 0x59, 0xf6, 0x56, 0x90, 0xe1, 0x9e, 0x26, 0x30, 0xf5, 0xca, - 0x09, 0x5a, 0x3a, 0x33, 0x2d, 0xa0, 0x1e, 0xd4, 0x84, 0x13, 0xea, 0x44, - 0x32, 0x55, 0x90, 0xc8, 0x7a, 0x44, 0x14, 0x6a, 0x1d, 0x60, 0xef, 0x9f, - 0x2b, 0x90, 0x6a, 0x7c, 0xfe, 0xb6, 0x6d, 0x68, 0xe3, 0x26, 0xcb, 0x39, - 0x02, 0xe9, 0x44, 0x85, 0x56, 0x05, 0xda, 0xfd, 0x87, 0x6a, 0x70, 0xe3, - 0x31, 0x51, 0x92, 0x84, 0x61, 0x7d, 0x3d, 0x4c, 0x2f, 0xaa, 0x7e, 0x73, - 0x77, 0x3e, 0x58, 0x3e, 0xf1, 0xee, 0x53, 0x26, 0x02, 0xda, 0x01, 0xef, - 0xe1, 0xfa, 0x88, 0x1d, 0xaf, 0x97, 0x86, 0x2d, 0xf1, 0x30, 0xf9, 0xc0, - 0x40, 0x20, 0xee, 0x2c, 0xb6, 0xbf, 0x5d, 0xb3, 0xcd, 0xc7, 0x3a, 0x79, - 0x99, 0x7b, 0xaa, 0x68, 0x79, 0x8b, 0xfc, 0x18, 0xb4, 0x65, 0x22, 0x9e, - 0xf5, 0xff, 0x79, 0xde, 0x4b, 0x74, 0xd1, 0x77, 0x46, 0xcb, 0xb6, 0x9a, - 0x1e, 0xa1, 0x0b, 0x43, 0x67, 0xb7, 0x98, 0x50, 0x7f, 0x5c, 0x5c, 0x84, - 0xf5, 0x0d, 0x98, 0x70, 0x44, 0xae, 0x0a, 0x85, 0x66, 0x33, 0xd5, 0x60, - 0x52, 0x80, 0xa0, 0x04, 0x3e, 0x69, 0xb1, 0xd7, 0x21, 0xe0, 0xa0, 0x78, - 0x93, 0xba, 0xcb, 0x97, 0x10, 0x7e, 0x5f, 0x1d, 0x45, 0x70, 0x5b, 0xbc, - 0x0b, 0xa1, 0xc4, 0x3b, 0x22, 0x7b, 0xe3, 0x8b, 0x15, 0xb7, 0x28, 0x77, - 0xe3, 0x4c, 0xf8, 0x8d, 0x58, 0x52, 0x23, 0xa2, 0x65, 0xc4, 0xb0, 0x0e, - 0x51, 0xf5, 0xf8, 0x06, 0xdf, 0x2f, 0xe5, 0x20, 0x3b, 0x5c, 0xc7, 0xd1, - 0x34, 0x10, 0xe1, 0x2f, 0x46, 0x72, 0x91, 0xe4, 0x77, 0x1c, 0xc1, 0xee, - 0xc0, 0x4e, 0xb6, 0xf7, 0x12, 0x5b, 0xbf, 0x43, 0x49, 0xbf, 0xfd, 0x92, - 0xf7, 0x94, 0x8a, 0x42, 0x5e, 0x70, 0x4d, 0x85, 0xa9, 0x9c, 0x18, 0xaf, - 0xa9, 0x21, 0xde, 0xf7, 0x24, 0x70, 0xc0, 0xb6, 0xf1, 0xeb, 0x6e, 0xa4, - 0x8d, 0x74, 0x38, 0xb4, 0x86, 0x6b, 0x09, 0x10, 0xf1, 0xf3, 0xee, 0x12, - 0xe5, 0x9f, 0xca, 0xe4, 0x61, 0x36, 0x4b, 0x5e, 0xd8, 0x25, 0xc1, 0x42, - 0x13, 0x93, 0x00, 0x6d, 0x75, 0xaf, 0x50, 0x8b, 0x16, 0xe8, 0xea, 0xd2, - 0xcd, 0x69, 0xc1, 0x41, 0xfd, 0x1d, 0x72, 0x7b, 0x2b, 0xe3, 0xe7, 0xff, - 0x69, 0x5c, 0x55, 0x54, 0x43, 0x08, 0x87, 0x41, 0x58, 0x75, 0x66, 0xa5, - 0xdc, 0xab, 0xe1, 0x5a, 0x95, 0x68, 0xa5, 0xd0, 0x93, 0x5a, 0xe2, 0x34, - 0x36, 0x67, 0x12, 0xda, 0xac, 0xd8, 0x11, 0xef, 0x27, 0x54, 0x3d, 0x26, - 0x55, 0xfa, 0x81, 0xb8, 0x21, 0xf1, 0x40, 0xfc, 0x59, 0xd1, 0xc8, 0x60, - 0x66, 0xb3, 0xa6, 0x30, 0x5a, 0x52, 0xda, 0xbb, 0x9a, 0x30, 0x3a, 0xa0, - 0x15, 0x15, 0x60, 0x34, 0x15, 0xf1, 0xbb, 0x6f, 0x30, 0xd7, 0x03, 0xf4, - 0xd4, 0x82, 0x06, 0xa8, 0x1b, 0x7b, 0x8b, 0x94, 0x2f, 0xc8, 0x1a, 0xdd, - 0x5d, 0xc0, 0x34, 0x6a, 0x51, 0x28, 0xec, 0x7c, 0xc7, 0x57, 0x56, 0xfb, - 0xfb, 0x81, 0x91, 0xae, 0x76, 0x30, 0xab, 0xcc, 0x00, 0xea, 0xcb, 0xc6, - 0xe9, 0xf0, 0xdc, 0xc0, 0x26, 0x87, 0x57, 0xec, 0x4d, 0xc8, 0x79, 0xe8, - 0x2e, 0x75, 0x3f, 0x4a, 0xbd, 0xa9, 0x30, 0xde, 0x6c, 0x31, 0x65, 0x8f, - 0x01, 0xb5, 0x0c, 0xbb, 0xe0, 0x76, 0x85, 0x79, 0xa0, 0x2b, 0x36, 0x70, - 0xd7, 0xd0, 0x26, 0x10, 0x19, 0x3f, 0xcf, 0x9b, 0x22, 0x52, 0xfb, 0x00, - 0x6a, 0xbc, 0xba, 0xe1, 0xc3, 0x25, 0x71, 0xd5, 0x2b, 0x89, 0xe7, 0x1d, - 0x3b, 0xfe, 0xf8, 0x61, 0xca, 0x0d, 0x00, 0x17, 0xd1, 0x4c, 0xe2, 0x85, - 0x36, 0xc4, 0x64, 0xd9, 0x80, 0xd1, 0x26, 0x68, 0xa3, 0x0c, 0x4c, 0x20, - 0x88, 0x33, 0x4a, 0x19, 0x72, 0x56, 0xda, 0xa4, 0x80, 0xba, 0x8a, 0x87, - 0xbf, 0x59, 0x47, 0xa9, 0x0c, 0xfa, 0x6f, 0xc8, 0x7c, 0xe4, 0x6e, 0x4e, - 0xcd, 0x60, 0x9a, 0x8e, 0xb9, 0x62, 0x8e, 0x51, 0x16, 0x17, 0xb4, 0xa0, - 0xa3, 0xe3, 0x32, 0x62, 0x8b, 0x0a, 0x6a, 0x83, 0x98, 0xf0, 0xdf, 0x25, - 0xa0, 0xaa, 0x5f, 0x8a, 0x92, 0x7a, 0x22, 0xf6, 0x17, 0x02, 0xd4, 0x77, - 0x82, 0xab, 0x8d, 0x0c, 0x4c, 0xdb, 0x13, 0xd0, 0xda, 0xae, 0x2c, 0xd5, - 0x0b, 0x4c, 0x33, 0xa0, 0x38, 0xa6, 0x0b, 0x19, 0x78, 0x0c, 0x30, 0x3e, - 0x2a, 0x04, 0x0f, 0xb7, 0x29, 0xf0, 0xff, 0xb9, 0x2b, 0xa6, 0x26, 0xcf, - 0x22, 0x74, 0x70, 0x7d, 0xb1, 0x17, 0x46, 0xd1, 0x52, 0x72, 0x38, 0x0b, - 0xe2, 0xa9, 0xfe, 0x78, 0xbf, 0x2f, 0xe1, 0x04, 0xf1, 0xd7, 0xbf, 0x98, - 0xf0, 0x6e, 0xc1, 0xbc, 0xb9, 0xfe, 0x8b, 0x26, 0x11, 0x82, 0xaa, 0x4b, - 0x06, 0x7e, 0x72, 0xa9, 0xa1, 0xea, 0xc9, 0x67, 0x9b, 0xb1, 0x97, 0x71, - 0x77, 0xde, 0xb7, 0x67, 0x3f, 0xcb, 0x8b, 0x31, 0x0f, 0x0f, 0x30, 0xca, - 0x63, 0x69, 0x6a, 0x79, 0x56, 0x18, 0xaa, 0x85, 0xbd, 0x19, 0xe6, 0x41, - 0x70, 0xfc, 0x71, 0xe1, 0x02, 0x36, 0xfe, 0x20, 0xe3, 0x5e, 0x63, 0x8e, - 0x4a, 0x0f, 0x76, 0x9a, 0xe2, 0x90, 0xb4, 0x5a, 0x74, 0x81, 0xee, 0xe7, - 0x8a, 0x05, 0x46, 0xcf, 0x26, 0xe0, 0xaf, 0xe9, 0x89, 0x44, 0x34, 0xaa, - 0x0c, 0x84, 0x13, 0xaf, 0x70, 0xcc, 0x15, 0x63, 0x33, 0x58, 0x62, 0xbe, - 0x47, 0x7f, 0x37, 0x11, 0x80, 0x5e, 0xab, 0x7c, 0x34, 0x51, 0x37, 0x8b, - 0xc4, 0xce, 0x7b, 0x2f, 0x6c, 0x1a, 0x74, 0x80, 0xb3, 0x19, 0xb0, 0x29, - 0x74, 0x8f, 0xa1, 0xf9, 0xc3, 0x36, 0x86, 0x95, 0xef, 0x1c, 0x87, 0x7b, - 0xb4, 0x1c, 0xab, 0x86, 0xf1, 0xab, 0x74, 0xf2, 0xef, 0x8f, 0xd1, 0x5c, - 0x89, 0x74, 0xc7, 0x21, 0xd7, 0x59, 0x04, 0xc8, 0x42, 0x5b, 0x85, 0x2a, - 0x7b, 0x80, 0xef, 0xb7, 0x0a, 0x58, 0xe3, 0x53, 0xcb, 0xfd, 0xfb, 0x0e, - 0x4b, 0x4a, 0xac, 0x16, 0xa5, 0x29, 0x4a, 0x1c, 0xec, 0xc6, 0x4d, 0xa3, - 0x30, 0x6d, 0x5b, 0x78, 0xb2, 0x44, 0x77, 0x04, 0x85, 0xbb, 0x83, 0x9e, - 0x6c, 0x82, 0x47, 0x80, 0x0d, 0xeb, 0xcf, 0xf5, 0xbf, 0x29, 0x56, 0x11, - 0xd7, 0x90, 0xf8, 0x2a, 0xdc, 0xb7, 0x3b, 0x74, 0x2d, 0x90, 0x28, 0xa8, - 0x15, 0x13, 0xe4, 0xc5, 0xb0, 0x95, 0xff, 0xc0, 0x28, 0x0a, 0xf2, 0x2e, - 0x9c, 0x83, 0x2e, 0xcd, 0x67, 0x5b, 0x38, 0xb5, 0xae, 0x03, 0x61, 0x6b, - 0x88, 0xe8, 0xe6, 0x78, 0x47, 0x71, 0x84, 0x17, 0x24, 0xb4, 0x5b, 0x14, - 0xee, 0xc2, 0x91, 0x5a, 0xfb, 0x7a, 0x04, 0xec, 0xfb, 0xf2, 0xb9, 0x3b, - 0xa7, 0x89, 0x14, 0x73, 0xa3, 0xde, 0x4a, 0x82, 0x80, 0x30, 0x5c, 0xa1, - 0xd8, 0xe8, 0xd4, 0x3e, 0xec, 0x7b, 0x74, 0xf6, 0x06, 0xac, 0x7e, 0xf5, - 0xdc, 0x6c, 0xa0, 0x76, 0x37, 0x6f, 0x6a, 0xe2, 0x0f, 0xfb, 0xac, 0x34, - 0x4a, 0x71, 0x5d, 0x95, 0x03, 0x87, 0x90, 0x3e, 0xec, 0x62, 0xc4, 0x4e, - 0x9f, 0xaa, 0x49, 0xf5, 0x83, 0x75, 0x34, 0x6c, 0x81, 0x77, 0x89, 0xc4, - 0xa8, 0x28, 0xff, 0x56, 0x59, 0xea, 0x5d, 0xf2, 0xb8, 0xe4, 0x46, 0xca, - 0x73, 0x15, 0x26, 0xaa, 0x0b, 0x23, 0x09, 0xaf, 0xf0, 0xd1, 0x8e, 0x49, - 0xdb, 0x75, 0xb7, 0x98, 0x27, 0x5d, 0x22, 0x1b, 0xf0, 0x53, 0xb0, 0xce, - 0x5a, 0x9c, 0x27, 0x89, 0xcf, 0xd9, 0xda, 0x4b, 0x03, 0x95, 0xe7, 0x1f, - 0xfd, 0x6f, 0xc2, 0x39, 0xb2, 0xa6, 0xb0, 0x81, 0x78, 0x4b, 0x01, 0x19, - 0x10, 0x30, 0x26, 0x5d, 0x29, 0x35, 0xbb, 0x2e, 0xe4, 0x66, 0xba, 0x14, - 0x61, 0xf9, 0x27, 0x7a, 0xa3, 0x80, 0x4f, 0x5a, 0xac, 0x05, 0xad, 0xa4, - 0x42, 0xad, 0x06, 0xbd, 0xbb, 0xfa, 0x32, 0xf7, 0x75, 0xee, 0x4d, 0xf7, - 0x51, 0x89, 0x11, 0x25, 0xc1, 0x62, 0x9c, 0x99, 0x1f, 0xde, 0xb0, 0xfc, - 0xeb, 0x03, 0xa3, 0xa4, 0xa2, 0xe6, 0xa0, 0x10, 0x47, 0x8a, 0xe4, 0xc3, - 0x33, 0x31, 0xc5, 0xa1, 0xde, 0x6f, 0xc2, 0x72, 0x50, 0x01, 0x62, 0xc4, - 0x02, 0x1d, 0x66, 0x40, 0x9f, 0x4b, 0xae, 0x44, 0x19, 0x23, 0xf3, 0xab, - 0xad, 0xf8, 0xc4, 0x4a, 0x34, 0x6d, 0xb6, 0x0d, 0x87, 0xda, 0xf4, 0xe6, - 0x1e, 0x9b, 0x15, 0xad, 0xe7, 0x45, 0x88, 0x14, 0x6b, 0x60, 0x70, 0xba, - 0x5d, 0x52, 0x18, 0x44, 0x69, 0xef, 0x6c, 0x7b, 0xc3, 0x8e, 0x9d, 0x77, - 0xd5, 0xd3, 0x82, 0xf6, 0x53, 0x81, 0x0c, 0xf2, 0x77, 0xa7, 0xb2, 0x0c, - 0xa7, 0x05, 0x0a, 0xb2, 0x82, 0xba, 0x63, 0x05, 0x08, 0xec, 0xc3, 0xa1, - 0x44, 0xde, 0x91, 0x6c, 0x9b, 0x71, 0x7a, 0x67, 0x1a, 0x81, 0x14, 0x91, - 0x8f, 0xa6, 0x80, 0x41, 0xdb, 0x90, 0xdb, 0x16, 0x9a, 0x79, 0xfb, 0x57, - 0xca, 0x2d, 0x7c, 0xe1, 0x1b, 0x9c, 0xaa, 0xb7, 0xfb, 0x1c, 0x96, 0x36, - 0x9f, 0x9e, 0xe1, 0xd3, 0x93, 0xbb, 0xf5, 0x72, 0xbe, 0x8b, 0xa2, 0x3c, - 0x7e, 0x5d, 0x4f, 0xe5, 0x04, 0xce, 0x1e, 0xc7, 0x9d, 0xfb, 0xaa, 0x82, - 0x80, 0x63, 0xa2, 0x16, 0x6e, 0x68, 0xf8, 0x82, 0x5e, 0xc7, 0xc3, 0xa3, - 0xd1, 0x16, 0xe9, 0x31, 0x3e, 0x65, 0xd4, 0x73, 0x52, 0xf8, 0x0a, 0xff, - 0x45, 0x6f, 0xb8, 0xb5, 0x3a, 0x9d, 0x99, 0xc5, 0x7e, 0x8e, 0x42, 0x76, - 0xa9, 0x12, 0xfe, 0x12, 0x69, 0xdf, 0xa7, 0xa8, 0xca, 0x6d, 0xc5, 0xb3, - 0x44, 0x2e, 0x0f, 0x79, 0x8a, 0xc9, 0x44, 0x7d, 0xd1, 0x07, 0xe5, 0x1a, - 0x01, 0x91, 0x29, 0xac, 0xc6, 0x1a, 0x41, 0x6e, 0xac, 0x6d, 0x24, 0x5e, - 0xc7, 0xcb, 0xd6, 0x85, 0x51, 0x3c, 0xec, 0xc5, 0xb7, 0x60, 0x64, 0xe9, - 0x75, 0xb1, 0x6e, 0x81, 0x96, 0xad, 0xd9, 0x35, 0x61, 0x98, 0x5b, 0xb9, - 0x61, 0x86, 0x93, 0xe3, 0xd3, 0x78, 0x09, 0x23, 0xc3, 0xfd, 0x15, 0x0f, - 0xc0, 0xe3, 0x46, 0xd1, 0x78, 0x66, 0xf0, 0x6e, 0x38, 0x68, 0x20, 0xbd, - 0xc7, 0xe3, 0x9c, 0x7f, 0x1c, 0x34, 0xee, 0x5c, 0x85, 0x62, 0x0f, 0x84, - 0x42, 0xbd, 0x5e, 0x49, 0x5e, 0x53, 0xfc, 0x59, 0x10, 0x11, 0xf7, 0x3b, - 0xc4, 0xff, 0xb7, 0x3d, 0xd8, 0x0c, 0x65, 0x26, 0x6c, 0x02, 0x4e, 0x46, - 0xcd, 0x4f, 0x26, 0xc2, 0xef, 0xae, 0x03, 0x84, 0x3d, 0x24, 0xd1, 0xe0, - 0xed, 0x7d, 0x56, 0xbe, 0x65, 0xe9, 0x53, 0x9d, 0x9a, 0x49, 0x6e, 0xdf, - 0xfe, 0xa5, 0xe8, 0x23, 0x5d, 0x10, 0x3f, 0xab, 0x1c, 0xd6, 0x86, 0xda, - 0xb8, 0x7b, 0x6d, 0x96, 0x5c, 0x98, 0xbc, 0x3d, 0x58, 0xae, 0x3e, 0xfd, - 0xc9, 0xc9, 0x3b, 0x3c, 0x94, 0xdd, 0x6f, 0x7d, 0xa6, 0xdb, 0x18, 0xec, - 0xc2, 0xb1, 0x8c, 0xff, 0x12, 0xfb, 0x13, 0xa2, 0xca, 0xfe, 0xed, 0x41, - 0xc4, 0x51, 0x36, 0x03, 0x9c, 0xa6, 0x7f, 0x2b, 0x54, 0x10, 0x98, 0xf6, - 0xb3, 0x7d, 0x59, 0x0a, 0x0f, 0x93, 0x1b, 0x9a, 0x70, 0xaa, 0x17, 0x9e, - 0xb4, 0xa7, 0x7c, 0x62, 0xe0, 0x52, 0x04, 0x9d, 0x2f, 0x10, 0xff, 0x1f, - 0xa0, 0xde, 0x8b, 0x9a, 0xb9, 0xd1, 0x15, 0x49, 0xfe, 0x92, 0xb5, 0x0c, - 0xbc, 0x5d, 0xf0, 0x75, 0x2a, 0x36, 0x57, 0x5a, 0x82, 0x2b, 0xbc, 0x8c, - 0x91, 0xc5, 0x6f, 0x57, 0x9f, 0xc2, 0xdf, 0x89, 0x48, 0xe3, 0x13, 0x97, - 0xbc, 0xd8, 0x2f, 0x80, 0x23, 0x1f, 0xa7, 0x77, 0x0b, 0xac, 0x50, 0xfe, - 0xfa, 0xb0, 0x7d, 0x2c, 0x20, 0x1c, 0x8f, 0xcd, 0xe9, 0x4c, 0xd0, 0x04, - 0x17, 0x7c, 0x61, 0x9c, 0xbf, 0x60, 0x82, 0xa5, 0xad, 0x7e, 0xb7, 0x81, - 0x24, 0xc5, 0x3d, 0x22, 0x0f, 0x0f, 0x0e, 0x73, 0x7d, 0x5a, 0x47, 0xe8, - 0xb9, 0x39, 0x25, 0x40, 0x1e, 0xdc, 0x91, 0x80, 0xfe, 0x7c, 0xab, 0xea, - 0x48, 0xb0, 0x47, 0xea, 0xce, 0xd5, 0x57, 0x26, 0x57, 0xfe, 0x5f, 0xc5, - 0x93, 0xb1, 0xe7, 0xc7, 0xba, 0x0d, 0xf9, 0xc9, 0x04, 0xf1, 0x36, 0x2b, - 0x8e, 0x66, 0xd8, 0xd5, 0x60, 0x24, 0xd4, 0x38, 0x23, 0x48, 0x71, 0x02, - 0x55, 0x5b, 0x06, 0xc6, 0xb7, 0xed, 0xf9, 0x62, 0x2a, 0xea, 0xf8, 0x21, - 0xeb, 0x19, 0x64, 0x81, 0xfa, 0xad, 0x7b, 0x27, 0x66, 0x62, 0x34, 0xc7, - 0x22, 0xab, 0x3b, 0x6c, 0xce, 0x74, 0x12, 0xed, 0xf3, 0x20, 0x31, 0x01, - 0xb9, 0x71, 0x58, 0x49, 0xa8, 0xb0, 0xa0, 0x86, 0x17, 0x82, 0xe1, 0x1d, - 0x73, 0x04, 0xc5, 0xb5, 0xc1, 0x66, 0x30, 0x7b, 0xbe, 0xf0, 0xd3, 0x26, - 0x49, 0x51, 0xbf, 0x2a, 0xfd, 0xef, 0x91, 0x5d, 0x0a, 0xc1, 0x21, 0xb5, - 0xde, 0x6f, 0x2b, 0x28, 0x4d, 0x42, 0x7e, 0x21, 0xc5, 0x2b, 0xc6, 0x4f, - 0x01, 0xc3, 0x28, 0xe5, 0x2a, 0xa6, 0x93, 0x1a, 0xd2, 0x98, 0x95, 0x9d, - 0x97, 0xee, 0xf0, 0xb3, 0xd5, 0x08, 0x12, 0x8c, 0x48, 0x94, 0x67, 0x64, - 0x1a, 0x66, 0x02, 0x36, 0x76, 0xcf, 0xfc, 0xbc, 0xe4, 0x30, 0xf5, 0xfe, - 0x6f, 0x9d, 0xf7, 0x90, 0xc1, 0xc3, 0x76, 0x5d, 0xcf, 0x6c, 0x07, 0x18, - 0xfa, 0x00, 0x82, 0x98, 0x74, 0x73, 0xce, 0x62, 0x62, 0x6b, 0xd9, 0xe0, - 0xf8, 0x9a, 0xcc, 0x60, 0x9f, 0xa3, 0x7f, 0x8e, 0x0d, 0x89, 0x54, 0xa7, - 0x9a, 0xe2, 0x3d, 0x4a, 0x3d, 0xeb, 0x77, 0x74, 0x28, 0x3e, 0x09, 0x4c, - 0x22, 0x20, 0xc1, 0x2d, 0xcb, 0xdb, 0x7e, 0x9b, 0xed, 0xee, 0xb1, 0xeb, - 0x1d, 0xb3, 0x32, 0x11, 0xf9, 0x60, 0x4b, 0xc8, 0xfa, 0x78, 0x46, 0xea, - 0xc3, 0xdc, 0x67, 0xb3, 0xe3, 0x94, 0x33, 0x42, 0x19, 0x64, 0x90, 0x68, - 0xae, 0x1e, 0x87, 0x82, 0x0e, 0x9e, 0xd9, 0x18, 0xc4, 0xbd, 0x8c, 0x62, - 0x58, 0x44, 0xe6, 0x42, 0x3a, 0x73, 0xbe, 0xbb, 0xef, 0xc9, 0xb0, 0x5f, - 0x2a, 0x7f, 0xaa, 0x57, 0xb4, 0xf5, 0xab, 0x9d, 0xa3, 0xac, 0x12, 0xe7, - 0xa4, 0x7d, 0x20, 0x35, 0xc4, 0xfd, 0x1a, 0x4d, 0x09, 0xee, 0xbf, 0xbf, - 0xb2, 0x2c, 0x40, 0x1d, 0x97, 0x19, 0xd5, 0x6a, 0xac, 0x52, 0x2b, 0xda, - 0xaa, 0x29, 0x25, 0xb9, 0xfd, 0x8d, 0x3e, 0x3a, 0x2d, 0xcc, 0xde, 0x52, - 0xad, 0x70, 0xbb, 0xc5, 0x5a, 0xf6, 0x74, 0xdb, 0xe9, 0x44, 0xb6, 0x80, - 0x78, 0x9f, 0x1c, 0xa7, 0x3d, 0x96, 0x86, 0xc5, 0x78, 0x8d, 0xc7, 0x8b, - 0x2f, 0x2a, 0x22, 0xe8, 0x17, 0x2f, 0x50, 0x4e, 0x3c, 0xb7, 0x21, 0x69, - 0x60, 0xfd, 0x7a, 0x77, 0x21, 0x93, 0xa9, 0xc2, 0xa5, 0xfe, 0x35, 0x41, - 0xda, 0x76, 0xb9, 0x10, 0x00, 0x81, 0x33, 0x0c, 0x22, 0x1a, 0xcb, 0x9f, - 0x79, 0x92, 0x16, 0x61, 0x5a, 0x3e, 0xfe, 0x5b, 0xb9, 0xde, 0x53, 0x2f, - 0x38, 0xe0, 0xb5, 0xb1, 0xac, 0xc3, 0x6a, 0x53, 0xe0, 0x06, 0x8b, 0x1d, - 0x76, 0x7c, 0x62, 0xcc, 0x83, 0xa3, 0xde, 0xa9, 0xcf, 0xef, 0x61, 0x34, - 0xf9, 0x6f, 0xf9, 0x79, 0x65, 0x14, 0x1e, 0x86, 0x90, 0x6f, 0x5c, 0xd0, - 0x95, 0xf5, 0x62, 0xce, 0xb2, 0xaa, 0xc6, 0x89, 0x8a, 0x94, 0x2a, 0x66, - 0x6b, 0x47, 0x83, 0xc7, 0x76, 0x2f, 0xf6, 0xeb, 0x3e, 0xdf, 0x1e, 0xaa, - 0x8e, 0x86, 0xc7, 0x87, 0x64, 0x09, 0x74, 0xbd, 0x76, 0x75, 0xbd, 0xb4, - 0x0b, 0x78, 0xaf, 0xad, 0x4d, 0xba, 0xb5, 0x64, 0x38, 0xbf, 0x03, 0x88, - 0xe1, 0x3c, 0xe4, 0x7f, 0x4f, 0x27, 0xb9, 0x69, 0x5a, 0xd7, 0x5c, 0x18, - 0xba, 0x0f, 0xf7, 0x02, 0x84, 0x06, 0xa6, 0x98, 0x28, 0x10, 0x0d, 0xab, - 0xdc, 0xdb, 0x7e, 0x9d, 0xbd, 0x00, 0xdd, 0x31, 0x57, 0x5d, 0x02, 0x46, - 0xe1, 0x8c, 0xe3, 0x0d, 0x3c, 0x0b, 0x00, 0x62, 0xe0, 0x06, 0xd1, 0xf7, - 0xf0, 0x17, 0xc1, 0x49, 0x29, 0xfc, 0x9c, 0xd3, 0x2c, 0x86, 0xbb, 0x32, - 0x8c, 0x40, 0x79, 0xe5, 0x6c, 0xaa, 0x23, 0xad, 0x74, 0x42, 0x9c, 0xe3, - 0xb3, 0xab, 0x73, 0xb6, 0x9c, 0x4e, 0xd9, 0x1a, 0x21, 0xe9, 0x6a, 0x13, - 0x50, 0x2a, 0x52, 0x9d, 0x1e, 0x91, 0xaa, 0xc1, 0xb8, 0x0b, 0x6e, 0x0c, - 0x8e, 0x30, 0x73, 0x4c, 0x72, 0x8c, 0x0f, 0xd1, 0x88, 0x5b, 0x97, 0xf1, - 0x96, 0xb3, 0x20, 0x47, 0xc0, 0x5e, 0x3b, 0x43, 0x9a, 0x2f, 0x94, 0x50, - 0x63, 0xdc, 0x0a, 0xe5, 0x83, 0xda, 0x32, 0xfe, 0xed, 0x4f, 0x9e, 0x51, - 0xbe, 0x02, 0x4c, 0xe3, 0xdd, 0x34, 0x32, 0x74, 0x05, 0xa6, 0xa9, 0xe5, - 0xdc, 0xad, 0xae, 0x92, 0x7e, 0xfb, 0xaf, 0x3e, 0xc5, 0x50, 0x91, 0x6f, - 0x11, 0x02, 0x8e, 0xd7, 0xd4, 0x9e, 0x79, 0x58, 0xcf, 0xbd, 0x3a, 0x55, - 0x8d, 0x7f, 0x2c, 0x49, 0x78, 0xc5, 0xb8, 0xf8, 0x0f, 0x03, 0x9f, 0x1e, - 0x1a, 0x92, 0x63, 0x6e, 0x20, 0x66, 0x97, 0x61, 0xb1, 0xc1, 0x77, 0x74, - 0x11, 0xf1, 0xc8, 0x66, 0xcb, 0x14, 0xc8, 0x60, 0x0c, 0xa9, 0xdf, 0xc1, - 0x77, 0xca, 0x68, 0xf2, 0x0b, 0xf5, 0x63, 0x49, 0xee, 0xd6, 0x10, 0x9d, - 0x43, 0x7d, 0xae, 0x08, 0xc1, 0xe5, 0xb0, 0x21, 0x1f, 0x6d, 0x5b, 0x91, - 0xb4, 0xb3, 0xe7, 0x76, 0x47, 0xb9, 0xb0, 0x4f, 0x13, 0xc3, 0x95, 0x26, - 0xbe, 0x3f, 0x0a, 0x27, 0xca, 0x87, 0x26, 0x6b, 0xdd, 0x7f, 0x57, 0x5d, - 0xf0, 0xef, 0xff, 0xf7, 0xa4, 0x87, 0x7f, 0x0c, 0xd2, 0xfe, 0xf1, 0xa4, - 0x98, 0x23, 0xe8, 0xc8, 0x3b, 0x55, 0x00, 0x3c, 0x11, 0x57, 0x45, 0x8d, - 0x64, 0x1b, 0xd2, 0x40, 0xb7, 0xa0, 0x52, 0x95, 0x07, 0x25, 0x6a, 0xad, - 0x76, 0xdd, 0xf3, 0x72, 0xa7, 0xb5, 0x4d, 0x2a, 0xb2, 0x14, 0xe5, 0x58, - 0xef, 0xba, 0x47, 0x35, 0x31, 0x2e, 0x6f, 0xc0, 0xe8, 0x2d, 0x75, 0x44, - 0x18, 0xd9, 0xbc, 0x89, 0x1b, 0x18, 0x9b, 0xa3, 0x69, 0x1b, 0x3f, 0x76, - 0xe4, 0x33, 0x19, 0xb4, 0x57, 0xcb, 0x8b, 0x60, 0xa0, 0xd5, 0x7c, 0x79, - 0x57, 0x6d, 0x2e, 0x22, 0x8c, 0x8e, 0xbf, 0xb4, 0x0a, 0xc9, 0x9a, 0x95, - 0x46, 0x0c, 0x97, 0x8f, 0xce, 0x65, 0x17, 0x36, 0xc5, 0x52, 0xf8, 0xdb, - 0x90, 0x91, 0xb0, 0xdb, 0x5b, 0xfe, 0x35, 0x17, 0x89, 0x82, 0xf2, 0xdd, - 0x10, 0xe9, 0x60, 0xfa, 0x23, 0xf3, 0x36, 0x25, 0xbf, 0xd3, 0x17, 0x62, - 0x06, 0x8a, 0x53, 0x5a, 0x10, 0xad, 0x6b, 0x36, 0x12, 0x5b, 0x0e, 0x5a, - 0x4e, 0xc0, 0x56, 0xa6, 0x90, 0x06, 0x2b, 0xe2, 0x15, 0x1c, 0xe2, 0xeb, - 0x89, 0xe2, 0x4b, 0xee, 0x4d, 0x92, 0x56, 0x04, 0xf2, 0x45, 0x54, 0x80, - 0x0b, 0x48, 0x67, 0x77, 0xe6, 0x25, 0x9b, 0x17, 0xf7, 0x54, 0x13, 0x1b, - 0xe3, 0x49, 0x1f, 0x82, 0x73, 0x0b, 0x09, 0xc4, 0x9e, 0x86, 0xfd, 0xa1, - 0x6f, 0xf9, 0x79, 0x0c, 0xb5, 0x59, 0x5a, 0x50, 0x1f, 0xae, 0x30, 0x11, - 0x2d, 0x1e, 0x29, 0x75, 0xe9, 0x2d, 0x56, 0x04, 0x5e, 0xe4, 0xae, 0x04, - 0x69, 0x0b, 0xcb, 0x64, 0x00, 0xf5, 0x6c, 0x2a, 0x5d, 0x8a, 0xda, 0xa4, - 0x1e, 0x9c, 0xa6, 0x23, 0xe5, 0xdc, 0x2a, 0x84, 0xab, 0xb1, 0x05, 0x71, - 0x90, 0xf4, 0x60, 0x52, 0x7d, 0x92, 0x22, 0xa1, 0xe1, 0x3b, 0x3f, 0xce, - 0xc5, 0xa9, 0x24, 0x50, 0x70, 0x43, 0x7e, 0x62, 0x21, 0x3f, 0xcf, 0x30, - 0x08, 0x13, 0x96, 0xf5, 0xc6, 0x7c, 0x99, 0x6b, 0x22, 0x42, 0x1e, 0xc1, - 0xe6, 0xf8, 0xbf, 0x28, 0x06, 0x89, 0xd5, 0xce, 0x21, 0x5b, 0xda, 0xe5, - 0xe7, 0x02, 0x07, 0x0e, 0x7c, 0x20, 0x24, 0x8a, 0x13, 0x0d, 0x5a, 0x1b, - 0xc5, 0xb3, 0xe0, 0xcf, 0x56, 0xad, 0xd8, 0x8b, 0x54, 0x9f, 0x54, 0x7a, - 0x9b, 0xce, 0x56, 0x43, 0xe7, 0x50, 0x1b, 0x44, 0xed, 0xbc, 0xd3, 0x06, - 0x76, 0x20, 0x9f, 0xb5, 0xb6, 0xda, 0xfa, 0xd8, 0x4e, 0x18, 0xb1, 0x36, - 0xb8, 0x8f, 0x56, 0xb4, 0xea, 0xa7, 0x60, 0xa0, 0x74, 0x14, 0x45, 0xd1, - 0xf8, 0xd3, 0x92, 0xf0, 0x6c, 0xc9, 0xcf, 0xc0, 0x04, 0xe9, 0x75, 0xcf, - 0x87, 0x76, 0x31, 0x55, 0xc0, 0x9c, 0xad, 0x16, 0xb8, 0x7d, 0x64, 0x2d, - 0xb0, 0xcb, 0x7f, 0xe6, 0xb0, 0x97, 0x38, 0x38, 0x37, 0x02, 0xaf, 0xa7, - 0x01, 0xd9, 0x6d, 0xcc, 0xa8, 0xff, 0x91, 0x0a, 0xd2, 0x7a, 0xce, 0xb4, - 0xd4, 0xd3, 0xdc, 0xae, 0xab, 0xe0, 0x92, 0x23, 0x07, 0xad, 0x29, 0xb4, - 0x6c, 0xe8, 0x55, 0xf0, 0x45, 0x1a, 0x3d, 0x81, 0x29, 0x7d, 0xd8, 0x9b, - 0x57, 0x43, 0x2d, 0x54, 0x5d, 0x95, 0xee, 0xd9, 0x73, 0x9b, 0x23, 0x89, - 0x47, 0x9e, 0x01, 0x12, 0xf6, 0x29, 0xe3, 0xb8, 0x78, 0x62, 0x80, 0x80, - 0x78, 0x08, 0xac, 0x9c, 0x54, 0x5a, 0x8b, 0x17, 0x29, 0xd3, 0x69, 0x94, - 0xa6, 0x4b, 0xfa, 0xeb, 0x2f, 0xde, 0x64, 0xb4, 0xe8, 0x90, 0x73, 0xa7, - 0x1f, 0xcf, 0xe1, 0x03, 0xd9, 0x65, 0xfb, 0xff, 0xd4, 0x2f, 0x00, 0x81, - 0xa8, 0x0d, 0x13, 0x3e, 0x71, 0x04, 0xd6, 0x04, 0xfc, 0x19, 0x8b, 0x62, - 0x9a, 0xdc, 0x97, 0x6c, 0x32, 0x49, 0x93, 0xd5, 0x1c, 0x8b, 0x79, 0x07, - 0x02, 0xc3, 0x58, 0x88, 0x98, 0x18, 0xb1, 0x54, 0x3b, 0x4b, 0xfe, 0xc6, - 0xe4, 0x2b, 0xe0, 0x05, 0xe4, 0x33, 0x77, 0xb6, 0x25, 0x0c, 0xa6, 0x90, - 0xe7, 0x9d, 0x98, 0x69, 0x1a, 0xe5, 0x36, 0x4e, 0x59, 0x53, 0xfa, 0x0c, - 0x23, 0xc3, 0x88, 0x5c, 0x0f, 0xa9, 0x2c, 0xb4, 0x9b, 0xf3, 0xab, 0x39, - 0x2e, 0xe8, 0x2b, 0x4a, 0xca, 0x60, 0xa7, 0x6b, 0x74, 0x63, 0x37, 0x42, - 0x09, 0xde, 0x0c, 0xe5, 0xea, 0xff, 0x0f, 0xf0, 0xef, 0xcc, 0x8f, 0x20, - 0x8a, 0xe4, 0x34, 0xd3, 0x81, 0xa5, 0x37, 0xe1, 0xde, 0x35, 0x37, 0xc0, - 0xab, 0x64, 0x32, 0xc3, 0xeb, 0x33, 0xc9, 0xe1, 0x65, 0xf4, 0x62, 0xc6, - 0x71, 0x10, 0x31, 0xf7, 0x1d, 0xe3, 0x2c, 0x33, 0x1d, 0x7a, 0x1e, 0xfb, - 0x6e, 0x05, 0x51, 0x2e, 0x4c, 0xf1, 0xf1, 0xe5, 0x78, 0x84, 0x0c, 0xab, - 0xdf, 0xfa, 0xfc, 0xdd, 0xa3, 0x0f, 0x6f, 0xe5, 0xf1, 0x7d, 0xde, 0x72, - 0x03, 0x03, 0x61, 0xe2, 0x77, 0x71, 0xf2, 0x82, 0xad, 0x36, 0xcc, 0xa4, - 0xdd, 0x7c, 0x9d, 0x3c, 0x7c, 0x32, 0x9c, 0xbb, 0x89, 0x12, 0xfb, 0x77, - 0x2b, 0xb4, 0xd8, 0xc7, 0xd5, 0x01, 0x0b, 0xf8, 0x93, 0x91, 0x95, 0xf1, - 0xef, 0xc1, 0xa6, 0xde, 0x27, 0x40, 0x9b, 0x2c, 0xd3, 0x87, 0x9a, 0xfc, - 0xcd, 0xe0, 0x18, 0xcd, 0x90, 0x52, 0x09, 0x59, 0x0b, 0x39, 0xd7, 0x67, - 0xa9, 0xad, 0x50, 0x4f, 0x1f, 0x19, 0xe9, 0x3e, 0xa7, 0xda, 0x88, 0xe2, - 0xbd, 0x1f, 0xa7, 0x29, 0x6f, 0x87, 0x48, 0xca, 0x53, 0xf6, 0x4c, 0x46, - 0x8d, 0xdf, 0xbe, 0x00, 0x68, 0xc1, 0x52, 0x3d, 0x2c, 0x87, 0x95, 0x2f, - 0x90, 0x47, 0x43, 0x79, 0xeb, 0x14, 0x1d, 0x1e, 0x4f, 0x79, 0x9b, 0x39, - 0x7c, 0x38, 0xad, 0x56, 0x65, 0x9d, 0x05, 0xc6, 0x24, 0x34, 0x00, 0xb4, - 0x4a, 0x05, 0x5f, 0x86, 0x7d, 0x27, 0xbc, 0x3a, 0xd2, 0xde, 0x6b, 0xf3, - 0x10, 0x37, 0x8c, 0x8d, 0xcc, 0x3e, 0x26, 0xfd, 0xe4, 0xfd, 0xd9, 0x86, - 0x5f, 0x85, 0x09, 0xfd, 0x8d, 0x1d, 0x8e, 0xec, 0xeb, 0x0f, 0xed, 0x8f, - 0x50, 0x80, 0xe7, 0x88, 0xa1, 0x5c, 0xe0, 0x1f, 0x8e, 0x00, 0x03, 0x3e, - 0x22, 0x9e, 0x9e, 0x1c, 0x92, 0x12, 0x8f, 0x3c, 0xed, 0x81, 0xbc, 0x1f, - 0x99, 0x05, 0xdd, 0x3e, 0x38, 0x28, 0x7e, 0xee, 0xc5, 0x13, 0xc3, 0x13, - 0x8d, 0xfc, 0xcf, 0xff, 0x62, 0x4a, 0x1a, 0x45, 0x92, 0x56, 0xa2, 0x8d, - 0x22, 0xbf, 0xff, 0x39, 0x55, 0x47, 0xa6, 0x46, 0xd7, 0xc4, 0x51, 0x9d, - 0x4a, 0x8c, 0x0a, 0x1f, 0xa9, 0x98, 0xd0, 0x6d, 0x40, 0x37, 0x9c, 0x77, - 0x4e, 0x66, 0x0c, 0xe1, 0xcc, 0x34, 0x89, 0x90, 0xe7, 0x03, 0x60, 0x4a, - 0xaa, 0x4f, 0x7e, 0xd5, 0xd9, 0x70, 0x7f, 0x93, 0x68, 0xf6, 0x2c, 0x45, - 0x45, 0x0f, 0x0f, 0xa6, 0xb8, 0xbb, 0x3c, 0xff, 0xcd, 0xec, 0x3a, 0xa3, - 0x01, 0x27, 0xb2, 0x57, 0x9a, 0x71, 0x8b, 0x0e, 0xb8, 0x33, 0xfa, 0x97, - 0x89, 0x50, 0xda, 0xe1, 0x02, 0x50, 0xbe, 0xea, 0xfb, 0x64, 0x04, 0x4a, - 0xf9, 0xcb, 0x49, 0x42, 0x4e, 0xf5, 0x44, 0x9e, 0x2a, 0x35, 0xa0, 0x29, - 0x30, 0xba, 0xcc, 0x92, 0x1b, 0x9e, 0x0a, 0x38, 0xb4, 0xb1, 0x22, 0x3a, - 0x75, 0xde, 0x8d, 0xa5, 0x5d, 0xe4, 0xfb, 0x0c, 0xca, 0x80, 0xa9, 0x33, - 0x58, 0x5d, 0x39, 0x77, 0x78, 0x88, 0x21, 0xb6, 0x6e, 0xfe, 0x22, 0xeb, - 0xa4, 0xdb, 0x4f, 0xf2, 0xd1, 0xbc, 0x10, 0x97, 0x7a, 0xf4, 0x32, 0x70, - 0x45, 0xe7, 0x88, 0x38, 0xb8, 0x8d, 0x12, 0xcf, 0x9d, 0xec, 0xf8, 0xd9, - 0x42, 0xeb, 0x9d, 0xfc, 0x2a, 0xe9, 0xa4, 0xeb, 0xd6, 0x13, 0xdd, 0x1c, - 0x58, 0x27, 0xfc, 0xb7, 0x1a, 0x78, 0x1f, 0x12, 0x81, 0xc0, 0xb4, 0xdd, - 0x73, 0x71, 0xa9, 0x84, 0x93, 0xb0, 0x9d, 0x95, 0xf5, 0x86, 0x8c, 0x3f, - 0xf1, 0x70, 0x6a, 0xf0, 0x39, 0xdd, 0x5f, 0x0f, 0x29, 0xd2, 0xda, 0x2d, - 0xc0, 0x45, 0xcb, 0x0e, 0x2b, 0xa7, 0x71, 0x22, 0x74, 0xd1, 0xc0, 0x83, - 0x10, 0xe5, 0xcd, 0x1b, 0xdd, 0x4d, 0x8a, 0xae, 0x97, 0xe6, 0x06, 0xe2, - 0x67, 0x75, 0xfe, 0x6f, 0xf7, 0x8c, 0xd9, 0xfe, 0x40, 0x1f, 0xc2, 0xd8, - 0x30, 0x07, 0x9b, 0x4a, 0x82, 0xf6, 0x61, 0xbf, 0xaa, 0x89, 0xd7, 0x60, - 0xb9, 0x94, 0x13, 0xe5, 0x09, 0x93, 0xda, 0xee, 0x06, 0x0a, 0x2e, 0xa1, - 0x5c, 0xd8, 0x2d, 0xa5, 0x8c, 0x49, 0x39, 0x71, 0xa5, 0xba, 0xe8, 0xcd, - 0x52, 0x59, 0xc5, 0xe1, 0x02, 0x03, 0x0e, 0xa0, 0xf5, 0x82, 0xe8, 0x34, - 0xbe, 0xf6, 0xf0, 0xf3, 0x1e, 0x25, 0x11, 0x38, 0x55, 0x2b, 0x25, 0xda, - 0x82, 0xd8, 0x87, 0x17, 0x56, 0x8a, 0xac, 0x8b, 0x73, 0x62, 0x98, 0x7c, - 0x60, 0xe1, 0x9e, 0xb3, 0xff, 0xc7, 0xc9, 0x65, 0x80, 0x2e, 0x6e, 0x04, - 0xae, 0xaf, 0x9a, 0x9c, 0x12, 0x77, 0xc2, 0x09, 0x3a, 0xf5, 0x90, 0x77, - 0xcc, 0xe4, 0x24, 0x1f, 0x17, 0xe0, 0x82, 0xb7, 0x81, 0x1e, 0xc6, 0x98, - 0xdf, 0x51, 0x7c, 0xaa, 0x80, 0x31, 0x80, 0xf0, 0xd9, 0xa7, 0x1b, 0x21, - 0x5a, 0xf3, 0x32, 0x55, 0x86, 0x41, 0x48, 0xe3, 0x43, 0x1e, 0x28, 0xe4, - 0x53, 0xcd, 0xc9, 0x97, 0xbb, 0x6e, 0xc1, 0xcc, 0xf0, 0x07, 0xa2, 0xbb, - 0x92, 0xc0, 0x86, 0xe5, 0x81, 0x8d, 0x4c, 0xe4, 0xf7, 0xb4, 0xeb, 0xaf, - 0x2a, 0xaf, 0x84, 0x91, 0xd6, 0x77, 0x6e, 0x9c, 0x33, 0xd6, 0x1e, 0x3a, - 0x5c, 0x47, 0xa9, 0x28, 0x42, 0x6a, 0x13, 0xc6, 0x85, 0x72, 0x2f, 0x1c, - 0x33, 0x0a, 0x8c, 0x0f, 0x15, 0xc3, 0xe2, 0x2b, 0xbe, 0x68, 0xc5, 0x0c, - 0x8a, 0x64, 0x4a, 0x3a, 0xeb, 0x32, 0xf8, 0xc8, 0xc6, 0xd9, 0x31, 0xce, - 0x90, 0x1b, 0x10, 0xaf, 0x15, 0x68, 0xd2, 0x86, 0x7e, 0xab, 0x98, 0xa3, - 0xd0, 0x6d, 0xf3, 0xaf, 0x91, 0x74, 0xe0, 0xee, 0x43, 0xcb, 0x84, 0x56, - 0x50, 0x70, 0x54, 0x73, 0xdb, 0xc9, 0xf0, 0x7f, 0x06, 0x15, 0xba, 0x5c, - 0x46, 0xb8, 0x4d, 0x50, 0x7e, 0x81, 0xaf, 0xc9, 0x03, 0x4f, 0xb0, 0x2d, - 0x41, 0x37, 0xa3, 0x71, 0x81, 0x75, 0xdc, 0x40, 0xbb, 0xc5, 0xa3, 0x09, - 0x2a, 0xcf, 0x67, 0x90, 0x72, 0x92, 0x5d, 0x18, 0xff, 0x93, 0xfe, 0xce, - 0x0f, 0x2f, 0x46, 0xd4, 0x3b, 0xb3, 0x15, 0x1c, 0xcf, 0x88, 0xf9, 0x19, - 0x2b, 0x8d, 0x0b, 0x7a, 0x5b, 0x76, 0xe7, 0x6c, 0xc4, 0x12, 0xfc, 0x30, - 0xd1, 0xce, 0xc0, 0x7a, 0xc1, 0xe3, 0xe7, 0xf0, 0xe3, 0x1d, 0xfe, 0x22, - 0x15, 0x22, 0xd5, 0x0c, 0x45, 0xb3, 0x78, 0x23, 0xb6, 0x53, 0x22, 0x9e, - 0xd9, 0xd1, 0xa7, 0x26, 0xdc, 0x5b, 0x97, 0x0b, 0x5d, 0x85, 0x93, 0xab, - 0x45, 0xc6, 0x0b, 0xfb, 0xc3, 0x0a, 0x0f, 0x47, 0x20, 0xe7, 0x84, 0x81, - 0xfa, 0xbe, 0x99, 0xda, 0x72, 0x8c, 0x2d, 0xd2, 0x69, 0x67, 0xb0, 0xbb, - 0x5b, 0x76, 0xff, 0x21, 0xa9, 0xd9, 0x73, 0x46, 0x70, 0x86, 0x8b, 0xfc, - 0x83, 0x9e, 0x72, 0x3e, 0x40, 0xd2, 0x45, 0x89, 0x0f, 0xf2, 0x7e, 0xca, - 0xcd, 0x0d, 0x1e, 0x63, 0x04, 0x30, 0x34, 0xd9, 0x9a, 0x9c, 0xd2, 0x2c, - 0x72, 0x53, 0x7c, 0x39, 0xf7, 0x69, 0xb2, 0xd5, 0x80, 0xd0, 0x8c, 0xc0, - 0x82, 0x55, 0x29, 0x68, 0x6e, 0x90, 0xc6, 0x47, 0xd8, 0x3e, 0x0e, 0xaa, - 0x96, 0xf4, 0xa1, 0x5b, 0x1f, 0x62, 0x76, 0xdc, 0x76, 0xfe, 0x53, 0x8a, - 0xc9, 0xd9, 0xb3, 0x16, 0x9e, 0xc5, 0x6b, 0xa7, 0xbe, 0x87, 0x40, 0xa9, - 0x2f, 0x5a, 0x9f, 0x5f, 0x4d, 0xc3, 0xea, 0xc2, 0x68, 0x76, 0xec, 0x80, - 0x0c, 0xa5, 0x5b, 0x1a, 0x89, 0xaa, 0xac, 0xe5, 0x50, 0xf8, 0x1a, 0x90, - 0x5a, 0x37, 0xbe, 0x7b, 0xf8, 0xb8, 0x9f, 0x1b, 0xad, 0xd6, 0xc6, 0x17, - 0x99, 0xf5, 0x1d, 0x2e, 0xb6, 0x5d, 0x29, 0x27, 0xd4, 0xba, 0xc4, 0x23, - 0x66, 0x8a, 0x03, 0x11, 0xeb, 0x67, 0x41, 0x11, 0x41, 0xf3, 0x76, 0xda, - 0xc2, 0xe4, 0xed, 0xea, 0xfe, 0x4a, 0x53, 0xc8, 0x40, 0xd9, 0x97, 0x33, - 0xe3, 0xb9, 0x37, 0x57, 0x60, 0xfb, 0x24, 0x50, 0xb8, 0x8f, 0x41, 0x5a, - 0x53, 0x14, 0x40, 0xcf, 0x4b, 0x0e, 0xfa, 0x95, 0x81, 0x01, 0x02, 0xc7, - 0x13, 0x91, 0x30, 0xf2, 0x2c, 0x43, 0xba, 0x25, 0xfa, 0x30, 0xd8, 0xc5, - 0xc8, 0x36, 0x09, 0xca, 0xea, 0x9e, 0x43, 0xbb, 0xf0, 0x87, 0xe3, 0x1e, - 0x50, 0xae, 0x5e, 0x7c, 0x7c, 0xc1, 0xd8, 0xbf, 0xe8, 0x30, 0xba, 0xf3, - 0x49, 0xe1, 0x8d, 0xf1, 0x11, 0x7c, 0xd8, 0xf0, 0xe1, 0x1d, 0xa4, 0x85, - 0xb0, 0x0e, 0xd8, 0xff, 0x13, 0x7e, 0x11, 0x8f, 0x86, 0xc3, 0xc6, 0x8b, - 0x15, 0x42, 0x53, 0xbb, 0x98, 0xfa, 0x5d, 0x38, 0x9a, 0x34, 0x6a, 0x2a, - 0xf0, 0xac, 0x3a, 0x22, 0xf5, 0x3a, 0x0e, 0x56, 0xed, 0xde, 0x5f, 0x83, - 0xe1, 0xb2, 0xa2, 0xd2, 0x25, 0x17, 0xec, 0xe1, 0x43, 0x33, 0x45, 0xca, - 0xc2, 0xf2, 0xc6, 0xc3, 0xd0, 0xd0, 0x2e, 0xa3, 0x08, 0x46, 0x38, 0xd3, - 0xb3, 0x86, 0x10, 0x46, 0xda, 0x82, 0xcd, 0xa9, 0xcd, 0x0c, 0x2b, 0xbb, - 0x97, 0x7a, 0xa2, 0xaa, 0x51, 0x4f, 0x51, 0xcd, 0x23, 0xdd, 0xe0, 0x6f, - 0xd9, 0x3f, 0x57, 0x0e, 0xee, 0x3d, 0x85, 0xf4, 0xee, 0x5b, 0xeb, 0xea, - 0xf0, 0xe7, 0x65, 0xca, 0x9c, 0xbc, 0x0b, 0x39, 0x9d, 0xb6, 0x09, 0xb1, - 0xa3, 0x12, 0x7b, 0xd9, 0x45, 0xf7, 0x9a, 0x6f, 0xeb, 0xb2, 0x59, 0x6b, - 0xf5, 0x97, 0x71, 0xf5, 0x17, 0x20, 0xd3, 0x1b, 0x3d, 0xa4, 0x25, 0x51, - 0x91, 0xfd, 0xd5, 0xce, 0xac, 0x7f, 0x55, 0x2d, 0x1a, 0x5b, 0x0c, 0x77, - 0x74, 0xb8, 0x95, 0x3c, 0x3d, 0xf5, 0x87, 0xe0, 0xd4, 0x0c, 0xf0, 0x0f, - 0x3e, 0xbc, 0x6b, 0xa5, 0xb1, 0x7f, 0x7d, 0x7c, 0xe3, 0xd5, 0x97, 0x0a, - 0x1b, 0x0b, 0x17, 0xd5, 0x2b, 0x30, 0x24, 0xa4, 0x93, 0x29, 0x2a, 0x58, - 0xc3, 0x21, 0xc8, 0x32, 0x33, 0x44, 0x81, 0xb6, 0x57, 0x09, 0x30, 0x2e, - 0xd5, 0x2e, 0x5a, 0x84, 0x66, 0xc8, 0xc7, 0x1b, 0x2f, 0xa7, 0xdb, 0x59, - 0xab, 0x0b, 0xf3, 0x95, 0x75, 0x7b, 0xcd, 0x3f, 0x5e, 0x5d, 0xa7, 0x85, - 0x6c, 0xee, 0xe7, 0x71, 0x85, 0xaf, 0xef, 0xec, 0x86, 0x7d, 0xf8, 0x27, - 0x73, 0xbb, 0x7a, 0x55, 0x34, 0x78, 0x37, 0x89, 0x19, 0x65, 0xac, 0x09, - 0x4a, 0x06, 0x25, 0x18, 0x9d, 0x20, 0xd2, 0x39, 0x0a, 0xc7, 0xb0, 0xd6, - 0xaa, 0xa8, 0x45, 0x75, 0x90, 0xcb, 0xc2, 0xee, 0xa8, 0x48, 0x72, 0x6c, - 0xd5, 0xf1, 0xa7, 0x5b, 0x7b, 0x08, 0x4e, 0x7c, 0x3b, 0xdc, 0x89, 0x9a, - 0xde, 0x49, 0x04, 0x37, 0xac, 0xb4, 0x16, 0xdd, 0xdb, 0x81, 0xf6, 0xb5, - 0x3f, 0x3d, 0x56, 0x80, 0xd3, 0x8b, 0x9b, 0xd3, 0x0f, 0x10, 0x32, 0x67, - 0x7f, 0x06, 0xfb, 0xb9, 0x9d, 0xb5, 0x00, 0x37, 0x37, 0xb6, 0x28, 0x2d, - 0x06, 0x84, 0x88, 0x75, 0x47, 0xc3, 0x22, 0x36, 0x03, 0xf7, 0x4d, 0xe9, - 0xf5, 0x01, 0xdb, 0x3b, 0x68, 0xb6, 0x38, 0x43, 0xc1, 0xff, 0x2a, 0x5b, - 0x79, 0x0c, 0x48, 0x11, 0xa9, 0x6f, 0x9b, 0x3c, 0x13, 0x80, 0xf9, 0x02, - 0xdb, 0xc4, 0xdd, 0x2d, 0xba, 0x7e, 0xc0, 0x91, 0x24, 0x2e, 0xb1, 0x66, - 0x15, 0xe4, 0x90, 0x10, 0x70, 0xfc, 0x28, 0x07, 0x09, 0x09, 0x26, 0x44, - 0xcf, 0xf8, 0xb7, 0x49, 0x3c, 0x70, 0xdf, 0x1f, 0xb7, 0xb0, 0x7e, 0xb3, - 0xa6, 0x8d, 0x6c, 0x4b, 0xb4, 0xce, 0xad, 0x15, 0xae, 0xd8, 0xb0, 0x29, - 0xf8, 0x3a, 0x8c, 0x51, 0xf1, 0xe6, 0xc1, 0xba, 0x82, 0xf0, 0xdc, 0x0f, - 0x47, 0x3c, 0x05, 0xce, 0xe6, 0xf4, 0xd0, 0x9d, 0x82, 0xd4, 0x1f, 0xd8, - 0xc0, 0x39, 0xcc, 0x61, 0x24, 0xd0, 0x19, 0xaf, 0xe5, 0x46, 0x90, 0x18, - 0xaf, 0x07, 0x2b, 0x9d, 0x5a, 0x49, 0xb2, 0x2d, 0xe8, 0xb1, 0x00, 0xd0, - 0xd8, 0x41, 0xe7, 0x68, 0xb6, 0x6c, 0x5a, 0x03, 0x96, 0xfa, 0x51, 0xd6, - 0xa9, 0x4d, 0xf6, 0xf2, 0xbe, 0xd6, 0xa2, 0xf9, 0xf4, 0x17, 0x83, 0xd3, - 0xa5, 0x1c, 0x6a, 0xd9, 0x81, 0x4a, 0x76, 0xdf, 0x38, 0xb1, 0x6b, 0xc6, - 0x0a, 0x6c, 0xa2, 0x6a, 0x2b, 0x6e, 0xb5, 0x69, 0xa9, 0x53, 0x7f, 0xe0, - 0x52, 0xa7, 0xeb, 0xa8, 0x8d, 0x42, 0x23, 0x1e, 0x4b, 0x3e, 0xbf, 0x90, - 0xb7, 0x46, 0x38, 0x21, 0xb6, 0x9e, 0xa2, 0xaa, 0x84, 0x7c, 0x73, 0x5b, - 0x8f, 0x58, 0x5d, 0x00, 0xf6, 0xfd, 0xbe, 0x19, 0x5b, 0xa3, 0x4d, 0x73, - 0x0c, 0x6d, 0x08, 0x81, 0x70, 0x66, 0x15, 0x42, 0x18, 0xba, 0xa2, 0xc4, - 0x27, 0x71, 0x3e, 0xea, 0x18, 0x64, 0x32, 0x36, 0x89, 0xa3, 0xaf, 0xe6, - 0x80, 0xe5, 0xaf, 0x0e, 0x53, 0x0e, 0x1c, 0x00, 0x47, 0x2c, 0xa9, 0xa3, - 0x04, 0x6d, 0x19, 0x49, 0xcb, 0x06, 0xd0, 0x8f, 0x47, 0x16, 0x57, 0xec, - 0x54, 0x41, 0x6e, 0xe5, 0xcf, 0xf4, 0x7d, 0x1b, 0x3b, 0xef, 0x97, 0x25, - 0x31, 0x8d, 0xd0, 0xd7, 0x9e, 0xbf, 0xea, 0x2d, 0xb6, 0xbd, 0x85, 0x8a, - 0x29, 0x20, 0xe2, 0xc0, 0xb1, 0xbd, 0x28, 0x17, 0x0b, 0x8d, 0x94, 0x19, - 0x3e, 0x69, 0x57, 0x64, 0xda, 0xc6, 0x8e, 0xce, 0x5d, 0xe6, 0x4b, 0xd7, - 0xe3, 0xcd, 0x45, 0x9a, 0x59, 0xbd, 0xc7, 0xd4, 0xe5, 0x52, 0x99, 0x66, - 0x90, 0xf5, 0x79, 0x41, 0x4b, 0xe2, 0xcf, 0xa4, 0x88, 0x0f, 0x52, 0xe8, - 0x02, 0x55, 0x67, 0xbf, 0xe2, 0xba, 0x80, 0xee, 0xab, 0xd5, 0x7a, 0x51, - 0x50, 0x6c, 0xe7, 0xc2, 0x8d, 0xdb, 0xa2, 0xdf, 0xe1, 0x00, 0xa0, 0xc7, - 0xb8, 0x73, 0x48, 0x2d, 0xc2, 0xd5, 0x75, 0xe6, 0x0f, 0xb9, 0x9c, 0xd1, - 0xa6, 0xee, 0xe9, 0x4f, 0xa1, 0x25, 0xbf, 0x1a, 0x9c, 0xec, 0x8a, 0xca, - 0xf5, 0xb2, 0x4f, 0xdf, 0x98, 0x9b, 0xf8, 0xe1, 0xdb, 0xb5, 0x67, 0x2e, - 0xa5, 0x00, 0x55, 0x91, 0xef, 0xea, 0x08, 0xf4, 0xf0, 0xf9, 0x4b, 0x31, - 0xca, 0x5e, 0x4a, 0x34, 0x86, 0x72, 0x1b, 0x89, 0xb3, 0xc7, 0x60, 0x37, - 0x96, 0xbc, 0x5f, 0x15, 0xf5, 0x42, 0xfc, 0x93, 0xb7, 0x4e, 0x19, 0x76, - 0x12, 0x67, 0xc0, 0xa6, 0x3a, 0x36, 0x18, 0xd9, 0xa1, 0x61, 0x9a, 0xf3, - 0xde, 0xae, 0x36, 0x61, 0xcf, 0x15, 0x6a, 0xa8, 0xa3, 0xa5, 0xd4, 0x43, - 0x46, 0x58, 0x24, 0xe0, 0x5e, 0xab, 0x23, 0x9a, 0xc6, 0x63, 0x57, 0xf3, - 0x6f, 0x94, 0x6d, 0x41, 0x7b, 0x8a, 0x52, 0x0f, 0x07, 0x79, 0xbf, 0xc4, - 0x79, 0xdb, 0x5f, 0x1e, 0x4b, 0x78, 0x0c, 0xcc, 0x05, 0x1a, 0x25, 0x0c, - 0x5d, 0x53, 0x06, 0x60, 0x47, 0x54, 0xc3, 0xc9, 0x54, 0xd0, 0xdb, 0x0e, - 0x22, 0x89, 0x8b, 0xf5, 0xc3, 0x96, 0x52, 0xfa, 0xd3, 0xb6, 0x20, 0x89, - 0xe8, 0xcc, 0xc3, 0x69, 0x4a, 0x6e, 0x34, 0x47, 0xdb, 0xac, 0x11, 0xb2, - 0xc3, 0x4b, 0xb0, 0xfd, 0xe4, 0x3b, 0xfd, 0xaf, 0x30, 0x3f, 0x93, 0x11, - 0x80, 0xa3, 0x4d, 0x50, 0xc4, 0x55, 0xdc, 0x3a, 0xa3, 0xbe, 0x68, 0xc0, - 0x59, 0x39, 0xc3, 0xdb, 0x1d, 0x24, 0xdc, 0x63, 0xe4, 0xf2, 0x1f, 0x72, - 0x24, 0xa7, 0x4a, 0x39, 0x53, 0x5b, 0x0d, 0x9e, 0x13, 0x2f, 0xb1, 0xaf, - 0x64, 0x6c, 0x2d, 0x4b, 0xb9, 0x9f, 0x1e, 0x77, 0xc6, 0x6d, 0x67, 0xae, - 0x96, 0x31, 0xb5, 0xc0, 0xb8, 0xdb, 0x7f, 0x45, 0x9b, 0xf8, 0xf0, 0xc1, - 0x0a, 0x58, 0x76, 0xfa, 0x17, 0x70, 0x8e, 0xc5, 0x2e, 0x84, 0x97, 0x28, - 0x3b, 0x82, 0x18, 0x29, 0x60, 0x07, 0x04, 0x5f, 0x56, 0x2b, 0x13, 0xc7, - 0xd8, 0xb8, 0x92, 0x6d, 0x7e, 0x7f, 0xdf, 0x3d, 0xcb, 0x7f, 0x6e, 0x60, - 0xe2, 0xa2, 0xdb, 0x69, 0xdf, 0x18, 0x21, 0x24, 0x7c, 0x2b, 0x07, 0x8a, - 0x60, 0xc5, 0x40, 0xcd, 0x16, 0x37, 0x64, 0x1e, 0x3f, 0x9b, 0x41, 0xae, - 0xa9, 0xed, 0x61, 0x30, 0x28, 0x3f, 0xb0, 0xa2, 0x53, 0x0a, 0x14, 0x97, - 0x9e, 0xb2, 0x49, 0xbd, 0xf7, 0x9a, 0x4f, 0x48, 0x7f, 0xbb, 0x12, 0x70, - 0xc1, 0xbb, 0x7e, 0x22, 0x33, 0x3d, 0x7b, 0x76, 0x3f, 0x1c, 0xc4, 0xbc, - 0x45, 0x71, 0x0d, 0x1e, 0x47, 0xf3, 0xbc, 0x8c, 0xb9, 0x27, 0x7f, 0xf0, - 0x66, 0xa4, 0x9a, 0x48, 0x70, 0x77, 0x87, 0x30, 0x32, 0x9e, 0x60, 0x22, - 0xd5, 0xcf, 0xfd, 0x36, 0x36, 0x3e, 0x0d, 0x66, 0xde, 0x3e, 0x78, 0xd6, - 0x81, 0x7a, 0x31, 0xde, 0xb6, 0xee, 0x71, 0x87, 0x8c, 0xe3, 0x89, 0x7a, - 0x6e, 0x3e, 0x11, 0x3e, 0x9a, 0x76, 0xcc, 0x9b, 0x18, 0xa4, 0xe0, 0xbe, - 0x95, 0x8b, 0x88, 0xc0, 0xeb, 0xcb, 0x8a, 0x81, 0xb2, 0xc2, 0x6c, 0x78, - 0x2b, 0x0c, 0x92, 0xbc, 0x92, 0xa5, 0x82, 0x18, 0xa8, 0x2b, 0x2f, 0x2b, - 0xef, 0xbd, 0x72, 0xd9, 0x08, 0x4f, 0x19, 0x84, 0xfe, 0x9e, 0x2d, 0x54, - 0xb9, 0x10, 0x49, 0x68, 0x33, 0xfc, 0x90, 0x70, 0x28, 0x0f, 0x5d, 0xe7, - 0xd5, 0x83, 0x2e, 0xd3, 0xaa, 0x4f, 0x9a, 0x2f, 0xb8, 0x84, 0x97, 0xef, - 0x9a, 0xe2, 0xe4, 0x0a, 0x78, 0xfd, 0x24, 0x3c, 0x9b, 0xd8, 0x1c, 0xb8, - 0xbe, 0x48, 0x68, 0xe4, 0x5b, 0x80, 0x89, 0xdc, 0xa2, 0x97, 0xb5, 0xd2, - 0x74, 0xf4, 0x9d, 0x21, 0xe9, 0x82, 0xfa, 0x49, 0x04, 0xd9, 0x22, 0xb6, - 0xf2, 0xce, 0xa6, 0x86, 0xc6, 0xbe, 0x71, 0x64, 0x89, 0x34, 0x93, 0xaf, - 0x8e, 0x6e, 0xc0, 0x5f, 0xdb, 0xdb, 0xdb, 0x37, 0x4e, 0x00, 0xff, 0xeb, - 0x96, 0xc8, 0xb2, 0xf3, 0x7d, 0x3a, 0xf7, 0xf8, 0xb4, 0x7a, 0x66, 0x38, - 0xeb, 0x8e, 0xcb, 0x0c, 0x0a, 0x50, 0xce, 0x8b, 0x3c, 0xc6, 0x3f, 0x71, - 0x78, 0x28, 0x15, 0xd3, 0x40, 0x15, 0xc2, 0x8c, 0x27, 0x2f, 0x3f, 0xb0, - 0xca, 0xe0, 0xf0, 0x73, 0xd7, 0xfe, 0xf3, 0x75, 0x00, 0x52, 0xfe, 0x3d, - 0xa6, 0x98, 0x1e, 0x82, 0xe9, 0x32, 0x10, 0x51, 0xc6, 0x73, 0xb9, 0x66, - 0x95, 0xcc, 0xf6, 0xdf, 0x94, 0x84, 0x32, 0x30, 0xc6, 0x3e, 0x9d, 0x94, - 0x0d, 0x82, 0x7e, 0x88, 0x51, 0x5d, 0xf0, 0x8b, 0x81, 0x6c, 0x7f, 0x33, - 0xb1, 0xb8, 0xbb, 0x31, 0x4c, 0x43, 0x07, 0x81, 0xd0, 0x24, 0x82, 0xb4, - 0xdf, 0x40, 0x1e, 0x43, 0x07, 0x1b, 0x4d, 0xb5, 0x7a, 0x91, 0x36, 0x53, - 0x6f, 0x4b, 0x4b, 0x00, 0xa4, 0xe0, 0x1b, 0x44, 0xd2, 0x0a, 0xaf, 0xa4, - 0x46, 0x61, 0xf4, 0xf4, 0x98, 0x26, 0x22, 0x34, 0xfd, 0x93, 0x22, 0x72, - 0x58, 0x3f, 0xde, 0xba, 0x27, 0x94, 0xb7, 0x65, 0x9e, 0x3d, 0x0c, 0xca, - 0x9f, 0x0f, 0xdd, 0xab, 0x5d, 0xc3, 0x2e, 0x36, 0x08, 0x99, 0x2a, 0x72, - 0x37, 0x40, 0x21, 0x22, 0xdb, 0xe0, 0x45, 0x21, 0x30, 0xf4, 0xd0, 0x2f, - 0x58, 0x60, 0x33, 0xa9, 0xf4, 0x34, 0xab, 0xea, 0x44, 0xc4, 0x51, 0xf8, - 0xf2, 0x67, 0xcc, 0x61, 0x03, 0x9f, 0x1f, 0x49, 0xd9, 0x03, 0x7c, 0x21, - 0xce, 0xc4, 0xf1, 0xb8, 0x28, 0xe8, 0x71, 0xe9, 0x7f, 0x9c, 0x62, 0x1c, - 0x1f, 0x88, 0x05, 0x26, 0xbb, 0xd5, 0x96, 0x1d, 0xfa, 0xd0, 0x9d, 0xc7, - 0x21, 0x23, 0x2b, 0x34, 0x40, 0x46, 0x53, 0x4d, 0xfc, 0x9f, 0xcb, 0xa8, - 0xda, 0xa9, 0x3e, 0xcc, 0x15, 0x15, 0x9b, 0x57, 0xad, 0xb0, 0xa6, 0x34, - 0x46, 0x39, 0x99, 0xd0, 0xf0, 0xf9, 0x89, 0x77, 0x65, 0xd8, 0x50, 0x35, - 0xc7, 0x4e, 0xae, 0x31, 0x14, 0x1c, 0xed, 0x71, 0x23, 0xf7, 0x81, 0x32, - 0x25, 0x99, 0xde, 0xef, 0xe3, 0x20, 0x6c, 0x9a, 0xcf, 0x8d, 0x8c, 0x19, - 0x51, 0xed, 0x6c, 0x9a, 0x5d, 0x80, 0x57, 0x70, 0x17, 0x12, 0x7b, 0x5d, - 0x6e, 0x2e, 0x45, 0xc6, 0x93, 0x5d, 0x0c, 0xaf, 0x12, 0xc8, 0x36, 0x3b, - 0xe5, 0xc7, 0x41, 0x7c, 0x08, 0x72, 0xbb, 0x1a, 0xa0, 0x6d, 0xd1, 0xa7, - 0xd4, 0xcc, 0x7d, 0x69, 0xfa, 0x65, 0xc9, 0x05, 0x47, 0x47, 0x55, 0xca, - 0x1d, 0x75, 0x92, 0x49, 0x34, 0xe7, 0xef, 0xe7, 0xee, 0x04, 0x82, 0x6b, - 0x2a, 0x74, 0x53, 0xc1, 0x3f, 0xb5, 0x60, 0x15, 0x4e, 0xaa, 0x2a, 0xb0, - 0x78, 0x43, 0xc4, 0xa7, 0x71, 0x07, 0x70, 0x83, 0x47, 0x4c, 0x39, 0x94, - 0xfa, 0x5f, 0x76, 0x0d, 0x0c, 0x03, 0xee, 0x1e, 0xad, 0xd2, 0x9e, 0xf8, - 0xd3, 0x69, 0xbb, 0xa1, 0xdc, 0xb0, 0x74, 0xdb, 0x32, 0x0f, 0x88, 0xe7, - 0x44, 0x26, 0xed, 0x5b, 0x21, 0xdc, 0xac, 0xd3, 0xf3, 0x91, 0xda, 0x8f, - 0xd2, 0x5c, 0xec, 0xc2, 0xcd, 0xd0, 0x78, 0x79, 0xa0, 0x1d, 0xa7, 0x35, - 0x45, 0x5b, 0xdc, 0xb9, 0x45, 0x02, 0x71, 0x08, 0x7f, 0xe9, 0xab, 0xa4, - 0xb7, 0x6c, 0x44, 0x68, 0x4a, 0x00, 0x68, 0x1e, 0xfd, 0xce, 0x11, 0xbd, - 0x91, 0x89, 0x6c, 0x21, 0x84, 0x54, 0x8c, 0xaf, 0x75, 0x60, 0xa2, 0xea, - 0xb6, 0x64, 0x15, 0x77, 0xbd, 0x1b, 0xb4, 0x3a, 0x4d, 0xdc, 0x6a, 0x6d, - 0x16, 0xa1, 0xf5, 0x7a, 0x98, 0xcc, 0x42, 0xa2, 0x49, 0xf8, 0x33, 0xd1, - 0xe7, 0x8a, 0xc9, 0xe7, 0x1d, 0x3c, 0x60, 0xb4, 0x73, 0x54, 0xa8, 0xd1, - 0xae, 0x55, 0x4d, 0x70, 0xb1, 0x04, 0xe7, 0xd1, 0x32, 0x0b, 0x16, 0x4d, - 0x36, 0xa2, 0x57, 0x88, 0x30, 0x8a, 0x1a, 0x01, 0x69, 0x29, 0xe7, 0x52, - 0x74, 0x16, 0x86, 0x15, 0x7b, 0x51, 0x4b, 0x18, 0xfa, 0x04, 0x66, 0x07, - 0x07, 0xd9, 0x5d, 0x62, 0x31, 0x78, 0x00, 0x6c, 0x69, 0xfa, 0xf1, 0x51, - 0x46, 0xb2, 0xac, 0x7c, 0x84, 0xbf, 0x6f, 0xce, 0xf9, 0xf6, 0x53, 0x7f, - 0x08, 0xc4, 0xb9, 0x1e, 0x56, 0x8d, 0xab, 0x9d, 0x5b, 0xb7, 0xeb, 0xf0, - 0x37, 0x9b, 0x86, 0x59, 0x80, 0x67, 0xde, 0x71, 0xf0, 0x46, 0xe1, 0x72, - 0x68, 0xd1, 0x04, 0x7b, 0x34, 0xdd, 0x07, 0xe1, 0xcd, 0x33, 0x88, 0xbf, - 0x37, 0x44, 0xfe, 0xe8, 0xd3, 0x56, 0xe4, 0x54, 0xc2, 0x86, 0x9c, 0xdb, - 0x3d, 0xaa, 0x16, 0x7b, 0x10, 0xd9, 0xd4, 0x56, 0x74, 0xda, 0xd0, 0x24, - 0x95, 0x49, 0xa1, 0x20, 0x71, 0xb2, 0xf3, 0x54, 0x65, 0x94, 0x00, 0xe3, - 0xd5, 0xb0, 0x49, 0xd7, 0xf1, 0x5c, 0x04, 0x01, 0x74, 0xb7, 0x2b, 0x54, - 0x57, 0x07, 0x0e, 0x1f, 0x46, 0x1f, 0xc0, 0xfd, 0xa2, 0xc8, 0x62, 0x13, - 0x55, 0x0a, 0xff, 0x46, 0x21, 0x64, 0x52, 0x69, 0xe3, 0x52, 0x90, 0x49, - 0xf4, 0x7d, 0xd6, 0xc7, 0x5c, 0xb1, 0xac, 0x88, 0x52, 0x41, 0x25, 0x41, - 0xce, 0xf9, 0xe0, 0x19, 0xe2, 0xd8, 0x90, 0x02, 0x45, 0x65, 0xa4, 0x26, - 0xee, 0xf9, 0x09, 0x1a, 0x83, 0xef, 0x25, 0x5a, 0x1c, 0xb6, 0xc3, 0x99, - 0x9d, 0xa3, 0x67, 0x63, 0x90, 0x39, 0xc5, 0x3e, 0xcb, 0x87, 0x43, 0x44, - 0x46, 0x7c, 0xb1, 0xea, 0x08, 0x31, 0x48, 0x43, 0x8a, 0xb5, 0x61, 0x10, - 0x52, 0xa5, 0x77, 0xb6, 0x6b, 0xa4, 0x0f, 0x5d, 0x60, 0x2a, 0xc2, 0x99, - 0x63, 0x0a, 0xfd, 0x07, 0xcc, 0x3b, 0xe5, 0x0d, 0x41, 0x02, 0x20, 0xdf, - 0x38, 0xb2, 0xcd, 0x52, 0x74, 0x6c, 0xce, 0x9c, 0x89, 0xe7, 0x0f, 0x0c, - 0x3c, 0x4f, 0x19, 0xb3, 0x67, 0xd1, 0x00, 0xde, 0x6b, 0x06, 0x12, 0x06, - 0x74, 0x77, 0x93, 0x69, 0xbb, 0x70, 0x65, 0xd9, 0xed, 0x87, 0x86, 0x51, - 0x7e, 0xa7, 0x8b, 0x6d, 0x30, 0x04, 0x37, 0xdf, 0x24, 0x21, 0x57, 0x68, - 0x7a, 0x65, 0x46, 0xab, 0xae, 0x82, 0xc2, 0x28, 0x27, 0x7f, 0xc9, 0xf4, - 0xbd, 0xe9, 0x7d, 0x36, 0x8c, 0x80, 0x5d, 0xaf, 0x6d, 0xee, 0x42, 0x86, - 0xf8, 0x49, 0x2d, 0xb9, 0x56, 0x04, 0xae, 0x10, 0x83, 0x3b, 0x85, 0x34, - 0x7e, 0xc2, 0x62, 0xaa, 0x11, 0x64, 0x02, 0x6d, 0xee, 0x94, 0x49, 0xef, - 0xe9, 0x69, 0x7a, 0x52, 0x94, 0x09, 0x1f, 0xd2, 0x96, 0x43, 0x1c, 0x66, - 0x56, 0x57, 0x0b, 0x35, 0x1d, 0x2a, 0x24, 0x1c, 0x4c, 0x5b, 0xba, 0xba, - 0x37, 0x9b, 0x49, 0x2e, 0xf7, 0x34, 0x8a, 0x9c, 0xc9, 0x6b, 0xeb, 0xcd, - 0x05, 0xe6, 0xfc, 0x72, 0xd3, 0x2b, 0x25, 0x80, 0x19, 0x4e, 0x8a, 0xc0, - 0xaa, 0xd6, 0x3e, 0xed, 0x2a, 0x99, 0x75, 0xf2, 0x07, 0xaf, 0xc9, 0xfb, - 0xf4, 0x44, 0x27, 0x67, 0xc3, 0x0e, 0x9c, 0x8c, 0xa4, 0x47, 0x1b, 0xed, - 0xa4, 0xc1, 0x47, 0x12, 0x62, 0x63, 0x5e, 0xdd, 0x18, 0xbc, 0x64, 0x4b, - 0xf7, 0x13, 0xc9, 0xe9, 0x57, 0x86, 0xc7, 0xe9, 0x04, 0x06, 0xd1, 0x9a, - 0x52, 0x6a, 0x03, 0x84, 0xe8, 0xcf, 0xa0, 0x22, 0xa9, 0xc0, 0xf7, 0x42, - 0x50, 0x99, 0x3b, 0x02, 0x2f, 0x44, 0x4d, 0x2e, 0xd1, 0x6b, 0x2c, 0xa2, - 0x49, 0x89, 0x36, 0x22, 0xe1, 0xad, 0xde, 0xab, 0x73, 0x80, 0x81, 0xd3, - 0x56, 0x8d, 0x2f, 0x00, 0xc1, 0xb4, 0x4b, 0x81, 0x44, 0x00, 0x4a, 0x8a, - 0xfd, 0x48, 0x21, 0x20, 0x73, 0x0d, 0x1b, 0x19, 0x4a, 0x1f, 0xa1, 0x2f, - 0x94, 0x8a, 0x60, 0xa2, 0xae, 0x8b, 0x1b, 0xab, 0x30, 0x47, 0x08, 0x39, - 0xcd, 0x67, 0xce, 0x36, 0x75, 0xea, 0xbc, 0x6a, 0xde, 0xfa, 0xb7, 0x62, - 0x6d, 0x7c, 0x35, 0x90, 0xb0, 0x3e, 0x7f, 0xb8, 0x2f, 0xf6, 0xd3, 0x90, - 0x0f, 0x7f, 0xbb, 0xe8, 0x60, 0x14, 0x2c, 0xb3, 0x83, 0xbc, 0x21, 0xa6, - 0x7c, 0x5c, 0xbd, 0x6f, 0x3b, 0xe6, 0x1e, 0x52, 0x6e, 0xfd, 0x92, 0x70, - 0x70, 0x97, 0x58, 0x27, 0x4b, 0x1e, 0xd1, 0x3f, 0xe0, 0x5b, 0x02, 0x1c, - 0x6b, 0xc2, 0xc8, 0x8d, 0xef, 0x61, 0x12, 0x26, 0x24, 0xb0, 0x51, 0xe7, - 0x13, 0x39, 0x21, 0xa2, 0x49, 0xc1, 0x31, 0x7d, 0x4b, 0x27, 0xa8, 0xf2, - 0xef, 0x00, 0xf5, 0x2d, 0x3d, 0xf4, 0x0e, 0x22, 0xf2, 0xf9, 0x0b, 0xa9, - 0xc0, 0xef, 0x27, 0x3a, 0xcd, 0x95, 0xcb, 0x22, 0xe6, 0xb1, 0xba, 0x8f, - 0x43, 0xb4, 0xbb, 0xf4, 0x11, 0x58, 0x83, 0x19, 0x21, 0xa2, 0xa0, 0x77, - 0x4f, 0x8f, 0x09, 0x72, 0xf4, 0xc2, 0xa5, 0x35, 0x6a, 0x42, 0xe5, 0x5e, - 0x83, 0xc9, 0x00, 0x35, 0x40, 0x3b, 0x3c, 0xa3, 0xc1, 0xc9, 0xe2, 0x67, - 0x1e, 0x05, 0x7d, 0x0d, 0x33, 0x5c, 0x05, 0xd4, 0x5d, 0x0e, 0xa0, 0x7c, - 0x3a, 0xb1, 0xf3, 0x48, 0x30, 0x9e, 0x7c, 0x1b, 0xe0, 0xff, 0x80, 0xbe, - 0x86, 0x1b, 0x94, 0x4f, 0x42, 0x39, 0xe8, 0x29, 0xa3, 0x5e, 0xe5, 0xe7, - 0x6c, 0xc2, 0x0f, 0x64, 0xbe, 0x4c, 0xd8, 0xab, 0x5a, 0x99, 0x36, 0xbe, - 0x6c, 0x8b, 0x85, 0x2b, 0x2b, 0x20, 0xb0, 0xd0, 0x36, 0x38, 0x0a, 0xae, - 0x70, 0x1b, 0x98, 0x9c, 0xce, 0x21, 0x43, 0x4f, 0x66, 0xb0, 0x8a, 0xb0, - 0x8d, 0x17, 0x7e, 0xa0, 0xcc, 0x48, 0x5e, 0x96, 0xe9, 0xee, 0xdc, 0x4a, - 0x2f, 0x5d, 0xfe, 0xd5, 0xb6, 0xaf, 0x57, 0x02, 0x95, 0x43, 0xbd, 0x30, - 0x40, 0xe0, 0xfb, 0xf5, 0x7d, 0x37, 0xd1, 0x46, 0x29, 0xac, 0xcc, 0x2f, - 0x54, 0x24, 0x80, 0xea, 0xdf, 0x1a, 0x1e, 0x4d, 0x71, 0xf2, 0x20, 0x2c, - 0xd4, 0xf9, 0xd1, 0x8c, 0xe7, 0xcf, 0x9a, 0x2c, 0x27, 0x24, 0x28, 0xd8, - 0xf5, 0x18, 0x52, 0x91, 0xaa, 0x35, 0x4b, 0x7a, 0xaf, 0xe0, 0xfe, 0xe5, - 0x8c, 0xbf, 0xc3, 0xb3, 0x34, 0x71, 0x66, 0x10, 0x2b, 0xf3, 0x70, 0x0e, - 0x69, 0xed, 0xcb, 0x76, 0x32, 0xa4, 0x97, 0x34, 0x77, 0x4d, 0xa8, 0xaf, - 0x6c, 0xfc, 0xc7, 0x91, 0xb4, 0x72, 0x4e, 0x68, 0xf0, 0x61, 0xdd, 0x55, - 0xdc, 0x45, 0xb2, 0xba, 0x4d, 0xa8, 0xcd, 0x79, 0x22, 0x67, 0xb4, 0x96, - 0x4e, 0x89, 0x3a, 0x3d, 0xc3, 0xa8, 0x0d, 0xb3, 0x55, 0x68, 0x76, 0x76, - 0x72, 0x4b, 0xc1, 0x1e, 0xee, 0xbe, 0xf5, 0x0b, 0x21, 0x55, 0xd5, 0xd2, - 0xdb, 0xe6, 0x76, 0x5e, 0x3c, 0x66, 0x11, 0xb8, 0xaf, 0x37, 0xdf, 0xbf, - 0x53, 0xcc, 0x06, 0x85, 0xc5, 0x81, 0xb2, 0x46, 0x9a, 0x21, 0x2e, 0x60, - 0xfa, 0xd5, 0x94, 0x2d, 0x75, 0x57, 0x95, 0x8e, 0x76, 0x67, 0x48, 0xb8, - 0xc1, 0x7b, 0x49, 0x7c, 0xda, 0x82, 0x83, 0x43, 0xda, 0x58, 0x90, 0x74, - 0x8e, 0xc2, 0xf7, 0x4f, 0xd1, 0xc2, 0x0f, 0x13, 0xb8, 0x1c, 0x9e, 0x2b, - 0xe2, 0x93, 0xcc, 0xb3, 0xf6, 0x3d, 0x7b, 0x27, 0x65, 0xbd, 0xaa, 0x58, - 0x9b, 0x3f, 0x9e, 0x47, 0x39, 0x14, 0xea, 0xe5, 0xe3, 0x64, 0xfb, 0x97, - 0x27, 0xba, 0x31, 0x83, 0x8a, 0x54, 0xca, 0x98, 0x75, 0xf7, 0xbc, 0x0e, - 0x8e, 0x99, 0xa4, 0xd3, 0x2f, 0x5f, 0x06, 0x17, 0xa3, 0x89, 0x11, 0xc1, - 0x76, 0x94, 0x36, 0xb7, 0xd2, 0x7b, 0x93, 0xdd, 0xd4, 0xc8, 0x2f, 0x05, - 0x3f, 0x40, 0xbd, 0x92, 0x5e, 0x63, 0x24, 0xac, 0x22, 0xb1, 0xc3, 0x1d, - 0xd2, 0x84, 0x56, 0x87, 0x51, 0xf6, 0xcf, 0xf9, 0xb8, 0x44, 0x11, 0x4f, - 0x97, 0x4f, 0x2c, 0x97, 0xfe, 0xea, 0xea, 0xab, 0x68, 0x5c, 0xa8, 0xfa, - 0x3d, 0xe2, 0x72, 0x30, 0xda, 0x82, 0x42, 0x61, 0x3d, 0x0c, 0xe9, 0x59, - 0x5a, 0x98, 0xb1, 0x8e, 0x95, 0x48, 0x72, 0x5a, 0x6f, 0x5d, 0x24, 0x44, - 0x99, 0xe8, 0xc7, 0x6c, 0xec, 0x3f, 0xd4, 0x1b, 0x2d, 0x68, 0xd6, 0xf8, - 0x04, 0x4c, 0xe5, 0xa1, 0x44, 0x13, 0x42, 0x8d, 0x04, 0x27, 0x34, 0xf0, - 0x08, 0x7c, 0xca, 0x76, 0x1e, 0xe4, 0x4b, 0xc9, 0x03, 0x0e, 0xa9, 0x91, - 0x3e, 0x61, 0xc5, 0x4d, 0xff, 0x1e, 0x2a, 0xd5, 0xcc, 0xbd, 0xcb, 0xc0, - 0x05, 0xde, 0x76, 0xee, 0x43, 0x44, 0x77, 0x41, 0x0a, 0xf1, 0xea, 0x2b, - 0xc8, 0x00, 0x05, 0x67, 0x18, 0x53, 0xcd, 0xee, 0x4d, 0x78, 0x7d, 0x22, - 0x27, 0x4b, 0x7f, 0x99, 0x34, 0x84, 0x7f, 0xb3, 0x2c, 0x0d, 0x45, 0x08, - 0x6f, 0x7e, 0xf2, 0xcf, 0x50, 0xcf, 0xba, 0x8a, 0x53, 0xf7, 0xf0, 0xed, - 0x70, 0x67, 0xbb, 0x4f, 0x12, 0x54, 0x87, 0xa4, 0xf7, 0x60, 0x93, 0xb7, - 0x42, 0xb7, 0x2c, 0xc5, 0x0c, 0x21, 0xcd, 0xa1, 0x01, 0xc4, 0x88, 0xed, - 0x32, 0xf2, 0x57, 0x0b, 0x65, 0x53, 0xe5, 0xea, 0x41, 0x2e, 0x6f, 0x44, - 0xbd, 0x7f, 0xfc, 0x6d, 0xfa, 0x58, 0x9d, 0x37, 0x76, 0x30, 0x77, 0xad, - 0x61, 0xc2, 0x11, 0xfe, 0x0f, 0xac, 0x4f, 0xb0, 0xf0, 0x58, 0x5b, 0xf3, - 0x9d, 0xb7, 0xb3, 0x74, 0x66, 0xa4, 0xc5, 0x4b, 0x08, 0xe6, 0x5f, 0x84, - 0x91, 0x42, 0x10, 0xe0, 0x4b, 0x15, 0x43, 0xa0, 0xc1, 0x14, 0x5b, 0x5c, - 0x8d, 0xae, 0x79, 0xdd, 0x80, 0xbc, 0x4d, 0x7b, 0xa8, 0x99, 0x66, 0xf5, - 0x9d, 0xfb, 0xe5, 0x40, 0x92, 0x1d, 0x17, 0x52, 0x92, 0x0c, 0x06, 0x88, - 0x5b, 0xf4, 0x57, 0x14, 0x39, 0xdd, 0xbd, 0xc5, 0x27, 0x85, 0x09, 0x60, - 0x47, 0x62, 0xb8, 0x15, 0x34, 0x23, 0xbf, 0xa2, 0xe0, 0x0d, 0x65, 0xff, - 0x40, 0x2e, 0x9c, 0x23, 0x5c, 0x76, 0x39, 0x83, 0xe1, 0x76, 0xd5, 0xe1, - 0xea, 0x16, 0x33, 0x3f, 0x2c, 0x7b, 0x36, 0x3b, 0x46, 0x91, 0xc8, 0x61, - 0x66, 0xc9, 0x55, 0x0f, 0x34, 0x2b, 0x1c, 0x3e, 0xa4, 0x1c, 0xe0, 0x5e, - 0xa0, 0x9e, 0xba, 0x53, 0x42, 0x14, 0x6d, 0xef, 0x10, 0x8a, 0x08, 0x8a, - 0xa9, 0x11, 0x55, 0x56, 0xcc, 0xfc, 0x06, 0xbd, 0x77, 0xea, 0xdf, 0xbf, - 0xb2, 0x4d, 0x9b, 0xd7, 0xc6, 0x20, 0xc0, 0x08, 0x8b, 0x51, 0xe0, 0x05, - 0xbb, 0x6f, 0xea, 0xcf, 0xa6, 0x9a, 0x85, 0x1b, 0xdc, 0x30, 0xf5, 0xf5, - 0x6a, 0x9a, 0x63, 0xe6, 0x29, 0x6c, 0xa9, 0xc6, 0x7c, 0x79, 0xbf, 0xdf, - 0x55, 0x14, 0xca, 0x2a, 0xd7, 0x20, 0xf8, 0x59, 0x8d, 0x6b, 0x9a, 0x0a, - 0x91, 0x6e, 0x54, 0x39, 0x76, 0x35, 0x9b, 0x0b, 0x0d, 0xe5, 0xa7, 0x31, - 0xac, 0x88, 0x9c, 0x27, 0x86, 0xec, 0x0c, 0xb9, 0x4d, 0x35, 0xc6, 0x5e, - 0x95, 0x4c, 0x2d, 0xbc, 0xf6, 0x86, 0xd3, 0xd3, 0xe1, 0x52, 0xfa, 0x12, - 0xb2, 0x1a, 0xd5, 0x41, 0x3e, 0xef, 0xff, 0xab, 0x2d, 0x4a, 0xec, 0x74, - 0x20, 0xc4, 0x4f, 0xa7, 0x63, 0xf5, 0xbf, 0x18, 0x50, 0x84, 0x1f, 0xb0, - 0x10, 0x96, 0x35, 0x1c, 0x8e, 0xdb, 0xce, 0xd7, 0xfb, 0xe6, 0xf4, 0x28, - 0x21, 0x35, 0x29, 0x4b, 0x0d, 0xe1, 0x65, 0x8a, 0xfa, 0xde, 0xd0, 0xe5, - 0xef, 0x7c, 0x33, 0xa0, 0x7a, 0x53, 0xc1, 0x32, 0xe1, 0x1f, 0xb3, 0xde, - 0x1f, 0x22, 0xd5, 0x95, 0xba, 0x1e, 0x1f, 0xa3, 0x07, 0x0a, 0xc0, 0x4d, - 0xa8, 0xd3, 0xc4, 0x59, 0xbf, 0xf8, 0x7f, 0x14, 0x61, 0x91, 0x17, 0xed, - 0x11, 0xc1, 0xb7, 0x20, 0xfd, 0x4e, 0x43, 0x15, 0x1f, 0xee, 0xdd, 0xaa, - 0xf4, 0x76, 0x6b, 0xf6, 0x14, 0x9a, 0xeb, 0xaa, 0xc6, 0x5e, 0xd2, 0x08, - 0x24, 0x7a, 0xf1, 0x58, 0x85, 0xd0, 0x50, 0xfc, 0xa6, 0x9c, 0x1a, 0xd4, - 0xfd, 0x1a, 0x8c, 0xfb, 0xc0, 0x87, 0x44, 0x9d, 0x8a, 0xd5, 0x72, 0x5e, - 0x77, 0x22, 0x1e, 0x25, 0x47, 0x8a, 0x83, 0x8a, 0xd2, 0xde, 0xb5, 0x62, - 0x02, 0xc2, 0xdb, 0xac, 0xc4, 0x23, 0x92, 0x42, 0x1b, 0xfe, 0x31, 0xa6, - 0x6c, 0x69, 0x29, 0x94, 0xb2, 0xa4, 0x62, 0x37, 0xcf, 0x99, 0xa4, 0x23, - 0xf4, 0x70, 0xbc, 0xda, 0xd7, 0xe0, 0x86, 0x57, 0x18, 0x4d, 0x30, 0xa8, - 0x79, 0xe9, 0xb4, 0x9f, 0x99, 0x65, 0xa8, 0xa4, 0x98, 0xc9, 0xc3, 0x61, - 0x6d, 0xd3, 0x63, 0x10, 0x27, 0xe9, 0x08, 0x88, 0x0e, 0x50, 0xc8, 0x8d, - 0x81, 0x1d, 0x8c, 0xda, 0xbe, 0xc0, 0xae, 0x2b, 0x8b, 0xf3, 0xa0, 0xbf, - 0x56, 0x50, 0x57, 0xd8, 0x90, 0xd1, 0x58, 0x85, 0xcf, 0x61, 0xdf, 0xfa, - 0x66, 0x77, 0x90, 0xd3, 0xed, 0xa3, 0x11, 0xff, 0x87, 0x9b, 0x06, 0x85, - 0x0b, 0xcb, 0x9f, 0x01, 0x2b, 0x2f, 0x3c, 0x4e, 0x97, 0x27, 0x2d, 0x2d, - 0x03, 0x88, 0xad, 0xc5, 0x31, 0xa1, 0x32, 0xea, 0x7a, 0x45, 0xb2, 0x07, - 0x3e, 0x19, 0x3c, 0xc4, 0xff, 0xfa, 0x83, 0x79, 0x10, 0x12, 0xe6, 0x34, - 0x60, 0x48, 0x5a, 0x32, 0xc1, 0xeb, 0xf2, 0x7b, 0x62, 0x8b, 0x1b, 0xce, - 0x74, 0xbb, 0x78, 0x2b, 0xc7, 0xac, 0xcf, 0xe0, 0x63, 0x93, 0x67, 0x35, - 0x28, 0x31, 0x6e, 0xc7, 0xe8, 0x84, 0x37, 0xce, 0xac, 0x8b, 0xdf, 0x7d, - 0x19, 0x1b, 0x2a, 0xf9, 0x28, 0x3c, 0xd9, 0xd5, 0xa8, 0xbb, 0xb2, 0x42, - 0x24, 0x9b, 0x2d, 0x24, 0x0b, 0x83, 0xfd, 0x79, 0x98, 0x03, 0xbf, 0x1a, - 0x56, 0xcd, 0x86, 0xf4, 0x09, 0x79, 0x73, 0xd3, 0x63, 0xb9, 0x55, 0x4a, - 0xaa, 0x23, 0xef, 0x3c, 0xcd, 0x09, 0x65, 0xc5, 0x88, 0xab, 0xf4, 0xbd, - 0x54, 0x9d, 0xe8, 0xc7, 0xaa, 0x08, 0xd1, 0x74, 0x3a, 0xd9, 0xcd, 0x40, - 0x7b, 0x1a, 0xe0, 0x2f, 0x78, 0xdb, 0xcd, 0x59, 0xcb, 0x19, 0x41, 0x65, - 0x14, 0xca, 0xe8, 0xde, 0xbd, 0xb1, 0x7e, 0x94, 0xa3, 0xaa, 0xd9, 0x9d, - 0x62, 0xab, 0xcd, 0x54, 0x12, 0xf1, 0x0c, 0xb9, 0x2c, 0xc4, 0xf2, 0x62, - 0xba, 0xfd, 0xbd, 0xe7, 0x8b, 0x45, 0xeb, 0xfe, 0xd3, 0x59, 0x46, 0xd0, - 0x60, 0x77, 0xe6, 0x7c, 0x89, 0x10, 0x97, 0x27, 0x37, 0x9f, 0x9b, 0x6d, - 0x46, 0x48, 0x99, 0x87, 0x9e, 0x36, 0x5e, 0x3e, 0x65, 0x01, 0x1d, 0x2d, - 0x60, 0x70, 0xb2, 0xdb, 0x91, 0x6f, 0x17, 0x20, 0x2a, 0x0a, 0x05, 0xa2, - 0x10, 0x8e, 0xc2, 0xc8, 0x74, 0x94, 0xf1, 0x46, 0x7c, 0x9b, 0x5b, 0x2b, - 0xc5, 0x14, 0x45, 0xe8, 0x41, 0x80, 0x4e, 0x30, 0x58, 0x9e, 0x46, 0xfe, - 0xfe, 0xcc, 0x87, 0xf1, 0x4b, 0x17, 0x7f, 0xb6, 0xb0, 0x83, 0x78, 0xa5, - 0x16, 0x74, 0x95, 0x9a, 0x54, 0x37, 0x3b, 0xcb, 0xa9, 0x1c, 0x6a, 0x72, - 0xa7, 0xce, 0xe0, 0xeb, 0x1a, 0x3f, 0x42, 0xdf, 0x47, 0xdd, 0xee, 0xe6, - 0xc3, 0x9e, 0xec, 0xeb, 0x4a, 0xea, 0x62, 0xc2, 0xd3, 0xd8, 0x0d, 0xc2, - 0xc6, 0x93, 0x25, 0xe0, 0x39, 0x74, 0x87, 0xcd, 0x4b, 0x4a, 0x54, 0x1c, - 0x53, 0x90, 0x08, 0x8a, 0x7e, 0x89, 0x6c, 0xf4, 0x5b, 0x50, 0x40, 0x6f, - 0x02, 0x14, 0x61, 0x85, 0x0b, 0x39, 0xc4, 0x8c, 0x84, 0x81, 0x43, 0xae, - 0xa4, 0xea, 0x5c, 0x90, 0x88, 0x22, 0x64, 0x4b, 0x7d, 0xb5, 0xf9, 0x75, - 0x83, 0x01, 0x90, 0x34, 0xa3, 0x92, 0x51, 0xe9, 0xba, 0xf0, 0x0f, 0xe7, - 0xd2, 0x38, 0x6c, 0x41, 0xd4, 0x6a, 0x30, 0x7b, 0x07, 0x8e, 0x80, 0xfb, - 0xc5, 0x23, 0x94, 0x89, 0x7b, 0x27, 0x7d, 0x05, 0x22, 0x25, 0x12, 0x54, - 0xf0, 0xe1, 0xb7, 0xea, 0xf7, 0x8f, 0xfe, 0xdf, 0xa7, 0x93, 0x59, 0xe8, - 0x65, 0xe7, 0x39, 0x3e, 0xec, 0x28, 0x71, 0xcb, 0x82, 0x0e, 0x64, 0x35, - 0x2a, 0xc8, 0x8f, 0x18, 0x9a, 0xe1, 0x33, 0xa7, 0x8e, 0xcb, 0x00, 0x61, - 0x35, 0xab, 0x51, 0x26, 0xf4, 0x87, 0x0b, 0x21, 0xf1, 0x2e, 0xc3, 0xdb, - 0xf8, 0xd6, 0xa2, 0xd2, 0xbf, 0xa0, 0x9e, 0x70, 0x08, 0xe0, 0xa4, 0x12, - 0x90, 0xd0, 0x45, 0x53, 0x7d, 0x1e, 0x40, 0x30, 0x2f, 0x97, 0xbf, 0x02, - 0xb6, 0xf5, 0xcd, 0xea, 0x1d, 0x67, 0x66, 0x06, 0x55, 0xe3, 0xa1, 0xe4, - 0x81, 0x9b, 0xd1, 0x34, 0xc4, 0xe9, 0xb7, 0xbd, 0x36, 0xb4, 0x13, 0x59, - 0xbb, 0x7e, 0xa0, 0xef, 0x06, 0x6a, 0x20, 0xa5, 0x42, 0x3b, 0x39, 0x6a, - 0xb4, 0xaf, 0x47, 0xcb, 0x70, 0xe6, 0x69, 0x03, 0x88, 0x6d, 0x6f, 0xec, - 0x2f, 0xf0, 0x47, 0x08, 0x96, 0x7a, 0x5a, 0x9b, 0xb3, 0x0b, 0xf3, 0xbd, - 0x47, 0x7a, 0x61, 0x9d, 0xd1, 0xd2, 0xc3, 0xe8, 0x63, 0x71, 0xb5, 0xf0, - 0xf0, 0x51, 0x4c, 0x52, 0x63, 0x9c, 0xe9, 0x90, 0x5f, 0x1f, 0x0a, 0x01, - 0x0d, 0xb2, 0xf4, 0x80, 0x5b, 0x27, 0x66, 0xed, 0x44, 0x52, 0xed, 0x05, - 0x0f, 0xef, 0x32, 0x3e, 0xe6, 0x19, 0x28, 0x49, 0x59, 0x17, 0xee, 0x4b, - 0x08, 0x3a, 0x7b, 0xbc, 0xd9, 0xa7, 0x1d, 0x9a, 0x82, 0x6b, 0x29, 0x4a, - 0xdd, 0xbe, 0xa9, 0x05, 0x3c, 0x4d, 0xf7, 0x8e, 0xfa, 0x3e, 0x4e, 0x6d, - 0xef, 0x74, 0xfe, 0x63, 0x51, 0x95, 0x90, 0x7e, 0x70, 0x42, 0x6d, 0x97, - 0x0f, 0x84, 0xd5, 0xf4, 0xf3, 0x57, 0x97, 0x37, 0xac, 0x4c, 0xd6, 0x25, - 0x35, 0x56, 0xd0, 0x99, 0x38, 0x5b, 0xbe, 0x40, 0x82, 0xe6, 0x6c, 0x71, - 0x66, 0x36, 0xcc, 0xf0, 0x77, 0xfb, 0x96, 0x11, 0x03, 0x29, 0xc8, 0x18, - 0xa3, 0x89, 0xb3, 0xff, 0xe2, 0x0f, 0xc2, 0x88, 0xc9, 0xb2, 0xf2, 0xcb, - 0xb2, 0x25, 0xe6, 0x4b, 0x45, 0x29, 0xae, 0xc0, 0x04, 0x4e, 0xa6, 0x20, - 0x44, 0x76, 0x77, 0xe6, 0x89, 0x92, 0x3c, 0x25, 0xfb, 0x07, 0x5a, 0x6a, - 0xa3, 0x8d, 0x0a, 0xad, 0x98, 0x7b, 0x46, 0x9b, 0xd6, 0xcd, 0xaf, 0xc4, - 0xd9, 0x8f, 0x0c, 0x10, 0xf9, 0x62, 0x4d, 0x8e, 0x7d, 0x76, 0x4f, 0x93, - 0x3c, 0x93, 0xc0, 0x62, 0xd3, 0x80, 0x2e, 0xc1, 0x7f, 0x6d, 0x52, 0x42, - 0x2e, 0x8e, 0x43, 0x29, 0x97, 0x46, 0x77, 0x6a, 0xee, 0xee, 0xe4, 0x8e, - 0xdf, 0xf8, 0xe7, 0x89, 0xe2, 0x9f, 0x7e, 0xf3, 0x56, 0x67, 0x35, 0xdd, - 0xfb, 0xd2, 0x47, 0xed, 0x05, 0xa7, 0x32, 0x42, 0x87, 0xfc, 0xc8, 0x2b, - 0x7d, 0x7e, 0x4e, 0x4e, 0xef, 0x40, 0xe8, 0x93, 0x0b, 0x28, 0xc9, 0x48, - 0x9c, 0x90, 0x59, 0x70, 0x7c, 0x26, 0x76, 0xd5, 0x1a, 0x88, 0x11, 0x96, - 0xd8, 0x6d, 0x9e, 0x14, 0x92, 0x13, 0x17, 0x96, 0x01, 0x9e, 0x44, 0xab, - 0xf1, 0x93, 0xb9, 0x9e, 0x2e, 0x44, 0xc4, 0xf7, 0x3c, 0x4b, 0xfc, 0x80, - 0x9f, 0x56, 0xf2, 0xf5, 0x0f, 0x31, 0x9c, 0x59, 0x05, 0x0d, 0xef, 0xe9, - 0xcd, 0x7c, 0x27, 0xcc, 0x6b, 0x58, 0x2a, 0x65, 0xe9, 0xbe, 0xf1, 0xa9, - 0x29, 0x3f, 0xe2, 0x5f, 0xb0, 0x83, 0xbb, 0x0d, 0xd7, 0x1e, 0x58, 0xed, - 0x2e, 0xf3, 0x8a, 0x70, 0xb9, 0x4d, 0x43, 0x84, 0x7f, 0x23, 0xdc, 0x0e, - 0x61, 0x51, 0x2e, 0xed, 0x18, 0x9c, 0x66, 0x8f, 0x00, 0xce, 0x60, 0xbd, - 0xf3, 0xb4, 0x1a, 0xa8, 0x9e, 0x14, 0xd0, 0x3b, 0x92, 0xba, 0x17, 0x81, - 0x16, 0x77, 0x3c, 0x51, 0xa6, 0x50, 0x57, 0x1e, 0x12, 0xcb, 0x77, 0xf4, - 0x18, 0x84, 0x9b, 0x3e, 0x47, 0xc3, 0x3f, 0xa7, 0xc4, 0xfb, 0x08, 0xef, - 0x23, 0x7b, 0xa0, 0xf1, 0x93, 0x3f, 0x23, 0x5d, 0xa3, 0xc1, 0xf5, 0xe1, - 0xe8, 0xa7, 0xe5, 0x0c, 0xb8, 0xd0, 0x74, 0xfd, 0xa6, 0x8e, 0xcd, 0xea, - 0x92, 0x4f, 0x3e, 0x2b, 0x79, 0x93, 0xbc, 0x79, 0x79, 0xae, 0x8a, 0x2d, - 0x97, 0xb2, 0xc7, 0xc3, 0xb6, 0x12, 0x8d, 0xba, 0xe4, 0xe5, 0x2f, 0x42, - 0x2c, 0xa1, 0xd1, 0xac, 0x5a, 0x3c, 0xad, 0x15, 0x4c, 0xea, 0x3e, 0x06, - 0x4c, 0xfc, 0xb6, 0xe9, 0x06, 0x0b, 0x15, 0x94, 0xeb, 0x5e, 0x95, 0x9f, - 0x7a, 0xdb, 0x5e, 0x79, 0x51, 0x76, 0xdc, 0x15, 0x25, 0x9b, 0x47, 0x8f, - 0xac, 0x16, 0xf7, 0xf7, 0x68, 0x27, 0x21, 0x23, 0xd5, 0x39, 0xd6, 0x76, - 0x21, 0xe8, 0xaa, 0xc9, 0xc7, 0x3e, 0xb5, 0x8a, 0x5d, 0x8d, 0xbb, 0xef, - 0xb0, 0x99, 0xaf, 0x6d, 0x6e, 0xda, 0x9f, 0x6e, 0xda, 0xac, 0xa7, 0x50, - 0x91, 0x93, 0xba, 0x7a, 0xe2, 0x7c, 0x63, 0x0b, 0x80, 0x6c, 0x13, 0x38, - 0xdf, 0x01, 0x44, 0x1b, 0x27, 0xcd, 0xf5, 0x7a, 0x55, 0x0a, 0xc2, 0x29, - 0xad, 0x35, 0x84, 0xbc, 0x43, 0xe3, 0x26, 0x89, 0xda, 0x2d, 0xd9, 0x15, - 0x9f, 0x08, 0x41, 0x3e, 0xb5, 0xe9, 0xe2, 0x75, 0x05, 0x77, 0x80, 0x48, - 0x31, 0x47, 0xb6, 0xa0, 0xeb, 0x13, 0x3a, 0xdb, 0x58, 0xa1, 0xbb, 0x85, - 0x8c, 0xb9, 0xdd, 0xdf, 0xcb, 0xb2, 0xe2, 0xdb, 0x5e, 0x7f, 0x05, 0x0a, - 0xdb, 0x68, 0x0e, 0xd5, 0xdb, 0x47, 0x8c, 0x9a, 0xec, 0xac, 0xf9, 0xc9, - 0x91, 0xe9, 0xaf, 0x03, 0x07, 0xeb, 0x0b, 0xdd, 0x56, 0xa2, 0x89, 0x8a, - 0x9b, 0xb8, 0xc4, 0xcf, 0xaa, 0x90, 0xc8, 0x33, 0x3b, 0x12, 0x6e, 0xd1, - 0x92, 0x8d, 0xc6, 0xf4, 0xec, 0xe6, 0xa2, 0xc5, 0xd4, 0x80, 0xc5, 0x79, - 0x2f, 0x19, 0x63, 0xf8, 0xb5, 0x5e, 0x9b, 0xea, 0xea, 0xe1, 0x35, 0x02, - 0x1e, 0xdd, 0x63, 0xb8, 0xe9, 0x28, 0xba, 0x9e, 0x0f, 0x46, 0x93, 0x06, - 0x9e, 0x20, 0xe0, 0xd7, 0x2d, 0x67, 0x68, 0x62, 0xbc, 0x24, 0xd9, 0xcb, - 0xba, 0xac, 0xac, 0x96, 0xae, 0xe2, 0x59, 0x47, 0xad, 0x6d, 0xd9, 0xa7, - 0x29, 0xe3, 0xc9, 0x6b, 0x34, 0xe9, 0x70, 0x84, 0xa5, 0xa1, 0x75, 0x63, - 0x2a, 0x49, 0x59, 0x10, 0xa0, 0x95, 0x9a, 0x7b, 0x2b, 0xb5, 0xd0, 0x3e, - 0x65, 0x6e, 0x2d, 0xd5, 0xe8, 0x48, 0x85, 0x41, 0x76, 0x83, 0x24, 0xfb, - 0xde, 0xe4, 0xc4, 0xfc, 0x4a, 0xd8, 0x2d, 0x78, 0x52, 0x01, 0x19, 0x16, - 0xd1, 0x22, 0xd2, 0x69, 0xb6, 0x6c, 0xc1, 0xfb, 0x5a, 0xab, 0xa7, 0x98, - 0x8e, 0x0d, 0xa2, 0x31, 0x6d, 0x9a, 0x9b, 0x0f, 0x44, 0x33, 0x08, 0x6d, - 0xb8, 0x97, 0x89, 0x7c, 0xbe, 0xad, 0x24, 0xbb, 0xb6, 0xf8, 0x1c, 0x60, - 0x8f, 0xd4, 0xd8, 0xd1, 0xf9, 0x83, 0x0f, 0x2b, 0xd9, 0x19, 0x27, 0xb3, - 0xd1, 0x93, 0xc2, 0x66, 0x52, 0x10, 0xb9, 0xc5, 0x6f, 0xbe, 0x9c, 0xbb, - 0xd3, 0x4d, 0xa2, 0x09, 0x94, 0x3d, 0x7c, 0x6b, 0xfb, 0xd2, 0x8a, 0x4e, - 0xab, 0xdd, 0xa3, 0x94, 0xb9, 0xc8, 0x1d, 0x93, 0x2d, 0x33, 0x43, 0x5a, - 0xfa, 0x64, 0xbd, 0xfe, 0x29, 0x2d, 0x89, 0xd8, 0x3b, 0xc7, 0xb5, 0xcf, - 0xc8, 0x2a, 0x3d, 0xe7, 0x98, 0x69, 0x24, 0xdd, 0xd8, 0x20, 0x57, 0x4f, - 0xee, 0xf5, 0x12, 0x68, 0x7d, 0x5d, 0x8b, 0xdf, 0x38, 0x5a, 0xf5, 0x4b, - 0x10, 0xdb, 0xa9, 0xe4, 0x56, 0xb5, 0x6d, 0x8d, 0x59, 0xba, 0x14, 0x30, - 0xdb, 0x82, 0x63, 0xe3, 0x4f, 0x4c, 0xdf, 0xc7, 0x3f, 0x5e, 0x50, 0x68, - 0x6e, 0x34, 0x94, 0xc5, 0x64, 0xde, 0x1a, 0xf3, 0x51, 0x47, 0xad, 0x14, - 0xa1, 0x5c, 0xde, 0x37, 0x82, 0xe4, 0x04, 0x97, 0x7d, 0x4e, 0x17, 0x18, - 0x8f, 0x58, 0x86, 0x0d, 0x78, 0x72, 0x35, 0x8a, 0x2e, 0xcb, 0x5c, 0xef, - 0x94, 0xae, 0x7f, 0x7f, 0xeb, 0x78, 0x17, 0x91, 0x1d, 0xb3, 0x43, 0x2e, - 0xf4, 0x33, 0xf6, 0x81, 0xf8, 0x54, 0x43, 0x7f, 0x94, 0x84, 0x18, 0xeb, - 0xad, 0x07, 0x6d, 0xb7, 0x44, 0x5d, 0x53, 0x65, 0xb6, 0xc4, 0xee, 0xb0, - 0x64, 0xb0, 0x9b, 0xb3, 0x1a, 0xf2, 0x9d, 0x5f, 0x04, 0xc8, 0x2e, 0x56, - 0xca, 0xd4, 0xf8, 0x81, 0x08, 0x93, 0xb7, 0x8c, 0x8c, 0x96, 0xaf, 0xc1, - 0x62, 0x58, 0x51, 0x75, 0x9c, 0x87, 0x58, 0x84, 0x2e, 0x3f, 0x89, 0xfe, - 0x7f, 0x41, 0x3f, 0xe1, 0x62, 0x2d, 0x99, 0x02, 0xe3, 0x66, 0xb7, 0xb0, - 0x5a, 0x4d, 0x88, 0x5d, 0x6f, 0xe9, 0xe8, 0xf0, 0x03, 0xad, 0xc0, 0x01, - 0x3d, 0x32, 0xe2, 0xca, 0x58, 0x30, 0x87, 0x52, 0xc7, 0xc8, 0xd9, 0x76, - 0x74, 0x1a, 0x2e, 0xe7, 0x14, 0xda, 0xd0, 0x49, 0x24, 0xfe, 0x36, 0x15, - 0xec, 0xf5, 0xc1, 0xb6, 0x38, 0x75, 0x97, 0xff, 0x3e, 0x69, 0x9f, 0xac, - 0x0e, 0x73, 0x3a, 0xc6, 0x94, 0xcf, 0x67, 0x7a, 0x61, 0x19, 0x99, 0x1c, - 0xc0, 0xc5, 0x15, 0xc6, 0xa6, 0x9f, 0x57, 0x1c, 0x4f, 0xb8, 0x15, 0x07, - 0xc0, 0x3a, 0x0c, 0x7f, 0xa1, 0xd7, 0x29, 0x43, 0x19, 0x02, 0x3a, 0x51, - 0x7a, 0x1d, 0x4a, 0xec, 0x5a, 0x4c, 0xeb, 0xa5, 0xa9, 0x80, 0xba, 0x53, - 0x19, 0xe5, 0x6f, 0x18, 0xc4, 0x15, 0x62, 0xf9, 0xa5, 0x7b, 0xb3, 0x61, - 0x7b, 0x83, 0x92, 0xb2, 0x4a, 0x14, 0x74, 0xeb, 0x9a, 0xf3, 0x7f, 0xd6, - 0x27, 0x10, 0xcf, 0x82, 0x48, 0xd1, 0x0a, 0x84, 0x85, 0x2f, 0xec, 0x36, - 0xe6, 0xfa, 0x0e, 0x11, 0x09, 0x4a, 0xe5, 0xf6, 0x8e, 0xa1, 0xf9, 0x30, - 0x92, 0x48, 0xc4, 0x4a, 0xf7, 0xdd, 0x77, 0x80, 0x90, 0xa0, 0x36, 0x83, - 0x54, 0x6b, 0xc8, 0x62, 0xc0, 0xd1, 0x2d, 0x54, 0xc8, 0xbc, 0x2d, 0xe5, - 0x1f, 0x10, 0x50, 0xb6, 0x39, 0x14, 0x81, 0xe6, 0x18, 0xed, 0x52, 0x72, - 0xe2, 0x1b, 0x1a, 0x47, 0xf5, 0xda, 0x89, 0x01, 0xd2, 0x38, 0xfe, 0x1f, - 0x36, 0x42, 0x04, 0x69, 0x08, 0xad, 0xb1, 0x47, 0x1f, 0x5c, 0x88, 0x44, - 0x31, 0xb6, 0xbc, 0x68, 0xd6, 0x04, 0xe7, 0x5f, 0xc6, 0x7a, 0x4c, 0x43, - 0x49, 0x03, 0xb9, 0x6d, 0x5a, 0x4d, 0xff, 0x66, 0xf3, 0x54, 0x6d, 0xc6, - 0x1a, 0xe8, 0xc6, 0x85, 0xde, 0x06, 0x80, 0x1f, 0xe4, 0x48, 0x94, 0x67, - 0xfb, 0x3b, 0x54, 0x49, 0x06, 0xe5, 0x01, 0xad, 0xe7, 0xfe, 0xc2, 0xa3, - 0xfd, 0x56, 0x8f, 0x9a, 0x41, 0x89, 0xe0, 0x22, 0xb3, 0x65, 0xbc, 0x10, - 0x3d, 0x99, 0x9b, 0xc6, 0x92, 0x4e, 0xf8, 0xaf, 0x5b, 0x84, 0x04, 0xb0, - 0xc2, 0xff, 0xc1, 0x41, 0x56, 0x19, 0x89, 0x74, 0xe5, 0xc3, 0x26, 0x0f, - 0xd1, 0x1f, 0x8a, 0xcb, 0x7c, 0x81, 0x56, 0x7b, 0x2c, 0xcc, 0xe3, 0x73, - 0x47, 0x51, 0x9b, 0x46, 0x84, 0xd8, 0x5f, 0x80, 0x3b, 0xf4, 0x37, 0x5e, - 0xdc, 0xb6, 0x72, 0xd1, 0x61, 0x3a, 0x57, 0x87, 0x36, 0xa1, 0xa1, 0x67, - 0x38, 0xc6, 0x13, 0xb5, 0xe2, 0xa5, 0x70, 0x04, 0x59, 0x23, 0x97, 0xb1, - 0x27, 0x12, 0x79, 0x95, 0x52, 0x47, 0x45, 0x4b, 0x8e, 0x5e, 0x54, 0x31, - 0xbe, 0x18, 0x29, 0x77, 0x2d, 0x98, 0x88, 0xd2, 0x72, 0x3f, 0x8f, 0xeb, - 0x72, 0x9d, 0xc6, 0xad, 0x1b, 0x72, 0xe1, 0x41, 0xdc, 0x25, 0xe1, 0xbf, - 0x39, 0x32, 0x1f, 0x31, 0x4a, 0x54, 0xe7, 0x77, 0x73, 0x92, 0xd9, 0x03, - 0x3e, 0xc0, 0xc3, 0xe9, 0x3e, 0xe4, 0x8c, 0xc1, 0x09, 0x39, 0x62, 0x36, - 0xbe, 0x56, 0x52, 0xa6, 0x3e, 0xd9, 0x85, 0xa2, 0xc7, 0xaf, 0x09, 0x2b, - 0x29, 0xc9, 0x37, 0x16, 0x62, 0x31, 0x45, 0xee, 0x71, 0x96, 0xff, 0xf4, - 0x8d, 0xea, 0x3a, 0x0d, 0x2b, 0xb3, 0x9e, 0xb9, 0xbb, 0x01, 0xd5, 0x7b, - 0x64, 0x31, 0xd6, 0x8d, 0x48, 0xb5, 0x3c, 0xa3, 0xf6, 0x7a, 0xbb, 0xad, - 0xe0, 0x59, 0xc3, 0x75, 0xf6, 0x0e, 0xde, 0x49, 0xb2, 0x54, 0x3b, 0xab, - 0xdb, 0x69, 0x9c, 0x58, 0xf4, 0x8d, 0xb8, 0xb8, 0x1a, 0x5a, 0x23, 0x19, - 0x49, 0x9e, 0x93, 0x9f, 0x9b, 0x1b, 0x6a, 0x95, 0xbf, 0xda, 0xf1, 0x6b, - 0x15, 0x71, 0x8f, 0x3e, 0x0e, 0xc8, 0xec, 0x64, 0x1f, 0xd2, 0x35, 0x5e, - 0xe2, 0xaf, 0xc0, 0x73, 0x85, 0x57, 0x7a, 0xd1, 0xb3, 0x95, 0xfc, 0x86, - 0xc3, 0x16, 0xf7, 0xab, 0x6b, 0x8c, 0x88, 0x85, 0xdf, 0x85, 0x7c, 0xd4, - 0x81, 0x35, 0x24, 0x1e, 0x3f, 0x84, 0xa3, 0x52, 0xd0, 0xf9, 0x63, 0x6f, - 0x36, 0x4c, 0x6e, 0xc9, 0x7a, 0xd3, 0x74, 0x80, 0x15, 0x91, 0x1c, 0x89, - 0xfa, 0xda, 0x26, 0x16, 0xce, 0xe5, 0xd5, 0xb6, 0xb9, 0xf8, 0xc1, 0x80, - 0x6f, 0x3e, 0x15, 0xed, 0x90, 0xdc, 0x75, 0xa7, 0xe9, 0x80, 0xfb, 0xdb, - 0x1a, 0x47, 0x76, 0x03, 0xaa, 0x41, 0xff, 0xdc, 0x5e, 0xc5, 0xf0, 0x8e, - 0xe8, 0x9d, 0x4f, 0x34, 0xd9, 0x09, 0x2f, 0xb5, 0xaf, 0x33, 0x9f, 0x2b, - 0xf6, 0xf0, 0xc9, 0xda, 0xf1, 0x6f, 0x94, 0x9d, 0x2e, 0xcf, 0xb5, 0x54, - 0xfb, 0xbc, 0xf6, 0xc9, 0xbe, 0x64, 0xff, 0x40, 0xa6, 0x74, 0x36, 0xee, - 0x03, 0xcb, 0xdf, 0x7c, 0xe0, 0xbc, 0xf7, 0x2d, 0xf4, 0xd9, 0xf2, 0xab, - 0x54, 0xc4, 0x27, 0xf9, 0x56, 0x5b, 0xb3, 0xe0, 0x81, 0x97, 0x1e, 0x43, - 0xb0, 0x2b, 0xaa, 0x5d, 0x27, 0xe4, 0xf1, 0xfd, 0x23, 0x9c, 0x7c, 0xff, - 0x18, 0xa6, 0x41, 0xe0, 0x5c, 0xc2, 0xaf, 0xbe, 0x15, 0x34, 0xe4, 0xc3, - 0xb1, 0x8f, 0xb3, 0x54, 0xaf, 0xb2, 0x6c, 0x07, 0xae, 0x56, 0xbe, 0x05, - 0x18, 0x0f, 0xcf, 0x15, 0x9a, 0xb3, 0x01, 0xf1, 0x4f, 0x07, 0xe0, 0xca, - 0x38, 0x1e, 0x0e, 0x73, 0x23, 0xf3, 0x92, 0x0d, 0x36, 0xa3, 0xf2, 0x0e, - 0xc4, 0x0a, 0x87, 0x99, 0x50, 0x8f, 0xb9, 0xa3, 0x75, 0x6f, 0xf9, 0xa3, - 0x7f, 0xb9, 0x8a, 0x1d, 0x6c, 0xd4, 0x87, 0x16, 0x23, 0x48, 0xfe, 0x7d, - 0x48, 0x83, 0x56, 0xeb, 0x2c, 0x6b, 0x40, 0x80, 0x43, 0xe9, 0xfd, 0x34, - 0x88, 0xbc, 0x30, 0x61, 0xfd, 0x2a, 0xa4, 0x5a, 0xb4, 0xca, 0x34, 0x74, - 0xa3, 0x81, 0x86, 0xc8, 0x3f, 0x89, 0xb1, 0x24, 0x15, 0xf2, 0x20, 0x3c, - 0x4a, 0x60, 0x78, 0x14, 0x8e, 0xdb, 0xb6, 0x72, 0xda, 0xc1, 0xdd, 0x68, - 0x97, 0x6f, 0xdb, 0x0f, 0x7d, 0x77, 0x81, 0x85, 0x3c, 0xf0, 0x78, 0x24, - 0x49, 0x58, 0x4d, 0x3a, 0x76, 0x1e, 0x1a, 0x40, 0xa8, 0x3c, 0x03, 0x92, - 0x08, 0x56, 0xdf, 0xe1, 0x27, 0x11, 0x8d, 0x29, 0x62, 0x4b, 0xce, 0x44, - 0xa8, 0x55, 0x95, 0x66, 0x5e, 0xc0, 0x79, 0xdf, 0x13, 0xf8, 0xc7, 0x12, - 0x84, 0xfb, 0x51, 0x39, 0xdb, 0x49, 0xbc, 0xa5, 0x78, 0xc9, 0x16, 0x8f, - 0xdc, 0xc2, 0x26, 0xf3, 0xa9, 0xb9, 0xe5, 0x4f, 0xd6, 0x81, 0x7e, 0xc3, - 0x90, 0x3b, 0x9c, 0xf5, 0xb9, 0x55, 0x56, 0x8b, 0xa8, 0x9e, 0xb9, 0x8d, - 0x34, 0x3d, 0x5e, 0xca, 0x49, 0x13, 0xfb, 0xd1, 0xd7, 0x96, 0x39, 0xde, - 0x23, 0x03, 0xd2, 0x74, 0x35, 0xbe, 0x79, 0x8b, 0x72, 0x20, 0x4d, 0x06, - 0x1a, 0x4b, 0xc8, 0xbd, 0x39, 0xb9, 0xe5, 0xf0, 0xae, 0xa0, 0x4c, 0x38, - 0xea, 0xb6, 0xe8, 0x6e, 0x67, 0xec, 0x99, 0xc0, 0xc2, 0x9b, 0xbc, 0x1e, - 0x0c, 0xd8, 0x88, 0x24, 0xc7, 0x06, 0xfb, 0xf6, 0x56, 0x88, 0x16, 0x09, - 0xe7, 0x68, 0x05, 0xbf, 0x57, 0xc3, 0xb1, 0x49, 0xd3, 0xf3, 0x39, 0x1d, - 0x3c, 0xff, 0xb2, 0xee, 0x59, 0x57, 0x20, 0x96, 0x68, 0xcc, 0x5d, 0xa0, - 0xf4, 0x45, 0x40, 0xbf, 0x21, 0x76, 0xd4, 0xde, 0x56, 0xe1, 0x87, 0x53, - 0x24, 0x5b, 0xe7, 0xc5, 0x5a, 0x5c, 0x3f, 0x85, 0xef, 0x59, 0xdf, 0xb5, - 0x7f, 0xcf, 0x5d, 0x74, 0xb1, 0x6f, 0xce, 0x2f, 0x10, 0x03, 0xcb, 0x64, - 0x71, 0x2f, 0x73, 0x9e, 0xfa, 0x9e, 0xd4, 0xdb, 0xc1, 0xe6, 0xf8, 0xea, - 0x5f, 0x25, 0x15, 0x96, 0xbf, 0xd7, 0x69, 0xc8, 0xb1, 0xed, 0x71, 0x50, - 0xea, 0x7c, 0x03, 0x4d, 0x22, 0x89, 0xb4, 0x02, 0x29, 0x13, 0xba, 0xbb, - 0x8c, 0x6f, 0x9f, 0x97, 0x4f, 0xb6, 0xc5, 0x48, 0x82, 0x3e, 0x4c, 0x8e, - 0x67, 0x8f, 0xd8, 0x75, 0xf3, 0x94, 0xa7, 0xfe, 0x11, 0xb5, 0xf0, 0x82, - 0x4e, 0xa8, 0xa0, 0xfb, 0x57, 0x5c, 0x7d, 0xa0, 0x11, 0x9c, 0x02, 0x2a, - 0x1a, 0x7e, 0x22, 0x1d, 0xb5, 0x7c, 0x3b, 0x7b, 0x2e, 0x19, 0xbf, 0x81, - 0x6c, 0x21, 0x09, 0x6d, 0x50, 0xed, 0x73, 0x3a, 0x4f, 0xab, 0x23, 0x01, - 0xc6, 0x71, 0x18, 0xa9, 0x22, 0x98, 0xd7, 0x76, 0x5c, 0xb9, 0x62, 0xe5, - 0xb1, 0x81, 0x7f, 0x5f, 0x5c, 0x7a, 0x8c, 0x83, 0xe7, 0xa1, 0x9a, 0x5a, - 0xcd, 0xbd, 0xdd, 0x95, 0x6c, 0x76, 0x33, 0x65, 0x09, 0xb0, 0x23, 0x4c, - 0x79, 0x0b, 0x45, 0xb3, 0xe3, 0x1e, 0x1a, 0x38, 0xdb, 0x6c, 0xe9, 0x12, - 0x83, 0xc7, 0x12, 0x64, 0x59, 0xd2, 0x32, 0x70, 0x43, 0xcf, 0xef, 0xd9, - 0x43, 0x22, 0xab, 0xfd, 0x9f, 0x48, 0x2a, 0x53, 0xa0, 0x2c, 0x38, 0xc2, - 0x59, 0xec, 0xd4, 0xce, 0x03, 0x8f, 0xde, 0xcd, 0x08, 0x04, 0x92, 0xc6, - 0x96, 0x0a, 0x4a, 0xc2, 0xa7, 0x40, 0x5e, 0x83, 0x57, 0x45, 0xc0, 0x56, - 0x1d, 0x55, 0x4f, 0x8c, 0x63, 0x01, 0xd7, 0x58, 0xfa, 0xc4, 0x02, 0x13, - 0x32, 0xdb, 0xb6, 0x45, 0x03, 0xbb, 0x7e, 0x1e, 0xf8, 0x14, 0xa3, 0xbe, - 0xd1, 0xef, 0xde, 0x3c, 0xe4, 0xe2, 0x69, 0x9d, 0x77, 0x67, 0x46, 0xff, - 0xe3, 0xe8, 0xd7, 0x17, 0xaa, 0xdd, 0xc9, 0x6c, 0x07, 0xc2, 0x75, 0x78, - 0xa5, 0x2d, 0xbb, 0xd2, 0x42, 0xbf, 0x6f, 0x76, 0x96, 0x50, 0xe9, 0x20, - 0xa8, 0x6d, 0x6e, 0xdc, 0x8f, 0xee, 0x23, 0xef, 0x9f, 0x93, 0x51, 0x9c, - 0x3b, 0xc4, 0xa2, 0x7f, 0x85, 0xbb, 0x5f, 0x00, 0xd0, 0xcd, 0x26, 0x8a, - 0xd2, 0xce, 0x0c, 0xac, 0x87, 0x90, 0xd7, 0x07, 0xae, 0x58, 0x90, 0xe9, - 0x03, 0x8e, 0xca, 0x17, 0xa4, 0x4c, 0xa1, 0x8c, 0x9c, 0x59, 0x0d, 0xd7, - 0x0a, 0x30, 0xa2, 0xb2, 0xef, 0x14, 0x6d, 0xd8, 0xf6, 0xec, 0x0d, 0x12, - 0x0d, 0x8d, 0x2a, 0xae, 0x33, 0xfd, 0xb9, 0x27, 0x90, 0x73, 0x75, 0x9c, - 0x89, 0xd1, 0x02, 0xb9, 0x75, 0x9b, 0x90, 0x9c, 0x1c, 0x14, 0xaa, 0x1c, - 0x1d, 0xd4, 0xce, 0x18, 0x7f, 0x92, 0x20, 0x04, 0x18, 0x9f, 0xdd, 0x97, - 0x38, 0xc0, 0x45, 0x3d, 0x7e, 0xf6, 0xb7, 0x74, 0x23, 0x4f, 0xfe, 0x04, - 0x29, 0x96, 0x57, 0x74, 0xa2, 0x11, 0x02, 0x67, 0xb1, 0xd9, 0x58, 0x8c, - 0x82, 0x29, 0x40, 0x14, 0x55, 0x28, 0xe2, 0x90, 0x4a, 0x7a, 0x9c, 0xa6, - 0x75, 0x94, 0xb6, 0xe4, 0x55, 0x40, 0x6f, 0x96, 0x79, 0x78, 0x44, 0x50, - 0xdc, 0x80, 0x3a, 0x66, 0xe7, 0x1c, 0x14, 0xc1, 0xf8, 0x7e, 0x26, 0xec, - 0xa3, 0xab, 0xf5, 0xab, 0x13, 0x06, 0x51, 0x7b, 0xc2, 0x73, 0xe8, 0x67, - 0xde, 0x05, 0xcd, 0xdd, 0x45, 0xa2, 0x79, 0x26, 0x30, 0x57, 0xfd, 0xe1, - 0x06, 0x74, 0x25, 0x40, 0x88, 0x5a, 0x5b, 0x4b, 0x88, 0xf3, 0x80, 0x86, - 0x2f, 0x92, 0x8e, 0xb6, 0x98, 0xc1, 0xb9, 0x7c, 0x1d, 0x24, 0x79, 0x8a, - 0xc0, 0x20, 0x3f, 0xb3, 0x23, 0x64, 0xc8, 0xe3, 0x55, 0x6e, 0x82, 0x47, - 0x16, 0x3b, 0x74, 0x27, 0x84, 0x67, 0xfd, 0x7f, 0x78, 0x79, 0x9e, 0x75, - 0x4b, 0x21, 0xc7, 0xbd, 0x97, 0x8c, 0xaf, 0x84, 0x38, 0x9a, 0xe8, 0x9c, - 0xa2, 0x46, 0x9d, 0x97, 0x7e, 0x7c, 0xf3, 0x7e, 0x35, 0x87, 0xef, 0xd9, - 0x3e, 0xab, 0xf6, 0xe8, 0x43, 0xf2, 0x71, 0x9f, 0x33, 0xf3, 0x9e, 0x86, - 0x5b, 0x7b, 0x58, 0xba, 0x62, 0x51, 0xda, 0x02, 0xb8, 0xc4, 0xdd, 0x39, - 0x9f, 0x1e, 0x96, 0x85, 0x05, 0x3f, 0x6c, 0x59, 0xc4, 0x19, 0xd9, 0x56, - 0xaa, 0x7e, 0x60, 0x2c, 0x2d, 0x42, 0x45, 0x42, 0x56, 0x84, 0xc6, 0xd8, - 0x93, 0x47, 0x7d, 0x23, 0xee, 0x82, 0x6c, 0x6c, 0x98, 0x09, 0xf7, 0x79, - 0x19, 0x2f, 0x3f, 0xfe, 0x8e, 0x80, 0x73, 0xa1, 0x2c, 0x26, 0xd7, 0x3e, - 0x79, 0x30, 0xcd, 0x0a, 0xbf, 0xcd, 0xc6, 0x80, 0x67, 0xab, 0x7e, 0x82, - 0x85, 0xbf, 0x60, 0x96, 0x46, 0x06, 0xec, 0x84, 0x61, 0x48, 0x26, 0xb6, - 0x6e, 0xb9, 0xfd, 0xd8, 0x86, 0xc8, 0x57, 0xcf, 0xdc, 0x00, 0x12, 0x89, - 0x68, 0xd4, 0xed, 0xa7, 0xe9, 0xa6, 0x13, 0xd2, 0x4f, 0x96, 0xe8, 0x56, - 0x9d, 0xf8, 0x2e, 0xd9, 0x68, 0xda, 0x86, 0xf9, 0xf8, 0xd1, 0xf1, 0x74, - 0x85, 0xb4, 0xe0, 0x79, 0xf6, 0x57, 0x3f, 0x42, 0x03, 0x56, 0x1f, 0xd7, - 0x58, 0xe0, 0x67, 0x84, 0xcb, 0xa6, 0x3f, 0x21, 0xce, 0x6e, 0x8a, 0x75, - 0x50, 0x7c, 0xd9, 0x1c, 0xf8, 0x2f, 0x75, 0x0a, 0x89, 0xe4, 0x0c, 0xd9, - 0x54, 0x5b, 0xa3, 0x05, 0x75, 0x84, 0x0a, 0x62, 0xe5, 0x32, 0x58, 0xb9, - 0x5a, 0xc1, 0x6b, 0xa5, 0x47, 0xd1, 0x66, 0xb6, 0x05, 0xaa, 0xb7, 0xac, - 0x70, 0xc7, 0xb8, 0xba, 0x3b, 0xb8, 0xd7, 0x49, 0xd0, 0xcd, 0x46, 0x3e, - 0x27, 0x40, 0x3e, 0xbd, 0x69, 0x68, 0xb7, 0x50, 0x7a, 0x11, 0x34, 0x24, - 0xb6, 0x49, 0x93, 0x40, 0x2f, 0x73, 0x46, 0x02, 0x65, 0x41, 0xf0, 0xba, - 0xee, 0xce, 0x3a, 0x75, 0xef, 0xb3, 0x07, 0xa7, 0x1d, 0x47, 0x5e, 0x53, - 0xb5, 0xa0, 0xb8, 0x2e, 0xf1, 0x8c, 0xd2, 0x90, 0x5f, 0x3c, 0x36, 0x1e, - 0xa2, 0xf4, 0x62, 0xf5, 0x0a, 0x31, 0x06, 0x5c, 0x78, 0x40, 0xde, 0xf3, - 0x4f, 0x3d, 0x19, 0x6d, 0xca, 0x00, 0x17, 0x09, 0x50, 0xaf, 0xcb, 0x58, - 0x7d, 0x76, 0xae, 0x6e, 0xdd, 0x27, 0x04, 0xc5, 0xea, 0xf4, 0x8e, 0x8b, - 0xe0, 0xbe, 0x63, 0xd7, 0x60, 0x52, 0xd4, 0x27, 0xcd, 0x1a, 0x20, 0xb4, - 0x67, 0xf3, 0x5f, 0x1e, 0xcc, 0x92, 0x17, 0xaf, 0x16, 0x49, 0x17, 0xe4, - 0x07, 0xfe, 0x6d, 0x2e, 0x07, 0xb7, 0x39, 0xe5, 0x67, 0x3a, 0x7a, 0x45, - 0x54, 0x47, 0xf8, 0xd2, 0x5a, 0x17, 0x3a, 0x8a, 0x4e, 0x24, 0xbd, 0xfe, - 0xea, 0x57, 0xae, 0x62, 0x7f, 0x8d, 0x59, 0x26, 0x89, 0xa9, 0x2d, 0x65, - 0x4a, 0xa0, 0x18, 0xf5, 0xdc, 0xfc, 0x68, 0x39, 0x8b, 0xcd, 0x07, 0xe1, - 0xfc, 0xa9, 0x48, 0x4e, 0xfe, 0x08, 0x8e, 0x04, 0x8c, 0xd1, 0xd9, 0xf1, - 0xe4, 0x59, 0xb8, 0xaf, 0xdb, 0x8e, 0x2b, 0x4c, 0xa0, 0xc4, 0x63, 0xc4, - 0x52, 0x83, 0x1f, 0xca, 0xb9, 0xfc, 0xd9, 0x4a, 0x41, 0xcd, 0x63, 0x14, - 0xac, 0xa1, 0x5c, 0x48, 0xa0, 0x58, 0xef, 0x4e, 0x36, 0x89, 0x5f, 0x48, - 0x8a, 0x6f, 0x2f, 0xef, 0xa3, 0x2d, 0x2a, 0x39, 0x7b, 0x6a, 0x57, 0x06, - 0xd6, 0x53, 0x03, 0xd0, 0xcb, 0x57, 0xcc, 0x7e, 0xc4, 0x74, 0x9e, 0x2f, - 0x8b, 0x26, 0xb9, 0x57, 0x10, 0xb7, 0xe3, 0x9f, 0x2e, 0xa3, 0xe3, 0xb8, - 0x4f, 0x18, 0xc7, 0xf3, 0xce, 0xc2, 0x93, 0x0d, 0x8c, 0x94, 0x11, 0xdc, - 0xf9, 0x05, 0xfd, 0x35, 0xcc, 0x72, 0xd5, 0x41, 0x68, 0xde, 0x0c, 0xe2, - 0x46, 0x24, 0xb9, 0x2c, 0x23, 0x2b, 0x0d, 0xa3, 0xc1, 0xf2, 0x05, 0x7e, - 0xe0, 0x28, 0xa9, 0x13, 0x1b, 0xa6, 0xde, 0x9d, 0x04, 0xee, 0xc3, 0x7f, - 0x62, 0xcb, 0x14, 0xdf, 0x60, 0xe4, 0xb2, 0x22, 0x7f, 0xb6, 0x45, 0xee, - 0xee, 0x08, 0x6d, 0x1c, 0xb4, 0xd2, 0x33, 0x02, 0x8d, 0x67, 0x83, 0xbe, - 0xb2, 0xa9, 0x1f, 0x34, 0x16, 0x9b, 0xf2, 0x4c, 0x79, 0xf9, 0x84, 0x23, - 0xb7, 0x12, 0xec, 0xac, 0x59, 0x6a, 0x9f, 0xa7, 0xb8, 0xc3, 0x45, 0x9a, - 0x3c, 0x41, 0x8e, 0x10, 0xa5, 0x52, 0xa5, 0x5d, 0x20, 0xbe, 0x32, 0xa3, - 0xf3, 0xf7, 0x0d, 0x9a, 0x9b, 0x8f, 0xb1, 0x42, 0x94, 0xb0, 0x3f, 0x8f, - 0xfb, 0x8e, 0x10, 0x2d, 0xe9, 0x34, 0xe2, 0x89, 0x7a, 0x3b, 0xad, 0x69, - 0x7c, 0xe2, 0x99, 0x78, 0x6c, 0xec, 0x6e, 0x10, 0xba, 0xc7, 0x3a, 0x90, - 0x07, 0xe2, 0x49, 0x16, 0x1b, 0xb6, 0x05, 0x6d, 0xf4, 0x3d, 0x1b, 0x47, - 0xb5, 0xcb, 0x4d, 0xde, 0x0b, 0x05, 0x2d, 0x1b, 0xba, 0xb1, 0xde, 0x6a, - 0x46, 0xc2, 0x9c, 0x7d, 0x57, 0xc9, 0x24, 0x41, 0xd0, 0xaf, 0x02, 0xcd, - 0x51, 0x73, 0x95, 0xee, 0x2e, 0x88, 0x28, 0x1a, 0xf5, 0x72, 0x0d, 0xf4, - 0xd0, 0x15, 0x10, 0xb5, 0x14, 0x4a, 0x73, 0xd1, 0xa8, 0x10, 0x6b, 0x3e, - 0x8c, 0x73, 0x31, 0xfe, 0x45, 0x98, 0xa5, 0x96, 0xba, 0x50, 0x0a, 0x0c, - 0x74, 0x83, 0xe1, 0x0f, 0x73, 0xb5, 0x52, 0x65, 0x1c, 0x0e, 0x0d, 0x2f, - 0xd4, 0xc2, 0x42, 0xcc, 0xb4, 0x66, 0x01, 0xe1, 0xed, 0xcd, 0xe8, 0x36, - 0x8b, 0x72, 0x44, 0xaa, 0x72, 0xff, 0xa9, 0x03, 0xcd, 0x8c, 0x8e, 0x65, - 0x30, 0x4d, 0x8d, 0xf6, 0x2a, 0x45, 0x27, 0xd2, 0x7f, 0x97, 0x4d, 0xb8, - 0xe1, 0x66, 0x94, 0xc2, 0x40, 0x35, 0xbf, 0x39, 0xa0, 0x45, 0x8a, 0x3f, - 0xcd, 0xd8, 0x30, 0x69, 0xaf, 0xa2, 0x4d, 0xec, 0x4c, 0x8c, 0x21, 0xec, - 0x73, 0x15, 0x13, 0x0b, 0xe1, 0x54, 0xfd, 0x09, 0x6c, 0xbb, 0xb5, 0x29, - 0x7e, 0xda, 0xf4, 0x7c, 0x62, 0x46, 0x07, 0x24, 0x30, 0xcf, 0xfc, 0x9f, - 0x35, 0xcd, 0x0c, 0x37, 0x74, 0x18, 0xde, 0x60, 0x4f, 0x83, 0x75, 0xd5, - 0x20, 0xc4, 0xa9, 0x02, 0x80, 0x84, 0x12, 0x1e, 0xeb, 0x7a, 0x3c, 0xe6, - 0xa8, 0xb3, 0xb3, 0x1c, 0x91, 0xdc, 0xb2, 0x55, 0xd1, 0x0f, 0x44, 0x2a, - 0x89, 0xd8, 0x53, 0x4d, 0x7f, 0x28, 0x5e, 0xae, 0x6e, 0x04, 0xd1, 0x74, - 0x94, 0x18, 0xfd, 0x74, 0x6e, 0x74, 0x11, 0x3e, 0x33, 0xc7, 0x63, 0xa9, - 0xc7, 0x7b, 0x02, 0x08, 0x91, 0x9f, 0x4b, 0xcd, 0x3c, 0xd0, 0xc7, 0x95, - 0x69, 0x96, 0xe4, 0xb0, 0xb1, 0x2f, 0x6c, 0x1e, 0xcf, 0x11, 0x1b, 0xff, - 0xf7, 0xdc, 0xc0, 0xb3, 0xfc, 0x31, 0xa3, 0xe1, 0xe3, 0x22, 0x3b, 0xee, - 0xbc, 0xa6, 0x95, 0x93, 0x1a, 0xf0, 0x46, 0xd0, 0xec, 0x0b, 0x6a, 0xd7, - 0x85, 0x37, 0x8c, 0x8f, 0xb8, 0xbd, 0xbf, 0x95, 0x2d, 0xe6, 0x71, 0xc9, - 0x28, 0x2e, 0xd7, 0x83, 0xed, 0x56, 0x8e, 0x02, 0x47, 0x76, 0x26, 0xb1, - 0xc1, 0x31, 0xfb, 0x06, 0xec, 0xf5, 0x60, 0x23, 0x3a, 0xa7, 0x42, 0xd3, - 0xd7, 0x87, 0x5f, 0x87, 0xef, 0xf0, 0x01, 0x63, 0x6d, 0x13, 0xbc, 0xc9, - 0x45, 0x5c, 0x05, 0x80, 0x4a, 0xd7, 0x97, 0x54, 0x2a, 0xf9, 0x31, 0x36, - 0x0c, 0x52, 0x9e, 0xba, 0x77, 0xda, 0xfd, 0x09, 0x6c, 0xbb, 0xb5, 0x29, - 0x7e, 0xda, 0xf4, 0x7c, 0x62, 0x46, 0x07, 0x24, 0x30, 0xcf, 0xfc, 0x9f, - 0x35, 0xcd, 0x0c, 0x37, 0x74, 0x18, 0xde, 0x60, 0x4f, 0x83, 0x75, 0xd5, - 0xfc, 0xaf, 0x08, 0xd2, 0x20, 0xee, 0x27, 0x4e, 0xf0, 0xce, 0xf3, 0x6d, - 0x11, 0x75, 0x08, 0x54, 0x5a, 0xf5, 0xb2, 0xc8, 0xb4, 0x3f, 0xc8, 0xdb, - 0x8e, 0xb0, 0x03, 0x59, 0xa0, 0x5f, 0xa2, 0x96, 0x93, 0xa1, 0x59, 0x78, - 0x15, 0xcd, 0xc7, 0x3b, 0x38, 0xb2, 0x83, 0x34, 0xc7, 0x3e, 0xf3, 0x2a, - 0x52, 0x4c, 0xce, 0xa5, 0x8d, 0x64, 0xaa, 0xd2, 0x5c, 0x4c, 0xb2, 0x20, - 0xde, 0x88, 0xac, 0x68, 0x29, 0xa9, 0x5b, 0x7b, 0xfb, 0x88, 0x74, 0x55, - 0xee, 0x5a, 0x46, 0x63, 0x29, 0x62, 0x15, 0x08, 0xc5, 0xb9, 0x48, 0xd2, - 0x01, 0xde, 0x57, 0x31, 0xd5, 0xb2, 0x88, 0x9b, 0x17, 0xb7, 0x49, 0xba, - 0x37, 0x16, 0x6c, 0x27, 0x26, 0x56, 0x67, 0xab, 0x27, 0x5e, 0xd7, 0x5f, - 0x80, 0xaf, 0x4b, 0x3c, 0x29, 0xf8, 0x6e, 0x64, 0xc7, 0xa3, 0xa4, 0x3a, - 0x09, 0xd1, 0x2c, 0x52, 0x82, 0x49, 0x6f, 0xcc, 0xf2, 0x13, 0x60, 0xe5, - 0xdd, 0xd5, 0xc9, 0x69, 0x84, 0x5a, 0xce, 0xcc, 0x86, 0x9f, 0x95, 0x90, - 0x88, 0x79, 0xd9, 0xeb, 0x95, 0xf1, 0xc9, 0x3d, 0x33, 0x3b, 0x28, 0x50, - 0xbe, 0xcf, 0x0f, 0x3f, 0x26, 0xe6, 0x5e, 0x71, 0xe2, 0xce, 0x01, 0x4f, - 0x41, 0x04, 0x53, 0x3d, 0x7a, 0xbf, 0x27, 0x74, 0xc8, 0xe4, 0xa1, 0xc9, - 0x12, 0xf9, 0xfc, 0xcf, 0x2b, 0xd7, 0x20, 0x2f, 0x6d, 0xf7, 0x3b, 0x0e, - 0x1f, 0x0a, 0x40, 0x88, 0xc5, 0x21, 0x91, 0x96, 0x5e, 0x58, 0x16, 0x01, - 0x51, 0x17, 0x62, 0xdf, 0xe3, 0x2c, 0xbf, 0x3f, 0x88, 0x19, 0xa7, 0xbc, - 0x8a, 0x76, 0xf7, 0x25, 0xbb, 0xa3, 0x7d, 0x70, 0x14, 0xad, 0x45, 0x0b, - 0x1e, 0xab, 0x8a, 0x34, 0x6d, 0xaf, 0x3c, 0x95, 0xae, 0x77, 0xd9, 0x53, - 0x90, 0x81, 0xac, 0x66, 0x33, 0x18, 0x41, 0x8c, 0xcf, 0x48, 0x55, 0x16, - 0xdb, 0x85, 0x7e, 0xb5, 0x57, 0x87, 0x57, 0x54, 0x91, 0x7e, 0xf6, 0x82, - 0xe5, 0xf2, 0x63, 0x71, 0xd2, 0x1f, 0xc1, 0x02, 0x33, 0x59, 0x5a, 0xad, - 0xa5, 0xac, 0xad, 0xba, 0x18, 0xa0, 0x13, 0xf7, 0xe3, 0x21, 0xae, 0x2d, - 0xed, 0xa5, 0x9a, 0x2d, 0x76, 0x2c, 0xfd, 0x61, 0x04, 0x20, 0x9a, 0x05, - 0xe3, 0xf4, 0xaf, 0xcd, 0x8a, 0xa2, 0xe7, 0x76, 0x58, 0x47, 0xfd, 0x40, - 0x7e, 0xe7, 0xb4, 0x52, 0xf4, 0x67, 0x02, 0x4e, 0x5e, 0x45, 0x64, 0x5e, - 0xa9, 0x99, 0xe7, 0xc2, 0xbd, 0x2a, 0x4d, 0x8b, 0x8a, 0x6b, 0x64, 0x82, - 0x7f, 0xc3, 0xd2, 0x76, 0x2f, 0x2c, 0xc8, 0x8e, 0xe2, 0x80, 0xbc, 0x1d, - 0xe9, 0xa2, 0xf8, 0x30, 0x40, 0xa6, 0x02, 0xfb, 0x48, 0xe4, 0x39, 0x79, - 0x4c, 0xf0, 0xb6, 0x8f, 0x16, 0x10, 0x61, 0x2b, 0xc0, 0x46, 0x78, 0x6c, - 0x05, 0x6d, 0x18, 0x82, 0x0c, 0x78, 0x6c, 0x90, 0x2b, 0x3c, 0x7b, 0x54, - 0xa0, 0x39, 0xa3, 0xa7, 0x3e, 0x06, 0x78, 0x22, 0x86, 0xc5, 0x78, 0x53, - 0xd0, 0xe3, 0xd4, 0xe8, 0x34, 0x76, 0xa1, 0x92, 0x62, 0x6b, 0x3a, 0x7d, - 0x98, 0x29, 0x35, 0xe2, 0x8c, 0xa2, 0xf2, 0x2d, 0x04, 0xb2, 0x09, 0x21, - 0x41, 0x66, 0x2f, 0x3d, 0xa7, 0x2d, 0x0c, 0x48, 0x98, 0x3c, 0x17, 0x95, - 0x9a, 0xd5, 0x96, 0x03, 0x9d, 0x55, 0x71, 0x63, 0x31, 0x2a, 0xc6, 0x78, - 0xe8, 0x1f, 0x4d, 0x64, 0xcc, 0xe1, 0x0d, 0x3a, 0x8d, 0x5f, 0x04, 0x41, - 0xc7, 0xb1, 0x23, 0x17, 0xd1, 0xfa, 0x9e, 0x2e, 0x63, 0x95, 0xe3, 0xa0, - 0x6a, 0x83, 0x74, 0x2b, 0x13, 0x7d, 0x3d, 0x5c, 0xcb, 0x04, 0xc4, 0x82, - 0x9c, 0xe8, 0x48, 0xe3, 0xbb, 0x9f, 0x28, 0xb4, 0x70, 0x5d, 0xc7, 0x84, - 0x44, 0x22, 0x1e, 0xfd, 0x42, 0x0d, 0xdf, 0x20, 0xfd, 0x01, 0xb1, 0x4b, - 0xaa, 0xc8, 0xbf, 0x6c, 0x9d, 0xa8, 0xad, 0x51, 0x3a, 0xcb, 0x86, 0x49, - 0xb9, 0xf8, 0xd9, 0x83, 0xd4, 0x7f, 0x73, 0x74, 0x11, 0x8c, 0x77, 0x47, - 0xa2, 0xda, 0xfd, 0xba, 0xd5, 0x96, 0x5b, 0x77, 0xb9, 0x79, 0x8a, 0x22, - 0x1d, 0x8b, 0x75, 0x5c, 0xaf, 0x60, 0xb7, 0x54, 0x8b, 0xdd, 0xa2, 0xd4, - 0x3d, 0x75, 0x38, 0x32, 0xa5, 0xb9, 0xa5, 0x7a, 0xa0, 0xee, 0x1a, 0xb5, - 0xe3, 0x83, 0xc9, 0x56, 0xf5, 0x63, 0xdb, 0x46, 0xad, 0x21, 0xc0, 0xff, - 0x5e, 0x10, 0x04, 0x9b, 0x9a, 0x7d, 0x57, 0x8d, 0x0a, 0xd1, 0x6d, 0xeb, - 0x5b, 0x9d, 0xa6, 0xa0, 0x68, 0x7c, 0x2c, 0x91, 0x95, 0x00, 0xdf, 0xc7, - 0x97, 0x45, 0x9a, 0x3d, 0xd0, 0x1a, 0x10, 0x75, 0x47, 0x05, 0x98, 0x5d, - 0xd8, 0x4b, 0x88, 0xa3, 0x52, 0x37, 0xe0, 0x0c, 0x90, 0xfc, 0x5c, 0x8a, - 0xbf, 0xdb, 0xe1, 0x14, 0x69, 0x4c, 0xf2, 0x72, 0xf2, 0xc2, 0x3e, 0x9e, - 0x01, 0x50, 0x3b, 0x2a, 0x49, 0x2a, 0x1b, 0x2e, 0x35, 0xc1, 0x86, 0x23, - 0xfd, 0x08, 0xd8, 0x28, 0xbc, 0xf4, 0x13, 0x4c, 0xd4, 0x5f, 0x2d, 0x1d, - 0x0d, 0x75, 0x91, 0xc1, 0x21, 0x2b, 0x83, 0x96, 0x6b, 0x70, 0xe9, 0x41, - 0xde, 0x01, 0xdb, 0xd6, 0x6a, 0x50, 0xda, 0x45, 0xea, 0xa7, 0x16, 0x03, - 0xaa, 0xac, 0x3b, 0xa5, 0x98, 0x06, 0x5f, 0xa7, 0xfa, 0xbf, 0x3e, 0x42, - 0x2d, 0x0b, 0xf7, 0x65, 0x78, 0xbc, 0xd0, 0x69, 0x0b, 0x04, 0x73, 0x67, - 0x7c, 0x4a, 0xa8, 0x35, 0xac, 0x2e, 0x92, 0xf8, 0x08, 0x1a, 0x38, 0x60, - 0x86, 0x06, 0x18, 0xa3, 0x29, 0x69, 0x03, 0xf8, 0xb7, 0x1a, 0x76, 0xc4, - 0x49, 0x5e, 0x83, 0x5d, 0x0a, 0xbe, 0x6c, 0x43, 0xf3, 0xcf, 0x4a, 0x78, - 0x3b, 0xe1, 0xb7, 0xc5, 0x99, 0x40, 0x13, 0x6c, 0xe7, 0x43, 0x5f, 0xe3, - 0x3a, 0x8b, 0x38, 0xd7, 0x55, 0xfd, 0x1d, 0x93, 0x3b, 0x0d, 0x97, 0xee, - 0x14, 0x3d, 0x52, 0xe6, 0x1e, 0x60, 0xab, 0x8d, 0x45, 0xce, 0x16, 0x1a, - 0x81, 0x9c, 0xaf, 0xc0, 0xa6, 0x9f, 0x4f, 0x8d, 0xa1, 0x54, 0xeb, 0x57, - 0x85, 0x8a, 0x7b, 0x20, 0xf3, 0xbb, 0x77, 0xe6, 0x5f, 0xb6, 0xbf, 0xf8, - 0xcc, 0xe3, 0x39, 0xcc, 0x31, 0xb4, 0x32, 0x61, 0xbf, 0xf5, 0x22, 0xf2, - 0x03, 0xef, 0x93, 0x05, 0x7e, 0xe2, 0xbf, 0xb2, 0x4e, 0xf0, 0x19, 0xff, - 0x3c, 0x80, 0xf2, 0xc0, 0xf8, 0x45, 0x53, 0x55, 0x92, 0xd6, 0xf9, 0x3c, - 0x14, 0x7d, 0xa9, 0x23, 0x4a, 0xbc, 0xa9, 0x24, 0xcb, 0x77, 0xd2, 0x48, - 0x44, 0xe5, 0xaf, 0x36, 0xd7, 0xc8, 0x6f, 0x93, 0x75, 0x4e, 0x69, 0x3c, - 0x32, 0xf7, 0x50, 0x0d, 0xc1, 0x65, 0x95, 0xed, 0x33, 0xcc, 0x41, 0x49, - 0x79, 0xcd, 0xc3, 0x16, 0xfa, 0x4f, 0xdf, 0xcc, 0xae, 0xd9, 0x7e, 0xd4, - 0x1e, 0x97, 0xd9, 0xca, 0x20, 0x6b, 0xbb, 0x96, 0x9f, 0x66, 0x89, 0xea, - 0xbd, 0x95, 0xde, 0x93, 0x1d, 0x1b, 0x03, 0xcb, 0x95, 0xf4, 0xe6, 0x96, - 0x8b, 0xaa, 0xba, 0x3c, 0x35, 0xce, 0xa1, 0xae, 0xbb, 0x41, 0x81, 0xc7, - 0xa7, 0x04, 0x9b, 0x9b, 0xa1, 0x41, 0xbb, 0x52, 0x9b, 0x5a, 0xe1, 0x0f, - 0x8d, 0x0b, 0xc3, 0x3f, 0x9f, 0x18, 0xe5, 0x1c, 0xfe, 0xd3, 0x85, 0xf4, - 0x6e, 0x65, 0x6d, 0x53, 0x3b, 0xdd, 0x15, 0xca, 0x3d, 0x97, 0x77, 0x65, - 0xa2, 0x26, 0xf8, 0xa1, 0xa9, 0x9e, 0x35, 0x14, 0x1b, 0xe8, 0x68, 0xce, - 0x9e, 0x07, 0x84, 0x42, 0xf2, 0x6c, 0xe0, 0x81, 0xe4, 0x02, 0xe4, 0x2a, - 0xeb, 0x01, 0xe7, 0xa8, 0xe2, 0x36, 0x76, 0xf9, 0xdf, 0x88, 0xb0, 0x99, - 0xf9, 0xd8, 0xcf, 0x00, 0x23, 0xaf, 0xd1, 0x2d, 0x4d, 0x0a, 0x28, 0x01, - 0xd4, 0xc9, 0xd4, 0x3c, 0xa7, 0x5e, 0xf5, 0x91, 0x2d, 0xab, 0x90, 0x1e, - 0xbe, 0xea, 0xad, 0xb8, 0xf5, 0x8b, 0x0e, 0x72, 0x51, 0x86, 0x89, 0xc4, - 0x93, 0x35, 0xc1, 0x29, 0xad, 0x7a, 0x19, 0xec, 0xf4, 0x41, 0x23, 0x3d, - 0xeb, 0x57, 0x11, 0xd9, 0x6f, 0x1e, 0xfb, 0xbe, 0x0d, 0xdc, 0xad, 0xdb, - 0x93, 0xf0, 0xdf, 0x09, 0x63, 0x10, 0x32, 0xbf, 0x5e, 0x94, 0x58, 0x5c, - 0xe4, 0x55, 0xf9, 0xaf, 0x9a, 0xd4, 0xd4, 0x13, 0xbe, 0x01, 0x9d, 0x92, - 0x86, 0x90, 0xdf, 0x35, 0xe5, 0x4f, 0xde, 0x36, 0x9f, 0x6e, 0x17, 0x43, - 0x7f, 0x42, 0xaf, 0x16, 0xed, 0x8a, 0x01, 0xce, 0x84, 0x14, 0x5f, 0x9c, - 0x6c, 0xe1, 0x03, 0x11, 0xcb, 0x7f, 0x4a, 0x49, 0x13, 0x4e, 0xae, 0xae, - 0x19, 0xa3, 0x75, 0xe6, 0xd0, 0x84, 0x03, 0xf0, 0x93, 0x95, 0x38, 0xbc, - 0xf3, 0x4b, 0x09, 0x83, 0x78, 0xd2, 0x35, 0x3b, 0x2d, 0x81, 0xae, 0xc5, - 0x50, 0x69, 0x06, 0xdb, 0x19, 0x15, 0x41, 0x58, 0x5d, 0x40, 0xb3, 0x3e, - 0x36, 0xe6, 0x25, 0x2f, 0x1d, 0x5a, 0xc3, 0x3e, 0xad, 0x70, 0xda, 0x35, - 0x7c, 0x1e, 0x46, 0x96, 0x3c, 0xe0, 0x48, 0xd2, 0x1c, 0x77, 0x3b, 0x0d, - 0x16, 0xf6, 0x71, 0x0e, 0x3c, 0x67, 0x7c, 0x83, 0x63, 0x27, 0x2c, 0x26, - 0x4e, 0x4b, 0xc9, 0x23, 0x0a, 0xca, 0x4b, 0x78, 0x3e, 0x9f, 0xae, 0x22, - 0x05, 0xad, 0x87, 0xfb, 0xc0, 0x37, 0x8d, 0xb3, 0x1d, 0x86, 0xfd, 0x74, - 0x63, 0xc2, 0xe2, 0x32, 0xb3, 0xd0, 0xb7, 0xd3, 0x58, 0x2c, 0x03, 0x8f, - 0x16, 0x8d, 0x59, 0xa5, 0x52, 0xa5, 0x0c, 0x49, 0xdc, 0x57, 0x96, 0xa4, - 0x6c, 0x68, 0x72, 0x5c, 0xb5, 0xc9, 0xd8, 0xce, 0x41, 0x3d, 0xe3, 0x34, - 0x97, 0xfc, 0xfb, 0x82, 0xaa, 0x7a, 0x08, 0x1a, 0xf0, 0xa9, 0x54, 0xcd, - 0xaa, 0xed, 0xe3, 0xc8, 0x5f, 0x80, 0x38, 0x1d, 0x06, 0xf6, 0x15, 0x66, - 0x9c, 0x11, 0x53, 0xa3, 0xa5, 0x2b, 0x8b, 0x56, 0x5c, 0x30, 0x39, 0x22, - 0x17, 0xa5, 0x40, 0xc0, 0x0e, 0xd3, 0x20, 0x5a, 0x2e, 0xfd, 0xdb, 0xec, - 0x11, 0x10, 0xc2, 0xb4, 0x72, 0xaf, 0x07, 0x29, 0x0c, 0xa2, 0x11, 0x57, - 0x8c, 0xaa, 0x7a, 0xdd, 0x15, 0x42, 0x51, 0xf3, 0x3d, 0xa1, 0xb0, 0x39, - 0x7e, 0x62, 0xe7, 0x1e, 0x98, 0x90, 0x65, 0xeb, 0x1e, 0x57, 0x56, 0xec, - 0xe2, 0x44, 0xb8, 0x85, 0x8f, 0xee, 0x19, 0x63, 0x62, 0xfa, 0x78, 0x1a, - 0xed, 0x19, 0x11, 0x45, 0x48, 0xe1, 0x7d, 0xa8, 0x1f, 0xc7, 0x5f, 0xce, - 0xcc, 0xe7, 0x19, 0x93, 0xd1, 0x06, 0xf6, 0x82, 0xda, 0x64, 0x9c, 0x20, - 0xf7, 0x9e, 0x7c, 0x74, 0x44, 0x36, 0x1e, 0xef, 0xb3, 0xfe, 0x23, 0xe6, - 0x8c, 0x4a, 0x72, 0xe7, 0xc4, 0xdd, 0x84, 0x42, 0xd7, 0xac, 0x38, 0x19, - 0x9e, 0x06, 0x76, 0x14, 0xe5, 0x84, 0x0b, 0x91, 0x73, 0x66, 0xfe, 0x21, - 0x5e, 0x63, 0x9a, 0x7d, 0xaf, 0xc3, 0x8b, 0x9e, 0x10, 0x6b, 0x15, 0xb4, - 0xa9, 0x57, 0x66, 0x2c, 0x67, 0xf9, 0xa9, 0x08, 0x43, 0x58, 0xa3, 0xde, - 0x13, 0x3d, 0x0b, 0xca, 0xe1, 0x8c, 0xc1, 0x5f, 0xdf, 0x6f, 0x05, 0x8d, - 0xb6, 0xed, 0xa6, 0x74, 0x41, 0xdc, 0x37, 0x47, 0xa1, 0x6e, 0x47, 0x23, - 0x79, 0x23, 0xce, 0x24, 0x54, 0x8a, 0x2a, 0xb8, 0x9e, 0xa7, 0xbd, 0xd9, - 0x35, 0x5b, 0xe9, 0xc8, 0xb8, 0xe4, 0xf2, 0x5f, 0x5f, 0x37, 0xb7, 0x77, - 0x4b, 0xef, 0x9c, 0xed, 0x37, 0x23, 0xb3, 0xca, 0xe9, 0x1b, 0x84, 0x02, - 0xec, 0x4d, 0x72, 0x95, 0x04, 0x90, 0x61, 0x31, 0x77, 0x90, 0x0e, 0x2d, - 0x57, 0xdd, 0x9b, 0x9d, 0x4f, 0x61, 0xaa, 0x80, 0xbb, 0x56, 0xa5, 0x18, - 0x11, 0x2e, 0x9a, 0x30, 0x3c, 0xa5, 0x72, 0x95, 0xde, 0x8c, 0x4f, 0x9f, - 0x6e, 0x1b, 0x1e, 0x9d, 0xd9, 0x4f, 0x2d, 0xff, 0x27, 0x8b, 0x2a, 0xb0, - 0xd9, 0x90, 0x5f, 0x19, 0x33, 0xd6, 0x13, 0xc7, 0xeb, 0xbd, 0xa3, 0xc5, - 0x79, 0xe6, 0x38, 0xd8, 0xa8, 0x96, 0x77, 0xee, 0xf9, 0xf9, 0x71, 0x43, - 0x20, 0x3f, 0x02, 0x42, 0x0e, 0xbf, 0x8b, 0xa9, 0xf1, 0x15, 0x12, 0x16, - 0xd7, 0xc5, 0xd0, 0xf5, 0x02, 0x31, 0x7b, 0xa9, 0x34, 0xd6, 0x7a, 0xbf, - 0x67, 0x6a, 0x33, 0x1b, 0xa2, 0xe5, 0x89, 0xc7, 0x38, 0x9b, 0xa3, 0x46, - 0x87, 0x20, 0x58, 0xa1, 0x6e, 0x5e, 0x24, 0xcf, 0x10, 0x05, 0xe2, 0x04, - 0xf3, 0x23, 0xe0, 0xfe, 0x0e, 0xd7, 0x00, 0xa2, 0x69, 0xbe, 0x28, 0xc2, - 0xa1, 0x53, 0x64, 0xd6, 0x7c, 0x24, 0x35, 0xce, 0x28, 0x63, 0x14, 0xfb, - 0x34, 0x76, 0x25, 0x4a, 0x8f, 0xd4, 0xe1, 0xf9, 0xef, 0x42, 0xa0, 0xdf, - 0xfc, 0xca, 0x14, 0x39, 0xb3, 0x81, 0xe8, 0xa5, 0x12, 0x02, 0xb9, 0xb2, - 0xac, 0x51, 0x70, 0x29, 0xce, 0xab, 0x83, 0x0f, 0xeb, 0x8e, 0x2a, 0x54, - 0xe0, 0x9a, 0x20, 0xfe, 0x59, 0xc8, 0x38, 0x05, 0xf1, 0x27, 0x1b, 0x3a, - 0xc2, 0xfd, 0xca, 0xfb, 0x62, 0x7c, 0x4b, 0xaa, 0xce, 0xdc, 0xb4, 0xda, - 0xe9, 0xf3, 0xb9, 0x78, 0x4b, 0x90, 0x81, 0x9d, 0xa0, 0x0d, 0xeb, 0xcd, - 0x1a, 0x26, 0x79, 0x26, 0xf1, 0xaa, 0x86, 0x99, 0x58, 0xc8, 0x33, 0x62, - 0xe0, 0x64, 0x71, 0xf1, 0x77, 0x1d, 0x5f, 0x32, 0x9d, 0xa9, 0xeb, 0x94, - 0x31, 0x51, 0x67, 0xad, 0xfc, 0xbc, 0x94, 0x88, 0x55, 0x6a, 0x9c, 0x7e, - 0x13, 0xcb, 0x14, 0x01, 0xd6, 0x95, 0x11, 0xc1, 0x45, 0xa0, 0xca, 0xc9, - 0x98, 0xcc, 0xbf, 0x28, 0x27, 0x9e, 0xff, 0x2c, 0x8d, 0xc3, 0x4d, 0x47, - 0xc9, 0x69, 0xd4, 0x4d, 0x2a, 0xd6, 0x83, 0x00, 0x69, 0xb6, 0xee, 0x01, - 0xc0, 0x3a, 0xfd, 0xc1, 0x84, 0x76, 0x05, 0x2a, 0x19, 0xf6, 0x13, 0x77, - 0x4f, 0x7d, 0xbd, 0x91, 0x23, 0xd5, 0xa0, 0x46, 0x28, 0xbc, 0xef, 0x88, - 0x89, 0x11, 0x26, 0x51, 0xf3, 0xb7, 0x5e, 0xd2, 0x8c, 0x54, 0x41, 0x9e, - 0x83, 0x45, 0x79, 0x2b, 0x5f, 0x3a, 0x3a, 0xf0, 0xf5, 0xfc, 0xf5, 0x23, - 0x22, 0x2b, 0xd0, 0x94, 0x50, 0xc2, 0x5b, 0xac, 0x41, 0x3d, 0xec, 0xfa, - 0x60, 0xcf, 0x4a, 0x5f, 0xf4, 0xed, 0x23, 0x83, 0x60, 0xfe, 0x58, 0x83, - 0x53, 0x84, 0x99, 0x54, 0xb9, 0xa3, 0x15, 0x1b, 0x9c, 0x10, 0xec, 0xc7, - 0x11, 0x0d, 0x5e, 0x36, 0x32, 0x2f, 0x0d, 0xf3, 0x20, 0xc2, 0x1c, 0x5a, - 0x64, 0xf2, 0xaf, 0x30, 0x36, 0xfe, 0x96, 0x9c, 0x34, 0xa1, 0x70, 0xc9, - 0xf9, 0x61, 0xd6, 0x1a, 0x7a, 0x62, 0x51, 0xcd, 0x46, 0xfe, 0xcf, 0x31, - 0xa2, 0xc4, 0xd9, 0xc1, 0xec, 0x8c, 0xbf, 0x30, 0x9a, 0x4c, 0x70, 0xe9, - 0x0a, 0x2a, 0xca, 0x10, 0xa6, 0xe2, 0x26, 0x01, 0xda, 0x16, 0x10, 0xe2, - 0x90, 0x12, 0x02, 0x2b, 0xca, 0x9b, 0x2f, 0x46, 0xe6, 0xcd, 0x0a, 0xcb, - 0xea, 0x19, 0xf6, 0xe1, 0xe2, 0xf0, 0xca, 0x80, 0xe4, 0xf9, 0xe7, 0x5e, - 0x6b, 0x17, 0xb6, 0xe8, 0xe8, 0x4e, 0xba, 0x30, 0x8a, 0xc1, 0xd8, 0x0f, - 0xb5, 0x39, 0x7b, 0x08, 0x3d, 0xb7, 0x19, 0x22, 0x16, 0x0c, 0x9d, 0xae, - 0xcb, 0xdf, 0xee, 0x8b, 0x10, 0x2f, 0xb4, 0xd9, 0xad, 0x56, 0xda, 0x15, - 0x94, 0x56, 0x04, 0x92, 0x6d, 0x22, 0xb2, 0x95, 0x41, 0xdc, 0x44, 0x28, - 0x65, 0xf4, 0x97, 0xf5, 0xf5, 0xc5, 0xce, 0x2a, 0x35, 0x08, 0x9f, 0x1f, - 0x4d, 0x07, 0x48, 0x1b, 0xe2, 0xe2, 0x57, 0x13, 0x94, 0xfc, 0xb9, 0xcb, - 0x13, 0x83, 0x80, 0x9a, 0xbe, 0xf8, 0xd0, 0x4e, 0xe5, 0x71, 0x8b, 0xcb, - 0x6e, 0xc8, 0x2f, 0x35, 0x3d, 0x68, 0xa9, 0xcf, 0x33, 0x63, 0x82, 0x05, - 0xa8, 0x3e, 0x1b, 0x06, 0xda, 0x3a, 0x56, 0x08, 0x3d, 0x61, 0x9c, 0x21, - 0xa7, 0xed, 0x0d, 0x31, 0x1c, 0xa0, 0xf2, 0x7b, 0xfe, 0x24, 0x13, 0x9f, - 0x1c, 0x9a, 0x85, 0xa9, 0x14, 0x8f, 0xb7, 0x21, 0x77, 0x12, 0x95, 0x45, - 0x95, 0x6f, 0xcc, 0xb9, 0xaa, 0xa5, 0x17, 0xee, 0x89, 0x9d, 0x91, 0x15, - 0x04, 0xfb, 0x88, 0xe3, 0x9d, 0x74, 0xb6, 0xb7, 0x0e, 0xa1, 0xe8, 0xb8, - 0xd6, 0x67, 0xd5, 0x21, 0xbf, 0x16, 0xe6, 0xcd, 0x88, 0x5f, 0x0d, 0x1f, - 0x3c, 0xe0, 0x48, 0xd2, 0x1c, 0x77, 0x3b, 0x0d, 0x16, 0xf6, 0x71, 0x4e, - 0x3c, 0x67, 0x7c, 0x83, 0x5f, 0x03, 0xf1, 0xb2, 0xcc, 0xd4, 0x1b, 0x44, - 0x76, 0x45, 0xeb, 0x18, 0xda, 0x3f, 0xf6, 0x04, 0x1f, 0x04, 0xd3, 0x95, - 0xeb, 0xee, 0x7a, 0x24, 0x6c, 0x1b, 0xdb, 0xd3, 0x3d, 0x54, 0x2e, 0xc1, - 0xa3, 0x2c, 0x1c, 0xe6, 0x7a, 0xa7, 0xd1, 0x65, 0x27, 0xf9, 0xbd, 0x1a, - 0xd3, 0x6f, 0x0b, 0xa3, 0x90, 0xc9, 0xcd, 0x88, 0x2b, 0x8c, 0x51, 0xaa, - 0xd4, 0x07, 0x55, 0x62, 0x89, 0x23, 0x1d, 0xec, 0xe6, 0xd4, 0x9b, 0x24, - 0xa9, 0xed, 0x7f, 0xae, 0x81, 0x39, 0xa3, 0x54, 0x42, 0x2e, 0xe3, 0x32, - 0x5f, 0xf8, 0x09, 0xb4, 0x3c, 0x61, 0x76, 0xda, 0x8c, 0x72, 0x00, 0x3f, - 0x4a, 0x91, 0x6b, 0x10, 0xa4, 0x41, 0x86, 0x87, 0xd5, 0x1f, 0xda, 0xaf, - 0xc6, 0x22, 0x11, 0xe0, 0x6c, 0x58, 0x5e, 0x33, 0xb4, 0xb8, 0x29, 0x8f, - 0x78, 0xb0, 0x2e, 0x53, 0xcc, 0xd3, 0xe8, 0xd9, 0xcd, 0xf3, 0xb6, 0x65, - 0x10, 0x85, 0xf6, 0x95, 0xd4, 0xb7, 0xa8, 0x66, 0x01, 0x6f, 0xbf, 0xa5, - 0xb4, 0xce, 0x8e, 0x6b, 0xb0, 0x86, 0xf2, 0x69, 0xe8, 0x59, 0xa1, 0xa4, - 0xe9, 0x48, 0xa3, 0x9c, 0x1e, 0x0b, 0x53, 0xf1, 0xe8, 0xa9, 0x31, 0x17, - 0x2d, 0x61, 0xb7, 0xe3, 0xac, 0x24, 0x8a, 0x6a, 0x0f, 0x71, 0xf9, 0x15, - 0x7f, 0xde, 0x60, 0x10, 0x2d, 0x1a, 0xaf, 0xbc, 0x69, 0x54, 0xcb, 0xa2, - 0x33, 0x14, 0x97, 0x58, 0x2f, 0xbe, 0x50, 0x71, 0x2e, 0x66, 0xdc, 0x4b, - 0x17, 0x6a, 0xc7, 0x31, 0x05, 0xcd, 0xff, 0x34, 0x82, 0xcc, 0x7c, 0x22, - 0x9f, 0xf8, 0x27, 0xd0, 0xe6, 0xf6, 0x9f, 0x08, 0x6a, 0x2d, 0x86, 0x02, - 0xac, 0x5c, 0x29, 0x18, 0x39, 0x6f, 0xbb, 0xaf, 0x51, 0xdb, 0x70, 0x1a, - 0x0c, 0x87, 0xf9, 0x47, 0x3e, 0x33, 0x33, 0x38, 0xb5, 0x33, 0x7d, 0xdc, - 0xc2, 0x93, 0x91, 0x6a, 0x73, 0xc6, 0xdb, 0x59, 0x34, 0x35, 0x96, 0x98, - 0x84, 0xd9, 0xe2, 0xb6, 0xd0, 0x44, 0xc4, 0xb5, 0x18, 0x1e, 0x5c, 0xed, - 0x79, 0xfb, 0xa0, 0x2a, 0xe1, 0x3d, 0x73, 0x42, 0xba, 0xf0, 0xa9, 0x6d, - 0x07, 0x76, 0xb8, 0x01, 0xc7, 0xec, 0x92, 0x2b, 0x9e, 0x1a, 0xb7, 0x21, - 0x82, 0xdf, 0xe3, 0x76, 0x7e, 0x99, 0xa5, 0x05, 0xb4, 0x3f, 0xf0, 0x6b, - 0x89, 0xf9, 0xa7, 0xc4, 0x0f, 0x06, 0x31, 0x4e, 0xad, 0xb4, 0x99, 0xc8, - 0xcb, 0xd0, 0xd6, 0x9b, 0xfd, 0xdd, 0x1d, 0x00, 0x69, 0xa1, 0xbe, 0x19, - 0xf6, 0xe8, 0xd1, 0x8d, 0x55, 0x01, 0xc9, 0x93, 0xf0, 0xf1, 0x4c, 0x9e, - 0x60, 0x6d, 0x7f, 0xcb, 0x39, 0x19, 0x09, 0x57, 0x27, 0x50, 0x9d, 0x7d, - 0x18, 0x7f, 0x40, 0x32, 0xbb, 0x63, 0x1d, 0xc1, 0xe9, 0x29, 0xc7, 0xe3, - 0x10, 0xda, 0xd2, 0x82, 0xc6, 0x02, 0x77, 0x98, 0x8d, 0xed, 0x34, 0x6b, - 0xb2, 0x8b, 0x33, 0xa8, 0xda, 0xec, 0x3f, 0x98, 0x29, 0xfe, 0x3a, 0xae, - 0x3c, 0xeb, 0xc9, 0x45, 0x7c, 0x32, 0xdd, 0x51, 0x46, 0x21, 0xa0, 0x0e, - 0x08, 0xdf, 0x79, 0xfc, 0xdd, 0x20, 0x86, 0xa4, 0x9c, 0xdb, 0x35, 0x98, - 0x17, 0x68, 0x85, 0x27, 0x32, 0xed, 0x28, 0xc7, 0xcb, 0xe4, 0x83, 0xf8, - 0xf2, 0x65, 0xa9, 0xfa, 0x67, 0xe7, 0x75, 0xcb, 0x21, 0x26, 0x00, 0xf9, - 0x12, 0x67, 0xed, 0x84, 0x77, 0x51, 0x11, 0x9c, 0x27, 0xc3, 0x5e, 0x1b, - 0x39, 0x38, 0x49, 0x1d, 0x1d, 0xd5, 0x69, 0x45, 0xf3, 0xb8, 0x4a, 0xe7, - 0x35, 0x29, 0xa3, 0x01, 0x35, 0x5c, 0x3b, 0x14, 0x00, 0x8d, 0xab, 0x0c, - 0x53, 0x37, 0x6c, 0x15, 0x11, 0x06, 0x00, 0xa9, 0x7f, 0xd2, 0x4e, 0x5c, - 0xb4, 0xa5, 0x0f, 0x72, 0x8d, 0xfd, 0xbe, 0x64, 0x6f, 0x33, 0xa9, 0xee, - 0x2b, 0x3f, 0x5e, 0x87, 0x68, 0x6a, 0xac, 0xdb, 0x5c, 0x2b, 0x4b, 0xeb, - 0x29, 0x57, 0xb8, 0x95, 0x93, 0xb9, 0x77, 0x42, 0xc7, 0x9f, 0xdd, 0xd6, - 0x08, 0x7e, 0x98, 0x7a, 0x5f, 0x95, 0x91, 0x7e, 0xd1, 0x21, 0x1f, 0x69, - 0x30, 0x79, 0xb9, 0xe6, 0x16, 0xfc, 0x63, 0x60, 0x9d, 0xe4, 0x38, 0x67, - 0x1e, 0xa7, 0x65, 0x2a, 0xf1, 0x4b, 0x74, 0x45, 0x6d, 0x22, 0x0c, 0x1a, - 0x66, 0x2e, 0x24, 0xd5, 0x09, 0x29, 0x4f, 0xae, 0xa3, 0x50, 0x47, 0x96, - 0x96, 0xb1, 0x63, 0x89, 0xfd, 0x46, 0xdd, 0x7b, 0x5f, 0x0f, 0x39, 0xc8, - 0xb4, 0xc3, 0x3a, 0x09, 0x80, 0xbe, 0xe5, 0xcb, 0xa3, 0x69, 0x92, 0xc4, - 0xa4, 0xfa, 0xe1, 0x61, 0x24, 0x1d, 0x84, 0x9a, 0x79, 0x40, 0x84, 0xaf, - 0xd1, 0x58, 0x0b, 0xc8, 0xf4, 0xda, 0xa2, 0x58, 0x5a, 0x7a, 0x0a, 0x22, - 0xaf, 0xc0, 0xc0, 0x9e, 0x92, 0x2d, 0xb1, 0x9d, 0x73, 0xee, 0x53, 0x70, - 0x00, 0x2e, 0xfa, 0x56, 0x89, 0x50, 0x21, 0xb8, 0x53, 0x27, 0x97, 0xe3, - 0x78, 0xee, 0x94, 0xbd, 0xfa, 0x3f, 0x64, 0x86, 0x2c, 0x04, 0x70, 0x6d, - 0xaa, 0x79, 0x9c, 0xab, 0xf4, 0xee, 0xdb, 0x61, 0x95, 0xd0, 0x75, 0x74, - 0x81, 0x36, 0xfa, 0xbf, 0x26, 0x9e, 0x84, 0x77, 0xdf, 0xc8, 0x0f, 0x3f, - 0xfb, 0xa9, 0x8e, 0x72, 0xda, 0x80, 0x77, 0xc9, 0x77, 0x37, 0x1f, 0xc0, - 0x9a, 0x16, 0x17, 0x94, 0x5b, 0x13, 0x55, 0x22, 0xb6, 0xba, 0x36, 0xee, - 0x3c, 0x1a, 0x09, 0xa7, 0x74, 0x80, 0x43, 0xc3, 0xa3, 0x22, 0x95, 0xea, - 0xf7, 0x7b, 0xec, 0x39, 0x42, 0xfd, 0x9f, 0xfb, 0x27, 0xb8, 0xd0, 0x9b, - 0x8f, 0x30, 0x00, 0xf7, 0x14, 0x35, 0xea, 0x89, 0x81, 0xec, 0x86, 0xad, - 0x0a, 0x97, 0x6a, 0x94, 0xfa, 0x54, 0x52, 0x55, 0x8e, 0xd7, 0x54, 0xb8, - 0xc6, 0xab, 0xb2, 0x85, 0x07, 0x0d, 0x96, 0x0f, 0x2b, 0xbd, 0x1d, 0xb6, - 0x9c, 0xba, 0xc9, 0x2a, 0x26, 0x86, 0xe8, 0xc4, 0x4c, 0x79, 0xdc, 0x41, - 0x72, 0x73, 0x37, 0xa3, 0x8d, 0x7e, 0x3a, 0xfa, 0x91, 0x0e, 0xf5, 0x83, - 0x5b, 0x3b, 0x29, 0x43, 0x98, 0x36, 0xba, 0x4c, 0xb0, 0x41, 0x4c, 0x8d, - 0x79, 0x17, 0xa4, 0x15, 0x97, 0x9e, 0x08, 0xfa, 0xfc, 0x12, 0x5e, 0x30, - 0x6e, 0xde, 0x81, 0x5f, 0x85, 0xc8, 0xaf, 0x3d, 0xc9, 0x2e, 0x87, 0x7f, - 0xb4, 0x51, 0x25, 0x47, 0x39, 0x14, 0xb0, 0x8b, 0x83, 0xb5, 0x35, 0xe4, - 0x10, 0x1a, 0x59, 0x44, 0x62, 0xb3, 0x4f, 0x9e, 0xfd, 0x5f, 0x91, 0x55, - 0xa8, 0x01, 0xeb, 0xa8, 0xa1, 0x5d, 0x8f, 0x2f, 0x4f, 0xc6, 0x47, 0xd9, - 0xb4, 0xf0, 0x01, 0x0c, 0x2a, 0xc5, 0x6b, 0x8a, 0x91, 0xe2, 0x29, 0x7a, - 0xac, 0x52, 0x1f, 0x37, 0xc9, 0x1e, 0xb2, 0x1e, 0xb1, 0xc8, 0xbd, 0x26, - 0xd4, 0x5c, 0x51, 0x03, 0xb2, 0x45, 0x3b, 0xc9, 0x4b, 0x86, 0x18, 0xb9, - 0xe1, 0x41, 0x0b, 0x59, 0xbd, 0xe3, 0x4f, 0x34, 0x10, 0xe5, 0x56, 0xa6, - 0x25, 0x63, 0xc9, 0xac, 0x93, 0xdf, 0x38, 0x48, 0x06, 0x6f, 0xdf, 0x92, - 0xb9, 0x27, 0xdb, 0x65, 0x1a, 0x14, 0x6c, 0x70, 0xa4, 0x82, 0x07, 0x15, - 0xb6, 0xee, 0x91, 0xe0, 0x53, 0x8e, 0xe8, 0x25, 0xc5, 0x9c, 0x35, 0xf2, - 0xdb, 0xc9, 0x18, 0xc4, 0xc9, 0xe6, 0x7e, 0x85, 0x2d, 0xd1, 0x5a, 0xc7, - 0xd5, 0xff, 0xd7, 0x69, 0x69, 0x2e, 0x44, 0x76, 0x1a, 0xb2, 0x31, 0x2e, - 0x6c, 0xfc, 0x46, 0x98, 0x0b, 0x36, 0xcf, 0x77, 0x76, 0xbf, 0x28, 0x67, - 0x81, 0x54, 0xbb, 0x15, 0xb9, 0xdc, 0xb1, 0xa3, 0xcb, 0xa8, 0x6f, 0x2e, - 0x4c, 0xf4, 0xc8, 0x51, 0x8a, 0x19, 0xb6, 0xa7, 0x1f, 0xee, 0xd5, 0x25, - 0xe0, 0x55, 0xcf, 0x2a, 0xfb, 0xdb, 0xe2, 0xf4, 0xd8, 0xae, 0x05, 0x5b, - 0x69, 0xce, 0x30, 0xd3, 0x0d, 0xa1, 0xe6, 0x49, 0x79, 0xcc, 0x17, 0x98, - 0x8a, 0x51, 0xc0, 0x64, 0x45, 0x16, 0x0c, 0x20, 0x50, 0x8d, 0x71, 0x9d, - 0x5d, 0x5b, 0x05, 0x07, 0x59, 0x58, 0x68, 0x1a, 0xc4, 0x25, 0xbc, 0x5f, - 0xd7, 0x66, 0xec, 0x04, 0x75, 0xb8, 0x00, 0x87, 0xf1, 0x32, 0xc1, 0xc3, - 0x91, 0x47, 0x56, 0x30, 0xc1, 0x77, 0x3a, 0xca, 0x1f, 0x7a, 0x57, 0x75, - 0xf0, 0xfb, 0xf7, 0xa8, 0x11, 0x78, 0x17, 0xf7, 0x18, 0x22, 0x97, 0xeb, - 0xdb, 0x54, 0x42, 0xa5, 0x9c, 0xd0, 0x0a, 0xdf, 0xa6, 0x99, 0xed, 0xdf, - 0x21, 0xd9, 0x5d, 0x8a, 0x2d, 0xf5, 0x6f, 0xf3, 0xfe, 0x00, 0x17, 0x32, - 0x31, 0xdb, 0x1c, 0x3c, 0x83, 0xd8, 0xc5, 0x8c, 0x37, 0x69, 0xbe, 0xab, - 0x18, 0xbf, 0x01, 0xb7, 0x1a, 0xa8, 0xb4, 0x1e, 0x3e, 0xc5, 0xfa, 0x95, - 0xb2, 0xc6, 0xc6, 0xe0, 0x97, 0x8d, 0x72, 0xcd, 0xcf, 0x09, 0x4e, 0x5d, - 0xff, 0xbf, 0x6c, 0x06, 0x98, 0xfc, 0xe9, 0x7b, 0x18, 0x0d, 0x4a, 0xa8, - 0xfc, 0x9a, 0x16, 0xb9, 0x73, 0xa3, 0x1c, 0x28, 0xbb, 0x30, 0x2f, 0x43, - 0x96, 0xf2, 0x41, 0x6a, 0xee, 0xfd, 0x90, 0x87, 0x73, 0x10, 0x2f, 0x99, - 0xbf, 0x52, 0xd3, 0x02, 0x76, 0x37, 0x94, 0xce, 0x8d, 0x04, 0x0e, 0xa6, - 0xc1, 0x8e, 0xbc, 0xce, 0xd3, 0x7b, 0x4e, 0xbc, 0xe1, 0x41, 0x89, 0x65, - 0xb5, 0x05, 0x4e, 0x41, 0x17, 0x8c, 0x63, 0x7f, 0x71, 0x24, 0x8e, 0xe1, - 0x32, 0xb0, 0x2e, 0x02, 0xf9, 0x62, 0xc9, 0x86, 0x6b, 0xff, 0xaa, 0x55, - 0xf3, 0x50, 0x26, 0x3e, 0x5e, 0xd1, 0xb2, 0xc4, 0x96, 0xf5, 0x1f, 0xd4, - 0xf6, 0x82, 0xc9, 0xaf, 0x93, 0xe3, 0x18, 0x3f, 0x2b, 0xd2, 0x40, 0x83, - 0xdc, 0x90, 0x07, 0x4a, 0xcf, 0x54, 0x85, 0xd4, 0x3d, 0x15, 0x55, 0xd7, - 0x1d, 0xb6, 0xcb, 0x93, 0x8c, 0x72, 0x6f, 0xe6, 0xc9, 0x84, 0x42, 0x9c, - 0xe2, 0xa9, 0x23, 0x44, 0x3e, 0xc2, 0xdc, 0xc8, 0x7b, 0x01, 0xb6, 0x51, - 0x95, 0x60, 0x09, 0xcf, 0xf2, 0xcd, 0xf9, 0x37, 0x9b, 0xb0, 0xb7, 0xf3, - 0x67, 0x90, 0x54, 0x82, 0x65, 0x9a, 0xdc, 0x2a, 0x15, 0x21, 0x77, 0xa2, - 0x26, 0xad, 0x4d, 0x87, 0x61, 0x41, 0x82, 0x7a, 0x2b, 0x6f, 0x7f, 0x12, - 0x59, 0xd2, 0x89, 0xc3, 0x8c, 0xc5, 0x0c, 0xb9, 0xc3, 0x9d, 0x60, 0x10, - 0x90, 0x15, 0x75, 0xee, 0x0b, 0x6a, 0x5a, 0x28, 0xef, 0xd0, 0x89, 0x37, - 0xfd, 0x8d, 0xd1, 0x7e, 0xdd, 0x33, 0x56, 0x04, 0x6b, 0x64, 0x12, 0xf1, - 0x55, 0xdd, 0x11, 0x99, 0xb7, 0xec, 0x97, 0x51, 0xe1, 0xa4, 0xdf, 0x22, - 0x95, 0x5f, 0x0b, 0x60, 0x57, 0x76, 0xf4, 0x93, 0x9a, 0x95, 0x5b, 0x53, - 0x83, 0xfa, 0x70, 0x42, 0x5e, 0x3f, 0x62, 0x20, 0xf9, 0xa9, 0xb6, 0xbd, - 0xb6, 0xa2, 0xd3, 0xbf, 0x4d, 0x56, 0x19, 0xb0, 0x86, 0x96, 0xcc, 0xe5, - 0xd1, 0x6e, 0xd7, 0xd0, 0xa8, 0x3b, 0xb8, 0xe2, 0x81, 0x2e, 0xa3, 0x9f, - 0xb7, 0xe8, 0x51, 0xad, 0xa8, 0x12, 0xe6, 0x66, 0x69, 0x0f, 0xae, 0xd2, - 0xbd, 0x29, 0xae, 0xe7, 0x1a, 0x61, 0x1b, 0x41, 0xd4, 0xfc, 0x29, 0x55, - 0xd4, 0x5e, 0x97, 0xc3, 0x40, 0x72, 0x30, 0x2b, 0x83, 0x55, 0xaf, 0x88, - 0x5a, 0x3e, 0x29, 0x57, 0x05, 0x51, 0x2f, 0x8f, 0xc3, 0x15, 0x8d, 0xc4, - 0x0b, 0xce, 0xed, 0x88, 0xeb, 0x16, 0x17, 0xab, 0xb7, 0x32, 0x27, 0xb8, - 0x7f, 0x17, 0x80, 0x10, 0x16, 0x7f, 0xdd, 0x71, 0x67, 0x66, 0xcc, 0x1c, - 0x5a, 0x92, 0xac, 0xb4, 0xd3, 0x74, 0x90, 0x23, 0x71, 0x96, 0x79, 0x25, - 0x9d, 0xc3, 0xca, 0xa5, 0x61, 0xa9, 0xfb, 0xdb, 0x18, 0xf5, 0xb5, 0xf6, - 0x35, 0x59, 0x82, 0x7e, 0xe6, 0x2b, 0x61, 0xb6, 0x67, 0xd0, 0x29, 0x35, - 0xea, 0xfb, 0x4a, 0x41, 0x01, 0x94, 0xd1, 0x1a, 0x23, 0xa3, 0x97, 0x2f, - 0x49, 0x7f, 0x4b, 0xb5, 0xaa, 0xaf, 0xa7, 0xc0, 0x1e, 0x29, 0x8d, 0xab, - 0x28, 0x4f, 0x7f, 0xb8, 0x0a, 0x1e, 0xb1, 0xdb, 0x74, 0xb6, 0xc4, 0x7f, - 0xa9, 0x36, 0x90, 0x9c, 0x4f, 0xc1, 0x39, 0x82, 0x68, 0xda, 0x08, 0xf1, - 0x54, 0x20, 0x9d, 0xec, 0x7d, 0x0a, 0x67, 0x0f, 0x52, 0xce, 0x02, 0x3e, - 0x31, 0x3e, 0x37, 0x97, 0xf3, 0xf3, 0x16, 0x13, 0x1c, 0x40, 0x43, 0x0f, - 0x91, 0x6d, 0x70, 0x93, 0xfa, 0x7f, 0x36, 0xb4, 0xff, 0x1e, 0x40, 0xa3, - 0x19, 0xbd, 0xef, 0x39, 0x2b, 0x54, 0x14, 0x45, 0x9d, 0x5a, 0xfa, 0xc3, - 0xc7, 0xd6, 0x2c, 0x04, 0xca, 0x7b, 0xca, 0x53, 0xe4, 0x8c, 0x04, 0xa0, - 0xcb, 0x1b, 0xae, 0x3f, 0x3f, 0x50, 0xa9, 0xda, 0x2e, 0x7a, 0x32, 0x37, - 0xef, 0x9a, 0x78, 0xf4, 0x04, 0xd9, 0x81, 0x25, 0x18, 0xf1, 0x99, 0x04, - 0x1d, 0xf9, 0xa3, 0x2a, 0xbd, 0x97, 0x5e, 0xd5, 0x44, 0x9e, 0x7c, 0x4c, - 0x31, 0xd5, 0xc4, 0x04, 0x9b, 0x42, 0x87, 0x3f, 0xf9, 0x43, 0x4a, 0xe2, - 0x0b, 0x79, 0x13, 0xec, 0xbd, 0x91, 0x68, 0xdd, 0x32, 0xa2, 0x65, 0xe6, - 0xf8, 0x7d, 0xc8, 0x75, 0xa0, 0xfa, 0x25, 0x22, 0x06, 0x80, 0x63, 0x04, - 0xf7, 0x88, 0xa3, 0x98, 0x9a, 0xe0, 0x28, 0xd3, 0x64, 0x11, 0x47, 0xf8, - 0xaf, 0x97, 0xe7, 0xce, 0xc3, 0x2e, 0xcc, 0xaf, 0x1c, 0xed, 0x15, 0x78, - 0xf7, 0x66, 0xab, 0xdb, 0x71, 0x71, 0x99, 0x07, 0xa2, 0x7d, 0x93, 0x92, - 0x1f, 0x41, 0x56, 0xdc, 0xe8, 0x35, 0x74, 0x94, 0xe0, 0x52, 0xd4, 0x07, - 0xfb, 0x92, 0x67, 0xa6, 0xf5, 0xac, 0x18, 0x10, 0xf0, 0x83, 0xa0, 0x0e, - 0x2a, 0x5f, 0x0c, 0xd2, 0xf7, 0x81, 0x58, 0xab, 0x91, 0x6d, 0x1e, 0x91, - 0xa8, 0x24, 0x7e, 0x13, 0xd0, 0x53, 0xa0, 0xeb, 0x3f, 0xbf, 0x4c, 0x24, - 0x01, 0x58, 0xb3, 0x20, 0xe8, 0xf3, 0xf1, 0xaa, 0x25, 0x5e, 0xef, 0xa3, - 0x4a, 0x1a, 0x87, 0xa5, 0xa4, 0x80, 0xe4, 0x4d, 0x4a, 0x20, 0x31, 0x88, - 0xba, 0x74, 0xcd, 0x4a, 0x89, 0xab, 0x45, 0x14, 0xcc, 0xfe, 0x3e, 0xe3, - 0xb4, 0x9f, 0xbf, 0x3f, 0x05, 0x3b, 0x8d, 0xf7, 0x5b, 0xa7, 0x21, 0xfd, - 0xc8, 0x72, 0xea, 0x65, 0x6e, 0xe0, 0x04, 0x1f, 0x0d, 0x37, 0x14, 0x3a, - 0x49, 0x44, 0x6e, 0x5b, 0x9d, 0xbb, 0x46, 0x11, 0x5c, 0x94, 0xaa, 0x36, - 0x86, 0x7e, 0x6e, 0x62, 0x8f, 0xf2, 0x16, 0x7c, 0xc7, 0x34, 0x0c, 0xdd, - 0xf9, 0x85, 0xcf, 0x5f, 0x8e, 0x1f, 0xc7, 0xe1, 0x83, 0x69, 0x0e, 0x3b, - 0x40, 0xa5, 0xcc, 0xee, 0x9b, 0x17, 0xab, 0xac, 0xab, 0x97, 0xfd, 0x76, - 0x78, 0xce, 0xe1, 0x45, 0xad, 0x6b, 0x89, 0xce, 0xb8, 0x1f, 0x7d, 0xa4, - 0xb3, 0xca, 0x3d, 0x67, 0xa4, 0x89, 0x08, 0xf3, 0x4c, 0xbb, 0xaa, 0x9a, - 0x76, 0x98, 0xb2, 0x2f, 0xe3, 0x7f, 0x47, 0x38, 0x79, 0xec, 0xbd, 0x5a, - 0x1a, 0x2c, 0xb1, 0xb6, 0x43, 0x28, 0x92, 0x9d, 0x14, 0x10, 0x09, 0xd6, - 0x68, 0xac, 0x26, 0xf6, 0x0d, 0x93, 0x38, 0x0a, 0x79, 0x8d, 0x20, 0xb5, - 0x95, 0xc1, 0xbe, 0x84, 0x1e, 0xc3, 0x5e, 0xc2, 0x4e, 0xad, 0xf5, 0x68, - 0xb3, 0x54, 0xc1, 0x6b, 0x45, 0x5b, 0xcc, 0x80, 0x39, 0x21, 0xb7, 0xea, - 0x2a, 0xc0, 0x4e, 0xc6, 0xdd, 0xec, 0x9a, 0xf7, 0x63, 0xe3, 0x50, 0x3d, - 0x46, 0x5d, 0xab, 0x27, 0x1b, 0xae, 0x29, 0x5a, 0x21, 0x65, 0xa7, 0xcb, - 0xfc, 0xe5, 0x12, 0x80, 0x20, 0xa4, 0xdc, 0x8d, 0xcb, 0xf7, 0x58, 0xd9, - 0x7c, 0x6f, 0x15, 0x9f, 0x98, 0xba, 0x12, 0x2c, 0xcd, 0x1c, 0x96, 0x7a, - 0xd0, 0x90, 0xe2, 0x79, 0x3f, 0x9e, 0xbd, 0x82, 0x69, 0x56, 0x56, 0x03, - 0x4a, 0x6f, 0x4b, 0xf4, 0x66, 0xa8, 0xf5, 0xaf, 0x97, 0xda, 0x3d, 0xbb, - 0xd7, 0x6e, 0x3a, 0x94, 0x21, 0x23, 0x4e, 0xf0, 0xc2, 0x70, 0xf4, 0xfc, - 0x91, 0x49, 0xfc, 0x54, 0x74, 0x1d, 0xc2, 0x6b, 0x43, 0x55, 0xc8, 0xba, - 0x5d, 0x2f, 0x9a, 0x08, 0x5b, 0x64, 0xf3, 0xc7, 0x6f, 0x1a, 0x82, 0xf4, - 0xa6, 0x78, 0xa6, 0x78, 0x15, 0x90, 0x88, 0x15, 0x68, 0xf3, 0x6a, 0x96, - 0x49, 0xd8, 0xc9, 0x13, 0xf3, 0xb2, 0x0e, 0xba, 0x4b, 0x42, 0x8f, 0xf7, - 0x18, 0xc8, 0x52, 0xd9, 0xb1, 0x98, 0xa7, 0x17, 0x47, 0xec, 0x05, 0x65, - 0x19, 0xe9, 0xa5, 0x08, 0x5b, 0x77, 0x9a, 0xba, 0x14, 0x65, 0x3a, 0x6b, - 0xf2, 0x94, 0x7b, 0x3f, 0x11, 0xee, 0x6c, 0x65, 0x4e, 0xe2, 0x74, 0x52, - 0xd0, 0xbb, 0x9d, 0xe9, 0xa9, 0x58, 0xa1, 0x4b, 0xb5, 0x54, 0x74, 0xc7, - 0xd7, 0x97, 0xc5, 0xd1, 0x1d, 0xe8, 0x23, 0xfa, 0x38, 0xd4, 0x34, 0xcf, - 0xf1, 0x8b, 0xc8, 0x36, 0xeb, 0x24, 0x56, 0x50, 0xc5, 0x02, 0x7f, 0x8c, - 0xe5, 0x31, 0xfb, 0x22, 0xd3, 0xc7, 0x46, 0xbe, 0xc8, 0xb3, 0x32, 0x31, - 0xfb, 0xa5, 0xff, 0x13, 0x5d, 0x19, 0x14, 0xc0, 0x84, 0x00, 0x7c, 0x45, - 0x66, 0x8e, 0x96, 0x2c, 0x2b, 0x92, 0xa5, 0x19, 0xf0, 0x20, 0x72, 0x70, - 0xcf, 0xec, 0xb5, 0xe8, 0xf9, 0x36, 0xad, 0xdf, 0xa2, 0xdc, 0x50, 0xe7, - 0x83, 0x65, 0x63, 0x4e, 0x75, 0x87, 0x0c, 0x14, 0xf7, 0x73, 0x41, 0xb1, - 0x51, 0x7d, 0x15, 0x25, 0x52, 0x2b, 0x36, 0x1a, 0xd8, 0x1c, 0xc6, 0x0a, - 0x8b, 0x45, 0x28, 0x8f, 0xb3, 0xd3, 0xeb, 0xda, 0x0b, 0xe3, 0x86, 0x71, - 0x8f, 0x7b, 0x63, 0x50, 0x4a, 0xf0, 0x12, 0x5f, 0x29, 0xef, 0xad, 0xa1, - 0x37, 0x9c, 0xff, 0x94, 0xd9, 0x11, 0x7e, 0x14, 0x73, 0x35, 0x78, 0x76, - 0x37, 0x69, 0xe6, 0x05, 0xce, 0x5d, 0x98, 0x33, 0xd5, 0x08, 0xa3, 0xf0, - 0x54, 0x2e, 0x08, 0xc1, 0x01, 0xff, 0x4a, 0xc4, 0xb0, 0xe4, 0xae, 0x27, - 0x0a, 0xef, 0xc6, 0x43, 0xe6, 0x7b, 0x68, 0x12, 0xd0, 0xbb, 0x9d, 0xe9, - 0x2f, 0x97, 0xfb, 0xe3, 0xe3, 0x21, 0xd3, 0xf5, 0x30, 0x70, 0x73, 0xa2, - 0x0f, 0xe8, 0x86, 0xbf, 0x3b, 0x2f, 0x80, 0xb8, 0xb1, 0xff, 0x8b, 0x1c, - 0x4a, 0x5c, 0x70, 0x88, 0x3b, 0xa1, 0x10, 0xd5, 0xe8, 0xc7, 0xbf, 0xb4, - 0xde, 0x07, 0x72, 0x7b, 0xab, 0x75, 0x47, 0x91, 0x97, 0xf0, 0x57, 0xe7, - 0x47, 0x91, 0xc8, 0x41, 0x51, 0xbb, 0x19, 0xaa, 0x21, 0xce, 0x2b, 0x5e, - 0x45, 0x66, 0x1f, 0x2b, 0x46, 0xde, 0xe1, 0x05, 0x07, 0xc2, 0xf0, 0x55, - 0xd7, 0x6f, 0x12, 0x36, 0xda, 0x03, 0xb9, 0x88, 0xfc, 0xb9, 0x81, 0xb3, - 0x0b, 0x6b, 0x45, 0xfc, 0xb1, 0x55, 0xb9, 0x41, 0x24, 0xa0, 0xa7, 0x5a, - 0x56, 0xbb, 0xd8, 0xd7, 0xec, 0x2f, 0x17, 0xbf, 0x94, 0x73, 0x63, 0x0e, - 0x3c, 0xce, 0x0c, 0xdf, 0x0a, 0xe1, 0xe5, 0x9e, 0x60, 0xc3, 0x92, 0x8d, - 0x9e, 0x5a, 0x19, 0x7d, 0x45, 0x89, 0x62, 0xcc, 0xcb, 0x8a, 0xb7, 0x1c, - 0x79, 0x26, 0x06, 0x1e, 0xb0, 0x74, 0x5f, 0xb9, 0xd1, 0x73, 0xd8, 0xa7, - 0x18, 0x78, 0x21, 0xa8, 0x10, 0x90, 0x2f, 0x42, 0x05, 0x5f, 0x91, 0xde, - 0x9b, 0x75, 0x10, 0x4d, 0xbd, 0x6f, 0xdb, 0xa1, 0x54, 0x67, 0x27, 0xdb, - 0x47, 0xc3, 0x71, 0x79, 0xeb, 0x8c, 0x06, 0xf8, 0xeb, 0xd8, 0xf4, 0xee, - 0x5e, 0x91, 0xb8, 0x02, 0x5c, 0xa0, 0x72, 0xf5, 0xdb, 0xf8, 0x1d, 0x40, - 0xcb, 0xaa, 0xb7, 0x1c, 0x79, 0x26, 0x06, 0x1e, 0xb0, 0x74, 0x5f, 0xb9, - 0xd1, 0x73, 0xd8, 0xa7, 0xce, 0x10, 0x30, 0x98, 0x6c, 0x4b, 0x8f, 0xd8, - 0x87, 0x2a, 0xe4, 0xe8, 0x4e, 0xfe, 0xac, 0x57, 0xf6, 0xd0, 0x32, 0xbc, - 0xa1, 0xd7, 0x42, 0xf7, 0x42, 0xfb, 0x64, 0x71, 0xa2, 0xc6, 0x87, 0x22, - 0x52, 0x55, 0xfc, 0x77, 0x4b, 0xf0, 0x7f, 0xe1, 0x83, 0x80, 0x85, 0xfd, - 0x4f, 0xea, 0xe5, 0xe4, 0x7b, 0xd7, 0xed, 0x0c, 0xc1, 0x82, 0x7b, 0x07, - 0xbb, 0x4f, 0xc0, 0x89, 0x4c, 0x7f, 0x71, 0x29, 0x38, 0x41, 0x99, 0xcb, - 0x1b, 0xbc, 0xad, 0xfd, 0x4f, 0x50, 0x2c, 0x5a, 0xcd, 0xf7, 0xb8, 0x86, - 0xf7, 0x8d, 0x3c, 0x1d, 0xd1, 0x6a, 0x2d, 0xa7, 0xdb, 0x3b, 0xd1, 0x0f, - 0x5f, 0x4a, 0x6f, 0x64, 0x26, 0x02, 0x41, 0x6c, 0xb6, 0x83, 0xe1, 0x75, - 0x69, 0x4e, 0x8f, 0xaa, 0xb8, 0x9f, 0xc1, 0xc6, 0x6f, 0x2d, 0x5a, 0x0f, - 0x21, 0x77, 0xbe, 0x57, 0x2f, 0x52, 0xba, 0xf9, 0x67, 0xf1, 0xa5, 0x22, - 0x0e, 0xc3, 0x6f, 0xbe, 0x28, 0x2b, 0x3f, 0x77, 0xc1, 0x50, 0xd2, 0x56, - 0xb0, 0x12, 0xf4, 0x5a, 0xfe, 0x24, 0x11, 0xc6, 0xdb, 0xed, 0x69, 0x85, - 0x2f, 0x76, 0xeb, 0xf9, 0x67, 0x91, 0xc7, 0x7c, 0xf1, 0x4f, 0x0b, 0xfe, - 0xad, 0x0a, 0xda, 0xd8, 0x2b, 0xef, 0x7c, 0xc8, 0x20, 0xbd, 0x0e, 0x43, - 0x11, 0x35, 0x43, 0xfe, 0x2e, 0x5b, 0xea, 0x1d, 0x4c, 0x7b, 0x46, 0x09, - 0xda, 0x19, 0x4c, 0xce, 0x12, 0x51, 0x56, 0xc1, 0x0a, 0x23, 0x85, 0x20, - 0xa3, 0x94, 0xa7, 0x44, 0xdc, 0xb6, 0x8a, 0xe4, 0x57, 0xcd, 0x9c, 0xb9, - 0xba, 0xcb, 0xf9, 0x03, 0x31, 0xab, 0xc3, 0x91, 0x28, 0x36, 0x62, 0x03, - 0x49, 0x26, 0x91, 0xdf, 0x71, 0xf0, 0xcc, 0xc5, 0xb7, 0x83, 0x24, 0xa1, - 0xdb, 0x7a, 0x8a, 0xc0, 0xe4, 0x59, 0x7d, 0x56, 0x2d, 0x4c, 0x82, 0xc3, - 0xcc, 0x05, 0x28, 0xb2, 0x54, 0x0f, 0xef, 0x57, 0x18, 0x5e, 0x98, 0x87, - 0x5d, 0x30, 0xac, 0xf0, 0x7b, 0x6d, 0x18, 0x2e, 0x83, 0x19, 0x34, 0xe6, - 0xcd, 0x74, 0x7e, 0x36, 0xee, 0x87, 0x94, 0x05, 0xe9, 0xdc, 0x79, 0xd5, - 0xd6, 0x4b, 0x7e, 0xe3, 0xb4, 0xa3, 0xc1, 0xcc, 0x37, 0xe6, 0xb8, 0xb3, - 0xa9, 0x59, 0x43, 0xaa, 0x6a, 0xc3, 0x00, 0x30, 0x29, 0xe4, 0x48, 0x67, - 0xed, 0x96, 0xdf, 0xf5, 0x94, 0xa4, 0x95, 0x16, 0xf4, 0xf4, 0x1e, 0xc6, - 0x12, 0x63, 0x21, 0x61, 0xa2, 0x59, 0xdb, 0xf6, 0x7b, 0x3b, 0xec, 0x2a, - 0xaa, 0x50, 0x8e, 0x17, 0x04, 0x3f, 0xe8, 0xd8, 0xa5, 0x37, 0x82, 0x7d, - 0x4d, 0xc9, 0x1b, 0x2c, 0x62, 0x67, 0x4b, 0x30, 0x84, 0x59, 0xec, 0x80, - 0x09, 0x29, 0x8f, 0xab, 0x67, 0x90, 0x5d, 0x44, 0xa4, 0xbb, 0x98, 0xb3, - 0x7e, 0xcd, 0x7e, 0xfc, 0x12, 0x52, 0xc1, 0x75, 0x44, 0x9d, 0x1a, 0xb1, - 0xc5, 0x3a, 0xa9, 0xd1, 0xb6, 0xfa, 0xc2, 0x0f, 0xb7, 0x1c, 0x93, 0xd9, - 0xf6, 0x69, 0xee, 0x5a, 0x45, 0xe9, 0xe1, 0xf5, 0x73, 0x77, 0xed, 0x27, - 0x0c, 0x01, 0xc6, 0xe0, 0xb2, 0xee, 0x0e, 0x43, 0x10, 0xe7, 0x0e, 0x29, - 0x68, 0x1d, 0x77, 0x09, 0x42, 0xa0, 0x1e, 0x26, 0x42, 0xeb, 0xd7, 0x70, - 0xae, 0x25, 0x30, 0xdf, 0x34, 0x7a, 0x22, 0x64, 0xc9, 0x9e, 0xee, 0x4b, - 0xb4, 0xc5, 0xd5, 0x3a, 0xff, 0xb7, 0xc6, 0xa5, 0xe2, 0x62, 0xef, 0x58, - 0x04, 0x89, 0x3c, 0x43, 0x4c, 0xf0, 0x2d, 0x7b, 0x9b, 0x10, 0x78, 0x27, - 0xbc, 0xe0, 0xf8, 0x49, 0xdd, 0x12, 0x2f, 0x96, 0xe6, 0x8a, 0x2a, 0x50, - 0x5b, 0x0e, 0x75, 0xa7, 0xaf, 0x96, 0xaa, 0x40, 0xf6, 0x65, 0x59, 0x09, - 0xe7, 0xc2, 0x11, 0xc2, 0xa2, 0xee, 0xf4, 0xc8, 0x9d, 0xe6, 0xa9, 0x6b, - 0xf5, 0x18, 0x49, 0x7f, 0x20, 0x38, 0xa3, 0xf2, 0xfc, 0x12, 0x5f, 0xd1, - 0xdd, 0x53, 0xe9, 0x77, 0xdd, 0x52, 0xa7, 0x73, 0x4d, 0x29, 0xff, 0xe0, - 0x82, 0x52, 0x11, 0x9f, 0x92, 0x7c, 0xa8, 0xb0, 0x0c, 0x30, 0xa5, 0x9f, - 0x9a, 0xda, 0x2b, 0x9f, 0x89, 0x5e, 0xc4, 0xc8, 0x92, 0xa4, 0xcf, 0x24, - 0x3e, 0xa0, 0xda, 0xf3, 0x84, 0xa6, 0x28, 0x3f, 0x23, 0xef, 0x08, 0xc2, - 0x9b, 0xa8, 0x30, 0x4d, 0x9e, 0x12, 0xc6, 0xcc, 0x3f, 0x7b, 0x29, 0x9e, - 0xae, 0x34, 0x4b, 0x1f, 0xee, 0xf4, 0x5e, 0x88, 0xce, 0x79, 0xd1, 0xc0, - 0xe1, 0x49, 0x69, 0x36, 0xdd, 0xb3, 0xa8, 0x14, 0x48, 0x69, 0xa2, 0xbb, - 0xe5, 0xb7, 0x84, 0xf1, 0xcd, 0xd3, 0xd7, 0xc1, 0x2d, 0x59, 0x54, 0x03, - 0xe5, 0xf6, 0xfd, 0xdc, 0x89, 0xc3, 0xb7, 0xc7, 0xa9, 0xd0, 0xd2, 0x59, - 0x13, 0xae, 0xa5, 0xbd, 0xdc, 0xaf, 0x06, 0x19, 0x80, 0xe7, 0x97, 0xb3, - 0x84, 0xe5, 0x8e, 0xd4, 0x7d, 0x4c, 0xa0, 0xae, 0x6a, 0x59, 0x75, 0x19, - 0x71, 0xe5, 0xbc, 0x5e, 0xd2, 0x44, 0x5d, 0xf3, 0xcf, 0x7a, 0x65, 0xc1, - 0xe4, 0x76, 0xf1, 0x06, 0x2c, 0x50, 0x1b, 0xdd, 0xa0, 0x0b, 0x6c, 0x4b, - 0x72, 0x77, 0x3a, 0x81, 0x9a, 0xda, 0x4f, 0x1e, 0x1a, 0x99, 0x23, 0x1c, - 0x67, 0x0e, 0x55, 0xb5, 0x21, 0x73, 0x9e, 0x47, 0x72, 0x99, 0x41, 0xd4, - 0x9d, 0x7b, 0xdc, 0x44, 0x9f, 0x2f, 0xcd, 0x63, 0x1f, 0xbf, 0x28, 0xe0, - 0xa1, 0xf0, 0xa1, 0xa8, 0xc7, 0x6a, 0x3f, 0x52, 0xb8, 0x68, 0x30, 0xe7, - 0x2a, 0x6f, 0x31, 0x7c, 0x5e, 0xc7, 0x4a, 0x38, 0x7d, 0xd9, 0xe8, 0xa6, - 0xab, 0x81, 0xdc, 0x75, 0x0d, 0x35, 0x28, 0x81, 0xfd, 0xd5, 0x72, 0x31, - 0xe2, 0x73, 0xeb, 0x63, 0x8c, 0xa4, 0x66, 0xcb, 0xf4, 0x0b, 0xf1, 0x7e, - 0xdd, 0x83, 0x36, 0x43, 0xc8, 0x0d, 0x71, 0x6e, 0xae, 0xa7, 0x49, 0x51, - 0xde, 0x92, 0xa3, 0x85, 0x25, 0x9b, 0xc4, 0xed, 0x56, 0x5e, 0x5d, 0xb9, - 0x2b, 0x4a, 0x84, 0xb3, 0x7a, 0x28, 0x48, 0xfc, 0xff, 0x68, 0x4d, 0x79, - 0xa2, 0x04, 0x26, 0x5c, 0x6f, 0xbc, 0x9a, 0xa1, 0x1c, 0x01, 0x85, 0x2f, - 0xbb, 0xcd, 0x10, 0x9f, 0xcb, 0x60, 0xf5, 0x00, 0xde, 0x86, 0xb9, 0xed, - 0xa2, 0x65, 0xe7, 0x51, 0xea, 0x35, 0x01, 0x04, 0xa5, 0x50, 0xe8, 0xe7, - 0x46, 0xe6, 0x0a, 0x6d, 0x84, 0xad, 0xed, 0xdc, 0xd3, 0x08, 0x77, 0x88, - 0x21, 0x9a, 0x7b, 0xae, 0x02, 0xa7, 0xaf, 0x04, 0x34, 0x7f, 0xe4, 0x36, - 0x2d, 0x58, 0xcf, 0xae, 0x39, 0x5d, 0x83, 0x14, 0xb4, 0x89, 0x09, 0x4a, - 0x7b, 0x18, 0x11, 0xac, 0x95, 0x70, 0xf8, 0x0e, 0xa3, 0xd7, 0x0c, 0xa2, - 0xde, 0xcb, 0xef, 0xd7, 0xd7, 0x8c, 0xe5, 0x25, 0x02, 0x79, 0xb7, 0x99, - 0xa7, 0x13, 0xe8, 0xe8, 0xdf, 0x7d, 0x2e, 0x7e, 0x31, 0xd0, 0x09, 0xb0, - 0xc8, 0x87, 0x28, 0x2b, 0x11, 0xed, 0xdc, 0x33, 0xfa, 0x72, 0x5f, 0x70, - 0x19, 0xea, 0xe8, 0x4a, 0xd1, 0xd2, 0xfd, 0xd7, 0x3c, 0x35, 0x99, 0x84, - 0xb8, 0x17, 0x63, 0x17, 0x1b, 0xc7, 0xe5, 0x05, 0x4c, 0x06, 0x64, 0x75, - 0xf6, 0xed, 0x23, 0x4f, 0x99, 0xbe, 0x3d, 0xdd, 0x51, 0xa4, 0xd7, 0x34, - 0xcb, 0xb2, 0x8e, 0x97, 0x1b, 0xf5, 0x96, 0x9a, 0xb9, 0xd7, 0x57, 0xb7, - 0x29, 0xbf, 0xc5, 0x0a, 0xf8, 0x44, 0xa0, 0x17, 0x8e, 0xba, 0x82, 0xfe, - 0x4c, 0xeb, 0xa4, 0x79, 0xbd, 0xce, 0x34, 0x69, 0xed, 0xaf, 0xef, 0x5c, - 0x0b, 0x6c, 0x08, 0xde, 0x22, 0xfa, 0x8e, 0xf6, 0x4b, 0x6e, 0xc9, 0x87, - 0x85, 0xba, 0xce, 0xd2, 0x5e, 0xb2, 0xfa, 0x2b, 0x66, 0x95, 0xf5, 0xeb, - 0xaf, 0xad, 0x3d, 0xe0, 0x00, 0x6c, 0x09, 0x0d, 0x55, 0xc0, 0xfe, 0xfe, - 0x12, 0x94, 0xc4, 0x4c, 0x39, 0xce, 0x8b, 0x4f, 0x1b, 0xcf, 0xdb, 0xcc, - 0xa2, 0xc4, 0xe7, 0xc1, 0xdf, 0x80, 0x31, 0xd0, 0x14, 0xca, 0xaa, 0xf6, - 0x30, 0x27, 0x1d, 0xd9, 0x7d, 0x91, 0x18, 0xac, 0xe6, 0x88, 0x93, 0x15, - 0x7c, 0xfe, 0x41, 0x0a, 0xd0, 0xec, 0x26, 0x00, 0xa4, 0x2f, 0x2d, 0xa8, - 0x48, 0x1b, 0x33, 0x81, 0x6d, 0x75, 0xc1, 0xae, 0xb0, 0xa5, 0xc7, 0x79, - 0xf7, 0x11, 0xb0, 0x45, 0x60, 0x39, 0xc1, 0x8d, 0xcb, 0xb1, 0xde, 0x8e, - 0xa4, 0xaf, 0x4f, 0xe1, 0x0b, 0xdb, 0x4b, 0x63, 0x1b, 0x2e, 0xaa, 0xb2, - 0xf4, 0x2e, 0x4b, 0x95, 0xe9, 0x6a, 0x70, 0xed, 0xf5, 0x1e, 0x57, 0x22, - 0xd7, 0xe1, 0x5b, 0x8d, 0x50, 0xe7, 0xd9, 0xe2, 0x48, 0x95, 0xc0, 0x45, - 0x57, 0xd8, 0xd6, 0xd9, 0x69, 0xc7, 0xd2, 0xf6, 0xf5, 0x54, 0xf3, 0x2d, - 0x03, 0xa3, 0xd1, 0xa9, 0xb0, 0x7f, 0x56, 0x72, 0xa1, 0x3f, 0xfc, 0x4f, - 0x29, 0xf9, 0xed, 0x56, 0x2e, 0x7e, 0x05, 0xdc, 0xda, 0xd4, 0xaf, 0x54, - 0x53, 0xa3, 0x57, 0xab, 0x6b, 0xc6, 0x19, 0x63, 0x5c, 0xe0, 0x21, 0x76, - 0x5c, 0x6a, 0x0f, 0x3d, 0x30, 0xf8, 0x72, 0x46, 0xbf, 0x29, 0xa7, 0x7b, - 0xf9, 0xdd, 0x32, 0xb2, 0xdd, 0xe9, 0x66, 0xe0, 0x57, 0x1a, 0x62, 0xd7, - 0xe5, 0xe5, 0xa7, 0x4f, 0xa9, 0x7a, 0x73, 0x8b, 0xe0, 0x64, 0xee, 0xf7, - 0xb3, 0xcf, 0x44, 0x9d, 0xbd, 0x45, 0x7b, 0x2c, 0xbf, 0xd1, 0xf3, 0xe3, - 0xd3, 0xaf, 0x5f, 0x41, 0x3d, 0x3c, 0x69, 0xe4, 0x62, 0x41, 0xad, 0x84, - 0x1f, 0x70, 0xf4, 0x76, 0xfe, 0x8e, 0x8f, 0x2b, 0x0b, 0x7b, 0xcf, 0x0e, - 0x05, 0x9b, 0x52, 0x62, 0x2a, 0xa1, 0xce, 0xf0, 0x62, 0x96, 0x03, 0x39, - 0x98, 0x66, 0xcd, 0x2a, 0xbd, 0xbf, 0xde, 0x29, 0x6a, 0xb1, 0x64, 0xbb, - 0xed, 0xed, 0x26, 0x44, 0xa2, 0xdf, 0xfc, 0x03, 0x8d, 0x41, 0xe1, 0xec, - 0x1b, 0x1c, 0x23, 0xa6, 0x0c, 0x8f, 0x86, 0xab, 0x82, 0xa4, 0x66, 0xdb, - 0xdd, 0x4b, 0x72, 0x6a, 0x02, 0xf0, 0x6d, 0xcb, 0xa7, 0x65, 0x5b, 0x8a, - 0x5a, 0x92, 0x2f, 0x7d, 0x32, 0xc4, 0xde, 0xcf, 0xd5, 0x42, 0x23, 0xbc, - 0x06, 0x75, 0x17, 0xd7, 0x00, 0x6f, 0xd9, 0x7f, 0xc3, 0x3d, 0x01, 0x74, - 0x7c, 0x8f, 0x61, 0x97, 0x63, 0x7c, 0x60, 0xcc, 0xe0, 0x72, 0xff, 0x4c, - 0xc8, 0x2f, 0xb0, 0x01, 0x81, 0x57, 0x08, 0xd6, 0x92, 0x41, 0x4b, 0xf1, - 0x93, 0x21, 0x10, 0x2a, 0x2c, 0x38, 0xf2, 0xe7, 0x1e, 0x8b, 0xd4, 0x09, - 0xde, 0xef, 0xda, 0x72, 0xa0, 0x4f, 0x48, 0xae, 0xcc, 0xa3, 0x13, 0x27, - 0x4d, 0x19, 0xc8, 0x96, 0x9c, 0xd2, 0x4f, 0x4b, 0xe6, 0x19, 0x4a, 0x8f, - 0xb8, 0xc5, 0x88, 0x3d, 0xfc, 0x30, 0xa3, 0x3d, 0x73, 0x7d, 0xc0, 0x1c, - 0x72, 0x4f, 0xe8, 0x5c, 0x38, 0xdc, 0x85, 0xcd, 0x76, 0x3e, 0x11, 0xf7, - 0x05, 0x31, 0x08, 0xdb, 0x4d, 0x97, 0x69, 0xd8, 0xcf, 0x4c, 0xda, 0x12, - 0xda, 0xc3, 0xa2, 0x63, 0xf4, 0x58, 0x4c, 0xbd, 0x95, 0xe8, 0x59, 0x37, - 0x71, 0xb1, 0xd7, 0x2c, 0xca, 0xe0, 0x10, 0x34, 0x1d, 0x10, 0x51, 0x19, - 0xd9, 0xe7, 0x0b, 0x79, 0x4e, 0x71, 0x1b, 0x71, 0xba, 0x63, 0xd8, 0x82, - 0x6e, 0x40, 0x71, 0x78, 0x88, 0x0c, 0xd7, 0x4b, 0xc3, 0xbd, 0xbc, 0xd4, - 0x34, 0xae, 0x73, 0x01, 0xa0, 0x8d, 0x62, 0xa5, 0xb5, 0xef, 0xa2, 0xce, - 0x68, 0xbd, 0x7f, 0x6b, 0xf9, 0x6e, 0x4c, 0xd3, 0x44, 0xad, 0xb1, 0x9c, - 0x22, 0x21, 0x2a, 0x2a, 0xbf, 0xc7, 0xd1, 0x4c, 0xb7, 0xf7, 0x2e, 0x15, - 0xdd, 0x39, 0x71, 0x0a, 0xe5, 0xd0, 0xbf, 0x18, 0xc2, 0x07, 0xa5, 0x3b, - 0x0b, 0x45, 0x92, 0xec, 0x34, 0x0c, 0x79, 0x72, 0x32, 0x4a, 0xab, 0x0a, - 0x97, 0xa9, 0xb8, 0xa0, 0xbe, 0x9f, 0x35, 0x5c, 0x7f, 0x9c, 0x14, 0xf4, - 0xc0, 0xef, 0x36, 0x27, 0xf8, 0x84, 0x61, 0x53, 0x1a, 0xc1, 0x93, 0xdc, - 0xad, 0xa6, 0x31, 0x03, 0xf2, 0x70, 0x2d, 0x37, 0x4c, 0x98, 0xbc, 0x23, - 0x86, 0x5e, 0x59, 0x29, 0x0b, 0x38, 0xee, 0x91, 0xca, 0xd4, 0x47, 0x24, - 0x48, 0x6a, 0xc4, 0x90, 0xcc, 0x6e, 0xed, 0xb6, 0x5b, 0xaa, 0x3f, 0x4a, - 0x87, 0x05, 0x63, 0x48, 0x3d, 0xf7, 0x38, 0xdb, 0x3c, 0xbe, 0x57, 0x11, - 0xbe, 0x3c, 0x64, 0x8b, 0xa4, 0xb9, 0xcc, 0x25, 0x3f, 0xad, 0x3e, 0x00, - 0x19, 0x21, 0xb0, 0x60, 0xdb, 0x2a, 0xa4, 0xa4, 0xf5, 0x55, 0xde, 0xfb, - 0x9f, 0x1a, 0xff, 0xc4, 0x90, 0x80, 0xf8, 0x97, 0x92, 0x8f, 0x0c, 0xf5, - 0x2c, 0x30, 0x5c, 0x8f, 0x7f, 0x76, 0x83, 0x27, 0x9e, 0x91, 0xcc, 0xf7, - 0x1f, 0xad, 0xb3, 0xd2, 0x48, 0x57, 0xce, 0x54, 0x2e, 0xef, 0xd5, 0xa2, - 0x2e, 0xb8, 0x31, 0x47, 0xa0, 0x72, 0x09, 0x0b, 0x0b, 0xe6, 0xbb, 0x16, - 0xa1, 0x1c, 0xd1, 0xd4, 0x80, 0xe6, 0xb2, 0x4b, 0xf6, 0x2a, 0xc3, 0x35, - 0xc6, 0xc1, 0x87, 0xd8, 0x33, 0xc7, 0xa8, 0x7f, 0xc7, 0xef, 0xbb, 0xde, - 0x39, 0x2b, 0xa9, 0xe8, 0x50, 0x38, 0x05, 0xb3, 0x26, 0xef, 0x2d, 0x80, - 0x4c, 0x00, 0xc1, 0xe1, 0xc1, 0xbb, 0xc7, 0x47, 0x37, 0xd3, 0x6b, 0x30, - 0xfe, 0xe7, 0xfa, 0x2c, 0xc1, 0xb6, 0xca, 0xea, 0x35, 0xe1, 0xff, 0x0e, - 0xfc, 0x0f, 0x2a, 0xb5, 0xcf, 0x7f, 0xc2, 0x89, 0xf7, 0xc7, 0x07, 0x5a, - 0xbf, 0x92, 0xd5, 0xc7, 0xab, 0x22, 0xd4, 0x2e, 0xcf, 0x38, 0xc7, 0x62, - 0xe8, 0xdf, 0xd6, 0x61, 0xea, 0xbf, 0x19, 0x6e, 0xbf, 0xea, 0x41, 0x41, - 0x17, 0x2a, 0xeb, 0xe2, 0x56, 0x16, 0x4e, 0xe2, 0x1d, 0x8c, 0xc8, 0x31, - 0x91, 0x98, 0xd0, 0xc0, 0x24, 0xc1, 0xba, 0x43, 0xca, 0xd0, 0x22, 0x30, - 0x5f, 0x5b, 0x6c, 0x1c, 0xed, 0x36, 0x52, 0xa1, 0x28, 0xcc, 0x93, 0x13, - 0xff, 0x1e, 0xb0, 0x10, 0x2b, 0x90, 0x19, 0xa9, 0x41, 0x66, 0x69, 0x6b, - 0x2a, 0xcb, 0xa4, 0x28, 0xcd, 0xab, 0xaa, 0x0e, 0xad, 0x2a, 0x87, 0x3f, - 0x96, 0x58, 0x52, 0xd6, 0x22, 0xd5, 0x42, 0xf1, 0x66, 0x39, 0xfc, 0x93, - 0x6c, 0xce, 0xba, 0x32, 0x60, 0xbf, 0x29, 0x52, 0x00, 0xcd, 0x6b, 0x42, - 0x8b, 0x75, 0x31, 0x02, 0x7c, 0xab, 0x85, 0x12, 0x27, 0xef, 0x42, 0x15, - 0xfb, 0x22, 0xa5, 0xc9, 0xce, 0x7d, 0xee, 0x22, 0xc3, 0xbe, 0x14, 0x80, - 0x35, 0x20, 0x13, 0x23, 0xae, 0xb4, 0x55, 0xc3, 0xc8, 0x1d, 0x88, 0xdf, - 0x73, 0xb1, 0x50, 0xec, 0xaf, 0x48, 0xcb, 0xf8, 0x3e, 0x30, 0x67, 0xc4, - 0xdd, 0x93, 0xb8, 0x68, 0x59, 0x9b, 0x0b, 0xe4, 0xfb, 0xb0, 0xec, 0x35, - 0x0c, 0x9d, 0xc5, 0x90, 0x7b, 0xe0, 0x88, 0x85, 0x0f, 0x8b, 0xf3, 0xec, - 0xad, 0x7e, 0xec, 0xb0, 0xa1, 0x23, 0xf3, 0xa4, 0xc0, 0x4f, 0x18, 0x8a, - 0x67, 0xaa, 0xf3, 0x57, 0xbc, 0x19, 0x4d, 0x2e, 0x4c, 0xa9, 0xbd, 0x59, - 0x82, 0xf7, 0x03, 0xee, 0x57, 0xf6, 0x98, 0x39, 0x80, 0x0f, 0x66, 0xb9, - 0x4a, 0x83, 0xf3, 0x1f, 0x58, 0xcd, 0x76, 0x0b, 0x0b, 0xeb, 0x3b, 0xed, - 0xcf, 0x3e, 0x0c, 0x1d, 0x6e, 0x76, 0x90, 0xac, 0x03, 0x2b, 0x32, 0x84, - 0x0d, 0xf8, 0x86, 0x48, 0x7e, 0xca, 0x30, 0x1a, 0x96, 0x97, 0xc8, 0xf3, - 0xe8, 0x34, 0xf5, 0x56, 0xc2, 0xdc, 0x63, 0x09, 0x9f, 0x65, 0xdf, 0x91, - 0xad, 0x5d, 0xa1, 0x4a, 0x88, 0x44, 0x21, 0x6b, 0xcf, 0x72, 0xa8, 0x98, - 0xc7, 0xc7, 0x9c, 0x07, 0x7a, 0xd0, 0x9b, 0x8f, 0x5e, 0x58, 0xd6, 0x60, - 0xd8, 0xb8, 0xbb, 0x39, 0xa2, 0x83, 0x16, 0xfb, 0x5b, 0x38, 0xc1, 0xd2, - 0x3a, 0x62, 0xfa, 0x47, 0x43, 0x28, 0x22, 0x2b, 0xf7, 0xfc, 0x96, 0xc7, - 0xfe, 0xd6, 0xe3, 0x20, 0xae, 0x1b, 0x7d, 0xd4, 0x1f, 0x05, 0xdb, 0xec, - 0xbd, 0x4b, 0x98, 0x52, 0xf0, 0x30, 0x1e, 0x73, 0xca, 0x66, 0xf5, 0xfe, - 0xb2, 0xc0, 0x02, 0x6a, 0x63, 0x0a, 0xf9, 0x89, 0x8a, 0xc0, 0xdd, 0xb8, - 0xb4, 0x92, 0xc7, 0x2b, 0x2f, 0x6f, 0xa6, 0xbc, 0x2e, 0x1b, 0xe4, 0x8a, - 0x02, 0x7f, 0xe6, 0xde, 0x26, 0x1e, 0x89, 0xa8, 0xd7, 0xb8, 0x67, 0x85, - 0xa7, 0xfc, 0x2e, 0x6d, 0x2d, 0xfb, 0xdc, 0xd8, 0x35, 0x2a, 0xeb, 0xbf, - 0x72, 0xa5, 0xb6, 0xb0, 0xb6, 0x39, 0x33, 0x74, 0xc9, 0x54, 0xb3, 0x8f, - 0x5d, 0x67, 0xa5, 0x8b, 0xec, 0xae, 0xeb, 0x7a, 0xf1, 0xda, 0x9b, 0x6b, - 0x9a, 0x8f, 0x49, 0x93, 0x00, 0x27, 0xe7, 0xde, 0x42, 0xb3, 0xd5, 0x97, - 0x02, 0x5c, 0xde, 0x6c, 0x43, 0xf0, 0xe6, 0x72, 0xed, 0x64, 0x88, 0x4b, - 0xa1, 0x42, 0x68, 0xe1, 0x3d, 0xd5, 0x7b, 0xa8, 0xb9, 0xa9, 0x06, 0x06, - 0x86, 0x79, 0x2d, 0x1a, 0x67, 0x92, 0xee, 0x8b, 0x21, 0xc5, 0xe9, 0x99, - 0x64, 0x41, 0x61, 0x02, 0x2d, 0xf5, 0x32, 0x0e, 0xd5, 0xbb, 0x87, 0xe0, - 0xf0, 0x32, 0x66, 0xd2, 0x22, 0x20, 0x38, 0x5e, 0x4f, 0x91, 0x59, 0x82, - 0x06, 0x6b, 0x5b, 0x8c, 0x5e, 0x39, 0x3c, 0x57, 0x7e, 0x0b, 0x9b, 0xcb, - 0x49, 0x22, 0x49, 0x0a, 0xa6, 0xc0, 0x4a, 0x40, 0x30, 0xc0, 0x30, 0xb1, - 0xff, 0xd4, 0x8f, 0x34, 0xb3, 0xbe, 0xec, 0xb4, 0xc7, 0x40, 0xfe, 0xa2, - 0xf0, 0x64, 0x55, 0x69, 0x5b, 0x96, 0x4e, 0x5a, 0x45, 0x10, 0x12, 0x76, - 0xba, 0x1b, 0xfa, 0xe1, 0xbe, 0x5a, 0x47, 0x40, 0xa7, 0xb7, 0xaf, 0xf5, - 0xcd, 0x9a, 0x18, 0x56, 0x34, 0x00, 0x26, 0xeb, 0x88, 0xa0, 0x49, 0xd4, - 0x3a, 0x71, 0xd3, 0x31, 0x4c, 0x9d, 0x16, 0x04, 0x4b, 0x72, 0x5a, 0xc5, - 0x5e, 0x64, 0x4c, 0xaa, 0x61, 0x16, 0x4e, 0x84, 0x64, 0x5f, 0x9f, 0xe1, - 0x62, 0xa4, 0x79, 0x8f, 0xe3, 0xa5, 0xaf, 0xd0, 0x14, 0x3c, 0x2a, 0xd2, - 0x5f, 0x1a, 0x5c, 0xe6, 0x44, 0xce, 0x71, 0xe4, 0x0f, 0x92, 0xc4, 0x83, - 0xd0, 0x88, 0x00, 0x69, 0x40, 0xcf, 0x8c, 0x98, 0xde, 0xb5, 0xe8, 0xdb, - 0x60, 0xa2, 0x21, 0x5d, 0x25, 0x00, 0x18, 0x73, 0x4f, 0x14, 0xb3, 0xe4, - 0x39, 0xcd, 0x90, 0x7b, 0xd3, 0xa6, 0xad, 0x17, 0x0c, 0x13, 0x12, 0x91, - 0x3b, 0xfe, 0x5a, 0x09, 0x92, 0x66, 0xf6, 0x92, 0x4e, 0xba, 0x13, 0x8d, - 0x91, 0xb0, 0xf8, 0xf8, 0x13, 0xd5, 0x09, 0x83, 0xed, 0x16, 0x3f, 0xb1, - 0xcb, 0x73, 0x09, 0x06, 0x0c, 0x35, 0x83, 0x09, 0x40, 0xc9, 0xa7, 0xfa, - 0x23, 0x29, 0xe0, 0xbe, 0xb4, 0x5c, 0x24, 0x0d, 0xc1, 0x49, 0x2d, 0xec, - 0x6d, 0xcf, 0x01, 0xd4, 0x60, 0x9a, 0xa0, 0xad, 0x79, 0x37, 0xd1, 0xd6, - 0x17, 0x9b, 0x2f, 0xfe, 0x49, 0x4b, 0xaa, 0x1f, 0x4a, 0x14, 0x80, 0xdb, - 0x34, 0x52, 0xbd, 0x14, 0xbc, 0x9b, 0x82, 0x9e, 0x96, 0x57, 0x32, 0xf2, - 0x70, 0xf6, 0x58, 0x62, 0x8e, 0x79, 0x38, 0x29, 0xc7, 0x21, 0xc8, 0x3f, - 0x77, 0x47, 0xcc, 0xdb, 0xfe, 0x36, 0x22, 0x84, 0x4d, 0x85, 0xc1, 0xb5, - 0x0d, 0x5b, 0xf2, 0xd4, 0xc0, 0x97, 0x92, 0x61, 0xdf, 0xda, 0xb3, 0x21, - 0x06, 0x7e, 0x37, 0xb3, 0x25, 0x13, 0xb8, 0x3f, 0x89, 0xd1, 0x1e, 0x40, - 0xc5, 0x0c, 0xc8, 0xe9, 0x2e, 0x38, 0x5b, 0x9d, 0x7d, 0x70, 0xf9, 0x43, - 0x58, 0x8d, 0xab, 0x5d, 0xa3, 0x78, 0x1a, 0xb4, 0x3b, 0x85, 0x92, 0xd1, - 0xe7, 0xa7, 0x41, 0x08, 0x8f, 0x0b, 0x96, 0x9f, 0x14, 0x2a, 0x71, 0xc8, - 0xf7, 0xc1, 0x0b, 0xd6, 0xd3, 0x27, 0x85, 0xfc, 0x62, 0x43, 0xba, 0xfa, - 0x79, 0xae, 0xed, 0x6f, 0x19, 0x4a, 0x73, 0x45, 0x96, 0x43, 0x89, 0x96, - 0x7f, 0xec, 0xcb, 0x51, 0x24, 0xc7, 0x06, 0x72, 0x95, 0xe8, 0x03, 0x58, - 0xd1, 0x19, 0x08, 0xef, 0x1c, 0xe7, 0x38, 0x47, 0x3f, 0x11, 0x1b, 0xaa, - 0x29, 0xd5, 0xa1, 0xd4, 0xc5, 0xdb, 0x14, 0x19, 0x3b, 0xe6, 0x7d, 0x5a, - 0x7c, 0xe3, 0x7b, 0x1a, 0x53, 0xa8, 0xfd, 0x8f, 0x61, 0x92, 0xd6, 0x43, - 0x34, 0x8a, 0x8a, 0x4b, 0x9d, 0xe1, 0x49, 0x93, 0x06, 0xf2, 0x0d, 0x57, - 0x56, 0xae, 0x23, 0x03, 0xc5, 0x86, 0xfc, 0x0e, 0x8f, 0x1f, 0xae, 0x62, - 0x9e, 0xe7, 0xf2, 0xa1, 0x10, 0x66, 0x61, 0x4b, 0xd8, 0x79, 0x6b, 0x3e, - 0xff, 0x2f, 0xfc, 0xb1, 0x43, 0x06, 0x0b, 0x5b, 0x5b, 0x41, 0x0c, 0xf2, - 0x5b, 0x69, 0x34, 0x65, 0xd4, 0x10, 0x05, 0x48, 0x13, 0x7d, 0x07, 0x8b, - 0xdf, 0x08, 0x08, 0x31, 0xf5, 0x63, 0x43, 0x2f, 0x47, 0xe6, 0x51, 0x7b, - 0x2a, 0xfd, 0x27, 0x01, 0x92, 0x46, 0x53, 0x98, 0xfc, 0x75, 0xb7, 0xad, - 0xee, 0xee, 0x30, 0xf3, 0xb2, 0x8c, 0xe2, 0x36, 0xc2, 0x9d, 0xa0, 0x1d, - 0x58, 0xe8, 0x34, 0x83, 0x8e, 0x00, 0x19, 0xb0, 0xd1, 0xe6, 0xad, 0x4d, - 0x8f, 0x7c, 0x5e, 0x3e, 0x7b, 0x6e, 0x1d, 0xad, 0xc5, 0x03, 0xd6, 0x95, - 0xdb, 0x76, 0xfa, 0x80, 0x9b, 0x0f, 0x1c, 0xc9, 0xd2, 0x54, 0x40, 0x0a, - 0xa8, 0x3f, 0xf1, 0xe3, 0x22, 0xc8, 0xed, 0xbd, 0x7b, 0x51, 0xd0, 0x54, - 0x49, 0xef, 0x6d, 0xd2, 0x11, 0x16, 0x02, 0xd7, 0x9b, 0x87, 0xcd, 0x13, - 0x18, 0x4e, 0xbc, 0x16, 0x7b, 0x41, 0xeb, 0xd6, 0x9d, 0x24, 0x95, 0xb6, - 0xdb, 0x91, 0xff, 0x7f, 0xc6, 0xe6, 0x2a, 0x37, 0x30, 0xcb, 0x89, 0xc1, - 0x67, 0x31, 0xb4, 0xf3, 0x49, 0x49, 0x8e, 0x5c, 0xa5, 0xad, 0x05, 0xb4, - 0xbf, 0xc1, 0x08, 0x5b, 0x89, 0x61, 0xed, 0x0d, 0xed, 0x99, 0x0d, 0x46, - 0x5a, 0xab, 0x97, 0x78, 0x44, 0xfc, 0x45, 0xe2, 0x58, 0x18, 0xc2, 0xd0, - 0x3a, 0x07, 0x6b, 0x61, 0x0f, 0xbf, 0x9c, 0x3e, 0x5c, 0x45, 0xbe, 0xab, - 0x48, 0x65, 0x7d, 0x3e, 0x52, 0x5c, 0xfb, 0xde, 0x2e, 0x19, 0x8b, 0xac, - 0xe4, 0xba, 0x1f, 0x23, 0xcb, 0x2f, 0x42, 0x6a, 0xe8, 0x6b, 0xae, 0xb4, - 0x90, 0x37, 0xf8, 0xb8, 0xa3, 0x7f, 0x99, 0x81, 0x35, 0x6f, 0x77, 0xb0, - 0x22, 0x7b, 0xe9, 0xc6, 0xa4, 0x17, 0xa2, 0x1b, 0xe9, 0xf7, 0xda, 0xc2, - 0x22, 0x88, 0xb8, 0x0e, 0x5f, 0x80, 0x07, 0x56, 0x7b, 0x6f, 0xa5, 0x33, - 0x2b, 0x71, 0x7d, 0x93, 0xe6, 0x0f, 0xc6, 0x68, 0xb1, 0x36, 0x48, 0x63, - 0x4c, 0xeb, 0x75, 0x0e, 0x61, 0x6f, 0x26, 0x1f, 0x11, 0xbd, 0xfb, 0xba, - 0xd5, 0xca, 0xd7, 0x58, 0x5f, 0x2c, 0x60, 0x6a, 0x42, 0xd9, 0xb4, 0x61, - 0x08, 0xbc, 0x9e, 0xef, 0x63, 0xee, 0x70, 0x49, 0x27, 0x08, 0xa6, 0xda, - 0x7c, 0x1e, 0xea, 0x05, 0x36, 0x1f, 0x1c, 0xb8, 0x0b, 0xf2, 0xe8, 0x20, - 0xb6, 0x88, 0x03, 0x10, 0x55, 0x98, 0x42, 0x84, 0x30, 0x85, 0x62, 0x58, - 0x05, 0xc3, 0x43, 0x71, 0xf4, 0x5e, 0x97, 0x25, 0xc0, 0x2d, 0xde, 0xbe, - 0xc4, 0x70, 0xdd, 0x3a, 0x98, 0x43, 0xa6, 0x36, 0xb7, 0x0a, 0x5d, 0xb7, - 0x32, 0x80, 0x2a, 0x0a, 0xdf, 0xf5, 0x0b, 0xe8, 0x90, 0x98, 0x16, 0xc2, - 0xdf, 0xc2, 0x39, 0x1e, 0xb0, 0x2e, 0x18, 0x3a, 0x41, 0x3f, 0xe4, 0x14, - 0x05, 0x47, 0xc0, 0x47, 0x53, 0x21, 0x5a, 0x03, 0x87, 0x05, 0xf3, 0x9c, - 0xee, 0x9f, 0x9a, 0xd5, 0xf9, 0xe7, 0x90, 0x9a, 0xe9, 0xec, 0x32, 0x97, - 0x77, 0x52, 0x0a, 0x15, 0xe0, 0x67, 0x20, 0x0a, 0x16, 0xde, 0x2f, 0xf4, - 0x47, 0xda, 0xe0, 0x83, 0x2e, 0xa6, 0xa7, 0x9d, 0x26, 0x4f, 0xb8, 0x27, - 0x3e, 0xfb, 0x76, 0xef, 0xed, 0xcc, 0x40, 0xf0, 0xc3, 0xa9, 0x93, 0x28, - 0xc4, 0x2f, 0xad, 0x1b, 0xc5, 0x9c, 0xb3, 0x19, 0x7b, 0x9c, 0x5d, 0x6b, - 0xfa, 0xb2, 0xad, 0xe2, 0x29, 0x60, 0xa0, 0xd7, 0x49, 0x3c, 0xbf, 0xfc, - 0x05, 0x9b, 0x50, 0xe2, 0x05, 0x94, 0x8f, 0xcf, 0x8f, 0xad, 0x23, 0xc8, - 0x04, 0x1f, 0xe8, 0xce, 0xd9, 0xc4, 0xe9, 0x51, 0x92, 0x13, 0x9c, 0xeb, - 0xc3, 0xd7, 0xf9, 0x26, 0x5d, 0xfb, 0x03, 0x64, 0x89, 0xa5, 0x41, 0xbf, - 0x4c, 0x65, 0xa4, 0x51, 0xda, 0xdc, 0x55, 0x9d, 0x89, 0x50, 0xfa, 0xc2, - 0x90, 0xe9, 0xd0, 0xe2, 0x65, 0xc8, 0x7a, 0xc5, 0x6c, 0x7e, 0xf9, 0x08, - 0x92, 0x03, 0xcf, 0x26, 0x19, 0x18, 0x13, 0x7a, 0x40, 0x8a, 0x57, 0x9d, - 0xbd, 0x5c, 0x94, 0xfa, 0xcd, 0x7b, 0x6b, 0xc3, 0x9e, 0x25, 0x18, 0xf2, - 0x28, 0x58, 0x68, 0x12, 0xb8, 0x0f, 0x2a, 0x95, 0xf9, 0x25, 0x19, 0x5b, - 0xf6, 0xac, 0xba, 0xe9, 0xab, 0x74, 0x53, 0xca, 0x8d, 0x0c, 0x13, 0x04, - 0x2d, 0x7e, 0xb9, 0xac, 0x21, 0x6f, 0x77, 0xe0, 0xf9, 0x60, 0x4f, 0xd3, - 0x0c, 0xda, 0x18, 0xb3, 0x3c, 0x54, 0x81, 0x16, 0xc3, 0xdf, 0xf6, 0x11, - 0x9a, 0x60, 0x12, 0xbb, 0xe8, 0xbc, 0xd6, 0xce, 0xe5, 0xa6, 0x38, 0x78, - 0xc7, 0xbb, 0x78, 0xff, 0xeb, 0x7b, 0x0c, 0x11, 0xda, 0xf5, 0xf1, 0x5d, - 0x8d, 0xbb, 0x33, 0xb4, 0x58, 0x71, 0x35, 0x31, 0x61, 0xa1, 0x4f, 0x48, - 0x69, 0x13, 0x1d, 0x7b, 0x38, 0x1d, 0xf9, 0xeb, 0x7a, 0x47, 0x6a, 0x60, - 0xef, 0xec, 0xa5, 0xd5, 0xea, 0x62, 0xc2, 0xb7, 0x70, 0x5e, 0x8a, 0x5b, - 0x1f, 0x15, 0x07, 0x3d, 0x80, 0x35, 0x1f, 0x5a, 0x95, 0xea, 0xc6, 0xa9, - 0x95, 0xd9, 0x8a, 0x3c, 0xf6, 0x9f, 0x16, 0x68, 0xe4, 0xea, 0xe5, 0xf7, - 0xba, 0x84, 0xe0, 0x24, 0xad, 0x50, 0xe4, 0x98, 0x08, 0xec, 0xe3, 0xf2, - 0x88, 0x7b, 0x31, 0x29, 0x95, 0x37, 0x3a, 0x91, 0x56, 0xe8, 0xe3, 0x64, - 0x0c, 0x27, 0x95, 0x99, 0x57, 0x8f, 0x99, 0x86, 0x16, 0xd2, 0xd0, 0x68, - 0x2c, 0x2e, 0x1b, 0x59, 0xc7, 0x82, 0x94, 0x91, 0xab, 0x33, 0xf3, 0x91, - 0xb1, 0x4c, 0x03, 0xe5, 0x17, 0xac, 0x53, 0x03, 0x59, 0x90, 0x32, 0x46, - 0x1f, 0xee, 0x0f, 0x65, 0x95, 0x13, 0x99, 0x08, 0x86, 0xd9, 0xb5, 0xd6, - 0x19, 0x97, 0x61, 0x98, 0xac, 0x23, 0x2c, 0x93, 0xbc, 0xbb, 0x80, 0xbb, - 0x66, 0xba, 0x4b, 0x90, 0xf2, 0x27, 0x00, 0x2e, 0x9e, 0xcb, 0x86, 0x58, - 0x40, 0x84, 0x18, 0x16, 0x92, 0x32, 0xa2, 0x6f, 0x8f, 0xda, 0x7a, 0xd8, - 0xa3, 0x20, 0xfa, 0xd5, 0x4b, 0xb3, 0xbc, 0xcf, 0x56, 0x68, 0x2d, 0x58, - 0x39, 0x57, 0xcc, 0xaa, 0x7b, 0xfb, 0x1e, 0xa0, 0x76, 0xad, 0xec, 0x33, - 0x90, 0xf5, 0x1e, 0x24, 0x2e, 0x24, 0x97, 0x74, 0x3b, 0xb7, 0x41, 0x81, - 0xcb, 0xfc, 0x77, 0x8b, 0x96, 0xfb, 0xe0, 0xa9, 0xf9, 0x0b, 0x91, 0x4e, - 0xa3, 0x76, 0xb8, 0x0e, 0x4b, 0x8e, 0xc3, 0x07, 0xff, 0xe1, 0xe9, 0x1f, - 0xa6, 0x0d, 0x28, 0xad, 0x02, 0x6d, 0x70, 0xdf, 0x3a, 0xcd, 0xdd, 0x57, - 0x09, 0x14, 0xb9, 0xaf, 0x34, 0x71, 0x12, 0x37, 0xbf, 0xeb, 0xff, 0xdc, - 0xd1, 0xf2, 0x7c, 0x19, 0xcd, 0x61, 0x83, 0xff, 0x18, 0x63, 0x29, 0xf9, - 0xa4, 0xba, 0x00, 0x73, 0x25, 0x49, 0x85, 0x23, 0xf5, 0xdc, 0x05, 0xa9, - 0x56, 0x43, 0xc5, 0x56, 0x54, 0xdd, 0xca, 0x55, 0x41, 0xc0, 0xae, 0x92, - 0x83, 0x9e, 0xd0, 0xec, 0x50, 0x7d, 0x7c, 0x31, 0xf6, 0xd9, 0xde, 0x73, - 0x60, 0x2d, 0x30, 0x63, 0x2d, 0x52, 0xee, 0xa6, 0x55, 0xcd, 0xd5, 0xbd, - 0x8c, 0xf1, 0xb3, 0xd0, 0x17, 0xd5, 0x3f, 0x68, 0xe3, 0x96, 0x6e, 0x0b, - 0x15, 0xe3, 0x9c, 0x10, 0x6b, 0x07, 0x60, 0xa9, 0x7c, 0x05, 0xe8, 0x62, - 0x0c, 0xc8, 0x19, 0x00, 0xc0, 0x0b, 0xb3, 0x27, 0x9c, 0xa9, 0x5b, 0xa7, - 0x50, 0x5a, 0x8e, 0xd0, 0x73, 0x35, 0xa6, 0x3a, 0xb8, 0x38, 0xd5, 0x9a, - 0xee, 0x87, 0x06, 0x79, 0xba, 0xee, 0x0c, 0x05, 0xc0, 0xbf, 0x7f, 0x7e, - 0x52, 0x0b, 0x04, 0x62, 0xc3, 0x64, 0x67, 0x67, 0xff, 0x73, 0xda, 0xd0, - 0x08, 0xa6, 0x16, 0xae, 0x41, 0x7c, 0x45, 0x0d, 0x4d, 0x8f, 0x3d, 0x9c, - 0x30, 0x12, 0x96, 0x58, 0x78, 0xca, 0x2d, 0xe1, 0x59, 0x2c, 0x59, 0xd2, - 0x7f, 0xa1, 0xa5, 0x58, 0xac, 0x1e, 0x4b, 0x0a, 0xd7, 0xa2, 0xfb, 0xc5, - 0xeb, 0xd1, 0x13, 0x02, 0x04, 0xba, 0x0d, 0xe2, 0x2d, 0xbf, 0xb2, 0x1e, - 0xce, 0xf5, 0xbc, 0xb1, 0x24, 0x32, 0x76, 0xee, 0x36, 0x31, 0xd3, 0xed, - 0x57, 0x41, 0x2f, 0x13, 0xbd, 0x13, 0x30, 0xe3, 0x9c, 0x13, 0x60, 0x9d, - 0x76, 0x46, 0xa7, 0x07, 0x44, 0x94, 0xeb, 0xca, 0x44, 0x5e, 0x99, 0x76, - 0x03, 0x9d, 0xf6, 0x89, 0x01, 0xff, 0x28, 0x39, 0xc8, 0x28, 0x5f, 0x8d, - 0xb6, 0x0f, 0x5c, 0xc6, 0x78, 0x92, 0xe2, 0x65, 0x9b, 0x3c, 0x98, 0x87, - 0x95, 0x0d, 0x3e, 0x9a, 0x50, 0xb0, 0x54, 0x11, 0x3d, 0x11, 0xd3, 0x9b, - 0xa2, 0x03, 0xdf, 0x28, 0x1d, 0x10, 0xfe, 0x4e, 0x62, 0x9e, 0x33, 0x2f, - 0x90, 0x4e, 0x00, 0xe7, 0x78, 0xdc, 0xec, 0x75, 0x47, 0x27, 0x84, 0x1a, - 0x34, 0x91, 0xb0, 0xe6, 0xe7, 0xa0, 0x96, 0x00, 0x9c, 0xda, 0xf1, 0xac, - 0x08, 0xd7, 0xd6, 0x55, 0xfe, 0x42, 0x97, 0x4f, 0x38, 0x86, 0xbe, 0x7c, - 0xac, 0xa9, 0x4e, 0xcb, 0x67, 0xde, 0xc8, 0x32, 0x27, 0xdb, 0xda, 0xf9, - 0x81, 0x86, 0xe2, 0x11, 0x2c, 0xcc, 0xa6, 0x20, 0x71, 0x4a, 0xfa, 0x89, - 0x5e, 0x91, 0x1b, 0x7a, 0x49, 0xe3, 0x00, 0x86, 0x43, 0x5f, 0xd3, 0x50, - 0x7b, 0x1e, 0x71, 0x8a, 0x72, 0xcf, 0xe8, 0xd8, 0x8e, 0x2d, 0xd7, 0x59, - 0x4f, 0x29, 0x09, 0x24, 0xad, 0x66, 0x1e, 0x66, 0x94, 0x53, 0x4b, 0xa0, - 0x1f, 0x07, 0x5e, 0xb4, 0xff, 0xa8, 0x6e, 0x33, 0x88, 0x92, 0x48, 0x0f, - 0x71, 0xff, 0xa3, 0x59, 0x0b, 0x87, 0xe5, 0x32, 0xb8, 0xcc, 0xb1, 0xce, - 0x85, 0xa7, 0x1a, 0x7c, 0x59, 0x84, 0x0f, 0xb0, 0xa7, 0xee, 0xee, 0x3d, - 0x8b, 0xc6, 0x70, 0x57, 0xd1, 0x3c, 0xe1, 0x15, 0xcf, 0x66, 0x2c, 0x4d, - 0x9e, 0xef, 0xb4, 0xdb, 0xfd, 0x18, 0x03, 0x2d, 0xb1, 0x30, 0x6a, 0x45, - 0x27, 0x2c, 0x3d, 0x87, 0x5c, 0x34, 0x66, 0x25, 0x86, 0x6a, 0x94, 0xa5, - 0x2c, 0xc7, 0x5e, 0xdf, 0x02, 0x8d, 0x68, 0x93, 0xd8, 0xa2, 0xec, 0xfa, - 0x3e, 0x87, 0xbd, 0x5b, 0x3b, 0xed, 0x51, 0x39, 0x73, 0x15, 0xb7, 0x41, - 0x85, 0x8a, 0x81, 0x20, 0xff, 0xad, 0xfc, 0xee, 0xce, 0xd5, 0x67, 0x4f, - 0xcd, 0x15, 0x18, 0xcf, 0xa0, 0xef, 0xee, 0x88, 0x20, 0x2e, 0x63, 0x8d, - 0xb2, 0x29, 0xe1, 0xa6, 0x03, 0xc8, 0x43, 0x90, 0xea, 0x12, 0x38, 0xc5, - 0x5a, 0xbf, 0xca, 0x09, 0xc8, 0x23, 0xd1, 0x61, 0x51, 0x75, 0xa3, 0x49, - 0x6e, 0xe6, 0xd5, 0xb1, 0xc9, 0x38, 0x81, 0x21, 0xc9, 0xd4, 0x90, 0xa0, - 0xe1, 0x7e, 0x62, 0xfd, 0x8f, 0x08, 0x0e, 0x9c, 0x0a, 0x8f, 0xd5, 0xb2, - 0x3d, 0xb6, 0x5b, 0x5f, 0x65, 0x48, 0x2e, 0x78, 0x5c, 0x8f, 0x96, 0xf6, - 0x53, 0xf4, 0x29, 0x0a, 0x40, 0x2e, 0xf1, 0x78, 0x7b, 0xcc, 0xc4, 0xa0, - 0x79, 0x9d, 0x53, 0x82, 0x9f, 0x89, 0x0b, 0x4e, 0x82, 0xc3, 0x6d, 0x30, - 0x1c, 0x7b, 0x2c, 0x92, 0xad, 0x14, 0x5c, 0xbe, 0x48, 0x26, 0xb0, 0xa5, - 0x99, 0x5b, 0xdd, 0x21, 0x93, 0x87, 0x8f, 0x5b, 0x45, 0xbc, 0xf5, 0xd0, - 0xdc, 0x31, 0xd2, 0xcc, 0xf0, 0xe5, 0x7d, 0x33, 0x77, 0x27, 0xfa, 0x1b, - 0xe9, 0x4a, 0x71, 0x8e, 0x11, 0x22, 0xea, 0xe4, 0xd5, 0xdf, 0xe6, 0xa1, - 0x4a, 0xd6, 0xe9, 0x9d, 0xb5, 0x59, 0x33, 0x87, 0xdb, 0xe0, 0x12, 0x8e, - 0x93, 0x7b, 0x78, 0x02, 0xca, 0xee, 0x2a, 0x23, 0x9b, 0x67, 0xb3, 0x4d, - 0x50, 0xbe, 0xbc, 0xff, 0xbb, 0x39, 0x37, 0xcb, 0x48, 0xc9, 0x01, 0xfc, - 0x3b, 0xef, 0x94, 0x86, 0x42, 0xe9, 0x34, 0xfc, 0xa1, 0xe6, 0x42, 0xce, - 0x13, 0xae, 0x9e, 0x9e, 0x3a, 0xb6, 0xbf, 0x8a, 0x87, 0xf7, 0x8e, 0x34, - 0x18, 0xd4, 0xe9, 0x17, 0x63, 0xc0, 0xce, 0x42, 0x1b, 0x15, 0x6f, 0x20, - 0xcf, 0xef, 0x6c, 0xab, 0xb3, 0x9a, 0x14, 0x6d, 0xf5, 0x8d, 0xf5, 0xa1, - 0x37, 0xfe, 0xf4, 0x29, 0xb2, 0x32, 0x70, 0xb5, 0xfb, 0x82, 0x4e, 0x8c, - 0xb2, 0x69, 0x2f, 0x4d, 0xf8, 0x7e, 0xf8, 0x67, 0x36, 0x9f, 0x10, 0x80, - 0xd0, 0xf7, 0xfd, 0x90, 0x17, 0xee, 0xb6, 0x38, 0xdc, 0xe2, 0x21, 0xfd, - 0x9e, 0x34, 0xe8, 0x09, 0xdc, 0xa0, 0xb4, 0x39, 0xbf, 0x2e, 0xcc, 0x2c, - 0x01, 0x99, 0x2d, 0xc9, 0x39, 0xaf, 0xf4, 0xa2, 0xc3, 0xf4, 0xe8, 0x08, - 0x1f, 0xe6, 0x23, 0x59, 0xc4, 0x99, 0x3e, 0x75, 0xf5, 0xd2, 0x90, 0x1c, - 0xc0, 0xe7, 0x3c, 0xdf, 0xe9, 0x71, 0xb8, 0xfa, 0xad, 0x7a, 0x8e, 0x82, - 0xc0, 0x38, 0x2f, 0x75, 0x9f, 0x51, 0xda, 0x36, 0xa9, 0x6a, 0x66, 0x44, - 0x5e, 0xa1, 0xa7, 0x3c, 0x39, 0xf4, 0x72, 0xa6, 0xda, 0xd7, 0x0d, 0xe4, - 0x17, 0x5b, 0xcf, 0x8c, 0xdb, 0x70, 0x52, 0xed, 0x1c, 0x6a, 0x8b, 0x86, - 0x94, 0xaf, 0x60, 0xdf, 0xda, 0xad, 0xeb, 0xc1, 0x3a, 0x09, 0xf3, 0x22, - 0x9f, 0xce, 0xff, 0x76, 0x8f, 0x72, 0x65, 0x1a, 0x66, 0x56, 0x56, 0xa9, - 0x31, 0xe5, 0x68, 0x58, 0xca, 0x62, 0xfd, 0x75, 0xb8, 0x79, 0x9a, 0x7d, - 0x99, 0xcc, 0x30, 0x4f, 0x29, 0xf6, 0xbb, 0x8d, 0x6b, 0x1f, 0x27, 0x8c, - 0x8f, 0x3e, 0x3e, 0xac, 0x41, 0xb9, 0xe9, 0xfa, 0x40, 0xcf, 0x40, 0x07, - 0x05, 0x43, 0xa7, 0xfb, 0x48, 0xf6, 0x10, 0xb7, 0x73, 0x04, 0x9f, 0x24, - 0x56, 0x4a, 0xba, 0xcf, 0x0d, 0xde, 0x59, 0xd3, 0x8a, 0xb6, 0x92, 0x5a, - 0xd4, 0xc4, 0xde, 0xf7, 0x1d, 0xf0, 0x5e, 0xd3, 0x57, 0xe6, 0xcd, 0x6a, - 0x9f, 0x62, 0x9f, 0x60, 0x94, 0xde, 0xb2, 0xef, 0xca, 0x01, 0x5c, 0xe0, - 0xa9, 0x05, 0x88, 0x75, 0x79, 0xf0, 0xcd, 0x1e, 0x20, 0x17, 0x20, 0x67, - 0xb9, 0x5d, 0x82, 0x1b, 0x43, 0x21, 0x3b, 0x2d, 0x51, 0x18, 0x1c, 0xda, - 0xb9, 0xdc, 0x2c, 0xd3, 0xb8, 0x79, 0x02, 0xb9, 0x5f, 0xc5, 0x46, 0x04, - 0xa5, 0x1a, 0x52, 0x0d, 0x7f, 0x08, 0x32, 0x93, 0x87, 0x8e, 0x06, 0x5e, - 0x6a, 0xf1, 0xae, 0x9b, 0xc3, 0x4f, 0xbd, 0x32, 0x02, 0x39, 0x24, 0xa0, - 0x6c, 0xa5, 0xb3, 0x43, 0x28, 0x51, 0xf9, 0xb4, 0xd5, 0x48, 0x5b, 0x9d, - 0x1b, 0x01, 0x09, 0x19, 0xd1, 0xbb, 0x7f, 0x26, 0x68, 0x0d, 0x6c, 0x53, - 0x50, 0xa1, 0x01, 0xa5, 0x49, 0x0f, 0xb5, 0xef, 0xa0, 0xd1, 0xe5, 0xce, - 0x8c, 0x99, 0xb4, 0x5b, 0x58, 0xb2, 0xde, 0xee, 0x62, 0x48, 0xfb, 0xbe, - 0x3a, 0x56, 0x01, 0x03, 0xde, 0xca, 0x50, 0xba, 0xab, 0xa0, 0xa9, 0xe7, - 0x17, 0x8f, 0x99, 0xcf, 0x97, 0xa7, 0x86, 0x74, 0xdb, 0x35, 0x06, 0x42, - 0x00, 0x06, 0x41, 0x12, 0xcb, 0x48, 0xaf, 0x39, 0x55, 0xa2, 0x97, 0xe6, - 0xa4, 0x85, 0xad, 0x10, 0x23, 0xea, 0x6a, 0x39, 0x20, 0x3d, 0xd3, 0xd4, - 0x08, 0x7d, 0x40, 0x7f, 0x95, 0x35, 0xc5, 0x43, 0x77, 0x51, 0x6d, 0x4a, - 0x12, 0x55, 0xde, 0xc1, 0x7b, 0xa2, 0xaf, 0xf2, 0x86, 0xbd, 0xbd, 0x93, - 0x8c, 0xf3, 0x61, 0x37, 0x31, 0xb3, 0x62, 0xb0, 0x7e, 0x76, 0x9d, 0xda, - 0xb8, 0x4d, 0x93, 0xc5, 0xf5, 0xab, 0xb4, 0x8c, 0xac, 0xa1, 0x86, 0x60, - 0xce, 0x7a, 0x74, 0x89, 0x67, 0xdf, 0x02, 0xf5, 0xad, 0xa2, 0x16, 0xc1, - 0xd8, 0xae, 0xa8, 0x15, 0x9f, 0x05, 0xa0, 0xa5, 0xdd, 0x72, 0x10, 0xdb, - 0xe8, 0xaf, 0x3d, 0x2b, 0x00, 0xa8, 0xf0, 0xee, 0xbf, 0x8e, 0x49, 0xe0, - 0x38, 0x09, 0x5c, 0x27, 0x32, 0x40, 0xc7, 0x97, 0x81, 0x09, 0xa9, 0xc9, - 0x09, 0xf9, 0xf1, 0x45, 0x49, 0x3a, 0xc2, 0xaa, 0x1a, 0x7f, 0xae, 0x7d, - 0x26, 0xb5, 0x78, 0x2a, 0xb0, 0x6b, 0x8b, 0xc8, 0x95, 0xf3, 0xa9, 0x14, - 0x72, 0x49, 0xa2, 0x20, 0x73, 0x8a, 0xfe, 0xd6, 0xbc, 0xe7, 0x85, 0x4f, - 0x9b, 0xa9, 0x80, 0x4e, 0xe5, 0x48, 0x4e, 0x65, 0x15, 0x65, 0xd7, 0x09, - 0xb2, 0xef, 0xcb, 0xc0, 0x28, 0x25, 0xc8, 0x55, 0x68, 0x7e, 0x6b, 0xb8, - 0xb3, 0x07, 0x87, 0x54, 0x46, 0xb1, 0x87, 0xbc, 0xd8, 0x3e, 0x40, 0xf3, - 0xd7, 0x80, 0x8b, 0xf0, 0x59, 0x56, 0xac, 0xbc, 0xd3, 0xc5, 0xc5, 0x12, - 0xb7, 0x25, 0x31, 0x52, 0xab, 0x46, 0xd5, 0xde, 0x8f, 0xf3, 0xde, 0xd8, - 0x54, 0x11, 0x25, 0x35, 0xf1, 0xe0, 0x14, 0x76, 0x17, 0x21, 0xaa, 0x30, - 0x45, 0xa1, 0xeb, 0x09, 0x40, 0xd8, 0xad, 0x5b, 0x79, 0x1f, 0x69, 0x71, - 0xb2, 0x35, 0x6c, 0x45, 0x56, 0xbf, 0x93, 0x5b, 0xe8, 0xac, 0x25, 0x10, - 0x5a, 0x8c, 0xec, 0x97, 0x73, 0xd1, 0x3e, 0x79, 0x34, 0x2e, 0x7b, 0x3a, - 0x58, 0x9a, 0x06, 0xb3, 0xb6, 0x41, 0x63, 0x0e, 0xea, 0x0b, 0x20, 0xb9, - 0x44, 0x76, 0x1d, 0x06, 0x0f, 0xb8, 0x6f, 0x52, 0x70, 0xe9, 0xeb, 0x9d, - 0x82, 0x9b, 0xc6, 0xca, 0x58, 0x05, 0x2d, 0x6e, 0x4f, 0x3b, 0x11, 0xa3, - 0x63, 0x62, 0x7d, 0x2c, 0x53, 0x62, 0x4d, 0x41, 0xfa, 0x96, 0x80, 0xf7, - 0x04, 0x62, 0x52, 0xad, 0xae, 0xd5, 0xee, 0x3c, 0x3e, 0x47, 0xb1, 0xf0, - 0xaa, 0x4e, 0x75, 0x02, 0x11, 0x28, 0xcc, 0x9e, 0x53, 0xb6, 0x7b, 0x83, - 0x0b, 0x13, 0x4e, 0x3d, 0xb1, 0x1b, 0x67, 0xa5, 0xd0, 0x7d, 0xbe, 0x02, - 0x0f, 0xb2, 0x90, 0xa1, 0xc9, 0xf7, 0xfa, 0x37, 0x30, 0x7e, 0xf0, 0xdb, - 0xe7, 0x00, 0x2f, 0xfc, 0x1f, 0x73, 0x5c, 0x70, 0x9c, 0x8d, 0x3f, 0xae, - 0xae, 0xac, 0x7c, 0x36, 0x31, 0xcd, 0xa7, 0x72, 0x78, 0x15, 0x5a, 0xc5, - 0x41, 0x54, 0x96, 0xbb, 0x0d, 0xcf, 0xd8, 0xa3, 0x31, 0xdc, 0x14, 0xe3, - 0x8b, 0xa9, 0xaa, 0x6c, 0x1a, 0x94, 0x0c, 0x2a, 0xa4, 0xa8, 0x1e, 0x68, - 0x97, 0xaa, 0xb1, 0xbe, 0x2f, 0x20, 0x8d, 0x4e, 0x5d, 0xc3, 0x7e, 0x96, - 0x97, 0x62, 0xfa, 0x34, 0xf0, 0xc0, 0xe7, 0xd7, 0x76, 0xd2, 0xb4, 0x04, - 0x64, 0x29, 0xc9, 0xeb, 0xb2, 0x6d, 0x98, 0x8b, 0xee, 0xbc, 0x9e, 0x6b, - 0x51, 0x8a, 0xa8, 0x2d, 0x15, 0x75, 0x66, 0x0e, 0xb8, 0xe6, 0xd7, 0xc5, - 0x71, 0xb3, 0x02, 0x9b, 0x58, 0x80, 0x26, 0x77, 0x82, 0x30, 0x8d, 0x57, - 0xf1, 0x46, 0x24, 0x61, 0xcb, 0x95, 0x87, 0xa2, 0x25, 0xa9, 0x87, 0x12, - 0x47, 0xeb, 0xe4, 0x16, 0x18, 0xa7, 0x9f, 0x15, 0x6f, 0x88, 0x6f, 0xc3, - 0xfa, 0xec, 0x4b, 0xdc, 0xfd, 0xb0, 0x68, 0x62, 0x11, 0x49, 0x80, 0xf1, - 0xbd, 0x0f, 0xf8, 0x57, 0xcd, 0x11, 0x2b, 0xef, 0x47, 0x38, 0xf9, 0x30, - 0x28, 0xe5, 0xd2, 0x21, 0xad, 0x93, 0xd7, 0x49, 0x90, 0xd9, 0xa9, 0x5f, - 0x13, 0xec, 0x59, 0x7f, 0xbc, 0x22, 0x4c, 0xba, 0x3a, 0x11, 0x98, 0x17, - 0xf4, 0x32, 0x23, 0xdd, 0x40, 0xde, 0x2a, 0x88, 0x8a, 0x51, 0x35, 0x99, - 0x70, 0x53, 0xcc, 0x57, 0x28, 0x09, 0x8b, 0x1a, 0x9a, 0x04, 0xb2, 0xa6, - 0xc3, 0x83, 0x0a, 0x13, 0xfd, 0xe5, 0xd3, 0x84, 0x34, 0x45, 0x2b, 0x78, - 0x10, 0xa1, 0x07, 0xd3, 0xe2, 0x1e, 0xe7, 0x13, 0x56, 0x2c, 0x69, 0xc8, - 0x12, 0x94, 0xb0, 0x0d, 0xc0, 0x60, 0x75, 0x02, 0x97, 0x81, 0x5d, 0x1a, - 0xab, 0x91, 0xac, 0xe3, 0x72, 0x19, 0xb6, 0x5d, 0x45, 0xbe, 0xc8, 0x15, - 0xf0, 0xd5, 0x8f, 0x2b, 0x96, 0xdc, 0x96, 0x0b, 0xf5, 0x2d, 0xcf, 0x0f, - 0xb6, 0xb3, 0x7b, 0xb2, 0x5c, 0xaf, 0xe0, 0xbf, 0x76, 0x09, 0xce, 0xbb, - 0xeb, 0xed, 0x7b, 0x42, 0xf6, 0x5c, 0x42, 0x56, 0xc1, 0x5d, 0x73, 0x3c, - 0x7e, 0x80, 0x3d, 0xd9, 0xe0, 0x2a, 0x44, 0x51, 0x92, 0x2c, 0x81, 0x3a, - 0xdf, 0xc6, 0xcd, 0xf4, 0x87, 0xe5, 0xd7, 0x82, 0xc9, 0x17, 0xe2, 0x62, - 0x17, 0x70, 0xed, 0x1b, 0xbc, 0x27, 0x5f, 0x00, 0xac, 0xe8, 0x8c, 0x7c, - 0x45, 0xf1, 0x04, 0x99, 0xe4, 0xe3, 0xb1, 0x07, 0x1b, 0x1d, 0x4c, 0x08, - 0x2a, 0x1c, 0x44, 0xd5, 0x67, 0xdd, 0x14, 0x6e, 0xee, 0x62, 0x4d, 0x16, - 0x32, 0x6d, 0xf7, 0xbd, 0x7f, 0xd2, 0x44, 0xd4, 0x72, 0x76, 0xd1, 0x46, - 0x31, 0x89, 0xa9, 0x8a, 0xec, 0x99, 0x2b, 0xf4, 0x72, 0x87, 0x6f, 0xe0, - 0x23, 0x9c, 0x80, 0x4c, 0xee, 0x87, 0xe8, 0xc3, 0x43, 0x3b, 0x15, 0x06, - 0xc9, 0xfe, 0xc4, 0x54, 0x08, 0x3b, 0x45, 0xef, 0xc1, 0x27, 0xfb, 0xfb, - 0xc0, 0xaa, 0xc7, 0x68, 0xc1, 0x77, 0x8d, 0xcb, 0xe8, 0x52, 0x89, 0x80, - 0x4d, 0x85, 0x5e, 0x49, 0x09, 0x93, 0xe8, 0x35, 0xcf, 0xc5, 0x43, 0x83, - 0x8e, 0x8b, 0x23, 0xef, 0xee, 0x0d, 0x3e, 0x6e, 0x02, 0xe0, 0xa1, 0xb6, - 0x44, 0xb2, 0x49, 0xcc, 0x31, 0x96, 0x15, 0xda, 0xb4, 0x49, 0x60, 0x0f, - 0x47, 0xa2, 0xa8, 0xc9, 0xb1, 0x84, 0x77, 0xc0, 0x9d, 0xe4, 0xb0, 0xce, - 0xce, 0x57, 0x52, 0x71, 0x37, 0xe7, 0x3f, 0x99, 0x58, 0x1a, 0xed, 0x11, - 0xd5, 0xaf, 0xf7, 0x62, 0xa9, 0xf9, 0x1c, 0x64, 0x63, 0x77, 0x07, 0xb9, - 0xfe, 0xad, 0x85, 0x54, 0x74, 0x95, 0x1e, 0x0d, 0x98, 0x3f, 0x32, 0xeb, - 0x7b, 0xd7, 0x65, 0xf7, 0xc8, 0xe8, 0xec, 0xc0, 0x06, 0xac, 0x38, 0x77, - 0x71, 0xe7, 0xce, 0x9a, 0x89, 0x8b, 0x94, 0xe5, 0xbb, 0xb1, 0xe3, 0x74, - 0xde, 0x7d, 0x46, 0xb1, 0xfa, 0x65, 0x00, 0x04, 0xeb, 0x0f, 0x73, 0xb1, - 0x74, 0x8f, 0x54, 0x9f, 0xd5, 0xb7, 0xa5, 0xa1, 0x47, 0x66, 0x16, 0x9e, - 0xb4, 0x92, 0x5f, 0x63, 0x82, 0x40, 0x6b, 0x4a, 0x19, 0x90, 0x1b, 0x78, - 0xdf, 0xec, 0x09, 0x21, 0x76, 0x8e, 0x99, 0x6b, 0xad, 0x18, 0x33, 0xf8, - 0x38, 0x13, 0x0b, 0x8e, 0xa7, 0xdc, 0xf3, 0x47, 0x3f, 0x92, 0x88, 0x49, - 0xae, 0x3d, 0x5d, 0x21, 0x6d, 0x33, 0x6e, 0x16, 0xf0, 0x84, 0x9a, 0x7c, - 0xd2, 0xd5, 0x74, 0xea, 0xff, 0x8e, 0x9a, 0x7a, 0x24, 0xd0, 0x8f, 0xd6, - 0x5e, 0x73, 0x9b, 0x20, 0xec, 0x0b, 0xaa, 0x37, 0x0d, 0x4e, 0xa3, 0x9e, - 0x84, 0x89, 0x29, 0x9b, 0x5e, 0x55, 0x31, 0xfa, 0x8b, 0xb9, 0x90, 0xd0, - 0x81, 0xae, 0x58, 0x9a, 0xfc, 0x83, 0xc7, 0x40, 0x6b, 0xed, 0x28, 0x44, - 0xf8, 0x15, 0x0a, 0x3b, 0x0a, 0x39, 0x31, 0x67, 0x0c, 0x61, 0xcb, 0x40, - 0x0a, 0x4f, 0xed, 0xae, 0x1f, 0xcc, 0x93, 0x86, 0x07, 0x5c, 0x53, 0x1b, - 0xd0, 0xa9, 0xd3, 0x4e, 0xa2, 0x75, 0x9a, 0x10, 0x23, 0xfe, 0x8c, 0x2a, - 0x35, 0xda, 0x66, 0xa8, 0x46, 0x2b, 0x13, 0x35, 0xf7, 0x13, 0x7a, 0x87, - 0xf7, 0x44, 0xc9, 0x08, 0x6d, 0xef, 0xf7, 0x72, 0x57, 0x09, 0x51, 0x85, - 0xb8, 0xeb, 0x4d, 0x86, 0x52, 0xf8, 0xd5, 0x20, 0x96, 0x7c, 0x59, 0xfb, - 0x5e, 0x36, 0x3b, 0xd5, 0x33, 0x04, 0x0e, 0x25, 0x10, 0xdc, 0x0b, 0x84, - 0x55, 0x19, 0x80, 0x12, 0x48, 0xba, 0xb5, 0xbe, 0x54, 0x14, 0x46, 0xff, - 0x1f, 0x76, 0x53, 0x9f, 0x58, 0x0d, 0x5a, 0x0a, 0x28, 0x9d, 0x90, 0x75, - 0x9b, 0x6c, 0x7b, 0x7d, 0x47, 0xa8, 0x6a, 0x3e, 0x21, 0x71, 0x30, 0xd8, - 0x25, 0xa5, 0xa5, 0xf9, 0x87, 0x44, 0x02, 0x2c, 0xed, 0xb9, 0xfa, 0x12, - 0x82, 0x80, 0x39, 0x84, 0xed, 0x46, 0xd4, 0xeb, 0x22, 0xad, 0xdd, 0x75, - 0xde, 0x13, 0x34, 0xc6, 0x5b, 0xeb, 0x13, 0x35, 0xc0, 0x1c, 0xdf, 0x5e, - 0xf6, 0xd7, 0xfc, 0xd2, 0xf2, 0x49, 0x43, 0xd8, 0x16, 0x9a, 0xd2, 0xd5, - 0xd2, 0xfc, 0x35, 0xee, 0x38, 0xc1, 0x17, 0xf4, 0xf1, 0xdd, 0x00, 0xa0, - 0x90, 0x87, 0x32, 0x55, 0x27, 0x96, 0x67, 0xf1, 0xfb, 0xd1, 0xf1, 0x6d, - 0x95, 0xec, 0xd4, 0x99, 0x62, 0xc0, 0xe8, 0x44, 0x51, 0xd7, 0xda, 0x8b, - 0x94, 0x36, 0x6e, 0xb6, 0xc8, 0xa6, 0xf0, 0x45, 0xc1, 0x00, 0x73, 0xc2, - 0xce, 0xfc, 0x66, 0xe8, 0x2b, 0x50, 0x47, 0x00, 0xa5, 0x7a, 0xf8, 0x55, - 0x41, 0x2f, 0x8b, 0x96, 0x43, 0xfe, 0x15, 0xe5, 0x2a, 0x16, 0x26, 0x7d, - 0xbf, 0xb8, 0xdb, 0xe1, 0x74, 0xfd, 0xb0, 0xf1, 0x45, 0xb5, 0x5e, 0x04, - 0x35, 0x36, 0xf2, 0x32, 0x1b, 0xf7, 0x8f, 0x89, 0x1f, 0x8f, 0xa2, 0xa4, - 0x65, 0x79, 0xa7, 0x2a, 0xb8, 0xea, 0x62, 0xc6, 0x20, 0x03, 0x7c, 0x4f, - 0x4b, 0xf4, 0xe0, 0x47, 0x91, 0x6b, 0x04, 0xcd, 0x87, 0x2d, 0xfc, 0x3d, - 0x59, 0xe7, 0x69, 0xd4, 0x64, 0x41, 0xbb, 0x96, 0x29, 0x46, 0xc4, 0x8a, - 0xea, 0x61, 0x25, 0xcf, 0x69, 0x4d, 0xb0, 0x7c, 0xd2, 0xc1, 0xe5, 0xa7, - 0xff, 0xff, 0x46, 0xbd, 0xc3, 0x63, 0xf9, 0x43, 0x0d, 0xe4, 0xb4, 0x10, - 0xf9, 0x19, 0x66, 0xfa, 0xf5, 0xb6, 0x91, 0x31, 0xfd, 0xfa, 0xb1, 0xf9, - 0x57, 0x9d, 0x22, 0x0c, 0xf9, 0x2f, 0x88, 0x27, 0x1a, 0x04, 0x56, 0x35, - 0xd1, 0x34, 0xa3, 0xcb, 0x2d, 0x7d, 0xf2, 0xc9, 0x2b, 0x2d, 0x3f, 0xa1, - 0xa6, 0xc8, 0xf2, 0x75, 0x74, 0x82, 0x6c, 0x6d, 0x13, 0x3c, 0xcb, 0xc8, - 0xb9, 0xc8, 0x57, 0x0f, 0x10, 0xa3, 0x91, 0x6a, 0xed, 0xd1, 0x4d, 0x0f, - 0xe1, 0x96, 0xee, 0x64, 0x5c, 0xea, 0xb3, 0xd6, 0x65, 0x56, 0x3b, 0xe4, - 0xaf, 0xb4, 0xaf, 0x44, 0xa3, 0x23, 0xa8, 0xa8, 0x5a, 0xef, 0x27, 0xc0, - 0x4a, 0x09, 0x05, 0x14, 0x32, 0x7f, 0x7f, 0x89, 0xe5, 0xe0, 0x59, 0xfd, - 0xfc, 0x21, 0x1a, 0x77, 0x6d, 0x2e, 0x61, 0x34, 0x52, 0xfa, 0x50, 0xd3, - 0xb7, 0x6f, 0xf3, 0xc3, 0xa9, 0xeb, 0xec, 0xa9, 0x18, 0x1a, 0x4b, 0xb1, - 0x04, 0x0a, 0xa1, 0xb5, 0xad, 0x72, 0x3f, 0x97, 0xd1, 0x27, 0x52, 0x15, - 0x63, 0x1e, 0xfd, 0x1f, 0xf4, 0x44, 0x82, 0x07, 0x46, 0xb5, 0xd9, 0xa2, - 0x88, 0xee, 0x54, 0x7d, 0xdb, 0x6b, 0x13, 0xa2, 0xe2, 0x5d, 0xaf, 0x30, - 0x06, 0x9d, 0x69, 0xd5, 0x8b, 0x9a, 0xc0, 0x21, 0x97, 0x2f, 0x34, 0xff, - 0xc7, 0xf5, 0x9d, 0x20, 0x50, 0x9b, 0xa0, 0x59, 0x7d, 0x72, 0x4e, 0x86, - 0x31, 0x33, 0xf5, 0x0f, 0xfc, 0xba, 0x80, 0x46, 0x71, 0x1d, 0x01, 0x6d, - 0x1e, 0x6b, 0x73, 0x61, 0xb9, 0xf2, 0xa4, 0xe3, 0xcd, 0x3f, 0xaf, 0x02, - 0xdb, 0x86, 0xc7, 0x72, 0x42, 0xa0, 0x3f, 0x35, 0x37, 0x7f, 0x1d, 0xd3, - 0xc8, 0x2e, 0x0c, 0x5f, 0x72, 0x0f, 0x9e, 0x2e, 0x0f, 0x47, 0xaa, 0x8d, - 0x55, 0x6d, 0x21, 0x52, 0x8d, 0x34, 0xbd, 0xd8, 0x80, 0x85, 0xee, 0x85, - 0x4a, 0xfd, 0x8f, 0x89, 0x4e, 0x8c, 0x73, 0x07, 0xc1, 0x22, 0x24, 0x91, - 0x8f, 0x2e, 0x8e, 0xaf, 0x00, 0xf5, 0x2a, 0x32, 0xc8, 0xf3, 0x19, 0x92, - 0xf6, 0xff, 0xd6, 0x72, 0x00, 0x80, 0x13, 0x4e, 0x70, 0xa9, 0x0b, 0xfe, - 0x6e, 0x02, 0xbe, 0xdf, 0x0b, 0x3b, 0x70, 0xa6, 0xb3, 0x67, 0x30, 0x83, - 0xca, 0xf6, 0x67, 0x81, 0xc0, 0x8f, 0x49, 0x5c, 0x18, 0xae, 0x8c, 0x7b, - 0x36, 0x7c, 0xcd, 0xe4, 0xb9, 0xca, 0xd3, 0xcf, 0x12, 0x28, 0x23, 0x67, - 0x3f, 0x20, 0xf4, 0x43, 0x07, 0x0a, 0xcd, 0x84, 0x90, 0x90, 0x7a, 0x71, - 0x30, 0x92, 0x71, 0x65, 0xc6, 0xd2, 0x5f, 0xec, 0x4c, 0x78, 0x29, 0x85, - 0x51, 0x7d, 0xf6, 0x3a, 0x55, 0x65, 0x48, 0xa7, 0x64, 0x7c, 0x7e, 0xb1, - 0xec, 0x96, 0x62, 0x31, 0x08, 0xec, 0xc3, 0x1d, 0xab, 0x33, 0x66, 0x58, - 0xa4, 0x64, 0x6d, 0x50, 0xcb, 0x7f, 0x71, 0x1d, 0x93, 0x75, 0x01, 0xe9, - 0x48, 0x1c, 0x66, 0x71, 0xcc, 0x44, 0xa1, 0x2f, 0xe7, 0x58, 0xf8, 0x6e, - 0x1c, 0x95, 0xf8, 0xa1, 0x2a, 0xd9, 0xa7, 0x3c, 0xc4, 0xa8, 0xcd, 0x62, - 0x7f, 0x92, 0x14, 0x63, 0x7c, 0xf5, 0xf7, 0x85, 0xe0, 0x00, 0xc7, 0xab, - 0x78, 0xdc, 0x76, 0x25, 0xe3, 0x83, 0x72, 0xc2, 0x4b, 0x8e, 0x16, 0x4f, - 0x92, 0x79, 0x68, 0xcf, 0x2d, 0x9e, 0xd1, 0x0a, 0x14, 0xbb, 0xee, 0x6f, - 0xe9, 0xa7, 0xb6, 0x2b, 0xb1, 0x52, 0xa6, 0x4c, 0x6b, 0x5a, 0x2b, 0x98, - 0x4f, 0x3b, 0x34, 0x7f, 0x52, 0x5b, 0xa8, 0x3b, 0x0b, 0x19, 0x2b, 0x78, - 0x38, 0xab, 0xb2, 0x41, 0x59, 0x49, 0xce, 0x4c, 0xcc, 0x80, 0x26, 0xb1, - 0x24, 0xcf, 0x13, 0x99, 0x3b, 0xf1, 0xda, 0xb5, 0x9a, 0x2d, 0x0b, 0x89, - 0xd8, 0xfd, 0x82, 0x89, 0xb6, 0x97, 0x99, 0x9c, 0xe4, 0xa0, 0x6c, 0x06, - 0x9e, 0xf3, 0x23, 0x18, 0xe6, 0x96, 0x64, 0xfe, 0x9e, 0x89, 0x99, 0x6c, - 0x71, 0xf3, 0x00, 0x4e, 0x8a, 0xfd, 0xc6, 0xac, 0xdd, 0xa6, 0xe5, 0xf7, - 0xbe, 0xc9, 0xf0, 0xd8, 0x3b, 0x0b, 0xec, 0xb7, 0xb2, 0xf3, 0xd3, 0xaf, - 0xeb, 0x42, 0x39, 0xfd, 0xe9, 0x7a, 0xa1, 0x03, 0xbb, 0x95, 0x40, 0xc4, - 0xd3, 0xbc, 0x20, 0xc0, 0xf2, 0xfd, 0x1a, 0xc4, 0x26, 0xd3, 0xf0, 0xa8, - 0xd7, 0x34, 0x0b, 0xc7, 0x08, 0x1f, 0xb7, 0x96, 0x96, 0x27, 0xff, 0xb7, - 0x87, 0x36, 0x31, 0x32, 0x0b, 0x13, 0x68, 0x16, 0xaf, 0xcd, 0x0a, 0xa9, - 0xeb, 0xf8, 0xd8, 0x35, 0x6a, 0x30, 0x6a, 0x2b, 0xf5, 0x9a, 0xb8, 0xdc, - 0xf8, 0x59, 0x3d, 0xff, 0xeb, 0x54, 0xb8, 0xa6, 0xff, 0x41, 0x4d, 0x89, - 0x9f, 0x0b, 0x40, 0x51, 0x97, 0x28, 0x55, 0x54, 0x77, 0xd4, 0x85, 0x1a, - 0x53, 0x22, 0xcb, 0x9c, 0x14, 0xfe, 0x42, 0x2f, 0x00, 0x42, 0x84, 0xac, - 0x35, 0x3f, 0x12, 0x2a, 0xf4, 0x22, 0xba, 0x25, 0xc0, 0x50, 0xda, 0xf8, - 0xf5, 0x5f, 0x0c, 0x28, 0x90, 0xcb, 0xe4, 0x0e, 0x7f, 0x62, 0x69, 0xdb, - 0x1b, 0x33, 0x77, 0x51, 0xac, 0x04, 0x46, 0xdb, 0xb4, 0xe5, 0x9b, 0x2a, - 0x3c, 0x03, 0x86, 0x4f, 0xb2, 0xa1, 0x7c, 0x65, 0x35, 0xe5, 0x30, 0xfb, - 0x1e, 0x86, 0xde, 0x1b, 0x8f, 0x52, 0x5c, 0x64, 0x07, 0x03, 0x07, 0x70, - 0x00, 0x8e, 0x32, 0x23, 0x82, 0x36, 0x4b, 0x74, 0x1b, 0x44, 0x3a, 0x3c, - 0xfe, 0x21, 0x83, 0xa2, 0x5d, 0xbd, 0x85, 0xbb, 0x30, 0xc0, 0xaa, 0x95, - 0xc6, 0xcc, 0x14, 0xee, 0xff, 0xc5, 0xe1, 0x49, 0x77, 0x54, 0x75, 0x38, - 0x52, 0x91, 0xb4, 0x2f, 0x10, 0x79, 0x12, 0x7a, 0xc6, 0xa2, 0xae, 0xc3, - 0x72, 0x04, 0x86, 0x8a, 0x3a, 0xbb, 0x6e, 0xcf, 0x15, 0x6b, 0x39, 0x92, - 0xbe, 0x35, 0xe2, 0x11, 0xce, 0xb2, 0xd9, 0x42, 0x05, 0x51, 0xd9, 0x2b, - 0x7d, 0xef, 0x42, 0x77, 0x52, 0x99, 0x7e, 0x5f, 0x98, 0xdd, 0xa1, 0xfc, - 0xa0, 0xcd, 0x42, 0x61, 0x90, 0xf8, 0x9a, 0x0b, 0x68, 0xa3, 0x47, 0x88, - 0xc7, 0xc2, 0xf4, 0x68, 0x11, 0xfa, 0x08, 0x5b, 0xf5, 0xfb, 0xc7, 0x15, - 0x4c, 0x7b, 0xf0, 0x7c, 0x49, 0xdf, 0x5f, 0x48, 0x95, 0x39, 0xf5, 0xb6, - 0x8f, 0x32, 0xaf, 0xe1, 0xa1, 0xb0, 0xdb, 0x18, 0x22, 0x86, 0x05, 0x16, - 0xf5, 0x4e, 0x75, 0x41, 0x2f, 0xce, 0x1c, 0x77, 0x6b, 0x11, 0x74, 0x41, - 0xa9, 0xf0, 0x76, 0x9a, 0xe1, 0xa9, 0x61, 0x58, 0xdb, 0xfa, 0x26, 0xd7, - 0xa1, 0x54, 0xdf, 0xaf, 0xba, 0x95, 0xd8, 0x67, 0x3e, 0x80, 0x45, 0x26, - 0x93, 0xf3, 0x00, 0xbc, 0x08, 0x6a, 0x1c, 0xb9, 0x1b, 0xf7, 0x9d, 0x5b, - 0xda, 0x43, 0x7a, 0xa0, 0x17, 0xaf, 0xc5, 0x26, 0x54, 0x22, 0xa6, 0x4b, - 0xfc, 0xd1, 0xac, 0x67, 0x85, 0x39, 0x80, 0xa9, 0xa7, 0x39, 0x69, 0x4c, - 0x45, 0xfc, 0x49, 0x94, 0x7b, 0xea, 0x08, 0x66, 0x10, 0x6e, 0x82, 0x49, - 0x27, 0x5f, 0x96, 0xd1, 0x18, 0xc2, 0x8e, 0xea, 0x6f, 0xdc, 0xa3, 0x3f, - 0x79, 0x23, 0x44, 0xb4, 0xad, 0xaf, 0x50, 0x80, 0xda, 0x87, 0x89, 0x3f, - 0xaf, 0x47, 0xf1, 0xce, 0xab, 0xbc, 0xe0, 0x42, 0xe4, 0x98, 0x0e, 0xa5, - 0x60, 0xbf, 0x82, 0x9a, 0x3a, 0x6d, 0x8a, 0x54, 0x39, 0x2e, 0xeb, 0xeb, - 0x7b, 0x7d, 0x18, 0xb2, 0x4e, 0x71, 0x90, 0xec, 0x10, 0xb9, 0x70, 0x2e, - 0x78, 0x5f, 0x78, 0xee, 0x0d, 0xb3, 0x94, 0x1f, 0x9a, 0xc0, 0xc3, 0x4f, - 0x12, 0x09, 0x56, 0x1a, 0x81, 0xff, 0x78, 0xad, 0xa2, 0x69, 0xa0, 0x9f, - 0x44, 0xbb, 0x23, 0xd7, 0xf3, 0xef, 0x36, 0x67, 0x56, 0xb7, 0x5f, 0x77, - 0xa7, 0xc2, 0x78, 0xb8, 0x1f, 0x41, 0xdd, 0x7b, 0x51, 0x2b, 0xec, 0xe0, - 0x8b, 0x44, 0x61, 0x9c, 0x08, 0xea, 0xf7, 0x4e, 0xf2, 0x89, 0x6e, 0x11, - 0x2c, 0xd9, 0xf5, 0x0c, 0x9f, 0x11, 0xb8, 0xed, 0x83, 0x9f, 0xad, 0xe4, - 0x2c, 0x05, 0x0f, 0xf7, 0xa8, 0x08, 0x59, 0x20, 0xd3, 0x1b, 0xda, 0x49, - 0xa9, 0x1c, 0xb6, 0x09, 0x3e, 0x09, 0x02, 0x6e, 0x3a, 0x77, 0xde, 0xc6, - 0xc9, 0xc1, 0xf8, 0xef, 0xc2, 0x1f, 0x0b, 0xce, 0x8c, 0x0f, 0x92, 0x6c, - 0x58, 0x5e, 0x10, 0x0c, 0x09, 0xf5, 0x90, 0x10, 0xe7, 0xcf, 0x9f, 0x6f, - 0x77, 0xad, 0x13, 0x9f, 0x74, 0xfa, 0x1e, 0xe8, 0x15, 0x22, 0xb9, 0xf6, - 0xbd, 0x1b, 0xea, 0x62, 0x11, 0xb1, 0xb8, 0x64, 0x08, 0x77, 0xd5, 0x36, - 0x4c, 0x3d, 0x59, 0x85, 0x8c, 0x8d, 0xbd, 0x97, 0x84, 0x11, 0xf5, 0x79, - 0xd9, 0xe3, 0x8f, 0x67, 0x60, 0x27, 0x6b, 0x5a, 0xd0, 0xc8, 0xbb, 0x72, - 0x5c, 0x37, 0xb3, 0x75, 0x66, 0x9a, 0x8b, 0xc2, 0x45, 0x6f, 0x6e, 0xcb, - 0x0b, 0x9e, 0xc0, 0x24, 0x9b, 0xda, 0x5b, 0x60, 0x99, 0x9e, 0xf5, 0x14, - 0x2a, 0xb7, 0x6b, 0xb4, 0x59, 0xa5, 0x2e, 0x50, 0xc9, 0x6f, 0x3a, 0x5c, - 0x5e, 0x58, 0xf4, 0x8d, 0x8d, 0xa4, 0x96, 0xa9, 0xc3, 0x5a, 0x8b, 0x2d, - 0x97, 0xc3, 0x9a, 0xf9, 0x52, 0x29, 0x36, 0x81, 0xf8, 0x19, 0xc5, 0xb9, - 0xb4, 0x59, 0x35, 0x86, 0xe7, 0x19, 0x85, 0xc0, 0x53, 0x70, 0xff, 0x8b, - 0x90, 0xbb, 0x78, 0x08, 0x8f, 0xc9, 0xa1, 0x4b, 0x3a, 0xf5, 0x8e, 0xa5, - 0x10, 0x06, 0x70, 0x75, 0x37, 0x33, 0xd5, 0xce, 0x39, 0x5b, 0xc9, 0xdc, - 0x70, 0x39, 0xaa, 0xc6, 0xde, 0xcc, 0x40, 0x53, 0x35, 0x65, 0xfc, 0xfd, - 0x46, 0xd1, 0xb4, 0xcd, 0xc7, 0x50, 0x58, 0x7c, 0xc5, 0x22, 0x87, 0xdb, - 0xe6, 0x33, 0x32, 0xa0, 0x81, 0x42, 0x6a, 0x2f, 0xe0, 0x05, 0xde, 0x26, - 0xfe, 0x56, 0x58, 0x4c, 0xb5, 0xb6, 0xe5, 0x6a, 0x7d, 0xc3, 0x19, 0x14, - 0x4f, 0x58, 0xf9, 0x97, 0x2a, 0x81, 0x7e, 0x2a, 0x41, 0x4a, 0x6d, 0x0e, - 0x63, 0x0a, 0x48, 0xd1, 0xe5, 0xb3, 0xb3, 0xb4, 0x38, 0x0b, 0xf2, 0xb8, - 0xc9, 0x55, 0x0f, 0x28, 0xbf, 0x67, 0x46, 0x0b, 0xad, 0x06, 0xd5, 0x89, - 0xb4, 0xae, 0x20, 0x9a, 0xde, 0xd6, 0xbb, 0x74, 0xa3, 0x13, 0x6d, 0xf6, - 0x05, 0xb2, 0xc6, 0x9a, 0x31, 0xed, 0x12, 0x50, 0x0c, 0xf0, 0xd9, 0x78, - 0x79, 0x7d, 0x59, 0x6e, 0x38, 0xbb, 0x03, 0x18, 0xd8, 0x09, 0x20, 0xfb, - 0x0b, 0x9a, 0xc8, 0x34, 0x1e, 0x77, 0xd4, 0x95, 0x6a, 0xc8, 0x6d, 0x5d, - 0x6c, 0x54, 0xff, 0x8b, 0xf8, 0xa4, 0xc0, 0xac, 0x6e, 0x0d, 0x3c, 0xbd, - 0x10, 0x63, 0x66, 0x1e, 0x24, 0x64, 0xba, 0x33, 0xe4, 0x30, 0xf0, 0x8d, - 0xc4, 0xa0, 0xad, 0xbf, 0x3c, 0x73, 0x05, 0x66, 0x0c, 0x20, 0x85, 0x5f, - 0xe4, 0xa5, 0xd4, 0x35, 0xc2, 0xa6, 0xef, 0x71, 0xf6, 0xc0, 0x6f, 0xe0, - 0x11, 0x5f, 0x8d, 0x24, 0x60, 0x45, 0xaa, 0x17, 0x5e, 0xce, 0x98, 0x9f, - 0x2a, 0x0f, 0x08, 0xdf, 0x11, 0x08, 0x27, 0xda, 0x13, 0x91, 0x55, 0xee, - 0x6b, 0x69, 0xe2, 0x48, 0x3d, 0xd3, 0x61, 0xe8, 0x23, 0x42, 0x5c, 0x81, - 0x30, 0x36, 0xed, 0x3d, 0xac, 0xa7, 0x16, 0x06, 0x2d, 0x59, 0x8c, 0x08, - 0x32, 0xba, 0x75, 0xd4, 0x48, 0x43, 0x28, 0x6d, 0xd6, 0xf8, 0xc1, 0xcb, - 0x81, 0x22, 0xa8, 0x66, 0x89, 0x50, 0x13, 0x4b, 0x54, 0x7e, 0x1c, 0x8b, - 0x6e, 0xa9, 0xdf, 0x5e, 0x3e, 0xba, 0xe6, 0x6d, 0x23, 0xd7, 0xd7, 0x23, - 0x17, 0xef, 0x2f, 0x58, 0x29, 0x56, 0x3b, 0xd2, 0xef, 0x9e, 0xbe, 0xf8, - 0x0d, 0xe3, 0x8b, 0x3c, 0x94, 0x07, 0x60, 0x94, 0xc8, 0x8c, 0xcc, 0x1b, - 0x2f, 0xaf, 0xcb, 0xbf, 0x5a, 0xc4, 0x81, 0x47, 0xf8, 0xe2, 0x19, 0x08, - 0xb3, 0x31, 0xee, 0x61, 0xf4, 0x06, 0x83, 0x33, 0xf4, 0xa5, 0x8b, 0x1b, - 0xb4, 0xd3, 0x53, 0xb0, 0xeb, 0xcc, 0x2b, 0x6c, 0xd3, 0x23, 0xec, 0xeb, - 0xdc, 0x35, 0xc0, 0xec, 0xe3, 0x0c, 0x34, 0x98, 0xe5, 0x1e, 0x0a, 0x6d, - 0x61, 0x6c, 0xe8, 0x8a, 0xdc, 0xdb, 0x92, 0x20, 0x08, 0x4f, 0xba, 0xa4, - 0x5b, 0x0b, 0x66, 0x43, 0x17, 0x09, 0x45, 0x8f, 0xba, 0x0d, 0xec, 0xd6, - 0x34, 0xec, 0xa9, 0xee, 0xb0, 0xbe, 0x6b, 0xd2, 0x7d, 0x86, 0x1c, 0x73, - 0xdb, 0xe2, 0xbb, 0x3a, 0x61, 0x89, 0x10, 0x9b, 0x2a, 0xfd, 0x77, 0x98, - 0x70, 0xaf, 0x47, 0x3f, 0x7b, 0xf8, 0x79, 0x1f, 0xa8, 0x94, 0x4f, 0xd1, - 0x7b, 0x94, 0xa4, 0xd7, 0x78, 0x52, 0x7c, 0xcc, 0xcf, 0x18, 0xe7, 0x98, - 0xa8, 0xd4, 0xe9, 0x44, 0x5b, 0x3b, 0x0e, 0x97, 0x5e, 0x38, 0x5f, 0xfe, - 0x9e, 0x59, 0x1f, 0xb4, 0xdf, 0x04, 0x68, 0xe0, 0x73, 0x85, 0x5b, 0x1a, - 0xd3, 0x2d, 0xb2, 0x74, 0xb9, 0x55, 0x75, 0xb1, 0x07, 0xa5, 0x1d, 0xcd, - 0x42, 0x02, 0x19, 0xee, 0x70, 0xa8, 0x1d, 0x7a, 0x18, 0x05, 0xd1, 0xdd, - 0xae, 0x60, 0x03, 0x24, 0xdf, 0x46, 0x9c, 0xb7, 0xaa, 0xed, 0x58, 0x4b, - 0x21, 0xf4, 0x94, 0xd3, 0x24, 0x0e, 0x75, 0x83, 0x9b, 0x6c, 0x7e, 0x85, - 0x9a, 0x3a, 0x30, 0xc9, 0xcb, 0x01, 0xbb, 0x7c, 0xd3, 0x5e, 0x38, 0xe5, - 0x71, 0x50, 0x6c, 0x91, 0x3c, 0x54, 0x3a, 0xff, 0x55, 0x87, 0x39, 0xc2, - 0x65, 0x46, 0xb8, 0xc1, 0xb7, 0xb6, 0x0f, 0x4e, 0x03, 0x12, 0x4b, 0x13, - 0xa9, 0x6e, 0xd1, 0x77, 0x72, 0x30, 0xbc, 0xd4, 0xb5, 0xf2, 0x18, 0x38, - 0x9b, 0x29, 0x80, 0x48, 0x2d, 0xaf, 0x27, 0x10, 0xec, 0x61, 0xa9, 0x81, - 0x4b, 0x9b, 0xba, 0x5a, 0x90, 0xe9, 0x7c, 0xa3, 0x3a, 0x72, 0xe3, 0xa0, - 0x1d, 0x15, 0x8a, 0x52, 0x0e, 0x70, 0x45, 0xd4, 0x97, 0x71, 0xc4, 0xa2, - 0x33, 0x54, 0x00, 0x11, 0x0d, 0x82, 0x6d, 0x5e, 0xdd, 0x44, 0x3b, 0x54, - 0x41, 0x5e, 0x9f, 0x5c, 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, - 0xd1, 0xf1, 0x39, 0x70, 0xb3, 0x6d, 0x5c, 0xf9, 0x9a, 0xd9, 0x08, 0xde, - 0x7f, 0x90, 0xec, 0x8c, 0x1c, 0x88, 0x9d, 0x92, 0x84, 0xce, 0xe6, 0xc1, - 0xe5, 0x66, 0xae, 0xb5, 0x47, 0xcd, 0x0a, 0x3e, 0xa9, 0x75, 0x78, 0x45, - 0xf7, 0x4f, 0xeb, 0xf2, 0xea, 0xff, 0xff, 0x84, 0xfa, 0x69, 0x12, 0x08, - 0x79, 0xad, 0xd8, 0xf0, 0x18, 0x1d, 0xde, 0x7d, 0xbc, 0x5e, 0x33, 0x9d, - 0x81, 0xef, 0xe7, 0xdd, 0x8d, 0x56, 0xc3, 0xfe, 0x8b, 0xed, 0x99, 0xe4, - 0xd2, 0x69, 0x62, 0x06, 0xa0, 0x56, 0xda, 0xcf, 0x02, 0x59, 0x93, 0x77, - 0x6c, 0x53, 0x60, 0x29, 0x0a, 0xa3, 0xe8, 0xcd, 0x71, 0x06, 0x98, 0xbe, - 0xa0, 0x61, 0xd3, 0xe2, 0x90, 0x81, 0x0b, 0xfd, 0x57, 0x4a, 0x8e, 0xe1, - 0x64, 0x5e, 0xed, 0xda, 0x26, 0x10, 0x4c, 0x16, 0x82, 0x43, 0x7c, 0x93, - 0x2b, 0x83, 0x27, 0x77, 0xdf, 0x82, 0x26, 0xa1, 0xac, 0x01, 0xe9, 0xc2, - 0x3c, 0xcf, 0x2c, 0xd9, 0xf4, 0xc9, 0x79, 0xad, 0x8e, 0x6b, 0xd9, 0xf2, - 0x68, 0x1e, 0xf9, 0x01, 0xc9, 0x89, 0x42, 0x66, 0x01, 0xa6, 0xf1, 0x85, - 0x82, 0x55, 0x53, 0x33, 0x27, 0x0b, 0x3c, 0xe3, 0xb8, 0x47, 0x9c, 0xa3, - 0xb4, 0xd6, 0x01, 0x1f, 0x6d, 0xc9, 0xcc, 0x9f, 0x2c, 0x17, 0xc8, 0xe6, - 0x60, 0x37, 0x5e, 0x82, 0xba, 0xa5, 0xe1, 0x65, 0x94, 0xb4, 0xfc, 0xed, - 0xc3, 0x6d, 0x9f, 0xc7, 0x72, 0xba, 0xde, 0x41, 0x6f, 0xd5, 0x72, 0xaa, - 0xc1, 0x78, 0x2f, 0xdd, 0x8a, 0x85, 0x20, 0x43, 0x68, 0x7c, 0x7b, 0xf3, - 0xd5, 0x83, 0x4f, 0x68, 0x0c, 0xdb, 0x44, 0x65, 0x59, 0x4e, 0x5f, 0x23, - 0x1c, 0xf2, 0x84, 0x87, 0x08, 0xd9, 0xc1, 0x11, 0x6a, 0x68, 0xba, 0x5f, - 0x71, 0x2e, 0x3c, 0x96, 0x2e, 0xd3, 0xda, 0xd4, 0x44, 0xa2, 0xf7, 0x5e, - 0xeb, 0x5a, 0x7c, 0x74, 0xa9, 0x05, 0xd3, 0x4e, 0xa5, 0xb8, 0xf1, 0x1d, - 0x1d, 0xca, 0x85, 0xea, 0xeb, 0x10, 0x23, 0x50, 0xea, 0x7b, 0xfd, 0x18, - 0xa6, 0xea, 0xe5, 0x72, 0x9c, 0x2c, 0xb6, 0xb1, 0x87, 0x23, 0xb4, 0xc7, - 0x65, 0x29, 0xc2, 0xb6, 0xe9, 0x00, 0xbc, 0x35, 0x0d, 0x82, 0x0b, 0x08, - 0x2c, 0xf6, 0x12, 0xea, 0x8d, 0x4c, 0xaf, 0xf0, 0x2d, 0xf6, 0x21, 0x2c, - 0xf3, 0xda, 0x25, 0xd1, 0x4c, 0x41, 0x1f, 0x06, 0x7c, 0xb0, 0x4c, 0xef, - 0x68, 0x7b, 0x71, 0xa8, 0x83, 0xda, 0xc5, 0xa3, 0xda, 0xd6, 0xa7, 0x69, - 0x45, 0x4b, 0xaf, 0x97, 0xaa, 0x54, 0xdb, 0xae, 0x07, 0x1c, 0x4a, 0x96, - 0x66, 0xce, 0x30, 0xff, 0xd9, 0xab, 0x39, 0x14, 0xbb, 0x13, 0xd4, 0x10, - 0xf0, 0xdd, 0x3c, 0x72, 0xaf, 0x97, 0xb1, 0xf3, 0xcb, 0xaf, 0x8d, 0x13, - 0xef, 0xdf, 0x79, 0x21, 0x9c, 0xbd, 0xe7, 0xaa, 0x37, 0x0b, 0x97, 0x16, - 0xae, 0xf9, 0x27, 0x73, 0xd8, 0x26, 0x3f, 0xac, 0x0c, 0x20, 0x68, 0x8b, - 0x1c, 0x5f, 0xa7, 0x40, 0x9c, 0x2d, 0xe3, 0x8d, 0x20, 0xb0, 0x56, 0xdf, - 0xa5, 0x32, 0x87, 0x08, 0xd8, 0x2e, 0x89, 0xbf, 0x6a, 0xf9, 0x74, 0x4f, - 0x18, 0x18, 0xe6, 0x8c, 0x45, 0xe2, 0xf3, 0xe8, 0xbe, 0x84, 0x6c, 0x54, - 0x72, 0x60, 0x61, 0xd7, 0x41, 0xd3, 0x89, 0xd1, 0x14, 0x15, 0x3d, 0xde, - 0x68, 0x2e, 0x56, 0x36, 0x72, 0x74, 0x08, 0x55, 0x39, 0xfa, 0x49, 0x15, - 0xdc, 0xe7, 0x46, 0x27, 0x8f, 0x55, 0x44, 0xb2, 0xa9, 0x22, 0x4f, 0xe5, - 0xa4, 0xf2, 0xb4, 0x55, 0x41, 0xea, 0x7f, 0x15, 0x14, 0xc3, 0x8a, 0xe2, - 0x71, 0xb1, 0x7e, 0x3e, 0xb1, 0x4d, 0xab, 0xf5, 0xa9, 0xfb, 0x3f, 0x75, - 0xe7, 0x53, 0x56, 0xd4, 0x71, 0x85, 0x80, 0xa0, 0x00, 0x60, 0xe4, 0xc2, - 0xb4, 0x4f, 0x16, 0x39, 0x9f, 0x98, 0x4d, 0x0e, 0x06, 0xcf, 0x51, 0x1a, - 0x9d, 0xff, 0xaf, 0x32, 0xd8, 0xb4, 0x74, 0xaf, 0x15, 0xa9, 0xe9, 0x38, - 0x68, 0x92, 0x40, 0x07, 0xea, 0x68, 0x65, 0x8b, 0xf7, 0xb2, 0x1a, 0x79, - 0x05, 0xc4, 0xb8, 0x5d, 0x9a, 0x70, 0x20, 0x46, 0xef, 0xb0, 0xd5, 0x7d, - 0x5e, 0x05, 0x63, 0xae, 0x7a, 0xfa, 0x44, 0x3a, 0x6e, 0x34, 0xe1, 0x72, - 0xdc, 0xd3, 0x4c, 0x44, 0xc4, 0x2c, 0xd5, 0x5a, 0x2c, 0x8b, 0x28, 0xfd, - 0xb6, 0x91, 0xe9, 0x9b, 0xce, 0x8c, 0x74, 0x7c, 0x25, 0x44, 0xda, 0xf0, - 0xd1, 0xde, 0xc0, 0xc5, 0xde, 0x58, 0xa1, 0xad, 0xec, 0x51, 0x86, 0xe1, - 0x7f, 0x7c, 0xde, 0x35, 0x75, 0x3f, 0x8f, 0xa3, 0xae, 0xb9, 0x27, 0xeb, - 0xe8, 0xf8, 0xd7, 0x85, 0x3c, 0x93, 0x69, 0xff, 0x5c, 0x90, 0xd7, 0xfd, - 0xf8, 0x73, 0x1f, 0xcd, 0xf9, 0x3e, 0xf8, 0x29, 0xb2, 0x51, 0x1d, 0x40, - 0x58, 0xca, 0x35, 0xf7, 0x3e, 0xfa, 0xc2, 0x64, 0xd2, 0x28, 0xad, 0xf3, - 0x7b, 0x9a, 0xc5, 0x34, 0xa3, 0x27, 0xce, 0xe4, 0x04, 0x58, 0xdd, 0xb1, - 0x50, 0xf4, 0x8d, 0x0f, 0xb1, 0x94, 0x61, 0x45, 0x65, 0xbf, 0x27, 0x4e, - 0xf9, 0x58, 0xe8, 0x6c, 0xb8, 0x5f, 0xa9, 0x9f, 0x10, 0xe3, 0x0d, 0xd7, - 0x1d, 0xa4, 0xf3, 0x81, 0x72, 0x4d, 0x6a, 0x9d, 0x69, 0x0f, 0x47, 0x4f, - 0x47, 0x7f, 0xc5, 0x12, 0x05, 0x63, 0x28, 0x3a, 0xa8, 0x2d, 0x01, 0x99, - 0x9f, 0x0b, 0xe2, 0x05, 0x1a, 0xaf, 0xb5, 0x38, 0x39, 0x76, 0x00, 0x18, - 0x3f, 0x23, 0x06, 0x5b, 0xec, 0x74, 0x99, 0x4a, 0x91, 0xd4, 0xd1, 0x2f, - 0x45, 0x1c, 0xac, 0xe8, 0xda, 0xe5, 0xcd, 0xca, 0xd7, 0xe6, 0xf3, 0x83, - 0x1d, 0x6e, 0x01, 0xea, 0x32, 0x79, 0x27, 0x42, 0x19, 0x8f, 0x7c, 0xb6, - 0xb1, 0x9b, 0x6d, 0x66, 0x9b, 0x94, 0xdd, 0xd6, 0xc2, 0x5a, 0xeb, 0x69, - 0x4e, 0x3d, 0x95, 0xf3, 0xa7, 0x35, 0x42, 0x83, 0xeb, 0x5d, 0xbf, 0xee, - 0xbf, 0xd9, 0xe9, 0x7b, 0x97, 0x4a, 0x2b, 0xe9, 0x14, 0x33, 0x39, 0x2b, - 0xbd, 0xe8, 0x0c, 0x98, 0x08, 0x31, 0x1a, 0x47, 0xc9, 0x31, 0xc4, 0x15, - 0xf5, 0x80, 0x78, 0x91, 0x6f, 0xd5, 0x3d, 0x92, 0x4b, 0xa6, 0x72, 0x89, - 0xee, 0xb4, 0x5a, 0xd5, 0xfa, 0x1e, 0x8c, 0x74, 0x53, 0x22, 0xe8, 0x82, - 0x87, 0x94, 0x40, 0xf4, 0xe8, 0x4a, 0x76, 0x53, 0x80, 0x30, 0xc9, 0x0b, - 0x4e, 0xb2, 0x42, 0x64, 0x8c, 0xce, 0x09, 0x23, 0xa7, 0xd7, 0x5d, 0xe7, - 0x08, 0x96, 0x47, 0x8b, 0xb1, 0xe2, 0xeb, 0xc6, 0x2c, 0x8e, 0x82, 0x31, - 0x2c, 0xc3, 0xe9, 0xf7, 0x47, 0xf2, 0xdb, 0xff, 0xd0, 0x24, 0x52, 0xd7, - 0xe5, 0x37, 0x5c, 0x5b, 0x31, 0x54, 0x07, 0x71, 0xf1, 0x4d, 0x31, 0xf6, - 0x32, 0xe5, 0xbb, 0x4b, 0xbe, 0xaa, 0x7e, 0x09, 0x9e, 0x88, 0xf7, 0xf8, - 0xaa, 0x1a, 0x2d, 0x8d, 0x73, 0x0f, 0xab, 0x98, 0xd4, 0xbe, 0x2b, 0x3e, - 0x03, 0xa0, 0xe5, 0xcd, 0x1c, 0xe4, 0xff, 0x2a, 0x15, 0x21, 0x77, 0xef, - 0x37, 0xaf, 0xd4, 0xf1, 0xab, 0x67, 0xd2, 0x0a, 0x2a, 0x1c, 0x8f, 0x6f, - 0x4c, 0x99, 0x66, 0x87, 0x73, 0x6d, 0x5d, 0x8d, 0xbd, 0x2d, 0x43, 0x60, - 0xce, 0x02, 0xa8, 0xce, 0x6a, 0x67, 0x4f, 0xff, 0xd5, 0x9c, 0xf4, 0x1e, - 0x97, 0xe4, 0x69, 0x86, 0x2e, 0x32, 0x84, 0x27, 0x4b, 0xe1, 0x38, 0xa1, - 0xf2, 0xf4, 0x4f, 0xbb, 0x14, 0xf1, 0x8a, 0x15, 0xa8, 0x90, 0x71, 0xe5, - 0x0f, 0xe0, 0x43, 0x78, 0xca, 0xf2, 0x01, 0x09, 0x3e, 0x0c, 0xe8, 0xbe, - 0x36, 0xd8, 0x60, 0xf7, 0x4c, 0x30, 0xab, 0x10, 0x7c, 0x1b, 0x3f, 0xaf, - 0x8c, 0xf0, 0x05, 0x12, 0x80, 0xf8, 0xa7, 0xb3, 0x87, 0xfe, 0x7a, 0x0c, - 0x39, 0x8b, 0x95, 0xf9, 0x2e, 0xac, 0x65, 0x4c, 0xa8, 0x8e, 0xfe, 0x80, - 0x44, 0x60, 0xda, 0x96, 0xf9, 0x36, 0x0d, 0xe5, 0x7b, 0x4f, 0xf0, 0xa4, - 0x94, 0x17, 0x7b, 0xbf, 0xb4, 0x45, 0xfd, 0x3d, 0x7b, 0x58, 0xa8, 0x17, - 0xc7, 0x54, 0xea, 0x00, 0x20, 0xbd, 0x5a, 0x62, 0x11, 0x07, 0xab, 0x80, - 0xaa, 0x25, 0xfb, 0xaf, 0x4e, 0x23, 0xf3, 0xb4, 0x11, 0xb7, 0xb1, 0xea, - 0xc8, 0x39, 0x52, 0xc0, 0xcf, 0x6f, 0x5b, 0xad, 0xba, 0xce, 0xec, 0x55, - 0x5b, 0x5b, 0x33, 0xca, 0x21, 0xb1, 0xae, 0xa5, 0xbf, 0xdb, 0xa5, 0x5b, - 0x0a, 0x7d, 0x4a, 0xef, 0x06, 0x86, 0x53, 0x68, 0xe5, 0x56, 0x20, 0x7a, - 0xa9, 0x66, 0xb6, 0xd0, 0x02, 0x62, 0xe1, 0xc2, 0x59, 0xf6, 0xb3, 0x7b, - 0xfd, 0x08, 0x64, 0xe0, 0x03, 0x41, 0x9f, 0xa2, 0x02, 0x30, 0x66, 0xbb, - 0x33, 0xf4, 0xc3, 0x7c, 0x5e, 0x70, 0x07, 0xfa, 0x42, 0x86, 0x42, 0xe9, - 0xfc, 0xd9, 0xca, 0x95, 0x0e, 0xd3, 0x19, 0xd3, 0xa2, 0x9c, 0x11, 0x9c, - 0xce, 0x3c, 0x21, 0xb4, 0x84, 0x24, 0x65, 0x0a, 0x0d, 0x36, 0xae, 0x99, - 0x24, 0x6f, 0x2f, 0xac, 0x4c, 0x3f, 0xfc, 0xb9, 0xd5, 0x01, 0xf2, 0x23, - 0xc9, 0x99, 0xe1, 0x96, 0x5f, 0x77, 0xd8, 0x49, 0x2c, 0x5b, 0xc8, 0x0c, - 0x2e, 0xec, 0xec, 0xb2, 0xfb, 0x99, 0x9d, 0xe3, 0xdc, 0xc1, 0x30, 0x8a, - 0x6e, 0xeb, 0x53, 0x4c, 0xa8, 0x1e, 0x4e, 0x16, 0x02, 0xa4, 0x6b, 0x13, - 0xeb, 0x54, 0x7a, 0x7a, 0x89, 0x8d, 0xd5, 0xd2, 0x4a, 0x65, 0xe9, 0x4c, - 0xcd, 0x2f, 0xe8, 0x60, 0x23, 0xab, 0x50, 0x7e, 0x60, 0x16, 0xa8, 0xca, - 0xcb, 0x3c, 0x94, 0x60, 0xe6, 0x32, 0x78, 0xde, 0x7a, 0xa6, 0x23, 0xd4, - 0xb1, 0xfb, 0x5a, 0x4d, 0x52, 0x83, 0x70, 0xa7, 0x6d, 0xe7, 0xb1, 0x07, - 0xc8, 0xeb, 0x1d, 0x20, 0xdc, 0xe3, 0xa3, 0x00, 0x89, 0xb1, 0x3e, 0x9e, - 0x71, 0x3b, 0xaf, 0xaa, 0x83, 0x80, 0xe0, 0x61, 0x6d, 0xc5, 0x83, 0x40, - 0x83, 0x2a, 0x32, 0x80, 0xea, 0xa1, 0x2f, 0x3e, 0xc5, 0x84, 0xc4, 0x64, - 0x78, 0x0a, 0x03, 0x77, 0x64, 0x81, 0x98, 0x40, 0x36, 0x71, 0xab, 0xc2, - 0x3e, 0xbc, 0x08, 0xbc, 0xaf, 0xa3, 0xb8, 0xf5, 0x30, 0x38, 0x86, 0x3d, - 0x22, 0xc1, 0x1b, 0xfe, 0x37, 0x67, 0xcc, 0x27, 0xf3, 0xa8, 0x40, 0x77, - 0xdd, 0xce, 0x52, 0x10, 0x7e, 0xb9, 0xfe, 0x06, 0x9f, 0x29, 0x67, 0xdd, - 0x37, 0x45, 0x10, 0xfd, 0xa8, 0x40, 0xef, 0x6f, 0xda, 0xec, 0x6b, 0x4e, - 0x78, 0xf5, 0xb2, 0x9d, 0xf8, 0x56, 0x1c, 0x17, 0xb0, 0x77, 0xc0, 0x3b, - 0x99, 0x89, 0x2b, 0xc6, 0xb8, 0x43, 0xd6, 0x22, 0x21, 0x67, 0xd2, 0xd1, - 0x27, 0x1f, 0x1e, 0x02, 0xf3, 0x94, 0x19, 0x63, 0xcb, 0x66, 0x1e, 0x8c, - 0x62, 0xc8, 0xf2, 0xca, 0x86, 0x31, 0xae, 0x46, 0x9f, 0x7a, 0x7b, 0xcb, - 0xad, 0x3f, 0x87, 0x18, 0x4e, 0x72, 0xc8, 0x09, 0xa0, 0xf4, 0x86, 0xe3, - 0xb8, 0xf8, 0x9a, 0x43, 0x4d, 0x7c, 0x19, 0x08, 0xe8, 0x18, 0x8f, 0xea, - 0x4c, 0x5c, 0xb1, 0xdb, 0xcb, 0xb0, 0xbc, 0x04, 0x77, 0xe7, 0x08, 0xa9, - 0xda, 0xe5, 0x59, 0x35, 0x30, 0x84, 0x8e, 0x4f, 0xdc, 0x35, 0x7d, 0x2f, - 0x71, 0xd3, 0xa2, 0xf6, 0x30, 0x78, 0x6b, 0xd3, 0xb8, 0xfe, 0xc2, 0x2d, - 0xe5, 0x36, 0xb1, 0x9b, 0x6f, 0xfd, 0x5e, 0x89, 0x1e, 0xce, 0x6e, 0x51, - 0xca, 0x67, 0xdb, 0xf4, 0xe1, 0x1b, 0xe9, 0xb7, 0x54, 0x16, 0x9d, 0x2f, - 0x28, 0x82, 0xbe, 0x69, 0xec, 0x30, 0x9f, 0xb7, 0xb4, 0xd5, 0xe0, 0xfe, - 0x9e, 0x70, 0x4f, 0x2a, 0x6a, 0x07, 0xd4, 0x0b, 0xab, 0xfc, 0x54, 0x3e, - 0xd7, 0x3d, 0x56, 0xb1, 0xcf, 0x55, 0xd2, 0x72, 0x72, 0xdf, 0x27, 0x96, - 0x63, 0x34, 0x6f, 0x0e, 0x98, 0xa4, 0x4f, 0x5c, 0xe0, 0x65, 0xd1, 0x4a, - 0xcb, 0x66, 0x82, 0xb4, 0x0e, 0x19, 0x7b, 0x3e, 0x49, 0xa9, 0x86, 0x7e, - 0x42, 0xb3, 0x74, 0x6f, 0xc0, 0x1a, 0xe5, 0xb2, 0x60, 0x61, 0xe0, 0xf4, - 0x4b, 0xa1, 0x9a, 0x44, 0x13, 0x7e, 0xaf, 0x22, 0xfe, 0xbc, 0x5b, 0xfb, - 0x74, 0x6a, 0xdc, 0x17, 0x02, 0x7c, 0xa5, 0xb5, 0xe0, 0x18, 0xa0, 0x6d, - 0xec, 0x0d, 0x38, 0xd3, 0x85, 0x74, 0xf7, 0x9c, 0xc4, 0x70, 0x31, 0x9c, - 0x9d, 0xee, 0x52, 0x71, 0xaa, 0x78, 0x5b, 0x44, 0x9b, 0x73, 0x3e, 0xfb, - 0x50, 0xc0, 0x6b, 0xf4, 0x0b, 0x19, 0x0d, 0xa2, 0x5b, 0xc9, 0x4a, 0x51, - 0x80, 0x3a, 0xcb, 0x62, 0xe2, 0x18, 0x10, 0x81, 0x62, 0x46, 0x4f, 0x3c, - 0xeb, 0xd9, 0x42, 0x76, 0x87, 0x96, 0x59, 0xf8, 0x2b, 0x16, 0xfd, 0x66, - 0xdd, 0x5a, 0xef, 0x14, 0xc6, 0x9a, 0x0d, 0x83, 0xca, 0xd7, 0xcd, 0x99, - 0xc1, 0x7e, 0x3b, 0xb6, 0x4d, 0x0d, 0x8f, 0x59, 0xbd, 0x66, 0xe8, 0xdb, - 0x04, 0xc8, 0x4a, 0x65, 0x13, 0x62, 0xc3, 0x45, 0x11, 0xdc, 0xe1, 0x98, - 0x4e, 0x7f, 0x62, 0xfe, 0x4a, 0x6f, 0x31, 0x56, 0xc2, 0x4c, 0x7b, 0x91, - 0xe0, 0xab, 0x85, 0xd7, 0x6f, 0x8a, 0xed, 0xc4, 0x20, 0xe0, 0x97, 0xcc, - 0x34, 0xef, 0x48, 0x82, 0xa8, 0x4a, 0x61, 0xd5, 0x5f, 0xab, 0x5c, 0xd5, - 0x3a, 0x3b, 0x2c, 0x05, 0xa9, 0x9a, 0x52, 0x9c, 0xcd, 0x6f, 0x89, 0x8b, - 0xaf, 0x69, 0x38, 0xb8, 0x2a, 0x65, 0x30, 0xd9, 0x08, 0xef, 0xb4, 0x6f, - 0xae, 0x40, 0x36, 0x11, 0xa5, 0x9b, 0x7f, 0x74, 0x2d, 0x08, 0x53, 0x7c, - 0x0d, 0xe3, 0x60, 0xd6, 0xfe, 0xaf, 0x64, 0x0a, 0x3b, 0x48, 0xfa, 0x92, - 0x28, 0x14, 0x7b, 0x49, 0x10, 0x23, 0x05, 0x44, 0x92, 0xe1, 0x06, 0x5e, - 0x77, 0x32, 0x72, 0xb8, 0x48, 0x52, 0xfc, 0x01, 0x0b, 0xe1, 0xfd, 0x8b, - 0x02, 0xb6, 0x7e, 0xea, 0x12, 0x58, 0x26, 0xb7, 0xdb, 0x11, 0xe2, 0x63, - 0x7c, 0x1b, 0x5a, 0x1c, 0x93, 0x68, 0x53, 0xc2, 0xd3, 0xb9, 0xf2, 0xf7, - 0x87, 0x52, 0xa2, 0x60, 0x56, 0xc6, 0x65, 0xf8, 0x82, 0xfe, 0xa7, 0x82, - 0x55, 0x1d, 0xb5, 0x55, 0xee, 0x45, 0x55, 0xcb, 0xe6, 0xff, 0xa5, 0x4e, - 0xbe, 0x32, 0xc7, 0x33, 0x6b, 0x58, 0x3f, 0x0d, 0xfd, 0x3e, 0xd4, 0x2e, - 0xd5, 0x84, 0xad, 0xb1, 0xe0, 0x92, 0xff, 0xbb, 0x65, 0xbb, 0x26, 0x36, - 0x00, 0x92, 0x60, 0x5c, 0x95, 0x45, 0xb2, 0x40, 0xd7, 0x23, 0x14, 0xd9, - 0xf8, 0x9c, 0x04, 0xf5, 0xb9, 0xa9, 0xec, 0x8e, 0x95, 0x4e, 0x1c, 0x9b, - 0x5d, 0x81, 0x9c, 0x91, 0xc6, 0x16, 0x3d, 0x93, 0x47, 0xd5, 0x0b, 0xe9, - 0xcb, 0xf6, 0x49, 0xd8, 0x3b, 0xf6, 0x98, 0x37, 0xe1, 0x97, 0xb5, 0xbc, - 0xe9, 0x5b, 0xd0, 0x0e, 0xd4, 0x5b, 0x47, 0x2e, 0xdb, 0x53, 0xf1, 0x4a, - 0xb7, 0x0e, 0x99, 0xa1, 0x02, 0x99, 0x9a, 0x90, 0xba, 0xa0, 0x52, 0x62, - 0xbf, 0x9e, 0x85, 0x31, 0xad, 0x9b, 0x7f, 0xdd, 0x4d, 0xb1, 0xbb, 0xa7, - 0x96, 0xd9, 0x56, 0x96, 0x05, 0x8b, 0x6e, 0x5e, 0x6b, 0xb2, 0x87, 0x23, - 0x44, 0x68, 0xed, 0x07, 0x9b, 0x61, 0xa9, 0x65, 0xed, 0x8d, 0x15, 0xc0, - 0x24, 0xa1, 0x23, 0xd0, 0xc1, 0xdd, 0x62, 0xf2, 0x4a, 0x8b, 0x35, 0xe0, - 0x3c, 0x51, 0x4e, 0x55, 0x56, 0x39, 0x0c, 0xd6, 0xe1, 0x37, 0x9b, 0xcc, - 0x57, 0x3a, 0x7d, 0xb4, 0x9e, 0xc3, 0xbc, 0xbe, 0x5e, 0xf6, 0xa4, 0x8b, - 0xd8, 0xe1, 0x54, 0x20, 0x1a, 0xcb, 0xc8, 0x47, 0x3c, 0x8e, 0xf2, 0xae, - 0x7b, 0x2e, 0x22, 0xd7, 0xe0, 0x67, 0x27, 0xc9, 0xd2, 0x9d, 0x55, 0xee, - 0x1c, 0x3d, 0xc2, 0xb6, 0xfe, 0x07, 0x15, 0x37, 0x3a, 0x4d, 0x55, 0xff, - 0x11, 0x12, 0xbd, 0x8b, 0x17, 0x3a, 0x25, 0x63, 0xbc, 0x78, 0x0d, 0x2b, - 0xac, 0x96, 0x63, 0x14, 0x41, 0xff, 0x18, 0x78, 0x5a, 0x9d, 0xa8, 0x7d, - 0x10, 0xa7, 0xa9, 0x23, 0xe6, 0x0c, 0x8f, 0xc4, 0x00, 0xfe, 0x84, 0xf6, - 0xf4, 0xa2, 0xaf, 0x48, 0x5f, 0x2e, 0xab, 0x04, 0x6e, 0xc2, 0x48, 0x6d, - 0xda, 0x8d, 0xe9, 0xbb, 0xa8, 0x4f, 0x0d, 0x24, 0x44, 0x89, 0xb7, 0xf6, - 0x72, 0x62, 0xcb, 0x89, 0x0f, 0x7a, 0x94, 0xe4, 0x38, 0x8a, 0x62, 0xed, - 0xd8, 0x1d, 0xed, 0xbf, 0xfb, 0xd8, 0x87, 0xd6, 0x54, 0x7d, 0x3c, 0xaa, - 0xc6, 0x5f, 0x57, 0xc2, 0x3b, 0x88, 0xbe, 0x03, 0x1e, 0x37, 0x06, 0xca, - 0x8a, 0x88, 0xdc, 0x0d, 0xa6, 0x8e, 0x70, 0x41, 0x22, 0x3e, 0x10, 0x50, - 0x0a, 0x92, 0xd8, 0x71, 0xef, 0x12, 0xe2, 0x74, 0x9b, 0xd6, 0x0b, 0x08, - 0x34, 0x56, 0xa1, 0x0e, 0x82, 0x92, 0xed, 0xa1, 0x98, 0x85, 0x33, 0x4d, - 0x2c, 0x2e, 0x7a, 0x1b, 0x1c, 0x14, 0x05, 0xe2, 0x56, 0xce, 0x8e, 0xaa, - 0xf4, 0x2a, 0x86, 0xb1, 0x41, 0x05, 0x06, 0xbf, 0x4e, 0x4d, 0xc3, 0x6e, - 0xd8, 0x3f, 0x52, 0xd9, 0x0c, 0x76, 0xfe, 0x0b, 0x9b, 0x4d, 0x12, 0x5d, - 0x90, 0x57, 0x14, 0xc6, 0xaa, 0xf4, 0xd1, 0xf5, 0x5e, 0x9d, 0xd1, 0x84, - 0x12, 0xfc, 0xb3, 0xfd, 0xaf, 0x24, 0x1d, 0x68, 0x7e, 0x83, 0xcd, 0x95, - 0x69, 0x37, 0xd9, 0x0b, 0x6d, 0xe9, 0x58, 0x76, 0xf2, 0x5a, 0x07, 0x40, - 0x05, 0x73, 0xb9, 0x04, 0xb9, 0x5c, 0x59, 0x09, 0x93, 0x59, 0xf2, 0x28, - 0x98, 0xd6, 0x7e, 0x0f, 0x25, 0x40, 0xdc, 0xbc, 0xcc, 0x23, 0x71, 0xa6, - 0x77, 0x0c, 0x54, 0xed, 0x62, 0xb7, 0x24, 0x7b, 0xda, 0x00, 0x3c, 0x48, - 0x5b, 0x22, 0x1e, 0xe7, 0x69, 0x38, 0xa4, 0x63, 0xee, 0xa2, 0x30, 0x2a, - 0xf3, 0x1e, 0x5f, 0xb9, 0x0f, 0x05, 0x27, 0x98, 0x97, 0x23, 0x31, 0x59, - 0x37, 0x9c, 0x4a, 0x4c, 0x2c, 0xad, 0xdf, 0x1f, 0x26, 0x41, 0x70, 0x0e, - 0xdf, 0x8e, 0xea, 0x13, 0x4f, 0xa1, 0x3e, 0x8a, 0x6f, 0x53, 0x8e, 0xbf, - 0xc1, 0x69, 0x1b, 0x58, 0x7d, 0xe6, 0xbe, 0x4a, 0x42, 0xc0, 0x14, 0x22, - 0x7f, 0x11, 0xe3, 0xe8, 0x1c, 0x48, 0x10, 0xd1, 0x39, 0xfd, 0xfb, 0x8c, - 0x88, 0x14, 0xfa, 0x30, 0x7c, 0x05, 0x06, 0x21, 0x21, 0x3c, 0xf8, 0xc1, - 0x8c, 0xbf, 0x70, 0x61, 0x85, 0x5c, 0xd2, 0x3b, 0x07, 0x8b, 0xd0, 0xef, - 0xd5, 0xba, 0x0f, 0x97, 0x13, 0x54, 0x05, 0x1e, 0x0f, 0x7d, 0x88, 0xd1, - 0x21, 0x83, 0x03, 0x59, 0x81, 0x86, 0x21, 0xd4, 0xbb, 0x22, 0x95, 0x7f, - 0x38, 0x7e, 0x1f, 0x2f, 0x1c, 0x9f, 0x1f, 0xaf, 0xcd, 0x68, 0xf8, 0x5a, - 0xbe, 0xae, 0xbd, 0x1b, 0x25, 0x19, 0xce, 0x06, 0x00, 0x01, 0xd1, 0x6a, - 0xf4, 0x1d, 0x28, 0x14, 0xb3, 0x6a, 0x78, 0xc5, 0xbc, 0x3b, 0x60, 0x94, - 0xaa, 0x33, 0x8b, 0x82, 0x12, 0x1a, 0x66, 0x20, 0xc9, 0xc1, 0x3c, 0x35, - 0xf9, 0xfc, 0x57, 0x82, 0x03, 0x57, 0x23, 0xbe, 0xf3, 0x73, 0x1d, 0x4c, - 0x92, 0x76, 0x99, 0xc7, 0x3c, 0x6d, 0xf9, 0xad, 0xac, 0x9c, 0x8c, 0xc1, - 0xc8, 0xad, 0x6c, 0x3d, 0x82, 0xd6, 0xbd, 0x02, 0x21, 0xa6, 0xea, 0x9e, - 0x3c, 0x4b, 0x53, 0x80, 0x08, 0xfc, 0x39, 0x04, 0x35, 0x97, 0x1c, 0x8c, - 0x3b, 0xfb, 0xb8, 0xb4, 0xdb, 0x88, 0x21, 0x11, 0xd7, 0x82, 0x2a, 0xc9, - 0x49, 0x32, 0x58, 0x95, 0xab, 0xd9, 0x13, 0x5d, 0x55, 0xe4, 0xb9, 0xe0, - 0x9e, 0x41, 0xb4, 0xf4, 0xe7, 0x86, 0x68, 0x69, 0x54, 0xda, 0x44, 0x59, - 0x32, 0x4d, 0x7d, 0xe5, 0x76, 0x23, 0x18, 0x49, 0x03, 0x1d, 0x57, 0xb9, - 0xad, 0xe9, 0x2d, 0x4c, 0xd6, 0x47, 0x0e, 0x49, 0x00, 0x2d, 0xed, 0x07, - 0xc2, 0x73, 0x59, 0x0a, 0xe0, 0x72, 0x5c, 0x4f, 0x72, 0x71, 0x72, 0x2e, - 0x9d, 0x67, 0xcc, 0xd0, 0x0a, 0xbd, 0x07, 0xe0, 0x10, 0x92, 0x67, 0x59, - 0xe8, 0x8c, 0x8b, 0xa2, 0x68, 0x69, 0xcf, 0xa3, 0x06, 0xd3, 0x28, 0xd4, - 0xe0, 0x0d, 0x08, 0x2c, 0x83, 0xea, 0x38, 0x9b, 0xdb, 0x95, 0xe0, 0xd0, - 0xa0, 0x2c, 0xed, 0xac, 0x42, 0x8a, 0xaf, 0xb2, 0x39, 0x1b, 0xc3, 0xcc, - 0x14, 0x69, 0x8b, 0x7b, 0x64, 0x9b, 0x03, 0x33, 0x9c, 0xfd, 0xe0, 0x8b, - 0x43, 0x38, 0x79, 0x7b, 0x2c, 0x21, 0x89, 0xd1, 0x4f, 0x3f, 0xdc, 0x95, - 0x99, 0x00, 0x6e, 0xf2, 0x79, 0x0a, 0x0d, 0x72, 0x76, 0x64, 0x68, 0xbb, - 0x6f, 0xeb, 0x4a, 0x8e, 0x74, 0x99, 0x14, 0x91, 0x8a, 0x0c, 0xa2, 0x93, - 0xb2, 0x42, 0xd5, 0x42, 0x21, 0x25, 0x37, 0xf2, 0x47, 0x3b, 0x5b, 0x21, - 0x3e, 0xe2, 0x0b, 0xe7, 0x67, 0x2d, 0x52, 0xba, 0xe0, 0xb3, 0x37, 0x56, - 0x80, 0x07, 0x89, 0xbb, 0xe2, 0xe0, 0xd3, 0x8a, 0xca, 0x9d, 0x27, 0x53, - 0x72, 0x2f, 0xa5, 0x4d, 0x2c, 0x41, 0x4c, 0xed, 0xbf, 0x5b, 0xc3, 0x68, - 0x05, 0x5f, 0xa7, 0xc5, 0xcc, 0x7c, 0x69, 0x3d, 0x50, 0xa5, 0x91, 0xb9, - 0xa9, 0x98, 0x6c, 0x15, 0x47, 0xe6, 0xf3, 0xf7, 0xc9, 0x7d, 0x0d, 0x83, - 0xa5, 0x5d, 0x48, 0xb4, 0x00, 0x9b, 0xaa, 0xfd, 0x48, 0x8d, 0xf9, 0x6f, - 0xd2, 0xe7, 0x28, 0x37, 0x99, 0xd6, 0xbf, 0xa4, 0xb2, 0x46, 0xbb, 0x80, - 0x46, 0x64, 0x8d, 0x13, 0xe5, 0x6b, 0x70, 0xa7, 0xd7, 0xab, 0xd0, 0xc0, - 0xdf, 0x85, 0x6c, 0xbf, 0xc9, 0x7f, 0xe1, 0x31, 0xc7, 0x47, 0xe4, 0xfd, - 0x6c, 0x21, 0x97, 0x0e, 0xc0, 0xc3, 0x64, 0x65, 0xff, 0xcb, 0x83, 0x26, - 0x10, 0x0c, 0xc7, 0x83, 0x6c, 0x1d, 0xe9, 0x48, 0xfe, 0xf4, 0x87, 0x1e, - 0xf4, 0x15, 0xae, 0x82, 0xaf, 0x9e, 0x43, 0xef, 0x01, 0x0d, 0x70, 0x8c, - 0x27, 0xa1, 0x2e, 0x57, 0x22, 0xab, 0x5b, 0x37, 0xf9, 0xf6, 0x4e, 0x79, - 0x96, 0x93, 0x42, 0x57, 0xd6, 0x3c, 0xb6, 0xa6, 0xed, 0xe1, 0x73, 0xc9, - 0xd6, 0xba, 0xe1, 0xbd, 0x53, 0xbe, 0x6d, 0xe0, 0x27, 0x92, 0xea, 0x58, - 0xcf, 0x93, 0xb9, 0x89, 0x43, 0x23, 0x66, 0xc4, 0xed, 0x33, 0x02, 0xcd, - 0x61, 0x94, 0x31, 0xcd, 0x1e, 0x7e, 0x22, 0xc8, 0xb2, 0xd2, 0x6e, 0xe6, - 0xa6, 0xb5, 0x2f, 0x8c, 0xbc, 0x5c, 0x64, 0xb2, 0x62, 0x0d, 0x56, 0x56, - 0xfc, 0x44, 0xd1, 0xcb, 0xa8, 0xf1, 0x3e, 0xa8, 0xc7, 0xf6, 0x1b, 0xb5, - 0xe2, 0xa8, 0x8c, 0x78, 0xf5, 0x54, 0x89, 0xe2, 0x1b, 0x19, 0x9e, 0x8f, - 0xb3, 0x8a, 0xda, 0x28, 0x73, 0x37, 0xdd, 0x21, 0xbb, 0x9e, 0x7c, 0x9f, - 0xcb, 0x39, 0x24, 0x2b, 0x59, 0x07, 0xed, 0x5d, 0x50, 0xc2, 0xc0, 0x24, - 0xe3, 0xbe, 0x14, 0xc6, 0x8a, 0x0a, 0xc8, 0x2d, 0x09, 0xf9, 0xba, 0xa4, - 0x68, 0x3c, 0xc3, 0x0f, 0x01, 0xce, 0x34, 0xee, 0x88, 0x40, 0xa9, 0x06, - 0xe4, 0xe9, 0xff, 0x8c, 0x17, 0xd0, 0x4f, 0xe4, 0xb9, 0xb1, 0x9d, 0x7a, - 0x24, 0x3e, 0x06, 0x17, 0x04, 0x03, 0x23, 0x63, 0x5f, 0x67, 0x4d, 0x98, - 0x7e, 0x6a, 0x3e, 0x24, 0xaa, 0xa7, 0xf6, 0xa7, 0x3e, 0xe7, 0x64, 0x30, - 0x02, 0x13, 0xea, 0x0f, 0x6b, 0x91, 0x3d, 0xe3, 0x16, 0x76, 0x5e, 0x85, - 0x2c, 0xa9, 0x98, 0xfb, 0xac, 0x2c, 0x10, 0x18, 0x20, 0xdf, 0x3d, 0xdd, - 0x3d, 0x49, 0x4a, 0x95, 0x76, 0xbf, 0x00, 0x25, 0x89, 0x9d, 0x34, 0x40, - 0x34, 0xe3, 0xed, 0xd2, 0xbe, 0x3a, 0xa3, 0xaa, 0xb1, 0x71, 0x27, 0xe9, - 0x28, 0x77, 0x3b, 0xc1, 0xee, 0xdd, 0x4c, 0x22, 0x49, 0xf9, 0x06, 0xb0, - 0xf0, 0x85, 0xf0, 0xf8, 0x40, 0x29, 0x92, 0x2a, 0x72, 0x17, 0x33, 0x9b, - 0x8d, 0xfe, 0x4c, 0xd8, 0x9c, 0x8a, 0x03, 0x0a, 0x11, 0x66, 0xe5, 0x3e, - 0x0d, 0xd3, 0x08, 0xfc, 0xd8, 0x8c, 0x4a, 0xc7, 0x6f, 0x53, 0xb9, 0xea, - 0x32, 0x69, 0x9f, 0xe8, 0x96, 0x62, 0xbb, 0x00, 0x08, 0xfc, 0x10, 0x7f, - 0x73, 0x85, 0x0a, 0x84, 0x08, 0xba, 0xca, 0xdb, 0xcb, 0xed, 0xc6, 0xa2, - 0xe1, 0xc7, 0x0d, 0x33, 0xf9, 0x84, 0x14, 0xda, 0xff, 0x81, 0x18, 0xb1, - 0xcd, 0xab, 0xc9, 0xdf, 0xed, 0x37, 0x7b, 0x55, 0x6c, 0xef, 0x0a, 0x31, - 0x4f, 0x9a, 0x79, 0x14, 0xe8, 0x79, 0xdb, 0x09, 0x34, 0xb9, 0x1b, 0x6d, - 0xc1, 0xcd, 0xa9, 0x26, 0xd0, 0x6e, 0x4c, 0xf5, 0xc1, 0xde, 0x1c, 0xbb, - 0x35, 0x46, 0x6d, 0xeb, 0xa9, 0xa0, 0x39, 0xaa, 0x00, 0xbf, 0x5d, 0x46, - 0x33, 0x54, 0x13, 0x7b, 0xe1, 0xde, 0x0d, 0x65, 0x66, 0xa3, 0x54, 0x22, - 0xe7, 0xbc, 0xc5, 0xc5, 0x15, 0x6a, 0x09, 0x45, 0x17, 0xba, 0x09, 0xf6, - 0x1c, 0x9b, 0xe2, 0x28, 0xfb, 0x5d, 0xd8, 0xec, 0x32, 0x09, 0x1b, 0x83, - 0x74, 0x9a, 0x50, 0xb8, 0x78, 0x7e, 0x9d, 0x88, 0xd6, 0x3b, 0x6d, 0x9b, - 0xb7, 0x3e, 0x68, 0x09, 0x5b, 0xbc, 0x3b, 0x65, 0x2c, 0xef, 0xb3, 0x53, - 0xc1, 0x41, 0xf9, 0xbf, 0xd2, 0x5d, 0xcd, 0x9e, 0xe3, 0x76, 0xd0, 0x8f, - 0xce, 0x60, 0x57, 0x2c, 0xbc, 0x98, 0x75, 0xc7, 0x19, 0x16, 0xcc, 0x4e, - 0xde, 0x0d, 0x4d, 0x13, 0xe4, 0x89, 0xaf, 0xec, 0x8e, 0x5c, 0xc5, 0x2c, - 0x1a, 0xfc, 0x63, 0x22, 0x4e, 0x9b, 0xb6, 0x4d, 0xab, 0x68, 0x1f, 0x70, - 0xa1, 0x2d, 0x69, 0x56, 0xe3, 0x6d, 0xeb, 0x45, 0x48, 0xe1, 0xcc, 0x8d, - 0xc1, 0xe9, 0x25, 0x54, 0xf6, 0x54, 0x90, 0xc3, 0xfd, 0x3f, 0xc7, 0xab, - 0x05, 0xa7, 0x7d, 0x7e, 0xd6, 0xe2, 0x6e, 0xc7, 0xae, 0xb1, 0x5d, 0x30, - 0x38, 0x1c, 0x20, 0x52, 0xfd, 0xa9, 0xf2, 0x1c, 0xe9, 0x0c, 0x12, 0xc6, - 0x03, 0x98, 0xfe, 0x32, 0x81, 0xf7, 0x6a, 0x26, 0xae, 0xe6, 0x22, 0xde, - 0x51, 0x22, 0xed, 0x45, 0x5a, 0x95, 0x20, 0x56, 0xf7, 0xa4, 0x1b, 0x61, - 0x7e, 0x4c, 0x55, 0xb6, 0x72, 0x77, 0x0b, 0x17, 0x82, 0x78, 0x80, 0x7b, - 0x2f, 0x77, 0x39, 0x50, 0xb9, 0x2c, 0xee, 0xed, 0x6a, 0xae, 0x24, 0xb7, - 0x3e, 0xec, 0xc3, 0x5b, 0xd5, 0xdc, 0x86, 0x05, 0x81, 0x8a, 0x9f, 0x9f, - 0x2d, 0xd8, 0x9d, 0x06, 0xf4, 0x3b, 0xc6, 0xf8, 0x1c, 0x4c, 0xdb, 0xa2, - 0x4a, 0x01, 0x35, 0xae, 0xa6, 0xd9, 0xbb, 0xa3, 0x1c, 0x3d, 0x76, 0xb0, - 0x55, 0x80, 0xb6, 0xc7, 0x33, 0x4c, 0xa3, 0x2e, 0x63, 0x92, 0x02, 0x30, - 0xc4, 0x08, 0xf5, 0x75, 0x84, 0xb7, 0x7e, 0xcc, 0xf6, 0x5c, 0xae, 0xd9, - 0x17, 0x03, 0xf1, 0xe8, 0xea, 0x8d, 0x09, 0x24, 0xdb, 0x86, 0x85, 0x84, - 0xef, 0xb6, 0x93, 0xc2, 0xe0, 0x31, 0xeb, 0x91, 0xcb, 0x88, 0xe4, 0xc5, - 0x03, 0x09, 0xe2, 0x14, 0xd8, 0x32, 0xa5, 0x70, 0x19, 0xf4, 0x5b, 0xc3, - 0x8c, 0x71, 0x49, 0xc2, 0x29, 0x38, 0x88, 0x4b, 0x7f, 0x8b, 0x48, 0xe3, - 0x4d, 0xf7, 0xa9, 0x89, 0xac, 0x0f, 0x54, 0xfa, 0xfe, 0x58, 0xd0, 0x34, - 0x28, 0xcc, 0x37, 0x8b, 0xec, 0x59, 0x97, 0xa3, 0x71, 0xe4, 0x2c, 0x6a, - 0x51, 0x6a, 0x24, 0xad, 0x7a, 0x8f, 0x14, 0x7d, 0xa5, 0xad, 0x2e, 0x39, - 0x65, 0x32, 0x4d, 0x28, 0xc3, 0x30, 0x49, 0x54, 0x38, 0x66, 0xcc, 0xb0, - 0xe1, 0x4a, 0x51, 0x1e, 0xf6, 0x20, 0x36, 0x58, 0xac, 0x73, 0x07, 0x28, - 0xe2, 0x8e, 0xc0, 0x76, 0x6e, 0xf8, 0x5a, 0x06, 0xea, 0xb7, 0xa6, 0xbc, - 0x90, 0x07, 0x59, 0x0e, 0xe5, 0x4a, 0xf1, 0x42, 0xa4, 0x9b, 0x06, 0xfd, - 0xda, 0x69, 0xee, 0x82, 0x96, 0x91, 0x35, 0x1c, 0x50, 0xcd, 0x83, 0x42, - 0x08, 0x24, 0xd2, 0x4e, 0x56, 0x56, 0x09, 0x2b, 0x24, 0xb2, 0x50, 0x62, - 0x47, 0x55, 0x5f, 0x87, 0x45, 0x32, 0x68, 0x55, 0x39, 0x4e, 0xd7, 0xae, - 0xc5, 0xad, 0xff, 0x7d, 0x97, 0x8f, 0x0d, 0x00, 0x88, 0x8a, 0xe3, 0xc6, - 0xc3, 0xf7, 0x37, 0xb9, 0xc4, 0xea, 0x2e, 0x61, 0x36, 0x04, 0x77, 0xc6, - 0x6c, 0x3c, 0x94, 0x23, 0x6c, 0xc0, 0x0b, 0xf5, 0xcb, 0xc3, 0xfb, 0x27, - 0x91, 0xd8, 0xcf, 0xc0, 0xb5, 0xfd, 0x9f, 0x10, 0x79, 0xe9, 0xc2, 0x5d, - 0x22, 0xba, 0x18, 0xa0, 0x1a, 0xb0, 0xd5, 0xbf, 0x15, 0x96, 0x73, 0x5e, - 0xe8, 0x73, 0x25, 0x3c, 0x5c, 0x32, 0x0f, 0x60, 0x72, 0x37, 0x60, 0x37, - 0x4b, 0xec, 0x41, 0xc5, 0xc1, 0x65, 0xd7, 0x6e, 0xb1, 0x49, 0x02, 0x68, - 0x12, 0x09, 0xfc, 0x57, 0x35, 0xc5, 0xb3, 0x3e, 0xe9, 0x94, 0x29, 0x03, - 0xaf, 0x8b, 0x29, 0xa3, 0x7c, 0x33, 0x51, 0xa7, 0x0f, 0xe9, 0x2d, 0x23, - 0x29, 0x30, 0x1e, 0xb5, 0x74, 0x61, 0x76, 0x65, 0x5a, 0x0f, 0xe9, 0x41, - 0xc1, 0x9d, 0xc8, 0x17, 0x19, 0x5b, 0x5b, 0xe8, 0x0d, 0x4e, 0x94, 0x2d, - 0x47, 0xa2, 0x8f, 0xe2, 0x6a, 0x38, 0xf4, 0x58, 0x06, 0xbc, 0x0a, 0x3e, - 0xda, 0xa7, 0x45, 0x95, 0xdd, 0x7e, 0xa0, 0x1d, 0xfa, 0x89, 0xa9, 0x2a, - 0x8f, 0xab, 0x76, 0x8b, 0xb1, 0x22, 0xf6, 0x15, 0x35, 0x07, 0x14, 0xf5, - 0x74, 0x6e, 0xaf, 0x1c, 0xef, 0xed, 0x2e, 0x45, 0xde, 0x6a, 0xe4, 0x70, - 0xa9, 0xad, 0x44, 0xd1, 0x3d, 0x99, 0xb5, 0xde, 0x76, 0x41, 0x39, 0x5b, - 0x18, 0xb1, 0x2a, 0xc0, 0x20, 0xfe, 0x8f, 0xf4, 0x7f, 0xf1, 0x03, 0xc6, - 0x93, 0x5e, 0x21, 0x83, 0x11, 0xce, 0x00, 0x24, 0x53, 0x88, 0x7c, 0x55, - 0x67, 0x61, 0xa5, 0x3c, 0x8d, 0xb7, 0xa3, 0x41, 0x8e, 0xb2, 0x82, 0x8a, - 0x89, 0xea, 0x6a, 0xd9, 0x12, 0xf8, 0xc0, 0xe9, 0x6f, 0xf2, 0x8c, 0xc2, - 0xe4, 0xe1, 0xf3, 0x31, 0x54, 0x9c, 0x96, 0x5e, 0x09, 0xb4, 0x02, 0x37, - 0x2b, 0x8f, 0x0a, 0xf2, 0xf8, 0xb3, 0x43, 0xdd, 0x65, 0x91, 0xc3, 0x9d, - 0xdc, 0x84, 0x9e, 0xe0, 0xc9, 0xde, 0x7e, 0xfd, 0x35, 0x8e, 0xdf, 0x9b, - 0xfb, 0x4d, 0x32, 0x5d, 0x4d, 0x2b, 0x6d, 0xfa, 0xa7, 0x59, 0xd9, 0x71, - 0x8f, 0xca, 0xc8, 0x71, 0x8a, 0x37, 0x28, 0x13, 0xc6, 0xef, 0x88, 0xe9, - 0x4a, 0x3f, 0x9b, 0x86, 0x32, 0xd8, 0x25, 0x0d, 0x8d, 0xdb, 0x1a, 0x6a, - 0x4f, 0xc2, 0x49, 0xbc, 0xe2, 0x64, 0x6d, 0x28, 0xd9, 0xdf, 0x2a, 0x70, - 0xce, 0xc3, 0x4c, 0x4a, 0x8b, 0x92, 0xcb, 0x0a, 0x87, 0xfb, 0x7f, 0x67, - 0xbf, 0xdb, 0x26, 0xcc, 0x6a, 0xe4, 0xad, 0x4b, 0x4f, 0x62, 0x6b, 0xed, - 0x94, 0x35, 0x79, 0x2b, 0x4c, 0x4d, 0x8f, 0x3f, 0x99, 0x19, 0xb9, 0x0c, - 0x8c, 0xd2, 0x6a, 0x2b, 0xe9, 0x36, 0x66, 0x53, 0x24, 0xa1, 0x2b, 0x24, - 0x8a, 0x90, 0x9e, 0x41, 0x15, 0x57, 0x49, 0x38, 0x97, 0xe5, 0x7f, 0xd9, - 0xdf, 0x8a, 0xd4, 0xf8, 0x6f, 0xac, 0x4d, 0x55, 0x4b, 0x82, 0xc1, 0xcb, - 0x9e, 0x12, 0xfc, 0xb5, 0xc8, 0x17, 0x5c, 0xac, 0xf1, 0xef, 0x8c, 0x66, - 0x32, 0x5d, 0x61, 0x73, 0x9d, 0x13, 0xf3, 0x36, 0x0c, 0xae, 0x9d, 0x68, - 0x80, 0x8c, 0xd9, 0x1a, 0x38, 0x0a, 0x40, 0x33, 0x5a, 0xb5, 0x98, 0x55, - 0xb6, 0xf2, 0x4b, 0x77, 0x8f, 0x35, 0xa4, 0xaf, 0x0a, 0xfa, 0x67, 0xde, - 0xba, 0x0d, 0xc3, 0x5a, 0x46, 0x4b, 0x31, 0xeb, 0x35, 0x29, 0xec, 0xd3, - 0x1f, 0x0a, 0xd7, 0x6b, 0x2d, 0xf4, 0xfa, 0xe8, 0x0d, 0x27, 0x0a, 0xf4, - 0x0f, 0x73, 0x69, 0x55, 0x65, 0x36, 0xdb, 0x81, 0xdc, 0x58, 0xf0, 0xe7, - 0x52, 0xb7, 0x96, 0xa2, 0x1f, 0x44, 0xd7, 0x68, 0x02, 0x84, 0xd9, 0x68, - 0xfc, 0xbd, 0x44, 0xba, 0xb7, 0xa1, 0x1e, 0x29, 0xff, 0x0a, 0xb5, 0xf5, - 0x84, 0x16, 0xa1, 0x9b, 0xff, 0xb7, 0x1c, 0xf6, 0x2f, 0xdb, 0xab, 0xaf, - 0x5e, 0x6c, 0xd5, 0x67, 0xb2, 0x80, 0x28, 0x42, 0x15, 0xae, 0x1f, 0x2c, - 0xb5, 0x3f, 0x4d, 0xa4, 0xdc, 0x24, 0x75, 0x70, 0xb4, 0x75, 0xca, 0xa5, - 0xcd, 0x81, 0x99, 0x13, 0x50, 0x48, 0xe2, 0x20, 0x5e, 0x46, 0x3b, 0x13, - 0x07, 0x01, 0x0f, 0xfa, 0x0d, 0xde, 0xc9, 0x64, 0x7b, 0x95, 0x0e, 0x61, - 0x4c, 0x73, 0xb5, 0x84, 0x90, 0xa7, 0xc2, 0xee, 0x35, 0x72, 0x2c, 0x6c, - 0xcd, 0x54, 0x6d, 0x69, 0x74, 0x31, 0x81, 0x33, 0x36, 0xb1, 0x6c, 0xe8, - 0x54, 0xf9, 0xb1, 0xce, 0xa7, 0x7f, 0x20, 0x8c, 0xe0, 0xfe, 0x29, 0x4c, - 0x7f, 0x1d, 0xfb, 0x74, 0x7b, 0xfb, 0xa5, 0xb1, 0xbf, 0x49, 0x64, 0x07, - 0xa0, 0xc7, 0x20, 0x46, 0xc2, 0xc2, 0xd8, 0xa4, 0x5a, 0x61, 0x9e, 0xbc, - 0xca, 0x52, 0x3a, 0xbd, 0x72, 0x67, 0x61, 0xe1, 0xee, 0x4d, 0xbb, 0xd3, - 0x95, 0xb9, 0x63, 0x28, 0x5c, 0x66, 0xdb, 0xdb, 0x78, 0xbc, 0xa1, 0x25, - 0x7f, 0x14, 0xa9, 0x85, 0xc8, 0xbc, 0x2c, 0x10, 0x57, 0x8c, 0x88, 0xb4, - 0xaf, 0x0e, 0xf3, 0x95, 0xb2, 0x8e, 0xfb, 0x03, 0x73, 0xb7, 0x87, 0x74, - 0x21, 0x1e, 0xd4, 0xcc, 0x54, 0x0f, 0xd9, 0xf4, 0xee, 0x9c, 0xd0, 0x2e, - 0x13, 0xce, 0x7e, 0xc5, 0x69, 0x0b, 0x9f, 0xba, 0x59, 0x62, 0x66, 0xb8, - 0x66, 0xdf, 0x08, 0x14, 0xa3, 0x33, 0xf2, 0xea, 0x2c, 0x20, 0x19, 0x0d, - 0xed, 0xcc, 0xfd, 0x89, 0x23, 0xc7, 0xb9, 0xf2, 0xa0, 0x3e, 0x09, 0x08, - 0x58, 0xd2, 0x5c, 0x77, 0xaf, 0xeb, 0x49, 0x8e, 0x8e, 0x2c, 0x06, 0x7b, - 0xe9, 0xc2, 0x71, 0xf2, 0xc2, 0xcf, 0x8b, 0x2a, 0x65, 0xf9, 0xee, 0x4d, - 0x1b, 0xff, 0x4a, 0xc5, 0x14, 0xbb, 0x8e, 0xc5, 0x25, 0x27, 0xee, 0x4b, - 0x91, 0x4d, 0x25, 0xde, 0x6a, 0xeb, 0xee, 0x19, 0xc5, 0xd7, 0x0f, 0xf7, - 0x52, 0x0d, 0x9d, 0x3d, 0x7e, 0xc2, 0xa2, 0x41, 0x92, 0x56, 0xdd, 0xdf, - 0x08, 0x72, 0x3e, 0x9a, 0x88, 0x15, 0x38, 0x69, 0x84, 0x0e, 0xcc, 0x1d, - 0x1e, 0x62, 0x4f, 0x8c, 0xe2, 0x63, 0x29, 0x41, 0xbf, 0x5e, 0xee, 0x3b, - 0xba, 0x78, 0x5e, 0xf2, 0xf3, 0x9a, 0x0f, 0x93, 0x7b, 0xb0, 0x94, 0x9c, - 0x8e, 0xf6, 0x51, 0x1f, 0x1a, 0xa1, 0x97, 0x22, 0x2e, 0x3d, 0x51, 0x22, - 0x86, 0x27, 0x81, 0x3c, 0xea, 0x66, 0x8b, 0xd0, 0xd7, 0x45, 0x2f, 0x4e, - 0x38, 0x4d, 0x0c, 0xbe, 0xd8, 0xcf, 0x30, 0xf9, 0xe4, 0x7c, 0x69, 0x0f, - 0xf8, 0xd1, 0x9f, 0x89, 0x08, 0x7e, 0x48, 0x16, 0x1d, 0x07, 0x3d, 0x6d, - 0x03, 0xe1, 0x0d, 0xea, 0x54, 0xbc, 0x94, 0x1b, 0x6d, 0xa9, 0x08, 0xa1, - 0xf0, 0x84, 0x1b, 0xc1, 0xc2, 0x70, 0x36, 0x21, 0xc7, 0x3b, 0x47, 0x4f, - 0x4f, 0x20, 0xe9, 0xb5, 0x0d, 0x6a, 0xd6, 0x08, 0xee, 0xf3, 0xcf, 0xfa, - 0x1b, 0xd2, 0xd0, 0xf9, 0x36, 0xae, 0x21, 0x3c, 0x1c, 0x85, 0xbc, 0x0a, - 0xe7, 0x74, 0xf8, 0x14, 0x53, 0x34, 0x17, 0x0f, 0x8e, 0x08, 0x74, 0x52, - 0xd1, 0x09, 0xad, 0x68, 0x6c, 0xc7, 0x97, 0x8c, 0xce, 0x9e, 0x76, 0x1d, - 0x11, 0x69, 0xe7, 0x46, 0xf1, 0x29, 0x61, 0x7f, 0x5c, 0x28, 0x6c, 0x7d, - 0x81, 0x99, 0x1b, 0xa3, 0x79, 0x00, 0x6b, 0xf9, 0xbe, 0x48, 0xe2, 0x0e, - 0x19, 0x70, 0x1a, 0x9a, 0xd9, 0x4d, 0x4c, 0xb3, 0xff, 0x53, 0xe4, 0xc4, - 0xc6, 0x78, 0x3d, 0xc2, 0x2c, 0xc9, 0xbe, 0xa7, 0x40, 0xa4, 0x30, 0x70, - 0x20, 0x53, 0xc9, 0xa1, 0x20, 0x9f, 0x96, 0x92, 0x1d, 0xe5, 0x07, 0x59, - 0xf0, 0x8e, 0x8a, 0xc3, 0xd9, 0x70, 0xc2, 0x83, 0x18, 0x73, 0x61, 0x20, - 0x73, 0xf0, 0x91, 0x2c, 0xc4, 0x06, 0xb8, 0x5d, 0x12, 0x1a, 0x67, 0x4d, - 0x37, 0x36, 0x3a, 0x61, 0x19, 0xb0, 0x15, 0x17, 0x4c, 0x49, 0x06, 0x24, - 0x41, 0x4c, 0xba, 0x96, 0x14, 0x1e, 0x4f, 0xca, 0x6d, 0x87, 0x55, 0x2d, - 0x81, 0xd6, 0x0c, 0x0d, 0x27, 0xf4, 0x1f, 0x22, 0x99, 0x82, 0xf0, 0xd6, - 0xcc, 0xa7, 0x00, 0x3c, 0xc5, 0xc6, 0x7c, 0x4d, 0x44, 0xcd, 0x90, 0x97, - 0x70, 0x04, 0x4a, 0xcd, 0x0b, 0xef, 0x90, 0x0d, 0x30, 0xec, 0xf7, 0x20, - 0x36, 0x18, 0x9f, 0x46, 0xd4, 0x96, 0xa5, 0x52, 0x99, 0x41, 0xac, 0xbc, - 0xb1, 0xf2, 0x74, 0xff, 0x66, 0xae, 0x7f, 0x8e, 0x22, 0xa5, 0x13, 0xde, - 0x22, 0x6f, 0x45, 0xa2, 0x4f, 0x81, 0x93, 0x6e, 0x60, 0xe1, 0xd6, 0xf9, - 0xdc, 0x67, 0x2c, 0x5a, 0x04, 0xed, 0x98, 0xaa, 0x1e, 0x4a, 0x4a, 0xed, - 0xd3, 0x82, 0x53, 0x75, 0x10, 0x3c, 0x42, 0x84, 0xd1, 0x34, 0x60, 0x50, - 0x76, 0x24, 0xeb, 0x11, 0x2f, 0x0a, 0x75, 0x10, 0x8e, 0xdb, 0x17, 0xe7, - 0xc3, 0xb5, 0x89, 0xcf, 0xbe, 0x7c, 0x6f, 0xe9, 0x69, 0xf6, 0xd8, 0x39, - 0x72, 0x6b, 0x58, 0xc7, 0x30, 0x31, 0x99, 0xe9, 0xd5, 0x7c, 0xac, 0x00, - 0xcf, 0x19, 0xbf, 0xa9, 0xc4, 0xfa, 0x05, 0xb6, 0xd7, 0xcc, 0xf7, 0x75, - 0x7d, 0x7e, 0x91, 0x6d, 0x25, 0xc4, 0x17, 0xa2, 0x13, 0xd3, 0xba, 0x9f, - 0x3c, 0xc3, 0xbe, 0xd0, 0xdf, 0x45, 0xb3, 0xf2, 0xe8, 0x9c, 0x1f, 0xb9, - 0x76, 0xcf, 0x06, 0x0b, 0x65, 0x26, 0xbc, 0xae, 0x87, 0x1d, 0xd0, 0x4e, - 0x2a, 0xdd, 0x78, 0xce, 0x48, 0xb8, 0x21, 0x60, 0xe7, 0x14, 0xa7, 0x36, - 0xe2, 0x76, 0x82, 0xdf, 0xac, 0x55, 0x31, 0x27, 0xea, 0xc3, 0x83, 0x3b, - 0x7d, 0x73, 0xfb, 0x30, 0xdf, 0xce, 0x7b, 0x48, 0xf4, 0xd7, 0x2e, 0xb1, - 0xde, 0xc9, 0x1a, 0xee, 0x5d, 0x7c, 0xf9, 0x94, 0x22, 0x61, 0xfd, 0xd7, - 0xd9, 0x07, 0x1d, 0xa9, 0xa2, 0x98, 0xea, 0x76, 0x41, 0xf8, 0x72, 0x77, - 0xf3, 0xce, 0x86, 0x4b, 0x4e, 0x17, 0x43, 0x35, 0x86, 0xc1, 0x58, 0x26, - 0x25, 0x90, 0xee, 0x90, 0xe6, 0x5b, 0x98, 0xb1, 0xa9, 0x33, 0x91, 0x79, - 0x41, 0x6a, 0x22, 0x04, 0xb3, 0x31, 0x0a, 0xcb, 0x00, 0xc0, 0xe5, 0xbc, - 0x31, 0x12, 0x3d, 0x91, 0x91, 0x1c, 0xe5, 0x69, 0x3c, 0x5d, 0x62, 0xce, - 0x39, 0xbc, 0xbf, 0x99, 0x9f, 0x85, 0x87, 0xce, 0x3a, 0x95, 0xa7, 0xfe, - 0xd3, 0xd6, 0x03, 0xfe, 0x69, 0x8b, 0xba, 0x0e, 0x35, 0xba, 0xf3, 0xcb, - 0x0b, 0xf9, 0x7c, 0x09, 0xca, 0xfe, 0xcf, 0xc0, 0x60, 0xec, 0xd7, 0xfe, - 0x5e, 0x7f, 0x7d, 0x1d, 0xbb, 0x85, 0x13, 0xd2, 0x21, 0xec, 0x8d, 0x9b, - 0x7e, 0xe9, 0xc8, 0x37, 0xed, 0xf0, 0x9d, 0x03, 0xfa, 0x09, 0x4b, 0x20, - 0xfa, 0xc1, 0xc9, 0x9c, 0x93, 0x25, 0x50, 0x86, 0x9a, 0x3a, 0x69, 0x97, - 0xa4, 0x61, 0x63, 0x18, 0xf7, 0x27, 0x89, 0x49, 0xbd, 0x88, 0x8a, 0x24, - 0x65, 0xbe, 0x96, 0x00, 0x89, 0xe4, 0x18, 0xe5, 0xcd, 0xab, 0x75, 0x9e, - 0xc7, 0xbe, 0x0e, 0x5b, 0xfa, 0xdd, 0x60, 0x40, 0x06, 0xb6, 0x9e, 0x29, - 0x5f, 0xe8, 0x63, 0x83, 0x90, 0xba, 0xfc, 0xd5, 0xb4, 0x3d, 0xe7, 0xe0, - 0x47, 0x48, 0x4f, 0x49, 0x73, 0x62, 0x7e, 0x56, 0xe1, 0x4e, 0x9d, 0xbd, - 0x61, 0xc0, 0x23, 0xf9, 0xe3, 0x55, 0xfc, 0x2c, 0x19, 0x4a, 0x71, 0xc6, - 0x9c, 0xfe, 0x89, 0xf1, 0xb3, 0x25, 0x89, 0xcf, 0x6f, 0xd6, 0x92, 0xa4, - 0x5d, 0x0a, 0x22, 0x5b, 0x34, 0xa9, 0xa6, 0x35, 0x6c, 0x3f, 0x3f, 0xe4, - 0x52, 0x87, 0x6c, 0x35, 0xe9, 0x68, 0xad, 0x2d, 0x1e, 0x84, 0xd4, 0x4d, - 0x24, 0x8c, 0x67, 0x9b, 0x34, 0x2a, 0xc8, 0x47, 0x3d, 0xd9, 0x84, 0xca, - 0xf7, 0xf0, 0xb9, 0x28, 0x83, 0x34, 0xdf, 0x81, 0xc1, 0x28, 0xb2, 0xcc, - 0x26, 0x31, 0x52, 0x98, 0xf7, 0xe7, 0xe9, 0x31, 0x9a, 0x20, 0x5d, 0x08, - 0x61, 0x89, 0x69, 0x5c, 0x12, 0x2d, 0x3f, 0xf9, 0xe0, 0xf8, 0x47, 0x1f, - 0x91, 0x87, 0x61, 0xe1, 0x15, 0xae, 0xf1, 0xf0, 0xa9, 0x67, 0xed, 0xba, - 0x8a, 0xd3, 0x00, 0x8d, 0xde, 0xf1, 0xf9, 0x5d, 0xd9, 0x93, 0xa3, 0x32, - 0x3d, 0xe2, 0x83, 0x56, 0xec, 0x9c, 0x5e, 0xe1, 0xb2, 0xc9, 0xaf, 0x25, - 0xcb, 0x28, 0x7f, 0x05, 0x98, 0x8d, 0x7e, 0x77, 0xf9, 0x73, 0x7a, 0x51, - 0x06, 0x86, 0x40, 0xb8, 0x97, 0x2a, 0x61, 0x2a, 0x7b, 0x61, 0x8c, 0x5f, - 0x8f, 0x4a, 0x15, 0x49, 0xa3, 0x5d, 0xf0, 0x56, 0x3f, 0xb9, 0x10, 0xd3, - 0x28, 0x2b, 0xde, 0x40, 0x76, 0x41, 0x09, 0x64, 0xba, 0x5f, 0x30, 0x12, - 0x61, 0x20, 0xfc, 0x86, 0x20, 0x71, 0xf2, 0x5e, 0xfa, 0xa9, 0xc8, 0x59, - 0xe4, 0xf0, 0x17, 0xec, 0xaf, 0xb0, 0xce, 0x53, 0xf5, 0xc6, 0x6d, 0x67, - 0x32, 0x84, 0x17, 0x56, 0x31, 0xdd, 0x32, 0x51, 0xa9, 0xe6, 0xa8, 0x20, - 0x26, 0x82, 0x01, 0x40, 0xcf, 0x98, 0xcf, 0xc9, 0x1e, 0x17, 0x2b, 0x67, - 0x41, 0x0c, 0xe3, 0xb8, 0xbb, 0xda, 0xce, 0x82, 0x5f, 0xf6, 0x18, 0xe0, - 0x8f, 0x7d, 0xd3, 0x4b, 0x01, 0x0a, 0x03, 0xe7, 0x45, 0xcb, 0x22, 0xd4, - 0xef, 0x82, 0xba, 0x87, 0x77, 0xfd, 0xcf, 0xd8, 0x2c, 0xba, 0x4f, 0x9f, - 0x40, 0x11, 0x1a, 0x1d, 0x06, 0x0e, 0x0e, 0xd1, 0x9c, 0xa6, 0x49, 0x09, - 0xe9, 0x77, 0x81, 0x9a, 0x3d, 0xe2, 0x5b, 0xd1, 0xf8, 0xf6, 0xb2, 0x97, - 0x2b, 0xd4, 0x77, 0xf2, 0x31, 0x94, 0xed, 0x8a, 0x4e, 0x93, 0x5c, 0xa0, - 0x32, 0xe1, 0x9b, 0x21, 0x9b, 0x36, 0xbb, 0xbf, 0x25, 0x31, 0x67, 0x91, - 0x86, 0xd8, 0x32, 0xa8, 0x78, 0x56, 0x89, 0x16, 0x7b, 0xbd, 0xd0, 0x72, - 0x1c, 0xae, 0xd5, 0xcf, 0x76, 0x4c, 0x2b, 0x1d, 0xe6, 0x76, 0xfb, 0x6b, - 0x49, 0xb0, 0xbc, 0x21, 0xc0, 0x3e, 0x20, 0x0c, 0x66, 0xaa, 0x7e, 0x03, - 0x42, 0xd6, 0x43, 0x04, 0x2a, 0x86, 0xd8, 0x48, 0xb4, 0xdc, 0xf8, 0x11, - 0xaf, 0x6c, 0x73, 0x63, 0xe8, 0x15, 0x8e, 0xb5, 0xb6, 0x35, 0x6b, 0xc4, - 0x11, 0xae, 0x1c, 0x14, 0x4f, 0xa8, 0xf5, 0x95, 0x8c, 0x5e, 0x1c, 0x4f, - 0xe2, 0xfd, 0xfc, 0x2b, 0xf3, 0x78, 0xe5, 0xc7, 0x5a, 0xb4, 0x6a, 0xff, - 0xf5, 0xa6, 0xa0, 0x20, 0xa5, 0xa3, 0x41, 0xb8, 0x5f, 0x06, 0x1f, 0xb1, - 0x06, 0x3e, 0xbe, 0x04, 0x44, 0xe9, 0xd8, 0x2e, 0x97, 0x74, 0xbc, 0xe4, - 0x50, 0x63, 0xce, 0x36, 0x93, 0xdd, 0x1c, 0x28, 0xba, 0x83, 0x65, 0xb8, - 0x0b, 0x9e, 0x1f, 0xd9, 0x1c, 0x62, 0x2f, 0x88, 0x92, 0xb4, 0xcf, 0x05, - 0x33, 0x57, 0x85, 0xdc, 0x82, 0xf1, 0xd7, 0x22, 0xfb, 0xa6, 0x32, 0x46, - 0x7e, 0xfe, 0xc7, 0xd1, 0x75, 0x25, 0x4a, 0x5c, 0x6d, 0x5a, 0xcd, 0x4e, - 0xd8, 0xe5, 0x9e, 0x5c, 0xe5, 0xec, 0x52, 0x8e, 0xab, 0x68, 0xd8, 0x4c, - 0x5a, 0x93, 0xd4, 0x55, 0x47, 0xdb, 0xde, 0x1c, 0xe7, 0xa6, 0x98, 0x55, - 0xd7, 0x7b, 0x28, 0x31, 0xab, 0xfb, 0x2c, 0xf2, 0xc0, 0x7b, 0x1f, 0xd3, - 0x10, 0xd5, 0x40, 0xb6, 0xe2, 0xd8, 0x09, 0xeb, 0x6e, 0xa4, 0x14, 0x99, - 0xd8, 0x03, 0xc9, 0x3d, 0x4e, 0x00, 0x63, 0x74, 0x9e, 0xdc, 0x67, 0x26, - 0x59, 0xeb, 0xfb, 0x23, 0xeb, 0x45, 0xe5, 0x93, 0x57, 0x9f, 0xa8, 0x0d, - 0xb5, 0x69, 0x99, 0xb8, 0xb0, 0x73, 0x31, 0xd1, 0xdc, 0xcd, 0x1c, 0x8f, - 0x06, 0x9e, 0x69, 0xbe, 0xe7, 0xe6, 0x93, 0x6f, 0x4e, 0x24, 0xdb, 0x72, - 0x5f, 0x9b, 0x5c, 0xd6, 0xf7, 0x49, 0xf9, 0xa1, 0xf1, 0x1c, 0xb2, 0x82, - 0x0e, 0xe8, 0xfc, 0x6f, 0xfd, 0x4b, 0xd9, 0xf1, 0xdb, 0xc5, 0x80, 0x3e, - 0x6c, 0x89, 0xab, 0x6b, 0x8f, 0x87, 0xf1, 0xee, 0xbb, 0xc5, 0x8c, 0x2b, - 0x59, 0xe5, 0x4d, 0x81, 0x94, 0x39, 0x52, 0x3a, 0x56, 0x96, 0x49, 0x5b, - 0xc9, 0xec, 0x2c, 0x05, 0xcd, 0x99, 0x55, 0xe4, 0x2c, 0x38, 0x27, 0xe3, - 0x92, 0x54, 0xff, 0x92, 0xef, 0x1e, 0x56, 0x30, 0x23, 0x38, 0x36, 0x12, - 0x9d, 0x5f, 0xb4, 0x8b, 0x2a, 0xbb, 0xb1, 0x9b, 0xe4, 0xcf, 0x37, 0xda, - 0x63, 0x56, 0xb6, 0x86, 0xfb, 0x97, 0x0a, 0x3a, 0x8a, 0xab, 0xff, 0xd8, - 0x88, 0x81, 0x64, 0x12, 0xe7, 0x45, 0x62, 0x05, 0x37, 0x5b, 0xb5, 0x91, - 0x62, 0x24, 0xaf, 0xf0, 0xf3, 0x8e, 0x89, 0xb0, 0x6a, 0xc3, 0x5e, 0x92, - 0x64, 0xcd, 0xcc, 0x57, 0x33, 0xd2, 0x15, 0x3d, 0x2a, 0xb6, 0xf8, 0x8d, - 0xf9, 0xf8, 0x93, 0x17, 0x9c, 0x90, 0xcc, 0xba, 0x51, 0x09, 0xfc, 0x75, - 0xae, 0xee, 0xf0, 0xfc, 0xee, 0x1e, 0x83, 0xf6, 0xe7, 0x7c, 0x63, 0x0b, - 0xd3, 0x4c, 0x93, 0xb1, 0x07, 0x98, 0xb5, 0x61, 0xcd, 0x21, 0xf6, 0x99, - 0x9a, 0x51, 0x53, 0x10, 0xb2, 0x78, 0xaf, 0xc0, 0xaa, 0xe7, 0x2a, 0xd0, - 0xa4, 0x9a, 0xb0, 0x2f, 0x42, 0x7d, 0x8a, 0x49, 0x64, 0xab, 0xb9, 0x61, - 0x82, 0x4f, 0x56, 0x78, 0x09, 0xd4, 0xa5, 0x75, 0x84, 0x77, 0x56, 0x07, - 0xc1, 0xf2, 0x97, 0xb1, 0x16, 0xa4, 0x5a, 0x8c, 0x39, 0xef, 0xc2, 0x5c, - 0xad, 0xa4, 0x26, 0xf1, 0x8f, 0xcc, 0xa6, 0x69, 0x43, 0xc3, 0xcf, 0x69, - 0x2b, 0xe3, 0x41, 0x3d, 0x2a, 0xa6, 0x21, 0x5c, 0xb1, 0x05, 0x02, 0x7c, - 0xa6, 0x67, 0x28, 0x75, 0x65, 0x27, 0x56, 0x67, 0x31, 0x7d, 0x57, 0x86, - 0xa6, 0x4c, 0xac, 0x06, 0xe4, 0x2e, 0xd2, 0xb0, 0x6f, 0xe9, 0x51, 0xa5, - 0x76, 0xb6, 0x85, 0xf4, 0xbf, 0x9f, 0x37, 0xf1, 0x08, 0x00, 0x35, 0xda, - 0x61, 0x92, 0x30, 0x08, 0x79, 0x29, 0x10, 0xe2, 0x64, 0x70, 0x63, 0x7f, - 0xb6, 0xa1, 0xe3, 0x1b, 0xb6, 0x4a, 0x18, 0xdf, 0x0e, 0xf0, 0xce, 0x64, - 0x79, 0xb3, 0x58, 0x37, 0x94, 0x9f, 0x62, 0x83, 0x15, 0x1a, 0x6b, 0x45, - 0x02, 0x9b, 0x6b, 0x65, 0x08, 0xb2, 0xe8, 0xa1, 0x6c, 0xd2, 0x4c, 0x52, - 0x93, 0x68, 0x57, 0x00, 0x00, 0xbc, 0xad, 0x3b, 0x48, 0x16, 0xc5, 0xda, - 0x9c, 0xfd, 0x30, 0x43, 0xe8, 0x54, 0x38, 0x65, 0x19, 0xb8, 0x59, 0x60, - 0xa8, 0x45, 0x7d, 0x85, 0x29, 0xd3, 0xed, 0xad, 0x94, 0x08, 0xa2, 0x39, - 0x48, 0xe1, 0x63, 0xa5, 0xf6, 0x1b, 0x56, 0x19, 0xf9, 0x46, 0xb9, 0xab, - 0x20, 0x56, 0xdc, 0x03, 0xf3, 0xcb, 0x96, 0xac, 0x9e, 0xdd, 0x63, 0x7e, - 0xd1, 0x4c, 0x55, 0x08, 0x38, 0x77, 0xcf, 0xf2, 0x30, 0x9b, 0x9c, 0xfe, - 0x7d, 0xc0, 0xa2, 0x81, 0xf2, 0xaf, 0x1a, 0xf4, 0xaa, 0xcd, 0x6d, 0x48, - 0x23, 0x9a, 0xb1, 0x43, 0x03, 0xc8, 0x60, 0x90, 0xff, 0x98, 0x0c, 0x80, - 0x1e, 0xbd, 0xb4, 0x89, 0x35, 0xf2, 0x18, 0xea, 0xff, 0xa0, 0x0d, 0xdd, - 0xad, 0xe7, 0x4a, 0x3a, 0xd8, 0x33, 0x97, 0x47, 0x9a, 0xfd, 0xbf, 0xd4, - 0xe7, 0x08, 0x2b, 0x06, 0x5d, 0xdc, 0x83, 0x3a, 0xaf, 0x91, 0xb2, 0x0e, - 0xac, 0x32, 0x18, 0x48, 0x0c, 0x2e, 0x33, 0x1d, 0xc7, 0x99, 0x79, 0x3d, - 0x53, 0x53, 0xad, 0xaf, 0x73, 0xe5, 0x62, 0x0a, 0xd5, 0xf2, 0x54, 0x29, - 0x99, 0x3f, 0x28, 0x4b, 0x68, 0x77, 0x42, 0x72, 0x25, 0x9a, 0x1b, 0xa2, - 0xfb, 0xf8, 0x1b, 0xbd, 0x44, 0x27, 0x6e, 0xb1, 0x54, 0x03, 0x04, 0xc3, - 0x66, 0x2f, 0xc8, 0x7d, 0xe6, 0x5e, 0xb5, 0xb4, 0xeb, 0x5f, 0x9c, 0xa5, - 0x09, 0xc4, 0x97, 0x93, 0x6a, 0xb5, 0xfe, 0x07, 0x0d, 0xb0, 0x89, 0xa3, - 0xfb, 0x6c, 0xe2, 0x20, 0x22, 0x48, 0x53, 0xdb, 0x60, 0x31, 0x73, 0x65, - 0xf4, 0x30, 0x1a, 0xd9, 0x88, 0xc0, 0x2f, 0x53, 0xc1, 0xde, 0x28, 0x5d, - 0x2c, 0x97, 0xc0, 0x11, 0x96, 0x46, 0x3e, 0xa0, 0xdb, 0xf1, 0x83, 0xc2, - 0xc2, 0xc7, 0x8f, 0x18, 0x1f, 0x66, 0x74, 0xe4, 0xfa, 0x5e, 0x34, 0xe3, - 0x01, 0xd9, 0xa8, 0x63, 0xd6, 0x43, 0x58, 0x94, 0x3d, 0x9d, 0x21, 0x56, - 0xc1, 0x28, 0xc2, 0x5a, 0xe0, 0x49, 0xf3, 0x21, 0x44, 0x12, 0xc1, 0x42, - 0xc9, 0x50, 0x17, 0xec, 0xb8, 0x15, 0xaa, 0xf9, 0x5d, 0x6f, 0x9b, 0x5b, - 0xe8, 0xb3, 0x9b, 0xf7, 0x80, 0xa4, 0x95, 0x2e, 0x2b, 0xab, 0x0d, 0xab, - 0x0c, 0xa0, 0x5f, 0x69, 0x20, 0x93, 0x85, 0x97, 0xaf, 0x96, 0xd3, 0x72, - 0x72, 0xfa, 0xa7, 0x39, 0x08, 0xd0, 0x56, 0x5e, 0xbf, 0xae, 0x4c, 0xc7, - 0x5c, 0x95, 0xe4, 0xc2, 0x6c, 0x45, 0x55, 0x66, 0xad, 0x3c, 0x91, 0xc2, - 0x9f, 0x07, 0x6f, 0x4c, 0x04, 0xf5, 0x15, 0x3e, 0x33, 0x35, 0x35, 0x58, - 0x89, 0xdd, 0x34, 0x4d, 0x4b, 0x51, 0x15, 0xa5, 0x42, 0x59, 0xea, 0xc5, - 0x9f, 0x63, 0xd1, 0x41, 0x30, 0x5b, 0xe4, 0x30, 0xcd, 0x14, 0x8c, 0xef, - 0x97, 0xa1, 0xdf, 0xc5, 0xc2, 0x02, 0x4e, 0xa7, 0x43, 0xf5, 0xc4, 0xd5, - 0x9a, 0xad, 0x34, 0x15, 0x70, 0x0d, 0xd7, 0xbe, 0xb2, 0x6c, 0x53, 0xac, - 0x61, 0xbd, 0x50, 0xcb, 0x06, 0xe1, 0xae, 0x20, 0xd4, 0x99, 0x30, 0xfa, - 0xe1, 0xfe, 0xb2, 0x5b, 0x9d, 0x62, 0xb6, 0xff, 0x76, 0x2d, 0x94, 0x11, - 0x68, 0x45, 0x42, 0x8b, 0xc6, 0xc7, 0x2c, 0xc9, 0x75, 0xee, 0x43, 0xcc, - 0xbb, 0x2c, 0xaf, 0x8c, 0xe7, 0x55, 0x13, 0xd9, 0x79, 0x18, 0xea, 0xe3, - 0xc3, 0x1b, 0x10, 0x44, 0x20, 0x07, 0xc8, 0x9a, 0xa1, 0x57, 0x30, 0x65, - 0x9f, 0x7f, 0x12, 0x6c, 0x78, 0x6c, 0x3e, 0x8f, 0xe4, 0xc4, 0x40, 0x89, - 0x17, 0x77, 0x8c, 0x8f, 0x92, 0x33, 0x22, 0x18, 0x57, 0x21, 0xd6, 0x5f, - 0xb2, 0x1f, 0x9d, 0x92, 0xe8, 0xdf, 0xfc, 0x89, 0xc8, 0x8b, 0x61, 0xcb, - 0x77, 0xa4, 0x60, 0xca, 0xa6, 0x41, 0xaa, 0x0b, 0x6f, 0x60, 0x62, 0x9c, - 0x61, 0x81, 0x11, 0x24, 0x50, 0xa0, 0x8a, 0xa4, 0x1c, 0x15, 0xea, 0x73, - 0x71, 0xf0, 0x01, 0xa7, 0x9c, 0xcb, 0x1c, 0x83, 0x93, 0xf2, 0xca, 0xab, - 0xa1, 0xb9, 0xf4, 0x58, 0xd4, 0x52, 0x56, 0xca, 0xaa, 0x43, 0xf3, 0x64, - 0x7a, 0x33, 0x2b, 0xb6, 0xd5, 0x80, 0x14, 0x13, 0x96, 0x37, 0x0e, 0x2f, - 0x73, 0x33, 0x86, 0xd3, 0x44, 0xa2, 0x48, 0x4e, 0x6d, 0x2b, 0x03, 0xc5, - 0x55, 0xf3, 0x13, 0x7b, 0x73, 0x18, 0x1b, 0x2e, 0x91, 0x44, 0x21, 0xbf, - 0xe8, 0x82, 0x94, 0x18, 0xea, 0x15, 0x3c, 0x50, 0x9d, 0x0d, 0x23, 0xa3, - 0x27, 0xcb, 0x47, 0xb6, 0xeb, 0x8a, 0x53, 0xdb, 0x70, 0xa9, 0x56, 0x52, - 0xca, 0xd2, 0x85, 0x82, 0x8e, 0x52, 0x7b, 0xbc, 0x90, 0xe9, 0xdb, 0xf3, - 0xe4, 0x7e, 0xe2, 0x6f, 0xf9, 0x71, 0x01, 0x87, 0x64, 0x46, 0x1e, 0x47, - 0xb4, 0x23, 0x97, 0x84, 0x9c, 0x9b, 0x8e, 0x8d, 0x2f, 0xf5, 0xd1, 0xe1, - 0x4e, 0xd5, 0x7a, 0xef, 0xc8, 0x57, 0x2c, 0x57, 0x77, 0x3f, 0xed, 0x10, - 0x51, 0x6e, 0x77, 0xc4, 0x3f, 0x6e, 0xd0, 0x08, 0x2d, 0x32, 0x69, 0x02, - 0x36, 0x5f, 0xd6, 0xdd, 0x68, 0x93, 0x6a, 0x7d, 0x20, 0xef, 0x3c, 0x79, - 0x98, 0xa0, 0xfa, 0x0f, 0x5d, 0x76, 0x98, 0xe2, 0x6c, 0xcd, 0xa2, 0x1a, - 0x17, 0x13, 0xe5, 0x6b, 0x2f, 0xac, 0x64, 0x4a, 0x61, 0x3a, 0xf4, 0x15, - 0x16, 0xe8, 0x36, 0x75, 0xc1, 0xba, 0x08, 0x8e, 0x79, 0xff, 0xb5, 0x65, - 0x25, 0xe9, 0x67, 0xad, 0x96, 0x38, 0xc0, 0x75, 0x05, 0xc6, 0x48, 0x39, - 0x83, 0x7e, 0x69, 0x9e, 0x51, 0xd5, 0x16, 0x57, 0xc9, 0xdd, 0xf6, 0x23, - 0xc5, 0x20, 0xf3, 0xf9, 0x0f, 0x39, 0xe0, 0x40, 0xda, 0xab, 0x4e, 0x55, - 0x98, 0x5e, 0xc5, 0x6e, 0x45, 0xef, 0x17, 0x16, 0xb5, 0xa9, 0x73, 0x97, - 0xe5, 0xb8, 0xad, 0x01, 0xa3, 0xf9, 0x2f, 0xbf, 0xd2, 0x9c, 0xee, 0x37, - 0x03, 0x4e, 0xbf, 0x25, 0xa9, 0xe5, 0xf5, 0x3d, 0xa4, 0x40, 0x6f, 0x21, - 0xe5, 0xf9, 0xc8, 0x0f, 0xe9, 0x3c, 0xfa, 0xb7, 0x0d, 0x40, 0xa4, 0xe4, - 0x5b, 0x75, 0x5b, 0x74, 0xcf, 0xb5, 0x21, 0x0a, 0x11, 0xa8, 0xd2, 0x2e, - 0xdf, 0x65, 0x14, 0xc4, 0xaf, 0x33, 0xf3, 0x35, 0xa7, 0xaf, 0x72, 0xd6, - 0x11, 0x5e, 0xf1, 0xc2, 0xa9, 0x01, 0xa7, 0x24, 0xe1, 0x4c, 0x15, 0xdf, - 0x63, 0x55, 0x28, 0x9d, 0xd4, 0x0e, 0xae, 0x8c, 0xd0, 0x8d, 0x3a, 0x45, - 0x08, 0xd5, 0xcd, 0x73, 0xac, 0x90, 0x9f, 0x48, 0xc5, 0xfb, 0xc8, 0x74, - 0x66, 0x5e, 0xdf, 0x8d, 0xad, 0x6b, 0x96, 0x29, 0x07, 0x0b, 0x65, 0x4f, - 0x5d, 0xb4, 0x9c, 0xe0, 0xd6, 0xa2, 0xb3, 0x65, 0x30, 0xad, 0x39, 0x00, - 0xb4, 0x44, 0x6a, 0xc5, 0xc6, 0x7f, 0xdd, 0x3a, 0x5f, 0x8a, 0x70, 0x4d, - 0x29, 0xec, 0xc5, 0x3a, 0x88, 0x35, 0x42, 0x3c, 0x3d, 0xed, 0xc6, 0xe1, - 0x47, 0xd0, 0xfc, 0x12, 0xcb, 0x53, 0xc0, 0x0f, 0xc6, 0x5e, 0xb1, 0xdd, - 0xe8, 0xc4, 0x16, 0x48, 0xf3, 0x52, 0x39, 0xfa, 0x63, 0xc3, 0x59, 0x7b, - 0xcd, 0xc9, 0x4a, 0xb3, 0x5a, 0xdf, 0xd0, 0xa5, 0xb6, 0x6f, 0xa5, 0xab, - 0xe9, 0x4c, 0xf3, 0x3b, 0xac, 0xf0, 0x4c, 0xe2, 0xb5, 0x60, 0x55, 0x10, - 0xe3, 0x39, 0x8b, 0x4c, 0x53, 0xbe, 0x27, 0xeb, 0xcd, 0xfe, 0x55, 0x21, - 0x3e, 0x68, 0xa8, 0x12, 0x0b, 0x25, 0x5c, 0x46, 0x1f, 0x96, 0x65, 0xd7, - 0x10, 0x47, 0x1d, 0x10, 0xed, 0x1f, 0xb6, 0x89, 0x3e, 0xe5, 0x9f, 0x15, - 0xa2, 0x8c, 0xf0, 0xc4, 0xda, 0x92, 0x65, 0x78, 0x6e, 0x72, 0x4a, 0x57, - 0xe0, 0xc4, 0x0a, 0xbb, 0xa7, 0x70, 0xbc, 0x2e, 0x07, 0xae, 0x36, 0x63, - 0x95, 0x91, 0x38, 0x39, 0x2f, 0x28, 0x98, 0x4c, 0x5b, 0xb0, 0xc2, 0xb7, - 0x06, 0x60, 0x33, 0xe5, 0xd4, 0x60, 0x37, 0x3d, 0x00, 0xd4, 0xce, 0x41, - 0xca, 0x6d, 0x9a, 0x09, 0x62, 0xe7, 0xd0, 0xa2, 0xcc, 0xd5, 0xdc, 0xa1, - 0x7b, 0xa9, 0xa9, 0xd1, 0xb0, 0xa8, 0x6d, 0x57, 0xef, 0xd4, 0xab, 0x6a, - 0x0d, 0xaa, 0x76, 0xa2, 0xdb, 0xbb, 0x21, 0xbf, 0x4e, 0xbc, 0xd0, 0xb7, - 0x73, 0x52, 0x73, 0x53, 0x6e, 0xb8, 0x23, 0xf3, 0x92, 0xe6, 0xf7, 0x81, - 0x2e, 0x05, 0x2e, 0xb6, 0x3b, 0x78, 0xe0, 0x70, 0xe3, 0xe2, 0xa7, 0x6b, - 0x0e, 0x1f, 0x25, 0x23, 0xbc, 0x57, 0x0e, 0x59, 0x2e, 0xb8, 0x48, 0xce, - 0xc7, 0x37, 0xe8, 0x92, 0x1e, 0x8a, 0x2e, 0xf6, 0xd0, 0x1e, 0x47, 0xf7, - 0x94, 0x58, 0x2f, 0xe4, 0x23, 0xc0, 0x24, 0xcb, 0x8a, 0x31, 0x1f, 0x21, - 0x9b, 0xaf, 0xfc, 0x5e, 0xe1, 0x37, 0x4f, 0x21, 0xdc, 0xa8, 0x24, 0xa2, - 0x71, 0x45, 0xac, 0xee, 0x63, 0x1b, 0x99, 0x74, 0x9e, 0x27, 0xc6, 0xdc, - 0x42, 0x41, 0x42, 0xb8, 0x8b, 0xbf, 0x02, 0x41, 0x32, 0x89, 0x0c, 0x70, - 0x07, 0xbe, 0x27, 0x14, 0x0a, 0x34, 0xfe, 0x9e, 0x01, 0x83, 0x16, 0x38, - 0xa0, 0x62, 0x79, 0xf2, 0x1b, 0x0c, 0x7c, 0x5f, 0xac, 0x28, 0xed, 0x36, - 0x06, 0x45, 0x51, 0x74, 0x18, 0xe5, 0xa7, 0xe8, 0xb9, 0xe9, 0x5a, 0xe2, - 0x9e, 0xf3, 0xc1, 0x97, 0x5a, 0x78, 0xf3, 0x8f, 0x0c, 0x33, 0x10, 0x96, - 0xa8, 0x26, 0x1c, 0x77, 0xa4, 0x8d, 0xdf, 0xca, 0x91, 0x11, 0x41, 0x97, - 0xfa, 0x89, 0x8c, 0x09, 0x8e, 0x73, 0x1a, 0xd9, 0x96, 0x88, 0x54, 0xde, - 0x40, 0x77, 0x09, 0xa6, 0xac, 0x0f, 0xa5, 0xbf, 0x2d, 0x9e, 0xb6, 0x31, - 0x5c, 0x07, 0xc4, 0xfe, 0x09, 0x5f, 0x73, 0x25, 0xfd, 0xb4, 0x00, 0x68, - 0xf3, 0xc3, 0x6b, 0x36, 0x60, 0xfa, 0xaa, 0xe3, 0x35, 0xbe, 0x99, 0xba, - 0x20, 0xc7, 0xca, 0x20, 0x1d, 0x59, 0x91, 0xb3, 0xa1, 0x4b, 0x3a, 0x55, - 0x00, 0x19, 0x17, 0xb1, 0x80, 0x98, 0x31, 0xc2, 0x06, 0x24, 0x44, 0x83, - 0x1a, 0x87, 0xfa, 0xa7, 0x1a, 0x4e, 0x6c, 0xcb, 0xac, 0xf3, 0x7a, 0xe9, - 0x6b, 0x6e, 0xee, 0xb1, 0x2d, 0x6d, 0x0a, 0x91, 0xd8, 0x02, 0x8a, 0xff, - 0xac, 0x30, 0x1b, 0x92, 0x28, 0x3a, 0x47, 0xd1, 0x60, 0x79, 0x96, 0xe0, - 0x46, 0xfc, 0x7f, 0x77, 0x13, 0xbc, 0xfb, 0x7d, 0xd9, 0xef, 0xbd, 0x21, - 0xd4, 0x6a, 0x2d, 0x1e, 0x2b, 0xb9, 0x3c, 0x99, 0x74, 0x33, 0xbf, 0xe0, - 0x73, 0x23, 0x2a, 0x64, 0xf8, 0xe9, 0x7b, 0x96, 0xee, 0x6b, 0x7d, 0x3e, - 0xd1, 0x87, 0x6a, 0x28, 0xc7, 0xc5, 0xa8, 0xa0, 0x21, 0xa7, 0x8f, 0x71, - 0x1d, 0x6f, 0xa8, 0x6d, 0xbe, 0xbe, 0x6b, 0xbc, 0x73, 0xb6, 0xdb, 0xc1, - 0x1f, 0x47, 0xc8, 0x66, 0x70, 0x91, 0xe8, 0x5e, 0x34, 0x21, 0xce, 0x28, - 0x1e, 0x17, 0x28, 0xf9, 0x5a, 0xcf, 0x3d, 0xdb, 0x45, 0x58, 0x57, 0xa4, - 0x19, 0xbd, 0xf0, 0x61, 0x2c, 0xb5, 0x44, 0x5f, 0x57, 0x35, 0x75, 0x25, - 0xa7, 0xa3, 0x86, 0x97, 0x60, 0x26, 0x3f, 0xdf, 0x0f, 0x40, 0x6f, 0x82, - 0xab, 0x6e, 0xbf, 0xe3, 0x98, 0xe1, 0x5f, 0xcc, 0xfa, 0xd6, 0x68, 0xc0, - 0x40, 0x8b, 0x87, 0xa2, 0x0f, 0x39, 0x59, 0x5c, 0xcb, 0xb5, 0x2d, 0x11, - 0xfe, 0x2e, 0x23, 0xe8, 0x31, 0x19, 0x18, 0xc5, 0x78, 0xe8, 0xbe, 0x72, - 0x56, 0x9d, 0xdb, 0x09, 0xf6, 0xad, 0x4c, 0x48, 0xdc, 0x04, 0x7b, 0xdb, - 0x3e, 0x34, 0xe5, 0x3c, 0x77, 0xbe, 0x7f, 0x29, 0xb4, 0xbc, 0x95, 0xb2, - 0x89, 0xb2, 0xd3, 0x99, 0x32, 0x89, 0x4e, 0x9d, 0x80, 0x06, 0x0d, 0xf4, - 0xb4, 0xd8, 0x1b, 0x09, 0x78, 0x9b, 0xeb, 0x66, 0x82, 0x0a, 0x4e, 0x8a, - 0x20, 0x4d, 0x3d, 0x6f, 0xa4, 0xb6, 0x3a, 0xa3, 0x6d, 0x7e, 0x1a, 0x8a, - 0x1f, 0x53, 0xb3, 0xba, 0x03, 0xdb, 0x65, 0x6e, 0x40, 0xcd, 0x53, 0xb5, - 0xdb, 0xfd, 0xc4, 0x6b, 0x39, 0x71, 0xf2, 0x4d, 0x60, 0x2e, 0x52, 0xf0, - 0x0c, 0x51, 0x45, 0x2d, 0x61, 0xc1, 0x4d, 0xb7, 0xaf, 0xae, 0xfb, 0xe5, - 0xab, 0x6f, 0x09, 0xbe, 0xd8, 0x86, 0x96, 0x1b, 0x9d, 0x10, 0xcc, 0xd7, - 0x11, 0xf7, 0x95, 0xce, 0x87, 0x50, 0xb6, 0x75, 0xe2, 0xb2, 0xa4, 0x90, - 0xc4, 0x3a, 0x4f, 0xce, 0x08, 0xfe, 0x56, 0xbf, 0x35, 0x95, 0x5f, 0x4f, - 0x97, 0x6b, 0xeb, 0xc5, 0xd5, 0x64, 0x54, 0xb0, 0xd8, 0x9e, 0xa4, 0x98, - 0x07, 0xa8, 0x37, 0x28, 0x43, 0xc1, 0x2b, 0xfc, 0x62, 0x9b, 0xeb, 0x78, - 0x67, 0xd5, 0x11, 0x5f, 0x66, 0xef, 0x4d, 0x7f, 0xc8, 0xc8, 0x38, 0x79, - 0x65, 0x64, 0x38, 0x6d, 0xed, 0x3e, 0xd6, 0x15, 0x28, 0xa1, 0x18, 0x27, - 0x11, 0xff, 0x73, 0x55, 0x0b, 0xf0, 0x31, 0xa5, 0x1c, 0x16, 0x7c, 0xdc, - 0x06, 0x0b, 0x11, 0xa8, 0xa1, 0x0e, 0xe4, 0xbf, 0xc6, 0x97, 0x81, 0xcc, - 0xfe, 0x04, 0x16, 0x85, 0xf2, 0xab, 0x60, 0xa6, 0x6d, 0x83, 0x7c, 0xed, - 0x39, 0xf6, 0xb7, 0x44, 0x40, 0xb3, 0x81, 0x0c, 0x96, 0x23, 0x4f, 0x99, - 0x5b, 0xaa, 0x12, 0x1f, 0xfd, 0x94, 0x58, 0x02, 0x15, 0x1c, 0x26, 0x66, - 0x1a, 0xe9, 0x19, 0x8d, 0x1e, 0x5b, 0x24, 0x93, 0xc3, 0xd9, 0xb1, 0x09, - 0xcd, 0x79, 0x7e, 0x63, 0xb4, 0xfc, 0x6f, 0xe0, 0x3f, 0x84, 0x98, 0x42, - 0x86, 0xe2, 0xee, 0x45, 0x35, 0x50, 0x64, 0xc3, 0x60, 0x35, 0xbe, 0xe5, - 0x31, 0xe1, 0xfd, 0xa3, 0xd8, 0xb3, 0x00, 0x5c, 0x5a, 0xe7, 0x8c, 0xf2, - 0xc0, 0x65, 0x9e, 0x91, 0x1f, 0xa1, 0x12, 0x48, 0x50, 0x2c, 0x7a, 0x92, - 0x8c, 0x65, 0x41, 0xbf, 0xe3, 0x90, 0x61, 0x56, 0x88, 0x19, 0xad, 0x78, - 0xfe, 0xdf, 0xe4, 0xe8, 0xe8, 0xda, 0xa2, 0xf6, 0xb3, 0x9e, 0xdc, 0x56, - 0x0f, 0xee, 0x8c, 0x62, 0x0f, 0xc3, 0x45, 0x17, 0x4c, 0xd7, 0x5a, 0x6d, - 0xf0, 0x81, 0x94, 0x3d, 0x52, 0x78, 0x90, 0xae, 0x2b, 0xc5, 0x73, 0xa2, - 0x16, 0x9e, 0xdc, 0x7c, 0x96, 0x4a, 0x29, 0x58, 0xc0, 0x45, 0x80, 0x8b, - 0x96, 0x44, 0x6e, 0xe4, 0xd4, 0x38, 0xdf, 0x19, 0x24, 0x39, 0xb5, 0x97, - 0xa7, 0xbb, 0xee, 0x52, 0x8b, 0x13, 0xc0, 0x4f, 0x3e, 0xda, 0xbf, 0xfc, - 0x36, 0xb4, 0x99, 0x20, 0x76, 0x8a, 0x27, 0x5d, 0x31, 0x1b, 0x12, 0x5d, - 0x61, 0xc5, 0x8f, 0x00, 0x7f, 0xfe, 0x9b, 0x27, 0x5b, 0xe7, 0x76, 0xe4, - 0x4b, 0x98, 0x30, 0xf4, 0x58, 0x2d, 0xc1, 0xf5, 0xb5, 0x52, 0x94, 0x6e, - 0x84, 0x6b, 0xc0, 0x95, 0x1d, 0x2e, 0x7a, 0xa4, 0x49, 0x48, 0x72, 0x21, - 0x05, 0x99, 0xe3, 0x7f, 0x43, 0x90, 0xc6, 0x09, 0x89, 0x92, 0x1d, 0x0b, - 0x47, 0x05, 0xfc, 0xae, 0xf9, 0x93, 0x86, 0xcf, 0x40, 0x79, 0x4a, 0xe5, - 0x99, 0x2f, 0x14, 0xb4, 0x01, 0x43, 0xdc, 0x45, 0x06, 0x7c, 0x34, 0x3f, - 0xb0, 0x4f, 0x0f, 0xc8, 0xec, 0xd2, 0x16, 0xc7, 0x7d, 0x49, 0xad, 0x4f, - 0xf2, 0x79, 0xd2, 0x53, 0x3a, 0x38, 0xd9, 0xbf, 0xa9, 0x66, 0x95, 0xc3, - 0xd8, 0x25, 0x4b, 0x07, 0x18, 0x37, 0x88, 0x26, 0xa7, 0xd2, 0x34, 0xfe, - 0x8a, 0x90, 0x45, 0x90, 0xb5, 0xa7, 0x23, 0x4d, 0xd8, 0x40, 0x23, 0xb8, - 0xe1, 0x36, 0x41, 0xbf, 0x58, 0x69, 0x90, 0xfe, 0x4c, 0x45, 0xfc, 0x5a, - 0x6f, 0xce, 0x72, 0x81, 0x1d, 0x5c, 0xf8, 0x6b, 0x0d, 0xc7, 0x0c, 0xaf, - 0x61, 0x00, 0xca, 0x37, 0x5c, 0xb8, 0x97, 0x90, 0x42, 0xb0, 0xdf, 0xe2, - 0xcf, 0xe6, 0x10, 0x5a, 0x18, 0x7a, 0xbf, 0x46, 0xdb, 0x86, 0xdd, 0x7d, - 0xc7, 0x9d, 0x29, 0x0c, 0xc5, 0xb7, 0xd2, 0x2e, 0x7a, 0x3d, 0xee, 0xa5, - 0x80, 0x64, 0x0f, 0x94, 0x09, 0x6f, 0x21, 0x57, 0x57, 0x50, 0xa3, 0xfb, - 0x79, 0x22, 0xcc, 0x03, 0x19, 0x98, 0xb4, 0x1a, 0xe2, 0x07, 0x47, 0xc5, - 0x0f, 0x00, 0xf2, 0xff, 0xf7, 0x0a, 0xd2, 0x15, 0x9c, 0x6c, 0x62, 0x98, - 0x19, 0x59, 0xa9, 0xff, 0x0b, 0xa7, 0x56, 0xce, 0x10, 0x7e, 0x61, 0x04, - 0xe7, 0x08, 0xb9, 0xee, 0x4b, 0x88, 0x42, 0x82, 0x3b, 0xe6, 0x6b, 0x3e, - 0x78, 0x09, 0xb0, 0xb4, 0xec, 0xd8, 0x0c, 0x54, 0x26, 0x37, 0x8f, 0x63, - 0x89, 0x07, 0xb4, 0x6f, 0x1d, 0x6e, 0x57, 0x6a, 0x8c, 0xd3, 0x93, 0x09, - 0xdc, 0x30, 0x77, 0x54, 0x3d, 0xf7, 0x7a, 0xf2, 0x01, 0x90, 0x20, 0xe9, - 0x55, 0xe9, 0x6c, 0x17, 0xe9, 0x8d, 0xa2, 0x63, 0xd0, 0xa0, 0x18, 0x28, - 0xae, 0xc1, 0xe7, 0xfe, 0xd9, 0x42, 0x89, 0x3a, 0x15, 0x38, 0x23, 0xef, - 0xd7, 0x17, 0x83, 0x2d, 0x60, 0xb0, 0xe9, 0x88, 0x05, 0xc4, 0xdc, 0x98, - 0xf1, 0xfd, 0xc1, 0x7e, 0x11, 0xd5, 0x7b, 0xbe, 0x8b, 0x16, 0x47, 0x93, - 0x6e, 0xb7, 0xf4, 0xb1, 0xde, 0xe6, 0xfa, 0x1c, 0x60, 0xc0, 0xf7, 0xb5, - 0x41, 0xcd, 0x00, 0x46, 0x07, 0x89, 0xf3, 0x90, 0x95, 0x3a, 0x21, 0xda, - 0x2e, 0xcf, 0x66, 0xce, 0x76, 0x8a, 0x9c, 0x2c, 0xba, 0x8b, 0x03, 0x90, - 0x31, 0x29, 0xe3, 0x7d, 0xe4, 0x45, 0x39, 0x13, 0x37, 0x16, 0x65, 0xa1, - 0x9d, 0x22, 0xa3, 0x45, 0xc4, 0x23, 0x18, 0xa5, 0x0e, 0x02, 0x1e, 0x6c, - 0x7b, 0xfe, 0xb6, 0xc9, 0x0c, 0xbe, 0x79, 0x2e, 0x15, 0xca, 0xaf, 0x0c, - 0x1f, 0x77, 0xdd, 0xb1, 0x71, 0xca, 0xec, 0xf2, 0x0a, 0x61, 0x8f, 0xb5, - 0xe3, 0x0d, 0xdd, 0x91, 0x0a, 0x32, 0xe6, 0xf7, 0xca, 0xab, 0xd9, 0xe6, - 0x77, 0x44, 0x79, 0x1e, 0xf7, 0xc4, 0x53, 0xd8, 0x05, 0xd2, 0xea, 0xfc, - 0x02, 0x8e, 0x0c, 0xd3, 0x22, 0xb2, 0x65, 0xc0, 0xcd, 0x85, 0xa6, 0x3f, - 0xe8, 0x10, 0x13, 0x9c, 0xed, 0x19, 0x12, 0x05, 0x47, 0x57, 0x78, 0x5f, - 0xb5, 0x9a, 0xb6, 0xa4, 0xda, 0x7d, 0x81, 0xd9, 0x28, 0x42, 0x0f, 0xab, - 0x7d, 0x32, 0x22, 0x59, 0xcc, 0xae, 0x24, 0xae, 0x05, 0x54, 0x22, 0xf8, - 0xd9, 0x89, 0x37, 0xb3, 0x28, 0xfb, 0x8a, 0x0c, 0x14, 0x93, 0x3a, 0xba, - 0x4d, 0x77, 0xca, 0x1b, 0xf8, 0x76, 0x94, 0x81, 0x8b, 0xc0, 0xb6, 0xb4, - 0x7d, 0xe3, 0x21, 0x1e, 0x73, 0x9c, 0x22, 0x1f, 0xf0, 0xa6, 0xcc, 0x87, - 0xda, 0xd4, 0xc2, 0x3f, 0x1c, 0xef, 0xf1, 0xaf, 0x91, 0x00, 0x7e, 0x4a, - 0x5b, 0x9c, 0x75, 0x42, 0x42, 0xa9, 0xa2, 0x8f, 0xb9, 0xa1, 0x25, 0xfe, - 0xc6, 0xae, 0x26, 0xb8, 0x4d, 0xb5, 0x93, 0xde, 0x32, 0x84, 0xa0, 0xef, - 0x1c, 0xd6, 0x94, 0x32, 0x6d, 0xa1, 0x73, 0x51, 0xee, 0x06, 0x81, 0x70, - 0x7c, 0x3c, 0x77, 0xf6, 0x3a, 0xb2, 0x76, 0x0a, 0x6f, 0xbc, 0xd5, 0x16, - 0x71, 0x49, 0xfc, 0x37, 0x62, 0xb1, 0x6f, 0xad, 0xde, 0x57, 0x0c, 0x97, - 0x1e, 0x82, 0xfe, 0x37, 0xec, 0xb5, 0xdb, 0xe4, 0xa8, 0x6f, 0x81, 0x85, - 0x21, 0x4d, 0xa9, 0x69, 0x1f, 0xe9, 0x5b, 0xff, 0x80, 0x21, 0x41, 0x95, - 0xc7, 0xa3, 0x90, 0x03, 0xd9, 0xa0, 0x61, 0xcc, 0xf5, 0xd1, 0x3f, 0x23, - 0x39, 0x1b, 0x85, 0x66, 0xb1, 0xee, 0x61, 0x85, 0x29, 0x39, 0x70, 0x69, - 0xee, 0x60, 0x89, 0xee, 0xe3, 0x73, 0xb9, 0x52, 0xa8, 0xd0, 0x41, 0xcd, - 0x90, 0xd1, 0x23, 0xd0, 0x86, 0xc3, 0xa1, 0x96, 0x9c, 0x39, 0x87, 0x17, - 0x75, 0xd9, 0x1f, 0x90, 0x5d, 0x22, 0x90, 0x1e, 0x65, 0xd0, 0x84, 0x10, - 0xa3, 0x55, 0x7c, 0xed, 0x23, 0xb1, 0xa7, 0xa6, 0xdc, 0xa1, 0xa0, 0x76, - 0x8d, 0x45, 0xe7, 0x4f, 0xc6, 0xde, 0xb2, 0x2d, 0xa0, 0xe8, 0x0f, 0xb7, - 0x7d, 0xdc, 0x26, 0x79, 0x5b, 0xec, 0xd1, 0xa2, 0x20, 0xf2, 0x04, 0x18, - 0x92, 0xfc, 0x75, 0x86, 0x8e, 0x59, 0x96, 0x41, 0xac, 0x75, 0x42, 0x6f, - 0x28, 0x4c, 0x38, 0xa9, 0xf3, 0x07, 0xfe, 0x49, 0x58, 0x21, 0x39, 0x26, - 0x86, 0x31, 0x97, 0x9c, 0x4b, 0xfb, 0x5e, 0x49, 0x6c, 0x72, 0x6c, 0x66, - 0x49, 0x52, 0x7c, 0x6e, 0x02, 0x99, 0xf3, 0x9d, 0x2a, 0xb1, 0x88, 0xb4, - 0x21, 0xed, 0x9d, 0x67, 0x42, 0xdc, 0x76, 0x61, 0x22, 0x0f, 0xcc, 0x50, - 0xf2, 0xbf, 0x07, 0x57, 0x3c, 0x4c, 0x48, 0xa2, 0x49, 0xde, 0x54, 0x50, - 0xc8, 0xf0, 0x44, 0x8e, 0x02, 0xba, 0x9c, 0xcb, 0x9e, 0x2a, 0xc3, 0x1f, - 0x9a, 0x9c, 0x4a, 0x71, 0x02, 0x2a, 0xbf, 0x7b, 0x9f, 0x2d, 0xf2, 0x39, - 0xa8, 0xe4, 0x2f, 0x3a, 0x40, 0xed, 0x0b, 0x49, 0x54, 0x50, 0x81, 0x08, - 0x1b, 0x55, 0x85, 0x89, 0xb4, 0xd6, 0x02, 0xe4, 0x66, 0xd3, 0x87, 0x13, - 0x8e, 0x53, 0xb8, 0x8d, 0x26, 0x5e, 0xc6, 0x51, 0xe1, 0xc3, 0x00, 0x98, - 0xeb, 0x0f, 0xe7, 0x15, 0x50, 0x03, 0x68, 0xb6, 0xe2, 0x11, 0x61, 0xa3, - 0x6b, 0x05, 0xfb, 0x84, 0xc3, 0xc2, 0xfd, 0xbe, 0x58, 0xc2, 0x7b, 0xd3, - 0xe8, 0x2e, 0x7b, 0x76, 0x1a, 0xc0, 0x25, 0x8c, 0x56, 0xba, 0x32, 0x92, - 0x06, 0x68, 0x0f, 0x74, 0xbd, 0x0a, 0xe3, 0x68, 0x07, 0xa4, 0x6c, 0xb7, - 0xcd, 0x32, 0x69, 0x85, 0xee, 0xe8, 0x9a, 0x8e, 0x7e, 0x05, 0xe1, 0xb2, - 0x81, 0xb1, 0x0d, 0x0b, 0xa2, 0xff, 0x9b, 0xe2, 0x61, 0x2d, 0xef, 0x15, - 0xbb, 0x80, 0x5b, 0xf5, 0xe2, 0xf7, 0xf2, 0x69, 0xb6, 0x10, 0x67, 0x99, - 0x6d, 0x14, 0x12, 0xf7, 0xf3, 0x3f, 0x49, 0x45, 0x28, 0x41, 0x74, 0xd4, - 0xb8, 0x84, 0x65, 0xeb, 0x76, 0x57, 0x1a, 0x0a, 0x0b, 0x69, 0xb3, 0x6a, - 0x92, 0x46, 0xd2, 0x0a, 0xe7, 0xe4, 0x10, 0xf1, 0x9f, 0x7a, 0xa4, 0x6a, - 0x21, 0x92, 0xb9, 0x80, 0xa5, 0xec, 0x22, 0xc8, 0xa0, 0x90, 0x9e, 0x07, - 0x55, 0xb4, 0xcc, 0xcf, 0x13, 0x85, 0xf1, 0x1f, 0xb5, 0xb4, 0x0f, 0xb4, - 0xd0, 0x08, 0xf5, 0x38, 0x78, 0xa2, 0xf2, 0xf4, 0xcf, 0xf5, 0x17, 0x07, - 0x40, 0x31, 0xf2, 0xaa, 0x75, 0xe3, 0xb4, 0x1d, 0x37, 0x3d, 0x27, 0xd4, - 0x68, 0x7c, 0x7d, 0x5f, 0x2a, 0x7e, 0xe4, 0x0f, 0x1e, 0x39, 0xd8, 0x71, - 0x04, 0x6f, 0x26, 0x20, 0xa2, 0xaa, 0x97, 0x5f, 0xec, 0xb5, 0x64, 0x78, - 0x23, 0xa9, 0x4d, 0xad, 0xcb, 0xc1, 0x59, 0x20, 0x8c, 0x4c, 0x4b, 0x23, - 0x28, 0x98, 0xb7, 0xd2, 0x5e, 0x89, 0xfc, 0x2d, 0xc3, 0xf2, 0x6b, 0x70, - 0xaa, 0xf2, 0x04, 0x93, 0x43, 0xa7, 0xc5, 0xe9, 0x2d, 0x58, 0x66, 0x76, - 0x9c, 0x25, 0xbb, 0x9d, 0x34, 0x91, 0xb2, 0x06, 0x49, 0x73, 0xa5, 0xe8, - 0xcf, 0x3b, 0xa9, 0xdb, 0x23, 0xcf, 0x36, 0x0e, 0xd7, 0x72, 0x3a, 0x5e, - 0x40, 0x0b, 0x98, 0xa5, 0xa4, 0x2a, 0x39, 0x5a, 0x13, 0x01, 0x25, 0x3b, - 0x1c, 0x12, 0xf2, 0xcd, 0xb0, 0x14, 0xf2, 0xbf, 0x2e, 0x2a, 0x44, 0xd5, - 0xc9, 0x25, 0xb4, 0x5a, 0xca, 0xe7, 0xb6, 0x2f, 0x63, 0x1f, 0xaf, 0x21, - 0xb6, 0xbe, 0xa6, 0x3e, 0x12, 0x18, 0xb5, 0x2b, 0x6b, 0xec, 0xa3, 0x13, - 0x51, 0x2b, 0x7f, 0x54, 0x92, 0x4e, 0xa7, 0xba, 0x48, 0x1b, 0x70, 0x08, - 0x63, 0x53, 0xa2, 0x98, 0x5f, 0xe9, 0x25, 0x2b, 0x20, 0x0f, 0x35, 0x1c, - 0x40, 0xc5, 0x76, 0x66, 0xcc, 0x8b, 0x4c, 0x33, 0x8d, 0x0e, 0xde, 0xec, - 0xee, 0xf4, 0xd6, 0x86, 0x7f, 0xdc, 0xaf, 0x2c, 0x50, 0x43, 0x6d, 0xf6, - 0x59, 0x56, 0x72, 0x9f, 0x0b, 0xb8, 0xee, 0x9f, 0x90, 0x60, 0xd5, 0x32, - 0x52, 0xe9, 0x29, 0x61, 0xd4, 0x7f, 0xf2, 0xa5, 0x64, 0xb0, 0xb3, 0x28, - 0x02, 0x04, 0x42, 0xf3, 0x57, 0xb3, 0x98, 0x7a, 0xb3, 0x8f, 0x08, 0xfd, - 0xfa, 0x2c, 0xd5, 0xd2, 0xf7, 0xba, 0x9c, 0x4d, 0xf1, 0x70, 0x39, 0x1f, - 0xd3, 0xc1, 0xc2, 0x31, 0xa6, 0x59, 0x17, 0x93, 0x6e, 0xa7, 0x9c, 0xaf, - 0xa6, 0x2d, 0x4a, 0x5e, 0xeb, 0xaf, 0xdd, 0xa7, 0xb1, 0xbf, 0x02, 0x43, - 0x92, 0x54, 0x99, 0xde, 0x70, 0x9d, 0x72, 0xc3, 0x75, 0x94, 0x95, 0x0a, - 0x2b, 0xd0, 0x20, 0x72, 0xa9, 0x74, 0xb8, 0x02, 0xac, 0xbe, 0x24, 0xdb, - 0x0b, 0xfa, 0x78, 0x44, 0xd0, 0x18, 0xa5, 0x27, 0x84, 0xce, 0xc9, 0xc9, - 0xf4, 0xef, 0x82, 0xd8, 0x12, 0x2d, 0x6c, 0xa8, 0x5a, 0xf6, 0xc2, 0x12, - 0x95, 0x5e, 0xdd, 0x7e, 0xb2, 0x58, 0xe0, 0x8b, 0xeb, 0xef, 0xa1, 0x47, - 0x08, 0x79, 0xe2, 0x1e, 0x5a, 0x90, 0x7e, 0xa7, 0x2c, 0xb7, 0xbd, 0x79, - 0x82, 0xd4, 0x5d, 0xe9, 0x44, 0xe1, 0xb2, 0xe7, 0xcd, 0xe1, 0xc4, 0xa0, - 0x63, 0x7d, 0xf9, 0xb6, 0x6f, 0x4b, 0x4c, 0xd1, 0xd6, 0x22, 0x49, 0x2b, - 0x46, 0x2b, 0x8d, 0x64, 0x55, 0x15, 0xc1, 0xd6, 0xe0, 0xac, 0x2d, 0x75, - 0xcd, 0xd7, 0xd5, 0x1d, 0xd7, 0x59, 0x24, 0xb6, 0x70, 0x7b, 0x22, 0x6a, - 0xd8, 0xf3, 0xc6, 0x4c, 0xb6, 0x30, 0x58, 0xc9, 0x44, 0x89, 0x3a, 0xc7, - 0x03, 0xb4, 0xe4, 0x1c, 0xf6, 0x91, 0x98, 0xe6, 0x3a, 0xe7, 0x58, 0x6a, - 0xfe, 0x3f, 0x3c, 0xcb, 0x1b, 0x74, 0xc7, 0x02, 0x84, 0xd3, 0x11, 0xce, - 0x0c, 0x9a, 0x43, 0x14, 0xb4, 0x6b, 0x2e, 0xc7, 0x53, 0xdb, 0x19, 0x6d, - 0xa8, 0x78, 0x36, 0x22, 0x65, 0xe2, 0x79, 0x06, 0x02, 0xfa, 0xe0, 0x2f, - 0x43, 0xb3, 0x3c, 0xf4, 0xcd, 0x1c, 0x4f, 0xad, 0xe9, 0xd3, 0x57, 0x73, - 0xad, 0x1d, 0x7c, 0xe0, 0x73, 0xf8, 0xf2, 0x09, 0x51, 0x9c, 0x10, 0x97, - 0xea, 0xba, 0x62, 0x74, 0xa0, 0x5c, 0xc0, 0x8c, 0x3a, 0x52, 0xfd, 0x85, - 0x0d, 0x12, 0x12, 0x23, 0x39, 0x55, 0x08, 0x0a, 0x20, 0x02, 0x2b, 0x0f, - 0x47, 0x13, 0x50, 0x29, 0x4a, 0x5e, 0xff, 0x98, 0x22, 0xe7, 0x1a, 0xa1, - 0x92, 0xa1, 0xe2, 0x06, 0xe0, 0xf2, 0x18, 0xdf, 0x90, 0x0c, 0x88, 0x17, - 0xd0, 0xd8, 0xc0, 0x46, 0x82, 0x66, 0x75, 0x5a, 0x4f, 0x90, 0xb6, 0x1e, - 0x3f, 0x1d, 0x10, 0xff, 0x80, 0xf8, 0xa9, 0x34, 0x7e, 0x71, 0x44, 0x21, - 0xf2, 0xf4, 0xdf, 0xa5, 0x44, 0x1b, 0x73, 0x38, 0xc0, 0xc6, 0xf0, 0x81, - 0x94, 0x53, 0x31, 0xda, 0xe8, 0x11, 0xda, 0xab, 0x88, 0x9c, 0x53, 0xb1, - 0xdb, 0x83, 0xff, 0x8d, 0x17, 0xc0, 0x9f, 0x21, 0x1c, 0xeb, 0xe7, 0x0e, - 0x84, 0x84, 0x59, 0x06, 0xc0, 0xd5, 0x7c, 0x7e, 0xcd, 0xf3, 0x28, 0x5b, - 0x8d, 0xb1, 0xb1, 0x12, 0xe5, 0xa4, 0x81, 0xbb, 0x61, 0xe1, 0x0e, 0xef, - 0x3e, 0xe3, 0x65, 0x21, 0xbb, 0x80, 0xa8, 0x79, 0x37, 0xb0, 0x17, 0xff, - 0x90, 0x73, 0x35, 0xcd, 0x51, 0xb6, 0x4c, 0xca, 0xe5, 0xd6, 0x9b, 0x94, - 0xe2, 0x90, 0x58, 0x95, 0x42, 0x27, 0x67, 0xc0, 0xee, 0xb8, 0x36, 0x4c, - 0x47, 0x52, 0x77, 0xbc, 0xbb, 0x2a, 0x25, 0xfc, 0xab, 0xdf, 0xa1, 0xa6, - 0x57, 0x69, 0xfd, 0x67, 0x99, 0x55, 0x97, 0x43, 0x1d, 0x6c, 0x21, 0xd0, - 0xbf, 0x12, 0xa7, 0xda, 0x18, 0xec, 0x14, 0xf4, 0x45, 0x2b, 0x23, 0xb8, - 0xd0, 0x5e, 0x4a, 0x43, 0xca, 0x58, 0xd1, 0x7a, 0x52, 0xba, 0xf2, 0x7e, - 0xa3, 0x40, 0xeb, 0xf7, 0x6f, 0xa6, 0xb6, 0xc1, 0x6f, 0x28, 0xcb, 0x3c, - 0x0d, 0x3e, 0x3e, 0x1c, 0x3f, 0x6d, 0xc0, 0xd1, 0xf6, 0x76, 0xb2, 0x05, - 0xbb, 0x93, 0x4c, 0x2d, 0x8a, 0x44, 0x54, 0x4b, 0x2a, 0xd3, 0x2a, 0x48, - 0x64, 0xf5, 0x71, 0x96, 0x18, 0x86, 0x05, 0x60, 0x36, 0x84, 0x9f, 0x52, - 0x81, 0x3c, 0x3f, 0xc4, 0x7d, 0xc9, 0x78, 0xe1, 0x56, 0x8e, 0x82, 0x82, - 0x52, 0xfa, 0x08, 0xa5, 0x2e, 0x8c, 0xc3, 0x3b, 0x37, 0x15, 0xfc, 0x93, - 0xe2, 0xa7, 0x26, 0x3e, 0x55, 0xa5, 0x56, 0x90, 0x6b, 0xfc, 0xa1, 0xcb, - 0xce, 0x2d, 0x45, 0xf9, 0xab, 0x0d, 0x5b, 0x3b, 0x33, 0x5b, 0x15, 0x29, - 0xe1, 0xc0, 0x5f, 0xcd, 0x59, 0xfb, 0xf1, 0x9c, 0x3f, 0xd4, 0x33, 0x0d, - 0xe3, 0xe6, 0xff, 0x48, 0xa3, 0x3f, 0x07, 0xb1, 0xbd, 0x78, 0xae, 0x0e, - 0xed, 0x7a, 0x65, 0x94, 0xe9, 0x19, 0x75, 0x7a, 0xee, 0x36, 0xd5, 0x6d, - 0xce, 0xe5, 0x7a, 0x4a, 0xd7, 0x00, 0x0c, 0x7c, 0xc0, 0x47, 0xa2, 0xf8, - 0x36, 0xff, 0x40, 0xe8, 0x41, 0x59, 0x55, 0x10, 0xe4, 0xcd, 0x51, 0xef, - 0xe8, 0x85, 0xf6, 0x60, 0x6c, 0xc5, 0xdc, 0x18, 0x6c, 0x53, 0xfe, 0xb4, - 0x41, 0x5d, 0xc9, 0xd6, 0x5a, 0xfd, 0x8e, 0xc3, 0xb6, 0x42, 0x9f, 0x73, - 0x66, 0x0c, 0x64, 0xcc, 0x68, 0xea, 0xc7, 0xb9, 0xfd, 0x4a, 0x3f, 0x17, - 0x0f, 0xd5, 0x60, 0x47, 0xbd, 0x75, 0x0a, 0xba, 0xac, 0x6b, 0x45, 0xe6, - 0x38, 0x80, 0x94, 0x9b, 0x35, 0x6f, 0x64, 0xe0, 0x1f, 0x68, 0x62, 0xae, - 0x01, 0xc9, 0x37, 0x0e, 0x45, 0x43, 0x7f, 0x9f, 0x75, 0xdc, 0x24, 0xc6, - 0xc9, 0xd7, 0xa5, 0x11, 0x3c, 0x39, 0x1f, 0x2a, 0xb2, 0x99, 0xd0, 0xc1, - 0x3a, 0x69, 0xb0, 0xd4, 0xa7, 0x88, 0x45, 0x45, 0x63, 0xd7, 0x9b, 0xf5, - 0x67, 0xbd, 0xc3, 0x8b, 0x2f, 0x23, 0xba, 0xec, 0x7b, 0x4c, 0x13, 0xb1, - 0x66, 0x64, 0x5d, 0xaf, 0xa4, 0x20, 0x27, 0x92, 0x79, 0xa0, 0x15, 0x89, - 0x48, 0xd8, 0xcf, 0x9e, 0x4a, 0x56, 0x36, 0x87, 0x76, 0x75, 0x97, 0x13, - 0x70, 0x87, 0xf9, 0x8a, 0xd7, 0x58, 0x3e, 0xea, 0x41, 0xcd, 0x78, 0x98, - 0x15, 0x4a, 0x76, 0x12, 0x7e, 0xfe, 0xdb, 0x76, 0xc3, 0x13, 0x0a, 0xe9, - 0x10, 0x21, 0xbc, 0xb2, 0x46, 0x30, 0x6b, 0x6c, 0xd8, 0xce, 0xfe, 0x8b, - 0x33, 0x55, 0x42, 0x46, 0x58, 0x8e, 0x96, 0x6b, 0xa9, 0x91, 0x3c, 0x49, - 0xec, 0xbe, 0xb1, 0x71, 0xaf, 0x95, 0xee, 0xd2, 0xf8, 0x07, 0x46, 0x52, - 0x34, 0xb5, 0xf2, 0x0a, 0xe2, 0x6a, 0x49, 0x39, 0x51, 0x96, 0xda, 0x86, - 0x00, 0x3c, 0x1d, 0x11, 0x92, 0x1e, 0x51, 0xd4, 0x48, 0x98, 0x6e, 0x64, - 0xb7, 0xcd, 0xb8, 0xd1, 0x30, 0xb4, 0x1f, 0x41, 0x2e, 0xbb, 0x8e, 0xb2, - 0x6f, 0x07, 0x66, 0xe6, 0xe0, 0xe3, 0xa3, 0xa9, 0xb0, 0x6b, 0xb0, 0x42, - 0xc2, 0x84, 0x28, 0x73, 0x3c, 0x0d, 0xef, 0x52, 0x99, 0xe9, 0xbd, 0x56, - 0x38, 0x4a, 0x60, 0x08, 0xe7, 0x62, 0x29, 0xee, 0xd9, 0xf8, 0x09, 0xe0, - 0x8e, 0x33, 0x34, 0x01, 0xa4, 0x58, 0xfa, 0x29, 0x53, 0xb1, 0x76, 0x6c, - 0xa1, 0x0a, 0x11, 0x27, 0x9f, 0x57, 0x1a, 0xb9, 0xe3, 0x2c, 0x14, 0x5b, - 0xf5, 0x39, 0x87, 0x0e, 0x43, 0x12, 0x72, 0x2e, 0x69, 0x7e, 0x0c, 0x52, - 0x0b, 0x7f, 0xb7, 0x1f, 0x27, 0xa2, 0x00, 0x02, 0xbe, 0xd2, 0x8c, 0xaf, - 0x87, 0x91, 0x44, 0x7c, 0x1c, 0x83, 0x67, 0xee, 0x9d, 0x79, 0x77, 0x67, - 0x6d, 0x69, 0x53, 0x0e, 0xa1, 0xe8, 0x08, 0xcd, 0x8b, 0x88, 0xdf, 0x08, - 0xbe, 0x6d, 0x08, 0xe0, 0xfb, 0x8f, 0x0e, 0x19, 0x64, 0xdc, 0xaf, 0xe2, - 0x4b, 0xb1, 0x1c, 0x75, 0x24, 0x20, 0xa9, 0x3e, 0x02, 0x2b, 0xf7, 0xbf, - 0x10, 0x2c, 0x0b, 0x0f, 0x81, 0x4c, 0x19, 0xdc, 0xf4, 0x91, 0x7d, 0x57, - 0x1c, 0x45, 0x3f, 0xb6, 0xea, 0x34, 0xae, 0x3d, 0x7a, 0x9d, 0xf3, 0x7b, - 0x47, 0x88, 0xf5, 0x28, 0x70, 0xa5, 0x6a, 0xb2, 0x80, 0x80, 0x00, 0x74, - 0xf3, 0x5b, 0x96, 0x59, 0x74, 0x26, 0x31, 0x0f, 0x05, 0x1b, 0x96, 0x76, - 0x5a, 0xb0, 0x47, 0x51, 0xb6, 0xcc, 0xa6, 0x08, 0x78, 0x7e, 0x53, 0xf8, - 0xf2, 0x74, 0xdd, 0xda, 0x30, 0x4d, 0x5a, 0x92, 0x98, 0xc6, 0x94, 0x21, - 0xbd, 0x3c, 0xbc, 0x42, 0x79, 0x4f, 0xf1, 0x58, 0xed, 0xfe, 0xdc, 0xc7, - 0xf3, 0x5a, 0x1e, 0xe8, 0x2b, 0x02, 0x6c, 0x34, 0xca, 0xdb, 0x73, 0x0b, - 0x65, 0x63, 0xb7, 0xea, 0x76, 0x65, 0x75, 0xfe, 0x3d, 0x02, 0x79, 0x2d, - 0x24, 0x40, 0xa4, 0xee, 0x09, 0x65, 0xa9, 0xa2, 0xba, 0x04, 0xd7, 0x7a, - 0x51, 0xa5, 0xab, 0x3b, 0xce, 0x1b, 0x60, 0x3d, 0xd4, 0x7c, 0x74, 0xce, - 0xd4, 0xf0, 0x0c, 0xe7, 0xc1, 0x7b, 0x61, 0x8f, 0xc1, 0xa7, 0x37, 0xf8, - 0x0d, 0x05, 0x5e, 0x8b, 0x9e, 0x26, 0x09, 0x43, 0xdb, 0x2d, 0x3f, 0xb7, - 0x80, 0x21, 0x9f, 0x09, 0x4a, 0x6e, 0x1a, 0x85, 0x54, 0x43, 0x42, 0x7f, - 0x7d, 0xfb, 0xeb, 0xc9, 0xa2, 0x84, 0x7a, 0x1c, 0xfe, 0xb6, 0x88, 0xf3, - 0x3b, 0x31, 0xf5, 0x2e, 0xcd, 0x75, 0x7f, 0x40, 0x4a, 0x7c, 0x94, 0x43, - 0xa4, 0x06, 0x00, 0xb3, 0x51, 0x6c, 0x52, 0xcd, 0x6a, 0x01, 0x21, 0xfd, - 0xbf, 0x11, 0x70, 0xb1, 0x7b, 0x2f, 0xc9, 0xa9, 0x5a, 0xfb, 0xd3, 0x92, - 0x63, 0xf1, 0x14, 0x3c, 0x37, 0x04, 0x78, 0x36, 0x42, 0x31, 0xe1, 0xc7, - 0x1a, 0x02, 0x06, 0x8f, 0x9e, 0x52, 0x3f, 0xce, 0xdc, 0x4d, 0x00, 0x73, - 0x27, 0x53, 0x26, 0xf0, 0xcb, 0x62, 0x05, 0x47, 0x5b, 0xf3, 0x89, 0x96, - 0xf2, 0xe4, 0xce, 0xae, 0xe2, 0x2d, 0x7a, 0xdc, 0x5f, 0x2d, 0xb6, 0x92, - 0xa9, 0x21, 0xb8, 0x90, 0xaa, 0xc8, 0xa6, 0xb8, 0x7f, 0x40, 0x48, 0xaf, - 0x6e, 0x1b, 0x95, 0xc3, 0x85, 0x98, 0x9d, 0x37, 0x90, 0xa9, 0xf6, 0x76, - 0x07, 0x5c, 0x5e, 0xb9, 0x45, 0xd0, 0x5d, 0x7f, 0x05, 0xae, 0x09, 0x1d, - 0x6e, 0xdf, 0x68, 0xf6, 0xbd, 0xe6, 0xa5, 0x92, 0x5d, 0xc1, 0xaf, 0x11, - 0xf9, 0xd7, 0x72, 0x8b, 0x70, 0x86, 0x2b, 0x63, 0x1c, 0xf3, 0xa3, 0x19, - 0x7d, 0x2c, 0x49, 0x29, 0x9f, 0x77, 0x8f, 0x76, 0xc0, 0x5b, 0xdd, 0x36, - 0xb5, 0x99, 0xc0, 0x78, 0x77, 0xef, 0xd5, 0x63, 0x27, 0x4d, 0xdb, 0x23, - 0xc2, 0xf6, 0xb8, 0x99, 0xd4, 0x77, 0x28, 0x7c, 0xe8, 0x83, 0x52, 0x05, - 0x20, 0xc2, 0x71, 0xf3, 0x0c, 0x30, 0x97, 0xb4, 0xf8, 0xd0, 0x4e, 0x87, - 0xb9, 0x22, 0xc1, 0x12, 0x80, 0x5d, 0x45, 0xbc, 0xc4, 0xa3, 0x11, 0x2e, - 0x3f, 0xb8, 0xff, 0x34, 0x72, 0x19, 0x68, 0x69, 0xd9, 0x2c, 0x38, 0x49, - 0x49, 0x5e, 0xa1, 0xdd, 0x14, 0xd1, 0x16, 0x8e, 0xa4, 0x3f, 0x41, 0xb0, - 0xb2, 0x3f, 0x01, 0xf0, 0x3f, 0x53, 0xe9, 0x29, 0x2e, 0x29, 0x1c, 0xb0, - 0x2a, 0x8c, 0xbb, 0x19, 0xb3, 0x55, 0x0a, 0xc7, 0x41, 0x13, 0x52, 0x1c, - 0xc1, 0x56, 0x75, 0x5f, 0x0e, 0xb4, 0x92, 0xba, 0xf1, 0x12, 0x65, 0xa8, - 0xb7, 0xe7, 0x80, 0x76, 0x09, 0x9d, 0x72, 0x29, 0xa8, 0x25, 0x63, 0x6b, - 0x6b, 0xd4, 0x5a, 0xc9, 0xa2, 0x93, 0x0a, 0xe2, 0x3e, 0x43, 0xbe, 0xbd, - 0x02, 0x61, 0x60, 0x33, 0x35, 0x7d, 0x18, 0x40, 0xfa, 0x20, 0xa4, 0x51, - 0x32, 0xcf, 0x77, 0x1a, 0xbb, 0x7c, 0x7e, 0x7c, 0xd7, 0x09, 0x85, 0x31, - 0x85, 0xed, 0xde, 0x77, 0xa2, 0xed, 0x30, 0x79, 0x2e, 0xc2, 0x8c, 0xda, - 0x6c, 0xeb, 0x06, 0x59, 0x52, 0x36, 0xc0, 0x29, 0xc1, 0x70, 0x63, 0x9f, - 0x50, 0xed, 0x5c, 0x2d, 0x3d, 0x75, 0xe7, 0x52, 0xe5, 0x09, 0xe0, 0x0b, - 0x0c, 0xff, 0x61, 0x0d, 0xb1, 0x50, 0x8e, 0xf4, 0xbc, 0x7c, 0xb8, 0x78, - 0x3f, 0xfa, 0x72, 0x04, 0x85, 0x09, 0x08, 0x82, 0x2d, 0x6d, 0x7e, 0x21, - 0xf0, 0x4b, 0xce, 0xef, 0x4a, 0xbe, 0x83, 0x39, 0xba, 0xb6, 0xc0, 0x3d, - 0x29, 0x69, 0x23, 0x91, 0x4d, 0x35, 0x24, 0xa5, 0xe7, 0xb6, 0x8f, 0x97, - 0xb2, 0xf7, 0x9f, 0x7d, 0x9d, 0xb7, 0x0f, 0xea, 0xbf, 0x2f, 0x8e, 0xdb, - 0xd2, 0x20, 0x17, 0x31, 0x05, 0xc9, 0x09, 0x2e, 0xcc, 0x1a, 0x6b, 0xe6, - 0x05, 0x70, 0x95, 0xce, 0x3d, 0xe3, 0x55, 0xac, 0x4e, 0x8f, 0x37, 0x26, - 0x5d, 0x2c, 0x07, 0xb8, 0x48, 0x02, 0x80, 0xed, 0x7e, 0xfe, 0xbe, 0x11, - 0xba, 0xc0, 0xd8, 0x85, 0x7d, 0xb2, 0xe9, 0x86, 0x99, 0x75, 0x0c, 0xce, - 0xa1, 0x9b, 0x9e, 0xc7, 0x6e, 0xf5, 0xd0, 0xe1, 0x9f, 0x64, 0xed, 0x69, - 0x48, 0x61, 0x72, 0x83, 0xea, 0x50, 0x10, 0x2e, 0x02, 0xb0, 0xb6, 0xc4, - 0x6f, 0xcb, 0x65, 0x2d, 0x22, 0x57, 0xac, 0x6e, 0xb2, 0x03, 0x93, 0xc7, - 0x87, 0xd1, 0x96, 0xbc, 0x43, 0x99, 0x61, 0x16, 0x58, 0x50, 0x75, 0xe7, - 0x7c, 0x8e, 0x4e, 0x20, 0x30, 0xde, 0x97, 0x83, 0x1b, 0xc3, 0x3b, 0x0a, - 0xc0, 0xa9, 0x22, 0x65, 0x4a, 0x7c, 0xf4, 0xc7, 0xb7, 0xa6, 0x49, 0x8c, - 0xaf, 0x0c, 0x32, 0x99, 0xfe, 0xcf, 0x3c, 0x4b, 0x8f, 0x0a, 0x2d, 0x51, - 0xe2, 0x67, 0x1a, 0x65, 0x8b, 0x02, 0x5a, 0x06, 0x11, 0x13, 0x5b, 0xef, - 0x94, 0x83, 0x75, 0xf4, 0x26, 0x53, 0xad, 0xa1, 0x43, 0xc8, 0x98, 0x0e, - 0x98, 0x21, 0x04, 0x04, 0xf4, 0xa8, 0xba, 0x7c, 0xcd, 0xcf, 0x95, 0x61, - 0x73, 0xdf, 0x90, 0x62, 0x6c, 0x77, 0x33, 0x8f, 0xbf, 0x4d, 0xbc, 0x36, - 0x1e, 0x36, 0xdf, 0xf6, 0x88, 0xc2, 0xaf, 0x76, 0x03, 0x93, 0xfd, 0xd2, - 0xc1, 0x9c, 0xa6, 0x89, 0x49, 0x6c, 0xd7, 0xc2, 0x1f, 0x7c, 0x0e, 0x6b, - 0xb6, 0x58, 0xdf, 0x6f, 0xbd, 0x2d, 0x6f, 0x7a, 0x96, 0x5c, 0x81, 0xbc, - 0x7b, 0xb0, 0x7a, 0x1b, 0xfa, 0x6c, 0x2a, 0x81, 0xd1, 0x57, 0x45, 0x40, - 0xcf, 0x47, 0x23, 0x8f, 0xc6, 0xec, 0xc8, 0x3f, 0xfb, 0x98, 0x01, 0xd1, - 0xee, 0xbd, 0x0a, 0x5c, 0x51, 0x93, 0x26, 0xc0, 0x2b, 0x3f, 0x6d, 0xdc, - 0x6f, 0x50, 0x49, 0x19, 0x8b, 0x50, 0xac, 0x84, 0xf9, 0x87, 0x30, 0x70, - 0xbd, 0xe2, 0x1b, 0x57, 0xe7, 0x5a, 0x8f, 0x22, 0xad, 0xc4, 0xf3, 0x43, - 0xd6, 0xf4, 0xb9, 0x3d, 0x3a, 0x6d, 0x18, 0x97, 0xc1, 0xa9, 0x4f, 0x7d, - 0x6a, 0x03, 0x50, 0x34, 0x22, 0xc7, 0x59, 0x21, 0x45, 0x63, 0x15, 0xe4, - 0x91, 0x3e, 0x76, 0xf7, 0xcb, 0xa7, 0x9a, 0x17, 0x0b, 0x4e, 0x60, 0x67, - 0xe4, 0x6b, 0x16, 0x2b, 0x3d, 0x96, 0x42, 0x26, 0x40, 0x14, 0x3e, 0x2c, - 0x63, 0x10, 0x21, 0x09, 0xfd, 0xdd, 0xef, 0x58, 0x99, 0xe3, 0xd3, 0x5f, - 0x06, 0x05, 0x21, 0xb3, 0xf1, 0xce, 0xa2, 0x22, 0x74, 0xb4, 0x1c, 0x31, - 0x90, 0x7f, 0x6d, 0x57, 0xa1, 0x48, 0x6e, 0x9a, 0x3b, 0x0c, 0x15, 0x63, - 0xab, 0x10, 0xbb, 0xc3, 0xed, 0x46, 0xd5, 0x2d, 0x32, 0x78, 0x17, 0x61, - 0xe5, 0x38, 0x75, 0x05, 0x99, 0x6c, 0xcd, 0x2c, 0xab, 0x55, 0x84, 0x0e, - 0x7c, 0x63, 0xfd, 0x04, 0x72, 0x69, 0x54, 0x25, 0x16, 0xf7, 0x0c, 0x4a, - 0x74, 0x6e, 0xfc, 0x09, 0x4c, 0xfb, 0xd1, 0x5f, 0xcd, 0x5a, 0xef, 0x00, - 0x6c, 0x12, 0x77, 0x3d, 0x41, 0x60, 0x9f, 0x58, 0xfe, 0xe7, 0x41, 0x1b, - 0xfa, 0xa8, 0x54, 0x6d, 0x84, 0x79, 0x75, 0x87, 0x9e, 0x36, 0x2e, 0xed, - 0x55, 0x44, 0xa7, 0xe8, 0x53, 0x54, 0xa6, 0xe4, 0x96, 0xb6, 0x50, 0xd3, - 0xc7, 0x61, 0x55, 0xd0, 0xb6, 0x05, 0xcb, 0xa1, 0xd2, 0x8a, 0xda, 0x64, - 0xaf, 0x9a, 0x59, 0x3e, 0xbd, 0xd2, 0x8f, 0x79, 0xa0, 0x30, 0x0f, 0x4e, - 0x5e, 0x5b, 0xbb, 0xb3, 0x42, 0x69, 0x17, 0xad, 0x32, 0xe8, 0x0f, 0x78, - 0x39, 0x6d, 0x18, 0x80, 0xfd, 0x25, 0xfa, 0xd5, 0x85, 0xbc, 0xad, 0x6f, - 0x6a, 0x7e, 0x50, 0xf1, 0x54, 0x15, 0x6d, 0xe4, 0x88, 0x6f, 0xfd, 0xea, - 0x7d, 0x3a, 0xf2, 0xec, 0x63, 0x4f, 0x5a, 0x79, 0x60, 0x5b, 0x60, 0x84, - 0x38, 0x34, 0x2a, 0x5b, 0xcd, 0x00, 0x2c, 0xf3, 0x96, 0xc5, 0x7d, 0xf2, - 0x33, 0x93, 0x8e, 0x92, 0xcb, 0x67, 0x43, 0xff, 0xc3, 0xd1, 0xb0, 0x75, - 0x8a, 0x4e, 0xe4, 0x67, 0x6d, 0xb9, 0x28, 0x95, 0x6c, 0xf0, 0x6d, 0x6a, - 0x91, 0x23, 0xf1, 0x01, 0x1c, 0x5d, 0xdd, 0xff, 0xce, 0x8d, 0x1d, 0x91, - 0x8f, 0x11, 0x6b, 0x65, 0x9e, 0xa0, 0xeb, 0x35, 0x7b, 0xb2, 0xa0, 0x35, - 0x32, 0x08, 0xfe, 0x55, 0x10, 0x99, 0xbc, 0x34, 0x76, 0xdd, 0xcf, 0x25, - 0xbe, 0x6f, 0x73, 0x0b, 0x80, 0xa6, 0xe7, 0x32, 0x97, 0xf4, 0x07, 0xa5, - 0x63, 0x91, 0xa7, 0xf3, 0xff, 0x42, 0x62, 0x65, 0x11, 0x0f, 0x11, 0x22, - 0xca, 0x58, 0x97, 0x02, 0xcd, 0x92, 0x6b, 0x2f, 0x7f, 0x6c, 0x78, 0x46, - 0x38, 0x0e, 0x67, 0x5c, 0xd8, 0x79, 0x2c, 0x23, 0x84, 0x7c, 0x4e, 0x70, - 0x79, 0x8c, 0xe3, 0xb0, 0x97, 0xbc, 0x7a, 0xb9, 0x88, 0x56, 0x9d, 0xe3, - 0x8a, 0x5e, 0x55, 0xae, 0xc0, 0x7d, 0x07, 0x9c, 0x86, 0x52, 0x74, 0x36, - 0xf2, 0xc7, 0x82, 0xf1, 0x46, 0x61, 0xe6, 0xb1, 0x8f, 0x0b, 0x28, 0xd9, - 0xf8, 0xeb, 0x4c, 0xf0, 0x2e, 0x15, 0x9e, 0xa6, 0x21, 0x4c, 0xc2, 0xae, - 0x32, 0xf3, 0xb4, 0x70, 0x45, 0x9b, 0xbc, 0x86, 0x3b, 0x2c, 0xcf, 0xd1, - 0x67, 0x61, 0xd4, 0x14, 0x5c, 0x68, 0x79, 0x99, 0xcc, 0x99, 0x63, 0x09, - 0x6b, 0x84, 0x19, 0x6c, 0x39, 0xf1, 0x24, 0x41, 0xf0, 0xe9, 0x8a, 0x2e, - 0x62, 0x52, 0x9f, 0x24, 0xcc, 0x33, 0x53, 0xe7, 0x64, 0xfe, 0x7b, 0x2e, - 0x38, 0x74, 0xe2, 0xd4, 0x5f, 0x67, 0xd3, 0xa2, 0x42, 0xe4, 0xab, 0x2f, - 0x69, 0x79, 0xeb, 0xa5, 0xa7, 0xa0, 0x76, 0x49, 0x98, 0xd6, 0x51, 0xd0, - 0x8f, 0x54, 0xce, 0x67, 0x7b, 0x6a, 0xaf, 0x7b, 0xe4, 0x9b, 0x85, 0x2b, - 0xe6, 0xe3, 0x5e, 0x9d, 0x7b, 0x53, 0x42, 0x19, 0xd2, 0xb1, 0x02, 0x05, - 0xd5, 0x07, 0xfb, 0xc8, 0xcd, 0xe7, 0x04, 0xe2, 0xbb, 0x5e, 0x3c, 0x06, - 0xbf, 0x5a, 0x43, 0xf7, 0xb0, 0xdf, 0xf5, 0x29, 0xd2, 0x72, 0xdd, 0x45, - 0xae, 0xad, 0x2c, 0xab, 0x90, 0x26, 0x42, 0xa1, 0x4a, 0x68, 0x4e, 0xd3, - 0xb3, 0x81, 0x23, 0xb8, 0x58, 0xe0, 0x83, 0x7f, 0x42, 0x8b, 0x5f, 0x1e, - 0x24, 0xbc, 0xb9, 0x44, 0x09, 0x06, 0x63, 0xbc, 0x13, 0x25, 0x51, 0x4c, - 0xe0, 0x79, 0x23, 0x1c, 0x65, 0xa1, 0x6a, 0x59, 0x59, 0x9b, 0x51, 0x1b, - 0x28, 0xdb, 0x34, 0xc8, 0x3a, 0x95, 0xa5, 0x2f, 0xf4, 0xc1, 0xad, 0x2c, - 0x40, 0x75, 0xd6, 0x6a, 0x98, 0x04, 0xfd, 0x0c, 0xa9, 0x21, 0x88, 0x96, - 0x45, 0x5c, 0xad, 0xf3, 0x7c, 0x27, 0x22, 0xa1, 0x8b, 0x90, 0xc8, 0xa3, - 0x63, 0xc6, 0x8b, 0x25, 0xaa, 0x81, 0xf7, 0x5c, 0x60, 0x1f, 0x92, 0x3e, - 0x14, 0x48, 0xbc, 0x01, 0xa8, 0x49, 0x99, 0x54, 0xb0, 0xf4, 0x15, 0xa4, - 0x31, 0xa2, 0x20, 0xa4, 0xcd, 0x04, 0x7a, 0xc3, 0x2f, 0x18, 0xce, 0xa8, - 0x2b, 0xba, 0x1d, 0xf1, 0xa4, 0x7e, 0x97, 0xa5, 0xcc, 0x9b, 0x81, 0x4c, - 0x7e, 0x5b, 0xf6, 0x1f, 0x4c, 0xd1, 0xdf, 0xc3, 0xfc, 0xd9, 0x4a, 0xa3, - 0x18, 0x7b, 0xa8, 0x02, 0x8f, 0x34, 0x29, 0x4d, 0x51, 0x17, 0x8c, 0xb4, - 0xda, 0x20, 0xe8, 0x77, 0x2e, 0x59, 0xa5, 0xaa, 0xc1, 0x6f, 0x76, 0x05, - 0x9c, 0x7d, 0x5d, 0xbe, 0xd3, 0xc5, 0xce, 0xd7, 0x90, 0x8a, 0x6b, 0xc5, - 0x6e, 0x81, 0x28, 0xf5, 0x78, 0x32, 0xd5, 0x75, 0x0a, 0x67, 0x81, 0xe5, - 0x15, 0xdd, 0x12, 0x2b, 0xd1, 0xce, 0x47, 0xc9, 0xe2, 0xf9, 0xd1, 0x83, - 0x45, 0xa0, 0x0a, 0x21, 0x05, 0x61, 0x7c, 0x4a, 0x89, 0x79, 0xee, 0x0a, - 0x6b, 0xc8, 0xce, 0x7f, 0x40, 0xdf, 0xdb, 0x87, 0xa8, 0xbf, 0x55, 0x37, - 0xe5, 0x09, 0xfa, 0x6f, 0xbf, 0xe3, 0x39, 0x88, 0xd8, 0x92, 0x6a, 0x38, - 0xa5, 0xc2, 0xf8, 0xf5, 0xb3, 0xc4, 0x57, 0x3f, 0x8a, 0x94, 0xd8, 0x50, - 0xee, 0xf3, 0x83, 0x1b, 0x89, 0x5f, 0x8b, 0x49, 0x48, 0x9b, 0x26, 0xac, - 0x54, 0xa8, 0x69, 0xba, 0x29, 0x15, 0x82, 0xa9, 0xcb, 0xdc, 0x8f, 0xe8, - 0x68, 0x95, 0xa6, 0xb1, 0x71, 0x14, 0x98, 0x23, 0x38, 0x9b, 0x23, 0xde, - 0xf6, 0x36, 0xf1, 0x90, 0x90, 0x63, 0xc4, 0x25, 0x81, 0x02, 0x81, 0x73, - 0x4c, 0x69, 0x00, 0xb1, 0x1e, 0xd0, 0x6a, 0xbb, 0x08, 0xc0, 0xc7, 0xcf, - 0x3d, 0x81, 0xd1, 0x46, 0xa5, 0x1e, 0xba, 0xbf, 0xe7, 0xda, 0x49, 0x33, - 0x2f, 0x1c, 0x81, 0xc3, 0xf0, 0x5e, 0x93, 0x2d, 0x2f, 0x5a, 0xa3, 0x6f, - 0x11, 0x01, 0x9e, 0xeb, 0xd4, 0x7f, 0xbc, 0x10, 0x7e, 0xe3, 0xf4, 0xc8, - 0x13, 0x8f, 0xbd, 0xca, 0xc0, 0xbb, 0x72, 0x9d, 0xde, 0x56, 0xa2, 0xb2, - 0x82, 0xfd, 0x74, 0xb4, 0x66, 0x9b, 0x3f, 0x33, 0x26, 0xeb, 0xe8, 0x93, - 0xdc, 0x86, 0x32, 0x90, 0xea, 0x94, 0x84, 0x27, 0x60, 0xfb, 0x2f, 0xc8, - 0x98, 0xad, 0x80, 0x12, 0x44, 0x27, 0xd0, 0x55, 0x41, 0x61, 0xa2, 0x79, - 0xb7, 0x81, 0xf3, 0x1e, 0x27, 0x76, 0x7f, 0xb6, 0xb1, 0x80, 0x0e, 0x0b, - 0xd3, 0xb4, 0x30, 0x74, 0x03, 0x7e, 0xbf, 0x9d, 0x8e, 0x9c, 0xf7, 0xcf, - 0x97, 0x4d, 0xbc, 0x23, 0xc1, 0x43, 0x39, 0xba, 0x27, 0x54, 0x4d, 0x13, - 0xc1, 0xfb, 0x33, 0x1e, 0xb5, 0x85, 0x89, 0x10, 0x6a, 0x8f, 0x7e, 0x71, - 0x41, 0xc3, 0x69, 0xf6, 0xab, 0x12, 0xc3, 0xd4, 0x99, 0x83, 0x73, 0xe0, - 0x8d, 0xc1, 0xab, 0xf6, 0x03, 0x0d, 0x48, 0x56, 0x79, 0x60, 0x0f, 0x68, - 0x17, 0x0a, 0x59, 0xc7, 0x26, 0x94, 0x3c, 0x66, 0x64, 0x73, 0xfd, 0xf5, - 0xa2, 0x4d, 0xf5, 0xe6, 0xff, 0xc0, 0xca, 0x38, 0xea, 0x24, 0x65, 0x0b, - 0xe2, 0xf8, 0xc6, 0x71, 0xa8, 0x01, 0xaa, 0xc9, 0x01, 0xab, 0x49, 0x09, - 0xe6, 0xd6, 0x38, 0xe8, 0x2f, 0xcc, 0x92, 0x17, 0x71, 0x13, 0x7d, 0x33, - 0x7a, 0x01, 0x22, 0xc8, 0x5e, 0x44, 0x1b, 0xdf, 0xa2, 0x62, 0x3c, 0xa0, - 0xc0, 0x1b, 0x40, 0x00, 0x1e, 0x75, 0x8d, 0xbc, 0x97, 0x61, 0x70, 0x7e, - 0x40, 0x22, 0x3d, 0x98, 0x53, 0x38, 0x54, 0x87, 0x7d, 0x5d, 0xff, 0x3f, - 0x75, 0x43, 0x65, 0x82, 0x69, 0xd1, 0xdc, 0x5d, 0x9a, 0x72, 0x37, 0xe5, - 0x4c, 0x98, 0xc3, 0xd5, 0x0e, 0x06, 0x74, 0x18, 0x5e, 0x5e, 0x87, 0x03, - 0x6f, 0x81, 0x8a, 0x9a, 0x08, 0x86, 0x91, 0x51, 0xd8, 0xa3, 0x13, 0xab, - 0xb2, 0xc5, 0x60, 0x49, 0xc5, 0x7f, 0x06, 0x3d, 0x24, 0xb9, 0x77, 0xe0, - 0x79, 0x34, 0x00, 0x49, 0x96, 0x2e, 0x78, 0x48, 0xde, 0xab, 0x70, 0x9c, - 0xad, 0x04, 0x3f, 0xa6, 0xcd, 0x9c, 0x1c, 0x15, 0xe3, 0xb9, 0xce, 0x14, - 0x0a, 0x9b, 0x57, 0xe0, 0x86, 0x72, 0xc0, 0xd3, 0xa0, 0x16, 0xbc, 0x98, - 0x8f, 0x7c, 0x8e, 0xff, 0x3c, 0x04, 0x26, 0x76, 0x9c, 0x25, 0xd4, 0xb3, - 0x18, 0xc2, 0xb5, 0xd3, 0x55, 0xd6, 0xb6, 0x74, 0x81, 0x6a, 0xa4, 0xd2, - 0xcb, 0xf9, 0x60, 0x17, 0xc5, 0xd4, 0xa8, 0x97, 0x8c, 0xf7, 0x8b, 0xdd, - 0xe8, 0x97, 0x18, 0xb5, 0x6c, 0xfd, 0xb6, 0x7f, 0x59, 0x89, 0x59, 0xf5, - 0xcd, 0xb7, 0x8a, 0x23, 0x5e, 0xa5, 0xeb, 0x5c, 0x5b, 0xbb, 0xa8, 0xd7, - 0xc4, 0xbe, 0x96, 0x54, 0x6b, 0x5a, 0x6b, 0xc5, 0x55, 0xde, 0x79, 0xd4, - 0x5d, 0x7b, 0x9a, 0x48, 0x4a, 0x59, 0x68, 0x11, 0x4e, 0xd7, 0x6f, 0x4d, - 0x80, 0x6e, 0x34, 0xef, 0x9c, 0x2a, 0xbf, 0xd2, 0xf1, 0x47, 0x5c, 0xe2, - 0xf6, 0xdd, 0xc2, 0x08, 0xcb, 0xbe, 0xae, 0xdf, 0xe1, 0x34, 0xf9, 0x81, - 0x83, 0x91, 0xa3, 0x7f, 0x07, 0xb0, 0x44, 0x23, 0x6e, 0xe1, 0x02, 0x16, - 0xa5, 0xbe, 0x9a, 0x98, 0x7d, 0xe1, 0xef, 0xd3, 0x09, 0x6d, 0xf6, 0x64, - 0xf5, 0x43, 0x8b, 0xe3, 0x52, 0x41, 0x11, 0x3f, 0x62, 0xa7, 0x52, 0xea, - 0x67, 0x83, 0x6d, 0xbc, 0x89, 0x29, 0x86, 0xb6, 0x97, 0xd0, 0x9e, 0x0f, - 0x76, 0x57, 0x8d, 0x83, 0x30, 0x05, 0x7f, 0x5b, 0x80, 0x19, 0xb5, 0xa5, - 0xc6, 0x2b, 0xe1, 0xd7, 0xa5, 0x95, 0x21, 0x95, 0xf9, 0x75, 0x81, 0x9b, - 0xfb, 0x47, 0x68, 0xc6, 0x76, 0xc6, 0xd3, 0x94, 0x21, 0xa0, 0x07, 0x51, - 0x09, 0x67, 0xa3, 0xc5, 0x1f, 0x50, 0xee, 0xdd, 0x97, 0x60, 0xeb, 0x80, - 0x65, 0xba, 0x96, 0x21, 0xdf, 0x42, 0xb7, 0x33, 0x99, 0x17, 0xd2, 0xb0, - 0x10, 0x41, 0xf7, 0x3b, 0x6b, 0x41, 0xa5, 0xa9, 0x32, 0xbc, 0x0f, 0x9e, - 0xcd, 0xfc, 0xd7, 0x8e, 0xa3, 0xa0, 0xa2, 0x3a, 0x7e, 0x75, 0x76, 0x6d, - 0x6b, 0xb6, 0x5a, 0xb1, 0x86, 0x86, 0xf6, 0x60, 0xc1, 0x20, 0xda, 0x72, - 0xe3, 0x53, 0x28, 0xe7, 0x61, 0x60, 0xc7, 0xc1, 0xbf, 0x98, 0x86, 0x53, - 0x51, 0x06, 0xee, 0x8b, 0x18, 0xca, 0xbd, 0x00, 0x79, 0xe2, 0x02, 0x73, - 0x2f, 0xa6, 0x43, 0xb6, 0x43, 0xc0, 0x27, 0x54, 0xaa, 0xce, 0x4e, 0x44, - 0x4d, 0xb5, 0x59, 0xd4, 0x2b, 0x4a, 0xef, 0x99, 0xda, 0xd4, 0x59, 0x9f, - 0xf5, 0x33, 0x3c, 0x66, 0x64, 0x6f, 0xfd, 0xf5, 0xa0, 0x4d, 0xf5, 0xe6, - 0xff, 0xc0, 0xca, 0x38, 0xea, 0x24, 0x65, 0x0b, 0xe2, 0xf8, 0xc6, 0x71, - 0xa8, 0x01, 0xaa, 0xc9, 0x01, 0xab, 0x49, 0x09, 0xe6, 0xd6, 0x38, 0xe8, - 0x2f, 0xcc, 0x92, 0x17, 0x71, 0x13, 0x7d, 0x33, 0x7a, 0x01, 0x22, 0xc8, - 0x5e, 0x44, 0x1b, 0xdf, 0xa2, 0x62, 0x3c, 0xa0, 0xc0, 0x1b, 0x40, 0x00, - 0x1e, 0x75, 0x8d, 0xbc, 0x97, 0x61, 0x70, 0x7e, 0x40, 0x22, 0x3d, 0x98, - 0x53, 0x38, 0x54, 0x87, 0x7d, 0x5d, 0xff, 0x3f, 0x75, 0x43, 0x65, 0x82, - 0x69, 0xd1, 0xdc, 0x5d, 0x9a, 0x72, 0x37, 0xe5, 0x53, 0xaa, 0x08, 0xfb, - 0x26, 0x98, 0x54, 0xc2, 0x03, 0x5a, 0xd7, 0x76, 0x69, 0x4a, 0x30, 0x98, - 0x08, 0x86, 0x91, 0x51, 0xd8, 0xa3, 0x13, 0xab, 0xb2, 0xc5, 0x60, 0x49, - 0xc5, 0x7f, 0x07, 0x25, 0xfd, 0xc4, 0x9e, 0x58, 0x01, 0xc1, 0x3e, 0x6a, - 0x33, 0x85, 0x80, 0x93, 0x12, 0x62, 0x0d, 0x45, 0xa0, 0x6e, 0x88, 0x0e, - 0xc6, 0x9b, 0x8f, 0xb2, 0xd8, 0x8a, 0x9a, 0xb5, 0x4b, 0xeb, 0xd3, 0x9e, - 0x86, 0x72, 0xc0, 0xd3, 0xa0, 0x16, 0xbc, 0x98, 0x8f, 0x7c, 0x8e, 0xfc, - 0x3c, 0x04, 0x2a, 0x0e, 0x9c, 0x25, 0xd4, 0xb3, 0x18, 0xc2, 0xb5, 0xd3, - 0x55, 0xd6, 0xb6, 0x74, 0x81, 0x6a, 0xa4, 0xd2, 0xcb, 0xf9, 0x60, 0x17, - 0xc5, 0xd4, 0xa8, 0x97, 0x8c, 0xf7, 0x8b, 0xdd, 0xe8, 0x97, 0x18, 0xb5, - 0x6c, 0xfd, 0xb6, 0x7f, 0x59, 0x89, 0x59, 0xf5, 0xcd, 0xb7, 0x8a, 0x23, - 0x5e, 0xa5, 0xeb, 0x5c, 0x23, 0xc4, 0x6a, 0x8b, 0xdc, 0x83, 0xe0, 0x3e, - 0x71, 0x44, 0x6d, 0x11, 0x61, 0xf4, 0xf3, 0xda, 0x1e, 0x1f, 0xc3, 0x1f, - 0xbe, 0x7c, 0xd1, 0x61, 0x82, 0xac, 0x4c, 0x75, 0x8c, 0xab, 0xf4, 0xb3, - 0x5f, 0xff, 0x8f, 0xd3, 0xea, 0xa1, 0x5e, 0x6e, 0xa9, 0xad, 0xe3, 0xef, - 0xb2, 0x55, 0xa4, 0xf5, 0x1d, 0x4d, 0x2f, 0xbb, 0xba, 0x77, 0x28, 0x3d, - 0xec, 0xad, 0xfd, 0x1d, 0x5e, 0xd1, 0x52, 0xe4, 0x43, 0x8a, 0x32, 0x07, - 0x6a, 0xb7, 0xdf, 0xad, 0xa6, 0x37, 0xb7, 0x9e, 0xe5, 0x3e, 0xb2, 0x80, - 0xd5, 0x69, 0xdf, 0x2c, 0x36, 0x9a, 0x43, 0x00, 0x41, 0x66, 0xbb, 0x61, - 0xe6, 0x08, 0xca, 0x68, 0x75, 0xd2, 0x12, 0xcb, 0x14, 0x62, 0x54, 0x20, - 0x8c, 0xe0, 0x51, 0x39, 0x06, 0xb2, 0x7b, 0x59, 0x6f, 0xbc, 0x21, 0xa9, - 0x99, 0xf7, 0x4f, 0xdc, 0x48, 0xd2, 0xc2, 0x77, 0x93, 0x74, 0x20, 0xae, - 0xb0, 0x50, 0x82, 0x25, 0x72, 0xee, 0xcc, 0x89, 0x22, 0xeb, 0x30, 0x33, - 0x38, 0xc3, 0xc9, 0xc1, 0x06, 0x56, 0xf9, 0x68, 0x59, 0x55, 0x13, 0x72, - 0x28, 0xfb, 0x78, 0x8f, 0xd4, 0x19, 0x4b, 0x95, 0x4a, 0x48, 0x74, 0xd3, - 0x35, 0x04, 0x0c, 0x0b, 0xdb, 0x99, 0xbe, 0xbf, 0x4a, 0xa0, 0x49, 0xcb, - 0x7f, 0xb9, 0x0a, 0x6f, 0xe3, 0xf2, 0xad, 0xa7, 0x73, 0x6f, 0xe3, 0x7d, - 0x21, 0xa0, 0x6b, 0xe4, 0x64, 0x45, 0x88, 0x73, 0x67, 0xbb, 0x8a, 0x93, - 0x8f, 0xd4, 0x1d, 0x5c, 0x73, 0xb1, 0xbc, 0xeb, 0x46, 0x3e, 0x83, 0x3b, - 0x0f, 0x8d, 0x8b, 0x80, 0x3c, 0x4e, 0x35, 0xbb, 0xab, 0xcc, 0xab, 0x83, - 0x3b, 0x31, 0x6c, 0x38, 0xf8, 0x5f, 0x54, 0x67, 0x60, 0xeb, 0x83, 0x3c, - 0x22, 0xc8, 0xfc, 0x09, 0xce, 0xdd, 0x8f, 0xbb, 0xef, 0x3e, 0xc0, 0x7b, - 0x10, 0x07, 0xb8, 0x11, 0x26, 0x71, 0xfd, 0x6e, 0x32, 0x61, 0x56, 0xf8, - 0xc4, 0x4a, 0x42, 0x03, 0x88, 0xad, 0xc3, 0x65, 0xe5, 0x81, 0x53, 0x22, - 0x3f, 0x7b, 0xb2, 0xb0, 0x99, 0x51, 0x4e, 0x19, 0x8a, 0xb0, 0x7b, 0xe6, - 0x64, 0x5c, 0x3b, 0x8e, 0x59, 0xd7, 0xe0, 0x69, 0x0b, 0x23, 0x14, 0x2d, - 0x36, 0x9c, 0x85, 0x5e, 0xf2, 0x54, 0x5a, 0xb6, 0x2a, 0xf2, 0x57, 0xb2, - 0x07, 0x69, 0x17, 0xdc, 0xae, 0x55, 0x8d, 0x3a, 0x26, 0xcb, 0x40, 0x51, - 0x47, 0x86, 0x50, 0xbb, 0x83, 0x3e, 0x96, 0x67, 0x2d, 0xf4, 0x0a, 0x1c, - 0x9c, 0x3b, 0xda, 0x04, 0xa7, 0x40, 0x77, 0x97, 0x87, 0xa1, 0xe8, 0xcc, - 0x6b, 0xa0, 0xa6, 0xa9, 0xe7, 0xa0, 0x9a, 0xe3, 0x14, 0x28, 0x69, 0x51, - 0xf5, 0x51, 0xe5, 0x19, 0x5e, 0xd8, 0x16, 0x9e, 0x80, 0x94, 0xd6, 0xd6, - 0x6b, 0xef, 0x25, 0x3a, 0x29, 0xa2, 0x5c, 0x63, 0x5e, 0xff, 0xac, 0xc7, - 0x2e, 0xb8, 0xd3, 0x79, 0x3e, 0x82, 0xfc, 0x24, 0x04, 0x74, 0xb5, 0xe9, - 0xeb, 0x22, 0x44, 0x53, 0x34, 0xc1, 0x57, 0xfa, 0x20, 0x61, 0xfd, 0xb2, - 0x67, 0x50, 0xd4, 0xc3, 0x5a, 0x37, 0x8b, 0x02, 0x49, 0x6b, 0x87, 0x43, - 0xb2, 0xdc, 0x60, 0x2f, 0x8a, 0x58, 0xad, 0xbd, 0x23, 0x95, 0x86, 0xc1, - 0xe7, 0x5b, 0x26, 0xda, 0x74, 0x6f, 0x8d, 0x49, 0xe2, 0x6b, 0x8c, 0x60, - 0xf0, 0x10, 0x6f, 0x70, 0xa5, 0x72, 0xe9, 0x4e, 0x11, 0x64, 0x25, 0x1f, - 0x41, 0x5e, 0x9f, 0x5c, 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, - 0x5e, 0x74, 0xf0, 0xa0, 0x76, 0x0a, 0xfd, 0x4a, 0x2d, 0x98, 0x2c, 0x91, - 0xbc, 0xe1, 0xb3, 0xe5, 0x2c, 0xeb, 0x6b, 0x67, 0xc1, 0xcb, 0xbe, 0x76, - 0xa0, 0x26, 0xf7, 0xd4, 0x9a, 0x2a, 0x1d, 0xf3, 0x93, 0x39, 0xa6, 0x6c, - 0x77, 0x59, 0x83, 0x31, 0x0b, 0xfa, 0xfd, 0x3a, 0x08, 0xc9, 0x68, 0xd6, - 0xa5, 0x77, 0x0b, 0x40, 0x23, 0x9a, 0x8d, 0xc9, 0x79, 0xc1, 0x87, 0x91, - 0xb6, 0x97, 0x03, 0x51, 0xbb, 0xf6, 0x70, 0x0a, 0x62, 0x96, 0xbf, 0x5a, - 0xfc, 0x1f, 0x92, 0x52, 0xd6, 0x29, 0xb0, 0xd6, 0x9e, 0x59, 0x1e, 0xfc, - 0x00, 0x29, 0xfe, 0x0f, 0x52, 0x91, 0x4d, 0xbc, 0xc7, 0x93, 0x4d, 0x46, - 0x6b, 0xad, 0x95, 0x55, 0x52, 0x18, 0x9e, 0x55, 0xe4, 0x59, 0x02, 0xff, - 0x41, 0xd2, 0xda, 0x86, 0x93, 0x57, 0xbb, 0xce, 0x81, 0x78, 0x13, 0xb9, - 0xde, 0x81, 0x67, 0xf8, 0x1f, 0x22, 0x74, 0xe7, 0xc0, 0x4c, 0x61, 0xd1, - 0x09, 0x43, 0x22, 0x3c, 0xfc, 0x00, 0x71, 0xa4, 0xaf, 0x26, 0xc9, 0x4c, - 0x84, 0xe4, 0x1b, 0x53, 0x0d, 0xae, 0x99, 0xff, 0x83, 0x7f, 0x67, 0xa4, - 0xeb, 0xa8, 0xaf, 0x27, 0x7a, 0xfc, 0x1e, 0x1b, 0x24, 0x71, 0xf7, 0xe6, - 0xdb, 0x7f, 0x4a, 0x8f, 0x20, 0x63, 0xf5, 0x6c, 0x44, 0xb8, 0xb2, 0x8d, - 0xd5, 0x37, 0x3a, 0xe3, 0x7a, 0x10, 0xb7, 0x64, 0xe6, 0xe1, 0xf9, 0x72, - 0x81, 0x23, 0x37, 0x89, 0x31, 0xb1, 0x21, 0x3a, 0x21, 0xcb, 0x82, 0x5d, - 0x97, 0xb5, 0x70, 0xa9, 0x8f, 0xfa, 0xb1, 0xfb, 0x4e, 0x03, 0xfb, 0xa7, - 0xbb, 0xab, 0x71, 0x93, 0xf7, 0x7b, 0xb8, 0x6c, 0xc8, 0xce, 0x40, 0x2d, - 0x8e, 0xa1, 0xb7, 0xd8, 0x56, 0x3b, 0xc5, 0xc2, 0x48, 0xb4, 0x7b, 0x81, - 0xf8, 0xbb, 0x0d, 0x0d, 0x50, 0x24, 0xbe, 0xcb, 0x38, 0xdb, 0x7d, 0x5e, - 0xc0, 0x4a, 0x6d, 0x6d, 0xe9, 0xfd, 0xd8, 0xac, 0xa2, 0xc6, 0xec, 0xcf, - 0xd4, 0x59, 0xb7, 0xf9, 0x90, 0x61, 0x21, 0x7d, 0xab, 0xad, 0xbf, 0x58, - 0x9e, 0x77, 0x05, 0xad, 0xab, 0x14, 0x66, 0x63, 0xf4, 0x04, 0x7c, 0x8d, - 0xdb, 0xc2, 0xa7, 0xa7, 0x23, 0x4e, 0x3f, 0x41, 0x5a, 0xed, 0xe8, 0xfa, - 0x40, 0xf8, 0x70, 0x4b, 0xb2, 0x66, 0xc5, 0x20, 0x44, 0x03, 0xe1, 0x14, - 0x59, 0xf3, 0x57, 0x61, 0x21, 0x43, 0x22, 0x2b, 0x5c, 0xea, 0xb9, 0x9a, - 0x1c, 0x0c, 0xe3, 0xce, 0xe1, 0x62, 0x5e, 0xef, 0xe7, 0x90, 0x7e, 0x6a, - 0x8c, 0x7e, 0xd4, 0xd8, 0x19, 0x7b, 0xc2, 0x5f, 0x2b, 0x99, 0xfb, 0x60, - 0x44, 0x25, 0xb8, 0x11, 0x7b, 0x28, 0x16, 0xfb, 0x81, 0xbd, 0x7e, 0xfc, - 0x01, 0x69, 0x27, 0xa9, 0x25, 0xa8, 0x69, 0x04, 0x87, 0xe1, 0x05, 0xda, - 0x52, 0xd6, 0x00, 0x17, 0x39, 0x64, 0x53, 0x3e, 0x75, 0x0c, 0x0b, 0x71, - 0xd1, 0x78, 0x7f, 0xe0, 0x51, 0xb1, 0xd9, 0xf6, 0x5a, 0x2d, 0x1d, 0x0c, - 0x75, 0x0e, 0xe8, 0x50, 0x84, 0xa9, 0xe8, 0xfb, 0xd8, 0xf0, 0xc5, 0x2d, - 0x58, 0xa0, 0xf2, 0xd4, 0x80, 0x01, 0x52, 0x6b, 0xf3, 0x8f, 0x3f, 0xe1, - 0x03, 0x44, 0x44, 0xd6, 0x14, 0x00, 0xb3, 0xfd, 0x18, 0x76, 0xf1, 0x70, - 0xaf, 0x79, 0xa5, 0xd0, 0x24, 0xcb, 0xd3, 0xd4, 0x76, 0xc2, 0x30, 0xe1, - 0xb4, 0xbb, 0x61, 0x7a, 0x18, 0x51, 0x73, 0x75, 0x39, 0x86, 0x56, 0x65, - 0xa5, 0xd0, 0xf8, 0x5a, 0x5f, 0x65, 0x77, 0xc0, 0x81, 0x78, 0x48, 0xf3, - 0x24, 0x3d, 0x13, 0xdc, 0x80, 0x34, 0x9f, 0x48, 0xe2, 0xd0, 0x22, 0x8e, - 0xd8, 0x58, 0xd6, 0x7d, 0x7a, 0x45, 0xe6, 0xcd, 0x68, 0x9b, 0xee, 0x9e, - 0xc0, 0x6c, 0x8e, 0x50, 0x02, 0x71, 0xe2, 0xc5, 0x16, 0xf5, 0x1b, 0x7f, - 0x98, 0x0e, 0x2e, 0x43, 0x3d, 0x99, 0xa3, 0xab, 0x91, 0xf9, 0x8a, 0xde, - 0x12, 0xc1, 0x2d, 0xda, 0x54, 0xcb, 0xbe, 0xda, 0xc4, 0x55, 0xe5, 0x4b, - 0xc6, 0x0b, 0x09, 0x77, 0x28, 0x3a, 0xec, 0x3c, 0x03, 0x03, 0x6f, 0x44, - 0xd5, 0x98, 0x44, 0x87, 0x5a, 0x25, 0x01, 0x4d, 0x5a, 0x08, 0x8c, 0x38, - 0xe8, 0xe0, 0xa7, 0x79, 0x0a, 0x0f, 0xd1, 0xd2, 0x32, 0x7d, 0xb6, 0xd2, - 0xcd, 0x8f, 0xb5, 0x19, 0x8b, 0x3f, 0x55, 0x25, 0xa0, 0x55, 0xc8, 0x0b, - 0x9f, 0x70, 0x8a, 0x6d, 0x19, 0x9e, 0xca, 0x81, 0x68, 0x14, 0xa0, 0xe7, - 0xe8, 0xd7, 0x16, 0x6c, 0x35, 0x1f, 0x32, 0x1a, 0xbc, 0x99, 0x58, 0x35, - 0x63, 0xe7, 0x5a, 0xd1, 0x75, 0x40, 0xe3, 0xb1, 0xae, 0x12, 0xe3, 0x2f, - 0xd2, 0x94, 0x43, 0x03, 0x05, 0x54, 0xd4, 0xc1, 0x84, 0x19, 0x02, 0x68, - 0xea, 0x38, 0xc8, 0x7a, 0x97, 0x47, 0x7d, 0x0e, 0x25, 0xf2, 0x03, 0x9c, - 0x56, 0x2c, 0x66, 0x11, 0xbc, 0x8c, 0x1f, 0x71, 0x0c, 0x97, 0x79, 0xe7, - 0xf8, 0x8b, 0x4d, 0x43, 0xa1, 0x96, 0x5a, 0xf1, 0x79, 0x70, 0xfd, 0x51, - 0x78, 0x7e, 0x97, 0x5d, 0x8e, 0xbc, 0x65, 0x05, 0x4f, 0x01, 0x3d, 0x69, - 0x9f, 0x4c, 0xc3, 0xda, 0x08, 0xfb, 0xd3, 0xb9, 0x98, 0x4a, 0x72, 0xa9, - 0x8b, 0x5e, 0xa1, 0x15, 0x03, 0xc4, 0x8a, 0x52, 0x5a, 0x1d, 0x17, 0xf5, - 0x4b, 0x7f, 0xaa, 0x9e, 0xe9, 0x4a, 0x02, 0x44, 0x35, 0x1f, 0x36, 0x0c, - 0x82, 0xe5, 0x62, 0x09, 0xf2, 0x7d, 0x38, 0xaf, 0x2f, 0xc0, 0xdf, 0x10, - 0x3a, 0xf5, 0x6f, 0xc4, 0xa0, 0x5b, 0x3c, 0xbe, 0x80, 0x07, 0xc2, 0xa1, - 0x1b, 0xf3, 0x9c, 0x09, 0x32, 0x21, 0x3a, 0x3d, 0x95, 0x7c, 0xc7, 0x9b, - 0xdd, 0x9a, 0x22, 0xe6, 0x27, 0x9b, 0xb8, 0xd0, 0x36, 0x3e, 0x9d, 0x3d, - 0xf2, 0x01, 0xd8, 0xe1, 0xc6, 0x3b, 0x10, 0x94, 0x82, 0x78, 0x4d, 0x67, - 0xf9, 0x7c, 0x87, 0x41, 0x49, 0x64, 0x19, 0xd9, 0x6d, 0x1c, 0x04, 0x77, - 0xc9, 0xb1, 0x5b, 0x59, 0x04, 0x39, 0x0c, 0xf1, 0x20, 0xbf, 0x28, 0x8b, - 0xc9, 0xc4, 0x58, 0xb4, 0x0e, 0x84, 0xb1, 0x65, 0xfd, 0x12, 0x07, 0xb6, - 0x0e, 0x91, 0xbb, 0xbf, 0x67, 0xe9, 0xc8, 0xb9, 0x42, 0x8a, 0xa9, 0xc3, - 0x2d, 0x8d, 0x78, 0xa8, 0x3c, 0xc5, 0xaf, 0x6a, 0x68, 0xb9, 0x76, 0xe9, - 0x21, 0x67, 0x5a, 0xde, 0xf6, 0x5b, 0x34, 0xb7, 0xa6, 0xa1, 0xc3, 0x2c, - 0x67, 0xfe, 0x67, 0xe7, 0x55, 0x63, 0xc3, 0x8b, 0x31, 0xe7, 0x1f, 0x0b, - 0x99, 0x60, 0xe8, 0xa0, 0xf1, 0x70, 0xbb, 0x39, 0x00, 0x76, 0xe3, 0x95, - 0x10, 0xe8, 0x9c, 0x75, 0x84, 0xc7, 0x67, 0x8f, 0xb2, 0x64, 0xa4, 0x78, - 0x35, 0xe5, 0xa0, 0xc8, 0x7b, 0xbb, 0x74, 0x29, 0xf5, 0xb6, 0x6c, 0xb7, - 0x57, 0x45, 0x51, 0x9f, 0x80, 0x29, 0x63, 0xf3, 0x12, 0xcc, 0xb0, 0x15, - 0xc3, 0xb2, 0x58, 0x49, 0x01, 0x67, 0x38, 0x61, 0x0a, 0xa9, 0x5a, 0x6f, - 0xf4, 0xf4, 0xdd, 0xdc, 0xa6, 0xb4, 0x98, 0x23, 0xc3, 0x0e, 0x6a, 0x6d, - 0x98, 0x35, 0x54, 0x1a, 0xf3, 0x40, 0x0a, 0x63, 0x8e, 0x15, 0xc5, 0x7e, - 0xa3, 0x78, 0xf5, 0x6d, 0x4f, 0x15, 0x6b, 0xb7, 0x17, 0xaf, 0xce, 0x23, - 0xe3, 0xc4, 0xb6, 0x73, 0x5e, 0xed, 0xa5, 0x15, 0x9c, 0x25, 0x76, 0x3f, - 0x20, 0x5b, 0x9f, 0x3f, 0xde, 0x9a, 0x21, 0xa5, 0xb3, 0x1a, 0xaf, 0x30, - 0x64, 0x87, 0x38, 0xaf, 0xf8, 0x84, 0x73, 0x67, 0xc7, 0x00, 0x5c, 0x45, - 0x41, 0x26, 0xcb, 0xf9, 0x3e, 0x89, 0x98, 0xc3, 0xea, 0x5c, 0x19, 0x2d, - 0x25, 0x1a, 0xbe, 0x8f, 0x1b, 0x9a, 0x4c, 0x61, 0xbe, 0x36, 0x64, 0xb4, - 0xfd, 0x33, 0x48, 0x21, 0xba, 0x5a, 0x4d, 0xb9, 0xce, 0x56, 0x18, 0xd9, - 0x3c, 0x8d, 0x4a, 0x6b, 0x29, 0x83, 0xdd, 0x84, 0x60, 0xfe, 0xc8, 0x87, - 0x57, 0x00, 0xdf, 0x71, 0xfd, 0x10, 0x6b, 0x85, 0xd9, 0xbd, 0xec, 0x7a, - 0xcd, 0x08, 0x53, 0x49, 0x3a, 0x63, 0x98, 0xa0, 0xd6, 0x95, 0x33, 0x19, - 0x56, 0x9a, 0x53, 0x73, 0xdc, 0xf8, 0xf7, 0xd7, 0x6c, 0x7e, 0x77, 0x84, - 0x63, 0x7e, 0x13, 0x95, 0x9a, 0x36, 0x17, 0xd8, 0xf6, 0x43, 0xd9, 0xd3, - 0x04, 0xbf, 0x31, 0x50, 0xb9, 0xc5, 0x48, 0xf3, 0xda, 0xb7, 0x04, 0xe3, - 0x18, 0x98, 0x40, 0x46, 0xb8, 0x6a, 0x9b, 0x06, 0xc0, 0x64, 0x72, 0x17, - 0x25, 0xd4, 0xdb, 0x2b, 0x45, 0xde, 0x41, 0xb4, 0x79, 0x3c, 0xd0, 0x58, - 0xd7, 0x6d, 0xb3, 0x03, 0x44, 0x3b, 0x75, 0xad, 0x3f, 0x1c, 0xf4, 0x7c, - 0x8f, 0xb5, 0x4a, 0x6d, 0x67, 0x91, 0xb4, 0xf4, 0xda, 0xd1, 0xde, 0xe1, - 0x9d, 0xfd, 0xf9, 0xdd, 0xe7, 0x2c, 0xec, 0x9a, 0x06, 0xce, 0x9f, 0xa2, - 0xf2, 0xb1, 0x33, 0xe4, 0xb4, 0x26, 0x8e, 0xa7, 0x5a, 0x54, 0xaf, 0xf6, - 0x63, 0x81, 0xfc, 0xf7, 0x9e, 0x13, 0x9f, 0x1b, 0xe0, 0xa1, 0x33, 0x31, - 0xdb, 0xe0, 0x49, 0x93, 0x60, 0x80, 0x11, 0xd0, 0x69, 0x22, 0x5d, 0x2c, - 0x26, 0xc6, 0xc9, 0x7b, 0x75, 0xa5, 0x9a, 0xa4, 0x89, 0xfe, 0x26, 0x66, - 0x7f, 0xb3, 0x3d, 0x04, 0x67, 0x8d, 0x69, 0x27, 0x4b, 0xd0, 0x97, 0x74, - 0x8f, 0x76, 0xa3, 0x24, 0x80, 0x5f, 0xb0, 0x75, 0xb5, 0x63, 0x93, 0x2d, - 0x01, 0xbb, 0xeb, 0x64, 0xad, 0x9b, 0x10, 0xb3, 0x6c, 0xeb, 0xdd, 0xa3, - 0xc5, 0x3a, 0xe2, 0xbf, 0x4e, 0x8d, 0x7e, 0x3d, 0xb4, 0x94, 0x5c, 0x3f, - 0x73, 0x4f, 0x70, 0x6e, 0xcd, 0xc0, 0x45, 0x08, 0xcb, 0xb3, 0x22, 0x9b, - 0xc3, 0xa3, 0x80, 0xc9, 0xd5, 0x0c, 0x16, 0xdd, 0x50, 0x79, 0xfe, 0xc3, - 0x95, 0x26, 0xfb, 0x8c, 0xb4, 0x90, 0xed, 0x47, 0xde, 0x8c, 0x89, 0xf2, - 0x5e, 0x34, 0x11, 0xe0, 0x83, 0x6b, 0x8f, 0x8a, 0xf3, 0x04, 0x23, 0x69, - 0x29, 0xc8, 0x6f, 0xb1, 0xf1, 0x5a, 0xb3, 0x37, 0xc9, 0xb3, 0xa3, 0xd5, - 0xe9, 0x23, 0x7b, 0x3b, 0xfb, 0x9c, 0x8a, 0xfc, 0x51, 0xb8, 0x23, 0xe9, - 0xfe, 0xac, 0x2e, 0x7e, 0xe1, 0x33, 0x4c, 0xec, 0x4d, 0x6c, 0xc0, 0x3f, - 0xd4, 0x33, 0x4c, 0xe0, 0xb5, 0xae, 0x47, 0x91, 0x09, 0x28, 0x58, 0x8d, - 0x1f, 0x12, 0xbb, 0x82, 0x4d, 0x0d, 0x4a, 0xc0, 0x7e, 0xd5, 0xf2, 0xda, - 0x1e, 0xf9, 0x43, 0x3b, 0xeb, 0x93, 0xe9, 0x68, 0x98, 0x80, 0x8f, 0x6a, - 0xa2, 0x55, 0x94, 0x7f, 0xf4, 0x03, 0x47, 0xa8, 0xa9, 0x28, 0x7f, 0x8b, - 0x5b, 0xfe, 0xb0, 0x8e, 0x91, 0x2b, 0x5f, 0x3e, 0x83, 0xc9, 0xe3, 0xbc, - 0x6e, 0x4f, 0x18, 0x92, 0x96, 0xa5, 0x4e, 0x71, 0x31, 0x8d, 0x02, 0x89, - 0x22, 0x6e, 0x54, 0xe6, 0x0e, 0x23, 0x0e, 0x84, 0x85, 0x06, 0x82, 0x56, - 0xca, 0x43, 0xf0, 0x0f, 0xe7, 0x4e, 0x87, 0xdf, 0xbf, 0xb2, 0x4c, 0xbe, - 0x6a, 0x9c, 0x90, 0xc6, 0x86, 0xb2, 0x0d, 0xc7, 0xaf, 0x43, 0x8c, 0x07, - 0x3a, 0x46, 0xa3, 0xb8, 0xff, 0xc7, 0x2e, 0xea, 0xa8, 0x61, 0xfc, 0xb4, - 0x8a, 0x05, 0x4e, 0x3f, 0xa3, 0x31, 0xf8, 0x4e, 0x87, 0x7b, 0xa9, 0xe0, - 0xdc, 0xab, 0x62, 0xf2, 0x2f, 0x46, 0xef, 0xd9, 0x42, 0x8f, 0xdd, 0x0a, - 0x11, 0x6c, 0xf1, 0x75, 0x73, 0x28, 0xf1, 0x4b, 0x18, 0x07, 0xf5, 0x44, - 0xf1, 0xf4, 0xef, 0xb2, 0x5f, 0x5b, 0x26, 0x83, 0xd9, 0x5a, 0x21, 0x5b, - 0xbf, 0x56, 0x25, 0xe0, 0x12, 0x2b, 0x46, 0x04, 0xdc, 0xbd, 0x10, 0xf0, - 0x4c, 0xfd, 0x82, 0x7a, 0x37, 0x05, 0x78, 0x6c, 0x5e, 0xfe, 0x4e, 0x5d, - 0x11, 0xae, 0x8f, 0x97, 0x98, 0x37, 0x15, 0x33, 0x82, 0x66, 0x85, 0xa6, - 0x0f, 0xd4, 0xa2, 0x86, 0xe4, 0x56, 0xd4, 0x2c, 0x33, 0xad, 0x4b, 0x92, - 0xc9, 0x49, 0xe9, 0x6a, 0x52, 0xea, 0x52, 0x9a, 0x73, 0x26, 0x3e, 0x12, - 0xbc, 0xc7, 0x59, 0x65, 0xf6, 0xb3, 0x33, 0x96, 0x13, 0xb2, 0x66, 0x07, - 0x21, 0x8a, 0x87, 0x5c, 0xf1, 0x48, 0x8e, 0x13, 0x41, 0x15, 0x5f, 0xf8, - 0xc1, 0xb1, 0x4d, 0x2b, 0x74, 0xf2, 0xcc, 0xa3, 0x0a, 0x01, 0xe5, 0xf4, - 0x4d, 0x9e, 0x89, 0x85, 0x9e, 0x0b, 0xa4, 0x00, 0xbb, 0x80, 0xff, 0x4d, - 0x20, 0xbd, 0x69, 0xeb, 0x4d, 0x36, 0xc8, 0xb2, 0xc5, 0x6d, 0xfa, 0x0c, - 0x7b, 0xcd, 0x2c, 0x8f, 0xed, 0x61, 0xce, 0x05, 0xd7, 0xd1, 0x51, 0xd7, - 0x20, 0x62, 0x12, 0x43, 0x95, 0x3e, 0xfa, 0x04, 0x4d, 0x89, 0x50, 0x24, - 0xe7, 0x63, 0x3f, 0x19, 0x88, 0x4d, 0x31, 0x84, 0x5c, 0x4a, 0x54, 0x87, - 0x35, 0x8e, 0x6d, 0x8a, 0x68, 0x81, 0xc7, 0xce, 0x98, 0x3f, 0xfc, 0x98, - 0xae, 0x87, 0x3e, 0xf6, 0x6a, 0x06, 0x63, 0x09, 0xf1, 0xee, 0xa3, 0xc4, - 0x1b, 0x71, 0x59, 0x1e, 0x1c, 0x8d, 0xbc, 0x65, 0x3c, 0x69, 0x8f, 0x42, - 0xb1, 0x08, 0x88, 0x0a, 0x05, 0x1a, 0xf7, 0xe4, 0xfc, 0x8e, 0xd4, 0x21, - 0x23, 0xfe, 0xc6, 0xa5, 0xab, 0xf7, 0x02, 0x7c, 0x3c, 0xe8, 0x99, 0x89, - 0x82, 0x35, 0x2b, 0xcb, 0x12, 0x77, 0xd6, 0x88, 0x55, 0x79, 0xb0, 0x3e, - 0x80, 0xdb, 0x2c, 0xdf, 0xc1, 0xa1, 0x15, 0x8c, 0xd1, 0x76, 0x4b, 0x48, - 0x90, 0xec, 0x98, 0x03, 0x37, 0x1e, 0x89, 0x09, 0x50, 0x6e, 0x50, 0x03, - 0xa7, 0x0c, 0xc4, 0x60, 0xf0, 0x63, 0x5e, 0xec, 0xb2, 0x9c, 0x3c, 0x6e, - 0x35, 0xd5, 0x2a, 0x8f, 0x2e, 0x2c, 0xdd, 0x70, 0x15, 0xf8, 0x6d, 0xa9, - 0x50, 0xe0, 0x8a, 0x30, 0x59, 0xaa, 0xc1, 0x0b, 0x0d, 0x8b, 0x49, 0xb5, - 0xd9, 0x09, 0x4e, 0x0b, 0xa5, 0xfb, 0x6b, 0x30, 0x21, 0x62, 0x60, 0xe6, - 0x43, 0xd2, 0xec, 0x73, 0x57, 0x5f, 0x26, 0x36, 0x0c, 0xf0, 0x99, 0xc4, - 0x55, 0x93, 0x50, 0xbc, 0xb7, 0xe0, 0xd8, 0x92, 0xf7, 0x33, 0xfa, 0x74, - 0x2d, 0x34, 0x6a, 0xb4, 0xd2, 0x17, 0xbf, 0xae, 0xc7, 0x77, 0x1b, 0xd6, - 0x30, 0x8f, 0x2c, 0xe7, 0x5d, 0x21, 0x66, 0x74, 0xde, 0x21, 0xae, 0x22, - 0xb1, 0xfa, 0xf7, 0x9f, 0xb4, 0x00, 0x80, 0x69, 0xd6, 0x8e, 0x90, 0x91, - 0x4d, 0xd6, 0xdd, 0x42, 0x6b, 0x03, 0xb0, 0xe6, 0x04, 0xbf, 0xa0, 0xb8, - 0xad, 0xb8, 0x0e, 0x8f, 0x21, 0xee, 0xe1, 0xf1, 0xe0, 0xc2, 0xf9, 0x0a, - 0x8f, 0xd5, 0x2f, 0xa5, 0xda, 0xee, 0x32, 0x06, 0xa6, 0x11, 0x7e, 0x8e, - 0xdd, 0xcf, 0x76, 0x23, 0x37, 0x35, 0x5b, 0xf3, 0x35, 0xdb, 0x9f, 0x4e, - 0x9a, 0xb8, 0x2c, 0xef, 0x4f, 0xde, 0x30, 0xae, 0xb1, 0x8f, 0x86, 0xb5, - 0x37, 0x47, 0x9d, 0x1f, 0x8a, 0x1a, 0xee, 0xf9, 0xfb, 0x0d, 0x69, 0x54, - 0x6b, 0x9f, 0x5d, 0x95, 0x07, 0x85, 0xd2, 0x91, 0xa5, 0x90, 0x6d, 0xc9, - 0x72, 0xd3, 0xae, 0x1f, 0x62, 0x26, 0x11, 0x5e, 0x98, 0x5a, 0x2f, 0x06, - 0xea, 0x66, 0xf3, 0x07, 0x54, 0x39, 0x3d, 0x39, 0x51, 0xb9, 0x12, 0xa6, - 0x2e, 0xff, 0x4a, 0x2c, 0x9a, 0x22, 0x10, 0x57, 0x61, 0xc2, 0xa0, 0x05, - 0x9c, 0x32, 0x2d, 0xe0, 0x7d, 0x96, 0x57, 0xa0, 0x45, 0xa8, 0xaa, 0xaf, - 0x1d, 0x57, 0x39, 0x54, 0x6c, 0xe3, 0xae, 0x3e, 0xa1, 0xe0, 0xff, 0x1a, - 0x71, 0x38, 0x89, 0x57, 0x8b, 0x44, 0xc1, 0xd3, 0xd4, 0x7b, 0xda, 0xc2, - 0x26, 0x39, 0xef, 0x4e, 0x1a, 0x99, 0x0b, 0x93, 0x69, 0x13, 0x72, 0x39, - 0x17, 0xf5, 0x01, 0x24, 0xe2, 0x4a, 0x91, 0xea, 0xb7, 0x4f, 0x77, 0xcc, - 0x11, 0xe5, 0x69, 0x80, 0x28, 0x28, 0x62, 0x3f, 0x19, 0x72, 0x7b, 0x84, - 0xa9, 0x58, 0x42, 0xc6, 0x1c, 0xf0, 0x4e, 0x21, 0xfc, 0x88, 0x4a, 0xac, - 0xad, 0xc9, 0x28, 0x56, 0x70, 0xd6, 0x4d, 0x8b, 0x5f, 0xb0, 0x70, 0xda, - 0x3c, 0xd3, 0x6b, 0x95, 0x94, 0x86, 0xa2, 0x85, 0x2e, 0x2a, 0xd0, 0xd5, - 0x5f, 0xd0, 0x26, 0xca, 0xd6, 0x3d, 0x38, 0x97, 0xa2, 0x43, 0x83, 0x6b, - 0xac, 0x74, 0x8d, 0xaa, 0x64, 0x60, 0xc8, 0x20, 0xec, 0x49, 0x1c, 0x98, - 0x4b, 0xbc, 0x3a, 0x29, 0x53, 0x31, 0x7a, 0xef, 0x63, 0x68, 0x0b, 0x65, - 0xa8, 0xaa, 0x27, 0xcd, 0x7f, 0x14, 0x1d, 0x8b, 0x09, 0x62, 0xfe, 0x55, - 0x4f, 0x32, 0x38, 0x60, 0xa2, 0xdf, 0x9d, 0xdf, 0x35, 0xdc, 0xbf, 0x77, - 0x4d, 0x99, 0x3d, 0x25, 0x44, 0x64, 0xe5, 0x40, 0x52, 0x3c, 0xf8, 0xc9, - 0x48, 0xbc, 0x97, 0x94, 0x5a, 0x72, 0x78, 0xbc, 0x21, 0x21, 0x1c, 0x71, - 0xc8, 0xfa, 0xce, 0x5a, 0x0c, 0xe4, 0xa8, 0xcc, 0x52, 0x4f, 0xb0, 0xa1, - 0x0a, 0x39, 0xd0, 0x07, 0xf1, 0xf1, 0xd7, 0x06, 0x38, 0xb3, 0x7b, 0xa1, - 0xb8, 0x50, 0x02, 0xab, 0x69, 0xb5, 0xa1, 0x25, 0x9b, 0x29, 0x2a, 0xe0, - 0x39, 0xab, 0x3e, 0xcb, 0xeb, 0xd6, 0x2f, 0xe5, 0x93, 0xa3, 0x9c, 0xb9, - 0x3a, 0x2a, 0xc1, 0x59, 0xcb, 0xbe, 0x92, 0x70, 0xe2, 0xde, 0x20, 0x90, - 0x27, 0x26, 0x65, 0x80, 0x6c, 0x02, 0xd6, 0x76, 0xf6, 0x64, 0x79, 0xb6, - 0x5c, 0xfd, 0x71, 0x92, 0x28, 0xc8, 0x9b, 0xd3, 0xe8, 0xab, 0x57, 0xe6, - 0xed, 0xcb, 0x41, 0x82, 0xed, 0xf7, 0xa2, 0x83, 0x8b, 0x0c, 0xd4, 0x2d, - 0x35, 0xdf, 0x1d, 0xbb, 0x9b, 0x0e, 0x3f, 0x49, 0xf6, 0xb0, 0x2b, 0x66, - 0x6e, 0xac, 0x06, 0xe9, 0x13, 0x1e, 0x4a, 0x2e, 0x17, 0x64, 0xec, 0x59, - 0xbb, 0xb6, 0x7f, 0x7c, 0x2d, 0xa6, 0xe2, 0x72, 0xc2, 0xa8, 0xcd, 0x9d, - 0x9e, 0xf7, 0x0b, 0x8d, 0x35, 0x3b, 0x7c, 0x69, 0x6a, 0xd2, 0xa6, 0xd8, - 0x4f, 0xb1, 0x13, 0x44, 0x33, 0xa5, 0xb2, 0x5c, 0xff, 0xf7, 0x30, 0x51, - 0xdb, 0x98, 0xb0, 0x4e, 0xbe, 0xc2, 0x58, 0xbf, 0x89, 0x44, 0xf2, 0x9f, - 0x78, 0x85, 0xd7, 0x68, 0x03, 0xa4, 0xd4, 0x6d, 0x8e, 0xf3, 0xce, 0xcd, - 0x81, 0x46, 0x15, 0x4f, 0x35, 0x2c, 0xc7, 0x00, 0xc1, 0x82, 0xc4, 0xbe, - 0xa9, 0x3d, 0x78, 0xcb, 0xc2, 0x35, 0xd5, 0xce, 0xd2, 0x3f, 0x7c, 0x92, - 0xe5, 0x3a, 0x33, 0xd3, 0x5c, 0x3f, 0x56, 0x88, 0x6e, 0xe0, 0x50, 0xab, - 0x18, 0xe0, 0xc2, 0x91, 0x0b, 0xc1, 0x6a, 0xb1, 0xce, 0x75, 0xe6, 0xbf, - 0x29, 0x85, 0x3b, 0x28, 0xfa, 0xcb, 0x1d, 0xbd, 0x6f, 0xf0, 0x18, 0x28, - 0xd5, 0x52, 0x7d, 0x04, 0xfb, 0x70, 0x20, 0xae, 0x15, 0xfb, 0x44, 0xa8, - 0x13, 0xa7, 0x93, 0x0a, 0x39, 0xd9, 0x51, 0xee, 0xff, 0xb5, 0x49, 0x47, - 0xf5, 0x4c, 0x45, 0xf4, 0x6b, 0x64, 0xc8, 0x7c, 0x72, 0x21, 0x5f, 0x45, - 0xea, 0xc8, 0x6c, 0x08, 0xcb, 0x86, 0x8b, 0x34, 0x6f, 0x1d, 0x6d, 0xaf, - 0xf2, 0x69, 0xf0, 0x98, 0x98, 0xde, 0x92, 0xbf, 0x8c, 0x2a, 0x7f, 0xf1, - 0x8b, 0x17, 0xba, 0x83, 0x87, 0xc3, 0x1a, 0x1e, 0x4f, 0xf5, 0x07, 0x68, - 0x9b, 0x75, 0xdf, 0x7f, 0x1b, 0x55, 0xfb, 0xe1, 0x31, 0x29, 0x5f, 0x40, - 0xf7, 0xae, 0x67, 0xeb, 0xf2, 0xfc, 0x94, 0x03, 0xb2, 0x7f, 0xd1, 0xd7, - 0x68, 0xaa, 0x5b, 0xfc, 0x80, 0xcf, 0x64, 0xbc, 0xea, 0xe3, 0x7a, 0x0f, - 0x75, 0xfd, 0x35, 0xb1, 0xde, 0xad, 0xac, 0x0b, 0xe8, 0x68, 0xca, 0xd1, - 0x1b, 0x3e, 0xb4, 0x2d, 0xb3, 0x22, 0xfb, 0x53, 0xc4, 0x1e, 0x50, 0x92, - 0xc0, 0x53, 0x74, 0xa1, 0x95, 0x41, 0x3d, 0xab, 0xec, 0xc3, 0x17, 0x89, - 0xd4, 0xf6, 0xc9, 0x14, 0x06, 0xa3, 0xba, 0x39, 0x9b, 0x6c, 0xd0, 0xdf, - 0x4e, 0xe0, 0x66, 0x58, 0x98, 0x94, 0x47, 0x05, 0x37, 0x51, 0x61, 0x6c, - 0x76, 0x41, 0x8b, 0x4d, 0x2a, 0x5a, 0x43, 0x76, 0x59, 0xe1, 0xba, 0x48, - 0x0a, 0x71, 0xa9, 0xd5, 0x44, 0xc9, 0xf1, 0x6c, 0x9c, 0xde, 0xe3, 0x9e, - 0xed, 0x11, 0x52, 0xa7, 0xab, 0x48, 0xca, 0x57, 0x6b, 0xf0, 0xc7, 0xa9, - 0x22, 0x2c, 0x37, 0x3f, 0x12, 0xb3, 0x72, 0x99, 0x8f, 0x3b, 0x0d, 0x86, - 0x4c, 0x76, 0x1b, 0x0c, 0x93, 0x74, 0x17, 0xf9, 0xa3, 0x80, 0x34, 0x05, - 0x7a, 0x14, 0x9b, 0xe5, 0xb5, 0x76, 0xc6, 0xfa, 0x20, 0x0d, 0x7d, 0x97, - 0x92, 0x3d, 0x8e, 0xb4, 0xa7, 0x43, 0x86, 0xec, 0xba, 0x5b, 0x30, 0xb4, - 0x28, 0xac, 0x7f, 0x95, 0xd6, 0x89, 0xcb, 0x73, 0xca, 0xe9, 0xe7, 0x2a, - 0x23, 0x80, 0xc4, 0x00, 0x3a, 0x75, 0x53, 0x5a, 0x53, 0x97, 0x44, 0x4f, - 0xc1, 0xa1, 0x88, 0xe0, 0xfa, 0x3c, 0xd3, 0xb4, 0xd8, 0x43, 0x94, 0x57, - 0x14, 0xc1, 0x98, 0x12, 0x7f, 0x21, 0x70, 0xcb, 0x28, 0x9c, 0x99, 0x7d, - 0xeb, 0x85, 0x6f, 0x15, 0x3f, 0xa5, 0x5b, 0x99, 0x13, 0xa3, 0xae, 0x92, - 0xa2, 0x4e, 0xa8, 0xb5, 0x3f, 0x6f, 0x68, 0x70, 0xbf, 0x5a, 0xd8, 0x49, - 0xbc, 0x55, 0xdf, 0x2f, 0xc6, 0x4c, 0x08, 0xed, 0xdb, 0xaf, 0x7c, 0x57, - 0x6b, 0xcd, 0xdf, 0x5f, 0x3b, 0x02, 0x68, 0xee, 0xed, 0xe1, 0x65, 0x4b, - 0x0e, 0xc5, 0xf5, 0x1d, 0x2e, 0x16, 0xb3, 0xa4, 0x3c, 0x2d, 0x0a, 0x50, - 0xd8, 0xd8, 0x18, 0x31, 0x25, 0x81, 0xa0, 0xf4, 0x15, 0x0e, 0xc8, 0x21, - 0x65, 0xd8, 0x85, 0x73, 0x1a, 0x8c, 0xf2, 0xe6, 0x2d, 0x7b, 0x73, 0xc2, - 0x63, 0x6c, 0x5a, 0xcf, 0xa7, 0x9f, 0x1d, 0x01, 0x70, 0x7a, 0xeb, 0x29, - 0xc7, 0xbc, 0x60, 0x81, 0xdd, 0x0b, 0x69, 0xea, 0x32, 0x82, 0x91, 0x1d, - 0x07, 0xd8, 0x1f, 0x83, 0x13, 0x45, 0x69, 0xf2, 0x6e, 0x54, 0xc3, 0x3b, - 0xb9, 0xb6, 0xad, 0x77, 0x96, 0x52, 0x69, 0xaf, 0x6e, 0x4e, 0x1f, 0xd4, - 0x73, 0xd6, 0x5c, 0x75, 0x0f, 0x99, 0x4a, 0x52, 0xcb, 0xaa, 0x0c, 0x74, - 0x12, 0x92, 0x77, 0xb7, 0xa5, 0xe0, 0x84, 0x2a, 0xd4, 0x75, 0x6a, 0x4a, - 0xdc, 0x32, 0x14, 0xc5, 0x5b, 0x4c, 0x00, 0x90, 0x73, 0xf6, 0x6b, 0x92, - 0xe7, 0x74, 0x0d, 0x8d, 0x31, 0x05, 0xe3, 0xd7, 0x2b, 0xd1, 0xf0, 0xd7, - 0xb5, 0x98, 0x11, 0x4a, 0x5f, 0x1f, 0xaa, 0x28, 0xd6, 0x7b, 0x2a, 0x00, - 0x5d, 0x63, 0x0e, 0xd4, 0xb0, 0x94, 0x42, 0x43, 0xb4, 0x09, 0x0e, 0xbe, - 0x2e, 0x47, 0x66, 0x3a, 0xca, 0x4e, 0x8d, 0xd4, 0xd1, 0x66, 0x2d, 0xbe, - 0x4f, 0xc3, 0xbb, 0x7d, 0xd3, 0xd9, 0xb7, 0x5a, 0x77, 0x2b, 0x6e, 0x04, - 0x1b, 0x3c, 0x01, 0xdb, 0x63, 0x4c, 0x37, 0xe2, 0xb5, 0x82, 0x2f, 0xe7, - 0x34, 0xc9, 0xee, 0x3c, 0x96, 0x84, 0x70, 0xad, 0x1a, 0x7d, 0x1e, 0xfb, - 0x05, 0xeb, 0x20, 0xba, 0x3e, 0x38, 0xdf, 0xa1, 0xf2, 0x19, 0x7f, 0x91, - 0x1b, 0x1b, 0x47, 0x74, 0x47, 0xcd, 0x92, 0x4d, 0xd8, 0x9a, 0x94, 0x63, - 0xd8, 0x13, 0xa1, 0x51, 0xfe, 0x5a, 0xa3, 0x50, 0xab, 0xb1, 0x2a, 0x03, - 0x9a, 0xbe, 0x49, 0x9e, 0x7f, 0xcb, 0x63, 0x67, 0xd5, 0xff, 0xea, 0x82, - 0x79, 0xf3, 0x16, 0x0d, 0x65, 0x49, 0xe6, 0x80, 0x4e, 0x72, 0x81, 0xa7, - 0x35, 0x05, 0x60, 0xf8, 0x4d, 0x17, 0x89, 0x1a, 0xd3, 0xb1, 0xc4, 0xcb, - 0x0a, 0xb5, 0x4f, 0x50, 0x91, 0x52, 0x45, 0xec, 0x9d, 0xbd, 0x96, 0xcd, - 0x52, 0xf1, 0x70, 0xac, 0x98, 0x9c, 0xc7, 0x25, 0xc2, 0x69, 0xf0, 0x96, - 0x91, 0x22, 0x96, 0x20, 0x32, 0x46, 0xd5, 0x95, 0xcb, 0xd4, 0x13, 0x34, - 0xb1, 0x77, 0x7f, 0x12, 0x4c, 0x1b, 0x59, 0x16, 0x31, 0x48, 0x55, 0xf7, - 0x36, 0xba, 0xcb, 0xfd, 0xee, 0x5d, 0x33, 0x9b, 0xd4, 0x11, 0x68, 0x5f, - 0x85, 0x7c, 0xec, 0x4b, 0xa2, 0xe0, 0x0c, 0x67, 0x9b, 0x72, 0xec, 0x75, - 0x6e, 0x16, 0x5a, 0x9a, 0x95, 0x00, 0x6b, 0x63, 0xf2, 0xac, 0x94, 0x78, - 0x89, 0x89, 0x41, 0x24, 0xd5, 0x22, 0x63, 0xd8, 0xa6, 0x9e, 0x76, 0x2a, - 0x5f, 0x8f, 0x96, 0x50, 0xb9, 0xcf, 0x69, 0xb1, 0x33, 0x25, 0xe1, 0x63, - 0xcc, 0x90, 0x96, 0x26, 0xa4, 0xcc, 0xc0, 0x64, 0xc7, 0x37, 0x77, 0xb5, - 0x5f, 0x1d, 0xcf, 0xb3, 0x4f, 0x26, 0x3b, 0x7d, 0xe8, 0xe0, 0xab, 0x42, - 0x33, 0xf6, 0x1f, 0x1e, 0x2e, 0xd5, 0xc5, 0x57, 0xf9, 0x2d, 0x33, 0x21, - 0x30, 0x90, 0xf7, 0xa4, 0x31, 0xbd, 0x18, 0x4b, 0x2a, 0x5c, 0xaf, 0x8e, - 0xc2, 0xc1, 0xe6, 0x36, 0x53, 0xad, 0x7c, 0xac, 0x1f, 0x79, 0x34, 0x58, - 0x45, 0x53, 0xd4, 0x3b, 0x74, 0xca, 0xa9, 0x7a, 0x64, 0x97, 0x0c, 0xa6, - 0x88, 0x2b, 0xaf, 0xa2, 0xf2, 0xdb, 0x56, 0x5b, 0x26, 0xd1, 0x44, 0x8a, - 0x33, 0x34, 0xde, 0xed, 0xa3, 0xb2, 0x86, 0x9d, 0xd4, 0x01, 0xd9, 0x12, - 0x54, 0x18, 0x8d, 0x56, 0xac, 0x5d, 0x91, 0xbd, 0x47, 0xfd, 0x0a, 0xd1, - 0x99, 0xef, 0x13, 0xe1, 0x58, 0xf3, 0xd9, 0x2d, 0x17, 0x6b, 0x25, 0xae, - 0xc6, 0xbe, 0xe8, 0xe1, 0xa0, 0x9d, 0x6e, 0x89, 0x62, 0xb2, 0xf0, 0x8c, - 0x21, 0x3b, 0xa5, 0xf2, 0xde, 0x8f, 0x61, 0x46, 0x6a, 0xa1, 0x95, 0x21, - 0xad, 0x58, 0x93, 0x5d, 0x50, 0xf5, 0x04, 0xfb, 0x53, 0xc9, 0x50, 0x02, - 0x9c, 0x7c, 0x56, 0xc8, 0x1b, 0x0a, 0x40, 0x43, 0xba, 0x7f, 0x1d, 0x19, - 0xc6, 0xf2, 0x8b, 0xc9, 0xec, 0xea, 0xdf, 0x73, 0x57, 0x7c, 0xef, 0xf5, - 0xcb, 0x48, 0x12, 0x7c, 0xc2, 0x10, 0x74, 0xa1, 0xb4, 0xad, 0x52, 0x83, - 0xb1, 0x29, 0x6c, 0x29, 0x59, 0x1f, 0xf1, 0x0a, 0x09, 0xa7, 0x64, 0xd4, - 0x12, 0x6d, 0x5b, 0x59, 0x78, 0x07, 0xdb, 0x47, 0xaa, 0x62, 0xa5, 0x74, - 0x4b, 0xab, 0x57, 0x15, 0xd9, 0xee, 0xb4, 0x9d, 0x2f, 0xbc, 0x0a, 0x04, - 0xfb, 0xa8, 0xc6, 0xa5, 0x9d, 0xd5, 0xae, 0x4e, 0x37, 0x97, 0xa4, 0x39, - 0x75, 0xfd, 0xb4, 0x7a, 0x79, 0x68, 0xfd, 0x13, 0x38, 0xbf, 0x05, 0xa2, - 0xae, 0x5e, 0x35, 0x76, 0x3c, 0x23, 0x0d, 0x20, 0xf2, 0x1f, 0xcc, 0xee, - 0xda, 0xab, 0x2a, 0xb1, 0x6c, 0x8b, 0x54, 0xbb, 0xda, 0x95, 0xb1, 0x70, - 0x5e, 0xec, 0xa1, 0xa1, 0xf9, 0xde, 0x13, 0x27, 0x00, 0x08, 0x7f, 0xb1, - 0xdd, 0xf1, 0xe3, 0x7e, 0x2a, 0xe0, 0x8f, 0xed, 0x61, 0x47, 0xde, 0xd7, - 0xf0, 0x1c, 0xd3, 0xe0, 0x10, 0xb5, 0x52, 0xe7, 0xac, 0x5f, 0xdf, 0xbd, - 0x2b, 0xb3, 0x0a, 0xe8, 0x1d, 0x97, 0xbf, 0xf7, 0x9f, 0xf6, 0xc6, 0x1e, - 0xdd, 0xd5, 0x5a, 0x2f, 0x92, 0x4e, 0xe3, 0x80, 0xc2, 0x73, 0x28, 0x1c, - 0xfe, 0x67, 0x85, 0xfb, 0x9f, 0x78, 0x1d, 0xd5, 0xaf, 0x69, 0x5c, 0xa4, - 0x25, 0x83, 0xe6, 0x7f, 0xd9, 0x45, 0x93, 0x44, 0x18, 0x82, 0x83, 0x01, - 0x52, 0x47, 0x23, 0xf6, 0x33, 0x40, 0xbd, 0x5f, 0xc8, 0x9b, 0x33, 0xb3, - 0x82, 0x7e, 0x07, 0x36, 0xdb, 0xf2, 0x6e, 0xfe, 0xfc, 0xac, 0x95, 0x4f, - 0x07, 0x59, 0x3a, 0x5c, 0xc1, 0xe3, 0xc8, 0x11, 0x4d, 0x86, 0xf6, 0xd9, - 0x1f, 0x32, 0x3a, 0x73, 0x1a, 0x56, 0x15, 0xa4, 0x46, 0x5a, 0x05, 0x22, - 0xe8, 0x36, 0xf3, 0xa0, 0x0a, 0xc5, 0x4c, 0xeb, 0x64, 0x1a, 0x8b, 0x74, - 0x85, 0x1d, 0x96, 0x60, 0x4c, 0xe6, 0xe3, 0x1a, 0xff, 0xf7, 0x3c, 0x56, - 0x6e, 0x12, 0x05, 0x52, 0x2b, 0xd3, 0xc7, 0x81, 0xbd, 0x4f, 0x52, 0xef, - 0x87, 0xd8, 0x4a, 0xf3, 0x5e, 0x5e, 0xbc, 0x8d, 0xbd, 0xbf, 0xe0, 0xff, - 0x78, 0x28, 0x25, 0x49, 0xeb, 0x99, 0x82, 0x12, 0xd8, 0x98, 0xd2, 0x5b, - 0x85, 0x53, 0x1b, 0xbf, 0xa4, 0x14, 0x43, 0x4f, 0x42, 0x7e, 0x38, 0x15, - 0xd8, 0x12, 0x3a, 0x40, 0x4e, 0xa9, 0xdf, 0xaa, 0x6a, 0x7c, 0x1a, 0xaf, - 0x5c, 0x45, 0xd3, 0xa2, 0x47, 0x4a, 0x00, 0xd2, 0x20, 0x74, 0x1b, 0x67, - 0x9e, 0xd7, 0x5d, 0xc8, 0x85, 0x18, 0xe3, 0xe4, 0x16, 0x6c, 0xbb, 0xf3, - 0x5e, 0xfa, 0x41, 0xa7, 0x62, 0x4d, 0x5a, 0xcc, 0xaa, 0xe8, 0x60, 0x35, - 0x54, 0xa1, 0x3e, 0x53, 0xb3, 0x18, 0x6e, 0xa2, 0x48, 0xbf, 0x08, 0xb9, - 0xbe, 0x79, 0x72, 0x9b, 0x96, 0x1a, 0x99, 0x3d, 0x28, 0xcc, 0x01, 0xfa, - 0x34, 0x63, 0x78, 0xc2, 0xcd, 0xd2, 0x07, 0xec, 0xf4, 0xc3, 0x4c, 0xec, - 0x6f, 0xdd, 0xbc, 0xaf, 0xb4, 0xa0, 0x9b, 0x14, 0x3c, 0x44, 0x03, 0xc4, - 0x15, 0x29, 0x9e, 0x85, 0xea, 0xa2, 0xcd, 0xe1, 0x77, 0x1d, 0x86, 0x40, - 0x12, 0x65, 0xd9, 0x69, 0x48, 0x07, 0x11, 0x6e, 0xd6, 0x8f, 0x48, 0x22, - 0xdc, 0xd7, 0x5a, 0xe7, 0xbc, 0x33, 0x29, 0xcc, 0xcc, 0x9f, 0xc8, 0xc0, - 0x14, 0xbe, 0xf2, 0x50, 0x14, 0xa2, 0xf3, 0x16, 0x6f, 0x9b, 0x49, 0x41, - 0xad, 0xc2, 0xd5, 0x59, 0x69, 0xbc, 0xe5, 0xb9, 0x05, 0xb5, 0x0d, 0xf4, - 0x5d, 0x5f, 0x55, 0x21, 0x4d, 0xb0, 0x84, 0x34, 0x39, 0xff, 0x5f, 0x12, - 0xbe, 0xf5, 0x24, 0xac, 0x80, 0x38, 0x71, 0xf2, 0xe9, 0x0f, 0x64, 0x76, - 0x06, 0xdf, 0x29, 0xc0, 0xfd, 0xd8, 0x62, 0xe4, 0xeb, 0xf7, 0x96, 0x81, - 0x09, 0x6b, 0x5f, 0xfd, 0x30, 0xfc, 0xd4, 0xb9, 0x63, 0x73, 0xf7, 0x7c, - 0xe7, 0xac, 0x29, 0xe5, 0x46, 0xd4, 0x40, 0xb6, 0xeb, 0x65, 0xf4, 0xf5, - 0xd7, 0xc4, 0x19, 0x80, 0xed, 0xc1, 0x55, 0x87, 0x38, 0xb6, 0xfc, 0x57, - 0x11, 0xb1, 0xfc, 0x2e, 0x1c, 0x0e, 0x24, 0x96, 0x2d, 0xd5, 0x9e, 0x10, - 0x06, 0xb1, 0xa2, 0x93, 0x15, 0x84, 0xb3, 0x6e, 0x79, 0x1f, 0x1d, 0xcd, - 0x81, 0x38, 0x2e, 0x3f, 0x7f, 0x7d, 0x02, 0xcc, 0xb2, 0xcc, 0x2a, 0xdd, - 0x7c, 0xdb, 0x16, 0xa2, 0x3e, 0xf5, 0xd1, 0x3a, 0x53, 0x90, 0x2f, 0x54, - 0xf9, 0xe2, 0x0e, 0x74, 0x7e, 0x3b, 0x57, 0x5b, 0xc0, 0xa3, 0xdb, 0xaa, - 0x2a, 0x3d, 0xc8, 0xed, 0x79, 0x22, 0x1f, 0xd2, 0xf4, 0x1d, 0x04, 0x7c, - 0xe1, 0x67, 0xa6, 0xab, 0x47, 0xbe, 0x09, 0x58, 0x3b, 0xc6, 0xce, 0x9e, - 0x6d, 0x94, 0xe7, 0x90, 0x9d, 0xbf, 0x86, 0x71, 0xdf, 0x66, 0xd3, 0x97, - 0x8d, 0x02, 0xe1, 0x51, 0x7f, 0xe9, 0x1c, 0x06, 0x3f, 0xa3, 0x1d, 0xdf, - 0x71, 0xba, 0x9b, 0x1c, 0x2b, 0xac, 0x13, 0xbe, 0xed, 0xe8, 0x41, 0xcc, - 0xa0, 0xd2, 0xa4, 0x37, 0xe1, 0xae, 0xee, 0x89, 0xff, 0x8a, 0xc6, 0x93, - 0xf1, 0x27, 0x2a, 0x0d, 0x82, 0xb9, 0xf9, 0x54, 0x41, 0x81, 0xbb, 0x8a, - 0x46, 0x11, 0xc7, 0x2c, 0x3e, 0x2e, 0x9d, 0x56, 0xb9, 0xea, 0x83, 0x8a, - 0xe7, 0x5c, 0x1c, 0x41, 0x23, 0xa9, 0x30, 0x0d, 0x23, 0x5c, 0xec, 0xab, - 0x6a, 0xd6, 0x4f, 0x40, 0xc3, 0xe2, 0xd0, 0x1a, 0x8d, 0x06, 0x02, 0x79, - 0x38, 0x5d, 0x61, 0x04, 0x0a, 0x82, 0xf4, 0xec, 0xb6, 0x58, 0xc7, 0xf6, - 0x76, 0x75, 0xe2, 0xe2, 0x95, 0x6d, 0x51, 0x2e, 0x58, 0x43, 0x33, 0x44, - 0x14, 0x54, 0x08, 0x9f, 0x22, 0x5d, 0x86, 0x0c, 0x66, 0x90, 0x90, 0xb7, - 0x19, 0xe8, 0xb1, 0xbe, 0x61, 0x76, 0x8e, 0xd6, 0x16, 0xba, 0x8e, 0x59, - 0x24, 0x98, 0x4b, 0xc3, 0x69, 0x4d, 0xc3, 0x6a, 0x42, 0x1f, 0xec, 0xcf, - 0xbd, 0x36, 0x46, 0xba, 0x69, 0x8e, 0xcf, 0x93, 0x1d, 0x99, 0xea, 0x03, - 0x46, 0x75, 0x86, 0x10, 0x21, 0x82, 0x57, 0x62, 0xdb, 0xea, 0xbd, 0x79, - 0x31, 0xbb, 0x9c, 0xce, 0xb6, 0xcb, 0x24, 0x04, 0x32, 0xf2, 0xc4, 0x9a, - 0xe2, 0x16, 0x36, 0xee, 0x76, 0x90, 0x90, 0x4e, 0xa1, 0x4e, 0x70, 0x10, - 0xed, 0x81, 0xc9, 0x6f, 0xa8, 0x4d, 0x9c, 0xc3, 0x73, 0x91, 0x4e, 0xb9, - 0xb5, 0x98, 0x82, 0x14, 0x0c, 0x3d, 0xec, 0xc0, 0xd6, 0x00, 0x4d, 0xc7, - 0xda, 0xf4, 0xe0, 0xca, 0xce, 0xad, 0x37, 0xed, 0x8a, 0x41, 0x46, 0x7a, - 0xe0, 0x2e, 0x47, 0x41, 0x29, 0x46, 0xd2, 0x6a, 0xba, 0x7b, 0xdf, 0xfd, - 0xaa, 0x89, 0x3f, 0xfc, 0x94, 0x85, 0x43, 0xaf, 0x0b, 0xbb, 0x44, 0x6d, - 0xcc, 0x59, 0x9a, 0x4f, 0x2d, 0xbe, 0x96, 0x30, 0xbc, 0x04, 0x59, 0x16, - 0x2f, 0xe8, 0xe1, 0x73, 0x13, 0x91, 0x2a, 0x1c, 0x95, 0x7e, 0x0b, 0xe0, - 0x43, 0x1f, 0xd3, 0x47, 0x3d, 0xaf, 0x4c, 0xcb, 0xc3, 0x12, 0x02, 0xea, - 0x68, 0xef, 0x87, 0x93, 0x92, 0x1a, 0x55, 0x90, 0xb3, 0x32, 0x6a, 0x22, - 0x73, 0x0f, 0x86, 0x11, 0xe5, 0x89, 0x22, 0xd6, 0x7b, 0x18, 0xce, 0x86, - 0xdb, 0x6f, 0xf2, 0xaf, 0x2d, 0x09, 0x28, 0x0d, 0x15, 0x66, 0xa0, 0x9f, - 0x1a, 0xa8, 0x95, 0x88, 0xff, 0x16, 0x9a, 0xf3, 0x43, 0x85, 0xc5, 0x48, - 0x0d, 0x75, 0x5c, 0xed, 0x81, 0xea, 0x19, 0xb3, 0xb4, 0x6a, 0x34, 0x10, - 0xff, 0xa6, 0x62, 0x77, 0x0d, 0x59, 0x48, 0x0b, 0xc4, 0x76, 0xb5, 0x9d, - 0x4e, 0x3b, 0x8a, 0x47, 0x7f, 0x2b, 0x3e, 0x0a, 0x31, 0x78, 0x91, 0x36, - 0x1d, 0x9d, 0x03, 0x10, 0xf9, 0x13, 0x1f, 0x86, 0x23, 0x69, 0x93, 0xe4, - 0x58, 0xe8, 0x31, 0xe8, 0x4f, 0x2a, 0xcc, 0xdd, 0xb3, 0x81, 0x4f, 0xab, - 0x21, 0x55, 0x00, 0x4a, 0xc9, 0x8f, 0x7c, 0x6b, 0xc6, 0xfa, 0xf8, 0xa7, - 0x8e, 0xab, 0xcd, 0x44, 0xc9, 0xef, 0xd1, 0x6d, 0x5e, 0xaa, 0x9a, 0x01, - 0x4d, 0xb8, 0x1e, 0x02, 0x5a, 0x42, 0xec, 0xcc, 0x01, 0xf5, 0x87, 0x48, - 0xf3, 0x17, 0x43, 0xcb, 0x9e, 0xe8, 0xf4, 0xed, 0x78, 0x61, 0x60, 0xee, - 0x6c, 0xaf, 0x15, 0x0d, 0x66, 0x77, 0x51, 0x0f, 0x72, 0x5e, 0x9c, 0x4d, - 0x0e, 0x6d, 0x0f, 0x69, 0x40, 0x4d, 0xcd, 0xca, 0x09, 0xe0, 0x6b, 0x99, - 0x94, 0x33, 0xde, 0x6b, 0x69, 0x94, 0x75, 0x69, 0x09, 0x00, 0xd0, 0x2e, - 0xba, 0xac, 0x4a, 0x00, 0xf1, 0xaa, 0x53, 0x1a, 0x90, 0x6a, 0x7c, 0x28, - 0x8c, 0x51, 0xc3, 0xb3, 0x5a, 0x1a, 0xb0, 0xa1, 0x21, 0xcd, 0x91, 0x84, - 0x1d, 0x9c, 0xda, 0x00, 0xd6, 0x09, 0x29, 0xf8, 0x77, 0x3d, 0xd7, 0x7c, - 0xee, 0x36, 0xe1, 0xaa, 0x0f, 0xce, 0xf8, 0xdd, 0x3b, 0xd9, 0x5c, 0xd3, - 0x22, 0x2e, 0x6f, 0xaa, 0x23, 0xd2, 0xd0, 0xf4, 0xb1, 0x92, 0x1e, 0x03, - 0x44, 0xaa, 0x67, 0x75, 0x79, 0x99, 0xb0, 0xde, 0xcc, 0x4c, 0xd2, 0x6b, - 0xf7, 0x9e, 0x34, 0x2d, 0xda, 0x6c, 0x5c, 0xb9, 0xdc, 0xce, 0x10, 0x09, - 0xdc, 0x7f, 0xb0, 0x42, 0x10, 0x3a, 0x86, 0xb3, 0xfd, 0x75, 0xc4, 0xe9, - 0x96, 0x69, 0x30, 0x65, 0x75, 0x4c, 0x13, 0x14, 0x7b, 0x27, 0x49, 0x92, - 0x7f, 0xb4, 0xa2, 0xed, 0x78, 0xc2, 0xbb, 0x22, 0x9a, 0xb2, 0xe6, 0xe9, - 0x18, 0xab, 0xc3, 0x95, 0xf9, 0xe1, 0x75, 0x74, 0xf1, 0x81, 0x5e, 0xae, - 0x02, 0xda, 0x6b, 0x93, 0x9d, 0x20, 0xb0, 0x7f, 0xc6, 0xac, 0x3e, 0x8a, - 0x0b, 0x43, 0x32, 0xd1, 0x4a, 0x18, 0xcd, 0xe6, 0xcc, 0xb0, 0xfb, 0xf2, - 0xdc, 0x83, 0xbd, 0xfc, 0x5e, 0x6f, 0xeb, 0x0d, 0x8e, 0xd4, 0xe6, 0x77, - 0xde, 0x07, 0x65, 0x03, 0xfd, 0x36, 0xed, 0x31, 0x6f, 0x84, 0x13, 0x3f, - 0xcc, 0xc4, 0x35, 0x22, 0x27, 0x0f, 0x9a, 0x3e, 0x1e, 0x01, 0x20, 0x3d, - 0xf0, 0x6e, 0x1d, 0x46, 0x64, 0x86, 0xc9, 0x11, 0xa0, 0xac, 0xd8, 0xb6, - 0x62, 0x80, 0x81, 0xe3, 0x3d, 0x0a, 0x46, 0x9a, 0x9c, 0xfe, 0x65, 0x91, - 0xa5, 0x41, 0xe7, 0x3c, 0x84, 0x43, 0xfe, 0x8d, 0x7f, 0x4a, 0x80, 0xc2, - 0xaf, 0x09, 0x62, 0x0d, 0x89, 0xa4, 0x67, 0xee, 0x58, 0x8d, 0xa0, 0xca, - 0x7e, 0x9f, 0xb1, 0x5b, 0xb9, 0x9a, 0xa6, 0x47, 0x5e, 0x59, 0xa6, 0x3a, - 0x32, 0x4c, 0x3a, 0x62, 0x3a, 0xb5, 0xa1, 0x2c, 0x16, 0x23, 0xbc, 0x51, - 0xf9, 0x29, 0x18, 0xff, 0x59, 0x25, 0x24, 0x9b, 0x25, 0x3c, 0xdd, 0xd0, - 0xc8, 0x52, 0xb5, 0x20, 0xc6, 0x33, 0x63, 0xc5, 0x63, 0x75, 0xf2, 0x41, - 0x91, 0xdf, 0x9e, 0x85, 0x7e, 0x05, 0x0e, 0x77, 0xf5, 0x98, 0x28, 0xff, - 0xa6, 0x3a, 0x1d, 0x09, 0xb0, 0x80, 0xbb, 0xa2, 0x38, 0xf1, 0xab, 0x44, - 0x31, 0x41, 0x36, 0xe1, 0x9c, 0x60, 0xec, 0x4b, 0x35, 0x18, 0xcd, 0x06, - 0xcf, 0x9f, 0x13, 0xc5, 0x0c, 0xda, 0xb5, 0x5a, 0xb4, 0x7a, 0x97, 0x4e, - 0x66, 0xdd, 0x48, 0xfb, 0x26, 0x40, 0x71, 0x60, 0x7c, 0x73, 0x33, 0x15, - 0xf6, 0xf9, 0x14, 0x5a, 0xf2, 0x3d, 0x37, 0x15, 0xdb, 0x1f, 0xbb, 0x96, - 0xc6, 0xe4, 0xf3, 0x84, 0x4e, 0x0f, 0x4e, 0x0c, 0x73, 0x2a, 0xf9, 0xc0, - 0xe2, 0x92, 0x4b, 0x3f, 0x80, 0x98, 0x9e, 0xbd, 0xec, 0xb7, 0x43, 0xb6, - 0x0a, 0xdd, 0x2b, 0xe5, 0x19, 0x8d, 0x3d, 0x79, 0x1f, 0xe6, 0xde, 0xbb, - 0x3b, 0xa2, 0xa7, 0x10, 0x84, 0x0f, 0xda, 0x3b, 0x06, 0x2c, 0x97, 0xbb, - 0xb5, 0x32, 0xbd, 0xee, 0xf9, 0x70, 0xaf, 0xdc, 0xf7, 0xd9, 0xc6, 0x8a, - 0x6a, 0xf1, 0xa0, 0xe7, 0x86, 0x14, 0x8d, 0x9f, 0xbc, 0x7d, 0x0f, 0xfc, - 0x78, 0x25, 0x00, 0x80, 0x92, 0x3c, 0x29, 0xc4, 0x7b, 0x45, 0x06, 0xdb, - 0x81, 0xb8, 0xc2, 0xdb, 0xe5, 0x2f, 0xe6, 0xdd, 0x1f, 0xf6, 0x43, 0xb3, - 0x71, 0xec, 0x60, 0xc7, 0xbe, 0x7a, 0xf2, 0x41, 0x01, 0x27, 0x80, 0xe4, - 0x3b, 0x2c, 0xa9, 0x4c, 0xf7, 0xfd, 0xf3, 0x85, 0x7a, 0x50, 0x7a, 0xef, - 0xd0, 0x73, 0xd1, 0x2a, 0xa8, 0xc8, 0x95, 0xd2, 0x23, 0x96, 0xe1, 0xb0, - 0x6f, 0x4f, 0xa6, 0x2a, 0x9b, 0xae, 0xa6, 0xa9, 0x34, 0x14, 0xd7, 0xa9, - 0xc9, 0x96, 0xcf, 0xb9, 0x92, 0x98, 0x88, 0x56, 0xd0, 0x89, 0x89, 0xa6, - 0xcd, 0x63, 0xf6, 0x87, 0x56, 0x2c, 0x34, 0x60, 0x40, 0xc6, 0x1e, 0x75, - 0xe5, 0x8d, 0x3c, 0xe6, 0x5b, 0xa7, 0x57, 0x75, 0x6b, 0xea, 0x1e, 0x8e, - 0x4a, 0x58, 0x49, 0xc8, 0x08, 0x9f, 0xbc, 0xae, 0xaa, 0x1a, 0xbb, 0x27, - 0xc0, 0x76, 0x3d, 0x06, 0xdd, 0x0e, 0x0e, 0x42, 0x8e, 0x15, 0xf7, 0x1b, - 0xf5, 0xfe, 0x10, 0xb1, 0x63, 0x7a, 0x2e, 0x06, 0x06, 0xe6, 0xdc, 0x7a, - 0xd8, 0x8a, 0x6a, 0xcb, 0xa5, 0x85, 0x71, 0xed, 0xc6, 0x27, 0x1d, 0x57, - 0x9a, 0x44, 0xd6, 0x84, 0xb8, 0x54, 0x4b, 0x29, 0xd9, 0x44, 0xb3, 0x72, - 0x41, 0x51, 0x9f, 0x5c, 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, - 0x9c, 0x71, 0x04, 0x22, 0xda, 0xcb, 0xf9, 0xc5, 0x67, 0x53, 0xd5, 0xda, - 0x1c, 0x6a, 0x06, 0x6f, 0x7f, 0xc8, 0x69, 0xc5, 0xfc, 0x47, 0xb7, 0x2b, - 0xd5, 0xcf, 0x49, 0x86, 0x6f, 0x5c, 0xf9, 0xde, 0x66, 0x8b, 0x50, 0x3e, - 0x43, 0xd2, 0xd6, 0x0d, 0xec, 0xa1, 0x6b, 0x98, 0x0c, 0x6a, 0x3f, 0x56, - 0x1b, 0xca, 0x06, 0x35, 0x52, 0xc2, 0x17, 0x18, 0x9b, 0x88, 0xf2, 0x0b, - 0xb5, 0x0f, 0xdf, 0x30, 0xd1, 0x4d, 0x06, 0xc0, 0xf8, 0xb5, 0x75, 0xb8, - 0xfc, 0x7d, 0xa7, 0x36, 0xfa, 0x99, 0x9c, 0xfe, 0x1f, 0xdd, 0x3b, 0x5a, - 0x20, 0x0c, 0xe4, 0x61, 0xc5, 0x4e, 0x55, 0xca, 0x2a, 0x65, 0xb3, 0xa7, - 0x5a, 0xc8, 0x9c, 0x92, 0x7e, 0x0e, 0x5b, 0x93, 0x7b, 0x24, 0xe3, 0x78, - 0x90, 0xc7, 0x73, 0x57, 0x60, 0x6a, 0x23, 0x04, 0xd5, 0x7b, 0xe0, 0x17, - 0x11, 0x29, 0xbb, 0x62, 0x69, 0xe1, 0x60, 0xe2, 0x54, 0x64, 0x26, 0x2b, - 0xa8, 0xf8, 0x01, 0x24, 0xef, 0x82, 0x79, 0xd2, 0x8d, 0x4b, 0x3a, 0x5d, - 0x9f, 0xce, 0xf2, 0x9a, 0xe7, 0x78, 0xe7, 0x34, 0xb4, 0x3c, 0x8d, 0x3d, - 0xcc, 0xb8, 0x4f, 0xca, 0xa4, 0x96, 0xe4, 0x44, 0x69, 0xfd, 0x0a, 0xcf, - 0xc7, 0xdb, 0x29, 0x07, 0xc0, 0x5e, 0x78, 0x9b, 0x4a, 0x11, 0x15, 0xee, - 0xa4, 0xb9, 0x33, 0xc3, 0xb2, 0x37, 0xcd, 0x08, 0x6a, 0xe6, 0xbe, 0xc0, - 0x87, 0x1c, 0xa2, 0xe1, 0x5b, 0xcd, 0x0b, 0x59, 0x19, 0x2e, 0x0d, 0x01, - 0xb1, 0xab, 0xe9, 0xcc, 0xdc, 0xd7, 0x5a, 0xe7, 0xbc, 0x33, 0x29, 0xd0, - 0xcc, 0x9f, 0xc8, 0xc0, 0x14, 0xbe, 0xf2, 0x50, 0x1c, 0x9d, 0x9f, 0xf0, - 0xd6, 0x08, 0xbb, 0x3e, 0x1a, 0x63, 0x5c, 0x22, 0x81, 0xee, 0x88, 0x26, - 0x05, 0xb5, 0x0d, 0xf4, 0x5d, 0x5b, 0x55, 0x21, 0x4f, 0xb0, 0x84, 0x34, - 0x39, 0xff, 0x5f, 0x12, 0x09, 0xf9, 0x1c, 0xbb, 0xd7, 0xf5, 0x01, 0x55, - 0x99, 0xf2, 0xfc, 0x3f, 0x27, 0x38, 0x2c, 0x49, 0xa9, 0x59, 0x83, 0x72, - 0xc1, 0x42, 0x6c, 0x83, 0x08, 0xd3, 0x62, 0xad, 0x55, 0xfe, 0xed, 0xa4, - 0x87, 0xbb, 0x73, 0xd8, 0x70, 0x60, 0xe6, 0x7a, 0x11, 0xbb, 0x9f, 0x2a, - 0x60, 0x1d, 0xd4, 0x10, 0xd6, 0x9c, 0x08, 0x55, 0x0f, 0x51, 0xa5, 0xfb, - 0xd4, 0x4b, 0xc5, 0x22, 0xc6, 0xb3, 0x31, 0x7d, 0x32, 0x76, 0x27, 0x4f, - 0xa7, 0xd6, 0x5d, 0x26, 0xac, 0xf3, 0xdb, 0x16, 0x08, 0x63, 0x44, 0xf8, - 0x85, 0x27, 0x50, 0xf8, 0x29, 0x05, 0x64, 0x41, 0xbb, 0xfb, 0x2a, 0x2a, - 0x89, 0xe0, 0xc4, 0x02, 0x4e, 0xbc, 0x85, 0x47, 0xa6, 0x8b, 0x07, 0xc6, - 0x0c, 0xf5, 0xbe, 0x8b, 0xbb, 0x0c, 0x0c, 0xee, 0x88, 0xf4, 0xbc, 0x83, - 0xaa, 0x39, 0x23, 0xec, 0x26, 0xd7, 0x8c, 0xc3, 0x8e, 0x92, 0x13, 0x4d, - 0x20, 0x56, 0x36, 0xdd, 0xc7, 0x24, 0x5a, 0xc7, 0x47, 0x4a, 0x59, 0x19, - 0xec, 0x06, 0x59, 0x5a, 0x27, 0x29, 0x23, 0x54, 0x3c, 0x7e, 0xa5, 0x05, - 0x69, 0x59, 0x2f, 0x26, 0x55, 0x03, 0x30, 0x0d, 0x0f, 0xe1, 0x8f, 0x17, - 0x7f, 0x7d, 0x00, 0xc3, 0x2b, 0x3f, 0x55, 0x00, 0xf8, 0x10, 0x54, 0xda, - 0x30, 0x72, 0x56, 0xd6, 0xde, 0x62, 0x2f, 0x6c, 0xf4, 0xb9, 0xab, 0x45, - 0x43, 0x78, 0x03, 0xf7, 0x38, 0x07, 0x6d, 0xa8, 0x7c, 0x57, 0x9c, 0x0d, - 0xaf, 0x80, 0xc5, 0x84, 0x26, 0xcf, 0x3e, 0x2c, 0x2b, 0x4c, 0x2a, 0xba, - 0xa8, 0xad, 0x3b, 0x09, 0x53, 0x6f, 0x47, 0x2c, 0x78, 0x0c, 0xe1, 0x9f, - 0xeb, 0xeb, 0x81, 0x4d, 0x94, 0xf3, 0xa3, 0x0d, 0xf9, 0xf8, 0x8d, 0x76, - 0x5d, 0x53, 0xc9, 0xbe, 0x3e, 0xed, 0x9b, 0x87, 0xce, 0x92, 0xf6, 0x07, - 0x88, 0x7a, 0x38, 0x05, 0xdd, 0xef, 0xc2, 0x28, 0xc5, 0x6e, 0x4c, 0xa1, - 0x02, 0x2a, 0x2e, 0xf9, 0x33, 0x31, 0x03, 0xad, 0x5e, 0x11, 0x78, 0xbe, - 0x38, 0xb6, 0x7b, 0x8d, 0xd1, 0x91, 0xbc, 0xa8, 0x08, 0x33, 0xdc, 0x78, - 0xa9, 0x12, 0x7f, 0xe8, 0xf6, 0xa6, 0xd9, 0x17, 0x2b, 0x61, 0x7d, 0xcb, - 0xa1, 0x01, 0x97, 0x6f, 0x03, 0xfc, 0x40, 0x95, 0xf0, 0xa8, 0x2c, 0xc5, - 0x25, 0x84, 0x09, 0x23, 0x07, 0x97, 0x93, 0xde, 0xb9, 0x47, 0xf8, 0xe7, - 0x41, 0x75, 0x75, 0x6c, 0x8b, 0xf9, 0xe3, 0xae, 0x2a, 0x1e, 0xc7, 0x15, - 0x5a, 0xbf, 0xf8, 0x45, 0xf1, 0xfe, 0x42, 0xef, 0x8c, 0x3b, 0x55, 0xde, - 0x81, 0xac, 0xc4, 0xec, 0xee, 0xa1, 0xa9, 0x2c, 0x89, 0x7d, 0x31, 0x75, - 0x52, 0x27, 0x9f, 0x51, 0x6f, 0xa5, 0x4e, 0xfd, 0x5b, 0x42, 0x94, 0xad, - 0x37, 0x33, 0xe3, 0x0c, 0x59, 0xa3, 0xd0, 0x47, 0x8a, 0x96, 0x16, 0xef, - 0x59, 0x3b, 0x91, 0x8c, 0xf5, 0x44, 0x1b, 0xb8, 0x88, 0x46, 0xcb, 0x6b, - 0x68, 0xa4, 0xe7, 0xa4, 0xb2, 0xcd, 0xd0, 0xca, 0x58, 0xa1, 0xb4, 0x65, - 0x79, 0x7a, 0x21, 0xf6, 0x28, 0x7d, 0x02, 0x6f, 0xfc, 0xfb, 0x7e, 0xca, - 0x85, 0x7b, 0x94, 0xf9, 0x42, 0xdd, 0x7e, 0xe9, 0x63, 0xc6, 0x5a, 0x7d, - 0x80, 0xc4, 0x2a, 0x88, 0x65, 0x88, 0x8d, 0xb4, 0xbd, 0x3f, 0x89, 0x5c, - 0xc9, 0x53, 0x95, 0x5e, 0x0b, 0xd3, 0x2f, 0xf2, 0x25, 0x85, 0x71, 0xed, - 0xc6, 0x27, 0x1d, 0x57, 0x9a, 0x44, 0xd6, 0x84, 0xb8, 0x54, 0x4b, 0x29, - 0xd9, 0x44, 0xb3, 0x72, 0x41, 0x51, 0x9f, 0x5c, 0xda, 0xe5, 0x61, 0x35, - 0x22, 0xf5, 0x3d, 0x6d, 0xf1, 0xd9, 0xf0, 0xac, 0x3f, 0xc2, 0x65, 0x67, - 0x15, 0xd9, 0x77, 0xfa, 0xb6, 0xcf, 0x3c, 0xf1, 0xaa, 0x35, 0xa0, 0x5e, - 0x6b, 0x9b, 0x53, 0xa4, 0xa8, 0xba, 0x20, 0x52, 0x0e, 0x0c, 0x89, 0x10, - 0x59, 0x09, 0x7e, 0xf0, 0xb8, 0x1e, 0x81, 0xf1, 0x6f, 0x05, 0x3b, 0xfa, - 0x4d, 0xaf, 0xd8, 0x36, 0xb8, 0xf7, 0x5a, 0x54, 0x53, 0x0d, 0xf3, 0xd0, - 0xa1, 0xf0, 0x8a, 0xe7, 0x47, 0xbd, 0x00, 0x49, 0xb7, 0xe8, 0xc6, 0xad, - 0x05, 0xa4, 0xdb, 0x91, 0x3f, 0x48, 0x03, 0xbd, 0x99, 0x3d, 0xd9, 0x08, - 0x3d, 0xa9, 0x77, 0x42, 0x4c, 0xd2, 0x23, 0x64, 0x32, 0xfb, 0x63, 0x1b, - 0x5c, 0xaa, 0xd2, 0xb8, 0xd9, 0xdb, 0x95, 0x4e, 0xb2, 0x4f, 0x84, 0x58, - 0xa0, 0xb0, 0xff, 0x57, 0xee, 0xf2, 0xe9, 0xd7, 0xbc, 0xe6, 0x9c, 0x4d, - 0xc2, 0x08, 0x6c, 0x0a, 0x14, 0x2e, 0x3d, 0xaa, 0xe8, 0x10, 0x71, 0xdb, - 0xfc, 0x42, 0xfa, 0xb5, 0xaf, 0x3c, 0x01, 0xef, 0xf9, 0x5a, 0x9f, 0xef, - 0x47, 0x07, 0x6b, 0xef, 0x7d, 0x72, 0x73, 0xd4, 0x73, 0xeb, 0x3a, 0x04, - 0x5e, 0x9f, 0xf4, 0x7d, 0xdb, 0x84, 0x10, 0x42, 0x50, 0x08, 0x47, 0xe3, - 0x6a, 0xc0, 0x08, 0xe6, 0x0e, 0x66, 0x11, 0xea, 0x6e, 0x72, 0x57, 0x75, - 0xa7, 0x6c, 0xe6, 0x3b, 0x0e, 0x1f, 0xc2, 0xcf, 0x46, 0xb6, 0x58, 0x7e, - 0x29, 0xb6, 0x26, 0x18, 0x87, 0x00, 0xc5, 0xef, 0x8c, 0xab, 0x89, 0x6c, - 0xdb, 0x2e, 0xa0, 0x8a, 0x8f, 0x79, 0xfd, 0xf1, 0xcc, 0x9c, 0x9e, 0xd8, - 0x5d, 0x1b, 0xb9, 0x64, 0x0f, 0x05, 0x3f, 0x87, 0x59, 0xc2, 0x1d, 0x62, - 0x49, 0xb8, 0xd4, 0xf8, 0x3a, 0x35, 0xe0, 0xa0, 0x66, 0x10, 0x5e, 0x8d, - 0xd5, 0xa5, 0x5f, 0xd7, 0x9b, 0x9c, 0x63, 0x86, 0x7c, 0xae, 0xad, 0xc6, - 0x69, 0xb2, 0x6c, 0xbb, 0x11, 0x7b, 0x0a, 0x47, 0xef, 0xb7, 0x9d, 0x0d, - 0x18, 0xb0, 0x67, 0xed, 0xc7, 0x06, 0xdf, 0xd4, 0x76, 0x37, 0x46, 0x1a, - 0x9e, 0xf0, 0x79, 0x4b, 0x95, 0xe1, 0x17, 0x8f, 0xdd, 0x16, 0xf8, 0x1f, - 0x4b, 0x7b, 0xc5, 0x04, 0x99, 0xa6, 0xdf, 0xe2, 0x6e, 0xbf, 0xdb, 0xdd, - 0x2b, 0x32, 0x62, 0x19, 0xe9, 0x10, 0x52, 0xb7, 0x94, 0x06, 0x97, 0x30, - 0x7a, 0x73, 0x4d, 0x71, 0xe8, 0xf3, 0xbe, 0x9b, 0x7c, 0x07, 0xdd, 0xd5, - 0x06, 0x1b, 0xd0, 0x48, 0xc5, 0x82, 0x1d, 0x76, 0x3c, 0x1a, 0xae, 0x72, - 0x4f, 0xa0, 0x92, 0x7d, 0x1d, 0x44, 0x07, 0xe6, 0x35, 0x10, 0x41, 0x5f, - 0x9f, 0xa0, 0x2c, 0x49, 0x78, 0x44, 0x1c, 0xe8, 0x43, 0x5e, 0x3c, 0x02, - 0xfb, 0x59, 0x9c, 0x51, 0x5d, 0x58, 0xb3, 0x05, 0xd8, 0xcf, 0x25, 0x19, - 0x60, 0x85, 0x87, 0x27, 0x92, 0x7b, 0x0e, 0x0b, 0x3f, 0xd9, 0x04, 0xe6, - 0xba, 0x39, 0xd6, 0x22, 0x90, 0x1b, 0x0b, 0xf7, 0xbe, 0xa2, 0xe5, 0xba, - 0x7b, 0x27, 0xc5, 0x5a, 0x7a, 0xcd, 0x42, 0x8a, 0xd0, 0xbb, 0x00, 0x38, - 0xd0, 0xe3, 0xbd, 0x12, 0x4d, 0x52, 0xc6, 0xd2, 0xf5, 0xb7, 0x62, 0x4d, - 0x87, 0x34, 0xc1, 0xaa, 0x95, 0x09, 0xc0, 0x9f, 0x8a, 0x22, 0x2e, 0xf6, - 0xdd, 0x47, 0x60, 0xed, 0x8f, 0xbf, 0x56, 0xde, 0x90, 0x96, 0xd6, 0x62, - 0x73, 0x14, 0xbc, 0xc4, 0x10, 0xdb, 0xc5, 0x1e, 0xfc, 0xf3, 0xbb, 0x0f, - 0x74, 0xa7, 0xbd, 0xdf, 0x7d, 0xa9, 0xa2, 0x08, 0x09, 0x06, 0x22, 0x81, - 0x9b, 0xb0, 0x33, 0xf0, 0xe7, 0xb9, 0xa6, 0x3a, 0xf1, 0xa3, 0xbb, 0xe8, - 0xbc, 0xb2, 0xcc, 0xb4, 0xdb, 0xf7, 0x49, 0x39, 0xf4, 0x4c, 0x87, 0xc5, - 0x3e, 0x33, 0x6a, 0x48, 0x61, 0xd7, 0x7a, 0x66, 0x2d, 0xe2, 0x15, 0x61, - 0x7c, 0x7f, 0x4d, 0x26, 0x04, 0x58, 0x4a, 0x83, 0x29, 0x25, 0x18, 0x89, - 0x01, 0x98, 0xf4, 0x31, 0xc5, 0x29, 0x73, 0x27, 0x6b, 0xc8, 0x24, 0xbe, - 0xf7, 0x26, 0xa3, 0xf9, 0x53, 0xd6, 0x7f, 0x96, 0x31, 0x01, 0xf9, 0xef, - 0x6d, 0xe5, 0xe3, 0x75, 0xd8, 0x82, 0xeb, 0xf6, 0x4c, 0xe0, 0xba, 0xa9, - 0x89, 0x93, 0xf9, 0x3d, 0x81, 0xe8, 0xdc, 0x2a, 0x46, 0x0b, 0xec, 0xaf, - 0xf6, 0xf8, 0x1b, 0x28, 0x4f, 0xea, 0x42, 0xb6, 0xf2, 0x21, 0xfe, 0xd9, - 0x28, 0x73, 0x8f, 0xb1, 0xfa, 0x02, 0x91, 0xd4, 0xbc, 0xf2, 0xa3, 0x74, - 0xb0, 0x3a, 0xd6, 0x88, 0x02, 0xa3, 0xee, 0xc4, 0x29, 0x17, 0x8e, 0xd7, - 0xfe, 0x06, 0x13, 0xdc, 0xf5, 0x2b, 0xb0, 0xf6, 0xb3, 0x58, 0xf7, 0xd0, - 0xad, 0xa5, 0x69, 0xcf, 0xb7, 0xac, 0x6d, 0x69, 0xc5, 0xd6, 0x76, 0xb8, - 0x38, 0x13, 0xc1, 0x15, 0xfc, 0x8a, 0xbb, 0x0f, 0x74, 0xa7, 0xbd, 0xdf, - 0x7d, 0xa9, 0xa2, 0x08, 0x09, 0x06, 0x22, 0x81, 0x94, 0x71, 0x98, 0xff, - 0x26, 0xc7, 0xc2, 0xb1, 0x27, 0xc3, 0x8b, 0x9b, 0xb6, 0x38, 0x62, 0x43, - 0xd4, 0x02, 0x88, 0xc1, 0x17, 0x7f, 0x9b, 0x97, 0x0f, 0x7b, 0x2b, 0x8e, - 0xbb, 0x73, 0x98, 0x70, 0xd4, 0xd4, 0xa0, 0x67, 0x21, 0x5e, 0x56, 0x53, - 0xe5, 0x86, 0x42, 0x85, 0x49, 0xcc, 0x1d, 0xcf, 0x01, 0xa5, 0xf4, 0x31, - 0xc5, 0x29, 0x73, 0x4f, 0x6b, 0xc8, 0x24, 0xbe, 0xf7, 0x4e, 0xa3, 0xf9, - 0x53, 0xd6, 0x7f, 0x96, 0x31, 0x01, 0xf9, 0xef, 0x6d, 0xe5, 0xe3, 0x75, - 0xd8, 0x82, 0xeb, 0xf6, 0xde, 0xcf, 0x23, 0x18, 0x77, 0x24, 0xe2, 0x32, - 0x21, 0x0f, 0x53, 0xf5, 0x06, 0xcf, 0x7d, 0xa1, 0x07, 0x7f, 0x25, 0x90, - 0xc3, 0x3a, 0x8f, 0xe5, 0xe2, 0xae, 0x96, 0xa8, 0x84, 0xe9, 0x41, 0x0b, - 0x68, 0x36, 0x21, 0x70, 0x81, 0xba, 0x7e, 0xc3, 0x8c, 0x86, 0xa7, 0x96, - 0xbd, 0x75, 0x9b, 0x0c, 0x8e, 0x3f, 0xc9, 0xf1, 0xef, 0xfe, 0xe2, 0x9e, - 0x2f, 0x73, 0x82, 0x28, 0x0a, 0x5e, 0x88, 0x96, 0x6d, 0xed, 0x9c, 0x22, - 0xd8, 0x14, 0x48, 0xe9, 0x12, 0xb9, 0x00, 0xbf, 0xd7, 0x95, 0x6d, 0xa3, - 0xd6, 0x38, 0x11, 0xb1, 0xf0, 0xde, 0x5a, 0x9e, 0x97, 0xd3, 0x13, 0x42, - 0xf4, 0x1f, 0xc8, 0x3f, 0xdf, 0x86, 0xf1, 0x91, 0xa4, 0xa4, 0x4d, 0x97, - 0x8e, 0x86, 0xc6, 0xf5, 0x78, 0xde, 0x75, 0x2a, 0x1a, 0x0b, 0xea, 0x15, - 0x78, 0x9d, 0x87, 0xb8, 0x17, 0xc2, 0xdd, 0xb2, 0x06, 0xb2, 0xb9, 0xe5, - 0x24, 0xe7, 0xa0, 0x66, 0xc6, 0x2e, 0xac, 0x5e, 0xef, 0xbe, 0x36, 0xd7, - 0xd5, 0x2a, 0x8b, 0x80, 0x1a, 0x2f, 0x24, 0xa4, 0x47, 0x7c, 0xc2, 0xd1, - 0xed, 0xa1, 0x68, 0x7b, 0x87, 0x11, 0xa6, 0x42, 0x44, 0x56, 0xd1, 0x93, - 0x2c, 0xb9, 0xa7, 0x5a, 0x1e, 0xc9, 0x3e, 0xe1, 0xb6, 0x66, 0x24, 0x50, - 0x2f, 0x25, 0xc5, 0xec, 0x59, 0x9e, 0x55, 0x9c, 0x57, 0xa9, 0xb6, 0x0b, - 0x03, 0xf4, 0x80, 0x42, 0x85, 0x34, 0xf8, 0xec, 0x03, 0xa1, 0x6c, 0xa7, - 0xdf, 0x35, 0x86, 0x2d, 0x4f, 0x90, 0x7c, 0x47, 0x31, 0x36, 0xbc, 0xb7, - 0xec, 0x88, 0xcd, 0xc6, 0x2f, 0x27, 0x71, 0xe8, 0xb9, 0x4e, 0x39, 0x7b, - 0xa5, 0xd4, 0x37, 0xfe, 0x1f, 0x3d, 0x11, 0x74, 0x7a, 0x8d, 0x49, 0x21, - 0xbc, 0x97, 0x93, 0xbe, 0xb9, 0x6d, 0x7b, 0xdc, 0x84, 0xf8, 0xe1, 0x3c, - 0x4d, 0x3e, 0x39, 0xfe, 0x8a, 0xbf, 0xc8, 0x8c, 0x9a, 0x49, 0x55, 0xdc, - 0x0a, 0x1f, 0x83, 0x8f, 0x7f, 0x5c, 0xf6, 0xf6, 0xd5, 0x75, 0x0b, 0xcf, - 0x02, 0x1f, 0x99, 0x23, 0x1a, 0xe2, 0x25, 0x83, 0x3a, 0x25, 0x38, 0xb3, - 0xa0, 0x98, 0x22, 0xb4, 0x55, 0xe7, 0xf8, 0xb5, 0xea, 0xfc, 0x1d, 0xf0, - 0x5b, 0x67, 0x83, 0x67, 0x9f, 0x02, 0xb5, 0x07, 0x16, 0xbe, 0x11, 0x76, - 0x76, 0x0c, 0x71, 0xad, 0x9c, 0xce, 0xc1, 0xff, 0x88, 0xc9, 0xc2, 0x09, - 0x9c, 0x8c, 0x50, 0x5b, 0x6a, 0x47, 0xf8, 0x60, 0x0b, 0x0c, 0x26, 0xa8, - 0xe2, 0x8c, 0x9c, 0x57, 0xf9, 0x7d, 0x67, 0x01, 0x53, 0x35, 0x62, 0x7e, - 0x3f, 0x39, 0xdb, 0x86, 0x0a, 0xeb, 0xf3, 0x5d, 0xb2, 0x8c, 0xec, 0xa1, - 0x14, 0xdc, 0xb1, 0x2e, 0xa4, 0xe4, 0xc9, 0xd8, 0x80, 0x0f, 0x04, 0x86, - 0x2d, 0x2a, 0xa7, 0x19, 0xbf, 0x0d, 0x56, 0x6f, 0xdf, 0x85, 0xc8, 0xb3, - 0x4d, 0x90, 0xb9, 0x28, 0x9a, 0xa3, 0xe8, 0x0f, 0x5a, 0xde, 0xdc, 0x85, - 0x90, 0x97, 0x6d, 0x7a, 0x9c, 0x16, 0x81, 0x0b, 0x59, 0x2b, 0xcb, 0x66, - 0x87, 0xac, 0xc6, 0x6e, 0xad, 0x5a, 0x47, 0x3a, 0xbb, 0x5b, 0xad, 0x4c, - 0xfd, 0x47, 0x69, 0xfe, 0x8a, 0x2b, 0x21, 0xdd, 0x94, 0x85, 0x19, 0x7e, - 0x51, 0xb6, 0xea, 0x2a, 0x5e, 0x44, 0x18, 0xf7, 0x5f, 0x87, 0x21, 0x33, - 0xbb, 0x43, 0xfd, 0xc1, 0x7b, 0x91, 0xfa, 0xd9, 0x3e, 0x16, 0x56, 0x45, - 0x18, 0xfe, 0xef, 0x2b, 0x5a, 0xb2, 0x3d, 0x97, 0x93, 0x0a, 0xe7, 0x7b, - 0x1d, 0x36, 0xed, 0x91, 0xee, 0x93, 0xf0, 0xce, 0xe7, 0x31, 0x97, 0xaa, - 0x6a, 0x6d, 0x82, 0x3b, 0x45, 0x83, 0xe4, 0x1f, 0xfe, 0xcc, 0x8d, 0x52, - 0x97, 0x08, 0x0a, 0x15, 0xd8, 0x98, 0x9d, 0x7e, 0xbb, 0x1d, 0x13, 0x31, - 0x62, 0x8e, 0x1f, 0xfc, 0x6d, 0xed, 0xe6, 0x50, 0xf5, 0x85, 0xa8, 0xd5, - 0x4f, 0x66, 0x74, 0xca, 0xd5, 0x2c, 0xd8, 0xe2, 0xb8, 0x85, 0x2e, 0x21, - 0xce, 0x3a, 0x84, 0xeb, 0x83, 0x04, 0xd7, 0x5f, 0x7a, 0x75, 0x7a, 0x2b, - 0xfa, 0x9c, 0x23, 0x23, 0x05, 0x22, 0xf3, 0x0d, 0xe8, 0x0b, 0x7f, 0x64, - 0xfc, 0xc2, 0xb3, 0x3b, 0x27, 0x4a, 0xff, 0x70, 0xcd, 0x8c, 0x3b, 0xee, - 0xad, 0xe3, 0x81, 0x82, 0x12, 0x13, 0xff, 0xef, 0xa1, 0xdc, 0xe7, 0xed, - 0xec, 0xce, 0x44, 0x72, 0x3c, 0x8c, 0xd8, 0xad, 0xd4, 0x57, 0x1f, 0xb8, - 0x63, 0x40, 0x11, 0xfa, 0x44, 0xf2, 0xc1, 0x74, 0x3b, 0xf6, 0x32, 0x82, - 0xae, 0x86, 0x46, 0x4e, 0x93, 0xf9, 0x3f, 0xb4, 0xdd, 0xcb, 0x09, 0xbd, - 0x25, 0x97, 0x5b, 0x68, 0x86, 0x3e, 0xed, 0x21, 0x0a, 0xa4, 0xed, 0x5d, - 0x86, 0xd4, 0x91, 0xe5, 0xa0, 0x79, 0x8c, 0xd5, 0xf8, 0x95, 0xa0, 0x3e, - 0x69, 0xf9, 0x46, 0xed, 0xee, 0x0c, 0xd2, 0x10, 0x64, 0x4a, 0x05, 0xad, - 0x91, 0xb9, 0x1c, 0xea, 0xc7, 0x56, 0x8b, 0x6c, 0xc2, 0x1f, 0xbc, 0xae, - 0xb2, 0x2d, 0x74, 0xd9, 0x94, 0x0d, 0x07, 0xe1, 0x5c, 0x62, 0x79, 0x1c, - 0xfb, 0x36, 0x80, 0x1e, 0x28, 0xad, 0xcb, 0xc5, 0x58, 0x64, 0xc9, 0xed, - 0xae, 0x47, 0x7a, 0x18, 0xb8, 0x3a, 0xc9, 0xf6, 0x24, 0x98, 0x4b, 0xc3, - 0x69, 0x4d, 0xc3, 0x6a, 0x42, 0x1f, 0xee, 0xf6, 0xbd, 0x36, 0x5c, 0xaa, - 0x2c, 0xf8, 0x2f, 0x16, 0x2b, 0xc7, 0xaa, 0xa9, 0x69, 0xc7, 0xba, 0xcd, - 0x96, 0x25, 0xf9, 0xdc, 0x56, 0xb1, 0x61, 0xa5, 0x88, 0x68, 0x9b, 0xd2, - 0xf3, 0xcc, 0x35, 0x92, 0x78, 0x82, 0xe2, 0x97, 0x60, 0xba, 0x8b, 0xbb, - 0x00, 0x3a, 0x54, 0xcc, 0x68, 0x98, 0x6b, 0x3e, 0xf7, 0x76, 0xf1, 0xc9, - 0x26, 0xb3, 0x0f, 0xf2, 0xa4, 0xf4, 0xfd, 0x57, 0x92, 0x7b, 0x45, 0x7d, - 0x6b, 0xa2, 0xe6, 0xb1, 0x3e, 0x46, 0x95, 0xcc, 0x52, 0xf4, 0xff, 0x2a, - 0xae, 0x19, 0xe3, 0x04, 0x31, 0x8d, 0x4c, 0x24, 0xbf, 0x61, 0x79, 0xb2, - 0xc5, 0x29, 0xe8, 0x88, 0xd0, 0xed, 0xad, 0xdc, 0xfe, 0xf1, 0x43, 0x06, - 0x81, 0xdd, 0x1b, 0x9d, 0x32, 0x52, 0x1e, 0x87, 0xab, 0x02, 0xcd, 0x31, - 0x32, 0xf5, 0x8a, 0x69, 0xf2, 0xbd, 0xce, 0x77, 0x5e, 0xf4, 0x3b, 0x5e, - 0x65, 0xf0, 0xa5, 0xa8, 0x1c, 0xc0, 0x62, 0xe0, 0x0f, 0x58, 0x86, 0xfb, - 0xf9, 0x3a, 0x8e, 0xc6, 0xfb, 0x38, 0xff, 0xa0, 0x74, 0x4e, 0x70, 0x68, - 0x11, 0x2b, 0x40, 0x89, 0x5b, 0x24, 0xb5, 0xd1, 0x40, 0x46, 0xf7, 0x86, - 0xc6, 0x7a, 0xf3, 0x71, 0x41, 0x79, 0x92, 0x34, 0x24, 0x2b, 0xb5, 0x4a, - 0x2e, 0xc8, 0x37, 0x8b, 0xe1, 0x3f, 0x9f, 0x0b, 0x1a, 0x24, 0xbd, 0x54, - 0xd0, 0xbe, 0x63, 0xe0, 0x1a, 0xae, 0x0a, 0xb7, 0x9e, 0xdb, 0x66, 0xcd, - 0xd2, 0x77, 0xcc, 0x82, 0x04, 0x59, 0x6c, 0xf1, 0xa4, 0xa7, 0x18, 0x5f, - 0xba, 0xf3, 0x4e, 0xa7, 0xd7, 0x5c, 0x57, 0x64, 0x31, 0x46, 0x12, 0x1e, - 0x58, 0x63, 0xe8, 0x21, 0x2b, 0xc4, 0xb2, 0x30, 0xdd, 0x66, 0x67, 0x1a, - 0xa1, 0xa6, 0x96, 0x24, 0xd2, 0xb0, 0xc6, 0xf9, 0xc7, 0xdb, 0x0a, 0x0f, - 0x5e, 0x4b, 0xac, 0xb1, 0x22, 0x23, 0x22, 0x58, 0xd4, 0x05, 0xe5, 0x98, - 0x49, 0x5b, 0xdd, 0x35, 0x22, 0x60, 0x32, 0x2a, 0x3f, 0x3f, 0xc5, 0x90, - 0xe3, 0xa4, 0x58, 0x0d, 0x7f, 0x53, 0xd6, 0x41, 0xf6, 0x2d, 0x20, 0xbd, - 0x75, 0xd9, 0x7b, 0x5e, 0xf9, 0xd6, 0x9e, 0x6b, 0x43, 0x9d, 0x56, 0xa2, - 0xd7, 0x17, 0xb4, 0x76, 0x57, 0xdf, 0x6e, 0xc2, 0xc0, 0xe0, 0x89, 0x21, - 0x5d, 0xd5, 0x00, 0x63, 0xab, 0x60, 0xca, 0x32, 0x8f, 0x43, 0x5d, 0x5a, - 0x1b, 0xa1, 0x0c, 0x3b, 0xeb, 0x4f, 0xc5, 0xa9, 0x8c, 0x5a, 0x7c, 0x11, - 0xa2, 0xdf, 0xee, 0x69, 0x95, 0x2c, 0x0a, 0xec, 0x24, 0x96, 0xa7, 0xeb, - 0x5c, 0x4b, 0x39, 0xfa, 0x9a, 0x93, 0x88, 0x7b, 0xae, 0xc1, 0x2d, 0x91, - 0xb2, 0x09, 0xed, 0x38, 0x04, 0x06, 0xf7, 0x83, 0x29, 0xb7, 0x3a, 0xa2, - 0xec, 0x9e, 0xb9, 0xc5, 0x8a, 0x18, 0x28, 0x01, 0x6e, 0x11, 0x6e, 0x65, - 0xa8, 0x52, 0x62, 0xfe, 0xbc, 0xf7, 0xd5, 0x7a, 0xda, 0x53, 0xe8, 0x8b, - 0x50, 0xe0, 0x83, 0xe2, 0x71, 0xa1, 0xb9, 0xef, 0x8e, 0xaa, 0x9c, 0x56, - 0x8d, 0x8f, 0xaf, 0x7f, 0xb5, 0xf2, 0x65, 0xcf, 0x74, 0x61, 0x4b, 0xbb, - 0x7f, 0x5a, 0x71, 0xb1, 0xaa, 0xd0, 0xc5, 0xc5, 0xcb, 0x01, 0x94, 0x5e, - 0xaa, 0x16, 0xb1, 0x88, 0x32, 0xde, 0x31, 0x46, 0x21, 0xe2, 0x21, 0xd6, - 0xf6, 0x88, 0x49, 0xa6, 0x15, 0xb8, 0x25, 0x6c, 0x8f, 0xeb, 0x85, 0xbc, - 0x3b, 0xd9, 0x54, 0x72, 0x00, 0xb5, 0x4c, 0xaf, 0x10, 0xad, 0x24, 0xe5, - 0xda, 0x4e, 0xd9, 0x61, 0xdc, 0x7e, 0x50, 0x02, 0xff, 0xd4, 0x76, 0x81, - 0x8a, 0x9c, 0xd4, 0x72, 0x0b, 0x3e, 0x1c, 0x56, 0x22, 0x6c, 0x72, 0xbd, - 0xa1, 0x3a, 0xb5, 0x28, 0x19, 0x9f, 0xda, 0xe1, 0x4e, 0xf0, 0x6b, 0x12, - 0x43, 0x4b, 0x9a, 0x31, 0x35, 0xc5, 0x87, 0xf0, 0x7d, 0xf1, 0xbe, 0xf9, - 0x66, 0x5c, 0xb3, 0x8d, 0x6d, 0xfa, 0xb6, 0xbf, 0x61, 0xda, 0x1b, 0xb6, - 0x63, 0xec, 0x71, 0x7e, 0x68, 0x9d, 0x93, 0xf8, 0xaf, 0xee, 0x1b, 0xb4, - 0x94, 0x4b, 0xc2, 0xa8, 0x34, 0xf0, 0x34, 0xea, 0x49, 0xe5, 0x90, 0x60, - 0x37, 0x90, 0x4c, 0x8d, 0xc8, 0x69, 0x0e, 0xca, 0xfd, 0xa1, 0xb8, 0x9e, - 0xc3, 0x1c, 0x64, 0xfc, 0xcb, 0x0a, 0xea, 0xe0, 0x59, 0xd0, 0x10, 0x62, - 0xf9, 0x51, 0x16, 0xbc, 0x7b, 0x84, 0xfe, 0x77, 0x3a, 0x11, 0x79, 0xcf, - 0xdd, 0x25, 0x97, 0x12, 0x9d, 0x62, 0x2a, 0xa0, 0x9b, 0x75, 0x63, 0x7c, - 0x19, 0xfb, 0x14, 0x97, 0xad, 0xd4, 0x9b, 0x67, 0x92, 0x58, 0x00, 0x62, - 0xeb, 0xf4, 0x56, 0x12, 0xa0, 0x2a, 0x5c, 0x8e, 0x91, 0x5a, 0xef, 0x24, - 0x85, 0x6e, 0x7d, 0x8a, 0x30, 0xf6, 0xc2, 0x38, 0x5c, 0x36, 0xe6, 0x54, - 0x1c, 0x9d, 0xb8, 0xaa, 0x23, 0xf5, 0x75, 0xc4, 0x8e, 0x9b, 0xb6, 0x50, - 0x21, 0xe3, 0x90, 0x22, 0x7b, 0x54, 0x7d, 0x04, 0x7d, 0x15, 0x62, 0x11, - 0xcd, 0x7f, 0xf7, 0x88, 0x40, 0xbe, 0x55, 0x22, 0xac, 0xd4, 0xdf, 0x2e, - 0x2f, 0xe9, 0xdd, 0xd8, 0xb3, 0x61, 0xd5, 0xbc, 0xe3, 0xc1, 0xf6, 0x09, - 0x08, 0xa8, 0xab, 0x27, 0x11, 0xe8, 0x78, 0xca, 0xc2, 0xf3, 0xfa, 0x7d, - 0xab, 0xf7, 0x42, 0x17, 0xdc, 0x9e, 0x81, 0x25, 0x6b, 0xb8, 0x8b, 0xd9, - 0x87, 0x6d, 0x51, 0xda, 0x8b, 0xfe, 0xc3, 0xf5, 0xe1, 0xfd, 0x5c, 0x95, - 0x15, 0x35, 0x93, 0xe9, 0xba, 0xea, 0xb6, 0xaa, 0xb7, 0x50, 0x6e, 0xd5, - 0x6e, 0x9e, 0xf8, 0xb8, 0x33, 0x8d, 0x34, 0x69, 0x36, 0x86, 0x66, 0x43, - 0x34, 0x71, 0xb4, 0x7d, 0x4f, 0x0b, 0x46, 0x5c, 0x7d, 0x47, 0x1f, 0xa2, - 0x2e, 0xa8, 0xe2, 0x9d, 0x10, 0xf6, 0xce, 0x62, 0x02, 0xe7, 0x36, 0xb1, - 0x41, 0x45, 0x53, 0xfa, 0xc6, 0x84, 0xd4, 0x0e, 0x66, 0x33, 0xbe, 0x27, - 0x72, 0x0c, 0xb7, 0x1b, 0x66, 0x75, 0x8d, 0x44, 0x9e, 0x80, 0xd0, 0x7d, - 0x44, 0x0a, 0xd8, 0xb3, 0x4d, 0x9d, 0x75, 0xbc, 0x04, 0xa5, 0xcc, 0x57, - 0x2a, 0x1a, 0x4f, 0xce, 0xdd, 0x2e, 0x30, 0x9f, 0x68, 0x74, 0xaa, 0x1e, - 0x47, 0x0f, 0x7b, 0x5e, 0x52, 0xad, 0xf4, 0xce, 0xab, 0x3d, 0x8b, 0xb8, - 0x30, 0x26, 0x39, 0x79, 0x6b, 0xee, 0x75, 0x40, 0x4b, 0x38, 0x69, 0x65, - 0xb4, 0x00, 0xfd, 0x81, 0x6a, 0x8f, 0x6b, 0x6f, 0x70, 0xe8, 0x4e, 0x5c, - 0x5e, 0xaa, 0x4b, 0x39, 0x52, 0x72, 0x84, 0xa1, 0x1a, 0xa8, 0xee, 0x23, - 0x20, 0x42, 0x43, 0x11, 0x99, 0x99, 0xe7, 0x77, 0xd5, 0x82, 0x41, 0x1b, - 0xc8, 0xab, 0x3c, 0x66, 0xcc, 0x98, 0xe4, 0x7b, 0xe4, 0x4e, 0x24, 0x9a, - 0xf4, 0xec, 0xea, 0xa1, 0x4b, 0x58, 0xd8, 0xa5, 0xf5, 0x56, 0x66, 0x12, - 0xe8, 0x96, 0x69, 0x6b, 0x60, 0xd2, 0xcd, 0x3c, 0x87, 0xa5, 0x07, 0xaa, - 0x5e, 0x7a, 0x06, 0x79, 0x8d, 0x9e, 0x21, 0xe3, 0xba, 0x09, 0x2d, 0x17, - 0xa9, 0x28, 0x60, 0x54, 0x08, 0xd8, 0x22, 0xb3, 0x62, 0xdb, 0x91, 0xc3, - 0xfe, 0x73, 0x32, 0x12, 0x67, 0x48, 0x80, 0xd7, 0xc2, 0x7d, 0x32, 0x60, - 0x1d, 0xe4, 0x01, 0xd6, 0xa1, 0x99, 0x24, 0x3b, 0x7b, 0x09, 0x55, 0xbf, - 0xa2, 0x19, 0xc5, 0xdc, 0xfa, 0x28, 0x41, 0xb2, 0x42, 0x0c, 0x6b, 0xd9, - 0xd3, 0xfd, 0x79, 0x0f, 0x22, 0x4c, 0x5f, 0x8f, 0xc4, 0x3f, 0x67, 0x7d, - 0xa1, 0x05, 0xce, 0x6d, 0x50, 0xb5, 0xac, 0xc2, 0x8d, 0x0d, 0xa9, 0xa2, - 0x4a, 0xd6, 0xb5, 0xc7, 0xd7, 0xbb, 0x9c, 0xe2, 0x3b, 0xc1, 0x82, 0xe2, - 0xc0, 0x3e, 0x10, 0x5d, 0xa6, 0x86, 0x61, 0xef, 0xb1, 0x83, 0x5a, 0xd6, - 0x77, 0xe9, 0x0e, 0xc2, 0x3a, 0xd1, 0x50, 0xec, 0xe6, 0x48, 0x43, 0x1b, - 0x2b, 0xc1, 0x31, 0x02, 0x35, 0x6b, 0x6b, 0xf8, 0xd7, 0x4f, 0xee, 0xdc, - 0xf1, 0x7e, 0x80, 0xa7, 0xe5, 0x0a, 0x75, 0xab, 0x68, 0xf8, 0xeb, 0xa8, - 0x52, 0x35, 0xb0, 0xe7, 0xbe, 0xee, 0x54, 0x2d, 0x5a, 0x2b, 0xb0, 0x60, - 0xa8, 0xa6, 0xd4, 0x1f, 0x82, 0x5d, 0x58, 0xe6, 0xf9, 0x6b, 0xd3, 0x4d, - 0x5e, 0x2e, 0x79, 0x7e, 0x80, 0xf2, 0xc8, 0x45, 0x7c, 0x7d, 0x46, 0x20, - 0x4f, 0x44, 0x6a, 0xdc, 0xa7, 0x81, 0x2b, 0x34, 0x41, 0xfa, 0x7f, 0x64, - 0xa0, 0x88, 0xba, 0x23, 0x88, 0xd6, 0x93, 0x39, 0x99, 0x9a, 0xad, 0x99, - 0x37, 0xfc, 0x90, 0xf7, 0x37, 0x98, 0xbe, 0xb9, 0xd4, 0xd2, 0x1d, 0xa4, - 0x6e, 0x5d, 0x07, 0xcf, 0x60, 0x33, 0xfc, 0x0d, 0x91, 0x5d, 0x1e, 0x1d, - 0x46, 0x05, 0x33, 0xd1, 0xd0, 0x5b, 0x14, 0xd8, 0x9e, 0x13, 0x7e, 0x71, - 0x2f, 0x32, 0x5f, 0xfa, 0xa4, 0x42, 0xd6, 0xdf, 0x26, 0x76, 0xf7, 0xe7, - 0xdb, 0xd6, 0x8d, 0x06, 0x62, 0x9b, 0x36, 0x27, 0xe6, 0x87, 0x3e, 0xd5, - 0xfe, 0x3d, 0x86, 0xa1, 0xef, 0x69, 0x3f, 0x35, 0x52, 0x46, 0xd2, 0x6c, - 0xf8, 0xfe, 0xfc, 0x57, 0xf7, 0x30, 0x01, 0x12, 0x3d, 0x2f, 0x02, 0xff, - 0x44, 0xc1, 0x33, 0xe6, 0x77, 0x40, 0x54, 0xff, 0xbd, 0x1b, 0xfa, 0xf2, - 0xb3, 0x09, 0x24, 0xe3, 0xed, 0x05, 0xe6, 0x67, 0xe4, 0xf8, 0x7e, 0x79, - 0x8b, 0xcd, 0x38, 0xf1, 0x55, 0x81, 0xcd, 0x5b, 0x26, 0xcb, 0xa8, 0xc5, - 0xe4, 0x26, 0x51, 0x39, 0x62, 0x73, 0x37, 0xa1, 0x24, 0x98, 0x4b, 0xc3, - 0x69, 0x4d, 0xc3, 0x6a, 0x42, 0x1f, 0xfa, 0x0d, 0xbd, 0x36, 0x5e, 0x3a, - 0xf7, 0x10, 0xc3, 0x0e, 0xc0, 0x8d, 0x10, 0xc2, 0x6e, 0xd9, 0xae, 0xdb, - 0xce, 0x3d, 0xbe, 0x40, 0x4e, 0xee, 0x9c, 0x5b, 0x30, 0x6a, 0x7b, 0xdc, - 0x3a, 0x16, 0x8f, 0xf5, 0x43, 0x08, 0x85, 0xf4, 0x26, 0xd6, 0x5d, 0xb9, - 0x61, 0x18, 0x88, 0xbe, 0x66, 0xf9, 0xb1, 0xd5, 0xa9, 0x6b, 0x63, 0x56, - 0xef, 0x27, 0x3a, 0x95, 0x2c, 0xe9, 0xc7, 0x7f, 0x0d, 0xa5, 0x33, 0xba, - 0xa2, 0xfb, 0x06, 0x59, 0x21, 0x5e, 0x3d, 0x81, 0x25, 0xcc, 0x2e, 0x5e, - 0xf9, 0x01, 0xbf, 0xbf, 0x6f, 0x45, 0xbc, 0xbb, 0x1e, 0xda, 0xd4, 0x83, - 0xe8, 0x5b, 0x27, 0x15, 0x6b, 0xb2, 0x6f, 0x30, 0x5f, 0xb3, 0x46, 0xfd, - 0x9c, 0x6d, 0x1d, 0x6c, 0xa4, 0x14, 0x42, 0x4e, 0x3e, 0x36, 0x45, 0x8e, - 0x90, 0x46, 0x72, 0x48, 0x57, 0xc5, 0xbd, 0x40, 0x93, 0x75, 0x39, 0xe0, - 0x91, 0xca, 0xde, 0x35, 0x9b, 0xac, 0x59, 0xcf, 0x86, 0xe4, 0xd8, 0x60, - 0x4f, 0x5b, 0xb9, 0x5b, 0x1b, 0xf6, 0x0f, 0x74, 0x30, 0xfb, 0x7f, 0x4f, - 0xd8, 0x1c, 0x79, 0x46, 0x2c, 0x9b, 0x56, 0xb3, 0x5d, 0xaa, 0xf1, 0x02, - 0x11, 0xac, 0x71, 0xc7, 0x78, 0xf7, 0x01, 0x2e, 0x32, 0x3e, 0xd1, 0x5a, - 0x8e, 0x47, 0xfb, 0xf5, 0xe8, 0xf2, 0x06, 0xe1, 0x69, 0x0d, 0x13, 0xd0, - 0x38, 0xa5, 0x7e, 0x36, 0x26, 0xae, 0x24, 0x7f, 0xdf, 0xe3, 0xf9, 0x37, - 0x29, 0x50, 0xd1, 0x05, 0x5d, 0xae, 0x86, 0xab, 0x1f, 0xbf, 0xe9, 0xa4, - 0xc9, 0x9f, 0x4b, 0x66, 0x38, 0x44, 0x48, 0x37, 0x57, 0xd0, 0xc6, 0x07, - 0x7d, 0x46, 0xab, 0x66, 0x62, 0x31, 0x83, 0x63, 0x51, 0x8b, 0x8c, 0x7d, - 0xb9, 0xac, 0x4e, 0xbb, 0xd7, 0xb1, 0x02, 0xd5, 0x7b, 0xf9, 0x03, 0xdb, - 0x1a, 0x73, 0x89, 0x31, 0x42, 0x88, 0x57, 0x70, 0xbd, 0xea, 0x7d, 0x30, - 0x67, 0xf3, 0x2c, 0xe1, 0xb0, 0x23, 0x22, 0x80, 0x19, 0xbb, 0x76, 0x0d, - 0xe0, 0xb0, 0xe4, 0xc2, 0x6c, 0xf4, 0x46, 0x6c, 0xec, 0x13, 0x0b, 0x62, - 0x4e, 0x76, 0x6a, 0x91, 0xbb, 0x06, 0x3e, 0x2b, 0x72, 0x49, 0xfd, 0x98, - 0x52, 0x16, 0x5d, 0x05, 0x14, 0x56, 0x96, 0xb5, 0x65, 0x97, 0xe4, 0xdf, - 0x07, 0x23, 0xb4, 0xcd, 0xc0, 0x64, 0x88, 0x12, 0xde, 0x31, 0x22, 0x47, - 0x83, 0xa7, 0xa7, 0x6d, 0x9f, 0x1d, 0x8d, 0x51, 0xee, 0x84, 0x21, 0x8d, - 0xd1, 0xce, 0x33, 0xf1, 0x0e, 0xb8, 0x3f, 0xcb, 0x1f, 0xf1, 0x3a, 0x27, - 0xd7, 0xa6, 0x24, 0x44, 0x58, 0x93, 0x39, 0xfd, 0xb2, 0xf0, 0x8b, 0x72, - 0x2f, 0x6b, 0x09, 0x12, 0xe9, 0x33, 0x82, 0xc4, 0x0d, 0xef, 0x3d, 0xe7, - 0x7e, 0x4f, 0xb5, 0xeb, 0xc0, 0xf9, 0x2d, 0xd0, 0xd0, 0xb0, 0xa5, 0x74, - 0x1e, 0x57, 0x0c, 0x12, 0x57, 0xcb, 0x2a, 0x6e, 0x69, 0x3a, 0x8c, 0x0d, - 0x09, 0x81, 0x1a, 0x3d, 0x7e, 0x14, 0xbc, 0x59, 0x12, 0x5b, 0x4f, 0xbf, - 0x2c, 0x99, 0x19, 0xf3, 0xc1, 0x2a, 0xad, 0x83, 0xac, 0xf5, 0x37, 0xa3, - 0x0e, 0xce, 0x90, 0xdf, 0x39, 0x5b, 0xbd, 0x76, 0x66, 0x7a, 0xec, 0x99, - 0xa5, 0x2e, 0xaf, 0xbd, 0x74, 0x1c, 0x9b, 0x2f, 0xad, 0xbb, 0x04, 0x2b, - 0xb9, 0x50, 0x98, 0x7b, 0x97, 0xb0, 0x7b, 0x01, 0x4c, 0x5a, 0xae, 0x60, - 0xdd, 0xee, 0xc2, 0x08, 0xf5, 0x71, 0x74, 0x9a, 0xfe, 0x50, 0x9d, 0x71, - 0xf9, 0x18, 0xfe, 0xfd, 0xd1, 0x9e, 0x87, 0xa0, 0xa4, 0xba, 0x2e, 0x3c, - 0xd5, 0x92, 0x49, 0xba, 0x79, 0xb9, 0xd4, 0xeb, 0xe6, 0x1a, 0xd6, 0x3d, - 0x1f, 0x64, 0xd8, 0xc2, 0x73, 0xe7, 0xdd, 0xfd, 0xfe, 0x6e, 0xe5, 0x7d, - 0x93, 0x3b, 0x38, 0xda, 0x58, 0x2d, 0xba, 0x80, 0x4e, 0x7e, 0x72, 0x40, - 0xd2, 0x3f, 0xb5, 0x95, 0xf3, 0x01, 0x5e, 0x05, 0x77, 0x13, 0x5a, 0xb0, - 0xa2, 0xa4, 0x3a, 0x8c, 0xf7, 0x41, 0x30, 0x25, 0x2f, 0x12, 0xd3, 0x55, - 0x44, 0x3a, 0xcc, 0x88, 0x80, 0xf1, 0x45, 0xa9, 0xfb, 0x72, 0x96, 0xf2, - 0x43, 0x42, 0x37, 0xc1, 0x8e, 0x88, 0x0c, 0x75, 0x1e, 0x74, 0x8c, 0x37, - 0x79, 0x3c, 0xe7, 0xca, 0x7c, 0x65, 0x87, 0x6f, 0x16, 0xf1, 0xed, 0x80, - 0xbb, 0x43, 0x7d, 0xb8, 0x1e, 0x0b, 0x8c, 0x6e, 0xa8, 0x97, 0xa3, 0x35, - 0xce, 0x4a, 0x00, 0x94, 0xec, 0x94, 0xed, 0xe0, 0xc8, 0x7e, 0x6a, 0xb2, - 0xb0, 0x2c, 0x4e, 0x40, 0x79, 0x81, 0xe1, 0xea, 0xfb, 0x25, 0x56, 0xac, - 0xa1, 0x3c, 0xad, 0x40, 0x5e, 0xa3, 0xf0, 0x27, 0x2e, 0x54, 0xb5, 0x71, - 0x56, 0x94, 0x75, 0x6f, 0x62, 0xa8, 0x3e, 0x85, 0xcf, 0x30, 0x92, 0x35, - 0xb2, 0xe6, 0x54, 0xcc, 0x9d, 0x79, 0xca, 0x48, 0x7b, 0xc1, 0xe0, 0x19, - 0xdc, 0xa7, 0x11, 0x62, 0x8b, 0x00, 0x4a, 0xb5, 0x6c, 0x4e, 0x4e, 0x34, - 0x52, 0xfc, 0x1c, 0x66, 0xe8, 0x3e, 0x25, 0xf3, 0x21, 0xd9, 0x06, 0xc5, - 0x97, 0x6d, 0x19, 0xf8, 0x75, 0x73, 0xb9, 0x61, 0xa3, 0x2e, 0xac, 0x26, - 0xc9, 0xec, 0x51, 0x6c, 0x46, 0xe2, 0xe9, 0x07, 0xf8, 0xfa, 0xe3, 0x21, - 0xbc, 0xee, 0x77, 0x70, 0xbe, 0x11, 0x82, 0x5b, 0x57, 0x41, 0x02, 0x0b, - 0xfa, 0x0c, 0x6f, 0x83, 0x67, 0xe1, 0x86, 0xca, 0x8c, 0x43, 0xea, 0x5a, - 0x30, 0x9c, 0xe4, 0xe8, 0x26, 0x44, 0xc2, 0x01, 0x02, 0xb6, 0x0b, 0x47, - 0x21, 0x10, 0x37, 0xdf, 0xef, 0xa7, 0x1f, 0x6b, 0x74, 0xb4, 0x8a, 0x71, - 0x5a, 0x5a, 0xd3, 0x49, 0x0c, 0xb8, 0xc6, 0xa1, 0x8f, 0xd6, 0xf2, 0x8a, - 0x9d, 0x8a, 0x44, 0xf4, 0x85, 0xbc, 0xd1, 0x54, 0xf4, 0x35, 0xa0, 0x42, - 0x9c, 0xd8, 0x89, 0x44, 0x7a, 0xf1, 0xcd, 0x7d, 0x55, 0x74, 0xd1, 0x3f, - 0x06, 0x5d, 0xfd, 0xee, 0xbb, 0x5e, 0xf4, 0x42, 0x7f, 0x67, 0x8b, 0x01, - 0x28, 0xff, 0x14, 0x1f, 0x7e, 0x7e, 0xe4, 0xfc, 0xc1, 0x4a, 0x48, 0x76, - 0xe7, 0x49, 0x02, 0xff, 0xaa, 0x23, 0x05, 0x81, 0x92, 0x44, 0x55, 0x02, - 0xab, 0x19, 0x3a, 0x95, 0x85, 0x12, 0xdd, 0x3d, 0x28, 0x59, 0x25, 0xf5, - 0x67, 0xc9, 0x5c, 0x68, 0xc7, 0xc8, 0xdf, 0xb0, 0x8d, 0xe0, 0x1c, 0x27, - 0x49, 0x0f, 0xaf, 0x0f, 0x3d, 0xaf, 0x36, 0x1b, 0x2c, 0xce, 0x1b, 0xab, - 0x38, 0x79, 0xb9, 0x55, 0xa5, 0x25, 0xe7, 0xfa, 0xda, 0x4f, 0x1e, 0x5c, - 0x32, 0xa9, 0x91, 0x1d, 0xb6, 0x46, 0x90, 0xb7, 0x65, 0x65, 0xde, 0x2f, - 0x6d, 0x41, 0xd6, 0x1a, 0x1b, 0x79, 0x12, 0x56, 0x63, 0x0c, 0x94, 0xfc, - 0x11, 0xad, 0x7e, 0x7f, 0xbc, 0xf0, 0xc4, 0x0d, 0x02, 0xf9, 0x9f, 0xf4, - 0xcb, 0x8a, 0x7d, 0xc7, 0x80, 0x93, 0xee, 0x61, 0x70, 0x02, 0xb4, 0xcc, - 0x45, 0xf2, 0xe2, 0x2a, 0x64, 0x11, 0xd3, 0x45, 0xb1, 0x3b, 0x50, 0xfd, - 0xce, 0x82, 0x7b, 0x8b, 0x2a, 0x28, 0x3e, 0x86, 0xd1, 0xb4, 0xd2, 0x8d, - 0x8e, 0x1d, 0xea, 0xe1, 0x9d, 0x0c, 0x07, 0x8b, 0x4f, 0xc7, 0xef, 0x31, - 0x22, 0x67, 0xc0, 0xf1, 0x4e, 0x58, 0xb8, 0x0f, 0x0c, 0xb8, 0xc6, 0xa1, - 0x8f, 0xae, 0x8c, 0x8e, 0x4b, 0xe1, 0xe2, 0x1f, 0xfc, 0xa6, 0x9e, 0xca, - 0x65, 0x92, 0xcd, 0x7d, 0x3f, 0xc0, 0x43, 0xae, 0xce, 0xf4, 0xba, 0x54, - 0x1b, 0x5c, 0x3e, 0xf0, 0xaa, 0x7b, 0xab, 0x99, 0xfc, 0x20, 0xc6, 0x0c, - 0x82, 0x6e, 0x93, 0xc2, 0x59, 0x52, 0x7a, 0x20, 0x7e, 0x7e, 0xe4, 0xfc, - 0xc1, 0x4a, 0x48, 0x76, 0xe7, 0x49, 0x02, 0xff, 0xaa, 0x8b, 0x05, 0x81, - 0x7b, 0x18, 0x41, 0xf8, 0x9d, 0x79, 0xf6, 0x48, 0x7b, 0xc1, 0xe0, 0x19, - 0xdc, 0xa7, 0x11, 0x62, 0xff, 0x8e, 0xe1, 0xb8, 0x5f, 0x15, 0x0b, 0xd8, - 0x87, 0x00, 0xd0, 0x5b, 0x5b, 0x95, 0x9c, 0x46, 0xd1, 0x4f, 0x63, 0x8c, - 0xda, 0x13, 0x93, 0x3b, 0x35, 0xda, 0x69, 0xb1, 0x18, 0x74, 0xf8, 0x6c, - 0xc9, 0xec, 0x51, 0x6c, 0x46, 0xe2, 0xe9, 0x07, 0xf9, 0xba, 0xe3, 0x21, - 0xbc, 0xee, 0x77, 0x70, 0x83, 0x4b, 0xe6, 0x8c, 0x7f, 0x56, 0x24, 0x69, - 0xad, 0x61, 0x01, 0x85, 0x13, 0x7a, 0xc0, 0x0e, 0x13, 0x66, 0xc6, 0xc6, - 0x10, 0x15, 0x6b, 0x93, 0xc5, 0x00, 0x6d, 0x16, 0xa9, 0x4f, 0xb1, 0xb0, - 0x6a, 0xc4, 0x8d, 0xe3, 0x1b, 0xca, 0xb5, 0x02, 0x34, 0x3b, 0x36, 0xe8, - 0xdc, 0x2d, 0xf6, 0x22, 0xf1, 0x23, 0xc9, 0xcd, 0x65, 0xdb, 0x6d, 0x77, - 0x82, 0xec, 0xdd, 0x31, 0x2d, 0x2b, 0x9c, 0xa2, 0x9a, 0x51, 0xbb, 0x40, - 0xb4, 0x97, 0x9b, 0x61, 0x80, 0x1c, 0x3f, 0x66, 0x3f, 0x44, 0x87, 0x67, - 0x01, 0x6c, 0xf2, 0xae, 0x75, 0xc9, 0x49, 0x81, 0x07, 0x72, 0x02, 0xf0, - 0x46, 0x3e, 0x0b, 0xe0, 0x9c, 0x2f, 0xe1, 0x15, 0x72, 0xa0, 0xae, 0x83, - 0x0e, 0xba, 0x2e, 0xd8, 0xf4, 0xc4, 0x56, 0x21, 0x69, 0xaa, 0xdb, 0x75, - 0x7b, 0x8b, 0x81, 0xe2, 0x68, 0xf7, 0x06, 0xa9, 0x7f, 0xa3, 0x61, 0x50, - 0x1f, 0x79, 0xf6, 0x17, 0x27, 0x92, 0xaf, 0x34, 0x4f, 0xab, 0x7c, 0xcf, - 0xc1, 0xc5, 0xc2, 0x5f, 0x12, 0x26, 0x36, 0x40, 0x51, 0xf5, 0x88, 0x9c, - 0x91, 0x37, 0xa9, 0xf9, 0xcf, 0xcc, 0xa0, 0x4a, 0x3f, 0x33, 0x68, 0xd3, - 0xc7, 0x47, 0x1f, 0xb0, 0x83, 0xb9, 0x79, 0x3f, 0xcb, 0x25, 0x68, 0x28, - 0xd9, 0xbb, 0x7e, 0x9a, 0xb5, 0xb3, 0x80, 0xc3, 0x07, 0x57, 0xa8, 0xce, - 0xed, 0xf2, 0xba, 0x2a, 0x5c, 0xe4, 0x55, 0xac, 0xec, 0x9b, 0x3a, 0x83, - 0x12, 0x68, 0x2c, 0x50, 0x12, 0x61, 0x60, 0xa4, 0x10, 0x7c, 0xa1, 0x54, - 0x49, 0x53, 0x27, 0x90, 0xbd, 0x3b, 0x99, 0x83, 0x2f, 0x28, 0xa1, 0x46, - 0x32, 0xf3, 0xfd, 0x6c, 0xc8, 0xa3, 0x2f, 0x0c, 0x2a, 0x40, 0x40, 0xf9, - 0xfb, 0xcf, 0x10, 0x24, 0x2b, 0x23, 0x8e, 0x01, 0x10, 0x39, 0xa9, 0xed, - 0xee, 0x1c, 0xf4, 0xd1, 0xd5, 0xeb, 0x86, 0xf6, 0x55, 0xc5, 0xb2, 0xbb, - 0xd7, 0xfd, 0x5f, 0xf3, 0x20, 0x45, 0x49, 0x1e, 0x21, 0xd6, 0xc0, 0x96, - 0x0a, 0x56, 0x79, 0xd7, 0x75, 0xcf, 0x02, 0xda, 0x17, 0x82, 0x95, 0x24, - 0x3c, 0xe8, 0xef, 0xb2, 0x47, 0x4e, 0x2b, 0xec, 0xd8, 0x84, 0x4c, 0xb8, - 0x36, 0xd7, 0xab, 0xee, 0xf7, 0xec, 0xae, 0xb2, 0x9c, 0x85, 0x22, 0x0d, - 0x1c, 0xf8, 0x14, 0x60, 0xf7, 0x05, 0x3a, 0xbc, 0xcc, 0x2d, 0xf8, 0x20, - 0x08, 0xfd, 0xa7, 0xc9, 0xf6, 0x07, 0xcb, 0x1c, 0x8a, 0x96, 0x8d, 0x76, - 0x30, 0x1b, 0x27, 0x32, 0xb2, 0x20, 0xfe, 0x3a, 0x5b, 0x05, 0x7c, 0xa9, - 0xc0, 0x2c, 0x90, 0x63, 0x4c, 0xf9, 0xe9, 0xb8, 0xe3, 0xbd, 0x03, 0xed, - 0xea, 0x07, 0x54, 0x92, 0x13, 0xfb, 0x21, 0x81, 0x71, 0x25, 0x59, 0xd6, - 0xdb, 0xd7, 0xf6, 0x76, 0x2a, 0x46, 0x3b, 0x40, 0xd0, 0x6d, 0xa4, 0xac, - 0x18, 0x8a, 0xc4, 0x99, 0xc0, 0x4e, 0xb7, 0xf2, 0x6c, 0x35, 0xa6, 0x74, - 0xf2, 0xb1, 0xa4, 0xba, 0x28, 0x7c, 0x9f, 0x8a, 0xb4, 0x81, 0xef, 0xef, - 0xec, 0xb9, 0x59, 0x2b, 0x0b, 0xd7, 0x57, 0x58, 0x7f, 0xd0, 0x66, 0xb5, - 0x54, 0xef, 0x60, 0x42, 0xed, 0x35, 0xf0, 0xf5, 0x3e, 0x1c, 0x9c, 0xe8, - 0xfe, 0xc6, 0x3f, 0x34, 0x37, 0x96, 0x46, 0xab, 0x50, 0x19, 0x23, 0x41, - 0x92, 0xe6, 0xd7, 0x79, 0x54, 0xb4, 0xe2, 0x4c, 0xe4, 0x3f, 0x2e, 0x9a, - 0x8c, 0x94, 0x84, 0x45, 0x62, 0xc8, 0xd4, 0xeb, 0xe4, 0x1a, 0xd6, 0x3d, - 0xaa, 0x55, 0x7d, 0xd4, 0x96, 0xea, 0x23, 0x7a, 0x4c, 0x20, 0x94, 0xff, - 0x6b, 0xf6, 0x1c, 0xb4, 0x07, 0x2a, 0x6f, 0x4a, 0x28, 0xec, 0x73, 0x14, - 0x6c, 0x2d, 0x88, 0x6b, 0x65, 0x44, 0x81, 0xf4, 0x52, 0x83, 0x52, 0xa6, - 0x90, 0xdc, 0xea, 0xc4, 0x42, 0x90, 0x12, 0x50, 0xf2, 0x61, 0x79, 0x6c, - 0x51, 0x6a, 0x35, 0x8d, 0x4b, 0xb3, 0x0f, 0x98, 0x90, 0x40, 0x93, 0xd6, - 0xe2, 0xba, 0xc7, 0x95, 0x56, 0x53, 0x0d, 0x10, 0x25, 0x79, 0x9b, 0xa7, - 0x8d, 0xa4, 0xca, 0x0f, 0x1b, 0x16, 0xf0, 0x29, 0x7b, 0x8b, 0x79, 0xa8, - 0xc3, 0xc3, 0x65, 0x47, 0x57, 0x15, 0x2f, 0x7d, 0xf5, 0x6a, 0x5a, 0xa3, - 0x1a, 0x02, 0x12, 0xec, 0xa5, 0x46, 0xea, 0xec, 0x0c, 0xa1, 0xfa, 0xff, - 0x8c, 0x84, 0x95, 0xff, 0x8c, 0xea, 0x53, 0x14, 0xa0, 0x18, 0x01, 0xf9, - 0xfe, 0xe1, 0xef, 0x08, 0x5b, 0xc8, 0x3a, 0x29, 0x70, 0x51, 0xee, 0x8d, - 0x79, 0x0b, 0xa4, 0x9b, 0x7e, 0x00, 0x8e, 0xfb, 0x89, 0x44, 0x8a, 0x9c, - 0x10, 0xd2, 0x3f, 0x14, 0x01, 0xcd, 0xaf, 0x98, 0x3a, 0x1c, 0x40, 0x1f, - 0x57, 0xa9, 0xcd, 0x12, 0xd7, 0x0d, 0x64, 0x56, 0xeb, 0xee, 0x0f, 0x8d, - 0x08, 0x97, 0x85, 0x09, 0x67, 0x7b, 0x5b, 0xd3, 0x8e, 0xd1, 0x09, 0xc6, - 0xd7, 0xdd, 0xeb, 0x7d, 0xfd, 0xc3, 0x3d, 0xf3, 0x8d, 0xd0, 0xa8, 0xcb, - 0xf6, 0x6e, 0x16, 0xd8, 0x41, 0xfa, 0xb9, 0x88, 0x2c, 0x8a, 0x96, 0xd0, - 0x39, 0xf6, 0x5b, 0x2b, 0x47, 0xc9, 0xc5, 0xbd, 0xd5, 0xf2, 0xc3, 0xec, - 0x44, 0x2d, 0x7f, 0xaa, 0x61, 0x38, 0x5e, 0x3e, 0x47, 0xee, 0x82, 0xdb, - 0x32, 0xb6, 0x55, 0x76, 0x03, 0xe0, 0xc2, 0x48, 0xca, 0xed, 0xe8, 0xcf, - 0xb4, 0x1f, 0x82, 0xf5, 0x91, 0xf9, 0x67, 0x22, 0xbe, 0xe5, 0x92, 0x07, - 0x16, 0x41, 0xaf, 0x3c, 0x70, 0xe3, 0x08, 0x9d, 0xc7, 0xfb, 0x38, 0xbc, - 0xed, 0xcf, 0xd6, 0x8e, 0xc3, 0xa0, 0x76, 0x78, 0xef, 0x72, 0x82, 0xc4, - 0x2a, 0x52, 0xff, 0xb1, 0x63, 0x29, 0x8b, 0xf5, 0xca, 0x6d, 0x61, 0x9c, - 0x8f, 0x62, 0x59, 0xa1, 0x1b, 0x04, 0x56, 0x75, 0xbd, 0x39, 0x3b, 0xf1, - 0x67, 0x1d, 0x34, 0x31, 0xbb, 0xad, 0x32, 0x5d, 0x03, 0x49, 0xa6, 0x64, - 0x0d, 0x39, 0x58, 0xd0, 0x9d, 0x23, 0xe1, 0x01, 0x69, 0x57, 0xda, 0xe8, - 0x4d, 0x97, 0x60, 0xe0, 0x13, 0x3f, 0x49, 0x30, 0xd7, 0x6b, 0xe5, 0x62, - 0xc5, 0xfb, 0x59, 0xee, 0x54, 0xf9, 0x81, 0x11, 0x2e, 0x67, 0x51, 0xd8, - 0xc7, 0x80, 0xeb, 0xca, 0x7f, 0x20, 0xf0, 0xf0, 0xe2, 0x2b, 0x15, 0x11, - 0xd4, 0x21, 0x80, 0x91, 0x50, 0x4a, 0x29, 0x81, 0xf1, 0xbb, 0x7e, 0xe3, - 0x8b, 0x37, 0x50, 0x0c, 0x4e, 0x28, 0x64, 0xfd, 0x54, 0xfc, 0x55, 0xeb, - 0x1d, 0xd6, 0x10, 0x64, 0x5a, 0xf3, 0xb1, 0x6b, 0x34, 0x8c, 0x20, 0x81, - 0xcb, 0x23, 0xdc, 0x70, 0x2e, 0x4f, 0x76, 0x92, 0x8e, 0xa7, 0x0a, 0xe1, - 0x18, 0x37, 0xc6, 0x87, 0x5e, 0xfe, 0xfa, 0x1f, 0x7a, 0x89, 0x85, 0xcb, - 0x23, 0x3e, 0x8a, 0xb9, 0xc3, 0x3a, 0x4f, 0x61, 0xf0, 0x93, 0x20, 0xca, - 0x06, 0x05, 0x3a, 0x7a, 0xc6, 0x63, 0x90, 0xfb, 0x3d, 0x4c, 0xa5, 0xe2, - 0x6e, 0x5c, 0x9a, 0x69, 0x06, 0x10, 0xcd, 0x03, 0x13, 0xd2, 0x1c, 0x28, - 0x43, 0x95, 0x75, 0x7a, 0xf9, 0xec, 0xfc, 0x3b, 0x01, 0x9a, 0x4c, 0x11, - 0xfb, 0x99, 0x0f, 0xd8, 0x57, 0x3e, 0x7b, 0xd2, 0xc2, 0x07, 0xcb, 0xfc, - 0x55, 0x9f, 0xa6, 0xe9, 0x9b, 0x53, 0x46, 0x12, 0x90, 0xc1, 0xcf, 0x77, - 0x38, 0x90, 0xa8, 0x08, 0xc8, 0xe0, 0x78, 0x91, 0x4b, 0xd8, 0x18, 0xd0, - 0x88, 0x03, 0xd4, 0x2f, 0xc5, 0xfa, 0xc2, 0xa8, 0x91, 0xd7, 0xa9, 0xa3, - 0x3b, 0x0b, 0x12, 0x27, 0x2c, 0xee, 0x4a, 0xb6, 0x16, 0xea, 0xa7, 0xde, - 0x09, 0xc8, 0x15, 0xe6, 0xe5, 0xe2, 0x05, 0x33, 0xe1, 0x62, 0x2a, 0x3f, - 0xb2, 0xe7, 0x82, 0x9d, 0xed, 0x3c, 0xfa, 0xbf, 0x49, 0x40, 0x3f, 0x35, - 0x50, 0x55, 0x3f, 0xdd, 0x73, 0xf0, 0xbc, 0xd6, 0x71, 0x38, 0xa9, 0x2a, - 0x26, 0x60, 0x96, 0xc2, 0xcf, 0xd3, 0xee, 0x64, 0x1c, 0xf3, 0xfc, 0xbe, - 0x70, 0xf2, 0xe4, 0xeb, 0xcc, 0x89, 0xc1, 0x93, 0x1a, 0xea, 0x8c, 0x83, - 0x1c, 0x7c, 0xb1, 0x55, 0xc3, 0xf4, 0xf8, 0xab, 0x55, 0xa7, 0xbf, 0x65, - 0x5f, 0x1d, 0x94, 0xf6, 0x52, 0xd2, 0xaf, 0x23, 0x0f, 0x56, 0xb1, 0xef, - 0x2e, 0x45, 0xbb, 0xb7, 0xd8, 0x5e, 0x52, 0x8c, 0xb8, 0x9d, 0x37, 0x13, - 0x24, 0x98, 0x4b, 0xc3, 0x69, 0x4d, 0xc3, 0x6a, 0x42, 0x1f, 0xe2, 0x03, - 0xbd, 0x36, 0x5a, 0x7a, 0x5a, 0xf6, 0xf5, 0xe7, 0x4e, 0xe8, 0xbc, 0xed, - 0x26, 0xd7, 0x8b, 0xab, 0x0a, 0x74, 0x90, 0xd8, 0xb6, 0x26, 0xc7, 0xfc, - 0x77, 0x11, 0xca, 0x0f, 0xec, 0xbe, 0x6c, 0x88, 0xc2, 0x67, 0x6c, 0xc6, - 0x32, 0x0d, 0x2d, 0x0e, 0x27, 0x96, 0x7c, 0x19, 0x7b, 0x36, 0x07, 0xc1, - 0xa4, 0x13, 0x2c, 0xb9, 0x21, 0xa0, 0xba, 0x34, 0xab, 0x27, 0xcb, 0x42, - 0x59, 0xe2, 0x11, 0x1f, 0x92, 0x73, 0x56, 0xfd, 0x70, 0x83, 0xa3, 0xf4, - 0xf8, 0xfb, 0xbd, 0xe6, 0x6b, 0xa7, 0x95, 0x67, 0x44, 0x73, 0x0a, 0x91, - 0xad, 0x76, 0x9f, 0x98, 0xe7, 0xf4, 0x7d, 0x0f, 0x5e, 0xca, 0xda, 0x3d, - 0xa9, 0x6b, 0xeb, 0x59, 0x39, 0xd8, 0xc4, 0xfc, 0x5b, 0x81, 0xad, 0xd2, - 0x13, 0x8d, 0x98, 0xf5, 0xa5, 0xa0, 0x00, 0xb8, 0x7d, 0xd0, 0xd0, 0xa5, - 0x6c, 0x65, 0x45, 0x7f, 0x53, 0x6d, 0xbe, 0xa2, 0xb5, 0xc3, 0x62, 0x10, - 0xbe, 0x1e, 0x89, 0x59, 0xa0, 0x6a, 0x2d, 0xe7, 0x4e, 0x08, 0x5f, 0x63, - 0xb6, 0x2f, 0x2a, 0x0b, 0xad, 0x41, 0xf6, 0x1c, 0x73, 0xa3, 0x14, 0x07, - 0x3c, 0x9b, 0xb9, 0xa2, 0xea, 0x76, 0x12, 0xc3, 0x55, 0x0e, 0x36, 0x4c, - 0xf8, 0x4b, 0xb0, 0x85, 0xa9, 0xce, 0xbd, 0x0c, 0xb6, 0xb5, 0x41, 0x88, - 0xaa, 0xa1, 0xea, 0x99, 0x81, 0x09, 0x92, 0x6e, 0xb6, 0xc0, 0xc1, 0x9b, - 0x3e, 0xd8, 0xa6, 0x09, 0xea, 0xa9, 0xa4, 0xe1, 0x4d, 0xc1, 0xa8, 0x81, - 0x6b, 0x0e, 0xe9, 0x0c, 0xd4, 0x8d, 0x55, 0xc3, 0x3e, 0x09, 0xb9, 0xbd, - 0xd6, 0x9e, 0x52, 0x9d, 0x0c, 0xc6, 0xc5, 0x68, 0x90, 0xc4, 0xf4, 0x3a, - 0xa3, 0x5e, 0xaa, 0x56, 0x37, 0xa7, 0x3f, 0x17, 0xf7, 0x5e, 0xb1, 0x68, - 0x8b, 0x60, 0x1f, 0xdd, 0xed, 0x14, 0x7e, 0x54, 0x7e, 0xa0, 0xc6, 0x9d, - 0xb4, 0x2b, 0xf8, 0xf8, 0x6a, 0xcf, 0x16, 0xd9, 0x20, 0xd2, 0x1a, 0x02, - 0x3d, 0x97, 0x59, 0x99, 0xea, 0x06, 0x84, 0x7f, 0x42, 0xa2, 0x76, 0x4e, - 0x13, 0xb2, 0x29, 0x3e, 0x8d, 0x5e, 0x86, 0xb3, 0x3f, 0xf6, 0x61, 0xb1, - 0xfc, 0xad, 0x4f, 0xd4, 0x2f, 0xdd, 0xe2, 0xb3, 0x5c, 0xee, 0xfd, 0x8d, - 0x4d, 0x57, 0x74, 0x65, 0x1e, 0xa2, 0xc5, 0xc5, 0xa4, 0x8d, 0x24, 0x0b, - 0x02, 0x73, 0x56, 0x3f, 0xd3, 0xdb, 0x96, 0x88, 0xc8, 0xa5, 0xd2, 0x8c, - 0x6d, 0xdd, 0x06, 0x7c, 0x2a, 0xfb, 0x44, 0xac, 0x72, 0x49, 0x8d, 0x65, - 0xfe, 0x9e, 0x17, 0xb9, 0xdb, 0x32, 0x7f, 0x8a, 0x07, 0xeb, 0x03, 0x5d, - 0x83, 0xc2, 0x07, 0x18, 0xc0, 0xc8, 0x4d, 0xd3, 0x03, 0x98, 0xa7, 0x01, - 0xcb, 0x7b, 0x10, 0xa4, 0xb6, 0xf1, 0xd8, 0x83, 0x82, 0xe5, 0xbd, 0xaf, - 0xf8, 0x8e, 0x8c, 0x1b, 0xf9, 0x98, 0xf4, 0x8c, 0x9d, 0xc8, 0x25, 0xa0, - 0x72, 0xee, 0xfa, 0x8c, 0xd4, 0x1b, 0x11, 0xc0, 0xb5, 0x99, 0x6c, 0x9f, - 0x60, 0x43, 0x07, 0x16, 0x75, 0xb3, 0x5e, 0x5c, 0xbc, 0xa6, 0xee, 0x21, - 0xb3, 0x96, 0xc2, 0x01, 0xe9, 0x8b, 0x74, 0x12, 0x93, 0xb4, 0x35, 0xc4, - 0xe8, 0x7f, 0xe3, 0x50, 0x92, 0xb0, 0x61, 0x04, 0x61, 0x2e, 0xef, 0x2b, - 0x9e, 0xc4, 0xfb, 0xee, 0x45, 0x5c, 0x2a, 0x0f, 0x35, 0x44, 0x17, 0x11, - 0x48, 0x73, 0xfb, 0x7f, 0x33, 0x1a, 0xf5, 0x9c, 0x24, 0x66, 0x41, 0x17, - 0xf8, 0xf2, 0x1f, 0xd8, 0x75, 0x96, 0x14, 0xdd, 0x95, 0x06, 0x7f, 0x51, - 0xf8, 0x5e, 0xd7, 0xab, 0x25, 0x47, 0x29, 0xce, 0xd3, 0xe2, 0xec, 0x00, - 0x11, 0x01, 0x03, 0x98, 0x1d, 0x24, 0x7a, 0x97, 0xec, 0x97, 0x66, 0x62, - 0x7c, 0x75, 0x75, 0xf8, 0x75, 0x3b, 0xd5, 0xa5, 0xb5, 0x88, 0x96, 0xcc, - 0x03, 0x1b, 0xc4, 0x3c, 0x41, 0xb2, 0x99, 0x1c, 0x37, 0x28, 0x27, 0xcb, - 0xa8, 0xb0, 0x7a, 0xd4, 0xec, 0x13, 0x21, 0xa8, 0xbf, 0x32, 0x51, 0xf5, - 0x77, 0x21, 0x6c, 0x3a, 0x06, 0x2b, 0xd0, 0x9f, 0x68, 0xfc, 0x89, 0x57, - 0x79, 0x6f, 0x2f, 0xb7, 0xd5, 0x56, 0x87, 0xce, 0xf5, 0x6c, 0xfb, 0x52, - 0xb8, 0x4e, 0x8b, 0x84, 0x2f, 0x4c, 0xfe, 0x15, 0x21, 0x0b, 0x57, 0x24, - 0x83, 0x29, 0x06, 0x9f, 0x7c, 0x88, 0x35, 0xf0, 0x75, 0x75, 0x49, 0x76, - 0xd6, 0x00, 0x81, 0xc7, 0xf0, 0xf5, 0x3b, 0x2c, 0x46, 0x56, 0x1f, 0x6a, - 0x99, 0x36, 0x4b, 0x94, 0xdc, 0x5a, 0xc1, 0x29, 0x1d, 0xb1, 0x6f, 0x25, - 0xb2, 0xaa, 0xe9, 0x26, 0xb2, 0xdc, 0xa7, 0x0f, 0xa4, 0xa0, 0xcf, 0x94, - 0x92, 0x25, 0xed, 0x6b, 0xf2, 0x65, 0x0d, 0xb1, 0x07, 0x22, 0x03, 0x1b, - 0xb0, 0xb3, 0x5b, 0x78, 0x6a, 0xaf, 0x6d, 0x70, 0x90, 0x94, 0x7b, 0xa0, - 0x26, 0x68, 0xe6, 0xe3, 0xc3, 0xef, 0x36, 0x1c, 0x62, 0x23, 0x5f, 0x6f, - 0xf9, 0x85, 0x90, 0x5e, 0x64, 0xb3, 0x79, 0x3e, 0xf7, 0x60, 0x1c, 0x0e, - 0x1f, 0x17, 0xaf, 0xcd, 0x71, 0xc7, 0x67, 0x46, 0xe9, 0x71, 0x52, 0x83, - 0xbe, 0x65, 0xd5, 0xf1, 0x67, 0x95, 0x86, 0x92, 0x4b, 0x63, 0xad, 0xdd, - 0x9d, 0xe0, 0x61, 0xe2, 0x8b, 0x5f, 0x28, 0xf6, 0xeb, 0x7b, 0x0d, 0xe5, - 0x4e, 0xf1, 0x81, 0xb6, 0xb2, 0x2d, 0x16, 0xa7, 0xb9, 0x02, 0x2b, 0x6d, - 0x69, 0x26, 0x05, 0x2d, 0x18, 0xab, 0xe5, 0x4e, 0xdb, 0x93, 0x5c, 0xbf, - 0x33, 0x56, 0x16, 0x44, 0x47, 0x7b, 0x5e, 0xe0, 0xbe, 0x33, 0xd7, 0x2c, - 0xdf, 0x59, 0x8f, 0xd1, 0xb8, 0xcd, 0xe0, 0x4c, 0xec, 0xf7, 0x7a, 0x8c, - 0xc6, 0xf6, 0xf9, 0x1b, 0x20, 0x90, 0xce, 0x06, 0xdd, 0x6c, 0x82, 0x18, - 0x20, 0xda, 0x5e, 0x35, 0x66, 0x7d, 0x43, 0x45, 0xed, 0x2c, 0xab, 0xb8, - 0x18, 0x53, 0x80, 0xf8, 0x87, 0x50, 0xac, 0x53, 0x14, 0x6f, 0xd2, 0x98, - 0x92, 0x50, 0x0f, 0x7d, 0xfc, 0xa1, 0xfd, 0x56, 0xcd, 0x05, 0xe2, 0x85, - 0x02, 0xe1, 0x01, 0x0e, 0x16, 0x27, 0x73, 0x33, 0x09, 0xac, 0xff, 0x68, - 0x2e, 0x31, 0x9e, 0xfe, 0xd8, 0x0b, 0x15, 0x90, 0x87, 0xe1, 0xa3, 0x27, - 0x71, 0x17, 0x1b, 0x6f, 0xa7, 0x21, 0xe0, 0x4f, 0x7a, 0x30, 0x16, 0x42, - 0x0a, 0xc2, 0xb2, 0x7c, 0x7d, 0x42, 0x66, 0xe6, 0xde, 0x2d, 0x13, 0xcc, - 0x2a, 0xf9, 0x9b, 0xe9, 0x25, 0x7c, 0x62, 0xf3, 0x01, 0x4b, 0x1c, 0x2d, - 0x44, 0x6f, 0x86, 0x34, 0xa1, 0xe2, 0xe1, 0xeb, 0x7e, 0x95, 0x9f, 0x0f, - 0x13, 0x64, 0xf8, 0x91, 0x6a, 0x26, 0x56, 0x5e, 0x75, 0x30, 0xbf, 0xa2, - 0xe3, 0xba, 0x71, 0xeb, 0x68, 0x86, 0x4a, 0x4a, 0xab, 0xba, 0x1a, 0xde, - 0x1a, 0x44, 0x59, 0x5d, 0x78, 0x26, 0xf1, 0x2e, 0x57, 0xaf, 0x4c, 0xcb, - 0x2e, 0xdc, 0x7b, 0xb3, 0xd9, 0x7a, 0xee, 0x86, 0x55, 0x40, 0xca, 0x0c, - 0x38, 0x3f, 0x4a, 0xeb, 0xa0, 0x47, 0x77, 0xd3, 0x4f, 0x7d, 0x75, 0x5c, - 0x9a, 0x63, 0xaa, 0xd3, 0xbd, 0x32, 0x12, 0x6e, 0x79, 0x41, 0xeb, 0x2d, - 0xff, 0xae, 0xaf, 0xe6, 0x3e, 0xdd, 0x4a, 0x4c, 0x93, 0x61, 0x7a, 0xfb, - 0x7f, 0x92, 0xd0, 0x09, 0xd0, 0x1c, 0x8d, 0x35, 0x6b, 0x61, 0x0e, 0x78, - 0x42, 0xa9, 0x11, 0xe1, 0x30, 0x36, 0x21, 0x81, 0x3a, 0xff, 0x31, 0xd6, - 0x8c, 0xff, 0xaa, 0xf5, 0xa3, 0xb6, 0xc1, 0xe4, 0x0e, 0xb1, 0x7a, 0x75, - 0xbd, 0xaa, 0x56, 0xce, 0x6f, 0xa0, 0xf7, 0xe6, 0x6d, 0xce, 0x6f, 0x39, - 0xca, 0xbd, 0x85, 0x09, 0x7a, 0xe6, 0xdf, 0x6a, 0x42, 0x23, 0xb6, 0xf9, - 0xfb, 0xb1, 0x2f, 0x55, 0xd7, 0xb5, 0xfa, 0x82, 0xf7, 0xb4, 0xa3, 0xaa, - 0x13, 0x2e, 0x47, 0x25, 0x33, 0xb7, 0x35, 0x58, 0x7c, 0xdb, 0x16, 0xa2, - 0x3e, 0xf5, 0xd1, 0x3a, 0x5f, 0x3e, 0x2f, 0x54, 0xea, 0x9a, 0x0e, 0x74, - 0xb9, 0xea, 0xd2, 0xee, 0xa2, 0x77, 0x8c, 0xe9, 0xf2, 0x9e, 0x1f, 0x0e, - 0xb1, 0x66, 0xe0, 0x89, 0x84, 0x31, 0x45, 0xc9, 0xc4, 0xcf, 0x7c, 0xea, - 0x7a, 0xc3, 0xb3, 0x7a, 0xdd, 0x64, 0x0e, 0xad, 0xe8, 0x38, 0xba, 0x58, - 0x1f, 0x09, 0x5e, 0x1c, 0xae, 0xaf, 0x5c, 0x54, 0x7b, 0xa9, 0xfb, 0xfb, - 0x45, 0x19, 0x6f, 0xd2, 0xc3, 0xe7, 0x1d, 0x1e, 0x9d, 0x67, 0xbb, 0xaf, - 0x97, 0xfa, 0x04, 0xd3, 0x9d, 0x44, 0x6e, 0x71, 0x6e, 0x75, 0x9f, 0xdc, - 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, 0x3d, 0x77, 0xce, 0x8b, - 0x1c, 0x0a, 0xab, 0x17, 0xf8, 0x22, 0x75, 0x0b, 0xfe, 0x54, 0xd1, 0x7c, - 0x88, 0x69, 0x77, 0x8e, 0x48, 0xb1, 0x5c, 0x98, 0x6c, 0x2a, 0x58, 0x63, - 0x8a, 0x6e, 0x99, 0x8c, 0x87, 0x81, 0xdc, 0x4b, 0xef, 0xc1, 0x16, 0xd0, - 0xf6, 0xc8, 0xee, 0x04, 0x92, 0x97, 0xc4, 0xa1, 0x41, 0x76, 0x22, 0x61, - 0x84, 0x9e, 0x61, 0xc3, 0xa6, 0x12, 0x97, 0x1d, 0x69, 0x00, 0x57, 0x7a, - 0xe7, 0xa6, 0x2e, 0x0c, 0x90, 0xcf, 0x39, 0x26, 0xf8, 0x92, 0x8a, 0x61, - 0x2d, 0x25, 0x48, 0xc4, 0x63, 0x6e, 0xa5, 0xcf, 0x59, 0x73, 0x09, 0xb4, - 0x7f, 0x4f, 0x82, 0xf7, 0x65, 0x47, 0xe4, 0xac, 0x21, 0x9e, 0xec, 0x0d, - 0xab, 0x16, 0x00, 0x11, 0xeb, 0x5c, 0x84, 0xf0, 0xb1, 0x11, 0xb1, 0xd3, - 0x68, 0xa8, 0x06, 0x8c, 0xe8, 0x76, 0x2c, 0x15, 0x6c, 0x7a, 0xd3, 0x31, - 0x81, 0x87, 0x71, 0x18, 0xe9, 0x42, 0xe2, 0x24, 0x8e, 0x9e, 0x48, 0xe2, - 0x59, 0x64, 0xc7, 0x8e, 0x36, 0x1d, 0x09, 0x21, 0x15, 0x70, 0x81, 0x01, - 0xb3, 0x59, 0xcf, 0x2f, 0x11, 0x9e, 0x19, 0x91, 0xe4, 0x3d, 0xa9, 0x37, - 0xd8, 0x64, 0xc8, 0x81, 0x96, 0x39, 0xcc, 0xc1, 0x06, 0xf4, 0x1a, 0x10, - 0x3f, 0xe0, 0x1f, 0x65, 0x6b, 0x2d, 0x42, 0x33, 0xe5, 0x19, 0x88, 0x8e, - 0x87, 0x9c, 0x41, 0x0b, 0x61, 0xc7, 0xcc, 0xc8, 0x10, 0x0c, 0xc2, 0xf7, - 0x0b, 0xc1, 0x22, 0x20, 0xe4, 0x0f, 0x9b, 0x50, 0x28, 0x4d, 0xb8, 0x70, - 0xce, 0xde, 0xd9, 0x0e, 0x91, 0x1e, 0x5e, 0xd6, 0x1f, 0x5f, 0xda, 0x44, - 0x8d, 0x6a, 0xd6, 0x9e, 0x26, 0x7b, 0x01, 0x5c, 0x53, 0xad, 0xc1, 0xc9, - 0xba, 0xb0, 0xbd, 0xd8, 0xeb, 0xac, 0x5e, 0xc2, 0x34, 0xb3, 0x93, 0x33, - 0xdb, 0xa3, 0xb8, 0x09, 0x12, 0x78, 0x11, 0xba, 0xa1, 0x03, 0x76, 0xaa, - 0x11, 0x75, 0x57, 0x17, 0xa1, 0x89, 0xe4, 0x1f, 0xdd, 0x6c, 0x8b, 0x62, - 0x00, 0x54, 0x92, 0x29, 0x3b, 0x78, 0x18, 0x53, 0x1b, 0xc0, 0x70, 0x8c, - 0x72, 0xfc, 0x07, 0x8d, 0x3a, 0x70, 0x9b, 0x3f, 0x1f, 0x35, 0x48, 0xb4, - 0x36, 0x1a, 0x63, 0x51, 0xba, 0x37, 0x8c, 0xdf, 0xfb, 0xf7, 0x57, 0xb3, - 0x87, 0x06, 0x50, 0x16, 0x1e, 0x43, 0x2c, 0xd1, 0xcd, 0xdd, 0xe6, 0x70, - 0x8e, 0xed, 0x46, 0x91, 0x13, 0x1e, 0x43, 0xba, 0xe7, 0x71, 0x90, 0x3d, - 0xfd, 0x2d, 0x95, 0x1f, 0xdd, 0x0d, 0x2e, 0x5b, 0x5e, 0xa2, 0x23, 0xcb, - 0x40, 0x72, 0x5a, 0x81, 0x7d, 0x5a, 0x15, 0xc4, 0x3d, 0x0a, 0xde, 0xcc, - 0xdc, 0x54, 0x5b, 0xe6, 0x5d, 0x41, 0x85, 0x9f, 0x76, 0x1f, 0x51, 0x78, - 0x77, 0x85, 0xaf, 0xe2, 0xc7, 0x0d, 0x9f, 0xaf, 0xc0, 0xa6, 0xc8, 0xa8, - 0xf8, 0x5f, 0xbe, 0x8d, 0xbb, 0xa9, 0xff, 0x8f, 0xd6, 0xe1, 0xb4, 0x8c, - 0x1f, 0x29, 0x74, 0xb0, 0x51, 0x32, 0x06, 0x79, 0xf3, 0x8a, 0x5f, 0x84, - 0xaf, 0xd8, 0x0d, 0xaf, 0x08, 0x14, 0x85, 0x20, 0x21, 0xd8, 0x4a, 0x15, - 0x8a, 0x53, 0x87, 0x6d, 0x14, 0xd6, 0x2e, 0xf3, 0x58, 0x8a, 0x92, 0xc1, - 0x58, 0x32, 0x71, 0x28, 0x85, 0x2d, 0x7b, 0x7d, 0x55, 0x00, 0x81, 0x50, - 0xd4, 0x26, 0x98, 0x83, 0xf8, 0x3b, 0x81, 0x41, 0xbe, 0x56, 0x92, 0xb0, - 0xd2, 0xba, 0x40, 0x95, 0x4b, 0x40, 0xce, 0x28, 0xa7, 0xfb, 0x82, 0xd3, - 0xfa, 0x48, 0x5d, 0x3b, 0xe3, 0xc5, 0xc0, 0x96, 0x8b, 0x1f, 0xdf, 0xd8, - 0xd5, 0x00, 0x45, 0x28, 0xe0, 0xa6, 0x3a, 0xaa, 0x09, 0xce, 0xe2, 0x12, - 0xcd, 0x5a, 0xa2, 0xb3, 0xdf, 0xe4, 0xd4, 0xe7, 0x1b, 0xff, 0xc3, 0xea, - 0x0c, 0x0c, 0x46, 0x63, 0x4d, 0xf5, 0x81, 0x47, 0x5c, 0xc5, 0x73, 0x33, - 0xb8, 0xe8, 0x3a, 0x67, 0xdf, 0x8d, 0xd1, 0x1e, 0x67, 0x6e, 0x85, 0x98, - 0x9a, 0x3f, 0x2d, 0xc3, 0xf2, 0xa3, 0x7a, 0xea, 0x06, 0x9c, 0x77, 0x0f, - 0x94, 0xf1, 0x2c, 0x13, 0x71, 0xdc, 0x07, 0xda, 0xd4, 0xe5, 0x53, 0x9b, - 0xb2, 0x5b, 0x2e, 0x41, 0xaf, 0x3d, 0x07, 0x49, 0x55, 0xc3, 0xc1, 0xb4, - 0x83, 0xe6, 0xd4, 0xe9, 0x9d, 0xc3, 0x18, 0x02, 0x56, 0x22, 0x09, 0x69, - 0x61, 0x1b, 0x57, 0x93, 0x46, 0x31, 0x9d, 0x4c, 0x35, 0x47, 0xe2, 0x10, - 0xbc, 0xf0, 0xb5, 0xdf, 0xa0, 0x49, 0x6e, 0xe8, 0xe6, 0xa3, 0xcc, 0xd4, - 0xeb, 0xf3, 0x53, 0x2c, 0x53, 0xbe, 0xbb, 0x0a, 0xc9, 0x4d, 0x40, 0xfc, - 0x9a, 0xe6, 0x46, 0x2c, 0x14, 0xcf, 0x5b, 0xdc, 0x56, 0x1e, 0x93, 0xe6, - 0xee, 0x92, 0x2a, 0x72, 0xf6, 0x07, 0x0a, 0x77, 0x5d, 0xde, 0xff, 0x0c, - 0x9c, 0xf3, 0x5f, 0xd1, 0x5b, 0x1f, 0x77, 0x61, 0xa7, 0x44, 0x0d, 0xb2, - 0x79, 0x4a, 0xbf, 0x01, 0x97, 0xa7, 0x42, 0xb3, 0xdc, 0xd1, 0xb3, 0xf8, - 0xd7, 0x4d, 0x90, 0x8c, 0x13, 0x45, 0x1c, 0xed, 0x53, 0xa8, 0xd8, 0xe2, - 0x44, 0x83, 0x25, 0x00, 0x58, 0xa7, 0x39, 0x0a, 0xf4, 0xb4, 0xfc, 0x60, - 0xf5, 0x7b, 0xfb, 0x77, 0xbf, 0xf8, 0x9b, 0x31, 0xb1, 0xc3, 0xb9, 0x27, - 0xa0, 0xc5, 0x36, 0x64, 0xf0, 0x63, 0x8d, 0x63, 0xa7, 0xcd, 0x6c, 0x0d, - 0xc1, 0x7e, 0xfe, 0xf1, 0x66, 0x5e, 0x44, 0x26, 0xa6, 0xf5, 0xa4, 0x2c, - 0x5e, 0xb9, 0x5e, 0x4f, 0xdb, 0x49, 0x16, 0x7a, 0xf9, 0xe5, 0x60, 0x9c, - 0x2d, 0xba, 0x9d, 0x1e, 0x18, 0xad, 0xdf, 0xda, 0x95, 0x48, 0x54, 0xfe, - 0xca, 0x73, 0xe0, 0xec, 0x76, 0xa4, 0x6e, 0x34, 0xba, 0x11, 0xbc, 0xd1, - 0x48, 0xa6, 0x30, 0xff, 0xea, 0xa5, 0x46, 0xa7, 0xc5, 0x00, 0xcd, 0x90, - 0x91, 0x90, 0xad, 0x1c, 0x94, 0x17, 0x18, 0x41, 0xc1, 0xb5, 0xfa, 0x20, - 0x47, 0xb5, 0xfa, 0xae, 0x39, 0x1d, 0x23, 0x0b, 0x1c, 0x74, 0x3f, 0xb2, - 0x70, 0xb9, 0xb6, 0xb5, 0xda, 0xa8, 0x1e, 0x9a, 0xb3, 0x57, 0x7c, 0xc7, - 0x15, 0x6f, 0x4c, 0x63, 0x2d, 0x0c, 0x4e, 0xd4, 0x6e, 0x4f, 0x10, 0x2b, - 0xfd, 0xe1, 0x0f, 0x31, 0x41, 0x3f, 0x09, 0xae, 0x14, 0xd9, 0x66, 0x9c, - 0x09, 0xa6, 0xeb, 0xca, 0x67, 0xd2, 0x80, 0xa3, 0x65, 0x44, 0xb6, 0x22, - 0x18, 0x04, 0x80, 0x98, 0xe2, 0xa6, 0xba, 0x1a, 0x9b, 0x35, 0xab, 0x8c, - 0x92, 0x6b, 0x37, 0x7b, 0x1f, 0x6b, 0x2c, 0x9e, 0x15, 0xe2, 0x1c, 0xc8, - 0x92, 0x07, 0xa8, 0x25, 0xad, 0x56, 0x6c, 0x93, 0xfd, 0x62, 0xde, 0x9a, - 0xfd, 0xab, 0xe5, 0xa9, 0x9e, 0xc2, 0x24, 0x0d, 0xf9, 0xff, 0x8d, 0xfe, - 0x32, 0x11, 0x9a, 0x0d, 0x77, 0xcf, 0x2e, 0xd9, 0xae, 0xb2, 0xa9, 0xc2, - 0xad, 0x49, 0xfe, 0x07, 0x64, 0x8b, 0x21, 0xd3, 0x9a, 0x6c, 0xb4, 0x67, - 0xa4, 0xcf, 0x89, 0x73, 0x80, 0x3a, 0xab, 0x10, 0x67, 0x64, 0x42, 0xc0, - 0x2d, 0x5e, 0x0c, 0x9a, 0xf1, 0x96, 0x19, 0xdc, 0x10, 0x9d, 0x4c, 0x3c, - 0xf0, 0x33, 0x7f, 0x05, 0x95, 0xe6, 0xab, 0xd1, 0x56, 0x9b, 0x94, 0x0c, - 0x04, 0x9a, 0xb7, 0x86, 0x62, 0x1d, 0x42, 0x77, 0x8a, 0x19, 0xb9, 0x27, - 0x61, 0x7c, 0x01, 0x7e, 0x16, 0x1e, 0xe4, 0xf7, 0x7c, 0x21, 0x59, 0x51, - 0x73, 0xb1, 0x6f, 0x2f, 0xdd, 0x22, 0xd2, 0xf2, 0xf4, 0xc6, 0xc6, 0x20, - 0x4a, 0x28, 0x2d, 0x44, 0xec, 0x4f, 0x5f, 0xe3, 0xfa, 0x4e, 0x0a, 0x7b, - 0x3d, 0x29, 0x5d, 0xa7, 0xa5, 0xa9, 0x18, 0xcc, 0xb7, 0x2a, 0x45, 0xa7, - 0xd8, 0xed, 0xbc, 0xc0, 0x2f, 0xaf, 0xef, 0x5c, 0x4c, 0x37, 0xe5, 0xec, - 0x9d, 0x20, 0xa1, 0xfb, 0xdf, 0xcf, 0xaf, 0xf2, 0x27, 0x38, 0x30, 0x77, - 0x67, 0x3d, 0xe4, 0x3d, 0xfe, 0x6b, 0x82, 0x74, 0x95, 0xa8, 0xbc, 0x83, - 0x38, 0x6d, 0xc8, 0x07, 0x1f, 0x98, 0x56, 0x80, 0x6a, 0x40, 0x1c, 0x7c, - 0x45, 0x1e, 0xeb, 0x94, 0xef, 0xd5, 0xa1, 0x0b, 0x86, 0x1c, 0x5f, 0xca, - 0x39, 0xa6, 0x83, 0x71, 0xdf, 0x49, 0xb3, 0x7b, 0x2f, 0x12, 0xe9, 0x89, - 0x8f, 0x5c, 0x59, 0x87, 0x03, 0x30, 0xcc, 0xd5, 0x75, 0xca, 0xe0, 0x71, - 0xc5, 0x66, 0x1e, 0x66, 0x80, 0xc6, 0x3d, 0x00, 0x79, 0x6b, 0xf6, 0x1a, - 0xe1, 0x93, 0x5d, 0xc1, 0x25, 0x44, 0xe5, 0x9f, 0x23, 0x1e, 0x10, 0x01, - 0x5f, 0x19, 0xc2, 0xdd, 0xa2, 0xcc, 0x3f, 0x67, 0x9f, 0x66, 0xcc, 0xf7, - 0xeb, 0x01, 0x9d, 0xa5, 0x28, 0xd6, 0x9c, 0x1d, 0x36, 0x51, 0x47, 0x78, - 0xe8, 0xb1, 0x30, 0xfb, 0xf8, 0x4e, 0x30, 0xc0, 0xaa, 0x4e, 0xbd, 0x2b, - 0x73, 0x75, 0x67, 0xa7, 0x75, 0x78, 0x47, 0x71, 0x24, 0x98, 0x4b, 0xc3, - 0x69, 0x4d, 0xc3, 0x6a, 0x42, 0x1f, 0xe6, 0xcc, 0xbd, 0x36, 0x51, 0xf2, - 0x79, 0x54, 0x19, 0x3c, 0x5f, 0x63, 0x91, 0xed, 0xf7, 0x25, 0xa7, 0xe2, - 0x9a, 0xe5, 0x2b, 0x4c, 0x19, 0xa0, 0xb4, 0x17, 0x21, 0x7b, 0xbb, 0x8f, - 0xc8, 0xb2, 0x8f, 0xe0, 0xa8, 0x4a, 0x4e, 0x0f, 0x76, 0xb3, 0xf3, 0xbc, - 0x63, 0x4e, 0x1d, 0xc3, 0xd7, 0x62, 0x17, 0x20, 0x48, 0x5f, 0xa8, 0xec, - 0x18, 0x8d, 0x53, 0xd7, 0xd5, 0x0a, 0x8d, 0x29, 0x7b, 0x3f, 0x74, 0x3b, - 0x60, 0x0a, 0x3d, 0xa6, 0x74, 0xa6, 0xaf, 0x49, 0xe6, 0x2c, 0x8c, 0xe1, - 0xfc, 0x4d, 0x84, 0x97, 0x1d, 0x0f, 0xdc, 0x22, 0x50, 0xc6, 0x64, 0x6c, - 0xa8, 0x42, 0x8d, 0xca, 0x9d, 0x59, 0x46, 0xf8, 0xe3, 0x23, 0x0d, 0x7d, - 0xe7, 0x76, 0x59, 0xdd, 0xb1, 0xe1, 0x9b, 0x8a, 0x41, 0xb4, 0x67, 0x5e, - 0x35, 0xfb, 0x24, 0x15, 0xb6, 0xff, 0xac, 0x90, 0x7b, 0x64, 0x63, 0x07, - 0x74, 0x8f, 0xd3, 0xf5, 0xf6, 0xb8, 0x1f, 0x9e, 0x10, 0x56, 0xc0, 0x76, - 0xa7, 0xb4, 0xc8, 0x0f, 0xc2, 0x56, 0xa4, 0x6f, 0xae, 0x5f, 0x54, 0x2b, - 0x39, 0x49, 0x3b, 0xf5, 0x86, 0x58, 0xc2, 0x5e, 0xcc, 0x81, 0x27, 0x21, - 0x7c, 0xa3, 0xc8, 0x32, 0x3c, 0x45, 0xe4, 0x2d, 0x5e, 0xb1, 0xfa, 0x33, - 0xbe, 0x47, 0xe9, 0x6a, 0xb4, 0x79, 0x49, 0x41, 0x1a, 0xd5, 0x0f, 0x7c, - 0x96, 0x78, 0x2e, 0xa0, 0x2b, 0x66, 0xba, 0xd3, 0x3a, 0x66, 0xc9, 0x60, - 0xfa, 0xd4, 0xec, 0x67, 0x6c, 0xf3, 0x72, 0x1a, 0xd2, 0x5b, 0x34, 0x33, - 0x41, 0x67, 0x60, 0x1a, 0x60, 0x08, 0x01, 0x17, 0xf2, 0x60, 0x4f, 0x26, - 0x62, 0xd8, 0xd6, 0xfb, 0x2f, 0x47, 0x89, 0xe3, 0x19, 0x00, 0x55, 0xdc, - 0x99, 0xf4, 0x65, 0xb1, 0xe1, 0xa7, 0x0d, 0x58, 0xb7, 0xaf, 0xbb, 0xcd, - 0x10, 0x7b, 0xd3, 0xcd, 0x3c, 0xc4, 0x5c, 0x34, 0x3d, 0x21, 0xdc, 0x1c, - 0x5f, 0xf1, 0x18, 0x7c, 0x85, 0x5b, 0xae, 0x8c, 0x95, 0xae, 0x60, 0x9f, - 0xe3, 0x9b, 0x8c, 0x5b, 0x25, 0x78, 0xce, 0x68, 0x3b, 0x42, 0xff, 0x96, - 0x54, 0x90, 0x04, 0x7f, 0x2e, 0x62, 0xa8, 0x64, 0xd3, 0xb4, 0x25, 0xe1, - 0xda, 0x3d, 0xb7, 0xc6, 0x1b, 0x40, 0x21, 0x2c, 0x59, 0x09, 0x43, 0xbf, - 0x60, 0xb3, 0x16, 0x02, 0x62, 0xa9, 0x05, 0xac, 0x98, 0x47, 0x0c, 0xbe, - 0x0c, 0x53, 0xbf, 0xae, 0x97, 0xf6, 0xd2, 0x50, 0xef, 0x1c, 0x2e, 0x86, - 0x63, 0xa4, 0x68, 0x01, 0x70, 0x25, 0x04, 0xaa, 0xab, 0xd8, 0x42, 0x57, - 0xa7, 0xe4, 0xbb, 0x7d, 0x32, 0xe4, 0x1f, 0x62, 0xa2, 0x68, 0xab, 0xa7, - 0x49, 0xc3, 0xd0, 0xd6, 0x84, 0x52, 0x14, 0x72, 0x87, 0x57, 0x18, 0x3f, - 0xaa, 0x66, 0xfd, 0xc2, 0x7f, 0x66, 0x46, 0x15, 0x0a, 0x2b, 0x7e, 0xee, - 0x44, 0x14, 0x87, 0x11, 0x06, 0x05, 0x54, 0x1c, 0x76, 0xcb, 0x36, 0xa5, - 0x81, 0xda, 0x0b, 0x58, 0x3b, 0x03, 0xc8, 0xfc, 0xec, 0x81, 0x90, 0xc4, - 0xe7, 0x8d, 0x2c, 0x9a, 0x35, 0x0c, 0xa7, 0x60, 0x8a, 0xea, 0x5f, 0x9a, - 0xb5, 0x18, 0xa5, 0x63, 0x68, 0x6e, 0xd4, 0x87, 0xd4, 0xf7, 0x5e, 0xf2, - 0x9a, 0x85, 0x03, 0x0f, 0x86, 0x2e, 0xdc, 0xf5, 0x6c, 0x75, 0xd9, 0x4b, - 0x88, 0x6c, 0x3f, 0x24, 0xd0, 0x41, 0x2f, 0x29, 0xfb, 0x4b, 0x77, 0xac, - 0xaf, 0xc3, 0xe3, 0x2d, 0xff, 0x1d, 0x4d, 0x65, 0xaa, 0x6a, 0x74, 0xe3, - 0xaf, 0x11, 0x4a, 0x4f, 0xe0, 0x0f, 0xe5, 0x55, 0xe5, 0xd4, 0x43, 0x5c, - 0x51, 0x8a, 0xd8, 0xc7, 0xf0, 0xac, 0xb3, 0x73, 0x22, 0x63, 0x71, 0x2a, - 0xf2, 0xc0, 0xa5, 0x58, 0xd7, 0x01, 0x61, 0x61, 0xce, 0x0f, 0xe8, 0xbf, - 0xd6, 0x44, 0x7d, 0xa8, 0xf9, 0xf3, 0x60, 0x7c, 0xb0, 0x35, 0x99, 0x0c, - 0xe4, 0x79, 0x48, 0xc5, 0x4a, 0xa7, 0x3a, 0xd5, 0xa8, 0xe7, 0x8f, 0xf3, - 0xe2, 0x03, 0x07, 0xdc, 0xeb, 0x29, 0x0a, 0x4d, 0xd3, 0x65, 0x7a, 0x87, - 0x7c, 0x2a, 0x75, 0x5c, 0x99, 0x3e, 0x5e, 0x0f, 0xee, 0xd9, 0xf4, 0xf5, - 0xfe, 0x61, 0xee, 0x76, 0x3b, 0x20, 0x8b, 0xfb, 0x2a, 0x05, 0x31, 0x9b, - 0xd4, 0x06, 0xac, 0x8a, 0x88, 0x10, 0x45, 0xc8, 0x16, 0x28, 0x44, 0xd6, - 0x5b, 0x3f, 0xc9, 0x27, 0x54, 0xa6, 0x7c, 0x39, 0x63, 0xe2, 0x0d, 0x11, - 0x73, 0x46, 0x09, 0x60, 0x83, 0x9e, 0x2d, 0x40, 0x79, 0x09, 0xb3, 0xd4, - 0x25, 0x3b, 0xc5, 0x97, 0xfb, 0xaa, 0x1d, 0x28, 0xd0, 0xb5, 0xd8, 0x32, - 0x97, 0x40, 0x14, 0x58, 0xe4, 0x58, 0xc2, 0x51, 0x07, 0xa3, 0x20, 0xbb, - 0xd3, 0x04, 0x13, 0xca, 0xe7, 0x0d, 0x19, 0xdb, 0xe9, 0xb4, 0x5f, 0x74, - 0xf9, 0x75, 0x1b, 0x5d, 0xbc, 0x36, 0xca, 0x60, 0x09, 0x9a, 0x1c, 0x2e, - 0xed, 0xfb, 0xe6, 0xa9, 0xdb, 0x41, 0x33, 0x4c, 0x76, 0x0c, 0x43, 0xad, - 0x9c, 0xce, 0xc1, 0xff, 0x88, 0xc9, 0xfa, 0x09, 0xee, 0x01, 0xa8, 0xbe, - 0xd6, 0xf9, 0x38, 0xe0, 0x77, 0x7c, 0xba, 0x41, 0xf7, 0x84, 0x74, 0xc4, - 0xad, 0xe5, 0xab, 0x62, 0x94, 0xb7, 0x5d, 0x30, 0x7b, 0x7e, 0x2c, 0x3d, - 0x80, 0xd6, 0x20, 0xbc, 0x44, 0x3f, 0xd0, 0x54, 0xba, 0x7e, 0x3e, 0x7b, - 0xb1, 0xa8, 0x01, 0x8b, 0xb5, 0x8a, 0x4b, 0xb8, 0x49, 0x29, 0x94, 0x5a, - 0x95, 0x2c, 0x79, 0xe3, 0xc6, 0xd8, 0x7d, 0xc1, 0xce, 0x0a, 0xe9, 0x9c, - 0xcc, 0x1c, 0x1f, 0x53, 0x93, 0xf7, 0xd4, 0x82, 0x7e, 0x7b, 0x0f, 0x9b, - 0x89, 0x28, 0x2d, 0x66, 0xfb, 0xda, 0x86, 0x1a, 0xbc, 0x47, 0x34, 0x9f, - 0x82, 0xe4, 0xee, 0x30, 0x94, 0x9d, 0xcc, 0x48, 0x69, 0x20, 0x4a, 0xbc, - 0x7c, 0x79, 0x32, 0xd5, 0x0f, 0x76, 0xaa, 0x4e, 0x65, 0x25, 0x8f, 0x8e, - 0x59, 0x32, 0xe5, 0x0a, 0xf2, 0x2f, 0x31, 0x02, 0x70, 0x90, 0x53, 0x75, - 0x31, 0x2a, 0x14, 0x8f, 0xe1, 0xfd, 0xff, 0x6f, 0xe4, 0xa3, 0x23, 0xef, - 0xa0, 0x7e, 0x59, 0x7f, 0xb9, 0x26, 0xd5, 0xa8, 0x4e, 0xa5, 0x25, 0xbf, - 0x9a, 0xa8, 0xe1, 0x60, 0xb6, 0xbb, 0xf7, 0x6c, 0x84, 0xac, 0x17, 0x7a, - 0x80, 0xd6, 0xd8, 0x8e, 0x94, 0x22, 0xa2, 0x76, 0x42, 0xf4, 0x92, 0x9f, - 0x66, 0x66, 0x44, 0xb1, 0x58, 0xb2, 0x18, 0x90, 0x48, 0x15, 0xce, 0xd1, - 0x9b, 0xfd, 0xfa, 0x87, 0xaf, 0xc1, 0xf7, 0x3b, 0xdd, 0xfe, 0xb8, 0xae, - 0x78, 0xc6, 0xf5, 0xa0, 0x19, 0xf0, 0x30, 0x7a, 0x2f, 0x88, 0xbc, 0x6a, - 0x59, 0xd5, 0x4e, 0x92, 0xdf, 0xcd, 0x25, 0xee, 0x36, 0xdf, 0x67, 0x11, - 0xde, 0x06, 0xac, 0x05, 0xa1, 0x79, 0x63, 0x92, 0x0d, 0xa5, 0x31, 0x07, - 0xc6, 0x9b, 0xec, 0x84, 0x39, 0x91, 0x73, 0xb4, 0xa5, 0xcf, 0x3a, 0x01, - 0xcc, 0x45, 0xc5, 0x5b, 0x33, 0x94, 0x80, 0x52, 0x28, 0xe4, 0x53, 0x66, - 0x40, 0xb5, 0x51, 0x04, 0xdd, 0xea, 0xf1, 0x08, 0xd6, 0x71, 0x07, 0xa2, - 0x71, 0x19, 0xdf, 0x0c, 0xb8, 0xc1, 0x99, 0x9f, 0x1f, 0xf5, 0xad, 0x61, - 0xb7, 0x96, 0x2b, 0x8c, 0xf7, 0xf2, 0xd0, 0xd9, 0x63, 0x2b, 0x05, 0x58, - 0xea, 0x80, 0x9c, 0x0a, 0xb7, 0x16, 0xd3, 0xa9, 0x9e, 0x93, 0x8b, 0x4c, - 0xa5, 0x7b, 0xe8, 0x36, 0x47, 0x27, 0xbb, 0x04, 0x9b, 0x2d, 0xcb, 0x8b, - 0xac, 0xa9, 0x45, 0x4d, 0xf8, 0x55, 0xea, 0x0b, 0xc6, 0x59, 0xff, 0x04, - 0x14, 0x3f, 0x2c, 0xc6, 0xe0, 0x59, 0xba, 0x13, 0x2f, 0x68, 0xf6, 0x03, - 0xfa, 0xf9, 0xb0, 0x4f, 0x4e, 0xbf, 0xb9, 0x4e, 0xaf, 0xd6, 0x98, 0x87, - 0xe5, 0xe3, 0x5d, 0x79, 0xb0, 0xb6, 0xcb, 0x91, 0x7a, 0x38, 0x84, 0x26, - 0xca, 0xef, 0x1d, 0xec, 0x25, 0xea, 0x95, 0x9b, 0x7c, 0x73, 0x87, 0x79, - 0x95, 0x34, 0x58, 0x10, 0xbb, 0xe3, 0x14, 0xa9, 0x6b, 0x63, 0x7c, 0x3d, - 0x53, 0x80, 0xbb, 0xf5, 0x4f, 0x96, 0x57, 0x20, 0xdc, 0xb1, 0x6f, 0xad, - 0x73, 0xda, 0x95, 0x95, 0x27, 0x55, 0xb5, 0x7e, 0xed, 0xb3, 0xbf, 0x87, - 0xd4, 0x36, 0x97, 0x28, 0x11, 0xd0, 0xe2, 0x3d, 0x60, 0x05, 0xaa, 0x56, - 0xad, 0xf8, 0xe4, 0x15, 0x38, 0xec, 0x8b, 0xd7, 0x79, 0xdf, 0x03, 0x7d, - 0x4b, 0x68, 0xeb, 0xeb, 0x49, 0x5b, 0x90, 0x1e, 0x85, 0x52, 0xd2, 0x2f, - 0xac, 0x93, 0xa4, 0x91, 0x2f, 0x10, 0xd8, 0xce, 0xe2, 0x6d, 0x1e, 0x8d, - 0x9b, 0x39, 0x2f, 0xfe, 0xff, 0x18, 0xa6, 0x8b, 0x70, 0xae, 0xb1, 0x50, - 0x50, 0xcc, 0xbd, 0x3e, 0xca, 0x09, 0xce, 0x03, 0xca, 0x57, 0x7e, 0x01, - 0x02, 0xbd, 0xce, 0x20, 0x08, 0xa8, 0x93, 0xb5, 0x56, 0x1e, 0x2c, 0xf0, - 0xa8, 0x8e, 0x3f, 0xf5, 0x2c, 0x2c, 0x73, 0x4d, 0x20, 0xb5, 0xfa, 0xfd, - 0x92, 0xa4, 0x28, 0xae, 0x9d, 0xeb, 0x6a, 0x8b, 0xc2, 0xaa, 0xbb, 0x7d, - 0xaa, 0xb4, 0xd0, 0xbf, 0x81, 0x0c, 0x53, 0x35, 0xc9, 0xf8, 0xf4, 0x8f, - 0x2e, 0x49, 0x9a, 0x7b, 0x47, 0xcc, 0x82, 0x1b, 0x9c, 0x1b, 0xfc, 0x74, - 0xb1, 0x2a, 0xc9, 0x41, 0xa2, 0xe2, 0x27, 0xd2, 0x3f, 0x8f, 0x95, 0x86, - 0x8c, 0x68, 0xe8, 0x99, 0x43, 0xe2, 0x12, 0xa9, 0xb2, 0x7a, 0xd2, 0x66, - 0xc2, 0x4f, 0x66, 0xb8, 0x10, 0x6a, 0x00, 0xc8, 0xa1, 0xba, 0xf6, 0xb4, - 0xfc, 0x07, 0x4d, 0x3a, 0x50, 0x2d, 0xed, 0x69, 0xf8, 0x1f, 0xfa, 0x1f, - 0xea, 0xd1, 0x9f, 0x69, 0xcb, 0x9a, 0xff, 0x93, 0xba, 0x24, 0x31, 0x97, - 0x0b, 0x8b, 0xfe, 0xfb, 0x75, 0x35, 0x2b, 0x44, 0xa8, 0xfc, 0x03, 0x89, - 0x60, 0x21, 0xb5, 0x45, 0x95, 0xa6, 0x61, 0x5e, 0xcd, 0x68, 0xf6, 0xdb, - 0xc4, 0x66, 0x8d, 0x8e, 0x27, 0xe6, 0x04, 0x99, 0x28, 0x90, 0xd1, 0x30, - 0x0a, 0xb4, 0x72, 0x6e, 0xc8, 0xd8, 0xf1, 0x70, 0xf0, 0x72, 0x87, 0xb6, - 0x8f, 0x5e, 0x02, 0xdc, 0xd3, 0x1a, 0xb9, 0x98, 0x09, 0xfe, 0x1c, 0x8a, - 0xc8, 0xfe, 0xe9, 0xa7, 0x0d, 0x73, 0x74, 0xd7, 0xc4, 0x81, 0xd8, 0x42, - 0x5a, 0xb4, 0x48, 0xdf, 0x0c, 0x9b, 0x1b, 0x88, 0x94, 0x05, 0x6c, 0x6a, - 0x66, 0x90, 0xfa, 0x40, 0xe5, 0xc7, 0xa2, 0xcb, 0x12, 0x54, 0x00, 0x24, - 0xcf, 0xca, 0xb8, 0x8c, 0x6c, 0x19, 0x13, 0x90, 0xcd, 0x0c, 0x9e, 0xf0, - 0x53, 0x2b, 0x0b, 0x69, 0x43, 0xdc, 0x77, 0xc2, 0x5f, 0x16, 0xd3, 0x74, - 0x96, 0x90, 0xd9, 0x61, 0xaa, 0xe5, 0xe9, 0x98, 0x53, 0x9d, 0xc5, 0xdb, - 0x8c, 0x53, 0xd2, 0xa2, 0x7b, 0x59, 0x94, 0x01, 0xbb, 0x3a, 0xb6, 0x74, - 0x7c, 0xb8, 0xf1, 0xa6, 0xc6, 0x25, 0xd6, 0xaa, 0x52, 0x72, 0xfc, 0xb5, - 0xca, 0x18, 0x34, 0x7a, 0xb5, 0x17, 0xd8, 0xc2, 0x5f, 0xd6, 0x35, 0xff, - 0xc5, 0x14, 0xba, 0xd7, 0x46, 0x17, 0xdc, 0x43, 0x9d, 0xb1, 0x5a, 0x7f, - 0x77, 0xb2, 0xa7, 0x58, 0x42, 0x65, 0x9e, 0xe9, 0x9f, 0x36, 0x92, 0xb4, - 0x55, 0x36, 0x48, 0xe0, 0x61, 0x7d, 0x9a, 0xa9, 0x30, 0xfd, 0x3a, 0xad, - 0x06, 0x3e, 0x85, 0x3e, 0x8c, 0xd6, 0x7a, 0x57, 0x72, 0xf5, 0xb3, 0xcc, - 0x94, 0x39, 0x0c, 0xfe, 0x0e, 0x6a, 0x55, 0xfc, 0x75, 0x8f, 0x4b, 0x10, - 0xed, 0x84, 0x6d, 0xf8, 0x1f, 0xd6, 0xb8, 0x40, 0x94, 0xb7, 0xa4, 0x58, - 0xf3, 0x7f, 0x1d, 0x96, 0x90, 0x32, 0xbd, 0x8e, 0x79, 0xc2, 0x88, 0x51, - 0x81, 0x5b, 0x5a, 0xf6, 0x14, 0xa0, 0x2f, 0x0b, 0x61, 0x91, 0x72, 0x5e, - 0xf3, 0x9c, 0xc9, 0x4e, 0x41, 0x55, 0xed, 0xa6, 0x72, 0x0a, 0x03, 0x31, - 0x28, 0x6e, 0x66, 0x2b, 0x48, 0xb8, 0x21, 0x14, 0x98, 0x90, 0x7d, 0x39, - 0xbb, 0xa9, 0x6b, 0x28, 0x0d, 0xc7, 0x04, 0x1b, 0x47, 0x2b, 0xbb, 0xdb, - 0xd0, 0xe0, 0x12, 0x73, 0xd0, 0xea, 0x82, 0xff, 0x58, 0x1a, 0xde, 0x8b, - 0x4c, 0xf4, 0xd7, 0xf6, 0xff, 0x48, 0xca, 0xd1, 0xbb, 0x93, 0x3f, 0x9f, - 0x5d, 0x97, 0xfa, 0x0d, 0x71, 0xbe, 0xe2, 0x50, 0x74, 0x01, 0x5f, 0xfd, - 0x29, 0x3f, 0x8a, 0x1d, 0xd1, 0xf8, 0x6d, 0x78, 0xfe, 0xe9, 0x73, 0x03, - 0x45, 0xe4, 0x2b, 0xbf, 0xbf, 0xac, 0xed, 0xfb, 0xec, 0xe2, 0x31, 0x26, - 0xf6, 0x91, 0xf6, 0xb5, 0xd7, 0xed, 0xfa, 0xc7, 0xc4, 0xab, 0x31, 0x45, - 0x58, 0x90, 0xf9, 0x1f, 0xbc, 0x33, 0xf5, 0x83, 0xf8, 0x97, 0xdf, 0xbf, - 0x0b, 0xb8, 0xf9, 0x22, 0x39, 0x56, 0xd8, 0x4b, 0xf3, 0xbe, 0x14, 0xfa, - 0x78, 0xd0, 0xd9, 0x27, 0x9c, 0x79, 0x6f, 0x94, 0x29, 0x70, 0x2c, 0x50, - 0xfb, 0x03, 0x5a, 0xce, 0x18, 0x53, 0xda, 0xb4, 0x22, 0x9f, 0x92, 0xec, - 0x97, 0x22, 0x0c, 0x7e, 0x38, 0x7b, 0x7b, 0x9d, 0x1d, 0x76, 0xd2, 0xba, - 0x43, 0x2d, 0x7b, 0x28, 0x84, 0xdb, 0x50, 0x85, 0x16, 0x56, 0xdf, 0x9b, - 0x35, 0x35, 0xf2, 0x08, 0x2e, 0x91, 0x7d, 0x3a, 0x7d, 0x51, 0x30, 0x2f, - 0x00, 0x6c, 0xcf, 0x1f, 0x9e, 0xab, 0x25, 0x81, 0x35, 0x5f, 0x3b, 0x6a, - 0x8a, 0x19, 0x4d, 0xc4, 0xf5, 0xb4, 0xf3, 0xd8, 0x1d, 0xf5, 0xb3, 0xd2, - 0xf1, 0x97, 0x5f, 0xf6, 0xfb, 0xe6, 0x71, 0xf6, 0x86, 0xad, 0x34, 0x6a, - 0x73, 0xc3, 0x0b, 0xfb, 0x3b, 0x36, 0x79, 0x23, 0xd8, 0x01, 0x81, 0xd9, - 0x56, 0x76, 0x89, 0x60, 0x26, 0x89, 0xe0, 0x04, 0x89, 0xa1, 0xfa, 0x5f, - 0xc0, 0xe9, 0x0e, 0x5e, 0xd5, 0x08, 0x89, 0xb5, 0x37, 0xfe, 0x0d, 0xc7, - 0xb0, 0x5d, 0xbe, 0x7f, 0xa1, 0xae, 0xb5, 0x55, 0xeb, 0x47, 0xa4, 0xde, - 0x27, 0x95, 0x09, 0x5c, 0xd2, 0xaf, 0x00, 0x4d, 0x02, 0xe3, 0x0b, 0x6c, - 0x05, 0x7b, 0xb6, 0xff, 0x1c, 0x4c, 0x74, 0x4e, 0xde, 0x20, 0xf0, 0xbb, - 0xdb, 0x9d, 0xa3, 0x08, 0x12, 0x17, 0x3a, 0x6d, 0xce, 0xcb, 0xf6, 0x61, - 0x5a, 0x75, 0x0e, 0x94, 0xc8, 0x31, 0xf3, 0xe6, 0xd0, 0x63, 0x08, 0x59, - 0xf5, 0xd4, 0x7b, 0x7e, 0x8b, 0x70, 0x2b, 0xca, 0x22, 0x98, 0x85, 0xd9, - 0x6c, 0xd4, 0xa7, 0x35, 0x7f, 0x24, 0x57, 0x7e, 0xe7, 0x70, 0x48, 0x63, - 0x73, 0x51, 0x16, 0x92, 0xfe, 0x89, 0xc4, 0xbb, 0xdf, 0x7d, 0x41, 0xd4, - 0x5c, 0xd9, 0x4d, 0xc8, 0xa8, 0x2e, 0xcc, 0xc1, 0x7d, 0x4c, 0xf6, 0x79, - 0x88, 0x5b, 0x2e, 0xe5, 0x33, 0x21, 0x1d, 0xc8, 0xf2, 0x2e, 0x89, 0x5b, - 0x17, 0xb7, 0x92, 0xcf, 0xf9, 0x6c, 0xa7, 0x46, 0x76, 0x36, 0xdc, 0xe9, - 0x0f, 0xc9, 0xb9, 0x35, 0xf7, 0xfd, 0x1f, 0x73, 0x16, 0xc5, 0x25, 0x96, - 0xd4, 0xc4, 0xed, 0x0e, 0x36, 0x8d, 0xca, 0x98, 0xc9, 0xab, 0x37, 0x7c, - 0x14, 0x28, 0xf3, 0x3c, 0xc0, 0x54, 0x87, 0xae, 0xd9, 0x68, 0xfa, 0x41, - 0x25, 0x89, 0xda, 0x00, 0xb3, 0x1d, 0x29, 0x4f, 0xd3, 0xc3, 0x6b, 0x23, - 0x23, 0xf3, 0xbc, 0x8c, 0x82, 0xd1, 0x4c, 0x79, 0x4b, 0x0f, 0xc6, 0x84, - 0x24, 0x9b, 0x07, 0x1d, 0x5a, 0x50, 0xac, 0xb3, 0x68, 0xda, 0x5c, 0xed, - 0xc5, 0xab, 0xbd, 0x33, 0xd8, 0xff, 0xff, 0x3d, 0x70, 0x40, 0x9b, 0x3d, - 0x6c, 0x0d, 0xf1, 0xed, 0x9f, 0x04, 0x33, 0x9b, 0xfe, 0x9c, 0x63, 0xee, - 0xb9, 0x9c, 0xe2, 0x53, 0x85, 0xc8, 0x03, 0x7a, 0xfc, 0xd8, 0xe6, 0x99, - 0x67, 0x2a, 0xac, 0x07, 0xc2, 0xc0, 0x83, 0x4c, 0x32, 0x6d, 0x3f, 0x97, - 0x85, 0xa2, 0xb8, 0xf6, 0x0f, 0x64, 0xb4, 0x87, 0xc5, 0xcf, 0x1e, 0x2e, - 0xce, 0x5e, 0xdf, 0xa5, 0x94, 0x4f, 0xb3, 0xf5, 0x28, 0x56, 0x56, 0xfc, - 0x31, 0xce, 0x44, 0xdd, 0xe2, 0x5d, 0x20, 0xad, 0x0b, 0x9e, 0xd7, 0x42, - 0x3c, 0xc0, 0x4e, 0xe2, 0xea, 0x0b, 0x1d, 0xb6, 0x4a, 0xb6, 0x54, 0xd2, - 0x97, 0xd4, 0xd6, 0xe3, 0x00, 0x36, 0xae, 0x03, 0x1a, 0x7a, 0xa2, 0x4c, - 0xca, 0x18, 0x45, 0x5f, 0xb8, 0x36, 0x6c, 0x30, 0x60, 0xaa, 0x32, 0xaa, - 0x38, 0x17, 0x9c, 0xa8, 0xf6, 0x12, 0xca, 0x96, 0xb0, 0x51, 0x38, 0xf2, - 0x41, 0x7c, 0xba, 0x68, 0xd0, 0x1f, 0xfe, 0x92, 0x22, 0x42, 0xf7, 0x3f, - 0x8f, 0x7a, 0x8b, 0xe7, 0x72, 0x97, 0xe0, 0xe0, 0x45, 0xa9, 0x3b, 0xe7, - 0xd9, 0x86, 0xe8, 0xc6, 0x78, 0x0f, 0x27, 0x2f, 0x91, 0x53, 0x3b, 0xcf, - 0xb2, 0x5d, 0x52, 0xd1, 0x77, 0xc0, 0x1f, 0x10, 0x38, 0x80, 0x92, 0x7b, - 0x22, 0x38, 0x69, 0x0a, 0x3d, 0xaf, 0xf1, 0x02, 0x85, 0x42, 0xe9, 0xd0, - 0xae, 0xb9, 0x7d, 0xd7, 0xaa, 0x98, 0x9a, 0xe3, 0x6e, 0x3f, 0x2f, 0xa5, - 0xf4, 0x2d, 0x05, 0x2d, 0x30, 0x80, 0x41, 0xb6, 0xf0, 0xdb, 0x2d, 0x1d, - 0xf4, 0x0f, 0x76, 0xa4, 0x1a, 0xcc, 0xb9, 0x1e, 0x53, 0x13, 0xf0, 0x7d, - 0x7d, 0xd6, 0x42, 0xb7, 0x82, 0x2e, 0x73, 0xf3, 0x17, 0x95, 0xd0, 0x73, - 0x47, 0xc0, 0x38, 0x7f, 0xa1, 0x5d, 0x85, 0x6f, 0x4d, 0x44, 0xe5, 0x2a, - 0x3a, 0x9a, 0x35, 0x56, 0xcc, 0x9b, 0xd7, 0x12, 0x57, 0xf2, 0xf2, 0x42, - 0xdc, 0xfb, 0xe7, 0x57, 0x90, 0xbe, 0x70, 0x6a, 0xcd, 0x59, 0x07, 0x9a, - 0x2a, 0x97, 0xcc, 0x38, 0xe4, 0xc0, 0xf7, 0xda, 0x5c, 0x19, 0x53, 0xa1, - 0x36, 0x7f, 0x15, 0xa7, 0x38, 0x61, 0xa6, 0x97, 0x00, 0x8e, 0x3b, 0x97, - 0xdf, 0x19, 0x99, 0xb6, 0x87, 0x6a, 0xfa, 0x89, 0x97, 0xd9, 0x6e, 0x55, - 0xba, 0x92, 0x1c, 0x3d, 0x42, 0xc7, 0xdb, 0x49, 0x1c, 0x43, 0xd1, 0x12, - 0xad, 0x06, 0x71, 0x17, 0x3c, 0x10, 0xa0, 0xea, 0x51, 0x1c, 0xcb, 0x5a, - 0xf4, 0x17, 0x79, 0x4f, 0xcd, 0x0a, 0x20, 0x7b, 0x26, 0x93, 0x8f, 0x8f, - 0xe9, 0xaa, 0x50, 0x97, 0xd9, 0xb4, 0x08, 0xe8, 0xee, 0x0c, 0x4d, 0x5a, - 0xfd, 0x87, 0x6e, 0x54, 0x18, 0x1e, 0xa2, 0x18, 0xa5, 0xe6, 0x22, 0x8f, - 0xdb, 0x00, 0x14, 0xac, 0xda, 0x3d, 0xb7, 0xc6, 0x1b, 0x40, 0x21, 0x2c, - 0x59, 0x09, 0x5d, 0x0f, 0x60, 0xb3, 0x2a, 0x32, 0xcc, 0x7f, 0x28, 0xc8, - 0x63, 0xde, 0xff, 0x00, 0x09, 0x5e, 0x93, 0xba, 0xef, 0x22, 0xb9, 0x06, - 0x19, 0x1c, 0xae, 0x26, 0x44, 0x2a, 0x8f, 0x61, 0xfa, 0x7a, 0x40, 0xd3, - 0x3c, 0x1a, 0xa2, 0x3c, 0xe3, 0x3c, 0x87, 0xe4, 0x81, 0x0d, 0xcb, 0x83, - 0xc0, 0xf2, 0x30, 0x0f, 0x91, 0xb9, 0xff, 0x4f, 0xfd, 0x1b, 0x9b, 0xc8, - 0x4b, 0x8a, 0x44, 0x75, 0xb2, 0x47, 0x07, 0xda, 0x16, 0x16, 0x13, 0x74, - 0x0e, 0x83, 0xb1, 0x07, 0x47, 0x8a, 0x07, 0x98, 0xdf, 0x38, 0xe9, 0x2e, - 0xf3, 0xbd, 0x12, 0x81, 0x15, 0x88, 0x81, 0x7f, 0x23, 0x9a, 0xdf, 0x86, - 0x02, 0xdb, 0x27, 0xb7, 0x28, 0x8b, 0x6c, 0x00, 0x96, 0xf0, 0xca, 0x4d, - 0xd3, 0x2e, 0x7b, 0x16, 0x83, 0xd4, 0xdc, 0x2c, 0x46, 0xe6, 0xcb, 0x4c, - 0x49, 0x88, 0x6c, 0xf2, 0x11, 0x6d, 0xf2, 0xc9, 0xba, 0x5d, 0x66, 0x2b, - 0x83, 0x64, 0xb0, 0x26, 0x70, 0x31, 0xb6, 0x20, 0x87, 0xfe, 0x57, 0x02, - 0xfc, 0x93, 0x0e, 0xe4, 0x2c, 0xd4, 0x80, 0x86, 0x2e, 0x10, 0x84, 0xcb, - 0x2f, 0x70, 0x61, 0xb0, 0xad, 0xdf, 0x86, 0xd6, 0xe0, 0x9a, 0x42, 0x98, - 0x73, 0xa7, 0x7a, 0x56, 0xb5, 0xf2, 0xb5, 0xc0, 0xd6, 0x01, 0xd4, 0x3e, - 0x3a, 0x4e, 0x24, 0xb9, 0x08, 0xfc, 0x42, 0x5b, 0x54, 0x62, 0x44, 0x8e, - 0x97, 0x5b, 0x81, 0x67, 0x5d, 0x87, 0x5d, 0xbf, 0x2d, 0xb5, 0x72, 0x74, - 0xb4, 0x6a, 0x32, 0x22, 0x74, 0x76, 0x1d, 0xd5, 0x7d, 0xe0, 0xaf, 0xcf, - 0xf3, 0x4a, 0x40, 0xa9, 0x69, 0xe7, 0x25, 0xab, 0x97, 0xa9, 0xbe, 0xd2, - 0x7e, 0x1c, 0x41, 0x1d, 0xc4, 0x3c, 0x3a, 0x6f, 0x37, 0x3c, 0x91, 0x18, - 0x0a, 0x3d, 0x57, 0x79, 0x99, 0x6a, 0x94, 0xa3, 0x88, 0xc9, 0x44, 0xc9, - 0x3e, 0x4f, 0x4e, 0x8a, 0x66, 0x7d, 0x98, 0xad, 0x31, 0xfd, 0x81, 0x4f, - 0x95, 0xf5, 0x51, 0xa0, 0x0b, 0xd5, 0xa9, 0xb8, 0xa1, 0xa5, 0xed, 0xa6, - 0x16, 0xad, 0x17, 0x82, 0x5f, 0x00, 0xb0, 0xbc, 0xe2, 0xb0, 0x94, 0x2e, - 0xe3, 0xa0, 0xea, 0x64, 0x44, 0x4e, 0x62, 0xff, 0x87, 0x17, 0x25, 0x59, - 0x7c, 0xc7, 0x81, 0x94, 0x19, 0x11, 0x75, 0x95, 0x65, 0x4d, 0xa9, 0x6e, - 0x2c, 0x95, 0x6a, 0xac, 0xe4, 0xe1, 0xc8, 0x48, 0x4f, 0x6b, 0x52, 0x86, - 0x8e, 0xed, 0x6d, 0xf2, 0x16, 0x59, 0x18, 0x56, 0x1b, 0x37, 0x4a, 0x39, - 0x6e, 0x2d, 0x6a, 0x23, 0x5c, 0x7f, 0x54, 0xb9, 0x9e, 0xa2, 0xb8, 0xc1, - 0x17, 0x51, 0x5b, 0x9d, 0xe7, 0xa9, 0x3e, 0x6d, 0xda, 0xf5, 0xf7, 0x4a, - 0xe4, 0xec, 0x94, 0x26, 0xd9, 0x38, 0xfb, 0xb2, 0x95, 0x24, 0xb1, 0xce, - 0xfa, 0xf4, 0x89, 0x49, 0xe9, 0x55, 0x82, 0x94, 0x21, 0x24, 0xed, 0x7f, - 0xee, 0x8c, 0x29, 0xe7, 0xab, 0x5d, 0xb7, 0xa6, 0x53, 0x9c, 0x74, 0xad, - 0x93, 0x89, 0x9a, 0x7f, 0xba, 0x3e, 0x9b, 0x5f, 0xa9, 0xb0, 0x90, 0x12, - 0x8d, 0x45, 0x69, 0x7b, 0x61, 0xe3, 0xa8, 0x43, 0x3f, 0xde, 0x85, 0x72, - 0xb1, 0xaa, 0x5c, 0xb7, 0x55, 0xcf, 0xb9, 0xa0, 0x5f, 0x75, 0x23, 0x8d, - 0xde, 0xf3, 0xd9, 0x65, 0x2a, 0x2a, 0x50, 0x26, 0x21, 0x4c, 0xf6, 0xb3, - 0xce, 0xb5, 0x78, 0xe3, 0xc7, 0x29, 0xb4, 0x08, 0x7a, 0x4e, 0xa2, 0x85, - 0xc4, 0x0d, 0x1e, 0x0d, 0x62, 0x60, 0xb5, 0xb6, 0x3c, 0x84, 0x34, 0x27, - 0x0b, 0xe5, 0x71, 0x9a, 0xd0, 0xf4, 0x2d, 0x8c, 0xf1, 0xe7, 0x83, 0xf3, - 0x3a, 0x9c, 0x91, 0xd1, 0x2f, 0x4a, 0x97, 0x7b, 0x98, 0xc6, 0x01, 0x91, - 0xdd, 0xe3, 0x6f, 0x52, 0x26, 0x07, 0xcb, 0x05, 0x59, 0xb8, 0x03, 0xf2, - 0x5c, 0x1a, 0x24, 0x17, 0x4a, 0x79, 0x13, 0x61, 0x2b, 0x4e, 0x02, 0x21, - 0x5e, 0x70, 0x50, 0x08, 0xa6, 0xb1, 0x91, 0x06, 0x3f, 0x88, 0xaf, 0xa9, - 0x20, 0xc9, 0x29, 0xe9, 0x38, 0x28, 0x6e, 0x98, 0x27, 0x79, 0xf4, 0x60, - 0x05, 0x45, 0xcc, 0x37, 0xa9, 0x09, 0x99, 0xd1, 0x5e, 0xb2, 0x12, 0x92, - 0x04, 0x47, 0x48, 0x77, 0xc7, 0xbd, 0x35, 0xeb, 0x36, 0xac, 0x1f, 0xe9, - 0x41, 0x47, 0xb7, 0x1d, 0x7f, 0x13, 0x62, 0x49, 0xa3, 0xf5, 0x0d, 0x2d, - 0xfe, 0x10, 0x39, 0x86, 0xb3, 0x41, 0xf9, 0x92, 0x6e, 0x8f, 0x7e, 0x55, - 0x3f, 0xfe, 0x1c, 0x6c, 0xbe, 0x14, 0x00, 0x0a, 0x23, 0xa5, 0xa4, 0x58, - 0x47, 0x1d, 0x87, 0x7f, 0xc6, 0x9a, 0x93, 0xaa, 0xf8, 0x2b, 0x6c, 0x58, - 0x20, 0xce, 0x24, 0x63, 0x14, 0x1c, 0xcc, 0xec, 0xc1, 0x53, 0xb2, 0x7a, - 0x4c, 0x62, 0x85, 0x5d, 0xe5, 0x3d, 0x3a, 0x8b, 0x5e, 0xb4, 0x81, 0x16, - 0xf3, 0x5b, 0x9d, 0xc5, 0x2c, 0x66, 0x1a, 0x89, 0xa0, 0x8c, 0x8f, 0xf5, - 0x55, 0x44, 0x1e, 0xb0, 0xa6, 0x34, 0x3c, 0xf6, 0x77, 0x0a, 0x64, 0xb2, - 0xb0, 0xe7, 0x8c, 0xa7, 0x87, 0x4f, 0x39, 0xc4, 0x23, 0x43, 0x9c, 0x49, - 0x1e, 0x57, 0x01, 0x38, 0xf2, 0x2c, 0x6a, 0x2e, 0x7f, 0x19, 0x06, 0xdd, - 0x3a, 0x04, 0xc7, 0x57, 0x15, 0x18, 0x49, 0x4c, 0x8b, 0xa5, 0x2c, 0xd5, - 0xb9, 0x06, 0x15, 0x4b, 0x75, 0xa5, 0x9b, 0x9b, 0x09, 0x47, 0xaf, 0xe9, - 0xb4, 0x39, 0x67, 0x1d, 0x75, 0x3a, 0x06, 0x7f, 0xca, 0xad, 0xbf, 0xd2, - 0x8d, 0xd5, 0xb8, 0x8f, 0x0d, 0x11, 0xb7, 0xe1, 0x3f, 0xea, 0x50, 0x09, - 0xbc, 0x63, 0xb2, 0xe1, 0xc3, 0xfd, 0x30, 0xb5, 0x45, 0xb0, 0x37, 0x86, - 0x89, 0x83, 0xd3, 0x5a, 0xc7, 0xa6, 0xad, 0xa0, 0xa6, 0xe0, 0xb5, 0xfd, - 0x33, 0xb3, 0xc1, 0x55, 0x62, 0x43, 0xea, 0x7e, 0x15, 0x88, 0x52, 0xf4, - 0xfc, 0x1a, 0x6b, 0x38, 0x14, 0x23, 0xe2, 0x83, 0x3e, 0xf5, 0x5c, 0xec, - 0x57, 0x42, 0xb2, 0x8d, 0x61, 0x4c, 0xcb, 0x78, 0x7c, 0xe9, 0x32, 0x85, - 0x0c, 0xa9, 0xd7, 0x66, 0x0c, 0x1d, 0x69, 0xa7, 0xc9, 0xea, 0x11, 0x5a, - 0xbf, 0x7d, 0xaa, 0x45, 0x63, 0x92, 0x6c, 0x34, 0x5d, 0x51, 0xea, 0xa5, - 0x76, 0xc7, 0xfa, 0x3b, 0x1a, 0xea, 0x25, 0xa3, 0xf7, 0x4f, 0xee, 0xe7, - 0xb6, 0xa6, 0xa0, 0x85, 0x11, 0x7d, 0x5c, 0xa0, 0x9f, 0xc3, 0x9c, 0x80, - 0x0d, 0x42, 0x4e, 0xcc, 0x60, 0x26, 0xf5, 0xc3, 0xe3, 0x6b, 0xdb, 0x6f, - 0x7e, 0xb2, 0xa8, 0xa7, 0xb7, 0x92, 0x3a, 0xc9, 0x64, 0x0c, 0x4a, 0xa0, - 0x8f, 0xf6, 0xb2, 0x83, 0x21, 0x20, 0xea, 0x54, 0x72, 0x33, 0xbf, 0x76, - 0x8e, 0x5e, 0xe4, 0x71, 0xb0, 0x22, 0x1c, 0x7d, 0x3e, 0xe8, 0x09, 0x2a, - 0x9f, 0xee, 0x5c, 0x2f, 0x8d, 0xe1, 0x08, 0x6a, 0x21, 0xf5, 0xe9, 0xe0, - 0x4f, 0x74, 0x51, 0x1e, 0x0e, 0x28, 0x9d, 0xe7, 0xbd, 0x21, 0x17, 0xe9, - 0xdf, 0xc4, 0xf4, 0x01, 0x8e, 0x01, 0xc8, 0x56, 0x64, 0x75, 0xa5, 0xcb, - 0xeb, 0xb2, 0xba, 0x8b, 0xbd, 0x1a, 0x7c, 0x31, 0x4d, 0xad, 0x79, 0x6c, - 0x5a, 0x20, 0x1d, 0x9d, 0x3d, 0x15, 0xd4, 0x67, 0xf1, 0x2a, 0x85, 0x7d, - 0xe1, 0x8c, 0xa7, 0xf7, 0xe4, 0xe3, 0x04, 0x76, 0xdf, 0x0f, 0x6f, 0x59, - 0x8b, 0x3c, 0x87, 0x18, 0x20, 0x7b, 0x85, 0x4f, 0xab, 0x8f, 0x41, 0x14, - 0x0c, 0x05, 0x99, 0x57, 0xd9, 0xe6, 0x4e, 0x4f, 0x4b, 0x6f, 0x73, 0x98, - 0x51, 0x50, 0x37, 0xc2, 0x7b, 0x61, 0xe9, 0xde, 0xfd, 0x31, 0xb7, 0xda, - 0x3f, 0xe4, 0xba, 0x8b, 0xe4, 0xed, 0xef, 0xd4, 0xdc, 0x48, 0x77, 0x0d, - 0x5f, 0x8a, 0x98, 0x7f, 0xda, 0x3d, 0xaf, 0x8d, 0xfa, 0x3b, 0x70, 0x8e, - 0xf9, 0xfb, 0x39, 0xa4, 0xb4, 0xfb, 0x9c, 0xf8, 0x88, 0x71, 0xa0, 0x83, - 0xea, 0x46, 0xbc, 0x16, 0x53, 0xb8, 0xc1, 0x18, 0x7d, 0x4c, 0x3a, 0x6a, - 0x82, 0x28, 0x4e, 0x87, 0x1e, 0xe4, 0x9a, 0x8d, 0x7c, 0x4e, 0x39, 0x2c, - 0xba, 0x06, 0x15, 0xa4, 0x07, 0x6a, 0x6d, 0x28, 0x01, 0x73, 0x15, 0x06, - 0xd8, 0xfc, 0x89, 0x1e, 0x2b, 0xfa, 0x65, 0x1c, 0x23, 0x72, 0x36, 0x4c, - 0x2c, 0x0b, 0x5e, 0xb9, 0x68, 0xc4, 0xcd, 0xbe, 0x12, 0x9e, 0xa6, 0xe5, - 0xd6, 0xfd, 0xe8, 0xe1, 0x51, 0xd6, 0xa7, 0x75, 0xeb, 0x87, 0xb0, 0x9d, - 0x54, 0xe4, 0xb8, 0x80, 0x6d, 0xf2, 0xd0, 0x59, 0xb9, 0xc9, 0x26, 0x7d, - 0xe0, 0x4a, 0x6b, 0x1c, 0xc6, 0xf9, 0x70, 0x15, 0xb2, 0x32, 0x07, 0x55, - 0xfa, 0x65, 0x57, 0x52, 0x1b, 0xf8, 0x5e, 0xa2, 0xf9, 0xc7, 0x84, 0xaf, - 0x95, 0x5c, 0xd4, 0x4b, 0x08, 0x05, 0x84, 0xe8, 0x9c, 0x92, 0xe0, 0x43, - 0xc9, 0x29, 0xb6, 0xab, 0x32, 0x6e, 0x72, 0xc6, 0xc3, 0x86, 0x6d, 0x48, - 0xf3, 0x10, 0x06, 0x0c, 0x30, 0xdb, 0x32, 0x99, 0x3c, 0x19, 0xad, 0x1f, - 0xdd, 0xeb, 0x21, 0x06, 0x5e, 0x41, 0xde, 0xab, 0xac, 0x6c, 0xf6, 0xb7, - 0x30, 0xd2, 0x68, 0x73, 0x6d, 0xcc, 0x0d, 0x68, 0x43, 0x7c, 0xe1, 0x5b, - 0x14, 0x07, 0x2c, 0xc1, 0xa2, 0x8f, 0x27, 0xeb, 0x25, 0xda, 0x3b, 0xc1, - 0x42, 0xe6, 0x00, 0x6a, 0xc7, 0x87, 0x4b, 0xc2, 0x28, 0x91, 0xc0, 0x1b, - 0xc9, 0x38, 0x4a, 0x3c, 0x39, 0x6c, 0xfc, 0xdb, 0x65, 0x2b, 0x8a, 0x03, - 0x7a, 0xa2, 0x5f, 0xba, 0x8b, 0x7b, 0x4e, 0x49, 0x69, 0x23, 0x98, 0xba, - 0xaa, 0x1d, 0xac, 0x96, 0xcf, 0xf0, 0xb3, 0xf4, 0x1b, 0xa5, 0x5b, 0x8b, - 0x38, 0x97, 0xf5, 0xae, 0x55, 0xbe, 0xc0, 0x41, 0x24, 0x5c, 0xe5, 0x47, - 0x58, 0x6b, 0xe7, 0xb5, 0x3c, 0xcd, 0x8d, 0x34, 0xee, 0xb4, 0x46, 0xba, - 0xb3, 0xe3, 0x1e, 0x0e, 0xf5, 0x1f, 0x8c, 0xec, 0x68, 0xbf, 0x40, 0xb4, - 0xd8, 0xf9, 0x87, 0x0e, 0x77, 0xc2, 0x36, 0xe7, 0xf4, 0x57, 0xff, 0x0d, - 0x1d, 0xf1, 0xc8, 0x5b, 0x76, 0x8f, 0x74, 0xbd, 0x0d, 0x09, 0x24, 0x76, - 0xce, 0xbe, 0xc7, 0x96, 0xaf, 0xfd, 0x61, 0xf0, 0x4e, 0xb4, 0x1e, 0x5b, - 0x6f, 0xdf, 0x15, 0x26, 0xda, 0x06, 0x0f, 0xa0, 0x40, 0xc5, 0x15, 0xbd, - 0xe6, 0xb4, 0xf9, 0xec, 0xc7, 0xeb, 0x82, 0xcd, 0x07, 0x3a, 0xbb, 0xb8, - 0x0c, 0x50, 0x86, 0x58, 0xf7, 0x12, 0x4c, 0x8e, 0x25, 0xb7, 0x42, 0xf9, - 0xd9, 0x44, 0xb3, 0x7e, 0x41, 0x50, 0x9e, 0x9c, 0xda, 0xe5, 0x61, 0x35, - 0x22, 0xf5, 0x3d, 0x6d, 0xab, 0x51, 0x27, 0xea, 0xd3, 0x27, 0x12, 0x4e, - 0xf6, 0x9c, 0x77, 0x54, 0xdd, 0x22, 0x71, 0xe5, 0xa3, 0x14, 0x9a, 0x4f, - 0xb2, 0xcc, 0x92, 0x4e, 0x89, 0x6f, 0xfd, 0x4e, 0xde, 0x8e, 0xe5, 0x8e, - 0x3b, 0x0b, 0x52, 0xfd, 0x5b, 0x1d, 0xeb, 0xc8, 0x05, 0x62, 0xac, 0x20, - 0x57, 0x77, 0x64, 0xbd, 0x71, 0xeb, 0x17, 0x1e, 0xfa, 0x0b, 0xee, 0x9a, - 0x1e, 0x7e, 0xeb, 0x9f, 0xa4, 0xa5, 0x86, 0xdf, 0x05, 0xa5, 0xd0, 0xf6, - 0x56, 0xd3, 0xf6, 0x3f, 0xde, 0xe7, 0x6c, 0x96, 0x10, 0x19, 0x60, 0xc9, - 0xf5, 0x81, 0x4d, 0xd5, 0x18, 0x22, 0xb7, 0xa4, 0x9f, 0xe7, 0x77, 0x7d, - 0x7b, 0x7f, 0x8f, 0xf9, 0x0a, 0x9a, 0x5e, 0x79, 0x2f, 0xe4, 0xf4, 0x74, - 0xe6, 0x23, 0xb4, 0xaa, 0x55, 0xf7, 0xb4, 0x52, 0xe5, 0xd2, 0x5d, 0xbe, - 0x6d, 0x1b, 0x8d, 0x04, 0x2f, 0x6d, 0x68, 0x46, 0x99, 0xd2, 0x2f, 0xf2, - 0x25, 0x85, 0x71, 0xed, 0xc6, 0x27, 0x1d, 0x57, 0x9a, 0x44, 0xd6, 0x84, - 0xb8, 0x54, 0x4b, 0x29, 0xd9, 0x44, 0xb3, 0x72, 0x41, 0x51, 0x9f, 0x5c, - 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, 0xf0, 0x49, 0x45, 0x19, - 0xe7, 0x33, 0x28, 0x67, 0x87, 0xc3, 0x05, 0x10, 0x22, 0xd6, 0x9a, 0x81, - 0xe3, 0xdc, 0x9a, 0xaa, 0x2a, 0xfe, 0x80, 0x96, 0x5e, 0xa7, 0x2b, 0xfd, - 0x1f, 0x99, 0x0d, 0x51, 0x3b, 0x0b, 0x52, 0xfd, 0x5b, 0x25, 0xeb, 0xc8, - 0x02, 0xd2, 0xac, 0x20, 0x57, 0x77, 0x64, 0xbd, 0x71, 0xeb, 0x17, 0x1e, - 0xfa, 0x0b, 0xee, 0x9a, 0x1e, 0x7e, 0xeb, 0x9f, 0xa4, 0xa5, 0x86, 0xdf, - 0x05, 0xa5, 0xd0, 0xf6, 0x56, 0xd3, 0xf6, 0x3f, 0xde, 0xe7, 0x6c, 0x96, - 0x10, 0x19, 0x60, 0xc9, 0x84, 0xf1, 0x9a, 0xef, 0xa2, 0xe2, 0x46, 0x56, - 0x06, 0xff, 0x78, 0x09, 0x6a, 0x78, 0xb2, 0x85, 0x20, 0x3f, 0x9d, 0x0f, - 0x50, 0x03, 0x73, 0xe2, 0x52, 0xbf, 0x76, 0xb7, 0xdb, 0x6f, 0x48, 0x0a, - 0xe5, 0xd2, 0x5d, 0xbe, 0x6d, 0x1b, 0x8d, 0x04, 0x2f, 0x6d, 0x68, 0x16, - 0x99, 0xd2, 0x2f, 0xf2, 0x25, 0x85, 0x71, 0xed, 0xc6, 0x27, 0x1d, 0x57, - 0x9a, 0x44, 0xd6, 0x84, 0xb8, 0x54, 0x4b, 0x29, 0xd9, 0x44, 0xb3, 0x72, - 0x41, 0x51, 0x9f, 0x5c, 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, - 0xf0, 0x49, 0x45, 0x19, 0xe7, 0x33, 0x28, 0x67, 0x87, 0xc3, 0x05, 0x10, - 0x22, 0xd6, 0x9a, 0x81, 0x5b, 0x66, 0x30, 0x54, 0x18, 0x0a, 0xd3, 0x84, - 0x7a, 0x4e, 0x50, 0xd2, 0x94, 0xd6, 0xf0, 0xcf, 0xd1, 0xe9, 0x31, 0x2c, - 0x9c, 0xcf, 0x5b, 0x3f, 0x14, 0x1a, 0xe4, 0x8b, 0xe8, 0x71, 0xd0, 0xbd, - 0x75, 0x78, 0x5e, 0x32, 0xdf, 0x3a, 0xfc, 0xcf, 0x7b, 0xb2, 0xac, 0xe1, - 0x8b, 0x0f, 0x7b, 0x3d, 0x6d, 0x1c, 0xdb, 0xb6, 0x74, 0x61, 0x0c, 0x61, - 0x33, 0xd1, 0xcd, 0x20, 0xe6, 0xa8, 0x11, 0x77, 0x2b, 0x6e, 0x29, 0x07, - 0x32, 0xb3, 0x45, 0xfe, 0x80, 0x00, 0x04, 0xb5, 0x75, 0x96, 0x35, 0x72, - 0x5e, 0x88, 0x99, 0x21, 0x92, 0xd8, 0xef, 0xe2, 0x2b, 0x69, 0xa3, 0x71, - 0xbc, 0xaf, 0xfe, 0x1f, 0xf5, 0xeb, 0x10, 0xde, 0xee, 0x5a, 0xbe, 0x85, - 0x02, 0xa4, 0xd3, 0x74, 0x30, 0xa4, 0x6a, 0xc8, 0xa5, 0x85, 0x71, 0xed, - 0xc6, 0x27, 0x1d, 0x57, 0x9a, 0x44, 0xd6, 0x84, 0xb8, 0x54, 0x4b, 0x29, - 0xd9, 0x44, 0xb3, 0x72, 0x41, 0x51, 0x9f, 0x5c, 0xda, 0xe5, 0x61, 0x35, - 0x22, 0xf5, 0x3d, 0x6d, 0x82, 0x9d, 0x9c, 0x82, 0xb4, 0x79, 0xc2, 0x73, - 0xc3, 0x64, 0x44, 0x17, 0x81, 0x3b, 0x6d, 0x2f, 0x55, 0x18, 0x08, 0x76, - 0xda, 0x91, 0xdc, 0xc6, 0x93, 0x58, 0xbc, 0xb0, 0x7f, 0x75, 0x73, 0xab, - 0xd7, 0xe9, 0x31, 0x2c, 0x9c, 0xcf, 0x5a, 0x9f, 0x14, 0x1a, 0xe4, 0x7b, - 0xe8, 0x71, 0xd0, 0xbd, 0x75, 0x78, 0x5e, 0x32, 0xdf, 0x3a, 0xfc, 0xcf, - 0x7b, 0xb2, 0xac, 0xe1, 0x8b, 0x0f, 0x7b, 0x3d, 0x6d, 0x1c, 0xdb, 0xb6, - 0x74, 0x61, 0x0c, 0x61, 0x33, 0xd1, 0xcd, 0x20, 0xe6, 0xa8, 0x11, 0x77, - 0xac, 0x2e, 0x60, 0x74, 0x6e, 0x29, 0x92, 0xef, 0xbb, 0xab, 0x08, 0xfe, - 0xf0, 0x9c, 0x0f, 0x96, 0xa0, 0xed, 0x57, 0xd0, 0xa8, 0x6a, 0x4d, 0x90, - 0x20, 0x31, 0x35, 0x2b, 0x65, 0x79, 0x53, 0x77, 0xf5, 0xeb, 0x10, 0xde, - 0xee, 0x5a, 0xbe, 0x85, 0x02, 0xa8, 0xd3, 0x74, 0x3f, 0x74, 0x6a, 0xc8, - 0xa5, 0x85, 0x71, 0xed, 0xc6, 0x27, 0x1d, 0x57, 0x9a, 0x44, 0xd6, 0x84, - 0xb8, 0x54, 0x4b, 0x29, 0xd9, 0x44, 0xb3, 0x72, 0x41, 0x51, 0x9f, 0x5c, - 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, 0x23, 0x6e, 0xbb, 0x4c, - 0x08, 0xb8, 0x61, 0x40, 0xaf, 0x5a, 0x3f, 0x20, 0x00, 0x94, 0xe2, 0x93, - 0xa5, 0x63, 0xe0, 0xdf, 0x39, 0x9f, 0xac, 0x28, 0xda, 0x41, 0x77, 0x71, - 0x26, 0xc8, 0x73, 0x6c, 0xfe, 0x6c, 0x08, 0x77, 0x73, 0x65, 0xfa, 0xfd, - 0xa5, 0x00, 0x02, 0x25, 0x06, 0x4c, 0x5c, 0x2c, 0x78, 0x5f, 0x27, 0x55, - 0x11, 0x3e, 0xb6, 0xf9, 0x0c, 0x11, 0xce, 0x06, 0xc5, 0xb0, 0xc5, 0xa6, - 0xb2, 0x42, 0xb9, 0x72, 0x90, 0x03, 0x53, 0xf3, 0x16, 0x57, 0x8d, 0x53, - 0x6b, 0x97, 0x5f, 0x4b, 0x4a, 0x54, 0x6c, 0x84, 0xc0, 0x76, 0x0a, 0xd7, - 0x8b, 0xb6, 0x2b, 0xa9, 0x15, 0xf0, 0x8d, 0x39, 0x58, 0xb4, 0x30, 0x46, - 0x67, 0x1a, 0x81, 0x87, 0x2f, 0xee, 0xb7, 0x48, 0xee, 0x08, 0x9e, 0x36, - 0x5b, 0x92, 0xbe, 0x0a, 0xa2, 0xd8, 0xae, 0xd4, 0xeb, 0x97, 0xdc, 0x76, - 0xb3, 0xe6, 0xe5, 0xb9, 0xbd, 0x54, 0x05, 0xb9, 0x1f, 0x0d, 0xa7, 0x1f, - 0xd9, 0x13, 0x07, 0xe5, 0xe5, 0x87, 0x9c, 0x8b, 0x19, 0xdd, 0xd9, 0xe5, - 0x46, 0x79, 0x55, 0x06, 0xe0, 0x2c, 0x9e, 0xc6, 0x0e, 0xdd, 0x16, 0x9c, - 0x82, 0x59, 0x18, 0xf0, 0xce, 0x28, 0xe5, 0x31, 0x64, 0xef, 0x16, 0xa0, - 0xf9, 0x10, 0xa6, 0x98, 0xfc, 0xb0, 0x24, 0x22, 0x50, 0x79, 0x4a, 0x72, - 0x4a, 0x7a, 0x47, 0xfd, 0x92, 0x74, 0x45, 0xad, 0xdf, 0x63, 0x0c, 0xc6, - 0x0a, 0xc5, 0x1d, 0xdb, 0x88, 0x5c, 0x97, 0x3b, 0x48, 0x5f, 0xea, 0x3d, - 0x1b, 0xaa, 0xf7, 0x25, 0x90, 0xc2, 0xcf, 0x77, 0x9c, 0x66, 0xb1, 0xf5, - 0xa9, 0x1b, 0x85, 0x84, 0xe3, 0x22, 0xef, 0xe3, 0xf3, 0xa9, 0x0c, 0xa6, - 0x48, 0xa8, 0xf8, 0xe7, 0xd7, 0x91, 0x71, 0x93, 0x84, 0xd7, 0x89, 0x9d, - 0x3e, 0x95, 0x41, 0x0f, 0x63, 0xc3, 0x51, 0x5f, 0x1a, 0x38, 0x5c, 0x64, - 0x68, 0x7e, 0xbd, 0xf5, 0x5c, 0xe8, 0x79, 0x0b, 0x3a, 0xe0, 0x0c, 0x4c, - 0x39, 0x11, 0x29, 0xee, 0x0d, 0xd0, 0x91, 0x54, 0x01, 0x71, 0x87, 0xca, - 0xdd, 0x05, 0x49, 0x5e, 0x91, 0x91, 0x26, 0x66, 0x70, 0x8f, 0xe7, 0x9c, - 0xb3, 0xbd, 0xd5, 0xd3, 0x89, 0xcc, 0xfd, 0xc3, 0x3f, 0x8e, 0xed, 0x93, - 0x5d, 0x02, 0xcb, 0x0a, 0x45, 0x38, 0x13, 0xa6, 0xd5, 0x70, 0xc5, 0x0f, - 0x6e, 0x30, 0x6c, 0xd2, 0xc0, 0xf4, 0xb2, 0x41, 0xa2, 0x30, 0xe3, 0x9a, - 0xb9, 0xd7, 0x08, 0x53, 0xa0, 0x7d, 0xc9, 0x4c, 0xae, 0x12, 0xab, 0x99, - 0xd5, 0xf4, 0x91, 0x1e, 0x5a, 0xbc, 0x25, 0xb8, 0x34, 0xc8, 0xb4, 0x66, - 0x33, 0x76, 0x55, 0x21, 0x37, 0x2e, 0x61, 0x1e, 0x2e, 0x8d, 0x1b, 0xd4, - 0x1a, 0x06, 0x36, 0xf9, 0x0a, 0xb0, 0xca, 0x4e, 0x2b, 0xfd, 0xe2, 0x72, - 0x18, 0x5b, 0x91, 0x6d, 0x08, 0x38, 0x1b, 0xec, 0xea, 0xc2, 0x6f, 0x34, - 0xbb, 0x31, 0xb6, 0x36, 0xea, 0x51, 0xac, 0xad, 0x45, 0x5e, 0x0f, 0xbe, - 0x57, 0xbb, 0xbc, 0x78, 0x34, 0x3b, 0xec, 0xb7, 0xf6, 0x14, 0xb5, 0xcb, - 0x1f, 0xd8, 0x2d, 0x6a, 0x3d, 0x5b, 0xac, 0x3c, 0x2e, 0x2e, 0x2a, 0xbf, - 0xad, 0xa9, 0x46, 0xb5, 0xba, 0x5a, 0xe6, 0x4c, 0xb5, 0xad, 0x0b, 0x2a, - 0x51, 0x1b, 0x7f, 0xe3, 0x8e, 0x28, 0x31, 0x01, 0x6b, 0xb1, 0x71, 0x8a, - 0xb8, 0xed, 0xad, 0xd2, 0xf2, 0x84, 0x7e, 0x5e, 0xa8, 0xcf, 0xbc, 0x03, - 0xf1, 0x31, 0xe9, 0x7a, 0xe5, 0x5c, 0xba, 0xaf, 0x30, 0x16, 0x54, 0xc3, - 0x33, 0x9c, 0x6d, 0xfe, 0x28, 0x86, 0xf3, 0xb3, 0x29, 0x9b, 0x4f, 0x84, - 0x4d, 0x04, 0x41, 0x84, 0x2c, 0x9f, 0xea, 0xfb, 0xe8, 0x48, 0xb3, 0xbc, - 0x90, 0xbc, 0xe8, 0x82, 0xb0, 0xce, 0x56, 0x68, 0x07, 0x13, 0x2c, 0x4f, - 0xd7, 0xd2, 0xbe, 0x11, 0x80, 0xc9, 0xfe, 0x44, 0xa5, 0xf3, 0xb7, 0x0e, - 0xb1, 0x71, 0x2f, 0x25, 0xbe, 0x02, 0xc4, 0x78, 0xec, 0x5e, 0x07, 0x7d, - 0xc5, 0x40, 0xe6, 0x66, 0x78, 0xd1, 0xb9, 0x29, 0x85, 0x14, 0x21, 0x05, - 0xb2, 0x1b, 0x0a, 0x2a, 0x46, 0xcc, 0x14, 0x21, 0xc1, 0xf3, 0x12, 0xfa, - 0xa6, 0xcf, 0xa7, 0xde, 0x1d, 0xff, 0x4d, 0x31, 0x90, 0x22, 0x71, 0x64, - 0x8a, 0x76, 0x74, 0x56, 0x7c, 0xa7, 0x07, 0x53, 0xc7, 0xdb, 0xc2, 0xb8, - 0xd5, 0xdb, 0xa8, 0x7b, 0x5f, 0x10, 0x3e, 0x35, 0x59, 0x1c, 0x86, 0x12, - 0xc2, 0x2c, 0x33, 0x19, 0xf8, 0x80, 0x6c, 0x5c, 0x28, 0x25, 0x09, 0xa1, - 0xe8, 0x4d, 0x20, 0x67, 0x79, 0x5b, 0xba, 0x0f, 0x03, 0x69, 0x58, 0x4b, - 0xf9, 0x34, 0x42, 0x05, 0xe9, 0x14, 0x6d, 0x62, 0xcc, 0x83, 0xa1, 0x34, - 0x2c, 0xcf, 0x98, 0xb3, 0xba, 0xc6, 0x07, 0xc7, 0xa3, 0x41, 0x86, 0x54, - 0x98, 0x4e, 0x17, 0x00, 0x78, 0x67, 0x36, 0xcd, 0xc7, 0x7a, 0x74, 0x3d, - 0xc2, 0xaf, 0x5b, 0x08, 0x16, 0x70, 0x24, 0x33, 0x1b, 0xb9, 0xf1, 0xa9, - 0xf8, 0x99, 0xaa, 0x3a, 0xe2, 0x37, 0xcc, 0xa2, 0x0e, 0xff, 0x96, 0xf5, - 0x7c, 0x46, 0x57, 0x91, 0x5e, 0x40, 0xc3, 0x43, 0x4e, 0x6c, 0xa0, 0x44, - 0x09, 0x42, 0xae, 0x2f, 0xcc, 0xa2, 0x5f, 0xa2, 0x66, 0xe6, 0xba, 0xdd, - 0x91, 0xe8, 0x68, 0x99, 0x66, 0xfc, 0xa6, 0xfb, 0xd9, 0x97, 0x8e, 0xb6, - 0x91, 0xd7, 0xfb, 0x9e, 0xbe, 0xf3, 0x44, 0xfb, 0x78, 0xe6, 0x10, 0x96, - 0xfe, 0xf8, 0xfd, 0x28, 0x7c, 0x56, 0x7d, 0xfb, 0x98, 0x2a, 0x14, 0x02, - 0xf1, 0xf5, 0x73, 0xc5, 0x76, 0x2b, 0x72, 0x22, 0x98, 0xd1, 0x91, 0x89, - 0x1f, 0x1e, 0x85, 0x71, 0xfd, 0x80, 0x5f, 0xef, 0x30, 0x97, 0x61, 0xd0, - 0xed, 0x19, 0xcf, 0xb5, 0x90, 0x77, 0xa1, 0xb2, 0x2f, 0xf9, 0x36, 0x24, - 0xe8, 0xd8, 0x5e, 0x60, 0xe0, 0x18, 0x4d, 0x25, 0xc3, 0x5b, 0x21, 0x8f, - 0x04, 0x48, 0xb3, 0x51, 0x29, 0xae, 0x44, 0x7e, 0xc4, 0x91, 0x2a, 0xf2, - 0x5e, 0x83, 0x51, 0x1a, 0xa3, 0xca, 0x09, 0xd5, 0x74, 0xb3, 0x64, 0xb2, - 0xd0, 0x6a, 0xd4, 0x5a, 0xdd, 0x9d, 0x48, 0x1b, 0x83, 0x65, 0xe9, 0x08, - 0x49, 0xd6, 0xad, 0x81, 0xbd, 0xa9, 0x8c, 0x60, 0x43, 0xcc, 0xe0, 0x0c, - 0xb1, 0x8a, 0xac, 0xa7, 0x9d, 0x86, 0x84, 0x6b, 0x28, 0x14, 0xd5, 0xe6, - 0x1b, 0xe4, 0xdc, 0x55, 0x50, 0x2e, 0x35, 0x70, 0x34, 0x47, 0xe8, 0x76, - 0x22, 0x8b, 0x6d, 0xca, 0xcf, 0xe3, 0x2a, 0xb7, 0xc4, 0x8f, 0x5e, 0xb8, - 0x93, 0x53, 0xc3, 0xe0, 0x6c, 0xc0, 0x67, 0x11, 0x0e, 0x7f, 0x5d, 0x2b, - 0x3c, 0x31, 0xf2, 0x2c, 0x95, 0xa5, 0x07, 0x25, 0x2d, 0x37, 0x29, 0x53, - 0x14, 0xfe, 0x0f, 0x16, 0x23, 0x14, 0x60, 0xc5, 0xf6, 0x80, 0xfe, 0x0e, - 0x96, 0xe7, 0x19, 0x06, 0x8f, 0x45, 0x69, 0x36, 0x9d, 0x6a, 0xb4, 0x85, - 0xb8, 0xcd, 0x0e, 0xe2, 0xc8, 0x55, 0xc3, 0x10, 0xf1, 0x8c, 0x1d, 0x63, - 0x05, 0x26, 0xe4, 0x0f, 0x23, 0x19, 0x7a, 0xa5, 0xf9, 0xe9, 0xfd, 0x61, - 0x24, 0x46, 0xa2, 0x6b, 0x48, 0x5f, 0x41, 0x15, 0x25, 0x0b, 0x3c, 0x95, - 0xe7, 0x10, 0xeb, 0xcc, 0x6c, 0xfb, 0x99, 0x62, 0x81, 0x9d, 0x3a, 0x04, - 0x23, 0xe9, 0xeb, 0x46, 0x9e, 0xd3, 0x46, 0xaf, 0x75, 0xfe, 0x84, 0x09, - 0x24, 0xc3, 0x82, 0x5a, 0x80, 0x1c, 0xc4, 0x0e, 0x28, 0xc7, 0xc8, 0x2b, - 0x69, 0x8d, 0xed, 0xf2, 0x85, 0x5a, 0x2c, 0x42, 0x0d, 0xff, 0x56, 0x41, - 0x09, 0x62, 0xd7, 0x2d, 0x06, 0x48, 0xdd, 0x43, 0x48, 0x10, 0xf3, 0x73, - 0xb4, 0x80, 0x33, 0x7d, 0xd6, 0x3d, 0xdc, 0x32, 0x45, 0x7f, 0xee, 0x71, - 0x26, 0xf9, 0xb9, 0xa4, 0xba, 0xcc, 0xe5, 0x84, 0x52, 0xc9, 0x9b, 0xa7, - 0x8a, 0x33, 0x0e, 0xef, 0x20, 0xa8, 0xb3, 0x6a, 0xf7, 0x6a, 0xdd, 0x53, - 0x6a, 0xa6, 0xb5, 0xdf, 0xd8, 0x47, 0xa7, 0xa0, 0xbb, 0xd6, 0xd0, 0xbd, - 0x78, 0xa7, 0xbe, 0xd2, 0x86, 0x61, 0x75, 0xfe, 0xd5, 0x51, 0x29, 0x07, - 0x25, 0x0e, 0x27, 0xc7, 0x01, 0xcf, 0xdb, 0xe9, 0x97, 0xa5, 0x39, 0x32, - 0xe9, 0x41, 0x4a, 0x3d, 0xa5, 0xf8, 0x9c, 0x55, 0x39, 0xa3, 0xed, 0x8d, - 0xbb, 0x93, 0xb2, 0x84, 0xe2, 0x89, 0x59, 0xc2, 0x2e, 0x1b, 0x89, 0xa7, - 0x76, 0xb4, 0xb6, 0x66, 0xbb, 0x0f, 0x75, 0x5c, 0x63, 0x84, 0xab, 0x30, - 0x02, 0xa1, 0xce, 0xd1, 0xee, 0x54, 0x5c, 0xb4, 0x2d, 0x1a, 0xa4, 0x0f, - 0x8f, 0x13, 0x3e, 0x4d, 0x8b, 0xfc, 0x95, 0xa7, 0xea, 0xee, 0xc2, 0x1d, - 0x79, 0x60, 0x10, 0xaa, 0x65, 0x12, 0xb7, 0x99, 0x2f, 0x51, 0xc9, 0x55, - 0x9c, 0xd0, 0x6d, 0x87, 0xd4, 0x45, 0xfe, 0x7e, 0xe3, 0xb1, 0x20, 0x07, - 0xd2, 0xa9, 0xdf, 0xc7, 0x8d, 0xfe, 0x7b, 0x64, 0x09, 0x9f, 0xc3, 0x77, - 0xe2, 0xcc, 0x5d, 0x8a, 0x95, 0x65, 0xbd, 0x7b, 0x40, 0xd7, 0x2b, 0x45, - 0x5f, 0xda, 0x32, 0xd7, 0xb1, 0xdf, 0xb0, 0x14, 0x50, 0xf4, 0x47, 0xf0, - 0x8d, 0x6f, 0x5c, 0x18, 0xfd, 0x0e, 0xc4, 0x5f, 0xf9, 0xa3, 0x34, 0x93, - 0x2e, 0xab, 0xda, 0x5b, 0x53, 0x0b, 0x9e, 0x2d, 0x84, 0x10, 0xc0, 0x04, - 0x5f, 0x2c, 0xfc, 0xbf, 0x20, 0xe5, 0x74, 0x5d, 0x37, 0x61, 0x41, 0xf1, - 0x0a, 0x6b, 0xd1, 0x2d, 0xa8, 0xd8, 0xfa, 0x71, 0x8d, 0x71, 0x78, 0xa1, - 0x25, 0x0b, 0x2f, 0xa8, 0x38, 0x99, 0x67, 0xf3, 0x18, 0xf8, 0xd2, 0xf4, - 0xe2, 0x45, 0x8b, 0xf9, 0x21, 0x29, 0x6c, 0x95, 0x64, 0x79, 0xda, 0xa2, - 0x39, 0xfa, 0x82, 0x63, 0xdc, 0xb7, 0xe8, 0xe5, 0x97, 0x6e, 0x4c, 0x4f, - 0xb7, 0xd1, 0x44, 0x29, 0xf9, 0x39, 0x08, 0x4a, 0xf5, 0x9b, 0x8c, 0xb5, - 0x99, 0x64, 0x35, 0x74, 0xe3, 0x3d, 0x93, 0xb4, 0x4b, 0x41, 0xad, 0x09, - 0xd2, 0xa5, 0xac, 0x22, 0x55, 0x4a, 0x64, 0xf5, 0x06, 0x5b, 0x3a, 0x68, - 0x8a, 0x2a, 0xfc, 0x71, 0xb4, 0xab, 0x51, 0x60, 0x39, 0x33, 0x2f, 0x6a, - 0x18, 0xd8, 0x60, 0x5e, 0x4b, 0x56, 0x34, 0x35, 0xbf, 0x89, 0xe6, 0x87, - 0x95, 0xdc, 0xd1, 0x4f, 0x0d, 0xb5, 0x5c, 0x65, 0x33, 0xcf, 0x4e, 0x66, - 0x9f, 0x18, 0x26, 0x77, 0x1e, 0xbe, 0x35, 0x03, 0xe7, 0x8f, 0xd4, 0x5d, - 0x19, 0x6c, 0xe2, 0xaf, 0x03, 0xbd, 0xc0, 0x2d, 0x1d, 0x30, 0x21, 0x01, - 0x94, 0xd9, 0x35, 0xdf, 0x80, 0x84, 0xea, 0x23, 0xcc, 0xd2, 0xbc, 0xd6, - 0x68, 0x4c, 0xc2, 0xe9, 0xb6, 0xd8, 0x38, 0x20, 0x31, 0xdf, 0x2d, 0x7b, - 0x21, 0x97, 0xa5, 0xc0, 0xd2, 0x7a, 0x59, 0x8d, 0xa1, 0x85, 0x6b, 0x53, - 0x8e, 0x5e, 0x60, 0x10, 0xb5, 0xcc, 0xe5, 0x5e, 0xca, 0x3e, 0x82, 0x55, - 0x3b, 0x51, 0x7e, 0x23, 0x8e, 0x71, 0x97, 0x35, 0x72, 0x1c, 0x9a, 0x8f, - 0xf9, 0x5c, 0x32, 0x08, 0xfd, 0xeb, 0x99, 0x6c, 0xd3, 0x3d, 0x62, 0x7a, - 0x5f, 0x03, 0x54, 0x21, 0x08, 0xc5, 0x7f, 0x18, 0xbb, 0x32, 0x2b, 0xc5, - 0x8b, 0x50, 0xb0, 0x9c, 0x0b, 0x59, 0xee, 0x9a, 0xc3, 0xfd, 0xca, 0x59, - 0xb5, 0x45, 0x9f, 0xbc, 0x21, 0x24, 0xa9, 0xc9, 0xd4, 0x89, 0x36, 0x05, - 0xac, 0xa4, 0xd3, 0x88, 0x7b, 0x8c, 0x2d, 0x34, 0x17, 0xe3, 0x2d, 0xcb, - 0x6f, 0xb9, 0x60, 0x9f, 0x07, 0xbc, 0xcf, 0x1d, 0x97, 0x6c, 0x14, 0x59, - 0xbc, 0x7a, 0x25, 0x0c, 0xaa, 0x38, 0xe5, 0xf0, 0x5b, 0xd2, 0xdd, 0x89, - 0x6b, 0xf8, 0x7d, 0x3d, 0xb3, 0x10, 0x00, 0x3f, 0x3c, 0x3a, 0x81, 0xec, - 0xb1, 0x32, 0x4a, 0x32, 0x36, 0x4e, 0x95, 0x50, 0x1c, 0xcc, 0x8c, 0x71, - 0x16, 0xe0, 0xc8, 0xd7, 0x68, 0xea, 0x35, 0x34, 0x3d, 0x08, 0xd7, 0x9c, - 0x38, 0xcb, 0x84, 0xe0, 0x7d, 0xee, 0x5e, 0x67, 0x9b, 0x01, 0x11, 0x07, - 0xfe, 0x9e, 0x5e, 0xa6, 0xf1, 0x13, 0x44, 0x6a, 0x00, 0x21, 0xac, 0x85, - 0x40, 0x79, 0xfc, 0xa2, 0x90, 0xaf, 0x1c, 0x2b, 0x3d, 0xeb, 0x9f, 0xc2, - 0xd1, 0x72, 0xa4, 0xac, 0x5a, 0xb9, 0x5b, 0x50, 0x22, 0x19, 0xc2, 0x74, - 0x22, 0x3d, 0xdc, 0xe3, 0x4f, 0x90, 0x57, 0x19, 0x28, 0x10, 0x79, 0xf6, - 0xb5, 0xbc, 0xc9, 0x2d, 0x5c, 0x63, 0x39, 0xff, 0x4d, 0xd0, 0x10, 0xcc, - 0x09, 0xa8, 0xa4, 0x42, 0x7b, 0xa7, 0x36, 0x46, 0x90, 0xf0, 0xca, 0x3d, - 0x71, 0x8c, 0xa7, 0xa1, 0xe5, 0x9c, 0x0f, 0x8f, 0xfc, 0x3f, 0x78, 0x1a, - 0x74, 0xb8, 0xe8, 0x00, 0xbb, 0x9a, 0x35, 0x1f, 0xa4, 0x9c, 0x25, 0xdb, - 0x4a, 0x7d, 0x69, 0xf5, 0x92, 0xad, 0x16, 0x90, 0x59, 0xc9, 0x64, 0x24, - 0x35, 0x11, 0xf5, 0x13, 0x59, 0xd9, 0xb8, 0x60, 0x8e, 0xa6, 0xa8, 0x54, - 0x31, 0x47, 0xbf, 0x7c, 0xca, 0xe3, 0x58, 0x44, 0xd2, 0xba, 0x1f, 0x9c, - 0x7b, 0xd5, 0x9d, 0x5e, 0xbb, 0x37, 0xdb, 0xd5, 0x6c, 0x46, 0xb5, 0xfd, - 0xce, 0x5a, 0xa1, 0xf5, 0xf0, 0x68, 0x10, 0x5f, 0x55, 0x06, 0xd4, 0x84, - 0x6f, 0x67, 0x31, 0x0c, 0x86, 0xe5, 0xe6, 0x4b, 0x05, 0xe1, 0x15, 0x02, - 0xd8, 0x8b, 0x23, 0xf2, 0x66, 0x27, 0xc7, 0xb3, 0xc3, 0xea, 0x55, 0x9b, - 0x95, 0x8e, 0xe5, 0x57, 0x87, 0xf9, 0xb0, 0x18, 0xaa, 0xec, 0xe0, 0x97, - 0xde, 0x88, 0x08, 0x43, 0x8c, 0x6c, 0x62, 0xe2, 0xe9, 0x41, 0x8b, 0x56, - 0xfb, 0xaa, 0x4c, 0x84, 0x8c, 0xab, 0xdb, 0x13, 0x6a, 0x83, 0x31, 0x26, - 0x92, 0x26, 0x1c, 0xc1, 0x32, 0xbb, 0x38, 0x8f, 0x1f, 0x2a, 0xcd, 0x9e, - 0x7a, 0x9d, 0xc3, 0x48, 0xd0, 0x6a, 0x28, 0x56, 0xb6, 0x04, 0x3d, 0x7e, - 0x7c, 0x44, 0xc4, 0x87, 0x68, 0x14, 0xc4, 0x5f, 0x37, 0x69, 0xcd, 0x17, - 0xbc, 0x84, 0x03, 0xd0, 0x56, 0x94, 0x78, 0xeb, 0xe6, 0x0f, 0x7e, 0x6c, - 0x93, 0xb3, 0xde, 0x31, 0x52, 0x87, 0x36, 0xb2, 0x8c, 0xe8, 0xa8, 0x61, - 0x44, 0xb2, 0xe8, 0x54, 0x7b, 0xdd, 0x20, 0xd8, 0xd1, 0x61, 0x97, 0x0a, - 0x65, 0x3a, 0xbd, 0xc7, 0x07, 0x45, 0x83, 0x73, 0xdd, 0x31, 0xd8, 0x79, - 0xcf, 0x40, 0x65, 0x37, 0x8c, 0x68, 0xd4, 0x07, 0xc8, 0x8b, 0xf4, 0x67, - 0x87, 0xf0, 0xd5, 0x57, 0xf9, 0x95, 0x61, 0xd5, 0x11, 0x3b, 0x18, 0xc7, - 0x09, 0x96, 0xd3, 0x98, 0xd4, 0xd7, 0xf7, 0xec, 0x5c, 0x68, 0x93, 0x67, - 0x2e, 0xf4, 0x70, 0xf5, 0x7a, 0xc0, 0xe6, 0x1c, 0x9f, 0xe9, 0xca, 0xa9, - 0xe3, 0xf2, 0x34, 0xc7, 0xbe, 0xdf, 0xd5, 0x66, 0x71, 0x1c, 0xa7, 0x8b, - 0xb3, 0xee, 0x4c, 0x81, 0x87, 0x75, 0x58, 0x81, 0xa7, 0x1e, 0xab, 0xb2, - 0x77, 0x98, 0x74, 0xc1, 0x1f, 0xde, 0xec, 0xbc, 0xbb, 0xca, 0x01, 0x47, - 0x16, 0x4c, 0xd0, 0xab, 0x95, 0x05, 0xe4, 0x0e, 0xf1, 0x22, 0xc9, 0xe8, - 0x81, 0x9f, 0xb2, 0x92, 0x8e, 0x52, 0x39, 0x34, 0x1d, 0xba, 0xf6, 0x2a, - 0x0e, 0x6b, 0xe0, 0x56, 0x50, 0x97, 0x79, 0x94, 0x21, 0xff, 0xc2, 0xd5, - 0x7b, 0x42, 0x7d, 0x64, 0xa0, 0x56, 0xb2, 0x6f, 0xe1, 0xf0, 0xd8, 0xc7, - 0xe3, 0x06, 0xfe, 0x9a, 0xd6, 0x5b, 0xb1, 0x08, 0x0b, 0x83, 0x5d, 0x99, - 0xaa, 0x7e, 0xed, 0xd7, 0x03, 0xdf, 0x65, 0x5f, 0xa2, 0xa8, 0xcd, 0x6e, - 0x11, 0x91, 0xdf, 0x96, 0x68, 0x9e, 0x25, 0x53, 0x93, 0x27, 0xa5, 0x29, - 0x06, 0xab, 0x81, 0x01, 0xea, 0x24, 0x60, 0x9c, 0x5e, 0xfa, 0x96, 0x24, - 0x72, 0x0a, 0xcf, 0xc9, 0xb1, 0xd3, 0x01, 0x0a, 0xad, 0x99, 0x17, 0xc6, - 0x46, 0x18, 0x91, 0x00, 0x46, 0xc5, 0x2d, 0x1e, 0x91, 0x60, 0x4f, 0xc6, - 0xb2, 0x09, 0xb1, 0xc4, 0xf8, 0x84, 0x65, 0xcb, 0xe1, 0x42, 0xff, 0x5b, - 0xbd, 0x6a, 0x65, 0x1f, 0x1b, 0x16, 0x8b, 0xb1, 0xf1, 0x81, 0xc6, 0x05, - 0xc0, 0x2c, 0xae, 0xf9, 0xc9, 0xe5, 0xbf, 0x19, 0xb5, 0xe7, 0xfe, 0xec, - 0xe1, 0x3a, 0x9d, 0x47, 0x9f, 0x1d, 0x15, 0x6f, 0x95, 0x06, 0x49, 0x01, - 0x48, 0x80, 0xe6, 0x3f, 0xbc, 0x6d, 0x06, 0x42, 0xbe, 0xec, 0xac, 0x6a, - 0xa2, 0x06, 0x09, 0xf2, 0xaf, 0xba, 0x3c, 0xa5, 0xc6, 0x16, 0x90, 0x9c, - 0x9f, 0x99, 0x40, 0x16, 0x13, 0xc8, 0x56, 0x3b, 0x1c, 0x89, 0x0a, 0x98, - 0x4b, 0x26, 0xe9, 0xc4, 0xde, 0xeb, 0xb8, 0x68, 0x2e, 0x70, 0xfb, 0xc7, - 0x09, 0x08, 0x90, 0x38, 0x96, 0x89, 0x19, 0x60, 0xad, 0x92, 0x66, 0x82, - 0x32, 0x87, 0x5f, 0xc7, 0xd6, 0xcc, 0x05, 0xf9, 0x0a, 0xef, 0xec, 0xc9, - 0x23, 0x5f, 0x54, 0x87, 0x20, 0x33, 0x35, 0x9c, 0xa2, 0x04, 0xb3, 0x0d, - 0x9f, 0x12, 0xc0, 0x1c, 0xde, 0x62, 0x10, 0xbb, 0xb1, 0x5d, 0x0f, 0xe5, - 0x8a, 0xff, 0xec, 0x76, 0xf2, 0xa4, 0xc2, 0x1d, 0xc5, 0xde, 0xd0, 0x70, - 0xa7, 0x46, 0x04, 0x6a, 0xfa, 0x10, 0x58, 0x8e, 0x5a, 0x00, 0x52, 0xd8, - 0xb7, 0x36, 0xfe, 0x9d, 0x48, 0x5f, 0x83, 0x18, 0xd0, 0x5d, 0x6a, 0x35, - 0xbf, 0xfd, 0xd6, 0x78, 0xaf, 0xc8, 0x65, 0x50, 0x95, 0x0a, 0x8d, 0x54, - 0x76, 0x7e, 0xf2, 0x37, 0x5d, 0x64, 0x97, 0x38, 0x63, 0xba, 0x7b, 0x17, - 0xcc, 0xff, 0xab, 0x57, 0xda, 0x6e, 0x29, 0xd3, 0x53, 0xda, 0xa0, 0xe8, - 0x78, 0x68, 0x65, 0xf1, 0xd2, 0x9d, 0x5a, 0xbe, 0x49, 0x66, 0x09, 0xd3, - 0x3a, 0xb8, 0x24, 0x7b, 0x61, 0x02, 0x31, 0x41, 0x95, 0x81, 0x8a, 0xbb, - 0xe4, 0x0e, 0xbc, 0xe3, 0xfa, 0x10, 0xc8, 0x00, 0x5d, 0xb2, 0xf0, 0x68, - 0xaf, 0x04, 0x21, 0x9d, 0x84, 0x49, 0xde, 0xaa, 0x8e, 0x03, 0xe9, 0x07, - 0x21, 0xf8, 0x8f, 0xce, 0x4a, 0x7f, 0x2b, 0xd0, 0x95, 0x87, 0x56, 0x82, - 0x9c, 0x3d, 0x95, 0x67, 0x2d, 0x38, 0xd8, 0xc9, 0xe4, 0xad, 0xec, 0x74, - 0xcd, 0xa0, 0xa7, 0xa2, 0x3d, 0x69, 0x07, 0x97, 0x00, 0xd2, 0x6b, 0xb3, - 0x45, 0xe7, 0xb5, 0x25, 0xe6, 0x54, 0xb1, 0xab, 0xdb, 0x62, 0x4c, 0xff, - 0x76, 0x9a, 0x13, 0xef, 0x83, 0xcd, 0xf6, 0x97, 0xce, 0xa7, 0x6b, 0x15, - 0x19, 0xe7, 0x97, 0xdd, 0xa3, 0xf1, 0xd1, 0x9c, 0x91, 0x13, 0xe1, 0x1d, - 0xa5, 0xd0, 0x70, 0xae, 0xff, 0x2c, 0xd9, 0x03, 0x98, 0xab, 0x28, 0x89, - 0x0b, 0xda, 0x70, 0x9c, 0xb7, 0x37, 0xb0, 0x55, 0xd1, 0x98, 0x8a, 0x8e, - 0x55, 0xf9, 0x00, 0xed, 0x6a, 0xfb, 0xd9, 0x15, 0x97, 0x40, 0x13, 0x9a, - 0xb8, 0xf5, 0x53, 0x8b, 0x62, 0x85, 0xa8, 0xa4, 0xd6, 0x0f, 0x56, 0x82, - 0x83, 0x9f, 0x12, 0x35, 0x3f, 0xf1, 0xae, 0x7e, 0xca, 0x60, 0x1c, 0x3a, - 0x3a, 0x2d, 0x5f, 0xe9, 0xbc, 0xf1, 0x42, 0x89, 0x2e, 0x94, 0x78, 0x9b, - 0xdb, 0x0e, 0x83, 0xf3, 0x0b, 0xfd, 0x3b, 0xbd, 0xa3, 0x1c, 0x6f, 0x9a, - 0xab, 0x0f, 0x8b, 0x32, 0x9a, 0x8e, 0x76, 0xc3, 0xb1, 0x5c, 0x27, 0x4b, - 0xc5, 0x74, 0xeb, 0x35, 0x2e, 0x42, 0xc4, 0x76, 0xc2, 0xe5, 0x32, 0xb8, - 0x16, 0x75, 0xa8, 0x27, 0x14, 0x5e, 0x20, 0x7f, 0xf8, 0x50, 0xc3, 0x96, - 0x1d, 0xa1, 0x86, 0x37, 0x88, 0x9f, 0x5a, 0x66, 0xe8, 0xaf, 0xd4, 0xb9, - 0xb4, 0x02, 0xce, 0x61, 0x5c, 0x9c, 0x93, 0xbc, 0x23, 0x1b, 0xf2, 0x68, - 0xf3, 0xb5, 0x06, 0x70, 0xa8, 0x0b, 0x22, 0xd5, 0x9d, 0xe9, 0xe3, 0xeb, - 0x5d, 0x28, 0x98, 0xdc, 0x76, 0xd3, 0x1f, 0x54, 0xd0, 0xdf, 0x0e, 0x26, - 0xc9, 0xd1, 0xae, 0x35, 0x74, 0x4e, 0x84, 0xde, 0x8c, 0xad, 0x6a, 0xd6, - 0xb8, 0xee, 0x03, 0x46, 0xda, 0x08, 0x60, 0x70, 0x1d, 0x0d, 0x52, 0xe7, - 0xed, 0xbc, 0xf0, 0xa9, 0xb4, 0x0a, 0x0b, 0x38, 0xb6, 0xa7, 0xf1, 0xbf, - 0xef, 0x95, 0x84, 0x6b, 0x70, 0x52, 0x47, 0x71, 0x82, 0xc7, 0xad, 0x93, - 0xb3, 0x22, 0xcf, 0x11, 0x57, 0xae, 0x29, 0xf8, 0x82, 0x6b, 0xd0, 0xd2, - 0xe7, 0x16, 0x10, 0x0b, 0xc3, 0x41, 0xa9, 0xd3, 0xc9, 0x6e, 0x50, 0x48, - 0x29, 0x6c, 0x40, 0x4b, 0xf5, 0xe0, 0xaf, 0xf9, 0xfc, 0x30, 0x34, 0x70, - 0xd6, 0x34, 0x31, 0x52, 0xa7, 0x27, 0x6e, 0x4e, 0xd1, 0xff, 0x1d, 0xf6, - 0x44, 0x66, 0xcc, 0x1a, 0x4a, 0x10, 0x24, 0x49, 0x06, 0xbb, 0x00, 0x45, - 0xb6, 0x43, 0xff, 0x28, 0x37, 0xa9, 0x75, 0x8b, 0x4e, 0xe3, 0x89, 0x52, - 0x83, 0x95, 0xed, 0xf7, 0x3e, 0xcc, 0x74, 0x39, 0x6e, 0x8b, 0x9c, 0x15, - 0x46, 0x75, 0x90, 0x52, 0x13, 0x17, 0x23, 0x49, 0x94, 0x6f, 0x41, 0x1e, - 0xb2, 0x0e, 0x9c, 0x94, 0xd9, 0x16, 0xd8, 0x22, 0x29, 0x41, 0x22, 0x9b, - 0xd4, 0x86, 0x6e, 0x84, 0x6c, 0xf3, 0x03, 0x8f, 0x99, 0x98, 0xf3, 0x06, - 0xe0, 0x8e, 0x47, 0x16, 0x36, 0xa6, 0xac, 0xcf, 0xed, 0x59, 0x3b, 0xc5, - 0x17, 0x8e, 0x02, 0x1a, 0xa3, 0x90, 0x12, 0xca, 0xbb, 0x51, 0x47, 0xfc, - 0xe5, 0xb6, 0x26, 0x1d, 0x3f, 0xb2, 0x82, 0x82, 0xc3, 0x39, 0x40, 0x26, - 0xa5, 0x36, 0x29, 0x6b, 0x5b, 0x67, 0xf7, 0x96, 0x2d, 0x98, 0x0a, 0x4d, - 0x8c, 0x27, 0x66, 0x1a, 0x50, 0xd0, 0x9a, 0x05, 0xe8, 0x04, 0xa5, 0x2f, - 0xc7, 0x01, 0xe5, 0x90, 0x1d, 0xda, 0xc8, 0x41, 0x8a, 0x62, 0x34, 0x3e, - 0x4c, 0xe3, 0x0a, 0x16, 0x08, 0x42, 0x7e, 0x2c, 0x0c, 0x05, 0xd9, 0xe2, - 0xc0, 0x02, 0x74, 0x66, 0x69, 0x98, 0xc0, 0x20, 0xf9, 0xef, 0x98, 0x44, - 0x65, 0x54, 0x6f, 0x93, 0x0b, 0xcf, 0xc9, 0x8e, 0xde, 0x16, 0x99, 0x15, - 0x98, 0x43, 0xf3, 0x91, 0xd2, 0xe2, 0xeb, 0xc9, 0xa6, 0x49, 0x2a, 0xbc, - 0xaf, 0x4a, 0x4a, 0xcf, 0x88, 0x5c, 0x64, 0x42, 0xd2, 0x29, 0x43, 0x17, - 0xf2, 0x4b, 0x4b, 0xb4, 0x1c, 0x67, 0x4d, 0xd2, 0x3a, 0x18, 0xed, 0xe8, - 0x9e, 0x3b, 0x5f, 0x4f, 0x87, 0x1c, 0x34, 0x94, 0xa9, 0x00, 0x20, 0xa6, - 0xc5, 0x4a, 0x1f, 0x44, 0xf4, 0xd6, 0x0c, 0x3f, 0xcb, 0x3b, 0xcc, 0xeb, - 0xc0, 0x9d, 0x0b, 0x9c, 0x65, 0x55, 0x90, 0xbf, 0xce, 0xe1, 0xcc, 0xcd, - 0x75, 0x2d, 0x9d, 0x85, 0xc3, 0x92, 0x92, 0x43, 0x35, 0x7f, 0x51, 0xa2, - 0x47, 0x94, 0x43, 0xd3, 0x94, 0x25, 0x0b, 0x1a, 0x3a, 0xf4, 0xbd, 0xf0, - 0x43, 0x1d, 0xbe, 0x3b, 0xce, 0x66, 0xaf, 0x6b, 0xd6, 0x94, 0xea, 0x5a, - 0xce, 0x22, 0xf7, 0x7d, 0xb1, 0x36, 0x12, 0x93, 0xc8, 0x65, 0xf5, 0xd9, - 0xaa, 0x62, 0xab, 0xb0, 0xca, 0xc7, 0x6f, 0x40, 0x0f, 0x99, 0xf3, 0xf7, - 0x97, 0xfa, 0x46, 0xa5, 0xe7, 0x2a, 0xb1, 0xc3, 0x69, 0x4f, 0x6f, 0x45, - 0xc6, 0x1b, 0x0c, 0x61, 0xf8, 0xdc, 0x8b, 0x40, 0x88, 0x91, 0xb0, 0x76, - 0xf0, 0x30, 0x9a, 0x37, 0x30, 0x93, 0xb1, 0x67, 0x3d, 0x97, 0x52, 0x1e, - 0xa0, 0x40, 0xa4, 0x02, 0x1c, 0xf7, 0x9e, 0xf8, 0x94, 0x7a, 0x0e, 0xe4, - 0x96, 0xff, 0x0f, 0xb2, 0x5c, 0x59, 0x43, 0xbd, 0x37, 0xa7, 0xad, 0x24, - 0x30, 0xa0, 0x23, 0x9a, 0xbb, 0x38, 0x07, 0x5d, 0x42, 0xf3, 0x65, 0x52, - 0x37, 0x6e, 0x82, 0x81, 0x5d, 0x5f, 0x07, 0x0b, 0xad, 0xdc, 0x73, 0xe3, - 0x66, 0xd3, 0xe6, 0x66, 0x23, 0x98, 0xd4, 0xe3, 0xfc, 0xc0, 0xe6, 0xe6, - 0xb5, 0xe8, 0xfc, 0xb9, 0xe4, 0x01, 0xe4, 0x35, 0xf5, 0x6b, 0xd8, 0xad, - 0xea, 0xee, 0x0e, 0xfd, 0xd1, 0x7d, 0x92, 0xdd, 0x11, 0xbf, 0x89, 0x98, - 0xf0, 0x69, 0x7e, 0xda, 0xe5, 0xf8, 0xa5, 0x40, 0x4d, 0x90, 0xd7, 0x99, - 0xb4, 0x1e, 0x68, 0xee, 0xa0, 0xe0, 0x8b, 0xfb, 0x72, 0x2f, 0x80, 0xcc, - 0x87, 0x46, 0x81, 0xbd, 0x33, 0xd2, 0x44, 0x50, 0x69, 0xc8, 0x72, 0x3d, - 0x80, 0xf2, 0x41, 0xca, 0xd4, 0x5a, 0x63, 0x78, 0xa4, 0x6c, 0x74, 0xda, - 0xf2, 0x0f, 0xcc, 0x09, 0xc7, 0x46, 0xf3, 0x6c, 0x9e, 0x38, 0xea, 0xef, - 0xb4, 0xd9, 0x33, 0x76, 0x66, 0x8c, 0x61, 0x86, 0x83, 0x6e, 0x3a, 0x34, - 0xc6, 0x35, 0xc7, 0xa8, 0x8b, 0x68, 0x26, 0xe2, 0xa7, 0xe9, 0x47, 0xa4, - 0x98, 0xf8, 0xf3, 0x14, 0x2f, 0x5e, 0xbe, 0xb7, 0x76, 0x2a, 0xa7, 0xb8, - 0x7e, 0x36, 0x42, 0xa8, 0x35, 0x8f, 0x4d, 0xe5, 0xfb, 0x50, 0xca, 0xb2, - 0x19, 0x88, 0xd5, 0x79, 0x05, 0x75, 0x04, 0x49, 0xae, 0x82, 0x1a, 0xfd, - 0x8b, 0xf7, 0x64, 0x51, 0x99, 0x14, 0xa4, 0xa9, 0xc8, 0xaf, 0xf8, 0x1b, - 0xb4, 0x1d, 0x21, 0xaf, 0x9e, 0x04, 0xa4, 0x32, 0xba, 0xbf, 0x66, 0x14, - 0xe3, 0x3c, 0xd3, 0x82, 0xc8, 0x38, 0xf3, 0x2f, 0x66, 0x37, 0xb3, 0x9a, - 0x45, 0xef, 0x6a, 0x5e, 0x3c, 0x0a, 0x9b, 0x60, 0x0f, 0xf3, 0x5d, 0x69, - 0xff, 0x2f, 0xb2, 0x54, 0x14, 0x0d, 0x5c, 0x38, 0x7e, 0x8d, 0x85, 0xca, - 0xbb, 0xef, 0x03, 0x76, 0x0f, 0xfe, 0xda, 0x30, 0xd2, 0xdc, 0x1a, 0xec, - 0xef, 0x5a, 0x88, 0xcf, 0x00, 0x49, 0xb9, 0x1f, 0xcf, 0x8f, 0x15, 0xd2, - 0xc5, 0x4c, 0x24, 0x50, 0xf8, 0x82, 0xc1, 0x94, 0x93, 0xb7, 0xba, 0x89, - 0x46, 0xfd, 0x86, 0x36, 0x15, 0xcb, 0xb7, 0xbb, 0xef, 0xc3, 0x32, 0xba, - 0x47, 0x47, 0x2c, 0x24, 0xb6, 0xb4, 0xd8, 0xda, 0x70, 0x55, 0x77, 0x9d, - 0xff, 0xe4, 0xcd, 0x88, 0xd4, 0x21, 0xbb, 0x08, 0xd7, 0xce, 0x84, 0xf9, - 0x3d, 0x2e, 0xe1, 0xb7, 0x7f, 0x05, 0xdc, 0x07, 0x6b, 0x79, 0x40, 0x4f, - 0x36, 0xea, 0xfd, 0x76, 0x35, 0x90, 0xa9, 0x3f, 0xe1, 0x51, 0x6a, 0x5f, - 0xa6, 0xae, 0xf8, 0x6e, 0x5a, 0xcb, 0xe6, 0x8f, 0xb4, 0x3a, 0xdb, 0x31, - 0x10, 0x94, 0xf6, 0xb7, 0xc6, 0xc6, 0x60, 0x47, 0x95, 0xd2, 0x5d, 0xa2, - 0x5e, 0x15, 0x93, 0x11, 0x57, 0xde, 0xb4, 0x81, 0x07, 0x7e, 0xd1, 0x1f, - 0x76, 0xf2, 0x84, 0xd1, 0x65, 0xb5, 0x03, 0xfa, 0xf8, 0x7d, 0xf9, 0xf2, - 0xdc, 0xf7, 0x5b, 0xf3, 0xa3, 0x69, 0x78, 0x3b, 0x2d, 0x0d, 0xf1, 0x6f, - 0x81, 0xe8, 0x26, 0x6d, 0x8e, 0x77, 0xff, 0x35, 0xda, 0xe1, 0x3d, 0xb2, - 0x1f, 0xc0, 0x93, 0x83, 0x99, 0xd8, 0xc7, 0x7b, 0x86, 0x75, 0x1f, 0x37, - 0xe4, 0x20, 0x81, 0xc4, 0xf0, 0x44, 0x96, 0x3b, 0xbf, 0x7e, 0x36, 0x12, - 0xc2, 0x1c, 0xba, 0x18, 0x60, 0xed, 0x3a, 0xe2, 0xab, 0x04, 0x54, 0x17, - 0x5e, 0x69, 0x94, 0x0d, 0xcd, 0x4e, 0x31, 0xb6, 0x3a, 0x2d, 0x92, 0xae, - 0x63, 0x14, 0x42, 0x0c, 0xc8, 0x51, 0x87, 0x16, 0x70, 0xa1, 0xdb, 0x71, - 0xf4, 0x58, 0x28, 0xf3, 0x99, 0x53, 0xf3, 0xf0, 0x91, 0x50, 0x1c, 0xc2, - 0x26, 0x6b, 0x65, 0x53, 0xf5, 0xfb, 0x4f, 0x40, 0xf1, 0x23, 0x8f, 0xd7, - 0xc3, 0x1d, 0x7d, 0x1b, 0x0d, 0x46, 0x46, 0x52, 0xe3, 0x9f, 0xdd, 0xfc, - 0xe5, 0xb1, 0x9e, 0x63, 0x14, 0x4f, 0x29, 0xc4, 0x4e, 0x81, 0x5e, 0x05, - 0xd2, 0x41, 0x43, 0x91, 0x20, 0xed, 0x00, 0x59, 0x95, 0x8c, 0x49, 0x3c, - 0xc8, 0x9c, 0x06, 0xf9, 0xd6, 0x6f, 0x84, 0xcc, 0xcb, 0x91, 0xfc, 0x89, - 0xca, 0x97, 0x1d, 0x7d, 0xe2, 0xa9, 0xc2, 0x85, 0x7b, 0x4e, 0xdd, 0xd3, - 0xa7, 0x0f, 0x4b, 0x00, 0x3d, 0x44, 0xbb, 0xc2, 0x17, 0x06, 0xbd, 0x83, - 0x68, 0xfa, 0x0d, 0xe7, 0xfd, 0xff, 0x07, 0xbb, 0xe6, 0x96, 0xa6, 0xc0, - 0xfc, 0x09, 0x29, 0x46, 0x61, 0xe3, 0x4e, 0x0c, 0x41, 0xd3, 0x8a, 0x76, - 0x25, 0x2d, 0xdd, 0xe8, 0x63, 0x3d, 0x82, 0x12, 0x88, 0x99, 0x14, 0x47, - 0xea, 0x78, 0x88, 0x06, 0x27, 0x0c, 0x84, 0xe4, 0xd0, 0x8c, 0xee, 0xa9, - 0xd1, 0xe9, 0xe8, 0x59, 0x41, 0xd8, 0xca, 0x7a, 0x85, 0xfe, 0xe7, 0x49, - 0x52, 0xfa, 0xdd, 0xb9, 0x13, 0x2c, 0x10, 0xa2, 0xd8, 0x7d, 0x1a, 0xfb, - 0xda, 0x99, 0x7e, 0xee, 0xdd, 0x70, 0xe2, 0xbc, 0xdd, 0x52, 0x91, 0xea, - 0x7a, 0x1d, 0x49, 0xa3, 0x67, 0xe7, 0x51, 0xa6, 0x39, 0x06, 0x3e, 0x76, - 0xa9, 0xd1, 0x36, 0x6c, 0x9b, 0x7f, 0x81, 0x3f, 0x21, 0x8f, 0x3d, 0x4f, - 0xe1, 0x30, 0x6c, 0x5d, 0x7a, 0xba, 0x79, 0x09, 0x69, 0xb8, 0x44, 0x1b, - 0xc0, 0x73, 0xf4, 0x7e, 0x85, 0xb0, 0x2a, 0x7f, 0x4e, 0xcf, 0x61, 0x90, - 0x04, 0x07, 0xfa, 0x88, 0x2d, 0xfb, 0xb1, 0xb1, 0x46, 0xb5, 0x56, 0x0f, - 0xaa, 0x40, 0xb8, 0x4e, 0xb5, 0x29, 0x75, 0x00, 0x9b, 0x0c, 0xa5, 0x71, - 0x83, 0x3b, 0x3a, 0x19, 0x84, 0x1d, 0x7f, 0x2a, 0xdb, 0x5d, 0x72, 0x27, - 0x30, 0x0e, 0x72, 0x35, 0xc5, 0x1e, 0xa3, 0xe6, 0xd3, 0xe6, 0xa2, 0xdf, - 0x08, 0x51, 0xc7, 0x51, 0x73, 0x4e, 0xf8, 0x2d, 0xc5, 0xfc, 0x74, 0x86, - 0x56, 0xa7, 0x67, 0xbe, 0xb7, 0x6b, 0x08, 0x59, 0x71, 0x32, 0xed, 0x5a, - 0x34, 0x30, 0xdb, 0xbf, 0x97, 0xf1, 0x1d, 0xb7, 0x55, 0x18, 0xc1, 0x6c, - 0x88, 0xf9, 0x46, 0xf5, 0x53, 0x74, 0x55, 0x3f, 0xac, 0x89, 0x21, 0x59, - 0x75, 0xdc, 0xc8, 0x7c, 0x32, 0x0e, 0x7a, 0x28, 0x5c, 0x8e, 0xe6, 0x21, - 0x24, 0x2e, 0x33, 0xf6, 0xcf, 0x78, 0xec, 0xa5, 0xe2, 0x61, 0xe8, 0xef, - 0x16, 0x6d, 0x8b, 0x70, 0xdc, 0x25, 0x4f, 0x64, 0x23, 0x53, 0x30, 0x8d, - 0x2a, 0xbf, 0xd2, 0x02, 0x24, 0x3e, 0x1a, 0x02, 0x0a, 0xfd, 0x6e, 0x14, - 0xa8, 0xa2, 0x15, 0x6d, 0x75, 0x96, 0x07, 0xa8, 0xe4, 0x2a, 0x30, 0xd0, - 0x6b, 0x7f, 0xec, 0x1a, 0x52, 0xc1, 0xbb, 0x7f, 0x55, 0x65, 0x08, 0xc3, - 0x68, 0xbf, 0x62, 0x6b, 0xa3, 0x91, 0x48, 0x66, 0x8d, 0x8c, 0x60, 0xa3, - 0x85, 0x48, 0xbd, 0x6c, 0x2f, 0x2b, 0x4f, 0xfa, 0x81, 0xe6, 0x6d, 0x99, - 0x8e, 0xea, 0xb8, 0x63, 0x95, 0xd1, 0x20, 0x13, 0x19, 0xc1, 0x6d, 0x6d, - 0x9d, 0x00, 0xc3, 0xbc, 0xe7, 0x20, 0x40, 0x34, 0x82, 0x9b, 0x53, 0x38, - 0xb8, 0x7a, 0x16, 0x3f, 0x06, 0x95, 0xc1, 0x48, 0x42, 0x9e, 0x40, 0x26, - 0x3a, 0xe9, 0x3f, 0x30, 0x2a, 0x83, 0x2c, 0x25, 0x83, 0x86, 0xa8, 0x82, - 0x5e, 0x0a, 0x80, 0x97, 0xd4, 0xae, 0x27, 0x34, 0x1b, 0xf5, 0x5a, 0xd3, - 0xc6, 0x21, 0x57, 0x50, 0xac, 0x96, 0xc9, 0x32, 0x34, 0x51, 0x07, 0x41, - 0x06, 0xeb, 0x9b, 0x1f, 0x15, 0xbb, 0x60, 0x67, 0x56, 0x22, 0x40, 0xdb, - 0xcf, 0x70, 0xf2, 0xe0, 0x7f, 0x20, 0x16, 0xff, 0x14, 0xfc, 0x45, 0x51, - 0xb2, 0xe2, 0x7c, 0x33, 0x83, 0xae, 0x5c, 0x2a, 0xef, 0xe8, 0x8d, 0x9d, - 0xc2, 0x0d, 0xd4, 0x61, 0x71, 0x4b, 0x52, 0x6e, 0x03, 0x23, 0xfb, 0xf8, - 0xfe, 0xb3, 0x8d, 0x06, 0x6e, 0x8e, 0x7d, 0x83, 0x90, 0x35, 0x77, 0xec, - 0xe1, 0xdb, 0xeb, 0xb9, 0x36, 0x22, 0x3d, 0xc6, 0x2f, 0x82, 0xb8, 0xc0, - 0x91, 0x61, 0x1c, 0x48, 0x43, 0x0a, 0xe9, 0x65, 0x53, 0x74, 0x1d, 0x0f, - 0x38, 0x24, 0x2b, 0x3f, 0xb2, 0xd1, 0x25, 0x18, 0xe8, 0xfd, 0xf0, 0xcb, - 0x44, 0xfb, 0xa2, 0x0f, 0x2a, 0x66, 0xb2, 0x71, 0x73, 0x37, 0x6a, 0xe5, - 0xb8, 0x3e, 0x2b, 0xad, 0xcf, 0x8f, 0x6a, 0xfc, 0x30, 0xf6, 0x49, 0x0d, - 0x57, 0xbb, 0xb2, 0x65, 0x63, 0x1b, 0xc4, 0xd1, 0xea, 0xb1, 0x2e, 0x26, - 0xe8, 0xe4, 0xb5, 0x66, 0x40, 0x35, 0xc9, 0xef, 0x54, 0xd9, 0x10, 0x46, - 0x74, 0x6d, 0xcd, 0x4c, 0x5d, 0x4c, 0x04, 0x20, 0xe3, 0xa4, 0x70, 0x14, - 0xb3, 0x27, 0x32, 0xb5, 0x26, 0x14, 0x01, 0x71, 0xf4, 0x7e, 0x20, 0x9e, - 0xd9, 0x35, 0x09, 0x01, 0xf0, 0xd8, 0x26, 0x6f, 0xc3, 0x8f, 0xe3, 0xff, - 0xc8, 0x47, 0x7a, 0x13, 0xf1, 0x25, 0x83, 0x05, 0x71, 0x81, 0x9d, 0x76, - 0x3b, 0x78, 0x6f, 0x22, 0x63, 0xc6, 0x9c, 0x91, 0x5e, 0xc6, 0xdc, 0xd2, - 0xba, 0x6e, 0x1a, 0x39, 0xd3, 0x55, 0x7e, 0x55, 0x63, 0x66, 0xf5, 0x08, - 0x30, 0xa5, 0x15, 0x9b, 0x0b, 0x40, 0xd2, 0x42, 0x17, 0xd9, 0x69, 0x17, - 0x76, 0x34, 0xb6, 0xcf, 0x4a, 0x4d, 0x41, 0xba, 0x23, 0x3c, 0x62, 0x00, - 0x4d, 0x3a, 0xf0, 0x18, 0xa0, 0x5a, 0x6e, 0x61, 0x3d, 0x54, 0x3c, 0xfc, - 0x30, 0x59, 0x1d, 0x8d, 0x91, 0xad, 0x41, 0xe6, 0xce, 0x78, 0xee, 0x61, - 0x40, 0x7c, 0xfa, 0xe9, 0x00, 0xe7, 0xdb, 0x44, 0xa0, 0x8a, 0x74, 0xc1, - 0x44, 0xd7, 0x8e, 0x35, 0x29, 0xc2, 0xbe, 0xf4, 0xc0, 0xd1, 0x46, 0xce, - 0x4a, 0xbf, 0x36, 0x76, 0x6b, 0x9f, 0xe6, 0x96, 0x67, 0x0b, 0x27, 0x03, - 0x34, 0xd3, 0x6c, 0x1b, 0xd5, 0x45, 0xfd, 0x00, 0xc7, 0xc8, 0x8c, 0xaa, - 0x62, 0x13, 0xc5, 0xbd, 0x4b, 0xe3, 0x77, 0x03, 0x65, 0xcc, 0x85, 0xab, - 0xd1, 0x8f, 0x81, 0x27, 0x4f, 0xeb, 0x3d, 0xcd, 0xe5, 0x46, 0xb9, 0xc0, - 0x0e, 0x08, 0xde, 0x84, 0x14, 0x91, 0x41, 0xba, 0xaf, 0x0c, 0x44, 0x3b, - 0xff, 0xe6, 0xb7, 0x4a, 0xee, 0x57, 0xda, 0xd4, 0x18, 0xd2, 0xb7, 0x1c, - 0x4c, 0x5e, 0x3a, 0xee, 0xcb, 0xda, 0x02, 0x01, 0x36, 0xde, 0xbf, 0x41, - 0xa0, 0xd8, 0x11, 0x83, 0xe4, 0x8c, 0x45, 0xc0, 0x5c, 0x50, 0x6e, 0x3e, - 0x06, 0x36, 0x6f, 0x2c, 0x1a, 0x20, 0x00, 0x71, 0x9d, 0x4c, 0x3f, 0xb2, - 0xc0, 0xed, 0xc4, 0xd9, 0x92, 0xdc, 0x1f, 0x79, 0x1d, 0x80, 0xbc, 0x2f, - 0x3d, 0x59, 0xe7, 0xb5, 0xf0, 0x7e, 0xbe, 0x8c, 0xd1, 0x8f, 0x9a, 0xf8, - 0x06, 0x10, 0x25, 0x19, 0xc0, 0x88, 0xd9, 0x17, 0xa9, 0x2b, 0xc4, 0x82, - 0x27, 0x9c, 0x9d, 0x41, 0xee, 0x26, 0xea, 0x2b, 0x11, 0x3a, 0xad, 0x9d, - 0xa0, 0x84, 0x2a, 0x77, 0x58, 0xb9, 0xe7, 0x28, 0x3d, 0x92, 0x9c, 0x23, - 0xdc, 0xf8, 0x5d, 0x32, 0xcf, 0x45, 0x96, 0x89, 0x28, 0x66, 0x9d, 0xed, - 0xba, 0xdd, 0xfe, 0xcb, 0xb0, 0x84, 0x14, 0x25, 0xb5, 0xe7, 0x5c, 0x79, - 0xa3, 0x80, 0x57, 0x0a, 0xbb, 0x65, 0x7f, 0x5d, 0x43, 0xf2, 0xc1, 0x4d, - 0x9b, 0x09, 0x80, 0xb1, 0x94, 0xe1, 0x89, 0x78, 0xe7, 0x98, 0x07, 0x03, - 0x60, 0x95, 0x2b, 0xe6, 0xfe, 0xb9, 0x77, 0x02, 0x4c, 0x8e, 0x43, 0x40, - 0x7e, 0x1a, 0xbf, 0xfb, 0x84, 0x5d, 0xf4, 0xbe, 0x06, 0xad, 0x93, 0x23, - 0x93, 0xbc, 0x39, 0x66, 0xcd, 0xbf, 0x9a, 0x5b, 0xe4, 0x2f, 0x2e, 0x74, - 0xd3, 0xf9, 0xe6, 0x46, 0xe1, 0x8b, 0xa6, 0x7f, 0x43, 0x74, 0x82, 0x4b, - 0xb8, 0x57, 0x64, 0xd3, 0xc8, 0x17, 0xf3, 0x3f, 0x20, 0xd6, 0x94, 0xec, - 0x42, 0x31, 0x4d, 0xb3, 0x76, 0x95, 0x9e, 0x86, 0x6b, 0x8e, 0xba, 0x03, - 0x23, 0x7e, 0x46, 0x39, 0x7f, 0x46, 0x94, 0x8c, 0x5f, 0x6e, 0x81, 0xa8, - 0x09, 0x08, 0x5e, 0x45, 0x57, 0x3e, 0x3e, 0x01, 0xfa, 0x5b, 0x0c, 0x43, - 0x75, 0x8b, 0x7c, 0x01, 0xe7, 0xb4, 0x80, 0x87, 0x5b, 0x52, 0xd8, 0xac, - 0xfc, 0x9c, 0xc3, 0x49, 0x74, 0xdb, 0x0e, 0xfa, 0x50, 0xa5, 0xd2, 0x0f, - 0x08, 0x6f, 0x3a, 0x70, 0x9c, 0xdf, 0x11, 0xa4, 0x55, 0xff, 0x24, 0xcf, - 0x1a, 0x60, 0x20, 0x78, 0x4e, 0x89, 0xc2, 0x44, 0x8b, 0xab, 0x32, 0xee, - 0xa8, 0x48, 0x31, 0xaf, 0x58, 0xf7, 0xdb, 0x05, 0x58, 0xf7, 0x9d, 0x80, - 0xd9, 0x03, 0xfc, 0x30, 0xd7, 0xe8, 0x7b, 0x8d, 0xb8, 0x55, 0x0e, 0x10, - 0x2a, 0xa3, 0x32, 0xb9, 0x98, 0x90, 0x80, 0xc6, 0xa3, 0xf0, 0xfc, 0xd4, - 0xdf, 0xcf, 0x93, 0x1e, 0x78, 0x77, 0xf0, 0x38, 0x55, 0xdb, 0xd0, 0xab, - 0xf3, 0x3f, 0xa8, 0xee, 0xf0, 0x7a, 0xc6, 0x81, 0x96, 0x8a, 0x92, 0x30, - 0xdc, 0xc0, 0x3e, 0x65, 0xed, 0x2b, 0xd6, 0x41, 0x15, 0x1c, 0x01, 0x9e, - 0x10, 0x15, 0xfd, 0x8c, 0xbf, 0xf9, 0xdd, 0xc5, 0x1f, 0x8e, 0x69, 0x54, - 0xd0, 0x04, 0x85, 0x54, 0xaf, 0x1d, 0x69, 0x65, 0xc8, 0x92, 0xe7, 0x91, - 0x75, 0x60, 0x17, 0xad, 0x56, 0xb7, 0x3a, 0xf6, 0x6e, 0xb5, 0xba, 0xce, - 0x12, 0x36, 0xd7, 0xe0, 0x93, 0x02, 0x0b, 0x3c, 0xc5, 0xe0, 0x69, 0x45, - 0xd3, 0x64, 0x06, 0x9e, 0x56, 0xc7, 0x2c, 0x36, 0x47, 0x5b, 0xb6, 0x28, - 0x8c, 0x58, 0x24, 0xee, 0x24, 0x26, 0xc9, 0xca, 0x68, 0x5e, 0xc2, 0x77, - 0xd3, 0x60, 0x72, 0xf4, 0x80, 0x1a, 0x1d, 0x3f, 0x24, 0x2b, 0xe9, 0xde, - 0x52, 0xe0, 0xe9, 0x1e, 0xa4, 0xdc, 0x97, 0x4c, 0x3f, 0x91, 0x7a, 0x30, - 0xb4, 0x1e, 0x99, 0x42, 0xa1, 0x81, 0x59, 0x2e, 0xb4, 0x6c, 0x25, 0x02, - 0x1c, 0xd6, 0x60, 0x74, 0x08, 0x56, 0xba, 0x53, 0x9a, 0x0f, 0xd4, 0x50, - 0x2a, 0xe4, 0x92, 0xc7, 0x66, 0x73, 0x7b, 0x07, 0x90, 0xff, 0x75, 0x4c, - 0xa0, 0xaa, 0xf7, 0xaf, 0x4e, 0xa0, 0x8d, 0xa9, 0x18, 0x38, 0xcd, 0x5e, - 0x37, 0x9e, 0x07, 0xd4, 0xaf, 0x86, 0xd3, 0x2d, 0xb2, 0xad, 0x37, 0x95, - 0x77, 0xd8, 0x43, 0xc5, 0x1f, 0x72, 0xc1, 0x5a, 0xa5, 0x74, 0x7d, 0x0d, - 0x92, 0x73, 0xb5, 0x31, 0x89, 0x38, 0x85, 0xf2, 0x6c, 0x7d, 0xe2, 0xf2, - 0x42, 0x1c, 0xa6, 0xea, 0xcb, 0x3f, 0xf4, 0xbd, 0x6a, 0x9a, 0x1e, 0x86, - 0x16, 0x8a, 0xe1, 0x29, 0x14, 0x92, 0xc9, 0x34, 0x75, 0xa3, 0x36, 0x64, - 0x64, 0x62, 0x36, 0x59, 0x9a, 0xb2, 0xd2, 0x5e, 0xa4, 0xd1, 0x2e, 0xd7, - 0xf2, 0x71, 0x6a, 0x49, 0xed, 0x5d, 0x2a, 0xe4, 0x14, 0x4b, 0x05, 0x2b, - 0x53, 0x61, 0x0e, 0x9c, 0x20, 0x91, 0xbb, 0xb2, 0x01, 0x19, 0xf2, 0x7f, - 0xde, 0x0a, 0x23, 0x1f, 0x65, 0xac, 0x90, 0xf7, 0xb5, 0x47, 0xe5, 0x24, - 0xfe, 0xb6, 0xbe, 0xd4, 0xa9, 0x54, 0x20, 0xa8, 0x56, 0xc5, 0x09, 0x0c, - 0x8e, 0x92, 0x93, 0xcb, 0xcc, 0x68, 0xdc, 0xe8, 0x62, 0xfa, 0xd0, 0x3e, - 0x48, 0x0d, 0xf5, 0x8a, 0x97, 0x63, 0xb2, 0xe5, 0x11, 0x11, 0x15, 0x64, - 0xf9, 0x6d, 0x15, 0xbe, 0x2b, 0xbf, 0x9e, 0x30, 0x2e, 0xa7, 0xe2, 0xa4, - 0x04, 0xc2, 0xa3, 0xf7, 0x3b, 0x11, 0x94, 0xd5, 0xd1, 0x57, 0xce, 0x34, - 0x4b, 0xd9, 0x42, 0x98, 0x28, 0x37, 0x7c, 0xa0, 0x1b, 0xf0, 0xc2, 0x9b, - 0xbd, 0xa4, 0xd2, 0x3d, 0x52, 0x7d, 0x4b, 0xd1, 0x82, 0x0b, 0x92, 0x9a, - 0x44, 0x2e, 0x7c, 0xeb, 0x18, 0x48, 0x61, 0xd8, 0xb2, 0x80, 0xbe, 0xfc, - 0x1a, 0xaa, 0xe3, 0x3d, 0xd9, 0x9a, 0xd9, 0x0f, 0x53, 0xb2, 0xf8, 0xe5, - 0xa2, 0x61, 0xb8, 0xe3, 0xa5, 0x10, 0x4f, 0xc6, 0xe1, 0x9a, 0x07, 0xa1, - 0x3f, 0x2f, 0x61, 0x95, 0x74, 0x39, 0xcd, 0xd7, 0x9d, 0xd7, 0x44, 0x7a, - 0xbc, 0xc0, 0xb3, 0x04, 0x51, 0xb9, 0x24, 0x46, 0x88, 0xd6, 0xad, 0xb5, - 0x3b, 0x9a, 0xb1, 0x70, 0x3a, 0x16, 0x0c, 0x93, 0x35, 0xf8, 0x8d, 0x99, - 0xbd, 0x24, 0x89, 0x48, 0x2f, 0x6d, 0x5d, 0x56, 0x99, 0xd2, 0x2f, 0xf2, - 0x51, 0xd0, 0x32, 0x31, 0x82, 0xc4, 0x11, 0xd3, 0x19, 0x58, 0xf5, 0x64, - 0xa7, 0x57, 0xb7, 0x95, 0xd9, 0x44, 0xb2, 0xf6, 0x41, 0x51, 0x9f, 0x5c, - 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, 0x05, 0x7a, 0x9c, 0x72, - 0x58, 0xea, 0x21, 0xbf, 0x18, 0xe2, 0x09, 0x6c, 0x05, 0x61, 0x85, 0xc0, - 0xce, 0x48, 0x32, 0x31, 0xce, 0x40, 0x61, 0xf3, 0x02, 0xdd, 0x46, 0x47, - 0x4b, 0xe3, 0x19, 0x39, 0x5b, 0x4c, 0x54, 0x7b, 0x73, 0x3d, 0xb9, 0x6f, - 0xdf, 0xdb, 0xe2, 0x94, 0x3f, 0x9e, 0x99, 0xf9, 0x9e, 0x2e, 0x6d, 0x32, - 0x8f, 0xec, 0x58, 0x34, 0xf3, 0xfe, 0x52, 0x43, 0xcc, 0x10, 0xb9, 0x9c, - 0xaa, 0x85, 0x31, 0x60, 0x80, 0xcf, 0xe3, 0x47, 0x3d, 0x18, 0x0e, 0xf9, - 0x49, 0x7d, 0xa8, 0x7f, 0x92, 0xeb, 0x42, 0x72, 0x0a, 0x39, 0xbe, 0x9d, - 0x14, 0x9d, 0x56, 0x79, 0x93, 0x0c, 0x16, 0x7d, 0xce, 0x58, 0xaa, 0xb5, - 0x61, 0x7e, 0x11, 0xe1, 0xf3, 0xa2, 0xdb, 0x51, 0xce, 0x1d, 0x03, 0x36, - 0xec, 0x43, 0xc8, 0x45, 0x76, 0xa1, 0x7f, 0x40, 0x92, 0x12, 0x0b, 0x9d, - 0xd6, 0x62, 0xee, 0x8e, 0x80, 0x9d, 0xba, 0x22, 0xa3, 0x04, 0x2b, 0x51, - 0x92, 0xa0, 0x3f, 0x6d, 0xdb, 0x16, 0x3c, 0x99, 0x90, 0x41, 0x0c, 0x83, - 0xb2, 0xd5, 0x13, 0x0b, 0xf2, 0xb6, 0x57, 0x96, 0x0b, 0x0d, 0xbc, 0x8a, - 0xad, 0xdd, 0x6f, 0x46, 0xbf, 0xba, 0xfc, 0xb5, 0x28, 0x0b, 0xe8, 0x8f, - 0xfe, 0x82, 0xb2, 0xbf, 0x73, 0xd5, 0xfb, 0xe5, 0x11, 0xbc, 0xca, 0xdf, - 0xfc, 0x67, 0x64, 0xaa, 0xc3, 0xc7, 0xba, 0x98, 0xe4, 0x64, 0x12, 0x58, - 0xbc, 0x0b, 0x0b, 0x33, 0xe1, 0xde, 0x13, 0x0b, 0xb9, 0x40, 0xaa, 0x41, - 0x9e, 0x30, 0xb3, 0xb3, 0xa0, 0x13, 0x80, 0x3c, 0x8e, 0xf3, 0x3c, 0xd0, - 0xe7, 0xcb, 0x2f, 0x3d, 0xe3, 0x58, 0x3d, 0xbd, 0xa5, 0x7a, 0x40, 0xe1, - 0x89, 0xc2, 0xdd, 0xe0, 0x2a, 0x16, 0xf3, 0x99, 0x99, 0x6b, 0xf4, 0x2d, - 0xf1, 0x81, 0x66, 0xb9, 0xc7, 0x13, 0xe7, 0x2f, 0xf0, 0xea, 0xb3, 0x11, - 0x60, 0xd2, 0xc2, 0xef, 0xfc, 0x5c, 0x61, 0xda, 0xa5, 0xa8, 0x3d, 0x40, - 0xb8, 0x03, 0x35, 0x1f, 0x74, 0x9b, 0x56, 0xd6, 0x6d, 0xb8, 0x3b, 0xf6, - 0x46, 0xbb, 0xd3, 0x07, 0x51, 0x65, 0x98, 0x7d, 0x33, 0x50, 0xd7, 0x23, - 0x10, 0x35, 0xd5, 0xe4, 0x79, 0x01, 0xe1, 0x91, 0xe3, 0x91, 0x46, 0xd8, - 0xbf, 0x9b, 0x19, 0x3c, 0x70, 0xa7, 0x05, 0x5a, 0xec, 0x3b, 0x83, 0xdb, - 0x15, 0x39, 0xbd, 0x3f, 0x21, 0xa7, 0xf2, 0x38, 0xc8, 0x7a, 0xbb, 0x7d, - 0x68, 0x2d, 0xe7, 0x42, 0x1d, 0x29, 0x66, 0xee, 0x49, 0xf1, 0x0a, 0xc1, - 0xb3, 0x6b, 0xf4, 0x1e, 0x19, 0x82, 0xa0, 0xd4, 0x1a, 0xd3, 0x15, 0x4b, - 0x0f, 0xf1, 0x72, 0x3a, 0x8f, 0x04, 0x1a, 0xf8, 0x5b, 0x6f, 0x19, 0x49, - 0x2a, 0x8d, 0x32, 0x24, 0x26, 0xf3, 0x86, 0xab, 0xb7, 0xc6, 0x64, 0xc3, - 0x09, 0x9b, 0x06, 0xdd, 0x2f, 0xf0, 0x79, 0xf6, 0xac, 0x07, 0x42, 0x7c, - 0x15, 0x36, 0x1a, 0xd7, 0x17, 0xb4, 0x29, 0xca, 0x51, 0xc9, 0x20, 0xed, - 0x48, 0xcd, 0x0b, 0x1c, 0x94, 0xab, 0xa2, 0xef, 0xf8, 0xb4, 0xff, 0xb2, - 0xcf, 0xce, 0x3d, 0x52, 0x97, 0x80, 0x9e, 0x68, 0xa6, 0x58, 0x22, 0x28, - 0x99, 0xae, 0x21, 0x59, 0x59, 0xd7, 0x82, 0xc6, 0x47, 0x3f, 0x54, 0xf8, - 0xf5, 0x65, 0xf2, 0xb3, 0xe6, 0x10, 0x28, 0x73, 0x40, 0x19, 0x07, 0x29, - 0x8e, 0xba, 0x24, 0xed, 0x8f, 0x06, 0x7c, 0x24, 0xfa, 0x0a, 0xc4, 0x87, - 0x87, 0xce, 0x1b, 0x6f, 0x2a, 0x4c, 0xcf, 0xbe, 0x08, 0x70, 0xc7, 0x36, - 0x82, 0x0c, 0x99, 0x3f, 0x73, 0xd0, 0x85, 0xe0, 0x88, 0x6d, 0xf1, 0x73, - 0xf9, 0x9c, 0x41, 0x51, 0xf8, 0x52, 0x46, 0x05, 0x59, 0x93, 0x5e, 0xd2, - 0x2a, 0x31, 0x5e, 0x41, 0xf8, 0x52, 0x0d, 0x4e, 0x04, 0x7e, 0xf3, 0xb2, - 0xcd, 0x70, 0x94, 0x46, 0x28, 0x23, 0x14, 0x47, 0xce, 0x86, 0xa8, 0x9f, - 0x7a, 0x04, 0x45, 0xa8, 0xd5, 0x62, 0xa7, 0x0f, 0xdc, 0x73, 0xe1, 0xa3, - 0x40, 0x93, 0xfa, 0x95, 0x01, 0x5f, 0x3e, 0xa2, 0x7a, 0x79, 0x97, 0x06, - 0xb7, 0x1f, 0x43, 0xb3, 0x5d, 0xee, 0x30, 0x43, 0x16, 0x9e, 0x26, 0xee, - 0xbf, 0x44, 0x38, 0xd8, 0xb0, 0x81, 0x76, 0x48, 0x22, 0x09, 0xcd, 0x47, - 0x53, 0x71, 0x99, 0xd5, 0x34, 0xcf, 0xa8, 0xee, 0x5d, 0x45, 0x3f, 0xe2, - 0x32, 0x31, 0x90, 0xea, 0xc7, 0x0f, 0x38, 0xb6, 0xc2, 0x3a, 0xf2, 0x26, - 0x7b, 0x46, 0xa8, 0x03, 0xc5, 0x9c, 0xe3, 0x27, 0xb8, 0x1e, 0x5d, 0x2c, - 0x88, 0x0c, 0x07, 0x64, 0x37, 0x72, 0xf6, 0xe2, 0x35, 0xd3, 0x13, 0xa2, - 0xc7, 0x65, 0xaa, 0x60, 0xf1, 0xd9, 0x7c, 0xaf, 0xf4, 0x47, 0x11, 0x24, - 0xad, 0x99, 0x4f, 0xaf, 0x90, 0x6d, 0x8c, 0x21, 0x46, 0xfe, 0xd0, 0xc6, - 0xa8, 0x7f, 0x37, 0x59, 0x73, 0xbc, 0xa4, 0x84, 0xe3, 0x90, 0xb3, 0x3b, - 0x30, 0x6e, 0x14, 0xbb, 0x2f, 0x51, 0x32, 0xbc, 0x87, 0xd6, 0x94, 0x57, - 0x2c, 0x91, 0x40, 0x28, 0xc5, 0xea, 0x01, 0xac, 0x63, 0x96, 0xec, 0xf7, - 0xa7, 0x23, 0x2f, 0x71, 0xce, 0x3c, 0x7c, 0xe3, 0x0c, 0x13, 0x1a, 0x8b, - 0x42, 0xb6, 0x77, 0x45, 0x4e, 0x26, 0x81, 0x6b, 0x22, 0x39, 0xfd, 0x25, - 0x50, 0xaf, 0x26, 0x97, 0x59, 0x1d, 0xe0, 0xd0, 0xa0, 0x2b, 0x83, 0x57, - 0x33, 0x4a, 0x66, 0x99, 0x8e, 0x8f, 0x93, 0x73, 0x25, 0xea, 0x72, 0x7f, - 0x80, 0xf2, 0x45, 0x32, 0xdf, 0x85, 0x7a, 0xb1, 0x66, 0x85, 0x5a, 0x63, - 0xa6, 0xf0, 0x57, 0x67, 0xe9, 0x69, 0xe3, 0x57, 0xff, 0xba, 0x92, 0x9c, - 0xd6, 0xa8, 0xbb, 0xc8, 0xc8, 0xfb, 0x24, 0x92, 0x2e, 0xdc, 0x0e, 0xe5, - 0x48, 0xdc, 0x50, 0x1b, 0x05, 0x99, 0xd2, 0x8e, 0xc4, 0xc9, 0x11, 0x88, - 0xee, 0xf8, 0x41, 0x58, 0x78, 0xd2, 0x51, 0x09, 0x6d, 0x8a, 0x07, 0x52, - 0x5d, 0x8a, 0x4c, 0xb5, 0x9c, 0x35, 0x4c, 0x0e, 0x20, 0x6f, 0xbc, 0x10, - 0xde, 0xcf, 0xe3, 0xfe, 0x8c, 0x35, 0x1e, 0x56, 0xae, 0x1b, 0x2c, 0xec, - 0x32, 0xa2, 0x60, 0x6f, 0xbe, 0xe3, 0xf2, 0x70, 0xca, 0x9e, 0x78, 0xf3, - 0xe0, 0xd0, 0x9b, 0xee, 0x15, 0x0c, 0xe2, 0xbe, 0x6c, 0x70, 0xd0, 0xef, - 0x1a, 0xad, 0x00, 0xb7, 0xcc, 0x32, 0xd4, 0xfa, 0x42, 0x40, 0x15, 0x38, - 0xd4, 0xb6, 0x64, 0xca, 0x7a, 0x39, 0x67, 0x8a, 0x02, 0x48, 0x74, 0x72, - 0xe5, 0x1c, 0x6a, 0xa2, 0xd2, 0xd7, 0x71, 0xd6, 0xe7, 0xe8, 0x19, 0x95, - 0xad, 0xd8, 0x63, 0x6a, 0x95, 0xb7, 0x24, 0x93, 0x0d, 0xb7, 0xed, 0x58, - 0xd9, 0x4e, 0xf3, 0x1e, 0xe4, 0x97, 0x14, 0x39, 0x42, 0x84, 0x55, 0xde, - 0xef, 0xf5, 0x0f, 0xf6, 0x4c, 0xa5, 0x19, 0x09, 0xa6, 0x20, 0xc1, 0x17, - 0x79, 0xb5, 0x5f, 0xa7, 0x98, 0x2a, 0xcf, 0x5c, 0x09, 0x1e, 0x3f, 0x66, - 0x41, 0x50, 0x9e, 0x9c, 0xda, 0xe5, 0x61, 0x35, 0x22, 0xf5, 0x3d, 0x6d, - 0xca, 0xf8, 0xad, 0x57, 0x60, 0xde, 0x86, 0xc4, 0x02, 0x9a, 0x2a, 0x91, - 0x68, 0x7c, 0xe5, 0x7b, 0xa4, 0x8e, 0xfb, 0xb3, 0x64, 0x64, 0x1e, 0x88, - 0xd4, 0xc4, 0x93, 0xf8, 0x8b, 0x9f, 0x2c, 0xdf, 0xad, 0x88, 0xb7, 0x7f, - 0xcc, 0x18, 0xa0, 0x9c, 0x92, 0xc7, 0x0b, 0x71, 0xfe, 0x2f, 0xfe, 0xc8, - 0xe6, 0x3c, 0x98, 0x64, 0x2a, 0xe2, 0x51, 0xd6, 0x45, 0x12, 0xbb, 0x47, - 0x27, 0xa8, 0x42, 0x55, 0x9c, 0x48, 0x4a, 0xb9, 0xcc, 0xcc, 0xf3, 0x3e, - 0x4b, 0xbf, 0x44, 0x81, 0xc8, 0x39, 0x6b, 0x52, 0x61, 0x59, 0xd3, 0xff, - 0xeb, 0xca, 0x3b, 0xd2, 0x90, 0xf8, 0x85, 0xf7, 0x3d, 0xa6, 0xe2, 0x40, - 0xad, 0x0b, 0xd9, 0x8f, 0x90, 0x03, 0x1c, 0x15, 0xda, 0xca, 0xa4, 0x53, - 0x94, 0x00, 0xbb, 0xbd, 0x9e, 0x53, 0x2b, 0x6a, 0xc9, 0x0c, 0x4f, 0x4c, - 0x51, 0x61, 0x8d, 0x81, 0x40, 0x5d, 0x17, 0x29, 0x4d, 0x5f, 0xb2, 0x54, - 0x30, 0xf8, 0x2e, 0xd5, 0x1d, 0x51, 0x96, 0xa9, 0xc8, 0x06, 0x29, 0x17, - 0x5e, 0x8e, 0xc9, 0x4d, 0xa5, 0x0d, 0x27, 0xff, 0xfb, 0x0a, 0x3f, 0x37, - 0x46, 0x00, 0x34, 0x04, 0x9f, 0xa2, 0xd2, 0xad, 0x07, 0x82, 0xc8, 0x3f, - 0xda, 0xc0, 0x78, 0xbd, 0x06, 0x05, 0xf2, 0xd5, 0x14, 0x83, 0x07, 0xc2, - 0xf5, 0x00, 0x5c, 0x22, 0xa7, 0xfd, 0xa8, 0x5e, 0xdd, 0x47, 0x6a, 0x8d, - 0x9a, 0xf8, 0xea, 0xcc, 0x25, 0x9d, 0x77, 0xfa, 0x30, 0x9f, 0x2b, 0xb2, - 0x28, 0x29, 0x44, 0xf5, 0xa3, 0x68, 0xc4, 0x54, 0x16, 0xfa, 0xd9, 0xba, - 0x03, 0x47, 0x0e, 0xf8, 0x90, 0x16, 0x26, 0x6e, 0x31, 0x18, 0xd1, 0x07, - 0xcf, 0x2f, 0xb7, 0x89, 0x27, 0x2b, 0x2d, 0xf6, 0x18, 0x90, 0x9d, 0x41, - 0xff, 0xa9, 0x31, 0x74, 0x8a, 0xd6, 0xf9, 0xf4, 0x66, 0xb5, 0x57, 0x4d, - 0x60, 0x80, 0x90, 0x40, 0xc1, 0x7f, 0xc8, 0xd3, 0xdb, 0x0c, 0x8a, 0xab, - 0x6c, 0xeb, 0x30, 0xb1, 0x6a, 0x2f, 0xcb, 0xfb, 0xf5, 0xa2, 0x0c, 0xd2, - 0x62, 0x46, 0x71, 0x77, 0x26, 0x98, 0xec, 0x27, 0x0d, 0x96, 0xa7, 0x5a, - 0xfa, 0xad, 0x1e, 0xab, 0xb7, 0x7a, 0xd6, 0x7f, 0x33, 0xe3, 0x54, 0x42, - 0x4e, 0x77, 0xc4, 0xae, 0xb0, 0xb3, 0x93, 0xe9, 0xb6, 0x5b, 0x62, 0x72, - 0x6f, 0x68, 0x42, 0x82, 0x37, 0x7b, 0xbf, 0x63, 0xfd, 0xb0, 0xf4, 0xff, - 0x13, 0x3a, 0xe8, 0xc2, 0xfb, 0x30, 0x15, 0x02, 0x2f, 0x00, 0xd5, 0x22, - 0x14, 0xe0, 0x66, 0xef, 0x48, 0x8c, 0x6a, 0x0d, 0x72, 0x08, 0x59, 0xcd, - 0xe5, 0xf3, 0xba, 0xe4, 0x88, 0x7c, 0x5e, 0x64, 0x67, 0xa8, 0x50, 0xde, - 0x4c, 0xbd, 0xc1, 0x39, 0xce, 0xa0, 0x65, 0x12, 0xea, 0x71, 0xa2, 0xe1, - 0xdb, 0xcd, 0x0b, 0x59, 0x19, 0x2e, 0x0d, 0x01, 0xb1, 0xab, 0xe9, 0xcc, - 0xdc, 0xd7, 0x5a, 0xe7, 0xbc, 0x33, 0x29, 0xd0, 0xcc, 0x9f, 0xc8, 0xc0, - 0x14, 0xbe, 0xf2, 0x50, 0xa6, 0xe1, 0x77, 0x3f, 0x37, 0x2d, 0x99, 0x9d, - 0x09, 0x79, 0xc0, 0xa4, 0xe7, 0xdc, 0x44, 0x56, 0x84, 0xb7, 0xdf, 0xa3, - 0x4c, 0x0b, 0x23, 0x37, 0x27, 0x43, 0xcb, 0x2d, 0xb8, 0xe1, 0x19, 0x48, - 0x8d, 0xaa, 0x0d, 0x44, 0x84, 0x6f, 0x3e, 0x7c, 0x0d, 0x09, 0x60, 0x0d, - 0x2b, 0x9a, 0x03, 0xa4, 0x46, 0x8d, 0xef, 0x06, 0x17, 0x87, 0x0b, 0x8e, - 0x1d, 0x57, 0xc2, 0x5a, 0x1e, 0x5b, 0x17, 0xb7, 0xa8, 0x82, 0xae, 0xff, - 0xc3, 0xa2, 0xc9, 0x20, 0x99, 0x1b, 0x81, 0xe8, 0x3b, 0xbf, 0x47, 0x70, - 0xb5, 0x9b, 0x55, 0x90, 0x4d, 0xed, 0x55, 0x53, 0x12, 0x86, 0xee, 0xb0, - 0x46, 0x7d, 0xad, 0x51, 0x7a, 0x21, 0x12, 0x0b, 0xed, 0xa0, 0xe0, 0xef, - 0x40, 0xe7, 0x7b, 0xd8, 0x80, 0xba, 0xec, 0xfe, 0xa5, 0xe6, 0x78, 0xd1, - 0x54, 0xa5, 0xce, 0x41, 0x66, 0xf5, 0xf5, 0x2d, 0xcf, 0x0a, 0x43, 0xea, - 0x19, 0xa9, 0x8d, 0xe8, 0x61, 0xc9, 0x75, 0xbf, 0x2b, 0x44, 0xa1, 0x6c, - 0xc7, 0xe6, 0x12, 0x61, 0x05, 0x28, 0x3b, 0xcb, 0xa1, 0xf8, 0x71, 0xed, - 0xcd, 0xd0, 0x31, 0xb4, 0x16, 0x30, 0xeb, 0x22, 0xe4, 0x1e, 0x3f, 0xb5, - 0x48, 0x28, 0xaf, 0x3f, 0x45, 0xfb, 0xd2, 0x81, 0x81, 0x9b, 0x52, 0x0e, - 0x09, 0xa9, 0x93, 0xec, 0xbb, 0xa2, 0xd8, 0x66, 0x69, 0xd4, 0xab, 0x2f, - 0xdf, 0x7b, 0x33, 0x3c, 0xac, 0x5f, 0x93, 0x4c, 0xd8, 0xbf, 0x4b, 0x7e, - 0xe3, 0x06, 0xdd, 0xdc, 0x0e, 0x92, 0xfa, 0x25, 0x44, 0x7c, 0xad, 0xbe, - 0xee, 0x92, 0xbd, 0x50, 0x12, 0x1d, 0x40, 0xc8, 0xc6, 0xbd, 0x1b, 0x6b, - 0x71, 0xc0, 0xab, 0x2c, 0xd1, 0x8a, 0x5e, 0xeb, 0x12, 0x3e, 0xef, 0x35, - 0x87, 0xe8, 0xfe, 0xd1, 0x52, 0xc6, 0x36, 0xcf, 0xfd, 0xdb, 0x0d, 0x42, - 0x0b, 0x4c, 0xe4, 0xd0, 0xb5, 0x4f, 0xf6, 0x6b, 0x98, 0xd9, 0xf3, 0x2e, - 0x60, 0xc9, 0xa7, 0x22, 0xfc, 0x51, 0x41, 0x1e, 0x05, 0x2a, 0x4e, 0xf3, - 0xd9, 0x53, 0x66, 0xc6, 0x89, 0x9c, 0xfc, 0x4b, 0x87, 0xd3, 0x0a, 0xf1, - 0x48, 0x7c, 0xa9, 0xa7, 0x75, 0x58, 0x51, 0xe6, 0x6e, 0x5c, 0x94, 0xfb, - 0x08, 0xff, 0x0e, 0xb6, 0xd1, 0x0b, 0xf2, 0xf5, 0x5b, 0x75, 0x0a, 0xb0, - 0x28, 0x17, 0xc8, 0x80, 0x27, 0x63, 0xb4, 0x24, 0x98, 0x2d, 0x16, 0x19, - 0xce, 0x1d, 0xc2, 0xa3, 0xba, 0x80, 0x14, 0xc7, 0x1d, 0xb7, 0x2e, 0x1a, - 0xd8, 0xbc, 0xe3, 0x72, 0xce, 0xb4, 0x00, 0x9c, 0xaa, 0xa0, 0x2c, 0xea, - 0xc7, 0xe8, 0x90, 0xcb, 0xb5, 0xc5, 0x43, 0xec, 0x78, 0x76, 0x26, 0xd2, - 0x0d, 0x97, 0x62, 0x53, 0xfc, 0x1f, 0xb0, 0x70, 0x0a, 0x93, 0xb5, 0x57, - 0x32, 0xc5, 0x50, 0xe7, 0xb2, 0xa1, 0x30, 0xde, 0x65, 0xeb, 0x03, 0x30, - 0x83, 0x84, 0x2a, 0xb7, 0x05, 0x50, 0xce, 0x76, 0xc0, 0x05, 0xab, 0xe6, - 0xc1, 0xab, 0x36, 0xd2, 0x0c, 0xcf, 0x6f, 0xc4, 0x4e, 0x7d, 0x65, 0xa7, - 0xe0, 0x98, 0xee, 0xe6, 0xca, 0x5c, 0x00, 0xad, 0x37, 0xc0, 0x0e, 0xcf, - 0x6e, 0x58, 0x06, 0xf8, 0xd2, 0x05, 0x3f, 0xb2, 0xbc, 0x1b, 0xff, 0x42, - 0xc8, 0xfb, 0x2f, 0x96, 0x68, 0xa1, 0xa5, 0xaa, 0x46, 0x9f, 0xa2, 0x14, - 0xbf, 0xa9, 0x0a, 0x13, 0xf9, 0xd0, 0x00, 0x12, 0xf9, 0x37, 0x8f, 0xf5, - 0x63, 0xf5, 0x05, 0x06, 0x96, 0x4d, 0xfc, 0x89, 0x1a, 0xa9, 0xd8, 0x2c, - 0x32, 0xed, 0xbf, 0x36, 0xf5, 0x4e, 0x27, 0xe4, 0x84, 0x47, 0x77, 0x05, - 0x58, 0xe6, 0x30, 0xe9, 0x29, 0x6a, 0x4e, 0xfe, 0x39, 0x20, 0x6d, 0xd7, - 0x6c, 0x9a, 0x93, 0x8e, 0xd8, 0x73, 0xa3, 0x9f, 0x3b, 0xf9, 0x2b, 0x9c, - 0xe6, 0x42, 0xeb, 0x57, 0x1f, 0x09, 0x86, 0xc4, 0xdf, 0x4b, 0xb9, 0x28, - 0x8f, 0x91, 0xa3, 0x31, 0x6c, 0xc9, 0x78, 0xfd, 0xf8, 0x74, 0x60, 0xc6, - 0x86, 0x78, 0x12, 0xa7, 0x0d, 0xfa, 0xbc, 0x9b, 0x8c, 0xd7, 0x17, 0x5c, - 0x1a, 0x7a, 0x03, 0xfd, 0x2d, 0xd2, 0xa5, 0x65, 0x6f, 0x66, 0x97, 0xce, - 0x7e, 0x73, 0x46, 0xf6, 0x8d, 0xec, 0xb0, 0x79, 0x75, 0x02, 0xa5, 0xc7, - 0xa2, 0xa7, 0x38, 0xda, 0x4d, 0xdc, 0xc2, 0x51, 0x0f, 0xcf, 0x28, 0xa1, - 0x98, 0x40, 0xa8, 0x26, 0xa5, 0x2c, 0xee, 0x73, 0xfd, 0xf1, 0xde, 0x09, - 0x22, 0x19, 0xdc, 0xd7, 0x1e, 0xef, 0x97, 0x46, 0x69, 0x97, 0x49, 0x94, - 0xe7, 0x74, 0x8a, 0x4f, 0xbe, 0xdf, 0x18, 0xf9, 0x83, 0x50, 0x7c, 0x53, - 0x94, 0xe2, 0xd0, 0xbe, 0xf9, 0x5e, 0xaf, 0xdf, 0x68, 0x05, 0x31, 0x1e, - 0x77, 0xb6, 0x94, 0x3d, 0x02, 0xf0, 0x12, 0x3f, 0xb1, 0x96, 0x34, 0x1f, - 0xc3, 0x21, 0xca, 0xf3, 0x2d, 0xb6, 0x83, 0x10, 0xce, 0x78, 0xa6, 0x05, - 0xe7, 0x86, 0x61, 0xb9, 0xc0, 0x15, 0x54, 0xd0, 0x81, 0x78, 0x8b, 0xf5, - 0xc5, 0x3d, 0xda, 0x4f, 0xe6, 0x2a, 0xb4, 0x9e, 0x91, 0xe1, 0x45, 0x1c, - 0x74, 0xef, 0x4d, 0xf6, 0x37, 0xba, 0xaa, 0xf6, 0xfb, 0x32, 0xc4, 0x16, - 0xd8, 0xe1, 0xbb, 0x80, 0x41, 0x38, 0xb1, 0x7f, 0xb1, 0xdd, 0xa8, 0x4b, - 0x4b, 0x2d, 0xe4, 0x90, 0x8e, 0x5a, 0xda, 0xd1, 0x73, 0x93, 0xcc, 0xa7, - 0x32, 0x5a, 0x71, 0xaf, 0x09, 0xe1, 0x19, 0xfe, 0x8a, 0x83, 0xd8, 0x86, - 0x3f, 0x5f, 0x51, 0xc0, 0x49, 0xd1, 0xe1, 0x11, 0xe2, 0x73, 0x36, 0x7c, - 0x26, 0x0a, 0x11, 0x36, 0x5d, 0x2a, 0x2a, 0x52, 0x54, 0xa6, 0xd2, 0xe3, - 0xb8, 0xcf, 0x7a, 0x68, 0x94, 0x02, 0x6d, 0x6a, 0x5b, 0x5d, 0xf6, 0x77, - 0xe9, 0x35, 0xc2, 0xb8, 0xd8, 0x0e, 0x78, 0x5f, 0xfe, 0x6a, 0x81, 0x20, - 0xc0, 0xe9, 0x60, 0x5e, 0x13, 0x56, 0xc0, 0x7e, 0x74, 0xf2, 0x02, 0xcc, - 0x7d, 0x3c, 0xef, 0x43, 0x2d, 0x91, 0xba, 0x9e, 0x97, 0x96, 0xf8, 0x8c, - 0x2a, 0x76, 0x0c, 0xd9, 0x04, 0x37, 0x91, 0xbc, 0xd2, 0xef, 0x41, 0xb0, - 0xfe, 0x7c, 0x44, 0xea, 0x91, 0x8f, 0x7c, 0xbd, 0x53, 0x2d, 0x49, 0x9c, - 0x3a, 0xd5, 0x8f, 0x29, 0xec, 0x16, 0xbc, 0xcb, 0xc9, 0x1f, 0x99, 0x9f, - 0x76, 0xb1, 0x1c, 0x36, 0x55, 0xf6, 0xe7, 0x3a, 0xe7, 0xa3, 0x69, 0xd4, - 0xc4, 0x5b, 0x24, 0x2c, 0x35, 0xdc, 0x85, 0x4d, 0x31, 0x58, 0xc9, 0x3d, - 0xdd, 0xde, 0xf8, 0xe3, 0xdd, 0xd0, 0xa9, 0x1b, 0x75, 0x21, 0x03, 0x91, - 0x7d, 0xeb, 0x30, 0x7c, 0xd4, 0x5b, 0x4a, 0xc4, 0x2e, 0x8c, 0x3d, 0x3e, - 0x0b, 0xfd, 0x9e, 0x77, 0xb7, 0x73, 0x88, 0xf5, 0xb0, 0x39, 0x84, 0xdb, - 0x35, 0xf6, 0xd4, 0x8c, 0x2a, 0x21, 0xc3, 0x33, 0x2c, 0x2c, 0x12, 0x8a, - 0x2c, 0x8b, 0x53, 0x26, 0xf8, 0x26, 0xc3, 0x80, 0xb7, 0xe9, 0x29, 0xff, - 0x76, 0xe2, 0xf5, 0x3d, 0x10, 0x7b, 0x48, 0x25, 0x48, 0x5c, 0xa0, 0x31, - 0xe3, 0x5f, 0x12, 0x89, 0xb3, 0x12, 0x95, 0xeb, 0x7d, 0x49, 0x4c, 0xb5, - 0xde, 0x18, 0xd9, 0x49, 0xa0, 0x41, 0x3b, 0x22, 0x31, 0x2a, 0x8c, 0x15, - 0x81, 0xfc, 0xa3, 0xfc, 0x20, 0xbf, 0x72, 0x12, 0x80, 0x6e, 0xae, 0x46, - 0x17, 0xb8, 0xd8, 0x8e, 0x9e, 0x47, 0x45, 0x1a, 0x60, 0x96, 0x92, 0x27, - 0xe8, 0x84, 0x03, 0x2d, 0xf6, 0x22, 0xb2, 0x8e, 0xd1, 0x9f, 0x17, 0x8f, - 0x5c, 0x40, 0xeb, 0x24, 0xfc, 0xe6, 0xc5, 0x7e, 0xe7, 0x38, 0xea, 0x5b, - 0x5d, 0xbb, 0x55, 0xdf, 0x70, 0xe2, 0x43, 0x34, 0xc2, 0xf6, 0xee, 0xf4, - 0xa5, 0xba, 0xbe, 0xa4, 0x9c, 0x8f, 0x02, 0x25, 0xd2, 0x3b, 0xdb, 0x63, - 0x36, 0x05, 0x2a, 0x2a, 0x79, 0xa7, 0x5f, 0xba, 0x87, 0xe3, 0x16, 0xf2, - 0x1d, 0x85, 0x1d, 0xec, 0xdc, 0xb6, 0xda, 0xed, 0xb9, 0xa3, 0xdf, 0x62, - 0x32, 0xf9, 0xe5, 0x8d, 0x99, 0x35, 0xf1, 0xa0, 0x24, 0xb3, 0x31, 0xd1, - 0xad, 0xe3, 0x75, 0xa6, 0x5d, 0xd7, 0x69, 0x9a, 0x26, 0x76, 0x2c, 0x58, - 0xa0, 0x44, 0xf5, 0x54, 0x98, 0x9f, 0x3d, 0xe1, 0xdc, 0x7f, 0xd5, 0x1b, - 0x29, 0xb7, 0xf8, 0x13, 0xd3, 0x19, 0x2c, 0xe9, 0xf8, 0xdc, 0x30, 0x4d, - 0x7d, 0x78, 0x95, 0xc7, 0x17, 0x92, 0x6f, 0xfb, 0xac, 0x5c, 0x1e, 0x48, - 0xec, 0x66, 0xb5, 0xe6, 0xe6, 0xb7, 0x0b, 0x51, 0xb6, 0xda, 0xd7, 0xa1, - 0x14, 0xae, 0x4b, 0x24, 0x5d, 0xed, 0x77, 0x4d, 0xf5, 0xb5, 0x87, 0x65, - 0x03, 0x24, 0xed, 0x7a, 0xa6, 0x1b, 0xbc, 0xc9, 0xa4, 0xf6, 0x18, 0xa6, - 0xbc, 0x48, 0xb9, 0x35, 0xf9, 0x1a, 0xcb, 0x31, 0x1c, 0xda, 0x9a, 0x66, - 0x2a, 0x3d, 0x7b, 0xa4, 0x34, 0x92, 0x18, 0xb7, 0x83, 0x50, 0xd2, 0x9f, - 0xfd, 0x72, 0x2c, 0x22, 0x19, 0x7e, 0x5f, 0x66, 0x95, 0x04, 0x94, 0xc9, - 0xff, 0x34, 0xd2, 0xd5, 0xaf, 0x79, 0xa7, 0xe6, 0x66, 0xe1, 0x4f, 0xdc, - 0x20, 0xdf, 0x02, 0x55, 0xf1, 0x8c, 0xa1, 0x52, 0xf4, 0xf7, 0x0f, 0xf2, - 0x08, 0x56, 0x1e, 0x97, 0x7e, 0xe2, 0x3f, 0xd2, 0x6b, 0x07, 0x95, 0x74, - 0xae, 0x36, 0xce, 0x59, 0x55, 0x04, 0x51, 0xe2, 0x2b, 0x82, 0xf3, 0x55, - 0xb9, 0xcf, 0x0a, 0xc0, 0xcf, 0xfc, 0x27, 0x5b, 0x4e, 0x74, 0xc1, 0x4f, - 0xa2, 0x74, 0xb6, 0x71, 0x66, 0x68, 0x82, 0x87, 0x53, 0x8e, 0x0c, 0xab, - 0x8c, 0x87, 0x2b, 0xe2, 0xf8, 0x65, 0xc4, 0x0f, 0x01, 0x54, 0x5b, 0x2c, - 0xfe, 0x5d, 0x9e, 0x2f, 0xf4, 0xfc, 0x24, 0x93, 0x86, 0x79, 0xe5, 0x9d, - 0x66, 0xa2, 0xd0, 0x9b, 0xf5, 0x7d, 0x54, 0xf5, 0x4d, 0x36, 0xb1, 0x77, - 0x3c, 0x34, 0x26, 0xa9, 0xca, 0xaa, 0x4f, 0x6c, 0xe6, 0x9a, 0x19, 0x04, - 0x6d, 0x39, 0x3d, 0x39, 0x35, 0x35, 0x58, 0x92, 0x5c, 0x2d, 0xa5, 0x1b, - 0x42, 0xb7, 0xd2, 0x41, 0x31, 0xee, 0x18, 0x52, 0xeb, 0xba, 0x45, 0x54, - 0xfd, 0x40, 0x2d, 0x23, 0x3f, 0xe9, 0x30, 0xd1, 0x0a, 0xb6, 0xb4, 0x0e, - 0xc9, 0x72, 0x7d, 0xdd, 0xda, 0x4a, 0x60, 0x9c, 0x3a, 0xb7, 0x3b, 0xcb, - 0x33, 0xea, 0x05, 0xcc, 0x3b, 0xff, 0xb9, 0x82, 0x79, 0x91, 0xe5, 0xa9, - 0xf3, 0xef, 0x64, 0xe8, 0x23, 0xe5, 0xe7, 0xd3, 0x36, 0x9c, 0xc9, 0x87, - 0x9c, 0x0a, 0x88, 0xb7, 0xe7, 0x37, 0xa5, 0x4c, 0x53, 0x36, 0xaa, 0xc5, - 0xfc, 0x1c, 0xbb, 0xbc, 0x2a, 0x13, 0x90, 0x83, 0xba, 0x4a, 0x1c, 0x1e, - 0x21, 0xf9, 0x47, 0x61, 0x06, 0x72, 0x09, 0x1b, 0x73, 0x71, 0x74, 0x9e, - 0xd5, 0x2e, 0x86, 0xc2, 0x27, 0xba, 0xfc, 0xe0, 0x25, 0x3c, 0xdd, 0x9f, - 0x4d, 0x1e, 0xee, 0xe5, 0x7f, 0xef, 0x87, 0xde, 0x99, 0x43, 0x20, 0x6e, - 0xcd, 0xfe, 0xd3, 0xf0, 0xd0, 0x10, 0x24, 0x0d, 0xb9, 0x3f, 0xbb, 0x86, - 0xda, 0x66, 0xee, 0x77, 0x47, 0xf5, 0x97, 0xbb, 0xc2, 0x74, 0xc5, 0x6d, - 0x7b, 0x3c, 0x79, 0xc6, 0xe1, 0xa7, 0x7e, 0xa9, 0xd5, 0x98, 0x40, 0xaf, - 0xaf, 0x96, 0x97, 0x93, 0x00, 0x7a, 0x71, 0xec, 0xd1, 0x25, 0xf9, 0x9e, - 0x1c, 0x10, 0xa0, 0x8a, 0x59, 0xdf, 0x8a, 0x07, 0x12, 0x96, 0xb2, 0x9e, - 0x78, 0xe2, 0x8f, 0x6e, 0xff, 0xed, 0x87, 0x44, 0xe4, 0xf7, 0xe8, 0xbb, - 0x2e, 0x79, 0x0c, 0xa7, 0x34, 0x32, 0xbf, 0x7c, 0x4f, 0x79, 0x8f, 0x4d, - 0x9a, 0xea, 0x4f, 0x2f, 0xbf, 0x5d, 0x6e, 0x7a, 0xf6, 0xe2, 0x64, 0x93, - 0x24, 0x91, 0xcb, 0xb5, 0x4a, 0x0e, 0xf1, 0x48, 0x94, 0xb5, 0x57, 0xb7, - 0x30, 0xb6, 0x6c, 0xcf, 0x46, 0x99, 0x8f, 0xba, 0xe8, 0xa1, 0x51, 0x32, - 0xee, 0xe5, 0x28, 0x7b, 0xce, 0x03, 0xc1, 0x17, 0xc3, 0x7b, 0x25, 0x9f, - 0xa4, 0x31, 0x93, 0xe1, 0x2e, 0xa6, 0x32, 0x06, 0xcd, 0x6c, 0xf8, 0x58, - 0x9c, 0x71, 0x56, 0x28, 0x20, 0x68, 0x4e, 0x26, 0xc3, 0xdf, 0xc5, 0x1f, - 0xc3, 0x06, 0xa4, 0xa5, 0x83, 0x44, 0x65, 0x21, 0xdd, 0x2d, 0xa4, 0x09, - 0xba, 0x0f, 0xdf, 0x5a, 0x77, 0x27, 0x55, 0x32, 0xd1, 0x7c, 0x86, 0xff, - 0x8e, 0xd0, 0xb1, 0x18, 0x48, 0x8e, 0x29, 0xc5, 0xc5, 0xf5, 0xb9, 0xbf, - 0xc9, 0x34, 0x83, 0x31, 0x10, 0x7c, 0xc6, 0x27, 0x7c, 0x4a, 0x44, 0x60, - 0x92, 0x59, 0xee, 0x4b, 0x67, 0x12, 0x97, 0xa7, 0x0f, 0x5c, 0x58, 0xfa, - 0xa2, 0x40, 0xd7, 0xf0, 0xdf, 0x40, 0x9e, 0x8a, 0xb8, 0x60, 0x3d, 0x54, - 0x51, 0xdf, 0x5f, 0xe3, 0xed, 0x2d, 0x68, 0xbb, 0xfd, 0xe6, 0x0b, 0xdf, - 0xf0, 0x69, 0x1c, 0x75, 0x3b, 0xc5, 0x4b, 0x5c, 0x82, 0xfd, 0x4d, 0xe2, - 0x22, 0x93, 0xd0, 0xa8, 0x7d, 0xcf, 0x18, 0xe8, 0x59, 0xb3, 0x9f, 0xfa, - 0xe7, 0x40, 0x9f, 0xba, 0xc8, 0x66, 0xed, 0x1e, 0xa7, 0x9a, 0xca, 0xdf, - 0x5d, 0x42, 0x07, 0xa8, 0x9b, 0xf1, 0x7c, 0x37, 0xd5, 0xf6, 0x3b, 0x45, - 0xa0, 0xfa, 0x37, 0x92, 0xba, 0x26, 0xdf, 0x2a, 0x40, 0x94, 0x9d, 0x10, - 0x7c, 0x31, 0x74, 0x8d, 0x38, 0x60, 0xda, 0xaf, 0xa0, 0xb2, 0x77, 0x7e, - 0xc2, 0x42, 0x77, 0x5b, 0xe1, 0xaf, 0x49, 0x47, 0x1f, 0xaa, 0x8b, 0xa2, - 0x36, 0xc6, 0x5a, 0xc5, 0xb8, 0x0c, 0x5d, 0x6d, 0xee, 0x55, 0xde, 0xd0, - 0xfc, 0xa5, 0xc5, 0xc8, 0x1e, 0xdc, 0xc0, 0x6e, 0xd2, 0x85, 0x5a, 0xe4, - 0x0d, 0xb3, 0x60, 0x65, 0x48, 0x29, 0xb3, 0x9e, 0x99, 0xff, 0x1c, 0x6f, - 0xce, 0x18, 0x29, 0x6b, 0x1a, 0x76, 0x0b, 0x99, 0x34, 0xa0, 0xff, 0x43, - 0xa5, 0xc3, 0x88, 0x1a, 0xc6, 0x38, 0x98, 0x6f, 0x59, 0xc2, 0xe4, 0xbc, - 0x05, 0x8c, 0x58, 0x0d, 0x16, 0x87, 0xff, 0x05, 0xec, 0x90, 0xcf, 0x54, - 0x22, 0xed, 0x20, 0x2f, 0x29, 0xcf, 0xeb, 0xb4, 0x0d, 0x92, 0x5f, 0xfb, - 0x00, 0x6f, 0x5f, 0xb7, 0x5e, 0xe3, 0xd3, 0x0f, 0x8d, 0x75, 0xce, 0x5d, - 0xa0, 0x5c, 0xca, 0x20, 0xcd, 0x4c, 0x8d, 0x55, 0xed, 0xf8, 0x92, 0x74, - 0xb4, 0x9d, 0x38, 0x4e, 0x8a, 0x03, 0xbf, 0x6e, 0xa5, 0xda, 0xac, 0xb6, - 0x87, 0x05, 0x8a, 0x55, 0x73, 0x74, 0x81, 0xa8, 0x66, 0x3b, 0xa7, 0x85, - 0x7c, 0xe0, 0xff, 0x2f, 0x34, 0xed, 0x53, 0x0d, 0xb8, 0x4a, 0xb1, 0xa2, - 0xab, 0xd9, 0xf4, 0x62, 0x03, 0x7c, 0xba, 0xb5, 0x49, 0x43, 0xe2, 0x3d, - 0xe1, 0x67, 0xf1, 0xd2, 0x13, 0xa4, 0xb2, 0xe7, 0xc4, 0xff, 0xa0, 0x28, - 0x32, 0x46, 0x81, 0x5e, 0x04, 0x66, 0xc3, 0x80, 0x36, 0xae, 0xe2, 0x97, - 0x32, 0x57, 0xad, 0xed, 0x66, 0x8b, 0x3f, 0xd6, 0xf0, 0x1c, 0xe0, 0x80, - 0x7f, 0xdc, 0x21, 0x4c, 0x5b, 0x49, 0x32, 0xa9, 0xd3, 0x2e, 0xdd, 0x35, - 0xdc, 0xa4, 0xeb, 0x24, 0xf4, 0x1d, 0x79, 0x00, 0x90, 0x9c, 0x92, 0x85, - 0x2b, 0x38, 0x23, 0xd5, 0xbf, 0x12, 0x76, 0x15, 0xe2, 0xa7, 0x59, 0xf9, - 0x28, 0x15, 0x73, 0x3e, 0x52, 0x94, 0xc9, 0x52, 0xef, 0x95, 0x23, 0x8a, - 0xf0, 0x2c, 0x55, 0xce, 0x71, 0x46, 0xd9, 0xa4, 0x3f, 0x44, 0xf7, 0x88, - 0x7b, 0xf9, 0x2d, 0x54, 0xfa, 0xf6, 0x6d, 0xfb, 0xa2, 0x97, 0x5b, 0x18, - 0xd6, 0x20, 0xeb, 0xe6, 0x98, 0xb0, 0xd9, 0x07, 0xb9, 0x47, 0x2c, 0x10, - 0xa4, 0x5e, 0xd1, 0xe3, 0x47, 0xbc, 0xfb, 0x42, 0x5e, 0x67, 0xc9, 0xa0, - 0x49, 0xd1, 0x91, 0x40, 0x97, 0xf8, 0x8a, 0x42, 0x13, 0x60, 0xef, 0x37, - 0xda, 0x03, 0xbd, 0x23, 0xdb, 0x99, 0x7a, 0x5b, 0x69, 0x8f, 0x4d, 0xba, - 0x8e, 0x6e, 0x33, 0x2a, 0x9c, 0xc0, 0xdc, 0x9b, 0x89, 0xf5, 0xcb, 0x72, - 0x51, 0x05, 0xc9, 0x8c, 0xd8, 0x4a, 0xd5, 0xd7, 0x93, 0x07, 0x36, 0x57, - 0x3c, 0x02, 0x64, 0x45, 0x1b, 0x54, 0x9f, 0xe3, 0xd5, 0x42, 0x05, 0xd4, - 0x24, 0xe3, 0x3f, 0x60, 0x4b, 0xde, 0x93, 0x4f, 0x71, 0xed, 0x07, 0xe7, - 0xad, 0xb1, 0x0d, 0xaa, 0x8d, 0x67, 0x5b, 0xa4, 0x1c, 0xe1, 0xe1, 0x6c, - 0x03, 0x33, 0x42, 0x93, 0x60, 0x5e, 0xb0, 0x10, 0xb3, 0xd7, 0x2c, 0x7b, - 0x46, 0xe3, 0x01, 0xc9, 0x0a, 0x55, 0x36, 0x64, 0x5f, 0xcc, 0xa1, 0xed, - 0xa0, 0x82, 0x7f, 0x9e, 0x80, 0xc9, 0xe1, 0xb5, 0xb2, 0xeb, 0xe8, 0xc9, - 0xe2, 0xda, 0x2f, 0x0d, 0xb1, 0x2b, 0x72, 0x79, 0x79, 0x37, 0xf2, 0x40, - 0xea, 0x7e, 0xbf, 0x49, 0x11, 0x06, 0x4a, 0x38, 0x72, 0xc8, 0xb8, 0x0d, - 0xe8, 0xdc, 0x95, 0xc6, 0x8f, 0xbe, 0x0f, 0xac, 0xcc, 0xef, 0x4e, 0x3f, - 0x7d, 0x29, 0x5f, 0x12, 0xda, 0xa6, 0x8c, 0x77, 0x2a, 0x61, 0x1f, 0xd6, - 0x8c, 0x91, 0x36, 0x10, 0xe3, 0xf7, 0x68, 0x62, 0xb5, 0xd1, 0x9b, 0x5c, - 0x0b, 0xa3, 0x66, 0x11, 0xa5, 0xff, 0x5f, 0x5f, 0x67, 0x89, 0x84, 0x52, - 0xc1, 0xc5, 0x3d, 0xee, 0x63, 0xb4, 0x8f, 0x7e, 0x63, 0xf3, 0x5f, 0x7c, - 0x9e, 0x16, 0x1e, 0x45, 0x32, 0x00, 0xfa, 0xd8, 0x0c, 0xcf, 0x0d, 0x25, - 0xae, 0x5e, 0x61, 0x1d, 0x91, 0x45, 0x9c, 0x44, 0x8e, 0x32, 0x0e, 0x4c, - 0xad, 0xc3, 0x87, 0x4c, 0x7b, 0xab, 0xe5, 0x4c, 0xd1, 0x8b, 0xde, 0xd4, - 0x27, 0x14, 0x1a, 0xc0, 0x43, 0x3f, 0xbd, 0x3d, 0xa3, 0x4b, 0x53, 0x7a, - 0x32, 0xc4, 0xa8, 0xb2, 0x38, 0x98, 0xa5, 0xe6, 0x85, 0x58, 0xd8, 0x78, - 0xe5, 0x63, 0x8b, 0xf7, 0xa2, 0xa1, 0xf7, 0xfb, 0xd3, 0xd0, 0x51, 0xa5, - 0x42, 0xd9, 0x3d, 0x7d, 0x38, 0xef, 0xa0, 0xdc, 0xe2, 0xf7, 0x61, 0x76, - 0x96, 0xb0, 0x92, 0xe1, 0xdb, 0xfd, 0x77, 0x93, 0x67, 0x29, 0xc8, 0x22, - 0x2b, 0x8a, 0x9c, 0xdc, 0xef, 0x1d, 0xce, 0xec, 0x53, 0x13, 0x30, 0x4d, - 0x73, 0x5c, 0x1b, 0x32, 0xea, 0x40, 0x8d, 0x56, 0xd5, 0x94, 0x29, 0xe7, - 0x6b, 0x0d, 0xc3, 0x4a, 0x7d, 0x56, 0x95, 0xb3, 0x6c, 0xd3, 0x0e, 0x55, - 0xa1, 0x6e, 0x8b, 0x6b, 0xca, 0x4c, 0x28, 0x33, 0xa7, 0x25, 0x40, 0xeb, - 0x7c, 0xe8, 0x1d, 0x05, 0xac, 0x6a, 0x21, 0x73, 0x3f, 0x1c, 0x34, 0x1f, - 0x32, 0xc1, 0x17, 0x08, 0xf1, 0xdb, 0x6c, 0x55, 0xb1, 0xcb, 0xcc, 0x53, - 0x07, 0xb2, 0x52, 0x7c, 0x0a, 0x95, 0x5d, 0x0d, 0xf1, 0x25, 0x0d, 0x21, - 0x9a, 0x8b, 0x9b, 0x60, 0x42, 0xe6, 0xfc, 0x12, 0x17, 0x96, 0x2b, 0xe1, - 0x84, 0xf0, 0x96, 0x77, 0x3e, 0xd9, 0x61, 0x03, 0x1c, 0xfa, 0xbd, 0x4d, - 0x0b, 0x62, 0xd9, 0x89, 0x43, 0xd8, 0x19, 0xe8, 0x92, 0x83, 0x63, 0x7b, - 0x55, 0x85, 0xfe, 0xde, 0x89, 0x09, 0x88, 0xe5, 0x8f, 0x99, 0x37, 0x99, - 0xcd, 0xe7, 0xf1, 0x5f, 0x33, 0x6b, 0x3d, 0x33, 0x91, 0x7d, 0xb5, 0x19, - 0x81, 0xdc, 0x0b, 0x0f, 0xc0, 0x55, 0x87, 0x03, 0x61, 0x62, 0x67, 0x7c, - 0x2a, 0x11, 0x73, 0xfe, 0x4b, 0xb1, 0x72, 0x5f, 0x03, 0x67, 0xb7, 0xcd, - 0xdd, 0x0e, 0xe6, 0xb6, 0x84, 0xab, 0x87, 0x19, 0xf7, 0x13, 0xfa, 0x4b, - 0x37, 0xae, 0x43, 0x1a, 0x1a, 0x39, 0x36, 0x01, 0xb5, 0xb5, 0x48, 0xc9, - 0x29, 0x1f, 0xfb, 0x22, 0x3a, 0x44, 0x61, 0x40, 0x29, 0x6f, 0x7f, 0x8a, - 0x0a, 0x31, 0x2d, 0x90, 0x74, 0xfc, 0x57, 0xa2, 0xbe, 0xd6, 0x4e, 0x95, - 0x35, 0x4f, 0x10, 0x5b, 0x5f, 0x58, 0x53, 0x48, 0xd0, 0x71, 0x85, 0xcd, - 0xb7, 0x30, 0x56, 0x2f, 0xd6, 0x35, 0x57, 0x75, 0x45, 0x5f, 0xc2, 0x1d, - 0x8c, 0xa9, 0x14, 0xf8, 0x57, 0x26, 0x44, 0x16, 0x14, 0xd6, 0xfb, 0x33, - 0xb3, 0x85, 0x79, 0x75, 0x8c, 0xdb, 0x92, 0x7f, 0x89, 0xc4, 0x76, 0x00, - 0x9d, 0xd4, 0x4c, 0xea, 0x38, 0xb4, 0x60, 0xde, 0x77, 0x13, 0x15, 0xca, - 0xc4, 0x32, 0xdc, 0x7e, 0x34, 0x99, 0x1a, 0xd7, 0xc6, 0xa5, 0x0c, 0x4a, - 0xe9, 0xa4, 0x71, 0xb6, 0x76, 0x38, 0x7a, 0x72, 0x8f, 0x78, 0xbc, 0x0c, - 0x7f, 0xd3, 0xeb, 0x0a, 0x42, 0x77, 0x5a, 0x97, 0x8e, 0xb1, 0x4e, 0x17, - 0x50, 0x35, 0xf6, 0x52, 0xd3, 0x9f, 0x9b, 0x93, 0xb5, 0x2b, 0xce, 0xc6, - 0x25, 0xa0, 0xfd, 0xdf, 0xd4, 0xbb, 0x39, 0x4b, 0x9a, 0x2b, 0x8d, 0x1f, - 0x1b, 0xd8, 0x0d, 0x6b, 0x3e, 0x59, 0x6e, 0x94, 0x75, 0xe7, 0xc7, 0xd5, - 0xe7, 0x49, 0xd0, 0xc5, 0x85, 0x21, 0x86, 0x04, 0x74, 0x11, 0x3b, 0x2c, - 0xbd, 0xd8, 0x0b, 0x9f, 0x01, 0xbf, 0xab, 0x13, 0x23, 0xfc, 0x6a, 0x5c, - 0x6b, 0x95, 0x88, 0xad, 0x31, 0x1d, 0xc3, 0x4c, 0x59, 0x79, 0xbd, 0x8e, - 0xd4, 0x01, 0x23, 0x48, 0xcf, 0xcd, 0x77, 0x35, 0xe9, 0xc5, 0x11, 0x6b, - 0x22, 0xfd, 0xea, 0xff, 0x97, 0xcf, 0xf9, 0x2e, 0x98, 0xa0, 0xa4, 0x31, - 0xfb, 0x9a, 0x9f, 0xba, 0x32, 0xb0, 0x05, 0x94, 0x7b, 0x89, 0x28, 0x6d, - 0x5b, 0xa6, 0x77, 0x28, 0x0d, 0xb2, 0xff, 0xad, 0xff, 0x11, 0x0f, 0x7c, - 0x64, 0x9a, 0xaf, 0xae, 0xcf, 0x53, 0x95, 0x76, 0x9c, 0x48, 0x93, 0x09, - 0xe5, 0x8f, 0x49, 0xe9, 0x45, 0x67, 0xa1, 0xbb, 0x4c, 0x15, 0x50, 0x6c, - 0x61, 0x96, 0xea, 0x75, 0x05, 0xab, 0x32, 0x82, 0xde, 0xde, 0xfd, 0xfd, - 0xa4, 0x70, 0x71, 0x0c, 0x86, 0xc8, 0x19, 0x70, 0x2a, 0xa7, 0x82, 0xc5, - 0x71, 0x49, 0xe7, 0x5f, 0x6a, 0xe5, 0x08, 0x2d, 0xee, 0x8d, 0x02, 0x4b, - 0x08, 0xf8, 0x57, 0xf8, 0x3f, 0xa8, 0xc7, 0x6c, 0xfb, 0x4b, 0xdb, 0xa3, - 0x80, 0x7b, 0xdc, 0x2c, 0x4b, 0x03, 0x4b, 0x74, 0x5c, 0xd7, 0x30, 0x87, - 0x8b, 0x03, 0xce, 0x18, 0x3c, 0xab, 0x51, 0xe3, 0xfd, 0xcf, 0x49, 0x48, - 0xc4, 0x43, 0xfe, 0xe6, 0x83, 0x3f, 0x32, 0x46, 0x07, 0x01, 0x71, 0xdb, - 0x0c, 0xf9, 0xe1, 0xc4, 0x72, 0xe6, 0xac, 0x49, 0x2b, 0xc4, 0xa6, 0x2e, - 0xf8, 0xf4, 0xcc, 0x73, 0xa3, 0xec, 0xf5, 0xbb, 0x4c, 0x26, 0xfb, 0xee, - 0x12, 0x1c, 0x97, 0x6b, 0x9e, 0x98, 0x25, 0xa5, 0xa7, 0x1b, 0xb8, 0xca, - 0x1c, 0x4c, 0x90, 0xe0, 0xc1, 0x10, 0x3c, 0xda, 0xd4, 0xb1, 0x90, 0x1c, - 0x2e, 0xed, 0x4a, 0xd4, 0x6e, 0x6c, 0xe8, 0xca, 0x13, 0xdf, 0xdc, 0xf9, - 0x90, 0xe4, 0x58, 0x3e, 0x3d, 0xe7, 0x0f, 0x3b, 0xe3, 0x16, 0x59, 0xcd, - 0x52, 0xbd, 0x45, 0x9a, 0x4f, 0x28, 0x27, 0x00, 0x58, 0xc7, 0x9c, 0x07, - 0xed, 0x6d, 0xe0, 0x3d, 0x0b, 0x5a, 0x13, 0x79, 0x10, 0x96, 0x4c, 0xa1, - 0x84, 0xd3, 0xaa, 0x46, 0x77, 0xc9, 0xc1, 0xdf, 0xe4, 0x24, 0x8a, 0x0d, - 0x9b, 0xab, 0xe1, 0x8d, 0xd4, 0x87, 0xe7, 0x04, 0x96, 0x6b, 0x3e, 0x5c, - 0xbe, 0x0a, 0xf3, 0x33, 0x91, 0xc1, 0x0c, 0x1e, 0x0e, 0x90, 0x4e, 0xd8, - 0xff, 0xe7, 0xfe, 0x60, 0x74, 0x7d, 0x19, 0x54, 0x6e, 0xb6, 0x62, 0x73, - 0x0e, 0xe4, 0x6b, 0x27, 0xef, 0xee, 0x92, 0x0f, 0xd8, 0x37, 0x0a, 0x67, - 0xa9, 0x26, 0x9b, 0x92, 0xce, 0xd7, 0x96, 0x2f, 0xd4, 0xe8, 0xee, 0x46, - 0x4a, 0x0a, 0xdf, 0x06, 0x51, 0xc8, 0x93, 0x2f, 0xea, 0xb5, 0x33, 0x08, - 0xbd, 0xd0, 0x20, 0x9d, 0xbc, 0xa6, 0xdd, 0x14, 0xf5, 0x3c, 0x75, 0x2d, - 0x8e, 0x53, 0x81, 0x62, 0x3e, 0xe1, 0xc9, 0x71, 0xcb, 0xdd, 0xf2, 0x50, - 0xee, 0x89, 0x7b, 0xc1, 0x3a, 0x6e, 0x38, 0x4d, 0xcb, 0x2f, 0x10, 0x0e, - 0xb7, 0x6b, 0x95, 0x7c, 0xf0, 0xf9, 0xbf, 0xc9, 0xf4, 0xfc, 0x44, 0x57, - 0x36, 0x9a, 0x50, 0x62, 0xd6, 0x90, 0x3b, 0x9a, 0xc1, 0x08, 0x19, 0xc6, - 0x4e, 0x6f, 0xac, 0x01, 0xb0, 0xf1, 0x10, 0x9f, 0x30, 0xa2, 0x01, 0x42, - 0x83, 0xb7, 0xd8, 0x4c, 0xc0, 0x12, 0x3a, 0xf5, 0x4d, 0x47, 0xe0, 0x97, - 0x7c, 0xed, 0xc9, 0xe2, 0xe3, 0xc6, 0xec, 0x6a, 0x85, 0x6c, 0x54, 0x11, - 0xc6, 0x7c, 0xe8, 0xd9, 0x00, 0x2b, 0x58, 0x09, 0x69, 0x79, 0x20, 0xee, - 0x79, 0x3a, 0x45, 0x9b, 0x41, 0x77, 0x1f, 0xca, 0x50, 0x00, 0x15, 0xf1, - 0xfc, 0x37, 0xd3, 0xb4, 0xb6, 0x87, 0x6e, 0x16, 0x77, 0xe0, 0xf3, 0x21, - 0xe5, 0xb0, 0x97, 0xa2, 0x88, 0x78, 0x03, 0x98, 0x9d, 0xde, 0x4c, 0xd5, - 0x5a, 0x1e, 0x2d, 0xfc, 0xaa, 0xf8, 0x2b, 0xea, 0x59, 0x3a, 0xd8, 0x85, - 0x41, 0x17, 0x99, 0x6c, 0x0e, 0xa4, 0xa0, 0xc9, 0x62, 0x76, 0x93, 0x11, - 0xe8, 0x34, 0x57, 0x5e, 0xd9, 0x4b, 0x2c, 0xa0, 0x83, 0xba, 0x8c, 0x5e, - 0xc5, 0x4c, 0xc3, 0x49, 0xe6, 0x83, 0x3a, 0x82, 0x2c, 0xca, 0x6d, 0x5a, - 0xcf, 0xa4, 0xc7, 0x8f, 0x08, 0x8c, 0xa1, 0xee, 0x7e, 0x8c, 0x5d, 0x83, - 0xb6, 0xea, 0xf3, 0x30, 0x4c, 0x3d, 0xa5, 0x90, 0xbf, 0xbc, 0x2a, 0x52, - 0xf1, 0x7d, 0x1c, 0xb2, 0xf5, 0xe3, 0xb5, 0x75, 0x3a, 0x40, 0x53, 0x83, - 0x6c, 0xa9, 0xf8, 0xfb, 0xb0, 0x2d, 0x33, 0xe7, 0x2c, 0x33, 0x85, 0x79, - 0x85, 0xfe, 0x05, 0xab, 0x1a, 0xe1, 0x3f, 0x58, 0x75, 0xcd, 0x7d, 0xc2, - 0x25, 0xa5, 0x79, 0x9a, 0x5e, 0x05, 0xff, 0xdd, 0x2f, 0x5d, 0x47, 0xcd, - 0x17, 0x26, 0x1d, 0x3b, 0xaa, 0x2d, 0x23, 0xa7, 0xf6, 0x95, 0x75, 0xac, - 0x7c, 0x59, 0xbd, 0xc6, 0x43, 0xe9, 0xe1, 0x15, 0x0c, 0xb8, 0xc6, 0x3f, - 0xcb, 0xe4, 0x14, 0xcc, 0xa2, 0xb2, 0x19, 0x65, 0x30, 0xbc, 0xec, 0x17, - 0xb8, 0x51, 0x5c, 0x7e, 0x84, 0xe4, 0x07, 0x1e, 0x8b, 0x59, 0x83, 0xf8, - 0xbb, 0x37, 0x24, 0xaf, 0xaf, 0x93, 0xdd, 0x9e, 0x15, 0x06, 0x08, 0xb5, - 0x48, 0x3c, 0x1b, 0x9f, 0x38, 0xe3, 0x74, 0x5e, 0xb5, 0x55, 0xf3, 0xbb, - 0x4f, 0xc4, 0x37, 0x6e, 0xf8, 0x5c, 0x26, 0xcc, 0xb9, 0xce, 0xa8, 0x33, - 0x7b, 0x8e, 0xf6, 0x85, 0x32, 0x64, 0x19, 0x86, 0x2c, 0xd9, 0xb6, 0x90, - 0x7c, 0x93, 0x37, 0xb9, 0xf7, 0xfc, 0xc5, 0x9d, 0xbd, 0x9b, 0xac, 0x7d, - 0x4f, 0xf0, 0xfa, 0x53, 0x16, 0x5a, 0xf5, 0xed, 0x94, 0x2b, 0xfc, 0xeb, - 0xa4, 0x2c, 0x76, 0x91, 0x03, 0x55, 0xbe, 0x47, 0xc9, 0x1b, 0x16, 0x12, - 0x6f, 0x5c, 0x19, 0x4a, 0x79, 0x00, 0x50, 0xf4, 0x15, 0xcc, 0x16, 0x3a, - 0xfc, 0x2a, 0x82, 0x28, 0xcb, 0x3c, 0x8b, 0x73, 0xb3, 0xaf, 0x8b, 0xb7, - 0x93, 0x19, 0xab, 0xbc, 0x0e, 0x9a, 0x53, 0xcc, 0x01, 0xf8, 0xbd, 0x70, - 0xd3, 0x69, 0x56, 0x8e, 0x86, 0x26, 0x5f, 0xdf, 0x14, 0xc0, 0x0e, 0x71, - 0x03, 0x5c, 0xcf, 0xa8, 0x16, 0x30, 0x17, 0xb0, 0xc6, 0x73, 0x40, 0x25, - 0x5f, 0xfa, 0x44, 0xa6, 0xd4, 0xde, 0x4f, 0x22, 0x6c, 0xdb, 0x2a, 0x36, - 0x7d, 0x9d, 0xa1, 0x7b, 0x8f, 0x1c, 0xa8, 0x60, 0xca, 0x97, 0xd7, 0x54, - 0xbd, 0x0d, 0x26, 0x80, 0x0e, 0x8f, 0xb9, 0xfa, 0xb4, 0x6a, 0xe6, 0x37, - 0x75, 0xe1, 0x1b, 0xe3, 0xca, 0xb9, 0xc0, 0x9a, 0x41, 0x80, 0x62, 0xcd, - 0x50, 0xd7, 0x08, 0x1f, 0x09, 0xc3, 0xdc, 0xfb, 0x1c, 0xfc, 0x15, 0xc3, - 0xbf, 0x38, 0x81, 0x45, 0x22, 0x19, 0x57, 0x8b, 0xbd, 0x3c, 0xd9, 0x6b, - 0x00, 0xea, 0x47, 0x76, 0x8c, 0xbc, 0xf6, 0x5b, 0x2a, 0xab, 0xef, 0x80, - 0x7a, 0xca, 0xa9, 0xea, 0x88, 0xad, 0x09, 0xfb, 0xd9, 0xac, 0xae, 0xa5, - 0x98, 0xeb, 0x3f, 0x90, 0x62, 0xb2, 0xa3, 0x68, 0x32, 0x91, 0x48, 0xaa, - 0xf5, 0xd9, 0x87, 0xd8, 0x43, 0xd9, 0xca, 0xb2, 0xad, 0x14, 0x61, 0x15, - 0xdd, 0xca, 0x0f, 0xe2, 0x0d, 0x23, 0x7a, 0x59, 0xd7, 0x80, 0x38, 0xb7, - 0x7b, 0xda, 0x0f, 0x04, 0xbf, 0xc4, 0x7c, 0x02, 0xe1, 0x21, 0x55, 0xde, - 0x9b, 0x65, 0x4f, 0xcf, 0xa3, 0xe4, 0xfe, 0x1d, 0xb8, 0xf8, 0x27, 0x5b, - 0xf6, 0xf3, 0xc0, 0xf8, 0xd2, 0x47, 0x3a, 0x16, 0x2e, 0xbf, 0xc2, 0x9d, - 0x2a, 0x88, 0x38, 0x10, 0xbb, 0x47, 0x45, 0xb9, 0xbc, 0x2d, 0x15, 0x0d, - 0x06, 0x25, 0x89, 0xe0, 0xff, 0xe0, 0xde, 0x0d, 0x42, 0xe9, 0xb5, 0x51, - 0x13, 0x9d, 0x53, 0xb2, 0x0b, 0x8e, 0x70, 0xef, 0xa9, 0xda, 0x0c, 0x85, - 0x40, 0x3b, 0xfa, 0x2c, 0x48, 0xd3, 0x7c, 0x12, 0x83, 0x30, 0x6c, 0xdf, - 0x50, 0x40, 0xa3, 0xf3, 0x66, 0x5d, 0xd1, 0x85, 0x63, 0x2a, 0xab, 0x11, - 0x73, 0xf4, 0x94, 0x1d, 0x5f, 0x90, 0x28, 0x4b, 0x4a, 0xca, 0x98, 0xf7, - 0xeb, 0x2b, 0xc3, 0x36, 0x86, 0x7c, 0xa8, 0x1f, 0x1c, 0xf6, 0x5c, 0xa6, - 0xcf, 0xd2, 0x81, 0xe7, 0x78, 0xb4, 0x25, 0x27, 0x69, 0xc9, 0xa9, 0xca, - 0x1f, 0xbe, 0x78, 0xac, 0x62, 0x7e, 0xff, 0x75, 0x5a, 0xaa, 0xee, 0xfb, - 0x6c, 0x1c, 0x5d, 0x17, 0xfd, 0xe9, 0x58, 0x4c, 0xea, 0xb0, 0x16, 0xed, - 0x44, 0xe5, 0xc8, 0x79, 0x01, 0xd0, 0x54, 0xfc, 0x76, 0x4f, 0xbe, 0x57, - 0x0b, 0x71, 0x6b, 0x11, 0x92, 0x4c, 0x9e, 0x66, 0xfb, 0xd3, 0x17, 0xc7, - 0x55, 0xca, 0x73, 0x20, 0x56, 0x5e, 0xd0, 0xb4, 0x04, 0x8e, 0x70, 0x77, - 0x3e, 0x4b, 0x93, 0x3b, 0x28, 0x05, 0xa8, 0x5d, 0x0a, 0xdd, 0x18, 0x25, - 0x7c, 0xcc, 0xa5, 0x21, 0x73, 0x4c, 0x2b, 0x3f, 0x3b, 0xbb, 0x81, 0x62, - 0xaf, 0xb1, 0x16, 0x85, 0x6f, 0x29, 0x7f, 0x74, 0x0b, 0x23, 0xa3, 0x1a, - 0xdc, 0x10, 0xb5, 0xa8, 0x6d, 0x7b, 0xbd, 0x97, 0xcf, 0x6f, 0x6a, 0xe2, - 0x0d, 0x28, 0x29, 0xee, 0x79, 0x7f, 0x19, 0x13, 0x9c, 0xc7, 0xaf, 0x8e, - 0xb7, 0x78, 0x72, 0x87, 0x3e, 0x4b, 0x52, 0xa9, 0x6b, 0x76, 0xdd, 0xcd, - 0xeb, 0xc1, 0x1f, 0x1d, 0x8e, 0xea, 0x67, 0x86, 0x83, 0xe0, 0xe7, 0xcb, - 0xc1, 0x74, 0x2a, 0xc2, 0xaa, 0x4a, 0x8e, 0x05, 0x92, 0x2a, 0x12, 0xdc, - 0xbc, 0x35, 0xd0, 0x05, 0xc8, 0x6c, 0x6b, 0x96, 0x7f, 0x33, 0x23, 0x8d, - 0x1f, 0x77, 0xf1, 0x10, 0x74, 0xce, 0xd1, 0x58, 0x08, 0xf0, 0x79, 0x31, - 0x0d, 0xe4, 0x82, 0x2d, 0xf7, 0x93, 0xa6, 0x2f, 0x7f, 0xc5, 0x6c, 0xd4, - 0xbc, 0xa0, 0x03, 0x10, 0x78, 0xd0, 0x14, 0x2d, 0xbd, 0xbc, 0xe6, 0xcf, - 0x59, 0x78, 0xe8, 0x49, 0xdd, 0x88, 0xaf, 0xcb, 0x63, 0x2a, 0xa5, 0x1d, - 0x74, 0x2a, 0xa5, 0xe7, 0x02, 0x42, 0x2a, 0xbf, 0xa5, 0x2d, 0xc3, 0xa7, - 0x58, 0x99, 0xe9, 0xb8, 0xb7, 0x54, 0xc5, 0x19, 0xd7, 0xf2, 0x7e, 0x8a, - 0x98, 0x66, 0x87, 0xd8, 0xd4, 0xef, 0x6d, 0xff, 0x34, 0x7b, 0x03, 0x1d, - 0xca, 0x1c, 0x30, 0xf8, 0x1f, 0x6f, 0xb3, 0xe9, 0x7b, 0xc0, 0x44, 0xd1, - 0x1a, 0xf6, 0xbd, 0x10, 0xc0, 0xae, 0xaf, 0xf4, 0x5c, 0xca, 0x71, 0x2a, - 0xb2, 0xc0, 0xc6, 0xce, 0x35, 0xc4, 0x87, 0x2c, 0xb8, 0xe9, 0x26, 0x8f, - 0xc7, 0x19, 0x01, 0x13, 0x5f, 0x50, 0x22, 0xab, 0x14, 0x3f, 0xa8, 0x58, - 0x26, 0x9c, 0x48, 0xb5, 0xf4, 0x12, 0x20, 0x41, 0x20, 0x4b, 0x94, 0xc7, - 0xc8, 0xc0, 0x5c, 0x78, 0x18, 0xab, 0xe5, 0xda, 0x24, 0xb0, 0x30, 0x7d, - 0xdc, 0xfc, 0x2d, 0x4c, 0xb2, 0xef, 0x63, 0x8a, 0xb8, 0x40, 0xff, 0x3d, - 0x6c, 0x6d, 0xf9, 0x6f, 0x81, 0x3c, 0x27, 0xa7, 0x27, 0x71, 0xd5, 0x6d, - 0xc1, 0x13, 0x32, 0xbd, 0x41, 0x71, 0x05, 0xbf, 0xd0, 0x8b, 0x24, 0x17, - 0xf1, 0x06, 0x20, 0xfc, 0x50, 0x82, 0x08, 0x11, 0x3a, 0xbd, 0x4e, 0x0a, - 0xc3, 0x32, 0xaa, 0x40, 0x83, 0x81, 0x59, 0x7d, 0x37, 0x39, 0x68, 0xa3, - 0x61, 0xd0, 0x72, 0xc3, 0x27, 0x9d, 0x4d, 0xe7, 0x8f, 0x90, 0x05, 0xa7, - 0x81, 0x8d, 0xcd, 0xb2, 0x36, 0x0b, 0xc7, 0x2e, 0x38, 0xe0, 0x77, 0x42, - 0xdd, 0x0f, 0xf8, 0x4e, 0x7a, 0x49, 0x83, 0xf0, 0x01, 0x97, 0xe0, 0x25, - 0xfd, 0x55, 0x32, 0xa1, 0x60, 0xa1, 0xcd, 0xba, 0x88, 0x88, 0x09, 0x37, - 0x90, 0xae, 0xaa, 0xe7, 0x52, 0x6e, 0x82, 0x1a, 0x38, 0x52, 0x4f, 0xf8, - 0xf5, 0x38, 0x78, 0xd5, 0xd0, 0x0e, 0x67, 0x89, 0xe9, 0x4f, 0x90, 0x1b, - 0x7d, 0x7c, 0x50, 0xfd, 0x9d, 0x97, 0xd5, 0x82, 0x28, 0xd8, 0x4a, 0xe2, - 0xfd, 0x36, 0xd2, 0xdd, 0x0a, 0x10, 0x48, 0xa4, 0x3e, 0x57, 0xf1, 0x1c, - 0x01, 0x7e, 0xaa, 0x2a, 0x59, 0xe1, 0x85, 0x4a, 0xf4, 0x90, 0x26, 0xc4, - 0xd4, 0xc6, 0xa8, 0x3c, 0x26, 0x74, 0xc4, 0x8a, 0xb2, 0x34, 0xd1, 0x24, - 0x38, 0x23, 0x3d, 0x18, 0xb1, 0xcf, 0xc1, 0x3b, 0x0e, 0xbd, 0xfd, 0x22, - 0xd4, 0x3d, 0x4c, 0x9e, 0x7d, 0x18, 0xd1, 0xd7, 0x73, 0xa8, 0x7c, 0x3a, - 0x6c, 0x14, 0x28, 0x7c, 0x60, 0xaa, 0xb3, 0xf9, 0x08, 0xf9, 0xe7, 0x26, - 0x30, 0x1a, 0xf4, 0xed, 0xc0, 0xad, 0xf2, 0x3e, 0xbe, 0x17, 0x2b, 0xd9, - 0x87, 0x9e, 0x4c, 0x15, 0xb6, 0x0a, 0xba, 0x8c, 0x1b, 0x14, 0xd6, 0x3f, - 0xfe, 0x7c, 0x81, 0x35, 0xf2, 0x1e, 0x81, 0x6f, 0x81, 0x56, 0x48, 0xf3, - 0xd3, 0x95, 0x56, 0xa6, 0xd2, 0xbe, 0x85, 0x42, 0x45, 0xa0, 0xdd, 0xbd, - 0x14, 0xd5, 0x27, 0x10, 0x68, 0x9d, 0x71, 0x95, 0x10, 0xbb, 0x78, 0x9a, - 0x16, 0x7a, 0xaa, 0x78, 0x54, 0x1a, 0xae, 0x09, 0x6f, 0x02, 0x17, 0xc0, - 0xba, 0xa4, 0xbf, 0xa6, 0x6d, 0xf4, 0xd3, 0x5c, 0xf4, 0xeb, 0x27, 0x20, - 0xcf, 0xc7, 0xc9, 0xfc, 0xf9, 0x8c, 0x90, 0x60, 0x7c, 0x8e, 0x44, 0x57, - 0xb6, 0xd1, 0x2d, 0x0f, 0x4a, 0x8e, 0xc9, 0x6d, 0x28, 0xeb, 0x5b, 0x69, - 0x38, 0xc2, 0x11, 0xe1, 0x30, 0xf4, 0xd4, 0xa3, 0xd7, 0x61, 0xbb, 0xcd, - 0xa9, 0x73, 0xef, 0x2e, 0xba, 0xe3, 0x50, 0x03, 0x74, 0xaa, 0xd2, 0x9d, - 0x7c, 0xb3, 0xe6, 0x5c, 0x57, 0x97, 0xea, 0x7e, 0x66, 0x68, 0x41, 0xe0, - 0x61, 0x59, 0xd1, 0x48, 0xc9, 0x58, 0xed, 0x55, 0x9e, 0x54, 0xcb, 0x7d, - 0x24, 0x7a, 0x6e, 0x02, 0x41, 0x77, 0xa2, 0x16, 0x56, 0xf2, 0x03, 0x84, - 0xf0, 0x72, 0xd6, 0x9d, 0x1e, 0x2d, 0xa5, 0x63, 0x9d, 0xf2, 0xe1, 0x99, - 0x1a, 0x4f, 0xf7, 0x06, 0x77, 0xc5, 0x4c, 0x6d, 0x5d, 0xfa, 0xfb, 0xbb, - 0xcf, 0x3f, 0xba, 0xd4, 0x1f, 0x38, 0x29, 0x7d, 0x38, 0xad, 0x8b, 0x08, - 0x57, 0x64, 0xfc, 0x4e, 0xef, 0x90, 0x2c, 0xe0, 0xd3, 0xf2, 0xb5, 0x05, - 0xcf, 0x30, 0x23, 0x38, 0xb2, 0xe0, 0xaa, 0x77, 0xfd, 0xc3, 0xcb, 0xf4, - 0x45, 0xa6, 0xec, 0x4f, 0xeb, 0x7d, 0xf7, 0xf7, 0x44, 0x2c, 0xdc, 0xb1, - 0x5e, 0x6d, 0xbf, 0x1e, 0xd7, 0x50, 0x44, 0xdc, 0x3a, 0x45, 0x83, 0x55, - 0x98, 0xf5, 0xb9, 0x43, 0x3a, 0xb5, 0x76, 0x51, 0x92, 0x6c, 0x55, 0x5b, - 0x82, 0x70, 0x03, 0x3f, 0xe7, 0x29, 0x99, 0x63, 0xae, 0x74, 0x46, 0xf2, - 0x22, 0x0a, 0x11, 0x8b, 0x7d, 0x1f, 0xce, 0xe9, 0xc5, 0x25, 0x10, 0xd3, - 0x87, 0xdf, 0xe5, 0x25, 0x7f, 0xad, 0xad, 0xda, 0x2e, 0xcc, 0xb6, 0xbd, - 0x4e, 0xf5, 0x61, 0xaf, 0x11, 0xdf, 0x06, 0x2d, 0x19, 0x56, 0x4e, 0xf8, - 0x06, 0x40, 0xe9, 0x86, 0x63, 0x80, 0x89, 0x7e, 0xb9, 0x1c, 0x28, 0x25, - 0x7f, 0x32, 0x25, 0x33, 0x96, 0x7d, 0xab, 0x67, 0x8f, 0xd2, 0x3c, 0xb7, - 0xd8, 0xb1, 0xfa, 0x76, 0x7a, 0x5f, 0x31, 0x8c, 0x64, 0xab, 0x7d, 0x10, - 0xb9, 0xd0, 0xcb, 0xf1, 0xdf, 0xa1, 0x15, 0x92, 0xda, 0x27, 0x3e, 0xc9, - 0x9b, 0x14, 0x2f, 0xc4, 0xa0, 0xc4, 0x86, 0x7d, 0x92, 0xee, 0x0c, 0x2a, - 0xa8, 0x41, 0x7b, 0xe5, 0xad, 0x00, 0x39, 0xd0, 0x25, 0xbd, 0x70, 0x48, - 0xaf, 0x2b, 0x4d, 0x2b, 0x1e, 0xab, 0xac, 0x36, 0xe0, 0xb7, 0x7f, 0x68, - 0xb9, 0x8b, 0x6b, 0x8a, 0xf9, 0xeb, 0x7e, 0xae, 0xf4, 0x5d, 0xbb, 0xa5, - 0xd5, 0x4b, 0xca, 0xa2, 0xa3, 0x85, 0x24, 0xaf, 0xd4, 0x73, 0xb4, 0x7d, - 0x2c, 0x50, 0x1d, 0xa8, 0x51, 0x11, 0x84, 0x09, 0xb2, 0x2b, 0x82, 0xa9, - 0x8f, 0x4b, 0x5d, 0xce, 0x7b, 0xb7, 0x78, 0x30, 0x6d, 0x60, 0xf8, 0x17, - 0xcf, 0x67, 0x70, 0x68, 0x08, 0x33, 0x71, 0xfe, 0x00, 0xf8, 0x48, 0xec, - 0x51, 0xd4, 0xfe, 0xcc, 0xab, 0xc0, 0xf0, 0x49, 0xc8, 0xb9, 0x05, 0x50, - 0xff, 0x0a, 0x08, 0x73, 0x4d, 0x23, 0xae, 0x24, 0x40, 0x06, 0x86, 0x95, - 0x7f, 0x0e, 0x08, 0x51, 0x70, 0xf7, 0x7a, 0x57, 0x6c, 0xd1, 0x8b, 0xb9, - 0xf4, 0x3f, 0xc4, 0x84, 0x85, 0x6a, 0x93, 0xf2, 0x01, 0x80, 0x37, 0xea, - 0xcd, 0xfc, 0x1b, 0x71, 0xa5, 0x1d, 0x1a, 0x51, 0xfa, 0xdd, 0x95, 0x84, - 0x30, 0x4e, 0xcd, 0x79, 0x21, 0x72, 0x4e, 0xcb, 0x4c, 0x76, 0x5f, 0x18, - 0x47, 0x04, 0xc7, 0x7e, 0xe8, 0x0d, 0xc1, 0x46, 0x13, 0x70, 0x99, 0x05, - 0xfb, 0x5e, 0x3f, 0x48, 0x69, 0x9a, 0x65, 0x2f, 0x05, 0x90, 0xc9, 0x75, - 0x43, 0x9b, 0x14, 0x58, 0x79, 0xb7, 0x74, 0xb4, 0xda, 0x12, 0x1d, 0x14, - 0x54, 0x79, 0x5b, 0xbc, 0x18, 0x55, 0x68, 0x8d, 0x4e, 0x7a, 0x4f, 0xa1, - 0x26, 0xf1, 0xa5, 0x16, 0xa4, 0x8a, 0x88, 0xd7, 0x71, 0x8d, 0xa6, 0x87, - 0x2d, 0xcc, 0xc3, 0xd8, 0x9e, 0xcd, 0xbe, 0xc9, 0x50, 0x24, 0x95, 0xe0, - 0x46, 0xfd, 0x21, 0xb6, 0x84, 0x81, 0x91, 0x46, 0xf2, 0x78, 0xb0, 0x45, - 0x46, 0x5c, 0x6e, 0xff, 0xcd, 0xdb, 0xac, 0xd5, 0x3f, 0x6e, 0x94, 0xc6, - 0x85, 0x9f, 0x6d, 0x6c, 0xaf, 0xaf, 0x2e, 0xec, 0xfd, 0x98, 0x29, 0xe1, - 0x67, 0xa1, 0x9e, 0xd3, 0xc9, 0xd4, 0x80, 0x84, 0x78, 0x68, 0x14, 0x6a, - 0x94, 0x36, 0xa3, 0x08, 0x0b, 0x2a, 0xbd, 0x70, 0xc7, 0xc5, 0x1d, 0x89, - 0xe9, 0xc0, 0xce, 0x91, 0xc7, 0x2b, 0x46, 0x7e, 0x10, 0x3a, 0x99, 0xaa, - 0xc5, 0x14, 0xfc, 0x8f, 0xce, 0xf1, 0x30, 0xef, 0xdb, 0xe5, 0xaf, 0x92, - 0xfc, 0x0b, 0x37, 0x2d, 0x25, 0xb7, 0xba, 0xe9, 0x85, 0x11, 0xa2, 0xb8, - 0x89, 0x7a, 0x04, 0xfd, 0x5b, 0xaf, 0x5b, 0x86, 0xb3, 0xe2, 0xce, 0x4b, - 0x79, 0x31, 0xbf, 0x49, 0xf9, 0xee, 0xac, 0x39, 0xe5, 0x72, 0xf0, 0x16, - 0x51, 0xe2, 0xff, 0x9e, 0x99, 0x28, 0x17, 0x2d, 0x8e, 0x41, 0xb4, 0x2d, - 0xe8, 0xc6, 0x4d, 0x44, 0xe7, 0x7e, 0xdb, 0x59, 0x3c, 0xa6, 0x9e, 0xe7, - 0xca, 0x5c, 0x89, 0xc2, 0xb1, 0x04, 0xd4, 0x79, 0xea, 0xa9, 0x84, 0x60, - 0xc3, 0x94, 0x45, 0x6f, 0xe3, 0xdb, 0x06, 0xed, 0xe5, 0xff, 0x2b, 0xa2, - 0x10, 0xa6, 0xd0, 0x19, 0x15, 0xae, 0x62, 0x4b, 0x29, 0xce, 0x46, 0xc6, - 0xbb, 0x6e, 0x8a, 0xee, 0x9c, 0xb4, 0x0c, 0x3b, 0xa2, 0x00, 0x3c, 0xfd, - 0x02, 0xf2, 0x22, 0xfa, 0x42, 0x82, 0xa3, 0x8c, 0x93, 0x6a, 0xd1, 0xd2, - 0xaa, 0x77, 0xff, 0x64, 0xbc, 0xa9, 0x3a, 0x8f, 0x4e, 0xb5, 0xc9, 0x15, - 0x4d, 0x00, 0xf2, 0xc8, 0x14, 0xa5, 0xe3, 0xd0, 0x38, 0x1c, 0xc0, 0xd2, - 0x55, 0x4d, 0x11, 0x56, 0xd7, 0x20, 0xdf, 0x85, 0x41, 0x1f, 0x85, 0x69, - 0x0f, 0xba, 0x6a, 0x21, 0x58, 0x7c, 0xc8, 0x05, 0x32, 0xaa, 0xef, 0xbe, - 0xc5, 0x83, 0x74, 0x01, 0xab, 0xc2, 0x85, 0xf0, 0x5b, 0xf1, 0x15, 0x3d, - 0xbd, 0x07, 0x3b, 0x15, 0x2f, 0xcc, 0x28, 0xbd, 0xc4, 0x75, 0x16, 0x39, - 0x67, 0x40, 0x69, 0x27, 0x3b, 0x8b, 0x14, 0x24, 0x69, 0x4d, 0xa4, 0x98, - 0xf2, 0x8c, 0x1e, 0x2a, 0x72, 0x6f, 0xcc, 0xeb, 0x3d, 0xba, 0xcc, 0x57, - 0x61, 0x08, 0xf3, 0xc7, 0xf6, 0x53, 0xe9, 0x30, 0xb3, 0x7d, 0x71, 0x08, - 0x1d, 0x45, 0xf3, 0x3e, 0xa0, 0xe4, 0xef, 0xd6, 0x56, 0xd0, 0x39, 0x7c, - 0xc7, 0x4b, 0x30, 0x37, 0x7b, 0x0f, 0x3e, 0x0b, 0x6a, 0xe0, 0x86, 0x01, - 0xac, 0xca, 0xf6, 0xdd, 0xad, 0x71, 0x6f, 0x54, 0xd4, 0xa9, 0x61, 0x8e, - 0x80, 0x6f, 0x0e, 0xcb, 0xa3, 0x41, 0xd5, 0xe7, 0xfc, 0x8c, 0x44, 0xda, - 0x32, 0x47, 0xd5, 0x43, 0xf2, 0x69, 0x7e, 0xbe, 0x18, 0x9c, 0xe0, 0xa6, - 0x0f, 0x74, 0xa5, 0x9b, 0xb6, 0x6d, 0xaf, 0xe9, 0xdb, 0x18, 0x00, 0x4b, - 0xcc, 0x76, 0xd8, 0xd6, 0xea, 0xaf, 0xc0, 0xc9, 0xdb, 0xcf, 0xe5, 0xb7, - 0x73, 0x25, 0xd1, 0x27, 0xe3, 0x2a, 0x1f, 0xf0, 0x63, 0x3b, 0x67, 0x63, - 0x36, 0xfd, 0x7f, 0x0b, 0xa4, 0xf0, 0x1e, 0x5f, 0xf7, 0x6c, 0xd9, 0x32, - 0xc8, 0xda, 0x4c, 0xb8, 0x90, 0x46, 0x13, 0x83, 0xe7, 0x45, 0xf5, 0x15, - 0x31, 0x15, 0xfa, 0xe1, 0x07, 0x35, 0x5c, 0x53, 0x90, 0xe4, 0xb8, 0x48, - 0x95, 0xd5, 0xe1, 0xb2, 0x65, 0x8a, 0x70, 0x90, 0x7a, 0x11, 0x90, 0x5b, - 0x66, 0x75, 0x09, 0x75, 0x4c, 0x48, 0xa1, 0x58, 0x6a, 0x51, 0xb0, 0x23, - 0x02, 0xab, 0x4d, 0x0c, 0xdf, 0xfa, 0xc2, 0x8f, 0xa0, 0x6e, 0xcc, 0x90, - 0xfe, 0xe9, 0xd5, 0x30, 0x38, 0x1c, 0xaf, 0x3f, 0x10, 0xde, 0xdc, 0xd4, - 0x76, 0x04, 0x38, 0x5b, 0x05, 0x76, 0x3e, 0xc3, 0x71, 0xd3, 0x8a, 0x54, - 0x14, 0x17, 0x6a, 0x6c, 0xda, 0xb6, 0x0c, 0x30, 0x8b, 0xb8, 0x24, 0x49, - 0x03, 0x7d, 0x0c, 0xcd, 0x09, 0xb1, 0x22, 0x0c, 0x5e, 0xf8, 0xba, 0xa1, - 0x12, 0xb0, 0x71, 0x92, 0xf4, 0x04, 0xaa, 0x02, 0x3a, 0xd2, 0x47, 0x29, - 0x66, 0xf7, 0x4b, 0xcd, 0x07, 0xfb, 0xf0, 0x65, 0x3f, 0x04, 0xa8, 0x6b, - 0x36, 0x50, 0x0c, 0x0c, 0x0c, 0xa3, 0x08, 0x27, 0x58, 0x26, 0xd1, 0xa6, - 0xa2, 0x33, 0xba, 0x7d, 0x2f, 0x2c, 0xab, 0xc8, 0xe8, 0x8d, 0xdd, 0x85, - 0xec, 0x0a, 0xe7, 0xc0, 0xc3, 0xa0, 0x86, 0x2a, 0xca, 0x89, 0x55, 0x06, - 0xe6, 0xad, 0x99, 0x47, 0x99, 0xe1, 0x46, 0xb7, 0xf7, 0xd0, 0xba, 0x5d, - 0x84, 0x69, 0xdd, 0x15, 0x16, 0x51, 0x83, 0x11, 0xb8, 0x68, 0xb3, 0x5c, - 0xda, 0xf6, 0x09, 0x1a, 0x4f, 0x36, 0x64, 0xda, 0x93, 0xb9, 0xfa, 0xa0, - 0xa9, 0x5a, 0xb6, 0xdb, 0xb4, 0xf6, 0x80, 0x1d, 0x31, 0xfd, 0xfd, 0xc0, - 0x31, 0xf8, 0x19, 0xa0, 0xeb, 0x36, 0x67, 0x37, 0xc4, 0xca, 0x53, 0x5e, - 0xaa, 0x38, 0x2d, 0x53, 0xfc, 0x6d, 0x80, 0x2e, 0xdf, 0x67, 0x5f, 0xc8, - 0x43, 0xac, 0x83, 0xd0, 0xb1, 0xc2, 0xcf, 0x5b, 0x26, 0x65, 0x5c, 0x2d, - 0xb7, 0x26, 0x9d, 0xc8, 0xe7, 0x25, 0xdb, 0xf2, 0x7c, 0x1e, 0xbc, 0x76, - 0x1c, 0x92, 0xa3, 0xdc, 0xf8, 0xb9, 0x3f, 0xb9, 0xd7, 0x52, 0xad, 0xc8, - 0x4b, 0xe3, 0x68, 0x31, 0x7f, 0x92, 0x5c, 0xd9, 0x5a, 0x06, 0xc9, 0xc4, - 0x20, 0xe2, 0x6d, 0x5a, 0x1c, 0x65, 0x53, 0xe4, 0x5a, 0x9f, 0x0e, 0x7a, - 0xd3, 0x4c, 0xfa, 0xd2, 0x86, 0x7e, 0x98, 0x78, 0xde, 0x15, 0x33, 0x83, - 0x82, 0x36, 0x47, 0xd7, 0x1f, 0x15, 0x64, 0x27, 0xd4, 0xf3, 0x8a, 0x16, - 0x0e, 0x4e, 0x43, 0xba, 0x1e, 0x28, 0x3d, 0x2d, 0x4b, 0x93, 0xeb, 0xc2, - 0xc6, 0xc6, 0xda, 0x90, 0x55, 0x20, 0x7c, 0xa8, 0xa0, 0x18, 0x7b, 0x1d, - 0xb1, 0x34, 0x3b, 0x84, 0x5b, 0xbd, 0xf8, 0xa3, 0xa7, 0x9a, 0x99, 0xde, - 0x18, 0x99, 0xf2, 0x76, 0x31, 0x37, 0x93, 0xeb, 0x15, 0xa5, 0x86, 0x89, - 0xa3, 0x9a, 0x4a, 0xc7, 0x1c, 0x9b, 0xd0, 0x2e, 0xc1, 0x2c, 0x5b, 0xe5, - 0xce, 0xcd, 0xb4, 0x57, 0xef, 0xb8, 0x88, 0x9b, 0x25, 0x52, 0x22, 0xad, - 0xbc, 0x82, 0x9d, 0xce, 0x0f, 0x24, 0xbf, 0x38, 0x99, 0x2e, 0xbf, 0xe9, - 0x38, 0x69, 0x6d, 0x6b, 0xb2, 0x62, 0x29, 0xcf, 0x07, 0x32, 0x97, 0xea, - 0x11, 0xeb, 0x71, 0x37, 0x04, 0xa5, 0xd8, 0xe3, 0x6f, 0x8d, 0x3b, 0xb2, - 0x30, 0x20, 0xc7, 0x56, 0x3b, 0x70, 0xf6, 0xcd, 0x38, 0x53, 0x3a, 0x28, - 0xab, 0x48, 0x18, 0xf6, 0x3c, 0x7d, 0x04, 0x98, 0x7d, 0xb7, 0xf9, 0x98, - 0x16, 0x3e, 0xb9, 0x19, 0x08, 0x1b, 0x71, 0xaa, 0x35, 0x7b, 0x8c, 0x7f, - 0x70, 0x1d, 0x11, 0x91, 0x24, 0xc8, 0xed, 0x4f, 0x77, 0x4a, 0xd8, 0x1d, - 0xfb, 0x5f, 0x49, 0x78, 0xd6, 0x9f, 0xd2, 0x4f, 0xc5, 0x98, 0x74, 0xae, - 0x2f, 0x8f, 0x8a, 0x3c, 0xac, 0xfc, 0x39, 0xe7, 0x93, 0x55, 0x6e, 0x51, - 0xf7, 0x60, 0xcf, 0xb6, 0xc4, 0x21, 0x45, 0x22, 0xbb, 0x3d, 0x1c, 0x83, - 0x03, 0xa3, 0x5a, 0xa7, 0x5f, 0xd4, 0xef, 0xc2, 0xe5, 0x40, 0x3c, 0x20, - 0xef, 0x76, 0x5d, 0x28, 0x75, 0x8c, 0x90, 0x0a, 0x23, 0xce, 0x2c, 0xf4, - 0xdd, 0x26, 0xb0, 0xe8, 0x22, 0xc2, 0x6a, 0x88, 0x66, 0x39, 0xf3, 0x7a, - 0xd0, 0xdf, 0x8c, 0x7c, 0xc2, 0x1f, 0x19, 0xa4, 0xb7, 0x1f, 0x71, 0x01, - 0x7f, 0x1f, 0x1b, 0x11, 0xcc, 0x20, 0x92, 0xc4, 0x41, 0x4d, 0x4c, 0x34, - 0x23, 0xc8, 0x74, 0x31, 0xa5, 0x57, 0xd1, 0xaa, 0x39, 0x09, 0x89, 0xab, - 0x20, 0x24, 0xb9, 0x25, 0x20, 0x41, 0x85, 0xe1, 0x59, 0xf8, 0xbf, 0x89, - 0x21, 0xc0, 0x55, 0xb3, 0x5f, 0x8e, 0xff, 0xae, 0xe1, 0x00, 0xcd, 0xd5, - 0xbc, 0xd1, 0x9b, 0x50, 0x3b, 0x52, 0xea, 0x26, 0xac, 0x55, 0x09, 0xc2, - 0x1c, 0x4c, 0x2f, 0x06, 0x7c, 0x08, 0x97, 0x0b, 0x4c, 0x19, 0x75, 0x7b, - 0x85, 0xff, 0x08, 0x76, 0xfe, 0x11, 0x7d, 0x1f, 0x44, 0xc1, 0x55, 0x86, - 0xba, 0x87, 0x0e, 0x1f, 0xcc, 0x3d, 0xfa, 0x42, 0xe8, 0xad, 0x4d, 0xb8, - 0xd5, 0x41, 0x38, 0xde, 0xe7, 0x75, 0xf2, 0x93, 0x39, 0xf4, 0x87, 0x4b, - 0xcd, 0x53, 0xe0, 0xf0, 0x65, 0x62, 0x2c, 0x05, 0xe2, 0x18, 0x48, 0x0a, - 0x9a, 0x4e, 0x9e, 0x9a, 0xa8, 0x71, 0x4c, 0xdf, 0x0f, 0x7f, 0xb2, 0x3e, - 0x83, 0x6c, 0xe6, 0x38, 0xf8, 0x63, 0xf1, 0x66, 0x24, 0x69, 0x83, 0xeb, - 0x58, 0x5c, 0xaa, 0x7f, 0x0b, 0x5c, 0x95, 0xb4, 0x6f, 0x03, 0xec, 0xe4, - 0xee, 0x3a, 0x3d, 0x03, 0xf6, 0xbd, 0x57, 0xdf, 0xba, 0x67, 0xe9, 0xbf, - 0x9a, 0x53, 0x2b, 0xb4, 0xb5, 0xe6, 0x40, 0x39, 0xba, 0x88, 0xf2, 0x15, - 0x08, 0x35, 0x57, 0x26, 0x02, 0x6b, 0x44, 0xa8, 0x97, 0x1e, 0x59, 0xd5, - 0xea, 0x52, 0x8f, 0x6a, 0xa0, 0x95, 0x04, 0x4a, 0x70, 0x89, 0x5d, 0x29, - 0x7f, 0xc2, 0x7e, 0xb4, 0xff, 0x67, 0x7e, 0x02, 0x23, 0x59, 0x73, 0x99, - 0xd2, 0xca, 0xf9, 0x29, 0x69, 0xb4, 0x1f, 0xaf, 0xc5, 0xc4, 0x7b, 0xa4, - 0x4b, 0xf6, 0x5c, 0xa1, 0x06, 0xe2, 0x97, 0xa1, 0xd5, 0x49, 0xa1, 0xe3, - 0xc1, 0xae, 0x80, 0x4a, 0x8b, 0xad, 0x92, 0xa9, 0x0a, 0xe5, 0xcb, 0xf9, - 0x2f, 0xc3, 0x92, 0x50, 0xdc, 0xf5, 0x26, 0xaf, 0x24, 0x88, 0x11, 0x58, - 0xb9, 0x02, 0x9e, 0x61, 0xa4, 0x9f, 0x4c, 0x92, 0x97, 0xd6, 0x8a, 0x5d, - 0x60, 0x05, 0xd7, 0x54, 0x95, 0xb9, 0x5c, 0x48, 0x26, 0x38, 0xd0, 0x45, - 0x6a, 0xb3, 0xf4, 0xa3, 0x9c, 0x38, 0xe0, 0x7d, 0xa8, 0x52, 0x62, 0xb2, - 0x1f, 0x10, 0x78, 0x8f, 0x6b, 0x5a, 0xc4, 0x55, 0xcb, 0x63, 0x95, 0x34, - 0x54, 0xf6, 0x45, 0x49, 0x8b, 0x3b, 0xd7, 0x3d, 0x88, 0xa0, 0xaf, 0xb6, - 0x5f, 0xb6, 0x42, 0x32, 0xa8, 0xde, 0xb2, 0xf4, 0x1d, 0x60, 0x8e, 0x7a, - 0x7e, 0x99, 0xf0, 0xd0, 0x7f, 0x3d, 0x60, 0xd4, 0xa2, 0x64, 0xd6, 0x96, - 0xb8, 0x0d, 0x24, 0x7b, 0x11, 0x8f, 0xff, 0xdf, 0xe6, 0x0b, 0xd5, 0xb1, - 0x23, 0x93, 0x92, 0x9b, 0xc3, 0xd2, 0xf8, 0x63, 0x1d, 0x70, 0x20, 0x34, - 0x2f, 0x04, 0xbc, 0x9e, 0x57, 0x2e, 0x61, 0xdf, 0x20, 0x55, 0xda, 0xca, - 0x39, 0x39, 0x20, 0x47, 0x86, 0x0f, 0x53, 0xe9, 0x3e, 0x81, 0x5c, 0x20, - 0xbb, 0x57, 0x44, 0x1e, 0x3e, 0xce, 0x83, 0xd1, 0x35, 0x99, 0x80, 0x4f, - 0x35, 0xc2, 0xb1, 0x9f, 0xbd, 0x9e, 0x2c, 0x88, 0x28, 0x0b, 0xe2, 0xed, - 0x5f, 0x11, 0x37, 0x6e, 0xaa, 0xef, 0x8e, 0x9c, 0x0f, 0x8a, 0x25, 0x62, - 0x39, 0xc8, 0x15, 0x0c, 0xf7, 0xce, 0xe1, 0x6e, 0x27, 0x2e, 0xcb, 0xfb, - 0x93, 0xf3, 0x9f, 0x8b, 0xb1, 0x07, 0x7e, 0x2b, 0xb0, 0x99, 0x22, 0x83, - 0xa4, 0x67, 0x1b, 0x4e, 0xb8, 0x56, 0xd9, 0x15, 0x48, 0xdc, 0xff, 0xd6, - 0x4f, 0x1d, 0x6c, 0xf9, 0x17, 0x34, 0x66, 0x8e, 0xa5, 0xb6, 0x2a, 0x02, - 0xbc, 0x9b, 0x19, 0xb7, 0xb3, 0x58, 0x27, 0xd0, 0x1a, 0x17, 0x1d, 0x98, - 0xc3, 0x87, 0x64, 0xf3, 0x55, 0x3a, 0x9d, 0x15, 0x76, 0xe7, 0xcd, 0x2e, - 0x68, 0x85, 0xc8, 0x42, 0x91, 0x1d, 0xff, 0x3d, 0x7c, 0x97, 0x7b, 0xdf, - 0x2c, 0xe5, 0xb8, 0xaf, 0x1f, 0x89, 0xcc, 0xea, 0xdc, 0x24, 0x57, 0x16, - 0xc9, 0x09, 0xe5, 0xc0, 0xc8, 0xd0, 0xd2, 0x61, 0x3e, 0x13, 0xfb, 0x91, - 0xa8, 0x7a, 0x66, 0x9a, 0x5d, 0x11, 0x24, 0x06, 0x68, 0xb1, 0x0f, 0x74, - 0x77, 0x18, 0xd5, 0x2d, 0x99, 0x80, 0xdb, 0xdb, 0x6e, 0xf9, 0xa6, 0xb1, - 0xe2, 0x7a, 0x6d, 0x49, 0xbc, 0xd1, 0x23, 0xb3, 0x2a, 0xa5, 0x78, 0x05, - 0x18, 0xa9, 0xa3, 0x5e, 0x33, 0x2c, 0x5f, 0x46, 0xa9, 0x78, 0x11, 0x97, - 0xf6, 0xf5, 0xae, 0x40, 0xa9, 0xd4, 0xe1, 0xf0, 0x61, 0xe6, 0xc6, 0xab, - 0x7e, 0x82, 0x05, 0x65, 0xfd, 0xf8, 0xce, 0xd8, 0x5c, 0xc5, 0x44, 0x2c, - 0x0f, 0x67, 0x1c, 0xf2, 0xac, 0x70, 0x90, 0xd3, 0xbc, 0x48, 0xe1, 0x48, - 0x10, 0x03, 0x86, 0x69, 0xa1, 0x0c, 0x53, 0x1e, 0x0f, 0xb7, 0x42, 0xcc, - 0x8c, 0x40, 0xe4, 0xf4, 0x6b, 0x92, 0x80, 0x8e, 0xef, 0xf1, 0x73, 0x95, - 0x71, 0xac, 0x95, 0xbf, 0xcc, 0xff, 0x38, 0x70, 0xb3, 0xfe, 0xf1, 0xdc, - 0xe7, 0x95, 0xfb, 0x3b, 0xea, 0x6d, 0x88, 0xa3, 0x8a, 0x44, 0x55, 0xa1, - 0xd7, 0x85, 0xc8, 0xe7, 0x06, 0x2b, 0x0d, 0x76, 0x1b, 0x92, 0x8a, 0x66, - 0x7d, 0xbf, 0xc3, 0x17, 0x4b, 0xae, 0xbd, 0x89, 0xcd, 0x30, 0x94, 0xe3, - 0x1b, 0x6a, 0xa9, 0x05, 0x9f, 0x61, 0x90, 0xe0, 0x72, 0x1e, 0xb7, 0xa9, - 0x36, 0x2f, 0xa1, 0xa9, 0x79, 0xe1, 0x6d, 0xf5, 0x4c, 0xfb, 0x3b, 0x46, - 0xb5, 0xb0, 0xc6, 0xd7, 0x18, 0x64, 0xdc, 0xd6, 0x00, 0x84, 0x04, 0x6d, - 0x66, 0x88, 0xf8, 0x9f, 0x7d, 0x14, 0xcb, 0xd9, 0x3a, 0xa9, 0x19, 0x16, - 0x68, 0x5e, 0xf3, 0xf3, 0xdf, 0xaf, 0x91, 0xe5, 0x9f, 0x24, 0xc6, 0x55, - 0x52, 0x57, 0x7e, 0xca, 0x39, 0x3f, 0x68, 0x58, 0x50, 0x88, 0x60, 0xae, - 0x4d, 0x80, 0x89, 0x9f, 0xe9, 0xe3, 0x58, 0xf7, 0x07, 0x47, 0x73, 0xe8, - 0x70, 0xa4, 0x12, 0x2c, 0x80, 0x21, 0x12, 0xfd, 0x23, 0xf1, 0x7c, 0x59, - 0x6d, 0x57, 0x1a, 0xb1, 0xba, 0x8a, 0xe9, 0x4e, 0xd7, 0x28, 0xc2, 0x1b, - 0x47, 0xd1, 0x51, 0xd1, 0xfd, 0xd0, 0xb4, 0x64, 0x8d, 0x47, 0x83, 0xe8, - 0xb6, 0x93, 0x4e, 0xd3, 0x61, 0x96, 0xef, 0xc9, 0x23, 0x61, 0x36, 0x88, - 0xf9, 0xe8, 0x75, 0x4c, 0xe1, 0xa8, 0x38, 0x5a, 0x47, 0x75, 0x85, 0x7f, - 0xc1, 0xcb, 0xad, 0xb1, 0x6a, 0x3a, 0xfa, 0x98, 0xa3, 0x9b, 0x03, 0x02, - 0x39, 0x38, 0x4a, 0x28, 0xed, 0xcc, 0x74, 0xe8, 0xee, 0x3b, 0x89, 0xd5, - 0x50, 0x8c, 0x07, 0xaa, 0x4a, 0xbc, 0xcc, 0x41, 0x9a, 0x42, 0x35, 0x3f, - 0x27, 0xe1, 0xdd, 0x56, 0xc2, 0x6c, 0x3b, 0xc0, 0xc9, 0x90, 0xf5, 0x8c, - 0xce, 0x55, 0x37, 0xfb, 0xc3, 0xfe, 0x63, 0x35, 0x2f, 0xc6, 0x16, 0x71, - 0x09, 0x87, 0xb6, 0x2c, 0x15, 0x48, 0xf0, 0xcb, 0xdb, 0x98, 0xb5, 0xa6, - 0x46, 0x78, 0xc2, 0x84, 0xd3, 0x47, 0xac, 0x17, 0xdb, 0x6c, 0xbb, 0x24, - 0xaa, 0xca, 0xd6, 0xd8, 0x0b, 0x77, 0x3c, 0x0d, 0xa3, 0x29, 0x26, 0xc1, - 0xa9, 0x46, 0x5e, 0x3d, 0xc5, 0x0e, 0x9e, 0xcb, 0x30, 0x71, 0xaf, 0x58, - 0xb5, 0x3e, 0x42, 0xef, 0x3e, 0x9a, 0xee, 0x92, 0xbc, 0x5f, 0x89, 0xf8, - 0xec, 0x84, 0x18, 0xb5, 0x4d, 0x1d, 0x86, 0x85, 0x0e, 0xbe, 0xbf, 0xc0, - 0xc2, 0x47, 0xb4, 0xb8, 0x68, 0x35, 0x0b, 0x73, 0xeb, 0x4c, 0xa7, 0x21, - 0x24, 0x49, 0x79, 0x7d, 0x1e, 0xab, 0x84, 0x5c, 0x14, 0xc2, 0x8d, 0xab, - 0x9c, 0xb4, 0x1d, 0x7c, 0xde, 0xca, 0xc2, 0xed, 0xd1, 0x57, 0xc1, 0x5c, - 0x43, 0x84, 0xde, 0xb1, 0xe8, 0x30, 0xe4, 0xe7, 0x53, 0xe7, 0x64, 0xc3, - 0x72, 0x27, 0x69, 0xb3, 0xad, 0x6d, 0xb9, 0x6c, 0xe2, 0x33, 0xc5, 0x6c, - 0x6f, 0x76, 0x70, 0x57, 0x60, 0x85, 0x4a, 0xe3, 0xa1, 0x13, 0xed, 0x43, - 0x21, 0xc8, 0xac, 0x3d, 0xf1, 0x9c, 0x32, 0x1e, 0x4b, 0xd9, 0xbe, 0x86, - 0x97, 0xec, 0x63, 0xf3, 0x86, 0x0d, 0x78, 0x96, 0x7f, 0xea, 0xcd, 0xee, - 0xc8, 0x58, 0xaa, 0x66, 0x99, 0xb3, 0xdc, 0xe0, 0xa0, 0xf2, 0xb1, 0xa3, - 0xa8, 0x70, 0x48, 0x05, 0x34, 0xc7, 0x88, 0x5f, 0x24, 0x53, 0x2a, 0xee, - 0xf7, 0xeb, 0xaa, 0xeb, 0xb0, 0x33, 0x62, 0xac, 0x96, 0x5a, 0xe9, 0x7f, - 0x3d, 0xc4, 0x47, 0xe7, 0x8d, 0xa9, 0xa5, 0x2a, 0xc0, 0x88, 0x81, 0x3b, - 0x61, 0x9e, 0x87, 0x52, 0xb9, 0x55, 0x61, 0x10, 0x05, 0x6b, 0xb6, 0x5f, - 0x25, 0x8b, 0xed, 0xa5, 0x60, 0x61, 0xef, 0x49, 0xfa, 0x5a, 0xbf, 0xfb, - 0x05, 0x34, 0x96, 0xa8, 0xaa, 0x38, 0xb3, 0x21, 0x60, 0x45, 0x7e, 0x47, - 0xc8, 0xe5, 0x05, 0x47, 0x6b, 0xdb, 0xa8, 0x5d, 0x55, 0xdc, 0x9d, 0xb9, - 0x6b, 0x92, 0x4c, 0xd4, 0x26, 0xd1, 0xb5, 0x43, 0x2b, 0x6b, 0xc0, 0x15, - 0x27, 0x33, 0x6c, 0xcf, 0xfe, 0x6f, 0x17, 0x63, 0x99, 0xbd, 0x72, 0x8b, - 0x08, 0x2b, 0x2b, 0x86, 0x4d, 0x9d, 0xd3, 0x50, 0x2a, 0xdb, 0x6e, 0x0d, - 0xdc, 0xb0, 0x0b, 0xf4, 0x92, 0xbd, 0xa6, 0x5c, 0xfa, 0x8c, 0x8b, 0x3e, - 0x96, 0x7e, 0x05, 0x13, 0xed, 0xb9, 0xf2, 0x08, 0xa9, 0x4c, 0xec, 0x96, - 0x1d, 0x7f, 0x9e, 0xfe, 0xdf, 0x5e, 0xd5, 0x6a, 0xb7, 0x48, 0x17, 0x75, - 0xbe, 0x13, 0x3b, 0xd4, 0xba, 0x1d, 0x49, 0x0c, 0x0f, 0x37, 0xc9, 0xf6, - 0x04, 0xac, 0xeb, 0x52, 0x47, 0xbd, 0xd4, 0x81, 0x07, 0x01, 0x1e, 0x5b, - 0x96, 0xe1, 0x02, 0xf7, 0x38, 0x3a, 0xbf, 0x1d, 0x61, 0xbd, 0x27, 0x12, - 0x91, 0xfb, 0x92, 0x1e, 0x3e, 0xf5, 0x71, 0x9d, 0x51, 0x47, 0xaf, 0x2d, - 0xc5, 0xce, 0xfb, 0xbe, 0x3f, 0x13, 0x32, 0x26, 0xae, 0x62, 0x82, 0x0d, - 0x70, 0xe1, 0x4f, 0x43, 0x53, 0xaa, 0xe9, 0x54, 0x6c, 0xd8, 0xa3, 0xda, - 0x2e, 0x21, 0x0a, 0x45, 0x54, 0x25, 0x7d, 0x1f, 0x9d, 0x05, 0x85, 0x76, - 0xcf, 0xb3, 0xa9, 0xdc, 0xf5, 0x91, 0x81, 0xa0, 0x9a, 0xdf, 0x1d, 0x32, - 0xcb, 0xdc, 0x3a, 0x44, 0xff, 0x47, 0xbf, 0xb8, 0xca, 0x96, 0x14, 0xc3, - 0x7a, 0xd5, 0x9b, 0x73, 0x12, 0xbd, 0x3e, 0xe5, 0x17, 0x44, 0x1c, 0xa9, - 0xdd, 0x90, 0xd0, 0x87, 0xa6, 0xcf, 0x4c, 0x93, 0xd0, 0xcb, 0x1b, 0x87, - 0xc2, 0x22, 0x3d, 0x97, 0xca, 0xe2, 0x32, 0x64, 0xe7, 0xd7, 0xa8, 0xaa, - 0x39, 0xe3, 0xb9, 0xf1, 0xd0, 0x02, 0x03, 0x09, 0x42, 0x49, 0xdd, 0x1f, - 0x7a, 0x11, 0x84, 0x9c, 0x0f, 0x79, 0x8c, 0xe6, 0xd7, 0x34, 0x62, 0xf3, - 0x0a, 0xe3, 0xb9, 0x20, 0x02, 0xbe, 0x48, 0xf7, 0x37, 0xca, 0x0d, 0x6e, - 0x10, 0xc5, 0xf8, 0x3f, 0x26, 0x75, 0x13, 0xe4, 0xda, 0x2a, 0x33, 0x51, - 0x84, 0xcf, 0xdf, 0x1c, 0xb3, 0xe2, 0xa8, 0xb2, 0xd5, 0xe0, 0xc2, 0xd5, - 0xca, 0xe8, 0xe0, 0xa9, 0x1c, 0x24, 0x73, 0xb7, 0x20, 0x3f, 0xf0, 0x6c, - 0x70, 0x8e, 0xe8, 0x46, 0x6a, 0x5d, 0x1e, 0x76, 0x86, 0x0a, 0x81, 0xd2, - 0x81, 0x0d, 0x8f, 0xb9, 0xc7, 0xc7, 0x02, 0xb4, 0x35, 0xf2, 0x48, 0x33, - 0xa3, 0x1e, 0x94, 0xf8, 0x36, 0x34, 0x3b, 0xdf, 0x67, 0x85, 0xd8, 0xd3, - 0xe0, 0xfe, 0x8e, 0x26, 0x71, 0x4e, 0x30, 0x84, 0x3e, 0x1a, 0xe5, 0xde, - 0xab, 0x13, 0x31, 0x7d, 0x5b, 0x8d, 0x0c, 0x43, 0x09, 0xe6, 0x6e, 0x67, - 0x21, 0x94, 0x2b, 0x6d, 0xdf, 0x94, 0xf5, 0xe2, 0x48, 0x4e, 0x59, 0xdf, - 0xc7, 0xcd, 0xba, 0x5a, 0x58, 0x3e, 0x97, 0x7b, 0x2f, 0xdd, 0x78, 0xcb, - 0x7e, 0xe4, 0xbe, 0x23, 0x1b, 0x87, 0x04, 0x68, 0xb3, 0x96, 0x37, 0xac, - 0x87, 0x97, 0x52, 0x9d, 0xeb, 0x97, 0xbb, 0xaa, 0x1d, 0x8e, 0xda, 0x65, - 0x22, 0x4b, 0x73, 0xf4, 0xd1, 0xde, 0xac, 0x0c, 0xfc, 0x02, 0x4a, 0xf2, - 0x8b, 0xc8, 0x85, 0x23, 0xa9, 0x00, 0x43, 0xf4, 0x7e, 0xc3, 0xa4, 0x35, - 0x54, 0x94, 0xca, 0xdd, 0x03, 0x2b, 0x79, 0xba, 0x55, 0x76, 0x60, 0x08, - 0x25, 0x9f, 0xfb, 0x59, 0xa7, 0xcd, 0xba, 0xf1, 0xde, 0xa5, 0x35, 0x3f, - 0x48, 0xb1, 0xb5, 0x80, 0xa0, 0x2b, 0x33, 0x05, 0x9a, 0x42, 0x83, 0xcc, - 0x7c, 0xd2, 0x05, 0x01, 0x17, 0x4e, 0x86, 0xd3, 0xe9, 0xeb, 0x16, 0x5c, - 0xdb, 0x59, 0x10, 0x8a, 0xcc, 0x19, 0x89, 0x2e, 0x36, 0x68, 0xd4, 0xa6, - 0x29, 0x04, 0xca, 0x97, 0x44, 0xa1, 0xc6, 0x00, 0xd7, 0x19, 0x14, 0x7f, - 0xdf, 0x0c, 0xc2, 0x94, 0x68, 0x8c, 0x83, 0xb2, 0x7a, 0x01, 0x3c, 0x78, - 0x8a, 0x27, 0xb2, 0xb4, 0x98, 0x39, 0x79, 0xd0, 0xf1, 0x31, 0x8c, 0x55, - 0xa2, 0x14, 0x98, 0x6a, 0x06, 0x84, 0x88, 0x37, 0x70, 0x33, 0xce, 0x20, - 0xcd, 0x1d, 0xae, 0x54, 0xa1, 0x73, 0x92, 0x9c, 0xd4, 0x35, 0x8f, 0x21, - 0x78, 0xc0, 0xf5, 0x44, 0x6d, 0x04, 0xba, 0xd1, 0x22, 0x27, 0x07, 0x9c, - 0xdb, 0xbb, 0xfb, 0x4e, 0xff, 0xcc, 0xcd, 0x68, 0xff, 0xfb, 0x6f, 0x6b, - 0x4d, 0xd9, 0xec, 0x6a, 0x1f, 0xff, 0x6d, 0x46, 0x10, 0x43, 0x78, 0x1d, - 0x2a, 0xe2, 0x1a, 0xe8, 0x62, 0x76, 0xce, 0xd3, 0x0c, 0x97, 0x2c, 0x3a, - 0xb9, 0x93, 0xd9, 0x68, 0x5c, 0xdb, 0xa8, 0xab, 0x2b, 0x53, 0xbc, 0x41, - 0x9b, 0xe4, 0xb6, 0x0c, 0x91, 0x39, 0xcf, 0xaa, 0x9e, 0x7b, 0x21, 0x48, - 0xd6, 0xa4, 0x8b, 0xf9, 0x69, 0xe5, 0x1b, 0x3b, 0xe4, 0x05, 0x81, 0x64, - 0x8e, 0x18, 0x95, 0x27, 0x32, 0xb2, 0x71, 0x9e, 0x4b, 0x1e, 0x21, 0xd3, - 0xd8, 0xd0, 0x8d, 0x3a, 0xd9, 0x4f, 0xbd, 0xd9, 0x89, 0xf8, 0x6e, 0x72, - 0x17, 0x7b, 0xc7, 0x92, 0x91, 0x25, 0x15, 0x0a, 0x50, 0xd5, 0x26, 0x85, - 0xdb, 0x5d, 0xc2, 0x9d, 0xbc, 0x3e, 0xe0, 0x45, 0x7e, 0x64, 0x69, 0x02, - 0xac, 0x8d, 0x79, 0x26, 0x69, 0x00, 0x4b, 0x69, 0xc4, 0x22, 0xd1, 0xe6, - 0xb3, 0x1d, 0xbd, 0x1f, 0x0b, 0xb8, 0xb1, 0x8d, 0xa4, 0x51, 0x95, 0xca, - 0xda, 0x77, 0x50, 0xe7, 0x10, 0x50, 0xa3, 0x4d, 0x39, 0x5e, 0xc7, 0x0a, - 0xc4, 0x36, 0x50, 0x59, 0x7c, 0x30, 0x14, 0x9f, 0xb2, 0x9c, 0x84, 0x9f, - 0xc0, 0x4a, 0xf2, 0xd7, 0x20, 0xd1, 0xa9, 0x53, 0xf5, 0xd2, 0x0e, 0xf6, - 0x48, 0x47, 0xa6, 0x0b, 0x47, 0x9f, 0x44, 0x1e, 0x26, 0x38, 0xaf, 0xb1, - 0x6d, 0xb4, 0x91, 0xab, 0xd5, 0xcb, 0x11, 0x99, 0xae, 0x75, 0x16, 0xe2, - 0x7e, 0x19, 0x75, 0x7d, 0x6e, 0x3e, 0x9b, 0x08, 0xf4, 0x39, 0xa0, 0x91, - 0xef, 0xa4, 0x1e, 0xdb, 0xb8, 0xa6, 0xfb, 0xa4, 0xfd, 0x0e, 0x89, 0x51, - 0xe6, 0x32, 0x90, 0xc3, 0xbb, 0x21, 0x2e, 0x38, 0x8a, 0xb8, 0x70, 0xe4, - 0x97, 0xdf, 0x5e, 0x97, 0xb8, 0x6b, 0xda, 0xf8, 0x89, 0x22, 0x39, 0x68, - 0x38, 0x81, 0x09, 0x79, 0x0a, 0xac, 0x75, 0xde, 0x23, 0x63, 0x27, 0xce, - 0x9b, 0x18, 0x58, 0xae, 0x81, 0x96, 0x20, 0x28, 0x86, 0x75, 0x25, 0x9c, - 0xb0, 0x17, 0xb0, 0x26, 0xde, 0xcb, 0xc0, 0x53, 0xe0, 0xb1, 0x8a, 0x8a, - 0x09, 0x67, 0x6a, 0xa7, 0x76, 0x53, 0x86, 0x22, 0xa8, 0x47, 0x33, 0x4a, - 0x2a, 0xcb, 0x8f, 0x56, 0x05, 0xaf, 0x8f, 0xe8, 0xdb, 0xc6, 0x7e, 0xc2, - 0x76, 0x68, 0xf3, 0xef, 0x7e, 0x4a, 0x26, 0x45, 0xd6, 0x95, 0x58, 0x27, - 0x94, 0x15, 0x5c, 0x6f, 0x92, 0x0b, 0x53, 0x43, 0x2d, 0x19, 0xf7, 0x09, - 0x54, 0xec, 0x97, 0x0e, 0xb4, 0x0f, 0x35, 0x40, 0xe8, 0x27, 0xed, 0x7c, - 0x0e, 0x39, 0xe1, 0x89, 0x26, 0x72, 0xfb, 0xbb, 0x44, 0xf6, 0xf3, 0xb2, - 0xea, 0xa1, 0x6d, 0xd7, 0x8e, 0x9c, 0x40, 0xf8, 0xa9, 0x28, 0xfd, 0x64, - 0xae, 0x9c, 0x6e, 0xd1, 0x8a, 0x5a, 0xc5, 0x06, 0x27, 0x6b, 0xc3, 0xdc, - 0xc0, 0x93, 0x9f, 0x5d, 0xae, 0x89, 0x1a, 0xf1, 0xb0, 0x78, 0xa9, 0x3a, - 0x59, 0xb5, 0xea, 0x30, 0x90, 0x7c, 0x1e, 0x97, 0x9b, 0xd7, 0x47, 0x8f, - 0xcb, 0x20, 0xf1, 0x64, 0x2e, 0x58, 0x5f, 0x12, 0x2f, 0xc2, 0xb4, 0x88, - 0x0a, 0x71, 0x85, 0x37, 0x95, 0xf6, 0x10, 0x8b, 0xb4, 0x52, 0x47, 0x36, - 0x24, 0x52, 0xd6, 0xfe, 0x34, 0xfc, 0xea, 0x73, 0xec, 0x7f, 0xfc, 0x45, - 0x62, 0xdc, 0x75, 0xf0, 0xab, 0x72, 0x89, 0x37, 0x19, 0x61, 0xba, 0xd0, - 0x1a, 0xb7, 0x0a, 0x80, 0x42, 0xd4, 0x8c, 0xb0, 0xef, 0x81, 0x64, 0xe1, - 0x84, 0xa9, 0x5f, 0x68, 0xae, 0xce, 0x1d, 0x54, 0xd1, 0xe3, 0x04, 0xcc, - 0xc2, 0xf3, 0x62, 0x1d, 0x36, 0x59, 0x5e, 0x16, 0x87, 0x6d, 0x59, 0xea, - 0x0b, 0xc2, 0x14, 0x70, 0xa7, 0x50, 0xdb, 0x7a, 0xeb, 0x71, 0x5d, 0xe5, - 0x49, 0x3b, 0x94, 0x66, 0x3b, 0xa3, 0x20, 0x93, 0x6d, 0x3d, 0x22, 0x76, - 0xe0, 0x5f, 0x84, 0xbe, 0x50, 0x66, 0xe6, 0x97, 0x9d, 0xd0, 0x4c, 0x5a, - 0xbb, 0x0e, 0x16, 0x23, 0xfe, 0xa0, 0x29, 0xd5, 0xaa, 0x47, 0xba, 0x16, - 0xc8, 0x13, 0x75, 0x87, 0x1c, 0x0e, 0xbf, 0x7f, 0x5a, 0x3d, 0x77, 0xba, - 0x83, 0x8c, 0x84, 0xb8, 0xc7, 0x86, 0x6f, 0xd6, 0xed, 0x1f, 0xa2, 0x2b, - 0xb0, 0x76, 0x7a, 0x1c, 0xb0, 0x3c, 0xac, 0xb4, 0xc5, 0x2b, 0x58, 0xbf, - 0xc5, 0x35, 0x12, 0x5f, 0x6b, 0xd6, 0x3e, 0x88, 0xba, 0x77, 0xc0, 0x2a, - 0x3c, 0x9a, 0xe4, 0x74, 0x5e, 0xf0, 0x89, 0xe1, 0x6e, 0xc8, 0x3c, 0xd7, - 0x0e, 0x78, 0xe7, 0x6b, 0xca, 0x56, 0x75, 0xee, 0xed, 0x28, 0x85, 0x77, - 0x5b, 0x50, 0x4c, 0x43, 0xc9, 0xdb, 0x5c, 0x2d, 0x8b, 0x7f, 0xe5, 0x4d, - 0xe8, 0x4e, 0xef, 0xb3, 0xce, 0x4a, 0x3d, 0xc6, 0x9d, 0xa9, 0x60, 0xf1, - 0xd3, 0x7a, 0xdc, 0x00, 0x4e, 0x59, 0x16, 0x18, 0xae, 0x25, 0x4e, 0xcf, - 0xf4, 0x0d, 0xa1, 0xa5, 0xdb, 0x6d, 0x86, 0x76, 0x00, 0xb2, 0xf6, 0xbc, - 0x99, 0x22, 0x57, 0x51, 0x75, 0x34, 0x9a, 0xba, 0x04, 0xdd, 0x17, 0xdb, - 0x42, 0x64, 0x3e, 0x84, 0x26, 0x1f, 0x9f, 0x87, 0x65, 0xd4, 0x7e, 0x30, - 0xd9, 0x72, 0x23, 0x09, 0x06, 0xb8, 0x5f, 0x0b, 0xf6, 0x21, 0x66, 0x2c, - 0x4a, 0x18, 0x0b, 0x37, 0x41, 0x8c, 0x60, 0x2f, 0x6f, 0x40, 0xe5, 0x83, - 0x7c, 0x0f, 0x04, 0x49, 0xff, 0x4e, 0x94, 0x10, 0x43, 0xde, 0x0d, 0xce, - 0xae, 0xce, 0x2e, 0xd6, 0x74, 0x67, 0xfa, 0xd0, 0xea, 0xb8, 0x5a, 0x99, - 0x60, 0x17, 0xa1, 0x6f, 0x4b, 0xa7, 0x83, 0x6a, 0x90, 0x11, 0x66, 0x73, - 0x45, 0xef, 0x07, 0x43, 0x4f, 0x65, 0x65, 0xb9, 0x09, 0x4d, 0x04, 0x26, - 0xd5, 0xbe, 0xa6, 0x96, 0x9b, 0x79, 0xb8, 0x45, 0xdd, 0x4a, 0x81, 0x6c, - 0x19, 0xe6, 0xa1, 0x13, 0x89, 0x4b, 0x14, 0xb3, 0x3b, 0xed, 0x47, 0x6f, - 0xc4, 0x4d, 0x23, 0xa2, 0x6d, 0x7d, 0xd1, 0xd5, 0xc5, 0x90, 0x93, 0x04, - 0x82, 0x57, 0x68, 0x8a, 0xf0, 0x80, 0x35, 0xff, 0x5a, 0x20, 0x6f, 0xc0, - 0x01, 0x16, 0x3b, 0x0d, 0xc3, 0x6b, 0x85, 0x1e, 0xd0, 0x7f, 0x99, 0xff, - 0xd1, 0x7f, 0x9b, 0xdb, 0x04, 0x9b, 0x8c, 0x50, 0x53, 0x3a, 0x61, 0xf8, - 0x66, 0x70, 0xad, 0x2d, 0xc7, 0xdc, 0x86, 0x2e, 0x15, 0x68, 0x5c, 0x71, - 0x73, 0x5e, 0xc9, 0x5f, 0x4c, 0xf4, 0x74, 0x0c, 0x58, 0xb8, 0xe4, 0xe5, - 0x47, 0x27, 0x1a, 0x1c, 0x44, 0xa6, 0xc6, 0xf7, 0x03, 0x3e, 0x8c, 0xff, - 0x48, 0x3c, 0xd8, 0xa2, 0x62, 0x95, 0x95, 0x4e, 0x64, 0x1e, 0xba, 0x2d, - 0x81, 0x33, 0x1c, 0x18, 0xb5, 0x4d, 0xdd, 0xee, 0xc6, 0x29, 0xd7, 0xa8, - 0x92, 0x28, 0x74, 0x88, 0x0a, 0xf1, 0xfd, 0x86, 0x15, 0xe7, 0x7e, 0x90, - 0xeb, 0x1d, 0xb1, 0x6a, 0xfd, 0xa9, 0xed, 0xdd, 0xf8, 0xf7, 0x13, 0x77, - 0x39, 0x1f, 0xad, 0x3a, 0xce, 0x77, 0x49, 0x2f, 0x5d, 0x8c, 0x56, 0x00, - 0xd3, 0x2a, 0x32, 0xc3, 0xec, 0xdf, 0x32, 0xd5, 0xf3, 0x6d, 0x22, 0x1a, - 0x05, 0x68, 0x1c, 0x1a, 0x85, 0x17, 0xf6, 0xad, 0xbb, 0x78, 0x03, 0xd0, - 0x9b, 0x1d, 0x3f, 0x22, 0x24, 0x7c, 0xed, 0x7e, 0xcc, 0x29, 0xdc, 0xfc, - 0x69, 0x95, 0x78, 0xe0, 0x5d, 0xad, 0xa8, 0x25, 0x57, 0x8a, 0x35, 0x1a, - 0x6f, 0x92, 0xbd, 0x3f, 0x2a, 0x1b, 0x99, 0xe6, 0x05, 0x8a, 0x70, 0x9e, - 0x95, 0x8d, 0xf4, 0x7e, 0x20, 0x9b, 0xbe, 0x9e, 0x75, 0x8b, 0x53, 0xaf, - 0x6c, 0x5c, 0xd3, 0x76, 0x9c, 0x8e, 0x0b, 0x17, 0x1e, 0x3f, 0x42, 0x2c, - 0xfd, 0xd8, 0xbc, 0x72, 0xef, 0xef, 0xc4, 0xe1, 0xc6, 0x5c, 0x9d, 0x53, - 0x20, 0x7c, 0xf2, 0x3f, 0x45, 0x4b, 0xb8, 0xa9, 0xf4, 0x5c, 0x98, 0x3e, - 0x57, 0x76, 0x36, 0x9f, 0x82, 0xc8, 0xe7, 0x80, 0x05, 0x72, 0x95, 0x10, - 0x1a, 0xce, 0x84, 0x2b, 0xca, 0xe7, 0x37, 0x13, 0xee, 0x31, 0xaf, 0x40, - 0x34, 0xa4, 0x37, 0x9c, 0x60, 0x83, 0x3e, 0x3f, 0xb6, 0x3d, 0xe7, 0x5a, - 0x01, 0x58, 0x1a, 0x7c, 0xd6, 0x5c, 0xf3, 0x4c, 0xc2, 0x72, 0xb3, 0xcf, - 0x29, 0x01, 0x9d, 0x48, 0xaf, 0x9c, 0x59, 0x93, 0x6c, 0x3c, 0x4c, 0x62, - 0x18, 0x5e, 0x2c, 0x0c, 0x6f, 0x61, 0xbd, 0xc2, 0x0e, 0xc2, 0x61, 0x05, - 0xdf, 0xd3, 0xfc, 0xa7, 0x8a, 0x16, 0xfd, 0xb8, 0xfb, 0x5c, 0x88, 0x49, - 0xd7, 0xee, 0xcf, 0x78, 0x60, 0xc8, 0x63, 0x2e, 0x2f, 0x95, 0x85, 0xd5, - 0x16, 0x3d, 0xcd, 0xa2, 0x90, 0x63, 0xd3, 0x7a, 0xa5, 0x5d, 0x88, 0xae, - 0xfe, 0xf4, 0xa7, 0x69, 0x79, 0xee, 0x83, 0x43, 0x53, 0xf4, 0xe5, 0x56, - 0x57, 0x74, 0x73, 0xa9, 0x5f, 0x44, 0x51, 0x71, 0xde, 0x7d, 0xd1, 0xd4, - 0xa3, 0x43, 0x45, 0x76, 0x88, 0xc2, 0xff, 0xf4, 0xb6, 0x97, 0x88, 0xa2, - 0xa3, 0xae, 0xd3, 0x98, 0xc3, 0x99, 0x86, 0x7a, 0x83, 0xba, 0x66, 0x67, - 0x5c, 0xbf, 0xd4, 0xa0, 0xde, 0x27, 0x62, 0x92, 0x66, 0xa9, 0x87, 0x41, - 0xc1, 0x0f, 0x40, 0x92, 0x05, 0x39, 0x1d, 0xe4, 0x52, 0xe5, 0x5d, 0x7c, - 0x90, 0xfe, 0x84, 0x7b, 0xa4, 0xd2, 0xe3, 0x04, 0x23, 0x48, 0x75, 0xba, - 0x22, 0xf7, 0x38, 0x9f, 0xb3, 0x64, 0x95, 0xec, 0x31, 0x7f, 0x23, 0x0b, - 0x5a, 0x49, 0xe9, 0xca, 0x41, 0x35, 0xed, 0x6a, 0xd9, 0x69, 0x3f, 0x2d, - 0x30, 0x4d, 0x5c, 0xd1, 0x03, 0xfd, 0x1b, 0xe0, 0x45, 0x06, 0x3b, 0x6b, - 0x63, 0x72, 0x82, 0x39, 0x1e, 0xcc, 0xd3, 0x47, 0x98, 0x57, 0x7c, 0xdd, - 0x4d, 0x6e, 0x98, 0x28, 0x82, 0x54, 0x57, 0xed, 0x44, 0x22, 0x6f, 0x31, - 0xe1, 0xae, 0x6e, 0x76, 0x9a, 0x32, 0xbc, 0x0a, 0x58, 0xa5, 0xc1, 0xa3, - 0x6a, 0x7f, 0xa0, 0x20, 0x30, 0x0a, 0xa6, 0xd0, 0x1a, 0x14, 0xb0, 0xe4, - 0x0b, 0xc2, 0xb9, 0x38, 0x04, 0x2d, 0x17, 0x9d, 0xda, 0x11, 0xe4, 0x3f, - 0x79, 0x4d, 0x16, 0xf5, 0xc9, 0x03, 0x02, 0x84, 0x5b, 0xe5, 0x53, 0x5e, - 0x71, 0x0b, 0x39, 0x11, 0x3d, 0x16, 0x95, 0xfb, 0xef, 0x81, 0x71, 0x03, - 0xc8, 0xa6, 0xaf, 0x61, 0x66, 0x41, 0x50, 0x0f, 0x34, 0x97, 0x84, 0xd3, - 0xce, 0xc5, 0x85, 0xae, 0xba, 0x55, 0x5c, 0x0a, 0xde, 0x3b, 0x96, 0xc2, - 0xea, 0xee, 0x18, 0x50, 0xd0, 0x44, 0xaf, 0x12, 0xa5, 0xe0, 0x59, 0xa7, - 0x22, 0x94, 0x83, 0x58, 0x54, 0xfe, 0x8e, 0xcc, 0x6a, 0x72, 0xa2, 0x0e, - 0x4d, 0x47, 0x8a, 0xda, 0x44, 0xca, 0x25, 0x63, 0xe8, 0x16, 0x63, 0xcd, - 0x87, 0x3b, 0x4c, 0x0f, 0x3e, 0xeb, 0xf5, 0xed, 0xa0, 0x40, 0xf2, 0x81, - 0x3a, 0xcb, 0x07, 0x03, 0xd4, 0xb9, 0xac, 0xd1, 0xa4, 0x59, 0xe8, 0xef, - 0x78, 0xb7, 0x7e, 0x32, 0xcd, 0x45, 0xde, 0xd8, 0xdf, 0xf1, 0xbf, 0x1e, - 0x1a, 0xfe, 0xae, 0x4a, 0x55, 0xe5, 0x03, 0xa8, 0xf7, 0xe9, 0xa9, 0x3d, - 0x89, 0xcd, 0x75, 0x2a, 0x90, 0x1d, 0x2e, 0x10, 0xbd, 0x3f, 0xf8, 0x37, - 0x0c, 0xb3, 0xa0, 0xab, 0xc7, 0xfc, 0x89, 0xdd, 0x54, 0x28, 0x77, 0x23, - 0x3c, 0x11, 0x37, 0x87, 0x06, 0x3a, 0x14, 0x05, 0xae, 0xb8, 0xfb, 0x81, - 0x4d, 0x96, 0xf7, 0x2f, 0xf8, 0x8d, 0x3b, 0xf2, 0x52, 0x15, 0x49, 0x2c, - 0xd1, 0x62, 0x94, 0x91, 0x33, 0xa2, 0x04, 0x4f, 0xf0, 0xc3, 0x9d, 0x4f, - 0x68, 0x01, 0x2a, 0x1f, 0xfa, 0x18, 0xda, 0x69, 0xd9, 0x8f, 0x26, 0xfc, - 0x15, 0x77, 0x8d, 0xa4, 0x3c, 0xfa, 0xd9, 0x4b, 0x34, 0x97, 0x27, 0xc7, - 0xef, 0x76, 0x63, 0x3a, 0x96, 0xf0, 0x59, 0x3a, 0xe7, 0xc7, 0xfd, 0x6e, - 0xde, 0x04, 0x0c, 0x14, 0x3e, 0x80, 0xf8, 0xe1, 0x98, 0xed, 0x41, 0x1c, - 0x30, 0xee, 0x8c, 0x63, 0xa8, 0xd0, 0xee, 0x8a, 0x44, 0xd3, 0x29, 0xc3, - 0x29, 0x26, 0x60, 0xf1, 0x75, 0x5c, 0xc3, 0x99, 0x44, 0x4f, 0xff, 0xc5, - 0xe6, 0xdd, 0x6d, 0x78, 0x16, 0x45, 0x10, 0x7f, 0x65, 0x0c, 0xa0, 0xea, - 0x47, 0xfa, 0x07, 0x94, 0x9e, 0xc3, 0xee, 0x47, 0x8d, 0xc8, 0xee, 0x9d, - 0x05, 0x10, 0x30, 0x9f, 0x9a, 0x85, 0xf6, 0xd8, 0x0d, 0x17, 0x89, 0xd6, - 0x09, 0xe0, 0x85, 0xb6, 0x59, 0x73, 0xbb, 0x68, 0x07, 0xe8, 0xd7, 0x63, - 0x7c, 0xdc, 0x37, 0x46, 0xfa, 0x7b, 0x79, 0x4f, 0x1c, 0x98, 0xf5, 0x3c, - 0x7c, 0xf2, 0x2f, 0x81, 0xaa, 0xeb, 0x16, 0x25, 0x26, 0x24, 0x97, 0x10, - 0x5c, 0x24, 0xbf, 0x58, 0xd3, 0x0c, 0xf6, 0x05, 0x4b, 0xa9, 0xf2, 0xd0, - 0x49, 0x9e, 0xf9, 0xab, 0x66, 0x19, 0x8f, 0xda, 0x1b, 0xef, 0xdc, 0xec, - 0xa6, 0xca, 0x3e, 0x29, 0x4f, 0x73, 0x67, 0x6c, 0x2a, 0x21, 0x84, 0xca, - 0x00, 0x4f, 0x80, 0xcc, 0xbb, 0xe9, 0x77, 0xbe, 0x0f, 0x4e, 0xc5, 0xed, - 0x59, 0x6e, 0x2f, 0x5c, 0x04, 0x9e, 0x5b, 0x76, 0xd2, 0xba, 0x70, 0x55, - 0x31, 0x1b, 0xf7, 0xe9, 0xde, 0x98, 0x74, 0x34, 0xde, 0x79, 0x2c, 0x6f, - 0xba, 0x9b, 0x7d, 0xe4, 0x5d, 0x36, 0x13, 0x71, 0x88, 0x6e, 0xca, 0x15, - 0xa3, 0xf4, 0xc5, 0xed, 0x54, 0x29, 0x11, 0xcd, 0x46, 0xdd, 0xeb, 0xa6, - 0x18, 0x7a, 0xcd, 0xb3, 0x14, 0xdc, 0x3f, 0x5c, 0x04, 0xd0, 0xcd, 0xc3, - 0xbd, 0x36, 0xc0, 0x1c, 0x9f, 0xce, 0x31, 0x19, 0xbc, 0x23, 0x44, 0x03, - 0x0e, 0xc1, 0xd3, 0xdf, 0x3d, 0x92, 0x3b, 0x0f, 0xb3, 0x19, 0x71, 0x85, - 0xea, 0xde, 0xcb, 0x41, 0x4c, 0xfc, 0xef, 0xfe, 0x11, 0x74, 0x0d, 0xa4, - 0xbb, 0x03, 0xc9, 0xda, 0x2c, 0xce, 0x48, 0x9e, 0x9e, 0x62, 0x91, 0x0a, - 0x37, 0xff, 0x4e, 0x94, 0xe1, 0xd9, 0x6c, 0xa6, 0xf8, 0xa4, 0x09, 0xeb, - 0x60, 0xa8, 0x4a, 0x20, 0x62, 0x4e, 0x8a, 0x58, 0xc7, 0xfe, 0xa4, 0xff, - 0xd8, 0x7d, 0xd8, 0xba, 0x6a, 0xe2, 0xd8, 0x1d, 0x40, 0x03, 0x61, 0x80, - 0x68, 0x36, 0x2c, 0x1b, 0x4d, 0xb4, 0x86, 0xd1, 0x35, 0x2a, 0x66, 0x09, - 0xad, 0x22, 0x93, 0x6f, 0xbb, 0xf1, 0x60, 0x9b, 0x56, 0xc4, 0xda, 0xeb, - 0xc6, 0x71, 0x38, 0xa7, 0xee, 0x50, 0x07, 0x08, 0x36, 0x27, 0xe2, 0x91, - 0xd3, 0x9a, 0xcc, 0xbc, 0xfc, 0xd0, 0xea, 0xe9, 0xb8, 0x44, 0x7b, 0x56, - 0x4c, 0xe1, 0x19, 0x12, 0x49, 0xbf, 0x5d, 0x1b, 0xc6, 0xc4, 0x5c, 0xd5, - 0x37, 0x0e, 0x71, 0x1d, 0x73, 0x49, 0xfa, 0x8b, 0x34, 0x58, 0xc2, 0xa4, - 0xef, 0xde, 0xab, 0xe1, 0x6b, 0x55, 0x31, 0x17, 0xb5, 0x69, 0xb4, 0xc8, - 0x3a, 0xcb, 0xe2, 0x09, 0x11, 0xa7, 0x77, 0x2a, 0xd1, 0x23, 0x16, 0xb1, - 0xd5, 0x12, 0xe3, 0xf6, 0x68, 0x46, 0x7b, 0xb1, 0x58, 0xd8, 0x68, 0x55, - 0xbf, 0xb8, 0xad, 0x8c, 0x17, 0xa6, 0x13, 0x0e, 0x44, 0x19, 0xaa, 0xb9, - 0x06, 0xe4, 0x49, 0x74, 0x99, 0xa0, 0xef, 0xd4, 0xc8, 0x79, 0x51, 0x1e, - 0x52, 0x28, 0xf1, 0x8f, 0xf0, 0xc5, 0x1a, 0x88, 0xc3, 0x1d, 0x0b, 0x7b, - 0x55, 0xe9, 0x2d, 0x79, 0x27, 0xda, 0x38, 0x61, 0xe5, 0xe8, 0x03, 0xa6, - 0xb1, 0x14, 0x61, 0xb6, 0xd9, 0x27, 0x0f, 0x7b, 0x8a, 0x0f, 0x72, 0x9f, - 0x1b, 0xe6, 0x5e, 0x07, 0x63, 0x8c, 0x8f, 0x14, 0xb2, 0x6f, 0x7a, 0xb9, - 0x44, 0x13, 0x6d, 0x77, 0x62, 0x48, 0x94, 0x9d, 0x30, 0x9f, 0x81, 0xcb, - 0x9d, 0x51, 0xfa, 0xa5, 0x65, 0xe5, 0x1b, 0x18, 0x9b, 0x02, 0x24, 0xc7, - 0x9d, 0x6f, 0x47, 0x47, 0x0c, 0xa9, 0x1c, 0x26, 0x54, 0x91, 0x12, 0x85, - 0x7f, 0xdb, 0x44, 0xc5, 0xf4, 0x16, 0x45, 0x18, 0xab, 0x99, 0x90, 0xad, - 0xba, 0xbe, 0x06, 0x00, 0x7e, 0x05, 0xb4, 0x5f, 0xcc, 0xa4, 0x9f, 0x52, - 0x42, 0xf2, 0xbb, 0x70, 0x42, 0xe4, 0x6d, 0x04, 0x91, 0x4e, 0x6a, 0x8c, - 0x42, 0x96, 0xa9, 0x06, 0x6d, 0x49, 0xc5, 0x7a, 0x34, 0xb8, 0x5b, 0x12, - 0x9e, 0xed, 0x41, 0x14, 0x7a, 0xd5, 0xe0, 0x89, 0xd4, 0x4c, 0x2f, 0xe3, - 0x5c, 0xc0, 0x7f, 0xf5, 0x13, 0x8e, 0x05, 0x6d, 0x04, 0xb5, 0x87, 0xe6, - 0x33, 0xeb, 0xc1, 0x89, 0x06, 0xd5, 0xc6, 0x48, 0xf2, 0x5e, 0x13, 0x39, - 0x31, 0xc3, 0x83, 0x9f, 0x22, 0x51, 0xdc, 0xd1, 0x6c, 0xc7, 0x0a, 0xef, - 0x65, 0x3b, 0x68, 0xc5, 0xff, 0xf2, 0x79, 0xa4, 0x84, 0x69, 0x7b, 0x24, - 0x6a, 0xdd, 0xc1, 0x56, 0x7c, 0xcf, 0x48, 0x0e, 0x10, 0x71, 0x46, 0x00, - 0x10, 0x86, 0x13, 0xf3, 0xd3, 0x0b, 0xc4, 0xcc, 0xa9, 0x3e, 0x85, 0x60, - 0x15, 0x4e, 0x13, 0x03, 0x8d, 0x17, 0x4a, 0x35, 0x9c, 0x5e, 0x76, 0x3e, - 0xde, 0x37, 0xc4, 0x3e, 0xcb, 0x29, 0xa4, 0xcd, 0xfc, 0x4a, 0x9e, 0x55, - 0x70, 0x66, 0x75, 0xdf, 0x27, 0x48, 0xa8, 0xa0, 0x64, 0x49, 0x9a, 0x9d, - 0x9e, 0xe4, 0x5e, 0xd8, 0x71, 0x81, 0x9d, 0xd6, 0x97, 0x4f, 0xa2, 0x38, - 0xa3, 0xaf, 0x47, 0xec, 0x5e, 0xf6, 0x97, 0xed, 0x20, 0x90, 0x51, 0x3e, - 0x91, 0xc8, 0xed, 0xb0, 0x8d, 0x18, 0xe5, 0x2b, 0x8f, 0x91, 0x89, 0xae, - 0x72, 0x97, 0x3e, 0x88, 0x8e, 0xb4, 0xfe, 0xad, 0xdb, 0x03, 0x3d, 0x59, - 0xe5, 0x5d, 0xea, 0x75, 0x1a, 0xc4, 0xea, 0xd0, 0xcc, 0x81, 0xdc, 0xbc, - 0x0b, 0x2d, 0x7a, 0x86, 0x8c, 0x8e, 0x11, 0x90, 0x26, 0x6d, 0x4b, 0x61, - 0x6a, 0x95, 0x6b, 0x67, 0x1c, 0x8e, 0xee, 0xc6, 0xd7, 0xd8, 0xfd, 0xae, - 0xb3, 0x24, 0x35, 0x79, 0x6b, 0x4e, 0x6f, 0xb0, 0x7a, 0xc1, 0x07, 0xfe, - 0x3f, 0x96, 0x93, 0x94, 0x68, 0xe9, 0x67, 0x4e, 0xc5, 0x0f, 0x41, 0xeb, - 0xe5, 0x6d, 0x5a, 0x7c, 0x5d, 0x5b, 0x42, 0x02, 0x9d, 0xca, 0xa4, 0x32, - 0x05, 0x62, 0x9b, 0xf2, 0x4b, 0xee, 0xb7, 0x72, 0xe8, 0xb5, 0xac, 0xf6, - 0xcd, 0x5f, 0x49, 0x84, 0x21, 0x96, 0x60, 0xd6, 0x8b, 0xaf, 0x1f, 0x44, - 0x45, 0x04, 0x90, 0x9b, 0x74, 0xb3, 0xc2, 0x9c, 0x5d, 0x73, 0xe1, 0x8f, - 0xd2, 0x60, 0x82, 0xb8, 0x43, 0xa9, 0x66, 0x4c, 0x35, 0x3c, 0x4c, 0x1f, - 0xaa, 0x0d, 0x11, 0x34, 0xf7, 0x08, 0x31, 0xc7, 0x4c, 0x9c, 0xd3, 0x40, - 0xec, 0xc1, 0x2b, 0x69, 0x50, 0xf8, 0xba, 0x5a, 0xa8, 0xa6, 0x3d, 0x1f, - 0x33, 0xeb, 0x30, 0x01, 0xed, 0x64, 0x95, 0x5e, 0xa3, 0x7e, 0xf3, 0x95, - 0x6f, 0x99, 0x3d, 0x91, 0x19, 0x95, 0xaf, 0x47, 0x5e, 0xd7, 0x1f, 0x70, - 0x3e, 0x65, 0xdb, 0x9f, 0xff, 0x3b, 0x8a, 0x64, 0x2e, 0xe6, 0x90, 0x10, - 0xd7, 0x90, 0x54, 0x5e, 0xac, 0x3d, 0xdd, 0xec, 0x37, 0xe0, 0xe9, 0xe0, - 0x10, 0x83, 0xa8, 0x1a, 0x22, 0x32, 0x78, 0x44, 0x4e, 0xe9, 0xa5, 0xfe, - 0x11, 0x7c, 0x78, 0xc8, 0x36, 0x29, 0x41, 0x8c, 0x4d, 0xb6, 0x01, 0xab, - 0x1b, 0x3a, 0xf8, 0xd5, 0xd0, 0xdc, 0x1d, 0x2f, 0x9a, 0x76, 0x08, 0x1f, - 0x29, 0xe0, 0x7e, 0x4c, 0xf8, 0xfe, 0xfa, 0x9a, 0x2c, 0x79, 0xff, 0xad, - 0x92, 0x4c, 0x4c, 0x45, 0x62, 0x79, 0xd5, 0x30, 0x9c, 0x27, 0x14, 0xeb, - 0xf7, 0x05, 0xe4, 0x99, 0xd8, 0x63, 0x77, 0x04, 0x67, 0xc7, 0xbc, 0x96, - 0xa7, 0x43, 0xb8, 0xd2, 0xe5, 0x26, 0x82, 0xbf, 0x79, 0x98, 0x6e, 0x31, - 0x6b, 0x27, 0xa7, 0xe0, 0x7d, 0xbc, 0x97, 0x7d, 0x29, 0xb3, 0x9e, 0xba, - 0xbe, 0xf1, 0xcf, 0xfc, 0x4a, 0xc6, 0xc2, 0x51, 0xdb, 0x71, 0x95, 0x65, - 0x26, 0x8a, 0x06, 0x91, 0x62, 0xb0, 0x65, 0x5c, 0x8b, 0x0e, 0x4b, 0x4c, - 0xa5, 0x2d, 0xb7, 0xff, 0xf5, 0x57, 0x4c, 0x60, 0x42, 0xc9, 0xbe, 0x6c, - 0xc1, 0x16, 0xaa, 0x40, 0x44, 0x2f, 0x58, 0x6b, 0x74, 0x02, 0x3f, 0x58, - 0x80, 0x1c, 0x39, 0x5f, 0x53, 0x32, 0x50, 0xe9, 0x47, 0xb9, 0xe9, 0x4b, - 0x7c, 0x4c, 0x09, 0xfb, 0xe6, 0xb0, 0x59, 0x48, 0xf8, 0x45, 0xc9, 0xd3, - 0x60, 0x30, 0x28, 0xe8, 0x7f, 0xa6, 0x6a, 0xe7, 0x89, 0x37, 0xc8, 0x01, - 0x4e, 0x19, 0xb1, 0xb9, 0x13, 0xdb, 0x46, 0x37, 0x3b, 0xe6, 0xa2, 0x11, - 0xcf, 0xec, 0x26, 0x90, 0x8e, 0x4f, 0xf1, 0x43, 0x7a, 0x80, 0x95, 0x66, - 0xe2, 0x66, 0x9e, 0x83, 0x3a, 0x90, 0x06, 0x34, 0x53, 0x46, 0xc8, 0x83, - 0x8a, 0x59, 0x4d, 0x72, 0x5c, 0x1a, 0x43, 0x56, 0x8b, 0xbd, 0x53, 0x8e, - 0xf5, 0x4d, 0x1b, 0x9f, 0x85, 0x38, 0x3b, 0xc8, 0xb5, 0x05, 0xfc, 0x47, - 0x4e, 0x1d, 0xb6, 0xd4, 0x2c, 0xe1, 0xec, 0x3e, 0x82, 0x92, 0x81, 0x75, - 0xdc, 0xf9, 0x23, 0xec, 0xfc, 0xfc, 0x76, 0xfc, 0x2e, 0xca, 0x1e, 0x94, - 0xd7, 0x3d, 0xb4, 0x7a, 0xe8, 0x37, 0xd4, 0x18, 0x2e, 0x73, 0x59, 0x00, - 0x0d, 0x05, 0x0f, 0x46, 0x22, 0x1f, 0x3a, 0xe2, 0x21, 0x61, 0xd2, 0xcc, - 0xa3, 0x7f, 0xf3, 0x78, 0x9b, 0xbc, 0x2d, 0x3e, 0x50, 0xa1, 0x4e, 0xea, - 0x73, 0x1f, 0xb7, 0xef, 0x9c, 0x0f, 0x58, 0xb1, 0xcc, 0xe3, 0x40, 0x68, - 0x14, 0xa2, 0x04, 0x53, 0x0a, 0x2e, 0x5b, 0xbe, 0x63, 0xa7, 0xe0, 0x04, - 0xdd, 0xeb, 0xcd, 0xea, 0x23, 0xa6, 0x20, 0x36, 0x1a, 0xdb, 0x89, 0xe6, - 0x96, 0x26, 0x3f, 0xb2, 0x6c, 0x02, 0x25, 0x83, 0x04, 0x32, 0xc4, 0xee, - 0xdc, 0xd0, 0x47, 0xdb, 0xf1, 0x15, 0x6e, 0xf5, 0xbf, 0x09, 0x8c, 0xa8, - 0x9e, 0xee, 0xe2, 0x40, 0xde, 0x0c, 0xbc, 0x59, 0x20, 0x56, 0x87, 0x09, - 0xcb, 0xf8, 0xe4, 0xa1, 0xf9, 0x83, 0x9e, 0x7a, 0x22, 0xa5, 0x5d, 0x88, - 0x4b, 0xe9, 0x5b, 0x60, 0x40, 0x52, 0xd9, 0xf8, 0x58, 0xd3, 0x89, 0x0c, - 0xa1, 0xe8, 0xd9, 0x1e, 0xf6, 0x30, 0xb6, 0xcd, 0x7d, 0x38, 0x0f, 0xfc, - 0x2e, 0xeb, 0x04, 0x81, 0xe1, 0xc6, 0x0b, 0xed, 0x16, 0x19, 0x7d, 0x0d, - 0xcf, 0x52, 0x96, 0x04, 0xa8, 0x61, 0x4d, 0x75, 0x41, 0x5f, 0x85, 0xaf, - 0x84, 0x5e, 0x6f, 0xee, 0x3e, 0xea, 0x81, 0xf5, 0xe3, 0xa3, 0x8e, 0xb2, - 0x50, 0xbc, 0xe4, 0x3b, 0xff, 0xd7, 0x35, 0x7a, 0x3a, 0xb0, 0x01, 0xbc, - 0x7a, 0x76, 0x51, 0xb9, 0x2e, 0x21, 0xcc, 0x63, 0xdb, 0x86, 0xe1, 0xbc, - 0x41, 0x9d, 0x6e, 0x33, 0xf1, 0x57, 0xda, 0x60, 0x5c, 0x3f, 0x45, 0xe2, - 0xb3, 0xc4, 0x29, 0xea, 0x58, 0x6b, 0x4b, 0x75, 0xac, 0x39, 0xa3, 0xe1, - 0x47, 0x37, 0x63, 0xd9, 0x30, 0x05, 0xe8, 0xa3, 0x1f, 0x19, 0xe7, 0x70, - 0x92, 0xdd, 0xb0, 0x84, 0xc3, 0xa8, 0x60, 0x6b, 0xc4, 0xfb, 0xdb, 0x7e, - 0x45, 0x5e, 0x56, 0x80, 0x64, 0x06, 0x90, 0x29, 0xd3, 0xbf, 0xbb, 0xde, - 0x15, 0xbd, 0x23, 0xb5, 0x93, 0xd0, 0x1b, 0x4a, 0x02, 0x07, 0xf9, 0xa1, - 0x2b, 0x1f, 0x3c, 0xaa, 0xa9, 0xbb, 0x4f, 0xb8, 0xfd, 0x35, 0x58, 0x54, - 0x92, 0xcd, 0x42, 0x50, 0x85, 0x5c, 0xab, 0x9e, 0xe0, 0x0d, 0x05, 0x17, - 0x04, 0x36, 0x97, 0xb3, 0x2e, 0x01, 0xab, 0xc8, 0xcf, 0x68, 0x1d, 0xf4, - 0x02, 0x14, 0x4a, 0x76, 0x1f, 0x82, 0xbb, 0xeb, 0x2b, 0x4f, 0x37, 0x3f, - 0x19, 0x3a, 0xb2, 0x01, 0x4a, 0x21, 0xe9, 0x36, 0x62, 0xb7, 0x96, 0x3c, - 0xe6, 0x97, 0x91, 0x36, 0xb7, 0x34, 0xdf, 0xb5, 0x33, 0x0e, 0x67, 0x8f, - 0x8f, 0xa0, 0xa4, 0x99, 0x07, 0x61, 0x81, 0xfb, 0xe2, 0x2d, 0xc3, 0x72, - 0x30, 0xbf, 0x41, 0x95, 0xe8, 0xd2, 0x12, 0x56, 0xb0, 0x94, 0xe8, 0xcc, - 0x2d, 0x7c, 0x9c, 0xe9, 0x67, 0x54, 0xc2, 0xc7, 0x64, 0x06, 0x47, 0x80, - 0xc8, 0x46, 0x50, 0x85, 0x50, 0x17, 0x1d, 0xd1, 0x75, 0x56, 0xb5, 0x8a, - 0x90, 0x7a, 0xca, 0x17, 0x3a, 0x8b, 0xe5, 0x5b, 0x0c, 0xe9, 0x87, 0xf2, - 0x32, 0x05, 0xf0, 0xed, 0x5b, 0xf6, 0xe8, 0x9d, 0x9c, 0xd7, 0xf2, 0xd3, - 0xdb, 0x82, 0x17, 0x58, 0xb0, 0x1b, 0x59, 0x3f, 0x9d, 0xac, 0x74, 0x33, - 0xff, 0x9a, 0x3a, 0x95, 0xd9, 0x5e, 0x85, 0x49, 0xd1, 0xfc, 0xcf, 0x5d, - 0x7c, 0xcf, 0x19, 0x43, 0xcd, 0x49, 0xd3, 0x9f, 0xd5, 0x9c, 0xbe, 0xc6, - 0x71, 0x46, 0x6a, 0x51, 0xda, 0x87, 0xd4, 0x66, 0x4f, 0xc6, 0x67, 0x49, - 0x37, 0x31, 0x89, 0xfe, 0x17, 0x33, 0x1e, 0x49, 0x62, 0x94, 0x69, 0xc7, - 0x42, 0x7c, 0xdb, 0x58, 0x67, 0x81, 0x8a, 0xff, 0x19, 0xec, 0xf6, 0x11, - 0x40, 0x36, 0x3d, 0xdf, 0xff, 0xa4, 0x65, 0x6b, 0x88, 0xee, 0x66, 0xb7, - 0xa5, 0xe2, 0xf3, 0x0c, 0xe6, 0x39, 0xdf, 0xfa, 0xbc, 0x10, 0xc8, 0xe6, - 0xbc, 0xa7, 0xaa, 0x20, 0x31, 0xb0, 0xb7, 0x5e, 0xc6, 0x18, 0x34, 0x4f, - 0x15, 0xc1, 0x26, 0x68, 0xe2, 0x36, 0x33, 0xfc, 0xf8, 0x65, 0x5d, 0xd7, - 0x61, 0xed, 0xf1, 0xd8, 0x15, 0xaa, 0xa4, 0x6e, 0x5c, 0x8c, 0x86, 0x74, - 0x2f, 0xe8, 0xc6, 0xbb, 0xc3, 0xa3, 0x44, 0xad, 0x4b, 0x04, 0xcb, 0xc9, - 0xf8, 0x5a, 0xf5, 0xf3, 0xd5, 0x85, 0x43, 0x70, 0x42, 0x2a, 0xe2, 0x4b, - 0x86, 0xe0, 0x4a, 0x9b, 0xd9, 0x6f, 0xad, 0x77, 0x9a, 0x9a, 0x84, 0xac, - 0x8c, 0x06, 0x2e, 0x16, 0x6e, 0xc9, 0x24, 0x32, 0xda, 0xab, 0x65, 0xd0, - 0x1d, 0xfd, 0xe9, 0x7d, 0x58, 0xf1, 0xb9, 0xc5, 0x3f, 0xf5, 0x7e, 0x87, - 0xe2, 0xe5, 0x4f, 0x20, 0xc0, 0xd5, 0xd7, 0x25, 0x82, 0x59, 0xb6, 0x2c, - 0xe4, 0x21, 0xf5, 0xac, 0x92, 0x65, 0x4d, 0x4e, 0xf8, 0x5f, 0xef, 0x1f, - 0x14, 0xcc, 0xc6, 0x56, 0x48, 0xf4, 0x39, 0xdb, 0x36, 0xd7, 0xca, 0x1b, - 0x30, 0xe7, 0xd1, 0xf9, 0x6b, 0x20, 0x51, 0x20, 0xba, 0x9e, 0x5f, 0x63, - 0xca, 0x91, 0x2e, 0xa0, 0x6f, 0x0d, 0x39, 0xf8, 0x51, 0x01, 0xda, 0x1c, - 0xcf, 0x06, 0x78, 0x99, 0x82, 0x33, 0xe9, 0xbb, 0xe0, 0xd4, 0xbc, 0x16, - 0x00, 0xad, 0x16, 0xbd, 0x42, 0xbf, 0x4c, 0x03, 0xa7, 0xc8, 0x8f, 0x37, - 0x58, 0x35, 0xc5, 0x44, 0x58, 0x84, 0xfb, 0xdc, 0xe1, 0x3f, 0xe3, 0xb9, - 0x81, 0x30, 0xb8, 0x24, 0xe3, 0xeb, 0x92, 0x28, 0x0c, 0xd4, 0x17, 0x33, - 0x24, 0xea, 0x63, 0x8a, 0x64, 0x87, 0x7e, 0xb0, 0x50, 0x8a, 0xed, 0xbe, - 0x3e, 0xe2, 0x4e, 0x97, 0x6f, 0x94, 0x84, 0x83, 0x34, 0x3f, 0xe1, 0x8b, - 0x08, 0x19, 0x3e, 0xe5, 0x02, 0x98, 0x62, 0x0d, 0xf8, 0x60, 0x74, 0x6a, - 0x8f, 0x1c, 0xb2, 0x44, 0x21, 0x08, 0x78, 0x3a, 0x2d, 0x4c, 0x59, 0xde, - 0xa9, 0x78, 0x8f, 0xcf, 0x12, 0x2d, 0x01, 0x6d, 0xd2, 0x58, 0x5e, 0x6c, - 0x4e, 0x80, 0x35, 0xfc, 0xe4, 0x0b, 0x18, 0x06, 0x65, 0x44, 0x82, 0xf9, - 0xcf, 0x9f, 0xbb, 0xcb, 0xc8, 0x73, 0xe9, 0x58, 0x82, 0x23, 0x02, 0xed, - 0xb2, 0x63, 0xe4, 0xbd, 0xb7, 0xbf, 0x17, 0xdc, 0xda, 0x2c, 0xfd, 0xbc, - 0xe2, 0x54, 0x0e, 0x92, 0x73, 0xe8, 0x13, 0x28, 0x87, 0x25, 0x5f, 0xc2, - 0x50, 0x52, 0xde, 0x03, 0x05, 0xdb, 0xea, 0x61, 0x92, 0x36, 0x34, 0x52, - 0xd0, 0xcb, 0xea, 0x83, 0xc6, 0x20, 0x29, 0x01, 0xee, 0x66, 0x85, 0xe7, - 0xf3, 0xa6, 0x6a, 0xff, 0xef, 0xf2, 0xde, 0x2e, 0x5a, 0x1f, 0xff, 0xad, - 0x48, 0x47, 0xab, 0xca, 0xc3, 0x23, 0x14, 0x89, 0x50, 0x2e, 0x9b, 0x00, - 0xb1, 0x88, 0x61, 0x44, 0x7a, 0xcc, 0xd9, 0x14, 0x9d, 0xc5, 0x78, 0xf9, - 0xb5, 0x94, 0x9d, 0x87, 0x66, 0x57, 0x27, 0x72, 0xcb, 0xf1, 0x0f, 0xa8, - 0x1c, 0xa8, 0x94, 0x96, 0xc8, 0xbf, 0x19, 0x8e, 0x92, 0x54, 0x82, 0xc7, - 0xc3, 0x68, 0x86, 0x02, 0xf6, 0xd4, 0xd1, 0x0d, 0x3a, 0x54, 0xe6, 0xb5, - 0x09, 0x3e, 0x69, 0x3f, 0x1a, 0xe0, 0x04, 0xb9, 0xc4, 0xc1, 0x53, 0xef, - 0x15, 0xca, 0x28, 0xa8, 0xb8, 0x8c, 0x93, 0x30, 0xa4, 0xde, 0x7a, 0xcb, - 0xe7, 0x5a, 0x32, 0xb8, 0x40, 0x55, 0xde, 0x1d, 0xa0, 0x7b, 0xa9, 0xef, - 0xed, 0xe5, 0x98, 0x31, 0x62, 0x91, 0x30, 0xbc, 0xf1, 0x7e, 0x0d, 0x0f, - 0x28, 0xfb, 0x7b, 0xcf, 0x3c, 0x01, 0x0c, 0x15, 0x15, 0xd3, 0xbc, 0xf5, - 0xae, 0xa5, 0x30, 0x83, 0x35, 0xa9, 0x13, 0x61, 0x5c, 0xec, 0xf6, 0xf5, - 0xb3, 0x2c, 0x12, 0x34, 0xf7, 0x85, 0xdd, 0xe0, 0x90, 0xfd, 0xdb, 0x16, - 0x82, 0x45, 0x3d, 0x67, 0x16, 0x06, 0xa7, 0xb6, 0x94, 0x62, 0x88, 0x13, - 0x1d, 0x89, 0x20, 0x91, 0x1e, 0x08, 0x7d, 0x1c, 0x2c, 0xdc, 0x28, 0x92, - 0x26, 0x37, 0xb9, 0x12, 0xe7, 0x14, 0xcb, 0xeb, 0xbb, 0xa4, 0xa3, 0x30, - 0xed, 0xd9, 0xd4, 0xd7, 0x01, 0xec, 0xe7, 0xd1, 0xd1, 0x80, 0x7a, 0x10, - 0xaf, 0xd7, 0x69, 0x54, 0x8c, 0xd7, 0x9a, 0x50, 0x62, 0x92, 0x0a, 0xa0, - 0xf9, 0xc6, 0x5b, 0x7d, 0xbe, 0x43, 0x24, 0x85, 0x10, 0x63, 0x0a, 0x6a, - 0x2d, 0x8e, 0x69, 0x6c, 0xb1, 0xaf, 0xe3, 0x90, 0xd7, 0x67, 0xcb, 0xf7, - 0x32, 0x37, 0x05, 0xdc, 0x1a, 0x49, 0x0d, 0x8e, 0x84, 0xe4, 0x17, 0xad, - 0x0f, 0x39, 0x09, 0x98, 0x1f, 0x8d, 0x6a, 0x10, 0xe0, 0x14, 0x4d, 0xcf, - 0xce, 0xf6, 0x71, 0x68, 0x46, 0xe5, 0xdd, 0x6e, 0xcd, 0xef, 0x63, 0xc4, - 0x1e, 0x9c, 0x83, 0x91, 0xe4, 0x0f, 0xcc, 0xe6, 0xe1, 0xcd, 0x1a, 0x06, - 0xd4, 0x1c, 0x7a, 0xec, 0x1e, 0x77, 0xc9, 0x47, 0xc9, 0xd2, 0x66, 0xc3, - 0x43, 0x9d, 0xe5, 0x25, 0x9e, 0x17, 0x42, 0x59, 0xc1, 0x34, 0x64, 0x65, - 0x60, 0xc1, 0xbb, 0xd1, 0x0f, 0xf9, 0x51, 0xc7, 0x8b, 0x1f, 0x12, 0xd5, - 0x00, 0x4d, 0xa0, 0x70, 0x0c, 0x8a, 0xf4, 0x45, 0x75, 0xfe, 0x3b, 0xe3, - 0x95, 0xce, 0x5b, 0xea, 0x24, 0xd5, 0x6a, 0x76, 0x5b, 0x93, 0xca, 0x1b, - 0xd7, 0x6d, 0x0a, 0xcf, 0x52, 0x11, 0x41, 0x46, 0xa3, 0xfb, 0xc4, 0x01, - 0x31, 0xde, 0xda, 0xed, 0xdb, 0xf9, 0x1d, 0xac, 0x92, 0x3f, 0x63, 0x56, - 0x81, 0x19, 0x94, 0xab, 0xa5, 0x0c, 0x86, 0xbd, 0x52, 0x17, 0x15, 0x25, - 0x1b, 0xb7, 0x82, 0x95, 0xf3, 0x26, 0x5f, 0x60, 0xa9, 0x7e, 0x05, 0xa5, - 0xcb, 0xb2, 0x61, 0xbc, 0xe5, 0x32, 0xda, 0xa5, 0xa8, 0x95, 0x8a, 0xeb, - 0x1f, 0x04, 0x91, 0x19, 0xa7, 0x8c, 0x09, 0xcb, 0x2f, 0xe3, 0x4a, 0x90, - 0x85, 0x41, 0x0f, 0xf7, 0x4a, 0x9d, 0x01, 0x82, 0x64, 0x3e, 0xec, 0x3e, - 0x5d, 0xfb, 0x9d, 0xf3, 0x03, 0xbf, 0xf6, 0x3a, 0x8c, 0x7b, 0x73, 0xb2, - 0xea, 0x74, 0xe6, 0x37, 0x0d, 0x01, 0x9f, 0x9b, 0x2f, 0xf2, 0xea, 0x90, - 0x9c, 0x5e, 0xaa, 0x47, 0x30, 0x7a, 0x93, 0x8b, 0x5d, 0xd7, 0x37, 0x50, - 0x45, 0x0e, 0xc8, 0x0c, 0xbf, 0x0b, 0x73, 0xcb, 0xb4, 0xe5, 0xed, 0xa9, - 0xe9, 0xbb, 0x3f, 0xab, 0xe4, 0x94, 0x82, 0x06, 0x46, 0x54, 0x85, 0xf7, - 0x5c, 0xc0, 0x53, 0x96, 0xb4, 0xd7, 0x50, 0xba, 0xc2, 0x99, 0x6c, 0x22, - 0xa8, 0x2e, 0x0c, 0xe9, 0xc5, 0xa3, 0x4a, 0xcf, 0xf4, 0x3e, 0x72, 0xd1, - 0xb7, 0x11, 0x5b, 0xa2, 0x9a, 0xc0, 0x6f, 0x7c, 0xe0, 0x16, 0xaf, 0xf4, - 0xa4, 0xa2, 0xb0, 0x42, 0x78, 0x61, 0x6c, 0x08, 0xe8, 0x6e, 0x1a, 0x06, - 0x82, 0xa1, 0x75, 0xc1, 0xfc, 0x6b, 0x1b, 0x40, 0x6a, 0x8e, 0x86, 0xa6, - 0xbd, 0xbf, 0x5c, 0x6f, 0x34, 0xbf, 0x58, 0xf1, 0x93, 0x38, 0x9c, 0x82, - 0x82, 0xd4, 0x21, 0x20, 0x84, 0x5c, 0x37, 0x34, 0xbf, 0x75, 0x98, 0x0d, - 0x79, 0x95, 0x9d, 0xa0, 0xb8, 0x60, 0xfa, 0xa0, 0x24, 0x8d, 0xfb, 0x2d, - 0xe8, 0xa0, 0x01, 0x7f, 0x5f, 0xf3, 0x3a, 0xa4, 0x27, 0x75, 0x9e, 0xa5, - 0x20, 0x0d, 0x15, 0x3f, 0xf7, 0x01, 0xbb, 0x74, 0x17, 0x2a, 0x4e, 0x58, - 0xcf, 0x16, 0x21, 0x84, 0x7f, 0xb7, 0xb3, 0x8c, 0x7e, 0x6e, 0x89, 0x97, - 0x3c, 0xcf, 0x67, 0x4d, 0x1d, 0x05, 0x77, 0xfe, 0x3c, 0x45, 0xbd, 0x5e, - 0xd9, 0x89, 0x9c, 0x6f, 0x3e, 0x4c, 0x8f, 0xab, 0x2a, 0x21, 0x92, 0x7a, - 0x29, 0x7f, 0x72, 0xda, 0x88, 0xeb, 0x25, 0xb6, 0x9b, 0xbf, 0x46, 0xf3, - 0xaa, 0xcc, 0xee, 0x93, 0xdb, 0x7a, 0xa5, 0xf1, 0x80, 0x0d, 0x38, 0x1d, - 0x5c, 0x26, 0x92, 0x0e, 0xf4, 0x0f, 0x5b, 0x83, 0x12, 0x86, 0x66, 0xe1, - 0xdb, 0x7f, 0xfe, 0xb2, 0xb9, 0x71, 0xb9, 0x68, 0x33, 0x10, 0xec, 0x1e, - 0x49, 0x78, 0xd8, 0xd0, 0xc3, 0xc0, 0x40, 0x2e, 0x13, 0x97, 0xa3, 0x09, - 0xd7, 0x29, 0xb5, 0x93, 0x4f, 0x70, 0x6f, 0x74, 0x26, 0x46, 0x6a, 0x55, - 0xd2, 0x78, 0x0a, 0x97, 0xd7, 0xe4, 0x3e, 0x5d, 0x8c, 0x93, 0x64, 0x9d, - 0xfa, 0x74, 0x56, 0xd1, 0x74, 0xb6, 0x61, 0x33, 0xb4, 0xb0, 0xa0, 0xb3, - 0xb6, 0xeb, 0x8c, 0xbb, 0xd7, 0x69, 0x6a, 0xb8, 0x6b, 0xbb, 0xc9, 0x77, - 0x70, 0x5b, 0xaa, 0xa3, 0x8f, 0x44, 0xd1, 0x0e, 0x7e, 0xbe, 0x1d, 0xde, - 0x34, 0x38, 0x7a, 0x2c, 0x22, 0x5c, 0x92, 0x46, 0x79, 0x59, 0x13, 0xe5, - 0xcd, 0x62, 0x97, 0x36, 0x8c, 0x64, 0x8c, 0xbc, 0x4c, 0xae, 0x78, 0xf7, - 0xcc, 0xc5, 0x1a, 0xe0, 0x40, 0x51, 0x3f, 0xc3, 0x58, 0x53, 0x11, 0x1a, - 0xc4, 0x54, 0x6d, 0xf3, 0x7a, 0x9d, 0x3f, 0x34, 0x3b, 0x86, 0x23, 0x0b, - 0x47, 0xb5, 0x50, 0xda, 0xb4, 0xf5, 0x74, 0x97, 0x1f, 0xdd, 0x9d, 0x10, - 0x07, 0x43, 0xb6, 0x4c, 0x13, 0x26, 0x77, 0xc4, 0x56, 0x51, 0x26, 0xc0, - 0x93, 0x1a, 0xb6, 0xf9, 0xc9, 0x18, 0x29, 0x38, 0xf1, 0x2b, 0x56, 0x7d, - 0xd0, 0x74, 0x71, 0x97, 0xd0, 0x60, 0xec, 0x78, 0x53, 0x82, 0x50, 0xde, - 0x32, 0x93, 0x5e, 0xa7, 0x78, 0x9f, 0x00, 0xf1, 0xb0, 0xfc, 0x74, 0xe5, - 0x77, 0xd0, 0xef, 0x4f, 0x0c, 0x93, 0xe3, 0x6f, 0xbf, 0xec, 0xce, 0x57, - 0xdc, 0x3e, 0x07, 0xdf, 0x5b, 0xf9, 0xf1, 0x4e, 0xb9, 0xf6, 0x37, 0x04, - 0x6b, 0x89, 0x45, 0xd9, 0x6f, 0xd9, 0xdc, 0xd4, 0xdf, 0x7d, 0x41, 0x82, - 0x54, 0x2c, 0x21, 0x55, 0xbb, 0xc1, 0x61, 0xa9, 0x03, 0x76, 0xf7, 0x73, - 0x18, 0x08, 0x79, 0x6e, 0xbc, 0x4f, 0x24, 0x04, 0x8f, 0xd2, 0x50, 0x63, - 0x66, 0x8d, 0x12, 0x04, 0xc4, 0x82, 0x4c, 0x99, 0xd2, 0xc7, 0x0e, 0x01, - 0x2b, 0xa8, 0x92, 0xff, 0xd0, 0x8e, 0xf1, 0x61, 0xce, 0xff, 0x65, 0x5e, - 0x1f, 0x83, 0x36, 0x90, 0x09, 0xd3, 0x00, 0x7d, 0x44, 0xab, 0x2e, 0x06, - 0xe9, 0xb5, 0x2d, 0x13, 0x46, 0x2e, 0xee, 0x71, 0xe2, 0x6a, 0xe2, 0xac, - 0xd7, 0x62, 0x3f, 0xa5, 0x5f, 0x39, 0xce, 0xb5, 0x84, 0xe1, 0xfb, 0xa3, - 0x58, 0x73, 0x4b, 0x6b, 0xc0, 0x68, 0x7c, 0xc0, 0x7e, 0x1f, 0x4e, 0xde, - 0x34, 0x40, 0x09, 0x5e, 0x22, 0x5c, 0x40, 0x46, 0x79, 0x59, 0x13, 0xb5, - 0x21, 0x97, 0x94, 0xf8, 0x15, 0xd1, 0xb1, 0x1d, 0xbf, 0x10, 0x00, 0xee, - 0xc5, 0x3f, 0x00, 0xeb, 0x4a, 0x4e, 0x2b, 0x9c, 0xce, 0x8c, 0xb1, 0x62, - 0xe0, 0x47, 0x78, 0x12, 0x98, 0x42, 0x3a, 0x1a, 0x82, 0xbc, 0xae, 0xe0, - 0x46, 0xeb, 0xe4, 0x9f, 0x90, 0x97, 0xc3, 0x78, 0xe8, 0x2d, 0x23, 0x11, - 0xf9, 0xfd, 0x63, 0xff, 0xa5, 0xdf, 0x83, 0x7d, 0x54, 0x62, 0x2e, 0x2a, - 0x21, 0x45, 0x3d, 0x4c, 0xd3, 0x74, 0x9b, 0x6f, 0x3d, 0xe8, 0xe3, 0x73, - 0x9d, 0x9c, 0x06, 0x4e, 0xe7, 0x4e, 0x1d, 0xef, 0xd1, 0x85, 0xff, 0x6b, - 0xc9, 0x40, 0xd0, 0xaa, 0x46, 0x5a, 0x86, 0x98, 0xc1, 0x41, 0x21, 0xbe, - 0x40, 0xbf, 0x86, 0x77, 0xe4, 0xd9, 0x78, 0xec, 0xcf, 0x80, 0x8b, 0xf1, - 0x9d, 0x25, 0x64, 0xe7, 0xea, 0x13, 0xcd, 0x40, 0x67, 0x78, 0xc3, 0xc8, - 0xd6, 0xb6, 0x92, 0x4e, 0x06, 0x92, 0xc4, 0x36, 0x01, 0x6f, 0xe8, 0xb9, - 0xe7, 0x33, 0x2f, 0xfd, 0x1b, 0xcd, 0xfc, 0x78, 0xc5, 0x65, 0x1e, 0x2b, - 0x70, 0x64, 0xaa, 0xa2, 0x66, 0x94, 0x5d, 0x33, 0x1d, 0xa6, 0x32, 0xdb, - 0x42, 0x78, 0xf2, 0xa5, 0x76, 0xf4, 0xce, 0x11, 0x23, 0x61, 0x7b, 0xe9, - 0xe0, 0xe2, 0x97, 0x5d, 0x23, 0x32, 0xb3, 0x4d, 0x4a, 0xf1, 0x4e, 0xa5, - 0x93, 0xca, 0xe4, 0x57, 0xc6, 0x67, 0xc2, 0x81, 0x73, 0xf5, 0xf9, 0x26, - 0x8a, 0x1f, 0x4f, 0x5d, 0xc1, 0xc5, 0x1b, 0x13, 0xe9, 0x3b, 0xc6, 0xfc, - 0xca, 0xdb, 0x2a, 0xbc, 0x83, 0x7f, 0x4d, 0xbc, 0x7f, 0x9e, 0xa8, 0x22, - 0x7e, 0xc8, 0xff, 0xbb, 0x83, 0x94, 0x3d, 0x38, 0x20, 0x36, 0x4b, 0x22, - 0x4b, 0x36, 0x4c, 0x5b, 0x5f, 0x94, 0xa1, 0xa7, 0x4a, 0xe4, 0x09, 0xea, - 0x6d, 0xd2, 0x08, 0x05, 0xaa, 0xf2, 0x03, 0x4f, 0xd1, 0xb0, 0x14, 0xf8, - 0x48, 0xa5, 0x6c, 0x31, 0x14, 0xb0, 0x42, 0xde, 0x7e, 0x73, 0x69, 0x8d, - 0xaa, 0x39, 0x0a, 0xb0, 0xf8, 0x16, 0x87, 0x8f, 0x7d, 0xb7, 0x19, 0x74, - 0x1c, 0x56, 0xe3, 0xab, 0x8b, 0x08, 0x96, 0xbd, 0x28, 0x58, 0x85, 0x5f, - 0x9d, 0x5b, 0x39, 0x6e, 0xb9, 0x82, 0x23, 0xa8, 0xd0, 0x2c, 0xf9, 0x70, - 0xcc, 0x88, 0x9e, 0xaa, 0xb7, 0x12, 0xb1, 0xa0, 0x6f, 0x18, 0xc7, 0x32, - 0xa7, 0x27, 0xb1, 0xcf, 0x7a, 0xac, 0x8f, 0xf7, 0xf2, 0xba, 0x14, 0xd7, - 0x10, 0x81, 0x03, 0x11, 0x94, 0x4b, 0xcc, 0x07, 0xe1, 0x24, 0x9c, 0x5d, - 0x97, 0xd4, 0xca, 0xb7, 0xe8, 0xd7, 0xe5, 0x01, 0x11, 0x34, 0x9c, 0xe7, - 0x90, 0x3c, 0x8c, 0x69, 0x5c, 0x18, 0x45, 0x6b, 0x47, 0x94, 0x47, 0x24, - 0xac, 0x75, 0x07, 0xb5, 0xdc, 0x66, 0xcd, 0x07, 0xdd, 0x7b, 0x8e, 0xbe, - 0x3f, 0x59, 0x3b, 0xf9, 0x5b, 0x2c, 0xc9, 0x76, 0x31, 0xd3, 0x09, 0x08, - 0x94, 0x37, 0x58, 0xa8, 0x4f, 0x54, 0x92, 0x13, 0x1e, 0xbb, 0x8a, 0xc0, - 0xe5, 0x27, 0x2e, 0x15, 0xf8, 0x85, 0xe0, 0x2a, 0xdf, 0xbd, 0x94, 0x2b, - 0xc8, 0x2e, 0x52, 0xbd, 0x4c, 0xc2, 0x6f, 0x67, 0xeb, 0x46, 0xda, 0xc7, - 0xa2, 0xc9, 0x24, 0x6f, 0x2b, 0x50, 0xe6, 0x83, 0xd6, 0x84, 0x96, 0x14, - 0xa7, 0x0a, 0x8e, 0x6c, 0xa1, 0xf7, 0x22, 0x7a, 0xc5, 0xfd, 0x80, 0xd4, - 0x9d, 0xde, 0xda, 0x3e, 0xae, 0x2c, 0x78, 0xc9, 0x26, 0x1f, 0x38, 0x9f, - 0x41, 0x8c, 0x19, 0x3a, 0x38, 0x69, 0x3d, 0xfd, 0x3a, 0xd4, 0x86, 0xb9, - 0x33, 0x31, 0x94, 0xe9, 0x9e, 0xc3, 0x84, 0xa5, 0xd6, 0x43, 0x2d, 0xed, - 0x4b, 0xe2, 0xa1, 0x97, 0xa6, 0x15, 0xc6, 0x6b, 0x94, 0x28, 0xe8, 0x00, - 0x48, 0x3f, 0xef, 0x10, 0x99, 0xb8, 0x70, 0x0c, 0x4d, 0xd7, 0x75, 0xe4, - 0x24, 0x28, 0x9f, 0xe3, 0xc8, 0x3a, 0xa3, 0x82, 0x1c, 0x3d, 0x77, 0x72, - 0x78, 0x27, 0xb9, 0xcc, 0x3f, 0x0a, 0xe2, 0x6c, 0x3a, 0x7f, 0x22, 0x9e, - 0xd1, 0xe9, 0xc4, 0xfa, 0x2f, 0x9d, 0xa2, 0x2e, 0x12, 0x56, 0x22, 0x8d, - 0x7e, 0x13, 0xe0, 0x03, 0xb8, 0x3e, 0xfa, 0x5b, 0xe2, 0x1d, 0xce, 0xb4, - 0x3a, 0xd8, 0x08, 0x80, 0x76, 0xb2, 0x91, 0x29, 0xe6, 0x5e, 0xff, 0x39, - 0x98, 0x29, 0x18, 0x94, 0x30, 0x1b, 0x53, 0x55, 0x03, 0xeb, 0xce, 0x87, - 0xc2, 0x9f, 0xce, 0x54, 0x8c, 0xe1, 0xde, 0x1c, 0xf6, 0x45, 0x78, 0xec, - 0x11, 0x16, 0xd2, 0x9b, 0xf8, 0xd5, 0x98, 0xd5, 0x28, 0xa4, 0xa4, 0x29, - 0x1a, 0x9c, 0x01, 0x4a, 0xa8, 0xe4, 0x9b, 0xc2, 0x8d, 0x4c, 0xbf, 0xb4, - 0x62, 0xfa, 0xae, 0x9c, 0xfb, 0xf5, 0xf1, 0x75, 0x4f, 0x94, 0xd4, 0xf9, - 0xcc, 0xac, 0xd3, 0xa4, 0xc3, 0x2e, 0x0b, 0x4a, 0x5c, 0x96, 0x28, 0x0a, - 0x1d, 0x29, 0x9c, 0x08, 0xcb, 0xcd, 0xf9, 0x61, 0x04, 0x7c, 0x95, 0xf0, - 0xd1, 0x2f, 0xa8, 0x27, 0x58, 0x0f, 0x3c, 0x54, 0xaf, 0x40, 0x76, 0x72, - 0x7e, 0x61, 0xeb, 0x2e, 0xb8, 0xf3, 0x75, 0x74, 0x4c, 0x71, 0xcc, 0x75, - 0xd0, 0x1c, 0x4d, 0xa0, 0x8e, 0xa7, 0x68, 0x68, 0x6e, 0xc1, 0x0e, 0xfe, - 0x17, 0xb3, 0xfb, 0x3f, 0xd8, 0x5e, 0x33, 0xbc, 0x1f, 0x92, 0x17, 0x59, - 0xfb, 0x64, 0x03, 0x7c, 0x17, 0x4f, 0x4b, 0x3b, 0xa3, 0x18, 0x55, 0xbc, - 0x61, 0x35, 0xe0, 0x24, 0x33, 0x19, 0x75, 0xdd, 0x0b, 0xe1, 0xd5, 0x7e, - 0x36, 0x6c, 0x5a, 0xe9, 0xba, 0x5a, 0x03, 0xc3, 0xaa, 0x50, 0x7d, 0x7c, - 0xdb, 0x8b, 0x8a, 0x58, 0xfb, 0xc9, 0x71, 0xb5, 0x19, 0x46, 0xa6, 0xb3, - 0x19, 0x2e, 0xfc, 0x03, 0x47, 0x54, 0x23, 0xf3, 0xb1, 0x8e, 0x76, 0xf5, - 0x7e, 0xf1, 0xa2, 0x5e, 0x94, 0x3e, 0xf3, 0x11, 0x89, 0x87, 0xeb, 0xc2, - 0xbe, 0x7a, 0x8f, 0xa3, 0x71, 0x09, 0x22, 0x7a, 0xf4, 0x3c, 0x62, 0x4e, - 0x34, 0x4f, 0x01, 0xb3, 0xcb, 0xd9, 0x95, 0x23, 0xe1, 0x0d, 0x0d, 0x28, - 0x65, 0x2c, 0x58, 0x3b, 0xc7, 0x12, 0x65, 0x39, 0xdc, 0x17, 0x44, 0x5c, - 0x6f, 0xec, 0x9c, 0x76, 0x0a, 0x3a, 0x99, 0x40, 0xe6, 0xb2, 0x56, 0x50, - 0xb2, 0x32, 0xfe, 0x2d, 0xfb, 0xfc, 0xf0, 0x73, 0x9b, 0x8e, 0x6b, 0x19, - 0xf4, 0x3b, 0x11, 0xd0, 0xd1, 0xc4, 0x92, 0x59, 0x30, 0xb5, 0x39, 0x88, - 0x12, 0x23, 0xa7, 0x78, 0x58, 0xdc, 0x75, 0xb9, 0xe5, 0x27, 0x1d, 0xef, - 0xcc, 0x80, 0x79, 0x0e, 0xc2, 0xa9, 0x05, 0x73, 0x5f, 0xd5, 0x82, 0xaa, - 0xb9, 0x6f, 0x70, 0xd6, 0xdc, 0x27, 0xa6, 0xb7, 0x72, 0xb2, 0x47, 0x50, - 0x3e, 0x63, 0x51, 0x9f, 0x17, 0x32, 0xa8, 0x97, 0xf6, 0x60, 0x74, 0x8c, - 0x6e, 0xaf, 0x8e, 0x69, 0x51, 0xa2, 0x17, 0x8e, 0x4a, 0xb2, 0x97, 0xd6, - 0xf0, 0x90, 0x45, 0x26, 0xe2, 0x46, 0x0e, 0x40, 0x96, 0x4b, 0xc8, 0x4c, - 0xb2, 0xf7, 0x09, 0x56, 0xc6, 0x25, 0x4e, 0xa7, 0x49, 0xe1, 0xfa, 0xf9, - 0xac, 0x69, 0xbb, 0x50, 0x2c, 0x83, 0x95, 0x20, 0x11, 0x18, 0xb6, 0x16, - 0x23, 0x1a, 0x2d, 0xa1, 0x14, 0xed, 0x75, 0xf3, 0x2e, 0xc9, 0xad, 0x82, - 0x93, 0x75, 0x05, 0x2d, 0xcc, 0x0a, 0xd7, 0x94, 0xb1, 0x3f, 0xec, 0x60, - 0x7e, 0x2b, 0x5f, 0x15, 0xa4, 0x38, 0xff, 0xc9, 0xf4, 0xba, 0xbd, 0x99, - 0x42, 0x26, 0x2d, 0xc4, 0x83, 0x86, 0x7d, 0x0d, 0x1f, 0xf7, 0x0d, 0xc2, - 0x9f, 0x30, 0xf5, 0x6f, 0xc9, 0x7b, 0x97, 0x33, 0xdd, 0xcf, 0xc7, 0xc0, - 0xa9, 0xf6, 0x12, 0x2e, 0x9c, 0xc6, 0xe1, 0xb0, 0x02, 0x11, 0xd5, 0xf0, - 0xc9, 0x6b, 0x55, 0xc3, 0xb1, 0xb4, 0x50, 0x4a, 0x75, 0x66, 0xf4, 0xf2, - 0x85, 0x38, 0x02, 0x6c, 0x95, 0xe3, 0xd5, 0x54, 0x9c, 0xea, 0x7b, 0x27, - 0x82, 0xd7, 0x02, 0xaa, 0x82, 0xdc, 0xbf, 0x4d, 0xb3, 0x30, 0xcc, 0xbf, - 0x36, 0x42, 0xd0, 0x62, 0x6b, 0x01, 0x64, 0x96, 0xa4, 0x91, 0xbf, 0xa6, - 0x48, 0x51, 0x95, 0x07, 0xf3, 0xbe, 0xaf, 0xa2, 0x92, 0xf4, 0x99, 0x99, - 0x15, 0x46, 0x7b, 0x7d, 0x2e, 0x5e, 0x2d, 0xd4, 0xa0, 0x55, 0x85, 0xc6, - 0x12, 0xd0, 0x53, 0x72, 0xb5, 0x91, 0x54, 0x6a, 0xaf, 0x99, 0x8b, 0xb5, - 0xde, 0xc8, 0xf1, 0x9c, 0x2d, 0x53, 0xf3, 0x35, 0xdc, 0x3a, 0x6b, 0x69, - 0x6d, 0xe4, 0x77, 0xde, 0x70, 0x9c, 0x55, 0xc2, 0x4f, 0xa0, 0xa6, 0x62, - 0x8f, 0x36, 0x6e, 0xcf, 0x45, 0xd2, 0xe2, 0x5a, 0x19, 0x56, 0x7b, 0x0c, - 0xcd, 0xb9, 0x16, 0x6e, 0x3a, 0xeb, 0x25, 0xa8, 0x9a, 0xf7, 0x4d, 0x68, - 0xa4, 0x7c, 0x3d, 0x1a, 0x2c, 0x05, 0x8d, 0xe5, 0x1a, 0x62, 0xac, 0xd9, - 0xf9, 0x75, 0x66, 0xbd, 0x27, 0xd8, 0x22, 0xa5, 0x39, 0xcf, 0xa8, 0x3c, - 0xf2, 0x29, 0xa2, 0x63, 0xb6, 0x85, 0xd7, 0xab, 0xf6, 0xad, 0x19, 0x4a, - 0x57, 0xdc, 0x61, 0x4d, 0xbe, 0x7e, 0xc3, 0xce, 0xd4, 0x4b, 0x19, 0x63, - 0xf2, 0x14, 0x73, 0x3a, 0x25, 0xc2, 0x6c, 0x76, 0x49, 0xbc, 0xe0, 0x8d, - 0x56, 0x56, 0xd7, 0xa4, 0x01, 0x92, 0x06, 0xfa, 0xb6, 0x42, 0x96, 0x89, - 0x95, 0x6c, 0x50, 0x17, 0x55, 0xeb, 0x4d, 0xea, 0x11, 0xaf, 0x5b, 0x2b, - 0xc9, 0xcf, 0x74, 0xc8, 0x48, 0x11, 0xae, 0x0b, 0x61, 0x1a, 0x17, 0xc2, - 0xb5, 0xed, 0x82, 0x38, 0xd6, 0xd3, 0xa1, 0xf9, 0xb9, 0x2e, 0xf7, 0xdf, - 0x40, 0xaa, 0xa5, 0x7e, 0x57, 0x01, 0xb2, 0xd6, 0xa7, 0x48, 0x53, 0x4b, - 0x11, 0x71, 0x1b, 0xfb, 0xd9, 0xfd, 0x49, 0x85, 0x3d, 0x23, 0xc1, 0x29, - 0x17, 0xd5, 0x6f, 0x7d, 0xe6, 0xbd, 0x87, 0xef, 0xf7, 0x18, 0x82, 0xef, - 0xf7, 0x3a, 0xe6, 0xe2, 0x60, 0x9e, 0xcb, 0xc3, 0xa5, 0x31, 0x02, 0x78, - 0x90, 0x33, 0xc5, 0x9a, 0xac, 0xdd, 0xff, 0x48, 0xfb, 0x07, 0x10, 0x9b, - 0x39, 0x83, 0xae, 0x71, 0xa6, 0x4f, 0x80, 0x71, 0xf8, 0x9f, 0xc8, 0x49, - 0xcb, 0x8f, 0x0f, 0xf2, 0x39, 0x22, 0x97, 0x8c, 0x60, 0x03, 0x62, 0x2f, - 0x54, 0x9f, 0xec, 0xd3, 0x7f, 0xd2, 0xdb, 0xdd, 0x4e, 0xb9, 0xfe, 0xf8, - 0x44, 0x1e, 0x21, 0xf3, 0x13, 0x95, 0xc2, 0x3c, 0xd6, 0x40, 0xb4, 0x67, - 0x4e, 0xe9, 0x59, 0x4b, 0x0b, 0xfa, 0x3d, 0x5b, 0x7b, 0xfe, 0xfb, 0xbb, - 0xd3, 0x83, 0xe7, 0xe0, 0x38, 0x8e, 0x81, 0x01, 0xbf, 0xb6, 0xad, 0x1b, - 0x97, 0xb9, 0xd1, 0x70, 0x8f, 0x08, 0xbc, 0xd4, 0x7e, 0x2b, 0x4e, 0xd2, - 0x05, 0xc8, 0x7e, 0xac, 0x85, 0x6a, 0x78, 0xc8, 0x3b, 0xdd, 0x96, 0x41, - 0x35, 0xaf, 0x41, 0x5c, 0xbd, 0xdf, 0x3d, 0x78, 0x00, 0x0d, 0xc6, 0x4d, - 0x35, 0xad, 0x5e, 0x54, 0x85, 0x14, 0x2c, 0xab, 0x8d, 0x4c, 0x5c, 0x53, - 0xa3, 0x6f, 0x1b, 0xe8, 0x34, 0xf2, 0x2a, 0xde, 0x37, 0x38, 0x8b, 0x19, - 0xc0, 0xe7, 0x55, 0x02, 0xf3, 0xb4, 0xae, 0x0b, 0xee, 0x65, 0x27, 0x7e, - 0xf7, 0xfd, 0x34, 0xc4, 0xba, 0xb7, 0x7d, 0x17, 0xc5, 0x4e, 0x53, 0xb4, - 0x25, 0xd8, 0xad, 0xac, 0xc6, 0xb6, 0x00, 0x43, 0xc4, 0xe3, 0x8e, 0x7c, - 0x54, 0x22, 0xbd, 0x04, 0xec, 0xb9, 0x6f, 0xf1, 0x63, 0x70, 0x66, 0xda, - 0xd2, 0xc5, 0x9c, 0x7d, 0x3d, 0xfe, 0xcf, 0x0f, 0xd7, 0xc8, 0x5a, 0x1e, - 0x75, 0x9c, 0xb8, 0x41, 0x75, 0x8e, 0x54, 0x49, 0xf3, 0x85, 0xf6, 0xae, - 0xba, 0x77, 0x5e, 0x6c, 0x3b, 0x48, 0xf2, 0x0b, 0xd8, 0xbd, 0x8d, 0xff, - 0xb6, 0xa7, 0x67, 0x0c, 0xb8, 0x85, 0xcd, 0x19, 0x0f, 0xf4, 0x97, 0x17, - 0x9a, 0x1a, 0x06, 0x43, 0xff, 0x22, 0x89, 0xe7, 0x2e, 0x4b, 0xfa, 0x3a, - 0xe6, 0xde, 0x8b, 0x28, 0xce, 0xc8, 0x41, 0xe7, 0x8d, 0x21, 0xb3, 0x0b, - 0x6e, 0x8f, 0x73, 0x57, 0x19, 0x83, 0x16, 0xd2, 0xec, 0xaa, 0xdb, 0x13, - 0x8d, 0xa7, 0xe5, 0x29, 0xa9, 0x3d, 0xb7, 0x1c, 0xa0, 0x47, 0x5b, 0xd2, - 0xee, 0xd1, 0x67, 0x3e, 0xfa, 0x27, 0x05, 0x60, 0x11, 0xc6, 0x12, 0x80, - 0x3c, 0x60, 0x66, 0xf5, 0xc2, 0xc5, 0xa7, 0x9a, 0x29, 0x72, 0x5e, 0x9c, - 0xf3, 0x4f, 0xd8, 0xda, 0x51, 0x1d, 0x03, 0xeb, 0xab, 0x15, 0x45, 0x97, - 0x72, 0x9c, 0x74, 0xcf, 0x12, 0x34, 0xa6, 0x2a, 0x2a, 0x58, 0xd8, 0x4c, - 0x4b, 0xc2, 0x42, 0xd7, 0x40, 0x74, 0xe5, 0xd9, 0x29, 0xf8, 0xe9, 0x73, - 0x1a, 0x9a, 0x1e, 0xb1, 0xd5, 0xbd, 0xa7, 0x81, 0xec, 0x8b, 0x42, 0x49, - 0x8e, 0x14, 0x4d, 0xd6, 0x8c, 0x0e, 0x2a, 0xb6, 0xa9, 0xe8, 0x58, 0x8d, - 0xc6, 0x94, 0x2e, 0x11, 0xfd, 0xd8, 0x0f, 0x8a, 0x08, 0x89, 0x9d, 0x4e, - 0x21, 0xe8, 0x7c, 0x4e, 0xc5, 0x75, 0xd8, 0x74, 0xe1, 0xe8, 0x3c, 0x51, - 0x94, 0xc6, 0xa1, 0x7e, 0xc3, 0x8b, 0x97, 0xb7, 0x40, 0xe5, 0x4d, 0x6f, - 0x84, 0x95, 0xa8, 0xa8, 0x2d, 0xb0, 0x26, 0xd8, 0xba, 0xfc, 0xf9, 0x93, - 0xf9, 0x0e, 0xbd, 0xfe, 0x42, 0x61, 0x05, 0x65, 0x6d, 0xa2, 0x27, 0x2e, - 0x51, 0xcc, 0x4a, 0x44, 0xe6, 0xbe, 0x74, 0x45, 0x8d, 0x07, 0x28, 0x42, - 0xce, 0xb7, 0x8c, 0x83, 0x87, 0xb4, 0x0f, 0x2a, 0xbb, 0x06, 0x2d, 0xa2, - 0xfb, 0x2e, 0xdc, 0xbc, 0xec, 0x2d, 0x4f, 0x2a, 0x66, 0x18, 0xed, 0xd5, - 0x9d, 0xc6, 0xe4, 0xf6, 0x6c, 0x35, 0x97, 0x22, 0x8d, 0x27, 0x9e, 0x82, - 0x0f, 0x32, 0x2b, 0xf7, 0xda, 0x61, 0xd6, 0x17, 0x45, 0x9b, 0xd3, 0xa9, - 0xb6, 0x91, 0x49, 0x10, 0x1e, 0x78, 0x25, 0xc0, 0x11, 0xc1, 0x8a, 0x2a, - 0x21, 0xf8, 0x3d, 0x7d, 0xc4, 0x43, 0x93, 0x0c, 0xee, 0x59, 0x67, 0x06, - 0x4f, 0x04, 0xad, 0x4f, 0xe5, 0xe7, 0xee, 0xbd, 0xaa, 0xaa, 0xe7, 0xae, - 0x29, 0xe9, 0x81, 0xd1, 0xe0, 0x58, 0x27, 0xa0, 0x2d, 0x14, 0x2e, 0x7b, - 0x69, 0xec, 0x6b, 0x2a, 0xbe, 0x84, 0x2e, 0x95, 0x35, 0xf4, 0x75, 0x9a, - 0xdc, 0xb4, 0x14, 0xf8, 0x11, 0x8d, 0x92, 0xaf, 0xcd, 0x4a, 0x67, 0x73, - 0x46, 0x00, 0x7e, 0x91, 0xe6, 0x34, 0xe1, 0xd0, 0xb1, 0xdb, 0x7d, 0xb1, - 0x88, 0x4a, 0xf1, 0x03, 0x70, 0xc6, 0xbc, 0x76, 0x95, 0x2b, 0xe6, 0xed, - 0x4f, 0x30, 0x1f, 0x71, 0x1e, 0xc0, 0xfb, 0xe4, 0x72, 0x8c, 0x40, 0xfa, - 0xe9, 0xb6, 0x18, 0xe8, 0x02, 0x1c, 0xfb, 0xa6, 0x40, 0xd4, 0xea, 0x1a, - 0xaf, 0x84, 0x14, 0x44, 0xe8, 0xaf, 0xa3, 0xe1, 0x2f, 0x23, 0x4b, 0x57, - 0x17, 0x80, 0xc7, 0x7c, 0xcb, 0xf7, 0x85, 0x3e, 0x4b, 0x4d, 0x7b, 0xe4, - 0x36, 0x52, 0xf2, 0xe9, 0xa9, 0xbd, 0x39, 0x8d, 0x74, 0x88, 0x48, 0x38, - 0x2c, 0x0f, 0x67, 0xa2, 0x80, 0xf1, 0x32, 0xd7, 0x34, 0xa0, 0x85, 0x19, - 0x28, 0xe8, 0xc6, 0xb4, 0xbc, 0xb6, 0xc7, 0x28, 0x09, 0xdd, 0x57, 0x63, - 0x95, 0x72, 0xb0, 0x96, 0xd5, 0x65, 0xb7, 0x65, 0x3e, 0x8f, 0xcb, 0x84, - 0xa9, 0x75, 0x59, 0xd7, 0xbc, 0xe7, 0xd3, 0x26, 0x2f, 0x86, 0x07, 0xc7, - 0xb3, 0xc9, 0xc1, 0xcd, 0xc4, 0x24, 0x29, 0xdc, 0xff, 0xfe, 0xcc, 0x0e, - 0x95, 0x31, 0x06, 0xe4, 0xef, 0x20, 0x94, 0x22, 0x45, 0x7b, 0xc0, 0x3c, - 0x3b, 0xe1, 0xa2, 0x3a, 0x89, 0x92, 0x1f, 0xf8, 0xa9, 0xc7, 0x85, 0x45, - 0x9b, 0xaf, 0x3f, 0x37, 0x4c, 0xf6, 0x23, 0x07, 0x81, 0x15, 0xaf, 0x9f, - 0x24, 0x7a, 0x89, 0x36, 0xc2, 0x8c, 0x5b, 0x4b, 0x78, 0xbc, 0xe8, 0xeb, - 0x21, 0x35, 0xff, 0xb7, 0x26, 0xb1, 0xc4, 0xff, 0x67, 0x36, 0x7a, 0x1b, - 0xa4, 0xe8, 0x30, 0x3a, 0x6e, 0x73, 0xf6, 0xf0, 0x55, 0x56, 0x1a, 0x59, - 0xef, 0x81, 0x4b, 0x1d, 0x83, 0x28, 0xc1, 0xa4, 0x17, 0x2e, 0x3b, 0x31, - 0x9f, 0x42, 0xe6, 0x5e, 0x92, 0x7f, 0xec, 0x6b, 0xb8, 0x56, 0xa0, 0x0f, - 0xed, 0xa6, 0x3a, 0x69, 0xbb, 0x83, 0xe9, 0xf5, 0xef, 0xc1, 0xdf, 0x5a, - 0x5b, 0x9e, 0x28, 0xdd, 0xab, 0x01, 0x50, 0x86, 0xe0, 0x24, 0xf6, 0x25, - 0x54, 0x6b, 0x82, 0x97, 0x38, 0x8b, 0xba, 0x7e, 0xc7, 0x5f, 0x41, 0xba, - 0x38, 0xe9, 0xd6, 0x45, 0x18, 0x0d, 0x5c, 0xe7, 0x68, 0x19, 0x6d, 0x34, - 0x3c, 0xeb, 0xe6, 0x9a, 0x36, 0x6d, 0x82, 0x80, 0x53, 0x25, 0x73, 0x42, - 0x75, 0x3f, 0xdf, 0x62, 0x83, 0x8e, 0x83, 0x9a, 0x51, 0x85, 0x9f, 0x0b, - 0x7b, 0x74, 0x49, 0x4b, 0xdb, 0x71, 0x00, 0x6e, 0x6c, 0x84, 0x77, 0x44, - 0x0d, 0xf0, 0x02, 0x36, 0x31, 0x05, 0x38, 0x87, 0x1f, 0xf5, 0xf3, 0x2d, - 0xc7, 0xdb, 0x6a, 0xd0, 0xd3, 0xbd, 0x55, 0xe2, 0xaf, 0x28, 0xde, 0xaa, - 0xc6, 0x53, 0x46, 0xbc, 0x7d, 0x33, 0xfd, 0xf7, 0x05, 0x0a, 0x61, 0x34, - 0x30, 0x46, 0x14, 0x6e, 0xef, 0x41, 0x8c, 0x50, 0x54, 0x82, 0xba, 0xae, - 0xfa, 0x9e, 0xa8, 0xd7, 0xd5, 0x02, 0xb5, 0x88, 0x24, 0xad, 0x50, 0xc2, - 0x6c, 0xc4, 0x7c, 0x09, 0x3a, 0xca, 0x12, 0x41, 0x37, 0xe9, 0xcb, 0xef, - 0xad, 0xdd, 0xaa, 0xf8, 0x9f, 0x45, 0x60, 0x27, 0xb7, 0xec, 0x1c, 0xa3, - 0xce, 0x43, 0x2f, 0xe6, 0x3c, 0x11, 0x3a, 0x01, 0xbb, 0x7a, 0x07, 0xd1, - 0x3e, 0xa8, 0x12, 0x71, 0x9d, 0x46, 0x6c, 0x59, 0x86, 0x2c, 0x21, 0xa4, - 0x2d, 0x02, 0xeb, 0x2a, 0xff, 0x8d, 0xc1, 0x3b, 0xfb, 0xf1, 0x31, 0x87, - 0x32, 0xdd, 0xa6, 0xb7, 0x1e, 0x27, 0x4c, 0xd5, 0xc5, 0xe4, 0xa1, 0x8c, - 0xf2, 0x1c, 0x02, 0x22, 0xba, 0xb7, 0x02, 0xaa, 0xf0, 0xb6, 0xeb, 0xa2, - 0x73, 0x0b, 0xea, 0xe0, 0xd9, 0x87, 0x39, 0x46, 0x3a, 0xc7, 0x26, 0xaf, - 0x20, 0x65, 0xef, 0x4b, 0xe9, 0x9e, 0x99, 0xd7, 0xe6, 0x5a, 0xb9, 0x26, - 0x4c, 0xed, 0xce, 0xb4, 0xb3, 0x83, 0x77, 0x63, 0x35, 0xe0, 0x1a, 0x0a, - 0xe8, 0x92, 0x64, 0xa5, 0xf3, 0x43, 0x0c, 0x90, 0x60, 0x73, 0xc9, 0xdc, - 0xe1, 0x86, 0x24, 0xea, 0xec, 0x8c, 0x1f, 0xe5, 0xb1, 0x12, 0xe9, 0x16, - 0xe3, 0xd2, 0x44, 0x76, 0xb7, 0x7f, 0xa3, 0x7d, 0x7f, 0x42, 0x38, 0xd0, - 0x5c, 0xea, 0xb5, 0x06, 0xa9, 0xb9, 0x38, 0x7e, 0x0b, 0xdf, 0xf8, 0xc7, - 0xdc, 0x46, 0x94, 0x06, 0xd3, 0x26, 0x04, 0x0f, 0x1d, 0xf4, 0x3c, 0x5a, - 0x94, 0xa5, 0x54, 0x8a, 0x25, 0x3c, 0x15, 0x73, 0x76, 0x60, 0xf4, 0x2d, - 0x04, 0x3e, 0xf0, 0xbf, 0xf5, 0xcd, 0xf0, 0xfd, 0x9e, 0x41, 0x23, 0x7f, - 0x95, 0xa6, 0xb5, 0x30, 0xe0, 0x30, 0x75, 0xd1, 0xd0, 0x65, 0x0c, 0x81, - 0xf4, 0xc9, 0xc6, 0x26, 0xdc, 0x0f, 0xb9, 0xda, 0xf4, 0xed, 0xaa, 0xf6, - 0xc5, 0xfb, 0x5e, 0x14, 0xdf, 0xcc, 0xa4, 0xaa, 0x83, 0x48, 0x8e, 0xac, - 0x2f, 0x39, 0x33, 0xce, 0xfa, 0x60, 0x58, 0xc4, 0xb7, 0x67, 0x8a, 0xbb, - 0xc6, 0xe0, 0x32, 0x0e, 0x59, 0x24, 0xa6, 0x10, 0x30, 0x60, 0xe6, 0xca, - 0xa2, 0x0a, 0xea, 0x0d, 0x08, 0x6c, 0x3b, 0x00, 0x89, 0x7d, 0x26, 0x24, - 0xc1, 0x1c, 0xd8, 0x3e, 0x70, 0x4c, 0xaa, 0x4f, 0xd5, 0x4c, 0xbe, 0x9e, - 0x2b, 0xc1, 0x85, 0x65, 0x2d, 0x98, 0x93, 0x94, 0xed, 0xd5, 0x06, 0xc9, - 0xf6, 0x92, 0xf6, 0x49, 0xa7, 0xe3, 0xb3, 0xae, 0x0d, 0x5e, 0x35, 0xad, - 0x95, 0xbe, 0x02, 0x05, 0xdc, 0xd7, 0x5a, 0xe7, 0xbc, 0x33, 0x29, 0xb0, - 0xcc, 0x9e, 0xc8, 0xe0, 0x14, 0xbe, 0xf2, 0x50, 0x7b, 0xda, 0x32, 0xd7, - 0xa5, 0x9c, 0xf5, 0xcf, 0xca, 0xa3, 0x8e, 0xd6, 0xc8, 0x78, 0x66, 0x10, - 0x06, 0x81, 0xd5, 0xde, 0xf1, 0xa0, 0x94, 0x5c, 0x71, 0x44, 0xc1, 0x83, - 0xcd, 0x29, 0x64, 0x76, 0x48, 0x5b, 0x9c, 0x52, 0x83, 0xd5, 0xc1, 0x3f, - 0xb0, 0xd2, 0xa2, 0xf9, 0xd0, 0x85, 0xf5, 0x72, 0xc5, 0x44, 0x5e, 0x0d, - 0x3b, 0x5d, 0x14, 0xdd, 0xea, 0xa8, 0x68, 0xc0, 0x73, 0x91, 0x6c, 0x0c, - 0x61, 0x02, 0x79, 0x7d, 0xeb, 0xf6, 0xfb, 0xbd, 0x2d, 0x96, 0xab, 0x40, - 0x5e, 0x90, 0x62, 0xb8, 0x88, 0x99, 0x30, 0xb4, 0xbc, 0xae, 0xb6, 0x2a, - 0x9f, 0x23, 0xab, 0xdf, 0x28, 0x62, 0x24, 0xaa, 0x83, 0x33, 0x5e, 0xc8, - 0x98, 0x86, 0x4f, 0x52, 0x61, 0xde, 0x2b, 0xbf, 0x8d, 0xd7, 0x47, 0xfb, - 0x61, 0x5e, 0x06, 0xfd, 0x5f, 0xed, 0xa4, 0xee, 0x07, 0xce, 0xea, 0x81, - 0x3a, 0x85, 0x2a, 0xaf, 0x4b, 0x4f, 0x02, 0xd5, 0x11, 0xf9, 0xb6, 0x81, - 0xf5, 0x79, 0x90, 0x13, 0x16, 0xd9, 0x93, 0xb5, 0xdb, 0xd8, 0x6e, 0xa0, - 0x61, 0xcd, 0xed, 0x1c, 0x8f, 0xf3, 0x9e, 0x7e, 0x0e, 0x76, 0x76, 0x6c, - 0xa9, 0x81, 0x41, 0x49, 0xc0, 0x00, 0x08, 0x37, 0xb2, 0x5f, 0x58, 0xd6, - 0x22, 0x80, 0x78, 0xbb, 0x35, 0x77, 0x62, 0x44, 0x88, 0xf7, 0x2b, 0x59, - 0x71, 0x81, 0xb8, 0x70, 0x63, 0x7d, 0xa3, 0xc3, 0x91, 0xf6, 0xb1, 0xcb, - 0x3d, 0x70, 0xc6, 0x21, 0xa4, 0x5e, 0x7d, 0xa0, 0x40, 0x34, 0x3f, 0x42, - 0xa8, 0xbe, 0x50, 0x88, 0x29, 0x15, 0x71, 0xc9, 0x86, 0xac, 0x6a, 0x40, - 0x8f, 0xa7, 0x83, 0x3f, 0x5b, 0x76, 0xa4, 0xa8, 0x0b, 0x9b, 0x23, 0x1d, - 0x68, 0xf0, 0x9b, 0x8d, 0x09, 0x68, 0x5c, 0x8c, 0xff, 0x3d, 0x47, 0x9f, - 0x91, 0x0b, 0x2d, 0xad, 0x73, 0x37, 0x7c, 0x45, 0x64, 0x9e, 0xd3, 0xcc, - 0x52, 0x0c, 0x45, 0x6e, 0x53, 0xd9, 0xbd, 0xed, 0x35, 0xde, 0xf5, 0xd1, - 0x4a, 0x33, 0x46, 0x61, 0x17, 0xfc, 0x89, 0x6c, 0x05, 0xf2, 0xfd, 0xa6, - 0x78, 0x29, 0x85, 0x04, 0x34, 0xe1, 0x15, 0xad, 0xd6, 0x69, 0x75, 0x1e, - 0xe9, 0xdf, 0xe3, 0x11, 0x81, 0x65, 0x91, 0xe0, 0x39, 0x7d, 0xae, 0x28, - 0xfd, 0xcd, 0xca, 0x53, 0xad, 0x13, 0x66, 0xb3, 0xe0, 0xe2, 0x50, 0x9d, - 0x13, 0x01, 0xcd, 0xdc, 0x40, 0xc9, 0xe1, 0x54, 0xef, 0x30, 0xe0, 0x06, - 0xa0, 0x56, 0x0f, 0xf8, 0xa2, 0xef, 0x4d, 0x48, 0xb9, 0xdc, 0x78, 0x8d, - 0x25, 0xaa, 0xc0, 0xea, 0xba, 0xcb, 0x1a, 0x3e, 0x3a, 0x75, 0x98, 0xb4, - 0xc6, 0xe5, 0xb1, 0xe0, 0xcb, 0xb4, 0x9c, 0x21, 0x85, 0x20, 0x41, 0xd0, - 0xaa, 0x7b, 0x84, 0x58, 0xcd, 0xb0, 0x50, 0xa9, 0x68, 0x41, 0x19, 0xcf, - 0xe0, 0x61, 0xd3, 0x25, 0x9d, 0x81, 0x78, 0x64, 0xdb, 0x0b, 0xf9, 0xe3, - 0xb8, 0x1d, 0xb1, 0xcf, 0xce, 0xc2, 0x14, 0x37, 0xef, 0x52, 0xb5, 0x32, - 0x7d, 0x7f, 0x74, 0x48, 0xd4, 0xd5, 0x3f, 0xf1, 0x58, 0x34, 0x70, 0x94, - 0xf7, 0xf7, 0x32, 0xa3, 0x8c, 0xe5, 0xa5, 0x50, 0xcd, 0x6b, 0xf9, 0x87, - 0x51, 0x17, 0x83, 0x5e, 0x62, 0xf6, 0x78, 0x89, 0x79, 0x65, 0x1e, 0x24, - 0x4d, 0x59, 0x58, 0x87, 0xf5, 0xea, 0x4a, 0x54, 0x76, 0x4e, 0xce, 0x58, - 0x3f, 0x5f, 0x40, 0x0b, 0x38, 0xa1, 0x25, 0x51, 0x70, 0x00, 0x62, 0xad, - 0x25, 0x2f, 0xb0, 0x1d, 0x35, 0xa6, 0xf4, 0xb1, 0x3a, 0xd9, 0x01, 0xaa, - 0xe8, 0x01, 0x0e, 0x2e, 0x78, 0x12, 0xa0, 0x4c, 0x33, 0x53, 0x58, 0xc9, - 0x93, 0x83, 0x42, 0xdc, 0x56, 0x1d, 0xdf, 0x2f, 0x4e, 0x2c, 0xe1, 0xaa, - 0xe1, 0x6d, 0x4f, 0x29, 0xb7, 0xab, 0x1d, 0x8c, 0x9c, 0x37, 0x47, 0xe4, - 0xe9, 0x65, 0xe5, 0xa0, 0xbc, 0xa0, 0x59, 0xa4, 0x10, 0xc9, 0xfa, 0x0a, - 0x62, 0x63, 0xad, 0xb3, 0x89, 0xa8, 0xca, 0x3e, 0xd5, 0x12, 0xec, 0x32, - 0x4d, 0xb1, 0x78, 0x3e, 0x3b, 0x84, 0x5e, 0x50, 0xb5, 0x13, 0x63, 0x87, - 0xbd, 0x72, 0xa1, 0x67, 0x4f, 0x47, 0xf9, 0x5a, 0x04, 0x18, 0x63, 0x53, - 0x90, 0x76, 0x0b, 0x42, 0x83, 0x4d, 0xd5, 0x10, 0x40, 0x7c, 0xba, 0x0f, - 0x8a, 0x82, 0xe4, 0xe7, 0x32, 0x05, 0x16, 0x9e, 0xba, 0xad, 0x15, 0xf2, - 0xb3, 0xaf, 0x41, 0xf3, 0x5b, 0xe6, 0x10, 0xb4, 0xa2, 0xc7, 0xf5, 0x5d, - 0x23, 0x5c, 0xec, 0xab, 0x6a, 0xd6, 0x4f, 0x40, 0xc3, 0xe2, 0xd0, 0x1a, - 0x8d, 0x06, 0x02, 0x45, 0x2a, 0x0f, 0xf7, 0x6d, 0xc0, 0x1c, 0x26, 0x44, - 0xe8, 0xc9, 0xed, 0x72, 0x0c, 0x84, 0x94, 0x92, 0xe2, 0xad, 0xe6, 0x65, - 0x78, 0x07, 0x3d, 0xcf, 0xaa, 0x13, 0xa5, 0xee, 0x8b, 0x8c, 0x94, 0x50, - 0x09, 0xf4, 0x29, 0xc0, 0x03, 0xfa, 0x40, 0x1b, 0x25, 0x3a, 0x0a, 0x7a, - 0xb1, 0x47, 0x28, 0x07, 0x04, 0x61, 0xbe, 0x0d, 0x4e, 0xd3, 0x25, 0x7e, - 0xc3, 0xbc, 0x12, 0x7f, 0x20, 0xa6, 0xd0, 0xd2, 0x8a, 0x7f, 0xe6, 0xc6, - 0x8e, 0xe6, 0x0d, 0x3d, 0x32, 0xd6, 0xe6, 0xc9, 0xea, 0x09, 0xba, 0xfe, - 0xf7, 0xfd, 0xb1, 0x25, 0x38, 0x78, 0xd5, 0x46, 0x72, 0x0e, 0x45, 0x1f, - 0x5a, 0xb8, 0xf7, 0x90, 0x5a, 0xc8, 0x37, 0x19, 0x67, 0xb3, 0xa8, 0xf7, - 0x10, 0x38, 0x76, 0xab, 0xee, 0xc1, 0x2b, 0x9e, 0x25, 0x9a, 0x8d, 0x7a, - 0xf9, 0xc9, 0xbd, 0x26, 0x98, 0xe8, 0xc2, 0x8f, 0xba, 0x14, 0xde, 0x05, - 0xb8, 0x07, 0x9e, 0xcf, 0x98, 0xf3, 0x33, 0x88, 0x8a, 0xf2, 0x64, 0x17, - 0x01, 0xcb, 0x41, 0x79, 0x8f, 0xc6, 0x5a, 0xc9, 0xac, 0x6b, 0xe7, 0x72, - 0x24, 0x09, 0x19, 0x74, 0xa1, 0xd7, 0xf2, 0xf0, 0xd9, 0x5e, 0x33, 0x45, - 0xb1, 0x2d, 0xd7, 0xef, 0xa5, 0x3f, 0x93, 0x4f, 0x6c, 0xb4, 0x9a, 0x38, - 0x9d, 0x90, 0x9e, 0x7c, 0x3e, 0x96, 0xee, 0xce, 0x91, 0x8d, 0xed, 0xf9, - 0xe7, 0x38, 0x4a, 0x7e, 0x2a, 0x44, 0xee, 0x32, 0xa7, 0x95, 0x9f, 0xeb, - 0xef, 0x97, 0x70, 0xde, 0x38, 0x9b, 0xb0, 0x35, 0x12, 0x8f, 0x53, 0x94, - 0xfa, 0x50, 0xfa, 0xb1, 0xdd, 0x42, 0x77, 0x5e, 0x88, 0x5b, 0xa6, 0x74, - 0xf9, 0x99, 0x65, 0x82, 0x60, 0x42, 0x58, 0xcb, 0xb1, 0xa2, 0x33, 0x27, - 0x2a, 0x25, 0xcd, 0x35, 0x9c, 0xce, 0xc8, 0x66, 0xe4, 0xbe, 0x18, 0x56, - 0x69, 0xe7, 0xa8, 0x16, 0x17, 0x3a, 0xdf, 0x23, 0x78, 0xeb, 0xba, 0x07, - 0x38, 0x0a, 0xc0, 0xdc, 0xbb, 0x14, 0x12, 0x2e, 0x99, 0xf5, 0x68, 0xfa, - 0x78, 0x9d, 0x74, 0xed, 0x88, 0xab, 0x5a, 0x1c, 0x6f, 0x76, 0xb6, 0xb8, - 0x27, 0xa5, 0x83, 0xcb, 0x2d, 0xd2, 0x18, 0x65, 0xa7, 0x26, 0xee, 0x6a, - 0x69, 0xaa, 0x83, 0x1e, 0x85, 0x24, 0xdb, 0x2b, 0x40, 0xf6, 0xac, 0x82, - 0x8e, 0x4d, 0x28, 0x6c, 0x1e, 0x7c, 0x18, 0xe1, 0x51, 0xd1, 0x18, 0xd6, - 0x6b, 0x6a, 0x21, 0x70, 0xb2, 0x78, 0x39, 0x20, 0x7d, 0xaa, 0x3a, 0xf3, - 0x93, 0x36, 0x4b, 0x9b, 0x27, 0x8a, 0xcb, 0x14, 0x07, 0xd6, 0x41, 0x4d, - 0xae, 0xdc, 0xd5, 0x28, 0x93, 0x92, 0x6c, 0x5d, 0x2b, 0xc0, 0x54, 0x9d, - 0xb6, 0x80, 0x28, 0xab, 0x4b, 0x60, 0x40, 0xf2, 0x4f, 0xbd, 0xe3, 0xad, - 0x49, 0xbb, 0x47, 0x1b, 0x61, 0xf8, 0x66, 0xd4, 0x4b, 0xb9, 0x52, 0xa5, - 0xa9, 0x04, 0x23, 0x30, 0x38, 0x79, 0x58, 0xc5, 0x5e, 0x41, 0xaf, 0x40, - 0x52, 0x48, 0xbb, 0x6d, 0x3a, 0xbe, 0xc0, 0x8f, 0x9e, 0xfa, 0xef, 0xe4, - 0x19, 0x13, 0x1e, 0x19, 0x70, 0x54, 0x8c, 0xe6, 0xdc, 0xd5, 0x65, 0xb1, - 0x47, 0xd4, 0x3e, 0xdf, 0x35, 0x3d, 0x0b, 0x9f, 0x93, 0x19, 0x9a, 0xee, - 0xea, 0x1d, 0xb2, 0x76, 0x2a, 0xe2, 0x5b, 0x5d, 0xc7, 0xb7, 0xef, 0xfe, - 0x2f, 0xa4, 0x10, 0xa4, 0x29, 0xd9, 0x63, 0x18, 0xde, 0xb1, 0x16, 0xa6, - 0x47, 0xff, 0xb2, 0xd6, 0x0a, 0x45, 0xce, 0xe4, 0xe6, 0x16, 0xc9, 0x13, - 0x15, 0x9c, 0xbc, 0x60, 0xbe, 0xda, 0x1d, 0xf1, 0x2f, 0x06, 0x1e, 0x31, - 0xde, 0x04, 0x3d, 0xb7, 0xb6, 0x55, 0xfb, 0x34, 0x72, 0x04, 0xba, 0x00, - 0x9a, 0x87, 0xb9, 0x7c, 0x14, 0xd5, 0x89, 0x9c, 0x45, 0x57, 0x0f, 0xf8, - 0x9b, 0x2a, 0xeb, 0x10, 0xe7, 0x6c, 0x7c, 0xc6, 0xf5, 0x5f, 0x34, 0x8c, - 0xe9, 0xd1, 0xf9, 0x45, 0x89, 0x6c, 0x4d, 0x5a, 0xba, 0x1e, 0x38, 0x28, - 0x38, 0x82, 0x95, 0xd1, 0xac, 0x02, 0xdd, 0xc4, 0x4d, 0xf8, 0x69, 0xeb, - 0xdf, 0xfd, 0x08, 0x4b, 0x29, 0x16, 0x9e, 0xf7, 0x13, 0x83, 0xce, 0x8c, - 0x86, 0x0a, 0x8b, 0xf7, 0x94, 0xa7, 0x8c, 0x96, 0x87, 0xe4, 0xbb, 0xba, - 0x0d, 0x9d, 0x94, 0x58, 0xcd, 0xcb, 0x04, 0x51, 0xef, 0xb0, 0x35, 0x0c, - 0x57, 0x84, 0x72, 0x0b, 0xe7, 0x6a, 0x1d, 0x8d, 0xe2, 0x47, 0x3a, 0x18, - 0xe3, 0x57, 0xc0, 0x8e, 0xdb, 0xfc, 0xaa, 0xe7, 0xc3, 0x1c, 0xbe, 0x58, - 0x20, 0x5e, 0xb4, 0x26, 0x34, 0x63, 0x6f, 0x15, 0xdd, 0xbd, 0x2e, 0x6c, - 0xbf, 0x2d, 0x4f, 0xdc, 0x12, 0xcd, 0x70, 0x65, 0xe2, 0xf4, 0x89, 0xf7, - 0x03, 0x5b, 0xed, 0x2c, 0xd5, 0x28, 0x70, 0xb3, 0xf2, 0x77, 0x21, 0x62, - 0x6e, 0xb6, 0x7d, 0x37, 0xb2, 0x62, 0xb0, 0x00, 0x80, 0xa6, 0x2a, 0x69, - 0x5a, 0xf6, 0xc5, 0x1f, 0x4a, 0x15, 0x02, 0x70, 0xc1, 0x6f, 0x9e, 0xe1, - 0x40, 0x68, 0x99, 0xad, 0x7a, 0x8e, 0x33, 0x77, 0xad, 0x3a, 0xef, 0xef, - 0x5d, 0x96, 0x4a, 0x54, 0x9f, 0x51, 0xf2, 0x42, 0x4b, 0x5d, 0x94, 0x65, - 0x90, 0x6d, 0xd3, 0xe6, 0xdd, 0x54, 0xfa, 0x0a, 0xc5, 0xd4, 0x15, 0x48, - 0x65, 0x6c, 0xf1, 0x58, 0xb9, 0x38, 0x60, 0x53, 0xfc, 0xa0, 0x86, 0x5e, - 0x02, 0xc5, 0xa0, 0x7a, 0x02, 0xfb, 0x7a, 0x4e, 0xef, 0x95, 0xc0, 0x75, - 0x5c, 0x72, 0x0e, 0x03, 0xec, 0x98, 0x0c, 0x52, 0xbd, 0x65, 0x3e, 0x76, - 0x44, 0x61, 0x08, 0x52, 0xa2, 0x95, 0xe6, 0xcd, 0xd3, 0xf6, 0xc1, 0x72, - 0x06, 0x83, 0xb4, 0xe8, 0x7e, 0xbd, 0x19, 0xc0, 0x82, 0xa6, 0x37, 0xf1, - 0x6e, 0x29, 0x67, 0xe1, 0xb5, 0x28, 0xce, 0x7b, 0x0a, 0xcf, 0xe6, 0x6a, - 0xcf, 0xa8, 0x63, 0x15, 0x52, 0x81, 0xbd, 0xa4, 0xc0, 0xae, 0x93, 0x79, - 0x5d, 0xe6, 0x85, 0x78, 0x25, 0x95, 0x5c, 0x76, 0x15, 0x5e, 0xa3, 0x69, - 0x57, 0x19, 0x81, 0xdd, 0xb4, 0x8c, 0x8a, 0xa6, 0xa2, 0x21, 0xce, 0x56, - 0xdd, 0x07, 0x8b, 0x3d, 0x0c, 0x9b, 0xf6, 0xe0, 0x1f, 0x44, 0xaa, 0xbc, - 0xc7, 0xdc, 0xb3, 0x52, 0xf9, 0x80, 0xaf, 0x2e, 0x51, 0x4f, 0x34, 0x47, - 0x71, 0x6a, 0xcd, 0xd6, 0xfa, 0xa6, 0x46, 0xd5, 0xc4, 0x25, 0xcc, 0xcb, - 0xf8, 0xa6, 0x51, 0xa4, 0x60, 0x9e, 0xeb, 0xb4, 0x78, 0x76, 0xe1, 0x97, - 0xa6, 0xfd, 0xe6, 0x90, 0x16, 0x52, 0x43, 0x6c, 0x6b, 0x20, 0x3d, 0xe1, - 0x51, 0x62, 0x78, 0x2c, 0x1d, 0x87, 0x5a, 0xfa, 0x09, 0x9a, 0xe4, 0xe7, - 0x42, 0x08, 0x3d, 0x87, 0xee, 0x82, 0xa5, 0xa7, 0xcf, 0x09, 0x2c, 0x9c, - 0x6e, 0xd0, 0x2d, 0xc3, 0x75, 0x6f, 0x91, 0x65, 0x25, 0xf8, 0xc0, 0xc1, - 0x4d, 0x5e, 0x5a, 0xd6, 0x08, 0x11, 0xc4, 0x71, 0x8b, 0x6a, 0x61, 0xa1, - 0xac, 0x8a, 0x85, 0x52, 0x09, 0x94, 0xd3, 0xc2, 0x3a, 0xcf, 0x7b, 0x86, - 0xd2, 0x9d, 0x3f, 0x22, 0x35, 0xca, 0xdc, 0x62, 0xc1, 0x02, 0xd2, 0xec, - 0xc3, 0xb7, 0x71, 0xa9, 0x01, 0x45, 0xdb, 0x3e, 0x9b, 0x4d, 0xd9, 0xeb, - 0x9a, 0xcf, 0xc9, 0x4e, 0x36, 0x33, 0x5d, 0xdc, 0x25, 0x7d, 0x79, 0x98, - 0x6d, 0xe5, 0xb8, 0xa5, 0x3b, 0xb0, 0xf1, 0x35, 0x58, 0xb4, 0x70, 0xfc, - 0xbd, 0x35, 0xcf, 0x79, 0x3c, 0xdf, 0x2e, 0xd5, 0x64, 0xd7, 0x35, 0x6c, - 0x79, 0x19, 0xe6, 0xe8, 0x34, 0x1e, 0x76, 0x42, 0x08, 0xbb, 0x70, 0x05, - 0x33, 0x23, 0x16, 0x8f, 0xa4, 0xdc, 0x93, 0x42, 0x76, 0xc8, 0xb8, 0x03, - 0xbd, 0x42, 0x5a, 0xe9, 0xdc, 0xe2, 0x94, 0xc6, 0x38, 0x41, 0xf5, 0x1c, - 0x9c, 0x21, 0x36, 0xd9, 0x83, 0xa5, 0x8d, 0x78, 0xe3, 0x53, 0x5a, 0xc8, - 0x5c, 0xe4, 0x87, 0xd8, 0xb6, 0xd5, 0xc6, 0xbe, 0xab, 0xd2, 0x6e, 0x13, - 0x47, 0x6d, 0x90, 0x8a, 0xe5, 0xe1, 0x78, 0xa0, 0x17, 0x25, 0xba, 0x04, - 0x76, 0x7b, 0x37, 0xf0, 0xbb, 0x23, 0x06, 0xba, 0xea, 0x0b, 0x57, 0xea, - 0xe9, 0x0a, 0xaa, 0x6f, 0xe4, 0x60, 0x26, 0xd4, 0x66, 0xd8, 0x42, 0x7c, - 0xa7, 0x48, 0xbb, 0x3a, 0x0a, 0xa1, 0xe5, 0x3c, 0xed, 0xdd, 0x65, 0x4c, - 0xf2, 0xf7, 0xbb, 0xdb, 0x2d, 0x23, 0x88, 0xff, 0xc5, 0xaf, 0x1e, 0xf0, - 0xb6, 0x63, 0xd5, 0xbb, 0x5a, 0x09, 0x84, 0xed, 0x4e, 0x1a, 0x49, 0x0d, - 0x10, 0xb6, 0x66, 0x5a, 0x8e, 0xdd, 0xa6, 0x15, 0x8f, 0xb4, 0x52, 0x82, - 0xee, 0x61, 0x9e, 0x6e, 0x18, 0xe2, 0x33, 0x76, 0xc0, 0x8c, 0x45, 0x25, - 0x51, 0x29, 0xfc, 0xcb, 0x48, 0x7b, 0xd1, 0x0d, 0xa0, 0xd8, 0x7d, 0x1f, - 0xbe, 0x00, 0x17, 0xd3, 0x92, 0xac, 0x27, 0x44, 0xfb, 0x27, 0x6d, 0x4b, - 0x70, 0xb5, 0x62, 0x52, 0x57, 0xe2, 0x38, 0x4c, 0x0d, 0x3c, 0x7e, 0x02, - 0x22, 0x62, 0x0a, 0x19, 0xb6, 0x8a, 0xc9, 0xc7, 0xe7, 0xe2, 0xe6, 0x46, - 0xe3, 0x43, 0xdb, 0xac, 0x0b, 0xb1, 0x9e, 0x00, 0xb3, 0x5f, 0xa4, 0x00, - 0xc8, 0x5b, 0x46, 0x67, 0x16, 0xba, 0x83, 0x72, 0xa6, 0x5b, 0x04, 0x8f, - 0xd9, 0x1b, 0xad, 0x14, 0xd8, 0xf7, 0x70, 0x9f, 0x74, 0x26, 0x80, 0xc5, - 0xdb, 0xbc, 0x14, 0xd7, 0x6d, 0x5a, 0xf4, 0xac, 0xb2, 0x38, 0x38, 0x00, - 0xb1, 0x0e, 0x8f, 0x52, 0x76, 0x49, 0xd0, 0x85, 0xe1, 0xe5, 0x5b, 0x20, - 0xf3, 0x27, 0x14, 0xc6, 0x4f, 0x8d, 0x25, 0xf7, 0x35, 0x8b, 0x91, 0xab, - 0xa2, 0x33, 0xe7, 0xbe, 0xfe, 0xe1, 0x2d, 0x67, 0x9d, 0x8a, 0x41, 0x4f, - 0x35, 0x47, 0x07, 0xce, 0xd4, 0x3c, 0x95, 0x17, 0x71, 0x13, 0x98, 0x69, - 0xc5, 0xb0, 0x51, 0xec, 0xc7, 0xa0, 0x61, 0xae, 0xaf, 0x7c, 0xfd, 0xd8, - 0x8f, 0x14, 0x7f, 0x7e, 0xc6, 0x7c, 0xfd, 0x76, 0x8f, 0xee, 0xde, 0x46, - 0xdc, 0x10, 0xc4, 0x83, 0x7b, 0x8e, 0xec, 0xa9, 0xd5, 0x76, 0x6c, 0x5f, - 0xfd, 0x09, 0x05, 0x8e, 0xa2, 0x35, 0x46, 0x60, 0x89, 0x6c, 0x6b, 0x2c, - 0xbd, 0x55, 0x3e, 0xd7, 0x9d, 0x79, 0xf0, 0x69, 0xfc, 0x96, 0x9f, 0x00, - 0xcf, 0xb3, 0xf2, 0x23, 0x43, 0xdc, 0x86, 0x49, 0xcb, 0x3d, 0xf9, 0xd8, - 0xf9, 0x55, 0x1c, 0xa1, 0x5e, 0x13, 0x11, 0xb2, 0xbe, 0x57, 0x14, 0xc4, - 0x63, 0xc1, 0xd6, 0x1b, 0x13, 0xf5, 0x60, 0x3a, 0x40, 0x25, 0x7f, 0xa7, - 0x15, 0x69, 0xa7, 0x3e, 0xc2, 0x54, 0xa6, 0x7b, 0xbc, 0xf9, 0x29, 0x1a, - 0x62, 0xad, 0x5d, 0xc9, 0x9b, 0x6d, 0x00, 0xb0, 0x8a, 0x44, 0xde, 0x2b, - 0x74, 0xbe, 0x8a, 0xbb, 0x04, 0xa0, 0x8b, 0x5a, 0x38, 0x4d, 0xed, 0x47, - 0x8f, 0xd2, 0x2b, 0xfb, 0xc7, 0x43, 0xd1, 0xbe, 0xcb, 0x26, 0x35, 0xb2, - 0x0a, 0x3a, 0x74, 0xe2, 0xbb, 0x93, 0xd3, 0x46, 0xf6, 0xaf, 0xd4, 0x22, - 0x92, 0x52, 0xe1, 0xfe, 0xbd, 0x68, 0xa8, 0xde, 0xd0, 0x6e, 0x38, 0x78, - 0x69, 0xfc, 0xb7, 0x0e, 0x8b, 0x72, 0xa3, 0x6e, 0x33, 0xb9, 0x96, 0xe0, - 0xec, 0x37, 0xb9, 0x0d, 0x0a, 0xf9, 0x59, 0x32, 0x00, 0xda, 0xdf, 0x1f, - 0xe6, 0x52, 0x45, 0x9b, 0xec, 0xfa, 0x84, 0xea, 0xae, 0x0a, 0xf3, 0xd3, - 0x6e, 0x82, 0x49, 0x53, 0x0e, 0xfe, 0x40, 0x39, 0xfe, 0x59, 0x80, 0x2d, - 0x6b, 0x6d, 0x26, 0x67, 0x59, 0x72, 0xd8, 0x1b, 0x77, 0x07, 0xfc, 0x1b, - 0xe3, 0x69, 0x11, 0x22, 0xd5, 0x92, 0x4a, 0xb3, 0x63, 0xb6, 0x81, 0x79, - 0x99, 0x52, 0xcc, 0xa3, 0x56, 0x96, 0x75, 0xf1, 0x9a, 0xa6, 0xd0, 0xfa, - 0xd4, 0xf4, 0x9e, 0x4c, 0x6f, 0x99, 0x9c, 0x86, 0x2a, 0xa4, 0x69, 0x28, - 0x78, 0x4c, 0x0a, 0x8d, 0xeb, 0x67, 0xde, 0x7b, 0x71, 0x03, 0x97, 0xc2, - 0xe7, 0x64, 0x44, 0x03, 0xca, 0xe0, 0xdc, 0x83, 0xad, 0xe8, 0x04, 0xa1, - 0x5a, 0xfc, 0x42, 0x0f, 0xc9, 0x4d, 0x39, 0x1c, 0x42, 0xa8, 0x74, 0xf7, - 0xa6, 0x74, 0x12, 0xcc, 0x7c, 0x26, 0x05, 0x8c, 0x37, 0x3d, 0x66, 0x44, - 0x94, 0x59, 0x3b, 0xbd, 0x17, 0x1f, 0x44, 0x6f, 0xeb, 0x76, 0x7d, 0xcc, - 0x36, 0xbf, 0x22, 0xbe, 0xa9, 0x90, 0x2a, 0x51, 0x2f, 0x6e, 0xaa, 0xae, - 0xd2, 0xf1, 0x87, 0x83, 0xd0, 0x0b, 0xeb, 0x5e, 0x80, 0xf5, 0xaa, 0x85, - 0x27, 0x94, 0x86, 0xa1, 0xd7, 0x04, 0x2e, 0x4c, 0x3f, 0x40, 0x24, 0xd4, - 0x83, 0x5e, 0x11, 0x4d, 0xa7, 0x4c, 0x05, 0xb0, 0x5c, 0xb9, 0x04, 0xa1, - 0x95, 0xbc, 0xe8, 0x32, 0x2d, 0x86, 0xe4, 0xec, 0xc0, 0x66, 0x0e, 0xe4, - 0xf6, 0x41, 0x78, 0xe6, 0x02, 0x22, 0x9a, 0x13, 0x0d, 0x56, 0x06, 0x9e, - 0xca, 0xc8, 0x7c, 0xa2, 0x27, 0xf8, 0x2e, 0x1c, 0xe3, 0x3b, 0x3a, 0x8b, - 0x40, 0x21, 0xca, 0xa3, 0x9d, 0x5d, 0x3c, 0x69, 0x9f, 0x1e, 0x00, 0x0f, - 0xac, 0x30, 0x44, 0xff, 0x53, 0xdf, 0x28, 0x3b, 0xfd, 0x84, 0x2d, 0x02, - 0x20, 0xb7, 0x29, 0xad, 0x95, 0x9e, 0x64, 0xd8, 0xe0, 0xa5, 0x86, 0x12, - 0xdc, 0x3d, 0x3a, 0x47, 0xf7, 0xc6, 0xac, 0xc2, 0x0a, 0x5a, 0x8b, 0x35, - 0x4a, 0x06, 0x08, 0x5a, 0xfc, 0xa3, 0x1b, 0xbe, 0x93, 0x28, 0xdd, 0x77, - 0x1a, 0x08, 0xf4, 0x44, 0x33, 0xe2, 0xe6, 0xad, 0x17, 0x9a, 0xc8, 0xf0, - 0x53, 0x82, 0x87, 0xa8, 0x30, 0x61, 0xb8, 0xad, 0xee, 0x78, 0x98, 0xdf, - 0xd7, 0x71, 0x74, 0x09, 0xf7, 0xd3, 0xe7, 0x36, 0x7c, 0xc2, 0x81, 0x03, - 0x43, 0x95, 0x74, 0x90, 0x3c, 0xcc, 0xda, 0x9b, 0xf7, 0x13, 0xa4, 0xa7, - 0x29, 0x46, 0x2d, 0xf4, 0x1a, 0x45, 0xcb, 0x7b, 0x2d, 0x72, 0x0c, 0xe8, - 0xab, 0xb9, 0x4d, 0x83, 0xb4, 0xe6, 0xbb, 0xa4, 0x6b, 0xe7, 0x7d, 0x8b, - 0x25, 0xc5, 0xf3, 0xad, 0x5b, 0x4b, 0x4c, 0xcf, 0xfb, 0xd2, 0x10, 0x23, - 0x91, 0xa6, 0x96, 0x43, 0x6f, 0x12, 0x25, 0xa7, 0x8d, 0xe7, 0x94, 0xeb, - 0xc2, 0x77, 0xa4, 0x4e, 0x8f, 0x3b, 0xbe, 0x2d, 0xd2, 0xd6, 0x2c, 0x35, - 0x20, 0xdf, 0x27, 0xa8, 0x1c, 0xb9, 0xed, 0x27, 0xd2, 0xb8, 0x44, 0x45, - 0xde, 0x91, 0x18, 0x51, 0x22, 0xa2, 0x42, 0xcd, 0xaf, 0x14, 0x12, 0x16, - 0x64, 0xd3, 0x10, 0x89, 0x0e, 0x40, 0x18, 0x97, 0x99, 0x79, 0x85, 0x2b, - 0x30, 0xd7, 0xa5, 0x07, 0xa4, 0xd6, 0x06, 0x0e, 0x6a, 0x1d, 0xda, 0xef, - 0xea, 0x7d, 0xae, 0x2b, 0x8c, 0x6a, 0xd4, 0x5d, 0x43, 0x61, 0xe7, 0x60, - 0xbf, 0x71, 0xb9, 0x68, 0xf3, 0x0d, 0x5c, 0xf8, 0xe6, 0x68, 0x29, 0xfe, - 0x47, 0x02, 0x66, 0x80, 0x12, 0x55, 0x41, 0x56, 0xa2, 0xaa, 0x43, 0x47, - 0x25, 0x62, 0xfd, 0x94, 0x96, 0x0e, 0x56, 0x57, 0xff, 0xe4, 0xaf, 0x2a, - 0x90, 0x0a, 0x24, 0xf7, 0xf4, 0xdd, 0x6a, 0xad, 0xb0, 0xd3, 0xbf, 0xd0, - 0x8f, 0x43, 0xee, 0xf7, 0x59, 0x24, 0x5e, 0xd3, 0x94, 0x5e, 0xfc, 0x64, - 0xa6, 0xfc, 0x22, 0xf6, 0x66, 0xa9, 0x89, 0x0e, 0x98, 0x99, 0xcd, 0x83, - 0x10, 0x10, 0x1e, 0xa2, 0x94, 0xcd, 0x1a, 0x8c, 0x10, 0x66, 0x9b, 0x4e, - 0xed, 0xc2, 0xfe, 0xcd, 0x5a, 0x1b, 0xe8, 0x91, 0xa1, 0x0d, 0x7f, 0x6a, - 0x36, 0x87, 0x31, 0x5b, 0xba, 0xdb, 0x05, 0x90, 0x02, 0x19, 0xfb, 0xd1, - 0x22, 0xfe, 0x7b, 0xcc, 0x3a, 0x87, 0xea, 0x27, 0x3e, 0x9e, 0x19, 0xcd, - 0x38, 0x9a, 0x2a, 0x35, 0xd2, 0xa7, 0x95, 0xdf, 0x17, 0x46, 0xfc, 0x58, - 0xff, 0x27, 0xf1, 0xe0, 0x65, 0x02, 0x58, 0x54, 0x92, 0x69, 0x13, 0xc0, - 0x06, 0x17, 0xe6, 0xa3, 0xc1, 0x64, 0x6a, 0x9b, 0xf5, 0x3b, 0x9e, 0x9b, - 0xbc, 0xaf, 0xd4, 0xef, 0x5c, 0xb4, 0x2e, 0x18, 0x51, 0x03, 0x70, 0xac, - 0xb7, 0xb0, 0xcc, 0x62, 0x21, 0x75, 0xfc, 0x68, 0xa2, 0x54, 0x05, 0xfd, - 0xb3, 0xbb, 0x01, 0x0a, 0xfd, 0x3d, 0xe3, 0xf8, 0x95, 0xa2, 0x4e, 0xc6, - 0xa3, 0x4c, 0x13, 0x4b, 0xf0, 0xf8, 0xa1, 0x30, 0x88, 0x8d, 0xe3, 0x67, - 0x37, 0xa3, 0xef, 0x42, 0x7e, 0x36, 0x6f, 0x1a, 0x9c, 0xb0, 0xf1, 0xd0, - 0x9b, 0x9a, 0x3f, 0xca, 0x11, 0xa7, 0x06, 0x13, 0x46, 0xb2, 0xa1, 0xa8, - 0x4a, 0x1c, 0xed, 0xbe, 0x4b, 0xcd, 0x14, 0xf5, 0xd8, 0x76, 0x56, 0x87, - 0x95, 0x4a, 0xa0, 0xfa, 0x4f, 0xdf, 0x85, 0xcf, 0x3b, 0xb9, 0xc3, 0x9f, - 0xa0, 0x0e, 0x7c, 0xd5, 0x2b, 0xde, 0xc4, 0x57, 0x84, 0xa8, 0x20, 0x93, - 0x20, 0xe2, 0xd6, 0x97, 0x16, 0xff, 0xae, 0x29, 0x52, 0x8f, 0xcb, 0x4c, - 0x67, 0xcb, 0xb0, 0xed, 0x29, 0xdc, 0xaf, 0xf8, 0x38, 0xf0, 0xa2, 0x91, - 0xd1, 0xbf, 0x0c, 0xb9, 0x99, 0x3e, 0xe3, 0x71, 0x08, 0xbc, 0x8b, 0x7e, - 0xd2, 0x94, 0xc5, 0x77, 0x1d, 0xcd, 0x17, 0x99, 0xd8, 0xcb, 0x63, 0x32, - 0x16, 0xb4, 0x9e, 0x77, 0xbb, 0x21, 0xe8, 0x71, 0xbd, 0x0b, 0x51, 0xc9, - 0x62, 0x6f, 0xee, 0xc9, 0x60, 0x82, 0xa9, 0xd7, 0x42, 0x27, 0xa2, 0x22, - 0x82, 0x4c, 0x18, 0xa0, 0x62, 0xb1, 0xb3, 0xdb, 0xfa, 0x98, 0x16, 0x5d, - 0x8d, 0x40, 0x62, 0x56, 0x1c, 0x17, 0x60, 0xb2, 0x55, 0x43, 0xbb, 0x92, - 0x0e, 0x9f, 0xe7, 0x6b, 0x93, 0xc8, 0x0f, 0x47, 0xd1, 0x3c, 0xd4, 0x69, - 0x16, 0xc5, 0x8d, 0xf6, 0x69, 0x79, 0xca, 0x13, 0x68, 0xc4, 0x32, 0x5d, - 0x87, 0x7a, 0x4d, 0x96, 0x08, 0x38, 0x1c, 0x6e, 0x3f, 0x29, 0xd2, 0xd0, - 0x35, 0xc1, 0x00, 0xb4, 0xf8, 0x50, 0xb1, 0x13, 0x66, 0x7c, 0xd7, 0x76, - 0x89, 0xfc, 0x68, 0xfa, 0xc7, 0x6e, 0x9f, 0x60, 0x54, 0x03, 0xf6, 0x27, - 0xe8, 0xcb, 0x0e, 0x14, 0x80, 0xb7, 0x4f, 0x77, 0xaf, 0xe5, 0xf0, 0xdd, - 0x0a, 0x2a, 0x97, 0x73, 0x3e, 0xaa, 0xb4, 0x38, 0xa6, 0xe8, 0x91, 0x4d, - 0x77, 0xc4, 0x15, 0xb1, 0x1a, 0x4e, 0x82, 0x06, 0xbc, 0x43, 0xc8, 0x27, - 0x85, 0x7b, 0x9f, 0x3f, 0xf7, 0x2e, 0xce, 0xbd, 0xc3, 0xd9, 0xfa, 0xdf, - 0x1e, 0xde, 0xc4, 0xc3, 0x04, 0x43, 0x92, 0x15, 0xdd, 0x04, 0x20, 0xcf, - 0x18, 0xa6, 0x93, 0x86, 0xd1, 0xda, 0x0c, 0x3d, 0x04, 0x57, 0xc8, 0xf0, - 0x35, 0xa4, 0xec, 0x76, 0xf0, 0xd7, 0xda, 0x13, 0x6c, 0x14, 0x4c, 0xbc, - 0x27, 0x0c, 0xf6, 0x37, 0x5e, 0x8f, 0x3d, 0x24, 0x03, 0xe8, 0x7d, 0x8a, - 0xd8, 0x3f, 0xd7, 0x69, 0x2f, 0x90, 0x7e, 0xb7, 0x92, 0xae, 0x91, 0x1c, - 0x49, 0xc8, 0xd6, 0xea, 0x65, 0xe2, 0x6c, 0x66, 0x51, 0xdf, 0x80, 0x50, - 0x0a, 0x23, 0x38, 0x1c, 0xb4, 0x3e, 0xa2, 0x3e, 0x4b, 0xe0, 0x88, 0x6e, - 0xe8, 0x0f, 0xb3, 0x42, 0xc2, 0x7b, 0xfb, 0xc8, 0x6f, 0x4e, 0xf8, 0xa4, - 0x22, 0x53, 0x50, 0xa7, 0x56, 0x02, 0xd2, 0x89, 0x7c, 0x55, 0x22, 0x7a, - 0xaf, 0x4e, 0xf0, 0x7c, 0xeb, 0x54, 0xab, 0xd3, 0x8c, 0x58, 0xa2, 0x11, - 0x77, 0x96, 0xfc, 0x64, 0x55, 0x41, 0x5d, 0x40, 0x13, 0x62, 0x23, 0x87, - 0xca, 0xd6, 0xa0, 0xb7, 0x23, 0x54, 0xc7, 0xc3, 0x0a, 0x11, 0xc7, 0x26, - 0xa2, 0xd9, 0x04, 0x9f, 0x7c, 0x76, 0x31, 0xa7, 0x23, 0xcc, 0xda, 0xb5, - 0x2a, 0x60, 0x1f, 0x28, 0xa2, 0x8d, 0xd5, 0x0e, 0x8e, 0x6c, 0x3c, 0x6a, - 0x87, 0x32, 0x08, 0x69, 0xcd, 0x8d, 0x6d, 0x40, 0x70, 0xfb, 0x3e, 0x18, - 0xda, 0x5b, 0xfd, 0x70, 0xaa, 0xbc, 0x03, 0xdc, 0xab, 0x6d, 0x93, 0x2f, - 0x47, 0xf3, 0xc1, 0xbb, 0xa5, 0xc8, 0xc6, 0xbf, 0xf2, 0x61, 0xb6, 0xbb, - 0xee, 0x31, 0xf4, 0x29, 0xea, 0x2a, 0x02, 0xae, 0x8f, 0xe0, 0x14, 0xd8, - 0x8e, 0x2a, 0x22, 0x12, 0x00, 0x2f, 0x52, 0x6c, 0xcf, 0x12, 0xe8, 0xe8, - 0x16, 0xcc, 0x92, 0xa1, 0x97, 0x5e, 0x8b, 0x5a, 0x60, 0x33, 0xbf, 0x41, - 0x4a, 0xa4, 0xc4, 0x87, 0xce, 0x41, 0x10, 0x10, 0x59, 0x2a, 0x5f, 0x30, - 0x87, 0xcc, 0x1f, 0xfe, 0x66, 0x60, 0x2d, 0x79, 0x6b, 0xb6, 0x58, 0x85, - 0x29, 0xc5, 0x1a, 0x45, 0xd5, 0x89, 0x70, 0x9f, 0x6a, 0x61, 0x92, 0x51, - 0x2a, 0x1d, 0xfe, 0x5f, 0x3d, 0x0f, 0xa3, 0x50, 0x1b, 0xef, 0xca, 0x14, - 0x24, 0x55, 0x2d, 0x46, 0xfb, 0x23, 0x7d, 0x49, 0xbc, 0x4d, 0x52, 0x2b, - 0xa5, 0x89, 0xa3, 0x61, 0x54, 0x0f, 0x49, 0xee, 0xbe, 0x41, 0x06, 0x90, - 0x7a, 0x88, 0xe4, 0xad, 0x0f, 0xce, 0x1d, 0x01, 0x65, 0x3e, 0x4d, 0xb8, - 0xa8, 0x2d, 0x53, 0xa1, 0x52, 0x8f, 0x31, 0x97, 0x92, 0x21, 0x64, 0x5d, - 0xf9, 0xa2, 0x94, 0x7e, 0x69, 0x93, 0x0a, 0x45, 0x24, 0x07, 0xcb, 0xd1, - 0x7e, 0x91, 0x69, 0x7f, 0xcf, 0x57, 0x30, 0x43, 0x27, 0x9c, 0xc8, 0x4d, - 0x1a, 0x13, 0xbe, 0xeb, 0x6f, 0x6a, 0xa8, 0xb1, 0x2d, 0x15, 0xff, 0x51, - 0x18, 0xb1, 0x03, 0x2b, 0x3a, 0xaf, 0xf8, 0x6d, 0x34, 0x35, 0xd8, 0x5a, - 0x06, 0xd5, 0x89, 0x15, 0x04, 0x09, 0xd7, 0xee, 0x5a, 0x61, 0x7d, 0x6a, - 0x7f, 0x35, 0x25, 0x6d, 0xec, 0x30, 0xf1, 0x5e, 0x58, 0x3c, 0x50, 0x81, - 0xd1, 0x5d, 0x7e, 0x67, 0xd6, 0x9f, 0x05, 0x54, 0x24, 0xd2, 0xe3, 0x89, - 0x8c, 0x80, 0x32, 0x67, 0x0d, 0xf7, 0x44, 0x7e, 0x42, 0x70, 0xe0, 0xca, - 0x69, 0xd5, 0xdc, 0xfa, 0xa4, 0x6d, 0xe1, 0x0e, 0x70, 0x41, 0xad, 0x7b, - 0x68, 0x76, 0xcd, 0x9f, 0xb4, 0x99, 0x5a, 0xc0, 0xbf, 0x60, 0x04, 0xb0, - 0xa8, 0x46, 0xb2, 0x8a, 0x63, 0xa3, 0xeb, 0xa5, 0x3a, 0xca, 0xf9, 0x49, - 0x55, 0xe1, 0x17, 0xdf, 0x21, 0xec, 0xe8, 0x89, 0xf7, 0xf4, 0xa3, 0x9e, - 0x1d, 0x9e, 0x38, 0x41, 0xb5, 0x7b, 0x00, 0x99, 0x55, 0xcb, 0xe5, 0xe4, - 0x06, 0x83, 0x76, 0xcc, 0xb7, 0xe6, 0xa0, 0x50, 0xec, 0x16, 0x7a, 0x74, - 0x71, 0x8a, 0x91, 0xec, 0x86, 0x04, 0xae, 0x7e, 0x56, 0x6e, 0xb7, 0x4e, - 0x26, 0x24, 0x15, 0x06, 0xa9, 0xa5, 0x96, 0x5f, 0xbb, 0x3d, 0x51, 0xda, - 0x25, 0x69, 0x25, 0x7c, 0x0c, 0xc6, 0x74, 0xc1, 0x4a, 0x8b, 0x4c, 0x2c, - 0x8f, 0xfe, 0xea, 0x19, 0x26, 0xaf, 0xab, 0x06, 0x80, 0x4f, 0xe3, 0x2e, - 0x5e, 0xce, 0x9c, 0x77, 0xff, 0x23, 0xed, 0xd8, 0x2b, 0x56, 0x00, 0xfc, - 0x9b, 0x9c, 0x2e, 0x3f, 0xb2, 0x7b, 0xa1, 0xe5, 0x4b, 0x74, 0x49, 0xfe, - 0x98, 0x9a, 0x1f, 0xce, 0x56, 0x2e, 0xa6, 0x1d, 0x58, 0x27, 0xe5, 0x25, - 0x97, 0x53, 0xac, 0xdf, 0x4f, 0xe6, 0xd7, 0x52, 0x27, 0x8d, 0xf2, 0xa6, - 0x0c, 0xc1, 0xed, 0x55, 0x44, 0xcf, 0x55, 0xe8, 0x13, 0x77, 0x5d, 0x4f, - 0xad, 0xf9, 0x48, 0x2a, 0xe6, 0x04, 0x53, 0x97, 0x2e, 0xc8, 0xaa, 0xbe, - 0xe0, 0x77, 0x4c, 0x4b, 0x94, 0x60, 0xca, 0xbc, 0x13, 0x23, 0x95, 0x63, - 0x31, 0x67, 0x53, 0x92, 0x28, 0x00, 0xe7, 0x15, 0x21, 0x0a, 0xb7, 0x5c, - 0x55, 0xe1, 0xf2, 0x74, 0x8b, 0x4e, 0x23, 0xde, 0x5c, 0x2d, 0x34, 0x95, - 0xef, 0x27, 0x05, 0x76, 0xc5, 0xc1, 0x32, 0x5b, 0x07, 0x4d, 0x74, 0xcd, - 0x2b, 0xe7, 0x30, 0xb7, 0x7b, 0x17, 0xc3, 0x73, 0x0f, 0x4b, 0x75, 0x23, - 0x6a, 0x67, 0x17, 0xe8, 0xe0, 0x93, 0xe2, 0xdd, 0x94, 0x1d, 0xff, 0x2d, - 0x56, 0xe6, 0x91, 0xd8, 0xe6, 0xa0, 0xc0, 0x2a, 0xc6, 0x93, 0x8d, 0x6f, - 0xe5, 0x8c, 0x00, 0x82, 0xc2, 0xb5, 0x2c, 0x4c, 0x9b, 0x8e, 0x0c, 0xad, - 0xec, 0xe8, 0xbc, 0x08, 0x01, 0xb7, 0xcc, 0x54, 0x0b, 0xbf, 0xf9, 0x86, - 0x8c, 0x0b, 0x4d, 0x52, 0xdf, 0x54, 0xc7, 0x37, 0xb8, 0xd7, 0xc1, 0x63, - 0xc4, 0xf7, 0x35, 0x3d, 0x93, 0x54, 0xab, 0xce, 0xd6, 0xa2, 0x7a, 0xf0, - 0x03, 0x40, 0x37, 0x6b, 0xb9, 0x62, 0x9a, 0xb2, 0x47, 0xb5, 0xf1, 0xfe, - 0xfe, 0xe2, 0xe3, 0xce, 0x8f, 0x6c, 0x47, 0x41, 0x66, 0x1e, 0x5d, 0xf2, - 0xc6, 0xd0, 0x68, 0x5e, 0x2d, 0xd7, 0x1d, 0x2f, 0x6b, 0xe3, 0x80, 0x61, - 0x0a, 0xcb, 0xfd, 0x78, 0x93, 0x0a, 0x28, 0x52, 0x43, 0x97, 0x6a, 0x5d, - 0xa4, 0x42, 0x77, 0x55, 0xf1, 0x46, 0x44, 0xd9, 0xc8, 0x00, 0x70, 0x66, - 0xfe, 0x0c, 0x89, 0xfe, 0x8e, 0xc5, 0x68, 0xde, 0x48, 0xd0, 0xe9, 0x6d, - 0xb6, 0xf1, 0xaf, 0xd7, 0x67, 0x85, 0x73, 0x83, 0x70, 0x5a, 0x2c, 0xbb, - 0x72, 0x8c, 0x99, 0xfd, 0xdb, 0xa5, 0x9f, 0x7c, 0xab, 0xa8, 0x0d, 0x81, - 0xbc, 0xbc, 0x02, 0x55, 0x02, 0x71, 0x6d, 0x57, 0xb8, 0xdb, 0xff, 0x42, - 0xba, 0x95, 0xc6, 0x5b, 0xad, 0x16, 0x86, 0xad, 0x1b, 0x04, 0x6c, 0xc8, - 0xc0, 0x07, 0x4e, 0x55, 0x15, 0xbc, 0x61, 0x21, 0xca, 0xd1, 0x5a, 0x2e, - 0xba, 0x96, 0x47, 0x43, 0x28, 0x75, 0x53, 0xce, 0x15, 0x9f, 0xda, 0x6d, - 0x18, 0xfc, 0xe7, 0x78, 0x29, 0x64, 0x94, 0x5b, 0x92, 0xf1, 0xf3, 0x75, - 0x1f, 0x1a, 0x20, 0xfd, 0xf6, 0xc2, 0x06, 0x4c, 0xc1, 0xe2, 0xbd, 0xaa, - 0x6b, 0xfc, 0x0f, 0xed, 0x5d, 0x5d, 0x7d, 0x85, 0xb2, 0xe1, 0x42, 0xd3, - 0xb8, 0x0c, 0xef, 0x47, 0x3f, 0xe9, 0xe3, 0xe7, 0x78, 0xdb, 0x4d, 0x3b, - 0xbb, 0x59, 0xac, 0x33, 0x81, 0x41, 0x20, 0xe5, 0x71, 0x6c, 0x99, 0x7b, - 0x67, 0x7a, 0x89, 0xc4, 0x83, 0x6c, 0x4c, 0xc1, 0x99, 0xc8, 0x0d, 0x0a, - 0xaf, 0xb1, 0x6b, 0x83, 0x6a, 0xe3, 0x9e, 0x2a, 0x48, 0x9c, 0xdc, 0xb0, - 0xb6, 0xa7, 0x0b, 0x01, 0x37, 0x0c, 0x13, 0x28, 0x8d, 0xc3, 0xa0, 0xf9, - 0xdf, 0xbe, 0xfb, 0x07, 0xd4, 0x4e, 0xcb, 0xd6, 0xde, 0x33, 0x45, 0xcb, - 0x29, 0xe6, 0xb3, 0xb3, 0x8c, 0x47, 0x74, 0x83, 0x52, 0x2f, 0x5c, 0xf3, - 0x68, 0x5e, 0xec, 0x59, 0xff, 0x91, 0x06, 0xb4, 0x23, 0x46, 0x7a, 0x28, - 0x73, 0xf1, 0x8e, 0x37, 0x59, 0x90, 0x62, 0xd7, 0x85, 0xcf, 0xb3, 0x1c, - 0xd9, 0xe6, 0x57, 0x3e, 0x98, 0xd7, 0xae, 0xa6, 0x63, 0xeb, 0x37, 0x8d, - 0x3c, 0x1c, 0x84, 0xd8, 0xf2, 0xec, 0x9f, 0x86, 0xcb, 0xaf, 0xcc, 0xc5, - 0xab, 0xf2, 0x72, 0x64, 0x01, 0x1f, 0x77, 0xb9, 0x2f, 0xa8, 0x28, 0xaf, - 0x04, 0xed, 0x58, 0x7d, 0xd9, 0xd3, 0x23, 0xd9, 0x6a, 0x23, 0xc8, 0x87, - 0xeb, 0xf1, 0xe9, 0x8a, 0x5f, 0x63, 0xcb, 0x06, 0x38, 0x54, 0x16, 0x7f, - 0x2f, 0x8c, 0xb8, 0xe2, 0x2b, 0x4d, 0xcf, 0xc6, 0x37, 0x13, 0x61, 0x4c, - 0xf3, 0x44, 0xb5, 0xb6, 0x47, 0xe5, 0x2c, 0x60, 0xa5, 0xcb, 0xe9, 0x43, - 0x14, 0x43, 0x78, 0xfe, 0x65, 0x66, 0x85, 0xa3, 0x84, 0xae, 0x44, 0x4c, - 0xf8, 0x24, 0x56, 0x22, 0xe6, 0xff, 0x2c, 0x84, 0xd8, 0x65, 0x4b, 0x3a, - 0x29, 0x9e, 0xe7, 0xfd, 0xc0, 0xb8, 0x46, 0xf1, 0x1a, 0x29, 0xd3, 0x64, - 0x80, 0x2e, 0x3a, 0x8c, 0x1e, 0x96, 0x53, 0x0a, 0x2e, 0x6f, 0xd5, 0x7d, - 0xe8, 0xb9, 0xe6, 0xaa, 0x27, 0x6f, 0x2e, 0x7d, 0x4a, 0x43, 0xd3, 0x5b, - 0x9e, 0x6e, 0x4d, 0x01, 0xa4, 0x8f, 0x77, 0x8c, 0xd0, 0xa1, 0xc5, 0xe3, - 0x30, 0x5b, 0xec, 0xcc, 0x11, 0xe6, 0x03, 0xad, 0xa5, 0x44, 0xe1, 0x6a, - 0x76, 0x1b, 0xa0, 0xdc, 0x43, 0xda, 0x0f, 0x5f, 0x20, 0x5b, 0x94, 0xec, - 0xb3, 0xb2, 0x25, 0x72, 0xac, 0xbd, 0xda, 0xda, 0xd4, 0x64, 0xeb, 0xff, - 0x0f, 0x77, 0x04, 0x30, 0x83, 0x0b, 0xa0, 0x33, 0x70, 0x4c, 0x7e, 0x07, - 0xa9, 0x72, 0x61, 0xfd, 0x7f, 0x55, 0x9e, 0x28, 0x12, 0x96, 0xaf, 0x39, - 0x1b, 0xa1, 0x44, 0xc4, 0x13, 0xbf, 0x48, 0x95, 0x15, 0x88, 0x88, 0x1c, - 0x33, 0xdd, 0x32, 0x32, 0xbc, 0x61, 0xb0, 0x0d, 0x8f, 0x39, 0x5a, 0x7c, - 0xf2, 0x97, 0xbd, 0x3e, 0xd4, 0xa9, 0x09, 0x1f, 0x9a, 0xd3, 0x02, 0x95, - 0xd8, 0x25, 0x25, 0x85, 0x84, 0x60, 0x62, 0x30, 0xd6, 0x5e, 0x49, 0x85, - 0xb7, 0xe0, 0xf3, 0x2c, 0xe2, 0xc6, 0xdc, 0x56, 0x4b, 0xe6, 0x40, 0x6b, - 0xe6, 0x9c, 0x90, 0xf9, 0x9a, 0x36, 0xb7, 0x62, 0x88, 0x9f, 0xf1, 0xb0, - 0xf5, 0xac, 0x69, 0x6b, 0xc7, 0xd4, 0x2a, 0xb0, 0xbc, 0x79, 0x83, 0x88, - 0x22, 0xf1, 0x30, 0x02, 0xb6, 0xf6, 0xdf, 0x59, 0x8f, 0x59, 0x0a, 0x3a, - 0x90, 0x1d, 0x86, 0xdb, 0x03, 0x1e, 0xfd, 0xcc, 0x13, 0xa3, 0xca, 0x93, - 0x3b, 0x68, 0x0e, 0x94, 0x92, 0xd6, 0x01, 0xea, 0x56, 0x6f, 0xa6, 0x1c, - 0xba, 0xca, 0x6c, 0x14, 0x03, 0x8b, 0xf3, 0x53, 0x2f, 0x6e, 0xec, 0x9b, - 0xbf, 0xcd, 0x75, 0xe4, 0xfc, 0x10, 0xf2, 0x33, 0x2f, 0x38, 0x7d, 0x4f, - 0xaf, 0xb9, 0xa8, 0x78, 0x8e, 0x62, 0xd6, 0x1a, 0xda, 0x65, 0x17, 0x99, - 0x20, 0xcc, 0x0e, 0x2f, 0xf5, 0x49, 0x36, 0x38, 0x19, 0xfc, 0x49, 0xa4, - 0x0c, 0xbd, 0xc9, 0x57, 0x1f, 0xcd, 0xc9, 0xcb, 0xdc, 0x0a, 0x09, 0x62, - 0x49, 0xab, 0x49, 0x60, 0xf4, 0xe7, 0xe1, 0x05, 0x24, 0xe3, 0x70, 0x05, - 0x71, 0xe1, 0x49, 0x5f, 0xad, 0xc1, 0xf8, 0x20, 0xc4, 0x7b, 0x93, 0x65, - 0xff, 0xb8, 0x5e, 0xa0, 0x89, 0x6d, 0xba, 0x77, 0xc3, 0xb5, 0x9a, 0x6f, - 0xab, 0xe9, 0x80, 0xf6, 0x22, 0x30, 0x36, 0xf6, 0xa8, 0xd0, 0x59, 0x9c, - 0xb4, 0xa9, 0x21, 0xd0, 0x99, 0x80, 0x19, 0xd1, 0x36, 0x33, 0x49, 0x67, - 0xe5, 0x95, 0x22, 0xeb, 0x14, 0x5f, 0x84, 0xd6, 0x22, 0x7c, 0xe3, 0xb8, - 0xe8, 0xa7, 0xa7, 0xd6, 0x18, 0x9a, 0x87, 0x23, 0x9b, 0x31, 0x14, 0x0d, - 0xa2, 0x0b, 0xd6, 0x4f, 0x4c, 0x38, 0xec, 0x37, 0x99, 0x15, 0x4a, 0x73, - 0x68, 0xc8, 0x67, 0x6a, 0xd3, 0xd2, 0x16, 0x97, 0x3b, 0xfb, 0x05, 0xb2, - 0xd6, 0xe4, 0x58, 0x3c, 0xce, 0xea, 0x56, 0x2a, 0x83, 0xfb, 0x86, 0x49, - 0x7c, 0x84, 0xe8, 0x07, 0x4b, 0xc7, 0x21, 0xfe, 0xc9, 0x36, 0xc4, 0x23, - 0xb1, 0x7d, 0x64, 0xcd, 0xe8, 0x36, 0xe8, 0x11, 0xf3, 0xe5, 0xb3, 0x82, - 0x04, 0xef, 0xc5, 0x42, 0xd9, 0x9a, 0x25, 0x3d, 0xce, 0x36, 0xe8, 0x74, - 0xa8, 0x58, 0x78, 0x27, 0x16, 0xa5, 0xbb, 0xd9, 0xa3, 0xfb, 0x77, 0xce, - 0x67, 0xbe, 0xbe, 0xb3, 0x7f, 0x2b, 0x93, 0x67, 0x19, 0xd7, 0x4a, 0x80, - 0xfd, 0xad, 0x65, 0x30, 0xd8, 0xee, 0x73, 0xc1, 0x99, 0x5b, 0xc1, 0x53, - 0x05, 0xa6, 0xff, 0x3f, 0x7b, 0xf7, 0x49, 0xf3, 0x77, 0x25, 0x5a, 0x49, - 0xee, 0x73, 0x24, 0x55, 0xbf, 0x81, 0xfd, 0x90, 0x06, 0x90, 0x72, 0x9b, - 0x4d, 0xe1, 0xdb, 0x84, 0xba, 0xe1, 0x91, 0x08, 0xc4, 0x1c, 0xe2, 0x13, - 0x51, 0x25, 0xcf, 0x05, 0x37, 0x07, 0x54, 0xc4, 0x1b, 0xcd, 0xb1, 0x15, - 0xd2, 0xa9, 0x26, 0xee, 0x71, 0x7d, 0xe3, 0xbd, 0xfa, 0x34, 0xd9, 0x4f, - 0x74, 0xfc, 0xeb, 0xfa, 0x1e, 0x44, 0x1f, 0x9c, 0xd7, 0x7f, 0x69, 0x67, - 0x53, 0x4a, 0x18, 0x73, 0x91, 0x59, 0x77, 0x40, 0xd1, 0x48, 0xf2, 0x89, - 0xef, 0x98, 0x9e, 0x3b, 0xd0, 0x49, 0x68, 0x07, 0x42, 0x6d, 0x93, 0x3d, - 0xf3, 0x35, 0xb1, 0x86, 0xf4, 0x82, 0x19, 0x4d, 0x37, 0xf8, 0x5f, 0x87, - 0xda, 0x6b, 0x14, 0xb3, 0x12, 0x46, 0x19, 0x27, 0xfa, 0x9b, 0x66, 0x35, - 0xff, 0xbf, 0xb2, 0x8c, 0x0a, 0xb1, 0xf9, 0x6d, 0xf1, 0x2c, 0xf5, 0x4e, - 0x2e, 0xf6, 0xb7, 0x2b, 0xa8, 0x91, 0x0c, 0xe4, 0x4c, 0xab, 0x8e, 0x05, - 0x45, 0xb5, 0xe8, 0xa5, 0xe1, 0x0b, 0xa8, 0x49, 0x51, 0x04, 0x35, 0x45, - 0x76, 0x2e, 0x28, 0x5a, 0xf0, 0xbd, 0x4e, 0x2e, 0xcc, 0xb7, 0x76, 0x8b, - 0x5e, 0x34, 0xfc, 0xac, 0x67, 0xaf, 0x0e, 0x47, 0xad, 0xb2, 0x82, 0xc4, - 0xc2, 0x82, 0xdb, 0xcb, 0x1b, 0xbf, 0xc3, 0x35, 0xb8, 0x87, 0xec, 0xc1, - 0xa8, 0x2d, 0x81, 0xf1, 0xbd, 0x35, 0x60, 0x42, 0x79, 0xa2, 0x3b, 0x43, - 0xf2, 0x9a, 0xea, 0x9e, 0x93, 0x3f, 0xc7, 0xa2, 0x8f, 0x08, 0x61, 0xf3, - 0x75, 0x39, 0x86, 0xea, 0x41, 0xe7, 0xed, 0x67, 0x29, 0xc4, 0x41, 0xf6, - 0xa3, 0x90, 0x75, 0x4b, 0x32, 0xf6, 0x1a, 0x7d, 0x3d, 0x30, 0x66, 0x0a, - 0x9d, 0x95, 0x84, 0x23, 0x65, 0x54, 0x3e, 0x00, 0xc7, 0x3c, 0x28, 0x54, - 0x59, 0xaa, 0xc3, 0xfd, 0x97, 0x7a, 0xd8, 0x2f, 0x42, 0x6a, 0x5c, 0x90, - 0xe2, 0xcf, 0xbe, 0x15, 0xd7, 0x25, 0xf7, 0xa6, 0x67, 0x94, 0x3f, 0x56, - 0x5a, 0x79, 0x20, 0x90, 0xc2, 0xc8, 0x88, 0x54, 0x72, 0xf0, 0x1c, 0x50, - 0xa0, 0xa4, 0xc6, 0x67, 0x94, 0x6c, 0x24, 0xed, 0x2a, 0xbb, 0xa4, 0x67, - 0x65, 0x8d, 0xad, 0xaf, 0xb4, 0xca, 0x00, 0xa4, 0x38, 0xf7, 0xb8, 0xf6, - 0x2c, 0xdd, 0x52, 0x34, 0x3f, 0x55, 0x98, 0xfd, 0xc5, 0xf7, 0xe0, 0xac, - 0x31, 0xcb, 0x91, 0x85, 0xb6, 0xfb, 0xa0, 0xe8, 0xd7, 0x47, 0xce, 0x20, - 0xdf, 0x55, 0x4e, 0xcb, 0xb2, 0x78, 0x0c, 0x1f, 0x60, 0xc9, 0x84, 0x86, - 0x95, 0x66, 0xe4, 0x47, 0xc1, 0xbf, 0xd1, 0xa1, 0xf2, 0x87, 0x30, 0xa8, - 0x74, 0xea, 0x7e, 0x10, 0xb9, 0x71, 0xe9, 0xae, 0x80, 0x1c, 0x45, 0xa4, - 0x48, 0x04, 0x56, 0x75, 0xa8, 0x8c, 0xee, 0x59, 0x2a, 0x06, 0x67, 0x47, - 0x14, 0x7d, 0x9c, 0x58, 0xfb, 0xbb, 0xb7, 0x85, 0x4b, 0x1e, 0xd3, 0x86, - 0x69, 0x73, 0xf9, 0x06, 0xd6, 0x36, 0x60, 0xe1, 0x9f, 0xb8, 0x59, 0x80, - 0xf4, 0x64, 0x50, 0xdc, 0x8f, 0x7e, 0x4b, 0x6e, 0x56, 0x5e, 0xf3, 0xac, - 0x1b, 0x7e, 0x27, 0xbd, 0xbe, 0x52, 0x47, 0xe0, 0xdf, 0xe7, 0xa3, 0xd4, - 0xe2, 0xa3, 0x29, 0xfc, 0x8b, 0x83, 0xa9, 0xed, 0x42, 0x22, 0xe7, 0x1a, - 0x14, 0x62, 0x4a, 0x0e, 0x12, 0x48, 0xff, 0x1e, 0x0a, 0x9d, 0xc7, 0x49, - 0x39, 0x56, 0xb2, 0x03, 0xa3, 0x66, 0x34, 0x82, 0x32, 0xca, 0x5b, 0x2d, - 0xa7, 0x50, 0x75, 0x99, 0x08, 0x28, 0xf3, 0x3f, 0x36, 0x4b, 0xf0, 0x53, - 0x98, 0xfb, 0xf6, 0xa8, 0xc4, 0x84, 0x71, 0xbd, 0xf1, 0x7f, 0x8e, 0xbb, - 0x2a, 0x02, 0x55, 0x8d, 0x72, 0x8e, 0x87, 0xa0, 0x4d, 0x82, 0x4e, 0xd6, - 0x96, 0x7a, 0xfa, 0xf5, 0x6d, 0xc3, 0x1b, 0x30, 0x17, 0x85, 0xf6, 0x54, - 0xfa, 0xd9, 0x61, 0xb3, 0xfe, 0x00, 0x98, 0x19, 0x58, 0x3c, 0x7f, 0x00, - 0x2c, 0x66, 0x24, 0x2c, 0xb3, 0xaf, 0xa3, 0x46, 0x63, 0x3b, 0x93, 0xb3, - 0x89, 0x05, 0x6c, 0xb7, 0x80, 0x08, 0x28, 0xf3, 0x42, 0x63, 0x8e, 0x97, - 0xe8, 0x85, 0x45, 0x22, 0x52, 0x25, 0x00, 0x0f, 0xac, 0xd3, 0x98, 0x16, - 0xc4, 0xac, 0x22, 0x41, 0xa0, 0x8d, 0xca, 0xd2, 0xd8, 0x54, 0xbc, 0xdf, - 0x32, 0x7c, 0xe1, 0xba, 0x66, 0xe5, 0x2a, 0xa0, 0xf6, 0x23, 0x34, 0xca, - 0xf9, 0xe4, 0xfb, 0x9b, 0x81, 0x30, 0xda, 0x50, 0xc8, 0x95, 0x5e, 0x81, - 0xaa, 0x70, 0xdd, 0xec, 0x16, 0x9a, 0x4a, 0xa6, 0x2d, 0xc5, 0x94, 0x84, - 0x8d, 0xae, 0xa4, 0xf0, 0xde, 0x21, 0x34, 0xab, 0xe3, 0x98, 0xdc, 0x5c, - 0xca, 0xbe, 0x44, 0x40, 0xd5, 0xb5, 0xae, 0x70, 0x5e, 0x29, 0x26, 0x4d, - 0x52, 0x8a, 0xed, 0xef, 0x72, 0xa3, 0x62, 0x04, 0x7a, 0x8c, 0xeb, 0xd0, - 0x0e, 0x1c, 0x39, 0xe7, 0x3e, 0xff, 0x63, 0x90, 0xe4, 0x84, 0xd5, 0x4e, - 0xf9, 0x03, 0xfe, 0x45, 0xd6, 0x96, 0x55, 0xbf, 0xde, 0xe5, 0x6a, 0x71, - 0x6d, 0x85, 0x96, 0xd8, 0xca, 0x02, 0xec, 0xd0, 0xd4, 0xef, 0x0f, 0xfb, - 0xd9, 0x0a, 0xec, 0x02, 0xac, 0xbd, 0x80, 0xb0, 0x1e, 0xec, 0xaa, 0xf4, - 0xf0, 0x4e, 0x6b, 0xd9, 0x4e, 0x43, 0x40, 0xf5, 0x57, 0xac, 0x06, 0xb7, - 0xd6, 0x29, 0xd4, 0x29, 0x3f, 0x9d, 0x24, 0x70, 0xc8, 0x82, 0xe9, 0x4f, - 0x10, 0x6a, 0x7b, 0xca, 0xf6, 0xba, 0xd0, 0xd9, 0x74, 0x2a, 0x9e, 0x05, - 0x36, 0x7b, 0xbc, 0x6a, 0x4f, 0x33, 0x70, 0xca, 0xf6, 0x87, 0xbb, 0x5b, - 0xc3, 0x74, 0xd8, 0xbc, 0x3e, 0x71, 0x3f, 0xc8, 0xe1, 0x23, 0x08, 0x82, - 0xf6, 0xa0, 0xf6, 0x9b, 0x96, 0x4b, 0xbe, 0x0d, 0xb9, 0xa1, 0xe3, 0x94, - 0x41, 0xbb, 0x68, 0x1e, 0xa2, 0x33, 0x7d, 0xf9, 0x8c, 0x1e, 0x1f, 0x3e, - 0x7e, 0xc0, 0xb8, 0x81, 0x79, 0x07, 0xae, 0xb7, 0x5d, 0x03, 0xe8, 0x94, - 0x14, 0x8e, 0xf8, 0x14, 0xc0, 0x4f, 0x0b, 0x3d, 0x9f, 0x91, 0x06, 0xcf, - 0x7a, 0xa2, 0xfd, 0x67, 0x29, 0x4a, 0x00, 0xa5, 0x34, 0x78, 0x1b, 0x04, - 0xa7, 0xe0, 0x34, 0x75, 0x8a, 0xd2, 0x79, 0x19, 0x38, 0x59, 0x47, 0x23, - 0x50, 0xdb, 0x28, 0x1e, 0x6a, 0x9f, 0x3c, 0xc3, 0xf2, 0x36, 0xad, 0x62, - 0x98, 0xe5, 0xc1, 0xec, 0x03, 0x23, 0xc2, 0xf0, 0x08, 0x5c, 0x08, 0xd2, - 0xe3, 0x7c, 0x67, 0x4a, 0x88, 0x81, 0xb9, 0xfe, 0xef, 0x60, 0x53, 0x3a, - 0x37, 0x7f, 0xf1, 0x63, 0x3b, 0xb8, 0xba, 0x43, 0x39, 0xdb, 0x62, 0x69, - 0x1a, 0x33, 0x81, 0x3e, 0x70, 0xc8, 0x43, 0x3c, 0x5c, 0xce, 0xfc, 0x98, - 0x61, 0x19, 0xf5, 0x95, 0xf2, 0xc3, 0xe2, 0xf8, 0xd5, 0x80, 0x4a, 0xf5, - 0xb0, 0xae, 0x74, 0x01, 0xfd, 0x04, 0x26, 0x35, 0x2f, 0x7b, 0xd1, 0xca, - 0xad, 0xa8, 0xbe, 0xd3, 0x3a, 0xea, 0x9a, 0xbd, 0x8f, 0x96, 0x03, 0xf7, - 0x5b, 0x99, 0x1c, 0xfb, 0x6f, 0x17, 0x50, 0x8b, 0x68, 0x6b, 0xaf, 0xed, - 0x87, 0xdb, 0x3c, 0x9b, 0x61, 0x28, 0xcf, 0x7a, 0x7f, 0xac, 0xf8, 0x82, - 0x18, 0x1e, 0x35, 0x14, 0x20, 0xa6, 0x0e, 0x0a, 0x3d, 0xc9, 0x57, 0x6e, - 0x14, 0x15, 0x4a, 0xce, 0x11, 0x92, 0xcd, 0x81, 0x36, 0x4b, 0xa9, 0x02, - 0xa4, 0xea, 0x40, 0x87, 0x61, 0x7b, 0x3b, 0x85, 0xab, 0x6b, 0xbd, 0xe7, - 0x97, 0xc9, 0x7a, 0x1d, 0x78, 0xb4, 0xc4, 0xf8, 0x61, 0xc4, 0x18, 0xd8, - 0xea, 0x3a, 0xd0, 0xdd, 0x49, 0x4b, 0x93, 0xc4, 0xd7, 0xd0, 0x92, 0x64, - 0xa6, 0x97, 0xab, 0x7f, 0x54, 0x1d, 0xc4, 0x72, 0x08, 0x14, 0xc4, 0x02, - 0x17, 0xe9, 0xb6, 0x0f, 0x28, 0xa1, 0xa6, 0x6b, 0xb6, 0x79, 0xda, 0xd6, - 0xbc, 0x55, 0x0b, 0x59, 0x16, 0xc6, 0xa0, 0x4f, 0xfb, 0x3b, 0xce, 0x27, - 0x9a, 0x5c, 0x18, 0x46, 0xe7, 0x2e, 0x60, 0x6f, 0x9a, 0xe3, 0xe7, 0xf9, - 0x70, 0xc8, 0x15, 0xf1, 0x39, 0xfa, 0x6b, 0xf3, 0xcb, 0xf8, 0x25, 0xdf, - 0xac, 0x3c, 0xe8, 0xb9, 0x6a, 0xcc, 0xbe, 0xca, 0x6e, 0x30, 0x24, 0xc2, - 0x9e, 0x62, 0x5b, 0xae, 0xf8, 0x0e, 0xbc, 0x38, 0xf6, 0xe1, 0x7a, 0xf5, - 0x0d, 0x8b, 0xda, 0xd1, 0x2c, 0xc1, 0x18, 0x15, 0x5b, 0x9f, 0x1b, 0x8d, - 0x33, 0x67, 0xe1, 0xec, 0x01, 0x0f, 0x56, 0x86, 0x47, 0x58, 0x8c, 0xb1, - 0xc4, 0x12, 0x5d, 0xee, 0x26, 0x9b, 0x48, 0xef, 0x14, 0xd2, 0xbd, 0xb4, - 0x20, 0xd4, 0x03, 0xec, 0x3d, 0xe8, 0x6f, 0x22, 0x88, 0x17, 0x1d, 0x98, - 0xf3, 0xf6, 0x76, 0x73, 0xe0, 0x86, 0x5e, 0x39, 0xcb, 0x8f, 0x7b, 0x75, - 0x1b, 0x13, 0x40, 0x94, 0x78, 0xfa, 0x5f, 0xa4, 0x5d, 0xb5, 0x01, 0x0c, - 0x96, 0x3d, 0x1c, 0x0a, 0x71, 0x2f, 0xb8, 0x1f, 0xf6, 0xd3, 0x1d, 0x5b, - 0x35, 0xf2, 0x56, 0x79, 0x4a, 0x09, 0x9f, 0x68, 0x6b, 0xbb, 0x5e, 0x8b, - 0xce, 0x27, 0x4e, 0xb2, 0x4b, 0x81, 0x6f, 0xcf, 0xfa, 0xa0, 0x88, 0x0c, - 0xd9, 0xe5, 0xbe, 0x4c, 0xc3, 0x33, 0x90, 0xc3, 0xf6, 0x36, 0x8d, 0x47, - 0x84, 0x50, 0xf2, 0x9d, 0xbf, 0x40, 0x12, 0x24, 0x52, 0x02, 0x79, 0xc8, - 0x1d, 0x79, 0x28, 0x0c, 0xe7, 0x32, 0x64, 0x45, 0x2a, 0xd4, 0x49, 0xe0, - 0xcd, 0xa6, 0xb0, 0x3a, 0x3d, 0xee, 0x4f, 0x35, 0xf9, 0x83, 0x8c, 0x5d, - 0x9f, 0x9c, 0x94, 0xf1, 0xa5, 0x20, 0x9d, 0x24, 0xd2, 0x80, 0x92, 0x78, - 0xdc, 0x93, 0x0f, 0xc7, 0xdb, 0xa8, 0xe7, 0x11, 0x46, 0x07, 0x1d, 0x2a, - 0xe7, 0xe0, 0x53, 0xab, 0xfe, 0xf7, 0x38, 0xd6, 0xbd, 0x5d, 0x30, 0x86, - 0x16, 0x4b, 0x81, 0x48, 0x8f, 0x8f, 0xc1, 0x1f, 0x31, 0x6f, 0x03, 0x23, - 0xf0, 0x5e, 0x2c, 0xc7, 0x36, 0xb9, 0xef, 0xc7, 0x31, 0x62, 0xee, 0x86, - 0xa0, 0xcc, 0x3e, 0x88, 0x40, 0x5b, 0xac, 0x73, 0xe0, 0x30, 0x82, 0x11, - 0xd7, 0x97, 0x95, 0x90, 0xc9, 0x01, 0x5a, 0x05, 0xa5, 0xe2, 0x94, 0x27, - 0x3f, 0xae, 0xf5, 0xcc, 0x97, 0x99, 0x3f, 0x78, 0xbd, 0xfa, 0xd6, 0x2f, - 0x78, 0x40, 0x1f, 0xaf, 0x3c, 0xdb, 0x5b, 0x22, 0x6b, 0xde, 0x52, 0x44, - 0x96, 0x0f, 0x73, 0x0b, 0x6f, 0xe3, 0xe3, 0x36, 0x62, 0xa7, 0x71, 0x00, - 0x4e, 0xfe, 0xde, 0x00, 0xb3, 0x5c, 0x7e, 0x66, 0xf1, 0x7c, 0xf3, 0x27, - 0xe0, 0x8a, 0xc9, 0xf6, 0xf1, 0x08, 0x11, 0x7d, 0x1f, 0x07, 0xcc, 0x29, - 0x93, 0x45, 0x19, 0xae, 0xe3, 0x12, 0xe4, 0x45, 0xa8, 0x9a, 0x8c, 0x25, - 0x04, 0x03, 0xec, 0xbf, 0xf6, 0x55, 0x6e, 0xda, 0x07, 0x98, 0x6a, 0xca, - 0x67, 0xcb, 0x2c, 0xd3, 0xd5, 0x06, 0xe3, 0xca, 0xd6, 0xfc, 0xe7, 0x8f, - 0xd6, 0x7a, 0x57, 0xd7, 0xf8, 0x08, 0xfb, 0xae, 0x9d, 0xa3, 0x71, 0x41, - 0x4f, 0x5f, 0xd9, 0x90, 0x2c, 0x5c, 0x6b, 0x0e, 0xc5, 0xa4, 0x27, 0x3d, - 0x7a, 0xa4, 0xbd, 0x0d, 0x01, 0xeb, 0x0e, 0x0e, 0xf8, 0x4a, 0x41, 0x84, - 0x23, 0x35, 0x6d, 0xf3, 0xa0, 0x72, 0x88, 0x31, 0x9c, 0xa3, 0x45, 0x15, - 0x5b, 0x6a, 0xf7, 0xbf, 0x62, 0xed, 0x44, 0x1e, 0x5c, 0xd2, 0x46, 0x81, - 0xc8, 0xf8, 0xdc, 0x93, 0x0c, 0x7f, 0x0b, 0x8b, 0x74, 0x0e, 0x88, 0x91, - 0x3d, 0xa9, 0x2d, 0xad, 0x00, 0xe1, 0xd1, 0x10, 0xec, 0xe0, 0xa2, 0x65, - 0x1b, 0x7e, 0x84, 0x30, 0xde, 0x3d, 0xfe, 0xcf, 0xb3, 0x78, 0xd9, 0x23, - 0x4a, 0x40, 0xfd, 0xa9, 0x90, 0xcc, 0xba, 0xb4, 0xb1, 0x43, 0x35, 0x29, - 0x7f, 0x25, 0x34, 0x43, 0x57, 0x4b, 0x48, 0x88, 0x74, 0xcc, 0x2a, 0x03, - 0xcb, 0xe3, 0xff, 0x2d, 0x06, 0x9f, 0x9a, 0xd9, 0x04, 0xc9, 0x04, 0x36, - 0xbb, 0x16, 0x01, 0xab, 0xf7, 0xd8, 0xf2, 0x81, 0xbd, 0x97, 0x24, 0xca, - 0xb0, 0x43, 0x0f, 0x73, 0xd0, 0x5b, 0x32, 0xa2, 0x1c, 0x76, 0x64, 0xb7, - 0x96, 0x4d, 0x29, 0x97, 0xd7, 0x8d, 0x32, 0x61, 0xd4, 0xad, 0x08, 0xbe, - 0xfb, 0x17, 0xd5, 0xd4, 0x07, 0x54, 0x06, 0xd3, 0x48, 0x5c, 0x86, 0x47, - 0xeb, 0x13, 0xca, 0x96, 0x95, 0x8b, 0xa3, 0x39, 0xd7, 0xbb, 0x62, 0x08, - 0x51, 0xee, 0x7e, 0x52, 0xe0, 0x24, 0x12, 0xe2, 0xb8, 0x9c, 0x90, 0xf8, - 0xb6, 0x47, 0xe2, 0xe8, 0x8a, 0x4a, 0xa2, 0xbd, 0xdd, 0x91, 0xe6, 0xee, - 0x3b, 0xd6, 0x7d, 0xc2, 0x4e, 0x86, 0x3d, 0x87, 0xaf, 0x7a, 0x5f, 0x36, - 0x4f, 0xe6, 0x07, 0xac, 0xee, 0x6b, 0x17, 0x94, 0x08, 0xd1, 0xac, 0xef, - 0xaf, 0xf0, 0x94, 0x2f, 0x1c, 0x4a, 0x9f, 0x4d, 0x54, 0xc9, 0x27, 0x0f, - 0x7d, 0x30, 0x37, 0x09, 0x9d, 0x35, 0x91, 0x6e, 0xa2, 0xfd, 0x0b, 0xb4, - 0xc4, 0x48, 0x03, 0xad, 0xce, 0xab, 0x7a, 0x14, 0xe4, 0xc6, 0xbc, 0xbb, - 0x68, 0xfe, 0xf9, 0x9e, 0x9f, 0x75, 0xc3, 0xa8, 0x61, 0x3e, 0x11, 0x2c, - 0xbe, 0x46, 0x82, 0x84, 0x62, 0xf8, 0xc0, 0x40, 0x72, 0x93, 0x1c, 0x77, - 0x54, 0x8d, 0x0d, 0x9d, 0x73, 0x69, 0x34, 0x4d, 0xd2, 0x0e, 0xa4, 0x1f, - 0xbf, 0x51, 0xb8, 0xad, 0xf4, 0xcf, 0xf1, 0xd7, 0x45, 0x92, 0xd6, 0xcc, - 0xfc, 0xa4, 0xd6, 0xb4, 0xb7, 0x6a, 0x3c, 0x19, 0x95, 0x58, 0xc5, 0x2b, - 0x3f, 0x6b, 0x03, 0x45, 0x39, 0x6b, 0x17, 0x34, 0x34, 0xef, 0x95, 0x7a, - 0x58, 0x2b, 0xd8, 0x7f, 0xcd, 0x0a, 0xc7, 0x7f, 0xe9, 0xd7, 0xd2, 0xd8, - 0xbe, 0x40, 0x6c, 0xfa, 0x72, 0x12, 0x94, 0x2f, 0x08, 0x46, 0x7f, 0x02, - 0x4c, 0xaa, 0x70, 0xee, 0x3a, 0x80, 0xd9, 0xa8, 0x3f, 0x43, 0x7e, 0x6d, - 0x31, 0x42, 0xe1, 0x31, 0x8e, 0x58, 0xe6, 0xae, 0xdb, 0x69, 0x8e, 0x97, - 0x29, 0x2c, 0xdd, 0x64, 0x97, 0x1f, 0x8b, 0xaa, 0xab, 0xa8, 0xab, 0x84, - 0x51, 0x91, 0x3c, 0xf4, 0x71, 0xb2, 0x8c, 0x9f, 0xa2, 0x78, 0x6d, 0x35, - 0x4c, 0x56, 0xe8, 0xdd, 0xc9, 0x27, 0x47, 0x58, 0x2f, 0xc8, 0x48, 0xf8, - 0x7d, 0x1e, 0xcd, 0x36, 0x5c, 0xba, 0x1e, 0xf1, 0x29, 0x86, 0xde, 0x43, - 0xf8, 0xe4, 0x06, 0x59, 0x67, 0x16, 0xe4, 0xde, 0xb4, 0x9f, 0x4c, 0xd8, - 0xea, 0x81, 0x04, 0xde, 0x2c, 0x31, 0x15, 0x67, 0xa5, 0x58, 0x63, 0x7a, - 0x85, 0xf1, 0x9c, 0xcf, 0xf6, 0x64, 0x0c, 0xf5, 0x27, 0x08, 0x39, 0xf8, - 0xa6, 0x5a, 0x0e, 0x45, 0xae, 0xdc, 0x28, 0x96, 0x25, 0x2e, 0x6b, 0xe8, - 0xcf, 0xbb, 0x3f, 0x82, 0x15, 0xf5, 0x4e, 0x3a, 0x30, 0x8f, 0xd9, 0x94, - 0x7d, 0xca, 0xae, 0x7b, 0x3f, 0x9a, 0x09, 0xb6, 0xe8, 0xba, 0x5f, 0xe5, - 0x05, 0xe6, 0xe3, 0x76, 0x7b, 0x16, 0xf3, 0x14, 0xc3, 0xec, 0xe1, 0xd3, - 0xf8, 0x19, 0xd9, 0x28, 0x2a, 0xf7, 0x64, 0xe0, 0x1b, 0xa3, 0x81, 0xaf, - 0xf1, 0xe9, 0xa1, 0xe3, 0xf1, 0xfb, 0x2a, 0x24, 0xbe, 0x2f, 0x82, 0xb2, - 0x59, 0xd0, 0xaf, 0x30, 0xd4, 0x0c, 0x37, 0xcc, 0xc2, 0x1e, 0xbb, 0xc4, - 0x18, 0x0e, 0xac, 0xc7, 0xed, 0xfa, 0x0b, 0x6e, 0xa0, 0x03, 0x04, 0x9e, - 0x87, 0xf0, 0x98, 0x9e, 0x3b, 0x2f, 0x2c, 0x7d, 0x32, 0xf5, 0xec, 0x94, - 0x32, 0x22, 0x86, 0xab, 0x41, 0x00, 0xc9, 0x88, 0xf7, 0xa1, 0x45, 0x22, - 0x37, 0x4a, 0xee, 0x07, 0xda, 0xdb, 0xcd, 0x02, 0xbb, 0x99, 0xaa, 0x8c, - 0x05, 0x09, 0xc0, 0x98, 0x83, 0x35, 0x4a, 0xf4, 0x65, 0xfb, 0x8f, 0xcf, - 0x14, 0x46, 0x68, 0x00, 0xcf, 0xb4, 0x3d, 0x0c, 0xce, 0x1f, 0xc4, 0x46, - 0x2d, 0xdb, 0x44, 0x33, 0x65, 0x2f, 0x22, 0x78, 0x45, 0x0a, 0x59, 0xf5, - 0xf8, 0xbb, 0xbd, 0x2d, 0x55, 0xe5, 0x8c, 0xe1, 0x33, 0x89, 0x65, 0x9c, - 0xd5, 0x39, 0x2c, 0xd9, 0xfd, 0xa9, 0x74, 0x9a, 0x08, 0xb5, 0x93, 0x4e, - 0x48, 0x1f, 0xa1, 0x33, 0xe8, 0xc3, 0x90, 0x7e, 0xbd, 0x55, 0x20, 0x77, - 0x19, 0x23, 0x57, 0x91, 0x91, 0xe9, 0xb1, 0xfa, 0x69, 0x15, 0xbc, 0x75, - 0xd3, 0x88, 0xaf, 0x2f, 0x67, 0xaa, 0xae, 0xfc, 0xdc, 0xba, 0x2c, 0x1d, - 0x1e, 0x16, 0x25, 0xba, 0xc0, 0x4c, 0x1f, 0x65, 0x6d, 0x9e, 0xf3, 0x3b, - 0xae, 0x48, 0x54, 0x20, 0x88, 0x89, 0x63, 0x97, 0x08, 0x7f, 0x65, 0x34, - 0x4a, 0xd4, 0x14, 0xea, 0x90, 0xe0, 0x65, 0xb4, 0x11, 0xf5, 0x53, 0x83, - 0xa1, 0x95, 0x36, 0x41, 0x79, 0x34, 0xe4, 0xfd, 0x4a, 0x79, 0xc8, 0x39, - 0x5f, 0xc2, 0x3f, 0xfb, 0x16, 0xde, 0x53, 0xd9, 0x85, 0xed, 0x0a, 0x79, - 0x52, 0x05, 0x1c, 0xf3, 0x33, 0x82, 0xf9, 0x2d, 0x62, 0x33, 0x3a, 0xae, - 0xa2, 0x26, 0x65, 0x3a, 0x0e, 0x6c, 0xcd, 0x81, 0x34, 0xea, 0xc9, 0xb1, - 0x10, 0x64, 0xe9, 0xe9, 0x62, 0x58, 0xb2, 0xc2, 0x97, 0x62, 0x0f, 0x42, - 0xea, 0x58, 0x06, 0xe8, 0x06, 0xdf, 0x17, 0x27, 0x99, 0x25, 0x26, 0x9a, - 0x34, 0xb5, 0x8d, 0xcf, 0xc8, 0x98, 0x15, 0x29, 0xad, 0xa7, 0xba, 0x88, - 0x77, 0xa9, 0xe3, 0x90, 0x6a, 0xdc, 0x0d, 0x7e, 0xc3, 0x1e, 0x90, 0xc2, - 0xd6, 0x07, 0xe7, 0x81, 0x5f, 0x81, 0x38, 0xf3, 0x6b, 0xa8, 0x42, 0x2b, - 0x16, 0xb9, 0x47, 0x62, 0x01, 0x9c, 0x72, 0x32, 0xf6, 0x53, 0x11, 0xcb, - 0xcf, 0xda, 0x9d, 0x2c, 0x5d, 0x1a, 0x8a, 0xef, 0xe0, 0xb2, 0xed, 0xc5, - 0x42, 0xea, 0x4d, 0x3d, 0x92, 0xbf, 0x30, 0xd5, 0xb7, 0x96, 0x1d, 0x10, - 0xf3, 0x66, 0x42, 0x84, 0xae, 0x7e, 0x9b, 0x63, 0x18, 0x0e, 0x9e, 0xf5, - 0x6e, 0xdf, 0xd9, 0xde, 0x8b, 0x15, 0x32, 0x0f, 0x0d, 0x7f, 0xc4, 0x4d, - 0x1b, 0x83, 0x4a, 0x6a, 0xbf, 0xf1, 0x88, 0x2a, 0x3e, 0x14, 0xd5, 0x48, - 0xf8, 0x59, 0xbe, 0x04, 0x06, 0x81, 0xcd, 0x2c, 0x1d, 0x1f, 0x96, 0x59, - 0x3e, 0x37, 0xb1, 0x07, 0xca, 0x34, 0xf7, 0x1d, 0xd1, 0xfa, 0x21, 0x6e, - 0xb5, 0xb9, 0xf3, 0x70, 0x8b, 0xe8, 0xe7, 0xa2, 0x56, 0xae, 0xfb, 0x86, - 0x24, 0xac, 0x8f, 0x56, 0x9d, 0x13, 0xc4, 0x34, 0x2d, 0x06, 0x70, 0x7e, - 0x18, 0xa2, 0x03, 0xa0, 0xfd, 0xa3, 0x20, 0xc0, 0x05, 0xa0, 0xc0, 0x41, - 0x7b, 0x74, 0xc2, 0xbf, 0x00, 0x1a, 0x3d, 0x36, 0x22, 0x4b, 0xd0, 0x2e, - 0x1f, 0x00, 0xa3, 0x0a, 0x39, 0x97, 0x56, 0xdc, 0xb5, 0xc2, 0xa5, 0xa0, - 0x5e, 0x06, 0xe2, 0xa5, 0x6a, 0xf8, 0x65, 0x90, 0x39, 0x93, 0x89, 0x8c, - 0x7e, 0x42, 0xa2, 0xca, 0xf1, 0x97, 0x32, 0xc3, 0x66, 0x2d, 0x5a, 0x4f, - 0x66, 0xbb, 0x0e, 0x6e, 0x41, 0xe5, 0x08, 0x6a, 0x44, 0xb6, 0x4b, 0x80, - 0x38, 0x27, 0x4f, 0x9b, 0x67, 0xe8, 0xdf, 0x92, 0xe1, 0x9a, 0xef, 0x8f, - 0x63, 0x3a, 0xea, 0x3e, 0x5d, 0x29, 0xfa, 0x1e, 0x82, 0x7b, 0xe8, 0x65, - 0xda, 0x30, 0xb2, 0x0f, 0x81, 0x0b, 0xe8, 0x10, 0x5a, 0xa3, 0xd0, 0x60, - 0x54, 0x96, 0xb1, 0xef, 0xb0, 0x2c, 0x01, 0xf8, 0x59, 0x49, 0xe1, 0xb4, - 0x8a, 0x33, 0xbb, 0x3e, 0xf8, 0xe2, 0x77, 0x3c, 0x28, 0x74, 0x98, 0xc2, - 0xc6, 0xe0, 0xcc, 0xa0, 0x94, 0x7c, 0x91, 0x8a, 0x10, 0xc5, 0x29, 0x74, - 0xdf, 0x32, 0xda, 0x71, 0x2d, 0xf9, 0x54, 0x56, 0x13, 0x4b, 0xc4, 0x50, - 0x71, 0xf8, 0x2a, 0xd0, 0x87, 0xd8, 0xb7, 0x54, 0x7e, 0x73, 0x73, 0xfe, - 0xfb, 0x49, 0x21, 0xd6, 0x4d, 0x4f, 0x40, 0x1f, 0xaf, 0x9e, 0xb8, 0x6e, - 0x22, 0xe7, 0x3b, 0x56, 0x2a, 0xe5, 0x27, 0x0c, 0x07, 0x61, 0xc9, 0x96, - 0xa9, 0x6b, 0x49, 0xdb, 0x80, 0x92, 0x44, 0x5c, 0xcd, 0xf7, 0xe8, 0xa4, - 0x75, 0xb0, 0x6f, 0xd7, 0x4b, 0x9a, 0x88, 0xea, 0xde, 0x21, 0x63, 0x3b, - 0x02, 0x60, 0xce, 0x3a, 0xc9, 0x14, 0x6e, 0x84, 0xf1, 0xe4, 0x5b, 0x8f, - 0x20, 0xb7, 0xf1, 0x59, 0xd4, 0x56, 0xbb, 0x8d, 0xde, 0xd5, 0x9e, 0x16, - 0x9b, 0x8a, 0xa8, 0x05, 0x77, 0xde, 0x26, 0x15, 0x7c, 0x56, 0xbe, 0xc6, - 0xbc, 0x79, 0xb7, 0x4a, 0x2a, 0xc1, 0x8b, 0xfb, 0xbb, 0xd6, 0x86, 0xa1, - 0xe8, 0x1f, 0x17, 0x89, 0x28, 0xc3, 0x22, 0x3d, 0x7e, 0x63, 0x4e, 0xd0, - 0xc4, 0xfb, 0x2c, 0x47, 0x40, 0xc3, 0xce, 0x70, 0xf9, 0x58, 0xc1, 0xe7, - 0x82, 0x9a, 0x69, 0x26, 0x37, 0x45, 0xe1, 0xdb, 0x24, 0x66, 0xcd, 0xcc, - 0xd3, 0xa2, 0xe8, 0x08, 0x4e, 0xda, 0x0b, 0x2f, 0xd3, 0x25, 0x0a, 0x25, - 0x92, 0xf8, 0x99, 0xbb, 0x89, 0xc9, 0x40, 0xee, 0x61, 0xb1, 0x55, 0x59, - 0x87, 0xa7, 0xc3, 0x60, 0x4d, 0xf7, 0x16, 0xea, 0x1f, 0x25, 0xab, 0xcd, - 0x87, 0xd7, 0x87, 0x48, 0xbf, 0x59, 0x36, 0xba, 0xca, 0xb0, 0xa0, 0xa3, - 0x97, 0xa8, 0x10, 0x73, 0xce, 0x4b, 0xf8, 0x39, 0x60, 0xea, 0x4b, 0xcb, - 0x56, 0x09, 0x87, 0xca, 0xf6, 0x5c, 0x62, 0x9a, 0xb7, 0xb8, 0x74, 0xe0, - 0x84, 0x9f, 0xbd, 0x29, 0x2d, 0x91, 0x5b, 0x9e, 0x75, 0xd7, 0xc2, 0x97, - 0x87, 0x2a, 0xe0, 0xc0, 0xab, 0x90, 0xe3, 0x46, 0xb8, 0x1a, 0x25, 0xf4, - 0x3e, 0x58, 0x83, 0x18, 0x7f, 0xac, 0x35, 0x9d, 0x52, 0xb9, 0x90, 0x77, - 0xa2, 0x59, 0xc0, 0x68, 0xd1, 0xba, 0x2b, 0x47, 0x14, 0x8b, 0x97, 0x1b, - 0xfc, 0xc6, 0x5e, 0xf6, 0x02, 0xf5, 0x7f, 0xea, 0x5b, 0x85, 0x72, 0x26, - 0x1e, 0x90, 0x8c, 0xd7, 0x55, 0x9c, 0xbb, 0x7b, 0x9d, 0xdb, 0xf3, 0xb5, - 0xa2, 0xb5, 0x3e, 0x8e, 0x64, 0x34, 0xda, 0x33, 0x62, 0xb9, 0xbf, 0x0b, - 0x17, 0x94, 0x85, 0xf4, 0xcb, 0x22, 0x97, 0x0e, 0xdc, 0xfd, 0x0f, 0x76, - 0x88, 0x4e, 0x43, 0x67, 0x56, 0xad, 0x3e, 0x90, 0x47, 0xfb, 0x66, 0x83, - 0xc4, 0x1b, 0x04, 0x8c, 0xed, 0x39, 0xf8, 0xa3, 0xe6, 0xab, 0xcc, 0xa0, - 0x0d, 0xf1, 0xb0, 0x54, 0x90, 0x9d, 0x57, 0xcd, 0x52, 0xcf, 0xc5, 0xec, - 0x9f, 0x64, 0x8a, 0x97, 0x7f, 0xbb, 0xed, 0x81, 0xc9, 0x11, 0x44, 0x55, - 0xc0, 0x7c, 0xee, 0x7c, 0x5a, 0x02, 0x28, 0xbf, 0x24, 0x99, 0xe7, 0x52, - 0x1f, 0x3b, 0x06, 0x29, 0x18, 0x25, 0xdc, 0xbe, 0x99, 0xe3, 0xce, 0x1e, - 0xe8, 0xdc, 0x8b, 0x59, 0x0a, 0x70, 0xfe, 0xee, 0x4f, 0x6c, 0x73, 0xd7, - 0x5f, 0x27, 0x90, 0x36, 0x8f, 0x04, 0x31, 0x78, 0xa9, 0xdc, 0xe2, 0xba, - 0xe5, 0xed, 0x29, 0x02, 0x6d, 0xc4, 0x6c, 0xd9, 0xa8, 0x80, 0xa1, 0x08, - 0x81, 0x0c, 0x37, 0x3f, 0xf6, 0x83, 0x83, 0x37, 0x38, 0xb3, 0x10, 0x04, - 0x87, 0x7e, 0xc4, 0x61, 0xf0, 0x14, 0x63, 0x5c, 0x7a, 0x7a, 0xc2, 0x14, - 0xab, 0xbd, 0x3a, 0xc7, 0xd9, 0x01, 0x99, 0xe8, 0xcd, 0xaf, 0x1b, 0xcc, - 0x95, 0x39, 0x72, 0x1e, 0xf0, 0x48, 0xc7, 0xbd, 0x14, 0x75, 0x38, 0x8d, - 0x90, 0xfe, 0x03, 0x4e, 0x33, 0x48, 0x78, 0x6a, 0x3f, 0x98, 0xf5, 0xd1, - 0x68, 0x58, 0x5e, 0xfd, 0x9d, 0x95, 0x99, 0x58, 0xb3, 0x89, 0xf6, 0xd2, - 0xac, 0x19, 0xbc, 0x44, 0x43, 0x10, 0x05, 0xb4, 0x0a, 0x40, 0xe3, 0x03, - 0x32, 0x5d, 0xbf, 0x32, 0xe9, 0x9d, 0x1d, 0x8a, 0xe6, 0x29, 0xec, 0xca, - 0x98, 0x49, 0xb4, 0xfa, 0xb0, 0xec, 0xeb, 0x22, 0xff, 0xbe, 0x7d, 0x83, - 0x35, 0xa6, 0x67, 0x94, 0x2f, 0x13, 0x66, 0xdb, 0xba, 0xea, 0x42, 0xe7, - 0x05, 0xb4, 0x3f, 0x84, 0x54, 0x97, 0xcb, 0x11, 0x4e, 0xa0, 0x5b, 0x04, - 0x0a, 0xe8, 0x57, 0x70, 0x92, 0xc6, 0xaf, 0x10, 0x55, 0x50, 0xab, 0x08, - 0x5b, 0xcb, 0x3d, 0x23, 0x0e, 0xea, 0x7e, 0x11, 0x9a, 0x1c, 0x13, 0x1c, - 0xc2, 0xa5, 0xe5, 0x1e, 0xa0, 0x67, 0xc2, 0x1d, 0xc4, 0x2d, 0xb7, 0x14, - 0xc0, 0x33, 0xfa, 0x5e, 0xaa, 0x1d, 0x62, 0xaf, 0x73, 0x7c, 0x36, 0xd8, - 0x2a, 0x7f, 0xe0, 0xab, 0xff, 0xbf, 0x8e, 0x07, 0x25, 0x5c, 0x15, 0xe1, - 0x8d, 0x2f, 0x27, 0xc0, 0xd2, 0x51, 0xb5, 0x09, 0x77, 0xbe, 0xaa, 0xba, - 0x47, 0x0d, 0x37, 0x88, 0x43, 0xb5, 0x38, 0x29, 0x7d, 0x30, 0x4c, 0x86, - 0x8c, 0x92, 0xc8, 0xbf, 0xa6, 0x5c, 0x2e, 0x03, 0xde, 0x96, 0x16, 0x9e, - 0x28, 0xc3, 0x7d, 0xb0, 0x21, 0x23, 0x05, 0xa4, 0x2a, 0x4c, 0x4c, 0xeb, - 0xb4, 0x9e, 0x94, 0x9d, 0xc5, 0x3d, 0x60, 0x18, 0x39, 0xdb, 0x6d, 0x01, - 0x07, 0x1b, 0xb4, 0xab, 0x0c, 0x6a, 0xf8, 0xc7, 0xb3, 0xfa, 0xf7, 0x8f, - 0x1d, 0x62, 0x51, 0x43, 0x29, 0x94, 0x10, 0x8c, 0x5a, 0xd1, 0x93, 0xf4, - 0x07, 0x0f, 0x9d, 0x51, 0x52, 0xa7, 0xc0, 0xb8, 0x62, 0x2f, 0x3e, 0x76, - 0x4e, 0x5e, 0xb7, 0x19, 0xe0, 0x79, 0x41, 0x66, 0x91, 0x3b, 0x69, 0x03, - 0x69, 0x67, 0x5c, 0x7c, 0xf9, 0xaf, 0x61, 0x77, 0xfe, 0x4a, 0x7d, 0x51, - 0x6c, 0x45, 0xf4, 0xd1, 0xa4, 0x85, 0xf1, 0xb3, 0xdd, 0x60, 0x66, 0xd6, - 0x4d, 0xbb, 0xa7, 0x2f, 0xd8, 0x71, 0x63, 0x6a, 0x43, 0x5d, 0x58, 0x23, - 0xd3, 0x2a, 0x19, 0x07, 0xcc, 0xaf, 0x31, 0x6f, 0xe0, 0xdc, 0x13, 0xbb, - 0x51, 0xd1, 0x5e, 0xb6, 0x55, 0x2a, 0x30, 0x0a, 0xe5, 0xda, 0x9b, 0x40, - 0xae, 0xb2, 0xe2, 0x81, 0x9a, 0x16, 0x30, 0x92, 0x03, 0x9c, 0xfa, 0xe2, - 0xfc, 0x3a, 0x47, 0x8f, 0x2b, 0x2c, 0xef, 0x00, 0x79, 0xc7, 0x03, 0x1f, - 0x00, 0x8a, 0x6d, 0xb5, 0xbd, 0x27, 0x3d, 0xe4, 0xb5, 0xca, 0x6a, 0x0c, - 0x8f, 0x42, 0x17, 0xde, 0x0b, 0x19, 0x14, 0x0c, 0x32, 0xda, 0xf3, 0x0c, - 0x2c, 0x2a, 0x0e, 0x4e, 0xe9, 0x0e, 0x1c, 0x43, 0xf4, 0x55, 0xdf, 0xf4, - 0x92, 0xa4, 0xb9, 0x62, 0xee, 0x09, 0x31, 0xa1, 0x81, 0x91, 0xba, 0xbe, - 0x09, 0xd4, 0x5b, 0x2b, 0x8f, 0xd7, 0x6c, 0x63, 0x84, 0x61, 0x10, 0x8a, - 0x5e, 0x43, 0x7f, 0x32, 0xbf, 0x1c, 0xaa, 0xe0, 0xe2, 0x9c, 0x71, 0xcb, - 0x02, 0xba, 0xe9, 0x63, 0xb6, 0x4f, 0xd5, 0x60, 0x12, 0xf3, 0x7d, 0xd3, - 0x22, 0xcb, 0xa9, 0x84, 0xb1, 0xf8, 0x1f, 0x95, 0xce, 0xac, 0x39, 0xae, - 0xca, 0x14, 0x06, 0x0c, 0xfe, 0x11, 0x01, 0xc7, 0xca, 0xfc, 0x1b, 0x5a, - 0xa3, 0xc9, 0x72, 0x0a, 0xbd, 0xe0, 0x62, 0x67, 0xb3, 0x57, 0x34, 0x5a, - 0xe9, 0x9c, 0xdc, 0x28, 0xd8, 0xcd, 0x55, 0xe0, 0x9d, 0xd8, 0xb2, 0x7d, - 0x56, 0x96, 0x25, 0xae, 0x51, 0x08, 0x1e, 0xc5, 0x34, 0xae, 0x53, 0xe3, - 0xf3, 0xd6, 0x2c, 0x2a, 0xbe, 0x4e, 0x29, 0x4d, 0x93, 0x45, 0x63, 0x59, - 0x55, 0xd9, 0xb3, 0x82, 0x29, 0x0d, 0xe1, 0x92, 0xae, 0x25, 0x15, 0x6f, - 0x41, 0xc3, 0x45, 0x9f, 0x01, 0x03, 0x5f, 0xd3, 0x22, 0xfe, 0x6f, 0xcd, - 0x87, 0x8a, 0xec, 0x8e, 0x5c, 0xf0, 0xec, 0x42, 0x1f, 0x4b, 0x1b, 0xd9, - 0xa5, 0x60, 0xdb, 0x42, 0x48, 0x91, 0x51, 0x0a, 0x8f, 0x95, 0x90, 0x08, - 0xa1, 0x8b, 0xa0, 0xc3, 0x5a, 0x12, 0x01, 0x96, 0xe4, 0x71, 0xf3, 0xb2, - 0x18, 0x46, 0xbc, 0xed, 0xaa, 0xbe, 0x28, 0x94, 0x75, 0xb4, 0xb7, 0x13, - 0xf9, 0xda, 0x22, 0xad, 0xe3, 0xf4, 0x2e, 0xa4, 0x0d, 0xc8, 0x9b, 0x3a, - 0x31, 0x89, 0x45, 0x12, 0x48, 0x68, 0x61, 0x83, 0x25, 0x66, 0xcb, 0xb6, - 0x96, 0x9d, 0x0d, 0xee, 0x75, 0x0d, 0x9c, 0x67, 0x6e, 0x20, 0x87, 0xb4, - 0x5b, 0x4a, 0xdd, 0x49, 0x8f, 0xa7, 0x3c, 0x99, 0xb4, 0x06, 0x9d, 0x42, - 0xa5, 0x0b, 0x50, 0x58, 0x3a, 0x44, 0x6f, 0xe0, 0xfd, 0x68, 0xcc, 0x88, - 0x62, 0xbc, 0x2a, 0xb2, 0x5b, 0x5a, 0x31, 0x27, 0x7a, 0xe9, 0xfc, 0x97, - 0xbc, 0xc2, 0xf9, 0x7d, 0xd8, 0xf1, 0xcc, 0xf9, 0x71, 0xf0, 0xdb, 0x5a, - 0x5f, 0x61, 0xf9, 0xdd, 0x71, 0x97, 0x3c, 0xd0, 0xdc, 0x3d, 0x1b, 0xbe, - 0x57, 0x68, 0xd5, 0x89, 0x4a, 0xa9, 0x11, 0xea, 0x88, 0xeb, 0x15, 0xe8, - 0xf4, 0xa4, 0xd9, 0x47, 0x6e, 0x3e, 0x07, 0x95, 0xe2, 0x75, 0x73, 0x56, - 0x9e, 0xe5, 0x6b, 0x04, 0xcb, 0x9b, 0xbe, 0xf3, 0x4e, 0xba, 0xda, 0x1a, - 0x1f, 0x53, 0x04, 0x5e, 0xfb, 0xe0, 0x8a, 0xfa, 0x3f, 0xa6, 0xe7, 0x84, - 0x98, 0x66, 0x31, 0x53, 0x27, 0x5d, 0x37, 0xa9, 0x08, 0x2c, 0xf4, 0xc6, - 0xeb, 0xb1, 0xc9, 0xc6, 0xc8, 0xc1, 0x53, 0x02, 0xe5, 0x14, 0x12, 0xd2, - 0x97, 0x54, 0x41, 0xc6, 0x46, 0x0f, 0xbd, 0xd5, 0x6a, 0x55, 0x3c, 0xd0, - 0xeb, 0x8c, 0x72, 0xb9, 0x60, 0xed, 0x66, 0x16, 0x22, 0x50, 0x36, 0xe6, - 0x1b, 0xdd, 0xdf, 0x11, 0x9a, 0x11, 0x50, 0x00, 0x6a, 0x83, 0x4d, 0x35, - 0xd7, 0x46, 0xd6, 0x83, 0x63, 0xc5, 0x23, 0x68, 0x2a, 0x37, 0x06, 0x3a, - 0x73, 0xed, 0x38, 0x04, 0x22, 0x66, 0x7c, 0x5a, 0x18, 0x98, 0x80, 0xf0, - 0x1b, 0x46, 0x26, 0x54, 0x8c, 0x65, 0x32, 0x4e, 0xec, 0x31, 0x33, 0x4f, - 0x04, 0xaf, 0x1c, 0x91, 0x1d, 0x7e, 0xf3, 0x90, 0xd5, 0x12, 0x07, 0xb6, - 0x64, 0x7b, 0x5b, 0x54, 0xbe, 0x49, 0xdc, 0x40, 0x70, 0xf3, 0x5a, 0x08, - 0xac, 0x06, 0x56, 0xd9, 0x83, 0x79, 0xbf, 0xbf, 0x9c, 0x55, 0x7c, 0x36, - 0x4d, 0xbd, 0x32, 0x40, 0xac, 0x81, 0x87, 0x71, 0xb8, 0xd0, 0x10, 0x6b, - 0xae, 0x91, 0xcd, 0xbb, 0xb5, 0x2b, 0xe2, 0xe0, 0xbe, 0x74, 0x2e, 0x5d, - 0xe7, 0x50, 0x1a, 0xff, 0x64, 0x0f, 0x74, 0x0c, 0x14, 0xcb, 0xcd, 0x03, - 0x3e, 0x07, 0xc4, 0x6f, 0x7c, 0xf3, 0x00, 0x0d, 0x0f, 0x00, 0xce, 0xa2, - 0x02, 0x94, 0x7d, 0xb1, 0xdf, 0xaf, 0x77, 0x26, 0x3c, 0xe4, 0xd4, 0x9f, - 0x24, 0x72, 0xbb, 0xe6, 0xd4, 0xad, 0xbf, 0x38, 0xf8, 0xe6, 0xeb, 0x2a, - 0xe0, 0xda, 0xdc, 0x66, 0xae, 0x25, 0x15, 0x6f, 0x41, 0xc3, 0x45, 0x9f, - 0x01, 0xd3, 0x5f, 0xd3, 0x22, 0xfe, 0x6f, 0xcd, 0x87, 0x8a, 0xec, 0x8e, - 0x5c, 0xf0, 0xec, 0x42, 0x1f, 0x4b, 0x1b, 0xd9, 0xa5, 0x60, 0xdb, 0x42, - 0x48, 0x91, 0x51, 0x0a, 0x8f, 0x95, 0x90, 0x08, 0xa1, 0x8b, 0xa0, 0xc3, - 0x72, 0x57, 0xa4, 0x55, 0xdc, 0x87, 0x61, 0x21, 0xf7, 0x28, 0xe8, 0x5b, - 0xea, 0xdf, 0xd0, 0xcb, 0xe9, 0xdd, 0xf1, 0xfa, 0x78, 0x1f, 0xdb, 0x38, - 0x3f, 0x17, 0x18, 0xdc, 0xd6, 0x13, 0x6f, 0x87, 0xc0, 0xa1, 0x15, 0x29, - 0xde, 0xc0, 0x0e, 0x8e, 0x88, 0xae, 0xfc, 0xbf, 0x78, 0xa7, 0xb0, 0xbe, - 0x75, 0x0d, 0x9c, 0x67, 0x6e, 0x20, 0x87, 0xb4, 0x5a, 0x3e, 0xdd, 0x49, - 0x8f, 0xa7, 0x3d, 0x69, 0xa2, 0x01, 0xc8, 0x73, 0xdf, 0x53, 0xa9, 0x33, - 0x61, 0xe6, 0xfe, 0x3c, 0x5d, 0xf1, 0xfb, 0x62, 0x73, 0x27, 0x21, 0x82, - 0x51, 0xe2, 0x51, 0x69, 0x59, 0xb6, 0xa8, 0xd1, 0xfd, 0x64, 0xcf, 0x56, - 0xe7, 0xe2, 0x43, 0xce, 0x4a, 0x5f, 0x87, 0x69, 0x5c, 0x53, 0x64, 0x97, - 0x41, 0x0f, 0x4f, 0xf6, 0x1f, 0xec, 0x50, 0xb2, 0xea, 0x66, 0xbc, 0x9d, - 0x10, 0x1e, 0xf5, 0x1e, 0x0d, 0x7c, 0x98, 0x46, 0x10, 0xbd, 0x30, 0xb7, - 0x10, 0x9c, 0xa1, 0x87, 0xab, 0x75, 0x9d, 0x27, 0xdd, 0x17, 0xda, 0x02, - 0xeb, 0x70, 0xd2, 0x4f, 0x67, 0x2d, 0x77, 0x3f, 0xde, 0xd0, 0xef, 0xde, - 0xf7, 0x6d, 0x3c, 0x45, 0x30, 0x6e, 0x73, 0x01, 0xb0, 0x4f, 0x9f, 0x0f, - 0x8d, 0x6d, 0x06, 0x21, 0x2f, 0xa7, 0x4e, 0x03, 0xe9, 0x4b, 0xcc, 0x8c, - 0xb0, 0x46, 0x8d, 0x4c, 0xc3, 0x11, 0xad, 0xc7, 0x67, 0x95, 0x7f, 0x33, - 0x1f, 0xc7, 0x01, 0xc7, 0x77, 0x84, 0x9c, 0x7c, 0xab, 0xc3, 0x11, 0x55, - 0x6b, 0xd5, 0xf1, 0x5a, 0x0a, 0x47, 0x1c, 0xc5, 0xb5, 0x7d, 0x2b, 0xa5, - 0x58, 0x98, 0x83, 0xee, 0xf2, 0xbb, 0x9f, 0x05, 0x13, 0x1a, 0xf6, 0xc0, - 0xc6, 0x32, 0x6d, 0x41, 0x60, 0xdb, 0x3a, 0x62, 0x26, 0xa4, 0x6c, 0x80, - 0xf7, 0x52, 0xc6, 0x79, 0x21, 0x12, 0x17, 0xca, 0x78, 0xbe, 0x4a, 0x8e, - 0xa2, 0x2c, 0xda, 0x0a, 0x98, 0x61, 0x95, 0xa1, 0x24, 0x65, 0xda, 0x4d, - 0x71, 0xd4, 0x5c, 0xa3, 0x37, 0x57, 0x4f, 0xd1, 0x88, 0x05, 0x97, 0x33, - 0x87, 0xbd, 0xfb, 0x12, 0x21, 0xba, 0x32, 0x37, 0xa0, 0xc6, 0xa5, 0x05, - 0xad, 0xd9, 0x52, 0x5a, 0x8c, 0x35, 0xf7, 0xde, 0xa2, 0x2b, 0x2e, 0x23, - 0x58, 0x11, 0x11, 0x75, 0xee, 0x7a, 0x2b, 0xff, 0x3c, 0x93, 0xff, 0xf9, - 0x28, 0x64, 0xd2, 0x26, 0x28, 0x7f, 0x4c, 0xaf, 0xb2, 0x48, 0xcb, 0xbf, - 0xc9, 0x53, 0x93, 0xde, 0x70, 0xf3, 0x5a, 0x08, 0xac, 0x06, 0x56, 0xd9, - 0x83, 0x79, 0xbf, 0xbf, 0x9c, 0x55, 0x7c, 0x36, 0x4d, 0xbd, 0x32, 0x40, - 0xac, 0x81, 0x87, 0x71, 0x9f, 0xf5, 0xf5, 0xa4, 0xf5, 0xac, 0x7b, 0x0e, - 0x56, 0x7a, 0xb1, 0x57, 0x5f, 0x9a, 0x08, 0x28, 0xfb, 0xe3, 0xad, 0x36, - 0x17, 0xd4, 0xaa, 0x43, 0xe1, 0x17, 0x0e, 0x30, 0x03, 0xbc, 0xb3, 0x96, - 0xef, 0x69, 0xe2, 0xae, 0xe9, 0x76, 0x01, 0xd2, 0x9e, 0xc2, 0xbc, 0x4d, - 0x90, 0x7d, 0xc0, 0x9b, 0xd7, 0x93, 0x7e, 0x02, 0x6c, 0x34, 0xe4, 0xe0, - 0xa7, 0xef, 0xf8, 0x43, 0x57, 0x89, 0x08, 0x49, 0xe0, 0xda, 0xe3, 0x4e, - 0xae, 0x25, 0x15, 0x6f, 0x41, 0xc3, 0x45, 0x9f, 0x01, 0xd3, 0x5f, 0xd3, - 0x22, 0xfe, 0x6f, 0xcd, 0x87, 0x8a, 0xec, 0x8e, 0x5c, 0xf0, 0xec, 0x42, - 0x1f, 0x4b, 0x1b, 0xd9, 0xa5, 0x60, 0xdb, 0x42, 0x48, 0x91, 0x51, 0x0a, - 0x8f, 0x95, 0x90, 0x08, 0xa1, 0x8b, 0xa0, 0xc3, 0x9e, 0xdd, 0xef, 0x92, - 0xf7, 0x87, 0xa5, 0x88, 0xf8, 0x65, 0xa1, 0x8d, 0x6e, 0x82, 0xb1, 0x6a, - 0x17, 0x6c, 0x2d, 0x7c, 0x4e, 0xbf, 0xb2, 0x14, 0xd3, 0x87, 0x8f, 0xcd, - 0x25, 0x77, 0x32, 0x58, 0x35, 0xc2, 0x53, 0xeb, 0x4c, 0x61, 0x1d, 0xd2, - 0x95, 0x61, 0x14, 0x6e, 0x55, 0x88, 0x01, 0x13, 0x75, 0x0d, 0x9c, 0x67, - 0x6e, 0x20, 0x87, 0xb4, 0x5a, 0x8a, 0xdd, 0x49, 0x8f, 0xa7, 0x02, 0x51, - 0xaf, 0x47, 0x94, 0x8c, 0xe8, 0x47, 0x61, 0x11, 0x15, 0x22, 0x0b, 0x2c, - 0x10, 0x8f, 0x30, 0xad, 0x1f, 0xc7, 0x01, 0xc7, 0x77, 0x84, 0x9c, 0x7c, - 0xab, 0xc3, 0x11, 0x55, 0x6b, 0xd5, 0xf1, 0x5a, 0xe3, 0x24, 0x0a, 0x6f, - 0xc0, 0x31, 0x69, 0x65, 0x40, 0xe5, 0x32, 0xfc, 0x74, 0xb9, 0x7f, 0xd8, - 0x35, 0x82, 0xd3, 0xed, 0x49, 0x9a, 0x80, 0x75, 0x4e, 0xd8, 0x2b, 0xf6, - 0x03, 0x85, 0x8a, 0xb3, 0x63, 0x30, 0xc0, 0x97, 0xc3, 0x67, 0xc1, 0x7c, - 0xed, 0x12, 0xcb, 0xeb, 0x12, 0xc5, 0xc5, 0x1d, 0x7d, 0xe8, 0xcb, 0x92, - 0xb6, 0xa4, 0x89, 0xb1, 0x65, 0x80, 0xcf, 0x9b, 0xd8, 0x6b, 0x31, 0xf5, - 0x11, 0xd3, 0xc5, 0x60, 0xe1, 0x9f, 0x58, 0xfc, 0x65, 0x2d, 0x48, 0xce, - 0x89, 0x21, 0xa9, 0x61, 0xb2, 0x4f, 0x11, 0x29, 0xb0, 0xf1, 0x4c, 0xeb, - 0x48, 0xbf, 0x49, 0xb6, 0xf4, 0x75, 0xb4, 0x24, 0xeb, 0x69, 0xc9, 0xc6, - 0xc8, 0xc1, 0x53, 0x02, 0xe5, 0x14, 0x12, 0xd2, 0x97, 0x54, 0x41, 0xc6, - 0xbe, 0x21, 0x17, 0xb4, 0xb3, 0x6e, 0xfc, 0x14, 0xad, 0x9e, 0xed, 0x82, - 0x0f, 0xd7, 0x43, 0xe9, 0xa1, 0xf1, 0xb5, 0x69, 0x59, 0xa5, 0x52, 0xa3, - 0x8d, 0xae, 0xd6, 0x3c, 0x21, 0x7f, 0x7f, 0xe4, 0xbb, 0x3c, 0xe2, 0x95, - 0xc5, 0x15, 0x59, 0xdf, 0xe0, 0xb5, 0x24, 0xa5, 0x23, 0x66, 0xe9, 0x78, - 0x91, 0x55, 0x42, 0xc1, 0x65, 0x98, 0xca, 0x1c, 0xe2, 0x59, 0xb2, 0xa2, - 0x33, 0x85, 0x29, 0x4e, 0x18, 0x41, 0x3c, 0x8f, 0xe5, 0xea, 0x5e, 0x03, - 0xb1, 0x3f, 0x6b, 0x98, 0xb5, 0x3b, 0x0b, 0xc8, 0x64, 0xa3, 0x5b, 0x54, - 0xbe, 0x49, 0xdc, 0x40, 0x70, 0xf3, 0x5a, 0x08, 0xac, 0x06, 0x56, 0xd9, - 0x83, 0x79, 0xbf, 0xbf, 0x9c, 0x55, 0x7c, 0x36, 0x4d, 0xbd, 0x32, 0x40, - 0xac, 0x81, 0x87, 0x71, 0x45, 0xc9, 0x33, 0xe0, 0xf0, 0xba, 0x61, 0x30, - 0x38, 0xf7, 0x56, 0x24, 0xd2, 0x9e, 0x83, 0xbf, 0xe5, 0xd3, 0xa8, 0xa9, - 0xab, 0xf3, 0x84, 0x8b, 0x5b, 0x52, 0x47, 0xed, 0x98, 0x91, 0x63, 0x29, - 0x32, 0x59, 0x2b, 0x32, 0x4e, 0x79, 0x06, 0x07, 0x7b, 0xd1, 0x27, 0x82, - 0xbd, 0xb5, 0x8f, 0xea, 0x75, 0x0d, 0x9c, 0x67, 0x6e, 0x20, 0x87, 0xb4, - 0x59, 0x3e, 0xdd, 0x49, 0x8f, 0xa7, 0x02, 0xf1, 0xd7, 0x83, 0x42, 0x7b, - 0x05, 0x9f, 0x16, 0x5e, 0xb6, 0x7b, 0xed, 0xf6, 0xa4, 0xfc, 0xe7, 0xab, - 0x8d, 0x86, 0x36, 0x42, 0xea, 0x5d, 0xbe, 0x03, 0x76, 0x6e, 0x8c, 0xd8, - 0x66, 0xa7, 0xd5, 0xac, 0x72, 0x98, 0x72, 0x2b, 0x8a, 0x50, 0xf8, 0x2d, - 0x94, 0x3a, 0xd0, 0x35, 0x4f, 0x6a, 0xe8, 0xf3, 0x2f, 0xe8, 0x00, 0x02, - 0x0d, 0xd6, 0x48, 0xde, 0x78, 0x3c, 0x52, 0x0e, 0x20, 0x72, 0x1f, 0x1c, - 0x94, 0x38, 0x2d, 0x12, 0x2a, 0x92, 0x1c, 0x60, 0x2f, 0xf9, 0x28, 0xd7, - 0x74, 0x38, 0x7a, 0x28, 0x28, 0xff, 0x7b, 0xbd, 0x62, 0x20, 0x4f, 0xa9, - 0x03, 0x91, 0x73, 0x5f, 0xf7, 0xd5, 0x5d, 0xb3, 0x79, 0xef, 0x57, 0xa1, - 0xc9, 0x66, 0x5d, 0xb4, 0xc0, 0xa0, 0x6f, 0x9c, 0xad, 0xe6, 0xf5, 0xaf, - 0xf6, 0xf2, 0x83, 0x33, 0xc9, 0x71, 0x6a, 0x71, 0x17, 0xfe, 0xe9, 0x12, - 0xbc, 0x4a, 0x56, 0x3d, 0x4f, 0x92, 0xc6, 0x01, 0x5d, 0x92, 0x0d, 0x95, - 0xe1, 0x38, 0xd7, 0xcd, 0x81, 0x74, 0x92, 0x15, 0xff, 0x54, 0x0e, 0x8c, - 0x9a, 0x1c, 0x3e, 0x1d, 0xc8, 0x8e, 0xae, 0x79, 0x4f, 0x14, 0x36, 0x91, - 0xf5, 0xfa, 0x0a, 0xe7, 0x01, 0x14, 0x4b, 0xb0, 0xee, 0x64, 0x8d, 0x66, - 0xfb, 0x84, 0x05, 0x39, 0xd7, 0xa5, 0x01, 0x93, 0xaa, 0x76, 0x03, 0x64, - 0x96, 0x93, 0x03, 0x0f, 0x33, 0x2b, 0xc0, 0xf9, 0xf1, 0x2e, 0x22, 0x49, - 0x64, 0xbf, 0xb2, 0x99, 0xd5, 0x0d, 0xe4, 0x0a, 0x0b, 0x15, 0x90, 0x23, - 0xef, 0xa7, 0xd1, 0xab, 0xb9, 0x84, 0xc5, 0xe8, 0x2b, 0xd9, 0xac, 0x42, - 0x5b, 0x26, 0x24, 0x25, 0xb0, 0xdf, 0xf0, 0x17, 0xe8, 0xda, 0x25, 0x06, - 0x77, 0x7b, 0x8b, 0xbc, 0xe2, 0x10, 0x55, 0xcf, 0x04, 0x70, 0x07, 0x31, - 0xfd, 0xad, 0xfc, 0x5f, 0x54, 0x14, 0x5e, 0x18, 0x78, 0x29, 0xaa, 0x71, - 0xd2, 0x56, 0x88, 0x1a, 0xf2, 0x37, 0xf0, 0x55, 0x0b, 0xf1, 0xb1, 0x16, - 0xe3, 0xbf, 0x2a, 0x5b, 0x5c, 0xf2, 0x2d, 0x93, 0x61, 0xc7, 0xf3, 0xcd, - 0xbb, 0x7b, 0x85, 0x8e, 0x53, 0xf0, 0x68, 0x16, 0xaf, 0x6d, 0xa6, 0x00, - 0xb4, 0x65, 0x26, 0x74, 0x77, 0x5f, 0xc3, 0xd5, 0xfe, 0xd0, 0x8c, 0x6a, - 0x39, 0xdf, 0x0d, 0xca, 0xd1, 0x7f, 0x10, 0xaa, 0xfc, 0xfa, 0xb8, 0x41, - 0x76, 0x10, 0xc4, 0x51, 0x93, 0x36, 0x99, 0xbd, 0x6f, 0xc0, 0xd1, 0x42, - 0x88, 0x2a, 0xa4, 0x7a, 0xdc, 0x7a, 0xb9, 0xa8, 0x5c, 0xf2, 0x2b, 0x11, - 0x45, 0xa0, 0x13, 0x86, 0xe0, 0x87, 0x33, 0x01, 0x6c, 0x06, 0xd5, 0xca, - 0x43, 0xfe, 0xd0, 0x63, 0xb6, 0xc7, 0xf1, 0x58, 0x34, 0x15, 0x14, 0x8c, - 0x8b, 0x76, 0x34, 0x91, 0xbc, 0x33, 0xee, 0x0d, 0x8d, 0x4e, 0x09, 0x62, - 0xf3, 0xbe, 0xaf, 0xee, 0xb8, 0xca, 0x1f, 0x45, 0x90, 0xe9, 0x71, 0x25, - 0xf4, 0x0a, 0x6a, 0xf1, 0xac, 0x16, 0xf0, 0xdb, 0x46, 0x16, 0xf2, 0xc0, - 0x2f, 0xcf, 0x54, 0xcd, 0x0a, 0xb6, 0x8a, 0x85, 0xa7, 0x7d, 0xd4, 0xa3, - 0x86, 0xf8, 0x24, 0x12, 0x77, 0x1c, 0x08, 0xd8, 0x44, 0x95, 0xd1, 0x48, - 0xaa, 0x55, 0xe8, 0x0d, 0xe4, 0x56, 0x01, 0xcf, 0x82, 0x97, 0xb3, 0x11, - 0x06, 0x42, 0xf6, 0x56, 0x93, 0x0c, 0x70, 0x84, 0xcb, 0x34, 0xf9, 0xf4, - 0xe2, 0x05, 0xe6, 0xd8, 0x01, 0x40, 0xc3, 0x54, 0x3f, 0x41, 0x5b, 0x45, - 0xf9, 0xb2, 0xbd, 0xc8, 0x87, 0x98, 0x3d, 0x94, 0xdb, 0xc7, 0x24, 0x6a, - 0x9f, 0x2f, 0x39, 0xbd, 0x73, 0xf1, 0x47, 0x75, 0x69, 0x0e, 0x71, 0x42, - 0x06, 0x75, 0x6e, 0x9b, 0x42, 0x08, 0x82, 0xfc, 0xc1, 0x27, 0xa1, 0xe3, - 0x47, 0x7b, 0x87, 0xae, 0x9f, 0xa3, 0x60, 0x89, 0x20, 0x35, 0x00, 0x4a, - 0xc9, 0x8f, 0x7c, 0x6b, 0x0e, 0x00, 0x4e, 0xa3, 0x9f, 0xcc, 0x7e, 0x78, - 0xad, 0x40, 0xbc, 0x06, 0x57, 0x64, 0x01, 0x38, 0x97, 0xf9, 0x52, 0xde, - 0xf7, 0xf4, 0xa0, 0x70, 0xae, 0x5e, 0xbb, 0x52, 0xcb, 0x4b, 0x21, 0x56, - 0xb5, 0x56, 0x2a, 0xed, 0x9d, 0x02, 0xad, 0x6a, 0x97, 0xce, 0x89, 0xbc, - 0x77, 0x70, 0x67, 0x69, 0x79, 0x05, 0x56, 0x9e, 0xaf, 0xcf, 0xe6, 0x6b, - 0x00, 0xb7, 0xf4, 0xd2, 0xcf, 0x29, 0x4d, 0xd7, 0xa8, 0x55, 0x16, 0x50, - 0x36, 0xeb, 0x7c, 0x6c, 0x1c, 0x04, 0x6a, 0xf0, 0x47, 0x63, 0x6a, 0x1d, - 0x92, 0x7d, 0x44, 0x5f, 0xa3, 0x1b, 0xf0, 0x58, 0xb9, 0x4c, 0x8e, 0x9d, - 0x4a, 0x06, 0x47, 0x16, 0x45, 0x13, 0x2b, 0x53, 0xcb, 0x2f, 0x1e, 0xdd, - 0xbc, 0xf9, 0x0d, 0x5e, 0xd5, 0xf4, 0x6c, 0xc0, 0xae, 0x25, 0x96, 0x95, - 0xfd, 0x4b, 0x0b, 0x13, 0x86, 0xd5, 0x5d, 0xd8, 0x12, 0x09, 0x24, 0xc6, - 0xc6, 0xf9, 0xd1, 0xdb, 0xc6, 0x10, 0x4a, 0xb4, 0xb9, 0x21, 0xab, 0x63, - 0x16, 0x5a, 0xbb, 0xb9, 0x3b, 0x26, 0x93, 0xff, 0x00, 0x57, 0xca, 0xe2, - 0x80, 0x6d, 0xae, 0xdc, 0x7b, 0x24, 0x1d, 0xb2, 0x63, 0xef, 0xa6, 0xf9, - 0x52, 0x1c, 0x33, 0xba, 0x21, 0x0b, 0x54, 0x3e, 0x66, 0x25, 0x80, 0x00, - 0xfb, 0x15, 0x47, 0x0b, 0x15, 0x4c, 0xb3, 0x01, 0x7d, 0xa3, 0xe8, 0x36, - 0xbe, 0xa2, 0xf5, 0x14, 0x1c, 0x3d, 0xf5, 0xed, 0x6a, 0xaa, 0x0d, 0xa2, - 0xec, 0x20, 0x82, 0x52, 0xcb, 0x55, 0x4c, 0xdc, 0x5a, 0xec, 0xb1, 0xd7, - 0xe1, 0xe8, 0x9c, 0xf7, 0x57, 0x92, 0x56, 0x80, 0x93, 0x79, 0x55, 0x1a, - 0xe9, 0x44, 0x42, 0x7b, 0x24, 0xac, 0x8f, 0x2b, 0xbe, 0xf7, 0x80, 0xd7, - 0x0c, 0x1a, 0x0a, 0x2c, 0xc5, 0xb3, 0x08, 0x93, 0x36, 0xe5, 0xfb, 0xf2, - 0xb4, 0x3f, 0x07, 0xdb, 0xc8, 0x61, 0xf7, 0x67, 0xa0, 0xed, 0x6a, 0xa4, - 0xee, 0x69, 0xdc, 0x33, 0x64, 0xc0, 0xe9, 0x06, 0xdb, 0x77, 0x8c, 0x47, - 0x3b, 0x61, 0x01, 0xc2, 0xa1, 0x16, 0x36, 0x5b, 0x31, 0x45, 0x66, 0x51, - 0x44, 0x84, 0x2f, 0xd5, 0xdb, 0xf0, 0x5a, 0x0d, 0xe8, 0x8f, 0x02, 0x3b, - 0x40, 0x91, 0x73, 0xc5, 0x20, 0x0b, 0x37, 0xf4, 0x46, 0xda, 0x07, 0xf1, - 0x04, 0xd8, 0x66, 0x58, 0x48, 0x1e, 0x89, 0xdb, 0xe5, 0xa2, 0x21, 0x19, - 0x84, 0x94, 0x51, 0xa0, 0x76, 0xb0, 0x91, 0x26, 0x10, 0x37, 0xfd, 0x01, - 0xae, 0x74, 0xe3, 0xe5, 0x6f, 0xf9, 0x8a, 0xaa, 0xe6, 0x8f, 0x47, 0x1e, - 0xc6, 0x88, 0x5f, 0x47, 0x27, 0x73, 0x79, 0xed, 0xcb, 0x76, 0x05, 0x8c, - 0xf9, 0x93, 0xbd, 0x36, 0x73, 0xf2, 0xa5, 0x52, 0x44, 0x63, 0x52, 0xec, - 0x53, 0x1c, 0xcf, 0xff, 0x90, 0xc6, 0xe7, 0x05, 0x25, 0x05, 0xf3, 0x6a, - 0x26, 0xee, 0xa8, 0x50, 0x61, 0x08, 0xf0, 0x63, 0x68, 0xf2, 0x09, 0xcf, - 0x5c, 0xd4, 0x01, 0x6a, 0xea, 0x15, 0x01, 0xf8, 0xa8, 0x6b, 0x51, 0xd3, - 0x91, 0x58, 0xc3, 0x3f, 0xc0, 0xbc, 0xd3, 0xb0, 0x41, 0x15, 0x0e, 0x5d, - 0x11, 0x47, 0x24, 0x98, 0xd3, 0xe0, 0xe0, 0x45, 0xbd, 0x06, 0x2c, 0x2f, - 0x55, 0x1d, 0xd4, 0x01, 0x5a, 0xf5, 0x73, 0x0f, 0xd7, 0xe9, 0xf3, 0xe7, - 0x4d, 0x62, 0x59, 0x8f, 0x40, 0x54, 0xd5, 0x74, 0x0e, 0x9a, 0xb4, 0x17, - 0x8e, 0x23, 0xfd, 0x8d, 0xed, 0x75, 0x97, 0xd9, 0xcf, 0x56, 0xa2, 0x54, - 0xfc, 0xae, 0x2f, 0xe7, 0x5d, 0x82, 0x50, 0xa3, 0xab, 0x34, 0x76, 0x89, - 0x61, 0xed, 0xea, 0x13, 0x00, 0x15, 0xb5, 0xf0, 0x07, 0x54, 0xd2, 0x6c, - 0x7c, 0xef, 0x46, 0x5e, 0x1b, 0x23, 0x6a, 0xb0, 0xb4, 0xb4, 0x57, 0x53, - 0x18, 0xf8, 0x75, 0xbf, 0xf0, 0x39, 0x12, 0xae, 0xb4, 0x3c, 0x5f, 0x2d, - 0x37, 0xe9, 0xa6, 0xaf, 0x41, 0x25, 0x0e, 0x55, 0x91, 0xbf, 0xee, 0xe6, - 0xe4, 0xa7, 0xa3, 0xef, 0xa2, 0x7f, 0xe8, 0x39, 0xe4, 0x34, 0x96, 0x95, - 0x97, 0x46, 0x43, 0x81, 0x8a, 0x17, 0x4a, 0xd8, 0xc9, 0x44, 0x42, 0x05, - 0x21, 0xbc, 0x36, 0x44, 0x58, 0xd7, 0x07, 0x65, 0xa1, 0xea, 0x5d, 0xd7, - 0xc0, 0xbe, 0xdf, 0x28, 0x06, 0x3b, 0x19, 0x1a, 0xf5, 0x1f, 0x3d, 0x26, - 0xef, 0xa3, 0xae, 0x70, 0x84, 0x47, 0x64, 0x4b, 0x33, 0x87, 0x25, 0xc3, - 0xa0, 0xc2, 0xcc, 0xb1, 0x11, 0x7b, 0xe4, 0xec, 0x59, 0xdb, 0xc8, 0xf8, - 0x78, 0x32, 0x2c, 0xae, 0xeb, 0xf4, 0x66, 0x2f, 0xe8, 0x51, 0xe8, 0x72, - 0xd1, 0xeb, 0xa7, 0x33, 0xce, 0x4b, 0x6c, 0x85, 0xbf, 0x6e, 0x62, 0x1c, - 0x92, 0x83, 0x00, 0xd4, 0x72, 0x47, 0xa8, 0xee, 0x42, 0x20, 0x05, 0xf6, - 0xb1, 0x87, 0x4d, 0xc9, 0xa6, 0x59, 0x19, 0x5d, 0xe3, 0xb0, 0xd2, 0x6d, - 0x86, 0x10, 0x6f, 0xf8, 0x75, 0x23, 0x8b, 0x94, 0x1e, 0x82, 0x60, 0xda, - 0x40, 0x49, 0xf5, 0xe5, 0x59, 0x19, 0x23, 0xc4, 0x70, 0x35, 0x9b, 0x18, - 0xc6, 0x57, 0x25, 0x71, 0xdd, 0x87, 0x61, 0x20, 0xd1, 0xfe, 0x7d, 0x88, - 0x3a, 0x38, 0x57, 0xc3, 0xf2, 0x19, 0x7f, 0x91, 0x37, 0x15, 0x01, 0x0b, - 0xb0, 0xba, 0xf0, 0x45, 0x69, 0xee, 0xed, 0x66, 0x1f, 0x56, 0x39, 0x09, - 0xfd, 0x20, 0x03, 0x4f, 0x5e, 0x3c, 0x0e, 0x5f, 0x0d, 0x2f, 0x52, 0xb9, - 0x8e, 0x32, 0xcd, 0x1e, 0x72, 0x50, 0x0a, 0x10, 0xcf, 0x6b, 0xcf, 0x74, - 0xc9, 0x19, 0x14, 0xd9, 0xc7, 0xef, 0x9a, 0x80, 0x9d, 0x92, 0x39, 0xd4, - 0xf0, 0xac, 0x8c, 0x6a, 0x09, 0x4d, 0x85, 0x4b, 0x7d, 0x34, 0xe6, 0x7c, - 0x46, 0x73, 0xd8, 0xe3, 0x84, 0x18, 0x22, 0x78, 0xc0, 0x72, 0x05, 0x4c, - 0xce, 0x8b, 0x09, 0x6a, 0xa7, 0xbd, 0x50, 0x4a, 0x60, 0xc9, 0xaa, 0x39, - 0x09, 0x84, 0xf2, 0x74, 0xa6, 0xa5, 0x99, 0xec, 0xac, 0x21, 0xbd, 0x8e, - 0x48, 0xa3, 0xcc, 0x51, 0xed, 0x91, 0x00, 0x38, 0x17, 0xbf, 0x76, 0x7a, - 0x61, 0x3a, 0xb7, 0x2b, 0x72, 0x7b, 0xa5, 0xa8, 0xde, 0x3f, 0x06, 0xd8, - 0xff, 0xb9, 0x7b, 0xaa, 0x94, 0x3c, 0xdc, 0xca, 0x76, 0x2b, 0xb0, 0x1c, - 0x99, 0x53, 0xbe, 0x25, 0xd2, 0xfb, 0xa6, 0xc0, 0x60, 0x00, 0xdf, 0x1f, - 0xa2, 0x2a, 0x32, 0x39, 0xce, 0xa5, 0x76, 0x0b, 0x1d, 0xc2, 0x5f, 0x02, - 0x1b, 0x0a, 0xd2, 0x78, 0xe8, 0xd6, 0x9f, 0xdb, 0xa0, 0xdc, 0x2d, 0x64, - 0xc2, 0xa3, 0x2f, 0xe8, 0x11, 0x08, 0xf1, 0xe7, 0x23, 0x15, 0x5e, 0x2c, - 0x71, 0xf6, 0x86, 0x4e, 0x9a, 0xae, 0xe6, 0xbb, 0x8a, 0x00, 0xaa, 0xa9, - 0x9b, 0x88, 0x1a, 0x3b, 0x59, 0x7a, 0x98, 0xd8, 0x19, 0xb4, 0x4e, 0x1e, - 0xbc, 0x19, 0x4a, 0x32, 0x94, 0xca, 0x77, 0xef, 0x7e, 0x3d, 0x38, 0x22, - 0xb2, 0x5f, 0x8c, 0x96, 0xfe, 0x49, 0x88, 0x20, 0x34, 0xfe, 0x1f, 0x67, - 0x8a, 0xcf, 0x88, 0x1c, 0xd9, 0xd5, 0xc7, 0x33, 0x6d, 0x69, 0x57, 0x41, - 0x25, 0xdb, 0x27, 0x4b, 0xc2, 0x65, 0xb9, 0xff, 0x5e, 0xfa, 0xdb, 0xe5, - 0x78, 0xa4, 0xed, 0xfa, 0x73, 0xc6, 0x5a, 0xc0, 0xe4, 0xf1, 0xa8, 0xfc, - 0x21, 0x51, 0xbb, 0x9c, 0xa4, 0xeb, 0x92, 0xcc, 0xf7, 0x71, 0xe9, 0xf7, - 0x48, 0x83, 0xf2, 0xea, 0xda, 0x89, 0xec, 0xd6, 0xcc, 0xda, 0x3a, 0x2d, - 0x57, 0xfb, 0x1e, 0x7b, 0x11, 0xde, 0xf1, 0x4d, 0xc3, 0x59, 0x78, 0xa7, - 0x33, 0x72, 0xa0, 0xea, 0x07, 0x69, 0x65, 0xfd, 0x72, 0xf9, 0xb8, 0xbc, - 0x09, 0xbc, 0x51, 0x40, 0xdf, 0xb0, 0xc5, 0x4f, 0xbc, 0xbb, 0xe6, 0xaa, - 0xd5, 0x01, 0x73, 0xc4, 0xbd, 0x9b, 0x47, 0x5e, 0x29, 0xef, 0x9c, 0x64, - 0x0b, 0xc0, 0x10, 0x9e, 0xb1, 0x6f, 0x7b, 0x8f, 0xe6, 0x84, 0xa3, 0x59, - 0x8d, 0x82, 0xd8, 0xe2, 0xfa, 0x9c, 0x2c, 0x3e, 0xdc, 0xa5, 0x2a, 0xe0, - 0x95, 0x85, 0x3a, 0x14, 0xcd, 0x28, 0x3c, 0x21, 0x9d, 0x75, 0x8d, 0x92, - 0x5f, 0xe8, 0x01, 0xb1, 0x25, 0xd9, 0x47, 0x2d, 0x1c, 0xb3, 0x7d, 0x3f, - 0xc5, 0x59, 0xb7, 0x1b, 0x27, 0x16, 0x3a, 0xc4, 0xd9, 0xec, 0xd6, 0x0d, - 0xfd, 0x68, 0x4f, 0x9c, 0xbd, 0xfd, 0x4e, 0x35, 0x36, 0xb6, 0x3a, 0x15, - 0x8c, 0xdc, 0x15, 0x0f, 0x22, 0xb9, 0x1b, 0xc4, 0x94, 0xc7, 0xc5, 0x4c, - 0x8b, 0x5a, 0x76, 0x0e, 0x1d, 0x94, 0x6d, 0xe6, 0x32, 0x67, 0xe9, 0x2a, - 0xdd, 0x1b, 0xf4, 0xdd, 0xd5, 0xcd, 0x8d, 0x44, 0x83, 0xd9, 0xe0, 0x35, - 0x07, 0x96, 0x86, 0xcb, 0xc6, 0x8f, 0xe4, 0x81, 0x07, 0x9d, 0xee, 0x49, - 0x87, 0xe2, 0x7d, 0x3b, 0xf2, 0x1c, 0x28, 0x18, 0xc1, 0x95, 0xe9, 0x5d, - 0xc1, 0x3d, 0xaa, 0x4c, 0x12, 0xd8, 0x6c, 0x06, 0x7a, 0xaa, 0xfe, 0xf2, - 0x51, 0x92, 0x71, 0x76, 0x28, 0xea, 0xc6, 0x9c, 0x83, 0xd9, 0x38, 0xce, - 0x29, 0x6e, 0x1c, 0x72, 0x37, 0xe1, 0x40, 0x9b, 0x16, 0x29, 0x7d, 0x5b, - 0x84, 0xd4, 0xfc, 0x35, 0xda, 0x23, 0xb5, 0x0e, 0xb5, 0xd9, 0x8d, 0x65, - 0xde, 0x70, 0x7b, 0xa8, 0xa2, 0x92, 0x65, 0xf0, 0xcd, 0x28, 0xfa, 0x54, - 0x07, 0xca, 0x49, 0x51, 0x00, 0xfe, 0x29, 0xb6, 0x2d, 0xe7, 0x1d, 0x86, - 0xae, 0x49, 0x0f, 0x29, 0x6d, 0xdd, 0x4c, 0xbc, 0x3d, 0x75, 0x4a, 0x1a, - 0x11, 0x5a, 0xa9, 0x46, 0x76, 0x3f, 0x62, 0x36, 0xfa, 0x07, 0x83, 0xd0, - 0x1b, 0xf2, 0xdf, 0xe6, 0x92, 0xc7, 0x24, 0x33, 0x48, 0xec, 0x3b, 0x94, - 0x46, 0x5d, 0xc0, 0x0f, 0xdc, 0x8e, 0x5f, 0x0c, 0xe6, 0xa2, 0x5b, 0x16, - 0xb6, 0x67, 0x06, 0x86, 0x09, 0xe8, 0x95, 0x80, 0x12, 0x6a, 0x4c, 0x98, - 0xf1, 0x50, 0xc3, 0x9e, 0x90, 0x9a, 0x61, 0xd1, 0xb0, 0xef, 0xfa, 0xef, - 0xe6, 0xf8, 0xfb, 0xe3, 0x58, 0x48, 0x92, 0x32, 0xa3, 0x02, 0x1e, 0xaf, - 0x76, 0x07, 0x28, 0x21, 0x39, 0x73, 0x82, 0x2c, 0x25, 0xae, 0x0f, 0xb9, - 0xf6, 0x0a, 0xed, 0xc8, 0xe1, 0x97, 0x08, 0x82, 0x13, 0x76, 0x21, 0xf9, - 0x24, 0x35, 0x88, 0x91, 0xe8, 0xa4, 0x94, 0xb6, 0xfa, 0x8d, 0x98, 0xc3, - 0xeb, 0x45, 0xa0, 0x89, 0x2f, 0x8f, 0xf9, 0x64, 0xac, 0x61, 0x4f, 0xac, - 0x1b, 0xda, 0x3e, 0x07, 0x02, 0xf4, 0xbd, 0xfd, 0x63, 0x53, 0x36, 0xbd, - 0x12, 0xd8, 0x50, 0x53, 0x3f, 0x6f, 0x40, 0x4c, 0xfa, 0x41, 0x47, 0x94, - 0x04, 0x9b, 0x43, 0xc9, 0x79, 0xdb, 0x63, 0xe0, 0xb5, 0x3a, 0xb1, 0x3d, - 0xe6, 0xc0, 0xca, 0xb0, 0x32, 0x30, 0x6c, 0xa2, 0x1e, 0xb2, 0xda, 0x4f, - 0x66, 0x05, 0x21, 0x34, 0x22, 0xd4, 0x63, 0x87, 0xf1, 0x93, 0xbe, 0xd4, - 0xcf, 0x6e, 0x5e, 0xd5, 0xf9, 0x7f, 0x78, 0x9a, 0x2b, 0xdc, 0x60, 0x73, - 0x09, 0xc1, 0x8c, 0x7a, 0xd5, 0x9a, 0x92, 0xbd, 0xc4, 0x35, 0x9b, 0x91, - 0x8b, 0xe8, 0xff, 0xb7, 0xc7, 0x8e, 0x27, 0x5b, 0x4f, 0xa9, 0x38, 0x55, - 0xa5, 0x16, 0x2d, 0xcf, 0x73, 0x31, 0x68, 0xfb, 0x8f, 0x15, 0x36, 0x83, - 0x7a, 0xa4, 0x68, 0xe7, 0x1b, 0x17, 0x3b, 0xcc, 0x32, 0xa6, 0x0b, 0xc5, - 0xa5, 0xd7, 0xab, 0x73, 0x3b, 0x5e, 0x6d, 0xcb, 0x03, 0x19, 0x9e, 0xfc, - 0xe1, 0x1a, 0x38, 0x14, 0x78, 0x29, 0x32, 0xd3, 0xe7, 0xdc, 0x27, 0x08, - 0xf7, 0x6a, 0x52, 0x68, 0x42, 0x73, 0x35, 0x7a, 0xed, 0x30, 0xa7, 0x87, - 0x40, 0x58, 0xc4, 0x71, 0x9a, 0x5d, 0xa0, 0xc8, 0x12, 0x4a, 0xa2, 0x0b, - 0x48, 0x22, 0xd5, 0x99, 0x7a, 0xe8, 0xc0, 0xf0, 0x5d, 0x03, 0xca, 0xd1, - 0xce, 0xde, 0xb4, 0x5d, 0x3f, 0x41, 0xe9, 0x8f, 0x1c, 0xb0, 0x62, 0xe4, - 0xed, 0x2e, 0xad, 0x1b, 0xe2, 0xa9, 0x39, 0xd0, 0xba, 0x4f, 0x40, 0xc8, - 0x83, 0x31, 0x2d, 0xb5, 0x00, 0x00, 0xa5, 0xbd, 0x13, 0x4c, 0x5b, 0x5a, - 0x18, 0xde, 0xd6, 0x8d, 0x82, 0x1f, 0x08, 0xdf, 0xda, 0xfe, 0xa2, 0x2a, - 0x63, 0x6e, 0x24, 0x8f, 0x13, 0x34, 0xa3, 0x40, 0x2f, 0xda, 0x58, 0x7f, - 0xa7, 0xb2, 0xa7, 0xdc, 0x21, 0x7b, 0x61, 0x5f, 0x34, 0x3c, 0x05, 0x7d, - 0x99, 0x0e, 0xb0, 0x8d, 0x10, 0xc0, 0x8c, 0xe9, 0x10, 0x12, 0xad, 0xff, - 0x7e, 0x58, 0x40, 0x2e, 0x36, 0x5c, 0xbc, 0x87, 0x3f, 0x60, 0x94, 0xde, - 0x8c, 0x6f, 0x82, 0xe5, 0x93, 0xb7, 0x17, 0x92, 0x73, 0x00, 0xc5, 0xcc, - 0x33, 0x1f, 0x64, 0xbb, 0xc2, 0xf8, 0x37, 0x1d, 0x3b, 0xa0, 0x83, 0x01, - 0x16, 0x88, 0xf7, 0x26, 0x07, 0x81, 0x3e, 0x36, 0x2d, 0x1c, 0xb8, 0x8d, - 0xb2, 0xb5, 0x80, 0x60, 0x6f, 0xb8, 0x9f, 0x95, 0x8d, 0xfe, 0x0b, 0xaa, - 0x00, 0x3e, 0x45, 0xdf, 0x9d, 0xe1, 0x20, 0x5a, 0xef, 0xf1, 0x6f, 0xf5, - 0x0c, 0x09, 0xab, 0x62, 0xc4, 0x12, 0x30, 0xe7, 0x28, 0x84, 0xdc, 0x70, - 0x25, 0xff, 0x73, 0xf5, 0xf3, 0x30, 0x89, 0x4b, 0x58, 0x2f, 0x6f, 0xcf, - 0xa2, 0x92, 0x65, 0xf0, 0xae, 0xe7, 0xb0, 0x70, 0xf9, 0xe3, 0x3e, 0x1b, - 0x01, 0x8b, 0x06, 0xc4, 0xff, 0x6a, 0x6e, 0x28, 0xb0, 0x9d, 0xa8, 0x27, - 0xd2, 0x1c, 0x29, 0x28, 0x48, 0x41, 0x32, 0xc9, 0x05, 0xf8, 0xbb, 0xc6, - 0x70, 0x9d, 0xa4, 0xe1, 0x79, 0x1a, 0x8e, 0x9a, 0x92, 0x0c, 0x70, 0xcd, - 0xea, 0x75, 0x94, 0xce, 0xa3, 0xb1, 0x73, 0x86, 0xca, 0xa6, 0xe9, 0xb4, - 0x8b, 0x70, 0x33, 0xad, 0xe9, 0xa4, 0xb0, 0x94, 0xfb, 0x2b, 0x43, 0xec, - 0xb7, 0x55, 0x3a, 0x64, 0xc0, 0x6c, 0x84, 0xc8, 0x3d, 0x4c, 0x38, 0xa7, - 0xab, 0x7d, 0x33, 0x84, 0x46, 0x4b, 0xc4, 0xe3, 0x20, 0xd1, 0x6d, 0x94, - 0x89, 0x83, 0x65, 0xfc, 0x72, 0xe1, 0xad, 0xcb, 0x5c, 0x60, 0xa3, 0xe5, - 0x58, 0x3b, 0x5d, 0x8d, 0x50, 0xf4, 0x98, 0x8c, 0x8e, 0xed, 0xe9, 0x3e, - 0x0f, 0x3e, 0xac, 0x06, 0x0d, 0x9a, 0x51, 0xdf, 0xb6, 0xf8, 0x25, 0x01, - 0xf8, 0xfe, 0x6a, 0x62, 0x38, 0x28, 0x42, 0x2d, 0xde, 0x8f, 0xd9, 0x18, - 0x39, 0xf8, 0x7d, 0x45, 0xba, 0x14, 0x43, 0x1f, 0xfe, 0x59, 0xd3, 0xd0, - 0x5b, 0xe0, 0xbe, 0x8c, 0xa8, 0xf8, 0x28, 0xc0, 0x14, 0xa3, 0x33, 0xc8, - 0xae, 0x53, 0xd0, 0x1b, 0xdc, 0x74, 0xe2, 0xcd, 0x48, 0xbb, 0x3c, 0x95, - 0x9e, 0xda, 0x22, 0xc9, 0xe9, 0x43, 0x3f, 0x63, 0x01, 0xc1, 0xcf, 0x10, - 0x1d, 0xc7, 0xf9, 0xb7, 0xad, 0xe5, 0x64, 0x20, 0x61, 0x74, 0x90, 0x85, - 0x88, 0x20, 0xcb, 0x7e, 0x32, 0xc0, 0x3b, 0x55, 0x35, 0x02, 0xf1, 0x3e, - 0x0d, 0xeb, 0x46, 0x23, 0x07, 0x9e, 0xb3, 0xdf, 0x0f, 0x70, 0xe2, 0x52, - 0x2c, 0xb8, 0xf7, 0x3e, 0x20, 0x02, 0x26, 0xbb, 0x94, 0x4b, 0x12, 0x54, - 0xc6, 0xac, 0x93, 0x03, 0x0f, 0xc4, 0x35, 0xae, 0x2b, 0x2c, 0x8d, 0xf4, - 0x8e, 0xee, 0xd3, 0x7d, 0xf2, 0x6a, 0x02, 0xad, 0x91, 0x6c, 0x1c, 0xb9, - 0x82, 0x94, 0xdf, 0xe9, 0x5c, 0xbe, 0x47, 0x13, 0x5c, 0x1c, 0x6a, 0x85, - 0xc6, 0x93, 0xe4, 0x0d, 0xc4, 0x90, 0xee, 0x17, 0x81, 0x5a, 0x2b, 0x9c, - 0x8c, 0x66, 0x39, 0xb1, 0x36, 0x5c, 0xbc, 0x87, 0x3f, 0x60, 0x94, 0xde, - 0x8c, 0x6f, 0x82, 0xe5, 0x93, 0xb7, 0x17, 0x90, 0x73, 0x00, 0xc5, 0xcc, - 0x33, 0x1f, 0x64, 0xbb, 0xc2, 0xf8, 0x37, 0x1d, 0x3b, 0xa0, 0x83, 0x01, - 0x40, 0x61, 0x17, 0xe4, 0x34, 0xb5, 0x4e, 0x92, 0xac, 0x89, 0x66, 0x7f, - 0x67, 0x5e, 0x9f, 0x5a, 0xba, 0x53, 0x57, 0x8b, 0xd6, 0xd5, 0x60, 0x94, - 0x51, 0x71, 0xf0, 0xcb, 0x89, 0x5d, 0xe3, 0x53, 0x69, 0x74, 0x7b, 0x99, - 0xab, 0xb4, 0x40, 0xf2, 0xd0, 0xf3, 0x9e, 0x85, 0x31, 0xc8, 0x5e, 0x01, - 0xde, 0xe0, 0x40, 0x3f, 0xf1, 0xb2, 0x19, 0x3c, 0x83, 0x0d, 0xb0, 0xd8, - 0x18, 0xb2, 0xe2, 0x31, 0xc0, 0x21, 0xbc, 0x0e, 0xf6, 0x6e, 0x94, 0x96, - 0x85, 0xf2, 0x3f, 0x77, 0x93, 0x1d, 0x51, 0x8d, 0xa6, 0x10, 0x07, 0x99, - 0x5e, 0xe1, 0xe3, 0x1f, 0xcd, 0xf9, 0x7e, 0xfb, 0xa7, 0xae, 0x07, 0x97, - 0xfe, 0xbf, 0xd3, 0xf7, 0xa3, 0x9d, 0x79, 0xfc, 0x4f, 0xa0, 0x99, 0x3a, - 0xe0, 0x69, 0x86, 0xe5, 0xfe, 0x96, 0x3d, 0xeb, 0xb1, 0x70, 0xb9, 0x12, - 0x9a, 0x13, 0xe5, 0xf6, 0xa1, 0x69, 0xd5, 0x5c, 0xe8, 0xa4, 0xb1, 0xe0, - 0x00, 0x04, 0x9f, 0xc4, 0xee, 0x3e, 0x21, 0xd6, 0x9b, 0xb3, 0xc7, 0x47, - 0x00, 0x18, 0x13, 0x20, 0x3f, 0x5e, 0x59, 0x69, 0xc6, 0x40, 0x5d, 0xf0, - 0x53, 0xfa, 0x5b, 0x7c, 0x04, 0xdc, 0xda, 0x5b, 0x2e, 0xdd, 0x8c, 0xc1, - 0x84, 0x16, 0x54, 0x62, 0x6c, 0xfc, 0x12, 0x45, 0x39, 0xbb, 0x41, 0xcd, - 0x0d, 0xee, 0x36, 0x9e, 0x98, 0xd2, 0x72, 0x02, 0x13, 0xf7, 0x80, 0xb2, - 0x11, 0x93, 0x5c, 0x11, 0x69, 0xe9, 0x26, 0xbd, 0x0c, 0x4f, 0x5e, 0xa0, - 0x6f, 0x1a, 0xdd, 0x2b, 0x69, 0x45, 0x36, 0x58, 0x2e, 0xca, 0x1f, 0x03, - 0x15, 0xf0, 0xa9, 0xba, 0x95, 0xae, 0x1e, 0x71, 0xb2, 0x6c, 0x85, 0x9b, - 0x50, 0x4b, 0x94, 0xaa, 0x47, 0x72, 0x3b, 0x30, 0xef, 0x7a, 0x62, 0x57, - 0xd0, 0x70, 0x60, 0x29, 0x9d, 0xb1, 0x78, 0x49, 0xf6, 0x62, 0x7f, 0xc2, - 0xe4, 0x85, 0x73, 0x72, 0x78, 0x1e, 0x67, 0x6e, 0x4a, 0x18, 0xab, 0x1f, - 0x76, 0x38, 0xdc, 0x31, 0x07, 0xbb, 0x53, 0x23, 0x54, 0xee, 0x36, 0x15, - 0xab, 0xfc, 0x2f, 0x06, 0x32, 0xba, 0x43, 0xef, 0xc6, 0xdf, 0x25, 0x61, - 0x1f, 0x2f, 0x6e, 0x5f, 0xed, 0x65, 0x97, 0x0a, 0xa9, 0x06, 0xb2, 0x57, - 0x43, 0xe2, 0x66, 0x44, 0xc1, 0x4a, 0x3e, 0xbc, 0xab, 0xb7, 0x76, 0x9b, - 0xc1, 0x59, 0x6b, 0xb2, 0xf9, 0xa6, 0x73, 0xb8, 0xd7, 0xfd, 0x70, 0x7c, - 0x17, 0xb5, 0xa7, 0xdd, 0x25, 0xe6, 0xf6, 0x15, 0xf6, 0xcb, 0x81, 0xcd, - 0xf8, 0x45, 0x30, 0x32, 0xff, 0x63, 0xe7, 0xe4, 0x2f, 0xe0, 0x60, 0x25, - 0x06, 0xa2, 0x75, 0xbb, 0x4c, 0x63, 0xb9, 0x8e, 0x1a, 0x0e, 0x38, 0x4e, - 0x71, 0x60, 0x44, 0x9c, 0xc1, 0xfe, 0x87, 0x78, 0x03, 0xb6, 0x66, 0xf0, - 0x12, 0xda, 0x34, 0x8b, 0xb4, 0xfd, 0x59, 0xf8, 0x99, 0x0d, 0xd4, 0x0e, - 0x7a, 0xa8, 0xbb, 0x91, 0x87, 0xad, 0xfc, 0xe4, 0x2d, 0x6b, 0x4d, 0x51, - 0xe7, 0xfd, 0x6b, 0x8a, 0x67, 0xb7, 0x00, 0xd0, 0xd0, 0xe1, 0xee, 0x34, - 0x4e, 0x28, 0xc5, 0x53, 0xb9, 0xdd, 0x50, 0x6c, 0xc2, 0x20, 0xad, 0x03, - 0x70, 0xb1, 0xff, 0x88, 0x6c, 0x53, 0xf2, 0x04, 0xfc, 0x7b, 0x88, 0x7f, - 0x25, 0xbc, 0xef, 0x51, 0x8c, 0x27, 0x2a, 0xf0, 0xc7, 0x70, 0xf5, 0xb0, - 0x94, 0x65, 0x13, 0x5a, 0x85, 0x47, 0xcc, 0xf7, 0x5d, 0x3a, 0x45, 0xbe, - 0xf3, 0xe1, 0xbe, 0x40, 0x99, 0x05, 0x35, 0x64, 0xdf, 0xd3, 0xae, 0x57, - 0x61, 0x2c, 0x44, 0x61, 0xdb, 0x53, 0xfc, 0x70, 0x61, 0x33, 0xf7, 0x1e, - 0x95, 0x63, 0x97, 0xe1, 0xb4, 0xa3, 0x92, 0xee, 0x48, 0xca, 0x49, 0x04, - 0xa3, 0x56, 0xea, 0x44, 0x6f, 0x9e, 0x51, 0xef, 0x50, 0x71, 0x5b, 0x1d, - 0xc0, 0xb0, 0xfa, 0xf8, 0xf1, 0xed, 0x16, 0x3f, 0xb8, 0xbb, 0x8f, 0x1e, - 0xc4, 0x3c, 0xdd, 0x89, 0x48, 0xba, 0x28, 0x38, 0x1a, 0x29, 0x14, 0x58, - 0x64, 0x6f, 0xf9, 0x55, 0x63, 0xae, 0xe5, 0xec, 0x37, 0x0e, 0x72, 0xc1, - 0x5d, 0x6d, 0x73, 0xd8, 0x1a, 0xcb, 0xb4, 0xf9, 0xe8, 0xc7, 0x13, 0xde, - 0x1f, 0x1c, 0xac, 0x38, 0x02, 0xe1, 0xbd, 0x07, 0x99, 0xb9, 0x38, 0x41, - 0x9c, 0xaa, 0x71, 0x93, 0x46, 0x33, 0x40, 0xdc, 0xf7, 0x03, 0x51, 0x25, - 0xbe, 0xd3, 0xb7, 0x18, 0xdd, 0x06, 0xda, 0x6a, 0x0e, 0xb0, 0x08, 0xf6, - 0xbf, 0xf9, 0x6e, 0x15, 0x22, 0xfe, 0x65, 0x1f, 0xcc, 0x4c, 0xec, 0xa8, - 0x3b, 0x72, 0x2b, 0x74, 0xc2, 0x7d, 0x3f, 0x72, 0x37, 0x84, 0xf2, 0x5c, - 0x40, 0xf9, 0x33, 0xd3, 0xa0, 0x06, 0x26, 0x47, 0x99, 0x50, 0x1f, 0x83, - 0xa1, 0x77, 0x7d, 0x1e, 0x8b, 0x0a, 0xf9, 0x10, 0xba, 0xf5, 0x2f, 0x89, - 0x22, 0xe8, 0xac, 0x46, 0x06, 0x54, 0x12, 0x34, 0x71, 0x78, 0xfc, 0xbe, - 0xe5, 0xc3, 0x7c, 0xfd, 0xa3, 0xef, 0x4d, 0x95, 0x9b, 0x1c, 0x51, 0x3f, - 0x72, 0xa3, 0x3c, 0x42, 0x20, 0x92, 0xe5, 0x98, 0xba, 0x75, 0xe3, 0x69, - 0x9b, 0x72, 0xc3, 0x40, 0xc8, 0x32, 0xaa, 0x3b, 0xe2, 0xe3, 0x10, 0xd6, - 0xdc, 0x76, 0x60, 0x2a, 0x78, 0xfd, 0xce, 0xc2, 0x4f, 0xb9, 0x6c, 0xf2, - 0xae, 0x6d, 0xea, 0xd0, 0x8b, 0xa8, 0x9f, 0xa4, 0xe6, 0xcc, 0x53, 0x7c, - 0xc9, 0x98, 0x3f, 0x79, 0xc9, 0xa2, 0x0a, 0xb1, 0x3b, 0x09, 0x07, 0x14, - 0x12, 0xe8, 0xf8, 0xad, 0x35, 0x81, 0x00, 0x80, 0x0e, 0xaf, 0xe5, 0x5c, - 0xe2, 0x7c, 0x41, 0x41, 0xb5, 0xf8, 0xb5, 0x92, 0xf6, 0xec, 0xd3, 0x40, - 0xee, 0xd0, 0xdb, 0x0c, 0x20, 0xea, 0xfc, 0xdf, 0x9e, 0xac, 0x22, 0x27, - 0x44, 0xf3, 0x82, 0xd4, 0x9e, 0x5e, 0x01, 0x79, 0xf2, 0x0c, 0xe6, 0x44, - 0x54, 0xb2, 0xaf, 0x77, 0x9d, 0x45, 0x37, 0x66, 0x07, 0x6f, 0x8b, 0x55, - 0x9b, 0x52, 0x37, 0x1a, 0x3e, 0x92, 0x03, 0xfa, 0x1c, 0x4b, 0x81, 0x07, - 0xdd, 0x46, 0x5c, 0x0f, 0x93, 0x2b, 0x69, 0x2c, 0x36, 0x00, 0x33, 0x2a, - 0xaa, 0x06, 0x83, 0x4a, 0x7d, 0xcf, 0x98, 0xfc, 0xf6, 0x8b, 0x6b, 0x3c, - 0x94, 0x96, 0x06, 0xb3, 0xb2, 0x6e, 0xb0, 0x17, 0x8a, 0x57, 0x4e, 0xaa, - 0x96, 0x92, 0xde, 0x1a, 0xb1, 0x8f, 0xc7, 0x48, 0x8e, 0xe5, 0x8f, 0x93, - 0x99, 0xcd, 0xbc, 0xbc, 0x6b, 0x2b, 0x45, 0x74, 0xe6, 0x2a, 0x15, 0x2c, - 0xaa, 0x12, 0x41, 0x16, 0x1c, 0x5c, 0xaf, 0xe1, 0x5d, 0x95, 0x2f, 0x82, - 0xd0, 0x15, 0xf9, 0xe9, 0xf8, 0x67, 0xc6, 0xea, 0xcb, 0x48, 0xbb, 0xee, - 0x64, 0xd6, 0x3c, 0x21, 0x5c, 0x00, 0xa0, 0x3c, 0x95, 0xfb, 0x9a, 0x78, - 0x6e, 0x09, 0x69, 0x5f, 0xef, 0x04, 0x3b, 0xf2, 0xa4, 0x8a, 0xeb, 0x2d, - 0x67, 0x66, 0xc1, 0xab, 0x63, 0x10, 0xc8, 0xad, 0x3f, 0x84, 0x0f, 0x2d, - 0xf0, 0xa7, 0xaa, 0x2c, 0xe4, 0x14, 0xd9, 0x78, 0x2d, 0x44, 0x35, 0x8e, - 0xf1, 0x60, 0x78, 0xea, 0x3a, 0xad, 0xa9, 0x10, 0x00, 0x7c, 0x08, 0x46, - 0xe5, 0x9b, 0xe1, 0x96, 0x0f, 0x11, 0x16, 0x5e, 0x90, 0x26, 0xf1, 0x2c, - 0xa5, 0x17, 0x9c, 0x2f, 0xaa, 0x1d, 0xd9, 0x39, 0x21, 0x36, 0xe9, 0x30, - 0xaa, 0xa5, 0x57, 0x2b, 0xc2, 0xcc, 0x8a, 0x23, 0x73, 0xaa, 0x14, 0x25, - 0x6c, 0x2f, 0x92, 0x3c, 0xf7, 0x81, 0x4f, 0xa4, 0xbe, 0xc6, 0x1b, 0xd4, - 0x71, 0xa2, 0xb6, 0xab, 0xaa, 0x0f, 0xac, 0x86, 0x11, 0xe2, 0x20, 0x2c, - 0x5e, 0x68, 0xf2, 0x23, 0xcf, 0xbb, 0xbc, 0x00, 0xd7, 0x57, 0xea, 0x42, - 0x9e, 0x60, 0xe1, 0x0c, 0x93, 0x2d, 0xbe, 0xeb, 0x17, 0xf3, 0xf0, 0x8f, - 0xee, 0x57, 0xdc, 0x78, 0x18, 0xdf, 0x51, 0x73, 0x4b, 0x06, 0x07, 0x89, - 0xcb, 0x0f, 0x4b, 0x6a, 0xa8, 0x71, 0xa4, 0x1b, 0x6e, 0xae, 0xbf, 0x42, - 0x12, 0x5c, 0x80, 0x62, 0x87, 0x49, 0x96, 0x27, 0x5b, 0x07, 0x31, 0x1a, - 0xb2, 0x64, 0xeb, 0x39, 0x4f, 0x7b, 0x07, 0xcb, 0x36, 0x3d, 0x9d, 0x0c, - 0x71, 0x3f, 0x44, 0x32, 0xd8, 0x4f, 0xc8, 0x47, 0x65, 0x55, 0x50, 0xdf, - 0x7b, 0xd1, 0x0f, 0x31, 0x7d, 0x09, 0x20, 0x3d, 0x5c, 0x27, 0xa1, 0x07, - 0x24, 0xd3, 0x85, 0x9f, 0x17, 0xad, 0x71, 0xa7, 0x2c, 0xcb, 0x62, 0x98, - 0x5f, 0x59, 0x3d, 0xd4, 0x8c, 0xb4, 0x8d, 0xfe, 0x97, 0xc3, 0x24, 0xd6, - 0x6a, 0x34, 0x95, 0x5e, 0x67, 0x06, 0xdd, 0x62, 0xd8, 0xbf, 0x48, 0xab, - 0xbf, 0x44, 0x91, 0xd5, 0x94, 0xd9, 0x07, 0x9a, 0x25, 0x75, 0xb3, 0x87, - 0xaa, 0x68, 0x0c, 0xf3, 0x99, 0x2f, 0xaa, 0x97, 0x72, 0x3c, 0x6f, 0x7f, - 0xc7, 0x80, 0x2a, 0xfa, 0x7f, 0x49, 0x17, 0x7e, 0xbd, 0xb6, 0x31, 0x0f, - 0x09, 0xcf, 0x0a, 0xe1, 0x80, 0x8f, 0xb0, 0x2a, 0x8b, 0x54, 0xc5, 0xd2, - 0x7b, 0x11, 0xf6, 0x84, 0xc1, 0xaf, 0xd4, 0xf5, 0x6e, 0x96, 0x34, 0xa1, - 0x40, 0x00, 0xda, 0x6b, 0x9e, 0xc3, 0xfe, 0xc6, 0x66, 0x39, 0x4f, 0x03, - 0xbf, 0x72, 0x55, 0xfb, 0x4d, 0xf6, 0x22, 0xa0, 0x2a, 0xc9, 0x75, 0x8b, - 0xdd, 0x6c, 0x33, 0x0b, 0x6d, 0x75, 0x33, 0x63, 0x21, 0x4d, 0x56, 0x46, - 0xe7, 0x04, 0x4e, 0x9f, 0x28, 0x43, 0x9b, 0x70, 0x67, 0x45, 0xe0, 0x9e, - 0x51, 0x16, 0x14, 0x1a, 0xe9, 0xab, 0xfb, 0xeb, 0x40, 0x2f, 0xf2, 0xdb, - 0x43, 0x3d, 0x24, 0x97, 0x8c, 0xb7, 0xc5, 0x97, 0x09, 0xc3, 0x3c, 0x88, - 0x53, 0xa7, 0xbd, 0xa7, 0x0d, 0x03, 0xdf, 0x9a, 0x7f, 0xa9, 0x3b, 0x51, - 0x6e, 0xaa, 0xbd, 0x48, 0x3e, 0x08, 0x09, 0x82, 0xc8, 0xb1, 0x54, 0x8f, - 0x5e, 0x74, 0x12, 0xd3, 0x8c, 0xaa, 0x2e, 0xd2, 0xbd, 0x0a, 0xaa, 0x7a, - 0x3c, 0x1e, 0xa0, 0x31, 0x14, 0xb2, 0x9d, 0x3c, 0x64, 0x73, 0xaf, 0xf5, - 0xd2, 0x03, 0x8a, 0xd3, 0x95, 0xd1, 0xea, 0xf3, 0x6a, 0xcb, 0x6f, 0x21, - 0xd8, 0x19, 0x35, 0x5a, 0x71, 0xe2, 0xd3, 0x8d, 0x4b, 0xe2, 0xc0, 0x69, - 0xdd, 0x9d, 0x2e, 0x70, 0x9c, 0x95, 0x9f, 0x90, 0x8a, 0xfb, 0xb4, 0x74, - 0xbf, 0xc3, 0x35, 0x89, 0xca, 0x21, 0x52, 0xf0, 0x3a, 0xb9, 0x28, 0x35, - 0x60, 0x01, 0xd7, 0x59, 0x80, 0xda, 0xe3, 0xf0, 0x39, 0x19, 0x15, 0x0d, - 0xb6, 0x83, 0xbd, 0x64, 0x3e, 0x9f, 0x86, 0xb6, 0xe7, 0xfb, 0x13, 0x28, - 0x6e, 0x89, 0x2f, 0xc7, 0x60, 0x6a, 0xc7, 0x63, 0xd9, 0x97, 0xa4, 0xfe, - 0x01, 0xab, 0x1b, 0xc9, 0x7d, 0x28, 0xa1, 0xc2, 0x03, 0x3d, 0xf5, 0xba, - 0xf6, 0x40, 0xe0, 0x9c, 0x01, 0x89, 0x10, 0xb2, 0xeb, 0x2d, 0x01, 0xa5, - 0x42, 0x92, 0xc2, 0x98, 0x1c, 0xd2, 0x64, 0xc2, 0x76, 0x5c, 0xd4, 0x9f, - 0x77, 0x49, 0xe2, 0x02, 0x09, 0x13, 0x1a, 0xcf, 0xbd, 0x88, 0xe4, 0xda, - 0xf2, 0x81, 0x6f, 0x18, 0x6e, 0x5a, 0x14, 0x61, 0xde, 0xe6, 0x0f, 0x7a, - 0xae, 0x8f, 0xce, 0xa3, 0x11, 0x5c, 0x9e, 0xa7, 0xf8, 0x17, 0x25, 0x0b, - 0x47, 0xd5, 0xfd, 0xe4, 0x09, 0xad, 0x48, 0x54, 0xb8, 0xb7, 0xe9, 0x7c, - 0x8f, 0xb3, 0x4f, 0xa1, 0x44, 0x59, 0x6e, 0x03, 0x22, 0xd4, 0x62, 0x7a, - 0xf0, 0xf5, 0xaa, 0x2d, 0x60, 0x22, 0x56, 0x64, 0x23, 0x51, 0xbf, 0x47, - 0x44, 0xf1, 0x2f, 0xbe, 0x32, 0x19, 0xf4, 0x8d, 0xb0, 0x95, 0xfb, 0x57, - 0xb1, 0x7f, 0x85, 0x2e, 0xd5, 0x9b, 0x09, 0xc9, 0x2e, 0x63, 0x9c, 0xf5, - 0xe1, 0xb3, 0x3d, 0x2e, 0xaf, 0xab, 0xf3, 0x42, 0xfe, 0xaf, 0x2c, 0xe6, - 0x03, 0x1e, 0x91, 0xd9, 0xbd, 0xaf, 0x59, 0xd4, 0xc3, 0x34, 0x86, 0x18, - 0x1e, 0xb8, 0x61, 0xb2, 0x4d, 0x36, 0x25, 0x85, 0x41, 0x58, 0xf4, 0x57, - 0x22, 0xf7, 0xea, 0x61, 0xed, 0x6c, 0x4a, 0x97, 0x5d, 0xf0, 0x21, 0x06, - 0x25, 0x2e, 0x20, 0x68, 0x44, 0x16, 0x63, 0x21, 0xd7, 0x61, 0xdd, 0xf6, - 0xb8, 0x92, 0x94, 0x41, 0xe0, 0xc9, 0xd3, 0x7a, 0x1c, 0x19, 0xe7, 0x69, - 0xba, 0xa8, 0x53, 0xd9, 0x95, 0x50, 0xe2, 0xcd, 0x36, 0x8c, 0xf0, 0xe6, - 0xbf, 0x88, 0x76, 0xc5, 0xef, 0xda, 0xd5, 0x0c, 0x3d, 0xd2, 0x1a, 0xa7, - 0xda, 0x13, 0x5e, 0x9e, 0xb8, 0xa7, 0xe7, 0x5e, 0x2c, 0x8d, 0x3f, 0xa9, - 0x59, 0xc0, 0x36, 0x4d, 0xf0, 0x66, 0xa9, 0xec, 0xc3, 0x3a, 0xc7, 0xc7, - 0xbb, 0xea, 0xc2, 0x75, 0xd7, 0xda, 0x50, 0xd8, 0x5e, 0xd8, 0xa3, 0x2f, - 0xf2, 0x1e, 0x87, 0x97, 0x35, 0x97, 0xbf, 0x4c, 0x90, 0x26, 0xd3, 0x68, - 0x13, 0x6b, 0xf0, 0xc5, 0x8c, 0x65, 0x0d, 0xd2, 0xf4, 0xab, 0x86, 0x52, - 0x92, 0x9d, 0x55, 0x81, 0xa9, 0xce, 0xd9, 0xf0, 0x2f, 0x20, 0x24, 0x88, - 0x96, 0xd5, 0xb2, 0x50, 0x31, 0xdd, 0x90, 0x70, 0x34, 0x5c, 0xe4, 0x7a, - 0x2d, 0x1d, 0x83, 0x10, 0x63, 0xa1, 0xfa, 0x6a, 0x5d, 0xd3, 0x84, 0x83, - 0x21, 0xca, 0x64, 0x07, 0x2e, 0x63, 0x41, 0x2b, 0x29, 0xd3, 0x8b, 0xcb, - 0x57, 0xe4, 0xe4, 0x3c, 0x68, 0x82, 0x01, 0x98, 0x0c, 0x71, 0xeb, 0xdf, - 0x20, 0xaf, 0x5c, 0x24, 0xcf, 0xac, 0xcb, 0x81, 0x5c, 0xd8, 0x04, 0x67, - 0xd3, 0xb7, 0x44, 0x63, 0xd2, 0x6f, 0xbd, 0x6e, 0x7c, 0x42, 0xee, 0x84, - 0x2d, 0x57, 0x05, 0xc5, 0x84, 0xc3, 0x40, 0x54, 0x65, 0x04, 0xe6, 0x9d, - 0xaf, 0x07, 0x38, 0x09, 0xb9, 0xbe, 0xd2, 0x8b, 0x2f, 0x32, 0xcb, 0x34, - 0x49, 0x89, 0x36, 0xb4, 0x02, 0x6a, 0xe5, 0x12, 0xb5, 0x42, 0xed, 0x26, - 0xb6, 0x53, 0x07, 0x47, 0x8e, 0xc4, 0x34, 0x26, 0x3b, 0xc7, 0x9c, 0x75, - 0x53, 0xd1, 0x22, 0x36, 0x5b, 0x46, 0x8f, 0x86, 0x4f, 0x7d, 0xba, 0x5a, - 0xa0, 0x11, 0x11, 0x07, 0x4c, 0xca, 0x26, 0x41, 0x6f, 0xc7, 0x3c, 0x57, - 0x8f, 0xfd, 0x8b, 0x2f, 0x02, 0xd3, 0xad, 0x8c, 0xba, 0x8a, 0x58, 0xe7, - 0x06, 0x02, 0x48, 0x93, 0x34, 0x46, 0x1a, 0xe4, 0x94, 0x5e, 0x98, 0xe0, - 0xe1, 0x3b, 0x4c, 0xa5, 0xdd, 0xc5, 0xf8, 0x2f, 0xe9, 0xe2, 0xd7, 0x04, - 0x57, 0x5b, 0xc4, 0x8f, 0x75, 0x37, 0xe7, 0x3f, 0x34, 0x12, 0x0d, 0x51, - 0x50, 0x7a, 0x84, 0x85, 0x27, 0xc5, 0xf7, 0x60, 0x60, 0xd6, 0xe9, 0x6d, - 0x84, 0xa2, 0xeb, 0x05, 0x36, 0x25, 0xe0, 0xc1, 0x9b, 0x19, 0x3c, 0x69, - 0xa0, 0xc8, 0x8f, 0x91, 0x47, 0x61, 0x22, 0x5e, 0x14, 0xa2, 0xbb, 0xad, - 0xf3, 0xab, 0xba, 0xf9, 0x35, 0xfb, 0x46, 0xe4, 0x58, 0x21, 0xd8, 0xb1, - 0x30, 0x92, 0x47, 0x97, 0xb3, 0x80, 0x27, 0xe2, 0x81, 0x04, 0x90, 0xe1, - 0x86, 0x28, 0x1f, 0x53, 0x3f, 0x5d, 0xd8, 0xdb, 0x60, 0x0a, 0xe6, 0x8c, - 0x86, 0xc3, 0xf1, 0xe0, 0xe6, 0xef, 0xb0, 0x60, 0xfe, 0xd8, 0xaa, 0xf8, - 0x29, 0x5e, 0x66, 0x16, 0xce, 0x18, 0xb2, 0x88, 0xf4, 0x1f, 0x1d, 0x26, - 0x5d, 0xfc, 0x2d, 0xd9, 0x81, 0xb5, 0xe3, 0xaa, 0xb8, 0xfe, 0x92, 0xbf, - 0xa5, 0x8c, 0xd1, 0x3f, 0x59, 0x1a, 0xf7, 0x38, 0x50, 0x40, 0x8b, 0xe2, - 0x9c, 0xad, 0xfe, 0x16, 0x16, 0x2f, 0x63, 0x2a, 0xb3, 0xb9, 0x44, 0x59, - 0x33, 0xa0, 0x02, 0x1e, 0x4b, 0x96, 0xd7, 0x14, 0x5f, 0xed, 0x55, 0xc9, - 0x02, 0x6d, 0x50, 0x6e, 0xe3, 0x08, 0xc5, 0x71, 0x0d, 0x1e, 0xd2, 0x39, - 0x1f, 0x0b, 0x3e, 0xd1, 0x44, 0x3e, 0x52, 0xaf, 0xb9, 0x5a, 0xb7, 0x12, - 0x0e, 0xf0, 0xa1, 0xab, 0x76, 0x57, 0x31, 0x9c, 0xf2, 0x21, 0x6e, 0x59, - 0xd7, 0x22, 0x05, 0x3c, 0xc5, 0xa6, 0x23, 0x7b, 0xdc, 0xdb, 0x55, 0x1a, - 0x01, 0x07, 0x8c, 0x30, 0x4b, 0x90, 0x35, 0x88, 0x77, 0x3c, 0xe9, 0xc9, - 0x45, 0x92, 0x7f, 0x26, 0x8c, 0x11, 0x60, 0xeb, 0x01, 0x13, 0xe6, 0x35, - 0x33, 0x2f, 0xa6, 0xb7, 0x86, 0x38, 0x85, 0x55, 0xbb, 0x75, 0xb8, 0x2f, - 0xa1, 0x80, 0x86, 0x83, 0xce, 0x6f, 0x32, 0x77, 0xd7, 0xd2, 0x0e, 0x1b, - 0xa7, 0xd0, 0x0c, 0x31, 0x9e, 0x2e, 0x24, 0xf3, 0x86, 0xde, 0x0a, 0xfb, - 0x58, 0xbc, 0x33, 0xd1, 0xc8, 0xbb, 0x84, 0xe6, 0xc3, 0x5a, 0x4c, 0x76, - 0x01, 0x3c, 0x3a, 0xb0, 0xc9, 0xf7, 0x31, 0x63, 0x03, 0x37, 0x1f, 0xc7, - 0xba, 0x89, 0x4b, 0x3e, 0xb3, 0x90, 0xb2, 0xf2, 0xfe, 0x8e, 0xd0, 0x92, - 0x71, 0x97, 0xbe, 0x57, 0xd6, 0x46, 0x6b, 0xb6, 0x8e, 0xb8, 0x98, 0x3e, - 0x04, 0x01, 0x61, 0x2b, 0xc9, 0xc5, 0x04, 0x7f, 0x6f, 0x14, 0x49, 0x1b, - 0x66, 0x64, 0xf2, 0x94, 0x88, 0xde, 0x91, 0x88, 0x4b, 0x4f, 0xb2, 0xf6, - 0xa4, 0x0c, 0xd5, 0xdb, 0x38, 0x7c, 0x10, 0x34, 0x7f, 0xa1, 0x11, 0x0f, - 0x3e, 0x57, 0xf7, 0xcf, 0x73, 0xe6, 0x26, 0x68, 0x5f, 0xc9, 0x07, 0x3d, - 0xa5, 0x71, 0x69, 0x95, 0xfe, 0x32, 0xcb, 0xb6, 0xe3, 0x47, 0xad, 0x47, - 0xf3, 0x35, 0x10, 0x2b, 0x04, 0x39, 0x16, 0x36, 0x9b, 0xc4, 0xb5, 0x83, - 0x3b, 0xfb, 0xb6, 0x28, 0x70, 0x69, 0xaa, 0xa5, 0x78, 0x31, 0x1e, 0x82, - 0x05, 0xce, 0x3a, 0xa3, 0x47, 0x16, 0xce, 0x98, 0x0e, 0xf0, 0x6b, 0x06, - 0x54, 0xaa, 0xc3, 0x2e, 0xd2, 0x9b, 0x88, 0x73, 0x60, 0x52, 0xa7, 0xa7, - 0x1c, 0xbf, 0x1d, 0xab, 0x23, 0x98, 0x5c, 0x02, 0x6b, 0x4d, 0x6c, 0x80, - 0xd2, 0x73, 0x21, 0x63, 0xc4, 0x80, 0x3d, 0x31, 0x4f, 0x99, 0xe3, 0xe4, - 0x2c, 0xb9, 0xb4, 0x10, 0xc9, 0x18, 0x8f, 0x21, 0x82, 0xb9, 0x52, 0x97, - 0x37, 0x13, 0xaa, 0x9f, 0x36, 0xb2, 0xa0, 0xa7, 0x8e, 0x95, 0x89, 0xf9, - 0xa6, 0xfd, 0x7f, 0xe7, 0x7c, 0x91, 0xea, 0x1c, 0x42, 0x54, 0x57, 0x36, - 0xd7, 0xca, 0x26, 0x02, 0xaf, 0x9b, 0x87, 0x85, 0x30, 0xf4, 0x6a, 0x05, - 0xab, 0x18, 0x4c, 0xed, 0x75, 0x05, 0xb0, 0x90, 0x85, 0xf1, 0xbc, 0x42, - 0xc9, 0x61, 0x2a, 0x6e, 0x82, 0xda, 0x94, 0x15, 0xc3, 0x01, 0x3f, 0x30, - 0x2c, 0x9b, 0x5d, 0x02, 0xc3, 0x65, 0x54, 0x96, 0xdc, 0x96, 0x17, 0x15, - 0x92, 0x70, 0x67, 0x91, 0xda, 0xe9, 0x49, 0xf8, 0xfc, 0x58, 0x5f, 0xca, - 0x62, 0xbb, 0x0b, 0x0c, 0x9a, 0x0c, 0x20, 0x05, 0xe2, 0x54, 0x3e, 0x7b, - 0xd6, 0x19, 0xa2, 0xec, 0x8a, 0xc7, 0x5f, 0xf9, 0x0d, 0x45, 0xd2, 0xbe, - 0x1b, 0x57, 0x0a, 0x78, 0x4b, 0x7f, 0xe8, 0xfa, 0xf3, 0x12, 0x93, 0xe3, - 0xc3, 0x84, 0x86, 0x0b, 0x45, 0xbd, 0x61, 0x22, 0x66, 0xf3, 0xd5, 0x62, - 0xba, 0xd8, 0xc6, 0x19, 0xbf, 0xc7, 0x72, 0xd2, 0xba, 0x27, 0x7f, 0x8f, - 0x91, 0x05, 0x43, 0xa0, 0x59, 0x94, 0x06, 0x27, 0xd1, 0x4c, 0x25, 0xfa, - 0xfa, 0x4b, 0x36, 0x2f, 0x75, 0xf9, 0xfb, 0xc8, 0xe7, 0x60, 0xe1, 0x43, - 0x9a, 0xf1, 0x7f, 0xcf, 0x84, 0xef, 0x25, 0x06, 0x43, 0x7b, 0xe4, 0x4d, - 0xfc, 0x11, 0x97, 0xde, 0x43, 0x5e, 0x1f, 0x22, 0x6d, 0xc2, 0x1b, 0x16, - 0xbe, 0x4c, 0x46, 0x9c, 0x51, 0x5f, 0x49, 0x59, 0xf9, 0xac, 0x1e, 0x94, - 0x31, 0x2c, 0x2d, 0x15, 0xd0, 0x5e, 0x7e, 0x1c, 0xe1, 0xce, 0x96, 0x21, - 0x28, 0x2a, 0xca, 0x48, 0x81, 0xd3, 0xa6, 0x68, 0xd3, 0x41, 0x9d, 0xb5, - 0x81, 0x89, 0x1f, 0xb3, 0xb9, 0xe2, 0x5c, 0xa2, 0x86, 0xb3, 0x86, 0xe3, - 0xf3, 0x2f, 0x5e, 0x7f, 0x24, 0x10, 0x7d, 0x72, 0xf9, 0x30, 0xa5, 0xbd, - 0xfc, 0x48, 0x83, 0x1b, 0xc9, 0x2c, 0xcd, 0x31, 0x10, 0x05, 0x41, 0x72, - 0x22, 0x9c, 0x2c, 0xec, 0x9a, 0x2f, 0x33, 0x10, 0xe9, 0x47, 0xa0, 0xb2, - 0x54, 0x3c, 0xce, 0x35, 0xc2, 0x69, 0x17, 0x2a, 0x72, 0x6a, 0x9b, 0x74, - 0x6c, 0xee, 0xb9, 0xe2, 0x75, 0x35, 0x31, 0xad, 0x9e, 0xd7, 0xeb, 0xb8, - 0x14, 0x4e, 0x87, 0x6f, 0xdc, 0x8c, 0xc8, 0x7f, 0x78, 0x31, 0x7d, 0xdc, - 0x2d, 0x84, 0xc7, 0x6c, 0xce, 0x7b, 0x50, 0xb0, 0x8b, 0xfc, 0x05, 0x3d, - 0x92, 0xb5, 0xfa, 0x48, 0x78, 0x29, 0x69, 0xb3, 0x0b, 0x66, 0xbf, 0x89, - 0xad, 0x91, 0x3d, 0x23, 0x90, 0xca, 0x01, 0xd1, 0x58, 0x52, 0xbc, 0xf9, - 0xdb, 0x9b, 0xd7, 0x17, 0xb5, 0x56, 0x9f, 0x5d, 0x54, 0x7c, 0x1b, 0xad, - 0xc5, 0x92, 0x64, 0x7c, 0x2b, 0xf7, 0xd3, 0xfa, 0x5a, 0x2a, 0x16, 0xcb, - 0xfd, 0xa2, 0xf6, 0x6f, 0xb7, 0x37, 0x8f, 0x0b, 0x89, 0x59, 0x5b, 0xf7, - 0xdc, 0xbb, 0x07, 0xae, 0x02, 0xe9, 0xe7, 0xa5, 0xcd, 0x86, 0x72, 0x67, - 0xce, 0x96, 0x9a, 0x00, 0xe1, 0x6c, 0x7f, 0x84, 0x2d, 0xfb, 0x0d, 0x75, - 0x0d, 0xf0, 0x0a, 0x90, 0x3c, 0xf8, 0x62, 0xe5, 0xd9, 0x73, 0x00, 0x22, - 0x38, 0x3d, 0xe5, 0x95, 0xce, 0x21, 0x20, 0x7b, 0x2c, 0xcd, 0x38, 0x2c, - 0x7e, 0x10, 0x20, 0x10, 0xb8, 0x77, 0x67, 0x7a, 0xb2, 0x31, 0xf4, 0xec, - 0xfb, 0x50, 0x48, 0xea, 0x5c, 0x28, 0xd1, 0x59, 0x41, 0x3e, 0x84, 0xa8, - 0xe6, 0x01, 0x32, 0x62, 0x6c, 0x17, 0xdf, 0x17, 0x47, 0xdc, 0xaf, 0x6a, - 0xdd, 0x0b, 0x71, 0x69, 0x02, 0x55, 0x2b, 0x99, 0x12, 0x76, 0x0b, 0xac, - 0xe3, 0x86, 0xf9, 0xa7, 0x2a, 0x53, 0x93, 0xcf, 0xfc, 0x45, 0x99, 0x69, - 0x00, 0xb6, 0xba, 0x35, 0x10, 0x0b, 0xe0, 0x7c, 0x48, 0xf1, 0x1e, 0xa1, - 0x97, 0x70, 0xd7, 0x6e, 0x27, 0x75, 0x6f, 0x6a, 0xbc, 0xb8, 0x70, 0x2e, - 0x4d, 0x39, 0xd8, 0x28, 0x48, 0x5f, 0xe2, 0xe4, 0x7c, 0xc5, 0xd5, 0x77, - 0x82, 0x16, 0x42, 0xb6, 0xee, 0xe6, 0xa2, 0xe4, 0xda, 0x7d, 0xfd, 0xe0, - 0x45, 0xdc, 0xa8, 0x1b, 0x1f, 0x89, 0x4f, 0x6b, 0x4e, 0x7a, 0x42, 0xf9, - 0xba, 0x0e, 0x88, 0xbc, 0x6b, 0xa6, 0xaf, 0x32, 0x42, 0x07, 0x6d, 0xe5, - 0x2b, 0x69, 0xdb, 0x93, 0x97, 0x4e, 0xa3, 0xe6, 0x3f, 0xb8, 0x21, 0x1b, - 0x93, 0x33, 0x67, 0x41, 0xf7, 0x40, 0xdf, 0x93, 0xce, 0x01, 0xc1, 0x3e, - 0x9d, 0x55, 0x50, 0x9d, 0xc8, 0x28, 0x70, 0xed, 0x11, 0xd0, 0x0f, 0x2e, - 0x26, 0xc1, 0x36, 0x0d, 0xe7, 0x5a, 0xb0, 0xde, 0xaa, 0xff, 0xa6, 0xbb, - 0xf4, 0x74, 0x99, 0xbb, 0x77, 0x1c, 0x47, 0x74, 0x5f, 0xf6, 0xf3, 0xc2, - 0x97, 0xaf, 0x7c, 0x59, 0xa3, 0x3e, 0xe3, 0xd9, 0x57, 0xd4, 0x6e, 0xdb, - 0xe2, 0xf9, 0xf6, 0xee, 0x62, 0x2d, 0xc9, 0x12, 0x4f, 0x1d, 0x3d, 0x6d, - 0x9b, 0x2c, 0x58, 0x76, 0x17, 0x90, 0xc2, 0x9b, 0x73, 0x38, 0x6a, 0x26, - 0xc1, 0x4f, 0x45, 0x11, 0x8e, 0xf3, 0xd8, 0x9c, 0x47, 0xa1, 0x17, 0xeb, - 0x6f, 0x5c, 0x33, 0xc4, 0x3f, 0x7a, 0x90, 0xe1, 0x50, 0xf8, 0x78, 0xef, - 0xf3, 0x17, 0x6a, 0x34, 0x79, 0x58, 0x6a, 0x97, 0x49, 0x0d, 0x04, 0x40, - 0x9d, 0x0c, 0x30, 0xcc, 0x43, 0x02, 0x83, 0x1a, 0xcf, 0x68, 0x39, 0x18, - 0x78, 0x33, 0xc7, 0xde, 0x50, 0x66, 0x70, 0xcc, 0x7c, 0xf6, 0xb0, 0xa5, - 0x16, 0xec, 0x67, 0x4a, 0xae, 0xe2, 0x4e, 0xdc, 0x49, 0xf2, 0xd1, 0xc6, - 0xe4, 0xc6, 0xf3, 0xcb, 0x62, 0x1c, 0x58, 0x2a, 0x68, 0xc2, 0x27, 0x5e, - 0x9c, 0xe5, 0x53, 0x50, 0x82, 0xec, 0x25, 0x76, 0xc2, 0x4d, 0x00, 0x95, - 0x4e, 0x4b, 0xc9, 0x8a, 0x07, 0x24, 0x7b, 0x67, 0x6c, 0xc9, 0x7f, 0x97, - 0x1a, 0x51, 0x71, 0x9b, 0x3b, 0xda, 0xab, 0x34, 0x31, 0x90, 0xfd, 0x11, - 0x11, 0x50, 0xb8, 0x60, 0x88, 0x12, 0xbd, 0x76, 0x39, 0xa7, 0xa4, 0x3c, - 0xb4, 0x85, 0xa6, 0x70, 0xa7, 0x6b, 0x03, 0x18, 0x8c, 0x6a, 0x20, 0x50, - 0x6b, 0x9e, 0xee, 0xf6, 0xe2, 0x47, 0x6e, 0x1b, 0xd0, 0x3f, 0x5f, 0x69, - 0x15, 0x49, 0xb3, 0x6c, 0x2f, 0x6e, 0x52, 0x13, 0x21, 0x1f, 0xc4, 0xac, - 0x6f, 0xa7, 0xd3, 0xd5, 0xab, 0xbc, 0xe3, 0x05, 0x5e, 0x96, 0xbd, 0x24, - 0x03, 0x2b, 0x61, 0x97, 0x92, 0x40, 0x8a, 0x2b, 0xcb, 0x11, 0xde, 0x5d, - 0xb6, 0xfd, 0x68, 0x5d, 0x52, 0x13, 0x1c, 0xb5, 0xd8, 0x8a, 0x8c, 0xb7, - 0xac, 0x2d, 0xa1, 0xad, 0x76, 0xde, 0x98, 0xb0, 0x6d, 0x39, 0x0d, 0x7a, - 0x7b, 0xd5, 0x11, 0x1f, 0x5d, 0xe7, 0xeb, 0xe1, 0x36, 0x58, 0xda, 0x84, - 0x57, 0xb7, 0x3e, 0x8c, 0x81, 0x8c, 0xb8, 0x5c, 0x72, 0xd5, 0x1f, 0x13, - 0x54, 0x69, 0x70, 0xf5, 0xa9, 0xea, 0x74, 0xef, 0x04, 0xac, 0x5b, 0xe3, - 0x5f, 0xcd, 0x1d, 0x31, 0x4e, 0x6d, 0x6e, 0x66, 0x3b, 0x74, 0xfc, 0xc5, - 0x52, 0x01, 0x6b, 0x89, 0xd3, 0x92, 0xa2, 0xf3, 0x7e, 0xac, 0xed, 0x5b, - 0xd2, 0x01, 0x2a, 0xba, 0xe7, 0x63, 0x9c, 0xe0, 0x17, 0x04, 0x81, 0x83, - 0xfb, 0x09, 0x13, 0xb5, 0x2f, 0xcb, 0xe6, 0xeb, 0xfe, 0x77, 0x07, 0x05, - 0xb0, 0x97, 0xc9, 0xba, 0xe1, 0xb9, 0x49, 0xe7, 0xfc, 0x8e, 0x93, 0x5c, - 0x59, 0xdb, 0x63, 0x48, 0x10, 0x46, 0x58, 0xdc, 0x8b, 0x95, 0xfc, 0x59, - 0x66, 0x26, 0xbf, 0x74, 0x81, 0x5b, 0x76, 0x13, 0x2d, 0x4b, 0xd3, 0x62, - 0xf3, 0x8a, 0x82, 0x02, 0xf9, 0xdf, 0xc2, 0x86, 0xf9, 0x3e, 0x9d, 0xe3, - 0xb9, 0x87, 0xcb, 0x81, 0x1a, 0x88, 0xed, 0xef, 0x90, 0xfb, 0x35, 0x2f, - 0x78, 0x93, 0x2a, 0x37, 0xe5, 0x7c, 0x38, 0xff, 0x07, 0x76, 0x00, 0xf0, - 0x77, 0x67, 0xa2, 0x8a, 0x06, 0xa5, 0xf0, 0xb9, 0xeb, 0x7e, 0x8f, 0x0f, - 0x5f, 0xf9, 0x6d, 0x1d, 0xa8, 0x9a, 0x85, 0x3b, 0xfa, 0x34, 0xcf, 0x02, - 0x07, 0x48, 0x0f, 0xf3, 0x4e, 0x11, 0x7d, 0x94, 0xa3, 0x88, 0xa2, 0x48, - 0x0c, 0xaa, 0x7b, 0x59, 0x9b, 0x78, 0x9b, 0xdc, 0xd4, 0xd2, 0xd6, 0xcb, - 0xc2, 0x8e, 0x82, 0x3a, 0xfc, 0x0b, 0xb7, 0x5f, 0x44, 0xbb, 0x99, 0xfe, - 0xe8, 0x29, 0x8e, 0xdd, 0x91, 0x9a, 0x4a, 0x0b, 0xf1, 0x62, 0x1d, 0x32, - 0x8b, 0x62, 0x97, 0xb6, 0x95, 0xe1, 0xfb, 0x0c, 0x3a, 0xe8, 0xcb, 0x4e, - 0x2f, 0x66, 0xdf, 0xd1, 0x53, 0x2a, 0x75, 0x6d, 0x23, 0x23, 0x79, 0x20, - 0xa0, 0x76, 0xe2, 0x42, 0x2c, 0x84, 0x16, 0x48, 0xf1, 0xf8, 0xf1, 0x2f, - 0xd1, 0x70, 0x4d, 0x28, 0x54, 0xc2, 0x98, 0xe6, 0x05, 0xd1, 0x53, 0xbb, - 0x9a, 0x18, 0x63, 0x11, 0xe3, 0xeb, 0x0a, 0xbf, 0xb6, 0x11, 0x2d, 0x3e, - 0x3a, 0x6f, 0x0e, 0xa3, 0x09, 0x10, 0x3f, 0x7e, 0xdd, 0x58, 0xe7, 0x38, - 0x27, 0x13, 0xd7, 0x8a, 0xe0, 0x26, 0x5e, 0x0a, 0xf5, 0x54, 0xbe, 0xc7, - 0xbd, 0x48, 0x56, 0x38, 0xaa, 0x6d, 0x53, 0x2f, 0xb6, 0xd1, 0xbb, 0xee, - 0x91, 0xd5, 0xc7, 0x78, 0x73, 0x1d, 0xad, 0x40, 0x6a, 0x7e, 0x93, 0x73, - 0x0c, 0x75, 0x5d, 0x31, 0x72, 0x98, 0xd0, 0xb3, 0xb7, 0xd9, 0xe5, 0xfd, - 0x12, 0x44, 0xd1, 0xec, 0xc5, 0xbc, 0x5d, 0x1a, 0x60, 0x8c, 0xba, 0x24, - 0xd3, 0xa2, 0xfa, 0xc1, 0x14, 0xa7, 0x12, 0x53, 0xf5, 0xc0, 0x8b, 0x5e, - 0x69, 0x63, 0xb0, 0x0d, 0x59, 0xca, 0x15, 0x6a, 0x26, 0x75, 0x8a, 0x0c, - 0x7e, 0x3a, 0x29, 0x9e, 0x69, 0x0e, 0xd1, 0x50, 0xf2, 0xd5, 0x28, 0xbe, - 0x09, 0xe9, 0xd7, 0x86, 0x65, 0x13, 0xc3, 0xcf, 0x64, 0x0a, 0xb1, 0xab, - 0x11, 0x47, 0xe8, 0xd4, 0xa3, 0x89, 0xcc, 0xa8, 0xd7, 0x09, 0xab, 0x0c, - 0x99, 0xe7, 0xe6, 0x8c, 0xaf, 0x3d, 0x09, 0x47, 0x47, 0xa8, 0xb8, 0x69, - 0xc4, 0xd6, 0x1b, 0x48, 0x2c, 0x0d, 0x43, 0xbc, 0x1b, 0xf6, 0x73, 0xf7, - 0xbe, 0x5b, 0x8c, 0x83, 0x20, 0x02, 0x72, 0x2b, 0x3d, 0xcd, 0xcb, 0x18, - 0x48, 0x6b, 0x07, 0x18, 0x37, 0xe7, 0xe3, 0x48, 0xd3, 0x86, 0xd7, 0xfe, - 0x22, 0xd8, 0x2e, 0xdb, 0x70, 0x17, 0x7b, 0xa9, 0x47, 0xfb, 0xb4, 0xfd, - 0x29, 0xf3, 0x8a, 0x91, 0xca, 0xdb, 0x55, 0x97, 0xbd, 0x00, 0xb7, 0xdb, - 0xd0, 0xff, 0x40, 0x8a, 0xba, 0xfc, 0x00, 0x1d, 0x6d, 0xe0, 0xde, 0x8b, - 0x88, 0xd2, 0xa0, 0x93, 0x1d, 0xbc, 0xe5, 0x85, 0x61, 0x46, 0x3d, 0x6e, - 0xb7, 0x04, 0x19, 0x7f, 0x96, 0x13, 0x7d, 0xb2, 0xcc, 0x15, 0xf3, 0x99, - 0x1b, 0xba, 0x5a, 0x4b, 0xc9, 0xc0, 0x30, 0x17, 0xa4, 0x5a, 0xf0, 0x77, - 0x79, 0x97, 0xea, 0x8c, 0x85, 0x45, 0x86, 0x33, 0x53, 0x6e, 0xb8, 0xcf, - 0xce, 0xfb, 0xf3, 0x26, 0xa3, 0xc3, 0x00, 0x32, 0xc0, 0x6f, 0xd1, 0xe1, - 0x99, 0x3a, 0x62, 0x71, 0xc6, 0x01, 0x92, 0x5b, 0x2e, 0x8f, 0x01, 0x5f, - 0x1f, 0x6f, 0x20, 0xda, 0xaf, 0x18, 0x34, 0xeb, 0xe7, 0xe0, 0x4f, 0xdd, - 0x0c, 0xd4, 0xd3, 0xa5, 0x2a, 0x18, 0x8c, 0x2a, 0x87, 0xf9, 0x6c, 0x22, - 0xf0, 0x50, 0x59, 0x23, 0x27, 0x7e, 0x72, 0xfa, 0xbf, 0x15, 0xe7, 0x88, - 0x0b, 0x9e, 0x7f, 0x42, 0x41, 0x45, 0x3f, 0xe9, 0xd9, 0xc4, 0xd9, 0x52, - 0x3e, 0x87, 0xa6, 0xfe, 0xdd, 0xac, 0x1a, 0x8a, 0x4c, 0x01, 0x91, 0xcf, - 0xee, 0x07, 0x67, 0x6f, 0x46, 0x08, 0xb5, 0x39, 0xb8, 0xba, 0x31, 0xdc, - 0xf5, 0x03, 0x4e, 0xad, 0xaa, 0xa6, 0xaf, 0xf2, 0xb3, 0x05, 0xdd, 0x74, - 0x3b, 0x1b, 0x07, 0x69, 0xdc, 0x92, 0x2f, 0x9f, 0x94, 0x54, 0x63, 0x96, - 0x3a, 0xc7, 0x35, 0x19, 0xcc, 0x53, 0x3b, 0xdf, 0x07, 0x1b, 0x68, 0x1c, - 0x3e, 0x46, 0xf7, 0x20, 0xea, 0x4d, 0xc9, 0xd5, 0x17, 0xb5, 0xa7, 0xbd, - 0x3b, 0xda, 0x7f, 0xbe, 0x82, 0x10, 0x93, 0xee, 0x32, 0xe9, 0x8e, 0x37, - 0xff, 0xfa, 0xd7, 0x80, 0x91, 0x7f, 0xb1, 0xb4, 0x8f, 0xd0, 0xf8, 0x9c, - 0x00, 0x41, 0x8a, 0x15, 0xc0, 0x02, 0x5d, 0x23, 0xf8, 0x27, 0x90, 0xf3, - 0x58, 0x71, 0x71, 0xdc, 0x6d, 0x2e, 0x53, 0xe8, 0x13, 0xf3, 0x6c, 0x8c, - 0x9d, 0xe8, 0x3a, 0x58, 0x86, 0x3b, 0xee, 0xae, 0xff, 0x0c, 0xe9, 0x49, - 0x0e, 0xd6, 0xe7, 0x41, 0xdd, 0xd9, 0xbc, 0x39, 0xef, 0x19, 0xbf, 0xa3, - 0xb9, 0x66, 0x7c, 0x07, 0xff, 0xd1, 0x2d, 0xa8, 0x8d, 0xb5, 0x1f, 0xeb, - 0xe3, 0xf6, 0x28, 0x84, 0xda, 0x5f, 0x63, 0x61, 0x88, 0x29, 0xd8, 0x50, - 0x68, 0xfc, 0x4f, 0x1c, 0x4c, 0xc7, 0x7a, 0xd5, 0x2e, 0xc6, 0xb2, 0x49, - 0x2f, 0x09, 0x46, 0x9a, 0x3f, 0x2f, 0xc6, 0x3b, 0xdc, 0x50, 0xd6, 0xb9, - 0xcb, 0xaa, 0x96, 0x67, 0x2c, 0x70, 0x4e, 0x4c, 0x93, 0xe5, 0xcf, 0x85, - 0x2c, 0x23, 0x87, 0xa7, 0x8c, 0x69, 0x54, 0x03, 0xdb, 0x6c, 0xff, 0x91, - 0xab, 0x64, 0x92, 0x2a, 0xf0, 0x8e, 0x31, 0x1d, 0x4d, 0x72, 0x9b, 0x91, - 0x90, 0x6f, 0xf2, 0xe6, 0xe6, 0x23, 0xe3, 0xd2, 0x18, 0x2a, 0x50, 0x45, - 0x74, 0x4a, 0x2d, 0x24, 0x02, 0x30, 0xfb, 0x02, 0x1c, 0x13, 0x42, 0xce, - 0x50, 0xc7, 0xef, 0x00, 0x6d, 0x36, 0xdf, 0xd2, 0xbd, 0xf9, 0x39, 0x41, - 0x15, 0x52, 0x4d, 0x45, 0x5f, 0x4b, 0x1f, 0xc4, 0xb6, 0x62, 0xd2, 0x3c, - 0xc4, 0x75, 0x99, 0x94, 0x3e, 0x1c, 0x4f, 0x91, 0x24, 0x7f, 0x4b, 0x95, - 0xa0, 0x0a, 0x16, 0x47, 0xb1, 0xac, 0xe2, 0xf7, 0x78, 0xf4, 0x71, 0x2a, - 0xf1, 0xb2, 0x5c, 0x82, 0x2a, 0x3d, 0x20, 0x06, 0x6a, 0xd9, 0x54, 0x80, - 0x46, 0x4c, 0x2e, 0xdd, 0x7a, 0xda, 0x2d, 0xee, 0xda, 0x71, 0x8e, 0x6e, - 0xf5, 0x6d, 0xc2, 0x11, 0x34, 0x71, 0x17, 0x00, 0x0b, 0xf3, 0x5a, 0x64, - 0x5e, 0x4e, 0x3b, 0xc8, 0x04, 0x15, 0x53, 0x35, 0x10, 0xfc, 0x68, 0x34, - 0x88, 0x51, 0x42, 0x10, 0x7f, 0xed, 0x55, 0x65, 0x76, 0xb9, 0x57, 0x1b, - 0x03, 0xd9, 0x25, 0x17, 0xa2, 0xe5, 0xc8, 0xfe, 0xc6, 0x5c, 0x7c, 0xae, - 0x1f, 0xf3, 0xd8, 0x62, 0x1b, 0xf3, 0x92, 0x4a, 0x4f, 0x1a, 0x9d, 0x64, - 0x53, 0xb3, 0xee, 0x70, 0x27, 0x85, 0x05, 0x0a, 0xaf, 0x82, 0xaf, 0x74, - 0x29, 0xc5, 0x6a, 0x24, 0xa5, 0xc7, 0x3b, 0x45, 0x2a, 0xd8, 0xc6, 0x2a, - 0x22, 0xb8, 0xea, 0xd5, 0x19, 0x8b, 0x40, 0x17, 0x7c, 0x3b, 0x2f, 0x97, - 0x30, 0xc8, 0xca, 0xc7, 0xd5, 0x07, 0xf7, 0x5e, 0xcd, 0xcb, 0x4e, 0x68, - 0xc2, 0x69, 0xa1, 0x0a, 0x5a, 0x65, 0xb0, 0x16, 0x47, 0x44, 0xc8, 0x59, - 0xe4, 0xff, 0x33, 0x96, 0x43, 0xb3, 0xf2, 0xe8, 0xc6, 0xef, 0xcc, 0xb9, - 0x18, 0xca, 0xca, 0x61, 0x2e, 0x10, 0x90, 0xfd, 0xf3, 0x61, 0x13, 0xbb, - 0x37, 0xf1, 0x71, 0xbc, 0xd9, 0x0a, 0xc4, 0x49, 0xa1, 0xdf, 0x63, 0x75, - 0xde, 0xd6, 0x77, 0x4f, 0x51, 0x47, 0xc3, 0xd9, 0x5d, 0xeb, 0x58, 0x58, - 0x6f, 0x95, 0x04, 0xba, 0x14, 0xf1, 0x9a, 0xb3, 0x35, 0x58, 0x44, 0x68, - 0x03, 0x78, 0xa0, 0xf6, 0xfc, 0x71, 0xde, 0x5c, 0x0f, 0x94, 0x10, 0xe3, - 0x1b, 0xbb, 0xaa, 0x1b, 0x10, 0xa2, 0x04, 0xa4, 0xb0, 0xff, 0x7c, 0x81, - 0x5a, 0xfb, 0xaf, 0x03, 0x22, 0x67, 0x7c, 0x64, 0x29, 0xea, 0xda, 0xcd, - 0xc6, 0x10, 0x0e, 0xae, 0x31, 0xd8, 0x64, 0x3a, 0xed, 0x73, 0xe1, 0x0a, - 0x3f, 0x43, 0x30, 0xac, 0x32, 0xbe, 0x9e, 0xec, 0x0b, 0x76, 0xcf, 0xb0, - 0xcf, 0x7e, 0xd7, 0x8f, 0x2d, 0x5f, 0x21, 0xc4, 0x07, 0xe3, 0x82, 0x99, - 0x2d, 0xe4, 0x26, 0xf3, 0x70, 0x69, 0x58, 0x46, 0x84, 0xe8, 0x90, 0x72, - 0xf2, 0xda, 0xd6, 0x04, 0xb6, 0x75, 0xa5, 0x71, 0x13, 0x83, 0x1a, 0x43, - 0xa3, 0x82, 0x57, 0x2f, 0x82, 0x48, 0xf7, 0x02, 0x28, 0x18, 0xe6, 0x91, - 0x75, 0x78, 0x0e, 0x1b, 0x54, 0x29, 0x19, 0xbc, 0x26, 0x35, 0xae, 0xa0, - 0xb2, 0x7c, 0xb3, 0x67, 0x03, 0xb2, 0x02, 0x2a, 0x33, 0x37, 0xe1, 0xc1, - 0x7e, 0xac, 0xe9, 0xab, 0xc6, 0x4c, 0xde, 0x06, 0x4a, 0x21, 0xd3, 0x04, - 0xed, 0xb0, 0x18, 0xf2, 0xa8, 0xdd, 0x1a, 0x7f, 0x03, 0x44, 0xe0, 0x1c, - 0xee, 0x4e, 0x86, 0xa6, 0xc4, 0x29, 0x64, 0x67, 0x43, 0x1c, 0x9b, 0x87, - 0x1c, 0xad, 0x09, 0x54, 0x9e, 0xcd, 0xc0, 0x52, 0xfb, 0x2e, 0xcf, 0x99, - 0x07, 0xe1, 0xce, 0x6e, 0x35, 0xec, 0xe8, 0xeb, 0x4c, 0x21, 0x71, 0x02, - 0x76, 0x3e, 0x35, 0x93, 0x8d, 0x44, 0x89, 0x9c, 0x6c, 0xa7, 0xcb, 0x07, - 0x23, 0x5b, 0xe7, 0x4e, 0xc5, 0x9e, 0xcf, 0x95, 0xbf, 0xe3, 0x0a, 0xcb, - 0x32, 0x7a, 0xfb, 0x75, 0xca, 0xb0, 0x0e, 0x37, 0xc8, 0x1e, 0x07, 0x97, - 0x0c, 0x26, 0x4f, 0x92, 0x42, 0xbb, 0xc3, 0x8e, 0x3b, 0x31, 0x64, 0x20, - 0x98, 0xd5, 0x95, 0xd6, 0xb9, 0xcf, 0x51, 0x55, 0xca, 0xf1, 0x2e, 0xa9, - 0x96, 0x2e, 0x09, 0x5a, 0x56, 0xe3, 0xbb, 0x45, 0xce, 0xbc, 0xa4, 0xe2, - 0xab, 0xf8, 0xd3, 0x70, 0x18, 0xe6, 0x8d, 0x0f, 0x42, 0x2e, 0xa6, 0x48, - 0xc3, 0x69, 0x83, 0xd3, 0x5f, 0xea, 0xd9, 0xf7, 0x48, 0x8d, 0x32, 0x41, - 0xf9, 0x5b, 0x39, 0xd5, 0x78, 0xde, 0x11, 0x2a, 0xc1, 0x27, 0x3d, 0x26, - 0x20, 0x17, 0xce, 0x0b, 0x16, 0x35, 0x92, 0x9c, 0xa6, 0x2b, 0xbe, 0xda, - 0xc5, 0x2d, 0xcd, 0x12, 0x61, 0x97, 0x73, 0x94, 0x43, 0x9b, 0x13, 0x8f, - 0xba, 0xe1, 0x8a, 0xed, 0x4d, 0x00, 0x97, 0xdc, 0x4f, 0x95, 0x08, 0x17, - 0x64, 0x2d, 0x36, 0x92, 0x0b, 0xba, 0xb0, 0xe2, 0xf5, 0xfd, 0x92, 0x81, - 0x64, 0xf2, 0x27, 0x99, 0xc3, 0x5d, 0xea, 0x7b, 0x99, 0x72, 0x96, 0x3d, - 0x57, 0x0d, 0x63, 0xe6, 0x79, 0x81, 0xee, 0x5d, 0x92, 0x80, 0x14, 0x36, - 0x99, 0x18, 0xd3, 0xbf, 0xc0, 0xa6, 0xfb, 0x45, 0x07, 0xe2, 0x26, 0x7b, - 0x84, 0x8e, 0xeb, 0xb9, 0x5e, 0x44, 0x19, 0xe6, 0x7a, 0xdf, 0xdb, 0x20, - 0xb5, 0xf4, 0xab, 0x74, 0x7e, 0xbe, 0x68, 0xcb, 0x76, 0x58, 0xfc, 0xd5, - 0x57, 0x38, 0x01, 0x38, 0x02, 0x8d, 0x7c, 0xf9, 0x31, 0xbd, 0x5c, 0x4c, - 0xc6, 0xca, 0x65, 0x2b, 0x92, 0x0d, 0x42, 0xaf, 0xba, 0xce, 0xe5, 0x36, - 0xee, 0x0b, 0xdd, 0xc6, 0x47, 0xfe, 0x6b, 0xf5, 0x95, 0x81, 0xd9, 0x06, - 0x87, 0x29, 0x44, 0x1d, 0xc7, 0xa9, 0x13, 0x44, 0xed, 0xc8, 0x78, 0x28, - 0x5a, 0xb1, 0x9b, 0xf0, 0x1f, 0xe9, 0xae, 0x6a, 0xa8, 0xcf, 0xb1, 0xde, - 0xdd, 0x59, 0x6f, 0x90, 0xed, 0x17, 0xe9, 0xeb, 0xc6, 0x95, 0x17, 0x7b, - 0x40, 0x0b, 0xd2, 0x1a, 0x86, 0xdd, 0x88, 0xb2, 0x46, 0x00, 0xaf, 0x28, - 0xdb, 0x27, 0xf1, 0x25, 0x91, 0x14, 0x83, 0xd1, 0xb0, 0x88, 0x1d, 0xb2, - 0xc6, 0x37, 0x03, 0x0c, 0x93, 0xb6, 0xa1, 0x55, 0x65, 0xa2, 0x28, 0x10, - 0x10, 0xa8, 0x4a, 0xca, 0x6c, 0xd7, 0x5a, 0xa5, 0xd4, 0x23, 0xa5, 0x74, - 0x63, 0xe3, 0xb8, 0x01, 0x6f, 0x02, 0xfb, 0xd1, 0x50, 0xae, 0x99, 0x0a, - 0x2a, 0x60, 0x9a, 0x50, 0x09, 0xf9, 0x97, 0xc1, 0x08, 0xff, 0x10, 0xf7, - 0xbb, 0x50, 0x91, 0xf7, 0x7f, 0x37, 0x4f, 0x0e, 0x2a, 0xb6, 0x16, 0x50, - 0x65, 0x2d, 0x46, 0x74, 0x96, 0xe5, 0x05, 0x35, 0x66, 0xf5, 0x20, 0xe1, - 0x02, 0x43, 0x26, 0x9b, 0x1b, 0xe1, 0x00, 0x48, 0x80, 0x45, 0x3d, 0xc0, - 0x3b, 0x10, 0x58, 0x4d, 0x26, 0x9f, 0xe9, 0x2b, 0xc9, 0x4c, 0xfc, 0xf1, - 0xde, 0x5d, 0x47, 0xa1, 0xf1, 0xb8, 0x1e, 0xcc, 0x31, 0xfa, 0x28, 0x97, - 0x23, 0x43, 0xee, 0x79, 0x13, 0x6f, 0x02, 0xc5, 0x65, 0x24, 0x6b, 0x33, - 0x57, 0x2e, 0xfc, 0x33, 0x4a, 0x48, 0xb8, 0xb6, 0x00, 0x5f, 0x53, 0xb9, - 0xa6, 0x9c, 0x37, 0x8e, 0x9e, 0xe1, 0xbf, 0x95, 0x4b, 0x2d, 0xd1, 0xc6, - 0xd4, 0xfd, 0x91, 0x66, 0xdc, 0xd9, 0x1a, 0x55, 0xec, 0xc9, 0xb2, 0x30, - 0x72, 0x08, 0xaa, 0xfe, 0xf2, 0x50, 0xd6, 0x6e, 0xff, 0x5e, 0xdb, 0x99, - 0x99, 0x86, 0x53, 0x40, 0x40, 0xf7, 0x6e, 0xb2, 0x8d, 0xb8, 0x33, 0xeb, - 0x47, 0x7f, 0x9e, 0xde, 0xe5, 0x45, 0x74, 0x39, 0xfd, 0x24, 0x29, 0x2c, - 0x0e, 0x9b, 0x0f, 0x36, 0xd8, 0xf3, 0xc4, 0x68, 0x91, 0xd7, 0xac, 0x15, - 0x06, 0xcf, 0x85, 0x89, 0x2e, 0x53, 0xce, 0x4f, 0x0d, 0x13, 0xd5, 0x57, - 0x07, 0x1f, 0x3a, 0xf4, 0xb7, 0xcf, 0x41, 0x98, 0xb6, 0x9e, 0x9a, 0x9d, - 0x77, 0x57, 0x0b, 0x9f, 0x73, 0x2c, 0x63, 0xb8, 0x34, 0xf7, 0x27, 0xe3, - 0xaf, 0x2f, 0x10, 0xb8, 0x07, 0x29, 0x76, 0x98, 0x24, 0xd3, 0xc7, 0x43, - 0x9b, 0x65, 0xec, 0xb2, 0x04, 0x5c, 0x24, 0xdf, 0x77, 0xed, 0xe4, 0x7f, - 0x22, 0xed, 0x5c, 0x49, 0xfc, 0xda, 0x15, 0x24, 0x2f, 0xbf, 0x03, 0x62, - 0x8a, 0x80, 0xb7, 0x22, 0x64, 0x67, 0x3b, 0xb1, 0x6d, 0xd8, 0x43, 0xd7, - 0xe2, 0x61, 0xf8, 0x24, 0xd8, 0xef, 0x98, 0x22, 0x50, 0x62, 0xec, 0x84, - 0x79, 0xf7, 0xbd, 0xd6, 0x43, 0xd9, 0xe8, 0x3c, 0x11, 0x8d, 0x10, 0xd1, - 0x88, 0xb2, 0x53, 0x38, 0xa9, 0x11, 0x2a, 0xde, 0x13, 0x2c, 0x48, 0xe2, - 0x3c, 0xc2, 0x32, 0x71, 0xc7, 0x0c, 0x55, 0xf6, 0xd8, 0x00, 0x0f, 0xd8, - 0xae, 0x37, 0x21, 0x37, 0xc8, 0x05, 0x08, 0x0a, 0xee, 0xbd, 0x36, 0xb8, - 0x45, 0xc0, 0xff, 0xed, 0x6e, 0xa2, 0x43, 0x4c, 0x2c, 0x4f, 0xde, 0xc5, - 0xa5, 0x47, 0x28, 0xbe, 0xc0, 0xab, 0x89, 0xc2, 0xd4, 0xdc, 0x4b, 0xee, - 0x64, 0x69, 0xda, 0x3e, 0x84, 0x1a, 0xeb, 0x4b, 0x13, 0xf2, 0x1c, 0xe2, - 0x52, 0x17, 0xa2, 0xc4, 0x53, 0x4c, 0x79, 0x8a, 0x7a, 0x63, 0x45, 0xf2, - 0xc1, 0xe2, 0x88, 0x10, 0x18, 0x53, 0x52, 0x8e, 0x26, 0x02, 0x09, 0x5e, - 0x2c, 0x73, 0x05, 0x90, 0x57, 0x31, 0x7d, 0xef, 0x97, 0x20, 0xcc, 0x39, - 0x53, 0x7a, 0xab, 0xd4, 0xd7, 0xee, 0x28, 0x8f, 0xa7, 0x8e, 0xda, 0x03, - 0xc8, 0xac, 0x3d, 0x0f, 0x94, 0x34, 0xd9, 0xee, 0x6b, 0xa0, 0x5a, 0x55, - 0x4f, 0x1d, 0x4c, 0x9a, 0xaf, 0x5b, 0x9e, 0x23, 0xf2, 0x78, 0x5b, 0xfc, - 0x58, 0xbd, 0x75, 0xcd, 0x14, 0x0d, 0xfe, 0x58, 0x5c, 0x2f, 0x7e, 0xc7, - 0x8d, 0x46, 0x98, 0xc9, 0x19, 0x9a, 0x7e, 0x0c, 0xba, 0x8d, 0x94, 0x68, - 0x73, 0xe4, 0xca, 0x80, 0xcc, 0xc4, 0x58, 0x59, 0xc6, 0x9a, 0xfe, 0xc8, - 0xb0, 0x10, 0x3b, 0x99, 0xca, 0xdc, 0xb5, 0xc1, 0x64, 0x4c, 0x33, 0xea, - 0x5c, 0xc4, 0x19, 0x17, 0xba, 0x24, 0x0a, 0x73, 0x67, 0x24, 0xad, 0x76, - 0x3c, 0xbf, 0xd4, 0xff, 0xbc, 0x3c, 0x54, 0xfb, 0xfb, 0xe4, 0x4b, 0x7b, - 0xca, 0x50, 0x9a, 0x2c, 0x65, 0x9a, 0x2c, 0x92, 0x00, 0x26, 0x1d, 0xec, - 0x91, 0xd5, 0xa8, 0xa7, 0xc2, 0xec, 0x2b, 0x43, 0x4f, 0x7e, 0xf4, 0x21, - 0x8b, 0x6f, 0xa3, 0x79, 0x22, 0xf3, 0x2b, 0xf1, 0xc7, 0x1e, 0xb7, 0xc8, - 0x0d, 0x28, 0x82, 0xc6, 0x06, 0x64, 0xdc, 0x05, 0xb8, 0xa2, 0x7c, 0x41, - 0x5f, 0xa4, 0xc1, 0x44, 0x89, 0xc7, 0x15, 0x47, 0x33, 0x5c, 0xd6, 0x54, - 0x16, 0x04, 0x8c, 0x65, 0x4b, 0x81, 0x27, 0x5c, 0x26, 0xd0, 0x6f, 0xad, - 0xba, 0x2a, 0xdd, 0x84, 0x78, 0x2c, 0x88, 0x32, 0xaa, 0xb9, 0x09, 0x48, - 0xcf, 0x55, 0x2b, 0x10, 0xfe, 0x1a, 0x46, 0xb2, 0xcd, 0x3f, 0xe1, 0x9b, - 0xfb, 0x9e, 0x24, 0xa1, 0xf5, 0x3e, 0xac, 0x75, 0xfe, 0x23, 0xc1, 0x25, - 0xc9, 0x09, 0x6c, 0x28, 0xe9, 0xc7, 0xde, 0xc7, 0xaa, 0x4b, 0xe9, 0xc8, - 0xdc, 0x18, 0x50, 0x11, 0x6b, 0x41, 0xa0, 0xe2, 0xa5, 0xb6, 0xce, 0x5e, - 0x40, 0x1f, 0x43, 0x33, 0xd0, 0x7a, 0xe3, 0x79, 0x25, 0xf9, 0x4f, 0x18, - 0x34, 0x82, 0x77, 0x8b, 0x39, 0x41, 0x35, 0xed, 0xef, 0x31, 0x67, 0x5b, - 0xfb, 0xa7, 0x3f, 0x31, 0x96, 0x25, 0x89, 0xa5, 0xaf, 0x24, 0x41, 0x8c, - 0x21, 0x94, 0x43, 0x55, 0x62, 0x6f, 0x44, 0x75, 0x7f, 0x27, 0x85, 0xf9, - 0x09, 0x80, 0x59, 0x1b, 0xb5, 0x1e, 0x9f, 0xd6, 0x91, 0x72, 0x00, 0x2a, - 0x83, 0x89, 0xc3, 0xf9, 0x4e, 0x7c, 0xa1, 0x02, 0xa6, 0x25, 0xe4, 0xcc, - 0x8c, 0xa4, 0x51, 0x17, 0xa5, 0x0c, 0x1f, 0x70, 0x29, 0x86, 0x79, 0x09, - 0x91, 0x4d, 0x50, 0xe7, 0x0c, 0x45, 0x2c, 0x2c, 0xa8, 0xaa, 0x53, 0xe7, - 0xd9, 0xb2, 0xc0, 0xf3, 0x15, 0xbd, 0x32, 0xd7, 0x55, 0xb1, 0x5d, 0x10, - 0x9c, 0xb3, 0x8f, 0x90, 0x66, 0x77, 0x43, 0x02, 0x9e, 0xd0, 0xb6, 0x32, - 0xf6, 0x3a, 0x13, 0x6c, 0x49, 0x23, 0xfb, 0x1a, 0x64, 0x46, 0xf4, 0x3a, - 0xfa, 0x11, 0x3c, 0x56, 0xa5, 0x54, 0x6b, 0x19, 0xb8, 0x9f, 0x0d, 0xba, - 0x25, 0xfb, 0x61, 0xcb, 0x87, 0x4c, 0xb3, 0x1f, 0xbd, 0x46, 0xc6, 0x8e, - 0xa2, 0xb8, 0x05, 0xf6, 0x49, 0x7f, 0x28, 0x66, 0x88, 0xb2, 0xef, 0xc1, - 0x42, 0xb5, 0x44, 0x19, 0x3f, 0x52, 0x5a, 0xdb, 0x3d, 0x04, 0xd1, 0x10, - 0x24, 0x86, 0xec, 0xfa, 0x34, 0x24, 0xbc, 0xff, 0x35, 0x09, 0x8e, 0x72, - 0x15, 0x22, 0x2c, 0x5e, 0x8f, 0x7d, 0xb7, 0x09, 0xa1, 0x9a, 0x0d, 0x50, - 0x55, 0x77, 0xce, 0xf7, 0x62, 0xed, 0x55, 0xbe, 0xcd, 0xcc, 0xa7, 0x32, - 0xea, 0x32, 0x8b, 0x3b, 0x6f, 0x16, 0xc0, 0x6a, 0xa3, 0x1b, 0xfa, 0x5d, - 0x94, 0xb3, 0xcf, 0xa6, 0x5b, 0x2d, 0x55, 0x69, 0xb8, 0x8e, 0x0a, 0x73, - 0x47, 0x6e, 0xb3, 0xa8, 0xf3, 0xdf, 0xed, 0x52, 0x6a, 0x4f, 0xc1, 0xd1, - 0xe1, 0x4c, 0xf4, 0xb9, 0x9b, 0xf5, 0x94, 0x06, 0x16, 0x1d, 0x63, 0xee, - 0x47, 0xb9, 0x44, 0xe2, 0xff, 0x89, 0x82, 0x67, 0x14, 0x9a, 0x37, 0x3f, - 0x0d, 0x0a, 0xf6, 0xe9, 0x03, 0xb6, 0xe5, 0x6f, 0x16, 0x1f, 0x58, 0x7a, - 0x94, 0x9e, 0xbc, 0xe0, 0xd0, 0x11, 0x8e, 0x90, 0xef, 0x25, 0x73, 0x2c, - 0x74, 0xb8, 0x1f, 0xcd, 0x5a, 0x35, 0x59, 0x74, 0x8c, 0xdd, 0x80, 0x77, - 0x84, 0x2d, 0x7b, 0xa2, 0xf9, 0x06, 0x73, 0x9e, 0x4e, 0x47, 0xa0, 0xd8, - 0x46, 0x14, 0x98, 0x84, 0x52, 0xe7, 0xa0, 0xb9, 0x76, 0x57, 0x48, 0x00, - 0x36, 0x95, 0xc5, 0x17, 0x3e, 0xb1, 0x9d, 0x96, 0xcd, 0xd0, 0x8e, 0x34, - 0x09, 0x1c, 0x98, 0x8d, 0x2b, 0xba, 0x02, 0x8c, 0x51, 0xe8, 0x53, 0x9a, - 0x64, 0x05, 0xa6, 0x08, 0x9a, 0xb4, 0xd5, 0x85, 0x26, 0x95, 0x1a, 0xcf, - 0x09, 0xb4, 0xe2, 0x16, 0xdc, 0x75, 0xe6, 0xa0, 0x08, 0xf3, 0xa9, 0xcb, - 0x0a, 0x35, 0xb2, 0x4f, 0xd9, 0xa3, 0xd9, 0x38, 0x80, 0xe4, 0xba, 0xf9, - 0xe2, 0xdd, 0x20, 0xc3, 0xb3, 0x4b, 0x77, 0xda, 0x5d, 0xd2, 0xe6, 0xb4, - 0x77, 0x1b, 0xb2, 0x60, 0x91, 0x91, 0x69, 0x55, 0xe7, 0x97, 0xd2, 0x78, - 0xde, 0xbd, 0xf1, 0xf8, 0x05, 0xb3, 0xe7, 0x25, 0x4a, 0x8b, 0xe9, 0x92, - 0x4d, 0xeb, 0x81, 0x73, 0x0e, 0xc2, 0xbb, 0x68, 0x7d, 0x5b, 0xb2, 0x9d, - 0xfd, 0x83, 0xb4, 0x29, 0x9f, 0xa4, 0x3a, 0x14, 0x20, 0x0f, 0x40, 0x54, - 0xd7, 0xa7, 0x55, 0xd2, 0xd8, 0x29, 0x5e, 0x05, 0x4d, 0x0c, 0x3d, 0xb0, - 0xe0, 0xcf, 0x24, 0xbf, 0x18, 0xae, 0x4f, 0x57, 0x51, 0xc7, 0x68, 0x4f, - 0xae, 0x28, 0xb5, 0xdf, 0x29, 0xb5, 0x5c, 0x18, 0x39, 0x76, 0x42, 0x61, - 0xf1, 0x6e, 0x3b, 0xcf, 0x23, 0xa3, 0x19, 0xc7, 0x45, 0x8a, 0x81, 0xbb, - 0x92, 0x9a, 0x6c, 0xe2, 0xc6, 0x55, 0x87, 0x2d, 0x1d, 0xa1, 0x90, 0x8f, - 0x43, 0x9f, 0x9d, 0xab, 0x50, 0x22, 0x54, 0x45, 0x00, 0x66, 0x33, 0x20, - 0x45, 0xfa, 0x9c, 0xb2, 0x07, 0x40, 0xd1, 0x95, 0x10, 0xb6, 0x19, 0xb4, - 0x7f, 0xcd, 0x7e, 0x15, 0xd4, 0x58, 0x4a, 0x23, 0x57, 0xa9, 0x30, 0x9a, - 0x81, 0x65, 0xe4, 0x18, 0x72, 0xae, 0xef, 0x03, 0x8b, 0x4c, 0x8a, 0x1b, - 0x6e, 0x8f, 0xaf, 0xd6, 0x40, 0x9b, 0x0d, 0xff, 0xf8, 0x8e, 0x3b, 0x19, - 0x28, 0xf0, 0x99, 0xc0, 0xb9, 0x6d, 0x9b, 0x08, 0xb0, 0x95, 0x8f, 0xd6, - 0xb4, 0xfd, 0xa9, 0xe4, 0xfc, 0x2f, 0x8c, 0x67, 0x6c, 0xbf, 0xac, 0x88, - 0xdb, 0xc6, 0xfb, 0xb9, 0x9a, 0x8b, 0xe9, 0x21, 0x5b, 0x5e, 0xb7, 0x16, - 0x97, 0xf4, 0x41, 0x82, 0xaa, 0x6a, 0xff, 0x36, 0x38, 0x6b, 0xee, 0x93, - 0xa3, 0x00, 0xd6, 0xed, 0x60, 0x76, 0xa5, 0x9b, 0x1b, 0xc4, 0x1b, 0xd5, - 0xa9, 0xe7, 0xae, 0xff, 0x55, 0x2e, 0xe4, 0xf7, 0xf6, 0xe4, 0x2b, 0xb8, - 0x90, 0xf3, 0x3d, 0xac, 0x48, 0x45, 0xc7, 0x9e, 0x65, 0x78, 0x30, 0x58, - 0xcc, 0xcd, 0x23, 0x55, 0xfe, 0xb5, 0x4e, 0xd7, 0x98, 0x75, 0x0b, 0xbf, - 0x2a, 0x36, 0x18, 0x1a, 0x6c, 0xf3, 0x17, 0xb4, 0x86, 0xdc, 0x65, 0x62, - 0x04, 0x45, 0x1c, 0xe5, 0x03, 0x6f, 0x9f, 0x88, 0x8c, 0xea, 0x18, 0x58, - 0x42, 0x8a, 0xe4, 0x92, 0x16, 0x9b, 0x44, 0x84, 0x7a, 0x37, 0x48, 0x0e, - 0x0c, 0x0f, 0x9e, 0x82, 0xf0, 0x3d, 0xe2, 0x5d, 0x3c, 0x17, 0xf8, 0x53, - 0xa6, 0x2c, 0xf1, 0xe1, 0x67, 0x37, 0xba, 0xef, 0x2b, 0xbb, 0xbd, 0x92, - 0xe6, 0x6a, 0x06, 0x89, 0x38, 0xda, 0x2b, 0xb0, 0x91, 0xea, 0xc0, 0xc5, - 0x99, 0x1f, 0x2c, 0x02, 0x34, 0x92, 0xbe, 0x4b, 0x75, 0xe0, 0x83, 0x54, - 0x97, 0x25, 0xaa, 0x7e, 0xf2, 0xcb, 0x31, 0xef, 0xe1, 0xb4, 0xc2, 0xc0, - 0xfb, 0xe5, 0x9c, 0xc8, 0xd1, 0x5c, 0x51, 0xd3, 0x60, 0xc8, 0x67, 0xc6, - 0xa0, 0x7d, 0x93, 0x08, 0x30, 0x72, 0x7e, 0x1e, 0xce, 0x7f, 0x07, 0x91, - 0xbb, 0x0e, 0x64, 0x54, 0xfe, 0xe2, 0x93, 0xa7, 0xcb, 0xa4, 0x21, 0xf4, - 0x45, 0x7b, 0x75, 0x37, 0x52, 0x71, 0xc9, 0xce, 0x01, 0xf1, 0xfa, 0x74, - 0x86, 0x04, 0xa6, 0x25, 0xba, 0xa8, 0x8e, 0x14, 0xec, 0x06, 0xef, 0x9e, - 0xb9, 0xd5, 0x97, 0x6c, 0x73, 0x19, 0x9e, 0x57, 0xfa, 0x49, 0x6a, 0x4b, - 0xfc, 0x7b, 0xbc, 0x14, 0x07, 0xce, 0x06, 0x12, 0x8b, 0x91, 0x54, 0xd3, - 0x9d, 0x53, 0x47, 0xdb, 0x5b, 0x21, 0xe9, 0xf9, 0xd7, 0x81, 0x51, 0xf5, - 0xb6, 0x9b, 0x46, 0xc0, 0xde, 0x44, 0x66, 0x85, 0x8a, 0xaa, 0xad, 0xe6, - 0xeb, 0xd9, 0x8f, 0x46, 0x09, 0x6a, 0x4f, 0xe3, 0x8c, 0x04, 0x27, 0x80, - 0xc3, 0xa7, 0xfb, 0x10, 0xd4, 0x69, 0xb5, 0x60, 0x9c, 0xd0, 0x2a, 0x51, - 0x4d, 0xc2, 0x46, 0x81, 0x40, 0x48, 0x29, 0x3e, 0xf0, 0x46, 0xeb, 0x6f, - 0x33, 0x2f, 0x87, 0x39, 0x43, 0x27, 0x9a, 0x0f, 0x40, 0x0a, 0x3b, 0xde, - 0xac, 0xdf, 0x28, 0x5f, 0x8a, 0xbb, 0x68, 0x2a, 0x17, 0xb3, 0xce, 0x26, - 0xe3, 0xe6, 0x8d, 0x00, 0x7c, 0x8f, 0x2c, 0xfe, 0x46, 0x46, 0x2b, 0xdf, - 0xcc, 0x78, 0xae, 0x2c, 0xe7, 0x8f, 0xfd, 0x08, 0xc2, 0x3e, 0xbf, 0xd4, - 0x73, 0xda, 0x56, 0xa6, 0xbf, 0x47, 0x43, 0xa5, 0x43, 0xa4, 0xaa, 0x2c, - 0x99, 0x67, 0x13, 0x7b, 0x8b, 0xe4, 0xdd, 0xdd, 0x75, 0x14, 0x5f, 0x23, - 0xe1, 0xf9, 0x01, 0x81, 0x98, 0x96, 0xff, 0x96, 0xbb, 0x49, 0x8a, 0x34, - 0x9a, 0xa1, 0x69, 0xb1, 0x5a, 0x03, 0x1e, 0x28, 0x88, 0x06, 0x82, 0xe8, - 0x16, 0x62, 0x46, 0xe1, 0x36, 0xa1, 0x4b, 0xc1, 0x85, 0xf4, 0x3f, 0xab, - 0x82, 0xda, 0xe1, 0x68, 0xc5, 0x99, 0xf2, 0xfe, 0xc1, 0xee, 0xc0, 0xa8, - 0x00, 0x58, 0x23, 0x3e, 0x0a, 0x15, 0x18, 0x88, 0x5d, 0xd7, 0x70, 0x8e, - 0x74, 0x12, 0x17, 0x96, 0x6d, 0x17, 0xea, 0x42, 0x08, 0x31, 0xb6, 0x4e, - 0x19, 0xda, 0x9d, 0xb5, 0xa6, 0xb4, 0x63, 0xa7, 0xed, 0xb0, 0xca, 0xe9, - 0x95, 0x90, 0x63, 0x12, 0xd1, 0x85, 0xdd, 0x0c, 0x2e, 0xae, 0x93, 0x13, - 0x74, 0x80, 0xe3, 0x7a, 0x90, 0x73, 0xfb, 0xb7, 0xcc, 0x60, 0xfb, 0x53, - 0x95, 0x01, 0xf6, 0xd6, 0x5d, 0x44, 0xbe, 0x09, 0xc3, 0x85, 0x36, 0x72, - 0x53, 0xdc, 0x1c, 0x32, 0xf1, 0x2f, 0xe0, 0x40, 0xc6, 0x9a, 0x5b, 0x7b, - 0x7c, 0x8d, 0xd3, 0x4a, 0x3a, 0x92, 0xc4, 0x70, 0x9a, 0x2c, 0x24, 0xe7, - 0xbd, 0xa4, 0x2f, 0xad, 0xc4, 0x0a, 0xcf, 0x4f, 0xe4, 0xda, 0x2c, 0xb8, - 0x30, 0xd3, 0x31, 0x50, 0x4b, 0xbd, 0x86, 0x3f, 0x12, 0x0a, 0x34, 0x20, - 0x12, 0xf2, 0x83, 0x15, 0xea, 0xad, 0x08, 0xaf, 0x4c, 0x14, 0x55, 0x21, - 0x08, 0x1d, 0x7e, 0x73, 0x4f, 0x82, 0xd3, 0x79, 0x8c, 0x22, 0x0b, 0x37, - 0x34, 0xfc, 0x43, 0x76, 0x8b, 0xf7, 0x08, 0x88, 0x0c, 0xa2, 0x5f, 0x5d, - 0x52, 0x2e, 0xac, 0x6f, 0x88, 0xe3, 0xfc, 0xfd, 0x56, 0x47, 0x7c, 0x0f, - 0xdb, 0x13, 0x8e, 0x56, 0x5e, 0xe5, 0xd1, 0xb8, 0x56, 0x55, 0x97, 0x40, - 0x52, 0x4e, 0x7d, 0x79, 0x99, 0x9a, 0x0c, 0x4b, 0x56, 0xb4, 0x20, 0x13, - 0xca, 0xac, 0xa0, 0x5e, 0xa1, 0x16, 0xd2, 0x29, 0xe2, 0x4d, 0xe2, 0xff, - 0x5f, 0x63, 0xd9, 0x3c, 0x28, 0xb4, 0x7f, 0x37, 0xd8, 0x8f, 0xb9, 0x8a, - 0xf7, 0x2d, 0xd0, 0xb7, 0xc5, 0x08, 0xbc, 0x86, 0x06, 0x0c, 0xde, 0xca, - 0x96, 0x60, 0xa6, 0xf9, 0x53, 0xac, 0x30, 0xca, 0x6e, 0x02, 0x65, 0x32, - 0xf8, 0xfa, 0xd3, 0x88, 0xc5, 0x33, 0x9b, 0x86, 0x5f, 0xdb, 0x0d, 0x47, - 0xf2, 0x1a, 0x5c, 0x2b, 0xcf, 0x9c, 0x12, 0xe0, 0x8b, 0xaa, 0x97, 0x6b, - 0xbd, 0x2b, 0x93, 0xf5, 0x82, 0xab, 0x85, 0xd2, 0xa6, 0x18, 0x64, 0x7c, - 0xf7, 0x03, 0xca, 0x32, 0xec, 0xbb, 0xee, 0x13, 0xda, 0x0e, 0x11, 0x66, - 0x07, 0x4e, 0x31, 0x14, 0xca, 0x1e, 0x8f, 0x24, 0xe4, 0x20, 0xc8, 0x62, - 0x16, 0xfb, 0x8e, 0x99, 0xbf, 0x16, 0xaa, 0x4f, 0xe3, 0xde, 0xce, 0xae, - 0x8b, 0xc9, 0x1c, 0xcd, 0x4d, 0x64, 0x4c, 0xe2, 0x22, 0x02, 0x83, 0x5a, - 0x0a, 0xef, 0x93, 0xb8, 0xa1, 0x47, 0x0d, 0xd7, 0xc0, 0xe3, 0xe2, 0x34, - 0xf7, 0xc9, 0xaf, 0xa7, 0xec, 0x5a, 0x14, 0x8e, 0x53, 0xe0, 0x96, 0x9e, - 0xd3, 0xb5, 0x9b, 0xd9, 0x6a, 0x4d, 0xc0, 0x59, 0xc8, 0xef, 0xcb, 0xf6, - 0x19, 0x1d, 0x28, 0x5d, 0xa4, 0xe1, 0xba, 0xe4, 0xde, 0xca, 0xfb, 0x82, - 0xd6, 0x1a, 0x81, 0x70, 0xa8, 0xd8, 0xb6, 0x09, 0x01, 0x0d, 0xdd, 0xb0, - 0xa3, 0xf9, 0xda, 0x35, 0x02, 0x9e, 0xe5, 0xcf, 0xad, 0x30, 0x41, 0xbd, - 0xc6, 0xe3, 0x59, 0xfb, 0xf2, 0xaa, 0x77, 0x36, 0x9d, 0x01, 0x01, 0x01, - 0xb4, 0xa2, 0xb2, 0x98, 0x79, 0x5a, 0x33, 0x33, 0xf9, 0xe7, 0x5d, 0x10, - 0x7b, 0x42, 0x38, 0xfd, 0x9e, 0x22, 0x0a, 0xe1, 0xfd, 0x4e, 0xb4, 0x97, - 0xe9, 0xea, 0x11, 0x4c, 0x61, 0xcb, 0x46, 0x1d, 0xa9, 0xed, 0xe2, 0x8e, - 0xa6, 0x48, 0x27, 0xe1, 0x59, 0xb8, 0x0b, 0xc1, 0xb8, 0x6a, 0x55, 0x83, - 0x96, 0x5d, 0x3a, 0x27, 0xd7, 0xe3, 0xcb, 0x72, 0xc8, 0xb8, 0x30, 0x3b, - 0x79, 0x7b, 0x89, 0x06, 0xe5, 0x67, 0xc4, 0xc6, 0x04, 0xc7, 0x60, 0xa5, - 0x0f, 0xb6, 0xd5, 0x4f, 0xcf, 0xbe, 0xeb, 0x1a, 0xfd, 0xee, 0x9a, 0x9a, - 0xe1, 0x98, 0x96, 0x50, 0x4f, 0xaa, 0x79, 0xf5, 0xed, 0x1a, 0x99, 0xf4, - 0xb9, 0x74, 0x10, 0x0c, 0x43, 0xb1, 0xdd, 0x66, 0xd4, 0x39, 0x8b, 0x28, - 0xe1, 0x69, 0x64, 0xba, 0xda, 0x14, 0x2e, 0x99, 0x81, 0x7f, 0xdd, 0x30, - 0xeb, 0xb1, 0x41, 0x6b, 0x89, 0x94, 0x42, 0x12, 0x31, 0x59, 0xbd, 0xdd, - 0x23, 0x06, 0xd5, 0xf9, 0x09, 0xa8, 0xf1, 0x2e, 0xfb, 0xdb, 0xe2, 0xae, - 0x58, 0x1a, 0x10, 0x0b, 0x85, 0x5d, 0x88, 0xb0, 0x4e, 0xce, 0x51, 0x70, - 0x68, 0x6f, 0xfc, 0x36, 0xd4, 0x90, 0xc0, 0x6e, 0x5e, 0xdd, 0x15, 0xf7, - 0xed, 0xc5, 0xd8, 0xa3, 0xf7, 0x9e, 0x34, 0x77, 0x09, 0x20, 0x71, 0x83, - 0xaa, 0x7d, 0x95, 0xcb, 0x43, 0x75, 0x64, 0x2e, 0x73, 0xb9, 0x33, 0x36, - 0x03, 0xdd, 0xdf, 0xe9, 0x85, 0x96, 0x58, 0xa3, 0x33, 0x95, 0x70, 0x16, - 0x69, 0xbf, 0x52, 0xbb, 0xb3, 0x3a, 0x84, 0xce, 0xc7, 0x06, 0x6c, 0xc9, - 0xce, 0x7b, 0xfa, 0xcb, 0x82, 0xfc, 0xb6, 0xe2, 0x6e, 0x49, 0x26, 0x54, - 0xb6, 0xab, 0xc4, 0x32, 0xb7, 0xc8, 0x6b, 0x39, 0x7f, 0x69, 0x2b, 0xde, - 0x60, 0xd5, 0x4d, 0x41, 0xeb, 0x45, 0x92, 0xd6, 0x6f, 0x2b, 0x2d, 0xcf, - 0x67, 0x15, 0x0b, 0x05, 0x44, 0x70, 0xc2, 0xb2, 0xc2, 0xdc, 0xb5, 0xeb, - 0x71, 0xc6, 0xf6, 0x31, 0x72, 0x63, 0xf9, 0x50, 0xa1, 0x7e, 0x33, 0xf0, - 0x0b, 0x8d, 0x5d, 0x42, 0x1a, 0x4a, 0x43, 0x8d, 0xbe, 0xaa, 0x79, 0x7c, - 0x97, 0x56, 0xf3, 0x42, 0x41, 0xd8, 0x12, 0xc5, 0xdf, 0x6d, 0x21, 0x78, - 0x17, 0xfb, 0x60, 0xf0, 0x0a, 0x14, 0x1d, 0x14, 0x42, 0xd9, 0x94, 0xbd, - 0x5c, 0x6a, 0x8a, 0xaa, 0x76, 0x41, 0x1a, 0xc9, 0x90, 0x49, 0x62, 0x3c, - 0x3f, 0xba, 0x3b, 0x91, 0x5a, 0xc9, 0x38, 0x2c, 0xc8, 0x5b, 0x6d, 0x47, - 0x01, 0x0c, 0x12, 0xa5, 0x3c, 0x55, 0x9b, 0x6b, 0x0e, 0xb1, 0x2f, 0x83, - 0x84, 0x75, 0xcc, 0x32, 0xd4, 0x50, 0x6f, 0xa5, 0x66, 0x6b, 0x2a, 0x31, - 0x07, 0xef, 0x25, 0x1a, 0xec, 0x98, 0xb8, 0xb4, 0xfd, 0x34, 0x6e, 0x19, - 0xf0, 0x4e, 0x9b, 0x6d, 0x6e, 0x24, 0x56, 0x0d, 0xf9, 0x3f, 0x54, 0x8a, - 0xad, 0x3c, 0xdc, 0x53, 0xc1, 0xc8, 0x39, 0xa0, 0x56, 0x65, 0x16, 0xa4, - 0xdf, 0x78, 0x60, 0x02, 0x9b, 0xef, 0xe7, 0x75, 0xbe, 0x14, 0x7a, 0x86, - 0xc5, 0xe5, 0x58, 0x01, 0x3d, 0x29, 0xfb, 0x13, 0xab, 0x05, 0xea, 0x34, - 0xb8, 0xa8, 0x01, 0x67, 0xb0, 0x9a, 0x17, 0xcc, 0x05, 0xa8, 0xbd, 0x58, - 0xb3, 0x9d, 0x8a, 0xbd, 0xc3, 0x38, 0xab, 0xf1, 0xec, 0xf1, 0xf7, 0xe9, - 0xfd, 0xf5, 0x91, 0x21, 0x09, 0xdc, 0x4b, 0x16, 0x97, 0x4b, 0x8f, 0xd3, - 0x4d, 0x31, 0x83, 0x61, 0x3f, 0x78, 0xf0, 0xc7, 0x25, 0xf7, 0xa3, 0xeb, - 0xa0, 0x80, 0x87, 0x53, 0x2f, 0x18, 0x90, 0x51, 0x29, 0xd3, 0xed, 0xa3, - 0x9a, 0x15, 0x9b, 0x55, 0x1a, 0x71, 0xbd, 0x52, 0xd3, 0x50, 0x3d, 0x9f, - 0x49, 0x42, 0xf6, 0xbd, 0xc6, 0x6f, 0xe7, 0x23, 0xb9, 0x17, 0xae, 0xfe, - 0xba, 0xfe, 0x30, 0x96, 0x67, 0x2c, 0xef, 0xfa, 0x78, 0x84, 0x10, 0xbc, - 0x89, 0x5f, 0xb7, 0x60, 0xad, 0xa6, 0xee, 0xc0, 0x8b, 0xb2, 0x13, 0xe0, - 0xfb, 0x6a, 0x79, 0x9a, 0xd3, 0x19, 0xaf, 0x0d, 0x7f, 0x3e, 0xb3, 0xf7, - 0xc7, 0xc3, 0xe9, 0x98, 0xc8, 0x43, 0x27, 0xff, 0xa5, 0x05, 0x32, 0x86, - 0x5a, 0xf8, 0x8e, 0xda, 0x01, 0x15, 0x3b, 0x93, 0x35, 0x03, 0xfa, 0x8d, - 0x74, 0x14, 0xc8, 0x69, 0xec, 0xf6, 0xc4, 0x06, 0x72, 0xa4, 0xee, 0x98, - 0x85, 0x9b, 0x1e, 0x74, 0x15, 0xb8, 0xa9, 0xf7, 0xee, 0xb1, 0xc6, 0xcb, - 0x10, 0x8c, 0xf5, 0x28, 0xa7, 0x07, 0x36, 0x4c, 0xf1, 0x71, 0x6b, 0x96, - 0x05, 0x8e, 0x29, 0xd4, 0x78, 0x6e, 0xc5, 0xa2, 0x1e, 0x16, 0xc8, 0x1a, - 0x9a, 0xa4, 0xf4, 0x1f, 0x8f, 0xec, 0x26, 0x04, 0x64, 0x7e, 0xc2, 0xf7, - 0xe0, 0xb4, 0xc6, 0xa8, 0xd3, 0xab, 0x30, 0x00, 0x85, 0xb7, 0x43, 0xff, - 0x0e, 0x90, 0x25, 0x3f, 0xf7, 0x68, 0xda, 0xa3, 0x48, 0xdf, 0x24, 0xae, - 0x38, 0xa3, 0x72, 0x59, 0x1d, 0xda, 0xaf, 0xc9, 0x2a, 0x9a, 0x42, 0x71, - 0xfb, 0x11, 0xa6, 0x0d, 0x0e, 0xb5, 0x4b, 0x0d, 0x1f, 0x79, 0x92, 0x1f, - 0x2d, 0x54, 0x89, 0xba, 0xdd, 0x3c, 0x61, 0x07, 0x66, 0x53, 0x6e, 0x32, - 0x9d, 0xbd, 0x2d, 0x56, 0xee, 0x17, 0x8a, 0x0e, 0xe5, 0xd2, 0xa2, 0x45, - 0xa1, 0xb2, 0x7c, 0xb9, 0x4e, 0x00, 0xb3, 0xe1, 0x28, 0x72, 0x7c, 0xfd, - 0xdf, 0x9f, 0x2c, 0x6b, 0xcb, 0xe3, 0x89, 0xfa, 0x27, 0xf6, 0x97, 0x19, - 0x27, 0x22, 0x34, 0xb1, 0x55, 0xdb, 0xc7, 0x5e, 0xbe, 0x83, 0x84, 0x3d, - 0xc7, 0xa1, 0x69, 0x1d, 0x62, 0xf6, 0xf7, 0x7f, 0xf0, 0x7e, 0xf4, 0x2b, - 0xed, 0x74, 0x06, 0x27, 0x4b, 0xf6, 0xad, 0xca, 0x81, 0xa0, 0xb5, 0xc7, - 0x38, 0x94, 0xe0, 0x86, 0xbe, 0x5d, 0x9f, 0x6b, 0x29, 0x9c, 0xfa, 0x1b, - 0xb6, 0xeb, 0xa9, 0x8c, 0xa7, 0xf3, 0xa8, 0x5e, 0xf6, 0x6e, 0x05, 0x4c, - 0x71, 0xcc, 0xc0, 0x75, 0x35, 0x00, 0x3f, 0xc1, 0x0f, 0xf5, 0x37, 0xa3, - 0xe6, 0x1a, 0xe1, 0x14, 0x6e, 0x70, 0xa3, 0x7a, 0x69, 0xb0, 0x1a, 0x50, - 0xe0, 0x90, 0x27, 0x60, 0x82, 0x99, 0x8a, 0xaa, 0xbd, 0x25, 0x3f, 0x33, - 0x3a, 0xa0, 0x68, 0x1b, 0xe8, 0xd3, 0xd3, 0x91, 0x14, 0xdb, 0xae, 0xb8, - 0x95, 0xa1, 0x14, 0x09, 0xa9, 0x47, 0x37, 0x3c, 0xb3, 0x6d, 0x00, 0xe4, - 0xbf, 0x83, 0x47, 0x37, 0x61, 0xc4, 0xa3, 0x5f, 0xf4, 0x44, 0xb2, 0xf5, - 0x16, 0xf7, 0x1b, 0xbd, 0xf3, 0xff, 0x34, 0x6d, 0xae, 0xdc, 0xe8, 0xb9, - 0x15, 0x0c, 0x7b, 0xda, 0xf9, 0xd2, 0xf6, 0x6c, 0x91, 0xbd, 0x1f, 0x00, - 0x42, 0xd4, 0x22, 0xef, 0x45, 0x2f, 0x8b, 0xc8, 0xd8, 0xa9, 0xfa, 0x71, - 0xe1, 0x32, 0x80, 0xf9, 0xbf, 0x1b, 0xc6, 0xae, 0x31, 0x42, 0xb1, 0x5c, - 0xce, 0xbc, 0xd6, 0x03, 0xac, 0x78, 0x11, 0x2a, 0xfa, 0x3f, 0x69, 0x0e, - 0x77, 0xeb, 0x34, 0x30, 0xfa, 0xd9, 0x6b, 0xf8, 0xb6, 0xf1, 0xd8, 0x7a, - 0xbb, 0xa7, 0xc9, 0xc5, 0x2e, 0x22, 0x89, 0x71, 0xbc, 0xf3, 0x91, 0x4e, - 0x53, 0xca, 0xc3, 0x75, 0x27, 0xcc, 0xd7, 0xe8, 0x90, 0x54, 0xba, 0xe3, - 0x98, 0xa8, 0xd0, 0xe8, 0x57, 0xaf, 0xeb, 0xf8, 0x20, 0x68, 0x15, 0x5e, - 0xc7, 0x15, 0x5e, 0x0a, 0x0f, 0x4b, 0x3b, 0xec, 0x30, 0xb6, 0x13, 0xdc, - 0x57, 0x93, 0x57, 0x92, 0xdb, 0x8a, 0x54, 0x51, 0x37, 0x11, 0x9a, 0xeb, - 0x1d, 0x27, 0xf0, 0x9d, 0x8f, 0x38, 0xf9, 0xc7, 0xdb, 0xea, 0xf3, 0xb0, - 0xd7, 0xbb, 0x63, 0x8f, 0x25, 0xb7, 0x55, 0xce, 0xf5, 0x73, 0x1a, 0x88, - 0xc2, 0xed, 0x77, 0x2c, 0x49, 0xed, 0x9a, 0x4a, 0x7d, 0x37, 0xb7, 0x37, - 0x95, 0xd4, 0x47, 0x9e, 0x31, 0x25, 0x0d, 0xb1, 0x33, 0xc3, 0x65, 0x8b, - 0x75, 0x9e, 0x0c, 0x2b, 0x6b, 0x52, 0x0a, 0x6d, 0x41, 0x0c, 0xdc, 0x8a, - 0x5b, 0xce, 0x86, 0x85, 0x58, 0x2d, 0x3e, 0xf4, 0xa0, 0xb8, 0xdd, 0x1e, - 0x62, 0x67, 0x78, 0x49, 0xd6, 0xed, 0xe3, 0x7a, 0xdf, 0xc0, 0xd6, 0xbb, - 0x97, 0xa5, 0xdb, 0x59, 0x9c, 0xe0, 0xb2, 0xbe, 0xb8, 0x41, 0x28, 0x12, - 0xa5, 0x3b, 0xc2, 0xd3, 0x81, 0x58, 0x81, 0x95, 0xda, 0x80, 0x47, 0x79, - 0x55, 0xfd, 0x1a, 0x88, 0x96, 0x30, 0xdb, 0xdd, 0xf6, 0x7d, 0x14, 0x1d, - 0xbd, 0x16, 0xd1, 0x91, 0x72, 0x85, 0x60, 0xca, 0x99, 0x8c, 0x72, 0x36, - 0x97, 0x1c, 0x69, 0xaf, 0x43, 0x4a, 0x32, 0xb1, 0xf2, 0x5f, 0xda, 0xe6, - 0x6e, 0x49, 0x66, 0x75, 0xe3, 0x31, 0x78, 0xa5, 0x48, 0x28, 0x2a, 0x38, - 0x35, 0x5a, 0x72, 0x59, 0x88, 0x6e, 0x5e, 0x35, 0x77, 0x01, 0xd3, 0x87, - 0xb1, 0x65, 0xf4, 0xb9, 0x9b, 0x83, 0x24, 0x04, 0xd9, 0x15, 0x11, 0x21, - 0xa8, 0x86, 0x31, 0x35, 0x07, 0xe1, 0xe6, 0x9c, 0xee, 0xd3, 0x39, 0xa2, - 0x5c, 0xe6, 0xc2, 0xab, 0x81, 0x76, 0xbd, 0x3f, 0xc7, 0xc6, 0xe5, 0xd1, - 0xa9, 0xf1, 0x7f, 0x96, 0xe4, 0xb3, 0x41, 0x4d, 0x4e, 0x3e, 0x68, 0xdc, - 0xd8, 0x34, 0x4c, 0xc4, 0x47, 0xd4, 0x2b, 0x99, 0xa8, 0x58, 0x2e, 0x0b, - 0x38, 0xf9, 0xf2, 0x1a, 0xed, 0x62, 0xf5, 0xbd, 0x27, 0xad, 0xd2, 0xaf, - 0xc6, 0x0a, 0x75, 0x84, 0xad, 0x4b, 0xeb, 0x70, 0xfb, 0xc0, 0x00, 0xa2, - 0xdc, 0x0d, 0x7f, 0x0a, 0x0a, 0xf1, 0x5a, 0xc7, 0x69, 0x3a, 0xda, 0x6f, - 0xcc, 0x7e, 0x4b, 0x21, 0x2d, 0x5e, 0x4c, 0xf2, 0xb9, 0xba, 0x69, 0xb3, - 0xf0, 0x8c, 0x07, 0x18, 0xa1, 0x0e, 0x64, 0x50, 0x16, 0x56, 0xd8, 0xaa, - 0xb7, 0x7f, 0xe2, 0xdb, 0x2c, 0xef, 0x34, 0xc2, 0xff, 0x4b, 0x5f, 0xb3, - 0xac, 0x4e, 0x83, 0xb3, 0xab, 0xb8, 0x3b, 0x79, 0xfb, 0xf9, 0x76, 0xc6, - 0x90, 0x72, 0x79, 0xf6, 0xc3, 0xb7, 0x24, 0xfc, 0x2f, 0x80, 0x2f, 0xfb, - 0x86, 0x5e, 0xeb, 0x95, 0xf0, 0x48, 0xf4, 0x77, 0x38, 0x37, 0xe8, 0x43, - 0xe0, 0xb0, 0x57, 0xca, 0xb6, 0xd1, 0xeb, 0x52, 0xc5, 0x76, 0x3d, 0x16, - 0x04, 0x85, 0xcb, 0x6c, 0x61, 0x87, 0x50, 0x0c, 0x89, 0xfa, 0x09, 0xe5, - 0x10, 0x0f, 0xcd, 0x8e, 0xb5, 0xd9, 0x5f, 0x44, 0x16, 0x4c, 0x01, 0xc7, - 0xdf, 0xa1, 0x5e, 0xd8, 0xdb, 0xe1, 0x21, 0xac, 0xe2, 0x43, 0x4d, 0x37, - 0xc7, 0xe7, 0xe9, 0xdc, 0x8c, 0x0b, 0xbd, 0x18, 0x10, 0x4e, 0x2d, 0xb1, - 0xc6, 0x44, 0xb9, 0xa3, 0xb6, 0x29, 0xbb, 0x47, 0xa5, 0x01, 0x1b, 0x97, - 0x05, 0xd6, 0xdd, 0xb3, 0x52, 0x97, 0x22, 0xa5, 0x96, 0x72, 0xfb, 0x19, - 0x47, 0xf0, 0x6a, 0x34, 0x06, 0xcf, 0x3e, 0x9c, 0x53, 0xf2, 0x62, 0xa9, - 0x3c, 0x75, 0x65, 0xc1, 0x26, 0x35, 0xbf, 0xa6, 0x36, 0x83, 0xeb, 0x1f, - 0x1d, 0x39, 0x1b, 0x62, 0x78, 0x44, 0xcc, 0xb9, 0x02, 0x03, 0xe9, 0xb1, - 0x62, 0x1b, 0x1d, 0x64, 0xd4, 0x5f, 0x71, 0x4d, 0x7e, 0xd9, 0x0c, 0x86, - 0x46, 0xf3, 0xd9, 0x98, 0x91, 0xe4, 0x6b, 0x24, 0xbf, 0xf7, 0x2b, 0x6d, - 0x8f, 0xc6, 0x8e, 0xe4, 0xc0, 0x36, 0x2c, 0x2a, 0x5e, 0x53, 0x86, 0xe1, - 0xfd, 0xd8, 0xd0, 0x9d, 0xc7, 0x10, 0x57, 0x36, 0xcf, 0xc6, 0x6f, 0x17, - 0x69, 0x76, 0x56, 0x79, 0x98, 0xfc, 0x8f, 0x13, 0xe1, 0x65, 0x31, 0x96, - 0xc3, 0x59, 0x88, 0xd7, 0x3b, 0xf5, 0x4f, 0xd7, 0x21, 0x91, 0xb5, 0xf0, - 0x95, 0x8b, 0x65, 0x19, 0x18, 0x61, 0x41, 0xc8, 0xb2, 0xd1, 0x99, 0x50, - 0xfb, 0x7a, 0xcc, 0x5c, 0x53, 0xfe, 0x4c, 0xf4, 0x7b, 0xb8, 0x03, 0x16, - 0x5c, 0xcd, 0x57, 0xb4, 0xc2, 0x91, 0x23, 0x64, 0xc0, 0x67, 0xa4, 0xb6, - 0xb9, 0x43, 0xc5, 0xd4, 0x70, 0xe5, 0x5d, 0x22, 0xaf, 0x40, 0x09, 0x06, - 0xca, 0xc2, 0x2a, 0x00, 0x0c, 0x13, 0xfb, 0x07, 0x9a, 0x00, 0xcc, 0xc7, - 0xf3, 0xc6, 0x58, 0xf9, 0x85, 0x4e, 0x79, 0x2d, 0xd3, 0x26, 0xf2, 0x2a, - 0x00, 0x41, 0x4b, 0x8f, 0x23, 0xe4, 0x6a, 0xfe, 0xba, 0x1a, 0x88, 0x48, - 0x5d, 0x27, 0xe4, 0x89, 0x76, 0xce, 0xf7, 0x8f, 0x49, 0x41, 0x5a, 0xa1, - 0x2b, 0x56, 0x23, 0x73, 0x77, 0x43, 0x10, 0xf9, 0x42, 0xc2, 0x3f, 0xb0, - 0xc0, 0x78, 0xb0, 0xf0, 0xb6, 0x4a, 0x40, 0x50, 0x91, 0xe4, 0x88, 0xd7, - 0x98, 0xa6, 0xa5, 0x62, 0x16, 0x32, 0xd9, 0x47, 0x3a, 0x3e, 0x9d, 0x4e, - 0x65, 0x16, 0xab, 0x17, 0x4a, 0x0d, 0xd2, 0x6c, 0xa4, 0x41, 0x77, 0x97, - 0x0b, 0x24, 0x1e, 0xa6, 0xdd, 0x2d, 0xc6, 0x02, 0xa5, 0x36, 0xc4, 0x19, - 0x3d, 0x28, 0xb7, 0x1e, 0x97, 0x3a, 0x49, 0x87, 0x25, 0x04, 0x64, 0xa3, - 0x9d, 0x7d, 0xf8, 0x30, 0x20, 0x06, 0x36, 0xa4, 0xe0, 0x22, 0x18, 0x1e, - 0x08, 0x0f, 0x32, 0x70, 0x57, 0x43, 0x92, 0xc9, 0x48, 0x53, 0x00, 0x07, - 0xe8, 0x68, 0xdc, 0xef, 0x54, 0xcb, 0x06, 0x9d, 0x35, 0x3f, 0x57, 0xa5, - 0xae, 0x08, 0x81, 0x48, 0x22, 0xf4, 0x29, 0x32, 0xc9, 0x42, 0x8e, 0x77, - 0x65, 0x2b, 0x6c, 0x56, 0x26, 0xfd, 0xc8, 0x74, 0x5f, 0x99, 0x52, 0x9b, - 0x86, 0x6d, 0x03, 0x09, 0xd2, 0x1e, 0xe3, 0x6d, 0xdc, 0xa2, 0x0f, 0xb1, - 0xde, 0x38, 0x89, 0xbf, 0x5b, 0x3a, 0xc6, 0x10, 0x56, 0xd8, 0x34, 0xa5, - 0x27, 0xc3, 0xd9, 0x3c, 0x79, 0x16, 0xf6, 0x62, 0x42, 0x63, 0x67, 0x81, - 0xbb, 0x58, 0xd3, 0x3e, 0xd7, 0x57, 0x33, 0xcf, 0x8f, 0xa5, 0x95, 0x68, - 0x74, 0x5f, 0xb9, 0xeb, 0x25, 0x8a, 0x80, 0x94, 0x21, 0xc2, 0x4e, 0x56, - 0x17, 0x97, 0xa7, 0xf6, 0x31, 0x6e, 0xae, 0x99, 0xa6, 0x2a, 0x2c, 0x32, - 0x2e, 0xfd, 0xc9, 0x25, 0x32, 0x4b, 0x6c, 0xb6, 0x9c, 0x83, 0xfb, 0xcc, - 0xd0, 0x89, 0xf9, 0x39, 0xed, 0x09, 0x55, 0x22, 0x23, 0x28, 0x50, 0xc8, - 0xf4, 0x94, 0x29, 0x1f, 0xe1, 0x65, 0x13, 0x9e, 0xbc, 0x66, 0xcf, 0xc8, - 0x69, 0xf1, 0xe8, 0x42, 0xf6, 0xa0, 0x52, 0xa9, 0x3f, 0xf4, 0xa5, 0x86, - 0xce, 0x46, 0xb0, 0xa0, 0xdc, 0xe4, 0x0a, 0x1c, 0x46, 0x40, 0x8d, 0x77, - 0x9b, 0x45, 0x24, 0x4e, 0xbc, 0xce, 0x1b, 0x73, 0xfd, 0xae, 0xe9, 0x82, - 0xd9, 0x71, 0xda, 0xe4, 0xb3, 0x6a, 0x13, 0xbf, 0x3a, 0xc7, 0xf5, 0x07, - 0xe6, 0x8f, 0x34, 0x6f, 0x35, 0xde, 0x74, 0x7a, 0x59, 0xdb, 0x3c, 0x9f, - 0x90, 0x31, 0x59, 0x93, 0x57, 0x1e, 0x95, 0xf0, 0xec, 0x27, 0x4b, 0x75, - 0xe0, 0x6c, 0x5a, 0xfd, 0x50, 0xe3, 0x50, 0xe9, 0xce, 0xf3, 0x3d, 0x0d, - 0x73, 0xba, 0x2e, 0x9f, 0x71, 0x72, 0xa4, 0xc7, 0x29, 0x30, 0x5a, 0xf5, - 0x0e, 0xcb, 0x9f, 0x50, 0x23, 0xfd, 0x69, 0x03, 0x00, 0x1c, 0x5a, 0x89, - 0xce, 0x9e, 0xf1, 0x46, 0x92, 0xb5, 0xef, 0x2c, 0xda, 0xe0, 0x5e, 0x34, - 0x72, 0x6c, 0xbf, 0x96, 0x17, 0xd5, 0x1a, 0xc6, 0x8a, 0x7b, 0x58, 0x67, - 0xc5, 0x66, 0x91, 0x6b, 0x4b, 0x78, 0xea, 0x15, 0x8e, 0xf8, 0xe9, 0x57, - 0x07, 0xa0, 0xd5, 0xe3, 0xa2, 0xee, 0xcd, 0x4a, 0x0e, 0x80, 0x12, 0x9c, - 0x14, 0x5a, 0x27, 0xde, 0x41, 0xa2, 0x5a, 0x53, 0xac, 0xd5, 0x3c, 0xcd, - 0xb5, 0x3e, 0xd6, 0xda, 0x2a, 0x00, 0x47, 0xb4, 0x8f, 0x24, 0x4b, 0xca, - 0xf1, 0x8a, 0xdb, 0xb7, 0x58, 0x3a, 0xfd, 0x3b, 0xf3, 0x76, 0x23, 0x35, - 0x5e, 0x97, 0x79, 0x4d, 0x65, 0xaa, 0x29, 0xb7, 0x97, 0xb7, 0x49, 0x20, - 0x4a, 0x2c, 0x77, 0x67, 0xbe, 0x55, 0xd1, 0x84, 0xdc, 0xc2, 0xe4, 0x4d, - 0x2b, 0x84, 0xff, 0x1b, 0x50, 0xf5, 0x0f, 0x2c, 0xb9, 0xe0, 0x23, 0xef, - 0x8f, 0x1a, 0xe1, 0x77, 0xa8, 0x77, 0x1c, 0x0b, 0x4d, 0xde, 0x25, 0xc1, - 0xa0, 0xbe, 0x3d, 0xe3, 0xff, 0x5e, 0x37, 0x7f, 0x2e, 0x98, 0x9a, 0x3a, - 0x20, 0x6b, 0xed, 0x18, 0x67, 0x48, 0x5e, 0x02, 0xf9, 0x42, 0x49, 0x57, - 0xef, 0x93, 0x09, 0xdf, 0xfe, 0xfa, 0x75, 0x95, 0xa8, 0x3b, 0xcc, 0x04, - 0x45, 0xe2, 0x44, 0xf9, 0x2c, 0xbb, 0xa7, 0xf1, 0xe9, 0x77, 0x43, 0x3f, - 0xb8, 0x7c, 0xee, 0x85, 0xa7, 0xbc, 0xa4, 0xf8, 0x69, 0x1e, 0x9f, 0xb7, - 0x41, 0xbe, 0xd8, 0xcd, 0xb5, 0x6e, 0xbc, 0x00, 0xda, 0xeb, 0x06, 0x12, - 0x28, 0x18, 0x93, 0xcd, 0x99, 0x42, 0x18, 0x93, 0x65, 0xc6, 0xee, 0x6f, - 0xdf, 0x08, 0xfc, 0xe2, 0x28, 0x22, 0x99, 0x84, 0xe4, 0x4d, 0x05, 0x0f, - 0x40, 0x7e, 0x39, 0x10, 0x71, 0xdb, 0xb7, 0x31, 0x72, 0x46, 0x61, 0x59, - 0xaf, 0x8c, 0xf4, 0xb5, 0xbc, 0xc6, 0xde, 0x07, 0xdf, 0xf2, 0x33, 0x32, - 0x9a, 0xa0, 0xbe, 0x6e, 0xf9, 0x0f, 0x4a, 0x01, 0xf9, 0x72, 0x3c, 0xc0, - 0x20, 0x68, 0xfa, 0x6b, 0xe6, 0x0a, 0xc0, 0xb3, 0x40, 0x6a, 0x99, 0xcd, - 0x97, 0x1e, 0x9b, 0xb8, 0x07, 0x1f, 0x0d, 0x49, 0xcb, 0x73, 0x3d, 0xe0, - 0x77, 0x58, 0x8d, 0xd9, 0x94, 0x8c, 0xff, 0xa9, 0x72, 0xc4, 0x58, 0xe5, - 0xac, 0xe8, 0xc5, 0x42, 0x82, 0xa5, 0xe9, 0x38, 0x03, 0xf3, 0xff, 0xb5, - 0xdd, 0x31, 0xfe, 0x8f, 0x03, 0x63, 0xf2, 0x7c, 0xb3, 0xe2, 0x9e, 0x0f, - 0x10, 0x9f, 0xf8, 0xfd, 0x8c, 0xa0, 0x58, 0xa0, 0x04, 0x6a, 0xee, 0x80, - 0x95, 0x91, 0x7f, 0xfa, 0x0e, 0x8a, 0x09, 0xa8, 0x80, 0x4a, 0x37, 0x5f, - 0x35, 0x31, 0x56, 0x68, 0xb8, 0x10, 0xe2, 0x19, 0x53, 0x15, 0x3e, 0x20, - 0xd6, 0xdc, 0x06, 0x22, 0x0a, 0x70, 0xd5, 0xb9, 0x8a, 0x8e, 0xa1, 0xd5, - 0x52, 0xdb, 0x16, 0x52, 0x0c, 0xb5, 0x03, 0x63, 0x47, 0x10, 0xea, 0x07, - 0x15, 0xc0, 0x86, 0xc2, 0xb6, 0xbf, 0xd8, 0x68, 0x5e, 0x26, 0xce, 0x34, - 0x7a, 0x42, 0x5b, 0x5c, 0x50, 0x8e, 0x49, 0x9e, 0xa7, 0x7b, 0x59, 0xd2, - 0xf6, 0x97, 0xc4, 0x8b, 0xbe, 0x3b, 0xa0, 0xe6, 0xb6, 0x41, 0x7b, 0x7a, - 0x3e, 0x6c, 0xd0, 0x45, 0xff, 0xce, 0xc6, 0x6c, 0x53, 0x2a, 0xcd, 0x54, - 0xc4, 0x74, 0xdd, 0x52, 0xee, 0xdf, 0x75, 0x10, 0x2f, 0x9d, 0x0c, 0x92, - 0xe7, 0xe5, 0xdb, 0x1b, 0x36, 0xab, 0x80, 0xff, 0xe9, 0x4b, 0xf8, 0xbc, - 0x7b, 0x8d, 0x00, 0xa1, 0x8d, 0x74, 0xb8, 0x74, 0x9d, 0x2c, 0x2c, 0xca, - 0xea, 0x45, 0x40, 0x51, 0x73, 0x3e, 0x63, 0xb4, 0x08, 0x7b, 0x02, 0x24, - 0xec, 0x0e, 0xa2, 0x0e, 0x57, 0x00, 0xf1, 0xd8, 0x7f, 0xed, 0x7e, 0x76, - 0x4e, 0x0b, 0x84, 0x95, 0x8f, 0x12, 0x79, 0x83, 0x89, 0x89, 0x0d, 0xbc, - 0x92, 0xba, 0x27, 0xe3, 0x7b, 0xa2, 0xdd, 0x0f, 0xfc, 0xbc, 0x69, 0xb7, - 0x44, 0x22, 0xf8, 0xc9, 0xca, 0x55, 0x55, 0x67, 0x42, 0x84, 0xd5, 0x2b, - 0x04, 0x07, 0x3e, 0xf5, 0x69, 0xbf, 0xa4, 0xa6, 0x8e, 0x25, 0x91, 0xfd, - 0xd7, 0xc7, 0xb0, 0x90, 0x3f, 0xad, 0xa4, 0x1f, 0x01, 0x92, 0xe5, 0x33, - 0xb5, 0x1a, 0xc7, 0x16, 0x41, 0xc1, 0x35, 0x40, 0x95, 0x49, 0xe3, 0x5a, - 0xf6, 0xc7, 0x14, 0x8f, 0x09, 0x60, 0x1e, 0x8a, 0x4b, 0xb4, 0x56, 0xae, - 0x09, 0x49, 0xf4, 0x97, 0x4b, 0x29, 0x00, 0x5c, 0xed, 0xca, 0xf5, 0x4d, - 0x5e, 0x96, 0x85, 0x6d, 0x2f, 0x33, 0x4a, 0xd6, 0x58, 0xca, 0x74, 0x26, - 0x2e, 0xa3, 0x9a, 0xff, 0xfa, 0x3c, 0xf3, 0xd8, 0x35, 0xe3, 0x27, 0x5f, - 0xfb, 0x1a, 0x8f, 0x82, 0xa9, 0x73, 0x62, 0x90, 0xad, 0xee, 0xc1, 0x6a, - 0x24, 0x02, 0x3d, 0x16, 0xf0, 0x08, 0xb2, 0xbe, 0x28, 0x13, 0x5a, 0x21, - 0xe0, 0xbc, 0x7a, 0x43, 0x66, 0x4f, 0x52, 0xc6, 0x52, 0x7c, 0xaa, 0x4f, - 0x9e, 0xed, 0x78, 0xad, 0x0e, 0xd7, 0x38, 0x40, 0xbe, 0xcb, 0x60, 0x34, - 0x0a, 0x38, 0x74, 0xd2, 0x6f, 0x0c, 0xbd, 0x76, 0x1e, 0x8a, 0xd9, 0xb0, - 0x54, 0x17, 0xfc, 0x5f, 0xf8, 0x4f, 0x19, 0xb0, 0xb8, 0x88, 0xb7, 0x02, - 0xe1, 0xba, 0xf6, 0x51, 0x86, 0xc3, 0x16, 0x3e, 0xd9, 0xe0, 0x3a, 0xd8, - 0x61, 0x4b, 0x2d, 0x88, 0x74, 0xfe, 0x40, 0xb5, 0x93, 0x4b, 0xa9, 0xc3, - 0xb9, 0xff, 0x16, 0xf0, 0x1e, 0x8f, 0x3b, 0xc0, 0x13, 0x83, 0x7f, 0xa5, - 0x1c, 0xf6, 0x64, 0xd9, 0x59, 0x09, 0x08, 0xe0, 0xbc, 0xbd, 0x5e, 0x99, - 0xd0, 0xd5, 0xc2, 0xfe, 0x87, 0xb8, 0x8f, 0x87, 0x2e, 0x92, 0x4d, 0xd2, - 0x09, 0x77, 0xfe, 0xd8, 0x48, 0x8f, 0x0a, 0x44, 0x41, 0xe5, 0x9d, 0x4c, - 0xd3, 0x6b, 0xa2, 0xba, 0x0c, 0x69, 0x3c, 0x1a, 0x00, 0x7d, 0x70, 0xfc, - 0xa8, 0xfe, 0x0a, 0xcb, 0x45, 0x02, 0x88, 0x2b, 0x7e, 0x98, 0xc6, 0x1c, - 0x59, 0x64, 0xbf, 0xa8, 0xd1, 0xbf, 0x0f, 0x06, 0x83, 0xe9, 0x99, 0x00, - 0x8e, 0x2c, 0xd3, 0x4c, 0x2e, 0x0e, 0x64, 0x58, 0x4d, 0x6c, 0x16, 0x31, - 0x6e, 0xe7, 0xb1, 0x7f, 0x86, 0xfd, 0x46, 0xcb, 0xee, 0x55, 0x8d, 0x56, - 0x24, 0x7a, 0xcd, 0x83, 0xcf, 0xea, 0xe8, 0xa5, 0xbd, 0x42, 0x0d, 0x3e, - 0x58, 0x1b, 0x6e, 0x0b, 0xc3, 0xaa, 0x4b, 0xd0, 0x42, 0xa0, 0xb4, 0xc4, - 0xeb, 0x84, 0x8f, 0xb3, 0x6a, 0xf9, 0x9c, 0x4b, 0x76, 0xe4, 0xb0, 0xd5, - 0x4a, 0x1e, 0xb3, 0x91, 0xb3, 0x20, 0xec, 0x1c, 0x1a, 0x75, 0xe9, 0xc7, - 0x1c, 0xba, 0x8f, 0x68, 0xb9, 0x5c, 0x6a, 0xd1, 0x96, 0x1d, 0x66, 0xfd, - 0xf8, 0xaf, 0x6b, 0x33, 0xe1, 0xab, 0x32, 0xb1, 0xbc, 0xa8, 0xf2, 0x11, - 0xb8, 0xa3, 0xb1, 0x2e, 0x36, 0x49, 0xf6, 0x93, 0xae, 0xd9, 0x9d, 0x95, - 0xbc, 0x7b, 0x4e, 0x98, 0x3c, 0x50, 0x48, 0xab, 0x9f, 0x01, 0xc2, 0xab, - 0xdb, 0x23, 0xb2, 0x92, 0x6a, 0x43, 0x8c, 0xd2, 0x68, 0x6c, 0x3e, 0xa5, - 0x90, 0xb5, 0xeb, 0x83, 0xc2, 0x0a, 0xe6, 0x54, 0x3e, 0xa0, 0xd0, 0x33, - 0x40, 0xa4, 0xbe, 0xc8, 0x9f, 0x18, 0x86, 0xc4, 0x03, 0x76, 0x8a, 0x7d, - 0x32, 0xe2, 0x5e, 0x36, 0x95, 0x0d, 0x45, 0x77, 0xb4, 0x95, 0xd0, 0x39, - 0x38, 0x62, 0xf0, 0x45, 0x3c, 0x79, 0x49, 0x99, 0x0f, 0xaa, 0x80, 0x7f, - 0x88, 0x87, 0x5e, 0xd0, 0x4b, 0xaf, 0x53, 0x38, 0x84, 0xa1, 0x9f, 0x63, - 0xf8, 0x07, 0x2a, 0xfb, 0x8c, 0xfd, 0x23, 0xdc, 0xf6, 0x36, 0x04, 0x3a, - 0xb2, 0x19, 0x6d, 0x8a, 0x05, 0x2b, 0xb4, 0xfb, 0x0b, 0x16, 0x33, 0x64, - 0xc4, 0x57, 0x53, 0x8c, 0x6e, 0x46, 0x5a, 0xd9, 0xa6, 0x66, 0xd1, 0x74, - 0x43, 0xff, 0x91, 0x12, 0xd2, 0xee, 0xce, 0x33, 0xe1, 0xf5, 0x91, 0x16, - 0xb2, 0xe1, 0x7e, 0x02, 0xb3, 0xad, 0xb9, 0xf3, 0x9c, 0x73, 0x8c, 0x9b, - 0x1b, 0xf0, 0x0a, 0x3c, 0x94, 0xdf, 0xfb, 0x22, 0x9e, 0x8d, 0x10, 0x3d, - 0xbb, 0x09, 0x71, 0xaa, 0xbd, 0x6c, 0x19, 0x0c, 0x0e, 0xdb, 0x8c, 0xd1, - 0x6f, 0xa0, 0x77, 0x5e, 0x7a, 0xf4, 0x6a, 0x53, 0x95, 0xd1, 0x22, 0x42, - 0x39, 0x50, 0xd4, 0x66, 0x7e, 0xed, 0x28, 0x35, 0x0f, 0x31, 0x38, 0x54, - 0x30, 0xdb, 0xe5, 0xbe, 0x06, 0x34, 0x7e, 0xe7, 0xa3, 0x26, 0xdd, 0xcf, - 0x14, 0xb9, 0xf2, 0x60, 0xc9, 0x9d, 0x23, 0xc0, 0x56, 0x78, 0x99, 0x97, - 0xd2, 0xb4, 0x91, 0xa4, 0xca, 0x6b, 0x67, 0x07, 0xc9, 0xe2, 0x67, 0x5b, - 0xea, 0x27, 0x40, 0xdb, 0xe1, 0x46, 0xba, 0x5c, 0x95, 0x5c, 0x0e, 0x61, - 0x43, 0xb4, 0x2a, 0xe0, 0x52, 0x3e, 0xfd, 0x00, 0xea, 0xb3, 0x08, 0xc4, - 0xcd, 0x25, 0x0b, 0x4f, 0xf3, 0x52, 0x3c, 0x86, 0x40, 0x7d, 0xcc, 0x75, - 0x2d, 0xbe, 0x70, 0x3b, 0xf0, 0x7d, 0xa2, 0xe0, 0x20, 0x0b, 0x02, 0x10, - 0x71, 0x37, 0xd6, 0xd0, 0x9f, 0x89, 0xe1, 0xb5, 0x4e, 0xf0, 0x70, 0x4e, - 0x17, 0x35, 0x00, 0x9a, 0x0a, 0xca, 0x94, 0xa9, 0x2d, 0xe7, 0x78, 0x34, - 0xe6, 0xb1, 0xdf, 0xeb, 0xeb, 0xe3, 0x0f, 0x33, 0x4b, 0x6d, 0x94, 0x9a, - 0xae, 0xc4, 0x91, 0x5c, 0x76, 0x8c, 0x38, 0x40, 0x72, 0x9a, 0x92, 0xb1, - 0xe4, 0x2a, 0x9a, 0x1e, 0x2b, 0x42, 0xf7, 0x8f, 0x6e, 0xe5, 0x85, 0x86, - 0xf7, 0x2b, 0xd6, 0xc8, 0x9b, 0x83, 0x52, 0x52, 0x8c, 0x3e, 0x2d, 0xb1, - 0x90, 0x2a, 0xb2, 0x87, 0xe6, 0x01, 0xb4, 0x70, 0x32, 0x8a, 0x1c, 0x52, - 0x01, 0xb0, 0x37, 0xb7, 0xdb, 0xfe, 0xae, 0x44, 0x27, 0x1f, 0xe0, 0xc5, - 0x4c, 0xaf, 0x77, 0x0d, 0xbc, 0x83, 0x03, 0xd1, 0xeb, 0xe5, 0xfd, 0x0d, - 0x49, 0xaf, 0x14, 0x05, 0xd7, 0x5c, 0x0d, 0x51, 0xca, 0x91, 0xa5, 0xc8, - 0xa2, 0xfb, 0xbe, 0xdb, 0x16, 0x7e, 0xef, 0x73, 0xfb, 0x75, 0xed, 0x5f, - 0x4e, 0xe8, 0x0b, 0x61, 0xaa, 0x60, 0x66, 0x53, 0x1d, 0xd2, 0x21, 0xee, - 0x0a, 0xac, 0xad, 0x35, 0x50, 0x00, 0x9a, 0xa0, 0xec, 0x4a, 0xec, 0xc0, - 0x53, 0xf0, 0x70, 0xcb, 0x55, 0xdb, 0x80, 0x90, 0xad, 0xd6, 0x01, 0x81, - 0xcf, 0x63, 0x91, 0xc5, 0x51, 0x99, 0x0b, 0x90, 0x83, 0x40, 0xed, 0x55, - 0x1e, 0xc7, 0x1b, 0x41, 0x6b, 0x3a, 0x36, 0xac, 0x63, 0x40, 0xeb, 0x6a, - 0x28, 0xbd, 0xd4, 0x4e, 0xe4, 0x81, 0xfc, 0xed, 0x9f, 0x4c, 0xd9, 0x74, - 0x9d, 0x78, 0x87, 0x9f, 0xcf, 0x06, 0x36, 0x80, 0x98, 0x06, 0xd0, 0x48, - 0x4b, 0xb6, 0xcb, 0xa1, 0x09, 0xa1, 0x0d, 0xf2, 0x8e, 0x28, 0xe2, 0x90, - 0x64, 0x67, 0x15, 0x4a, 0x2d, 0x62, 0xf7, 0xad, 0xdf, 0xba, 0x37, 0x9e, - 0x07, 0xc2, 0x04, 0xd2, 0x47, 0xa2, 0x31, 0x80, 0xab, 0x23, 0xf6, 0x1d, - 0x7c, 0x1a, 0x17, 0x20, 0x25, 0xb4, 0x78, 0xc6, 0x66, 0xa5, 0xec, 0x47, - 0x4d, 0xa8, 0x6d, 0x70, 0x0b, 0xab, 0xc3, 0x02, 0xce, 0x73, 0xd3, 0x26, - 0xc8, 0xd2, 0x26, 0x44, 0x19, 0xf0, 0x50, 0x16, 0xdb, 0xaa, 0xe2, 0xdb, - 0x63, 0x9f, 0x5a, 0x60, 0x75, 0x52, 0xd7, 0x37, 0x61, 0x8e, 0x1e, 0xe7, - 0x8b, 0x9d, 0x26, 0x9d, 0x2f, 0xc0, 0x23, 0xe7, 0x5f, 0x32, 0x32, 0x6e, - 0x0a, 0xc1, 0x72, 0x48, 0x77, 0x8a, 0x24, 0x64, 0x05, 0xea, 0x8f, 0xcf, - 0x5f, 0x3d, 0xf9, 0x64, 0x73, 0x02, 0xf7, 0x35, 0x30, 0xfa, 0x58, 0x48, - 0x9f, 0xcb, 0xca, 0x88, 0xb8, 0x01, 0x39, 0xd7, 0xc5, 0x6d, 0x82, 0x84, - 0xe1, 0x1d, 0x8f, 0xdd, 0x65, 0x73, 0x40, 0x46, 0x36, 0xe8, 0x71, 0xf9, - 0xf3, 0x1a, 0x9a, 0x47, 0x6a, 0xa0, 0x29, 0x2e, 0x2b, 0x65, 0x0f, 0x61, - 0xb8, 0x2b, 0x98, 0x49, 0xce, 0xe4, 0xa7, 0xe0, 0x39, 0xcf, 0xa4, 0x0d, - 0x43, 0x6a, 0x09, 0x19, 0xaa, 0x9d, 0x40, 0x15, 0x2d, 0x73, 0x24, 0x7b, - 0xa0, 0xcf, 0xea, 0x0f, 0xcc, 0x0c, 0xda, 0x1c, 0xf9, 0x51, 0x40, 0x2e, - 0x63, 0xf9, 0x82, 0x1a, 0x8c, 0xe0, 0x32, 0x45, 0xdf, 0x11, 0xaa, 0x71, - 0x5b, 0xa3, 0x7a, 0xb4, 0xf8, 0x85, 0xf4, 0xbd, 0x47, 0xf1, 0xca, 0xe3, - 0xd5, 0x23, 0xba, 0x8a, 0xd2, 0x80, 0x5a, 0xdb, 0x66, 0xab, 0xc3, 0x61, - 0xa0, 0x83, 0x22, 0x6e, 0xe5, 0x32, 0x46, 0x64, 0x6c, 0x99, 0x8f, 0x53, - 0x57, 0xc5, 0x42, 0x9c, 0xad, 0xe2, 0x64, 0x23, 0x21, 0x70, 0x0e, 0x73, - 0x37, 0x5e, 0xae, 0xdc, 0x11, 0x3c, 0x10, 0xc3, 0x28, 0xea, 0xf5, 0x41, - 0x1f, 0x42, 0xd6, 0x62, 0xcc, 0x65, 0x8c, 0x55, 0xd6, 0x6e, 0x04, 0x4f, - 0x92, 0x92, 0xd6, 0x8f, 0xf3, 0x09, 0xda, 0x59, 0x31, 0x4d, 0xd2, 0x1a, - 0x04, 0x8c, 0xd0, 0x4a, 0x58, 0xb7, 0xdc, 0xf8, 0xf1, 0x7a, 0x2d, 0x3f, - 0xf9, 0x3c, 0x13, 0x63, 0x42, 0xf4, 0xb7, 0x24, 0x35, 0xb4, 0xd2, 0x26, - 0xb5, 0xe4, 0x40, 0xab, 0xda, 0x4c, 0xa7, 0x92, 0x30, 0x81, 0xd3, 0xc8, - 0xbb, 0x39, 0x14, 0xd5, 0x58, 0xcf, 0x1d, 0x44, 0x53, 0xac, 0xcc, 0x7f, - 0x24, 0xdb, 0x51, 0xc8, 0x3f, 0xd3, 0x3e, 0xc5, 0x6a, 0x18, 0xc9, 0x31, - 0x6f, 0xad, 0xd1, 0x87, 0x31, 0x6a, 0x65, 0xf5, 0x63, 0xc4, 0x13, 0xa1, - 0x8e, 0x70, 0xd9, 0x9a, 0x30, 0xbb, 0xb8, 0xeb, 0x9b, 0xb5, 0xce, 0x8e, - 0xe9, 0x77, 0xb4, 0x97, 0x8d, 0x8d, 0xa1, 0x60, 0xe2, 0x6e, 0xc0, 0x52, - 0x9e, 0x88, 0x2b, 0x89, 0x68, 0xf7, 0x20, 0xf0, 0x10, 0xa5, 0xe7, 0xdf, - 0x5f, 0xc0, 0x06, 0x2f, 0x5f, 0x1a, 0x86, 0xde, 0xef, 0xac, 0x4f, 0xec, - 0xc5, 0x98, 0x75, 0x01, 0xfe, 0x5e, 0xe1, 0x81, 0x58, 0xe4, 0xf0, 0x78, - 0x4a, 0xb9, 0x8e, 0x1c, 0x1d, 0x8d, 0x30, 0xc5, 0x92, 0x0e, 0x13, 0x93, - 0x3f, 0x6c, 0xf7, 0xc1, 0x7d, 0x2e, 0x2d, 0x44, 0x8d, 0x40, 0xec, 0x9f, - 0x7d, 0xcd, 0x45, 0x27, 0xcc, 0xb0, 0x13, 0x2e, 0x92, 0x6c, 0x07, 0x71, - 0x70, 0x90, 0x77, 0xe9, 0xc9, 0x7d, 0xf8, 0x8d, 0x2e, 0xea, 0xa6, 0x05, - 0x5a, 0x45, 0x0d, 0x08, 0x42, 0xf9, 0x83, 0x29, 0x3a, 0xb3, 0x81, 0x3f, - 0x9a, 0xc8, 0x6f, 0x54, 0x37, 0xcb, 0xc1, 0x4e, 0x49, 0x2d, 0xee, 0x5a, - 0xf8, 0x7f, 0x3c, 0xd8, 0xe6, 0x8b, 0xf3, 0x7f, 0x99, 0xd3, 0x21, 0xeb, - 0xd9, 0x4c, 0xbe, 0xa6, 0xb0, 0x75, 0x88, 0xb7, 0x4e, 0x3f, 0x45, 0x87, - 0x4c, 0xad, 0x8f, 0x96, 0x9a, 0x81, 0x15, 0x5a, 0x7a, 0x85, 0xc9, 0x2e, - 0x69, 0x7b, 0x21, 0x17, 0x80, 0x95, 0x19, 0xc6, 0x6c, 0x8e, 0x66, 0x95, - 0x41, 0xb2, 0x9f, 0xfa, 0x3d, 0x18, 0x18, 0x37, 0x6c, 0x29, 0x78, 0x9c, - 0x04, 0x30, 0x56, 0x0d, 0x40, 0x98, 0xbf, 0xea, 0x8a, 0xfd, 0xd6, 0x34, - 0x29, 0x2a, 0x9a, 0x31, 0x69, 0x80, 0x19, 0x7f, 0x74, 0x32, 0x32, 0xec, - 0x34, 0xc9, 0x07, 0xf4, 0x0d, 0xcb, 0xa7, 0x29, 0x59, 0xee, 0x86, 0x69, - 0xc1, 0xd2, 0xda, 0xd2, 0x39, 0xb8, 0x67, 0xd0, 0x34, 0xb2, 0xfc, 0x81, - 0x52, 0x77, 0x79, 0xf2, 0x8a, 0x5c, 0xf3, 0x89, 0x73, 0x8a, 0xf5, 0x59, - 0x21, 0xa4, 0x24, 0xc3, 0xef, 0xb2, 0x89, 0xeb, 0x07, 0xcc, 0x66, 0xd9, - 0x22, 0x75, 0x7a, 0x35, 0x7c, 0x8c, 0x94, 0x59, 0x9a, 0x95, 0x83, 0xf0, - 0x60, 0xc2, 0x4c, 0x8b, 0x79, 0x07, 0x14, 0x83, 0x6c, 0x38, 0x2e, 0x73, - 0xfe, 0x2d, 0x41, 0x63, 0xc6, 0x4a, 0xb4, 0xe5, 0x5e, 0x28, 0xfb, 0x45, - 0x87, 0xb8, 0xff, 0x9f, 0x10, 0x86, 0x0b, 0x76, 0x34, 0x93, 0x32, 0xbb, - 0xe8, 0xb5, 0xad, 0x9e, 0xc7, 0xc1, 0x16, 0x1f, 0x81, 0x8f, 0x9b, 0x6d, - 0xe6, 0x7d, 0x24, 0x07, 0xcf, 0x60, 0x44, 0x84, 0x64, 0xa8, 0x6e, 0x19, - 0xfc, 0x53, 0xd4, 0x2a, 0xb9, 0xf4, 0x18, 0xac, 0xc2, 0x1d, 0xca, 0xfe, - 0x9d, 0x0a, 0xcd, 0x63, 0xb9, 0x2a, 0x0e, 0x0a, 0x30, 0x4a, 0x11, 0xd0, - 0x8e, 0x6d, 0xa6, 0x11, 0x28, 0x36, 0x2e, 0xc4, 0xe9, 0xc7, 0xa4, 0x55, - 0x1c, 0x66, 0x44, 0x83, 0xac, 0x48, 0xd4, 0x9c, 0xe5, 0x79, 0xb9, 0xb9, - 0x80, 0xaf, 0xdb, 0x96, 0x49, 0x5f, 0x0a, 0x0a, 0xa0, 0x9e, 0x6d, 0xad, - 0x5d, 0x78, 0x68, 0xd4, 0x46, 0xf4, 0xfd, 0xab, 0x01, 0xb1, 0x9e, 0x1c, - 0x0d, 0x02, 0x5f, 0x9c, 0x84, 0xe7, 0xd1, 0x25, 0x3c, 0xed, 0x87, 0x2e, - 0xf0, 0xa8, 0xe2, 0x28, 0xae, 0x5f, 0xb2, 0x56, 0xad, 0xad, 0x87, 0x62, - 0x9e, 0x51, 0xce, 0xbb, 0x3a, 0xf4, 0x69, 0x84, 0xb8, 0x8e, 0x34, 0x35, - 0x92, 0xe0, 0x65, 0x19, 0x65, 0x0b, 0xb4, 0x9c, 0xf4, 0xff, 0xde, 0xc7, - 0xfd, 0xc5, 0x97, 0xf0, 0xa6, 0x9d, 0x9e, 0xdc, 0x80, 0x08, 0x32, 0xea, - 0xf7, 0x29, 0x43, 0x5f, 0x8c, 0x3b, 0xb4, 0x9c, 0x40, 0xde, 0x9e, 0xa8, - 0xef, 0xee, 0x6f, 0xed, 0xdc, 0xb8, 0x5a, 0x29, 0x20, 0xc9, 0x44, 0xc1, - 0x95, 0x04, 0x33, 0x29, 0xe3, 0x05, 0xce, 0xf7, 0x9e, 0xd1, 0xb7, 0xfa, - 0x6f, 0xb0, 0x45, 0xa8, 0xc6, 0xae, 0xfd, 0xf1, 0x29, 0xb3, 0x94, 0xd5, - 0xf3, 0x5c, 0x50, 0x46, 0xba, 0xdf, 0x84, 0x67, 0x46, 0x49, 0x3d, 0x08, - 0x3a, 0x4e, 0x1c, 0x2b, 0x18, 0x00, 0x50, 0xc1, 0x9d, 0x7a, 0xbe, 0x98, - 0x7e, 0x4b, 0x34, 0x61, 0x19, 0x85, 0xd4, 0xb3, 0xc5, 0xc0, 0x2b, 0xee, - 0x5b, 0x0f, 0x6c, 0xa0, 0x69, 0x34, 0x24, 0x04, 0xe8, 0x15, 0x0b, 0xda, - 0x5d, 0x29, 0x84, 0x87, 0x9a, 0xdb, 0xf6, 0xae, 0x3f, 0x4a, 0xea, 0x13, - 0x7e, 0x48, 0xeb, 0x16, 0xb1, 0xfd, 0x04, 0x45, 0x79, 0x2e, 0x6d, 0x77, - 0x27, 0x15, 0xc6, 0x79, 0xbc, 0x41, 0x11, 0x0a, 0x0a, 0x01, 0xaa, 0xf4, - 0xa7, 0x8c, 0x03, 0xbc, 0xb7, 0x80, 0xf1, 0x59, 0x71, 0x86, 0x3e, 0x39, - 0x15, 0x0b, 0xfa, 0x53, 0xa4, 0xe5, 0x44, 0xba, 0xc3, 0x39, 0x3f, 0x0d, - 0x48, 0x4d, 0x91, 0xee, 0x97, 0xa6, 0x25, 0xa2, 0x33, 0xc2, 0xc7, 0x32, - 0x4b, 0x10, 0x8d, 0x33, 0xb8, 0x4a, 0xe1, 0xb7, 0x80, 0xa0, 0x4a, 0xa6, - 0xe7, 0xec, 0x46, 0x92, 0xa3, 0x83, 0xa4, 0x8e, 0x89, 0x78, 0xb3, 0x13, - 0x97, 0xcd, 0xa8, 0xa5, 0x84, 0x59, 0x71, 0xfd, 0x73, 0x9c, 0x50, 0x5c, - 0xa5, 0xbd, 0x18, 0x19, 0xf5, 0xa4, 0x4b, 0x78, 0xd2, 0x6e, 0x26, 0xb8, - 0xfd, 0x05, 0x62, 0x61, 0xf6, 0x7f, 0xf8, 0x98, 0x11, 0x8d, 0x55, 0x2a, - 0x6f, 0x92, 0xf1, 0xaa, 0xb4, 0x0a, 0x3c, 0x11, 0x17, 0xfe, 0x3b, 0x42, - 0x6f, 0x83, 0x97, 0xd5, 0xde, 0x45, 0x70, 0x9b, 0x5d, 0xdd, 0xcb, 0x8b, - 0x3a, 0x25, 0x09, 0x99, 0x10, 0x73, 0x93, 0xbd, 0x72, 0x68, 0x38, 0xdf, - 0xb9, 0x95, 0xbe, 0x5f, 0x60, 0x18, 0x11, 0x5f, 0xcc, 0xa3, 0x92, 0xe5, - 0xef, 0xe4, 0xe8, 0x97, 0xc5, 0x1f, 0x18, 0x39, 0x48, 0x87, 0x7b, 0xad, - 0x0a, 0xc3, 0x29, 0xc1, 0x6f, 0x60, 0xfe, 0x00, 0x7d, 0x31, 0x45, 0x0f, - 0x22, 0xcc, 0x27, 0xcd, 0xaa, 0x4a, 0xd2, 0x15, 0x7f, 0x19, 0xaa, 0xdf, - 0xc7, 0x29, 0x1f, 0x9a, 0x71, 0x62, 0xcd, 0xdd, 0x8a, 0xa9, 0xc8, 0x60, - 0xb5, 0x25, 0x25, 0xc0, 0xf6, 0x45, 0xc4, 0xe7, 0x17, 0xe4, 0xa4, 0x06, - 0x1e, 0x6e, 0x04, 0xbf, 0x1f, 0x44, 0x09, 0x50, 0xf9, 0x76, 0xa6, 0xa7, - 0xea, 0x8d, 0x89, 0x20, 0x15, 0x32, 0xe4, 0x2a, 0xcb, 0x78, 0xf6, 0x23, - 0xf6, 0x3d, 0x7c, 0xbe, 0xcd, 0x16, 0xdf, 0x81, 0x3d, 0x16, 0x3c, 0xaf, - 0x70, 0x13, 0x9d, 0x11, 0x8f, 0xa7, 0xc9, 0x14, 0x6a, 0xa0, 0xab, 0x75, - 0x0b, 0xe3, 0x1a, 0xb2, 0x18, 0x8a, 0x53, 0xd6, 0x6e, 0xcc, 0xa0, 0x6e, - 0x39, 0x07, 0x9c, 0x43, 0x62, 0xac, 0xbb, 0x38, 0x34, 0x2d, 0x02, 0x4f, - 0xcd, 0x03, 0x4b, 0x0d, 0x09, 0xda, 0xab, 0x3f, 0x38, 0xfb, 0xaa, 0xd4, - 0xaf, 0x47, 0x3a, 0xdd, 0x8c, 0x16, 0x1e, 0x3f, 0x07, 0x04, 0x61, 0xce, - 0xb5, 0x16, 0xc9, 0x1e, 0xcc, 0x57, 0xd1, 0x82, 0x00, 0x05, 0x78, 0xfe, - 0x06, 0x8a, 0x3b, 0xbe, 0x64, 0x9b, 0x86, 0xd5, 0xa4, 0xd4, 0x9d, 0xa3, - 0x7e, 0xae, 0x6d, 0xac, 0xbb, 0xae, 0x79, 0x2c, 0x77, 0xfb, 0xcb, 0xc0, - 0x94, 0xe6, 0x3c, 0x1d, 0x24, 0x9d, 0xa5, 0xaf, 0x62, 0x3c, 0xf7, 0x11, - 0x75, 0x10, 0xc1, 0xcb, 0x5f, 0xc5, 0xe0, 0x72, 0x22, 0xef, 0x28, 0xf7, - 0x0f, 0x2a, 0xbb, 0xf4, 0x15, 0x4f, 0xe3, 0x9f, 0x45, 0x84, 0x62, 0xe0, - 0xd2, 0xad, 0x59, 0x5b, 0xcb, 0x04, 0x79, 0x2f, 0xe5, 0xbc, 0x29, 0xb3, - 0x62, 0x6a, 0x5a, 0x58, 0x7a, 0x41, 0xbb, 0x1b, 0x6e, 0x1b, 0x14, 0xdc, - 0x5a, 0x19, 0x8e, 0xb0, 0xd3, 0x37, 0xed, 0x32, 0x67, 0x41, 0xc0, 0x4b, - 0x65, 0xd4, 0x4f, 0xd9, 0xcf, 0xff, 0xd1, 0xfc, 0x46, 0x87, 0x46, 0xe4, - 0x9c, 0xac, 0xc2, 0x33, 0xdd, 0xd7, 0x59, 0x48, 0xd3, 0x00, 0x02, 0x9e, - 0x1c, 0xd7, 0x6b, 0x95, 0x50, 0x93, 0x6e, 0x2e, 0x95, 0x1b, 0xc1, 0x8b, - 0xb1, 0x1d, 0x3d, 0x1e, 0x09, 0x59, 0xcf, 0x9d, 0x34, 0x33, 0xb0, 0x40, - 0x5f, 0x90, 0xcf, 0xd8, 0xa0, 0xdb, 0xf3, 0x85, 0x9b, 0xdc, 0x7e, 0x82, - 0x3f, 0xde, 0x7d, 0x91, 0x29, 0x4b, 0x14, 0x50, 0xd9, 0x8d, 0x1b, 0x2b, - 0x00, 0xbf, 0x7c, 0x36, 0x86, 0x82, 0x43, 0x74, 0xa1, 0xff, 0xae, 0x56, - 0x36, 0x93, 0x51, 0xe6, 0xca, 0x2b, 0x1e, 0x0b, 0x1a, 0x99, 0x18, 0x64, - 0x4f, 0x9b, 0xf2, 0x9a, 0xd3, 0xfd, 0xc8, 0xb9, 0x9c, 0xe1, 0xca, 0x96, - 0x09, 0xe4, 0x4d, 0xc9, 0xae, 0x11, 0x36, 0x60, 0xc0, 0x63, 0x24, 0x0d, - 0x2b, 0xcc, 0xf1, 0x8f, 0xd8, 0x48, 0x61, 0xea, 0xce, 0x54, 0x59, 0x4a, - 0x8d, 0x6b, 0x54, 0x5d, 0xd7, 0xd4, 0x4a, 0xc9, 0xd6, 0x4a, 0xf7, 0xe0, - 0xc2, 0xdb, 0xc0, 0x14, 0x2d, 0x63, 0xb8, 0xb0, 0xb3, 0x45, 0x1e, 0xae, - 0xc9, 0x06, 0x65, 0x05, 0xeb, 0xb8, 0x4e, 0x95, 0x50, 0x93, 0x9e, 0x60, - 0x61, 0xac, 0xa8, 0xee, 0x2b, 0x1d, 0x4d, 0x87, 0x80, 0xe9, 0xb2, 0x3a, - 0x7c, 0x81, 0x4e, 0xf5, 0x47, 0xf2, 0x0c, 0xd6, 0x8e, 0xaa, 0x5f, 0x14, - 0x5f, 0x74, 0xd8, 0x6e, 0x26, 0x86, 0xc0, 0x34, 0xc5, 0xf4, 0xf5, 0x58, - 0x6b, 0x25, 0x44, 0x0d, 0x71, 0x1d, 0xe0, 0x1c, 0xa9, 0x9e, 0xb9, 0xcf, - 0x3e, 0x72, 0xf0, 0x4d, 0x70, 0xb2, 0x38, 0xb0, 0x99, 0x09, 0x05, 0xe2, - 0xe7, 0xe6, 0xe3, 0x2e, 0x09, 0x31, 0xf0, 0xb4, 0x9e, 0x63, 0x5c, 0xcb, - 0x74, 0xfd, 0x20, 0xa5, 0xad, 0x95, 0x96, 0x7e, 0xb8, 0xf5, 0xd6, 0x0b, - 0xb3, 0x25, 0x57, 0x51, 0x1b, 0x70, 0x23, 0x77, 0xeb, 0xcd, 0xa8, 0x5b, - 0x26, 0xa6, 0x10, 0x13, 0x5c, 0xe7, 0x6e, 0x8a, 0x91, 0xb7, 0x59, 0xe4, - 0x5b, 0xeb, 0x58, 0x02, 0x74, 0xaa, 0x57, 0x0a, 0x00, 0xc8, 0xe4, 0x45, - 0x19, 0x4a, 0xea, 0x9d, 0xb3, 0x93, 0x8d, 0xc5, 0x9f, 0xfa, 0x33, 0x51, - 0x3e, 0x1d, 0x34, 0x67, 0x7d, 0x4d, 0x7c, 0xae, 0xcc, 0x43, 0x9f, 0x0e, - 0xd9, 0x05, 0xe3, 0x2f, 0x89, 0x43, 0x6d, 0x85, 0x87, 0x99, 0xe3, 0x42, - 0x21, 0xf6, 0x08, 0x34, 0x46, 0xfe, 0x35, 0x1b, 0x26, 0xa7, 0x30, 0x7e, - 0x75, 0xb6, 0x07, 0x79, 0x5a, 0xc4, 0xf7, 0x21, 0x1f, 0x94, 0x57, 0xf1, - 0x8f, 0xac, 0xea, 0x04, 0x2a, 0x60, 0xf5, 0xb4, 0xae, 0xb4, 0x46, 0x59, - 0x4f, 0x7d, 0xab, 0x58, 0x16, 0x85, 0xd7, 0xce, 0xc5, 0xbc, 0x88, 0x70, - 0x21, 0x6a, 0x5c, 0x6a, 0x2f, 0x1b, 0x88, 0xf0, 0x71, 0x9a, 0xaf, 0x32, - 0x23, 0x11, 0x4d, 0xa2, 0x34, 0x30, 0xdd, 0xc0, 0x65, 0xe0, 0x98, 0xc2, - 0x6d, 0x59, 0x07, 0x88, 0x4b, 0x2b, 0x72, 0xe8, 0xf6, 0x19, 0x0f, 0x24, - 0x95, 0xa9, 0xad, 0x9c, 0xbb, 0x91, 0xa0, 0xe8, 0x93, 0x5d, 0xfb, 0x9e, - 0x92, 0x54, 0x47, 0xf9, 0x30, 0xee, 0xef, 0x9f, 0xad, 0xb9, 0x99, 0x2f, - 0x36, 0xa3, 0x01, 0x06, 0x43, 0x0a, 0x65, 0x03, 0x75, 0xf4, 0x56, 0xe7, - 0x7a, 0xbf, 0xa2, 0x82, 0x05, 0x88, 0xa8, 0x36, 0xb3, 0x59, 0x80, 0x83, - 0x65, 0x59, 0xde, 0x16, 0x1e, 0xc9, 0xae, 0xd7, 0xcd, 0xad, 0x5a, 0x8d, - 0x33, 0xa4, 0xe6, 0x66, 0xb5, 0xb8, 0xb3, 0x08, 0xde, 0xd8, 0xbd, 0xe5, - 0x20, 0xef, 0x31, 0x3e, 0x25, 0x35, 0xd2, 0xb5, 0xcf, 0xfc, 0x23, 0x7e, - 0xdc, 0xa3, 0xe9, 0x88, 0x9f, 0xf8, 0x89, 0x2b, 0xfb, 0x51, 0x4e, 0x82, - 0xcb, 0x32, 0xf6, 0xb8, 0xa5, 0x68, 0x75, 0xe0, 0xf6, 0xc5, 0x26, 0x90, - 0xf8, 0xf1, 0x7c, 0xc9, 0xc4, 0x4b, 0x9c, 0x70, 0x4d, 0x34, 0x3e, 0x45, - 0xc3, 0x1b, 0x2e, 0x75, 0x4d, 0xec, 0xb9, 0xce, 0xc5, 0x5f, 0x5c, 0x60, - 0xa8, 0x62, 0xd9, 0x87, 0x20, 0x2d, 0x8b, 0x5a, 0x93, 0x35, 0x46, 0xad, - 0xa4, 0xa8, 0x1d, 0xae, 0xab, 0x5c, 0xce, 0x1c, 0xc3, 0xd9, 0xf7, 0x63, - 0x44, 0xca, 0xa2, 0x87, 0x6b, 0x0c, 0xa0, 0xa0, 0xdc, 0xd7, 0x5a, 0xe7, - 0xbc, 0x33, 0x29, 0xc8, 0xcc, 0x9f, 0xc8, 0xc0, 0x14, 0xbe, 0xf2, 0x50, - 0xfb, 0x3c, 0xc5, 0xaf, 0x66, 0x9a, 0x10, 0x0d, 0xe9, 0x2a, 0x07, 0x52, - 0xa2, 0x72, 0x58, 0x55, 0xe4, 0x43, 0x0e, 0x3c, 0xf6, 0x10, 0x41, 0x78, - 0xcb, 0xd6, 0xd7, 0x21, 0xa1, 0xd7, 0x55, 0x43, 0x74, 0x38, 0xc4, 0x2a, - 0xf3, 0xdf, 0x81, 0xa6, 0x39, 0x72, 0xd0, 0x7c, 0x33, 0x94, 0xe7, 0xe2, - 0x39, 0x2d, 0x62, 0xf0, 0x5b, 0x64, 0xa7, 0xee, 0x90, 0x28, 0x33, 0x79, - 0x07, 0x3b, 0x2d, 0x52, 0x70, 0x4f, 0x72, 0x11, 0x8b, 0x49, 0x8b, 0x43, - 0x69, 0x46, 0x1b, 0x9b, 0x46, 0x3b, 0x3c, 0x3a, 0x78, 0x27, 0x8b, 0x78, - 0x2c, 0x00, 0x10, 0xf6, 0x33, 0x31, 0xfc, 0xcc, 0x9c, 0xc5, 0x2e, 0xa6, - 0x18, 0x1a, 0x7d, 0x83, 0xba, 0x35, 0x3c, 0xe8, 0xcc, 0x93, 0xf9, 0xc5, - 0x68, 0x31, 0x18, 0xb8, 0x37, 0x50, 0xfc, 0xbf, 0xfe, 0x57, 0x93, 0xc7, - 0xee, 0x40, 0x19, 0x76, 0x8b, 0x1b, 0x69, 0xa0, 0x92, 0x23, 0x0c, 0x69, - 0x84, 0xc5, 0xc5, 0xb9, 0x8b, 0xc4, 0x7f, 0x2c, 0xce, 0x84, 0x98, 0x0e, - 0x65, 0xb5, 0xe8, 0xc5, 0xed, 0x7b, 0x4c, 0xbc, 0xc3, 0xe2, 0xd0, 0x1a, - 0x8d, 0x06, 0x02, 0x39, 0x28, 0xc8, 0x35, 0xf8, 0xe8, 0x0c, 0xf6, 0x82, - 0xef, 0x0c, 0xe5, 0xf8, 0x55, 0x48, 0x8f, 0xed, 0x44, 0x19, 0x15, 0x02, - 0x8a, 0xfd, 0x74, 0x89, 0xb1, 0x9d, 0xab, 0x43, 0x0e, 0xe1, 0x14, 0x46, - 0x50, 0x75, 0x66, 0xe9, 0xa6, 0x05, 0xa5, 0x04, 0x4b, 0x5a, 0x31, 0xf9, - 0x2c, 0x86, 0x55, 0x10, 0x3e, 0x28, 0x82, 0xa3, 0xe0, 0xb4, 0x32, 0x14, - 0xb1, 0x82, 0x45, 0x59, 0xb9, 0xb3, 0x62, 0xe4, 0xf4, 0x00, 0x16, 0xa6, - 0x3a, 0x31, 0x22, 0x96, 0x3d, 0x7e, 0x78, 0x99, 0xd0, 0x7d, 0x6c, 0x7a, - 0x7b, 0x6a, 0x76, 0x39, 0x61, 0x7f, 0xe3, 0x59, 0xbd, 0x65, 0xe5, 0x7f, - 0x8e, 0x33, 0x9e, 0xc5, 0x2c, 0xc0, 0x74, 0x78, 0x8e, 0x4b, 0xdf, 0x0b, - 0x83, 0x75, 0xf9, 0x0a, 0x6c, 0x2a, 0x89, 0x9d, 0x12, 0xd9, 0xfa, 0xaf, - 0xbe, 0x36, 0x85, 0x04, 0xa0, 0xd8, 0x7a, 0x40, 0x2f, 0xf5, 0xfa, 0x76, - 0x3f, 0xec, 0xf9, 0x01, 0xee, 0x0c, 0x87, 0xa0, 0x52, 0xa1, 0xf7, 0x05, - 0x0a, 0x08, 0xdd, 0x0c, 0xbc, 0x83, 0x9c, 0xfe, 0x0e, 0x26, 0xdc, 0x85, - 0x7a, 0x7e, 0xad, 0xae, 0xed, 0x51, 0xae, 0xe5, 0x2d, 0x78, 0x9e, 0x92, - 0x71, 0xed, 0xb4, 0xe6, 0x3e, 0xba, 0xf2, 0xa9, 0x30, 0xff, 0x06, 0x63, - 0xaf, 0xd2, 0x56, 0x5e, 0xa9, 0xf6, 0xc2, 0x1a, 0xcb, 0xa3, 0x13, 0x4d, - 0x3a, 0x27, 0xca, 0x30, 0x13, 0x84, 0x5d, 0x91, 0x7c, 0x6d, 0xa7, 0x84, - 0x29, 0xfc, 0x31, 0x79, 0x85, 0xf0, 0x44, 0x30, 0xd3, 0xbe, 0xb1, 0x2b, - 0x9e, 0x2f, 0x36, 0x8c, 0x7b, 0xa4, 0xdf, 0x12, 0x58, 0xe6, 0x39, 0x55, - 0xcc, 0x0d, 0x69, 0x44, 0xee, 0x1c, 0x53, 0xc6, 0xda, 0x40, 0xff, 0x91, - 0x27, 0xea, 0x85, 0x4c, 0xbb, 0x0f, 0xfe, 0x4c, 0x19, 0xeb, 0x66, 0x0a, - 0xf4, 0xc4, 0xd4, 0x84, 0x14, 0xef, 0x35, 0xeb, 0x5b, 0x79, 0xd2, 0x11, - 0xda, 0x96, 0x8b, 0x52, 0x57, 0x24, 0x2b, 0x5f, 0xef, 0xdb, 0x02, 0x93, - 0x5e, 0xf9, 0xa8, 0xef, 0x20, 0xef, 0x31, 0x3e, 0x25, 0x35, 0xd2, 0xb5, - 0xcf, 0xfc, 0x23, 0x7e, 0xad, 0xb7, 0xda, 0x45, 0x8c, 0xeb, 0xd7, 0x36, - 0x5b, 0xe4, 0xbd, 0xb3, 0x51, 0x50, 0xed, 0x9e, 0x2f, 0x91, 0x5d, 0xd4, - 0xa8, 0xc3, 0xab, 0x9e, 0x01, 0x5e, 0x61, 0x26, 0x6d, 0xd9, 0x90, 0xce, - 0xae, 0x5b, 0xb1, 0x79, 0xc2, 0x31, 0x45, 0x48, 0xf8, 0x25, 0x7e, 0xcb, - 0x23, 0x89, 0x48, 0xd8, 0xf3, 0x8b, 0xed, 0xcc, 0xef, 0x1f, 0xa1, 0x57, - 0xf6, 0x6f, 0xe5, 0x63, 0x6f, 0xd0, 0x5d, 0x99, 0xcb, 0x81, 0x04, 0x9b, - 0x8e, 0x82, 0x75, 0x09, 0x9d, 0x58, 0x1c, 0x83, 0x75, 0x9d, 0x6a, 0xb9, - 0x6d, 0xb4, 0x45, 0x5d, 0x1b, 0x2d, 0x96, 0xba, 0x31, 0xdf, 0xb6, 0xd9, - 0x99, 0x6c, 0x58, 0xe9, 0x0e, 0x08, 0xbc, 0x9b, 0x8c, 0xd7, 0x17, 0x5c, - 0x1a, 0x1a, 0x03, 0xfc, 0x2c, 0x12, 0xa5, 0x65, 0x13, 0x5d, 0xdf, 0xe6, - 0x38, 0xda, 0xba, 0xc2, 0x75, 0x7a, 0x6b, 0x96, 0x13, 0x5d, 0xf8, 0x1c, - 0xef, 0x02, 0x15, 0xfc, 0x59, 0x22, 0x52, 0x60, 0x00, 0x11, 0x3e, 0x6b, - 0x50, 0x3a, 0x89, 0x89, 0xc6, 0x5e, 0x4c, 0xe4, 0xce, 0xf5, 0x85, 0xa6, - 0xf6, 0x34, 0x9b, 0x22, 0xda, 0x71, 0xec, 0xba, 0xdc, 0x06, 0x1e, 0x85, - 0x33, 0x74, 0x64, 0x02, 0x94, 0x05, 0x44, 0x07, 0x18, 0x46, 0x05, 0x56, - 0xbd, 0xe3, 0x6b, 0xcc, 0x37, 0x15, 0x04, 0xeb, 0x08, 0x2a, 0x62, 0x88, - 0xfd, 0x18, 0xa3, 0x92, 0x50, 0xe2, 0x40, 0x72, 0xc9, 0xc2, 0xf6, 0x43, - 0xb2, 0xd6, 0x51, 0xe3, 0x37, 0x0c, 0x35, 0x0c, 0x06, 0xd1, 0x18, 0x96, - 0x28, 0xdc, 0x24, 0x3f, 0x56, 0x73, 0x87, 0x9f, 0xe7, 0xba, 0xc3, 0x09, - 0x30, 0x8f, 0x75, 0xb3, 0xd5, 0xeb, 0x9c, 0x3c, 0x94, 0x36, 0x48, 0xb1, - 0xa2, 0xe9, 0x3a, 0x20, 0x5e, 0x23, 0x8f, 0xc6, 0x39, 0x1b, 0x58, 0xa4, - 0xed, 0xf4, 0x0e, 0x5d, 0x1c, 0x19, 0x7e, 0x62, 0x7e, 0xd8, 0xb2, 0x74, - 0x0c, 0x7d, 0x95, 0x5c, 0x57, 0x35, 0x4d, 0xe2, 0x26, 0x72, 0xf3, 0xbf, - 0x89, 0xc3, 0xe8, 0x5b, 0x4c, 0xf3, 0x3b, 0x52, 0xe3, 0x81, 0xfd, 0xaf, - 0xac, 0xb3, 0xb7, 0xae, 0x9b, 0x87, 0x02, 0x89, 0x07, 0x41, 0x2b, 0x47, - 0x38, 0xbb, 0xef, 0x6f, 0x9a, 0x51, 0x9c, 0x62, 0x9a, 0xb5, 0x1b, 0x46, - 0x7f, 0xa3, 0x25, 0x13, 0xb1, 0x4f, 0x2e, 0xb6, 0xb3, 0xe7, 0xb3, 0x86, - 0xfa, 0xbb, 0x2e, 0xa7, 0x65, 0xb5, 0xc3, 0xa5, 0x4d, 0xce, 0xca, 0x88, - 0x24, 0x36, 0x38, 0x18, 0xbb, 0x43, 0x52, 0x67, 0x25, 0xae, 0x1f, 0x3a, - 0x25, 0x3a, 0xcf, 0xfb, 0x23, 0x0d, 0x22, 0x2d, 0xc5, 0x8f, 0xc6, 0x43, - 0xcc, 0x3b, 0xa1, 0x5b, 0x34, 0xf1, 0xe6, 0x99, 0x62, 0x55, 0x9c, 0x1f, - 0xf3, 0x89, 0x4d, 0x06, 0x4a, 0x8d, 0xd4, 0xe3, 0x8e, 0xdb, 0x72, 0xba, - 0x70, 0x73, 0xe9, 0xeb, 0xac, 0x4b, 0x68, 0x61, 0xe2, 0xe3, 0x75, 0x3c, - 0xb0, 0x71, 0x51, 0xf1, 0x37, 0x19, 0xf5, 0x86, 0xaf, 0x0d, 0x12, 0xba, - 0x09, 0x53, 0x9d, 0x8b, 0xde, 0x68, 0x0f, 0xdf, 0x02, 0x4a, 0x71, 0xbe, - 0x6a, 0xfa, 0x7f, 0x96, 0xd4, 0x18, 0xda, 0xb1, 0xba, 0x2a, 0x01, 0xcb, - 0x2a, 0xe5, 0x35, 0x2f, 0x21, 0xcd, 0xd6, 0x39, 0xe6, 0x4d, 0x3f, 0xf8, - 0x00, 0x7e, 0xbc, 0x1f, 0x21, 0x76, 0xf3, 0x43, 0x1f, 0xe4, 0xf3, 0xf3, - 0x74, 0x38, 0xd6, 0x98, 0x36, 0x77, 0x5e, 0x79, 0x40, 0xa9, 0xa9, 0xee, - 0x72, 0x9b, 0x48, 0x08, 0x2c, 0x1c, 0x75, 0x6d, 0x45, 0x2f, 0x27, 0xb6, - 0x3e, 0x8b, 0x79, 0xd3, 0xa1, 0xf2, 0x4a, 0x64, 0xbf, 0xa6, 0x4f, 0x19, - 0xbf, 0xa1, 0xba, 0x5c, 0xf4, 0x1c, 0x3b, 0x65, 0x20, 0xc6, 0x5d, 0x3a, - 0x72, 0xab, 0x95, 0xa6, 0x91, 0xec, 0xce, 0xd5, 0xe1, 0x9e, 0xce, 0x72, - 0xf0, 0x88, 0x59, 0x25, 0x25, 0x7e, 0x9f, 0x73, 0x5d, 0x82, 0x37, 0x63, - 0xfe, 0xf5, 0x45, 0x1f, 0x72, 0xf5, 0x8b, 0x7d, 0x1d, 0xfd, 0xd5, 0x3f, - 0x35, 0x4a, 0xaa, 0x28, 0x50, 0xb8, 0x25, 0xfd, 0x5f, 0xf7, 0x0a, 0x86, - 0xa6, 0xe1, 0x8d, 0xb5, 0x0d, 0x67, 0x1d, 0x08, 0xcd, 0x64, 0x33, 0x55, - 0x71, 0xb3, 0xdb, 0x2b, 0x71, 0x1a, 0x15, 0xa9, 0x6f, 0x51, 0xce, 0x95, - 0x09, 0x7d, 0xf8, 0xb2, 0x92, 0x2b, 0x22, 0xe3, 0x1d, 0x56, 0x93, 0xfe, - 0xa7, 0xf1, 0x4f, 0xd6, 0xfb, 0x76, 0xa3, 0x17, 0xf3, 0xd6, 0x0e, 0xb5, - 0xef, 0x8f, 0x8a, 0x6b, 0x60, 0x82, 0xa6, 0x5d, 0x6b, 0x4d, 0xe2, 0x59, - 0x03, 0x18, 0x38, 0x19, 0x70, 0xba, 0x70, 0x2d, 0xf5, 0x91, 0xf0, 0x40, - 0x8a, 0x4f, 0xa4, 0x52, 0x8b, 0x5b, 0xba, 0x0f, 0xa1, 0x4a, 0xf5, 0x91, - 0xa7, 0x1a, 0x5b, 0xc7, 0xae, 0x03, 0x27, 0xdf, 0x66, 0x11, 0xec, 0x33, - 0x65, 0x52, 0x4d, 0x04, 0xb2, 0xcf, 0x98, 0xb3, 0x1f, 0x1d, 0xed, 0x1c, - 0x7d, 0xa4, 0x00, 0x07, 0x64, 0xd5, 0x36, 0x5d, 0x34, 0x89, 0x5f, 0x38, - 0x16, 0xe4, 0x8c, 0x70, 0x1f, 0x7a, 0x2e, 0x75, 0xf4, 0xb1, 0xd6, 0x2c, - 0x66, 0x34, 0xf4, 0xce, 0x76, 0xa9, 0xba, 0x04, 0x8a, 0xce, 0x83, 0xc8, - 0x79, 0x9f, 0xea, 0x32, 0x1b, 0x0c, 0x6c, 0x3b, 0xe3, 0xb7, 0x36, 0x40, - 0x78, 0xf4, 0xb0, 0xcd, 0x64, 0xd6, 0x29, 0x8c, 0x42, 0x8f, 0xfa, 0x14, - 0xe0, 0x2a, 0xd1, 0x06, 0xd9, 0x2f, 0x30, 0x63, 0xa8, 0x9c, 0x4a, 0xa4, - 0x7a, 0x25, 0x43, 0xcf, 0x07, 0xfd, 0x6f, 0x33, 0x86, 0x3a, 0xa4, 0x70, - 0x4a, 0xd4, 0xc3, 0xfe, 0xb9, 0x16, 0x61, 0xe1, 0xef, 0xbe, 0x03, 0xc7, - 0x68, 0xaf, 0x15, 0xbb, 0x7c, 0x57, 0xfb, 0x31, 0x6f, 0x40, 0x14, 0x48, - 0x59, 0x04, 0x8a, 0x55, 0xd0, 0x2e, 0xf1, 0xf7, 0xb5, 0x52, 0x1d, 0x09, - 0x46, 0x52, 0x86, 0x53, 0xf9, 0x2f, 0xfa, 0xf3, 0x1a, 0x24, 0xc2, 0xc3, - 0xee, 0x81, 0x3f, 0x8b, 0x91, 0x33, 0x99, 0x9b, 0x94, 0x2c, 0xe8, 0x9a, - 0x88, 0xd8, 0xb5, 0xd0, 0xab, 0x78, 0xd9, 0x87, 0xa6, 0x0b, 0x7a, 0xee, - 0xa1, 0x51, 0x17, 0xf3, 0x51, 0x00, 0xc5, 0xaa, 0x2e, 0x81, 0x32, 0xca, - 0x75, 0x7d, 0x59, 0x95, 0xf5, 0xd2, 0xfd, 0xce, 0xcc, 0x38, 0x2c, 0xdf, - 0x7e, 0x53, 0x39, 0xc8, 0x5b, 0x69, 0x6f, 0x81, 0xdd, 0xc5, 0x4c, 0xde, - 0x47, 0x0a, 0x41, 0xa1, 0x29, 0x48, 0x2b, 0x09, 0xdd, 0x10, 0xb8, 0x9b, - 0x21, 0x49, 0x78, 0x0b, 0xdd, 0x07, 0x6f, 0xc8, 0x84, 0xbc, 0x81, 0x40, - 0x31, 0x3a, 0x48, 0x59, 0x47, 0x49, 0x90, 0xa0, 0x8d, 0xab, 0x5a, 0xd6, - 0x99, 0xed, 0x58, 0xd5, 0x1a, 0xec, 0x2e, 0x86, 0x6a, 0xa4, 0x1c, 0xdf, - 0x00, 0x37, 0x10, 0xf1, 0xe5, 0x3c, 0x6f, 0x5e, 0xde, 0x9f, 0x9e, 0xe0, - 0x34, 0x32, 0xb0, 0x52, 0x20, 0x77, 0x29, 0x2e, 0xed, 0x24, 0x4a, 0xd2, - 0xf6, 0xc5, 0x8b, 0x5a, 0xd4, 0xa0, 0x6f, 0xba, 0x27, 0x33, 0xa8, 0xc0, - 0x33, 0x90, 0x44, 0xef, 0x73, 0x33, 0xd3, 0xbb, 0x09, 0xfe, 0xc0, 0x2d, - 0xe3, 0x15, 0xa9, 0x08, 0xb8, 0x9d, 0xa7, 0xac, 0xbb, 0xc1, 0xcb, 0x03, - 0x12, 0x93, 0xa2, 0x66, 0x67, 0x77, 0xd7, 0xa4, 0xe7, 0xf6, 0xb8, 0xd9, - 0x22, 0x36, 0xfb, 0xbd, 0x64, 0x82, 0x17, 0x48, 0x78, 0xc1, 0x17, 0x2f, - 0x72, 0xe8, 0x01, 0x4c, 0x9d, 0xe2, 0x1f, 0x2b, 0x1c, 0xe8, 0x1d, 0x19, - 0xd5, 0xb9, 0x82, 0xa8, 0x97, 0x35, 0x47, 0x46, 0x98, 0x70, 0xae, 0x17, - 0x19, 0x60, 0x19, 0x4b, 0x05, 0x4e, 0x41, 0x52, 0xc4, 0xa1, 0x2c, 0x8f, - 0xf6, 0xb0, 0x21, 0x69, 0x9f, 0xa2, 0x0b, 0x79, 0x9b, 0xbe, 0x46, 0x3f, - 0x0d, 0x2c, 0x7b, 0x5d, 0x3e, 0x24, 0x16, 0x64, 0x1f, 0xbe, 0x0b, 0xa3, - 0x8a, 0xa5, 0xb8, 0x2b, 0x5a, 0xfc, 0xf5, 0xef, 0x62, 0xac, 0x3a, 0x25, - 0x8e, 0xfb, 0x52, 0xbb, 0xdd, 0x07, 0x6e, 0x58, 0xe4, 0xbc, 0x81, 0x40, - 0x31, 0x3a, 0x48, 0x59, 0x47, 0x49, 0x90, 0xa0, 0xfd, 0xa4, 0x60, 0xd5, - 0x96, 0x56, 0xa6, 0x17, 0xcf, 0x5d, 0x93, 0xba, 0x2e, 0x41, 0xa8, 0x18, - 0x9b, 0x0d, 0x72, 0x1f, 0x90, 0x10, 0x4b, 0xe3, 0xf2, 0x44, 0x8d, 0x97, - 0x06, 0xf6, 0x59, 0x67, 0x32, 0xd3, 0x36, 0xb8, 0xc3, 0x6c, 0x92, 0xf2, - 0xcb, 0xec, 0xca, 0xd9, 0x60, 0x55, 0x4e, 0xb4, 0x19, 0xf2, 0xe8, 0x21, - 0x60, 0x61, 0xf3, 0xe3, 0x31, 0x33, 0xed, 0x91, 0xe3, 0x5a, 0x83, 0xf6, - 0x49, 0xc9, 0x7d, 0x84, 0xfb, 0xc5, 0xf3, 0x0f, 0xe9, 0xcd, 0xd3, 0x7d, - 0xed, 0x7e, 0x5c, 0xf1, 0x52, 0x01, 0xd1, 0x7a, 0xf2, 0x23, 0x5d, 0xbd, - 0xed, 0x73, 0x1b, 0x60, 0x3f, 0xa3, 0x6f, 0x23, 0x98, 0x43, 0x6b, 0xa7, - 0x4c, 0xfd, 0x3a, 0xdb, 0x9c, 0x8d, 0x2d, 0x4e, 0xdc, 0x19, 0x61, 0x21, - 0x04, 0xaf, 0x79, 0x14, 0x79, 0xcb, 0xcd, 0x21, 0xb8, 0x94, 0x74, 0x87, - 0x55, 0x25, 0x11, 0x4d, 0x5e, 0x8d, 0x07, 0x0c, 0x51, 0x0c, 0x06, 0xf6, - 0x45, 0x73, 0x2a, 0x90, 0x45, 0x0f, 0x7d, 0xe3, 0xf9, 0xba, 0x66, 0x88, - 0x28, 0xff, 0xef, 0x4d, 0x6f, 0x7e, 0x84, 0x8f, 0xb9, 0x1e, 0xd4, 0x5b, - 0xb6, 0x57, 0x2d, 0xa6, 0x4e, 0xbf, 0xf8, 0xf4, 0x45, 0xea, 0x72, 0x8a, - 0x16, 0xc5, 0x42, 0xfc, 0xaf, 0x00, 0xe0, 0xfb, 0x54, 0xd1, 0x87, 0xdd, - 0x30, 0xbf, 0x1e, 0x5c, 0xa8, 0x46, 0x77, 0xc9, 0x6e, 0x1b, 0x5f, 0xf3, - 0xdb, 0x8b, 0x4c, 0xac, 0xd3, 0xd0, 0x66, 0x7f, 0x55, 0x60, 0x5f, 0xbe, - 0x8c, 0x23, 0x63, 0xc4, 0x56, 0x7f, 0x01, 0x76, 0x59, 0x42, 0xd2, 0x20, - 0x71, 0xa6, 0x1d, 0x14, 0xd2, 0xa0, 0x1f, 0x07, 0x89, 0xbd, 0x13, 0x9e, - 0x05, 0x18, 0xb5, 0xd6, 0x36, 0x61, 0x5c, 0xae, 0x05, 0x3a, 0xe5, 0x38, - 0x79, 0x07, 0x65, 0xba, 0x68, 0x55, 0xe2, 0x41, 0xca, 0x39, 0x7e, 0x8f, - 0xc9, 0xe7, 0xb1, 0x86, 0xc3, 0xcc, 0xd5, 0x48, 0xa9, 0x85, 0x94, 0xbe, - 0x97, 0xb8, 0xa1, 0xe8, 0x15, 0xe3, 0x2c, 0x31, 0x2d, 0x1a, 0xd3, 0x1f, - 0x3f, 0xe2, 0x74, 0x3e, 0x71, 0xdb, 0x7d, 0xf2, 0x65, 0xd2, 0xd4, 0x56, - 0xa2, 0x4c, 0xea, 0x7d, 0x7a, 0xb4, 0x6f, 0x28, 0x3d, 0x7f, 0xcd, 0x6e, - 0x82, 0xfd, 0x4f, 0x9d, 0x0f, 0xe8, 0x5d, 0x57, 0x3c, 0xb7, 0x03, 0xf6, - 0x0f, 0xfb, 0x68, 0x1c, 0x7e, 0xcf, 0x2c, 0x82, 0x34, 0x33, 0x37, 0xd4, - 0x0c, 0xbc, 0x25, 0x7c, 0xed, 0xf8, 0x28, 0x30, 0x64, 0x80, 0x03, 0xad, - 0x60, 0x21, 0xbd, 0x80, 0x83, 0xe3, 0x65, 0x5b, 0xf2, 0x7f, 0xb9, 0x61, - 0x57, 0x3b, 0x7c, 0x5c, 0xa4, 0x8f, 0x60, 0x48, 0xa2, 0x3b, 0xe0, 0xe4, - 0x58, 0x74, 0x26, 0xbe, 0x8a, 0x4a, 0x37, 0xb9, 0x2e, 0x88, 0x34, 0xe6, - 0xbf, 0xe8, 0xef, 0x3a, 0x62, 0x01, 0xfe, 0x0b, 0xb6, 0xb0, 0xb2, 0xe2, - 0x83, 0x20, 0x87, 0x74, 0x57, 0x85, 0x91, 0x04, 0x31, 0x97, 0xcb, 0xdc, - 0xb5, 0x0d, 0x86, 0x13, 0x85, 0xb5, 0x9c, 0xd2, 0x36, 0x0d, 0xb2, 0x6a, - 0x90, 0x91, 0x41, 0xdd, 0xa1, 0xcf, 0xae, 0x3c, 0x0c, 0xf5, 0xe2, 0xb1, - 0x93, 0x44, 0x94, 0x2b, 0x6e, 0x9c, 0x64, 0xcc, 0x47, 0xe7, 0x8f, 0x68, - 0xae, 0x23, 0x28, 0xea, 0x7b, 0xb8, 0x3a, 0x47, 0x20, 0x3c, 0x89, 0x4b, - 0x16, 0x09, 0x55, 0xef, 0x42, 0xe1, 0x4f, 0xab, 0x21, 0x75, 0x00, 0x4a, - 0xc9, 0x8f, 0x7c, 0x6b, 0x8d, 0x6a, 0xb6, 0xa6, 0x85, 0x5d, 0xec, 0x3f, - 0x1e, 0x7e, 0xa5, 0x0d, 0x49, 0x31, 0x53, 0x28, 0x48, 0xda, 0xeb, 0x2c, - 0x2e, 0x5c, 0xee, 0x74, 0x3f, 0xaa, 0xb8, 0xfe, 0xa6, 0x2d, 0xd9, 0x4d, - 0xff, 0x34, 0x35, 0xdb, 0x7b, 0x1e, 0xaa, 0xfc, 0x31, 0x1a, 0x24, 0x6c, - 0x48, 0xbd, 0x05, 0x44, 0x5a, 0x27, 0x83, 0xa4, 0xee, 0x02, 0x73, 0x95, - 0x2e, 0xba, 0xcf, 0xda, 0x16, 0x8e, 0x12, 0x96, 0x5c, 0xca, 0x78, 0x68, - 0x35, 0x10, 0xea, 0x90, 0x06, 0x46, 0x14, 0x53, 0xdf, 0x54, 0xeb, 0xb7, - 0x19, 0xe9, 0xe2, 0x23, 0x72, 0x4e, 0x0e, 0xcf, 0x30, 0x31, 0x18, 0xf8, - 0x48, 0x4e, 0xa1, 0x07, 0x0b, 0x55, 0xbe, 0x6e, 0x9d, 0xee, 0x4f, 0x0f, - 0x91, 0xb3, 0xbc, 0x03, 0x96, 0x6f, 0x8e, 0x92, 0xe0, 0xaf, 0xca, 0x1f, - 0x74, 0xd5, 0x5a, 0x6a, 0x97, 0xec, 0xa2, 0xb7, 0x6f, 0xf0, 0x4e, 0x3e, - 0x7a, 0x70, 0x60, 0x22, 0x29, 0xb1, 0x42, 0x85, 0x7b, 0x21, 0x67, 0xb7, - 0x51, 0x64, 0x4f, 0x40, 0x30, 0x0e, 0x8a, 0x66, 0xd1, 0x87, 0x6f, 0x60, - 0x07, 0xa7, 0x19, 0x9a, 0x42, 0xbf, 0x33, 0xb8, 0x82, 0xc2, 0xbf, 0x25, - 0x3d, 0xba, 0xf9, 0x71, 0x38, 0x79, 0xa9, 0x2e, 0x84, 0x2e, 0xe3, 0x8a, - 0x58, 0xa0, 0xe3, 0x3d, 0xca, 0x9b, 0xb9, 0xed, 0x78, 0x1e, 0x35, 0x70, - 0xfa, 0x8e, 0xe6, 0x96, 0x7e, 0x33, 0xe9, 0x7b, 0x79, 0xd8, 0xc1, 0xb1, - 0x01, 0x8c, 0x9b, 0xea, 0x07, 0xc4, 0xad, 0x0e, 0x2a, 0x9e, 0x4d, 0x9f, - 0xf4, 0x2d, 0x74, 0xaa, 0xda, 0x24, 0xca, 0x99, 0x08, 0x6b, 0xb7, 0x2d, - 0x09, 0x02, 0x30, 0x2e, 0xf3, 0x31, 0x54, 0x17, 0xea, 0x2a, 0xa6, 0xe6, - 0x34, 0x7f, 0xb0, 0xfa, 0xff, 0x78, 0x41, 0x77, 0x08, 0x4d, 0x8a, 0xb4, - 0x9c, 0x59, 0x01, 0x47, 0x42, 0xe8, 0xb9, 0xef, 0x16, 0xa3, 0x29, 0x18, - 0x44, 0x97, 0x98, 0xfd, 0x30, 0x87, 0xb6, 0x4b, 0x67, 0x6f, 0x57, 0x10, - 0x53, 0x3c, 0x63, 0x43, 0x51, 0xb0, 0xe8, 0xbe, 0xaf, 0xee, 0xa4, 0x61, - 0x9c, 0xe9, 0x09, 0x7b, 0x8f, 0x4c, 0x83, 0x26, 0x49, 0x35, 0x46, 0x70, - 0xe7, 0xc4, 0x46, 0x92, 0x02, 0xd3, 0xb5, 0x49, 0xf5, 0xd2, 0x83, 0x20, - 0x1d, 0x5b, 0x5e, 0x55, 0xea, 0xb4, 0xb2, 0x05, 0x38, 0x50, 0xee, 0x06, - 0xd4, 0x9d, 0xd3, 0x4d, 0xc1, 0xd0, 0x25, 0xe8, 0xed, 0xec, 0xf7, 0xa9, - 0x89, 0x0a, 0x71, 0xf5, 0xb8, 0xc6, 0x06, 0x49, 0x7d, 0x5b, 0x04, 0x13, - 0xd0, 0xc3, 0x4c, 0x75, 0x82, 0xe9, 0xd2, 0xcc, 0xf5, 0x7e, 0x3b, 0x64, - 0x1c, 0x1a, 0x18, 0x95, 0x7f, 0x23, 0x54, 0xb3, 0xa8, 0xf6, 0x2d, 0xec, - 0xad, 0xa9, 0xc3, 0x68, 0x20, 0xd7, 0x9d, 0x56, 0xe4, 0x99, 0x26, 0xfa, - 0x8a, 0x97, 0xe4, 0x49, 0x7b, 0x51, 0xe6, 0x39, 0x45, 0xac, 0x9d, 0x9a, - 0xf7, 0xfa, 0xe7, 0x42, 0x6a, 0x9a, 0x2d, 0xd6, 0xbc, 0x41, 0xaa, 0xf7, - 0x0b, 0xe8, 0xee, 0x22, 0x39, 0x36, 0x7b, 0x70, 0x87, 0x1f, 0xd8, 0x17, - 0x6f, 0x85, 0xe4, 0x5d, 0x14, 0x66, 0x32, 0x24, 0xbe, 0x2a, 0xfc, 0x8b, - 0xb8, 0x5b, 0x49, 0x8c, 0x72, 0x04, 0x72, 0x92, 0x11, 0x8e, 0x70, 0x4c, - 0x41, 0xb0, 0xaf, 0x7a, 0xa4, 0xe9, 0xf5, 0x48, 0xfc, 0xd4, 0x44, 0xeb, - 0x90, 0x0f, 0x7c, 0xbd, 0x53, 0x2d, 0x49, 0x9c, 0x3a, 0xd5, 0x8f, 0x29, - 0x7b, 0x1d, 0x7e, 0x1d, 0xd9, 0x19, 0xe9, 0x18, 0x93, 0x47, 0xff, 0x48, - 0x19, 0xe6, 0x21, 0x1d, 0x47, 0x70, 0x64, 0xb9, 0x98, 0x1e, 0x46, 0xb3, - 0xa6, 0xaa, 0x17, 0x68, 0x10, 0xf0, 0x22, 0x94, 0x1b, 0x46, 0x2c, 0xd9, - 0x9c, 0x1b, 0x14, 0x36, 0xda, 0x36, 0x40, 0xc3, 0x37, 0xe7, 0x7d, 0xf4, - 0x57, 0x72, 0xfa, 0x19, 0x6e, 0x46, 0xac, 0xad, 0x54, 0x2d, 0x38, 0x16, - 0x92, 0x95, 0xb8, 0xdc, 0x55, 0x89, 0xbf, 0x8b, 0xb1, 0x34, 0x97, 0x5f, - 0x61, 0x76, 0x4b, 0xaa, 0x05, 0x99, 0xc4, 0x51, 0x1b, 0x69, 0xb7, 0xb5, - 0x30, 0x38, 0x23, 0x7f, 0xdd, 0xf1, 0x6e, 0xe2, 0xc2, 0xeb, 0xa4, 0x51, - 0xec, 0xc9, 0x85, 0xd3, 0xd2, 0xc0, 0x72, 0x4b, 0xe1, 0x88, 0x50, 0xf6, - 0x6b, 0x26, 0xc5, 0x2c, 0xbf, 0x25, 0xdf, 0x07, 0xab, 0x7e, 0xa5, 0xb9, - 0x29, 0xa9, 0x58, 0x82, 0x3e, 0x6a, 0x1b, 0x98, 0x37, 0x40, 0xd9, 0xd1, - 0x60, 0x13, 0xad, 0x3e, 0xcb, 0x54, 0x33, 0xa9, 0x60, 0x52, 0xb9, 0xc5, - 0xe4, 0xa8, 0xb2, 0x01, 0xba, 0xc5, 0x15, 0xdc, 0x86, 0x9c, 0x7d, 0x0e, - 0x59, 0x6b, 0x75, 0xf3, 0xa5, 0x15, 0xa6, 0xac, 0x0f, 0xe8, 0xaa, 0xca, - 0x69, 0xcd, 0xbc, 0xb6, 0x5c, 0xc7, 0x97, 0xed, 0x6f, 0xb6, 0x49, 0xea, - 0x7d, 0xe3, 0xe7, 0xa1, 0x87, 0xb0, 0xd1, 0x85, 0x18, 0x6c, 0xdd, 0xff, - 0x8f, 0x28, 0xd3, 0x9d, 0x19, 0xa3, 0x0b, 0x18, 0x55, 0x05, 0x7a, 0xb0, - 0x09, 0xce, 0xca, 0x9f, 0xb3, 0x35, 0x5b, 0x11, 0xd7, 0x05, 0xf3, 0xd2, - 0x88, 0xaf, 0x02, 0xcc, 0xb9, 0x6d, 0x8b, 0x8e, 0x81, 0xe7, 0x6d, 0xa0, - 0xd9, 0xd1, 0xa9, 0x7c, 0x7e, 0x09, 0x62, 0x38, 0xa3, 0x73, 0x43, 0x38, - 0x89, 0x4a, 0x76, 0xb6, 0xcb, 0xd2, 0xbd, 0x95, 0xd5, 0x0b, 0x8b, 0xc0, - 0x84, 0xbb, 0x6a, 0xcf, 0xc7, 0xb3, 0x82, 0x21, 0x00, 0x8d, 0xdc, 0xd3, - 0x50, 0xdf, 0x7a, 0x0b, 0x3e, 0xa4, 0xe8, 0x44, 0xcc, 0x25, 0x2c, 0x78, - 0x05, 0x60, 0xb1, 0xf8, 0x9d, 0x00, 0x1f, 0xfb, 0xe1, 0xb6, 0x4d, 0x8f, - 0x46, 0x42, 0xd5, 0x57, 0xc4, 0x49, 0xc8, 0x94, 0x44, 0xe5, 0xee, 0x65, - 0x86, 0x98, 0x15, 0xa2, 0xad, 0x27, 0x11, 0x22, 0xb0, 0xfc, 0xac, 0xa0, - 0x97, 0x4e, 0x51, 0x97, 0x10, 0xa7, 0x37, 0xde, 0x6a, 0xa9, 0x32, 0x1d, - 0x2a, 0x89, 0xd9, 0xd0, 0x6a, 0x27, 0xcb, 0xe3, 0x9d, 0x42, 0x13, 0xb2, - 0xa4, 0x1e, 0x70, 0x41, 0x86, 0xe8, 0x47, 0x3a, 0x86, 0xfd, 0xb5, 0x11, - 0xd1, 0x62, 0x15, 0xb6, 0xd8, 0xdd, 0x62, 0x7e, 0x1e, 0x92, 0xf1, 0x3a, - 0x38, 0x0c, 0x26, 0xfd, 0x4e, 0x64, 0x31, 0xdf, 0x40, 0x70, 0x51, 0xa5, - 0x79, 0xb3, 0x7e, 0xc2, 0x72, 0x4b, 0x8a, 0x85, 0x86, 0x9a, 0x97, 0x5f, - 0x16, 0xcd, 0x18, 0x3d, 0x59, 0x4e, 0x27, 0x9a, 0x05, 0x57, 0x9f, 0x75, - 0xf4, 0x67, 0x9b, 0x0f, 0x6c, 0x5d, 0x17, 0xaa, 0x77, 0xc1, 0xc5, 0x13, - 0xc3, 0x70, 0x29, 0x38, 0xe8, 0x8a, 0x8e, 0x60, 0xc4, 0x52, 0x04, 0xdf, - 0xe5, 0x90, 0xe3, 0x60, 0xea, 0xd4, 0x85, 0x74, 0xe8, 0x76, 0x3e, 0x1d, - 0xa8, 0xaf, 0x31, 0x47, 0x18, 0x60, 0xe2, 0xc4, 0x66, 0x9f, 0x30, 0x5e, - 0xb6, 0x49, 0x4a, 0x35, 0x2a, 0x8b, 0x48, 0x65, 0xfd, 0x34, 0x6e, 0x0b, - 0xa3, 0xd3, 0x1e, 0x25, 0x99, 0x24, 0x0a, 0x8c, 0x7c, 0x52, 0x02, 0x93, - 0x89, 0x98, 0x84, 0xee, 0x11, 0xe1, 0x12, 0xf9, 0x0a, 0x96, 0xeb, 0x46, - 0x94, 0x8f, 0x15, 0x0e, 0xb1, 0xcc, 0xe2, 0x28, 0x4e, 0x58, 0xe2, 0x86, - 0x68, 0xc4, 0x62, 0xa0, 0xff, 0xc6, 0x85, 0x2b, 0x90, 0xbb, 0x9e, 0x83, - 0x21, 0xc0, 0x68, 0xd5, 0xf2, 0x93, 0xcc, 0x2f, 0xf9, 0x5f, 0x86, 0x51, - 0xff, 0x4e, 0xd1, 0xc8, 0x13, 0x71, 0x04, 0x03, 0x78, 0x59, 0x43, 0x32, - 0x4e, 0xa2, 0xd7, 0xab, 0x11, 0xf1, 0xfd, 0x64, 0x95, 0xfe, 0x97, 0xfc, - 0x6a, 0x80, 0x0a, 0x96, 0xc9, 0x81, 0x7b, 0xdf, 0x07, 0x49, 0xf4, 0x24, - 0x15, 0x2b, 0x86, 0x13, 0x38, 0x15, 0x6e, 0xac, 0x5d, 0x9b, 0xcf, 0xc7, - 0xb1, 0x2f, 0xfd, 0x63, 0xff, 0x40, 0xfa, 0x17, 0xa1, 0x5e, 0x07, 0x34, - 0x59, 0xed, 0xa3, 0xc7, 0x1a, 0xc4, 0xa3, 0xd3, 0xcc, 0xfa, 0xdb, 0xab, - 0x96, 0x93, 0x36, 0x76, 0x4a, 0x1d, 0x9e, 0x68, 0x66, 0xba, 0x98, 0xb4, - 0x5b, 0x38, 0x78, 0x2f, 0x7a, 0x25, 0x27, 0xdb, 0x00, 0xb7, 0xa5, 0x1e, - 0x51, 0x6c, 0xf3, 0x94, 0xd7, 0x70, 0xc5, 0x80, 0xe3, 0xad, 0x76, 0x20, - 0x59, 0x3f, 0x46, 0xce, 0x01, 0x4b, 0xac, 0x09, 0x94, 0xd9, 0x51, 0x1c, - 0x9e, 0xc5, 0xf4, 0xe0, 0xe3, 0xf9, 0xcb, 0xa0, 0xe6, 0x13, 0x4c, 0x15, - 0xec, 0x72, 0x96, 0x9f, 0x79, 0x37, 0x33, 0x02, 0x0b, 0xb8, 0xa5, 0xda, - 0x32, 0xb6, 0x01, 0x32, 0x2f, 0x18, 0xc3, 0x9f, 0xfe, 0xc8, 0x83, 0xfa, - 0x7f, 0x01, 0xce, 0x19, 0xc9, 0x4e, 0xd4, 0x4b, 0xe4, 0x33, 0xbc, 0x80, - 0x30, 0x40, 0xf1, 0xac, 0x66, 0xf1, 0x7a, 0x35, 0x2d, 0x3c, 0x15, 0x5e, - 0xf4, 0xe7, 0xdf, 0xc7, 0x09, 0x67, 0x87, 0x94, 0x0a, 0x2b, 0x19, 0x38, - 0x0a, 0x31, 0x6d, 0xfc, 0x44, 0x56, 0x4a, 0xa0, 0x45, 0xac, 0xdd, 0x10, - 0x9b, 0xa8, 0x3e, 0x56, 0xc6, 0x00, 0x1f, 0x08, 0x8a, 0x2f, 0xdb, 0x53, - 0xa5, 0x7c, 0xfb, 0xdf, 0xae, 0x81, 0x0a, 0xbd, 0x0c, 0xfc, 0x87, 0xd0, - 0xde, 0x89, 0x99, 0x6f, 0x68, 0x49, 0x5a, 0x86, 0x4b, 0xc0, 0xf2, 0xe0, - 0x03, 0x65, 0x0f, 0x25, 0x5a, 0xa5, 0x87, 0x23, 0xfa, 0xa1, 0x1d, 0xda, - 0xc2, 0x9a, 0x88, 0x40, 0xf7, 0xca, 0xa5, 0x2c, 0x72, 0x34, 0x32, 0x38, - 0xeb, 0xca, 0xb9, 0x11, 0x12, 0x3f, 0x94, 0xb7, 0xa6, 0xef, 0xdb, 0x92, - 0xfd, 0x9c, 0xd8, 0xd5, 0x81, 0x19, 0xa1, 0xef, 0x82, 0x29, 0xed, 0x4c, - 0x72, 0xfd, 0x81, 0xfb, 0x43, 0xba, 0xef, 0xe9, 0xf2, 0xb6, 0x59, 0x40, - 0xcb, 0x6e, 0xa4, 0xfb, 0x16, 0xa6, 0x69, 0x67, 0x69, 0xbf, 0x6f, 0x9c, - 0x9a, 0x11, 0xff, 0xcc, 0x34, 0xdf, 0x83, 0x7c, 0x25, 0x24, 0xc9, 0xe1, - 0x10, 0xa3, 0xfd, 0xfa, 0x84, 0x32, 0x53, 0x3c, 0xcb, 0x2d, 0x98, 0x90, - 0x7a, 0x11, 0xb9, 0x50, 0x38, 0x6a, 0x38, 0x71, 0x0b, 0xb2, 0xbe, 0x58, - 0xfd, 0x8a, 0x1a, 0xde, 0xac, 0x51, 0x2a, 0xd3, 0x2e, 0xc4, 0xf6, 0xb2, - 0x0f, 0x5b, 0xb0, 0x1d, 0x65, 0xb7, 0xe7, 0x25, 0xb0, 0x90, 0x4b, 0x14, - 0xd5, 0xc0, 0xc7, 0x76, 0xce, 0x06, 0x01, 0x8a, 0xa4, 0x10, 0xd3, 0x65, - 0x5d, 0x61, 0x28, 0x56, 0x09, 0x9b, 0xda, 0xaf, 0xc8, 0xfc, 0x96, 0x31, - 0x2c, 0xb8, 0xa0, 0xd5, 0xd1, 0xb9, 0xca, 0xca, 0xb7, 0xbe, 0x60, 0x76, - 0x20, 0x06, 0xc6, 0xec, 0x40, 0x19, 0x2d, 0xd9, 0x57, 0x7b, 0xa1, 0x7f, - 0x57, 0xed, 0xb8, 0xc9, 0x33, 0x97, 0x88, 0x29, 0xd9, 0x18, 0xee, 0xb0, - 0x25, 0xed, 0x13, 0x34, 0x91, 0x65, 0x54, 0x4a, 0x20, 0x54, 0xdd, 0x3f, - 0x80, 0x30, 0xa7, 0x5f, 0xe0, 0xbb, 0x9e, 0x8c, 0x6a, 0xbb, 0x5b, 0xeb, - 0x67, 0xd5, 0xba, 0xa1, 0xc1, 0xdd, 0xe9, 0x31, 0x7f, 0x99, 0x45, 0x7c, - 0x07, 0x15, 0xe6, 0x8c, 0xa8, 0x0e, 0xa0, 0x53, 0x6f, 0xa0, 0xb3, 0x3b, - 0x81, 0xb4, 0x44, 0xa7, 0x47, 0xf1, 0xc4, 0xb2, 0xbb, 0xc1, 0x98, 0x1a, - 0x39, 0x46, 0xf6, 0x69, 0x62, 0xef, 0x70, 0xcd, 0x7b, 0x92, 0x29, 0x6a, - 0x16, 0x32, 0xfb, 0x79, 0x20, 0xce, 0x21, 0x56, 0xff, 0xb2, 0x5e, 0x70, - 0x18, 0xbd, 0xcc, 0x4e, 0xa7, 0xae, 0xcc, 0xd5, 0x1a, 0x06, 0xeb, 0x76, - 0xdf, 0x9b, 0x62, 0xa0, 0xd4, 0x65, 0x38, 0xf3, 0x0c, 0x32, 0x0b, 0x1b, - 0x3a, 0x6a, 0x1d, 0x69, 0xe1, 0xaa, 0x70, 0xfc, 0x1b, 0x0f, 0x82, 0x53, - 0x0f, 0x01, 0x2b, 0x7d, 0xd5, 0x86, 0x2d, 0x97, 0x13, 0xdb, 0x07, 0x9a, - 0x04, 0x14, 0x82, 0xf8, 0xe6, 0x52, 0x0f, 0x47, 0xb2, 0xc1, 0xd3, 0x49, - 0x1c, 0x32, 0x2d, 0x2d, 0x77, 0xc7, 0x2b, 0x7e, 0x19, 0xf7, 0xc3, 0x56, - 0xc9, 0x5b, 0xae, 0xc0, 0xd0, 0x3d, 0xb8, 0xc5, 0x8c, 0x73, 0xcc, 0x99, - 0xad, 0xbb, 0xaf, 0xde, 0x2f, 0x96, 0x14, 0x8e, 0xf4, 0x9c, 0xdd, 0x71, - 0xf9, 0x07, 0x64, 0x2f, 0xed, 0x39, 0x55, 0x4f, 0x1b, 0x77, 0x00, 0xfa, - 0x93, 0x57, 0xf0, 0x69, 0xee, 0x27, 0x5c, 0xe8, 0x51, 0x15, 0xca, 0x9a, - 0xb5, 0xea, 0x18, 0x09, 0x11, 0xcf, 0x91, 0xec, 0xff, 0xa4, 0xdf, 0x46, - 0x6b, 0x32, 0x90, 0x13, 0xcb, 0x46, 0x6d, 0xd1, 0xb1, 0xf5, 0xc9, 0xf1, - 0xf0, 0x51, 0xbe, 0x81, 0xa5, 0xe5, 0x68, 0xe5, 0x00, 0x83, 0x8e, 0x29, - 0xd4, 0xd3, 0x5b, 0xdc, 0xb5, 0x48, 0xc3, 0xab, 0x51, 0x21, 0x6d, 0x18, - 0x44, 0x09, 0x5a, 0x17, 0xb7, 0xe7, 0x00, 0xd3, 0x92, 0x05, 0x6d, 0xb0, - 0xfc, 0xed, 0x2d, 0x1b, 0x59, 0xf3, 0x67, 0x74, 0x33, 0x12, 0x6b, 0xaf, - 0x8d, 0x20, 0x6c, 0x14, 0x7f, 0x80, 0xf7, 0xcb, 0x63, 0xad, 0x28, 0x81, - 0x5f, 0xac, 0xd8, 0x99, 0xd7, 0xde, 0xf9, 0x20, 0x40, 0x53, 0x61, 0x9e, - 0x63, 0x7f, 0x6c, 0xb7, 0xf8, 0x03, 0x23, 0xd1, 0x23, 0xb4, 0xf5, 0x11, - 0xdd, 0x14, 0xdb, 0xcc, 0xf1, 0xa4, 0x23, 0x28, 0x0d, 0x45, 0xcd, 0x1a, - 0x66, 0xc5, 0x88, 0x99, 0x9d, 0x92, 0xb1, 0xf7, 0x76, 0xbd, 0x88, 0xf0, - 0xa9, 0xae, 0x9f, 0x91, 0xa5, 0x4f, 0x79, 0x3d, 0x10, 0x02, 0x78, 0xd6, - 0x11, 0x43, 0xdf, 0x01, 0xc4, 0x0c, 0xf7, 0xca, 0x70, 0x03, 0xec, 0x5d, - 0x12, 0x6e, 0x66, 0x60, 0x9c, 0x07, 0xf4, 0x39, 0x50, 0x32, 0x19, 0x6a, - 0xa4, 0xe3, 0xcf, 0x74, 0xde, 0xb0, 0x98, 0xf6, 0x55, 0x55, 0xa4, 0xf0, - 0x40, 0x5c, 0xce, 0xcf, 0x85, 0x2e, 0xe4, 0x68, 0xae, 0x5c, 0x06, 0x7d, - 0x5c, 0xab, 0x20, 0x80, 0x9e, 0x4e, 0xbf, 0x78, 0x0c, 0xb9, 0xb8, 0xd4, - 0xd4, 0x3e, 0xa7, 0x21, 0xc9, 0x2c, 0x49, 0xc9, 0x32, 0x37, 0x24, 0x51, - 0xf4, 0x86, 0xe1, 0x2c, 0x99, 0xfb, 0x7c, 0xbb, 0x17, 0x94, 0x26, 0xf5, - 0x75, 0xce, 0x10, 0x10, 0x41, 0x42, 0xf7, 0xee, 0xf2, 0xaf, 0xa3, 0x39, - 0x7d, 0x3b, 0xe4, 0x6d, 0x2b, 0x2c, 0x23, 0xa5, 0xdb, 0x4f, 0x93, 0x5d, - 0x89, 0x89, 0x6f, 0x7a, 0xc2, 0x44, 0xcf, 0xe7, 0x05, 0xc4, 0x20, 0x43, - 0x11, 0xf1, 0xa2, 0xe4, 0x59, 0x41, 0x69, 0x48, 0xd5, 0x87, 0x3e, 0x4b, - 0x8d, 0xf4, 0xca, 0x02, 0x02, 0xb5, 0xfb, 0xc2, 0x1b, 0x48, 0xe5, 0xfb, - 0x8f, 0x8b, 0x57, 0xf4, 0xf5, 0x1d, 0xad, 0x0d, 0x45, 0x9b, 0xcb, 0xc7, - 0xbf, 0xfb, 0x73, 0x4b, 0xfd, 0x63, 0x12, 0x50, 0x09, 0xdf, 0x53, 0x45, - 0xdb, 0xe8, 0x8f, 0x90, 0x70, 0x8e, 0x5a, 0xe9, 0xb6, 0xc5, 0xdb, 0x19, - 0xf2, 0x4a, 0x03, 0x0d, 0xe6, 0xbe, 0x8d, 0xff, 0xfe, 0x98, 0xf6, 0x81, - 0x37, 0xcb, 0xb1, 0xd0, 0xb1, 0xf1, 0x28, 0x95, 0xfd, 0x24, 0xa7, 0xd3, - 0xba, 0x5b, 0x6a, 0x15, 0x55, 0xe9, 0x2f, 0x9e, 0x46, 0xc0, 0x48, 0x64, - 0x33, 0xaf, 0x1c, 0x43, 0x21, 0x6f, 0xa5, 0x31, 0xdc, 0x8f, 0xad, 0x9a, - 0x75, 0x0f, 0x2c, 0xae, 0x0c, 0x41, 0xfb, 0xbf, 0xf7, 0xc9, 0x4f, 0x2f, - 0x02, 0xb5, 0xe0, 0xd7, 0xe7, 0x20, 0xde, 0x0f, 0xd3, 0x1d, 0xe7, 0x66, - 0x23, 0xaa, 0xd1, 0x0c, 0x04, 0x0e, 0xa5, 0x78, 0x51, 0x4a, 0xbd, 0x81, - 0x34, 0xce, 0x45, 0x68, 0x2b, 0xf4, 0xec, 0x79, 0xa5, 0xf2, 0xb5, 0x17, - 0x84, 0xdb, 0x2d, 0xad, 0x2a, 0xe1, 0x8a, 0xcf, 0x49, 0xb7, 0x61, 0x63, - 0x90, 0x31, 0xee, 0x10, 0x99, 0x4e, 0xb0, 0x54, 0x8e, 0xd7, 0xa5, 0x77, - 0x2c, 0x73, 0xfd, 0x55, 0xba, 0x89, 0x30, 0xd2, 0x31, 0x13, 0x3a, 0xe6, - 0x2f, 0x23, 0x3a, 0xb6, 0x38, 0x4c, 0xc0, 0x54, 0xf2, 0x56, 0xfe, 0x53, - 0x03, 0xe1, 0xef, 0xdd, 0xa9, 0x04, 0xc2, 0xa2, 0xac, 0x47, 0x7e, 0xb5, - 0x4f, 0x67, 0x90, 0xeb, 0x38, 0x03, 0xd8, 0x2f, 0xb9, 0xc1, 0xef, 0x66, - 0x88, 0x5e, 0x3b, 0x14, 0xa4, 0x3c, 0xcb, 0x81, 0x89, 0xed, 0xa3, 0x1a, - 0x13, 0xbd, 0x6e, 0x78, 0x0a, 0xa3, 0x57, 0xf4, 0x1d, 0xb3, 0x63, 0xcb, - 0x23, 0x24, 0x6a, 0x8e, 0xea, 0x5d, 0x1f, 0x6a, 0x3e, 0x6d, 0x41, 0xb4, - 0x78, 0x52, 0x8c, 0xf2, 0xc0, 0x88, 0x5c, 0x1f, 0xd9, 0x46, 0x62, 0xc0, - 0x56, 0x0b, 0xd3, 0x98, 0xab, 0x33, 0x9a, 0xd1, 0x3d, 0xf6, 0x26, 0x8c, - 0xf4, 0xb0, 0xaf, 0xf4, 0x25, 0xed, 0x52, 0x7b, 0xe8, 0x4c, 0xff, 0x07, - 0x52, 0x88, 0x9d, 0x8e, 0x48, 0x86, 0xb8, 0xdf, 0xb7, 0x95, 0xba, 0x35, - 0x94, 0xf8, 0x59, 0xf4, 0x94, 0xff, 0x79, 0x26, 0x1a, 0x3b, 0x76, 0x16, - 0x15, 0x19, 0xcb, 0x1f, 0x1b, 0x3d, 0xb0, 0xfe, 0x59, 0x6a, 0x5f, 0x1a, - 0xe1, 0x83, 0xa5, 0x12, 0xcf, 0x52, 0x90, 0x91, 0x4b, 0xe3, 0x5c, 0x31, - 0x70, 0xcc, 0x8f, 0x68, 0x0a, 0x3e, 0x0e, 0x44, 0x0e, 0x84, 0x2a, 0x12, - 0xfd, 0xea, 0xd3, 0x6c, 0x41, 0x52, 0xf0, 0xcc, 0xe7, 0x0f, 0x0d, 0xef, - 0x6c, 0x9c, 0x11, 0xd9, 0x91, 0x72, 0xdc, 0xd5, 0x94, 0xa2, 0xa3, 0xf1, - 0x11, 0x6a, 0x85, 0x9a, 0x5a, 0xe8, 0x3c, 0xef, 0x21, 0x4d, 0x1d, 0x41, - 0xdf, 0x2f, 0x99, 0xcd, 0x5a, 0x47, 0xa6, 0x7b, 0xb6, 0xc6, 0x75, 0x1f, - 0x21, 0x62, 0x7b, 0xe9, 0xbc, 0x37, 0xfb, 0x6b, 0x75, 0x91, 0x01, 0x7e, - 0x87, 0x85, 0x2c, 0xa7, 0x1f, 0xbf, 0x39, 0x3d, 0xa5, 0xcb, 0x24, 0x56, - 0x09, 0x0a, 0x8b, 0xd8, 0x32, 0xa0, 0x32, 0x51, 0xfa, 0x06, 0x30, 0xbd, - 0x8e, 0x69, 0xe7, 0x7c, 0x4b, 0x09, 0x0b, 0x5c, 0x8c, 0x3f, 0x8a, 0x76, - 0x8f, 0x2b, 0x24, 0x0b, 0xf2, 0xfe, 0x11, 0x3b, 0x39, 0xb5, 0x57, 0xfd, - 0x40, 0x42, 0xf6, 0xce, 0xe6, 0xa5, 0x84, 0xd5, 0xc7, 0x58, 0x14, 0xb7, - 0x3b, 0x03, 0xeb, 0x07, 0xad, 0xdf, 0x5f, 0xeb, 0xcc, 0xa5, 0x02, 0x38, - 0xeb, 0x68, 0xed, 0x8b, 0x4a, 0x6e, 0x6a, 0xa8, 0x5e, 0xd6, 0xe8, 0x35, - 0x70, 0x2e, 0x8f, 0xa8, 0x42, 0x92, 0x2f, 0xf1, 0x45, 0x85, 0x33, 0xc5, - 0xfb, 0x30, 0xb2, 0x34, 0x33, 0x94, 0xcf, 0x01, 0xc8, 0xbb, 0x5b, 0x94, - 0x7f, 0x48, 0xcf, 0x4a, 0xca, 0xd8, 0xa1, 0x4b, 0x84, 0xf8, 0x46, 0xae, - 0x9c, 0x3a, 0xe2, 0xa5, 0x96, 0xd0, 0x55, 0xfa, 0x55, 0xc5, 0x84, 0xeb, - 0x70, 0xcc, 0x99, 0x71, 0xe0, 0x1e, 0x13, 0x34, 0xaa, 0x45, 0xd0, 0x4c, - 0x9a, 0x7a, 0x2c, 0x6a, 0x0b, 0x7c, 0x2d, 0x90, 0x1a, 0x4a, 0x68, 0x52, - 0xf3, 0xc4, 0xf4, 0xf4, 0xdd, 0x44, 0xf2, 0x68, 0xa5, 0xdc, 0x6b, 0x6a, - 0xc6, 0xf4, 0xde, 0x5b, 0x13, 0x4c, 0x12, 0x26, 0x65, 0xe8, 0x2d, 0x19, - 0xae, 0xe2, 0x35, 0x3d, 0x55, 0x7b, 0x94, 0xb8, 0xa0, 0xc5, 0xe1, 0x24, - 0xdb, 0xfe, 0x58, 0x33, 0xe5, 0xa6, 0xf5, 0x93, 0xba, 0x29, 0x33, 0x25, - 0xc1, 0xfc, 0x4d, 0x07, 0x14, 0x22, 0x3a, 0xa3, 0x15, 0xe9, 0x1d, 0x45, - 0xa6, 0x45, 0x0c, 0x8c, 0x62, 0x4c, 0x25, 0xa6, 0xef, 0xc9, 0xf1, 0x21, - 0x5e, 0x80, 0x8b, 0xda, 0xd7, 0xf5, 0xd7, 0x93, 0xe4, 0x54, 0x30, 0xd5, - 0x18, 0x00, 0x0b, 0x42, 0xe8, 0x0d, 0xa6, 0xfc, 0xf4, 0x20, 0x13, 0x26, - 0xed, 0x6c, 0x23, 0x7d, 0xf4, 0x40, 0xfb, 0x67, 0x11, 0x79, 0x0f, 0x34, - 0x91, 0x21, 0xa8, 0x15, 0xbe, 0x46, 0x10, 0x85, 0xb4, 0xf1, 0x04, 0x0f, - 0xf2, 0x00, 0x8e, 0xbc, 0x0c, 0xdd, 0x1b, 0x3b, 0xd7, 0xa8, 0x20, 0x2c, - 0x9b, 0x78, 0xaf, 0xe7, 0x55, 0xa6, 0xb8, 0x7b, 0xba, 0xff, 0x96, 0xdb, - 0x23, 0xd8, 0x9e, 0xa6, 0x6c, 0x47, 0x97, 0x5e, 0x6c, 0x68, 0x82, 0xc2, - 0x6e, 0x4d, 0x0d, 0xb8, 0x1a, 0xc0, 0x47, 0x48, 0x87, 0x01, 0x6b, 0xf0, - 0x75, 0x4a, 0x02, 0xc4, 0x12, 0xcb, 0x8a, 0xda, 0xe7, 0x0f, 0x7a, 0xed, - 0x8d, 0x2f, 0xbc, 0xf8, 0xb1, 0xed, 0x00, 0x79, 0xf7, 0x28, 0x17, 0x8e, - 0xc1, 0x97, 0x90, 0x96, 0x39, 0x1f, 0xea, 0x71, 0x25, 0x64, 0x39, 0x7e, - 0x67, 0xd1, 0x35, 0x74, 0x16, 0xa6, 0x35, 0xd2, 0x84, 0x21, 0xe5, 0x50, - 0xf5, 0xa9, 0x6e, 0x23, 0x57, 0xf1, 0x65, 0xac, 0x5c, 0xc5, 0xaa, 0x84, - 0x2c, 0x17, 0xf3, 0xbf, 0xb9, 0xfe, 0xfb, 0x5e, 0x34, 0xc9, 0x1c, 0x65, - 0xcb, 0x8b, 0x32, 0xc5, 0x65, 0x26, 0xc8, 0xdb, 0x90, 0xf0, 0xd5, 0xaa, - 0x6c, 0xc5, 0xa8, 0x6c, 0x05, 0x80, 0x35, 0x04, 0xba, 0x03, 0xfd, 0x91, - 0xaf, 0xdb, 0x08, 0x8a, 0x52, 0x23, 0xcb, 0x29, 0xf1, 0x22, 0x05, 0xeb, - 0x29, 0xbb, 0xb5, 0xd6, 0x2b, 0xc3, 0xc9, 0x17, 0x1f, 0x93, 0x5d, 0xa7, - 0x8b, 0xb6, 0x4d, 0xb2, 0x26, 0xb6, 0x74, 0x56, 0x04, 0x2c, 0xc1, 0xff, - 0x93, 0x3f, 0x69, 0xf2, 0xf7, 0xe0, 0x76, 0x93, 0x79, 0x82, 0xe8, 0x3d, - 0x04, 0x4a, 0x01, 0x15, 0xdd, 0x68, 0x4a, 0x37, 0x6b, 0x59, 0xae, 0x42, - 0x43, 0x13, 0x76, 0xc0, 0xf8, 0x4f, 0xd5, 0x3b, 0xa9, 0x42, 0x10, 0x7a, - 0x72, 0xa8, 0x6b, 0x54, 0xc8, 0x18, 0x0c, 0x12, 0x5e, 0x96, 0xfc, 0x54, - 0x4f, 0xd7, 0xde, 0xdc, 0x25, 0xb9, 0xf2, 0x8c, 0x65, 0x16, 0x58, 0x5c, - 0x5e, 0x91, 0x7c, 0x6c, 0xee, 0x1c, 0xb5, 0x0f, 0xee, 0x87, 0x6b, 0x41, - 0x5a, 0x02, 0x61, 0xe8, 0xad, 0x02, 0x14, 0x34, 0x5c, 0xde, 0xed, 0x7e, - 0xbf, 0x22, 0x50, 0xfb, 0xd7, 0x05, 0x79, 0xe8, 0xd7, 0x21, 0x6f, 0x8e, - 0xcb, 0xd0, 0x31, 0xe3, 0xd6, 0xa1, 0x85, 0xd9, 0xd9, 0x20, 0x69, 0xcf, - 0xb5, 0xf7, 0x58, 0x92, 0xd9, 0xdf, 0x42, 0x0d, 0x29, 0xea, 0xe2, 0x65, - 0xee, 0x32, 0x2a, 0x8e, 0x08, 0x2a, 0x39, 0x62, 0x11, 0x4c, 0x06, 0x10, - 0x4b, 0xbd, 0x03, 0x8c, 0x48, 0xa6, 0x34, 0xd2, 0x4b, 0x6e, 0x3b, 0x3b, - 0xdb, 0xfe, 0xd7, 0x75, 0x65, 0x5c, 0xd8, 0xbe, 0x6a, 0x41, 0x6f, 0x1f, - 0x94, 0x19, 0xb6, 0x2c, 0xbc, 0xf1, 0x26, 0xc3, 0x78, 0x9d, 0x96, 0x46, - 0x25, 0xde, 0x29, 0x04, 0x8a, 0x19, 0xe4, 0xd4, 0x45, 0xc4, 0xbd, 0xd2, - 0x2c, 0x5a, 0xff, 0xcf, 0x35, 0xc3, 0x97, 0x87, 0x11, 0xbe, 0x31, 0x99, - 0x3b, 0x1d, 0xa6, 0xeb, 0x4a, 0xb6, 0x76, 0x94, 0xba, 0x53, 0xac, 0xdb, - 0xf3, 0x7d, 0x69, 0x7a, 0x8d, 0x34, 0x39, 0xa3, 0x85, 0x18, 0xd2, 0xaf, - 0x10, 0x4e, 0x95, 0xbc, 0x1e, 0x79, 0xb6, 0x7e, 0x17, 0xdb, 0x6b, 0x8b, - 0xa0, 0x00, 0x8c, 0x07, 0x91, 0x6d, 0x6f, 0xec, 0xdd, 0x98, 0x85, 0xad, - 0x6c, 0x87, 0x97, 0xcf, 0xdf, 0xad, 0x3e, 0x6e, 0x47, 0x7f, 0xda, 0x4f, - 0x5b, 0x81, 0x22, 0x9a, 0x00, 0x81, 0x2a, 0x4c, 0x3e, 0x1f, 0xcf, 0x49, - 0xff, 0x64, 0x98, 0x49, 0x77, 0x18, 0x12, 0xcd, 0x59, 0x56, 0xb5, 0xca, - 0xf7, 0x02, 0x1f, 0x7c, 0x9a, 0x4c, 0xa6, 0xb5, 0xf3, 0x51, 0xbc, 0x9d, - 0x04, 0x1f, 0x73, 0x4e, 0xf2, 0x4e, 0xc3, 0x0f, 0x54, 0x72, 0xe9, 0x57, - 0x8b, 0x05, 0x28, 0xad, 0xb0, 0xc6, 0x9c, 0xde, 0x47, 0x6f, 0x74, 0xe7, - 0x62, 0x5f, 0x91, 0xc8, 0x7d, 0xca, 0x0c, 0x0f, 0xcf, 0x57, 0xcf, 0xe8, - 0x69, 0x85, 0x62, 0x18, 0xe2, 0xa5, 0x50, 0x26, 0xbf, 0xdc, 0x00, 0x2a, - 0xde, 0x95, 0x51, 0x20, 0xb8, 0x25, 0x7d, 0x4a, 0x76, 0xf0, 0x9d, 0x2f, - 0x24, 0x71, 0x45, 0x07, 0x58, 0x65, 0xab, 0x3b, 0xca, 0x6a, 0xb6, 0xb4, - 0x27, 0x35, 0x9d, 0x1e, 0x54, 0xb6, 0x89, 0x36, 0x15, 0xa2, 0x10, 0x0a, - 0xe9, 0x13, 0xe3, 0x83, 0xb4, 0x70, 0x95, 0xad, 0xdd, 0x64, 0x20, 0x99, - 0x99, 0xb3, 0xcc, 0x6b, 0x2c, 0x3d, 0x35, 0x21, 0x64, 0x66, 0xea, 0xc8, - 0x61, 0x99, 0xfc, 0x7d, 0x70, 0x9d, 0x7a, 0x4f, 0x65, 0xd4, 0x88, 0x4e, - 0x12, 0x46, 0x03, 0x70, 0xe1, 0x9a, 0xdc, 0xca, 0xe8, 0x8c, 0x6b, 0x91, - 0x44, 0x2c, 0xe6, 0xcc, 0x73, 0xf8, 0xb8, 0x3d, 0x37, 0x5e, 0xbb, 0x1f, - 0x60, 0xdb, 0x9b, 0xa1, 0x76, 0x2c, 0x47, 0xe8, 0xba, 0x24, 0x72, 0xa9, - 0xf5, 0x71, 0xe5, 0x00, 0x43, 0x0e, 0x42, 0x7c, 0xc2, 0x2d, 0xb4, 0x21, - 0xc0, 0x74, 0x4a, 0x78, 0x2a, 0xd4, 0x63, 0xec, 0x9c, 0x35, 0xe3, 0xf9, - 0x1e, 0x9d, 0xd5, 0xdb, 0xe5, 0x3f, 0x02, 0x31, 0x32, 0x59, 0x02, 0xf4, - 0x64, 0x53, 0x4e, 0x35, 0xa9, 0x65, 0x32, 0x01, 0xbd, 0xdf, 0xd7, 0xcc, - 0xec, 0x66, 0xe3, 0xe8, 0xd6, 0x4c, 0x08, 0x50, 0xf9, 0x15, 0x5f, 0xc2, - 0x36, 0xbf, 0x03, 0xab, 0xf7, 0x4f, 0x19, 0xe6, 0x44, 0x8d, 0xbc, 0xc9, - 0x04, 0x79, 0x71, 0xce, 0xfb, 0xa3, 0xbe, 0x67, 0x7c, 0xe0, 0x1a, 0xb1, - 0xb1, 0xb4, 0xe2, 0x22, 0xa7, 0xfe, 0xd9, 0xaf, 0x1f, 0x8a, 0x0c, 0xf2, - 0x2e, 0xc8, 0x3b, 0xe8, 0xd0, 0xbb, 0x32, 0x8f, 0x3d, 0x6f, 0xae, 0x09, - 0xcf, 0x96, 0x40, 0x7f, 0x02, 0x78, 0xa6, 0xff, 0xed, 0x7d, 0x21, 0x3b, - 0x86, 0x9d, 0x40, 0xb7, 0x39, 0x96, 0x96, 0xb2, 0xe5, 0xd6, 0x83, 0xb9, - 0x67, 0xe8, 0x87, 0x34, 0x4d, 0x98, 0xbe, 0x94, 0xfb, 0xdc, 0xf7, 0x1e, - 0x87, 0x86, 0xe4, 0x07, 0xba, 0x2b, 0x83, 0x25, 0xad, 0x47, 0x2e, 0xf2, - 0xa0, 0x44, 0xab, 0x47, 0x99, 0x6c, 0xc1, 0x00, 0x5d, 0x96, 0x01, 0x40, - 0x5d, 0x1f, 0x8b, 0xe0, 0x0e, 0x95, 0xd2, 0xad, 0xba, 0x62, 0x33, 0xab, - 0xbe, 0xb9, 0x34, 0xc7, 0x48, 0x90, 0x6a, 0x77, 0xc5, 0x9a, 0x4e, 0x47, - 0x67, 0x12, 0xca, 0x46, 0xaa, 0xc2, 0xe1, 0xeb, 0x8f, 0x81, 0x6d, 0xa0, - 0x22, 0x4d, 0xb6, 0x3f, 0x36, 0x08, 0xfa, 0xab, 0xc9, 0x2f, 0x27, 0x2b, - 0x0b, 0xca, 0x18, 0xea, 0x35, 0xdb, 0xba, 0xc4, 0x2b, 0xe4, 0x94, 0xa1, - 0x0d, 0x57, 0x16, 0x36, 0x09, 0xc2, 0xcb, 0x2a, 0x97, 0xad, 0xad, 0xc5, - 0x7e, 0x02, 0x2f, 0x87, 0x96, 0x93, 0x2e, 0xe6, 0xc2, 0xfe, 0xae, 0x46, - 0xd8, 0xee, 0x44, 0x87, 0x43, 0x46, 0x8c, 0xca, 0xd3, 0xdb, 0xec, 0xdb, - 0xb0, 0x3c, 0xed, 0xc8, 0xce, 0x8d, 0x23, 0xb3, 0x6a, 0x5b, 0x91, 0xf2, - 0x4b, 0x9d, 0x27, 0x3a, 0x57, 0x78, 0x95, 0xb0, 0x22, 0x20, 0xe2, 0xf1, - 0x15, 0xdc, 0x69, 0x2c, 0xc1, 0xd7, 0x05, 0x72, 0x2b, 0x0e, 0x1e, 0x1b, - 0xb2, 0x02, 0xa5, 0xad, 0x78, 0xcb, 0xf8, 0xeb, 0x92, 0x73, 0x74, 0x2a, - 0xad, 0x26, 0xaa, 0xff, 0xb2, 0x2e, 0x4a, 0x8d, 0xbd, 0x00, 0x1f, 0x95, - 0x15, 0x9d, 0xb1, 0x28, 0x6e, 0x8d, 0x5b, 0x22, 0xaf, 0x18, 0xea, 0x3f, - 0x31, 0x3c, 0x18, 0x88, 0x24, 0xc5, 0xdf, 0x10, 0x3a, 0x35, 0x21, 0x1d, - 0x93, 0x1f, 0x72, 0x65, 0xac, 0x16, 0x6b, 0xce, 0x7c, 0x4d, 0x8b, 0xe8, - 0xd9, 0x3b, 0xb1, 0x54, 0xb9, 0xc7, 0xd5, 0xef, 0x83, 0x44, 0x19, 0x6c, - 0x00, 0xeb, 0xc8, 0x03, 0x00, 0xcd, 0x3d, 0x3d, 0x4d, 0x7f, 0x98, 0x4e, - 0xdf, 0x23, 0x35, 0x1b, 0xb5, 0xae, 0x01, 0x22, 0x81, 0xbc, 0x91, 0x8c, - 0x0e, 0x58, 0xe1, 0xdb, 0x4c, 0xa3, 0x37, 0x7a, 0xf8, 0xcc, 0xce, 0xc0, - 0xd4, 0xb6, 0x69, 0xf2, 0x83, 0xe7, 0xe2, 0x8f, 0x8b, 0x4b, 0x29, 0x32, - 0x20, 0x07, 0xac, 0x47, 0x35, 0x84, 0x12, 0xb2, 0x77, 0x1d, 0x47, 0x8d, - 0xae, 0x0b, 0xb0, 0x1a, 0x79, 0xb0, 0xa1, 0xee, 0x5c, 0xcb, 0x38, 0xa7, - 0x68, 0xb8, 0x04, 0xe0, 0x44, 0x87, 0x7d, 0xa1, 0x43, 0x43, 0xe0, 0xf8, - 0x1b, 0x80, 0x8c, 0xb2, 0xf3, 0x4a, 0x99, 0x65, 0x15, 0xa8, 0x9d, 0x40, - 0x3e, 0x07, 0x3c, 0x7e, 0x09, 0x7a, 0xad, 0xec, 0x76, 0x87, 0x4e, 0xf6, - 0x7b, 0xdf, 0xf2, 0x04, 0x11, 0x19, 0x99, 0x97, 0xf6, 0x51, 0x61, 0x3e, - 0x41, 0x08, 0xb2, 0x20, 0xeb, 0xdf, 0x06, 0x8d, 0x82, 0xef, 0x5e, 0xdb, - 0xc5, 0x01, 0xf9, 0xef, 0xb7, 0x21, 0x93, 0x02, 0x54, 0x52, 0x78, 0x05, - 0x34, 0xd8, 0x1b, 0x1c, 0x6f, 0x9a, 0x53, 0x18, 0x24, 0xf4, 0x77, 0x8b, - 0x82, 0xa4, 0x33, 0x3e, 0xa3, 0x27, 0x0f, 0x6c, 0x32, 0xfa, 0x60, 0x18, - 0xfb, 0x48, 0x43, 0xbd, 0x95, 0x88, 0x27, 0x84, 0x96, 0xfa, 0x11, 0x86, - 0x0d, 0xef, 0xd1, 0x35, 0xe2, 0x41, 0xa7, 0xf2, 0x94, 0x79, 0xe1, 0xae, - 0x1a, 0xc8, 0xe9, 0x00, 0xab, 0xda, 0x8a, 0x92, 0x2f, 0x6f, 0xba, 0xc8, - 0xe8, 0x8a, 0xde, 0xba, 0xc6, 0x76, 0xc6, 0x21, 0x36, 0xbd, 0xb6, 0x1b, - 0xd1, 0x79, 0x52, 0x97, 0x05, 0xd6, 0x7e, 0x45, 0x11, 0x3d, 0x63, 0x50, - 0xa4, 0xed, 0x69, 0x65, 0xaf, 0x95, 0xf9, 0x9c, 0x12, 0xc4, 0x75, 0xb9, - 0x7e, 0xee, 0xca, 0xf7, 0x16, 0xdc, 0x6a, 0xb5, 0x47, 0x45, 0xbe, 0x25, - 0x0d, 0xc7, 0xe6, 0x86, 0xd5, 0xd7, 0x9d, 0x73, 0x70, 0x77, 0x1a, 0x2a, - 0xcb, 0xa8, 0x70, 0x94, 0x29, 0xb7, 0xe7, 0x4d, 0xd0, 0x82, 0x24, 0x99, - 0xc1, 0x1d, 0x28, 0x4b, 0x68, 0x17, 0xd1, 0x62, 0x5e, 0x16, 0x5d, 0x5c, - 0x1d, 0xee, 0xdc, 0xbe, 0x83, 0x9d, 0xdd, 0x08, 0x23, 0x12, 0xff, 0x5f, - 0xee, 0x8c, 0x71, 0x0f, 0x86, 0x1a, 0x77, 0x16, 0x42, 0x8b, 0x9d, 0x46, - 0xd5, 0x5e, 0x55, 0xde, 0x54, 0x3f, 0x29, 0x04, 0x48, 0x86, 0x69, 0xaa, - 0x44, 0x4e, 0x68, 0x68, 0xe8, 0x3d, 0x6c, 0x85, 0xd9, 0xcf, 0x4b, 0x5b, - 0x7b, 0x2d, 0x4f, 0xe1, 0x03, 0x16, 0x01, 0xb5, 0x65, 0x3c, 0xa1, 0xfe, - 0x7b, 0xff, 0x00, 0x3a, 0x65, 0xce, 0xe2, 0x75, 0x27, 0x1a, 0xa6, 0xa1, - 0x04, 0x1d, 0xad, 0xa6, 0xdc, 0x61, 0xe2, 0x81, 0x3c, 0x3d, 0x9b, 0x9b, - 0xa7, 0x30, 0x35, 0x35, 0x26, 0xe9, 0xce, 0x8a, 0x93, 0x91, 0x03, 0xd2, - 0x3f, 0x74, 0x0d, 0x67, 0x6d, 0xaf, 0xdd, 0x2b, 0xed, 0x44, 0x39, 0xdc, - 0x8a, 0x3e, 0x1f, 0x40, 0x83, 0xde, 0xe7, 0x67, 0xb9, 0x46, 0x72, 0xb9, - 0x76, 0x5f, 0xba, 0xcd, 0x95, 0x7c, 0xd4, 0x13, 0x63, 0xf4, 0x6d, 0xca, - 0x69, 0x11, 0xaa, 0x8d, 0x03, 0x2e, 0xe5, 0x8f, 0x74, 0x29, 0xe1, 0x45, - 0x82, 0xec, 0xed, 0x11, 0xa6, 0xa2, 0x47, 0xda, 0xa2, 0xde, 0x55, 0xaa, - 0xc5, 0x80, 0x59, 0x61, 0x7f, 0x77, 0xe7, 0xf6, 0x6d, 0x5e, 0xa8, 0xc9, - 0x9f, 0x23, 0x92, 0x71, 0x5d, 0xdb, 0xfa, 0x1e, 0xf6, 0x38, 0x96, 0xe5, - 0xfa, 0xc7, 0xba, 0x4e, 0x61, 0x7b, 0x4b, 0x42, 0x80, 0xf3, 0x0e, 0xb1, - 0xc2, 0xad, 0x28, 0xd7, 0x38, 0x77, 0xde, 0x94, 0xc0, 0x1c, 0x66, 0x10, - 0x78, 0x16, 0x31, 0x1b, 0x43, 0x30, 0xab, 0x2f, 0x7c, 0xf5, 0x46, 0x6a, - 0x82, 0x27, 0x91, 0xc5, 0x18, 0xc1, 0x55, 0x84, 0x43, 0x65, 0xb0, 0x44, - 0xdc, 0x62, 0xc6, 0x08, 0x88, 0xc1, 0xbd, 0xc7, 0x9d, 0x0a, 0x53, 0x95, - 0xb2, 0xa2, 0x5c, 0x56, 0xf7, 0x94, 0x5c, 0xfe, 0xc5, 0xb2, 0xee, 0xa0, - 0xcc, 0x61, 0x92, 0x6d, 0x0c, 0xbe, 0x30, 0xf2, 0x7d, 0x6f, 0xdf, 0xd2, - 0x00, 0xa1, 0xd6, 0xb7, 0x4c, 0xda, 0x37, 0x6a, 0x2c, 0xe7, 0xfb, 0xd5, - 0xa0, 0xa6, 0x2b, 0x19, 0xdf, 0x77, 0x81, 0x03, 0x06, 0x5b, 0xc1, 0x37, - 0xa0, 0x31, 0x41, 0x56, 0xf5, 0x0c, 0x28, 0x31, 0xb1, 0xa3, 0x25, 0xfe, - 0x05, 0xc8, 0xed, 0x5d, 0x9e, 0x6a, 0xfe, 0xec, 0x2c, 0x8b, 0x02, 0xe8, - 0x42, 0xa1, 0x4e, 0x36, 0x06, 0x82, 0x4c, 0xc4, 0x2b, 0x4d, 0xaf, 0xce, - 0x5c, 0x34, 0xfa, 0x45, 0x6a, 0x38, 0xde, 0x07, 0xc8, 0x62, 0x28, 0xfb, - 0x27, 0x9c, 0xba, 0x80, 0x33, 0xee, 0x38, 0xba, 0xa2, 0xcc, 0x71, 0x97, - 0xbe, 0x99, 0x0f, 0x2c, 0x3c, 0x6d, 0xae, 0x48, 0x3b, 0x4f, 0x02, 0x12, - 0x4f, 0xcf, 0x99, 0x35, 0x37, 0x92, 0xf0, 0x24, 0xcb, 0x52, 0x68, 0x4b, - 0xa8, 0x93, 0x2e, 0x72, 0x75, 0xa7, 0xa3, 0x58, 0x6b, 0x7e, 0xaa, 0x00, - 0x8b, 0x14, 0xc5, 0x5d, 0x44, 0x46, 0xac, 0xf9, 0xe6, 0x80, 0x76, 0x12, - 0xb0, 0x81, 0x98, 0x22, 0x7f, 0x4c, 0x96, 0xda, 0x69, 0xa4, 0x94, 0x8a, - 0xe5, 0x6a, 0xac, 0xca, 0xa1, 0x32, 0x32, 0xa6, 0x56, 0x94, 0xa2, 0x0e, - 0x58, 0x41, 0x5a, 0x80, 0xef, 0xa4, 0xe6, 0xd2, 0x1e, 0x13, 0xfe, 0x7f, - 0x18, 0x9a, 0x2f, 0x0b, 0xac, 0x36, 0xd3, 0x5d, 0x03, 0x53, 0xe0, 0xe2, - 0x8c, 0x7d, 0x86, 0x54, 0x54, 0xf7, 0x92, 0xf9, 0xdc, 0x58, 0xc0, 0xb2, - 0xd3, 0x34, 0x39, 0xb0, 0xb5, 0x9a, 0xf4, 0x80, 0xe3, 0x5a, 0x93, 0x15, - 0xca, 0x2b, 0xee, 0xb9, 0xe6, 0xc7, 0xf0, 0xb5, 0x72, 0xa0, 0xb9, 0xdd, - 0xe4, 0xf3, 0xa0, 0x91, 0xe1, 0x0f, 0xd7, 0x10, 0x0d, 0x17, 0x50, 0x39, - 0x7b, 0x88, 0xdf, 0x36, 0x4e, 0x3e, 0x6c, 0x24, 0xc4, 0x7f, 0x05, 0x0a, - 0xe8, 0x59, 0x92, 0x16, 0x90, 0xef, 0x5c, 0xd3, 0xbc, 0xd1, 0xee, 0x65, - 0x8d, 0x71, 0xde, 0x03, 0xe9, 0xa8, 0x6e, 0x84, 0x12, 0x99, 0xf2, 0xdd, - 0x26, 0xd4, 0xd5, 0x10, 0x2f, 0x8e, 0x36, 0x58, 0x0e, 0x27, 0x81, 0x6a, - 0x3a, 0x7a, 0xd7, 0x9f, 0xa0, 0x7b, 0xca, 0xdc, 0x2b, 0x8b, 0x9c, 0xf5, - 0x32, 0xcc, 0x89, 0x73, 0x57, 0x93, 0x0f, 0xa5, 0x9e, 0x1e, 0x26, 0x97, - 0x7d, 0x6b, 0xb3, 0x4d, 0xb7, 0x84, 0xa7, 0xbb, 0xf0, 0xc8, 0x6f, 0xf1, - 0x64, 0x03, 0x45, 0x19, 0x5b, 0xca, 0xbf, 0x5b, 0x5c, 0xe9, 0xb3, 0xdf, - 0xcf, 0xb6, 0xd7, 0x41, 0x44, 0x88, 0x1d, 0x67, 0x5e, 0x62, 0xf0, 0x36, - 0x75, 0x17, 0x05, 0x14, 0x7e, 0x7c, 0x17, 0x43, 0xfe, 0xbd, 0xad, 0xa4, - 0xd9, 0x91, 0xb2, 0x1a, 0x7b, 0x9c, 0x08, 0x3e, 0x5f, 0x9a, 0xd7, 0xf8, - 0x24, 0xf1, 0x92, 0x80, 0x3b, 0xcf, 0xed, 0xa9, 0x91, 0xdb, 0xec, 0xa5, - 0xed, 0x84, 0x83, 0xa0, 0xe2, 0xbb, 0xa2, 0x92, 0x1c, 0x25, 0xcc, 0xe4, - 0x03, 0x7c, 0x6d, 0xac, 0xe0, 0xbe, 0x11, 0x95, 0x79, 0x79, 0x1a, 0x01, - 0x38, 0x3e, 0xd5, 0x9a, 0x3a, 0x71, 0x95, 0x9f, 0xeb, 0x3a, 0xda, 0x95, - 0x86, 0x81, 0xfc, 0xbd, 0xc8, 0x98, 0x1b, 0x1d, 0xb1, 0x6c, 0x1c, 0x80, - 0xb9, 0xfb, 0xb3, 0xea, 0x5d, 0x29, 0x8b, 0x2f, 0x7b, 0x0c, 0xfd, 0xa9, - 0xad, 0x88, 0x69, 0x6c, 0x78, 0xad, 0xf6, 0x26, 0x79, 0x03, 0xbe, 0xf2, - 0xb3, 0x8a, 0x03, 0x19, 0xff, 0x75, 0x39, 0x9b, 0xe2, 0xec, 0xd5, 0xb7, - 0xa7, 0xdf, 0x20, 0xb2, 0x28, 0x07, 0xaf, 0x98, 0x4c, 0x13, 0x95, 0x44, - 0xdd, 0x95, 0xfa, 0x8d, 0x99, 0xdc, 0x70, 0x69, 0x87, 0x54, 0x16, 0xb5, - 0x2e, 0x19, 0xfa, 0x2c, 0xe7, 0xda, 0x0d, 0xd4, 0xb4, 0x48, 0x79, 0x51, - 0x6d, 0x8e, 0x40, 0x95, 0x61, 0x7d, 0x7b, 0xaf, 0x18, 0x3f, 0xee, 0x62, - 0x1a, 0x2c, 0xf6, 0x90, 0x64, 0xc6, 0x85, 0x04, 0x29, 0x4f, 0x61, 0xb8, - 0x18, 0x35, 0x42, 0xa9, 0xcd, 0x8a, 0xb1, 0x8b, 0xf8, 0xe8, 0x03, 0x76, - 0x9f, 0xf8, 0x39, 0x53, 0x0d, 0xcb, 0xf1, 0x90, 0xaf, 0x6a, 0x0d, 0xd8, - 0xa3, 0x38, 0xc9, 0x08, 0xb5, 0x5a, 0x70, 0xc6, 0x98, 0xe1, 0xe1, 0x34, - 0x5d, 0xab, 0x52, 0x5b, 0x0e, 0x04, 0x79, 0x88, 0xef, 0x5e, 0x6e, 0xc4, - 0x36, 0x1a, 0xfe, 0x4e, 0x5d, 0x3f, 0x6e, 0x01, 0xf6, 0x21, 0x5a, 0x42, - 0xd5, 0x74, 0x19, 0x31, 0x44, 0x5b, 0x3a, 0x05, 0x08, 0xec, 0xdc, 0x5c, - 0x24, 0xa9, 0x15, 0xe3, 0x8e, 0x18, 0x17, 0xf8, 0x63, 0xc4, 0x9c, 0xea, - 0xab, 0x92, 0x26, 0x24, 0xc0, 0xa0, 0x3c, 0xc3, 0xa2, 0x84, 0xd4, 0x62, - 0x98, 0x56, 0x6a, 0xe0, 0x71, 0xb9, 0x17, 0xc9, 0x3f, 0xb7, 0x49, 0x38, - 0xbc, 0x9d, 0x97, 0x09, 0x1e, 0xf3, 0xc5, 0xa9, 0xa1, 0x4a, 0x1b, 0xb8, - 0xab, 0x61, 0x7d, 0x93, 0x92, 0x33, 0xe9, 0x3a, 0xdb, 0x2c, 0x26, 0x1f, - 0xa5, 0x8a, 0x58, 0x40, 0xbd, 0x4c, 0x5d, 0x5f, 0xc0, 0xa0, 0xc0, 0x93, - 0xe9, 0xc5, 0x11, 0x1e, 0x75, 0x30, 0x84, 0x5f, 0xdc, 0x89, 0x72, 0x4f, - 0x53, 0xcf, 0x28, 0xaa, 0xdb, 0x23, 0xb3, 0x7a, 0xc2, 0x3a, 0x12, 0x90, - 0x0d, 0x98, 0x47, 0xd7, 0xfb, 0xbe, 0xdf, 0xee, 0x7b, 0x95, 0xc6, 0x63, - 0x02, 0x80, 0xbe, 0x87, 0xe9, 0x68, 0x27, 0xfa, 0x3f, 0x58, 0x42, 0xd1, - 0xc4, 0xf5, 0xee, 0xa6, 0x4c, 0x7f, 0x44, 0x1c, 0x11, 0xbf, 0xfb, 0x84, - 0xd1, 0x81, 0x25, 0xde, 0xf8, 0xff, 0x10, 0xb1, 0xc7, 0x06, 0xe5, 0x79, - 0xfd, 0x1a, 0x94, 0x3b, 0x34, 0x39, 0xbc, 0x32, 0x71, 0x5a, 0xdc, 0xa4, - 0x04, 0x2f, 0xf7, 0x44, 0x99, 0x0f, 0xe0, 0x92, 0x92, 0xc8, 0xf5, 0x8c, - 0x71, 0xa5, 0xb4, 0x41, 0xb8, 0xa4, 0x13, 0x22, 0x42, 0xb6, 0x79, 0x1a, - 0xd2, 0xba, 0xb9, 0xcb, 0xd6, 0xaa, 0x01, 0xfb, 0x93, 0x2e, 0xf1, 0x43, - 0xc9, 0x29, 0x47, 0x52, 0x0a, 0x17, 0x7f, 0x5e, 0xff, 0x2f, 0x32, 0x4e, - 0xc0, 0x3e, 0x88, 0x0d, 0x77, 0xca, 0xd8, 0x27, 0x62, 0x44, 0x54, 0x73, - 0x98, 0x2a, 0xdc, 0x5c, 0x4e, 0x72, 0xc7, 0x50, 0xde, 0x68, 0xe6, 0xa0, - 0xaf, 0x3d, 0xb3, 0x5e, 0xa5, 0xf7, 0xac, 0xac, 0x9d, 0x20, 0x4b, 0x7f, - 0x4f, 0x6b, 0x49, 0x3f, 0xee, 0x10, 0x8d, 0x62, 0x03, 0x63, 0x3c, 0xb1, - 0xa7, 0xaf, 0xa8, 0x6f, 0x7c, 0x9b, 0x9e, 0x70, 0x62, 0x10, 0xdd, 0x2a, - 0xc2, 0xad, 0x72, 0xdf, 0x25, 0x94, 0xeb, 0x41, 0x86, 0xf9, 0xe1, 0x90, - 0x59, 0xe4, 0x87, 0xd5, 0xcc, 0x39, 0x1e, 0x7c, 0x7a, 0xf3, 0xc6, 0x30, - 0x21, 0x0b, 0xe0, 0x06, 0xd3, 0xfd, 0xf4, 0xa6, 0xc8, 0x59, 0xd8, 0x35, - 0xa3, 0x4a, 0xd7, 0x34, 0xd5, 0x3e, 0xed, 0xf5, 0xe8, 0x00, 0x3b, 0xf8, - 0x9d, 0xeb, 0x97, 0xaf, 0x4a, 0xf1, 0x55, 0xe3, 0x02, 0x21, 0xa8, 0x1a, - 0x5a, 0xcd, 0x48, 0x89, 0xcd, 0xe0, 0x4d, 0x77, 0x99, 0x85, 0x40, 0x93, - 0x48, 0x66, 0x35, 0x5c, 0x7a, 0xd8, 0xca, 0xa3, 0x41, 0x42, 0xb3, 0xec, - 0xcd, 0xb2, 0x86, 0x92, 0x91, 0xe2, 0x1d, 0x87, 0xf2, 0xaf, 0xca, 0x06, - 0xce, 0x1c, 0x8f, 0x9c, 0x3e, 0x18, 0x9b, 0xd9, 0x96, 0x39, 0xf7, 0x72, - 0x3a, 0x18, 0x00, 0x97, 0x88, 0x5b, 0x73, 0x57, 0x16, 0xc3, 0x3d, 0x8a, - 0x29, 0x70, 0x51, 0xb7, 0x0f, 0x62, 0xca, 0x4e, 0xfd, 0xa6, 0x1b, 0xa4, - 0xa0, 0xa9, 0x08, 0x5f, 0xf9, 0x27, 0x0a, 0xbf, 0xb5, 0x59, 0xf7, 0xf6, - 0x22, 0x06, 0xbb, 0x40, 0x63, 0x4d, 0x25, 0x8a, 0x6f, 0x4f, 0xcd, 0x8c, - 0x17, 0xf6, 0xcb, 0x39, 0x6c, 0x35, 0x7d, 0xef, 0x91, 0x51, 0xfa, 0xbc, - 0xa1, 0x61, 0x88, 0x84, 0x01, 0x57, 0x7f, 0x15, 0xb1, 0x1f, 0x47, 0xf9, - 0xb8, 0x55, 0x0f, 0x62, 0x70, 0xa8, 0x7c, 0x25, 0x5f, 0x16, 0xd8, 0x36, - 0x03, 0x52, 0x30, 0xd0, 0x0d, 0xf3, 0x5e, 0xeb, 0x42, 0x0c, 0xd0, 0x64, - 0xce, 0xd9, 0x5c, 0x90, 0x13, 0x43, 0x8a, 0x40, 0x98, 0xc9, 0x81, 0xca, - 0xcc, 0xc9, 0x0a, 0x13, 0x4a, 0xde, 0x3a, 0x03, 0x7b, 0xb6, 0x6e, 0x3f, - 0xf2, 0xb0, 0x35, 0x82, 0xd1, 0x25, 0x1e, 0xb9, 0x55, 0x09, 0x05, 0xa3, - 0x18, 0xf0, 0xa2, 0xe2, 0x89, 0xc1, 0x02, 0x2a, 0xb4, 0x2b, 0xe1, 0x22, - 0x48, 0x3e, 0xfc, 0x2b, 0x5b, 0xf7, 0x23, 0xff, 0x0c, 0x3d, 0x9a, 0x1e, - 0x10, 0x13, 0xd3, 0x8f, 0x1a, 0xeb, 0xcf, 0x95, 0x6d, 0xd4, 0x06, 0x18, - 0x76, 0xe0, 0x59, 0xe5, 0x05, 0x2a, 0xb0, 0x43, 0x63, 0x8f, 0xe5, 0xba, - 0xc4, 0x3b, 0xc5, 0xf7, 0x3e, 0x31, 0x3b, 0x5c, 0x98, 0xb9, 0x01, 0xec, - 0x8d, 0x5c, 0xa1, 0x42, 0x31, 0x24, 0x8e, 0x55, 0x5e, 0x57, 0x46, 0xe8, - 0xb0, 0x52, 0x79, 0x98, 0xe5, 0x50, 0x52, 0xfe, 0x7d, 0x40, 0x4c, 0x73, - 0xc3, 0xc1, 0xe8, 0x0f, 0x05, 0x1c, 0x58, 0x24, 0x9b, 0xd4, 0xba, 0x96, - 0xa1, 0xed, 0x7e, 0x6f, 0x3b, 0x98, 0x2f, 0x67, 0x38, 0xbe, 0x29, 0xb6, - 0x5a, 0x7a, 0x98, 0xa2, 0x33, 0xf0, 0x5f, 0x1a, 0x26, 0x42, 0x59, 0xcd, - 0x7c, 0x58, 0x99, 0x77, 0xad, 0x15, 0x81, 0xe0, 0x57, 0x37, 0x7d, 0x7a, - 0x89, 0x33, 0xf3, 0x73, 0xd2, 0xbf, 0xbb, 0x98, 0xa6, 0xd4, 0xf9, 0x38, - 0xb5, 0xa5, 0x57, 0x3e, 0xd6, 0xb4, 0xf3, 0x14, 0xa7, 0xb4, 0x8b, 0xa0, - 0xf6, 0x3e, 0x06, 0x8d, 0x44, 0x1d, 0xb6, 0x19, 0xab, 0x8f, 0xe0, 0xde, - 0xf2, 0xe9, 0xda, 0x63, 0xbe, 0x69, 0x6b, 0x41, 0x1e, 0xaf, 0x65, 0x65, - 0x3a, 0x58, 0x22, 0xf9, 0x79, 0x97, 0xb9, 0x7d, 0x2e, 0xb0, 0xc2, 0x2a, - 0x76, 0x12, 0xb3, 0x54, 0x62, 0x53, 0xfc, 0x10, 0x53, 0xba, 0x5a, 0x74, - 0x61, 0xe1, 0x74, 0x3e, 0xa0, 0x3a, 0x0f, 0x51, 0x6b, 0xa3, 0x26, 0xcc, - 0x8f, 0x3c, 0xf9, 0x0a, 0x20, 0xea, 0x40, 0x33, 0x28, 0x62, 0x8e, 0x12, - 0x9f, 0x9a, 0xf5, 0x42, 0xb6, 0x2d, 0x74, 0xa7, 0x0d, 0xb8, 0xa4, 0xb0, - 0x2a, 0x4e, 0x1b, 0xb1, 0x28, 0x03, 0xcb, 0xad, 0xc1, 0x5d, 0x25, 0x91, - 0xf1, 0x3a, 0x71, 0x65, 0x43, 0x86, 0x39, 0xb0, 0x94, 0xa8, 0xc4, 0x32, - 0x0d, 0xbb, 0x7a, 0x67, 0x56, 0x1f, 0x91, 0xde, 0xf5, 0xd0, 0x9f, 0x5b, - 0x4e, 0xaf, 0x22, 0xc2, 0x5a, 0x2f, 0x2d, 0x07, 0xc0, 0xd8, 0xed, 0xfc, - 0xfb, 0x88, 0x29, 0x2a, 0x05, 0xb5, 0xb1, 0x6b, 0x04, 0xd7, 0x10, 0x07, - 0x70, 0x7f, 0x51, 0x14, 0x23, 0xa4, 0xd6, 0x8d, 0x74, 0x1c, 0x1b, 0x27, - 0x61, 0x70, 0x2f, 0x24, 0x71, 0xd6, 0x73, 0x5b, 0xce, 0xc7, 0x27, 0xb0, - 0x5d, 0xf6, 0xab, 0x42, 0x9e, 0xd5, 0xa0, 0xc7, 0x3e, 0x18, 0x38, 0x06, - 0xf8, 0x9c, 0x8d, 0xf0, 0xd2, 0x39, 0x5d, 0x93, 0x13, 0xfe, 0x72, 0x8d, - 0x93, 0x3a, 0x3a, 0x54, 0xfc, 0xab, 0x44, 0x63, 0x44, 0xf9, 0x42, 0x9d, - 0xd7, 0xa2, 0xbc, 0xa1, 0x3b, 0xbd, 0x4a, 0x3e, 0x8d, 0x7f, 0x56, 0x7a, - 0xb9, 0x05, 0x26, 0xe5, 0xab, 0xb2, 0x1d, 0x50, 0xb4, 0x86, 0x92, 0x60, - 0xa0, 0xd9, 0xd7, 0xf3, 0x5d, 0x88, 0xe4, 0xb8, 0x35, 0x9d, 0xa7, 0xe7, - 0x30, 0xcc, 0x82, 0x2a, 0x4c, 0x45, 0xa8, 0xbc, 0xff, 0xb1, 0x04, 0x0f, - 0xa5, 0xc2, 0x3c, 0x40, 0x59, 0xe4, 0xee, 0x50, 0xe9, 0xb2, 0xad, 0x60, - 0x2a, 0x4a, 0xf4, 0xf3, 0x0b, 0xa4, 0x07, 0x13, 0xac, 0x7d, 0xba, 0xeb, - 0xf3, 0xd5, 0xa3, 0xd5, 0xbd, 0x96, 0xec, 0x10, 0x12, 0x8e, 0xdf, 0x1e, - 0x78, 0xab, 0xfb, 0xbe, 0x0d, 0x6d, 0xdd, 0x80, 0xf0, 0x80, 0x39, 0xf2, - 0x11, 0x29, 0x27, 0xab, 0xca, 0xa4, 0x3e, 0x5b, 0xcc, 0xb5, 0x9d, 0xf9, - 0x0c, 0x8c, 0xcc, 0x6d, 0x7b, 0x9a, 0x23, 0xe9, 0xc3, 0x90, 0xa9, 0x90, - 0x41, 0xab, 0x92, 0x2d, 0x52, 0xf0, 0xa5, 0x07, 0x7b, 0x71, 0x13, 0xd1, - 0x3a, 0x58, 0xaa, 0x5a, 0x9d, 0xd0, 0xc1, 0x71, 0x1b, 0x07, 0x0d, 0x7c, - 0x75, 0xa2, 0x15, 0xe3, 0x59, 0xce, 0x7f, 0x1a, 0x0c, 0x4d, 0x43, 0x87, - 0xca, 0xcb, 0xd0, 0xa2, 0x12, 0x2f, 0x51, 0x19, 0xd1, 0xb2, 0xce, 0xac, - 0x29, 0xee, 0x81, 0x88, 0x45, 0x61, 0xef, 0x2f, 0x17, 0xa7, 0x08, 0x2e, - 0x29, 0x54, 0x71, 0x50, 0x3d, 0xb5, 0x35, 0xad, 0x33, 0xa6, 0x6c, 0x4f, - 0x1b, 0x33, 0xaf, 0xae, 0x27, 0x24, 0xcd, 0xd3, 0xc8, 0xcd, 0xfe, 0x5a, - 0x38, 0x02, 0x86, 0xaf, 0x95, 0x05, 0x31, 0xd6, 0xa2, 0xd8, 0xc9, 0x12, - 0x9c, 0x10, 0x98, 0xe4, 0x38, 0x19, 0xfe, 0x25, 0x3c, 0x47, 0x26, 0x7a, - 0xa8, 0x96, 0x0d, 0x63, 0xdd, 0x00, 0xd8, 0x94, 0x17, 0x39, 0x57, 0x0a, - 0x9b, 0x7c, 0x8e, 0xe4, 0x45, 0xc8, 0x5f, 0xee, 0x2a, 0x67, 0x52, 0xaa, - 0x12, 0xe7, 0x8d, 0x4f, 0xcd, 0xdd, 0x02, 0xb4, 0xd8, 0xc6, 0x29, 0x4f, - 0x62, 0x35, 0x7a, 0xf4, 0x33, 0xb7, 0x5f, 0x03, 0x86, 0xd6, 0xcb, 0x99, - 0x6f, 0xf6, 0xec, 0x49, 0x28, 0xa9, 0x01, 0x3b, 0xf6, 0x5b, 0x3f, 0xe4, - 0x1e, 0x1a, 0xe8, 0x57, 0x10, 0xf0, 0xc9, 0x18, 0x78, 0x6e, 0x36, 0x3d, - 0x46, 0x79, 0x85, 0xad, 0xfa, 0x09, 0x5d, 0x94, 0xb8, 0xee, 0x25, 0xb6, - 0xf9, 0xee, 0x1e, 0x25, 0x98, 0x81, 0xd9, 0xd9, 0x39, 0xdf, 0xab, 0xe2, - 0x39, 0xb0, 0xa2, 0x70, 0xed, 0x26, 0x72, 0x91, 0x2d, 0xfc, 0xb1, 0x7d, - 0x8d, 0x1f, 0x70, 0x5b, 0x38, 0xb0, 0x2c, 0x9b, 0x65, 0xae, 0x3e, 0xb9, - 0x04, 0x56, 0x68, 0x38, 0x43, 0x4a, 0x97, 0xb6, 0x8c, 0xff, 0x92, 0xdb, - 0x7f, 0x7a, 0xd7, 0x47, 0x6e, 0x0c, 0x58, 0x06, 0xdd, 0xc7, 0x6e, 0x62, - 0x8f, 0xcf, 0xbd, 0x4c, 0xdf, 0xbb, 0x90, 0x8b, 0x1b, 0xbc, 0x58, 0xa1, - 0x23, 0x5a, 0x15, 0x53, 0x73, 0x8e, 0x94, 0x3f, 0x8c, 0x33, 0x5c, 0x54, - 0x60, 0x23, 0xa2, 0x56, 0x99, 0xb0, 0xee, 0x76, 0xad, 0xb6, 0x1e, 0xd5, - 0xe6, 0xb4, 0x32, 0x0c, 0xa8, 0x5f, 0x8d, 0x0f, 0xf8, 0x52, 0x41, 0xaf, - 0x2b, 0x0e, 0x1a, 0xcc, 0x8a, 0x35, 0x08, 0x6f, 0xc3, 0x5c, 0x67, 0xd6, - 0x17, 0xcc, 0x0c, 0x16, 0x43, 0xf1, 0xc2, 0x5a, 0xb4, 0xde, 0x19, 0x5a, - 0x90, 0x42, 0xcb, 0xf0, 0xe6, 0x28, 0x06, 0x22, 0xe2, 0x77, 0xeb, 0x67, - 0x3e, 0xf2, 0xf8, 0x18, 0xcb, 0x32, 0x37, 0x3e, 0xdc, 0x76, 0xc0, 0x61, - 0x61, 0x42, 0x89, 0x4c, 0xf8, 0x77, 0x97, 0x01, 0x05, 0x8f, 0x25, 0x0d, - 0x54, 0x3d, 0x86, 0x82, 0xed, 0x9b, 0x52, 0xac, 0x95, 0x56, 0x16, 0xc6, - 0xcd, 0x89, 0x8d, 0xff, 0x73, 0xb5, 0x04, 0x07, 0xec, 0x41, 0x27, 0x0d, - 0x9d, 0x2a, 0x6c, 0x8a, 0xce, 0xf0, 0x70, 0x61, 0x0a, 0x70, 0x95, 0x5d, - 0xfe, 0x78, 0x97, 0xa9, 0x10, 0x2a, 0x93, 0xec, 0x37, 0x67, 0xb0, 0xbf, - 0x17, 0x44, 0x59, 0x6a, 0x70, 0xcb, 0x45, 0x10, 0x2d, 0x4d, 0x3a, 0xed, - 0xf7, 0xc7, 0xda, 0x65, 0xfb, 0x5c, 0x75, 0xe3, 0x25, 0xdd, 0xf5, 0x1d, - 0xe7, 0xfb, 0xb2, 0xa2, 0xd1, 0x4a, 0x86, 0x0e, 0xec, 0xcd, 0xb5, 0x78, - 0x71, 0xfa, 0x62, 0x99, 0xf9, 0x0c, 0xc7, 0x13, 0x16, 0x3e, 0xe1, 0x91, - 0x24, 0x4a, 0xf6, 0xc0, 0x11, 0x65, 0x42, 0xbe, 0xef, 0x2b, 0x3d, 0xe1, - 0xd6, 0x6e, 0x00, 0x24, 0x88, 0xc8, 0xb1, 0x84, 0xb7, 0x25, 0x36, 0x8b, - 0x2b, 0xda, 0x12, 0xa1, 0x93, 0x76, 0x2e, 0xe3, 0x39, 0xe6, 0x27, 0x68, - 0xf2, 0x9b, 0x01, 0x49, 0xfa, 0x17, 0x6e, 0xad, 0x20, 0x70, 0xe3, 0x41, - 0x5b, 0x74, 0x07, 0x0c, 0x51, 0x87, 0x64, 0x0a, 0xab, 0x75, 0x6a, 0xb6, - 0x48, 0x97, 0x74, 0x9b, 0x04, 0x7c, 0xfc, 0x10, 0x14, 0xe3, 0x8e, 0x66, - 0xe1, 0x57, 0x1d, 0xd1, 0xf1, 0x8c, 0xbb, 0x21, 0xb6, 0x84, 0x24, 0xc6, - 0x8f, 0xf8, 0xa2, 0xfc, 0x4a, 0x84, 0x34, 0x1a, 0xc8, 0x25, 0xdd, 0x8f, - 0x45, 0x3f, 0x1d, 0x5f, 0x8e, 0xb9, 0xcb, 0x67, 0x4e, 0x40, 0x88, 0x3e, - 0xb8, 0x02, 0x5f, 0xcc, 0x42, 0xe4, 0xfd, 0x70, 0xc9, 0xcf, 0x7b, 0x78, - 0xbf, 0x93, 0x51, 0x88, 0xde, 0x35, 0x0f, 0x7e, 0x2b, 0x97, 0x1b, 0xc6, - 0xc2, 0x07, 0x48, 0xa4, 0xac, 0x5d, 0x9b, 0xba, 0xaf, 0x55, 0x40, 0x4d, - 0x02, 0x96, 0xd3, 0x59, 0x9a, 0xc6, 0xa2, 0xd6, 0xc0, 0xf3, 0xbb, 0x9a, - 0x14, 0x90, 0x2a, 0x46, 0x72, 0x8a, 0x4a, 0x25, 0xa6, 0xf9, 0x2b, 0x55, - 0xcb, 0x07, 0x7e, 0xf3, 0x8e, 0x39, 0x40, 0xc1, 0x6f, 0xca, 0x59, 0xc6, - 0xcc, 0xf3, 0x02, 0x74, 0xf7, 0x48, 0x7d, 0x4d, 0x3a, 0x1f, 0x86, 0x76, - 0xe3, 0x16, 0x57, 0x16, 0x51, 0x44, 0xa6, 0x32, 0x66, 0xac, 0x66, 0x25, - 0x2c, 0x89, 0xc9, 0xc2, 0x02, 0xda, 0x94, 0xb0, 0xc6, 0x6e, 0x0c, 0x6b, - 0x83, 0xc4, 0x30, 0x33, 0x33, 0xb5, 0x77, 0x7a, 0x91, 0x54, 0x4c, 0x4e, - 0x27, 0x95, 0x17, 0x7d, 0x4d, 0x0d, 0x01, 0x50, 0xcb, 0x41, 0x10, 0xb6, - 0x65, 0x92, 0xc8, 0x41, 0x65, 0x7c, 0x35, 0x67, 0x24, 0x1e, 0xfc, 0xfa, - 0x54, 0x41, 0x02, 0x8c, 0x54, 0xaa, 0x6b, 0xc9, 0x0e, 0xa3, 0x0a, 0x9b, - 0x62, 0x75, 0x4b, 0xda, 0xfa, 0xec, 0xb4, 0x20, 0xf6, 0x03, 0x54, 0x75, - 0x08, 0x14, 0x9d, 0x64, 0x0e, 0xde, 0x9a, 0xf3, 0x34, 0x1b, 0x99, 0x10, - 0xbc, 0x24, 0x05, 0xc7, 0x00, 0xfd, 0x3d, 0x7d, 0x30, 0xe5, 0x9f, 0x72, - 0x25, 0x96, 0x8b, 0x7d, 0xab, 0xff, 0xc3, 0xfd, 0x4e, 0x37, 0x33, 0x14, - 0x8a, 0x18, 0x39, 0xa2, 0xdc, 0x0e, 0xe1, 0x0b, 0xf3, 0x1b, 0x44, 0x09, - 0x77, 0xf5, 0xdd, 0x75, 0xbc, 0xc2, 0xe8, 0x5c, 0x1a, 0x3d, 0xaf, 0x9a, - 0x56, 0x02, 0xb2, 0xeb, 0xbc, 0x13, 0x1e, 0x18, 0x0a, 0x5b, 0x41, 0x1b, - 0x0f, 0xd1, 0xe2, 0x2b, 0x92, 0x40, 0x94, 0xd6, 0xda, 0xba, 0x5b, 0x2c, - 0xa7, 0x66, 0x33, 0x2a, 0x56, 0xec, 0xab, 0xd1, 0xf8, 0xf3, 0x1b, 0xf4, - 0xa6, 0xfb, 0xd0, 0x4c, 0x47, 0x6d, 0x5c, 0x8e, 0x69, 0x25, 0xdb, 0xcb, - 0xd3, 0xc0, 0xee, 0x6d, 0x88, 0x51, 0x6d, 0x2e, 0x0e, 0x7b, 0x43, 0x23, - 0xc2, 0x7a, 0xff, 0xef, 0xd8, 0x8a, 0x80, 0x1d, 0x22, 0xda, 0x16, 0xff, - 0xaa, 0xe2, 0xa9, 0x0e, 0xd2, 0x77, 0x9f, 0x38, 0x6a, 0x3f, 0x67, 0x6b, - 0x40, 0xaa, 0xdd, 0xc3, 0x2b, 0x0c, 0x5a, 0x67, 0x7c, 0xd8, 0x74, 0x6f, - 0x24, 0x5a, 0x79, 0xfb, 0xb4, 0xf6, 0x8f, 0x5c, 0x00, 0x7e, 0x9f, 0x26, - 0xc5, 0xa1, 0x85, 0xcf, 0xc3, 0x5d, 0x49, 0x22, 0x37, 0x85, 0x42, 0xe9, - 0x3b, 0x6a, 0xc4, 0x81, 0xed, 0xc8, 0x87, 0x32, 0x1d, 0x11, 0xcb, 0x19, - 0x6b, 0x20, 0x3c, 0x33, 0x2b, 0x4a, 0x23, 0x0e, 0xf4, 0xc3, 0x6e, 0x7c, - 0x51, 0x97, 0x4a, 0xbd, 0xa8, 0x41, 0xd8, 0x1d, 0xea, 0x52, 0x66, 0x49, - 0x89, 0xfc, 0x17, 0xc4, 0x11, 0x3b, 0x06, 0xf0, 0xfc, 0xeb, 0xe2, 0x25, - 0x9f, 0xf0, 0xe7, 0x57, 0x9a, 0xa8, 0xe6, 0x83, 0x2a, 0x5b, 0x71, 0xb0, - 0xa9, 0xb6, 0x23, 0x54, 0x13, 0x3d, 0xd7, 0x7a, 0x47, 0xde, 0x16, 0x1e, - 0xac, 0xa9, 0x18, 0x7e, 0xf5, 0x0e, 0x2b, 0x0e, 0x4e, 0x60, 0xc4, 0xcc, - 0x22, 0xe4, 0x75, 0xa9, 0x78, 0x07, 0xe3, 0xbf, 0x5c, 0x48, 0x56, 0xa7, - 0x1d, 0xd7, 0x16, 0xbe, 0x6b, 0x99, 0xba, 0xad, 0x2e, 0xbc, 0xfd, 0x84, - 0xf2, 0xca, 0x84, 0xa8, 0x64, 0x37, 0xac, 0x7e, 0x8b, 0x03, 0xd5, 0x1b, - 0xa9, 0x28, 0x8d, 0x2a, 0x8c, 0xb7, 0x97, 0xd3, 0xa5, 0x75, 0xed, 0x6a, - 0x8c, 0x19, 0xe9, 0x5f, 0x4f, 0x46, 0x0d, 0x03, 0x8d, 0x8a, 0x6e, 0xa6, - 0x58, 0x8a, 0x23, 0x8d, 0x4e, 0x0c, 0x23, 0x03, 0xb4, 0xa9, 0xfe, 0x00, - 0xdd, 0x19, 0x17, 0xb9, 0x02, 0xeb, 0xfb, 0x3f, 0x8f, 0xc2, 0x41, 0x32, - 0x4d, 0x2a, 0x7f, 0xf1, 0x2a, 0xe6, 0xf1, 0x27, 0x8d, 0x47, 0xd5, 0x76, - 0x18, 0xd7, 0xc8, 0x0b, 0xb1, 0x13, 0x18, 0xc0, 0xf1, 0x5a, 0x2e, 0xd6, - 0xd6, 0xcc, 0xb6, 0xe6, 0x93, 0x7f, 0xdc, 0x29, 0x1b, 0xeb, 0xc4, 0x77, - 0x53, 0xa2, 0x8b, 0x85, 0x1d, 0xda, 0x11, 0x06, 0xaa, 0xbf, 0xd6, 0xb1, - 0x2e, 0xc5, 0x57, 0x3c, 0xeb, 0x1b, 0xbd, 0x4d, 0x1e, 0x65, 0xe8, 0x52, - 0xf1, 0xd0, 0xda, 0xea, 0xba, 0x7e, 0xa5, 0xf8, 0xe8, 0x58, 0xc0, 0xeb, - 0x88, 0xdf, 0x4b, 0x5d, 0x75, 0x02, 0x51, 0x6f, 0xee, 0xfe, 0x80, 0x64, - 0xca, 0xc6, 0xc1, 0x00, 0x80, 0x06, 0x66, 0x77, 0xa5, 0x99, 0xd7, 0x37, - 0xe1, 0x46, 0x04, 0x2f, 0xe9, 0xce, 0x6b, 0xc0, 0x5a, 0x95, 0x90, 0xfe, - 0x94, 0xb0, 0x13, 0x75, 0xe5, 0x5e, 0x6e, 0x50, 0x2f, 0xba, 0xe6, 0x28, - 0x43, 0x5c, 0x48, 0x41, 0x09, 0x34, 0x36, 0x8c, 0xd4, 0x25, 0x5f, 0xaa, - 0xdd, 0x77, 0x9c, 0xf0, 0x2a, 0xcc, 0x7c, 0xcf, 0x0d, 0xc3, 0xcd, 0x3b, - 0x3c, 0x5e, 0x64, 0xc2, 0xfd, 0xc9, 0x8b, 0x54, 0x5d, 0x55, 0xcb, 0x0a, - 0x74, 0x74, 0x16, 0x02, 0xdc, 0xfd, 0x29, 0xa5, 0x5d, 0x20, 0x35, 0xdc, - 0xd3, 0x89, 0xe5, 0x17, 0xa0, 0x12, 0xa2, 0xfd, 0x3e, 0x39, 0xfe, 0xa2, - 0x23, 0x8b, 0x46, 0x4b, 0xbc, 0x42, 0x7c, 0xb0, 0x22, 0x21, 0x1d, 0x72, - 0x11, 0xec, 0x1d, 0x59, 0xfe, 0x31, 0xd9, 0x0c, 0xd0, 0x12, 0xe0, 0x62, - 0x2c, 0x76, 0x8f, 0xce, 0xac, 0xd0, 0x9e, 0x97, 0x58, 0xb5, 0xcd, 0x9b, - 0x01, 0x6d, 0xc5, 0x55, 0x8b, 0x53, 0x5a, 0x3b, 0xd0, 0xf8, 0xcb, 0xf5, - 0xee, 0xdc, 0x4c, 0x26, 0x59, 0x88, 0x39, 0xa5, 0xba, 0xed, 0x15, 0x35, - 0xea, 0x64, 0x54, 0x50, 0x41, 0x10, 0x9b, 0x78, 0xc1, 0x39, 0xf2, 0xaf, - 0xc8, 0x03, 0x9c, 0x1a, 0x41, 0x6a, 0x9d, 0x44, 0x80, 0xeb, 0x74, 0x42, - 0xa2, 0x2e, 0x4b, 0x74, 0x30, 0x07, 0xde, 0x83, 0xfa, 0xd1, 0x8a, 0xb7, - 0xa6, 0x85, 0xf7, 0x48, 0x0f, 0x66, 0x9d, 0xb6, 0x6c, 0xe5, 0x61, 0x7f, - 0xfe, 0x31, 0x41, 0x42, 0x48, 0x68, 0x38, 0x4d, 0x4b, 0x07, 0x76, 0x2d, - 0x48, 0x7b, 0xc4, 0xf1, 0xf2, 0x1e, 0x26, 0x06, 0x0e, 0x0d, 0xa3, 0x02, - 0xb1, 0x24, 0xd1, 0x47, 0x50, 0xb4, 0x28, 0x29, 0xfe, 0x2e, 0xdd, 0x67, - 0x70, 0x16, 0x2d, 0xcf, 0x71, 0x23, 0x67, 0xe9, 0xb0, 0x1d, 0x4d, 0xe0, - 0x35, 0xaf, 0xb5, 0x83, 0x4b, 0x92, 0x6c, 0x82, 0xac, 0xe1, 0x72, 0x36, - 0x28, 0xb8, 0x4e, 0x4a, 0x5b, 0x2a, 0x2d, 0x36, 0xb0, 0xc8, 0xc9, 0xe1, - 0x9c, 0x12, 0xc6, 0x7a, 0x8c, 0xde, 0x97, 0xdf, 0xba, 0x93, 0x65, 0xfd, - 0x63, 0xf0, 0x1c, 0x72, 0x25, 0xbb, 0xe4, 0x42, 0xb1, 0x5b, 0x90, 0xac, - 0x57, 0x03, 0x1f, 0x12, 0x96, 0x86, 0xaf, 0x45, 0x44, 0x18, 0x5d, 0x02, - 0x76, 0x4c, 0x2e, 0x20, 0x8c, 0xa1, 0xb2, 0x3a, 0x8c, 0x56, 0xef, 0xaf, - 0x32, 0xb6, 0xd1, 0xba, 0xe1, 0x2d, 0x71, 0xfd, 0x1f, 0x37, 0x2e, 0x6a, - 0xd8, 0x52, 0xd0, 0x4d, 0x5c, 0xce, 0x0d, 0x5b, 0xae, 0x7d, 0x33, 0xb9, - 0xa3, 0x58, 0x47, 0x2a, 0x1f, 0x37, 0x94, 0xdf, 0xb3, 0xa0, 0x55, 0xa0, - 0x9f, 0x9a, 0x70, 0xcd, 0x7f, 0x30, 0x57, 0xf4, 0x2d, 0x01, 0x64, 0xd5, - 0xb9, 0xdc, 0x3d, 0xe3, 0xbc, 0x2c, 0x86, 0x4b, 0x43, 0x15, 0xce, 0x1a, - 0x87, 0xaa, 0xf6, 0x95, 0xc6, 0xcf, 0x83, 0x78, 0x8f, 0x80, 0xb2, 0x4f, - 0x74, 0xff, 0x52, 0x25, 0x16, 0x0b, 0xb3, 0xb3, 0x21, 0x3b, 0x01, 0x15, - 0x45, 0x38, 0xe5, 0x17, 0x3a, 0x96, 0x9e, 0x82, 0xe8, 0xc8, 0x70, 0xf0, - 0xfe, 0x9d, 0x16, 0x60, 0x0c, 0xf1, 0x7f, 0x3f, 0xf5, 0xef, 0x5c, 0xb1, - 0xf5, 0xe1, 0xfe, 0xd7, 0x67, 0xa3, 0xfe, 0x2a, 0x49, 0xaa, 0x91, 0x50, - 0x21, 0x6a, 0x16, 0xae, 0x17, 0xdb, 0x6f, 0x3a, 0x05, 0xd4, 0xf1, 0xd0, - 0x79, 0x87, 0xea, 0x1f, 0x69, 0xb9, 0x40, 0xd3, 0x5b, 0x90, 0xff, 0xac, - 0x18, 0xc4, 0xbd, 0x8e, 0x40, 0x95, 0xf9, 0x46, 0x7b, 0xc4, 0x9e, 0x90, - 0xbf, 0xe2, 0x36, 0xd4, 0x8f, 0x9d, 0x7e, 0x8e, 0xc7, 0xea, 0x75, 0x71, - 0x10, 0xf4, 0x6f, 0x94, 0x3b, 0xce, 0xfe, 0x27, 0x05, 0x98, 0xe1, 0x17, - 0xce, 0x57, 0xf2, 0x75, 0x3d, 0x51, 0x8b, 0x46, 0x44, 0xd7, 0x02, 0x47, - 0x8c, 0xbb, 0x13, 0x5d, 0x15, 0x92, 0x1c, 0x97, 0xf8, 0xcc, 0x53, 0x9d, - 0xc6, 0x3d, 0x09, 0x29, 0x17, 0xf0, 0xc1, 0xc0, 0x4e, 0x2e, 0x70, 0xf9, - 0x53, 0xad, 0x21, 0xc5, 0xd0, 0x4e, 0xcf, 0xe7, 0x9d, 0xab, 0xbe, 0x3a, - 0x78, 0xfb, 0x2b, 0x9f, 0x42, 0x2d, 0xd9, 0x09, 0x1a, 0x9b, 0xd9, 0x9a, - 0xc0, 0x01, 0x44, 0x1c, 0xa6, 0x1d, 0x91, 0xc5, 0xa3, 0x31, 0x56, 0x3b, - 0x90, 0x20, 0x6b, 0x3c, 0xbd, 0x2e, 0x6c, 0x65, 0x44, 0x1b, 0x04, 0xe6, - 0x23, 0x51, 0x1c, 0x58, 0xfd, 0xd3, 0xda, 0x9b, 0xc3, 0x9f, 0x98, 0xeb, - 0x77, 0x22, 0xef, 0x62, 0x43, 0x42, 0x87, 0xd0, 0xe7, 0xa5, 0x14, 0xd5, - 0xf8, 0x41, 0x88, 0x5c, 0x78, 0x90, 0x6c, 0x94, 0xaf, 0x96, 0x2a, 0x74, - 0xf2, 0x7a, 0x48, 0xb5, 0xf2, 0xd7, 0xa9, 0x21, 0x51, 0x22, 0x37, 0xe5, - 0xc1, 0x5c, 0x7c, 0x45, 0x39, 0x4d, 0xea, 0x42, 0xd7, 0x68, 0x4c, 0x42, - 0xe8, 0x22, 0xc3, 0x15, 0x74, 0xf0, 0x35, 0x02, 0xac, 0xe3, 0x07, 0xd0, - 0x31, 0x2f, 0x10, 0x5e, 0x6c, 0xfc, 0xe8, 0x1b, 0x66, 0xc0, 0xb2, 0x2b, - 0x9a, 0x7f, 0x5f, 0xab, 0x95, 0xb6, 0x55, 0x80, 0x5f, 0x98, 0xe8, 0x36, - 0x9a, 0x31, 0x16, 0x39, 0x5e, 0xe0, 0xe9, 0x5b, 0x11, 0x3d, 0xbb, 0xdf, - 0x83, 0x0a, 0xae, 0xe4, 0x59, 0x69, 0x19, 0x30, 0x4d, 0x79, 0x4a, 0xdf, - 0x8e, 0xf8, 0x1c, 0xa3, 0x54, 0x60, 0xfb, 0x85, 0x3f, 0xca, 0x4d, 0x9e, - 0x9b, 0x1e, 0x53, 0xcb, 0x64, 0x08, 0xe2, 0x53, 0x9b, 0x9c, 0xf4, 0x11, - 0x97, 0xf7, 0x10, 0x7b, 0x42, 0x39, 0x2e, 0x0a, 0xf2, 0x4f, 0x8a, 0x42, - 0xb4, 0x76, 0x93, 0x0a, 0xe6, 0x8a, 0xc3, 0xbb, 0x98, 0x40, 0xeb, 0x6e, - 0x2a, 0xcb, 0x41, 0x8b, 0xa0, 0x6e, 0x0a, 0x8d, 0x27, 0x40, 0xa7, 0x87, - 0x9e, 0xef, 0xd2, 0x14, 0x3f, 0x88, 0xc8, 0x31, 0x3a, 0x04, 0x49, 0x19, - 0x27, 0x54, 0xa4, 0x76, 0xfa, 0x14, 0x1d, 0x46, 0xc7, 0x2b, 0x5b, 0xeb, - 0xd2, 0x27, 0xac, 0x90, 0x13, 0x72, 0x38, 0xd4, 0xd2, 0x36, 0x13, 0x7e, - 0x67, 0xa9, 0x4b, 0x00, 0x51, 0x1f, 0x47, 0xa8, 0x21, 0xe0, 0x09, 0x10, - 0x32, 0xf2, 0x45, 0x26, 0xac, 0x3a, 0x5c, 0xcf, 0x39, 0x07, 0x8d, 0xae, - 0xc7, 0x8e, 0x93, 0xb4, 0x3d, 0xc5, 0xa1, 0x65, 0x9f, 0xa4, 0x7f, 0x6b, - 0x70, 0x4d, 0x26, 0x8a, 0x0b, 0xbd, 0x63, 0xc6, 0x38, 0x3c, 0x63, 0xbd, - 0x62, 0x7e, 0x19, 0x93, 0x06, 0x42, 0x49, 0x2d, 0xc5, 0x1d, 0xc2, 0x58, - 0x6f, 0xa9, 0x56, 0x16, 0x1e, 0x74, 0xd6, 0x68, 0xd3, 0xdb, 0x14, 0xf5, - 0xbd, 0xf1, 0xf0, 0x0f, 0x6d, 0xf8, 0x22, 0xae, 0x8b, 0x4c, 0xe8, 0x7d, - 0xf5, 0x71, 0x6a, 0xff, 0x44, 0x66, 0x9a, 0x53, 0x11, 0xc0, 0xfb, 0xcb, - 0x71, 0x79, 0x59, 0x52, 0x3d, 0x1e, 0x07, 0xa1, 0xc2, 0x6e, 0xd4, 0x60, - 0x68, 0x2c, 0x18, 0x43, 0x52, 0x7d, 0x39, 0xed, 0xa8, 0x8c, 0xfe, 0x9a, - 0x4c, 0x7c, 0x54, 0xee, 0x5f, 0x4b, 0x30, 0x76, 0x9f, 0x3f, 0xe3, 0x7b, - 0xe2, 0x5d, 0xda, 0x3c, 0xb1, 0x06, 0x12, 0x62, 0x71, 0x02, 0x5c, 0x9f, - 0xd7, 0xc4, 0x99, 0x26, 0xc9, 0x49, 0x2b, 0x86, 0xd5, 0xcd, 0x79, 0x4f, - 0x06, 0xd0, 0x32, 0x2a, 0x21, 0xef, 0x0b, 0x67, 0x9d, 0x7f, 0xe8, 0x91, - 0x08, 0xee, 0x6f, 0x8d, 0x99, 0xc6, 0xf8, 0x5a, 0x93, 0x2c, 0xbf, 0xf2, - 0x74, 0x87, 0xeb, 0x70, 0x4b, 0xc2, 0xf6, 0xef, 0x20, 0x4e, 0x05, 0x4f, - 0x7a, 0x28, 0x00, 0xb3, 0x04, 0x34, 0x84, 0x08, 0xba, 0xa6, 0x17, 0x54, - 0x54, 0xbc, 0x33, 0x1f, 0xa1, 0xe9, 0xe1, 0x4c, 0xcd, 0x00, 0xef, 0x3b, - 0x1d, 0x85, 0xd8, 0x51, 0x47, 0x22, 0x0d, 0x2b, 0x6a, 0x86, 0x75, 0xbc, - 0x2c, 0x00, 0xf6, 0x50, 0x39, 0x5d, 0x43, 0xea, 0x57, 0xf2, 0x7e, 0x1e, - 0x0e, 0xb5, 0x05, 0x63, 0xd7, 0xab, 0x1b, 0x8f, 0x60, 0xa2, 0x00, 0xfd, - 0x07, 0x4e, 0x0f, 0x74, 0x8b, 0xe9, 0x6a, 0xb0, 0xba, 0xc8, 0x1a, 0x24, - 0x26, 0x98, 0xaf, 0x8b, 0x79, 0xe7, 0x42, 0xd2, 0x7f, 0xd3, 0x2f, 0x21, - 0xff, 0x60, 0xbf, 0x9a, 0x53, 0x78, 0x12, 0xc9, 0xcc, 0x0d, 0x0f, 0x4f, - 0x3c, 0xa2, 0x19, 0xae, 0x39, 0x0a, 0xd3, 0x81, 0x8e, 0x1b, 0xb6, 0xc4, - 0xcd, 0xf7, 0xab, 0x07, 0x13, 0xe1, 0x6b, 0xa8, 0x56, 0x94, 0x8b, 0x0c, - 0x5f, 0x17, 0x88, 0x26, 0xbc, 0x21, 0x9a, 0x6b, 0x55, 0x0d, 0x9b, 0xd5, - 0x06, 0x46, 0x4e, 0x06, 0xc2, 0x55, 0x09, 0x02, 0x8f, 0x61, 0x1d, 0x3e, - 0xc2, 0x8d, 0x4b, 0xa8, 0x31, 0x24, 0x20, 0x1d, 0xaa, 0x9a, 0x0e, 0xfc, - 0xb5, 0x72, 0x22, 0xcb, 0x98, 0x2b, 0x49, 0x2a, 0x0a, 0xf2, 0x71, 0xed, - 0x1f, 0xd9, 0xc9, 0x4b, 0x67, 0xdd, 0xc1, 0xa5, 0xe3, 0x5c, 0x2c, 0xe3, - 0x5f, 0x4a, 0xd1, 0xe7, 0x61, 0xd1, 0x38, 0x20, 0x28, 0x03, 0x51, 0x8e, - 0xf2, 0xf8, 0x12, 0x84, 0x1e, 0xff, 0xd1, 0xaa, 0x08, 0xd3, 0x00, 0x8d, - 0xfe, 0x04, 0xe1, 0xa3, 0x36, 0x3c, 0x03, 0xe1, 0x8a, 0x83, 0x93, 0xdd, - 0xf4, 0x0d, 0xd9, 0xc4, 0x4d, 0x41, 0x6e, 0x6f, 0x69, 0x83, 0xbf, 0x97, - 0xa8, 0xff, 0xf9, 0xf8, 0x5b, 0x27, 0xdc, 0x5c, 0x6c, 0xfe, 0xb8, 0xdc, - 0x40, 0x2b, 0xbc, 0xfd, 0x8b, 0xf0, 0xb1, 0x43, 0xf7, 0x8a, 0x38, 0x91, - 0xa9, 0x4a, 0x3d, 0x4a, 0x74, 0x03, 0x63, 0x4d, 0xd5, 0x45, 0x23, 0x72, - 0x4d, 0xfc, 0x4a, 0xaa, 0xab, 0xfb, 0x0e, 0xa9, 0x63, 0x5c, 0x64, 0x6c, - 0x39, 0x5b, 0x2b, 0x8a, 0xb6, 0x39, 0x44, 0xa3, 0xfd, 0x74, 0xfc, 0x41, - 0x17, 0x0b, 0xf8, 0xa6, 0x53, 0x74, 0xbb, 0x04, 0x2b, 0x30, 0x65, 0x39, - 0x31, 0x14, 0x32, 0xc0, 0x0b, 0x61, 0xa2, 0x2e, 0x7d, 0xf3, 0x60, 0x5c, - 0xd3, 0x67, 0xb5, 0x6c, 0xba, 0x46, 0xb3, 0x6e, 0x61, 0x42, 0x44, 0xe9, - 0x77, 0x4a, 0x18, 0x3a, 0xc1, 0x91, 0xd0, 0xc2, 0x88, 0xe4, 0xc7, 0xea, - 0x46, 0x29, 0xc9, 0x26, 0xc0, 0x9d, 0xdf, 0xbf, 0xf6, 0x76, 0x08, 0x4f, - 0xcc, 0x05, 0x0e, 0x63, 0x61, 0xe0, 0x9b, 0xb0, 0xe7, 0x69, 0xca, 0x29, - 0x23, 0x31, 0xec, 0x71, 0xc3, 0xd7, 0x56, 0xec, 0xa0, 0xf8, 0xb7, 0x5e, - 0x7e, 0x9c, 0xca, 0xcf, 0x0f, 0x2a, 0xfa, 0x45, 0xb1, 0x1b, 0xc1, 0xf0, - 0xc5, 0x87, 0x49, 0xf1, 0xca, 0x1e, 0x24, 0x3c, 0x99, 0x3e, 0x52, 0x41, - 0x71, 0x50, 0x9e, 0x8b, 0xc9, 0x53, 0xf4, 0xfd, 0xe8, 0x8b, 0x84, 0x9f, - 0xbc, 0x91, 0x4d, 0x51, 0xbd, 0x78, 0xba, 0xfe, 0x64, 0x32, 0xa8, 0x6b, - 0x8f, 0x1b, 0x2b, 0xff, 0x73, 0x11, 0xc9, 0xf1, 0xa9, 0x23, 0x8c, 0x57, - 0xcc, 0xd9, 0x0f, 0xa7, 0xfa, 0x29, 0xff, 0x61, 0x4d, 0xb9, 0xe6, 0x87, - 0x1d, 0x77, 0x4c, 0x1f, 0xef, 0x04, 0x74, 0xc8, 0x3e, 0x1a, 0x43, 0x05, - 0x8a, 0xef, 0x64, 0x9a, 0x71, 0x1f, 0x9b, 0xa9, 0xcb, 0x05, 0x46, 0x69, - 0x0b, 0x53, 0xb0, 0xba, 0x96, 0xcf, 0x77, 0xd1, 0xc5, 0xdd, 0xdb, 0xa1, - 0x84, 0x40, 0x22, 0x0f, 0xec, 0xef, 0x2d, 0x93, 0x36, 0xa1, 0xfa, 0x64, - 0xd8, 0x14, 0xcb, 0x45, 0xd4, 0x7f, 0xc7, 0x9a, 0xbd, 0xa0, 0xe6, 0xd6, - 0xb9, 0x3f, 0x1e, 0x4e, 0x67, 0xff, 0xe1, 0x8d, 0x6e, 0x48, 0x0c, 0xca, - 0x11, 0x8c, 0x81, 0xed, 0xbb, 0x59, 0xbb, 0xb5, 0x01, 0x4d, 0xe8, 0x93, - 0xbf, 0xfc, 0x1f, 0xed, 0x66, 0x84, 0x78, 0x01, 0xe4, 0xff, 0x00, 0x89, - 0x4f, 0x0e, 0x59, 0x4d, 0x5a, 0xae, 0xe6, 0x53, 0x67, 0x6c, 0xfa, 0xd8, - 0xa7, 0xcf, 0xf2, 0x77, 0x4b, 0xe9, 0x04, 0x8d, 0x8d, 0x73, 0x13, 0xe5, - 0x85, 0x55, 0x64, 0x43, 0xdf, 0xff, 0xe4, 0x45, 0x4a, 0xa6, 0x0e, 0xcc, - 0xb8, 0xb3, 0x6d, 0x9e, 0x14, 0x2a, 0xc3, 0x92, 0x11, 0xd2, 0xbe, 0x4e, - 0x43, 0x33, 0x49, 0xd0, 0x5e, 0x0d, 0xa2, 0xe3, 0xbb, 0x83, 0x00, 0x4a, - 0x37, 0x4b, 0x29, 0x61, 0xfc, 0xc8, 0xfc, 0xbc, 0xf0, 0x92, 0x10, 0xe3, - 0x19, 0x34, 0x31, 0x30, 0x17, 0xc4, 0x1b, 0xfa, 0x43, 0xc0, 0x4c, 0xf8, - 0xe6, 0x6d, 0xb6, 0x0f, 0xaf, 0x9a, 0x0d, 0xda, 0x26, 0x4f, 0x35, 0x97, - 0x1e, 0xcd, 0x15, 0x8a, 0x10, 0x33, 0xc2, 0x9e, 0x7a, 0xa8, 0x16, 0xac, - 0x08, 0xd8, 0xcc, 0xfe, 0xc6, 0x05, 0x78, 0x7d, 0x4b, 0xb3, 0x64, 0x79, - 0x99, 0x8c, 0x87, 0xdd, 0xce, 0x3c, 0xcb, 0x06, 0x54, 0x6b, 0x62, 0x92, - 0x44, 0x6e, 0x85, 0x8e, 0x5c, 0x56, 0x2c, 0x23, 0xac, 0x27, 0xd4, 0x41, - 0x95, 0xcd, 0x37, 0x87, 0x6b, 0xe1, 0x6d, 0x7d, 0xa8, 0xd3, 0x3d, 0x7a, - 0xf9, 0x01, 0xf5, 0x2b, 0xd6, 0xf6, 0x43, 0x54, 0xa8, 0x5e, 0xe9, 0x94, - 0x64, 0xd3, 0xa1, 0xeb, 0x2d, 0xf3, 0x98, 0xc3, 0x39, 0xac, 0x1f, 0x18, - 0x9f, 0xba, 0x2d, 0xe3, 0x85, 0xfc, 0x21, 0x4e, 0xd5, 0x61, 0x52, 0x9e, - 0x97, 0x70, 0x5e, 0xc4, 0x32, 0xc1, 0xb3, 0xab, 0x97, 0xcf, 0x1f, 0x55, - 0xc3, 0x8a, 0x50, 0x96, 0x40, 0xe9, 0xec, 0xcd, 0x17, 0x4d, 0xd1, 0xb5, - 0x01, 0xf5, 0xec, 0x2d, 0x3f, 0x5f, 0x17, 0x39, 0x3e, 0xaa, 0x21, 0x3f, - 0xbf, 0x26, 0x5a, 0x32, 0x5c, 0x59, 0x92, 0x41, 0x4f, 0xa7, 0x66, 0xae, - 0x18, 0xbf, 0xe0, 0xc0, 0xf8, 0x44, 0xe9, 0x41, 0x76, 0x56, 0xdd, 0xc5, - 0x22, 0xf7, 0xa3, 0xdb, 0x03, 0xdb, 0xb1, 0xc4, 0x5a, 0xc0, 0x87, 0x17, - 0xcc, 0xec, 0xfd, 0x3a, 0x47, 0xd1, 0x73, 0x33, 0xb8, 0x07, 0x81, 0xca, - 0xad, 0xd9, 0x6f, 0x60, 0x66, 0xc8, 0xa5, 0x83, 0x7f, 0xec, 0x37, 0x6a, - 0x76, 0x5f, 0xed, 0x60, 0x29, 0x55, 0xf0, 0xf9, 0x64, 0xd2, 0xb4, 0xe1, - 0xd5, 0xd4, 0xf7, 0xfd, 0x3f, 0x36, 0xec, 0x42, 0x8c, 0xea, 0x68, 0xb6, - 0x6e, 0x68, 0x0b, 0xaa, 0x73, 0x91, 0xc1, 0x0a, 0xf4, 0x03, 0x53, 0x24, - 0x5c, 0xf7, 0xd5, 0xe4, 0x5c, 0xea, 0x96, 0xd0, 0x86, 0x23, 0xd0, 0xe8, - 0x26, 0x59, 0xec, 0x14, 0xd1, 0x9f, 0x65, 0x70, 0x67, 0x3b, 0xf7, 0x83, - 0x50, 0x07, 0x58, 0x49, 0x4c, 0xf9, 0x8a, 0x13, 0xdb, 0xd1, 0x54, 0x7b, - 0x12, 0x0d, 0xab, 0xe6, 0x47, 0xbf, 0xd6, 0xc2, 0x49, 0xa4, 0xc2, 0xb6, - 0xe1, 0x1a, 0x93, 0x1f, 0xeb, 0x22, 0x30, 0x34, 0xad, 0x3e, 0x1b, 0xbc, - 0x88, 0x76, 0x00, 0x6f, 0x94, 0x4e, 0x2e, 0x2c, 0x50, 0xde, 0x12, 0x50, - 0x2d, 0x2b, 0xa9, 0x01, 0xaa, 0x79, 0x4e, 0x8c, 0x35, 0xcc, 0x2d, 0x2c, - 0xa7, 0x5a, 0xa4, 0x6b, 0x04, 0x83, 0xb5, 0xcf, 0x4e, 0xa4, 0x9b, 0xe9, - 0x2c, 0x25, 0xcb, 0x3f, 0xec, 0x21, 0xdc, 0x16, 0x0c, 0xc8, 0x28, 0x94, - 0xc2, 0x42, 0x3c, 0x72, 0x87, 0x7e, 0x70, 0x09, 0xc5, 0x42, 0x24, 0xba, - 0xb4, 0x01, 0x8e, 0xe3, 0x6a, 0x0e, 0x9c, 0x77, 0xd2, 0xa2, 0x95, 0x3b, - 0x63, 0xd2, 0xa4, 0xaa, 0x6b, 0x57, 0x3e, 0xad, 0x3b, 0x41, 0x0a, 0x0e, - 0xdc, 0xf9, 0xa0, 0xb2, 0x0e, 0x34, 0x86, 0x31, 0x2c, 0x40, 0x73, 0xf3, - 0xd0, 0xfd, 0x4f, 0xf9, 0xd3, 0xf8, 0xfb, 0x98, 0x0e, 0xc2, 0x1e, 0xd2, - 0x7d, 0x05, 0x24, 0xf3, 0xad, 0x17, 0x1e, 0x6b, 0x44, 0xa7, 0x84, 0x9b, - 0xd2, 0x40, 0x1f, 0x90, 0x83, 0x4d, 0x4a, 0x28, 0x67, 0x80, 0x0f, 0x2e, - 0xb6, 0x3b, 0x73, 0xe4, 0xef, 0x87, 0x84, 0x73, 0x68, 0x72, 0xdb, 0xdc, - 0x72, 0xf1, 0x8b, 0xcb, 0x70, 0x2a, 0xfd, 0xb3, 0x4a, 0x2c, 0x45, 0x55, - 0xf5, 0x87, 0x49, 0xa4, 0x06, 0x46, 0x10, 0x3c, 0xbd, 0x06, 0x74, 0xee, - 0xfd, 0x2d, 0x2d, 0x9f, 0x77, 0x7b, 0xe8, 0x54, 0x50, 0xe1, 0x00, 0x60, - 0xf6, 0xac, 0x64, 0x8a, 0xa4, 0x23, 0xb6, 0xe3, 0xea, 0x13, 0xc2, 0xbc, - 0xca, 0x5a, 0x1f, 0x33, 0x8c, 0x0b, 0xaf, 0xca, 0xea, 0x66, 0x5c, 0xb6, - 0xe6, 0x5e, 0xd1, 0xba, 0xab, 0x81, 0xa8, 0x51, 0x3c, 0x08, 0xe5, 0x62, - 0x3a, 0xf2, 0x8a, 0x52, 0xb3, 0xb3, 0x0a, 0x5c, 0xba, 0x4e, 0x19, 0x56, - 0x22, 0xea, 0x49, 0x6d, 0x00, 0xa6, 0x67, 0x1b, 0x9d, 0x23, 0xdd, 0x9c, - 0xc2, 0x63, 0x28, 0x82, 0xdc, 0xc8, 0xe2, 0x03, 0x53, 0x6e, 0x28, 0xdd, - 0x9d, 0xef, 0xa8, 0xdf, 0x68, 0x22, 0x43, 0x9f, 0x98, 0xde, 0x3c, 0x0e, - 0x37, 0x95, 0x77, 0xe8, 0x36, 0xb6, 0x45, 0x71, 0xc8, 0xad, 0x71, 0xea, - 0x3d, 0xc6, 0xe4, 0x96, 0xb9, 0xe8, 0xb4, 0x8c, 0xfe, 0x33, 0x5d, 0x58, - 0xd7, 0x4c, 0xfe, 0x40, 0xa0, 0xb1, 0xe9, 0xf2, 0xbe, 0x42, 0xba, 0xfd, - 0x8b, 0x63, 0x5f, 0x21, 0xc5, 0xe9, 0x15, 0xce, 0x7d, 0xff, 0xc5, 0x51, - 0xef, 0x37, 0x81, 0xd1, 0x73, 0xe9, 0x55, 0xba, 0x3e, 0xd6, 0x56, 0x10, - 0x95, 0x9d, 0x64, 0x43, 0x1c, 0xc9, 0x6f, 0xc2, 0x8d, 0xdf, 0x7c, 0x3f, - 0x39, 0xa1, 0xaa, 0x43, 0x75, 0x10, 0xf7, 0x99, 0x7e, 0x85, 0xd3, 0x51, - 0x50, 0x4b, 0x1d, 0x75, 0x2c, 0x34, 0xa8, 0x9a, 0x3e, 0xd5, 0xd4, 0x4d, - 0x27, 0x92, 0x21, 0x0d, 0x71, 0xe8, 0x4f, 0x9f, 0xa6, 0xd1, 0x52, 0xa0, - 0xfd, 0x0d, 0x4d, 0x7f, 0xc6, 0xb4, 0xb4, 0xef, 0x43, 0x17, 0xa8, 0x30, - 0x19, 0xc5, 0x09, 0x55, 0xc1, 0x70, 0xca, 0xd6, 0x81, 0x89, 0x75, 0x15, - 0xbf, 0x4e, 0xe5, 0x2a, 0x75, 0xe6, 0x04, 0xf2, 0x98, 0x6a, 0xc3, 0xba, - 0x1b, 0xbc, 0x41, 0x79, 0xe2, 0xd1, 0x23, 0x31, 0x5e, 0xe1, 0x82, 0xbf, - 0x0d, 0x9a, 0x48, 0x20, 0xea, 0x20, 0xb0, 0x16, 0x98, 0xd3, 0x1d, 0x5f, - 0xe0, 0xf0, 0x42, 0x2e, 0x9c, 0xfd, 0x00, 0x2b, 0x7f, 0x8b, 0xa9, 0x90, - 0x89, 0xaf, 0xb6, 0xdb, 0x83, 0x20, 0x81, 0xe0, 0x68, 0xe6, 0xe8, 0xd9, - 0x6e, 0x3d, 0x7b, 0x42, 0x41, 0xf2, 0x81, 0x43, 0x3c, 0x31, 0xeb, 0x1c, - 0xb5, 0x08, 0xf7, 0x0d, 0x8e, 0x30, 0x6a, 0x86, 0x04, 0x58, 0x6f, 0x32, - 0x6f, 0xea, 0x9f, 0xba, 0x4c, 0xe1, 0x9c, 0x19, 0xb7, 0x07, 0x9f, 0xb3, - 0xb1, 0xf0, 0xa5, 0xb5, 0x25, 0xae, 0x7f, 0x2a, 0xe7, 0xf0, 0xcc, 0x33, - 0xcb, 0x2c, 0x8c, 0x72, 0xa9, 0x6a, 0xd1, 0xa3, 0x8c, 0xda, 0x32, 0xac, - 0x6e, 0xa9, 0xc0, 0x11, 0x6c, 0xa5, 0x5a, 0xb6, 0x1d, 0x44, 0x78, 0xea, - 0xf9, 0x61, 0x4d, 0x76, 0x03, 0xbf, 0xf9, 0x6e, 0x61, 0x47, 0xb2, 0x4b, - 0xee, 0x44, 0x00, 0xb3, 0x59, 0x6b, 0x92, 0x20, 0x04, 0x2a, 0x46, 0x6c, - 0xbb, 0xe0, 0xb6, 0x3d, 0xab, 0xf2, 0x28, 0x58, 0xfc, 0xf2, 0x34, 0x6f, - 0x98, 0xc0, 0xe1, 0x41, 0x28, 0x1e, 0x33, 0x42, 0x0d, 0xa9, 0xc2, 0x09, - 0x6d, 0x13, 0x6a, 0x06, 0xa3, 0xa0, 0x47, 0xad, 0x66, 0x9c, 0x81, 0x4c, - 0x1f, 0xf6, 0xde, 0x95, 0xba, 0xaf, 0x0d, 0xda, 0x9a, 0xe0, 0x4b, 0xdd, - 0x36, 0x78, 0xaf, 0x64, 0xbe, 0x77, 0xd8, 0x94, 0xbb, 0x20, 0x01, 0xf8, - 0xf6, 0x29, 0xbb, 0xd8, 0xbf, 0xeb, 0x7e, 0xb6, 0x2e, 0xe4, 0x5f, 0x4a, - 0xe3, 0x85, 0x34, 0x06, 0xa4, 0x8a, 0x54, 0x6f, 0x57, 0x07, 0xdd, 0x99, - 0x24, 0x25, 0x3b, 0x64, 0xd2, 0xed, 0x04, 0xbd, 0xd8, 0xe8, 0xe5, 0xea, - 0x2f, 0xb1, 0xb9, 0x38, 0x12, 0xdd, 0x42, 0xa3, 0xb8, 0xd9, 0x55, 0x63, - 0x66, 0x33, 0x63, 0xbf, 0xcb, 0xeb, 0x56, 0xb9, 0x04, 0x28, 0xb5, 0x30, - 0xa5, 0x5d, 0xed, 0x72, 0x93, 0x69, 0x36, 0xde, 0x63, 0x42, 0x39, 0x18, - 0x40, 0x6d, 0x44, 0x98, 0x65, 0x27, 0xaf, 0x73, 0x57, 0xc9, 0x7d, 0xfa, - 0x1b, 0x76, 0xed, 0xa3, 0x7f, 0xd6, 0x2d, 0x7e, 0x32, 0x51, 0xdb, 0xf3, - 0x25, 0xf8, 0xcd, 0xea, 0x8b, 0x67, 0x27, 0xc5, 0x17, 0x9e, 0x54, 0x05, - 0x79, 0xe7, 0x14, 0xaa, 0x2b, 0x0a, 0xe1, 0x68, 0x95, 0x49, 0x90, 0xbe, - 0xc3, 0x32, 0xdd, 0x82, 0x2b, 0x8f, 0x50, 0xfd, 0x20, 0xa7, 0xdb, 0x0d, - 0xce, 0xee, 0x57, 0xda, 0x5e, 0x70, 0x96, 0x07, 0x90, 0x6e, 0xf7, 0x62, - 0x9c, 0x57, 0x96, 0x34, 0xe5, 0xb3, 0x0d, 0x66, 0x90, 0xa3, 0x82, 0x53, - 0xf3, 0x12, 0x6e, 0x65, 0x78, 0x3b, 0x65, 0x24, 0xdd, 0xf5, 0x49, 0x19, - 0xb9, 0xf0, 0x08, 0x1b, 0x52, 0x6f, 0xe4, 0xd2, 0xd2, 0x20, 0xee, 0x44, - 0x17, 0xcf, 0x57, 0x52, 0xb2, 0x7b, 0x8d, 0xde, 0xaa, 0xed, 0x12, 0xb7, - 0xa8, 0xa0, 0x95, 0x43, 0x76, 0xd4, 0x9c, 0xf9, 0x93, 0xb1, 0x0f, 0x6d, - 0xaf, 0xc5, 0x39, 0xb8, 0x51, 0x55, 0x1e, 0x93, 0xb6, 0xde, 0x34, 0xc8, - 0xf4, 0x8a, 0x8f, 0x3c, 0x94, 0xc9, 0xdd, 0x93, 0xb5, 0x70, 0xb0, 0x3e, - 0xea, 0xbb, 0xab, 0x0c, 0x16, 0xe6, 0x0a, 0xfe, 0x66, 0x0e, 0xa3, 0xa5, - 0x73, 0x54, 0xde, 0x4d, 0x69, 0xee, 0x3d, 0x70, 0x81, 0x01, 0x06, 0x26, - 0x7f, 0xfe, 0x04, 0xac, 0x25, 0x77, 0xdd, 0x67, 0x10, 0x4a, 0x4a, 0xc7, - 0x60, 0x68, 0x71, 0xdf, 0x43, 0x63, 0xc8, 0x97, 0x18, 0x82, 0xbe, 0x1a, - 0xfd, 0xb3, 0x15, 0x81, 0xba, 0x8c, 0x68, 0x23, 0x1e, 0x3a, 0xee, 0xc3, - 0x11, 0xd0, 0x07, 0x44, 0x38, 0x71, 0xe5, 0x63, 0x9e, 0xbe, 0xc4, 0xb9, - 0xf3, 0x7a, 0x7e, 0x81, 0xb3, 0x58, 0xa6, 0x0f, 0x32, 0xbb, 0x5f, 0x6c, - 0xef, 0xc0, 0x6c, 0x49, 0x0c, 0xd3, 0x22, 0x0c, 0xc3, 0xe7, 0xc3, 0xc6, - 0x2c, 0x7f, 0x50, 0x61, 0xcc, 0xcc, 0xed, 0x60, 0x3d, 0x4f, 0x3d, 0xe0, - 0x02, 0x64, 0xd9, 0x8a, 0x5e, 0x7b, 0x5d, 0x82, 0xba, 0xa8, 0x82, 0xda, - 0x85, 0xd7, 0x2f, 0x0d, 0x34, 0xb3, 0x78, 0x15, 0x17, 0x03, 0x14, 0xa9, - 0x97, 0xd4, 0xff, 0xd2, 0x9c, 0x11, 0x95, 0x97, 0x0f, 0x7d, 0x8f, 0x1e, - 0x0c, 0xf0, 0x27, 0x73, 0xef, 0x87, 0xd1, 0x25, 0xcf, 0x57, 0x34, 0x72, - 0x80, 0x40, 0xb5, 0xe8, 0x80, 0xf7, 0x20, 0xb9, 0x07, 0xf4, 0x56, 0xd4, - 0x05, 0x2f, 0xe0, 0x3c, 0x67, 0x54, 0x18, 0xf2, 0xe6, 0x16, 0x25, 0x81, - 0x44, 0x97, 0x73, 0x27, 0xa2, 0x94, 0x4e, 0xf4, 0x0c, 0x0f, 0x42, 0x47, - 0x01, 0xec, 0x9e, 0xd0, 0xbd, 0x45, 0xc4, 0xe4, 0x55, 0x76, 0x10, 0x64, - 0x31, 0xdf, 0x88, 0xae, 0xee, 0x97, 0x75, 0x85, 0xbf, 0x29, 0x75, 0x96, - 0xc8, 0x0c, 0x2c, 0x1c, 0x4c, 0xc6, 0xb0, 0xb8, 0x04, 0x1e, 0x46, 0xfc, - 0x3a, 0x12, 0x08, 0x9c, 0x80, 0x98, 0xdb, 0x77, 0x02, 0x89, 0x1c, 0x35, - 0xc3, 0xea, 0xe5, 0x2d, 0x40, 0x58, 0xd2, 0x0f, 0x9f, 0x61, 0x65, 0xfb, - 0x6b, 0x0f, 0x00, 0xbd, 0xe8, 0x76, 0x55, 0x81, 0x68, 0xe1, 0xc5, 0xce, - 0x36, 0x38, 0xd8, 0xc4, 0x7e, 0xe4, 0x74, 0xcb, 0x55, 0x94, 0x4b, 0xd9, - 0x08, 0xb3, 0x64, 0x5f, 0xf9, 0x46, 0x88, 0x9c, 0xa8, 0x48, 0x51, 0x3e, - 0x11, 0x6b, 0xd9, 0x42, 0xae, 0x51, 0xf6, 0x83, 0x86, 0x16, 0x32, 0xf9, - 0xd7, 0x24, 0x1e, 0x2c, 0x27, 0x72, 0xfc, 0xbf, 0xab, 0x2a, 0x47, 0xeb, - 0xe3, 0x28, 0x5f, 0x2b, 0xc9, 0xde, 0xf6, 0x86, 0x2c, 0x1e, 0xb5, 0x59, - 0x54, 0xe2, 0xc1, 0x5a, 0x05, 0xb1, 0x27, 0x45, 0x55, 0xa9, 0x14, 0x6d, - 0x37, 0xa8, 0xdf, 0xea, 0x4f, 0x16, 0x36, 0x6e, 0x5e, 0x7c, 0xb8, 0x58, - 0xa1, 0x94, 0xbb, 0x2b, 0xc7, 0x0e, 0x3c, 0x32, 0x4b, 0x91, 0x02, 0x96, - 0xda, 0xb5, 0x13, 0x8b, 0xc4, 0x81, 0xa9, 0x8c, 0x6d, 0xb4, 0x99, 0x83, - 0x93, 0x68, 0xcc, 0xad, 0xa8, 0xd5, 0xe8, 0xf4, 0x18, 0xd6, 0x29, 0x23, - 0xa0, 0x30, 0xdb, 0x93, 0x10, 0xce, 0x19, 0x68, 0x8c, 0x30, 0x12, 0xc4, - 0x10, 0x64, 0x4a, 0x77, 0xad, 0xbe, 0x5c, 0x2c, 0x59, 0x74, 0x80, 0x73, - 0xce, 0xcf, 0x83, 0xeb, 0x78, 0x7f, 0x1a, 0x7f, 0x5f, 0xe3, 0x8b, 0x1e, - 0x07, 0xea, 0x7a, 0xf1, 0x6e, 0x3a, 0x3e, 0xef, 0x6e, 0xfd, 0xe4, 0xcc, - 0xd3, 0x1c, 0x2b, 0x1a, 0xc3, 0x64, 0xa0, 0xc9, 0x92, 0x25, 0x2b, 0x58, - 0xc0, 0xae, 0x87, 0x9b, 0x74, 0x85, 0x1b, 0x21, 0x69, 0x94, 0x3a, 0x17, - 0xc1, 0x07, 0xc1, 0xc3, 0x00, 0x3a, 0x8e, 0xea, 0xa1, 0xc2, 0x23, 0x1a, - 0xc5, 0x8e, 0xcd, 0xbb, 0x9a, 0xdb, 0x9d, 0x34, 0x65, 0xfa, 0x9b, 0x4c, - 0x36, 0x84, 0xe4, 0x7d, 0xd8, 0x06, 0x64, 0x92, 0x31, 0xec, 0xba, 0x67, - 0x8b, 0x31, 0xce, 0xc0, 0x13, 0xb3, 0x25, 0x62, 0x52, 0xdf, 0xdf, 0x09, - 0x0d, 0x2d, 0x35, 0x08, 0x5e, 0x90, 0x04, 0x0d, 0x4a, 0x0a, 0xdb, 0x46, - 0x18, 0xdb, 0xa8, 0x17, 0x33, 0xd3, 0x31, 0xd6, 0xb9, 0x85, 0x50, 0x60, - 0xc8, 0xfa, 0x1e, 0xf8, 0x96, 0xe0, 0x8b, 0x78, 0x3f, 0xf3, 0x22, 0x89, - 0xc0, 0x53, 0xdc, 0xc7, 0xca, 0xf0, 0xb3, 0x61, 0xb5, 0x8f, 0x75, 0x9d, - 0x4b, 0xab, 0xed, 0x23, 0xa7, 0x86, 0x61, 0x14, 0x12, 0x01, 0xa4, 0x52, - 0x8f, 0x0a, 0x69, 0x3e, 0x71, 0xf9, 0x06, 0x1c, 0xd5, 0x9c, 0xfa, 0x04, - 0x84, 0x51, 0x80, 0xd9, 0x5b, 0xb1, 0xee, 0x58, 0x59, 0xe6, 0xb8, 0xac, - 0xd4, 0xc4, 0x6a, 0x04, 0xe6, 0xc6, 0xf5, 0xde, 0x74, 0xca, 0x46, 0x79, - 0x5a, 0x2d, 0xbc, 0xd1, 0x3c, 0x81, 0x2a, 0x8d, 0x01, 0x05, 0xf1, 0x30, - 0xf9, 0x9b, 0x99, 0x63, 0x78, 0xce, 0x80, 0xa5, 0x13, 0x53, 0x79, 0xfa, - 0xef, 0x77, 0x71, 0x9e, 0x0b, 0xfe, 0x63, 0x5b, 0xf5, 0xd5, 0xf8, 0x4f, - 0xd6, 0x6e, 0xe5, 0x62, 0x83, 0x50, 0x13, 0x7f, 0xd6, 0x60, 0xb9, 0xb6, - 0xcd, 0x73, 0xbc, 0xe8, 0x99, 0xa3, 0x0f, 0xa4, 0x1b, 0x11, 0xf3, 0x43, - 0xf9, 0x4c, 0x07, 0x6e, 0x7f, 0x58, 0xbd, 0x97, 0x97, 0x36, 0xbb, 0xbb, - 0x13, 0x63, 0xb2, 0x41, 0x2b, 0xc9, 0x0f, 0x29, 0xfb, 0xfe, 0xf2, 0x45, - 0xa2, 0xe1, 0x2c, 0xa4, 0x50, 0x4e, 0x4c, 0xea, 0xee, 0x70, 0x0f, 0xe5, - 0xb4, 0x44, 0x5b, 0xa8, 0xc0, 0x8b, 0x92, 0xf8, 0x18, 0xf8, 0xc9, 0x17, - 0x58, 0x3a, 0xbe, 0xc0, 0x7c, 0x46, 0xc4, 0x73, 0x13, 0x70, 0x32, 0xd9, - 0x9a, 0x55, 0x65, 0xf4, 0x4a, 0xd8, 0xcf, 0xd7, 0x6e, 0xa6, 0x53, 0xc2, - 0x4e, 0xa8, 0x1d, 0x62, 0xab, 0x10, 0xe2, 0xc8, 0x32, 0x54, 0x5a, 0x09, - 0x03, 0xb7, 0x4f, 0x2f, 0x1e, 0xcb, 0xf2, 0xfe, 0x6f, 0x44, 0x39, 0xff, - 0x0e, 0xad, 0x8c, 0x24, 0xa0, 0xb2, 0xe0, 0xae, 0x0c, 0x41, 0xfb, 0xe6, - 0x28, 0x43, 0x69, 0xfe, 0xc6, 0x1e, 0x70, 0x21, 0x0f, 0xea, 0xce, 0x66, - 0xee, 0x5a, 0x58, 0x94, 0x1d, 0x1d, 0xfd, 0x49, 0xfc, 0xb4, 0x8e, 0xa8, - 0xda, 0x55, 0xe3, 0xbe, 0x99, 0xc3, 0x5a, 0xcd, 0x79, 0xb5, 0x78, 0x32, - 0xee, 0x32, 0x49, 0x0f, 0x99, 0xa7, 0xc4, 0x38, 0x79, 0x1b, 0x51, 0xae, - 0x3b, 0x85, 0x6b, 0xf1, 0x2e, 0x40, 0x34, 0xc4, 0xb2, 0x99, 0x89, 0xac, - 0xef, 0x16, 0x91, 0x64, 0x70, 0x2c, 0x74, 0x32, 0xeb, 0x59, 0x61, 0xe0, - 0xc7, 0x01, 0x5e, 0x66, 0xb3, 0x34, 0x6d, 0xa5, 0xc1, 0xdf, 0x2c, 0xb5, - 0x47, 0x34, 0xde, 0x67, 0x1b, 0x33, 0xbc, 0xde, 0xf2, 0xf2, 0x38, 0xcb, - 0x00, 0x28, 0x8b, 0x29, 0x1d, 0x42, 0x73, 0x56, 0x97, 0xee, 0xdc, 0x0f, - 0x89, 0xbb, 0x3d, 0x96, 0xa1, 0x2b, 0xf0, 0xa3, 0x9a, 0xba, 0x56, 0xde, - 0x93, 0xb7, 0xdf, 0xb3, 0x79, 0xd4, 0x4c, 0xce, 0x11, 0x8d, 0xa5, 0xae, - 0xbb, 0x73, 0xae, 0x9c, 0x7e, 0x44, 0xa1, 0xca, 0x29, 0xbd, 0x16, 0xeb, - 0xcf, 0x83, 0x9c, 0x56, 0xdc, 0xae, 0x92, 0x12, 0x3f, 0x0f, 0xd5, 0x3f, - 0x5d, 0x74, 0xd9, 0xc9, 0x6d, 0xa0, 0x00, 0x0b, 0xa2, 0xe6, 0xca, 0x49, - 0x8c, 0x67, 0x26, 0x9a, 0x36, 0x1e, 0xfe, 0x77, 0x96, 0x1f, 0x09, 0x59, - 0xae, 0xc6, 0xa9, 0xac, 0x05, 0xac, 0x33, 0x17, 0xbf, 0x2e, 0xee, 0xff, - 0x47, 0x12, 0xac, 0xc4, 0x33, 0xab, 0xe6, 0x72, 0xf8, 0x48, 0x78, 0xa9, - 0x2f, 0x41, 0xa4, 0x8e, 0x4c, 0xbd, 0x70, 0x35, 0xf2, 0xc7, 0x2b, 0x09, - 0x0a, 0x73, 0xe2, 0x70, 0xc3, 0xd8, 0x46, 0xc2, 0xb2, 0x98, 0xe0, 0x81, - 0x7b, 0x91, 0x2d, 0xb1, 0x37, 0x67, 0x4f, 0xbe, 0x34, 0x0f, 0xe9, 0xb3, - 0x02, 0xe7, 0x30, 0xd2, 0x66, 0xd3, 0x6e, 0x4c, 0x0d, 0x3e, 0x81, 0x5d, - 0xb6, 0x42, 0x82, 0x6f, 0x21, 0x07, 0x3c, 0xe5, 0x3f, 0xc2, 0x9f, 0x46, - 0x76, 0x02, 0xcd, 0x41, 0x3a, 0x71, 0x34, 0xa9, 0xe1, 0x59, 0x4e, 0xc5, - 0x05, 0xe9, 0xc6, 0x77, 0x86, 0xb7, 0xa8, 0x66, 0x05, 0x7d, 0x1e, 0xb1, - 0x20, 0x83, 0x1f, 0x5c, 0x02, 0x81, 0xcc, 0x04, 0xab, 0xf0, 0xd5, 0x7b, - 0xbe, 0x68, 0x8f, 0x40, 0x26, 0xd0, 0x51, 0xbf, 0x0d, 0xa5, 0xf8, 0xad, - 0x59, 0x8d, 0x4f, 0x72, 0x16, 0x2b, 0xe8, 0xa4, 0xc2, 0x01, 0x62, 0xc2, - 0xfb, 0xda, 0xd2, 0x27, 0xc4, 0xb6, 0xbb, 0x28, 0x59, 0x55, 0xd0, 0x55, - 0x74, 0xf4, 0xdd, 0x06, 0xba, 0x72, 0x98, 0x40, 0x52, 0x4b, 0xb2, 0xe6, - 0x57, 0xa4, 0x42, 0x14, 0x45, 0xd2, 0x4a, 0x14, 0x55, 0x21, 0xc4, 0xf7, - 0x6c, 0xd7, 0x35, 0xd8, 0x7a, 0x45, 0xbc, 0x64, 0x3b, 0x73, 0x0f, 0x3e, - 0x5e, 0xda, 0x01, 0x31, 0xb3, 0xa7, 0x9b, 0xd2, 0x64, 0x4c, 0xdf, 0x7a, - 0x71, 0x97, 0xc1, 0xe8, 0x5b, 0x9a, 0x5d, 0xe3, 0xce, 0x88, 0x2e, 0x12, - 0x58, 0xbf, 0x48, 0x5d, 0xe5, 0x3f, 0xc4, 0x42, 0x58, 0x4a, 0x58, 0xc4, - 0x12, 0x2d, 0xbb, 0x09, 0x33, 0x98, 0x7d, 0x7f, 0x51, 0xe0, 0x4c, 0x99, - 0x27, 0xcc, 0x66, 0x96, 0x93, 0x61, 0xf6, 0x62, 0xda, 0xb5, 0x2f, 0x72, - 0x93, 0x68, 0x70, 0x47, 0xf1, 0xa5, 0x97, 0x7c, 0x4e, 0x0b, 0x3a, 0x00, - 0xa7, 0xfd, 0x36, 0x24, 0x12, 0x73, 0x46, 0xff, 0x3d, 0x0c, 0xd0, 0x50, - 0x46, 0xd4, 0xef, 0x70, 0x99, 0xf2, 0x23, 0x96, 0x5f, 0x75, 0x83, 0xda, - 0xa1, 0x33, 0xfe, 0xfc, 0x79, 0x10, 0x8c, 0x01, 0x08, 0xf9, 0x05, 0x1e, - 0x3a, 0xb9, 0x37, 0xc6, 0x7b, 0x78, 0xd1, 0x47, 0x6c, 0xf5, 0xd0, 0x01, - 0x0c, 0xdc, 0x59, 0x8a, 0x27, 0x3d, 0x75, 0x84, 0xff, 0xa8, 0x34, 0x65, - 0x3f, 0x2a, 0xd4, 0xf1, 0xac, 0x62, 0xa3, 0x66, 0x03, 0x88, 0xec, 0xfc, - 0xfc, 0x02, 0x40, 0x9e, 0xbe, 0xea, 0xdb, 0x37, 0xb7, 0x90, 0x16, 0xb6, - 0xca, 0x85, 0x82, 0xf4, 0xc1, 0x92, 0x8f, 0x28, 0x7f, 0x92, 0x18, 0xe8, - 0x03, 0x3c, 0x5e, 0x7e, 0xaf, 0x7b, 0xb7, 0x68, 0x2f, 0xe0, 0xc1, 0xe9, - 0x1c, 0x46, 0x83, 0xe9, 0x56, 0x4c, 0xf4, 0xaf, 0x81, 0x0a, 0xc6, 0x6d, - 0xd7, 0xcb, 0x67, 0x1a, 0xbc, 0xf0, 0x82, 0x88, 0x11, 0xe2, 0xef, 0x6d, - 0x55, 0xfd, 0x2d, 0x6d, 0x58, 0xcb, 0x15, 0x74, 0xaa, 0x4d, 0x8e, 0x15, - 0xca, 0x9b, 0x41, 0x5b, 0x1a, 0x93, 0xdf, 0x17, 0x67, 0xe2, 0x1b, 0x1b, - 0x79, 0x51, 0x07, 0x84, 0x03, 0x47, 0x46, 0x0a, 0xe4, 0x32, 0xf4, 0xae, - 0x54, 0xc1, 0xbb, 0xdf, 0x92, 0xd3, 0xa6, 0x32, 0x99, 0xc8, 0x9d, 0x29, - 0xd2, 0xfd, 0x57, 0xac, 0xd9, 0x43, 0x7b, 0xe5, 0xec, 0x9e, 0x6d, 0x49, - 0x75, 0x62, 0x71, 0x34, 0x7f, 0x94, 0x6f, 0xf3, 0x60, 0xc1, 0x3b, 0xfe, - 0x25, 0x11, 0x82, 0x29, 0x64, 0x8b, 0xb5, 0x5c, 0x92, 0xc3, 0xea, 0x71, - 0x2a, 0xea, 0x25, 0xd9, 0x35, 0x54, 0xe8, 0x14, 0xd2, 0xae, 0xeb, 0xdd, - 0x69, 0x91, 0x87, 0xd3, 0x9e, 0xd1, 0x3b, 0xf4, 0x8f, 0xfb, 0x16, 0x3c, - 0x02, 0x37, 0x97, 0x43, 0xe0, 0xa2, 0xb3, 0xf9, 0x27, 0x8a, 0xd7, 0x42, - 0xac, 0xc2, 0xad, 0xcd, 0xa7, 0x5a, 0xb2, 0x51, 0x66, 0xe9, 0xd4, 0xae, - 0x6a, 0x07, 0x06, 0x32, 0x33, 0x0f, 0x3e, 0x11, 0xbd, 0xda, 0xdc, 0xe8, - 0xa0, 0x4d, 0x59, 0x5d, 0xe1, 0x2d, 0xf8, 0x4f, 0xd9, 0x0d, 0x3b, 0x35, - 0x01, 0x91, 0xa7, 0xa5, 0x7d, 0x3f, 0x40, 0xab, 0x8c, 0xef, 0xba, 0xcb, - 0xa6, 0x7d, 0xc2, 0xd5, 0x32, 0xbf, 0xf2, 0xe7, 0x98, 0xd6, 0xdf, 0x3a, - 0xfa, 0x69, 0x43, 0x2e, 0xbe, 0xd9, 0x9d, 0x5e, 0x3a, 0xd0, 0xe9, 0xde, - 0x33, 0xee, 0xf2, 0x02, 0xb7, 0xb5, 0x6d, 0xab, 0xc4, 0xf1, 0x8e, 0x9c, - 0x42, 0xb4, 0xd6, 0x13, 0xbb, 0x52, 0x56, 0x33, 0x72, 0xeb, 0xae, 0xb8, - 0x38, 0x5d, 0x51, 0xe7, 0xf9, 0x64, 0xaf, 0x43, 0x3c, 0x39, 0x12, 0x5c, - 0x50, 0xa7, 0x3f, 0xbe, 0xa0, 0x1a, 0xe1, 0x17, 0x2f, 0x02, 0x24, 0x99, - 0x74, 0xe2, 0x42, 0xe6, 0xc0, 0xfd, 0x5f, 0xe2, 0xf6, 0x0c, 0x83, 0xba, - 0xba, 0xc5, 0x32, 0xd4, 0x3e, 0x6d, 0x14, 0x6c, 0x70, 0xa2, 0xd3, 0x12, - 0xc5, 0xfa, 0xa2, 0xa0, 0x30, 0xb6, 0xe9, 0xec, 0xf0, 0xaf, 0x4f, 0x14, - 0x2b, 0xbc, 0x3e, 0xcc, 0x27, 0xe8, 0x15, 0xcc, 0xd6, 0x2c, 0xa9, 0x5a, - 0x22, 0x33, 0x82, 0xfd, 0xf5, 0xda, 0xcc, 0x69, 0xae, 0xf7, 0xec, 0xdf, - 0x6c, 0x53, 0x6e, 0x70, 0x6e, 0x72, 0x9f, 0xdc, 0xda, 0xe5, 0x61, 0x35, - 0x22, 0xf5, 0x3d, 0x6d, 0xf7, 0x1b, 0xea, 0xaf, 0xb5, 0xaf, 0x64, 0xa1, - 0x23, 0x4e, 0x3e, 0x4f, 0xdb, 0x8e, 0x69, 0x7f, 0x6f, 0x6c, 0x6a, 0xe2, - 0x9b, 0xda, 0x2d, 0x5e, 0xfb, 0xa5, 0x2a, 0xbe, 0x1e, 0x0a, 0x3c, 0xc5, - 0x1a, 0xa4, 0xf0, 0x34, 0xfe, 0x2e, 0x8b, 0xfb, 0x8e, 0x19, 0xc6, 0xb0, - 0xd7, 0x82, 0x32, 0x6b, 0xa7, 0x67, 0x67, 0x87, 0x78, 0x3c, 0xc3, 0xda, - 0x54, 0x49, 0x22, 0x1c, 0x91, 0x32, 0x56, 0x0a, 0xdd, 0x3c, 0xde, 0xd9, - 0xe6, 0x97, 0xc4, 0x44, 0xcf, 0xe4, 0x89, 0x39, 0x99, 0x30, 0x2c, 0x84, - 0xbb, 0xf8, 0x92, 0xc6, 0x97, 0x5e, 0x1e, 0x58, 0x82, 0x67, 0x51, 0x1d, - 0xf6, 0x0a, 0xee, 0x3e, 0xa1, 0xde, 0x1c, 0xa1, 0xf1, 0x2c, 0x36, 0x49, - 0x55, 0x42, 0xd7, 0xd6, 0x91, 0x9b, 0x96, 0xaa, 0x54, 0xec, 0xf0, 0x1c, - 0x34, 0x76, 0x7b, 0x72, 0xf5, 0x1c, 0x07, 0x94, 0xf2, 0xf7, 0x26, 0x40, - 0x7f, 0xf2, 0x85, 0xa5, 0x53, 0xb1, 0xd8, 0xdc, 0x0e, 0x2d, 0x32, 0xa8, - 0x35, 0x41, 0x54, 0xcb, 0x94, 0x3f, 0x2f, 0x44, 0x1e, 0x8e, 0xee, 0x7b, - 0x1d, 0xb9, 0x5b, 0xe8, 0xd5, 0x5a, 0xcb, 0x39, 0x60, 0xf4, 0xe0, 0xf9, - 0x30, 0x12, 0xf6, 0x92, 0xf2, 0x04, 0xd6, 0x5e, 0x4c, 0x41, 0xb3, 0x9f, - 0xf7, 0x5b, 0xb6, 0xdf, 0x20, 0xa8, 0x19, 0x02, 0x04, 0x64, 0x0b, 0x87, - 0x05, 0x0d, 0x6a, 0x3f, 0xa7, 0xd8, 0x2e, 0x08, 0x42, 0xda, 0x9a, 0x32, - 0x5f, 0xb7, 0xe5, 0x78, 0x24, 0xc1, 0xf3, 0x58, 0x89, 0xe2, 0x53, 0x57, - 0xc8, 0xaf, 0xbb, 0x68, 0x53, 0xa3, 0x3e, 0x73, 0x9f, 0x32, 0x2b, 0x30, - 0x46, 0xf5, 0x2b, 0xbd, 0x63, 0x3a, 0x8b, 0x90, 0xa8, 0x7f, 0x20, 0x50, - 0xd2, 0xc9, 0x91, 0x02, 0x44, 0x0c, 0x5f, 0xa2, 0x2d, 0x94, 0x36, 0x66, - 0xa6, 0x94, 0xd3, 0x0e, 0x1a, 0xda, 0x50, 0x5b, 0x3f, 0xeb, 0xc1, 0x8c, - 0x20, 0x3f, 0x47, 0x66, 0x9b, 0x31, 0xc3, 0x9c, 0x45, 0x1b, 0x6c, 0xf5, - 0x03, 0xac, 0x9a, 0xff, 0x24, 0x45, 0xc3, 0xb2, 0xcd, 0x4c, 0x4e, 0xb9, - 0xa8, 0x1b, 0xd6, 0x43, 0xc6, 0x7d, 0xb2, 0xcc, 0xd0, 0x8c, 0xf6, 0x2a, - 0x3c, 0x47, 0x37, 0xd5, 0x6c, 0x5c, 0x07, 0x4e, 0xaa, 0x66, 0xf7, 0x21, - 0x9c, 0x05, 0xfc, 0xa7, 0xcb, 0x67, 0x7b, 0x7b, 0x25, 0x5f, 0xbb, 0x17, - 0x4b, 0x99, 0x86, 0x20, 0x59, 0xd7, 0x67, 0xe0, 0xb6, 0x15, 0x67, 0xea, - 0xe7, 0x6d, 0xd9, 0x3e, 0x1e, 0xa7, 0x71, 0x45, 0x58, 0x27, 0xc5, 0xd5, - 0x57, 0x7e, 0x20, 0xeb, 0x10, 0xcf, 0x9c, 0x84, 0x7d, 0x18, 0xb3, 0xcf, - 0x2a, 0x50, 0x88, 0x9d, 0x9d, 0xbb, 0xca, 0x1f, 0x16, 0xde, 0x16, 0xe6, - 0x7f, 0xbd, 0x02, 0x20, 0xf1, 0xf7, 0x37, 0x23, 0xb7, 0x09, 0xbb, 0x88, - 0x60, 0x99, 0xbc, 0xc2, 0x5c, 0x51, 0xc7, 0x33, 0xde, 0x4e, 0x79, 0xb3, - 0x7a, 0x1b, 0x45, 0x70, 0xd2, 0xa3, 0x6d, 0x40, 0x1b, 0x2a, 0xa0, 0x40, - 0x82, 0x4c, 0xa8, 0xce, 0x68, 0xdc, 0xc1, 0x2b, 0x16, 0x8a, 0xf2, 0xda, - 0xc6, 0x8a, 0x5c, 0xdc, 0x26, 0x5f, 0x22, 0x84, 0xe6, 0x69, 0xfa, 0xf0, - 0x0d, 0xf4, 0x52, 0x22, 0xf0, 0xe7, 0x0e, 0xc0, 0x95, 0x28, 0x9a, 0xd2, - 0xb7, 0x73, 0x73, 0xb8, 0x38, 0x5e, 0x62, 0x9f, 0xef, 0xdf, 0xb6, 0xa6, - 0x44, 0x59, 0xff, 0x3d, 0x0d, 0x32, 0x05, 0x46, 0xa6, 0x0e, 0x6c, 0x05, - 0x1b, 0xf7, 0x43, 0xaf, 0xfd, 0x9e, 0x55, 0x58, 0xcf, 0x37, 0x17, 0x85, - 0x71, 0x83, 0xc1, 0x7f, 0x49, 0x92, 0x88, 0xac, 0xf1, 0x69, 0xe3, 0x32, - 0x9c, 0x3a, 0x61, 0x73, 0xf4, 0xfe, 0x89, 0xbf, 0xef, 0x3c, 0xdb, 0x2f, - 0x6f, 0xf9, 0x0f, 0x0f, 0x44, 0x4e, 0xfe, 0x0f, 0x95, 0x14, 0x45, 0xce, - 0x21, 0x8a, 0x55, 0xe5, 0x0c, 0xc5, 0xb6, 0xc5, 0x18, 0xe1, 0xdc, 0xbb, - 0x45, 0xe7, 0xb3, 0x70, 0x40, 0x10, 0xe6, 0x70, 0x2b, 0x06, 0xbb, 0x30, - 0xa3, 0xc0, 0x19, 0xae, 0x5e, 0x89, 0x22, 0x11, 0xb6, 0xa8, 0xc5, 0xf1, - 0xd1, 0xaf, 0x58, 0x8d, 0x63, 0x21, 0xc9, 0x34, 0xc1, 0x2a, 0xa3, 0x80, - 0x5f, 0xb1, 0x95, 0xa8, 0xd1, 0xd4, 0xf4, 0xd2, 0x90, 0xe5, 0xc5, 0x29, - 0xaa, 0xa7, 0xa0, 0x44, 0x66, 0xbc, 0xcb, 0x2f, 0x4e, 0x14, 0x5a, 0x5c, - 0x31, 0x10, 0xa0, 0xac, 0x82, 0xd0, 0x34, 0x45, 0x8e, 0x04, 0xbd, 0x14, - 0xd3, 0x02, 0x43, 0x79, 0x7a, 0x3e, 0xb6, 0x47, 0xfa, 0x52, 0xf1, 0xc7, - 0xd2, 0xfd, 0x01, 0x91, 0x98, 0xe6, 0xf7, 0x79, 0xe8, 0xa2, 0x09, 0x51, - 0x6c, 0x7d, 0xa6, 0x65, 0x4e, 0x8c, 0x95, 0xf0, 0x7a, 0xbf, 0xac, 0xe0, - 0x6b, 0x22, 0x70, 0xc3, 0x7a, 0x1c, 0x4e, 0xda, 0x73, 0x7a, 0xef, 0x39, - 0x81, 0xb4, 0xce, 0xe9, 0xcf, 0xd9, 0xba, 0x4d, 0x1c, 0xd2, 0xc9, 0xe7, - 0x91, 0xca, 0xeb, 0xed, 0xba, 0x3d, 0x65, 0x6e, 0x86, 0x5d, 0x7f, 0x54, - 0x44, 0x93, 0x1b, 0x19, 0x75, 0xb1, 0x41, 0x6a, 0x5c, 0x47, 0x50, 0x9c, - 0x51, 0x81, 0x83, 0xb1, 0x99, 0x5c, 0xb4, 0xee, 0x03, 0x6e, 0x1e, 0xb2, - 0x1a, 0xbe, 0x3e, 0x18, 0x10, 0x21, 0xf9, 0xe3, 0xbb, 0xc8, 0xf8, 0x33, - 0xac, 0xf2, 0xf2, 0x41, 0x7e, 0x7b, 0xbe, 0xb3, 0x18, 0xdf, 0xda, 0xdb, - 0x51, 0x5a, 0xa4, 0xc4, 0xa7, 0xde, 0x6f, 0x8a, 0x6c, 0x14, 0x84, 0x07, - 0x68, 0x4b, 0xcf, 0x47, 0x2b, 0xc6, 0xea, 0xe1, 0x30, 0xdf, 0x55, 0xa1, - 0xe2, 0x0b, 0x1c, 0x7e, 0xdb, 0x4b, 0x4d, 0x23, 0xbc, 0xa3, 0x02, 0x23, - 0xf1, 0x85, 0xdf, 0xf5, 0x1e, 0x7a, 0x46, 0x75, 0x5f, 0x05, 0x54, 0x1c, - 0xff, 0x99, 0x36, 0x4c, 0x08, 0xaf, 0x90, 0x36, 0x06, 0x9b, 0xea, 0x5f, - 0x33, 0x14, 0xbd, 0x0c, 0x28, 0x96, 0x59, 0x84, 0x2a, 0x2e, 0x84, 0x9c, - 0xc2, 0x0b, 0xbe, 0xc3, 0x76, 0x10, 0x97, 0x2a, 0xf6, 0x96, 0x86, 0xd7, - 0x79, 0xf6, 0xee, 0xd4, 0x68, 0x03, 0x36, 0x63, 0xed, 0x6d, 0x68, 0x14, - 0x68, 0xae, 0x9c, 0x78, 0xee, 0xa8, 0xbc, 0xde, 0x89, 0x3b, 0xdf, 0xa6, - 0x48, 0x57, 0xab, 0x7e, 0xd7, 0x67, 0xf2, 0x63, 0x18, 0x5a, 0x0c, 0x8a, - 0x1f, 0x52, 0x0c, 0xd6, 0x1b, 0x02, 0x5e, 0xb7, 0x9a, 0xeb, 0x31, 0xb2, - 0x9f, 0x2a, 0xf8, 0x58, 0x69, 0x46, 0x52, 0xee, 0x4d, 0xee, 0x5c, 0xcc, - 0xd0, 0x17, 0x9d, 0x4b, 0x39, 0x8a, 0x16, 0xad, 0x94, 0x14, 0x8a, 0x5a, - 0x11, 0xd1, 0xba, 0x90, 0x3d, 0x4c, 0xb5, 0xce, 0xdd, 0x3d, 0x6c, 0x20, - 0x12, 0x50, 0x59, 0xeb, 0x02, 0xa4, 0xa5, 0xff, 0xd9, 0x20, 0xbc, 0xe0, - 0x88, 0xce, 0xe1, 0xb7, 0x8b, 0x3b, 0xba, 0x5c, 0xea, 0xb6, 0x12, 0x11, - 0x75, 0x8d, 0x1a, 0x1e, 0x93, 0xeb, 0x8b, 0x51, 0x70, 0xf3, 0x54, 0x7a, - 0xb3, 0x5f, 0xe5, 0x3a, 0x08, 0x83, 0xb8, 0xcf, 0xd3, 0x09, 0x92, 0xaf, - 0x9c, 0x41, 0x4f, 0x8b, 0x9c, 0x9a, 0xad, 0x25, 0x84, 0x73, 0xb9, 0xb3, - 0x23, 0x14, 0x03, 0x0b, 0x50, 0xb3, 0xbe, 0xfe, 0xd6, 0x99, 0x93, 0x06, - 0x18, 0xb9, 0x6c, 0x76, 0xce, 0xe0, 0x42, 0xed, 0xe7, 0x7c, 0x50, 0x68, - 0xdd, 0x05, 0x3b, 0x23, 0x01, 0x46, 0x11, 0xf8, 0xbd, 0x62, 0x66, 0x3c, - 0x53, 0x0b, 0xec, 0x56, 0x4e, 0xc6, 0x99, 0x4e, 0xe9, 0xa8, 0xe7, 0x72, - 0x29, 0xa7, 0xa3, 0x48, 0xa8, 0x7d, 0x89, 0x3b, 0xee, 0x65, 0x69, 0x3b, - 0x9b, 0xfb, 0x1e, 0xe0, 0x2d, 0x46, 0xcf, 0xf9, 0x01, 0x12, 0xba, 0x2c, - 0xfa, 0x91, 0xbc, 0x88, 0x6c, 0xe9, 0x5a, 0x17, 0x53, 0x8f, 0xf2, 0x14, - 0x30, 0xe9, 0x68, 0x37, 0xf8, 0xb5, 0xf1, 0x8c, 0x5e, 0xf6, 0xa5, 0x9d, - 0x82, 0x28, 0x84, 0x73, 0xf0, 0xc0, 0x63, 0x3e, 0x19, 0x23, 0x6c, 0xc7, - 0x4e, 0x13, 0x8e, 0x19, 0xd5, 0xf2, 0xd0, 0xf1, 0x5a, 0x52, 0x0e, 0xfe, - 0x49, 0xc5, 0x2e, 0x1e, 0x19, 0x3d, 0xd8, 0xed, 0xd4, 0xd2, 0x43, 0x58, - 0x43, 0x5f, 0xce, 0x89, 0x98, 0xd4, 0x2c, 0xca, 0x1c, 0xd6, 0xd5, 0x56, - 0x97, 0x1c, 0x56, 0x03, 0x94, 0x5b, 0x59, 0x23, 0x26, 0xa3, 0xdb, 0x92, - 0x45, 0x1c, 0xa9, 0xc7, 0xd4, 0x52, 0x8a, 0x71, 0xde, 0x45, 0xcd, 0x0f, - 0xc6, 0x6b, 0x0e, 0xe3, 0x6f, 0x53, 0x83, 0x33, 0x20, 0x6f, 0x10, 0xbc, - 0xf5, 0xf8, 0xbe, 0xa4, 0x44, 0xb9, 0x7a, 0xe7, 0x73, 0x5f, 0x47, 0x62, - 0xc2, 0x54, 0xe3, 0xdd, 0x3c, 0xcf, 0x58, 0x86, 0xed, 0x3a, 0x8b, 0xc0, - 0x5b, 0x75, 0x9b, 0xee, 0x2e, 0xec, 0x27, 0x2d, 0xc1, 0x4a, 0x95, 0xbd, - 0x0b, 0x1b, 0x36, 0x57, 0x50, 0x05, 0x00, 0x10, 0xd6, 0x45, 0x4e, 0xb2, - 0x24, 0x0b, 0x97, 0x66, 0xf7, 0x3a, 0xac, 0x58, 0xac, 0x91, 0xd9, 0x0c, - 0xf6, 0x09, 0xa1, 0xb2, 0xa5, 0x2a, 0x39, 0x2f, 0x4d, 0x72, 0xd3, 0x59, - 0x59, 0x3e, 0x21, 0x28, 0xb6, 0x70, 0xde, 0x8f, 0x12, 0x67, 0xea, 0xf6, - 0x4d, 0x2a, 0x36, 0x75, 0x95, 0x1f, 0x16, 0xfd, 0xe0, 0xfc, 0xd7, 0xc8, - 0xad, 0x69, 0x7c, 0x12, 0x73, 0x36, 0xfd, 0x91, 0xc7, 0x58, 0xb4, 0x81, - 0xfb, 0x2b, 0xd5, 0xf6, 0x0e, 0x19, 0x4d, 0x04, 0x8e, 0xed, 0xc0, 0xae, - 0x9d, 0xd6, 0x69, 0x47, 0xb5, 0x88, 0x17, 0xb9, 0xd1, 0xcf, 0x9b, 0x27, - 0xde, 0x14, 0x30, 0x57, 0xee, 0xba, 0x0e, 0x3f, 0xe2, 0xed, 0xdf, 0xf3, - 0x67, 0x27, 0x25, 0x51, 0x0e, 0x06, 0x92, 0xaa, 0x5c, 0x41, 0x46, 0xb0, - 0x61, 0xe1, 0x04, 0x99, 0x0e, 0x28, 0x96, 0xbb, 0x12, 0x20, 0xd3, 0xd3, - 0x95, 0x3f, 0xc6, 0x3d, 0xcf, 0x48, 0x43, 0x50, 0x14, 0xe2, 0x0f, 0x86, - 0xa0, 0x47, 0xd6, 0x22, 0x4e, 0xa7, 0x2b, 0x13, 0xa6, 0x9e, 0x0e, 0x88, - 0x1d, 0xc9, 0xb6, 0xf7, 0x8e, 0x7d, 0xdd, 0xfc, 0xc3, 0x1f, 0xfc, 0x16, - 0xfb, 0x25, 0xf2, 0x41, 0x5f, 0x69, 0xd3, 0x4b, 0x54, 0xb9, 0x30, 0x1a, - 0x19, 0x8d, 0x76, 0xab, 0xf4, 0xe5, 0x10, 0x0f, 0x4e, 0xe9, 0x7d, 0x08, - 0x08, 0x9c, 0x7a, 0x56, 0x22, 0x3c, 0xb1, 0xe2, 0xad, 0x1e, 0x46, 0xc0, - 0x91, 0x5a, 0x2f, 0x09, 0x2f, 0xea, 0xc6, 0x14, 0xc6, 0x1c, 0xeb, 0xf1, - 0xf4, 0xbb, 0x9c, 0x6e, 0xbb, 0xd0, 0x43, 0x2f, 0x36, 0xd8, 0x6b, 0xba, - 0xef, 0xbf, 0x3e, 0x84, 0x08, 0x32, 0x79, 0x5d, 0xd3, 0xf6, 0x67, 0xcb, - 0x86, 0x93, 0x38, 0xd8, 0xe7, 0x81, 0x5f, 0xb5, 0x8a, 0xbc, 0xf8, 0xcb, - 0x6f, 0x5e, 0xa3, 0x24, 0x42, 0x6f, 0xe3, 0x8b, 0x0b, 0x5d, 0x32, 0x73, - 0xe6, 0x99, 0x63, 0x0a, 0x31, 0x51, 0xbf, 0x8d, 0x80, 0x3e, 0x6e, 0x22, - 0x8f, 0x25, 0xdb, 0xce, 0xcb, 0xe7, 0x1b, 0xbf, 0xe1, 0xd5, 0x5c, 0xe4, - 0xee, 0x5d, 0x96, 0xeb, 0x7d, 0x2e, 0x64, 0x95, 0xa5, 0x6f, 0x3d, 0x7b, - 0xda, 0x8f, 0x8f, 0x3e, 0x32, 0xe1, 0xdb, 0x1a, 0x2f, 0x5e, 0x42, 0xf4, - 0x84, 0xec, 0x33, 0x7b, 0x38, 0x98, 0x79, 0xbe, 0xee, 0xe5, 0xd2, 0x45, - 0x3d, 0x4c, 0xc5, 0x22, 0xb4, 0xd0, 0xfb, 0x3e, 0xbc, 0xb6, 0x7f, 0xde, - 0xcb, 0x84, 0xe9, 0x38, 0xfa, 0x17, 0x77, 0x7e, 0xb3, 0x91, 0xe3, 0xe9, - 0xcc, 0x96, 0xb0, 0xc8, 0xe5, 0xbc, 0x48, 0x7e, 0xf8, 0xfa, 0x02, 0x8e, - 0x8d, 0x23, 0x55, 0xc3, 0x6f, 0xa3, 0x83, 0xea, 0x4b, 0x76, 0xcf, 0x14, - 0x2a, 0x9d, 0xe5, 0x1e, 0xd3, 0x64, 0xe2, 0x2e, 0x37, 0x6e, 0x19, 0x9f, - 0xbf, 0x1f, 0x4c, 0x4c, 0x57, 0x36, 0xde, 0xd4, 0xb0, 0x7a, 0x6d, 0xfe, - 0xaa, 0x33, 0x8a, 0xf2, 0x78, 0xee, 0xc1, 0x2d, 0x55, 0x7e, 0x49, 0x60, - 0xbc, 0x85, 0x6d, 0x97, 0xdc, 0xd5, 0xe6, 0x3a, 0x61, 0xab, 0x42, 0x33, - 0xe2, 0xbf, 0xca, 0xfa, 0xb5, 0x8b, 0xbf, 0x5f, 0xf1, 0x52, 0x61, 0x39, - 0xec, 0x43, 0x31, 0xc9, 0x4d, 0x8e, 0x14, 0xc5, 0x74, 0xfe, 0xba, 0x19, - 0x50, 0x0f, 0xeb, 0x2f, 0x7e, 0x46, 0x9b, 0x52, 0x27, 0x30, 0xe1, 0x99, - 0x6b, 0x5a, 0xae, 0xe5, 0x5e, 0x96, 0x80, 0x5e, 0x44, 0x10, 0xee, 0x52, - 0xf4, 0x1d, 0xae, 0xd5, 0x8e, 0xa3, 0x4c, 0x06, 0x2b, 0x36, 0x52, 0xec, - 0x2a, 0xdb, 0xd1, 0x58, 0x8a, 0xed, 0x58, 0x9d, 0x6b, 0xa2, 0x1e, 0x5d, - 0x2e, 0x86, 0xbf, 0x11, 0xbc, 0xe3, 0xfa, 0xaa, 0x87, 0x9e, 0xfc, 0x56, - 0x70, 0xbb, 0x64, 0xae, 0x16, 0x37, 0xa5, 0x32, 0xb5, 0x91, 0x7b, 0xfe, - 0x92, 0x9e, 0xc6, 0x66, 0x08, 0xeb, 0xc0, 0x4e, 0x30, 0xa9, 0x64, 0xcc, - 0xe0, 0x60, 0x58, 0x01, 0x72, 0x32, 0x5a, 0x91, 0x02, 0x92, 0x23, 0x96, - 0xb5, 0x9d, 0xc1, 0xc6, 0xe4, 0x33, 0x33, 0xa4, 0x4a, 0xce, 0x92, 0x01, - 0x7d, 0x6e, 0xd2, 0xd3, 0xf0, 0xdd, 0x2e, 0xc2, 0x37, 0x9b, 0x11, 0xfb, - 0xa7, 0xa9, 0xef, 0x65, 0x5a, 0xc7, 0x38, 0x9d, 0x41, 0x59, 0x14, 0x9c, - 0x02, 0x6c, 0xe9, 0x17, 0xa9, 0xce, 0x28, 0x92, 0x9e, 0x17, 0x4d, 0xdb, - 0xc5, 0xf9, 0x4d, 0x13, 0x0a, 0x8d, 0xb6, 0x3b, 0x6a, 0xa7, 0xcf, 0x37, - 0x47, 0x05, 0xce, 0xf3, 0x0d, 0xa8, 0xfe, 0xa0, 0x9f, 0x57, 0xa5, 0xd1, - 0x4b, 0x60, 0xed, 0xc8, 0xea, 0xb9, 0xe2, 0xbc, 0x54, 0x9b, 0x72, 0xb5, - 0xed, 0x48, 0x40, 0xba, 0x8c, 0x8a, 0xc2, 0x7a, 0xff, 0x1b, 0x2e, 0x75, - 0x02, 0xad, 0x56, 0x27, 0x8a, 0x8b, 0xcc, 0x0b, 0xf3, 0xd8, 0xc8, 0xde, - 0xba, 0x31, 0xe2, 0x92, 0x11, 0xca, 0x47, 0xc1, 0x11, 0xb8, 0xb3, 0x61, - 0x56, 0x1f, 0x5e, 0xd4, 0xcb, 0x08, 0xd9, 0x8e, 0x3c, 0x5b, 0x02, 0x35, - 0x25, 0x2b, 0x6f, 0x78, 0x99, 0x9b, 0x66, 0x35, 0xfb, 0x38, 0x1f, 0x49, - 0xc3, 0xd2, 0x6b, 0x83, 0x9e, 0x56, 0xbd, 0x07, 0x69, 0x12, 0xc4, 0x59, - 0x75, 0xa7, 0x85, 0x87, 0x71, 0x59, 0x92, 0x8e, 0x30, 0x3e, 0xf3, 0x81, - 0x50, 0x4a, 0x37, 0x0a, 0x32, 0xf8, 0x7d, 0xb7, 0xe7, 0x08, 0x5c, 0xf6, - 0xa9, 0xa1, 0x54, 0x41, 0xf0, 0x46, 0x32, 0x89, 0xe9, 0xb4, 0x0f, 0x91, - 0x1a, 0xa8, 0xb6, 0x90, 0x97, 0x8d, 0xe0, 0x54, 0x2c, 0x8b, 0x53, 0xa0, - 0x2e, 0x89, 0x27, 0x9d, 0x20, 0x13, 0xce, 0x7a, 0xc0, 0x52, 0x67, 0x91, - 0x1d, 0xcb, 0xeb, 0x26, 0x88, 0x9b, 0x89, 0x95, 0x4c, 0x7d, 0xdc, 0x74, - 0xc1, 0xd4, 0x35, 0x48, 0xfb, 0x88, 0xbc, 0x2a, 0x12, 0x62, 0x41, 0x52, - 0x72, 0x78, 0x81, 0xc6, 0x97, 0xb9, 0xc7, 0xeb, 0x0e, 0xc0, 0x15, 0x1d, - 0x96, 0x1a, 0x5e, 0xcd, 0xb6, 0xfa, 0x90, 0x87, 0x75, 0xfa, 0x73, 0x44, - 0x3e, 0x0c, 0x96, 0xab, 0x75, 0x68, 0x45, 0xdd, 0x08, 0xef, 0x4e, 0x5b, - 0xb3, 0x5d, 0x6f, 0x4a, 0x3f, 0x2f, 0xca, 0xdf, 0xe4, 0xed, 0x6c, 0x20, - 0xbd, 0x54, 0x6e, 0xaf, 0x83, 0xa8, 0xf9, 0xd9, 0x35, 0xa6, 0xa7, 0x08, - 0x12, 0xd1, 0x12, 0xa1, 0x29, 0xdd, 0xe8, 0x59, 0x08, 0x7e, 0x06, 0x9c, - 0x22, 0xaf, 0x80, 0xc6, 0x0d, 0x62, 0x18, 0x82, 0xee, 0xf1, 0x4e, 0xce, - 0x0a, 0x01, 0x5e, 0xa7, 0xb9, 0x9a, 0x07, 0x58, 0x33, 0x8a, 0x89, 0x74, - 0xf0, 0x16, 0x33, 0xa4, 0x9a, 0xe5, 0x1c, 0x56, 0x1f, 0xc0, 0x8c, 0xfc, - 0x1d, 0xc9, 0x51, 0xd0, 0x6d, 0x1d, 0x05, 0x9e, 0xee, 0xa7, 0xd5, 0xe3, - 0x7c, 0x63, 0xba, 0x3d, 0x3c, 0xc9, 0x29, 0x84, 0xa0, 0x43, 0x13, 0x5a, - 0xca, 0xf6, 0x71, 0x3a, 0x16, 0x53, 0xa5, 0x75, 0x45, 0x27, 0x16, 0x43, - 0x87, 0x36, 0x64, 0x93, 0x0e, 0xfa, 0x5f, 0x98, 0x05, 0xf8, 0x53, 0xb5, - 0x77, 0xa1, 0x2f, 0xde, 0x69, 0xf4, 0x2f, 0xb0, 0x84, 0xd8, 0x53, 0xf5, - 0x73, 0xc3, 0x43, 0xae, 0x2d, 0x9f, 0x05, 0x5e, 0xa1, 0x46, 0x4b, 0x82, - 0xf3, 0x17, 0x3b, 0xbe, 0x41, 0xf1, 0x18, 0x76, 0x26, 0xc0, 0xff, 0xf2, - 0x37, 0x5b, 0x45, 0xe1, 0x71, 0x17, 0x79, 0xa1, 0x2d, 0xcc, 0x00, 0x21, - 0xef, 0x41, 0x39, 0x70, 0xd5, 0xd4, 0xe3, 0x8a, 0x4a, 0x8c, 0x6c, 0x8f, - 0x95, 0xac, 0xd4, 0xd5, 0xdc, 0xd7, 0x5a, 0xe7, 0xbc, 0x33, 0x29, 0x68, - 0xcc, 0x9e, 0xc9, 0x20, 0x14, 0xbe, 0xf2, 0x50, 0xde, 0xf8, 0xfc, 0x20, - 0x3e, 0xb9, 0xe7, 0x88, 0x8d, 0x88, 0x57, 0x5d, 0xbf, 0xd7, 0xf2, 0x86, - 0x95, 0x0b, 0x6d, 0x87, 0x7f, 0x6c, 0xab, 0x06, 0xfb, 0x24, 0xb4, 0x0d, - 0xc0, 0xeb, 0xab, 0x90, 0x7e, 0xe8, 0x0f, 0xbf, 0x80, 0x72, 0xc5, 0x97, - 0x9e, 0x1d, 0x2f, 0x07, 0xbc, 0x1c, 0xb8, 0xbd, 0x94, 0x09, 0xd6, 0x39, - 0xe4, 0xbb, 0x8c, 0xff, 0xb3, 0x5a, 0x71, 0x99, 0x5a, 0x5a, 0x85, 0x3c, - 0x87, 0x89, 0xde, 0xe6, 0x4f, 0x2a, 0x89, 0x47, 0x81, 0x1d, 0x8f, 0xfb, - 0x00, 0xfa, 0xf0, 0xf2, 0xc0, 0x98, 0x6f, 0xf3, 0xd2, 0x0b, 0xba, 0xe3, - 0xb1, 0x6d, 0x49, 0x18, 0x1b, 0x0a, 0x09, 0x57, 0xc0, 0x34, 0x2d, 0xec, - 0x4a, 0x5f, 0x73, 0x20, 0x74, 0xa6, 0xa3, 0xb4, 0x8a, 0xbf, 0x65, 0x22, - 0x74, 0x99, 0xec, 0x77, 0x94, 0x62, 0x7b, 0x75, 0x44, 0x59, 0x55, 0x7f, - 0x96, 0x36, 0xda, 0x0f, 0x66, 0xc1, 0xf2, 0xb2, 0x92, 0x68, 0x34, 0xf9, - 0x16, 0x14, 0xec, 0x96, 0xfa, 0x9a, 0xbc, 0x0f, 0xde, 0x29, 0x33, 0x40, - 0x3a, 0x80, 0xed, 0xe8, 0x0c, 0x07, 0x59, 0x28, 0x3e, 0xd5, 0x3d, 0xeb, - 0x21, 0x58, 0x4f, 0x20, 0x5b, 0x54, 0x67, 0xf2, 0xfe, 0x7a, 0x8c, 0xe0, - 0xe8, 0xe9, 0xfb, 0xee, 0x3f, 0x3f, 0x38, 0x02, 0x25, 0x86, 0x0d, 0x5e, - 0x53, 0xe6, 0xad, 0x99, 0xa4, 0x70, 0x53, 0x97, 0x22, 0x40, 0x8e, 0x31, - 0xc5, 0x6e, 0x17, 0x64, 0x16, 0xd9, 0x92, 0xe0, 0x4d, 0x37, 0x36, 0x98, - 0xcc, 0x78, 0x95, 0x19, 0x06, 0x9c, 0xe7, 0x14, 0x6a, 0x5f, 0x33, 0x89, - 0x35, 0xe6, 0xe2, 0xbc, 0x4e, 0x45, 0x7f, 0x55, 0x6f, 0x61, 0xfd, 0x5f, - 0xc9, 0x88, 0x51, 0x52, 0x53, 0x83, 0xac, 0x0c, 0x4f, 0xef, 0xa3, 0xb5, - 0x50, 0x6e, 0xc1, 0x44, 0xf6, 0x3a, 0x05, 0x29, 0xd3, 0xf1, 0x40, 0x7b, - 0x3b, 0x36, 0x6c, 0xcd, 0x6c, 0x41, 0xa0, 0x34, 0xc3, 0xe3, 0x25, 0xa7, - 0x2b, 0x72, 0x50, 0x7c, 0x58, 0x15, 0x66, 0x6d, 0xc2, 0x62, 0x31, 0xf7, - 0xfd, 0x7e, 0x72, 0x6a, 0xb9, 0x7b, 0x37, 0xfb, 0x79, 0xac, 0xd9, 0x46, - 0x64, 0xa3, 0xff, 0xe2, 0x5f, 0x8f, 0x39, 0xa6, 0x00, 0x35, 0xe0, 0xc0, - 0x95, 0xdc, 0xd8, 0xc4, 0x16, 0xb1, 0xe6, 0x79, 0x9f, 0x98, 0xdf, 0x4e, - 0xb4, 0x67, 0x40, 0xcf, 0xf5, 0x7c, 0x65, 0x82, 0x7f, 0x28, 0x34, 0xf9, - 0xf9, 0x65, 0x35, 0x21, 0x6e, 0xeb, 0xf4, 0x2f, 0xa5, 0x53, 0x96, 0x9c, - 0x2b, 0xe0, 0x66, 0x01, 0xf4, 0xbe, 0x95, 0x7d, 0x99, 0x59, 0x9f, 0x3a, - 0x6b, 0x95, 0xd6, 0x07, 0xe1, 0x97, 0xe2, 0x6d, 0xef, 0xcf, 0x31, 0x61, - 0xea, 0x1b, 0x33, 0xd2, 0xdf, 0x46, 0xa5, 0x70, 0x67, 0xda, 0xfd, 0x8c, - 0xb0, 0xef, 0x10, 0x83, 0xcb, 0xa7, 0xfe, 0xf6, 0xf4, 0xc5, 0x0d, 0xf2, - 0xe1, 0xef, 0x1c, 0xdf, 0xde, 0x0b, 0x13, 0x7d, 0xc5, 0x7b, 0x0a, 0x31, - 0xac, 0x98, 0x8d, 0x20, 0x3f, 0x91, 0x3d, 0x28, 0x0d, 0x8a, 0xf1, 0x8a, - 0xaa, 0x52, 0x18, 0x5b, 0xc9, 0xef, 0xa0, 0xff, 0x50, 0xc2, 0x0b, 0xbb, - 0x77, 0x09, 0x36, 0xfe, 0xf2, 0xf3, 0xbc, 0xd2, 0xf0, 0x21, 0x43, 0xd6, - 0x4d, 0xb5, 0x27, 0x8c, 0xed, 0xa4, 0x48, 0x3b, 0xd0, 0xa5, 0xf0, 0x3a, - 0xe3, 0x12, 0xc7, 0xb9, 0x18, 0xc3, 0x5a, 0x56, 0x28, 0x55, 0xfd, 0xc8, - 0xc6, 0x99, 0x2b, 0x57, 0x72, 0x23, 0x53, 0xf0, 0xba, 0x96, 0x29, 0xf6, - 0x76, 0x04, 0x04, 0xd0, 0x36, 0x4f, 0x15, 0x9f, 0x71, 0x34, 0x04, 0x1d, - 0xde, 0xb8, 0xa6, 0x35, 0xa6, 0xf1, 0x38, 0x55, 0x96, 0x01, 0xef, 0x8a, - 0x5b, 0x1c, 0x33, 0x7e, 0xb4, 0xca, 0x26, 0x31, 0xa8, 0x8f, 0x82, 0xe4, - 0x58, 0x1c, 0xe5, 0x78, 0x7b, 0x30, 0x66, 0x3d, 0xad, 0x72, 0x4b, 0xce, - 0x84, 0x43, 0x70, 0x3c, 0x4d, 0x60, 0xdc, 0x02, 0x0c, 0xab, 0xc3, 0xc6, - 0xeb, 0xcc, 0xb3, 0xf9, 0x3c, 0x06, 0x9d, 0x2a, 0x81, 0xf1, 0x14, 0x76, - 0xde, 0x84, 0x07, 0xc7, 0x24, 0x5c, 0xc6, 0x3d, 0x9b, 0x4c, 0xd9, 0x0d, - 0x21, 0x54, 0x16, 0xa5, 0x86, 0x8e, 0xfa, 0x09, 0xcd, 0x12, 0x72, 0xa0, - 0xbd, 0x6d, 0xa5, 0xe3, 0x97, 0x08, 0xd5, 0x46, 0x64, 0x76, 0x3f, 0x11, - 0xce, 0xc2, 0xb5, 0x77, 0xeb, 0xa0, 0x0c, 0x5e, 0x55, 0x3d, 0x97, 0x92, - 0x8d, 0xbe, 0x6a, 0x2e, 0xeb, 0xbf, 0xbb, 0x95, 0x2f, 0xd0, 0x82, 0xf2, - 0x74, 0xc7, 0xdc, 0x6d, 0xc0, 0xd9, 0xe9, 0x81, 0xfe, 0x02, 0xdc, 0x94, - 0xc6, 0xc7, 0x8d, 0xbb, 0xb9, 0xcc, 0x9e, 0x9d, 0xdd, 0x4b, 0xb2, 0x8f, - 0x2f, 0xe5, 0xb3, 0x3a, 0xb6, 0x5a, 0xcb, 0xf1, 0x35, 0x07, 0xb0, 0x43, - 0x59, 0xa0, 0xba, 0xfb, 0x9b, 0x07, 0xf2, 0x61, 0x6a, 0x0a, 0x8c, 0x61, - 0x7d, 0xf4, 0x3f, 0xeb, 0xc7, 0xf6, 0xae, 0x74, 0x90, 0x1a, 0xdb, 0xa9, - 0x93, 0xb4, 0xf0, 0xae, 0x82, 0xf8, 0xcb, 0xa0, 0xf6, 0x7f, 0xdb, 0xff, - 0x69, 0x62, 0x47, 0xfd, 0xde, 0xdf, 0x53, 0x9e, 0x5c, 0x1c, 0x10, 0xfe, - 0x0a, 0xea, 0x5f, 0x94, 0x10, 0x93, 0xd8, 0x8c, 0x88, 0x07, 0x42, 0xd9, - 0x7b, 0x48, 0xf1, 0x6a, 0xa9, 0x41, 0xed, 0x75, 0xeb, 0x07, 0x7a, 0xef, - 0xc3, 0x2d, 0x9c, 0xc6, 0x0a, 0x61, 0x36, 0xf5, 0x1c, 0x20, 0xb5, 0xc7, - 0x76, 0xc1, 0xb5, 0x6d, 0x80, 0xcc, 0x61, 0x0b, 0xa1, 0x50, 0x28, 0x87, - 0x31, 0x67, 0x4a, 0x88, 0xe7, 0xfa, 0xe8, 0x6e, 0x24, 0xc3, 0x93, 0x1c, - 0x93, 0xe2, 0xbc, 0x11, 0x3d, 0x55, 0xa6, 0x6a, 0xb5, 0xcf, 0x9a, 0x9a, - 0xf7, 0x9b, 0xa1, 0xfb, 0xe5, 0x92, 0x28, 0xb7, 0xf7, 0x84, 0x91, 0x8c, - 0x6a, 0x2c, 0x1d, 0x45, 0xca, 0x08, 0x1b, 0x52, 0x94, 0x91, 0xaa, 0xf3, - 0xd9, 0xca, 0xae, 0x72, 0xed, 0x19, 0x38, 0xa7, 0xa8, 0x3e, 0x3b, 0xae, - 0x3b, 0x49, 0xf3, 0x46, 0x53, 0x6b, 0xbf, 0x28, 0x7f, 0xd0, 0x7b, 0x64, - 0xf2, 0x22, 0x05, 0xe9, 0x3a, 0x00, 0xe1, 0xed, 0xd8, 0xa3, 0xd9, 0x38, - 0xba, 0x37, 0xc6, 0x55, 0x74, 0x61, 0x68, 0x95, 0xc4, 0xe3, 0x12, 0x90, - 0xe7, 0x55, 0x84, 0xf7, 0x40, 0xaa, 0x94, 0x97, 0x84, 0xf6, 0xf1, 0xfa, - 0x3d, 0x82, 0xc9, 0x42, 0x11, 0x83, 0x24, 0xbc, 0x5a, 0xfd, 0xc9, 0x72, - 0xde, 0x28, 0x76, 0x26, 0x36, 0x18, 0x2e, 0xb5, 0x06, 0xee, 0xec, 0xd4, - 0xb4, 0x1d, 0xf3, 0xf7, 0xe5, 0xdf, 0xfd, 0x09, 0x68, 0xa6, 0x55, 0x70, - 0xf9, 0x1e, 0xf2, 0x88, 0xb8, 0xe7, 0xff, 0x68, 0x2c, 0x54, 0x20, 0x9c, - 0xe3, 0x46, 0xa1, 0x5e, 0xa5, 0x19, 0xac, 0x73, 0xf3, 0xf9, 0xe2, 0x20, - 0xe6, 0xb5, 0xac, 0x99, 0xe9, 0x8f, 0x57, 0x17, 0x03, 0x7f, 0x39, 0x7c, - 0x54, 0x99, 0xfc, 0x44, 0xdb, 0x26, 0x9d, 0xc5, 0x1d, 0x22, 0x3c, 0xa4, - 0x43, 0x11, 0x5d, 0xd5, 0x97, 0xe7, 0x46, 0xa6, 0xb4, 0x93, 0x16, 0x0a, - 0x1d, 0x69, 0x46, 0x37, 0x90, 0xde, 0xa2, 0x77, 0xa3, 0x63, 0xe0, 0x25, - 0xde, 0x58, 0x32, 0x06, 0x0f, 0x80, 0x02, 0x62, 0x90, 0xfe, 0x6b, 0x52, - 0xdb, 0x1b, 0x91, 0xef, 0x26, 0x92, 0x92, 0x54, 0x88, 0xde, 0xd2, 0xc3, - 0x2f, 0xa9, 0x54, 0x42, 0x19, 0xe8, 0xab, 0x25, 0xba, 0x46, 0x9a, 0x86, - 0x32, 0x02, 0x5f, 0x3e, 0xb0, 0xb4, 0xca, 0x4a, 0x72, 0x93, 0xef, 0x2e, - 0x03, 0x2d, 0x25, 0xd7, 0x55, 0xc9, 0xf4, 0x37, 0xdf, 0x56, 0x75, 0x34, - 0xdf, 0x51, 0x35, 0x35, 0x48, 0x31, 0xc1, 0x62, 0xaf, 0xe9, 0xd1, 0x5b, - 0xd1, 0xb3, 0xba, 0xfe, 0x75, 0xe9, 0x9d, 0x64, 0xfc, 0x97, 0xbc, 0x7a, - 0xd4, 0x61, 0x01, 0xa6, 0x4f, 0x77, 0x6b, 0xa8, 0x7e, 0xb1, 0xf1, 0x80, - 0x2e, 0xa3, 0xa3, 0xfa, 0x52, 0x16, 0x5a, 0x6c, 0x97, 0xd7, 0xdf, 0x4c, - 0x29, 0xa9, 0xc2, 0xcc, 0x12, 0x5d, 0x9a, 0xe1, 0xd2, 0xd8, 0x72, 0x2a, - 0x65, 0x1c, 0x1e, 0xcb, 0xef, 0x07, 0x75, 0xa4, 0xc9, 0x2e, 0x4d, 0x18, - 0xde, 0xad, 0xc9, 0x00, 0x71, 0x83, 0x24, 0x96, 0xd7, 0x11, 0xd4, 0xa9, - 0x5b, 0x19, 0x57, 0x78, 0xb3, 0xb9, 0xa2, 0x3a, 0x35, 0xe9, 0x81, 0x62, - 0x81, 0x02, 0xad, 0x2c, 0xe5, 0x8c, 0xa8, 0xee, 0xfd, 0x05, 0xce, 0xcc, - 0xb8, 0xa3, 0x92, 0x17, 0x92, 0xff, 0xbf, 0xb2, 0x9a, 0xd9, 0x05, 0x4a, - 0x97, 0x27, 0xc4, 0xf4, 0x71, 0x7c, 0x85, 0x1b, 0x31, 0x81, 0x93, 0x1b, - 0x61, 0xd3, 0x20, 0xee, 0x48, 0x9e, 0x29, 0x9a, 0x8c, 0x5b, 0x7d, 0x7d, - 0x2a, 0x61, 0xbf, 0x8c, 0xb1, 0xa5, 0x3c, 0x0f, 0xef, 0x1b, 0x73, 0xe8, - 0x66, 0xcd, 0x6c, 0xff, 0xc6, 0x1c, 0xa2, 0x54, 0x03, 0x5f, 0xd5, 0x3c, - 0x8d, 0xee, 0x94, 0x03, 0xe6, 0x91, 0xa4, 0x7c, 0xa1, 0xd4, 0xa5, 0xa6, - 0xa6, 0xe1, 0xbf, 0xfd, 0xe7, 0x88, 0x2d, 0xc9, 0x3d, 0x5f, 0x2a, 0x9f, - 0x57, 0xf9, 0x41, 0x60, 0x01, 0xd6, 0x07, 0xaf, 0x77, 0xb0, 0x81, 0x72, - 0x43, 0x59, 0x0e, 0x05, 0xdb, 0x4d, 0x25, 0x8e, 0x6f, 0x98, 0xbf, 0x82, - 0x9e, 0x24, 0x33, 0x83, 0x96, 0xac, 0x6a, 0xfc, 0x57, 0x0d, 0x55, 0xe0, - 0xb6, 0xda, 0xde, 0x54, 0x37, 0xb7, 0xc8, 0xfd, 0x56, 0x29, 0x3b, 0x35, - 0x37, 0x87, 0x3f, 0x35, 0x52, 0x08, 0x77, 0xc1, 0xf9, 0x99, 0x5d, 0x6d, - 0x01, 0x0b, 0xa7, 0xa7, 0xd7, 0x46, 0x06, 0x2a, 0xa9, 0xad, 0xca, 0x48, - 0x95, 0x46, 0x5d, 0x2c, 0x9f, 0x48, 0xbc, 0x7b, 0x24, 0xa8, 0x72, 0x11, - 0xea, 0xd8, 0x07, 0x2b, 0x39, 0xd4, 0x02, 0x0b, 0x6a, 0x9f, 0xa1, 0x7d, - 0x21, 0xf4, 0x3b, 0xb6, 0xe8, 0xc6, 0xcb, 0x68, 0x3f, 0x33, 0x3d, 0xf7, - 0x15, 0x60, 0xa1, 0x7c, 0x5c, 0xa8, 0xf1, 0xce, 0xb6, 0xa8, 0x23, 0x0c, - 0xd7, 0xc8, 0xfb, 0x55, 0xb5, 0x7f, 0xce, 0xb9, 0xd2, 0x1c, 0xdb, 0xac, - 0x6e, 0xb2, 0x76, 0xc7, 0xbe, 0xb3, 0xea, 0x37, 0x83, 0xb1, 0xfc, 0xcd, - 0xed, 0x71, 0xfa, 0x77, 0x7f, 0xa8, 0x51, 0x53, 0x34, 0x45, 0x5b, 0x22, - 0x2d, 0x32, 0x2e, 0x38, 0xab, 0x4f, 0xad, 0x7e, 0xe7, 0x20, 0x0b, 0x44, - 0x92, 0x45, 0x42, 0x52, 0xd5, 0x0c, 0x4e, 0x6e, 0xb5, 0xb8, 0x10, 0x48, - 0x41, 0x69, 0xd5, 0x3a, 0x1d, 0x37, 0x05, 0x66, 0x35, 0xe6, 0x60, 0x0c, - 0x5c, 0x9f, 0x10, 0xe0, 0x8d, 0x8a, 0x02, 0xc6, 0xb0, 0xbe, 0x92, 0x72, - 0xe3, 0xe3, 0x70, 0xbc, 0xd7, 0xa8, 0x9f, 0x1d, 0xa1, 0xf7, 0x9c, 0x7e, - 0x2a, 0x74, 0x5e, 0xda, 0xfd, 0x82, 0x4d, 0x3b, 0xfe, 0x8f, 0xb2, 0x03, - 0x0b, 0xf0, 0xc7, 0xab, 0x3b, 0x6c, 0xe2, 0xb6, 0x8d, 0x2c, 0x80, 0xc2, - 0x68, 0x8b, 0x3b, 0x37, 0xa2, 0x74, 0xb0, 0x9e, 0xa0, 0x7c, 0x91, 0xc9, - 0x66, 0x0b, 0xdf, 0x9b, 0x2e, 0xcd, 0x65, 0x33, 0xba, 0x4e, 0xa1, 0xe1, - 0xf2, 0xcf, 0x79, 0x0c, 0x7d, 0x49, 0xa7, 0xd8, 0xb4, 0x8f, 0xbb, 0x14, - 0xc0, 0x8a, 0xf4, 0xec, 0xc5, 0x84, 0x09, 0x37, 0x96, 0xbb, 0xb1, 0xb3, - 0x0f, 0xcf, 0xa3, 0xe8, 0x27, 0xb7, 0x60, 0xe0, 0xf9, 0xac, 0xc7, 0x84, - 0x34, 0x64, 0x69, 0x0c, 0x9b, 0x33, 0xa2, 0x6b, 0x9f, 0x54, 0x4a, 0x4c, - 0x16, 0xed, 0x9f, 0xcd, 0xb2, 0xed, 0x62, 0xa3, 0x22, 0x60, 0x8e, 0xc7, - 0x42, 0xd2, 0x2e, 0x5f, 0x70, 0xa6, 0xdd, 0x2e, 0xf6, 0xb2, 0x4d, 0x7d, - 0xab, 0x50, 0x5a, 0x6e, 0x38, 0x8d, 0xd4, 0xef, 0x7a, 0xe9, 0xac, 0xc1, - 0x6d, 0x99, 0xef, 0xeb, 0x24, 0xdf, 0x11, 0xc8, 0xab, 0x8a, 0xe5, 0xf6, - 0x3b, 0x00, 0x09, 0xa4, 0xb6, 0x72, 0xd3, 0x0b, 0xe5, 0x7f, 0x08, 0xc8, - 0x59, 0x66, 0x8f, 0x7b, 0x8b, 0x99, 0xb2, 0x06, 0xf6, 0xd1, 0x39, 0xad, - 0xa5, 0xbd, 0xa2, 0xcd, 0x85, 0xfa, 0xc2, 0x69, 0x63, 0xa0, 0xfd, 0x04, - 0x86, 0xa2, 0x3d, 0xb3, 0x11, 0x8f, 0x08, 0xf3, 0x28, 0x1a, 0x8b, 0x3b, - 0x52, 0x72, 0x82, 0x94, 0x85, 0xce, 0x9d, 0x0b, 0xd2, 0xd0, 0xb1, 0x37, - 0x4c, 0x5b, 0xc2, 0x07, 0x6f, 0x46, 0x5e, 0x93, 0x01, 0xc2, 0x98, 0xcd, - 0x86, 0xfc, 0xca, 0x6b, 0xba, 0xf0, 0x04, 0xfc, 0xa7, 0x5f, 0xfa, 0x66, - 0x13, 0x12, 0x2a, 0xb0, 0xdf, 0x02, 0xd2, 0x3d, 0xcb, 0xd4, 0x31, 0xe4, - 0xc9, 0x07, 0xb1, 0x35, 0x60, 0x83, 0x27, 0xca, 0x78, 0x10, 0xe0, 0xff, - 0xf5, 0x7e, 0x57, 0xb6, 0xa3, 0x69, 0x76, 0x91, 0x7b, 0x43, 0x23, 0x80, - 0x42, 0x19, 0x59, 0x37, 0xe1, 0xac, 0xb4, 0x31, 0x13, 0x9f, 0x1f, 0x4c, - 0xd3, 0x7b, 0x94, 0x0e, 0xf4, 0xe8, 0x32, 0x89, 0x73, 0x30, 0x2a, 0x7b, - 0x3e, 0x57, 0xcc, 0x56, 0x30, 0x09, 0x96, 0xaa, 0xee, 0xb5, 0xee, 0x10, - 0xe5, 0xf3, 0x12, 0x7b, 0x8f, 0xd3, 0x26, 0xa3, 0xe3, 0x12, 0x15, 0x27, - 0x64, 0x25, 0x96, 0x88, 0x7a, 0xf8, 0x66, 0xae, 0x29, 0x1d, 0xac, 0xf6, - 0x68, 0x56, 0x73, 0x18, 0xc0, 0x37, 0x99, 0x47, 0xe4, 0x7c, 0x67, 0x21, - 0xf6, 0xc9, 0x97, 0x60, 0x60, 0x6e, 0xf6, 0x85, 0xd1, 0xf8, 0x78, 0x4c, - 0x8f, 0x79, 0xaf, 0x62, 0x39, 0x06, 0x50, 0x1b, 0xcc, 0x48, 0x73, 0xa3, - 0xfd, 0x63, 0x34, 0xc5, 0x73, 0xa5, 0x2f, 0x39, 0x28, 0x18, 0x0f, 0xe9, - 0xa4, 0x9c, 0x0e, 0xaa, 0xe9, 0x73, 0x1b, 0x23, 0xf9, 0x52, 0x59, 0x80, - 0xb5, 0xe4, 0xc6, 0x4b, 0xaf, 0xd2, 0x30, 0x4b, 0x19, 0x94, 0xcf, 0x6f, - 0x6e, 0xcf, 0xea, 0x25, 0xe3, 0x44, 0x9c, 0x2c, 0x85, 0xac, 0x75, 0x81, - 0xb0, 0xf7, 0xa5, 0x3d, 0x35, 0xcb, 0xfb, 0xa1, 0x22, 0x37, 0xd7, 0x66, - 0xa4, 0xc1, 0x01, 0xe4, 0x1f, 0x83, 0x00, 0x8f, 0xfe, 0xc4, 0x67, 0xc2, - 0x5b, 0x4c, 0xa6, 0x4f, 0x4f, 0x71, 0xd9, 0x75, 0x2d, 0x89, 0xab, 0xd5, - 0x29, 0x40, 0xa1, 0x48, 0xba, 0x5a, 0xe8, 0xac, 0x84, 0x4f, 0x06, 0x9f, - 0x88, 0xd8, 0x23, 0x8f, 0x2f, 0x10, 0x5a, 0x96, 0xec, 0xce, 0xf2, 0x89, - 0xa5, 0xd0, 0xe0, 0xaf, 0x63, 0xa9, 0x15, 0x06, 0xef, 0x02, 0x66, 0x21, - 0xfe, 0x4d, 0xd9, 0x95, 0xb4, 0xfb, 0xc4, 0x2f, 0xab, 0x1d, 0x3a, 0xaf, - 0x6c, 0xe5, 0x7e, 0x8d, 0xe5, 0x0b, 0x69, 0x95, 0x56, 0xaa, 0x63, 0x12, - 0xcd, 0xd0, 0x0e, 0x92, 0x23, 0xd5, 0xad, 0xe2, 0x0e, 0xd3, 0x72, 0x41, - 0x26, 0x6d, 0x3f, 0x09, 0x02, 0xa4, 0x81, 0x27, 0x9a, 0x20, 0x73, 0x8f, - 0x0d, 0xbb, 0x0e, 0x23, 0xb3, 0x2a, 0x97, 0x2c, 0xcb, 0x14, 0x63, 0xb8, - 0x77, 0x46, 0xed, 0x4a, 0x26, 0xb9, 0xb3, 0x52, 0xf3, 0x4d, 0xdd, 0x6f, - 0xc2, 0xa3, 0x75, 0x11, 0x37, 0x14, 0xa8, 0x41, 0xa8, 0x9d, 0xfc, 0xef, - 0xcd, 0x07, 0x99, 0xff, 0x2f, 0xb5, 0xa6, 0x0e, 0xac, 0x60, 0x21, 0xda, - 0x73, 0x94, 0xfa, 0x8a, 0xa9, 0x8c, 0x6a, 0x3a, 0x0d, 0x14, 0x6e, 0x7d, - 0x34, 0x86, 0xd9, 0xad, 0x0f, 0xaf, 0xef, 0x5c, 0xaa, 0x6c, 0x21, 0xdc, - 0xd0, 0x4e, 0x9a, 0xb8, 0x41, 0x8b, 0x25, 0xd3, 0xfe, 0x6d, 0xfc, 0x05, - 0xe7, 0x1d, 0x67, 0xa6, 0x57, 0x8c, 0x30, 0xf9, 0x03, 0x1c, 0x9d, 0x7c, - 0x8b, 0x54, 0x2c, 0x5b, 0xd0, 0x86, 0x5e, 0x91, 0x7a, 0x05, 0x68, 0x0e, - 0xd7, 0x36, 0x21, 0x8d, 0x7f, 0x44, 0x9a, 0x95, 0xf3, 0x2a, 0x4f, 0xeb, - 0xe3, 0xa9, 0x11, 0xcd, 0x46, 0x18, 0xbb, 0x06, 0x97, 0x79, 0xa7, 0xcc, - 0x71, 0x80, 0x3b, 0x78, 0x74, 0x76, 0x63, 0xea, 0x32, 0xf2, 0xf0, 0x5e, - 0xe9, 0x87, 0x92, 0xf0, 0x33, 0xbb, 0x3c, 0x22, 0xcd, 0x69, 0x45, 0x7c, - 0x64, 0x0e, 0x76, 0xfc, 0xf8, 0x6e, 0xb0, 0x70, 0x02, 0xad, 0x5c, 0xf7, - 0x65, 0x9e, 0x17, 0x11, 0x23, 0x84, 0x55, 0xda, 0xbc, 0x18, 0x38, 0x82, - 0xc3, 0x4f, 0xce, 0xdc, 0xe6, 0x56, 0x2d, 0x4a, 0xb9, 0x42, 0x23, 0xcc, - 0x7c, 0x63, 0xbe, 0xdc, 0xa6, 0xdc, 0xbf, 0xac, 0xb5, 0x62, 0xb7, 0x92, - 0xaa, 0xad, 0xaf, 0x96, 0xb0, 0x22, 0xe2, 0x97, 0x75, 0x33, 0x60, 0x2f, - 0xf2, 0xac, 0x81, 0x24, 0xa9, 0xb1, 0x52, 0xdc, 0x47, 0x95, 0x63, 0x40, - 0x81, 0xea, 0x86, 0x96, 0x75, 0xf8, 0x85, 0xca, 0x48, 0xe3, 0x18, 0x18, - 0x5a, 0xf5, 0xd7, 0x01, 0x9f, 0xb9, 0x06, 0x67, 0xc8, 0xcf, 0xdb, 0x9e, - 0x64, 0xa9, 0xdc, 0x5c, 0xe1, 0xfd, 0xbf, 0xea, 0x71, 0xaf, 0x8d, 0xfe, - 0x6d, 0xf3, 0x53, 0x21, 0x92, 0xcd, 0x6b, 0x49, 0x9d, 0x5a, 0x78, 0xc8, - 0xbe, 0x7d, 0x44, 0xda, 0xdb, 0x1b, 0xb7, 0x1e, 0xcd, 0x39, 0x41, 0x92, - 0x61, 0xec, 0x37, 0x46, 0x4f, 0x1e, 0x21, 0x19, 0xca, 0x0f, 0xf3, 0xb3, - 0x01, 0xe4, 0x54, 0xfa, 0x6a, 0x04, 0xf5, 0x55, 0x27, 0xc9, 0xe7, 0x2d, - 0x65, 0x00, 0x84, 0x49, 0xf1, 0xc9, 0x5e, 0xcf, 0xc4, 0xcd, 0xcb, 0xea, - 0x0b, 0xf3, 0x6b, 0x7c, 0x0a, 0x63, 0x82, 0x0b, 0xa6, 0x32, 0xff, 0x50, - 0x3b, 0x2f, 0x2e, 0x5d, 0x14, 0x32, 0x6c, 0x79, 0x42, 0xb6, 0xec, 0xda, - 0x6b, 0x20, 0x58, 0x9b, 0x56, 0x57, 0x64, 0x49, 0xd1, 0xe4, 0x86, 0x56, - 0xb5, 0xae, 0x5f, 0xea, 0x69, 0xe8, 0x93, 0x85, 0x2d, 0x2a, 0xdd, 0x52, - 0x53, 0x9b, 0x3f, 0x68, 0x2e, 0x27, 0xed, 0x4b, 0x9d, 0xdf, 0xc7, 0x09, - 0xb4, 0x2a, 0xbc, 0xff, 0xa2, 0x6b, 0xf3, 0xc6, 0xa0, 0xa4, 0x7f, 0x4c, - 0x86, 0x03, 0xd4, 0x4d, 0x2a, 0x08, 0xc2, 0x08, 0x7a, 0x8c, 0x65, 0xf9, - 0x45, 0x35, 0x32, 0x9e, 0x6c, 0xb0, 0x67, 0xd9, 0xbb, 0x53, 0xe5, 0x06, - 0xb1, 0xdc, 0x4b, 0x3f, 0xbb, 0x80, 0x67, 0x64, 0xfe, 0xe1, 0xe3, 0xcd, - 0xb2, 0x63, 0xdf, 0xc0, 0x27, 0x7a, 0x22, 0xf8, 0xd6, 0xea, 0x10, 0x30, - 0x41, 0xc2, 0x02, 0xa2, 0xf0, 0xc2, 0x43, 0xde, 0x91, 0xb2, 0x71, 0x11, - 0x74, 0x21, 0xc8, 0xd0, 0xb1, 0x55, 0x66, 0x6d, 0x84, 0x96, 0xe7, 0x2e, - 0xf5, 0x83, 0xc1, 0x8e, 0xc9, 0x77, 0x64, 0x68, 0x06, 0x2c, 0xef, 0xf7, - 0x7c, 0x40, 0x63, 0x36, 0xc7, 0x9d, 0xb8, 0x23, 0xf1, 0x4e, 0xf6, 0x18, - 0x59, 0xd3, 0x6a, 0x1b, 0x08, 0xed, 0xc2, 0xf6, 0xf8, 0xf6, 0xc4, 0x11, - 0x42, 0x88, 0x09, 0xe2, 0x35, 0x87, 0xeb, 0x62, 0x55, 0xff, 0x4d, 0x37, - 0x34, 0x37, 0x7f, 0x6c, 0x9c, 0x50, 0x62, 0x67, 0xec, 0x08, 0xae, 0x7e, - 0x5d, 0x93, 0x90, 0x1b, 0x42, 0x80, 0x75, 0x35, 0x35, 0x98, 0x8a, 0x12, - 0x0a, 0xba, 0x1d, 0x3d, 0xda, 0x75, 0x46, 0x4e, 0xc1, 0xcb, 0xb4, 0xd7, - 0xb1, 0xdc, 0xd1, 0x5b, 0x1b, 0xc7, 0x65, 0x31, 0xfe, 0x08, 0xf9, 0x71, - 0x51, 0x93, 0xe4, 0x58, 0xdb, 0xc8, 0x99, 0xe1, 0x61, 0xc5, 0x1a, 0xdb, - 0x43, 0x7d, 0xaf, 0xec, 0xa5, 0x02, 0x35, 0xb4, 0xcc, 0x8f, 0xd6, 0xf6, - 0x60, 0x6d, 0x6b, 0x0d, 0x26, 0x40, 0x6b, 0xfc, 0x38, 0xed, 0x4f, 0xde, - 0xc5, 0x5c, 0xd5, 0x74, 0x2d, 0xfb, 0x63, 0xde, 0xf7, 0xc0, 0x47, 0x9f, - 0x70, 0xc4, 0x87, 0x9b, 0x20, 0xc9, 0xb5, 0xb3, 0x15, 0xba, 0xb9, 0x30, - 0x59, 0x7d, 0x36, 0xa0, 0x6e, 0x5b, 0x6b, 0xc6, 0xe6, 0x7e, 0x22, 0xf5, - 0x93, 0x5a, 0xdd, 0x03, 0x1a, 0x89, 0x6d, 0xe1, 0x43, 0x67, 0xa9, 0x17, - 0x4c, 0x91, 0x8c, 0x0f, 0xe0, 0xe1, 0x1b, 0xe2, 0xb3, 0x53, 0x97, 0x21, - 0x52, 0x32, 0x9a, 0xa4, 0x3d, 0x46, 0x4f, 0x36, 0x8e, 0x4f, 0x4d, 0x8f, - 0x15, 0x64, 0x36, 0xa9, 0xa0, 0xcc, 0x3f, 0xa2, 0x36, 0x46, 0xea, 0x71, - 0xc9, 0x7e, 0xa8, 0xd1, 0x63, 0xdf, 0x58, 0x2f, 0x7e, 0xb3, 0x4c, 0x0d, - 0x22, 0x82, 0xc6, 0x8a, 0xb6, 0x41, 0xc7, 0x7a, 0x4c, 0x42, 0x4a, 0x40, - 0x57, 0x8d, 0x8f, 0xff, 0x6a, 0x2d, 0xd0, 0xe1, 0x02, 0x52, 0x9e, 0xb4, - 0x5f, 0xd3, 0x2b, 0x82, 0x28, 0x9c, 0xcc, 0xcc, 0x09, 0x24, 0x77, 0x21, - 0x24, 0xa4, 0xcb, 0x66, 0x42, 0x77, 0x2f, 0x7d, 0x94, 0x8b, 0x7c, 0x66, - 0xbe, 0xcd, 0xd5, 0xb2, 0x9d, 0xfa, 0x14, 0x86, 0xc3, 0x96, 0x71, 0x89, - 0xf4, 0xec, 0xb1, 0x78, 0x43, 0x62, 0x0b, 0xe5, 0x22, 0x8e, 0xea, 0x15, - 0x89, 0xa8, 0x63, 0xba, 0xb9, 0xbe, 0x9e, 0x61, 0x2c, 0xe2, 0xd9, 0x42, - 0x51, 0x3f, 0x45, 0x99, 0x88, 0x94, 0x05, 0x2a, 0x29, 0xe3, 0x4c, 0x34, - 0xfd, 0x83, 0x88, 0x64, 0xda, 0x7a, 0x5a, 0x6c, 0x6a, 0x46, 0x78, 0x79, - 0x78, 0x82, 0x24, 0xfb, 0xfa, 0xf7, 0x78, 0xa3, 0x60, 0x31, 0xbd, 0x66, - 0x5d, 0xd5, 0xc2, 0x3d, 0xa4, 0xa9, 0x5f, 0x47, 0xb7, 0xcb, 0xce, 0x8d, - 0x3d, 0x09, 0xb0, 0x38, 0xb5, 0xb1, 0x11, 0x0e, 0x34, 0xae, 0x0b, 0xa5, - 0xc2, 0x09, 0x7e, 0xda, 0x74, 0x21, 0xed, 0x4d, 0xa0, 0x21, 0xf6, 0xd0, - 0x83, 0xf0, 0x90, 0x5e, 0xb4, 0xb1, 0x1e, 0x0e, 0x41, 0x21, 0xad, 0x02, - 0x29, 0xb4, 0x3f, 0xc6, 0x6c, 0x6d, 0xb6, 0x92, 0x77, 0x98, 0xcc, 0x2e, - 0x52, 0xe3, 0xf7, 0x5b, 0x4f, 0xcb, 0x43, 0x67, 0x63, 0xc0, 0xb3, 0x01, - 0xdb, 0x55, 0x21, 0x8c, 0x25, 0x63, 0xeb, 0xb2, 0x54, 0x01, 0x2c, 0x4a, - 0x92, 0x96, 0x38, 0xc9, 0x0e, 0xd2, 0xe2, 0xe3, 0x11, 0x41, 0xe7, 0x8a, - 0x8f, 0xd6, 0xb3, 0x9c, 0xb9, 0x79, 0x5f, 0x50, 0xc8, 0x0b, 0xb6, 0x35, - 0x5e, 0x98, 0x96, 0x27, 0x85, 0xbd, 0x67, 0xec, 0x0b, 0x70, 0xe0, 0x0f, - 0x2c, 0x27, 0x08, 0x3b, 0x19, 0x23, 0x0d, 0x83, 0x93, 0xf7, 0x6c, 0x1d, - 0x53, 0x4c, 0x4e, 0x23, 0x82, 0x5b, 0x7d, 0xf9, 0xc0, 0xd4, 0xef, 0x1a, - 0x73, 0x57, 0x3c, 0xc2, 0x9b, 0x9a, 0x4c, 0xa5, 0x16, 0x1a, 0xc2, 0x68, - 0x01, 0x13, 0x58, 0x1d, 0xba, 0xcf, 0x9e, 0xe1, 0xed, 0x07, 0xd6, 0x73, - 0x11, 0xfe, 0x73, 0xf6, 0xb1, 0xe5, 0x95, 0x8f, 0x51, 0x71, 0xc5, 0x2b, - 0x7a, 0x05, 0xff, 0x24, 0x36, 0x59, 0x72, 0x71, 0x4f, 0x6d, 0xb2, 0xcb, - 0xfe, 0x5b, 0x0b, 0xbe, 0x4d, 0xb2, 0x9a, 0x6f, 0xd9, 0x8f, 0x29, 0x20, - 0x3a, 0xe2, 0x5b, 0xa0, 0x24, 0xf8, 0xc4, 0x78, 0x49, 0x35, 0x4b, 0xb1, - 0xee, 0x9f, 0x95, 0x4a, 0xdb, 0xf3, 0x77, 0x39, 0x59, 0x04, 0x09, 0xce, - 0x44, 0xa6, 0x65, 0xa9, 0x78, 0x6f, 0x6b, 0xb6, 0x8c, 0x5d, 0x29, 0x6e, - 0x91, 0x0e, 0xd6, 0x1e, 0xc6, 0xff, 0xe9, 0x3c, 0x37, 0xc9, 0xbc, 0xcf, - 0x7f, 0x77, 0xa1, 0x01, 0x6f, 0xb6, 0x88, 0x92, 0x9e, 0x3b, 0x53, 0xbc, - 0xe1, 0xd5, 0x53, 0x35, 0xe9, 0xf9, 0xd1, 0x10, 0x92, 0x60, 0x13, 0xe7, - 0x53, 0xf2, 0x44, 0x42, 0xe1, 0x62, 0x4f, 0x14, 0x7b, 0xf1, 0x90, 0xb0, - 0x4d, 0x29, 0xa5, 0x7f, 0x27, 0x20, 0x6a, 0xf5, 0xc6, 0xf7, 0x58, 0x35, - 0xed, 0xbf, 0x24, 0xe3, 0x61, 0x65, 0x52, 0xdf, 0xa3, 0x90, 0x0a, 0x21, - 0xbb, 0xd2, 0x31, 0xa3, 0xd5, 0x18, 0xba, 0x54, 0x56, 0xe9, 0x7a, 0x0f, - 0x39, 0x23, 0x01, 0xaf, 0x38, 0x8f, 0x5d, 0xfb, 0x2c, 0x61, 0xb3, 0xa7, - 0x89, 0xba, 0x04, 0xca, 0x63, 0xf6, 0xeb, 0xc7, 0xe4, 0x63, 0x5b, 0xf0, - 0xde, 0x7c, 0x12, 0x69, 0x83, 0x3d, 0x91, 0x1c, 0x09, 0x80, 0x17, 0xa6, - 0x13, 0x32, 0x1d, 0xbd, 0x03, 0x91, 0x5d, 0xca, 0x91, 0xf9, 0xd3, 0x12, - 0x16, 0xbe, 0xd0, 0x60, 0x49, 0xcf, 0x80, 0xcf, 0x85, 0xb9, 0x0a, 0x9d, - 0x61, 0xf2, 0x4c, 0x32, 0xf3, 0xe2, 0x8b, 0xf5, 0x28, 0xfa, 0x71, 0xd2, - 0x24, 0x6a, 0x71, 0xd3, 0x93, 0xba, 0x7e, 0xbd, 0xd7, 0x5f, 0xf7, 0xd4, - 0x82, 0x83, 0xbe, 0x07, 0x10, 0x9a, 0x66, 0x1f, 0x0f, 0x92, 0xb9, 0x00, - 0x99, 0xce, 0xeb, 0x19, 0xca, 0xb3, 0xd3, 0x9c, 0xe2, 0x4f, 0x2e, 0x3b, - 0x14, 0xd8, 0x73, 0x56, 0x2c, 0x4c, 0x3d, 0x6a, 0x55, 0x33, 0xf2, 0x23, - 0x8b, 0x7d, 0x0a, 0xd7, 0xb7, 0x61, 0x2c, 0xd3, 0xc7, 0x47, 0x1e, 0xe1, - 0xba, 0xfc, 0x6b, 0xc6, 0xb9, 0x91, 0x8d, 0xc2, 0x9b, 0xb3, 0x88, 0xc7, - 0x2a, 0x80, 0x3f, 0xe1, 0xcb, 0x3f, 0x75, 0x7d, 0x4b, 0xf9, 0xfe, 0x55, - 0x0f, 0xa3, 0xf6, 0x07, 0x51, 0x71, 0x78, 0x23, 0x32, 0x28, 0x4e, 0xa9, - 0x5f, 0x50, 0x5a, 0x47, 0xc8, 0xbe, 0x2b, 0x2b, 0xce, 0x40, 0x5b, 0x3e, - 0x02, 0x2b, 0x3d, 0xfe, 0x93, 0x15, 0xad, 0x00, 0x32, 0x0e, 0xbb, 0x13, - 0xf4, 0x3b, 0x76, 0xad, 0xca, 0x6a, 0x56, 0xe5, 0xa6, 0x02, 0xf6, 0x48, - 0x2f, 0x1d, 0x2b, 0xf1, 0xba, 0xdd, 0x7b, 0x84, 0xe3, 0x2f, 0x89, 0x0b, - 0x1e, 0x56, 0xad, 0xb3, 0xd5, 0x7a, 0xad, 0xe9, 0xb6, 0xb0, 0xed, 0x0f, - 0x27, 0xbe, 0x40, 0xcb, 0xd9, 0xd6, 0x1f, 0x3c, 0xc2, 0x5b, 0x21, 0xf7, - 0x8e, 0x6b, 0xda, 0xf8, 0xa7, 0x38, 0xe7, 0x91, 0x61, 0x1a, 0xdf, 0x60, - 0x01, 0x31, 0x81, 0xe6, 0x5f, 0x58, 0x4c, 0x3c, 0xe4, 0x58, 0xea, 0xe5, - 0x26, 0xb1, 0x18, 0xf1, 0x5d, 0xc0, 0xa2, 0x60, 0x48, 0x46, 0x92, 0xe0, - 0xb0, 0x79, 0xd2, 0xec, 0xd8, 0x18, 0xdc, 0xa6, 0x40, 0x1e, 0x73, 0x82, - 0x64, 0x56, 0x9e, 0x66, 0x40, 0x25, 0xf6, 0x8f, 0x20, 0x3e, 0x3e, 0xf9, - 0x79, 0x9b, 0x2d, 0x6b, 0x2b, 0x5e, 0x7b, 0x7f, 0xd8, 0xea, 0x36, 0x77, - 0xb3, 0x2e, 0xc8, 0xe5, 0x17, 0xff, 0x34, 0x30, 0xbc, 0xb9, 0x3c, 0x2c, - 0xa0, 0x9b, 0xb6, 0x30, 0x54, 0xba, 0x92, 0xce, 0x3f, 0x02, 0x4d, 0x27, - 0xec, 0xc0, 0x51, 0x0d, 0x16, 0x58, 0xeb, 0xef, 0x52, 0x05, 0x83, 0xab, - 0xb9, 0xf0, 0xec, 0x85, 0x4c, 0xf7, 0x65, 0xe3, 0xf5, 0xd8, 0xda, 0xdc, - 0x68, 0x10, 0x2c, 0xdf, 0xc0, 0x92, 0xff, 0x0e, 0x25, 0x8a, 0x2a, 0x40, - 0x12, 0x57, 0x26, 0x18, 0x6d, 0x18, 0xf3, 0xcb, 0xc2, 0x16, 0xe5, 0x74, - 0x03, 0x51, 0x11, 0xe1, 0x20, 0x71, 0xcf, 0x64, 0x9f, 0xe4, 0x4b, 0x54, - 0x19, 0xea, 0xe4, 0xe8, 0xcf, 0xce, 0x8b, 0xad, 0xf5, 0x8d, 0x34, 0xe8, - 0xf7, 0x63, 0xfd, 0xbe, 0xb5, 0xba, 0xbb, 0x49, 0x48, 0x4f, 0xfc, 0x55, - 0xb5, 0x67, 0x16, 0xa0, 0xb3, 0x77, 0x36, 0x04, 0xc0, 0xf8, 0xdf, 0x09, - 0x34, 0xc7, 0xe6, 0xb9, 0x0a, 0x75, 0xca, 0x61, 0x34, 0x9f, 0x5e, 0xb9, - 0xd7, 0x46, 0x33, 0x3e, 0x4c, 0x30, 0x18, 0xb2, 0xe6, 0x02, 0xb2, 0x57, - 0x0d, 0xc2, 0xbf, 0x0b, 0x4a, 0x49, 0x34, 0x36, 0xa0, 0xa5, 0xa6, 0x3d, - 0xa7, 0xea, 0x71, 0x86, 0x5c, 0x6d, 0xe5, 0x27, 0x70, 0x2c, 0xef, 0x85, - 0xf8, 0xa8, 0xde, 0x6a, 0x5a, 0x9b, 0x13, 0xeb, 0xbd, 0xa6, 0xc2, 0xcc, - 0xba, 0x71, 0x20, 0x36, 0xfa, 0x1e, 0x7c, 0xc3, 0xf7, 0x82, 0x51, 0x4b, - 0x65, 0xa3, 0xd2, 0x92, 0x2e, 0x7d, 0x96, 0xc7, 0x62, 0x40, 0x91, 0x28, - 0x5d, 0xe4, 0xbe, 0x10, 0xe7, 0x6e, 0x0a, 0xfb, 0xb6, 0xbb, 0xdb, 0xa5, - 0xf5, 0x98, 0x82, 0x59, 0xd4, 0x5c, 0xe8, 0xa7, 0x80, 0x86, 0xaa, 0x4a, - 0x2d, 0x4d, 0x3f, 0x1a, 0xc9, 0x77, 0xcf, 0x9c, 0x4e, 0x1a, 0x7f, 0x20, - 0x75, 0x47, 0x39, 0x1a, 0x68, 0xf5, 0x1d, 0xca, 0xc9, 0x43, 0x23, 0x0a, - 0x02, 0x70, 0x21, 0x8b, 0xa7, 0x8e, 0xb3, 0x90, 0xd9, 0x0d, 0xb2, 0x17, - 0xd3, 0xf4, 0xf3, 0xf2, 0x85, 0x51, 0x03, 0x8e, 0x59, 0x3a, 0xa5, 0x33, - 0x31, 0xf3, 0xae, 0xda, 0xce, 0x40, 0xde, 0x6a, 0x5a, 0x9b, 0x13, 0xeb, - 0xbd, 0xa6, 0xc3, 0x7c, 0xba, 0x71, 0x20, 0x36, 0x75, 0x68, 0x3d, 0x6c, - 0x57, 0xa6, 0x74, 0xc5, 0x0f, 0x66, 0xf7, 0x9a, 0x1b, 0x91, 0x51, 0x77, - 0xc7, 0xbb, 0x2b, 0x61, 0x17, 0xaa, 0x98, 0x76, 0x95, 0x04, 0x7c, 0xb2, - 0x35, 0x1d, 0x1b, 0xec, 0x2e, 0xb1, 0xcc, 0xa8, 0xf0, 0xff, 0xbc, 0x4d, - 0x8b, 0x9a, 0xfc, 0x25, 0xc7, 0xba, 0x4f, 0xe8, 0x3b, 0xa2, 0x12, 0xaa, - 0xb0, 0x71, 0xd9, 0x61, 0x88, 0xd7, 0xb1, 0xa2, 0x28, 0x3b, 0xf9, 0x9a, - 0x4e, 0x64, 0x84, 0x0b, 0xba, 0x50, 0x0e, 0xbf, 0x05, 0xe3, 0x6c, 0xd9, - 0xa2, 0xf0, 0x1b, 0x67, 0x99, 0x32, 0x0c, 0x29, 0xdb, 0x11, 0x10, 0xa0, - 0x99, 0x21, 0xa9, 0x82, 0x21, 0x41, 0x6d, 0x5a, 0x43, 0xd3, 0xb1, 0x12, - 0x4d, 0x79, 0x56, 0x67, 0x6e, 0x6b, 0x78, 0x54, 0x76, 0x7c, 0x16, 0x56, - 0xab, 0x2d, 0x30, 0x25, 0xba, 0xf1, 0x54, 0xa4, 0xa7, 0x01, 0xcf, 0x09, - 0xd6, 0x23, 0x5f, 0x8f, 0xbb, 0x54, 0x96, 0xdf, 0x8a, 0x12, 0x5a, 0x92, - 0xd6, 0x19, 0x5a, 0x83, 0x06, 0x97, 0xcc, 0x19, 0x5c, 0x50, 0x18, 0x3f, - 0xc8, 0x90, 0x26, 0x02, 0x4d, 0xb2, 0xba, 0xe7, 0xd0, 0x47, 0x71, 0x12, - 0x75, 0x64, 0xcb, 0xee, 0xc2, 0x8e, 0x08, 0xf8, 0x40, 0xd7, 0xb5, 0x1f, - 0x82, 0xfb, 0x35, 0xcc, 0x59, 0x87, 0x26, 0xa1, 0xd2, 0xeb, 0xf1, 0xfa, - 0x50, 0xc2, 0x4f, 0x4e, 0x9a, 0x1f, 0x8b, 0x36, 0x5e, 0xf5, 0xf4, 0xd9, - 0xc3, 0x35, 0x55, 0x0b, 0x95, 0x0d, 0x35, 0x2a, 0xec, 0xd5, 0x1c, 0x32, - 0x07, 0x7e, 0x00, 0x3f, 0x39, 0x56, 0xbb, 0xb4, 0x5d, 0xca, 0x0c, 0x9f, - 0x68, 0x23, 0x9b, 0x74, 0xe3, 0x5f, 0x08, 0xf8, 0xdf, 0x1f, 0x1f, 0xd5, - 0x88, 0x5e, 0xdf, 0x64, 0xb2, 0x88, 0x4e, 0x67, 0xe1, 0x59, 0x87, 0xd9, - 0x36, 0xff, 0xfa, 0x8b, 0xa6, 0x99, 0xae, 0x48, 0x71, 0x45, 0x70, 0x4d, - 0x96, 0x8f, 0x9c, 0x71, 0xe2, 0x2b, 0x26, 0xd3, 0x56, 0xf2, 0x8d, 0xd4, - 0x6a, 0xc0, 0xcd, 0x27, 0x2e, 0x4b, 0x3c, 0xf8, 0x18, 0xd8, 0x16, 0x18, - 0xe6, 0x94, 0xae, 0x3e, 0x11, 0xcc, 0x2c, 0xb0, 0xd9, 0x52, 0xbd, 0x43, - 0x14, 0x35, 0x43, 0x58, 0xe3, 0xf8, 0x14, 0x0a, 0xa5, 0x16, 0x10, 0x66, - 0x2c, 0x9c, 0xb2, 0xb3, 0xf1, 0x24, 0xce, 0x22, 0x50, 0xeb, 0x17, 0xe1, - 0x20, 0x47, 0xe8, 0xe1, 0x15, 0x97, 0xe1, 0x3d, 0xc2, 0x9d, 0x84, 0x94, - 0x18, 0x8c, 0x6f, 0x4a, 0x1a, 0x08, 0x53, 0xb4, 0x7a, 0xad, 0xc0, 0x0c, - 0x5a, 0xbb, 0x2c, 0x34, 0xe7, 0x4c, 0xd2, 0xee, 0x68, 0x26, 0x10, 0x31, - 0x45, 0xcc, 0xec, 0xdb, 0xc1, 0xc1, 0xac, 0x17, 0xe9, 0xb5, 0xb3, 0xa1, - 0xee, 0x99, 0xe7, 0x58, 0x65, 0xb0, 0x3f, 0xba, 0x1c, 0x49, 0x70, 0x04, - 0x17, 0x12, 0x28, 0xfe, 0x41, 0x5a, 0xd5, 0xa8, 0x3a, 0x1f, 0x93, 0x7f, - 0xe7, 0x4f, 0x06, 0x7f, 0x49, 0x4b, 0xd9, 0x37, 0x0b, 0xde, 0x3d, 0x61, - 0xa6, 0x9b, 0x87, 0x73, 0xfe, 0x61, 0xcb, 0x36, 0x16, 0x0e, 0x12, 0xf0, - 0xcf, 0x74, 0xff, 0x7d, 0xfb, 0xb0, 0x7e, 0x4e, 0x7a, 0x89, 0x07, 0x75, - 0xa0, 0x10, 0xca, 0xdd, 0x07, 0x5d, 0xe5, 0x8c, 0xc3, 0x10, 0xa8, 0xe8, - 0xd0, 0xab, 0xd4, 0xe7, 0xc6, 0x89, 0xac, 0xb2, 0x7c, 0x31, 0x0e, 0x6f, - 0x2e, 0xc6, 0x27, 0xf1, 0xeb, 0x52, 0x3b, 0x04, 0x0a, 0x8a, 0xd0, 0xe2, - 0x4f, 0x3e, 0xfb, 0x1f, 0x78, 0xd9, 0x5a, 0x2e, 0x4d, 0x6f, 0x1c, 0x04, - 0x5f, 0x80, 0xee, 0x74, 0x5b, 0x42, 0x07, 0x6e, 0xcc, 0x9e, 0x2d, 0xd1, - 0x5f, 0x37, 0xf9, 0xe9, 0xbc, 0xc2, 0xdb, 0xb9, 0x7f, 0xcf, 0xff, 0x1b, - 0x72, 0x28, 0xbe, 0x09, 0xfd, 0xc4, 0x16, 0xbf, 0x90, 0x5c, 0x85, 0x9e, - 0x34, 0xa0, 0x5d, 0x4a, 0xac, 0x17, 0xf0, 0x34, 0xb5, 0xa5, 0xc2, 0x01, - 0x8f, 0x5c, 0x53, 0x16, 0xe7, 0xa3, 0xc9, 0xee, 0x14, 0xde, 0xd9, 0xe5, - 0x17, 0x93, 0x94, 0x76, 0x51, 0x58, 0x89, 0xe0, 0x10, 0x3d, 0xd4, 0xa1, - 0xd0, 0x08, 0xcf, 0x67, 0xd7, 0xaf, 0xb5, 0x8d, 0xf6, 0xf8, 0x57, 0xeb, - 0x87, 0xf5, 0x1f, 0xcf, 0xac, 0x40, 0xbd, 0x7f, 0x5e, 0xbe, 0xff, 0x1f, - 0xff, 0xfd, 0xfb, 0x37, 0xea, 0x25, 0x95, 0xcc, 0x57, 0xfe, 0x7f, 0xdf, - 0x60, 0x26, 0x9b, 0x22, 0xa5, 0xbd, 0xf9, 0x70, 0xb1, 0xe2, 0xfe, 0xbd, - 0x71, 0x5a, 0xf8, 0x64, 0x6e, 0x9a, 0x6c, 0xb4, 0xa5, 0x93, 0xd6, 0xd0, - 0x45, 0xfb, 0x78, 0x05, 0x66, 0xa1, 0xf9, 0x9a, 0xa2, 0x84, 0xeb, 0x79, - 0x59, 0x92, 0xeb, 0x31, 0x3f, 0xbc, 0xe9, 0x82, 0xd2, 0xfc, 0xc0, 0x36, - 0x2f, 0x34, 0xab, 0x98, 0x74, 0x4e, 0x1d, 0x94, 0x2e, 0xed, 0xb1, 0xcb, - 0x74, 0x9a, 0x3f, 0x36, 0xca, 0x55, 0x15, 0x79, 0xc6, 0x7e, 0xa4, 0xa4, - 0x5a, 0xd0, 0xf5, 0x68, 0x2d, 0x08, 0xec, 0xc5, 0xa0, 0xb8, 0x79, 0xba, - 0x73, 0x8e, 0x9d, 0x6f, 0xb7, 0x35, 0xaa, 0x65, 0x6e, 0xb7, 0xc7, 0x69, - 0x5c, 0x36, 0x80, 0xed, 0x3d, 0xfd, 0x11, 0x8f, 0x59, 0x03, 0x9d, 0x28, - 0x69, 0x5e, 0xca, 0xa6, 0x98, 0xf1, 0x9e, 0x4c, 0x0e, 0x62, 0xe6, 0x7a, - 0xb8, 0x6f, 0xa8, 0xee, 0x10, 0x59, 0x4e, 0xec, 0xa3, 0x95, 0x1d, 0x0d, - 0x9d, 0xcd, 0x22, 0x08, 0x97, 0xcc, 0x5a, 0xbc, 0xff, 0x83, 0xc5, 0x1f, - 0xfe, 0xd7, 0x0d, 0x54, 0xf6, 0x45, 0x60, 0xbd, 0x7e, 0xdd, 0xea, 0x5f, - 0x49, 0x7a, 0x93, 0xde, 0x85, 0x11, 0x94, 0x79, 0x0a, 0x8a, 0x82, 0x9e, - 0xb0, 0x0c, 0xd0, 0x4e, 0x00, 0xa9, 0xa8, 0x2a, 0x38, 0x84, 0x72, 0x72, - 0x83, 0x89, 0x93, 0x04, 0xe0, 0x33, 0x4c, 0x5c, 0xa9, 0x0e, 0x43, 0x6b, - 0x45, 0xc4, 0xf1, 0x6d, 0x80, 0x61, 0xf8, 0x06, 0x67, 0x35, 0x39, 0xc3, - 0x5e, 0x47, 0x75, 0x94, 0xe0, 0x30, 0x70, 0x70, 0xfe, 0x5c, 0x9e, 0x29, - 0x48, 0xf4, 0xcf, 0x0b, 0xa0, 0xef, 0x12, 0x25, 0xd6, 0x9c, 0x06, 0x94, - 0x0d, 0x03, 0xb8, 0xb0, 0xb9, 0x94, 0xbc, 0x5b, 0xa3, 0x9e, 0xe1, 0xfc, - 0x3b, 0xdf, 0x20, 0xda, 0x88, 0x36, 0xf2, 0xa4, 0x27, 0x21, 0xe4, 0x49, - 0x09, 0xe2, 0x61, 0x63, 0x65, 0xf7, 0xb9, 0x15, 0x0e, 0xd9, 0x6c, 0xb4, - 0xe1, 0xb8, 0x60, 0xa8, 0x90, 0x61, 0xa9, 0x06, 0xbb, 0x9c, 0xb2, 0x7c, - 0xe7, 0xee, 0x0f, 0x21, 0x3e, 0x82, 0x8e, 0x1d, 0xdd, 0xe3, 0xcd, 0x91, - 0x8d, 0x92, 0x2d, 0xd2, 0x76, 0x0e, 0xe7, 0xd5, 0x88, 0x60, 0x6b, 0x46, - 0x0c, 0x3a, 0x6c, 0xc7, 0x3a, 0x30, 0x87, 0x11, 0x43, 0xce, 0x74, 0x73, - 0x7e, 0x15, 0xae, 0x88, 0xf0, 0x82, 0xd4, 0x13, 0x0b, 0x15, 0xd4, 0x8f, - 0x7a, 0xf5, 0xe9, 0x6c, 0xf2, 0x3b, 0x9d, 0xe9, 0x04, 0x2a, 0x45, 0xb9, - 0xfc, 0xb0, 0x2b, 0x24, 0xc0, 0xda, 0x46, 0x54, 0xa7, 0x79, 0x29, 0x95, - 0x52, 0x8d, 0x0f, 0xfb, 0x18, 0x70, 0x7d, 0xae, 0xcc, 0x17, 0xf6, 0x60, - 0x61, 0xa2, 0xec, 0xe1, 0x98, 0x74, 0xb2, 0x49, 0xbe, 0xff, 0xcd, 0xe1, - 0x63, 0x84, 0xed, 0x7b, 0x7b, 0x84, 0x05, 0x2c, 0x45, 0x7d, 0x0e, 0x5b, - 0x2b, 0x78, 0xee, 0x5f, 0x23, 0xa2, 0x0c, 0x9f, 0xd2, 0xc6, 0xcf, 0xcc, - 0xd0, 0x2a, 0xb7, 0x0a, 0xee, 0x61, 0x2c, 0xcb, 0x41, 0x74, 0x09, 0x3c, - 0x79, 0x20, 0xe8, 0xbc, 0xe7, 0x79, 0xd5, 0x01, 0x8f, 0xd5, 0x28, 0xa3, - 0x34, 0xb1, 0x67, 0xb7, 0xc4, 0x90, 0xd3, 0x52, 0x42, 0x00, 0xb4, 0x86, - 0x27, 0x4a, 0x49, 0x40, 0x5d, 0xbd, 0x6f, 0xf2, 0x34, 0x5f, 0xf8, 0xaa, - 0xa3, 0x3d, 0x91, 0x2e, 0xb9, 0x81, 0xe3, 0xd6, 0xef, 0x7b, 0x5b, 0xb2, - 0x84, 0x24, 0xac, 0x34, 0x6e, 0x02, 0x5c, 0xc3, 0xae, 0x2a, 0x70, 0x7f, - 0x50, 0x31, 0xbc, 0xe1, 0x5b, 0xd4, 0xbf, 0x18, 0x3e, 0x77, 0xb1, 0xbd, - 0x45, 0x90, 0x7b, 0x3c, 0xf1, 0xfd, 0xcf, 0x0c, 0x57, 0x51, 0x1d, 0xe6, - 0x4f, 0x17, 0x2b, 0x16, 0x5f, 0x30, 0xfb, 0x13, 0xf5, 0x9a, 0xe7, 0x3d, - 0x7e, 0xdb, 0xac, 0x6b, 0x12, 0x66, 0x53, 0xf6, 0x2e, 0x9b, 0x14, 0x8c, - 0xae, 0x57, 0x95, 0x29, 0xe0, 0x91, 0xc7, 0xe9, 0xf1, 0xd0, 0x31, 0x5a, - 0x77, 0x6d, 0x16, 0xca, 0x53, 0x69, 0x5d, 0x0b, 0x4a, 0xa1, 0xb6, 0x81, - 0xff, 0x94, 0x95, 0xac, 0xc9, 0xaf, 0xa5, 0x38, 0x4a, 0xb9, 0x48, 0x18, - 0x24, 0x8a, 0x5d, 0x04, 0x44, 0xfe, 0x41, 0x93, 0x47, 0x00, 0x6b, 0x62, - 0xfa, 0x2a, 0x64, 0xd0, 0x85, 0x43, 0x1f, 0x7a, 0xd4, 0x26, 0xe9, 0x9a, - 0x05, 0x8e, 0x07, 0x60, 0x00, 0x64, 0x72, 0x5f, 0xbf, 0x01, 0x53, 0x11, - 0x7b, 0x82, 0x5b, 0xf3, 0x26, 0x29, 0xda, 0xaa, 0x69, 0x3e, 0x8e, 0x76, - 0x18, 0x31, 0x73, 0x9f, 0xa7, 0x5e, 0x06, 0x31, 0x57, 0xd7, 0x17, 0xde, - 0x3c, 0x8b, 0xaa, 0xc7, 0xf7, 0x63, 0x3d, 0x26, 0xfb, 0x01, 0x9b, 0xee, - 0xc3, 0xd9, 0xf1, 0xb1, 0xae, 0xe2, 0xf2, 0x80, 0x1d, 0x7c, 0x83, 0x49, - 0xec, 0x76, 0x18, 0x82, 0xc6, 0x4a, 0x9e, 0xfb, 0x92, 0x32, 0x38, 0xd4, - 0xeb, 0xe9, 0x59, 0x2e, 0x33, 0x71, 0x43, 0x54, 0x48, 0x45, 0x2d, 0x7b, - 0x11, 0x79, 0xc5, 0x16, 0xaa, 0xcd, 0x62, 0x4d, 0x25, 0xda, 0xbf, 0x85, - 0xe9, 0x62, 0x74, 0xcb, 0xd6, 0x1b, 0x29, 0xee, 0x78, 0x03, 0x0a, 0xb7, - 0x51, 0xe5, 0x7e, 0x9e, 0x5f, 0x37, 0xae, 0xbe, 0x8b, 0x40, 0xdb, 0x5e, - 0xd4, 0x6c, 0xdc, 0xcd, 0xb5, 0x33, 0xf5, 0xc0, 0xb4, 0x02, 0x17, 0x17, - 0x16, 0x06, 0x4a, 0xf2, 0xcf, 0xae, 0xb3, 0x54, 0x43, 0xd6, 0xe9, 0x97, - 0xc9, 0xb8, 0x0b, 0x08, 0x0e, 0x87, 0xd1, 0x0d, 0x1a, 0x72, 0xd6, 0xc4, - 0xe5, 0xbf, 0x7c, 0xff, 0xfc, 0x0c, 0xa2, 0xd1, 0x16, 0x98, 0x46, 0x19, - 0x93, 0xec, 0x0f, 0x1e, 0x9c, 0x69, 0xae, 0xa1, 0x95, 0x3e, 0xcf, 0xd2, - 0x43, 0x33, 0x32, 0xff, 0x85, 0xdb, 0x31, 0xdf, 0x8b, 0x4c, 0x5e, 0xbd, - 0x38, 0xd8, 0x6e, 0x66, 0x9c, 0xe7, 0x2f, 0x82, 0x16, 0x27, 0x86, 0x7b, - 0x9a, 0xce, 0xdf, 0x51, 0xee, 0xf0, 0xc7, 0xf9, 0xb1, 0x2b, 0x01, 0x8e, - 0xa6, 0xb2, 0x30, 0xa1, 0xf1, 0xd7, 0x4b, 0x30, 0x23, 0x5c, 0x55, 0x13, - 0xdb, 0x4d, 0x76, 0x47, 0x95, 0x78, 0x84, 0x95, 0x81, 0x03, 0xa7, 0xdd, - 0xfa, 0x8b, 0xdc, 0x5b, 0x68, 0xba, 0xd4, 0x60, 0xde, 0x8b, 0xc4, 0xf2, - 0x60, 0x38, 0x09, 0x04, 0xce, 0xaa, 0xda, 0x67, 0x79, 0x1d, 0x17, 0x0f, - 0xdf, 0x45, 0xbd, 0xa8, 0x00, 0x65, 0xb1, 0x87, 0x1f, 0x2f, 0x2a, 0x33, - 0x6b, 0x63, 0x63, 0xf4, 0x22, 0x84, 0x59, 0x8a, 0x5f, 0x3c, 0x0e, 0x47, - 0x48, 0xf4, 0x34, 0x31, 0xf7, 0x3a, 0x37, 0xe1, 0x38, 0xa5, 0x79, 0x86, - 0x01, 0x0f, 0xfa, 0x04, 0x4a, 0x5c, 0xa6, 0x17, 0xed, 0xb5, 0x0e, 0x15, - 0xbf, 0xe9, 0x55, 0xcb, 0xcb, 0xa3, 0x8b, 0xcb, 0xe8, 0x4a, 0xc1, 0xec, - 0xd7, 0x30, 0xe4, 0x66, 0x79, 0xcb, 0xd6, 0x86, 0x1f, 0xec, 0xfa, 0x16, - 0x39, 0x20, 0xdc, 0x1f, 0x8d, 0x15, 0x87, 0x9a, 0x27, 0x08, 0xdc, 0xcd, - 0x9e, 0xfb, 0xf7, 0x3a, 0xd6, 0xa9, 0x14, 0xd9, 0xbd, 0xda, 0x45, 0xf6, - 0xf0, 0xaf, 0x89, 0x0e, 0x3e, 0xea, 0xbe, 0xff, 0x56, 0xf8, 0x8f, 0x9f, - 0x05, 0x46, 0xcd, 0x97, 0xf9, 0xd6, 0x9f, 0x19, 0x8e, 0xcf, 0xea, 0x5c, - 0xa1, 0xac, 0x42, 0x95, 0x2b, 0x74, 0x42, 0xac, 0x75, 0xb7, 0x1b, 0x92, - 0x3f, 0x74, 0xf5, 0xc3, 0x9f, 0x3f, 0xa2, 0x9e, 0x02, 0xfa, 0x11, 0x5f, - 0xd9, 0xa9, 0x3c, 0xb5, 0xb9, 0xf5, 0x54, 0x6e, 0x5d, 0x10, 0xb2, 0x04, - 0x56, 0x73, 0x05, 0x37, 0x98, 0x60, 0x59, 0x16, 0xbf, 0xe9, 0xf9, 0x87, - 0xed, 0x7f, 0xe7, 0xa5, 0x24, 0xde, 0xa8, 0x0e, 0xbb, 0xe7, 0xb7, 0x0f, - 0xd3, 0xeb, 0xfb, 0x59, 0x84, 0xb1, 0x9a, 0x37, 0xde, 0x74, 0xd7, 0xad, - 0x67, 0xf6, 0xdc, 0x34, 0x46, 0x41, 0xe6, 0xff, 0x2e, 0x85, 0xc9, 0x6c, - 0xe2, 0xf6, 0x94, 0x7a, 0x0c, 0x77, 0xad, 0x1e, 0x52, 0x5d, 0xd3, 0xef, - 0xa2, 0xa2, 0x5f, 0xa1, 0x5c, 0xed, 0x80, 0x59, 0xf7, 0x64, 0x23, 0x59, - 0x35, 0xf1, 0x7b, 0x99, 0x6a, 0x07, 0xeb, 0x5c, 0x33, 0x1b, 0xfc, 0x46, - 0x12, 0x26, 0xab, 0x16, 0x85, 0xeb, 0xde, 0xec, 0x15, 0x33, 0xf8, 0xe5, - 0x0d, 0x92, 0x9f, 0x41, 0x44, 0x0b, 0x2e, 0x3f, 0xc3, 0xe3, 0x56, 0x91, - 0x1c, 0x4b, 0x85, 0x38, 0xf8, 0x54, 0x17, 0xa5, 0x4b, 0x7c, 0xbf, 0x98, - 0x52, 0xd8, 0xdd, 0xd6, 0x87, 0xfd, 0xfb, 0xa5, 0x32, 0x8b, 0x4e, 0x01, - 0xe1, 0x6c, 0x5d, 0x28, 0x0b, 0xa2, 0xfc, 0xe5, 0x6e, 0xb3, 0x5f, 0xa2, - 0xc0, 0xaf, 0xd9, 0x1a, 0xc6, 0x8e, 0x3d, 0xc6, 0xaa, 0x6f, 0xa1, 0x93, - 0xa0, 0xb6, 0xbb, 0xf9, 0x65, 0x67, 0x66, 0x99, 0xee, 0x7c, 0x0a, 0x1a, - 0x8a, 0xf7, 0xdb, 0x40, 0x08, 0xc4, 0x2d, 0x3e, 0x80, 0x36, 0xaf, 0x7d, - 0x6e, 0x83, 0x4b, 0x8b, 0x96, 0xd5, 0x38, 0x97, 0x1b, 0x18, 0x6b, 0xde, - 0x94, 0x1b, 0x18, 0x98, 0x7f, 0x42, 0xef, 0x48, 0x45, 0x9e, 0x0c, 0xeb, - 0x46, 0xb0, 0x7b, 0xae, 0xef, 0x27, 0xe9, 0x9d, 0x84, 0x6c, 0x02, 0x60, - 0x57, 0xb0, 0x34, 0x06, 0xc0, 0x03, 0x40, 0x07, 0x1e, 0x49, 0x2a, 0x09, - 0x1e, 0x05, 0xe5, 0xcd, 0x0c, 0x9b, 0xa4, 0xe8, 0x99, 0x91, 0xf2, 0xe1, - 0xaf, 0x3c, 0x85, 0x0d, 0x89, 0x38, 0x11, 0x08, 0xdd, 0x08, 0x90, 0xee, - 0x49, 0xdd, 0x9a, 0xe3, 0x9f, 0x0b, 0x2b, 0xa8, 0x22, 0x0f, 0x74, 0xa9, - 0x44, 0x1c, 0x08, 0xbf, 0x4e, 0x4f, 0x1f, 0x2b, 0x55, 0x2d, 0xbb, 0xf8, - 0x28, 0x86, 0xa8, 0x39, 0x1a, 0x71, 0xaa, 0xc3, 0x6c, 0x30, 0x5c, 0xa8, - 0x57, 0x8a, 0x0a, 0x6f, 0xcf, 0xfd, 0x4e, 0xe9, 0xa0, 0xed, 0x15, 0x7a, - 0xed, 0x7f, 0xcc, 0xda, 0x96, 0x4d, 0x0a, 0x86, 0x4c, 0x7d, 0xe2, 0x04, - 0xcd, 0x94, 0x80, 0x5e, 0x73, 0x46, 0x9f, 0x07, 0x5e, 0x1d, 0x8f, 0x2d, - 0x47, 0x7c, 0xea, 0xed, 0xe2, 0x30, 0x5e, 0x48, 0x30, 0xf1, 0x1f, 0x68, - 0x5a, 0xb7, 0xcb, 0xda, 0x5a, 0x20, 0x84, 0x51, 0x48, 0x24, 0xdd, 0xd8, - 0x06, 0x6e, 0xe7, 0x8a, 0x16, 0x59, 0xf8, 0x02, 0x2e, 0x90, 0x61, 0x82, - 0x12, 0x93, 0xc4, 0xb7, 0xb0, 0xe4, 0x51, 0x76, 0x64, 0x2f, 0xfe, 0x3a, - 0xb6, 0xd5, 0x6e, 0xdf, 0x68, 0xe2, 0x28, 0xa2, 0xc4, 0xe3, 0x16, 0xda, - 0xb1, 0x31, 0x16, 0x46, 0xae, 0xd7, 0x72, 0x25, 0x3e, 0x01, 0x36, 0x07, - 0xee, 0x98, 0x05, 0x96, 0xd1, 0xe7, 0xa5, 0x91, 0xe3, 0x1d, 0x8e, 0xee, - 0x63, 0x7b, 0xce, 0xca, 0x43, 0x94, 0xaa, 0x65, 0xe1, 0x0d, 0xe1, 0xf5, - 0x4e, 0xc3, 0x09, 0xdc, 0xe0, 0x81, 0x26, 0xfa, 0x8e, 0x7e, 0xb6, 0xe0, - 0x9f, 0xa8, 0xb0, 0x3d, 0xa9, 0x6d, 0x54, 0x43, 0xa6, 0x50, 0x44, 0x2a, - 0x61, 0x16, 0x08, 0xe1, 0x75, 0xf0, 0xc0, 0x47, 0x0b, 0x71, 0x52, 0xc9, - 0xab, 0xa8, 0x64, 0xe0, 0xcb, 0x6c, 0x7c, 0x74, 0x09, 0xf7, 0xf1, 0xc9, - 0xdd, 0xf0, 0x5c, 0xe3, 0x33, 0x0c, 0x17, 0x69, 0x02, 0xef, 0x3d, 0xbd, - 0xd1, 0x3d, 0xfa, 0x3e, 0x41, 0xc3, 0x65, 0xf1, 0x13, 0x34, 0x67, 0xd8, - 0x87, 0x0b, 0x4d, 0xc3, 0x68, 0x67, 0x66, 0x3c, 0x8e, 0xfa, 0xf6, 0x68, - 0x99, 0xa3, 0xbf, 0x85, 0x47, 0x05, 0xd9, 0x0b, 0x76, 0xdd, 0x67, 0xad, - 0xda, 0x64, 0x98, 0xee, 0x98, 0x75, 0x64, 0x89, 0x82, 0xfe, 0x9f, 0x6a, - 0x24, 0xb9, 0xda, 0xb1, 0xac, 0xf0, 0xdd, 0xa4, 0x38, 0x99, 0xd7, 0xf6, - 0x0e, 0x47, 0x77, 0x34, 0xc9, 0x69, 0x93, 0xd5, 0x68, 0xcf, 0x2d, 0xa5, - 0xfc, 0x44, 0xe6, 0x58, 0x3b, 0x86, 0x23, 0x24, 0xb6, 0x7b, 0x70, 0x84, - 0x43, 0x07, 0xe8, 0x58, 0xcb, 0x72, 0x6f, 0x5d, 0xee, 0x22, 0xc2, 0x0d, - 0xdb, 0x2e, 0x5f, 0x69, 0x49, 0x41, 0xeb, 0x44, 0xf4, 0x2a, 0x2a, 0x6c, - 0xc8, 0xc6, 0x10, 0x32, 0x89, 0x96, 0x52, 0xca, 0x7e, 0x22, 0x6d, 0x62, - 0x9f, 0x9c, 0x7e, 0x4e, 0x4b, 0x82, 0x66, 0x61, 0xf7, 0x04, 0xee, 0x5a, - 0x0b, 0x14, 0xac, 0x2a, 0x50, 0xb1, 0x77, 0x38, 0xff, 0x87, 0x3d, 0xee, - 0x96, 0x28, 0x47, 0x62, 0x95, 0x02, 0xf6, 0x9d, 0xbd, 0x43, 0x1a, 0xa7, - 0x93, 0x5d, 0xfd, 0x96, 0x36, 0xc1, 0xaa, 0x77, 0x85, 0xe1, 0x92, 0xc4, - 0xe3, 0x39, 0x3c, 0x22, 0x25, 0x2a, 0xc0, 0x4d, 0xb0, 0xf3, 0x5a, 0x7c, - 0xdd, 0xfd, 0x30, 0xcf, 0x2c, 0xb0, 0x23, 0x75, 0x5e, 0xb9, 0xcf, 0xb2, - 0x4f, 0xf3, 0x58, 0x5e, 0x34, 0x93, 0xab, 0xfa, 0xa6, 0x1b, 0x3f, 0xf1, - 0xf9, 0x60, 0x80, 0xbf, 0x2f, 0xc8, 0x3d, 0xe6, 0xd3, 0x48, 0x31, 0x36, - 0xdb, 0xfa, 0x6e, 0xd7, 0x80, 0x33, 0x73, 0xb7, 0x22, 0x1b, 0x7c, 0x1d, - 0xcb, 0xb6, 0xe8, 0xf9, 0x2b, 0x30, 0x67, 0x8d, 0xc3, 0x0f, 0x68, 0x91, - 0x08, 0xf7, 0x9b, 0x8c, 0xbc, 0xf6, 0x94, 0x99, 0x2b, 0xe8, 0xb1, 0x5e, - 0x7a, 0xd1, 0xf0, 0x37, 0xfe, 0x63, 0x99, 0xeb, 0x0b, 0xbb, 0xa9, 0x3f, - 0xfc, 0x8b, 0x1c, 0x93, 0x4b, 0xf9, 0xbf, 0xb1, 0x31, 0x4d, 0xfd, 0x70, - 0xea, 0x13, 0xcf, 0x97, 0xcc, 0xc9, 0x5e, 0x57, 0xf0, 0xd9, 0xd7, 0x51, - 0x28, 0x6b, 0xac, 0x9e, 0x33, 0xce, 0x77, 0x38, 0xab, 0xc1, 0x9f, 0x1e, - 0xa9, 0x03, 0x0b, 0xfb, 0x7e, 0xb7, 0x3a, 0x1d, 0x22, 0xf7, 0xdf, 0xec, - 0x92, 0x0f, 0x69, 0xb4, 0x6b, 0xed, 0x4e, 0x11, 0x0d, 0xd0, 0x86, 0xfb, - 0xe3, 0x1b, 0x32, 0xfa, 0xf7, 0x7b, 0x9d, 0xa7, 0x68, 0x56, 0x43, 0x70, - 0x23, 0x08, 0x8b, 0xca, 0x27, 0x54, 0x13, 0xa4, 0xbc, 0xf5, 0x11, 0xf4, - 0xd8, 0x7d, 0xd7, 0xe3, 0xe4, 0xf1, 0x78, 0xfb, 0x20, 0x3a, 0x91, 0x10, - 0x20, 0xdc, 0x8a, 0xae, 0x09, 0x6c, 0xf1, 0x48, 0x9a, 0xea, 0x05, 0xe3, - 0x37, 0x5f, 0xb6, 0xa3, 0x5a, 0x7c, 0xa9, 0xe9, 0xa1, 0xfb, 0xff, 0xe8, - 0xa6, 0x09, 0x8f, 0x6d, 0x5f, 0x86, 0x28, 0xd4, 0x6f, 0xbb, 0x08, 0xd2, - 0xea, 0x56, 0xc7, 0xed, 0x5b, 0xca, 0xb4, 0xf5, 0xdd, 0x79, 0x9f, 0x92, - 0x9d, 0xbc, 0x5b, 0x36, 0x19, 0xad, 0x1f, 0x7a, 0xfe, 0xca, 0xc3, 0x25, - 0x11, 0x71, 0x94, 0x0c, 0x69, 0x3d, 0x91, 0xb1, 0x2b, 0xa6, 0x06, 0x43, - 0xa3, 0xba, 0x88, 0xb0, 0x3a, 0xcb, 0x71, 0xc1, 0x92, 0x67, 0x6c, 0x18, - 0x4a, 0xb8, 0x49, 0x8f, 0x8e, 0x0d, 0x5a, 0xa8, 0x37, 0x01, 0x06, 0x0a, - 0xf1, 0xfa, 0x55, 0xcc, 0x76, 0xbe, 0xb1, 0x2c, 0xa5, 0xeb, 0x08, 0x7a, - 0x2e, 0xf5, 0xe5, 0xa8, 0x75, 0x9b, 0xbd, 0xb6, 0xfb, 0x57, 0x60, 0x28, - 0x35, 0x7f, 0x50, 0xf7, 0xb9, 0x42, 0x18, 0xcb, 0x57, 0xf7, 0x6a, 0x6d, - 0x44, 0x8f, 0x87, 0x71, 0x4a, 0xb8, 0x66, 0x1e, 0x70, 0x3d, 0x96, 0x74, - 0xc4, 0xbb, 0x10, 0x6b, 0x5f, 0x28, 0x11, 0x71, 0xa5, 0xb3, 0x8f, 0xbc, - 0x80, 0xd6, 0x08, 0xfc, 0xaa, 0x39, 0x2b, 0x31, 0x30, 0x3c, 0xbb, 0xf1, - 0x29, 0x69, 0xed, 0x1d, 0xd8, 0x3d, 0xa6, 0x47, 0x22, 0x55, 0xb3, 0x55, - 0x17, 0x11, 0x2d, 0x9d, 0xf0, 0xae, 0xde, 0x50, 0xd3, 0xd3, 0xb1, 0x7a, - 0x6e, 0xcb, 0x7d, 0x72, 0x76, 0xcc, 0x07, 0x8f, 0x5e, 0x2e, 0x9c, 0x80, - 0x2c, 0xc1, 0x1e, 0xc4, 0xd0, 0x96, 0xb7, 0x5a, 0x55, 0x63, 0x5d, 0x96, - 0x67, 0x84, 0xa3, 0x89, 0xfc, 0xc5, 0xc8, 0x17, 0x5c, 0xe0, 0xf2, 0xab, - 0x57, 0x8f, 0xc5, 0xa3, 0x6a, 0xb5, 0xbc, 0xe1, 0x3d, 0xc5, 0x47, 0x84, - 0xf5, 0x29, 0x0f, 0x45, 0x1c, 0xc3, 0x73, 0x87, 0x47, 0x46, 0xaa, 0x82, - 0xc7, 0xe0, 0xdb, 0xc8, 0x82, 0xe1, 0x8c, 0xd0, 0x65, 0x9e, 0xb3, 0xb2, - 0xdf, 0x23, 0xf6, 0xb5, 0xd0, 0x9c, 0xd3, 0x02, 0x33, 0xca, 0xd7, 0xb2, - 0x80, 0xe1, 0x33, 0x3b, 0x8d, 0xe7, 0xc5, 0x90, 0x69, 0x64, 0x07, 0xcc, - 0x45, 0x41, 0xee, 0x4c, 0x83, 0x3e, 0xac, 0xe5, 0x90, 0xf1, 0x59, 0x46, - 0xee, 0x0a, 0x5b, 0x65, 0xf8, 0x4e, 0x36, 0x0c, 0xb3, 0x39, 0xd6, 0x21, - 0xbb, 0x3a, 0x8b, 0xe7, 0x2f, 0xc2, 0x7c, 0xc6, 0x81, 0xad, 0x5f, 0x49, - 0x21, 0xff, 0x9a, 0xf7, 0x0e, 0x68, 0xe1, 0xbf, 0x23, 0x15, 0xb6, 0xf3, - 0x9e, 0x5f, 0x4f, 0x1b, 0x37, 0xb5, 0x39, 0xf1, 0xb6, 0xcf, 0xbb, 0x2f, - 0x4b, 0x52, 0x38, 0x49, 0x6d, 0x95, 0x70, 0xdb, 0x19, 0xdc, 0xa9, 0x42, - 0x38, 0xc3, 0x90, 0x8f, 0x18, 0x9a, 0x54, 0xb3, 0x20, 0x07, 0x23, 0x9b, - 0x75, 0xc6, 0x8c, 0xfe, 0x04, 0x20, 0x17, 0x5e, 0x1c, 0x93, 0xb2, 0x2a, - 0x43, 0x41, 0xff, 0x81, 0xe0, 0x45, 0xed, 0x98, 0x26, 0xff, 0xda, 0x05, - 0x41, 0x33, 0x96, 0x03, 0x07, 0xec, 0x78, 0x0b, 0xf9, 0x00, 0xc8, 0xbc, - 0x23, 0x05, 0xaf, 0x71, 0xae, 0x62, 0x86, 0x4d, 0x24, 0x7b, 0xe1, 0x9e, - 0x2e, 0xf0, 0x35, 0x13, 0x57, 0x59, 0x3f, 0x96, 0x58, 0x1d, 0x10, 0x0b, - 0x40, 0x53, 0x8b, 0xfe, 0x76, 0xb7, 0x96, 0xa8, 0xfb, 0xcc, 0x9b, 0x62, - 0xdf, 0x90, 0x86, 0xf7, 0xbc, 0x23, 0x9d, 0xb5, 0x1a, 0xc3, 0xc9, 0x2c, - 0x53, 0x32, 0xca, 0x41, 0xd2, 0xc2, 0x63, 0x0a, 0xcd, 0x25, 0xd4, 0xd9, - 0x0d, 0x8e, 0xd2, 0x1c, 0xed, 0x39, 0x4a, 0x79, 0x84, 0x97, 0x06, 0x55, - 0x95, 0x2b, 0xe5, 0xb3, 0x25, 0xeb, 0xe1, 0xd3, 0x5d, 0x8a, 0x1e, 0x21, - 0xe1, 0x05, 0xd6, 0xd9, 0x44, 0x3e, 0xfc, 0x3b, 0x74, 0xbb, 0x0d, 0xe1, - 0xc3, 0xdf, 0x58, 0x00, 0x7c, 0x2c, 0xd6, 0x06, 0xc4, 0xa1, 0x8e, 0x19, - 0x4e, 0xde, 0x63, 0xd4, 0x61, 0xda, 0x42, 0xac, 0x22, 0x96, 0xd6, 0xd2, - 0x6c, 0x4c, 0x71, 0x4a, 0x4a, 0xc3, 0xd7, 0x99, 0x4e, 0x4e, 0xab, 0x08, - 0xe9, 0xe9, 0x70, 0xc5, 0x50, 0x15, 0xc0, 0x09, 0x52, 0xd4, 0x10, 0x0f, - 0x00, 0x5c, 0xc0, 0x11, 0x95, 0xef, 0xa1, 0x93, 0x8a, 0xf2, 0x0b, 0xe1, - 0x76, 0x07, 0x0c, 0x94, 0x66, 0x00, 0x0b, 0x65, 0x2f, 0x96, 0x1d, 0x93, - 0x42, 0x79, 0xdc, 0x4d, 0xf4, 0x94, 0xea, 0x8a, 0x85, 0xe3, 0xd8, 0x16, - 0xc9, 0x08, 0xef, 0x63, 0xac, 0xac, 0xfe, 0x8e, 0xdb, 0x86, 0x09, 0xad, - 0xb9, 0x2e, 0x93, 0x6f, 0x10, 0x9d, 0xb0, 0xca, 0xdf, 0xdd, 0x9f, 0x2a, - 0xfc, 0x32, 0xc3, 0xc0, 0x46, 0xbc, 0x72, 0xc4, 0x11, 0xf4, 0x11, 0x29, - 0x7a, 0xbf, 0x8f, 0x29, 0x37, 0xc5, 0x98, 0xc2, 0x59, 0x40, 0x78, 0xd4, - 0xb2, 0x0e, 0x0a, 0x47, 0xb5, 0xad, 0xa4, 0x7a, 0x7b, 0x9e, 0x5d, 0x17, - 0x80, 0x75, 0x0c, 0x47, 0x96, 0xa2, 0xc2, 0x6b, 0xb8, 0xb6, 0xcc, 0x15, - 0xa5, 0x4a, 0x27, 0xae, 0xe3, 0x9e, 0xe1, 0xc2, 0xcc, 0x12, 0x66, 0x4e, - 0xdd, 0x74, 0x19, 0xd0, 0x48, 0x70, 0xa7, 0x19, 0x93, 0x12, 0xf9, 0x81, - 0xf7, 0x1e, 0xe0, 0x95, 0x64, 0xc5, 0x92, 0x9d, 0x6b, 0xa2, 0x6f, 0xce, - 0x57, 0x24, 0xd8, 0x71, 0xe5, 0x34, 0xad, 0x8c, 0xc4, 0xa1, 0x30, 0x37, - 0xdc, 0x5b, 0xd1, 0xdb, 0xec, 0x9d, 0x7e, 0x38, 0x18, 0x38, 0xdb, 0x85, - 0x78, 0x3c, 0xfd, 0x19, 0x44, 0x53, 0x2e, 0x2a, 0x6b, 0x18, 0xfb, 0x7a, - 0xb5, 0x86, 0x47, 0x46, 0x5d, 0xa5, 0x44, 0x3f, 0x93, 0x6a, 0x36, 0x63, - 0x12, 0x15, 0x94, 0x84, 0x15, 0xc8, 0x73, 0x63, 0xc4, 0xfc, 0xa4, 0x37, - 0x75, 0x56, 0x2d, 0xbf, 0x95, 0x54, 0x84, 0xb1, 0x3c, 0xb1, 0xa7, 0x2b, - 0x01, 0x20, 0xce, 0xab, 0xe4, 0x79, 0x26, 0x66, 0x84, 0x60, 0xf7, 0x50, - 0x81, 0x59, 0x0a, 0x75, 0x32, 0x68, 0xe5, 0x66, 0x4e, 0xc0, 0x8c, 0xe3, - 0x81, 0x1a, 0xd5, 0x34, 0x0b, 0x2e, 0x37, 0x6d, 0x4d, 0x4b, 0x0e, 0xef, - 0xb8, 0x5e, 0x08, 0x25, 0xea, 0x86, 0x3b, 0x4d, 0xd9, 0x88, 0x6d, 0x1d, - 0x93, 0x68, 0x3a, 0x50, 0xba, 0xf0, 0x2f, 0x24, 0x19, 0x39, 0xcd, 0xe6, - 0xcc, 0x78, 0xb7, 0x47, 0x91, 0x1a, 0x6e, 0xbf, 0x7f, 0x72, 0xa2, 0xe9, - 0x04, 0xfa, 0xcb, 0xca, 0x8b, 0x04, 0xb8, 0x7e, 0x91, 0xc9, 0x9e, 0x0b, - 0x63, 0x00, 0xa4, 0xd9, 0x3a, 0xac, 0x15, 0x91, 0xc5, 0x6a, 0xa4, 0x31, - 0x34, 0x89, 0xa3, 0x77, 0x5d, 0x73, 0x6e, 0x14, 0xbe, 0x10, 0xf6, 0x40, - 0x94, 0x4e, 0xd8, 0xad, 0x5c, 0x64, 0x07, 0x87, 0xd5, 0x73, 0xf2, 0x6b, - 0x49, 0x43, 0xae, 0x9d, 0xca, 0x5e, 0x63, 0x65, 0x1b, 0xeb, 0xc3, 0x84, - 0x55, 0x77, 0x72, 0xf8, 0x68, 0xc6, 0xcb, 0xb2, 0xcf, 0xdf, 0x08, 0x74, - 0xf0, 0xa2, 0xd9, 0xfa, 0x07, 0x2d, 0x07, 0xd6, 0x71, 0x03, 0x22, 0x01, - 0x09, 0x34, 0xd8, 0xfd, 0x21, 0xd8, 0x68, 0x5c, 0x42, 0x16, 0x6a, 0x9f, - 0xbe, 0x6e, 0xa5, 0xcc, 0xa9, 0x49, 0x81, 0x77, 0xd5, 0x46, 0x8d, 0x3d, - 0x47, 0x2e, 0x7d, 0x90, 0x79, 0x5b, 0xab, 0x9c, 0xb2, 0x38, 0x1f, 0x09, - 0x3b, 0x22, 0x10, 0x98, 0x52, 0x02, 0x15, 0xd1, 0xd2, 0x9b, 0xfd, 0x1e, - 0x9b, 0x84, 0x38, 0xbf, 0x15, 0x97, 0x58, 0x2b, 0xa7, 0xd4, 0xc4, 0x6c, - 0x62, 0xb3, 0x46, 0x0b, 0x48, 0x58, 0x6c, 0x89, 0x7c, 0xe3, 0x4c, 0xbd, - 0x82, 0xe4, 0xb1, 0xce, 0x37, 0x34, 0xf1, 0x41, 0x58, 0x69, 0xba, 0x9d, - 0x99, 0x49, 0x08, 0x16, 0x67, 0x7c, 0xc0, 0x8a, 0xbb, 0x0a, 0x66, 0x3e, - 0x81, 0x06, 0xcb, 0x3a, 0x34, 0x1e, 0x0a, 0x46, 0x10, 0x96, 0xdf, 0x8e, - 0xcd, 0x39, 0x60, 0x63, 0x4e, 0xe8, 0x92, 0x0a, 0xce, 0xb2, 0x12, 0xe1, - 0xa7, 0x73, 0x27, 0x11, 0x22, 0x32, 0x16, 0xaa, 0xcc, 0x6b, 0xb4, 0xf7, - 0x28, 0x60, 0x72, 0x59, 0x93, 0x28, 0xf5, 0x81, 0x00, 0x9e, 0x50, 0x41, - 0x16, 0x67, 0x9e, 0xce, 0x73, 0x78, 0x1b, 0x72, 0x73, 0xad, 0x25, 0xab, - 0xbc, 0x4d, 0x41, 0x43, 0xcc, 0x67, 0x96, 0x3e, 0xfd, 0x67, 0x8d, 0x5a, - 0xd2, 0x66, 0x0c, 0x66, 0xa9, 0xd6, 0x72, 0xab, 0x7d, 0x73, 0xb3, 0xa8, - 0xc9, 0xf7, 0xde, 0x51, 0x76, 0xc4, 0x3b, 0xc6, 0xb5, 0x91, 0xa8, 0x71, - 0x9a, 0xa1, 0x6e, 0xea, 0x84, 0x93, 0x25, 0x60, 0x84, 0x48, 0x08, 0x43, - 0x86, 0x9c, 0x58, 0xcc, 0xb0, 0xe0, 0xbb, 0x15, 0xe1, 0xad, 0x31, 0x62, - 0x6f, 0x24, 0xc1, 0xbb, 0x7d, 0x26, 0x89, 0xb4, 0xc5, 0xc9, 0x68, 0xe3, - 0x4a, 0x49, 0x32, 0xc6, 0x55, 0xd3, 0x77, 0x18, 0x0a, 0x9c, 0xce, 0x4d, - 0x2a, 0x3b, 0xc7, 0x6c, 0x4b, 0xd9, 0x06, 0xa7, 0x00, 0xc8, 0x5b, 0x05, - 0x4d, 0x73, 0x5a, 0x0e, 0xba, 0x06, 0x00, 0xad, 0x74, 0xa5, 0x38, 0xba, - 0xe9, 0x35, 0xa9, 0x6e, 0xe4, 0x1c, 0x7b, 0x27, 0xec, 0x8d, 0x4c, 0xd7, - 0xe9, 0xef, 0x77, 0x3a, 0xb7, 0xb9, 0xf2, 0x79, 0xec, 0x8b, 0xf7, 0xda, - 0x3e, 0x16, 0x6e, 0x22, 0x82, 0xf4, 0x8d, 0x10, 0x8a, 0x67, 0xa9, 0x81, - 0x04, 0x37, 0xd0, 0xa3, 0x78, 0x71, 0x6a, 0xe1, 0x08, 0xbe, 0x66, 0xbe, - 0x58, 0xa5, 0x61, 0xa1, 0xf0, 0x11, 0xdc, 0x24, 0x40, 0xb1, 0xfb, 0x3f, - 0x5e, 0x33, 0xe5, 0xd6, 0x97, 0xea, 0x57, 0x0e, 0x08, 0xd2, 0xe9, 0x90, - 0xf6, 0xce, 0x7d, 0x52, 0x4f, 0xd9, 0x8c, 0xec, 0x68, 0x2e, 0xdf, 0xe8, - 0x0e, 0x81, 0x64, 0x71, 0x25, 0x1c, 0x8b, 0x24, 0x4e, 0x2d, 0x7a, 0x46, - 0xb0, 0xa3, 0x04, 0xcb, 0xb2, 0x65, 0x0a, 0x9b, 0xd7, 0xf7, 0xc3, 0x34, - 0x1a, 0xb5, 0x8a, 0xf3, 0x3e, 0x7c, 0x93, 0x37, 0xaf, 0xaf, 0x70, 0x5c, - 0xd8, 0xa6, 0x27, 0x5b, 0x33, 0x7f, 0xa3, 0x02, 0xa5, 0x90, 0xd0, 0x5a, - 0xef, 0x92, 0xf7, 0x57, 0x37, 0x15, 0x17, 0x9a, 0x71, 0x22, 0x84, 0xd2, - 0x98, 0xb4, 0xfc, 0xec, 0xb6, 0x1a, 0x0c, 0xf4, 0x25, 0xe0, 0x68, 0xc7, - 0x25, 0xb8, 0xc5, 0xa8, 0x36, 0xfc, 0x0a, 0x54, 0x19, 0xfa, 0xee, 0x1b, - 0x6c, 0x7e, 0x97, 0x48, 0xe5, 0xa9, 0xe7, 0x01, 0x75, 0xff, 0x69, 0x33, - 0xe8, 0xea, 0xf2, 0x5b, 0x9d, 0xbe, 0x3e, 0x5c, 0xb7, 0xeb, 0x34, 0x9b, - 0xc3, 0xb0, 0x92, 0x0e, 0x85, 0x74, 0x98, 0x00, 0x58, 0x80, 0x92, 0x80, - 0x31, 0xcb, 0x3c, 0x63, 0x48, 0xd5, 0xa5, 0x9b, 0xb0, 0x46, 0x4e, 0x26, - 0x24, 0x3d, 0x92, 0x2b, 0x0c, 0x09, 0xa4, 0x02, 0x04, 0x37, 0x38, 0x6c, - 0x85, 0x65, 0x50, 0xc7, 0xe0, 0xd1, 0x1e, 0x87, 0x2d, 0x65, 0x93, 0x04, - 0x02, 0xa6, 0x8a, 0x40, 0xd7, 0xe3, 0x48, 0xd6, 0xc7, 0x3f, 0x8b, 0xed, - 0xa6, 0x77, 0xa0, 0x20, 0x65, 0x65, 0x16, 0xfb, 0x4d, 0x38, 0xce, 0xa3, - 0x75, 0x2b, 0x95, 0x3e, 0x9e, 0x49, 0xd2, 0xf7, 0x9e, 0x5e, 0x2e, 0x73, - 0xf6, 0xbb, 0xda, 0xfc, 0xcb, 0xad, 0x79, 0xff, 0x76, 0x1a, 0xbf, 0x3c, - 0x8f, 0x69, 0xd4, 0x71, 0x94, 0xde, 0x4b, 0x9a, 0x22, 0x30, 0x24, 0x40, - 0x92, 0x44, 0xc2, 0xc5, 0x80, 0x1d, 0x0f, 0x9b, 0x04, 0x9c, 0xfb, 0x45, - 0x98, 0x9d, 0xe6, 0xb2, 0x28, 0x62, 0x90, 0xa9, 0xb5, 0x82, 0x2c, 0x61, - 0x78, 0x17, 0x33, 0xfe, 0xe7, 0xfa, 0x61, 0x29, 0x83, 0x60, 0xc4, 0x1e, - 0xce, 0x67, 0x33, 0xd6, 0x16, 0xb0, 0x9a, 0xee, 0xb4, 0x83, 0x98, 0x95, - 0xd1, 0xef, 0xe9, 0x85, 0x9c, 0x9d, 0x96, 0x0c, 0xf6, 0x06, 0xce, 0x0d, - 0xd9, 0x93, 0x59, 0x9c, 0xa3, 0xb2, 0x53, 0x07, 0xd8, 0xc9, 0x3c, 0x50, - 0x9f, 0x2f, 0xef, 0x0f, 0xc5, 0xd8, 0x68, 0x2d, 0x98, 0xdb, 0x76, 0x1d, - 0x74, 0x76, 0x6a, 0x61, 0x27, 0x1f, 0x12, 0x50, 0xa8, 0xb9, 0xc8, 0xca, - 0xbc, 0x86, 0x1d, 0xca, 0xa0, 0xfd, 0x83, 0xbc, 0xff, 0x25, 0x8a, 0x30, - 0xe8, 0x6c, 0x9a, 0x08, 0xda, 0xf5, 0x37, 0x60, 0xee, 0x23, 0xcc, 0x85, - 0x64, 0xc0, 0xb2, 0x7d, 0x72, 0x2d, 0xed, 0xed, 0xc4, 0xae, 0x2a, 0x83, - 0x27, 0x63, 0xeb, 0xfe, 0x72, 0x16, 0xf5, 0x7e, 0x46, 0xfa, 0x27, 0x7c, - 0x8e, 0x4c, 0x73, 0xa3, 0x52, 0x5b, 0xdd, 0xa1, 0x32, 0x1b, 0xc7, 0xb9, - 0x44, 0x38, 0x85, 0x71, 0xd4, 0x98, 0xed, 0x2b, 0x1f, 0xa6, 0x88, 0x35, - 0x25, 0x8f, 0x33, 0x89, 0x7e, 0x88, 0x1b, 0xd6, 0x64, 0xc9, 0xac, 0x71, - 0x40, 0x07, 0x37, 0x5a, 0x13, 0xfb, 0x37, 0x76, 0x5f, 0x09, 0x05, 0xd5, - 0x59, 0x43, 0xb8, 0x74, 0x10, 0xd4, 0xfd, 0xd6, 0x3b, 0x09, 0xb6, 0x4a, - 0xc4, 0xc5, 0x8d, 0x93, 0x26, 0x4d, 0x4f, 0xfd, 0x28, 0x6c, 0x31, 0x6d, - 0x52, 0x92, 0x7b, 0x96, 0x7c, 0x62, 0x77, 0x64, 0x5c, 0x88, 0x72, 0xa8, - 0x4b, 0xd5, 0xde, 0x93, 0xaa, 0x44, 0x46, 0xbb, 0xdc, 0xe8, 0x8c, 0xbc, - 0x5e, 0xbc, 0xd0, 0x32, 0x64, 0x9e, 0xc7, 0xb8, 0x2f, 0x3e, 0x6e, 0xcd, - 0x5c, 0x9a, 0xf7, 0x58, 0x02, 0x65, 0x0d, 0xd6, 0xdd, 0x45, 0x64, 0xbf, - 0x65, 0xea, 0xf3, 0x7f, 0x14, 0x25, 0x01, 0x62, 0xeb, 0x64, 0xb4, 0x73, - 0x0c, 0x1a, 0x74, 0xaa, 0x9b, 0x37, 0x9a, 0xa9, 0x02, 0xcc, 0xba, 0x8e, - 0xf2, 0xf3, 0x5f, 0xa6, 0x2f, 0x91, 0xf4, 0x3c, 0x6a, 0xab, 0x6b, 0xc3, - 0x85, 0xd2, 0x02, 0xd3, 0x91, 0xbb, 0x60, 0x28, 0x85, 0x34, 0x05, 0x6b, - 0x8b, 0x26, 0x67, 0x10, 0x8c, 0x7f, 0xfe, 0xd9, 0xad, 0xa3, 0xf4, 0xce, - 0xd2, 0xd9, 0x1e, 0x79, 0x9a, 0xd7, 0x7e, 0xae, 0x3b, 0xb3, 0x0c, 0xea, - 0xfc, 0xc5, 0x59, 0x90, 0x54, 0xad, 0xc1, 0x84, 0x78, 0xac, 0x3f, 0x05, - 0xbb, 0x6d, 0x24, 0x7e, 0x2a, 0xdb, 0x91, 0x81, 0xdc, 0xc8, 0x34, 0xc0, - 0xbe, 0x34, 0x63, 0xa8, 0x70, 0xab, 0x9d, 0xb1, 0x3e, 0xb6, 0x52, 0x0b, - 0x32, 0x1c, 0x2a, 0x2c, 0x52, 0x18, 0xa9, 0xcb, 0x17, 0xe4, 0x57, 0xa0, - 0x82, 0x22, 0x9b, 0x9d, 0xe0, 0xb7, 0xd6, 0x9e, 0x28, 0xcc, 0x49, 0x67, - 0x0c, 0x6d, 0x2e, 0x6e, 0xc4, 0x4e, 0x2a, 0x83, 0x27, 0x63, 0xeb, 0xfe, - 0x72, 0x16, 0xf5, 0x7e, 0x47, 0x62, 0x27, 0x7c, 0x77, 0x4f, 0xff, 0xbb, - 0xe7, 0xfb, 0xbb, 0x6c, 0x80, 0x13, 0x5c, 0xb2, 0x5d, 0xca, 0xd4, 0xad, - 0xac, 0x0d, 0x87, 0x1f, 0x81, 0xd8, 0xde, 0x57, 0x60, 0x41, 0x2f, 0x09, - 0xeb, 0x0e, 0x57, 0x9a, 0xb2, 0x9d, 0xfc, 0x03, 0xc7, 0x84, 0xab, 0xac, - 0xe5, 0x08, 0xfc, 0x19, 0x3d, 0x69, 0x4f, 0x48, 0x93, 0x89, 0x8f, 0x55, - 0x3c, 0x37, 0x9b, 0x0d, 0x6b, 0x35, 0x07, 0x8a, 0xe7, 0xe6, 0x34, 0xf2, - 0x20, 0x8e, 0x4e, 0x0e, 0x4f, 0xfc, 0xc1, 0xed, 0xd9, 0x6e, 0xcc, 0xfe, - 0xb5, 0x47, 0x03, 0xe7, 0xb8, 0xf0, 0x40, 0x4c, 0x0a, 0x41, 0x3a, 0x1a, - 0xcd, 0x40, 0x81, 0x74, 0xf1, 0xd6, 0xac, 0x5b, 0x50, 0xca, 0xfb, 0xd4, - 0x78, 0x63, 0x8c, 0xcd, 0xd1, 0xae, 0xae, 0xb9, 0x8a, 0x8e, 0x2c, 0x9d, - 0x4c, 0x03, 0x31, 0xdf, 0xd5, 0x1d, 0x33, 0x86, 0x4a, 0x83, 0x35, 0x39, - 0xa3, 0x52, 0x6c, 0x38, 0xb1, 0xa8, 0x32, 0xeb, 0xd3, 0xd6, 0x68, 0xac, - 0xb5, 0x7d, 0xcc, 0x86, 0x29, 0xb9, 0xd0, 0xe6, 0xb0, 0xda, 0x18, 0x03, - 0xd2, 0x00, 0xb7, 0xc6, 0x15, 0x80, 0x26, 0xa5, 0xee, 0x6a, 0xf5, 0x53, - 0x27, 0xe1, 0x07, 0x90, 0xc6, 0x4d, 0x0e, 0xbd, 0xf0, 0xbb, 0x0c, 0x17, - 0xf2, 0xa4, 0x17, 0xea, 0xc4, 0xd7, 0x78, 0x0d, 0x85, 0xaf, 0xf7, 0x9b, - 0xb6, 0x1a, 0xdc, 0x6c, 0x1a, 0xce, 0xf5, 0xe5, 0x35, 0x79, 0x63, 0x06, - 0x03, 0xf4, 0x63, 0xaf, 0x9f, 0x8b, 0x9a, 0x6b, 0x7a, 0xa5, 0x8a, 0xf3, - 0x65, 0xc7, 0x28, 0x3a, 0x12, 0x89, 0x72, 0x9d, 0x14, 0xc9, 0x29, 0x9a, - 0xb9, 0x86, 0x0e, 0x82, 0xac, 0x33, 0x18, 0x78, 0x43, 0x88, 0x12, 0x6b, - 0x7b, 0x60, 0x99, 0x34, 0x22, 0xc2, 0xd9, 0x89, 0x56, 0xe7, 0xb2, 0x07, - 0x19, 0xbd, 0x91, 0x1e, 0xc3, 0x69, 0xfd, 0x55, 0xa1, 0xb8, 0xa6, 0xf8, - 0xab, 0x19, 0x83, 0x61, 0x2a, 0xe1, 0x0b, 0x23, 0xd1, 0xf0, 0xa9, 0x8d, - 0x3a, 0xd4, 0x3f, 0x10, 0x6c, 0xe3, 0x24, 0x4e, 0x12, 0x05, 0x4c, 0x22, - 0xa1, 0x64, 0x12, 0xbd, 0x6f, 0x13, 0x21, 0xb6, 0x68, 0xb4, 0x3b, 0xa9, - 0x6b, 0x60, 0x69, 0xaf, 0x8f, 0x8f, 0xa6, 0xd1, 0xf2, 0x52, 0x43, 0xf8, - 0x47, 0xcd, 0x91, 0xef, 0xc7, 0x18, 0x25, 0x76, 0x78, 0xdb, 0x27, 0x2c, - 0x8a, 0x3b, 0xd7, 0x30, 0x8d, 0x5e, 0xc3, 0x04, 0xc0, 0x89, 0x82, 0x98, - 0x8f, 0x62, 0x8c, 0xc6, 0xa2, 0x24, 0x99, 0xce, 0xe4, 0x7b, 0x9d, 0x6f, - 0x6e, 0xea, 0x6c, 0x88, 0xda, 0xda, 0xd8, 0xa9, 0xe4, 0x5b, 0xf3, 0x3e, - 0xc4, 0xb3, 0xef, 0x22, 0x41, 0xb3, 0x6b, 0xbe, 0x3a, 0xf0, 0x56, 0x81, - 0x3e, 0xf1, 0x51, 0xe2, 0x53, 0x21, 0xc7, 0x7f, 0x8f, 0xae, 0xa1, 0x48, - 0xcd, 0x71, 0xcf, 0x1f, 0x6c, 0xad, 0xa3, 0x4d, 0x80, 0x55, 0x90, 0xd9, - 0x7a, 0xa1, 0x8e, 0x35, 0xfd, 0xd1, 0x22, 0xf3, 0x1f, 0x21, 0x9d, 0x35, - 0x3f, 0x7f, 0x26, 0x56, 0x33, 0x39, 0x65, 0xa3, 0x29, 0xbd, 0x24, 0xf0, - 0x8b, 0x04, 0x93, 0x6c, 0x4a, 0xcb, 0x14, 0xa1, 0x7d, 0x0a, 0xc6, 0x47, - 0x2e, 0x07, 0x9a, 0xc2, 0x0c, 0x5d, 0x95, 0xca, 0xb9, 0x6c, 0x9d, 0xa5, - 0x4e, 0x0c, 0x88, 0x36, 0x6c, 0x90, 0x00, 0x45, 0xd6, 0x9b, 0x99, 0x3d, - 0xd8, 0x54, 0xa3, 0x62, 0x89, 0xdd, 0x43, 0x98, 0x31, 0xd6, 0xad, 0x9a, - 0xd6, 0x04, 0x82, 0x90, 0xb9, 0x24, 0xb7, 0xf3, 0x2d, 0x8c, 0xb1, 0x16, - 0xfd, 0x5b, 0xf4, 0x67, 0x62, 0xae, 0x2e, 0xc1, 0x1a, 0x02, 0x82, 0x92, - 0x14, 0x54, 0x74, 0x15, 0x8f, 0xfd, 0x13, 0x8e, 0x03, 0x06, 0x73, 0x1b, - 0xe7, 0xa2, 0x72, 0x33, 0xcd, 0xb7, 0xc8, 0xe5, 0x47, 0x23, 0x2f, 0x81, - 0xe8, 0xcb, 0xb2, 0xf3, 0xd4, 0xae, 0x06, 0x14, 0x19, 0x44, 0x4b, 0x34, - 0x55, 0xa5, 0x6d, 0x5b, 0x2c, 0x8a, 0xd0, 0x02, 0xfa, 0x5f, 0x5a, 0xd4, - 0x4e, 0xc4, 0x55, 0x1b, 0x05, 0xa5, 0x02, 0x75, 0xe5, 0x2f, 0xe8, 0x19, - 0x76, 0xdc, 0x21, 0xfb, 0xf9, 0x13, 0x23, 0x5a, 0xd5, 0xc1, 0xe9, 0xad, - 0x22, 0x76, 0xc3, 0x31, 0x7c, 0xca, 0xeb, 0xd8, 0x45, 0x72, 0x94, 0xe8, - 0xf6, 0xf1, 0xc2, 0xe2, 0xc0, 0x71, 0x43, 0x7a, 0xce, 0x18, 0x73, 0x85, - 0x77, 0xd8, 0xc6, 0x68, 0xe6, 0x1a, 0xa6, 0xc3, 0x24, 0xb7, 0xe2, 0x94, - 0x9a, 0x6d, 0x0c, 0xdf, 0x35, 0xd2, 0xba, 0x7c, 0x87, 0x00, 0x53, 0xcc, - 0xa9, 0xe4, 0x59, 0x48, 0x34, 0x1c, 0xde, 0x26, 0xe8, 0xd4, 0xc2, 0x66, - 0xd0, 0x23, 0xac, 0x39, 0x7a, 0xb3, 0x7a, 0x4c, 0xb0, 0xe0, 0xca, 0xa5, - 0x20, 0x17, 0x43, 0x99, 0x93, 0xbd, 0x7e, 0x1a, 0x61, 0x87, 0x88, 0xc6, - 0xa4, 0x2e, 0x80, 0x51, 0x3f, 0xa5, 0x1a, 0xa5, 0x21, 0xc2, 0xe3, 0xbe, - 0x6d, 0x26, 0x01, 0xb7, 0x2a, 0xd0, 0xd4, 0xa8, 0xf5, 0x22, 0x10, 0x9e, - 0x81, 0xd0, 0x77, 0xe5, 0x1b, 0x1a, 0xb0, 0x71, 0x44, 0x74, 0x9d, 0xe2, - 0x2f, 0x2a, 0xf8, 0xa8, 0x97, 0xd4, 0x9b, 0x0c, 0xc8, 0x66, 0x09, 0xac, - 0x36, 0x18, 0x4d, 0xd0, 0x1b, 0x5d, 0x3c, 0xb0, 0x82, 0xaa, 0x1f, 0xbf, - 0xa8, 0x56, 0x05, 0xd6, 0xf1, 0x25, 0x30, 0x3a, 0x28, 0xa8, 0x4a, 0xce, - 0x26, 0xa5, 0x2c, 0xe7, 0xa4, 0xb6, 0x02, 0x50, 0xf9, 0x76, 0xad, 0x2f, - 0x5a, 0xc3, 0x46, 0x3f, 0x6f, 0x8b, 0x6d, 0x41, 0xc7, 0xb2, 0x06, 0x62, - 0x2e, 0x6d, 0x88, 0x28, 0xbf, 0x6d, 0x5a, 0x47, 0x44, 0xa3, 0xfe, 0xb4, - 0x9e, 0x9c, 0x2f, 0xbe, 0x10, 0x6c, 0x86, 0xe9, 0x93, 0x53, 0xb3, 0x3e, - 0x36, 0xa9, 0x04, 0xb6, 0xda, 0xda, 0xab, 0xb6, 0x78, 0xa5, 0x04, 0x1a, - 0xe2, 0xd7, 0x09, 0xf8, 0xe1, 0xb3, 0x39, 0x08, 0xf3, 0x66, 0x9d, 0xd2, - 0xfe, 0xfa, 0x14, 0xbe, 0x98, 0x05, 0x04, 0xae, 0x89, 0x28, 0xcb, 0x44, - 0x36, 0x0e, 0xb6, 0x2e, 0xb6, 0x7c, 0x66, 0xca, 0x6b, 0xf7, 0x61, 0x47, - 0xc8, 0x8f, 0x8c, 0xf5, 0xc7, 0x12, 0x54, 0xe8, 0xc5, 0x68, 0x9f, 0xba, - 0xc2, 0xd0, 0x52, 0xd7, 0x5d, 0xe6, 0xb8, 0xf9, 0x68, 0x20, 0xa2, 0xe9, - 0xae, 0x45, 0x41, 0x17, 0x48, 0x43, 0x59, 0x0c, 0xcd, 0xb5, 0xb7, 0x34, - 0xd5, 0xb5, 0x73, 0x10, 0x05, 0x8d, 0xf9, 0xa7, 0x26, 0x7d, 0x6a, 0x17, - 0x50, 0x2d, 0xa4, 0x20, 0xb7, 0x0e, 0xf5, 0xa9, 0x80, 0x6f, 0x68, 0xe4, - 0x59, 0xe1, 0x63, 0xa4, 0xe5, 0x93, 0xbd, 0x88, 0xd1, 0x93, 0xe0, 0xd4, - 0x47, 0x02, 0x7a, 0x82, 0x8d, 0x48, 0x5e, 0x83, 0x35, 0x88, 0x42, 0x53, - 0x08, 0x9f, 0x81, 0x72, 0xfc, 0xc8, 0xbd, 0xbb, 0x4b, 0x3b, 0x12, 0x2a, - 0x5b, 0x17, 0x88, 0x6b, 0x78, 0xec, 0x9f, 0x04, 0x6f, 0x29, 0x44, 0x06, - 0x1b, 0x96, 0x0f, 0x5c, 0x65, 0xe9, 0x94, 0x7e, 0x77, 0x96, 0x01, 0x34, - 0x21, 0x29, 0xe6, 0xe0, 0xcf, 0xc6, 0x47, 0x15, 0xd1, 0x7c, 0xed, 0x98, - 0x43, 0x20, 0x39, 0xc9, 0x0f, 0x96, 0x10, 0xf4, 0x45, 0xb1, 0xbb, 0xd5, - 0x23, 0x96, 0x63, 0x10, 0x50, 0x42, 0x65, 0xed, 0x55, 0xc8, 0xa2, 0x94, - 0x60, 0xe6, 0x43, 0xb5, 0xdf, 0xc1, 0xa0, 0x93, 0xf4, 0x67, 0x3f, 0x9c, - 0xca, 0x43, 0xf7, 0x36, 0x28, 0x90, 0x29, 0xa6, 0xa8, 0xf0, 0xe3, 0x3d, - 0x2e, 0xac, 0x14, 0xcb, 0x96, 0x44, 0xa0, 0x65, 0x29, 0x9e, 0xdd, 0xec, - 0x77, 0xa7, 0x91, 0x6f, 0x82, 0xfb, 0xd3, 0x24, 0xb5, 0xb3, 0x05, 0xf1, - 0x43, 0xf9, 0xc2, 0xef, 0x8f, 0x26, 0x07, 0xa6, 0x95, 0x4b, 0xae, 0x1f, - 0xab, 0xb3, 0xab, 0x0d, 0x41, 0x9c, 0xf2, 0x97, 0x8f, 0x8a, 0x9f, 0xcb, - 0x9f, 0x05, 0x8f, 0x9e, 0x09, 0x44, 0xfe, 0x0f, 0x05, 0xc2, 0xf3, 0x61, - 0xab, 0x63, 0xc7, 0x5d, 0xd9, 0x9d, 0x72, 0x1d, 0xc2, 0x3a, 0xf5, 0xa8, - 0xbd, 0x7a, 0xb4, 0xc0, 0xd5, 0x12, 0xe5, 0x99, 0x6e, 0x00, 0xde, 0xd3, - 0xe2, 0x4e, 0x06, 0x41, 0x4b, 0x8e, 0xd2, 0x0b, 0x48, 0xcd, 0x6d, 0x00, - 0xfe, 0x53, 0x2e, 0xaa, 0x20, 0x4d, 0x9b, 0x7f, 0xeb, 0xe5, 0x11, 0xb8, - 0x83, 0x4b, 0x15, 0x29, 0xce, 0xaa, 0x31, 0x0b, 0x08, 0x12, 0x99, 0xcb, - 0x2d, 0x57, 0xfc, 0xeb, 0x64, 0xfe, 0x4c, 0x54, 0x20, 0x08, 0x64, 0xfc, - 0x34, 0xe7, 0xdc, 0x9d, 0x34, 0x9d, 0x12, 0xbe, 0x50, 0x40, 0xaf, 0x7e, - 0x9d, 0x8e, 0x8b, 0xc4, 0x99, 0x12, 0x30, 0x82, 0x0a, 0x38, 0x64, 0x38, - 0x37, 0x4b, 0xcf, 0xd2, 0x70, 0xee, 0xef, 0x34, 0xdb, 0x44, 0x77, 0x6a, - 0xdd, 0x2e, 0x00, 0xbe, 0x17, 0xe6, 0xd9, 0x39, 0x4e, 0x44, 0xe2, 0x5b, - 0x42, 0x8d, 0x8a, 0x2f, 0xeb, 0xc9, 0x07, 0x83, 0x35, 0x65, 0x1e, 0xdb, - 0xc5, 0x1c, 0xb1, 0x2f, 0xf3, 0x61, 0x64, 0xee, 0xe1, 0xd7, 0xbe, 0x90, - 0x30, 0x0e, 0x24, 0x9e, 0x63, 0x35, 0xd5, 0x0f, 0x87, 0xc8, 0x76, 0xbd, - 0x6c, 0x32, 0xfe, 0x41, 0x21, 0xce, 0x3f, 0xf2, 0x60, 0x64, 0x7e, 0x52, - 0x6a, 0x45, 0x02, 0x24, 0xf3, 0x1a, 0x90, 0x27, 0x5b, 0x4c, 0xeb, 0x15, - 0x51, 0x0f, 0xdf, 0x70, 0x15, 0x3b, 0x66, 0x3f, 0x44, 0x3f, 0xc6, 0x55, - 0xfb, 0x36, 0xc2, 0x84, 0x84, 0x9b, 0x9f, 0xef, 0x70, 0x3b, 0xc4, 0x3b, - 0x04, 0x37, 0x9f, 0x19, 0xb9, 0x33, 0xae, 0xe4, 0x26, 0x8c, 0xcf, 0xaf, - 0xcc, 0x7a, 0x16, 0x89, 0x95, 0x37, 0xcf, 0x44, 0x41, 0x8a, 0x1d, 0xdc, - 0xe6, 0xdc, 0x4c, 0x32, 0x7d, 0x2d, 0xf5, 0x93, 0x42, 0xfb, 0xf5, 0xf1, - 0x41, 0x12, 0xd0, 0x28, 0x32, 0x1d, 0x6b, 0xf4, 0xcb, 0xa0, 0xba, 0x0e, - 0xff, 0x29, 0x29, 0x80, 0x9e, 0x7d, 0xf4, 0x0f, 0xa3, 0xd1, 0xaa, 0x73, - 0xaf, 0x35, 0x9a, 0xae, 0xea, 0x46, 0x83, 0xd0, 0xa3, 0xa2, 0x53, 0x1f, - 0x71, 0x97, 0xee, 0xd0, 0xc7, 0x94, 0xe7, 0x2b, 0x53, 0x44, 0x40, 0x96, - 0xaa, 0x30, 0x8d, 0x2f, 0x86, 0xbf, 0x0b, 0xe5, 0xa6, 0x6f, 0x76, 0xa0, - 0xd8, 0x70, 0xa7, 0x63, 0xf3, 0xde, 0xd8, 0xe1, 0x7b, 0x17, 0x32, 0x4e, - 0xf2, 0xe0, 0x9b, 0x5a, 0x25, 0x8b, 0x9b, 0xc6, 0x78, 0x35, 0x3b, 0xfd, - 0x02, 0xbb, 0xe6, 0xfb, 0x38, 0x93, 0x86, 0x1b, 0x47, 0xfa, 0xce, 0x83, - 0x3b, 0xd4, 0xfd, 0xa1, 0x39, 0xef, 0xfa, 0x36, 0x41, 0x80, 0xa7, 0x38, - 0x07, 0x57, 0x7e, 0xa2, 0x1c, 0x87, 0xe5, 0xfa, 0xb8, 0xc1, 0x0d, 0xfb, - 0x0a, 0xb9, 0x93, 0xde, 0x4e, 0xf8, 0x3a, 0xe8, 0x5b, 0xf5, 0xec, 0x4a, - 0x00, 0xe5, 0x4c, 0x4f, 0x74, 0xb5, 0x4e, 0xdf, 0x91, 0xc6, 0xe3, 0x16, - 0x34, 0x2b, 0x4a, 0x30, 0x9e, 0xbc, 0x61, 0xa0, 0xdf, 0x95, 0x0f, 0x8b, - 0x45, 0x15, 0xa6, 0xa7, 0x32, 0x0a, 0x17, 0xbd, 0xfd, 0xfc, 0x70, 0x18, - 0xfd, 0x17, 0xcc, 0x2f, 0x7e, 0xef, 0xe3, 0xac, 0x8c, 0xca, 0xef, 0x07, - 0x75, 0x8b, 0xc1, 0xfa, 0x04, 0x8d, 0x9d, 0x69, 0x6b, 0xa2, 0x68, 0x8d, - 0x93, 0xfc, 0xc9, 0xc3, 0xef, 0xf9, 0x1b, 0x5e, 0x73, 0xa1, 0xaf, 0x32, - 0x51, 0x40, 0x84, 0x5d, 0x5a, 0x05, 0xe3, 0x3f, 0xa0, 0x7d, 0x28, 0x8e, - 0x95, 0xe7, 0xee, 0xd6, 0x13, 0x1f, 0xbd, 0xb7, 0x54, 0x42, 0x3d, 0x7c, - 0x3c, 0x52, 0x09, 0x5b, 0x79, 0xf3, 0x6b, 0x0b, 0x2e, 0x2d, 0xba, 0x5b, - 0x34, 0x4b, 0x31, 0x65, 0x51, 0x4d, 0x32, 0x3b, 0x8a, 0x4d, 0xa8, 0x8f, - 0x26, 0x26, 0x45, 0x28, 0x15, 0x6b, 0xea, 0x82, 0xf7, 0xb4, 0x9c, 0xa0, - 0x0d, 0x95, 0x29, 0xfc, 0x8d, 0xf0, 0x3b, 0xe1, 0x53, 0x65, 0x97, 0xc1, - 0xed, 0x18, 0xd7, 0x7f, 0x81, 0xe6, 0x0d, 0xc2, 0x19, 0x96, 0x1f, 0x89, - 0xd5, 0xf3, 0x8f, 0xd6, 0x09, 0x1a, 0xf8, 0x71, 0x89, 0xf3, 0xb0, 0xb8, - 0xdc, 0x24, 0xa4, 0xb4, 0x96, 0xd4, 0x6e, 0x56, 0xd4, 0xd1, 0x60, 0x73, - 0xb8, 0x39, 0x7a, 0x24, 0x6a, 0x47, 0xa9, 0x88, 0xcb, 0xc3, 0x98, 0x1e, - 0x98, 0x94, 0xcf, 0xf0, 0x89, 0x02, 0x80, 0x48, 0x15, 0x04, 0xde, 0x06, - 0x6c, 0xdf, 0xdb, 0xa8, 0x84, 0xfe, 0x7a, 0x4f, 0x52, 0x54, 0x66, 0xd4, - 0x94, 0x21, 0xab, 0x8c, 0x98, 0xf1, 0x90, 0xd0, 0x73, 0x91, 0xa2, 0x37, - 0xd3, 0x32, 0x33, 0xae, 0xa6, 0x33, 0x9d, 0x25, 0x05, 0x44, 0x6f, 0xc7, - 0x7a, 0x5a, 0xc2, 0xc6, 0xd8, 0x82, 0xcd, 0xfd, 0x0a, 0xf6, 0x65, 0xce, - 0x62, 0x6c, 0xf0, 0x69, 0xf0, 0xc7, 0x5f, 0x90, 0x89, 0x8c, 0x8e, 0x0a, - 0x96, 0x34, 0x00, 0xf8, 0xd3, 0xf4, 0x5f, 0xb3, 0x4a, 0x0d, 0xd4, 0xef, - 0x07, 0xb0, 0xd0, 0x4e, 0x36, 0xb1, 0x61, 0x43, 0x15, 0xb6, 0xb3, 0x62, - 0x09, 0xc9, 0xc2, 0xb8, 0x10, 0x92, 0x56, 0xbf, 0x1f, 0x0a, 0xe1, 0xef, - 0x08, 0x4a, 0x78, 0x3c, 0x04, 0x4f, 0x6e, 0xb8, 0x2f, 0x50, 0xc5, 0x09, - 0x38, 0xfb, 0x11, 0x9c, 0x56, 0x6b, 0xdb, 0xf8, 0x33, 0x67, 0x75, 0xf3, - 0x78, 0xb7, 0x57, 0x83, 0x38, 0x8d, 0xd1, 0xbf, 0x43, 0xd5, 0x85, 0x58, - 0xa9, 0x1b, 0x56, 0x53, 0x11, 0x81, 0x6f, 0x92, 0x91, 0xb9, 0x66, 0xab, - 0x7a, 0xcd, 0x7e, 0xeb, 0xdb, 0x72, 0x1a, 0x33, 0x4b, 0x60, 0x16, 0x07, - 0xc8, 0x29, 0x21, 0xe0, 0xad, 0x56, 0xdb, 0xfd, 0x50, 0xd7, 0x52, 0x22, - 0x4d, 0x9e, 0x4f, 0xff, 0x9d, 0x25, 0x45, 0xbe, 0x00, 0xb6, 0xd2, 0x46, - 0x0e, 0xaa, 0x53, 0x4f, 0x27, 0x3d, 0x37, 0xff, 0xb9, 0x59, 0x33, 0x5d, - 0x58, 0x32, 0x39, 0xff, 0x75, 0xbc, 0xe0, 0x43, 0xf9, 0x47, 0xd8, 0x11, - 0x61, 0xe3, 0x7e, 0x9c, 0xab, 0x9a, 0x76, 0x09, 0x70, 0x35, 0xc3, 0x8a, - 0x97, 0x4a, 0x08, 0x42, 0xa6, 0xb7, 0x96, 0xd7, 0x6c, 0xa8, 0x02, 0xed, - 0xf2, 0xb4, 0x07, 0xc6, 0xd7, 0x88, 0xb9, 0x22, 0xe4, 0xe8, 0x05, 0x7a, - 0xa4, 0x3e, 0x56, 0x3b, 0x58, 0x06, 0xb4, 0xe8, 0x49, 0x3f, 0x9b, 0xa7, - 0xa3, 0x45, 0xaa, 0x34, 0x74, 0x17, 0x34, 0x34, 0x03, 0xc5, 0xfd, 0x58, - 0x41, 0x61, 0xc3, 0x9e, 0x11, 0xa4, 0x0e, 0xd4, 0x41, 0xfd, 0xc0, 0x8f, - 0x1f, 0xd0, 0xc4, 0x4f, 0x13, 0x82, 0x7c, 0x4b, 0x49, 0x7a, 0xda, 0xbe, - 0x07, 0x30, 0xb1, 0x97, 0x50, 0xea, 0x8f, 0x59, 0x71, 0xf3, 0x93, 0x8f, - 0xc6, 0x63, 0x81, 0xac, 0x50, 0x89, 0x74, 0x8d, 0x3b, 0xbf, 0x7b, 0xe4, - 0xa1, 0xb3, 0x6b, 0x8d, 0xef, 0xb2, 0x20, 0x8f, 0x60, 0x34, 0x24, 0x01, - 0x50, 0x51, 0x80, 0x14, 0x1f, 0xa3, 0x16, 0x9d, 0x86, 0x24, 0x20, 0xba, - 0x4a, 0x87, 0x6b, 0x4a, 0xa8, 0xf8, 0x2f, 0x58, 0xab, 0x87, 0xbf, 0xb2, - 0x9b, 0xf5, 0x9f, 0xc7, 0x36, 0x8d, 0x98, 0x9e, 0x40, 0x29, 0x10, 0xf8, - 0xf2, 0xf8, 0xa9, 0x85, 0xd2, 0xe3, 0xf9, 0xf2, 0x1f, 0xd9, 0x02, 0x57, - 0xd6, 0x0a, 0xd2, 0x5a, 0x6b, 0xd9, 0x72, 0xda, 0x7d, 0xde, 0x52, 0x44, - 0xe0, 0x2b, 0xca, 0x80, 0x59, 0xf8, 0x2b, 0xc1, 0xe1, 0xa3, 0x3c, 0xdb, - 0xf6, 0x71, 0xd2, 0x1c, 0x14, 0x72, 0xa2, 0xbe, 0xbd, 0x87, 0x92, 0x1c, - 0x70, 0x99, 0xdd, 0x7c, 0x09, 0xf0, 0xc0, 0x86, 0xaf, 0x15, 0x9f, 0x77, - 0x6d, 0x32, 0x5c, 0xed, 0x6d, 0x82, 0x10, 0xca, 0x36, 0x80, 0x8d, 0xcd, - 0x90, 0x5e, 0xaf, 0xd7, 0x3c, 0x87, 0xa7, 0xb5, 0xbe, 0xcb, 0xa8, 0xf4, - 0x1f, 0x97, 0x4e, 0x40, 0xa2, 0x1f, 0x52, 0xc7, 0xa7, 0x08, 0x5b, 0x05, - 0xe3, 0x7a, 0xa1, 0x91, 0xc5, 0xc1, 0x22, 0x45, 0x6e, 0xbc, 0xff, 0xd9, - 0x60, 0x29, 0xbe, 0x33, 0x76, 0xa4, 0x06, 0x87, 0xa9, 0x37, 0x68, 0xeb, - 0x54, 0xbb, 0x03, 0x55, 0xb1, 0x53, 0x29, 0x22, 0x1b, 0x61, 0x95, 0xf8, - 0x96, 0xfe, 0xd9, 0x0c, 0x69, 0x6e, 0x25, 0x65, 0x87, 0x61, 0xd9, 0x1c, - 0x1d, 0xf2, 0x2a, 0x86, 0x8e, 0x5e, 0x49, 0xf5, 0x87, 0x68, 0x91, 0xd9, - 0xa3, 0xbf, 0x0a, 0x17, 0x9c, 0xe5, 0x31, 0xcf, 0xe0, 0xdb, 0xf0, 0xf3, - 0xc6, 0x15, 0x23, 0x91, 0x86, 0xe5, 0x32, 0x87, 0x51, 0x69, 0x56, 0x5b, - 0x31, 0x5a, 0x60, 0x8d, 0x11, 0xe5, 0xbd, 0x50, 0xc8, 0xcc, 0xd6, 0xf0, - 0x45, 0x34, 0x18, 0x98, 0xb0, 0x30, 0x49, 0xab, 0x08, 0xac, 0xc7, 0x0a, - 0x4e, 0xa5, 0x3d, 0x02, 0xcf, 0x38, 0xc3, 0x54, 0xd3, 0x54, 0xbe, 0xdf, - 0x20, 0x1f, 0x66, 0xff, 0x0b, 0xcf, 0x82, 0x5e, 0xa5, 0xaf, 0x13, 0x97, - 0x7f, 0x43, 0x3b, 0x15, 0xa0, 0xa8, 0xec, 0x9f, 0xb8, 0x5a, 0x0d, 0x50, - 0xc3, 0xd3, 0x0f, 0x40, 0xaf, 0x08, 0x0e, 0xe7, 0xc8, 0x6a, 0xfd, 0xd5, - 0xbc, 0xaa, 0xf5, 0x56, 0x17, 0xce, 0x6b, 0xd6, 0xf0, 0x9c, 0x79, 0x42, - 0x7f, 0x19, 0x57, 0x5e, 0x4d, 0xb1, 0x64, 0x0d, 0xa5, 0x17, 0xa8, 0xc1, - 0x5a, 0x7e, 0xd3, 0x9c, 0xf9, 0xf4, 0x0b, 0xad, 0x55, 0xa0, 0x8c, 0x84, - 0x08, 0x3e, 0x6e, 0xb9, 0xb4, 0x30, 0x6e, 0xbc, 0x70, 0xd8, 0xff, 0x3b, - 0x47, 0x87, 0x33, 0x9f, 0x25, 0x50, 0xbe, 0xbd, 0x68, 0x36, 0x9a, 0x6b, - 0x0e, 0xb6, 0x63, 0xd3, 0x81, 0xa7, 0xd1, 0xcc, 0x6d, 0xaf, 0x25, 0x9a, - 0x68, 0xfd, 0x6a, 0x50, 0x0f, 0x7d, 0x65, 0x9d, 0xf8, 0x18, 0x26, 0xea, - 0xbe, 0xea, 0xab, 0x65, 0x23, 0x06, 0x80, 0xf0, 0xfa, 0xae, 0x43, 0x39, - 0x81, 0x9d, 0xe8, 0xc5, 0x9f, 0x6b, 0xc0, 0x6f, 0x0d, 0x3c, 0x02, 0x77, - 0x93, 0x45, 0x8d, 0xc9, 0x0d, 0x36, 0x0d, 0xa3, 0x6d, 0xa5, 0x9d, 0x84, - 0x0f, 0x7e, 0x1e, 0xa5, 0xaa, 0xfb, 0x12, 0x74, 0xad, 0x94, 0x44, 0x4f, - 0xcc, 0x08, 0xcf, 0x64, 0xf1, 0xd7, 0x56, 0x55, 0xcc, 0x61, 0xa7, 0x47, - 0xf4, 0x68, 0x59, 0xc4, 0xc4, 0x39, 0x80, 0xf1, 0x19, 0x70, 0xa9, 0x4d, - 0x7a, 0xe9, 0x6a, 0xef, 0x2f, 0x63, 0x95, 0xdb, 0x09, 0xb7, 0xb6, 0x1b, - 0xf3, 0x68, 0x96, 0x0a, 0xbe, 0x81, 0x5b, 0x92, 0x98, 0xdb, 0x00, 0x4f, - 0x79, 0xa4, 0x71, 0x8a, 0x30, 0x3f, 0x82, 0xce, 0x8d, 0xc2, 0x46, 0x9f, - 0x9a, 0xc1, 0x2a, 0x66, 0xcc, 0x7d, 0x23, 0x98, 0x83, 0x2e, 0x91, 0xab, - 0x55, 0xbd, 0x05, 0x95, 0x0a, 0x96, 0x88, 0x2e, 0xf6, 0xb9, 0x64, 0x28, - 0x1e, 0x93, 0xe9, 0x06, 0x6a, 0x7e, 0xd2, 0x42, 0x55, 0x9b, 0x86, 0xca, - 0xdd, 0x26, 0x49, 0x9b, 0x8e, 0x0c, 0x00, 0xb5, 0x84, 0xaa, 0xb9, 0x66, - 0x3a, 0xbf, 0x5e, 0xf8, 0x40, 0xf4, 0x83, 0x3d, 0xa3, 0x84, 0xa6, 0x32, - 0x61, 0x06, 0x38, 0x29, 0x7b, 0x33, 0x57, 0x97, 0xaf, 0x12, 0x6e, 0x80, - 0xe0, 0x59, 0x92, 0xc8, 0x97, 0x06, 0xf1, 0x3c, 0x8b, 0x9c, 0x30, 0xce, - 0xd2, 0xc2, 0xe1, 0x5a, 0x17, 0x56, 0x89, 0xc9, 0xd9, 0xda, 0xc7, 0x31, - 0xb9, 0x19, 0x52, 0x08, 0xe5, 0x9a, 0x73, 0x14, 0xd6, 0x3a, 0x10, 0x13, - 0xcb, 0x02, 0xf4, 0x7c, 0xf9, 0x69, 0x7b, 0xf4, 0xb6, 0xaa, 0xf8, 0x69, - 0xc8, 0x76, 0xb1, 0xa0, 0x0b, 0x30, 0x37, 0x02, 0xf4, 0xd8, 0x93, 0x3c, - 0xdf, 0x02, 0x21, 0x1e, 0x36, 0xf8, 0x25, 0x68, 0xc0, 0x12, 0xf8, 0xe8, - 0x32, 0x4b, 0xf2, 0x0d, 0x84, 0x7c, 0xa3, 0x41, 0xc2, 0xe2, 0x1f, 0xdf, - 0xd5, 0xba, 0x71, 0x2d, 0x7b, 0x4b, 0xf7, 0xea, 0x02, 0xaa, 0x2d, 0x92, - 0x90, 0x84, 0x1f, 0x0e, 0xf3, 0x7d, 0xdd, 0x19, 0xa5, 0x53, 0xd8, 0x4a, - 0x3e, 0x07, 0x6e, 0x97, 0x93, 0x0c, 0xd9, 0x24, 0x31, 0x4f, 0x8c, 0xaa, - 0x00, 0xa6, 0x23, 0x9d, 0xb4, 0x5e, 0x81, 0x28, 0xe5, 0xfb, 0x94, 0xd9, - 0xdb, 0x57, 0x9b, 0x64, 0x63, 0xc9, 0x42, 0x9a, 0x1e, 0x70, 0xc0, 0x61, - 0xdf, 0xdf, 0x7b, 0xd2, 0x6c, 0xe5, 0x6a, 0x28, 0x5c, 0xd9, 0x71, 0x26, - 0xa4, 0x07, 0x4b, 0x0d, 0xb1, 0xfa, 0x91, 0xb0, 0x4a, 0x0a, 0x04, 0x83, - 0x21, 0x96, 0x2c, 0xb9, 0x6f, 0x57, 0x69, 0x31, 0x4e, 0x38, 0x87, 0xba, - 0xf1, 0xf2, 0x2c, 0x45, 0xfb, 0x74, 0x2f, 0x3b, 0x88, 0x16, 0xcc, 0xb4, - 0x04, 0x18, 0xc8, 0x06, 0x06, 0x6e, 0x43, 0x6e, 0x60, 0x5e, 0x35, 0x00, - 0x67, 0x9c, 0x58, 0xca, 0xd7, 0xb9, 0x11, 0x20, 0x00, 0xdf, 0xf7, 0x58, - 0x58, 0xc0, 0x78, 0x21, 0x0f, 0x39, 0x2f, 0x8b, 0xa7, 0x4c, 0x95, 0x64, - 0x70, 0x4a, 0x7e, 0x2c, 0x93, 0x41, 0x8c, 0x95, 0x21, 0xdf, 0x00, 0x67, - 0x62, 0x64, 0x49, 0x4d, 0xfb, 0x86, 0x96, 0xd1, 0x6c, 0x85, 0xd5, 0x00, - 0xd3, 0x7e, 0x44, 0x0e, 0x4a, 0x84, 0x9a, 0x38, 0x7d, 0x86, 0xa2, 0x0f, - 0x3a, 0xb5, 0x66, 0x56, 0x4e, 0xc0, 0xc3, 0x37, 0x4d, 0x58, 0xea, 0xfd, - 0xbf, 0xcf, 0x22, 0x10, 0x88, 0x84, 0x24, 0x40, 0x2b, 0x1b, 0x49, 0xed, - 0x97, 0xcf, 0x7d, 0x1a, 0x75, 0xf5, 0x4d, 0x6e, 0x85, 0x8a, 0xb0, 0x68, - 0x68, 0xea, 0xc8, 0xfc, 0xab, 0x20, 0xc4, 0x08, 0xa2, 0x0d, 0x1f, 0x1e, - 0x4c, 0x6d, 0xc1, 0xc5, 0x11, 0x89, 0x7e, 0x8d, 0xfe, 0x1d, 0xbd, 0x8a, - 0x09, 0x49, 0x8b, 0x58, 0x3a, 0x57, 0xcf, 0x87, 0x88, 0x2e, 0xc6, 0xd1, - 0xb7, 0x33, 0x67, 0xf7, 0x02, 0x31, 0x54, 0xb6, 0x9e, 0x8a, 0x1c, 0x03, - 0xd6, 0x8d, 0x28, 0xcb, 0x99, 0xbb, 0x5c, 0x2c, 0x4c, 0xd2, 0x2e, 0x61, - 0x64, 0x76, 0x6e, 0x65, 0x59, 0x6f, 0xf7, 0xe4, 0xf3, 0x88, 0x0b, 0x9c, - 0x69, 0x90, 0xb2, 0xf3, 0xbd, 0xd6, 0xf5, 0x78, 0x09, 0xd0, 0x1f, 0x53, - 0x36, 0xc0, 0x8a, 0x52, 0x6f, 0xdc, 0x0c, 0x19, 0x1d, 0x86, 0x71, 0x40, - 0xc3, 0xb2, 0x83, 0xb2, 0x84, 0x85, 0x87, 0x05, 0x69, 0xbc, 0x1f, 0x53, - 0xca, 0xb7, 0x62, 0x0a, 0x49, 0x4b, 0xec, 0x8d, 0xf0, 0x70, 0x57, 0xde, - 0xf6, 0x63, 0xea, 0x1a, 0x34, 0xda, 0xfe, 0x85, 0x3e, 0x7d, 0x8d, 0x52, - 0x2b, 0x86, 0x2c, 0x6f, 0xac, 0x2f, 0x0b, 0x6e, 0x1e, 0xb8, 0xcc, 0x88, - 0xe4, 0xf8, 0x57, 0xd0, 0xbf, 0x43, 0x31, 0xe2, 0x81, 0x70, 0x5d, 0x68, - 0xf0, 0x28, 0xe0, 0x6b, 0x73, 0x55, 0xfb, 0x88, 0x8b, 0x1a, 0x8e, 0xaf, - 0xea, 0x75, 0x22, 0x0d, 0x46, 0x1b, 0xf7, 0x09, 0x14, 0x9f, 0x37, 0x71, - 0x7e, 0x17, 0x53, 0x26, 0x24, 0x93, 0x6b, 0xe5, 0x46, 0x7b, 0xeb, 0xef, - 0x51, 0x7a, 0x4a, 0xc2, 0xe0, 0x86, 0xd4, 0xbb, 0x62, 0x36, 0xdb, 0xab, - 0xec, 0x64, 0xad, 0xc7, 0x2e, 0x3a, 0xf1, 0xef, 0xde, 0x7c, 0x78, 0x10, - 0xb2, 0xd2, 0x2b, 0x42, 0xd2, 0x31, 0xaf, 0xdc, 0x8d, 0x04, 0xc0, 0x06, - 0x23, 0x19, 0xa7, 0x0b, 0xf2, 0x11, 0xac, 0x5a, 0x73, 0x99, 0x0e, 0x82, - 0xb8, 0x26, 0xf5, 0x19, 0xf8, 0x23, 0xd6, 0x32, 0x4a, 0x9e, 0x8b, 0xe5, - 0x39, 0x74, 0x38, 0x84, 0x99, 0x2b, 0x10, 0x93, 0xe0, 0xd2, 0x64, 0x43, - 0x34, 0x23, 0xe2, 0xc6, 0x34, 0xc3, 0x0e, 0x94, 0x99, 0x98, 0x42, 0x5c, - 0xdb, 0xb6, 0x0c, 0x8b, 0x6d, 0xdf, 0x18, 0x6c, 0x0e, 0x40, 0x7b, 0xc0, - 0x48, 0x73, 0xb6, 0xb2, 0x0c, 0x97, 0xe5, 0x7a, 0xeb, 0x41, 0x7d, 0xf6, - 0x96, 0x0f, 0xa6, 0xdb, 0xdc, 0x45, 0xe5, 0x0c, 0xde, 0xf8, 0xf0, 0xeb, - 0xae, 0x82, 0x35, 0xba, 0x02, 0xd7, 0x57, 0x9d, 0x2c, 0x00, 0xbc, 0x1c, - 0x7d, 0xd1, 0xa0, 0x57, 0xfd, 0x0f, 0xc9, 0x53, 0xb7, 0xc1, 0xb0, 0xeb, - 0x7a, 0x87, 0xfa, 0x4a, 0xeb, 0x10, 0x0c, 0xc4, 0xc7, 0x78, 0x59, 0xb6, - 0x87, 0xad, 0xd0, 0x64, 0x54, 0x54, 0xce, 0xe3, 0x5d, 0x26, 0x7f, 0xff, - 0x86, 0x75, 0x5f, 0xff, 0x1e, 0xe6, 0x3a, 0x97, 0xe0, 0xb1, 0x2f, 0xc6, - 0xe7, 0x6e, 0x48, 0x9e, 0xa6, 0x6d, 0x7f, 0x01, 0xc0, 0xc8, 0x39, 0xa0, - 0xe4, 0xe4, 0xc6, 0x43, 0xbd, 0x7e, 0x21, 0xc8, 0x44, 0xa9, 0x9c, 0x50, - 0x7b, 0x8f, 0x3b, 0x9d, 0x9a, 0x82, 0x89, 0xd4, 0x65, 0x86, 0xed, 0xe5, - 0x7c, 0x8c, 0x04, 0xcf, 0x9e, 0x34, 0xb1, 0xf5, 0x60, 0xb6, 0x38, 0x04, - 0xb1, 0x0f, 0xa7, 0x8b, 0x9a, 0x1e, 0x8b, 0xa1, 0x02, 0xef, 0x38, 0xa8, - 0x4c, 0x69, 0xc9, 0x9a, 0xc6, 0x9a, 0x55, 0xb9, 0x96, 0xde, 0xc9, 0xcf, - 0xb6, 0xd7, 0x0a, 0x56, 0x5e, 0xb4, 0x4f, 0x74, 0xb7, 0xc8, 0x64, 0x1c, - 0x05, 0x3e, 0x45, 0x9e, 0x5a, 0x91, 0x11, 0xb6, 0xc9, 0xb9, 0x22, 0x62, - 0x90, 0x3c, 0x92, 0x6d, 0x71, 0x82, 0x72, 0x8c, 0x13, 0xe8, 0x29, 0x30, - 0x4a, 0xdc, 0xe0, 0x64, 0xa5, 0x8c, 0xc6, 0x34, 0xab, 0x79, 0xf2, 0x98, - 0xda, 0x35, 0x35, 0x4f, 0x70, 0x30, 0xfd, 0x6f, 0x70, 0xe7, 0xd1, 0x4a, - 0x20, 0x9a, 0x89, 0x49, 0x8e, 0x89, 0x80, 0x1b, 0x9f, 0xff, 0xc8, 0x91, - 0x7d, 0xfa, 0x88, 0xc1, 0x4b, 0x7e, 0x6a, 0xa9, 0x90, 0x0b, 0x79, 0xc4, - 0x61, 0x08, 0x97, 0xd4, 0x61, 0x9a, 0xf6, 0xa6, 0x70, 0xfd, 0xc8, 0xae, - 0x4c, 0xd6, 0x99, 0xa9, 0xfc, 0xb6, 0x5d, 0x8c, 0x98, 0x2a, 0xdb, 0x7f, - 0x6f, 0xa0, 0xf6, 0xc3, 0xd5, 0xcf, 0xd1, 0x73, 0xea, 0x7c, 0x6c, 0x63, - 0xd3, 0xc2, 0xf5, 0xb7, 0x09, 0xb8, 0x26, 0x14, 0xe3, 0xe2, 0x80, 0xfe, - 0xc7, 0xad, 0xe1, 0xfd, 0xae, 0xf7, 0x22, 0x34, 0xf4, 0x24, 0x4d, 0x84, - 0xfc, 0xf6, 0x5e, 0x61, 0xc8, 0x55, 0xc7, 0xcf, 0xdc, 0xe7, 0xfa, 0x71, - 0x26, 0x6c, 0x58, 0x70, 0x2a, 0xeb, 0x82, 0x86, 0xae, 0xb4, 0xb7, 0xbc, - 0x7e, 0x83, 0xc6, 0xb2, 0xf8, 0xa6, 0x03, 0xc7, 0xd7, 0x01, 0x74, 0x4d, - 0x70, 0x07, 0xe3, 0x04, 0xb3, 0x81, 0x76, 0x40, 0x75, 0xa3, 0xed, 0x67, - 0x89, 0x1f, 0xf8, 0x99, 0x6d, 0xba, 0xf9, 0x65, 0x95, 0xf4, 0x7d, 0x54, - 0x90, 0x38, 0xad, 0x34, 0x77, 0x99, 0xc4, 0xdf, 0x24, 0xc5, 0xe8, 0xf5, - 0xe1, 0x71, 0xb4, 0x96, 0x62, 0xd0, 0xd6, 0x6d, 0x2d, 0x9c, 0x8b, 0xe6, - 0x97, 0x90, 0x1f, 0x07, 0x61, 0x67, 0xe1, 0x78, 0xd9, 0x2b, 0xa1, 0x4c, - 0x7a, 0xd1, 0x7b, 0xbc, 0xde, 0x9b, 0x01, 0x22, 0xbe, 0xfa, 0xc3, 0x15, - 0x54, 0xa1, 0x50, 0x64, 0x2b, 0xda, 0x92, 0x6c, 0xda, 0x3f, 0x88, 0xb7, - 0xa9, 0x17, 0xf6, 0x7f, 0x5e, 0x0a, 0x66, 0x8b, 0xa3, 0x78, 0x7a, 0xbc, - 0x35, 0x9c, 0xe2, 0x0a, 0xbf, 0x86, 0xaf, 0xe7, 0x2b, 0x02, 0x18, 0x80, - 0x20, 0xa3, 0xfe, 0xff, 0x52, 0x04, 0x04, 0x7f, 0x30, 0x35, 0x00, 0x30, - 0x49, 0xb6, 0xec, 0xb7, 0x54, 0x2d, 0x05, 0x18, 0x94, 0x48, 0xa1, 0xc3, - 0x9b, 0x51, 0x29, 0xc2, 0x99, 0xed, 0xe6, 0xe4, 0x21, 0x2e, 0xd4, 0x25, - 0xb8, 0xb8, 0x98, 0x51, 0x05, 0xd0, 0x6f, 0xf9, 0xce, 0x48, 0x24, 0x75, - 0xc7, 0xbd, 0xa3, 0xae, 0x57, 0x9f, 0xb3, 0x0a, 0xf1, 0x3d, 0x86, 0xc7, - 0x8f, 0xe4, 0xf7, 0x94, 0x98, 0x28, 0x1f, 0xa1, 0x45, 0x5c, 0x2c, 0xdc, - 0x6a, 0x05, 0x18, 0xa9, 0x4b, 0xf2, 0xa5, 0x0f, 0xb7, 0x56, 0xb1, 0xb8, - 0xad, 0xbd, 0x0c, 0x83, 0x51, 0x05, 0x16, 0x3e, 0x94, 0x4d, 0xe3, 0x2f, - 0x7f, 0xc0, 0x8e, 0xca, 0x94, 0xa5, 0x55, 0xdd, 0x8f, 0xe5, 0x83, 0x88, - 0x09, 0xe9, 0x8f, 0x6f, 0x40, 0x83, 0xc5, 0x78, 0xdf, 0xdb, 0xd0, 0x85, - 0xa5, 0x8f, 0x7c, 0x52, 0x2f, 0x97, 0x60, 0x1d, 0x88, 0x05, 0x2a, 0x28, - 0xba, 0x41, 0x38, 0xff, 0x8f, 0x5b, 0xea, 0xd9, 0x72, 0x2d, 0x32, 0x2a, - 0xa8, 0x70, 0xaf, 0x16, 0xb7, 0xfa, 0xea, 0xf6, 0x81, 0x77, 0x25, 0xc9, - 0xfc, 0x60, 0x65, 0xb0, 0x1f, 0x3e, 0xca, 0x1c, 0xb0, 0xb1, 0x9d, 0x0e, - 0xcc, 0x05, 0xd8, 0x25, 0x22, 0x65, 0xd9, 0x7b, 0x93, 0x7e, 0x05, 0x82, - 0x5a, 0xf6, 0x6b, 0x21, 0xdc, 0x09, 0xea, 0xd9, 0x12, 0x56, 0xef, 0x99, - 0x37, 0xf1, 0x2a, 0xaf, 0x41, 0x3c, 0xbf, 0x3c, 0x23, 0x33, 0x8d, 0x59, - 0x6c, 0x9d, 0x99, 0x27, 0xbd, 0x11, 0xeb, 0x9b, 0x82, 0xe1, 0x17, 0xe3, - 0x54, 0xe1, 0xf2, 0xba, 0x64, 0x03, 0x7b, 0xaa, 0xa8, 0x6c, 0x5d, 0x88, - 0xc4, 0x35, 0x45, 0xb1, 0xf4, 0x7d, 0x47, 0x67, 0x51, 0x7e, 0x27, 0x8c, - 0xd7, 0xb9, 0xcf, 0x36, 0x98, 0x25, 0xaf, 0xb4, 0x8b, 0x16, 0x3f, 0x30, - 0xab, 0xa5, 0x97, 0x8f, 0x47, 0x09, 0x49, 0xe9, 0x2d, 0x1a, 0x10, 0xe1, - 0xe7, 0x6d, 0xbc, 0x82, 0xa7, 0x0d, 0x6b, 0x92, 0xd5, 0xb7, 0x8e, 0xb5, - 0xc8, 0x59, 0x31, 0xc1, 0x9c, 0x90, 0xce, 0x98, 0x36, 0x72, 0x24, 0x11, - 0x98, 0x03, 0xdd, 0x00, 0x96, 0x93, 0x65, 0x03, 0x85, 0x49, 0xce, 0x32, - 0x9d, 0xe7, 0xa4, 0x7c, 0xfa, 0xe9, 0xc9, 0xee, 0x8b, 0xb9, 0x10, 0xe5, - 0x2f, 0x15, 0xde, 0x41, 0x3d, 0x94, 0x4e, 0x2b, 0xb3, 0x49, 0x8d, 0x9a, - 0xfc, 0x5b, 0x84, 0xa5, 0x4b, 0xd1, 0xfe, 0xd2, 0x20, 0x13, 0xa4, 0x6b, - 0x4c, 0xf0, 0x68, 0x27, 0xf6, 0x73, 0xb5, 0x1d, 0xac, 0xd3, 0x87, 0xa5, - 0xca, 0xd8, 0x58, 0x1b, 0x82, 0x16, 0xe1, 0xff, 0x53, 0x38, 0xbd, 0xa3, - 0xb0, 0x8d, 0x56, 0xeb, 0x36, 0x9a, 0x39, 0x42, 0x0b, 0xef, 0xf3, 0x45, - 0x52, 0x3b, 0xa2, 0xd3, 0x42, 0x03, 0xfa, 0xfb, 0x1c, 0x91, 0x89, 0xd7, - 0xe4, 0x0b, 0xe9, 0x27, 0x5b, 0x14, 0xcb, 0xff, 0x6b, 0xb6, 0x88, 0xa2, - 0x6b, 0x7e, 0x1b, 0xe9, 0xf9, 0xd0, 0xca, 0xfb, 0x25, 0xd5, 0xa7, 0xec, - 0xf4, 0xe8, 0x1b, 0xb1, 0x6f, 0x8d, 0xf2, 0x3d, 0x23, 0x84, 0x45, 0x87, - 0x74, 0xc2, 0x08, 0x15, 0x39, 0xca, 0x84, 0x3d, 0x53, 0x4a, 0xdd, 0x42, - 0xfe, 0xf8, 0x49, 0x23, 0x33, 0xd9, 0x6c, 0xc7, 0x0c, 0xb0, 0x58, 0x25, - 0xe4, 0x67, 0x12, 0x0a, 0x09, 0x7d, 0x53, 0x41, 0xd6, 0x18, 0x69, 0xfb, - 0x74, 0xa8, 0x79, 0x55, 0x86, 0x55, 0x5c, 0x00, 0x57, 0xf1, 0xf2, 0xe8, - 0x0a, 0x9d, 0xa6, 0x7d, 0xbb, 0xbd, 0x3f, 0x44, 0x48, 0x16, 0x69, 0x6f, - 0x4a, 0xd6, 0xa7, 0x47, 0x66, 0x7c, 0x27, 0x57, 0x36, 0x18, 0x21, 0xb3, - 0xe3, 0x89, 0x1d, 0x02, 0x35, 0x0b, 0xe1, 0x17, 0x79, 0xfb, 0x9c, 0x70, - 0x61, 0x42, 0x26, 0x80, 0x4f, 0x32, 0xff, 0x11, 0x84, 0x61, 0x13, 0x12, - 0xba, 0xbe, 0xac, 0xd0, 0xd7, 0x89, 0x30, 0x6d, 0x20, 0x1a, 0xd4, 0x7d, - 0x0c, 0x78, 0xef, 0xa7, 0x8c, 0xf3, 0x39, 0xc8, 0x51, 0x18, 0xa8, 0x4e, - 0x95, 0xb6, 0xbd, 0xb3, 0xa0, 0xed, 0xde, 0xa7, 0x44, 0xe8, 0x08, 0x16, - 0x9f, 0x37, 0x66, 0x8f, 0xb6, 0x26, 0xec, 0xb3, 0xdc, 0x20, 0xe7, 0xa5, - 0xd8, 0x32, 0x76, 0x30, 0x4b, 0xe1, 0x2a, 0x7b, 0x41, 0xe9, 0xdc, 0x78, - 0xc0, 0x07, 0x9b, 0x32, 0xb5, 0xae, 0xda, 0xfc, 0xb9, 0xca, 0x92, 0x9e, - 0x9d, 0x28, 0x3c, 0x7f, 0x86, 0x6a, 0x8a, 0xe6, 0x54, 0xf3, 0xdf, 0x78, - 0x71, 0x18, 0xff, 0xca, 0xf0, 0xe7, 0x69, 0xdb, 0x56, 0x6c, 0xea, 0x08, - 0xc4, 0xf7, 0x8f, 0x16, 0xab, 0xed, 0x0e, 0x05, 0xc3, 0x50, 0xdf, 0xa8, - 0x85, 0x43, 0xab, 0xb2, 0xe4, 0x43, 0x90, 0x6c, 0x44, 0xbb, 0x3d, 0xb9, - 0xb2, 0x1c, 0x52, 0x77, 0x27, 0xd2, 0x8f, 0x3d, 0x42, 0x7a, 0xa1, 0x91, - 0x02, 0x08, 0xda, 0x45, 0x60, 0x23, 0xe1, 0x33, 0x6f, 0xe8, 0x22, 0xab, - 0x45, 0xa9, 0x34, 0x6f, 0x44, 0xe8, 0x4c, 0xb5, 0x1b, 0x23, 0xee, 0x19, - 0x86, 0xb9, 0x83, 0x2d, 0x62, 0xba, 0x86, 0x47, 0x43, 0x04, 0x90, 0x80, - 0x6e, 0x3b, 0xaf, 0xb2, 0xd2, 0x2d, 0x75, 0xac, 0xf5, 0xfa, 0x6e, 0x54, - 0x8c, 0x4d, 0x66, 0xe2, 0x84, 0x46, 0x70, 0x08, 0xc0, 0x56, 0x85, 0x03, - 0x89, 0x40, 0xa7, 0x7a, 0x83, 0xb9, 0x9a, 0x93, 0xf8, 0x38, 0x16, 0xe1, - 0x94, 0x67, 0x79, 0x91, 0x56, 0xe9, 0x46, 0x1e, 0x31, 0xbc, 0x68, 0xa3, - 0x5f, 0x3d, 0x1b, 0xd9, 0xe1, 0x52, 0x7c, 0x31, 0x66, 0xa5, 0xa6, 0x22, - 0x0a, 0x05, 0xcf, 0xb1, 0xea, 0x83, 0x98, 0x85, 0xa7, 0x75, 0x18, 0x15, - 0x0b, 0xe2, 0x6c, 0x22, 0xed, 0x84, 0xc0, 0xc4, 0x88, 0x9e, 0x66, 0x8a, - 0x69, 0x50, 0x6d, 0xef, 0x29, 0x10, 0xbf, 0x94, 0x46, 0x53, 0x89, 0x69, - 0xed, 0xd0, 0x69, 0x41, 0xbc, 0x38, 0x6a, 0xea, 0x45, 0x10, 0x57, 0x05, - 0x84, 0x12, 0xe9, 0xc1, 0x2c, 0x0f, 0x19, 0xe2, 0x70, 0x5d, 0x6d, 0x64, - 0x39, 0x40, 0xc1, 0x82, 0x0f, 0x1f, 0xba, 0xa7, 0xfe, 0x33, 0xcb, 0x53, - 0xea, 0x9f, 0xa6, 0x05, 0xb9, 0x40, 0x7c, 0xd3, 0xb9, 0xae, 0x1a, 0xb9, - 0x8d, 0xc3, 0xca, 0xc4, 0x9c, 0x1d, 0x09, 0xcf, 0x21, 0xb5, 0x45, 0x3f, - 0xf9, 0x7d, 0x1a, 0x76, 0x8d, 0x30, 0x90, 0x48, 0x8d, 0x04, 0xdc, 0x67, - 0x81, 0xf1, 0xcf, 0x7e, 0x39, 0x20, 0x74, 0x4b, 0x3e, 0x08, 0xb6, 0x0f, - 0x27, 0xe4, 0x31, 0x24, 0xea, 0xf8, 0x19, 0x7d, 0xc5, 0x63, 0xe8, 0x48, - 0xac, 0x8f, 0x30, 0x0e, 0x83, 0x57, 0xee, 0x15, 0x98, 0x15, 0x2f, 0xdf, - 0x59, 0xa7, 0xec, 0xb7, 0xdc, 0x3d, 0x92, 0x68, 0x92, 0x4f, 0x5a, 0x9b, - 0x6e, 0x02, 0x82, 0x80, 0xa6, 0x9b, 0xe7, 0x05, 0xdd, 0x2a, 0x24, 0x9e, - 0x40, 0x7f, 0x81, 0xa5, 0xe7, 0xbe, 0xbf, 0xfe, 0xc4, 0x05, 0x28, 0x52, - 0x91, 0x0c, 0xe0, 0x01, 0xbd, 0x6c, 0x99, 0x1a, 0x67, 0x40, 0x0a, 0xd0, - 0xf4, 0x6a, 0x85, 0x7c, 0xb7, 0x5e, 0x32, 0x60, 0x15, 0x6e, 0xa9, 0x62, - 0x75, 0xaa, 0x5b, 0x84, 0x56, 0x44, 0x23, 0xac, 0xeb, 0x8d, 0xe4, 0x2d, - 0xe6, 0x33, 0x14, 0x46, 0x72, 0x00, 0xeb, 0x5c, 0x0e, 0x68, 0x88, 0xb0, - 0x6f, 0x46, 0x68, 0x32, 0xdc, 0x7e, 0x11, 0x30, 0xf2, 0x01, 0xa4, 0x35, - 0x78, 0x42, 0x8d, 0x8a, 0x83, 0x9a, 0x56, 0x4b, 0x87, 0xa5, 0x70, 0xf8, - 0xd3, 0xe0, 0x0a, 0x7f, 0x10, 0x45, 0x51, 0x38, 0x60, 0x6e, 0x48, 0xce, - 0xd2, 0x6e, 0x21, 0xc4, 0x35, 0x25, 0xf8, 0xe4, 0x53, 0x0c, 0x4d, 0x12, - 0x92, 0xf0, 0xcb, 0x71, 0xb1, 0xcd, 0xb5, 0xe2, 0xdc, 0x2a, 0xb3, 0xe2, - 0x13, 0xe8, 0x71, 0x46, 0xb0, 0xa6, 0x47, 0xb6, 0x9f, 0xd0, 0x5d, 0xce, - 0xb0, 0x6a, 0xc2, 0x08, 0xbf, 0xa1, 0xe5, 0xc2, 0xa9, 0xfa, 0xb7, 0x69, - 0x25, 0x22, 0xe2, 0xcf, 0xd7, 0x5f, 0x91, 0x1c, 0xde, 0xe4, 0xfe, 0x48, - 0xb5, 0x04, 0xf6, 0xe5, 0x18, 0x51, 0xbe, 0xa2, 0xd5, 0x73, 0x31, 0xdc, - 0x32, 0x81, 0xd9, 0x95, 0x2f, 0x39, 0x3e, 0xbb, 0x23, 0x0a, 0x16, 0x47, - 0x18, 0xff, 0x52, 0x3c, 0x49, 0x95, 0x52, 0x3d, 0xc0, 0x56, 0xae, 0xa6, - 0x57, 0x85, 0xe4, 0x2b, 0x1a, 0x77, 0x09, 0xef, 0x6c, 0xaa, 0xa1, 0xe0, - 0x2e, 0x2a, 0xd5, 0x64, 0xe7, 0x10, 0xd9, 0x30, 0x2b, 0xc1, 0x7c, 0x01, - 0xe3, 0xa9, 0x1c, 0x53, 0x98, 0x59, 0x98, 0xdd, 0x25, 0x72, 0x90, 0x08, - 0x61, 0x87, 0x00, 0xaa, 0x40, 0x8c, 0x7f, 0xf8, 0x5c, 0x7e, 0x0a, 0xd0, - 0x2b, 0x7e, 0x4e, 0xdf, 0xa1, 0x8f, 0x6a, 0x1a, 0x9c, 0xc6, 0x2d, 0xd0, - 0x2a, 0xeb, 0x41, 0x7f, 0x90, 0x5f, 0x7a, 0xc3, 0x9d, 0x97, 0x5e, 0x37, - 0x3e, 0x2d, 0xd8, 0x43, 0x4d, 0xae, 0x99, 0xfd, 0x6e, 0xe6, 0x57, 0x1c, - 0xf0, 0xf6, 0x3e, 0x88, 0xca, 0xc5, 0x7e, 0xd5, 0xdb, 0x66, 0xc1, 0xed, - 0x73, 0x4c, 0x5f, 0xe6, 0x4b, 0xc4, 0x23, 0xcc, 0x09, 0x8b, 0x0a, 0x79, - 0x0a, 0xf4, 0x00, 0x38, 0xd7, 0x40, 0xdd, 0xdf, 0xc0, 0xd2, 0x7e, 0x45, - 0x3d, 0xa6, 0x44, 0x11, 0xcb, 0x90, 0xa6, 0x05, 0x06, 0xf9, 0xfe, 0x10, - 0xe7, 0x8e, 0x20, 0xfd, 0xdc, 0xb2, 0x41, 0x99, 0x53, 0x41, 0x81, 0xc8, - 0xf6, 0x96, 0xbb, 0x15, 0x3b, 0x75, 0x76, 0x47, 0x92, 0x74, 0x47, 0x51, - 0x56, 0x79, 0xfd, 0x6b, 0x0c, 0xbe, 0x60, 0x9a, 0xd7, 0x35, 0xa9, 0x09, - 0x5d, 0x32, 0xda, 0xca, 0xc5, 0x1a, 0x31, 0x21, 0xd9, 0x83, 0x1c, 0x6d, - 0x70, 0xcf, 0xce, 0x91, 0xec, 0x38, 0x63, 0x86, 0xee, 0x88, 0x61, 0x9d, - 0xfc, 0xea, 0x23, 0xba, 0xc0, 0xb6, 0xbd, 0xcf, 0xda, 0xdd, 0x97, 0x66, - 0x18, 0xf5, 0x4a, 0xb7, 0x14, 0xe6, 0xb9, 0xf2, 0xb0, 0x09, 0x91, 0x21, - 0x44, 0xb9, 0x31, 0x03, 0xbd, 0x8c, 0x02, 0xe9, 0xa6, 0xc0, 0x09, 0x12, - 0x65, 0x38, 0x23, 0x3f, 0xdf, 0x20, 0x1e, 0x35, 0x07, 0x21, 0x66, 0x0c, - 0x19, 0x94, 0x9b, 0x72, 0xe9, 0x53, 0x87, 0x03, 0xc0, 0x21, 0xa1, 0x57, - 0xc1, 0x59, 0x65, 0xde, 0x9d, 0x67, 0x5e, 0x39, 0xbd, 0xba, 0xc6, 0x9a, - 0xef, 0x1b, 0x17, 0x7c, 0x6b, 0x13, 0xc4, 0xb9, 0x43, 0x51, 0xfa, 0x2c, - 0x0e, 0x83, 0xd4, 0x82, 0x75, 0x76, 0x5a, 0x26, 0xa3, 0x01, 0x7e, 0x5f, - 0x6b, 0x02, 0xda, 0xb4, 0xdb, 0x1a, 0x28, 0x84, 0xc5, 0x2f, 0xfe, 0x0b, - 0x57, 0xdc, 0x11, 0x7a, 0xe1, 0xae, 0x0f, 0xb0, 0xe4, 0x75, 0x8a, 0x7a, - 0xf5, 0x58, 0x7c, 0xf6, 0x07, 0x07, 0x09, 0xc7, 0xd3, 0x65, 0x4b, 0x42, - 0x6e, 0x0e, 0xb0, 0x3b, 0xa6, 0x0f, 0x8a, 0x9a, 0xb9, 0x3e, 0x08, 0x6a, - 0xb4, 0x34, 0xe0, 0x90, 0x67, 0xad, 0x16, 0x5a, 0xd3, 0xf7, 0x6e, 0x6c, - 0xb0, 0xd3, 0x06, 0xf8, 0x88, 0x33, 0x33, 0x22, 0xc3, 0x11, 0x35, 0x5a, - 0x5c, 0xcb, 0x7a, 0xe3, 0x3b, 0x4f, 0x8c, 0x8b, 0x15, 0x06, 0x91, 0xdb, - 0x51, 0x88, 0xda, 0x06, 0x8d, 0x91, 0x63, 0x7a, 0x84, 0x0b, 0xcc, 0x4e, - 0x6d, 0x22, 0x4a, 0xd4, 0x18, 0xc7, 0xfd, 0xa4, 0xcb, 0x30, 0x16, 0xa1, - 0xe0, 0x95, 0x92, 0x14, 0xf4, 0xfd, 0xf1, 0xa9, 0x28, 0x66, 0xe8, 0x3a, - 0xaf, 0x17, 0xa0, 0x75, 0xf2, 0x55, 0xa7, 0xf3, 0x05, 0x02, 0xda, 0xad, - 0xb7, 0xce, 0x7a, 0x81, 0x02, 0xb9, 0xaa, 0x5b, 0x6c, 0xe8, 0xc9, 0x48, - 0xe3, 0x3c, 0x6e, 0xb8, 0x8a, 0x1f, 0x48, 0x3a, 0x46, 0xe6, 0x46, 0x89, - 0x6a, 0xb1, 0xfc, 0x7a, 0x71, 0x23, 0xc9, 0xa7, 0xad, 0x37, 0x72, 0xcb, - 0x21, 0x1b, 0x06, 0x00, 0xf6, 0x48, 0x6c, 0x4d, 0xda, 0x70, 0x08, 0xb3, - 0x2e, 0xfb, 0xcd, 0xd5, 0x98, 0x08, 0x32, 0xd3, 0x1f, 0x69, 0x4b, 0x16, - 0x28, 0x6f, 0x33, 0xc6, 0x47, 0x7c, 0xbb, 0xd7, 0xb0, 0x72, 0xf5, 0x49, - 0x43, 0xff, 0x43, 0x46, 0x8a, 0x6d, 0xe8, 0x9e, 0x41, 0xf5, 0xb9, 0xee, - 0xf2, 0x40, 0xb4, 0xd4, 0x61, 0xd1, 0xfc, 0x4a, 0x37, 0x38, 0xc1, 0x67, - 0x33, 0x1d, 0xd7, 0xdd, 0x4c, 0x9f, 0xfc, 0x8a, 0xa6, 0xff, 0xf1, 0xfe, - 0x57, 0x66, 0x52, 0xb5, 0x42, 0x85, 0xb6, 0x6c, 0x21, 0xfd, 0x05, 0xd4, - 0xe9, 0x94, 0x37, 0x4c, 0x73, 0xae, 0x98, 0x1e, 0x7c, 0x1d, 0xae, 0x31, - 0xd1, 0xc3, 0x56, 0x0d, 0xe2, 0xaf, 0xab, 0x4a, 0x0a, 0xbe, 0xe1, 0x24, - 0x8b, 0x93, 0xc3, 0x24, 0xb5, 0x6e, 0x44, 0x5d, 0x06, 0x5f, 0x24, 0x33, - 0x0c, 0xf0, 0x85, 0x84, 0x3e, 0xb4, 0xa6, 0xab, 0x8b, 0x1b, 0x67, 0x0e, - 0x30, 0x95, 0xf9, 0x8b, 0xa4, 0x57, 0x4a, 0x45, 0x18, 0xa4, 0xa9, 0xba, - 0x5f, 0x87, 0x74, 0x21, 0x38, 0x6a, 0xc0, 0x2b, 0x24, 0x4c, 0xc3, 0x18, - 0x1b, 0x73, 0x5e, 0x52, 0x0c, 0x16, 0xa0, 0x03, 0x80, 0x74, 0x43, 0xce, - 0x5c, 0x69, 0xab, 0x7a, 0x4a, 0xbe, 0xf6, 0x76, 0xb4, 0x8e, 0x92, 0xc1, - 0xd8, 0x2f, 0x88, 0x6e, 0x71, 0xe2, 0x85, 0x24, 0x7b, 0xe2, 0x4b, 0x90, - 0xc2, 0x48, 0x1d, 0xab, 0x19, 0xd4, 0x6b, 0x5b, 0x51, 0x38, 0xa8, 0xc0, - 0xb8, 0xf0, 0xf1, 0x0b, 0x73, 0x53, 0x67, 0x9c, 0xdd, 0x06, 0xf6, 0xbc, - 0xec, 0x14, 0xbd, 0xe2, 0x08, 0xf3, 0xc4, 0x24, 0xa4, 0x92, 0xc7, 0x3b, - 0x2c, 0xcd, 0x82, 0xea, 0x8a, 0xa5, 0xd4, 0xce, 0x29, 0x41, 0x5b, 0xf0, - 0xba, 0x0e, 0x9e, 0x64, 0x2d, 0x6e, 0xd9, 0x0c, 0x40, 0x60, 0x8f, 0x9e, - 0x4d, 0x0b, 0x1d, 0x26, 0xe1, 0xe1, 0x71, 0x03, 0x73, 0x1f, 0x6d, 0x16, - 0x21, 0x60, 0xb9, 0x63, 0xa7, 0xba, 0x0a, 0x2a, 0x95, 0xe3, 0xda, 0x12, - 0xd5, 0x1b, 0xb3, 0xda, 0x78, 0xbc, 0x1b, 0x61, 0xaf, 0x52, 0x17, 0x14, - 0x0e, 0xb5, 0xa3, 0x38, 0x67, 0x1b, 0xa1, 0x89, 0xc2, 0xaf, 0xfb, 0xec, - 0xcf, 0xfa, 0xe3, 0xcf, 0xe3, 0x11, 0x5b, 0xe6, 0xf5, 0x99, 0x6e, 0x6e, - 0x08, 0x30, 0xa7, 0xce, 0x32, 0x4b, 0x64, 0x9f, 0x45, 0x8e, 0x7a, 0x7f, - 0x11, 0x80, 0xda, 0x8d, 0x81, 0xf9, 0xa5, 0xf1, 0x28, 0xd3, 0x84, 0x5c, - 0x73, 0x4e, 0x8a, 0x77, 0x1a, 0x76, 0xa9, 0x24, 0x83, 0x81, 0xdd, 0x8c, - 0xba, 0x4e, 0xcb, 0x98, 0x02, 0x63, 0x18, 0xf3, 0x0d, 0x8b, 0x23, 0x1a, - 0xec, 0x7d, 0xcc, 0x01, 0xe9, 0xa4, 0x7d, 0xf5, 0x47, 0x76, 0x1a, 0xf8, - 0x3a, 0x5c, 0x6d, 0xf3, 0xd3, 0x8c, 0x73, 0x43, 0x5c, 0xa9, 0x65, 0x28, - 0xa6, 0xe7, 0xad, 0x8c, 0x5a, 0xad, 0x54, 0x3f, 0x6a, 0x0b, 0x86, 0xf0, - 0x97, 0x5e, 0x60, 0x6c, 0xbe, 0x85, 0x9c, 0x8b, 0xd8, 0x34, 0xd7, 0x54, - 0xd0, 0x5c, 0x0b, 0x2c, 0x3d, 0xd3, 0x93, 0x0a, 0xc9, 0xf0, 0x64, 0xd9, - 0xc6, 0x90, 0xc7, 0x8f, 0x9d, 0xc7, 0x7e, 0x5c, 0x40, 0xca, 0xf3, 0xef, - 0x8a, 0x19, 0x3d, 0x09, 0xef, 0x0f, 0xd7, 0xcb, 0x56, 0x59, 0xc7, 0x69, - 0x0a, 0x98, 0x4d, 0xff, 0xe1, 0x03, 0x5e, 0xa3, 0xe6, 0xbb, 0xae, 0x67, - 0x52, 0x0b, 0xd4, 0x93, 0x23, 0x19, 0x0c, 0x29, 0x7b, 0x04, 0x57, 0xc4, - 0x87, 0x0e, 0xd8, 0xad, 0xa9, 0xd1, 0xfc, 0x13, 0xdc, 0xd4, 0xf9, 0x75, - 0x5e, 0xc9, 0xc7, 0x76, 0xdd, 0xcf, 0xad, 0x14, 0x49, 0x0e, 0x64, 0x76, - 0x81, 0xce, 0xf8, 0xce, 0xcd, 0x1c, 0xf6, 0x86, 0xbb, 0xaa, 0x67, 0x7f, - 0x17, 0x88, 0x3a, 0x24, 0x39, 0x7c, 0x87, 0x5d, 0xa0, 0x41, 0x63, 0xcd, - 0x6b, 0x66, 0xc7, 0x1d, 0xc7, 0xf1, 0xa0, 0x1b, 0x37, 0x1e, 0x82, 0x8b, - 0x96, 0x66, 0xeb, 0xe7, 0xc4, 0x98, 0x00, 0xe8, 0x3f, 0x09, 0x9a, 0xd3, - 0x02, 0xfa, 0xfb, 0xed, 0xcc, 0xf1, 0x7e, 0x36, 0x59, 0x16, 0xe7, 0x12, - 0x5d, 0xb9, 0x57, 0x02, 0xea, 0xe9, 0x7d, 0xff, 0x11, 0xa2, 0xb0, 0xf7, - 0x38, 0xe2, 0x3a, 0xf4, 0x39, 0xcf, 0x68, 0x06, 0x3b, 0x79, 0x0e, 0x29, - 0xa2, 0x84, 0x8d, 0x23, 0x54, 0x08, 0xe7, 0x97, 0x1d, 0x56, 0xea, 0x5c, - 0x9b, 0x5f, 0xed, 0x49, 0x65, 0x6a, 0xec, 0xa3, 0x4d, 0xb1, 0x7f, 0x13, - 0x42, 0xb2, 0xbe, 0xf5, 0x65, 0x4c, 0xf6, 0x5d, 0xb4, 0xfb, 0xcb, 0xa8, - 0xec, 0x4c, 0xb5, 0x2b, 0x20, 0x84, 0x2f, 0xba, 0x05, 0x12, 0xb6, 0xc6, - 0xc4, 0x5a, 0xbe, 0x4c, 0x8a, 0x0c, 0xdc, 0xe5, 0x01, 0x8f, 0xd4, 0xac, - 0x85, 0x0a, 0xdd, 0x40, 0x4d, 0x50, 0xfa, 0x28, 0x7e, 0x60, 0x65, 0x1e, - 0xd0, 0x7c, 0x2a, 0xb1, 0x07, 0x7e, 0x22, 0xe5, 0x78, 0x0d, 0xa1, 0xd2, - 0x95, 0x22, 0x2e, 0x63, 0xc0, 0xcc, 0x77, 0xcd, 0xd7, 0x8a, 0x2d, 0x32, - 0xfb, 0x1f, 0x0e, 0x8d, 0xf4, 0xfd, 0xfb, 0xa3, 0x13, 0x2c, 0x6c, 0x1d, - 0xfb, 0x5e, 0x50, 0xf6, 0xf8, 0x0e, 0x1f, 0x87, 0x1d, 0x97, 0x6b, 0x58, - 0x3c, 0x4d, 0x18, 0x8e, 0x30, 0x5b, 0x98, 0xaa, 0x53, 0x36, 0x58, 0x27, - 0xa0, 0x81, 0x21, 0xb0, 0x29, 0xae, 0xa1, 0x67, 0x29, 0x80, 0xe4, 0x33, - 0x24, 0x37, 0x86, 0x91, 0xac, 0x93, 0xa7, 0x27, 0x82, 0x39, 0x7f, 0x20, - 0x71, 0x4a, 0x11, 0xab, 0xa5, 0x49, 0x53, 0x7f, 0xc7, 0x0f, 0x7d, 0xe7, - 0x34, 0x7d, 0x72, 0x68, 0x0e, 0x8d, 0xde, 0xd0, 0x2c, 0xb3, 0x70, 0x6a, - 0x35, 0x32, 0xbd, 0x27, 0x6f, 0x31, 0x42, 0xb0, 0x93, 0x1d, 0x76, 0x68, - 0x9a, 0xe8, 0xc6, 0x2b, 0xb6, 0x38, 0xe0, 0xbf, 0xd4, 0x05, 0x2c, 0x9e, - 0x1c, 0x7c, 0x2d, 0xfa, 0x9e, 0x7c, 0x44, 0x20, 0xae, 0xe5, 0xc8, 0xab, - 0xda, 0x0e, 0xbc, 0xe3, 0xf5, 0xfc, 0xfe, 0x06, 0x00, 0x34, 0x4b, 0x8a, - 0x4d, 0xd5, 0xe8, 0xc6, 0x4d, 0x09, 0x53, 0xa5, 0x6b, 0x3d, 0x87, 0xad, - 0x84, 0xb7, 0x46, 0xee, 0x15, 0x50, 0x6e, 0x91, 0xf3, 0xed, 0xf0, 0xf4, - 0x57, 0xfe, 0x2c, 0x5d, 0xf2, 0x03, 0x01, 0xed, 0x68, 0x70, 0x91, 0xd4, - 0x70, 0x47, 0x29, 0x1a, 0xe9, 0xa0, 0x63, 0x56, 0x5a, 0x1f, 0x6b, 0x51, - 0x3a, 0xa2, 0xab, 0x9f, 0x55, 0x60, 0x19, 0xa0, 0x8c, 0x7d, 0x87, 0xa0, - 0x2f, 0x8e, 0xde, 0x72, 0x4d, 0x0c, 0xcd, 0xba, 0xaa, 0xe1, 0x93, 0x67, - 0x06, 0x2c, 0x08, 0xc2, 0x20, 0xea, 0x22, 0xbf, 0xdc, 0x0f, 0x37, 0x49, - 0x41, 0x87, 0x8e, 0xbb, 0xb9, 0xd8, 0xc0, 0x8b, 0x0a, 0x7a, 0x8b, 0xac, - 0xba, 0x3b, 0x4b, 0xf4, 0xea, 0x31, 0x15, 0xdd, 0x06, 0x20, 0x68, 0xa3, - 0x63, 0xcd, 0xb7, 0x9e, 0x9c, 0xd7, 0x45, 0xd3, 0x62, 0xaa, 0xb7, 0xed, - 0x20, 0x9f, 0x3f, 0x02, 0xc7, 0x5c, 0x44, 0x03, 0xfb, 0x31, 0xaf, 0xa2, - 0x43, 0x35, 0xc6, 0xc3, 0xf9, 0xea, 0xeb, 0x23, 0x12, 0xe6, 0xd5, 0xbc, - 0x7f, 0xab, 0x9b, 0xaf, 0x91, 0x35, 0xf5, 0x9a, 0x4e, 0x31, 0xf3, 0xd8, - 0xab, 0x44, 0x64, 0xd5, 0xf9, 0x38, 0x35, 0xec, 0xb3, 0x30, 0x94, 0x96, - 0x94, 0x0c, 0xfc, 0xef, 0x8b, 0x3a, 0xf8, 0x85, 0x54, 0xbd, 0xf1, 0x0f, - 0x3b, 0x91, 0xd6, 0xb2, 0x96, 0x02, 0x66, 0x7c, 0x2e, 0xf3, 0xb6, 0xcc, - 0x1e, 0x13, 0x8d, 0x48, 0x81, 0xdf, 0x94, 0xcb, 0xe7, 0x16, 0x97, 0xef, - 0x9a, 0xa3, 0x7e, 0xb7, 0x6a, 0x21, 0x0f, 0x65, 0xb7, 0x78, 0x46, 0xcf, - 0x36, 0xee, 0xd3, 0x5f, 0xa3, 0x51, 0x27, 0x07, 0x18, 0x95, 0x1e, 0x42, - 0x17, 0xf8, 0x0b, 0x27, 0xad, 0x3e, 0x10, 0x8e, 0x5d, 0x76, 0x2f, 0x80, - 0x1e, 0x16, 0x4e, 0xd4, 0xf2, 0x5b, 0xcb, 0xe7, 0x0a, 0x92, 0x23, 0x2d, - 0x93, 0x11, 0x41, 0xa7, 0x37, 0xab, 0xca, 0x0d, 0x97, 0xcf, 0x5f, 0xc7, - 0x65, 0xd2, 0x78, 0x5c, 0x35, 0xdd, 0x74, 0x9b, 0x22, 0x03, 0x83, 0x04, - 0x3a, 0x41, 0x68, 0xa6, 0xeb, 0xc4, 0x1c, 0x45, 0xe5, 0xc6, 0x7a, 0xd1, - 0x71, 0xdb, 0x23, 0x66, 0x92, 0x08, 0x1e, 0x26, 0x60, 0x15, 0xc5, 0x70, - 0x5f, 0xb9, 0x53, 0xd1, 0x06, 0x64, 0xfa, 0xb9, 0xcc, 0x3a, 0xb7, 0xa1, - 0xfa, 0xee, 0x91, 0xc9, 0xf0, 0x8f, 0xe8, 0x35, 0x71, 0x0f, 0x73, 0x4f, - 0x35, 0x5b, 0x3e, 0x2e, 0x85, 0x57, 0x73, 0xbe, 0xa4, 0x99, 0xf4, 0x9c, - 0x73, 0x79, 0xeb, 0x6b, 0xc0, 0x71, 0xc7, 0x09, 0x3a, 0xea, 0x8a, 0x90, - 0x94, 0x26, 0xdc, 0x68, 0x46, 0x14, 0x3f, 0xf5, 0x72, 0x9c, 0x07, 0x48, - 0x8b, 0x45, 0x50, 0xdc, 0x69, 0xb4, 0x58, 0x4e, 0x4d, 0x07, 0xc4, 0xc5, - 0x79, 0xf6, 0xe6, 0x33, 0xed, 0x52, 0x41, 0xe2, 0x42, 0xab, 0x38, 0x2c, - 0xb3, 0x0c, 0x31, 0x82, 0x90, 0x22, 0xb7, 0x7e, 0xc9, 0x3e, 0x42, 0xc0, - 0x96, 0xbe, 0xb6, 0x67, 0x1d, 0x8e, 0x3c, 0x0b, 0xcf, 0xb2, 0x32, 0x17, - 0x8f, 0x75, 0xf8, 0xc2, 0xdc, 0x86, 0xce, 0xf7, 0x97, 0x94, 0x76, 0x34, - 0x78, 0xc6, 0x82, 0xf3, 0xd1, 0x9e, 0xf5, 0x61, 0xb7, 0x9e, 0x37, 0xf5, - 0x86, 0x24, 0xfb, 0x0f, 0xc3, 0x2e, 0x91, 0x20, 0x7c, 0x12, 0x04, 0xdf, - 0x93, 0xfe, 0x00, 0x96, 0xa8, 0x35, 0xf2, 0xe0, 0x8f, 0xf9, 0x3d, 0xce, - 0x3d, 0x50, 0xd1, 0xbb, 0x24, 0x86, 0xa0, 0x63, 0x61, 0xb0, 0xac, 0xfd, - 0x3b, 0x64, 0x27, 0x71, 0x11, 0x98, 0x6d, 0xea, 0xf1, 0x16, 0x40, 0x01, - 0x0b, 0x9a, 0xf0, 0xb3, 0x6d, 0x17, 0x2c, 0xcf, 0x50, 0xa3, 0x59, 0x41, - 0x6d, 0x0c, 0x65, 0x24, 0x74, 0x98, 0x70, 0xdf, 0x24, 0xc3, 0x2e, 0x11, - 0x67, 0xb0, 0x12, 0x1c, 0xd5, 0xe4, 0x41, 0xf4, 0xad, 0xa2, 0xb9, 0xc4, - 0xcb, 0x66, 0x5e, 0x61, 0xdc, 0x51, 0x20, 0x0d, 0x61, 0x4b, 0xa4, 0xe1, - 0xf8, 0x59, 0x24, 0xfc, 0x12, 0xc5, 0xc6, 0xe2, 0x4b, 0x5b, 0xd0, 0xb8, - 0x45, 0x99, 0x4a, 0x77, 0xc1, 0x06, 0x27, 0xc0, 0xf7, 0xef, 0xdc, 0x5f, - 0xbd, 0x6b, 0xf6, 0xf8, 0x36, 0xaf, 0x4d, 0xa3, 0x80, 0x6b, 0xb9, 0xf6, - 0x62, 0x06, 0xb2, 0xed, 0xa2, 0x25, 0xce, 0x75, 0x6c, 0x54, 0xe9, 0x4e, - 0xa3, 0x98, 0x46, 0x99, 0x80, 0xda, 0x8c, 0xa3, 0xa7, 0xec, 0x06, 0xa8, - 0xea, 0xc5, 0xf4, 0xd8, 0x7d, 0xbe, 0x46, 0x1c, 0x29, 0xf6, 0xe0, 0xa6, - 0xef, 0x75, 0x5e, 0x9a, 0x0c, 0x4e, 0x8d, 0xfa, 0xda, 0x01, 0x2a, 0x82, - 0xdc, 0x97, 0x3e, 0x3e, 0x71, 0x92, 0x19, 0xaa, 0xdc, 0xb2, 0x3b, 0x80, - 0x50, 0x60, 0x51, 0xdc, 0x25, 0xd8, 0x97, 0x21, 0xa0, 0x20, 0xc0, 0x1a, - 0x87, 0xf3, 0x4f, 0x2f, 0x14, 0x16, 0x32, 0x7d, 0x5b, 0x07, 0x7c, 0x79, - 0xa0, 0xf1, 0xe4, 0x91, 0x27, 0x1b, 0x3a, 0x82, 0x50, 0x44, 0xc8, 0xf3, - 0x76, 0xdb, 0x6a, 0x0d, 0x6a, 0xf8, 0xb4, 0x56, 0x57, 0xce, 0xa5, 0xa4, - 0xfe, 0x02, 0xcc, 0xd6, 0xf6, 0x11, 0x8e, 0x8f, 0x31, 0xa2, 0xc2, 0x40, - 0x34, 0x23, 0x17, 0x82, 0xb6, 0xe0, 0xab, 0x89, 0xe6, 0x34, 0x1b, 0x42, - 0x71, 0x28, 0xb1, 0x31, 0xb0, 0x60, 0x93, 0x71, 0x71, 0xae, 0x90, 0xb2, - 0xe4, 0x6f, 0xeb, 0x1f, 0x51, 0xec, 0xf5, 0x2c, 0xb7, 0x9e, 0x37, 0xf5, - 0x86, 0x24, 0xfb, 0x23, 0xc7, 0x6a, 0x91, 0x4e, 0x36, 0xbf, 0xac, 0xbe, - 0x85, 0x10, 0x2a, 0x8b, 0x2a, 0xe7, 0x92, 0xd0, 0x7a, 0x5f, 0x16, 0xd5, - 0x59, 0xb5, 0xf2, 0xb3, 0x11, 0xb9, 0x23, 0x41, 0xd2, 0xf0, 0x52, 0xc1, - 0x1c, 0xc7, 0xc7, 0xe4, 0x38, 0xe1, 0xe1, 0xc0, 0x84, 0xb7, 0x68, 0x97, - 0x1e, 0x62, 0x8c, 0xdf, 0x0d, 0xb4, 0x44, 0xd9, 0x81, 0xc9, 0xd6, 0x87, - 0x28, 0x22, 0xc2, 0x51, 0x4d, 0x3c, 0x3d, 0x19, 0x6d, 0xbb, 0x29, 0xa8, - 0x02, 0x5f, 0xa2, 0xab, 0xee, 0xe8, 0x81, 0xc2, 0xbe, 0xea, 0x0c, 0xc1, - 0x88, 0xe3, 0x20, 0xf9, 0xdf, 0x46, 0x33, 0xa2, 0xba, 0xf8, 0xa6, 0xae, - 0x4b, 0x58, 0x1a, 0x90, 0xca, 0x41, 0xbd, 0xf4, 0xa3, 0x86, 0x4c, 0x30, - 0xf4, 0x4f, 0x22, 0x24, 0x53, 0x7c, 0xa4, 0xa7, 0xd8, 0xc4, 0x7f, 0xcf, - 0xab, 0xf9, 0x18, 0x52, 0xd0, 0x37, 0xbe, 0x8e, 0xc8, 0xc1, 0x4a, 0x28, - 0x9b, 0x9f, 0x9e, 0xa8, 0x93, 0x6c, 0xb1, 0xbe, 0x9f, 0xd6, 0x43, 0xce, - 0x2d, 0x7b, 0x2c, 0xca, 0x0b, 0x70, 0x9b, 0x6d, 0xa1, 0x3a, 0xbb, 0xd7, - 0x6b, 0x74, 0x4f, 0x16, 0x55, 0xb0, 0x0b, 0xfa, 0x0d, 0x47, 0x3e, 0x8d, - 0xcc, 0xc7, 0x61, 0xe6, 0x3f, 0x0e, 0xdd, 0xa8, 0x9e, 0x97, 0xa1, 0xe9, - 0x15, 0x13, 0xc3, 0xd9, 0xeb, 0xde, 0x54, 0xe5, 0x7e, 0x44, 0xcb, 0x9c, - 0x53, 0x50, 0xd5, 0x10, 0x62, 0xe7, 0x68, 0x39, 0x18, 0x3f, 0x03, 0x4a, - 0xb0, 0xdd, 0xcd, 0xc8, 0xec, 0x07, 0x45, 0x52, 0xd9, 0x38, 0x1f, 0xba, - 0xcf, 0x36, 0xfa, 0x04, 0x1a, 0xb7, 0x99, 0x40, 0xb6, 0x83, 0xc4, 0x42, - 0x20, 0x5b, 0x61, 0xe8, 0x62, 0x68, 0x3d, 0x40, 0x34, 0x71, 0xbb, 0x6f, - 0xae, 0x35, 0xc6, 0xe3, 0x81, 0x45, 0xab, 0xd3, 0x39, 0x8b, 0x20, 0x46, - 0x74, 0x43, 0x3c, 0x67, 0x4a, 0x26, 0xa2, 0x15, 0x92, 0x68, 0x0e, 0xf6, - 0x99, 0x3e, 0xdd, 0xa5, 0x70, 0x6a, 0x9d, 0xcc, 0xb0, 0x07, 0xc1, 0xa8, - 0x71, 0xb4, 0x51, 0xe9, 0xbc, 0xf9, 0x6d, 0x47, 0x7b, 0xcb, 0x37, 0xc6, - 0xe7, 0xf0, 0xab, 0x59, 0x54, 0xa9, 0x7d, 0x43, 0x8a, 0xa0, 0x15, 0x41, - 0x1b, 0xa5, 0x02, 0xc9, 0x07, 0xd5, 0xd2, 0x6c, 0x62, 0xa1, 0x48, 0xa0, - 0x96, 0x90, 0x39, 0x01, 0x8a, 0x9c, 0x3e, 0x06, 0xc2, 0x0a, 0xef, 0x29, - 0x36, 0x12, 0x0a, 0x2d, 0x7b, 0x7a, 0xfb, 0x4f, 0xfa, 0x2b, 0x68, 0x19, - 0x4e, 0xf4, 0x1f, 0x5f, 0xd2, 0x5e, 0xc7, 0xf0, 0x45, 0xf5, 0x65, 0x03, - 0x2a, 0xc5, 0xd1, 0x89, 0xc8, 0x67, 0x7f, 0x44, 0xab, 0xd8, 0x3c, 0xfb, - 0xdf, 0x9a, 0x65, 0xc9, 0x75, 0x9d, 0x0e, 0x2f, 0x7a, 0x5c, 0x7f, 0x05, - 0xdb, 0x1b, 0x75, 0xc2, 0x43, 0xac, 0x26, 0x54, 0xa3, 0xee, 0x41, 0x1c, - 0x1d, 0xd2, 0x95, 0x91, 0x15, 0x93, 0x11, 0x76, 0xa3, 0xa7, 0x5d, 0x5c, - 0x2f, 0x07, 0x38, 0x8c, 0x8e, 0xe6, 0xe0, 0x8d, 0xf6, 0x10, 0xfb, 0xcc, - 0x71, 0xfe, 0x28, 0xbc, 0x28, 0xe4, 0x1a, 0x14, 0x54, 0xce, 0x83, 0xb4, - 0x30, 0x66, 0xf3, 0xec, 0x78, 0xc9, 0x6e, 0xdb, 0x2f, 0x14, 0xfc, 0xc7, - 0xba, 0x48, 0xdc, 0xe8, 0x1f, 0x4e, 0xa3, 0x73, 0xfd, 0x57, 0xa6, 0x75, - 0x85, 0x15, 0xf9, 0x47, 0xab, 0xd1, 0x22, 0xfc, 0x84, 0x0a, 0x7b, 0xb8, - 0xbe, 0xf6, 0xd0, 0x55, 0x59, 0x22, 0xc2, 0xf5, 0x39, 0xdf, 0x4f, 0xd8, - 0x6a, 0x4e, 0x53, 0xd4, 0xa2, 0x5e, 0x7c, 0x31, 0x37, 0xe3, 0x86, 0x77, - 0xa7, 0x47, 0x3c, 0x16, 0xa8, 0x9b, 0x5e, 0x17, 0xb2, 0xc3, 0x55, 0xed, - 0xa3, 0x5c, 0x62, 0x65, 0x50, 0xfc, 0xf4, 0xcb, 0x20, 0x3d, 0xcd, 0xc8, - 0xa5, 0x91, 0x38, 0x09, 0x9c, 0x89, 0x34, 0x6d, 0x6d, 0xc6, 0xf9, 0x74, - 0x97, 0x09, 0xe0, 0xce, 0x22, 0x76, 0x70, 0xe2, 0xed, 0x42, 0x61, 0x45, - 0xab, 0x5f, 0x93, 0x93, 0x76, 0xa1, 0x30, 0x29, 0xd8, 0xfb, 0x53, 0xcb, - 0x1b, 0x28, 0xc1, 0x48, 0xdd, 0x3c, 0x1a, 0x5d, 0x43, 0x84, 0x81, 0x31, - 0xad, 0x15, 0xb6, 0xd9, 0x27, 0x34, 0xb8, 0x42, 0x11, 0x26, 0x54, 0xba, - 0x5b, 0xa4, 0xb2, 0xbd, 0x53, 0xfd, 0xf1, 0x89, 0x54, 0xff, 0x39, 0x41, - 0x60, 0x5b, 0x3f, 0xe8, 0x0b, 0xe7, 0xb9, 0x74, 0xfc, 0x20, 0x70, 0x54, - 0xcb, 0xfc, 0x2b, 0xda, 0x9f, 0x30, 0x45, 0x45, 0xe6, 0x2c, 0xf2, 0xfa, - 0xf6, 0xef, 0x03, 0x03, 0x16, 0x79, 0xf7, 0xd6, 0x19, 0x11, 0x9d, 0x46, - 0x73, 0xe3, 0x53, 0xee, 0x45, 0xa0, 0x1a, 0x2e, 0x77, 0x78, 0xb0, 0x5f, - 0x06, 0x06, 0x08, 0xe5, 0x47, 0x0a, 0xce, 0xe2, 0x16, 0x7d, 0x99, 0xcc, - 0x98, 0x11, 0xbf, 0x26, 0xe4, 0x40, 0x89, 0xb4, 0xc0, 0xfb, 0xcc, 0x20, - 0xe8, 0xf8, 0xad, 0xc9, 0x11, 0x58, 0xed, 0xf9, 0x91, 0x3c, 0x8b, 0x5d, - 0xb7, 0xf7, 0xbc, 0x5e, 0x33, 0xc4, 0xf4, 0xe9, 0x0a, 0x2d, 0x62, 0x9a, - 0x49, 0x62, 0x5c, 0x9e, 0x76, 0xba, 0x26, 0x13, 0xbc, 0x71, 0xbd, 0x6c, - 0x42, 0x51, 0x88, 0x11, 0xba, 0x48, 0xce, 0xad, 0xf4, 0x23, 0x82, 0x5f, - 0x69, 0xe5, 0x9f, 0x50, 0xf8, 0x88, 0xb2, 0xdb, 0x47, 0x78, 0x8e, 0x1c, - 0x8e, 0x9a, 0xe8, 0xb6, 0xe3, 0x2c, 0xe5, 0xdc, 0xdb, 0xd0, 0xa1, 0xe7, - 0x5f, 0x99, 0xc6, 0x17, 0x0b, 0x8a, 0x45, 0x8f, 0x24, 0x16, 0xd4, 0xd3, - 0xcb, 0x49, 0x90, 0xbd, 0x93, 0x2e, 0xef, 0xe9, 0xb5, 0x5c, 0x69, 0xb2, - 0x79, 0xec, 0x76, 0x3a, 0xbe, 0xcc, 0x69, 0x5c, 0x2d, 0x74, 0x42, 0xe2, - 0x23, 0x43, 0xb0, 0xe6, 0xbd, 0x66, 0x25, 0x11, 0x9a, 0x0f, 0x48, 0xd8, - 0x32, 0x9f, 0x7a, 0x68, 0xc1, 0x75, 0x63, 0x92, 0x5a, 0xdd, 0xda, 0x6b, - 0xb5, 0x29, 0xec, 0x97, 0xba, 0xda, 0x88, 0xef, 0x97, 0x85, 0x70, 0x99, - 0x61, 0x88, 0x3c, 0xe0, 0xd2, 0xca, 0xde, 0xb3, 0xc2, 0x2b, 0x2b, 0x11, - 0xdc, 0xf0, 0x6f, 0xf5, 0x98, 0xce, 0xa1, 0x21, 0x42, 0x9f, 0x98, 0x69, - 0x22, 0x65, 0x4c, 0xa2, 0x4a, 0x77, 0x3e, 0x20, 0xde, 0x3d, 0x3b, 0xd7, - 0x9b, 0x55, 0x91, 0x6c, 0xd5, 0xb9, 0xcc, 0xf7, 0xed, 0xad, 0x8a, 0xd3, - 0xda, 0x6e, 0x39, 0xa9, 0x8f, 0x6d, 0x00, 0x1e, 0x04, 0x66, 0x51, 0xf2, - 0x50, 0x40, 0x27, 0x18, 0x02, 0xee, 0x47, 0x89, 0x94, 0x62, 0xbc, 0xc4, - 0x94, 0xab, 0x4f, 0x04, 0xd6, 0x2a, 0x51, 0x55, 0x8e, 0xa9, 0xb6, 0xa1, - 0x71, 0x28, 0x7d, 0x06, 0x7c, 0xb5, 0xc4, 0xcd, 0x06, 0x69, 0xc7, 0x2b, - 0xde, 0x65, 0x91, 0x01, 0x97, 0x16, 0xb4, 0xbe, 0xc9, 0xcb, 0x30, 0x77, - 0x4e, 0x1f, 0x6b, 0xa8, 0x2d, 0x40, 0x80, 0x6c, 0x95, 0x27, 0x42, 0x68, - 0x64, 0xc7, 0x25, 0x22, 0xf8, 0xa4, 0x80, 0xa6, 0xed, 0x2e, 0xba, 0xb0, - 0x29, 0x4f, 0xe3, 0x66, 0x1b, 0x32, 0x54, 0x5f, 0x99, 0x14, 0xdd, 0x2e, - 0x0d, 0x7f, 0x6e, 0xe5, 0xe8, 0x30, 0x4a, 0x8e, 0x65, 0xc5, 0xca, 0xdb, - 0xe7, 0xae, 0xcc, 0xea, 0x5f, 0xf7, 0xb6, 0x3b, 0x9a, 0x4e, 0x8e, 0xd8, - 0xc0, 0x45, 0x8f, 0x58, 0x7a, 0x6f, 0xa2, 0x3c, 0xd5, 0x34, 0x2d, 0xfd, - 0x92, 0x5f, 0x74, 0xd8, 0x15, 0x1f, 0xa1, 0x5e, 0xa4, 0x0c, 0xe3, 0x50, - 0x7f, 0xbf, 0xd2, 0xfd, 0xd2, 0xec, 0xf2, 0x38, 0xf9, 0x46, 0xf4, 0xed, - 0x9d, 0xff, 0x86, 0x19, 0x7e, 0x62, 0xc7, 0xd6, 0xda, 0x94, 0xad, 0xa3, - 0x87, 0x92, 0xc9, 0xe9, 0xdb, 0xcc, 0x6b, 0xc9, 0xb2, 0x78, 0x3f, 0x64, - 0x24, 0xa4, 0x7d, 0x09, 0x75, 0x23, 0xa7, 0x08, 0xfa, 0x31, 0x57, 0x39, - 0x8a, 0xac, 0x0e, 0x28, 0x0d, 0xa1, 0x58, 0x98, 0x16, 0x84, 0x4a, 0x31, - 0x82, 0x03, 0xf5, 0x53, 0x50, 0xa1, 0x16, 0xf1, 0xd2, 0xfc, 0x6f, 0x24, - 0x36, 0x57, 0x53, 0x9b, 0x62, 0x79, 0xb9, 0xf0, 0x7a, 0xdd, 0x96, 0x84, - 0xf2, 0x8c, 0x13, 0x49, 0x56, 0x71, 0x31, 0x36, 0x16, 0x86, 0xa6, 0xaf, - 0xa6, 0xa1, 0xb3, 0x21, 0x87, 0x44, 0x64, 0x17, 0x82, 0xa5, 0xd4, 0x3a, - 0x3b, 0x66, 0xb5, 0xa1, 0x39, 0x2e, 0x96, 0x84, 0x37, 0x4f, 0x76, 0x8d, - 0x83, 0xf8, 0xf3, 0xee, 0xd2, 0xb6, 0xb6, 0x51, 0xdf, 0xc2, 0xaa, 0x80, - 0x21, 0xc6, 0x6e, 0xa7, 0x60, 0xfd, 0x49, 0xfd, 0x7b, 0x70, 0xa0, 0x0b, - 0xbe, 0xd3, 0x03, 0x0e, 0x81, 0xed, 0xad, 0x84, 0x52, 0xe9, 0x45, 0xa7, - 0xa4, 0x53, 0x34, 0xb7, 0xac, 0x05, 0x86, 0xad, 0x82, 0x3b, 0xe9, 0x90, - 0xff, 0x1e, 0xcc, 0xc7, 0x81, 0x96, 0xbe, 0xf8, 0xc0, 0xbc, 0xd2, 0xe1, - 0x0f, 0xd3, 0xf7, 0x5f, 0x4b, 0x70, 0x9f, 0x1a, 0x80, 0xb5, 0xfd, 0xde, - 0x1a, 0x8a, 0xad, 0x56, 0xd4, 0x36, 0x81, 0xc7, 0x12, 0xae, 0xa1, 0xb3, - 0x6c, 0xbf, 0x4a, 0x39, 0x0d, 0x16, 0xb2, 0x71, 0x43, 0x7c, 0x31, 0x4a, - 0x9a, 0x32, 0xf9, 0xf5, 0x31, 0xd2, 0x9a, 0x6f, 0x86, 0xd9, 0x02, 0xba, - 0x08, 0x1a, 0x19, 0xed, 0x7d, 0x4e, 0xe2, 0xcc, 0x91, 0xc9, 0xb5, 0x06, - 0xc7, 0xed, 0x21, 0xf5, 0x88, 0x1a, 0x81, 0x63, 0x3e, 0x25, 0x2a, 0xab, - 0xa8, 0x3e, 0x7a, 0x15, 0x19, 0x90, 0x46, 0xc3, 0xa1, 0x38, 0xf5, 0xa8, - 0x70, 0xef, 0x35, 0x10, 0x4a, 0x2d, 0x69, 0xf6, 0xd8, 0x27, 0x83, 0x2d, - 0xa0, 0xa9, 0xfc, 0xfb, 0xcd, 0x97, 0x87, 0x3a, 0x99, 0x1b, 0xaf, 0x19, - 0x36, 0xe9, 0x08, 0xd0, 0xe6, 0x4f, 0x3b, 0xa1, 0xe0, 0x99, 0xfe, 0x47, - 0x6a, 0x46, 0x27, 0xd2, 0x7f, 0x7c, 0x5b, 0x2b, 0xaa, 0x1d, 0x0a, 0x16, - 0xf7, 0xd3, 0x80, 0x3a, 0x0b, 0xd5, 0x3f, 0xde, 0x71, 0x00, 0x8e, 0x7b, - 0xc3, 0xdf, 0x0b, 0x81, 0x44, 0xa9, 0xdb, 0x5f, 0xb7, 0x44, 0x6c, 0xd4, - 0xba, 0x15, 0xae, 0xab, 0x63, 0x7c, 0x3e, 0x2d, 0xb1, 0x2a, 0x4d, 0x82, - 0x05, 0xf1, 0xd0, 0x64, 0x2a, 0xf2, 0x8f, 0x4f, 0xd8, 0x17, 0xd7, 0x60, - 0xfe, 0x76, 0x38, 0x7a, 0xc7, 0x2b, 0x4f, 0xea, 0x34, 0xda, 0xaf, 0xd6, - 0x2c, 0x16, 0xb6, 0x0e, 0x54, 0x9e, 0x07, 0x65, 0xba, 0x02, 0x83, 0x04, - 0x46, 0x16, 0xf5, 0x39, 0x72, 0x80, 0x32, 0x54, 0xe6, 0xce, 0x69, 0x4d, - 0x64, 0xb9, 0x10, 0x6f, 0x87, 0x5f, 0x90, 0x53, 0x7d, 0x19, 0xc6, 0xea, - 0x93, 0x35, 0x07, 0x43, 0xa4, 0x12, 0xfc, 0xe5, 0x56, 0xe6, 0xc6, 0xf1, - 0x15, 0xe5, 0x07, 0x6b, 0xcd, 0x90, 0x82, 0xbb, 0x00, 0x5b, 0x01, 0xfc, - 0x0b, 0x3d, 0x42, 0xaf, 0x9a, 0xaa, 0xe7, 0x8f, 0x5c, 0x7f, 0x7a, 0xfc, - 0x8c, 0x35, 0xf6, 0x3a, 0xc7, 0x40, 0x72, 0xdd, 0xe5, 0x76, 0x9b, 0xbb, - 0xd5, 0x48, 0xe7, 0xce, 0x0d, 0xdd, 0x25, 0x9e, 0xb3, 0x88, 0x7b, 0x0f, - 0x75, 0x4a, 0x5a, 0x10, 0x35, 0xb2, 0xc4, 0x94, 0x22, 0x8f, 0xd2, 0x00, - 0x73, 0xf8, 0xdb, 0xf6, 0x1d, 0xac, 0x28, 0x97, 0x3e, 0x4f, 0x64, 0xec, - 0x07, 0x77, 0x31, 0x12, 0x57, 0xea, 0xb1, 0x34, 0xc8, 0xc0, 0x8f, 0x58, - 0xf9, 0xac, 0xe0, 0x03, 0x75, 0x10, 0x18, 0xad, 0xfa, 0xd5, 0x17, 0x89, - 0xfa, 0xc5, 0x36, 0xdf, 0x46, 0xa3, 0x59, 0xc2, 0xd7, 0xda, 0xc4, 0x85, - 0x47, 0x58, 0xb7, 0x66, 0x7a, 0x03, 0xfa, 0x77, 0xc1, 0x09, 0xda, 0x1f, - 0xd0, 0x36, 0xbb, 0x94, 0xc3, 0xde, 0x34, 0x3f, 0x60, 0x0f, 0xaa, 0x1c, - 0x95, 0xd7, 0x95, 0x31, 0xb1, 0x61, 0x0e, 0x82, 0x27, 0x81, 0x96, 0x62, - 0xfe, 0xd7, 0x1f, 0x13, 0xab, 0x8a, 0x3f, 0x5f, 0x76, 0xdf, 0x1a, 0xfa, - 0xc8, 0x9e, 0xc5, 0xbe, 0x6b, 0x49, 0xb4, 0x0a, 0x73, 0x33, 0x8c, 0x6f, - 0x8d, 0x1f, 0x09, 0x67, 0x43, 0x64, 0xc4, 0xd2, 0x35, 0x6a, 0x54, 0xa3, - 0xce, 0xb4, 0x6d, 0x7c, 0x3c, 0xf1, 0x7f, 0x5f, 0x0c, 0x40, 0xad, 0x57, - 0x48, 0x3e, 0xe3, 0xec, 0x27, 0xa2, 0x3d, 0x12, 0xc5, 0xa8, 0x5d, 0x2b, - 0x9b, 0x53, 0xcb, 0xaf, 0xf6, 0x37, 0xdf, 0xa7, 0x33, 0xf0, 0x3c, 0x19, - 0x46, 0x26, 0x68, 0x1b, 0xaf, 0x8f, 0xa9, 0x97, 0x8d, 0xc5, 0x1f, 0xf4, - 0xf6, 0xde, 0x42, 0x43, 0xb3, 0x95, 0x2d, 0x3f, 0x10, 0xc3, 0xde, 0xb9, - 0x61, 0x68, 0x41, 0xee, 0x7a, 0x7e, 0xfe, 0x15, 0x57, 0xe5, 0x9b, 0x78, - 0x5c, 0xcb, 0x65, 0x1c, 0x0f, 0x53, 0xf2, 0x63, 0xd1, 0x69, 0xa0, 0x17, - 0x5c, 0x08, 0x57, 0xe9, 0x98, 0x97, 0xa0, 0x80, 0xab, 0x81, 0xb3, 0xd9, - 0xbe, 0x17, 0x38, 0xc1, 0x2d, 0x96, 0xa2, 0xea, 0x95, 0xa2, 0x3c, 0xec, - 0x21, 0x82, 0x41, 0x73, 0x75, 0x43, 0xf9, 0x61, 0x75, 0xbf, 0xda, 0x1b, - 0x28, 0xaf, 0x01, 0x40, 0x2e, 0xda, 0xed, 0x1b, 0xf3, 0x08, 0xdf, 0x60, - 0xa7, 0x1b, 0x46, 0x90, 0xd6, 0xe9, 0xe3, 0x64, 0xee, 0xd4, 0x69, 0xa3, - 0x56, 0xc3, 0xb2, 0x1a, 0xf7, 0xb3, 0xc2, 0x50, 0x7b, 0x3e, 0x89, 0x91, - 0x33, 0x50, 0x31, 0x4f, 0x23, 0xc7, 0xb3, 0xd0, 0xec, 0xa4, 0xd5, 0x1d, - 0xa7, 0x23, 0xf2, 0x36, 0xf6, 0xc8, 0x0b, 0x9e, 0xd9, 0x78, 0x93, 0xf2, - 0xa9, 0xec, 0xa6, 0x74, 0x55, 0xb4, 0x69, 0x21, 0x51, 0x8b, 0x20, 0x42, - 0xce, 0xc8, 0x8b, 0x6f, 0x78, 0x93, 0x43, 0x37, 0xce, 0xd1, 0x7d, 0x44, - 0x30, 0xeb, 0x79, 0x5e, 0x15, 0xf3, 0x07, 0x66, 0xf0, 0xab, 0xcd, 0xe3, - 0x86, 0x01, 0xd0, 0x87, 0x9f, 0x72, 0x58, 0xf4, 0xd7, 0xfc, 0xde, 0x54, - 0x0b, 0x4f, 0x92, 0x00, 0xb8, 0x89, 0x72, 0xcd, 0x83, 0xfb, 0x97, 0xc5, - 0xba, 0xa4, 0x56, 0x95, 0x32, 0x5a, 0x8a, 0xee, 0xfa, 0x8d, 0xb7, 0x82, - 0x1b, 0xc8, 0xd0, 0x29, 0x26, 0x37, 0x8d, 0x10, 0xcf, 0x5e, 0x9b, 0xef, - 0x48, 0xf9, 0xbf, 0x8a, 0xc0, 0x19, 0x12, 0x72, 0x1c, 0x59, 0xf6, 0xd8, - 0x81, 0x86, 0x7b, 0x7a, 0x30, 0x94, 0x94, 0x0b, 0xa9, 0xe5, 0x90, 0x5e, - 0x91, 0x15, 0x3f, 0x85, 0x46, 0xa4, 0x51, 0xcc, 0x4d, 0x7c, 0x5e, 0x71, - 0xbc, 0x99, 0x74, 0x1b, 0xec, 0x47, 0x16, 0x9e, 0xb7, 0x5f, 0x57, 0x61, - 0x97, 0x3d, 0x0d, 0x39, 0x31, 0xa6, 0x40, 0x24, 0x54, 0x29, 0xc2, 0x83, - 0xf7, 0x20, 0x6c, 0xf3, 0xd0, 0x49, 0x79, 0x9d, 0x22, 0x81, 0x6e, 0x88, - 0x37, 0xfb, 0xf8, 0x39, 0xbb, 0x3b, 0x4b, 0xe5, 0xa7, 0xb6, 0x06, 0x7d, - 0x7d, 0xa3, 0xa9, 0x02, 0x21, 0x0e, 0x49, 0x24, 0xfb, 0xd3, 0xf2, 0x95, - 0x7e, 0xfa, 0x45, 0xf1, 0x1b, 0x9c, 0xa8, 0xd1, 0x70, 0x19, 0x28, 0x24, - 0x7b, 0xe7, 0x95, 0x70, 0x02, 0x6c, 0x01, 0xc8, 0x16, 0xf2, 0xba, 0x4f, - 0xd4, 0xd1, 0x31, 0x5e, 0x1b, 0x45, 0x8b, 0x10, 0xd5, 0xbd, 0xad, 0x8d, - 0x6d, 0x3a, 0x63, 0xbf, 0x8b, 0x3c, 0x02, 0x8e, 0x02, 0x75, 0x77, 0x2a, - 0x2c, 0xa5, 0x3f, 0x92, 0x02, 0x5f, 0xfb, 0xd7, 0x75, 0x65, 0x9e, 0x9c, - 0x63, 0x68, 0x54, 0x9e, 0x6a, 0x72, 0xf8, 0xeb, 0x97, 0x97, 0x46, 0xc5, - 0x27, 0x3e, 0x6a, 0xe3, 0x11, 0x18, 0x5a, 0xec, 0x69, 0x6f, 0x1d, 0xc8, - 0xfe, 0x82, 0x67, 0x71, 0xb1, 0xd9, 0xa9, 0x5e, 0xb2, 0xd4, 0xb1, 0xae, - 0x3c, 0xc6, 0x6c, 0xfb, 0x78, 0x9c, 0x11, 0x5b, 0xc9, 0xd5, 0x19, 0x3f, - 0xb3, 0x91, 0x0b, 0xb1, 0xe6, 0x07, 0xfa, 0x7f, 0x51, 0xa1, 0x76, 0x3b, - 0x77, 0xd5, 0x20, 0x5c, 0xa7, 0xea, 0xa2, 0x8b, 0xa1, 0x98, 0x50, 0x3c, - 0x71, 0x2f, 0xfa, 0xff, 0xe8, 0xd8, 0xe5, 0x4c, 0xe1, 0x88, 0x38, 0x79, - 0x87, 0xc8, 0x76, 0x19, 0x11, 0xd4, 0x19, 0xaa, 0xfd, 0x71, 0x97, 0xc1, - 0x97, 0x46, 0x12, 0xce, 0xc6, 0xba, 0x53, 0xbf, 0xa0, 0x12, 0x8d, 0x1d, - 0x01, 0xe5, 0xd0, 0x32, 0x8e, 0x9a, 0x2f, 0x5b, 0x66, 0x3e, 0x5c, 0x03, - 0x84, 0xfa, 0x47, 0xb8, 0x3a, 0xc6, 0xc0, 0x99, 0x3d, 0xb9, 0xb5, 0x09, - 0x70, 0x9b, 0x50, 0xce, 0xc5, 0xb9, 0xa5, 0x41, 0x5d, 0xfd, 0xed, 0x14, - 0x25, 0x41, 0xdc, 0xd0, 0xa7, 0x33, 0xe7, 0x46, 0x51, 0xd6, 0xe4, 0x1b, - 0x90, 0x52, 0xd1, 0xf3, 0x8a, 0x5c, 0xaa, 0x15, 0x6d, 0x67, 0x61, 0x30, - 0x85, 0xf9, 0x43, 0xb0, 0x23, 0x6e, 0x34, 0xb2, 0x30, 0x37, 0xfb, 0x61, - 0xf0, 0xa4, 0x9e, 0xf1, 0x56, 0x8c, 0xfd, 0x2d, 0x1b, 0xb8, 0xa2, 0x70, - 0xdd, 0x95, 0x33, 0xe9, 0x56, 0x7a, 0xf5, 0x61, 0xd1, 0xa5, 0xb4, 0x84, - 0x4f, 0x15, 0x12, 0xa3, 0xd7, 0x42, 0x9a, 0x5a, 0x5f, 0x6a, 0x19, 0xc4, - 0x7c, 0x81, 0x71, 0x10, 0xec, 0xd9, 0x6a, 0xc1, 0x8c, 0x75, 0xb0, 0xa4, - 0xf3, 0x92, 0xf6, 0x31, 0x5f, 0x67, 0x36, 0xcf, 0x7e, 0x99, 0xea, 0x01, - 0x34, 0xa8, 0x90, 0x64, 0xd7, 0x01, 0xbc, 0xe8, 0xde, 0x25, 0xef, 0x08, - 0x6a, 0xb3, 0xf4, 0xca, 0x8d, 0x28, 0x29, 0x81, 0xc3, 0x35, 0xa4, 0x86, - 0x36, 0xb2, 0xa8, 0x63, 0x60, 0x65, 0x49, 0x16, 0xc0, 0xda, 0xfa, 0x1d, - 0x91, 0xc2, 0xe3, 0x53, 0x46, 0xa5, 0x31, 0x7a, 0xa9, 0x90, 0xfb, 0xe7, - 0x42, 0xdd, 0x20, 0xfa, 0x5b, 0xbb, 0x40, 0x30, 0xe4, 0x2b, 0x12, 0x31, - 0x5b, 0xbe, 0x30, 0x97, 0x0b, 0x7c, 0x00, 0x46, 0xe5, 0x24, 0x76, 0xf8, - 0xdb, 0x41, 0xb9, 0x0e, 0xd0, 0xbc, 0x13, 0x58, 0xf5, 0xe5, 0x38, 0x50, - 0xef, 0xab, 0x08, 0x72, 0x3c, 0x11, 0x33, 0x91, 0x00, 0x78, 0xf8, 0xa8, - 0xfb, 0xa0, 0x83, 0xe9, 0xee, 0xab, 0x31, 0x6f, 0xaa, 0x0e, 0xa4, 0x7f, - 0x7b, 0x95, 0x34, 0x80, 0x6f, 0x4b, 0x8f, 0x63, 0x39, 0xc8, 0x68, 0x9e, - 0xff, 0x69, 0xc8, 0x7d, 0x64, 0xd4, 0xbb, 0x6e, 0xd1, 0xf3, 0x9f, 0x49, - 0x95, 0x99, 0x5c, 0xb7, 0x50, 0xe0, 0x96, 0x13, 0xf1, 0xe6, 0x99, 0x18, - 0x34, 0x1d, 0x20, 0x27, 0x0c, 0x3e, 0x83, 0x89, 0x1b, 0x20, 0x41, 0x5a, - 0x0e, 0x44, 0xae, 0x89, 0x0f, 0x79, 0xb4, 0x95, 0x53, 0x40, 0xfa, 0xe2, - 0xeb, 0x7b, 0x80, 0x11, 0x10, 0xa9, 0xe5, 0xac, 0x30, 0xcb, 0x44, 0x3f, - 0x1a, 0xa2, 0x07, 0x3a, 0x8b, 0xe7, 0x01, 0x9f, 0x35, 0x56, 0xce, 0x15, - 0xdd, 0xef, 0x95, 0x09, 0x8f, 0xac, 0xf1, 0x29, 0xd0, 0x96, 0xa4, 0xeb, - 0xd3, 0xd8, 0x99, 0x6f, 0xed, 0xcf, 0x29, 0xbb, 0x5c, 0xbe, 0xf6, 0x31, - 0x59, 0x5a, 0xae, 0x73, 0x3a, 0x05, 0x89, 0xc0, 0x11, 0x5b, 0x96, 0x05, - 0x34, 0xf2, 0x58, 0xfb, 0xe3, 0x48, 0x80, 0xa6, 0x64, 0xe1, 0x1a, 0x21, - 0x3b, 0xf2, 0xc3, 0x14, 0x35, 0xf6, 0xd9, 0xe5, 0x3c, 0x26, 0x63, 0xa2, - 0xdb, 0x14, 0xac, 0xce, 0xfe, 0x92, 0x24, 0xb8, 0xb5, 0x46, 0xde, 0xa1, - 0xd7, 0x48, 0xa2, 0x34, 0xb1, 0x88, 0x94, 0xf2, 0x26, 0x3a, 0xc8, 0xcb, - 0xaa, 0x22, 0x49, 0xf9, 0x27, 0x1a, 0x4b, 0xe0, 0xf5, 0xa0, 0x57, 0xe7, - 0xce, 0xa4, 0x73, 0x1c, 0x38, 0x25, 0xdd, 0x7e, 0x6b, 0xe3, 0x68, 0x71, - 0xa2, 0x2e, 0xdd, 0xe5, 0x01, 0x71, 0xe4, 0x9d, 0x6d, 0x8d, 0xeb, 0xb5, - 0x53, 0x80, 0x89, 0x3e, 0xe2, 0x22, 0x37, 0xbe, 0x0e, 0x20, 0xa4, 0x65, - 0xb0, 0xfa, 0x68, 0x69, 0xeb, 0x59, 0x71, 0xee, 0x7d, 0x69, 0xaf, 0xbb, - 0x50, 0x6b, 0x7d, 0x80, 0x01, 0xfe, 0x49, 0x53, 0xf0, 0x04, 0xc4, 0xef, - 0x0d, 0x24, 0x81, 0xca, 0x39, 0x5d, 0x62, 0x28, 0x47, 0x0a, 0xde, 0x7c, - 0xb0, 0x89, 0x5c, 0x26, 0xb3, 0x36, 0x36, 0x3f, 0xb7, 0x19, 0x4b, 0xa6, - 0xf6, 0x07, 0x2c, 0xd1, 0xac, 0x9e, 0x95, 0x12, 0xb1, 0x89, 0x6a, 0x8a, - 0x04, 0x7f, 0x77, 0xdf, 0x8a, 0x30, 0x27, 0x44, 0x68, 0x37, 0x7e, 0xdd, - 0x53, 0x5d, 0xc0, 0xb4, 0x7e, 0x87, 0x3f, 0x24, 0xa0, 0xad, 0x84, 0x01, - 0x0d, 0x1a, 0x82, 0xd5, 0xda, 0x04, 0xe6, 0xa1, 0x5b, 0xe8, 0xfe, 0x8d, - 0xbf, 0xca, 0x91, 0x36, 0x15, 0x05, 0x47, 0x5b, 0xbe, 0xa8, 0x3b, 0xf0, - 0xf8, 0x29, 0x0b, 0x2f, 0xa6, 0x3c, 0x01, 0x88, 0xc2, 0xeb, 0x94, 0x7f, - 0x41, 0xee, 0x64, 0x6c, 0x6d, 0x34, 0xa9, 0x05, 0x20, 0x49, 0xe3, 0x4e, - 0xd3, 0x5b, 0xfe, 0xd4, 0xb5, 0x9f, 0x85, 0xa9, 0x52, 0x2f, 0x14, 0x11, - 0x32, 0x26, 0xde, 0xea, 0xc9, 0x72, 0xb7, 0x50, 0x0e, 0xb6, 0x6e, 0x7a, - 0x41, 0x70, 0x12, 0xcc, 0xfb, 0x29, 0x38, 0xba, 0x1e, 0xcf, 0x4a, 0x0f, - 0x12, 0xa4, 0x50, 0xcc, 0xdb, 0xd7, 0x44, 0x7d, 0x81, 0xa0, 0x39, 0x71, - 0x30, 0x74, 0x05, 0x0f, 0x59, 0x4e, 0xbb, 0xf9, 0xb7, 0xd8, 0xab, 0x97, - 0x7a, 0xac, 0x10, 0xb3, 0x0b, 0x48, 0xb3, 0x38, 0x49, 0xf1, 0xb3, 0x5b, - 0x3f, 0xb1, 0x9d, 0x3b, 0x67, 0x5a, 0xcf, 0x5e, 0x6a, 0xa2, 0xe2, 0x51, - 0xdd, 0xd4, 0x2d, 0x89, 0x5a, 0x8d, 0x4d, 0xa2, 0x56, 0x2f, 0xc0, 0x20, - 0x87, 0xd5, 0x9a, 0x18, 0x17, 0x64, 0x71, 0xc3, 0x1c, 0x9f, 0x49, 0xe8, - 0xc1, 0xd3, 0x40, 0x2f, 0x5c, 0x7a, 0xe7, 0xa4, 0x44, 0xe7, 0x16, 0xa1, - 0x72, 0x9b, 0x20, 0x44, 0x85, 0xc5, 0xe5, 0xfb, 0x2c, 0x85, 0xe3, 0x00, - 0x03, 0xf0, 0xaf, 0x7b, 0xe2, 0xe8, 0x6f, 0x82, 0xbc, 0xad, 0xcc, 0xae, - 0x3d, 0x1c, 0x9d, 0xca, 0xcc, 0xa9, 0x5c, 0xd7, 0xe3, 0x8c, 0x70, 0xbe, - 0xda, 0x8c, 0x6f, 0x08, 0xee, 0xde, 0x47, 0x2b, 0x84, 0x87, 0xce, 0x7c, - 0x2c, 0x63, 0xe7, 0x80, 0x38, 0x42, 0x53, 0xa8, 0x37, 0xa1, 0xa2, 0x22, - 0x75, 0x25, 0x20, 0x95, 0x30, 0xdd, 0xdc, 0xa4, 0xc3, 0xb1, 0x17, 0x05, - 0x64, 0x31, 0xba, 0x99, 0x06, 0xde, 0x8f, 0x99, 0xd6, 0x0c, 0xf2, 0x55, - 0x76, 0x9f, 0xb7, 0x75, 0x81, 0x59, 0xf0, 0x69, 0x58, 0xca, 0x5e, 0x1f, - 0xb0, 0xe9, 0x6f, 0x52, 0xf7, 0x48, 0xee, 0x58, 0x66, 0xbb, 0x8e, 0x6e, - 0x8e, 0xa6, 0x49, 0x14, 0x5b, 0xa2, 0xbb, 0x7b, 0x65, 0xdf, 0xe8, 0xaf, - 0x4f, 0x64, 0x12, 0x82, 0x4d, 0x52, 0x44, 0x89, 0x3b, 0xff, 0x6b, 0x71, - 0x98, 0x09, 0xce, 0x19, 0x5d, 0x21, 0xb6, 0xbb, 0x2f, 0xfa, 0x46, 0x46, - 0x28, 0xc3, 0xdd, 0x4a, 0xc0, 0xb4, 0x72, 0x9e, 0x5c, 0xe1, 0x40, 0x30, - 0xd7, 0x19, 0xc8, 0xc0, 0xe8, 0x80, 0x1a, 0x0c, 0x21, 0xad, 0x05, 0x46, - 0xdb, 0xca, 0x5d, 0x0b, 0x6a, 0xfc, 0x2f, 0xeb, 0xfa, 0x41, 0x35, 0x9c, - 0xaf, 0x27, 0x11, 0x57, 0x26, 0xa3, 0xe6, 0x92, 0x50, 0xc5, 0x16, 0x46, - 0xa0, 0xa6, 0x7e, 0xb1, 0xe6, 0x40, 0x04, 0x77, 0xf5, 0x46, 0x96, 0xe9, - 0x49, 0x16, 0xaa, 0x7f, 0xe0, 0xcb, 0xfc, 0x7b, 0xc2, 0xd9, 0xb4, 0x51, - 0x35, 0x4f, 0x96, 0xdb, 0x51, 0xf7, 0x13, 0x75, 0xd6, 0x8b, 0xa1, 0x94, - 0xbf, 0x14, 0xf3, 0x46, 0xa2, 0xa1, 0x1b, 0xc5, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x00, 0xad, 0x88, 0x41, 0x0b, 0x6c, 0xe9, 0xf1, 0x5a, 0x19, 0x6a, 0xa5, - 0x53, 0x5f, 0x10, 0x48, 0x4d, 0x35, 0xe1, 0xc6, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x6b, 0x26, 0x6c, 0xf4, 0xdb, 0x30, 0xd9, 0xb5, 0xb5, 0xaa, 0xc8, 0x7e, - 0x45, 0x86, 0xa2, 0x57, 0xc9, 0x00, 0x3b, 0xca, 0x5a, 0xa2, 0x53, 0xc3, - 0x30, 0x4e, 0x1e, 0xb6, 0xb4, 0x79, 0x8b, 0x06, 0x51, 0xc7, 0x7c, 0xf6, - 0xaf, 0xc2, 0x88, 0x26, 0x9a, 0xcc, 0xf6, 0x70, 0x65, 0x29, 0x13, 0x45, - 0xc4, 0x72, 0x47, 0xe4, 0x60, 0xd5, 0x46, 0x82, 0xda, 0x4a, 0x89, 0xf0, - 0x1e, 0xdb, 0xab, 0x49, 0x74, 0x9e, 0x1a, 0x6f, 0x22, 0xb8, 0x5b, 0x12, - 0x35, 0x18, 0x3d, 0x85, 0x03, 0x13, 0xba, 0xc3, 0x3a, 0x7a, 0xb7, 0x06, - 0x0e, 0xb3, 0x05, 0x83, 0xec, 0xfa, 0xab, 0x42, 0x82, 0xc1, 0x84, 0x5b, - 0x01, 0xb7, 0x22, 0xec, 0x2b, 0x90, 0xb4, 0xb2, 0x8e, 0x81, 0x8e, 0xe2, - 0x95, 0xc5, 0x9c, 0x67, 0x7b, 0xb4, 0x33, 0xc6, 0xea, 0xa5, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4e, 0x28, 0x8c, 0x1d, 0xd2, 0x43, 0xb2, 0x20, - 0xbb, 0xba, 0xeb, 0x71, 0xe9, 0xeb, 0x5a, 0x81, 0x69, 0x34, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4f, 0x2d, 0x72, 0xe1, 0x6a, 0xa9, 0x03, 0xc7, - 0x6b, 0x27, 0x90, 0x81, 0x31, 0x05, 0xa0, 0x80, 0x22, 0x4d, 0xcf, 0xfc, - 0x5b, 0x38, 0x6a, 0x71, 0x52, 0x68, 0xb2, 0xb4, 0xda, 0x02, 0xae, 0x01, - 0x04, 0xdb, 0xbd, 0xca, 0xb8, 0xcc, 0x72, 0xf1, 0x41, 0xdc, 0x07, 0xdd, - 0xf2, 0xe4, 0x88, 0xfd, 0x06, 0x9b, 0xbb, 0xe3, 0x1f, 0x66, 0x97, 0xf8, - 0xb5, 0x02, 0xfe, 0x8e, 0xcb, 0xbb, 0x66, 0x26, 0x28, 0xac, 0xc4, 0x50, - 0x35, 0xa2, 0xe9, 0x08, 0x3f, 0xda, 0x91, 0xe6, 0xdd, 0x86, 0x43, 0x16, - 0x57, 0xb5, 0x65, 0xe6, 0x5a, 0x35, 0x18, 0x9c, 0x3e, 0xdd, 0x5c, 0xa3, - 0x4b, 0x09, 0x8b, 0x11, 0x15, 0x5a, 0x58, 0xe8, 0x1d, 0x03, 0x70, 0xa4, - 0xbb, 0xdb, 0x26, 0x3c, 0x73, 0x12, 0xee, 0xb3, 0xef, 0x33, 0xf4, 0xf4, - 0x16, 0x72, 0x6a, 0xc2, 0x70, 0x79, 0x42, 0xe0, 0xb6, 0x64, 0xdf, 0xf5, - 0x62, 0xb2, 0xa0, 0xc4, 0xb8, 0x2d, 0xf0, 0xe4, 0x1d, 0xbe, 0xf8, 0x53, - 0x19, 0x91, 0x4b, 0x12, 0x21, 0x5a, 0x36, 0xc0, 0xa5, 0x97, 0x3a, 0x65, - 0xa6, 0xd0, 0x97, 0x13, 0x6d, 0x4d, 0xdb, 0x04, 0x52, 0x0a, 0x20, 0x48, - 0x82, 0xc7, 0x3b, 0x8c, 0x34, 0x77, 0xa3, 0xeb, 0x17, 0x4b, 0xf8, 0x79, - 0xee, 0xb0, 0x39, 0xd0, 0xae, 0xce, 0xb9, 0x4a, 0xa1, 0x45, 0x29, 0x08, - 0xf0, 0xdd, 0xa5, 0x56, 0x3f, 0xf5, 0x08, 0xcb, 0x1f, 0x6b, 0x42, 0xc4, - 0x0a, 0x1e, 0xa1, 0x02, 0x8b, 0x78, 0xa0, 0x95, 0x0f, 0x7c, 0xab, 0x48, - 0x68, 0xed, 0x2c, 0x1b, 0x56, 0xfd, 0x7a, 0x76, 0x50, 0x97, 0xb4, 0x5d, - 0x6a, 0x93, 0xbf, 0xe0, 0x68, 0x83, 0xb3, 0x92, 0xae, 0xdd, 0x90, 0x98, - 0xb3, 0xe7, 0xff, 0x16, 0x0f, 0x5e, 0x3c, 0x9b, 0x3b, 0x46, 0xaf, 0x9a, - 0xf1, 0x5d, 0xbf, 0x61, 0x37, 0xcb, 0x80, 0x02, 0x49, 0xf2, 0xab, 0x7d, - 0x45, 0x95, 0x32, 0x44, 0xa1, 0x2b, 0x7c, 0x20, 0xe8, 0xb2, 0xda, 0xfe, - 0xd9, 0xc9, 0x4f, 0x02, 0x15, 0x0e, 0x10, 0x5d, 0x18, 0x5e, 0x82, 0x90, - 0x1e, 0xb7, 0xb0, 0x71, 0x11, 0x55, 0xf1, 0x71, 0xa9, 0x87, 0x11, 0xb6, - 0xc7, 0x08, 0x4c, 0xda, 0xac, 0x6d, 0x7a, 0x86, 0xeb, 0x12, 0xc7, 0xc7, - 0xa6, 0x81, 0x93, 0x41, 0x41, 0xb4, 0x1d, 0x73, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x40, 0xd6, 0x49, 0xf3, - 0x0c, 0xb5, 0x58, 0xfc, 0x65, 0x8b, 0x03, 0x8c, 0x70, 0x3b, 0xc0, 0x47, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0x81, 0xc1, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x02, 0xa5, 0x59, 0x59, 0x46, 0x48, 0xa6, 0xaa, 0xef, 0xbe, 0x85, 0x6f, - 0x1a, 0x15, 0xfb, 0xc8, 0xc9, 0x32, 0x23, 0x30, 0x16, 0xb3, 0x26, 0x31, - 0xf0, 0xae, 0x60, 0xa2, 0xb1, 0xe8, 0x5b, 0xea, 0x4f, 0x35, 0x37, 0xe6, - 0x5d, 0x1e, 0x53, 0xc1, 0x09, 0xb6, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0xc1, 0x45, 0xe6, 0xe8, 0xac, 0x01, 0xd5, 0xc8, 0xba, 0x0e, 0x9d, 0x03, - 0x35, 0xe8, 0xb9, 0x55, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0x87, 0x77, 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, - 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, - 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, 0xb7, 0xb5, 0xa3, 0x76, - 0xc2, 0x57, 0x0d, 0x01, 0x4d, 0x35, 0xc5, 0xc7, 0x54, 0xa0, 0xa5, 0xc0, - 0xb7, 0xb5, 0xa3, 0x76, 0xc2, 0x57, 0x0d, 0x01, 0xd3, 0xcf, 0x35, 0xb9, - 0x89, 0x35, 0x97, 0x61, 0x2a, 0xf5, 0x3d, 0x79, 0xd5, 0x5a, 0x65, 0x27, - 0xf8, 0x67, 0x93, 0xdf, 0xa5, 0xa3, 0x1a, 0xeb, 0x36, 0x2d, 0xbf, 0x96, - 0x0e, 0xb3, 0x67, 0xa0, 0x9e, 0x28, 0x3f, 0x6f, 0xa8, 0x3b, 0x49, 0xe9, - 0xf6, 0x84, 0x64, 0x57, 0x93, 0xc8, 0xa7, 0x6a, 0xd6, 0xb4, 0x5a, 0x66, - 0x97, 0xb4, 0x49, 0xa3, 0x7f, 0x60, 0x39, 0x21, 0x77, 0x39, 0x03, 0x1f, - 0xd6, 0xb8, 0x86, 0xeb, 0x69, 0x80, 0x29, 0xfe, 0xb0, 0xb0, 0x17, 0xfc, - 0xc7, 0x59, 0xca, 0x84, 0xbd, 0x09, 0x6a, 0x86, 0x1e, 0xce, 0x6f, 0x99, - 0xc8, 0x87, 0x27, 0x42, 0x3d, 0xad, 0x2f, 0x2a, 0xde, 0xe0, 0x13, 0xcb, - 0xef, 0x56, 0x70, 0x23, 0x01, 0xbe, 0x11, 0xe6, 0x12, 0x1f, 0x2a, 0x3a, - 0x2c, 0x0c, 0x9a, 0x4e, 0xf1, 0x66, 0x43, 0xbd, 0x30, 0x02, 0x7f, 0x80, - 0xda, 0x68, 0xa8, 0xc8, 0x6f, 0xed, 0x12, 0xa3, 0x0c, 0xbd, 0xa7, 0xc8, - 0xc1, 0xe2, 0xd6, 0x07, 0xf8, 0x8f, 0x30, 0xf7, 0xe0, 0xdc, 0x0d, 0x66, - 0xfc, 0xfc, 0x94, 0x29, 0x19, 0x60, 0xca, 0x69, 0x45, 0x0a, 0xa1, 0x96, - 0x84, 0xb8, 0xbd, 0x68, 0x5f, 0x7f, 0x13, 0xa1, 0x84, 0x23, 0x25, 0x98, - 0x27, 0x29, 0xa6, 0x4f, 0x6b, 0xff, 0xd1, 0x18, 0xb0, 0xdf, 0x82, 0x44, - 0x1d, 0xaa, 0x88, 0x33, 0x9a, 0xc5, 0x20, 0x12, 0x89, 0xa6, 0x1d, 0xdb, - 0x0e, 0xd1, 0x64, 0xc2, 0x38, 0x55, 0x1a, 0x80, 0xbc, 0x8a, 0x03, 0x41, - 0xed, 0x23, 0x96, 0xc5, 0x85, 0x6a, 0xf7, 0xc9, 0x22, 0xe0, 0xc8, 0x26, - 0x5c, 0x2d, 0x99, 0xb6, 0x20, 0x5f, 0x3a, 0x0b, 0x38, 0xd4, 0xd0, 0x0a, - 0x18, 0xa8, 0x6e, 0x2b, 0x8b, 0x5f, 0x21, 0xcf, 0xa8, 0x7d, 0x2a, 0x03, - 0x51, 0xb1, 0x30, 0xd5, 0xf5, 0xae, 0xc9, 0x86, 0x14, 0xf1, 0x7f, 0x78, - 0x63, 0xc0, 0xc9, 0xc1, 0xed, 0xac, 0x2d, 0x83, 0x9c, 0x3a, 0x4f, 0xd7, - 0x8b, 0x71, 0x6f, 0x9b, 0x12, 0xef, 0xde, 0x92, 0xfd, 0x18, 0xab, 0x40, - 0x85, 0xac, 0x4e, 0x58, 0x3d, 0x93, 0x6d, 0x01, 0xa8, 0x1c, 0x8c, 0xaf, - 0x40, 0x38, 0x01, 0x8e, 0x3f, 0x44, 0xda, 0x3a, 0xd9, 0xc1, 0xc4, 0x66, - 0x18, 0x60, 0x1e, 0x6a, 0x6c, 0x45, 0x8b, 0x57, 0xdf, 0xd7, 0x20, 0x2f, - 0x7a, 0x88, 0x03, 0x1e, 0x41, 0x82, 0x37, 0x86, 0x05, 0xde, 0xc6, 0x6a, - 0xc3, 0xf3, 0x88, 0x3e, 0x48, 0xd9, 0xbd, 0xb6, 0x63, 0x05, 0x96, 0xee, - 0x0b, 0x5a, 0x66, 0x6d, 0x61, 0x0f, 0x06, 0x73, 0x66, 0x70, 0x22, 0x43, - 0x87, 0x58, 0x9e, 0x0b, 0xee, 0x56, 0x50, 0x78, 0x09, 0x27, 0x5a, 0x3e, - 0x94, 0xfb, 0x0b, 0x98, 0x02, 0xc0, 0xa9, 0xdf, 0xf5, 0xbd, 0xe6, 0xc9, - 0xc9, 0xc2, 0x9d, 0x12, 0x88, 0xfb, 0x3d, 0x55, 0xa3, 0x52, 0xc7, 0x4d, - 0xe2, 0xbe, 0x29, 0xd3, 0x1f, 0x48, 0x6a, 0x59, 0xd3, 0x0f, 0x78, 0x36, - 0xf1, 0x9b, 0xb7, 0xec, 0x46, 0x5a, 0x4a, 0x4d, 0x28, 0xb9, 0x3d, 0xe9, - 0xcf, 0x29, 0xdc, 0xc0, 0x06, 0x32, 0xd5, 0xcd, 0xb2, 0x1d, 0x3b, 0x9a, - 0x60, 0x3d, 0x51, 0x6d, 0x41, 0x82, 0x79, 0x8a, 0x86, 0x4d, 0xdd, 0xfe, - 0xb4, 0xaa, 0x35, 0x5a, 0x06, 0x64, 0x1e, 0xf2, 0x28, 0xf1, 0x01, 0xdc, - 0xdf, 0xc4, 0x27, 0xcd, 0x27, 0x7c, 0xe7, 0x17, 0x9e, 0xf8, 0x9e, 0xd6, - 0x92, 0x3f, 0x6b, 0xd5, 0x06, 0x85, 0xcf, 0x67, 0x66, 0x15, 0x81, 0x9e, - 0x1f, 0xb9, 0x5a, 0x49, 0xf0, 0x86, 0x65, 0x5c, 0xef, 0x5e, 0xe6, 0x9a, - 0x04, 0xc1, 0xd7, 0x52, 0x2e, 0x2c, 0x14, 0xb1, 0x48, 0x6a, 0x47, 0xed, - 0x76, 0x29, 0x2a, 0x99, 0x71, 0xf6, 0x8d, 0xd2, 0x87, 0x69, 0xd9, 0x29, - 0x30, 0x05, 0xdf, 0xd2, 0x82, 0x23, 0x5e, 0x6b, 0x64, 0x1d, 0xa6, 0xe0, - 0xf0, 0x02, 0x37, 0x9d, 0x31, 0x21, 0xe4, 0xc9, 0x46, 0x51, 0x2b, 0x37, - 0x2d, 0x97, 0xa3, 0x1b, 0x35, 0x9a, 0x93, 0x68, 0xd0, 0xea, 0xac, 0x71, - 0xd1, 0x04, 0x47, 0xb6, 0x38, 0x8c, 0xe4, 0xcf, 0x43, 0xdb, 0x69, 0x38, - 0x7a, 0x69, 0x37, 0xcd, 0x33, 0xe4, 0xb9, 0x3e, 0x26, 0x81, 0x49, 0x95, - 0x61, 0xed, 0x80, 0xb3, 0x1a, 0xdd, 0x6c, 0xaf, 0xee, 0xd2, 0x2d, 0x9c, - 0xdb, 0x39, 0x52, 0x5b, 0x2c, 0x0e, 0xfd, 0x9f, 0xf8, 0xee, 0x3d, 0xbf, - 0x18, 0x18, 0x62, 0xb4, 0xa1, 0x49, 0x9f, 0x01, 0x67, 0x31, 0x99, 0x9c, - 0x0d, 0x52, 0x36, 0x96, 0xe3, 0x0b, 0xf0, 0xfa, 0x60, 0x08, 0xb1, 0xa6, - 0x17, 0xf6, 0xec, 0x99, 0x12, 0xa5, 0x00, 0xa1, 0xd7, 0x53, 0x05, 0x06, - 0xa5, 0x63, 0x05, 0x5b, 0x33, 0x98, 0x0b, 0xdd, 0xc0, 0x8a, 0xf5, 0x42, - 0x26, 0xc5, 0x52, 0x3c, 0x60, 0x1b, 0x6f, 0xed, 0xeb, 0xe8, 0xea, 0x37, - 0xa1, 0x74, 0x47, 0x1a, 0xb3, 0x82, 0xc0, 0x44, 0x9f, 0xf6, 0x08, 0xa4, - 0xbb, 0xad, 0xf7, 0x65, 0xa7, 0x18, 0x55, 0x1e, 0x8d, 0x01, 0x34, 0xa0, - 0xab, 0x6a, 0x79, 0xf8, 0xe5, 0x66, 0xe7, 0x89, 0x8f, 0x18, 0x70, 0xac, - 0x47, 0xee, 0x6f, 0xda, 0x33, 0x0c, 0x5f, 0x53, 0x44, 0xeb, 0xc1, 0x3d, - 0x91, 0xed, 0x79, 0x7e, 0x81, 0x5b, 0x0d, 0x05, 0xf6, 0x13, 0x85, 0x59, - 0x13, 0x2a, 0x3a, 0xc7, 0x5f, 0xdc, 0xb4, 0x20, 0x1d, 0xc8, 0x73, 0x83, - 0xa1, 0x18, 0x85, 0xd6, 0xc8, 0xfa, 0x06, 0x71, 0x30, 0x09, 0xe4, 0xea, - 0xbe, 0x91, 0x82, 0xf0, 0x96, 0xec, 0xfe, 0x49, 0xda, 0xac, 0x1c, 0x8c, - 0xbc, 0x78, 0x20, 0x69, 0xd9, 0xf1, 0xff, 0x47, 0x35, 0xc5, 0xce, 0x7e, - 0xd9, 0x20, 0x65, 0x17, 0x64, 0xc2, 0xab, 0xde, 0xdc, 0xde, 0x01, 0xfe, - 0x05, 0x32, 0x5e, 0x16, 0x25, 0xcd, 0x2e, 0x48, 0xb0, 0x0e, 0x02, 0xc7, - 0x84, 0xa7, 0x77, 0x20, 0x77, 0x1a, 0x7d, 0x93, 0x9b, 0xbb, 0x8a, 0xed, - 0x12, 0xc3, 0x5c, 0x63, 0x63, 0xbf, 0xbc, 0xc9, 0x43, 0x20, 0xf4, 0xb6, - 0x59, 0xbf, 0x4b, 0x88, 0x1f, 0xc5, 0x81, 0xd2, 0x3c, 0x73, 0xe4, 0xea, - 0x52, 0x17, 0x84, 0x23, 0x35, 0x2f, 0xa9, 0xb6, 0x37, 0x93, 0xfa, 0xb1, - 0x70, 0x4e, 0x3c, 0x8b, 0xee, 0x99, 0xf4, 0x86, 0x5c, 0x74, 0xfd, 0xbb, - 0xbf, 0x7f, 0x69, 0x60, 0xfc, 0xc8, 0x68, 0xfc, 0x45, 0x24, 0x63, 0x52, - 0xc8, 0x90, 0xfb, 0x9b, 0x8b, 0x1c, 0x12, 0x30, 0x0f, 0x35, 0x50, 0x88, - 0x90, 0xfe, 0x66, 0x43, 0xa9, 0x47, 0x6d, 0x3e, 0x6f, 0xc2, 0xf1, 0x2d, - 0x1f, 0xf5, 0x1d, 0x40, 0x4b, 0x9e, 0xa1, 0x4b, 0x72, 0x1a, 0xfc, 0x96, - 0x01, 0x0e, 0x77, 0x79, 0x96, 0xf4, 0x79, 0xe7, 0x86, 0xa3, 0x9f, 0x50, - 0xe6, 0x7c, 0xfc, 0x2c, 0x92, 0x1a, 0x04, 0x31, 0x5b, 0xc1, 0xfa, 0xd4, - 0x75, 0x42, 0xe0, 0x3e, 0xcd, 0x67, 0x82, 0xec, 0xc3, 0x41, 0xad, 0x39, - 0xf1, 0x1f, 0x3b, 0xdc, 0xe9, 0x41, 0x11, 0xaf, 0x7b, 0x2e, 0x27, 0x64, - 0x41, 0xeb, 0xe2, 0x2c, 0x19, 0xa8, 0xca, 0xd8, 0x08, 0x89, 0xb4, 0x49, - 0x01, 0x58, 0xdc, 0x63, 0x82, 0xd8, 0x6d, 0x6a, 0x6f, 0xd5, 0x87, 0x0c, - 0xf5, 0x16, 0x5b, 0x77, 0x02, 0x52, 0xb5, 0x31, 0xd9, 0x84, 0x58, 0x6d, - 0x00, 0x3f, 0xb4, 0x81, 0x95, 0xac, 0xe3, 0x87, 0xea, 0x25, 0x27, 0x26, - 0xfa, 0x9b, 0xa1, 0x33, 0xb6, 0x0d, 0x30, 0x55, 0x7b, 0x6e, 0xe9, 0x65, - 0xfd, 0x31, 0x07, 0x24, 0x0e, 0x46, 0x3e, 0x97, 0xe3, 0xbb, 0xb3, 0x9b, - 0x12, 0x12, 0x41, 0xa2, 0x23, 0xad, 0xc9, 0x31, 0x8e, 0x03, 0x42, 0xdf, - 0x63, 0xa0, 0xca, 0x25, 0xf2, 0x95, 0x40, 0x5e, 0xfb, 0x2e, 0x5d, 0x37, - 0x83, 0x69, 0xa0, 0x6a, 0xaa, 0xae, 0xfb, 0xae, 0x51, 0xda, 0xf8, 0x3e, - 0xe6, 0xa8, 0xda, 0x6a, 0xb4, 0x2b, 0x55, 0xe7, 0x0c, 0x45, 0xf5, 0xfa, - 0x3a, 0x43, 0x3b, 0x59, 0xd5, 0xb6, 0xf0, 0xa8, 0x8e, 0x04, 0x6a, 0xf8, - 0x5e, 0x64, 0xd7, 0xa8, 0xa8, 0xb5, 0x28, 0xf5, 0x40, 0x7b, 0x3c, 0x41, - 0xf3, 0xaf, 0xb0, 0x76, 0xfb, 0xa9, 0xd1, 0x3b, 0xd1, 0x02, 0xab, 0x55, - 0x6e, 0x41, 0x60, 0xb6, 0xa0, 0x5b, 0x4d, 0xce, 0x8d, 0x2f, 0xad, 0x5f, - 0x49, 0xb6, 0xcb, 0x05, 0xcb, 0xde, 0x71, 0x05, 0xfb, 0x50, 0xa3, 0x39, - 0x47, 0xbb, 0x56, 0x5f, 0xc6, 0x1c, 0x30, 0xe6, 0x7c, 0xdb, 0x77, 0xc0, - 0xea, 0xf5, 0x96, 0x79, 0x93, 0xbd, 0x43, 0xe2, 0xcc, 0x26, 0x07, 0x0d, - 0xb4, 0x82, 0x50, 0x80, 0x71, 0xc9, 0xb8, 0xd1, 0x36, 0x24, 0x4c, 0x31, - 0x80, 0x68, 0x77, 0xa2, 0x04, 0xc1, 0xb8, 0x8c, 0x4f, 0xda, 0xa3, 0xa8, - 0x93, 0xe2, 0xcd, 0x90, 0x77, 0xa5, 0xb1, 0x7c, 0xfa, 0x23, 0xb4, 0xcc, - 0x98, 0xbe, 0x63, 0xf5, 0xee, 0x5f, 0xfc, 0x86, 0x81, 0xb8, 0x64, 0x16, - 0x9f, 0xf6, 0x6e, 0x09, 0xee, 0x8b, 0xab, 0x9a, 0xa6, 0x06, 0xbb, 0x1e, - 0x2d, 0x92, 0xba, 0x95, 0xd8, 0xd0, 0xa1, 0x3f, 0x9b, 0xaa, 0x05, 0x2f, - 0x35, 0x99, 0xe8, 0xd1, 0x14, 0xc6, 0x57, 0x09, 0x5a, 0x4e, 0x7c, 0x84, - 0x0c, 0x93, 0x04, 0xca, 0x8d, 0xe3, 0x9c, 0xb3, 0x1d, 0x5c, 0x35, 0x02, - 0x1c, 0xa4, 0x94, 0xe8, 0x39, 0xe2, 0xd9, 0xb5, 0x5d, 0xc2, 0xd6, 0x96, - 0x98, 0x8e, 0xa1, 0xb1, 0xaa, 0xb0, 0x2b, 0x7a, 0xbf, 0xf3, 0x2f, 0x0a, - 0x29, 0x48, 0xee, 0xca, 0xf0, 0xc7, 0x1b, 0x0c, 0xfe, 0x4c, 0x79, 0xd5, - 0x9b, 0xd3, 0x56, 0x63, 0xd3, 0x19, 0x95, 0xae, 0x08, 0xa9, 0x96, 0x49, - 0x41, 0x5f, 0x83, 0x6d, 0x63, 0x8d, 0x5e, 0xd0, 0x6a, 0x7b, 0x6f, 0x96, - 0x65, 0xc9, 0x7c, 0x9a, 0xeb, 0x6f, 0x4e, 0xfe, 0x44, 0xc8, 0xe8, 0x1d, - 0x8c, 0x55, 0x38, 0xd2, 0x54, 0xf2, 0x06, 0x38, 0xf2, 0x14, 0x92, 0x88, - 0xe6, 0x30, 0xe4, 0xe3, 0x07, 0xff, 0xd1, 0xd8, 0xdf, 0x37, 0xb9, 0x37, - 0xf6, 0x63, 0xc3, 0x32, 0x46, 0x68, 0x0a, 0xa7, 0xf2, 0xf3, 0x72, 0xf8, - 0x7f, 0x63, 0x83, 0xc2, 0x96, 0x08, 0x73, 0xe3, 0x05, 0xdc, 0x45, 0xbf, - 0x0f, 0xd0, 0xb1, 0xa0, 0x1f, 0x52, 0x4d, 0x46, 0x52, 0x8e, 0xa2, 0x23, - 0xe3, 0x6a, 0x7c, 0xc5, 0xd6, 0xa7, 0x78, 0xf9, 0xc3, 0xe0, 0x08, 0x0e, - 0x03, 0x83, 0x08, 0x6a, 0x04, 0x7d, 0x30, 0x58, 0xb0, 0x9d, 0x99, 0x10, - 0x0b, 0xbb, 0xa2, 0x10, 0x39, 0xc4, 0xfa, 0x65, 0x09, 0x45, 0x4d, 0x77, - 0x41, 0x98, 0x80, 0x0f, 0xb6, 0x54, 0x2d, 0x05, 0x91, 0x25, 0x36, 0x0a, - 0x43, 0x01, 0x5d, 0xdf, 0x57, 0x97, 0x98, 0x6d, 0xc8, 0xa0, 0xe9, 0xdf, - 0x6d, 0xf8, 0x68, 0x5b, 0xbc, 0x5f, 0x11, 0x1c, 0xcd, 0xa0, 0x83, 0xd8, - 0x92, 0x8e, 0x2f, 0xdd, 0xc5, 0x3e, 0x88, 0x94, 0xec, 0xb8, 0x5a, 0x08, - 0x17, 0x5d, 0x39, 0xa5, 0x82, 0x32, 0x55, 0x0d, 0x9b, 0x84, 0x40, 0x28, - 0x31, 0x84, 0x39, 0x2d, 0xdc, 0xbf, 0x41, 0x15, 0x6c, 0xeb, 0xbe, 0xc6, - 0x17, 0x0c, 0xbb, 0x3a, 0xeb, 0xb7, 0x71, 0x1e, 0xb0, 0xb7, 0x6d, 0xfe, - 0x5e, 0xe4, 0x9d, 0x88, 0x81, 0xc2, 0xb8, 0xf7, 0x4e, 0x7a, 0x63, 0xf9, - 0x90, 0x47, 0x06, 0x46, 0x1a, 0x85, 0x26, 0x4c, 0x28, 0x07, 0xc1, 0x4f, - 0x15, 0x3e, 0x34, 0x66, 0xd8, 0x8c, 0x4f, 0x7e, 0x69, 0x26, 0xe8, 0xee, - 0x41, 0x90, 0xcf, 0x63, 0x26, 0xa5, 0x96, 0x41, 0x28, 0x0f, 0xf1, 0x0f, - 0x3b, 0x8b, 0xa2, 0xb1, 0x34, 0x07, 0x11, 0xac, 0xbd, 0x49, 0xca, 0x9d, - 0x9d, 0x41, 0xcf, 0x26, 0x94, 0x55, 0x14, 0xbb, 0xb1, 0x3a, 0x52, 0xd5, - 0x00, 0xc2, 0xa8, 0xda, 0xa3, 0x51, 0x72, 0x05, 0xdb, 0xa9, 0x93, 0x4f, - 0x6d, 0xfe, 0xf8, 0xb4, 0x5a, 0x01, 0x1f, 0xb4, 0xac, 0xa5, 0x66, 0x4d, - 0x9f, 0xda, 0x77, 0x6c, 0x13, 0x3e, 0x3d, 0x39, 0xd5, 0xb9, 0xbf, 0x0c, - 0xec, 0xd0, 0xc0, 0x4c, 0x62, 0x35, 0x93, 0x9d, 0x2a, 0x27, 0x59, 0xe4, - 0x33, 0xb1, 0xf7, 0x2f, 0x83, 0xca, 0xe4, 0xf5, 0xde, 0xdd, 0x2b, 0x2f, - 0x45, 0x72, 0xf3, 0x14, 0xd7, 0xbf, 0x64, 0x5c, 0x5e, 0x3c, 0xd1, 0xd7, - 0x5c, 0x58, 0x5e, 0xa3, 0x8c, 0x9d, 0xb4, 0x13, 0x1e, 0x27, 0x6a, 0x9f, - 0x1c, 0x42, 0xdf, 0xee, 0xf6, 0x5e, 0x2e, 0x07, 0x08, 0xb3, 0x5f, 0x47, - 0x3d, 0xba, 0x30, 0xfa, 0xa9, 0x92, 0xf5, 0x1d, 0x88, 0x84, 0x3a, 0xfd, - 0x6b, 0x7e, 0xd9, 0x8e, 0x41, 0xcd, 0x2b, 0xc8, 0x05, 0x87, 0xe5, 0x16, - 0xd5, 0x5d, 0xe8, 0x3a, 0x2a, 0x81, 0x44, 0x35, 0x92, 0x99, 0xa6, 0x40, - 0x52, 0x4f, 0x82, 0xaa, 0xc3, 0xc3, 0xba, 0xd0, 0x6d, 0x76, 0x0d, 0xbe, - 0x95, 0xf8, 0xac, 0xdd, 0xde, 0x74, 0xf3, 0x7d, 0x1b, 0xe6, 0xf5, 0xde, - 0xe8, 0x53, 0x5f, 0x91, 0x81, 0x11, 0x95, 0xda, 0xe1, 0xfc, 0xf5, 0x8b, - 0xeb, 0xc9, 0xee, 0xeb, 0x2f, 0x49, 0x47, 0x46, 0x36, 0x20, 0x4e, 0x03, - 0x3f, 0x97, 0xe7, 0x42, 0x48, 0x05, 0x13, 0x9d, 0xda, 0xa7, 0xd4, 0x3c, - 0x96, 0xca, 0x17, 0xfe, 0xaf, 0x0b, 0xe7, 0x51, 0xb7, 0x9e, 0xee, 0x5e, - 0xf2, 0x30, 0xc9, 0x5a, 0x21, 0xe1, 0x8c, 0x6f, 0x9b, 0x70, 0x24, 0x67, - 0x5d, 0xdf, 0xb0, 0xad, 0x73, 0xae, 0x59, 0x4c, 0x4f, 0x28, 0x39, 0x45, - 0xd6, 0x55, 0xde, 0x37, 0x3d, 0xd9, 0x28, 0xa4, 0xc3, 0xbc, 0xa6, 0x4c, - 0xca, 0x77, 0x15, 0x01, 0xd9, 0x9d, 0x82, 0xe1, 0xa0, 0x0a, 0x34, 0x97, - 0xef, 0xef, 0x88, 0x9b, 0xcf, 0x85, 0x2f, 0x0e, 0xc6, 0x4d, 0x14, 0x29, - 0x08, 0x27, 0x57, 0x78, 0x38, 0x6d, 0x85, 0x4e, 0x21, 0x36, 0x78, 0x90, - 0xad, 0x56, 0x20, 0xe7, 0x15, 0xf8, 0x99, 0xc7, 0x6e, 0x4c, 0xc5, 0xa9, - 0xee, 0x05, 0x88, 0x20, 0x8a, 0x89, 0x9a, 0xb2, 0xe2, 0xf9, 0x61, 0x81, - 0xfd, 0x85, 0x66, 0xee, 0xdc, 0xbe, 0x13, 0x8f, 0x25, 0x66, 0x1c, 0xcc, - 0x68, 0x3c, 0xb9, 0xd1, 0xde, 0x6f, 0x3f, 0x52, 0xaf, 0x04, 0x20, 0xb7, - 0x51, 0x5a, 0x4f, 0xc2, 0x04, 0x95, 0xfc, 0xfe, 0xc1, 0x92, 0xf8, 0x38, - 0xdc, 0x7c, 0x4c, 0x8f, 0x95, 0x43, 0xce, 0x44, 0x89, 0x8e, 0xe4, 0xde, - 0xa9, 0xba, 0x64, 0x6f, 0x90, 0xb1, 0x1f, 0xd8, 0xe6, 0x47, 0x96, 0x81, - 0x22, 0xdc, 0xa7, 0x7f, 0x69, 0xe5, 0x01, 0x91, 0xc3, 0x48, 0xfc, 0x17, - 0x70, 0x88, 0x73, 0x20, 0xf0, 0x38, 0x2a, 0x60, 0x1a, 0xfd, 0x65, 0x68, - 0x39, 0x9e, 0xd0, 0x38, 0xa4, 0xf0, 0x2f, 0x9b, 0x33, 0x5a, 0x7c, 0xad, - 0x61, 0x63, 0xd9, 0x94, 0x7f, 0x36, 0xd5, 0x35, 0x78, 0x91, 0xba, 0x18, - 0xef, 0x72, 0xa9, 0xbe, 0xb9, 0x21, 0xa1, 0xb8, 0xdc, 0xf2, 0x63, 0xfe, - 0x6a, 0x2d, 0xc5, 0x5f, 0x09, 0x46, 0x8a, 0xb2, 0xdc, 0x6c, 0x99, 0x1f, - 0xa2, 0x88, 0xa1, 0x56, 0xb1, 0xc1, 0xbf, 0xcc, 0xcd, 0xa6, 0xb3, 0x1a, - 0x13, 0x53, 0xce, 0x2a, 0xc2, 0x3b, 0xf6, 0xdc, 0xb8, 0xe0, 0x36, 0xcd, - 0x9b, 0x96, 0x2d, 0x6d, 0x84, 0x23, 0x5c, 0xba, 0x04, 0x51, 0x3e, 0x51, - 0xa5, 0x7b, 0xfe, 0x6c, 0x42, 0x41, 0x18, 0xf4, 0xee, 0x3a, 0x19, 0xca, - 0xcc, 0xd5, 0xac, 0xee, 0xd9, 0x90, 0xd5, 0xe3, 0xcd, 0xa5, 0x1b, 0x17, - 0x0d, 0x2c, 0x25, 0xce, 0xc3, 0x14, 0x0f, 0x49, 0x8b, 0xc5, 0x6a, 0x56, - 0x5a, 0x66, 0xcd, 0x40, 0x6f, 0xbc, 0xb9, 0xa0, 0x0f, 0x6a, 0x79, 0xb3, - 0xea, 0x5f, 0x8c, 0x08, 0x74, 0x98, 0x83, 0x95, 0x1b, 0xec, 0xf3, 0x78, - 0xce, 0x10, 0x54, 0x75, 0x21, 0x5f, 0x16, 0x27, 0x88, 0x12, 0x85, 0x47, - 0x34, 0x16, 0x09, 0x19, 0xcc, 0x33, 0x32, 0xe2, 0x51, 0xdf, 0xeb, 0xd0, - 0x0b, 0xc5, 0x60, 0xd2, 0xf5, 0x43, 0x71, 0x5c, 0x78, 0x3d, 0xc1, 0x0d, - 0xb6, 0x2f, 0x35, 0x5d, 0x7b, 0x94, 0xce, 0x4d, 0x5f, 0xfb, 0x99, 0xae, - 0x1a, 0x53, 0xe0, 0x11, 0xed, 0x35, 0x76, 0x8a, 0x84, 0xe8, 0x55, 0xa5, - 0x1f, 0xed, 0x5f, 0x28, 0xfa, 0x40, 0x8c, 0xc4, 0x58, 0x3b, 0x79, 0x68, - 0x22, 0x26, 0xd6, 0x85, 0x0e, 0xb9, 0xc4, 0x5c, 0x3e, 0xb9, 0xdd, 0x08, - 0xb6, 0x5a, 0x15, 0x7c, 0x78, 0xc1, 0x41, 0x8b, 0x6d, 0x2c, 0xde, 0xbf, - 0xa7, 0xfd, 0x86, 0x7c, 0x0d, 0x18, 0x2f, 0xb1, 0xb2, 0x1e, 0xec, 0x9e, - 0x23, 0xdd, 0xb6, 0x29, 0x0b, 0xdd, 0xf7, 0x68, 0x78, 0xd1, 0x14, 0xb6, - 0x59, 0xfa, 0x9d, 0xda, 0x82, 0xb9, 0xd0, 0x84, 0x9f, 0xea, 0xe3, 0xaa, - 0x38, 0xa1, 0x13, 0x0b, 0x60, 0x5c, 0xfc, 0x10, 0x29, 0xb5, 0x88, 0x0e, - 0x80, 0x5c, 0x8e, 0x79, 0x3d, 0x80, 0x30, 0x6f, 0x33, 0x52, 0x10, 0xe4, - 0xb5, 0xb6, 0xe5, 0x3a, 0x51, 0x8b, 0x64, 0x3a, 0xef, 0x4b, 0xb9, 0x9d, - 0x1b, 0xdc, 0x43, 0x2c, 0x13, 0x96, 0x9a, 0x77, 0xa2, 0xdd, 0x0e, 0xa0, - 0xac, 0x4d, 0x73, 0x04, 0xd3, 0x5e, 0x88, 0x7f, 0xb5, 0x71, 0xb4, 0x83, - 0x60, 0xfe, 0x02, 0x9b, 0x36, 0x25, 0x39, 0x94, 0xc7, 0xea, 0xbf, 0xbf, - 0x86, 0xd1, 0x16, 0x3b, 0xb8, 0x23, 0xef, 0x64, 0xf4, 0x6c, 0x3f, 0xf0, - 0xd2, 0x5a, 0xe5, 0x80, 0x31, 0x94, 0x3a, 0x0b, 0xcf, 0x05, 0x5f, 0x0d, - 0x32, 0x4e, 0xa7, 0x4b, 0x33, 0x8b, 0x1a, 0x98, 0x53, 0x2b, 0x30, 0xcf, - 0x56, 0xf8, 0x3c, 0xa5, 0xf5, 0x76, 0xd4, 0x1a, 0x92, 0x9b, 0x74, 0x82, - 0x80, 0xee, 0x7c, 0x6a, 0xa4, 0x81, 0xb4, 0x9e, 0xc2, 0x6d, 0x05, 0x8c, - 0x06, 0xfd, 0x37, 0x9d, 0x40, 0x78, 0x85, 0x85, 0xf9, 0x28, 0x74, 0x58, - 0x1f, 0x89, 0xeb, 0x23, 0x68, 0xbb, 0x20, 0x08, 0xa3, 0x92, 0x6c, 0x03, - 0xbf, 0x5e, 0x61, 0xf7, 0xed, 0x06, 0x88, 0x2e, 0xbe, 0x52, 0x6c, 0xfd, - 0x83, 0xc1, 0x5e, 0x2d, 0x38, 0x32, 0xe3, 0x0c, 0x4d, 0xa9, 0x9a, 0x4c, - 0xb4, 0xee, 0xc0, 0xf1, 0x59, 0x4e, 0x59, 0x0d, 0x85, 0xc3, 0x29, 0x25, - 0xcc, 0x7b, 0x03, 0xef, 0x39, 0x8f, 0x15, 0xe8, 0x38, 0xdc, 0x38, 0xf9, - 0x41, 0x3c, 0xaf, 0x7f, 0xa8, 0xf2, 0x58, 0x4d, 0x76, 0xba, 0x41, 0x32, - 0xc7, 0x4e, 0x03, 0x29, 0x9c, 0x0c, 0xb3, 0x2d, 0xa8, 0x1f, 0x6b, 0xb4, - 0x34, 0x47, 0xbf, 0x4e, 0xdf, 0x53, 0xb2, 0xd5, 0x40, 0xc8, 0x37, 0x11, - 0x45, 0x9f, 0xb9, 0x84, 0x8f, 0x95, 0xb7, 0x54, 0x68, 0x56, 0xbe, 0xf4, - 0x58, 0x24, 0x51, 0x45, 0x93, 0xd9, 0x4b, 0x51, 0xad, 0xe1, 0x11, 0x78, - 0x5a, 0x34, 0xa8, 0xe9, 0x1e, 0x14, 0xa4, 0x47, 0x8f, 0x95, 0x0a, 0x95, - 0x23, 0x27, 0xb4, 0xab, 0x9b, 0x0e, 0x05, 0xd8, 0xb7, 0xb1, 0x83, 0xef, - 0xed, 0x1f, 0xad, 0x62, 0x63, 0xd2, 0xac, 0xfa, 0x00, 0xca, 0x88, 0x12, - 0x64, 0xf7, 0xe4, 0x7f, 0x27, 0x34, 0x43, 0x2f, 0xb1, 0x6b, 0x32, 0x4a, - 0xd3, 0xa7, 0x95, 0x83, 0x3c, 0x71, 0x48, 0xb3, 0x69, 0x1c, 0xa2, 0x1d, - 0xae, 0x44, 0x46, 0xe4, 0x9f, 0xfa, 0x65, 0x8f, 0x2d, 0xc6, 0x62, 0xad, - 0x92, 0x3f, 0x43, 0x8e, 0x4b, 0x99, 0x2f, 0x6d, 0x61, 0x26, 0x09, 0xfa, - 0xc5, 0x91, 0x25, 0xe1, 0xad, 0x5f, 0x86, 0x92, 0xb1, 0x65, 0x63, 0x47, - 0xd4, 0x46, 0x12, 0xd8, 0x57, 0x04, 0x44, 0xf8, 0x66, 0xbf, 0x3d, 0x02, - 0x23, 0x95, 0xe9, 0x2b, 0xc8, 0x4d, 0xcf, 0x26, 0x4d, 0x05, 0x55, 0x06, - 0xb5, 0x68, 0x85, 0x9a, 0xee, 0x48, 0x4e, 0x04, 0x4f, 0x1b, 0x30, 0x87, - 0x9e, 0x6d, 0xb0, 0x1d, 0xe3, 0x8f, 0xeb, 0xcc, 0xc6, 0x1e, 0x46, 0x0a, - 0xb5, 0x2f, 0x67, 0xab, 0x60, 0xb6, 0xaf, 0x2e, 0x79, 0x5c, 0x1d, 0xc2, - 0xf1, 0x0e, 0x8f, 0xd9, 0x27, 0x02, 0xf6, 0x45, 0x9b, 0xc5, 0x86, 0xea, - 0xcd, 0xe0, 0x1d, 0x7b, 0x2f, 0x77, 0xbd, 0x27, 0x6e, 0x2d, 0xbc, 0xf6, - 0x91, 0xe6, 0x9b, 0x2d, 0x47, 0x00, 0x36, 0xef, 0xc1, 0xb9, 0x9e, 0x81, - 0x8d, 0xc8, 0xdd, 0x77, 0x80, 0x79, 0xc7, 0x13, 0x30, 0x9b, 0x8f, 0xba, - 0xbb, 0xb7, 0x8f, 0x45, 0x8c, 0xea, 0x30, 0x92, 0x38, 0xc8, 0x2e, 0xef, - 0x6e, 0x85, 0x71, 0xee, 0xe7, 0x94, 0x3a, 0x39, 0xc6, 0x21, 0xa0, 0x35, - 0x88, 0x6d, 0xcf, 0x7b, 0x95, 0xbe, 0x09, 0x8e, 0x48, 0x08, 0xcc, 0x8f, - 0x19, 0x89, 0x3f, 0x17, 0xc0, 0x09, 0xfa, 0x70, 0x69, 0x18, 0x6b, 0x4d, - 0x7e, 0xf4, 0x36, 0x56, 0x8b, 0x2f, 0xb1, 0xf2, 0x1c, 0xc5, 0x0f, 0x67, - 0x6b, 0x5a, 0x3e, 0xf0, 0xd2, 0x46, 0x6a, 0x75, 0xbb, 0xb5, 0x25, 0xf5, - 0xce, 0xd3, 0x49, 0x07, 0x13, 0x01, 0xf4, 0x62, 0x93, 0xc8, 0xf9, 0x19, - 0x44, 0x2a, 0xd9, 0x11, 0xb0, 0x20, 0x7c, 0x7d, 0xc7, 0x24, 0xd6, 0xbb, - 0x45, 0x2d, 0x8e, 0xa4, 0x4f, 0x2b, 0xae, 0x3d, 0x56, 0x4e, 0x41, 0x60, - 0x31, 0x5b, 0x39, 0x0e, 0x8f, 0x65, 0x36, 0x95, 0xbc, 0xf3, 0x17, 0xb7, - 0xa4, 0x13, 0x66, 0xb8, 0x77, 0xba, 0xbf, 0x16, 0xbf, 0x81, 0x9d, 0xb5, - 0x6d, 0xe0, 0x2a, 0xd0, 0x82, 0x39, 0x96, 0x72, 0x66, 0x1c, 0xe3, 0x54, - 0x67, 0x93, 0x11, 0xf8, 0xdc, 0x4b, 0xdf, 0x0a, 0x8f, 0x80, 0xf7, 0xa8, - 0xe4, 0x70, 0x27, 0xe4, 0x42, 0x05, 0x66, 0x11, 0x9e, 0xa7, 0x41, 0x53, - 0x42, 0xbb, 0x9a, 0xeb, 0xd4, 0x3b, 0xa5, 0x68, 0xa1, 0x8c, 0x8a, 0x14, - 0x8a, 0x9f, 0x5d, 0x3c, 0xac, 0x9b, 0xc1, 0x3c, 0x2c, 0xfe, 0x35, 0x93, - 0x31, 0x33, 0x7a, 0x3b, 0x59, 0xaf, 0xb6, 0x8a, 0xfd, 0xb2, 0xa8, 0x00, - 0xd8, 0x3c, 0xef, 0x0a, 0xfc, 0xfa, 0x9e, 0x56, 0x54, 0x46, 0x16, 0x83, - 0x90, 0x84, 0x63, 0x8e, 0x21, 0x03, 0xbf, 0xbe, 0x9c, 0xe6, 0x2a, 0xcf, - 0xd7, 0x11, 0x8d, 0x2f, 0x95, 0x16, 0x46, 0x70, 0xaa, 0xb2, 0xa5, 0xa3, - 0x7d, 0x61, 0xae, 0x8a, 0x90, 0xca, 0xa9, 0x25, 0x22, 0x6d, 0x5d, 0x9b, - 0xde, 0x75, 0xe3, 0xe3, 0x04, 0x2a, 0x91, 0x4f, 0x43, 0x0f, 0xbf, 0x47, - 0xda, 0x2a, 0x60, 0xc9, 0x78, 0x12, 0x50, 0x99, 0x84, 0x5d, 0xfb, 0x9d, - 0xe1, 0xa2, 0xe0, 0x96, 0xa9, 0xc1, 0xab, 0x14, 0xc4, 0x83, 0x14, 0x25, - 0x6a, 0xbb, 0x9b, 0x62, 0x7b, 0xb9, 0xb8, 0x6a, 0x1a, 0x06, 0x1a, 0x24, - 0x97, 0x9b, 0xde, 0xbe, 0xef, 0xe5, 0x8b, 0x58, 0x70, 0x7e, 0xc0, 0x41, - 0x15, 0x0a, 0xe6, 0xd1, 0xc3, 0xb0, 0x27, 0xda, 0xdd, 0x11, 0xff, 0x94, - 0x44, 0x1e, 0xb1, 0x7c, 0x1e, 0x8c, 0xae, 0xc7, 0xdd, 0xba, 0x76, 0xfa, - 0x51, 0xf4, 0x23, 0x74, 0x48, 0x96, 0x02, 0x0f, 0xb4, 0xea, 0x04, 0xb0, - 0xda, 0xb6, 0x42, 0x21, 0x1a, 0xfa, 0x83, 0x12, 0x94, 0xd2, 0x72, 0xdf, - 0xa9, 0x2c, 0xe6, 0x58, 0x91, 0x6e, 0xe5, 0x16, 0xfc, 0xa0, 0x32, 0xf0, - 0x01, 0x3e, 0xd1, 0xcc, 0x9a, 0x22, 0x93, 0xbb, 0xf6, 0xc5, 0xd7, 0xbc, - 0x73, 0x6d, 0xf7, 0x44, 0xab, 0xb7, 0xb3, 0x48, 0x15, 0xd9, 0x31, 0xfe, - 0x8a, 0x74, 0x66, 0x96, 0xfb, 0xb5, 0x97, 0xa5, 0x78, 0x58, 0x92, 0xac, - 0x58, 0x6b, 0xcc, 0xa6, 0x12, 0x29, 0xbe, 0x83, 0x9f, 0x35, 0x5e, 0x49, - 0xfe, 0xa2, 0xb4, 0xca, 0xb3, 0xc8, 0x83, 0x58, 0xc7, 0x8f, 0x5e, 0xb7, - 0x71, 0x00, 0xf9, 0x97, 0x99, 0xdf, 0x2a, 0x2a, 0x85, 0x89, 0x16, 0xd9, - 0x5e, 0x33, 0xb3, 0x64, 0xf1, 0x6e, 0xcc, 0x1a, 0x89, 0xa9, 0xcb, 0x35, - 0xdc, 0x52, 0x34, 0x76, 0x1e, 0x9b, 0x30, 0x91, 0xbc, 0x3e, 0x18, 0x89, - 0x13, 0x24, 0x35, 0x93, 0xa1, 0x80, 0xa8, 0x3b, 0xa8, 0x0e, 0x9f, 0xfe, - 0xf3, 0xfe, 0x85, 0x83, 0xa6, 0xf7, 0xb0, 0xbe, 0x28, 0x8c, 0x07, 0xe0, - 0x84, 0xdf, 0xeb, 0x59, 0x27, 0x67, 0xe9, 0x56, 0x0a, 0xb6, 0xa2, 0xde, - 0x2b, 0x09, 0x79, 0x64, 0xda, 0x14, 0xdb, 0xa9, 0x7c, 0x7c, 0xa5, 0x64, - 0xfe, 0xc9, 0xc7, 0x04, 0x82, 0xff, 0xf2, 0xe5, 0xca, 0xe6, 0x94, 0x63, - 0x1d, 0x89, 0x1c, 0xe3, 0x63, 0xff, 0x96, 0xef, 0xe3, 0x45, 0x8d, 0x28, - 0x99, 0x56, 0x1f, 0xca, 0x4e, 0x2f, 0x0e, 0x95, 0x67, 0xc0, 0x32, 0x5a, - 0xdb, 0x3d, 0xce, 0x15, 0x6d, 0x8b, 0xdf, 0xc8, 0x79, 0x07, 0x13, 0x3e, - 0xcc, 0xab, 0xa2, 0x61, 0x3c, 0xd4, 0x8e, 0x21, 0x4a, 0xc6, 0x18, 0xfc, - 0x0c, 0xff, 0xfa, 0xa4, 0x17, 0xd2, 0xda, 0x50, 0x2e, 0xf1, 0x56, 0xdd, - 0x3a, 0x68, 0xbb, 0x82, 0xa0, 0x71, 0x1b, 0xd4, 0x61, 0xae, 0x14, 0x18, - 0xec, 0xcf, 0xec, 0xa8, 0x46, 0x49, 0xab, 0x11, 0xe4, 0xf3, 0xfa, 0x8c, - 0xac, 0x32, 0x07, 0xb2, 0xcb, 0x36, 0xbe, 0x33, 0x26, 0x0a, 0x9c, 0x08, - 0x49, 0x32, 0x65, 0x98, 0xd7, 0x61, 0x7d, 0xb8, 0x35, 0xca, 0x1d, 0x61, - 0x3e, 0x9b, 0xf0, 0x43, 0x85, 0x35, 0x79, 0x2f, 0xc1, 0x66, 0x62, 0x96, - 0x67, 0xf5, 0xf7, 0xb8, 0xac, 0xbf, 0xfe, 0x11, 0x0d, 0x2b, 0x4f, 0xb6, - 0x5d, 0x35, 0xa7, 0x18, 0x28, 0x41, 0xb5, 0x2c, 0x38, 0x6d, 0x95, 0x26, - 0x40, 0x48, 0x87, 0x1f, 0xc2, 0x47, 0xb2, 0x66, 0x47, 0x73, 0xdc, 0x56, - 0x84, 0x96, 0xd8, 0xae, 0xbe, 0x2a, 0xd8, 0x17, 0xbc, 0x7b, 0xdb, 0xcd, - 0x02, 0xf7, 0xff, 0x59, 0x3f, 0x35, 0xfd, 0xf7, 0x0b, 0x22, 0xb1, 0x36, - 0x85, 0x70, 0x95, 0x0c, 0x78, 0x3f, 0x4d, 0x1e, 0x64, 0x3b, 0xdc, 0x76, - 0xcc, 0x43, 0x03, 0x1e, 0x0e, 0xff, 0xb5, 0x9a, 0x53, 0x83, 0x6c, 0xe8, - 0xb3, 0x16, 0x60, 0xbf, 0x73, 0x72, 0x77, 0xc6, 0x7d, 0x24, 0xfd, 0xcc, - 0xfc, 0xa6, 0x58, 0x40, 0x5a, 0xd6, 0xeb, 0xc1, 0xf9, 0x7d, 0x8a, 0x1a, - 0x45, 0xbc, 0xd3, 0xba, 0xe2, 0xda, 0x3f, 0x26, 0xd4, 0x23, 0x1b, 0x2d, - 0x37, 0x7d, 0xd3, 0xbe, 0x29, 0xd1, 0x3e, 0x71, 0x4a, 0xc1, 0x4b, 0x1d, - 0x4b, 0xe6, 0x63, 0x61, 0x04, 0x07, 0x70, 0xf7, 0xa3, 0xa5, 0xf6, 0x78, - 0x3c, 0xcd, 0x62, 0x3f, 0xba, 0x80, 0x6b, 0x96, 0x91, 0x67, 0x0e, 0xcc, - 0xc7, 0xcb, 0xc6, 0xc2, 0x29, 0x8d, 0x51, 0x04, 0xdf, 0xf0, 0x0a, 0xa4, - 0x9d, 0x36, 0xc8, 0x53, 0x16, 0x6a, 0xff, 0x3a, 0xf4, 0xfd, 0xd5, 0xc5, - 0x41, 0x3a, 0xed, 0xae, 0x89, 0x0a, 0x56, 0x8b, 0x41, 0x9b, 0x83, 0xa3, - 0xdf, 0xeb, 0x3b, 0xdc, 0x91, 0x4f, 0x15, 0x27, 0x4f, 0xbb, 0xd4, 0xf6, - 0xbf, 0x81, 0x2e, 0x80, 0xcc, 0xe1, 0x2b, 0x6a, 0xbf, 0x13, 0x44, 0x5f, - 0x34, 0x15, 0xd4, 0xf0, 0xe7, 0xf7, 0x42, 0x96, 0x01, 0x83, 0x34, 0x2d, - 0x9e, 0xf4, 0x80, 0x26, 0x2c, 0xb1, 0x7c, 0x13, 0xee, 0xd1, 0x4f, 0xfb, - 0x13, 0x7a, 0xae, 0x7d, 0x66, 0xf9, 0x69, 0xc3, 0x60, 0x6b, 0x33, 0xf7, - 0xfa, 0xc9, 0xbd, 0x6a, 0x9a, 0x58, 0x90, 0x34, 0xb9, 0x50, 0xb7, 0xb4, - 0xe9, 0xe4, 0xd9, 0x64, 0xab, 0xcf, 0xac, 0x92, 0xa6, 0x2f, 0x4f, 0x53, - 0xc8, 0x72, 0x1a, 0x4d, 0x11, 0x7b, 0x6c, 0x97, 0x6b, 0x86, 0x34, 0x06, - 0x87, 0x9a, 0x9f, 0x52, 0xc3, 0xaa, 0x94, 0xf0, 0xf7, 0x2b, 0xa1, 0xd1, - 0xcc, 0xad, 0xe3, 0xa6, 0x35, 0xac, 0xb6, 0x93, 0x29, 0x65, 0x84, 0x82, - 0xad, 0x19, 0x1f, 0x9e, 0x27, 0xff, 0xff, 0xbe, 0x08, 0xbe, 0x28, 0x2d, - 0xe0, 0x24, 0xe8, 0xbd, 0x0e, 0xf4, 0x0b, 0x78, 0xaf, 0x3e, 0x6d, 0xf2, - 0x23, 0x7c, 0xc6, 0x32, 0x60, 0xea, 0x8b, 0x52, 0x21, 0x03, 0xc4, 0x85, - 0x76, 0x27, 0x92, 0xbf, 0x75, 0x28, 0xa9, 0xa3, 0xc3, 0x8d, 0xd3, 0x93, - 0x0f, 0xda, 0x7f, 0xf5, 0xf3, 0x0a, 0x5f, 0x2a, 0xdb, 0xad, 0x21, 0x1d, - 0x42, 0x9a, 0x0d, 0xc6, 0x31, 0xda, 0x47, 0xff, 0xf5, 0x25, 0x47, 0x7e, - 0x1c, 0xcd, 0xcf, 0x7c, 0xdc, 0x82, 0x03, 0xc1, 0x3f, 0x69, 0x27, 0x4c, - 0x2e, 0xf7, 0x53, 0x8b, 0xb1, 0x0f, 0x0f, 0x61, 0x27, 0x6d, 0x91, 0xbd, - 0x0d, 0x31, 0x65, 0x51, 0x74, 0xe4, 0x1c, 0x79, 0x04, 0xc0, 0xaf, 0x0c, - 0xb6, 0x69, 0x02, 0x37, 0x33, 0xb1, 0xf1, 0x81, 0x27, 0xe6, 0xdd, 0xdc, - 0x82, 0x86, 0x29, 0x21, 0x1e, 0x7f, 0x8e, 0x16, 0xb1, 0x77, 0xd4, 0xee, - 0x0c, 0x97, 0xab, 0xd8, 0x40, 0x78, 0x78, 0xcf, 0x04, 0x75, 0xe1, 0x31, - 0xa1, 0xd4, 0xcf, 0xc7, 0x3b, 0x3b, 0x54, 0xd8, 0x08, 0xbf, 0xba, 0x05, - 0x04, 0x58, 0x4c, 0x38, 0x53, 0xa6, 0x9b, 0x3e, 0x2f, 0x23, 0x6e, 0xda, - 0x25, 0xaa, 0xb9, 0xc0, 0x6f, 0x7f, 0xb6, 0x7f, 0xfa, 0xfe, 0x55, 0xdb, - 0x89, 0x06, 0x3d, 0x98, 0x5a, 0x04, 0xb4, 0x91, 0x69, 0x7e, 0x3e, 0x11, - 0xfd, 0x5d, 0xc5, 0x98, 0x30, 0x73, 0xf4, 0x95, 0x4d, 0xc5, 0x76, 0xf7, - 0xf4, 0x2c, 0xae, 0x04, 0x9c, 0xff, 0xd1, 0x6f, 0x11, 0xfc, 0x1c, 0xae, - 0xe8, 0x83, 0xaf, 0x89, 0xe0, 0xb7, 0xcd, 0xb5, 0x0c, 0xb7, 0x4a, 0xaa, - 0x86, 0x4f, 0xb5, 0x07, 0x97, 0xcd, 0xbb, 0xd4, 0x61, 0xdd, 0x97, 0xb0, - 0x2e, 0x5b, 0x86, 0x32, 0xb8, 0x16, 0x63, 0x88, 0x5b, 0xde, 0xa8, 0xb9, - 0x34, 0xb1, 0xd3, 0x20, 0x67, 0xa8, 0x7b, 0xa1, 0x31, 0x5b, 0xa1, 0x12, - 0xe8, 0xd5, 0x5c, 0x13, 0x29, 0xaf, 0x0b, 0x26, 0x18, 0xcc, 0x45, 0x38, - 0xea, 0xa5, 0x4d, 0x61, 0x3c, 0x6c, 0xba, 0x2d, 0x6f, 0x4e, 0x4a, 0x1f, - 0xe5, 0x4e, 0x75, 0xcb, 0xf8, 0xb1, 0x24, 0xc0, 0x9f, 0xa4, 0x68, 0x35, - 0x90, 0x37, 0xbd, 0xf4, 0x78, 0xfe, 0x9a, 0xec, 0xd4, 0x0e, 0x65, 0xce, - 0x41, 0x2e, 0x53, 0x0e, 0xc9, 0x7f, 0xa7, 0x41, 0xb7, 0x0b, 0x0a, 0x56, - 0x8e, 0x5b, 0x03, 0x49, 0xf8, 0x93, 0x0f, 0xdd, 0x05, 0x66, 0x48, 0x82, - 0x14, 0x8f, 0xa3, 0x16, 0x37, 0x5d, 0xbd, 0x60, 0xa0, 0xe5, 0xce, 0x21, - 0x77, 0x37, 0x64, 0x72, 0x93, 0x7b, 0x54, 0xca, 0x19, 0xc0, 0x81, 0x80, - 0x55, 0xb1, 0xf6, 0x87, 0x99, 0xa4, 0x27, 0xda, 0xa1, 0xdf, 0xc0, 0x18, - 0x80, 0x50, 0xc6, 0xe4, 0xa6, 0x31, 0x63, 0x9f, 0x7a, 0xf2, 0x3a, 0xca, - 0x3f, 0xfa, 0x1e, 0xd8, 0xe2, 0xca, 0xef, 0x85, 0x29, 0x53, 0x71, 0x0b, - 0x4a, 0x13, 0x49, 0x53, 0xdd, 0xb7, 0x77, 0x2c, 0x9a, 0xc2, 0x85, 0x98, - 0x1a, 0x35, 0x3f, 0x25, 0xba, 0xe8, 0xc7, 0x0d, 0x7d, 0x3e, 0x2b, 0xaa, - 0x86, 0xd4, 0x38, 0x17, 0x25, 0x22, 0xe8, 0xb3, 0xb2, 0x3e, 0x8d, 0x10, - 0x38, 0xc7, 0x65, 0x09, 0xe6, 0xc1, 0x9c, 0xe2, 0xb3, 0x62, 0x00, 0x4c, - 0x5f, 0x64, 0x2c, 0x06, 0x2f, 0x45, 0x7d, 0xab, 0xb7, 0xfe, 0x74, 0x26, - 0x45, 0x11, 0x0b, 0xb4, 0x40, 0x0a, 0x09, 0x70, 0x6f, 0x78, 0xb4, 0x49, - 0x09, 0x58, 0xeb, 0x27, 0x8c, 0x45, 0xae, 0xad, 0x91, 0xfb, 0xba, 0xf6, - 0x67, 0xce, 0x77, 0x4d, 0xdf, 0x69, 0xec, 0xb4, 0x15, 0x26, 0x0f, 0x75, - 0x90, 0xfb, 0xef, 0x36, 0xbd, 0x12, 0xd3, 0xec, 0xc4, 0xb5, 0x5a, 0xd1, - 0x0d, 0xc8, 0x1c, 0xf0, 0x98, 0xc2, 0xa9, 0xd4, 0x0b, 0x30, 0x76, 0xb7, - 0xb6, 0x8a, 0x16, 0x57, 0xd1, 0xd0, 0x0a, 0x40, 0x1d, 0x89, 0xf9, 0x80, - 0x32, 0x56, 0x9d, 0x12, 0x7c, 0x11, 0xb2, 0x3c, 0x22, 0x38, 0xd2, 0x4e, - 0x8a, 0x38, 0x9c, 0x10, 0xe3, 0xb7, 0x6e, 0x97, 0x4a, 0xb7, 0xbc, 0xcc, - 0x80, 0x5e, 0x65, 0x44, 0xfe, 0xdd, 0x1e, 0x29, 0xb3, 0x17, 0xfe, 0x86, - 0x5e, 0xe7, 0xe0, 0xf5, 0x3a, 0x9d, 0x75, 0x92, 0x20, 0x6d, 0x28, 0xb6, - 0x1e, 0x47, 0x75, 0x95, 0x5e, 0x37, 0x2c, 0x3b, 0xee, 0xd9, 0x47, 0xce, - 0x25, 0xfd, 0x1e, 0xb0, 0x8b, 0x62, 0xb0, 0x51, 0xeb, 0x9f, 0xfb, 0xd9, - 0xb5, 0x4f, 0xfa, 0xb9, 0x0a, 0x94, 0x75, 0x93, 0xd0, 0x43, 0x79, 0xa2, - 0x36, 0xca, 0x36, 0xf9, 0x35, 0x2b, 0x50, 0xc0, 0xea, 0x47, 0x2f, 0x3c, - 0xa9, 0xef, 0x37, 0xe3, 0xd7, 0xc7, 0x5f, 0xdb, 0x72, 0xca, 0xab, 0x64, - 0xd9, 0x76, 0x7f, 0x4d, 0x1d, 0xbd, 0x09, 0xb7, 0x79, 0x37, 0xa8, 0x71, - 0x0d, 0x5a, 0x5d, 0xa8, 0xc5, 0x78, 0xce, 0xcd, 0x7a, 0x4e, 0xab, 0x62, - 0xf7, 0x97, 0xe9, 0x7c, 0x66, 0xbe, 0xf6, 0x39, 0x73, 0xc2, 0x62, 0x50, - 0x0f, 0x4a, 0x3a, 0x56, 0x0f, 0x63, 0xcd, 0xd9, 0x8f, 0x3b, 0x65, 0x5c, - 0x8e, 0x1c, 0xfa, 0xc6, 0xfc, 0xf5, 0x79, 0x04, 0xde, 0x30, 0x6e, 0x59, - 0xb2, 0x66, 0x5f, 0x08, 0x3a, 0x61, 0x34, 0x7f, 0x9e, 0x57, 0x10, 0xde, - 0x06, 0x3e, 0xa9, 0x08, 0x55, 0x2e, 0x91, 0x20, 0x63, 0xac, 0x6c, 0xf6, - 0x7a, 0xe6, 0xa0, 0x1d, 0x4b, 0xc8, 0xe2, 0x2a, 0x52, 0x21, 0x9b, 0x4b, - 0x86, 0x10, 0x38, 0xa5, 0x0e, 0x55, 0xaa, 0x91, 0x7a, 0xbb, 0x04, 0xf7, - 0x7b, 0x04, 0xce, 0xcd, 0xe5, 0x9b, 0x3a, 0x0b, 0x20, 0x91, 0x33, 0xb9, - 0x1a, 0x49, 0x03, 0x77, 0xb1, 0x3c, 0xe8, 0xac, 0xf4, 0x74, 0xf6, 0xf2, - 0x53, 0x35, 0x91, 0xc1, 0xa9, 0xf6, 0x04, 0xae, 0x1e, 0x56, 0xbe, 0xb9, - 0xa7, 0x6c, 0xc9, 0xe3, 0xf0, 0xdf, 0x98, 0x01, 0x89, 0xcb, 0xe3, 0xbe, - 0x2c, 0xad, 0x57, 0xae, 0xfe, 0x13, 0x23, 0x11, 0xa7, 0x6f, 0x7d, 0xdd, - 0x35, 0x46, 0x20, 0x54, 0x9c, 0x6d, 0x93, 0xd2, 0x34, 0xaf, 0x75, 0xe6, - 0xc3, 0x54, 0x38, 0xb5, 0x8c, 0x30, 0xd2, 0x48, 0xc1, 0x95, 0x3a, 0x8c, - 0xa5, 0x03, 0xa6, 0xa6, 0x14, 0xa2, 0x1c, 0xe3, 0x44, 0x8b, 0xc9, 0x58, - 0xfd, 0xad, 0xe3, 0x65, 0x11, 0xd0, 0x08, 0x0e, 0x88, 0xeb, 0x31, 0xac, - 0x4c, 0x5e, 0xae, 0xb4, 0xb2, 0xec, 0xe9, 0x71, 0x44, 0xe5, 0xc0, 0x85, - 0x23, 0x31, 0x22, 0x49, 0x4f, 0x40, 0xc2, 0xbd, 0x7a, 0x77, 0x81, 0x6b, - 0x21, 0x16, 0xe0, 0x26, 0xce, 0x04, 0x2c, 0x88, 0xdd, 0x49, 0x66, 0xeb, - 0x66, 0xa9, 0xc8, 0x5c, 0xb8, 0xe2, 0xbc, 0x2f, 0x1f, 0xe8, 0x5e, 0x4e, - 0x20, 0x3d, 0x52, 0xf6, 0x7c, 0xa4, 0x27, 0xed, 0x5f, 0x23, 0x74, 0x2c, - 0xde, 0x57, 0xad, 0xb9, 0x09, 0xf3, 0x69, 0x33, 0x72, 0x62, 0x9a, 0x66, - 0xde, 0xc1, 0x5e, 0xf4, 0xba, 0x9c, 0x79, 0x40, 0x89, 0xd0, 0xea, 0x82, - 0x65, 0x71, 0x89, 0x5a, 0x01, 0xf3, 0xa9, 0x1b, 0x29, 0x08, 0x50, 0x47, - 0x5f, 0xb5, 0x0e, 0x4b, 0x75, 0x20, 0xa8, 0xdd, 0xf8, 0xbd, 0x39, 0xa8, - 0xbd, 0x50, 0xd8, 0x41, 0x16, 0x2a, 0x48, 0x69, 0x03, 0x74, 0xb0, 0x03, - 0x6d, 0xfa, 0xfa, 0x92, 0x1a, 0xa4, 0x72, 0xaa, 0xe6, 0x0c, 0x2c, 0xa3, - 0x74, 0x4a, 0xd2, 0x7d, 0xa8, 0xad, 0xed, 0x3d, 0xe4, 0x0a, 0xd0, 0x5c, - 0x19, 0x85, 0x0b, 0xf8, 0x4d, 0x8e, 0x65, 0x82, 0x90, 0xd7, 0xfc, 0xc8, - 0xaf, 0x48, 0xa6, 0xf1, 0xe1, 0xfd, 0xb0, 0xc4, 0xe5, 0xa5, 0x8f, 0x18, - 0x2e, 0xc9, 0x17, 0xfb, 0xf7, 0xe8, 0x3d, 0xba, 0x0e, 0x50, 0x97, 0x8e, - 0xf3, 0x31, 0x11, 0xc9, 0xf1, 0x9f, 0x8e, 0x02, 0xbe, 0x38, 0x28, 0x5f, - 0x85, 0x09, 0xae, 0xbe, 0xcd, 0xdd, 0xe9, 0x06, 0x58, 0x23, 0xd7, 0x0b, - 0x24, 0x7a, 0xc0, 0x66, 0x02, 0xaa, 0x8f, 0x71, 0xe7, 0x0a, 0x24, 0xaf, - 0x5e, 0x74, 0xba, 0xf7, 0xc9, 0x4d, 0xc8, 0x3a, 0x70, 0xee, 0x4f, 0x86, - 0x49, 0xbc, 0x5b, 0x29, 0xed, 0x1b, 0x86, 0x00, 0x63, 0x52, 0x9c, 0x5b, - 0x4f, 0x64, 0xaa, 0x4a, 0x8d, 0xc7, 0xf3, 0xad, 0xfb, 0x9b, 0x99, 0x64, - 0x0b, 0xe9, 0xe4, 0xa8, 0xdd, 0x79, 0x43, 0x3d, 0xc1, 0xd1, 0x98, 0x3c, - 0x98, 0xb0, 0xbe, 0x44, 0x0c, 0x51, 0xff, 0x79, 0xe1, 0xa4, 0x60, 0x50, - 0x25, 0x4f, 0x1e, 0x28, 0xa1, 0x78, 0xc9, 0x61, 0xed, 0x0e, 0xaa, 0x08, - 0x54, 0xbb, 0xf4, 0xaf, 0x27, 0xa2, 0x50, 0x79, 0x8a, 0xb3, 0xf6, 0x6d, - 0x2a, 0x0a, 0xd6, 0x65, 0x68, 0x13, 0x9c, 0x79, 0x33, 0x2c, 0x55, 0x40, - 0x40, 0xd9, 0xc6, 0xf6, 0xa3, 0x41, 0x91, 0x41, 0x8b, 0xfa, 0x88, 0xb0, - 0x68, 0x3b, 0x40, 0xc7, 0xb5, 0x3d, 0xd6, 0xfd, 0x57, 0x74, 0xeb, 0xf4, - 0x77, 0x33, 0x88, 0xd7, 0x2f, 0x1e, 0x2e, 0x01, 0x35, 0xe3, 0xd4, 0xfd, - 0xdb, 0xe1, 0x4f, 0x9b, 0x7d, 0xab, 0x70, 0xbb, 0xfb, 0xa8, 0x7c, 0xc1, - 0xc2, 0x3e, 0x69, 0x2b, 0x5b, 0x34, 0xd2, 0x18, 0x4c, 0xd8, 0x49, 0x03, - 0x33, 0x48, 0xcd, 0xab, 0x36, 0xe7, 0xbd, 0xb1, 0xc3, 0x2d, 0x15, 0x05, - 0xde, 0x6c, 0xab, 0xbc, 0x7b, 0x87, 0x9f, 0x6c, 0xdb, 0x0a, 0x26, 0xfd, - 0x3a, 0x2a, 0x7e, 0x60, 0x01, 0x2f, 0xe4, 0x17, 0xfd, 0x94, 0xdc, 0x9b, - 0x2a, 0x52, 0xd9, 0x87, 0x34, 0x9c, 0x2a, 0x75, 0x53, 0xc7, 0x36, 0x15, - 0x3a, 0x28, 0x03, 0x4a, 0x63, 0x72, 0x3a, 0x0b, 0xa6, 0xde, 0xa6, 0x0e, - 0xde, 0x3a, 0xbb, 0x88, 0x85, 0x36, 0xb5, 0x54, 0x20, 0x97, 0x40, 0xc6, - 0x35, 0x91, 0xa8, 0x38, 0x7b, 0x74, 0xf4, 0xe2, 0xc5, 0x8d, 0x8e, 0xf2, - 0x79, 0x5c, 0x0a, 0xab, 0xe2, 0xff, 0x68, 0xd7, 0x99, 0xe5, 0x8b, 0x73, - 0xe7, 0x95, 0x35, 0x4b, 0x2e, 0x3c, 0x18, 0xe2, 0xd4, 0xf2, 0x7c, 0x93, - 0xa2, 0xa1, 0x67, 0x76, 0x7d, 0xa2, 0xbd, 0x8d, 0x21, 0xdb, 0xf3, 0xc4, - 0x6d, 0x07, 0x85, 0x70, 0x9a, 0xa6, 0x08, 0x57, 0x3c, 0x97, 0x28, 0x64, - 0xc5, 0xd2, 0xc7, 0x34, 0xef, 0x9a, 0x7c, 0x46, 0x19, 0x88, 0x9c, 0xee, - 0x35, 0xfa, 0x32, 0x1c, 0x68, 0x7d, 0x03, 0x50, 0x32, 0x11, 0x0b, 0x7c, - 0x1d, 0xa4, 0xc8, 0xde, 0x2a, 0x17, 0x7d, 0x6c, 0x78, 0x5d, 0x4f, 0x6b, - 0xaf, 0x44, 0x40, 0x43, 0x0b, 0xe5, 0x14, 0xe6, 0x76, 0xa4, 0xba, 0xf4, - 0x04, 0x8c, 0x1e, 0x35, 0x7c, 0x6a, 0x85, 0x34, 0x5c, 0x32, 0xdc, 0x8e, - 0xcf, 0xdb, 0x81, 0x33, 0x9a, 0x90, 0x9f, 0xff, 0x1c, 0xc8, 0xcf, 0x9a, - 0x99, 0x22, 0xa8, 0xa2, 0xf7, 0x74, 0x40, 0x2c, 0x66, 0x48, 0xe1, 0x8f, - 0xac, 0x39, 0x7f, 0x1e, 0x1b, 0xeb, 0x73, 0x62, 0x0b, 0x31, 0x75, 0x57, - 0x6d, 0xea, 0x28, 0xf8, 0x00, 0x85, 0x53, 0xae, 0xc1, 0xc8, 0x45, 0x5c, - 0xd4, 0x05, 0xbd, 0x2e, 0x9a, 0x47, 0xc8, 0x6d, 0x0c, 0x1f, 0x11, 0xd2, - 0x53, 0x41, 0x2c, 0x6b, 0x0e, 0xd7, 0x2a, 0xd1, 0xb3, 0x83, 0x74, 0xd9, - 0x92, 0xa5, 0x4e, 0xc8, 0x87, 0x9b, 0x17, 0x7b, 0xd5, 0xd5, 0x95, 0x19, - 0x89, 0x0e, 0x2f, 0xa6, 0xe5, 0x91, 0x3e, 0xd1, 0x81, 0x82, 0x71, 0x75, - 0x8a, 0xa2, 0x2b, 0xc4, 0x13, 0xb7, 0xc5, 0x99, 0x8e, 0x40, 0xfd, 0xb6, - 0x10, 0xc3, 0x83, 0x0d, 0x00, 0x72, 0x1e, 0xfc, 0x76, 0x40, 0x3a, 0xca, - 0x10, 0x02, 0x00, 0x64, 0x8a, 0xc6, 0xa2, 0xbc, 0xea, 0x39, 0xb3, 0xa0, - 0xd0, 0x83, 0x1d, 0xe8, 0x59, 0xc9, 0x43, 0xda, 0x59, 0x73, 0x85, 0xdf, - 0xf8, 0x4d, 0xe3, 0x34, 0x1a, 0x10, 0xd9, 0x4c, 0x51, 0x41, 0xe7, 0x01, - 0x8c, 0x7b, 0x3a, 0xcd, 0xe3, 0x69, 0xf2, 0x23, 0xd2, 0xaa, 0xbf, 0xa2, - 0xae, 0xb5, 0x4d, 0x52, 0xc8, 0x8a, 0x4e, 0x50, 0x12, 0xbf, 0xc9, 0x52, - 0xa4, 0x4e, 0x93, 0x68, 0x35, 0x12, 0x9b, 0x6c, 0x2c, 0x6b, 0xae, 0x57, - 0x22, 0x35, 0x7a, 0x80, 0xc1, 0x21, 0x5a, 0xe5, 0x2a, 0xcd, 0xfa, 0x04, - 0x8d, 0xdb, 0xd8, 0x5d, 0x6d, 0x72, 0x30, 0xf8, 0x3b, 0x95, 0xa6, 0x34, - 0x48, 0xb4, 0xc9, 0x7b, 0x93, 0x35, 0xc6, 0x2b, 0x4c, 0x02, 0x43, 0xdd, - 0xe5, 0x7f, 0xb8, 0xf4, 0xc3, 0x0b, 0x82, 0x98, 0x87, 0x3e, 0x45, 0x96, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x20, 0x2e, 0x64, 0x27, 0x07, 0xfc, 0xb6, 0x10, 0x69, 0xaa, 0xb4, 0x4f, - 0x05, 0x94, 0x71, 0x69, 0xa6, 0xdd, 0xe9, 0xf3, 0xf5, 0x85, 0x8c, 0x41, - 0x2a, 0x7f, 0x53, 0x0f, 0xfc, 0xc7, 0xd6, 0xf0, 0x13, 0xc9, 0xc4, 0x2f, - 0xab, 0xa1, 0x97, 0x23, 0xab, 0x99, 0x3d, 0x73, 0x9c, 0xd8, 0xb9, 0x56, - 0xdf, 0x96, 0xee, 0x18, 0xdc, 0xf8, 0xb2, 0x8b, 0x80, 0x6c, 0x70, 0x3b, - 0xf5, 0x36, 0x1b, 0x3a, 0xde, 0x97, 0xef, 0x19, 0xdd, 0xf9, 0xb3, 0x8a, - 0x81, 0x6d, 0x71, 0x3a, 0xf4, 0x37, 0x1a, 0x3b, 0xc2, 0x1e, 0xbb, 0xf4, - 0xd8, 0x3f, 0xcc, 0x3d, 0x9b, 0x11, 0x0c, 0x26, 0x2f, 0xe5, 0xb2, 0xbe, - 0xc1, 0x1d, 0xb8, 0xf7, 0xdb, 0x3c, 0xcf, 0x3e, 0x98, 0x12, 0x0f, 0x25, - 0x2c, 0xe6, 0xb1, 0xbd, 0xc1, 0x1d, 0xb8, 0xf7, 0xdb, 0x3c, 0xcf, 0x3e, - 0x98, 0x12, 0x0f, 0x25, 0x2c, 0xe6, 0xb1, 0xbd, 0xc1, 0x1d, 0xb8, 0xf7, - 0xdb, 0x3c, 0xcf, 0x3e, 0x98, 0x12, 0x0f, 0x25, 0x2c, 0xe6, 0xb1, 0xbd, - 0x1b, 0xf1, 0x2b, 0xf5, 0x2e, 0x0e, 0xb8, 0x66, 0x7a, 0xbb, 0x99, 0x09, - 0xd6, 0x96, 0xfe, 0xcf, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x70, 0xd1, 0xf2, 0x19, - 0xdb, 0x42, 0xce, 0x6e, 0x39, 0xfe, 0x66, 0x92, 0xf5, 0x9b, 0xa8, 0xc4, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x5f, 0x47, 0x9b, 0x0a, - 0xff, 0x6a, 0xfc, 0xcc, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x77, 0x02, 0x29, 0x37, 0x9c, 0x01, 0xa4, 0x82, - 0x12, 0x09, 0xe8, 0xd6, 0xaa, 0x49, 0x68, 0xbf, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0x8f, 0x00, 0xfa, 0xcc, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0xc0, 0x66, 0x1e, 0x10, 0x6f, 0xdc, 0xcb, 0x58, 0x9f, 0x46, 0xb9, 0x90, - 0x47, 0x9a, 0xb5, 0xfd, 0x27, 0x62, 0xbb, 0x47, 0xcb, 0x17, 0x12, 0xf3, - 0x52, 0x4a, 0xc9, 0x32, 0xaa, 0x26, 0xcc, 0x6c, 0x0a, 0x39, 0xda, 0x73, - 0xd9, 0xa0, 0xd5, 0x52, 0x7c, 0x1c, 0xcf, 0x46, 0xbd, 0x1b, 0x33, 0x4b, - 0x7e, 0xdc, 0xb7, 0xc1, 0xd1, 0x74, 0x6a, 0x6d, 0xda, 0xa7, 0xd2, 0xbd, - 0x6e, 0xaa, 0xdf, 0x17, 0xa8, 0x60, 0xdc, 0x9f, 0xfc, 0xea, 0x57, 0xe8, - 0x19, 0x8c, 0x28, 0x99, 0x94, 0xb0, 0x91, 0xd9, 0xa1, 0x49, 0xa4, 0xcd, - 0xc9, 0x64, 0x95, 0x2e, 0x08, 0x3f, 0x43, 0x17, 0xdc, 0x54, 0x53, 0x8f, - 0xac, 0x84, 0x81, 0x8c, 0x54, 0x99, 0x79, 0xfd, 0xf9, 0x97, 0x17, 0x95, - 0x18, 0x5c, 0x33, 0xc9, 0x25, 0x69, 0x86, 0x6e, 0x4e, 0x3e, 0x5f, 0x42, - 0x63, 0x00, 0x85, 0x5c, 0x86, 0x35, 0x21, 0x3b, 0x57, 0x3b, 0x6d, 0xdd, - 0xc5, 0x2a, 0xb8, 0x7e, 0xc2, 0x3e, 0x18, 0x66, 0x83, 0x98, 0x9a, 0xb0, - 0x20, 0xb0, 0xdb, 0x2e, 0xe3, 0xeb, 0x0a, 0x64, 0xcb, 0x44, 0x33, 0x6d, - 0xb6, 0x26, 0xab, 0xd0, 0xaf, 0x5f, 0x92, 0x6e, 0x5e, 0x20, 0x40, 0x99, - 0xa6, 0xf6, 0x4d, 0x97, 0xd2, 0x71, 0x88, 0x97, 0x21, 0x3d, 0xff, 0x50, - 0xee, 0xf0, 0x70, 0x23, 0xb5, 0xb2, 0xde, 0x43, 0x9b, 0x8f, 0x04, 0xe8, - 0x69, 0x54, 0xd0, 0x21, 0xff, 0x0c, 0xbb, 0x3e, 0x41, 0x47, 0xfa, 0xd1, - 0x3c, 0xba, 0x11, 0xde, 0x00, 0x65, 0xb0, 0xa9, 0x63, 0x33, 0x88, 0x44, - 0xf2, 0x4a, 0xbc, 0x49, 0xcf, 0x68, 0xc0, 0x67, 0x9e, 0xba, 0x20, 0x90, - 0x11, 0x80, 0xb4, 0x05, 0x5e, 0x99, 0x0e, 0x84, 0x08, 0x40, 0x2e, 0x8f, - 0x52, 0xf0, 0xb0, 0xf2, 0x2f, 0x70, 0xeb, 0xf4, 0x82, 0x1e, 0x86, 0x57, - 0xef, 0xec, 0x61, 0x0c, 0x3e, 0x63, 0x4f, 0x76, 0xad, 0x17, 0x52, 0xe3, - 0x7d, 0xf5, 0x9d, 0x37, 0xdb, 0x8c, 0x73, 0x50, 0x15, 0x7c, 0xfd, 0x0e, - 0xa5, 0xe7, 0xb8, 0x87, 0xa8, 0x0d, 0x57, 0xa7, 0x21, 0x59, 0x62, 0x4f, - 0xf1, 0x59, 0x32, 0xb2, 0xdd, 0x7d, 0x7d, 0xe1, 0xb3, 0x0f, 0x28, 0x0d, - 0x1f, 0x70, 0x03, 0x3c, 0x6f, 0xcf, 0xc6, 0xa4, 0x01, 0x7d, 0xcb, 0x03, - 0xf2, 0x42, 0xa3, 0xb6, 0x7f, 0x02, 0x24, 0x17, 0xba, 0x55, 0x62, 0x55, - 0xe6, 0xfa, 0xd3, 0x33, 0xdb, 0x0c, 0x4f, 0xca, 0xe8, 0x13, 0xd3, 0xea, - 0xbd, 0xe0, 0xe1, 0xe2, 0xa5, 0x9c, 0x34, 0x54, 0x61, 0xe8, 0x12, 0xbe, - 0x2f, 0x13, 0xdc, 0x5c, 0xb9, 0xc7, 0xc1, 0x1f, 0x3e, 0xfe, 0x93, 0xef, - 0x53, 0xd4, 0x28, 0x01, 0x30, 0xe3, 0x71, 0xc6, 0x87, 0xd9, 0xe3, 0xc4, - 0x3c, 0xb1, 0xf7, 0x7b, 0x4e, 0x3a, 0x37, 0xd2, 0x13, 0x10, 0x71, 0xa9, - 0xb7, 0x48, 0xfc, 0x71, 0xc8, 0xb9, 0xfb, 0xf1, 0x48, 0xae, 0x82, 0x08, - 0xce, 0x6c, 0xbd, 0xd4, 0x4f, 0x07, 0x9f, 0xc8, 0x66, 0xd4, 0xc8, 0xda, - 0xb3, 0x13, 0x91, 0x99, 0x2d, 0x6f, 0xe2, 0xca, 0xe2, 0x7a, 0x8d, 0xbc, - 0x28, 0xe2, 0xdd, 0xc8, 0x03, 0x98, 0xe9, 0x23, 0xf9, 0x13, 0x45, 0xdd, - 0x82, 0x36, 0x28, 0xe7, 0x89, 0x81, 0x07, 0xc1, 0x85, 0x66, 0xeb, 0xfb, - 0x0b, 0xd3, 0x6f, 0x61, 0xfe, 0x31, 0x44, 0x75, 0x3f, 0xfe, 0xe4, 0xad, - 0x57, 0xe6, 0x39, 0xaa, 0x2e, 0xb8, 0xf2, 0x7c, 0xb5, 0x43, 0xe2, 0x20, - 0xf3, 0x10, 0x5e, 0x26, 0xf6, 0x3c, 0xc2, 0x55, 0xfe, 0xec, 0x08, 0x3c, - 0x7a, 0xe3, 0x3b, 0xc2, 0xf1, 0x7d, 0xe6, 0xb8, 0xd4, 0x59, 0x25, 0x2c, - 0x24, 0xd4, 0x64, 0x24, 0x0d, 0xf2, 0x75, 0xef, 0x2c, 0xa8, 0x2d, 0x46, - 0xd0, 0x1b, 0xfc, 0x9f, 0x03, 0x07, 0xbb, 0xc1, 0x19, 0xd5, 0x4d, 0x08, - 0x79, 0x2c, 0xfa, 0x91, 0x63, 0x09, 0xa6, 0x96, 0xd5, 0xeb, 0x68, 0x5c, - 0xb8, 0x68, 0xca, 0x5c, 0x59, 0xb5, 0x38, 0xe5, 0x32, 0xff, 0xd8, 0xab, - 0x55, 0x42, 0x25, 0xfb, 0x16, 0x9c, 0x0f, 0x87, 0x05, 0xb0, 0x0c, 0x4e, - 0xb4, 0x9c, 0x22, 0xe6, 0x5d, 0x81, 0x6e, 0x04, 0xa4, 0x24, 0xcb, 0x1a, - 0x17, 0x86, 0x0f, 0xa5, 0x4d, 0x52, 0x2b, 0xd9, 0x1b, 0xcc, 0x7c, 0x2d, - 0x98, 0x42, 0xac, 0x9b, 0xbc, 0x06, 0x9b, 0x57, 0x9f, 0x58, 0x6d, 0x70, - 0xf1, 0x83, 0xab, 0xf9, 0x53, 0x29, 0xc8, 0xe2, 0xff, 0xaf, 0xfb, 0x39, - 0x39, 0xe4, 0x68, 0x55, 0xa3, 0xff, 0x13, 0x72, 0x0f, 0x4a, 0x41, 0xcf, - 0x91, 0x05, 0x03, 0xe5, 0x2e, 0x5f, 0x3b, 0xbb, 0x01, 0x66, 0x86, 0x44, - 0xaf, 0xbd, 0xb0, 0x38, 0x24, 0xca, 0x19, 0x24, 0x30, 0x53, 0x6b, 0x2d, - 0xd3, 0x43, 0x3b, 0x7a, 0x78, 0x98, 0x50, 0xbe, 0x86, 0x1a, 0x39, 0x44, - 0x7e, 0xcb, 0x38, 0x4f, 0x03, 0xe4, 0xff, 0xa8, 0x27, 0x7b, 0x6d, 0x26, - 0xc2, 0x5c, 0x70, 0x86, 0x1e, 0x08, 0xe0, 0x9c, 0xb6, 0x38, 0xf9, 0xbf, - 0xea, 0x66, 0x78, 0x15, 0x73, 0x88, 0x46, 0xac, 0x47, 0x32, 0x8e, 0x3a, - 0x4a, 0xe4, 0x5b, 0xa8, 0x9f, 0xcf, 0x32, 0x48, 0xc4, 0xf6, 0xcb, 0x3b, - 0xf1, 0x7a, 0x52, 0x08, 0x89, 0x63, 0x43, 0x3a, 0xea, 0xe3, 0x96, 0xee, - 0xc1, 0x87, 0x53, 0x87, 0x9f, 0x3a, 0x8c, 0x2b, 0x80, 0x14, 0xa9, 0xa2, - 0x99, 0x27, 0xe7, 0xdd, 0x11, 0x63, 0x25, 0xc7, 0x04, 0x54, 0x75, 0x3a, - 0xc2, 0xa2, 0x9a, 0x44, 0x5a, 0x4a, 0xbf, 0x4a, 0x34, 0x8b, 0xe9, 0x8b, - 0xc4, 0x4a, 0x15, 0xe0, 0xfd, 0x4b, 0x50, 0xc0, 0x83, 0x2d, 0xbd, 0x0b, - 0x04, 0xa2, 0x52, 0x24, 0xe7, 0xd0, 0x1f, 0xbb, 0x95, 0xe0, 0x89, 0x06, - 0x61, 0x30, 0x28, 0x03, 0x82, 0x5c, 0xb5, 0x57, 0x84, 0x85, 0x59, 0xb4, - 0x5b, 0xcd, 0xf8, 0x32, 0x15, 0x50, 0x91, 0xdd, 0x47, 0xc5, 0xf1, 0xcd, - 0x34, 0x65, 0x6a, 0x6a, 0xc6, 0x16, 0x10, 0x7e, 0xad, 0x3c, 0x4f, 0x8c, - 0x44, 0xc2, 0x39, 0x12, 0x3d, 0x35, 0x35, 0xbc, 0x1d, 0x59, 0x29, 0xdf, - 0x98, 0x81, 0x87, 0x70, 0xa5, 0x00, 0xdc, 0xe1, 0xd0, 0x07, 0x78, 0x8d, - 0xe0, 0x39, 0x10, 0xfb, 0x1d, 0x55, 0xae, 0x99, 0x86, 0x21, 0x76, 0x7f, - 0x39, 0x00, 0xe4, 0x68, 0xda, 0x45, 0x47, 0x77, 0xc2, 0x98, 0x23, 0x12, - 0x05, 0x12, 0x23, 0xb1, 0x61, 0xb7, 0x57, 0xa3, 0x35, 0xf6, 0x8b, 0x8b, - 0xd6, 0x6c, 0x30, 0xb8, 0x0f, 0x65, 0x58, 0xe7, 0x45, 0xd6, 0xd1, 0xed, - 0xff, 0xe7, 0xb0, 0xd9, 0x70, 0xc4, 0xc0, 0xc7, 0x5a, 0xe6, 0xf1, 0x2a, - 0xb0, 0x85, 0x92, 0x89, 0x36, 0x68, 0xb6, 0xef, 0x4b, 0xba, 0x93, 0xc6, - 0xd5, 0x23, 0xa5, 0x7d, 0x0d, 0x71, 0x89, 0x03, 0x4a, 0xba, 0xc1, 0xc1, - 0x4f, 0x18, 0x54, 0x33, 0x6a, 0xba, 0xac, 0xb2, 0x12, 0x5d, 0x0c, 0x0e, - 0x95, 0x3b, 0xf1, 0xb4, 0x82, 0xef, 0xd5, 0x37, 0x2f, 0x52, 0xce, 0xfa, - 0x0b, 0x52, 0xfa, 0x87, 0x33, 0x0f, 0xe0, 0x6e, 0x95, 0xfc, 0x17, 0xa8, - 0xd1, 0x4a, 0x76, 0xa1, 0xfe, 0x3b, 0x2d, 0xbb, 0x30, 0x1c, 0xb9, 0xf1, - 0x4a, 0x8e, 0xac, 0x84, 0x2e, 0x2e, 0x1c, 0x94, 0xa0, 0x63, 0x17, 0x15, - 0xb5, 0xac, 0x3e, 0x73, 0x8f, 0xf2, 0x7b, 0x55, 0x3b, 0x82, 0xfd, 0xa0, - 0x99, 0x34, 0x20, 0x07, 0xee, 0x72, 0x47, 0x53, 0xf4, 0x7d, 0x4b, 0x5d, - 0x08, 0x7a, 0x31, 0xbc, 0x8c, 0x5c, 0x61, 0x3e, 0xae, 0x89, 0x51, 0x19, - 0xf2, 0xdd, 0x3f, 0xdf, 0xc8, 0x1f, 0x6a, 0x57, 0x55, 0x01, 0x78, 0x58, - 0x01, 0x7a, 0xeb, 0x4c, 0x7f, 0xb1, 0xdf, 0x42, 0x24, 0xfe, 0x16, 0xa4, - 0x0c, 0xa7, 0xe2, 0xc3, 0xb3, 0xe1, 0x86, 0x33, 0x13, 0xec, 0x35, 0xfa, - 0x56, 0xc3, 0xd3, 0xd5, 0x6a, 0x46, 0xc6, 0x87, 0x18, 0x82, 0x5d, 0x88, - 0xe8, 0xb3, 0xf8, 0xc1, 0x9a, 0x00, 0x0c, 0x25, 0x86, 0xe1, 0x8b, 0xec, - 0x8e, 0xb0, 0x53, 0x1a, 0x4b, 0x3a, 0x33, 0x67, 0x17, 0x36, 0x16, 0x69, - 0x82, 0xc6, 0x0c, 0xa9, 0x6d, 0xdd, 0xda, 0x2b, 0xe5, 0xf9, 0xc4, 0xf4, - 0x84, 0xc8, 0xb8, 0xcf, 0x47, 0x33, 0xa9, 0x3e, 0xfe, 0x9c, 0x54, 0x02, - 0xa5, 0x38, 0x60, 0x41, 0x2c, 0x74, 0x14, 0x57, 0x71, 0xa0, 0xc4, 0x15, - 0x76, 0x4d, 0xae, 0xf4, 0xba, 0x54, 0x04, 0x4c, 0xce, 0x70, 0x02, 0xeb, - 0x05, 0xbe, 0x13, 0x03, 0xf0, 0x9d, 0xdc, 0x3f, 0x19, 0x03, 0xd1, 0xac, - 0xf3, 0x57, 0x7b, 0x73, 0x2b, 0x93, 0xa2, 0xd2, 0x3a, 0x5d, 0xaf, 0x88, - 0x7e, 0x9d, 0xda, 0xb0, 0xe9, 0x9b, 0xd1, 0xf6, 0xcf, 0xce, 0x37, 0xd0, - 0xfc, 0x1e, 0x84, 0x3a, 0x9b, 0x3e, 0x1e, 0xfe, 0x31, 0xc1, 0xf8, 0x33, - 0x09, 0x42, 0xd1, 0xb0, 0xf6, 0x79, 0x37, 0x54, 0x6e, 0x3b, 0x81, 0x83, - 0x64, 0x70, 0xb0, 0xcd, 0x34, 0x9c, 0x8b, 0xdc, 0x7e, 0x2a, 0x4c, 0x7f, - 0x65, 0x3c, 0x0b, 0x22, 0x29, 0x5b, 0x33, 0x1c, 0x8f, 0x8a, 0x6e, 0xb2, - 0x87, 0x64, 0xac, 0xb8, 0xec, 0x95, 0x8b, 0xcf, 0xc5, 0xc1, 0x68, 0xf3, - 0x1a, 0x19, 0xf1, 0x80, 0x29, 0x60, 0x85, 0x70, 0x9a, 0x65, 0xe8, 0x03, - 0xf5, 0x51, 0x6a, 0xa5, 0x43, 0x5d, 0xc8, 0xdd, 0xf3, 0xef, 0xc7, 0xcd, - 0x62, 0x33, 0x36, 0x18, 0x7d, 0x4b, 0xf3, 0x48, 0x45, 0x4d, 0xf3, 0xa5, - 0x3b, 0x62, 0x30, 0x71, 0x11, 0x7d, 0xec, 0x2a, 0xdf, 0x48, 0xff, 0x05, - 0xd1, 0x5f, 0x84, 0x50, 0x79, 0x1a, 0x14, 0x11, 0xbd, 0xcb, 0x77, 0x1d, - 0x9d, 0x27, 0x65, 0xf3, 0x94, 0xd7, 0x09, 0xce, 0xb6, 0x93, 0x86, 0x9c, - 0x6b, 0xeb, 0x58, 0xb8, 0x91, 0xb0, 0x37, 0xb2, 0x2d, 0xcf, 0xf9, 0x2f, - 0xcd, 0x15, 0x15, 0xad, 0x9c, 0x3c, 0xa1, 0xa9, 0x66, 0x49, 0x6b, 0x96, - 0xa5, 0xda, 0x90, 0x75, 0x34, 0x23, 0x88, 0xf6, 0xf8, 0x36, 0xd3, 0x5d, - 0xee, 0xc5, 0x2e, 0x3c, 0x78, 0x21, 0xe8, 0x82, 0x1f, 0x05, 0x13, 0xc6, - 0x92, 0xfa, 0x02, 0xe7, 0x3e, 0xbf, 0x5b, 0x80, 0xef, 0x2b, 0xaf, 0x6c, - 0x36, 0x76, 0xc8, 0x77, 0xe0, 0xe2, 0x98, 0xb1, 0x63, 0xe1, 0x2d, 0x9f, - 0xb3, 0x02, 0x76, 0x7b, 0x54, 0x46, 0x3d, 0xbd, 0x0b, 0xe7, 0xd7, 0x3d, - 0xfb, 0x26, 0x40, 0x2d, 0xd0, 0x6a, 0x6f, 0xbb, 0x5b, 0xc7, 0xc3, 0x63, - 0xe4, 0xfe, 0x0b, 0x02, 0xba, 0xbf, 0xf2, 0xb2, 0x6d, 0x99, 0xb3, 0x3a, - 0x1c, 0x99, 0x93, 0x06, 0xb5, 0x30, 0xc7, 0xe0, 0x90, 0xae, 0x35, 0x8a, - 0x52, 0xc1, 0xf1, 0x01, 0x76, 0x5f, 0xa7, 0x60, 0xbd, 0xe4, 0x6f, 0x9b, - 0xd4, 0xcf, 0x43, 0xc1, 0x4c, 0x8c, 0xff, 0x9d, 0x4e, 0x88, 0xfc, 0x61, - 0x7e, 0xee, 0x71, 0x71, 0x72, 0x33, 0x05, 0x11, 0x97, 0x08, 0x1b, 0x5f, - 0x3d, 0x60, 0x0e, 0x55, 0xa7, 0x27, 0xd1, 0x59, 0x66, 0x9e, 0x21, 0x18, - 0xea, 0xfa, 0x09, 0xb9, 0xa8, 0x4d, 0x95, 0x01, 0x19, 0x90, 0xa9, 0x5a, - 0xc3, 0x61, 0xfb, 0x17, 0xfd, 0x66, 0x6d, 0xd1, 0x01, 0xcc, 0x1c, 0xb1, - 0x83, 0x83, 0x9e, 0x20, 0x81, 0x1e, 0x95, 0xb0, 0x15, 0x91, 0x6c, 0xf4, - 0x69, 0x65, 0xf5, 0xd5, 0x17, 0xe9, 0xcb, 0xc0, 0xf1, 0xc8, 0xd4, 0x93, - 0x6d, 0x25, 0x05, 0xdb, 0x43, 0x8c, 0x5f, 0xb5, 0xbf, 0xea, 0xba, 0xdc, - 0x1d, 0xbc, 0xeb, 0x2f, 0xa5, 0x11, 0xec, 0x7b, 0x40, 0x5c, 0xf7, 0x67, - 0xab, 0x53, 0x36, 0xb9, 0xc9, 0x23, 0xc5, 0xc6, 0xfa, 0xfd, 0xec, 0x1d, - 0x54, 0x8e, 0xbb, 0x34, 0x6f, 0x10, 0xcc, 0xc0, 0xcb, 0xcf, 0x61, 0x89, - 0xfe, 0xf6, 0x31, 0x69, 0xb4, 0x24, 0x01, 0x21, 0xbe, 0x35, 0xd1, 0xd8, - 0xbc, 0x96, 0x23, 0x0c, 0xd3, 0xb0, 0x06, 0xd9, 0xb4, 0x7b, 0x9b, 0x31, - 0x82, 0x56, 0x76, 0xa5, 0x5e, 0x14, 0x9c, 0x95, 0x48, 0x42, 0xd0, 0xef, - 0x23, 0xee, 0x93, 0x37, 0x23, 0x17, 0xf3, 0xa4, 0xe3, 0xed, 0x8e, 0x7d, - 0x32, 0x3f, 0x6e, 0x9b, 0x9a, 0xba, 0x89, 0xb2, 0x63, 0xed, 0xb1, 0xbc, - 0x7e, 0x61, 0x9c, 0xef, 0xf9, 0xda, 0xd5, 0xd2, 0x02, 0xab, 0xb1, 0xd4, - 0x3e, 0x0b, 0x2f, 0xaa, 0x01, 0xdd, 0xb4, 0xe9, 0xd8, 0x38, 0xbd, 0x31, - 0xd5, 0xcc, 0xfb, 0xbb, 0xaf, 0x82, 0x24, 0xe6, 0x0c, 0x5b, 0x8e, 0x85, - 0xf9, 0x76, 0xce, 0xf5, 0x5f, 0xcb, 0x3b, 0xd9, 0xea, 0xef, 0xa6, 0xe2, - 0x20, 0xa6, 0x7d, 0x91, 0x9a, 0x5a, 0xc4, 0x53, 0xa1, 0x4c, 0x13, 0x1a, - 0xda, 0x59, 0x99, 0xdb, 0x05, 0xbf, 0x35, 0xec, 0xd1, 0x58, 0xf9, 0xa5, - 0xaa, 0x0d, 0xbe, 0x21, 0x07, 0x39, 0xaf, 0xbd, 0xba, 0x4a, 0x3b, 0x12, - 0x4c, 0x00, 0x74, 0xbe, 0x65, 0x3a, 0xe5, 0x68, 0xcd, 0x2e, 0x1d, 0xbb, - 0xfb, 0xde, 0xd4, 0xf4, 0xb7, 0x36, 0xe9, 0x7e, 0x21, 0x3e, 0x6d, 0x98, - 0x7d, 0x10, 0x14, 0xc7, 0x4e, 0x92, 0xc9, 0x92, 0x60, 0xbc, 0xd0, 0x91, - 0xbe, 0x87, 0x05, 0xca, 0xe5, 0x6a, 0x69, 0xc9, 0x63, 0x04, 0x24, 0xd7, - 0x8e, 0x7e, 0xfe, 0x94, 0x6b, 0xbf, 0x44, 0x97, 0x80, 0x9d, 0x08, 0x0a, - 0xdf, 0x95, 0x82, 0x80, 0x57, 0x26, 0x83, 0x73, 0xca, 0x7b, 0xba, 0xf1, - 0x64, 0xb2, 0xd4, 0xe8, 0xa5, 0x46, 0xeb, 0x38, 0x10, 0xd3, 0xbf, 0xe8, - 0x48, 0x16, 0x04, 0xe5, 0x11, 0x68, 0xc6, 0x72, 0xc2, 0x24, 0x1e, 0x7a, - 0x5f, 0xe0, 0xc3, 0xaf, 0x7d, 0x88, 0x84, 0xa7, 0xbb, 0x1b, 0x55, 0x78, - 0xf7, 0xbb, 0xee, 0x3b, 0x61, 0x02, 0xff, 0xf2, 0x6c, 0xd6, 0x34, 0x1f, - 0x43, 0x95, 0xfb, 0xee, 0x8b, 0x75, 0xd3, 0x7e, 0x6c, 0xd5, 0x53, 0x53, - 0xd7, 0x96, 0x15, 0x9d, 0xf7, 0xa1, 0x58, 0x3c, 0x18, 0x61, 0xa8, 0xc0, - 0xf9, 0xc7, 0xab, 0xe8, 0x22, 0x33, 0xbb, 0xbb, 0xf3, 0xf1, 0x0f, 0x37, - 0x13, 0xfa, 0xfd, 0xef, 0x58, 0x57, 0x6f, 0x56, 0x58, 0x17, 0x8c, 0xd6, - 0xb3, 0xa1, 0xca, 0x55, 0x72, 0xd5, 0x38, 0x76, 0x27, 0x2d, 0x64, 0xf3, - 0x29, 0x3d, 0x5a, 0x76, 0xd6, 0x94, 0xa4, 0xec, 0xee, 0xc3, 0x6e, 0x20, - 0x47, 0xab, 0x62, 0x62, 0xf6, 0x68, 0xc3, 0x84, 0x34, 0xf9, 0xa1, 0xcb, - 0x99, 0x5a, 0xa7, 0x16, 0xe7, 0xb1, 0x9d, 0x93, 0xeb, 0xbb, 0x9b, 0x16, - 0x9f, 0x7a, 0xde, 0xf6, 0x3c, 0xa6, 0x9e, 0xde, 0xf5, 0xca, 0xdb, 0xe5, - 0x87, 0xa4, 0x40, 0x9a, 0xc5, 0x2e, 0x36, 0x2d, 0xac, 0x28, 0x47, 0x9d, - 0xa7, 0x7c, 0x0b, 0xa6, 0xb0, 0xf2, 0x33, 0x42, 0xaa, 0xa3, 0x33, 0x8a, - 0xa0, 0x75, 0x9d, 0xf7, 0xe2, 0x8b, 0xc0, 0x15, 0x23, 0x03, 0x4a, 0x6c, - 0x65, 0xc5, 0x04, 0xce, 0x9a, 0x5c, 0xfd, 0xd8, 0x8c, 0x91, 0xf0, 0xc1, - 0x14, 0x14, 0x3a, 0x55, 0x61, 0x5f, 0x77, 0x1d, 0xcb, 0xe7, 0xda, 0x4f, - 0x44, 0x20, 0xad, 0xcf, 0x6a, 0x2b, 0x43, 0x3f, 0x80, 0xd4, 0xd7, 0xab, - 0x4b, 0xde, 0x6a, 0xb7, 0x51, 0xc5, 0x84, 0x3e, 0xb2, 0x55, 0x83, 0xb9, - 0x19, 0xff, 0xd2, 0xea, 0x63, 0x9f, 0xc5, 0x97, 0x6a, 0xce, 0x06, 0x9d, - 0x23, 0x63, 0x7b, 0xba, 0x54, 0x5b, 0x90, 0x5e, 0x69, 0x5a, 0xa2, 0xbf, - 0x20, 0xb6, 0x9a, 0xb5, 0x75, 0xd0, 0x08, 0x7a, 0xb4, 0x6f, 0xda, 0x74, - 0x5b, 0xb0, 0x38, 0x81, 0x9a, 0x43, 0x6e, 0xc2, 0xa4, 0xee, 0x72, 0x5d, - 0xb8, 0xe8, 0xda, 0xad, 0x02, 0x1a, 0x22, 0x2d, 0x04, 0x61, 0xe9, 0x62, - 0xe2, 0xbf, 0x5a, 0xcf, 0xd0, 0xb5, 0x78, 0xf2, 0x6a, 0x2a, 0xcc, 0x0a, - 0x6f, 0x52, 0x46, 0x0d, 0x2f, 0x32, 0x08, 0x14, 0xa2, 0x95, 0x70, 0x1e, - 0xc8, 0x8b, 0x64, 0xd2, 0x46, 0x66, 0xbe, 0x1b, 0x70, 0x6e, 0xdf, 0x36, - 0x8d, 0xe2, 0xb1, 0x5d, 0xd1, 0xd0, 0x44, 0x7a, 0xe6, 0x97, 0x39, 0x36, - 0x52, 0x84, 0x6a, 0x62, 0x8d, 0x75, 0xeb, 0x66, 0x35, 0xf8, 0xaf, 0x12, - 0x9f, 0x67, 0x58, 0xbf, 0x88, 0x2e, 0x90, 0x2d, 0xfe, 0x7f, 0x7d, 0x2e, - 0x0e, 0x36, 0x21, 0x3d, 0x95, 0x67, 0x76, 0xb5, 0xbf, 0x27, 0xd6, 0x14, - 0x06, 0x01, 0xc1, 0x61, 0x8a, 0x3e, 0x54, 0x18, 0x43, 0x95, 0x99, 0x80, - 0x11, 0x10, 0x84, 0x8b, 0x36, 0x8d, 0x7d, 0xba, 0xd5, 0xd4, 0x0f, 0xd8, - 0x15, 0x80, 0x51, 0x50, 0x34, 0x93, 0xe1, 0x9b, 0xde, 0xd9, 0x3d, 0x6b, - 0x99, 0xc1, 0xac, 0x8a, 0x65, 0xc1, 0x2d, 0xc9, 0x6d, 0xcc, 0x2b, 0xff, - 0x40, 0xd3, 0x50, 0x99, 0x9f, 0x74, 0x80, 0x7a, 0x2a, 0xfd, 0x85, 0x27, - 0x45, 0x41, 0xe9, 0x37, 0x76, 0x82, 0xe9, 0x99, 0xbb, 0x87, 0x72, 0xe0, - 0xaf, 0x42, 0x27, 0xf6, 0xf3, 0xd7, 0xba, 0x6a, 0xb3, 0xe3, 0xe0, 0x14, - 0x47, 0x34, 0xcc, 0x2d, 0x09, 0xb8, 0x2e, 0xd5, 0xe0, 0x85, 0xbd, 0x78, - 0x39, 0xb9, 0x2f, 0x64, 0xe4, 0x00, 0x57, 0xd5, 0x4a, 0xfe, 0x59, 0xf3, - 0x2a, 0x06, 0x8f, 0xfe, 0xf9, 0x0b, 0x08, 0x58, 0x1f, 0xc2, 0xa9, 0x46, - 0xe7, 0x93, 0xf3, 0xd1, 0x2e, 0x92, 0xa9, 0x5a, 0x89, 0x2c, 0xa3, 0x6d, - 0x7c, 0xe3, 0xd0, 0xae, 0xf6, 0x38, 0xa3, 0x91, 0xfc, 0x3d, 0x82, 0x0a, - 0x35, 0x7b, 0x5f, 0x55, 0xd0, 0x10, 0xa3, 0xd8, 0x1c, 0x47, 0x15, 0x80, - 0xb9, 0xbf, 0xf8, 0x6f, 0x07, 0xc7, 0xaf, 0xcc, 0xcf, 0x32, 0x5a, 0xef, - 0x4e, 0x8e, 0xba, 0x07, 0x7f, 0x12, 0xbd, 0x9d, 0x70, 0x67, 0x97, 0x6c, - 0x3e, 0x1d, 0xcf, 0x30, 0x89, 0x7a, 0x66, 0x30, 0x18, 0xf9, 0xa6, 0xc6, - 0xe8, 0x67, 0x59, 0x80, 0xaf, 0xb9, 0x42, 0x7f, 0x2b, 0xf1, 0xa5, 0x73, - 0xbe, 0x73, 0x2d, 0xb9, 0x0f, 0xd9, 0xc6, 0x34, 0xb8, 0x96, 0x7c, 0x7a, - 0xde, 0x2f, 0x85, 0xef, 0x51, 0x4f, 0x63, 0xa6, 0xf6, 0x02, 0x8d, 0xf5, - 0xb5, 0x1c, 0x72, 0x72, 0x65, 0x91, 0xe5, 0xe0, 0x22, 0xdc, 0xe1, 0x8d, - 0xf3, 0x5c, 0xe8, 0x18, 0x5b, 0x7d, 0x29, 0x43, 0x38, 0xc1, 0x7b, 0x72, - 0x96, 0x53, 0x56, 0xe8, 0xcb, 0xd2, 0xd1, 0xbf, 0x84, 0x41, 0x02, 0xc6, - 0x4e, 0x98, 0xd7, 0x5d, 0x24, 0xc2, 0xb0, 0x7d, 0xf9, 0x68, 0xf0, 0x1f, - 0xdb, 0x77, 0x3f, 0x97, 0xe8, 0x11, 0xbd, 0x79, 0x44, 0xa8, 0x5a, 0xec, - 0x7c, 0xad, 0xd1, 0xdc, 0x0a, 0x74, 0x1c, 0x9e, 0x17, 0x5d, 0x05, 0x5a, - 0x41, 0xe7, 0x29, 0x88, 0xd3, 0x2e, 0xb1, 0x27, 0x58, 0x36, 0x36, 0xa9, - 0xc9, 0x6a, 0xbf, 0xa7, 0x2d, 0x92, 0x9d, 0xe0, 0x38, 0x9a, 0x65, 0x9a, - 0x69, 0x0d, 0xa6, 0x4e, 0x8a, 0xa2, 0xe4, 0x55, 0xfa, 0x11, 0xa4, 0x4b, - 0x73, 0xb0, 0x93, 0xf0, 0x2b, 0xb9, 0x47, 0x59, 0x22, 0x27, 0x16, 0x70, - 0x27, 0x1e, 0xd0, 0x26, 0xf2, 0xda, 0x44, 0xd0, 0x2b, 0xab, 0x06, 0x04, - 0xd2, 0x0f, 0x35, 0x85, 0xb9, 0xb5, 0xaa, 0xfc, 0x72, 0xe3, 0x1b, 0x06, - 0x30, 0x33, 0x8e, 0x75, 0xa7, 0x6e, 0xe3, 0xb3, 0x8f, 0xe9, 0x59, 0x58, - 0x7b, 0x7f, 0xd3, 0xf2, 0x11, 0xe2, 0xd4, 0xa6, 0x8e, 0xef, 0xd7, 0x12, - 0x28, 0x15, 0xc7, 0x73, 0x2b, 0xa5, 0xbd, 0xa7, 0xc7, 0xc8, 0x2a, 0xef, - 0xe5, 0xb1, 0x4f, 0x49, 0x76, 0x57, 0xe7, 0xae, 0x5c, 0xb9, 0x4a, 0x62, - 0x6d, 0x3d, 0x01, 0xc9, 0x83, 0x03, 0xb8, 0xeb, 0x2e, 0x19, 0x84, 0x85, - 0x79, 0x90, 0x42, 0x3e, 0x8c, 0x75, 0xa5, 0xcb, 0xc2, 0x6d, 0xbc, 0xe5, - 0x26, 0x57, 0x1b, 0xac, 0x9d, 0x87, 0x8b, 0xe8, 0xc2, 0x47, 0x13, 0x7f, - 0x42, 0xe5, 0xd4, 0x66, 0x6f, 0x35, 0x39, 0xe5, 0xbb, 0x71, 0xc9, 0x1b, - 0x3e, 0x48, 0xec, 0x34, 0x48, 0x6f, 0xa4, 0x17, 0xe0, 0x90, 0x0e, 0xdf, - 0xcc, 0x3b, 0x0d, 0x00, 0x27, 0x97, 0x61, 0x6e, 0x85, 0xdb, 0xa3, 0xcf, - 0x9b, 0x29, 0x51, 0xec, 0x19, 0xb4, 0xbf, 0xd8, 0x1d, 0xdb, 0x83, 0x57, - 0x4b, 0x67, 0xb5, 0xb7, 0x2e, 0x9f, 0x2b, 0x71, 0xc7, 0x4f, 0x73, 0xaa, - 0x9a, 0x83, 0x79, 0x98, 0xee, 0xa7, 0x4c, 0xeb, 0x09, 0xb9, 0x7d, 0xab, - 0x66, 0x2a, 0x0c, 0xbf, 0x49, 0x25, 0xfd, 0x27, 0xf9, 0x29, 0x96, 0x0d, - 0xf6, 0xd0, 0x10, 0x0d, 0x8b, 0x0b, 0xfb, 0x37, 0xa9, 0x34, 0x95, 0x01, - 0x6d, 0xd7, 0xdf, 0xd6, 0x9a, 0xd2, 0x90, 0xcb, 0x9f, 0x76, 0x1d, 0xb3, - 0xa9, 0x70, 0xce, 0x00, 0x2d, 0x63, 0x8f, 0xb0, 0x80, 0x12, 0xc7, 0xb8, - 0x8f, 0xbd, 0xe1, 0xac, 0x31, 0x4a, 0xd5, 0x42, 0x99, 0xd0, 0x7c, 0x5f, - 0xdf, 0xe7, 0x64, 0x7e, 0x1e, 0xd2, 0x22, 0x1b, 0x82, 0x5d, 0xdf, 0xaf, - 0x05, 0x1b, 0xc1, 0x24, 0x76, 0x62, 0x79, 0xa0, 0xe3, 0xfa, 0xbd, 0xb4, - 0x9a, 0xed, 0xff, 0xfc, 0xd8, 0x8c, 0x67, 0xca, 0x17, 0x42, 0x6b, 0x1c, - 0xd2, 0x86, 0x3c, 0xa3, 0xef, 0xa3, 0x2d, 0xb4, 0x52, 0x76, 0xad, 0x77, - 0xbf, 0x8e, 0x6f, 0xe2, 0x74, 0x28, 0xd4, 0xb0, 0x7c, 0x1a, 0xd4, 0x09, - 0x4b, 0xb7, 0x10, 0x03, 0x95, 0xbc, 0x16, 0xf5, 0x80, 0x3c, 0x31, 0x1e, - 0xc4, 0x6f, 0x2b, 0x60, 0x9c, 0x36, 0x4d, 0x1e, 0x18, 0xbf, 0x8e, 0x2d, - 0x16, 0xf5, 0x30, 0x24, 0x36, 0x6f, 0x04, 0x71, 0xc4, 0x6b, 0x53, 0xfa, - 0xf4, 0xd5, 0xe7, 0x15, 0xf3, 0x5f, 0xde, 0xf0, 0x6a, 0x23, 0x24, 0x7e, - 0xa5, 0xa9, 0xe1, 0xb7, 0x81, 0xd1, 0x0e, 0x26, 0x20, 0x47, 0xe8, 0x4a, - 0x19, 0x88, 0x27, 0x29, 0x32, 0x4c, 0x41, 0x80, 0xe2, 0x51, 0x2a, 0x34, - 0xa6, 0xe5, 0xf8, 0x83, 0x4c, 0x35, 0xbd, 0x82, 0xfc, 0xfb, 0x92, 0x60, - 0xb3, 0xa2, 0x7d, 0x91, 0xbd, 0xf0, 0xfb, 0x7f, 0x3d, 0x7b, 0xfb, 0x1e, - 0xd1, 0xe9, 0xf0, 0x07, 0xd5, 0xe1, 0xce, 0x25, 0x6f, 0x7f, 0xeb, 0x2f, - 0x0c, 0x71, 0x2e, 0xc6, 0x87, 0xe5, 0x2e, 0x7a, 0x27, 0x8b, 0xc0, 0xf0, - 0x28, 0xdd, 0xa0, 0xb1, 0x47, 0x56, 0x17, 0xd5, 0x91, 0xd9, 0x24, 0x35, - 0x64, 0x36, 0x96, 0x18, 0x43, 0xd4, 0xae, 0x23, 0x81, 0x4b, 0xad, 0xba, - 0xe9, 0xb9, 0xf8, 0x44, 0x9e, 0x1e, 0xc0, 0x86, 0x89, 0xaa, 0x30, 0xf5, - 0x90, 0xe6, 0x65, 0x4d, 0xcd, 0x2a, 0x0c, 0x32, 0x22, 0x38, 0x1f, 0x97, - 0xf5, 0xd5, 0x02, 0x4c, 0xa4, 0xc6, 0xb2, 0xd4, 0x39, 0x4b, 0xe7, 0xfa, - 0xec, 0x62, 0x64, 0x55, 0xd6, 0x53, 0x90, 0x1e, 0x82, 0x58, 0x31, 0x9d, - 0x42, 0x4a, 0x18, 0x0e, 0x07, 0xaa, 0x3a, 0x4d, 0x2f, 0x9a, 0x84, 0x12, - 0x93, 0xaf, 0x0a, 0x46, 0xc8, 0x58, 0x7b, 0xaa, 0xbe, 0x33, 0xf2, 0x34, - 0xb6, 0xaf, 0xf4, 0xb4, 0xa5, 0x26, 0x05, 0x12, 0x30, 0x7c, 0xe4, 0x99, - 0x70, 0x42, 0xe0, 0xbb, 0xbf, 0x4f, 0x44, 0x18, 0x31, 0x6f, 0xc8, 0xed, - 0x3a, 0xf5, 0xf3, 0xd4, 0xcb, 0x0b, 0x41, 0xbb, 0xcb, 0xaa, 0x76, 0x74, - 0xa1, 0xc7, 0xea, 0x17, 0xbf, 0xad, 0x63, 0x6d, 0xf5, 0x7b, 0x88, 0x4f, - 0x30, 0x24, 0xcd, 0x3f, 0x4b, 0xe1, 0x1a, 0xd9, 0xba, 0x08, 0x15, 0x21, - 0xda, 0xbd, 0x27, 0x5c, 0xe7, 0xb6, 0xbc, 0xe0, 0x8b, 0x18, 0x48, 0xc6, - 0x39, 0xac, 0xbc, 0xdc, 0xa7, 0xeb, 0x00, 0xa5, 0xf3, 0xfb, 0x9c, 0xc1, - 0x84, 0x34, 0xc4, 0x0e, 0xc6, 0xa1, 0x0f, 0xec, 0x29, 0x62, 0xaa, 0x5b, - 0x3c, 0xc8, 0xf9, 0x8a, 0xfd, 0x63, 0xdd, 0x46, 0x2e, 0xa3, 0x19, 0xe1, - 0xe4, 0x24, 0x77, 0xc3, 0x88, 0x0b, 0x52, 0x29, 0xcc, 0xb2, 0x58, 0x76, - 0xe1, 0x13, 0xc5, 0x24, 0x44, 0xcc, 0xd4, 0x45, 0x04, 0xdb, 0xa4, 0xa7, - 0x4d, 0x41, 0xb3, 0xd5, 0xc9, 0x6e, 0x00, 0xab, 0xf6, 0x43, 0xd9, 0x94, - 0x50, 0xdb, 0x17, 0x88, 0x1c, 0x22, 0xbb, 0x62, 0x40, 0x59, 0x23, 0xf9, - 0x88, 0x57, 0x06, 0x3e, 0x46, 0x2d, 0xb2, 0x46, 0xcc, 0x46, 0x8b, 0xb0, - 0x22, 0x89, 0x54, 0x6a, 0x05, 0x2b, 0xc5, 0x18, 0x83, 0xf6, 0xb8, 0x6a, - 0x2e, 0x43, 0x0f, 0x3c, 0x76, 0xe2, 0xab, 0xcd, 0x94, 0xbf, 0x23, 0x0e, - 0xfb, 0xb1, 0x0d, 0x61, 0x38, 0x60, 0x78, 0x1d, 0xbf, 0x2d, 0x5f, 0x7a, - 0x9d, 0x25, 0x9d, 0x6e, 0x91, 0x58, 0x6c, 0x4a, 0x3f, 0xfe, 0x17, 0x11, - 0xaa, 0x8f, 0x6c, 0x13, 0xef, 0x8d, 0x41, 0xc8, 0xdb, 0x29, 0x41, 0x39, - 0xf4, 0x65, 0x48, 0x5b, 0xde, 0x88, 0x51, 0x5d, 0x46, 0x43, 0xbe, 0xf5, - 0x27, 0xff, 0x2f, 0x1d, 0xce, 0xd5, 0xf1, 0x01, 0x77, 0x27, 0xd8, 0xd1, - 0x4e, 0xd4, 0xca, 0x8f, 0xa4, 0x29, 0xa6, 0x35, 0x67, 0x47, 0x1e, 0xa9, - 0x78, 0x02, 0x29, 0x28, 0xda, 0xc3, 0x35, 0x72, 0x2f, 0xab, 0x92, 0xeb, - 0x48, 0x85, 0x0c, 0xa3, 0xc5, 0x84, 0xba, 0xfc, 0x57, 0xef, 0x0f, 0xe1, - 0x76, 0x01, 0x51, 0x27, 0x64, 0xa3, 0x26, 0xce, 0x1e, 0x52, 0x71, 0xe8, - 0x55, 0x61, 0x1b, 0x28, 0x7f, 0x87, 0x30, 0x4c, 0x86, 0x07, 0x69, 0xa0, - 0x33, 0x21, 0xc6, 0x36, 0xe5, 0x18, 0x12, 0x10, 0x3b, 0x23, 0x94, 0x36, - 0x8c, 0xa6, 0x89, 0xae, 0x6e, 0x11, 0x96, 0x2a, 0x5d, 0x74, 0xc1, 0x06, - 0xfe, 0x73, 0xdb, 0x29, 0xda, 0x91, 0x20, 0xff, 0xe7, 0xfd, 0x39, 0x97, - 0xc5, 0x7b, 0x0d, 0x58, 0x99, 0xbf, 0x08, 0xbf, 0xc4, 0x9a, 0xa5, 0xe6, - 0x9d, 0x8f, 0xe9, 0x62, 0xc3, 0x74, 0xaa, 0xc2, 0x71, 0x4b, 0x99, 0xe8, - 0x86, 0x9b, 0xc1, 0x30, 0x15, 0x56, 0x93, 0x69, 0x05, 0x06, 0xdf, 0x97, - 0x45, 0x74, 0x75, 0x9f, 0x30, 0x61, 0x28, 0xcc, 0x36, 0xd1, 0xf1, 0xfc, - 0x10, 0x96, 0x7f, 0xe5, 0x98, 0x85, 0x2b, 0x6b, 0xb8, 0xae, 0x1c, 0x2a, - 0x1d, 0xb6, 0x6b, 0x63, 0x0e, 0xe3, 0xf2, 0xe8, 0x59, 0xcb, 0x11, 0x8f, - 0x43, 0x58, 0xf7, 0x43, 0x1d, 0xff, 0xbb, 0xe3, 0xd7, 0x8e, 0x80, 0xeb, - 0x0b, 0x36, 0xa9, 0x38, 0x53, 0x69, 0x84, 0x90, 0xd7, 0x56, 0xfc, 0xd8, - 0x95, 0xbc, 0x94, 0xab, 0xdd, 0xcd, 0x80, 0x3c, 0x9a, 0x97, 0x3b, 0xe6, - 0x31, 0x8f, 0x18, 0x2a, 0x4a, 0xaa, 0xa8, 0xa7, 0xe2, 0xed, 0x3d, 0x93, - 0x7f, 0x0c, 0xc1, 0x43, 0x3d, 0x54, 0x4e, 0x02, 0xc3, 0x66, 0x6f, 0xe6, - 0xa2, 0x9d, 0x1c, 0x9d, 0x0e, 0x67, 0xb2, 0xb8, 0x09, 0xcd, 0x76, 0xda, - 0xb1, 0x3b, 0x3f, 0x32, 0xa9, 0x00, 0x15, 0x1e, 0xd3, 0xa8, 0x2a, 0xc1, - 0x97, 0x10, 0x42, 0x4e, 0xe6, 0x41, 0xc7, 0xd7, 0x02, 0x9f, 0xa9, 0x8a, - 0x8d, 0x60, 0x99, 0x8b, 0xe0, 0xe1, 0xab, 0xa6, 0xac, 0xab, 0xba, 0x20, - 0x4a, 0xb2, 0x61, 0x0c, 0xd9, 0x0b, 0x93, 0x02, 0x99, 0x2a, 0x1d, 0x1c, - 0x70, 0xae, 0x50, 0xd5, 0xed, 0x40, 0xc9, 0x86, 0xc0, 0x91, 0xd6, 0x5a, - 0xf8, 0x3a, 0x97, 0x96, 0x4a, 0xd5, 0x54, 0xcb, 0x96, 0xde, 0x46, 0xcd, - 0x79, 0xd7, 0x59, 0xce, 0x9e, 0x5a, 0xb7, 0xc3, 0x3d, 0x65, 0x75, 0xa3, - 0x7a, 0x02, 0x2d, 0x5e, 0x2a, 0x5a, 0x25, 0xd0, 0x0c, 0xea, 0x78, 0x82, - 0xd2, 0xe6, 0xe9, 0x52, 0xbd, 0xdf, 0xef, 0x92, 0xc4, 0xea, 0x45, 0x04, - 0x38, 0x71, 0x5a, 0x42, 0xd5, 0xf7, 0xa0, 0xa9, 0x85, 0xd4, 0xd0, 0x28, - 0x22, 0xfa, 0xce, 0x45, 0x16, 0xe3, 0x95, 0xca, 0xf8, 0xa9, 0x84, 0x65, - 0xfa, 0x9e, 0xe8, 0xbc, 0x08, 0xf1, 0xd8, 0xbd, 0xeb, 0xea, 0xc7, 0xe7, - 0x8e, 0x16, 0x77, 0xb3, 0x8b, 0x5a, 0xd2, 0x71, 0x32, 0x86, 0x47, 0xb3, - 0xdc, 0xa7, 0x03, 0x78, 0x60, 0xda, 0x36, 0x40, 0xec, 0x79, 0x22, 0x25, - 0x82, 0xf5, 0x22, 0x0e, 0x4d, 0x80, 0x2f, 0xbe, 0x33, 0xb1, 0x45, 0xca, - 0xef, 0xf5, 0x1a, 0x47, 0x99, 0xcb, 0x80, 0x03, 0x5c, 0xdd, 0xf2, 0x5b, - 0x16, 0xcc, 0xc2, 0x04, 0xde, 0x88, 0xed, 0x5b, 0xcb, 0xb7, 0x66, 0x72, - 0xf2, 0x96, 0x2d, 0xcc, 0xa3, 0x6e, 0x9b, 0xf6, 0x16, 0xb7, 0xdd, 0xe9, - 0x7f, 0x65, 0xa3, 0x6d, 0x05, 0xed, 0x1e, 0xce, 0x6f, 0xa2, 0xc5, 0xda, - 0x08, 0xad, 0xf5, 0x0e, 0x90, 0xe5, 0x46, 0x70, 0x3b, 0x7c, 0x5c, 0x66, - 0x9e, 0x1f, 0xb9, 0xd6, 0x86, 0xb4, 0x45, 0x69, 0x3e, 0x76, 0xe1, 0x45, - 0x07, 0x67, 0x32, 0x16, 0x32, 0x0b, 0xd8, 0x67, 0x7c, 0x83, 0x7f, 0x46, - 0xe6, 0xe8, 0xb4, 0xf2, 0xb1, 0xe3, 0xcc, 0x8e, 0x7d, 0xb8, 0x7c, 0x7f, - 0xa9, 0xde, 0x7c, 0x3d, 0x81, 0x15, 0x1b, 0xd4, 0x23, 0xe9, 0x5c, 0xe1, - 0xec, 0x79, 0xae, 0xa0, 0x67, 0xe3, 0x94, 0xd7, 0x92, 0xf4, 0x55, 0xa3, - 0x58, 0x7c, 0xfd, 0xc0, 0x56, 0xc5, 0xef, 0x78, 0xb9, 0x75, 0x3c, 0xca, - 0x31, 0x48, 0x27, 0x90, 0xf2, 0xf9, 0x31, 0xd0, 0x58, 0xcb, 0xf7, 0x50, - 0x8d, 0xcd, 0x51, 0xd6, 0xba, 0xee, 0x1e, 0xe0, 0xb3, 0x85, 0xa3, 0x6c, - 0x25, 0x6b, 0xa0, 0x36, 0x32, 0xc0, 0xd0, 0xda, 0x1b, 0x13, 0xe0, 0x96, - 0xc1, 0x41, 0x26, 0x65, 0x5b, 0xfb, 0xce, 0x1c, 0xde, 0x62, 0x70, 0x8b, - 0x48, 0x20, 0x58, 0xdd, 0xfb, 0x60, 0xba, 0xc7, 0xe2, 0x53, 0xc4, 0xe9, - 0xd0, 0xa0, 0x49, 0xb0, 0x2f, 0xc2, 0xc9, 0x3a, 0x9b, 0x5e, 0x40, 0x41, - 0xad, 0x87, 0x8f, 0xed, 0xa1, 0xe5, 0x26, 0xb9, 0x18, 0x4c, 0xc1, 0x66, - 0x02, 0x21, 0xeb, 0x51, 0x71, 0x15, 0xc8, 0x15, 0x63, 0x48, 0x55, 0xf0, - 0x57, 0x18, 0x15, 0xc7, 0x91, 0xcd, 0x33, 0xd1, 0xb0, 0x35, 0x40, 0xe3, - 0xb7, 0xe9, 0x2b, 0xe5, 0x01, 0x7e, 0xe0, 0x01, 0xf1, 0xa7, 0x13, 0x52, - 0x4c, 0xa9, 0x0e, 0xd1, 0xb1, 0x27, 0x69, 0xb0, 0x13, 0x12, 0x7f, 0x4c, - 0x77, 0x4d, 0xc2, 0xba, 0x2c, 0x7b, 0x4d, 0xb4, 0xb0, 0x07, 0xfc, 0x09, - 0x1f, 0x0f, 0x78, 0x2b, 0x8f, 0x7f, 0x5d, 0x8f, 0x2a, 0x34, 0x79, 0x6a, - 0xad, 0xaa, 0x71, 0xb1, 0xfc, 0xb5, 0x5a, 0xef, 0x23, 0xf5, 0x85, 0x32, - 0xfb, 0x0c, 0x39, 0x03, 0x08, 0x32, 0x76, 0x24, 0x78, 0x66, 0xfb, 0xc4, - 0x96, 0xa1, 0xeb, 0xeb, 0x3d, 0xcc, 0x24, 0xb9, 0x2a, 0xd5, 0x5a, 0x66, - 0xaa, 0x75, 0x2c, 0x66, 0x9b, 0x2b, 0xae, 0x82, 0x89, 0x9c, 0x93, 0xb4, - 0x2e, 0x24, 0xe0, 0xd6, 0x8f, 0xb9, 0x0b, 0x63, 0x81, 0x3e, 0xe6, 0xb3, - 0x04, 0xe5, 0x95, 0xb5, 0xdb, 0xb7, 0x1b, 0x5a, 0xe5, 0x67, 0x5a, 0x97, - 0x1e, 0xcc, 0x24, 0xeb, 0xec, 0x79, 0xae, 0xa0, 0x67, 0xe3, 0x94, 0xd7, - 0x92, 0xf4, 0x55, 0xa3, 0x58, 0x7c, 0xfd, 0xc0, 0x56, 0xc5, 0xef, 0x78, - 0x87, 0xb7, 0x9e, 0x19, 0x9f, 0x4c, 0x7a, 0x8b, 0x9e, 0x9f, 0x47, 0x4b, - 0x67, 0xd8, 0xb0, 0x82, 0xc6, 0x57, 0xad, 0x39, 0x98, 0x9c, 0x77, 0x2a, - 0x2a, 0x12, 0x05, 0x13, 0x46, 0x5e, 0x75, 0x0a, 0x28, 0xef, 0x6c, 0x0b, - 0xf7, 0x35, 0xd3, 0x70, 0x0a, 0x5d, 0x9d, 0x7f, 0x94, 0xc0, 0xa8, 0x4a, - 0xfb, 0xd0, 0x98, 0xf6, 0xb7, 0xa2, 0xf6, 0x4f, 0x0c, 0x38, 0x6b, 0x9b, - 0x23, 0x83, 0x74, 0xd0, 0x58, 0xde, 0x83, 0x24, 0x10, 0x2f, 0x0c, 0x8f, - 0xa5, 0xb8, 0xdf, 0x01, 0xad, 0x96, 0x4d, 0x03, 0x34, 0xd3, 0xb2, 0xf7, - 0xa5, 0x1b, 0x66, 0xac, 0x66, 0x14, 0xb4, 0x59, 0x4c, 0x09, 0x53, 0xd3, - 0x7d, 0xa1, 0x45, 0x09, 0xc7, 0xc7, 0xe6, 0x88, 0x2b, 0x02, 0xbf, 0x5d, - 0xfb, 0x9c, 0x1d, 0x1d, 0xc6, 0xd8, 0xe7, 0x7d, 0x21, 0x76, 0x10, 0x53, - 0x6e, 0xf7, 0x0b, 0xa3, 0x67, 0x4c, 0x9a, 0xc4, 0x9c, 0x3f, 0x64, 0xb1, - 0x60, 0x39, 0x72, 0xa2, 0xe4, 0x93, 0x88, 0x4e, 0x69, 0xcc, 0x7e, 0x79, - 0x84, 0x3b, 0x42, 0xa2, 0xe7, 0x38, 0x42, 0x64, 0x71, 0xc8, 0x8a, 0x84, - 0xd9, 0x73, 0xb3, 0xd5, 0x5b, 0x7a, 0x61, 0xdc, 0x1a, 0xc1, 0x5a, 0x54, - 0x69, 0x13, 0x47, 0xef, 0xd8, 0x5e, 0x20, 0x70, 0x10, 0xf7, 0xa5, 0x62, - 0x0f, 0xd9, 0xea, 0x61, 0x41, 0x25, 0x44, 0x33, 0xd7, 0x87, 0x69, 0x88, - 0xa6, 0xe5, 0x00, 0x6a, 0xe0, 0xe7, 0x56, 0xf3, 0x08, 0x34, 0x6c, 0xb5, - 0x14, 0x52, 0xd4, 0x7d, 0x0b, 0x77, 0x2e, 0x17, 0x22, 0xbf, 0x1d, 0x76, - 0xb1, 0x21, 0xe5, 0xec, 0xed, 0x95, 0x68, 0x4f, 0x14, 0x56, 0x91, 0x78, - 0xc4, 0x35, 0x2b, 0xc7, 0x3d, 0x94, 0x6b, 0xb5, 0x27, 0xd9, 0xcb, 0xa7, - 0xb6, 0x57, 0x8e, 0x30, 0xc8, 0x24, 0x9b, 0xaf, 0x05, 0xa2, 0xe9, 0x1a, - 0x94, 0xd4, 0x5b, 0x9e, 0x80, 0xac, 0xd7, 0xba, 0x42, 0xd1, 0x4b, 0x0b, - 0x79, 0x0c, 0x55, 0x29, 0x03, 0xd9, 0x86, 0x09, 0xea, 0xdc, 0x40, 0x9b, - 0x0e, 0x6b, 0x88, 0xcf, 0x46, 0x73, 0x69, 0x89, 0x4b, 0x1b, 0xaa, 0x2d, - 0xa1, 0xcc, 0x23, 0xa9, 0xf2, 0x3f, 0x43, 0x8c, 0x20, 0x2d, 0x06, 0x16, - 0x1a, 0xdf, 0x63, 0xfc, 0xb5, 0x21, 0x25, 0x30, 0x49, 0x1b, 0xf9, 0x92, - 0x53, 0x93, 0xc8, 0xe7, 0x14, 0xc6, 0x88, 0x5e, 0x76, 0xce, 0x91, 0xf3, - 0x3d, 0xe4, 0x76, 0x1e, 0x23, 0x0b, 0x75, 0x29, 0x4d, 0x84, 0x3a, 0xbe, - 0x75, 0x96, 0x43, 0x8c, 0x5d, 0xad, 0x03, 0x77, 0x71, 0x0b, 0xe9, 0x84, - 0xf7, 0x19, 0xc9, 0xb6, 0x3f, 0x78, 0x96, 0x3d, 0x1e, 0x8f, 0xab, 0xf2, - 0xa3, 0xa7, 0x4b, 0x98, 0x9b, 0xca, 0xe3, 0xab, 0xd1, 0xb5, 0xb6, 0x08, - 0x9a, 0x47, 0xe7, 0x91, 0x0b, 0x36, 0x75, 0x16, 0xf9, 0x0e, 0xd4, 0x82, - 0xef, 0x97, 0x74, 0x7c, 0x22, 0x69, 0xe6, 0xc5, 0x2d, 0x4f, 0xe8, 0xeb, - 0x7d, 0x4a, 0x68, 0xe6, 0xae, 0x5d, 0x6b, 0xcc, 0xbe, 0x48, 0xb8, 0xe6, - 0xe9, 0x7d, 0x81, 0x3e, 0xa5, 0xbe, 0x3e, 0x7f, 0x66, 0x2f, 0x99, 0x54, - 0xf9, 0x89, 0x24, 0x1b, 0x0e, 0x62, 0x52, 0x98, 0x47, 0x3b, 0xfe, 0x6a, - 0x4e, 0x9f, 0xfd, 0x3f, 0x23, 0xee, 0xd6, 0x1d, 0xb9, 0x60, 0x0f, 0x9a, - 0xf3, 0x40, 0x33, 0xc9, 0x48, 0x2d, 0x29, 0xaa, 0x3a, 0x3c, 0x37, 0x64, - 0xc7, 0x4d, 0x55, 0xb3, 0x66, 0xe7, 0x0d, 0x0d, 0x8d, 0x15, 0xf2, 0x35, - 0x13, 0xbb, 0x43, 0xb5, 0x90, 0x38, 0x0c, 0x8a, 0x0a, 0xdb, 0xd7, 0x47, - 0x7c, 0x8c, 0xe3, 0x08, 0xa4, 0xcc, 0x89, 0x42, 0xe4, 0x35, 0xf7, 0x00, - 0x1c, 0xeb, 0xe9, 0xe7, 0x17, 0x83, 0x03, 0xb5, 0xca, 0x93, 0xde, 0x2f, - 0x11, 0x11, 0x62, 0xe7, 0x8b, 0x80, 0x76, 0x9b, 0x71, 0xac, 0x7b, 0x2b, - 0x06, 0xe2, 0x03, 0xa0, 0x6f, 0xf8, 0x97, 0x3f, 0x94, 0x24, 0x9c, 0x81, - 0x77, 0xa9, 0xf9, 0x6d, 0x73, 0xf4, 0xf9, 0xe7, 0x9d, 0xd3, 0xdf, 0xe8, - 0x80, 0x24, 0x17, 0x63, 0x9f, 0x50, 0x11, 0x03, 0xc6, 0x52, 0x22, 0x39, - 0x6b, 0x80, 0x6a, 0x9a, 0x5e, 0x96, 0x73, 0xb0, 0xcd, 0xa8, 0x6a, 0x33, - 0xe5, 0x8a, 0x9d, 0x59, 0xe5, 0xa3, 0xd1, 0x01, 0x68, 0x9e, 0x55, 0xcb, - 0x33, 0x5b, 0xfb, 0x5e, 0x73, 0x4a, 0x89, 0xbd, 0x33, 0x2c, 0x67, 0xb3, - 0x2b, 0xd8, 0x97, 0x20, 0x97, 0xfb, 0xd6, 0x08, 0x94, 0x5c, 0x5f, 0xe3, - 0xa3, 0x5d, 0x1b, 0xa2, 0xcc, 0x60, 0x45, 0xf0, 0xe6, 0x35, 0xda, 0xea, - 0x3d, 0xb1, 0xf7, 0x17, 0xe8, 0xc5, 0xd9, 0x89, 0xf8, 0x20, 0xb4, 0xcc, - 0x1a, 0xb6, 0x94, 0x84, 0x81, 0x96, 0xad, 0x01, 0x0d, 0x06, 0xf9, 0x7c, - 0x8e, 0xaf, 0x73, 0xe7, 0xe2, 0x4b, 0x20, 0x23, 0x5e, 0xc7, 0xbf, 0x19, - 0xbb, 0x0d, 0x67, 0x31, 0x38, 0x4c, 0x3c, 0xb5, 0x66, 0x35, 0x23, 0x4c, - 0x93, 0x58, 0xe8, 0xe0, 0x9b, 0xe3, 0x44, 0x5f, 0xb9, 0x57, 0xbc, 0x97, - 0xaf, 0x7a, 0xf4, 0xb2, 0x81, 0x7a, 0x3b, 0x51, 0x79, 0x91, 0xe5, 0x51, - 0x96, 0xa7, 0xf8, 0x8c, 0xde, 0xc6, 0xd9, 0x47, 0x7c, 0x08, 0x79, 0x82, - 0xeb, 0xbc, 0xec, 0x62, 0xed, 0x7f, 0xeb, 0xca, 0x6b, 0x3e, 0xd1, 0xfd, - 0xc5, 0xfa, 0xab, 0x86, 0x65, 0xe4, 0x1a, 0x42, 0x9a, 0xea, 0x85, 0x3e, - 0x06, 0x65, 0x2f, 0xe0, 0x0e, 0x53, 0x96, 0xc8, 0x5e, 0x31, 0x74, 0xaa, - 0x0e, 0x9c, 0x10, 0xb4, 0xaa, 0xa3, 0x10, 0x86, 0xb4, 0x66, 0x33, 0xc5, - 0x36, 0x86, 0x15, 0xf3, 0x07, 0x91, 0xd1, 0xd4, 0xee, 0x18, 0x1b, 0x85, - 0xe7, 0x5b, 0x3e, 0x33, 0xa4, 0x58, 0xe5, 0xc7, 0x11, 0x28, 0xd2, 0x47, - 0xad, 0xf2, 0xbe, 0x58, 0xc7, 0x2f, 0xd5, 0x09, 0x09, 0x0b, 0x26, 0xdd, - 0x5c, 0x4c, 0xd4, 0xf6, 0xd9, 0x7c, 0x3b, 0xc6, 0x78, 0xad, 0x29, 0xda, - 0x12, 0xae, 0xba, 0x17, 0xce, 0xb6, 0x3f, 0x66, 0xb0, 0xd2, 0xa0, 0x16, - 0xf1, 0xcc, 0x23, 0xcc, 0xed, 0xd6, 0x69, 0xde, 0x7f, 0x29, 0xf1, 0x77, - 0x45, 0x0c, 0x8f, 0x5b, 0x6e, 0xb5, 0x00, 0xe6, 0x1c, 0x5b, 0x72, 0xdd, - 0x67, 0x28, 0x35, 0x44, 0xc0, 0x4f, 0xe6, 0x05, 0x34, 0x95, 0x17, 0x52, - 0x02, 0x67, 0x09, 0xa6, 0x07, 0xae, 0xf2, 0x4a, 0x6e, 0x1e, 0xb1, 0x27, - 0x9c, 0x2e, 0x2e, 0x87, 0xd7, 0x8a, 0xe3, 0x06, 0xc2, 0xa2, 0x90, 0x22, - 0x0d, 0x15, 0x49, 0xe3, 0xd0, 0xb8, 0xe0, 0xc4, 0x56, 0xac, 0x3f, 0xb4, - 0x5f, 0x9c, 0xdd, 0xcc, 0x4a, 0x81, 0x62, 0x70, 0x9a, 0xaf, 0x8d, 0x9b, - 0xc7, 0xe0, 0x5c, 0x99, 0x53, 0x13, 0xa5, 0x5c, 0x6a, 0xd3, 0x5c, 0x55, - 0x10, 0x4d, 0xc5, 0x71, 0xdf, 0x55, 0xeb, 0x9b, 0x6d, 0x42, 0x87, 0x30, - 0xdb, 0x78, 0x54, 0xa7, 0x2e, 0x3c, 0x0b, 0x3f, 0xe6, 0xa7, 0x10, 0x35, - 0x43, 0x21, 0x61, 0x95, 0x44, 0x30, 0x4b, 0x18, 0xda, 0xe8, 0xa2, 0xb5, - 0x07, 0x35, 0xa6, 0xef, 0x98, 0xc6, 0xa5, 0x2c, 0xcd, 0x8e, 0xef, 0x74, - 0xc7, 0xc6, 0xbe, 0x22, 0xb9, 0xa9, 0x7d, 0xd5, 0xb7, 0xc6, 0xc4, 0x3f, - 0x75, 0x42, 0xd4, 0xd2, 0xf4, 0x16, 0x0c, 0xf7, 0x64, 0x19, 0x51, 0x65, - 0x87, 0x80, 0xa6, 0x0c, 0x46, 0x02, 0xbb, 0xc8, 0x70, 0x01, 0x5c, 0x77, - 0x0e, 0x06, 0xd1, 0x59, 0x3a, 0x3b, 0x88, 0x04, 0x4d, 0x4e, 0xa2, 0x8c, - 0x67, 0x01, 0x49, 0xa8, 0x64, 0x09, 0x72, 0x6c, 0xb3, 0xaf, 0x94, 0xbd, - 0xca, 0x52, 0xdf, 0xbb, 0xb8, 0x25, 0x20, 0x92, 0x97, 0xe4, 0xa9, 0x5d, - 0xf7, 0xab, 0x5d, 0xd1, 0x3d, 0x48, 0x18, 0xba, 0x43, 0x09, 0xae, 0xe5, - 0x22, 0x1f, 0xe8, 0x2e, 0x19, 0x98, 0x69, 0x39, 0x3c, 0xfc, 0x53, 0x0c, - 0xa6, 0xd7, 0x81, 0x52, 0xbf, 0x59, 0x08, 0xd9, 0x4c, 0x27, 0x1f, 0xc1, - 0xdd, 0x51, 0xa9, 0x0e, 0x4b, 0x28, 0xd3, 0xe4, 0xf6, 0x45, 0xb2, 0x18, - 0x54, 0x69, 0xa5, 0xf3, 0x62, 0xf4, 0xd9, 0x61, 0xd9, 0x6e, 0x62, 0x36, - 0x57, 0x2d, 0xbd, 0x42, 0xdc, 0xc9, 0x88, 0xb1, 0x1d, 0x79, 0x88, 0xc3, - 0xdf, 0xd3, 0x01, 0x04, 0x98, 0x05, 0xd2, 0x51, 0x85, 0x82, 0xf9, 0xe4, - 0x6c, 0xa4, 0xd7, 0x71, 0x72, 0x4c, 0x4e, 0xb4, 0xb0, 0x23, 0x4f, 0xb9, - 0x60, 0xcb, 0xfd, 0x65, 0x91, 0xd9, 0x35, 0x33, 0x65, 0xb7, 0x8c, 0x1e, - 0x6b, 0xef, 0x2f, 0x65, 0xbd, 0xb5, 0x8b, 0x59, 0x15, 0x9e, 0x73, 0xd7, - 0x82, 0x88, 0xa2, 0x9d, 0x29, 0xe9, 0xc9, 0xf1, 0xa1, 0x57, 0x0f, 0xa2, - 0x73, 0xb1, 0xf7, 0xc4, 0x1c, 0xbf, 0xae, 0x06, 0x26, 0x0b, 0x9f, 0xae, - 0xdb, 0xa9, 0x34, 0x9a, 0x35, 0x28, 0xec, 0xcd, 0xb5, 0x8f, 0x2f, 0x38, - 0xc2, 0xd0, 0xf8, 0x97, 0xa3, 0xe3, 0x30, 0x08, 0x59, 0x27, 0x52, 0xc1, - 0x71, 0x2b, 0x43, 0x5e, 0xb2, 0xa4, 0x1e, 0xcd, 0xdd, 0x1a, 0x0a, 0x30, - 0x2c, 0xab, 0x88, 0xfb, 0x90, 0xa5, 0x5b, 0x70, 0xe3, 0xbd, 0x3d, 0xd6, - 0x83, 0x94, 0xf0, 0x71, 0x26, 0x3c, 0x43, 0x09, 0x09, 0x3e, 0xad, 0x5d, - 0x2d, 0x13, 0x0c, 0x44, 0x4b, 0xa9, 0x2a, 0xff, 0xd9, 0x3a, 0x31, 0x8f, - 0x45, 0x24, 0xe6, 0x26, 0xe6, 0x50, 0x26, 0xd3, 0xba, 0xae, 0x0b, 0xbc, - 0x10, 0x91, 0xa2, 0x2d, 0x62, 0x5f, 0x91, 0x8d, 0x90, 0x58, 0xb3, 0xa3, - 0xc2, 0xdd, 0xf1, 0x82, 0x64, 0x00, 0x57, 0x32, 0x76, 0x04, 0x32, 0x68, - 0x2e, 0xb2, 0xc3, 0x81, 0xde, 0xcf, 0x0f, 0x01, 0x7b, 0xd3, 0x34, 0x6d, - 0x69, 0x41, 0xc9, 0xaf, 0x53, 0x11, 0x6e, 0xdd, 0xac, 0x84, 0x56, 0xc7, - 0x09, 0x91, 0x97, 0x49, 0x3e, 0xef, 0xc4, 0x30, 0x7f, 0xcb, 0xa3, 0x0e, - 0xdc, 0xf3, 0x2a, 0x25, 0xc7, 0x6a, 0x58, 0xe9, 0xc3, 0xba, 0x24, 0x14, - 0x5f, 0x26, 0x51, 0x0e, 0x01, 0xd7, 0x88, 0x08, 0xc9, 0xf0, 0x23, 0xa5, - 0xc0, 0xc7, 0x48, 0x5e, 0xa7, 0x2a, 0xdc, 0xce, 0x4c, 0x4f, 0xc2, 0x5c, - 0xca, 0x31, 0x6f, 0x78, 0xd6, 0xe0, 0x7a, 0x45, 0x22, 0x2c, 0x19, 0x3a, - 0x83, 0xe2, 0x14, 0x91, 0x6b, 0x6d, 0xd0, 0x37, 0xa9, 0xa6, 0xd6, 0x15, - 0xef, 0xce, 0x2a, 0x0f, 0xfb, 0x16, 0x86, 0x14, 0x8e, 0x45, 0xcd, 0x71, - 0x27, 0x8b, 0xfb, 0x59, 0xa8, 0xb2, 0xf1, 0xac, 0xbd, 0x22, 0x04, 0x2e, - 0x88, 0x13, 0xdc, 0x14, 0x72, 0x74, 0x84, 0x3d, 0xb4, 0xd0, 0xd4, 0x5e, - 0x1f, 0x1c, 0xb8, 0xc1, 0x61, 0x0e, 0x7c, 0x7c, 0x83, 0xbd, 0x73, 0x1b, - 0xaa, 0xf8, 0xef, 0x1a, 0xf0, 0xb3, 0x8a, 0xaf, 0x99, 0x58, 0xed, 0x09, - 0x3f, 0x75, 0x8d, 0x29, 0xb0, 0x84, 0xf4, 0x26, 0x6d, 0x16, 0xb8, 0xc1, - 0x45, 0x98, 0x7b, 0xac, 0x03, 0xf7, 0x11, 0x87, 0xe4, 0xd9, 0x89, 0x17, - 0x0f, 0x82, 0xac, 0xc6, 0x99, 0x58, 0xfb, 0x03, 0x3c, 0x75, 0x8d, 0x29, - 0xb0, 0x84, 0xf4, 0x26, 0x6d, 0x16, 0xb8, 0xc1, 0x22, 0x71, 0x28, 0x6c, - 0x2d, 0xe7, 0x75, 0xb1, 0x69, 0xdc, 0xc1, 0xff, 0x00, 0x8b, 0xd0, 0xc5, - 0xb5, 0x63, 0x00, 0x15, 0xfb, 0x5a, 0x2a, 0x09, 0x0b, 0xcc, 0xe7, 0x14, - 0x61, 0x51, 0xd3, 0xc9, 0x50, 0x02, 0x0c, 0x9d, 0x14, 0x1c, 0xf3, 0xf1, - 0x8f, 0xa8, 0x74, 0x41, 0x61, 0xeb, 0x13, 0xaa, 0x86, 0xdc, 0x4c, 0x02, - 0x38, 0xd2, 0x91, 0x23, 0x2b, 0xdd, 0x00, 0x62, 0xe5, 0xf6, 0xea, 0xfd, - 0x8b, 0xac, 0x84, 0x81, 0xe0, 0x1e, 0xd2, 0x88, 0x3a, 0x5e, 0x73, 0x03, - 0xa6, 0xee, 0x21, 0x98, 0x7b, 0x00, 0xe9, 0xb5, 0x50, 0x65, 0xa7, 0x89, - 0x9c, 0x0f, 0x9b, 0xfb, 0xc6, 0x4e, 0xf7, 0x0e, 0x1d, 0x07, 0x18, 0xb9, - 0x8a, 0x5d, 0x11, 0x6c, 0x02, 0x24, 0x2c, 0xb1, 0x1c, 0xd9, 0x63, 0xa4, - 0xcd, 0xc6, 0x3d, 0x80, 0xed, 0x81, 0x58, 0x8c, 0x85, 0x41, 0x1a, 0x61, - 0xe4, 0x48, 0x9d, 0xc5, 0x00, 0x39, 0x8e, 0xbc, 0x2e, 0x63, 0xb9, 0x6a, - 0xb1, 0xec, 0x04, 0x7c, 0x0d, 0x02, 0x6c, 0x80, 0x0d, 0xd8, 0x9b, 0xf7, - 0xc6, 0x15, 0x25, 0xbf, 0x23, 0xf7, 0xe2, 0x15, 0x8a, 0x98, 0x86, 0x82, - 0x9a, 0x61, 0x80, 0x4c, 0x63, 0xd3, 0x67, 0x54, 0x60, 0x94, 0x40, 0xc0, - 0xcb, 0xbb, 0x41, 0xa3, 0x8d, 0xa7, 0x40, 0xc5, 0x1a, 0x70, 0xbe, 0x79, - 0x37, 0x43, 0x49, 0x4d, 0x0e, 0x6e, 0x76, 0x52, 0xc3, 0xe1, 0x95, 0xfb, - 0x56, 0xbe, 0x9d, 0x6a, 0x82, 0x6e, 0x99, 0xb4, 0x26, 0x72, 0xa8, 0x73, - 0x02, 0xca, 0x3d, 0x78, 0x6b, 0x75, 0x27, 0x56, 0x97, 0x54, 0x89, 0x8a, - 0x48, 0xbc, 0x00, 0x97, 0x6a, 0xeb, 0x45, 0x76, 0x33, 0x34, 0xc3, 0x7c, - 0x2d, 0xa8, 0x77, 0x00, 0xf8, 0xcd, 0xd2, 0xea, 0x50, 0x49, 0xce, 0xc8, - 0x58, 0xbe, 0x46, 0x81, 0x37, 0xc7, 0x7e, 0x88, 0x30, 0x48, 0x86, 0x28, - 0x5b, 0x45, 0xca, 0x77, 0xb4, 0xfd, 0x38, 0xed, 0x3f, 0x3c, 0x7c, 0xe8, - 0xbc, 0xde, 0xf6, 0xbf, 0xea, 0xd7, 0x6a, 0x38, 0x36, 0xe8, 0x9c, 0x55, - 0x78, 0x97, 0x96, 0xe3, 0xb2, 0x2b, 0xa2, 0x70, 0x41, 0x00, 0x53, 0xaa, - 0x94, 0x6e, 0x4a, 0xe0, 0x60, 0x05, 0xcb, 0xb5, 0x39, 0x4d, 0x0a, 0x9e, - 0x36, 0x3a, 0x6b, 0xbb, 0x7d, 0x03, 0x90, 0x4b, 0x36, 0x8c, 0xb7, 0x6c, - 0xdf, 0x3e, 0x11, 0xe5, 0x04, 0x92, 0x27, 0x1b, 0x9d, 0x34, 0x8a, 0x16, - 0x6a, 0x8c, 0xcf, 0xfb, 0x51, 0xcb, 0xb8, 0x6f, 0xcc, 0x4b, 0x74, 0x10, - 0xe3, 0x98, 0xa4, 0xc3, 0x08, 0xd3, 0x52, 0xa7, 0x71, 0x19, 0xdc, 0x46, - 0xed, 0x29, 0xc4, 0xd1, 0x4b, 0xe2, 0x2c, 0xc6, 0x11, 0x82, 0x43, 0x5a, - 0x09, 0x3e, 0x6e, 0xa3, 0xe1, 0xc2, 0xb6, 0xa5, 0xc9, 0x2b, 0xca, 0x6e, - 0xfd, 0x29, 0x0c, 0xbd, 0xd3, 0xc0, 0x5c, 0xa4, 0x72, 0x52, 0x79, 0xea, - 0x72, 0x9c, 0xcd, 0xe1, 0x7b, 0xb1, 0x1f, 0xb2, 0x07, 0x83, 0x28, 0x1c, - 0xe3, 0x74, 0x0a, 0x8b, 0xcb, 0x17, 0x3b, 0x85, 0xd1, 0x33, 0xd1, 0x22, - 0xf3, 0xce, 0x8d, 0xa8, 0x7d, 0x9f, 0x01, 0x40, 0x8d, 0xf8, 0x8f, 0xbe, - 0x4c, 0xb6, 0x09, 0xcf, 0x96, 0x13, 0xc0, 0x34, 0x46, 0x9d, 0xb4, 0x65, - 0xe4, 0xc6, 0x67, 0x6d, 0x51, 0x1f, 0xa8, 0xc4, 0x28, 0xc5, 0x1a, 0x22, - 0xcd, 0x87, 0x89, 0x6c, 0x4e, 0x9c, 0xba, 0x87, 0x20, 0xb0, 0x03, 0x7c, - 0xd6, 0x30, 0xc6, 0xb2, 0x17, 0x16, 0xaa, 0x0f, 0x0d, 0x9b, 0x8b, 0x04, - 0x65, 0xb4, 0xe0, 0x2b, 0x9d, 0x83, 0xdc, 0x52, 0x54, 0xb5, 0x79, 0xe8, - 0x5b, 0xc1, 0x30, 0xab, 0xe7, 0x8c, 0xba, 0xe0, 0x66, 0x8d, 0xed, 0xa5, - 0xb4, 0x4e, 0xc1, 0xe6, 0xef, 0xeb, 0x89, 0xb8, 0x23, 0x9f, 0x12, 0x45, - 0x78, 0x37, 0x30, 0xc1, 0x06, 0x95, 0x1a, 0x37, 0x57, 0x2b, 0xff, 0xd3, - 0x38, 0x59, 0xe6, 0x34, 0xbb, 0x9b, 0xbf, 0xc4, 0x31, 0x59, 0x52, 0x8e, - 0xad, 0x0a, 0x5c, 0x4b, 0xf7, 0x2b, 0x15, 0xb2, 0x07, 0x83, 0x28, 0x1c, - 0xd6, 0x2b, 0xb2, 0xc4, 0x49, 0x47, 0x3c, 0xf8, 0xef, 0x42, 0x97, 0x60, - 0x7a, 0x37, 0xca, 0x91, 0xdf, 0x48, 0x38, 0x1e, 0xe9, 0xf7, 0xeb, 0x3e, - 0xf5, 0x8a, 0x71, 0x15, 0x42, 0x18, 0xde, 0xe9, 0x9d, 0xcb, 0x67, 0xa8, - 0x6c, 0x5f, 0x1e, 0x0d, 0xbd, 0x73, 0x0e, 0xa9, 0x0b, 0xf4, 0xd4, 0xa0, - 0x9c, 0x8e, 0xb7, 0x37, 0x1d, 0x31, 0xd9, 0x6f, 0xe9, 0x28, 0x37, 0x0d, - 0x73, 0x94, 0x8f, 0x5e, 0x2b, 0xd7, 0x4c, 0xb5, 0x45, 0x2f, 0x0e, 0x07, - 0x4e, 0xa1, 0x2e, 0x5b, 0x79, 0xac, 0xde, 0xf0, 0xcb, 0x30, 0x6b, 0xab, - 0x70, 0x27, 0x0a, 0x8d, 0xca, 0x02, 0x7d, 0x3c, 0xbf, 0x6f, 0x20, 0xf1, - 0x8c, 0x9a, 0x6c, 0x4b, 0x31, 0xfc, 0x94, 0xca, 0xe4, 0x69, 0xf0, 0x16, - 0x37, 0x8d, 0x97, 0x33, 0xf4, 0xad, 0x77, 0x3e, 0x81, 0x4f, 0xae, 0xee, - 0x5b, 0xa1, 0x3a, 0x9b, 0x8f, 0x2d, 0x30, 0x69, 0xe4, 0xe8, 0x7a, 0xad, - 0x95, 0x5f, 0x99, 0x4b, 0x94, 0x42, 0x8d, 0xdd, 0xe6, 0x7a, 0x3d, 0x4e, - 0x9e, 0x1a, 0x53, 0xcc, 0xf1, 0xb4, 0x25, 0x9b, 0x7d, 0x1c, 0x9f, 0x6f, - 0x3c, 0xd6, 0xc9, 0x33, 0x7e, 0xb9, 0x3a, 0xb9, 0xd8, 0xb0, 0x27, 0x2a, - 0x9c, 0xd5, 0x36, 0xb7, 0xe4, 0x18, 0x00, 0x65, 0x0f, 0xdb, 0x44, 0xbc, - 0x7e, 0x92, 0x7c, 0xd4, 0x3d, 0xb7, 0x0c, 0x60, 0x0e, 0xd9, 0x23, 0x63, - 0x74, 0x86, 0xd9, 0x04, 0x89, 0x7e, 0x52, 0x2a, 0x89, 0x0e, 0x23, 0xfd, - 0xe9, 0x52, 0x2c, 0x22, 0x57, 0x76, 0xe0, 0xe5, 0x98, 0x34, 0xb0, 0x16, - 0x33, 0x4a, 0x51, 0xf0, 0x34, 0xd8, 0x4e, 0x7e, 0xa6, 0x2c, 0x0f, 0x97, - 0xab, 0x4c, 0xaf, 0xbc, 0xda, 0x6d, 0xf8, 0x3d, 0xa1, 0x58, 0x48, 0x38, - 0x3f, 0xa6, 0x42, 0x2c, 0x4d, 0x99, 0xdb, 0x35, 0x42, 0x10, 0x80, 0x81, - 0x45, 0x46, 0xc1, 0x5c, 0xfb, 0x5d, 0xfc, 0x0b, 0x52, 0x11, 0xde, 0x3a, - 0x6d, 0x19, 0xe2, 0xe0, 0x73, 0x90, 0x16, 0x56, 0x48, 0xc6, 0x41, 0xaf, - 0x3f, 0x7a, 0x23, 0x0e, 0x2d, 0xda, 0x95, 0x52, 0x8a, 0x44, 0xf2, 0x60, - 0xff, 0x0e, 0xa5, 0xaf, 0x07, 0x5f, 0x31, 0x13, 0xb3, 0x84, 0x53, 0x19, - 0x2c, 0x1f, 0xc7, 0x3f, 0x16, 0xfe, 0xfd, 0xd3, 0xff, 0xc2, 0xd5, 0xec, - 0x04, 0x64, 0xb9, 0x7a, 0xc0, 0xe1, 0xc0, 0xf5, 0x09, 0x85, 0x4e, 0x92, - 0xf8, 0x65, 0x3f, 0x84, 0xaa, 0x54, 0x14, 0x81, 0xa6, 0xa6, 0xd6, 0x1d, - 0xa0, 0x3b, 0xb3, 0xaa, 0xde, 0x08, 0x9e, 0xff, 0x4d, 0x04, 0x33, 0x12, - 0x7f, 0xa9, 0x2a, 0xc9, 0x79, 0xce, 0x4f, 0xaa, 0x8c, 0xf2, 0xd8, 0xcb, - 0x46, 0x18, 0x7e, 0xa7, 0x34, 0x05, 0xb5, 0x60, 0xea, 0x3c, 0xd6, 0xa5, - 0xd8, 0xa7, 0xae, 0xb3, 0x06, 0x41, 0x36, 0x53, 0x45, 0x4e, 0x9c, 0x07, - 0x51, 0x05, 0x75, 0x8e, 0xbf, 0x57, 0xbe, 0x52, 0xc9, 0x6e, 0xa3, 0x71, - 0xb3, 0x5b, 0xff, 0xff, 0x84, 0x28, 0x6e, 0x8d, 0x8c, 0x1f, 0xae, 0xda, - 0xd1, 0x1a, 0x1b, 0x32, 0x92, 0xac, 0xc3, 0xee, 0x1f, 0x7e, 0xc0, 0x5c, - 0x90, 0x2b, 0xa8, 0x35, 0xec, 0x73, 0x83, 0xf0, 0xca, 0x5c, 0xba, 0x09, - 0xde, 0x70, 0xc4, 0x3a, 0x2b, 0x34, 0x6e, 0x04, 0x25, 0x0a, 0xb3, 0x71, - 0x67, 0xed, 0xee, 0x45, 0xf0, 0xb1, 0x3e, 0x5e, 0x4a, 0xd7, 0x1c, 0xe5, - 0xe5, 0xe8, 0x6e, 0xa2, 0x1e, 0x21, 0x10, 0xbb, 0x44, 0xab, 0x2b, 0xce, - 0x47, 0x16, 0xdd, 0x0b, 0x34, 0xb2, 0x78, 0x00, 0x8d, 0x3f, 0xc8, 0x0a, - 0xfc, 0x79, 0xb5, 0x2d, 0x20, 0x4c, 0x8e, 0xd5, 0xc7, 0x36, 0x65, 0xa0, - 0x22, 0x14, 0xce, 0x9c, 0xb8, 0x86, 0x5c, 0x1d, 0xe8, 0x83, 0x66, 0x75, - 0xa2, 0xe4, 0x16, 0x39, 0xe8, 0x37, 0x18, 0x1c, 0x2e, 0xa9, 0xc1, 0x5b, - 0xc8, 0x6f, 0x13, 0xad, 0x62, 0xca, 0x8b, 0xe9, 0xa0, 0xe6, 0x15, 0x6f, - 0x5d, 0x81, 0xd6, 0xcc, 0xc4, 0x54, 0xa2, 0xd5, 0x69, 0xe0, 0xbe, 0x0a, - 0x81, 0x22, 0x9f, 0xcf, 0x50, 0x41, 0xb5, 0xb5, 0x67, 0xeb, 0x44, 0x58, - 0xe5, 0x0e, 0x86, 0x1d, 0x6d, 0xa4, 0xed, 0x4b, 0x64, 0x8f, 0xca, 0x9a, - 0xb5, 0x09, 0xbd, 0x63, 0xfe, 0x6c, 0x69, 0x9e, 0x32, 0xf0, 0x71, 0x89, - 0x68, 0xf9, 0xbf, 0xa0, 0xc6, 0x99, 0x0e, 0x46, 0x7f, 0x29, 0xae, 0xcf, - 0x2e, 0x80, 0x7e, 0x9b, 0x8a, 0x70, 0x8b, 0xc8, 0x67, 0xaa, 0x89, 0x84, - 0x5f, 0xf5, 0x23, 0xdd, 0xb2, 0x4a, 0x3c, 0xe3, 0x3e, 0x1d, 0x56, 0xc7, - 0x12, 0xd1, 0x74, 0x3b, 0x17, 0x3d, 0x84, 0xc0, 0x43, 0xbd, 0xd6, 0xe4, - 0xfa, 0x0b, 0xda, 0x25, 0xc5, 0x87, 0x6c, 0x0d, 0x0f, 0x97, 0xb8, 0xd9, - 0xb2, 0x93, 0xfc, 0x7d, 0xb8, 0xf2, 0x6e, 0x4a, 0xa8, 0xa4, 0xcc, 0x1e, - 0xf0, 0x71, 0x17, 0x4c, 0x54, 0x22, 0x23, 0x1a, 0x92, 0x4c, 0xb4, 0x4c, - 0x20, 0xf4, 0xc8, 0x50, 0xa9, 0x39, 0x06, 0x14, 0xb7, 0x20, 0xf5, 0x61, - 0xf2, 0xf3, 0xe7, 0xe3, 0xf8, 0xcd, 0x58, 0x44, 0x83, 0x15, 0x8f, 0xc0, - 0x9a, 0x69, 0x9e, 0x52, 0xcd, 0x53, 0x0b, 0xab, 0xa8, 0xc3, 0x12, 0x80, - 0x9c, 0xef, 0xc8, 0x6b, 0x5e, 0xac, 0x9a, 0xd3, 0xfd, 0xb6, 0xf0, 0x94, - 0x88, 0x72, 0x10, 0x28, 0xd2, 0xce, 0xbc, 0xfb, 0x41, 0xa6, 0x08, 0x77, - 0xe4, 0x5a, 0x5a, 0x50, 0x14, 0xdf, 0x37, 0x3f, 0x39, 0xc3, 0x5b, 0x1c, - 0x9d, 0xf5, 0x4a, 0x8a, 0x68, 0x76, 0xe6, 0x33, 0xd1, 0xb7, 0xde, 0x4d, - 0x49, 0x60, 0x5f, 0xb2, 0x8c, 0xb1, 0x57, 0x33, 0x7e, 0x20, 0x40, 0x7b, - 0xc0, 0x3c, 0xe0, 0xa7, 0x62, 0x13, 0xbf, 0x83, 0xe4, 0xa0, 0xdc, 0x34, - 0xa9, 0xf2, 0x8f, 0x68, 0x20, 0xec, 0xa2, 0x1e, 0xe6, 0x4b, 0xc9, 0xd4, - 0xc2, 0x4c, 0xd5, 0x55, 0x65, 0x20, 0x3d, 0xea, 0x3b, 0x9a, 0xf0, 0xc0, - 0x69, 0xa0, 0x70, 0xb2, 0x07, 0x83, 0x28, 0x1c, 0xbc, 0xe0, 0x7c, 0x81, - 0x9d, 0x84, 0x9b, 0x02, 0x1e, 0xb7, 0x51, 0xe3, 0x01, 0x31, 0x5f, 0xae, - 0x51, 0xfd, 0x87, 0x59, 0x4d, 0x78, 0xba, 0x26, 0xdd, 0x5d, 0x32, 0xd7, - 0xbe, 0xa1, 0x40, 0x7d, 0xe0, 0x90, 0xe8, 0x1b, 0x8c, 0x7d, 0xe3, 0x69, - 0x0b, 0xea, 0xa4, 0xe5, 0x4a, 0x1d, 0x34, 0x64, 0xe4, 0xab, 0xee, 0xb7, - 0x12, 0x02, 0x07, 0xe2, 0x22, 0xe3, 0x32, 0x9f, 0xb3, 0x03, 0xeb, 0x61, - 0xf2, 0x48, 0x97, 0x73, 0x19, 0x4b, 0xa4, 0x87, 0xc6, 0xd3, 0x6c, 0x60, - 0xbc, 0x48, 0xc7, 0xf7, 0x43, 0xc4, 0xf4, 0xf7, 0x4d, 0xff, 0xa3, 0x94, - 0xa5, 0xd0, 0x1d, 0x1c, 0xa6, 0xcb, 0xe6, 0xf6, 0x74, 0x1f, 0x03, 0xe3, - 0x30, 0x9a, 0xdb, 0x9a, 0x6b, 0xd4, 0x15, 0xb2, 0x07, 0x83, 0x28, 0x1c, - 0x4d, 0x35, 0x2e, 0x41, 0xe0, 0xb0, 0xdb, 0x0e, 0xe8, 0x4d, 0x7c, 0x20, - 0xe9, 0x38, 0xfd, 0x53, 0xdf, 0xd0, 0x3c, 0x11, 0x3d, 0x78, 0xd7, 0xc5, - 0x8c, 0xe6, 0xff, 0xb4, 0x07, 0x01, 0xcc, 0x78, 0xe3, 0xc5, 0x51, 0x99, - 0xeb, 0x6f, 0x69, 0xda, 0x5c, 0x51, 0xf4, 0x30, 0xcd, 0x5a, 0xfe, 0x63, - 0xa3, 0x43, 0x5e, 0xac, 0x7c, 0xe1, 0x2a, 0x7c, 0xd8, 0x4e, 0x2e, 0x35, - 0xfd, 0xdc, 0xd2, 0xb8, 0x13, 0x28, 0x9f, 0x3a, 0x0e, 0xc7, 0x5e, 0xa8, - 0xc1, 0x89, 0x34, 0xd9, 0x06, 0x04, 0x6b, 0x8f, 0x65, 0xc0, 0xd3, 0x48, - 0x8d, 0xdf, 0xa6, 0x01, 0x66, 0x9b, 0x7d, 0x0d, 0x7c, 0x0d, 0xe7, 0x39, - 0x3d, 0x8f, 0x1b, 0x6f, 0x68, 0xc5, 0x32, 0x43, 0xed, 0x45, 0x8d, 0xf7, - 0x71, 0x09, 0xbc, 0x59, 0x03, 0xbe, 0x77, 0x39, 0x78, 0x79, 0x56, 0xdc, - 0x0c, 0xa7, 0xe5, 0x0e, 0x7c, 0xe1, 0x52, 0x93, 0x76, 0xcf, 0x11, 0xb2, - 0x2c, 0xbf, 0xd8, 0x1b, 0x91, 0x7c, 0x66, 0xb1, 0x6c, 0xa4, 0xb8, 0x62, - 0x7a, 0x47, 0xad, 0x06, 0xca, 0x74, 0x8a, 0x3d, 0xae, 0x08, 0x53, 0xad, - 0x27, 0x0c, 0xeb, 0x64, 0xbe, 0xfc, 0x2f, 0xd2, 0xb5, 0xe4, 0x6a, 0x68, - 0xa9, 0xcb, 0xc3, 0xaf, 0x8e, 0xbd, 0x71, 0x90, 0xac, 0x3b, 0xa7, 0x6a, - 0xdb, 0x3d, 0x86, 0x2c, 0xda, 0x54, 0xdd, 0xbe, 0x7c, 0x9a, 0xa0, 0x02, - 0xd3, 0x9b, 0x30, 0x42, 0x3e, 0xc5, 0x41, 0xa5, 0xe9, 0xed, 0x59, 0x76, - 0x4c, 0x7c, 0xeb, 0x1a, 0xfd, 0x39, 0x5a, 0xcb, 0xe4, 0x05, 0xd2, 0xb0, - 0xed, 0xbe, 0xfb, 0x9a, 0x89, 0x67, 0x37, 0x31, 0x34, 0x62, 0x05, 0xfe, - 0x6a, 0xda, 0xb1, 0x03, 0xd6, 0x02, 0x73, 0xb9, 0x30, 0x81, 0x79, 0x5d, - 0x75, 0x58, 0xf5, 0xa0, 0x5a, 0x3a, 0x77, 0x9d, 0x21, 0xae, 0x58, 0x52, - 0x6b, 0x4a, 0xf6, 0xf1, 0xd4, 0x3d, 0xd2, 0x5d, 0x38, 0x80, 0x44, 0x4a, - 0x2e, 0xa5, 0xf1, 0x3c, 0xfd, 0x32, 0x7e, 0x7a, 0x71, 0x86, 0xfd, 0xd5, - 0xab, 0x39, 0xcc, 0xf9, 0x20, 0x32, 0x08, 0x45, 0x80, 0xac, 0x58, 0x41, - 0xe8, 0x24, 0x2a, 0x3b, 0x24, 0x91, 0xcc, 0x8f, 0x58, 0xdf, 0x10, 0x95, - 0x1b, 0xe0, 0xb7, 0xae, 0xf9, 0x0c, 0xb8, 0x32, 0x06, 0x5c, 0x37, 0x5c, - 0x62, 0x4e, 0x83, 0x09, 0x95, 0x6a, 0x3d, 0xf2, 0x9f, 0x48, 0x2f, 0xe4, - 0x4e, 0x42, 0xfc, 0x45, 0x9c, 0x47, 0x4b, 0x74, 0x0f, 0x81, 0x9a, 0x6c, - 0x00, 0x3f, 0x2a, 0xb2, 0xd1, 0xd0, 0x71, 0x97, 0xbf, 0xcf, 0x2f, 0x8c, - 0x1b, 0x28, 0x5b, 0x3e, 0x0d, 0x29, 0x49, 0x4a, 0x13, 0x10, 0xa0, 0x1e, - 0x79, 0xf4, 0xea, 0x68, 0x26, 0x41, 0xb6, 0x7c, 0x2c, 0x97, 0x13, 0xca, - 0xdc, 0xe9, 0x2e, 0x9f, 0x91, 0xb0, 0x84, 0x57, 0xaa, 0xec, 0x7f, 0x1b, - 0xfe, 0xf0, 0x58, 0x44, 0xc6, 0xb8, 0xf2, 0x6e, 0x69, 0xc4, 0xb6, 0x7c, - 0xe7, 0x06, 0x69, 0xb1, 0x95, 0xa6, 0x2d, 0xb6, 0xa1, 0x6b, 0x0c, 0x17, - 0xeb, 0x0b, 0x7e, 0xa4, 0xae, 0x65, 0x91, 0xb1, 0x94, 0xf5, 0x14, 0xdc, - 0xcd, 0xf9, 0x0d, 0x3f, 0xff, 0xab, 0x05, 0x61, 0x57, 0xa2, 0xb3, 0x08, - 0x32, 0xad, 0x1f, 0xf8, 0x7b, 0x26, 0x1e, 0x48, 0xb0, 0x5f, 0x5b, 0xcc, - 0xd9, 0xbe, 0xaf, 0x79, 0x1d, 0x0e, 0x45, 0x70, 0xeb, 0x6c, 0x05, 0xb5, - 0x69, 0x94, 0xab, 0x63, 0x3e, 0xbc, 0x64, 0xb6, 0xa2, 0x8d, 0x8f, 0x92, - 0xb4, 0xbb, 0x2a, 0x03, 0xee, 0x37, 0xc8, 0x3f, 0x26, 0xdb, 0xe7, 0x67, - 0xac, 0xf2, 0x9f, 0x70, 0x4a, 0xf9, 0x40, 0x67, 0x33, 0xb0, 0x66, 0x34, - 0xdc, 0x53, 0xb2, 0x42, 0x60, 0xee, 0xcf, 0x66, 0xb5, 0x4e, 0xfe, 0x71, - 0x35, 0xdb, 0x23, 0x13, 0x81, 0x75, 0xa9, 0xa0, 0xc2, 0xf7, 0xe1, 0x99, - 0x9c, 0x85, 0x78, 0x06, 0xba, 0x85, 0xef, 0xc2, 0x61, 0xf9, 0xeb, 0x84, - 0x1c, 0xaf, 0x53, 0xa4, 0xbf, 0xa9, 0xfa, 0x81, 0x22, 0x72, 0x1b, 0x4b, - 0x9c, 0x39, 0xeb, 0xdc, 0x66, 0x20, 0x74, 0x12, 0xbf, 0x0c, 0xe0, 0x21, - 0x24, 0xbe, 0xcc, 0x86, 0xcc, 0xa0, 0x4a, 0x62, 0xae, 0x05, 0x92, 0x56, - 0xae, 0x30, 0x87, 0xfc, 0x69, 0x9f, 0xd0, 0x20, 0x14, 0x72, 0x3d, 0xa8, - 0x12, 0xce, 0x12, 0xd7, 0x8e, 0xa3, 0x2f, 0xfb, 0x9d, 0x60, 0x53, 0x33, - 0x1c, 0x69, 0xf5, 0xb6, 0x32, 0xa9, 0x47, 0x37, 0x0f, 0x9e, 0xc2, 0x6a, - 0xa7, 0x05, 0x5e, 0x1c, 0x94, 0xe1, 0x35, 0x86, 0x74, 0x52, 0x3a, 0xef, - 0x3b, 0x99, 0x83, 0x95, 0x29, 0xf4, 0x1f, 0xb2, 0x07, 0x83, 0x28, 0x1c, - 0x1f, 0xd2, 0xac, 0xfd, 0xd0, 0x59, 0x82, 0xc2, 0xd3, 0x47, 0x7a, 0x35, - 0x4c, 0x27, 0xa1, 0x4a, 0x77, 0x84, 0x05, 0x86, 0x57, 0x62, 0x97, 0x04, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0xb0, 0x78, 0xff, 0x95, - 0xf0, 0x7c, 0x77, 0x8f, 0x22, 0x3b, 0x5d, 0xae, 0x8f, 0x7b, 0x9d, 0x4d, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0x63, 0x9f, 0xf3, 0xce, 0x92, 0xef, 0x52, 0x2e, 0xe4, 0x9c, 0xd9, 0xeb, - 0x86, 0xb2, 0xe1, 0x5a, 0x1e, 0x63, 0x4b, 0x28, 0x61, 0x76, 0x50, 0x8e, - 0x6e, 0xfc, 0xaf, 0xb4, 0x08, 0xd4, 0x15, 0xb2, 0x07, 0x83, 0x28, 0x1c, - 0xc7, 0xfd, 0x76, 0xed, 0xb3, 0x29, 0xbc, 0x6f, 0x39, 0xc2, 0x01, 0x4c, - 0xb6, 0xc0, 0x37, 0x98, 0xa1, 0xe3, 0xd9, 0x4e, 0x81, 0xd9, 0xbc, 0x7c, - 0x93, 0x45, 0x8d, 0x8d, 0x1a, 0x96, 0x01, 0x09, 0x02, 0x0a, 0x06, 0x95, - 0x18, 0x6e, 0x1e, 0x76, 0x15, 0x61, 0x14, 0x09, 0x88, 0x47, 0x3b, 0x08, - 0x19, 0x41, 0xa0, 0xeb, 0xa3, 0x49, 0xff, 0x19, 0x19, 0x07, 0x8c, 0x6e, - 0x43, 0x6d, 0xec, 0x29, 0x90, 0xcc, 0x45, 0xde, 0x68, 0xaf, 0xa3, 0x90, - 0x65, 0x3f, 0x10, 0x48, 0x42, 0xa4, 0x2d, 0x32, 0x42, 0x7d, 0x68, 0x2e, - 0x8d, 0xd6, 0xaa, 0x83, 0xe1, 0x63, 0x34, 0x62, 0x08, 0x64, 0x1b, 0x2c, - 0xf6, 0x83, 0x91, 0xc7, 0xea, 0xff, 0xd0, 0xad, 0xae, 0xab, 0xf4, 0x28, - 0x97, 0xf1, 0x0c, 0x5a, 0x41, 0x39, 0x93, 0xe4, 0x0e, 0xb7, 0x35, 0x82, - 0xca, 0x69, 0xe9, 0xec, 0x42, 0xf2, 0x21, 0xbc, 0xc6, 0x89, 0x25, 0x25, - 0x0a, 0x11, 0x00, 0xc6, 0xcf, 0x54, 0x1f, 0x51, 0x04, 0x27, 0xa6, 0x70, - 0x7f, 0x74, 0x7e, 0x1d, 0x1d, 0x19, 0xe2, 0xcc, 0x64, 0xfb, 0xe9, 0xc6, - 0xb2, 0x6b, 0x8d, 0x21, 0x27, 0xba, 0x46, 0x8e, 0x33, 0xec, 0x6d, 0x63, - 0xec, 0x52, 0x3c, 0x40, 0xa9, 0x2c, 0x66, 0x62, 0x86, 0x06, 0x27, 0x20, - 0xa7, 0xa7, 0x94, 0x7a, 0xe4, 0xc2, 0x6c, 0x47, 0x66, 0x7b, 0xde, 0xe9, - 0xb0, 0x8d, 0x3f, 0x5c, 0x8b, 0x11, 0x1e, 0x25, 0x01, 0x87, 0x0d, 0x98, - 0x27, 0xc6, 0xa1, 0x50, 0x8c, 0x71, 0x26, 0x21, 0xae, 0xbb, 0x10, 0xfd, - 0x59, 0xb4, 0xf5, 0xab, 0x64, 0x45, 0x00, 0x37, 0x80, 0xad, 0x17, 0x00, - 0x11, 0x8a, 0x81, 0x83, 0x44, 0x7a, 0xbf, 0x16, 0x73, 0x7c, 0x8a, 0xd4, - 0x31, 0xfc, 0x0d, 0x8b, 0x09, 0x0c, 0xfb, 0x2d, 0xce, 0x9d, 0x85, 0x6e, - 0xf7, 0xad, 0xfa, 0x7d, 0x6b, 0x78, 0x15, 0x2e, 0x64, 0x01, 0x2f, 0xfb, - 0xad, 0xfe, 0x96, 0x8d, 0xee, 0x00, 0x91, 0x86, 0x08, 0x66, 0x69, 0x4b, - 0xe0, 0x8d, 0x17, 0xd1, 0xdf, 0xfb, 0x06, 0xe5, 0xbf, 0x82, 0x36, 0x85, - 0x7e, 0x8d, 0x39, 0xc0, 0xb0, 0x27, 0xc4, 0x26, 0x13, 0x62, 0x7a, 0xac, - 0x61, 0x72, 0x98, 0xc1, 0x4b, 0xda, 0xd7, 0x12, 0x79, 0x1f, 0xc4, 0xcb, - 0x9a, 0x35, 0x16, 0xe9, 0x61, 0xaa, 0xe0, 0xbf, 0xce, 0x26, 0x12, 0x38, - 0xa4, 0x98, 0xf6, 0x02, 0x23, 0x86, 0x02, 0xf1, 0x79, 0x6d, 0x99, 0xab, - 0x6e, 0xca, 0xcc, 0x72, 0x43, 0x09, 0xca, 0x34, 0x09, 0x45, 0x27, 0x9f, - 0x1b, 0xf4, 0xc4, 0x8f, 0x7d, 0xeb, 0x56, 0x85, 0x4f, 0x17, 0xba, 0x60, - 0x4e, 0xd4, 0x9a, 0x8a, 0xb7, 0x21, 0x51, 0xa6, 0x8b, 0x57, 0x40, 0x13, - 0xab, 0x0c, 0x5e, 0x1a, 0x76, 0x86, 0xce, 0xa0, 0x7b, 0xf8, 0x9e, 0x85, - 0xc5, 0x4d, 0x33, 0x18, 0x34, 0x90, 0xcc, 0x82, 0xc8, 0xec, 0xd1, 0x04, - 0xc3, 0x6a, 0xe9, 0x1e, 0x6a, 0xca, 0xcc, 0x72, 0x4b, 0x09, 0xca, 0x34, - 0x00, 0x45, 0x27, 0x9f, 0x11, 0xf4, 0xc4, 0x8f, 0x46, 0x14, 0x94, 0x85, - 0x2b, 0x9b, 0x06, 0x4a, 0x91, 0x92, 0x75, 0xaa, 0x50, 0x48, 0x93, 0x42, - 0xa4, 0x49, 0x09, 0xb3, 0xbc, 0xff, 0x51, 0x8f, 0x66, 0x13, 0xc5, 0x91, - 0x2f, 0xa1, 0xc3, 0x1f, 0xf2, 0xfd, 0xcf, 0xe4, 0x43, 0x2d, 0x72, 0x9c, - 0x06, 0xef, 0xe2, 0x4e, 0x28, 0x16, 0x57, 0x3f, 0xf3, 0xfd, 0xcf, 0xe4, - 0x43, 0x2d, 0x72, 0x9c, 0x06, 0xef, 0xe2, 0x4e, 0x28, 0x16, 0x57, 0x3f, - 0xa4, 0x49, 0x09, 0xb3, 0xbc, 0xff, 0x51, 0x8f, 0x67, 0x13, 0xc5, 0x91, - 0x2e, 0xa1, 0xc3, 0x1f, 0xa6, 0x3d, 0xaa, 0xd4, 0x54, 0xac, 0xdb, 0x5f, - 0x66, 0x00, 0xdb, 0x23, 0xc4, 0x67, 0x6e, 0x04, 0x36, 0x9b, 0x9b, 0x35, - 0xdd, 0x57, 0xb5, 0xd0, 0x38, 0xe6, 0xdc, 0xd6, 0x60, 0x00, 0x42, 0x06, - 0x6a, 0x46, 0x13, 0x1b, 0xda, 0x96, 0xae, 0x63, 0x06, 0xef, 0xe2, 0x4e, - 0x28, 0x16, 0x57, 0x3f, 0x47, 0x14, 0x94, 0x85, 0x2a, 0x9b, 0x06, 0x4a, - 0x90, 0x92, 0x75, 0xaa, 0x50, 0x48, 0x93, 0x42, 0xf1, 0x05, 0xdb, 0x2b, - 0x98, 0xd0, 0xe0, 0x07, 0x95, 0xce, 0xd1, 0xb9, 0xa6, 0x21, 0xad, 0x47, - 0x9c, 0xd7, 0x99, 0x6f, 0xbf, 0x92, 0xe6, 0x9f, 0xbd, 0x2b, 0xf1, 0x3f, - 0x63, 0xc6, 0x4f, 0x9c, 0xda, 0x36, 0x7c, 0x5b, 0x41, 0xae, 0xfd, 0xc0, - 0xc9, 0x98, 0xe8, 0x4e, 0xc1, 0x19, 0x35, 0x04, 0x50, 0x87, 0xfd, 0x26, - 0x96, 0x0a, 0x51, 0x44, 0xc4, 0x33, 0x53, 0x19, 0x52, 0xa2, 0x6d, 0x17, - 0xa7, 0xef, 0xea, 0x2e, 0xc3, 0xb9, 0x31, 0x11, 0x40, 0x99, 0x51, 0xa7, - 0xa0, 0x72, 0x25, 0x65, 0x54, 0x06, 0x15, 0xf5, 0x47, 0x3d, 0x04, 0x74, - 0x81, 0xf0, 0x61, 0xae, 0x22, 0x8d, 0x02, 0x1b, 0x61, 0x20, 0x20, 0x75, - 0x8b, 0xcd, 0x6f, 0x3a, 0x37, 0x09, 0x7d, 0xfb, 0x3e, 0xe4, 0x56, 0x64, - 0x07, 0x67, 0x8a, 0x3a, 0x9e, 0x4e, 0xf2, 0xf4, 0xb3, 0xaf, 0xd2, 0x63, - 0x4c, 0xf7, 0x81, 0x91, 0xb0, 0x6d, 0x52, 0xa9, 0x14, 0xb8, 0xa1, 0x3c, - 0x51, 0xc1, 0xdb, 0xaa, 0xde, 0x91, 0x49, 0x1d, 0x98, 0xd7, 0x99, 0x6f, - 0xba, 0x92, 0xe3, 0x9f, 0xb0, 0x2b, 0xfc, 0x3f, 0x63, 0xc6, 0x4f, 0x9c, - 0xf3, 0xfd, 0xcf, 0xe4, 0x43, 0x2d, 0x72, 0x9c, 0x07, 0xef, 0xe2, 0x4e, - 0x28, 0x16, 0x57, 0x3f, 0x1b, 0xf0, 0x2a, 0xf4, 0x2e, 0x0f, 0xb9, 0x67, - 0x7a, 0xba, 0x98, 0x08, 0xd6, 0x97, 0xff, 0xce, 0xbe, 0x59, 0x25, 0x87, - 0x36, 0xba, 0xe2, 0xe1, 0x0d, 0x87, 0xcd, 0xc7, 0xa6, 0x81, 0x7c, 0x1d, - 0x1b, 0xf0, 0x2a, 0xf4, 0x20, 0x0f, 0xb9, 0x67, 0x74, 0xba, 0x98, 0x08, - 0xd8, 0x97, 0xff, 0xce, 0x44, 0xe4, 0x05, 0xdd, 0x32, 0x64, 0xf9, 0x39, - 0x35, 0x1b, 0x60, 0x6e, 0x7b, 0x4a, 0x87, 0x37, 0xaa, 0x49, 0x09, 0xb3, - 0xbc, 0xff, 0x51, 0x8f, 0x67, 0x13, 0xc5, 0x91, 0x2e, 0xa1, 0xc3, 0x1f, - 0xbe, 0x59, 0x25, 0x87, 0x37, 0xba, 0xe2, 0xe1, 0x0c, 0x87, 0xcd, 0xc7, - 0xa7, 0x81, 0x7c, 0x1d, 0x1b, 0xf0, 0x2a, 0xf4, 0x20, 0x0f, 0xb9, 0x67, - 0x74, 0xba, 0x98, 0x08, 0xd8, 0x97, 0xff, 0xce, 0x60, 0x56, 0xe1, 0x2b, - 0x18, 0x6f, 0xa2, 0x14, 0x88, 0xfe, 0x45, 0xb0, 0x72, 0xa4, 0xc2, 0x58, - 0x65, 0xca, 0xcc, 0x72, 0x42, 0x09, 0xca, 0x34, 0x09, 0x45, 0x27, 0x9f, - 0x19, 0xf4, 0xc4, 0x8f, 0xb0, 0xbf, 0xfc, 0xac, 0xd6, 0x75, 0x0a, 0xec, - 0x45, 0x94, 0xea, 0xf6, 0x76, 0x8b, 0x1e, 0xc1, 0x07, 0x42, 0xe0, 0xc9, - 0x71, 0x46, 0xb8, 0x67, 0x11, 0x9d, 0x86, 0x21, 0x88, 0xd4, 0x45, 0x6c, - 0x24, 0x5c, 0xd1, 0x1f, 0x13, 0x93, 0x01, 0x1f, 0x0e, 0x61, 0x57, 0x82, - 0x5d, 0x56, 0x7f, 0xc7, 0xbe, 0x4d, 0x48, 0xd6, 0x26, 0x2d, 0x5d, 0xf5, - 0xff, 0xfb, 0x6d, 0xa8, 0xe2, 0x74, 0xfe, 0x15, 0x19, 0xf0, 0xbe, 0x2b, - 0x18, 0xf4, 0xd8, 0xf2, 0xd0, 0xb9, 0x67, 0x05, 0x95, 0x51, 0x82, 0x00, - 0x1c, 0x20, 0xfb, 0x2e, 0xd6, 0x75, 0x0a, 0xec, 0x44, 0x94, 0xea, 0xf6, - 0x78, 0x8b, 0x1e, 0xc1, 0x15, 0xf0, 0x2a, 0xf4, 0x20, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x93, 0xbd, 0x1e, 0x23, - 0x5b, 0x13, 0x5a, 0x3b, 0x2b, 0x18, 0x55, 0x1d, 0xfa, 0x53, 0xc2, 0x98, - 0x47, 0x55, 0x56, 0xd7, 0xc6, 0x22, 0x80, 0x92, 0x1b, 0x19, 0x8b, 0xca, - 0x0a, 0xc0, 0xe0, 0x92, 0xe4, 0x72, 0xf6, 0x5a, 0xb9, 0x01, 0xff, 0x36, - 0xae, 0x7b, 0xa2, 0x9a, 0xa3, 0xf8, 0xe3, 0x07, 0x73, 0xa8, 0x97, 0xad, - 0x07, 0xd1, 0xe9, 0x2f, 0x63, 0x9e, 0x78, 0x77, 0xe6, 0x22, 0xa2, 0xfc, - 0xef, 0x56, 0x6c, 0x28, 0xd3, 0x3f, 0xbb, 0x77, 0x68, 0xe0, 0xe0, 0x68, - 0x2d, 0xb6, 0xe1, 0x8f, 0x38, 0x7c, 0x3c, 0x0d, 0x42, 0x0b, 0x27, 0x3a, - 0x1c, 0xb7, 0xf4, 0x86, 0x7a, 0x59, 0xad, 0x31, 0x32, 0x6b, 0x7c, 0xeb, - 0x3b, 0x4e, 0x06, 0x4b, 0xee, 0xfc, 0x05, 0x8e, 0x10, 0xe1, 0x9a, 0x73, - 0xe2, 0x77, 0x8d, 0x3e, 0x8d, 0xdf, 0x6c, 0xb1, 0x8b, 0x75, 0xec, 0x7c, - 0x59, 0x3a, 0x26, 0xd2, 0xc4, 0xb4, 0xfe, 0x8d, 0xa1, 0x92, 0x66, 0xcd, - 0x35, 0x4f, 0xc3, 0x98, 0xfd, 0xfa, 0x11, 0x2d, 0x4d, 0x38, 0x26, 0x2f, - 0x70, 0x64, 0x6c, 0xa0, 0x23, 0xbc, 0xfb, 0x0e, 0x59, 0xe2, 0x64, 0xc6, - 0x7f, 0xec, 0x0d, 0x0b, 0xa9, 0x42, 0x06, 0xf1, 0x53, 0xed, 0xb9, 0x29, - 0x4c, 0x75, 0x95, 0xd0, 0xb3, 0x3c, 0x17, 0x7d, 0x85, 0x9a, 0xb4, 0x4a, - 0x91, 0xe7, 0x14, 0x67, 0x61, 0x7b, 0xde, 0xe9, 0x33, 0x59, 0x6e, 0x1c, - 0x2e, 0xed, 0x3c, 0x6c, 0x3e, 0x3d, 0x41, 0x76, 0x85, 0x4e, 0xac, 0xc6, - 0xbd, 0x9e, 0x69, 0x59, 0x1d, 0x14, 0x19, 0x15, 0x64, 0x69, 0xf8, 0xa8, - 0xd7, 0x33, 0xf8, 0x40, 0x1b, 0xb6, 0xe4, 0xcd, 0xd0, 0xa5, 0xa7, 0xed, - 0x16, 0xa3, 0x55, 0xc0, 0x88, 0x94, 0x50, 0xa3, 0x91, 0xb0, 0x6d, 0xbd, - 0xc3, 0xb2, 0xf4, 0x69, 0xc0, 0x64, 0x1c, 0xb0, 0x08, 0xda, 0x24, 0xda, - 0xd5, 0x1b, 0xc9, 0xc8, 0xe7, 0x17, 0x3c, 0xf6, 0x2a, 0x6f, 0x22, 0xe8, - 0x2d, 0x97, 0x37, 0x83, 0x93, 0xa8, 0x5d, 0xb0, 0x8a, 0xed, 0x81, 0x4c, - 0x76, 0x86, 0x9b, 0x80, 0xf3, 0xc3, 0x12, 0xf6, 0x66, 0x80, 0x2b, 0x34, - 0xc8, 0x80, 0x9d, 0x85, 0xae, 0xb4, 0x71, 0x8f, 0x97, 0x23, 0x36, 0x71, - 0x21, 0x6e, 0x62, 0x6b, 0x13, 0x7e, 0x1e, 0xe8, 0x93, 0xff, 0xf0, 0x3b, - 0xcb, 0xc8, 0x94, 0x25, 0xe3, 0x87, 0xc5, 0x1b, 0xe2, 0xa5, 0x78, 0x91, - 0x72, 0x67, 0x5d, 0x27, 0xf8, 0x15, 0xbb, 0x2c, 0x60, 0x8e, 0x98, 0xb0, - 0xbe, 0x4f, 0x58, 0xbb, 0x2c, 0x1a, 0xee, 0x35, 0xd3, 0x56, 0x14, 0x33, - 0xc6, 0xbd, 0x3a, 0x0e, 0xc5, 0xbe, 0x31, 0x93, 0x4e, 0xf0, 0xa5, 0x28, - 0x31, 0xe8, 0xe6, 0xaa, 0xd5, 0x92, 0x92, 0x66, 0xad, 0x90, 0x08, 0xfe, - 0x7f, 0x3a, 0x03, 0xc0, 0xf6, 0x52, 0x34, 0x6b, 0x59, 0xe3, 0xf1, 0xb9, - 0xd6, 0xd1, 0x30, 0x8e, 0x19, 0xff, 0x38, 0x32, 0x1a, 0x9e, 0x39, 0xe3, - 0xb3, 0xb2, 0xec, 0xa6, 0x2c, 0x0d, 0xe4, 0xdb, 0xd8, 0xb6, 0x95, 0x0b, - 0x2b, 0xb5, 0xe8, 0x8d, 0xa0, 0xf6, 0xce, 0x73, 0x53, 0x35, 0x91, 0x7d, - 0x59, 0xcb, 0xd7, 0xfa, 0x20, 0x44, 0x91, 0xb7, 0x1d, 0xd9, 0xb4, 0x5b, - 0xa6, 0x1d, 0x37, 0x3b, 0x4d, 0xc7, 0x1f, 0x3f, 0x1f, 0xaa, 0x7f, 0xe2, - 0xfa, 0x7f, 0x87, 0x64, 0xd4, 0x2d, 0xea, 0x86, 0x82, 0xe6, 0xb5, 0xa4, - 0x49, 0xfe, 0x07, 0x3f, 0xf9, 0x1f, 0xcc, 0xe7, 0x52, 0x7a, 0xeb, 0x91, - 0x8d, 0xac, 0x9e, 0xac, 0x17, 0xc0, 0x29, 0xe2, 0x04, 0xdd, 0xbd, 0x05, - 0xbc, 0x2b, 0x8b, 0xff, 0x15, 0xad, 0xb1, 0xe7, 0x56, 0xad, 0x6c, 0x6e, - 0xdd, 0x33, 0xe6, 0xe3, 0x80, 0xde, 0xa3, 0x14, 0x5a, 0xd4, 0x49, 0x37, - 0x2d, 0x4e, 0xa5, 0x97, 0x30, 0x78, 0x0d, 0xcf, 0xf2, 0x3b, 0xb8, 0x1a, - 0x9a, 0x27, 0xc0, 0x0d, 0xbe, 0xc4, 0x0e, 0x5c, 0x63, 0xea, 0x87, 0x69, - 0x82, 0x20, 0x6e, 0xaf, 0x7b, 0x2d, 0xc3, 0x63, 0x2e, 0x9d, 0xf3, 0x10, - 0xa6, 0xc0, 0x94, 0x3c, 0x3c, 0xd6, 0xd6, 0xcb, 0x30, 0x19, 0xfd, 0x4a, - 0xe5, 0x8b, 0x38, 0x6f, 0xbd, 0x34, 0xbf, 0x03, 0x7d, 0x87, 0xa5, 0x7d, - 0x0b, 0xde, 0x67, 0x31, 0xa9, 0x12, 0x44, 0x5d, 0x8c, 0xd3, 0x5a, 0x0b, - 0xc3, 0x4a, 0xcf, 0x2e, 0x74, 0xf1, 0x02, 0xdb, 0xc1, 0xb4, 0x03, 0x6c, - 0xe9, 0xa1, 0x39, 0x8a, 0x4a, 0x81, 0x44, 0x85, 0x14, 0x74, 0x42, 0x62, - 0x67, 0x21, 0x57, 0x9f, 0x7d, 0xba, 0x19, 0x02, 0x62, 0xc7, 0xa3, 0x5b, - 0x30, 0x0c, 0x2e, 0x2d, 0x68, 0x59, 0x3a, 0x8f, 0xec, 0xbb, 0x01, 0xef, - 0x72, 0x08, 0x2d, 0xcb, 0xf4, 0x05, 0x7d, 0xd3, 0xb2, 0x7c, 0xb0, 0xad, - 0x4a, 0x1d, 0x3d, 0x7c, 0xeb, 0xf2, 0xb8, 0xa7, 0xa3, 0x1b, 0x31, 0xab, - 0x9a, 0x3c, 0x98, 0x0e, 0x91, 0x7c, 0x43, 0x30, 0x83, 0x36, 0x20, 0x7f, - 0x20, 0x8d, 0x1f, 0x7a, 0x68, 0x46, 0x90, 0x34, 0x1f, 0xf5, 0xfe, 0x81, - 0xb3, 0x0b, 0x5c, 0x68, 0xee, 0x6e, 0x84, 0x33, 0xa4, 0x37, 0x9e, 0x54, - 0x8e, 0xfe, 0x24, 0x40, 0x06, 0x3a, 0x22, 0x59, 0x4f, 0x9f, 0x6d, 0x46, - 0xe5, 0x41, 0x42, 0xfd, 0x05, 0x9f, 0x33, 0xc4, 0x39, 0x1a, 0x30, 0xd6, - 0x5f, 0x1c, 0x22, 0xd3, 0x80, 0x71, 0x6a, 0xb0, 0xac, 0x25, 0xea, 0x5d, - 0xdb, 0x80, 0x82, 0x10, 0x78, 0x46, 0x74, 0xc7, 0x35, 0x81, 0x0e, 0x53, - 0x5d, 0x60, 0xd1, 0x9c, 0xd7, 0x59, 0xa1, 0x12, 0x7e, 0xcf, 0x79, 0xb5, - 0x99, 0x00, 0xf8, 0x5c, 0x6a, 0xcb, 0x7b, 0xa5, 0x23, 0xe7, 0xb7, 0x77, - 0x89, 0x6b, 0xf5, 0x04, 0x90, 0x0f, 0xd0, 0xf0, 0x0f, 0x8e, 0x90, 0xfa, - 0xa1, 0x78, 0xff, 0x81, 0xcd, 0xbd, 0xe8, 0xa4, 0x22, 0x92, 0xb8, 0xe5, - 0x04, 0x39, 0xf8, 0x7c, 0x2e, 0x3a, 0xcd, 0x5c, 0x3f, 0xec, 0x57, 0x7e, - 0xfc, 0x49, 0x04, 0xbe, 0x44, 0xdc, 0xe1, 0x14, 0xa5, 0xb9, 0x1f, 0x71, - 0xde, 0x05, 0x46, 0x6e, 0xbd, 0xe8, 0x85, 0x90, 0xbc, 0x23, 0x85, 0xfc, - 0x32, 0xe9, 0x0e, 0xcb, 0x8a, 0x22, 0xb3, 0x3c, 0x32, 0xf1, 0xeb, 0x4f, - 0xe0, 0xa0, 0x82, 0x20, 0x3a, 0xbf, 0x9d, 0xa6, 0x10, 0x0d, 0x1e, 0x93, - 0x29, 0x58, 0xad, 0x3d, 0x77, 0x8a, 0x67, 0xd5, 0x91, 0x11, 0xf2, 0x9e, - 0x81, 0x7e, 0xeb, 0x52, 0xd7, 0x59, 0x01, 0xc2, 0xe1, 0x50, 0xc4, 0x39, - 0x21, 0x77, 0x3a, 0x2b, 0x93, 0xbf, 0x6b, 0xae, 0xc7, 0x22, 0xca, 0x66, - 0x43, 0x11, 0x6f, 0x43, 0x05, 0xea, 0xda, 0xb5, 0x99, 0x9f, 0x90, 0xb2, - 0xd2, 0x05, 0x10, 0xac, 0x01, 0xcb, 0xb5, 0x6d, 0x20, 0xb3, 0x99, 0x12, - 0x08, 0x69, 0x41, 0x37, 0x4d, 0x10, 0xe3, 0xf4, 0xd3, 0xc7, 0x0a, 0xfe, - 0xda, 0xf8, 0xc1, 0x79, 0x8d, 0xfb, 0x7e, 0x92, 0xdc, 0x0d, 0x29, 0x1f, - 0xf3, 0x04, 0x77, 0x1e, 0x83, 0x4f, 0x72, 0x6a, 0xde, 0xb2, 0x08, 0xd0, - 0xbd, 0x81, 0xc1, 0xd7, 0x51, 0x84, 0xd0, 0x75, 0x7e, 0x81, 0x62, 0x9a, - 0xea, 0x7b, 0x7b, 0x2a, 0x21, 0x43, 0x5a, 0x34, 0x7b, 0x44, 0x22, 0xa4, - 0xba, 0xc0, 0x33, 0x69, 0x23, 0xdf, 0xeb, 0x29, 0xbc, 0xd2, 0xff, 0xe1, - 0xa8, 0x93, 0x9d, 0x8c, 0xdf, 0x3b, 0x63, 0x50, 0x07, 0x7a, 0x25, 0xe0, - 0x90, 0x99, 0x2a, 0x77, 0x17, 0x31, 0xc8, 0x16, 0x8e, 0x27, 0x76, 0x02, - 0x99, 0xe5, 0xa4, 0xaf, 0x3d, 0x3f, 0x50, 0xec, 0x32, 0x17, 0x85, 0x12, - 0x9c, 0xe3, 0x8f, 0x7e, 0x46, 0x52, 0x5f, 0xc6, 0xd7, 0x20, 0x43, 0x83, - 0xa8, 0xb5, 0x3d, 0xbc, 0x8a, 0xf6, 0xca, 0x8e, 0xc2, 0x92, 0x77, 0xdf, - 0x16, 0x09, 0x0f, 0xec, 0xc4, 0x7b, 0x1e, 0xc8, 0x10, 0x0f, 0xef, 0xec, - 0xe8, 0x3c, 0x22, 0x2c, 0xb7, 0x59, 0x52, 0xc4, 0xc2, 0xaa, 0x80, 0x50, - 0x5c, 0x59, 0xea, 0xa6, 0x48, 0x6e, 0x1f, 0xfb, 0x16, 0x56, 0x99, 0xc3, - 0x29, 0xb9, 0x4a, 0xe4, 0x77, 0x0c, 0xd9, 0x54, 0x4c, 0xa2, 0x04, 0xa4, - 0xde, 0xe0, 0xc2, 0x4e, 0xfe, 0xa4, 0xe1, 0x85, 0xda, 0x1c, 0xe8, 0x46, - 0xf9, 0x69, 0x6c, 0xfc, 0xa4, 0x0d, 0x05, 0x13, 0x3e, 0xb1, 0xf4, 0x71, - 0xe8, 0x42, 0x79, 0x25, 0xa9, 0x34, 0x95, 0x20, 0xce, 0xd7, 0x17, 0xdb, - 0x0d, 0x51, 0x30, 0x38, 0x6f, 0xdb, 0x15, 0x0e, 0x79, 0x25, 0xfa, 0x5b, - 0x49, 0x1b, 0xdc, 0xe2, 0x83, 0x94, 0xaa, 0x11, 0x6c, 0xa0, 0x7e, 0xf1, - 0x79, 0xd1, 0x8b, 0x8a, 0x79, 0x71, 0xf8, 0x2a, 0x09, 0x6a, 0xc4, 0x5d, - 0xa9, 0x96, 0xb6, 0xe3, 0x1a, 0xd9, 0x2f, 0xb6, 0x73, 0xa7, 0x98, 0x19, - 0x7a, 0x4e, 0x09, 0x96, 0x00, 0x98, 0x67, 0x4e, 0xeb, 0xfa, 0x51, 0xfa, - 0x7f, 0x1c, 0xce, 0x11, 0x83, 0x81, 0x41, 0xcb, 0xac, 0x11, 0xfe, 0x97, - 0x7f, 0xdb, 0x85, 0xa7, 0x8e, 0xab, 0x90, 0x1f, 0x88, 0x12, 0x20, 0x33, - 0x73, 0x4c, 0x4f, 0xc6, 0xfc, 0x64, 0x8d, 0xcc, 0xf6, 0x10, 0x2b, 0x26, - 0x90, 0x31, 0x5c, 0xb5, 0x6f, 0xbf, 0x41, 0xcb, 0x95, 0xdf, 0x04, 0x2d, - 0x9b, 0xf1, 0x1f, 0x09, 0xf5, 0x58, 0x96, 0xa7, 0x9c, 0x95, 0x45, 0xe3, - 0xb0, 0x3a, 0x66, 0x14, 0x79, 0x42, 0xd6, 0x29, 0xa6, 0xa0, 0xce, 0x74, - 0x0f, 0xe1, 0xca, 0x49, 0x24, 0x56, 0xab, 0xc3, 0xd6, 0xe9, 0x9f, 0x0c, - 0xe6, 0xdf, 0xf2, 0x34, 0xe3, 0xea, 0xae, 0x5c, 0xb4, 0xd9, 0xf1, 0x2c, - 0x58, 0x8b, 0xca, 0x71, 0x40, 0x0b, 0x07, 0xb6, 0x19, 0x36, 0x5e, 0xab, - 0x18, 0x61, 0x8b, 0x50, 0xc2, 0x76, 0x34, 0x1f, 0x51, 0xdb, 0x77, 0x6f, - 0x56, 0x2a, 0x40, 0xd7, 0x06, 0x73, 0x95, 0x7a, 0x23, 0x20, 0x1c, 0x8b, - 0xba, 0x5a, 0x2d, 0x8c, 0x85, 0xae, 0x58, 0xc2, 0x1e, 0x63, 0xf1, 0xd9, - 0xc6, 0x0d, 0x98, 0x6c, 0xac, 0x48, 0x93, 0x97, 0xcc, 0x6f, 0x3d, 0x6c, - 0x9e, 0xb3, 0x1e, 0x69, 0xf8, 0xb1, 0xc9, 0x92, 0x2f, 0x3b, 0xac, 0x98, - 0x6b, 0x0e, 0xde, 0x9e, 0xa8, 0x4e, 0x5b, 0xb1, 0x7e, 0xf9, 0xbf, 0x18, - 0x93, 0x97, 0x90, 0x7d, 0xc5, 0xae, 0x9f, 0x87, 0xe0, 0x48, 0x72, 0x47, - 0x01, 0x5d, 0xb6, 0x3e, 0xd3, 0xb7, 0x7a, 0xf0, 0x87, 0xdc, 0x75, 0x74, - 0x70, 0x62, 0xcb, 0xd0, 0xc4, 0x84, 0x70, 0x68, 0xa3, 0xeb, 0x77, 0xde, - 0x8f, 0x18, 0x15, 0x1e, 0xbc, 0x3b, 0x18, 0x8c, 0xa2, 0x54, 0xe0, 0xed, - 0x1d, 0x6c, 0xcb, 0x91, 0x4a, 0x3c, 0x42, 0x20, 0xc8, 0x6c, 0xdc, 0xea, - 0x44, 0x8d, 0x6e, 0x47, 0x09, 0x85, 0x1e, 0xa5, 0xb5, 0x9f, 0x87, 0x9a, - 0x36, 0xb0, 0x4e, 0x4d, 0x17, 0x67, 0xa0, 0x68, 0x7b, 0x2f, 0xf2, 0xeb, - 0x95, 0x76, 0xc7, 0xdb, 0x39, 0x75, 0xe8, 0xf3, 0x41, 0xf9, 0x33, 0x48, - 0x1a, 0x99, 0xc0, 0xf7, 0x87, 0xbe, 0xc7, 0xfe, 0x3c, 0x4d, 0x5c, 0x44, - 0x0e, 0x34, 0x3b, 0x8a, 0x81, 0xba, 0x47, 0xf5, 0xf0, 0x5a, 0x06, 0xa6, - 0x9a, 0xa4, 0xbf, 0x55, 0xdd, 0xe6, 0x82, 0xf8, 0xfb, 0x88, 0x6c, 0xba, - 0xd1, 0xf5, 0xec, 0x3a, 0xaf, 0xd1, 0x94, 0x0f, 0x53, 0x6b, 0x9e, 0xee, - 0xdf, 0xfb, 0x59, 0x97, 0x27, 0x0f, 0x9c, 0x22, 0x4e, 0xa6, 0xb7, 0xb7, - 0x21, 0x77, 0x43, 0xe6, 0xf3, 0x60, 0x30, 0x60, 0x28, 0xc2, 0x87, 0x65, - 0x33, 0x24, 0x8b, 0x2b, 0x79, 0x14, 0x18, 0x15, 0x41, 0xde, 0xfe, 0x60, - 0x3c, 0xc3, 0x0e, 0xc1, 0x7e, 0x1a, 0xfb, 0x83, 0x08, 0xa7, 0xde, 0xb2, - 0xdd, 0xe0, 0x1f, 0xd2, 0x8f, 0x9d, 0x8d, 0x6b, 0x85, 0x0d, 0x4d, 0xcb, - 0x3a, 0xa3, 0x25, 0xdb, 0xad, 0xda, 0xe2, 0xf1, 0xe0, 0xfa, 0x3c, 0x3e, - 0x62, 0x6b, 0xcf, 0x56, 0xc3, 0x76, 0xb8, 0x49, 0x68, 0x83, 0xd1, 0xa3, - 0x4b, 0x31, 0x5c, 0x22, 0x93, 0xfc, 0x33, 0x41, 0x0a, 0x04, 0xea, 0x59, - 0xac, 0x7b, 0xc1, 0x78, 0x9e, 0x4e, 0xce, 0xfa, 0x4d, 0x22, 0xca, 0x4e, - 0x83, 0x4a, 0x43, 0x2a, 0x33, 0xd1, 0xfe, 0x49, 0x44, 0x1e, 0xce, 0xec, - 0x8e, 0xe6, 0x2a, 0x26, 0x8e, 0x2b, 0xac, 0xdb, 0xab, 0x9a, 0xbd, 0xdb, - 0x3f, 0x91, 0x78, 0xb7, 0xdd, 0xf7, 0xe5, 0x89, 0xa5, 0x80, 0x13, 0x7c, - 0x30, 0x49, 0x34, 0x5d, 0x9a, 0x32, 0x4d, 0xbe, 0x02, 0x50, 0x34, 0x9a, - 0xae, 0x03, 0x61, 0xfa, 0x5a, 0xc6, 0x1d, 0x90, 0x64, 0xeb, 0x62, 0x84, - 0x22, 0x31, 0x2b, 0x95, 0x81, 0x61, 0x26, 0xf4, 0xfe, 0x41, 0xb7, 0x16, - 0xc1, 0x99, 0x9d, 0x50, 0xb8, 0xd3, 0x52, 0x11, 0x8e, 0x75, 0xcc, 0xb5, - 0x39, 0x25, 0xc7, 0xde, 0x78, 0x57, 0x7c, 0xae, 0xba, 0x1d, 0x15, 0xac, - 0xd8, 0x08, 0xdd, 0x9c, 0xbb, 0x72, 0xd6, 0x92, 0xaa, 0xa8, 0x0e, 0xea, - 0x66, 0x0c, 0x03, 0xef, 0xf6, 0x5c, 0x8c, 0x08, 0x2f, 0x1d, 0x1f, 0xcc, - 0xe6, 0x77, 0xa4, 0x04, 0xe5, 0xfe, 0x31, 0xcf, 0xfb, 0x66, 0x16, 0x36, - 0x11, 0x20, 0x54, 0x89, 0x3a, 0x97, 0x14, 0x5c, 0x0c, 0x55, 0x5f, 0xee, - 0x7a, 0x2c, 0x7b, 0x71, 0x5c, 0xbc, 0xe3, 0x1b, 0x66, 0xdd, 0xba, 0x40, - 0xb0, 0xfe, 0x0a, 0xd0, 0x56, 0xc2, 0x25, 0xd0, 0xbe, 0x6a, 0x73, 0x11, - 0x41, 0xb6, 0x6d, 0xf8, 0x38, 0xfd, 0x77, 0x46, 0x63, 0x28, 0xa8, 0xaa, - 0x6f, 0xb0, 0x80, 0x99, 0xdf, 0x40, 0xfe, 0xa0, 0x71, 0x5f, 0x90, 0xde, - 0x42, 0x26, 0x95, 0xe5, 0xfd, 0xa9, 0xa8, 0x6b, 0xa4, 0xea, 0xc0, 0xd5, - 0xbc, 0x95, 0xde, 0x61, 0xad, 0xf8, 0x2e, 0x5a, 0x18, 0x13, 0x1d, 0x83, - 0x52, 0xe2, 0xb8, 0xf4, 0x0f, 0x28, 0x24, 0x52, 0x66, 0xae, 0x27, 0x5a, - 0xaa, 0xd6, 0x8c, 0x14, 0x54, 0x4d, 0x0d, 0x8c, 0x50, 0x1e, 0xf7, 0x67, - 0x7a, 0x99, 0xfb, 0xd4, 0x71, 0xde, 0x41, 0xaa, 0x5f, 0x6f, 0xa3, 0xcd, - 0x88, 0x6a, 0xc0, 0x94, 0xce, 0x05, 0xc0, 0x6a, 0x60, 0xcc, 0xf6, 0x3e, - 0xd3, 0x73, 0x41, 0xc9, 0xe3, 0xff, 0x50, 0xd8, 0x87, 0x6a, 0xdf, 0x0d, - 0x83, 0xa6, 0x9e, 0xb3, 0xad, 0x29, 0xfa, 0x82, 0x3f, 0x26, 0xff, 0x4d, - 0xbe, 0x37, 0x53, 0xc1, 0x00, 0x89, 0xc4, 0xb6, 0xe4, 0x68, 0x18, 0xc2, - 0xea, 0xb7, 0x61, 0x3f, 0x29, 0x87, 0xda, 0x89, 0x5b, 0x04, 0xa0, 0xd1, - 0xc5, 0xa2, 0xa9, 0x89, 0x1c, 0x7b, 0xab, 0x7d, 0x4b, 0x14, 0xf4, 0x5f, - 0x27, 0x10, 0x9a, 0x8a, 0xd4, 0xea, 0xa6, 0x71, 0x70, 0xb0, 0xdf, 0xf2, - 0x07, 0x16, 0x10, 0x0e, 0x24, 0xc8, 0x28, 0xde, 0xb6, 0xcf, 0x02, 0x73, - 0x36, 0x58, 0x9c, 0x35, 0x42, 0x2b, 0x57, 0xac, 0xc9, 0xf9, 0x53, 0x99, - 0x35, 0xd2, 0x4c, 0xee, 0x22, 0xc3, 0xfa, 0x96, 0xad, 0xa3, 0x42, 0xc5, - 0x0e, 0xb9, 0xdc, 0xe4, 0x3a, 0x47, 0xda, 0x7e, 0x85, 0xb1, 0xba, 0xcb, - 0xcd, 0xcb, 0x4b, 0xb3, 0x66, 0xed, 0x1f, 0x85, 0x43, 0xb9, 0xf1, 0xb7, - 0x28, 0x1f, 0xda, 0x3c, 0x6d, 0x0d, 0xd6, 0xf8, 0x1e, 0x72, 0x62, 0xe1, - 0xda, 0x63, 0x2a, 0x16, 0xea, 0x8d, 0x3a, 0x4e, 0x77, 0x5d, 0x66, 0xf5, - 0x27, 0x84, 0xb6, 0x8b, 0xee, 0xe3, 0x3a, 0x1b, 0x16, 0x8b, 0xa6, 0x0c, - 0x91, 0xd6, 0x6c, 0x09, 0x95, 0x19, 0x31, 0xac, 0x80, 0x0e, 0xeb, 0x91, - 0xba, 0xdc, 0x11, 0xdf, 0x82, 0x15, 0x90, 0x52, 0xca, 0x3e, 0x1e, 0xd3, - 0x51, 0x87, 0x13, 0x92, 0x73, 0xf6, 0xb0, 0xc6, 0xa9, 0xa4, 0x8e, 0x42, - 0x7e, 0xf8, 0x1d, 0xc1, 0xf8, 0x85, 0xf6, 0x74, 0x7f, 0x73, 0xf1, 0x5c, - 0x7c, 0x8c, 0xbf, 0xa2, 0x62, 0xc2, 0x5b, 0xed, 0x40, 0x1e, 0xdb, 0x05, - 0xbe, 0xbd, 0x2f, 0xbb, 0xfb, 0x38, 0x4e, 0x48, 0xee, 0x95, 0xf4, 0x4c, - 0x69, 0x95, 0xf9, 0x66, 0xd1, 0x9f, 0xbe, 0x47, 0x6a, 0x2f, 0x23, 0x75, - 0x66, 0xf0, 0xbf, 0x23, 0x82, 0xf0, 0xf3, 0x7c, 0x8a, 0xab, 0xa5, 0xce, - 0x09, 0x27, 0x13, 0xce, 0xd3, 0xa2, 0xaf, 0x15, 0xcd, 0x04, 0x4f, 0x7e, - 0x90, 0xc4, 0x36, 0x02, 0x09, 0x81, 0x04, 0x22, 0x67, 0x90, 0x86, 0xe5, - 0x91, 0xcc, 0x84, 0xfd, 0x24, 0xfb, 0xff, 0x80, 0x4e, 0x6d, 0x0b, 0xbc, - 0xbe, 0x5a, 0xee, 0xb6, 0x66, 0x00, 0xca, 0x4a, 0xa3, 0xc1, 0x9e, 0x15, - 0x37, 0x73, 0x20, 0xb0, 0x8e, 0xad, 0xda, 0x69, 0x44, 0xf3, 0x4d, 0x27, - 0x1c, 0x88, 0xc4, 0x2e, 0x55, 0x7e, 0xa1, 0xe2, 0xf7, 0xbc, 0x32, 0x82, - 0x11, 0x3e, 0xb7, 0x76, 0xe1, 0x54, 0xf4, 0x05, 0x36, 0x4b, 0x1d, 0x50, - 0x4c, 0x13, 0x37, 0x64, 0xf0, 0x18, 0x66, 0x4a, 0x1b, 0xf2, 0xea, 0x96, - 0x89, 0xb4, 0x50, 0xad, 0x74, 0xba, 0x46, 0x20, 0x78, 0xe9, 0x0a, 0x90, - 0xe5, 0xc0, 0xbb, 0x71, 0x95, 0x3f, 0x72, 0x98, 0xef, 0x7e, 0x8e, 0x10, - 0x64, 0x36, 0xcd, 0x7a, 0x0e, 0x1c, 0x19, 0x23, 0xc4, 0x5e, 0xeb, 0x0d, - 0x5b, 0xa6, 0x09, 0x25, 0x9d, 0xe4, 0xbc, 0x5a, 0xaf, 0x82, 0xdd, 0x5b, - 0x4e, 0xcd, 0xaf, 0x76, 0x2a, 0xc8, 0x15, 0xd1, 0x1e, 0xfa, 0xb8, 0x59, - 0x42, 0x90, 0x8d, 0x82, 0x2f, 0x49, 0x6c, 0x39, 0xa7, 0xd8, 0x5a, 0x63, - 0x61, 0x2a, 0x95, 0xc6, 0xe3, 0xba, 0x2f, 0x7b, 0x12, 0x9c, 0xe7, 0x76, - 0x21, 0x93, 0x5c, 0x73, 0xf0, 0xdf, 0x30, 0x3a, 0xb8, 0x0e, 0xf9, 0x1c, - 0x3f, 0x4f, 0x14, 0x94, 0x1c, 0x22, 0x0e, 0x2f, 0xca, 0xde, 0x1f, 0xb9, - 0x95, 0x6b, 0x99, 0x12, 0xea, 0x13, 0xc4, 0x2c, 0xa1, 0xa4, 0x02, 0x93, - 0xcb, 0xe7, 0x00, 0x97, 0xfc, 0x6f, 0x55, 0xc4, 0x24, 0x1e, 0x1e, 0x0e, - 0x60, 0xd8, 0x76, 0x41, 0xfe, 0x80, 0xd1, 0x0f, 0xe1, 0xd7, 0x90, 0x5b, - 0x4e, 0xcd, 0xaf, 0x76, 0x2a, 0xc8, 0x15, 0xd1, 0x1e, 0xfa, 0xb8, 0x59, - 0x42, 0x90, 0x8d, 0x82, 0x2f, 0x49, 0x6c, 0x39, 0x48, 0x55, 0x78, 0x40, - 0x49, 0x43, 0x35, 0x86, 0x6c, 0x0a, 0xf9, 0x6a, 0xc8, 0x62, 0x71, 0x9e, - 0xe5, 0xc3, 0xb9, 0x6b, 0x6f, 0x95, 0xed, 0x78, 0xca, 0xbc, 0xa8, 0x45, - 0x3e, 0x61, 0x12, 0x75, 0x66, 0xf0, 0xbf, 0x23, 0x82, 0xf0, 0xf3, 0x7c, - 0x8a, 0xab, 0xa5, 0xce, 0x09, 0x27, 0x13, 0xce, 0x10, 0x7a, 0x22, 0x52, - 0xf4, 0x4c, 0x27, 0x74, 0x20, 0xc0, 0xe2, 0xd3, 0x98, 0x74, 0xb0, 0xfe, - 0x15, 0x4b, 0xd6, 0x4a, 0x75, 0xff, 0x09, 0x3e, 0x56, 0x27, 0xb9, 0x41, - 0xa5, 0x59, 0xca, 0x48, 0xe7, 0xef, 0x0f, 0xae, 0x8c, 0x41, 0xaf, 0x53, - 0x2f, 0xa2, 0x21, 0x60, 0x3c, 0x94, 0x0d, 0x05, 0x79, 0x11, 0xba, 0xeb, - 0xab, 0x27, 0x1a, 0xec, 0x9a, 0xf8, 0xc4, 0xed, 0x2a, 0x03, 0xa3, 0x26, - 0x21, 0x2f, 0xf4, 0x77, 0x5b, 0xa9, 0x79, 0x81, 0x0a, 0xfa, 0x2a, 0x21, - 0xd0, 0xc1, 0xfc, 0x30, 0x2f, 0xe0, 0xc6, 0xcc, 0x62, 0x14, 0xa2, 0xd3, - 0xd0, 0xd0, 0xc6, 0x6b, 0xec, 0x4c, 0x3c, 0xbf, 0xfe, 0x48, 0x8a, 0xc8, - 0x75, 0xa1, 0x21, 0xeb, 0xc4, 0x2f, 0xbe, 0xa2, 0x21, 0x24, 0xee, 0x33, - 0xce, 0x55, 0xf5, 0xa5, 0xb4, 0x2a, 0x71, 0xf3, 0x84, 0x5c, 0xa7, 0x85, - 0xa5, 0x3d, 0x91, 0x48, 0x77, 0x6e, 0xba, 0x8e, 0x6e, 0x21, 0x17, 0x93, - 0x70, 0x75, 0xe7, 0x58, 0x43, 0xb3, 0xe0, 0x68, 0xa5, 0xd3, 0x17, 0x0e, - 0xe7, 0xfa, 0x56, 0xc1, 0x5d, 0x27, 0xc7, 0x71, 0xdd, 0xe2, 0x12, 0x64, - 0x6d, 0x66, 0x31, 0x07, 0x60, 0x39, 0xf8, 0x9e, 0x00, 0x28, 0x4f, 0x22, - 0x44, 0xeb, 0x21, 0xc9, 0x77, 0xca, 0xf0, 0xfd, 0x97, 0x24, 0x4d, 0x28, - 0x13, 0xd0, 0xdd, 0x80, 0x91, 0x21, 0xef, 0xf6, 0xfe, 0x7a, 0x9e, 0x1d, - 0x5f, 0xf1, 0xd5, 0x42, 0x5c, 0x5c, 0x13, 0x47, 0x64, 0x76, 0x57, 0xeb, - 0x14, 0x8a, 0xae, 0xec, 0x5a, 0xf5, 0x35, 0x21, 0x21, 0xe1, 0x16, 0xde, - 0xb6, 0xe8, 0x5f, 0xa7, 0xfd, 0x3f, 0xff, 0x50, 0xeb, 0xb1, 0x18, 0x0c, - 0x5f, 0xb6, 0x26, 0x18, 0xb7, 0x6f, 0x16, 0xd7, 0x6f, 0x5e, 0x06, 0x86, - 0x01, 0xc5, 0x27, 0xe9, 0x05, 0xf1, 0x16, 0xe8, 0x61, 0xda, 0x60, 0xda, - 0x7d, 0x5a, 0x79, 0xe2, 0xee, 0x88, 0x79, 0x27, 0x12, 0x36, 0x51, 0xc3, - 0xbc, 0x70, 0x7d, 0x87, 0x32, 0xbf, 0x59, 0xac, 0x0c, 0x5e, 0x6f, 0x33, - 0x28, 0x54, 0x00, 0xe9, 0x40, 0x1d, 0xac, 0x01, 0xbb, 0xa5, 0x3c, 0x7e, - 0x13, 0x87, 0x1b, 0xe0, 0x56, 0x75, 0x30, 0xbe, 0x20, 0xad, 0x5f, 0x7d, - 0x51, 0x35, 0xae, 0xbc, 0x50, 0x91, 0x8d, 0x29, 0xf2, 0x6f, 0x3e, 0x4b, - 0xfd, 0x20, 0x79, 0xec, 0xed, 0x01, 0x36, 0x71, 0x51, 0xfc, 0x54, 0x8d, - 0x86, 0x07, 0x7d, 0xc5, 0x8c, 0xd9, 0x65, 0x07, 0xef, 0x5c, 0xee, 0xc1, - 0x5b, 0xec, 0xee, 0x5d, 0x1e, 0xa2, 0xde, 0x47, 0xcc, 0x2b, 0xeb, 0x41, - 0xe7, 0x7b, 0xe1, 0xe2, 0x9e, 0x34, 0x94, 0xde, 0x10, 0xc5, 0xae, 0x1f, - 0x07, 0x0b, 0x40, 0xb7, 0xb1, 0x96, 0xbb, 0x45, 0x50, 0xf2, 0x4e, 0x81, - 0x93, 0xb4, 0x0c, 0x70, 0x77, 0xcb, 0x5a, 0x98, 0xc3, 0xcd, 0x46, 0x10, - 0x0e, 0xde, 0x87, 0xeb, 0x86, 0x92, 0x2e, 0xe2, 0x3b, 0xf8, 0x0f, 0x36, - 0x10, 0x1a, 0x6f, 0xd5, 0xa9, 0x6b, 0x04, 0xdf, 0x20, 0x59, 0xde, 0x3c, - 0xf7, 0xeb, 0x5a, 0xe4, 0x43, 0x66, 0x2b, 0xd6, 0x4a, 0x99, 0xe3, 0x90, - 0x43, 0x64, 0x74, 0xfb, 0xf3, 0x97, 0x70, 0x0e, 0xe1, 0x54, 0xb6, 0x75, - 0x01, 0x0e, 0x9d, 0x79, 0x2c, 0x57, 0x63, 0x9e, 0x07, 0x5f, 0x72, 0xbc, - 0xdc, 0x56, 0xaa, 0x2a, 0x0e, 0x18, 0x64, 0x67, 0xff, 0xe1, 0x4d, 0x83, - 0xfd, 0x0e, 0xc1, 0xc7, 0x48, 0xa4, 0x99, 0xb3, 0x32, 0x3c, 0xd7, 0x92, - 0xdb, 0xf4, 0x0b, 0x3f, 0x5f, 0x96, 0xcd, 0x73, 0x21, 0x63, 0x06, 0x19, - 0x35, 0x85, 0xfd, 0x95, 0xf3, 0x38, 0x77, 0x08, 0x96, 0x07, 0x57, 0x21, - 0xdb, 0x4c, 0xfb, 0xb5, 0x23, 0x34, 0x93, 0x53, 0x01, 0x19, 0x35, 0xf2, - 0xe3, 0x97, 0xc5, 0x92, 0x09, 0x83, 0x60, 0xc4, 0x84, 0xd0, 0x21, 0x9f, - 0xaa, 0x89, 0xc9, 0x2d, 0x58, 0xbd, 0xd6, 0xb9, 0x94, 0x3d, 0x27, 0x9d, - 0x4b, 0x35, 0xc9, 0xce, 0x2e, 0x8b, 0xdc, 0x13, 0x5c, 0x5e, 0xa5, 0x77, - 0x6d, 0xec, 0xe9, 0x1f, 0xb9, 0x0e, 0x4a, 0x6d, 0x03, 0x87, 0x40, 0x14, - 0x00, 0xb5, 0xb4, 0xcf, 0x5c, 0x7e, 0x47, 0xb4, 0xb5, 0xa9, 0x92, 0xb6, - 0x4a, 0x29, 0x3a, 0xe7, 0x86, 0x92, 0xb2, 0x51, 0x3e, 0x8e, 0xca, 0xa7, - 0x99, 0x50, 0x36, 0x6f, 0x3c, 0xca, 0xd2, 0xc9, 0x22, 0xe1, 0xab, 0xd1, - 0xbe, 0x99, 0x86, 0x3e, 0xd5, 0x0b, 0x70, 0xbf, 0xd2, 0x5f, 0x8d, 0x87, - 0xb4, 0xfc, 0x8b, 0x73, 0x20, 0x50, 0x90, 0xb5, 0x67, 0x5e, 0x48, 0x47, - 0x3e, 0x59, 0x16, 0x84, 0x61, 0xaa, 0xea, 0x48, 0xf0, 0x98, 0xd0, 0x2a, - 0xd3, 0x36, 0x78, 0x72, 0xfa, 0xb4, 0x2f, 0x4d, 0x32, 0x6f, 0x8b, 0x7f, - 0x2f, 0xc3, 0x1c, 0x21, 0xed, 0x77, 0xaf, 0x4e, 0x98, 0xf3, 0x27, 0x9f, - 0xb8, 0x6e, 0x44, 0x92, 0xbb, 0xb6, 0xe4, 0xfc, 0x2f, 0x19, 0x55, 0x6a, - 0xf8, 0x5b, 0xa4, 0xf5, 0xef, 0x8d, 0xcb, 0x16, 0xc9, 0xb7, 0x20, 0x94, - 0xe7, 0xb4, 0xd2, 0x04, 0x30, 0x29, 0xde, 0x89, 0x7f, 0x66, 0xcc, 0xee, - 0x53, 0xe9, 0xe4, 0x22, 0x76, 0x6d, 0x37, 0x9e, 0xc8, 0x2c, 0x83, 0x28, - 0x6c, 0xfd, 0x18, 0x96, 0xe6, 0x4c, 0x7d, 0x96, 0x90, 0x5b, 0xc5, 0xf6, - 0x85, 0x61, 0xa5, 0x28, 0x62, 0x77, 0x4a, 0xf0, 0xf3, 0xdf, 0xca, 0x89, - 0x2e, 0x82, 0xe6, 0x3b, 0x58, 0x66, 0xe8, 0x33, 0x39, 0x0b, 0x43, 0x9c, - 0x37, 0xc8, 0x5e, 0xaa, 0x87, 0x78, 0x64, 0x5e, 0x9f, 0x9d, 0x72, 0xb0, - 0xd8, 0xd7, 0x23, 0xfe, 0x3f, 0xd2, 0x1c, 0xc4, 0x57, 0x2a, 0x30, 0xf2, - 0x5c, 0x94, 0x34, 0xfb, 0xea, 0x18, 0x26, 0xd0, 0xa9, 0xfa, 0x45, 0x0c, - 0x35, 0xd1, 0xcd, 0x47, 0xc4, 0x80, 0x82, 0x20, 0xf1, 0xdf, 0xc8, 0xa8, - 0x6f, 0x0f, 0x7c, 0xd8, 0x4d, 0x9c, 0x06, 0xf3, 0x64, 0xa0, 0xdd, 0x65, - 0x3b, 0xa8, 0x1e, 0x8b, 0x51, 0x15, 0x0c, 0x2c, 0x19, 0x4a, 0x1f, 0xca, - 0x22, 0x06, 0x04, 0x97, 0xb8, 0xae, 0x98, 0xb8, 0x7f, 0xc8, 0x9d, 0x4e, - 0xd6, 0x3b, 0x47, 0x0f, 0x49, 0xb7, 0xb8, 0x47, 0x8f, 0xc6, 0x38, 0x1b, - 0xb5, 0x4f, 0xe0, 0x63, 0x41, 0xd7, 0xde, 0x92, 0x51, 0x67, 0xfd, 0x08, - 0x4f, 0x14, 0x5b, 0xa1, 0x0e, 0x23, 0x31, 0x4e, 0xe6, 0x5b, 0x65, 0xad, - 0x18, 0xa2, 0xdb, 0x12, 0xf1, 0x8b, 0xd8, 0xb0, 0xdf, 0x1c, 0x62, 0x1f, - 0x42, 0x13, 0x71, 0xa2, 0xf0, 0x1f, 0x82, 0xe9, 0xed, 0x24, 0x31, 0xa2, - 0xdc, 0xf2, 0x54, 0xe3, 0x8f, 0x3d, 0x77, 0x72, 0xb5, 0x51, 0x0c, 0xf6, - 0xfd, 0xa3, 0x62, 0xf1, 0x00, 0x89, 0x90, 0xdc, 0xe7, 0x85, 0x7d, 0x92, - 0xcd, 0xbb, 0xa2, 0x95, 0x59, 0x82, 0xfa, 0xeb, 0x18, 0x46, 0x70, 0xc7, - 0xff, 0x1f, 0x50, 0x15, 0x60, 0xb9, 0x6e, 0x41, 0x79, 0x4e, 0xed, 0xbb, - 0x8f, 0x72, 0x02, 0xb6, 0x6a, 0x31, 0xd8, 0xa8, 0xfa, 0x89, 0x7e, 0x4b, - 0x04, 0xd4, 0xb3, 0x98, 0xd2, 0xd0, 0x0f, 0x43, 0xb8, 0x30, 0x0b, 0x0f, - 0xb1, 0x17, 0x51, 0xbb, 0x52, 0xd3, 0x27, 0x68, 0xdf, 0xe9, 0x67, 0x8d, - 0x81, 0xb1, 0xce, 0xbe, 0xa2, 0x2f, 0x92, 0xd0, 0x7e, 0xa0, 0xc2, 0x48, - 0xbc, 0xa7, 0x90, 0x9e, 0x5b, 0x76, 0x8b, 0x90, 0x66, 0xa0, 0x15, 0xb4, - 0xf0, 0x0b, 0x36, 0xf1, 0xcb, 0x3a, 0x91, 0x85, 0x85, 0xf9, 0x09, 0x47, - 0xf5, 0xe8, 0x1d, 0x3c, 0x13, 0xd6, 0xda, 0x6e, 0x20, 0xb0, 0x34, 0x98, - 0x0d, 0x5b, 0x58, 0xb7, 0x98, 0x08, 0x6d, 0x1a, 0x40, 0x4a, 0x64, 0x9e, - 0x48, 0xc1, 0xed, 0xfc, 0xd0, 0xd1, 0xd8, 0x2a, 0xfa, 0x41, 0x89, 0xc1, - 0x32, 0xd4, 0x29, 0x40, 0xf3, 0xb3, 0x22, 0x92, 0x07, 0x5a, 0x77, 0xa6, - 0x77, 0xd7, 0x34, 0xa6, 0x45, 0x11, 0x5d, 0x45, 0x72, 0xdb, 0x58, 0x07, - 0xd7, 0x24, 0xb3, 0x2c, 0x08, 0x17, 0x34, 0xc7, 0x80, 0x2f, 0xbf, 0x5b, - 0x0b, 0xe8, 0x5d, 0xd9, 0x17, 0x77, 0x88, 0x89, 0x43, 0x16, 0x3c, 0x9c, - 0x13, 0x6c, 0x7f, 0xbd, 0x9e, 0xce, 0xa7, 0x8d, 0x92, 0x6e, 0xb1, 0x4b, - 0xaf, 0xef, 0x0a, 0xdf, 0x3f, 0x39, 0x3f, 0x5d, 0x17, 0x20, 0xf3, 0xb1, - 0x83, 0x23, 0x81, 0x44, 0x00, 0x55, 0xdf, 0x22, 0x00, 0x43, 0xd9, 0x19, - 0x51, 0xb6, 0x31, 0x30, 0x4e, 0x72, 0xa0, 0x66, 0xc4, 0xf4, 0xca, 0x38, - 0xff, 0x11, 0x55, 0xd8, 0xbf, 0x1c, 0x13, 0xe3, 0xa3, 0xbb, 0xe3, 0x14, - 0x96, 0x00, 0x42, 0x2f, 0x4c, 0xbf, 0x5e, 0x6e, 0xe7, 0x68, 0x77, 0x58, - 0xc1, 0x4d, 0x05, 0x66, 0xb4, 0x8f, 0xb4, 0xda, 0x48, 0x0f, 0x14, 0x80, - 0x62, 0x71, 0x10, 0xa9, 0x09, 0xc0, 0xd8, 0x30, 0x4e, 0x9e, 0x17, 0xb6, - 0xee, 0xce, 0x29, 0x95, 0x65, 0xd7, 0x79, 0x12, 0xea, 0xa7, 0x6a, 0x6c, - 0x7e, 0x95, 0xe8, 0x86, 0x73, 0x79, 0x8b, 0x02, 0xf4, 0x34, 0xdc, 0xf5, - 0xac, 0x2c, 0x69, 0x58, 0x04, 0x34, 0x07, 0xed, 0x6f, 0x72, 0x87, 0x5c, - 0x60, 0x15, 0xcf, 0x26, 0x09, 0x04, 0x2b, 0x7f, 0x21, 0x07, 0x30, 0x01, - 0x62, 0x79, 0xe6, 0x3a, 0x6c, 0x9e, 0xca, 0x74, 0x2c, 0xc7, 0xa8, 0x37, - 0x69, 0xa5, 0x35, 0x73, 0x41, 0x83, 0x7a, 0x47, 0x26, 0x12, 0x36, 0x1c, - 0xee, 0x3c, 0xd7, 0xd7, 0x6f, 0xe8, 0x70, 0xe4, 0x96, 0xde, 0xfd, 0xaa, - 0x4f, 0x41, 0x13, 0xe3, 0xf7, 0xf3, 0xec, 0x65, 0x16, 0xeb, 0x1f, 0xdf, - 0x4a, 0x0e, 0x5e, 0x0a, 0x2e, 0xa6, 0x9c, 0x35, 0x8d, 0x85, 0x39, 0x72, - 0xc6, 0x1c, 0xfe, 0x98, 0x11, 0x8a, 0xff, 0x66, 0x61, 0xf5, 0x07, 0xf6, - 0x60, 0x19, 0xb5, 0x50, 0xaf, 0xc8, 0xaf, 0xdc, 0x2d, 0x06, 0x01, 0xac, - 0x4f, 0x41, 0x13, 0xe3, 0xf6, 0xf3, 0xe8, 0x66, 0x17, 0xbe, 0x17, 0xdf, - 0x4a, 0x0e, 0x5e, 0x0a, 0x1b, 0x54, 0xf2, 0xf2, 0xe2, 0xe8, 0xf5, 0x1d, - 0x40, 0x29, 0xd5, 0xab, 0x1d, 0xe0, 0xff, 0xf1, 0xb4, 0xe9, 0xec, 0x20, - 0x70, 0xe3, 0x02, 0xad, 0x70, 0xa9, 0x58, 0x5f, 0xbe, 0xbb, 0xe1, 0xb8, - 0x21, 0x6f, 0xeb, 0xc2, 0x23, 0xe4, 0x28, 0x10, 0x2e, 0x27, 0x19, 0x43, - 0xd7, 0xa6, 0xc3, 0x5c, 0xc9, 0xf8, 0x85, 0x7c, 0xdb, 0x60, 0x61, 0xdc, - 0x27, 0xdd, 0x72, 0x86, 0x0e, 0x80, 0x87, 0x20, 0x64, 0x40, 0x51, 0x68, - 0x5d, 0x04, 0x24, 0xf0, 0x46, 0xbc, 0x71, 0x65, 0x25, 0x83, 0xb5, 0x57, - 0x77, 0x46, 0x4a, 0x3a, 0xb6, 0x6e, 0xe5, 0x87, 0x03, 0x8a, 0xe1, 0x13, - 0xd8, 0x1d, 0x2e, 0x60, 0x63, 0x5d, 0xa7, 0xe3, 0xc4, 0xce, 0x44, 0xed, - 0xf7, 0x09, 0x5c, 0x28, 0x41, 0x6d, 0x56, 0xdb, 0x60, 0x4f, 0x4c, 0x49, - 0xad, 0xbd, 0x1c, 0xd2, 0xa8, 0xc9, 0xf2, 0x56, 0xdb, 0x47, 0xa6, 0xbe, - 0x61, 0xe5, 0x8e, 0x91, 0x3c, 0xe1, 0x6b, 0x08, 0x5d, 0xa8, 0xc4, 0x05, - 0x09, 0x8c, 0xce, 0xfe, 0x39, 0xca, 0xf7, 0xaf, 0xc2, 0x91, 0xc5, 0xbd, - 0xeb, 0x49, 0xc7, 0x78, 0x3b, 0xe9, 0x74, 0x28, 0x14, 0xd4, 0x9a, 0x7c, - 0x44, 0xd5, 0x32, 0xdd, 0x15, 0xf7, 0x8f, 0x5c, 0x5d, 0xe2, 0xe8, 0x5c, - 0xfe, 0xa2, 0x0f, 0xde, 0xd1, 0x9b, 0x42, 0x27, 0x72, 0x67, 0xe6, 0xe0, - 0xb5, 0x24, 0x1b, 0x43, 0x3b, 0x65, 0xf8, 0xfb, 0x82, 0x50, 0xc0, 0xaa, - 0x9e, 0xfb, 0xc7, 0x3b, 0x03, 0xa9, 0xfa, 0xb0, 0x6a, 0x8e, 0x12, 0xcf, - 0xff, 0xd8, 0x4d, 0xac, 0xab, 0x37, 0x2a, 0x86, 0xa0, 0xb0, 0xe1, 0xd0, - 0x28, 0xa5, 0x49, 0x69, 0x74, 0x50, 0x05, 0x51, 0x6a, 0x6f, 0xcf, 0x3b, - 0x85, 0x2e, 0x03, 0xce, 0xe0, 0x70, 0x35, 0xe7, 0xe9, 0xab, 0x3f, 0x4a, - 0x33, 0x21, 0xad, 0x19, 0xbb, 0xb8, 0x2a, 0xb3, 0x71, 0x34, 0x30, 0x40, - 0xb6, 0x3a, 0xb6, 0x82, 0x05, 0xd1, 0xb9, 0x39, 0xd2, 0x1d, 0x2e, 0x60, - 0x38, 0x50, 0xcc, 0x51, 0x74, 0xa0, 0x58, 0xaf, 0x4e, 0x8f, 0x76, 0xbe, - 0xf8, 0x04, 0x9e, 0x03, 0x60, 0x4f, 0x4c, 0x49, 0xad, 0xbd, 0x1c, 0xd2, - 0xa8, 0xc9, 0xf2, 0x56, 0xdb, 0x47, 0xa2, 0xbe, 0x61, 0xe5, 0x8e, 0x91, - 0x3c, 0xe1, 0x6b, 0x08, 0x5d, 0xa8, 0xc4, 0x05, 0x09, 0x8c, 0xce, 0xfe, - 0x49, 0xb5, 0x5a, 0xb0, 0x8e, 0x92, 0xf2, 0xf9, 0xa4, 0x0d, 0xb8, 0x8e, - 0x2a, 0x15, 0x1c, 0x98, 0x14, 0xd4, 0x9a, 0x7c, 0x44, 0xd5, 0x32, 0xdd, - 0x15, 0xf7, 0x8b, 0x5c, 0x5d, 0xe2, 0xe8, 0x5c, 0xfe, 0xa2, 0x0f, 0xde, - 0xd1, 0x9b, 0x42, 0x27, 0x72, 0x67, 0xe6, 0xe0, 0xb5, 0x24, 0x1b, 0x43, - 0xf3, 0xe9, 0x9b, 0xd6, 0x2f, 0xa6, 0x5f, 0xa2, 0xbb, 0x5f, 0xa6, 0x17, - 0x14, 0x04, 0x8e, 0x96, 0x6a, 0x8e, 0x12, 0xcf, 0xff, 0xd8, 0x49, 0xac, - 0xab, 0x37, 0x2a, 0x86, 0xa0, 0xb0, 0xe1, 0xd0, 0x28, 0xa5, 0x49, 0x69, - 0x74, 0x50, 0x05, 0x51, 0x6a, 0x6f, 0xcf, 0x3b, 0x85, 0x2e, 0x03, 0xce, - 0x3c, 0x1b, 0xa6, 0x85, 0x97, 0x21, 0xd4, 0x37, 0x22, 0x31, 0x49, 0xa9, - 0x40, 0xad, 0x09, 0xdc, 0x71, 0x34, 0x34, 0x40, 0xb6, 0x3a, 0xb6, 0x82, - 0x05, 0xd1, 0xb9, 0x39, 0xd2, 0x1d, 0x2e, 0x60, 0x5b, 0x68, 0x75, 0x4b, - 0x40, 0xe0, 0x12, 0x75, 0x40, 0x8b, 0x11, 0xb1, 0x9e, 0xdc, 0xf9, 0x2e, - 0x60, 0x4f, 0x4c, 0x49, 0xad, 0xbd, 0x1c, 0xd2, 0xbc, 0xcc, 0xef, 0x33, - 0xca, 0x47, 0xa5, 0xbe, 0x61, 0xe5, 0x8e, 0x91, 0x3c, 0xe1, 0x6b, 0x08, - 0x5d, 0xa8, 0xc4, 0x05, 0x09, 0x8c, 0xce, 0xfe, 0xd5, 0xe2, 0x5b, 0x06, - 0x97, 0xec, 0x7c, 0x75, 0x54, 0x02, 0x66, 0x1a, 0x5b, 0xe6, 0x5b, 0x01, - 0x26, 0xe9, 0x1d, 0x31, 0xde, 0x06, 0xec, 0xd9, 0x69, 0x37, 0x43, 0x2e, - 0x2c, 0x12, 0x2b, 0xce, 0x94, 0xd7, 0xdf, 0x5d, 0xb0, 0xff, 0x2a, 0xbc, - 0xce, 0xe2, 0x07, 0x9c, 0xb0, 0xca, 0xcc, 0xda, 0x3a, 0xe6, 0x1d, 0x79, - 0xa6, 0x9a, 0x4a, 0x55, 0xa7, 0x44, 0xb6, 0x81, 0x34, 0x8f, 0x64, 0xe4, - 0x7f, 0xf8, 0x93, 0x94, 0x3a, 0xba, 0x33, 0x22, 0x57, 0xa8, 0xc4, 0x05, - 0x09, 0x8c, 0xce, 0xfe, 0xd2, 0x6a, 0xf0, 0xe3, 0x70, 0x0d, 0x21, 0x74, - 0xb9, 0xc7, 0x28, 0xa6, 0x1d, 0xee, 0x25, 0x75, 0xe8, 0x4f, 0x88, 0xf5, - 0x3a, 0x95, 0xc9, 0x4f, 0x12, 0x53, 0xb1, 0x69, 0x73, 0xf6, 0x17, 0xf8, - 0x0c, 0xe3, 0xfa, 0x62, 0x51, 0xef, 0x0c, 0x18, 0x66, 0xfb, 0x98, 0xa8, - 0x9c, 0x84, 0x8c, 0xff, 0x3a, 0xe6, 0x1d, 0x79, 0xa6, 0x9a, 0x4a, 0x55, - 0xa7, 0x44, 0xb6, 0x81, 0x25, 0x8f, 0x64, 0xe5, 0x7f, 0xf8, 0x93, 0x94, - 0x3a, 0xba, 0x33, 0x22, 0x57, 0xa8, 0xc4, 0x05, 0x09, 0x8c, 0xce, 0xfe, - 0x41, 0x14, 0x83, 0xa0, 0x8d, 0xef, 0x64, 0x58, 0x5c, 0x48, 0xfd, 0x96, - 0x42, 0xbe, 0x5b, 0x8e, 0x26, 0xe9, 0x1d, 0x31, 0xc3, 0x10, 0xfd, 0xba, - 0x69, 0x37, 0x43, 0x2e, 0x2c, 0x12, 0x2b, 0xce, 0x89, 0x21, 0x48, 0xcc, - 0xf6, 0x37, 0x73, 0x1f, 0x56, 0x84, 0x69, 0xfb, 0x0b, 0x76, 0x31, 0xfa, - 0xaa, 0x4e, 0xb4, 0x9f, 0x5b, 0xa6, 0x3e, 0x2a, 0x71, 0xe3, 0x7a, 0x5e, - 0x61, 0xe7, 0x36, 0x15, 0x13, 0xe9, 0x90, 0x94, 0x22, 0xb9, 0x6e, 0x21, - 0x25, 0x88, 0xce, 0x05, 0x09, 0x8c, 0xce, 0xfe, 0xde, 0x5e, 0x13, 0x42, - 0xd6, 0xf9, 0xe9, 0x7d, 0x0d, 0x96, 0x7c, 0x42, 0xad, 0xe6, 0xef, 0xa6, - 0x44, 0x29, 0x6e, 0xc7, 0x30, 0xbf, 0x88, 0xc4, 0x45, 0x79, 0xa3, 0xfe, - 0xe7, 0xe4, 0xab, 0x46, 0xd6, 0x00, 0x87, 0x4e, 0x75, 0x66, 0x0e, 0x21, - 0x10, 0x67, 0x0f, 0xbd, 0x4e, 0x96, 0x98, 0x0b, 0xaa, 0x4e, 0xb4, 0x9f, - 0x5b, 0xa6, 0x3e, 0x2a, 0x71, 0xe3, 0x7a, 0x5e, 0x61, 0xe5, 0x36, 0x15, - 0x13, 0xe9, 0x90, 0x94, 0x22, 0xb9, 0x6e, 0x21, 0x25, 0x88, 0xce, 0x05, - 0x09, 0x8c, 0xce, 0xfe, 0xd7, 0xd0, 0x75, 0xf1, 0xda, 0x6b, 0x4a, 0x0a, - 0x7d, 0xc6, 0x5c, 0xd8, 0xfd, 0x2d, 0x69, 0xe1, 0x44, 0x29, 0x6e, 0xc7, - 0x30, 0xbd, 0x88, 0xc4, 0x45, 0x79, 0xa3, 0xfe, 0xe7, 0xe4, 0xab, 0x46, - 0x80, 0xbf, 0x88, 0x5b, 0x24, 0x34, 0xf9, 0x36, 0x71, 0x54, 0xb1, 0x99, - 0x1b, 0x7e, 0x36, 0x0f, 0x9d, 0x2d, 0x9a, 0xe9, 0x5f, 0x91, 0xf1, 0xe8, - 0xc8, 0x3c, 0x61, 0x54, 0x3f, 0xfe, 0xb2, 0x2c, 0x71, 0xe6, 0x8e, 0x89, - 0x3f, 0xbc, 0x68, 0x7a, 0x7d, 0xa2, 0xc4, 0x05, 0x09, 0x8c, 0xce, 0xfe, - 0x05, 0xd6, 0xe0, 0xee, 0xba, 0x5b, 0x08, 0xb3, 0xca, 0xb1, 0x8b, 0xeb, - 0xed, 0x21, 0x51, 0x74, 0xe8, 0x4f, 0x88, 0xf5, 0x2b, 0x86, 0xc9, 0x4f, - 0x13, 0x53, 0xb1, 0x69, 0x73, 0xf6, 0x17, 0xf8, 0xd8, 0x95, 0x82, 0x5b, - 0x24, 0x34, 0xf9, 0x36, 0x71, 0x54, 0xb1, 0x99, 0x1b, 0x7e, 0x36, 0x0f, - 0xf6, 0x10, 0x64, 0x65, 0x01, 0x64, 0xeb, 0xe4, 0xce, 0xc0, 0x71, 0x59, - 0x9c, 0xc6, 0x2f, 0x47, 0x73, 0xe6, 0x8e, 0x89, 0x3f, 0xbc, 0x68, 0x7a, - 0x7d, 0xa2, 0xc4, 0x05, 0x09, 0x8c, 0xce, 0xfe, 0x37, 0x6b, 0x37, 0x65, - 0xb3, 0x23, 0x77, 0xd5, 0x22, 0xa9, 0x9b, 0x96, 0xa1, 0x4a, 0xcd, 0x80, - 0xe8, 0x4f, 0x88, 0xf5, 0x2b, 0x86, 0xc9, 0x4f, 0x11, 0x53, 0xb1, 0x69, - 0x73, 0xf6, 0x17, 0xf8, 0xd8, 0x95, 0x82, 0x5b, 0x24, 0x34, 0xf9, 0x36, - 0x71, 0x54, 0xb1, 0x99, 0x1b, 0x7e, 0x36, 0x0f, 0x8f, 0x05, 0x57, 0x5e, - 0xde, 0x74, 0xc5, 0xdf, 0xb8, 0xf6, 0x6d, 0xed, 0x3d, 0x4c, 0xaf, 0x7a, - 0x75, 0xe6, 0x8e, 0x89, 0x3f, 0xbc, 0x68, 0x7a, 0x7d, 0xa2, 0xc4, 0x05, - 0x09, 0x8c, 0xce, 0xfe, 0x4c, 0x95, 0x3c, 0x20, 0x03, 0x77, 0x3a, 0x20, - 0x97, 0x58, 0xb3, 0xca, 0x64, 0x6d, 0x12, 0x4d, 0xa9, 0xe3, 0x51, 0x02, - 0xe5, 0x26, 0xfe, 0xec, 0x78, 0xc7, 0x8a, 0xc5, 0xa5, 0x90, 0x14, 0x8a, - 0xfe, 0x61, 0x77, 0x0d, 0xda, 0x8b, 0xa6, 0xc8, 0xdf, 0x32, 0xd7, 0x04, - 0x4a, 0x63, 0x79, 0xff, 0xf7, 0x81, 0x49, 0x9e, 0x3c, 0xbb, 0xcf, 0xe7, - 0x9b, 0x89, 0x76, 0xca, 0x54, 0xce, 0x04, 0xbf, 0xe7, 0x6f, 0xb0, 0x3e, - 0x20, 0xa2, 0x60, 0xe1, 0x6c, 0x71, 0x89, 0x64, 0x1b, 0x52, 0x52, 0x4c, - 0xf2, 0xcf, 0x71, 0xec, 0x2c, 0x23, 0x20, 0x4b, 0x5b, 0xbb, 0x8c, 0x3d, - 0x22, 0xb5, 0x0e, 0xe3, 0x9b, 0x44, 0x37, 0x71, 0xda, 0x3b, 0x7f, 0x35, - 0xdb, 0x75, 0xd2, 0x68, 0x23, 0x60, 0xe0, 0x96, 0xb6, 0xab, 0x00, 0xc5, - 0x9b, 0xbf, 0x66, 0x15, 0x5f, 0x0d, 0xe6, 0x1d, 0x0e, 0xdb, 0xe7, 0x78, - 0xc3, 0xc2, 0x2f, 0x90, 0xc6, 0x49, 0x74, 0x07, 0x8e, 0x00, 0x6b, 0x41, - 0x31, 0xa8, 0x24, 0x8a, 0x70, 0x23, 0x14, 0x07, 0xcc, 0x33, 0x23, 0x0d, - 0x00, 0x4a, 0x0b, 0xd6, 0x5c, 0x94, 0x45, 0xf9, 0x4a, 0x58, 0x1c, 0xa4, - 0xc1, 0x67, 0xca, 0x33, 0x6f, 0xdb, 0xd6, 0x33, 0x8e, 0x8b, 0xa1, 0x4e, - 0x9e, 0x8f, 0x8a, 0x06, 0x5e, 0x44, 0x86, 0xe1, 0x7b, 0x9c, 0x5e, 0x89, - 0x5b, 0xe8, 0x0c, 0xb4, 0x85, 0xa3, 0x5b, 0x87, 0x62, 0x64, 0x0d, 0xa7, - 0xa4, 0x98, 0x40, 0xdb, 0x26, 0x31, 0x45, 0x6e, 0x2d, 0x48, 0x92, 0xce, - 0xbb, 0xda, 0xc7, 0x83, 0x3f, 0x9f, 0x56, 0xd9, 0xb6, 0x57, 0xd2, 0x1c, - 0x71, 0x94, 0x85, 0x5a, 0x61, 0x7b, 0xe9, 0xc4, 0x08, 0xb8, 0x1a, 0x6c, - 0x53, 0x74, 0x7d, 0x78, 0x4f, 0x0e, 0x00, 0xcd, 0x65, 0xf1, 0x11, 0xc1, - 0x07, 0xe8, 0x97, 0xa5, 0x3c, 0xcb, 0x07, 0xf6, 0x0c, 0x91, 0xdb, 0xf9, - 0x2f, 0xb2, 0xec, 0x9d, 0x43, 0x56, 0x5d, 0x7a, 0xe4, 0x1f, 0x56, 0x3e, - 0xe2, 0x4b, 0xe9, 0x2c, 0x73, 0x5a, 0xe4, 0xd1, 0x20, 0x14, 0xff, 0x25, - 0x68, 0x04, 0x04, 0x7e, 0x41, 0x7c, 0x30, 0x69, 0xdb, 0x92, 0x3b, 0x4f, - 0xa6, 0x2e, 0x68, 0xe1, 0x9f, 0x46, 0x74, 0x7d, 0x4a, 0x6d, 0x8d, 0xf8, - 0x0b, 0x1f, 0x0d, 0xc0, 0x4a, 0x51, 0x5f, 0x2c, 0x64, 0x40, 0xbb, 0xd3, - 0x74, 0x6c, 0xc4, 0x9e, 0xc4, 0xe7, 0x15, 0x47, 0x33, 0xc1, 0x4c, 0xde, - 0xde, 0xb5, 0xa9, 0x3f, 0xf0, 0x01, 0x7d, 0xec, 0xc0, 0x72, 0x6d, 0x95, - 0x2b, 0x49, 0x3f, 0xff, 0xf5, 0xa4, 0xf4, 0x90, 0x22, 0x14, 0x85, 0x82, - 0x1c, 0x85, 0x45, 0x57, 0x10, 0xb1, 0x69, 0x00, 0xee, 0x41, 0x14, 0x01, - 0xb8, 0x3e, 0xd1, 0x37, 0xab, 0xa5, 0x75, 0x84, 0x78, 0x88, 0x5d, 0xf3, - 0xe9, 0x05, 0xa9, 0x98, 0x5e, 0x64, 0xe9, 0x60, 0x69, 0xcd, 0xaa, 0xa3, - 0xe8, 0x4a, 0x2f, 0x81, 0xdd, 0x0a, 0x79, 0x2d, 0x2f, 0x28, 0x74, 0x96, - 0xee, 0x3d, 0x66, 0x44, 0x92, 0x70, 0xdb, 0x02, 0xc3, 0xee, 0x8f, 0xb5, - 0x45, 0x76, 0x4d, 0xfd, 0xe0, 0xce, 0x11, 0x3f, 0x6e, 0x67, 0xe3, 0x4c, - 0xe0, 0x49, 0x2f, 0xc8, 0xd4, 0xc2, 0xf0, 0x77, 0xd4, 0x88, 0xcc, 0x22, - 0x70, 0x83, 0xaf, 0xa0, 0xd5, 0xe5, 0x73, 0xfb, 0xe2, 0xc9, 0x28, 0xf7, - 0xbb, 0xcf, 0xd1, 0x57, 0xf0, 0x8a, 0x5c, 0x1c, 0x1c, 0xf1, 0xa1, 0x3e, - 0xf5, 0x6d, 0xa7, 0x89, 0x0e, 0x4c, 0x88, 0xd7, 0x96, 0xe8, 0xfa, 0x97, - 0x80, 0x9d, 0x72, 0xdc, 0x83, 0x11, 0xee, 0xb2, 0xb3, 0x9d, 0x92, 0x6f, - 0x13, 0xdf, 0x37, 0x78, 0x8f, 0x84, 0x71, 0x40, 0x96, 0x0b, 0x25, 0xaf, - 0xbb, 0x1a, 0x9f, 0xcf, 0x7d, 0x57, 0xe1, 0xf9, 0x69, 0x96, 0x8d, 0x6a, - 0x35, 0xde, 0x52, 0x15, 0x5a, 0x42, 0xe2, 0x84, 0xe5, 0x36, 0x72, 0x0b, - 0xba, 0x99, 0x36, 0x02, 0x48, 0x79, 0xd3, 0x9a, 0x57, 0x38, 0x9b, 0x32, - 0xe3, 0xd5, 0xff, 0x88, 0x60, 0x1d, 0x5d, 0x48, 0x8d, 0xfa, 0x66, 0xaf, - 0x5a, 0xea, 0x20, 0x0d, 0x16, 0x88, 0xf5, 0x88, 0xc8, 0x49, 0x92, 0x3d, - 0x1e, 0x4a, 0xe7, 0x5b, 0x62, 0xf7, 0xdc, 0xb8, 0x62, 0x20, 0x17, 0x05, - 0x24, 0x34, 0x91, 0x66, 0x2d, 0x05, 0xf1, 0xd4, 0x79, 0xa7, 0x50, 0xb5, - 0x5b, 0xb5, 0xc9, 0x78, 0x87, 0xc5, 0x07, 0x31, 0x3e, 0xb4, 0xf3, 0xaf, - 0x6e, 0xcd, 0x65, 0xc5, 0x27, 0xcb, 0x08, 0x18, 0x0a, 0x56, 0xb1, 0xa9, - 0x0b, 0xc7, 0x25, 0x75, 0xfa, 0x92, 0x8b, 0x48, 0x23, 0xf1, 0x61, 0xb3, - 0x4c, 0xb6, 0x53, 0xd9, 0x08, 0x03, 0x2e, 0x1d, 0xc1, 0x08, 0x76, 0x89, - 0xa4, 0x01, 0x60, 0xbb, 0xcf, 0xa0, 0x07, 0xc7, 0xd0, 0x36, 0x04, 0x70, - 0xae, 0x1a, 0x57, 0x9d, 0xac, 0xe9, 0x2d, 0xdc, 0x6f, 0x16, 0x59, 0x5d, - 0x5e, 0x8e, 0x0b, 0x82, 0x80, 0x1f, 0x85, 0xe9, 0xa4, 0x85, 0xd8, 0x2d, - 0x97, 0xc1, 0x5e, 0x50, 0x22, 0x38, 0x0d, 0xf6, 0xe2, 0xf0, 0x57, 0xa5, - 0x67, 0x75, 0x6d, 0xb1, 0x6a, 0x86, 0x8b, 0xa4, 0xbf, 0x26, 0x17, 0xfb, - 0xb5, 0x91, 0x15, 0x09, 0xc3, 0xc9, 0xd7, 0xf5, 0x47, 0x97, 0xdc, 0x0d, - 0xb6, 0x15, 0x5a, 0x4c, 0x71, 0xcf, 0x54, 0x3d, 0x0e, 0x1a, 0x30, 0xd5, - 0xfe, 0xa9, 0xc0, 0xef, 0xc2, 0x89, 0x71, 0xe3, 0x39, 0x65, 0x46, 0x04, - 0xff, 0x1a, 0xff, 0xb5, 0x9e, 0xd1, 0xb1, 0x15, 0xc4, 0x11, 0xd2, 0x1b, - 0x99, 0xca, 0x05, 0xf8, 0x8d, 0x10, 0x33, 0xd4, 0x9d, 0xb0, 0x8e, 0xdd, - 0x5b, 0xa8, 0x20, 0x92, 0x41, 0xba, 0xcd, 0xd3, 0xcf, 0xc6, 0x2a, 0x7f, - 0xd7, 0x4f, 0xad, 0x9b, 0x1a, 0x25, 0xa3, 0x71, 0x94, 0xc3, 0xb8, 0xef, - 0x8d, 0xf6, 0x4f, 0x59, 0xea, 0x83, 0xc0, 0x7e, 0xf7, 0x46, 0xd3, 0x33, - 0x87, 0xdf, 0x1f, 0xb4, 0xa7, 0x6f, 0x40, 0x80, 0xf9, 0x7f, 0xda, 0x25, - 0x53, 0x31, 0xbe, 0x04, 0xd5, 0x7f, 0xa6, 0xf2, 0x70, 0xb7, 0xb1, 0xbe, - 0xe1, 0x16, 0xf2, 0xcd, 0xf2, 0x13, 0x06, 0x33, 0xd0, 0x64, 0xf3, 0xd6, - 0xc5, 0xa7, 0x24, 0x08, 0xce, 0xd5, 0x0b, 0xa9, 0x6b, 0xb4, 0x13, 0x1f, - 0x04, 0x93, 0x0c, 0xf7, 0x4d, 0xb7, 0x32, 0x7a, 0xb2, 0x18, 0x5b, 0x62, - 0x05, 0xaf, 0x46, 0x84, 0x4d, 0x70, 0x34, 0x40, 0xbb, 0xb4, 0xcb, 0xc1, - 0xcb, 0xff, 0x4e, 0x6a, 0x62, 0xe6, 0x86, 0xeb, 0x22, 0x12, 0xcb, 0x97, - 0xa5, 0x47, 0x5e, 0xdc, 0x07, 0x4b, 0x02, 0x1f, 0x9c, 0x85, 0x12, 0xb4, - 0x8b, 0xf7, 0xd5, 0x81, 0xcb, 0xaa, 0xd8, 0x1a, 0xd5, 0xe6, 0x8c, 0xdc, - 0x14, 0x27, 0x47, 0x12, 0x28, 0xa7, 0xc8, 0xf0, 0x78, 0x13, 0x40, 0xb7, - 0xe5, 0x25, 0x71, 0x0e, 0xac, 0x71, 0x4c, 0x39, 0x3e, 0x87, 0x88, 0x83, - 0xf2, 0xaf, 0x33, 0xb1, 0xab, 0x3b, 0x77, 0xe5, 0x22, 0x9d, 0x05, 0x15, - 0x81, 0x22, 0xd1, 0x77, 0x0e, 0x28, 0x5f, 0x34, 0xa3, 0x88, 0x3b, 0xc2, - 0x1f, 0x19, 0x8d, 0x6b, 0xb0, 0x3e, 0x06, 0x91, 0xd9, 0xe5, 0xbc, 0x0e, - 0x43, 0x62, 0xa1, 0x1d, 0xde, 0xee, 0x00, 0x80, 0x27, 0xeb, 0x0d, 0xa5, - 0x88, 0x3e, 0xe4, 0xbd, 0x6a, 0xfb, 0x21, 0x87, 0xc9, 0xf2, 0xcb, 0x49, - 0x87, 0x0f, 0xa5, 0xe6, 0xc2, 0xe2, 0x1f, 0xd9, 0x67, 0x19, 0x5d, 0xc1, - 0x99, 0xc8, 0x09, 0x1a, 0xba, 0xf8, 0xac, 0x7e, 0x9f, 0xc7, 0x70, 0xd0, - 0x1a, 0x71, 0x3e, 0xa0, 0xb9, 0x37, 0x76, 0xca, 0x19, 0xed, 0x9a, 0x49, - 0xe5, 0xd9, 0x1e, 0xc2, 0xcb, 0x17, 0xfd, 0x25, 0x68, 0x39, 0x6e, 0x71, - 0xcc, 0x3a, 0x35, 0xe4, 0xdc, 0x0a, 0x73, 0x47, 0xad, 0xee, 0x60, 0x7c, - 0x0e, 0xe0, 0xd6, 0xb9, 0x7e, 0x11, 0x60, 0x60, 0xa5, 0xdb, 0x58, 0xf5, - 0x97, 0x7b, 0xf8, 0xfe, 0xe2, 0xe6, 0x2f, 0x2b, 0x3b, 0xbf, 0xd7, 0x60, - 0xe0, 0x1b, 0x3c, 0x11, 0xff, 0x66, 0x4a, 0x76, 0x36, 0x31, 0xdb, 0x5b, - 0xdb, 0x37, 0x4d, 0xf6, 0x26, 0x20, 0xf9, 0x5c, 0xf8, 0x77, 0x78, 0x09, - 0x62, 0x12, 0x92, 0x42, 0x84, 0xea, 0x4c, 0xed, 0x60, 0x27, 0xfb, 0x59, - 0x46, 0x39, 0xee, 0x13, 0xb1, 0x83, 0xc0, 0x1a, 0xe0, 0xc9, 0x3e, 0xcd, - 0x17, 0x32, 0xa4, 0x1c, 0x0a, 0x68, 0x4e, 0x6d, 0x13, 0x72, 0x8a, 0xff, - 0xc8, 0xb1, 0xe5, 0x0a, 0xc6, 0x20, 0x07, 0xa0, 0xb1, 0x22, 0x1f, 0x24, - 0x22, 0x01, 0x9f, 0x44, 0x8a, 0x0d, 0x52, 0x84, 0xad, 0x7f, 0x26, 0x57, - 0xb2, 0xd8, 0xb9, 0x5c, 0x16, 0x92, 0x00, 0x40, 0x18, 0xa1, 0x4c, 0xaa, - 0x2b, 0xca, 0xcc, 0x94, 0x64, 0x57, 0x9c, 0xc8, 0x43, 0x80, 0x41, 0xfb, - 0x31, 0xd0, 0x2a, 0xd2, 0xe8, 0x28, 0x05, 0x53, 0xfe, 0x97, 0x6e, 0x95, - 0x04, 0xa8, 0xf1, 0xa6, 0x24, 0x3d, 0x92, 0xa0, 0xd7, 0x3a, 0x03, 0x63, - 0x42, 0xa0, 0x28, 0x5f, 0xc3, 0xd5, 0x1e, 0x27, 0x51, 0xc0, 0xd6, 0x49, - 0x9c, 0x45, 0xf0, 0x5c, 0xc1, 0x34, 0xd2, 0x35, 0x70, 0x6e, 0xbc, 0x93, - 0x3d, 0x25, 0x21, 0x55, 0xb4, 0x03, 0x99, 0xbd, 0xa4, 0x39, 0x6a, 0xea, - 0x14, 0x5f, 0x24, 0x9c, 0x2d, 0x25, 0x63, 0xe5, 0x33, 0x42, 0x47, 0xc5, - 0xe5, 0x30, 0xb0, 0xf2, 0x8d, 0x70, 0xbe, 0xaa, 0x39, 0x34, 0x41, 0x36, - 0x26, 0x0b, 0xb8, 0x16, 0xaf, 0x89, 0x1a, 0x00, 0x06, 0x98, 0xfe, 0xff, - 0xfa, 0x31, 0xf8, 0x25, 0x69, 0xf1, 0x9f, 0x00, 0x06, 0x12, 0x45, 0x9b, - 0xbc, 0x35, 0x93, 0x07, 0x68, 0xab, 0xc1, 0x5c, 0xf4, 0xa9, 0xf2, 0x22, - 0x28, 0x38, 0x7c, 0x41, 0xea, 0x7e, 0xab, 0xe3, 0xf8, 0xb1, 0x6e, 0xce, - 0xf8, 0xc3, 0x6a, 0x4c, 0xf8, 0xbc, 0x19, 0x27, 0x6c, 0xdf, 0x3e, 0xfe, - 0xa6, 0x7f, 0x1e, 0x00, 0xfe, 0x3c, 0x29, 0x87, 0xa4, 0x60, 0xf9, 0x29, - 0x9a, 0x3e, 0xf2, 0x9f, 0xcb, 0x55, 0xf7, 0x0d, 0xb2, 0x6a, 0x33, 0x83, - 0xb0, 0x17, 0x6d, 0x9f, 0x7e, 0x43, 0x90, 0x63, 0x47, 0x86, 0x75, 0x2a, - 0xf4, 0x25, 0x37, 0x84, 0xda, 0x81, 0xdf, 0x78, 0x99, 0x57, 0x35, 0x71, - 0x0b, 0x44, 0xee, 0x2e, 0xc3, 0xcd, 0x94, 0x0b, 0x2c, 0x63, 0xec, 0x13, - 0x4d, 0x4a, 0xd1, 0xbb, 0x12, 0x50, 0x79, 0x1a, 0x2d, 0x03, 0x01, 0x22, - 0x54, 0xed, 0xb0, 0x69, 0xd1, 0x56, 0x3a, 0x11, 0x76, 0x4b, 0x08, 0x15, - 0xf4, 0xee, 0x3d, 0x27, 0x30, 0xa2, 0x36, 0xc3, 0x30, 0x43, 0xfc, 0x1f, - 0x10, 0xd8, 0x72, 0xd1, 0x28, 0xd7, 0x1e, 0xcd, 0xa9, 0x2f, 0x0d, 0x11, - 0x10, 0xd4, 0xdc, 0x48, 0xa6, 0xf8, 0xad, 0x56, 0xd1, 0x89, 0x06, 0xbd, - 0x4c, 0x99, 0x07, 0x3f, 0x49, 0xf0, 0xb5, 0xea, 0x9e, 0xa7, 0x18, 0xed, - 0xdf, 0x81, 0x9c, 0x54, 0xb0, 0xa0, 0x7f, 0x55, 0x1b, 0x1f, 0x65, 0x42, - 0x1e, 0x2a, 0xc1, 0xa3, 0x33, 0x76, 0x4a, 0x22, 0xdb, 0x35, 0xec, 0xb5, - 0xb4, 0x84, 0x3d, 0x8f, 0x68, 0x18, 0x97, 0x15, 0xfc, 0x42, 0xd0, 0xef, - 0xe2, 0xcc, 0x13, 0x69, 0xca, 0x30, 0x40, 0xe5, 0x35, 0xb6, 0x65, 0x48, - 0x8f, 0x88, 0x38, 0x54, 0x1e, 0xe4, 0x00, 0x9c, 0xc1, 0xe4, 0x14, 0x06, - 0xe8, 0x97, 0x17, 0x9d, 0x57, 0x94, 0xd6, 0xea, 0x4e, 0x62, 0x72, 0x02, - 0x95, 0xf5, 0x5a, 0x4a, 0xaf, 0x46, 0xfa, 0xa7, 0xdc, 0x5c, 0xcd, 0x70, - 0x9e, 0xed, 0xfa, 0x31, 0xa3, 0xb5, 0xdb, 0x0a, 0x71, 0x85, 0xf9, 0xe9, - 0xe8, 0xc6, 0xa6, 0xa6, 0x22, 0xbc, 0x42, 0x0a, 0x13, 0x14, 0xc8, 0x3a, - 0x14, 0xf3, 0x9d, 0xd4, 0xa7, 0x90, 0x74, 0x5e, 0x81, 0x3c, 0xdf, 0xdb, - 0x34, 0xed, 0x5e, 0x3b, 0x4c, 0x48, 0x7d, 0xce, 0xf5, 0x35, 0x4a, 0x32, - 0xcf, 0x13, 0x84, 0x08, 0xb5, 0xc1, 0x0f, 0xcb, 0x00, 0xf0, 0x1a, 0xfd, - 0xb9, 0xa1, 0x0f, 0x1c, 0xea, 0xc7, 0x6c, 0xbf, 0x02, 0xc7, 0x4b, 0x77, - 0x37, 0xc4, 0x6c, 0x82, 0xf0, 0x86, 0x3e, 0xf0, 0x2a, 0x59, 0x15, 0x41, - 0x62, 0x02, 0xc1, 0xb1, 0x7a, 0xfb, 0xff, 0x61, 0x77, 0xfe, 0xe5, 0x5d, - 0xeb, 0xc8, 0x28, 0x0e, 0x8f, 0x99, 0x61, 0xdf, 0xcd, 0x20, 0x1b, 0x51, - 0x66, 0x13, 0xa5, 0xca, 0x27, 0x21, 0xbd, 0x0a, 0xd7, 0x6b, 0xfa, 0x47, - 0xec, 0x32, 0xdb, 0x8b, 0xe9, 0x92, 0x2e, 0xa0, 0x16, 0x21, 0xf7, 0x0f, - 0x0a, 0x04, 0x2e, 0xfd, 0xfa, 0xf8, 0x64, 0xd4, 0x41, 0x1e, 0x0e, 0xae, - 0xec, 0x82, 0xa2, 0xb5, 0xd3, 0xe2, 0x15, 0xce, 0x17, 0x84, 0x29, 0xc8, - 0xcf, 0xa1, 0x70, 0xa8, 0xec, 0x4d, 0x86, 0xbd, 0xa2, 0xe3, 0x6e, 0xf9, - 0xd8, 0x19, 0x4a, 0x36, 0xd3, 0x0b, 0x89, 0x74, 0xe6, 0x9b, 0x74, 0xbb, - 0x9f, 0xbd, 0x4a, 0xc6, 0x2b, 0x22, 0xf3, 0xea, 0xe0, 0xf8, 0x5f, 0xed, - 0x22, 0xd6, 0xbd, 0x17, 0x28, 0x25, 0x56, 0x43, 0x49, 0x0f, 0xea, 0x32, - 0x09, 0xdd, 0x9a, 0x18, 0x47, 0x7e, 0x67, 0xf3, 0xf7, 0x93, 0xda, 0x81, - 0x65, 0xc3, 0x2e, 0xcc, 0x55, 0x70, 0x6e, 0xbf, 0xca, 0xb7, 0x53, 0x42, - 0xce, 0x6f, 0xfb, 0x63, 0x9a, 0x6e, 0x4b, 0xb4, 0x2e, 0x75, 0x14, 0xbe, - 0x30, 0x83, 0x66, 0xbf, 0xa2, 0x49, 0x1c, 0x33, 0xfa, 0x88, 0x0f, 0x88, - 0x0f, 0x3b, 0x68, 0x6f, 0x3c, 0xd1, 0xee, 0x3b, 0xbb, 0x1d, 0x52, 0x75, - 0x61, 0xbc, 0x09, 0x08, 0x07, 0xcd, 0x03, 0xef, 0x35, 0xf8, 0x67, 0xa4, - 0xcd, 0x4b, 0xbb, 0x83, 0x33, 0x48, 0xa6, 0xd5, 0x7c, 0xc6, 0xf7, 0xbd, - 0x11, 0x18, 0xdf, 0xe2, 0xf9, 0x9e, 0x4c, 0xd6, 0x47, 0x0b, 0xac, 0x01, - 0x98, 0xe8, 0xd2, 0xfb, 0xc2, 0xd1, 0xf0, 0x72, 0xfb, 0x3d, 0xc7, 0x38, - 0x2a, 0x8a, 0x3c, 0x1e, 0x3e, 0x5c, 0x5d, 0x8c, 0x16, 0xa5, 0x8e, 0xae, - 0x27, 0xf5, 0xa7, 0x7a, 0xc2, 0x0f, 0x2e, 0xaf, 0x8e, 0xc5, 0x93, 0x13, - 0x2d, 0x0b, 0x63, 0xd1, 0xff, 0x3b, 0x11, 0xa4, 0xfc, 0xb3, 0x4e, 0x46, - 0x73, 0x28, 0x67, 0x81, 0x37, 0x90, 0xa9, 0x39, 0xdc, 0xfe, 0x36, 0x84, - 0x8a, 0x9e, 0x4c, 0x43, 0x06, 0xa4, 0xae, 0xbd, 0xe7, 0x84, 0x90, 0x53, - 0x35, 0xb3, 0x4d, 0xc1, 0x39, 0x61, 0xb6, 0x47, 0xf8, 0x86, 0x84, 0xa9, - 0x7f, 0x5b, 0xd4, 0xf4, 0xab, 0x9c, 0x9b, 0x00, 0xe3, 0x5e, 0x68, 0x71, - 0x24, 0x21, 0x20, 0x4f, 0x0f, 0x0c, 0xe9, 0x05, 0xf2, 0x64, 0x91, 0x68, - 0x17, 0x0e, 0xee, 0xb7, 0x91, 0x8a, 0xab, 0x98, 0x77, 0xe7, 0xe6, 0xbb, - 0xc9, 0x4d, 0x54, 0x6f, 0x1a, 0xbc, 0xa4, 0xaf, 0x70, 0xfa, 0x10, 0xa2, - 0x28, 0x0e, 0xb1, 0x9c, 0x29, 0xc5, 0x06, 0xc1, 0x6f, 0x2a, 0x33, 0xd7, - 0x22, 0x58, 0x36, 0x38, 0x41, 0xa0, 0x3f, 0x67, 0x80, 0x36, 0x1f, 0x80, - 0xa1, 0xf8, 0xf2, 0xb7, 0x2a, 0x15, 0x50, 0xc5, 0x9d, 0x9d, 0xb1, 0xe1, - 0x65, 0xb9, 0x9d, 0x9e, 0x47, 0x68, 0xb5, 0x9c, 0x62, 0xcc, 0xab, 0x20, - 0x14, 0x70, 0x03, 0x50, 0x19, 0x9e, 0x43, 0x6d, 0xc0, 0x15, 0x93, 0x77, - 0x16, 0xf9, 0x8f, 0xdc, 0x58, 0x20, 0x08, 0x7e, 0x09, 0x67, 0xae, 0x71, - 0x82, 0x5a, 0xcf, 0xc0, 0xa3, 0xcf, 0x18, 0x49, 0x42, 0xd2, 0x66, 0x18, - 0xc2, 0xd2, 0x8e, 0x45, 0x96, 0xdc, 0x62, 0xf4, 0x74, 0x05, 0x93, 0x74, - 0x1d, 0x7a, 0xad, 0xdd, 0x32, 0x12, 0xcc, 0x87, 0xba, 0x63, 0xa8, 0xbf, - 0xf0, 0x33, 0x44, 0x61, 0xd1, 0x74, 0x13, 0xeb, 0x12, 0x67, 0x46, 0xd9, - 0x92, 0x0b, 0xd0, 0x19, 0xc1, 0xc1, 0x97, 0x42, 0x93, 0x20, 0xc2, 0xd6, - 0xf8, 0x5e, 0x91, 0x6f, 0x61, 0x68, 0xb9, 0x13, 0x8a, 0x63, 0x09, 0x12, - 0x5b, 0x08, 0xb2, 0xd7, 0x29, 0xa2, 0x1c, 0xfc, 0x83, 0x2a, 0x80, 0xa6, - 0x3c, 0xfd, 0x9a, 0x9a, 0xd8, 0x7b, 0xf2, 0x12, 0x17, 0xe0, 0x09, 0xf4, - 0xa5, 0x4a, 0xcd, 0x2c, 0xc3, 0x7a, 0xd8, 0xc0, 0x75, 0x76, 0xa0, 0xa5, - 0xab, 0x63, 0x64, 0x55, 0x5a, 0xce, 0x08, 0x03, 0x3e, 0x3f, 0x89, 0x82, - 0xc9, 0xe8, 0xd8, 0xf7, 0xaf, 0x63, 0x64, 0x55, 0x5e, 0xce, 0x08, 0x03, - 0x36, 0x3f, 0x89, 0x82, 0xc1, 0xe8, 0xd8, 0xf7, 0xf0, 0x45, 0x9a, 0x64, - 0x5e, 0xbe, 0xaf, 0x9b, 0xa6, 0xf9, 0x0e, 0x76, 0xb5, 0xe7, 0x2f, 0x04, - 0x01, 0x24, 0x51, 0x39, 0x45, 0xfa, 0x0f, 0x6b, 0x00, 0xb1, 0x4a, 0x6b, - 0xab, 0xd0, 0x5c, 0x34, 0x34, 0x26, 0x93, 0x97, 0x88, 0x0a, 0x6a, 0x5d, - 0x8f, 0xe0, 0xae, 0xd7, 0x11, 0x22, 0xfb, 0xb2, 0x81, 0x5d, 0x6b, 0xee, - 0x82, 0xe0, 0xe0, 0x2c, 0x21, 0xca, 0xaa, 0x7d, 0x30, 0x1e, 0x12, 0x11, - 0xa3, 0x36, 0xa9, 0x07, 0xf3, 0x21, 0x18, 0x36, 0x23, 0x8a, 0xd1, 0x9a, - 0x87, 0x53, 0xf4, 0x78, 0x4b, 0xa9, 0x8b, 0x4f, 0xec, 0x5c, 0x20, 0xc7, - 0x7b, 0x00, 0xe7, 0xd9, 0x1a, 0xb8, 0xff, 0xba, 0x7c, 0x38, 0xc7, 0x12, - 0x7f, 0xd9, 0xc2, 0x87, 0xc6, 0xd3, 0x6c, 0x60, 0xbc, 0x48, 0xc7, 0xf7, - 0xec, 0x8f, 0xc5, 0x98, 0x04, 0xf9, 0x95, 0x5e, 0xc2, 0xf5, 0x85, 0x31, - 0x4d, 0xc8, 0x8b, 0x98, 0xa3, 0x0f, 0xb7, 0x23, 0x61, 0xac, 0xfb, 0x53, - 0x02, 0xb6, 0xe7, 0xe8, 0xac, 0x6d, 0xdd, 0x4d, 0x8d, 0x25, 0x69, 0x3f, - 0x5f, 0xa9, 0xd9, 0xf8, 0xb2, 0xe1, 0x3e, 0xe4, 0xd5, 0x55, 0x67, 0x79, - 0x09, 0x1c, 0xf9, 0xec, 0xde, 0xb8, 0xa3, 0x3c, 0xbc, 0xcf, 0xd4, 0x76, - 0x4b, 0xf8, 0x47, 0x0c, 0x24, 0x3e, 0x43, 0x0d, 0xc7, 0x8a, 0x85, 0xb5, - 0x41, 0x25, 0xf1, 0xd5, 0x6e, 0x4e, 0xa3, 0x04, 0x40, 0x36, 0x67, 0xea, - 0x0c, 0xf7, 0x33, 0x54, 0xe0, 0xbb, 0xdb, 0xfd, 0xa1, 0x8b, 0x99, 0x09, - 0xac, 0x39, 0xbe, 0x2a, 0x2e, 0x3d, 0x74, 0xa3, 0x7c, 0x71, 0xd5, 0x6b, - 0xe9, 0x6c, 0x91, 0x72, 0x46, 0x9f, 0xba, 0x62, 0xc2, 0x5c, 0x64, 0x65, - 0xc4, 0xa9, 0xe2, 0x4b, 0xcd, 0x34, 0xa8, 0x01, 0xd0, 0x61, 0x3f, 0x59, - 0xb5, 0x70, 0xb8, 0xd0, 0x92, 0x90, 0xdf, 0x0c, 0x01, 0x23, 0x18, 0x0d, - 0x2b, 0x23, 0x64, 0x63, 0x0a, 0x45, 0xad, 0x5e, 0xa0, 0x1e, 0x4d, 0x3f, - 0x9e, 0x18, 0x26, 0xbf, 0x2f, 0xc7, 0x6d, 0x35, 0xd4, 0x38, 0xa1, 0x55, - 0xb6, 0x32, 0x53, 0x2c, 0x8f, 0x62, 0x6b, 0xc6, 0xd4, 0xb8, 0xf6, 0xc5, - 0x21, 0x17, 0xd7, 0xfa, 0x78, 0x8d, 0xf0, 0x48, 0x34, 0x81, 0x0d, 0xc5, - 0xdf, 0x88, 0x5e, 0x8f, 0x50, 0x3d, 0xd9, 0xe6, 0x87, 0x08, 0x85, 0xd3, - 0xbe, 0xa3, 0x80, 0xb6, 0x04, 0x24, 0x9b, 0xeb, 0x30, 0xce, 0xd1, 0x15, - 0x04, 0xd8, 0x60, 0x12, 0xfd, 0xb3, 0x3b, 0xa6, 0x6c, 0x66, 0xa0, 0xc8, - 0x41, 0xb7, 0x8b, 0x91, 0x4d, 0x9f, 0xec, 0x6e, 0xd6, 0x3c, 0x7b, 0xcd, - 0xa0, 0x4d, 0xad, 0xc6, 0xc1, 0x5e, 0x88, 0x1b, 0x07, 0xa2, 0xca, 0x35, - 0xa2, 0xcc, 0xbb, 0x93, 0x2c, 0x6f, 0x1d, 0x31, 0xa4, 0x76, 0x55, 0x4d, - 0x11, 0x13, 0x63, 0x84, 0xae, 0x21, 0xb4, 0xe2, 0xac, 0xfe, 0xd7, 0x3f, - 0x09, 0xf4, 0x35, 0x1d, 0x1a, 0xe0, 0x46, 0x24, 0xdf, 0x70, 0x91, 0x53, - 0x17, 0xb2, 0x92, 0xdb, 0x8b, 0x93, 0xfb, 0x5b, 0x60, 0x63, 0xc0, 0x5e, - 0x53, 0xb9, 0x31, 0xa1, 0xb8, 0xc3, 0xeb, 0x11, 0xbe, 0x90, 0x70, 0x93, - 0x99, 0x36, 0x80, 0x20, 0xfb, 0xdb, 0x4e, 0xb7, 0xc8, 0x1a, 0xe8, 0x45, - 0x54, 0x67, 0x3f, 0x1f, 0x01, 0x20, 0xcb, 0x49, 0x79, 0x99, 0xff, 0x64, - 0xf5, 0xdf, 0xb8, 0xfd, 0x3e, 0xd6, 0xa8, 0x73, 0x74, 0x55, 0xca, 0xde, - 0x36, 0x67, 0x07, 0xec, 0x08, 0x98, 0x35, 0xde, 0xcc, 0xc6, 0x21, 0xa9, - 0xdb, 0x5a, 0xa4, 0xe9, 0xb8, 0x00, 0x41, 0x70, 0x41, 0x61, 0xc6, 0x77, - 0xc1, 0x97, 0xd2, 0x50, 0x2c, 0x9a, 0x88, 0x02, 0x6e, 0x86, 0xa8, 0x84, - 0x2f, 0x19, 0x7d, 0x1e, 0x23, 0xd1, 0x79, 0x49, 0x6a, 0xae, 0x77, 0x7a, - 0xc2, 0xe2, 0x1c, 0xd5, 0x07, 0xb2, 0xce, 0xe1, 0x11, 0x35, 0x40, 0x25, - 0x81, 0x19, 0xd2, 0x29, 0x16, 0xf1, 0x6d, 0x85, 0x9a, 0x83, 0x26, 0x68, - 0x18, 0xf8, 0xd9, 0x73, 0xb9, 0xa1, 0x13, 0xcf, 0xc9, 0x2a, 0xf7, 0x51, - 0x7b, 0x31, 0xcc, 0xc4, 0x96, 0x06, 0xe9, 0x51, 0x37, 0x1b, 0x92, 0xbe, - 0x90, 0xef, 0x1d, 0xb4, 0xb4, 0xe8, 0x0a, 0x92, 0xc2, 0x4b, 0x3d, 0x1f, - 0xec, 0x12, 0xc1, 0x2f, 0x45, 0xbc, 0x43, 0x75, 0x6d, 0x4f, 0x41, 0xbe, - 0x71, 0x23, 0x08, 0x76, 0x18, 0x9a, 0x02, 0xe6, 0xd5, 0x99, 0xfa, 0x8e, - 0x1f, 0xbc, 0x8f, 0x6e, 0xee, 0xd5, 0x4c, 0x48, 0x04, 0xc6, 0x82, 0x2b, - 0x2a, 0xf7, 0x9e, 0xff, 0x2c, 0xba, 0x5c, 0x32, 0x81, 0xe2, 0x8e, 0x65, - 0x46, 0xdb, 0xf7, 0xe0, 0xe3, 0xc2, 0xfd, 0x36, 0xe1, 0xd7, 0x32, 0x40, - 0x4b, 0x19, 0x25, 0x1b, 0x64, 0x9a, 0x73, 0x80, 0x9a, 0xa7, 0x18, 0x25, - 0x17, 0xbd, 0x18, 0x4d, 0xe8, 0xa6, 0xe1, 0x47, 0x5c, 0xd1, 0xe6, 0xe0, - 0xe3, 0xc2, 0xfd, 0x36, 0x4f, 0xf2, 0x3d, 0xec, 0x6d, 0x81, 0xf6, 0xc7, - 0x96, 0xa2, 0x6e, 0xe2, 0x7f, 0x63, 0xb3, 0x5f, 0xdd, 0x2f, 0x4f, 0x34, - 0xe6, 0x44, 0x2e, 0x92, 0xb7, 0x9b, 0x4f, 0xcd, 0x1b, 0x06, 0x25, 0xf6, - 0xfa, 0xae, 0x47, 0x60, 0xd5, 0xda, 0xea, 0xfa, 0x66, 0xcf, 0x90, 0x2e, - 0x10, 0xc0, 0x89, 0xa9, 0x24, 0xc3, 0x34, 0x7d, 0x57, 0xeb, 0x48, 0x7f, - 0x65, 0xcc, 0x04, 0x8c, 0xc7, 0xfe, 0x5d, 0x09, 0x8f, 0x82, 0x13, 0x81, - 0x7f, 0x99, 0xb9, 0x25, 0x25, 0x58, 0x19, 0x39, 0x76, 0xe3, 0xe2, 0x64, - 0xbd, 0xfe, 0xdb, 0x7a, 0x0e, 0x70, 0x65, 0x97, 0x53, 0xa5, 0xd2, 0x2c, - 0x0a, 0x3a, 0xaf, 0x7d, 0x15, 0xf4, 0x06, 0x3e, 0x8a, 0xad, 0x63, 0x80, - 0xfe, 0xd5, 0xcb, 0x0f, 0x10, 0x6b, 0xd8, 0xbc, 0x08, 0x65, 0xeb, 0xf6, - 0x2f, 0x00, 0x32, 0xb5, 0x24, 0xb5, 0x31, 0x54, 0x65, 0x17, 0xcd, 0x6a, - 0x09, 0x52, 0x37, 0x9a, 0x4a, 0xf4, 0x2e, 0xcc, 0xca, 0xb1, 0xd1, 0x6f, - 0x79, 0xe8, 0x30, 0x45, 0xe0, 0xbe, 0xaf, 0xbf, 0xe4, 0xdd, 0xb4, 0x22, - 0x32, 0x81, 0x6c, 0xae, 0x3e, 0xde, 0x5f, 0x6e, 0x5e, 0x99, 0xe1, 0x6e, - 0x3e, 0x85, 0x90, 0x03, 0xfc, 0xa4, 0xaa, 0x07, 0x4a, 0x5b, 0xb8, 0x6c, - 0xea, 0xae, 0x9b, 0x8f, 0x8d, 0x14, 0x30, 0x44, 0x2a, 0x9a, 0xc8, 0x83, - 0xa3, 0xc3, 0x42, 0x17, 0xce, 0x26, 0x6f, 0xd2, 0xb4, 0xa1, 0xe4, 0xc3, - 0xf6, 0xad, 0xce, 0xac, 0x3b, 0x49, 0xcf, 0x76, 0x52, 0x98, 0xf9, 0xca, - 0x82, 0x74, 0x30, 0x70, 0x8b, 0x3c, 0xaf, 0xc1, 0x53, 0x2a, 0x14, 0x18, - 0xb9, 0xc1, 0x4c, 0xb2, 0x6c, 0x2e, 0x2f, 0x4f, 0xb4, 0xea, 0x63, 0xd1, - 0x49, 0xec, 0xc3, 0x41, 0x20, 0x01, 0xf8, 0x9a, 0xd0, 0xa3, 0xab, 0x09, - 0x42, 0x92, 0x1d, 0xc0, 0x86, 0x5c, 0x6f, 0xbd, 0xcc, 0xb1, 0xdd, 0xc8, - 0x58, 0x72, 0x09, 0x23, 0x0f, 0xf4, 0x62, 0xf9, 0xae, 0x8f, 0x94, 0xc9, - 0x1b, 0xf3, 0x76, 0x67, 0xfd, 0x20, 0xa6, 0x15, 0xf8, 0xba, 0x3f, 0x03, - 0x1c, 0x61, 0xe0, 0x52, 0x60, 0x89, 0x9e, 0xb4, 0x47, 0x5d, 0xf2, 0x0f, - 0x96, 0x5e, 0x7b, 0x8f, 0xfb, 0xb5, 0xb2, 0xd5, 0x69, 0x8a, 0x36, 0x70, - 0xd9, 0x8c, 0x9f, 0x18, 0x5b, 0xdf, 0xc5, 0x24, 0xe3, 0xe0, 0xea, 0xf8, - 0x4e, 0xa5, 0x2f, 0x48, 0x99, 0x00, 0xac, 0x15, 0xf8, 0xba, 0x3f, 0x03, - 0x1c, 0x61, 0xe0, 0x52, 0xe3, 0xea, 0xeb, 0xd0, 0x1f, 0x3e, 0xb8, 0xa9, - 0xe9, 0xa7, 0xfe, 0x91, 0xdf, 0x19, 0xd4, 0xac, 0x18, 0x95, 0xde, 0xc2, - 0x6d, 0x6e, 0x20, 0x22, 0xc5, 0x2f, 0xe0, 0xfb, 0x25, 0x3d, 0xc6, 0x33, - 0x31, 0x8e, 0x61, 0x0c, 0xb2, 0x23, 0x7b, 0x31, 0xec, 0x78, 0xa4, 0x75, - 0xab, 0xa6, 0xfe, 0x16, 0x04, 0xbe, 0x10, 0x27, 0x01, 0xd5, 0xf2, 0x98, - 0x1d, 0xd0, 0xe3, 0x84, 0xcf, 0xdf, 0x40, 0x7c, 0xbe, 0xd6, 0x59, 0x62, - 0xb7, 0x82, 0xd5, 0x64, 0xa3, 0x13, 0x2d, 0xae, 0x20, 0xac, 0x9f, 0xf8, - 0xd5, 0x1c, 0xec, 0x95, 0x15, 0xae, 0x95, 0xc9, 0x27, 0x11, 0x1b, 0x55, - 0x50, 0xaf, 0x5d, 0x46, 0xd8, 0xfa, 0x24, 0x86, 0xd9, 0xce, 0x77, 0x4d, - 0x96, 0x1e, 0xba, 0xe8, 0x88, 0x8a, 0x78, 0x97, 0x2a, 0x84, 0x6e, 0x41, - 0xcd, 0x40, 0x3f, 0x1b, 0xe6, 0x78, 0xa4, 0x75, 0xab, 0xa6, 0xfe, 0x16, - 0x49, 0xc6, 0x8c, 0xd5, 0xaf, 0x03, 0x98, 0xe8, 0xfd, 0xfc, 0x5f, 0x94, - 0x18, 0xeb, 0x37, 0x19, 0x1b, 0xbf, 0x0c, 0xfd, 0x82, 0xc5, 0xe7, 0xaf, - 0xba, 0x11, 0x37, 0xb4, 0xa9, 0x36, 0xdb, 0xf4, 0xff, 0x11, 0xf4, 0xc7, - 0x92, 0x48, 0x2a, 0x51, 0xbc, 0x73, 0xf7, 0xd2, 0x9d, 0xbd, 0xe3, 0xff, - 0x71, 0xaf, 0xfd, 0x6e, 0xb2, 0x8f, 0xaf, 0xd0, 0x3c, 0xe6, 0x36, 0x46, - 0x48, 0x60, 0xf8, 0x72, 0x84, 0xca, 0x8d, 0x85, 0xa5, 0xda, 0x15, 0x2c, - 0x7b, 0x21, 0x79, 0x3b, 0x95, 0x16, 0xbe, 0xe4, 0xde, 0x75, 0xa1, 0x00, - 0x5e, 0x19, 0x72, 0x65, 0x3d, 0x56, 0x27, 0x2e, 0xb4, 0xc0, 0x2e, 0xe4, - 0xc7, 0x04, 0xbc, 0xde, 0xff, 0x64, 0x38, 0xb9, 0x88, 0xd9, 0xbc, 0x15, - 0x7b, 0xb8, 0xca, 0xc1, 0xca, 0x7d, 0x2f, 0x0d, 0x3f, 0xc9, 0xce, 0xee, - 0x03, 0xc7, 0xa5, 0xa0, 0xdf, 0x4d, 0xd0, 0xd8, 0xf5, 0x7e, 0x56, 0x5f, - 0x36, 0x09, 0x8f, 0xa4, 0x73, 0x3f, 0x23, 0x4f, 0x1b, 0xff, 0xad, 0x1a, - 0xb5, 0x0e, 0xbc, 0xde, 0xfa, 0x72, 0x38, 0xb9, 0x88, 0xd9, 0xbc, 0x15, - 0x7b, 0xb8, 0xca, 0xc1, 0xca, 0x7d, 0x2f, 0x0d, 0x3f, 0xc9, 0xce, 0xee, - 0x03, 0xc7, 0xa5, 0xa0, 0xdf, 0x4d, 0xd0, 0xd8, 0x07, 0x7f, 0x76, 0x67, - 0x25, 0x06, 0x97, 0xb9, 0x08, 0xcf, 0x36, 0x84, 0x60, 0x19, 0x95, 0xbd, - 0xbe, 0x48, 0x78, 0xfd, 0x73, 0xb1, 0xc1, 0xe0, 0xa4, 0x16, 0xf0, 0x0c, - 0x7f, 0x8f, 0xee, 0x31, 0x04, 0x13, 0xbb, 0xcb, 0xf4, 0xe7, 0xc1, 0x4a, - 0x2b, 0x58, 0x22, 0xce, 0xb2, 0x32, 0xad, 0xbb, 0x40, 0xde, 0x01, 0xa3, - 0xba, 0x8e, 0xa2, 0x9c, 0xa9, 0xe9, 0x11, 0x94, 0x17, 0xad, 0x03, 0x73, - 0x39, 0xba, 0x5f, 0x42, 0xc5, 0xa2, 0xbb, 0x81, 0xd7, 0x61, 0xba, 0xe2, - 0xa7, 0xe1, 0x33, 0x10, 0xf8, 0x30, 0x59, 0x23, 0x1b, 0xa4, 0xb1, 0xb2, - 0xf0, 0x6d, 0x97, 0x83, 0xc6, 0x42, 0x20, 0xc7, 0xbc, 0x00, 0xde, 0xc7, - 0x93, 0xb0, 0x4a, 0x93, 0x88, 0xc2, 0xd5, 0x30, 0xfa, 0x65, 0xf9, 0xfc, - 0x2c, 0x4b, 0x38, 0x1e, 0xdc, 0xba, 0xc1, 0x56, 0x81, 0x28, 0xb1, 0x10, - 0x5e, 0x8f, 0xe4, 0x69, 0x94, 0x46, 0xf4, 0xaa, 0xe5, 0xfc, 0x12, 0x85, - 0x8f, 0x81, 0x0c, 0x1e, 0x87, 0xb8, 0x92, 0x9d, 0x2d, 0xc6, 0x68, 0xbe, - 0x36, 0xcb, 0x7f, 0xa1, 0x78, 0x69, 0x6e, 0xa2, 0x01, 0x87, 0xe2, 0x5c, - 0xd7, 0x7f, 0x30, 0xeb, 0x03, 0xdb, 0x29, 0x5b, 0x2f, 0x60, 0xa8, 0x94, - 0xdf, 0x42, 0x20, 0xcb, 0x74, 0x3f, 0x3c, 0x84, 0xb6, 0xd9, 0x23, 0xf1, - 0x55, 0x3c, 0x29, 0x45, 0x3e, 0x4c, 0x8b, 0x76, 0x2d, 0x62, 0xef, 0xc7, - 0xe3, 0xdd, 0x9c, 0xe7, 0xb9, 0x01, 0x04, 0xc9, 0xc3, 0xab, 0xad, 0xa1, - 0xd1, 0xbf, 0xd7, 0xfa, 0xdf, 0x00, 0x52, 0x90, 0x88, 0xb9, 0xf5, 0xae, - 0x17, 0xd2, 0x03, 0xd3, 0xe6, 0x18, 0x97, 0x64, 0x2d, 0xa1, 0x3c, 0x16, - 0xd9, 0x50, 0xee, 0xc5, 0xa0, 0x77, 0x8b, 0x97, 0x42, 0x19, 0x46, 0xb1, - 0x27, 0x75, 0x7e, 0x3f, 0xd6, 0x39, 0xe3, 0x07, 0x6b, 0xee, 0x8f, 0x2f, - 0x80, 0x4c, 0xde, 0x61, 0xb4, 0x2f, 0xe2, 0x96, 0xad, 0x4b, 0xdf, 0x90, - 0x33, 0x9f, 0xa4, 0x96, 0xa7, 0xa6, 0x3c, 0x6a, 0xcf, 0x1c, 0x9e, 0x0c, - 0xda, 0x4a, 0x40, 0x12, 0xdf, 0x58, 0x6a, 0x39, 0xf4, 0x44, 0xe1, 0xc1, - 0x42, 0x4b, 0xe2, 0x3e, 0xab, 0xd9, 0xc3, 0x1d, 0x39, 0x59, 0xf6, 0x5f, - 0x91, 0xbc, 0x57, 0x80, 0x33, 0x3d, 0x0a, 0x7e, 0xb8, 0xf6, 0xad, 0x1b, - 0x36, 0x4a, 0xb5, 0xd1, 0x1d, 0x4e, 0x74, 0x82, 0x7a, 0xe1, 0xa8, 0x41, - 0x47, 0xa2, 0x84, 0x05, 0xa5, 0x4c, 0x01, 0x09, 0xf8, 0xf6, 0x96, 0xe8, - 0xa8, 0x1d, 0x09, 0x6f, 0x28, 0x5e, 0x32, 0xd6, 0xbd, 0xf9, 0x72, 0x60, - 0x6f, 0xe1, 0x09, 0xbd, 0x30, 0x40, 0x5b, 0xbe, 0x3f, 0x7c, 0x19, 0x37, - 0x81, 0xf9, 0x65, 0xbb, 0xb1, 0xbd, 0x95, 0xe8, 0xa8, 0x1d, 0x09, 0x6f, - 0x21, 0x55, 0x27, 0xc5, 0xaa, 0xf9, 0x72, 0x60, 0x69, 0xf8, 0xda, 0xcf, - 0x92, 0xc0, 0x56, 0x13, 0x3f, 0xcd, 0xa3, 0xf0, 0x9d, 0x04, 0x30, 0x56, - 0x42, 0x72, 0x58, 0x68, 0x52, 0xc4, 0xa0, 0x63, 0xb4, 0xf1, 0xe2, 0xd9, - 0xf7, 0xba, 0x0a, 0x97, 0xa5, 0x02, 0x8b, 0x17, 0x84, 0xe0, 0x32, 0x22, - 0x87, 0xe6, 0xfc, 0x72, 0xcf, 0x18, 0xc8, 0xb3, 0xc2, 0x24, 0xcf, 0xfd, - 0x0b, 0x56, 0xe8, 0x9f, 0x72, 0x65, 0xfb, 0xb2, 0x1f, 0x9c, 0xf3, 0x16, - 0x9b, 0xc2, 0xa4, 0xf5, 0x5d, 0xab, 0x1f, 0xf8, 0xca, 0x95, 0x6c, 0x06, - 0x10, 0xb4, 0xef, 0xe5, 0x16, 0x81, 0xd6, 0xd9, 0xaf, 0x10, 0x00, 0xe7, - 0x9a, 0x52, 0x50, 0xa5, 0xba, 0xec, 0xf2, 0x02, 0x4d, 0x51, 0x94, 0xd7, - 0xa4, 0x22, 0x9f, 0xce, 0x69, 0x41, 0x90, 0x58, 0xc3, 0x88, 0xc4, 0xd5, - 0x2a, 0x55, 0x89, 0x6f, 0xd8, 0x8d, 0x2b, 0x58, 0x97, 0x20, 0x13, 0x46, - 0x40, 0xd5, 0x7a, 0xa6, 0x11, 0xfa, 0x8a, 0xf7, 0xca, 0x72, 0x9a, 0x9b, - 0x49, 0x33, 0x55, 0x3c, 0x37, 0x5a, 0x16, 0xa3, 0xc9, 0x35, 0x9b, 0x26, - 0x42, 0x11, 0x1e, 0xda, 0x6a, 0x32, 0x63, 0xe6, 0x71, 0xb9, 0x36, 0xeb, - 0x7c, 0xe0, 0x21, 0xfb, 0xde, 0x11, 0xdc, 0xfe, 0xd4, 0xb4, 0xf2, 0xcf, - 0x71, 0xd3, 0xb8, 0xd6, 0xdf, 0x79, 0x16, 0xc8, 0x3e, 0x6a, 0xbe, 0xf8, - 0x38, 0x22, 0xa2, 0x7d, 0xad, 0xa5, 0x4b, 0x9b, 0x4b, 0x61, 0x7a, 0x32, - 0x99, 0xa0, 0x90, 0x08, 0x4b, 0x98, 0xee, 0x2c, 0xab, 0x8f, 0xce, 0x42, - 0x67, 0x89, 0x1c, 0x68, 0xfd, 0x9f, 0xbe, 0xf5, 0xf1, 0x92, 0xf3, 0x9b, - 0xa4, 0xff, 0xa1, 0xf6, 0x78, 0x4b, 0x2b, 0x71, 0xc5, 0x47, 0x54, 0x35, - 0x84, 0xb3, 0xe4, 0x05, 0x73, 0xf3, 0x1e, 0x7f, 0x9d, 0x7e, 0x11, 0xf8, - 0x6a, 0x1e, 0x89, 0x5a, 0xa5, 0x35, 0x1b, 0x3c, 0x68, 0x46, 0x2e, 0xd9, - 0x31, 0xd7, 0x28, 0x07, 0xcf, 0xbd, 0xe9, 0x28, 0x6e, 0xf0, 0x5e, 0x65, - 0x80, 0xc7, 0x34, 0xd0, 0xcb, 0xf1, 0x78, 0xfe, 0x02, 0x84, 0x3c, 0x06, - 0x7a, 0xe6, 0x0e, 0x9e, 0x0e, 0x4d, 0x68, 0x0c, 0xbe, 0x9c, 0x78, 0x43, - 0x33, 0x26, 0x4f, 0x2a, 0x81, 0x70, 0x31, 0x77, 0x66, 0x90, 0x0e, 0x39, - 0xd0, 0xc3, 0x0d, 0xb7, 0x9e, 0xa6, 0xa9, 0x06, 0xa3, 0x6a, 0x6e, 0x4b, - 0xcd, 0xae, 0x35, 0x5b, 0x42, 0x0c, 0x0a, 0x5f, 0xa1, 0xb5, 0x64, 0xd1, - 0x78, 0x8f, 0xb5, 0x73, 0x03, 0x94, 0x91, 0xc1, 0xbc, 0x50, 0x00, 0x98, - 0x25, 0x35, 0xc3, 0x0c, 0x6e, 0xec, 0x2d, 0x27, 0xea, 0xef, 0x88, 0x62, - 0xde, 0x3d, 0x95, 0xd8, 0x20, 0x6c, 0xe5, 0x16, 0xe0, 0xe0, 0x24, 0x7b, - 0xc9, 0x74, 0x7c, 0xff, 0x9b, 0x04, 0x12, 0xc8, 0x3c, 0x01, 0x9e, 0xf5, - 0x23, 0xfd, 0x8b, 0xec, 0xb1, 0x98, 0x33, 0xb2, 0xae, 0x68, 0x34, 0x19, - 0x3d, 0x04, 0x87, 0x41, 0x89, 0x74, 0xc8, 0xb9, 0x5f, 0xea, 0xbb, 0xff, - 0x9d, 0x54, 0xca, 0xdf, 0x34, 0x24, 0x0a, 0x10, 0xf3, 0xdf, 0x06, 0x30, - 0x2f, 0xea, 0x6b, 0x7d, 0x00, 0x37, 0x4a, 0x56, 0x3d, 0xec, 0x12, 0x70, - 0x17, 0xae, 0x45, 0x9e, 0xb9, 0x26, 0x85, 0x7b, 0xe6, 0x5d, 0xae, 0xcc, - 0x75, 0xa9, 0x73, 0x73, 0x59, 0x77, 0x0f, 0x43, 0xfa, 0xeb, 0xcd, 0x9c, - 0xa4, 0x33, 0xe2, 0x57, 0x3b, 0x52, 0x75, 0xa9, 0x58, 0xea, 0x4d, 0x37, - 0x54, 0x0a, 0x74, 0x2d, 0xeb, 0x3b, 0x79, 0x4c, 0xa6, 0x59, 0xee, 0xca, - 0xfa, 0x2f, 0xc0, 0x93, 0x4e, 0x06, 0x53, 0xb9, 0x59, 0x43, 0xdb, 0xb1, - 0x0c, 0x47, 0xb0, 0x4c, 0x38, 0x06, 0x18, 0x70, 0x28, 0x73, 0x77, 0x7f, - 0x66, 0x77, 0x18, 0x2f, 0xaf, 0xcf, 0xc4, 0x7c, 0xa0, 0x61, 0xca, 0xf0, - 0x94, 0x69, 0x91, 0xf2, 0x14, 0xbe, 0x64, 0x3b, 0xea, 0x3c, 0x16, 0x19, - 0x7b, 0xf9, 0x2a, 0xbf, 0xd5, 0xbd, 0x56, 0xdd, 0x83, 0x69, 0x9a, 0x51, - 0xf5, 0xb9, 0x15, 0x30, 0x92, 0x58, 0xcc, 0x9c, 0x72, 0xba, 0x93, 0xf0, - 0xa2, 0xca, 0x4d, 0x95, 0x77, 0x88, 0x89, 0xad, 0x8f, 0xc0, 0xee, 0x4a, - 0x62, 0x07, 0x44, 0x9b, 0x4b, 0x07, 0xfa, 0x61, 0xc1, 0x6d, 0xe2, 0x05, - 0x2c, 0x42, 0x99, 0xaa, 0xd9, 0x4a, 0x0a, 0x48, 0xc7, 0xab, 0xd0, 0x95, - 0xfa, 0x6e, 0x9c, 0xe8, 0xe3, 0x2b, 0x3f, 0x32, 0x8b, 0x36, 0x57, 0xc5, - 0x55, 0xcf, 0x80, 0xad, 0x92, 0xef, 0xe6, 0xcf, 0x8d, 0x70, 0xdf, 0x63, - 0x5c, 0xd0, 0xaa, 0x91, 0x86, 0xdd, 0xbb, 0x30, 0x9c, 0x53, 0xd6, 0xdf, - 0x85, 0x7d, 0xcd, 0xef, 0xb2, 0x1f, 0x45, 0x4b, 0x4b, 0x5d, 0xc6, 0x48, - 0x77, 0x92, 0xe8, 0xcc, 0x5a, 0x9d, 0x04, 0x80, 0x8a, 0x31, 0x6f, 0x2a, - 0x96, 0x82, 0xe9, 0xf8, 0x72, 0xa4, 0x23, 0x04, 0x9b, 0xf3, 0xdf, 0x68, - 0xb3, 0x3b, 0x98, 0xd7, 0x0c, 0xdb, 0xb8, 0xaa, 0xc2, 0x1c, 0xb3, 0x19, - 0xea, 0x42, 0x24, 0xed, 0x49, 0x2d, 0x79, 0x68, 0x20, 0xf3, 0xce, 0xca, - 0x86, 0xa6, 0x6b, 0xbb, 0x7d, 0x70, 0x56, 0x24, 0x1f, 0xd4, 0xf3, 0xc5, - 0xb9, 0xa0, 0xcf, 0xf6, 0x16, 0x34, 0x84, 0x8a, 0x07, 0x02, 0x34, 0xc2, - 0xc4, 0xb4, 0xd7, 0x10, 0x68, 0x25, 0xfc, 0xbe, 0xce, 0xbf, 0x08, 0x1a, - 0xe7, 0x80, 0x49, 0x60, 0x72, 0x0a, 0xeb, 0xd1, 0x72, 0x54, 0x84, 0x27, - 0xd6, 0xd4, 0xf8, 0x13, 0x7e, 0x2c, 0x33, 0xa5, 0xa1, 0x74, 0x27, 0xe3, - 0x7a, 0xfe, 0x87, 0x47, 0xcd, 0xa0, 0x6e, 0x8e, 0x37, 0x1a, 0x7c, 0xa3, - 0xbb, 0x9e, 0x0b, 0xd9, 0x48, 0xec, 0x17, 0x7f, 0x79, 0xa7, 0x22, 0x2d, - 0x86, 0xc7, 0xd4, 0x32, 0x67, 0x73, 0x77, 0x32, 0x9e, 0xfd, 0x1d, 0x30, - 0x0a, 0x18, 0xc0, 0xe4, 0x43, 0xc6, 0x78, 0x3e, 0xc8, 0xc0, 0xb6, 0xbf, - 0x18, 0x60, 0x04, 0x4d, 0x99, 0x64, 0xab, 0x65, 0xd1, 0xfe, 0x74, 0x20, - 0xce, 0xc6, 0x9b, 0x26, 0xa3, 0xea, 0xe6, 0x00, 0xfd, 0x9f, 0x5e, 0xbe, - 0xeb, 0x87, 0x80, 0x09, 0x6c, 0x27, 0xba, 0x86, 0x55, 0x60, 0x86, 0x87, - 0x3a, 0x50, 0xd8, 0x5d, 0x7d, 0xc9, 0x37, 0x2e, 0x34, 0x66, 0xe5, 0x32, - 0xa1, 0xb3, 0x96, 0x19, 0xde, 0xca, 0x33, 0x4b, 0x3f, 0xa8, 0x24, 0x38, - 0x2e, 0x6f, 0xa1, 0x5c, 0x8c, 0x31, 0x14, 0xc2, 0x0d, 0x04, 0xf5, 0x66, - 0x32, 0x08, 0x22, 0xba, 0x5f, 0xfe, 0xb8, 0xb6, 0xf4, 0x96, 0xe7, 0xb0, - 0x99, 0x23, 0x78, 0x09, 0x50, 0x48, 0xc6, 0x2c, 0x1a, 0xc1, 0x88, 0xb2, - 0xe9, 0xba, 0x5d, 0x14, 0xa7, 0x51, 0x0f, 0xdc, 0xf8, 0xef, 0xb5, 0x85, - 0x51, 0x34, 0xf1, 0xee, 0x43, 0x9a, 0x75, 0x1a, 0xaa, 0x8d, 0xac, 0xeb, - 0x68, 0xb3, 0x49, 0x83, 0xc6, 0xa2, 0x40, 0x8f, 0xb8, 0x60, 0xa4, 0xef, - 0x11, 0xcd, 0x87, 0x22, 0x1f, 0x99, 0x78, 0x8e, 0x35, 0xe2, 0xd5, 0x18, - 0xdc, 0x98, 0x45, 0x6a, 0x9e, 0xc1, 0x4b, 0xd1, 0x1a, 0x4a, 0xd9, 0x5b, - 0x0c, 0xfe, 0xe8, 0xa5, 0xef, 0xcf, 0x2b, 0xe3, 0x50, 0x8e, 0x94, 0x39, - 0xf1, 0xe8, 0x83, 0xa1, 0x1d, 0x42, 0x57, 0x26, 0x1a, 0x61, 0x20, 0xd6, - 0x1f, 0xd0, 0x1b, 0x7d, 0x84, 0xa3, 0x02, 0x5a, 0xb1, 0x56, 0x7e, 0x26, - 0xc5, 0xf5, 0x5c, 0x4d, 0xa4, 0xfd, 0x39, 0x44, 0x05, 0xf7, 0x7f, 0x7d, - 0x97, 0xb1, 0xf4, 0x63, 0xbc, 0x7a, 0xf8, 0xb0, 0x86, 0x78, 0x1b, 0x59, - 0x3f, 0x8c, 0xf9, 0x7b, 0xd7, 0xf6, 0xf9, 0x8c, 0x84, 0x66, 0xc2, 0x5f, - 0xc6, 0xb5, 0x9f, 0xed, 0x97, 0x74, 0xb3, 0x25, 0x9a, 0x8c, 0x23, 0xf6, - 0xbe, 0xbe, 0x2a, 0xf5, 0xc4, 0x74, 0x3a, 0x45, 0xf6, 0xfd, 0x4c, 0xec, - 0x74, 0xfb, 0x3c, 0x68, 0x0f, 0x88, 0xcb, 0x6c, 0x62, 0xe7, 0xfd, 0xb9, - 0x1b, 0xe0, 0xd4, 0x85, 0x5f, 0x83, 0xb6, 0xe4, 0xbc, 0x6b, 0x6b, 0x2b, - 0x5e, 0x95, 0x32, 0x29, 0x60, 0x91, 0x2e, 0x5d, 0xb1, 0x20, 0x37, 0x7b, - 0x33, 0x32, 0x81, 0x8a, 0x33, 0x01, 0x4e, 0xa7, 0xba, 0xc5, 0xe1, 0xed, - 0x5d, 0x68, 0x83, 0xba, 0x9d, 0x12, 0xc8, 0xd9, 0x05, 0x26, 0xb6, 0x22, - 0xa3, 0x01, 0x24, 0xec, 0x73, 0x28, 0x45, 0xec, 0x0f, 0x29, 0x37, 0x9e, - 0x27, 0xa8, 0x11, 0x7d, 0x84, 0xa3, 0x02, 0x5a, 0xb1, 0x56, 0x7e, 0x26, - 0xd2, 0xf6, 0xc0, 0xd3, 0xa8, 0xcc, 0xdf, 0x4c, 0x27, 0x7a, 0x3e, 0xd5, - 0xf4, 0xbb, 0xfd, 0x5e, 0xc5, 0x67, 0xad, 0xf9, 0x3e, 0x93, 0xd4, 0xfb, - 0x97, 0x94, 0x43, 0xe3, 0xf6, 0x82, 0x5f, 0xb1, 0x0c, 0x93, 0xe6, 0x16, - 0x7a, 0xfc, 0xa2, 0xd0, 0x4d, 0x4e, 0xb8, 0x7e, 0x3f, 0x62, 0x7d, 0xf5, - 0x15, 0x16, 0xfa, 0xf1, 0x61, 0x60, 0xe6, 0x37, 0x28, 0x3d, 0x69, 0x13, - 0xf4, 0xc5, 0x94, 0x16, 0x96, 0x35, 0xc2, 0x8c, 0x50, 0xfe, 0x7d, 0x36, - 0xa7, 0xe6, 0xe8, 0x3a, 0xb6, 0x37, 0xb8, 0xed, 0x00, 0x24, 0x9a, 0xf3, - 0x4f, 0x28, 0x6b, 0xd0, 0xae, 0x58, 0x40, 0xbf, 0xb4, 0x66, 0x1d, 0x53, - 0x35, 0x87, 0xa1, 0xad, 0x7a, 0x86, 0xe5, 0xf2, 0xe6, 0xea, 0x49, 0x44, - 0x86, 0x20, 0xda, 0xae, 0x48, 0xca, 0xcd, 0xf3, 0x80, 0x05, 0xb6, 0xea, - 0x6d, 0x0e, 0xe3, 0x9f, 0x9c, 0x42, 0x1d, 0x75, 0xa6, 0x78, 0x1e, 0x1f, - 0x3f, 0x84, 0x7f, 0xbd, 0x04, 0x71, 0x0a, 0xb4, 0xf5, 0xf1, 0x72, 0x26, - 0x35, 0x67, 0xb2, 0xb2, 0xb6, 0xc0, 0x09, 0x00, 0x6a, 0x30, 0xe3, 0x3b, - 0x61, 0x07, 0xd6, 0x23, 0x7e, 0x5c, 0xd7, 0x9a, 0x2b, 0x47, 0xd0, 0x99, - 0x5d, 0x8b, 0x81, 0xfb, 0x7c, 0xbd, 0x07, 0xf6, 0x79, 0x63, 0x0e, 0xb1, - 0x45, 0x7b, 0xf7, 0x27, 0x83, 0x80, 0x25, 0xd8, 0x6e, 0xa6, 0x83, 0x10, - 0x0a, 0x55, 0xe7, 0x5f, 0x64, 0x53, 0xc9, 0x9d, 0xa2, 0xf6, 0xb6, 0x8e, - 0x47, 0xa6, 0x50, 0x7e, 0xf7, 0xbb, 0xd3, 0x89, 0x00, 0x48, 0x96, 0xff, - 0x43, 0xc3, 0x39, 0xd1, 0x67, 0xe8, 0x46, 0x40, 0x17, 0xfe, 0x0f, 0x47, - 0xbc, 0x46, 0xa1, 0x2d, 0x38, 0x36, 0xd8, 0x5c, 0x6b, 0xe4, 0x29, 0x27, - 0xf7, 0xae, 0xdd, 0x59, 0xbe, 0x6b, 0x1e, 0x16, 0x1f, 0xf6, 0xc7, 0xa7, - 0x31, 0x14, 0xd1, 0x46, 0x27, 0xc7, 0x74, 0xf1, 0x0b, 0x1e, 0x2c, 0xa2, - 0x3d, 0x09, 0x14, 0x28, 0x6d, 0x02, 0x26, 0xec, 0xf6, 0x61, 0xfd, 0x2e, - 0x00, 0x67, 0x10, 0x99, 0x84, 0x66, 0x4f, 0x32, 0x93, 0xf8, 0xb0, 0xe9, - 0xf0, 0x45, 0xd8, 0x29, 0xcd, 0xc4, 0x62, 0x96, 0xb8, 0x4d, 0x18, 0x01, - 0x12, 0xa5, 0x4b, 0x6b, 0xfd, 0xe4, 0x26, 0x2a, 0x40, 0x5b, 0x86, 0x8f, - 0x1e, 0x78, 0x63, 0x1b, 0xe9, 0xda, 0xfb, 0x70, 0x8c, 0x5f, 0xb9, 0x81, - 0x64, 0xf4, 0xc3, 0xbf, 0x34, 0x37, 0x9a, 0x06, 0x13, 0x58, 0x0b, 0x86, - 0x58, 0x61, 0xf5, 0x86, 0xf3, 0x89, 0xc7, 0x43, 0x2b, 0xdf, 0x1f, 0xff, - 0xe0, 0x59, 0xff, 0xce, 0x28, 0x95, 0x83, 0x22, 0x00, 0x46, 0x8e, 0x71, - 0x32, 0x75, 0x5f, 0xba, 0x29, 0xc6, 0xbc, 0x85, 0xea, 0x51, 0x3c, 0xaa, - 0x80, 0xcf, 0xf7, 0x62, 0xc1, 0x9b, 0xd3, 0xe7, 0x8b, 0xff, 0x43, 0x48, - 0x5d, 0xd4, 0x29, 0xf1, 0x86, 0xbd, 0x75, 0xa8, 0x4f, 0xba, 0xc7, 0x80, - 0x74, 0x8a, 0x2a, 0x96, 0x09, 0x37, 0x67, 0x00, 0xc1, 0xf9, 0xee, 0xac, - 0x76, 0x94, 0xe8, 0xe4, 0x06, 0x9b, 0xe7, 0x8a, 0xe9, 0xaa, 0xbc, 0xf0, - 0x72, 0xaa, 0x3f, 0x46, 0xbb, 0x0e, 0x84, 0xb0, 0x07, 0xaa, 0x61, 0xcc, - 0x0d, 0xbe, 0xb3, 0x6f, 0x97, 0x30, 0xae, 0xcd, 0xf6, 0x46, 0x7e, 0xb3, - 0xb3, 0xf3, 0xae, 0xe6, 0x4c, 0x77, 0x50, 0x8c, 0xeb, 0xf3, 0xa9, 0x31, - 0x5b, 0x29, 0x43, 0xf3, 0x55, 0xac, 0x62, 0xb1, 0x0f, 0x0a, 0xf9, 0xb5, - 0x49, 0xef, 0x98, 0xbc, 0x57, 0xa3, 0x3d, 0x15, 0xe6, 0xcf, 0xc9, 0xe5, - 0x22, 0xed, 0xfd, 0xdc, 0x2f, 0x13, 0xf8, 0x05, 0xe4, 0x2a, 0xfb, 0xc3, - 0x09, 0xc1, 0x8c, 0x60, 0xb2, 0xec, 0x9b, 0x62, 0x97, 0x99, 0xb4, 0x44, - 0xde, 0x82, 0xcf, 0x2e, 0x44, 0x69, 0xbd, 0xce, 0xa5, 0xb1, 0x89, 0xb0, - 0x13, 0x4f, 0x6d, 0x6c, 0xff, 0xe8, 0xe9, 0x7a, 0xd6, 0x50, 0x01, 0xe1, - 0xd2, 0xda, 0x33, 0x61, 0x86, 0x84, 0xd2, 0x20, 0xf7, 0x29, 0x01, 0xf6, - 0x85, 0x8c, 0xa0, 0x88, 0xdb, 0xbd, 0xea, 0xc0, 0x6a, 0xbf, 0x61, 0x9d, - 0xec, 0x1f, 0x05, 0x8f, 0x38, 0x25, 0x82, 0x61, 0x5d, 0x27, 0x26, 0xf3, - 0x11, 0x1f, 0x25, 0x9c, 0x06, 0x1f, 0x73, 0xa9, 0x11, 0x7f, 0x98, 0x9b, - 0x2d, 0x83, 0x1e, 0x7f, 0x98, 0x09, 0x72, 0xb0, 0x84, 0x04, 0x9c, 0xec, - 0x72, 0xdd, 0x73, 0x13, 0xe9, 0x13, 0xda, 0xa5, 0x27, 0x3b, 0x7a, 0xc1, - 0x39, 0xcb, 0xd6, 0x91, 0x68, 0x42, 0x34, 0x86, 0x5f, 0x87, 0xf7, 0x45, - 0xea, 0x90, 0xad, 0x56, 0xe7, 0xc6, 0xd0, 0x07, 0x6f, 0x53, 0x28, 0x38, - 0xe3, 0xfd, 0xd0, 0x90, 0x7b, 0x2c, 0x2c, 0xf2, 0xd2, 0x6a, 0xb7, 0x68, - 0xf7, 0x70, 0xee, 0xd2, 0x1c, 0x98, 0xcb, 0xb1, 0x86, 0x65, 0xb2, 0x32, - 0xa0, 0xda, 0xc0, 0x96, 0xc3, 0xa0, 0xef, 0x7d, 0x3d, 0x88, 0xcb, 0x28, - 0xda, 0xfe, 0xcc, 0x91, 0x9b, 0x22, 0x47, 0x25, 0x6c, 0xcf, 0x76, 0x06, - 0xeb, 0x96, 0x0b, 0x8b, 0xf8, 0xb8, 0x4c, 0x39, 0x58, 0x31, 0x75, 0xf7, - 0x67, 0x64, 0x3b, 0x96, 0x7a, 0x66, 0x37, 0xfd, 0x29, 0x0a, 0xe9, 0xb2, - 0x7b, 0xe4, 0x2d, 0x12, 0xde, 0x71, 0x24, 0xc8, 0x0e, 0xa7, 0x0c, 0x3a, - 0xee, 0x7a, 0xdc, 0xcf, 0xcc, 0x93, 0xb2, 0xe4, 0x37, 0x3a, 0xe1, 0x9c, - 0x60, 0xf0, 0xa5, 0x36, 0x50, 0xc4, 0xf9, 0xeb, 0x42, 0xc9, 0xc9, 0xcb, - 0xfc, 0x16, 0x3a, 0xb5, 0x4e, 0xb1, 0x5f, 0x3c, 0x60, 0xc5, 0x9c, 0x5f, - 0x92, 0x0d, 0x56, 0xe6, 0x60, 0xa5, 0xda, 0x47, 0xbe, 0xa6, 0x11, 0x26, - 0xf0, 0x3e, 0x53, 0xc6, 0xbe, 0xa3, 0x64, 0xaa, 0x72, 0xc4, 0xab, 0xe6, - 0x59, 0x51, 0x5a, 0xd2, 0xeb, 0xf4, 0x82, 0x78, 0xce, 0xdd, 0x91, 0xe5, - 0x00, 0x2a, 0x9a, 0x28, 0x7b, 0x6c, 0x21, 0x15, 0xa1, 0x7d, 0xb5, 0x0e, - 0x21, 0x53, 0xe9, 0xc7, 0xc5, 0x8d, 0x1b, 0x7d, 0xe1, 0x36, 0x5f, 0x3e, - 0x4e, 0x47, 0x06, 0x76, 0xde, 0xad, 0x96, 0xcb, 0x27, 0x82, 0x18, 0xbe, - 0x80, 0xa8, 0x67, 0x4e, 0x2e, 0xdf, 0xb3, 0xc7, 0xd2, 0x61, 0x4d, 0xb6, - 0xf3, 0xac, 0x9d, 0x87, 0x6a, 0x57, 0x15, 0x1e, 0xd1, 0xde, 0x33, 0x8a, - 0x07, 0x11, 0x7a, 0x60, 0x64, 0x19, 0x68, 0x4e, 0x79, 0x99, 0x5a, 0x27, - 0x96, 0xf4, 0x7e, 0x10, 0xf5, 0xfb, 0x62, 0xba, 0x52, 0xfe, 0x93, 0xa2, - 0xc7, 0x53, 0xde, 0x83, 0xf9, 0xb7, 0x43, 0x16, 0xe0, 0xb4, 0x08, 0x74, - 0xb3, 0xfb, 0x01, 0x57, 0xe4, 0x8d, 0xc6, 0xc3, 0x27, 0xf7, 0xb5, 0x4d, - 0x61, 0x5b, 0x8e, 0x62, 0x00, 0x3a, 0x43, 0x9c, 0x9e, 0x29, 0x1d, 0xa6, - 0xe0, 0xa9, 0xa7, 0x36, 0x24, 0x7a, 0xd7, 0x54, 0x76, 0x65, 0x5a, 0x00, - 0xbe, 0xf7, 0x6f, 0xc7, 0x79, 0x4e, 0xc3, 0xbb, 0x4b, 0x39, 0x47, 0x82, - 0x87, 0x51, 0xdb, 0x3c, 0x98, 0x7b, 0xa1, 0xbc, 0xbd, 0x36, 0xd6, 0xb5, - 0xe3, 0xa8, 0x8b, 0xce, 0x1a, 0xed, 0xf0, 0x1a, 0x56, 0x1b, 0x1b, 0x85, - 0x7d, 0xdb, 0x94, 0x9a, 0xdf, 0x06, 0x38, 0x39, 0xf1, 0xa4, 0xcc, 0x71, - 0x9b, 0xb8, 0xb2, 0x9d, 0xc7, 0x54, 0xa4, 0xf7, 0x51, 0x4d, 0x26, 0x14, - 0x49, 0x04, 0xeb, 0x5a, 0x0d, 0x1e, 0x2d, 0x5f, 0x38, 0xbe, 0x65, 0x7c, - 0xd9, 0x33, 0x40, 0x22, 0xb9, 0x77, 0x76, 0x5b, 0x91, 0x6d, 0xc1, 0xe7, - 0xef, 0x34, 0x98, 0x72, 0x99, 0x9f, 0xb9, 0xd9, 0xce, 0x34, 0xd7, 0xf1, - 0xbf, 0x9d, 0x83, 0xd0, 0x64, 0x5c, 0xf2, 0x91, 0x78, 0x0e, 0x81, 0x97, - 0xc6, 0xf5, 0xa3, 0xe0, 0x6c, 0x06, 0xab, 0x6b, 0x07, 0x8c, 0x6e, 0xd5, - 0x48, 0xac, 0x7c, 0x63, 0x78, 0xf2, 0x51, 0x9b, 0x12, 0x2d, 0x67, 0x44, - 0x7b, 0xcf, 0xca, 0xd8, 0x1b, 0xb7, 0x10, 0xdf, 0x3f, 0x4b, 0x59, 0xd5, - 0xa2, 0xb1, 0x55, 0x43, 0xea, 0x02, 0x41, 0xe1, 0x94, 0xd3, 0x05, 0xc9, - 0x57, 0xe5, 0x8f, 0xad, 0x7d, 0xe8, 0x4e, 0x68, 0x95, 0xfd, 0xee, 0x7b, - 0x8b, 0x3e, 0xcb, 0x82, 0x08, 0x71, 0xd7, 0x7d, 0xac, 0x29, 0x95, 0x65, - 0x87, 0xb7, 0xb0, 0xe1, 0x78, 0xb0, 0xb2, 0x23, 0xf2, 0x85, 0x1d, 0xdb, - 0x5e, 0x63, 0x9d, 0x48, 0x33, 0x61, 0xdf, 0xf3, 0x9a, 0xe1, 0xc0, 0x44, - 0xc7, 0xbc, 0x26, 0xbb, 0x07, 0xca, 0xad, 0x6a, 0x42, 0xc9, 0xdf, 0xfd, - 0xc3, 0x63, 0xf9, 0x3d, 0x64, 0xca, 0xa3, 0x45, 0x5f, 0x2b, 0xc4, 0xb4, - 0xec, 0xa4, 0x18, 0xc0, 0xe6, 0xac, 0x40, 0x4a, 0x5e, 0x74, 0x92, 0xf6, - 0x77, 0xd4, 0x93, 0xf8, 0x4b, 0x88, 0x02, 0x25, 0xe2, 0x9c, 0xfc, 0xfb, - 0xb0, 0xc7, 0xc7, 0xfb, 0x19, 0x8d, 0x44, 0x68, 0x95, 0xfd, 0xee, 0x7b, - 0x8b, 0x3e, 0xcb, 0x82, 0x08, 0x71, 0xd7, 0x7d, 0xbb, 0x3a, 0x0d, 0xb6, - 0x35, 0x5b, 0x48, 0x09, 0x1e, 0x28, 0x68, 0x84, 0x7b, 0x09, 0xa8, 0xae, - 0xcf, 0xaf, 0xa7, 0x91, 0x23, 0xe9, 0xbe, 0x1f, 0x5b, 0x3f, 0xae, 0x07, - 0x6c, 0x56, 0x49, 0x9c, 0x6d, 0xe9, 0x16, 0x29, 0x7b, 0xbe, 0x6d, 0xde, - 0x60, 0xdd, 0xfd, 0x0e, 0xb2, 0x3a, 0xe1, 0xad, 0xb9, 0xe1, 0x42, 0x33, - 0xbd, 0xe0, 0x02, 0xe3, 0x2f, 0xdc, 0xc3, 0xc8, 0xc2, 0xa7, 0x15, 0x0c, - 0x47, 0x70, 0x27, 0x78, 0xe4, 0xe3, 0x7f, 0x80, 0x62, 0x63, 0x5a, 0x2e, - 0x63, 0x1d, 0x31, 0x4e, 0x21, 0x85, 0xf1, 0xb2, 0x0b, 0x6c, 0x06, 0x49, - 0x79, 0x5a, 0x2b, 0x2f, 0x3e, 0xfc, 0x89, 0x82, 0xb9, 0xd5, 0xbc, 0x46, - 0x70, 0x85, 0x84, 0xca, 0xa4, 0xfc, 0xc7, 0xde, 0xd3, 0x8e, 0x43, 0x81, - 0x52, 0x20, 0xf1, 0x9f, 0x7a, 0x08, 0x58, 0xbf, 0x9d, 0xcb, 0xb3, 0xc9, - 0xdf, 0x26, 0xa8, 0x23, 0xb6, 0x0a, 0xfb, 0x89, 0x98, 0xb1, 0x91, 0x00, - 0x98, 0xc0, 0x41, 0xb2, 0x66, 0x71, 0x5d, 0x62, 0x4a, 0x27, 0xdc, 0x93, - 0x26, 0x9a, 0xfd, 0xbc, 0x57, 0xa3, 0x3d, 0x15, 0xe6, 0xcf, 0xc9, 0xe5, - 0x3c, 0x52, 0x06, 0x4a, 0x25, 0xf7, 0x93, 0x42, 0xc0, 0x1c, 0xf2, 0x8a, - 0x34, 0x63, 0x40, 0xa5, 0x3b, 0x68, 0x76, 0x79, 0x20, 0x97, 0x3f, 0x1b, - 0xce, 0xf9, 0xfa, 0x5e, 0x9c, 0x26, 0x61, 0xbb, 0xd2, 0x1f, 0x58, 0xb8, - 0xed, 0xbc, 0x5c, 0x6a, 0xec, 0x8c, 0xf2, 0xba, 0xdb, 0xf6, 0xe0, 0x8c, - 0xd0, 0xb2, 0x08, 0x47, 0xd5, 0x92, 0xd2, 0xd2, 0x43, 0x0f, 0x5f, 0x49, - 0xf6, 0x0c, 0x22, 0x18, 0xe7, 0x1c, 0x3e, 0xf9, 0xf3, 0xaa, 0x13, 0x42, - 0xc1, 0xb0, 0xbe, 0xba, 0xdb, 0xf6, 0xe0, 0x8c, 0xcc, 0x14, 0xa6, 0x2b, - 0x98, 0x48, 0xce, 0xc6, 0xb8, 0xeb, 0x33, 0x57, 0x70, 0x31, 0xae, 0x7d, - 0xad, 0xcb, 0xbd, 0xc9, 0x71, 0x94, 0x90, 0x36, 0x08, 0x37, 0x8e, 0x45, - 0x24, 0x26, 0x23, 0x01, 0xeb, 0x33, 0xea, 0x5f, 0xa3, 0x2c, 0x26, 0x52, - 0xd7, 0x05, 0x5c, 0x8f, 0x5f, 0x74, 0xbf, 0x35, 0x50, 0x51, 0xc2, 0x74, - 0xc3, 0xe2, 0x15, 0x5c, 0xc2, 0xac, 0x70, 0xfa, 0x1d, 0xab, 0x5c, 0xf5, - 0x51, 0xd6, 0x35, 0xeb, 0x51, 0x34, 0x3b, 0xe6, 0x47, 0xba, 0x37, 0x99, - 0x00, 0x5e, 0xa5, 0xfe, 0x97, 0x51, 0xe5, 0xc1, 0x55, 0xe2, 0xe4, 0x71, - 0xc4, 0xf8, 0xef, 0x9d, 0x2f, 0x77, 0x1c, 0xe5, 0xab, 0xb4, 0xff, 0x6f, - 0x74, 0x13, 0x38, 0xdd, 0x4a, 0x99, 0x08, 0x04, 0x1c, 0x80, 0x77, 0x5e, - 0xef, 0xea, 0x72, 0x5e, 0xa5, 0x31, 0x46, 0x29, 0x0d, 0xa9, 0x11, 0x63, - 0x62, 0x7b, 0x24, 0x2c, 0xa6, 0x4d, 0x01, 0x9c, 0x0a, 0x99, 0x02, 0x47, - 0x0e, 0x49, 0x67, 0x4f, 0x21, 0x79, 0x6f, 0x4d, 0xb0, 0x72, 0x10, 0x3d, - 0x2a, 0x7d, 0xd2, 0xbd, 0x34, 0x97, 0x7b, 0xa8, 0x4c, 0x68, 0x6b, 0x80, - 0x2a, 0xf2, 0x88, 0xd3, 0xdd, 0x0f, 0x05, 0x60, 0x6d, 0x4b, 0xa1, 0x29, - 0xc2, 0x70, 0xd8, 0x1c, 0xac, 0x32, 0x32, 0xed, 0xd7, 0x6b, 0x79, 0xd4, - 0x66, 0x84, 0xce, 0xd2, 0x83, 0xf9, 0xa1, 0x69, 0x1a, 0x46, 0xf8, 0x84, - 0x78, 0xe8, 0x2b, 0xc3, 0xb9, 0x5a, 0x46, 0x7a, 0xd3, 0xb1, 0x99, 0xe3, - 0x72, 0x86, 0x99, 0x16, 0x03, 0x99, 0xcb, 0x10, 0x77, 0x34, 0xef, 0x48, - 0x3d, 0xb7, 0xec, 0x08, 0xe1, 0x8b, 0xc6, 0x9c, 0x09, 0xfb, 0x33, 0xec, - 0x68, 0xc9, 0x79, 0x6f, 0x55, 0x65, 0x3f, 0x59, 0x67, 0x9e, 0xcf, 0xd6, - 0x16, 0x9c, 0x68, 0xfb, 0x23, 0xa1, 0x7b, 0xea, 0x42, 0x60, 0x50, 0xa4, - 0x49, 0xdd, 0xac, 0xaf, 0x16, 0x76, 0xcb, 0x34, 0xe7, 0x10, 0xb5, 0xb9, - 0xa2, 0xf6, 0x6c, 0xfa, 0x5b, 0x33, 0x42, 0x2d, 0xbb, 0x1a, 0x5b, 0xe8, - 0x53, 0x3c, 0xc7, 0x76, 0x97, 0x0c, 0xb5, 0xee, 0x5d, 0x60, 0x81, 0xa2, - 0x7a, 0x60, 0x3b, 0x8f, 0x8e, 0x6e, 0x52, 0x59, 0xb5, 0xe6, 0x00, 0x50, - 0xa7, 0x94, 0x95, 0x83, 0x5d, 0x19, 0x4a, 0x78, 0x17, 0x97, 0xf2, 0xcf, - 0x1f, 0xea, 0xa0, 0x90, 0x65, 0xac, 0x2e, 0xd9, 0xe6, 0xa2, 0x6a, 0x15, - 0x86, 0x8e, 0x5d, 0xd7, 0x57, 0x47, 0x72, 0x4f, 0x3c, 0x63, 0xc2, 0x63, - 0xd9, 0x22, 0x37, 0x44, 0xa3, 0xc3, 0x83, 0x60, 0xf1, 0x20, 0x31, 0x28, - 0x28, 0x5f, 0x3f, 0x3d, 0x0d, 0xaf, 0x37, 0x6f, 0x0d, 0xb3, 0x69, 0x9a, - 0x18, 0xc4, 0xc0, 0xe1, 0x6f, 0xd5, 0xf1, 0x19, 0x03, 0x29, 0xe2, 0x1f, - 0xb3, 0x77, 0x8d, 0xc9, 0x98, 0x11, 0xf3, 0x54, 0x55, 0x01, 0xc8, 0x48, - 0x53, 0x5f, 0x98, 0xa9, 0x1b, 0xaf, 0x33, 0x87, 0x47, 0xa2, 0xd5, 0x3c, - 0xe1, 0x61, 0x99, 0xb7, 0x2b, 0x35, 0xfe, 0x10, 0x80, 0x9c, 0xac, 0xa5, - 0x98, 0xfd, 0x72, 0x90, 0x66, 0xbc, 0xa8, 0x5b, 0x81, 0xf8, 0x62, 0x59, - 0x85, 0x3a, 0xc1, 0xa0, 0x60, 0x27, 0x07, 0x2b, 0xbc, 0x5c, 0xc2, 0xe9, - 0x8f, 0x6f, 0x15, 0x1b, 0x32, 0x4b, 0x40, 0xc0, 0x12, 0x1c, 0x12, 0x8a, - 0xd0, 0xb9, 0x5b, 0x20, 0x76, 0x9d, 0x4e, 0x18, 0x1b, 0x87, 0xf7, 0xed, - 0xd8, 0x15, 0x47, 0x73, 0xe1, 0x5d, 0xdf, 0x3f, 0xf7, 0xc7, 0x2e, 0x1b, - 0xd0, 0x58, 0x23, 0x8d, 0x96, 0x48, 0xb6, 0x63, 0x87, 0x25, 0x47, 0x3c, - 0xa8, 0x98, 0x6b, 0xa1, 0x2d, 0xc4, 0x20, 0x6b, 0x54, 0xe0, 0x83, 0x48, - 0xb8, 0x51, 0x85, 0xbb, 0x98, 0x7d, 0xf2, 0x25, 0xf8, 0x42, 0xfc, 0x5d, - 0xf8, 0xa3, 0xd4, 0x68, 0x0a, 0xa2, 0x25, 0x65, 0x39, 0x78, 0xa0, 0xd0, - 0x5d, 0x9a, 0x71, 0xfc, 0x30, 0x2a, 0xc6, 0xab, 0x5a, 0x9e, 0x69, 0xce, - 0x58, 0xf2, 0x94, 0x6c, 0x43, 0xea, 0xfc, 0x5d, 0xd7, 0x39, 0xe2, 0x7b, - 0x53, 0xb9, 0x95, 0x6c, 0xe6, 0x80, 0xb6, 0x83, 0xa7, 0xa8, 0x33, 0xd5, - 0xa0, 0x9f, 0x15, 0xc6, 0x7e, 0x46, 0x9a, 0x7e, 0x5f, 0x78, 0x87, 0x00, - 0xb7, 0xcc, 0x0c, 0xc7, 0xb5, 0x1b, 0x11, 0xad, 0x6a, 0xdf, 0x59, 0x5f, - 0xf8, 0xa6, 0xe2, 0xfb, 0x6d, 0xf2, 0x9e, 0xf9, 0x57, 0x1e, 0x98, 0x3f, - 0x7a, 0xaf, 0x3f, 0xbd, 0xa6, 0xc9, 0xf3, 0x0c, 0x9d, 0xec, 0xcd, 0xca, - 0x6e, 0xed, 0x2a, 0x79, 0x57, 0x66, 0x17, 0x1f, 0xfe, 0xbc, 0x69, 0xc7, - 0x3a, 0x06, 0xb5, 0x7b, 0x85, 0xe2, 0x14, 0xb5, 0xdc, 0xca, 0x7a, 0x23, - 0x81, 0xfe, 0x3d, 0x56, 0xf3, 0x89, 0xab, 0x5d, 0x56, 0x40, 0xbf, 0x1e, - 0xb9, 0xee, 0xed, 0x15, 0x5c, 0x1e, 0x4c, 0xea, 0x3e, 0xc7, 0x0a, 0xad, - 0x57, 0x64, 0x8e, 0xff, 0x42, 0x05, 0xdf, 0xc6, 0xba, 0x61, 0x7d, 0x73, - 0x4c, 0x6c, 0xc1, 0xa6, 0x8e, 0x2f, 0xb0, 0xa2, 0x96, 0xc3, 0x67, 0x33, - 0x46, 0x8a, 0xff, 0x8f, 0xcf, 0x33, 0xd4, 0xb0, 0x85, 0x83, 0x0b, 0x95, - 0x92, 0x65, 0x6a, 0x24, 0x5b, 0xb6, 0xd5, 0x11, 0xe1, 0xff, 0xbf, 0xc1, - 0x4a, 0xdd, 0xa5, 0xa6, 0x9b, 0x1d, 0x4a, 0x2a, 0x99, 0x11, 0xf5, 0xe6, - 0x18, 0x7f, 0x57, 0x2b, 0xae, 0x83, 0x65, 0x15, 0xa3, 0x86, 0x7e, 0x8b, - 0x40, 0x2d, 0xff, 0x3e, 0x7f, 0x99, 0x64, 0x1e, 0xd1, 0x3f, 0xf0, 0x67, - 0x87, 0x23, 0xb1, 0xd6, 0xfc, 0xec, 0x5f, 0x83, 0x53, 0x65, 0x27, 0x1b, - 0x5b, 0xe5, 0x86, 0x0b, 0xfe, 0x70, 0x88, 0xcb, 0x2c, 0xad, 0x25, 0xf9, - 0x81, 0xc3, 0x8a, 0x62, 0xe5, 0xa1, 0x6c, 0x27, 0x1b, 0x82, 0xeb, 0xab, - 0xfe, 0x55, 0x0c, 0xa2, 0x0a, 0xca, 0xea, 0x67, 0xd1, 0xed, 0xc5, 0xe3, - 0x5a, 0x4d, 0x21, 0x53, 0x68, 0xe0, 0xd4, 0x91, 0x96, 0x51, 0xf8, 0x96, - 0xdd, 0x87, 0x79, 0xd1, 0xb8, 0x81, 0xe1, 0xa8, 0x18, 0x9f, 0x53, 0x92, - 0x2f, 0xed, 0x1c, 0x4f, 0x3a, 0x3f, 0xa3, 0xeb, 0x24, 0x07, 0xa8, 0xa5, - 0xe0, 0xd1, 0x43, 0x7d, 0xbe, 0x36, 0x81, 0x8d, 0x8f, 0xbd, 0x12, 0xa5, - 0xc2, 0xa2, 0x71, 0xc3, 0x05, 0x78, 0xa4, 0x4b, 0x37, 0x1f, 0x23, 0xbe, - 0x32, 0x06, 0x41, 0x16, 0xb4, 0xbe, 0xab, 0x4a, 0x1b, 0xdb, 0xf1, 0x1c, - 0x4a, 0xac, 0x25, 0xdc, 0xee, 0x2b, 0x26, 0xbd, 0xbc, 0x69, 0x77, 0x7f, - 0xae, 0xa4, 0xf5, 0xda, 0x36, 0xa6, 0x8f, 0x64, 0xca, 0x0c, 0x9b, 0x4b, - 0xb3, 0x50, 0xf7, 0x82, 0x6b, 0xb8, 0x35, 0x7f, 0x8e, 0x2d, 0xd0, 0x3c, - 0x1f, 0x71, 0x80, 0x90, 0x1b, 0x85, 0x5a, 0x7a, 0x63, 0x5a, 0x94, 0x51, - 0x5f, 0x8c, 0x55, 0xb3, 0x2b, 0x93, 0xd9, 0x2c, 0x8d, 0xdd, 0x7f, 0x3f, - 0x47, 0x1b, 0x96, 0xcb, 0x11, 0x17, 0x8a, 0x8f, 0x1a, 0x5d, 0x5e, 0x13, - 0xfd, 0x60, 0x46, 0xba, 0xe4, 0x2e, 0x4b, 0x8a, 0x7f, 0x7c, 0xbd, 0x4b, - 0x7d, 0x33, 0xd6, 0x68, 0x1f, 0x71, 0x0a, 0x8b, 0x99, 0xce, 0x09, 0x13, - 0x77, 0xd9, 0x7e, 0x48, 0x4b, 0x93, 0x9b, 0x66, 0xc2, 0x45, 0x3e, 0x64, - 0x81, 0xd2, 0xbb, 0x29, 0x74, 0xe7, 0xa4, 0xb2, 0xec, 0x3e, 0x15, 0xcb, - 0x6f, 0xbe, 0xf0, 0xed, 0x16, 0x62, 0x5e, 0x89, 0x37, 0x30, 0xca, 0xe9, - 0x51, 0x44, 0xb3, 0xf1, 0xf5, 0xa4, 0xb7, 0xc6, 0x7b, 0xd4, 0x00, 0xa2, - 0xa8, 0x63, 0xd4, 0x0c, 0x62, 0xa9, 0x98, 0x25, 0x77, 0x15, 0xda, 0x42, - 0xc8, 0x21, 0xd5, 0x2e, 0x5f, 0xe1, 0x2e, 0xd6, 0x8d, 0x99, 0x36, 0x74, - 0x8f, 0xcb, 0xd3, 0x73, 0x20, 0xb4, 0x7a, 0x33, 0x2b, 0xff, 0x62, 0x19, - 0xf1, 0x8d, 0xd5, 0x48, 0xdc, 0x46, 0xeb, 0x6f, 0xf8, 0x46, 0x71, 0x81, - 0x7b, 0x7a, 0xde, 0x60, 0x5e, 0xa7, 0xb5, 0xbb, 0x7b, 0x77, 0x59, 0x77, - 0x05, 0x68, 0xfa, 0x77, 0x47, 0xdc, 0x2a, 0xd7, 0xf1, 0x83, 0x6e, 0x02, - 0x4a, 0xfe, 0x5d, 0x25, 0xfa, 0xa8, 0xcc, 0x22, 0x20, 0x58, 0x25, 0x7b, - 0x81, 0x36, 0x95, 0xe5, 0xa1, 0x7c, 0x62, 0x1c, 0x3e, 0xe6, 0xef, 0xe3, - 0x59, 0x50, 0x9e, 0x65, 0x45, 0xe6, 0x52, 0x0c, 0x2b, 0xd6, 0xf4, 0x27, - 0x80, 0x26, 0xe9, 0xb8, 0x70, 0x70, 0xe8, 0x6a, 0xb6, 0x9c, 0x63, 0x74, - 0x42, 0x83, 0xf6, 0x02, 0x97, 0xd5, 0xb9, 0x4c, 0x76, 0xaf, 0x9e, 0x9a, - 0x62, 0xd9, 0x60, 0xb4, 0x55, 0xf6, 0xc4, 0x8d, 0xcf, 0x4a, 0xce, 0x34, - 0x08, 0x0b, 0x72, 0xc6, 0x67, 0x2b, 0xec, 0x0a, 0xbb, 0x6b, 0x5b, 0x79, - 0x01, 0xf0, 0x3e, 0x81, 0x1d, 0x77, 0xd0, 0x69, 0x5a, 0xaa, 0xc7, 0xa0, - 0x88, 0x13, 0x7e, 0x80, 0x4b, 0xe3, 0xca, 0x6b, 0x38, 0x33, 0x30, 0xa6, - 0x6e, 0xb4, 0xdb, 0x05, 0x6d, 0x97, 0x9a, 0xb5, 0x38, 0x42, 0xe8, 0x8a, - 0x68, 0xa9, 0x55, 0xd8, 0x7d, 0x56, 0x7e, 0x72, 0x90, 0x6b, 0xa1, 0x30, - 0x6e, 0x65, 0xab, 0x3b, 0xc1, 0x54, 0xfe, 0x07, 0xa4, 0xe1, 0xf4, 0x86, - 0xfd, 0x70, 0x58, 0xba, 0xe4, 0x2e, 0x4b, 0x8a, 0x7f, 0x7c, 0xbd, 0x4b, - 0x7d, 0x33, 0xd6, 0x68, 0x4f, 0x0a, 0xa1, 0x14, 0x3e, 0xb8, 0xda, 0x08, - 0x9e, 0xf2, 0x72, 0xc2, 0x3b, 0xdb, 0x0f, 0xb8, 0xfa, 0x1f, 0x6d, 0x18, - 0x66, 0xe9, 0xa4, 0x47, 0xdc, 0xcb, 0x0b, 0x52, 0x15, 0x5e, 0x8b, 0x6b, - 0x31, 0x8a, 0x8f, 0x54, 0x46, 0xbd, 0xa1, 0xe2, 0xf8, 0x70, 0xe4, 0x06, - 0xec, 0x85, 0xdf, 0xb5, 0x70, 0x28, 0x76, 0x05, 0xaa, 0x00, 0x31, 0x18, - 0x63, 0x2f, 0x3e, 0xa6, 0x10, 0x40, 0x6f, 0x29, 0x86, 0x05, 0xca, 0x0a, - 0x32, 0xfe, 0x98, 0xa5, 0xf2, 0x28, 0xb5, 0xe1, 0xb9, 0xb8, 0x44, 0x55, - 0xd4, 0xb3, 0x5f, 0x47, 0x9c, 0x72, 0x68, 0xb6, 0x80, 0xe6, 0x48, 0xf1, - 0xf5, 0x48, 0xd2, 0x9b, 0x49, 0x4f, 0x43, 0xf7, 0xdd, 0x81, 0x97, 0x56, - 0x23, 0x06, 0xe4, 0x5b, 0x3c, 0xf1, 0xd6, 0xae, 0x39, 0x9a, 0xd6, 0x6c, - 0x09, 0x6c, 0xe5, 0xce, 0xd9, 0x7c, 0x02, 0xbc, 0xfe, 0x6c, 0xcb, 0x3e, - 0xb2, 0x13, 0x08, 0x2d, 0xdd, 0x8d, 0xe1, 0x0e, 0xa9, 0xf1, 0x0d, 0x70, - 0x18, 0x9e, 0xd3, 0x59, 0x98, 0xfd, 0x57, 0x79, 0x62, 0x66, 0xbd, 0xf3, - 0x85, 0x3c, 0x76, 0x9b, 0x28, 0xcf, 0x53, 0x98, 0x0a, 0x2d, 0x4c, 0x93, - 0xc7, 0x43, 0x8f, 0x7e, 0x7c, 0x50, 0xf3, 0x76, 0xd4, 0x6f, 0x2b, 0xcc, - 0xfa, 0x94, 0xaa, 0x3f, 0xb6, 0x58, 0x1c, 0x3a, 0x53, 0xbb, 0x7e, 0xc4, - 0x52, 0xaf, 0xb0, 0x6b, 0x91, 0xa9, 0xf5, 0xd4, 0x15, 0x7f, 0xca, 0x1e, - 0x55, 0x44, 0xd9, 0x23, 0xb0, 0xdb, 0x0c, 0x64, 0x7b, 0x67, 0x83, 0x51, - 0xb8, 0xa0, 0x1c, 0x7a, 0xd1, 0x63, 0x4d, 0xfb, 0xb1, 0x7c, 0x01, 0xe9, - 0xef, 0x37, 0xd4, 0x84, 0x86, 0xc5, 0x07, 0xa4, 0x16, 0xa4, 0x5b, 0x77, - 0xd3, 0x90, 0xdd, 0x4f, 0xc0, 0x56, 0x93, 0x18, 0xbc, 0x0e, 0x1a, 0x0a, - 0x8e, 0x82, 0x00, 0x17, 0xe7, 0x2c, 0x96, 0x70, 0xf3, 0x7b, 0xf4, 0xaf, - 0x16, 0x42, 0xb1, 0x05, 0x35, 0xfe, 0x46, 0x0d, 0xd5, 0xc0, 0x08, 0x04, - 0xef, 0x18, 0x8e, 0x23, 0xb7, 0xc3, 0xbc, 0x87, 0x6f, 0x9c, 0x5d, 0x6b, - 0xcf, 0xb6, 0x46, 0x53, 0x78, 0x19, 0x1b, 0x6e, 0x18, 0x7c, 0xed, 0x81, - 0x79, 0xd2, 0xce, 0x27, 0xa4, 0x69, 0x9f, 0x32, 0x1f, 0x7b, 0xde, 0xad, - 0x96, 0xd6, 0xe7, 0x30, 0x84, 0xf2, 0xdb, 0x7a, 0x86, 0x36, 0xb8, 0x05, - 0x1e, 0x21, 0xd1, 0x6d, 0x65, 0x2b, 0x01, 0x52, 0x63, 0x53, 0xcd, 0x71, - 0xb4, 0xe4, 0x92, 0xfd, 0xd0, 0x86, 0x09, 0xfb, 0x2b, 0x67, 0xf0, 0x0c, - 0x60, 0xaa, 0x5f, 0x23, 0x9a, 0xa2, 0xb9, 0x2c, 0xa4, 0x53, 0x46, 0x35, - 0xb0, 0xbb, 0x11, 0xac, 0x12, 0xbd, 0x23, 0x62, 0xf1, 0x1a, 0xfa, 0x73, - 0x61, 0x91, 0x63, 0x9f, 0x9d, 0xb4, 0xc2, 0xf7, 0x99, 0x46, 0xf4, 0xbd, - 0x71, 0xea, 0xdb, 0x1e, 0x1f, 0xe1, 0x5b, 0x52, 0x16, 0xc0, 0x1d, 0x66, - 0x04, 0xfa, 0x43, 0x63, 0xad, 0xdd, 0x94, 0x1f, 0x79, 0xfe, 0x3b, 0xba, - 0x33, 0x7f, 0x49, 0x94, 0x48, 0x99, 0x1f, 0x6e, 0xa4, 0x79, 0x0d, 0xc0, - 0x8d, 0x89, 0x20, 0x5b, 0x17, 0x0c, 0x53, 0xa4, 0xbe, 0x8a, 0xac, 0xa9, - 0x58, 0x0f, 0x5d, 0x54, 0x6e, 0x22, 0x46, 0x5b, 0xe8, 0x7d, 0x30, 0x19, - 0xa2, 0xce, 0x6a, 0x04, 0x40, 0xeb, 0xa3, 0x01, 0x93, 0xeb, 0x42, 0x53, - 0x28, 0xac, 0x52, 0x64, 0x1b, 0xd6, 0x2b, 0xa8, 0x8e, 0xc7, 0xd0, 0xef, - 0x5e, 0xda, 0xd0, 0x79, 0xd3, 0x48, 0xc9, 0x5b, 0x2e, 0x17, 0xa4, 0x5f, - 0xb7, 0xdb, 0x37, 0x2b, 0x99, 0x2e, 0xb8, 0xc1, 0xa0, 0xeb, 0x7c, 0xda, - 0x6b, 0xf9, 0xcd, 0x90, 0x3b, 0xe3, 0xc3, 0xe4, 0x44, 0x3c, 0x44, 0x80, - 0xf4, 0x16, 0x2c, 0x87, 0xed, 0xeb, 0xe7, 0x87, 0xbd, 0x80, 0x63, 0xea, - 0xce, 0xab, 0xea, 0x08, 0x33, 0x96, 0xc5, 0x47, 0x7d, 0x01, 0x2d, 0x72, - 0xe5, 0x1f, 0x8a, 0x90, 0xf3, 0x48, 0x33, 0x00, 0x9d, 0xfe, 0x5c, 0x90, - 0x25, 0x82, 0x28, 0xca, 0xac, 0xd8, 0xd9, 0xc7, 0x86, 0x96, 0xb4, 0xae, - 0xf2, 0xa0, 0x45, 0x06, 0x1c, 0x94, 0x73, 0xac, 0x0e, 0x88, 0x8e, 0x19, - 0xa6, 0x0e, 0x9c, 0x71, 0x50, 0x9f, 0x7a, 0x72, 0xdd, 0x16, 0xc0, 0x7a, - 0xd0, 0x7d, 0x2b, 0x5c, 0x24, 0xc5, 0x6a, 0x1a, 0x06, 0x64, 0x5e, 0x85, - 0xae, 0xe0, 0xd5, 0xc4, 0xda, 0x9e, 0x60, 0xee, 0xab, 0x81, 0x95, 0x87, - 0x13, 0x9a, 0x5f, 0x8d, 0x1a, 0x20, 0xd4, 0xae, 0xf1, 0x17, 0x22, 0xb6, - 0xdb, 0x42, 0x5c, 0xe0, 0xb0, 0xfe, 0xa1, 0x8a, 0x26, 0x16, 0x9a, 0xec, - 0x96, 0xa9, 0x6b, 0x1c, 0x98, 0x92, 0x90, 0x77, 0x46, 0x0d, 0xc8, 0x42, - 0xc9, 0xfa, 0xfb, 0x3d, 0x3c, 0xf9, 0x0d, 0x27, 0xd3, 0x13, 0x36, 0x09, - 0xa0, 0x60, 0x4e, 0x03, 0xeb, 0x0c, 0x2c, 0x4b, 0x63, 0xcc, 0x50, 0xbd, - 0x7d, 0xe2, 0xe7, 0x74, 0x89, 0x00, 0xea, 0xb9, 0x0e, 0xc5, 0x4c, 0x46, - 0xa8, 0xab, 0xe0, 0xa3, 0x09, 0x09, 0xbc, 0x38, 0x00, 0xa4, 0xb6, 0xb6, - 0x13, 0xb7, 0x98, 0xe5, 0xfa, 0x81, 0xa5, 0x75, 0x6f, 0x6c, 0x9c, 0xef, - 0xfb, 0x64, 0xc2, 0x95, 0xa9, 0x9b, 0xde, 0x93, 0xb3, 0x44, 0x5a, 0x03, - 0xf2, 0x1a, 0xa5, 0xad, 0x06, 0xac, 0xc7, 0xf4, 0xa0, 0x8f, 0x93, 0x2a, - 0xab, 0xed, 0xbe, 0x53, 0xe3, 0x5e, 0x77, 0x77, 0xad, 0xe8, 0xb1, 0x70, - 0xd4, 0xf7, 0x8f, 0x4e, 0x7e, 0x9a, 0xaa, 0x83, 0xbc, 0x2f, 0xd0, 0x20, - 0x3d, 0x8c, 0x0e, 0x83, 0xcd, 0xdc, 0x6b, 0x26, 0xb8, 0xd8, 0x49, 0xce, - 0xc2, 0x7f, 0x27, 0xd0, 0xbd, 0xc0, 0xc1, 0xe7, 0xb4, 0xc0, 0xdb, 0xd2, - 0x08, 0x08, 0x01, 0x3d, 0x50, 0x1c, 0xf0, 0x9b, 0x93, 0xcb, 0x6a, 0x07, - 0x5e, 0x0a, 0x83, 0xb0, 0x1e, 0xb2, 0x9c, 0x70, 0x78, 0xef, 0xe2, 0x93, - 0x2d, 0xf8, 0x2e, 0xae, 0x8a, 0x0b, 0x9d, 0x1e, 0x2c, 0x6d, 0x1b, 0x79, - 0xce, 0x98, 0xc6, 0x05, 0x64, 0x85, 0x45, 0x5e, 0xc5, 0x0c, 0x2c, 0x19, - 0x05, 0xc7, 0x98, 0xe9, 0xfd, 0xb1, 0x2d, 0x1f, 0x8c, 0xee, 0x3a, 0x2a, - 0x6c, 0x94, 0xe5, 0x69, 0x0b, 0x8f, 0xac, 0x5b, 0x5e, 0x31, 0x35, 0xea, - 0xd1, 0x38, 0x69, 0xb1, 0xd4, 0x4a, 0x35, 0x47, 0xa1, 0x3c, 0x06, 0x4d, - 0x88, 0xbc, 0x5c, 0x39, 0x40, 0x91, 0x67, 0x4c, 0x54, 0xe6, 0x18, 0xd9, - 0xd4, 0x2f, 0x95, 0xa0, 0x6c, 0x7e, 0x00, 0x55, 0xc9, 0xa9, 0x97, 0x89, - 0x2c, 0xe5, 0x4f, 0x5b, 0xfa, 0x8e, 0x13, 0x5d, 0x4c, 0xb1, 0x4f, 0xe9, - 0xe7, 0x2e, 0x22, 0x48, 0x40, 0x2c, 0xad, 0x62, 0x34, 0x14, 0xf8, 0x05, - 0xf0, 0x3f, 0x63, 0x27, 0xea, 0xfe, 0x5b, 0x44, 0x87, 0x99, 0x19, 0xe6, - 0x0e, 0x3c, 0xa0, 0x48, 0x3d, 0xf0, 0xf2, 0xeb, 0x23, 0x8d, 0x58, 0x02, - 0x3c, 0x40, 0x32, 0x19, 0x04, 0xa2, 0x56, 0xe5, 0x8e, 0xd5, 0x2a, 0x11, - 0x2c, 0xf9, 0xa2, 0xa5, 0xea, 0x25, 0x40, 0x85, 0x96, 0x5b, 0x38, 0x51, - 0x9e, 0xd6, 0x2a, 0x81, 0x2c, 0x15, 0x00, 0xf1, 0x56, 0x9e, 0x6f, 0x04, - 0x3b, 0xd4, 0x45, 0xa4, 0xd6, 0x1e, 0xad, 0x68, 0x13, 0x21, 0xb1, 0x95, - 0x55, 0x19, 0x1b, 0x1f, 0x72, 0x08, 0xff, 0x2e, 0x77, 0xe0, 0x05, 0xab, - 0xa7, 0x6d, 0x54, 0x31, 0x80, 0x9d, 0xcf, 0x5e, 0x72, 0x7f, 0x1f, 0x94, - 0xa8, 0x9e, 0xe9, 0x01, 0xba, 0x8c, 0x24, 0x9f, 0xc4, 0xc7, 0x19, 0x60, - 0xd4, 0x24, 0x2d, 0x0f, 0x0e, 0x32, 0xd6, 0x45, 0x8c, 0x82, 0xf2, 0x04, - 0xa6, 0x00, 0xa9, 0x84, 0xc5, 0x8f, 0x83, 0xc1, 0x44, 0x68, 0x64, 0x90, - 0x88, 0x12, 0x11, 0xc9, 0xe8, 0x39, 0x0c, 0x24, 0x33, 0xc8, 0x1e, 0x7b, - 0xb9, 0x3c, 0x46, 0x35, 0x94, 0xb0, 0xb6, 0xe1, 0x0f, 0xa1, 0xbd, 0x13, - 0x6b, 0x8f, 0x0d, 0xbd, 0x1d, 0x7b, 0xff, 0xbc, 0xcc, 0x37, 0x22, 0x95, - 0xc9, 0x9a, 0xa8, 0xf6, 0xfb, 0xd9, 0x18, 0xb4, 0xaf, 0xf2, 0x70, 0xd7, - 0xce, 0x96, 0x17, 0x28, 0x35, 0xbb, 0xff, 0xfc, 0x9c, 0xd9, 0x7e, 0x58, - 0x46, 0xb9, 0x9d, 0x10, 0x91, 0x60, 0xe1, 0x00, 0xec, 0xa7, 0xc9, 0x54, - 0xf0, 0xcc, 0x5b, 0x8f, 0x51, 0x4f, 0x0a, 0xb6, 0x13, 0x2f, 0x78, 0xfd, - 0xa4, 0x25, 0x1c, 0x68, 0xd5, 0xc7, 0xf0, 0x8c, 0x30, 0xa4, 0xc1, 0xab, - 0xc1, 0x9f, 0xbc, 0x7f, 0x1f, 0x50, 0x15, 0x49, 0x3e, 0x80, 0x1a, 0xe3, - 0x4f, 0x6b, 0x41, 0x89, 0x60, 0x12, 0x7f, 0x15, 0x77, 0xc6, 0xfc, 0x75, - 0x6e, 0x2f, 0x0d, 0x81, 0x33, 0x22, 0xad, 0xda, 0x90, 0x96, 0x96, 0x0b, - 0x3b, 0xc0, 0xa3, 0xd1, 0x64, 0xfd, 0x6d, 0x4a, 0x5c, 0xb7, 0x7d, 0x45, - 0xb0, 0xd7, 0x12, 0xec, 0x3c, 0x6a, 0x4d, 0xfa, 0x51, 0x67, 0xbb, 0x1b, - 0x4f, 0xcc, 0x95, 0x2c, 0xf5, 0x2f, 0x11, 0x14, 0x27, 0xf7, 0x6a, 0xe2, - 0x4d, 0x4e, 0xd0, 0xa9, 0x42, 0x58, 0xf6, 0x13, 0xd1, 0xe7, 0xac, 0xcc, - 0x2b, 0x96, 0xeb, 0xff, 0x15, 0x88, 0x56, 0x8a, 0x29, 0xb4, 0x9b, 0x48, - 0xdf, 0x11, 0x9d, 0x3a, 0x1f, 0x4a, 0xaa, 0x91, 0xee, 0x67, 0x5c, 0x30, - 0xd1, 0x57, 0xf4, 0x95, 0x85, 0xc9, 0x09, 0x1d, 0xa3, 0x17, 0xac, 0xb5, - 0xcb, 0xe4, 0x38, 0x5b, 0xfd, 0x11, 0xa4, 0xa3, 0x61, 0xde, 0xcd, 0xdc, - 0x79, 0x49, 0xf9, 0xcc, 0x42, 0xae, 0xfd, 0xc7, 0x66, 0x35, 0x01, 0x09, - 0x48, 0xec, 0x99, 0xac, 0x9f, 0x1c, 0x11, 0xae, 0x53, 0x92, 0x9b, 0x8c, - 0x8a, 0x22, 0xc2, 0x1c, 0x31, 0x3a, 0x66, 0xe3, 0x9d, 0xe9, 0x84, 0x77, - 0xbb, 0xaa, 0x1d, 0x70, 0xc1, 0x83, 0xe9, 0xc2, 0x7a, 0xb8, 0x47, 0x97, - 0x7d, 0x05, 0x35, 0xa1, 0x32, 0xaa, 0x5c, 0xb3, 0xe1, 0xcb, 0x3a, 0xed, - 0x4d, 0x84, 0x62, 0x9d, 0x67, 0x85, 0x1b, 0x63, 0x08, 0x60, 0x97, 0xfa, - 0xbd, 0xf3, 0xe6, 0xd6, 0x9a, 0x99, 0xb6, 0xeb, 0xba, 0xad, 0x81, 0x85, - 0xc6, 0x63, 0xd7, 0x6c, 0x63, 0x4b, 0x15, 0x4c, 0x8c, 0x27, 0x7b, 0xd9, - 0xe9, 0x27, 0x75, 0xaa, 0xbb, 0xe0, 0xb6, 0x0e, 0x0f, 0x25, 0xc6, 0xd5, - 0x65, 0x8e, 0x5f, 0xda, 0x9d, 0x3b, 0x3f, 0xf4, 0x66, 0xcf, 0xe7, 0x57, - 0x64, 0xc8, 0xac, 0x61, 0x9a, 0x24, 0xcb, 0x64, 0x8f, 0xa9, 0x64, 0x59, - 0xfd, 0xd8, 0x12, 0x8d, 0x1e, 0xb8, 0x10, 0x67, 0x95, 0x7d, 0xe2, 0xaa, - 0x4e, 0x7b, 0xc4, 0xc5, 0xa0, 0x55, 0xfd, 0x8a, 0x17, 0xa1, 0x69, 0x48, - 0x26, 0xe0, 0x9a, 0xe3, 0xd3, 0x5f, 0xb2, 0x78, 0x60, 0xd2, 0x58, 0xb0, - 0xcc, 0xbb, 0x03, 0xfc, 0x59, 0xc7, 0x56, 0x1e, 0xde, 0x49, 0xa2, 0xa7, - 0x69, 0xc4, 0x7a, 0xba, 0x16, 0x63, 0x98, 0x4c, 0xef, 0x3b, 0x57, 0xa9, - 0x88, 0xfc, 0xfa, 0xb3, 0xfa, 0xeb, 0x17, 0xde, 0x52, 0xa4, 0x71, 0xb7, - 0x71, 0x80, 0x51, 0xd5, 0x91, 0xdf, 0x58, 0x12, 0xc2, 0x83, 0x87, 0xab, - 0x72, 0xbc, 0xb5, 0x52, 0x0b, 0xf0, 0x53, 0x07, 0x78, 0x52, 0xec, 0x73, - 0x47, 0x2f, 0x3d, 0x2e, 0x24, 0x22, 0x02, 0x32, 0xd3, 0xba, 0xe3, 0xfc, - 0x4d, 0x08, 0xa8, 0x27, 0xb9, 0x83, 0x7b, 0xa4, 0x14, 0x3f, 0xc4, 0x95, - 0x0c, 0x29, 0x7e, 0x02, 0xf6, 0xde, 0x6b, 0x6a, 0xff, 0x1f, 0x4d, 0x32, - 0xe9, 0xfb, 0x27, 0x48, 0xec, 0x7a, 0xf4, 0x96, 0xb1, 0x40, 0x86, 0x76, - 0xe7, 0x62, 0x44, 0x07, 0x00, 0x63, 0xa1, 0xa4, 0xed, 0x48, 0x50, 0x8a, - 0xd2, 0xf6, 0x1e, 0xc0, 0x90, 0x40, 0x51, 0x17, 0x30, 0xae, 0x92, 0x31, - 0x7e, 0xed, 0x92, 0x92, 0xef, 0x75, 0x99, 0xd2, 0x2f, 0x70, 0x11, 0xb8, - 0x35, 0xbe, 0xfb, 0x4a, 0x76, 0x07, 0xb0, 0x83, 0xe7, 0x02, 0xd4, 0xbe, - 0x33, 0xf5, 0xb0, 0x2d, 0x45, 0xa7, 0xa6, 0x42, 0x1c, 0x6e, 0x78, 0xa4, - 0xc8, 0x11, 0xd7, 0x3f, 0xf1, 0x00, 0xbb, 0x4b, 0x8e, 0x73, 0xda, 0x51, - 0x50, 0xb6, 0x88, 0xe3, 0x79, 0x12, 0xae, 0xe2, 0x95, 0xed, 0x16, 0xd3, - 0xa8, 0xab, 0x81, 0x69, 0x25, 0x16, 0x36, 0xcd, 0x32, 0xd6, 0xed, 0xbb, - 0x3a, 0xaf, 0xdd, 0x49, 0x98, 0xef, 0x50, 0xcc, 0x8f, 0xd0, 0xa7, 0x75, - 0xfe, 0xda, 0xd4, 0x1e, 0xb4, 0xee, 0x15, 0x34, 0xb8, 0xe7, 0x6c, 0x08, - 0x9d, 0x02, 0xe1, 0x33, 0xb1, 0xeb, 0x72, 0xdc, 0x79, 0xb4, 0xc2, 0x51, - 0xa4, 0x05, 0xca, 0x82, 0x1c, 0xcc, 0x7e, 0xc5, 0x27, 0xbf, 0xbf, 0xb3, - 0x0a, 0xb4, 0xfb, 0x18, 0xf3, 0x34, 0x47, 0x83, 0x25, 0x98, 0xba, 0xd9, - 0xeb, 0x83, 0x27, 0x70, 0x7b, 0x6e, 0x4a, 0xd9, 0x52, 0x8a, 0xcb, 0x5a, - 0xa8, 0x6e, 0xb3, 0x1b, 0x47, 0x8b, 0xd7, 0xa0, 0x39, 0x23, 0xff, 0x5b, - 0x74, 0x5a, 0x31, 0xe1, 0x36, 0x90, 0x9e, 0x91, 0x6c, 0xfd, 0x1f, 0xb2, - 0x07, 0x83, 0x28, 0x1c, 0x69, 0x6d, 0xef, 0xd8, 0x58, 0x04, 0xe2, 0xd6, - 0x1a, 0x27, 0x8f, 0x0b, 0x49, 0xdf, 0x19, 0xf5, 0xf4, 0x3c, 0x62, 0x38, - 0x55, 0x71, 0x2b, 0x87, 0xbf, 0x9c, 0x91, 0x1c, 0xbc, 0xe2, 0x18, 0xa9, - 0xb1, 0x2f, 0x66, 0x11, 0x34, 0x47, 0xeb, 0x40, 0xa3, 0x14, 0x21, 0x28, - 0x9f, 0x08, 0xfd, 0x58, 0xb5, 0x56, 0x06, 0xb4, 0xdc, 0xa4, 0xa1, 0x96, - 0xd4, 0x9a, 0x63, 0xe2, 0x2a, 0x46, 0x22, 0x26, 0x25, 0x60, 0x33, 0xc4, - 0x99, 0x83, 0xe0, 0xe2, 0x3a, 0xcd, 0x76, 0xdc, 0x96, 0x92, 0x3f, 0x9a, - 0x00, 0xee, 0x77, 0xb2, 0x19, 0x8a, 0x65, 0x63, 0x68, 0xac, 0x33, 0x84, - 0x70, 0x7d, 0x60, 0x4f, 0x31, 0x8d, 0x19, 0xec, 0x75, 0xe8, 0x86, 0xfb, - 0x98, 0xb8, 0x64, 0x5e, 0xa7, 0x79, 0xac, 0x54, 0x7c, 0xc1, 0xaa, 0x67, - 0x05, 0xb4, 0xe4, 0xed, 0x69, 0x67, 0x67, 0x5d, 0x89, 0xd7, 0x76, 0x7e, - 0x7f, 0xd1, 0x5f, 0xbd, 0xad, 0xf6, 0x78, 0x33, 0xb2, 0x45, 0xaa, 0xc4, - 0x91, 0x92, 0xb4, 0x15, 0x7b, 0x35, 0xe1, 0x2c, 0xdd, 0x44, 0xe5, 0xd3, - 0x6b, 0x28, 0x31, 0xdc, 0xe5, 0x29, 0xa8, 0xc4, 0x9b, 0x55, 0x53, 0x7f, - 0xf8, 0xf0, 0xe8, 0x5a, 0x19, 0xe1, 0xf2, 0xce, 0x37, 0xde, 0xdf, 0x7f, - 0x3a, 0x8e, 0x89, 0x4b, 0xad, 0xd6, 0x24, 0x1a, 0xac, 0x89, 0x7c, 0x12, - 0x1f, 0xa4, 0xe4, 0x01, 0xb1, 0xd0, 0x26, 0x9f, 0xca, 0x5c, 0x75, 0x08, - 0xae, 0x9b, 0x0e, 0x30, 0x64, 0xab, 0x7c, 0x02, 0x92, 0x2a, 0x33, 0x8b, - 0x30, 0xc1, 0x69, 0x11, 0xba, 0x0e, 0xbc, 0x15, 0x90, 0xc4, 0x00, 0xd2, - 0x9f, 0x57, 0x3a, 0x5e, 0xdc, 0x00, 0x17, 0xd3, 0x09, 0xe0, 0xd6, 0x77, - 0x5b, 0x17, 0x51, 0x8b, 0x9c, 0x77, 0xc6, 0xb4, 0x9b, 0x60, 0x3b, 0x4d, - 0x79, 0xb0, 0xe0, 0x47, 0xd2, 0xee, 0xf9, 0xf4, 0xa5, 0x1e, 0x7b, 0x37, - 0x47, 0xfd, 0x4a, 0x1b, 0xa4, 0x49, 0x7a, 0x80, 0x41, 0x0e, 0xfe, 0x72, - 0x0b, 0xc8, 0x24, 0x40, 0x68, 0xd1, 0x71, 0xdb, 0xfa, 0x27, 0x9d, 0x21, - 0x2d, 0xae, 0x38, 0xef, 0x50, 0x1f, 0x27, 0x52, 0xf2, 0xc0, 0x5a, 0xdf, - 0xab, 0x67, 0x66, 0x1d, 0x7e, 0x8b, 0x3d, 0xb2, 0xd3, 0x4f, 0xd4, 0x77, - 0xec, 0xb0, 0xc7, 0x81, 0x50, 0x82, 0x4b, 0xdf, 0x2f, 0x7e, 0xd1, 0x04, - 0xbf, 0xee, 0xda, 0xea, 0x9b, 0x58, 0x6f, 0x1c, 0x2a, 0xf4, 0x51, 0xfc, - 0x28, 0x1f, 0x22, 0x7b, 0xa3, 0x3b, 0x96, 0x05, 0x9c, 0x6d, 0x80, 0x39, - 0xfb, 0xa9, 0xcd, 0xe0, 0x1d, 0xaf, 0xed, 0xbd, 0xe7, 0xd0, 0x5d, 0x40, - 0x6e, 0xc2, 0x7c, 0xf4, 0x8a, 0x13, 0x62, 0xf6, 0x3a, 0xcc, 0xb8, 0x51, - 0xc2, 0x66, 0x1d, 0x68, 0x71, 0xbd, 0x87, 0x67, 0x53, 0x6a, 0xea, 0x00, - 0x5b, 0x72, 0xec, 0xf9, 0x14, 0xdc, 0x54, 0x11, 0x6e, 0x25, 0xd0, 0x5e, - 0x51, 0x0c, 0x89, 0x39, 0xe9, 0x6f, 0xd3, 0xe6, 0x87, 0x76, 0x59, 0x8d, - 0x60, 0x9b, 0xed, 0x99, 0x3b, 0xfc, 0xc1, 0xfe, 0x6d, 0x8f, 0x8a, 0x4b, - 0xb0, 0x8c, 0x9b, 0x43, 0xa2, 0xc5, 0xe5, 0x28, 0x64, 0x52, 0x81, 0x83, - 0xb7, 0x03, 0xb4, 0xd3, 0xe5, 0xd0, 0x5d, 0x40, 0x6e, 0xc2, 0x7c, 0xf4, - 0x8a, 0x13, 0x62, 0xf6, 0x3a, 0xcc, 0xb8, 0x51, 0xc2, 0x66, 0x1d, 0x68, - 0x71, 0xbd, 0x87, 0x67, 0x53, 0x6a, 0xea, 0x00, 0x5b, 0x72, 0xec, 0xf9, - 0x14, 0xdc, 0x54, 0x11, 0x6e, 0x25, 0xd0, 0x5e, 0x51, 0x0c, 0x89, 0x39, - 0xe9, 0x6f, 0xd3, 0xe6, 0x87, 0x76, 0x59, 0x8d, 0x60, 0x9b, 0xed, 0x99, - 0x3b, 0xfc, 0xc1, 0xfe, 0x6d, 0x8f, 0x8a, 0x4b, 0x0e, 0xfd, 0xc3, 0x32, - 0xff, 0x41, 0xa0, 0xc8, 0x84, 0x13, 0x5b, 0x5a, 0xf3, 0x39, 0x33, 0x0c, - 0x8d, 0xb4, 0xce, 0x5f, 0x47, 0x92, 0x96, 0x7b, 0x6f, 0x18, 0x57, 0x43, - 0x90, 0x5a, 0xb3, 0xd8, 0x6e, 0x4b, 0x3d, 0xa5, 0x11, 0x97, 0xab, 0xef, - 0x60, 0x02, 0x9b, 0x96, 0x9c, 0x1c, 0xd7, 0x32, 0x46, 0x1c, 0xeb, 0x33, - 0xd7, 0x85, 0x91, 0x58, 0x7e, 0x6c, 0xf0, 0xf8, 0x5e, 0x65, 0x31, 0x2e, - 0x31, 0xd4, 0x9b, 0x96, 0x27, 0xe7, 0x52, 0xcb, 0xd0, 0xd3, 0xd0, 0x8a, - 0x1b, 0xdb, 0x05, 0x50, 0xe1, 0x94, 0x17, 0x68, 0xbb, 0x3d, 0xd0, 0xba, - 0xad, 0xce, 0x99, 0x4c, 0x05, 0x8c, 0x5c, 0x04, 0xfb, 0x18, 0x48, 0x4f, - 0x95, 0xa6, 0x1d, 0x89, 0xb8, 0x01, 0x5d, 0x1b, 0x0f, 0x42, 0xf7, 0x65, - 0x6e, 0x9b, 0x80, 0x80, 0xed, 0x2e, 0x38, 0xc0, 0xad, 0x6f, 0xbc, 0x15, - 0x88, 0x30, 0xe2, 0xf9, 0xce, 0x3e, 0xa1, 0xec, 0x1a, 0xda, 0xfd, 0x86, - 0xc6, 0x21, 0xbf, 0x68, 0xd2, 0xc9, 0xb0, 0x59, 0xb6, 0x5e, 0x1b, 0xa4, - 0x03, 0x59, 0xd6, 0xb7, 0x94, 0x27, 0x0b, 0x08, 0xd6, 0x41, 0x21, 0x51, - 0xb7, 0xba, 0x9d, 0x71, 0x84, 0x63, 0x3e, 0xf5, 0x0e, 0x22, 0xdc, 0x9e, - 0x64, 0xab, 0xfd, 0x6b, 0x2e, 0x71, 0x3e, 0x72, 0x2e, 0xc2, 0xd6, 0xce, - 0x34, 0x0b, 0xd8, 0xf1, 0xd0, 0xa5, 0x26, 0x2e, 0xb2, 0xda, 0xa4, 0x8d, - 0xb1, 0xb0, 0x29, 0xea, 0xe7, 0xe2, 0x19, 0xc9, 0x2f, 0x77, 0x28, 0xdf, - 0x38, 0x03, 0x29, 0xb4, 0xdf, 0x71, 0x2f, 0xc7, 0x33, 0xa1, 0xb9, 0xf5, - 0x03, 0x69, 0xba, 0x3b, 0xae, 0xb7, 0xa9, 0xef, 0xda, 0xad, 0x34, 0xfa, - 0xaf, 0xbf, 0x44, 0xbb, 0x25, 0x77, 0x28, 0xdf, 0xfc, 0xa0, 0x3e, 0xa2, - 0x20, 0x13, 0xd2, 0x0d, 0xe0, 0xf7, 0x39, 0xdf, 0x4c, 0x74, 0x07, 0x8d, - 0xae, 0xb7, 0xa9, 0xed, 0xda, 0xad, 0x34, 0xfa, 0xaf, 0xbf, 0x44, 0xbb, - 0x25, 0x77, 0x28, 0xdf, 0x85, 0xd7, 0x7c, 0xed, 0xe5, 0xf4, 0x4f, 0xec, - 0x11, 0x62, 0x18, 0x34, 0x15, 0x4f, 0xea, 0x3e, 0xfe, 0x72, 0xae, 0x0e, - 0xea, 0x98, 0xed, 0x85, 0x8a, 0x77, 0xfa, 0x3f, 0x7e, 0x75, 0xe8, 0x96, - 0xda, 0x1e, 0x0a, 0xf3, 0x48, 0xff, 0xaa, 0x7a, 0xd9, 0x80, 0x1f, 0xc7, - 0x07, 0x23, 0xe7, 0x70, 0x71, 0x91, 0xe6, 0xff, 0x10, 0x4b, 0xe1, 0x86, - 0xd8, 0x96, 0x1f, 0xe2, 0xe6, 0x6d, 0x2d, 0x52, 0x5d, 0x54, 0x30, 0xed, - 0x50, 0xbe, 0xad, 0x6e, 0x58, 0xd7, 0xb3, 0x58, 0xf6, 0x5d, 0xb8, 0xe8, - 0x74, 0x91, 0x21, 0xf5, 0x4e, 0xef, 0xae, 0xfe, 0x5f, 0x9c, 0x13, 0x6f, - 0xaf, 0xf3, 0x5a, 0x61, 0x73, 0xb9, 0x56, 0x22, 0x27, 0x20, 0x1c, 0x72, - 0xce, 0x9c, 0x41, 0xf6, 0x47, 0xc2, 0x26, 0x46, 0x34, 0xcc, 0x70, 0xdf, - 0x44, 0xef, 0xae, 0xfe, 0x46, 0x81, 0x01, 0x69, 0xaf, 0xf3, 0x5a, 0x61, - 0x4e, 0x73, 0x51, 0xa9, 0x39, 0x8a, 0xa3, 0x00, 0x94, 0x5a, 0x55, 0x71, - 0xe2, 0x43, 0xfa, 0x51, 0x34, 0xcc, 0x70, 0xdf, 0x44, 0xef, 0xae, 0xfe, - 0x46, 0x81, 0x1e, 0x69, 0xaf, 0xf3, 0x5a, 0x61, 0x8c, 0xc1, 0x77, 0x83, - 0xeb, 0x5f, 0x49, 0x91, 0xbd, 0xa3, 0xda, 0x10, 0xf9, 0x1f, 0x6b, 0xe8, - 0xd5, 0xc0, 0xd6, 0x21, 0xfe, 0x87, 0x6d, 0x5e, 0x7f, 0x79, 0x11, 0x06, - 0x2f, 0x80, 0xc1, 0x3a, 0xdf, 0x5f, 0x65, 0x6a, 0x12, 0x34, 0x4c, 0x39, - 0xc6, 0x6c, 0x50, 0x9e, 0x0a, 0xc4, 0x6a, 0x4d, 0x8d, 0x17, 0x63, 0xf1, - 0x1f, 0xeb, 0x6e, 0x99, 0xa5, 0x44, 0xb0, 0x69, 0x54, 0xa5, 0xc1, 0x61, - 0x45, 0x1a, 0xbb, 0xab, 0x08, 0xed, 0xd7, 0x76, 0x53, 0xcd, 0x7d, 0x63, - 0x37, 0xd9, 0x91, 0x33, 0x85, 0xed, 0x87, 0xed, 0x3d, 0x2e, 0xb3, 0xa5, - 0xb5, 0xf9, 0xa3, 0x4f, 0x43, 0x70, 0x97, 0xf4, 0x19, 0x8f, 0x1a, 0x3c, - 0xeb, 0x5b, 0x49, 0xa2, 0xab, 0x03, 0x64, 0xe2, 0x6c, 0xf3, 0xa4, 0x03, - 0x0c, 0xf6, 0x3a, 0xfa, 0x99, 0xad, 0xcb, 0xe0, 0x80, 0xb5, 0x97, 0xe2, - 0x02, 0x82, 0x70, 0x05, 0xdf, 0x3c, 0x70, 0x93, 0x00, 0x7a, 0x7f, 0xc2, - 0xf4, 0xb9, 0xcd, 0x7c, 0xd7, 0x04, 0x8a, 0xe1, 0xee, 0xc9, 0x75, 0x7f, - 0xc7, 0x3f, 0xb5, 0x5d, 0xc9, 0xee, 0xaa, 0x5e, 0xab, 0x72, 0x2a, 0xb3, - 0x97, 0xb7, 0x60, 0xcb, 0x3b, 0x0d, 0xc7, 0x52, 0x2c, 0x18, 0x78, 0xd8, - 0x9a, 0x4e, 0xeb, 0x8d, 0x49, 0xac, 0xdf, 0x4b, 0x43, 0x4b, 0xf4, 0x43, - 0x82, 0x65, 0x8e, 0xbb, 0x1e, 0xc4, 0xa1, 0x1e, 0x5c, 0xa7, 0xcd, 0xb0, - 0x78, 0x68, 0x74, 0x2d, 0x1f, 0xc4, 0xe1, 0x2a, 0xc7, 0x61, 0xa0, 0x54, - 0x2e, 0xa5, 0xf2, 0x2e, 0x79, 0x64, 0x10, 0x65, 0x32, 0xc2, 0x88, 0x1a, - 0x49, 0xa7, 0xc5, 0x97, 0x92, 0x0d, 0x26, 0xc6, 0x6d, 0x26, 0x36, 0x85, - 0x4e, 0x5a, 0x27, 0x93, 0xea, 0x31, 0x65, 0x66, 0x0a, 0x22, 0xf6, 0x08, - 0x8d, 0xb2, 0x83, 0xd9, 0x52, 0xca, 0xdd, 0x23, 0x5d, 0xe9, 0xaf, 0x45, - 0x1e, 0xe0, 0xbc, 0x04, 0x5c, 0x00, 0x1a, 0x65, 0x32, 0xc7, 0x88, 0x1a, - 0x49, 0xa7, 0xc5, 0x97, 0xb2, 0x21, 0x26, 0xcb, 0x53, 0x45, 0x0e, 0x2c, - 0xdb, 0x05, 0x64, 0x46, 0xc5, 0xde, 0x99, 0x7c, 0xb3, 0x4e, 0xaa, 0x55, - 0x28, 0x18, 0x4b, 0x3d, 0x36, 0x77, 0xb0, 0xb4, 0xe5, 0xf2, 0x17, 0x3c, - 0x31, 0xec, 0x46, 0x2a, 0xa1, 0xc3, 0xae, 0x22, 0x7c, 0xeb, 0xa4, 0x3b, - 0x88, 0xba, 0x9e, 0x73, 0x0d, 0x12, 0x97, 0x4b, 0xe4, 0x9f, 0x46, 0x81, - 0xc5, 0x30, 0x7f, 0x3d, 0x74, 0xc9, 0x22, 0xa7, 0xd4, 0x0c, 0xbf, 0x76, - 0xcb, 0x64, 0x09, 0x72, 0x6f, 0xe7, 0x25, 0x70, 0x6d, 0x86, 0x2d, 0x9e, - 0xc1, 0xce, 0x70, 0x4e, 0x80, 0xf0, 0xa2, 0x8d, 0x08, 0xc8, 0x83, 0xd9, - 0x68, 0x25, 0xe4, 0xed, 0x9d, 0x50, 0x73, 0x89, 0xd2, 0x1b, 0xf9, 0xe6, - 0x26, 0x51, 0x59, 0xea, 0x67, 0x18, 0x9d, 0x82, 0xef, 0x80, 0x07, 0xb7, - 0x92, 0x46, 0x32, 0xf2, 0xb3, 0x27, 0x35, 0x51, 0x7f, 0x2e, 0x58, 0xcd, - 0x55, 0xb9, 0x5a, 0x19, 0xfd, 0x56, 0x55, 0x01, 0x37, 0x43, 0xe5, 0x25, - 0xfd, 0xf6, 0xcd, 0x87, 0x72, 0x10, 0x85, 0x1c, 0x3e, 0x09, 0x08, 0xbc, - 0xa7, 0xbd, 0x27, 0x9e, 0x0e, 0x56, 0xee, 0xc7, 0x5f, 0x37, 0xa2, 0x45, - 0x81, 0xac, 0x67, 0xbd, 0xf2, 0x58, 0x0e, 0x53, 0x7e, 0xc9, 0x22, 0xa7, - 0xfc, 0x18, 0xc9, 0xee, 0x82, 0x96, 0xec, 0x6e, 0xff, 0x0c, 0x08, 0xed, - 0x9c, 0x3b, 0xe3, 0xca, 0x59, 0xbd, 0x90, 0x63, 0xb9, 0x89, 0xef, 0x94, - 0x01, 0x89, 0xa6, 0x87, 0xb8, 0x90, 0x44, 0xf1, 0xd0, 0x38, 0x88, 0x34, - 0x8e, 0x5b, 0xb6, 0x5a, 0x12, 0xda, 0x29, 0xf1, 0xbb, 0x3b, 0x3c, 0xb5, - 0xb5, 0x30, 0x8f, 0x48, 0x52, 0xd1, 0x45, 0xac, 0x13, 0xaf, 0xd7, 0xb9, - 0x63, 0x04, 0xf6, 0x7c, 0xd0, 0x83, 0xbb, 0xde, 0xea, 0x3c, 0x31, 0x54, - 0xd3, 0xba, 0xa4, 0x0b, 0xd6, 0xcf, 0xa4, 0x04, 0x2d, 0xcc, 0x2c, 0xfa, - 0x77, 0xa7, 0xa8, 0xa9, 0x57, 0xb5, 0x01, 0xa6, 0x8b, 0x5c, 0xa3, 0xc4, - 0x64, 0x29, 0xd8, 0x69, 0xb1, 0x7a, 0x96, 0x4a, 0x17, 0xa4, 0x0d, 0xa5, - 0xf9, 0x2f, 0x78, 0x90, 0x5d, 0x1a, 0xc9, 0xb7, 0x55, 0x12, 0x66, 0x6e, - 0xa6, 0x0c, 0xd0, 0x09, 0x43, 0xe5, 0x54, 0x7d, 0x13, 0x2d, 0xfa, 0x8a, - 0x22, 0x3c, 0x5c, 0x36, 0x4e, 0x74, 0x7b, 0xea, 0x85, 0xe4, 0x42, 0x18, - 0x64, 0xaa, 0x0d, 0x6a, 0x1f, 0xa8, 0xf6, 0x6a, 0x03, 0x81, 0xc2, 0xe5, - 0x5b, 0xcc, 0x53, 0xe8, 0x37, 0x31, 0xab, 0xe5, 0x7b, 0x45, 0xca, 0xd1, - 0xcb, 0x33, 0x18, 0xa9, 0x6e, 0x50, 0x4b, 0xab, 0x73, 0xf7, 0x67, 0x8a, - 0x4b, 0x8a, 0x7f, 0x8e, 0xf6, 0x20, 0x75, 0xc8, 0x19, 0x58, 0x10, 0x85, - 0xe1, 0x82, 0xea, 0xe6, 0x60, 0x37, 0x99, 0xd9, 0x2f, 0x9b, 0x51, 0x8c, - 0xfd, 0x9c, 0x0f, 0xce, 0x48, 0x72, 0x80, 0x57, 0x53, 0x2e, 0x0e, 0xe4, - 0x4a, 0x0e, 0x51, 0x8c, 0x17, 0x84, 0xfb, 0x18, 0x84, 0xb5, 0x79, 0x1c, - 0x88, 0x92, 0x3f, 0x67, 0x43, 0x3a, 0x64, 0x36, 0xde, 0xd5, 0x38, 0x65, - 0xd6, 0xb7, 0xd2, 0x85, 0x81, 0xbf, 0x50, 0x82, 0x8c, 0x79, 0xaf, 0x68, - 0xe0, 0xbe, 0x36, 0x79, 0xde, 0x34, 0x05, 0x68, 0x73, 0x53, 0xbf, 0xb7, - 0x65, 0x46, 0xe9, 0xd6, 0xc0, 0x4e, 0xf8, 0x98, 0x7b, 0xe5, 0xbe, 0xbb, - 0x72, 0xec, 0xea, 0x5a, 0x62, 0x36, 0x96, 0xe2, 0xe3, 0xe6, 0x03, 0xac, - 0xfd, 0x87, 0x5c, 0x68, 0xd3, 0x27, 0x5c, 0xe9, 0x08, 0xde, 0xc9, 0xc1, - 0x9b, 0x55, 0x7e, 0x11, 0xbf, 0xb2, 0x37, 0x0f, 0x63, 0xd1, 0xe4, 0xce, - 0xcd, 0x6e, 0x5e, 0xbb, 0x79, 0x18, 0x0f, 0x10, 0x87, 0x4e, 0x67, 0x0d, - 0x51, 0x41, 0x84, 0xcd, 0x8b, 0x4a, 0x09, 0xe6, 0xa0, 0xd1, 0xc2, 0x25, - 0x38, 0x45, 0x4e, 0x0d, 0x19, 0xdb, 0xcf, 0xb0, 0xba, 0x8b, 0x10, 0xd8, - 0x8b, 0x13, 0x83, 0x2e, 0x67, 0x53, 0x8b, 0x15, 0x32, 0x6e, 0x53, 0x79, - 0x68, 0x09, 0x72, 0x20, 0xa0, 0x9c, 0xf6, 0x46, 0x7a, 0x33, 0xf0, 0xd0, - 0x66, 0x16, 0xfb, 0xc4, 0xd4, 0xc4, 0xe7, 0x8b, 0x24, 0xec, 0xfc, 0xc1, - 0x9d, 0x68, 0x81, 0xa2, 0xf5, 0xb7, 0x5b, 0x4e, 0x50, 0xb4, 0x36, 0x96, - 0x61, 0xd6, 0xcd, 0xad, 0xa3, 0xec, 0xaa, 0x95, 0x2f, 0xf9, 0xd4, 0xf3, - 0x81, 0x15, 0xf8, 0xcf, 0x57, 0xe7, 0x5f, 0xe5, 0xa1, 0x5c, 0x0e, 0xcd, - 0x52, 0x2a, 0xac, 0xfd, 0x3c, 0x2a, 0xb3, 0x24, 0x68, 0x0f, 0xb6, 0x24, - 0xf5, 0x03, 0x73, 0xa4, 0x99, 0x52, 0xca, 0xab, 0x9b, 0xb1, 0x1e, 0x52, - 0xb3, 0x1e, 0x76, 0x15, 0xd2, 0x4c, 0x24, 0x00, 0x5e, 0x1e, 0x29, 0xbd, - 0xd5, 0x67, 0xbb, 0x62, 0x6f, 0x72, 0xea, 0xb6, 0x89, 0xac, 0x6b, 0x02, - 0x00, 0xcc, 0x06, 0x0a, 0xd4, 0x95, 0x88, 0x90, 0x43, 0xaa, 0x04, 0xdd, - 0xf8, 0x21, 0xe1, 0x7f, 0x4f, 0xe4, 0xcd, 0xc6, 0xe9, 0x36, 0xe1, 0xfc, - 0xaa, 0x21, 0xc5, 0x2a, 0xfc, 0x66, 0xf5, 0x2e, 0x46, 0x4d, 0x88, 0x0c, - 0xcc, 0xb5, 0x72, 0x82, 0x30, 0x22, 0x0d, 0xde, 0xeb, 0xdf, 0x9e, 0x2e, - 0xb2, 0x29, 0x4d, 0x43, 0x38, 0xf0, 0x88, 0x42, 0x6a, 0x10, 0x8a, 0xc6, - 0xbe, 0x53, 0xde, 0x80, 0xdb, 0x0e, 0xcb, 0xb2, 0x6d, 0x51, 0xec, 0x07, - 0xeb, 0xaa, 0xbb, 0x93, 0x64, 0x33, 0xee, 0xec, 0x52, 0xd9, 0x89, 0x43, - 0x10, 0x9c, 0xc9, 0x24, 0xa0, 0xc2, 0x00, 0xa1, 0x1b, 0x06, 0x74, 0x8d, - 0xca, 0x0f, 0xbd, 0x0a, 0x64, 0x00, 0x9f, 0x8e, 0x01, 0xaa, 0xd5, 0x0a, - 0x5d, 0xed, 0x77, 0xfa, 0xa6, 0x5d, 0x36, 0x83, 0xb7, 0x2a, 0xca, 0xb4, - 0xf1, 0xab, 0x6e, 0x95, 0x17, 0x42, 0x57, 0x87, 0x9f, 0x42, 0xfc, 0x49, - 0x08, 0x1d, 0x8d, 0x88, 0x01, 0xaa, 0xd5, 0x0a, 0x6e, 0x34, 0x62, 0x57, - 0x40, 0xa0, 0x2f, 0xf9, 0x1d, 0x33, 0x3c, 0x3d, 0xa2, 0x33, 0x12, 0x9b, - 0x17, 0x42, 0x57, 0x87, 0x9f, 0x42, 0xfc, 0x49, 0x08, 0x1d, 0x92, 0x88, - 0x01, 0xaa, 0xd5, 0x0a, 0xe3, 0xbb, 0x78, 0x84, 0x7c, 0xf1, 0xeb, 0x37, - 0x6f, 0xf6, 0x92, 0x0f, 0x75, 0xfa, 0x17, 0x5c, 0x92, 0x0c, 0x30, 0x51, - 0xd3, 0x5e, 0xc0, 0xe8, 0x95, 0x00, 0x9b, 0x56, 0x39, 0x65, 0x82, 0xce, - 0x38, 0x68, 0xf5, 0xe5, 0x06, 0xc2, 0xfa, 0x44, 0xb9, 0x89, 0x18, 0x32, - 0x10, 0x0f, 0x84, 0x43, 0xfc, 0x6b, 0x9a, 0x89, 0xf8, 0x17, 0xf0, 0x1f, - 0x06, 0xfc, 0x59, 0x1f, 0xd4, 0xb3, 0x77, 0xfb, 0x74, 0x75, 0x8a, 0x9e, - 0xad, 0xc2, 0x98, 0x6f, 0x45, 0x74, 0x2b, 0xab, 0xe0, 0x87, 0xe1, 0x99, - 0xdf, 0x2e, 0x7d, 0x98, 0x2a, 0x5c, 0x8e, 0x86, 0x92, 0xba, 0x83, 0xcb, - 0xbe, 0xa3, 0xd2, 0x36, 0x58, 0x45, 0x5a, 0x8b, 0x42, 0xfc, 0xcc, 0x24, - 0x31, 0xee, 0x0a, 0x7e, 0x9a, 0xcb, 0x65, 0x1d, 0x68, 0x54, 0x7a, 0x02, - 0x41, 0xdc, 0x4d, 0xdc, 0xd4, 0x80, 0xab, 0xee, 0x2c, 0x60, 0x13, 0x26, - 0x74, 0x05, 0x09, 0x40, 0xf6, 0xd0, 0x54, 0x15, 0xfc, 0x60, 0xc9, 0x49, - 0x7f, 0xa9, 0x65, 0x5d, 0x04, 0x85, 0xaa, 0xe4, 0x54, 0xd5, 0x23, 0x04, - 0xc4, 0xd0, 0x66, 0x2d, 0xc2, 0x4f, 0x03, 0x97, 0x21, 0xc5, 0x87, 0xdc, - 0xee, 0x4b, 0x0e, 0xf5, 0x22, 0x09, 0x3b, 0xb4, 0x9a, 0x38, 0x02, 0xa9, - 0xbe, 0x45, 0xb9, 0x5e, 0x4b, 0x8c, 0xed, 0x1f, 0x62, 0xac, 0xc8, 0xe5, - 0x6e, 0x10, 0x7c, 0x9a, 0x3e, 0x3a, 0x5a, 0x21, 0xa9, 0xf7, 0x60, 0xe7, - 0xa4, 0xa1, 0x79, 0x38, 0x24, 0x15, 0xda, 0x75, 0x0b, 0x9e, 0x3c, 0x96, - 0x27, 0x7a, 0x88, 0xb5, 0xb8, 0x45, 0xde, 0xcc, 0x93, 0x72, 0x6b, 0x74, - 0x79, 0xac, 0xd8, 0xb1, 0x2e, 0xd9, 0x48, 0xa4, 0xa0, 0xa5, 0xc6, 0x51, - 0x9c, 0xad, 0xee, 0x24, 0xe4, 0x0c, 0x4b, 0x66, 0xc9, 0xf8, 0x5b, 0x94, - 0x1d, 0x37, 0x56, 0x7a, 0xd4, 0xd0, 0xd1, 0x84, 0xf4, 0x64, 0x0b, 0x20, - 0xcb, 0x24, 0x87, 0x1d, 0xc7, 0xa2, 0xfe, 0x10, 0xee, 0xb3, 0x24, 0x17, - 0x0f, 0x0d, 0x70, 0x35, 0x24, 0x49, 0x6d, 0x12, 0xf3, 0xc9, 0xc6, 0xa7, - 0x4e, 0x79, 0x19, 0x57, 0x10, 0x9b, 0x7a, 0x00, 0x04, 0xc0, 0xe4, 0x67, - 0x4e, 0x59, 0x86, 0x8b, 0xe0, 0x47, 0xa8, 0xe7, 0x0f, 0x66, 0x85, 0x6d, - 0x9e, 0x4d, 0xec, 0x2d, 0x0f, 0x9d, 0x5b, 0x00, 0x36, 0x30, 0xe1, 0xef, - 0xf1, 0x3d, 0x6e, 0x51, 0xa7, 0x50, 0x8b, 0x92, 0xd4, 0xec, 0xfa, 0x3c, - 0x59, 0x06, 0xca, 0xb2, 0x6b, 0xbf, 0xec, 0x38, 0x23, 0x29, 0x10, 0x68, - 0x2e, 0x20, 0x4f, 0x82, 0x33, 0x7e, 0xde, 0x14, 0x4c, 0x2e, 0x5f, 0x7d, - 0x8f, 0x52, 0xca, 0x95, 0x75, 0x79, 0x56, 0xce, 0x8c, 0xff, 0xed, 0x03, - 0xa6, 0x95, 0x28, 0x24, 0x54, 0x26, 0xb0, 0x19, 0xcc, 0xe1, 0x33, 0x1f, - 0xb6, 0xe4, 0x56, 0xaf, 0xef, 0x77, 0xb0, 0xed, 0x64, 0x64, 0x05, 0x3b, - 0x11, 0x7a, 0x0b, 0xc4, 0x84, 0x30, 0x6d, 0xf4, 0x2a, 0x1a, 0x9d, 0x19, - 0xdb, 0x9a, 0x2e, 0xda, 0x7b, 0x3a, 0x24, 0x72, 0xf9, 0x95, 0x8c, 0x6e, - 0xf7, 0x47, 0x63, 0x5f, 0x79, 0xea, 0x42, 0x3a, 0x64, 0x60, 0x62, 0xd2, - 0x32, 0x74, 0x98, 0x2a, 0x64, 0x72, 0xc2, 0xb2, 0x2a, 0x68, 0x53, 0x2b, - 0xae, 0xcc, 0x43, 0x1d, 0xe9, 0x9f, 0xa1, 0x4c, 0xe5, 0x7b, 0x8d, 0xab, - 0x80, 0xee, 0xde, 0x32, 0x12, 0x35, 0xb2, 0xf2, 0xda, 0x87, 0x7e, 0xd9, - 0x31, 0x87, 0xc1, 0x1b, 0xa8, 0xd9, 0x68, 0x88, 0xae, 0x3a, 0x02, 0x7e, - 0xb4, 0x6e, 0x81, 0x20, 0x9d, 0x18, 0x92, 0x27, 0xd9, 0xaf, 0x0d, 0xfd, - 0xee, 0x3e, 0x35, 0x11, 0x24, 0xdc, 0xdd, 0x0a, 0xc0, 0xc9, 0x77, 0xda, - 0xfe, 0x8d, 0x8e, 0xf2, 0xd7, 0xbf, 0xcf, 0x43, 0xac, 0xff, 0xe1, 0x9e, - 0x97, 0x44, 0x3e, 0x51, 0xa7, 0xe8, 0xf6, 0x2b, 0xf2, 0x83, 0x3c, 0x42, - 0x08, 0x52, 0xd4, 0xe9, 0x35, 0xee, 0xa1, 0xba, 0xaf, 0x36, 0x5f, 0x2b, - 0x63, 0x16, 0xbf, 0xf2, 0x09, 0x68, 0xd9, 0x86, 0x26, 0x03, 0xe8, 0x1b, - 0x7d, 0x1d, 0xcd, 0x28, 0x68, 0xcc, 0x25, 0xd9, 0x46, 0xce, 0x80, 0xcd, - 0xc9, 0xb2, 0x03, 0xe2, 0x29, 0x44, 0x84, 0x8c, 0xef, 0x73, 0x40, 0xc3, - 0x00, 0x87, 0x8a, 0xd9, 0xc5, 0x02, 0x57, 0xa2, 0x9c, 0xa6, 0x02, 0x04, - 0xba, 0xef, 0x67, 0x1f, 0x13, 0xa0, 0x34, 0xc1, 0x57, 0x85, 0x89, 0x70, - 0x98, 0x1c, 0x76, 0x73, 0x63, 0x1f, 0x51, 0x4c, 0x01, 0x99, 0x11, 0x31, - 0x89, 0x73, 0xfe, 0xaa, 0x80, 0x24, 0xfd, 0x66, 0x79, 0xf7, 0x98, 0x3a, - 0x23, 0xac, 0x81, 0xba, 0x5d, 0x07, 0x82, 0x88, 0x88, 0x77, 0xfd, 0x2d, - 0x6c, 0xad, 0x15, 0xbf, 0x02, 0x4d, 0xc8, 0x38, 0xab, 0xfc, 0x21, 0x49, - 0x48, 0x29, 0xd7, 0x9f, 0xcd, 0x98, 0x30, 0xec, 0xcd, 0xe5, 0x45, 0x80, - 0x2a, 0xff, 0x9d, 0x9c, 0x3c, 0x22, 0xa9, 0x68, 0x1c, 0x9a, 0xc7, 0x31, - 0x32, 0x73, 0x2a, 0xd6, 0x5f, 0x93, 0x04, 0x90, 0x47, 0xa1, 0x7c, 0x56, - 0xaf, 0x81, 0xe6, 0xed, 0x75, 0x50, 0xe6, 0x8b, 0x7d, 0xff, 0x0b, 0x7b, - 0x3d, 0x11, 0xc9, 0x03, 0xd0, 0x78, 0x9a, 0x07, 0xa1, 0xab, 0xf3, 0x2b, - 0xab, 0x64, 0x9e, 0xee, 0x96, 0xad, 0x2e, 0xdc, 0x1f, 0x94, 0x5f, 0x85, - 0x71, 0x66, 0xe9, 0x08, 0xef, 0x60, 0x8a, 0xbd, 0xbc, 0x4b, 0x3e, 0x41, - 0xd7, 0x1c, 0x08, 0x43, 0x32, 0x35, 0x4b, 0x0f, 0x9f, 0xbe, 0x5c, 0x27, - 0x88, 0xd2, 0x69, 0x2e, 0xba, 0x08, 0xba, 0xee, 0x6e, 0x9e, 0x05, 0xe8, - 0x14, 0x77, 0xda, 0x1a, 0x43, 0x67, 0x61, 0x01, 0x12, 0x4d, 0xb4, 0xda, - 0x97, 0x86, 0x9c, 0xd9, 0x21, 0x7d, 0x91, 0x6e, 0x8d, 0x7d, 0x92, 0x61, - 0x7a, 0x44, 0xce, 0x03, 0x45, 0x7f, 0xf6, 0x11, 0xa6, 0x7c, 0x8d, 0x84, - 0x89, 0xde, 0x0f, 0x2c, 0x0b, 0x3e, 0x16, 0x57, 0x9c, 0x40, 0x21, 0xd1, - 0x20, 0x26, 0x52, 0x30, 0x8e, 0x8f, 0x00, 0xb3, 0x09, 0x19, 0xcc, 0x14, - 0x93, 0x2f, 0x3b, 0x93, 0xad, 0x76, 0x6e, 0xd2, 0xa3, 0x8e, 0x4f, 0x82, - 0x84, 0x8a, 0x68, 0x81, 0x71, 0xb9, 0x38, 0xbd, 0x35, 0xaf, 0xdb, 0x7e, - 0x7a, 0x7d, 0x84, 0x6e, 0x79, 0x3d, 0xa4, 0xcc, 0x73, 0xaa, 0xb1, 0x26, - 0xda, 0x7d, 0x4a, 0xee, 0x3d, 0x31, 0x9e, 0x7b, 0x88, 0x85, 0x87, 0xc5, - 0x59, 0x59, 0x2f, 0xe9, 0x98, 0x61, 0xdb, 0xa0, 0x97, 0x4c, 0x6c, 0x50, - 0x9f, 0xe4, 0x5a, 0xf0, 0x05, 0x08, 0xbd, 0xdf, 0x59, 0xc3, 0x49, 0x0d, - 0x8a, 0x42, 0x4b, 0xf6, 0x19, 0xd6, 0x6c, 0xdd, 0x53, 0x35, 0x3d, 0x21, - 0xeb, 0x08, 0x1d, 0x3b, 0xe5, 0x06, 0x81, 0xf4, 0x41, 0x2b, 0x8c, 0x7d, - 0x84, 0xd0, 0x6d, 0x62, 0x59, 0x75, 0x25, 0x38, 0x97, 0xd1, 0x3e, 0xc1, - 0xf8, 0x49, 0x03, 0x79, 0x5c, 0xc1, 0xfe, 0x23, 0xed, 0x49, 0x0d, 0x98, - 0x6c, 0x8d, 0x7c, 0x8a, 0x2f, 0xa2, 0x0e, 0xaf, 0x90, 0xc7, 0x54, 0x64, - 0xd3, 0x5b, 0x72, 0x5d, 0xb7, 0xe2, 0x91, 0x32, 0xa1, 0xd7, 0x6c, 0x42, - 0x14, 0x5b, 0xd4, 0xe9, 0x84, 0x21, 0xc6, 0x4c, 0x25, 0x94, 0x51, 0x86, - 0x22, 0x92, 0xf7, 0x35, 0x85, 0xf1, 0xc9, 0xb1, 0xe4, 0x71, 0xba, 0xe8, - 0x12, 0xb9, 0x4e, 0xfe, 0xfa, 0xe2, 0xe1, 0x33, 0xb2, 0x71, 0x23, 0x74, - 0xca, 0x8d, 0x5e, 0x34, 0xfc, 0x74, 0xc2, 0xf9, 0xf4, 0x64, 0x36, 0xdf, - 0x99, 0x8d, 0x09, 0xf4, 0x77, 0x61, 0xb8, 0x30, 0x79, 0x19, 0x56, 0xff, - 0xb6, 0xd9, 0x60, 0x93, 0xb8, 0xda, 0xbc, 0x6a, 0x13, 0xb2, 0xae, 0x56, - 0x88, 0x3d, 0x26, 0x57, 0xa4, 0xc8, 0x65, 0xa5, 0x5c, 0x4e, 0x25, 0x5d, - 0x07, 0xa0, 0x04, 0x5c, 0xf1, 0x97, 0xc8, 0xcf, 0xde, 0xdc, 0x77, 0xc3, - 0x8e, 0x66, 0x2c, 0x28, 0xd9, 0xec, 0xf4, 0x19, 0x37, 0xad, 0x0e, 0x8f, - 0x64, 0x40, 0x00, 0x30, 0x19, 0x24, 0x8d, 0xf6, 0x0d, 0xaf, 0xb6, 0x6c, - 0xe6, 0xd0, 0xa9, 0x02, 0x4d, 0x5b, 0x92, 0x20, 0x8c, 0xa9, 0xf0, 0x27, - 0x44, 0xa9, 0x82, 0xd7, 0x82, 0x47, 0x9d, 0x00, 0xee, 0x4a, 0x6f, 0xfa, - 0x5b, 0xd3, 0xbf, 0xc9, 0x1f, 0xcc, 0xb6, 0xaa, 0x51, 0x55, 0x82, 0xde, - 0x44, 0xa6, 0x97, 0xec, 0xaf, 0x17, 0x8c, 0xad, 0x3f, 0x5f, 0x9e, 0x92, - 0xf8, 0x87, 0x2b, 0x28, 0xac, 0x65, 0x27, 0x8d, 0x96, 0x36, 0x5d, 0xea, - 0x81, 0x9f, 0xb1, 0x80, 0xe7, 0x8d, 0x71, 0xc2, 0x3f, 0xe7, 0xb8, 0xd4, - 0x99, 0xbe, 0xf2, 0x8f, 0x19, 0xc9, 0x97, 0x32, 0x24, 0x55, 0x67, 0x10, - 0xf9, 0x18, 0x89, 0xe5, 0x1d, 0xa6, 0xc2, 0x55, 0xfc, 0xf7, 0x68, 0x61, - 0x4c, 0x50, 0x95, 0x54, 0x32, 0x94, 0x3b, 0xa8, 0xa7, 0x75, 0x73, 0xc2, - 0xd3, 0x89, 0x76, 0x6e, 0x7f, 0x13, 0x5a, 0xf7, 0x8a, 0x1e, 0xb5, 0x4a, - 0x07, 0x73, 0x5f, 0x40, 0xaa, 0x11, 0xe6, 0xda, 0xdf, 0xe0, 0x4a, 0xe9, - 0x2e, 0xa7, 0xac, 0xce, 0x40, 0x1d, 0xc2, 0x84, 0x03, 0xa8, 0x14, 0xf3, - 0x4c, 0x56, 0xb0, 0x8b, 0x0c, 0x1f, 0xf2, 0x19, 0x9d, 0x74, 0x82, 0x83, - 0x44, 0x3b, 0x1f, 0x19, 0xd1, 0x47, 0xbb, 0x9d, 0x19, 0x74, 0xb6, 0x95, - 0x0b, 0xbe, 0x2f, 0x7f, 0x00, 0x5a, 0x23, 0xd5, 0x4b, 0x07, 0xcd, 0x54, - 0xbf, 0x9a, 0xb8, 0xe5, 0x50, 0x7e, 0x65, 0xe2, 0x69, 0x64, 0x1a, 0x6a, - 0x30, 0x0f, 0x80, 0xb8, 0x22, 0x1e, 0xf1, 0x8c, 0x23, 0x42, 0xcc, 0x18, - 0x1d, 0x37, 0xfd, 0x19, 0x71, 0xc1, 0x64, 0xfb, 0x9d, 0xbe, 0x49, 0x46, - 0x1f, 0xa9, 0xdc, 0x2c, 0x61, 0xdd, 0x53, 0xf0, 0xd7, 0xb2, 0x11, 0xba, - 0x72, 0x92, 0x47, 0xa2, 0xce, 0x79, 0xaa, 0x81, 0x6c, 0x31, 0x1e, 0xf9, - 0xea, 0x0b, 0x8f, 0x27, 0xaf, 0xe1, 0x54, 0xca, 0xe1, 0xf0, 0xf5, 0x96, - 0x2e, 0x52, 0x97, 0x62, 0xbd, 0xf3, 0x3e, 0x85, 0x80, 0x12, 0x80, 0x39, - 0xb1, 0xcb, 0x3e, 0x89, 0x21, 0xd1, 0x40, 0x16, 0x4c, 0x1a, 0xcb, 0xb4, - 0xec, 0xe0, 0xc4, 0xac, 0x0d, 0xf9, 0x03, 0x86, 0xbe, 0x3f, 0xcf, 0x43, - 0xd9, 0x5b, 0x95, 0xfb, 0x72, 0xe6, 0xd3, 0x3f, 0x6b, 0xd0, 0x5c, 0xc3, - 0x0a, 0x70, 0x5b, 0x58, 0x9c, 0xa2, 0x83, 0xf5, 0x7b, 0x7c, 0x57, 0xed, - 0x74, 0x9d, 0x67, 0x91, 0x5f, 0x2d, 0xcc, 0x91, 0x5e, 0x00, 0x2c, 0x1d, - 0x49, 0x3d, 0x14, 0x8c, 0x18, 0x3f, 0x0a, 0x0c, 0xd8, 0x44, 0x01, 0xff, - 0xb4, 0x2f, 0x14, 0xf2, 0x24, 0x69, 0x17, 0xde, 0xad, 0x6d, 0x52, 0x51, - 0xa7, 0xf2, 0x50, 0xf3, 0x20, 0xd1, 0x74, 0x95, 0x01, 0xf8, 0xda, 0x96, - 0x29, 0xa4, 0x31, 0xf7, 0x19, 0x68, 0xe9, 0x70, 0x60, 0x58, 0x2b, 0xe5, - 0x10, 0x67, 0x96, 0x63, 0xa1, 0x28, 0x24, 0xfc, 0x75, 0x81, 0x91, 0x81, - 0xbc, 0x73, 0x6b, 0xdd, 0xcc, 0xc4, 0x3b, 0x90, 0xf7, 0x8e, 0x77, 0xd3, - 0xbb, 0x8f, 0x90, 0xd0, 0x56, 0xd6, 0x5b, 0xb9, 0xe5, 0x29, 0xcf, 0x7d, - 0xb1, 0x85, 0xf8, 0xef, 0xc5, 0x0c, 0x38, 0x7b, 0x52, 0x82, 0x5e, 0x41, - 0x7c, 0x54, 0x7d, 0x64, 0x49, 0x8a, 0xe5, 0xe0, 0x8b, 0x2f, 0x13, 0x61, - 0x6e, 0xdb, 0x40, 0xb8, 0x32, 0x73, 0x61, 0x9c, 0x70, 0x0a, 0x94, 0x7c, - 0x43, 0x01, 0xe0, 0x0e, 0x62, 0x77, 0xdb, 0x36, 0xe4, 0x78, 0x9a, 0x66, - 0x37, 0xb6, 0x22, 0x09, 0x7b, 0x1c, 0x42, 0x40, 0x71, 0x15, 0x43, 0xe2, - 0x01, 0x1b, 0x87, 0xa0, 0x73, 0xc1, 0xbb, 0x3e, 0xaa, 0x08, 0x97, 0xce, - 0x68, 0x53, 0xb9, 0x6c, 0xf3, 0x35, 0x32, 0xd6, 0x78, 0x39, 0xf7, 0x0e, - 0xb8, 0x38, 0x80, 0xc3, 0x19, 0xa0, 0xf0, 0xef, 0xbe, 0x5f, 0xc5, 0xac, - 0x33, 0x76, 0x74, 0xe5, 0x65, 0x43, 0x33, 0x24, 0xe5, 0xf3, 0x78, 0xc6, - 0xa1, 0xa0, 0x0a, 0xfb, 0xd4, 0x79, 0x4a, 0xcf, 0x95, 0x61, 0x89, 0xc0, - 0x05, 0x0b, 0xd7, 0x43, 0x22, 0xa6, 0x86, 0xfa, 0x11, 0x69, 0x78, 0xa2, - 0x36, 0xc7, 0x83, 0xf4, 0xfd, 0xb8, 0x26, 0xdc, 0x60, 0xed, 0xa8, 0x0b, - 0x0d, 0xef, 0xdc, 0xf4, 0xad, 0xe5, 0x50, 0xd2, 0xfc, 0x5f, 0x19, 0x44, - 0xef, 0xe4, 0x6b, 0x82, 0xd5, 0x5d, 0xbb, 0xe8, 0x37, 0x47, 0x58, 0x6f, - 0xa3, 0xda, 0xdf, 0x5a, 0xf6, 0x38, 0x19, 0xd1, 0xa1, 0x9d, 0x61, 0xa5, - 0xa5, 0x0a, 0x2a, 0xd2, 0x55, 0xea, 0x1b, 0xb0, 0x36, 0x7e, 0x12, 0xee, - 0xe7, 0xed, 0x68, 0x2d, 0xe9, 0x37, 0xef, 0x95, 0xfd, 0x7b, 0x8d, 0x68, - 0x40, 0xf9, 0xa5, 0xc7, 0xc2, 0xd3, 0x66, 0x45, 0x17, 0x74, 0xc1, 0xf3, - 0xe9, 0xb9, 0x1a, 0x8c, 0xfb, 0xc3, 0x97, 0x44, 0x0b, 0xfc, 0x16, 0x92, - 0x43, 0xbb, 0x61, 0xe2, 0x57, 0x9d, 0x5f, 0x6b, 0x1f, 0x5d, 0xd8, 0x9b, - 0xfb, 0xff, 0x62, 0xd7, 0x0e, 0x66, 0x15, 0xd8, 0x1c, 0x9a, 0x95, 0x84, - 0x19, 0xd3, 0x72, 0xa6, 0xbb, 0x12, 0x04, 0xd8, 0xb0, 0x46, 0x87, 0x7f, - 0x5b, 0xe6, 0x94, 0x85, 0x2a, 0xc7, 0x08, 0xdf, 0x3b, 0xbd, 0xd8, 0x70, - 0x4b, 0x12, 0x5a, 0xd4, 0xe0, 0xad, 0x80, 0x85, 0xbf, 0xea, 0x80, 0x83, - 0xd8, 0x84, 0x5f, 0xdb, 0x11, 0x02, 0x26, 0x5b, 0x48, 0x6e, 0x36, 0xc3, - 0xef, 0x16, 0xc9, 0xd0, 0x95, 0x40, 0xc2, 0xb0, 0x3e, 0xc0, 0x22, 0xde, - 0xa0, 0x19, 0x34, 0x34, 0xde, 0x70, 0x66, 0x64, 0x05, 0x2d, 0x44, 0x9f, - 0x3b, 0xd2, 0x4f, 0x22, 0x84, 0x01, 0x8e, 0x8d, 0xd8, 0x2e, 0x6a, 0xb5, - 0x82, 0x1b, 0xaa, 0xcd, 0x97, 0xb3, 0xb2, 0xda, 0x68, 0x2c, 0x66, 0x20, - 0x61, 0xb8, 0x30, 0x4e, 0x32, 0xa9, 0x4c, 0x44, 0x75, 0xaf, 0xfd, 0xd2, - 0xb1, 0x55, 0xa9, 0x93, 0xa8, 0x7f, 0x15, 0xd9, 0xa5, 0x7c, 0xa8, 0x25, - 0xec, 0x33, 0x71, 0x89, 0xb6, 0x59, 0x49, 0xa7, 0x82, 0x46, 0x63, 0xcd, - 0xf5, 0x5b, 0x45, 0x97, 0x3b, 0xfe, 0xd2, 0xc9, 0xa8, 0xcd, 0xbd, 0x20, - 0x76, 0xe3, 0xf6, 0xdd, 0xfd, 0xc1, 0xd3, 0x3b, 0x00, 0xb4, 0xa8, 0x46, - 0xf4, 0x21, 0xf3, 0x7c, 0x63, 0x80, 0x6c, 0x6b, 0x24, 0x7c, 0x3a, 0x47, - 0x38, 0x35, 0x24, 0x65, 0xc6, 0x06, 0xa7, 0x64, 0xee, 0x97, 0xd3, 0xd1, - 0x6f, 0xd0, 0xc0, 0x3f, 0x53, 0x0a, 0x75, 0x83, 0x38, 0x40, 0x74, 0x17, - 0x59, 0xbd, 0x5a, 0x32, 0x4a, 0x7f, 0x56, 0xcb, 0x60, 0x60, 0xe4, 0x38, - 0x37, 0x31, 0x81, 0x58, 0xe1, 0xcd, 0xb7, 0xe9, 0x0d, 0x9e, 0x08, 0xbb, - 0xaf, 0x10, 0x9e, 0x2d, 0xbb, 0x7e, 0x11, 0x19, 0x95, 0x80, 0xef, 0xc1, - 0xc6, 0x44, 0xd2, 0x14, 0xd0, 0x28, 0xba, 0x1b, 0x21, 0x5d, 0x61, 0xfb, - 0x61, 0x9c, 0xe4, 0x2f, 0xbc, 0x5b, 0x9b, 0x5b, 0x3e, 0xc0, 0x22, 0xde, - 0xa0, 0x19, 0x34, 0x34, 0xde, 0x70, 0x66, 0x64, 0x55, 0xb9, 0x44, 0x9f, - 0x11, 0x02, 0x26, 0x5b, 0x48, 0x6e, 0x36, 0xc3, 0xef, 0x16, 0xc9, 0xd0, - 0xcd, 0xd4, 0xc2, 0xb0, 0x42, 0x90, 0xa2, 0xb2, 0xec, 0xc5, 0xc7, 0xc5, - 0x3b, 0x34, 0x47, 0xb7, 0x89, 0x74, 0x66, 0x25, 0xcc, 0x3c, 0x4f, 0xf7, - 0xcc, 0x19, 0x15, 0x13, 0x38, 0xdf, 0x74, 0x3a, 0x06, 0x06, 0x63, 0xf7, - 0x7d, 0xa6, 0x9b, 0xc5, 0x5d, 0xbb, 0xce, 0x86, 0x51, 0xe0, 0x25, 0x05, - 0xfb, 0x42, 0xa1, 0x33, 0x8f, 0x35, 0x3d, 0x5c, 0xfd, 0xfc, 0x4b, 0x49, - 0xea, 0xe3, 0x80, 0x8f, 0xc0, 0xb2, 0xb1, 0x0f, 0x01, 0x66, 0x9f, 0x8f, - 0x23, 0xc3, 0xf2, 0xbd, 0xdb, 0xf8, 0xd2, 0xc1, 0x20, 0x1a, 0xaa, 0x3d, - 0xed, 0xbf, 0x06, 0x91, 0xed, 0xd1, 0x64, 0x15, 0x56, 0x8a, 0x59, 0x05, - 0x34, 0xd2, 0xce, 0x49, 0xf1, 0x44, 0x3d, 0x96, 0xa0, 0x98, 0x50, 0xdc, - 0xae, 0x71, 0x3a, 0xe4, 0xd8, 0xf7, 0xc3, 0x8d, 0xab, 0xb5, 0x2d, 0x59, - 0x4d, 0xd6, 0x14, 0x1a, 0x03, 0x9a, 0xfb, 0xd5, 0x9b, 0x04, 0xda, 0xc6, - 0xa3, 0x36, 0xf3, 0xab, 0xe5, 0x14, 0xe2, 0xf8, 0x36, 0xab, 0x3e, 0xa6, - 0x78, 0xab, 0x53, 0x03, 0xba, 0x27, 0xf9, 0x18, 0xc5, 0x94, 0x00, 0xcb, - 0x31, 0x1c, 0x17, 0x3f, 0x60, 0xa2, 0x34, 0x74, 0x2c, 0x37, 0x36, 0xaf, - 0x8b, 0x3f, 0x38, 0x31, 0xe4, 0x58, 0xc9, 0x1d, 0x11, 0xc3, 0x59, 0xb9, - 0x3e, 0xda, 0xdf, 0x6c, 0x7d, 0x6a, 0x1b, 0xfc, 0x25, 0x95, 0xa1, 0xd9, - 0x1a, 0x03, 0x05, 0x6a, 0x81, 0xa6, 0xc5, 0x6b, 0x9f, 0x5d, 0x2b, 0xca, - 0xe4, 0xf8, 0x0d, 0xbf, 0x05, 0x13, 0xa0, 0x3c, 0xc0, 0xa6, 0x23, 0xe0, - 0x56, 0x6d, 0xf5, 0x3e, 0x61, 0xbb, 0x76, 0xfb, 0x65, 0xb0, 0x05, 0x10, - 0xdd, 0xe6, 0xf2, 0x51, 0x91, 0xa2, 0x93, 0xff, 0xc4, 0x6e, 0xc8, 0x37, - 0xce, 0xb5, 0x83, 0x6c, 0xc1, 0x21, 0x62, 0x64, 0x22, 0x08, 0x0b, 0x38, - 0x38, 0x57, 0xb6, 0x83, 0x7d, 0xd7, 0xd6, 0xb1, 0xc7, 0x45, 0x02, 0x5b, - 0x34, 0x37, 0x45, 0x6f, 0x57, 0xae, 0xc2, 0x55, 0x6e, 0xfa, 0x4c, 0x94, - 0x43, 0xe8, 0x6d, 0xa4, 0x38, 0x7f, 0x62, 0xb4, 0x80, 0xaa, 0x3e, 0x3a, - 0x0c, 0x85, 0xcb, 0xa7, 0x21, 0xa1, 0xbb, 0xa0, 0x48, 0x47, 0xff, 0xf9, - 0x7a, 0x78, 0x39, 0x12, 0xa1, 0x3b, 0x90, 0xc1, 0xcf, 0xc3, 0x04, 0x14, - 0x18, 0x3e, 0x78, 0xdc, 0x39, 0xac, 0x17, 0xd7, 0xbd, 0xc1, 0x18, 0x6a, - 0x79, 0x13, 0x8a, 0x4e, 0x79, 0xcb, 0xbc, 0x65, 0x75, 0x8c, 0x92, 0x47, - 0x65, 0xa5, 0x04, 0xbf, 0xba, 0x9b, 0x34, 0x20, 0x2a, 0xe3, 0x12, 0x9d, - 0x1e, 0xeb, 0xd6, 0x2d, 0xa0, 0xc8, 0x4e, 0xa6, 0x99, 0xec, 0x32, 0x47, - 0x0c, 0x82, 0xc5, 0xa7, 0xaa, 0xfe, 0x91, 0xb5, 0xe9, 0x46, 0x61, 0x89, - 0x2b, 0x88, 0x55, 0x1f, 0x86, 0x13, 0x2d, 0x1f, 0x62, 0x19, 0xe6, 0x2d, - 0x10, 0xd8, 0x92, 0x6a, 0x0f, 0x2a, 0xda, 0x1f, 0xf4, 0x08, 0xea, 0x4d, - 0x4e, 0xc4, 0x58, 0x5c, 0x40, 0x6d, 0x26, 0xe0, 0xdd, 0xd0, 0xa1, 0x0e, - 0x24, 0x2c, 0x49, 0x51, 0xdf, 0xba, 0x4c, 0x05, 0x2e, 0x7e, 0x55, 0x1f, - 0xd0, 0xbc, 0x56, 0x48, 0x30, 0x0c, 0xbf, 0x13, 0x14, 0x8a, 0x41, 0x43, - 0x7e, 0xf8, 0x00, 0xff, 0x03, 0xa3, 0xde, 0x9b, 0xb9, 0x75, 0x2d, 0x87, - 0x2a, 0x68, 0xd3, 0x5a, 0x7e, 0xa3, 0x3e, 0x2d, 0xdf, 0x66, 0x4e, 0x86, - 0xf5, 0xfd, 0x31, 0x49, 0x3f, 0xbb, 0x47, 0x5f, 0xca, 0xe5, 0x26, 0x73, - 0x20, 0xbb, 0x01, 0x19, 0x8f, 0x23, 0x56, 0xe1, 0xc7, 0xd0, 0xb1, 0x38, - 0xaa, 0xfc, 0xd1, 0x39, 0x1d, 0x01, 0x97, 0xa4, 0x41, 0x5c, 0x49, 0x9f, - 0x22, 0xc8, 0xbf, 0x1d, 0xfa, 0x1f, 0x5f, 0xd6, 0xc1, 0x82, 0x80, 0xa6, - 0xe2, 0x2d, 0x92, 0x73, 0xe3, 0x20, 0xcf, 0x1c, 0xa6, 0xdc, 0x37, 0x20, - 0x92, 0xef, 0x8f, 0x7d, 0xd5, 0x50, 0x41, 0xa4, 0x18, 0xc6, 0x3a, 0x6a, - 0x85, 0x61, 0x42, 0xdd, 0x33, 0xaa, 0x09, 0x3c, 0xed, 0xdd, 0x74, 0x47, - 0x31, 0xf8, 0x1f, 0x71, 0x1a, 0x34, 0x11, 0x50, 0x82, 0xa1, 0xff, 0xc4, - 0x52, 0x91, 0xbd, 0x84, 0x38, 0x3d, 0xf7, 0xd9, 0xa4, 0x8d, 0xe9, 0x34, - 0xf0, 0xb4, 0xb1, 0xe2, 0x0e, 0xdf, 0x51, 0xe7, 0x08, 0xa3, 0xe1, 0xf9, - 0x1c, 0x0d, 0x86, 0x14, 0x34, 0xee, 0xfd, 0xde, 0xc4, 0x76, 0xde, 0xea, - 0x77, 0x21, 0x86, 0x6a, 0x46, 0x45, 0x0a, 0x23, 0xa5, 0x4e, 0xb9, 0xf3, - 0x3c, 0x61, 0x37, 0xaf, 0x10, 0xc9, 0x2e, 0x41, 0xf4, 0xbd, 0x69, 0x49, - 0xa4, 0x9f, 0xbf, 0xa8, 0x69, 0x86, 0xa9, 0x8d, 0x1b, 0x3e, 0xd8, 0xd4, - 0x9a, 0x79, 0x77, 0x91, 0x01, 0xf6, 0x98, 0x2e, 0x2c, 0x45, 0x17, 0x0d, - 0x8b, 0xfa, 0x3c, 0xa9, 0x07, 0xdc, 0x78, 0x24, 0x07, 0x7c, 0xc9, 0x41, - 0x66, 0xbc, 0x64, 0x57, 0xe8, 0x5a, 0xbe, 0x20, 0xfe, 0x7a, 0x29, 0x04, - 0x5b, 0x5c, 0x44, 0x5d, 0x44, 0x05, 0x38, 0x10, 0x52, 0x83, 0x02, 0x69, - 0xf7, 0x1d, 0xa3, 0x84, 0xec, 0xdb, 0x95, 0x92, 0x27, 0x06, 0x59, 0x03, - 0x75, 0x45, 0x4d, 0x55, 0xe0, 0x4a, 0xb7, 0xd4, 0x03, 0x92, 0xac, 0x13, - 0x43, 0x86, 0x6a, 0x74, 0xef, 0x3c, 0x40, 0x49, 0x65, 0x85, 0x3c, 0xd7, - 0x97, 0x33, 0x15, 0x5f, 0x29, 0x3b, 0x56, 0x95, 0x08, 0x9c, 0x5c, 0xde, - 0xf6, 0x52, 0x90, 0x20, 0x8a, 0xdc, 0xf2, 0xf6, 0xab, 0xa5, 0x16, 0xe2, - 0xeb, 0x39, 0xa4, 0xe1, 0x50, 0xa2, 0xa9, 0xa4, 0x35, 0x41, 0x2c, 0xe5, - 0x0c, 0xe8, 0x40, 0xff, 0x5f, 0x15, 0x5c, 0xa1, 0x44, 0x79, 0xf6, 0x20, - 0x12, 0x82, 0xf2, 0xc1, 0xfd, 0x83, 0xe5, 0xd6, 0x0b, 0xf7, 0x65, 0xe3, - 0x38, 0x8c, 0x58, 0xdd, 0x51, 0xfd, 0xd0, 0xd8, 0xcd, 0x77, 0x02, 0x09, - 0x92, 0x5e, 0xde, 0x5a, 0x4f, 0xe5, 0xe6, 0xd0, 0x10, 0x06, 0x6d, 0x62, - 0x9d, 0x89, 0xf9, 0x23, 0x8f, 0x4e, 0x12, 0x8d, 0x72, 0xa3, 0x2f, 0xee, - 0x47, 0x10, 0x0b, 0x46, 0x9a, 0x34, 0xac, 0x2b, 0x9d, 0xf9, 0x63, 0x83, - 0xc5, 0x1a, 0x04, 0x8d, 0x8d, 0xf2, 0xd2, 0x23, 0x3a, 0xa6, 0x38, 0xa4, - 0x45, 0x64, 0x74, 0xf1, 0x36, 0xfa, 0x38, 0x9a, 0xbd, 0x56, 0xf4, 0x75, - 0xe5, 0x3a, 0xaa, 0x69, 0xec, 0x49, 0xb6, 0x26, 0xd6, 0x07, 0xf3, 0xaf, - 0x1c, 0xb6, 0x94, 0xf1, 0x97, 0xc6, 0x71, 0xfb, 0x39, 0x97, 0xad, 0xcc, - 0xaa, 0x92, 0xd9, 0x16, 0xaf, 0x25, 0xa6, 0x76, 0x7d, 0x0c, 0x1d, 0x3b, - 0x6e, 0x17, 0x22, 0x6e, 0x88, 0x5b, 0x9e, 0xd3, 0x31, 0xaf, 0x60, 0x39, - 0xfa, 0xd6, 0xef, 0xe3, 0x8e, 0x79, 0x3e, 0xbd, 0x17, 0xb4, 0x34, 0xb1, - 0x27, 0x7f, 0x71, 0x27, 0x16, 0x43, 0xf1, 0x38, 0x06, 0xa4, 0xa6, 0xa3, - 0xee, 0xe8, 0xc1, 0xd7, 0xb7, 0x1f, 0x48, 0x11, 0xa5, 0x9b, 0x58, 0x54, - 0xd7, 0x64, 0x79, 0x64, 0xf2, 0x44, 0xd4, 0x87, 0xfc, 0x21, 0xcc, 0x9f, - 0xbd, 0x0c, 0x33, 0x83, 0x11, 0x42, 0x32, 0xe8, 0x38, 0x72, 0x30, 0x26, - 0xed, 0xed, 0xd9, 0x22, 0x65, 0xdd, 0x66, 0x27, 0x56, 0x0c, 0x64, 0x9b, - 0xe4, 0x5b, 0x1d, 0x34, 0x8c, 0x96, 0xa2, 0xdd, 0xc7, 0x25, 0xc3, 0xd4, - 0xd0, 0x22, 0xea, 0x3b, 0x6c, 0x2c, 0x8e, 0x86, 0x65, 0x47, 0xea, 0xcf, - 0x64, 0xb1, 0x83, 0x94, 0x7b, 0x1d, 0x0c, 0x02, 0x82, 0x60, 0xd6, 0x31, - 0x63, 0xf5, 0x6e, 0x8a, 0x47, 0xfb, 0x86, 0x85, 0x37, 0x4d, 0x4f, 0xf2, - 0x30, 0x22, 0xf2, 0xe0, 0x4b, 0xaf, 0x87, 0x64, 0xed, 0x52, 0xdd, 0x71, - 0x07, 0x03, 0xde, 0x8a, 0x5f, 0x86, 0x8e, 0x2b, 0xcc, 0xfa, 0x02, 0x1a, - 0x4d, 0x67, 0xf1, 0xe1, 0x35, 0xa4, 0xd9, 0x0d, 0x22, 0xa2, 0x20, 0x6f, - 0xd1, 0xa0, 0x50, 0xf1, 0x74, 0x33, 0x49, 0x7b, 0x69, 0xad, 0xd9, 0x0e, - 0xd5, 0x3c, 0x08, 0x80, 0x8b, 0xf1, 0x6b, 0xf5, 0x1b, 0xc3, 0xf4, 0xc4, - 0x7c, 0xe2, 0x2e, 0x0e, 0x15, 0x3b, 0xb0, 0x34, 0xcd, 0x55, 0xe1, 0xc1, - 0x90, 0x96, 0xd1, 0x82, 0xc8, 0x19, 0xc5, 0x44, 0x8c, 0x86, 0x8a, 0x02, - 0x3b, 0xc3, 0x97, 0xbf, 0x33, 0x78, 0x1d, 0xb7, 0xb3, 0x4f, 0x4e, 0x86, - 0x58, 0xa4, 0x5e, 0x4e, 0xb6, 0xca, 0x54, 0x68, 0x21, 0x83, 0xd2, 0x02, - 0x3b, 0x5a, 0x4f, 0x0d, 0xe4, 0x90, 0x3e, 0x0b, 0x97, 0xe9, 0xde, 0xf5, - 0x57, 0xf9, 0x04, 0x70, 0x5c, 0xc9, 0xc9, 0x86, 0x9c, 0x22, 0x1e, 0xf0, - 0x33, 0x29, 0x16, 0x44, 0x0a, 0x09, 0x91, 0x4e, 0xf2, 0x44, 0x77, 0x0c, - 0xca, 0xb9, 0xb2, 0xee, 0x8d, 0x9f, 0x8c, 0x34, 0x14, 0x47, 0x0e, 0x93, - 0x7f, 0x1d, 0xd3, 0x8b, 0x22, 0xb0, 0x54, 0x7e, 0xff, 0x8e, 0x66, 0x7d, - 0x7c, 0xb1, 0xde, 0x1c, 0xf5, 0x61, 0x8f, 0x1e, 0x41, 0x3c, 0xa4, 0x15, - 0xf8, 0x44, 0x47, 0xe5, 0x75, 0x8d, 0xce, 0x5a, 0x99, 0xb3, 0x71, 0x41, - 0xbe, 0x94, 0x58, 0x7d, 0x43, 0x3d, 0x27, 0xb1, 0x69, 0x51, 0x2f, 0x0a, - 0x0b, 0x0e, 0x6f, 0x75, 0x0d, 0xe4, 0x7f, 0xa4, 0x37, 0xa4, 0x38, 0xf1, - 0x99, 0x3b, 0xe9, 0xb0, 0xd0, 0x46, 0x40, 0x42, 0x21, 0x26, 0xb2, 0xc0, - 0x0c, 0x8a, 0xd4, 0xd8, 0xef, 0x23, 0x41, 0x7e, 0xd4, 0x87, 0x06, 0x35, - 0xf2, 0x81, 0x03, 0xd3, 0x49, 0x12, 0x15, 0xd7, 0xb2, 0xa8, 0xbc, 0x2a, - 0x04, 0x8b, 0x11, 0x89, 0x3e, 0xa6, 0x80, 0xb7, 0x80, 0x49, 0x36, 0x07, - 0xac, 0xfc, 0xd0, 0x37, 0xe3, 0x26, 0x11, 0xec, 0xe2, 0x52, 0xfa, 0x80, - 0xa2, 0x52, 0x80, 0xea, 0xbc, 0xad, 0x26, 0xe3, 0xa0, 0xac, 0xe8, 0xc2, - 0xa0, 0x71, 0xb5, 0xd6, 0x33, 0x6e, 0x8d, 0x71, 0x95, 0xf1, 0x18, 0xd8, - 0xeb, 0x6f, 0xd1, 0x51, 0x12, 0x6a, 0xd2, 0x82, 0xa5, 0xde, 0x57, 0x12, - 0xc4, 0x61, 0x8f, 0xe4, 0xd7, 0x43, 0x08, 0x53, 0x53, 0x74, 0x3c, 0x24, - 0xf3, 0x3b, 0x47, 0x50, 0x7d, 0xf0, 0x09, 0xde, 0x2f, 0xf8, 0xfd, 0xbe, - 0xb8, 0x15, 0x4b, 0x15, 0x5c, 0x86, 0xf7, 0x1f, 0x58, 0x62, 0xa0, 0x1c, - 0x0c, 0xc4, 0x36, 0xeb, 0x61, 0x88, 0xce, 0x7e, 0x0b, 0x5a, 0xc4, 0x7f, - 0xad, 0xc7, 0x3b, 0x00, 0x90, 0x49, 0x32, 0xa3, 0x85, 0x07, 0xa2, 0xd7, - 0xb1, 0x91, 0x78, 0xf6, 0xdc, 0x7b, 0x8f, 0x51, 0x33, 0xb6, 0xd6, 0x1e, - 0x1e, 0xa3, 0xad, 0x64, 0x2c, 0x50, 0x31, 0x60, 0x0b, 0x46, 0x8b, 0x5e, - 0x92, 0xe1, 0xd7, 0x0c, 0x95, 0xb4, 0xa2, 0xd5, 0xab, 0x92, 0x44, 0xed, - 0x15, 0x69, 0x04, 0x1d, 0x80, 0x1d, 0x8b, 0x3f, 0xb4, 0x1d, 0x4e, 0xd3, - 0x60, 0xa8, 0x54, 0x07, 0xd6, 0x37, 0xb2, 0xf2, 0xbe, 0x95, 0xaf, 0xc0, - 0x51, 0xf7, 0xf0, 0x89, 0x05, 0x5b, 0x9a, 0x68, 0xe9, 0x6d, 0x59, 0xc8, - 0x90, 0x57, 0x69, 0x13, 0x54, 0x65, 0x4e, 0xd6, 0x09, 0x6f, 0xa5, 0x0c, - 0x27, 0xd7, 0x23, 0x5c, 0x79, 0x22, 0x4c, 0x9f, 0x3b, 0x2a, 0x91, 0x3c, - 0xe4, 0x16, 0x79, 0xbb, 0xdb, 0xf3, 0x18, 0xd8, 0xfa, 0xee, 0xdb, 0xc5, - 0x2f, 0x2e, 0x90, 0x09, 0x15, 0x55, 0x81, 0x11, 0x09, 0x5b, 0x08, 0xf3, - 0x96, 0x6f, 0x6e, 0x73, 0xc5, 0x84, 0xc9, 0x46, 0x14, 0x7c, 0xc4, 0xfe, - 0xfb, 0x1b, 0xae, 0xe5, 0xfa, 0x7d, 0x42, 0xdc, 0xa3, 0x6e, 0xdd, 0x72, - 0x32, 0x72, 0x8e, 0x1e, 0x60, 0x62, 0x92, 0xca, 0x13, 0xf3, 0x0e, 0x34, - 0x39, 0x1e, 0x6b, 0x69, 0x68, 0x72, 0x5d, 0xab, 0xe2, 0xe1, 0xcb, 0x39, - 0x4e, 0xea, 0x5f, 0xb7, 0xa2, 0xcb, 0x3d, 0xcb, 0xc4, 0xfe, 0x81, 0x13, - 0x8e, 0x5b, 0xc4, 0xbf, 0xf5, 0x7e, 0x3e, 0x09, 0x7e, 0xf6, 0xcb, 0x07, - 0x2d, 0x4a, 0xab, 0xe9, 0x0d, 0x8b, 0x60, 0xf3, 0x81, 0x33, 0x25, 0xf4, - 0xe6, 0x7d, 0x85, 0x44, 0x1a, 0xbc, 0xf3, 0xe8, 0xf3, 0x74, 0xe6, 0x52, - 0xef, 0x17, 0x84, 0xc2, 0x37, 0x0a, 0x9e, 0xb5, 0x9a, 0x9e, 0xe3, 0xb2, - 0xc2, 0x58, 0x58, 0xab, 0xad, 0xa9, 0x68, 0xdf, 0x53, 0x66, 0xb3, 0xaf, - 0xab, 0xf7, 0x59, 0x97, 0xaa, 0xe5, 0x4b, 0xe7, 0x6c, 0x6e, 0xbe, 0x04, - 0xd2, 0x1a, 0x1e, 0xae, 0x4f, 0xe2, 0xe7, 0x5a, 0xf7, 0xac, 0xcf, 0xc5, - 0x88, 0x75, 0x75, 0xca, 0x9b, 0x59, 0x45, 0x2b, 0xc2, 0x55, 0x2b, 0xf3, - 0x37, 0x4a, 0x4a, 0x33, 0x63, 0xb0, 0xe4, 0xdf, 0xa4, 0x46, 0x02, 0x59, - 0x2b, 0xb9, 0xac, 0x00, 0x18, 0x6d, 0x41, 0xc8, 0x20, 0x5d, 0xf8, 0x82, - 0x26, 0x6f, 0xb3, 0x67, 0x25, 0x06, 0xf2, 0x67, 0x12, 0x4a, 0x5a, 0x1a, - 0xf5, 0x59, 0xe2, 0x69, 0xc1, 0xc7, 0x8d, 0x2b, 0x43, 0x23, 0x19, 0x04, - 0x06, 0x02, 0xbc, 0x55, 0x18, 0xbf, 0x92, 0xfc, 0x5d, 0xc7, 0x17, 0x7f, - 0x49, 0x97, 0x19, 0xe5, 0x87, 0x6f, 0x80, 0x74, 0x91, 0xc7, 0x3c, 0x00, - 0x3a, 0xbf, 0xe7, 0xa3, 0x78, 0xae, 0x6c, 0xa6, 0x69, 0x79, 0x45, 0x9c, - 0x06, 0x63, 0x21, 0x9f, 0x27, 0x37, 0xe1, 0xe0, 0x68, 0x92, 0xdf, 0x4e, - 0x54, 0x30, 0xd0, 0x69, 0x68, 0xde, 0x81, 0x1d, 0x0a, 0xdb, 0x0e, 0xaa, - 0x37, 0xd9, 0x7f, 0x7b, 0x7b, 0x88, 0x39, 0xc0, 0x42, 0x23, 0x7e, 0x22, - 0xa2, 0x25, 0x38, 0x5b, 0xc0, 0xb1, 0xf9, 0x94, 0xc5, 0xac, 0x23, 0xf3, - 0xe2, 0x84, 0x50, 0x64, 0xb7, 0xe2, 0x48, 0x4e, 0xa1, 0x17, 0x90, 0x13, - 0xc4, 0xb1, 0x5f, 0xf2, 0xce, 0x2c, 0xd8, 0x8c, 0xd0, 0x0e, 0xa0, 0x57, - 0xe9, 0x17, 0x42, 0xbc, 0x91, 0xe9, 0xbf, 0x9a, 0x73, 0xec, 0x55, 0xdc, - 0xa2, 0xf9, 0x86, 0x91, 0x72, 0xbb, 0xdf, 0xba, 0x03, 0xe0, 0xce, 0xcc, - 0x6a, 0x68, 0xda, 0x27, 0xc7, 0x1b, 0x25, 0xab, 0x7c, 0xd5, 0x91, 0x88, - 0xf6, 0x27, 0xa3, 0xd7, 0xa0, 0x4e, 0xe6, 0xa1, 0x13, 0x25, 0x95, 0x32, - 0x65, 0xfd, 0x74, 0x71, 0xa4, 0xa5, 0xe0, 0x03, 0x3e, 0x8f, 0x78, 0xcc, - 0xb9, 0x01, 0xdf, 0x0f, 0x95, 0xdb, 0x9e, 0xf9, 0x5c, 0x38, 0xf9, 0x1b, - 0x58, 0x21, 0xe9, 0xfd, 0x85, 0x38, 0xc2, 0x16, 0xf6, 0x78, 0x07, 0xbe, - 0xe5, 0xe9, 0x70, 0x8e, 0xa1, 0xc5, 0xc0, 0x65, 0x7a, 0x87, 0x4e, 0x3a, - 0x3c, 0xd4, 0x8f, 0x2f, 0xf8, 0xe4, 0x41, 0x67, 0x07, 0xbf, 0x4c, 0x0f, - 0x4c, 0x06, 0x9c, 0x1a, 0x90, 0x7e, 0x4a, 0x97, 0xc4, 0x82, 0x5c, 0x7e, - 0x8d, 0xe6, 0x1e, 0xc6, 0x6d, 0xfd, 0x04, 0x0f, 0xe8, 0x26, 0x7d, 0xc5, - 0xd7, 0xce, 0x0f, 0x86, 0x9a, 0xf5, 0x2a, 0x39, 0x99, 0x33, 0xad, 0xe5, - 0xea, 0x52, 0x58, 0x66, 0x4a, 0xed, 0x94, 0x66, 0xa6, 0x31, 0x71, 0x7a, - 0x91, 0xa6, 0xcf, 0xe0, 0x73, 0x37, 0xd2, 0xb0, 0x92, 0xbd, 0x24, 0x33, - 0x47, 0x5b, 0x9e, 0xc9, 0x84, 0xaf, 0x7a, 0xd3, 0x36, 0x22, 0xc4, 0x0c, - 0xe5, 0x9d, 0x20, 0x53, 0x15, 0xa8, 0x94, 0x16, 0x93, 0x6f, 0xd9, 0x09, - 0xac, 0xb8, 0x65, 0x8d, 0x4f, 0xde, 0xa8, 0xf7, 0xd9, 0xc5, 0xcd, 0xe8, - 0x3d, 0x73, 0xae, 0xf6, 0x87, 0x0c, 0xd5, 0xcf, 0xcb, 0x14, 0x25, 0x38, - 0xec, 0xbd, 0x63, 0xa6, 0x80, 0x15, 0xa5, 0x82, 0x76, 0x4b, 0x0e, 0x74, - 0x97, 0x31, 0x84, 0xbe, 0x68, 0x15, 0x99, 0x3a, 0x9f, 0x5f, 0xed, 0x42, - 0x75, 0x80, 0xd9, 0x46, 0xcf, 0xb7, 0xda, 0x82, 0x03, 0xb0, 0xd0, 0x4c, - 0x72, 0xb6, 0xd1, 0x4a, 0x4f, 0x4a, 0xd4, 0xe9, 0xf1, 0x1b, 0x6a, 0xbd, - 0xb4, 0x50, 0xd1, 0x8e, 0xb8, 0x60, 0xe5, 0xd4, 0x8b, 0x9a, 0xf1, 0xb6, - 0x52, 0xc2, 0xf8, 0x2f, 0x6b, 0xed, 0x6a, 0x24, 0xc1, 0xb6, 0xb2, 0xed, - 0x40, 0xd4, 0x4e, 0xca, 0xa7, 0x0c, 0xc2, 0xf7, 0xca, 0xc3, 0xf0, 0xdf, - 0xfb, 0xf5, 0xaf, 0x2e, 0xac, 0x24, 0x85, 0x1a, 0x36, 0x81, 0xc0, 0xc5, - 0xf2, 0x7f, 0x6a, 0x5b, 0x25, 0x4a, 0xe8, 0x84, 0x50, 0xc9, 0xe5, 0x52, - 0x42, 0x70, 0xe3, 0xe1, 0x71, 0xce, 0x6f, 0x07, 0xd0, 0x69, 0xf3, 0x00, - 0xa3, 0x0a, 0xb5, 0x7c, 0xae, 0x5b, 0xc7, 0x09, 0x97, 0xf2, 0xcc, 0xb3, - 0x3c, 0x92, 0x43, 0xcc, 0xc1, 0xd0, 0xf3, 0xa2, 0x7c, 0x8a, 0x58, 0x43, - 0x17, 0x3c, 0x64, 0xaa, 0x69, 0x1e, 0xba, 0xb7, 0xb7, 0x05, 0xad, 0xee, - 0x8c, 0x4b, 0x87, 0xe1, 0xf0, 0x59, 0xd7, 0x59, 0xd2, 0x7d, 0xea, 0x87, - 0x8f, 0xa1, 0x06, 0xdb, 0xbb, 0xc3, 0x95, 0x0b, 0x18, 0x45, 0x28, 0x08, - 0x47, 0x0d, 0x77, 0xd8, 0xe3, 0x2a, 0xe7, 0x9f, 0xbe, 0x7c, 0xd3, 0x8c, - 0x74, 0x23, 0xac, 0x46, 0xa2, 0xe3, 0x07, 0x7c, 0x4e, 0x4a, 0x48, 0x27, - 0x16, 0xff, 0xc8, 0x8e, 0x08, 0x10, 0x53, 0xaa, 0x0c, 0x62, 0x19, 0xf2, - 0xe5, 0x0b, 0xe0, 0x92, 0xe9, 0x9a, 0x0a, 0xb5, 0x8f, 0xeb, 0x07, 0x59, - 0xd2, 0x1d, 0x2b, 0xd3, 0x86, 0xeb, 0x3c, 0x51, 0x4f, 0x08, 0x1a, 0x7e, - 0x9d, 0xa6, 0x95, 0xdd, 0x21, 0xb8, 0x27, 0x7b, 0x61, 0x99, 0x5a, 0x22, - 0x5e, 0x00, 0x67, 0x65, 0x4a, 0xc7, 0x32, 0x72, 0x9f, 0xbd, 0x52, 0x49, - 0x81, 0x28, 0x86, 0x6c, 0x29, 0xba, 0x1c, 0xef, 0xed, 0xf6, 0xe5, 0x12, - 0x17, 0xd8, 0x4e, 0x61, 0x7e, 0x99, 0x12, 0xaf, 0x4b, 0xad, 0x4a, 0x56, - 0x40, 0xcd, 0x82, 0x27, 0xdf, 0xb1, 0xe5, 0x60, 0xad, 0x82, 0x0e, 0xa5, - 0x6d, 0xf9, 0x10, 0x90, 0xd0, 0x62, 0xba, 0x35, 0x91, 0xdf, 0x7f, 0x7a, - 0x17, 0x34, 0x30, 0x09, 0xb8, 0x34, 0xad, 0xd8, 0x53, 0x2b, 0xb9, 0x88, - 0xf4, 0x9d, 0xa6, 0xad, 0x4c, 0x20, 0xeb, 0xb4, 0xff, 0xf8, 0x68, 0x33, - 0x48, 0x7f, 0xa9, 0x69, 0x83, 0x3e, 0xed, 0xb7, 0x19, 0x98, 0x0f, 0x47, - 0x0c, 0x54, 0xaa, 0xcf, 0xf5, 0x9e, 0x8a, 0xf5, 0xa8, 0xe8, 0xf6, 0x31, - 0x74, 0xa3, 0xd4, 0x7a, 0x5f, 0x0d, 0x12, 0xcc, 0x4f, 0xad, 0xa1, 0x64, - 0x79, 0x3f, 0xce, 0x25, 0x67, 0xf2, 0xc6, 0xef, 0x91, 0x64, 0x5c, 0xd0, - 0x2a, 0x11, 0x80, 0x7b, 0xa7, 0xb0, 0x10, 0x78, 0x7e, 0x1f, 0x51, 0x27, - 0x64, 0xa3, 0x26, 0xce, 0x1e, 0x52, 0x71, 0xe8, 0x55, 0x61, 0x1b, 0x28, - 0x7f, 0x87, 0x30, 0x4c, 0x86, 0x07, 0x69, 0xa0, 0x33, 0x21, 0xc6, 0x36, - 0xe5, 0x18, 0x12, 0x10, 0x3b, 0x23, 0x94, 0x36, 0x8c, 0xa6, 0x89, 0xae, - 0x6e, 0x11, 0x96, 0x2a, 0x5d, 0x74, 0xc1, 0x06, 0xfe, 0x73, 0xdb, 0x29, - 0xda, 0x91, 0x20, 0xff, 0xe7, 0xfd, 0x39, 0x97, 0xc5, 0x7b, 0x0d, 0x58, - 0x62, 0x4b, 0x38, 0xa5, 0x5f, 0x76, 0x0b, 0x42, 0x01, 0x3a, 0xa2, 0xda, - 0xb3, 0x9f, 0x9f, 0xa7, 0xb4, 0x3a, 0x84, 0xa5, 0xf4, 0xc6, 0x51, 0x56, - 0x6d, 0xa1, 0x0b, 0x8c, 0xd9, 0xe4, 0x59, 0x09, 0x28, 0x63, 0x49, 0xae, - 0xc5, 0x0a, 0x2b, 0x3a, 0x8f, 0x19, 0xa1, 0x44, 0xc2, 0x99, 0xf7, 0x96, - 0x34, 0xdb, 0xda, 0x35, 0xfd, 0x63, 0x78, 0x79, 0x0c, 0xd7, 0x28, 0xc4, - 0x7b, 0x1c, 0x65, 0x95, 0x43, 0xa5, 0xa1, 0x9f, 0x51, 0xda, 0xbb, 0x41, - 0x7e, 0x48, 0x10, 0x31, 0x4a, 0xfd, 0x85, 0xef, 0xeb, 0xb3, 0x04, 0x5b, - 0x20, 0xd2, 0x91, 0xea, 0xbe, 0xd8, 0xd0, 0x5f, 0xbd, 0x40, 0x91, 0xa2, - 0xd2, 0x9c, 0x63, 0x38, 0xae, 0x40, 0x52, 0xe9, 0xd0, 0x76, 0x30, 0x35, - 0xf0, 0x36, 0x44, 0xd3, 0x08, 0xc8, 0xec, 0x41, 0xd7, 0x71, 0xc4, 0xcb, - 0xa3, 0x36, 0xd5, 0xdc, 0x92, 0x7a, 0x17, 0x3f, 0x44, 0xc1, 0x58, 0x3e, - 0x79, 0xcb, 0x90, 0x2c, 0x69, 0x98, 0x9a, 0x7b, 0xc4, 0x1e, 0xfb, 0x5c, - 0xad, 0x73, 0xf2, 0x5f, 0x44, 0x2d, 0xa1, 0x57, 0x85, 0xe2, 0x9b, 0xbb, - 0x55, 0x39, 0x73, 0x4d, 0x58, 0x8e, 0x94, 0xde, 0x0f, 0xf4, 0x33, 0xc4, - 0x60, 0xf9, 0x75, 0xbe, 0xa2, 0x95, 0xde, 0x18, 0xd0, 0x5f, 0x7e, 0xf0, - 0x52, 0x73, 0x0b, 0x25, 0x94, 0x19, 0x97, 0x94, 0x41, 0xb3, 0x3b, 0x81, - 0x1e, 0x83, 0xf3, 0x96, 0x50, 0xd6, 0x39, 0x2b, 0xac, 0x9d, 0x02, 0x20, - 0xd8, 0x4d, 0x19, 0x98, 0xf9, 0x6f, 0xff, 0x80, 0x60, 0x04, 0xd3, 0x3f, - 0x24, 0xf6, 0xf0, 0x2b, 0x7f, 0xc4, 0x98, 0x97, 0x3d, 0x30, 0x6a, 0xeb, - 0xc3, 0x70, 0x0e, 0x32, 0x92, 0x1a, 0x76, 0xe7, 0x28, 0xeb, 0x7c, 0x8e, - 0x61, 0xa5, 0x91, 0x93, 0xe2, 0x3d, 0x29, 0x63, 0x16, 0xc5, 0xaf, 0x3c, - 0x49, 0x07, 0x9c, 0xe3, 0xb0, 0x61, 0x00, 0x4b, 0xed, 0x30, 0x61, 0xb0, - 0x9b, 0x7c, 0x44, 0x59, 0x7f, 0x0a, 0x41, 0xf7, 0xe3, 0x06, 0x64, 0xfb, - 0x5f, 0xe1, 0x95, 0xfc, 0xa1, 0x77, 0xa7, 0xc0, 0x3c, 0x0e, 0x6e, 0xf8, - 0xdd, 0x66, 0x8f, 0xfc, 0x58, 0xd8, 0xce, 0x20, 0x8e, 0x42, 0xb5, 0x22, - 0x2c, 0xb5, 0x9c, 0x76, 0x72, 0xf5, 0xf0, 0x8e, 0x2f, 0x6b, 0x0a, 0xd1, - 0x41, 0x13, 0x43, 0xf6, 0x48, 0x00, 0xe4, 0x30, 0xda, 0xd3, 0xd7, 0xaa, - 0xb6, 0x66, 0x30, 0x39, 0xae, 0x40, 0x45, 0x1c, 0x4a, 0x7a, 0x2e, 0xa0, - 0xcb, 0x6d, 0x87, 0xca, 0xbd, 0xa6, 0xce, 0x0d, 0x5e, 0x88, 0x37, 0x32, - 0x6d, 0x85, 0x76, 0x07, 0x58, 0xb9, 0x3f, 0x9f, 0x3e, 0x3e, 0x61, 0xb2, - 0x4a, 0xe4, 0xb1, 0xde, 0x94, 0x3b, 0x15, 0x01, 0xec, 0x34, 0xe5, 0x69, - 0x5b, 0x31, 0xde, 0xfe, 0x0c, 0xfe, 0x82, 0x83, 0x34, 0x50, 0x27, 0x99, - 0x71, 0x15, 0x44, 0xba, 0xb1, 0x54, 0xad, 0x39, 0x71, 0x2d, 0xe9, 0x40, - 0xaa, 0xe7, 0xbf, 0x55, 0x37, 0x31, 0xa1, 0x6c, 0x5c, 0xae, 0x2c, 0xc1, - 0xe4, 0x9e, 0x5d, 0x23, 0xbf, 0x32, 0x8b, 0x6a, 0x18, 0x2f, 0x36, 0x89, - 0x8f, 0x56, 0x62, 0x29, 0x59, 0x9f, 0x24, 0x84, 0x80, 0x13, 0x85, 0xf3, - 0x7a, 0xb3, 0x7f, 0x67, 0x8d, 0x9c, 0xf1, 0x87, 0x38, 0x78, 0x11, 0xfb, - 0x18, 0x3e, 0x73, 0xb0, 0xf4, 0x6c, 0x18, 0xf1, 0x77, 0x0b, 0xcb, 0x12, - 0x06, 0x20, 0x99, 0x82, 0x70, 0xc9, 0xc1, 0x89, 0x22, 0x75, 0x67, 0x25, - 0x29, 0x02, 0x37, 0x11, 0xd9, 0x1d, 0xa5, 0xb7, 0xdb, 0xf9, 0x46, 0xd3, - 0xd9, 0xfe, 0xb8, 0x53, 0x09, 0xca, 0x81, 0x65, 0xb4, 0xf7, 0x45, 0x32, - 0xd1, 0xd9, 0xe8, 0x7a, 0x21, 0xed, 0xb1, 0xec, 0x8e, 0x7a, 0xa3, 0x6a, - 0x75, 0xbc, 0x33, 0x77, 0x09, 0xc1, 0xf3, 0xbe, 0x7c, 0x4a, 0xe4, 0x02, - 0x00, 0x15, 0x1e, 0x17, 0xc6, 0xf3, 0xef, 0xc5, 0xa7, 0xad, 0x95, 0x50, - 0x4d, 0xee, 0x02, 0x6a, 0x61, 0x0d, 0x6f, 0x50, 0x07, 0x79, 0x6f, 0xcb, - 0x4e, 0x10, 0x36, 0xe0, 0x50, 0xbb, 0xa3, 0x30, 0xfd, 0x1d, 0xd0, 0xe1, - 0x06, 0xf4, 0xf4, 0xd1, 0xbb, 0x3a, 0x4f, 0x07, 0x51, 0xad, 0xbb, 0x02, - 0x7e, 0x52, 0x43, 0x9a, 0xb0, 0x89, 0x71, 0x42, 0xcf, 0x2d, 0xe9, 0xaa, - 0x19, 0x90, 0xc3, 0x2d, 0xfa, 0xfc, 0xc7, 0xf3, 0x1e, 0x49, 0x64, 0x84, - 0x1f, 0xb4, 0xca, 0x3e, 0x1f, 0xb8, 0xda, 0x35, 0x20, 0xfc, 0xf0, 0xdd, - 0x20, 0x58, 0x35, 0xe6, 0x27, 0x8f, 0xd3, 0x1d, 0x16, 0x21, 0xa1, 0x53, - 0x4c, 0x1f, 0xde, 0x21, 0xdd, 0x6b, 0xf6, 0x17, 0x4c, 0x16, 0xb6, 0x9e, - 0x5e, 0x15, 0xfc, 0xa0, 0xd7, 0x23, 0x6d, 0x10, 0xe7, 0x71, 0xfb, 0x72, - 0x2e, 0x0c, 0x33, 0xcc, 0xec, 0x50, 0x0e, 0x42, 0x21, 0x04, 0xa8, 0x4d, - 0x6d, 0xb2, 0xdb, 0x06, 0x77, 0x41, 0xa8, 0x31, 0x8b, 0x9d, 0x37, 0x26, - 0xcb, 0x98, 0x4b, 0x2a, 0xf4, 0x3c, 0x35, 0x9f, 0x86, 0x67, 0x58, 0x16, - 0x3f, 0xd7, 0xe7, 0x73, 0x24, 0x5c, 0x1a, 0x85, 0x7a, 0x80, 0x10, 0xf6, - 0x2c, 0xa9, 0x13, 0x0d, 0xff, 0x6c, 0x59, 0x44, 0x16, 0x52, 0x01, 0xe4, - 0xa1, 0x26, 0x79, 0x36, 0x8a, 0x10, 0x88, 0xd3, 0x35, 0x24, 0x51, 0x60, - 0x29, 0x49, 0xeb, 0x87, 0xad, 0xa2, 0x42, 0xd0, 0x21, 0x9a, 0xd4, 0x4e, - 0x45, 0xb0, 0x3c, 0xca, 0x6b, 0x49, 0x4d, 0xc9, 0x9a, 0xb5, 0xec, 0x44, - 0xeb, 0x4c, 0xf6, 0x1e, 0x00, 0xf3, 0x12, 0x09, 0x73, 0x15, 0x99, 0x9d, - 0xca, 0x55, 0x06, 0xee, 0x21, 0x3b, 0xbe, 0x9e, 0x5d, 0x78, 0xdf, 0xf4, - 0x2f, 0x73, 0x36, 0x0e, 0xbf, 0x39, 0x16, 0x74, 0xab, 0x60, 0xd3, 0x66, - 0xaf, 0x3f, 0xc2, 0x82, 0x8a, 0xfb, 0x22, 0x1e, 0x34, 0xdb, 0x4d, 0x12, - 0xcd, 0x07, 0xb0, 0x93, 0x31, 0x05, 0x18, 0x8d, 0xba, 0xb5, 0xc2, 0x8d, - 0x51, 0x1a, 0x1c, 0x90, 0xba, 0xa2, 0xc6, 0x78, 0x03, 0x74, 0xdf, 0xee, - 0x96, 0x30, 0xba, 0x02, 0xcb, 0x59, 0x1e, 0x23, 0x6c, 0x47, 0x69, 0x9f, - 0x08, 0x40, 0x9a, 0xeb, 0xd4, 0x74, 0xa1, 0xcc, 0x7c, 0x74, 0xa3, 0xb8, - 0x96, 0xaa, 0x93, 0x96, 0x83, 0x5b, 0x90, 0x18, 0x63, 0x91, 0xb2, 0x78, - 0xf6, 0x3a, 0xfa, 0xac, 0x4d, 0xe1, 0xd9, 0x57, 0x52, 0x7b, 0xfa, 0x0d, - 0xee, 0x3c, 0x67, 0x38, 0xc9, 0xa0, 0xbd, 0x5e, 0x34, 0xe3, 0x72, 0xdd, - 0x26, 0xa4, 0xaa, 0x72, 0x01, 0x35, 0x6f, 0xf3, 0x08, 0x1e, 0x55, 0xea, - 0xfd, 0x6f, 0x0a, 0xb5, 0x9a, 0x7f, 0x38, 0x8d, 0x40, 0x60, 0x7b, 0xe9, - 0x50, 0x72, 0x64, 0xdd, 0xd2, 0xef, 0xb2, 0x6e, 0x3f, 0x2f, 0x96, 0xe1, - 0x65, 0xfe, 0xb7, 0xa4, 0x82, 0x71, 0xfd, 0x6c, 0xcb, 0x43, 0x94, 0x0b, - 0x8e, 0x32, 0xf8, 0x20, 0x39, 0x40, 0x3f, 0xa0, 0x70, 0xaa, 0x3e, 0x9e, - 0x49, 0xfd, 0xc5, 0xc9, 0x9d, 0x75, 0x76, 0x61, 0x1c, 0xd9, 0x18, 0x86, - 0x1f, 0x9c, 0x24, 0x1d, 0x42, 0x51, 0x2b, 0x29, 0xe5, 0x43, 0x5c, 0x10, - 0xe6, 0x93, 0x81, 0xb5, 0x59, 0x09, 0x91, 0x50, 0x63, 0xd6, 0xc0, 0xf1, - 0xb6, 0xb0, 0x91, 0x8f, 0x78, 0xe6, 0x03, 0x3d, 0xe8, 0x68, 0x57, 0xf4, - 0xf9, 0xf3, 0xe3, 0x8a, 0x7e, 0x12, 0x97, 0x08, 0xdb, 0x56, 0x6b, 0x1e, - 0xe8, 0x35, 0x97, 0x13, 0x2c, 0xa0, 0xe3, 0xc4, 0xba, 0xe9, 0xe2, 0x76, - 0x09, 0xa2, 0xb5, 0x7c, 0xc1, 0x74, 0x84, 0xb9, 0x26, 0x3a, 0xa1, 0x08, - 0x2b, 0x89, 0xc0, 0x33, 0x10, 0xf5, 0x5f, 0x66, 0xef, 0x18, 0x6a, 0x88, - 0xd8, 0x51, 0xa5, 0xb4, 0xfc, 0x89, 0xfe, 0x50, 0x25, 0x02, 0x24, 0x54, - 0xf0, 0x8f, 0x83, 0xa1, 0x54, 0x0a, 0x69, 0xc8, 0xb6, 0xa0, 0xe0, 0x87, - 0x67, 0x0f, 0x6b, 0x60, 0xbc, 0xb6, 0x93, 0xb2, 0x3e, 0xdf, 0x15, 0x12, - 0xad, 0x24, 0x03, 0xbc, 0xf3, 0x7f, 0x95, 0xf0, 0xfb, 0x4a, 0x7b, 0xa9, - 0xc2, 0x37, 0x74, 0x59, 0x1c, 0xad, 0x10, 0x4f, 0x6b, 0x72, 0x33, 0x6e, - 0x7e, 0x5f, 0x3e, 0x2d, 0xf4, 0x12, 0xa5, 0x17, 0xa8, 0x4e, 0xe2, 0xc2, - 0x10, 0x27, 0xa5, 0xae, 0xf6, 0x1c, 0xdb, 0x6f, 0xf7, 0xb4, 0xaa, 0x55, - 0x66, 0x71, 0x8a, 0x68, 0x22, 0x81, 0x61, 0xc9, 0x30, 0x71, 0x6e, 0xd9, - 0xb5, 0x74, 0xdd, 0xa3, 0x2c, 0x9d, 0x4b, 0xfc, 0xc2, 0xc4, 0x60, 0xef, - 0xd6, 0xef, 0x35, 0x1c, 0x02, 0x15, 0xa6, 0xf1, 0xb7, 0x41, 0xa3, 0x00, - 0xf1, 0xff, 0xc6, 0x29, 0xba, 0xd4, 0x91, 0x3a, 0xdf, 0x64, 0x30, 0x90, - 0x84, 0x1f, 0xab, 0xac, 0x1e, 0x2c, 0x05, 0x59, 0x62, 0xc2, 0x05, 0x2d, - 0x9b, 0xcd, 0xa7, 0xc3, 0xa1, 0x51, 0x50, 0x7b, 0xf8, 0x6a, 0x48, 0xce, - 0x7d, 0x8b, 0x45, 0xdb, 0x4c, 0x6c, 0x48, 0xea, 0x7a, 0x1d, 0xdc, 0x21, - 0xb4, 0x6b, 0xcf, 0xad, 0xc5, 0x4f, 0x64, 0x3d, 0xf9, 0x17, 0x47, 0xd8, - 0x0d, 0x5a, 0x02, 0xbf, 0xe7, 0xe0, 0x55, 0x24, 0x9d, 0x77, 0x8f, 0x58, - 0x60, 0xc6, 0x2a, 0xce, 0x1e, 0x86, 0x64, 0x46, 0x1a, 0x98, 0x18, 0x56, - 0x5c, 0xe3, 0xf5, 0x8f, 0x0e, 0x6d, 0xc6, 0x06, 0xb5, 0xd2, 0x9c, 0xdb, - 0xce, 0xa1, 0x9e, 0xf0, 0x68, 0x32, 0x21, 0xa3, 0x6a, 0x5b, 0x86, 0x2b, - 0xa2, 0x7f, 0xae, 0xe2, 0x99, 0xe3, 0x2d, 0x82, 0x5c, 0x9a, 0x34, 0xdd, - 0x79, 0x49, 0xca, 0xef, 0x13, 0x81, 0xf0, 0xf5, 0xd9, 0x05, 0xd5, 0x34, - 0x5a, 0xfe, 0x4f, 0xea, 0xdd, 0x66, 0x57, 0xb6, 0x1f, 0x89, 0xd9, 0x7c, - 0xc2, 0x02, 0xe5, 0x83, 0x41, 0xba, 0x20, 0x1b, 0xbb, 0x7e, 0x8c, 0x07, - 0x2e, 0x7f, 0x9b, 0x2c, 0xcd, 0xe5, 0x95, 0x08, 0x7b, 0xe0, 0xad, 0xdf, - 0x3b, 0x58, 0xbf, 0x17, 0x92, 0x98, 0x7b, 0x7b, 0xfd, 0xfa, 0xd9, 0x6c, - 0x7e, 0x75, 0xed, 0xe0, 0xae, 0x03, 0x93, 0xcb, 0x6c, 0xdd, 0x70, 0x5c, - 0x94, 0x0e, 0x0d, 0x26, 0xfe, 0x2b, 0x8d, 0xfc, 0xa5, 0x72, 0xd1, 0x0c, - 0xb3, 0xbd, 0xa3, 0x15, 0xfd, 0xa9, 0xaa, 0xb8, 0xc1, 0x60, 0x42, 0xad, - 0x05, 0xcb, 0xa5, 0x13, 0xad, 0x61, 0x20, 0x60, 0x03, 0xfd, 0x6d, 0xe3, - 0x33, 0x65, 0x0f, 0xe6, 0x6e, 0xca, 0x06, 0x25, 0xea, 0x4b, 0x19, 0xb4, - 0x7f, 0x3c, 0xb9, 0x5d, 0x2b, 0x7d, 0x4f, 0x2f, 0x33, 0x1a, 0xa3, 0x10, - 0x42, 0xc4, 0xba, 0x14, 0x0d, 0x1b, 0xc2, 0x68, 0x90, 0xc3, 0x05, 0x97, - 0x26, 0x07, 0x3d, 0xd7, 0xda, 0x0c, 0xfd, 0x25, 0xc7, 0x25, 0x4e, 0x78, - 0x09, 0xfa, 0xe9, 0x01, 0xbc, 0x9c, 0x1d, 0x51, 0x7b, 0xe7, 0x6f, 0xaf, - 0xed, 0xfd, 0xfd, 0xe7, 0xdd, 0x48, 0x17, 0xdf, 0x03, 0xe1, 0x57, 0xfa, - 0x80, 0xd0, 0xa7, 0xee, 0x28, 0x59, 0x57, 0x84, 0x28, 0x00, 0x67, 0x93, - 0x9d, 0x56, 0xf7, 0x6a, 0x7e, 0x9a, 0x55, 0x7b, 0x05, 0x68, 0x44, 0x42, - 0x6e, 0x8b, 0xf0, 0x17, 0x23, 0x15, 0x5c, 0x8b, 0x73, 0xa9, 0xef, 0x8b, - 0xd8, 0x44, 0x24, 0xdb, 0x54, 0x58, 0xb8, 0x88, 0x3e, 0x52, 0xbe, 0x7d, - 0xd2, 0xd8, 0x1f, 0x26, 0xae, 0x0e, 0xde, 0xd4, 0x1f, 0xf9, 0xb2, 0x4d, - 0xa1, 0x40, 0xc6, 0x92, 0xd5, 0xe5, 0xd2, 0xda, 0x5b, 0x24, 0xb6, 0xa1, - 0x9a, 0x26, 0xc7, 0xf3, 0xdf, 0x6a, 0xee, 0xbe, 0x33, 0x1d, 0xb3, 0x37, - 0x9c, 0x07, 0xf9, 0xdc, 0xbf, 0xc5, 0x97, 0xc1, 0xab, 0xbe, 0xbf, 0xc9, - 0x45, 0xe1, 0xf8, 0xb7, 0x3e, 0x78, 0x5b, 0x8c, 0xa1, 0xe4, 0x94, 0x26, - 0x2e, 0x8b, 0x47, 0x7f, 0x95, 0xd4, 0xf6, 0x12, 0xe8, 0x2b, 0x4d, 0x09, - 0xec, 0xec, 0x0a, 0x0c, 0xec, 0xd0, 0x06, 0x9e, 0xce, 0xe9, 0x24, 0x30, - 0x46, 0x77, 0xbf, 0x6d, 0x0c, 0x9d, 0x3c, 0xbe, 0xed, 0xe7, 0xd8, 0x6b, - 0xac, 0x29, 0x36, 0x73, 0x98, 0x20, 0x3a, 0x47, 0x55, 0xa4, 0x4f, 0x16, - 0xbe, 0x67, 0x68, 0x55, 0xa3, 0x2e, 0xce, 0x74, 0xe7, 0x7e, 0x78, 0x68, - 0x51, 0x85, 0x5e, 0xdd, 0x1c, 0xe8, 0x38, 0x79, 0x0c, 0x22, 0x79, 0xcf, - 0x1b, 0x03, 0xe6, 0x8b, 0xc4, 0xe6, 0x08, 0xd2, 0x46, 0x06, 0x44, 0x0c, - 0xf7, 0x02, 0xd2, 0xf8, 0xc7, 0x15, 0x04, 0xc7, 0x02, 0xc8, 0x5b, 0xb3, - 0x01, 0x52, 0x06, 0xd3, 0xf9, 0x51, 0xf6, 0x17, 0xb9, 0xe6, 0x2c, 0xec, - 0x32, 0x7c, 0xe0, 0x36, 0xa9, 0x38, 0x5a, 0x0d, 0x16, 0x27, 0xdf, 0xab, - 0x8f, 0x17, 0xbc, 0x9d, 0x5f, 0x06, 0x25, 0xf9, 0x8e, 0x52, 0xe9, 0x16, - 0x7b, 0x5d, 0xe8, 0xc9, 0xc3, 0xce, 0x09, 0x4a, 0xbe, 0x1a, 0x49, 0x32, - 0x2c, 0x86, 0xed, 0xbe, 0x56, 0x31, 0x5e, 0xfc, 0x0d, 0xeb, 0x0e, 0x3e, - 0x4b, 0x4f, 0xd9, 0xc8, 0x47, 0x71, 0xbf, 0x76, 0x6d, 0xf8, 0x9e, 0x86, - 0xc2, 0xf2, 0xe1, 0x81, 0x32, 0x01, 0x19, 0x5f, 0xdb, 0x67, 0xb5, 0xda, - 0x07, 0x5b, 0x8d, 0xe0, 0xb6, 0x88, 0x4d, 0xe6, 0x53, 0x26, 0x82, 0xec, - 0xeb, 0x72, 0x4c, 0x33, 0x6d, 0xca, 0x67, 0x15, 0xe7, 0x28, 0x55, 0xae, - 0xf5, 0x0d, 0x51, 0xac, 0xa9, 0x65, 0xf2, 0x8b, 0x07, 0x88, 0x06, 0xb4, - 0x10, 0xf7, 0xbf, 0x80, 0xf0, 0x0f, 0x4b, 0x69, 0x3e, 0x94, 0xc6, 0xda, - 0x9b, 0x34, 0xd7, 0x47, 0xa3, 0x32, 0x27, 0x0e, 0x79, 0x13, 0xf1, 0xe6, - 0x9e, 0xa2, 0x67, 0x3a, 0xa0, 0xec, 0x4f, 0x23, 0x5f, 0x0a, 0xfb, 0x81, - 0x36, 0xa4, 0x27, 0x67, 0x50, 0x4f, 0x00, 0xf5, 0x57, 0x1d, 0x52, 0x0e, - 0xda, 0x0f, 0x41, 0xe1, 0x3e, 0xec, 0x24, 0x68, 0xc9, 0x79, 0x60, 0x68, - 0x7e, 0x73, 0x15, 0x6f, 0x87, 0xa5, 0x4d, 0x8c, 0x94, 0xae, 0xb7, 0xc7, - 0x24, 0xd2, 0x10, 0x8a, 0xcd, 0x2a, 0xf3, 0x75, 0x60, 0x07, 0x6d, 0x5f, - 0x28, 0x2f, 0xc5, 0xc3, 0x3f, 0x2c, 0x4e, 0x93, 0xc3, 0x61, 0x8b, 0xc4, - 0xf8, 0x88, 0xef, 0xb4, 0x73, 0x39, 0xe5, 0x89, 0x13, 0x1b, 0xad, 0x66, - 0x5a, 0x1f, 0xf5, 0x5b, 0x38, 0xc5, 0xfb, 0x53, 0xb5, 0x8e, 0x73, 0xe4, - 0xa4, 0x22, 0x43, 0x4a, 0x22, 0x43, 0x2e, 0x32, 0x56, 0x4d, 0x82, 0xec, - 0x56, 0x8d, 0x89, 0xc7, 0xa1, 0xe2, 0xcc, 0xf4, 0x8c, 0x42, 0xa7, 0xb3, - 0xe7, 0x50, 0xd9, 0xf2, 0x7c, 0x35, 0x75, 0x63, 0xd9, 0xcf, 0x02, 0x61, - 0xc7, 0x46, 0x7e, 0xb9, 0x29, 0xd1, 0x04, 0xa1, 0x5d, 0x83, 0x03, 0x15, - 0x73, 0x1f, 0x7e, 0x90, 0x77, 0x37, 0x14, 0x2e, 0xa4, 0x54, 0x40, 0x6a, - 0x2f, 0x2d, 0x5b, 0x85, 0x52, 0x8e, 0xfb, 0x08, 0x25, 0x1c, 0x9e, 0x4c, - 0x65, 0x6a, 0xb4, 0xba, 0xeb, 0x4b, 0x36, 0x82, 0xc0, 0x55, 0x9d, 0x5c, - 0x6d, 0x7c, 0x9d, 0xe3, 0xf0, 0xa3, 0xf7, 0x63, 0x57, 0x7d, 0x57, 0x9f, - 0x63, 0x5d, 0x87, 0x5a, 0xa4, 0xfd, 0xb5, 0x37, 0xf6, 0x76, 0x61, 0x9d, - 0xf6, 0xb3, 0xaa, 0x6f, 0x71, 0xa6, 0x2a, 0x66, 0x83, 0x53, 0xdd, 0x89, - 0xe1, 0x8e, 0x50, 0x78, 0x41, 0x74, 0x36, 0xd1, 0x27, 0xcd, 0xef, 0x81, - 0x82, 0xb7, 0x69, 0xd4, 0xfe, 0x39, 0x10, 0xeb, 0xa3, 0x45, 0x4e, 0x3a, - 0x9b, 0xf2, 0x0c, 0xc8, 0x4f, 0xd6, 0x7e, 0x15, 0x46, 0x2b, 0x31, 0x1b, - 0xee, 0xd1, 0x7f, 0x2b, 0x10, 0xe4, 0x08, 0xd8, 0x35, 0x4b, 0xc9, 0x95, - 0xdc, 0xef, 0x5e, 0xae, 0x2f, 0x02, 0xc5, 0x26, 0xf0, 0x97, 0xfb, 0x54, - 0xb3, 0x96, 0x98, 0x9f, 0x56, 0x1f, 0xaf, 0x22, 0xba, 0x07, 0x4d, 0xcf, - 0x17, 0x56, 0x2a, 0x36, 0xfe, 0x9f, 0x01, 0x6a, 0x24, 0x8f, 0x80, 0x03, - 0x0c, 0x71, 0x23, 0x8a, 0x11, 0xb3, 0x39, 0x00, 0x56, 0x8a, 0xa1, 0xcc, - 0xaf, 0xe3, 0xd9, 0xbb, 0xd3, 0x11, 0x71, 0x12, 0x55, 0x00, 0x59, 0x6a, - 0xe2, 0xfd, 0xe1, 0x7c, 0xbd, 0xc3, 0xb2, 0x09, 0x02, 0x03, 0x00, 0x41, - 0x53, 0xe7, 0x0a, 0x1b, 0x6c, 0xa0, 0x57, 0xcb, 0x79, 0xfc, 0xa6, 0x25, - 0x2e, 0xa8, 0x61, 0xf8, 0x18, 0xde, 0x33, 0x0a, 0x6e, 0x32, 0x13, 0xfe, - 0xd4, 0xfe, 0xfa, 0x84, 0xf3, 0xe0, 0xeb, 0xfe, 0xaa, 0xc4, 0x47, 0x80, - 0xb9, 0x70, 0xd4, 0x06, 0xab, 0x03, 0x28, 0xcd, 0x07, 0x28, 0x4f, 0x79, - 0x53, 0xa6, 0x0a, 0x35, 0x30, 0x79, 0xa5, 0xd3, 0x2e, 0x66, 0xa3, 0x09, - 0x61, 0x23, 0x79, 0x8a, 0x2e, 0xba, 0x32, 0x6e, 0xb8, 0xce, 0xa9, 0x09, - 0x5d, 0xc4, 0xed, 0xf6, 0x92, 0xc6, 0x56, 0xad, 0xdd, 0x2a, 0x2d, 0xd4, - 0xd3, 0x4d, 0x13, 0xb0, 0xb1, 0xae, 0x98, 0x09, 0x53, 0x8e, 0x9d, 0x9e, - 0x0b, 0xcf, 0x52, 0x2d, 0xa6, 0x72, 0x5a, 0x94, 0x83, 0x5c, 0xfa, 0x5b, - 0xa2, 0x9a, 0x1e, 0x79, 0xd0, 0x47, 0x50, 0xda, 0x72, 0xc1, 0x49, 0xfb, - 0x8a, 0xdd, 0xaf, 0x30, 0x17, 0xe4, 0x23, 0xa9, 0x3e, 0xf0, 0xc0, 0xd3, - 0x1d, 0x99, 0x96, 0x2e, 0xac, 0xe2, 0xf5, 0x67, 0xcc, 0xae, 0x32, 0x4c, - 0x66, 0xa0, 0x1e, 0x09, 0x50, 0xe8, 0xd5, 0xe2, 0x95, 0xf5, 0xf4, 0x37, - 0xe6, 0x25, 0x62, 0xbc, 0xae, 0xb8, 0x4c, 0x4b, 0x66, 0x71, 0x35, 0xed, - 0xa6, 0xc6, 0xfd, 0x91, 0x5e, 0xf8, 0x82, 0xdf, 0x2d, 0x05, 0x4e, 0x16, - 0x36, 0xf1, 0x4c, 0xa4, 0x4b, 0x29, 0x78, 0x79, 0xcb, 0x22, 0x65, 0xf1, - 0x67, 0xa2, 0x9b, 0x92, 0xb6, 0xad, 0x04, 0xb0, 0x8a, 0x9d, 0x8b, 0x70, - 0x98, 0xa2, 0x95, 0x56, 0x2c, 0x41, 0x19, 0x2a, 0x71, 0x97, 0xbf, 0xac, - 0x63, 0xba, 0x6e, 0x71, 0x76, 0x39, 0x94, 0xb8, 0x40, 0x67, 0xd1, 0x6d, - 0xc1, 0x2a, 0xfe, 0x31, 0xe8, 0x18, 0xc2, 0x82, 0x69, 0xeb, 0xd9, 0xf1, - 0xe6, 0xa4, 0xfb, 0x52, 0x52, 0x8d, 0x99, 0xc4, 0x22, 0x92, 0xdd, 0x22, - 0xd3, 0x31, 0x37, 0x67, 0x2a, 0x8c, 0x4f, 0xa0, 0x15, 0x89, 0xc5, 0xb3, - 0x5f, 0x35, 0x80, 0x68, 0xf0, 0xd8, 0x30, 0xa9, 0x63, 0xc3, 0x22, 0xa9, - 0x3c, 0xdf, 0xd2, 0xa1, 0xe0, 0x32, 0x57, 0xd0, 0x41, 0x63, 0x56, 0x3e, - 0x5e, 0x9b, 0x29, 0xb7, 0xaf, 0x3b, 0xc1, 0x93, 0x6f, 0x3e, 0xc8, 0x36, - 0x34, 0x1a, 0xee, 0x14, 0xe4, 0x5c, 0xea, 0xf8, 0x08, 0xe1, 0xa3, 0x73, - 0xb0, 0xe6, 0x1f, 0x59, 0x7b, 0x30, 0x3b, 0x12, 0x12, 0x6b, 0x75, 0x10, - 0xa5, 0x81, 0x2d, 0x87, 0x07, 0x71, 0xa1, 0x03, 0xf1, 0x75, 0x88, 0x9c, - 0xf2, 0x69, 0x47, 0xbc, 0x59, 0xe1, 0xb1, 0x68, 0xff, 0x62, 0xd1, 0xc3, - 0x8e, 0xf4, 0x8a, 0xa0, 0xd6, 0x2f, 0x69, 0x7e, 0x6d, 0xcb, 0xb6, 0x27, - 0x03, 0x50, 0xce, 0x25, 0x1a, 0x51, 0xc3, 0xd0, 0x0d, 0x04, 0xa5, 0x27, - 0x8b, 0x61, 0x5b, 0x19, 0xc0, 0x54, 0x45, 0xef, 0x8a, 0x2a, 0xdd, 0x90, - 0x81, 0x71, 0x8a, 0x32, 0x4c, 0xaa, 0xcf, 0x1d, 0xae, 0x55, 0xa1, 0x7b, - 0x0d, 0x43, 0xd4, 0x40, 0x0f, 0x80, 0xb4, 0xb7, 0x3c, 0xde, 0x3d, 0xcd, - 0x70, 0x90, 0x5c, 0x50, 0xbe, 0x9b, 0x20, 0xe6, 0x73, 0x56, 0xae, 0xb5, - 0xea, 0x85, 0xc7, 0x39, 0x75, 0x19, 0x2e, 0x3f, 0x51, 0x84, 0x38, 0xdd, - 0x6d, 0x06, 0x1b, 0x84, 0x3b, 0x8c, 0x3d, 0xa8, 0xee, 0xe2, 0xb3, 0x94, - 0x1c, 0x4f, 0x96, 0x66, 0xcd, 0xa1, 0x37, 0x7c, 0x1f, 0x11, 0xad, 0xea, - 0x82, 0x9d, 0x4f, 0x14, 0xbf, 0xdc, 0xb9, 0xd7, 0x44, 0x5d, 0x4c, 0xa3, - 0x38, 0x8f, 0x40, 0x20, 0x3f, 0xba, 0x3e, 0x28, 0xcd, 0xe3, 0xa9, 0x1d, - 0x25, 0x92, 0x98, 0xba, 0x48, 0x84, 0xcf, 0x87, 0xcc, 0xed, 0x42, 0x1b, - 0x4e, 0x8f, 0x2d, 0x48, 0x1f, 0xe8, 0x5a, 0xf5, 0x72, 0x2b, 0x81, 0x07, - 0x2c, 0x46, 0x6f, 0xb4, 0x8a, 0xad, 0xff, 0xf2, 0x1a, 0xc9, 0xf3, 0xa0, - 0x2b, 0xed, 0xc8, 0xc2, 0x17, 0x87, 0x05, 0x2d, 0xed, 0x5a, 0x3d, 0x54, - 0x1a, 0x6f, 0x7b, 0xd4, 0x06, 0x29, 0xc6, 0xcf, 0x2d, 0xfe, 0xc1, 0xdf, - 0xdc, 0xa5, 0x4a, 0x15, 0xdd, 0xb2, 0x10, 0x10, 0xf4, 0x81, 0x47, 0x4b, - 0xbc, 0x3d, 0x02, 0x90, 0xf0, 0xd8, 0x30, 0xa9, 0x63, 0xc3, 0x22, 0xa9, - 0xaf, 0x3b, 0xc1, 0x93, 0x6f, 0x3e, 0xc8, 0x36, 0x34, 0x1a, 0xee, 0x14, - 0xe4, 0x5c, 0xea, 0x08, 0x77, 0xad, 0x04, 0x49, 0x48, 0x9d, 0x8b, 0x89, - 0x5b, 0xa2, 0x95, 0xaf, 0xd4, 0xbe, 0xe6, 0x2c, 0xf2, 0x20, 0x50, 0xc5, - 0x80, 0xae, 0xf6, 0xe5, 0xcd, 0xfb, 0xf6, 0x20, 0xac, 0xba, 0x7d, 0x84, - 0xfb, 0x5c, 0xf1, 0xc5, 0x99, 0x56, 0x32, 0x6e, 0xd7, 0xfe, 0xf1, 0xe0, - 0xc8, 0x8a, 0x22, 0xcb, 0x2c, 0x6f, 0xaa, 0xfc, 0x4b, 0x9d, 0x45, 0x09, - 0x1a, 0xe4, 0x1a, 0x06, 0x40, 0xdf, 0xc4, 0x67, 0xe9, 0x2c, 0xb2, 0xc9, - 0x72, 0x3c, 0x62, 0x5a, 0x8e, 0x05, 0xa9, 0x83, 0xea, 0xcf, 0xd0, 0x0f, - 0x2a, 0x02, 0xda, 0x89, 0x1d, 0xd1, 0x0a, 0x89, 0x99, 0x5a, 0xd8, 0xa8, - 0x19, 0x4f, 0xcd, 0xa9, 0xcc, 0x5c, 0x7e, 0x96, 0xf9, 0x67, 0xfa, 0x43, - 0xc0, 0x38, 0xdd, 0xbc, 0xdd, 0xdd, 0xee, 0xf2, 0xd5, 0xc8, 0xff, 0x43, - 0x3f, 0x7c, 0xd0, 0x38, 0x71, 0x0e, 0x2a, 0x3c, 0xde, 0x6f, 0x05, 0x50, - 0x4c, 0x1e, 0xac, 0xc7, 0x60, 0x68, 0x0c, 0x63, 0x3f, 0x38, 0x5e, 0xa1, - 0x27, 0x92, 0x32, 0x72, 0xc5, 0xd5, 0xf6, 0xc6, 0x50, 0xef, 0xca, 0xc2, - 0xaf, 0x32, 0xa4, 0x47, 0x33, 0x43, 0x8d, 0xd3, 0xb1, 0x72, 0xff, 0x67, - 0xfb, 0xf9, 0xbd, 0x3a, 0x57, 0xd3, 0xcb, 0xc0, 0x09, 0x4c, 0x96, 0xa3, - 0xaf, 0x62, 0xda, 0x6b, 0x2e, 0x61, 0x66, 0xda, 0x89, 0x9a, 0x89, 0x37, - 0xab, 0x6f, 0xe9, 0xaa, 0x4d, 0x3a, 0x36, 0xc2, 0x88, 0x60, 0xc7, 0x9e, - 0x2c, 0x41, 0x57, 0xfc, 0x48, 0xb3, 0xa6, 0x4e, 0xce, 0x27, 0x09, 0xdf, - 0x5d, 0x7b, 0x46, 0xfb, 0x91, 0xf2, 0x50, 0x08, 0x37, 0x9f, 0x62, 0x28, - 0x98, 0xa3, 0x3b, 0x74, 0xd7, 0x0c, 0x9d, 0xbf, 0x9b, 0x74, 0x67, 0xc1, - 0xc9, 0xd4, 0x12, 0x62, 0xf3, 0x95, 0xd4, 0xcf, 0x46, 0x9b, 0x3a, 0xbc, - 0x2b, 0x14, 0x0c, 0xa2, 0x4b, 0xc1, 0xf7, 0x1f, 0x12, 0x16, 0xec, 0xe6, - 0xd0, 0xe6, 0x27, 0x20, 0x55, 0x2d, 0x40, 0x8c, 0x00, 0x3c, 0xd1, 0xa8, - 0x06, 0xcd, 0x85, 0xbb, 0x45, 0xde, 0xf1, 0x0b, 0xc5, 0x17, 0x3b, 0x18, - 0xf0, 0x4d, 0xc0, 0xfa, 0xea, 0x8b, 0x15, 0x51, 0xc8, 0x23, 0x3a, 0x3d, - 0x57, 0xae, 0x2d, 0x73, 0x88, 0xf9, 0x84, 0xd0, 0xa7, 0xf5, 0xe9, 0xf0, - 0x1b, 0xd6, 0x78, 0x59, 0x5d, 0xea, 0x60, 0x50, 0x94, 0xdb, 0x7c, 0x5e, - 0x06, 0xcb, 0x9f, 0xf1, 0x64, 0x83, 0xa1, 0x1b, 0x3f, 0x9f, 0x9b, 0x9b, - 0xa6, 0xe5, 0x34, 0x93, 0x36, 0x6d, 0xee, 0x97, 0x10, 0xcc, 0x64, 0x83, - 0x4a, 0x0e, 0xa8, 0xd2, 0xa1, 0x9e, 0xf4, 0x4d, 0x39, 0x0d, 0x64, 0xf2, - 0x99, 0x15, 0xdc, 0xc8, 0xf8, 0xee, 0x93, 0x35, 0x54, 0x92, 0x2d, 0x95, - 0x85, 0x6c, 0x46, 0x1b, 0x79, 0x15, 0xbe, 0xd5, 0x00, 0x51, 0xc2, 0x81, - 0xc5, 0xdc, 0x9e, 0x3a, 0x38, 0x3b, 0x50, 0x3c, 0x79, 0xc7, 0xde, 0xfe, - 0x09, 0x2c, 0x71, 0x4f, 0xc3, 0xe0, 0x7b, 0xf7, 0xb5, 0x6a, 0x17, 0xc6, - 0x29, 0x13, 0x4f, 0x29, 0xd7, 0x0b, 0x85, 0x28, 0x40, 0x0d, 0x9b, 0xef, - 0x17, 0xe1, 0x23, 0x71, 0x89, 0x06, 0x6d, 0x85, 0x6e, 0x83, 0x0a, 0xac, - 0xc7, 0xa1, 0x81, 0x21, 0x96, 0x71, 0xfc, 0x23, 0xb5, 0x91, 0x0a, 0x9d, - 0xaa, 0xb5, 0x4a, 0x0b, 0xe1, 0xd4, 0xa0, 0x01, 0xf9, 0xf6, 0x7a, 0xdb, - 0x19, 0x1b, 0xab, 0xb6, 0xc0, 0x76, 0x0c, 0x75, 0xe2, 0x83, 0x23, 0xba, - 0x0a, 0xd2, 0xc0, 0xe0, 0xcd, 0xf7, 0x84, 0x3c, 0x09, 0xf7, 0x79, 0x41, - 0xe1, 0x5b, 0x96, 0xfc, 0x1b, 0x37, 0x09, 0x57, 0x5c, 0xb7, 0xd9, 0xb4, - 0xb6, 0xe8, 0x0b, 0xb8, 0x35, 0x91, 0x68, 0xc3, 0x42, 0xac, 0x71, 0xcf, - 0xe6, 0x9b, 0x7e, 0xc5, 0xca, 0xe5, 0x0f, 0x02, 0x0e, 0x48, 0x66, 0x3c, - 0x16, 0xa6, 0x85, 0xda, 0x6c, 0x4c, 0x63, 0xec, 0x9f, 0x78, 0xa9, 0x4e, - 0x29, 0x16, 0x63, 0x19, 0xc2, 0xad, 0xfc, 0x20, 0xe5, 0xbc, 0x1d, 0x17, - 0x29, 0x1c, 0x4d, 0x45, 0x91, 0x7f, 0x07, 0xe0, 0x9e, 0x22, 0x2d, 0x31, - 0x35, 0x87, 0xd7, 0x69, 0x53, 0x18, 0x77, 0x6b, 0xd6, 0xc5, 0xa0, 0xdf, - 0x77, 0xb5, 0x5f, 0x9e, 0x46, 0x81, 0xb2, 0x65, 0x26, 0xa8, 0x33, 0xa8, - 0x36, 0x48, 0xf9, 0xcf, 0xae, 0x8f, 0x14, 0xd9, 0x99, 0x2a, 0x5d, 0x89, - 0x35, 0xe8, 0x63, 0x55, 0xac, 0x35, 0xe0, 0x2c, 0x3c, 0x9d, 0x2c, 0x9c, - 0x8a, 0x17, 0x68, 0xa1, 0xfb, 0xe6, 0x9e, 0x73, 0x80, 0xa3, 0x91, 0x07, - 0x67, 0xc1, 0xa8, 0x9f, 0xc2, 0x8d, 0x5e, 0x2e, 0x7c, 0x7a, 0x7e, 0x2d, - 0x5f, 0xf5, 0xfc, 0xa9, 0x09, 0x5b, 0x41, 0xdc, 0x23, 0xc2, 0x7b, 0x8e, - 0xdc, 0xde, 0x02, 0xa8, 0x13, 0x0b, 0x4e, 0xba, 0xc8, 0x21, 0x73, 0xf3, - 0xd2, 0xa5, 0x7d, 0x23, 0xde, 0x3b, 0x8b, 0x21, 0xb1, 0x99, 0xe8, 0x23, - 0x28, 0x6b, 0x5c, 0xed, 0x46, 0xf6, 0x9d, 0x2d, 0x51, 0xd0, 0x26, 0xb9, - 0xf6, 0x32, 0xf0, 0x3b, 0x4b, 0xa7, 0x6a, 0x2e, 0x83, 0x88, 0x9a, 0xa9, - 0xf6, 0x5f, 0x74, 0x16, 0xed, 0x02, 0xf4, 0xfa, 0xc0, 0x1e, 0xdd, 0xf9, - 0x1d, 0xf6, 0x08, 0x9c, 0x9f, 0x11, 0x57, 0x95, 0x80, 0x17, 0xd4, 0x9c, - 0xb7, 0x67, 0x86, 0x8b, 0x1d, 0x09, 0xe9, 0xb3, 0xad, 0xd0, 0x44, 0xe3, - 0x30, 0x34, 0xbe, 0xf8, 0x0e, 0xb1, 0x04, 0x21, 0x81, 0x14, 0x77, 0x3c, - 0xa6, 0x00, 0x27, 0xb7, 0x1d, 0x09, 0x8a, 0x64, 0xa7, 0xc4, 0xba, 0x6d, - 0x9c, 0xe4, 0x5d, 0x74, 0x7c, 0x3e, 0xe0, 0x01, 0x2c, 0x21, 0x30, 0x35, - 0x1e, 0xdf, 0xe3, 0xb2, 0x83, 0x52, 0x83, 0x99, 0x23, 0xdf, 0xb3, 0xc9, - 0x4c, 0x75, 0xf1, 0xed, 0xd1, 0x42, 0x3d, 0xbb, 0x2e, 0xea, 0x8e, 0xd5, - 0xcd, 0xdf, 0x3d, 0x63, 0x88, 0x96, 0xc2, 0x08, 0xaf, 0xce, 0x31, 0x42, - 0xc6, 0x2c, 0xcc, 0xeb, 0x18, 0xa3, 0x7c, 0xc5, 0x72, 0x4c, 0x14, 0x79, - 0x64, 0x36, 0xce, 0xbd, 0x01, 0xd4, 0x33, 0x14, 0x18, 0xa3, 0x7c, 0xc5, - 0x72, 0x4c, 0x14, 0x79, 0xe9, 0xa2, 0x3b, 0xe8, 0x78, 0x2a, 0x45, 0x99, - 0x2f, 0x0f, 0xfd, 0x9c, 0x80, 0x32, 0xb9, 0xa9, 0xed, 0x6a, 0x2e, 0x54, - 0x25, 0x9b, 0x40, 0xeb, 0x64, 0x23, 0x89, 0xcc, 0x37, 0x94, 0xce, 0x51, - 0x35, 0x1d, 0x4f, 0xb3, 0xfb, 0xa0, 0xc4, 0x3a, 0x41, 0xb4, 0x71, 0xea, - 0x50, 0x1e, 0x61, 0x40, 0x6d, 0xe3, 0xd4, 0x0f, 0xf7, 0x43, 0xb9, 0xf2, - 0x53, 0x87, 0xe5, 0x04, 0x21, 0xb0, 0x35, 0x0d, 0x4c, 0x55, 0x56, 0xd7, - 0xcf, 0x22, 0x80, 0x92, 0x1c, 0x19, 0x8b, 0xca, 0x0a, 0xc0, 0xe0, 0x92, - 0xd4, 0xd3, 0xd2, 0xf3, 0x57, 0xb8, 0x1c, 0x7c, 0xb9, 0x43, 0x9e, 0x17, - 0xa9, 0x51, 0x52, 0x0e, 0x6b, 0xa4, 0x18, 0x87, 0x1e, 0x3f, 0x26, 0x41, - 0x61, 0xa6, 0xab, 0xe3, 0x83, 0x30, 0x91, 0x17, 0x15, 0x60, 0x47, 0xa4, - 0x9c, 0xf2, 0x46, 0xf2, 0xb7, 0x12, 0x9e, 0x66, 0xa9, 0xcf, 0x50, 0x9a, - 0x5d, 0xab, 0x92, 0x2a, 0xe9, 0x98, 0x4d, 0xfc, 0x13, 0x7a, 0x4f, 0x19, - 0xd5, 0x17, 0x8c, 0x8d, 0xca, 0x42, 0xb9, 0x56, 0xd8, 0xf7, 0x07, 0xac, - 0x59, 0x18, 0xd3, 0xa8, 0xc4, 0x10, 0x6a, 0xef, 0x26, 0x5d, 0xc4, 0x17, - 0xbf, 0xd5, 0xba, 0x66, 0xd8, 0xf0, 0x02, 0x63, 0x6f, 0xcd, 0x46, 0x56, - 0xd7, 0x72, 0xa7, 0x9f, 0x55, 0x3b, 0x26, 0x22, 0x2a, 0xfe, 0xc8, 0x95, - 0x20, 0x59, 0x45, 0xd8, 0x5d, 0x38, 0xc4, 0xf6, 0xc9, 0xea, 0x92, 0x4d, - 0xf3, 0x35, 0xd8, 0xf4, 0x98, 0xac, 0xb4, 0x7f, 0xa3, 0x49, 0xbd, 0x94, - 0x53, 0xef, 0xfb, 0x53, 0x66, 0x40, 0x58, 0x96, 0xe2, 0x24, 0xb8, 0x01, - 0x5f, 0xd2, 0x12, 0x9a, 0x02, 0x8c, 0x16, 0x42, 0xf8, 0x8e, 0x05, 0x39, - 0xb1, 0xe3, 0xc4, 0xfa, 0x02, 0xbc, 0xc2, 0xa6, 0xad, 0x60, 0x7c, 0x68, - 0xb3, 0xd6, 0x71, 0xa2, 0xd1, 0xc9, 0x71, 0x27, 0x3f, 0x5c, 0x1e, 0x45, - 0x6d, 0x16, 0x12, 0x5c, 0x38, 0x98, 0x01, 0x5a, 0xe5, 0xc2, 0xef, 0x77, - 0x1f, 0xd0, 0x36, 0xc0, 0x7a, 0x36, 0xcb, 0x69, 0x18, 0xa3, 0x7c, 0xc5, - 0x72, 0x4c, 0x14, 0x79, 0xe5, 0x0f, 0xd5, 0x0b, 0xd0, 0xf0, 0x46, 0x98, - 0x84, 0x45, 0x67, 0xf7, 0x28, 0x68, 0x00, 0x31, 0xb7, 0x42, 0xb8, 0x7a, - 0xa9, 0xdf, 0x93, 0xc4, 0xc8, 0xc4, 0xc2, 0xda, 0x32, 0x57, 0xd1, 0x88, - 0x9b, 0xc9, 0x31, 0x42, 0xfe, 0x2b, 0xcc, 0xeb, 0x18, 0xa3, 0x7c, 0xc5, - 0x72, 0x4c, 0x14, 0x79, 0xe5, 0x0f, 0xd5, 0x0b, 0xd0, 0xf0, 0x46, 0x98, - 0x84, 0x45, 0x67, 0xf7, 0x28, 0x68, 0x00, 0x31, 0xea, 0x16, 0x6c, 0xd4, - 0x54, 0x77, 0x7a, 0x18, 0x23, 0xec, 0xcd, 0x4f, 0x4f, 0x22, 0x28, 0xb9, - 0xdc, 0x27, 0xb2, 0x18, 0x53, 0xe0, 0x37, 0x41, 0x26, 0x5e, 0x0c, 0x41, - 0x85, 0x97, 0x7c, 0x98, 0x77, 0x21, 0xfc, 0xc4, 0x91, 0xec, 0x5e, 0x79, - 0xab, 0xb7, 0x16, 0x1f, 0x97, 0xcc, 0x13, 0xec, 0xb4, 0xfe, 0x35, 0x73, - 0xd5, 0x7d, 0x30, 0x8d, 0x33, 0x8a, 0xd3, 0xb3, 0x0b, 0x4c, 0x39, 0x8f, - 0xfa, 0x75, 0x7a, 0x3f, 0x02, 0x0b, 0xd5, 0x6b, 0xab, 0x56, 0x22, 0x35, - 0x5c, 0xa2, 0x88, 0x61, 0x5a, 0x51, 0xd2, 0x6d, 0x1f, 0x1e, 0xe4, 0x8f, - 0x71, 0x53, 0x96, 0x3f, 0x08, 0x4d, 0x5e, 0x4d, 0x15, 0x2b, 0x61, 0xdd, - 0xff, 0xf1, 0xfa, 0x8a, 0x1c, 0xa5, 0xae, 0x43, 0x79, 0xa3, 0x98, 0xe8, - 0x4e, 0x55, 0x56, 0xd7, 0xce, 0x22, 0x80, 0x92, 0x1b, 0x19, 0x8b, 0xca, - 0x0a, 0xc0, 0xe0, 0x92, 0x40, 0x8c, 0xfb, 0x70, 0x30, 0xee, 0xa0, 0xac, - 0xe8, 0xed, 0xaf, 0x50, 0x5f, 0xe7, 0xb8, 0xdc, 0x06, 0x89, 0xe7, 0x01, - 0x53, 0x3d, 0xba, 0x17, 0x19, 0x8a, 0x96, 0x04, 0x85, 0x7a, 0xbf, 0xa6, - 0xa6, 0xfb, 0x62, 0xae, 0x4f, 0x2d, 0x18, 0x00, 0x76, 0xf7, 0x13, 0xb3, - 0xee, 0xec, 0x28, 0x0a, 0x17, 0xae, 0x43, 0x1e, 0x4a, 0x2c, 0xad, 0x84, - 0xf2, 0xa1, 0x54, 0x4b, 0x51, 0x99, 0x8b, 0x27, 0xd0, 0x51, 0x6b, 0x80, - 0xdd, 0x04, 0xa2, 0xec, 0xff, 0x46, 0x5a, 0xf3, 0x7e, 0x84, 0xf2, 0xe7, - 0x10, 0x21, 0x87, 0xdd, 0x38, 0xed, 0x24, 0xfd, 0x42, 0xff, 0x63, 0x1c, - 0x63, 0x4c, 0x63, 0x50, 0x4b, 0x81, 0x65, 0x0c, 0x6b, 0x21, 0xbd, 0x85, - 0x78, 0x3d, 0xbb, 0xe7, 0x73, 0xda, 0x45, 0xe8, 0xa1, 0x16, 0x3a, 0x6d, - 0x88, 0x38, 0xee, 0xa3, 0xec, 0xf0, 0x94, 0xda, 0xe0, 0xfa, 0x6b, 0xc0, - 0x0e, 0x17, 0xc4, 0x12, 0xc8, 0x27, 0xa6, 0xdd, 0x80, 0x64, 0x19, 0x81, - 0xad, 0xcb, 0x52, 0x95, 0xf0, 0x4c, 0x03, 0xa9, 0x6f, 0x16, 0x9a, 0x3b, - 0x03, 0x8a, 0xd0, 0x3f, 0x2c, 0x5a, 0x1c, 0x4b, 0x1e, 0x27, 0xef, 0x68, - 0x90, 0x10, 0x01, 0x27, 0x32, 0x39, 0xcd, 0xfe, 0xd6, 0x6c, 0xbd, 0xb7, - 0x76, 0xd4, 0xf4, 0x24, 0x6f, 0xf6, 0xe9, 0x51, 0xe2, 0x5d, 0xc2, 0xae, - 0x82, 0x5e, 0x3a, 0x23, 0x9e, 0xe9, 0xf7, 0xef, 0x1b, 0xed, 0xbf, 0xb4, - 0x06, 0x70, 0xe9, 0x0b, 0x7f, 0x53, 0x2d, 0xf3, 0x72, 0xd8, 0x44, 0xa5, - 0x99, 0x19, 0xe5, 0x4c, 0x19, 0xb7, 0x4c, 0x8d, 0x93, 0x9e, 0x13, 0x4c, - 0x06, 0x80, 0xc1, 0x51, 0x91, 0xcb, 0x79, 0xd9, 0x6a, 0x59, 0xa5, 0xcb, - 0x0d, 0xc9, 0xfb, 0x81, 0xda, 0x5e, 0xc3, 0x6e, 0x80, 0x72, 0xa8, 0xcd, - 0x63, 0xf5, 0x00, 0x16, 0xb7, 0xbc, 0x29, 0x03, 0xd3, 0xca, 0x18, 0x89, - 0x27, 0x78, 0x72, 0xed, 0x95, 0xea, 0xd7, 0x87, 0xce, 0xdc, 0xfe, 0x72, - 0xaf, 0x53, 0x26, 0xb3, 0x48, 0x22, 0xd5, 0xa1, 0x29, 0x4e, 0xb8, 0xf8, - 0xa6, 0x86, 0xeb, 0xc0, 0x0c, 0x67, 0x53, 0x0e, 0x30, 0xea, 0x1b, 0x3d, - 0x49, 0x53, 0x5f, 0xea, 0xaf, 0x0c, 0x91, 0xce, 0x0c, 0x67, 0x93, 0x0e, - 0x30, 0xea, 0x5b, 0x3d, 0x49, 0x53, 0x1f, 0xea, 0xaf, 0x0c, 0xd1, 0xce, - 0x0c, 0x67, 0x93, 0x0e, 0x30, 0xea, 0x5b, 0x3d, 0x49, 0x53, 0x1f, 0xea, - 0xaf, 0x0c, 0xd1, 0xce, 0x00, 0xc1, 0xc2, 0xd5, 0xd6, 0x19, 0xa7, 0x50, - 0x5e, 0xe3, 0xde, 0x94, 0x60, 0xd8, 0x6a, 0x70, 0x52, 0x06, 0xd4, 0x88, - 0x35, 0x52, 0xd7, 0x2c, 0x4a, 0x00, 0xa3, 0xbc, 0xcc, 0x39, 0xbe, 0xa0, - 0x5f, 0x38, 0x8c, 0x44, 0xbe, 0x81, 0xb5, 0x71, 0x52, 0x62, 0xc9, 0xde, - 0xae, 0xd6, 0x4b, 0xbb, 0x7b, 0x56, 0x74, 0xee, 0x21, 0x29, 0x18, 0xdd, - 0x70, 0x70, 0xb9, 0xe8, 0xa1, 0x26, 0x43, 0xc1, 0xfb, 0x47, 0xc2, 0x8b, - 0x18, 0xc5, 0x98, 0x18, 0xf2, 0x47, 0xf7, 0x8a, 0x8a, 0x6b, 0xfe, 0x22, - 0x16, 0x17, 0xc4, 0x53, 0xd7, 0x27, 0x26, 0x9c, 0x80, 0x64, 0x19, 0x81, - 0xad, 0xcb, 0x52, 0x95, 0x83, 0x8d, 0xb1, 0xe1, 0x9a, 0x20, 0x97, 0x8b, - 0x38, 0x16, 0x7e, 0x02, 0x98, 0x5c, 0xca, 0x53, 0x01, 0x36, 0x78, 0x06, - 0x85, 0x3b, 0x14, 0xac, 0xed, 0xbc, 0x18, 0xc6, 0x5c, 0x87, 0x86, 0x2f, - 0xbe, 0xff, 0xac, 0x39, 0x75, 0x73, 0x4f, 0x0d, 0x07, 0xf8, 0xcd, 0x55, - 0xbe, 0x4f, 0x81, 0x86, 0x7e, 0x8a, 0xf6, 0xb9, 0x03, 0x76, 0x44, 0x72, - 0x4d, 0xad, 0x85, 0xec, 0xac, 0x1d, 0x2d, 0x64, 0xb0, 0xfc, 0x7e, 0xfe, - 0x8b, 0x66, 0x56, 0xcb, 0x50, 0xa7, 0x3c, 0xaa, 0x99, 0x2f, 0x93, 0xaa, - 0x73, 0x0c, 0x15, 0x92, 0x54, 0xa8, 0xf1, 0xb8, 0xaa, 0xb2, 0x3f, 0x5a, - 0x50, 0xce, 0xfa, 0xef, 0xec, 0xa7, 0xbf, 0xf0, 0x6e, 0x83, 0x66, 0x3d, - 0x6c, 0x3e, 0xda, 0x83, 0xec, 0xb9, 0x8f, 0xf9, 0xe2, 0x77, 0xa3, 0xb5, - 0xdf, 0x8f, 0x3a, 0x76, 0xc8, 0x41, 0x11, 0x35, 0xd3, 0x24, 0x1c, 0x25, - 0xc7, 0xd1, 0x67, 0x29, 0xa8, 0x08, 0xd1, 0x50, 0xba, 0xaa, 0x22, 0xa0, - 0xfe, 0xb1, 0x53, 0x8d, 0x45, 0x8a, 0xe7, 0xd7, 0x47, 0xac, 0x07, 0x0e, - 0x78, 0x1a, 0x75, 0x24, 0x0d, 0x4a, 0xd8, 0xec, 0x64, 0xf0, 0x32, 0xb9, - 0x0b, 0x1b, 0x6f, 0xe9, 0xf5, 0x52, 0xa7, 0xec, 0xb7, 0x66, 0xae, 0x69, - 0x6a, 0x1f, 0x1f, 0xc4, 0x21, 0x84, 0xfa, 0xed, 0xf7, 0xd7, 0xe3, 0x4d, - 0xec, 0xd4, 0x19, 0x39, 0x0a, 0x45, 0xc5, 0x22, 0xf7, 0xa1, 0x5e, 0x0f, - 0x8f, 0x48, 0xa6, 0xd5, 0xf5, 0xe5, 0x7d, 0xa6, 0x24, 0x57, 0x7d, 0xe5, - 0xa8, 0x81, 0x8c, 0x05, 0x6f, 0x86, 0x93, 0xff, 0x5c, 0x8a, 0x19, 0x11, - 0x6e, 0xed, 0x2d, 0x76, 0x57, 0x12, 0xbe, 0xe5, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0xb1, 0x4d, 0xf5, 0xde, - 0x2f, 0xe2, 0x68, 0xb7, 0xec, 0x89, 0x53, 0xb7, 0x8a, 0x69, 0x8d, 0x42, - 0xf2, 0xfd, 0xcf, 0xe4, 0x42, 0x2d, 0x72, 0x9c, 0x06, 0xef, 0xe2, 0x4e, - 0x28, 0x16, 0x57, 0x3f, 0xf3, 0xfd, 0xcf, 0xe4, 0x43, 0x2d, 0x72, 0x9c, - 0x06, 0xef, 0xe2, 0x4e, 0x28, 0x16, 0x57, 0x3f, 0x47, 0x14, 0x94, 0x85, - 0x2a, 0x9b, 0x06, 0x4a, 0x90, 0x92, 0x75, 0xaa, 0x50, 0x48, 0x93, 0x42, - 0x1b, 0xf0, 0x2a, 0xf4, 0x2e, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0xfd, 0x66, 0xa2, 0x59, - 0xc1, 0x02, 0xd6, 0x56, 0xcd, 0x22, 0xbd, 0x06, 0xe7, 0x5f, 0x8c, 0x90, - 0x20, 0x21, 0x47, 0xdf, 0x08, 0xed, 0x64, 0xfe, 0x42, 0xff, 0x63, 0x1c, - 0x63, 0x4c, 0x63, 0x50, 0x4b, 0x81, 0x65, 0x0c, 0x6b, 0x21, 0xbd, 0x85, - 0x78, 0x3d, 0xbb, 0xe7, 0x73, 0xda, 0x45, 0xe8, 0x49, 0x3a, 0x7f, 0x54, - 0xa7, 0x5a, 0x2c, 0x23, 0xf0, 0x49, 0xda, 0x1f, 0xd8, 0x66, 0xc7, 0x18, - 0x2f, 0x31, 0x0b, 0x49, 0x5d, 0x74, 0x25, 0x3d, 0xb5, 0xec, 0x88, 0x3f, - 0x82, 0x67, 0xd1, 0xd8, 0xa7, 0xca, 0xe4, 0x98, 0x0f, 0xe2, 0x4f, 0xb8, - 0xc1, 0x9a, 0x15, 0x28, 0x2a, 0x4f, 0x18, 0xe9, 0x6e, 0x77, 0x82, 0xfb, - 0xf7, 0xf6, 0x52, 0x19, 0xbe, 0xe2, 0x6c, 0x15, 0x56, 0x6e, 0x2e, 0xba, - 0x06, 0xa5, 0xc7, 0x9d, 0x93, 0x1b, 0xc8, 0x99, 0xa4, 0xf3, 0x2d, 0x9f, - 0x1b, 0x1e, 0xcb, 0xe5, 0x3d, 0x1b, 0xa7, 0xae, 0xda, 0x3f, 0xc6, 0x2c, - 0xca, 0xb5, 0x52, 0xfa, 0xe5, 0x55, 0xaf, 0x95, 0x64, 0x5f, 0x91, 0xd2, - 0x44, 0xd3, 0xe6, 0x84, 0xb0, 0x90, 0xaf, 0x5c, 0x27, 0xe5, 0x62, 0xc1, - 0x4b, 0x81, 0x65, 0x0c, 0x6b, 0x21, 0xbd, 0x85, 0x44, 0x3d, 0xbb, 0xe7, - 0x5f, 0xda, 0x45, 0xe8, 0xeb, 0xef, 0x7c, 0x82, 0x5b, 0x51, 0x8e, 0xa5, - 0x2f, 0xa0, 0x04, 0x1a, 0x2d, 0xeb, 0x50, 0xd7, 0xff, 0xba, 0x3d, 0xc4, - 0x79, 0x81, 0x5e, 0x99, 0xf4, 0x1e, 0x1b, 0x32, 0x53, 0x22, 0x4e, 0x99, - 0x25, 0xad, 0x2d, 0x66, 0xcb, 0xf7, 0x97, 0x5d, 0xb3, 0x31, 0xe6, 0x60, - 0xe5, 0x4e, 0x6b, 0xf8, 0xa5, 0x1b, 0x70, 0x09, 0xdb, 0x4e, 0x23, 0x46, - 0x01, 0xf3, 0x3a, 0xba, 0xf1, 0x03, 0xc7, 0x84, 0x9e, 0xb0, 0x15, 0x12, - 0xc5, 0xab, 0xb1, 0x22, 0x33, 0xb3, 0xca, 0xe9, 0x4f, 0x4d, 0x7c, 0x4f, - 0xac, 0xbb, 0x4c, 0xb8, 0xbf, 0x9c, 0xf6, 0x8a, 0x39, 0x80, 0x54, 0x05, - 0xd8, 0x34, 0xad, 0xa4, 0xf6, 0x2e, 0x20, 0x13, 0xe7, 0x63, 0x27, 0xda, - 0x1c, 0x51, 0xf8, 0x26, 0x0d, 0x0a, 0xb3, 0x46, 0xf5, 0xa9, 0xd9, 0x4f, - 0x7d, 0x53, 0x60, 0x4f, 0x32, 0x5f, 0x8f, 0x8a, 0x00, 0x60, 0x9c, 0xbf, - 0x41, 0x0a, 0x75, 0x5e, 0x8c, 0xda, 0x31, 0x09, 0xa1, 0xea, 0x50, 0xda, - 0x3a, 0xc2, 0xdb, 0x95, 0xfa, 0x96, 0x27, 0x36, 0x5d, 0x1d, 0x79, 0xd7, - 0x96, 0x69, 0xb6, 0xc9, 0x82, 0xd6, 0xc2, 0xdf, 0x1b, 0xa3, 0x10, 0x2e, - 0xb5, 0x6c, 0x34, 0x5b, 0x89, 0xc3, 0x80, 0xc7, 0x15, 0xb0, 0x88, 0x94, - 0xef, 0x01, 0x87, 0x2f, 0x84, 0xad, 0x46, 0x70, 0xcd, 0x6d, 0x2c, 0x0e, - 0x6f, 0x25, 0xf0, 0x08, 0xf8, 0x86, 0x8c, 0x05, 0x7c, 0x27, 0x04, 0x5d, - 0xbc, 0x88, 0xf8, 0xf8, 0x81, 0xf8, 0xd2, 0x2a, 0xd9, 0xc2, 0x75, 0xd1, - 0x0e, 0x0e, 0x21, 0xec, 0x7c, 0x3c, 0xb0, 0x9e, 0x8c, 0x08, 0x59, 0xa0, - 0xcf, 0x91, 0xba, 0x23, 0x46, 0x0d, 0x26, 0x9d, 0x1b, 0x84, 0x99, 0xb5, - 0x13, 0x44, 0xf5, 0xf9, 0x94, 0x1c, 0xd4, 0xf8, 0xaf, 0x76, 0x8b, 0x53, - 0x8a, 0x71, 0x61, 0x14, 0xa1, 0x2c, 0x9e, 0xcf, 0x8f, 0xa9, 0xb6, 0x51, - 0xc2, 0x9a, 0xa3, 0x4e, 0x94, 0xa6, 0x91, 0xf6, 0xff, 0x82, 0x34, 0x24, - 0xd7, 0xd4, 0x9d, 0xc7, 0x32, 0x24, 0x79, 0x1b, 0x35, 0x0e, 0x77, 0x38, - 0xc7, 0x1a, 0x8a, 0xf5, 0x32, 0x04, 0x1c, 0x67, 0xe4, 0x6e, 0x41, 0xde, - 0xf2, 0xa9, 0x7b, 0xb9, 0x49, 0xf6, 0x14, 0x00, 0x16, 0xc0, 0x73, 0xea, - 0x5c, 0x17, 0xb7, 0x6f, 0x65, 0xa7, 0xe2, 0x1a, 0x57, 0xc1, 0xca, 0xd3, - 0xd6, 0xe8, 0x0a, 0xe5, 0xa8, 0xb5, 0xc0, 0x9a, 0x89, 0xa8, 0x94, 0xb9, - 0xdb, 0x0d, 0x33, 0xdf, 0x86, 0xa6, 0x2f, 0x96, 0x54, 0x66, 0x5d, 0x13, - 0xf1, 0xd2, 0x8d, 0xb4, 0x90, 0xe9, 0x5b, 0xc2, 0xb3, 0x67, 0xf7, 0xaa, - 0x93, 0xd4, 0x87, 0x13, 0x33, 0x3e, 0x78, 0xa5, 0x47, 0x45, 0x5f, 0x2e, - 0x29, 0x02, 0x6a, 0x35, 0x01, 0xdc, 0x1c, 0x28, 0xad, 0x29, 0x79, 0x5e, - 0x9e, 0x0f, 0x24, 0x49, 0x2f, 0xce, 0x30, 0x11, 0x11, 0xd3, 0xf2, 0xf0, - 0xd5, 0xc9, 0x3f, 0x2c, 0x5f, 0xae, 0x05, 0x69, 0xeb, 0xe6, 0x6d, 0x4e, - 0x34, 0x36, 0x8f, 0x1d, 0x12, 0x00, 0x74, 0xea, 0x47, 0xe2, 0x98, 0x17, - 0x9a, 0xa5, 0x22, 0x12, 0x57, 0xe5, 0x9c, 0xae, 0x3d, 0xaf, 0x8f, 0x89, - 0x3f, 0x7a, 0xed, 0xff, 0x4f, 0xb5, 0xe4, 0x47, 0xe1, 0xd6, 0x22, 0xee, - 0x9d, 0xf9, 0x16, 0xb6, 0x20, 0x1f, 0x1f, 0x01, 0xfc, 0x24, 0x64, 0xd2, - 0x96, 0xc2, 0xac, 0x07, 0x05, 0xc6, 0xb6, 0x0e, 0xce, 0xa1, 0x1a, 0xb4, - 0x74, 0xc1, 0xa1, 0xcc, 0x16, 0x51, 0xb9, 0x1c, 0xd7, 0xfa, 0x20, 0x2c, - 0x71, 0x3c, 0x5a, 0x1e, 0xb1, 0xfe, 0x89, 0xb9, 0x91, 0xc1, 0x6a, 0x60, - 0x83, 0x23, 0xe6, 0xd9, 0xb4, 0x87, 0x31, 0xd3, 0x4c, 0x52, 0xd4, 0x82, - 0x35, 0x0d, 0x6f, 0xb3, 0x04, 0x78, 0x94, 0xd3, 0x6c, 0x7e, 0x05, 0x0e, - 0x99, 0xf3, 0x3c, 0x92, 0x9c, 0xb1, 0x70, 0x74, 0xe3, 0x7b, 0xce, 0xba, - 0xab, 0xa4, 0xe2, 0x49, 0x99, 0x87, 0xfc, 0xd0, 0x7f, 0x1d, 0x44, 0x80, - 0x7c, 0xc5, 0x44, 0x82, 0xbb, 0x1d, 0x10, 0xcb, 0xb2, 0xca, 0xa2, 0x3e, - 0xbd, 0x55, 0xe6, 0xde, 0x1b, 0x33, 0xba, 0x8f, 0x48, 0xd4, 0x21, 0x8d, - 0x1e, 0x6b, 0xe9, 0x7d, 0xc3, 0xe5, 0x34, 0x44, 0x78, 0x16, 0x7d, 0x6b, - 0xf4, 0x3f, 0x24, 0x57, 0x57, 0xfe, 0x9e, 0xd4, 0xd8, 0x45, 0xed, 0x15, - 0xab, 0x28, 0x80, 0xcd, 0xcc, 0x05, 0x2b, 0x35, 0x71, 0x98, 0x36, 0xba, - 0x58, 0x36, 0xf0, 0xda, 0xec, 0xab, 0x89, 0x93, 0x9f, 0x6d, 0xd7, 0x5c, - 0x32, 0xfe, 0x11, 0xcc, 0xbd, 0x61, 0x45, 0x2c, 0x72, 0xca, 0x4d, 0x4d, - 0xd8, 0xf7, 0xad, 0x59, 0xb6, 0xf5, 0xf3, 0x0a, 0x73, 0x65, 0xae, 0x21, - 0xfb, 0xb5, 0x3c, 0x9a, 0x9f, 0x64, 0xce, 0x18, 0x55, 0x00, 0x88, 0xb0, - 0xdc, 0xc6, 0xc5, 0x72, 0x20, 0x3f, 0x3d, 0x3a, 0xc9, 0x40, 0x06, 0xb4, - 0x23, 0x9d, 0x3a, 0x45, 0xa9, 0x23, 0xb7, 0x1d, 0x8b, 0x1e, 0xc2, 0x2d, - 0x3c, 0x6a, 0x85, 0x02, 0x37, 0xf1, 0x89, 0x97, 0xe0, 0x2d, 0xc5, 0xc0, - 0xf0, 0x80, 0xb2, 0xdc, 0xf4, 0xd4, 0xb7, 0xc7, 0xeb, 0x05, 0x66, 0x08, - 0xca, 0x38, 0x5b, 0xfd, 0x9b, 0x95, 0xcc, 0x93, 0xaa, 0x39, 0x5a, 0x8f, - 0x83, 0x37, 0xd0, 0x0d, 0x58, 0x37, 0x20, 0x24, 0x5f, 0xf5, 0x34, 0x8d, - 0x2f, 0xc4, 0xbb, 0x0d, 0x2d, 0x82, 0x23, 0x78, 0xa8, 0xb5, 0xd9, 0x46, - 0x93, 0xcc, 0x56, 0xf1, 0xff, 0x5e, 0x71, 0x57, 0x24, 0x2d, 0x4a, 0x40, - 0x7f, 0xbc, 0x16, 0xa9, 0x92, 0x3a, 0x4a, 0xee, 0xf5, 0xfb, 0x09, 0xf6, - 0x89, 0xe2, 0x0a, 0x8b, 0x03, 0xdf, 0x63, 0x97, 0x0a, 0xd9, 0xc4, 0xa5, - 0xda, 0xe1, 0xf9, 0x96, 0xb1, 0x45, 0x4c, 0x76, 0xea, 0x4c, 0x2c, 0xdd, - 0x0f, 0xca, 0x70, 0x4d, 0x42, 0x71, 0xaa, 0x3b, 0x0f, 0x2c, 0x0f, 0x72, - 0x23, 0x2b, 0x7b, 0xf6, 0x11, 0x58, 0xb5, 0x2c, 0xfc, 0x55, 0x6e, 0x36, - 0xd0, 0x56, 0x88, 0x60, 0xc4, 0xd9, 0xde, 0xd8, 0x93, 0x5d, 0xfd, 0x81, - 0x95, 0x11, 0x8f, 0xce, 0x52, 0x94, 0x84, 0xdd, 0x4f, 0x33, 0x17, 0xcd, - 0x3a, 0x74, 0xa4, 0xb2, 0xe0, 0x24, 0xf0, 0x9b, 0xde, 0x99, 0xb2, 0x96, - 0x8a, 0xe3, 0x57, 0x7e, 0xdd, 0x27, 0x78, 0x11, 0x94, 0x1d, 0x2c, 0xe2, - 0x08, 0x48, 0x5e, 0x86, 0x17, 0x1f, 0xc6, 0xd0, 0xca, 0x21, 0x22, 0xf9, - 0x32, 0xca, 0x63, 0x9d, 0xc3, 0xed, 0xdf, 0xd7, 0x1b, 0xcc, 0x2b, 0x62, - 0xcf, 0xaf, 0xed, 0x2b, 0x4c, 0x2e, 0xee, 0xd8, 0x77, 0x83, 0xe9, 0x70, - 0x8b, 0xab, 0xcc, 0x2e, 0x3e, 0x17, 0x5c, 0x32, 0xd8, 0xc5, 0x3c, 0xa5, - 0x26, 0x7e, 0x95, 0x3d, 0x58, 0xe2, 0x72, 0x12, 0x42, 0x39, 0x74, 0xf5, - 0x9d, 0x88, 0x06, 0xf0, 0x5e, 0x3a, 0x61, 0x37, 0x97, 0xa6, 0xea, 0x4c, - 0xcc, 0xcc, 0xc7, 0xe6, 0x0b, 0xed, 0x72, 0x87, 0xfd, 0x6d, 0xa7, 0x6e, - 0xba, 0x25, 0x68, 0x3a, 0x1f, 0xd6, 0xdd, 0xfa, 0x2d, 0x66, 0xb8, 0x1a, - 0xc4, 0x36, 0x37, 0xf6, 0xa6, 0x03, 0x18, 0x52, 0xf2, 0xb2, 0x85, 0x82, - 0xf2, 0xf7, 0xfc, 0xac, 0xea, 0x23, 0xe7, 0x90, 0x72, 0x51, 0xfc, 0x72, - 0x90, 0xbb, 0xfa, 0xa1, 0x92, 0x9b, 0xa3, 0x08, 0xd7, 0x94, 0x23, 0x96, - 0x14, 0xfc, 0xd3, 0xdb, 0x68, 0x45, 0xd9, 0x85, 0x7a, 0x6b, 0x66, 0x18, - 0xe1, 0xa1, 0x7e, 0x05, 0x6a, 0xfd, 0x87, 0x1f, 0xde, 0xff, 0x50, 0x4c, - 0xd1, 0x7b, 0x6b, 0x5d, 0x4d, 0xef, 0xbc, 0xd9, 0x1a, 0x8c, 0xe9, 0x67, - 0xf1, 0x95, 0xff, 0x9b, 0x85, 0xc3, 0xdd, 0x65, 0x08, 0xbf, 0xdc, 0x27, - 0xe4, 0x87, 0x13, 0x8e, 0xa8, 0x82, 0x09, 0xd2, 0x61, 0x1d, 0xe4, 0x8a, - 0x0c, 0x85, 0xdf, 0x43, 0xb9, 0x15, 0x20, 0xc9, 0x44, 0xa1, 0x2a, 0x30, - 0x21, 0xfc, 0xc1, 0x61, 0xf7, 0x4e, 0xb7, 0x35, 0x1e, 0x71, 0xc6, 0x14, - 0x19, 0x24, 0x37, 0x98, 0x4a, 0x93, 0xe4, 0x9e, 0xd2, 0x2d, 0x21, 0xa5, - 0x13, 0xc6, 0xdc, 0xcb, 0xf0, 0xa2, 0x4a, 0x6e, 0x7e, 0x42, 0xfc, 0x15, - 0x6a, 0x0a, 0xbc, 0x8f, 0x44, 0x94, 0xab, 0x2d, 0x83, 0xcd, 0x02, 0x35, - 0xe8, 0x73, 0x8a, 0x1c, 0xa4, 0x36, 0x68, 0x71, 0x9c, 0x13, 0xb9, 0x4c, - 0xa2, 0x89, 0x4c, 0x79, 0xa0, 0x39, 0xdc, 0x4b, 0x60, 0x27, 0x5b, 0xcb, - 0xad, 0x85, 0x92, 0x57, 0x19, 0x55, 0x9a, 0xaf, 0x07, 0x2d, 0xa3, 0xd2, - 0xc0, 0x87, 0x41, 0xa5, 0xab, 0x25, 0x56, 0xa6, 0xb6, 0xe8, 0x92, 0x18, - 0x8d, 0x2d, 0xb5, 0x36, 0x5a, 0x7d, 0x30, 0x5b, 0x95, 0x7b, 0x04, 0x33, - 0x81, 0x22, 0x4f, 0x1a, 0xba, 0x72, 0x94, 0x41, 0x80, 0x32, 0x83, 0xad, - 0x62, 0xa1, 0x90, 0xd7, 0x15, 0xd3, 0x31, 0xc8, 0x59, 0x34, 0x0e, 0xc2, - 0x5f, 0x06, 0xbe, 0x39, 0x2a, 0xee, 0x79, 0x38, 0xb7, 0x55, 0xcf, 0x37, - 0xff, 0x93, 0xe9, 0x9e, 0xde, 0x8b, 0xc3, 0x94, 0xfa, 0x87, 0xd9, 0x0f, - 0x0d, 0x8b, 0x2d, 0xd4, 0x5b, 0xfe, 0x02, 0x56, 0xc9, 0x4e, 0x33, 0x0e, - 0x8f, 0xc4, 0x68, 0xa4, 0xe4, 0x4f, 0xac, 0xbf, 0x29, 0xdb, 0xb0, 0xca, - 0x3a, 0xe1, 0x24, 0x1a, 0x50, 0x02, 0xda, 0x94, 0xe1, 0xc7, 0xe2, 0xa0, - 0xd1, 0xa6, 0x93, 0xbb, 0x26, 0xd1, 0x81, 0x41, 0x1f, 0x52, 0xd2, 0x65, - 0xa2, 0xf7, 0x3b, 0xee, 0x41, 0xb5, 0x48, 0xab, 0xed, 0x95, 0xe1, 0xe1, - 0x1f, 0xa6, 0x10, 0xa5, 0x92, 0x91, 0x6c, 0x4c, 0x8d, 0x62, 0x9f, 0x96, - 0x17, 0x51, 0x07, 0xfa, 0x42, 0x51, 0xa3, 0x56, 0xdd, 0xe9, 0x18, 0x57, - 0x10, 0x51, 0xb8, 0xa4, 0xf8, 0xce, 0xdc, 0x89, 0xab, 0x49, 0x02, 0x7c, - 0x78, 0xac, 0x0c, 0xbd, 0x7b, 0x2c, 0xab, 0xf6, 0x1a, 0xbd, 0x35, 0x94, - 0xe8, 0x35, 0xff, 0x2f, 0x13, 0x84, 0x54, 0x50, 0x82, 0x88, 0xcc, 0x00, - 0x16, 0xc6, 0xe7, 0x24, 0xfd, 0x01, 0x67, 0xc6, 0x13, 0x70, 0x53, 0xc7, - 0x29, 0x7d, 0x35, 0xe4, 0x93, 0xb1, 0x28, 0x26, 0x6f, 0x3b, 0x41, 0x35, - 0x93, 0x8e, 0x7c, 0x4d, 0x89, 0x43, 0xae, 0x6c, 0x8e, 0x46, 0xce, 0x12, - 0xa6, 0x25, 0x0a, 0x96, 0x3f, 0x44, 0xb8, 0xcd, 0xa9, 0xcc, 0x5c, 0x7c, - 0x56, 0xed, 0xc4, 0x25, 0xeb, 0xe6, 0x5c, 0xc2, 0x70, 0xeb, 0xc2, 0x09, - 0x2e, 0x23, 0x00, 0x13, 0x82, 0x43, 0x1f, 0xc5, 0x4d, 0xcf, 0x6a, 0xc4, - 0x49, 0xa7, 0xc9, 0xd2, 0x1b, 0xf8, 0xff, 0x68, 0x8d, 0x02, 0x24, 0xfa, - 0x94, 0x56, 0xde, 0x36, 0xf3, 0x73, 0xfe, 0x6f, 0x4f, 0x0d, 0xf9, 0xed, - 0x49, 0xd6, 0x36, 0x54, 0x2b, 0x15, 0x65, 0xf0, 0xe7, 0xfb, 0x74, 0x26, - 0x60, 0x63, 0xb0, 0x53, 0x5a, 0x77, 0x2d, 0x76, 0x4f, 0x88, 0xbe, 0xe5, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x10, 0xff, 0x72, 0x11, 0x7c, 0xdb, 0x3a, 0x30, 0x61, 0x07, 0xc1, 0x12, - 0xc3, 0xdc, 0x68, 0x82, 0x1e, 0x25, 0x24, 0x09, 0x0e, 0xff, 0x3f, 0x3b, - 0xbd, 0x4c, 0xca, 0xa3, 0x32, 0x20, 0xfb, 0x40, 0xde, 0xf9, 0x10, 0x30, - 0x1f, 0x41, 0xb5, 0x29, 0x66, 0xbc, 0xbc, 0x35, 0x22, 0xbf, 0x4c, 0x88, - 0x46, 0x26, 0xee, 0xeb, 0x18, 0x4e, 0x83, 0x3f, 0xd3, 0xd4, 0x9b, 0x59, - 0x46, 0x21, 0x85, 0x6f, 0xda, 0xe2, 0x8c, 0x89, 0x7d, 0xba, 0xc9, 0xb0, - 0x7e, 0x50, 0x28, 0x85, 0x2b, 0x6f, 0x5d, 0xa3, 0xeb, 0xb7, 0xf8, 0xfc, - 0x43, 0x74, 0xb9, 0x06, 0xd4, 0xab, 0x75, 0x65, 0xa3, 0x0a, 0xca, 0xe7, - 0xdc, 0x8a, 0x82, 0x0f, 0xdc, 0xcf, 0xd9, 0xd1, 0x98, 0xd8, 0x17, 0xa3, - 0xbe, 0xcd, 0xcb, 0x97, 0x23, 0x41, 0x94, 0x8c, 0x35, 0x9e, 0xf4, 0x30, - 0x13, 0xe8, 0x98, 0xfd, 0x96, 0x9c, 0xfe, 0x60, 0x49, 0x72, 0x37, 0x9f, - 0x76, 0x77, 0x5c, 0x83, 0x74, 0xfe, 0x6b, 0x7c, 0x94, 0x70, 0xa4, 0x13, - 0x59, 0x2b, 0x0f, 0x37, 0xa3, 0xc8, 0x6a, 0xee, 0xe0, 0x11, 0x97, 0xd2, - 0x9f, 0xf4, 0xb5, 0xb9, 0xd2, 0xf7, 0xba, 0x66, 0x2b, 0x5d, 0x33, 0x60, - 0x5b, 0xac, 0x8b, 0x16, 0x20, 0x57, 0x02, 0x7e, 0x65, 0xde, 0xf0, 0xce, - 0x5b, 0xb9, 0xbd, 0xdd, 0xbd, 0x58, 0xb9, 0xc9, 0xd9, 0x20, 0xf0, 0x53, - 0x70, 0x88, 0xd2, 0x4d, 0x96, 0x96, 0x2a, 0x38, 0x02, 0x6e, 0x08, 0x01, - 0x30, 0x70, 0x71, 0x63, 0x9a, 0x6e, 0x5e, 0xb4, 0x8f, 0x2d, 0x50, 0x84, - 0x05, 0x61, 0x4f, 0xcd, 0x3c, 0x5a, 0xa2, 0xba, 0xcd, 0x0e, 0x46, 0xb4, - 0x80, 0xbf, 0x3c, 0x75, 0xe9, 0x90, 0xf7, 0xb3, 0x29, 0x35, 0x64, 0xe2, - 0x2e, 0xd9, 0x99, 0x2a, 0xd0, 0x56, 0x2c, 0xb2, 0x65, 0xe9, 0xf0, 0xed, - 0x26, 0x00, 0xa2, 0x60, 0x6e, 0xfb, 0x0d, 0xe7, 0x14, 0x5e, 0x22, 0x51, - 0xf5, 0xf4, 0x73, 0x11, 0xb9, 0x67, 0x4c, 0x02, 0xcc, 0x25, 0x6d, 0x52, - 0x53, 0x98, 0x87, 0x01, 0xc6, 0xb3, 0xbb, 0x5d, 0x03, 0x49, 0x2b, 0x6d, - 0x5b, 0x84, 0xac, 0x67, 0x28, 0xa9, 0xbf, 0x1e, 0x1f, 0xa0, 0xd6, 0xc6, - 0xe2, 0x36, 0x76, 0x66, 0x53, 0xb3, 0xea, 0xf2, 0xba, 0xf3, 0xf7, 0xc2, - 0x48, 0x81, 0x50, 0xc3, 0x7c, 0x4b, 0x1f, 0x00, 0xf6, 0xde, 0x28, 0x34, - 0xce, 0x4f, 0x2f, 0xf5, 0xda, 0xfb, 0x24, 0x0b, 0xba, 0x62, 0xa0, 0xce, - 0xb7, 0xbc, 0xbc, 0xfb, 0x4c, 0x81, 0x35, 0x14, 0x21, 0xbf, 0x85, 0x24, - 0xab, 0xbd, 0xdb, 0x1e, 0x4c, 0xc4, 0x2b, 0xf3, 0x1c, 0xe2, 0x32, 0xac, - 0x74, 0xf5, 0x70, 0x2a, 0xed, 0xf4, 0x7b, 0x96, 0x29, 0x7f, 0x6f, 0x77, - 0xc1, 0xa6, 0x7a, 0xce, 0x51, 0xf4, 0xc3, 0xe8, 0x99, 0xc8, 0x62, 0x7d, - 0xc7, 0x97, 0x6a, 0x20, 0x0c, 0xd0, 0xf3, 0x15, 0xb0, 0x97, 0x11, 0x98, - 0x17, 0x92, 0x77, 0xd4, 0xed, 0xfb, 0x2b, 0xe6, 0x9f, 0x91, 0xd2, 0x6c, - 0x69, 0x65, 0x20, 0x43, 0xa9, 0x59, 0xcf, 0x38, 0xc1, 0x56, 0x15, 0x6a, - 0xd7, 0x1a, 0x48, 0x92, 0x38, 0x44, 0x78, 0xe5, 0xa8, 0x1e, 0x3e, 0x79, - 0x17, 0x77, 0x1c, 0x21, 0x1b, 0x42, 0xc5, 0xfd, 0xc9, 0x22, 0x15, 0xf1, - 0x24, 0x1f, 0x46, 0xd6, 0xd4, 0xec, 0xb5, 0x16, 0x58, 0x8a, 0xf2, 0x5a, - 0x5e, 0xeb, 0xf5, 0x7d, 0x09, 0x33, 0x45, 0x02, 0x6e, 0x82, 0x57, 0x9e, - 0x0d, 0x23, 0x32, 0x63, 0xff, 0x6c, 0xe2, 0x96, 0xc1, 0x6a, 0x0a, 0x76, - 0x8a, 0x08, 0x6f, 0x78, 0x15, 0xc4, 0x13, 0x00, 0x92, 0x21, 0xb2, 0x54, - 0xd8, 0xf7, 0x2f, 0xea, 0xf0, 0x12, 0x5e, 0x04, 0x33, 0x47, 0xb1, 0x3c, - 0x60, 0x38, 0x0c, 0x02, 0x52, 0x65, 0xee, 0x76, 0xec, 0x9f, 0xd8, 0xfb, - 0x2f, 0x05, 0x48, 0xd0, 0x1c, 0x8f, 0x70, 0xdd, 0x1c, 0xdd, 0xb2, 0xc3, - 0xb7, 0x7b, 0xb5, 0x2d, 0xc6, 0x25, 0xff, 0x7d, 0xd7, 0xb4, 0x2b, 0xa5, - 0xfc, 0xd1, 0x1d, 0x49, 0xfd, 0x44, 0xfd, 0xfb, 0x27, 0xa3, 0x57, 0xbf, - 0xc3, 0xbe, 0x9f, 0xd7, 0xc3, 0x3d, 0xcf, 0x60, 0xf8, 0x8d, 0xb5, 0x59, - 0xd5, 0x1f, 0x83, 0x35, 0x3a, 0x9f, 0xfa, 0x83, 0xee, 0xe8, 0xa7, 0xea, - 0x84, 0x49, 0x31, 0x31, 0x3d, 0x78, 0xc2, 0x02, 0x85, 0x97, 0x9b, 0xf9, - 0x40, 0x42, 0x2e, 0xe0, 0x47, 0x80, 0xe6, 0x60, 0x43, 0x01, 0x1b, 0xf4, - 0x62, 0xf9, 0xf3, 0xd9, 0x03, 0xce, 0x66, 0x40, 0xd8, 0x88, 0x78, 0xd9, - 0x63, 0xc5, 0xd7, 0xe5, 0xb5, 0xcc, 0x5e, 0x88, 0x09, 0xdf, 0x49, 0x4b, - 0x45, 0x0f, 0xc3, 0x6b, 0x41, 0xe2, 0xb1, 0xc0, 0xf1, 0xdc, 0x9e, 0x17, - 0x09, 0xb1, 0x28, 0x7c, 0x67, 0x71, 0xf6, 0x15, 0x79, 0x40, 0x44, 0x1b, - 0x47, 0x04, 0x29, 0x5a, 0xc3, 0x83, 0x32, 0x8e, 0x16, 0x6f, 0xb0, 0x3d, - 0x47, 0xa1, 0x8d, 0x8e, 0xa0, 0xc8, 0x48, 0x71, 0xc5, 0x5a, 0x64, 0xbb, - 0xc1, 0x46, 0xd4, 0xb1, 0xe8, 0x5b, 0x72, 0xb1, 0xf7, 0x08, 0xfd, 0x4a, - 0x03, 0x91, 0x71, 0x76, 0x74, 0x67, 0xf7, 0x28, 0x2a, 0x5e, 0xfb, 0xe4, - 0x20, 0xdc, 0xfb, 0x76, 0x33, 0xa4, 0xdf, 0x43, 0xef, 0x57, 0xb8, 0xbb, - 0xa8, 0xd3, 0x16, 0x73, 0xad, 0xf2, 0x36, 0xc1, 0x8e, 0x34, 0x40, 0x68, - 0x3f, 0xcb, 0x2f, 0xe0, 0x61, 0xfe, 0x42, 0xfd, 0x8d, 0x3a, 0x48, 0xef, - 0x48, 0xf4, 0x34, 0x39, 0x2d, 0xf2, 0x6d, 0xcd, 0xd3, 0xfe, 0x67, 0x94, - 0x1f, 0xe5, 0xa9, 0xa4, 0xe9, 0xc1, 0xe6, 0xc7, 0x62, 0x04, 0x4e, 0x43, - 0x43, 0x0d, 0xe1, 0xe3, 0xe0, 0x22, 0xb2, 0x81, 0x2f, 0x36, 0x29, 0xce, - 0x20, 0xaf, 0xbf, 0xf0, 0x6e, 0x87, 0x66, 0x3d, 0x6c, 0x3a, 0xda, 0x83, - 0xec, 0xbd, 0x8f, 0xf9, 0x33, 0x02, 0xd8, 0xf7, 0xc5, 0x88, 0xa1, 0x19, - 0xb8, 0xf3, 0x4d, 0x2b, 0x91, 0x77, 0x07, 0xc3, 0x73, 0x08, 0x15, 0x92, - 0x54, 0xac, 0xf1, 0xb8, 0xaa, 0xb2, 0x3f, 0x5a, 0x50, 0xce, 0xfa, 0xef, - 0x45, 0x86, 0xe7, 0xd7, 0x47, 0xa0, 0x07, 0x0e, 0x78, 0x16, 0x75, 0x24, - 0x0d, 0x46, 0xd8, 0xec, 0xb4, 0x93, 0x4c, 0xc4, 0xe9, 0xa3, 0x3a, 0x38, - 0xb2, 0x8d, 0xf4, 0xae, 0x32, 0xae, 0x96, 0x30, 0xc7, 0xdd, 0x67, 0x29, - 0xa8, 0x04, 0xd1, 0x50, 0xba, 0xaa, 0x22, 0xa0, 0xfe, 0xb1, 0x53, 0x8d, - 0x0a, 0x41, 0xc5, 0x22, 0xf7, 0xa5, 0x5e, 0x0f, 0x8f, 0x4c, 0xa6, 0xd5, - 0xf5, 0xe1, 0x7d, 0xa6, 0x40, 0x0b, 0x75, 0xa3, 0x82, 0xef, 0xa7, 0x23, - 0x33, 0x35, 0xf1, 0x73, 0x59, 0x9d, 0x32, 0x59, 0x6a, 0x1b, 0x1f, 0xc4, - 0x21, 0x80, 0xfa, 0xed, 0xf7, 0xd7, 0xe3, 0x4d, 0xec, 0xd4, 0x19, 0x39, - 0xc3, 0x31, 0xb1, 0xf7, 0x21, 0x8b, 0x0e, 0x98, 0x59, 0x18, 0x2f, 0x15, - 0x8f, 0x37, 0xda, 0x9b, 0x55, 0x06, 0xf2, 0xda, 0xda, 0xca, 0xab, 0xb4, - 0x21, 0x85, 0x2b, 0x79, 0x74, 0x9c, 0xe3, 0xad, 0xc8, 0x42, 0x6f, 0x85, - 0x70, 0xc2, 0x01, 0x3d, 0xcd, 0x53, 0xb0, 0x93, 0xa0, 0x09, 0x6c, 0x19, - 0x63, 0xe0, 0xb2, 0x92, 0x04, 0x38, 0x37, 0xa8, 0x5f, 0x6e, 0x4f, 0xeb, - 0x97, 0xca, 0x09, 0x2e, 0x2c, 0x3b, 0x0e, 0x24, 0x5a, 0xa5, 0x63, 0x7a, - 0x7d, 0x90, 0x03, 0x2f, 0x82, 0xfe, 0x72, 0xe7, 0xac, 0x10, 0x0b, 0x9a, - 0x12, 0x2b, 0x0f, 0x4b, 0x66, 0xd2, 0x12, 0xef, 0x01, 0xd3, 0xe9, 0xcd, - 0xc5, 0x27, 0x76, 0xfa, 0x29, 0x94, 0x4f, 0xbf, 0x57, 0x4b, 0x5c, 0x30, - 0xd3, 0x86, 0x5f, 0x8d, 0xad, 0x06, 0xdc, 0x7b, 0x26, 0xa0, 0xa9, 0x28, - 0x9e, 0xa8, 0xba, 0x35, 0x86, 0x5b, 0xc5, 0x65, 0xd7, 0x16, 0x7e, 0x67, - 0xe4, 0x22, 0x59, 0xb8, 0xf2, 0xe0, 0xa5, 0x14, 0x59, 0x0e, 0xc0, 0xeb, - 0x46, 0x2b, 0x1e, 0x8c, 0x9f, 0x1d, 0x57, 0x76, 0xb9, 0x4e, 0xb3, 0x7f, - 0xd1, 0xf5, 0x1c, 0xe3, 0x10, 0xf7, 0xd7, 0x3e, 0x96, 0xa6, 0x94, 0x48, - 0xf4, 0x37, 0x73, 0xa7, 0x66, 0x73, 0x17, 0xa7, 0xd1, 0x1b, 0xbf, 0x14, - 0x62, 0x9e, 0x5c, 0x1f, 0x93, 0x5c, 0x0e, 0x19, 0xc1, 0xa1, 0xcf, 0xe6, - 0x99, 0xee, 0xec, 0x34, 0xe5, 0x8c, 0x3c, 0xc7, 0xe9, 0xf3, 0x69, 0x20, - 0x60, 0xd9, 0xfb, 0xaf, 0x7c, 0x76, 0x37, 0x65, 0x7b, 0x19, 0xa0, 0x34, - 0xcb, 0xee, 0xff, 0x6c, 0xfd, 0x41, 0xe9, 0x32, 0x01, 0x64, 0xcf, 0xd9, - 0x3b, 0x79, 0x46, 0x86, 0xed, 0x9b, 0x41, 0x49, 0x76, 0x50, 0x4b, 0xe6, - 0xc3, 0x9b, 0xfa, 0xc2, 0x33, 0x90, 0x7a, 0x04, 0x27, 0x74, 0x61, 0x58, - 0x0a, 0x51, 0x74, 0xe0, 0x4a, 0x0e, 0xd1, 0x39, 0x5d, 0xf8, 0xcb, 0x00, - 0xc9, 0x63, 0x5c, 0xcc, 0x36, 0xc7, 0x20, 0x54, 0x8f, 0xa2, 0xdb, 0xba, - 0x94, 0x8e, 0x79, 0x2d, 0xd1, 0xe1, 0xb5, 0x7d, 0x09, 0xfd, 0xd4, 0x99, - 0xfa, 0xa3, 0x3b, 0x90, 0xca, 0xdb, 0xa2, 0xa9, 0xad, 0xf2, 0x99, 0x55, - 0x92, 0x90, 0x33, 0xe2, 0x42, 0x8f, 0x19, 0x7e, 0x10, 0xdb, 0xa2, 0x39, - 0xd3, 0x4d, 0x17, 0x10, 0x5d, 0xfe, 0x14, 0x13, 0x45, 0xc0, 0x79, 0xa1, - 0x50, 0xa0, 0x1e, 0xd4, 0x62, 0xbb, 0xe2, 0x70, 0x8b, 0xcd, 0x68, 0x06, - 0x5c, 0x18, 0x3e, 0xc2, 0x7f, 0x78, 0x2b, 0x57, 0x24, 0xbd, 0x5d, 0xd0, - 0x5b, 0x85, 0xe9, 0xc8, 0x4f, 0x09, 0x00, 0x4b, 0xe0, 0x93, 0x4a, 0xe4, - 0x46, 0x0c, 0xd1, 0x8e, 0x31, 0xee, 0x65, 0x3d, 0xbb, 0x37, 0x9a, 0x57, - 0xbb, 0x23, 0x45, 0x1c, 0x7b, 0x9c, 0x42, 0x9d, 0x5b, 0x38, 0x01, 0x83, - 0xb1, 0x0a, 0xf5, 0x9a, 0x26, 0xab, 0x69, 0xcd, 0x52, 0xde, 0x31, 0x28, - 0xba, 0xfe, 0x5c, 0x4d, 0xa4, 0xe3, 0x18, 0x82, 0x30, 0x7a, 0x0a, 0x71, - 0xca, 0x30, 0x1a, 0x4b, 0xbb, 0xd7, 0xe9, 0x1a, 0xbf, 0xc5, 0xb6, 0x0d, - 0x83, 0x90, 0x52, 0xbe, 0xdb, 0x38, 0x55, 0x97, 0x21, 0x87, 0xbf, 0xc5, - 0xfa, 0x3d, 0x2f, 0xd8, 0x05, 0x63, 0x79, 0x0f, 0x0d, 0x2c, 0x93, 0xed, - 0x1e, 0x35, 0xd7, 0x21, 0x4f, 0xe6, 0xca, 0x0d, 0x1d, 0x74, 0x54, 0xa2, - 0xd3, 0xda, 0x8c, 0xca, 0x0e, 0xee, 0xb3, 0x9d, 0x5f, 0x47, 0x8d, 0xa0, - 0xc5, 0x29, 0x02, 0x15, 0xfe, 0xa8, 0x9f, 0x8f, 0x91, 0x27, 0xbf, 0x0b, - 0xb6, 0xe7, 0x40, 0x77, 0x1c, 0x4b, 0xa3, 0xe4, 0xae, 0x83, 0x03, 0xa6, - 0x7e, 0x57, 0x56, 0x0b, 0xcd, 0xf0, 0x48, 0x26, 0xc6, 0x12, 0x37, 0xb3, - 0xc2, 0x08, 0xd0, 0x3d, 0xda, 0xb1, 0xf3, 0x34, 0x33, 0x1d, 0x81, 0x17, - 0xf2, 0xf8, 0xe5, 0xca, 0xfb, 0x8c, 0x80, 0x77, 0xb7, 0x9b, 0x7b, 0x7c, - 0xf9, 0xbf, 0xe2, 0x7f, 0x23, 0x2a, 0x96, 0x47, 0x80, 0x54, 0x02, 0xcb, - 0x4d, 0xf8, 0x71, 0x03, 0x3d, 0xbf, 0xad, 0x9b, 0x4b, 0x78, 0x15, 0xdd, - 0x47, 0x13, 0x55, 0xf6, 0x39, 0x43, 0xec, 0x85, 0x72, 0x0b, 0xe8, 0x9e, - 0xf5, 0x87, 0x42, 0x90, 0x8a, 0xe2, 0x51, 0x83, 0xf0, 0xb0, 0x94, 0x82, - 0x73, 0xda, 0x51, 0x6b, 0x1f, 0x5d, 0x8c, 0x92, 0x3c, 0x15, 0xa9, 0x37, - 0x71, 0x23, 0xcf, 0x90, 0x40, 0xae, 0xcb, 0xb4, 0x8b, 0xa6, 0x55, 0x82, - 0x00, 0x56, 0xd6, 0x23, 0xf7, 0x0d, 0xdc, 0xf4, 0x56, 0xef, 0x4b, 0xb0, - 0xbd, 0x25, 0x66, 0xc4, 0x88, 0x52, 0x41, 0x88, 0x43, 0x41, 0xc5, 0x6b, - 0x2b, 0x63, 0xd7, 0x3e, 0x57, 0x8d, 0xf1, 0x36, 0x6d, 0x97, 0xce, 0x28, - 0x6e, 0x11, 0x40, 0x3e, 0x84, 0xe7, 0x87, 0x36, 0xd0, 0xe7, 0xe2, 0xaf, - 0x1c, 0x3b, 0x17, 0x97, 0xd3, 0x2d, 0x98, 0x59, 0x70, 0xc9, 0x34, 0x5f, - 0x0e, 0x85, 0x1f, 0x24, 0x44, 0xa9, 0x8d, 0x22, 0x83, 0xca, 0xc5, 0x79, - 0x13, 0x3f, 0xfa, 0xc5, 0x04, 0x65, 0xe4, 0x65, 0xda, 0xcb, 0x47, 0xc9, - 0x6e, 0x9b, 0x3f, 0x7c, 0xab, 0x3e, 0x22, 0xe2, 0x36, 0xa9, 0x50, 0xc0, - 0x7d, 0x8c, 0x27, 0xd5, 0x78, 0x47, 0xdd, 0x04, 0x9a, 0xbe, 0xf3, 0xdb, - 0x79, 0x4d, 0x10, 0xab, 0x12, 0x82, 0xe9, 0xdd, 0xeb, 0x12, 0x03, 0x6e, - 0xd5, 0x43, 0x1c, 0x51, 0x58, 0x4e, 0x86, 0x11, 0xd4, 0x74, 0xd7, 0x30, - 0xdb, 0x73, 0x96, 0xfa, 0x21, 0x65, 0x68, 0x57, 0x98, 0x23, 0x9c, 0x99, - 0x6b, 0xa1, 0x34, 0xeb, 0x61, 0x93, 0x9c, 0x3f, 0x1b, 0x70, 0x12, 0x8c, - 0x7b, 0xe3, 0xa4, 0x5a, 0x7a, 0x34, 0x89, 0xd8, 0x14, 0x22, 0x10, 0x4c, - 0x65, 0x64, 0xb7, 0x97, 0xeb, 0x9a, 0x7d, 0x35, 0x08, 0x27, 0xb4, 0x75, - 0xb3, 0xfb, 0xeb, 0x2c, 0x19, 0xd2, 0x2c, 0x27, 0x33, 0x6d, 0x33, 0x07, - 0x11, 0x80, 0x2b, 0xb1, 0x79, 0x8f, 0xf3, 0x51, 0x1b, 0x0e, 0xf1, 0xf6, - 0xbf, 0x82, 0xf1, 0x78, 0xc7, 0x1c, 0xed, 0x16, 0x15, 0x77, 0x35, 0x0b, - 0x53, 0xf8, 0x37, 0x0e, 0xfb, 0xd1, 0xba, 0x36, 0xaa, 0x38, 0xa2, 0xae, - 0x41, 0xcd, 0x3e, 0xb4, 0x75, 0x76, 0xbc, 0x3d, 0x51, 0x3b, 0x58, 0x6f, - 0x3e, 0x43, 0x0b, 0xd4, 0x46, 0x50, 0x57, 0x97, 0xf1, 0xde, 0xe1, 0x2a, - 0x3b, 0xdf, 0x96, 0x35, 0x76, 0xab, 0x7e, 0xc1, 0xe1, 0xe6, 0xe8, 0x76, - 0x04, 0x5d, 0xc0, 0xa1, 0x48, 0xee, 0x25, 0xf3, 0xa9, 0x0d, 0xa6, 0x62, - 0xec, 0xa3, 0x97, 0x86, 0x7f, 0x51, 0x05, 0x70, 0x98, 0x11, 0x9e, 0x76, - 0x56, 0x90, 0xdd, 0x58, 0x95, 0x8f, 0x28, 0xa2, 0x65, 0xbb, 0x93, 0x1d, - 0x7c, 0x0a, 0xed, 0xf2, 0x69, 0x8a, 0x68, 0xf1, 0x5e, 0x4a, 0xc9, 0xc3, - 0x14, 0xce, 0x9f, 0xe1, 0x04, 0xf7, 0x6c, 0xea, 0xb7, 0x83, 0x48, 0x44, - 0x8e, 0x59, 0x42, 0xe7, 0x8a, 0x3a, 0xc5, 0x1c, 0xd6, 0xb0, 0x1b, 0x53, - 0xe6, 0x30, 0x6e, 0xa7, 0xa4, 0x42, 0xe9, 0x1e, 0x05, 0xd4, 0x49, 0x89, - 0xd1, 0xeb, 0x50, 0x3a, 0x9f, 0xc7, 0x2d, 0xe8, 0xed, 0x2a, 0xc1, 0xb6, - 0x60, 0x3b, 0xce, 0xaf, 0x3f, 0xcc, 0x37, 0x8a, 0x78, 0x4b, 0xb0, 0x5b, - 0xe0, 0x80, 0x14, 0x0a, 0x7d, 0x14, 0xf1, 0xcb, 0xe8, 0xbe, 0x93, 0x2b, - 0x16, 0x51, 0x81, 0x9c, 0xef, 0x99, 0x5b, 0x94, 0xc9, 0x2b, 0x3f, 0x3a, - 0xd5, 0xa8, 0xc2, 0xf0, 0x22, 0xc3, 0x43, 0x71, 0x9b, 0xaa, 0x32, 0x84, - 0x1f, 0x92, 0xbf, 0x27, 0x7f, 0xba, 0x9d, 0xd0, 0x31, 0x9a, 0x69, 0xae, - 0x44, 0x07, 0x9f, 0x8c, 0xb8, 0x19, 0x6b, 0xee, 0xa5, 0xc7, 0x72, 0x60, - 0x0f, 0x9d, 0x3b, 0x21, 0x1c, 0x11, 0x63, 0xda, 0x1d, 0x9b, 0x4f, 0xb1, - 0x8f, 0xe0, 0x87, 0x89, 0x04, 0x22, 0x13, 0xf0, 0xfc, 0xde, 0x8c, 0xf5, - 0xd3, 0x9d, 0x9d, 0x12, 0xfb, 0xa9, 0xfb, 0xfd, 0x71, 0xd4, 0xd3, 0x33, - 0x3d, 0x13, 0x69, 0xec, 0x96, 0x48, 0xce, 0x39, 0x3d, 0x11, 0x1f, 0x6a, - 0xf1, 0xf8, 0xb0, 0x6a, 0x1a, 0xf0, 0x9b, 0x0f, 0xf6, 0xc0, 0xbd, 0x80, - 0x80, 0x97, 0x6a, 0xc8, 0x1b, 0x67, 0xea, 0x9b, 0x29, 0x26, 0x81, 0xfd, - 0xad, 0xe3, 0xb4, 0x24, 0x60, 0xed, 0xc1, 0xb4, 0x80, 0xd8, 0x75, 0x30, - 0x34, 0x37, 0xba, 0xb4, 0x48, 0x5d, 0x33, 0x94, 0xe8, 0x0d, 0x69, 0x42, - 0xf6, 0xdc, 0x79, 0xa2, 0xd3, 0xb0, 0x95, 0x39, 0x77, 0x37, 0x7f, 0x3e, - 0xf0, 0x8f, 0xc8, 0x37, 0xe9, 0xd9, 0x76, 0x65, 0x41, 0xdf, 0x99, 0xcf, - 0x75, 0x65, 0xb8, 0x44, 0xe3, 0x54, 0xa7, 0xf4, 0x3b, 0x81, 0xa7, 0x24, - 0x84, 0x88, 0x5b, 0xfa, 0x66, 0xef, 0xb0, 0x09, 0x13, 0xc2, 0x6d, 0x89, - 0x9e, 0x76, 0x4d, 0xc9, 0x62, 0x9c, 0x64, 0x75, 0x90, 0x4b, 0x17, 0x41, - 0x6b, 0x8f, 0xb0, 0x5e, 0x88, 0xf8, 0x83, 0x02, 0xcd, 0x99, 0xfc, 0x63, - 0x57, 0x83, 0xcf, 0xa8, 0x06, 0xe6, 0x3e, 0xdc, 0xce, 0x64, 0x9a, 0xa4, - 0x79, 0xee, 0x4d, 0xd3, 0xec, 0x71, 0xc5, 0xc7, 0x85, 0x47, 0x08, 0x6f, - 0x5f, 0x53, 0x1a, 0x61, 0xec, 0x0d, 0x96, 0xb5, 0x9a, 0x6b, 0xd5, 0xca, - 0x79, 0x34, 0x9b, 0x09, 0xd7, 0x38, 0x10, 0x17, 0x85, 0x5c, 0x43, 0x64, - 0x61, 0xf2, 0xbb, 0x96, 0x3d, 0x99, 0x01, 0x2c, 0x00, 0x83, 0xe2, 0x5a, - 0x2e, 0x1e, 0x45, 0x73, 0x44, 0xd7, 0x55, 0xa3, 0xc3, 0x0a, 0xb2, 0x91, - 0x2f, 0x6d, 0x97, 0x01, 0xc8, 0xab, 0x95, 0x7c, 0x79, 0x37, 0xe8, 0xa2, - 0x9e, 0xe9, 0x06, 0x83, 0xc0, 0x3c, 0x55, 0xd6, 0x14, 0xea, 0xc2, 0xff, - 0xc0, 0x2f, 0x0d, 0xf0, 0xc6, 0xde, 0x30, 0xf7, 0xb2, 0xcb, 0x05, 0x6d, - 0x3f, 0x1c, 0x80, 0xec, 0xda, 0xc3, 0x2d, 0x7f, 0xb1, 0x30, 0x3e, 0x16, - 0x2f, 0x4e, 0x1d, 0x2c, 0xdc, 0x55, 0xd3, 0x66, 0x30, 0x0d, 0x07, 0x09, - 0x20, 0xc4, 0x2a, 0x97, 0xcb, 0x0e, 0x23, 0xb6, 0xfc, 0xeb, 0xb8, 0xb5, - 0x0f, 0xe5, 0x2a, 0x0a, 0xec, 0x49, 0x89, 0xce, 0x42, 0xa7, 0x54, 0x30, - 0x5b, 0xba, 0xa7, 0xb9, 0xea, 0x0a, 0x9b, 0xce, 0x35, 0x99, 0x8a, 0xb9, - 0xbb, 0xb5, 0x2f, 0x74, 0x23, 0x03, 0xc7, 0x9b, 0x8c, 0xd4, 0xcd, 0xe8, - 0x7d, 0xa7, 0x95, 0x9e, 0x62, 0xd5, 0xcd, 0xc5, 0xe7, 0x21, 0x20, 0xa1, - 0xb2, 0xf6, 0x0f, 0x0d, 0x62, 0x99, 0x45, 0xa5, 0x9d, 0xc9, 0xc2, 0xc2, - 0x78, 0x0c, 0xe1, 0x66, 0x37, 0xe5, 0xe4, 0x77, 0xa7, 0xfd, 0x2f, 0x77, - 0x25, 0x91, 0xbd, 0xa9, 0x07, 0x84, 0x20, 0x16, 0x70, 0x45, 0x21, 0x95, - 0x36, 0xa8, 0x1f, 0x2b, 0xbc, 0x09, 0x21, 0xa1, 0xa2, 0x5f, 0x34, 0x57, - 0x2a, 0x31, 0x73, 0x3a, 0x79, 0xd6, 0x8e, 0xf6, 0x1a, 0xdb, 0x64, 0xa5, - 0x8d, 0x4f, 0xa8, 0x20, 0x2b, 0x5f, 0x29, 0xc2, 0x47, 0x65, 0xb0, 0xf0, - 0x82, 0x0e, 0x65, 0xcd, 0x55, 0xf3, 0x07, 0x4d, 0xc1, 0xc2, 0xdc, 0x96, - 0xcb, 0x62, 0xc8, 0xe4, 0xd6, 0x79, 0x54, 0x6f, 0x85, 0x62, 0x84, 0x4d, - 0xb8, 0x7b, 0x4c, 0x3a, 0x61, 0xb3, 0x4a, 0x8c, 0x2a, 0xb1, 0xe3, 0xd7, - 0x4a, 0xfc, 0xcc, 0x96, 0xe6, 0x4e, 0xd2, 0x65, 0x99, 0x61, 0xda, 0xb6, - 0x88, 0x2b, 0x18, 0x2a, 0x69, 0xfd, 0x1d, 0x39, 0xc7, 0x20, 0x2a, 0x7d, - 0x19, 0x5a, 0x29, 0xe0, 0xcb, 0xca, 0x1b, 0xea, 0x7d, 0xe9, 0x80, 0x2e, - 0x05, 0x94, 0xfb, 0x37, 0x01, 0xff, 0x7b, 0x47, 0xad, 0xf8, 0x23, 0x87, - 0xb9, 0x7a, 0x82, 0x0c, 0x5b, 0x42, 0x91, 0x8d, 0xac, 0xe8, 0x5b, 0xdf, - 0x3f, 0x20, 0x76, 0x75, 0x77, 0xe9, 0x0e, 0x41, 0xd3, 0xbd, 0xee, 0xee, - 0xd1, 0x3d, 0x62, 0x64, 0x30, 0xf9, 0x2b, 0x21, 0xc1, 0x98, 0x48, 0xee, - 0x55, 0xb6, 0xcb, 0xfa, 0xc2, 0x7e, 0x50, 0x11, 0x58, 0xb3, 0x74, 0x93, - 0x4a, 0x5d, 0xdf, 0x22, 0xce, 0xf3, 0x01, 0xd9, 0x03, 0x6a, 0xd2, 0x15, - 0x5d, 0x68, 0xa5, 0xdc, 0x20, 0x87, 0x1e, 0xb1, 0x7a, 0x89, 0x38, 0x5a, - 0x3f, 0xec, 0x25, 0xaf, 0x16, 0x23, 0x35, 0x7e, 0x54, 0xac, 0xb3, 0x33, - 0x64, 0x4d, 0xdd, 0x3d, 0x2c, 0xde, 0x6e, 0x35, 0xcb, 0x05, 0xd9, 0xf3, - 0x0e, 0x7d, 0x67, 0x43, 0xcd, 0xec, 0x87, 0x6f, 0x04, 0xf5, 0x4f, 0x79, - 0x5d, 0xd5, 0x91, 0x97, 0x46, 0x97, 0x47, 0xef, 0x2a, 0x51, 0xb9, 0xbb, - 0xd8, 0x4d, 0xa9, 0x63, 0xf3, 0xfd, 0x31, 0xfe, 0x82, 0x3f, 0x43, 0xa8, - 0x0e, 0x5c, 0x9f, 0x27, 0x90, 0xbb, 0x76, 0x05, 0x09, 0x6d, 0x3f, 0x05, - 0x61, 0x2e, 0x89, 0x01, 0xcb, 0x1f, 0xf1, 0x4d, 0x55, 0x80, 0x67, 0x29, - 0x36, 0xbc, 0xd0, 0xb5, 0x71, 0x5f, 0x55, 0xa5, 0x13, 0xb9, 0x30, 0xe3, - 0xf1, 0x54, 0x04, 0x14, 0x43, 0xe5, 0x7b, 0x96, 0xde, 0x6b, 0x32, 0x3a, - 0xbb, 0xee, 0x12, 0x65, 0x09, 0x8f, 0x0f, 0x78, 0x61, 0x85, 0x7f, 0x09, - 0xf6, 0x20, 0xf9, 0x7f, 0x34, 0x3b, 0x58, 0x31, 0x2c, 0x8d, 0x85, 0xfa, - 0xf9, 0x79, 0xf8, 0xcf, 0x7a, 0xc3, 0xe9, 0x70, 0xc2, 0x0f, 0xed, 0xa5, - 0xeb, 0xd4, 0x28, 0x74, 0xd0, 0x40, 0x44, 0x60, 0x3c, 0x5d, 0x3c, 0x48, - 0xa9, 0x23, 0x60, 0x67, 0x3a, 0xaf, 0xd0, 0xc1, 0x13, 0xfb, 0xb8, 0xd8, - 0xfd, 0x53, 0xb6, 0x14, 0x1b, 0x89, 0x85, 0x0f, 0xf3, 0x1a, 0x47, 0xba, - 0x9c, 0x58, 0x9c, 0x74, 0x4b, 0x88, 0xca, 0x19, 0x6e, 0x3d, 0x11, 0xf4, - 0xb7, 0x31, 0x8a, 0xec, 0x5d, 0x5f, 0x13, 0x53, 0x78, 0xc0, 0x08, 0xde, - 0xa9, 0xd3, 0xf6, 0x7d, 0x17, 0x5f, 0x5c, 0xfb, 0x2f, 0x99, 0xdd, 0xaf, - 0x0c, 0xf6, 0x48, 0xd4, 0x27, 0xe3, 0xc0, 0x76, 0x65, 0x88, 0xe3, 0x0b, - 0xb6, 0x1d, 0xf6, 0x88, 0xa2, 0xf2, 0xbb, 0xbc, 0xb8, 0xb8, 0x16, 0xc6, - 0x2f, 0x13, 0x98, 0x2e, 0xf3, 0xeb, 0xc7, 0x35, 0x27, 0x8e, 0x40, 0xa9, - 0x43, 0x31, 0x40, 0x2c, 0x4c, 0x1f, 0x24, 0xd0, 0x62, 0x7c, 0x42, 0xc9, - 0xa5, 0xba, 0xcb, 0x01, 0x36, 0x5c, 0x7e, 0xbc, 0xfb, 0x0c, 0x54, 0xc9, - 0xd5, 0x2e, 0xb0, 0xc5, 0x9b, 0xe1, 0x47, 0x5b, 0xf2, 0x5d, 0x80, 0xb7, - 0xa8, 0x18, 0x92, 0xe2, 0xe9, 0xb8, 0x6a, 0x5a, 0x02, 0xca, 0x13, 0x01, - 0xfa, 0xd5, 0x28, 0x3e, 0x6d, 0xf3, 0x85, 0xca, 0x46, 0xaa, 0x1e, 0x50, - 0x05, 0xce, 0x1b, 0x85, 0x74, 0x5c, 0x2a, 0x86, 0x46, 0xd6, 0x81, 0x79, - 0x5e, 0x0c, 0x3f, 0xbf, 0x34, 0xe8, 0xc2, 0x48, 0x1f, 0x10, 0x1a, 0x8e, - 0x4d, 0xf3, 0x82, 0xf0, 0xc9, 0x9e, 0x02, 0xa6, 0xbd, 0xef, 0x4e, 0x40, - 0xf9, 0xc1, 0x79, 0x9b, 0x1c, 0x1d, 0x1f, 0xc5, 0x35, 0xb1, 0x80, 0xb0, - 0x93, 0x70, 0x3c, 0x15, 0xc1, 0xe2, 0x3c, 0x00, 0xa0, 0x7a, 0xff, 0xb2, - 0xfb, 0xb2, 0x6d, 0xe7, 0x59, 0x1d, 0xaf, 0xd9, 0x8c, 0x9a, 0x01, 0x42, - 0x10, 0xc6, 0x33, 0x24, 0x76, 0x1b, 0x48, 0x91, 0xc3, 0x89, 0x22, 0xe5, - 0x81, 0x6c, 0x98, 0xce, 0x23, 0xb0, 0x6a, 0xe8, 0x10, 0x82, 0xe7, 0x04, - 0x2a, 0xbc, 0x0e, 0x34, 0xa5, 0x65, 0x70, 0x5b, 0x18, 0xca, 0x6b, 0x06, - 0x97, 0x4c, 0x8a, 0xb6, 0xf4, 0x1d, 0xb5, 0x6f, 0xed, 0x1d, 0x5c, 0x7b, - 0x83, 0x84, 0xf7, 0xbe, 0x11, 0x24, 0x90, 0xed, 0x64, 0x94, 0xa5, 0xb5, - 0x1c, 0x93, 0x4f, 0xb1, 0x8f, 0xe0, 0x87, 0x89, 0x04, 0x22, 0x13, 0xf0, - 0xfd, 0xd6, 0x8c, 0xf5, 0x53, 0x2d, 0x77, 0xa7, 0x97, 0x39, 0x93, 0xca, - 0xa5, 0xb5, 0xcf, 0x62, 0xfe, 0x9f, 0x84, 0x55, 0x51, 0x57, 0x66, 0xe2, - 0x3b, 0xb2, 0x79, 0x64, 0x00, 0x96, 0xcd, 0xff, 0x9b, 0x20, 0x6f, 0xf5, - 0x29, 0xe6, 0x05, 0x79, 0x5c, 0x38, 0xe6, 0x4e, 0x7f, 0x07, 0x79, 0x3a, - 0x8f, 0x5f, 0x1e, 0x35, 0xfd, 0x73, 0x6f, 0xe0, 0x06, 0xf9, 0x85, 0x6e, - 0x0f, 0xe5, 0x45, 0xf8, 0xc0, 0x75, 0x18, 0x3a, 0x83, 0xd5, 0x15, 0xd8, - 0xe2, 0x15, 0x22, 0x94, 0x9a, 0x82, 0xbe, 0xcd, 0x9c, 0x1e, 0x56, 0x99, - 0x39, 0xfc, 0xf4, 0x6f, 0x68, 0xec, 0x6d, 0x07, 0x68, 0x7e, 0x62, 0xa8, - 0x7b, 0x6e, 0xaa, 0x66, 0xf0, 0x40, 0x69, 0xcd, 0xa2, 0x84, 0xb7, 0xb8, - 0x7c, 0x42, 0x5c, 0xf8, 0x23, 0x1c, 0xa7, 0x76, 0x15, 0x7b, 0xac, 0xe4, - 0x0a, 0x93, 0x32, 0xf6, 0x45, 0x0d, 0xd0, 0xda, 0x6b, 0x68, 0xdb, 0xf3, - 0x24, 0x0b, 0x42, 0x06, 0xf6, 0x4a, 0x9b, 0x62, 0x7b, 0x21, 0xe8, 0x12, - 0x89, 0x29, 0xa9, 0xc0, 0x24, 0xba, 0x93, 0x7c, 0x0c, 0xb0, 0xe2, 0x92, - 0x9f, 0x46, 0xcd, 0x7b, 0x0b, 0xb0, 0xde, 0x70, 0x44, 0xd2, 0x7e, 0xae, - 0x0b, 0x6c, 0xc6, 0xf0, 0x6e, 0x1f, 0xb1, 0x6b, 0xc2, 0xfe, 0x70, 0xbb, - 0xcb, 0xce, 0x0a, 0xe7, 0x9b, 0x6b, 0xe9, 0xe0, 0x26, 0xb8, 0x0a, 0x8f, - 0xca, 0x61, 0x2f, 0xf6, 0x5a, 0x3d, 0xa8, 0xae, 0xee, 0xd0, 0x7d, 0x4f, - 0xcb, 0x45, 0xce, 0xb8, 0x21, 0x98, 0xbf, 0x38, 0x3b, 0x7a, 0x2d, 0xbf, - 0x5b, 0x85, 0x58, 0x20, 0xd9, 0x89, 0x40, 0x46, 0xb9, 0x12, 0x40, 0x2a, - 0xdd, 0x5e, 0xcd, 0xc3, 0xfe, 0x5a, 0x3c, 0xa9, 0x9f, 0x11, 0xe5, 0x81, - 0x58, 0x1c, 0xa5, 0x00, 0xc1, 0x27, 0x0d, 0xf0, 0xc6, 0xde, 0x30, 0xf7, - 0xb2, 0xcb, 0x05, 0x6d, 0x3e, 0x14, 0x80, 0xec, 0xd8, 0x0d, 0xad, 0x17, - 0x5b, 0x23, 0x6b, 0x82, 0x26, 0x9c, 0xd7, 0x28, 0x00, 0x14, 0x40, 0xa6, - 0x10, 0x86, 0x7a, 0x1e, 0x71, 0x19, 0xb2, 0x92, 0xc8, 0xfa, 0x88, 0x10, - 0x34, 0xc4, 0xb3, 0x23, 0xf8, 0x5b, 0x4a, 0xd9, 0x1b, 0xe5, 0x53, 0x31, - 0x9f, 0x26, 0xa2, 0x69, 0x95, 0xf5, 0x65, 0x12, 0x12, 0xdb, 0x93, 0x4c, - 0x12, 0x13, 0x1d, 0x2e, 0xcb, 0x31, 0x47, 0x8f, 0xa1, 0x29, 0xe8, 0xba, - 0x74, 0xdb, 0xe9, 0xc8, 0xd6, 0x27, 0xce, 0xe8, 0x3a, 0x0e, 0xe2, 0x20, - 0xa7, 0x93, 0xd1, 0xec, 0x8e, 0xf7, 0x49, 0x8e, 0xde, 0xb7, 0x8e, 0x26, - 0x46, 0x07, 0xb5, 0x7e, 0x20, 0xa8, 0x7b, 0x1f, 0x4f, 0x7a, 0x0b, 0x6c, - 0xec, 0x38, 0xe0, 0xce, 0xf4, 0x4e, 0xe2, 0xe7, 0x3e, 0x14, 0xbe, 0xff, - 0x2e, 0x97, 0x71, 0x6e, 0x79, 0xa4, 0x1c, 0x6e, 0xca, 0x84, 0x70, 0x53, - 0xfb, 0xdc, 0xcc, 0x29, 0xe4, 0x4d, 0xce, 0xcd, 0x08, 0xd5, 0xfd, 0xcd, - 0x42, 0x5e, 0xd2, 0xbf, 0x57, 0x28, 0x80, 0x5d, 0xc4, 0x9d, 0x45, 0x62, - 0x27, 0xcb, 0x55, 0x27, 0xad, 0x80, 0xb7, 0x3b, 0xc2, 0xcf, 0xc6, 0x37, - 0xc9, 0xbc, 0xf7, 0xdd, 0xf5, 0x3d, 0x90, 0xc8, 0x5c, 0xc6, 0x0d, 0xf1, - 0x10, 0x97, 0xd4, 0xdf, 0x15, 0x7a, 0x60, 0xaa, 0x27, 0x9f, 0xf7, 0x76, - 0x50, 0xdf, 0x57, 0x3a, 0x52, 0x18, 0x3a, 0x48, 0x68, 0x70, 0xf3, 0x09, - 0x8f, 0x75, 0x19, 0x13, 0xf2, 0x90, 0x8f, 0xa0, 0xbd, 0x2e, 0x02, 0x61, - 0x9b, 0xc9, 0x5c, 0xfb, 0x20, 0x76, 0xaf, 0x99, 0x02, 0xb7, 0x47, 0xa7, - 0x01, 0x4c, 0x91, 0x66, 0x3a, 0x55, 0x71, 0xeb, 0x87, 0xcd, 0x8f, 0x33, - 0xf3, 0xad, 0x54, 0x7a, 0x01, 0xf8, 0x32, 0xdd, 0xd0, 0xdc, 0x2d, 0x45, - 0x74, 0xce, 0xf6, 0x99, 0x3f, 0x83, 0x53, 0x6c, 0x12, 0x11, 0x36, 0x01, - 0x5b, 0x84, 0x67, 0xb5, 0x63, 0x7a, 0xec, 0x9c, 0xed, 0x52, 0xf5, 0xa8, - 0x70, 0x12, 0x62, 0xca, 0x3d, 0x03, 0x3c, 0x7a, 0x47, 0x6c, 0xd6, 0xea, - 0x62, 0xa1, 0xbc, 0x8d, 0x60, 0x96, 0x08, 0xfa, 0x64, 0x8f, 0x02, 0x56, - 0x86, 0x5d, 0x5a, 0x53, 0xe6, 0x8d, 0xd1, 0x49, 0xe4, 0xff, 0x24, 0xb7, - 0x4e, 0x0c, 0x8c, 0x8c, 0x3c, 0x83, 0xfa, 0x9a, 0x4a, 0x91, 0x16, 0x6d, - 0x0f, 0x0f, 0xa0, 0x25, 0xe9, 0xf4, 0x5d, 0xfa, 0xdc, 0x4b, 0x15, 0x3a, - 0xfd, 0x7c, 0x66, 0xde, 0x02, 0xae, 0xe4, 0x56, 0x8a, 0xc5, 0x15, 0xd9, - 0x21, 0x51, 0xc9, 0xbc, 0x11, 0x30, 0x0f, 0xae, 0x85, 0x21, 0xf7, 0x0b, - 0x50, 0x9e, 0x93, 0xbc, 0xad, 0x50, 0xc6, 0x21, 0x7e, 0x36, 0xd7, 0x3f, - 0x0a, 0xa2, 0xe8, 0x74, 0x8a, 0xa1, 0xb5, 0x0e, 0x38, 0xd2, 0x52, 0x0e, - 0x01, 0xad, 0x97, 0xec, 0xe7, 0xaf, 0x1b, 0x50, 0x7f, 0x78, 0x21, 0x41, - 0xa8, 0xe0, 0x02, 0x98, 0x1e, 0x44, 0x08, 0x6f, 0xc0, 0x8b, 0xf8, 0x96, - 0x7c, 0xfd, 0x01, 0xdd, 0x77, 0x98, 0xaf, 0x23, 0x49, 0xb6, 0x9f, 0xe1, - 0xd9, 0xde, 0x00, 0x11, 0x3c, 0x35, 0x1f, 0x1c, 0x28, 0x7d, 0x08, 0xdd, - 0x7f, 0xa2, 0xb1, 0x3c, 0xac, 0x51, 0xea, 0x2e, 0x3e, 0x33, 0x30, 0x18, - 0x68, 0x92, 0x8b, 0x7c, 0x14, 0xe5, 0x38, 0x44, 0x7c, 0x4f, 0x59, 0x7d, - 0x49, 0x6a, 0x13, 0xf6, 0x09, 0x26, 0xe5, 0x95, 0x31, 0x02, 0x8e, 0x7a, - 0x7f, 0xb1, 0x9a, 0xcf, 0x2c, 0x67, 0x11, 0xf8, 0xf5, 0xe5, 0x53, 0xda, - 0x86, 0xb6, 0x00, 0xf6, 0x86, 0x2d, 0xb8, 0x27, 0x75, 0x44, 0x02, 0x72, - 0xa9, 0x5e, 0x77, 0xa5, 0x85, 0x75, 0x4a, 0xeb, 0x45, 0xc9, 0x6e, 0xbe, - 0x1e, 0x80, 0xdb, 0x56, 0xa1, 0xb6, 0x69, 0xba, 0xa0, 0x4a, 0xc7, 0x9e, - 0xab, 0xf7, 0x7c, 0x62, 0xbd, 0x29, 0x99, 0x35, 0x35, 0xbe, 0x3c, 0xe0, - 0xd5, 0x94, 0xcd, 0x8f, 0x94, 0x47, 0xd5, 0x39, 0xf6, 0x5b, 0x36, 0x71, - 0x54, 0x9c, 0x86, 0xe3, 0x8b, 0x34, 0x11, 0x6e, 0xba, 0xf8, 0x9c, 0x43, - 0x20, 0x3c, 0x0c, 0xe0, 0x8b, 0x2e, 0xc9, 0x19, 0xf7, 0x56, 0xd1, 0x00, - 0x7a, 0x86, 0x02, 0x99, 0xd4, 0xa8, 0x92, 0x9e, 0xe0, 0x55, 0x74, 0x77, - 0x11, 0x94, 0x20, 0xbe, 0x70, 0x90, 0x6d, 0xaf, 0xf4, 0xf1, 0xa9, 0x8d, - 0x83, 0x27, 0xeb, 0x4a, 0x7a, 0x71, 0x40, 0x71, 0xed, 0x56, 0xfa, 0x0e, - 0x9b, 0x67, 0xde, 0xfe, 0x3c, 0xf4, 0xb2, 0xa6, 0x0b, 0x02, 0x94, 0xad, - 0x23, 0xbb, 0xad, 0x23, 0x0c, 0x16, 0x83, 0x02, 0x1e, 0xe5, 0x91, 0x25, - 0xfa, 0x45, 0x7e, 0x0f, 0x9a, 0x09, 0x5d, 0x55, 0xfc, 0xad, 0xd8, 0x55, - 0xac, 0x78, 0x1f, 0x93, 0xdf, 0x60, 0x6a, 0x83, 0x2d, 0x6d, 0xde, 0xed, - 0x1d, 0x91, 0xb8, 0x2d, 0x62, 0x27, 0x04, 0x28, 0xb4, 0xe6, 0x0e, 0xee, - 0x1b, 0xef, 0x10, 0xfd, 0x65, 0x8c, 0xfa, 0xba, 0x2c, 0x97, 0x6e, 0xa9, - 0xab, 0x55, 0x10, 0x63, 0x23, 0x23, 0xc2, 0x81, 0x78, 0x17, 0xa8, 0x71, - 0x32, 0x7b, 0x4e, 0x04, 0x19, 0x18, 0x33, 0x85, 0xa6, 0xdb, 0x5f, 0x32, - 0x2a, 0xf7, 0xc1, 0xed, 0x98, 0x6e, 0x57, 0x6a, 0xfa, 0xa8, 0x74, 0xaa, - 0xdc, 0xb2, 0x6a, 0xb6, 0x18, 0x5c, 0xe7, 0x4a, 0x3b, 0xbd, 0xb7, 0x1b, - 0x30, 0x1c, 0x9f, 0xed, 0xb3, 0x06, 0x08, 0x2e, 0xf6, 0x88, 0x98, 0xdd, - 0x22, 0x8b, 0x98, 0x50, 0x5d, 0xcb, 0x2f, 0x01, 0x2b, 0xeb, 0x38, 0xd1, - 0xb7, 0x85, 0x7e, 0x1d, 0x55, 0x4c, 0x12, 0x3b, 0x0e, 0x85, 0xfe, 0x15, - 0x1f, 0x50, 0xe1, 0x39, 0xe1, 0xe9, 0xfd, 0xac, 0x4f, 0xe5, 0xde, 0xa2, - 0x6e, 0xec, 0x2e, 0x3a, 0xa0, 0x97, 0xed, 0xb2, 0x8f, 0x7b, 0xc9, 0xa5, - 0x42, 0x56, 0xcf, 0x72, 0x51, 0x79, 0xe5, 0x3e, 0x6e, 0xf0, 0xb8, 0x21, - 0x1b, 0xa1, 0xcc, 0xa3, 0x90, 0x5a, 0x07, 0x9b, 0x30, 0x49, 0x1a, 0x99, - 0xf1, 0xa3, 0x00, 0x40, 0x6d, 0x42, 0x6b, 0x11, 0x0e, 0x64, 0x33, 0xe4, - 0x4e, 0x60, 0xd8, 0x51, 0x88, 0xe9, 0x63, 0x2b, 0xaa, 0x3d, 0x89, 0x18, - 0x85, 0x54, 0x94, 0xe2, 0x64, 0xfb, 0x09, 0x29, 0xf7, 0xe6, 0x15, 0xa3, - 0x2c, 0xd9, 0x62, 0x5a, 0xab, 0x8d, 0x9b, 0xd2, 0x02, 0x80, 0x55, 0x30, - 0x3e, 0x04, 0x5d, 0x6d, 0xca, 0xd7, 0x5d, 0x64, 0xb0, 0x9c, 0xb0, 0xc1, - 0xcd, 0x51, 0x45, 0x9f, 0xd5, 0x71, 0x19, 0xe8, 0xb3, 0x0c, 0xc7, 0xe8, - 0x0f, 0xff, 0x60, 0x4b, 0xf3, 0x00, 0xb3, 0xb8, 0x41, 0x7b, 0x21, 0x11, - 0xb6, 0x96, 0x7d, 0x14, 0x29, 0x92, 0xa5, 0xb3, 0x5a, 0x81, 0x6e, 0xdb, - 0xd2, 0x92, 0x41, 0x9a, 0x47, 0xca, 0x9a, 0xff, 0x64, 0xcf, 0x3c, 0xec, - 0x07, 0x76, 0xc3, 0x0e, 0xaf, 0xf6, 0x5c, 0x68, 0xd2, 0xb0, 0x9c, 0xb0, - 0xf6, 0xa5, 0x07, 0x7b, 0x48, 0x50, 0xf1, 0x3c, 0x0c, 0xa1, 0x05, 0xe3, - 0xdb, 0x61, 0xbe, 0x39, 0x76, 0x6f, 0xf1, 0x70, 0xf7, 0x9e, 0x1e, 0x8a, - 0x6b, 0x00, 0x3e, 0x97, 0x01, 0x2b, 0xc5, 0x4c, 0xe1, 0x02, 0x34, 0xd4, - 0x32, 0xd1, 0x70, 0x70, 0x05, 0x22, 0x2e, 0xce, 0x96, 0x0e, 0x32, 0xd8, - 0xfa, 0x63, 0xb0, 0xb1, 0x99, 0x9a, 0x2e, 0xa3, 0x2c, 0xd9, 0x7e, 0xfa, - 0xca, 0xa7, 0x1d, 0xe5, 0x8b, 0x24, 0x79, 0x9d, 0x46, 0x95, 0xcd, 0xa8, - 0xa4, 0xac, 0x9c, 0xd2, 0xe2, 0x8e, 0x48, 0x1b, 0x80, 0x21, 0x31, 0x23, - 0x2c, 0x6a, 0x74, 0xb9, 0xf2, 0x05, 0x4e, 0x2e, 0x06, 0x71, 0x0b, 0xd8, - 0x2a, 0xf7, 0x03, 0x3d, 0xdb, 0x66, 0xc3, 0x2d, 0x56, 0xce, 0x29, 0xd3, - 0xea, 0xfa, 0xca, 0x95, 0x84, 0xd1, 0x1d, 0xf5, 0xc6, 0x82, 0x5f, 0x06, - 0x63, 0x29, 0x07, 0xbb, 0x38, 0x45, 0xc0, 0x5d, 0xfb, 0xf9, 0x28, 0xc5, - 0x21, 0xe6, 0x59, 0x7e, 0x2d, 0xd4, 0xc1, 0x76, 0xa6, 0x4b, 0x79, 0xa9, - 0x07, 0xee, 0x31, 0x3d, 0x4b, 0xe1, 0x33, 0x2a, 0x90, 0x77, 0x9a, 0x2c, - 0x4d, 0x6a, 0x35, 0x2d, 0xb1, 0x86, 0xdf, 0x8b, 0x10, 0x96, 0x74, 0x52, - 0x4a, 0x4e, 0x61, 0x34, 0x1d, 0x7a, 0xc7, 0xcc, 0x23, 0xb8, 0x8f, 0x9e, - 0xfa, 0x76, 0xe8, 0xdf, 0x1b, 0x57, 0xf1, 0x2a, 0x06, 0x9e, 0xf0, 0x51, - 0xac, 0x4c, 0x52, 0x3c, 0x43, 0xed, 0x8f, 0x46, 0xf0, 0x1f, 0xc0, 0x25, - 0x37, 0x3a, 0x65, 0x5d, 0xe9, 0x7b, 0xa8, 0xde, 0x3c, 0x0a, 0x92, 0x56, - 0x73, 0x45, 0x2a, 0xbf, 0x38, 0xa9, 0x06, 0x96, 0xcb, 0x99, 0x2d, 0x2d, - 0xd6, 0x3b, 0xf1, 0xaf, 0xec, 0xd3, 0x71, 0xd3, 0x1b, 0x5e, 0x0c, 0x13, - 0xe7, 0x37, 0x86, 0xa4, 0xe7, 0x1b, 0x2c, 0x8a, 0xe2, 0xdb, 0xb6, 0x5d, - 0xae, 0x34, 0x1c, 0x4d, 0xe8, 0x25, 0x0e, 0xac, 0xe7, 0x35, 0x15, 0xcf, - 0xac, 0x1d, 0xfa, 0xb8, 0x4f, 0x42, 0xaa, 0xf9, 0x23, 0x97, 0x4f, 0x36, - 0x3f, 0x11, 0x2f, 0xa8, 0xc4, 0xd7, 0x27, 0x27, 0xbe, 0x40, 0x5f, 0x0e, - 0xcc, 0xf3, 0x85, 0x72, 0x01, 0xea, 0x7a, 0x9a, 0xdf, 0xfc, 0x45, 0xd9, - 0x4d, 0x57, 0xc8, 0x82, 0x32, 0x1c, 0xea, 0x13, 0xde, 0x9d, 0x42, 0x3e, - 0x0a, 0x84, 0x28, 0xee, 0xe3, 0x1d, 0xcb, 0x94, 0xf9, 0x50, 0x66, 0xdf, - 0xbe, 0x50, 0x12, 0x77, 0x38, 0xcf, 0x38, 0x98, 0x48, 0x96, 0x33, 0xdc, - 0x3f, 0x1b, 0x34, 0x4f, 0x13, 0x6c, 0xba, 0x1e, 0x71, 0xbc, 0x90, 0x76, - 0x98, 0x8f, 0xbc, 0x53, 0xce, 0x9d, 0x1c, 0x17, 0x39, 0xc0, 0x8d, 0x99, - 0x43, 0xdc, 0x2f, 0xd9, 0xa4, 0xa7, 0x0f, 0x06, 0x4f, 0xb6, 0x1c, 0x26, - 0xa0, 0x17, 0xb0, 0xb3, 0x6f, 0xe6, 0x9a, 0x32, 0x11, 0xbd, 0xa8, 0x4b, - 0xd9, 0xd4, 0x33, 0xdc, 0xdc, 0xc3, 0x00, 0xed, 0x07, 0xf6, 0x1e, 0x11, - 0xf5, 0xa0, 0xd5, 0xd3, 0xa5, 0xa6, 0x72, 0x0b, 0x3c, 0xf2, 0x46, 0x00, - 0x64, 0x0c, 0xba, 0xad, 0x81, 0xa8, 0xc4, 0xb0, 0xf4, 0x3c, 0xfe, 0xdc, - 0x64, 0x3b, 0x8c, 0x42, 0xd7, 0x60, 0xbe, 0x6e, 0x0f, 0x16, 0x93, 0xc8, - 0x56, 0x81, 0x28, 0xb5, 0x70, 0xf2, 0x70, 0x95, 0x4c, 0x14, 0x71, 0xbc, - 0x4e, 0x75, 0x93, 0x53, 0x33, 0x60, 0x60, 0x68, 0x05, 0x4d, 0xbd, 0xc2, - 0xa0, 0xc9, 0x75, 0x41, 0x94, 0x3c, 0x57, 0x29, 0x83, 0xf1, 0xcd, 0x81, - 0xd2, 0xbc, 0x45, 0x36, 0xaf, 0x7c, 0xad, 0x13, 0x0a, 0xdf, 0x04, 0x9b, - 0xb3, 0x87, 0xb6, 0xee, 0xac, 0x3c, 0xb2, 0xe5, 0x46, 0xeb, 0x74, 0x10, - 0x30, 0x54, 0x68, 0x93, 0x3e, 0x1d, 0xc9, 0xf0, 0x51, 0x8f, 0xf4, 0xe0, - 0x3e, 0xea, 0xbc, 0x54, 0x0c, 0xe2, 0x79, 0xad, 0x73, 0xbc, 0xd0, 0x08, - 0xe8, 0x51, 0xe3, 0x22, 0x83, 0x34, 0x1f, 0xce, 0x64, 0x84, 0xaf, 0xfd, - 0x2e, 0xab, 0xea, 0x38, 0xd6, 0xb2, 0xf5, 0x5c, 0xc8, 0xd5, 0x96, 0x60, - 0x35, 0x89, 0x6a, 0x61, 0xa2, 0x76, 0x50, 0x0e, 0xef, 0xed, 0x27, 0xf3, - 0xa3, 0xe6, 0x25, 0x61, 0x76, 0xa0, 0xec, 0xd5, 0x95, 0x0e, 0x32, 0x9e, - 0x80, 0xdb, 0xa5, 0x77, 0x02, 0x85, 0xf3, 0xbe, 0xdb, 0x2a, 0xde, 0xf0, - 0x78, 0x9c, 0xd6, 0x67, 0x3c, 0x87, 0xb0, 0xbf, 0x57, 0xf1, 0x80, 0x09, - 0x8d, 0x68, 0x8e, 0x23, 0x0a, 0x94, 0xb5, 0xa8, 0x68, 0x5a, 0x1d, 0x56, - 0x9a, 0x8f, 0xa9, 0x37, 0x8a, 0xf8, 0x53, 0xdd, 0xa9, 0x9a, 0x2e, 0x85, - 0xae, 0xb6, 0x7b, 0xd9, 0xad, 0xbc, 0xce, 0x72, 0x47, 0xd4, 0x69, 0x97, - 0xe3, 0x4c, 0xd5, 0x21, 0x4e, 0x4a, 0xc4, 0xe1, 0x89, 0x6d, 0x21, 0x05, - 0x53, 0x7b, 0xcf, 0xb2, 0xd7, 0x32, 0xc6, 0xea, 0xf7, 0x67, 0x60, 0x2f, - 0xaa, 0xf1, 0x53, 0x78, 0x27, 0x94, 0xe5, 0xb2, 0xa9, 0xd5, 0xdf, 0x5f, - 0x78, 0x88, 0x33, 0xe6, 0x5d, 0x4e, 0xd5, 0xcb, 0xb8, 0xfb, 0xa3, 0x5b, - 0x3c, 0xe4, 0xec, 0x7d, 0xb7, 0x8d, 0xca, 0x9c, 0x04, 0x8e, 0xc2, 0x13, - 0x44, 0xb0, 0x62, 0x1f, 0xaf, 0x0b, 0xc1, 0xf2, 0x03, 0x7c, 0xf4, 0xa6, - 0xbb, 0xfc, 0x8b, 0xb8, 0x4e, 0x44, 0x3a, 0xc9, 0x93, 0xc7, 0xd1, 0xbc, - 0x0d, 0xf2, 0x61, 0x4a, 0x33, 0xaf, 0x30, 0x2f, 0x1f, 0x18, 0x11, 0x5d, - 0x3a, 0x5f, 0x38, 0x9a, 0x44, 0xef, 0x91, 0xc5, 0x34, 0x39, 0xf4, 0x55, - 0xd4, 0xd5, 0x9b, 0x79, 0x0a, 0x1b, 0x94, 0x7c, 0xbc, 0xa4, 0xf3, 0xa5, - 0x15, 0xc5, 0xd2, 0x4b, 0x6a, 0x4d, 0x64, 0xb8, 0x56, 0x8c, 0xed, 0x35, - 0x3c, 0xf6, 0xb1, 0xef, 0x0a, 0x9e, 0x6e, 0xf3, 0x08, 0xa0, 0x1b, 0xb5, - 0xa7, 0xc5, 0x51, 0xdc, 0x71, 0x43, 0x7b, 0x5a, 0x6f, 0xea, 0xac, 0x13, - 0x45, 0x6c, 0xc0, 0xb9, 0xd5, 0x2a, 0x61, 0xaf, 0xad, 0x34, 0xe0, 0x1c, - 0xaa, 0xa0, 0xb7, 0x64, 0x46, 0x06, 0xf4, 0x2e, 0xf2, 0x4a, 0x46, 0xf8, - 0x56, 0x37, 0x2b, 0xa2, 0x2d, 0x49, 0x19, 0x09, 0xc7, 0x5d, 0xa4, 0xd0, - 0x9f, 0xb3, 0x8b, 0xb2, 0xa4, 0x4a, 0x02, 0x4c, 0x2b, 0x47, 0x73, 0xcc, - 0x93, 0xd1, 0x48, 0xcd, 0xee, 0x0e, 0x8b, 0x60, 0xc4, 0xa2, 0xa2, 0x09, - 0x27, 0xc5, 0x74, 0xe2, 0xbe, 0xfc, 0x17, 0x31, 0x76, 0x7f, 0x15, 0x09, - 0x96, 0x64, 0xa8, 0x92, 0xcb, 0x49, 0x45, 0xc0, 0xd2, 0xbe, 0x89, 0x48, - 0x7e, 0x46, 0xd4, 0x11, 0x76, 0xec, 0x89, 0x65, 0xda, 0x40, 0x91, 0xab, - 0xb1, 0xd6, 0x90, 0x47, 0x57, 0xab, 0xa8, 0x74, 0xd9, 0xcf, 0xd7, 0x7a, - 0x12, 0xb9, 0xae, 0xf2, 0x84, 0x6c, 0x5f, 0xa8, 0xc3, 0x4e, 0xf4, 0xd3, - 0xac, 0x9e, 0xb5, 0x9f, 0xfc, 0xad, 0x8a, 0x69, 0x5b, 0xa9, 0xd5, 0x53, - 0x84, 0x71, 0x72, 0x85, 0xea, 0x3d, 0xcf, 0x43, 0xeb, 0xfb, 0x99, 0xbb, - 0x8e, 0x14, 0xb1, 0x1a, 0x70, 0xe3, 0x00, 0xbd, 0xcf, 0xed, 0xa0, 0xd4, - 0x9a, 0x3e, 0xc0, 0x49, 0x4f, 0x55, 0xb7, 0xbb, 0xb5, 0xda, 0xfe, 0xad, - 0xe1, 0x81, 0x00, 0xba, 0xd3, 0x04, 0x51, 0xee, 0x42, 0xef, 0xfe, 0x47, - 0x6e, 0xfe, 0xa9, 0xaf, 0xef, 0x03, 0xff, 0x44, 0x3e, 0x5c, 0x91, 0xdd, - 0xa8, 0x5b, 0x63, 0x4c, 0x2d, 0xc8, 0xca, 0xe5, 0x59, 0xa4, 0x4f, 0x51, - 0x7d, 0x90, 0x5d, 0x09, 0x28, 0xdc, 0x29, 0xdd, 0x37, 0x67, 0x08, 0x2e, - 0xf6, 0x4a, 0x99, 0x13, 0x08, 0xf2, 0xa5, 0x52, 0xb9, 0x2d, 0xaf, 0x64, - 0xc7, 0xc4, 0x48, 0xe2, 0x2d, 0x53, 0x24, 0x8d, 0x92, 0x9f, 0xcf, 0xf0, - 0x3f, 0x12, 0x4b, 0x2e, 0xc0, 0xf1, 0x94, 0x37, 0x6a, 0x9b, 0xe2, 0xd8, - 0x51, 0xb2, 0x37, 0x11, 0x29, 0x09, 0x52, 0x14, 0x03, 0x05, 0x17, 0x72, - 0xa4, 0x53, 0x14, 0xf5, 0x76, 0x84, 0x0e, 0x49, 0x29, 0xba, 0x55, 0x94, - 0xe1, 0x76, 0xe6, 0xad, 0x9b, 0x10, 0x91, 0x50, 0x57, 0x61, 0x75, 0x8b, - 0xde, 0x48, 0x10, 0xff, 0xec, 0xbc, 0xb7, 0x0e, 0xbe, 0x38, 0xbf, 0x80, - 0xa5, 0xca, 0x0b, 0x2c, 0x71, 0xd4, 0xde, 0xe2, 0x80, 0xd4, 0xe9, 0x8b, - 0x77, 0x49, 0x64, 0xec, 0xc5, 0x3a, 0x82, 0xec, 0x4e, 0xec, 0xef, 0xc8, - 0xbf, 0xea, 0xd4, 0xb7, 0x77, 0x49, 0x64, 0xec, 0xc5, 0x3a, 0x82, 0xec, - 0xae, 0x19, 0xcc, 0x56, 0x90, 0xa1, 0x33, 0xc0, 0xc2, 0x7a, 0x12, 0xc9, - 0x03, 0x8d, 0xce, 0x6c, 0x4e, 0xec, 0xef, 0xc8, 0xbf, 0xea, 0xd4, 0xb7, - 0x77, 0x76, 0x5b, 0xd3, 0xfa, 0x3a, 0x82, 0xec, 0x4e, 0xec, 0xef, 0xc8, - 0xbf, 0xea, 0xd4, 0xb7, 0x77, 0x49, 0x64, 0xec, 0xc5, 0x3a, 0x82, 0xec, - 0xce, 0x23, 0xd2, 0xd5, 0xf1, 0xb1, 0x43, 0x24, 0x05, 0xac, 0xd3, 0x52, - 0x33, 0xda, 0xe9, 0xe4, 0x6b, 0x71, 0x6f, 0xbb, 0x05, 0x15, 0x93, 0xc2, - 0x97, 0x23, 0xb1, 0x3e, 0xbf, 0x70, 0x72, 0x42, 0x71, 0xd3, 0xd0, 0xf7, - 0xbf, 0xea, 0xd4, 0xb7, 0x77, 0x49, 0x64, 0xec, 0xc5, 0x3a, 0x82, 0xec, - 0xd4, 0x97, 0xeb, 0x62, 0x14, 0x11, 0x6d, 0x32, 0x93, 0x63, 0x7e, 0xa5, - 0x00, 0xc0, 0x22, 0x37, 0x06, 0x61, 0xa7, 0xf1, 0x3c, 0x76, 0x2c, 0x56, - 0xd5, 0xd2, 0x92, 0x1b, 0x70, 0x68, 0xac, 0x77, 0x39, 0x5e, 0xe7, 0xce, - 0x03, 0x36, 0x13, 0x69, 0x95, 0xed, 0xad, 0x24, 0x70, 0x68, 0xac, 0x77, - 0xbf, 0x4d, 0xb8, 0x70, 0xcb, 0xba, 0x3c, 0xbb, 0x1c, 0x0f, 0x56, 0x40, - 0xa6, 0x5b, 0x39, 0xbc, 0xe8, 0x41, 0x78, 0xc8, 0x9a, 0x61, 0x6b, 0x0e, - 0x19, 0x7a, 0x93, 0xa9, 0x1c, 0x69, 0xd9, 0x25, 0x38, 0xff, 0x81, 0x75, - 0x99, 0x4d, 0x36, 0x93, 0x59, 0x93, 0x6f, 0x0c, 0x2f, 0x5a, 0x14, 0x22, - 0x9c, 0x8f, 0x79, 0xe4, 0xff, 0xd7, 0xab, 0x84, 0x0a, 0x38, 0xb5, 0x2e, - 0xbe, 0x3c, 0x32, 0x84, 0x2f, 0xb9, 0x94, 0x0a, 0x11, 0x64, 0x9f, 0x1e, - 0x51, 0x54, 0xf1, 0x68, 0xc9, 0x61, 0xb3, 0xf5, 0x5a, 0x0f, 0x4c, 0x05, - 0x76, 0x15, 0xf7, 0x25, 0xd0, 0xb2, 0xb9, 0x05, 0x32, 0x96, 0x79, 0x75, - 0x98, 0xd7, 0x42, 0x32, 0x38, 0x45, 0x5b, 0x47, 0x22, 0xa2, 0xb8, 0xdb, - 0xc7, 0x10, 0xf4, 0x74, 0xef, 0xb6, 0xbb, 0x4c, 0x58, 0x38, 0xf8, 0x53, - 0x4c, 0x98, 0xa8, 0x30, 0xf4, 0x83, 0x6c, 0xc1, 0x24, 0xe8, 0x20, 0x26, - 0x0b, 0x74, 0xf0, 0x0a, 0xc0, 0xfd, 0x1e, 0xf5, 0x49, 0x7f, 0x2a, 0x4f, - 0xb9, 0x11, 0x6e, 0xd8, 0xdf, 0xfe, 0xee, 0xfb, 0xda, 0x5e, 0xcf, 0xa9, - 0x8e, 0xc8, 0x23, 0x26, 0xcc, 0xf5, 0x75, 0xf0, 0xdb, 0x3b, 0x22, 0x85, - 0x1f, 0x3f, 0xc8, 0xf3, 0xe5, 0x1b, 0x71, 0xf8, 0xc6, 0x6f, 0xbc, 0x12, - 0x55, 0xf1, 0x33, 0x91, 0x0d, 0x24, 0xdf, 0x9b, 0xec, 0xcf, 0x00, 0xdb, - 0xb2, 0xd0, 0xce, 0x5e, 0x61, 0x1a, 0x77, 0x17, 0x17, 0x76, 0x8b, 0x41, - 0xaf, 0xc0, 0xd8, 0x5b, 0xec, 0xbb, 0x5d, 0xbd, 0xaa, 0x44, 0x7a, 0xa3, - 0x62, 0x34, 0x64, 0x04, 0x94, 0x53, 0x62, 0x5f, 0x66, 0x97, 0x4c, 0x4d, - 0x27, 0xf3, 0x09, 0x14, 0x1e, 0xb6, 0xfc, 0x76, 0xd4, 0xef, 0xdb, 0x2e, - 0x0d, 0xbc, 0x63, 0x9f, 0xa3, 0xfd, 0xd4, 0x27, 0xcc, 0x48, 0x60, 0xe6, - 0xf5, 0x72, 0x86, 0xc9, 0x01, 0x46, 0x0c, 0x87, 0x75, 0x66, 0x56, 0x1e, - 0xdf, 0x8b, 0x09, 0xe4, 0x6b, 0x13, 0x64, 0x45, 0xb9, 0x5f, 0x9f, 0xf5, - 0x84, 0x23, 0xdf, 0xf1, 0x8d, 0x87, 0x9f, 0x6b, 0xab, 0x87, 0xd2, 0x7b, - 0xfa, 0xce, 0x67, 0x71, 0x11, 0xbf, 0x6f, 0xfd, 0x54, 0x96, 0x83, 0x33, - 0x98, 0x37, 0x61, 0x17, 0xd8, 0x71, 0x62, 0xdd, 0xab, 0x87, 0xd1, 0xd2, - 0x4e, 0xac, 0x2b, 0x4b, 0x45, 0x58, 0x68, 0x96, 0x4a, 0xd5, 0x17, 0x9f, - 0xbb, 0xeb, 0x80, 0xd7, 0xf4, 0xfe, 0xdf, 0x75, 0xbd, 0x11, 0xcc, 0xe4, - 0x90, 0xe3, 0x76, 0x4a, 0xd3, 0x81, 0x2e, 0x5c, 0x89, 0x25, 0x68, 0x8f, - 0x6d, 0x84, 0xcf, 0x5e, 0x25, 0xa7, 0x2a, 0xbc, 0xc4, 0x2a, 0xde, 0x36, - 0xee, 0x88, 0x5d, 0xd8, 0xc3, 0x47, 0x29, 0x31, 0x57, 0x24, 0x20, 0x40, - 0xf9, 0x40, 0xf9, 0xbe, 0x26, 0xd3, 0xe6, 0xc2, 0x3f, 0x44, 0xf7, 0x8d, - 0xc3, 0x51, 0x44, 0xb4, 0xfe, 0x30, 0x2e, 0x97, 0x75, 0x23, 0xc8, 0x1d, - 0xc6, 0x9f, 0xe3, 0x2b, 0x47, 0x82, 0x1a, 0x3a, 0x95, 0x06, 0x6d, 0xbd, - 0x87, 0x09, 0xdd, 0x13, 0x0c, 0x46, 0x52, 0x21, 0x50, 0x63, 0xbf, 0xd2, - 0xc1, 0xe4, 0x84, 0x56, 0x11, 0x09, 0x3e, 0x2d, 0x90, 0x47, 0x0a, 0x30, - 0x43, 0x92, 0x5d, 0xbc, 0xe2, 0x95, 0x7e, 0xae, 0x7b, 0xf5, 0x9d, 0x9b, - 0xb2, 0xc4, 0xb1, 0x09, 0x0c, 0x15, 0x18, 0x59, 0xe6, 0x8a, 0x2a, 0x8d, - 0x68, 0x3c, 0xe5, 0x9f, 0x02, 0xe1, 0x03, 0xa8, 0xb6, 0x37, 0x93, 0x0e, - 0x71, 0xe1, 0xb7, 0x0e, 0x33, 0x37, 0x72, 0xc1, 0x33, 0xc0, 0x96, 0xc8, - 0xc4, 0x9b, 0x5f, 0xa5, 0xb6, 0x0c, 0xf3, 0xa5, 0x43, 0x65, 0x72, 0xc6, - 0x4a, 0xc8, 0x1b, 0x50, 0xd4, 0xe1, 0x4c, 0xe8, 0xd2, 0x22, 0xab, 0xc5, - 0x69, 0x5d, 0x99, 0x82, 0x00, 0xbb, 0xb7, 0xda, 0x90, 0x83, 0x71, 0xbe, - 0xea, 0x71, 0x0d, 0xa9, 0x1a, 0xc2, 0xbf, 0xbc, 0xeb, 0xfe, 0xb8, 0xcb, - 0x95, 0x1d, 0x0a, 0x7d, 0x16, 0xc5, 0xd4, 0xd9, 0xfc, 0x07, 0xbe, 0x5b, - 0x77, 0x64, 0x52, 0x37, 0x5c, 0x5a, 0xd1, 0x0d, 0xfe, 0xc9, 0x26, 0xa5, - 0xd4, 0xe0, 0x37, 0x6b, 0xf6, 0x50, 0xd3, 0x8d, 0x52, 0x31, 0x86, 0x03, - 0x53, 0x17, 0x66, 0x7c, 0xe8, 0x94, 0x84, 0x5c, 0xfc, 0x4f, 0x8d, 0x74, - 0xb8, 0xe7, 0x9a, 0xf8, 0xda, 0x7b, 0x67, 0x8b, 0x29, 0x6f, 0xd9, 0xd5, - 0x02, 0x7c, 0xdb, 0xc2, 0xba, 0xbd, 0x51, 0x72, 0x13, 0xcb, 0x14, 0x95, - 0x98, 0x7d, 0xe6, 0x01, 0xed, 0x38, 0xe5, 0xf9, 0x01, 0x91, 0x09, 0x37, - 0xe6, 0xb6, 0x04, 0x4e, 0xac, 0x34, 0xd0, 0x96, 0x22, 0x0c, 0x0c, 0xf4, - 0xe1, 0x9b, 0x1d, 0x7b, 0xd6, 0x0a, 0x29, 0xe2, 0x35, 0xd7, 0x24, 0x00, - 0x5f, 0x4f, 0xe4, 0xc5, 0xa7, 0xd8, 0xd5, 0x92, 0x8b, 0x81, 0x04, 0x49, - 0x0b, 0xc2, 0x92, 0x51, 0xbc, 0x02, 0xc5, 0x8e, 0x30, 0xc9, 0xf5, 0x4b, - 0x50, 0x68, 0xa2, 0xcd, 0x7f, 0x9b, 0x61, 0x6f, 0x36, 0x07, 0x72, 0x8e, - 0x3b, 0x07, 0xa9, 0xdc, 0x07, 0x93, 0x21, 0x9a, 0x60, 0xee, 0xf9, 0xa8, - 0xde, 0xfd, 0xf5, 0x00, 0x37, 0xf0, 0x63, 0x10, 0x7c, 0x87, 0x4d, 0xd5, - 0xa0, 0xe6, 0x8f, 0x8f, 0x12, 0x78, 0xd4, 0xba, 0x25, 0x6f, 0xae, 0x2e, - 0x4e, 0x01, 0xf5, 0x1d, 0xd3, 0xdb, 0x3f, 0xe6, 0x1f, 0x94, 0xe5, 0x4f, - 0x1e, 0xbf, 0x07, 0xab, 0xd1, 0x49, 0x85, 0x21, 0xe1, 0xe8, 0xd4, 0xbb, - 0xa5, 0x52, 0xac, 0x76, 0xe9, 0xc0, 0x30, 0xf6, 0x63, 0x25, 0x59, 0xfd, - 0x9a, 0xad, 0xa9, 0x13, 0xa7, 0x28, 0xa8, 0x53, 0xc5, 0x67, 0x8b, 0x3c, - 0x55, 0xad, 0x81, 0x2d, 0xd5, 0xa4, 0x64, 0xd9, 0x0a, 0xcc, 0x49, 0x72, - 0xca, 0x8d, 0x2d, 0x83, 0xce, 0x27, 0x49, 0x23, 0x96, 0x83, 0xea, 0xc3, - 0x36, 0x07, 0x96, 0xca, 0xae, 0x43, 0x25, 0x76, 0x71, 0x39, 0xfa, 0xec, - 0xa8, 0xbe, 0xf5, 0x7c, 0x6e, 0x1d, 0x5a, 0xbe, 0x45, 0xd8, 0x40, 0x18, - 0x92, 0x79, 0x9b, 0xca, 0xf4, 0x6f, 0xa6, 0xae, 0x9f, 0x01, 0x8d, 0xe9, - 0x64, 0xd4, 0xfb, 0x05, 0x7c, 0x1d, 0x3c, 0xdb, 0xf4, 0xb9, 0x6e, 0xb1, - 0xae, 0xe8, 0xd9, 0x66, 0xc3, 0xea, 0xbe, 0x35, 0x87, 0x18, 0x04, 0xf1, - 0x13, 0xb8, 0xdc, 0xfb, 0x57, 0x57, 0xf7, 0x79, 0xff, 0xbd, 0x56, 0x5b, - 0x3e, 0xdc, 0x20, 0x4a, 0xa0, 0x72, 0x33, 0x0a, 0x76, 0xc6, 0x4a, 0x4a, - 0xa9, 0x09, 0x67, 0x6e, 0x8b, 0x70, 0x75, 0xf3, 0xe2, 0x3c, 0x48, 0xfd, - 0x86, 0xd4, 0xed, 0xe0, 0x2d, 0x45, 0xd4, 0x1b, 0xa5, 0x74, 0xf1, 0x8f, - 0x91, 0x46, 0xab, 0x78, 0xfe, 0x7f, 0x98, 0xe6, 0x56, 0x91, 0x92, 0x4d, - 0xc8, 0xf6, 0x08, 0x66, 0x48, 0xac, 0x83, 0xd5, 0xe7, 0xd8, 0x33, 0xe8, - 0x90, 0x86, 0x1e, 0x3c, 0xf7, 0x60, 0x33, 0x8a, 0x29, 0x2e, 0x73, 0x06, - 0x37, 0x91, 0x65, 0xbe, 0x53, 0x67, 0xc1, 0xa8, 0xd5, 0xa1, 0x79, 0x21, - 0x7d, 0x0d, 0xaa, 0x67, 0xe6, 0x0b, 0x16, 0x02, 0x04, 0x8f, 0xb6, 0x69, - 0x97, 0x58, 0xd2, 0xa2, 0x83, 0x20, 0x25, 0xca, 0xcc, 0xa8, 0x69, 0x5f, - 0xf7, 0x5d, 0xb1, 0x67, 0xe0, 0xb7, 0x5a, 0x39, 0x6e, 0x90, 0x46, 0x6d, - 0xf6, 0xf8, 0x1d, 0xac, 0xc6, 0xdc, 0x5c, 0xe1, 0x9c, 0xf8, 0x96, 0x67, - 0x91, 0xf1, 0xa6, 0x60, 0x0d, 0x6a, 0x5b, 0xdc, 0x40, 0x14, 0x5e, 0x48, - 0xf8, 0x37, 0x75, 0xba, 0x1a, 0xfa, 0x47, 0x03, 0x4b, 0x9c, 0xdb, 0x8b, - 0x5a, 0x55, 0x04, 0x72, 0xc9, 0x6a, 0x61, 0x93, 0x9c, 0x3f, 0xda, 0x44, - 0xb2, 0x5e, 0xfc, 0x02, 0x5b, 0xa7, 0x52, 0x30, 0xba, 0x19, 0x5b, 0xf2, - 0x55, 0x98, 0x65, 0x42, 0xc7, 0xef, 0x30, 0x97, 0x03, 0x51, 0xeb, 0x15, - 0xdd, 0x73, 0x2c, 0x73, 0x12, 0xfb, 0x8d, 0xab, 0x25, 0x96, 0xe9, 0x3d, - 0x12, 0xfc, 0x29, 0x42, 0xd2, 0xdf, 0x10, 0xb8, 0x5e, 0xa2, 0x06, 0x6a, - 0x45, 0x77, 0xa4, 0xa2, 0x65, 0x60, 0xb7, 0x06, 0x10, 0xbf, 0xe8, 0x4b, - 0x13, 0xed, 0x82, 0x20, 0x44, 0x7e, 0x2f, 0x16, 0x99, 0x39, 0x6a, 0xe5, - 0xce, 0xf0, 0x36, 0xd8, 0xad, 0x33, 0x66, 0x5d, 0x82, 0x3a, 0xf8, 0x47, - 0xdb, 0x5f, 0xd2, 0x0f, 0x88, 0xe3, 0xd7, 0x71, 0xda, 0x74, 0x94, 0xfc, - 0x97, 0xa9, 0x42, 0xe8, 0x7f, 0xd4, 0xfd, 0xe3, 0x4f, 0xe4, 0x08, 0x04, - 0x78, 0x58, 0x73, 0x77, 0x07, 0xea, 0xe2, 0x56, 0x78, 0x39, 0x8a, 0x51, - 0xd8, 0x3e, 0x39, 0x5b, 0xa1, 0x3c, 0x72, 0xab, 0x52, 0xe9, 0xb9, 0x1c, - 0x43, 0x7d, 0xb4, 0xbb, 0x7a, 0x07, 0x18, 0x92, 0x04, 0x46, 0xc1, 0x08, - 0xbb, 0xf0, 0xa0, 0xaf, 0xb1, 0xc0, 0xbe, 0x5d, 0xc5, 0x79, 0xc3, 0x1c, - 0x55, 0x06, 0xa4, 0x10, 0x1a, 0xf9, 0x9c, 0xd3, 0xae, 0xb2, 0x94, 0x2c, - 0x2c, 0xf4, 0xc4, 0xa8, 0x14, 0x31, 0x39, 0xc5, 0x16, 0x1b, 0x45, 0xae, - 0xcb, 0xc1, 0x55, 0x47, 0x1e, 0xd6, 0xa2, 0xe2, 0x9c, 0xc6, 0xa8, 0xcc, - 0xdd, 0xbb, 0x23, 0xb4, 0xb5, 0x4f, 0xa3, 0x23, 0x12, 0xd6, 0xb6, 0x80, - 0x90, 0x07, 0x18, 0x33, 0x87, 0xf4, 0xec, 0x7b, 0xcb, 0xa1, 0xd0, 0x7c, - 0x1d, 0x91, 0x08, 0x0e, 0x15, 0x89, 0x25, 0x43, 0xa5, 0xa5, 0x08, 0x49, - 0x25, 0x3e, 0xd6, 0x86, 0x49, 0x31, 0x22, 0x72, 0xad, 0xbe, 0x41, 0x7b, - 0x46, 0xfb, 0xc0, 0xc8, 0x01, 0x53, 0x34, 0xaa, 0x7d, 0x87, 0x1f, 0x89, - 0x6f, 0xff, 0xdd, 0xff, 0x83, 0x6f, 0x54, 0x9e, 0x36, 0xec, 0x6c, 0x02, - 0x86, 0x75, 0x69, 0xe4, 0x9c, 0x86, 0x4f, 0xa0, 0xf6, 0x4c, 0x35, 0x29, - 0xdd, 0x41, 0x97, 0x33, 0xe8, 0xff, 0x82, 0x4b, 0x63, 0x68, 0x24, 0xfa, - 0x69, 0x84, 0x75, 0x5b, 0x29, 0x54, 0x5f, 0x5f, 0x9b, 0xa6, 0x5d, 0x0f, - 0x53, 0x5c, 0x29, 0x9e, 0x92, 0xf0, 0x69, 0x6b, 0x36, 0x40, 0x5d, 0x8e, - 0xc3, 0x9a, 0xe1, 0x1f, 0xb2, 0xc4, 0x07, 0x27, 0xb9, 0xa8, 0xea, 0xc6, - 0xe1, 0xe7, 0x12, 0x18, 0xd7, 0xe3, 0xe9, 0x1c, 0x9a, 0xe5, 0x87, 0x4a, - 0x79, 0x30, 0x0b, 0x41, 0x08, 0x0b, 0x73, 0x0d, 0x1b, 0x33, 0xa9, 0x78, - 0x34, 0x04, 0xca, 0xa8, 0x73, 0xe9, 0x80, 0x16, 0x73, 0xcc, 0x0e, 0xc3, - 0x25, 0x5a, 0x24, 0x4a, 0xef, 0x47, 0x6d, 0xd4, 0x60, 0x0d, 0x6e, 0x85, - 0x90, 0xa7, 0xaf, 0xc8, 0x5b, 0xef, 0x81, 0xc9, 0x83, 0x30, 0x71, 0x60, - 0x63, 0xe2, 0xfb, 0x29, 0xe4, 0xe1, 0xc9, 0x53, 0x84, 0xec, 0xca, 0xac, - 0xec, 0xe1, 0x93, 0xfd, 0xc7, 0x12, 0x8f, 0xf8, 0x89, 0x00, 0x8c, 0xb9, - 0x35, 0xab, 0xa3, 0x36, 0x6e, 0xe2, 0xdd, 0xe0, 0x63, 0x92, 0xb1, 0xf0, - 0x0f, 0x1a, 0x2e, 0x93, 0xa7, 0xfa, 0x14, 0x2a, 0x34, 0x04, 0x6a, 0x8e, - 0x99, 0x53, 0xe2, 0xbd, 0x5d, 0x4d, 0xc2, 0xa2, 0xdc, 0x8c, 0x87, 0x38, - 0x80, 0x2d, 0x45, 0xb0, 0x37, 0xe0, 0xf9, 0x00, 0x2f, 0x31, 0xa2, 0xdf, - 0x50, 0x26, 0x27, 0xd3, 0x5f, 0x85, 0x96, 0x13, 0x33, 0x86, 0xad, 0x72, - 0x24, 0xb2, 0x14, 0x2d, 0x85, 0x86, 0x95, 0xa5, 0xb1, 0x0b, 0xdc, 0x8f, - 0x78, 0x12, 0xf4, 0x95, 0xeb, 0x0a, 0x76, 0x21, 0x9f, 0xd2, 0x45, 0x59, - 0x1f, 0x05, 0x09, 0x8d, 0xe0, 0xf0, 0xd0, 0xdf, 0x0d, 0x30, 0x1c, 0x56, - 0x10, 0x4e, 0x02, 0x5b, 0x62, 0x58, 0x4e, 0x73, 0x4a, 0x23, 0xf8, 0xcd, - 0x0b, 0xd3, 0x27, 0x73, 0x68, 0x45, 0x32, 0x7f, 0x14, 0xb5, 0xe6, 0xa6, - 0x3d, 0x7f, 0xb0, 0x2d, 0x94, 0x4e, 0xe6, 0x2e, 0x6c, 0x57, 0xbf, 0x41, - 0x42, 0xd7, 0x03, 0x2a, 0x52, 0xb8, 0xe4, 0x93, 0xeb, 0xda, 0xcb, 0x78, - 0xab, 0xd4, 0xb9, 0x09, 0x72, 0xa7, 0x5c, 0xfa, 0x1c, 0x62, 0x34, 0xb5, - 0x4a, 0x71, 0xa0, 0xcd, 0xf1, 0x57, 0xf1, 0x73, 0xc9, 0xda, 0x85, 0xc1, - 0x37, 0x80, 0x5c, 0x3e, 0x54, 0x91, 0x44, 0x44, 0x92, 0x1f, 0x9c, 0x4a, - 0x60, 0x7f, 0xd5, 0x14, 0xff, 0x5b, 0xe4, 0xd8, 0x6e, 0xb6, 0xc6, 0x9e, - 0x1c, 0xe2, 0xe8, 0xcf, 0xa6, 0x53, 0xf9, 0xac, 0xf6, 0xab, 0xdc, 0x9e, - 0x89, 0xbf, 0xe7, 0x43, 0x9c, 0x15, 0x3a, 0x99, 0x4c, 0xfb, 0xfc, 0xfe, - 0xb9, 0xa1, 0x49, 0xb7, 0x98, 0xb3, 0xcb, 0x0f, 0x15, 0xfa, 0x39, 0x8d, - 0xac, 0x94, 0x5c, 0x83, 0xb0, 0xfd, 0x2f, 0x0e, 0x0e, 0x81, 0x62, 0x24, - 0x19, 0x90, 0xb9, 0xbb, 0xf1, 0x05, 0x5a, 0xcb, 0x77, 0x9b, 0x43, 0x20, - 0xc7, 0xe6, 0xa2, 0x8e, 0x2c, 0xc7, 0x6b, 0x69, 0x89, 0x4d, 0xe6, 0xa3, - 0x1f, 0x35, 0x14, 0xd4, 0xc3, 0x98, 0xbd, 0xa3, 0x1e, 0x63, 0x15, 0x12, - 0xc7, 0x66, 0xd2, 0x89, 0xde, 0x0f, 0xa5, 0x1d, 0xe1, 0x41, 0xd4, 0x63, - 0x3e, 0xee, 0x89, 0xe0, 0xbd, 0xcf, 0xec, 0x78, 0xca, 0xa1, 0x4b, 0x13, - 0x1d, 0x84, 0x2a, 0x73, 0x85, 0x0b, 0xe9, 0x16, 0x0d, 0xf4, 0x28, 0xd3, - 0xed, 0x47, 0x01, 0x48, 0x43, 0x0d, 0x1b, 0x9b, 0x79, 0xb4, 0xa0, 0xd5, - 0xc8, 0xb2, 0xcc, 0x2b, 0x8b, 0xca, 0x3c, 0xe3, 0x3d, 0xe0, 0xdc, 0x5d, - 0xc1, 0x25, 0x54, 0xb1, 0x91, 0x48, 0x4f, 0x63, 0xe9, 0x73, 0xbf, 0xdd, - 0x8d, 0x1a, 0x40, 0xa4, 0x1d, 0xcc, 0x95, 0x59, 0xf1, 0x43, 0x0b, 0x60, - 0x9f, 0xbe, 0x5a, 0x2b, 0xa3, 0xcb, 0x4b, 0xfe, 0xa1, 0x00, 0x9c, 0x76, - 0xfb, 0x90, 0x2b, 0x4e, 0xd3, 0xee, 0x4a, 0x4d, 0xbf, 0xdc, 0xad, 0x99, - 0xf4, 0x8d, 0x7d, 0xf5, 0xf5, 0xdf, 0x73, 0x1f, 0xbf, 0xcb, 0x3b, 0xee, - 0x26, 0xba, 0x19, 0xfa, 0xbf, 0x8e, 0x60, 0xa5, 0x4c, 0xd4, 0xdf, 0x8f, - 0x7d, 0x16, 0xf3, 0x95, 0xa0, 0xa8, 0x84, 0xcd, 0xd7, 0xde, 0x72, 0xe2, - 0x62, 0xac, 0x3d, 0xd6, 0x8d, 0x3f, 0x7f, 0xc6, 0xe0, 0x09, 0x92, 0xbe, - 0x15, 0x49, 0x30, 0xcd, 0xcd, 0xf6, 0xcc, 0xc0, 0x54, 0x3d, 0x80, 0x86, - 0xfa, 0x1d, 0x91, 0x2b, 0xea, 0x7f, 0x61, 0xec, 0xab, 0x0b, 0x04, 0x7e, - 0xd1, 0x08, 0x46, 0x62, 0x37, 0xda, 0x5e, 0x7a, 0x12, 0x95, 0xc3, 0x3f, - 0xca, 0xa0, 0x52, 0xe4, 0x1b, 0x38, 0x9c, 0x3a, 0xc5, 0x52, 0x5f, 0xe2, - 0x9c, 0x3e, 0x2e, 0x35, 0xdd, 0xf6, 0x49, 0x91, 0x5f, 0x3b, 0xda, 0x74, - 0x03, 0x24, 0x33, 0x31, 0x1d, 0xd0, 0xa4, 0xc3, 0xa0, 0x9f, 0xa9, 0xb4, - 0x45, 0xea, 0x47, 0x69, 0x81, 0x9f, 0x71, 0x2b, 0xb2, 0x16, 0x55, 0x98, - 0x5f, 0x2c, 0x12, 0x42, 0x2e, 0x87, 0x9e, 0x8b, 0x4d, 0xd8, 0x99, 0xad, - 0x8a, 0x33, 0x4a, 0x99, 0x53, 0x0f, 0xf9, 0xa8, 0xba, 0x6d, 0x47, 0xa4, - 0xde, 0x11, 0x3f, 0x75, 0x36, 0xeb, 0x8b, 0x9b, 0x07, 0xf8, 0xe6, 0x4f, - 0xbd, 0x95, 0x63, 0xf0, 0x78, 0xc8, 0xa9, 0xb4, 0xa6, 0xbb, 0xc6, 0x45, - 0xf9, 0x63, 0x87, 0xf2, 0xba, 0xaf, 0x9f, 0x16, 0xbf, 0xc4, 0x51, 0x91, - 0xdd, 0x67, 0xc0, 0xfb, 0xdd, 0xc9, 0xd9, 0xa2, 0x91, 0xf8, 0x27, 0xf2, - 0x8a, 0x55, 0x9f, 0x47, 0x53, 0x91, 0xf9, 0xdb, 0x28, 0x92, 0x2a, 0xe5, - 0x9f, 0xd3, 0xe5, 0x4b, 0x1a, 0xa7, 0x89, 0x90, 0xcc, 0xfe, 0x46, 0x13, - 0x11, 0x21, 0x22, 0xb3, 0xb0, 0x12, 0x56, 0x43, 0x77, 0x7d, 0x8b, 0xdd, - 0x1b, 0x94, 0x75, 0xa3, 0xc5, 0x93, 0x6c, 0xbc, 0xa0, 0x07, 0xe0, 0xdf, - 0x6f, 0x5c, 0xb5, 0xe8, 0xba, 0x2e, 0x0e, 0x03, 0xad, 0x31, 0x85, 0xa1, - 0x30, 0x21, 0x3f, 0x97, 0xfb, 0x77, 0x6c, 0x7a, 0x83, 0x60, 0x94, 0xde, - 0xf6, 0xa6, 0x37, 0x95, 0x1a, 0xf9, 0x73, 0x0d, 0x4e, 0x49, 0xa5, 0x03, - 0xdd, 0x9d, 0x89, 0x2b, 0xf8, 0x0d, 0x92, 0xd4, 0x4e, 0xdc, 0x75, 0xf9, - 0x7f, 0xe8, 0xa3, 0xe6, 0x62, 0xbd, 0x38, 0x13, 0xda, 0x3f, 0xff, 0xbc, - 0x12, 0xcc, 0x30, 0x87, 0x73, 0xd7, 0xd9, 0x38, 0x4e, 0xc6, 0x14, 0xb9, - 0x8f, 0xdc, 0x4f, 0x84, 0x19, 0xc6, 0x6c, 0xeb, 0x77, 0xb2, 0x2f, 0xad, - 0x85, 0x87, 0xff, 0x09, 0x96, 0xb4, 0x2c, 0x49, 0x56, 0xa0, 0xdf, 0x4c, - 0xdc, 0x02, 0x5b, 0x2e, 0x67, 0xb2, 0x61, 0xb1, 0x7d, 0xf8, 0x3a, 0x3a, - 0x5d, 0xfd, 0x5e, 0x71, 0x3d, 0xb2, 0xef, 0x9c, 0x2b, 0xe6, 0xcb, 0xc4, - 0x63, 0x47, 0x50, 0xf5, 0xdf, 0x4a, 0xb9, 0x95, 0xbe, 0x2d, 0xfd, 0x56, - 0x61, 0x1a, 0x02, 0x62, 0x22, 0x63, 0xb5, 0x32, 0x6e, 0x7d, 0x60, 0xf7, - 0x94, 0x5a, 0x5a, 0xb1, 0x28, 0x40, 0xd4, 0x55, 0x18, 0xdb, 0xcd, 0xe4, - 0x81, 0x12, 0xbb, 0xb6, 0xb1, 0xc2, 0xa8, 0x45, 0x31, 0xbd, 0x0a, 0x20, - 0x11, 0x0a, 0xfa, 0x1f, 0xa6, 0x82, 0x11, 0x54, 0xda, 0xbd, 0x31, 0x95, - 0xff, 0xbf, 0xc1, 0x4a, 0x7d, 0xca, 0x63, 0x58, 0xe8, 0x6f, 0x66, 0x6f, - 0xf1, 0x80, 0xe3, 0x0e, 0xf5, 0xdf, 0x9d, 0xdc, 0x4d, 0x63, 0x86, 0x56, - 0x04, 0xdc, 0xc1, 0x6d, 0x26, 0x6b, 0x0b, 0xf5, 0xc5, 0xc9, 0x3c, 0xd7, - 0x2f, 0x5a, 0x3f, 0x37, 0x89, 0x0f, 0x44, 0x7d, 0xd7, 0x48, 0x66, 0x49, - 0x83, 0xb5, 0x85, 0xed, 0x81, 0x05, 0x9c, 0x56, 0x38, 0x98, 0xfe, 0x03, - 0x6c, 0xff, 0x39, 0x15, 0x7f, 0x41, 0xed, 0xa5, 0x2f, 0x4a, 0xa4, 0x5b, - 0xc1, 0x46, 0x40, 0xb5, 0x10, 0x7b, 0xb3, 0xb5, 0x62, 0x06, 0xae, 0xbf, - 0x04, 0x4f, 0xdc, 0x5e, 0xad, 0x09, 0x2c, 0x5b, 0x3f, 0xd9, 0xa9, 0x21, - 0xad, 0x9f, 0x32, 0x8a, 0x10, 0xb9, 0xcf, 0xf7, 0xce, 0x40, 0xa5, 0x00, - 0x79, 0xe3, 0x1c, 0xd3, 0x85, 0x85, 0x34, 0x24, 0x4f, 0xfa, 0x1b, 0xb5, - 0xb1, 0x63, 0xc7, 0x58, 0x40, 0x87, 0xa3, 0x3a, 0xdf, 0xf7, 0xdf, 0x4e, - 0xd3, 0xb5, 0xf2, 0xf2, 0x71, 0x38, 0x17, 0xad, 0x18, 0x14, 0xa9, 0x09, - 0x53, 0x84, 0xa5, 0xdf, 0xc4, 0x78, 0x90, 0xe6, 0xbc, 0x51, 0x58, 0x08, - 0x14, 0x0f, 0xcc, 0x3e, 0x6d, 0x91, 0x83, 0x4b, 0xd0, 0x27, 0xdb, 0x8d, - 0xd1, 0xde, 0x07, 0xff, 0x0c, 0xb3, 0x19, 0xaa, 0xff, 0x18, 0x86, 0xb8, - 0xff, 0xa8, 0x1d, 0xbc, 0x50, 0xcd, 0x90, 0x98, 0xc0, 0x5d, 0xa7, 0x1c, - 0x42, 0x71, 0xd9, 0xc6, 0x1d, 0xc8, 0x8e, 0xaa, 0x6b, 0x43, 0xa4, 0x11, - 0xf1, 0x4d, 0xad, 0x5e, 0xb7, 0xdd, 0x66, 0x25, 0x32, 0xe7, 0x92, 0x73, - 0x63, 0x3a, 0xee, 0xd6, 0xc5, 0xeb, 0xcd, 0xec, 0xd2, 0x01, 0x00, 0x46, - 0x8a, 0xa2, 0x2f, 0x78, 0x1b, 0xdb, 0x82, 0xe3, 0x4e, 0x8b, 0x87, 0x06, - 0x65, 0x84, 0xa5, 0x3c, 0x09, 0x32, 0x77, 0x6c, 0xf5, 0x4a, 0x28, 0xe9, - 0xea, 0xf7, 0xff, 0xb0, 0xb2, 0x5d, 0xae, 0x97, 0xfd, 0x48, 0x96, 0xa5, - 0x03, 0xa6, 0x23, 0x65, 0x30, 0xb7, 0x23, 0x72, 0x6d, 0x70, 0x15, 0x77, - 0x0d, 0xd6, 0x20, 0x82, 0xa6, 0xf6, 0xf5, 0xea, 0x84, 0x34, 0x88, 0x64, - 0xf9, 0x28, 0xb7, 0x4e, 0x13, 0x93, 0xf6, 0x2c, 0x33, 0x80, 0x8a, 0x79, - 0xe7, 0x3c, 0xaa, 0x35, 0x9e, 0xb5, 0xe1, 0x95, 0x17, 0x47, 0x17, 0x5c, - 0x6a, 0x08, 0x27, 0xa3, 0x04, 0x87, 0xb8, 0x02, 0x15, 0x3b, 0x62, 0x40, - 0x6e, 0x5f, 0x73, 0xfd, 0x20, 0x8f, 0x0c, 0x2c, 0x0d, 0x04, 0xf0, 0xe3, - 0xa6, 0xf4, 0xb1, 0x05, 0x4c, 0x99, 0xb2, 0xe8, 0x47, 0x2f, 0xa6, 0x67, - 0x16, 0x62, 0x6e, 0x47, 0x39, 0x96, 0x33, 0xee, 0x78, 0xcf, 0x80, 0x9b, - 0x9c, 0x43, 0x2d, 0x66, 0x0b, 0x15, 0x20, 0xfa, 0xf8, 0x3d, 0xb1, 0x33, - 0xb4, 0xcb, 0xe0, 0xf6, 0x64, 0x67, 0xab, 0x35, 0x74, 0x7d, 0x47, 0x5c, - 0xbc, 0x95, 0xdb, 0x5a, 0x42, 0x86, 0x8b, 0xb9, 0x8a, 0x8c, 0xe2, 0x16, - 0x85, 0xb6, 0xbc, 0x9b, 0x70, 0xbb, 0xa8, 0x3d, 0x97, 0xe9, 0xe0, 0xc5, - 0xdf, 0x9e, 0xb3, 0xa0, 0x04, 0x54, 0x48, 0x4e, 0x1c, 0x7b, 0x3f, 0xca, - 0x69, 0x4f, 0x71, 0xda, 0xc2, 0x45, 0xa2, 0x61, 0x7a, 0xef, 0x37, 0x95, - 0x6b, 0xf4, 0x4b, 0x4b, 0xf4, 0x7c, 0x44, 0x25, 0x4d, 0x30, 0xfe, 0xa2, - 0x1f, 0x34, 0x66, 0x64, 0xde, 0x29, 0xf2, 0x4f, 0x5a, 0x91, 0x7c, 0x2e, - 0x33, 0x80, 0x8a, 0x79, 0xe7, 0x3c, 0xaa, 0x35, 0x9e, 0xb5, 0xe1, 0x95, - 0x17, 0x47, 0x17, 0x5c, 0x6a, 0x08, 0x27, 0xa3, 0x32, 0x6d, 0x35, 0x5a, - 0x48, 0xff, 0x65, 0x61, 0x4d, 0x3a, 0xe1, 0xfb, 0x99, 0x69, 0xe2, 0xda, - 0x70, 0xcb, 0x7c, 0x33, 0xcf, 0x4e, 0xfe, 0x15, 0x12, 0x16, 0x65, 0x6d, - 0x25, 0x2a, 0xfc, 0xed, 0x4b, 0x10, 0xf5, 0x4d, 0x2c, 0x23, 0x38, 0x81, - 0xe3, 0x73, 0x87, 0x91, 0xe3, 0x11, 0x31, 0xe6, 0xaf, 0xfd, 0x2a, 0x19, - 0x2b, 0xea, 0x3e, 0x61, 0x88, 0xe7, 0x75, 0xf1, 0xc2, 0x62, 0xb3, 0x5c, - 0x05, 0x7f, 0x97, 0x93, 0x4c, 0x7a, 0xd4, 0x30, 0x82, 0xd0, 0xf8, 0xb2, - 0x3f, 0x5f, 0x50, 0x12, 0x2f, 0x35, 0xa5, 0x04, 0x3e, 0x89, 0x18, 0x2d, - 0x8b, 0x3d, 0x23, 0x52, 0x52, 0x1f, 0x69, 0xd2, 0x46, 0xe5, 0x16, 0x11, - 0x8c, 0x12, 0x5c, 0x67, 0x9f, 0xc9, 0x06, 0x18, 0xc8, 0xa6, 0xae, 0x2b, - 0x0c, 0xab, 0x36, 0x51, 0x3d, 0x90, 0xe1, 0x99, 0x6b, 0x61, 0x59, 0xd6, - 0xb0, 0x3b, 0xa7, 0x7d, 0x53, 0x55, 0x67, 0x7d, 0x85, 0x86, 0xfc, 0xba, - 0xea, 0xeb, 0x16, 0x82, 0x69, 0x80, 0x2e, 0xee, 0x61, 0xe1, 0xd5, 0xc5, - 0xe2, 0xb1, 0xc1, 0xbf, 0xaa, 0x72, 0x77, 0xe1, 0xea, 0xdc, 0x3a, 0xbe, - 0xa6, 0x01, 0x77, 0x05, 0x1c, 0xa4, 0xf7, 0xa1, 0xef, 0x9f, 0xf4, 0x27, - 0x2f, 0x2a, 0x62, 0x37, 0x89, 0xd3, 0xf5, 0x81, 0xf8, 0x50, 0x7e, 0x0f, - 0xe1, 0xc6, 0x6a, 0x5a, 0xc1, 0x24, 0x9a, 0x39, 0x8c, 0xd6, 0xcc, 0x36, - 0x75, 0x1f, 0x22, 0xfd, 0xd5, 0xa0, 0xd1, 0x3d, 0x0c, 0xf6, 0x8b, 0x42, - 0x22, 0xc6, 0x2a, 0xad, 0x9b, 0x89, 0x07, 0xaf, 0x4a, 0x25, 0xdb, 0xbb, - 0xf7, 0x13, 0x89, 0x8c, 0xda, 0x84, 0x78, 0x53, 0xbd, 0x1f, 0x20, 0x7c, - 0x41, 0x03, 0xa7, 0xfb, 0xc6, 0xba, 0x9a, 0x8c, 0x19, 0x41, 0x28, 0xee, - 0xde, 0x51, 0x3f, 0x52, 0xff, 0xa5, 0xca, 0x41, 0x8a, 0x7e, 0x1b, 0xe8, - 0x34, 0x8d, 0xc7, 0x02, 0xad, 0x44, 0x6f, 0xc2, 0xaf, 0x17, 0x82, 0xe7, - 0x87, 0xbb, 0x84, 0xf5, 0xd7, 0x0e, 0x00, 0xfa, 0xc1, 0x1a, 0x93, 0x19, - 0xcd, 0xe6, 0x3a, 0x51, 0xc5, 0x8a, 0x17, 0xcb, 0xf1, 0x39, 0x45, 0xe4, - 0x49, 0x78, 0x2e, 0xe6, 0xdb, 0xf6, 0xbc, 0xef, 0x6b, 0x4e, 0x43, 0x69, - 0x24, 0x63, 0xfa, 0x42, 0xe5, 0x9a, 0xd7, 0x49, 0x79, 0x80, 0x79, 0x1f, - 0x0d, 0xf0, 0xda, 0x01, 0xab, 0x4f, 0xe7, 0x7a, 0x85, 0x68, 0x67, 0x16, - 0x63, 0xb2, 0xef, 0xd3, 0xbd, 0xf3, 0x2a, 0x57, 0xae, 0x0a, 0x9d, 0x7d, - 0xd4, 0xbf, 0x42, 0x98, 0xba, 0xa0, 0x8d, 0x2b, 0xd7, 0xb1, 0x0e, 0x5e, - 0x04, 0x6c, 0xe9, 0x5b, 0x01, 0xfd, 0xef, 0x63, 0xdf, 0x3e, 0xf5, 0xfe, - 0x99, 0x69, 0xe2, 0xda, 0x70, 0xcb, 0x7c, 0x33, 0xcf, 0x4e, 0xfe, 0x15, - 0x12, 0x16, 0x65, 0x6d, 0x25, 0x2a, 0xfc, 0xed, 0xab, 0x07, 0x55, 0x8b, - 0x85, 0xba, 0xb9, 0x8b, 0x16, 0xd1, 0xd0, 0x08, 0x03, 0xc5, 0xda, 0xad, - 0x96, 0x15, 0x9e, 0x6f, 0x21, 0xca, 0x4b, 0x60, 0x5f, 0x25, 0x29, 0x4c, - 0x57, 0xe6, 0x79, 0x9a, 0x39, 0x78, 0xf7, 0x74, 0x0a, 0x03, 0xaf, 0xc6, - 0x5d, 0x70, 0xe1, 0x98, 0xbd, 0xe4, 0x72, 0x95, 0x5e, 0xa5, 0x7d, 0xd2, - 0x64, 0x46, 0xc4, 0x41, 0xa5, 0xc6, 0xff, 0x31, 0x5f, 0x49, 0x1d, 0xec, - 0xd5, 0xfa, 0x00, 0x3b, 0xf1, 0x05, 0x58, 0xc6, 0xc1, 0xdb, 0xf1, 0xf2, - 0x97, 0x1a, 0x9c, 0x8b, 0x32, 0x27, 0x54, 0x09, 0x42, 0x36, 0x45, 0xa8, - 0xfd, 0x79, 0x19, 0x21, 0x8e, 0x49, 0xb3, 0x01, 0xe2, 0xb3, 0xef, 0x5e, - 0x7f, 0xb5, 0x8c, 0xe3, 0xd3, 0x86, 0x02, 0xa4, 0x4d, 0x5d, 0x7a, 0x82, - 0xf6, 0xd1, 0x27, 0xfe, 0x2b, 0x6a, 0x0d, 0x9a, 0x7a, 0x14, 0xd7, 0x30, - 0x1e, 0x64, 0x9a, 0xe5, 0x11, 0x48, 0xef, 0x41, 0x3f, 0x08, 0x66, 0x4b, - 0x8e, 0xe9, 0x83, 0x9f, 0x4e, 0x97, 0xa7, 0xcb, 0xff, 0x11, 0x33, 0x5b, - 0x6b, 0x29, 0x89, 0x44, 0x69, 0x52, 0xfd, 0x26, 0x13, 0x70, 0x0c, 0x1c, - 0x30, 0x88, 0x02, 0x7e, 0xe6, 0x9d, 0x4d, 0xc1, 0xee, 0x47, 0xf9, 0x57, - 0xf5, 0xab, 0x6c, 0x13, 0x9e, 0x62, 0xcb, 0x82, 0x33, 0x81, 0x99, 0x2e, - 0x54, 0x3d, 0x15, 0x84, 0x83, 0x7b, 0x6e, 0xd3, 0x3f, 0xcb, 0x55, 0xf1, - 0xa3, 0xdd, 0xa1, 0xa5, 0x1a, 0x22, 0xa1, 0x10, 0xc4, 0x97, 0xe2, 0x1d, - 0x28, 0x53, 0x00, 0x47, 0xd5, 0x51, 0x08, 0x5e, 0xde, 0xe8, 0x30, 0x79, - 0xaa, 0x36, 0x9d, 0x25, 0x46, 0x74, 0xdf, 0xa8, 0xff, 0x02, 0x6d, 0x71, - 0x45, 0xa6, 0xe4, 0x98, 0xc5, 0xd9, 0xf5, 0xc3, 0x1f, 0xf5, 0x2f, 0xf1, - 0xf7, 0x8d, 0xb2, 0x67, 0xa7, 0x38, 0x93, 0x08, 0x37, 0x15, 0xf4, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, - 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x9c, 0xe4, 0x08, 0xb6, 0x7a, 0xcc, 0x50, 0x11, 0x5c, 0x6d, 0xac, 0x19, - 0xda, 0x16, 0xe3, 0x74, 0xfc, 0xb5, 0x86, 0x19, 0xe3, 0x09, 0x4c, 0xb3, - 0xee, 0xc2, 0x4c, 0xe4, 0xca, 0x5a, 0x89, 0xba, 0xd7, 0x52, 0xf6, 0xda, - 0x51, 0x5f, 0xa4, 0x8d, 0xf6, 0xad, 0x4a, 0x39, 0x97, 0x96, 0x41, 0x40, - 0x35, 0x6d, 0x1a, 0xd8, 0x43, 0x5f, 0x24, 0x42, 0x57, 0x7f, 0x18, 0x9a, - 0x49, 0xea, 0xe8, 0x07, 0xf2, 0x68, 0x4d, 0x9b, 0x8f, 0xe2, 0xfe, 0x98, - 0xe6, 0x0a, 0x5d, 0xe7, 0x56, 0x59, 0xb6, 0xa9, 0x61, 0x1a, 0x94, 0xcb, - 0x8e, 0xc2, 0x05, 0xed, 0x3e, 0xbd, 0xb2, 0x1a, 0x86, 0xe0, 0xb5, 0x6d, - 0x1c, 0x64, 0x1a, 0x85, 0x1a, 0x8f, 0x95, 0xd5, 0x9c, 0x16, 0xf3, 0x06, - 0x9e, 0x9d, 0x27, 0x59, 0x68, 0x5d, 0x74, 0x5e, 0x1f, 0x49, 0xaa, 0x6c, - 0xdc, 0x0f, 0xc6, 0x6e, 0x26, 0xf9, 0x92, 0x18, 0x62, 0xdc, 0xc6, 0xca, - 0x20, 0xce, 0xee, 0x94, 0x19, 0x96, 0xd3, 0x93, 0x3b, 0xfb, 0x63, 0x31, - 0x6e, 0xa9, 0x81, 0x31, 0xb2, 0x2c, 0x04, 0xfb, 0xf7, 0x63, 0xf8, 0xb0, - 0x04, 0xcb, 0x80, 0x7c, 0x3e, 0xd2, 0x6b, 0x88, 0x32, 0x13, 0xbc, 0xd6, - 0x78, 0xfd, 0x37, 0x93, 0x82, 0x01, 0x5b, 0xe9, 0x4f, 0x7c, 0x8d, 0x63, - 0x50, 0xf2, 0xb0, 0xa6, 0x68, 0xa4, 0xb0, 0x10, 0xd6, 0x43, 0xeb, 0x4f, - 0x82, 0x3c, 0x9f, 0xc0, 0xc2, 0x2f, 0x79, 0xc8, 0xaa, 0xe9, 0x94, 0x15, - 0xce, 0xb2, 0x03, 0x4a, 0x11, 0x7d, 0x9a, 0x9f, 0x38, 0xb3, 0x95, 0x75, - 0x19, 0xbd, 0xef, 0xef, 0x1e, 0x3a, 0x48, 0xa9, 0x54, 0xfa, 0x59, 0x6c, - 0x55, 0x8a, 0x7b, 0x4b, 0xfe, 0xbd, 0xf8, 0x4a, 0x41, 0x88, 0x6a, 0xc9, - 0x64, 0xdc, 0x39, 0x34, 0x55, 0x73, 0x61, 0x09, 0xea, 0x07, 0x7a, 0x20, - 0xe2, 0x0e, 0xa0, 0x11, 0xf0, 0x9b, 0x6e, 0xa1, 0x76, 0x1d, 0x7e, 0x27, - 0x7a, 0x43, 0xa6, 0x5b, 0x6c, 0xd2, 0x6e, 0x89, 0x27, 0x4b, 0x97, 0x39, - 0xbb, 0xf6, 0xea, 0x79, 0xcb, 0x7b, 0xae, 0x9f, 0x2c, 0xb1, 0x3b, 0xe0, - 0xd3, 0xba, 0xef, 0x38, 0x92, 0x41, 0x0d, 0xcf, 0x57, 0xaa, 0xab, 0xcb, - 0xa1, 0x2f, 0xc8, 0xb8, 0xf0, 0x99, 0x6e, 0xa3, 0x76, 0x1d, 0x7e, 0x27, - 0x7a, 0x43, 0xa6, 0x5b, 0x6c, 0xd2, 0x6e, 0x89, 0x61, 0xfd, 0x76, 0xf1, - 0x4f, 0xf7, 0xb6, 0xc2, 0xa2, 0x44, 0x5b, 0xd4, 0xeb, 0x9c, 0x23, 0xbe, - 0x92, 0x0a, 0xf7, 0x60, 0xe1, 0xe7, 0x18, 0xad, 0x83, 0xae, 0x86, 0xc8, - 0xf4, 0x45, 0xe3, 0xf3, 0x15, 0x75, 0xbe, 0xaa, 0x6e, 0x95, 0xc7, 0xdf, - 0xf8, 0x47, 0x48, 0xd1, 0xe3, 0x7b, 0xc1, 0x0e, 0xf6, 0xfb, 0x1f, 0xf0, - 0x4f, 0xf7, 0xb6, 0xc2, 0xa2, 0x44, 0x5b, 0xd4, 0xeb, 0x9c, 0x23, 0xbe, - 0x94, 0x7a, 0xbe, 0x4b, 0xd4, 0x25, 0x5f, 0xb2, 0xe4, 0xc5, 0x9d, 0x5b, - 0xea, 0x6a, 0xf9, 0x3d, 0xbd, 0xbd, 0xa2, 0xe2, 0x58, 0xba, 0x58, 0xb5, - 0xa5, 0xd6, 0x1f, 0xa7, 0x86, 0x38, 0xc4, 0x00, 0xd5, 0xcf, 0x40, 0x1c, - 0x7f, 0x1c, 0x2d, 0x61, 0xe5, 0x06, 0xc4, 0x2c, 0x02, 0x55, 0xb1, 0x1f, - 0x7f, 0xdc, 0x39, 0x34, 0x52, 0x73, 0x61, 0x09, 0xea, 0x07, 0x7a, 0x22, - 0xe2, 0x0c, 0xa0, 0x11, 0xf0, 0x9b, 0x6e, 0xa1, 0x76, 0x1d, 0x7e, 0x27, - 0x7a, 0x43, 0xa6, 0x5b, 0x6c, 0xd2, 0x6e, 0x89, 0x37, 0x21, 0xa5, 0x8b, - 0x83, 0x2c, 0x7f, 0x5c, 0x7a, 0xd1, 0x4f, 0xc1, 0x3e, 0x6d, 0x64, 0xf1, - 0x46, 0xe3, 0xa6, 0x7a, 0x65, 0xde, 0x36, 0x49, 0xbb, 0x62, 0x45, 0xe1, - 0x50, 0xde, 0x11, 0x2d, 0xdc, 0x16, 0x20, 0xc7, 0xc7, 0x0d, 0xbc, 0xaa, - 0x37, 0x5f, 0x6d, 0x80, 0x33, 0xc7, 0xe2, 0x0d, 0x82, 0xee, 0x2f, 0xf6, - 0x4f, 0x10, 0xbc, 0x65, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x03, 0x9f, 0x4d, 0x9d, 0xa8, 0x2a, 0xc4, 0x85, 0x25, 0x9e, 0x77, 0x32, - 0x0e, 0x72, 0x81, 0x43, 0x1a, 0xf0, 0x2a, 0xf4, 0x09, 0x0f, 0xb9, 0x67, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0x1a, 0xf0, 0x2a, 0xf4, - 0x2f, 0x0f, 0xb9, 0x67, 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, - 0x5d, 0x60, 0x8c, 0x6d, 0xbf, 0x40, 0x4c, 0x67, 0x15, 0x62, 0x0b, 0xa4, - 0xae, 0x41, 0x85, 0x8b, 0xba, 0xb5, 0x04, 0x53, 0x92, 0xdf, 0x77, 0x84, - 0x90, 0xec, 0x95, 0x0a, 0x30, 0x67, 0xfc, 0x2c, 0x6b, 0xd6, 0x92, 0x7f, - 0x03, 0x98, 0xe8, 0x64, 0xc1, 0x9c, 0x0a, 0x9d, 0x7c, 0x6f, 0x5b, 0x30, - 0x2b, 0x9d, 0xf5, 0xfc, 0x17, 0x57, 0x5b, 0xbb, 0x04, 0x8a, 0xdb, 0x72, - 0x50, 0x2e, 0x01, 0xa0, 0x2f, 0x0a, 0x78, 0x01, 0xad, 0xcb, 0xe9, 0xab, - 0x8e, 0xcd, 0x63, 0x0c, 0x9b, 0x4f, 0x91, 0x90, 0xdf, 0x14, 0x9d, 0x53, - 0xd2, 0x2c, 0x2d, 0x97, 0xfe, 0xb2, 0x2d, 0x6d, 0xbf, 0x08, 0x36, 0xf4, - 0x98, 0xbe, 0x81, 0x42, 0x5c, 0xb0, 0xbc, 0x96, 0x45, 0x4a, 0x1b, 0xc2, - 0xca, 0x22, 0x34, 0x43, 0x1a, 0xf0, 0x2a, 0xf4, 0x2f, 0x0f, 0xb8, 0x58, - 0x7b, 0xba, 0x98, 0x08, 0xd7, 0x97, 0xff, 0xce, 0xf5, 0x5c, 0xd9, 0x70, - 0x48, 0x5d, 0x08, 0x80, 0x1a, 0xfb, 0x3d, 0xba, 0x69, 0xe9, 0xc4, 0x30, - 0xab, 0x84, 0xcd, 0xb6, 0x4b, 0xee, 0x2d, 0x92, 0xcc, 0x61, 0xe6, 0xec, - 0xb7, 0x29, 0xa0, 0xba, 0xce, 0x67, 0xfb, 0x5f, 0x38, 0x54, 0xc4, 0xc5, - 0xed, 0xd7, 0x6c, 0x42, 0x55, 0xda, 0xe2, 0x79, 0xb1, 0xb0, 0x26, 0x66, - 0x1a, 0xd6, 0x8e, 0xc2, 0xdc, 0x52, 0xef, 0xe3, 0x04, 0x14, 0x79, 0xc0, - 0x00, 0x70, 0x0b, 0x00, 0x06, 0x01, 0x00, 0x5f, 0x72, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x5f, 0x32, 0x30, 0x32, 0x30, 0x30, 0x38, 0x32, - 0x31, 0x30, 0x33, 0x30, 0x31, 0x31, 0x37, 0x00, 0xfc, 0xcf, 0x03, 0x00, - 0x00, 0xdc, 0x03, 0x02, 0x06, 0x01, 0x00, 0x5f, 0x72, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x5f, 0x32, 0x30, 0x32, 0x30, 0x30, 0x38, 0x32, - 0x31, 0x30, 0x33, 0x30, 0x31, 0x31, 0x37, 0x00, 0xcc, 0xc4, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7622_rom_patch_e2.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7622_rom_patch_e2.h deleted file mode 100644 index 608f909be1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mcu/mt7622_rom_patch_e2.h +++ /dev/null @@ -1,6848 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR mt7622_rom_patch_e2[] = { - 0x32, 0x30, 0x32, 0x30, 0x30, 0x38, 0x32, 0x31, 0x30, 0x32, 0x35, 0x39, - 0x31, 0x30, 0x61, 0x0a, 0x41, 0x4c, 0x50, 0x53, 0x8a, 0x10, 0x8a, 0x10, - 0x00, 0x00, 0x00, 0x10, 0x88, 0x95, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, - 0x00, 0x00, 0x44, 0x43, 0x00, 0x00, 0xf0, 0xaa, 0x02, 0x00, 0x34, 0x88, - 0x02, 0x00, 0xbc, 0xc3, 0x00, 0x00, 0x7c, 0x58, 0x05, 0x00, 0x88, 0x16, - 0x08, 0x00, 0xd8, 0xc1, 0x07, 0x00, 0x8c, 0x4b, 0x07, 0x00, 0xbc, 0x3e, - 0x08, 0x00, 0xbc, 0xd6, 0x07, 0x00, 0x84, 0x34, 0x08, 0x00, 0x1c, 0xbf, - 0x05, 0x00, 0x68, 0x2a, 0x08, 0x00, 0xe4, 0xf5, 0x07, 0x00, 0x98, 0x17, - 0x05, 0x00, 0xb0, 0xc9, 0x06, 0x00, 0x44, 0x13, 0x08, 0x00, 0xbc, 0xc3, - 0x04, 0x00, 0xe8, 0x01, 0x05, 0x00, 0x94, 0xad, 0x07, 0x00, 0x58, 0xde, - 0x05, 0x00, 0x80, 0xa8, 0x07, 0x00, 0x24, 0x63, 0x06, 0x00, 0x1c, 0x7b, - 0x07, 0x00, 0x70, 0xf4, 0x04, 0x00, 0xfc, 0x82, 0x06, 0x00, 0x28, 0xfa, - 0x05, 0x00, 0x24, 0xb2, 0x07, 0x00, 0x78, 0x3b, 0x06, 0x00, 0x58, 0xb9, - 0x06, 0x00, 0xf4, 0xa4, 0x07, 0x00, 0x2c, 0x70, 0x08, 0x00, 0x34, 0x50, - 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0xcc, 0x92, 0x08, 0x00, 0x38, 0x68, - 0x08, 0x00, 0xa4, 0x6a, 0x07, 0x00, 0xb4, 0x33, 0x06, 0x00, 0x08, 0x36, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xd1, 0x09, 0x00, 0x98, 0xcd, - 0x09, 0x00, 0x60, 0xcd, 0x09, 0x00, 0x88, 0xc7, 0x09, 0x00, 0x3c, 0x2d, - 0x0a, 0x00, 0xbc, 0x80, 0x0a, 0x00, 0xd8, 0x6b, 0x0a, 0x00, 0x14, 0xcc, - 0x0a, 0x00, 0xa8, 0x80, 0x0a, 0x00, 0xd0, 0x80, 0x0a, 0x00, 0xc0, 0x99, - 0x0a, 0x00, 0x0c, 0x53, 0x0a, 0x00, 0xe4, 0x8a, 0x0a, 0x00, 0x8c, 0x83, - 0x0a, 0x00, 0xb4, 0x18, 0x0a, 0x00, 0xac, 0xc3, 0x0a, 0x00, 0xd4, 0xd9, - 0x09, 0x00, 0x20, 0x49, 0x0a, 0x00, 0x0c, 0x67, 0x0a, 0x00, 0x7c, 0x15, - 0x0a, 0x00, 0xe0, 0x32, 0x0a, 0x00, 0xdc, 0x19, 0x0a, 0x00, 0xf8, 0x6e, - 0x0a, 0x00, 0xc8, 0x20, 0x0a, 0x00, 0x94, 0x45, 0x0a, 0x00, 0xc0, 0xc3, - 0x0a, 0x00, 0x58, 0x70, 0x0a, 0x00, 0x68, 0x15, 0x0a, 0x00, 0x10, 0x27, - 0x0a, 0x00, 0x6c, 0xf3, 0x09, 0x00, 0x08, 0xe2, 0x09, 0x00, 0x08, 0x7f, - 0x0a, 0x00, 0x74, 0x25, 0x0a, 0x00, 0x0c, 0x7d, 0x0a, 0x00, 0x88, 0x02, - 0x0a, 0x00, 0xec, 0xf2, 0x09, 0x00, 0xe4, 0xe3, 0x0a, 0x00, 0x24, 0x4c, - 0x0a, 0x00, 0xfc, 0x2c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x0d, - 0x24, 0x00, 0x46, 0x10, 0x00, 0xb0, 0x58, 0x10, 0x80, 0x10, 0x3e, 0x2d, - 0x24, 0x90, 0xd5, 0x03, 0xa2, 0xc9, 0xaa, 0xc1, 0xe2, 0x02, 0xe9, 0xfd, - 0xdd, 0x9e, 0x3e, 0x0d, 0x24, 0x90, 0x3e, 0x2d, 0x2a, 0xa0, 0x84, 0x20, - 0xd5, 0x02, 0xaa, 0x41, 0xe2, 0x02, 0xe9, 0xfe, 0xdd, 0x9e, 0x3c, 0x1d, - 0x49, 0x08, 0x46, 0x00, 0x20, 0x00, 0x8c, 0x28, 0x58, 0x00, 0x00, 0x20, - 0xb4, 0x41, 0xb6, 0x40, 0x04, 0x30, 0x80, 0x40, 0xa2, 0x89, 0x9a, 0x9a, - 0x92, 0x41, 0x46, 0x30, 0x20, 0x00, 0xa8, 0x81, 0x58, 0x51, 0x82, 0x20, - 0x8c, 0x08, 0xd8, 0xf3, 0x3c, 0x2d, 0x49, 0x08, 0x80, 0x23, 0xb4, 0x62, - 0xb6, 0x61, 0x80, 0x01, 0xa0, 0x91, 0xa8, 0x81, 0xdd, 0x9e, 0xef, 0xf8, - 0x46, 0x18, 0x00, 0xa0, 0x96, 0x03, 0xa8, 0x09, 0x46, 0x08, 0x00, 0xa0, - 0xa0, 0x42, 0xf1, 0x81, 0xf1, 0x01, 0x54, 0x10, 0x80, 0x02, 0xc9, 0xfb, - 0xec, 0x08, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x80, 0xe0, 0x90, 0x10, 0x49, 0xff, 0xff, 0xeb, 0x96, 0x3b, 0x49, 0xff, - 0xff, 0xe8, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xfc, 0x84, 0xc0, 0x81, 0x00, 0x50, 0x90, 0xff, 0xfe, - 0xd5, 0x0e, 0x38, 0x04, 0x18, 0x00, 0x84, 0x2a, 0x4c, 0x00, 0xc0, 0x05, - 0x84, 0x0d, 0x49, 0xff, 0xff, 0xe4, 0x38, 0x04, 0x18, 0x00, 0x9d, 0xb1, - 0x49, 0xff, 0xff, 0xdf, 0xe2, 0xc9, 0xe9, 0xf2, 0xec, 0x04, 0x3a, 0x6f, - 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0xef, 0xf8, 0x3c, 0x2d, 0x3a, 0xf7, - 0x44, 0x01, 0xc2, 0x00, 0x40, 0x21, 0x00, 0x16, 0x46, 0x18, 0x00, 0x00, - 0x04, 0x30, 0x80, 0x42, 0x46, 0x08, 0x00, 0xa0, 0x58, 0x31, 0x80, 0x80, - 0x14, 0x30, 0x80, 0x42, 0xa0, 0xc3, 0x44, 0x4f, 0xff, 0xcf, 0xf3, 0x81, - 0x80, 0x20, 0xf3, 0x01, 0x40, 0x31, 0x90, 0x02, 0xf3, 0x81, 0xf3, 0x01, - 0xa8, 0xc3, 0xa8, 0x8c, 0xec, 0x08, 0xdd, 0x9e, 0x92, 0x00, 0x54, 0x10, - 0x80, 0x0c, 0x92, 0x22, 0x96, 0x00, 0x96, 0x90, 0xc1, 0x66, 0x40, 0x30, - 0x1c, 0x09, 0x44, 0x00, 0x00, 0x22, 0x4c, 0x20, 0x00, 0x11, 0x5c, 0xf1, - 0x00, 0x23, 0xe8, 0x05, 0x44, 0x50, 0x00, 0x11, 0xda, 0x5a, 0xd5, 0x07, - 0x44, 0x50, 0x00, 0x33, 0xd2, 0x08, 0x95, 0x41, 0xda, 0x54, 0xd5, 0x07, - 0x84, 0x00, 0xd5, 0x3f, 0x84, 0x00, 0xd5, 0x29, 0x84, 0x00, 0xd5, 0x13, - 0x84, 0x42, 0x4c, 0x11, 0x40, 0x04, 0x84, 0x03, 0xd5, 0x09, 0x84, 0xa3, - 0xd9, 0x03, 0x84, 0x02, 0xd5, 0x05, 0x56, 0x00, 0x80, 0x01, 0x5c, 0x00, - 0x00, 0x01, 0xcb, 0x05, 0x44, 0x21, 0x20, 0x00, 0x40, 0x00, 0x08, 0x04, - 0x84, 0x42, 0x4c, 0x11, 0x40, 0x05, 0x58, 0x00, 0x00, 0x0c, 0xd5, 0x0a, - 0x84, 0xa3, 0xd9, 0x04, 0x58, 0x00, 0x00, 0x08, 0xd5, 0x05, 0x84, 0xa1, - 0xd9, 0x03, 0x58, 0x00, 0x00, 0x04, 0xcb, 0x05, 0x44, 0x20, 0xc0, 0x00, - 0x40, 0x00, 0x08, 0x04, 0x84, 0x42, 0x4c, 0x11, 0x40, 0x05, 0x58, 0x00, - 0x02, 0x40, 0xd5, 0x0a, 0x84, 0xa3, 0xd9, 0x04, 0x58, 0x00, 0x02, 0x00, - 0xd5, 0x05, 0x84, 0xa1, 0xd9, 0x03, 0x58, 0x00, 0x00, 0x40, 0xcb, 0x05, - 0x44, 0x22, 0x10, 0x00, 0x40, 0x00, 0x08, 0x04, 0x84, 0x42, 0x4c, 0x11, - 0x40, 0x05, 0x58, 0x00, 0x01, 0x20, 0xd5, 0x0a, 0x84, 0xa3, 0xd9, 0x04, - 0x58, 0x00, 0x00, 0x20, 0xd5, 0x05, 0x84, 0xa1, 0xd9, 0x03, 0x58, 0x00, - 0x01, 0x00, 0x58, 0x00, 0x00, 0x90, 0xd5, 0x02, 0x84, 0x00, 0xdd, 0x9e, - 0x92, 0x00, 0x44, 0x40, 0x00, 0x22, 0x54, 0x00, 0x00, 0x0c, 0x96, 0x90, - 0x92, 0x02, 0x42, 0x10, 0x9c, 0x0b, 0x4c, 0x22, 0x00, 0x4e, 0x5c, 0xf1, - 0x00, 0x23, 0xe8, 0x06, 0x44, 0x50, 0x00, 0x11, 0x4c, 0x22, 0xc0, 0x87, - 0xd5, 0x68, 0x44, 0x50, 0x00, 0x33, 0xd2, 0x23, 0x95, 0x61, 0x4c, 0x22, - 0xc0, 0x80, 0x9e, 0x82, 0x96, 0x90, 0xe6, 0x42, 0xe8, 0x06, 0x9c, 0x9c, - 0xb4, 0x82, 0x58, 0x42, 0x21, 0x00, 0xb6, 0x82, 0x9e, 0x81, 0x96, 0x90, - 0xe6, 0x42, 0xe8, 0x06, 0x9c, 0x9c, 0xb4, 0x82, 0x58, 0x42, 0x00, 0x20, - 0xb6, 0x82, 0xc9, 0x0d, 0x50, 0x41, 0x80, 0x10, 0xb4, 0xa4, 0x50, 0x21, - 0x80, 0x14, 0x58, 0x52, 0x9f, 0x00, 0xb6, 0xa4, 0xb4, 0x82, 0x58, 0x42, - 0x00, 0x1e, 0xb6, 0x82, 0x9e, 0x82, 0x96, 0x90, 0xe6, 0x42, 0xe8, 0x08, - 0x9c, 0x9c, 0xb4, 0x82, 0x46, 0x51, 0xd0, 0x00, 0x40, 0x42, 0x14, 0x04, - 0xb6, 0x82, 0x9e, 0x81, 0x96, 0x90, 0xe6, 0x42, 0xe8, 0x08, 0x9c, 0x9c, - 0xb4, 0x82, 0x46, 0x50, 0x01, 0xc0, 0x40, 0x42, 0x14, 0x04, 0xb6, 0x82, - 0xc9, 0x09, 0x50, 0x21, 0x80, 0x10, 0xb4, 0x82, 0x46, 0x51, 0xb1, 0xa0, - 0x40, 0x42, 0x14, 0x04, 0xb6, 0x82, 0x9e, 0x82, 0x96, 0x90, 0xe6, 0x42, - 0xe8, 0x07, 0x50, 0x21, 0x80, 0x0c, 0xb4, 0x82, 0x58, 0x42, 0x19, 0x00, - 0xb6, 0x82, 0x9e, 0x81, 0x96, 0x90, 0xe6, 0x42, 0xe8, 0x09, 0x50, 0x21, - 0x80, 0x08, 0xb4, 0x82, 0x46, 0x50, 0x01, 0x80, 0x40, 0x42, 0x14, 0x04, - 0xb6, 0x82, 0xc9, 0x0d, 0x50, 0x21, 0x80, 0x14, 0xb4, 0x82, 0x50, 0x11, - 0x80, 0x10, 0x58, 0x42, 0x17, 0x00, 0xb6, 0x82, 0xb4, 0x41, 0x58, 0x21, - 0x00, 0x16, 0xb6, 0x41, 0x9e, 0x42, 0x96, 0x48, 0xe6, 0x22, 0xe8, 0x07, - 0x50, 0x11, 0x80, 0x08, 0xb4, 0x41, 0x58, 0x21, 0x15, 0x00, 0xb6, 0x41, - 0x9e, 0x01, 0x96, 0x00, 0xe6, 0x02, 0xe8, 0x07, 0x50, 0x01, 0x80, 0x0c, - 0xb4, 0x20, 0x58, 0x10, 0x80, 0x14, 0xb6, 0x20, 0x8c, 0x68, 0xb4, 0x03, - 0x46, 0x11, 0x20, 0x00, 0x58, 0x10, 0x80, 0x13, 0x40, 0x00, 0x04, 0x04, - 0xb6, 0x03, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xd4, - 0x50, 0x7f, 0x80, 0x04, 0x97, 0x80, 0x54, 0x90, 0x80, 0xff, 0x54, 0x81, - 0x00, 0xff, 0x80, 0x07, 0x84, 0x20, 0x44, 0x20, 0x00, 0x24, 0x49, 0xfb, - 0xc4, 0xfa, 0x54, 0x03, 0x00, 0x0c, 0xc0, 0x07, 0x80, 0x06, 0x80, 0x29, - 0x80, 0x48, 0x80, 0x67, 0x49, 0xff, 0xff, 0x51, 0x50, 0x0f, 0x80, 0x04, - 0xa0, 0x81, 0x46, 0x18, 0x10, 0x60, 0x14, 0x20, 0x80, 0x32, 0xa0, 0x82, - 0x14, 0x20, 0x80, 0x33, 0xa0, 0x83, 0x14, 0x20, 0x80, 0x34, 0xa0, 0x84, - 0x14, 0x20, 0x80, 0x35, 0xa0, 0x85, 0x14, 0x20, 0x80, 0x36, 0xa0, 0x86, - 0x14, 0x20, 0x80, 0x37, 0xa0, 0x87, 0x14, 0x20, 0x80, 0x38, 0x04, 0x00, - 0x00, 0x08, 0x14, 0x00, 0x80, 0x39, 0xec, 0x2c, 0x3a, 0x6f, 0xa4, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x97, 0x80, 0x3c, 0x6f, 0x36, 0xd3, - 0x3c, 0x3d, 0x29, 0xce, 0x80, 0x06, 0x54, 0x80, 0x80, 0xff, 0x97, 0xd0, - 0xdd, 0x23, 0x3c, 0x1d, 0x29, 0xcf, 0x80, 0x06, 0xdd, 0x21, 0x80, 0x47, - 0x80, 0x06, 0x80, 0x28, 0x49, 0xff, 0xff, 0xb3, 0x3c, 0x1d, 0x29, 0xd3, - 0x80, 0x06, 0xdd, 0x21, 0x3c, 0x1d, 0x29, 0xd2, 0x80, 0x06, 0xdd, 0x21, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x96, 0x40, 0x96, 0x8c, 0x44, 0x42, - 0xa0, 0x10, 0x54, 0x30, 0x80, 0x02, 0x40, 0x01, 0x08, 0x1a, 0x40, 0x02, - 0x08, 0x1b, 0xc3, 0x05, 0x44, 0x21, 0x50, 0x80, 0x40, 0x00, 0x08, 0x04, - 0x54, 0x20, 0x80, 0x04, 0xc2, 0x03, 0x58, 0x00, 0x01, 0x45, 0x54, 0x20, - 0x80, 0x08, 0xc2, 0x03, 0x58, 0x00, 0x02, 0x2a, 0x54, 0x20, 0x80, 0x10, - 0xc2, 0x05, 0x46, 0x2f, 0xff, 0x00, 0x40, 0x00, 0x08, 0x04, 0x54, 0x10, - 0x80, 0x20, 0xc1, 0x05, 0x46, 0x10, 0x3f, 0xc0, 0x40, 0x00, 0x04, 0x04, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x2e, 0x14, 0xdb, 0x4c, 0x97, 0x80, - 0x44, 0x50, 0x00, 0xff, 0xd1, 0x16, 0x3e, 0x64, 0xa7, 0xf8, 0x80, 0x06, - 0x84, 0x20, 0x49, 0xff, 0xff, 0xcc, 0x46, 0x18, 0x10, 0x60, 0x54, 0x63, - 0x00, 0x40, 0x14, 0x00, 0x80, 0x98, 0xc6, 0x09, 0x46, 0x08, 0x10, 0x60, - 0x04, 0x10, 0x00, 0x99, 0x42, 0x10, 0xc0, 0x08, 0x14, 0x10, 0x00, 0x99, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x2e, 0x24, - 0xa7, 0xf5, 0x40, 0x60, 0x20, 0x09, 0x96, 0x00, 0x97, 0xb0, 0x4c, 0x20, - 0x00, 0x0c, 0x3e, 0x04, 0xa7, 0xf5, 0x3c, 0x5d, 0x36, 0xd3, 0xd0, 0x06, - 0x2e, 0x24, 0xa7, 0xf9, 0x80, 0x26, 0x49, 0xff, 0xff, 0x86, 0x2e, 0x14, - 0xa7, 0xf9, 0x3e, 0x64, 0xa7, 0xf8, 0x80, 0x06, 0x49, 0xff, 0xff, 0xc7, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x84, 0xa2, - 0x80, 0x41, 0xd8, 0x60, 0x84, 0x01, 0x4c, 0x10, 0x40, 0x3b, 0x2e, 0x54, - 0xeb, 0xc0, 0xd1, 0x37, 0x46, 0x18, 0x10, 0x20, 0x58, 0x10, 0x80, 0x04, - 0xb4, 0x01, 0x58, 0x00, 0x00, 0x20, 0xb6, 0x01, 0x84, 0x0a, 0xb4, 0x41, - 0x58, 0x21, 0x00, 0x10, 0xb6, 0x41, 0xb4, 0x41, 0x58, 0x21, 0x00, 0x01, - 0xb6, 0x41, 0x49, 0xfb, 0x22, 0x72, 0x46, 0x18, 0x10, 0x21, 0x58, 0x10, - 0x81, 0x04, 0xb4, 0x41, 0x84, 0x08, 0x42, 0x21, 0x48, 0x08, 0xb6, 0x41, - 0xb4, 0x41, 0x42, 0x21, 0x4c, 0x08, 0xb6, 0x41, 0x49, 0xfb, 0x25, 0x43, - 0x46, 0x18, 0x10, 0x08, 0x58, 0x10, 0x80, 0x14, 0xb4, 0x41, 0x84, 0x0a, - 0x58, 0x21, 0x00, 0x02, 0xb6, 0x41, 0xb4, 0x41, 0x58, 0x21, 0x00, 0x08, - 0xb6, 0x41, 0xb4, 0x41, 0x58, 0x21, 0x00, 0x20, 0xb6, 0x41, 0x49, 0xfb, - 0x22, 0x50, 0xd5, 0x26, 0x46, 0x08, 0x10, 0x20, 0x58, 0x00, 0x00, 0x04, - 0xb4, 0x20, 0x58, 0x10, 0x80, 0x20, 0xb6, 0x20, 0xb4, 0x20, 0x42, 0x10, - 0x90, 0x09, 0xb6, 0x20, 0xca, 0x0d, 0x46, 0x08, 0x10, 0x21, 0x58, 0x00, - 0x01, 0x04, 0xb4, 0x20, 0x42, 0x10, 0xc8, 0x09, 0xb6, 0x20, 0xb4, 0x20, - 0x42, 0x10, 0xcc, 0x09, 0xb6, 0x20, 0x2e, 0x04, 0xec, 0x09, 0xc8, 0x0a, - 0x46, 0x08, 0x10, 0x20, 0xa0, 0x41, 0x58, 0x10, 0xa0, 0x00, 0xa8, 0x41, - 0xd5, 0x03, 0x49, 0xfb, 0x2e, 0x66, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xe4, 0x2e, 0x64, 0xe9, 0xfc, - 0x96, 0xd8, 0x97, 0x68, 0xf1, 0x84, 0xf2, 0x81, 0xf3, 0x82, 0x97, 0xe0, - 0xf5, 0x85, 0x83, 0x80, 0xc6, 0x02, 0xd5, 0x0f, 0xf1, 0x01, 0xc9, 0x10, - 0xc8, 0x0f, 0x44, 0x10, 0x00, 0x20, 0x44, 0x20, 0x00, 0x12, 0x46, 0x30, - 0x00, 0xaf, 0x58, 0x31, 0x88, 0x3c, 0x84, 0x83, 0x49, 0xfb, 0x4b, 0x27, - 0x84, 0x03, 0x48, 0x00, 0x01, 0x31, 0x3c, 0x6d, 0x3b, 0x35, 0x84, 0x01, - 0x4c, 0x60, 0x40, 0x1a, 0x44, 0x10, 0x00, 0xf6, 0x4c, 0x70, 0x80, 0x1e, - 0x80, 0x07, 0x44, 0x12, 0x00, 0x00, 0x49, 0xfb, 0x7c, 0xd4, 0x84, 0x00, - 0x44, 0x10, 0x00, 0x20, 0x44, 0x20, 0x00, 0x12, 0x46, 0x30, 0x00, 0xaf, - 0x58, 0x31, 0x88, 0x3c, 0x80, 0x86, 0x49, 0xfb, 0x4b, 0x0a, 0x80, 0x06, - 0x48, 0x00, 0x01, 0x14, 0x84, 0x06, 0x4c, 0x60, 0x40, 0x07, 0x44, 0x10, - 0x00, 0xf6, 0x4c, 0x70, 0x80, 0x03, 0xd5, 0x07, 0x3e, 0x6c, 0xe9, 0xd4, - 0x00, 0x93, 0x00, 0x06, 0x4e, 0x92, 0x00, 0x16, 0x80, 0x07, 0x44, 0x12, - 0x00, 0x00, 0x49, 0xfb, 0x7c, 0xb2, 0x84, 0x00, 0x44, 0x10, 0x00, 0x20, - 0x44, 0x20, 0x00, 0x12, 0x46, 0x30, 0x00, 0xaf, 0x58, 0x31, 0x88, 0x3c, - 0x84, 0x81, 0x49, 0xfb, 0x4a, 0xe8, 0x84, 0x01, 0x48, 0x00, 0x00, 0xf2, - 0xf0, 0x04, 0xf1, 0x02, 0x96, 0x01, 0x50, 0x80, 0x00, 0x02, 0x89, 0x01, - 0xf0, 0x83, 0x40, 0x14, 0x00, 0x13, 0x80, 0x06, 0x49, 0xfb, 0x79, 0x61, - 0x81, 0x00, 0xc8, 0x15, 0x80, 0x07, 0x44, 0x11, 0x00, 0x00, 0x49, 0xfb, - 0x7c, 0x90, 0x80, 0x08, 0x44, 0x10, 0x00, 0x20, 0x44, 0x20, 0x00, 0x12, - 0x46, 0x30, 0x00, 0xaf, 0x58, 0x31, 0x88, 0x3c, 0x84, 0x82, 0x49, 0xfb, - 0x4a, 0xc6, 0x84, 0x02, 0x48, 0x00, 0x00, 0xd0, 0x44, 0x00, 0x00, 0xf2, - 0x4c, 0x70, 0x40, 0x09, 0x00, 0xa3, 0x00, 0x0e, 0x85, 0x22, 0x8d, 0x41, - 0x10, 0xa3, 0x00, 0x0e, 0xd5, 0x40, 0x44, 0x10, 0x00, 0xf6, 0x4c, 0x70, - 0xc0, 0x09, 0x00, 0xa3, 0x00, 0x0f, 0x85, 0x24, 0x8d, 0x41, 0x10, 0xa3, - 0x00, 0x0f, 0xd5, 0x35, 0x44, 0x00, 0x00, 0xf4, 0x4c, 0x70, 0x40, 0x09, - 0x00, 0xa3, 0x00, 0x0d, 0x85, 0x21, 0x89, 0x49, 0x10, 0xa3, 0x00, 0x0d, - 0xd5, 0x2a, 0x9c, 0x44, 0x4c, 0x70, 0xc0, 0x09, 0x00, 0xa3, 0x00, 0x10, - 0x85, 0x26, 0x8d, 0x41, 0x10, 0xa3, 0x00, 0x10, 0xd5, 0x20, 0x44, 0x00, - 0x00, 0xfa, 0x4c, 0x70, 0x40, 0x09, 0x00, 0xa3, 0x00, 0x11, 0x85, 0x23, - 0x8d, 0x41, 0x10, 0xa3, 0x00, 0x11, 0xd5, 0x15, 0x00, 0xa3, 0x00, 0x0c, - 0xf1, 0x01, 0x8d, 0x41, 0x10, 0xa3, 0x00, 0x0c, 0x84, 0x04, 0xa7, 0x88, - 0x4c, 0x60, 0x40, 0x08, 0x00, 0x6e, 0x00, 0x00, 0x44, 0x10, 0x00, 0xff, - 0x4c, 0x60, 0x80, 0x06, 0x84, 0x04, 0x49, 0xfb, 0x6d, 0xe2, 0x85, 0x20, - 0x3c, 0x6d, 0x28, 0xb0, 0xf2, 0x04, 0xf3, 0x01, 0xf4, 0x02, 0x80, 0x08, - 0x80, 0x3c, 0x80, 0xa9, 0xdd, 0x26, 0x84, 0xc4, 0x10, 0x64, 0x00, 0x08, - 0x84, 0xc0, 0x12, 0x64, 0x00, 0x05, 0xf0, 0x01, 0xc0, 0x10, 0x04, 0x64, - 0x00, 0x01, 0xf1, 0x02, 0x40, 0xa3, 0x04, 0x00, 0xd5, 0x05, 0x08, 0x10, - 0x00, 0x01, 0x18, 0x13, 0x00, 0x01, 0xe2, 0xca, 0xe9, 0xfb, 0xf0, 0x02, - 0x12, 0x04, 0x00, 0x05, 0x4f, 0xc2, 0x00, 0x16, 0x04, 0x44, 0x00, 0x01, - 0xf1, 0x02, 0xf0, 0x04, 0x99, 0x21, 0x80, 0xdc, 0x98, 0xe0, 0xd5, 0x05, - 0x08, 0x13, 0x00, 0x01, 0x18, 0x12, 0x00, 0x01, 0xe2, 0x83, 0xe9, 0xfb, - 0x02, 0x34, 0x00, 0x05, 0xf0, 0x03, 0x98, 0xc3, 0x12, 0x34, 0x00, 0x05, - 0x02, 0x34, 0x00, 0x05, 0x84, 0x21, 0x9c, 0xda, 0x12, 0x34, 0x00, 0x05, - 0x4c, 0x70, 0xc0, 0x09, 0xf1, 0x03, 0x80, 0x1c, 0x44, 0x20, 0xe0, 0x02, - 0x84, 0x60, 0x49, 0x00, 0x2b, 0x92, 0x3e, 0x0c, 0xe9, 0xd4, 0x49, 0xfb, - 0x78, 0xa0, 0x4e, 0x93, 0x00, 0x1e, 0x84, 0x01, 0x4c, 0x70, 0x00, 0x11, - 0x2e, 0x34, 0xa2, 0x9c, 0x2e, 0x04, 0xa2, 0x9f, 0x99, 0x1b, 0x9d, 0x21, - 0x98, 0xd8, 0x99, 0x20, 0x98, 0x20, 0x9c, 0xdb, 0x98, 0x03, 0x4c, 0x03, - 0x80, 0x04, 0x4c, 0x33, 0xc0, 0x0c, 0xf1, 0x05, 0x80, 0x07, 0x49, 0xfe, - 0xed, 0x02, 0xc8, 0x06, 0xf1, 0x05, 0xf2, 0x03, 0x80, 0x07, 0x49, 0xfe, - 0xf0, 0xba, 0x3c, 0x1d, 0x3a, 0xfb, 0x84, 0x40, 0x44, 0x00, 0x00, 0x17, - 0x49, 0xfb, 0x79, 0x55, 0x49, 0xfb, 0x78, 0x43, 0xc8, 0x03, 0x49, 0xfb, - 0x7b, 0x5e, 0x4e, 0x93, 0x00, 0x05, 0x84, 0x08, 0x49, 0xfb, 0x6d, 0x69, - 0x84, 0x00, 0x44, 0x10, 0x00, 0x20, 0x44, 0x20, 0x00, 0x11, 0x46, 0x30, - 0x00, 0xaf, 0x58, 0x31, 0x8f, 0x5c, 0x49, 0xfb, 0x49, 0xf6, 0x84, 0x00, - 0xec, 0x1c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xdc, 0x3c, 0x3d, 0xde, 0xba, 0x96, 0x00, 0xf0, 0x83, - 0x80, 0xc2, 0x80, 0xe1, 0xe2, 0x03, 0xe9, 0x04, 0x84, 0x01, 0x48, 0x00, - 0x01, 0x88, 0xc9, 0x0a, 0x80, 0x01, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, - 0x08, 0x40, 0x44, 0x30, 0x03, 0xb2, 0x49, 0xfb, 0x36, 0x9a, 0xa6, 0xbd, - 0xa7, 0x3c, 0x40, 0x21, 0x20, 0x08, 0xf0, 0x03, 0x40, 0x21, 0x10, 0x04, - 0x00, 0x13, 0x80, 0x22, 0x46, 0x48, 0x20, 0xe0, 0x40, 0x30, 0x20, 0x08, - 0x40, 0xa1, 0x90, 0x00, 0xc1, 0x03, 0x42, 0x21, 0x7c, 0x08, 0xc6, 0x3e, - 0x00, 0x43, 0x00, 0x09, 0x47, 0xe0, 0x03, 0xf0, 0x40, 0x42, 0x40, 0x08, - 0xa6, 0x75, 0x40, 0x42, 0x78, 0x02, 0x40, 0x21, 0x10, 0x04, 0xc1, 0x03, - 0x42, 0x21, 0x58, 0x08, 0x00, 0x13, 0x00, 0x08, 0x46, 0x30, 0x18, 0x00, - 0x40, 0x10, 0xdc, 0x08, 0xa7, 0x34, 0x40, 0x10, 0x8c, 0x02, 0x40, 0x21, - 0x04, 0x04, 0xc4, 0x03, 0x42, 0x21, 0x64, 0x08, 0xa7, 0x33, 0xc4, 0x03, - 0x42, 0x21, 0x68, 0x08, 0xa7, 0x32, 0xc4, 0x03, 0x42, 0x21, 0x6c, 0x08, - 0xa7, 0x31, 0xc4, 0x03, 0x42, 0x21, 0x70, 0x08, 0xa7, 0x36, 0xc4, 0x03, - 0x42, 0x21, 0x74, 0x08, 0xa7, 0x30, 0xc4, 0x03, 0x42, 0x21, 0x78, 0x08, - 0x00, 0x43, 0x00, 0x0a, 0xa6, 0x77, 0x84, 0xa4, 0x95, 0xa4, 0x97, 0xb0, - 0x40, 0x40, 0x84, 0x1a, 0x40, 0x42, 0x84, 0x1b, 0x40, 0x62, 0x18, 0x04, - 0xd5, 0x0a, 0x80, 0x6a, 0xa2, 0x5a, 0x46, 0x47, 0xff, 0xf0, 0x40, 0x10, - 0x90, 0x02, 0xb4, 0x63, 0x40, 0x21, 0x04, 0x04, 0x00, 0x93, 0x80, 0x00, - 0xa7, 0x3e, 0x14, 0x9f, 0x80, 0x07, 0x01, 0xe3, 0x80, 0x01, 0x15, 0xef, - 0x80, 0x06, 0xa6, 0x3a, 0xf0, 0x84, 0xa6, 0x7b, 0xf1, 0x85, 0xc4, 0x03, - 0x58, 0x63, 0x00, 0x01, 0xa7, 0x3f, 0xc4, 0x03, 0x58, 0x63, 0x00, 0x02, - 0x00, 0x43, 0x80, 0x08, 0xc4, 0x03, 0x58, 0x63, 0x00, 0x08, 0x02, 0x93, - 0x80, 0x05, 0x00, 0x83, 0x80, 0x09, 0x46, 0x30, 0x1f, 0xf0, 0x40, 0x94, - 0xc0, 0x08, 0x40, 0x94, 0x8c, 0x02, 0x40, 0x84, 0x20, 0x08, 0x00, 0x43, - 0x80, 0x0c, 0x40, 0x84, 0xa0, 0x04, 0x40, 0x64, 0x18, 0x04, 0xc4, 0x03, - 0x42, 0x63, 0x64, 0x08, 0x00, 0x43, 0x80, 0x0d, 0xc4, 0x03, 0x42, 0x63, - 0x68, 0x08, 0x00, 0x43, 0x80, 0x24, 0xc4, 0x03, 0x42, 0x63, 0x6c, 0x08, - 0x00, 0x43, 0x80, 0x25, 0xc4, 0x03, 0x42, 0x63, 0x70, 0x08, 0x00, 0x43, - 0x80, 0x0e, 0xc4, 0x03, 0x42, 0x63, 0x74, 0x08, 0x00, 0x43, 0x80, 0x0f, - 0xc4, 0x03, 0x42, 0x63, 0x78, 0x08, 0x00, 0x43, 0x80, 0x10, 0xc4, 0x03, - 0x42, 0x63, 0x7c, 0x08, 0x50, 0x55, 0x00, 0x0c, 0xb5, 0x05, 0x46, 0x96, - 0x71, 0xf0, 0x00, 0x43, 0x80, 0x11, 0x58, 0x94, 0x8f, 0xff, 0x40, 0x84, - 0x24, 0x02, 0xc4, 0x03, 0x58, 0x84, 0x10, 0x00, 0x00, 0x43, 0x80, 0x12, - 0xc4, 0x03, 0x58, 0x84, 0x20, 0x00, 0x00, 0x43, 0x80, 0x13, 0xc4, 0x03, - 0x58, 0x84, 0x40, 0x00, 0x00, 0x43, 0x80, 0x14, 0xc4, 0x03, 0x42, 0x84, - 0x3c, 0x08, 0x00, 0x43, 0x80, 0x15, 0xc4, 0x03, 0x42, 0x84, 0x54, 0x08, - 0x00, 0x43, 0x80, 0x16, 0xc4, 0x03, 0x42, 0x84, 0x58, 0x08, 0x00, 0x43, - 0x80, 0x17, 0xc4, 0x03, 0x42, 0x84, 0x5c, 0x08, 0x00, 0x43, 0x80, 0x18, - 0xc4, 0x03, 0x42, 0x84, 0x6c, 0x08, 0x00, 0x43, 0x80, 0x19, 0xc4, 0x03, - 0x42, 0x84, 0x70, 0x08, 0x00, 0x43, 0x80, 0x1a, 0xc4, 0x03, 0x42, 0x84, - 0x7c, 0x08, 0x50, 0x15, 0x00, 0x6c, 0xb4, 0x81, 0x00, 0x33, 0x80, 0x20, - 0x42, 0x02, 0x78, 0x09, 0x42, 0x00, 0x7c, 0x09, 0xc3, 0x03, 0x42, 0x00, - 0x78, 0x08, 0x00, 0x43, 0x80, 0x21, 0xc4, 0x03, 0x42, 0x00, 0x7c, 0x08, - 0x46, 0x98, 0x20, 0xf9, 0x58, 0x94, 0x88, 0x20, 0xb4, 0x69, 0x47, 0xc8, - 0x20, 0xf9, 0x42, 0x41, 0xf0, 0x08, 0xb6, 0x89, 0xb4, 0x7c, 0x50, 0x45, - 0x00, 0x08, 0xf4, 0x81, 0x42, 0x41, 0xfc, 0x08, 0xb6, 0x9c, 0xf3, 0x01, - 0xb6, 0xc3, 0xb7, 0x05, 0xb6, 0x01, 0xb4, 0xdc, 0x42, 0x63, 0x7c, 0x09, - 0xb6, 0xdc, 0x50, 0x45, 0x00, 0x14, 0xb4, 0xc9, 0x46, 0x1f, 0xf8, 0x73, - 0x42, 0x63, 0x70, 0x09, 0xb6, 0xc9, 0x58, 0x10, 0x8f, 0xff, 0xb4, 0xc4, - 0x00, 0x43, 0x80, 0x1b, 0x40, 0x63, 0x04, 0x02, 0xc4, 0x03, 0x58, 0x63, - 0x40, 0x00, 0x00, 0x43, 0x80, 0x1c, 0xc4, 0x03, 0x42, 0x63, 0x4c, 0x08, - 0x00, 0x43, 0x80, 0x1d, 0xc4, 0x03, 0x42, 0x63, 0x50, 0x08, 0x00, 0x43, - 0x80, 0x1e, 0xc4, 0x03, 0x42, 0x63, 0x54, 0x08, 0x00, 0x43, 0x80, 0x1f, - 0xc4, 0x03, 0x42, 0x63, 0x58, 0x08, 0xf3, 0x04, 0xf0, 0x06, 0x50, 0x45, - 0x00, 0x18, 0xb4, 0x84, 0x04, 0x9f, 0x80, 0x07, 0x05, 0xef, 0x80, 0x05, - 0x40, 0x11, 0xc0, 0x08, 0x40, 0x50, 0x20, 0x08, 0x40, 0x52, 0x84, 0x04, - 0xf4, 0x84, 0x50, 0x15, 0x00, 0x20, 0x50, 0x35, 0x00, 0x1c, 0x40, 0x52, - 0xa4, 0x04, 0x40, 0x4f, 0x60, 0x08, 0x47, 0xc8, 0x20, 0xf9, 0x81, 0x5c, - 0x46, 0x98, 0x20, 0xf9, 0x40, 0x52, 0x90, 0x04, 0x05, 0xe1, 0x80, 0x00, - 0xb4, 0x01, 0xba, 0x84, 0x14, 0x55, 0x00, 0x05, 0x14, 0x64, 0x80, 0x08, - 0x46, 0x88, 0x20, 0xf9, 0xf2, 0x04, 0x46, 0x78, 0x20, 0xf9, 0x46, 0x38, - 0x20, 0xf9, 0x14, 0x24, 0x00, 0x09, 0x15, 0xe3, 0x80, 0x0a, 0x14, 0x01, - 0x80, 0x0b, 0x46, 0x18, 0x20, 0xf9, 0xf3, 0x03, 0x58, 0x10, 0x88, 0x30, - 0xb6, 0x61, 0x81, 0x01, 0xb4, 0x01, 0x84, 0xc0, 0x58, 0x00, 0x28, 0x00, - 0xb6, 0x01, 0x9d, 0xb1, 0x44, 0x41, 0x00, 0x00, 0x84, 0x01, 0xb5, 0x28, - 0x4c, 0x62, 0x00, 0x06, 0x49, 0xfc, 0x94, 0xfb, 0x4e, 0x95, 0xff, 0xf7, - 0x84, 0x00, 0xec, 0x24, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x46, 0x38, 0x20, 0xe0, 0x96, 0x00, 0x40, 0x60, - 0x20, 0x08, 0x58, 0x31, 0x80, 0x14, 0x99, 0xb3, 0xb4, 0xe6, 0x49, 0xff, - 0xfe, 0x5c, 0x92, 0x00, 0xc8, 0x09, 0xb4, 0x46, 0x44, 0x30, 0x80, 0x00, - 0x40, 0x13, 0x8c, 0x02, 0x40, 0x10, 0x88, 0x04, 0xb6, 0x26, 0xec, 0x04, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x96, 0x80, 0x84, 0x00, 0xf2, 0x81, 0x97, 0x88, 0x45, 0xc2, 0xaa, 0xd0, - 0x49, 0xfc, 0x6e, 0x8f, 0x84, 0x00, 0xdd, 0x3c, 0x84, 0x00, 0x80, 0xe0, - 0x49, 0xfc, 0x6e, 0x91, 0xf2, 0x01, 0x3c, 0x7f, 0xde, 0xc0, 0xca, 0x02, - 0xd5, 0x1e, 0xe6, 0xc9, 0xe9, 0x03, 0x80, 0x07, 0xd5, 0x1b, 0xe6, 0xc3, - 0xe9, 0x0c, 0x80, 0x06, 0xdd, 0x3c, 0x80, 0x07, 0x49, 0xfc, 0x6e, 0x81, - 0x80, 0x06, 0x49, 0xfc, 0x6e, 0x76, 0x46, 0x00, 0x01, 0x00, 0xd5, 0x0b, - 0x80, 0x07, 0xdd, 0x3c, 0x80, 0x06, 0x49, 0xfc, 0x6e, 0x76, 0x80, 0x06, - 0x49, 0xfc, 0x6e, 0x6b, 0x46, 0x00, 0x01, 0x40, 0x3c, 0x0f, 0xde, 0xc0, - 0x84, 0x01, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfb, 0x1b, 0xef, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xf4, - 0x50, 0x0f, 0x80, 0x04, 0x49, 0xfb, 0x1b, 0xcd, 0xf0, 0x01, 0xec, 0x0c, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x84, 0x41, - 0x4c, 0x11, 0x00, 0x08, 0x40, 0x61, 0x00, 0x0c, 0x84, 0x02, 0x4c, 0x10, - 0x40, 0x21, 0xd5, 0x0c, 0x46, 0x28, 0x10, 0x40, 0x04, 0x31, 0x00, 0x46, - 0x40, 0x00, 0x80, 0x0c, 0x40, 0x00, 0x0c, 0x04, 0x14, 0x01, 0x00, 0x46, - 0xd5, 0x1e, 0x49, 0xff, 0xff, 0xde, 0x46, 0x18, 0x10, 0x40, 0x58, 0x10, - 0x81, 0x18, 0xb4, 0x41, 0x40, 0x33, 0x18, 0x05, 0x40, 0x63, 0x08, 0x04, - 0xb6, 0xc1, 0xb4, 0x41, 0x40, 0x21, 0x88, 0x02, 0xb6, 0x41, 0x49, 0xff, - 0xff, 0xc4, 0xd5, 0x0b, 0x46, 0x18, 0x10, 0x40, 0x04, 0x00, 0x80, 0x46, - 0x40, 0x63, 0x18, 0x05, 0x40, 0x63, 0x00, 0x02, 0x14, 0x60, 0x80, 0x46, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xff, 0xf9, 0xb1, 0x49, 0xff, 0xf9, 0xbd, 0x49, 0xff, 0xf9, 0xc5, - 0x84, 0x20, 0x84, 0x08, 0x49, 0xff, 0xff, 0xbf, 0x49, 0xfb, 0x24, 0x61, - 0x80, 0x20, 0x44, 0x20, 0x00, 0x22, 0x84, 0x00, 0xa8, 0x8a, 0xb6, 0x01, - 0xa8, 0x09, 0xa8, 0x0b, 0x49, 0xfb, 0x23, 0xcd, 0xec, 0x04, 0x3b, 0xff, - 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xf4, - 0x84, 0x41, 0x84, 0x60, 0x44, 0x00, 0x00, 0xf7, 0x50, 0x1f, 0x80, 0x07, - 0xae, 0xc8, 0x49, 0xfb, 0x9c, 0x6e, 0x00, 0x2f, 0x80, 0x07, 0x54, 0x01, - 0x00, 0x80, 0xc0, 0x32, 0x46, 0x08, 0x00, 0x21, 0x58, 0x00, 0x01, 0x24, - 0xb4, 0x20, 0x46, 0x5c, 0x3f, 0xff, 0x42, 0x10, 0xfc, 0x08, 0xb6, 0x20, - 0x54, 0x21, 0x00, 0x0f, 0xb4, 0x20, 0x58, 0x52, 0x8f, 0xff, 0x40, 0x31, - 0x68, 0x08, 0x40, 0x10, 0x94, 0x02, 0x40, 0x11, 0x84, 0x04, 0xb6, 0x20, - 0x44, 0x5f, 0xf0, 0xff, 0xb4, 0x60, 0x40, 0x41, 0x20, 0x08, 0x40, 0x31, - 0x94, 0x02, 0x40, 0x32, 0x0c, 0x04, 0xb6, 0x60, 0x50, 0x10, 0x00, 0x18, - 0xb4, 0x01, 0x92, 0x04, 0x94, 0x04, 0x94, 0xd4, 0x40, 0x21, 0x00, 0x04, - 0xb6, 0x41, 0x44, 0x5f, 0xff, 0x0f, 0xb4, 0x01, 0x40, 0x00, 0x14, 0x02, - 0x40, 0x01, 0x80, 0x04, 0xd5, 0x30, 0x46, 0x08, 0x00, 0x21, 0x58, 0x00, - 0x01, 0x24, 0xb4, 0x40, 0x92, 0x44, 0x94, 0x94, 0x58, 0x21, 0x00, 0x08, - 0xb6, 0x40, 0x46, 0x5c, 0x3f, 0xff, 0xb4, 0x40, 0x58, 0x52, 0x8f, 0xff, - 0x42, 0x21, 0x7c, 0x08, 0xb6, 0x40, 0x44, 0x4f, 0xf0, 0xff, 0xb4, 0x40, - 0x40, 0x21, 0x14, 0x02, 0x42, 0x21, 0x74, 0x08, 0xb6, 0x40, 0x50, 0x10, - 0x00, 0x18, 0xb4, 0x40, 0x40, 0x21, 0x10, 0x02, 0x58, 0x21, 0x08, 0x00, - 0xb6, 0x40, 0x44, 0x2f, 0xff, 0x0f, 0xb4, 0x01, 0x92, 0x04, 0x94, 0x04, - 0x58, 0x00, 0x00, 0x08, 0xb6, 0x01, 0xb4, 0x01, 0x40, 0x00, 0x08, 0x02, - 0x58, 0x00, 0x00, 0x80, 0xb6, 0x01, 0xec, 0x0c, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x84, 0x9f, 0x84, 0x60, - 0x3e, 0x44, 0xa7, 0xf8, 0x10, 0x3f, 0x80, 0x02, 0x3e, 0x44, 0xa7, 0xf5, - 0x10, 0x3f, 0x80, 0x07, 0x10, 0x3f, 0x80, 0x06, 0x10, 0x3f, 0x80, 0x05, - 0x10, 0x3f, 0x80, 0x04, 0x10, 0x3f, 0x80, 0x03, 0x50, 0x1f, 0x80, 0x07, - 0x84, 0x41, 0x44, 0x00, 0x00, 0x3e, 0x49, 0xfb, 0x9b, 0xe8, 0x81, 0x00, - 0x50, 0x1f, 0x80, 0x06, 0x84, 0x41, 0x44, 0x00, 0x00, 0x49, 0x49, 0xfb, - 0x9b, 0xe0, 0x80, 0xe0, 0x50, 0x1f, 0x80, 0x03, 0x84, 0x41, 0x44, 0x00, - 0x00, 0x48, 0x49, 0xfb, 0x9b, 0xd8, 0x80, 0x20, 0xc8, 0x12, 0x00, 0x4f, - 0x80, 0x03, 0x92, 0x84, 0x50, 0x02, 0x7f, 0xf1, 0x96, 0x00, 0x3e, 0x45, - 0x24, 0x61, 0xe6, 0x1f, 0xe8, 0x05, 0x84, 0x01, 0x3e, 0x05, 0x24, 0x62, - 0xd5, 0x0b, 0x3e, 0x15, 0x24, 0x62, 0xd5, 0x08, 0x44, 0x00, 0x00, 0x2d, - 0x3e, 0x05, 0x24, 0x61, 0x84, 0x41, 0x3e, 0x25, 0x24, 0x62, 0x4e, 0x83, - 0x00, 0x6c, 0xcf, 0x6a, 0xc9, 0x69, 0x50, 0x1f, 0x80, 0x05, 0x84, 0x41, - 0x44, 0x00, 0x00, 0x3c, 0x00, 0x8f, 0x80, 0x06, 0xa7, 0xca, 0x00, 0x9f, - 0x80, 0x03, 0x49, 0xfb, 0x9b, 0xae, 0x83, 0x80, 0x50, 0x1f, 0x80, 0x04, - 0x84, 0x41, 0x44, 0x00, 0x00, 0x3d, 0x49, 0xfb, 0x9b, 0xa6, 0x81, 0x40, - 0x50, 0x1f, 0x80, 0x02, 0x44, 0x00, 0x00, 0x42, 0x84, 0x41, 0x49, 0xfb, - 0x9b, 0x9e, 0x4f, 0xc3, 0x00, 0x4c, 0x4e, 0xa3, 0x00, 0x4a, 0xc8, 0x48, - 0x00, 0x2f, 0x80, 0x04, 0x00, 0x0f, 0x80, 0x05, 0x97, 0x94, 0x54, 0x30, - 0x00, 0x03, 0x42, 0x10, 0x10, 0x0b, 0x95, 0xb4, 0x40, 0x61, 0x98, 0x04, - 0x94, 0x4a, 0x42, 0x00, 0x14, 0x0b, 0x40, 0x63, 0x04, 0x04, 0x94, 0x03, - 0x54, 0x13, 0x80, 0x0c, 0x42, 0x31, 0x04, 0x0b, 0x54, 0x44, 0x00, 0x03, - 0x40, 0x42, 0x04, 0x04, 0x94, 0xdd, 0x40, 0x63, 0x00, 0x04, 0x42, 0x11, - 0x08, 0x0b, 0x54, 0x73, 0x80, 0x40, 0x54, 0x04, 0x80, 0x03, 0x40, 0x72, - 0x1c, 0x04, 0x40, 0x63, 0x0c, 0x04, 0x94, 0x04, 0x94, 0x4e, 0x42, 0x21, - 0x0c, 0x0b, 0x42, 0x84, 0x10, 0x0b, 0x40, 0x73, 0x80, 0x04, 0x40, 0x63, - 0x04, 0x04, 0x94, 0x97, 0x40, 0x84, 0x1c, 0x08, 0x40, 0x63, 0x08, 0x04, - 0x40, 0x73, 0xa0, 0x04, 0x00, 0x2f, 0x80, 0x02, 0x80, 0x26, 0x80, 0x07, - 0x49, 0xff, 0xfa, 0x49, 0x00, 0x1f, 0x80, 0x02, 0x80, 0x06, 0x49, 0xff, - 0xfa, 0x8c, 0x3e, 0x64, 0xa7, 0xf8, 0x3e, 0x74, 0xa7, 0xf5, 0xec, 0x0c, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x49, 0xff, - 0xf8, 0x68, 0x49, 0xff, 0xf8, 0x74, 0x49, 0xff, 0xf8, 0xd4, 0x46, 0x10, - 0x00, 0x9c, 0x58, 0x10, 0x82, 0xb0, 0x3c, 0x1f, 0x29, 0x17, 0x3c, 0x1d, - 0x29, 0x1e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x08, 0x58, 0xdd, 0x21, - 0x3c, 0x1d, 0x29, 0x89, 0x84, 0x01, 0xdd, 0x21, 0x46, 0x08, 0x10, 0x60, - 0x04, 0x10, 0x00, 0x58, 0x42, 0x10, 0xf8, 0x08, 0x14, 0x10, 0x00, 0x58, - 0x49, 0xff, 0xff, 0x29, 0x3c, 0x1d, 0x29, 0x89, 0x84, 0x03, 0xdd, 0x21, - 0x46, 0x10, 0x00, 0x9c, 0x58, 0x10, 0x86, 0x78, 0x3c, 0x1f, 0x29, 0xa9, - 0x46, 0x10, 0x00, 0x9d, 0x58, 0x10, 0x81, 0xbc, 0x3c, 0x1f, 0x29, 0x70, - 0x46, 0x10, 0x00, 0x9c, 0x58, 0x10, 0x85, 0xe8, 0x3c, 0x1f, 0x29, 0xd5, - 0x46, 0x10, 0x00, 0x9c, 0x58, 0x10, 0x86, 0xb4, 0x3c, 0x1f, 0x29, 0x04, - 0x49, 0xff, 0xfe, 0x95, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x40, 0x60, 0x40, 0x09, 0x40, 0x63, 0x40, 0x08, 0x44, 0x54, - 0x00, 0x00, 0x80, 0x20, 0xde, 0x13, 0x40, 0x00, 0x40, 0x08, 0x92, 0x18, - 0x50, 0x20, 0x7f, 0xf1, 0x3e, 0x14, 0xa7, 0xf9, 0x96, 0x90, 0x3e, 0x05, - 0x24, 0x61, 0xe6, 0x5f, 0xe8, 0x03, 0x84, 0x21, 0xd5, 0x02, 0x84, 0x20, - 0x3e, 0x15, 0x24, 0x62, 0xd5, 0x42, 0x49, 0xfb, 0x53, 0x2a, 0x92, 0x00, - 0x46, 0x50, 0x08, 0x00, 0xde, 0x06, 0x3c, 0x0d, 0x36, 0xd4, 0x54, 0x00, - 0x00, 0x80, 0xd5, 0x08, 0x46, 0x58, 0x00, 0x00, 0xde, 0x18, 0x3c, 0x0d, - 0x36, 0xd4, 0x54, 0x00, 0x00, 0x40, 0xc0, 0x2f, 0x3c, 0x0d, 0x29, 0xae, - 0xdd, 0x20, 0xc0, 0x2b, 0x2e, 0x05, 0x24, 0x62, 0xc0, 0x28, 0x2e, 0x15, - 0x24, 0x61, 0x3c, 0x2d, 0x29, 0x74, 0x46, 0x09, 0x00, 0x00, 0x40, 0x10, - 0xa0, 0x08, 0x58, 0x00, 0x00, 0x01, 0xd5, 0x18, 0x46, 0x54, 0x00, 0x00, - 0xde, 0x1a, 0x3c, 0x0d, 0x36, 0xd4, 0x54, 0x00, 0x00, 0x40, 0xc0, 0x15, - 0x3c, 0x0d, 0x29, 0xae, 0xdd, 0x20, 0xc0, 0x11, 0x2e, 0x05, 0x24, 0x62, - 0xc0, 0x0e, 0x2e, 0x15, 0x24, 0x61, 0x3c, 0x2d, 0x29, 0x74, 0x46, 0x09, - 0x00, 0x00, 0x40, 0x10, 0xa0, 0x08, 0x40, 0x10, 0x80, 0x04, 0x44, 0x00, - 0x00, 0x2e, 0xdd, 0x22, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa0, 0xbc, 0x49, 0xff, 0x4a, 0xde, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x20, - 0x00, 0xa0, 0x58, 0x21, 0x02, 0x00, 0x3c, 0x2f, 0x59, 0xd3, 0x46, 0x20, - 0x00, 0x9f, 0x58, 0x21, 0x0f, 0x18, 0x3c, 0x2f, 0x59, 0x76, 0x46, 0x20, - 0x00, 0x9e, 0x58, 0x21, 0x05, 0x40, 0x3c, 0x2f, 0x59, 0x77, 0x46, 0x20, - 0x00, 0x9f, 0x58, 0x21, 0x0f, 0x54, 0x3c, 0x2f, 0x59, 0x7e, 0x46, 0x20, - 0x00, 0x9f, 0x58, 0x21, 0x0d, 0x70, 0x3c, 0x2f, 0x59, 0x8c, 0x46, 0x20, - 0x00, 0xa0, 0x58, 0x21, 0x01, 0x08, 0x3c, 0x2f, 0x59, 0x84, 0x46, 0x20, - 0x00, 0xa0, 0x58, 0x21, 0x00, 0x4c, 0x3c, 0x2f, 0x59, 0x80, 0x46, 0x20, - 0x00, 0xa0, 0x58, 0x21, 0x02, 0xd4, 0x3c, 0x2f, 0x59, 0x7d, 0x46, 0x20, - 0x00, 0xa0, 0x58, 0x21, 0x02, 0x3c, 0x3c, 0x2f, 0x59, 0x75, 0x46, 0x20, - 0x00, 0x9f, 0x58, 0x21, 0x0d, 0x30, 0x3c, 0x2f, 0x59, 0x92, 0x46, 0x20, - 0x00, 0x9f, 0x58, 0x21, 0x0d, 0x50, 0x84, 0x00, 0x3c, 0x2f, 0x59, 0xdc, - 0x3c, 0x0f, 0x49, 0x2f, 0x44, 0x20, 0x00, 0x18, 0x3c, 0x2f, 0x49, 0x30, - 0x9e, 0x97, 0x3c, 0x2f, 0x49, 0x31, 0x3c, 0x0f, 0x49, 0x2e, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xc4, 0x46, 0x08, 0x00, 0x25, - 0x04, 0x20, 0x00, 0xc0, 0x80, 0x20, 0xf1, 0x83, 0x58, 0x21, 0x00, 0x02, - 0xf2, 0x81, 0x80, 0x20, 0xf2, 0x03, 0xf1, 0x84, 0x58, 0x21, 0x02, 0x20, - 0xf2, 0x83, 0x46, 0x10, 0x30, 0x20, 0xf2, 0x04, 0xf1, 0x85, 0x58, 0x21, - 0x02, 0x00, 0xf2, 0x84, 0x80, 0x20, 0xf2, 0x05, 0xf1, 0x86, 0x58, 0x21, - 0x01, 0x00, 0xf2, 0x85, 0x46, 0x10, 0x70, 0x60, 0xf2, 0x06, 0xf1, 0x87, - 0x58, 0x21, 0x02, 0x04, 0xf2, 0x86, 0x80, 0x20, 0xf2, 0x07, 0xf1, 0x88, - 0x58, 0x21, 0x05, 0x04, 0xf2, 0x87, 0x46, 0x10, 0xb0, 0xa0, 0xf2, 0x08, - 0xf1, 0x89, 0x58, 0x21, 0x02, 0x08, 0xf2, 0x88, 0x80, 0x20, 0xf2, 0x09, - 0xf1, 0x8a, 0x58, 0x21, 0x09, 0x08, 0xf2, 0x89, 0x46, 0x10, 0xf0, 0xe0, - 0xf2, 0x0a, 0xf1, 0x8b, 0x58, 0x21, 0x02, 0x0c, 0xf2, 0x8a, 0x80, 0x20, - 0xf2, 0x0b, 0xf1, 0x8c, 0x58, 0x21, 0x0d, 0x0c, 0xf2, 0x8b, 0x46, 0x11, - 0x31, 0x21, 0xf2, 0x0c, 0xf1, 0x8d, 0x58, 0x21, 0x02, 0x10, 0xf2, 0x8c, - 0xf2, 0x0d, 0x83, 0xc0, 0x58, 0x21, 0x01, 0x10, 0xf2, 0x8d, 0xf2, 0x01, - 0x47, 0xc1, 0x71, 0x61, 0x14, 0x20, 0x00, 0xc0, 0x44, 0x00, 0x08, 0x09, - 0xf2, 0x03, 0x81, 0x5e, 0xb6, 0x02, 0x46, 0x91, 0xb1, 0xa1, 0xf2, 0x05, - 0xf0, 0x04, 0x81, 0x0a, 0xb6, 0x40, 0x46, 0x71, 0xf1, 0xe1, 0xf2, 0x07, - 0xf0, 0x06, 0x80, 0xc8, 0xb6, 0x40, 0x46, 0x14, 0x44, 0x44, 0xf2, 0x09, - 0xf0, 0x08, 0x80, 0xa6, 0xb6, 0x40, 0x80, 0x85, 0xf2, 0x0b, 0xf0, 0x0a, - 0x80, 0x64, 0xb6, 0x40, 0x58, 0x10, 0x84, 0x44, 0xf2, 0x0d, 0xf0, 0x0c, - 0x59, 0xce, 0x05, 0x14, 0x58, 0x94, 0x89, 0x18, 0x58, 0x73, 0x8d, 0x1c, - 0xb6, 0x40, 0x15, 0xcf, 0x00, 0x85, 0x14, 0x95, 0x00, 0x86, 0x14, 0x74, - 0x00, 0x87, 0x14, 0x13, 0x01, 0x40, 0x14, 0x12, 0x81, 0x41, 0x14, 0x12, - 0x01, 0x42, 0x14, 0x11, 0x81, 0x43, 0xec, 0x3c, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0xb4, 0x40, 0xb6, 0x41, 0xa0, 0x81, 0xa8, 0x89, 0xa0, 0x82, - 0xa8, 0x8a, 0xa0, 0x83, 0xa8, 0x8b, 0xa0, 0x84, 0xa8, 0x8c, 0xa0, 0x05, - 0xa8, 0x0d, 0xdd, 0x9e, 0x92, 0x00, 0x3e, 0x1d, 0x25, 0xb8, 0x84, 0x00, - 0x3e, 0x3d, 0x24, 0x00, 0x3e, 0x4d, 0x24, 0x0c, 0x98, 0x83, 0x98, 0xc4, - 0xb4, 0x42, 0xb4, 0x63, 0x9c, 0x04, 0x9a, 0xda, 0xb6, 0x41, 0x92, 0x61, - 0x84, 0xac, 0xa8, 0xc9, 0x8c, 0x28, 0xd8, 0xf1, 0x3c, 0x1d, 0x29, 0xf2, - 0x3e, 0x0d, 0x28, 0x88, 0x50, 0x10, 0x80, 0x98, 0xb4, 0x61, 0x3e, 0x5d, - 0x28, 0xa0, 0xb6, 0x60, 0x04, 0x30, 0x80, 0x40, 0xa2, 0x89, 0x9a, 0x9a, - 0x92, 0x41, 0xa8, 0x81, 0x8c, 0x08, 0xd8, 0xf5, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x10, 0x20, 0x00, 0x58, 0x10, 0x81, 0x40, - 0x3e, 0x0d, 0x28, 0x88, 0x49, 0xff, 0xff, 0xc3, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x46, 0x10, 0x20, 0x00, 0x58, 0x10, 0x81, 0x40, 0x3e, 0x0d, 0x25, 0xb8, - 0x49, 0xff, 0xff, 0xb3, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0x3c, 0x46, 0x28, 0x10, 0x00, 0x04, 0x31, - 0x00, 0x49, 0x96, 0x00, 0x42, 0x31, 0x90, 0x0b, 0xc3, 0x03, 0x84, 0x07, - 0xd5, 0x2d, 0xa7, 0x89, 0xa7, 0x4a, 0xa6, 0xcd, 0xa7, 0x0b, 0xa7, 0xcc, - 0x40, 0x52, 0xc0, 0x08, 0xa6, 0x48, 0x40, 0x63, 0x20, 0x08, 0x40, 0x63, - 0x14, 0x04, 0x40, 0x31, 0xa0, 0x08, 0x44, 0x82, 0x00, 0x00, 0x44, 0x93, - 0x00, 0x00, 0x40, 0x54, 0x80, 0x1b, 0x40, 0x54, 0x00, 0x1a, 0x40, 0x63, - 0x04, 0x04, 0x40, 0x31, 0x9c, 0x04, 0x40, 0x42, 0x60, 0x08, 0x46, 0x18, - 0x10, 0x00, 0x80, 0x01, 0x40, 0x43, 0x10, 0x04, 0x40, 0x32, 0x8c, 0x04, - 0x14, 0x40, 0x80, 0x4a, 0x14, 0x30, 0x00, 0x4b, 0x04, 0x01, 0x00, 0x49, - 0x42, 0x00, 0x0c, 0x0b, 0xc8, 0xfc, 0x3a, 0x6f, 0xa4, 0x04, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0x3c, 0xa7, 0xc9, 0xa6, 0x8a, 0xa7, 0x4d, - 0xa7, 0x0b, 0xa7, 0x8c, 0x96, 0x00, 0xa6, 0x48, 0x40, 0x73, 0xa0, 0x08, - 0x40, 0x21, 0x40, 0x08, 0x44, 0x81, 0x00, 0x00, 0x40, 0x30, 0x00, 0x1a, - 0x40, 0x34, 0x00, 0x1b, 0x40, 0x23, 0x88, 0x04, 0x40, 0x52, 0xa0, 0x08, - 0x40, 0x21, 0x04, 0x04, 0x92, 0x70, 0x40, 0x31, 0xc0, 0x08, 0x40, 0x52, - 0x98, 0x04, 0x40, 0x42, 0x60, 0x08, 0x46, 0x08, 0x10, 0x00, 0x46, 0x18, - 0x10, 0x00, 0x58, 0x00, 0x01, 0x2c, 0x40, 0x31, 0x94, 0x04, 0x40, 0x21, - 0x10, 0x04, 0xb6, 0x60, 0x14, 0x20, 0x80, 0x4a, 0x44, 0x39, 0xff, 0xff, - 0xb4, 0x40, 0x46, 0x18, 0x10, 0x00, 0x40, 0x21, 0x0c, 0x02, 0x42, 0x21, - 0x48, 0x08, 0xb6, 0x40, 0x04, 0x00, 0x80, 0x49, 0x42, 0x00, 0x0c, 0x0b, - 0xc8, 0xfc, 0x3a, 0x6f, 0xa0, 0x04, 0xdd, 0x9e, 0x92, 0x00, 0x84, 0x20, - 0x3e, 0x15, 0x24, 0x68, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0x3c, 0x44, 0x30, - 0x00, 0xff, 0x96, 0x48, 0x96, 0x90, 0x46, 0x40, 0x00, 0xaf, 0x58, 0x42, - 0x08, 0x98, 0xd5, 0x08, 0x08, 0x60, 0x00, 0x01, 0x96, 0x68, 0x40, 0x33, - 0x0c, 0x03, 0x38, 0x32, 0x0c, 0x00, 0x9f, 0x49, 0xc9, 0xf8, 0x40, 0x31, - 0x88, 0x03, 0x80, 0x04, 0x38, 0x00, 0x0c, 0x00, 0x56, 0x00, 0x00, 0xcf, - 0x5c, 0x00, 0x00, 0x01, 0x3a, 0x6f, 0x98, 0x04, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x80, 0x60, 0xc9, 0x03, 0x84, 0x01, 0xd5, 0x1c, - 0xa7, 0xc2, 0x84, 0xa2, 0x97, 0xfc, 0x84, 0xc1, 0xa6, 0x81, 0x40, 0x43, - 0x1c, 0x1b, 0x40, 0x42, 0x9c, 0x1a, 0x44, 0x50, 0x00, 0xef, 0xd2, 0x03, - 0x8c, 0xb0, 0xda, 0x07, 0x98, 0x59, 0x00, 0x20, 0xff, 0xff, 0x80, 0x03, - 0x84, 0x22, 0xd5, 0x05, 0x98, 0xc1, 0x00, 0x21, 0xff, 0xff, 0x9c, 0x62, - 0x49, 0xff, 0xff, 0xc1, 0x92, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, - 0xdd, 0x9e, 0x3c, 0x0d, 0x49, 0x09, 0x44, 0x50, 0x00, 0x18, 0xd8, 0x05, - 0x84, 0x28, 0x3e, 0x0d, 0xab, 0x94, 0xd5, 0x07, 0x84, 0xa8, 0xd8, 0x06, - 0x3e, 0x0d, 0xab, 0x94, 0x44, 0x10, 0x00, 0x18, 0xa8, 0x42, 0xdd, 0x9e, - 0x92, 0x00, 0xdd, 0x9e, 0x92, 0x00, 0x96, 0x00, 0x99, 0x20, 0xa7, 0x60, - 0x96, 0x90, 0x96, 0x48, 0xe2, 0xa2, 0xe8, 0x08, 0x98, 0xd8, 0xa6, 0x18, - 0x98, 0x48, 0xae, 0x58, 0xa6, 0x20, 0x9c, 0x01, 0xae, 0x20, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x21, 0x96, 0x00, - 0x94, 0x8c, 0x3e, 0x3d, 0xa9, 0xa0, 0x3e, 0x4d, 0xaa, 0x08, 0x49, 0xff, - 0xff, 0xe6, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x2e, 0x15, 0xb4, 0xca, 0x96, 0x00, 0x44, 0x20, - 0x00, 0x10, 0x3e, 0x3d, 0xaa, 0x80, 0x3e, 0x4d, 0xa9, 0x28, 0x49, 0xff, - 0xff, 0xd4, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa0, 0xbc, 0x96, 0x00, 0x97, 0x88, 0x40, 0x81, 0x00, 0x10, 0x4e, 0x02, - 0x00, 0x7d, 0x5e, 0xf4, 0x7f, 0xb6, 0xe9, 0x2a, 0x5e, 0xf4, 0x7f, 0xc1, - 0xe8, 0x03, 0x84, 0x21, 0xd5, 0x1b, 0xc6, 0x0f, 0x9e, 0x31, 0x96, 0x00, - 0x84, 0x21, 0x94, 0x8c, 0x3e, 0x3d, 0xa9, 0xa0, 0x3e, 0x4d, 0xaa, 0x08, - 0x49, 0xff, 0xff, 0xb5, 0x5c, 0xf3, 0x00, 0x4e, 0xe9, 0x02, 0xd5, 0x0b, - 0x9c, 0x31, 0x96, 0x00, 0x84, 0x21, 0x94, 0x8c, 0x3e, 0x3d, 0xa9, 0xa0, - 0x3e, 0x4d, 0xaa, 0x08, 0x49, 0xff, 0xff, 0xa7, 0x84, 0x22, 0x80, 0x06, - 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xa9, 0xa0, 0x3e, 0x4d, 0xaa, 0x08, - 0x49, 0xff, 0xff, 0x9d, 0xd5, 0x50, 0x5e, 0xf4, 0x7f, 0xa6, 0xe8, 0x4d, - 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xaa, 0x80, 0x3e, 0x4d, - 0xa9, 0x28, 0x80, 0x06, 0x46, 0x70, 0x00, 0x9d, 0x58, 0x73, 0x86, 0xa4, - 0xdd, 0x27, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, - 0xa9, 0xa0, 0x3e, 0x4d, 0xaa, 0x08, 0xdd, 0x27, 0x5e, 0xf4, 0x7f, 0x9c, - 0xe8, 0x34, 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xaa, 0x80, - 0x3e, 0x4d, 0xa9, 0x28, 0x80, 0x06, 0xdd, 0x27, 0x80, 0x06, 0x84, 0x20, - 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xa9, 0xa0, 0x3e, 0x4d, 0xaa, 0x08, - 0xdd, 0x27, 0xe6, 0xc2, 0xe9, 0x0c, 0x9f, 0xb2, 0x97, 0xb0, 0x80, 0x06, - 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xaa, 0x80, 0x3e, 0x4d, - 0xa9, 0x28, 0xd5, 0x0b, 0x9d, 0xb2, 0x97, 0xb0, 0x84, 0x20, 0x44, 0x20, - 0x00, 0x10, 0x3e, 0x3d, 0xaa, 0x80, 0x3e, 0x4d, 0xa9, 0x28, 0x80, 0x06, - 0xdd, 0x27, 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, - 0xa9, 0xa0, 0x3e, 0x4d, 0xaa, 0x08, 0xdd, 0x27, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x44, 0x20, 0x00, 0x10, - 0x96, 0x00, 0x96, 0x48, 0x3e, 0x3d, 0xaa, 0x80, 0x3e, 0x4d, 0xa9, 0x28, - 0x49, 0xff, 0xff, 0x3d, 0x84, 0x20, 0x3e, 0x15, 0x6b, 0x52, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x84, 0x20, 0x96, 0x00, 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xa9, 0xa0, - 0x3e, 0x4d, 0xaa, 0x08, 0x49, 0xff, 0xff, 0x29, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0x3c, 0x96, 0x00, - 0x40, 0x20, 0x0c, 0x09, 0x3e, 0x5d, 0xaa, 0x5c, 0x38, 0x62, 0x88, 0x00, - 0x54, 0x30, 0x00, 0x07, 0x40, 0x13, 0x0c, 0x0e, 0x96, 0x4c, 0xc9, 0x25, - 0x3e, 0x4d, 0x25, 0x70, 0x38, 0x42, 0x08, 0x00, 0x40, 0x42, 0x0c, 0x0e, - 0x97, 0x24, 0xc4, 0x1d, 0x85, 0x01, 0x40, 0x34, 0x0c, 0x0c, 0x40, 0x61, - 0x98, 0x04, 0x38, 0x62, 0x88, 0x08, 0x3e, 0x2d, 0xaa, 0x08, 0x2e, 0x75, - 0x6b, 0x4e, 0x38, 0x11, 0x00, 0x08, 0x3e, 0x2d, 0xaa, 0x80, 0x38, 0x11, - 0x00, 0x08, 0x3e, 0x2d, 0xa9, 0x28, 0x9f, 0xf9, 0x38, 0x11, 0x00, 0x08, - 0x3e, 0x2d, 0xa9, 0xa0, 0x3e, 0x75, 0x6b, 0x4e, 0x38, 0x11, 0x00, 0x08, - 0x3a, 0x6f, 0xa0, 0x04, 0xdd, 0x9e, 0x3c, 0x0d, 0x6b, 0xf6, 0x84, 0x25, - 0x9e, 0x05, 0x40, 0x00, 0x80, 0x06, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xa0, 0xbc, 0x3e, 0x6d, 0xb0, 0x24, 0x00, 0x83, 0x01, 0xd7, 0x80, 0xe0, - 0x84, 0x01, 0x4c, 0x80, 0x40, 0x0e, 0x3c, 0x1d, 0x58, 0xf5, 0x84, 0x00, - 0xdd, 0x21, 0x00, 0x03, 0x01, 0xd7, 0x4c, 0x04, 0x40, 0x0e, 0xa0, 0x71, - 0x44, 0x00, 0x00, 0x70, 0xd5, 0x07, 0x00, 0x03, 0x01, 0xd6, 0x84, 0xa1, - 0xd8, 0x05, 0xa0, 0x71, 0x84, 0x08, 0xb6, 0x27, 0xd5, 0x02, 0x84, 0x00, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x96, 0x00, 0xc0, 0x08, 0xa6, 0x0d, - 0x54, 0x00, 0x00, 0xc0, 0x56, 0x00, 0x00, 0x40, 0x5c, 0x00, 0x00, 0x01, - 0xdd, 0x9e, 0x46, 0x08, 0x10, 0x00, 0x04, 0x00, 0x00, 0x4c, 0x42, 0x00, - 0x28, 0x0b, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x96, 0x00, - 0x97, 0x88, 0x40, 0x81, 0x00, 0x10, 0xc0, 0x3f, 0x5e, 0xf4, 0x7f, 0xb6, - 0xe9, 0x13, 0x5e, 0x84, 0x7f, 0xc5, 0x84, 0x02, 0x84, 0x41, 0x40, 0x11, - 0x20, 0x1b, 0x40, 0x10, 0x20, 0x1a, 0x3e, 0x3d, 0xaa, 0xd4, 0x80, 0x06, - 0x8c, 0x4f, 0x3e, 0x4d, 0xa9, 0x78, 0x49, 0xff, 0xfe, 0x98, 0x92, 0x00, - 0xd5, 0x2a, 0x5e, 0xf4, 0x7f, 0xa6, 0xe8, 0x27, 0x80, 0x06, 0x84, 0x20, - 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xaa, 0xd4, 0x3e, 0x4d, 0xa9, 0x78, - 0x49, 0xff, 0xfe, 0x89, 0x5e, 0xf4, 0x7f, 0x9c, 0xe8, 0x1a, 0x80, 0x06, - 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xaa, 0xd4, 0x3e, 0x4d, - 0xa9, 0x78, 0x49, 0xff, 0xfe, 0x7c, 0xc6, 0x05, 0x9e, 0x31, 0x96, 0x00, - 0x84, 0x20, 0xd5, 0x03, 0x80, 0x26, 0x84, 0x01, 0x44, 0x20, 0x00, 0x10, - 0x3e, 0x3d, 0xaa, 0xd4, 0x3e, 0x4d, 0xa9, 0x78, 0x49, 0xff, 0xfe, 0x6d, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x46, 0x08, 0x10, 0x02, 0x84, 0x3f, - 0x14, 0x10, 0x00, 0x47, 0x14, 0x10, 0x00, 0x47, 0xdd, 0x9e, 0xb4, 0x41, - 0xa6, 0xd0, 0xcb, 0x1b, 0x02, 0x40, 0x00, 0x1c, 0x02, 0x20, 0x00, 0x86, - 0x84, 0x66, 0x9d, 0x21, 0x9c, 0x92, 0x42, 0x22, 0x0c, 0x73, 0x04, 0x00, - 0x00, 0x12, 0x96, 0x91, 0xac, 0x84, 0x40, 0x31, 0x20, 0x09, 0xb4, 0x21, - 0x8c, 0x2a, 0xae, 0xc9, 0xae, 0x88, 0x00, 0x10, 0x00, 0x0d, 0x58, 0x10, - 0x80, 0x02, 0x10, 0x10, 0x00, 0x0d, 0xd5, 0x36, 0x84, 0xa1, 0xdb, 0x38, - 0x02, 0x20, 0x00, 0x1b, 0x44, 0x40, 0x01, 0x90, 0x40, 0x42, 0x08, 0x56, - 0x02, 0x20, 0x00, 0x1c, 0x84, 0x66, 0x9c, 0x91, 0x42, 0x21, 0x0c, 0x24, - 0x00, 0x50, 0x01, 0x37, 0x2e, 0x34, 0xa2, 0x9e, 0x9c, 0x93, 0x9a, 0xeb, - 0x97, 0x51, 0x96, 0xd8, 0xe2, 0xa4, 0xe8, 0x02, 0x80, 0x44, 0x02, 0x40, - 0x00, 0x86, 0x98, 0x94, 0x96, 0x91, 0x12, 0x20, 0x00, 0x88, 0x5c, 0xf1, - 0x80, 0x20, 0xe8, 0x06, 0x9c, 0x96, 0x3e, 0x4d, 0xb8, 0x28, 0x38, 0x22, - 0x0d, 0x09, 0xb4, 0x21, 0x02, 0x20, 0x00, 0x88, 0x9c, 0x4e, 0x40, 0x31, - 0x20, 0x09, 0xae, 0xc9, 0xae, 0x88, 0x00, 0x10, 0x01, 0x53, 0x58, 0x10, - 0x80, 0x02, 0x10, 0x10, 0x01, 0x53, 0x84, 0x21, 0x3e, 0x0d, 0x24, 0x6d, - 0xd5, 0x24, 0x8c, 0xb7, 0xdb, 0x23, 0xa6, 0xd1, 0xcb, 0x03, 0xa6, 0x92, - 0xc2, 0x13, 0x02, 0x50, 0x00, 0x1c, 0x2e, 0x45, 0x6a, 0xb4, 0x02, 0x30, - 0x00, 0x86, 0x00, 0x20, 0x01, 0x54, 0x9d, 0x69, 0x42, 0x32, 0x90, 0x73, - 0x58, 0x21, 0x00, 0x02, 0x12, 0x30, 0x00, 0x9a, 0x10, 0x20, 0x01, 0x54, - 0xd5, 0x05, 0x10, 0x20, 0x01, 0x54, 0x12, 0x20, 0x00, 0x9a, 0xb4, 0x41, - 0x02, 0x10, 0x00, 0x9a, 0x9c, 0x13, 0x40, 0x20, 0xa0, 0x09, 0xae, 0x81, - 0xae, 0x40, 0xdd, 0x9e, 0x92, 0x00, 0x96, 0x01, 0x9c, 0xc1, 0x84, 0x83, - 0x42, 0x31, 0x90, 0x24, 0x96, 0x49, 0x9c, 0xd9, 0x98, 0xdb, 0x96, 0x19, - 0x94, 0x4a, 0x42, 0x20, 0x04, 0x73, 0x80, 0x02, 0xdd, 0x9e, 0x98, 0xc8, - 0x40, 0x31, 0x84, 0x17, 0x96, 0x91, 0x98, 0x12, 0x42, 0x01, 0x84, 0x73, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x3c, 0x0d, 0x59, 0x25, - 0x54, 0x00, 0x10, 0x00, 0xc0, 0x6a, 0x3c, 0x7d, 0x6d, 0x01, 0x2e, 0x04, - 0xa2, 0x9f, 0x84, 0x20, 0xf0, 0x83, 0x50, 0x03, 0x80, 0x3a, 0x50, 0x93, - 0x80, 0x5c, 0xf0, 0x81, 0x51, 0xc3, 0x80, 0x67, 0x50, 0xa3, 0x80, 0x08, - 0xf1, 0x82, 0xd5, 0x55, 0xb4, 0x07, 0x54, 0x00, 0x00, 0x04, 0xc0, 0x42, - 0xb4, 0x4a, 0x84, 0x62, 0x4c, 0x21, 0xc0, 0x04, 0x84, 0x21, 0xd5, 0x07, - 0x04, 0x15, 0x00, 0x01, 0x56, 0x10, 0x80, 0x02, 0x5c, 0x10, 0x80, 0x01, - 0xc9, 0x35, 0xa0, 0x79, 0x54, 0x80, 0x80, 0x01, 0x4e, 0x83, 0x00, 0x31, - 0x02, 0x03, 0x80, 0x1b, 0x80, 0x88, 0x12, 0x04, 0x80, 0x00, 0x84, 0x01, - 0xf1, 0x01, 0x80, 0xa8, 0xa4, 0x48, 0x12, 0x14, 0x80, 0x02, 0x84, 0x27, - 0xf2, 0x01, 0x02, 0x21, 0x7f, 0xff, 0x12, 0x24, 0x80, 0x01, 0x80, 0x48, - 0x02, 0x33, 0x80, 0x89, 0x12, 0x34, 0xff, 0xff, 0x10, 0x0e, 0x00, 0x00, - 0xb4, 0xc7, 0x80, 0x07, 0x42, 0x63, 0x50, 0x08, 0xb6, 0xc7, 0x3c, 0x6d, - 0x53, 0xb4, 0x80, 0x68, 0xdd, 0x26, 0xb4, 0x07, 0x42, 0x00, 0x50, 0x09, - 0xb6, 0x07, 0x84, 0x41, 0x00, 0x0e, 0x00, 0x00, 0x4c, 0x01, 0x40, 0x07, - 0x3c, 0x6d, 0x53, 0xb9, 0x80, 0x28, 0x80, 0x07, 0xdd, 0x26, 0xf0, 0x02, - 0xf1, 0x01, 0x9c, 0x01, 0x50, 0x10, 0x81, 0x64, 0xf0, 0x82, 0xf1, 0x81, - 0x50, 0x73, 0x81, 0x64, 0x50, 0x94, 0x81, 0x64, 0x51, 0xce, 0x01, 0x64, - 0x50, 0xa5, 0x01, 0x64, 0xf2, 0x02, 0xf3, 0x03, 0xe2, 0x43, 0xe9, 0xa9, - 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x2e, 0x25, - 0x24, 0x65, 0x80, 0x20, 0xca, 0x03, 0x84, 0x02, 0xd5, 0x08, 0x5c, 0x30, - 0x00, 0x02, 0x84, 0x42, 0x40, 0x00, 0x8c, 0x1a, 0x40, 0x01, 0x0c, 0x1b, - 0xdd, 0x9e, 0x04, 0x00, 0x00, 0x0f, 0x50, 0x00, 0x00, 0x33, 0x44, 0x20, - 0x00, 0x25, 0xa6, 0x46, 0xa6, 0xc7, 0x98, 0x59, 0x40, 0x20, 0x88, 0x36, - 0xae, 0x46, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x3c, 0x1d, 0x6c, 0xfc, 0x44, 0x20, 0x00, 0x44, 0x96, 0x00, 0x42, 0x10, - 0x08, 0x73, 0x80, 0x01, 0x49, 0xff, 0xff, 0xe7, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x84, 0x62, 0x96, 0x48, 0x96, 0x01, - 0x96, 0x90, 0x4c, 0x11, 0xc0, 0x0b, 0x44, 0x40, 0x00, 0x2c, 0x44, 0x50, - 0x00, 0x4c, 0x40, 0x32, 0x88, 0x1b, 0x40, 0x32, 0x08, 0x1a, 0xd5, 0x0a, - 0x44, 0x10, 0x00, 0x50, 0x44, 0x40, 0x00, 0x70, 0x40, 0x32, 0x08, 0x1b, - 0x40, 0x30, 0x88, 0x1a, 0x84, 0x23, 0x40, 0x10, 0x04, 0x0c, 0x98, 0xd9, - 0x96, 0x19, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x3c, 0x8d, - 0x78, 0x04, 0x84, 0xa1, 0x4c, 0x82, 0x80, 0x0d, 0x4e, 0x82, 0x00, 0x06, - 0x84, 0xa3, 0x4c, 0x82, 0xc0, 0x26, 0xd5, 0x06, 0x84, 0x21, 0x3c, 0x1f, - 0x78, 0x04, 0x80, 0xc8, 0xd5, 0x26, 0x3e, 0x7d, 0xe0, 0x10, 0xa0, 0x7a, - 0x00, 0x03, 0x80, 0x22, 0x04, 0x10, 0x80, 0x0f, 0x84, 0x40, 0x00, 0x10, - 0x80, 0x49, 0x44, 0x60, 0x02, 0x71, 0x49, 0xff, 0xff, 0xc4, 0x92, 0x00, - 0x50, 0x00, 0x03, 0x69, 0x40, 0x60, 0x18, 0x16, 0x97, 0xb4, 0xc6, 0x11, - 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x04, 0x84, 0x03, 0xd5, 0x02, 0x84, 0x01, - 0xb6, 0x07, 0x84, 0xc0, 0xd5, 0x08, 0x3c, 0x1d, 0x59, 0x4d, 0x44, 0x00, - 0x00, 0x51, 0xdd, 0x21, 0x44, 0x60, 0x00, 0x1f, 0x3c, 0x4d, 0x59, 0x07, - 0x3c, 0x3d, 0x78, 0x04, 0x84, 0x21, 0x84, 0x04, 0x44, 0x20, 0x32, 0x01, - 0xdd, 0x24, 0x80, 0x06, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x96, 0x00, - 0x96, 0x49, 0xc0, 0x22, 0xc1, 0x21, 0x92, 0x21, 0x96, 0x8c, 0x84, 0x63, - 0x40, 0x30, 0x8c, 0x37, 0xc2, 0x12, 0xc1, 0x16, 0xe6, 0x06, 0xe9, 0x10, - 0x84, 0x26, 0x40, 0x20, 0x04, 0x37, 0x96, 0x48, 0x9a, 0x01, 0x96, 0x00, - 0xc9, 0x02, 0xd5, 0x0e, 0xe6, 0x25, 0xe8, 0x03, 0x9c, 0x01, 0xd5, 0x0b, - 0x9c, 0x05, 0xd5, 0x09, 0xc1, 0x09, 0x84, 0x23, 0x40, 0x20, 0x04, 0x37, - 0xd5, 0x02, 0x96, 0x44, 0xc9, 0x03, 0x9e, 0x01, 0x96, 0x00, 0xdd, 0x9e, - 0x92, 0x00, 0x3c, 0x0d, 0x49, 0x38, 0xdd, 0x9e, 0x92, 0x00, 0x3c, 0x0f, - 0x49, 0x38, 0xdd, 0x9e, 0x92, 0x00, 0x02, 0x10, 0x01, 0x1b, 0x84, 0xaf, - 0xd9, 0x12, 0x02, 0x10, 0x00, 0xa1, 0x9d, 0x6b, 0xd9, 0x0e, 0x02, 0x10, - 0x01, 0x0e, 0x3e, 0x0d, 0x28, 0x74, 0xa5, 0x40, 0x9c, 0x02, 0xd9, 0x04, - 0x44, 0x00, 0x32, 0x00, 0xd5, 0x06, 0x3e, 0x5d, 0x28, 0x86, 0xd8, 0xf8, - 0x44, 0x00, 0x06, 0x40, 0xdd, 0x9e, 0x3c, 0x02, 0xd4, 0x42, 0x54, 0x00, - 0x00, 0x02, 0xc8, 0x20, 0x3c, 0x0d, 0x5b, 0x18, 0xc8, 0x1f, 0x2e, 0x05, - 0x6b, 0x82, 0xc8, 0x1c, 0x3c, 0x0d, 0x60, 0xf0, 0xe6, 0x0f, 0xe8, 0x18, - 0x2e, 0x05, 0x9b, 0xcd, 0xc8, 0x0a, 0x2e, 0x05, 0xb6, 0x16, 0xc8, 0x07, - 0x3c, 0x0d, 0x5b, 0x0a, 0x44, 0x51, 0x00, 0x00, 0xb4, 0x00, 0xd8, 0x0c, - 0x3c, 0x1d, 0x65, 0x5f, 0xe6, 0x22, 0xe9, 0x06, 0x2e, 0x05, 0x95, 0xbe, - 0x5c, 0x00, 0x00, 0x06, 0xd5, 0x04, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x3c, 0x0d, 0x60, 0xf2, 0x84, 0xab, - 0xd0, 0x07, 0x3c, 0x1d, 0x52, 0xd0, 0xdd, 0x21, 0x84, 0x0b, 0x3c, 0x0f, - 0x60, 0xf2, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x00, 0x10, - 0x02, 0x46, 0x3e, 0x0d, 0x94, 0xdc, 0x38, 0x00, 0x06, 0x02, 0x92, 0x1c, - 0x40, 0x00, 0x70, 0x08, 0x84, 0x20, 0x40, 0x00, 0x80, 0x06, 0xdd, 0x9e, - 0x92, 0x00, 0x84, 0x20, 0x3e, 0x15, 0x24, 0x75, 0xdd, 0x9e, 0x96, 0x48, - 0x54, 0x40, 0x80, 0x02, 0x96, 0x90, 0xc4, 0x03, 0x84, 0x22, 0xd5, 0x04, - 0x96, 0x4c, 0xc1, 0x02, 0x84, 0x21, 0xae, 0x58, 0x3c, 0x1d, 0x6c, 0xfc, - 0x00, 0x50, 0x01, 0x37, 0x44, 0x40, 0x00, 0x44, 0x42, 0x12, 0x90, 0x73, - 0xa7, 0x18, 0x04, 0x10, 0x80, 0x0f, 0x00, 0x10, 0x80, 0x49, 0x4c, 0x40, - 0xc0, 0x04, 0x84, 0x20, 0xae, 0x58, 0x54, 0x11, 0x00, 0x02, 0xc1, 0x03, - 0x84, 0x22, 0xd5, 0x04, 0x96, 0x94, 0xc2, 0x04, 0x84, 0x21, 0xae, 0x59, - 0xd5, 0x02, 0xae, 0x99, 0x00, 0x20, 0x01, 0x37, 0x3c, 0x0d, 0x6c, 0xfc, - 0x44, 0x10, 0x00, 0x44, 0x42, 0x01, 0x04, 0x73, 0xa7, 0x59, 0x04, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x4a, 0xd8, 0x03, 0x84, 0x00, 0xae, 0x19, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xf8, 0x3c, 0x2d, 0x59, 0x2e, - 0x80, 0xe1, 0x44, 0x10, 0x01, 0x00, 0x80, 0xc0, 0xdd, 0x22, 0xc8, 0x04, - 0x84, 0x0c, 0x48, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x36, 0xc8, 0x52, - 0xa0, 0x32, 0x84, 0xa4, 0xd8, 0x03, 0x84, 0x21, 0xd5, 0x06, 0xa0, 0x73, - 0x56, 0x10, 0x80, 0x04, 0x5c, 0x10, 0x80, 0x01, 0xc9, 0x0b, 0x84, 0xa2, - 0xd8, 0x03, 0x84, 0x21, 0xd5, 0x06, 0xa0, 0x73, 0x56, 0x10, 0x80, 0x02, - 0x5c, 0x10, 0x80, 0x01, 0xc1, 0x07, 0x3c, 0x3d, 0x53, 0xc7, 0x44, 0x10, - 0x00, 0x2a, 0x80, 0x06, 0xd5, 0x10, 0x8e, 0x0f, 0xe6, 0x03, 0xe8, 0x03, - 0x84, 0x01, 0xd5, 0x05, 0xa0, 0x33, 0x8e, 0x0f, 0x5c, 0x00, 0x00, 0x03, - 0xc0, 0x09, 0x3c, 0x3d, 0x53, 0xc7, 0x44, 0x10, 0x00, 0x23, 0x80, 0x06, - 0x44, 0x20, 0x00, 0x16, 0xd5, 0x2a, 0x2e, 0x15, 0xb6, 0x04, 0xa6, 0xb9, - 0x96, 0xcc, 0xcb, 0x06, 0x2e, 0x05, 0xb6, 0x05, 0x40, 0x01, 0x00, 0x02, - 0xd5, 0x02, 0x80, 0x02, 0x54, 0x10, 0x80, 0x02, 0xa6, 0xb8, 0xc9, 0x06, - 0x2e, 0x15, 0xb6, 0x06, 0x40, 0x21, 0x04, 0x02, 0xd5, 0x01, 0x50, 0x8f, - 0x80, 0x04, 0x80, 0x20, 0x80, 0x68, 0x80, 0x06, 0x49, 0xff, 0xff, 0x71, - 0x44, 0x00, 0x00, 0x10, 0xa8, 0x33, 0x3c, 0x2d, 0x53, 0xd0, 0x80, 0x28, - 0x80, 0x06, 0xdd, 0x22, 0xd5, 0x07, 0xa6, 0x79, 0xa6, 0xb8, 0x3c, 0x3d, - 0x53, 0xcf, 0x80, 0x06, 0xdd, 0x23, 0xb4, 0x26, 0xa6, 0xb9, 0x54, 0x10, - 0x80, 0x80, 0xc1, 0x0b, 0x96, 0x54, 0x02, 0x23, 0x00, 0x98, 0xc1, 0x04, - 0x50, 0x21, 0x7f, 0x90, 0xd5, 0x0a, 0x50, 0x21, 0x7f, 0xb4, 0xd5, 0x0b, - 0x96, 0x54, 0x02, 0x23, 0x00, 0x98, 0xc1, 0x05, 0x50, 0x21, 0x7f, 0xb0, - 0x90, 0x43, 0xd5, 0x05, 0x50, 0x21, 0x7f, 0xd4, 0x90, 0x43, 0x98, 0x92, - 0x12, 0x23, 0x00, 0x92, 0x02, 0x13, 0x00, 0x91, 0x02, 0x23, 0x00, 0x92, - 0xe2, 0x41, 0xe8, 0x02, 0x80, 0x22, 0x12, 0x13, 0x00, 0x92, 0xec, 0x08, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xf4, - 0x00, 0x50, 0x01, 0x5d, 0xa7, 0x09, 0x00, 0x30, 0x01, 0x5e, 0xa6, 0x88, - 0x50, 0x7f, 0x80, 0x04, 0x40, 0x12, 0x14, 0x02, 0x40, 0x21, 0x0c, 0x02, - 0x80, 0x67, 0x80, 0xc0, 0x49, 0xff, 0xff, 0x25, 0x3c, 0x2d, 0x53, 0xd0, - 0x80, 0x27, 0x80, 0x06, 0xdd, 0x22, 0xec, 0x0c, 0x3a, 0x6f, 0x9c, 0x84, - 0xdd, 0x9e, 0x44, 0x20, 0xff, 0xfd, 0x96, 0x49, 0x4c, 0x11, 0x40, 0x0c, - 0xa6, 0x00, 0x44, 0x10, 0x00, 0xff, 0x4c, 0x00, 0x80, 0x1c, 0x44, 0x50, - 0x00, 0x13, 0xd0, 0x18, 0xc0, 0x17, 0xd5, 0x14, 0x44, 0x50, 0xff, 0xfc, - 0xd1, 0x11, 0x44, 0x50, 0xe0, 0x01, 0xd1, 0x0e, 0x9d, 0x51, 0xd9, 0x0e, - 0xa6, 0x40, 0x44, 0x50, 0x00, 0x35, 0xd9, 0x08, 0xa6, 0x01, 0x84, 0x20, - 0x56, 0x00, 0x00, 0x0c, 0x40, 0x00, 0x80, 0x06, 0xd5, 0x04, 0x84, 0x01, - 0xd5, 0x02, 0x84, 0x00, 0xdd, 0x9e, 0xdd, 0x9e, 0x92, 0x00, 0xdd, 0x9e, - 0x92, 0x00, 0x84, 0x2a, 0x3c, 0x1f, 0x60, 0x93, 0xdd, 0x9e, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x98, 0x3c, 0xa6, 0x42, 0x84, 0xad, 0xd1, 0x61, - 0xe6, 0x2e, 0xe8, 0x09, 0x84, 0xab, 0xd1, 0x0e, 0xe6, 0x2c, 0xe8, 0x75, - 0x84, 0x0a, 0x4c, 0x10, 0x40, 0x75, 0xd5, 0x08, 0x84, 0xae, 0xd1, 0x15, - 0x8e, 0x3b, 0x84, 0x41, 0xe2, 0x41, 0xe9, 0x6d, 0xd5, 0x62, 0x84, 0x44, - 0x3e, 0x25, 0x80, 0xa3, 0x44, 0x20, 0x00, 0x32, 0x3c, 0x2f, 0x6d, 0xf8, - 0x84, 0x41, 0x3e, 0x25, 0x80, 0xa0, 0x44, 0x10, 0x00, 0xf0, 0x3c, 0x1f, - 0x6d, 0xf7, 0xd5, 0x5b, 0x9c, 0x44, 0xa6, 0xc8, 0x8c, 0x6e, 0x3e, 0x35, - 0x4a, 0x48, 0x84, 0x40, 0xd5, 0x05, 0xa7, 0x25, 0x96, 0xb0, 0x10, 0x42, - 0x80, 0x0f, 0xa6, 0xc8, 0x3e, 0x4d, 0x4a, 0x48, 0x99, 0x54, 0x9d, 0x91, - 0x99, 0x02, 0xe2, 0x43, 0xe9, 0xf5, 0xa6, 0x83, 0x3e, 0x25, 0x80, 0xa8, - 0xe6, 0x44, 0xe9, 0x05, 0x8c, 0x50, 0x96, 0x90, 0xe6, 0x45, 0xe8, 0x41, - 0x3e, 0x2d, 0xb7, 0xdc, 0x44, 0x30, 0x04, 0x20, 0xb6, 0x62, 0x44, 0x30, - 0x00, 0x32, 0xa8, 0xd1, 0xa6, 0xc8, 0xa7, 0x00, 0x9b, 0x23, 0xe4, 0x85, - 0xe9, 0x11, 0x98, 0xc3, 0xa7, 0x5e, 0xa7, 0x1d, 0x40, 0x32, 0xa0, 0x08, - 0x98, 0xdc, 0xb6, 0x62, 0xa6, 0x48, 0x98, 0x01, 0x00, 0x30, 0x00, 0x08, - 0xa6, 0x47, 0x40, 0x01, 0xa0, 0x08, 0x98, 0x01, 0xa8, 0x11, 0x84, 0x25, - 0x3e, 0x15, 0x80, 0xa3, 0x84, 0x21, 0x3e, 0x15, 0x80, 0xa0, 0xd5, 0x1b, - 0x3e, 0x0d, 0x80, 0xa0, 0x84, 0x42, 0xae, 0x83, 0x44, 0x20, 0x00, 0x32, - 0x3c, 0x2f, 0x6d, 0xf8, 0x84, 0x50, 0x10, 0x20, 0x00, 0x08, 0x84, 0x41, - 0xae, 0x80, 0x44, 0x00, 0x04, 0x20, 0x3c, 0x0f, 0x6d, 0xf7, 0xd5, 0x09, - 0xa6, 0x03, 0xe6, 0x04, 0xe8, 0x03, 0x3e, 0x05, 0x80, 0xa8, 0x84, 0x21, - 0x3e, 0x15, 0x80, 0xa1, 0x84, 0x00, 0xd5, 0x03, 0x44, 0x00, 0x00, 0x1f, - 0x3a, 0x6f, 0x98, 0x04, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x08, 0x50, 0x00, 0x01, 0xa6, 0x45, 0xe6, 0x29, 0xe8, 0x03, 0x3e, 0x15, - 0xb4, 0xdb, 0xa6, 0x40, 0xe6, 0x29, 0xe8, 0x07, 0x2e, 0x35, 0xb4, 0xdb, - 0xe2, 0x61, 0xe9, 0x03, 0x3e, 0x15, 0xb4, 0xd7, 0x9d, 0x04, 0xa6, 0xe0, - 0xe6, 0x69, 0xe8, 0x14, 0x3e, 0x1d, 0xb3, 0xb4, 0x00, 0x20, 0x81, 0x27, - 0xe2, 0x43, 0xe9, 0x0e, 0x04, 0x20, 0x80, 0x0f, 0x00, 0x70, 0x81, 0x0a, - 0x10, 0x30, 0x81, 0x60, 0x44, 0x60, 0x00, 0x44, 0x42, 0x23, 0x98, 0x73, - 0xa7, 0x20, 0x10, 0x41, 0x00, 0x32, 0x84, 0x28, 0xd9, 0x13, 0x9c, 0x46, - 0xa6, 0x88, 0xe6, 0x44, 0xe8, 0x06, 0x3e, 0x25, 0x6a, 0xe2, 0xa6, 0x48, - 0x3e, 0x15, 0x24, 0x80, 0x9c, 0x07, 0xa6, 0x40, 0xe6, 0x22, 0xe8, 0x06, - 0x3e, 0x15, 0x6a, 0xe3, 0xa6, 0x00, 0x3e, 0x05, 0x24, 0x82, 0x3c, 0x0d, - 0x59, 0x77, 0xdd, 0x20, 0x2e, 0x15, 0xb4, 0xdb, 0x2e, 0x05, 0x6a, 0xab, - 0x94, 0x4a, 0x98, 0x48, 0x3e, 0x15, 0x6a, 0xaa, 0xec, 0x04, 0x3a, 0x6f, - 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0xa4, 0x83, 0xc2, 0x0e, 0xb4, 0x61, - 0xa4, 0x8f, 0x9a, 0x9a, 0xb6, 0x41, 0x84, 0x40, 0xac, 0x8f, 0xa4, 0x83, - 0xa0, 0xc2, 0x9e, 0x91, 0x96, 0x91, 0xac, 0x83, 0x38, 0x11, 0x8a, 0x0a, - 0xdd, 0x9e, 0x3e, 0x0d, 0xe7, 0x84, 0x04, 0x20, 0x00, 0x2e, 0x84, 0x20, - 0x14, 0x10, 0x00, 0x2b, 0xe6, 0x43, 0xe8, 0x04, 0x84, 0x21, 0x14, 0x10, - 0x00, 0x2e, 0xdd, 0x9e, 0x92, 0x00, 0x3e, 0x1d, 0x29, 0x44, 0x3e, 0x0d, - 0xe7, 0xe0, 0x44, 0x20, 0x00, 0x31, 0x84, 0x60, 0x1a, 0x20, 0x00, 0x03, - 0x3e, 0x5d, 0xe7, 0xf2, 0xac, 0x89, 0x18, 0x30, 0x80, 0x08, 0xd8, 0xf9, - 0xdd, 0x9e, 0x3e, 0x0d, 0x28, 0x74, 0x84, 0x3f, 0x1a, 0x10, 0x00, 0x01, - 0x3e, 0x5d, 0x28, 0x86, 0xd8, 0xfc, 0xdd, 0x9e, 0x92, 0x00, 0x3e, 0x1d, - 0x28, 0x74, 0x96, 0x01, 0xa5, 0x48, 0x9c, 0x4a, 0xd8, 0x03, 0x84, 0x01, - 0xd5, 0x05, 0x3e, 0x5d, 0x28, 0x86, 0xd9, 0xf9, 0x84, 0x00, 0xdd, 0x9e, - 0x92, 0x00, 0x84, 0x41, 0x96, 0x48, 0x96, 0x01, 0x4c, 0x11, 0x40, 0x13, - 0x3e, 0x2d, 0x28, 0x74, 0x84, 0x20, 0xa4, 0xd0, 0x44, 0x50, 0xff, 0xff, - 0x9c, 0x92, 0xdb, 0x06, 0x3e, 0x2d, 0x28, 0x74, 0x38, 0x01, 0x05, 0x09, - 0xd5, 0x16, 0x9c, 0x49, 0x84, 0xa9, 0xd9, 0xf4, 0xd5, 0x12, 0x84, 0xa2, - 0xd9, 0x10, 0x3e, 0x2d, 0x28, 0x74, 0x84, 0x20, 0xa5, 0x50, 0x9c, 0x92, - 0xd8, 0x07, 0x84, 0x5f, 0x3e, 0x0d, 0x28, 0x74, 0x38, 0x20, 0x05, 0x09, - 0xd5, 0x04, 0x9c, 0x49, 0x84, 0xa9, 0xd9, 0xf5, 0xdd, 0x9e, 0x96, 0x01, - 0x46, 0x10, 0x20, 0x18, 0xc8, 0x02, 0xd5, 0x0c, 0x84, 0x40, 0x3c, 0x2f, - 0x49, 0x14, 0xe6, 0x1e, 0xe8, 0x03, 0x84, 0x01, 0xd5, 0x05, 0x44, 0x50, - 0x00, 0x1e, 0xd8, 0x04, 0x84, 0x02, 0x3c, 0x0f, 0x49, 0x14, 0xdd, 0x9e, - 0x92, 0x00, 0x3c, 0x0d, 0x29, 0x94, 0xc0, 0x03, 0x84, 0x00, 0xd5, 0x03, - 0x2e, 0x05, 0x24, 0x50, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x01, 0x49, 0xff, 0xff, 0xe0, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x46, 0x10, 0x20, 0x18, - 0x2e, 0x2d, 0x24, 0x83, 0x96, 0x02, 0x4c, 0x20, 0x00, 0x78, 0x3e, 0x05, - 0x24, 0x83, 0x84, 0x20, 0x3e, 0x3d, 0xe8, 0x44, 0x3e, 0x7d, 0xe8, 0x84, - 0x99, 0x4b, 0x98, 0xcf, 0x3e, 0x2d, 0x5f, 0x98, 0x3e, 0x6d, 0x5f, 0xa0, - 0xa6, 0xd8, 0x99, 0x0a, 0xa7, 0x68, 0x98, 0x8e, 0xae, 0xd0, 0x9c, 0x49, - 0x84, 0x48, 0xaf, 0x60, 0x4c, 0x11, 0x7f, 0xee, 0x84, 0xad, 0xd8, 0x0a, - 0x2e, 0x15, 0x24, 0x80, 0x3e, 0x15, 0x6a, 0xe2, 0x3e, 0x1d, 0x24, 0x82, - 0x3e, 0x0d, 0x6a, 0xe3, 0xd5, 0x2e, 0x3c, 0x2d, 0x79, 0xef, 0x84, 0x20, - 0x9c, 0x97, 0x20, 0x31, 0x00, 0x00, 0x9e, 0x91, 0xe0, 0x03, 0xe9, 0x11, - 0x52, 0x10, 0x80, 0x08, 0x3e, 0x2d, 0xe7, 0x84, 0x96, 0xc8, 0x10, 0x31, - 0x00, 0x29, 0x10, 0x31, 0x00, 0x2a, 0x04, 0x21, 0x00, 0x0e, 0x38, 0x11, - 0x04, 0x00, 0x9a, 0x08, 0x96, 0x02, 0xd5, 0x05, 0x9c, 0x49, 0x84, 0xa8, - 0xd9, 0xe9, 0x84, 0x00, 0x96, 0x00, 0x9e, 0x81, 0x96, 0x90, 0xe6, 0x43, - 0xe8, 0x02, 0xd5, 0x02, 0x84, 0x00, 0x3e, 0x05, 0x6a, 0xe2, 0x84, 0x21, - 0x3e, 0x15, 0x6a, 0xe3, 0x3e, 0x1d, 0x6a, 0xe2, 0x3e, 0x0d, 0x24, 0x81, - 0xa6, 0x48, 0xae, 0x40, 0x3c, 0x0d, 0x59, 0x77, 0xdd, 0x20, 0x2e, 0x05, - 0x6a, 0xe3, 0x84, 0x63, 0x2e, 0x15, 0x6a, 0xe2, 0x40, 0x20, 0x00, 0x1a, - 0x40, 0x21, 0x80, 0x1b, 0x84, 0x00, 0x3e, 0x6d, 0xe8, 0x44, 0x98, 0xc6, - 0x3e, 0x7d, 0xe8, 0x84, 0x20, 0x61, 0x80, 0x00, 0x98, 0xc7, 0xa7, 0x18, - 0x3e, 0x7d, 0x5f, 0xa0, 0x3e, 0x3d, 0x5f, 0x98, 0x99, 0x43, 0x9b, 0xb1, - 0x98, 0xc7, 0x9b, 0x21, 0x9b, 0xb2, 0xaf, 0x18, 0x9c, 0x01, 0x84, 0x68, - 0xaf, 0xa8, 0x4c, 0x01, 0xff, 0xea, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, - 0xdd, 0x9e, 0x3e, 0x3d, 0x26, 0x00, 0x94, 0x83, 0x84, 0x20, 0x98, 0x9a, - 0x38, 0x11, 0x83, 0x09, 0xac, 0x52, 0xac, 0x51, 0xae, 0x56, 0xae, 0x57, - 0xdd, 0x9e, 0x3e, 0x1d, 0x26, 0x07, 0xa6, 0x08, 0x84, 0xa1, 0x8c, 0x28, - 0xd0, 0x05, 0x3e, 0x5d, 0x26, 0x4f, 0xd9, 0xfa, 0x84, 0x00, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0xe6, 0x09, - 0xe8, 0x07, 0x49, 0xff, 0xff, 0xe2, 0x49, 0xff, 0xff, 0xec, 0xc8, 0x0e, - 0xd5, 0x09, 0x84, 0xc0, 0x80, 0x06, 0x49, 0xff, 0xff, 0xda, 0x9d, 0xb1, - 0x84, 0xa9, 0xde, 0xfb, 0x84, 0x00, 0x3e, 0x05, 0x24, 0x7b, 0x3e, 0x05, - 0x24, 0x97, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3e, 0x2d, - 0x26, 0x07, 0x96, 0xc0, 0x80, 0x22, 0xa6, 0x08, 0x84, 0xa1, 0xd8, 0x04, - 0x00, 0x50, 0xff, 0xff, 0xd3, 0x15, 0x8c, 0x28, 0x50, 0x51, 0x00, 0x48, - 0xd9, 0xf7, 0x84, 0x20, 0xa7, 0x10, 0x96, 0x08, 0x8c, 0x48, 0xcc, 0x09, - 0x3e, 0x2d, 0x26, 0x00, 0x94, 0x4b, 0x98, 0x4a, 0x84, 0x41, 0xae, 0xce, - 0xae, 0x8f, 0xd5, 0x05, 0x9c, 0x49, 0x84, 0xa9, 0xd9, 0xf2, 0x84, 0x09, - 0xdd, 0x9e, 0x3e, 0x2d, 0x26, 0x00, 0x96, 0x48, 0x38, 0x01, 0x07, 0x09, - 0xdd, 0x9e, 0x96, 0x00, 0x3e, 0x1d, 0x26, 0x00, 0x94, 0x83, 0x98, 0x8a, - 0xa4, 0x92, 0x38, 0x20, 0x83, 0x09, 0xdd, 0x9e, 0x92, 0x00, 0x3e, 0x1d, - 0x26, 0x07, 0x96, 0x80, 0x84, 0x00, 0xa7, 0x08, 0x84, 0xa1, 0x9c, 0xc1, - 0xdc, 0x04, 0x00, 0x50, 0xff, 0xff, 0xd2, 0x05, 0x96, 0x18, 0x84, 0xa9, - 0x8c, 0x28, 0xd8, 0xf6, 0xdd, 0x9e, 0x96, 0x48, 0x3e, 0x2d, 0x26, 0x00, - 0x94, 0x4b, 0x98, 0x4a, 0xac, 0x09, 0xdd, 0x9e, 0x92, 0x00, 0x96, 0x00, - 0x3e, 0x1d, 0x26, 0x00, 0x94, 0x03, 0x98, 0x01, 0xa4, 0x01, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0x3c, 0x2e, 0x25, 0x6a, 0xe2, 0x2e, 0x15, - 0x6a, 0xe3, 0x94, 0x92, 0x96, 0x90, 0xc9, 0x0d, 0x46, 0x08, 0x10, 0x06, - 0xb4, 0x60, 0x42, 0x31, 0x98, 0x09, 0xb6, 0x60, 0xb4, 0x60, 0x42, 0x31, - 0xf8, 0x09, 0xb6, 0x60, 0x84, 0x7f, 0xd5, 0x11, 0x84, 0xa1, 0xd1, 0x03, - 0x84, 0x20, 0xd5, 0x0f, 0x46, 0x08, 0x10, 0x06, 0xb4, 0x20, 0x42, 0x10, - 0x98, 0x09, 0xb6, 0x20, 0x84, 0x22, 0xb4, 0x60, 0x42, 0x31, 0xf8, 0x08, - 0xb6, 0x60, 0x84, 0x63, 0x3e, 0x35, 0x6a, 0x9b, 0x99, 0x4a, 0x84, 0x20, - 0x46, 0xf0, 0x00, 0xaf, 0x02, 0x47, 0x85, 0x4c, 0x97, 0x68, 0x80, 0x01, - 0x3e, 0x3d, 0x5d, 0xa8, 0xd5, 0x0d, 0xa5, 0xf8, 0x00, 0x94, 0x80, 0x00, - 0x12, 0x74, 0x00, 0x00, 0x40, 0x74, 0x94, 0x01, 0x38, 0x71, 0x9c, 0x00, - 0x9c, 0x01, 0xaf, 0xf0, 0x9c, 0x4a, 0x46, 0x60, 0x00, 0xaf, 0x58, 0x63, - 0x0a, 0xb8, 0x3e, 0xad, 0x5c, 0xb8, 0x40, 0x90, 0x18, 0x00, 0x40, 0x80, - 0xa8, 0x00, 0x46, 0x60, 0x00, 0xaf, 0x58, 0x63, 0x0a, 0x84, 0x3e, 0xad, - 0x5d, 0x14, 0x99, 0xce, 0x40, 0x60, 0x28, 0x00, 0xe0, 0x04, 0xe9, 0xe0, - 0x84, 0x20, 0x46, 0xf0, 0x00, 0xaf, 0x02, 0x47, 0x85, 0x57, 0x80, 0x01, - 0xd5, 0x0c, 0xa5, 0xb0, 0x00, 0x84, 0x00, 0x00, 0xad, 0xb8, 0x40, 0x64, - 0x08, 0x01, 0x38, 0x61, 0x98, 0x00, 0x9c, 0x01, 0xaf, 0xa8, 0x9c, 0x4a, - 0x46, 0x50, 0x00, 0xaf, 0x58, 0x52, 0x8a, 0xc4, 0x3e, 0x6d, 0x5c, 0xd0, - 0x46, 0x90, 0x00, 0xaf, 0x58, 0x94, 0x8a, 0x9c, 0x3e, 0xad, 0x5d, 0x08, - 0x40, 0x80, 0x14, 0x00, 0x99, 0xce, 0x40, 0x50, 0x28, 0x00, 0x40, 0x60, - 0xa4, 0x00, 0xe0, 0x04, 0xe9, 0xe1, 0x3e, 0x1d, 0x5c, 0xd0, 0xa4, 0xcf, - 0x00, 0x25, 0x00, 0x07, 0x12, 0x30, 0x80, 0x09, 0x12, 0x30, 0x80, 0x08, - 0x46, 0x30, 0x00, 0xaf, 0x58, 0x31, 0x8a, 0xb0, 0x46, 0x10, 0x00, 0xaf, - 0x58, 0x10, 0x8a, 0xd0, 0xa5, 0x1a, 0xa5, 0x98, 0xa4, 0xd9, 0xa7, 0x4a, - 0x00, 0x90, 0x80, 0x00, 0x10, 0x25, 0x00, 0x09, 0x10, 0x25, 0x00, 0x08, - 0xa6, 0x49, 0x3e, 0x2d, 0x5c, 0xe8, 0x3e, 0x0d, 0x5d, 0x20, 0xad, 0x12, - 0xad, 0x90, 0xac, 0xd1, 0xaf, 0x42, 0x10, 0x90, 0x00, 0x00, 0xae, 0x41, - 0x84, 0x00, 0x46, 0x10, 0x00, 0xaf, 0x58, 0x10, 0x8a, 0xd8, 0x3e, 0x2d, - 0x5e, 0x4c, 0x46, 0x50, 0x00, 0xaf, 0x58, 0x52, 0x8b, 0x30, 0x99, 0x01, - 0x98, 0x42, 0x98, 0x85, 0x3e, 0xad, 0x5d, 0xf4, 0xa7, 0x20, 0xa6, 0x90, - 0x40, 0x30, 0x28, 0x00, 0x44, 0x60, 0x00, 0x55, 0x9c, 0x01, 0xaf, 0x18, - 0xae, 0x88, 0x4c, 0x03, 0x7f, 0xe8, 0x3a, 0x6f, 0xa8, 0x04, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x3c, 0x1d, 0x5b, 0x13, - 0x96, 0x01, 0x5c, 0xf0, 0x80, 0xc8, 0xe9, 0x03, 0x50, 0x10, 0x80, 0x5f, - 0x97, 0x88, 0x3c, 0x1d, 0x6b, 0xb3, 0x44, 0x50, 0x00, 0x40, 0xd1, 0x4b, - 0x5c, 0xf0, 0x80, 0x41, 0xe8, 0x1b, 0x84, 0xa5, 0xd1, 0x54, 0xe6, 0x26, - 0xe8, 0x09, 0x84, 0xa1, 0xd1, 0x3c, 0xc1, 0x56, 0x84, 0xa2, 0xd1, 0x49, - 0x84, 0xa4, 0xd9, 0x45, 0xd5, 0x48, 0x84, 0xa8, 0xd1, 0x4e, 0xe6, 0x29, - 0xe8, 0x06, 0x84, 0xa6, 0xd1, 0x46, 0x84, 0xa7, 0xd9, 0x3c, 0xd5, 0x45, - 0x8c, 0xa8, 0xd1, 0x2d, 0x8c, 0xb0, 0xd9, 0x37, 0xd5, 0x2c, 0x44, 0x50, - 0x30, 0x00, 0xd1, 0x35, 0x5c, 0xf0, 0xb0, 0x01, 0xe8, 0x10, 0x44, 0x50, - 0x00, 0x60, 0xd1, 0x29, 0x5c, 0xf0, 0x80, 0x61, 0xe8, 0x04, 0x8e, 0xb0, - 0xd9, 0x28, 0xd5, 0x21, 0x8c, 0xb0, 0xd1, 0x23, 0x44, 0x50, 0x20, 0x00, - 0xd9, 0x22, 0xd5, 0x13, 0x94, 0xec, 0x4c, 0x11, 0x80, 0x27, 0xe2, 0x61, - 0xe9, 0x07, 0x44, 0x50, 0x40, 0x00, 0xd1, 0x1d, 0x95, 0x6b, 0xd9, 0x17, - 0xd5, 0x1c, 0x44, 0x54, 0x00, 0x00, 0xd1, 0x1d, 0x44, 0x55, 0x00, 0x00, - 0xd9, 0x10, 0xd5, 0x1b, 0x84, 0x21, 0xd5, 0x1a, 0x84, 0x28, 0xd5, 0x18, - 0x84, 0x29, 0xd5, 0x16, 0x84, 0x2a, 0xd5, 0x14, 0x84, 0x2b, 0xd5, 0x12, - 0x84, 0x2c, 0xd5, 0x10, 0x84, 0x2d, 0xd5, 0x0e, 0x84, 0x2f, 0xd5, 0x0c, - 0x84, 0x22, 0xd5, 0x0a, 0x84, 0x23, 0xd5, 0x08, 0x84, 0x24, 0xd5, 0x06, - 0x84, 0x25, 0xd5, 0x04, 0x84, 0x26, 0xd5, 0x02, 0x84, 0x27, 0x54, 0x10, - 0x80, 0x0f, 0x50, 0x00, 0x28, 0x00, 0x40, 0x63, 0x68, 0x08, 0x40, 0x10, - 0xd8, 0x08, 0x96, 0x01, 0x40, 0x60, 0x98, 0x04, 0x5c, 0xf0, 0x06, 0x01, - 0x4e, 0xf3, 0x00, 0xc4, 0x3c, 0x1d, 0x59, 0x98, 0x46, 0x38, 0x10, 0x00, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x91, 0x80, 0x08, 0x04, 0x80, 0x00, 0x0a, - 0xdd, 0x21, 0x2e, 0x35, 0x24, 0x86, 0x44, 0x16, 0x00, 0x00, 0x40, 0x24, - 0x84, 0x02, 0x54, 0x31, 0x80, 0x7f, 0x40, 0x31, 0xa0, 0x08, 0x94, 0x93, - 0x54, 0x14, 0x00, 0x03, 0x40, 0x21, 0x0c, 0x04, 0x40, 0x10, 0xc8, 0x08, - 0x40, 0x21, 0x04, 0x04, 0x54, 0x00, 0x00, 0x07, 0x3c, 0x3d, 0x6b, 0xb4, - 0x40, 0x21, 0x18, 0x04, 0x40, 0x00, 0x3c, 0x08, 0x40, 0x21, 0x00, 0x04, - 0xc3, 0x07, 0x00, 0x01, 0x80, 0x2c, 0x94, 0x05, 0x96, 0x00, 0x40, 0x21, - 0x00, 0x04, 0x3c, 0x1d, 0x6b, 0xa6, 0x44, 0x50, 0x08, 0x00, 0xd1, 0x66, - 0x5c, 0xf0, 0x88, 0x01, 0xe8, 0x27, 0x44, 0x50, 0x00, 0x10, 0xd1, 0x52, - 0xe6, 0x31, 0xe8, 0x0f, 0x84, 0xa2, 0x4c, 0x12, 0x80, 0x81, 0xe6, 0x23, - 0xe8, 0x05, 0xc1, 0x7d, 0x84, 0xa1, 0xd9, 0x79, 0xd5, 0x7a, 0x84, 0xa4, - 0xd1, 0x41, 0x84, 0xa8, 0xd9, 0x74, 0xd5, 0x40, 0x95, 0x6b, 0xd1, 0x46, - 0x5c, 0xf0, 0x80, 0x81, 0xe8, 0x07, 0x44, 0x50, 0x00, 0x20, 0xd1, 0x3c, - 0x95, 0x69, 0xd9, 0x69, 0xd5, 0x3b, 0x95, 0x6a, 0xd1, 0x3f, 0x95, 0x69, - 0xd1, 0x3f, 0x44, 0x50, 0x01, 0x00, 0xd9, 0x61, 0xd5, 0x37, 0x94, 0xee, - 0x4c, 0x11, 0x80, 0x49, 0xe2, 0x61, 0xe9, 0x10, 0x94, 0x2b, 0x4c, 0x10, - 0x00, 0x3c, 0xe2, 0x01, 0xe9, 0x06, 0x95, 0x69, 0xd1, 0x33, 0x95, 0x69, - 0xd9, 0x52, 0xd5, 0x32, 0x95, 0x41, 0xd1, 0x34, 0x95, 0x42, 0xd9, 0x4d, - 0xd5, 0x34, 0x46, 0x50, 0x01, 0x00, 0x80, 0x05, 0xd1, 0x42, 0xe2, 0x01, - 0xe9, 0x07, 0x95, 0x59, 0xd1, 0x32, 0x46, 0x50, 0x00, 0x80, 0xd9, 0x41, - 0xd5, 0x31, 0x46, 0x50, 0x10, 0x00, 0xd1, 0x31, 0x46, 0x50, 0x20, 0x00, - 0xd1, 0x31, 0x46, 0x50, 0x02, 0x00, 0xd9, 0x37, 0xd5, 0x33, 0x84, 0x23, - 0xd5, 0x36, 0x84, 0x24, 0xd5, 0x34, 0x84, 0x25, 0xd5, 0x32, 0x84, 0x26, - 0xd5, 0x30, 0x84, 0x27, 0xd5, 0x2e, 0x84, 0x28, 0xd5, 0x2c, 0x84, 0x29, - 0xd5, 0x2a, 0x84, 0x2a, 0xd5, 0x28, 0x84, 0x2b, 0xd5, 0x26, 0x84, 0x2c, - 0xd5, 0x24, 0x84, 0x2d, 0xd5, 0x22, 0x84, 0x2e, 0xd5, 0x20, 0x84, 0x2f, - 0xd5, 0x1e, 0x44, 0x10, 0x00, 0x10, 0xd5, 0x1b, 0x44, 0x10, 0x00, 0x11, - 0xd5, 0x18, 0x44, 0x10, 0x00, 0x12, 0xd5, 0x15, 0x44, 0x10, 0x00, 0x13, - 0xd5, 0x12, 0x44, 0x10, 0x00, 0x14, 0xd5, 0x0f, 0x44, 0x10, 0x00, 0x15, - 0xd5, 0x0c, 0x44, 0x10, 0x00, 0x16, 0xd5, 0x09, 0x44, 0x10, 0x00, 0x17, - 0xd5, 0x06, 0x44, 0x10, 0x00, 0x18, 0xd5, 0x03, 0x44, 0x10, 0x00, 0x1f, - 0x54, 0x10, 0x80, 0x1f, 0x48, 0x00, 0x00, 0xa5, 0x46, 0x48, 0x10, 0x00, - 0x46, 0x38, 0x10, 0x00, 0x2e, 0x05, 0x24, 0x86, 0x04, 0x42, 0x03, 0xc4, - 0x3c, 0x1d, 0x78, 0xb1, 0x04, 0x21, 0x83, 0xc6, 0xc8, 0x04, 0x44, 0x00, - 0x00, 0x25, 0xd5, 0x16, 0x44, 0x50, 0x00, 0x18, 0xd8, 0x04, 0x44, 0x00, - 0x00, 0x26, 0xd5, 0x10, 0x44, 0x50, 0x00, 0x4e, 0xd8, 0x04, 0x44, 0x00, - 0x00, 0x27, 0xd5, 0x0a, 0xe6, 0x18, 0xe8, 0x03, 0x9e, 0x02, 0xd5, 0x02, - 0x9e, 0x04, 0x84, 0x62, 0x40, 0x00, 0x0c, 0x76, 0x96, 0x00, 0x54, 0x21, - 0x00, 0x03, 0x54, 0x32, 0x00, 0x07, 0x40, 0x31, 0xcc, 0x08, 0x40, 0x21, - 0x44, 0x08, 0x54, 0x10, 0x80, 0x03, 0x40, 0x21, 0x0c, 0x04, 0x40, 0x10, - 0xbc, 0x08, 0x40, 0x21, 0x04, 0x04, 0x54, 0x00, 0x00, 0x3f, 0x3c, 0x3d, - 0x6b, 0xb4, 0x40, 0x61, 0x18, 0x04, 0x40, 0x00, 0x24, 0x08, 0x40, 0x23, - 0x00, 0x04, 0xc3, 0x09, 0x00, 0x01, 0x80, 0x2c, 0xc0, 0x06, 0x54, 0x00, - 0x00, 0x07, 0x94, 0x06, 0x40, 0x21, 0x00, 0x04, 0x3c, 0x0d, 0x6b, 0xa9, - 0x44, 0x50, 0x10, 0x00, 0xd0, 0x39, 0x5c, 0xf0, 0x10, 0x01, 0xe8, 0x15, - 0x44, 0x50, 0x00, 0x10, 0xd0, 0x2b, 0xe6, 0x11, 0xe8, 0x08, 0x84, 0xa2, - 0xd0, 0x40, 0x84, 0xa4, 0xd0, 0x23, 0x84, 0xa1, 0xd8, 0x3b, 0xd5, 0x3b, - 0x95, 0x6c, 0xd0, 0x24, 0x95, 0x6a, 0xd0, 0x24, 0x44, 0x50, 0x00, 0x40, - 0xd8, 0x33, 0xd5, 0x1c, 0x94, 0x6d, 0x4c, 0x00, 0x80, 0x28, 0xe2, 0x20, - 0xe9, 0x09, 0x95, 0x6b, 0xd0, 0x1f, 0x95, 0x69, 0xd0, 0x1f, 0x44, 0x50, - 0x20, 0x00, 0xd8, 0x26, 0xd5, 0x17, 0x46, 0x50, 0x20, 0x00, 0xd0, 0x1e, - 0x46, 0x51, 0x00, 0x00, 0xd0, 0x1d, 0x46, 0x50, 0x10, 0x00, 0xd8, 0x1c, - 0xd5, 0x15, 0x84, 0x03, 0xd5, 0x1a, 0x84, 0x04, 0xd5, 0x18, 0x84, 0x05, - 0xd5, 0x16, 0x84, 0x06, 0xd5, 0x14, 0x84, 0x07, 0xd5, 0x12, 0x84, 0x08, - 0xd5, 0x10, 0x84, 0x09, 0xd5, 0x0e, 0x84, 0x0a, 0xd5, 0x0c, 0x84, 0x0b, - 0xd5, 0x0a, 0x84, 0x0c, 0xd5, 0x08, 0x84, 0x0d, 0xd5, 0x06, 0x84, 0x0e, - 0xd5, 0x04, 0x84, 0x0f, 0xd5, 0x02, 0x84, 0x00, 0x3c, 0x1d, 0x78, 0xb4, - 0xe6, 0x24, 0xe9, 0x02, 0x9e, 0x4b, 0x54, 0x00, 0x00, 0x0f, 0x96, 0x48, - 0x94, 0x02, 0x40, 0x20, 0x08, 0x04, 0x54, 0x10, 0x80, 0x03, 0x40, 0x01, - 0x04, 0x04, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x44, 0x10, - 0xdd, 0x00, 0x96, 0x01, 0x4c, 0x00, 0xc0, 0x12, 0x3c, 0x0d, 0x6b, 0xb4, - 0x00, 0x20, 0x00, 0x32, 0xa0, 0x01, 0xc0, 0x06, 0x46, 0x18, 0x10, 0x00, - 0x58, 0x10, 0x8f, 0x14, 0xd5, 0x1e, 0x46, 0x18, 0x10, 0x00, 0x58, 0x10, - 0x8f, 0x14, 0xd5, 0x24, 0x44, 0x50, 0xde, 0x00, 0xd8, 0x27, 0x3c, 0x1d, - 0x49, 0x2e, 0x00, 0x00, 0x80, 0x2f, 0xc8, 0x08, 0x2e, 0x2d, 0x6a, 0x92, - 0x2e, 0x0d, 0x6a, 0x93, 0x98, 0x90, 0x90, 0x41, 0xd5, 0x03, 0x20, 0x20, - 0x80, 0x20, 0xa0, 0x49, 0x96, 0x90, 0xc1, 0x0c, 0x46, 0x18, 0x10, 0x00, - 0x58, 0x10, 0x8f, 0x1c, 0xb4, 0x01, 0x92, 0x18, 0x40, 0x00, 0x20, 0x08, - 0x40, 0x01, 0x00, 0x04, 0xd5, 0x2c, 0x46, 0x18, 0x10, 0x00, 0x58, 0x10, - 0x8f, 0x1c, 0xb4, 0x01, 0x44, 0x10, 0xff, 0x00, 0x40, 0x00, 0x04, 0x02, - 0xd5, 0xf4, 0x44, 0x50, 0xd6, 0x00, 0xd8, 0x08, 0x46, 0x18, 0x10, 0x00, - 0x3c, 0x0d, 0x79, 0xf1, 0x58, 0x10, 0x80, 0x20, 0xd5, 0x0c, 0x44, 0x50, - 0xd7, 0x00, 0xd0, 0x03, 0x84, 0x00, 0xd5, 0x13, 0x46, 0x18, 0x10, 0x00, - 0x3c, 0x0d, 0x79, 0xf1, 0x58, 0x10, 0x80, 0x2c, 0xb4, 0x21, 0xc0, 0x06, - 0xa4, 0x00, 0x54, 0x00, 0x00, 0x0f, 0x40, 0x00, 0x28, 0x08, 0x54, 0x10, - 0x83, 0xff, 0x40, 0x00, 0x04, 0x04, 0x96, 0x01, 0xdd, 0x9e, 0x44, 0x10, - 0xdd, 0x00, 0x96, 0x01, 0x4c, 0x00, 0x80, 0x05, 0x44, 0x50, 0xd6, 0x00, - 0xd8, 0x06, 0x46, 0x08, 0x10, 0x00, 0x58, 0x00, 0x0f, 0x90, 0xd5, 0x0d, - 0x44, 0x50, 0xde, 0x00, 0xd0, 0x06, 0x44, 0x50, 0xd7, 0x00, 0xd0, 0x03, - 0x84, 0x00, 0xd5, 0x0c, 0x46, 0x08, 0x10, 0x00, 0x58, 0x00, 0x0f, 0x94, - 0xb4, 0x20, 0xa6, 0x09, 0xa6, 0x48, 0x40, 0x00, 0x20, 0x08, 0x98, 0x01, - 0x96, 0x01, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x96, 0x00, - 0x49, 0xfe, 0xe6, 0x3d, 0x92, 0x00, 0x80, 0xc0, 0xc0, 0x16, 0x00, 0x00, - 0x01, 0x36, 0xc8, 0x13, 0xb4, 0x06, 0x42, 0x00, 0x1c, 0x09, 0x84, 0x21, - 0x10, 0x13, 0x01, 0x3c, 0x84, 0x21, 0xb6, 0x06, 0xa8, 0x72, 0x3c, 0x1d, - 0x59, 0x4b, 0x00, 0x03, 0x01, 0x37, 0xdd, 0x21, 0xa0, 0x31, 0x58, 0x00, - 0x00, 0x04, 0xa8, 0x31, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xfc, 0x44, 0x10, 0xdd, 0x00, 0x96, 0x01, 0x4c, 0x00, - 0xc0, 0x3c, 0x3c, 0x7d, 0x6b, 0xb4, 0x4e, 0x72, 0x01, 0x18, 0x46, 0x08, - 0x10, 0x00, 0xa0, 0xf9, 0x04, 0x00, 0x03, 0xc5, 0xc3, 0x13, 0x42, 0x80, - 0x48, 0x0b, 0x42, 0x20, 0x4c, 0x0b, 0x40, 0x10, 0x38, 0x08, 0x40, 0x84, - 0x08, 0x08, 0x94, 0x93, 0x40, 0x84, 0x08, 0x04, 0x92, 0x3e, 0x42, 0x00, - 0x50, 0x0b, 0x40, 0x84, 0x04, 0x04, 0x94, 0x04, 0xd5, 0x0c, 0x42, 0x80, - 0x18, 0x0b, 0x42, 0x10, 0x1c, 0x0b, 0x40, 0x84, 0x10, 0x08, 0x94, 0x4d, - 0x40, 0x84, 0x04, 0x04, 0x54, 0x00, 0x00, 0x0f, 0x40, 0x84, 0x00, 0x04, - 0x00, 0x03, 0x80, 0x2c, 0x40, 0x84, 0x60, 0x08, 0x49, 0xfe, 0xe5, 0xeb, - 0x02, 0x60, 0x00, 0x86, 0xa0, 0x39, 0x84, 0x20, 0x40, 0x63, 0x20, 0x08, - 0x40, 0x00, 0x80, 0x06, 0x58, 0x63, 0x00, 0x08, 0xd5, 0x44, 0x44, 0x50, - 0xde, 0x00, 0xd8, 0x48, 0x3c, 0x7d, 0x49, 0x2e, 0x4e, 0x72, 0x00, 0xdb, - 0x46, 0x08, 0x10, 0x00, 0xa0, 0xf9, 0x04, 0x00, 0x03, 0xc7, 0xc3, 0x13, - 0x42, 0x80, 0x48, 0x0b, 0x42, 0x20, 0x4c, 0x0b, 0x40, 0x10, 0x38, 0x08, - 0x40, 0x84, 0x08, 0x08, 0x94, 0x93, 0x40, 0x84, 0x08, 0x04, 0x92, 0x3e, - 0x42, 0x00, 0x50, 0x0b, 0x40, 0x84, 0x04, 0x04, 0x94, 0x04, 0xd5, 0x0c, - 0x42, 0x80, 0x18, 0x0b, 0x42, 0x10, 0x1c, 0x0b, 0x40, 0x84, 0x10, 0x08, - 0x94, 0x4d, 0x40, 0x84, 0x04, 0x04, 0x54, 0x00, 0x00, 0x0f, 0x40, 0x84, - 0x00, 0x04, 0x00, 0x03, 0x80, 0x2c, 0x40, 0x84, 0x60, 0x08, 0x49, 0xfe, - 0xe5, 0xae, 0x04, 0x13, 0x80, 0x0f, 0x02, 0x60, 0x00, 0x86, 0x04, 0x10, - 0x80, 0x08, 0xa0, 0x39, 0x54, 0x10, 0x80, 0x0f, 0x84, 0x40, 0x40, 0x63, - 0x20, 0x08, 0x94, 0x4a, 0x40, 0x01, 0x00, 0x06, 0x40, 0x63, 0x04, 0x04, - 0x98, 0x00, 0x40, 0x63, 0x00, 0x04, 0x40, 0x63, 0x20, 0x04, 0x48, 0x00, - 0x00, 0x99, 0x44, 0x50, 0xd6, 0x00, 0xd8, 0x44, 0x46, 0x08, 0x10, 0x00, - 0x04, 0x00, 0x00, 0x08, 0x46, 0x30, 0x01, 0x80, 0x40, 0x60, 0x7c, 0x09, - 0x42, 0x20, 0x38, 0x0b, 0x42, 0x10, 0x3c, 0x0b, 0x95, 0xb2, 0x40, 0x63, - 0x08, 0x04, 0x98, 0x49, 0x40, 0x20, 0x0c, 0x02, 0x92, 0x50, 0x42, 0x00, - 0x54, 0x0b, 0x40, 0x63, 0x04, 0x04, 0x40, 0x63, 0x08, 0x04, 0x94, 0x85, - 0x3c, 0x0d, 0x5b, 0x44, 0x40, 0x63, 0x08, 0x04, 0x40, 0x63, 0x60, 0x08, - 0xc0, 0x74, 0x04, 0x10, 0x00, 0x09, 0x00, 0x70, 0x80, 0x08, 0x3c, 0x5d, - 0x79, 0xf2, 0xd8, 0x03, 0x84, 0x01, 0xd5, 0x0e, 0x00, 0x00, 0x00, 0x2c, - 0x49, 0xfd, 0xe1, 0x27, 0xc0, 0x08, 0x02, 0x00, 0x01, 0x0e, 0x49, 0xff, - 0xfa, 0x90, 0xc0, 0x03, 0x84, 0x02, 0xd5, 0x02, 0x84, 0x00, 0x2e, 0x15, - 0x6a, 0xcb, 0x54, 0x23, 0x80, 0x3f, 0x94, 0x96, 0x40, 0x10, 0xc0, 0x08, - 0x40, 0x11, 0x04, 0x04, 0x58, 0x10, 0x80, 0x04, 0xd5, 0x4a, 0x44, 0x50, - 0xd7, 0x00, 0xd8, 0x4e, 0x46, 0x08, 0x10, 0x00, 0x04, 0x00, 0x00, 0x0b, - 0x46, 0x30, 0x01, 0x80, 0x40, 0x60, 0x7c, 0x09, 0x42, 0x20, 0x38, 0x0b, - 0x42, 0x10, 0x3c, 0x0b, 0x95, 0xb2, 0x40, 0x63, 0x08, 0x04, 0x98, 0x49, - 0x40, 0x20, 0x0c, 0x02, 0x40, 0x63, 0x04, 0x04, 0x92, 0x50, 0x42, 0x00, - 0x54, 0x0b, 0x40, 0x63, 0x08, 0x04, 0x94, 0x05, 0x3c, 0x7d, 0x49, 0x2f, - 0x40, 0x63, 0x00, 0x04, 0x40, 0x63, 0x60, 0x08, 0xc7, 0x2e, 0x3c, 0x8d, - 0x49, 0x30, 0x3c, 0x9d, 0x49, 0x31, 0x3c, 0x5d, 0x79, 0xf2, 0xdf, 0x03, - 0x84, 0x01, 0xd5, 0x0f, 0x00, 0x03, 0x80, 0x2c, 0x49, 0xfd, 0xe0, 0xe1, - 0xc0, 0x09, 0x02, 0x00, 0x01, 0x0e, 0x49, 0xff, 0xfa, 0x4a, 0x92, 0x00, - 0xc0, 0x03, 0x84, 0x02, 0xd5, 0x02, 0x84, 0x00, 0x00, 0x23, 0x80, 0x20, - 0x54, 0x34, 0x80, 0x3f, 0x54, 0x14, 0x00, 0x1f, 0x94, 0xde, 0x98, 0x49, - 0x40, 0x11, 0x84, 0x04, 0x40, 0x21, 0x40, 0x08, 0x40, 0x10, 0x88, 0x04, - 0x40, 0x60, 0x98, 0x04, 0x40, 0x00, 0x30, 0x08, 0x40, 0x63, 0x00, 0x04, - 0xd5, 0x02, 0x84, 0xc0, 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x3c, 0x1d, 0x53, 0x8f, 0x97, 0xc1, - 0x42, 0x00, 0xf8, 0x0b, 0xc0, 0x05, 0x3c, 0x0d, 0x53, 0x8c, 0x96, 0x04, - 0xc8, 0x19, 0x4e, 0x14, 0x00, 0xe9, 0x3e, 0x0d, 0x4e, 0x04, 0x04, 0x10, - 0x00, 0x0b, 0x96, 0x4c, 0x4e, 0x12, 0x00, 0xe2, 0x3c, 0x2d, 0x6b, 0xa8, - 0x84, 0xaa, 0xd2, 0x04, 0x2e, 0x15, 0xae, 0xbe, 0xc1, 0x03, 0x84, 0x20, - 0xd5, 0x06, 0xa6, 0x46, 0xc9, 0x05, 0x84, 0x21, 0x3e, 0x15, 0x24, 0x85, - 0xae, 0x46, 0x46, 0x08, 0x10, 0x02, 0x04, 0x80, 0x00, 0x0e, 0x54, 0x04, - 0x0f, 0xff, 0xc8, 0x04, 0x84, 0x21, 0x3e, 0x15, 0x24, 0x85, 0x44, 0x50, - 0xe3, 0x00, 0x46, 0x10, 0x20, 0x18, 0xdf, 0x22, 0x3c, 0x6d, 0x53, 0x8b, - 0x54, 0x24, 0x00, 0xff, 0x54, 0x63, 0x01, 0xff, 0x44, 0x0f, 0xe3, 0x00, - 0x95, 0xb3, 0x3e, 0x3d, 0x6f, 0x74, 0x99, 0xb3, 0x40, 0x21, 0x00, 0x04, - 0x40, 0x04, 0x20, 0x09, 0xac, 0x31, 0xac, 0xb0, 0x46, 0x08, 0x10, 0x02, - 0x04, 0x00, 0x00, 0x0d, 0x93, 0x18, 0x94, 0x04, 0x40, 0x80, 0x20, 0x04, - 0x84, 0x00, 0x3e, 0x05, 0x24, 0x85, 0x14, 0x83, 0x00, 0x01, 0x48, 0x00, - 0x00, 0x83, 0x2e, 0x05, 0x24, 0x85, 0x4e, 0x02, 0x00, 0x8e, 0x80, 0x05, - 0x49, 0xff, 0xff, 0xa7, 0x48, 0x00, 0x00, 0x89, 0x9d, 0x51, 0xd8, 0x03, - 0x84, 0x42, 0xd5, 0x09, 0x3c, 0x0d, 0x29, 0xae, 0xdd, 0x20, 0x84, 0x23, - 0x40, 0x20, 0x00, 0x1a, 0x40, 0x20, 0x80, 0x1b, 0x3c, 0x1d, 0x6b, 0xa8, - 0x44, 0x50, 0x01, 0x00, 0xd9, 0x03, 0x84, 0x2f, 0xd5, 0x2e, 0x84, 0xa1, - 0xd1, 0x2c, 0x84, 0x63, 0x4c, 0x11, 0x80, 0x2a, 0xc1, 0x28, 0x84, 0xa2, - 0xd1, 0x26, 0x9e, 0x0c, 0xe2, 0x03, 0xe8, 0x03, 0x84, 0x24, 0xd5, 0x21, - 0x8c, 0xae, 0xd9, 0x03, 0x84, 0x25, 0xd5, 0x1d, 0x84, 0xaf, 0xd9, 0x03, - 0x84, 0x26, 0xd5, 0x19, 0x84, 0xaa, 0xd1, 0x17, 0x84, 0x0b, 0x4c, 0x10, - 0x40, 0x04, 0x80, 0x20, 0xd5, 0x12, 0x44, 0x50, 0x00, 0x80, 0xd9, 0x03, - 0x84, 0x2c, 0xd5, 0x0d, 0x9d, 0x69, 0xd9, 0x03, 0x84, 0x2d, 0xd5, 0x09, - 0x56, 0x40, 0x80, 0x82, 0x84, 0x09, 0x84, 0x6e, 0x40, 0x11, 0x90, 0x1a, - 0x40, 0x10, 0x10, 0x1b, 0x54, 0x21, 0x00, 0x03, 0x94, 0x94, 0x40, 0x84, - 0x18, 0x08, 0x40, 0x81, 0x20, 0x04, 0x54, 0x10, 0x80, 0x0f, 0x40, 0x14, - 0x04, 0x04, 0xac, 0x71, 0x80, 0x07, 0x49, 0xff, 0xfb, 0xa2, 0x44, 0x10, - 0xd6, 0x00, 0xa8, 0x31, 0x4c, 0x70, 0x80, 0x0b, 0x44, 0x50, 0xdd, 0x00, - 0xd7, 0x07, 0x44, 0x50, 0xd7, 0x00, 0xd7, 0x04, 0x44, 0x50, 0xde, 0x00, - 0xdf, 0x1c, 0x3c, 0x2d, 0x53, 0x8b, 0xa5, 0x30, 0x9c, 0x91, 0x58, 0x42, - 0x00, 0x80, 0xad, 0x30, 0x54, 0x31, 0x01, 0xff, 0x3c, 0x2f, 0x53, 0x8b, - 0x94, 0xdb, 0x3e, 0x1d, 0x6f, 0x74, 0x80, 0x07, 0x99, 0x99, 0x49, 0xff, - 0xfd, 0x6c, 0xac, 0x31, 0x80, 0x07, 0x49, 0xff, 0xfd, 0xc8, 0xac, 0x30, - 0x80, 0x07, 0x49, 0xff, 0xfe, 0x06, 0xa8, 0x31, 0xc6, 0x20, 0x3c, 0x1d, - 0x53, 0x8b, 0x3e, 0x3d, 0x6f, 0x74, 0x9c, 0x49, 0x54, 0x20, 0x81, 0xff, - 0x94, 0x93, 0x98, 0x93, 0x84, 0x7f, 0xac, 0xd0, 0x3c, 0x1f, 0x53, 0x8b, - 0xd5, 0x12, 0x3c, 0x6d, 0x53, 0x8b, 0x54, 0x63, 0x01, 0xff, 0x95, 0xb3, - 0x3c, 0x0d, 0x60, 0xf0, 0x3e, 0x1d, 0x6f, 0x74, 0x99, 0xb1, 0x84, 0x4f, - 0xad, 0xf0, 0x4c, 0x01, 0x7f, 0x6d, 0x84, 0x41, 0x48, 0xff, 0xff, 0x76, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x84, 0x20, 0x3e, 0x15, 0x24, 0x6f, 0x84, 0xa7, 0xd8, 0x06, 0x3e, 0x15, - 0x24, 0x70, 0x44, 0x00, 0xdd, 0x00, 0xd5, 0x0a, 0x84, 0xa3, 0xd8, 0x04, - 0x44, 0x00, 0xdc, 0x00, 0xd5, 0x05, 0x84, 0xa5, 0xd8, 0x05, 0x44, 0x00, - 0xde, 0x00, 0x49, 0xff, 0xfe, 0xf2, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x3e, 0x0c, 0xa2, 0x9c, - 0xa6, 0x83, 0xa6, 0x42, 0x85, 0x00, 0x98, 0x51, 0x96, 0x48, 0xf1, 0x81, - 0x83, 0x80, 0x80, 0xc8, 0x85, 0x21, 0x3e, 0x7d, 0xe7, 0x84, 0xd5, 0x4d, - 0x00, 0x0e, 0x00, 0x02, 0x8d, 0x01, 0x00, 0x1e, 0x00, 0x03, 0xe3, 0x20, - 0xe8, 0x03, 0x84, 0x00, 0xd5, 0x04, 0x98, 0x08, 0x40, 0x04, 0x00, 0x07, - 0xc8, 0x1d, 0x80, 0x08, 0x49, 0xfd, 0xdf, 0x87, 0xc0, 0x39, 0xb4, 0x20, - 0x54, 0x10, 0x80, 0x04, 0xc1, 0x35, 0x02, 0x10, 0x00, 0xa1, 0x2e, 0x25, - 0x6b, 0x1c, 0xe2, 0x22, 0xe8, 0x2f, 0x00, 0x23, 0x80, 0x4a, 0x9d, 0xb1, - 0xe2, 0x22, 0xe8, 0x03, 0x10, 0x13, 0x80, 0x4a, 0x02, 0x00, 0x00, 0xa1, - 0x00, 0x13, 0x80, 0x4b, 0xe2, 0x20, 0xe8, 0x22, 0xd5, 0x1f, 0x80, 0x08, - 0x49, 0xfe, 0xe3, 0xa9, 0xc0, 0x1d, 0xb4, 0x20, 0x54, 0x10, 0x80, 0x02, - 0xc1, 0x19, 0x2e, 0x25, 0x6b, 0x1c, 0x02, 0x10, 0x00, 0x1b, 0x92, 0x41, - 0xe2, 0x22, 0xe8, 0x12, 0x00, 0x23, 0x80, 0x4a, 0x98, 0x49, 0x9d, 0xb1, - 0xe0, 0x22, 0xe8, 0x03, 0x10, 0x13, 0x80, 0x4a, 0x02, 0x00, 0x00, 0x1b, - 0x00, 0x13, 0x80, 0x4b, 0x98, 0x00, 0xe0, 0x20, 0xe8, 0x03, 0x10, 0x03, - 0x80, 0x4b, 0x8d, 0x21, 0x54, 0x94, 0x80, 0xff, 0xf0, 0x01, 0xe3, 0x20, - 0xe9, 0xb2, 0x3e, 0x7d, 0xe7, 0x84, 0xc6, 0x1e, 0x04, 0x03, 0x80, 0x25, - 0x84, 0x21, 0x10, 0x13, 0x80, 0x3e, 0x58, 0x00, 0x00, 0x04, 0x3c, 0x1d, - 0x5a, 0x5a, 0x96, 0x00, 0xdd, 0x21, 0x84, 0xa1, 0xde, 0x08, 0x3c, 0x02, - 0xb5, 0xe1, 0x3c, 0x1d, 0x5a, 0x3b, 0x58, 0x00, 0x00, 0x08, 0xd5, 0x07, - 0x3c, 0x02, 0xb5, 0xe1, 0x3c, 0x1d, 0x5a, 0x3b, 0x58, 0x00, 0x00, 0x88, - 0x96, 0x01, 0xdd, 0x21, 0xd5, 0x18, 0x3c, 0x02, 0xb5, 0xe1, 0x44, 0x20, - 0xff, 0x77, 0x3c, 0x1d, 0x5a, 0x3b, 0x10, 0x63, 0x80, 0x3e, 0x40, 0x00, - 0x08, 0x02, 0xdd, 0x21, 0x00, 0x03, 0x80, 0x94, 0x3c, 0x1d, 0x5a, 0x5a, - 0x54, 0x00, 0x00, 0xfb, 0xdd, 0x21, 0x84, 0x1f, 0x10, 0x63, 0x80, 0x4b, - 0x10, 0x03, 0x80, 0x4a, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0x3e, 0x6d, 0x27, 0x62, 0x80, 0xe1, - 0x54, 0x80, 0x00, 0xff, 0x85, 0x22, 0xa6, 0x70, 0x9e, 0x36, 0x4c, 0x14, - 0x40, 0x09, 0x80, 0x27, 0x84, 0x46, 0x49, 0xff, 0x43, 0xd0, 0xc8, 0x03, - 0x10, 0x93, 0x00, 0x00, 0x9d, 0xb7, 0x3e, 0x0d, 0x28, 0x7a, 0x4c, 0x60, - 0x7f, 0xf2, 0x80, 0x08, 0x80, 0x27, 0x49, 0xff, 0xf1, 0xd6, 0x92, 0x00, - 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, - 0x3e, 0x8d, 0x27, 0x62, 0x81, 0x21, 0x54, 0xa0, 0x00, 0xff, 0x44, 0x60, - 0x00, 0x28, 0x84, 0xe0, 0x47, 0xc0, 0x00, 0x87, 0x59, 0xce, 0x09, 0x44, - 0x00, 0x14, 0x00, 0x00, 0x50, 0x04, 0x7f, 0xfa, 0x4c, 0x15, 0x40, 0x09, - 0x80, 0x29, 0x84, 0x46, 0xdd, 0x3c, 0xc8, 0x04, 0x44, 0x00, 0x00, 0x1f, - 0xd5, 0x26, 0x44, 0x10, 0x00, 0x28, 0x9c, 0x39, 0x4c, 0x60, 0xc0, 0x08, - 0x00, 0x14, 0x00, 0x00, 0x56, 0x10, 0x80, 0x02, 0x40, 0x63, 0x84, 0x1a, - 0x97, 0xc0, 0x44, 0x50, 0x00, 0x28, 0x8d, 0x07, 0xdf, 0xe4, 0x4c, 0x63, - 0xc0, 0x04, 0x84, 0x07, 0xd5, 0x12, 0x84, 0x07, 0x42, 0x63, 0x00, 0x24, - 0x3e, 0x1d, 0x27, 0x5c, 0x99, 0xb1, 0x10, 0xa3, 0x00, 0x06, 0x80, 0x29, - 0x84, 0x46, 0x80, 0x06, 0x49, 0xff, 0x43, 0x69, 0x80, 0x0a, 0x80, 0x29, - 0x49, 0xff, 0xf1, 0x55, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x2e, 0x35, 0x6b, 0x4e, - 0x84, 0xe1, 0x84, 0x00, 0x3e, 0x5d, 0xaa, 0x5c, 0x3e, 0x4d, 0xa8, 0x20, - 0x96, 0x40, 0x54, 0x20, 0x00, 0x07, 0x92, 0x23, 0x40, 0x23, 0x88, 0x0c, - 0x38, 0x62, 0x84, 0x00, 0x96, 0x90, 0x40, 0x83, 0x08, 0x02, 0x9c, 0x01, - 0x4e, 0x82, 0x00, 0x11, 0x38, 0x92, 0x04, 0x00, 0x40, 0x81, 0x08, 0x05, - 0x40, 0x21, 0x24, 0x02, 0x40, 0x64, 0x18, 0x02, 0x50, 0x81, 0x80, 0x01, - 0xca, 0x05, 0x38, 0x62, 0x84, 0x08, 0x54, 0x34, 0x00, 0xff, 0x44, 0x10, - 0x00, 0x4f, 0x4c, 0x00, 0xff, 0xe1, 0x3e, 0x35, 0x6b, 0x4e, 0x80, 0x24, - 0x84, 0x4a, 0x3e, 0x0d, 0x25, 0x70, 0x49, 0xff, 0x43, 0x2c, 0xec, 0x04, - 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x3e, 0x1d, 0x27, 0x62, 0x96, 0x00, 0x84, 0x42, 0x18, 0x20, 0x80, 0x07, - 0x3e, 0x5d, 0x28, 0x7a, 0xd9, 0xfc, 0xc0, 0x04, 0x49, 0xfe, 0xe2, 0x69, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x3c, 0x2d, 0x6b, 0xb3, 0x97, 0xc0, 0x40, 0x01, - 0x30, 0x08, 0x92, 0x1c, 0xc8, 0x2f, 0x3c, 0x1d, 0x6b, 0xb5, 0x44, 0x50, - 0x30, 0x00, 0xd9, 0x2a, 0x3c, 0x1d, 0x77, 0xa4, 0x44, 0x00, 0x00, 0x15, - 0xdd, 0x21, 0x80, 0xc0, 0x3c, 0x0d, 0x53, 0x93, 0x54, 0x00, 0x00, 0x02, - 0xc0, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x06, - 0x44, 0x00, 0x31, 0x05, 0x80, 0x26, 0x49, 0xfe, 0xc1, 0x10, 0xc6, 0x14, - 0x3c, 0x5d, 0x6b, 0xb4, 0xd6, 0x06, 0x3c, 0x1d, 0x59, 0x4d, 0x44, 0x00, - 0x00, 0x73, 0xdd, 0x21, 0x3c, 0x6f, 0x6b, 0xb6, 0x80, 0x06, 0x84, 0x24, - 0x49, 0xff, 0x1a, 0x47, 0x44, 0x00, 0x20, 0x00, 0x3c, 0x0f, 0x6b, 0xb5, - 0xd5, 0x05, 0x80, 0x07, 0x49, 0xff, 0xef, 0x8f, 0x92, 0x00, 0xec, 0x04, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x46, 0x28, - 0x10, 0x00, 0x50, 0x60, 0x00, 0x1c, 0x84, 0x02, 0x81, 0x01, 0x04, 0x91, - 0x00, 0x0b, 0x4c, 0x10, 0x00, 0x07, 0x3c, 0x0d, 0x6b, 0xdc, 0x84, 0x26, - 0x4c, 0x00, 0xc0, 0x1f, 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0c, - 0x42, 0x10, 0xc0, 0x0b, 0xc1, 0x03, 0x48, 0x00, 0x00, 0xf3, 0x42, 0x94, - 0xe8, 0x0b, 0x4e, 0x92, 0x02, 0x28, 0x3c, 0x2d, 0x6b, 0x19, 0x84, 0xeb, - 0x9c, 0x91, 0x3c, 0x2f, 0x6b, 0x19, 0x84, 0x45, 0xa0, 0x37, 0x00, 0x30, - 0x01, 0x4b, 0x42, 0x01, 0x88, 0x73, 0x10, 0x10, 0x01, 0x4e, 0x48, 0x00, - 0x02, 0x1c, 0x54, 0x44, 0x00, 0x0f, 0x44, 0x30, 0xcd, 0x18, 0x40, 0x31, - 0x90, 0x0e, 0x96, 0xdc, 0xcb, 0x18, 0x44, 0x50, 0x00, 0x17, 0x4c, 0x82, - 0x80, 0x36, 0x84, 0xac, 0x4c, 0x82, 0x80, 0x33, 0x84, 0xad, 0x4c, 0x82, - 0x80, 0x30, 0x8c, 0xb9, 0x4c, 0x82, 0x80, 0x2d, 0x8c, 0xb1, 0x4c, 0x82, - 0x80, 0x2a, 0x8e, 0xab, 0x4c, 0x82, 0x80, 0x27, 0x8c, 0xb1, 0x4c, 0x82, - 0xc1, 0xd3, 0xd5, 0x22, 0xa0, 0x37, 0x84, 0xe1, 0x02, 0x10, 0x00, 0x9a, - 0x9c, 0x49, 0x12, 0x10, 0x00, 0x9a, 0x2e, 0x55, 0x24, 0x75, 0xd7, 0x04, - 0x2e, 0x55, 0x24, 0x68, 0xdf, 0x15, 0xa0, 0x37, 0x00, 0x10, 0x01, 0x6d, - 0xc1, 0x11, 0x00, 0x13, 0x00, 0x12, 0x84, 0xa1, 0xd9, 0x0d, 0x00, 0x20, - 0x01, 0x4b, 0x84, 0x25, 0x42, 0x01, 0x04, 0x73, 0x84, 0x20, 0x50, 0x00, - 0x01, 0x48, 0xae, 0x46, 0x84, 0xeb, 0x48, 0x00, 0x01, 0xdc, 0x40, 0x14, - 0xb4, 0x08, 0x92, 0x3d, 0x4e, 0x12, 0x01, 0x78, 0x3c, 0x0d, 0x5b, 0x18, - 0x84, 0xa3, 0xd8, 0x0b, 0xa0, 0x37, 0x84, 0x45, 0x00, 0x50, 0x01, 0x4b, - 0x42, 0x14, 0xbc, 0x0b, 0x42, 0x02, 0x88, 0x73, 0x10, 0x10, 0x01, 0x4f, - 0xa0, 0x37, 0x84, 0xa5, 0x00, 0x10, 0x01, 0x4b, 0x80, 0x40, 0x42, 0x20, - 0x94, 0x73, 0x42, 0x74, 0xbc, 0x0b, 0x00, 0x21, 0x01, 0x4f, 0x4c, 0x71, - 0x00, 0x71, 0xc9, 0x6f, 0x3c, 0x2d, 0x5b, 0x18, 0x84, 0xe6, 0x4c, 0x23, - 0x80, 0x6b, 0x84, 0xe7, 0x4c, 0x23, 0x80, 0x68, 0x84, 0xe8, 0x4c, 0x23, - 0x80, 0x65, 0x3c, 0x1d, 0x6b, 0x1a, 0x9c, 0x49, 0x3c, 0x1f, 0x6b, 0x1a, - 0xa0, 0x37, 0x00, 0x10, 0x01, 0x4b, 0x42, 0x00, 0x94, 0x73, 0x80, 0xa0, - 0x84, 0x01, 0x10, 0x02, 0x81, 0x4e, 0x00, 0x03, 0x00, 0x10, 0xa1, 0xf7, - 0x49, 0xfd, 0xdd, 0x6d, 0xa0, 0x77, 0x00, 0x10, 0x81, 0x6d, 0xc1, 0x32, - 0x04, 0x13, 0x80, 0x0f, 0xc9, 0x04, 0x04, 0x20, 0x00, 0x92, 0xc2, 0x08, - 0x04, 0x73, 0x80, 0x0d, 0xcf, 0x29, 0x04, 0x00, 0x00, 0x92, 0x84, 0xa1, - 0xd8, 0x25, 0x3c, 0x3d, 0x58, 0xbb, 0x80, 0x28, 0x50, 0x03, 0x7f, 0xe4, - 0x84, 0x46, 0xdd, 0x23, 0x80, 0xe0, 0x44, 0x50, 0x00, 0x17, 0xa0, 0x37, - 0xdf, 0x0b, 0x00, 0x20, 0x01, 0x4b, 0x84, 0x25, 0x42, 0x01, 0x04, 0x73, - 0x84, 0x20, 0x50, 0x00, 0x01, 0x48, 0xae, 0x46, 0xd5, 0x10, 0x00, 0x20, - 0x01, 0x4b, 0x84, 0x25, 0x42, 0x01, 0x04, 0x73, 0x84, 0x21, 0x10, 0x10, - 0x01, 0x4e, 0x3c, 0x2d, 0x58, 0xba, 0x80, 0x28, 0x50, 0x03, 0x7f, 0xe4, - 0xdd, 0x22, 0x84, 0xe6, 0x3c, 0x2d, 0x53, 0x92, 0x00, 0x13, 0x00, 0x10, - 0x54, 0x21, 0x00, 0x04, 0x4e, 0x22, 0x01, 0x5f, 0x3c, 0x0d, 0x53, 0x8c, - 0x54, 0x00, 0x00, 0x08, 0x4e, 0x02, 0x01, 0x59, 0x40, 0x00, 0xe0, 0x08, - 0x40, 0x80, 0x20, 0x04, 0x40, 0x03, 0xa0, 0x08, 0x40, 0x14, 0x00, 0x04, - 0x44, 0x00, 0x10, 0x21, 0x48, 0x00, 0x00, 0xeb, 0x46, 0x28, 0x10, 0x00, - 0x04, 0x21, 0x00, 0x0c, 0x42, 0x21, 0x40, 0x0b, 0xc2, 0x1b, 0x84, 0x45, - 0x42, 0x00, 0x88, 0x73, 0x84, 0x20, 0x50, 0x00, 0x01, 0x48, 0xae, 0x46, - 0x3c, 0x1d, 0x53, 0x92, 0x54, 0x10, 0x80, 0x04, 0x4e, 0x12, 0x01, 0x37, - 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x08, 0x4e, 0x02, 0x01, 0x31, - 0x80, 0x28, 0x44, 0x00, 0x10, 0x23, 0x49, 0xfe, 0xbf, 0xd8, 0x48, 0x00, - 0x01, 0x2a, 0x42, 0x24, 0xe8, 0x0b, 0x54, 0xa4, 0x83, 0xff, 0xca, 0x0b, - 0x40, 0x24, 0xac, 0x08, 0x92, 0x5e, 0xca, 0x4a, 0x44, 0x50, 0xcf, 0x18, - 0x40, 0x42, 0x90, 0x0e, 0x97, 0x24, 0xc4, 0x44, 0x84, 0x45, 0x42, 0x00, - 0x88, 0x73, 0x84, 0x20, 0x50, 0x00, 0x01, 0x48, 0xae, 0x46, 0xc3, 0x07, - 0xa0, 0x37, 0x02, 0x10, 0x00, 0x9b, 0x9c, 0x49, 0x12, 0x10, 0x00, 0x9b, - 0x3c, 0x1d, 0x6b, 0x19, 0x54, 0x45, 0x00, 0xff, 0x9c, 0x49, 0x3c, 0x1f, - 0x6b, 0x19, 0x3c, 0x5d, 0x58, 0x98, 0x84, 0x24, 0x50, 0x03, 0x7f, 0xe4, - 0x84, 0x40, 0x54, 0x34, 0x00, 0xff, 0xdd, 0x25, 0x3c, 0x1d, 0x53, 0x92, - 0x54, 0x10, 0x80, 0x04, 0xc1, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, - 0x00, 0x08, 0xc0, 0x06, 0x80, 0x28, 0x44, 0x00, 0x10, 0x20, 0x49, 0xfe, - 0xbf, 0x9a, 0x3c, 0x0d, 0x5b, 0x18, 0x84, 0xa3, 0xd8, 0x08, 0x40, 0x94, - 0xac, 0x08, 0x40, 0x54, 0xf8, 0x09, 0xd0, 0x03, 0x84, 0xe4, 0xd5, 0x02, - 0x84, 0xeb, 0xa0, 0x37, 0x00, 0x10, 0x01, 0x4b, 0x4e, 0x12, 0x00, 0xdf, - 0x00, 0x20, 0x01, 0x49, 0x4e, 0x23, 0x00, 0xdb, 0xd5, 0x07, 0x3c, 0x3d, - 0x5b, 0x18, 0x84, 0xa7, 0xdb, 0x0b, 0x84, 0xa3, 0xd2, 0x09, 0x84, 0x45, - 0x42, 0x00, 0x88, 0x73, 0x84, 0x21, 0x10, 0x10, 0x01, 0x4e, 0x48, 0x00, - 0x00, 0xc8, 0x00, 0x30, 0x01, 0x47, 0xcb, 0x0f, 0x54, 0x94, 0x83, 0xff, - 0x4e, 0x92, 0x00, 0x0c, 0x84, 0xa3, 0xd2, 0x09, 0x84, 0x45, 0x42, 0x00, - 0x88, 0x73, 0x84, 0xe8, 0x10, 0x30, 0x01, 0x4e, 0x48, 0x00, 0x00, 0xbb, - 0x3c, 0x3d, 0x58, 0xbb, 0x80, 0x28, 0x50, 0x03, 0x7f, 0xe4, 0x84, 0x44, - 0xdd, 0x23, 0x80, 0xe0, 0x84, 0xa4, 0xdf, 0x0d, 0xa0, 0x37, 0x50, 0x00, - 0x01, 0x48, 0x00, 0x10, 0x00, 0x25, 0xc9, 0x21, 0x46, 0x18, 0x10, 0x00, - 0x04, 0x10, 0x82, 0x83, 0x96, 0x4c, 0xc1, 0x1b, 0xa0, 0x37, 0x84, 0x25, - 0x00, 0x20, 0x01, 0x4b, 0x42, 0x01, 0x04, 0x73, 0x84, 0x40, 0x50, 0x10, - 0x01, 0x48, 0xae, 0x8e, 0x3c, 0x1d, 0x53, 0x92, 0x54, 0x10, 0x80, 0x04, - 0x4e, 0x12, 0x00, 0x95, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x08, - 0x4e, 0x02, 0x00, 0x8f, 0x80, 0x28, 0x44, 0x00, 0x10, 0x24, 0xd5, 0x28, - 0xa6, 0x43, 0xc9, 0x05, 0xa6, 0x47, 0x56, 0x10, 0x80, 0x01, 0xae, 0x47, - 0xa0, 0x37, 0x84, 0x25, 0x00, 0x20, 0x01, 0x4b, 0x54, 0x45, 0x00, 0xff, - 0x42, 0x01, 0x04, 0x73, 0x84, 0x21, 0x10, 0x10, 0x01, 0x4e, 0x3c, 0x5d, - 0x58, 0x98, 0x50, 0x03, 0x7f, 0xe4, 0x84, 0x27, 0x84, 0x40, 0x54, 0x34, - 0x00, 0xff, 0xdd, 0x25, 0x3c, 0x1d, 0x53, 0x92, 0x54, 0x10, 0x80, 0x04, - 0xc1, 0x6b, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x08, 0xc0, 0x66, - 0x80, 0x28, 0x44, 0x00, 0x10, 0x1f, 0x49, 0xfe, 0xbf, 0x0c, 0xd5, 0x60, - 0xa0, 0xb7, 0x00, 0x41, 0x01, 0x4b, 0x40, 0x04, 0xac, 0x08, 0x84, 0x65, - 0x42, 0x22, 0x0c, 0x73, 0x92, 0x1e, 0x84, 0x81, 0x10, 0x11, 0x01, 0x4e, - 0x4c, 0x02, 0x40, 0x0f, 0xa0, 0x77, 0x42, 0x54, 0xbc, 0x0b, 0x00, 0x10, - 0x81, 0x6c, 0xd1, 0x08, 0x3c, 0x1d, 0x6b, 0x67, 0x95, 0xe4, 0x98, 0x4c, - 0x3c, 0x1f, 0x6b, 0x67, 0xd5, 0x45, 0x42, 0x14, 0xe8, 0x0b, 0xc9, 0x02, - 0xc8, 0x0e, 0x3c, 0x1d, 0x6b, 0x19, 0x84, 0xeb, 0x9c, 0x49, 0x3c, 0x1f, - 0x6b, 0x19, 0xa0, 0x37, 0x02, 0x10, 0x00, 0x9b, 0x9c, 0x49, 0x12, 0x10, - 0x00, 0x9b, 0xd5, 0x34, 0xa0, 0x37, 0x42, 0x94, 0xbc, 0x0b, 0x5c, 0x94, - 0x80, 0x01, 0x10, 0x90, 0x01, 0x6c, 0xd5, 0x28, 0xa0, 0x37, 0x00, 0x10, - 0x01, 0x4b, 0xc9, 0x24, 0x40, 0x14, 0xb4, 0x08, 0x92, 0x3d, 0xc1, 0x0f, - 0x8f, 0x05, 0xe7, 0x04, 0xe8, 0x0c, 0x2e, 0x15, 0x6b, 0x3b, 0xc9, 0x09, - 0x3c, 0x2d, 0x5b, 0x18, 0x84, 0xa3, 0xd2, 0x05, 0x10, 0x10, 0x01, 0x4e, - 0x84, 0xe8, 0xd5, 0x02, 0x84, 0xe4, 0xa0, 0x37, 0x84, 0x25, 0x00, 0x20, - 0x01, 0x4b, 0x42, 0x94, 0xbc, 0x0b, 0x42, 0x01, 0x04, 0x73, 0x50, 0x00, - 0x01, 0x48, 0xa7, 0x47, 0x4c, 0x92, 0xc0, 0x09, 0x84, 0x20, 0xae, 0x46, - 0xd5, 0x05, 0x84, 0xe4, 0xd5, 0x03, 0x44, 0x70, 0x00, 0x16, 0x80, 0x07, - 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x96, 0x48, - 0xc0, 0x4c, 0x3c, 0x0d, 0x60, 0xed, 0x96, 0x04, 0xc0, 0x48, 0x3c, 0x0d, - 0x65, 0x24, 0x84, 0xbf, 0xd8, 0x09, 0x2e, 0x05, 0x24, 0x7c, 0xc8, 0x06, - 0x49, 0xfe, 0xce, 0x43, 0x3c, 0x0f, 0x65, 0x24, 0xd5, 0x3c, 0x3e, 0x0d, - 0x83, 0xb0, 0x00, 0x40, 0x00, 0x43, 0x00, 0x20, 0x00, 0x42, 0x00, 0x30, - 0x00, 0x44, 0x98, 0xa2, 0x96, 0x90, 0x98, 0x93, 0xe4, 0x42, 0xe8, 0x07, - 0x00, 0x20, 0x00, 0x38, 0xca, 0x04, 0x00, 0x00, 0x00, 0x3b, 0xc0, 0x29, - 0xc1, 0x28, 0x2e, 0x05, 0x24, 0x7c, 0x84, 0x41, 0x44, 0x17, 0x94, 0xa8, - 0x4c, 0x01, 0x40, 0x0b, 0x84, 0x00, 0xdd, 0x21, 0x80, 0xc0, 0x49, 0xff, - 0xf2, 0x7c, 0x9a, 0x30, 0x94, 0x04, 0x92, 0x04, 0xd5, 0x08, 0x84, 0x00, - 0xdd, 0x21, 0x3c, 0x1d, 0x65, 0x24, 0x9a, 0x01, 0x94, 0x04, 0x92, 0x04, - 0x92, 0x01, 0xe6, 0x02, 0xe9, 0x0e, 0x3c, 0x0d, 0x60, 0xf0, 0x84, 0xaa, - 0xd8, 0x0a, 0x84, 0x3f, 0x3c, 0x1f, 0x65, 0x24, 0x3c, 0x3d, 0x52, 0xcc, - 0x84, 0x00, 0x80, 0x20, 0x80, 0x40, 0xdd, 0x23, 0x3a, 0x6f, 0x98, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x3c, 0x1d, 0x5a, 0x56, - 0x50, 0x60, 0x02, 0x3f, 0xdd, 0x21, 0x3e, 0x2d, 0x29, 0x64, 0xc0, 0x09, - 0x84, 0x22, 0x3e, 0x15, 0x6b, 0x33, 0x84, 0x20, 0xa6, 0x37, 0x38, 0x11, - 0x00, 0x08, 0xd5, 0x28, 0xa6, 0x77, 0x38, 0x21, 0x04, 0x00, 0xca, 0x13, - 0x3e, 0x7d, 0x29, 0x1c, 0x38, 0x13, 0x86, 0x02, 0x84, 0xbf, 0xd1, 0x1b, - 0x49, 0xfe, 0xcd, 0xe3, 0x92, 0x00, 0xa6, 0x77, 0x38, 0x13, 0x86, 0x02, - 0x9a, 0x01, 0x94, 0x04, 0x92, 0x04, 0x5c, 0xf0, 0x00, 0x51, 0xe9, 0x0f, - 0x44, 0x10, 0x00, 0x28, 0x3e, 0x15, 0x6b, 0x33, 0x3e, 0x1d, 0x29, 0x64, - 0xa6, 0x37, 0x38, 0x20, 0x80, 0x00, 0xc2, 0x08, 0x9e, 0x91, 0x38, 0x20, - 0x80, 0x08, 0xd5, 0x04, 0x84, 0x22, 0x3e, 0x15, 0x6b, 0x33, 0xec, 0x04, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x81, 0x00, - 0x84, 0x00, 0x80, 0xc2, 0x80, 0xe1, 0x49, 0xfe, 0xcd, 0xbc, 0x84, 0x61, - 0x80, 0x20, 0xa4, 0xb1, 0x4c, 0x71, 0xc0, 0x12, 0xca, 0x09, 0x3c, 0x02, - 0xcd, 0xfa, 0xac, 0x31, 0x04, 0x84, 0x00, 0x09, 0x14, 0x83, 0x00, 0x02, - 0xd5, 0x11, 0xa0, 0x32, 0x49, 0xfe, 0xb2, 0x9b, 0xa8, 0x32, 0x14, 0x04, - 0x00, 0x09, 0xd5, 0x0a, 0xcf, 0x05, 0xa0, 0x32, 0x49, 0xfe, 0xb2, 0x93, - 0xd5, 0x04, 0x80, 0x22, 0x49, 0xfe, 0xb2, 0x5f, 0xa8, 0x32, 0x3a, 0x6f, - 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x3c, 0x1d, 0x6b, 0xa6, 0x44, 0x50, 0x00, 0x10, 0xd1, 0x03, 0x8c, 0xb0, - 0xd9, 0x07, 0x84, 0x00, 0x49, 0xfe, 0xa2, 0xa5, 0x3c, 0x0d, 0x6b, 0xa8, - 0xd5, 0x03, 0x49, 0xfe, 0x83, 0x14, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xc4, 0x80, 0xc0, 0x00, 0x00, - 0x01, 0x37, 0x80, 0xe1, 0x49, 0xfe, 0xdf, 0x57, 0x92, 0x00, 0x00, 0x43, - 0x01, 0x37, 0x3c, 0x2d, 0x6c, 0xfc, 0x44, 0x10, 0x00, 0x44, 0x12, 0x0f, - 0x80, 0x0f, 0xf7, 0x85, 0x42, 0x22, 0x04, 0x73, 0x04, 0x11, 0x00, 0x0f, - 0x3c, 0x4d, 0x57, 0xed, 0x00, 0x10, 0x80, 0x49, 0x10, 0x1f, 0x80, 0x2d, - 0x80, 0x3f, 0x04, 0x01, 0x00, 0x0f, 0x84, 0x40, 0x00, 0x00, 0x00, 0x4a, - 0x10, 0x0f, 0x80, 0x2e, 0x84, 0x0c, 0xdd, 0x24, 0x84, 0x00, 0xec, 0x3c, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x46, 0x28, 0x10, 0x08, 0x04, 0x21, 0x00, 0xc0, 0x84, 0xa1, 0x42, 0x21, - 0x38, 0x0b, 0xda, 0x09, 0x46, 0x28, 0x10, 0x08, 0x04, 0x31, 0x00, 0xc8, - 0x58, 0x31, 0xc0, 0x00, 0x14, 0x31, 0x00, 0xc8, 0xc9, 0x0b, 0x04, 0x30, - 0x00, 0x0e, 0x3e, 0x2d, 0x62, 0xe0, 0x00, 0x31, 0x81, 0x4a, 0xcb, 0x08, - 0xb4, 0x62, 0x80, 0x41, 0xd5, 0x07, 0x84, 0xa2, 0xd9, 0x07, 0x3e, 0x2d, - 0x62, 0xe0, 0xb4, 0x62, 0x84, 0x41, 0xdd, 0x23, 0xd5, 0x0b, 0x84, 0x00, - 0x80, 0x20, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x08, 0x78, 0x44, 0x30, - 0x49, 0xab, 0x49, 0xfb, 0x1e, 0x9c, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x2e, 0x05, 0xb4, 0xff, - 0xc8, 0x19, 0x2e, 0x04, 0xeb, 0xe8, 0x96, 0x04, 0xc8, 0x15, 0x3c, 0x0d, - 0x3b, 0x5e, 0xa6, 0x02, 0xc8, 0x0c, 0x2e, 0x65, 0x1e, 0xe8, 0xce, 0x09, - 0x84, 0x01, 0x49, 0xfb, 0x89, 0x4a, 0x84, 0x21, 0x4c, 0x00, 0x80, 0x04, - 0x80, 0x06, 0xd5, 0x02, 0x84, 0x01, 0xc0, 0x04, 0x84, 0x01, 0x48, 0x00, - 0x00, 0x8c, 0x2e, 0x14, 0xa2, 0x9c, 0x2e, 0x94, 0xa2, 0x9f, 0x84, 0xe1, - 0x89, 0x21, 0x48, 0x00, 0x00, 0x7d, 0x49, 0xfd, 0x21, 0xc6, 0x50, 0x60, - 0x00, 0x08, 0x9d, 0xf9, 0xc0, 0x75, 0x2e, 0x14, 0xa2, 0x9e, 0x00, 0x00, - 0x00, 0x0b, 0x2e, 0x24, 0xa2, 0x9f, 0xe2, 0x01, 0xe8, 0x03, 0x84, 0x20, - 0xd5, 0x04, 0x98, 0x51, 0x40, 0x10, 0x04, 0x07, 0xc1, 0x05, 0x49, 0xfe, - 0xde, 0xc4, 0x80, 0xe0, 0xd5, 0x11, 0x49, 0xfd, 0xda, 0x5e, 0x80, 0xe0, - 0xc0, 0x04, 0x02, 0x70, 0x01, 0x0e, 0xd5, 0x0a, 0x80, 0x20, 0x46, 0x20, - 0x00, 0xaf, 0x58, 0x21, 0x08, 0x78, 0x44, 0x31, 0x14, 0xf8, 0x49, 0xfb, - 0x1e, 0x4a, 0x2e, 0x14, 0xa2, 0x9f, 0x2e, 0x84, 0xa2, 0x9c, 0x89, 0x01, - 0x8d, 0x03, 0x54, 0x84, 0x00, 0xff, 0xcf, 0x06, 0xa6, 0x73, 0xa4, 0xb2, - 0x80, 0x08, 0x49, 0xfe, 0xd8, 0x22, 0x46, 0x20, 0x03, 0x02, 0x58, 0x21, - 0x0e, 0x84, 0x84, 0x02, 0xaf, 0xd1, 0xae, 0x10, 0x92, 0xe8, 0xa6, 0x72, - 0xa6, 0x31, 0x94, 0x4e, 0x94, 0x04, 0x40, 0x00, 0x80, 0x04, 0x40, 0x70, - 0x1c, 0x04, 0xaf, 0xd2, 0xa6, 0x34, 0xae, 0x13, 0xa4, 0x72, 0x2e, 0x05, - 0xb4, 0xff, 0x92, 0x28, 0xae, 0x54, 0xc8, 0x33, 0x2e, 0x74, 0xeb, 0xe8, - 0x97, 0xfc, 0xc7, 0x11, 0x3c, 0x7d, 0x28, 0xbe, 0xa4, 0x72, 0x04, 0x03, - 0x7f, 0xfe, 0xa7, 0x73, 0x80, 0x88, 0x84, 0x65, 0xdd, 0x27, 0xc0, 0x25, - 0xa6, 0x73, 0x84, 0x01, 0x49, 0xfd, 0x20, 0xd5, 0x84, 0x04, 0xd5, 0x20, - 0x2e, 0x94, 0xeb, 0xc4, 0xa7, 0x73, 0xa4, 0x72, 0x4e, 0x93, 0x00, 0x0a, - 0x04, 0x03, 0x7f, 0xfe, 0x80, 0x88, 0x84, 0x65, 0x49, 0xfb, 0x51, 0x17, - 0x80, 0x09, 0xd5, 0x12, 0x04, 0x03, 0x7f, 0xfe, 0x80, 0x88, 0x84, 0x65, - 0x49, 0xfb, 0x4c, 0xd5, 0x92, 0x00, 0x80, 0x07, 0xd5, 0x09, 0x97, 0xf8, - 0x80, 0x07, 0xe0, 0xe9, 0x4e, 0xf3, 0xff, 0x83, 0x84, 0x03, 0xd5, 0x02, - 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xfc, 0x44, 0x77, 0xa4, 0x1c, 0x84, 0x01, 0xdd, 0x27, - 0x81, 0x00, 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x23, 0x3e, 0x6c, 0xa2, 0x9c, - 0xa6, 0x70, 0xa6, 0x33, 0x98, 0x08, 0x9c, 0x03, 0x96, 0x00, 0xdd, 0x27, - 0x81, 0x20, 0x4c, 0x04, 0x40, 0x18, 0xa6, 0x70, 0xa6, 0x33, 0x98, 0x49, - 0x9c, 0x4b, 0x98, 0x08, 0x96, 0x00, 0xdd, 0x27, 0x81, 0x00, 0x4c, 0x04, - 0xc0, 0x0e, 0xa6, 0xb0, 0xa6, 0x73, 0x98, 0x12, 0x9c, 0x04, 0x98, 0x90, - 0x98, 0x8a, 0x98, 0x8a, 0x98, 0x4a, 0x96, 0x08, 0xdd, 0x27, 0x4c, 0x04, - 0x00, 0x26, 0x84, 0xc0, 0x80, 0xe6, 0x47, 0xc0, 0x00, 0x9f, 0x59, 0xce, - 0x0a, 0x64, 0x81, 0x46, 0xd5, 0x02, 0x80, 0xe0, 0xce, 0x04, 0x3c, 0x0d, - 0x29, 0xdc, 0xd5, 0x07, 0x84, 0xa1, 0xde, 0x03, 0xdd, 0x3c, 0xd5, 0x04, - 0x3c, 0x0d, 0x29, 0xdd, 0xdd, 0x20, 0x9d, 0xb1, 0x97, 0xb0, 0x56, 0x13, - 0x00, 0x03, 0x96, 0x00, 0x40, 0x65, 0x04, 0x1a, 0xc0, 0xed, 0x84, 0xa3, - 0xd8, 0x05, 0x9d, 0xf9, 0x97, 0xf8, 0x4c, 0x70, 0x7f, 0xe9, 0x49, 0xfb, - 0x43, 0x36, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x2e, 0x75, 0x6b, 0x6e, 0x84, 0x21, 0x96, 0x00, - 0x4c, 0x70, 0xc0, 0x25, 0x3e, 0x6c, 0xdd, 0x74, 0x4c, 0x03, 0xc0, 0x0e, - 0xa6, 0x33, 0xc0, 0x1e, 0x49, 0xfe, 0xc3, 0xff, 0x49, 0xfe, 0xc4, 0x13, - 0x3c, 0x0d, 0x59, 0x0c, 0xdd, 0x20, 0x84, 0x00, 0xae, 0x33, 0xd5, 0x14, - 0xa6, 0x33, 0xc8, 0x12, 0x3c, 0x0d, 0x59, 0x0b, 0xdd, 0x20, 0x49, 0xfe, - 0xc3, 0xcc, 0x49, 0xfe, 0xc4, 0x68, 0x49, 0xfe, 0xc5, 0x30, 0x49, 0xfe, - 0xc4, 0xda, 0x3c, 0x2d, 0x29, 0x04, 0x84, 0x02, 0x80, 0x20, 0xdd, 0x22, - 0xaf, 0xf3, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xd6, 0xa9, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x80, 0xc0, - 0x44, 0x00, 0x00, 0x49, 0x80, 0xe2, 0x54, 0x80, 0x80, 0xff, 0x4c, 0x60, - 0x00, 0x05, 0x44, 0x50, 0x00, 0x3d, 0xde, 0x06, 0x80, 0x06, 0x49, 0xff, - 0xff, 0xe8, 0xc0, 0x12, 0xd5, 0x18, 0x44, 0x50, 0x00, 0x4a, 0xd6, 0x08, - 0x8e, 0xac, 0xd6, 0x06, 0x9d, 0x6a, 0xd6, 0x04, 0x44, 0x50, 0x00, 0x15, - 0xde, 0x07, 0x9c, 0x01, 0x49, 0xff, 0xff, 0xd9, 0xc8, 0x0a, 0x44, 0x60, - 0x00, 0x4a, 0x80, 0x08, 0x80, 0x46, 0x80, 0x67, 0x84, 0x21, 0x49, 0xfb, - 0x0d, 0x5c, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xff, 0x4e, 0x67, 0x92, 0x00, 0x46, 0x08, - 0x10, 0x04, 0xa0, 0x45, 0x42, 0x10, 0x8c, 0x09, 0xa8, 0x45, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0xc0, 0x3e, 0x35, 0x24, 0x86, 0x80, 0x03, 0x96, 0x48, 0x96, 0x90, - 0x49, 0xff, 0x43, 0xa5, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x2e, 0x45, 0x24, 0x89, - 0x3e, 0x45, 0x6a, 0xca, 0x84, 0x20, 0x3e, 0x0d, 0xe0, 0x74, 0x44, 0x20, - 0x00, 0x4f, 0x49, 0xff, 0x3d, 0xd6, 0x92, 0x00, 0x3c, 0x0d, 0x59, 0xe5, - 0xdd, 0x20, 0x84, 0xa5, 0xd0, 0x06, 0x2e, 0x25, 0x24, 0x87, 0x3e, 0x0d, - 0x25, 0x60, 0xd5, 0x05, 0x2e, 0x25, 0x24, 0x88, 0x3e, 0x0d, 0x24, 0x1c, - 0x84, 0x20, 0x3e, 0x3d, 0xe0, 0x74, 0xd5, 0x07, 0xa7, 0x40, 0x96, 0x60, - 0xa7, 0x01, 0x9c, 0x02, 0x38, 0x41, 0x94, 0x08, 0x9d, 0x09, 0xe2, 0x22, - 0xe9, 0xf8, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x46, 0x10, 0x00, 0x96, 0x58, 0x10, 0x8e, 0x7c, 0x84, 0x4a, - 0x3e, 0x0d, 0xaa, 0x70, 0x49, 0xff, 0x3d, 0x99, 0x92, 0x00, 0x3e, 0x0d, - 0xaa, 0xd4, 0x84, 0x20, 0x44, 0x20, 0x00, 0x25, 0x49, 0xff, 0x3d, 0xa3, - 0x3e, 0x0d, 0xa9, 0x78, 0x84, 0x20, 0x44, 0x20, 0x00, 0x25, 0x49, 0xff, - 0x3d, 0x9c, 0x3e, 0x0d, 0xb6, 0x08, 0x44, 0x10, 0x00, 0xff, 0x84, 0x44, - 0x49, 0xff, 0x3d, 0x95, 0x2e, 0x14, 0xa2, 0x9c, 0x2e, 0x34, 0xa2, 0x9f, - 0x44, 0x20, 0x00, 0x1f, 0x3e, 0x25, 0xb6, 0x0c, 0x44, 0x20, 0x05, 0xdc, - 0x3c, 0x2f, 0x5b, 0x0d, 0x84, 0x5f, 0x3c, 0x2f, 0x5b, 0x0e, 0x98, 0xd9, - 0x84, 0x00, 0x3e, 0x2d, 0x28, 0xa0, 0x44, 0x1f, 0xff, 0xc4, 0xd5, 0x04, - 0x38, 0x11, 0x01, 0x09, 0x96, 0x20, 0x9d, 0x01, 0xe0, 0x03, 0xe9, 0xfb, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, - 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x09, 0xb0, 0x3a, 0x00, 0x04, 0x00, - 0x50, 0x6f, 0x80, 0x08, 0x3a, 0x0f, 0x84, 0x20, 0x84, 0x44, 0x80, 0x06, - 0x44, 0x10, 0x00, 0xff, 0x49, 0xff, 0x3d, 0x63, 0x44, 0x00, 0x00, 0x1f, - 0xae, 0x34, 0x80, 0x3f, 0x9c, 0x06, 0x80, 0x86, 0x85, 0x41, 0xd5, 0x3f, - 0x38, 0x82, 0x14, 0x00, 0x40, 0x91, 0x8c, 0x00, 0x41, 0xc4, 0x1c, 0x0e, - 0x55, 0xce, 0x00, 0x01, 0x4f, 0xc2, 0x00, 0x27, 0x51, 0xc4, 0x80, 0x02, - 0x8d, 0x24, 0xe6, 0x6b, 0xe8, 0x04, 0x54, 0x3e, 0x00, 0xff, 0xd5, 0x03, - 0x54, 0x34, 0x80, 0xff, 0x05, 0xc0, 0x80, 0x00, 0x40, 0x91, 0x8c, 0x09, - 0x38, 0x9e, 0x24, 0x00, 0x40, 0x75, 0x1c, 0x0c, 0x54, 0x31, 0x80, 0x07, - 0x40, 0x73, 0x9c, 0x05, 0x40, 0x34, 0x8c, 0x0e, 0x40, 0x83, 0xa0, 0x02, - 0x54, 0x31, 0x80, 0x03, 0x84, 0xe3, 0x50, 0x90, 0x7f, 0xff, 0x4c, 0x33, - 0x80, 0x06, 0x38, 0x82, 0x14, 0x08, 0x54, 0x04, 0x80, 0xff, 0x9c, 0x91, - 0x44, 0x30, 0x00, 0x25, 0x4c, 0x21, 0x80, 0x09, 0x96, 0xd0, 0x54, 0x71, - 0x00, 0x07, 0x40, 0x51, 0x8c, 0x09, 0xe6, 0x06, 0xe8, 0xc6, 0x9c, 0x4c, - 0x4c, 0x60, 0x80, 0x04, 0x84, 0x40, 0xd5, 0xf5, 0x50, 0x1f, 0x80, 0x08, - 0x84, 0x45, 0x3e, 0x0d, 0xb6, 0x08, 0x49, 0xff, 0x3d, 0x02, 0xec, 0x14, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x46, 0xf0, 0x00, 0xaf, 0x02, 0x37, 0x85, 0x40, 0x84, 0x20, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0a, 0x64, 0xd5, 0x0a, 0xa6, 0x80, 0x3e, 0x4d, - 0x5a, 0xac, 0x98, 0x92, 0x98, 0x94, 0xa7, 0x01, 0x9c, 0x49, 0xaf, 0x11, - 0x9c, 0x02, 0xe0, 0x23, 0xe9, 0xf6, 0x49, 0xff, 0x69, 0x10, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xf4, - 0x84, 0x60, 0x50, 0x1f, 0x80, 0x07, 0x44, 0x00, 0x02, 0x00, 0x84, 0x41, - 0xae, 0xc8, 0x49, 0xfb, 0x84, 0x32, 0x00, 0x1f, 0x80, 0x07, 0x96, 0x0c, - 0xc0, 0x09, 0x46, 0x08, 0x10, 0x06, 0x58, 0x00, 0x08, 0x00, 0xb4, 0x40, - 0x58, 0x21, 0x00, 0x01, 0xd5, 0x08, 0x46, 0x08, 0x10, 0x06, 0x58, 0x00, - 0x08, 0x00, 0xb4, 0x40, 0x42, 0x21, 0x00, 0x09, 0x54, 0x10, 0x80, 0x02, - 0xb6, 0x40, 0xc1, 0x09, 0x46, 0x08, 0x10, 0x06, 0x58, 0x00, 0x08, 0x00, - 0xb4, 0x20, 0x58, 0x10, 0x80, 0x02, 0xd5, 0x08, 0x46, 0x08, 0x10, 0x06, - 0x58, 0x00, 0x08, 0x00, 0xb4, 0x20, 0x42, 0x10, 0x84, 0x09, 0xb6, 0x20, - 0x84, 0x41, 0x44, 0x00, 0x00, 0x48, 0x50, 0x1f, 0x80, 0x07, 0x49, 0xfb, - 0x84, 0x04, 0x00, 0x0f, 0x80, 0x07, 0x54, 0x00, 0x00, 0x03, 0xc8, 0x09, - 0x46, 0x08, 0x10, 0x06, 0x58, 0x00, 0x08, 0x00, 0xb4, 0x20, 0x58, 0x10, - 0x80, 0x08, 0xd5, 0x08, 0x46, 0x08, 0x10, 0x06, 0x58, 0x00, 0x08, 0x00, - 0xb4, 0x20, 0x42, 0x10, 0x8c, 0x09, 0xb6, 0x20, 0x46, 0x08, 0x10, 0x06, - 0x58, 0x00, 0x08, 0x00, 0xb4, 0x40, 0x96, 0x94, 0x3e, 0x25, 0x6a, 0xf2, - 0xb4, 0x40, 0x42, 0x21, 0x04, 0x0b, 0x3e, 0x25, 0x6a, 0xf3, 0xb4, 0x20, - 0x42, 0x10, 0x84, 0x0b, 0xc1, 0x05, 0xb4, 0x20, 0x58, 0x10, 0x80, 0x20, - 0xb6, 0x20, 0x2e, 0x15, 0xb4, 0xdb, 0x96, 0x08, 0xe6, 0x08, 0xe9, 0x02, - 0x84, 0x27, 0x3e, 0x0d, 0xb3, 0xb4, 0x00, 0x30, 0x01, 0x23, 0x96, 0x48, - 0x10, 0x10, 0x01, 0x27, 0x80, 0x41, 0xe2, 0x61, 0xe8, 0x02, 0x80, 0x43, - 0x10, 0x20, 0x01, 0x23, 0xec, 0x0c, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xf4, 0x2e, 0x05, 0xb5, 0x05, - 0x84, 0xac, 0x54, 0x00, 0x00, 0x0c, 0xd0, 0x52, 0x84, 0x60, 0x44, 0x00, - 0x01, 0x59, 0x50, 0x1f, 0x80, 0x05, 0x84, 0x41, 0xae, 0xca, 0xae, 0xc8, - 0xae, 0xc9, 0x49, 0xfb, 0x83, 0xae, 0xc8, 0x1a, 0x00, 0x6f, 0x80, 0x05, - 0x84, 0x01, 0x54, 0x63, 0x00, 0x03, 0x4c, 0x60, 0x40, 0x14, 0x44, 0x00, - 0x01, 0x58, 0x50, 0x1f, 0x80, 0x06, 0x80, 0x46, 0x49, 0xfb, 0x83, 0x9f, - 0xc8, 0x0b, 0x00, 0x0f, 0x80, 0x06, 0x3c, 0x2d, 0x59, 0xd0, 0x44, 0x11, - 0x2c, 0x00, 0x40, 0x00, 0x04, 0x04, 0x80, 0x26, 0xdd, 0x22, 0x44, 0x00, - 0x01, 0x45, 0x50, 0x1f, 0x80, 0x05, 0x84, 0x41, 0x49, 0xfb, 0x83, 0x8d, - 0xc8, 0x25, 0x00, 0x6f, 0x80, 0x05, 0x84, 0x01, 0x54, 0x63, 0x00, 0x03, - 0x4c, 0x60, 0x40, 0x1f, 0x44, 0x00, 0x01, 0x56, 0x50, 0x1f, 0x80, 0x07, - 0x80, 0x46, 0x49, 0xfb, 0x83, 0x7e, 0xc8, 0x16, 0x3c, 0x1d, 0x59, 0xb2, - 0x44, 0x00, 0x00, 0x60, 0xdd, 0x21, 0x00, 0x1f, 0x80, 0x07, 0x54, 0x00, - 0x00, 0x1f, 0x94, 0x4d, 0x40, 0x00, 0x04, 0x04, 0x96, 0x00, 0x3c, 0x2d, - 0x59, 0xd0, 0x44, 0x11, 0x60, 0x00, 0x40, 0x00, 0x04, 0x04, 0x80, 0x26, - 0xdd, 0x22, 0xec, 0x0c, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xf4, 0x2e, 0x05, 0xb5, 0x05, 0x84, 0xac, 0x54, 0x00, - 0x00, 0x0c, 0xd0, 0x70, 0x84, 0x60, 0x10, 0x3f, 0x80, 0x07, 0x10, 0x3f, - 0x80, 0x06, 0x44, 0x00, 0x01, 0x46, 0x50, 0x1f, 0x80, 0x05, 0x84, 0x41, - 0x49, 0xfb, 0x83, 0x4f, 0xc8, 0x63, 0x00, 0x6f, 0x80, 0x05, 0x84, 0x01, - 0x54, 0x63, 0x00, 0x0c, 0x90, 0xc2, 0x4c, 0x60, 0x40, 0x20, 0x44, 0x00, - 0x01, 0x5b, 0x50, 0x1f, 0x80, 0x07, 0x80, 0x46, 0x49, 0xfb, 0x83, 0x3f, - 0xc8, 0x17, 0x3c, 0x1d, 0x59, 0xb2, 0x44, 0x00, 0x00, 0x39, 0xdd, 0x21, - 0x00, 0x1f, 0x80, 0x07, 0x54, 0x00, 0x00, 0xe0, 0x54, 0x10, 0x80, 0x1f, - 0x40, 0x00, 0x04, 0x04, 0x3c, 0x2d, 0x59, 0xd0, 0x44, 0x11, 0x39, 0x00, - 0x40, 0x00, 0x04, 0x04, 0x80, 0x26, 0xdd, 0x22, 0xd5, 0x02, 0x84, 0xc0, - 0x00, 0x7f, 0x80, 0x05, 0x84, 0x01, 0x54, 0x73, 0x80, 0x03, 0x4c, 0x70, - 0x40, 0x21, 0x44, 0x00, 0x01, 0x44, 0x50, 0x1f, 0x80, 0x06, 0x80, 0x47, - 0x49, 0xfb, 0x83, 0x19, 0xc8, 0x18, 0x3c, 0x1d, 0x59, 0xb2, 0x44, 0x00, - 0x00, 0x38, 0xdd, 0x21, 0x00, 0x1f, 0x80, 0x06, 0x54, 0x00, 0x00, 0xe0, - 0x54, 0x10, 0x80, 0x1f, 0x40, 0x00, 0x04, 0x04, 0x3c, 0x2d, 0x59, 0xd0, - 0x44, 0x11, 0x38, 0x00, 0x40, 0x00, 0x04, 0x04, 0x80, 0x27, 0xdd, 0x22, - 0x58, 0x63, 0x00, 0x02, 0x3c, 0x1d, 0x59, 0xb2, 0x44, 0x00, 0x00, 0x37, - 0xdd, 0x21, 0x44, 0x1f, 0xff, 0x9f, 0x40, 0x00, 0x04, 0x02, 0x95, 0xb5, - 0x40, 0x03, 0x00, 0x04, 0x96, 0x00, 0x3c, 0x2d, 0x59, 0xd0, 0x44, 0x11, - 0x37, 0x00, 0x40, 0x00, 0x04, 0x04, 0x84, 0x21, 0xdd, 0x22, 0xec, 0x0c, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xf4, - 0xa6, 0xc0, 0x46, 0x08, 0x10, 0x06, 0x10, 0x3f, 0x80, 0x07, 0x04, 0x00, - 0x02, 0x00, 0x96, 0x90, 0x96, 0x04, 0xc8, 0x09, 0x2e, 0x05, 0x6a, 0xcc, - 0xc8, 0x06, 0xe6, 0x68, 0xe9, 0x04, 0x84, 0x07, 0x10, 0x0f, 0x80, 0x07, - 0x50, 0x0f, 0x80, 0x07, 0x49, 0xff, 0x60, 0xe7, 0x92, 0x00, 0xec, 0x0c, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xff, 0x59, 0xb3, 0x92, 0x00, 0x46, 0x08, 0x10, 0x06, 0x58, 0x00, - 0x00, 0x4c, 0xb4, 0x20, 0x46, 0x2f, 0xf8, 0x0f, 0x58, 0x21, 0x0f, 0xff, - 0x40, 0x10, 0x88, 0x02, 0x46, 0x20, 0x04, 0x10, 0x40, 0x10, 0x88, 0x04, - 0xb6, 0x20, 0x46, 0x28, 0x0f, 0xff, 0xb4, 0x20, 0x58, 0x21, 0x0f, 0xff, - 0x40, 0x10, 0x88, 0x02, 0x46, 0x24, 0x10, 0x00, 0x40, 0x10, 0x88, 0x04, - 0xb6, 0x20, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa0, 0xbc, 0x46, 0x68, 0x10, 0x08, 0x58, 0x63, 0x00, 0x04, 0xb4, 0x26, - 0x42, 0x10, 0x80, 0x09, 0xb6, 0x26, 0x3c, 0x1d, 0x59, 0x1d, 0x54, 0x80, - 0x00, 0xff, 0x84, 0x02, 0xdd, 0x21, 0x40, 0x04, 0x20, 0x08, 0x49, 0xff, - 0x47, 0xe6, 0x92, 0x00, 0x46, 0x08, 0x10, 0x04, 0x04, 0x80, 0x00, 0x0e, - 0xb4, 0x26, 0x84, 0x02, 0x58, 0x10, 0x80, 0x01, 0xb6, 0x26, 0x3c, 0x1d, - 0x59, 0x1d, 0xdd, 0x21, 0x54, 0x04, 0x00, 0xff, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xff, 0x3d, 0x0b, - 0x92, 0x00, 0x46, 0x10, 0x00, 0xa0, 0x58, 0x10, 0x82, 0xf4, 0x3c, 0x1f, - 0x59, 0xb2, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa0, 0xbc, 0x46, 0x68, 0x10, 0x08, 0x58, 0x63, 0x00, 0x04, 0xb4, 0x26, - 0x42, 0x10, 0x80, 0x09, 0xb6, 0x26, 0x3c, 0x1d, 0x59, 0x1d, 0x54, 0x80, - 0x00, 0xff, 0x84, 0x02, 0xdd, 0x21, 0x80, 0x08, 0x49, 0xff, 0x51, 0xf9, - 0xb4, 0x26, 0x81, 0x00, 0x58, 0x10, 0x80, 0x01, 0xb6, 0x26, 0x84, 0x02, - 0x3c, 0x1d, 0x59, 0x1d, 0xdd, 0x21, 0x80, 0x08, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x97, 0x88, 0x97, 0xc1, - 0x80, 0x06, 0x49, 0xff, 0xf0, 0xe0, 0xe6, 0x09, 0xe8, 0x15, 0x3e, 0x1d, - 0x26, 0x00, 0x38, 0x00, 0x83, 0x01, 0xe2, 0x07, 0xe8, 0x0f, 0x46, 0x28, - 0x10, 0x02, 0x04, 0x41, 0x00, 0x0d, 0x46, 0x18, 0x00, 0x00, 0x84, 0x03, - 0x80, 0x66, 0x44, 0x20, 0x10, 0x97, 0x49, 0xfe, 0xb9, 0x36, 0x84, 0x00, - 0xd5, 0x02, 0x84, 0x01, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x50, 0x60, 0x00, 0x28, 0x00, 0x00, - 0x01, 0x36, 0xc8, 0x0d, 0x02, 0x73, 0x00, 0x75, 0x04, 0x83, 0x7f, 0xfa, - 0xc7, 0x06, 0xa4, 0x37, 0x9c, 0x7b, 0x98, 0x00, 0xe2, 0x01, 0xe8, 0x08, - 0xa5, 0xf7, 0xd5, 0x04, 0xa5, 0xf7, 0x04, 0x83, 0x7f, 0xfb, 0x99, 0xff, - 0x9f, 0xfb, 0x2e, 0x15, 0xe7, 0xc1, 0xc1, 0x25, 0x3c, 0x0d, 0x79, 0xf1, - 0xa4, 0x40, 0x2e, 0x05, 0x24, 0x7f, 0xe2, 0x20, 0xe9, 0x1e, 0x3c, 0x1d, - 0x60, 0xf0, 0x84, 0xaa, 0xd1, 0x04, 0x2e, 0x05, 0x83, 0xf0, 0xc8, 0x17, - 0x3c, 0x1d, 0x79, 0xf2, 0x84, 0x02, 0x00, 0x10, 0x80, 0x2c, 0x49, 0xff, - 0xff, 0xae, 0x84, 0xa1, 0xd8, 0x0e, 0xa4, 0x77, 0x92, 0x22, 0x96, 0x09, - 0xe6, 0x15, 0xe9, 0x03, 0x44, 0x10, 0x00, 0x14, 0x96, 0x49, 0x98, 0x49, - 0x40, 0x00, 0x9c, 0x06, 0x40, 0x70, 0x80, 0x1b, 0x80, 0x08, 0x80, 0x27, - 0x49, 0xfe, 0xad, 0x15, 0x14, 0x03, 0x7f, 0xfd, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x97, 0x81, 0x96, 0x08, 0x49, 0xff, - 0xf0, 0x76, 0xe6, 0x09, 0xe8, 0x1d, 0x3e, 0x1d, 0x26, 0x00, 0x38, 0x20, - 0x83, 0x01, 0xe2, 0x46, 0xe8, 0x05, 0x84, 0x40, 0x38, 0x20, 0x83, 0x09, - 0xd5, 0x04, 0x9b, 0x96, 0x38, 0x60, 0x83, 0x09, 0x46, 0x18, 0x10, 0x02, - 0x04, 0x40, 0x80, 0x0d, 0x3e, 0x1d, 0x26, 0x00, 0x38, 0x30, 0x83, 0x01, - 0x46, 0x18, 0x00, 0x00, 0x84, 0x03, 0x44, 0x20, 0x10, 0x99, 0x49, 0xfe, - 0xb8, 0xc2, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x1d, 0x6b, 0xb5, 0x44, 0x50, 0x00, 0x40, - 0xd9, 0x09, 0x3c, 0x0d, 0x6b, 0xb6, 0xc0, 0x06, 0x00, 0x10, 0x00, 0x2c, - 0x84, 0x02, 0x49, 0xff, 0xff, 0xca, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x1d, 0x6b, 0xb5, - 0x84, 0xa4, 0xd9, 0x0a, 0x3c, 0x0d, 0x6b, 0xb6, 0xc0, 0x07, 0x00, 0x10, - 0x00, 0x2c, 0x84, 0x02, 0x49, 0xff, 0xff, 0xb7, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0x78, - 0x10, 0x02, 0x3e, 0x6d, 0x26, 0x07, 0xa6, 0x30, 0x84, 0xa1, 0xd8, 0x17, - 0x9e, 0xf7, 0x9e, 0x33, 0xa4, 0x40, 0xa5, 0x58, 0x9e, 0x35, 0x99, 0x4d, - 0x97, 0x69, 0xad, 0x58, 0x46, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x84, 0x03, - 0x44, 0x20, 0x10, 0x9a, 0xe2, 0x85, 0xe8, 0x02, 0xad, 0x18, 0x04, 0x43, - 0x80, 0x0d, 0xa4, 0xd8, 0x49, 0xfe, 0xb8, 0x77, 0x8c, 0xc8, 0x3e, 0x5d, - 0x26, 0x4f, 0xde, 0xe4, 0x84, 0x20, 0x3e, 0x15, 0x24, 0x7b, 0x3a, 0x6f, - 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x88, 0x94, 0x53, 0x3e, 0x4d, 0x26, 0x00, 0x96, 0xc1, 0x98, 0x21, - 0xac, 0xc2, 0x46, 0x18, 0x00, 0x00, 0x38, 0x42, 0x0b, 0x01, 0x84, 0x03, - 0x44, 0x20, 0x10, 0x98, 0x49, 0xfe, 0xb8, 0x59, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x97, 0xc0, - 0x80, 0x07, 0x40, 0x80, 0x80, 0x13, 0x40, 0x91, 0x00, 0x13, 0x49, 0xff, - 0xef, 0xe0, 0x80, 0xc0, 0x44, 0x10, 0x00, 0x10, 0x84, 0x03, 0x44, 0x20, - 0x10, 0x53, 0x44, 0x30, 0x00, 0xff, 0x80, 0x87, 0x49, 0xfe, 0xb8, 0x3f, - 0x84, 0xa9, 0x81, 0x46, 0xde, 0x0e, 0x80, 0x07, 0x49, 0xff, 0xef, 0x9f, - 0x54, 0x14, 0x00, 0xff, 0x80, 0xc0, 0x49, 0xff, 0xef, 0xba, 0x84, 0x21, - 0x3e, 0x15, 0x24, 0x97, 0x4c, 0x65, 0x00, 0x0a, 0x80, 0x09, 0x80, 0x26, - 0x49, 0xff, 0xef, 0xd1, 0x80, 0x08, 0x80, 0x26, 0x49, 0xff, 0xff, 0xbd, - 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x3c, 0x1d, - 0x6b, 0xb6, 0x97, 0xc0, 0x00, 0x00, 0x80, 0x2c, 0x49, 0xfd, 0xd4, 0xff, - 0x81, 0x00, 0x3c, 0x0d, 0x5b, 0x18, 0xe6, 0x02, 0xe9, 0x09, 0x46, 0x18, - 0x10, 0x00, 0x58, 0x10, 0x80, 0x28, 0xb4, 0x01, 0x42, 0x00, 0x7c, 0x08, - 0xd5, 0x08, 0x46, 0x18, 0x10, 0x00, 0x58, 0x10, 0x80, 0x28, 0xb4, 0x01, - 0x42, 0x00, 0x7c, 0x09, 0xb6, 0x01, 0x3c, 0x1d, 0x6b, 0xb5, 0x84, 0xa6, - 0xd9, 0x04, 0x84, 0x20, 0x3c, 0x1f, 0x6b, 0xb5, 0x3c, 0x0d, 0x6b, 0xb3, - 0x54, 0x00, 0x00, 0x0f, 0xc0, 0x04, 0x84, 0x00, 0x3c, 0x0f, 0x6b, 0xb3, - 0x3e, 0x1d, 0xae, 0xcc, 0xa0, 0x0a, 0x54, 0x20, 0x00, 0x0f, 0xc2, 0x0c, - 0xa0, 0x8b, 0xb6, 0x01, 0xa8, 0x89, 0xc2, 0x38, 0x04, 0x01, 0x00, 0x0e, - 0x00, 0x30, 0x01, 0x4a, 0x10, 0x30, 0x01, 0x4b, 0xd5, 0x31, 0xa0, 0x09, - 0xc0, 0x07, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x10, 0x01, 0x4b, 0x10, 0x10, - 0x01, 0x4a, 0x3c, 0x1d, 0x58, 0xe2, 0x80, 0x07, 0xdd, 0x21, 0x80, 0xc0, - 0x3c, 0x1d, 0x6b, 0xb5, 0x44, 0x50, 0x00, 0x20, 0xd9, 0x0a, 0x4c, 0x60, - 0x80, 0x09, 0x3c, 0x2d, 0x6b, 0xa6, 0x54, 0x21, 0x01, 0x90, 0xc2, 0x03, - 0x3c, 0x1f, 0x6b, 0xb3, 0x3c, 0x6f, 0x6b, 0xb5, 0xc6, 0x0d, 0x3c, 0x1d, - 0x6b, 0xb6, 0x44, 0x20, 0x10, 0x3e, 0x00, 0x30, 0x80, 0x2c, 0x84, 0x03, - 0x44, 0x10, 0x00, 0x10, 0x80, 0x86, 0x49, 0xfe, 0xb7, 0xbc, 0x3c, 0x2d, - 0x58, 0xe5, 0x3c, 0x0d, 0x6b, 0xb6, 0x80, 0x26, 0xdd, 0x22, 0x02, 0x04, - 0x01, 0x1b, 0x84, 0xaa, 0xd8, 0x27, 0x02, 0x04, 0x01, 0x1c, 0x44, 0x50, - 0x19, 0x83, 0xd8, 0x22, 0x46, 0x18, 0x10, 0x06, 0x58, 0x10, 0x80, 0x7c, - 0xb4, 0x01, 0x46, 0x3f, 0xff, 0x00, 0x58, 0x31, 0x83, 0xff, 0x40, 0x00, - 0x0c, 0x02, 0x46, 0x30, 0x00, 0x80, 0x58, 0x31, 0x84, 0x00, 0x40, 0x00, - 0x0c, 0x04, 0xb6, 0x01, 0xb4, 0x01, 0x40, 0x00, 0x30, 0x08, 0x92, 0x0c, - 0x46, 0x32, 0x01, 0x00, 0x40, 0x00, 0x0c, 0x04, 0xb6, 0x01, 0x50, 0x20, - 0xff, 0xec, 0xb4, 0x02, 0x42, 0x00, 0x78, 0x08, 0xd5, 0x1f, 0x46, 0x18, - 0x10, 0x06, 0x58, 0x10, 0x80, 0x7c, 0xb4, 0x01, 0x46, 0x3f, 0xff, 0x00, - 0x58, 0x31, 0x83, 0xff, 0x40, 0x00, 0x0c, 0x02, 0x44, 0x37, 0xfc, 0x00, - 0x40, 0x00, 0x0c, 0x04, 0xb6, 0x01, 0xb4, 0x01, 0x40, 0x00, 0x30, 0x08, - 0x92, 0x0c, 0x46, 0x31, 0xff, 0x00, 0x40, 0x00, 0x0c, 0x04, 0xb6, 0x01, - 0x50, 0x20, 0xff, 0xec, 0xb4, 0x02, 0x42, 0x00, 0x78, 0x09, 0xb6, 0x02, - 0x3c, 0x1d, 0x58, 0xe7, 0x80, 0x07, 0xdd, 0x21, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xd1, 0xe3, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x40, 0x10, 0x40, 0x09, 0x40, 0x10, 0xc0, 0x08, 0x46, 0x50, - 0x40, 0x00, 0x80, 0x45, 0xd1, 0x1b, 0xe2, 0x41, 0xe9, 0x07, 0x44, 0x51, - 0x00, 0x00, 0xd1, 0x0b, 0x95, 0x69, 0xd9, 0x29, 0xd5, 0x0b, 0x46, 0x53, - 0x00, 0x00, 0xd1, 0x1b, 0x46, 0x59, 0x00, 0x00, 0xd9, 0x22, 0xd5, 0x1d, - 0x3e, 0x1d, 0x68, 0xdc, 0xd5, 0x16, 0x97, 0x82, 0x80, 0x06, 0x49, 0xff, - 0xed, 0xea, 0x80, 0x06, 0x49, 0xff, 0x9c, 0x75, 0xd5, 0x16, 0x54, 0x00, - 0x02, 0x00, 0xc0, 0x02, 0x84, 0x01, 0x3e, 0x05, 0x24, 0x7e, 0x3c, 0x1d, - 0x5a, 0x72, 0x3c, 0x0d, 0x79, 0xe3, 0xd5, 0x05, 0x3e, 0x1d, 0x68, 0xe4, - 0xb4, 0x21, 0x96, 0x01, 0xdd, 0x21, 0xd5, 0x05, 0x96, 0x01, 0x49, 0xff, - 0xed, 0xc8, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x2e, 0x24, 0xa2, 0x9f, 0x2e, 0x34, 0xa2, 0x9c, - 0x97, 0x80, 0x98, 0x9a, 0x9c, 0x13, 0x97, 0xc8, 0x4c, 0x60, 0x00, 0x04, - 0x99, 0x50, 0xde, 0x2a, 0x80, 0x07, 0x49, 0xfd, 0xd3, 0xf2, 0x80, 0x40, - 0xc0, 0x25, 0x80, 0x06, 0x80, 0x27, 0x02, 0x61, 0x01, 0x0e, 0x49, 0xfe, - 0xcc, 0x60, 0xa0, 0x04, 0xb4, 0x40, 0xa6, 0x53, 0xa6, 0x12, 0x40, 0x10, - 0xa0, 0x08, 0x40, 0x10, 0x80, 0x04, 0x84, 0xa1, 0xd9, 0x15, 0xa6, 0x14, - 0x84, 0xa2, 0xd8, 0x12, 0xa6, 0xd5, 0x3e, 0x35, 0x24, 0x7a, 0x00, 0x01, - 0x00, 0x09, 0x00, 0x21, 0x00, 0x08, 0x40, 0x00, 0x20, 0x08, 0x40, 0x00, - 0x08, 0x04, 0x8c, 0xaf, 0xd8, 0x05, 0x80, 0x06, 0x49, 0xff, 0xed, 0x49, - 0x92, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x3e, 0x0d, 0x82, 0x40, 0x49, 0xfe, 0x28, 0x13, - 0x84, 0x40, 0x3c, 0x0d, 0x60, 0x92, 0x46, 0x10, 0x00, 0xa1, 0x58, 0x10, - 0x8d, 0x8c, 0x80, 0x62, 0x80, 0x82, 0x84, 0xa1, 0x49, 0xfe, 0x28, 0xad, - 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xa0, 0xbc, 0x3e, 0x6d, 0xe7, 0x84, 0x00, 0x73, 0x00, 0x4d, 0xcf, 0x61, - 0x50, 0x03, 0x00, 0x5a, 0x49, 0xfe, 0x27, 0xf7, 0x00, 0x03, 0x00, 0x4e, - 0x44, 0x10, 0x00, 0x90, 0x4c, 0x00, 0xc0, 0x17, 0x85, 0x04, 0x14, 0x83, - 0x00, 0x2e, 0x85, 0x01, 0x3c, 0x1d, 0x5a, 0x2d, 0x10, 0x83, 0x00, 0x3d, - 0x04, 0x03, 0x00, 0x15, 0x10, 0x73, 0x00, 0x4e, 0x80, 0x47, 0x80, 0x67, - 0x80, 0x87, 0x84, 0xa1, 0x49, 0xfe, 0x28, 0x85, 0x10, 0x03, 0x00, 0x5a, - 0xd5, 0x42, 0x02, 0x03, 0x00, 0x28, 0x49, 0xfd, 0xd3, 0x92, 0xc0, 0x12, - 0x00, 0x00, 0x02, 0x46, 0x49, 0xff, 0xee, 0x33, 0x80, 0xc0, 0xe6, 0x09, - 0xe8, 0x0b, 0x44, 0x00, 0x00, 0x30, 0x80, 0x26, 0x49, 0xff, 0xee, 0x3b, - 0x80, 0x26, 0x44, 0x00, 0x00, 0x23, 0x49, 0xff, 0xfe, 0x26, 0x3c, 0x0d, - 0x79, 0xf2, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x2c, 0x49, 0xfd, 0xd3, 0x6d, - 0xc0, 0x07, 0x00, 0x10, 0x02, 0xa4, 0x42, 0x10, 0x80, 0x09, 0x10, 0x10, - 0x02, 0xa4, 0x3e, 0x1d, 0xe7, 0x84, 0x84, 0x40, 0x84, 0xc0, 0x10, 0x20, - 0x80, 0x3d, 0x44, 0x20, 0x00, 0xff, 0x12, 0x20, 0x80, 0x28, 0x3c, 0x02, - 0xb5, 0xe1, 0x14, 0x60, 0x80, 0x11, 0x14, 0x60, 0x80, 0x10, 0x44, 0x20, - 0xff, 0xfd, 0x3c, 0x1d, 0x5a, 0x3b, 0x40, 0x00, 0x08, 0x02, 0xdd, 0x21, - 0x3c, 0x2d, 0x59, 0x0d, 0x44, 0x10, 0x00, 0x21, 0x80, 0x06, 0xdd, 0x22, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x40, 0x90, 0x00, 0x13, 0x80, 0x09, 0x49, 0xfd, 0xd3, 0x6e, 0x3e, 0x7d, - 0xe7, 0xe0, 0x3e, 0x6d, 0x29, 0x46, 0x45, 0xc0, 0x00, 0x31, 0x44, 0x80, - 0x00, 0xff, 0x81, 0x40, 0xa4, 0x38, 0x49, 0xfd, 0xd3, 0x62, 0x80, 0x40, - 0xa4, 0x30, 0xf2, 0x81, 0x49, 0xfd, 0xd3, 0x5d, 0x80, 0x20, 0xa5, 0x78, - 0xf2, 0x01, 0x4c, 0x54, 0xc0, 0x0b, 0x4c, 0xa1, 0x00, 0x03, 0xca, 0x07, - 0x13, 0xc3, 0x80, 0x00, 0x12, 0x83, 0x80, 0x01, 0x12, 0x83, 0x80, 0x02, - 0xa5, 0x70, 0x9d, 0xfe, 0x4c, 0x54, 0xc0, 0x0e, 0x4c, 0xa0, 0x80, 0x03, - 0xc9, 0x0a, 0x84, 0x00, 0x13, 0xc3, 0x00, 0x00, 0x12, 0x83, 0x00, 0x01, - 0x12, 0x83, 0x00, 0x02, 0x10, 0x03, 0x7f, 0xfe, 0x3e, 0x1d, 0xe7, 0xf2, - 0x8c, 0xc8, 0x4c, 0x70, 0xff, 0xd7, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x3e, 0x5d, 0xe7, 0xe0, 0x80, 0xc2, - 0x54, 0x80, 0x00, 0xff, 0x97, 0xc8, 0x97, 0x21, 0xa4, 0x28, 0x4c, 0x02, - 0x40, 0x9d, 0xa4, 0x29, 0x4c, 0x01, 0x80, 0x05, 0xa4, 0x2a, 0x4c, 0x01, - 0xc0, 0x97, 0x44, 0x1f, 0xff, 0x90, 0x3e, 0x15, 0xe7, 0xd2, 0x3c, 0x4a, - 0xf3, 0xea, 0x84, 0x21, 0x04, 0x03, 0x00, 0x92, 0x4c, 0x00, 0xc0, 0x11, - 0x04, 0x03, 0x00, 0x48, 0xe6, 0x13, 0xe9, 0x0c, 0x80, 0x06, 0x84, 0x22, - 0x44, 0x20, 0x97, 0x56, 0x44, 0x30, 0xea, 0x60, 0x44, 0x40, 0x2b, 0xf2, - 0x84, 0xbf, 0x49, 0xfe, 0x01, 0xe4, 0x00, 0x03, 0x01, 0xab, 0x2e, 0x15, - 0xb3, 0xdb, 0x40, 0x00, 0x80, 0x02, 0x54, 0x00, 0x00, 0x06, 0xc8, 0x0f, - 0x44, 0x1f, 0xff, 0xa6, 0x3e, 0x2d, 0x4a, 0xc4, 0x10, 0x11, 0x00, 0x33, - 0x3e, 0x15, 0x6b, 0x9b, 0x10, 0x11, 0x00, 0x0b, 0x10, 0x11, 0x00, 0x1b, - 0x10, 0x11, 0x00, 0x23, 0x80, 0x27, 0x80, 0x08, 0x49, 0xfe, 0xcb, 0x35, - 0x02, 0x10, 0x00, 0x0a, 0xc1, 0x0c, 0x2e, 0x05, 0xe7, 0xc1, 0xc0, 0x09, - 0x5c, 0xf0, 0x82, 0xa8, 0xe9, 0x03, 0x84, 0x22, 0xd5, 0x02, 0x84, 0x23, - 0x3e, 0x15, 0x24, 0x7f, 0x3e, 0x6d, 0xe7, 0x84, 0x00, 0x93, 0x00, 0x3d, - 0x4e, 0x93, 0x00, 0x54, 0x80, 0x08, 0x80, 0x27, 0x49, 0xfe, 0xcb, 0x1d, - 0x81, 0x40, 0x3c, 0x2d, 0x59, 0x0d, 0x44, 0x10, 0x00, 0x21, 0x84, 0x01, - 0xdd, 0x22, 0x3c, 0x8d, 0x6c, 0xfc, 0x44, 0x00, 0x00, 0x44, 0x42, 0x83, - 0x80, 0x73, 0x80, 0x49, 0x50, 0x95, 0x00, 0x1a, 0x3c, 0x1d, 0x5a, 0x2d, - 0x14, 0x83, 0x00, 0x11, 0x04, 0x03, 0x00, 0x15, 0x14, 0x93, 0x00, 0x10, - 0x80, 0x62, 0x80, 0x82, 0x84, 0xa1, 0x49, 0xfe, 0x27, 0x82, 0x3c, 0x12, - 0xb5, 0xe1, 0x10, 0x03, 0x00, 0x5a, 0x58, 0x00, 0x80, 0x02, 0x3c, 0x1d, - 0x5a, 0x3b, 0x96, 0x01, 0x85, 0x01, 0xdd, 0x21, 0x10, 0x83, 0x00, 0x3d, - 0x80, 0x07, 0x49, 0xff, 0xec, 0xfc, 0x80, 0xc0, 0xe6, 0x09, 0xe8, 0x07, - 0x2e, 0x15, 0x24, 0x97, 0xc9, 0x08, 0x3e, 0x85, 0x24, 0x97, 0xd5, 0x05, - 0x80, 0x07, 0x49, 0xff, 0xed, 0x20, 0x80, 0xc0, 0x80, 0x26, 0x44, 0x00, - 0x00, 0x60, 0x49, 0xff, 0xed, 0x2a, 0x80, 0x26, 0x44, 0x00, 0x00, 0x46, - 0x49, 0xff, 0xfd, 0x15, 0x80, 0x06, 0x49, 0xff, 0xed, 0x08, 0xd5, 0x07, - 0x3e, 0x0d, 0xe7, 0xec, 0xd0, 0x04, 0x9d, 0x6e, 0x48, 0xff, 0xff, 0x5e, - 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x97, 0x80, - 0x54, 0x80, 0x80, 0xff, 0x80, 0x06, 0x80, 0x28, 0x49, 0xff, 0xfe, 0x4b, - 0x2e, 0x04, 0xa2, 0x9f, 0x2e, 0x14, 0xa2, 0x9c, 0x98, 0x48, 0x9c, 0x0b, - 0x4c, 0x60, 0x00, 0x05, 0x99, 0x48, 0x4c, 0x62, 0xc0, 0xf7, 0x2e, 0x05, - 0xe7, 0xd1, 0x4e, 0x03, 0x00, 0xf3, 0x80, 0x08, 0x49, 0xfd, 0xd2, 0x3b, - 0x81, 0x20, 0x4e, 0x02, 0x00, 0xed, 0x80, 0x06, 0x80, 0x28, 0x02, 0x74, - 0x81, 0x0e, 0x49, 0xfe, 0xca, 0xa8, 0xa0, 0x04, 0xb4, 0xa0, 0x9d, 0x6e, - 0x00, 0x32, 0xff, 0xfd, 0x00, 0x02, 0xff, 0xfc, 0x40, 0x31, 0xa0, 0x08, - 0x40, 0x31, 0x80, 0x04, 0x84, 0x01, 0x4c, 0x30, 0x40, 0xc9, 0x9e, 0x6a, - 0xa6, 0x08, 0x84, 0x42, 0x4c, 0x01, 0x40, 0x1e, 0xa6, 0x2b, 0xa6, 0xaa, - 0x40, 0x00, 0x20, 0x08, 0x40, 0x00, 0x08, 0x04, 0x44, 0x40, 0x00, 0x19, - 0x4c, 0x02, 0x40, 0x09, 0x3e, 0x35, 0xe7, 0xdc, 0x00, 0x02, 0xff, 0xff, - 0x3e, 0x05, 0xe7, 0xdd, 0xd5, 0x0c, 0x84, 0x43, 0x4c, 0x01, 0x40, 0x0a, - 0x3e, 0x35, 0x29, 0x40, 0x00, 0x52, 0xff, 0xff, 0x3e, 0x55, 0x29, 0x41, - 0x48, 0x00, 0x00, 0xb8, 0xa6, 0x88, 0x84, 0x66, 0x4c, 0x21, 0xc0, 0x1a, - 0x3e, 0x0d, 0x29, 0x44, 0x84, 0x20, 0xa4, 0x81, 0x4c, 0x23, 0xc0, 0x0e, - 0xa6, 0x80, 0xc2, 0x0b, 0xa6, 0xab, 0xa7, 0x2a, 0x40, 0x21, 0x20, 0x08, - 0xa4, 0xc2, 0x40, 0x21, 0x10, 0x04, 0x4c, 0x31, 0x40, 0x03, 0xae, 0x40, - 0x3e, 0x4d, 0x29, 0x54, 0x4c, 0x02, 0x00, 0x9e, 0x8c, 0x08, 0xd5, 0xec, - 0x3e, 0x0d, 0xe7, 0x84, 0x00, 0x30, 0x00, 0x58, 0xc3, 0x3b, 0x84, 0x63, - 0x4c, 0x21, 0xc0, 0x39, 0x00, 0x30, 0x00, 0x59, 0x00, 0x22, 0xff, 0xff, - 0x4c, 0x31, 0x40, 0x33, 0xa6, 0xaf, 0xa6, 0xee, 0x40, 0x21, 0x20, 0x08, - 0x40, 0x21, 0x0c, 0x04, 0xca, 0x25, 0x3c, 0x3d, 0x5a, 0x28, 0xe6, 0x63, - 0xe9, 0x03, 0x3c, 0x2f, 0x5a, 0x28, 0x3c, 0x3d, 0x5a, 0x28, 0x84, 0x06, - 0x42, 0x01, 0x80, 0x24, 0x3e, 0x4d, 0xe7, 0xe0, 0x98, 0x04, 0x9c, 0xd9, - 0x3c, 0x3f, 0x5a, 0x28, 0xad, 0xc0, 0xa6, 0xab, 0xa6, 0xea, 0x40, 0x21, - 0x20, 0x08, 0x40, 0x21, 0x0c, 0x04, 0xac, 0x81, 0xa6, 0xad, 0xa6, 0xec, - 0x40, 0x21, 0x20, 0x08, 0x40, 0x21, 0x0c, 0x04, 0xac, 0x82, 0x84, 0x40, - 0x50, 0x02, 0x7f, 0xa4, 0xd5, 0x05, 0x84, 0x61, 0x4c, 0x21, 0x80, 0x05, - 0x84, 0x40, 0x10, 0x20, 0x00, 0x58, 0x3e, 0x0d, 0x29, 0x40, 0xa6, 0x80, - 0xc2, 0x58, 0xa6, 0x48, 0x84, 0x83, 0x4c, 0x12, 0x40, 0x55, 0xa6, 0x81, - 0x00, 0x12, 0xff, 0xff, 0x4c, 0x20, 0xc0, 0x50, 0xa6, 0x6f, 0xa6, 0xae, - 0x40, 0x10, 0xa0, 0x08, 0x40, 0x10, 0x88, 0x04, 0xc9, 0x32, 0x3c, 0x2d, - 0x49, 0x28, 0xe2, 0x44, 0xe9, 0x03, 0x3c, 0x1f, 0x49, 0x28, 0x3c, 0x3d, - 0x49, 0x28, 0x3e, 0x4d, 0x29, 0x44, 0x94, 0x1b, 0x98, 0x04, 0x9c, 0xd9, - 0x3c, 0x3f, 0x49, 0x28, 0xad, 0xc1, 0xa6, 0x6b, 0xa7, 0x2a, 0x40, 0x10, - 0xa0, 0x08, 0x40, 0x10, 0x90, 0x04, 0x2e, 0x34, 0xa2, 0x9f, 0xac, 0x42, - 0x84, 0x82, 0x2e, 0x24, 0xa2, 0x9c, 0xa6, 0x6d, 0x98, 0x93, 0x9c, 0x93, - 0xa6, 0xec, 0x40, 0x63, 0x08, 0x03, 0x40, 0x10, 0xa0, 0x08, 0x84, 0xa1, - 0x40, 0x10, 0x8c, 0x04, 0x40, 0x22, 0x98, 0x1a, 0x40, 0x22, 0x18, 0x1b, - 0xac, 0x43, 0xae, 0x80, 0x84, 0x20, 0x3e, 0x0d, 0x29, 0x40, 0xd5, 0x05, - 0x84, 0x41, 0x4c, 0x11, 0x00, 0x15, 0x84, 0x20, 0xae, 0x40, 0xd5, 0x11, - 0x2e, 0x14, 0xa2, 0x9c, 0x2e, 0x04, 0xa2, 0x9f, 0x98, 0x49, 0x9c, 0x4b, - 0x98, 0x48, 0x98, 0x08, 0x4c, 0x60, 0x40, 0x08, 0x80, 0x06, 0x80, 0x28, - 0x80, 0x49, 0x80, 0x87, 0x49, 0xff, 0xfe, 0x49, 0x3a, 0x6f, 0xa8, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x3e, 0x0d, 0x83, 0xb0, 0x00, 0x20, - 0x00, 0x43, 0x00, 0x10, 0x00, 0x42, 0x98, 0x51, 0x96, 0x48, 0xc9, 0x23, - 0x00, 0x00, 0x00, 0x38, 0xc0, 0x20, 0x2e, 0x65, 0xe7, 0xc1, 0x84, 0xa1, - 0xde, 0x1c, 0x49, 0xfd, 0xd3, 0x30, 0xe6, 0x02, 0xe8, 0x18, 0x3e, 0x0d, - 0x82, 0xc0, 0x00, 0x10, 0x00, 0x6c, 0xc9, 0x13, 0x00, 0x10, 0x00, 0x84, - 0xc9, 0x10, 0x00, 0x10, 0x00, 0x3c, 0xc9, 0x0d, 0x00, 0x00, 0x00, 0x54, - 0xc8, 0x0a, 0x3e, 0x0d, 0x4a, 0xc4, 0x44, 0x10, 0x00, 0x78, 0x3e, 0x65, - 0x24, 0x7c, 0x10, 0x10, 0x00, 0x1e, 0xd5, 0x33, 0x2e, 0x05, 0xe7, 0xc1, - 0xc8, 0x33, 0x3e, 0x0d, 0x83, 0xb0, 0x00, 0x20, 0x00, 0x43, 0x00, 0x10, - 0x00, 0x42, 0x98, 0x51, 0x97, 0x48, 0x84, 0x41, 0xda, 0x29, 0x00, 0x00, - 0x00, 0x38, 0xc0, 0x26, 0x2e, 0x55, 0x24, 0x7e, 0xda, 0x23, 0x3e, 0x0d, - 0x82, 0xc0, 0x00, 0x10, 0x00, 0x6c, 0xc9, 0x1e, 0x00, 0x10, 0x00, 0x84, - 0xc9, 0x1b, 0x00, 0x10, 0x00, 0x3c, 0xc9, 0x18, 0x00, 0x00, 0x00, 0x54, - 0xc8, 0x15, 0x84, 0x63, 0x3e, 0x35, 0x24, 0x7c, 0x3e, 0x0d, 0x4a, 0xc4, - 0x44, 0x20, 0x00, 0x4a, 0x44, 0x10, 0x00, 0x32, 0x10, 0x20, 0x00, 0x46, - 0x44, 0x20, 0x00, 0x1e, 0x10, 0x10, 0x00, 0x1e, 0x10, 0x20, 0x00, 0x45, - 0x10, 0x10, 0x00, 0x0e, 0xd5, 0x12, 0x84, 0x60, 0x3e, 0x35, 0x24, 0x7c, - 0x3e, 0x0d, 0x4a, 0xc4, 0x44, 0x10, 0x00, 0x32, 0x44, 0x20, 0x00, 0x78, - 0x10, 0x10, 0x00, 0x46, 0x10, 0x20, 0x00, 0x45, 0x10, 0x10, 0x00, 0x0e, - 0x10, 0x10, 0x00, 0x1e, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xcf, 0x0b, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xd8, 0x4f, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x2e, 0x35, 0x9b, 0xcf, 0x2e, 0x25, - 0x9b, 0xce, 0x84, 0x20, 0x40, 0x10, 0x8c, 0x06, 0x98, 0x4a, 0x96, 0x48, - 0xc9, 0x04, 0x42, 0x50, 0x08, 0x09, 0xd5, 0x03, 0x58, 0x50, 0x00, 0x04, - 0x3c, 0x02, 0xb5, 0xe1, 0xd8, 0x04, 0x2e, 0x05, 0x24, 0x79, 0xc8, 0x17, - 0x85, 0x01, 0x3e, 0x85, 0x24, 0x79, 0x42, 0x62, 0xc4, 0x08, 0x3c, 0x5a, - 0xb5, 0xe1, 0x84, 0x07, 0x44, 0x10, 0x20, 0x00, 0x44, 0x20, 0x90, 0x8c, - 0x84, 0x60, 0x80, 0x86, 0x49, 0xfe, 0xb5, 0xab, 0x3c, 0x2d, 0x29, 0xa2, - 0x80, 0x26, 0x44, 0x00, 0x00, 0x51, 0xdd, 0x22, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x3e, 0x7d, 0xe7, 0x84, 0x80, 0xc0, - 0xa1, 0x3a, 0x84, 0x07, 0x84, 0x21, 0x44, 0x20, 0x90, 0x04, 0x96, 0xf1, - 0x04, 0x83, 0x80, 0x03, 0x49, 0xfe, 0xb5, 0x93, 0x54, 0x03, 0x00, 0x02, - 0xc0, 0x0c, 0x54, 0x04, 0x00, 0x02, 0xc0, 0x09, 0x3e, 0x0d, 0x6c, 0xfc, - 0x00, 0x13, 0x80, 0x25, 0xb4, 0x40, 0x40, 0x10, 0x88, 0x04, 0xd5, 0x14, - 0x2e, 0x15, 0xe7, 0xa9, 0x3c, 0x3d, 0x5b, 0x3f, 0x3c, 0x2d, 0x79, 0xe3, - 0x40, 0x10, 0x84, 0x05, 0x40, 0x10, 0x8c, 0x02, 0x54, 0x21, 0x00, 0x02, - 0x3c, 0x1f, 0x5b, 0x3f, 0xc2, 0x06, 0x46, 0x08, 0x10, 0x04, 0x58, 0x00, - 0x02, 0x44, 0xb6, 0x20, 0x54, 0x93, 0x00, 0x04, 0x4e, 0x92, 0x00, 0x07, - 0x54, 0x04, 0x00, 0x04, 0xc0, 0x03, 0x84, 0x21, 0xd5, 0x02, 0x84, 0x20, - 0x3e, 0x15, 0xe7, 0xf2, 0x3c, 0x0d, 0x79, 0xe3, 0x40, 0x03, 0x00, 0x03, - 0x54, 0x00, 0x00, 0x04, 0xc0, 0x1b, 0x4e, 0x92, 0x00, 0x0e, 0x3c, 0x0d, - 0x5a, 0x69, 0xdd, 0x20, 0x3c, 0x4d, 0x59, 0x08, 0x84, 0x07, 0x44, 0x10, - 0x20, 0x00, 0x44, 0x20, 0x90, 0x88, 0x84, 0x60, 0xd5, 0x0c, 0x3c, 0x0d, - 0x5a, 0x6a, 0xdd, 0x20, 0x3c, 0x4d, 0x59, 0x08, 0x80, 0x69, 0x84, 0x07, - 0x44, 0x10, 0x20, 0x00, 0x44, 0x20, 0x90, 0x89, 0xdd, 0x24, 0x3c, 0x0d, - 0x79, 0xe3, 0x40, 0x03, 0x00, 0x03, 0x54, 0x00, 0x40, 0x00, 0xc0, 0x21, - 0x54, 0x93, 0x40, 0x00, 0x4e, 0x92, 0x00, 0x10, 0x3c, 0x4d, 0x59, 0x08, - 0x84, 0x07, 0x44, 0x10, 0x20, 0x00, 0x44, 0x20, 0x90, 0x8a, 0x84, 0x60, - 0xdd, 0x24, 0x84, 0x01, 0x3c, 0x2d, 0x5a, 0x6d, 0x80, 0x20, 0xd5, 0x0e, - 0x3c, 0x4d, 0x59, 0x08, 0x84, 0x07, 0x44, 0x10, 0x20, 0x00, 0x44, 0x20, - 0x90, 0x8b, 0x80, 0x69, 0xdd, 0x24, 0x3c, 0x2d, 0x5a, 0x6d, 0x80, 0x09, - 0x84, 0x21, 0xdd, 0x22, 0x3e, 0x1d, 0xe7, 0x84, 0x00, 0x20, 0x80, 0x28, - 0x54, 0x03, 0x01, 0x00, 0xca, 0x13, 0xc0, 0x1d, 0x54, 0x84, 0x01, 0x00, - 0x4e, 0x82, 0x00, 0x1a, 0x84, 0x01, 0x10, 0x00, 0x80, 0x28, 0x46, 0x08, - 0x10, 0x04, 0x04, 0x10, 0x00, 0x41, 0x58, 0x10, 0x80, 0x08, 0x14, 0x10, - 0x00, 0x41, 0x84, 0x01, 0xd5, 0x09, 0xc8, 0x0b, 0x84, 0x5f, 0x10, 0x20, - 0x80, 0x2a, 0x10, 0x00, 0x80, 0x28, 0x10, 0x20, 0x80, 0x29, 0x3c, 0x1d, - 0x5a, 0x38, 0xdd, 0x21, 0x3c, 0x1d, 0x5a, 0x72, 0x80, 0x06, 0xdd, 0x21, - 0x44, 0x00, 0x80, 0x00, 0x40, 0x13, 0x00, 0x02, 0xc1, 0x02, 0x84, 0x21, - 0x3e, 0x15, 0x6b, 0x1e, 0x3c, 0x6f, 0x79, 0xe3, 0x3a, 0x6f, 0xa8, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x2e, 0x65, 0xe7, 0x94, 0xce, 0x1e, - 0x84, 0x21, 0x3e, 0x15, 0xe7, 0x94, 0x3e, 0x65, 0x24, 0x79, 0x3c, 0x02, - 0xb5, 0xe1, 0x3c, 0x1d, 0x5a, 0x3b, 0xdd, 0x21, 0x3c, 0x2d, 0x52, 0xc6, - 0x80, 0x26, 0x84, 0x0f, 0xdd, 0x22, 0x3c, 0x6d, 0x5a, 0x2e, 0x49, 0xfe, - 0x34, 0x82, 0x49, 0xfe, 0x07, 0xd4, 0xdd, 0x26, 0x3c, 0x1d, 0x5a, 0x2f, - 0x46, 0x00, 0x00, 0xff, 0x58, 0x00, 0x0f, 0xff, 0xdd, 0x21, 0x84, 0x00, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xd2, 0xe9, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x3c, 0x1d, 0x5a, 0x80, 0x84, 0x01, - 0xdd, 0x21, 0x46, 0x18, 0x10, 0x60, 0x04, 0x30, 0x80, 0x28, 0x3e, 0x7d, - 0x24, 0x84, 0x46, 0x28, 0x10, 0x02, 0xa6, 0x78, 0x54, 0x31, 0x83, 0x00, - 0x04, 0x61, 0x00, 0x0e, 0x84, 0x41, 0x92, 0x68, 0x4c, 0x11, 0x00, 0x0a, - 0xc1, 0x04, 0x84, 0xa2, 0xd9, 0x3d, 0xd5, 0x22, 0x84, 0xa1, 0xd8, 0x45, - 0xae, 0x38, 0xd5, 0x26, 0xc8, 0x02, 0xd5, 0x1d, 0x3e, 0x8d, 0x24, 0x4c, - 0xcb, 0x02, 0xd5, 0x30, 0xb4, 0x08, 0x50, 0x00, 0x00, 0x28, 0x80, 0x26, - 0x94, 0x04, 0x92, 0x04, 0x49, 0xfe, 0xa7, 0x21, 0xc0, 0x34, 0x84, 0x02, - 0xae, 0x38, 0x3c, 0x0d, 0x60, 0xf0, 0x84, 0xaa, 0xb6, 0xc8, 0xd8, 0x2d, - 0x3c, 0x3d, 0x52, 0xcc, 0x84, 0x00, 0x80, 0x20, 0x80, 0x40, 0xdd, 0x23, - 0xd5, 0x26, 0xc8, 0x03, 0xae, 0x38, 0xd5, 0x23, 0xcb, 0x05, 0x3c, 0x0d, - 0x60, 0xf0, 0x84, 0xaf, 0xd0, 0x04, 0x3c, 0x6f, 0x49, 0x13, 0xd5, 0x1b, - 0x3e, 0x8d, 0x24, 0x4c, 0xb4, 0x08, 0x50, 0x00, 0x00, 0x40, 0x80, 0x26, - 0x94, 0x04, 0x92, 0x04, 0x49, 0xfe, 0xa6, 0xfd, 0xc0, 0x10, 0x84, 0x01, - 0xae, 0x38, 0xb6, 0xc8, 0xd5, 0x0c, 0x84, 0x00, 0x80, 0x20, 0x46, 0x20, - 0x00, 0xaf, 0x58, 0x21, 0x08, 0x78, 0x44, 0x30, 0xe9, 0x9c, 0x49, 0xfb, - 0x13, 0x40, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xf4, 0x2e, 0x45, 0x24, 0x84, 0x2e, 0x35, 0x83, 0xe8, - 0x54, 0x80, 0x80, 0xff, 0x87, 0x80, 0x56, 0x12, 0x00, 0x02, 0x40, 0x8e, - 0x04, 0x1a, 0x80, 0xe0, 0x80, 0xc2, 0x4e, 0x32, 0x00, 0xd5, 0x46, 0x18, - 0x10, 0x02, 0x46, 0x08, 0x10, 0x02, 0x04, 0x30, 0x80, 0x10, 0x44, 0x57, - 0x79, 0xc0, 0x04, 0x40, 0x00, 0x0e, 0xf5, 0x81, 0x96, 0xdd, 0x84, 0x07, - 0x84, 0x21, 0x44, 0x20, 0x90, 0x01, 0xdd, 0x25, 0x40, 0x94, 0x20, 0x08, - 0x54, 0xa3, 0x80, 0xff, 0xf5, 0x01, 0x84, 0x07, 0x84, 0x21, 0x44, 0x20, - 0x90, 0x02, 0x40, 0x34, 0xa8, 0x04, 0x80, 0x86, 0xdd, 0x25, 0x2e, 0x15, - 0x24, 0x7d, 0x84, 0xa1, 0xd9, 0x03, 0x3f, 0xc5, 0x24, 0x7d, 0x3c, 0x1d, - 0x5a, 0x3b, 0x3c, 0x02, 0xb5, 0xe1, 0xdd, 0x21, 0x3c, 0x5d, 0x7a, 0x06, - 0x96, 0x2c, 0xc0, 0x1b, 0xe6, 0xef, 0xe9, 0x46, 0x84, 0x1f, 0x4c, 0x60, - 0x40, 0x44, 0x3c, 0x1d, 0x5a, 0x5a, 0x54, 0x02, 0x80, 0xfe, 0xdd, 0x21, - 0x2e, 0x05, 0xe8, 0x18, 0x44, 0x10, 0x08, 0x00, 0x40, 0x00, 0x40, 0x08, - 0x40, 0xa5, 0x00, 0x04, 0x3c, 0x4d, 0x59, 0x08, 0x40, 0x35, 0x24, 0x04, - 0x84, 0x07, 0x44, 0x20, 0x90, 0x46, 0xd5, 0x2b, 0x84, 0x5f, 0x3e, 0x1d, - 0x64, 0x20, 0x4c, 0x61, 0x00, 0x1a, 0x58, 0x02, 0x80, 0x01, 0x3c, 0x2d, - 0x5a, 0x5a, 0xf1, 0x81, 0x96, 0x00, 0xdd, 0x22, 0x2e, 0x05, 0xe8, 0x18, - 0xf1, 0x01, 0x40, 0x00, 0x40, 0x08, 0x40, 0xa5, 0x00, 0x04, 0xb4, 0x81, - 0x40, 0x35, 0x24, 0x04, 0x84, 0x07, 0x44, 0x10, 0x08, 0x00, 0x44, 0x20, - 0x90, 0x45, 0xdd, 0x24, 0xd5, 0x11, 0x97, 0x68, 0x40, 0x52, 0xc0, 0x08, - 0x40, 0xa5, 0x14, 0x04, 0xb4, 0x81, 0x40, 0x35, 0x24, 0x04, 0x84, 0x07, - 0x44, 0x10, 0x08, 0x00, 0x44, 0x20, 0x90, 0x48, 0xdd, 0x24, 0x48, 0x00, - 0x00, 0x61, 0x3c, 0x1d, 0x5a, 0x5f, 0x80, 0x06, 0x3e, 0x6d, 0xe7, 0x84, - 0xdd, 0x21, 0x04, 0x53, 0x00, 0x1f, 0x14, 0x03, 0x00, 0x22, 0xd8, 0x29, - 0x2e, 0x25, 0x83, 0xe0, 0x3c, 0x1d, 0x60, 0xf3, 0x94, 0x13, 0x98, 0x08, - 0x00, 0x90, 0x00, 0x06, 0x3c, 0x8d, 0x5a, 0x5f, 0x84, 0x00, 0x49, 0xfe, - 0xc1, 0x2a, 0xdd, 0x28, 0x81, 0x00, 0x40, 0x14, 0x88, 0x08, 0x04, 0x03, - 0x00, 0x22, 0x88, 0x28, 0x49, 0xfe, 0xa6, 0x43, 0xc0, 0x19, 0x40, 0x54, - 0xa4, 0x00, 0x88, 0xa8, 0x14, 0x53, 0x00, 0x1f, 0x14, 0x83, 0x00, 0x1c, - 0x80, 0x69, 0x80, 0x88, 0x84, 0x07, 0x44, 0x10, 0x08, 0x00, 0x44, 0x20, - 0x90, 0x49, 0x49, 0xfe, 0xb3, 0x9c, 0xd5, 0x08, 0x84, 0x01, 0x10, 0x83, - 0x00, 0x90, 0x10, 0x03, 0x00, 0x78, 0x14, 0x73, 0x00, 0x23, 0x3e, 0x6d, - 0xe7, 0x84, 0x49, 0xff, 0x7d, 0x2a, 0x04, 0x03, 0x00, 0x23, 0x85, 0x00, - 0x10, 0x83, 0x00, 0x90, 0xe6, 0x0f, 0xe8, 0x14, 0x2e, 0x05, 0x24, 0x84, - 0x84, 0xa1, 0xd8, 0x07, 0x84, 0xad, 0xd7, 0x05, 0x3c, 0x2d, 0x5a, 0x6e, - 0x84, 0x20, 0xd5, 0x05, 0x3c, 0x2d, 0x5a, 0x6e, 0x84, 0x00, 0x80, 0x20, - 0xdd, 0x22, 0x84, 0x21, 0x3e, 0x15, 0xe8, 0x15, 0xd5, 0x08, 0x3c, 0x2d, - 0x5a, 0x6e, 0x84, 0x20, 0x84, 0x01, 0xdd, 0x22, 0x10, 0x83, 0x00, 0x91, - 0x84, 0x00, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfd, 0xd0, 0x4d, 0xc8, 0x08, 0x2e, 0x15, - 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, 0xc0, 0x06, - 0x49, 0xfe, 0x34, 0x8b, 0x84, 0x20, 0x40, 0x00, 0x80, 0x06, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, - 0x3e, 0x2d, 0xe7, 0x84, 0x00, 0x31, 0x00, 0x6e, 0x80, 0xe1, 0x54, 0x80, - 0x00, 0xff, 0xc3, 0x4a, 0x04, 0x01, 0x00, 0x0f, 0x46, 0x10, 0x0f, 0xf0, - 0x58, 0x10, 0x80, 0xff, 0x40, 0x00, 0x04, 0x02, 0xc0, 0x41, 0x00, 0x01, - 0x00, 0xa4, 0xc0, 0x1b, 0x46, 0x28, 0x10, 0x04, 0x04, 0x01, 0x01, 0x01, - 0x42, 0x00, 0x40, 0x0b, 0xc8, 0x14, 0x54, 0x03, 0x80, 0x0c, 0xc0, 0x0a, - 0x46, 0x28, 0x10, 0x00, 0x04, 0x01, 0x00, 0x08, 0x44, 0x16, 0x00, 0x00, - 0x40, 0x00, 0x04, 0x02, 0xd5, 0x07, 0x46, 0x28, 0x10, 0x00, 0x04, 0x01, - 0x00, 0x0a, 0x54, 0x00, 0x00, 0x03, 0xc8, 0x03, 0x84, 0xc1, 0xd5, 0x02, - 0x84, 0xc2, 0x49, 0xfe, 0x34, 0x4e, 0x84, 0x21, 0x49, 0xfe, 0x36, 0x25, - 0x81, 0x20, 0x49, 0xfe, 0x34, 0x4c, 0x92, 0x00, 0x50, 0x24, 0x80, 0x02, - 0x94, 0x94, 0x92, 0x45, 0x94, 0x91, 0x9a, 0x82, 0x3e, 0x0d, 0x69, 0x34, - 0x44, 0x10, 0x02, 0x00, 0x54, 0x73, 0x80, 0x0c, 0x92, 0x41, 0xb4, 0xa0, - 0x95, 0x09, 0x40, 0x02, 0x1c, 0x1b, 0x40, 0x00, 0x9c, 0x1a, 0x96, 0x90, - 0x80, 0x26, 0x80, 0x68, 0xdd, 0x25, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x97, 0xc8, 0x55, 0xc1, - 0x00, 0xff, 0x54, 0x80, 0x00, 0xff, 0x49, 0xfe, 0x34, 0x22, 0x84, 0x21, - 0x49, 0xfe, 0x35, 0xf9, 0x2e, 0x65, 0xae, 0xed, 0x81, 0x20, 0xc6, 0x0a, - 0x80, 0x07, 0x84, 0x21, 0x3c, 0x7d, 0x6b, 0xb8, 0x49, 0xfe, 0x35, 0xef, - 0x40, 0x60, 0x24, 0x01, 0xd5, 0x02, 0x9d, 0xc2, 0x89, 0x08, 0x89, 0x1c, - 0x88, 0xe8, 0x49, 0xfe, 0x34, 0x10, 0x9a, 0x7e, 0x49, 0xfe, 0xa5, 0x6f, - 0x84, 0x20, 0x40, 0x00, 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x97, 0x80, 0x80, 0x06, 0x96, 0x48, - 0x49, 0xff, 0x8b, 0x0f, 0x92, 0x00, 0x3c, 0x0d, 0x6d, 0x1d, 0x54, 0x00, - 0x00, 0x07, 0xc8, 0x05, 0x3c, 0x0d, 0x5b, 0x3f, 0x96, 0x04, 0xc0, 0x0d, - 0x2e, 0x05, 0x6b, 0x9a, 0x40, 0x63, 0x20, 0x08, 0x42, 0x00, 0x3c, 0x08, - 0x46, 0x18, 0x10, 0x04, 0x40, 0x60, 0x18, 0x04, 0x14, 0x60, 0x80, 0x40, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x3c, 0x2d, - 0x6d, 0x1d, 0x97, 0x80, 0x54, 0x21, 0x00, 0x07, 0x96, 0x08, 0xca, 0x05, - 0x3c, 0x1d, 0x5b, 0x3f, 0x96, 0x4c, 0xc1, 0x3c, 0x49, 0xff, 0x97, 0x8d, - 0xc0, 0x0e, 0x3c, 0x0d, 0x5a, 0x7c, 0xdd, 0x20, 0xc0, 0x0a, 0x3e, 0x0d, - 0x6b, 0x99, 0xa6, 0x80, 0x84, 0x28, 0x40, 0x10, 0x98, 0x0e, 0x40, 0x10, - 0x88, 0x04, 0xd5, 0x0b, 0x3e, 0x0d, 0x6b, 0x99, 0x84, 0x28, 0x40, 0x10, - 0x98, 0x0e, 0xa6, 0x80, 0x40, 0x10, 0x84, 0x05, 0x40, 0x10, 0x88, 0x02, - 0xae, 0x40, 0x3c, 0x0d, 0x5b, 0x3f, 0x46, 0x78, 0x10, 0x04, 0x14, 0x03, - 0x80, 0x91, 0x2e, 0x05, 0x6b, 0x99, 0x40, 0x13, 0x20, 0x08, 0x81, 0x07, - 0x40, 0x00, 0x80, 0x04, 0x14, 0x04, 0x00, 0x40, 0x3c, 0x2d, 0x5a, 0x25, - 0x80, 0x26, 0x84, 0x00, 0xdd, 0x22, 0x04, 0x34, 0x00, 0x40, 0x04, 0x43, - 0x80, 0x91, 0x96, 0xd9, 0x84, 0x07, 0x44, 0x10, 0x01, 0x00, 0x44, 0x20, - 0x90, 0x1e, 0x49, 0xfe, 0xb0, 0x74, 0x3c, 0x0d, 0x6d, 0x1d, 0x54, 0x00, - 0x00, 0x07, 0xc8, 0x05, 0x3c, 0x0d, 0x5b, 0x3f, 0x96, 0x04, 0xc0, 0x0d, - 0x2e, 0x15, 0x6b, 0x99, 0x40, 0x63, 0x20, 0x08, 0x42, 0x10, 0xbc, 0x08, - 0x46, 0x08, 0x10, 0x04, 0x40, 0x60, 0x98, 0x04, 0x14, 0x60, 0x00, 0x40, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x3e, 0x6d, - 0xe7, 0x84, 0x00, 0x73, 0x00, 0x29, 0x00, 0x83, 0x00, 0x2a, 0x49, 0xff, - 0x7a, 0x44, 0x44, 0x00, 0x00, 0x20, 0x12, 0x03, 0x00, 0x59, 0x84, 0x00, - 0x10, 0x83, 0x00, 0x2a, 0x14, 0x03, 0x00, 0x2e, 0x10, 0x73, 0x00, 0x29, - 0x49, 0xff, 0xf8, 0xe1, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, 0xd6, 0x5e, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0x49, 0xfc, 0xdd, 0x6e, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x54, 0xa0, 0x80, 0xff, - 0x55, 0xc0, 0x00, 0xff, 0x80, 0x0a, 0x80, 0xc2, 0x49, 0xfd, 0xcd, 0x07, - 0x81, 0x20, 0x80, 0x0a, 0x49, 0xff, 0xe7, 0xb5, 0x81, 0x00, 0x2e, 0x14, - 0xa2, 0x9c, 0x2e, 0x04, 0xa2, 0x9f, 0x98, 0x49, 0x9c, 0x4b, 0x98, 0x48, - 0x99, 0x48, 0x4d, 0xc2, 0xc0, 0x11, 0x4e, 0x92, 0x00, 0x0f, 0x80, 0x09, - 0x49, 0xfd, 0xf7, 0x67, 0x84, 0xa1, 0x4c, 0x02, 0x81, 0x76, 0x80, 0x09, - 0x49, 0xfd, 0xf7, 0x61, 0x44, 0x50, 0x00, 0x10, 0x4c, 0x02, 0x81, 0x6f, - 0x80, 0x1c, 0x80, 0x2a, 0x49, 0xfe, 0xc5, 0x5b, 0x80, 0xe0, 0x4e, 0x02, - 0x01, 0x68, 0x02, 0x00, 0x00, 0x0d, 0x4e, 0x02, 0x01, 0x64, 0x84, 0xa9, - 0x4c, 0x82, 0x80, 0x0f, 0x04, 0x14, 0x80, 0x92, 0xc9, 0x0b, 0x80, 0x08, - 0x49, 0xff, 0xe7, 0x9f, 0x44, 0x50, 0x00, 0x10, 0xd8, 0x05, 0x42, 0x63, - 0x78, 0x09, 0x42, 0x63, 0x7c, 0x09, 0x84, 0x23, 0x04, 0x83, 0x80, 0x03, - 0x4d, 0xc0, 0xc0, 0x1d, 0x50, 0x0f, 0x80, 0x0c, 0x49, 0xfa, 0xf7, 0xd7, - 0x22, 0x53, 0x80, 0x00, 0x22, 0x03, 0x80, 0x02, 0x80, 0x88, 0xd8, 0x05, - 0xa4, 0xbb, 0x84, 0x00, 0xac, 0x38, 0xac, 0xba, 0xf0, 0x03, 0xf4, 0x81, - 0x49, 0xfa, 0xf7, 0xdf, 0x84, 0x00, 0x12, 0x03, 0x80, 0x0a, 0x84, 0x03, - 0x10, 0x04, 0x00, 0x08, 0xf4, 0x01, 0x48, 0x00, 0x01, 0x35, 0x3e, 0x1c, - 0xa2, 0x9c, 0xa6, 0x88, 0xa6, 0xcb, 0x98, 0x12, 0x9c, 0x03, 0x98, 0x03, - 0x98, 0x93, 0x98, 0x03, 0x9c, 0x92, 0x98, 0x90, 0x80, 0x88, 0x4d, 0xc1, - 0x40, 0x17, 0x54, 0x13, 0x00, 0x80, 0xc1, 0x04, 0x84, 0x47, 0x48, 0x00, - 0x00, 0xe4, 0x54, 0x13, 0x00, 0x40, 0xc1, 0x04, 0x84, 0x46, 0x48, 0x00, - 0x00, 0xde, 0x54, 0x13, 0x01, 0x20, 0x84, 0xa5, 0x40, 0x20, 0x84, 0x1a, - 0x40, 0x22, 0x84, 0x1b, 0x48, 0x00, 0x00, 0xd5, 0x4d, 0xc0, 0x40, 0x0e, - 0xa6, 0x4a, 0xe3, 0x41, 0xe8, 0x03, 0x84, 0x20, 0xd5, 0x04, 0x98, 0x4b, - 0x40, 0x15, 0x04, 0x07, 0xc1, 0x04, 0x84, 0x40, 0x48, 0x00, 0x00, 0xc9, - 0x2e, 0x15, 0x6a, 0x57, 0xc1, 0x08, 0x54, 0x13, 0x00, 0x08, 0xc1, 0x05, - 0xe6, 0xc9, 0xe9, 0x03, 0x42, 0x63, 0x0c, 0x09, 0x4e, 0x92, 0x00, 0x46, - 0x04, 0x24, 0x80, 0x06, 0xca, 0x42, 0x02, 0x14, 0x00, 0x06, 0xe6, 0x32, - 0xe8, 0x06, 0x54, 0x13, 0x00, 0x08, 0x4e, 0x13, 0x00, 0x97, 0xd5, 0x03, - 0xe6, 0x3c, 0xe8, 0x06, 0x54, 0x13, 0x00, 0x10, 0x4e, 0x13, 0x00, 0x8e, - 0xd5, 0x04, 0x5c, 0xf0, 0x80, 0x7a, 0xe8, 0x06, 0x54, 0x13, 0x04, 0x00, - 0x4e, 0x13, 0x00, 0x84, 0xd5, 0x04, 0x5c, 0xf0, 0x80, 0xb8, 0xe8, 0x06, - 0x54, 0x13, 0x08, 0x00, 0x4e, 0x13, 0x00, 0x96, 0xd5, 0x04, 0x5c, 0xf0, - 0x80, 0xe1, 0xe8, 0x05, 0x54, 0x13, 0x40, 0x00, 0x4e, 0x13, 0x00, 0x90, - 0x40, 0x13, 0x40, 0x08, 0x92, 0x3f, 0xc1, 0x04, 0x84, 0x4f, 0x48, 0x00, - 0x00, 0x8a, 0x54, 0x13, 0x40, 0x00, 0x4e, 0x13, 0x00, 0x85, 0x54, 0x13, - 0x08, 0x00, 0x4e, 0x13, 0x00, 0x7f, 0x54, 0x13, 0x04, 0x00, 0xc9, 0x61, - 0x54, 0x13, 0x00, 0x10, 0xc9, 0x60, 0x54, 0x13, 0x01, 0x00, 0xc1, 0x57, - 0x84, 0x48, 0xd5, 0x76, 0x2e, 0x25, 0xe7, 0xc1, 0xc2, 0x17, 0x3c, 0x1d, - 0x79, 0xf2, 0xc1, 0x14, 0x00, 0x50, 0x80, 0x2c, 0x00, 0x14, 0x82, 0x46, - 0xd9, 0x0f, 0x2e, 0x25, 0x6b, 0x3a, 0x2e, 0x15, 0x6b, 0x3b, 0x98, 0x51, - 0x96, 0x48, 0xc9, 0x08, 0x04, 0x94, 0x80, 0x92, 0x84, 0xa1, 0x4c, 0x92, - 0xc0, 0x04, 0x42, 0x63, 0x78, 0x08, 0x02, 0x14, 0x00, 0x06, 0xe6, 0x32, - 0xe8, 0x05, 0x54, 0x13, 0x00, 0x08, 0xc9, 0x3d, 0xd5, 0x04, 0x5c, 0xf0, - 0x80, 0x37, 0xe8, 0x05, 0x42, 0x13, 0x50, 0x0b, 0xc9, 0x38, 0xd5, 0x04, - 0x5c, 0xf0, 0x80, 0x54, 0xe8, 0x05, 0x42, 0x13, 0x60, 0x0b, 0xc9, 0x34, - 0xd5, 0x04, 0x5c, 0xf0, 0x81, 0x70, 0xe8, 0x05, 0x42, 0x13, 0x68, 0x0b, - 0xc9, 0x30, 0xd5, 0x04, 0x5c, 0xf0, 0x82, 0x29, 0xe8, 0x05, 0x42, 0x13, - 0x6c, 0x0b, 0xc9, 0x2c, 0xd5, 0x04, 0x5c, 0xf0, 0x82, 0xa8, 0xe8, 0x04, - 0x42, 0x13, 0x78, 0x0b, 0xc9, 0x28, 0x4e, 0x65, 0x00, 0x2a, 0x42, 0x13, - 0x78, 0x0b, 0xc9, 0x23, 0x42, 0x13, 0x6c, 0x0b, 0xc9, 0x1d, 0x42, 0x13, - 0x68, 0x0b, 0xc9, 0x17, 0x42, 0x13, 0x60, 0x0b, 0xc9, 0x11, 0x42, 0x13, - 0x50, 0x0b, 0xc9, 0x0b, 0x54, 0x13, 0x02, 0x00, 0xc9, 0x1a, 0xd5, 0x05, - 0x84, 0x4a, 0xd5, 0x1c, 0x84, 0x44, 0xd5, 0x1a, 0x84, 0x43, 0xd5, 0x18, - 0x44, 0x20, 0x00, 0x24, 0xd5, 0x15, 0x44, 0x20, 0x00, 0x38, 0xd5, 0x12, - 0x44, 0x20, 0x00, 0x2a, 0xd5, 0x0f, 0x44, 0x20, 0x00, 0x3b, 0xd5, 0x0c, - 0x44, 0x20, 0x00, 0x2e, 0xd5, 0x09, 0x44, 0x20, 0x00, 0x3f, 0xd5, 0x06, - 0x84, 0x49, 0xd5, 0x04, 0x84, 0x4b, 0xd5, 0x02, 0x84, 0x4e, 0x4d, 0xc0, - 0x40, 0x0f, 0x2e, 0x04, 0xa2, 0x9e, 0xe3, 0x40, 0xe8, 0x03, 0x85, 0x40, - 0xd5, 0x04, 0x98, 0xc3, 0x40, 0xa5, 0x0c, 0x07, 0x4e, 0xa2, 0x00, 0x04, - 0x97, 0xb1, 0xd5, 0x12, 0x54, 0x01, 0x00, 0x0f, 0xe6, 0x58, 0xe8, 0x06, - 0x46, 0x10, 0x00, 0x96, 0x58, 0x10, 0x8e, 0xd8, 0xd5, 0x05, 0x46, 0x10, - 0x00, 0x96, 0x58, 0x10, 0x8e, 0xf8, 0x38, 0x60, 0x81, 0x01, 0x10, 0x24, - 0x00, 0x08, 0x02, 0x03, 0x80, 0x0b, 0xc0, 0x06, 0x02, 0x14, 0x00, 0x06, - 0x98, 0x01, 0x12, 0x04, 0x00, 0x06, 0x02, 0x04, 0x00, 0x06, 0xe2, 0xc0, - 0xe8, 0x0d, 0x44, 0x10, 0xff, 0xfc, 0x40, 0x63, 0x04, 0x02, 0x9a, 0x46, - 0x12, 0x13, 0x80, 0x0b, 0x12, 0x03, 0x80, 0x0a, 0x12, 0x64, 0x00, 0x06, - 0xd5, 0x06, 0x84, 0x00, 0x12, 0x03, 0x80, 0x0a, 0xd5, 0x02, 0x84, 0x80, - 0x80, 0x04, 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xf4, 0x2e, 0x25, 0x9b, 0xd2, 0x2e, 0x15, 0x9b, 0xcf, - 0x50, 0x60, 0x00, 0x40, 0x2e, 0x94, 0xa2, 0x9c, 0xe2, 0x41, 0xe8, 0x03, - 0x84, 0x01, 0xd5, 0x02, 0x84, 0x00, 0xae, 0x33, 0x2e, 0x15, 0x9b, 0xd1, - 0x2e, 0x05, 0x9b, 0xce, 0x84, 0xe0, 0x9a, 0x01, 0xae, 0x32, 0x84, 0x00, - 0xae, 0x34, 0xd5, 0x17, 0x49, 0xfd, 0xcb, 0x59, 0xc0, 0x13, 0xb4, 0x20, - 0x54, 0x10, 0x80, 0x04, 0xc9, 0x0f, 0x00, 0x10, 0x02, 0xa4, 0x96, 0x4c, - 0xc1, 0x0b, 0xa6, 0x74, 0x9c, 0x49, 0xae, 0x74, 0x04, 0x00, 0x00, 0x92, - 0xc0, 0x05, 0xa6, 0x32, 0x9e, 0x41, 0xc0, 0x02, 0xae, 0x72, 0x9d, 0xf9, - 0x96, 0x78, 0x80, 0x07, 0xe2, 0x29, 0xe9, 0xe7, 0x2e, 0x15, 0x9b, 0xd2, - 0x2e, 0x25, 0x9b, 0xcf, 0xa6, 0x34, 0x9b, 0x51, 0xd8, 0x0a, 0x3c, 0x0d, - 0x79, 0xf2, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x2e, 0x84, 0xa1, 0xd8, 0x03, - 0x84, 0x00, 0xae, 0x33, 0x00, 0x73, 0x7f, 0xfb, 0x2e, 0x15, 0x83, 0xf3, - 0x2e, 0x05, 0x83, 0xf2, 0xc7, 0x08, 0x2e, 0x75, 0x24, 0x7c, 0x84, 0x40, - 0x56, 0x73, 0x80, 0x01, 0x40, 0x71, 0x1c, 0x06, 0x98, 0x08, 0x96, 0x00, - 0xc0, 0x03, 0x58, 0x73, 0x80, 0x02, 0xa6, 0x34, 0xc0, 0x03, 0x58, 0x73, - 0x80, 0x04, 0x00, 0x03, 0x7f, 0xf8, 0xc0, 0x03, 0x58, 0x73, 0x80, 0x08, - 0x50, 0x0f, 0x80, 0x04, 0x49, 0xfa, 0xf6, 0x23, 0x04, 0x53, 0x7f, 0xf0, - 0xd7, 0x17, 0x84, 0x00, 0x84, 0xaf, 0x14, 0x73, 0x7f, 0xf0, 0x10, 0x03, - 0x7f, 0xf9, 0xdf, 0x03, 0x84, 0x02, 0xd5, 0x0c, 0x84, 0xad, 0xd7, 0x09, - 0x84, 0xab, 0xd7, 0x07, 0x84, 0xaa, 0xd7, 0x05, 0x84, 0xac, 0xd7, 0x03, - 0x84, 0xae, 0xdf, 0x02, 0x84, 0x01, 0x10, 0x03, 0x7f, 0xfa, 0x00, 0x43, - 0x7f, 0xfa, 0x96, 0xf9, 0x84, 0x21, 0x44, 0x20, 0x8f, 0xf0, 0x84, 0x06, - 0x49, 0xfe, 0xae, 0x0b, 0xf0, 0x01, 0x49, 0xfa, 0xf6, 0x14, 0x92, 0x00, - 0x04, 0x03, 0x7f, 0xf0, 0x84, 0x20, 0x40, 0x00, 0x80, 0x06, 0xec, 0x0c, - 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x48, 0x96, 0x91, 0x96, 0x00, 0x49, 0xfc, 0xd4, 0x5a, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0x49, 0xfc, 0xe0, 0xea, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xc4, 0x84, 0x02, 0x80, 0x3f, - 0xf2, 0x81, 0x49, 0xff, 0xff, 0xf0, 0xec, 0x3c, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x00, 0x30, 0x80, 0x08, - 0x84, 0x81, 0x96, 0x00, 0x4c, 0x32, 0x00, 0x09, 0xc3, 0x04, 0x84, 0xa2, - 0xdb, 0x0b, 0xd5, 0x07, 0x49, 0xff, 0xff, 0xe7, 0xd5, 0x07, 0x49, 0xfd, - 0x4a, 0x64, 0xd5, 0x04, 0x49, 0xfd, 0x36, 0x97, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x54, 0x90, - 0x00, 0xff, 0x84, 0x20, 0x3e, 0x0d, 0x48, 0x3d, 0x44, 0x20, 0x00, 0x26, - 0x49, 0xff, 0x2f, 0x67, 0x3e, 0x6d, 0xb3, 0xb4, 0x84, 0xe0, 0x85, 0x01, - 0x3e, 0x85, 0x24, 0x63, 0x12, 0x73, 0x00, 0x3e, 0x12, 0x73, 0x00, 0x3c, - 0x4e, 0x93, 0x00, 0x1e, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x13, 0x00, 0x28, - 0x00, 0x33, 0x00, 0x2a, 0x42, 0x21, 0x0c, 0x09, 0x42, 0x10, 0x98, 0x09, - 0x42, 0x31, 0x84, 0x09, 0x10, 0x33, 0x00, 0x2a, 0x84, 0x05, 0x3e, 0x75, - 0x6a, 0x90, 0x3e, 0x85, 0xa8, 0x68, 0x10, 0x03, 0x00, 0x7f, 0x10, 0x23, - 0x00, 0x2c, 0x10, 0x13, 0x00, 0x28, 0x10, 0x03, 0x00, 0x7e, 0xd5, 0x23, - 0x85, 0x26, 0x50, 0x03, 0x00, 0xe2, 0x84, 0x20, 0x84, 0x48, 0x10, 0x93, - 0x00, 0x7e, 0x10, 0x93, 0x00, 0x7f, 0x49, 0xff, 0x2f, 0x34, 0x3c, 0x2d, - 0x59, 0x25, 0x00, 0x13, 0x01, 0x52, 0x42, 0x21, 0x4c, 0x09, 0x42, 0x21, - 0x54, 0x09, 0x92, 0x21, 0x3c, 0x2f, 0x59, 0x25, 0x3e, 0x15, 0x6b, 0x7c, - 0x3e, 0x75, 0x6a, 0xc3, 0x10, 0x93, 0x01, 0x59, 0x10, 0x83, 0x00, 0xe2, - 0x3e, 0x75, 0x6a, 0xc4, 0x10, 0x73, 0x01, 0x60, 0x44, 0x00, 0xfc, 0xbc, - 0x84, 0x20, 0x49, 0xfd, 0x2f, 0x5a, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x41, 0x3e, 0x25, - 0x24, 0x64, 0x49, 0xff, 0xe3, 0x28, 0x44, 0x00, 0xfc, 0x79, 0x84, 0x20, - 0x49, 0xfd, 0x2f, 0x49, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xdf, 0xbd, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xc4, 0x3c, 0x7d, 0x77, 0x95, 0x81, 0x41, 0x81, 0x00, - 0x51, 0xc0, 0x80, 0x26, 0x80, 0xc7, 0xd5, 0x16, 0x50, 0x03, 0x00, 0x0c, - 0x80, 0xe6, 0x49, 0xff, 0x2e, 0xf0, 0xc8, 0x0f, 0x3e, 0x9d, 0xb8, 0x74, - 0x40, 0x93, 0x24, 0x01, 0x46, 0x0a, 0xaa, 0xaa, 0x91, 0x25, 0x58, 0x00, - 0x0a, 0xab, 0x42, 0x94, 0x80, 0x24, 0x54, 0x94, 0x80, 0xff, 0xd5, 0x09, - 0xb4, 0xc6, 0x3e, 0x0d, 0xde, 0x54, 0x80, 0x3c, 0x84, 0x46, 0x4c, 0x60, - 0x7f, 0xe7, 0x85, 0x20, 0x3c, 0x1d, 0x59, 0x39, 0x3e, 0x6d, 0xde, 0x54, - 0x80, 0x07, 0xdd, 0x21, 0xa6, 0x76, 0xa6, 0x35, 0x9e, 0x49, 0x9c, 0x01, - 0x87, 0x80, 0xae, 0x76, 0xae, 0x35, 0x11, 0xc3, 0x80, 0x04, 0xa6, 0x36, - 0xc0, 0x29, 0x49, 0xfe, 0xce, 0xd8, 0xb6, 0x08, 0xc8, 0x03, 0x84, 0x07, - 0xd5, 0x49, 0x00, 0x24, 0x00, 0x08, 0x3c, 0x3d, 0x6d, 0x80, 0x84, 0x21, - 0x40, 0x10, 0x88, 0x0c, 0x40, 0x10, 0x8c, 0x04, 0x3c, 0x1f, 0x6d, 0x80, - 0x11, 0xc4, 0x00, 0x06, 0xb4, 0x06, 0xa4, 0x84, 0x96, 0x11, 0x5c, 0xf0, - 0x00, 0x20, 0xe8, 0x03, 0x44, 0x20, 0x00, 0x20, 0x84, 0x20, 0xb4, 0x68, - 0x96, 0x11, 0x84, 0x81, 0x46, 0x20, 0x00, 0x7f, 0x58, 0x21, 0x0a, 0xec, - 0x80, 0xa1, 0x49, 0xfe, 0x1e, 0xc6, 0x10, 0x04, 0x00, 0x09, 0x3c, 0x2d, - 0x57, 0xec, 0x84, 0x20, 0x80, 0x0a, 0xdd, 0x22, 0x5c, 0xf4, 0x80, 0x64, - 0xe8, 0x0f, 0x84, 0x00, 0xf0, 0x85, 0x10, 0x9f, 0x80, 0x2c, 0x02, 0xa5, - 0x00, 0x87, 0x3c, 0x2d, 0x57, 0xfd, 0x12, 0xaf, 0x80, 0x0f, 0x80, 0x3f, - 0x44, 0x00, 0x00, 0x55, 0xdd, 0x22, 0x3c, 0x1d, 0x53, 0x95, 0x42, 0x10, - 0xd8, 0x0b, 0xc1, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x40, - 0xc0, 0x06, 0x80, 0x29, 0x44, 0x00, 0x76, 0x8a, 0x49, 0xfe, 0xac, 0x81, - 0x84, 0x00, 0xec, 0x3c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa8, 0xbc, 0x44, 0x60, 0x00, 0x60, 0x54, 0x90, 0x80, 0xff, 0x42, 0x64, - 0x98, 0x24, 0x97, 0xc0, 0x3e, 0x0d, 0xb8, 0x74, 0x99, 0xb0, 0xa6, 0x34, - 0x3c, 0xad, 0x6d, 0x80, 0x4c, 0x03, 0x80, 0x7c, 0xc7, 0x12, 0x3c, 0x2d, - 0x6e, 0x1a, 0x4e, 0x23, 0x00, 0x7c, 0x49, 0xfe, 0xce, 0x70, 0x3c, 0x0f, - 0x6e, 0x1a, 0xc8, 0x04, 0x84, 0xe7, 0x48, 0x00, 0x00, 0x70, 0x84, 0x21, - 0x10, 0x10, 0x01, 0x36, 0x48, 0x00, 0x00, 0x6f, 0x2e, 0x15, 0xde, 0x5b, - 0x84, 0xa1, 0xd9, 0x44, 0xd5, 0x36, 0x2e, 0x15, 0xde, 0x5a, 0xc9, 0x61, - 0x3e, 0x85, 0xde, 0x5b, 0xaf, 0xf4, 0x3c, 0x1d, 0x59, 0x3a, 0x80, 0x06, - 0xdd, 0x21, 0x3c, 0x1d, 0x59, 0x35, 0x80, 0x08, 0xd5, 0x32, 0x2e, 0x15, - 0xde, 0x5a, 0x2e, 0x05, 0xde, 0x59, 0x9c, 0x49, 0x9e, 0x01, 0x3e, 0x15, - 0xde, 0x5a, 0x3e, 0x05, 0xde, 0x59, 0xaf, 0xf4, 0x3c, 0x1d, 0x59, 0x3a, - 0x54, 0xa5, 0x00, 0x3f, 0x80, 0x06, 0xdd, 0x21, 0x4e, 0xa3, 0x00, 0x06, - 0x3c, 0x1d, 0x59, 0x35, 0x84, 0x01, 0xd5, 0x32, 0x3c, 0x0d, 0x77, 0x95, - 0xa4, 0x44, 0x5c, 0xf0, 0x80, 0x20, 0xe8, 0x04, 0x44, 0x10, 0x00, 0x20, - 0xd5, 0x02, 0x96, 0x48, 0x3e, 0x0d, 0xb8, 0x71, 0x49, 0xfe, 0x1e, 0x07, - 0x84, 0xe0, 0xd5, 0x24, 0x3e, 0x75, 0xde, 0x5b, 0xaf, 0xf4, 0x3c, 0x1d, - 0x59, 0x39, 0x80, 0x06, 0xdd, 0x21, 0x3c, 0x1d, 0x59, 0x35, 0x80, 0x07, - 0xdd, 0x21, 0x80, 0xe0, 0xd5, 0x23, 0x2e, 0x25, 0xde, 0x5a, 0x2e, 0x15, - 0xde, 0x59, 0x9e, 0x91, 0x9c, 0x49, 0x3e, 0x15, 0xde, 0x59, 0x3e, 0x25, - 0xde, 0x5a, 0xaf, 0xf4, 0x3c, 0x1d, 0x59, 0x39, 0x80, 0x06, 0xdd, 0x21, - 0x2e, 0x05, 0xde, 0x5a, 0xc8, 0x05, 0x3c, 0x1d, 0x59, 0x35, 0xdd, 0x21, - 0x80, 0xe0, 0x2e, 0x45, 0xde, 0x5a, 0x46, 0x10, 0x04, 0x00, 0x80, 0x69, - 0x84, 0x06, 0x44, 0x20, 0x76, 0x87, 0x49, 0xfe, 0xae, 0x2a, 0xd5, 0x02, - 0x84, 0xec, 0x80, 0x07, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x00, 0x83, - 0x00, 0x0a, 0x84, 0xa1, 0x4c, 0x82, 0xbf, 0x95, 0x48, 0xff, 0xff, 0xa1, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x0d, 0x60, 0x93, - 0x84, 0xa3, 0xd8, 0x12, 0x2e, 0x15, 0x80, 0xa0, 0xc9, 0x0b, 0x2e, 0x25, - 0x80, 0xa1, 0xca, 0x08, 0x3c, 0x2f, 0x60, 0x93, 0x80, 0x22, 0x84, 0x08, - 0x49, 0xfd, 0x2e, 0x25, 0xd5, 0x05, 0x49, 0xfe, 0xca, 0xd0, 0x49, 0xff, - 0xe1, 0x4e, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x48, 0x96, 0x90, 0x96, 0xd8, 0x96, 0x00, - 0x49, 0xfc, 0xc8, 0xbf, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xc5, 0xff, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x2e, 0x05, 0x80, 0xa8, 0xc8, 0x02, 0xd5, 0x03, - 0x84, 0xa1, 0xd8, 0x06, 0x44, 0x01, 0x86, 0xa0, 0x49, 0xfa, 0xf6, 0xe3, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x3e, 0x6d, 0x80, 0xa0, 0xa6, 0x35, 0x84, 0xa1, 0xd0, 0x07, - 0x49, 0xff, 0xff, 0xe7, 0x84, 0x00, 0xae, 0x31, 0x84, 0x01, 0xae, 0x35, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x3e, 0x6d, 0x80, 0xa0, 0xa7, 0x75, 0x84, 0x21, 0xd1, 0x36, 0xa7, 0xf3, - 0x4c, 0x70, 0xc0, 0x06, 0x49, 0xff, 0xff, 0xd3, 0xaf, 0xf5, 0xd5, 0x2f, - 0x84, 0xa4, 0xdf, 0x06, 0x49, 0xff, 0xff, 0xcd, 0x84, 0x01, 0xae, 0x35, - 0xd5, 0x28, 0x84, 0xa3, 0xd7, 0x26, 0x84, 0xa2, 0xdf, 0x0c, 0x3e, 0x2d, - 0x81, 0x0c, 0x00, 0x31, 0x00, 0x21, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x11, - 0x00, 0x1f, 0x00, 0x21, 0x00, 0x20, 0xd5, 0x12, 0x84, 0xa5, 0xdf, 0x17, - 0x00, 0x03, 0x00, 0x08, 0x8c, 0x10, 0x96, 0x00, 0xe6, 0x04, 0xe8, 0x0d, - 0xa6, 0xb7, 0x3e, 0x0d, 0x81, 0x0c, 0x98, 0x90, 0x8c, 0x55, 0xa6, 0xd7, - 0xa6, 0x14, 0xa6, 0x55, 0xa6, 0x96, 0x49, 0xff, 0xff, 0x90, 0xd5, 0x05, - 0x49, 0xfd, 0x28, 0x9b, 0x49, 0xff, 0xff, 0xa3, 0x84, 0x20, 0x3e, 0x15, - 0x80, 0xa2, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xff, 0xff, 0xb9, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x97, 0x80, 0x97, 0xc8, 0x96, 0x90, 0xe6, 0xc8, 0x4e, 0xf2, 0x00, 0xa8, - 0xe6, 0xe7, 0x4e, 0xf2, 0x00, 0xa5, 0xe6, 0x47, 0x4e, 0xf2, 0x00, 0xa2, - 0x84, 0xa4, 0xde, 0x0d, 0x3e, 0x0d, 0xb5, 0x50, 0x84, 0x20, 0x84, 0x47, - 0x49, 0xff, 0x2d, 0x1b, 0x2e, 0x05, 0x6a, 0xb0, 0x3e, 0x1d, 0x6b, 0x6f, - 0x48, 0x00, 0x00, 0x70, 0x84, 0xa2, 0xde, 0x06, 0x3c, 0x1d, 0x59, 0x0e, - 0x84, 0x00, 0x48, 0x00, 0x00, 0x6c, 0x84, 0xa3, 0xde, 0x07, 0x3c, 0x1d, - 0x59, 0x0e, 0x2e, 0x05, 0x6b, 0x6f, 0x48, 0x00, 0x00, 0x64, 0x9e, 0x35, - 0x96, 0x00, 0xe6, 0x03, 0xe8, 0x15, 0x3e, 0x0d, 0xb5, 0x50, 0x98, 0x90, - 0xa6, 0xd0, 0xc3, 0x04, 0x9e, 0xd9, 0xae, 0xd0, 0xd5, 0x09, 0x3c, 0x4d, - 0x59, 0x09, 0x2e, 0x25, 0x6b, 0x6f, 0x80, 0x26, 0x44, 0x00, 0x70, 0x31, - 0xdd, 0x24, 0x3e, 0x1d, 0xb5, 0x50, 0x99, 0xf9, 0xd5, 0x05, 0xc6, 0x08, - 0x3e, 0x2d, 0xb5, 0x50, 0x99, 0xfa, 0xa6, 0x38, 0x9c, 0x01, 0xae, 0x38, - 0xd5, 0x08, 0x3e, 0x3d, 0xb5, 0x50, 0x98, 0x93, 0xa6, 0x10, 0xc0, 0x03, - 0x9e, 0x01, 0xae, 0x10, 0x3e, 0x0d, 0xb5, 0x50, 0xa6, 0x40, 0xc1, 0x06, - 0x3e, 0x1d, 0x6b, 0x6f, 0x3e, 0x0d, 0x6a, 0xac, 0xd5, 0x20, 0xa6, 0x41, - 0xc1, 0x06, 0x3e, 0x1d, 0x6b, 0x6f, 0x3e, 0x0d, 0x6a, 0xad, 0xd5, 0x19, - 0xa6, 0x42, 0xc1, 0x07, 0x3e, 0x1d, 0x6b, 0x6f, 0xa6, 0x88, 0x44, 0x00, - 0x00, 0x50, 0xd5, 0x1f, 0x2e, 0x15, 0x24, 0x76, 0xc9, 0x03, 0xa6, 0x43, - 0xc1, 0x06, 0x3e, 0x1d, 0x6b, 0x6f, 0x3e, 0x0d, 0x6a, 0xae, 0xd5, 0x07, - 0xa6, 0x44, 0xc1, 0x08, 0x3e, 0x1d, 0x6b, 0x6f, 0x3e, 0x0d, 0x6a, 0xaf, - 0xa6, 0x00, 0xa6, 0x88, 0xd5, 0x0c, 0xa6, 0x05, 0x3e, 0x1d, 0x6b, 0x6f, - 0xc0, 0x05, 0xa6, 0x88, 0x44, 0x00, 0x00, 0x20, 0xd5, 0x04, 0xa6, 0x88, - 0x44, 0x00, 0x00, 0x1a, 0x4c, 0x20, 0x00, 0x06, 0xae, 0x08, 0x3c, 0x1d, - 0x59, 0x0e, 0xdd, 0x21, 0x2e, 0x05, 0x6b, 0x6f, 0x44, 0x50, 0x00, 0x1a, - 0xd8, 0x0e, 0x49, 0xff, 0x44, 0xfe, 0xc0, 0x0b, 0x84, 0xa4, 0xd6, 0x09, - 0x46, 0x08, 0x10, 0x08, 0x58, 0x00, 0x00, 0x04, 0xb4, 0x20, 0x42, 0x10, - 0xd0, 0x08, 0xd5, 0x08, 0x46, 0x08, 0x10, 0x08, 0x58, 0x00, 0x00, 0x04, - 0xb4, 0x20, 0x42, 0x10, 0xd0, 0x09, 0xb6, 0x20, 0x2e, 0x15, 0x6b, 0x6f, - 0x3c, 0x1f, 0x66, 0xd7, 0x84, 0x01, 0xd5, 0x02, 0x84, 0x00, 0xec, 0x04, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x84, 0x47, 0x96, 0x48, 0x96, 0x00, 0x92, 0x24, 0x4c, 0x01, 0x40, 0x04, - 0x84, 0x45, 0xd5, 0x08, 0x84, 0xa5, 0xd0, 0x05, 0x84, 0xa6, 0xd0, 0x03, - 0x80, 0x41, 0xd5, 0x02, 0x84, 0x44, 0x49, 0xff, 0xff, 0x3a, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x01, 0x49, 0xfc, 0xe5, 0x7c, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xe2, 0xad, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0xa6, 0x40, 0x44, 0x50, 0x00, 0x50, 0xd1, 0x04, - 0x44, 0x00, 0x00, 0x11, 0xd5, 0x04, 0x9c, 0x01, 0x49, 0xff, 0xff, 0xeb, - 0x84, 0x61, 0x3e, 0x35, 0x24, 0x85, 0x80, 0x20, 0x44, 0x00, 0xfc, 0x5f, - 0x49, 0xfd, 0x2c, 0x7f, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x80, 0xe0, 0x2e, 0x65, - 0xb5, 0x00, 0x40, 0x81, 0x00, 0x13, 0x44, 0x00, 0xff, 0xfd, 0x96, 0x49, - 0x55, 0xc1, 0x80, 0xff, 0x4c, 0x80, 0x00, 0x93, 0x9c, 0x0b, 0x96, 0x01, - 0x44, 0x10, 0xe0, 0x02, 0x12, 0x0f, 0x80, 0x03, 0x4c, 0x80, 0xc0, 0x05, - 0x44, 0x80, 0xff, 0xfd, 0xd5, 0x0b, 0x44, 0x50, 0xff, 0xfc, 0x4c, 0x82, - 0x80, 0x05, 0x9f, 0x49, 0x4c, 0x82, 0xc0, 0x05, 0x9c, 0x05, 0x12, 0x0f, - 0x80, 0x03, 0x50, 0x0f, 0x80, 0x06, 0x49, 0xfe, 0xab, 0x06, 0x54, 0x63, - 0x00, 0x03, 0x84, 0xa1, 0x02, 0x9f, 0x80, 0x03, 0xde, 0x73, 0x80, 0x07, - 0x80, 0x28, 0x49, 0xff, 0xdf, 0x6c, 0x4c, 0x03, 0x40, 0x6e, 0x54, 0xa4, - 0x80, 0x07, 0x80, 0x1f, 0x84, 0xc0, 0x49, 0xfa, 0xf2, 0x44, 0x93, 0x23, - 0x40, 0xa3, 0x28, 0x06, 0x89, 0x49, 0x3c, 0x9d, 0x53, 0x8b, 0x3e, 0x0d, - 0x6f, 0x74, 0x54, 0x14, 0x81, 0xff, 0x94, 0x4b, 0x98, 0x48, 0x80, 0x01, - 0x1a, 0x80, 0x00, 0x01, 0x40, 0x35, 0x24, 0x00, 0x3c, 0x3f, 0x53, 0x8b, - 0x44, 0x20, 0xff, 0xfc, 0x10, 0xa0, 0x00, 0x00, 0x9c, 0x0b, 0x4c, 0x81, - 0x00, 0x06, 0x44, 0x50, 0xe0, 0x01, 0x4c, 0x82, 0xc0, 0x0d, 0x11, 0xc0, - 0x00, 0x00, 0x46, 0x08, 0x10, 0x02, 0x02, 0x6f, 0x80, 0x03, 0x04, 0x00, - 0x00, 0x0e, 0x8e, 0xc8, 0xa8, 0x09, 0xd5, 0x0f, 0x02, 0x8f, 0x80, 0x03, - 0x8f, 0x03, 0x40, 0x84, 0x00, 0x13, 0xe7, 0x06, 0xe9, 0x0a, 0x80, 0x27, - 0x84, 0x45, 0x49, 0xff, 0x2b, 0xb8, 0x50, 0x64, 0x7f, 0xfb, 0x9d, 0xfd, - 0x97, 0xb1, 0xd5, 0x05, 0x80, 0x48, 0x80, 0x27, 0x49, 0xff, 0x2b, 0xaf, - 0x50, 0x84, 0x80, 0x01, 0x47, 0xc0, 0x00, 0x87, 0x59, 0xce, 0x09, 0x34, - 0xd5, 0x19, 0x3e, 0x0d, 0x6f, 0x74, 0x89, 0x20, 0x80, 0x09, 0xe6, 0xc9, - 0xe9, 0x08, 0x84, 0x48, 0x8e, 0xc8, 0x49, 0xff, 0x2b, 0x9e, 0x8c, 0xe8, - 0x97, 0xb1, 0xd5, 0x0b, 0x49, 0xff, 0x2b, 0x99, 0x40, 0x04, 0x98, 0x00, - 0x52, 0x23, 0x00, 0x08, 0x44, 0x10, 0x00, 0xaa, 0xdd, 0x3c, 0x84, 0xc0, - 0x8d, 0x01, 0x54, 0x94, 0x01, 0xff, 0x80, 0x27, 0x80, 0x46, 0x40, 0x94, - 0x8c, 0x08, 0xce, 0xe2, 0xb4, 0x1f, 0x49, 0xfa, 0xf1, 0xf4, 0xec, 0x0c, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, - 0x50, 0x70, 0x82, 0x40, 0x58, 0x60, 0x00, 0x08, 0x49, 0xff, 0xf8, 0x69, - 0xc0, 0x29, 0x49, 0xfe, 0x2c, 0xfe, 0xa6, 0x7e, 0x49, 0xfe, 0x2c, 0x5b, - 0xc0, 0x03, 0x85, 0x00, 0xd5, 0x0a, 0xa0, 0x3a, 0xc8, 0x04, 0x3e, 0x0d, - 0x6a, 0x72, 0xd5, 0x03, 0x3e, 0x0d, 0x6a, 0x73, 0x00, 0x80, 0x00, 0x00, - 0xa6, 0x7e, 0x84, 0x03, 0x80, 0x48, 0x49, 0xff, 0xf8, 0xc0, 0xc0, 0x06, - 0x46, 0x03, 0x3f, 0xf3, 0x58, 0x00, 0x03, 0xff, 0xd5, 0x0b, 0xa6, 0x7e, - 0x80, 0x48, 0x84, 0x05, 0x49, 0xff, 0xf8, 0xb5, 0xc0, 0x07, 0x46, 0x03, - 0xff, 0xf3, 0x58, 0x00, 0x0f, 0xff, 0x40, 0x63, 0x00, 0x02, 0x3c, 0x1d, - 0x58, 0x84, 0x50, 0x03, 0xfd, 0xc0, 0xdd, 0x21, 0xc0, 0x08, 0x54, 0x03, - 0x00, 0x08, 0xc0, 0x05, 0xe6, 0xc9, 0xe9, 0x03, 0x42, 0x63, 0x0c, 0x09, - 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x50, 0x60, 0x00, 0x27, 0x04, 0x00, 0x00, 0x09, - 0x46, 0x10, 0x00, 0x96, 0x58, 0x10, 0x8e, 0x08, 0x00, 0x00, 0x00, 0x08, - 0x54, 0x00, 0x00, 0x0f, 0x38, 0x70, 0x80, 0x00, 0xe6, 0xe2, 0xe9, 0x26, - 0x49, 0xff, 0xf8, 0x19, 0xc0, 0x23, 0x49, 0xfe, 0x2c, 0xae, 0xa6, 0x75, - 0x49, 0xfe, 0x2c, 0x0b, 0xc0, 0x03, 0x84, 0x40, 0xd5, 0x0a, 0xa6, 0x37, - 0x84, 0xa1, 0xd8, 0x04, 0x3e, 0x0d, 0x6a, 0x72, 0xd5, 0x03, 0x3e, 0x0d, - 0x6a, 0x74, 0xa6, 0x80, 0xa6, 0x75, 0x80, 0x07, 0x49, 0xff, 0xf8, 0x71, - 0xc0, 0x09, 0x2e, 0x15, 0x6a, 0x78, 0xc1, 0x06, 0x9e, 0x49, 0x3e, 0x15, - 0x6a, 0x78, 0x84, 0x00, 0xd5, 0x06, 0x2e, 0x15, 0x6a, 0x77, 0x3e, 0x15, - 0x6a, 0x78, 0x84, 0x01, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x97, 0xc1, 0x80, 0x07, 0x81, 0x01, - 0x49, 0xfd, 0xfe, 0x63, 0x80, 0xc0, 0xc0, 0x22, 0x00, 0x00, 0x00, 0x48, - 0x49, 0xfd, 0xc6, 0x39, 0x80, 0xe0, 0xc8, 0x02, 0xd5, 0x1f, 0x44, 0x10, - 0x00, 0x16, 0x14, 0x10, 0x00, 0x4a, 0x00, 0x10, 0x02, 0x48, 0x84, 0xa2, - 0x10, 0x10, 0x02, 0x5f, 0xa0, 0x73, 0xd9, 0x0a, 0x80, 0x06, 0x49, 0xfe, - 0x00, 0x94, 0x80, 0x07, 0x80, 0x26, 0x80, 0x48, 0x49, 0xfd, 0x4d, 0x17, - 0xd5, 0x05, 0x80, 0x26, 0x80, 0x48, 0x49, 0xfd, 0x55, 0x7c, 0x84, 0x00, - 0xd5, 0x05, 0x80, 0x07, 0x80, 0x28, 0x49, 0xfd, 0x67, 0xf6, 0x3a, 0x6f, - 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0xef, 0xf0, - 0x81, 0x41, 0x80, 0xe0, 0x49, 0xfe, 0x00, 0x75, 0x81, 0x00, 0x49, 0xfe, - 0x01, 0x5c, 0x80, 0xc0, 0x4e, 0x83, 0x00, 0x05, 0x84, 0x02, 0x48, 0x00, - 0x00, 0xb9, 0xc8, 0x05, 0x44, 0x00, 0x00, 0x1f, 0x48, 0x00, 0x00, 0xb4, - 0x84, 0x00, 0x50, 0x1f, 0x80, 0x04, 0xac, 0x0b, 0x49, 0xfd, 0xff, 0x99, - 0x81, 0x20, 0xc8, 0x0e, 0x44, 0x20, 0x00, 0x1f, 0x80, 0x07, 0x44, 0x10, - 0x7f, 0x0c, 0x49, 0xfd, 0x87, 0x7c, 0x80, 0x07, 0x80, 0x28, 0x44, 0x20, - 0x00, 0x1f, 0x48, 0x00, 0x00, 0x70, 0x80, 0x0a, 0x49, 0xfe, 0x05, 0x81, - 0xa6, 0x30, 0xa6, 0x71, 0xa0, 0xb1, 0xa4, 0xf6, 0x49, 0xfd, 0xff, 0x67, - 0x54, 0x90, 0x00, 0xff, 0x4e, 0x93, 0x00, 0x1c, 0x02, 0x03, 0x81, 0x1b, - 0x84, 0xaf, 0xd8, 0x17, 0x02, 0x03, 0x81, 0x1c, 0x44, 0x50, 0x23, 0x19, - 0xd8, 0x12, 0xa4, 0x30, 0x84, 0xac, 0xd8, 0x09, 0xa0, 0x31, 0x8c, 0xba, - 0xd8, 0x06, 0xa4, 0x36, 0x8c, 0xb6, 0xd8, 0x03, 0x85, 0x21, 0xd5, 0x07, - 0x49, 0xfd, 0xff, 0x67, 0xc0, 0x04, 0x84, 0x00, 0x49, 0xfe, 0x01, 0xe9, - 0x00, 0x03, 0x00, 0x14, 0x84, 0xa3, 0xd8, 0x0e, 0xa6, 0x71, 0xa6, 0x30, - 0xa0, 0xb1, 0xa0, 0xf2, 0x49, 0xfd, 0xff, 0xf1, 0x50, 0x1f, 0x80, 0x04, - 0xac, 0x0b, 0x44, 0x06, 0x24, 0x40, 0x49, 0xfe, 0x01, 0xee, 0x84, 0xa1, - 0x4c, 0x92, 0xc0, 0x39, 0x80, 0x06, 0x80, 0x27, 0x49, 0xfe, 0x05, 0xb5, - 0x81, 0x20, 0xc0, 0x07, 0x80, 0x07, 0x44, 0x10, 0x7f, 0x0c, 0x49, 0xfd, - 0x87, 0x60, 0xd5, 0x47, 0x00, 0xa3, 0x00, 0x14, 0x84, 0xa2, 0x4c, 0xa2, - 0x80, 0x09, 0x80, 0x06, 0x49, 0xfe, 0x07, 0xbd, 0x84, 0x02, 0x10, 0x03, - 0x00, 0x14, 0xd5, 0x0c, 0x49, 0xfe, 0x01, 0x09, 0x4e, 0x07, 0x00, 0x0e, - 0x10, 0xa3, 0x00, 0x14, 0x49, 0xfe, 0x01, 0x41, 0xae, 0x32, 0x49, 0xfe, - 0x01, 0x24, 0x80, 0x07, 0x80, 0x26, 0x49, 0xfd, 0x51, 0x72, 0xd5, 0x0e, - 0x44, 0x20, 0x00, 0x1b, 0x80, 0x07, 0x44, 0x10, 0x7f, 0x0c, 0x49, 0xfd, - 0x87, 0x0c, 0x80, 0x07, 0x80, 0x28, 0x44, 0x20, 0x00, 0x1b, 0x49, 0xfd, - 0x4d, 0x84, 0x80, 0x09, 0xd5, 0x2c, 0x02, 0x94, 0x00, 0x1b, 0x44, 0x40, - 0x03, 0xe8, 0xa6, 0x30, 0xa6, 0x71, 0xa0, 0xb1, 0xa0, 0xf2, 0x42, 0x94, - 0x90, 0x24, 0x49, 0xfd, 0xff, 0xa4, 0xe1, 0x20, 0xe8, 0x03, 0x84, 0x03, - 0xd5, 0x02, 0x84, 0x04, 0x10, 0x03, 0x00, 0x14, 0x49, 0xfd, 0xff, 0x03, - 0x80, 0xc0, 0xc0, 0x07, 0x80, 0x07, 0x80, 0x28, 0x49, 0xfd, 0x51, 0xb5, - 0x84, 0x00, 0xd5, 0x0f, 0x44, 0x20, 0x00, 0x1c, 0x80, 0x07, 0x44, 0x10, - 0x7f, 0x0c, 0x49, 0xfd, 0x86, 0xe0, 0x80, 0x07, 0x80, 0x28, 0x44, 0x20, - 0x00, 0x1c, 0x49, 0xfd, 0x4d, 0x58, 0x80, 0x06, 0xec, 0x10, 0x3a, 0x6f, - 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0x80, 0xe1, - 0x81, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0x90, 0x80, 0x0d, 0x49, 0xfe, - 0x03, 0x12, 0x80, 0xc0, 0xc8, 0x23, 0x00, 0x04, 0x02, 0x48, 0x80, 0x2a, - 0x80, 0x49, 0x80, 0x68, 0x49, 0xfd, 0x56, 0xbd, 0xc8, 0x06, 0x80, 0x08, - 0x80, 0x27, 0x49, 0xfd, 0x59, 0xac, 0xd5, 0x15, 0x84, 0xa1, 0xd8, 0x06, - 0x80, 0x08, 0x80, 0x27, 0x49, 0xff, 0xff, 0x17, 0xd5, 0x0e, 0x84, 0xa2, - 0xd8, 0x06, 0x80, 0x08, 0x80, 0x27, 0x49, 0xfd, 0x58, 0xf0, 0xd5, 0x07, - 0x84, 0xa3, 0xd8, 0x06, 0x80, 0x08, 0x80, 0x27, 0x49, 0xfd, 0x58, 0x31, - 0x80, 0xc0, 0x80, 0x06, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x00, 0x10, 0x02, 0x88, 0x80, 0xc0, 0xc1, 0x15, 0x00, 0x00, - 0x02, 0x8d, 0xc0, 0x05, 0x50, 0x03, 0x02, 0x8d, 0x49, 0xfe, 0x19, 0x5b, - 0x84, 0x40, 0x44, 0x00, 0x1f, 0x40, 0x44, 0x15, 0x50, 0x34, 0x80, 0x66, - 0x80, 0x82, 0x84, 0xa1, 0x49, 0xfe, 0x19, 0xf7, 0x10, 0x03, 0x02, 0x8d, - 0xd5, 0x4d, 0x00, 0x20, 0x02, 0x5a, 0x10, 0x10, 0x02, 0x8d, 0x84, 0x23, - 0x4c, 0x20, 0x80, 0x06, 0x8c, 0x3f, 0x49, 0xfd, 0x65, 0x08, 0xd5, 0x38, - 0x00, 0x10, 0x02, 0x61, 0x42, 0x20, 0x84, 0x0b, 0xc2, 0x05, 0x96, 0x8c, - 0xca, 0x03, 0x84, 0x26, 0xd5, 0x2b, 0x96, 0x0a, 0x4e, 0x04, 0x00, 0x15, - 0x54, 0x20, 0x80, 0x40, 0xca, 0x11, 0x80, 0x06, 0x84, 0x29, 0x44, 0x20, - 0x00, 0x22, 0x49, 0xfd, 0xae, 0x54, 0x00, 0x03, 0x02, 0x90, 0xc0, 0x20, - 0x3c, 0x2d, 0x58, 0x88, 0x44, 0x10, 0x00, 0x22, 0x80, 0x06, 0xdd, 0x22, - 0xd5, 0x19, 0x54, 0x10, 0x80, 0x40, 0xc1, 0x16, 0x4e, 0x05, 0x00, 0x15, - 0x00, 0x03, 0x02, 0x63, 0x44, 0x10, 0x00, 0x26, 0x4c, 0x00, 0x80, 0x0f, - 0x80, 0x06, 0x49, 0xfd, 0xf9, 0x2a, 0x80, 0x20, 0x80, 0x06, 0x49, 0xfd, - 0xf9, 0x18, 0x80, 0x06, 0x84, 0x2a, 0x44, 0x20, 0x00, 0x22, 0x49, 0xfd, - 0xae, 0x32, 0x84, 0x00, 0x10, 0x03, 0x02, 0x62, 0x10, 0x03, 0x02, 0x61, - 0x44, 0x10, 0x00, 0x22, 0x80, 0x06, 0x49, 0xfd, 0x93, 0xc0, 0x3a, 0x6f, - 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x81, 0x00, - 0x3c, 0x6d, 0x60, 0xaa, 0xd5, 0x09, 0xb4, 0x28, 0x49, 0xfe, 0x1a, 0x61, - 0xc0, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xd5, 0x09, 0xb4, 0xc6, 0x3e, 0x1d, - 0x82, 0xa8, 0x50, 0x03, 0x00, 0x24, 0x4c, 0x60, 0xff, 0xf4, 0x84, 0x00, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x97, 0xc8, - 0x80, 0x27, 0x81, 0x00, 0x49, 0xff, 0xff, 0xe3, 0xc8, 0x40, 0x49, 0xfd, - 0x6b, 0xac, 0x80, 0xc0, 0xc0, 0x3c, 0x44, 0x20, 0x00, 0x18, 0x80, 0x28, - 0x8c, 0x08, 0x49, 0xff, 0x29, 0x3c, 0xb4, 0x28, 0x50, 0x83, 0x00, 0x24, - 0x80, 0x08, 0x49, 0xfe, 0x1a, 0x30, 0x14, 0x83, 0x00, 0x02, 0x10, 0x73, - 0x00, 0x32, 0x80, 0x06, 0x49, 0xfd, 0x6f, 0x65, 0x49, 0xfd, 0x49, 0x1b, - 0x80, 0xc0, 0xc8, 0x0a, 0x3c, 0x4d, 0x59, 0x09, 0x2e, 0x15, 0x6b, 0x28, - 0x80, 0x46, 0x44, 0x00, 0x70, 0x0f, 0x80, 0x66, 0xdd, 0x24, 0x2e, 0x15, - 0x6b, 0x28, 0x84, 0xa1, 0xd1, 0x03, 0x84, 0xe0, 0xd5, 0x0c, 0x3e, 0x15, - 0x24, 0x67, 0x80, 0x06, 0x49, 0xfd, 0x6a, 0xeb, 0x80, 0xe0, 0xc0, 0x05, - 0x80, 0x06, 0x84, 0x20, 0x49, 0xfd, 0x6b, 0x85, 0x80, 0x86, 0x84, 0x06, - 0x44, 0x10, 0x01, 0x00, 0x44, 0x20, 0x76, 0x04, 0x96, 0xf9, 0x49, 0xfe, - 0xa9, 0x60, 0xd5, 0x02, 0x84, 0xec, 0x80, 0x07, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x2e, 0x25, 0x6b, 0x40, - 0x81, 0x40, 0x83, 0x81, 0xca, 0x03, 0x84, 0x01, 0xd5, 0x3f, 0x3e, 0x7d, - 0x9a, 0x90, 0x84, 0xc5, 0x40, 0x93, 0x08, 0x08, 0x00, 0x03, 0x80, 0x10, - 0x9f, 0xb1, 0xc0, 0x33, 0x00, 0x23, 0x80, 0x0e, 0x84, 0xa1, 0xd2, 0x05, - 0xc2, 0x26, 0x84, 0xa2, 0xda, 0x2c, 0xd5, 0x12, 0xb4, 0x07, 0xa0, 0x79, - 0x40, 0x0e, 0x00, 0x03, 0x40, 0x00, 0x04, 0x02, 0xc8, 0x24, 0x44, 0x00, - 0x00, 0x14, 0x42, 0x63, 0x00, 0x24, 0x3e, 0x0d, 0x9a, 0x40, 0x99, 0xb0, - 0x00, 0x03, 0x00, 0x0f, 0xd5, 0x1d, 0x42, 0x23, 0x24, 0x24, 0x3e, 0x3d, - 0x9a, 0x40, 0x8c, 0x48, 0x80, 0x0a, 0x98, 0x53, 0x49, 0xfe, 0x19, 0xd1, - 0xc0, 0x10, 0x2e, 0x05, 0x80, 0xa1, 0x84, 0xa1, 0xd8, 0x04, 0x49, 0xff, - 0xfb, 0x4a, 0x92, 0x00, 0x44, 0x00, 0x00, 0x14, 0x42, 0x63, 0x00, 0x24, - 0x3e, 0x3d, 0x9a, 0x40, 0x99, 0xb3, 0xd5, 0xe5, 0x8e, 0xf4, 0xce, 0xc9, - 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0xc0, 0x0c, 0xc1, 0x0b, 0xa0, 0x82, 0x84, 0xa2, - 0xda, 0x08, 0xb4, 0x40, 0x54, 0x21, 0x04, 0x00, 0xc2, 0x04, 0x44, 0x00, - 0x00, 0x3a, 0xd5, 0x04, 0x49, 0xfe, 0xe3, 0x6b, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x80, 0xc0, - 0x49, 0xfe, 0xe4, 0x3b, 0xb4, 0x06, 0xc0, 0x0a, 0xa0, 0x73, 0x44, 0x50, - 0x00, 0x10, 0xd9, 0x06, 0x80, 0x06, 0x44, 0x10, 0x00, 0x22, 0x49, 0xff, - 0xe8, 0xda, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x80, 0xc0, 0xa0, 0x03, 0x80, 0xe1, 0x84, 0x2c, - 0x4c, 0x00, 0xc0, 0x04, 0x84, 0x00, 0xd5, 0x1c, 0xa0, 0xb2, 0x84, 0xa1, - 0xda, 0x12, 0x50, 0x10, 0x7f, 0xf1, 0xe6, 0x23, 0xe9, 0x0e, 0x84, 0xa4, - 0xd0, 0x0c, 0x00, 0x03, 0x01, 0x37, 0x49, 0xfe, 0xe2, 0xb2, 0x84, 0xa1, - 0xd0, 0x06, 0x00, 0x03, 0x01, 0x3c, 0xc0, 0x09, 0x84, 0xa4, 0xd7, 0x07, - 0xa0, 0x71, 0x84, 0x00, 0x40, 0x70, 0x9c, 0x04, 0xa9, 0xf1, 0xd5, 0x02, - 0x84, 0x01, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x80, 0xc0, 0x49, 0xfe, 0xdc, 0x0f, 0xc8, 0x06, 0xa0, 0x72, - 0x84, 0xab, 0xd9, 0x03, 0x84, 0x21, 0xa8, 0x72, 0x3a, 0x6f, 0x98, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfe, 0xdc, 0xaf, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa0, 0xbc, 0xef, 0xb0, 0x80, 0xe1, 0xa6, 0x48, 0x80, 0xc0, 0x84, 0x03, - 0x4c, 0x10, 0x40, 0x20, 0xa0, 0x32, 0x9e, 0x06, 0xe6, 0x02, 0xe8, 0x62, - 0x84, 0x01, 0xa8, 0x32, 0x50, 0x03, 0x01, 0x39, 0x49, 0xfe, 0x17, 0xcf, - 0x80, 0x06, 0x84, 0x20, 0x49, 0xfe, 0xc8, 0x1d, 0xa6, 0x39, 0x50, 0x1f, - 0x80, 0x04, 0xb6, 0x01, 0x84, 0x00, 0x10, 0x00, 0x80, 0x0a, 0x02, 0x63, - 0x00, 0x87, 0x3c, 0x3d, 0x57, 0xeb, 0xad, 0x8e, 0x84, 0x40, 0x84, 0x08, - 0xdd, 0x23, 0xd5, 0x4f, 0x44, 0x50, 0x00, 0x16, 0xd9, 0x1c, 0xa0, 0x32, - 0x50, 0x10, 0x7f, 0xf1, 0xe6, 0x23, 0xe9, 0x06, 0x84, 0xa1, 0xd8, 0x44, - 0xa0, 0x33, 0x84, 0xa2, 0xd8, 0x41, 0x50, 0x03, 0x01, 0x39, 0x49, 0xfe, - 0x17, 0xaa, 0x00, 0x03, 0x01, 0x03, 0x84, 0x21, 0xa8, 0x72, 0xc8, 0x04, - 0x2e, 0x05, 0xb6, 0x07, 0xc8, 0x35, 0xa6, 0x79, 0x80, 0x06, 0x49, 0xff, - 0xe8, 0x50, 0xd5, 0x30, 0x84, 0xaf, 0xd9, 0x28, 0xa0, 0x72, 0x9d, 0x6c, - 0xd9, 0x25, 0x84, 0x01, 0xa8, 0x32, 0x50, 0x03, 0x01, 0x39, 0x49, 0xfe, - 0x17, 0x92, 0x02, 0x13, 0x00, 0x1b, 0x50, 0x8f, 0x80, 0x04, 0x00, 0x03, - 0x01, 0x37, 0x12, 0x14, 0x00, 0x0c, 0x02, 0x13, 0x00, 0x1c, 0x12, 0x14, - 0x00, 0x0d, 0x02, 0x63, 0x00, 0x1d, 0x12, 0x64, 0x00, 0x0e, 0x49, 0xfe, - 0xc7, 0x90, 0xa6, 0x79, 0x12, 0x04, 0x00, 0x0f, 0x14, 0x14, 0x00, 0x05, - 0x3c, 0x3d, 0x57, 0xed, 0x80, 0x28, 0x84, 0x40, 0x84, 0x03, 0xdd, 0x23, - 0xd5, 0x07, 0x3c, 0x2d, 0x59, 0x33, 0x80, 0x27, 0x80, 0x06, 0xdd, 0x22, - 0xd5, 0x02, 0x84, 0x00, 0xec, 0x50, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x80, 0xe0, 0x81, 0x01, - 0x04, 0x90, 0x00, 0x02, 0x49, 0xfe, 0xdd, 0x81, 0x80, 0xc0, 0xc8, 0x0e, - 0x00, 0x04, 0x00, 0x00, 0xc8, 0x0b, 0x00, 0x04, 0x00, 0x01, 0xc8, 0x08, - 0x84, 0xaf, 0x4c, 0x92, 0xc0, 0x06, 0x80, 0x07, 0x80, 0x26, 0x49, 0xff, - 0xe8, 0x02, 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x04, 0x80, 0x00, 0x01, 0x80, 0xc0, - 0x54, 0x84, 0x01, 0x00, 0x49, 0xfe, 0xdd, 0xf9, 0x80, 0xe0, 0x4e, 0x82, - 0x00, 0x0c, 0xa0, 0x71, 0x54, 0x10, 0x81, 0x00, 0xc9, 0x07, 0xa0, 0x32, - 0x84, 0xa1, 0xd8, 0x04, 0x80, 0x06, 0x49, 0xff, 0xe7, 0xe6, 0xb4, 0x06, - 0x00, 0x13, 0x01, 0x5d, 0x54, 0x00, 0x00, 0x80, 0xc0, 0x0b, 0x96, 0x0c, - 0x02, 0x13, 0x00, 0x98, 0xc0, 0x04, 0x50, 0x10, 0xff, 0x90, 0xd5, 0x0a, - 0x50, 0x10, 0xff, 0xb4, 0xd5, 0x0b, 0x96, 0x0c, 0x02, 0x13, 0x00, 0x98, - 0xc0, 0x05, 0x50, 0x10, 0xff, 0xb0, 0x90, 0x23, 0xd5, 0x05, 0x50, 0x10, - 0xff, 0xd4, 0x90, 0x23, 0x98, 0x49, 0x12, 0x13, 0x00, 0x92, 0x02, 0x13, - 0x00, 0x91, 0x02, 0x23, 0x00, 0x92, 0xe2, 0x41, 0xe8, 0x02, 0x80, 0x22, - 0x80, 0x07, 0x12, 0x13, 0x00, 0x92, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0xa6, 0x88, 0x80, 0xc0, - 0xa6, 0xca, 0xa7, 0x0b, 0xca, 0x18, 0xa6, 0x89, 0xca, 0x16, 0xa0, 0x43, - 0x44, 0x50, 0x00, 0x10, 0xd9, 0x04, 0x84, 0x01, 0xa8, 0x33, 0xd5, 0x0a, - 0xa1, 0x02, 0x44, 0x50, 0x00, 0x10, 0xdc, 0x04, 0x80, 0x22, 0x49, 0xff, - 0xe7, 0xa2, 0x84, 0x01, 0xa8, 0x32, 0x80, 0x06, 0x84, 0x20, 0x49, 0xfe, - 0xd3, 0x94, 0xd5, 0x4b, 0x40, 0x02, 0x20, 0x08, 0x02, 0x23, 0x00, 0x86, - 0x40, 0x00, 0x0c, 0x04, 0x4c, 0x01, 0x00, 0x33, 0x9a, 0x82, 0x96, 0x91, - 0x44, 0x30, 0x7f, 0xfe, 0xe0, 0x62, 0xe9, 0x2c, 0xa1, 0x33, 0x44, 0x50, - 0x00, 0x10, 0xdc, 0x04, 0x9c, 0xa9, 0xa8, 0xb3, 0xd5, 0x03, 0x9c, 0xa9, - 0xa8, 0xb2, 0x00, 0x23, 0x01, 0x54, 0x12, 0x03, 0x00, 0x9a, 0x58, 0x01, - 0x00, 0x02, 0x10, 0x03, 0x01, 0x54, 0x00, 0x43, 0x01, 0x37, 0x3c, 0x0d, - 0x6c, 0xfc, 0x44, 0x20, 0x00, 0x44, 0x42, 0x02, 0x08, 0x73, 0xa7, 0x09, - 0x04, 0x00, 0x00, 0x0f, 0x84, 0xe0, 0x10, 0x40, 0x00, 0x4b, 0x3c, 0x0d, - 0x6c, 0xfc, 0x00, 0x33, 0x01, 0x37, 0xa6, 0x48, 0x42, 0x01, 0x88, 0x73, - 0x04, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x4c, 0xd5, 0x13, 0x44, 0x10, - 0x00, 0x28, 0x80, 0x06, 0x49, 0xff, 0xe7, 0x5d, 0x80, 0x06, 0x84, 0x20, - 0x49, 0xfe, 0xd3, 0x51, 0xb4, 0x06, 0x58, 0x00, 0x01, 0x00, 0xb6, 0x06, - 0x44, 0x00, 0x00, 0x28, 0x10, 0x03, 0x01, 0x3d, 0x84, 0xec, 0xa1, 0x33, - 0x00, 0x33, 0x01, 0x37, 0x84, 0x06, 0x84, 0x28, 0x44, 0x20, 0x72, 0xcf, - 0x49, 0xfe, 0xa7, 0x55, 0x80, 0x07, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x80, 0xc0, 0x3c, 0x0d, - 0x6c, 0xfc, 0x00, 0x23, 0x02, 0x46, 0x44, 0x10, 0x00, 0x44, 0x42, 0x01, - 0x04, 0x73, 0x84, 0x21, 0xa0, 0x01, 0x4c, 0x00, 0x80, 0x04, 0x84, 0xa2, - 0xd8, 0x23, 0x2e, 0x05, 0xb5, 0x3a, 0x54, 0x00, 0x00, 0x02, 0xc0, 0x06, - 0x3c, 0x1d, 0x58, 0x5a, 0x80, 0x06, 0xdd, 0x21, 0xd5, 0x0d, 0x2e, 0x35, - 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x84, 0x25, 0x98, 0xd8, 0x96, 0xd8, - 0x84, 0x41, 0x40, 0x01, 0x0c, 0x1b, 0x40, 0x00, 0x8c, 0x1a, 0x00, 0x53, - 0x02, 0x84, 0xd0, 0x0a, 0x97, 0xc0, 0x80, 0x27, 0x80, 0x06, 0x84, 0x40, - 0x49, 0xfd, 0xd8, 0x91, 0x92, 0x00, 0x10, 0x73, 0x02, 0x84, 0xec, 0x04, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x2e, 0x15, 0xb5, 0x3a, 0x80, 0xc0, 0x54, 0x10, 0x80, 0x02, 0xc1, 0x06, - 0x3c, 0x1d, 0x58, 0x5a, 0xdd, 0x21, 0x97, 0xc0, 0xd5, 0x0d, 0x2e, 0x25, - 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x84, 0x25, 0x98, 0x90, 0x96, 0x90, - 0x84, 0x01, 0x40, 0x70, 0x88, 0x1a, 0x40, 0x70, 0x08, 0x1b, 0x80, 0x06, - 0x80, 0x27, 0x84, 0x40, 0x49, 0xfd, 0xd8, 0x6b, 0x92, 0x00, 0x84, 0x02, - 0x14, 0x03, 0x00, 0x94, 0x14, 0x03, 0x00, 0x95, 0x84, 0x00, 0x10, 0x73, - 0x02, 0x84, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x48, 0x49, 0xfc, 0xe1, 0x76, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x80, 0xc0, - 0x44, 0x00, 0x00, 0x20, 0x80, 0xe1, 0x4c, 0x10, 0x40, 0x0d, 0x2e, 0x15, - 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, 0xc8, 0x20, - 0xb4, 0x26, 0x84, 0xa1, 0xd9, 0x1d, 0xd5, 0x0b, 0x84, 0x28, 0x4c, 0x70, - 0xc0, 0x16, 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, - 0x96, 0x00, 0xc8, 0x5f, 0x00, 0x03, 0x01, 0xa8, 0x54, 0x00, 0x00, 0x02, - 0xc0, 0x09, 0x00, 0x03, 0x02, 0x82, 0xe6, 0x05, 0xe8, 0x05, 0x80, 0x06, - 0x84, 0x25, 0x49, 0xff, 0xff, 0xce, 0x84, 0xa4, 0xd7, 0x50, 0x84, 0xa8, - 0xd7, 0x4e, 0x2e, 0x85, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x89, 0x00, - 0x44, 0x00, 0x00, 0x20, 0x54, 0x84, 0x00, 0xff, 0x4c, 0x70, 0x00, 0x2f, - 0x95, 0x41, 0xd7, 0x04, 0x44, 0x50, 0x00, 0x10, 0xdf, 0x39, 0x2e, 0x05, - 0xb5, 0x3a, 0x96, 0x04, 0xc0, 0x0a, 0xe7, 0x02, 0xe9, 0x1a, 0x04, 0x23, - 0x00, 0x93, 0x80, 0x06, 0x84, 0x21, 0x49, 0xfd, 0xe9, 0xb6, 0xd5, 0x13, - 0x44, 0x50, 0x00, 0x10, 0xdf, 0x2e, 0x4e, 0x82, 0x00, 0x2d, 0xb4, 0xa6, - 0x84, 0x21, 0xd1, 0x04, 0x04, 0x53, 0x00, 0x92, 0xd9, 0x0b, 0x04, 0x23, - 0x00, 0x93, 0x80, 0x06, 0x84, 0x21, 0x49, 0xfd, 0xe9, 0xa4, 0xd5, 0x04, - 0x44, 0x50, 0x00, 0x10, 0xdf, 0x1c, 0x4e, 0x82, 0x00, 0x1b, 0x80, 0x06, - 0x49, 0xff, 0xff, 0x2f, 0xd5, 0x16, 0x80, 0x06, 0x49, 0xff, 0xff, 0x2b, - 0x4e, 0x83, 0x00, 0x12, 0xb4, 0x06, 0x84, 0xa1, 0xd8, 0x0e, 0x00, 0x13, - 0x02, 0x82, 0x04, 0x23, 0x00, 0x93, 0x80, 0x06, 0x49, 0xfd, 0xe9, 0x8b, - 0xd5, 0x06, 0x80, 0x06, 0x80, 0x27, 0x49, 0xfd, 0xd8, 0x00, 0x92, 0x00, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x48, 0x96, 0x00, 0x49, 0xfc, 0xde, 0x2b, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xde, 0xf3, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xc5, 0xd7, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x80, 0xc0, 0x50, 0x00, 0x02, 0x8d, 0x80, 0xe1, - 0x49, 0xfe, 0x15, 0x7b, 0x84, 0x00, 0x10, 0x03, 0x02, 0x62, 0x3e, 0x0d, - 0x84, 0x98, 0xa0, 0x41, 0x4c, 0x13, 0x40, 0x07, 0x84, 0x20, 0x84, 0x46, - 0xac, 0x40, 0xa8, 0x83, 0xa8, 0x41, 0x00, 0x03, 0x02, 0x61, 0x54, 0x10, - 0x00, 0x18, 0xc9, 0x04, 0x96, 0x42, 0x4e, 0x14, 0x00, 0x48, 0x54, 0x10, - 0x00, 0x08, 0xc1, 0x10, 0x04, 0x13, 0x00, 0x25, 0x56, 0x00, 0x00, 0x08, - 0x54, 0x20, 0x80, 0x04, 0x10, 0x03, 0x02, 0x61, 0xc2, 0x07, 0x42, 0x10, - 0x88, 0x09, 0x58, 0x10, 0x80, 0x08, 0x14, 0x13, 0x00, 0x25, 0x00, 0x03, - 0x02, 0x61, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x1a, 0x04, 0x03, 0x00, 0x25, - 0x54, 0x10, 0x00, 0x04, 0xc1, 0x07, 0x42, 0x00, 0x08, 0x09, 0x58, 0x00, - 0x00, 0x08, 0x14, 0x03, 0x00, 0x25, 0x00, 0x03, 0x02, 0x61, 0x56, 0x00, - 0x00, 0x10, 0x10, 0x03, 0x02, 0x61, 0x2e, 0x05, 0xb4, 0xfc, 0xc8, 0x06, - 0xc7, 0x06, 0x80, 0x06, 0x84, 0x26, 0x80, 0x47, 0xd5, 0x15, 0xcf, 0x16, - 0x00, 0x03, 0x02, 0x61, 0x54, 0x10, 0x00, 0xc0, 0xc9, 0x04, 0x96, 0x02, - 0x4e, 0x04, 0x00, 0x09, 0x2e, 0x05, 0xb3, 0xe0, 0x96, 0x04, 0xc0, 0x04, - 0x84, 0x06, 0x10, 0x03, 0x02, 0x65, 0x80, 0x06, 0x44, 0x10, 0x00, 0x18, - 0x84, 0x40, 0x49, 0xfd, 0xaa, 0x46, 0x00, 0x13, 0x02, 0x5a, 0x84, 0x43, - 0x00, 0x03, 0x02, 0x61, 0x4c, 0x11, 0x00, 0x0c, 0x92, 0x05, 0x94, 0x05, - 0x10, 0x03, 0x02, 0x61, 0x80, 0x27, 0x80, 0x06, 0x49, 0xfd, 0x60, 0xd5, - 0x48, 0x00, 0x00, 0xc1, 0x42, 0x10, 0x04, 0x0b, 0xc1, 0x36, 0x96, 0x44, - 0xc9, 0x34, 0x92, 0x05, 0x94, 0x05, 0x10, 0x03, 0x02, 0x61, 0x84, 0x26, - 0x80, 0x06, 0x80, 0x47, 0x49, 0xfd, 0xaa, 0x27, 0x00, 0x03, 0x02, 0x69, - 0x4e, 0x02, 0x00, 0xaf, 0x4e, 0x73, 0x00, 0xad, 0x00, 0x03, 0x01, 0xad, - 0x54, 0x00, 0x00, 0x04, 0x4e, 0x02, 0x00, 0xa7, 0x00, 0x23, 0x02, 0x46, - 0x3e, 0x1d, 0x94, 0xdc, 0x38, 0x30, 0x8a, 0x02, 0x46, 0x08, 0x00, 0x00, - 0x42, 0x31, 0xfc, 0x08, 0x38, 0x30, 0x8a, 0x0a, 0x49, 0xfe, 0x0a, 0x1b, - 0x00, 0x03, 0x02, 0x8d, 0xc8, 0x46, 0x80, 0x47, 0x44, 0x00, 0xbb, 0x80, - 0x44, 0x15, 0x50, 0x34, 0x80, 0x66, 0x80, 0x87, 0x84, 0xa1, 0x49, 0xfe, - 0x15, 0x80, 0x10, 0x03, 0x02, 0x8d, 0xd5, 0x39, 0x54, 0x10, 0x00, 0x04, - 0xc1, 0x05, 0x56, 0x00, 0x00, 0x04, 0x10, 0x03, 0x02, 0x61, 0x00, 0x03, - 0x02, 0x61, 0x96, 0x42, 0x4e, 0x14, 0x00, 0x49, 0x00, 0x13, 0x01, 0xad, - 0x54, 0x10, 0x80, 0x04, 0xc1, 0x2c, 0x00, 0x13, 0x02, 0x69, 0xc1, 0x29, - 0x00, 0x23, 0x02, 0x46, 0x3e, 0x1d, 0x94, 0xdc, 0x38, 0x30, 0x8a, 0x02, - 0x46, 0x04, 0x00, 0x00, 0x42, 0x31, 0xf8, 0x08, 0x38, 0x30, 0x8a, 0x0a, - 0x49, 0xfe, 0x09, 0xe9, 0x00, 0x03, 0x02, 0x61, 0x44, 0x10, 0x00, 0x80, - 0x4c, 0x00, 0xc0, 0x61, 0x00, 0x23, 0x02, 0x8d, 0xca, 0x0c, 0x44, 0x00, - 0xbb, 0x80, 0x44, 0x15, 0x50, 0x34, 0x80, 0x66, 0x80, 0x82, 0x84, 0xa1, - 0x49, 0xfe, 0x15, 0x49, 0x10, 0x03, 0x02, 0x8d, 0x14, 0x73, 0x00, 0x09, - 0x80, 0x06, 0x49, 0xfd, 0x88, 0x0a, 0xd5, 0x4c, 0x44, 0x20, 0x00, 0x80, - 0x4c, 0x01, 0x40, 0x0e, 0x80, 0x06, 0x80, 0x47, 0x84, 0x29, 0x49, 0xfd, - 0xa9, 0xb8, 0x00, 0x03, 0x02, 0x61, 0x44, 0x4f, 0xff, 0x80, 0x40, 0x00, - 0x10, 0x03, 0xd5, 0x05, 0x44, 0x1f, 0xff, 0xc0, 0x40, 0x00, 0x04, 0x03, - 0x10, 0x03, 0x02, 0x61, 0xd5, 0x35, 0x54, 0x10, 0x00, 0x40, 0xc1, 0x32, - 0x00, 0x13, 0x02, 0x69, 0xc1, 0x06, 0x04, 0x23, 0x00, 0x92, 0x84, 0x81, - 0x4c, 0x22, 0x40, 0x06, 0x56, 0x00, 0x00, 0x40, 0x10, 0x03, 0x02, 0x61, - 0x80, 0x06, 0x84, 0x2a, 0x80, 0x47, 0x49, 0xfd, 0xa9, 0x96, 0xcf, 0x1b, - 0x00, 0x53, 0x02, 0x69, 0x84, 0x01, 0xd8, 0x1c, 0x04, 0x13, 0x00, 0x92, - 0xc9, 0x19, 0x00, 0x03, 0x02, 0x8d, 0xc8, 0x0c, 0x80, 0x47, 0x44, 0x00, - 0xbb, 0x80, 0x44, 0x15, 0x50, 0x34, 0x80, 0x66, 0x80, 0x87, 0x49, 0xfe, - 0x15, 0x02, 0x10, 0x03, 0x02, 0x8d, 0x80, 0x06, 0x84, 0x20, 0x49, 0xfd, - 0x90, 0xde, 0xd5, 0x06, 0x02, 0x03, 0x01, 0x0e, 0x80, 0x27, 0x49, 0xfd, - 0x61, 0xdc, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xda, 0x55, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, - 0xa6, 0x88, 0x44, 0x30, 0x00, 0x11, 0x80, 0xc0, 0x4c, 0x21, 0x80, 0x06, - 0x9c, 0xd9, 0x4c, 0x21, 0xc0, 0xa7, 0xd5, 0x47, 0x3e, 0x7d, 0xb3, 0xb4, - 0x00, 0x20, 0x02, 0x46, 0x04, 0x13, 0x80, 0x0f, 0x40, 0x81, 0x88, 0x08, - 0x42, 0x11, 0x20, 0x73, 0x04, 0x20, 0x00, 0x08, 0x04, 0x10, 0x80, 0x0e, - 0xa8, 0x8f, 0x49, 0xff, 0xff, 0xda, 0x04, 0x13, 0x00, 0x08, 0x84, 0x62, - 0x4c, 0x11, 0xc0, 0x21, 0x00, 0x23, 0x81, 0x0a, 0x04, 0x03, 0x80, 0x0f, - 0x84, 0x6f, 0x42, 0x01, 0x20, 0x73, 0x50, 0x23, 0x01, 0xd0, 0x04, 0x00, - 0x00, 0x0e, 0x10, 0x30, 0x01, 0x62, 0x00, 0x33, 0x81, 0x0a, 0x04, 0x03, - 0x80, 0x0f, 0x42, 0x01, 0xa0, 0x73, 0x04, 0x00, 0x00, 0x0e, 0xa8, 0x86, - 0x04, 0x03, 0x80, 0x0f, 0x00, 0x23, 0x81, 0x0a, 0x42, 0x01, 0x20, 0x73, - 0x04, 0x00, 0x00, 0x0e, 0xa8, 0x47, 0x04, 0x73, 0x00, 0x92, 0xcf, 0x71, - 0x46, 0x10, 0x20, 0x1c, 0x2e, 0x05, 0x6a, 0x63, 0x84, 0x41, 0x4c, 0x01, - 0x40, 0x6b, 0x3e, 0x75, 0x6a, 0x63, 0x80, 0x06, 0x49, 0xfe, 0x17, 0xf5, - 0x80, 0x07, 0xd5, 0x64, 0x3e, 0x7d, 0xb3, 0xb4, 0x00, 0x20, 0x02, 0x46, - 0x04, 0x13, 0x80, 0x0f, 0x44, 0x90, 0x00, 0x44, 0x42, 0x11, 0x24, 0x73, - 0x85, 0x00, 0x04, 0x10, 0x80, 0x0e, 0x14, 0x80, 0x80, 0x07, 0x49, 0xff, - 0xff, 0x94, 0x04, 0x03, 0x80, 0x0f, 0x00, 0x13, 0x81, 0x0a, 0x42, 0x00, - 0xa4, 0x73, 0x04, 0x00, 0x00, 0x0e, 0x14, 0x80, 0x00, 0x07, 0x00, 0x03, - 0x02, 0x61, 0x54, 0x00, 0x00, 0x40, 0xc0, 0x2d, 0x00, 0x13, 0x02, 0x46, - 0x3e, 0x0d, 0x94, 0xdc, 0x38, 0x00, 0x06, 0x02, 0x42, 0x10, 0x70, 0x0b, - 0xc9, 0x24, 0x42, 0x10, 0x74, 0x0b, 0xc9, 0x21, 0x42, 0x10, 0x78, 0x0b, - 0xc9, 0x1e, 0x4e, 0x05, 0x00, 0x1d, 0x00, 0x23, 0x02, 0x8d, 0xca, 0x0c, - 0x44, 0x00, 0xbb, 0x80, 0x44, 0x15, 0x50, 0x34, 0x80, 0x66, 0x80, 0x82, - 0x84, 0xa1, 0x49, 0xfe, 0x14, 0x58, 0x10, 0x03, 0x02, 0x8d, 0x84, 0x01, - 0x10, 0x03, 0x02, 0x69, 0x84, 0x21, 0x80, 0x06, 0x49, 0xfd, 0x90, 0x31, - 0x00, 0x03, 0x02, 0x61, 0x50, 0x00, 0x7f, 0xc0, 0x10, 0x03, 0x02, 0x61, - 0x04, 0x03, 0x00, 0x25, 0xc0, 0x14, 0x00, 0x23, 0x02, 0x46, 0x3c, 0x0d, - 0x6c, 0xfc, 0x44, 0x10, 0x00, 0x44, 0x42, 0x01, 0x04, 0x73, 0x84, 0x40, - 0x04, 0x10, 0x00, 0x0e, 0x84, 0x00, 0x10, 0x20, 0x81, 0x6d, 0xd5, 0x06, - 0x49, 0xfd, 0xa7, 0x6f, 0x92, 0x00, 0xd5, 0x02, 0x84, 0x00, 0xec, 0x04, - 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x80, 0xc0, 0x80, 0xe1, 0xa6, 0x08, 0x02, 0x13, 0x01, 0x0d, 0x4c, 0x10, - 0x40, 0x05, 0x84, 0x20, 0x12, 0x13, 0x01, 0x0d, 0x50, 0x10, 0x7f, 0xef, - 0x96, 0x49, 0xe6, 0x22, 0xe8, 0x06, 0x80, 0x06, 0x80, 0x27, 0x49, 0xff, - 0xff, 0x32, 0xd5, 0x2a, 0x5c, 0xf0, 0x00, 0x3f, 0xe8, 0x0a, 0x5c, 0xf0, - 0x00, 0x3d, 0xe8, 0x0c, 0x44, 0x50, 0x00, 0x13, 0xd0, 0x15, 0x8c, 0xb9, - 0xd8, 0x1a, 0xd5, 0x0b, 0x50, 0x00, 0x7f, 0xc0, 0x84, 0x22, 0xe2, 0x20, - 0xe9, 0x14, 0x80, 0x06, 0x80, 0x27, 0x49, 0xff, 0xfd, 0xc6, 0xd5, 0x14, - 0x00, 0x03, 0x02, 0x46, 0x49, 0xfd, 0xf7, 0x1d, 0x84, 0x21, 0xb6, 0x20, - 0xd5, 0x08, 0x00, 0x03, 0x02, 0x6a, 0x84, 0xa3, 0xd8, 0x04, 0x84, 0x04, - 0x10, 0x03, 0x02, 0x6a, 0x80, 0x06, 0x80, 0x27, 0x84, 0x40, 0x49, 0xfd, - 0x7b, 0x7c, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x96, 0x00, 0xc0, 0x18, 0x49, 0xfd, 0xbe, 0xec, 0x80, 0xc0, - 0xc0, 0x14, 0x00, 0x10, 0x02, 0x90, 0xc1, 0x11, 0x49, 0xff, 0xd6, 0x1f, - 0xc8, 0x0e, 0x04, 0x03, 0x00, 0x25, 0x54, 0x10, 0x00, 0x40, 0xc9, 0x09, - 0x58, 0x00, 0x00, 0x40, 0x14, 0x03, 0x00, 0x25, 0x80, 0x06, 0x49, 0xfd, - 0xb2, 0xa0, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa8, 0xbc, 0x80, 0xc0, 0x49, 0xff, 0xd6, 0x09, 0x92, 0x00, 0x84, 0x41, - 0x50, 0x13, 0x00, 0xb0, 0x4c, 0x01, 0x40, 0x06, 0x84, 0x08, 0x50, 0x23, - 0x01, 0x08, 0xd5, 0x04, 0x84, 0x08, 0x50, 0x23, 0x00, 0xb8, 0x49, 0xfe, - 0x14, 0xac, 0x00, 0x13, 0x02, 0x46, 0x3c, 0x0d, 0x6c, 0xfc, 0x44, 0xa0, - 0x00, 0x44, 0x42, 0x00, 0xa8, 0x73, 0x50, 0x13, 0x00, 0xb0, 0x04, 0x00, - 0x00, 0x0e, 0x85, 0x21, 0x14, 0x10, 0x00, 0x0b, 0x3c, 0x1d, 0x58, 0x91, - 0x00, 0x03, 0x02, 0x46, 0xdd, 0x21, 0x10, 0x93, 0x02, 0x90, 0x00, 0x13, - 0x02, 0x46, 0x3c, 0x0d, 0x6c, 0xfc, 0x84, 0x40, 0x42, 0x00, 0xa8, 0x73, - 0x04, 0x10, 0x00, 0x0e, 0x80, 0x66, 0x10, 0x90, 0x81, 0x6d, 0x3e, 0x95, - 0x24, 0x75, 0x84, 0x04, 0x46, 0x10, 0x00, 0x9d, 0x58, 0x10, 0x8e, 0x2c, - 0x80, 0x82, 0x84, 0xa1, 0x49, 0xfe, 0x13, 0x8b, 0x2e, 0x05, 0xb5, 0x35, - 0xc0, 0x24, 0x02, 0x03, 0x01, 0x1e, 0x84, 0x40, 0x3c, 0x1d, 0x58, 0x86, - 0x80, 0x82, 0x80, 0xa2, 0x80, 0x66, 0x94, 0x04, 0x49, 0xfe, 0x13, 0x7d, - 0x10, 0x03, 0x02, 0x98, 0x02, 0x03, 0x01, 0x1e, 0x84, 0x40, 0x3c, 0x1d, - 0x58, 0x85, 0x94, 0x04, 0x50, 0x00, 0x7f, 0x9c, 0x80, 0x66, 0x80, 0x82, - 0x80, 0xa2, 0x49, 0xfe, 0x13, 0x6e, 0x84, 0x20, 0x10, 0x13, 0x02, 0x9d, - 0x10, 0x03, 0x02, 0x9a, 0x10, 0x13, 0x02, 0x9b, 0x10, 0x13, 0x02, 0x9c, - 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xcc, 0x11, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xc8, 0xf9, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xdd, 0xa5, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x97, 0x80, - 0xc6, 0x31, 0x3c, 0x0d, 0x58, 0x72, 0x42, 0x00, 0x68, 0x0b, 0xc8, 0x03, - 0x84, 0x0c, 0xd5, 0x32, 0x3e, 0x6d, 0xa8, 0x38, 0xb4, 0x46, 0x84, 0x1f, - 0x44, 0x17, 0x5f, 0x58, 0x4c, 0x20, 0x40, 0x1e, 0xa0, 0x31, 0xdd, 0x21, - 0xa4, 0x74, 0xa4, 0xf5, 0xb6, 0x06, 0x98, 0xd9, 0x3c, 0x1d, 0x6c, 0x95, - 0x00, 0x03, 0x00, 0x0e, 0x90, 0x61, 0x84, 0x40, 0xac, 0xf6, 0x10, 0x00, - 0x80, 0x1b, 0x80, 0x62, 0x84, 0x01, 0x46, 0x10, 0x00, 0xac, 0x58, 0x10, - 0x8c, 0xb8, 0x80, 0x82, 0x80, 0xa2, 0x49, 0xfe, 0x13, 0x18, 0x10, 0x03, - 0x00, 0x0f, 0xd5, 0x04, 0xa0, 0x31, 0xdd, 0x21, 0xb6, 0x06, 0x84, 0x00, - 0xd5, 0x09, 0x3e, 0x0d, 0xa8, 0x47, 0x49, 0xfe, 0x12, 0x66, 0x84, 0x3f, - 0x3c, 0x1f, 0x6a, 0x0e, 0x80, 0x06, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xdc, 0x49, 0xff, 0xf5, 0x29, - 0x84, 0x21, 0x4c, 0x00, 0x81, 0x23, 0xc0, 0x07, 0x44, 0x20, 0x00, 0x1b, - 0x4c, 0x01, 0x41, 0x3a, 0x48, 0x00, 0x01, 0x32, 0x3c, 0x0d, 0x60, 0x93, - 0x84, 0x61, 0x4c, 0x01, 0x80, 0x09, 0x2e, 0x15, 0x80, 0xa1, 0xc9, 0x05, - 0x2e, 0x05, 0x80, 0xa0, 0x4e, 0x02, 0x01, 0x2c, 0x84, 0x20, 0x84, 0x63, - 0x50, 0x6f, 0x80, 0x1c, 0x3c, 0x3f, 0x60, 0x93, 0xae, 0x72, 0xac, 0x70, - 0x84, 0x40, 0xae, 0xb3, 0x50, 0x0f, 0x80, 0x1f, 0x2f, 0xc4, 0xa2, 0x9c, - 0x49, 0xfe, 0x1c, 0x37, 0x80, 0x06, 0x49, 0xfe, 0x1e, 0x80, 0x84, 0x00, - 0x49, 0xff, 0xff, 0x91, 0x3c, 0x0d, 0x58, 0x72, 0x42, 0x00, 0x68, 0x0b, - 0xc0, 0x05, 0x46, 0x00, 0x40, 0x00, 0x49, 0xfe, 0x07, 0x84, 0x84, 0xc0, - 0x85, 0x01, 0x80, 0xe6, 0xd5, 0x1a, 0x49, 0xfd, 0xbd, 0xcc, 0xc0, 0x14, - 0xb4, 0x20, 0x40, 0x20, 0xbc, 0x08, 0x92, 0x5e, 0x44, 0x30, 0x00, 0x10, - 0x4c, 0x11, 0x80, 0x0d, 0x8c, 0x70, 0x4c, 0x11, 0x80, 0x0a, 0xca, 0x08, - 0x02, 0x00, 0x01, 0x0e, 0x44, 0x10, 0x00, 0x13, 0x49, 0xfd, 0x5f, 0x97, - 0x84, 0xe1, 0x8d, 0x01, 0x54, 0x84, 0x00, 0xff, 0x9d, 0xb1, 0x80, 0x06, - 0xe3, 0x1c, 0xe9, 0xe4, 0x3c, 0x0d, 0x58, 0x72, 0x54, 0x10, 0x00, 0x02, - 0xc9, 0x09, 0x46, 0x20, 0x05, 0x00, 0x40, 0x10, 0x08, 0x02, 0xc1, 0x1d, - 0x54, 0x00, 0x00, 0x80, 0xc8, 0x1a, 0x84, 0x04, 0x50, 0x6f, 0x80, 0x04, - 0xa8, 0x33, 0x49, 0xfe, 0x26, 0x78, 0x3c, 0x1d, 0x6a, 0x25, 0xc1, 0x03, - 0x80, 0x06, 0xdd, 0x21, 0x84, 0x04, 0x49, 0xfd, 0x6b, 0xa2, 0xc8, 0x03, - 0x84, 0xc1, 0xd5, 0x0a, 0x3e, 0x0d, 0x6b, 0x2c, 0x49, 0xfe, 0x11, 0xe1, - 0x84, 0xc1, 0x49, 0xfd, 0x65, 0x40, 0xd5, 0x02, 0x84, 0xc0, 0x3c, 0x3d, - 0x67, 0x06, 0x84, 0x03, 0x4c, 0x30, 0x40, 0x0b, 0x49, 0xfe, 0x26, 0x2b, - 0x2e, 0x05, 0x9c, 0x34, 0xc8, 0x02, 0xd5, 0x03, 0x49, 0xfe, 0x0c, 0xe9, - 0x84, 0xc1, 0x49, 0xfe, 0x08, 0x78, 0x3c, 0x0f, 0x60, 0x94, 0xc0, 0x04, - 0x84, 0x00, 0x49, 0xfe, 0x0a, 0x82, 0x2e, 0x05, 0x80, 0xa1, 0xc0, 0x04, - 0x84, 0x02, 0x49, 0xfe, 0x0a, 0x7c, 0x3c, 0x0d, 0x6d, 0x80, 0x42, 0x00, - 0x60, 0x0b, 0xc0, 0x04, 0x49, 0xfe, 0xc7, 0xa5, 0x84, 0xc1, 0x84, 0x00, - 0x3c, 0x2d, 0x59, 0x29, 0x80, 0x20, 0xdd, 0x22, 0x2e, 0x15, 0x80, 0xa0, - 0x56, 0x00, 0x00, 0x0c, 0x85, 0x21, 0x40, 0x64, 0x80, 0x1b, 0xc1, 0x0a, - 0x44, 0x00, 0x01, 0x40, 0x49, 0xfa, 0xee, 0x4f, 0x3c, 0x2d, 0x59, 0x29, - 0x80, 0x09, 0x84, 0x20, 0xdd, 0x22, 0x3c, 0x0d, 0x6d, 0x80, 0x54, 0x00, - 0x00, 0x3f, 0xc0, 0x0f, 0x2e, 0x05, 0xb8, 0x70, 0x84, 0x41, 0x4c, 0x01, - 0x00, 0x0b, 0x2e, 0x15, 0x80, 0xa0, 0x3e, 0x0d, 0x82, 0x40, 0xc9, 0x03, - 0x80, 0x22, 0xd5, 0x06, 0x84, 0x20, 0xd5, 0x04, 0x84, 0x20, 0x3e, 0x0d, - 0x82, 0x40, 0x10, 0x10, 0x00, 0x15, 0x3c, 0x1d, 0x59, 0x35, 0x84, 0x00, - 0xdd, 0x21, 0x2f, 0xc4, 0xa2, 0x9f, 0x2e, 0x84, 0xa2, 0x9e, 0x56, 0x00, - 0x00, 0x0c, 0x41, 0xc4, 0x70, 0x00, 0x84, 0x21, 0x40, 0x60, 0x80, 0x1b, - 0x55, 0xce, 0x00, 0xff, 0xd5, 0x11, 0x49, 0xfe, 0xc1, 0x62, 0xc0, 0x0b, - 0xb4, 0x20, 0x54, 0x10, 0x80, 0x02, 0xc1, 0x07, 0x3c, 0x2d, 0x53, 0xbe, - 0x44, 0x10, 0x00, 0x13, 0xdd, 0x22, 0x84, 0xe1, 0x8d, 0x01, 0x54, 0x84, - 0x00, 0xff, 0x80, 0x08, 0xe3, 0x1c, 0xe9, 0xee, 0x84, 0x01, 0x4c, 0x70, - 0x40, 0x11, 0x84, 0x40, 0x3c, 0x0d, 0x60, 0x91, 0x80, 0xa7, 0x46, 0x10, - 0x00, 0xa4, 0x58, 0x10, 0x88, 0x4c, 0x80, 0x62, 0x80, 0x82, 0x49, 0xfe, - 0x11, 0xfc, 0x3e, 0x05, 0x82, 0x40, 0xd5, 0x10, 0x84, 0x21, 0x4c, 0x60, - 0xc0, 0x11, 0x84, 0x40, 0x3c, 0x0d, 0x60, 0x92, 0x80, 0xa6, 0x46, 0x10, - 0x00, 0xa1, 0x58, 0x10, 0x8d, 0x8c, 0x80, 0x62, 0x80, 0x82, 0x49, 0xfe, - 0x11, 0xea, 0x44, 0x00, 0x00, 0x1f, 0xd5, 0x2a, 0x2e, 0x15, 0x80, 0xa0, - 0xc9, 0x07, 0x2e, 0x05, 0x80, 0xa1, 0xc8, 0x04, 0x3c, 0x0f, 0x60, 0x93, - 0xd5, 0x21, 0x49, 0xfe, 0xbe, 0xc0, 0xd5, 0x1a, 0x3e, 0x6d, 0x82, 0x40, - 0xa1, 0xf3, 0xcf, 0x19, 0xa0, 0x74, 0xa8, 0x33, 0xc1, 0x05, 0x80, 0x01, - 0x49, 0xfe, 0x09, 0xe7, 0xa9, 0xf4, 0x2e, 0x05, 0x82, 0x55, 0xc0, 0x0f, - 0x3c, 0x1d, 0x59, 0x35, 0x84, 0x01, 0xdd, 0x21, 0x84, 0x00, 0x3e, 0x05, - 0x82, 0x55, 0xd5, 0x07, 0x2e, 0x05, 0x80, 0xa1, 0xc0, 0x04, 0x49, 0xff, - 0xd5, 0x24, 0x92, 0x00, 0x84, 0x00, 0xec, 0x24, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0xa6, 0x40, 0xc9, 0x05, - 0x2e, 0x15, 0x82, 0x4c, 0x84, 0x07, 0xd5, 0x0e, 0x84, 0xa1, 0xd9, 0x09, - 0xa6, 0x01, 0x49, 0xff, 0xfe, 0xaa, 0xc8, 0x0a, 0x2e, 0x15, 0x82, 0x4c, - 0x84, 0x08, 0xd5, 0x04, 0x84, 0x08, 0x44, 0x10, 0x00, 0xff, 0x49, 0xfd, - 0x21, 0xd8, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xfc, 0x81, 0x20, 0x44, 0x00, 0x20, 0x00, 0x81, 0x01, - 0x4c, 0x10, 0x00, 0x05, 0x94, 0x44, 0x4c, 0x80, 0xc0, 0x53, 0x3c, 0x2d, - 0x59, 0x4e, 0x80, 0x28, 0x80, 0x09, 0xdd, 0x22, 0x44, 0x52, 0x00, 0x00, - 0x4c, 0x82, 0xc0, 0x44, 0x00, 0x04, 0x80, 0x2c, 0x49, 0xfe, 0xc0, 0xcb, - 0x02, 0x60, 0x00, 0x1b, 0x80, 0xe0, 0x49, 0xfe, 0x94, 0x78, 0x99, 0xb6, - 0x54, 0x10, 0x00, 0x03, 0x97, 0xb1, 0x80, 0x40, 0x3c, 0x0f, 0x49, 0x34, - 0xc1, 0x05, 0x49, 0xfe, 0x93, 0xce, 0x92, 0x00, 0x80, 0x40, 0x9c, 0x94, - 0xa0, 0xfc, 0x40, 0x01, 0x04, 0x09, 0x98, 0x06, 0x92, 0x61, 0x40, 0x00, - 0x18, 0x37, 0xa8, 0xbc, 0x40, 0x11, 0x98, 0x77, 0x42, 0x30, 0x18, 0x73, - 0x98, 0xdb, 0x9e, 0x1c, 0xe2, 0x02, 0xe8, 0x03, 0x98, 0x36, 0x98, 0xd8, - 0x52, 0x21, 0x7f, 0xfc, 0x98, 0x53, 0x92, 0x22, 0x96, 0x49, 0x92, 0xc1, - 0xe2, 0xc1, 0xe8, 0x03, 0x9a, 0x4e, 0x96, 0x49, 0x40, 0x60, 0x84, 0x1b, - 0x3c, 0x1d, 0x77, 0xe4, 0x9f, 0xb1, 0x97, 0xb1, 0x12, 0x60, 0x80, 0x0a, - 0x3c, 0x0d, 0x77, 0xe4, 0x00, 0x13, 0x80, 0x33, 0x10, 0x10, 0x00, 0x13, - 0x12, 0x63, 0x80, 0x1a, 0x3c, 0x2d, 0x59, 0x4f, 0x80, 0x28, 0x80, 0x09, - 0xdd, 0x22, 0xd5, 0x06, 0x3c, 0x1d, 0x59, 0x4d, 0x44, 0x00, 0x00, 0x84, - 0xdd, 0x21, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xec, 0x04, 0x20, 0x00, 0x92, 0x81, 0x00, 0xf1, 0x83, - 0xca, 0x08, 0x80, 0x02, 0x49, 0xfe, 0xae, 0xbb, 0x80, 0x40, 0x2e, 0x65, - 0xb5, 0x04, 0xd5, 0x09, 0x00, 0x00, 0x02, 0x46, 0x84, 0x20, 0x49, 0xfe, - 0x24, 0x48, 0x2e, 0x65, 0xb5, 0x03, 0x80, 0x40, 0x92, 0x41, 0xf6, 0x82, - 0xf2, 0x81, 0x2e, 0x45, 0x9b, 0xd5, 0x04, 0x24, 0x00, 0x48, 0xc4, 0x08, - 0x50, 0x41, 0x00, 0x10, 0x3c, 0x52, 0xb5, 0x08, 0x99, 0x24, 0x98, 0xa5, - 0xd5, 0x0a, 0x50, 0x41, 0x7f, 0xf7, 0x5c, 0xf2, 0x00, 0x29, 0xe9, 0x04, - 0x44, 0x20, 0x01, 0x40, 0xd5, 0x02, 0x94, 0x93, 0x80, 0x02, 0x3e, 0xaf, - 0x52, 0x68, 0x49, 0xfe, 0x93, 0xea, 0x50, 0x65, 0x02, 0x8b, 0x84, 0xe0, - 0x83, 0x80, 0x44, 0x00, 0x02, 0xac, 0x42, 0x13, 0x80, 0x24, 0x00, 0x25, - 0x00, 0x00, 0x3e, 0x0f, 0x52, 0x6c, 0x9d, 0xf9, 0x98, 0x48, 0xc2, 0x2c, - 0x4c, 0x14, 0x00, 0x2b, 0x00, 0x15, 0x02, 0x6e, 0xc1, 0x27, 0x04, 0x15, - 0x00, 0x01, 0x44, 0x20, 0x00, 0x10, 0x4c, 0x11, 0x00, 0x22, 0xa6, 0x30, - 0x49, 0xfe, 0x0f, 0xd7, 0x2e, 0x15, 0x83, 0xe0, 0x3c, 0x2d, 0x60, 0xf3, - 0x94, 0x4b, 0x98, 0x51, 0xa6, 0x4d, 0x92, 0x21, 0x49, 0xfe, 0x93, 0x2b, - 0x80, 0x20, 0x80, 0x1c, 0x49, 0xfe, 0x93, 0x89, 0xc0, 0x0f, 0xa6, 0x30, - 0x49, 0xfe, 0x0f, 0xc5, 0x2e, 0x15, 0x83, 0xe0, 0x3c, 0x2d, 0x60, 0xf3, - 0x94, 0x4b, 0x98, 0x51, 0xa6, 0x4d, 0x92, 0x21, 0x49, 0xfe, 0x93, 0x19, - 0x83, 0x80, 0x84, 0x09, 0x50, 0xa5, 0x02, 0xac, 0x50, 0x63, 0x02, 0xac, - 0x4c, 0x70, 0x7f, 0xc5, 0x49, 0xfe, 0x93, 0xb9, 0x80, 0x20, 0x80, 0x1c, - 0x49, 0xfe, 0x93, 0x15, 0xf1, 0x01, 0x42, 0x50, 0x80, 0x09, 0x40, 0x40, - 0x04, 0x09, 0x99, 0x25, 0x95, 0xe4, 0x92, 0xe4, 0xf0, 0x03, 0x80, 0x27, - 0x49, 0xfe, 0x11, 0xe3, 0x50, 0x04, 0x02, 0x87, 0x49, 0xfe, 0x10, 0x07, - 0xf1, 0x01, 0xf2, 0x02, 0x9b, 0xf9, 0x9b, 0xba, 0x84, 0x40, 0x80, 0x82, - 0x80, 0x68, 0x84, 0xa1, 0x46, 0x10, 0x00, 0xa3, 0x58, 0x10, 0x82, 0xf4, - 0x80, 0x06, 0x49, 0xfe, 0x10, 0x9e, 0x10, 0x04, 0x02, 0x87, 0x2e, 0x15, - 0xb4, 0xe0, 0x9a, 0x31, 0x49, 0xfe, 0x93, 0x7d, 0x14, 0x04, 0x00, 0x0a, - 0x00, 0x34, 0x02, 0x46, 0x80, 0x80, 0x84, 0x21, 0x84, 0x06, 0x44, 0x20, - 0x73, 0x80, 0x49, 0xfe, 0x9e, 0xb0, 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xb8, 0x2b, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x0d, 0x5b, 0x18, 0xe6, 0x03, 0xe9, 0x03, - 0x84, 0x00, 0xd5, 0x14, 0x2e, 0x05, 0x6b, 0x47, 0x54, 0x00, 0x00, 0x03, - 0xc0, 0x0d, 0x49, 0xff, 0xff, 0xe8, 0xc8, 0x0a, 0x3c, 0x0d, 0x58, 0x72, - 0x44, 0x11, 0x80, 0x00, 0x40, 0x00, 0x04, 0x02, 0x5c, 0x00, 0x00, 0x01, - 0xd5, 0x02, 0x84, 0x00, 0x96, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0xa0, 0xc2, 0x80, 0x20, 0xb4, 0xc0, - 0x00, 0x20, 0x80, 0x10, 0xa0, 0x01, 0xe6, 0x63, 0xe8, 0x56, 0xa0, 0x4b, - 0xe6, 0x24, 0xe8, 0x53, 0xe6, 0x42, 0xe8, 0x51, 0x46, 0x2c, 0xd1, 0x0c, - 0x58, 0x21, 0x0c, 0x18, 0x40, 0x10, 0x08, 0x02, 0xc1, 0x4a, 0x54, 0x00, - 0x00, 0xe1, 0xc8, 0x47, 0x80, 0x06, 0x49, 0xfd, 0xbb, 0x8e, 0x80, 0x40, - 0xc0, 0x13, 0xb4, 0x20, 0x44, 0x00, 0x00, 0x10, 0x4c, 0x10, 0x00, 0x0f, - 0x95, 0x41, 0xd1, 0x0c, 0x44, 0x50, 0x80, 0x00, 0xd1, 0x09, 0x95, 0x69, - 0xd1, 0x07, 0x02, 0x01, 0x01, 0x0d, 0x84, 0xa7, 0xd0, 0x35, 0x84, 0x0b, - 0xd5, 0x34, 0x80, 0x06, 0x3e, 0x1d, 0xb3, 0xbc, 0x49, 0xfe, 0x10, 0xef, - 0xc8, 0x2a, 0x2e, 0x05, 0x9b, 0xcc, 0xc0, 0x2a, 0x2e, 0x05, 0x6b, 0x3a, - 0x2e, 0x15, 0x6b, 0x3b, 0x98, 0x01, 0x96, 0x00, 0xc0, 0x10, 0x2e, 0x05, - 0xb4, 0xf6, 0xc0, 0x20, 0x49, 0xfd, 0xf5, 0xc1, 0xc0, 0x03, 0x84, 0x09, - 0xd5, 0x1c, 0x49, 0xfd, 0xf3, 0x10, 0x84, 0xa2, 0xd0, 0x04, 0x2e, 0x05, - 0x6b, 0x3b, 0xc8, 0x14, 0x3c, 0x1d, 0x66, 0xe7, 0xc9, 0x04, 0x3c, 0x0d, - 0x66, 0xe8, 0xc8, 0x0e, 0x2e, 0x15, 0x6b, 0x28, 0x2e, 0x05, 0x6b, 0x29, - 0xe2, 0x20, 0xe8, 0x08, 0x49, 0xff, 0xff, 0x7b, 0xc8, 0x05, 0xd5, 0x05, - 0x44, 0x00, 0x00, 0x12, 0xd5, 0x02, 0x84, 0x0c, 0x3a, 0x6f, 0x98, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x81, 0x00, 0x49, 0xff, 0xff, 0x97, - 0x80, 0xc0, 0x84, 0xab, 0xd6, 0x02, 0xce, 0x2f, 0x84, 0x20, 0x80, 0x41, - 0x3c, 0x3d, 0x66, 0xdb, 0x38, 0x21, 0x84, 0x08, 0x9c, 0x49, 0x44, 0x50, - 0x00, 0xf8, 0xd9, 0xf9, 0x84, 0xab, 0xde, 0x10, 0xb4, 0x08, 0x49, 0xfd, - 0xbb, 0x2c, 0xc8, 0x04, 0x44, 0x60, 0x00, 0x1f, 0xd5, 0x1c, 0x00, 0x20, - 0x02, 0x48, 0x84, 0x20, 0x10, 0x20, 0x02, 0x5f, 0x49, 0xfd, 0x4a, 0xf9, - 0xd5, 0x18, 0x3c, 0x2d, 0x59, 0x0d, 0x44, 0x10, 0x00, 0x50, 0x84, 0x01, - 0xdd, 0x22, 0x3c, 0x2d, 0x58, 0x2e, 0x84, 0x21, 0x80, 0x08, 0xdd, 0x22, - 0x80, 0xc0, 0xc0, 0x0b, 0x3c, 0x2d, 0x59, 0x0d, 0x84, 0x00, 0x44, 0x10, - 0x00, 0x50, 0xdd, 0x22, 0x80, 0x06, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x84, 0x21, 0x3c, 0x1a, 0xcd, 0xda, 0x84, 0xc0, 0xd5, 0xf8, 0x3a, 0x6f, - 0xa0, 0xbc, 0x81, 0x00, 0x49, 0xff, 0xff, 0x57, 0x80, 0xc0, 0xc8, 0x14, - 0x3c, 0x2d, 0x59, 0x0d, 0x44, 0x10, 0x00, 0x50, 0x84, 0x01, 0xdd, 0x22, - 0x3c, 0x2d, 0x58, 0x2e, 0x84, 0x22, 0x80, 0x08, 0xdd, 0x22, 0x80, 0xc0, - 0xc0, 0x07, 0x3c, 0x2d, 0x59, 0x0d, 0x84, 0x00, 0x44, 0x10, 0x00, 0x50, - 0xdd, 0x22, 0x80, 0x06, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xcb, 0xa7, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xda, 0x7b, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x80, 0xc0, 0x80, 0x01, - 0x49, 0xfe, 0x10, 0x9d, 0x81, 0x00, 0x50, 0x0f, 0x80, 0x0c, 0x49, 0xfa, - 0xe5, 0x94, 0x02, 0x03, 0x01, 0x1d, 0x44, 0x10, 0x00, 0x17, 0x4c, 0x00, - 0xc0, 0x05, 0x84, 0x00, 0x12, 0x03, 0x01, 0x1d, 0xf0, 0x03, 0x49, 0xfa, - 0xe5, 0x9e, 0x2e, 0x05, 0x6a, 0x69, 0x4e, 0x02, 0x01, 0x05, 0x00, 0x03, - 0x02, 0x62, 0x4e, 0x03, 0x01, 0x01, 0x2e, 0x05, 0xb4, 0xf9, 0xc8, 0x05, - 0x2e, 0x05, 0x6a, 0x66, 0x4e, 0x02, 0x00, 0xfa, 0x02, 0x03, 0x01, 0x0d, - 0x44, 0x20, 0x00, 0x17, 0x4c, 0x01, 0x00, 0xf4, 0x84, 0x04, 0x49, 0xfd, - 0x68, 0x6a, 0x4e, 0x03, 0x00, 0xef, 0x3c, 0x1d, 0x58, 0x72, 0x46, 0x20, - 0x04, 0x00, 0x40, 0x10, 0x88, 0x02, 0x4e, 0x13, 0x00, 0xe7, 0x04, 0x23, - 0x00, 0x92, 0xca, 0x04, 0x49, 0xfe, 0xac, 0xd5, 0xd5, 0x05, 0x00, 0x03, - 0x02, 0x46, 0x49, 0xfe, 0x22, 0x66, 0x81, 0x20, 0xb4, 0x26, 0x00, 0x03, - 0x02, 0x5e, 0x84, 0x41, 0x10, 0x03, 0x02, 0x5f, 0x4c, 0x11, 0x40, 0x07, - 0x02, 0x03, 0x01, 0x19, 0x40, 0x00, 0x08, 0x02, 0xd5, 0x03, 0x00, 0x03, - 0x02, 0x6b, 0xc0, 0x28, 0x00, 0x03, 0x02, 0x6a, 0xc0, 0x03, 0x84, 0xec, - 0xd5, 0x25, 0x2e, 0x05, 0xb3, 0xd8, 0x54, 0x00, 0x00, 0x20, 0xc8, 0x04, - 0x44, 0x70, 0x00, 0x1a, 0xd5, 0x1d, 0x00, 0x73, 0x01, 0xa8, 0x44, 0x00, - 0x00, 0x28, 0x54, 0x73, 0x80, 0x28, 0x4c, 0x70, 0x40, 0x14, 0x40, 0x04, - 0x84, 0x09, 0xe2, 0x08, 0xe8, 0x11, 0x40, 0x04, 0x00, 0x01, 0x5c, 0xf0, - 0x27, 0x11, 0xe9, 0x03, 0x95, 0xd5, 0xd5, 0x0a, 0x2e, 0x75, 0x6b, 0x3a, - 0x2e, 0x05, 0x6b, 0x3b, 0x99, 0xf8, 0x97, 0xf8, 0xc7, 0x03, 0x44, 0x70, - 0x00, 0x21, 0x80, 0x06, 0x49, 0xfd, 0xee, 0x6f, 0x84, 0x21, 0x4c, 0x00, - 0x80, 0x0f, 0x00, 0x03, 0x02, 0x69, 0xc8, 0x0b, 0x2e, 0x05, 0xb4, 0xf7, - 0xc8, 0x0a, 0x04, 0x23, 0x00, 0x92, 0xca, 0x07, 0x2e, 0x05, 0x9b, 0xcd, - 0xe6, 0x02, 0xe9, 0x03, 0x44, 0x70, 0x00, 0x21, 0x93, 0x21, 0x41, 0xc4, - 0x24, 0x01, 0x80, 0x1c, 0x49, 0xfe, 0x91, 0xd3, 0x3e, 0x8f, 0x52, 0x68, - 0xb6, 0x1f, 0xf6, 0x81, 0x50, 0xa4, 0x02, 0x8b, 0x00, 0x04, 0x00, 0x00, - 0xc0, 0x32, 0x00, 0x04, 0x02, 0x6e, 0xc0, 0x2f, 0x04, 0x04, 0x00, 0x01, - 0x44, 0x10, 0x00, 0x10, 0x4c, 0x00, 0x80, 0x2a, 0x00, 0x05, 0x00, 0x00, - 0x49, 0xfe, 0x0d, 0xc7, 0x2e, 0x15, 0x83, 0xe0, 0x3c, 0x2d, 0x60, 0xf3, - 0x94, 0x4b, 0x98, 0x51, 0xa6, 0x4d, 0x92, 0x21, 0x49, 0xfe, 0x91, 0x1b, - 0x80, 0x20, 0xb4, 0x1f, 0x49, 0xfe, 0x91, 0x79, 0xc0, 0x16, 0x00, 0x05, - 0x00, 0x00, 0x49, 0xfe, 0x0d, 0xb4, 0x80, 0xc0, 0x2e, 0x05, 0x83, 0xe0, - 0x3c, 0x1d, 0x60, 0xf3, 0x94, 0x03, 0x98, 0x08, 0xa6, 0x45, 0xb4, 0x1f, - 0x92, 0x21, 0x49, 0xfe, 0x91, 0x06, 0x80, 0x20, 0x80, 0x06, 0x49, 0xfe, - 0x91, 0x64, 0xc8, 0x4d, 0x50, 0x84, 0x02, 0xac, 0x3e, 0x0f, 0x6a, 0x74, - 0x50, 0xa5, 0x02, 0xac, 0x4c, 0x80, 0x7f, 0xc6, 0xf6, 0x01, 0xcf, 0x45, - 0x84, 0x01, 0x10, 0x03, 0x02, 0x6a, 0x44, 0x00, 0x02, 0x00, 0x49, 0xfe, - 0x03, 0x30, 0x04, 0x13, 0x00, 0x92, 0x84, 0x41, 0x4c, 0x11, 0x40, 0x0a, - 0x44, 0x00, 0x00, 0x34, 0x80, 0x26, 0x49, 0xfd, 0x4a, 0x74, 0x2e, 0xa5, - 0xb5, 0x03, 0xd5, 0x03, 0x2e, 0xa5, 0xb5, 0x04, 0x80, 0x06, 0x49, 0xfd, - 0x3e, 0x80, 0x80, 0x06, 0x44, 0x10, 0x00, 0x13, 0x49, 0xfd, 0x7b, 0x67, - 0x40, 0x8e, 0x28, 0x01, 0x84, 0x40, 0x80, 0x66, 0x80, 0x82, 0x84, 0xa1, - 0x46, 0x10, 0x00, 0xa3, 0x58, 0x10, 0x82, 0xf4, 0x80, 0x08, 0x49, 0xfe, - 0x0e, 0x7e, 0x10, 0x03, 0x02, 0x87, 0x2e, 0x05, 0xb4, 0xe0, 0x3c, 0x12, - 0xda, 0x5b, 0x98, 0x08, 0x40, 0x04, 0x00, 0x01, 0x49, 0xfe, 0x91, 0x59, - 0x14, 0x03, 0x00, 0x0a, 0x00, 0x33, 0x02, 0x46, 0x80, 0x80, 0x84, 0x21, - 0x84, 0x06, 0x44, 0x20, 0x73, 0x80, 0x49, 0xfe, 0x9c, 0x8c, 0xd5, 0x03, - 0x44, 0x70, 0x00, 0x21, 0x80, 0x07, 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x49, 0x96, 0x91, - 0x96, 0xd9, 0x97, 0x21, 0x49, 0xfc, 0xcb, 0x33, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xf4, - 0x80, 0xc0, 0x50, 0x0f, 0x80, 0x04, 0x80, 0xe1, 0x49, 0xfa, 0xe4, 0x63, - 0x02, 0x03, 0x01, 0x1d, 0x44, 0x50, 0x00, 0x17, 0xd8, 0x04, 0x84, 0x00, - 0x12, 0x03, 0x01, 0x1d, 0xf0, 0x01, 0x49, 0xfa, 0xe4, 0x6e, 0x00, 0x03, - 0x02, 0x6a, 0x4e, 0x03, 0x00, 0x98, 0x00, 0x13, 0x02, 0x46, 0x3e, 0x0d, - 0x94, 0xdc, 0x38, 0x00, 0x06, 0x02, 0x42, 0x00, 0x74, 0x0b, 0x4e, 0x03, - 0x00, 0x8e, 0x02, 0x03, 0x01, 0x0d, 0x44, 0x50, 0x00, 0x2b, 0x4c, 0x02, - 0x80, 0x88, 0x44, 0x50, 0x7f, 0x0c, 0x4c, 0x02, 0x80, 0x84, 0x00, 0x23, - 0x02, 0x5e, 0x04, 0x33, 0x00, 0x92, 0x4c, 0x21, 0x80, 0x08, 0x02, 0x03, - 0x01, 0x19, 0x54, 0x00, 0x00, 0x04, 0x4e, 0x02, 0x00, 0x78, 0x00, 0x03, - 0x01, 0x4e, 0xc0, 0x09, 0xcb, 0x08, 0x00, 0x53, 0x02, 0x5f, 0xd2, 0x05, - 0x44, 0x00, 0x00, 0x23, 0x48, 0x00, 0x00, 0x6f, 0xb4, 0x26, 0x84, 0xa1, - 0xd9, 0x69, 0xc8, 0x07, 0x84, 0x1f, 0x12, 0x03, 0x00, 0xa3, 0x84, 0x04, - 0x12, 0x03, 0x00, 0xa2, 0x00, 0x03, 0x01, 0x4e, 0xc8, 0x06, 0x3c, 0x2d, - 0x58, 0x57, 0x84, 0x24, 0x80, 0x06, 0xdd, 0x22, 0x02, 0x03, 0x01, 0x1b, - 0x84, 0xaa, 0xd8, 0x0b, 0x02, 0x03, 0x01, 0x1c, 0x44, 0x50, 0x22, 0xf7, - 0xd8, 0x06, 0x00, 0x03, 0x02, 0x46, 0x49, 0xfd, 0xf1, 0x10, 0xc8, 0x4c, - 0x80, 0x27, 0x80, 0x06, 0x49, 0xff, 0xfe, 0x53, 0x80, 0xe0, 0xc0, 0x1f, - 0x02, 0x23, 0x00, 0xa1, 0x80, 0x06, 0x84, 0x24, 0x49, 0xfd, 0xe3, 0x5b, - 0x00, 0x03, 0x02, 0x5e, 0x44, 0x10, 0x00, 0x17, 0x10, 0x03, 0x02, 0x5f, - 0x80, 0x06, 0x49, 0xfd, 0x7a, 0xb6, 0x04, 0x13, 0x00, 0x92, 0x84, 0xa1, - 0xd9, 0x05, 0x00, 0x03, 0x02, 0x46, 0x49, 0xfd, 0xde, 0x20, 0x00, 0x13, - 0x01, 0x4e, 0x84, 0x00, 0x9c, 0x49, 0x10, 0x13, 0x01, 0x4e, 0xd5, 0x2a, - 0x00, 0x13, 0x02, 0x5e, 0x00, 0x03, 0x01, 0x4e, 0x10, 0x13, 0x02, 0x5f, - 0xe6, 0x05, 0xe8, 0x10, 0x02, 0x13, 0x00, 0xa1, 0x02, 0x33, 0x00, 0xa4, - 0x02, 0x43, 0x00, 0xa6, 0x80, 0x41, 0x80, 0x06, 0x49, 0xff, 0xff, 0x5b, - 0x80, 0x06, 0x49, 0xfd, 0xdd, 0x2a, 0x80, 0x07, 0xd5, 0x13, 0x10, 0x73, - 0x01, 0x4e, 0x3c, 0x2d, 0x58, 0x57, 0x84, 0x24, 0x80, 0x06, 0xdd, 0x22, - 0x80, 0x06, 0x80, 0x27, 0x44, 0x20, 0x00, 0x20, 0x49, 0xfd, 0xdd, 0xc9, - 0x44, 0x00, 0x00, 0x20, 0xd5, 0x03, 0x44, 0x00, 0x00, 0x24, 0xec, 0x0c, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x00, 0x50, - 0x02, 0x6a, 0x80, 0xc0, 0x96, 0x49, 0x96, 0x11, 0x96, 0xd9, 0x97, 0x21, - 0xc5, 0x05, 0xb4, 0x46, 0x44, 0x50, 0x00, 0x10, 0xda, 0x5e, 0x00, 0x53, - 0x02, 0x46, 0x3e, 0x2d, 0x94, 0xdc, 0x38, 0x21, 0x16, 0x02, 0x42, 0x21, - 0x74, 0x0b, 0xca, 0x55, 0x20, 0x23, 0x01, 0xa8, 0x4e, 0x25, 0x00, 0x05, - 0x44, 0x00, 0x00, 0x1a, 0xd5, 0x52, 0xb4, 0x46, 0x84, 0xa1, 0xda, 0x4e, - 0x02, 0x23, 0x01, 0x0d, 0x84, 0xa7, 0xd2, 0x4a, 0x02, 0x23, 0x01, 0x19, - 0x54, 0x21, 0x00, 0x04, 0xc2, 0x45, 0x00, 0x23, 0x01, 0x4e, 0xca, 0x42, - 0x44, 0x20, 0xff, 0xfe, 0x02, 0x53, 0x01, 0x13, 0x40, 0x00, 0x08, 0x02, - 0x40, 0x70, 0x88, 0x02, 0x12, 0x73, 0x00, 0xa3, 0x12, 0x03, 0x00, 0xa2, - 0xc5, 0x09, 0xe2, 0xa7, 0xe8, 0x07, 0xe2, 0xa0, 0xe8, 0x04, 0x44, 0x00, - 0x00, 0x12, 0xd5, 0x2f, 0x80, 0xe0, 0x00, 0x13, 0x02, 0x46, 0x9e, 0x49, - 0x94, 0x4c, 0x40, 0x10, 0x04, 0x07, 0x40, 0x03, 0x84, 0x1b, 0x84, 0x20, - 0x10, 0x13, 0x01, 0x4e, 0x80, 0x40, 0x80, 0x27, 0x80, 0x06, 0x49, 0xff, - 0xfe, 0xee, 0x81, 0x00, 0xc0, 0x04, 0x44, 0x00, 0x00, 0x20, 0xd5, 0x19, - 0x3c, 0x2d, 0x58, 0x57, 0x84, 0x24, 0x80, 0x06, 0xdd, 0x22, 0x80, 0x06, - 0x80, 0x47, 0x84, 0x24, 0x49, 0xfd, 0xe2, 0xb5, 0x00, 0x53, 0x02, 0x48, - 0x80, 0x06, 0x10, 0x53, 0x02, 0x5f, 0x49, 0xfd, 0xdc, 0xaa, 0x92, 0x00, - 0x80, 0x08, 0xd5, 0x05, 0x44, 0x00, 0x00, 0x32, 0xd5, 0x02, 0x84, 0x0c, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x01, 0x49, 0xfc, 0xd7, 0x1a, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x2e, 0x25, 0x6b, 0x3a, 0x2e, 0x15, - 0x6b, 0x3b, 0x80, 0xc0, 0x98, 0x11, 0x96, 0x00, 0x84, 0xa1, 0xd8, 0x23, - 0x84, 0x00, 0x49, 0xfd, 0xf0, 0x4c, 0x80, 0x20, 0xc0, 0x1e, 0x00, 0x00, - 0x00, 0x42, 0xe6, 0x07, 0xe8, 0x1a, 0x00, 0x00, 0x80, 0x4d, 0xc8, 0x17, - 0x00, 0x00, 0x80, 0x48, 0x00, 0x33, 0x02, 0x46, 0x4c, 0x30, 0x00, 0x12, - 0x3c, 0x1d, 0x6c, 0xfc, 0x44, 0x20, 0x00, 0x44, 0x80, 0x81, 0x42, 0x40, - 0x08, 0x73, 0xa0, 0x21, 0x84, 0xa2, 0xd8, 0x07, 0x42, 0x11, 0x88, 0x73, - 0xa1, 0x49, 0xd8, 0x03, 0x84, 0x03, 0xd5, 0x04, 0x80, 0x06, 0x49, 0xfd, - 0xbc, 0x8e, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xbc, 0x80, 0xe0, 0x97, 0x88, 0xa0, 0x7e, 0xc9, 0x0f, - 0x2e, 0x05, 0xb3, 0xd8, 0x96, 0x44, 0xc1, 0x03, 0x84, 0xa3, 0xd6, 0x19, - 0x54, 0x00, 0x00, 0x02, 0xc0, 0x03, 0x84, 0xa5, 0xd6, 0x14, 0x84, 0xa1, - 0xde, 0x3c, 0xd5, 0x11, 0x2e, 0x05, 0xb3, 0xdc, 0x54, 0x00, 0x04, 0x80, - 0xc0, 0x03, 0x84, 0xa3, 0xd6, 0x0a, 0x2e, 0x05, 0xb3, 0xdd, 0x54, 0x00, - 0x05, 0x01, 0xc0, 0x03, 0x84, 0xa5, 0xd6, 0x03, 0x84, 0xa1, 0xde, 0x2b, - 0x2e, 0x15, 0x6b, 0x3b, 0x2e, 0x45, 0x6b, 0x3a, 0x84, 0x03, 0x99, 0x21, - 0x97, 0x20, 0x44, 0x10, 0x00, 0x10, 0x44, 0x20, 0x10, 0x95, 0x80, 0x66, - 0x49, 0xfe, 0x9a, 0xdf, 0x2e, 0x05, 0xb5, 0x3a, 0x54, 0x00, 0x00, 0x02, - 0xc8, 0x0d, 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, - 0x96, 0x00, 0xc0, 0x2c, 0xe6, 0xc2, 0xe9, 0x2a, 0x44, 0x60, 0x00, 0x24, - 0xd5, 0x0e, 0x3c, 0x1d, 0x58, 0x5a, 0x80, 0x07, 0xdd, 0x21, 0x54, 0x80, - 0x00, 0xff, 0xe3, 0x06, 0xe8, 0x1f, 0x44, 0x60, 0x00, 0x24, 0xd5, 0x04, - 0x44, 0x60, 0x00, 0x20, 0x85, 0x01, 0x44, 0x10, 0x00, 0x2e, 0x80, 0x46, - 0x80, 0x07, 0x49, 0xfd, 0x79, 0x42, 0x44, 0x50, 0x00, 0x24, 0xde, 0x06, - 0x10, 0x83, 0x82, 0x84, 0x80, 0x07, 0x80, 0x28, 0xd5, 0x04, 0x00, 0x13, - 0x82, 0x84, 0x80, 0x07, 0x49, 0xfd, 0xe5, 0x9b, 0x84, 0x00, 0xec, 0x44, - 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x84, 0x63, 0x10, 0x63, 0x82, 0x84, - 0x00, 0x03, 0x82, 0x46, 0x12, 0x3f, 0x80, 0x0e, 0x44, 0x30, 0x00, 0x2e, - 0x12, 0x3f, 0x80, 0x05, 0x80, 0x3f, 0x00, 0x73, 0x82, 0x5f, 0x10, 0x7f, - 0x80, 0x08, 0x49, 0xfd, 0x77, 0xb2, 0x92, 0x00, 0xd5, 0xe8, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x00, 0x30, 0x01, 0x4e, 0x80, 0x40, 0xa6, 0x48, - 0xc3, 0x08, 0x00, 0x00, 0x02, 0x5f, 0x10, 0x01, 0x02, 0x5e, 0x44, 0x00, - 0x00, 0x2a, 0xd5, 0x0a, 0x04, 0x30, 0x00, 0x92, 0x56, 0x31, 0x80, 0x01, - 0x10, 0x30, 0x02, 0x5f, 0x49, 0xff, 0xff, 0x6d, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, - 0x00, 0x90, 0x02, 0x46, 0x50, 0x60, 0x01, 0x64, 0x3e, 0x0d, 0x27, 0x54, - 0x38, 0x00, 0x24, 0x00, 0x80, 0xe1, 0x84, 0x21, 0x4c, 0x00, 0xc0, 0x08, - 0x40, 0x94, 0x94, 0x08, 0x3e, 0x0d, 0x26, 0x54, 0x89, 0x20, 0xd5, 0x03, - 0x50, 0x93, 0x7f, 0xcc, 0x9c, 0x3b, 0x02, 0x84, 0x80, 0x09, 0x49, 0xfe, - 0x0d, 0x56, 0x81, 0x40, 0x9c, 0x39, 0x49, 0xfe, 0x0d, 0x40, 0x83, 0x80, - 0x02, 0x03, 0x00, 0x61, 0xa7, 0xf8, 0xc0, 0x08, 0x42, 0x13, 0xa0, 0x24, - 0xe2, 0x01, 0xe8, 0x04, 0x44, 0x00, 0x00, 0x1e, 0xd5, 0x3c, 0x00, 0x03, - 0x00, 0xe2, 0x84, 0x20, 0x89, 0x4a, 0x49, 0xfe, 0x1f, 0x46, 0x80, 0x2a, - 0x49, 0xfe, 0x8e, 0xcf, 0xc8, 0x04, 0x44, 0x00, 0x00, 0x28, 0xd5, 0x2f, - 0x02, 0x23, 0x7f, 0xfd, 0xe2, 0x5c, 0xe8, 0x04, 0x13, 0xc3, 0x7f, 0xfe, - 0xd5, 0x0b, 0x02, 0x04, 0x80, 0x09, 0x98, 0x00, 0xe0, 0x40, 0xe8, 0x04, - 0x12, 0x03, 0x7f, 0xfe, 0xd5, 0x03, 0x12, 0x23, 0x7f, 0xfe, 0xa6, 0xb6, - 0xaf, 0xf7, 0xe2, 0x47, 0xe8, 0x09, 0x40, 0x03, 0x88, 0xf7, 0x42, 0x21, - 0x20, 0x24, 0x42, 0x21, 0x00, 0x24, 0xac, 0xb2, 0xd5, 0x04, 0x42, 0x73, - 0xa0, 0x24, 0xad, 0xf2, 0x04, 0x13, 0x00, 0x39, 0xc1, 0x07, 0x80, 0x0a, - 0x84, 0x21, 0x49, 0xfe, 0x8e, 0x4c, 0x14, 0x03, 0x7f, 0xfc, 0x00, 0x03, - 0x00, 0xe2, 0x49, 0xfd, 0xba, 0xa2, 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, - 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xbc, - 0x50, 0x60, 0x01, 0x5c, 0x02, 0x00, 0x01, 0x0d, 0x83, 0x81, 0x44, 0x10, - 0x7f, 0x15, 0x4c, 0x00, 0xc0, 0x0e, 0x04, 0x23, 0x00, 0x3b, 0xca, 0x0a, - 0x00, 0x53, 0x01, 0x03, 0x00, 0x03, 0x01, 0x02, 0xd0, 0x05, 0x44, 0x00, - 0x00, 0x23, 0x48, 0x00, 0x00, 0xe6, 0x04, 0x33, 0x7f, 0xa9, 0x84, 0xa4, - 0xd3, 0x05, 0x44, 0x00, 0x00, 0x24, 0x48, 0x00, 0x00, 0xde, 0x00, 0x83, - 0x00, 0xea, 0x3e, 0x0d, 0x27, 0x54, 0x38, 0x00, 0x20, 0x00, 0x84, 0xa1, - 0xd8, 0x07, 0x40, 0x84, 0x14, 0x08, 0x3e, 0x2d, 0x26, 0x54, 0x89, 0x02, - 0xd5, 0x03, 0x50, 0x83, 0x7f, 0xd4, 0x50, 0x03, 0x00, 0x1d, 0x02, 0x74, - 0x00, 0x09, 0x49, 0xfe, 0x0b, 0x0c, 0x50, 0x0e, 0x00, 0x03, 0x49, 0xfe, - 0x0c, 0xcc, 0x40, 0xa0, 0x00, 0x00, 0x50, 0x0e, 0x00, 0x01, 0x49, 0xfe, - 0x0c, 0xb4, 0x81, 0x20, 0x00, 0x03, 0x00, 0xea, 0x84, 0x20, 0x01, 0xce, - 0x00, 0x00, 0x49, 0xfe, 0x1e, 0xc4, 0x80, 0x2a, 0x49, 0xfe, 0x8e, 0x4d, - 0x02, 0x13, 0x00, 0x65, 0xc1, 0x09, 0x42, 0x2e, 0x1c, 0x24, 0xe2, 0x22, - 0xe8, 0x05, 0x44, 0x00, 0x00, 0x1e, 0x48, 0x00, 0x00, 0xa8, 0x04, 0x33, - 0x00, 0x3b, 0x84, 0xa1, 0x5c, 0x10, 0x00, 0x01, 0xdb, 0x0b, 0xc8, 0x0a, - 0x3c, 0x0d, 0x5b, 0x1a, 0x54, 0x00, 0x00, 0x04, 0xc8, 0x05, 0x44, 0x00, - 0x00, 0x28, 0x48, 0x00, 0x00, 0x98, 0x00, 0x33, 0x01, 0x02, 0x04, 0x03, - 0x00, 0x3b, 0x11, 0xc3, 0x00, 0x0f, 0x10, 0x33, 0x01, 0x03, 0xc0, 0x07, - 0xc1, 0x18, 0x3c, 0x0d, 0x5b, 0x1a, 0x54, 0x00, 0x00, 0x04, 0xc0, 0x13, - 0xa0, 0x36, 0x9e, 0x02, 0xe6, 0x02, 0xe8, 0x09, 0x00, 0x13, 0x00, 0x11, - 0x04, 0x04, 0x00, 0x02, 0x42, 0x13, 0x84, 0x24, 0x98, 0x49, 0xd5, 0x04, - 0x04, 0x04, 0x00, 0x02, 0x94, 0x7b, 0x49, 0xfe, 0x8d, 0xb0, 0xd5, 0x05, - 0x80, 0x0a, 0x84, 0x21, 0x49, 0xfe, 0x8d, 0xb5, 0x14, 0x03, 0x7f, 0xfe, - 0x00, 0x03, 0x00, 0x13, 0xc0, 0x1c, 0xa4, 0x35, 0x80, 0x27, 0x40, 0x00, - 0x1c, 0x57, 0x96, 0x00, 0x49, 0xff, 0xcd, 0x15, 0x10, 0x03, 0x00, 0x0e, - 0xc8, 0x05, 0x2e, 0x05, 0x6a, 0x7e, 0x10, 0x03, 0x00, 0x0e, 0xa4, 0x31, - 0xe2, 0x09, 0xe8, 0x02, 0xd5, 0x19, 0x02, 0x14, 0x00, 0x09, 0x98, 0x49, - 0xe0, 0x01, 0xe8, 0x03, 0xac, 0x72, 0xd5, 0x14, 0xac, 0x32, 0xd5, 0x12, - 0x2e, 0x05, 0x6a, 0x7e, 0x42, 0x10, 0x1c, 0x24, 0x10, 0x03, 0x00, 0x0e, - 0xac, 0x75, 0x2e, 0x05, 0x6a, 0x7f, 0x12, 0x93, 0x00, 0x01, 0xac, 0x30, - 0x84, 0x01, 0x10, 0x03, 0x00, 0x14, 0x12, 0x93, 0x00, 0x02, 0x00, 0x33, - 0x00, 0x0e, 0x00, 0x23, 0x00, 0x0f, 0xe2, 0x62, 0xe8, 0x08, 0x40, 0x01, - 0x0c, 0x57, 0x42, 0x71, 0x9c, 0x24, 0x42, 0x23, 0x80, 0x24, 0xd5, 0x07, - 0x40, 0x01, 0x0c, 0x77, 0x42, 0x21, 0x1c, 0x24, 0x42, 0x21, 0x00, 0x24, - 0x00, 0x13, 0x00, 0x0e, 0xac, 0xb6, 0x10, 0x1f, 0x80, 0x2c, 0x80, 0xff, - 0xa4, 0xb0, 0x12, 0x2f, 0x80, 0x13, 0x04, 0x33, 0x00, 0x3b, 0xcb, 0x09, - 0x04, 0x03, 0x7f, 0xfe, 0x84, 0x21, 0x49, 0xfe, 0x8d, 0x5c, 0x92, 0x01, - 0xf0, 0x8a, 0xd5, 0x04, 0x93, 0x41, 0x14, 0xaf, 0x80, 0x0a, 0x00, 0x13, - 0x00, 0xea, 0xf3, 0x0a, 0x3e, 0x0d, 0x94, 0xb8, 0x38, 0x30, 0x06, 0x0a, - 0x44, 0x30, 0x7f, 0x16, 0x00, 0x03, 0x00, 0xea, 0x12, 0x3f, 0x80, 0x0e, - 0x80, 0x3f, 0x00, 0x63, 0x01, 0x03, 0x10, 0x6f, 0x80, 0x08, 0x49, 0xfd, - 0x77, 0xe2, 0x92, 0x00, 0x84, 0x00, 0xec, 0x44, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xc0, 0x00, 0x80, 0x02, 0x46, - 0x80, 0xc0, 0x3e, 0x0d, 0x27, 0x54, 0x38, 0x00, 0x20, 0x00, 0x84, 0xa1, - 0xd8, 0x07, 0x40, 0x84, 0x14, 0x08, 0x3e, 0x2d, 0x26, 0x54, 0x89, 0x02, - 0xd5, 0x03, 0x50, 0x83, 0x01, 0x30, 0x50, 0x03, 0x01, 0x79, 0x02, 0x74, - 0x00, 0x09, 0x49, 0xfe, 0x0a, 0x28, 0x02, 0x03, 0x00, 0xb3, 0x80, 0x27, - 0x40, 0x00, 0x1c, 0x57, 0x96, 0x00, 0x49, 0xff, 0xcc, 0x8a, 0x04, 0x13, - 0x00, 0x5d, 0x10, 0x03, 0x01, 0x6a, 0x9e, 0x0a, 0xe6, 0x02, 0xe8, 0x09, - 0x00, 0x13, 0x01, 0x6d, 0x04, 0x04, 0x00, 0x02, 0x42, 0x13, 0x84, 0x24, - 0x98, 0x49, 0xd5, 0x04, 0x04, 0x04, 0x00, 0x02, 0x94, 0x7b, 0x49, 0xfe, - 0x8d, 0x00, 0x14, 0x03, 0x00, 0x55, 0x00, 0x23, 0x01, 0x6a, 0x04, 0x03, - 0x00, 0x55, 0x10, 0x2f, 0x80, 0x2c, 0x84, 0x21, 0x02, 0x23, 0x00, 0xae, - 0x80, 0xff, 0x12, 0x2f, 0x80, 0x13, 0x49, 0xfe, 0x8c, 0xf6, 0x40, 0x20, - 0x04, 0x09, 0x00, 0x03, 0x02, 0x46, 0xf2, 0x8a, 0x44, 0x20, 0x7f, 0x15, - 0x12, 0x2f, 0x80, 0x0e, 0x80, 0x3f, 0x00, 0x63, 0x02, 0x5f, 0x10, 0x6f, - 0x80, 0x08, 0x49, 0xfd, 0x77, 0x86, 0xec, 0x40, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x00, 0x40, 0x01, 0xad, - 0x96, 0x49, 0x54, 0x42, 0x00, 0x02, 0x96, 0x91, 0x96, 0xd9, 0xcc, 0x04, - 0x44, 0x00, 0x00, 0x1a, 0xd5, 0x67, 0xb4, 0x80, 0x84, 0xa1, 0xd4, 0x03, - 0x84, 0xa4, 0xdc, 0x5f, 0x02, 0x40, 0x01, 0x0d, 0x84, 0xa7, 0xd4, 0x5b, - 0x02, 0x40, 0x01, 0x19, 0x54, 0x42, 0x00, 0x04, 0xc4, 0x56, 0x02, 0x40, - 0x01, 0x13, 0x44, 0x50, 0xff, 0xfe, 0x40, 0x10, 0x94, 0x02, 0xc4, 0x06, - 0xe2, 0x81, 0xe8, 0x04, 0x44, 0x00, 0x00, 0x12, 0xd5, 0x4d, 0x44, 0x40, - 0xff, 0xfe, 0x40, 0x21, 0x10, 0x02, 0x40, 0x31, 0x90, 0x02, 0xc9, 0x0f, - 0xca, 0x0e, 0xcb, 0x0d, 0x84, 0x41, 0x10, 0x10, 0x01, 0x6f, 0x10, 0x20, - 0x01, 0x70, 0x12, 0x10, 0x00, 0xb3, 0x12, 0x10, 0x00, 0xae, 0x12, 0x10, - 0x00, 0xaf, 0xd5, 0x1e, 0x00, 0x40, 0x01, 0x6f, 0xc4, 0x0a, 0x02, 0x50, - 0x00, 0xb3, 0xd9, 0x07, 0x02, 0x50, 0x00, 0xae, 0xda, 0x04, 0x02, 0x50, - 0x00, 0xaf, 0xd3, 0x0f, 0x84, 0x81, 0x12, 0x10, 0x00, 0xb3, 0x12, 0x20, - 0x00, 0xae, 0x12, 0x30, 0x00, 0xb0, 0x10, 0x40, 0x01, 0x70, 0x12, 0x30, - 0x00, 0xaf, 0x10, 0x40, 0x01, 0x6f, 0xd5, 0x04, 0x84, 0x20, 0x10, 0x10, - 0x01, 0x70, 0xb4, 0x20, 0x54, 0x10, 0x80, 0x04, 0xc1, 0x16, 0x04, 0x50, - 0x00, 0x4c, 0xc5, 0x13, 0x00, 0x10, 0x01, 0x70, 0xc1, 0x10, 0x02, 0x20, - 0x00, 0xb3, 0x02, 0x10, 0x00, 0xa1, 0xe2, 0x41, 0xe9, 0x0a, 0x00, 0x10, - 0x02, 0x48, 0x10, 0x10, 0x02, 0x5f, 0x49, 0xff, 0xff, 0x38, 0xd5, 0x03, - 0x84, 0x0c, 0xd5, 0x02, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0xc0, 0x11, 0x02, 0x30, - 0x00, 0xb3, 0x02, 0x20, 0x00, 0xa1, 0x84, 0x80, 0x10, 0x40, 0x01, 0x79, - 0xe2, 0x62, 0xe9, 0x08, 0x00, 0x20, 0x02, 0x48, 0x10, 0x20, 0x02, 0x5f, - 0x49, 0xff, 0xff, 0x1d, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x50, 0x60, 0x02, 0x2c, - 0x00, 0x70, 0x02, 0x46, 0xb4, 0x00, 0x44, 0x50, 0x00, 0x10, 0x4c, 0x02, - 0x81, 0x4d, 0x3c, 0x02, 0xcd, 0xda, 0x84, 0xa1, 0xd8, 0x1f, 0x00, 0x03, - 0x00, 0x5e, 0xc0, 0x1c, 0x50, 0x03, 0x00, 0x5e, 0x49, 0xfe, 0x09, 0x41, - 0x3c, 0x0d, 0x58, 0x72, 0x42, 0x00, 0x5c, 0x0b, 0xc0, 0x0b, 0x50, 0x83, - 0x00, 0x14, 0x80, 0x08, 0x84, 0x20, 0x49, 0xfd, 0x40, 0xa2, 0x80, 0x08, - 0x84, 0x22, 0x84, 0x40, 0xd5, 0x07, 0xa0, 0xb7, 0xca, 0x07, 0x04, 0x13, - 0x7f, 0xbf, 0x50, 0x03, 0x00, 0x14, 0x49, 0xfd, 0x56, 0xfc, 0x00, 0x03, - 0x00, 0x2e, 0x84, 0xa3, 0xd8, 0x13, 0x00, 0x03, 0x00, 0x5e, 0xc0, 0x09, - 0x50, 0x03, 0x00, 0x5e, 0x49, 0xfe, 0x09, 0x1f, 0x50, 0x03, 0x7d, 0xd4, - 0x49, 0xfd, 0x72, 0x75, 0x04, 0x13, 0x7f, 0xbf, 0x50, 0x03, 0x7d, 0xd4, - 0x49, 0xfd, 0x40, 0x11, 0xd5, 0x53, 0x00, 0x03, 0x00, 0x2d, 0x84, 0xa1, - 0xd0, 0x23, 0x3c, 0x8d, 0x5b, 0x18, 0x4e, 0x83, 0x00, 0x4c, 0x3c, 0x1d, - 0x58, 0x72, 0x42, 0x10, 0xd4, 0x0b, 0xc1, 0x0d, 0x50, 0x93, 0x00, 0x14, - 0x80, 0x28, 0x80, 0x09, 0x49, 0xfd, 0x40, 0x83, 0x50, 0x03, 0x7d, 0xd4, - 0x80, 0x49, 0x80, 0x68, 0x84, 0x22, 0xd5, 0x0b, 0x84, 0xa2, 0xd8, 0x38, - 0x04, 0x13, 0x7f, 0xbf, 0x00, 0x33, 0x7d, 0xf4, 0x50, 0x03, 0x7d, 0xd4, - 0x50, 0x23, 0x00, 0x14, 0x49, 0xfd, 0x3f, 0x4b, 0xd5, 0x2d, 0x04, 0x83, - 0x00, 0x07, 0x4e, 0x83, 0x00, 0x2a, 0x3c, 0x0d, 0x58, 0x72, 0x42, 0x00, - 0x5c, 0x0b, 0xc0, 0x0b, 0x50, 0x93, 0x00, 0x14, 0x80, 0x28, 0x80, 0x09, - 0x49, 0xfd, 0x40, 0x4b, 0x80, 0x09, 0x80, 0x48, 0x84, 0x22, 0xd5, 0x10, - 0x00, 0x13, 0x00, 0x5e, 0xc9, 0x08, 0x2e, 0x05, 0x9b, 0x68, 0xc0, 0x05, - 0x50, 0x03, 0x00, 0x14, 0x80, 0x41, 0xd5, 0x06, 0x50, 0x03, 0x00, 0x14, - 0x44, 0x10, 0x00, 0x13, 0x84, 0x40, 0x49, 0xfd, 0x56, 0x9c, 0x46, 0x00, - 0x08, 0x00, 0x49, 0xfd, 0xfe, 0x26, 0x46, 0x00, 0x04, 0x00, 0x49, 0xfd, - 0xfe, 0x22, 0x80, 0x07, 0x49, 0xfc, 0xfa, 0x37, 0xa0, 0x37, 0xc8, 0x20, - 0x3c, 0x0d, 0x6c, 0xfc, 0x00, 0x33, 0x00, 0x1a, 0x44, 0x20, 0x00, 0x44, - 0x80, 0x20, 0x42, 0x11, 0x88, 0x73, 0x80, 0x61, 0x04, 0x31, 0x80, 0x0e, - 0x00, 0x41, 0x81, 0x4c, 0x84, 0x61, 0x2e, 0x55, 0x24, 0x96, 0x40, 0x31, - 0x90, 0x0c, 0x40, 0x31, 0x8c, 0x05, 0x40, 0x31, 0x94, 0x02, 0x3e, 0x35, - 0x24, 0x96, 0x00, 0x13, 0x00, 0x1a, 0x42, 0x00, 0x88, 0x73, 0x49, 0xfe, - 0x59, 0x1c, 0xa0, 0xb7, 0x84, 0xa1, 0xda, 0x09, 0x44, 0x00, 0x04, 0x00, - 0x49, 0xfd, 0xfd, 0xf7, 0x50, 0x03, 0x7d, 0xd4, 0x49, 0xfe, 0x0c, 0xf3, - 0x84, 0x08, 0x49, 0xfd, 0xfd, 0xf0, 0x3c, 0x1d, 0x58, 0x89, 0x50, 0x03, - 0x7d, 0xd4, 0xdd, 0x21, 0xa0, 0x37, 0x49, 0xfd, 0xfa, 0xfc, 0x00, 0x13, - 0x00, 0x1a, 0x3e, 0x0d, 0x94, 0xdc, 0x38, 0x00, 0x06, 0x02, 0x42, 0x00, - 0x70, 0x0b, 0xc0, 0x05, 0x46, 0x01, 0x00, 0x00, 0x49, 0xfd, 0xfd, 0xdb, - 0x00, 0x13, 0x00, 0x1a, 0x3e, 0x0d, 0x94, 0xdc, 0x38, 0x00, 0x06, 0x02, - 0x42, 0x00, 0x74, 0x0b, 0xc0, 0x05, 0x46, 0x02, 0x00, 0x00, 0x49, 0xfd, - 0xfd, 0xce, 0x00, 0x13, 0x00, 0x1a, 0x3e, 0x0d, 0x94, 0xdc, 0x38, 0x00, - 0x06, 0x02, 0x42, 0x00, 0x78, 0x0b, 0xc0, 0x05, 0x46, 0x04, 0x00, 0x00, - 0x49, 0xfd, 0xfd, 0xc1, 0x00, 0x13, 0x00, 0x1a, 0x3e, 0x0d, 0x94, 0xdc, - 0x38, 0x30, 0x06, 0x02, 0x46, 0x48, 0xff, 0xff, 0x2e, 0x25, 0x9b, 0xcd, - 0x58, 0x42, 0x0f, 0xff, 0x40, 0x31, 0x90, 0x02, 0x38, 0x30, 0x06, 0x0a, - 0xca, 0x23, 0x44, 0x00, 0x00, 0x80, 0x49, 0xfd, 0xfd, 0xac, 0x3c, 0x2d, - 0x58, 0x72, 0x46, 0x38, 0xff, 0xff, 0x58, 0x31, 0x8f, 0xff, 0x40, 0x21, - 0x0c, 0x02, 0x3c, 0x2f, 0x58, 0x72, 0x44, 0x00, 0x02, 0x00, 0x49, 0xfd, - 0xfd, 0x9e, 0x3c, 0x0d, 0x60, 0x93, 0x84, 0xa3, 0xd8, 0x0a, 0x2e, 0x15, - 0xb6, 0x17, 0x2e, 0x05, 0xb6, 0x16, 0x98, 0x01, 0x96, 0x00, 0xc8, 0x03, - 0x49, 0xff, 0xe0, 0x19, 0x3c, 0x0d, 0x59, 0xb8, 0xdd, 0x20, 0x00, 0x03, - 0x00, 0x44, 0x84, 0xa2, 0xd8, 0x07, 0x84, 0x41, 0x3e, 0x25, 0x9b, 0xcc, - 0x94, 0x15, 0x49, 0xfd, 0xfd, 0x84, 0x00, 0x03, 0x00, 0x3e, 0xc0, 0x05, - 0x44, 0x00, 0x02, 0x00, 0x49, 0xfd, 0xfd, 0x7d, 0x3c, 0x0d, 0x6c, 0xfc, - 0x44, 0x10, 0x00, 0x44, 0x42, 0x03, 0x84, 0x73, 0x3c, 0x1d, 0x58, 0x6d, - 0xdd, 0x21, 0x3c, 0x2d, 0x52, 0xc7, 0x80, 0x27, 0x84, 0x0a, 0xdd, 0x22, - 0x84, 0x20, 0x80, 0x07, 0x49, 0xfd, 0xb8, 0x73, 0x50, 0x03, 0x7d, 0xd4, - 0x49, 0xfd, 0xb4, 0x2d, 0x3c, 0x2d, 0x59, 0x0d, 0x44, 0x10, 0x00, 0x61, - 0x84, 0x00, 0xdd, 0x22, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x3c, 0x1d, 0x60, 0x93, - 0x84, 0xa3, 0xd9, 0x60, 0x84, 0xe0, 0x3c, 0x7f, 0x60, 0x93, 0x2f, 0xc4, - 0xa2, 0x9c, 0x84, 0xc1, 0x44, 0x90, 0x00, 0x13, 0xd5, 0x0e, 0x49, 0xfd, - 0xb3, 0x98, 0xc0, 0x09, 0xb4, 0x60, 0x44, 0x50, 0x00, 0x10, 0xd3, 0x05, - 0x14, 0x90, 0x00, 0x4a, 0x49, 0xff, 0xfe, 0x8b, 0x9d, 0xb1, 0x97, 0xb0, - 0x9d, 0xf9, 0x80, 0x07, 0xe2, 0xdc, 0xe9, 0xf0, 0x2e, 0x14, 0xa2, 0x9f, - 0x2e, 0x84, 0xa2, 0x9e, 0x50, 0x6f, 0x80, 0x0c, 0x40, 0x04, 0x04, 0x00, - 0x96, 0x00, 0xf0, 0x81, 0x45, 0xc0, 0x05, 0xec, 0xd5, 0x2a, 0x49, 0xfe, - 0xb7, 0xb8, 0x80, 0xe0, 0xc0, 0x23, 0xb4, 0x00, 0x54, 0x00, 0x00, 0x02, - 0xc0, 0x1f, 0x80, 0x06, 0x49, 0xfa, 0xde, 0x83, 0x3c, 0x5d, 0x5b, 0x22, - 0xdf, 0x11, 0xb4, 0x07, 0x81, 0x27, 0x44, 0x30, 0x00, 0x13, 0x58, 0x00, - 0x01, 0x00, 0x10, 0x33, 0x81, 0x3d, 0x1c, 0x04, 0x80, 0x4e, 0xf0, 0x03, - 0xdd, 0x3c, 0x80, 0x09, 0x49, 0xfe, 0x07, 0xb1, 0xd5, 0x09, 0xf0, 0x03, - 0xdd, 0x3c, 0x3c, 0x2d, 0x53, 0xb5, 0x80, 0x07, 0x44, 0x10, 0x00, 0x13, - 0xdd, 0x22, 0x8d, 0x01, 0x54, 0x84, 0x00, 0xff, 0xf2, 0x01, 0x80, 0x08, - 0xe3, 0x02, 0xe9, 0xd4, 0x2e, 0x15, 0x80, 0xa0, 0xc9, 0x05, 0x84, 0x08, - 0x49, 0xfd, 0x18, 0x77, 0xd5, 0x05, 0x49, 0xfe, 0xb5, 0x22, 0x49, 0xff, - 0xcb, 0xa0, 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xac, 0x00, 0x30, 0x02, 0x46, 0x3e, 0x2d, 0x94, 0xdc, - 0x38, 0x31, 0x0e, 0x02, 0x80, 0xe1, 0x42, 0x11, 0xf4, 0x0b, 0x80, 0xc0, - 0xc1, 0x0c, 0x04, 0x40, 0x00, 0x09, 0x44, 0x10, 0x00, 0x35, 0x4c, 0x40, - 0x80, 0x04, 0x49, 0xfd, 0x7a, 0xa6, 0x14, 0x73, 0x00, 0x09, 0xd5, 0x51, - 0x46, 0x21, 0x00, 0x00, 0x40, 0x31, 0x88, 0x02, 0xc3, 0x29, 0x00, 0x00, - 0x02, 0x64, 0x44, 0x40, 0x00, 0x33, 0x14, 0x73, 0x00, 0x09, 0x4c, 0x02, - 0x00, 0x13, 0x04, 0x23, 0x00, 0x92, 0x9e, 0x21, 0x10, 0x03, 0x02, 0x64, - 0xca, 0x0c, 0x44, 0x00, 0x1f, 0xa4, 0x46, 0x10, 0x00, 0xa4, 0x58, 0x10, - 0x89, 0xfc, 0x80, 0x66, 0x80, 0x82, 0x84, 0xa1, 0x49, 0xfe, 0x08, 0x01, - 0x00, 0x23, 0x02, 0x46, 0x3e, 0x1d, 0x94, 0xdc, 0x38, 0x30, 0x8a, 0x02, - 0x46, 0x02, 0x00, 0x00, 0x42, 0x31, 0xf4, 0x08, 0x38, 0x30, 0x8a, 0x0a, - 0x49, 0xfd, 0xfc, 0x81, 0xd5, 0x24, 0x12, 0x30, 0x01, 0x0d, 0x50, 0x13, - 0x02, 0x40, 0x50, 0x0f, 0x80, 0x04, 0xa8, 0x44, 0xb6, 0xe0, 0x3c, 0x4d, - 0x57, 0xeb, 0x00, 0x13, 0x02, 0x48, 0x80, 0x43, 0x10, 0x10, 0x00, 0x0b, - 0x80, 0x20, 0x44, 0x00, 0x00, 0x12, 0x80, 0xe3, 0xdd, 0x24, 0x46, 0x00, - 0x20, 0x1c, 0x2e, 0x15, 0x6a, 0x68, 0xc1, 0x0b, 0x00, 0x13, 0x02, 0x69, - 0xc9, 0x06, 0x80, 0x06, 0x84, 0x21, 0x49, 0xfd, 0xa3, 0xa6, 0xd5, 0x03, - 0x3e, 0x75, 0x6a, 0x68, 0xec, 0x54, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xd2, 0xc9, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xd1, 0x5f, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xd2, 0x43, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x50, 0x60, 0x00, 0x30, 0xa0, 0x04, - 0x84, 0x2d, 0xa7, 0xf1, 0x4c, 0x00, 0xc0, 0x12, 0x3c, 0x0d, 0x60, 0xed, - 0x54, 0x00, 0x00, 0x08, 0xc0, 0x51, 0x80, 0x07, 0x49, 0xfd, 0xb2, 0xa3, - 0xc0, 0x4d, 0x04, 0x00, 0x00, 0x92, 0xc8, 0x4a, 0x84, 0x21, 0xae, 0x72, - 0xae, 0x33, 0xd5, 0x47, 0x84, 0xaa, 0xd8, 0x44, 0x3c, 0x0d, 0x60, 0xed, - 0x54, 0x00, 0x00, 0x04, 0xc0, 0x3f, 0x00, 0x03, 0x00, 0x10, 0xc8, 0x3c, - 0x2e, 0x55, 0x24, 0x7c, 0x84, 0x23, 0xd1, 0x38, 0x44, 0x90, 0x00, 0x44, - 0x42, 0x93, 0xa4, 0x24, 0x3c, 0x0d, 0x6c, 0xfc, 0x88, 0x09, 0x04, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x01, 0x50, 0xc8, 0x1b, 0x80, 0x01, 0x80, 0x27, - 0x49, 0xfe, 0xac, 0x9f, 0xc0, 0x16, 0x2e, 0x14, 0xa2, 0x9c, 0x2e, 0x04, - 0xa2, 0x9f, 0x98, 0x49, 0x9c, 0x4b, 0x98, 0x41, 0x98, 0x01, 0x96, 0x00, - 0x80, 0x27, 0x49, 0xfe, 0xac, 0x92, 0xc8, 0x1a, 0x3c, 0x0d, 0x6c, 0xfc, - 0x89, 0x20, 0x04, 0x04, 0x80, 0x0e, 0x00, 0x00, 0x01, 0x46, 0xc0, 0x12, - 0x3c, 0x3d, 0x52, 0xcb, 0x84, 0x2e, 0x50, 0x03, 0x7f, 0xd0, 0x80, 0x47, - 0xdd, 0x23, 0xc8, 0x0a, 0xa6, 0x37, 0xaf, 0xf1, 0x14, 0x03, 0x7f, 0xfe, - 0x84, 0x0e, 0x14, 0x03, 0x7f, 0xf8, 0x84, 0x01, 0xd5, 0x02, 0x84, 0x00, - 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, - 0x81, 0x20, 0x3c, 0x0d, 0x65, 0x24, 0x97, 0x88, 0x84, 0xbf, 0x80, 0xe2, - 0xd8, 0x09, 0x80, 0x06, 0x84, 0x20, 0x49, 0xfe, 0x1a, 0x60, 0x3c, 0x0f, - 0x65, 0x24, 0x48, 0x00, 0x00, 0x7f, 0xb4, 0x02, 0x96, 0x04, 0xc8, 0x06, - 0x00, 0x01, 0x02, 0x6a, 0x84, 0x44, 0x4c, 0x01, 0x40, 0x77, 0xa0, 0x3c, - 0x8c, 0xb2, 0xd0, 0x73, 0x04, 0x04, 0x80, 0x0e, 0x00, 0x10, 0x01, 0x50, - 0xc9, 0x6e, 0x2e, 0x85, 0x83, 0xf0, 0x4c, 0x83, 0x40, 0x04, 0x81, 0x41, - 0xd5, 0x03, 0x40, 0xa0, 0xa0, 0x06, 0x84, 0x00, 0x49, 0xfe, 0xa4, 0xab, - 0x83, 0x80, 0x49, 0xff, 0xc9, 0x04, 0x3e, 0x1d, 0x83, 0xb0, 0x4c, 0x83, - 0x40, 0x09, 0x00, 0x30, 0x80, 0x30, 0xa0, 0x8f, 0x94, 0x5b, 0x98, 0x51, - 0xa6, 0x4a, 0xd5, 0x07, 0x00, 0x30, 0x80, 0x30, 0xa0, 0x8f, 0x94, 0x5b, - 0x98, 0x51, 0xa6, 0x4c, 0x40, 0x0e, 0x00, 0x01, 0x94, 0x04, 0x92, 0x04, - 0x92, 0x01, 0xe2, 0x20, 0xe8, 0x48, 0x3c, 0x0d, 0x60, 0xf0, 0x84, 0x2a, - 0x4c, 0x00, 0xc0, 0x44, 0x04, 0x04, 0x80, 0x0e, 0x84, 0x25, 0x00, 0x20, - 0x01, 0x4a, 0x42, 0x01, 0x04, 0x73, 0x00, 0x00, 0x01, 0x4e, 0xc0, 0x04, - 0xb4, 0x07, 0x96, 0x04, 0xc8, 0x36, 0x84, 0x03, 0x80, 0x26, 0x49, 0xfe, - 0xac, 0x16, 0xc0, 0x0e, 0x2e, 0x14, 0xa2, 0x9c, 0x2e, 0x04, 0xa2, 0x9f, - 0x98, 0x49, 0x9c, 0x4b, 0x98, 0x41, 0x98, 0x01, 0x96, 0x00, 0x80, 0x26, - 0x49, 0xfe, 0xac, 0x09, 0xc8, 0x1b, 0x3c, 0x0d, 0x6c, 0xfc, 0x44, 0x10, - 0x00, 0x44, 0x42, 0x03, 0x04, 0x73, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x01, 0x67, 0xc8, 0x10, 0x4e, 0xa2, 0x00, 0x18, 0x2e, 0x14, 0xa2, 0x9c, - 0x2e, 0x04, 0xa2, 0x9f, 0x98, 0x49, 0x9c, 0x4b, 0x98, 0x41, 0x98, 0x01, - 0x96, 0x00, 0x80, 0x28, 0x49, 0xfe, 0xab, 0xef, 0xc8, 0x0a, 0x84, 0x3f, - 0x3c, 0x1f, 0x65, 0x24, 0x3c, 0x3d, 0x52, 0xcc, 0x84, 0x00, 0x80, 0x20, - 0x80, 0x40, 0xdd, 0x23, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xbc, 0x96, 0x49, 0x96, 0x91, - 0x96, 0xd8, 0x97, 0x20, 0xf0, 0x85, 0xf1, 0x8f, 0xf2, 0x82, 0xf3, 0x89, - 0xf4, 0x86, 0x3e, 0x6c, 0xa2, 0x9c, 0xe6, 0x02, 0xe8, 0x11, 0xa7, 0x70, - 0xcd, 0x02, 0x84, 0xa1, 0xf0, 0x05, 0x97, 0x68, 0xf5, 0x83, 0xc0, 0x03, - 0x84, 0xc0, 0xd5, 0x03, 0x2e, 0x64, 0xa2, 0x9f, 0xf1, 0x03, 0x99, 0xb1, - 0x97, 0xb0, 0xf6, 0x8e, 0xd5, 0x0f, 0xa7, 0x70, 0xa7, 0xb3, 0xf6, 0x83, - 0xcd, 0x02, 0x84, 0xa1, 0xf3, 0x03, 0xf0, 0x09, 0x99, 0x5d, 0x97, 0x68, - 0xf5, 0x8e, 0x49, 0xff, 0xc7, 0xbe, 0x96, 0x00, 0xf0, 0x89, 0xf3, 0x03, - 0x44, 0x8f, 0xfe, 0x9c, 0x3e, 0x1f, 0x1b, 0x18, 0x84, 0x00, 0x52, 0x71, - 0x80, 0x00, 0x42, 0x81, 0xa0, 0x24, 0xf0, 0x87, 0xf1, 0x81, 0x50, 0x00, - 0x80, 0x10, 0x97, 0xf8, 0x84, 0x20, 0x14, 0x8f, 0x80, 0x0b, 0xf7, 0x8a, - 0xf0, 0x88, 0xf1, 0x84, 0x48, 0x00, 0x01, 0xb8, 0xf3, 0x05, 0x84, 0xa1, - 0xd3, 0x07, 0xc3, 0x5a, 0x84, 0xa2, 0x4c, 0x32, 0xc1, 0xb6, 0x48, 0x00, - 0x00, 0xa6, 0xf3, 0x04, 0x4e, 0x33, 0x01, 0xb1, 0x3c, 0x2d, 0x65, 0x5f, - 0xe6, 0x42, 0x4e, 0xf3, 0x01, 0x8f, 0x2e, 0x05, 0x95, 0xbe, 0x4e, 0x02, - 0x01, 0x8b, 0xf1, 0x02, 0x4e, 0x12, 0x01, 0x88, 0x2e, 0x35, 0x95, 0xc4, - 0x3c, 0x6d, 0x6c, 0xfc, 0x3c, 0x7d, 0x65, 0x60, 0x44, 0x00, 0x00, 0x44, - 0x42, 0x61, 0x80, 0x73, 0x84, 0xa1, 0xa0, 0x71, 0xd9, 0x13, 0x02, 0x03, - 0x00, 0x14, 0x49, 0xfe, 0x26, 0xc0, 0x99, 0x00, 0x44, 0x30, 0x02, 0x71, - 0x40, 0x82, 0x0c, 0x77, 0xa0, 0xb5, 0x84, 0x84, 0x9b, 0x7a, 0x84, 0xe0, - 0x40, 0x72, 0x00, 0x1b, 0x40, 0x02, 0xa0, 0x01, 0x99, 0xc7, 0x2f, 0xc5, - 0x95, 0xbe, 0xf1, 0x06, 0x80, 0x07, 0x80, 0x5c, 0x49, 0xfe, 0x88, 0xed, - 0x81, 0x40, 0x3e, 0x0d, 0x95, 0x7c, 0x04, 0x50, 0x00, 0x09, 0x04, 0x40, - 0x00, 0x0a, 0x46, 0x10, 0x00, 0x96, 0x58, 0x10, 0x8e, 0x08, 0x54, 0x52, - 0x80, 0x0f, 0x54, 0x42, 0x00, 0x0f, 0x38, 0x40, 0x90, 0x00, 0x38, 0x50, - 0x94, 0x00, 0x00, 0x60, 0x00, 0x4d, 0x99, 0x6c, 0x54, 0x45, 0x00, 0x01, - 0x98, 0x6e, 0x4e, 0x42, 0x01, 0x6b, 0x8f, 0x41, 0x9c, 0x4a, 0x48, 0x00, - 0x01, 0x67, 0xf3, 0x04, 0xf0, 0x03, 0xe2, 0x60, 0xe8, 0x26, 0x2e, 0x04, - 0xa2, 0x9c, 0xe2, 0x60, 0x4e, 0xf2, 0x01, 0x57, 0x3c, 0x2d, 0x6c, 0xff, - 0xf3, 0x07, 0x99, 0x93, 0xa6, 0x30, 0x4e, 0x02, 0x01, 0x33, 0xa0, 0xb1, - 0x54, 0x01, 0x00, 0x04, 0x4e, 0x02, 0x01, 0x2e, 0x02, 0x33, 0x00, 0xa3, - 0x4e, 0x32, 0x01, 0x2a, 0xf0, 0x02, 0x4e, 0x02, 0x01, 0x27, 0x04, 0x03, - 0x00, 0x4f, 0xf1, 0x06, 0x80, 0x43, 0x83, 0x83, 0x49, 0xfe, 0x88, 0xab, - 0x02, 0x33, 0x00, 0xa6, 0x81, 0x40, 0x9c, 0xd9, 0x48, 0x00, 0x00, 0x99, - 0x3c, 0x2d, 0x6d, 0x01, 0xf1, 0x0b, 0x99, 0x11, 0xb4, 0x44, 0x54, 0x01, - 0x00, 0x04, 0x4e, 0x02, 0x01, 0x11, 0xa0, 0x22, 0x4e, 0x02, 0x01, 0x0e, - 0x84, 0xa2, 0xd8, 0x03, 0x84, 0x01, 0xd5, 0x06, 0xa0, 0xa3, 0x56, 0x01, - 0x00, 0x02, 0x5c, 0x00, 0x00, 0x01, 0x4e, 0x03, 0x01, 0x03, 0xf0, 0x02, - 0x4e, 0x02, 0x01, 0x00, 0x02, 0x32, 0x00, 0x1b, 0xf1, 0x06, 0x41, 0xc1, - 0x8c, 0x00, 0xa0, 0x24, 0x80, 0x5c, 0x49, 0xfe, 0x88, 0x82, 0x81, 0x40, - 0x84, 0x24, 0x48, 0x00, 0x01, 0x17, 0xf0, 0x04, 0xf1, 0x03, 0xe2, 0x01, - 0xe8, 0x4d, 0xf0, 0x01, 0xb4, 0x60, 0x4e, 0x32, 0x00, 0xeb, 0x54, 0x21, - 0x80, 0x04, 0x4e, 0x22, 0x00, 0xe7, 0xa0, 0x42, 0x4e, 0x12, 0x00, 0xe4, - 0x42, 0x01, 0xd0, 0x0b, 0x4e, 0x03, 0x00, 0xe0, 0xf3, 0x01, 0x03, 0xc1, - 0x80, 0x1b, 0x4f, 0xc2, 0x00, 0xdb, 0xf0, 0x02, 0x4e, 0x02, 0x00, 0xd8, - 0x00, 0x01, 0x80, 0x59, 0x96, 0x04, 0xc0, 0x04, 0x50, 0x61, 0x80, 0x4c, - 0xd5, 0x08, 0xf1, 0x01, 0x00, 0x00, 0x80, 0x67, 0x96, 0x04, 0xc0, 0x18, - 0x50, 0x60, 0x80, 0x5a, 0xc6, 0x15, 0xf0, 0x08, 0xa4, 0xf1, 0xb4, 0x40, - 0xa4, 0x32, 0x80, 0x23, 0x41, 0xc1, 0x8c, 0x00, 0x49, 0xff, 0xc6, 0x39, - 0xa5, 0x35, 0xf1, 0x06, 0x9c, 0xe1, 0x94, 0xda, 0x98, 0x03, 0x80, 0x5c, - 0x49, 0xfe, 0x88, 0x43, 0x81, 0x40, 0xa5, 0x30, 0xd5, 0x0d, 0xf1, 0x08, - 0x41, 0xce, 0x70, 0x00, 0xb4, 0x01, 0xf1, 0x06, 0x80, 0x5c, 0x49, 0xfe, - 0x88, 0x38, 0x81, 0x40, 0xf0, 0x01, 0x02, 0x40, 0x00, 0x89, 0x80, 0x04, - 0x49, 0xff, 0xc6, 0xab, 0x80, 0x20, 0x48, 0x00, 0x00, 0xc7, 0x3c, 0x6d, - 0x6c, 0xff, 0xf3, 0x0a, 0x44, 0x00, 0x02, 0xac, 0x42, 0x61, 0x80, 0x73, - 0xa6, 0x30, 0x4e, 0x02, 0x00, 0x99, 0xa0, 0xb1, 0x54, 0x01, 0x00, 0x04, - 0x4e, 0x02, 0x00, 0x94, 0x02, 0x33, 0x00, 0xa3, 0x4e, 0x32, 0x00, 0x90, - 0xf0, 0x02, 0x4e, 0x02, 0x00, 0x8d, 0x04, 0x03, 0x00, 0x4f, 0xf1, 0x06, - 0x80, 0x43, 0x83, 0x83, 0x49, 0xfe, 0x88, 0x11, 0x02, 0x33, 0x00, 0xa6, - 0x81, 0x40, 0x98, 0x5b, 0x48, 0x00, 0x00, 0xa4, 0xf1, 0x8c, 0x83, 0xca, - 0x80, 0x5c, 0xf1, 0x09, 0x04, 0xaf, 0x80, 0x0f, 0x05, 0xcf, 0x80, 0x02, - 0xd5, 0x06, 0xf0, 0x09, 0x05, 0xef, 0x80, 0x0f, 0xf0, 0x8c, 0xf2, 0x02, - 0x40, 0x5e, 0x08, 0x97, 0xcc, 0x3c, 0xf3, 0x05, 0x84, 0xa2, 0xdb, 0x2f, - 0x40, 0xff, 0x28, 0x06, 0xe8, 0x06, 0x40, 0x45, 0x78, 0x01, 0xe6, 0x83, - 0x4e, 0xf3, 0x00, 0x83, 0xe3, 0x5e, 0xe8, 0x25, 0x40, 0x4f, 0x28, 0x01, - 0xe6, 0x83, 0xe8, 0x21, 0xd5, 0x7b, 0x40, 0x31, 0x88, 0xb7, 0x8d, 0x02, - 0x40, 0x34, 0xf0, 0x97, 0x40, 0x72, 0x90, 0x06, 0x40, 0x62, 0x14, 0x06, - 0x40, 0x02, 0x98, 0x1a, 0x40, 0x02, 0x18, 0x1b, 0x40, 0x32, 0x9c, 0x1a, - 0x40, 0x32, 0x1c, 0x1b, 0x9a, 0xd8, 0x40, 0x41, 0x88, 0x77, 0xc3, 0x66, - 0xf0, 0x0c, 0x40, 0x34, 0x78, 0x00, 0xe3, 0x00, 0xe9, 0xe7, 0x50, 0x05, - 0x00, 0x02, 0x04, 0xaf, 0x80, 0x0d, 0xd5, 0x02, 0x84, 0x00, 0xe2, 0x01, - 0xe8, 0x08, 0x40, 0x90, 0x28, 0x00, 0x14, 0xaf, 0x80, 0x0d, 0x85, 0x00, - 0x81, 0x40, 0xd5, 0xed, 0x5c, 0xfe, 0x01, 0x91, 0xe9, 0x30, 0x41, 0xce, - 0x70, 0x00, 0x40, 0x4e, 0x08, 0xf7, 0xcf, 0x2b, 0x40, 0x05, 0x28, 0x00, - 0x41, 0xef, 0x78, 0x00, 0x98, 0x92, 0x81, 0x47, 0xd5, 0x1d, 0x40, 0x31, - 0x88, 0xb7, 0x8d, 0x02, 0x40, 0x34, 0xf0, 0x97, 0x40, 0x72, 0x90, 0x06, - 0x40, 0x62, 0x14, 0x06, 0x40, 0x02, 0x98, 0x1a, 0x40, 0x02, 0x18, 0x1b, - 0x40, 0x32, 0x9c, 0x1a, 0x40, 0x32, 0x1c, 0x1b, 0x9a, 0xd8, 0x40, 0x41, - 0x88, 0x77, 0xc3, 0x2e, 0xf0, 0x0c, 0x40, 0x34, 0x78, 0x00, 0xe3, 0x00, - 0xe9, 0xe7, 0xf0, 0x0d, 0x8d, 0x42, 0xe3, 0x41, 0xe8, 0x06, 0x40, 0x95, - 0x00, 0x00, 0x85, 0x00, 0xf0, 0x8d, 0xd5, 0xf3, 0xf1, 0x04, 0xf3, 0x0a, - 0x9c, 0x09, 0x96, 0x00, 0xf0, 0x84, 0xf0, 0x0b, 0x9c, 0x99, 0x50, 0x00, - 0x01, 0x64, 0xf1, 0x01, 0xf3, 0x07, 0xf0, 0x8b, 0xf0, 0x08, 0x50, 0x10, - 0x81, 0x64, 0x50, 0x31, 0x82, 0xac, 0x96, 0x90, 0x50, 0x00, 0x01, 0x64, - 0xf1, 0x81, 0xf3, 0x87, 0xf2, 0x8a, 0xf0, 0x88, 0xf1, 0x04, 0xf3, 0x0e, - 0xe2, 0x23, 0x4e, 0xf3, 0xfe, 0x47, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x01, - 0xec, 0x44, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0xf0, 0x02, 0x40, 0xfe, - 0x00, 0x06, 0x4e, 0xf3, 0xff, 0x5b, 0x48, 0xff, 0xff, 0x62, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xd4, 0x54, 0x90, 0x80, 0xff, 0x81, 0x00, 0x96, 0x91, - 0x96, 0xd9, 0x97, 0x21, 0x97, 0x69, 0x4e, 0x92, 0x00, 0x06, 0x84, 0x01, - 0x4c, 0x90, 0x40, 0x18, 0xd5, 0x0b, 0x50, 0x10, 0x00, 0x34, 0x50, 0xa0, - 0x00, 0x36, 0x50, 0x60, 0x00, 0x33, 0xf1, 0x87, 0x50, 0x00, 0x01, 0x12, - 0xd5, 0x0a, 0x50, 0x14, 0x00, 0x56, 0xf1, 0x87, 0x50, 0xa4, 0x00, 0x4e, - 0x50, 0x64, 0x00, 0x58, 0x50, 0x04, 0x00, 0x4c, 0xf0, 0x84, 0xd5, 0x0e, - 0x50, 0x14, 0x00, 0x64, 0xf1, 0x87, 0x50, 0x04, 0x00, 0x5a, 0x84, 0x27, - 0x50, 0xa4, 0x00, 0x5c, 0x50, 0x64, 0x00, 0x66, 0xf0, 0x84, 0x4c, 0x90, - 0x80, 0x3a, 0x99, 0xec, 0x90, 0xe1, 0x12, 0x75, 0x00, 0x00, 0x98, 0x9a, - 0xf0, 0x04, 0x90, 0x41, 0xac, 0x80, 0x44, 0x10, 0x00, 0x14, 0x02, 0x25, - 0x00, 0x00, 0x4c, 0x20, 0x80, 0x05, 0x84, 0x0a, 0x4c, 0x20, 0x40, 0x05, - 0x9c, 0x91, 0x12, 0x25, 0x00, 0x00, 0x02, 0x25, 0x00, 0x00, 0x96, 0xd1, - 0xe2, 0x83, 0xe8, 0x02, 0x80, 0x44, 0x12, 0x25, 0x00, 0x00, 0x4e, 0x93, - 0x00, 0x0a, 0x8c, 0x34, 0x4c, 0x40, 0xc0, 0x19, 0x44, 0x20, 0x00, 0x18, - 0xda, 0x15, 0x9e, 0x89, 0xd5, 0x0b, 0x84, 0x01, 0x4c, 0x90, 0x40, 0x0c, - 0x94, 0x4a, 0x4c, 0x40, 0xc0, 0x0e, 0x44, 0x20, 0x00, 0x32, 0xda, 0x0a, - 0x9e, 0x8a, 0x12, 0x25, 0x00, 0x00, 0xd5, 0x06, 0xe7, 0x22, 0xe9, 0x04, - 0x84, 0x07, 0x4c, 0x90, 0x40, 0xd9, 0x84, 0x00, 0x49, 0xfe, 0xa1, 0xc9, - 0xf0, 0x89, 0x02, 0x35, 0x00, 0x00, 0x2e, 0x25, 0xb5, 0x06, 0x94, 0x5a, - 0xf1, 0x88, 0xe0, 0x43, 0xe9, 0x03, 0x9e, 0x99, 0x96, 0x90, 0xae, 0xb0, - 0x4e, 0x93, 0x00, 0x0e, 0xf2, 0x09, 0x14, 0x9f, 0x80, 0x05, 0x42, 0x21, - 0x6c, 0x0b, 0xf2, 0x83, 0x14, 0x9f, 0x80, 0x06, 0x84, 0x41, 0x14, 0x9f, - 0x80, 0x02, 0xd5, 0x3a, 0x84, 0x01, 0x4c, 0x90, 0x00, 0x0c, 0x84, 0x27, - 0x4c, 0x90, 0x80, 0x09, 0x84, 0x40, 0xf2, 0x83, 0x80, 0x40, 0x84, 0x00, - 0xf0, 0x85, 0xf0, 0x86, 0xd5, 0x1e, 0x04, 0x64, 0x00, 0x04, 0x02, 0x14, - 0x00, 0x1b, 0x02, 0x04, 0x00, 0x1c, 0x80, 0x46, 0x49, 0xff, 0xc4, 0xb3, - 0x42, 0x10, 0x6c, 0x0b, 0x3c, 0x6f, 0x49, 0x12, 0xf0, 0x85, 0xf1, 0x83, - 0x02, 0x24, 0x00, 0x1b, 0x02, 0x55, 0x00, 0x00, 0x40, 0x71, 0x14, 0xd7, - 0xc6, 0x0a, 0x40, 0x62, 0x88, 0xb7, 0xc5, 0x07, 0x84, 0x40, 0xf2, 0x86, - 0x84, 0x00, 0x84, 0x41, 0xf0, 0x82, 0xd5, 0x0e, 0x04, 0x04, 0x00, 0x04, - 0xf1, 0x03, 0x98, 0x92, 0x49, 0xfe, 0x86, 0xa9, 0x96, 0x01, 0x56, 0x54, - 0x80, 0x07, 0xf0, 0x82, 0xf0, 0x86, 0x5c, 0x22, 0x80, 0x01, 0x2f, 0xc5, - 0x6b, 0x3a, 0x2e, 0x65, 0x6b, 0x3b, 0x88, 0xdc, 0x83, 0x86, 0x3c, 0x72, - 0x92, 0x2e, 0x54, 0x6e, 0x00, 0xff, 0x99, 0xff, 0xc6, 0x10, 0x2e, 0x05, - 0x94, 0x99, 0xf2, 0x81, 0x49, 0xfd, 0xe7, 0x0f, 0x80, 0xc0, 0xf2, 0x01, - 0xc0, 0x08, 0x00, 0x60, 0x00, 0x42, 0x87, 0x82, 0x56, 0x63, 0x00, 0x06, - 0x40, 0x7e, 0x18, 0x1a, 0xc2, 0x2e, 0xf2, 0x04, 0x84, 0x20, 0xa4, 0x10, - 0xf1, 0x82, 0x49, 0xff, 0xc4, 0xfa, 0x55, 0xc0, 0x00, 0xff, 0x14, 0x9f, - 0x80, 0x04, 0x81, 0x28, 0x81, 0x07, 0xf7, 0x02, 0xd5, 0x12, 0x49, 0xff, - 0xfd, 0x08, 0xc8, 0x0c, 0x02, 0x25, 0x00, 0x00, 0xf4, 0x03, 0x98, 0x92, - 0x80, 0x27, 0x96, 0x91, 0x84, 0x02, 0x80, 0x7c, 0x49, 0xff, 0xfc, 0xfd, - 0xc0, 0x0e, 0x40, 0x13, 0xa0, 0x00, 0x97, 0xc9, 0x02, 0x55, 0x00, 0x00, - 0x80, 0x27, 0x99, 0x6d, 0x80, 0x7c, 0xf4, 0x03, 0x84, 0x01, 0x96, 0xa9, - 0xe0, 0xa7, 0xe8, 0xe6, 0x81, 0x09, 0xf7, 0x82, 0x04, 0x9f, 0x80, 0x04, - 0x4e, 0x93, 0x00, 0x0a, 0xf0, 0x09, 0xf1, 0x08, 0xf2, 0x02, 0x49, 0xff, - 0xc4, 0x4e, 0x14, 0x04, 0x00, 0x04, 0xd5, 0x46, 0x84, 0x41, 0x4c, 0x91, - 0x00, 0x05, 0x84, 0x07, 0x4c, 0x90, 0x40, 0x41, 0xf1, 0x08, 0xf2, 0x02, - 0xf0, 0x05, 0x49, 0xff, 0xc4, 0x40, 0xf1, 0x05, 0x9f, 0x44, 0xf2, 0x08, - 0x80, 0x60, 0x40, 0x52, 0x84, 0x06, 0x42, 0x32, 0x88, 0x73, 0x52, 0x40, - 0xff, 0xfc, 0x98, 0xe3, 0x92, 0x62, 0xf0, 0x07, 0x96, 0xd9, 0xac, 0xc0, - 0x02, 0x45, 0x00, 0x00, 0xe2, 0x83, 0xe8, 0x06, 0x40, 0x51, 0x90, 0xd7, - 0x42, 0x32, 0x14, 0x75, 0xac, 0xc0, 0x84, 0x27, 0x4c, 0x90, 0xc0, 0x21, - 0xf2, 0x06, 0xf0, 0x02, 0x4c, 0x20, 0x40, 0x1d, 0x84, 0x20, 0x10, 0x14, - 0x00, 0x67, 0xd5, 0x18, 0x3e, 0x1d, 0xb3, 0xb4, 0x02, 0x00, 0x80, 0x82, - 0xf2, 0x07, 0xac, 0x10, 0x00, 0x20, 0x81, 0x52, 0xae, 0xb0, 0x3c, 0x0d, - 0x59, 0x25, 0x54, 0x00, 0x00, 0x80, 0xc8, 0x0a, 0x02, 0x25, 0x00, 0x00, - 0x00, 0x00, 0x81, 0x52, 0xe0, 0x02, 0xe9, 0x03, 0x9e, 0x11, 0x96, 0x00, - 0xae, 0x30, 0xec, 0x2c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, 0xb6, 0x8c, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, - 0x2e, 0x34, 0xa2, 0x9e, 0x97, 0x80, 0x81, 0x21, 0x97, 0xd0, 0x2e, 0x84, - 0xa2, 0x9f, 0xe2, 0xc3, 0xe8, 0x03, 0x85, 0x00, 0xd5, 0x04, 0x89, 0x03, - 0x40, 0x83, 0x20, 0x07, 0x80, 0x06, 0x54, 0x84, 0x00, 0xff, 0x49, 0xff, - 0xff, 0xe2, 0xc0, 0x23, 0x4e, 0x82, 0x00, 0x4c, 0x80, 0x06, 0x49, 0xfe, - 0xb2, 0x6c, 0x80, 0xc0, 0xc0, 0x46, 0xb4, 0x20, 0x54, 0x10, 0x80, 0x02, - 0xc1, 0x42, 0x02, 0x20, 0x00, 0x8a, 0x00, 0x10, 0x01, 0x36, 0x9c, 0x91, - 0x12, 0x20, 0x00, 0x8a, 0xc9, 0x06, 0xa0, 0x84, 0x84, 0x22, 0x49, 0xfe, - 0xb7, 0x3a, 0xd5, 0x05, 0xa0, 0x84, 0x84, 0x22, 0x49, 0xfe, 0xd1, 0x3b, - 0x3c, 0x1d, 0x58, 0x68, 0x00, 0x03, 0x01, 0x37, 0xdd, 0x21, 0xd5, 0x2b, - 0x4e, 0x83, 0x00, 0x1a, 0x80, 0x06, 0x49, 0xfd, 0xae, 0x0c, 0xc0, 0x25, - 0xb4, 0x40, 0x54, 0x61, 0x00, 0x04, 0xc6, 0x07, 0x3c, 0x3d, 0x58, 0x63, - 0x80, 0x47, 0x80, 0x29, 0xdd, 0x23, 0xd5, 0x1c, 0x40, 0x21, 0x3c, 0x08, - 0x92, 0x5f, 0xc2, 0x17, 0x80, 0x07, 0x49, 0xfe, 0x0b, 0xb6, 0x40, 0x03, - 0x00, 0x06, 0xd5, 0x12, 0x2e, 0x05, 0xae, 0xf5, 0xc8, 0x0e, 0x80, 0x06, - 0x49, 0xfe, 0xb2, 0x2f, 0xc0, 0x0a, 0xb4, 0x20, 0x54, 0x10, 0x80, 0x02, - 0xc1, 0x06, 0x3c, 0x2d, 0x58, 0x64, 0x80, 0x27, 0xdd, 0x22, 0xd5, 0x02, - 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x80, 0xc0, 0x84, 0x00, 0x49, 0xfe, 0xa0, 0x61, - 0x2e, 0x15, 0xe7, 0xc1, 0xc1, 0x27, 0x2e, 0x35, 0x83, 0xe0, 0x3c, 0x2d, - 0x60, 0xf3, 0x94, 0x5b, 0x98, 0x51, 0xa6, 0x4d, 0x49, 0xfe, 0x85, 0x15, - 0x00, 0x13, 0x00, 0x30, 0xa0, 0xb7, 0x94, 0x4b, 0x98, 0x51, 0xa6, 0x4e, - 0x49, 0xfe, 0x85, 0x0d, 0x80, 0xe0, 0x2e, 0x15, 0x82, 0xcc, 0x96, 0x4c, - 0xc1, 0x07, 0x3c, 0x0d, 0x60, 0xb2, 0x80, 0x27, 0x49, 0xfe, 0x85, 0x65, - 0xc8, 0x0f, 0x2e, 0x15, 0x82, 0xe4, 0x96, 0x4c, 0xc1, 0x07, 0x3c, 0x0d, - 0x60, 0xb8, 0x80, 0x27, 0x49, 0xfe, 0x85, 0x5b, 0xc8, 0x05, 0x80, 0x06, - 0x49, 0xfd, 0x5b, 0x3d, 0xd5, 0x02, 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, - 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0x80, 0xe0, - 0x84, 0x00, 0x49, 0xfe, 0xa0, 0x28, 0x80, 0x80, 0x44, 0x87, 0x79, 0xc0, - 0x84, 0x06, 0x44, 0x11, 0x00, 0x00, 0x44, 0x20, 0x75, 0x99, 0x84, 0x62, - 0x3e, 0x6d, 0x83, 0xb0, 0xdd, 0x28, 0x00, 0xa3, 0x00, 0x34, 0x4e, 0xa3, - 0x00, 0xbd, 0x04, 0x93, 0x00, 0x04, 0x4c, 0x93, 0x80, 0x1c, 0x80, 0x89, - 0x84, 0x06, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, 0x75, 0x97, 0x96, 0xf9, - 0xdd, 0x28, 0xcf, 0x0a, 0xa0, 0x34, 0x84, 0x21, 0x4c, 0x00, 0x80, 0x07, - 0x00, 0x03, 0x00, 0x3e, 0xc0, 0x03, 0x10, 0x73, 0x00, 0x3e, 0x3c, 0x1d, - 0x66, 0xd5, 0x84, 0xc1, 0x98, 0x4e, 0x3c, 0x1f, 0x66, 0xd5, 0x48, 0x00, - 0x00, 0xd0, 0xa1, 0x35, 0x84, 0x06, 0x44, 0x20, 0x75, 0x96, 0x44, 0x12, - 0x00, 0x00, 0x40, 0x34, 0x80, 0x13, 0xdd, 0x28, 0xa0, 0xb5, 0x84, 0x0a, - 0x4c, 0x20, 0x00, 0x06, 0x50, 0x01, 0x7f, 0xf1, 0xe6, 0x03, 0xe8, 0x35, - 0x2e, 0x35, 0x83, 0xe6, 0xcb, 0x08, 0x3c, 0x4d, 0x59, 0x09, 0x3c, 0x1d, - 0x60, 0xf0, 0x44, 0x00, 0x70, 0x29, 0xdd, 0x24, 0x3e, 0x1d, 0x83, 0xb0, - 0x00, 0x00, 0x80, 0x3e, 0xc0, 0x10, 0xa0, 0x8c, 0xc2, 0x07, 0x3c, 0x1d, - 0x66, 0xd6, 0x9c, 0x49, 0x3c, 0x1f, 0x66, 0xd6, 0xd5, 0x03, 0x84, 0x01, - 0xa8, 0x0c, 0x84, 0x40, 0x84, 0x21, 0x3e, 0x25, 0x83, 0xee, 0xd5, 0x10, - 0xa0, 0x8d, 0xa0, 0x09, 0xa8, 0x8c, 0x96, 0x04, 0x84, 0x4c, 0xa8, 0x8d, - 0xc0, 0x08, 0x2e, 0x65, 0xe7, 0xc1, 0xce, 0x05, 0x49, 0xfd, 0xb0, 0x6b, - 0x80, 0x26, 0xd5, 0x03, 0x84, 0x20, 0x80, 0xc1, 0x84, 0x5f, 0x3c, 0x2f, - 0x65, 0x24, 0xc1, 0x55, 0x48, 0x00, 0x00, 0x8b, 0x00, 0x03, 0x00, 0x36, - 0xc0, 0x0a, 0xa0, 0x74, 0xe6, 0x2a, 0xe8, 0x07, 0x3c, 0x4d, 0x59, 0x09, - 0x80, 0x6a, 0x44, 0x00, 0x70, 0x2b, 0xdd, 0x24, 0x3e, 0x6d, 0x83, 0xb0, - 0x00, 0x03, 0x00, 0x3e, 0xc0, 0x16, 0xa0, 0x74, 0xc1, 0x0e, 0x3c, 0x4d, - 0x59, 0x09, 0xa0, 0xb5, 0x44, 0x00, 0x70, 0x2c, 0x84, 0x60, 0xdd, 0x24, - 0x3c, 0x1d, 0x66, 0xd6, 0x9c, 0x49, 0x3c, 0x1f, 0x66, 0xd6, 0xd5, 0x03, - 0x84, 0x01, 0xa8, 0x34, 0x84, 0x20, 0x3e, 0x15, 0x83, 0xee, 0xd5, 0x58, - 0x2e, 0x05, 0x9b, 0xd3, 0xc8, 0x08, 0x00, 0x03, 0x00, 0x38, 0xc8, 0x05, - 0x00, 0x13, 0x00, 0x3b, 0xe6, 0x22, 0xe9, 0x15, 0x84, 0x0c, 0x3c, 0x0f, - 0x60, 0xf0, 0x3c, 0x1d, 0x52, 0xcd, 0x46, 0x00, 0x7f, 0xff, 0x58, 0x00, - 0x0f, 0xff, 0xdd, 0x21, 0x2e, 0x05, 0x83, 0xeb, 0xe6, 0x02, 0xe9, 0x4b, - 0x49, 0xfd, 0x5b, 0x5b, 0x84, 0xc0, 0x40, 0x63, 0x00, 0x06, 0xd5, 0x46, - 0x3c, 0x7d, 0x52, 0xd1, 0x84, 0x2c, 0xa8, 0x74, 0x49, 0xfe, 0x9f, 0x6b, - 0xdd, 0x27, 0xc8, 0x03, 0x00, 0x03, 0x00, 0x35, 0x3c, 0x1d, 0x52, 0xcd, - 0x84, 0xc0, 0xdd, 0x21, 0x3c, 0x1d, 0x52, 0xca, 0x54, 0x04, 0x80, 0xff, - 0xdd, 0x21, 0xd5, 0x32, 0x00, 0x13, 0x00, 0x38, 0x2e, 0x05, 0x9b, 0xd3, - 0x84, 0x40, 0x40, 0x21, 0x04, 0x06, 0x98, 0x90, 0xca, 0x1f, 0x00, 0x13, - 0x00, 0x3b, 0x00, 0x03, 0x00, 0x3c, 0x4c, 0x10, 0x40, 0x1a, 0x46, 0x00, - 0x7f, 0xff, 0xa9, 0xf6, 0x80, 0x62, 0x80, 0x82, 0x46, 0x10, 0x00, 0x9d, - 0x58, 0x10, 0x8d, 0xf0, 0x58, 0x00, 0x0f, 0xff, 0x84, 0xa1, 0x49, 0xfe, - 0x01, 0xb2, 0x96, 0xf9, 0x84, 0x06, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, - 0x75, 0x98, 0x84, 0x81, 0xdd, 0x28, 0x84, 0xc1, 0xd5, 0x0b, 0x96, 0xf9, - 0x84, 0x06, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, 0x75, 0x98, 0x84, 0x80, - 0x49, 0xfe, 0x91, 0xb9, 0x84, 0xc0, 0x80, 0x06, 0x3a, 0x6f, 0xa8, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xcc, 0x0b, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xa9, 0x61, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, - 0x81, 0x20, 0x2e, 0x05, 0x83, 0xe1, 0x49, 0xfd, 0xac, 0x86, 0x80, 0xc0, - 0xc0, 0x5b, 0x04, 0x00, 0x00, 0x92, 0xc8, 0x38, 0x84, 0xa1, 0x4c, 0x92, - 0x80, 0x06, 0x85, 0x08, 0x40, 0xa2, 0x90, 0x08, 0xd5, 0x04, 0x44, 0x80, - 0x00, 0x60, 0x81, 0x48, 0x84, 0xe1, 0x47, 0xc0, 0x00, 0xa5, 0x59, 0xce, - 0x06, 0x5c, 0xd5, 0x22, 0x49, 0xfd, 0xac, 0x6f, 0x80, 0xc0, 0xc0, 0x1c, - 0x49, 0xff, 0xff, 0xd5, 0xc0, 0x19, 0x04, 0x03, 0x00, 0x92, 0xc8, 0x16, - 0x80, 0x27, 0x84, 0x03, 0x49, 0xfe, 0xa6, 0x85, 0xc0, 0x06, 0x80, 0x06, - 0xdd, 0x3c, 0x5c, 0xf0, 0x02, 0x80, 0xe9, 0x07, 0x84, 0xa2, 0x4c, 0x92, - 0xc0, 0x05, 0x44, 0x80, 0x00, 0x60, 0x81, 0x48, 0x80, 0x07, 0x80, 0x28, - 0x80, 0x4a, 0x49, 0xff, 0xd7, 0x1c, 0x9d, 0xf9, 0x97, 0xf8, 0x2e, 0x34, - 0xa2, 0x9c, 0x80, 0x07, 0xe2, 0xe3, 0xe9, 0xdb, 0xd5, 0x21, 0x84, 0xa1, - 0x4c, 0x92, 0x80, 0x12, 0x2e, 0x15, 0x83, 0xe1, 0x84, 0x03, 0x49, 0xfe, - 0xa6, 0x64, 0xc0, 0x0b, 0x80, 0x06, 0x49, 0xff, 0xff, 0x9e, 0x5c, 0xf0, - 0x02, 0x80, 0xe8, 0x05, 0x84, 0xec, 0x40, 0x83, 0x84, 0x08, 0xd5, 0x04, - 0x44, 0x70, 0x00, 0x60, 0x81, 0x07, 0x80, 0x06, 0x49, 0xff, 0xff, 0x9b, - 0xc0, 0x07, 0x2e, 0x05, 0x83, 0xe1, 0x80, 0x27, 0x80, 0x48, 0x49, 0xff, - 0xd6, 0xf4, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x00, 0x10, 0x00, 0x39, 0x84, 0x41, 0x50, 0x60, - 0x00, 0x34, 0xb4, 0xe0, 0x4c, 0x11, 0x40, 0x11, 0x54, 0x13, 0x80, 0x08, - 0xc1, 0x0d, 0x49, 0xff, 0xfe, 0x36, 0x80, 0x20, 0xc8, 0x5c, 0xa6, 0x35, - 0xa6, 0xb6, 0x9c, 0x01, 0x96, 0x00, 0xae, 0x35, 0xe2, 0x40, 0xe8, 0x02, - 0xae, 0x75, 0x84, 0xa3, 0xd7, 0x0d, 0x84, 0xa7, 0xd7, 0x0b, 0x84, 0xab, - 0xd7, 0x09, 0x84, 0xa2, 0xd7, 0x07, 0x84, 0xa6, 0xd7, 0x05, 0x84, 0xaa, - 0xd7, 0x03, 0x84, 0xae, 0xdf, 0x0a, 0xa6, 0x35, 0xc8, 0x02, 0xd5, 0x13, - 0x84, 0xa1, 0xd8, 0x02, 0xd5, 0x29, 0x84, 0xa2, 0xd8, 0x42, 0xd5, 0x19, - 0x84, 0xad, 0xd7, 0x03, 0x84, 0xaf, 0xdf, 0x0e, 0xa6, 0x35, 0xc8, 0x02, - 0xd5, 0x12, 0x84, 0xa1, 0xd8, 0x02, 0xd5, 0x1c, 0x84, 0xa2, 0xd8, 0x35, - 0x50, 0x03, 0x7f, 0xcc, 0x49, 0xfd, 0x5f, 0x71, 0xd5, 0x19, 0x9e, 0x3c, - 0xe6, 0x02, 0xe9, 0x03, 0x84, 0xac, 0xdf, 0x0b, 0xa6, 0x35, 0xc8, 0x06, - 0x50, 0x03, 0x7f, 0xcc, 0x49, 0xfd, 0x63, 0x91, 0xd5, 0x0d, 0x84, 0xa1, - 0xd8, 0x22, 0xd5, 0x06, 0x8e, 0xe8, 0xe6, 0xe2, 0xe8, 0x08, 0xa6, 0x35, - 0xc8, 0x1c, 0x50, 0x03, 0x7f, 0xcc, 0x49, 0xff, 0xfd, 0xec, 0xc8, 0x13, - 0x2e, 0x25, 0xb4, 0xbe, 0x10, 0x23, 0x7f, 0xfd, 0x84, 0x2a, 0x2e, 0x25, - 0xb4, 0xbe, 0x3c, 0x3d, 0x52, 0xcb, 0x50, 0x03, 0x7f, 0xcc, 0xdd, 0x23, - 0x3c, 0x1d, 0x52, 0xce, 0x50, 0x03, 0x7f, 0xcc, 0xdd, 0x21, 0x84, 0x00, - 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3c, 0x4d, 0x59, 0x09, - 0x04, 0x13, 0x7f, 0xf3, 0xa6, 0xb5, 0xa6, 0xf6, 0x44, 0x00, 0x70, 0x34, - 0xdd, 0x24, 0xd5, 0xe1, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xa9, 0x93, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x84, 0x41, 0xa0, 0x44, - 0x10, 0x20, 0x00, 0x45, 0x84, 0x4c, 0x80, 0xc0, 0x4c, 0x11, 0x00, 0xe7, - 0xe6, 0x2d, 0xe8, 0x08, 0xe6, 0x27, 0xe9, 0x11, 0x84, 0x6a, 0x4c, 0x11, - 0xc1, 0x7e, 0x48, 0x00, 0x00, 0xd0, 0x84, 0x8e, 0x4c, 0x12, 0x00, 0xf7, - 0xe2, 0x24, 0x4e, 0xf3, 0x01, 0x76, 0xe6, 0x32, 0x4e, 0xf2, 0x01, 0x73, - 0x48, 0x00, 0x00, 0xf3, 0xa0, 0x85, 0x84, 0x0a, 0x4c, 0x20, 0x40, 0x30, - 0x00, 0x03, 0x00, 0x31, 0x4e, 0x02, 0x00, 0x96, 0x44, 0x20, 0x00, 0x18, - 0x42, 0x20, 0x88, 0x24, 0x3e, 0x3d, 0x82, 0xc0, 0x00, 0x03, 0x00, 0x3e, - 0x98, 0x93, 0xa5, 0xd0, 0xc0, 0x06, 0xc9, 0x05, 0x02, 0x01, 0x80, 0x0c, - 0x99, 0xf8, 0x9d, 0xfc, 0x84, 0x03, 0x42, 0x10, 0x80, 0x24, 0x80, 0x83, - 0x9c, 0x49, 0x40, 0x10, 0x80, 0x0c, 0x98, 0x4c, 0xa6, 0x0e, 0x3e, 0x2d, - 0x9a, 0xa4, 0xc0, 0x08, 0x04, 0x01, 0x00, 0x2a, 0x98, 0x38, 0x14, 0x01, - 0x00, 0x2a, 0x48, 0x00, 0x01, 0x74, 0x04, 0x01, 0x00, 0x2b, 0x98, 0x38, - 0x14, 0x01, 0x00, 0x2b, 0x48, 0x00, 0x01, 0x6d, 0x50, 0x01, 0x7f, 0xf1, - 0xe6, 0x03, 0xe8, 0x67, 0x84, 0x0f, 0x4c, 0x20, 0x40, 0x0a, 0x2e, 0x35, - 0x83, 0xe0, 0x3c, 0x2d, 0x60, 0xf3, 0x94, 0x1b, 0x98, 0x10, 0xa6, 0x06, - 0xd5, 0x15, 0x9c, 0xc1, 0x3e, 0x0d, 0x83, 0xb0, 0x4c, 0x21, 0xc0, 0x09, - 0x00, 0x30, 0x00, 0x30, 0xa0, 0x87, 0x94, 0x1b, 0x98, 0x10, 0xa6, 0x07, - 0xd5, 0x09, 0x00, 0x20, 0x00, 0x30, 0xa0, 0x07, 0x94, 0x93, 0x98, 0x82, - 0xa6, 0x16, 0xa6, 0x97, 0x98, 0x10, 0x3c, 0x3d, 0x66, 0xd2, 0x3e, 0x4d, - 0x82, 0xc0, 0x98, 0xc3, 0x3c, 0x3f, 0x66, 0xd2, 0x44, 0x20, 0x00, 0x18, - 0x42, 0x10, 0x88, 0x24, 0x00, 0x23, 0x00, 0x3e, 0x98, 0x4c, 0xa4, 0x48, - 0xc2, 0x07, 0xa0, 0xb4, 0xca, 0x05, 0x02, 0x22, 0x00, 0x0c, 0x98, 0x4a, - 0x9c, 0x4c, 0xa0, 0xf4, 0x84, 0x43, 0x42, 0x31, 0x88, 0x24, 0x9c, 0xd9, - 0x94, 0xdb, 0x98, 0xdc, 0xa6, 0xde, 0x3e, 0x2d, 0x9a, 0xa4, 0xc3, 0x07, - 0x04, 0x31, 0x00, 0x2a, 0x98, 0xcb, 0x14, 0x31, 0x00, 0x2a, 0xd5, 0x06, - 0x04, 0x31, 0x00, 0x2b, 0x98, 0xcb, 0x14, 0x31, 0x00, 0x2b, 0x98, 0x08, - 0xa0, 0x74, 0x84, 0x42, 0x4c, 0x11, 0x40, 0xea, 0x2e, 0x15, 0x9b, 0xd3, - 0x4e, 0x13, 0x00, 0xe6, 0x2e, 0x15, 0x83, 0xeb, 0x84, 0x61, 0x4c, 0x11, - 0xc0, 0xe1, 0x3c, 0x22, 0xc1, 0x78, 0x3c, 0x12, 0xc1, 0x79, 0x2e, 0x35, - 0x4a, 0xca, 0x9a, 0x8a, 0x40, 0x21, 0x88, 0x07, 0x40, 0x00, 0x88, 0x1b, - 0x48, 0x00, 0x00, 0xd4, 0x84, 0x03, 0x42, 0x00, 0x80, 0x24, 0x3e, 0x4d, - 0x82, 0xc0, 0x9c, 0x01, 0x94, 0x03, 0x98, 0x04, 0xa6, 0x06, 0x3e, 0x2d, - 0x9a, 0xa4, 0xc0, 0x0e, 0x44, 0x00, 0x00, 0x18, 0x42, 0x10, 0x80, 0x24, - 0x04, 0x31, 0x00, 0x2a, 0x98, 0x4c, 0xa4, 0x08, 0x98, 0x03, 0x14, 0x01, - 0x00, 0x2a, 0x48, 0x00, 0x00, 0xbc, 0x44, 0x00, 0x00, 0x18, 0x42, 0x10, - 0x80, 0x24, 0x80, 0x04, 0x98, 0x48, 0x04, 0x31, 0x00, 0x2b, 0xa4, 0x08, - 0x98, 0x03, 0x14, 0x01, 0x00, 0x2b, 0x48, 0x00, 0x00, 0xae, 0x2e, 0x15, - 0x9b, 0xd3, 0x84, 0x41, 0x4c, 0x11, 0x40, 0xd6, 0x2e, 0x15, 0x83, 0xeb, - 0x4e, 0x13, 0x00, 0xd2, 0x00, 0x10, 0x00, 0x38, 0x4e, 0x13, 0x00, 0xce, - 0xd5, 0x27, 0x2e, 0x05, 0x9b, 0xd3, 0xc8, 0x16, 0x00, 0x03, 0x00, 0x38, - 0xc8, 0x13, 0x2e, 0x05, 0x83, 0xeb, 0xc0, 0x10, 0x2e, 0x15, 0x83, 0x2c, - 0x96, 0x4c, 0xc9, 0x0c, 0x2e, 0x05, 0x83, 0x44, 0x96, 0x04, 0xc8, 0x08, - 0x3c, 0x7d, 0x52, 0xd1, 0x49, 0xfe, 0x9d, 0x21, 0xdd, 0x27, 0x4e, 0x03, - 0x00, 0x8d, 0x00, 0x03, 0x00, 0x35, 0x48, 0x00, 0x00, 0x83, 0x04, 0x00, - 0x00, 0x0a, 0x48, 0x00, 0x00, 0x7f, 0x2e, 0x25, 0x9b, 0xd3, 0xca, 0x09, - 0x2e, 0x25, 0x83, 0xeb, 0xca, 0x06, 0x3c, 0x1d, 0x52, 0xce, 0xdd, 0x21, - 0x48, 0x00, 0x00, 0x75, 0x84, 0x6f, 0x4c, 0x11, 0xc0, 0x0a, 0x2e, 0x25, - 0x83, 0xe0, 0x3c, 0x1d, 0x60, 0xf3, 0x94, 0x13, 0x98, 0x08, 0xa6, 0x46, - 0xd5, 0x16, 0x44, 0x40, 0x00, 0x10, 0x3e, 0x0d, 0x83, 0xb0, 0x4c, 0x12, - 0x40, 0x09, 0x00, 0x20, 0x00, 0x30, 0xa0, 0x47, 0x94, 0x13, 0x98, 0x08, - 0xa6, 0x47, 0xd5, 0x09, 0x00, 0x20, 0x00, 0x30, 0xa0, 0x47, 0x94, 0x13, - 0x98, 0x08, 0xa6, 0x46, 0xa6, 0x07, 0x98, 0x41, 0x04, 0x03, 0x00, 0x0a, - 0xe2, 0x01, 0xe8, 0x02, 0xc8, 0x02, 0x80, 0x01, 0x3c, 0x2d, 0x66, 0xd2, - 0x98, 0x82, 0x3c, 0x2f, 0x66, 0xd2, 0xd5, 0x47, 0x00, 0x10, 0x02, 0x46, - 0x00, 0x03, 0x00, 0x31, 0x4c, 0x10, 0x40, 0x09, 0xa0, 0x73, 0xc1, 0x06, - 0x84, 0x00, 0xa8, 0x32, 0x14, 0x13, 0x00, 0x0a, 0xd5, 0x24, 0x49, 0xff, - 0xfe, 0xa2, 0xc0, 0x03, 0x84, 0x02, 0xd5, 0x02, 0x84, 0x01, 0x49, 0xff, - 0xfd, 0xb8, 0xb4, 0x06, 0x84, 0x4d, 0x04, 0x13, 0x00, 0x0a, 0x4c, 0x01, - 0x00, 0x05, 0x84, 0x6f, 0x4c, 0x01, 0xc0, 0x14, 0x00, 0x03, 0x00, 0x40, - 0xc0, 0x10, 0xa1, 0x35, 0x84, 0x0a, 0x4c, 0x40, 0x40, 0x0d, 0xa0, 0x34, - 0xe6, 0x02, 0xe9, 0x09, 0xe6, 0x0a, 0xe8, 0x07, 0x5c, 0x20, 0x80, 0x51, - 0x44, 0x00, 0x00, 0x50, 0x40, 0x10, 0x08, 0x1a, 0x3c, 0x2d, 0x6c, 0xfc, - 0x00, 0x33, 0x00, 0x31, 0x44, 0x00, 0x00, 0x44, 0x42, 0x21, 0x80, 0x73, - 0x98, 0x0f, 0x00, 0x31, 0x00, 0x2d, 0x5c, 0xf1, 0x80, 0x27, 0xe8, 0x09, - 0x9c, 0xda, 0x3e, 0x2d, 0x9a, 0xa4, 0x38, 0x41, 0x0e, 0x02, 0x98, 0x4c, - 0x38, 0x11, 0x0e, 0x0a, 0xc8, 0x06, 0x50, 0x03, 0x00, 0x36, 0x49, 0xfd, - 0xfe, 0x60, 0xd5, 0x13, 0x00, 0x23, 0x00, 0x36, 0xc2, 0x07, 0x80, 0x20, - 0x50, 0x03, 0x00, 0x36, 0x49, 0xfd, 0xfe, 0xc5, 0xd5, 0x0a, 0x3c, 0x1d, - 0x52, 0xc8, 0x80, 0x62, 0x80, 0x82, 0x80, 0xa2, 0x49, 0xfd, 0xfe, 0xf5, - 0x10, 0x03, 0x00, 0x36, 0x00, 0x03, 0x00, 0x36, 0x02, 0x73, 0x00, 0x08, - 0x49, 0xfd, 0xfd, 0xdd, 0x80, 0x80, 0x80, 0x67, 0x84, 0x06, 0x44, 0x14, - 0x00, 0x00, 0x44, 0x20, 0x75, 0x95, 0x49, 0xfe, 0x8e, 0xfe, 0x84, 0x00, - 0x10, 0x03, 0x00, 0x45, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, - 0x84, 0xe0, 0xa0, 0x32, 0xc8, 0x8a, 0x48, 0xff, 0xff, 0x96, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xfc, 0x2e, 0x25, 0x6b, 0x3a, 0x2e, 0x15, 0x6b, 0x3b, - 0x80, 0xc0, 0x98, 0x11, 0x96, 0x00, 0xc0, 0x43, 0x2e, 0x05, 0x94, 0x99, - 0x49, 0xfd, 0xe2, 0x01, 0x80, 0xe0, 0x00, 0x00, 0x00, 0x48, 0x49, 0xfe, - 0x11, 0x48, 0xa0, 0x79, 0x9e, 0x89, 0x5c, 0xf1, 0x7f, 0xfe, 0xe8, 0x35, - 0x49, 0xfe, 0x81, 0x6d, 0xc0, 0x32, 0x00, 0x03, 0x00, 0x2c, 0x04, 0xa3, - 0x80, 0x01, 0x49, 0xfe, 0x11, 0x3a, 0x83, 0x80, 0x00, 0x03, 0x80, 0x48, - 0xa1, 0xf3, 0x49, 0xfe, 0x11, 0x34, 0x9c, 0x7b, 0x98, 0x48, 0x40, 0x0e, - 0x28, 0x00, 0x49, 0xfe, 0x81, 0x5a, 0xc0, 0x1f, 0x2e, 0x14, 0xa2, 0x9e, - 0x00, 0x03, 0x00, 0x2c, 0x2e, 0x24, 0xa2, 0x9f, 0xe2, 0x01, 0xe8, 0x03, - 0x84, 0x20, 0xd5, 0x04, 0x98, 0x51, 0x40, 0x10, 0x04, 0x07, 0xc1, 0x10, - 0x49, 0xfe, 0xad, 0xdf, 0x80, 0xe0, 0x00, 0x00, 0x01, 0x37, 0x49, 0xff, - 0xdc, 0x78, 0x92, 0x00, 0xa0, 0x79, 0x96, 0x4c, 0xc9, 0x06, 0xc0, 0x04, - 0xb4, 0x00, 0xa6, 0x00, 0xc0, 0x02, 0x84, 0xc0, 0x80, 0x06, 0xec, 0x04, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x3e, 0x7d, 0xb3, 0xb4, 0x00, 0x90, 0x00, 0x48, 0x04, 0x13, 0x80, 0x0f, - 0x80, 0xc0, 0x80, 0x09, 0xf1, 0x81, 0x49, 0xfe, 0x10, 0xfc, 0x83, 0x80, - 0x00, 0x03, 0x00, 0x48, 0x80, 0x3c, 0x49, 0xfd, 0xae, 0xba, 0x81, 0x00, - 0xa0, 0x31, 0x80, 0x28, 0x49, 0xfe, 0x81, 0x1d, 0xc0, 0x63, 0xa0, 0x31, - 0x80, 0x3c, 0x49, 0xfe, 0x81, 0x18, 0xc8, 0x5e, 0x00, 0x23, 0x00, 0x42, - 0xe6, 0x47, 0xe8, 0x3f, 0xf3, 0x01, 0x44, 0x40, 0x00, 0x44, 0x42, 0x34, - 0x90, 0x73, 0xa0, 0x19, 0x84, 0xa1, 0xd8, 0x1f, 0x2e, 0x34, 0xa2, 0x9c, - 0x04, 0x53, 0x80, 0x0f, 0x9e, 0xd9, 0x96, 0xd8, 0xd5, 0x12, 0x00, 0x13, - 0x00, 0x48, 0x4c, 0x11, 0x80, 0x0e, 0xa0, 0x41, 0x84, 0x61, 0x4c, 0x11, - 0x80, 0x05, 0x84, 0x62, 0x4c, 0x11, 0xc0, 0x07, 0x04, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x01, 0x50, 0xc8, 0x32, 0x96, 0xf8, 0x80, 0x05, 0x42, 0x01, - 0x90, 0x73, 0x9f, 0xd9, 0xcb, 0xeb, 0xd5, 0x19, 0x84, 0xa2, 0xd8, 0x17, - 0x2e, 0x34, 0xa2, 0x9c, 0x04, 0x13, 0x80, 0x0f, 0x9e, 0xd9, 0x96, 0xd8, - 0xd5, 0x0b, 0xa0, 0xc1, 0x84, 0xe1, 0x4c, 0x33, 0xc0, 0x07, 0x04, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x01, 0x50, 0xc8, 0x19, 0x96, 0xe8, 0x80, 0x01, - 0x42, 0x01, 0x90, 0x73, 0x9f, 0x59, 0xcb, 0xf2, 0x84, 0x20, 0x3c, 0x1a, - 0x92, 0x4e, 0xd5, 0x18, 0x84, 0x00, 0xac, 0x18, 0x80, 0x28, 0xa0, 0x31, - 0x49, 0xfe, 0x80, 0x99, 0x92, 0x00, 0xa8, 0x31, 0x3c, 0x1d, 0x58, 0x60, - 0x00, 0x03, 0x00, 0x48, 0xdd, 0x21, 0xd5, 0x0a, 0x3e, 0x3d, 0x24, 0x9c, - 0xa5, 0x18, 0x9d, 0x21, 0x97, 0x21, 0xad, 0x18, 0x5c, 0xf2, 0x00, 0x20, - 0xe8, 0xea, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x90, 0x49, 0xfc, 0xb7, 0x78, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x50, 0x20, - 0x7f, 0xf1, 0x80, 0xe0, 0x54, 0x80, 0x80, 0xff, 0xe6, 0x43, 0xe8, 0x06, - 0x80, 0x28, 0x49, 0xfd, 0x62, 0x48, 0x48, 0x00, 0x00, 0x87, 0x84, 0xaa, - 0x3e, 0x6d, 0x83, 0xb0, 0xdf, 0x28, 0x80, 0x08, 0x49, 0xfd, 0xa8, 0xef, - 0x00, 0x43, 0x00, 0x31, 0x44, 0x11, 0x00, 0x00, 0x81, 0x40, 0x44, 0x20, - 0x75, 0x81, 0x84, 0x06, 0x80, 0x68, 0x49, 0xfe, 0x8d, 0xf6, 0x00, 0x03, - 0x00, 0x31, 0x80, 0x28, 0x49, 0xfe, 0x0e, 0x81, 0xc0, 0x5b, 0x80, 0x06, - 0x49, 0xfd, 0x5c, 0xd9, 0x84, 0x0c, 0x84, 0x20, 0xa8, 0x34, 0x10, 0x13, - 0x00, 0x31, 0xa8, 0x35, 0x4e, 0xa2, 0x00, 0x51, 0x04, 0xa5, 0x00, 0x92, - 0x4e, 0xa3, 0x00, 0x47, 0x2e, 0x05, 0x9b, 0xcf, 0xc8, 0x49, 0xd5, 0x42, - 0xa1, 0x34, 0x84, 0x06, 0x44, 0x11, 0x00, 0x00, 0x44, 0x20, 0x75, 0x82, - 0x96, 0xf9, 0x49, 0xfe, 0x8d, 0xd4, 0xe6, 0xea, 0xe8, 0x3d, 0x44, 0x10, - 0x00, 0x18, 0x42, 0x13, 0x84, 0x24, 0x3e, 0x0d, 0x82, 0xc0, 0x98, 0x48, - 0x9c, 0x4f, 0xa6, 0x8d, 0xca, 0x09, 0x3c, 0x4d, 0x59, 0x09, 0x80, 0x27, - 0x44, 0x00, 0x70, 0x25, 0x80, 0x62, 0xdd, 0x24, 0xd5, 0x2b, 0x54, 0x21, - 0x00, 0x04, 0xc2, 0x04, 0x84, 0x00, 0xae, 0x0d, 0xd5, 0x25, 0xa6, 0x0f, - 0xc0, 0x06, 0x00, 0x03, 0x00, 0x3c, 0x9e, 0x01, 0x10, 0x03, 0x00, 0x3c, - 0x3e, 0x0d, 0x83, 0xb0, 0x00, 0x30, 0x00, 0x3b, 0x84, 0x40, 0x9e, 0xd9, - 0x10, 0x30, 0x00, 0x3b, 0xae, 0x8d, 0xe6, 0xe2, 0xe8, 0x06, 0x00, 0x10, - 0x00, 0x3e, 0xc1, 0x03, 0x10, 0x20, 0x00, 0x3e, 0xa0, 0x44, 0x4c, 0x13, - 0xc0, 0x0c, 0xa0, 0x45, 0xa8, 0x44, 0x84, 0x2c, 0xa8, 0x45, 0x3c, 0x3d, - 0x52, 0xcc, 0x84, 0x00, 0x80, 0x20, 0x80, 0x40, 0xdd, 0x23, 0x3e, 0x6d, - 0x83, 0xb0, 0x00, 0x13, 0x00, 0x3d, 0x00, 0x03, 0x00, 0x3b, 0xe2, 0x20, - 0xe9, 0x07, 0x49, 0xfd, 0x55, 0xe0, 0x92, 0x00, 0x84, 0x00, 0x10, 0x03, - 0x00, 0x3d, 0x3c, 0x1d, 0x5a, 0x31, 0x80, 0x07, 0xdd, 0x21, 0x84, 0x00, - 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xa4, 0xbb, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x81, 0x00, 0x49, 0xff, 0xff, 0xf3, - 0x80, 0xc0, 0x84, 0x00, 0x49, 0xfe, 0x9a, 0xe1, 0x80, 0xe0, 0x2e, 0x14, - 0xa2, 0x9e, 0x00, 0x04, 0x00, 0x2c, 0x40, 0x33, 0x18, 0x05, 0x40, 0x63, - 0x8c, 0x1a, 0x2e, 0x24, 0xa2, 0x9f, 0xe2, 0x01, 0xe8, 0x03, 0x84, 0x20, - 0xd5, 0x04, 0x98, 0x51, 0x40, 0x10, 0x04, 0x07, 0xc1, 0x11, 0x49, 0xfe, - 0xac, 0x84, 0x50, 0x10, 0x00, 0x2c, 0x9b, 0x3e, 0x95, 0x24, 0x92, 0x84, - 0xa4, 0x8f, 0xa4, 0xce, 0x92, 0x82, 0x94, 0x95, 0xa4, 0x0d, 0xe2, 0x64, - 0xe8, 0x1c, 0x9c, 0x59, 0xd5, 0x1b, 0x49, 0xfd, 0xa8, 0x36, 0x50, 0x10, - 0x01, 0x68, 0x02, 0x20, 0x01, 0x13, 0xa0, 0xcb, 0x02, 0x00, 0x00, 0xa1, - 0x84, 0x82, 0x98, 0x92, 0x92, 0x01, 0x4c, 0x32, 0x40, 0x0d, 0xa7, 0x0c, - 0xa6, 0xcd, 0xe2, 0x83, 0xe8, 0x03, 0x9c, 0xe1, 0xd5, 0x02, 0x9c, 0xd9, - 0xa6, 0x4e, 0x42, 0x11, 0x84, 0x24, 0xd5, 0x02, 0x84, 0x21, 0x9b, 0xbe, - 0x9a, 0x96, 0x42, 0x10, 0x80, 0x24, 0x94, 0x14, 0x92, 0x04, 0x92, 0x02, - 0x40, 0x00, 0x04, 0x37, 0xe6, 0x0a, 0xe8, 0x06, 0x46, 0x10, 0x00, 0xaf, - 0x58, 0x10, 0x89, 0x98, 0xd5, 0x0e, 0x5c, 0xf0, 0x00, 0x64, 0xe9, 0x03, - 0x84, 0x09, 0xd5, 0x05, 0x8e, 0x0a, 0x84, 0x2a, 0x40, 0x00, 0x04, 0x37, - 0x46, 0x10, 0x00, 0xaf, 0x58, 0x10, 0x89, 0xa4, 0x38, 0x00, 0x80, 0x00, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x46, 0x10, - 0x20, 0x1c, 0x3c, 0x7d, 0x5a, 0xff, 0x85, 0x00, 0x80, 0xc0, 0x14, 0x80, - 0x00, 0x04, 0x14, 0x80, 0x00, 0x03, 0xcf, 0x06, 0xa8, 0x33, 0xa8, 0x34, - 0x3c, 0x0f, 0x5a, 0xff, 0xd5, 0x45, 0xa6, 0x36, 0xe6, 0x02, 0xe8, 0x07, - 0x4e, 0x83, 0x00, 0x08, 0xb4, 0x06, 0x49, 0xff, 0xff, 0x80, 0x81, 0x00, - 0x4e, 0x82, 0x00, 0x0d, 0xa6, 0x3e, 0xe6, 0x02, 0xe8, 0x09, 0xb4, 0x07, - 0x49, 0xff, 0xff, 0x77, 0xc0, 0x05, 0xe2, 0x08, 0xe9, 0x19, 0x4c, 0x80, - 0x40, 0x11, 0xa4, 0x72, 0xa4, 0x3a, 0xe2, 0x01, 0xe9, 0x13, 0x4c, 0x10, - 0x40, 0x0b, 0xa0, 0x32, 0x84, 0xbf, 0xd0, 0x0e, 0xa0, 0x7a, 0x84, 0xbf, - 0xd1, 0x04, 0x49, 0xfe, 0x7f, 0x6e, 0xc8, 0x08, 0xa0, 0x3c, 0x4c, 0x70, - 0x40, 0x04, 0x84, 0x20, 0xd5, 0x04, 0x80, 0xe0, 0xd5, 0xd5, 0x84, 0x21, - 0xa1, 0x7c, 0xdf, 0x06, 0xc9, 0x05, 0xa9, 0xb4, 0xa9, 0xf3, 0xa9, 0xbc, - 0xd5, 0x11, 0xa0, 0x3b, 0x4c, 0x03, 0xc0, 0x09, 0xc1, 0x07, 0xa9, 0xb3, - 0xa9, 0xbb, 0xa9, 0xf4, 0x3c, 0x6f, 0x5a, 0xff, 0xd5, 0x07, 0xa0, 0x44, - 0xa8, 0x33, 0xa8, 0x74, 0xa0, 0x44, 0xa9, 0x8b, 0xa9, 0x84, 0x3a, 0x6f, - 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, - 0x3c, 0x8d, 0x6d, 0x03, 0x2e, 0x35, 0xb4, 0xbf, 0x83, 0x80, 0x40, 0xa0, - 0x80, 0x13, 0x54, 0x91, 0x00, 0xff, 0xf3, 0x81, 0x84, 0xe0, 0x50, 0x6f, - 0x80, 0x0c, 0xd5, 0x1a, 0x49, 0xfa, 0xd2, 0xa1, 0x80, 0x08, 0x0c, 0x14, - 0x00, 0x05, 0xc9, 0x0f, 0x84, 0x3f, 0x15, 0xc0, 0x00, 0x00, 0x12, 0xa0, - 0x00, 0x02, 0x10, 0x90, 0x00, 0x06, 0xa8, 0x42, 0x49, 0xff, 0xff, 0x87, - 0xf0, 0x03, 0x49, 0xfa, 0xd2, 0xa6, 0xd5, 0x0a, 0xf0, 0x03, 0x9d, 0xf9, - 0x49, 0xfa, 0xd2, 0xa1, 0x97, 0xf8, 0xf1, 0x01, 0x80, 0x06, 0xe2, 0xe1, - 0xe9, 0xe4, 0xec, 0x14, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x96, 0x49, 0x3c, 0x6d, 0x5a, 0xff, 0xc0, 0x12, 0xc6, 0x11, - 0xb4, 0xa6, 0xd0, 0x06, 0xa0, 0xf4, 0x4c, 0x61, 0x80, 0x0d, 0x80, 0xc3, - 0xd5, 0xfa, 0xc6, 0x09, 0xac, 0x72, 0xa8, 0xb2, 0x80, 0x06, 0x49, 0xfd, - 0xa9, 0x68, 0x80, 0x06, 0x49, 0xff, 0xff, 0x5f, 0x3a, 0x6f, 0x98, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, 0x2e, 0x15, 0xe7, 0xc1, - 0x80, 0xc0, 0x3c, 0x7d, 0x6c, 0xfc, 0x01, 0xc3, 0x02, 0x46, 0xc1, 0x4e, - 0x84, 0x00, 0x02, 0x93, 0x00, 0xa1, 0x49, 0xfe, 0x99, 0xcc, 0x81, 0x40, - 0x44, 0x10, 0x00, 0x44, 0x80, 0x07, 0x42, 0x0e, 0x04, 0x73, 0x49, 0xff, - 0xfe, 0xd2, 0x80, 0xe0, 0x84, 0xbf, 0xd7, 0x3e, 0x2e, 0x24, 0xa2, 0x9c, - 0x2e, 0x14, 0xa2, 0x9f, 0x98, 0x92, 0x3c, 0x0d, 0x79, 0xf2, 0x9c, 0x93, - 0x98, 0x8a, 0x98, 0x8a, 0x00, 0x10, 0x00, 0x2c, 0x96, 0x10, 0x02, 0x83, - 0x00, 0xa1, 0x49, 0xfe, 0xa1, 0x4c, 0xc0, 0x0a, 0x3c, 0x0d, 0x6b, 0xa8, - 0x44, 0x50, 0x01, 0x00, 0xd8, 0x05, 0x3c, 0x0d, 0x60, 0xf0, 0xe6, 0x0f, - 0xe9, 0x23, 0x44, 0x20, 0x00, 0x28, 0x40, 0x21, 0x24, 0x76, 0x40, 0x15, - 0x1c, 0x01, 0x94, 0x4c, 0x92, 0x24, 0x92, 0x21, 0x84, 0x00, 0x40, 0x10, - 0xa1, 0x17, 0x40, 0x00, 0x0c, 0x06, 0x98, 0x02, 0x9e, 0x01, 0x96, 0x00, - 0x96, 0x48, 0xe2, 0x20, 0xe8, 0x0f, 0x00, 0x23, 0x02, 0x46, 0x3c, 0x0d, - 0x6c, 0xfc, 0x44, 0x10, 0x00, 0x44, 0x42, 0x01, 0x04, 0x73, 0x49, 0xff, - 0xfe, 0xa0, 0x84, 0x29, 0x40, 0x00, 0x80, 0x06, 0xd5, 0x02, 0x84, 0x01, - 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xec, 0x50, 0x60, 0x02, 0x40, 0x00, 0x00, 0x02, 0x46, - 0x54, 0xa1, 0x00, 0xff, 0xf1, 0x83, 0x49, 0xfe, 0x0e, 0x68, 0x81, 0x20, - 0xa6, 0x36, 0x80, 0x29, 0x49, 0xfd, 0xac, 0x27, 0x80, 0x40, 0xa0, 0x32, - 0xc0, 0x04, 0x04, 0x73, 0x7f, 0xbf, 0xd5, 0x03, 0x04, 0x73, 0x7f, 0xbe, - 0xf2, 0x81, 0x45, 0xc7, 0x5e, 0xec, 0x80, 0x07, 0x80, 0x29, 0xdd, 0x3c, - 0x81, 0x00, 0xf2, 0x01, 0xc0, 0x0a, 0xa0, 0xb2, 0x84, 0x03, 0x84, 0x21, - 0x40, 0x80, 0x88, 0x1a, 0x40, 0x80, 0x08, 0x1b, 0x84, 0xe0, 0xd5, 0x22, - 0x80, 0x22, 0x80, 0x07, 0xdd, 0x3c, 0x04, 0x23, 0x7f, 0xbc, 0x4e, 0x02, - 0x00, 0xd5, 0xc2, 0x0c, 0x84, 0xa2, 0xd2, 0x0a, 0x3c, 0x4d, 0x59, 0x09, - 0xa6, 0x76, 0x44, 0x00, 0x70, 0x1f, 0x80, 0x68, 0x80, 0xe8, 0xdd, 0x24, - 0xd5, 0x0e, 0x84, 0xe1, 0xd5, 0x0c, 0x2e, 0x05, 0x6b, 0x33, 0x02, 0x13, - 0x7f, 0xf5, 0x80, 0xe2, 0x9a, 0x08, 0x12, 0x03, 0x7f, 0xf5, 0x84, 0x01, - 0xf3, 0x03, 0xae, 0x18, 0x81, 0x07, 0x50, 0x03, 0x7d, 0xc0, 0x49, 0xff, - 0xff, 0x54, 0x80, 0x60, 0xc8, 0x0a, 0x3c, 0x0d, 0x66, 0xeb, 0x50, 0x14, - 0x80, 0x04, 0x80, 0xe3, 0x49, 0xfe, 0x7e, 0x47, 0x81, 0x40, 0xd5, 0x44, - 0xcf, 0x03, 0x81, 0x47, 0xd5, 0x41, 0x04, 0x03, 0x7f, 0xbe, 0x84, 0x21, - 0x49, 0xfe, 0x7d, 0xe1, 0x83, 0x80, 0x3c, 0x2d, 0x6c, 0xfc, 0xa6, 0xf6, - 0x4e, 0xa2, 0x00, 0x0b, 0x80, 0x2a, 0x3e, 0x0d, 0x94, 0x84, 0xf2, 0x81, - 0xf3, 0x82, 0x49, 0xfd, 0xb3, 0x76, 0xf3, 0x02, 0xf2, 0x01, 0x44, 0x10, - 0x00, 0x44, 0x80, 0x02, 0x42, 0x01, 0x84, 0x73, 0x40, 0x2e, 0x24, 0x01, - 0x94, 0x94, 0x92, 0x44, 0x80, 0x3c, 0x49, 0xfe, 0x0c, 0xa4, 0x2e, 0x05, - 0x94, 0x9c, 0x92, 0x02, 0x94, 0x02, 0x84, 0x41, 0x87, 0x81, 0x3e, 0x25, - 0x6b, 0x31, 0x3e, 0x05, 0x94, 0x9c, 0x15, 0xc3, 0x7f, 0xbc, 0x44, 0x04, - 0x00, 0x00, 0x49, 0xfd, 0xef, 0xf0, 0x02, 0x23, 0x7f, 0x84, 0x15, 0xc3, - 0x7f, 0xb9, 0x12, 0x23, 0x7f, 0x85, 0x84, 0x1f, 0x3c, 0x0f, 0x65, 0x25, - 0x3c, 0x2d, 0x5a, 0x6e, 0x50, 0x13, 0x7d, 0xc0, 0x84, 0x02, 0xdd, 0x22, - 0x85, 0x40, 0x4e, 0x82, 0x00, 0x62, 0x02, 0x13, 0x7f, 0x84, 0x04, 0x03, - 0x7f, 0xbe, 0x98, 0x49, 0x49, 0xfe, 0x7d, 0x97, 0x14, 0x03, 0x7f, 0xbd, - 0x02, 0x23, 0x7f, 0x81, 0x04, 0x03, 0x7f, 0xbe, 0x80, 0x29, 0x93, 0x01, - 0x49, 0xfe, 0x7d, 0xbd, 0x54, 0x84, 0x00, 0xff, 0x14, 0x03, 0x7f, 0xbe, - 0x4e, 0x82, 0x00, 0x07, 0x80, 0x29, 0x50, 0x03, 0x7d, 0xc0, 0x49, 0xfd, - 0xb1, 0xfc, 0x04, 0x83, 0x00, 0x02, 0x14, 0x03, 0x7f, 0xbf, 0x4e, 0x83, - 0x00, 0x2d, 0xa6, 0x36, 0x3e, 0x9d, 0x27, 0x54, 0x38, 0x54, 0x80, 0x00, - 0x84, 0x61, 0xdb, 0x25, 0x94, 0x02, 0x3e, 0x1d, 0x26, 0x54, 0x98, 0x03, - 0x38, 0x00, 0x83, 0x02, 0x04, 0x13, 0x7f, 0xbe, 0x49, 0xfe, 0x7d, 0xcd, - 0xc0, 0x1a, 0xa6, 0x76, 0x3e, 0x0d, 0x26, 0x54, 0x94, 0x4d, 0x98, 0x48, - 0x44, 0x20, 0x00, 0x20, 0x50, 0x03, 0x7e, 0xf0, 0x05, 0xc3, 0x7f, 0xbc, - 0x49, 0xff, 0x0a, 0xd1, 0xa6, 0x36, 0x15, 0xc3, 0x7f, 0xbc, 0x38, 0x84, - 0x80, 0x08, 0x80, 0x48, 0x02, 0x13, 0x7f, 0x81, 0x50, 0x03, 0x7d, 0xc0, - 0x49, 0xfd, 0xcb, 0x25, 0x3c, 0x1d, 0x58, 0x68, 0xa6, 0x36, 0xdd, 0x21, - 0x4e, 0xa2, 0x00, 0x0f, 0x84, 0x00, 0x84, 0x3f, 0x49, 0xfe, 0x0d, 0x1d, - 0x92, 0x00, 0xa6, 0x36, 0xa1, 0xb2, 0xc6, 0x03, 0x84, 0x28, 0xd5, 0x02, - 0x84, 0x21, 0x49, 0xff, 0xd7, 0xb8, 0x80, 0x07, 0xec, 0x14, 0x3a, 0x6f, - 0xaa, 0x84, 0xdd, 0x9e, 0x4e, 0x22, 0xff, 0x3b, 0x80, 0xe0, 0x48, 0xff, - 0xff, 0x43, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xc0, 0x50, 0x70, 0x02, 0x3f, - 0x04, 0x00, 0x00, 0x92, 0x56, 0x00, 0x00, 0x01, 0xa6, 0x48, 0x3c, 0x8d, - 0x6c, 0xfc, 0x10, 0x03, 0x80, 0x20, 0x3c, 0x0d, 0x5b, 0x18, 0xa7, 0xbf, - 0xe6, 0x02, 0xe9, 0x09, 0x3e, 0x2d, 0x25, 0xa4, 0x38, 0x01, 0x18, 0x00, - 0x54, 0x00, 0x00, 0x7f, 0x38, 0x01, 0x18, 0x08, 0x2e, 0x05, 0xb4, 0xcd, - 0xc0, 0x04, 0x2e, 0x05, 0x6b, 0x53, 0xc8, 0x0b, 0xa6, 0x3f, 0x49, 0xfe, - 0x0a, 0xde, 0xc8, 0x1d, 0x3e, 0x0d, 0x25, 0xa4, 0x38, 0x00, 0x18, 0x10, - 0x4e, 0x05, 0x00, 0x18, 0x44, 0x30, 0x00, 0x22, 0xa6, 0x3f, 0x12, 0x3f, - 0x80, 0x0e, 0x80, 0x3f, 0x00, 0x73, 0x80, 0x20, 0x10, 0x7f, 0x80, 0x08, - 0x49, 0xfd, 0x65, 0xef, 0x3e, 0x1d, 0x25, 0xa4, 0x38, 0x00, 0x98, 0x00, - 0x44, 0x2f, 0xff, 0x80, 0x40, 0x00, 0x08, 0x04, 0x38, 0x00, 0x98, 0x08, - 0x80, 0x08, 0x44, 0x10, 0x00, 0x44, 0x42, 0x03, 0x04, 0x73, 0x00, 0x00, - 0x00, 0x32, 0xc0, 0x09, 0x3e, 0x0d, 0x25, 0xa4, 0x38, 0x10, 0x18, 0x00, - 0x54, 0x10, 0x80, 0x7f, 0x38, 0x10, 0x18, 0x08, 0x3e, 0x1d, 0x25, 0xa4, - 0x38, 0x20, 0x98, 0x00, 0x84, 0x00, 0x42, 0x21, 0x18, 0x09, 0x38, 0x20, - 0x98, 0x08, 0xec, 0x40, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa0, 0xbc, 0xef, 0xc0, 0x00, 0x20, 0x02, 0x48, 0x50, 0x70, 0x02, 0x3f, - 0x56, 0x21, 0x00, 0x01, 0xa6, 0x48, 0x3c, 0x8d, 0x6c, 0xfc, 0x10, 0x23, - 0x80, 0x20, 0x10, 0x2f, 0x80, 0x08, 0x3c, 0x0d, 0x5b, 0x18, 0xa7, 0xbf, - 0xe6, 0x02, 0xe9, 0x09, 0x3e, 0x2d, 0x25, 0xa4, 0x38, 0x01, 0x18, 0x00, - 0x42, 0x00, 0x18, 0x09, 0x38, 0x01, 0x18, 0x08, 0x2e, 0x0d, 0x6a, 0xaa, - 0xe4, 0x05, 0xe9, 0x06, 0x00, 0x03, 0xff, 0x6a, 0x54, 0x00, 0x00, 0x02, - 0xc0, 0x0c, 0xa6, 0x3f, 0x49, 0xfe, 0x0a, 0x69, 0xc8, 0x18, 0x3e, 0x0d, - 0x25, 0xa4, 0x38, 0x00, 0x18, 0x00, 0x54, 0x00, 0x00, 0x40, 0xc8, 0x11, - 0xa6, 0x3f, 0x80, 0x3f, 0x44, 0x30, 0x00, 0x21, 0x12, 0x3f, 0x80, 0x0e, - 0x49, 0xfd, 0x65, 0x8f, 0x3e, 0x1d, 0x25, 0xa4, 0x38, 0x00, 0x98, 0x00, - 0x58, 0x00, 0x00, 0x40, 0x38, 0x00, 0x98, 0x08, 0x44, 0x10, 0x00, 0x44, - 0x80, 0x08, 0x42, 0x03, 0x04, 0x73, 0x00, 0x10, 0x00, 0x32, 0x2e, 0x05, - 0xb4, 0xdb, 0xe2, 0x20, 0xe8, 0x09, 0x3e, 0x0d, 0x25, 0xa4, 0x38, 0x10, - 0x18, 0x00, 0x42, 0x10, 0x98, 0x09, 0x38, 0x10, 0x18, 0x08, 0x3e, 0x1d, - 0x25, 0xa4, 0x38, 0x20, 0x98, 0x00, 0x84, 0x00, 0x54, 0x21, 0x00, 0x7f, - 0x38, 0x20, 0x98, 0x08, 0xec, 0x40, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xa1, 0x9d, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xc1, 0x8f, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0xc0, 0x2c, 0x3c, 0x62, 0xd4, 0x42, 0x96, 0x34, 0xc0, 0x28, - 0x2e, 0x75, 0xa8, 0x88, 0xc7, 0x03, 0x84, 0xc0, 0xd5, 0x2d, 0x54, 0x63, - 0x00, 0x02, 0xc6, 0x11, 0x3c, 0x02, 0xd4, 0x43, 0x46, 0x10, 0x00, 0xa6, - 0x58, 0x10, 0x86, 0x4c, 0x80, 0x47, 0x80, 0x67, 0x80, 0x87, 0x80, 0xa7, - 0x49, 0xfd, 0xf9, 0xf5, 0x3e, 0x05, 0xa8, 0x88, 0x80, 0xc7, 0xd5, 0x1a, - 0x44, 0x00, 0x12, 0xc0, 0x46, 0x10, 0x00, 0xa6, 0x58, 0x10, 0x86, 0x4c, - 0x80, 0x46, 0x80, 0x66, 0x80, 0x86, 0x80, 0xa6, 0x49, 0xfd, 0xf9, 0xe5, - 0x3e, 0x05, 0xa8, 0x88, 0xd5, 0x0b, 0x49, 0xfe, 0x77, 0xc0, 0x80, 0xc0, - 0x3e, 0x0d, 0xa8, 0x84, 0xa6, 0x44, 0xc1, 0x04, 0x9c, 0x04, 0x49, 0xfd, - 0xf9, 0x32, 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x84, 0xc0, 0x3e, 0x7d, - 0xa8, 0x84, 0x44, 0x20, 0x01, 0x9a, 0x44, 0x00, 0x00, 0x26, 0x46, 0x10, - 0x00, 0xa6, 0x58, 0x10, 0x85, 0x58, 0xac, 0xb9, 0xad, 0xb8, 0xaf, 0xbc, - 0x49, 0xfe, 0x0a, 0x0b, 0x84, 0x7f, 0x84, 0x20, 0x3c, 0x3f, 0x5b, 0x27, - 0x3c, 0x1f, 0x5b, 0x28, 0x84, 0x61, 0x3e, 0x35, 0xb4, 0xce, 0x3e, 0x65, - 0x6b, 0x4a, 0x84, 0x41, 0xac, 0xb8, 0x3e, 0x65, 0x6b, 0x83, 0x3e, 0x65, - 0x6b, 0x84, 0x3c, 0x1f, 0x49, 0x36, 0x3c, 0x1f, 0x49, 0x37, 0x84, 0x01, - 0x49, 0xff, 0xff, 0x97, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x49, 0xff, 0xbb, 0xa8, 0xc8, 0x22, - 0x3c, 0x0d, 0x58, 0x72, 0x42, 0x00, 0x6c, 0x0b, 0xc8, 0x1d, 0x3e, 0x0d, - 0xa8, 0x84, 0xa4, 0x41, 0x9c, 0x04, 0x49, 0xfd, 0xf9, 0x5a, 0x46, 0x00, - 0x80, 0x00, 0x49, 0xfd, 0xee, 0x1c, 0x49, 0xfe, 0x0b, 0x8e, 0x80, 0xc0, - 0xc0, 0x05, 0x46, 0x00, 0x80, 0x00, 0x49, 0xfd, 0xee, 0x40, 0x3c, 0x42, - 0xd4, 0x43, 0x96, 0xf1, 0x84, 0x06, 0x84, 0x21, 0x44, 0x20, 0x75, 0x40, - 0x49, 0xfe, 0x89, 0x97, 0xd5, 0x06, 0x3e, 0x0d, 0xa8, 0x88, 0x84, 0x22, - 0x49, 0xfd, 0xf9, 0x3f, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x80, 0xc0, 0xb4, 0x00, 0x84, 0xa7, 0xd0, 0x03, 0x84, 0xad, - 0xd8, 0x04, 0x80, 0x06, 0x49, 0xff, 0xfa, 0xe5, 0x80, 0x06, 0x49, 0xfd, - 0xb7, 0x90, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0x98, 0xbc, 0x80, 0xc0, 0x49, 0xff, 0xfa, 0xd9, 0x80, 0x06, 0x49, 0xfd, - 0xae, 0xea, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xc0, 0x3f, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xc1, 0x71, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x84, 0x40, 0x3e, 0x25, 0x6b, 0x2c, - 0x81, 0x00, 0x49, 0xfd, 0x28, 0xea, 0x80, 0xc0, 0xc0, 0x4b, 0x04, 0x70, - 0x00, 0x08, 0x4c, 0x74, 0x40, 0x48, 0x00, 0x20, 0x00, 0x33, 0xc2, 0x1a, - 0x2e, 0x05, 0x83, 0xe6, 0xc0, 0x12, 0x3c, 0x1d, 0x52, 0xd3, 0x84, 0x04, - 0xdd, 0x21, 0x80, 0xe0, 0x2e, 0x05, 0x83, 0xe6, 0x49, 0xfd, 0xf8, 0x15, - 0x80, 0x20, 0x80, 0x07, 0x49, 0xfe, 0x7b, 0xd1, 0xc0, 0x04, 0x49, 0xff, - 0xff, 0xd4, 0xd5, 0x30, 0x3c, 0x1d, 0x52, 0xd0, 0x84, 0x04, 0xdd, 0x21, - 0xd5, 0x2b, 0x00, 0x30, 0x00, 0x32, 0x84, 0x82, 0x50, 0x03, 0x82, 0x40, - 0x4c, 0x32, 0x40, 0x0b, 0x2e, 0x15, 0x6b, 0x2d, 0x00, 0x33, 0x80, 0x20, - 0x80, 0x40, 0x80, 0x07, 0x49, 0xfd, 0x2e, 0xbf, 0xd5, 0x05, 0x2e, 0x15, - 0x6b, 0x2d, 0x49, 0xfd, 0x46, 0x30, 0x80, 0x07, 0x49, 0xfd, 0xa4, 0x81, - 0x80, 0x06, 0x84, 0x20, 0x49, 0xfd, 0x4b, 0x33, 0x3c, 0x02, 0xb5, 0xe1, - 0x44, 0x20, 0xff, 0xef, 0x3c, 0x1d, 0x5a, 0x3b, 0x40, 0x00, 0x08, 0x02, - 0xdd, 0x21, 0x3c, 0x2d, 0x59, 0x0d, 0x44, 0x10, 0x00, 0x50, 0x84, 0x00, - 0xdd, 0x22, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x48, 0x49, 0xfc, 0xc2, 0x5c, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x01, 0x49, 0xfc, 0xbd, 0x62, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x81, 0x00, 0x49, 0xfd, - 0x28, 0x80, 0x80, 0xc0, 0x84, 0x80, 0x04, 0xa3, 0x00, 0x08, 0x3e, 0x45, - 0x24, 0x71, 0x50, 0x0f, 0x80, 0x04, 0x80, 0x28, 0x84, 0x46, 0x49, 0xff, - 0x08, 0x86, 0x3c, 0x7d, 0x58, 0x72, 0x46, 0x00, 0x05, 0x00, 0x40, 0x73, - 0x80, 0x02, 0xc7, 0x38, 0x45, 0xc6, 0x5b, 0x18, 0x80, 0x08, 0x50, 0x15, - 0x02, 0x40, 0xdd, 0x3c, 0x80, 0xe0, 0xc0, 0x1a, 0x50, 0x0f, 0x80, 0x0c, - 0x49, 0xfa, 0xce, 0xcb, 0x3c, 0x7d, 0x58, 0x72, 0x45, 0xc0, 0x05, 0xec, - 0x54, 0x73, 0x80, 0x02, 0xc7, 0x0b, 0x49, 0xfe, 0x0c, 0x8a, 0x80, 0xe0, - 0xf0, 0x03, 0x85, 0x21, 0xdd, 0x3c, 0x84, 0x02, 0x49, 0xfd, 0xed, 0x5b, - 0xd5, 0x10, 0xf0, 0x03, 0x85, 0x21, 0xdd, 0x3c, 0xd5, 0x0c, 0x00, 0x93, - 0x00, 0x33, 0x84, 0xa1, 0x4c, 0x92, 0xc0, 0x06, 0xa0, 0x32, 0x80, 0x28, - 0xdd, 0x3c, 0xc8, 0x03, 0x85, 0x20, 0x80, 0xe9, 0x3c, 0x2d, 0x59, 0x0d, - 0x44, 0x10, 0x00, 0x50, 0x84, 0x00, 0xdd, 0x22, 0x84, 0xa1, 0x4c, 0x92, - 0x80, 0x0f, 0x84, 0xc0, 0xd5, 0x49, 0x00, 0x03, 0x00, 0x33, 0x84, 0xa1, - 0x4c, 0x02, 0xc0, 0x80, 0xa0, 0x32, 0x80, 0x28, 0x49, 0xfd, 0xf9, 0x43, - 0x4e, 0x02, 0x00, 0x7a, 0x80, 0x0a, 0x49, 0xfd, 0xa3, 0xf8, 0x3c, 0x02, - 0xb5, 0xe1, 0x44, 0x20, 0xff, 0xef, 0x3c, 0x1d, 0x5a, 0x3b, 0x40, 0x00, - 0x08, 0x02, 0xdd, 0x21, 0x00, 0x03, 0x00, 0x33, 0xc0, 0x09, 0x84, 0x00, - 0x10, 0x03, 0x00, 0x33, 0x3c, 0x2d, 0x52, 0xc7, 0x84, 0x20, 0x84, 0x04, - 0xdd, 0x22, 0x80, 0x06, 0x84, 0x20, 0x49, 0xfd, 0x4a, 0x96, 0x3c, 0x6d, - 0x58, 0x72, 0x46, 0x00, 0x01, 0x00, 0x40, 0x63, 0x00, 0x02, 0xce, 0x05, - 0x3c, 0x02, 0xcd, 0xda, 0x84, 0xa1, 0xd0, 0x09, 0x84, 0x00, 0x84, 0x2b, - 0x50, 0x2f, 0x80, 0x04, 0x80, 0x60, 0x49, 0xfd, 0x2e, 0x04, 0x84, 0xc1, - 0x3c, 0x0d, 0x58, 0x72, 0x42, 0x00, 0x58, 0x0b, 0xc0, 0x0b, 0x84, 0x40, - 0x3c, 0x2a, 0xcd, 0xda, 0x84, 0x41, 0x46, 0x00, 0x04, 0x00, 0x3e, 0x25, - 0x24, 0x71, 0x49, 0xfd, 0xec, 0xf8, 0x80, 0x08, 0x49, 0xfd, 0x4a, 0x4b, - 0x81, 0x20, 0xc0, 0x32, 0xa0, 0x02, 0x80, 0x28, 0x49, 0xfd, 0xf8, 0xfb, - 0xc0, 0x0d, 0x04, 0x04, 0x80, 0x08, 0xc0, 0x0a, 0x2e, 0x05, 0x83, 0x2c, - 0x96, 0x04, 0xc0, 0x06, 0x3c, 0x2d, 0x52, 0xc7, 0x84, 0x20, 0x84, 0x04, - 0xdd, 0x22, 0x80, 0x09, 0x84, 0x21, 0x49, 0xfd, 0x4a, 0x5a, 0xce, 0x0c, - 0x00, 0x04, 0x80, 0x32, 0x84, 0xa1, 0xd0, 0x08, 0x80, 0x06, 0x84, 0x2b, - 0x50, 0x2f, 0x80, 0x04, 0x80, 0x66, 0x49, 0xfd, 0x2d, 0xce, 0x3c, 0x0d, - 0x58, 0x72, 0x42, 0x00, 0x58, 0x0b, 0xc0, 0x0c, 0x84, 0x40, 0x3c, 0x2a, - 0xcd, 0xda, 0x84, 0x41, 0x46, 0x00, 0x04, 0x00, 0x3e, 0x25, 0x24, 0x71, - 0x49, 0xfd, 0xec, 0xc3, 0x92, 0x00, 0x80, 0x07, 0xec, 0x14, 0x3a, 0x6f, - 0xaa, 0x84, 0xdd, 0x9e, 0x84, 0xe0, 0x80, 0xc7, 0xd5, 0xc3, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x00, 0x10, 0x02, 0x5c, 0x50, 0x70, 0x02, 0x40, - 0x80, 0x07, 0x49, 0xff, 0xff, 0x0e, 0x80, 0xc0, 0xc0, 0x42, 0xb4, 0x00, - 0x44, 0x50, 0x00, 0x20, 0xd0, 0x3e, 0x8e, 0xb0, 0xd0, 0x3c, 0x02, 0x03, - 0x01, 0x0d, 0x84, 0xa7, 0xd0, 0x3b, 0x84, 0x00, 0x10, 0x03, 0x02, 0x8b, - 0x3c, 0x1d, 0x6c, 0xfc, 0x00, 0x43, 0x02, 0x46, 0x44, 0x20, 0x00, 0x44, - 0x42, 0x12, 0x08, 0x73, 0x04, 0x10, 0x80, 0x0e, 0x10, 0x00, 0x81, 0x46, - 0x3c, 0x1d, 0x6c, 0xfc, 0x00, 0x33, 0x02, 0x46, 0x42, 0x11, 0x88, 0x73, - 0x04, 0x10, 0x80, 0x0e, 0x10, 0x00, 0x81, 0x47, 0x8c, 0x13, 0x14, 0x03, - 0x00, 0x4a, 0x04, 0x03, 0x00, 0x92, 0x84, 0xa1, 0xd8, 0x09, 0xb4, 0x06, - 0x54, 0x00, 0x40, 0xc0, 0xc0, 0x05, 0x3e, 0x0d, 0x9b, 0xc6, 0x49, 0xfd, - 0xf7, 0x1c, 0x50, 0x03, 0x02, 0x86, 0x49, 0xfd, 0xf7, 0x18, 0xb4, 0x06, - 0x58, 0x00, 0x08, 0x00, 0xb6, 0x06, 0x84, 0x07, 0x12, 0x03, 0x01, 0x0d, - 0x80, 0x06, 0x49, 0xfd, 0x45, 0x26, 0xd5, 0x04, 0x80, 0x07, 0x49, 0xff, - 0xfe, 0xdc, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x04, 0x10, 0x00, 0x92, 0x84, 0x42, 0x56, 0x10, 0x80, 0x01, - 0x10, 0x20, 0x02, 0x59, 0x10, 0x10, 0x02, 0x5f, 0x80, 0xc0, 0x49, 0xff, - 0xff, 0xa0, 0x80, 0x06, 0x49, 0xfd, 0x3b, 0x81, 0x3a, 0x6f, 0x98, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x80, 0xe0, 0xb4, 0x00, 0x44, 0x10, - 0x10, 0x00, 0x4c, 0x00, 0x80, 0x05, 0x44, 0x60, 0x00, 0x13, 0xd5, 0x1c, - 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, - 0xc0, 0x06, 0x2e, 0x05, 0xb4, 0xf6, 0xc8, 0x03, 0x84, 0xcc, 0xd5, 0x10, - 0x80, 0x07, 0x49, 0xff, 0xff, 0xd4, 0x80, 0xc0, 0x2e, 0x05, 0x24, 0x71, - 0x84, 0xa1, 0xd8, 0x08, 0x80, 0x07, 0x84, 0x20, 0x49, 0xfd, 0x32, 0x99, - 0x84, 0x00, 0x3e, 0x05, 0x24, 0x71, 0x80, 0x06, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xbe, 0x9b, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xb9, 0x17, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x96, 0x90, 0x05, 0xc0, 0x80, 0x00, 0xf3, 0x81, 0xb6, 0x5f, 0x80, 0xe1, - 0x80, 0xc0, 0x85, 0x00, 0x80, 0x06, 0x4e, 0x83, 0x00, 0x05, 0xb4, 0x3f, - 0x84, 0xa2, 0xd9, 0x04, 0x3c, 0x1d, 0x53, 0xf2, 0xdd, 0x21, 0xb4, 0x06, - 0x40, 0x00, 0x3c, 0x08, 0x92, 0x1f, 0xc0, 0x09, 0x04, 0x13, 0x00, 0x12, - 0x02, 0x53, 0x00, 0x86, 0xa4, 0x0c, 0xd0, 0x03, 0xa4, 0x49, 0xd5, 0x03, - 0x02, 0x13, 0x00, 0x1b, 0xb4, 0x07, 0x8d, 0x01, 0x49, 0xfe, 0x79, 0x97, - 0xb6, 0x07, 0x40, 0x84, 0x00, 0x13, 0xb4, 0x27, 0xf0, 0x01, 0x49, 0xfe, - 0x79, 0xdc, 0xc0, 0xdd, 0x2e, 0x05, 0xe7, 0xc1, 0xc0, 0x46, 0x3c, 0x02, - 0xf3, 0xea, 0x44, 0x50, 0x00, 0xff, 0xd0, 0x41, 0x00, 0x13, 0x01, 0x36, - 0xc9, 0x3e, 0x49, 0xfd, 0xa2, 0x32, 0x04, 0x00, 0x00, 0x92, 0x84, 0xa1, - 0xd8, 0x38, 0x3c, 0x1d, 0x6c, 0xfc, 0x00, 0x33, 0x01, 0x37, 0x44, 0x20, - 0x00, 0x44, 0x80, 0x01, 0x42, 0x01, 0x88, 0x73, 0x49, 0xff, 0xf9, 0xb5, - 0x92, 0x00, 0xe6, 0x0a, 0xe8, 0x2a, 0x80, 0x1c, 0x44, 0x27, 0x5e, 0x54, - 0x44, 0x10, 0x00, 0x10, 0x81, 0x42, 0xdd, 0x22, 0xb6, 0x1f, 0x45, 0xc7, - 0x5e, 0xec, 0xd5, 0x1b, 0x3c, 0x1d, 0x53, 0xf2, 0x80, 0x06, 0xdd, 0x21, - 0xb4, 0x06, 0x40, 0x00, 0x3c, 0x08, 0x92, 0x1f, 0xc0, 0x0a, 0x04, 0x23, - 0x00, 0x12, 0x02, 0x53, 0x00, 0x86, 0xa4, 0x14, 0xd0, 0x04, 0xa4, 0x51, - 0xb4, 0x07, 0xd5, 0x04, 0xb4, 0x07, 0x02, 0x13, 0x00, 0x1b, 0xdd, 0x2a, - 0x8d, 0x01, 0xb6, 0x07, 0x40, 0x84, 0x00, 0x13, 0xb4, 0x07, 0xb4, 0x3f, - 0xdd, 0x3c, 0xc8, 0xe3, 0x50, 0x04, 0x7f, 0xff, 0x96, 0x01, 0xec, 0x0c, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x96, 0x48, - 0x80, 0x62, 0x80, 0xc0, 0xc9, 0x41, 0x2e, 0x04, 0xa2, 0x9e, 0x00, 0x13, - 0x01, 0x37, 0x9a, 0x08, 0x96, 0x00, 0x5c, 0xf0, 0x00, 0x20, 0xe8, 0x06, - 0x84, 0x46, 0x3e, 0x1d, 0xb8, 0x28, 0x38, 0x20, 0x81, 0x09, 0x84, 0x00, - 0x49, 0xfe, 0x94, 0x53, 0x3c, 0x0f, 0x49, 0x35, 0x2e, 0x05, 0x6b, 0x7c, - 0x02, 0x13, 0x00, 0x1a, 0x9c, 0x02, 0x98, 0x49, 0x98, 0x01, 0x49, 0xfe, - 0x79, 0xa0, 0xa8, 0x34, 0x00, 0x23, 0x00, 0x33, 0x2e, 0x15, 0x6b, 0x7c, - 0x98, 0x92, 0x9a, 0x51, 0x49, 0xfe, 0x78, 0xff, 0xa8, 0x35, 0xa0, 0x34, - 0x84, 0x22, 0x49, 0xfe, 0x79, 0x10, 0xb4, 0x26, 0x92, 0x02, 0x94, 0x02, - 0x58, 0x10, 0x90, 0x00, 0x9e, 0x81, 0xa8, 0xb4, 0xb6, 0x26, 0x3c, 0x1d, - 0x49, 0x34, 0x54, 0x20, 0x80, 0x03, 0xca, 0x4e, 0x3c, 0x2d, 0x49, 0x35, - 0x40, 0x10, 0x88, 0x03, 0x84, 0xa1, 0xd9, 0x48, 0x9c, 0x03, 0xa8, 0x34, - 0xd5, 0x45, 0x9e, 0x89, 0x96, 0x90, 0xe6, 0x42, 0xe8, 0x41, 0x80, 0x41, - 0x50, 0x10, 0x00, 0x10, 0x49, 0xff, 0xff, 0x35, 0x02, 0x23, 0x00, 0x8a, - 0xb4, 0x26, 0x98, 0x02, 0x54, 0x20, 0x80, 0x04, 0x12, 0x03, 0x00, 0x8a, - 0xc2, 0x04, 0x42, 0x10, 0xb0, 0x09, 0xb6, 0x26, 0x04, 0x03, 0x00, 0x2f, - 0x96, 0x04, 0xc8, 0x06, 0xb4, 0x06, 0x40, 0x00, 0x3c, 0x08, 0x92, 0x1f, - 0xc0, 0x27, 0x04, 0x23, 0x00, 0x12, 0x02, 0x33, 0x00, 0x1a, 0xa4, 0x11, - 0x12, 0x03, 0x00, 0x1b, 0xa4, 0x53, 0x12, 0x13, 0x00, 0x1d, 0x00, 0x13, - 0x00, 0x33, 0xa4, 0x12, 0x98, 0x59, 0x12, 0x03, 0x00, 0x1c, 0xa0, 0x34, - 0xa4, 0x90, 0x12, 0x23, 0x00, 0x89, 0x49, 0xfe, 0x78, 0xc6, 0x02, 0x13, - 0x00, 0x1a, 0xa8, 0x35, 0xa0, 0x34, 0x9c, 0x49, 0x49, 0xfe, 0x78, 0xbf, - 0xb4, 0x26, 0x58, 0x10, 0x90, 0x00, 0x58, 0x00, 0x00, 0x03, 0x42, 0x10, - 0xc0, 0x09, 0xa8, 0x34, 0xb6, 0x26, 0x00, 0x33, 0x01, 0x37, 0xa1, 0x34, - 0x84, 0x06, 0x84, 0x28, 0x44, 0x20, 0x72, 0x00, 0x49, 0xfe, 0x84, 0x6d, - 0xa0, 0x34, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xa8, 0xbc, 0x80, 0xc0, 0x81, 0x21, 0x4e, 0x02, 0x00, 0xbb, 0xb4, 0x00, - 0x44, 0x21, 0x00, 0x00, 0x40, 0x00, 0x08, 0x02, 0xc0, 0x17, 0x84, 0x00, - 0x49, 0xfe, 0x93, 0xc3, 0x84, 0x21, 0x49, 0xfe, 0x78, 0x96, 0x92, 0x01, - 0x94, 0x45, 0x92, 0x26, 0x94, 0x49, 0x3e, 0x0d, 0xa8, 0x11, 0x49, 0xfd, - 0xf7, 0x5c, 0x3e, 0x1d, 0xa8, 0x11, 0x00, 0x03, 0x02, 0x46, 0x9c, 0x8c, - 0x9c, 0xcd, 0x48, 0x00, 0x00, 0x9c, 0x49, 0xfe, 0x93, 0xae, 0x81, 0x00, - 0x4e, 0x93, 0x00, 0x0b, 0x3c, 0x4d, 0x59, 0x09, 0x00, 0x13, 0x02, 0x46, - 0x44, 0x00, 0x70, 0x32, 0x80, 0x49, 0x80, 0x69, 0xdd, 0x24, 0x2e, 0x05, - 0xb5, 0x05, 0x85, 0x4c, 0x40, 0x50, 0x28, 0x02, 0x4c, 0x55, 0x40, 0x0a, - 0x80, 0x08, 0x44, 0x10, 0x00, 0x20, 0x49, 0xfe, 0x78, 0x5c, 0x80, 0xe0, - 0x48, 0x00, 0x00, 0x6e, 0xb4, 0x06, 0x54, 0x00, 0x00, 0x04, 0xc0, 0x3e, - 0x80, 0x06, 0x49, 0xff, 0xb7, 0xf0, 0x80, 0x20, 0x80, 0x08, 0x49, 0xfe, - 0x78, 0x4e, 0x02, 0x13, 0x00, 0xa4, 0x80, 0xe0, 0xe6, 0x26, 0xe9, 0x03, - 0x84, 0x01, 0xd5, 0x04, 0x9c, 0x49, 0x40, 0x05, 0x04, 0x36, 0x04, 0x13, - 0x00, 0x5d, 0xe6, 0x22, 0xe9, 0x0b, 0x00, 0x23, 0x01, 0x6c, 0x00, 0x13, - 0x01, 0x6d, 0xe2, 0x22, 0xe8, 0x02, 0x80, 0x22, 0x96, 0x48, 0x98, 0x49, - 0x98, 0x01, 0x00, 0x13, 0x02, 0x46, 0x3e, 0x2d, 0x27, 0x54, 0x38, 0x41, - 0x04, 0x00, 0x84, 0xa1, 0xdc, 0x0c, 0x98, 0x49, 0x98, 0x4d, 0x2e, 0x45, - 0x6a, 0x96, 0x94, 0x4c, 0x3e, 0x3d, 0x26, 0x54, 0x98, 0x4b, 0xa4, 0xc9, - 0x98, 0x04, 0xd5, 0x06, 0x2e, 0x15, 0x6a, 0x96, 0x02, 0x33, 0x00, 0xa1, - 0x98, 0x01, 0x42, 0x10, 0x0c, 0x24, 0x80, 0x08, 0x49, 0xfe, 0x78, 0x13, - 0xd5, 0x20, 0x2e, 0xa5, 0x6a, 0x97, 0x44, 0x10, 0x01, 0xe0, 0x80, 0x08, - 0x49, 0xfe, 0x78, 0x11, 0x04, 0x13, 0x00, 0x48, 0x8d, 0x46, 0x42, 0x15, - 0x04, 0x24, 0x80, 0xe0, 0x80, 0x08, 0x49, 0xfe, 0x78, 0x02, 0x81, 0x00, - 0x49, 0xfd, 0xe7, 0x4d, 0xc0, 0x0d, 0x2e, 0x25, 0x83, 0xe0, 0x3c, 0x1d, - 0x60, 0xf3, 0x94, 0x13, 0x98, 0x08, 0xa6, 0x45, 0x80, 0x08, 0x98, 0x49, - 0x49, 0xfe, 0x77, 0xf3, 0x81, 0x00, 0x40, 0x84, 0x10, 0x08, 0x93, 0x06, - 0x40, 0x84, 0x08, 0x08, 0x80, 0x07, 0x80, 0x28, 0x49, 0xfe, 0x78, 0x4b, - 0x40, 0x74, 0x00, 0x1b, 0x84, 0x21, 0x80, 0x07, 0x49, 0xfe, 0x77, 0xf9, - 0x92, 0x01, 0x94, 0x45, 0x92, 0x26, 0x94, 0x49, 0x80, 0x09, 0x49, 0xfd, - 0xf6, 0xc0, 0x00, 0x03, 0x02, 0x46, 0x80, 0x29, 0x50, 0x24, 0x80, 0x04, - 0x84, 0x60, 0x49, 0xfe, 0x43, 0xf2, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x80, 0xc0, 0x81, 0x01, 0xc0, 0x2a, - 0xc1, 0x29, 0x00, 0x00, 0x80, 0x09, 0x84, 0x23, 0x4c, 0x00, 0xc0, 0x25, - 0xb4, 0x28, 0xa7, 0xc8, 0x92, 0xe1, 0x5c, 0xf3, 0x80, 0x7c, 0xe9, 0x05, - 0xa6, 0x09, 0x40, 0x73, 0xa0, 0x08, 0x99, 0xf8, 0x44, 0x50, 0x00, 0x3c, - 0xdf, 0x0a, 0x80, 0x06, 0x49, 0xfd, 0x25, 0x57, 0xb4, 0x28, 0x80, 0x06, - 0x9c, 0x49, 0x49, 0xff, 0xff, 0x20, 0xd5, 0x12, 0x44, 0x50, 0x00, 0x13, - 0xdf, 0x0b, 0x80, 0x06, 0x9c, 0x49, 0x49, 0xff, 0xe4, 0x24, 0x2e, 0x05, - 0xb5, 0x01, 0xc8, 0x08, 0x10, 0x73, 0x02, 0x8e, 0xd5, 0x05, 0x80, 0x06, - 0x80, 0x28, 0x49, 0xfd, 0xa4, 0x5a, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x97, 0x80, 0x80, 0x06, 0x49, 0xfd, - 0xa0, 0x4e, 0xc0, 0x23, 0x00, 0x10, 0x02, 0x64, 0x44, 0x50, 0x00, 0x2e, - 0xd1, 0x03, 0x49, 0xfd, 0x25, 0x1c, 0x80, 0x06, 0x49, 0xfe, 0x43, 0x5b, - 0x92, 0x00, 0x3c, 0x1d, 0x6c, 0xfc, 0x44, 0x00, 0x00, 0x44, 0x42, 0x13, - 0x00, 0x73, 0x46, 0x00, 0x20, 0x18, 0x04, 0x10, 0x80, 0x0e, 0x2e, 0x35, - 0x24, 0x96, 0x00, 0x20, 0x81, 0x4c, 0x84, 0x21, 0x40, 0x10, 0x88, 0x0c, - 0x40, 0x10, 0x84, 0x05, 0x40, 0x10, 0x8c, 0x02, 0x3e, 0x15, 0x24, 0x96, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x01, 0xc0, 0x02, 0x46, 0x3e, 0x6d, 0xb3, 0xb4, 0x44, 0x80, 0x00, 0x44, - 0x42, 0x8e, 0x20, 0x24, 0x04, 0x13, 0x00, 0x0f, 0x84, 0x48, 0x88, 0x28, - 0x04, 0x10, 0x80, 0x0e, 0x81, 0x20, 0x00, 0x40, 0x81, 0x25, 0x4c, 0x41, - 0x40, 0x66, 0x00, 0x30, 0x81, 0x4c, 0x3e, 0x7d, 0x24, 0x96, 0x85, 0x41, - 0xa6, 0x78, 0x40, 0x35, 0x0c, 0x0c, 0x40, 0x31, 0x84, 0x02, 0xcb, 0x5a, - 0xb4, 0x40, 0x44, 0x11, 0x00, 0x00, 0x40, 0x21, 0x04, 0x02, 0xc2, 0x0f, - 0x3e, 0x1d, 0xa8, 0x16, 0xf3, 0x81, 0x49, 0xfd, 0xfc, 0xb8, 0xf1, 0x01, - 0x80, 0x09, 0x49, 0xff, 0xfe, 0xae, 0x00, 0x04, 0x82, 0x46, 0x49, 0xfe, - 0x43, 0x0c, 0xd5, 0x4c, 0x80, 0x22, 0x3e, 0x3d, 0xa8, 0x16, 0x80, 0x1c, - 0xf4, 0x81, 0x49, 0xfe, 0x43, 0x50, 0x04, 0x03, 0x00, 0x0f, 0x44, 0x20, - 0x00, 0x18, 0x88, 0x08, 0x04, 0x10, 0x00, 0x0e, 0x80, 0x1c, 0x10, 0x20, - 0x81, 0x25, 0x44, 0x10, 0x00, 0x3c, 0x04, 0x23, 0x00, 0x0f, 0x00, 0x93, - 0x80, 0x00, 0x88, 0x48, 0x04, 0x51, 0x00, 0x0e, 0x3e, 0x2d, 0xa8, 0x10, - 0x00, 0x32, 0x81, 0x4c, 0x40, 0x35, 0x0c, 0x0c, 0x40, 0x31, 0xa4, 0x04, - 0xae, 0xf8, 0x49, 0xfd, 0x61, 0x4c, 0x92, 0x00, 0xf4, 0x01, 0xc0, 0x24, - 0x04, 0x13, 0x00, 0x0f, 0x3e, 0x0d, 0x6b, 0x47, 0x88, 0x28, 0x04, 0x10, - 0x80, 0x0e, 0x10, 0x40, 0x81, 0x25, 0x04, 0x13, 0x00, 0x0f, 0xa6, 0xf8, - 0x89, 0x01, 0x04, 0x24, 0x00, 0x0e, 0xa6, 0x40, 0x00, 0x21, 0x01, 0x4c, - 0x58, 0x10, 0x80, 0x01, 0x40, 0xa5, 0x08, 0x0c, 0x40, 0xa5, 0x28, 0x05, - 0x40, 0xa5, 0x0c, 0x02, 0x10, 0xa3, 0x80, 0x00, 0xd5, 0x06, 0x3e, 0x0d, - 0x6b, 0x47, 0xa6, 0x40, 0x58, 0x10, 0x80, 0x01, 0xae, 0x40, 0xec, 0x0c, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x54, 0x80, - 0x00, 0xff, 0x80, 0x08, 0x49, 0xfd, 0x9f, 0x9d, 0x50, 0x60, 0x01, 0x3c, - 0x4e, 0x02, 0x00, 0x8e, 0xb4, 0x00, 0x84, 0x21, 0x50, 0xa3, 0x7f, 0xf4, - 0x4c, 0x00, 0xc0, 0x88, 0xa4, 0xb6, 0x84, 0xe0, 0x04, 0x13, 0x00, 0x43, - 0xac, 0xb7, 0x14, 0x73, 0x7f, 0xfd, 0x10, 0x73, 0x00, 0x12, 0x49, 0xfd, - 0xe6, 0x80, 0x3c, 0x0d, 0x6c, 0xfc, 0x44, 0x20, 0x00, 0x44, 0x3c, 0x3d, - 0x58, 0x6c, 0x42, 0x04, 0x08, 0x73, 0xa4, 0x73, 0x80, 0x47, 0xdd, 0x23, - 0x00, 0x03, 0x01, 0x0a, 0x80, 0x27, 0x49, 0xfe, 0x07, 0x94, 0xa4, 0xb3, - 0x00, 0x13, 0x00, 0x13, 0xa4, 0xf2, 0x81, 0x20, 0x49, 0xfe, 0x77, 0x03, - 0x80, 0x40, 0x00, 0x03, 0x00, 0x33, 0xb6, 0x46, 0x14, 0x73, 0x00, 0x0e, - 0x14, 0x23, 0x7f, 0xff, 0xc0, 0x18, 0x00, 0x03, 0x00, 0x3d, 0xc8, 0x15, - 0x04, 0x03, 0x00, 0x43, 0xa4, 0xf3, 0xc8, 0x02, 0xd5, 0x02, 0x98, 0xdb, - 0x84, 0x40, 0x80, 0x03, 0x46, 0x10, 0x00, 0xa4, 0x58, 0x10, 0x85, 0x64, - 0x50, 0x33, 0x7e, 0xc4, 0x80, 0x82, 0x84, 0xa1, 0x49, 0xfd, 0xf4, 0x4b, - 0x10, 0x03, 0x00, 0x3d, 0x84, 0x04, 0x14, 0x03, 0x7f, 0xb1, 0x3c, 0x2d, - 0x52, 0xc7, 0x00, 0x13, 0x01, 0x0a, 0x84, 0x0a, 0xdd, 0x22, 0x3c, 0x1d, - 0x5a, 0x2f, 0xa4, 0x33, 0xdd, 0x21, 0x04, 0x73, 0x00, 0x43, 0xcf, 0x2f, - 0x04, 0x03, 0x7f, 0xff, 0x04, 0x13, 0x7f, 0xf9, 0x8a, 0x09, 0x94, 0x04, - 0x92, 0x04, 0x94, 0x4c, 0xe2, 0x20, 0xe8, 0x25, 0x00, 0x03, 0x01, 0x0a, - 0x3e, 0x2d, 0x26, 0x54, 0x94, 0x05, 0x80, 0x2a, 0x98, 0x02, 0x44, 0x20, - 0x00, 0x20, 0x49, 0xff, 0x03, 0xe6, 0x02, 0x23, 0x7f, 0xf2, 0x85, 0x01, - 0x00, 0x13, 0x00, 0x13, 0xac, 0xb3, 0x12, 0x83, 0x00, 0x06, 0xad, 0xf2, - 0x12, 0x73, 0x00, 0x08, 0x80, 0x09, 0x80, 0x67, 0x49, 0xfe, 0x76, 0xaf, - 0x00, 0x13, 0x01, 0x0a, 0xb6, 0x06, 0x14, 0x03, 0x7f, 0xff, 0x3e, 0x0d, - 0x27, 0x54, 0x38, 0x80, 0x04, 0x08, 0xd5, 0x07, 0xa4, 0x73, 0x50, 0x03, - 0x7e, 0xc4, 0x84, 0x40, 0x49, 0xfd, 0xc4, 0x27, 0x3a, 0x6f, 0xa8, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x81, 0x00, 0x84, 0x04, 0x80, 0xe1, - 0x4c, 0x80, 0x40, 0x27, 0x49, 0xfd, 0x23, 0xa9, 0x80, 0xc0, 0xc0, 0x04, - 0x00, 0x00, 0x00, 0x33, 0xc8, 0x0e, 0x3c, 0x4d, 0x59, 0x09, 0xce, 0x03, - 0x80, 0x46, 0xd5, 0x03, 0x00, 0x23, 0x00, 0x33, 0x2e, 0x35, 0x6b, 0x28, - 0x80, 0x26, 0x44, 0x00, 0x8f, 0xf1, 0xdd, 0x24, 0x2e, 0x15, 0xe7, 0xc1, - 0xc1, 0x02, 0xd5, 0x0b, 0x2e, 0x25, 0x24, 0x73, 0x84, 0xa1, 0xda, 0x0a, - 0x00, 0x23, 0x00, 0x32, 0x84, 0xa2, 0xda, 0x06, 0x3e, 0x15, 0x24, 0x73, - 0x50, 0x13, 0xa0, 0x00, 0xd5, 0x02, 0x80, 0x27, 0x80, 0x08, 0x49, 0xfd, - 0x58, 0xf4, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xdc, 0x2e, 0x15, 0xe7, 0xc1, 0xc1, 0x0a, 0x2e, 0x05, - 0x83, 0xf0, 0xc0, 0x03, 0x84, 0x21, 0xd5, 0x05, 0x2e, 0x15, 0x24, 0x6b, - 0x40, 0x10, 0x04, 0x06, 0x2e, 0x04, 0xa2, 0x9c, 0x84, 0x41, 0xf0, 0x86, - 0x3c, 0x5d, 0x6c, 0xe0, 0xda, 0x05, 0x84, 0xc0, 0x81, 0x46, 0x48, 0x00, - 0x01, 0x9e, 0x96, 0x48, 0xf1, 0x81, 0xc1, 0x06, 0x3c, 0x0d, 0x79, 0xf2, - 0x00, 0x90, 0x00, 0x2c, 0xd5, 0x0d, 0xf4, 0x06, 0x2e, 0x05, 0x6b, 0x32, - 0x9f, 0x61, 0xd8, 0x05, 0x84, 0x01, 0xf0, 0x84, 0x81, 0x20, 0xd5, 0x06, - 0x9c, 0x01, 0x54, 0x90, 0x00, 0xff, 0x14, 0x9f, 0x80, 0x04, 0x84, 0x21, - 0x85, 0x00, 0xb6, 0x3f, 0xf1, 0x87, 0xf1, 0x85, 0xf1, 0x83, 0x14, 0x8f, - 0x80, 0x02, 0x83, 0x88, 0x81, 0x48, 0x2e, 0x25, 0xe7, 0xc1, 0xc2, 0x0c, - 0xf0, 0x01, 0xc8, 0x0a, 0x3c, 0x2d, 0x79, 0xf2, 0x00, 0x21, 0x00, 0x2c, - 0x40, 0x21, 0x24, 0x03, 0x5c, 0x71, 0x00, 0x01, 0xd5, 0x02, 0x84, 0xe0, - 0x80, 0x09, 0x49, 0xfd, 0x9e, 0x8a, 0x80, 0xc0, 0x4e, 0x02, 0x00, 0xdc, - 0x04, 0x20, 0x00, 0x92, 0x4e, 0x23, 0x00, 0xd8, 0xb4, 0x40, 0x54, 0x31, - 0x00, 0x20, 0x4e, 0x33, 0x00, 0xd3, 0x4e, 0x73, 0x00, 0xd1, 0x54, 0x21, - 0x00, 0x04, 0x4e, 0x23, 0x00, 0xcd, 0x04, 0x40, 0x00, 0x46, 0x4e, 0x43, - 0x00, 0xc9, 0x3c, 0x2d, 0x58, 0x59, 0xf1, 0x01, 0xdd, 0x22, 0xb4, 0x46, - 0x54, 0x21, 0x1b, 0xe1, 0x4e, 0x22, 0x00, 0xbf, 0x22, 0x43, 0x01, 0x15, - 0x4e, 0x47, 0x00, 0x07, 0x2e, 0x25, 0x6b, 0x33, 0x9a, 0xa2, 0x12, 0x23, - 0x01, 0x15, 0x22, 0x43, 0x01, 0x0f, 0x4e, 0x47, 0x00, 0x07, 0x2e, 0x25, - 0x6b, 0x33, 0x9a, 0xa2, 0x12, 0x23, 0x01, 0x0f, 0x44, 0x20, 0x00, 0x44, - 0x42, 0x74, 0x88, 0x24, 0x3c, 0x2d, 0x6c, 0xfc, 0xf4, 0x05, 0x98, 0x97, - 0x04, 0x21, 0x00, 0x0e, 0xb4, 0x66, 0x00, 0x21, 0x01, 0x67, 0x96, 0xdc, - 0x40, 0x41, 0x08, 0x1a, 0xf2, 0x03, 0x84, 0x03, 0x40, 0x21, 0x8c, 0x1a, - 0x80, 0x29, 0xf4, 0x85, 0xf2, 0x83, 0x49, 0xfe, 0x98, 0x62, 0xc0, 0x16, - 0x3c, 0x2d, 0x6c, 0xfc, 0x98, 0x97, 0x04, 0x21, 0x00, 0x0e, 0x00, 0x21, - 0x01, 0x46, 0xc2, 0x10, 0x2e, 0x24, 0xa2, 0x9c, 0x2e, 0x34, 0xa2, 0x9f, - 0x98, 0x92, 0x9c, 0x93, 0x98, 0x9a, 0x98, 0x9a, 0x96, 0x10, 0x80, 0x29, - 0x49, 0xfe, 0x98, 0x4d, 0xc8, 0x03, 0x84, 0x80, 0xf4, 0x87, 0xb4, 0x1f, - 0xc0, 0x17, 0x49, 0xff, 0xb5, 0x06, 0x84, 0x3f, 0x80, 0x60, 0x4c, 0x00, - 0x80, 0x10, 0x3e, 0x2d, 0x29, 0x1c, 0x38, 0x21, 0x26, 0x02, 0x4c, 0x20, - 0x80, 0x0a, 0x80, 0x02, 0x80, 0x23, 0x49, 0xfe, 0x75, 0xbe, 0xc8, 0x04, - 0x84, 0x41, 0xb6, 0x5f, 0xd5, 0x03, 0x84, 0x80, 0xb6, 0x9f, 0x4e, 0xa3, - 0x00, 0x62, 0x80, 0x06, 0x49, 0xfd, 0xb5, 0x69, 0x3c, 0x2d, 0x6c, 0xfc, - 0xf0, 0x82, 0x98, 0x97, 0x04, 0x21, 0x00, 0x0e, 0x00, 0x21, 0x01, 0x50, - 0xca, 0x14, 0x22, 0x23, 0x01, 0x15, 0x4e, 0x27, 0x00, 0x0f, 0xc0, 0x05, - 0x22, 0x23, 0x01, 0x0f, 0x4e, 0x27, 0x00, 0x0a, 0x80, 0x06, 0x49, 0xff, - 0xf1, 0x56, 0x5c, 0xf0, 0x02, 0x80, 0xe8, 0x03, 0x84, 0x40, 0xd5, 0x02, - 0x84, 0x41, 0xc2, 0x42, 0x3d, 0xcd, 0x6c, 0xfc, 0xf1, 0x01, 0x41, 0xce, - 0x1c, 0x00, 0xc9, 0x03, 0x3e, 0x95, 0x6b, 0x32, 0xba, 0x0e, 0x00, 0x21, - 0x01, 0x50, 0xc2, 0x24, 0x00, 0x23, 0x02, 0x7f, 0xc2, 0x16, 0xba, 0x09, - 0x84, 0xa3, 0x00, 0x21, 0x00, 0x09, 0xd2, 0x11, 0x00, 0x23, 0x02, 0x7d, - 0x54, 0x21, 0x00, 0x08, 0xca, 0x0c, 0x80, 0x1c, 0x49, 0xfd, 0xbc, 0x8d, - 0x00, 0x23, 0x02, 0x7d, 0x81, 0x06, 0x58, 0x21, 0x00, 0x08, 0x10, 0x23, - 0x02, 0x7d, 0xd5, 0x10, 0x3c, 0x2d, 0x58, 0x58, 0x80, 0x1c, 0xdd, 0x22, - 0x84, 0x41, 0x40, 0xa1, 0x00, 0x1b, 0x81, 0x06, 0x41, 0xc0, 0x00, 0x1a, - 0xd5, 0x14, 0xf0, 0x02, 0xc0, 0x05, 0xb8, 0x89, 0x81, 0x06, 0x85, 0x41, - 0xd5, 0x0e, 0x80, 0x1c, 0x49, 0xfe, 0x72, 0x8d, 0xba, 0x09, 0x00, 0x13, - 0x01, 0x24, 0x84, 0x62, 0x10, 0x11, 0x00, 0x08, 0x3e, 0x35, 0x6b, 0x33, - 0xd5, 0xf2, 0x81, 0x06, 0xf2, 0x06, 0x8d, 0x21, 0x54, 0x94, 0x80, 0xff, - 0x40, 0x34, 0x88, 0x06, 0xf4, 0x04, 0x84, 0x41, 0x40, 0x91, 0x0c, 0x1a, - 0x4c, 0x92, 0x00, 0x05, 0xf0, 0x01, 0x4e, 0x02, 0xff, 0x04, 0x80, 0xdc, - 0x4e, 0xa3, 0x00, 0x24, 0x80, 0x0a, 0x49, 0xfd, 0xb7, 0x82, 0x80, 0x40, - 0xc0, 0x11, 0x2e, 0x15, 0xb4, 0xbe, 0x3c, 0x6d, 0x6c, 0xfc, 0x44, 0x00, - 0x00, 0x44, 0x42, 0x60, 0x80, 0x73, 0x84, 0x22, 0x14, 0x23, 0x00, 0x09, - 0x85, 0x41, 0x3e, 0x15, 0x6b, 0x33, 0x48, 0x00, 0x00, 0x67, 0xb4, 0x3f, - 0xc1, 0x64, 0xf2, 0x01, 0xc2, 0x04, 0x2e, 0x25, 0x24, 0x6b, 0xca, 0x5f, - 0x3c, 0x2d, 0x58, 0x69, 0xf1, 0x03, 0x80, 0x08, 0xdd, 0x22, 0xd5, 0x59, - 0x00, 0x0e, 0x00, 0x2c, 0x49, 0xfd, 0x9d, 0x75, 0x80, 0xe0, 0xc0, 0x38, - 0x2e, 0x25, 0x24, 0x6b, 0xc2, 0x22, 0x3c, 0x2d, 0x79, 0xf2, 0x00, 0x5e, - 0x00, 0x2c, 0x00, 0x21, 0x00, 0x2c, 0xda, 0x1b, 0x22, 0x20, 0x01, 0x15, - 0x4e, 0x26, 0x00, 0x25, 0x3c, 0x2d, 0x49, 0x0c, 0xc2, 0x05, 0x2e, 0x25, - 0x24, 0x6a, 0x84, 0xa1, 0xda, 0x0a, 0x3c, 0x2d, 0x5a, 0x63, 0x80, 0x07, - 0xdd, 0x22, 0x40, 0x20, 0x04, 0x09, 0x12, 0x23, 0x81, 0x15, 0xd5, 0x14, - 0x3c, 0x2d, 0x5a, 0x63, 0xdd, 0x22, 0x12, 0x03, 0x81, 0x15, 0xd5, 0x0e, - 0xf0, 0x02, 0xc8, 0x0e, 0xba, 0x0e, 0x00, 0x21, 0x01, 0x50, 0xca, 0x0e, - 0x3c, 0x2d, 0x5a, 0x63, 0x80, 0x07, 0xdd, 0x22, 0x12, 0x03, 0x81, 0x15, - 0xd5, 0x07, 0xf1, 0x02, 0xc1, 0x05, 0x02, 0x23, 0x80, 0x48, 0x12, 0x23, - 0x81, 0x0f, 0xf4, 0x05, 0xcc, 0x03, 0xf0, 0x07, 0xc0, 0x18, 0xb4, 0x3f, - 0xc1, 0x16, 0xf2, 0x01, 0xc2, 0x04, 0x2e, 0x25, 0x24, 0x6b, 0xca, 0x06, - 0x3c, 0x2d, 0x58, 0x69, 0xf1, 0x03, 0x80, 0x08, 0xdd, 0x22, 0x2e, 0x25, - 0xe7, 0xfc, 0x84, 0xa1, 0xda, 0x08, 0x3c, 0x2d, 0x7a, 0x04, 0x84, 0x20, - 0x5c, 0x21, 0x00, 0x0f, 0x40, 0xa0, 0x88, 0x1a, 0xce, 0x03, 0x80, 0x66, - 0xd5, 0x03, 0x00, 0x33, 0x00, 0x2c, 0x40, 0x65, 0x28, 0x1a, 0x84, 0x06, - 0x84, 0x21, 0x44, 0x20, 0x74, 0xc0, 0x80, 0x8a, 0x49, 0xfe, 0x80, 0x2f, - 0x80, 0x06, 0xec, 0x24, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x97, 0x80, 0x49, 0xff, 0xcb, 0xc1, 0x80, 0x06, 0x49, 0xfd, - 0x53, 0x58, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xec, 0x84, 0xe0, 0x81, 0x00, 0x84, 0x0c, 0x80, 0xc1, - 0x55, 0xc1, 0x00, 0xff, 0x10, 0x7f, 0x80, 0x0f, 0x4c, 0x10, 0x01, 0x10, - 0xe6, 0x2d, 0xe8, 0x0b, 0x84, 0x2a, 0x4c, 0x60, 0x80, 0xf4, 0xe6, 0xcb, - 0x4e, 0xf2, 0x01, 0x13, 0xe6, 0xc7, 0x4e, 0xf2, 0x01, 0x0e, 0xd5, 0x09, - 0xe6, 0x2f, 0x4e, 0xf3, 0x00, 0xea, 0xe6, 0x32, 0x4e, 0xf3, 0x01, 0x18, - 0x48, 0x00, 0x01, 0x05, 0x44, 0x70, 0x00, 0x18, 0x84, 0x06, 0x44, 0x12, - 0x00, 0x00, 0x44, 0x20, 0x75, 0x8a, 0x80, 0x7c, 0x80, 0x86, 0x42, 0x73, - 0x1c, 0x24, 0x49, 0xfe, 0x81, 0xe6, 0x3e, 0x3d, 0x82, 0xc0, 0x80, 0x08, - 0x80, 0x26, 0x50, 0x2f, 0x80, 0x0f, 0x99, 0xfb, 0x49, 0xfd, 0x4a, 0xe7, - 0x81, 0x40, 0x80, 0x08, 0x49, 0xfd, 0x4a, 0x9d, 0xc0, 0x10, 0x00, 0x03, - 0x80, 0x0e, 0xc8, 0x0d, 0x00, 0x04, 0x00, 0x3c, 0xc0, 0x0a, 0x2e, 0x05, - 0xe7, 0xc1, 0xc0, 0x07, 0x3c, 0x1d, 0x60, 0xf3, 0x2e, 0x05, 0x83, 0xe0, - 0x38, 0xa0, 0x83, 0x01, 0x84, 0xa5, 0xde, 0x08, 0x2e, 0x05, 0x83, 0x2c, - 0x96, 0x04, 0xc0, 0x04, 0x93, 0x41, 0x40, 0xa5, 0x00, 0x13, 0xa0, 0xfc, - 0x80, 0x27, 0x9c, 0xba, 0x80, 0x0a, 0xdd, 0x23, 0x44, 0x57, 0x79, 0xc0, - 0xf5, 0x81, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, 0x75, 0x8a, 0x80, 0x6a, - 0x80, 0x86, 0x81, 0x20, 0x84, 0x06, 0xdd, 0x25, 0xa4, 0xf8, 0xa5, 0x39, - 0xf5, 0x01, 0x84, 0x06, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, 0x75, 0x8a, - 0xdd, 0x25, 0x00, 0x0f, 0x80, 0x0f, 0x84, 0xa1, 0xd8, 0x04, 0x84, 0x40, - 0x3c, 0x2f, 0x6d, 0xf8, 0x4e, 0x93, 0x00, 0xfe, 0x00, 0x13, 0x80, 0x0e, - 0x4e, 0x12, 0x00, 0xfa, 0xc0, 0x04, 0x02, 0x24, 0x00, 0x16, 0xac, 0xb9, - 0x84, 0x62, 0x4c, 0x61, 0xc0, 0x2a, 0x00, 0x0f, 0x80, 0x0f, 0xc8, 0x35, - 0x2e, 0x05, 0x83, 0x2c, 0x96, 0x04, 0xc0, 0x0e, 0x3c, 0x12, 0xdb, 0xf0, - 0x3c, 0x02, 0xdb, 0xee, 0x40, 0x10, 0x8c, 0x0c, 0xe0, 0x20, 0xe9, 0x06, - 0xa4, 0x78, 0x84, 0x0b, 0x42, 0x00, 0x80, 0x24, 0xd5, 0x23, 0x2e, 0x05, - 0x83, 0x44, 0x96, 0x04, 0xc0, 0x0b, 0x3c, 0x02, 0xdb, 0xf0, 0x3c, 0x12, - 0xdb, 0xee, 0x98, 0x00, 0xe0, 0x01, 0xe9, 0x04, 0xa4, 0x38, 0x94, 0x02, - 0xd5, 0x15, 0x3c, 0x32, 0xdb, 0xee, 0xa4, 0xb8, 0x3c, 0x12, 0xdb, 0xf0, - 0xd5, 0x0b, 0x84, 0xa3, 0xde, 0x0e, 0x00, 0x0f, 0x80, 0x0f, 0xc8, 0x0b, - 0x3c, 0x32, 0xdc, 0x00, 0xa4, 0xb8, 0x3c, 0x12, 0xdc, 0x01, 0x42, 0x01, - 0x88, 0x24, 0x40, 0x00, 0x04, 0x36, 0xac, 0x39, 0x80, 0x47, 0x80, 0x08, - 0x80, 0x26, 0x49, 0xff, 0xc1, 0x08, 0x4e, 0x63, 0x00, 0xb5, 0x4f, 0xc2, - 0x00, 0xb3, 0x3c, 0x0d, 0x66, 0xfb, 0x3c, 0x1d, 0x66, 0xfc, 0x9c, 0x02, - 0x84, 0x41, 0x96, 0x01, 0x4c, 0x11, 0x40, 0x05, 0x98, 0x00, 0x9c, 0x02, - 0x96, 0x01, 0x3e, 0x1d, 0x9b, 0xe0, 0xa0, 0xcf, 0x84, 0xa1, 0xdb, 0x05, - 0xa0, 0x4e, 0x98, 0x49, 0x9c, 0x4a, 0xd5, 0x02, 0xa0, 0x4e, 0x98, 0x01, - 0x96, 0x01, 0x4e, 0xa2, 0x00, 0x05, 0xe2, 0x0a, 0x4e, 0xf2, 0x00, 0x96, - 0x3e, 0x6d, 0x82, 0xc0, 0x04, 0x33, 0x00, 0x0a, 0x80, 0x0a, 0x50, 0x13, - 0x00, 0x18, 0x50, 0x23, 0x00, 0x1a, 0xdd, 0x23, 0x4e, 0x03, 0x00, 0x8a, - 0x00, 0x03, 0x00, 0x24, 0x54, 0x10, 0x00, 0x02, 0xc9, 0x0a, 0x58, 0x00, - 0x00, 0x02, 0x10, 0x03, 0x00, 0x24, 0x00, 0x04, 0x00, 0x3d, 0x9c, 0x01, - 0x10, 0x04, 0x00, 0x3d, 0x84, 0x01, 0x10, 0x04, 0x00, 0x3e, 0x84, 0x21, - 0x80, 0x08, 0x3e, 0x2d, 0x82, 0xd8, 0x49, 0xff, 0xc0, 0xc4, 0x48, 0x00, - 0x00, 0x71, 0x84, 0x00, 0x49, 0xfe, 0x8e, 0x81, 0x49, 0xff, 0xb2, 0xdf, - 0x84, 0x7f, 0x3c, 0x3f, 0x65, 0x24, 0x80, 0x1c, 0x84, 0x21, 0x49, 0xfe, - 0x00, 0x9e, 0x84, 0x00, 0x10, 0x04, 0x00, 0x40, 0x96, 0xf1, 0x80, 0x9c, - 0x84, 0x06, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, 0x75, 0x88, 0xd5, 0x08, - 0x80, 0x81, 0x84, 0x06, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, 0x75, 0x89, - 0x84, 0x60, 0x49, 0xfe, 0x80, 0xf0, 0x85, 0x20, 0xd5, 0x4e, 0x2e, 0x05, - 0xb4, 0xbe, 0x84, 0x21, 0x49, 0xfe, 0x00, 0x83, 0x10, 0x74, 0x00, 0x40, - 0x84, 0x06, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, 0x75, 0x8d, 0x84, 0x60, - 0x84, 0x8b, 0xd5, 0xee, 0xb4, 0x68, 0x84, 0xa1, 0x10, 0x74, 0x00, 0x40, - 0xdb, 0x07, 0x00, 0x04, 0x00, 0x3c, 0x00, 0x14, 0x00, 0x3b, 0x4c, 0x10, - 0x00, 0x0a, 0x2e, 0x15, 0x83, 0x2c, 0x96, 0x4c, 0xc9, 0x05, 0x2e, 0x05, - 0x83, 0x44, 0x96, 0x04, 0xc0, 0x0c, 0x2e, 0x04, 0xa6, 0x50, 0xc0, 0x1e, - 0x84, 0x00, 0x46, 0x10, 0x00, 0x90, 0x58, 0x10, 0x8c, 0xcc, 0x49, 0xff, - 0x4a, 0x54, 0xd5, 0x13, 0x3c, 0x7d, 0x60, 0xed, 0x54, 0x73, 0x80, 0x02, - 0xcf, 0x11, 0x3c, 0x1d, 0x5a, 0x80, 0x84, 0x01, 0xdd, 0x21, 0x2e, 0x15, - 0x24, 0x84, 0x56, 0x10, 0x80, 0x02, 0x40, 0x03, 0x84, 0x1a, 0x84, 0xaf, - 0xde, 0x05, 0xc0, 0x04, 0x44, 0x90, 0x00, 0x1f, 0xd5, 0x02, 0x85, 0x20, - 0x80, 0x86, 0x84, 0x06, 0x44, 0x12, 0x00, 0x00, 0x44, 0x20, 0x75, 0x8c, - 0x40, 0x34, 0x80, 0x13, 0x49, 0xfe, 0x80, 0xa1, 0x80, 0x09, 0xec, 0x14, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x80, 0xe0, 0x80, 0xc1, 0x49, 0xfd, 0x21, 0xff, 0x92, 0x00, 0x00, 0x03, - 0x82, 0x46, 0xa7, 0xb1, 0x3e, 0x2d, 0x25, 0xb0, 0x38, 0x61, 0x00, 0x08, - 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x97, 0xfb, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, - 0x81, 0x01, 0x80, 0xc0, 0x00, 0x10, 0x02, 0x46, 0x50, 0x04, 0x00, 0x01, - 0xa6, 0xc0, 0x3e, 0x2d, 0x25, 0xb0, 0x38, 0x31, 0x04, 0x08, 0x00, 0x74, - 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x9e, 0x39, 0x96, 0x40, 0xe6, 0x22, - 0xe8, 0x0a, 0x94, 0x03, 0x50, 0x10, 0x01, 0x98, 0x98, 0x71, 0x84, 0x08, - 0x50, 0x24, 0x00, 0x02, 0x49, 0xfd, 0xf1, 0x39, 0x00, 0x53, 0x02, 0x59, - 0x84, 0x21, 0xd9, 0x21, 0x3c, 0x2d, 0x58, 0x72, 0x46, 0x30, 0x08, 0x00, - 0x40, 0x21, 0x0c, 0x02, 0xca, 0x1f, 0xe2, 0xe9, 0xe8, 0x09, 0xe6, 0xe2, - 0xe8, 0x07, 0x98, 0x79, 0x96, 0x48, 0x80, 0x06, 0x49, 0xfd, 0x22, 0x15, - 0xd5, 0x15, 0x44, 0x00, 0x00, 0x3d, 0x49, 0xfc, 0xd3, 0x86, 0xc0, 0x06, - 0x80, 0x06, 0x50, 0x13, 0x01, 0x98, 0x49, 0xff, 0xff, 0xba, 0x80, 0x06, - 0x84, 0x20, 0x49, 0xfd, 0x2b, 0x46, 0xd5, 0x06, 0x80, 0x06, 0x80, 0x28, - 0x49, 0xfd, 0x32, 0x71, 0xd5, 0x14, 0xb4, 0x06, 0x84, 0xa1, 0xd0, 0x0a, - 0x84, 0xa4, 0xd0, 0x08, 0x84, 0xa8, 0xd0, 0x06, 0x8f, 0x21, 0xe0, 0xe9, - 0xe8, 0x03, 0x84, 0x00, 0xd5, 0x08, 0x00, 0x13, 0x02, 0x5b, 0x84, 0x00, - 0x58, 0x10, 0x80, 0x04, 0x10, 0x13, 0x02, 0x5b, 0xec, 0x04, 0x3a, 0x6f, - 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, - 0x2e, 0x35, 0xe7, 0xc1, 0x80, 0xc1, 0x97, 0xc0, 0xc3, 0x1d, 0x3c, 0x0d, - 0x79, 0xf2, 0x00, 0x50, 0x00, 0x2c, 0xdf, 0x18, 0x80, 0x07, 0x49, 0xfd, - 0x9a, 0xfc, 0x81, 0x00, 0xc0, 0x13, 0x3c, 0x1d, 0x49, 0x0c, 0xc1, 0x05, - 0x2e, 0x15, 0x24, 0x6a, 0x84, 0xa1, 0xd9, 0x07, 0x3c, 0x1d, 0x5a, 0x63, - 0x80, 0x08, 0xdd, 0x21, 0x92, 0x01, 0xd5, 0x04, 0x3c, 0x1d, 0x5a, 0x63, - 0xdd, 0x21, 0x12, 0x04, 0x01, 0x15, 0x80, 0x07, 0x80, 0x26, 0x49, 0xfd, - 0xa7, 0x16, 0x81, 0x20, 0xc7, 0x38, 0x80, 0x07, 0x49, 0xfd, 0x9a, 0xdf, - 0x81, 0x00, 0xc0, 0x33, 0x04, 0x10, 0x00, 0x92, 0xc9, 0x30, 0x80, 0x01, - 0x49, 0xfe, 0x8d, 0x5d, 0x3e, 0x1d, 0x29, 0x1c, 0x38, 0x00, 0x9e, 0x0a, - 0xc6, 0x28, 0x9e, 0x35, 0xe6, 0x04, 0xe8, 0x05, 0x04, 0x04, 0x00, 0x06, - 0xc8, 0x07, 0xd5, 0x21, 0x44, 0x50, 0x00, 0x17, 0xd6, 0x1e, 0x84, 0xac, - 0xd6, 0x1c, 0x84, 0xad, 0xd6, 0x1a, 0x8c, 0xb9, 0xd6, 0x18, 0x8c, 0xb1, - 0xd6, 0x16, 0x8e, 0xab, 0xd6, 0x14, 0x8c, 0xb1, 0xd6, 0x12, 0x00, 0x14, - 0x02, 0x46, 0x2e, 0x35, 0x6a, 0x79, 0x3c, 0x6d, 0x6c, 0xfc, 0x3e, 0x2d, - 0x29, 0x64, 0x9c, 0x2f, 0x38, 0x31, 0x04, 0x08, 0x42, 0x63, 0x80, 0x73, - 0x84, 0x00, 0x49, 0xfe, 0x8d, 0x32, 0xb6, 0x06, 0x80, 0x09, 0xec, 0x04, - 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xa1, 0x2d, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xc0, 0xa7, 0xc8, 0x80, 0xc0, - 0x00, 0x80, 0x02, 0x82, 0x84, 0x01, 0x4c, 0x70, 0x00, 0x08, 0x84, 0xa3, - 0xd7, 0x05, 0x84, 0xa5, 0xd7, 0x03, 0x8c, 0x1d, 0xd5, 0x45, 0x2e, 0x15, - 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, 0xc0, 0x0f, - 0xe6, 0xe2, 0xe9, 0x0d, 0x2e, 0x05, 0xb5, 0x3a, 0x96, 0x04, 0xc8, 0x03, - 0x84, 0x21, 0xd5, 0x08, 0x3c, 0x1d, 0x58, 0x5a, 0x80, 0x06, 0xdd, 0x21, - 0x96, 0x40, 0xd5, 0x02, 0x80, 0x27, 0x04, 0x23, 0x00, 0x93, 0x80, 0x06, - 0x49, 0xfd, 0xc2, 0xa1, 0x00, 0x53, 0x02, 0x82, 0xd7, 0x07, 0x10, 0x73, - 0x02, 0x82, 0x80, 0x27, 0x80, 0x06, 0x49, 0xfd, 0xc4, 0x72, 0x00, 0x33, - 0x02, 0x82, 0x80, 0x03, 0x4c, 0x04, 0x00, 0x1c, 0xe3, 0x00, 0xe8, 0x19, - 0x02, 0x13, 0x01, 0x1b, 0x84, 0xaa, 0xd9, 0x15, 0x00, 0x43, 0x02, 0x48, - 0x10, 0x03, 0x02, 0x83, 0x10, 0x43, 0x02, 0x5f, 0x00, 0x03, 0x02, 0x46, - 0x80, 0x3f, 0x10, 0x3f, 0x80, 0x0f, 0x44, 0x30, 0x00, 0x2e, 0x10, 0x4f, - 0x80, 0x08, 0x12, 0x3f, 0x80, 0x0e, 0x49, 0xfd, 0x5a, 0x82, 0x92, 0x00, - 0x84, 0x00, 0xec, 0x40, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xec, 0x50, 0x0f, 0x80, 0x0c, 0x85, 0x40, 0x49, 0xfa, - 0xc5, 0x4e, 0x14, 0xaf, 0x80, 0x01, 0x45, 0xc0, 0x00, 0x14, 0xd5, 0x39, - 0x2e, 0x65, 0x6a, 0x91, 0x3e, 0x0d, 0xa1, 0xe4, 0x42, 0x63, 0x70, 0x24, - 0x99, 0xb0, 0xa1, 0xf2, 0x04, 0x83, 0x00, 0x01, 0xc7, 0x04, 0x04, 0xa3, - 0x00, 0x03, 0xd5, 0x05, 0x4e, 0x82, 0x00, 0x04, 0xa0, 0x73, 0xf1, 0x81, - 0xa6, 0x72, 0xf0, 0x03, 0x3e, 0x15, 0x6a, 0x91, 0x49, 0xfa, 0xc5, 0x47, - 0xa6, 0x71, 0x84, 0x41, 0x94, 0x14, 0x40, 0x20, 0x04, 0x1b, 0xae, 0xb0, - 0x4e, 0x82, 0x00, 0x05, 0xf0, 0x01, 0xdd, 0x28, 0xd5, 0x08, 0xc7, 0x04, - 0x80, 0x0a, 0xdd, 0x27, 0xd5, 0x04, 0x8c, 0x13, 0x49, 0xfc, 0xd1, 0xed, - 0x50, 0x0f, 0x80, 0x0c, 0x49, 0xfa, 0xc5, 0x1b, 0xa6, 0x70, 0x44, 0x50, - 0x00, 0x10, 0xd9, 0x07, 0x84, 0x20, 0xae, 0x70, 0xa8, 0x71, 0xa8, 0x72, - 0xa8, 0x73, 0xae, 0x72, 0x2e, 0x15, 0x6a, 0x91, 0xc1, 0x0a, 0x42, 0x10, - 0xf0, 0x24, 0x3e, 0x0d, 0xa1, 0xe4, 0x98, 0x48, 0xa0, 0x0c, 0x49, 0xfe, - 0x71, 0xb4, 0xc8, 0xbd, 0xf0, 0x03, 0x49, 0xfa, 0xc5, 0x18, 0xec, 0x14, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0x8c, - 0x80, 0xc0, 0xc8, 0x04, 0x44, 0x00, 0x00, 0x12, 0xd5, 0x62, 0x02, 0x00, - 0x01, 0x0d, 0x84, 0x27, 0x4c, 0x00, 0x80, 0x33, 0x50, 0x73, 0x02, 0x40, - 0x80, 0x07, 0x49, 0xfd, 0x6f, 0x78, 0xc8, 0x04, 0x44, 0x00, 0x00, 0x17, - 0xd5, 0x54, 0x04, 0x03, 0x00, 0x08, 0xc0, 0x5b, 0x00, 0x03, 0x02, 0x69, - 0xc8, 0x02, 0xd5, 0x4b, 0x2e, 0x15, 0xb3, 0xde, 0x54, 0x10, 0x86, 0x08, - 0xc1, 0x52, 0x2e, 0x05, 0xb3, 0xe0, 0x96, 0x04, 0xc0, 0x4e, 0x00, 0x03, - 0x01, 0xae, 0x54, 0x00, 0x00, 0x08, 0xc0, 0x49, 0x00, 0x03, 0x01, 0x98, - 0x96, 0x04, 0xc0, 0x45, 0x00, 0x03, 0x01, 0xad, 0x54, 0x00, 0x00, 0x04, - 0xc0, 0x08, 0x80, 0x07, 0x84, 0x20, 0x50, 0x2f, 0x80, 0x04, 0x49, 0xfd, - 0xd0, 0xd2, 0xd5, 0x39, 0x00, 0x03, 0x02, 0x64, 0xc8, 0x36, 0x84, 0x0c, - 0xd5, 0x2a, 0x00, 0x23, 0x02, 0x8d, 0xca, 0x0c, 0x3c, 0x0d, 0x5a, 0xf6, - 0x44, 0x15, 0x50, 0x34, 0x80, 0x66, 0x80, 0x82, 0x84, 0xa1, 0x49, 0xfd, - 0xee, 0x98, 0x10, 0x03, 0x02, 0x8d, 0x84, 0x00, 0x44, 0x10, 0x04, 0x11, - 0x49, 0xfc, 0xd1, 0x63, 0x00, 0x13, 0x02, 0x48, 0x84, 0x0a, 0x10, 0x03, - 0x02, 0x61, 0x10, 0x13, 0x02, 0x60, 0x80, 0x06, 0x49, 0xfd, 0x6b, 0xeb, - 0xc8, 0x11, 0x84, 0x06, 0x10, 0x03, 0x02, 0x61, 0x00, 0x13, 0x02, 0x48, - 0x80, 0x06, 0x49, 0xfd, 0x6c, 0x38, 0xd5, 0x08, 0x44, 0x00, 0x00, 0x23, - 0x44, 0x10, 0x04, 0x11, 0x49, 0xfc, 0xd1, 0x49, 0x92, 0x00, 0x84, 0x00, - 0xec, 0x74, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x04, 0x03, 0x00, 0x98, - 0x40, 0x00, 0x20, 0x08, 0x92, 0x10, 0xc0, 0xc8, 0xd5, 0xee, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x04, 0x20, 0x00, 0x25, 0x80, 0xc0, 0x54, 0x21, - 0x00, 0x02, 0xc2, 0x06, 0x3c, 0x2d, 0x58, 0x46, 0xdd, 0x22, 0x80, 0xe0, - 0xd5, 0x16, 0x49, 0xfd, 0x7b, 0x04, 0x80, 0xe0, 0xc8, 0x12, 0x80, 0x06, - 0x49, 0xfd, 0xcd, 0xbf, 0xc8, 0x0e, 0x00, 0x23, 0x02, 0x46, 0x84, 0x0c, - 0x42, 0x21, 0x00, 0x24, 0x3e, 0x3d, 0x29, 0xac, 0x50, 0x13, 0x02, 0x04, - 0x98, 0x93, 0x49, 0xfd, 0xef, 0x3c, 0x92, 0x00, 0x80, 0x07, 0xec, 0x04, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xdc, - 0x04, 0x20, 0x00, 0x25, 0x97, 0xc8, 0x54, 0x11, 0x00, 0x02, 0x80, 0xc0, - 0xc1, 0x0d, 0x58, 0x21, 0x00, 0x04, 0x84, 0x20, 0x10, 0x10, 0x02, 0x93, - 0x14, 0x20, 0x00, 0x25, 0x3c, 0x2d, 0x58, 0x3d, 0x80, 0x27, 0xdd, 0x22, - 0xd5, 0x3f, 0x80, 0x1f, 0x49, 0xfe, 0x7b, 0xb1, 0x44, 0x00, 0x00, 0x10, - 0x80, 0x5f, 0x50, 0x13, 0x01, 0xb0, 0x49, 0xfd, 0xef, 0x16, 0x80, 0x06, - 0x49, 0xfd, 0xcd, 0x89, 0xc0, 0x04, 0x3e, 0x0d, 0x9b, 0x74, 0xd5, 0x03, - 0x50, 0x03, 0x01, 0xe0, 0x50, 0x8f, 0x80, 0x1c, 0x50, 0x9f, 0x80, 0x10, - 0x80, 0x20, 0x80, 0x68, 0x80, 0x1f, 0x50, 0x23, 0x02, 0x40, 0x80, 0x89, - 0x49, 0xfd, 0x91, 0x5b, 0x80, 0x48, 0x84, 0x04, 0x50, 0x13, 0x02, 0x00, - 0x49, 0xfd, 0xee, 0xfb, 0x80, 0x06, 0x49, 0xfd, 0xcd, 0x6e, 0xc8, 0x0c, - 0x00, 0x13, 0x02, 0x46, 0x84, 0x0c, 0x42, 0x10, 0x80, 0x24, 0x3e, 0x2d, - 0x29, 0xac, 0x98, 0x4a, 0x80, 0x49, 0x49, 0xfd, 0xee, 0xec, 0x44, 0x00, - 0x00, 0x2b, 0x10, 0x03, 0x02, 0x62, 0x80, 0x47, 0x80, 0x06, 0x84, 0x2b, - 0x80, 0x7f, 0x49, 0xfd, 0x72, 0x1e, 0xec, 0x24, 0x3a, 0x6f, 0xa4, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x84, 0x02, 0x84, 0x20, - 0x49, 0xfe, 0x95, 0x09, 0x81, 0x20, 0x4e, 0x02, 0x00, 0x84, 0xb5, 0x00, - 0x4e, 0x82, 0x00, 0x81, 0x00, 0x00, 0x00, 0x0b, 0x49, 0xfd, 0x98, 0xe1, - 0x80, 0xe0, 0x00, 0x04, 0x80, 0x0b, 0x49, 0xfe, 0x9d, 0x1a, 0x80, 0xc0, - 0xcf, 0x1b, 0x02, 0x24, 0x80, 0x06, 0xc8, 0x0b, 0x14, 0x04, 0x80, 0x01, - 0x80, 0x20, 0x84, 0x02, 0x49, 0xfe, 0x96, 0xb1, 0x44, 0x80, 0x00, 0x1f, - 0x48, 0x00, 0x00, 0x6a, 0x96, 0x50, 0x80, 0x08, 0x44, 0x20, 0xe0, 0x01, - 0x84, 0x61, 0x49, 0xff, 0xd1, 0x5c, 0x3c, 0x2d, 0x59, 0x2f, 0x80, 0x28, - 0x80, 0x06, 0xdd, 0x22, 0xd5, 0x51, 0x00, 0x14, 0x80, 0x0c, 0x80, 0x08, - 0x44, 0x20, 0xff, 0xfc, 0x84, 0x61, 0x49, 0xff, 0xd1, 0x4e, 0x00, 0x04, - 0x00, 0x00, 0x96, 0x04, 0x10, 0x03, 0x82, 0x5e, 0x08, 0x64, 0x00, 0x01, - 0x92, 0xc1, 0x5c, 0xf3, 0x00, 0x7c, 0xe9, 0x06, 0x08, 0x04, 0x00, 0x01, - 0x40, 0x63, 0x20, 0x08, 0x99, 0xb0, 0x02, 0x03, 0x81, 0x0d, 0x84, 0xa7, - 0xd0, 0x37, 0xb4, 0x07, 0x8c, 0xb9, 0xd0, 0x34, 0x5c, 0xf3, 0x00, 0x7f, - 0xe8, 0x0f, 0x5c, 0xf3, 0x00, 0x4c, 0xe8, 0x06, 0x3e, 0x0d, 0x4b, 0x58, - 0x38, 0x00, 0x1a, 0x02, 0xc8, 0x07, 0x80, 0x07, 0x96, 0x70, 0x9e, 0xae, - 0x49, 0xfd, 0x5a, 0x35, 0xd5, 0x23, 0x80, 0x06, 0x80, 0x28, 0x80, 0x47, - 0x49, 0xfd, 0x53, 0xa5, 0x5c, 0xf3, 0x00, 0x7c, 0xe8, 0x14, 0x3e, 0x0d, - 0x4b, 0x58, 0x38, 0x20, 0x1a, 0x02, 0x80, 0x28, 0x80, 0x07, 0xdd, 0x22, - 0x81, 0x00, 0xc0, 0x13, 0x00, 0x03, 0x82, 0x5e, 0x96, 0x70, 0x10, 0x03, - 0x82, 0x5f, 0x80, 0x48, 0x80, 0x07, 0x49, 0xfd, 0x5a, 0x1a, 0xd5, 0x09, - 0x80, 0x06, 0x80, 0x28, 0x80, 0x47, 0x49, 0xfd, 0x53, 0x60, 0x81, 0x00, - 0xd5, 0x02, 0x85, 0x00, 0x02, 0x24, 0x80, 0x06, 0x84, 0x02, 0x84, 0x20, - 0x49, 0xfe, 0x96, 0x47, 0xd5, 0x02, 0x85, 0x00, 0x80, 0x08, 0xec, 0x04, - 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xb3, 0x1b, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x01, 0x49, 0xfc, - 0xac, 0xb0, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x97, 0xc0, 0x3c, 0x0d, 0x78, 0x07, 0xc8, 0x03, - 0x49, 0xfe, 0xf8, 0x3d, 0x3e, 0x6d, 0xe0, 0x10, 0xa0, 0x33, 0x84, 0xa2, - 0xd0, 0x0b, 0xe6, 0x03, 0xe8, 0x04, 0x84, 0xa1, 0xd8, 0x45, 0xd5, 0x4c, - 0x84, 0xa3, 0xd0, 0x0c, 0x84, 0xa4, 0xd8, 0x40, 0xd5, 0x3c, 0x49, 0xff, - 0xae, 0xaa, 0xc8, 0x04, 0x49, 0xfe, 0xf7, 0xb1, 0xd5, 0x41, 0x84, 0x01, - 0xd5, 0x35, 0x8c, 0xb2, 0xdf, 0x3d, 0x46, 0x18, 0x10, 0x02, 0x02, 0x23, - 0x00, 0x0f, 0x04, 0x10, 0x80, 0x0f, 0x52, 0x31, 0x01, 0x39, 0xe2, 0x23, - 0xe9, 0x05, 0x52, 0x31, 0x04, 0xe2, 0xe2, 0x61, 0xe8, 0x03, 0x84, 0x00, - 0xd5, 0x06, 0x52, 0x31, 0x02, 0x71, 0xe2, 0x23, 0xe8, 0x07, 0x84, 0x01, - 0x49, 0xff, 0x31, 0x61, 0x49, 0xfe, 0xf7, 0xb3, 0xd5, 0x0a, 0x52, 0x21, - 0x03, 0xaa, 0xe2, 0x22, 0xe8, 0x02, 0x84, 0x02, 0x49, 0xff, 0x31, 0x57, - 0x49, 0xfe, 0xf7, 0xa9, 0x3c, 0x6d, 0x59, 0x07, 0x49, 0xff, 0x31, 0x4d, - 0x80, 0x60, 0x84, 0x21, 0x84, 0x04, 0x44, 0x20, 0x32, 0x04, 0xdd, 0x26, - 0x49, 0xfe, 0xf7, 0x65, 0x84, 0x24, 0xd5, 0x0a, 0x84, 0x03, 0xa8, 0x33, - 0xd5, 0x09, 0x3c, 0x1d, 0x59, 0x4d, 0x44, 0x00, 0x00, 0x50, 0xdd, 0x21, - 0x84, 0x21, 0x3c, 0x1f, 0x78, 0x07, 0x3c, 0x0d, 0x78, 0x07, 0x84, 0xa1, - 0xd8, 0x07, 0x49, 0xff, 0x31, 0x3a, 0x84, 0xa9, 0xd8, 0x03, 0x49, 0xfe, - 0xf7, 0xa0, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x2e, 0x55, 0xb4, 0xbe, 0x00, 0x40, 0x00, 0x2c, - 0x50, 0x20, 0x00, 0x1c, 0xd4, 0x05, 0x49, 0xfe, 0xfb, 0x54, 0x92, 0x00, - 0xd5, 0x0f, 0x20, 0x00, 0x00, 0x22, 0x96, 0xca, 0xae, 0x17, 0x84, 0x21, - 0x20, 0x01, 0x00, 0x05, 0x10, 0x11, 0x00, 0x13, 0xae, 0x16, 0x20, 0x01, - 0x00, 0x04, 0xae, 0x15, 0xae, 0xd4, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xae, 0xe3, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, 0xb0, 0xcc, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0x97, 0xdd, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, - 0xa9, 0xd2, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfe, 0xf9, 0x01, 0x3c, 0x1d, 0x59, 0x1d, - 0x84, 0x01, 0xdd, 0x21, 0x44, 0x00, 0xe3, 0x00, 0x49, 0xff, 0xb6, 0xd1, - 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xa6, 0xab, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xb1, 0x65, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x9d, 0x29, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xfc, 0x81, 0x00, 0x80, 0xc1, 0x54, 0x91, 0x00, 0xff, - 0x4e, 0x02, 0x00, 0x77, 0xc1, 0x75, 0x00, 0x10, 0x01, 0x37, 0x80, 0x49, - 0x84, 0x03, 0x49, 0xfe, 0x93, 0xca, 0x80, 0xe0, 0xc8, 0x08, 0x44, 0x00, - 0x00, 0x51, 0x49, 0xfc, 0xcf, 0x32, 0x84, 0x07, 0x48, 0x00, 0x00, 0x6b, - 0xb4, 0x00, 0xc8, 0x06, 0x44, 0x00, 0x00, 0x52, 0x49, 0xfc, 0xcf, 0x29, - 0xd5, 0x5f, 0x84, 0x23, 0x10, 0x13, 0x80, 0x09, 0x80, 0x49, 0x80, 0x26, - 0x49, 0xfe, 0xfb, 0xfb, 0xa7, 0xb0, 0x84, 0x0b, 0x4c, 0x60, 0x40, 0x07, - 0x46, 0x00, 0x00, 0x9e, 0x58, 0x00, 0x0b, 0x98, 0xd5, 0x1b, 0x84, 0x06, - 0x4c, 0x60, 0x40, 0x05, 0x44, 0x07, 0xee, 0x34, 0xd5, 0x15, 0x84, 0x0c, - 0x4c, 0x60, 0x40, 0x05, 0x44, 0x07, 0xed, 0x60, 0xd5, 0x0f, 0x84, 0x0d, - 0x4c, 0x60, 0x40, 0x05, 0x44, 0x07, 0xec, 0xf8, 0xd5, 0x09, 0x84, 0x02, - 0x4c, 0x60, 0x40, 0x05, 0x44, 0x07, 0xee, 0x68, 0xd5, 0x03, 0x44, 0x07, - 0xee, 0x10, 0xa8, 0x39, 0x00, 0x13, 0x80, 0x0c, 0xb4, 0x07, 0x44, 0x20, - 0xe0, 0x01, 0x84, 0x60, 0x49, 0xff, 0xcf, 0xab, 0x00, 0x14, 0x01, 0x37, - 0x84, 0x03, 0x49, 0xfe, 0x97, 0x70, 0x50, 0x04, 0x01, 0x39, 0x49, 0xfd, - 0xeb, 0x5e, 0x84, 0x02, 0x4c, 0x60, 0x00, 0x24, 0x84, 0x09, 0x4c, 0x60, - 0x00, 0x21, 0x84, 0x01, 0x4c, 0x60, 0x00, 0x1e, 0xc6, 0x1c, 0x8c, 0x14, - 0x4c, 0x60, 0x00, 0x1a, 0x9c, 0x03, 0x4c, 0x60, 0x00, 0x17, 0x9e, 0x07, - 0x4c, 0x60, 0x00, 0x14, 0x84, 0x81, 0x44, 0x00, 0xfa, 0x00, 0x84, 0x20, - 0x46, 0x20, 0x00, 0xa2, 0x58, 0x21, 0x07, 0xd4, 0x80, 0x68, 0x80, 0xa4, - 0x49, 0xfd, 0xeb, 0xe5, 0x10, 0x04, 0x01, 0x39, 0xd5, 0x04, 0x44, 0x00, - 0x00, 0x1f, 0xd5, 0x02, 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x84, 0xe0, 0x40, 0x80, - 0x00, 0x13, 0x40, 0x90, 0x80, 0x13, 0x2e, 0x34, 0xa2, 0x9c, 0x80, 0xc7, - 0x44, 0x15, 0xaf, 0x9c, 0x44, 0xa0, 0x00, 0x44, 0xd5, 0x16, 0xb6, 0x3f, - 0xf3, 0x81, 0xdd, 0x21, 0x9d, 0x31, 0xb4, 0x3f, 0xf3, 0x01, 0xc0, 0x0e, - 0xb4, 0x40, 0x44, 0x50, 0x00, 0x10, 0xd2, 0x0a, 0x00, 0x00, 0x02, 0x46, - 0x3c, 0x2d, 0x6c, 0xfc, 0x97, 0xa0, 0x42, 0x20, 0x28, 0x73, 0x10, 0x91, - 0x00, 0x32, 0x9d, 0xf9, 0x96, 0xb8, 0x80, 0x07, 0xe2, 0x43, 0xe9, 0xe8, - 0x3e, 0x0d, 0xb3, 0xb4, 0x2e, 0x74, 0xa2, 0x9f, 0x80, 0xa0, 0x04, 0x20, - 0x00, 0x14, 0x84, 0x60, 0x44, 0x10, 0x00, 0x44, 0xd5, 0x17, 0x05, 0xc1, - 0x00, 0x00, 0x4f, 0xc3, 0x00, 0x07, 0x3c, 0x4d, 0x6d, 0x80, 0x42, 0x42, - 0x78, 0x0b, 0xc4, 0x0b, 0x01, 0xc1, 0x01, 0x37, 0x04, 0x42, 0x80, 0x0f, - 0x54, 0x65, 0x00, 0xff, 0x42, 0x4e, 0x04, 0x73, 0x10, 0x92, 0x00, 0x32, - 0x9c, 0xd9, 0x50, 0x21, 0x01, 0x64, 0x50, 0xa3, 0x00, 0x01, 0xe2, 0x67, - 0xe9, 0xe7, 0x84, 0xe0, 0x84, 0x62, 0x84, 0x01, 0x80, 0x27, 0x84, 0x48, - 0x40, 0x93, 0x98, 0x1b, 0x40, 0x91, 0x98, 0x1a, 0x49, 0xfe, 0x92, 0xfb, - 0xc0, 0x18, 0xb4, 0x40, 0x54, 0x04, 0x0f, 0x00, 0x90, 0x08, 0xae, 0x17, - 0x84, 0x0e, 0xae, 0x10, 0x84, 0x06, 0xae, 0x11, 0x84, 0x01, 0xae, 0x12, - 0x8c, 0x16, 0xae, 0x13, 0x84, 0x1c, 0xae, 0x14, 0x10, 0x91, 0x00, 0x05, - 0x10, 0x81, 0x00, 0x06, 0x80, 0x27, 0x84, 0x01, 0x49, 0xfe, 0x96, 0xd1, - 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xa0, 0xbc, 0x97, 0x90, 0x80, 0xe1, 0x54, 0x80, 0x00, 0xff, 0x84, 0x20, - 0x84, 0x01, 0x9c, 0xb2, 0x49, 0xfe, 0x92, 0xd3, 0xc0, 0x11, 0xb4, 0x00, - 0xc0, 0x0f, 0x10, 0x80, 0x00, 0x00, 0xaf, 0x81, 0x80, 0x27, 0x80, 0x46, - 0x9c, 0x02, 0x49, 0xfe, 0xfb, 0x10, 0x84, 0x01, 0x84, 0x20, 0x49, 0xfe, - 0x96, 0xb2, 0x84, 0x00, 0xd5, 0x02, 0x84, 0x07, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xa5, 0xc1, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x80, 0xc0, 0x04, 0x00, 0x00, 0x2f, 0x54, 0x00, - 0x00, 0x03, 0xc0, 0x1f, 0x2e, 0x75, 0x24, 0x6d, 0x84, 0xa1, 0xdf, 0x1b, - 0x84, 0x80, 0x3e, 0x45, 0x24, 0x6d, 0x80, 0x07, 0x84, 0x20, 0x84, 0x47, - 0x49, 0xfe, 0x92, 0x9f, 0xc0, 0x12, 0xb4, 0x20, 0x84, 0x1f, 0xae, 0x08, - 0x84, 0x05, 0xae, 0x09, 0x44, 0x00, 0x00, 0x2a, 0xae, 0x0a, 0x9c, 0x0b, - 0x04, 0x13, 0x00, 0x2f, 0x49, 0xfc, 0xcd, 0x7f, 0x80, 0x07, 0x84, 0x20, - 0x49, 0xfe, 0x96, 0x7b, 0x80, 0x06, 0x49, 0xfe, 0xc3, 0x5a, 0x80, 0x06, - 0x49, 0xfe, 0xc2, 0x6b, 0x00, 0x03, 0x01, 0x37, 0x49, 0xff, 0xac, 0x59, - 0x80, 0x06, 0x49, 0xff, 0xff, 0xc4, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x54, 0x80, 0x80, 0xff, 0x81, 0x22, - 0x80, 0xc0, 0x4e, 0x83, 0x00, 0x26, 0x80, 0x28, 0x84, 0x41, 0x49, 0xfe, - 0xa8, 0x4e, 0x80, 0xe0, 0x02, 0x33, 0x00, 0x85, 0x84, 0x06, 0x84, 0x28, - 0x44, 0x20, 0x72, 0x06, 0x80, 0x87, 0x49, 0xfe, 0x79, 0x10, 0x84, 0xbf, - 0xdf, 0x0b, 0x3c, 0x4d, 0x59, 0x09, 0x00, 0x13, 0x01, 0x37, 0x80, 0x48, - 0x44, 0x00, 0x70, 0x02, 0x80, 0x68, 0xdd, 0x24, 0xd5, 0x02, 0x9d, 0xf9, - 0x02, 0x13, 0x00, 0x1a, 0x80, 0x09, 0x9c, 0x49, 0x49, 0xfe, 0x6d, 0x3d, - 0xa8, 0x35, 0x48, 0x00, 0x00, 0x91, 0x50, 0x14, 0x7f, 0xff, 0x96, 0x48, - 0xe6, 0x22, 0xe9, 0x04, 0x84, 0xe0, 0x48, 0x00, 0x00, 0x9d, 0x80, 0x48, - 0x80, 0x69, 0x50, 0x10, 0x00, 0x14, 0x49, 0xff, 0xf3, 0x70, 0x02, 0x13, - 0x00, 0x8a, 0x84, 0x40, 0x98, 0x41, 0x96, 0x49, 0x12, 0x13, 0x00, 0x8a, - 0x80, 0x06, 0x49, 0xfe, 0xa8, 0x16, 0x80, 0xe0, 0x02, 0x33, 0x00, 0x85, - 0x44, 0x20, 0x72, 0x06, 0x84, 0x06, 0x84, 0x28, 0x80, 0x87, 0x49, 0xfe, - 0x78, 0xd8, 0x84, 0xbf, 0xdf, 0x07, 0xb4, 0x06, 0x42, 0x00, 0x30, 0x09, - 0xb6, 0x06, 0x48, 0x00, 0x00, 0x8b, 0xa0, 0x35, 0x80, 0x27, 0x49, 0xfe, - 0x6d, 0x00, 0xa8, 0x36, 0x84, 0x21, 0x42, 0x00, 0x00, 0x09, 0x49, 0xfe, - 0x6c, 0xfa, 0xa8, 0x34, 0x80, 0x29, 0x49, 0xfe, 0x6d, 0x4e, 0xc0, 0x1f, - 0x80, 0x69, 0x80, 0x06, 0x50, 0x13, 0x00, 0x10, 0x84, 0x42, 0x49, 0xff, - 0xf3, 0x3e, 0x81, 0x00, 0x02, 0x03, 0x00, 0x8a, 0x88, 0x08, 0x12, 0x03, - 0x00, 0x8a, 0xd5, 0x0a, 0xa0, 0x35, 0x02, 0x13, 0x00, 0x1b, 0x8f, 0x01, - 0x49, 0xfe, 0x6c, 0xed, 0xa8, 0x35, 0x40, 0x84, 0x00, 0x13, 0x4e, 0x83, - 0xff, 0xf7, 0xa0, 0x35, 0x80, 0x27, 0x49, 0xfe, 0x6c, 0xd8, 0xa8, 0x36, - 0xb4, 0x06, 0x54, 0x10, 0x00, 0x04, 0xc9, 0x10, 0x00, 0x03, 0x00, 0x33, - 0x99, 0xff, 0x94, 0x02, 0x99, 0xf8, 0xa0, 0x36, 0x80, 0x27, 0x49, 0xfe, - 0x6c, 0xc6, 0xb4, 0x26, 0xa8, 0x37, 0x58, 0x00, 0x90, 0x00, 0xb6, 0x06, - 0xd5, 0x3a, 0x04, 0x13, 0x00, 0x2f, 0x96, 0x4c, 0xc9, 0x05, 0x40, 0x10, - 0x38, 0x08, 0x92, 0x3f, 0xc1, 0x2e, 0x40, 0x00, 0x3c, 0x08, 0x92, 0x1f, - 0x04, 0x23, 0x00, 0x12, 0xc0, 0x17, 0xa4, 0x11, 0x12, 0x03, 0x00, 0x1b, - 0xa4, 0x53, 0x12, 0x13, 0x00, 0x1d, 0x02, 0x13, 0x00, 0x1a, 0xa4, 0x12, - 0x12, 0x03, 0x00, 0x1c, 0xa0, 0x35, 0xa4, 0x92, 0x12, 0x23, 0x00, 0x8c, - 0x49, 0xfe, 0x6c, 0xb1, 0xb4, 0x26, 0xa8, 0x35, 0x42, 0x00, 0xc0, 0x09, - 0xb6, 0x06, 0xa0, 0x35, 0x80, 0x27, 0x49, 0xfe, 0x6c, 0x9c, 0xa8, 0x36, - 0x42, 0x00, 0x00, 0x09, 0x84, 0x21, 0x49, 0xfe, 0x6c, 0x96, 0x00, 0x13, - 0x00, 0x33, 0x99, 0xff, 0x94, 0x4a, 0xa8, 0x34, 0x99, 0xf9, 0xd5, 0xc2, - 0x42, 0x00, 0x30, 0x09, 0xb6, 0x06, 0x99, 0xff, 0x00, 0x33, 0x01, 0x37, - 0xa1, 0x35, 0x84, 0x06, 0x84, 0x28, 0x44, 0x20, 0x72, 0x02, 0x49, 0xfe, - 0x78, 0x4e, 0x3c, 0x2d, 0x59, 0x4c, 0x02, 0x13, 0x00, 0x85, 0x80, 0x07, - 0xdd, 0x22, 0xa1, 0xf4, 0x80, 0x07, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x0d, 0x6d, 0xfa, - 0x3e, 0x1d, 0xdf, 0xa0, 0x84, 0x46, 0x50, 0x00, 0x01, 0x48, 0x49, 0xfe, - 0xf9, 0xd4, 0x49, 0xfe, 0x9e, 0xae, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x48, 0x96, 0x00, - 0x49, 0xfc, 0xb4, 0x23, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x80, 0xc0, 0x3c, 0x8d, 0x6c, 0xfc, - 0x00, 0x03, 0x01, 0x37, 0x44, 0x10, 0x00, 0x44, 0x42, 0x80, 0x04, 0x73, - 0x04, 0x24, 0x00, 0x0f, 0x3c, 0xad, 0x5b, 0x22, 0x00, 0x91, 0x00, 0x3e, - 0x4e, 0x92, 0x00, 0x05, 0x84, 0xe0, 0x48, 0x00, 0x00, 0x81, 0x49, 0xff, - 0xc7, 0xcc, 0x80, 0xe0, 0xc0, 0x15, 0xb4, 0x00, 0x84, 0xa1, 0xa6, 0x00, - 0xd8, 0x11, 0xb4, 0x26, 0x42, 0x20, 0xcc, 0x0b, 0xc2, 0x0d, 0x42, 0x10, - 0xcc, 0x09, 0xb6, 0x26, 0x2e, 0x15, 0x24, 0x6e, 0xc1, 0x07, 0x02, 0x33, - 0x00, 0x86, 0x3c, 0x3a, 0x92, 0x2f, 0x80, 0xe9, 0xd5, 0x02, 0x84, 0x00, - 0x3c, 0x22, 0x92, 0x2f, 0xc2, 0x09, 0x2e, 0x25, 0x24, 0x6e, 0xc2, 0x06, - 0xc8, 0x2d, 0x3c, 0x0a, 0x92, 0x2f, 0x80, 0xe0, 0xd5, 0x2a, 0xc8, 0x28, - 0x3c, 0x0a, 0x92, 0x2f, 0x00, 0x13, 0x01, 0x37, 0x84, 0x03, 0x44, 0x20, - 0x00, 0x1b, 0x84, 0x61, 0x49, 0xfe, 0x93, 0xbf, 0x80, 0xe0, 0xc0, 0x07, - 0x3c, 0x2d, 0x53, 0xf4, 0x80, 0x27, 0x80, 0x06, 0xdd, 0x22, 0xd5, 0x26, - 0x80, 0x06, 0x49, 0xfe, 0x99, 0x46, 0xc0, 0x13, 0x2e, 0x14, 0xa2, 0x9c, - 0x2e, 0x04, 0xa2, 0x9f, 0x98, 0x49, 0x9c, 0x4b, 0x98, 0x41, 0x98, 0x01, - 0x02, 0x23, 0x00, 0x92, 0x00, 0x13, 0x01, 0x37, 0x96, 0x00, 0x84, 0x61, - 0x49, 0xfe, 0x93, 0xa3, 0x80, 0xe0, 0xcf, 0x10, 0x80, 0x08, 0x49, 0xfe, - 0xf6, 0xfa, 0x04, 0x14, 0x00, 0x09, 0x44, 0x00, 0x00, 0x20, 0x10, 0x00, - 0x80, 0x08, 0x84, 0x01, 0x04, 0x14, 0x00, 0x09, 0x10, 0x00, 0x80, 0x09, - 0xd5, 0x24, 0x44, 0x00, 0x00, 0x21, 0x14, 0x74, 0x00, 0x09, 0x10, 0x03, - 0x80, 0x08, 0x00, 0x03, 0x80, 0x09, 0x04, 0x14, 0x00, 0x09, 0x10, 0x00, - 0x80, 0x09, 0x84, 0xa3, 0xd8, 0x13, 0xb4, 0x27, 0x84, 0xa5, 0xa6, 0x48, - 0xd9, 0x04, 0x04, 0x14, 0x00, 0x0f, 0xd5, 0x0a, 0x00, 0x03, 0x01, 0x36, - 0x84, 0xa1, 0xd8, 0x08, 0x84, 0xab, 0xd9, 0x06, 0x04, 0x14, 0x00, 0x0f, - 0x84, 0x05, 0x14, 0x00, 0x80, 0x09, 0x84, 0x01, 0x10, 0x03, 0x01, 0x3e, - 0x00, 0x13, 0x01, 0x37, 0x84, 0x03, 0x49, 0xfe, 0x8e, 0x90, 0xc0, 0x15, - 0x2e, 0x14, 0xa2, 0x9c, 0x2e, 0x04, 0xa2, 0x9f, 0x98, 0x49, 0x9c, 0x4b, - 0x98, 0x41, 0x98, 0x01, 0x00, 0x13, 0x01, 0x37, 0x96, 0x00, 0x49, 0xfe, - 0x8e, 0x82, 0xc8, 0x05, 0x80, 0x06, 0x49, 0xfe, 0x98, 0xea, 0xc8, 0x03, - 0x85, 0x20, 0xd5, 0x02, 0x85, 0x21, 0x3c, 0x0d, 0x59, 0x25, 0x96, 0x04, - 0xc0, 0x11, 0x04, 0x15, 0x00, 0x07, 0x00, 0x05, 0x01, 0x37, 0x50, 0xa0, - 0xff, 0xfa, 0x84, 0x20, 0x49, 0xfd, 0xfc, 0x67, 0x80, 0x20, 0x80, 0x0a, - 0x49, 0xfe, 0x6b, 0xef, 0x84, 0x20, 0x40, 0x90, 0x80, 0x1b, 0x04, 0x04, - 0x00, 0x0f, 0x84, 0x4c, 0x10, 0x90, 0x00, 0x41, 0xa1, 0x73, 0xda, 0x05, - 0xb4, 0x06, 0x58, 0x00, 0x01, 0x00, 0xb6, 0x06, 0x00, 0x33, 0x01, 0x37, - 0xcf, 0x03, 0x80, 0x87, 0xd5, 0x03, 0x00, 0x43, 0x80, 0x09, 0x84, 0x06, - 0x84, 0x21, 0x44, 0x20, 0x73, 0x42, 0x49, 0xfe, 0x77, 0x48, 0x00, 0x13, - 0x01, 0x37, 0x84, 0x03, 0x49, 0xff, 0xff, 0x15, 0xc8, 0x13, 0x2e, 0x14, - 0xa2, 0x9c, 0x2e, 0x04, 0xa2, 0x9f, 0x98, 0x49, 0x9c, 0x4b, 0x98, 0x41, - 0x98, 0x01, 0x00, 0x13, 0x01, 0x37, 0x96, 0x00, 0x49, 0xff, 0xff, 0x07, - 0xc0, 0x06, 0x80, 0x06, 0x49, 0xfe, 0x98, 0xa3, 0xc0, 0x02, 0x85, 0x21, - 0xa0, 0xf2, 0x84, 0xac, 0xdb, 0x06, 0xb4, 0x06, 0x54, 0x00, 0x01, 0x00, - 0x40, 0x90, 0x00, 0x1a, 0x04, 0x04, 0x00, 0x0f, 0x10, 0x90, 0x00, 0x41, - 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x97, 0xc0, - 0x3c, 0x2d, 0x53, 0xf5, 0x80, 0x07, 0x80, 0xc1, 0xdd, 0x22, 0xc8, 0x04, - 0x44, 0x20, 0x73, 0x02, 0xd5, 0x12, 0x84, 0xa5, 0xd7, 0x44, 0x84, 0xa4, - 0xd7, 0x04, 0x44, 0x20, 0x73, 0x05, 0xd5, 0x41, 0x00, 0x03, 0x01, 0x36, - 0xc0, 0x36, 0x80, 0x06, 0x49, 0xfe, 0xb6, 0xc9, 0x84, 0xa1, 0xd8, 0x31, - 0x44, 0x20, 0x73, 0x08, 0xce, 0x22, 0x80, 0x66, 0xd5, 0x22, 0x3c, 0x1d, - 0x53, 0xb7, 0x80, 0x06, 0xdd, 0x21, 0x84, 0x01, 0x3e, 0x05, 0x24, 0x6e, - 0x3c, 0x1d, 0x53, 0xf3, 0x80, 0x06, 0xdd, 0x21, 0x3e, 0x75, 0x24, 0x6e, - 0x02, 0x43, 0x00, 0x86, 0x00, 0x33, 0x01, 0x37, 0x84, 0x06, 0x84, 0x22, - 0x44, 0x20, 0x73, 0x06, 0xd5, 0x06, 0x00, 0x33, 0x01, 0x37, 0x84, 0x06, - 0x84, 0x22, 0x84, 0x81, 0x49, 0xfe, 0x78, 0xd9, 0x84, 0x01, 0xd5, 0x0a, - 0x00, 0x33, 0x01, 0x37, 0x84, 0x06, 0x84, 0x22, 0x84, 0x9f, 0x49, 0xfe, - 0x78, 0xd0, 0x92, 0x00, 0x84, 0x00, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x3c, 0x6f, 0x5b, 0x22, 0x00, 0x73, 0x01, 0x36, 0xcf, 0xde, 0xd5, 0xd0, - 0x44, 0x20, 0x73, 0x04, 0xce, 0xe3, 0x80, 0x66, 0xd5, 0xe3, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xb1, 0x25, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x80, 0xc0, - 0x49, 0xfe, 0xd8, 0x19, 0x84, 0xab, 0xd6, 0x03, 0x84, 0xaf, 0xde, 0x12, - 0x2e, 0x05, 0x24, 0x97, 0x84, 0xa1, 0xd8, 0x0e, 0x46, 0x00, 0x20, 0x18, - 0x2e, 0x15, 0x24, 0x7b, 0x9c, 0x49, 0x96, 0x48, 0x3e, 0x15, 0x24, 0x7b, - 0x5c, 0xf0, 0x80, 0x60, 0xe9, 0x03, 0x49, 0xff, 0xbe, 0x12, 0x84, 0xa9, - 0xde, 0x29, 0x3c, 0x0d, 0x5b, 0x13, 0x44, 0x10, 0x00, 0xca, 0x3e, 0x6d, - 0x24, 0x6f, 0x4c, 0x00, 0xc0, 0x1f, 0xa7, 0x30, 0x9d, 0x21, 0x97, 0x20, - 0xaf, 0x30, 0xe6, 0x86, 0xe9, 0x52, 0x84, 0x21, 0x44, 0x20, 0x10, 0x99, - 0x44, 0x30, 0x88, 0x88, 0x84, 0x03, 0x49, 0xfe, 0x76, 0x8e, 0x84, 0x00, - 0xae, 0x30, 0x49, 0xfe, 0xeb, 0xa4, 0x3c, 0x0d, 0x59, 0x50, 0xdd, 0x20, - 0x44, 0x10, 0x01, 0x00, 0x3c, 0x1f, 0x6b, 0xa8, 0x84, 0x21, 0x3c, 0x1f, - 0x6b, 0xa9, 0xd5, 0x3b, 0x84, 0x00, 0xae, 0x30, 0xd5, 0x38, 0x84, 0xad, - 0xde, 0x29, 0x3c, 0x0d, 0x5b, 0x13, 0x44, 0x10, 0x00, 0xcc, 0x3e, 0x6d, - 0x24, 0x70, 0x4c, 0x00, 0xc0, 0x1f, 0xa7, 0x30, 0x9d, 0x21, 0x97, 0x20, - 0xaf, 0x30, 0xe6, 0x86, 0xe9, 0x2b, 0x84, 0x21, 0x44, 0x20, 0x10, 0x98, - 0x44, 0x30, 0x77, 0x77, 0x84, 0x03, 0x49, 0xfe, 0x76, 0x64, 0x84, 0x00, - 0xae, 0x30, 0x49, 0xfe, 0xeb, 0x7a, 0x3c, 0x0d, 0x59, 0x50, 0xdd, 0x20, - 0x44, 0x10, 0x01, 0x00, 0x3c, 0x1f, 0x6b, 0xa8, 0x84, 0x21, 0x3c, 0x1f, - 0x6b, 0xa9, 0xd5, 0x14, 0x84, 0x00, 0xae, 0x30, 0xd5, 0x11, 0x84, 0xaf, - 0xde, 0x04, 0x44, 0x00, 0xdb, 0x00, 0xd5, 0x05, 0x84, 0xab, 0xde, 0x0d, - 0x44, 0x00, 0xd9, 0x00, 0x49, 0xff, 0xb2, 0x71, 0x92, 0x00, 0xd5, 0x07, - 0x44, 0x00, 0xd8, 0x00, 0xd5, 0xfa, 0x44, 0x00, 0xda, 0x00, 0xd5, 0xf7, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0x49, 0xfc, 0x9f, 0x18, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, - 0x90, 0xd4, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, 0x8f, 0xee, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0x49, 0xfc, 0x91, 0x64, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x84, 0xe0, 0x44, 0x80, - 0x00, 0xff, 0x50, 0x6f, 0x80, 0x04, 0x47, 0xc0, 0x00, 0xa8, 0x59, 0xce, - 0x09, 0x88, 0x80, 0x07, 0x80, 0x26, 0x84, 0x40, 0xf2, 0x81, 0x49, 0xff, - 0xff, 0xe6, 0xf1, 0x01, 0x54, 0x00, 0x80, 0x04, 0x96, 0x4c, 0xc1, 0x04, - 0x80, 0x07, 0xdd, 0x3c, 0xd5, 0x10, 0x54, 0xa3, 0x80, 0xff, 0xc0, 0x0d, - 0x4e, 0xa2, 0x00, 0x09, 0x80, 0x08, 0x49, 0xff, 0xff, 0xc2, 0x44, 0x50, - 0x00, 0x24, 0x4c, 0xa2, 0x80, 0x05, 0x9c, 0x39, 0x49, 0xff, 0xff, 0xbb, - 0x8d, 0x01, 0x9d, 0xf9, 0x44, 0x50, 0x00, 0x25, 0x54, 0x84, 0x00, 0xff, - 0xdf, 0xdd, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, 0x90, 0xd2, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x81, 0x01, - 0xc0, 0x55, 0x00, 0x10, 0x00, 0x2e, 0xc1, 0x52, 0x04, 0x10, 0x00, 0x0f, - 0x00, 0x70, 0x00, 0x2c, 0x00, 0x60, 0x80, 0x38, 0x5c, 0xf3, 0x00, 0x25, - 0xe8, 0x49, 0x49, 0xff, 0x0d, 0x92, 0x2e, 0x14, 0xa2, 0x9c, 0xe2, 0xe1, - 0xe8, 0x03, 0x84, 0x20, 0xd5, 0x06, 0x2e, 0x24, 0xa2, 0x9f, 0x98, 0x51, - 0x40, 0x13, 0x84, 0x07, 0x84, 0xa4, 0x4c, 0x82, 0x80, 0x05, 0x84, 0xa7, - 0x4c, 0x82, 0xc0, 0x10, 0xc1, 0x0e, 0x3e, 0x2d, 0x28, 0xa0, 0x38, 0x41, - 0x1d, 0x11, 0x84, 0x63, 0x80, 0xa0, 0x42, 0x52, 0x0c, 0x73, 0x84, 0x84, - 0x40, 0x32, 0x90, 0x96, 0x38, 0x31, 0x1d, 0x09, 0x84, 0xa5, 0x4c, 0x82, - 0x80, 0x1e, 0x84, 0xa7, 0x4c, 0x82, 0x80, 0x10, 0x84, 0x04, 0x4c, 0x80, - 0x40, 0x1d, 0xc1, 0x1b, 0x3e, 0x0d, 0x28, 0xa0, 0x38, 0x00, 0x1d, 0x11, - 0x5e, 0xf0, 0x7f, 0xb1, 0xe9, 0x14, 0x80, 0x06, 0x84, 0x21, 0xd5, 0x03, - 0x80, 0x06, 0x84, 0x20, 0x44, 0x20, 0x00, 0x10, 0x3e, 0x3d, 0xaa, 0xd4, - 0x3e, 0x4d, 0xa9, 0x78, 0x49, 0xff, 0xa5, 0xef, 0xd5, 0x06, 0x80, 0x40, - 0x80, 0x26, 0x84, 0x01, 0x49, 0xff, 0xa7, 0x39, 0x80, 0x06, 0x49, 0xff, - 0xff, 0xa0, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0x98, 0xbc, 0x3c, 0x6d, 0x5b, 0x24, 0xc6, 0x1c, 0x04, 0x13, 0x00, 0x0f, - 0x84, 0x07, 0x14, 0x00, 0x80, 0x08, 0x46, 0x08, 0x10, 0x00, 0x04, 0x00, - 0x03, 0xc0, 0x42, 0x00, 0x78, 0x0b, 0xc8, 0x08, 0x80, 0x06, 0x84, 0x25, - 0x49, 0xff, 0xff, 0x91, 0x80, 0x06, 0x49, 0xfe, 0xcc, 0x4a, 0x84, 0x40, - 0x3c, 0x2f, 0x5b, 0x24, 0x80, 0x06, 0x49, 0xfe, 0xcb, 0x0a, 0x92, 0x00, - 0xd5, 0x06, 0x3c, 0x1d, 0x59, 0x4d, 0x44, 0x00, 0x01, 0x18, 0xdd, 0x21, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0xb0, 0x4d, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, 0x3c, 0x1d, 0x5b, 0x09, - 0x3e, 0x0d, 0x6b, 0x49, 0x49, 0xfd, 0xe6, 0xe3, 0x3c, 0x0d, 0x59, 0x25, - 0x54, 0x00, 0x04, 0x00, 0xc0, 0x07, 0x3e, 0x0d, 0xae, 0x8c, 0x49, 0xff, - 0xb9, 0x72, 0x49, 0xff, 0xff, 0xe4, 0x49, 0xff, 0xd6, 0x92, 0xc0, 0x4d, - 0x2e, 0x44, 0xa2, 0x9c, 0x3c, 0x2d, 0x58, 0x72, 0x3c, 0x3d, 0x58, 0xcf, - 0xf4, 0x81, 0x42, 0x21, 0x68, 0x0b, 0x3e, 0x0d, 0xa8, 0x16, 0x3e, 0x1d, - 0x25, 0x70, 0xdd, 0x23, 0xb6, 0x1f, 0x84, 0xc0, 0x45, 0xc5, 0xaf, 0x9c, - 0x3e, 0xad, 0x94, 0xdc, 0x44, 0x70, 0x00, 0x44, 0xd5, 0x2a, 0xdd, 0x3c, - 0xc0, 0x27, 0x04, 0x10, 0x00, 0x92, 0xc9, 0x24, 0xb4, 0x20, 0x44, 0x2e, - 0xff, 0xfa, 0x40, 0x10, 0x88, 0x02, 0xc9, 0x1e, 0x00, 0x10, 0x01, 0xac, - 0x54, 0x10, 0x80, 0x08, 0xc1, 0x19, 0xb4, 0x3f, 0xc9, 0x0e, 0x00, 0x20, - 0x02, 0x46, 0x3c, 0x1d, 0x6c, 0xfc, 0x42, 0x11, 0x1c, 0x73, 0x44, 0x50, - 0x08, 0x00, 0x04, 0x10, 0x80, 0x0e, 0x02, 0x10, 0x80, 0x92, 0xd9, 0x0a, - 0x00, 0x10, 0x02, 0x46, 0x38, 0x15, 0x06, 0x02, 0x42, 0x10, 0xf4, 0x0b, - 0xc9, 0x03, 0x49, 0xff, 0xf1, 0xb0, 0x9d, 0xb1, 0xf1, 0x01, 0x96, 0x30, - 0xe2, 0xc1, 0xe9, 0xd4, 0x46, 0x00, 0x20, 0x1c, 0x2e, 0x15, 0x6b, 0x47, - 0x92, 0x22, 0x94, 0x4a, 0x3e, 0x15, 0x6b, 0x47, 0xec, 0x0c, 0x3a, 0x6f, - 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x01, 0x49, 0xfc, 0xaa, 0x6c, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xa5, 0x7f, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xec, 0x2e, 0x85, 0xdf, 0xcd, 0x3c, 0x0d, 0x77, 0xef, - 0x3e, 0x3d, 0xb3, 0xbc, 0x50, 0x6f, 0x80, 0x08, 0x84, 0x40, 0x50, 0x51, - 0x80, 0xd4, 0x80, 0x26, 0x54, 0x84, 0x00, 0x01, 0x12, 0x2f, 0x80, 0x02, - 0xb6, 0x5f, 0x40, 0x71, 0xa0, 0x1a, 0x40, 0x72, 0xa0, 0x1b, 0x49, 0xfe, - 0xc7, 0x72, 0x3c, 0x2d, 0x53, 0x93, 0xa6, 0x70, 0x54, 0x21, 0x02, 0x00, - 0xc2, 0x0a, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x05, - 0x44, 0x00, 0x31, 0xa9, 0x49, 0xfe, 0x74, 0x61, 0xa6, 0x30, 0x84, 0x21, - 0x4c, 0x00, 0x80, 0x0d, 0xc0, 0x08, 0x84, 0x42, 0x4c, 0x01, 0x00, 0x0c, - 0x84, 0x66, 0x4c, 0x01, 0xc1, 0xf5, 0xd5, 0x0c, 0x3e, 0x05, 0xdf, 0xdc, - 0xd5, 0x0c, 0x3e, 0x05, 0xdf, 0xdc, 0xd5, 0x04, 0x84, 0x23, 0x3e, 0x15, - 0xdf, 0xdc, 0x85, 0x00, 0xd5, 0x05, 0x84, 0x22, 0x3e, 0x15, 0xdf, 0xdc, - 0x85, 0x01, 0x50, 0xaf, 0x80, 0x08, 0x00, 0x15, 0x00, 0x03, 0x3e, 0x0d, - 0xdf, 0xe0, 0x49, 0xfe, 0xc8, 0x30, 0x00, 0x15, 0x00, 0x03, 0x3e, 0x6d, - 0xdf, 0xd8, 0x9e, 0x4e, 0x00, 0xa5, 0x00, 0x01, 0xa6, 0x34, 0x85, 0x20, - 0xae, 0x76, 0x84, 0x21, 0x10, 0xa3, 0x00, 0x05, 0xb7, 0x26, 0x10, 0x93, - 0x00, 0x36, 0x4c, 0x00, 0xc0, 0x35, 0x8c, 0xce, 0x80, 0x26, 0x84, 0x46, - 0x80, 0x1f, 0x49, 0xfb, 0x61, 0x00, 0xa7, 0x72, 0xa6, 0x71, 0xa7, 0x3a, - 0xa6, 0x39, 0x40, 0x52, 0xc0, 0x08, 0x40, 0x10, 0xa0, 0x08, 0x40, 0x42, - 0x40, 0x08, 0x40, 0x00, 0x20, 0x08, 0xa6, 0xf0, 0xa6, 0xb8, 0x98, 0x69, - 0x98, 0x20, 0x98, 0x4b, 0x98, 0x02, 0x4c, 0x10, 0x40, 0x18, 0xa6, 0x73, - 0xa6, 0x3b, 0x4c, 0x10, 0x40, 0x14, 0xa6, 0x35, 0x00, 0x93, 0x80, 0x05, - 0xa6, 0xb4, 0xa6, 0x7c, 0x40, 0x00, 0x20, 0x08, 0x40, 0x94, 0xa0, 0x08, - 0x98, 0x02, 0x89, 0x21, 0x40, 0x94, 0x80, 0x03, 0x40, 0x94, 0x80, 0x13, - 0x5c, 0x94, 0x80, 0x01, 0xd5, 0x02, 0x85, 0x20, 0x54, 0x94, 0x80, 0xff, - 0x2f, 0xc5, 0xdf, 0xd4, 0x4f, 0xc2, 0x00, 0x05, 0x49, 0xfe, 0x86, 0x5b, - 0x83, 0x80, 0x2e, 0x05, 0x6a, 0xb2, 0x84, 0x41, 0x4c, 0x01, 0x40, 0x11, - 0x3e, 0x0d, 0xe0, 0x08, 0x9c, 0x44, 0x49, 0xfe, 0x88, 0xf2, 0x80, 0x20, - 0x96, 0x8c, 0x3e, 0x15, 0xe0, 0x0e, 0xc2, 0x06, 0x42, 0x10, 0x88, 0x0b, - 0x9c, 0x4a, 0x3e, 0x15, 0xdf, 0xdd, 0x2e, 0x15, 0xb5, 0xf5, 0x84, 0x61, - 0x4c, 0x11, 0x80, 0x0a, 0xc1, 0x12, 0x84, 0x02, 0x4c, 0x10, 0x00, 0x26, - 0x84, 0x43, 0x4c, 0x11, 0x40, 0x3f, 0xd5, 0x18, 0x49, 0xfe, 0x86, 0x13, - 0x80, 0x20, 0x80, 0xc0, 0xc8, 0x06, 0x00, 0x0f, 0x80, 0x08, 0x84, 0x61, - 0x4c, 0x01, 0xc0, 0x35, 0x00, 0x0f, 0x80, 0x08, 0x84, 0x41, 0x4c, 0x01, - 0x40, 0x2d, 0x4c, 0x90, 0x40, 0x2d, 0xc9, 0x29, 0x2e, 0x05, 0xb5, 0xf5, - 0x4c, 0x04, 0xc0, 0x26, 0xd5, 0x26, 0x49, 0xfe, 0x85, 0xfc, 0x80, 0xc0, - 0xc8, 0x06, 0x00, 0x0f, 0x80, 0x08, 0x84, 0x61, 0x4c, 0x01, 0xc0, 0x1f, - 0x2e, 0x65, 0xdf, 0xdc, 0x84, 0x01, 0x4c, 0x60, 0x40, 0x17, 0x2e, 0x05, - 0xe0, 0x0e, 0x54, 0x00, 0x00, 0x02, 0xc8, 0x04, 0x84, 0x21, 0x4c, 0x90, - 0xc0, 0x06, 0x84, 0x20, 0x3c, 0x1f, 0x77, 0xf6, 0xd5, 0x0a, 0x00, 0x0f, - 0x80, 0x0a, 0x80, 0x3f, 0x49, 0xff, 0xa5, 0x83, 0xc0, 0x06, 0x3c, 0x6f, - 0x77, 0xf6, 0xd5, 0x04, 0x84, 0xc1, 0xd5, 0x02, 0x84, 0xc0, 0x2e, 0x05, - 0x80, 0xa0, 0x84, 0x41, 0x4c, 0x01, 0x40, 0x4d, 0x2e, 0x15, 0x80, 0xa2, - 0x4c, 0x10, 0x00, 0x49, 0x4c, 0x61, 0x40, 0x47, 0x00, 0x0f, 0x80, 0x08, - 0xc0, 0x04, 0x84, 0x62, 0x4c, 0x01, 0xc0, 0x32, 0x3e, 0x9d, 0xdf, 0xd8, - 0x00, 0xa4, 0x80, 0x06, 0x84, 0x20, 0x80, 0x09, 0x10, 0x1f, 0x80, 0x0f, - 0x49, 0xfc, 0xff, 0xdb, 0x50, 0x14, 0x80, 0x0e, 0x80, 0x4a, 0x50, 0x0f, - 0x80, 0x0f, 0x49, 0xfc, 0xfe, 0x62, 0xc0, 0x1f, 0x3e, 0x6d, 0x80, 0xa0, - 0x00, 0x7f, 0x80, 0x0f, 0xa6, 0x36, 0x4c, 0x03, 0x80, 0x10, 0xaf, 0xf6, - 0x84, 0xe1, 0x84, 0x40, 0x84, 0x01, 0xaf, 0xf2, 0x46, 0x10, 0x00, 0xa1, - 0x58, 0x10, 0x8e, 0xc0, 0x80, 0x62, 0x80, 0x82, 0x80, 0xa0, 0x49, 0xfd, - 0xe5, 0x7a, 0x3c, 0x4d, 0x59, 0x07, 0x00, 0x3f, 0x80, 0x0f, 0x84, 0x04, - 0x84, 0x21, 0x44, 0x20, 0x4f, 0xe0, 0xd5, 0x0d, 0x2e, 0x15, 0x80, 0xa0, - 0x84, 0x01, 0x4c, 0x10, 0x40, 0x0c, 0x00, 0x3f, 0x80, 0x08, 0x3c, 0x4d, - 0x59, 0x07, 0x44, 0x20, 0x4f, 0xe1, 0x84, 0x04, 0xdd, 0x24, 0x48, 0x00, - 0x00, 0xe3, 0x84, 0x21, 0x4c, 0x80, 0xc0, 0x96, 0x4c, 0x64, 0x40, 0x94, - 0x2e, 0x05, 0xdf, 0xcc, 0x4c, 0x03, 0x40, 0x90, 0x3c, 0xa2, 0xef, 0xe4, - 0x8f, 0x41, 0x40, 0xa5, 0x00, 0x13, 0x3c, 0xaa, 0xef, 0xe4, 0x4e, 0xa3, - 0x00, 0x87, 0x46, 0x18, 0x10, 0x02, 0x04, 0x90, 0x80, 0x4f, 0x40, 0x94, - 0x9c, 0x08, 0x93, 0x37, 0x49, 0xff, 0x2a, 0x09, 0xe2, 0x09, 0xe9, 0x03, - 0x4e, 0x93, 0x00, 0x0a, 0x3c, 0x0d, 0x77, 0xcf, 0x84, 0x20, 0x9c, 0x01, - 0x3c, 0x0f, 0x77, 0xcf, 0x48, 0x00, 0x00, 0x6e, 0x2e, 0x05, 0xae, 0xed, - 0xc0, 0x04, 0x80, 0x2a, 0x48, 0x00, 0x00, 0x68, 0x2e, 0x05, 0xdf, 0xcd, - 0xe6, 0x02, 0xe9, 0x33, 0x2e, 0x25, 0xe0, 0x0e, 0x54, 0x01, 0x00, 0x03, - 0xc0, 0x0f, 0x54, 0x01, 0x00, 0x10, 0xc8, 0x0c, 0x3e, 0x7d, 0xdf, 0xd8, - 0x3c, 0x3d, 0x77, 0xf0, 0x54, 0x81, 0x00, 0xcf, 0x42, 0x01, 0x08, 0x0b, - 0x50, 0x13, 0x80, 0x30, 0xd5, 0x12, 0x49, 0xff, 0xa4, 0xf0, 0x84, 0x61, - 0x4c, 0x01, 0xc0, 0x19, 0x3e, 0x7d, 0xdf, 0xd8, 0x00, 0x83, 0x80, 0x36, - 0x00, 0x0f, 0x80, 0x09, 0x3c, 0x3d, 0x77, 0xf0, 0x54, 0x84, 0x00, 0xcf, - 0x50, 0x13, 0x80, 0x08, 0x10, 0x83, 0x80, 0x36, 0x84, 0x40, 0x9d, 0x1c, - 0x49, 0xfe, 0x86, 0xeb, 0x40, 0x00, 0x20, 0x04, 0x10, 0x03, 0x80, 0x36, - 0xd5, 0x0a, 0x3c, 0x0d, 0x77, 0xf0, 0xd5, 0x03, 0x3c, 0x0d, 0x77, 0xf0, - 0x80, 0x27, 0x84, 0x46, 0x49, 0xfb, 0x5f, 0xb5, 0x3e, 0x7d, 0xdf, 0xb4, - 0x00, 0x3f, 0x80, 0x09, 0xa0, 0x3b, 0x84, 0x46, 0x10, 0x33, 0x80, 0x1a, - 0x98, 0x02, 0x3e, 0x1d, 0xdf, 0xe0, 0x49, 0xfb, 0x5f, 0xa8, 0xa0, 0x3a, - 0x44, 0x10, 0x20, 0x00, 0x49, 0xff, 0xd3, 0x4b, 0x84, 0x03, 0x44, 0x10, - 0x20, 0x00, 0xa8, 0x3c, 0x3c, 0x1f, 0x6b, 0xa9, 0x49, 0xfe, 0xca, 0x6b, - 0x3c, 0x0d, 0x53, 0x93, 0x54, 0x00, 0x02, 0x00, 0xc0, 0x0b, 0x3c, 0x0d, - 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x06, 0x80, 0x29, 0x44, 0x00, - 0x31, 0xa7, 0x49, 0xfe, 0x72, 0xb2, 0x84, 0x21, 0x84, 0x41, 0x3c, 0x2a, - 0xef, 0xe4, 0xc9, 0x19, 0x49, 0xfe, 0xc4, 0x19, 0x3c, 0x1d, 0x5a, 0x0d, - 0x84, 0x00, 0xdd, 0x21, 0x3c, 0x0d, 0x53, 0x93, 0x84, 0x62, 0x54, 0x00, - 0x02, 0x00, 0x3c, 0x3f, 0x77, 0xf1, 0xc0, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, - 0x54, 0x00, 0x00, 0x10, 0xc0, 0x06, 0x44, 0x00, 0x31, 0xa8, 0x80, 0x26, - 0x49, 0xfe, 0x72, 0x95, 0x4f, 0xc3, 0x00, 0x1d, 0x84, 0x01, 0x4c, 0x60, - 0x40, 0x1a, 0x3c, 0x0d, 0x77, 0xef, 0x49, 0xfe, 0xc4, 0xa2, 0x3c, 0x0d, - 0x77, 0xef, 0x00, 0x10, 0x00, 0x2f, 0xc9, 0x08, 0x2e, 0x1d, 0x6a, 0x92, - 0x2e, 0x0d, 0x6a, 0x93, 0x98, 0x48, 0x90, 0x21, 0xd5, 0x03, 0x20, 0x10, - 0x00, 0x20, 0x3e, 0x0d, 0xdf, 0xd8, 0xae, 0x47, 0x3c, 0x1d, 0x77, 0x9e, - 0xdd, 0x21, 0x3c, 0x3d, 0x77, 0xca, 0x3c, 0x2d, 0x53, 0x93, 0x9c, 0xd9, - 0x3c, 0x3f, 0x77, 0xca, 0x54, 0x21, 0x00, 0x02, 0x3c, 0x1d, 0x77, 0xf1, - 0xc2, 0x0a, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x05, - 0x44, 0x00, 0x31, 0xaa, 0x49, 0xfe, 0x72, 0x63, 0xec, 0x14, 0x3a, 0x6f, - 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0x49, 0xfc, 0x8b, 0xb0, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x0f, 0x94, 0x3c, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xe8, - 0x50, 0x6f, 0x80, 0x2c, 0x50, 0x8f, 0x80, 0x40, 0x3a, 0x13, 0x14, 0x20, - 0x80, 0x80, 0x80, 0xff, 0x3a, 0x04, 0x0c, 0x04, 0x3a, 0x03, 0x8c, 0x24, - 0x80, 0x04, 0x3a, 0x13, 0x14, 0x00, 0xb5, 0x08, 0xb7, 0x07, 0x49, 0xfc, - 0xa7, 0x7c, 0x92, 0x00, 0xec, 0x18, 0x3a, 0x6f, 0xa0, 0x84, 0xec, 0x18, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xb4, 0x00, 0x40, 0x00, 0x21, - 0x3e, 0x2d, 0xb3, 0xbc, 0x50, 0x8f, 0x80, 0x44, 0x50, 0x60, 0x00, 0x20, - 0xb4, 0x00, 0x50, 0x31, 0x00, 0xd4, 0x97, 0x24, 0x80, 0x28, 0x40, 0x71, - 0x10, 0x1a, 0x40, 0x71, 0x90, 0x1b, 0x49, 0xfe, 0xc5, 0x22, 0x00, 0x04, - 0x00, 0x01, 0xae, 0x32, 0x3c, 0x1d, 0x53, 0x93, 0x00, 0x24, 0x00, 0x00, - 0x54, 0x10, 0x84, 0x00, 0xc1, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, - 0x00, 0x10, 0xc0, 0x06, 0x44, 0x00, 0x31, 0xc8, 0x84, 0x20, 0x49, 0xfe, - 0x72, 0x74, 0x51, 0xcf, 0x80, 0x44, 0x00, 0x0e, 0x00, 0x00, 0xe6, 0x02, - 0x4e, 0xf2, 0x01, 0xfe, 0x50, 0x8f, 0x80, 0x1c, 0x00, 0x1e, 0x00, 0x03, - 0x80, 0x08, 0x50, 0xa3, 0x7f, 0xf4, 0x49, 0xfe, 0xc5, 0xee, 0x80, 0x28, - 0x80, 0x0a, 0x84, 0x46, 0x49, 0xfe, 0xf3, 0xd7, 0x2e, 0x05, 0xb5, 0xf6, - 0xc0, 0x2c, 0x49, 0xfe, 0x84, 0x36, 0x00, 0x93, 0x00, 0x06, 0x81, 0x00, - 0x4e, 0x92, 0x00, 0x23, 0x50, 0x13, 0x7f, 0xf8, 0x80, 0x0a, 0x49, 0xfe, - 0x86, 0xf2, 0x54, 0x10, 0x00, 0x03, 0xae, 0x37, 0xc1, 0x07, 0x42, 0x90, - 0x08, 0x0b, 0x8d, 0x22, 0x54, 0x94, 0x80, 0xff, 0xd5, 0x03, 0x00, 0x9e, - 0x00, 0x01, 0x51, 0xcf, 0x80, 0x1c, 0x00, 0x0f, 0x80, 0x45, 0x80, 0x3c, - 0x49, 0xff, 0xff, 0x79, 0xc0, 0x6b, 0x4e, 0x82, 0x01, 0xcb, 0x80, 0x0a, - 0x80, 0x3c, 0x84, 0x46, 0x49, 0xfe, 0xf3, 0xad, 0xd5, 0x65, 0x10, 0x93, - 0x00, 0x07, 0xd5, 0x60, 0xa6, 0x36, 0xc0, 0x06, 0x80, 0x0a, 0x50, 0x13, - 0x7f, 0xf8, 0x49, 0xfe, 0x86, 0xcc, 0xae, 0x37, 0x00, 0x93, 0x00, 0x07, - 0x54, 0x04, 0x80, 0x03, 0xc0, 0x09, 0x42, 0x94, 0x88, 0x0b, 0x8d, 0x22, - 0x54, 0x94, 0x80, 0xff, 0x50, 0x13, 0x7f, 0xf4, 0xd5, 0x05, 0x00, 0x9f, - 0x80, 0x45, 0x50, 0x1f, 0x80, 0x1c, 0x00, 0x83, 0x7f, 0xfc, 0x00, 0x23, - 0x7f, 0xfb, 0xa7, 0x4a, 0xa6, 0x09, 0x40, 0x84, 0x40, 0x08, 0x40, 0x21, - 0x20, 0x08, 0x40, 0x52, 0xc0, 0x08, 0x40, 0x00, 0x20, 0x08, 0x00, 0x43, - 0x7f, 0xfa, 0xa6, 0xc8, 0x88, 0x48, 0x98, 0x28, 0x98, 0x94, 0x98, 0x03, - 0x4c, 0x20, 0x41, 0x92, 0x00, 0x23, 0x7f, 0xfd, 0xa6, 0x0b, 0x4c, 0x20, - 0x41, 0x8d, 0xa6, 0x0d, 0x00, 0x43, 0x7f, 0xff, 0xa6, 0x8c, 0x00, 0x33, - 0x7f, 0xfe, 0x40, 0x12, 0x20, 0x08, 0x40, 0x00, 0x20, 0x08, 0x98, 0x4b, - 0x98, 0x02, 0x96, 0x49, 0x96, 0x01, 0x4c, 0x10, 0x41, 0x7d, 0xa6, 0x36, - 0xc0, 0x14, 0x50, 0x8f, 0x80, 0x1c, 0x00, 0x0f, 0x80, 0x45, 0x80, 0x28, - 0x49, 0xff, 0xff, 0x1f, 0xc0, 0x0c, 0xa6, 0x30, 0x96, 0x04, 0x4c, 0x90, - 0x40, 0x09, 0x80, 0x0a, 0x80, 0x28, 0x84, 0x46, 0x49, 0xfe, 0xf3, 0x51, - 0x48, 0x00, 0x01, 0x7a, 0xa6, 0x30, 0x4c, 0x04, 0xc1, 0x65, 0x48, 0x00, - 0x01, 0x75, 0x4e, 0x82, 0x01, 0x61, 0x2e, 0x24, 0xa2, 0x9f, 0x3c, 0x0d, - 0x6d, 0x01, 0x84, 0x20, 0xd5, 0x14, 0xb4, 0x60, 0x9c, 0x49, 0x54, 0x31, - 0x80, 0x02, 0xc3, 0x0d, 0x04, 0x33, 0x7f, 0xfd, 0x04, 0x40, 0x00, 0x52, - 0x4c, 0x32, 0x40, 0x08, 0x02, 0x30, 0x00, 0xa6, 0x02, 0x43, 0x7f, 0xfc, - 0x4c, 0x41, 0x81, 0x4a, 0x50, 0x00, 0x01, 0x64, 0xe2, 0x22, 0xe9, 0xec, - 0x48, 0x00, 0x01, 0x59, 0xa6, 0x36, 0xc0, 0x6c, 0x49, 0xff, 0xa3, 0x39, - 0x84, 0x21, 0x4c, 0x00, 0xc0, 0x1a, 0x51, 0xcf, 0x80, 0x30, 0x3a, 0x0e, - 0x0c, 0x04, 0x81, 0x5f, 0x50, 0x4f, 0x80, 0x1c, 0x3a, 0x05, 0x0c, 0x24, - 0x50, 0x03, 0x7f, 0xe0, 0x3a, 0x12, 0x14, 0x00, 0x05, 0xce, 0x00, 0x00, - 0x15, 0xc5, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x07, 0x49, 0xff, 0xfe, 0xdd, - 0x40, 0x05, 0x00, 0x04, 0xae, 0x37, 0xa6, 0x31, 0xe6, 0x02, 0xe9, 0x0a, - 0x00, 0x0f, 0x80, 0x46, 0x50, 0x1f, 0x80, 0x22, 0x49, 0xff, 0xfe, 0xc7, - 0x84, 0x20, 0x40, 0x80, 0x80, 0x1b, 0x00, 0xaf, 0x80, 0x46, 0x51, 0xcf, - 0x80, 0x22, 0x80, 0x0a, 0x80, 0x3c, 0x49, 0xff, 0xa3, 0x00, 0xc0, 0x06, - 0xa6, 0x37, 0x54, 0x00, 0x00, 0x12, 0x40, 0x80, 0x00, 0x1a, 0x50, 0x2f, - 0x80, 0x20, 0x01, 0xe3, 0x80, 0x02, 0xa6, 0x79, 0xa7, 0x54, 0xa6, 0x13, - 0x41, 0xef, 0x40, 0x08, 0x40, 0x10, 0xa0, 0x08, 0x40, 0x52, 0xc0, 0x08, - 0x40, 0x00, 0x20, 0x08, 0xa7, 0x38, 0xa6, 0xd2, 0x88, 0x3e, 0x98, 0x28, - 0x98, 0x4c, 0x98, 0x03, 0x4c, 0x10, 0x40, 0x18, 0xa6, 0x7b, 0xa6, 0x15, - 0x4c, 0x10, 0x40, 0x14, 0xa6, 0x17, 0xa6, 0x7d, 0xa6, 0x96, 0xa6, 0xfc, - 0x40, 0x10, 0xa0, 0x08, 0x40, 0x00, 0x20, 0x08, 0x98, 0x4b, 0x98, 0x02, - 0x96, 0x49, 0x96, 0x01, 0x4c, 0x10, 0x40, 0x06, 0xa6, 0x31, 0x96, 0x04, - 0x4c, 0xa0, 0x00, 0x39, 0x80, 0x0a, 0x80, 0x3c, 0x49, 0xff, 0xfe, 0x85, - 0x4e, 0x03, 0x00, 0xd8, 0xd5, 0x31, 0x50, 0x0f, 0x80, 0x20, 0x00, 0xa3, - 0x80, 0x02, 0xa6, 0xf9, 0x00, 0x80, 0x00, 0x04, 0xa6, 0x83, 0x40, 0xa5, - 0x40, 0x08, 0x40, 0x31, 0xa0, 0x08, 0x40, 0x84, 0x40, 0x08, 0x40, 0x21, - 0x20, 0x08, 0xa7, 0x78, 0xa7, 0x02, 0x88, 0x6a, 0x88, 0x48, 0x98, 0xdd, - 0x98, 0x94, 0x4c, 0x31, 0x40, 0xbf, 0xa6, 0xfb, 0xa6, 0x85, 0x4c, 0x31, - 0x40, 0xbb, 0xa6, 0xbd, 0xa7, 0x47, 0xa6, 0xc6, 0xa7, 0x3c, 0x40, 0x21, - 0x20, 0x08, 0x40, 0x02, 0xa0, 0x08, 0x98, 0x94, 0x98, 0x03, 0x96, 0x91, - 0x96, 0x01, 0x4c, 0x20, 0x40, 0xad, 0xa6, 0x31, 0xa6, 0x4a, 0x96, 0x04, - 0x4c, 0x10, 0x40, 0xa8, 0xd5, 0x03, 0x4e, 0x82, 0x00, 0xa5, 0x46, 0x08, - 0x10, 0x02, 0x04, 0x80, 0x00, 0x4f, 0x40, 0x84, 0x1c, 0x08, 0x93, 0x17, - 0x49, 0xff, 0x27, 0x83, 0xe2, 0x08, 0xe9, 0x03, 0x4e, 0x83, 0x00, 0x09, - 0x3c, 0x1d, 0x77, 0xd1, 0x9c, 0x49, 0x3c, 0x1f, 0x77, 0xd1, 0x48, 0x00, - 0x00, 0x91, 0xa6, 0x31, 0xe6, 0x02, 0xe9, 0x51, 0xa6, 0x37, 0x54, 0x10, - 0x00, 0x10, 0xc9, 0x4d, 0x54, 0x00, 0x00, 0x03, 0xc8, 0x2f, 0x49, 0xff, - 0xa2, 0x7e, 0x84, 0x61, 0x4c, 0x01, 0x80, 0x2b, 0x50, 0x0f, 0x80, 0x20, - 0x00, 0xa3, 0x80, 0x02, 0xa6, 0xb9, 0xa7, 0x44, 0xa6, 0x43, 0x40, 0xa5, - 0x40, 0x08, 0x40, 0x21, 0x20, 0x08, 0x40, 0x52, 0xc0, 0x08, 0x40, 0x10, - 0xa0, 0x08, 0xa7, 0x38, 0xa6, 0xc2, 0x88, 0x4a, 0x98, 0x69, 0x98, 0x94, - 0x98, 0x4b, 0x4c, 0x20, 0xc0, 0x2f, 0xa6, 0xbb, 0xa6, 0x45, 0x4c, 0x20, - 0xc0, 0x2b, 0xa6, 0x7d, 0xa7, 0x07, 0xa6, 0x86, 0xa6, 0xfc, 0x40, 0x10, - 0xa0, 0x08, 0x40, 0x02, 0x20, 0x08, 0x98, 0x4b, 0x98, 0x02, 0x96, 0x49, - 0x96, 0x01, 0x4c, 0x10, 0x40, 0x1d, 0xa6, 0x36, 0xc0, 0x1a, 0x00, 0x0f, - 0x80, 0x44, 0x84, 0x81, 0x4c, 0x02, 0x40, 0x04, 0x49, 0xfe, 0x85, 0xd7, - 0xa7, 0xf7, 0x04, 0x33, 0x7f, 0xf9, 0x54, 0x73, 0x80, 0xcf, 0xaf, 0xf7, - 0x54, 0x04, 0x80, 0x01, 0x50, 0x13, 0x7f, 0xf4, 0x84, 0x40, 0x9d, 0x1c, - 0x49, 0xfe, 0x84, 0x4b, 0x40, 0x00, 0x1c, 0x04, 0xae, 0x37, 0xd5, 0x07, - 0x04, 0x03, 0x7f, 0xf9, 0x80, 0x27, 0x84, 0x46, 0x49, 0xfe, 0xf2, 0x1f, - 0x04, 0x03, 0x7f, 0xf9, 0x84, 0x46, 0x50, 0x1f, 0x80, 0x1c, 0x9c, 0x06, - 0x49, 0xfb, 0x5d, 0x11, 0x04, 0x03, 0x7f, 0xf8, 0x44, 0x12, 0x00, 0x00, - 0x49, 0xff, 0xd0, 0xb3, 0x46, 0x08, 0x10, 0x00, 0x04, 0x20, 0x03, 0xc0, - 0x42, 0x21, 0x74, 0x09, 0x46, 0x18, 0x10, 0x02, 0x14, 0x20, 0x03, 0xc0, - 0x84, 0x00, 0x14, 0x00, 0x80, 0x09, 0x84, 0x01, 0x04, 0x13, 0x7f, 0xf8, - 0x44, 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x2e, 0x84, 0x03, 0x14, 0x03, - 0x7f, 0xfa, 0x3c, 0x1d, 0x53, 0x93, 0x54, 0x10, 0x84, 0x00, 0x3c, 0x3f, - 0x6b, 0xa9, 0xc1, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, - 0xc0, 0x06, 0x80, 0x28, 0x44, 0x00, 0x31, 0xc5, 0x49, 0xfe, 0x70, 0x09, - 0x3c, 0x2d, 0x53, 0x93, 0x04, 0x13, 0x7f, 0xfa, 0x54, 0x21, 0x00, 0x02, - 0xc2, 0x17, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x12, - 0x44, 0x00, 0x31, 0xc9, 0x49, 0xfe, 0x6f, 0xf9, 0x92, 0x00, 0xd5, 0x0c, - 0x85, 0x01, 0x48, 0xff, 0xfe, 0x8e, 0x50, 0x1f, 0x80, 0x44, 0xa6, 0x08, - 0x84, 0x81, 0x4c, 0x02, 0x7f, 0x44, 0x48, 0xff, 0xfe, 0xa3, 0xec, 0x4c, - 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0x8d, 0x9f, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0xef, 0xf8, 0x80, 0xc0, 0x3c, 0x4d, - 0x59, 0x07, 0x84, 0x21, 0x84, 0x04, 0x44, 0x20, 0x30, 0x01, 0x80, 0x66, - 0xdd, 0x24, 0x44, 0x00, 0x00, 0x7e, 0x4c, 0x60, 0x00, 0x28, 0x44, 0x00, - 0x00, 0xcc, 0x4c, 0x60, 0x00, 0x24, 0x44, 0x00, 0x00, 0xee, 0x4c, 0x60, - 0x00, 0x20, 0x44, 0x00, 0x00, 0xc8, 0x4c, 0x60, 0x00, 0x1c, 0x9c, 0x06, - 0x4c, 0x60, 0x00, 0x19, 0x8c, 0x08, 0x4c, 0x60, 0x00, 0x16, 0x80, 0x86, - 0x3c, 0x5d, 0x5b, 0x13, 0x3c, 0x6d, 0x6b, 0xa8, 0x84, 0x00, 0x46, 0x10, - 0x00, 0xaf, 0x58, 0x10, 0x88, 0x94, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, - 0x08, 0x78, 0x44, 0x30, 0x5f, 0x9f, 0xb6, 0xdf, 0x49, 0xfa, 0xd0, 0x8d, - 0x92, 0x00, 0xec, 0x08, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0x51, 0xcf, 0x80, 0x18, 0xef, 0xec, 0x04, 0x10, 0x00, 0x0f, - 0x15, 0xfe, 0x7f, 0xf6, 0x84, 0x4a, 0x04, 0x70, 0x80, 0x08, 0x50, 0x60, - 0x00, 0x28, 0x4c, 0x71, 0x40, 0x2b, 0x00, 0x80, 0x80, 0x48, 0x84, 0x62, - 0x8d, 0x01, 0x54, 0x84, 0x00, 0xff, 0x4c, 0x81, 0xc0, 0x19, 0x44, 0x10, - 0x00, 0x19, 0x49, 0xfe, 0xe5, 0x3c, 0x3c, 0x1d, 0x77, 0xbc, 0x3c, 0x3d, - 0x53, 0x93, 0x9c, 0x49, 0x96, 0xdc, 0x3c, 0x1f, 0x77, 0xbc, 0xc3, 0x0a, - 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x05, 0x44, 0x00, - 0x30, 0x69, 0x49, 0xfe, 0x6f, 0x76, 0x84, 0xeb, 0xa0, 0x75, 0x10, 0x80, - 0x80, 0x48, 0x3c, 0x1d, 0x77, 0xbb, 0x9c, 0x49, 0x3c, 0x1f, 0x77, 0xbb, - 0x48, 0x00, 0x01, 0x1a, 0x84, 0x40, 0x10, 0x20, 0x80, 0x48, 0xa1, 0x41, - 0xc5, 0x0e, 0x46, 0x08, 0x10, 0x00, 0xa0, 0xf5, 0x04, 0x10, 0x03, 0xc7, - 0x00, 0x01, 0x80, 0x3d, 0x42, 0x10, 0xc8, 0x0b, 0x4c, 0x10, 0x00, 0x04, - 0x3e, 0x25, 0x24, 0x6d, 0x50, 0x03, 0x7f, 0xd8, 0x46, 0x88, 0x10, 0x00, - 0x49, 0xfe, 0xc4, 0x7d, 0x80, 0xe0, 0xd5, 0x0b, 0xa6, 0x74, 0x04, 0x24, - 0x03, 0xc9, 0xc4, 0x0e, 0x96, 0x49, 0xc3, 0x0c, 0x44, 0x00, 0x30, 0x6a, - 0x49, 0xfe, 0x6f, 0xaf, 0x3c, 0x4d, 0x53, 0x93, 0x3c, 0x3d, 0x53, 0x8c, - 0x97, 0x24, 0x54, 0x31, 0x80, 0x10, 0x04, 0x14, 0x03, 0xc9, 0x46, 0x08, - 0x10, 0x00, 0x96, 0x4c, 0xc9, 0xea, 0xa0, 0x75, 0x04, 0x20, 0x03, 0xc9, - 0x04, 0x00, 0x80, 0x09, 0x84, 0x61, 0x4c, 0x01, 0x80, 0x06, 0x56, 0x00, - 0x00, 0x03, 0x40, 0x00, 0x0c, 0x06, 0x84, 0xa4, 0x4c, 0x72, 0xc0, 0xda, - 0x42, 0x21, 0x08, 0x0b, 0xca, 0x0a, 0x4e, 0x02, 0x00, 0xd5, 0x00, 0x00, - 0x80, 0x47, 0xe2, 0x05, 0x4e, 0xf2, 0x00, 0xd0, 0x4e, 0x02, 0x00, 0xce, - 0xa0, 0x35, 0x15, 0xfe, 0x7f, 0xf7, 0x84, 0x20, 0x00, 0x90, 0x00, 0x47, - 0x50, 0x04, 0x80, 0x0e, 0x54, 0x00, 0x01, 0xf8, 0x41, 0xff, 0x80, 0x01, - 0x80, 0x1f, 0x80, 0x49, 0x15, 0xfe, 0x7f, 0xf8, 0x49, 0xfe, 0xf0, 0xff, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xe5, 0x04, 0x0e, 0x7f, 0xf8, - 0x80, 0x49, 0x49, 0xfe, 0xf0, 0xd8, 0x84, 0x01, 0x84, 0x20, 0x50, 0x24, - 0x80, 0x38, 0x49, 0xfe, 0x88, 0x96, 0x4e, 0x02, 0x00, 0x94, 0xb4, 0xe0, - 0x50, 0x04, 0x80, 0x36, 0xae, 0x39, 0x84, 0x01, 0xae, 0x3a, 0x44, 0x00, - 0x00, 0x23, 0xae, 0x3b, 0x84, 0x2e, 0x44, 0x00, 0x00, 0x69, 0xae, 0x3c, - 0xae, 0x78, 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xcc, 0x44, 0x84, - 0x1e, 0x5c, 0x9c, 0x3d, 0xdd, 0x28, 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, - 0x03, 0xcd, 0x50, 0x03, 0x80, 0x09, 0xdd, 0x28, 0x46, 0x08, 0x10, 0x00, - 0x04, 0x10, 0x03, 0xce, 0x50, 0x03, 0x80, 0x0d, 0xdd, 0x28, 0x46, 0x08, - 0x10, 0x00, 0x04, 0x10, 0x03, 0xcf, 0x50, 0x03, 0x80, 0x11, 0xdd, 0x28, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xca, 0x50, 0x03, 0x80, 0x15, - 0xdd, 0x28, 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xd0, 0x50, 0x03, - 0x80, 0x19, 0xdd, 0x28, 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xd1, - 0x50, 0x03, 0x80, 0x1d, 0xdd, 0x28, 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, - 0x03, 0xc5, 0x50, 0x03, 0x80, 0x21, 0xdd, 0x28, 0x46, 0x08, 0x10, 0x00, - 0x04, 0x10, 0x02, 0x83, 0x50, 0x03, 0x80, 0x25, 0xdd, 0x28, 0x46, 0x08, - 0x10, 0x00, 0x04, 0x10, 0x03, 0xd4, 0x50, 0x03, 0x80, 0x29, 0xdd, 0x28, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xc8, 0x50, 0x03, 0x80, 0x2d, - 0xdd, 0x28, 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xc9, 0x50, 0x03, - 0x80, 0x31, 0xdd, 0x28, 0x44, 0x00, 0x00, 0x56, 0x10, 0x03, 0x80, 0x35, - 0x84, 0x00, 0x10, 0x03, 0x80, 0x37, 0x10, 0x93, 0x80, 0x36, 0x85, 0x40, - 0xd5, 0x18, 0xa7, 0x09, 0xa6, 0x8a, 0x04, 0x5e, 0x7f, 0xf8, 0x40, 0x42, - 0x20, 0x08, 0x38, 0x32, 0xa8, 0x00, 0xa6, 0x4b, 0x40, 0x21, 0x40, 0x08, - 0x40, 0x22, 0x08, 0x04, 0x40, 0x21, 0x0c, 0x04, 0x40, 0x10, 0xe0, 0x08, - 0x40, 0x11, 0x04, 0x04, 0x8d, 0x44, 0xdd, 0x28, 0x40, 0xa5, 0x00, 0x13, - 0x04, 0x0e, 0x7f, 0xf8, 0x40, 0x10, 0x28, 0x00, 0x50, 0x05, 0x00, 0x38, - 0x98, 0x38, 0xe3, 0x49, 0xe9, 0xe1, 0x84, 0x01, 0x84, 0x20, 0x49, 0xfe, - 0x8b, 0xf0, 0x50, 0x03, 0x7f, 0xd8, 0x44, 0x10, 0x00, 0x1a, 0x49, 0xfe, - 0xe4, 0x18, 0x3c, 0x2d, 0x53, 0x93, 0xa6, 0x74, 0x96, 0x94, 0xc2, 0x0a, - 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x05, 0x44, 0x00, - 0x30, 0x6b, 0x49, 0xfe, 0x6e, 0x56, 0x05, 0xfe, 0x7f, 0xf7, 0x84, 0xec, - 0xa0, 0x75, 0x50, 0x03, 0xff, 0xf5, 0x14, 0x70, 0x80, 0x08, 0xe6, 0x02, - 0xe9, 0x66, 0xa6, 0x36, 0x84, 0x21, 0x4c, 0x00, 0xc0, 0x25, 0x84, 0x44, - 0x4c, 0x71, 0x00, 0x05, 0x84, 0x66, 0x4c, 0x71, 0xc0, 0x1f, 0x2e, 0x05, - 0x6a, 0xc3, 0xc0, 0x08, 0xa0, 0x35, 0x00, 0x10, 0x00, 0x41, 0xc9, 0x17, - 0x00, 0x00, 0x00, 0x42, 0xc8, 0x14, 0x50, 0x03, 0x7f, 0xd8, 0x44, 0x10, - 0x00, 0x1b, 0x49, 0xfe, 0xe3, 0xe6, 0x3c, 0x1d, 0x53, 0x93, 0x96, 0x4c, - 0xc1, 0x48, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, 0xc0, 0x43, - 0x80, 0x27, 0x44, 0x00, 0x30, 0x70, 0xd5, 0x33, 0x46, 0x08, 0x10, 0x02, - 0x04, 0x70, 0x00, 0x4f, 0x3c, 0x0d, 0x53, 0x93, 0x95, 0xff, 0x40, 0x00, - 0x3c, 0x08, 0x92, 0x1f, 0x92, 0xf7, 0xc0, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, - 0x54, 0x00, 0x00, 0x10, 0xc0, 0x06, 0x44, 0x00, 0x30, 0x72, 0x80, 0x27, - 0x49, 0xfe, 0x6e, 0x0f, 0x49, 0xff, 0x24, 0xed, 0xe2, 0x07, 0xe9, 0x02, - 0xcf, 0x1b, 0x50, 0x03, 0x7f, 0xd8, 0x44, 0x10, 0x00, 0x1b, 0x49, 0xfe, - 0xe3, 0xb8, 0x3c, 0x3d, 0x77, 0xd2, 0x3c, 0x2d, 0x53, 0x93, 0x9c, 0xd9, - 0x96, 0x94, 0x3c, 0x3f, 0x77, 0xd2, 0xc2, 0x15, 0x3c, 0x0d, 0x53, 0x8c, - 0x54, 0x00, 0x00, 0x10, 0xc0, 0x10, 0x80, 0x27, 0x44, 0x00, 0x30, 0x71, - 0x49, 0xfe, 0x6d, 0xf1, 0xd5, 0x0a, 0x2e, 0x05, 0xae, 0xed, 0xc8, 0x07, - 0x44, 0x00, 0x00, 0x15, 0x49, 0xfe, 0xe7, 0x5d, 0x49, 0xfe, 0xc5, 0x91, - 0xa6, 0x36, 0x84, 0x61, 0x3e, 0x7d, 0xde, 0xec, 0x4c, 0x01, 0xc0, 0x09, - 0xa0, 0x3b, 0xa0, 0x7c, 0x98, 0x03, 0x98, 0x4b, 0xa8, 0x7c, 0xa8, 0x3b, - 0xd5, 0x0a, 0x50, 0x03, 0x7f, 0xd8, 0x49, 0xfe, 0xec, 0x1e, 0x04, 0x03, - 0x80, 0x08, 0x9c, 0x01, 0x14, 0x03, 0x80, 0x08, 0x05, 0xfe, 0x7f, 0xf6, - 0x51, 0xfe, 0x7f, 0xe8, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xfc, 0x3c, 0x6d, 0x5b, 0x24, 0x3c, 0x6f, 0x49, 0x2e, - 0xc6, 0x04, 0x3c, 0x0d, 0x5a, 0x13, 0xdd, 0x20, 0x00, 0x03, 0x00, 0x2c, - 0x3c, 0x8d, 0x6b, 0xa9, 0x49, 0xfe, 0x8f, 0x1d, 0x80, 0xe0, 0xb4, 0x00, - 0x40, 0x10, 0x38, 0x08, 0x92, 0x3f, 0xc1, 0x05, 0xc7, 0x04, 0x42, 0x00, - 0x44, 0x09, 0xb6, 0x07, 0x3c, 0x0d, 0x5b, 0x13, 0x50, 0x00, 0x7f, 0x37, - 0xe6, 0x0b, 0x4e, 0xf2, 0x00, 0xdd, 0x84, 0x21, 0x40, 0x00, 0x80, 0x0c, - 0x54, 0x10, 0x01, 0xf9, 0x4e, 0x13, 0x00, 0xb6, 0x54, 0x10, 0x06, 0x00, - 0x4e, 0x13, 0x00, 0xb0, 0x54, 0x00, 0x00, 0x02, 0x4e, 0x02, 0x00, 0xce, - 0x3e, 0x15, 0x6a, 0xc6, 0x46, 0x08, 0x10, 0x00, 0x04, 0x90, 0x03, 0xc6, - 0x04, 0x03, 0x00, 0x0f, 0x42, 0x94, 0x88, 0x0b, 0x4e, 0x92, 0x00, 0x04, - 0x84, 0x2a, 0xd5, 0x02, 0x84, 0x24, 0x14, 0x10, 0x00, 0x08, 0x3c, 0x1d, - 0x53, 0x93, 0x54, 0x10, 0x80, 0x04, 0xc1, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, - 0x54, 0x00, 0x00, 0x10, 0xc0, 0x06, 0x44, 0x00, 0x30, 0xa4, 0x80, 0x29, - 0x49, 0xfe, 0x6d, 0x79, 0x54, 0x04, 0x00, 0x06, 0xc0, 0x19, 0x4e, 0x92, - 0x00, 0x05, 0x80, 0x06, 0x84, 0x24, 0xd5, 0x03, 0x80, 0x06, 0x84, 0x27, - 0x49, 0xff, 0xf7, 0xdb, 0x80, 0x06, 0x49, 0xff, 0xfd, 0xc8, 0x80, 0x06, - 0x49, 0xfe, 0xbf, 0x7d, 0xc7, 0x09, 0xb4, 0x07, 0x54, 0x10, 0x01, 0x04, - 0xc9, 0x05, 0xc0, 0x04, 0x42, 0x00, 0x48, 0x08, 0xb6, 0x07, 0x84, 0x20, - 0x3c, 0x1f, 0x5b, 0x24, 0x49, 0xfe, 0xe6, 0x25, 0x04, 0x03, 0x00, 0x0f, - 0x04, 0x90, 0x00, 0x08, 0x84, 0xa4, 0x4c, 0x92, 0xc0, 0x18, 0x84, 0xa2, - 0x4c, 0x82, 0xc0, 0x15, 0x46, 0x08, 0x10, 0x00, 0x04, 0x70, 0x03, 0xc4, - 0xa0, 0x31, 0x84, 0x43, 0x54, 0x73, 0x80, 0x07, 0x4c, 0x01, 0x00, 0x04, - 0x84, 0xa4, 0xd8, 0x09, 0x80, 0x06, 0x49, 0xfe, 0xc1, 0xaa, 0x80, 0x06, - 0x49, 0xfe, 0xc3, 0x2d, 0xd5, 0x02, 0x84, 0xe0, 0x2e, 0x05, 0xae, 0xed, - 0x84, 0xa1, 0xd8, 0x03, 0x48, 0x00, 0x00, 0x72, 0x8f, 0x2b, 0xe7, 0x22, - 0xe9, 0x27, 0x3c, 0x0d, 0x6b, 0xa9, 0x8c, 0xaf, 0xd8, 0x0a, 0x9c, 0x2d, - 0x49, 0xfe, 0xe6, 0x9f, 0x2e, 0x05, 0xae, 0xed, 0x84, 0xa1, 0xd8, 0x03, - 0x48, 0x00, 0x00, 0x62, 0x49, 0xfe, 0xc4, 0xcd, 0x84, 0xa5, 0xd7, 0x07, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x70, 0x03, 0xc4, 0x54, 0x73, 0x80, 0x07, - 0x44, 0x10, 0x01, 0x00, 0x3c, 0x0d, 0x6b, 0xa9, 0x4c, 0x80, 0xc0, 0x08, - 0x84, 0xa2, 0xd8, 0x05, 0x84, 0x20, 0x3c, 0x1f, 0x6b, 0xb5, 0xd5, 0x08, - 0x44, 0x50, 0x01, 0x00, 0xd0, 0x05, 0x44, 0x00, 0x00, 0x15, 0x49, 0xfe, - 0xe7, 0x90, 0xcf, 0x15, 0x2e, 0x05, 0xae, 0xed, 0x84, 0xa1, 0xd8, 0x02, - 0xd5, 0x3e, 0x49, 0xfe, 0xc4, 0x50, 0x46, 0x08, 0x10, 0x00, 0x04, 0x00, - 0x03, 0xc6, 0x54, 0x00, 0x00, 0x03, 0xc8, 0x02, 0xd5, 0x31, 0x44, 0x10, - 0x00, 0xd2, 0x3c, 0x1f, 0x5b, 0x13, 0xd5, 0x32, 0x80, 0x07, 0x49, 0xfe, - 0xc8, 0x8a, 0xd5, 0x2e, 0x49, 0xfe, 0xbe, 0x5b, 0x3c, 0x2d, 0x77, 0xc8, - 0x9c, 0x91, 0x3c, 0x1d, 0x5b, 0x13, 0x3c, 0x2f, 0x77, 0xc8, 0x44, 0x50, - 0x00, 0xcc, 0xd9, 0x09, 0x46, 0x08, 0x10, 0x00, 0x04, 0x20, 0x03, 0xc6, - 0x58, 0x21, 0x00, 0x03, 0x14, 0x20, 0x03, 0xc6, 0x3c, 0x2d, 0x53, 0x93, - 0x96, 0x94, 0xc2, 0x16, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x10, - 0xc0, 0x11, 0x44, 0x00, 0x31, 0x6a, 0x49, 0xfe, 0x6c, 0xce, 0xd5, 0x0c, - 0x3c, 0x1d, 0x59, 0x4d, 0x44, 0x00, 0x00, 0xc9, 0xdd, 0x21, 0x49, 0xfe, - 0xe2, 0x22, 0x92, 0x00, 0x3c, 0x0d, 0x59, 0x50, 0xdd, 0x20, 0x3c, 0x1d, - 0x59, 0x54, 0x84, 0x05, 0xdd, 0x21, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0xa9, 0x99, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x2e, 0x05, 0xde, 0x5a, 0xe6, 0x02, 0xe8, 0x02, 0xd5, 0x08, - 0x49, 0xfe, 0x8e, 0xb3, 0xc8, 0x03, 0x84, 0xc7, 0xd5, 0x04, 0x49, 0xfe, - 0x8e, 0x7e, 0x84, 0xc0, 0x3c, 0x1d, 0x53, 0x95, 0x42, 0x10, 0xd8, 0x0b, - 0xc1, 0x0b, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x40, 0xc0, 0x06, - 0x44, 0x00, 0x76, 0x88, 0x80, 0x26, 0x49, 0xfe, 0x6c, 0x92, 0x80, 0x06, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x48, 0x49, 0xfc, 0x95, 0x5c, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x96, 0x00, 0x97, 0xc8, 0x49, 0xfe, - 0x8d, 0xe2, 0x80, 0xc0, 0x4e, 0x02, 0x00, 0xae, 0x84, 0x1f, 0xa8, 0x37, - 0x85, 0x00, 0x00, 0xa3, 0x01, 0x37, 0x3c, 0x8f, 0x5b, 0x22, 0x80, 0x28, - 0x00, 0x03, 0x01, 0x37, 0x49, 0xfd, 0x8e, 0x4f, 0x00, 0x33, 0x01, 0x37, - 0x84, 0x06, 0x84, 0x21, 0x44, 0x20, 0x73, 0x40, 0x80, 0x87, 0x49, 0xfe, - 0x6c, 0xa8, 0x2e, 0x95, 0x6b, 0x81, 0x84, 0xa1, 0x4c, 0x92, 0xc0, 0x0f, - 0x49, 0xfa, 0xf3, 0x01, 0x4c, 0x04, 0xc0, 0x08, 0x80, 0x28, 0x44, 0x00, - 0x00, 0x47, 0x80, 0x48, 0x49, 0xfa, 0xf1, 0x7b, 0x84, 0x20, 0x3e, 0x15, - 0x6b, 0x81, 0x2e, 0x05, 0x6b, 0x7d, 0x54, 0x00, 0x00, 0x03, 0xc0, 0x07, - 0x84, 0x20, 0x44, 0x00, 0x00, 0x50, 0x80, 0x41, 0x49, 0xfa, 0xf1, 0x6d, - 0x44, 0x50, 0x00, 0x1a, 0xdf, 0x08, 0xb4, 0x06, 0x58, 0x00, 0x01, 0x00, - 0xb6, 0x06, 0x44, 0x00, 0x00, 0x3d, 0xd5, 0x1a, 0x9f, 0x6a, 0xdf, 0x1a, - 0xa0, 0x73, 0x84, 0xac, 0xd9, 0x05, 0xb4, 0x06, 0x58, 0x00, 0x01, 0x00, - 0xb6, 0x06, 0xb4, 0x26, 0x54, 0x00, 0x80, 0x04, 0xc8, 0x0f, 0x02, 0x23, - 0x00, 0x86, 0x2e, 0x05, 0xb5, 0x07, 0x9c, 0x91, 0xe0, 0x40, 0xe9, 0x08, - 0x58, 0x10, 0x81, 0x00, 0xb6, 0x26, 0x44, 0x00, 0x00, 0x3e, 0x10, 0x03, - 0x01, 0x3d, 0xb4, 0x26, 0x54, 0x00, 0x81, 0x00, 0xc0, 0x18, 0x3c, 0x2d, - 0x53, 0xb5, 0x00, 0x13, 0x01, 0x3d, 0x80, 0x06, 0xdd, 0x22, 0x3c, 0x0d, - 0x60, 0x93, 0x84, 0xa3, 0xd8, 0x36, 0x2e, 0x05, 0x9b, 0xcd, 0xc8, 0x33, - 0x2e, 0x05, 0xb6, 0x17, 0x2e, 0x15, 0xb6, 0x16, 0x98, 0x08, 0x96, 0x00, - 0xc8, 0x2c, 0x49, 0xff, 0xb5, 0x6a, 0xd5, 0x29, 0x44, 0x50, 0x00, 0x1c, - 0xdf, 0x04, 0x54, 0x10, 0x90, 0x00, 0xc9, 0x0e, 0x80, 0x06, 0x80, 0x27, - 0x49, 0xff, 0xff, 0x73, 0x3c, 0x1d, 0x53, 0xf2, 0x80, 0x06, 0xdd, 0x21, - 0x80, 0x06, 0x49, 0xfe, 0xb4, 0x06, 0x80, 0xc0, 0xc0, 0x19, 0x3c, 0x7d, - 0x6c, 0xfc, 0x00, 0x13, 0x01, 0x37, 0x02, 0x93, 0x00, 0x1b, 0x44, 0x00, - 0x00, 0x44, 0x42, 0x70, 0x80, 0x73, 0x3c, 0x8d, 0x58, 0x6e, 0x89, 0x29, - 0x84, 0x00, 0x49, 0xfe, 0x7b, 0x92, 0x40, 0x14, 0x80, 0x13, 0x80, 0x40, - 0x80, 0x07, 0xdd, 0x28, 0x84, 0x00, 0x14, 0x03, 0x00, 0x11, 0x3c, 0x2d, - 0x53, 0xb3, 0x80, 0x26, 0x84, 0x04, 0xdd, 0x22, 0x84, 0x00, 0x84, 0x3f, - 0x49, 0xfd, 0xf0, 0x17, 0x3c, 0x2d, 0x5a, 0x51, 0x44, 0x10, 0x00, 0x20, - 0x80, 0x0a, 0xdd, 0x22, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x46, 0x28, 0x10, 0x00, 0x04, 0x21, 0x02, 0x83, - 0x96, 0x94, 0xc2, 0x04, 0x49, 0xfe, 0x0a, 0xf5, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x00, 0x03, 0xc6, 0x54, 0x00, 0x00, 0x03, - 0xc0, 0x11, 0x84, 0x00, 0x49, 0xff, 0x22, 0x8b, 0x49, 0xfe, 0xbd, 0x27, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xc0, 0x42, 0x10, 0xfc, 0x09, - 0x14, 0x10, 0x03, 0xc0, 0x84, 0x20, 0x3e, 0x15, 0xb5, 0x13, 0x49, 0xfe, - 0x37, 0x02, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x48, 0x49, 0xfc, 0x88, 0x3e, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x80, 0xc0, 0x00, 0x00, 0x00, 0x2e, 0x84, 0xa1, 0xd8, 0x11, 0x46, 0x08, - 0x10, 0x02, 0x84, 0xe0, 0x14, 0x70, 0x00, 0x09, 0x84, 0x05, 0x3c, 0x1d, - 0x59, 0x1d, 0xdd, 0x21, 0x46, 0x08, 0x10, 0x00, 0xa0, 0x44, 0x42, 0x10, - 0x98, 0x09, 0xa8, 0x44, 0xd5, 0x25, 0x46, 0x08, 0x10, 0x00, 0xa0, 0xc4, - 0x46, 0x18, 0x10, 0x00, 0x58, 0x31, 0x80, 0x40, 0xa8, 0xc4, 0x04, 0x30, - 0x80, 0x08, 0x44, 0x49, 0xff, 0xff, 0x40, 0x31, 0x90, 0x02, 0x14, 0x30, - 0x80, 0x08, 0x84, 0x02, 0x3c, 0x1d, 0x59, 0x1d, 0xdd, 0x21, 0x02, 0x73, - 0x00, 0x14, 0x44, 0x00, 0x02, 0x71, 0xa0, 0xb5, 0x4c, 0x70, 0x00, 0x03, - 0x9e, 0x94, 0x46, 0x18, 0x10, 0x02, 0x46, 0x08, 0x10, 0x02, 0x14, 0x20, - 0x80, 0x0b, 0x14, 0x70, 0x00, 0x09, 0x3e, 0x0d, 0xb3, 0xb4, 0x00, 0x30, - 0x01, 0x0a, 0x04, 0x10, 0x00, 0x0f, 0x44, 0x20, 0x00, 0x44, 0x42, 0x11, - 0x88, 0x73, 0xa0, 0xb1, 0x84, 0x81, 0xa8, 0x89, 0x00, 0x53, 0x00, 0x2e, - 0xdc, 0x05, 0x8c, 0x08, 0x49, 0xfe, 0x7a, 0xc7, 0xd5, 0x0c, 0x04, 0x13, - 0x00, 0x0e, 0x46, 0x08, 0x10, 0x00, 0xa0, 0x8a, 0xb6, 0x40, 0x46, 0x08, - 0x10, 0x00, 0x02, 0x10, 0x80, 0x96, 0xa8, 0x41, 0x3c, 0x1d, 0x59, 0x1d, - 0x84, 0x05, 0xdd, 0x21, 0x46, 0x08, 0x10, 0x02, 0x04, 0x40, 0x00, 0x0a, - 0x00, 0x33, 0x00, 0x2e, 0x97, 0x25, 0x40, 0x42, 0x40, 0x08, 0x40, 0x43, - 0x90, 0x04, 0x84, 0x21, 0x44, 0x20, 0x10, 0x91, 0x84, 0x03, 0x49, 0xfe, - 0x6b, 0x64, 0x44, 0x00, 0xe3, 0x00, 0x49, 0xff, 0xa7, 0x8a, 0xec, 0x04, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0x49, 0xfc, 0xa8, 0x10, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, - 0x8b, 0xde, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x3c, 0x6d, 0x5b, 0x13, 0x84, 0x02, 0x56, 0x13, - 0x00, 0x17, 0x40, 0x60, 0x04, 0x1a, 0x49, 0xfe, 0x1f, 0x84, 0x84, 0x22, - 0x3c, 0x0d, 0x5b, 0x13, 0x4c, 0x60, 0x80, 0x04, 0x84, 0xa5, 0xde, 0x14, - 0x44, 0x50, 0x00, 0x12, 0xd8, 0x11, 0x2e, 0x05, 0xae, 0xed, 0xc0, 0x0e, - 0x3c, 0x6f, 0x5b, 0x13, 0x84, 0x00, 0x49, 0xfe, 0x08, 0xc4, 0x3c, 0x1d, - 0x58, 0xe7, 0x84, 0x01, 0xdd, 0x21, 0x84, 0x01, 0x49, 0xfe, 0x1e, 0xff, - 0x92, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xf4, 0x49, 0xff, 0x9a, 0x97, 0x49, 0xfe, 0xc5, 0xa9, - 0x84, 0xa1, 0xd8, 0x05, 0x49, 0xfe, 0xb9, 0xdd, 0x48, 0x00, 0x02, 0x59, - 0x46, 0x18, 0x10, 0x02, 0x46, 0x08, 0x10, 0x02, 0x58, 0x00, 0x00, 0x18, - 0x04, 0x90, 0x80, 0x04, 0xb4, 0x40, 0x3c, 0x2f, 0x5b, 0x16, 0x81, 0x40, - 0x85, 0x00, 0x3e, 0x7d, 0x63, 0x34, 0x3e, 0x6d, 0x4e, 0x04, 0x41, 0xc4, - 0x20, 0x05, 0x40, 0x0e, 0x24, 0x02, 0x54, 0x10, 0x04, 0x00, 0xc1, 0x2e, - 0x44, 0x20, 0x09, 0x00, 0x84, 0x24, 0x84, 0x02, 0x49, 0xfe, 0x6a, 0xc9, - 0xb4, 0x27, 0x84, 0x0d, 0xdd, 0x21, 0x49, 0xfe, 0x1d, 0xb8, 0x3c, 0x1d, - 0x5b, 0x16, 0x46, 0x40, 0x40, 0x00, 0x58, 0x42, 0x02, 0x00, 0x40, 0x10, - 0x90, 0x04, 0x3c, 0x1f, 0x5b, 0x16, 0xb4, 0x47, 0xb6, 0x2a, 0x84, 0x0e, - 0xdd, 0x22, 0x04, 0x03, 0x00, 0x10, 0x42, 0x00, 0x68, 0x0b, 0x58, 0x84, - 0x04, 0x00, 0x3c, 0x1d, 0x5b, 0x13, 0x4e, 0x02, 0x02, 0x06, 0x04, 0x03, - 0x00, 0x0b, 0x54, 0x00, 0x00, 0x04, 0x4e, 0x02, 0x02, 0x00, 0x44, 0x00, - 0x09, 0x01, 0x48, 0x00, 0x00, 0xd8, 0x54, 0x10, 0x00, 0x80, 0xc1, 0x36, - 0x44, 0x20, 0x09, 0x08, 0x84, 0x28, 0x84, 0x02, 0x49, 0xfe, 0x6a, 0x99, - 0xb4, 0x27, 0x44, 0x00, 0x00, 0x10, 0xdd, 0x21, 0x49, 0xfe, 0x23, 0x9d, - 0x3c, 0x1d, 0x5b, 0x16, 0x46, 0x20, 0x28, 0x00, 0x58, 0x21, 0x02, 0x00, - 0x40, 0x10, 0x88, 0x04, 0x3c, 0x1f, 0x5b, 0x16, 0xb6, 0x2a, 0x3c, 0x1d, - 0x5b, 0x43, 0x3c, 0x1f, 0x49, 0x2f, 0xb4, 0x47, 0x44, 0x00, 0x00, 0x11, - 0xdd, 0x22, 0x04, 0x03, 0x00, 0x10, 0x42, 0x00, 0x6c, 0x0b, 0x58, 0x84, - 0x00, 0x80, 0x3c, 0x1d, 0x5b, 0x13, 0x4e, 0x02, 0x01, 0xd0, 0x04, 0x03, - 0x00, 0x0b, 0x54, 0x00, 0x00, 0x04, 0x4e, 0x02, 0x01, 0xca, 0x44, 0x00, - 0x09, 0x09, 0x49, 0xfe, 0x6a, 0x54, 0x48, 0x00, 0x01, 0xc4, 0x54, 0x10, - 0x00, 0x40, 0xc1, 0x31, 0x44, 0x20, 0x09, 0x04, 0x44, 0x10, 0x00, 0x10, - 0x84, 0x02, 0x49, 0xfe, 0x6a, 0x60, 0xb4, 0x27, 0x44, 0x00, 0x00, 0x13, - 0xdd, 0x21, 0x49, 0xfe, 0x25, 0x3e, 0x3c, 0x1d, 0x5b, 0x16, 0x46, 0x30, - 0x24, 0x00, 0x42, 0x10, 0xa4, 0x09, 0x40, 0x10, 0x8c, 0x04, 0x3c, 0x1f, - 0x5b, 0x16, 0xb4, 0x47, 0xb6, 0x2a, 0x44, 0x00, 0x00, 0x14, 0xdd, 0x22, - 0x04, 0x03, 0x00, 0x10, 0x42, 0x00, 0x70, 0x0b, 0x58, 0x84, 0x00, 0x40, - 0x3c, 0x1d, 0x5b, 0x13, 0x4e, 0x02, 0x01, 0x9b, 0x04, 0x03, 0x00, 0x0b, - 0x54, 0x00, 0x00, 0x04, 0x4e, 0x02, 0x01, 0x95, 0x44, 0x00, 0x09, 0x05, - 0x48, 0x00, 0x00, 0x6d, 0x54, 0x30, 0x02, 0x00, 0xc3, 0x2b, 0x84, 0x02, - 0x44, 0x20, 0x09, 0x02, 0x80, 0x20, 0x49, 0xfe, 0x6a, 0x2e, 0xb4, 0x27, - 0x44, 0x00, 0x00, 0x16, 0xdd, 0x21, 0x49, 0xfe, 0x24, 0x84, 0x3c, 0x1d, - 0x5b, 0x16, 0xb4, 0x47, 0x42, 0x10, 0xe4, 0x08, 0x3c, 0x1f, 0x5b, 0x16, - 0xb6, 0x2a, 0x44, 0x00, 0x00, 0x17, 0xdd, 0x22, 0x04, 0x03, 0x00, 0x10, - 0x42, 0x00, 0x64, 0x0b, 0x58, 0x84, 0x02, 0x00, 0x3c, 0x1d, 0x5b, 0x13, - 0x4e, 0x02, 0x01, 0x6d, 0x04, 0x03, 0x00, 0x0b, 0x54, 0x00, 0x00, 0x04, - 0x4e, 0x02, 0x01, 0x67, 0x44, 0x00, 0x09, 0x03, 0xd5, 0x3f, 0x54, 0x10, - 0x00, 0x20, 0xc1, 0x40, 0x44, 0x20, 0x09, 0x06, 0x84, 0x21, 0x84, 0x02, - 0xf3, 0x81, 0x49, 0xfe, 0x6a, 0x00, 0xb4, 0x27, 0x44, 0x00, 0x00, 0x19, - 0xdd, 0x21, 0x49, 0xfe, 0x25, 0xa2, 0x3c, 0x0d, 0x5b, 0x44, 0x84, 0xa1, - 0x00, 0x10, 0x00, 0x2e, 0xf3, 0x01, 0xd9, 0x0b, 0x04, 0x00, 0x00, 0x0e, - 0x84, 0x25, 0x00, 0x20, 0x01, 0x4b, 0x42, 0x01, 0x04, 0x73, 0x50, 0x00, - 0x01, 0x48, 0xae, 0xc6, 0x3c, 0x1d, 0x5b, 0x16, 0xb4, 0x47, 0x42, 0x10, - 0xd4, 0x08, 0x3c, 0x1f, 0x5b, 0x16, 0xb6, 0x2a, 0x44, 0x00, 0x00, 0x1a, - 0xdd, 0x22, 0x04, 0x03, 0x00, 0x10, 0x42, 0x00, 0x60, 0x0b, 0x58, 0x84, - 0x00, 0x20, 0x3c, 0x1d, 0x5b, 0x13, 0x4e, 0x02, 0x01, 0x2e, 0x04, 0x03, - 0x00, 0x0b, 0x54, 0x00, 0x00, 0x04, 0x4e, 0x02, 0x01, 0x28, 0x44, 0x00, - 0x09, 0x07, 0x49, 0xfe, 0x69, 0xb2, 0x48, 0x00, 0x01, 0x22, 0x44, 0x40, - 0x80, 0x10, 0x40, 0x00, 0x10, 0x02, 0xc0, 0x36, 0x44, 0x20, 0x09, 0x0c, - 0x44, 0x10, 0x00, 0x20, 0x84, 0x02, 0x49, 0xfe, 0x69, 0xbc, 0xb4, 0x27, - 0x44, 0x00, 0x00, 0x1c, 0xdd, 0x21, 0x49, 0xfe, 0x72, 0x04, 0x49, 0xfe, - 0x1d, 0xcc, 0x49, 0xfa, 0xf2, 0x12, 0xb4, 0x0a, 0xb4, 0x47, 0x42, 0x00, - 0x50, 0x08, 0xb6, 0x0a, 0x44, 0x30, 0x80, 0x10, 0xb4, 0x2a, 0x44, 0x00, - 0x00, 0x1d, 0x42, 0x10, 0xfc, 0x08, 0xb6, 0x2a, 0x40, 0x84, 0x0c, 0x04, - 0xdd, 0x22, 0x04, 0x03, 0x00, 0x10, 0x42, 0x00, 0x74, 0x0b, 0x3c, 0x1d, - 0x5b, 0x13, 0x4e, 0x02, 0x00, 0xf4, 0x04, 0x03, 0x00, 0x0b, 0x54, 0x00, - 0x00, 0x04, 0x4e, 0x02, 0x00, 0xee, 0x44, 0x00, 0x09, 0x0d, 0x49, 0xfe, - 0x69, 0x78, 0x48, 0x00, 0x00, 0xe8, 0x54, 0x04, 0x80, 0x0f, 0x4e, 0x02, - 0x00, 0xe4, 0x49, 0xfe, 0x1c, 0xae, 0xc8, 0x0a, 0xb4, 0x0a, 0x46, 0x30, - 0x00, 0xf0, 0x40, 0x00, 0x0c, 0x04, 0xb6, 0x0a, 0x93, 0x24, 0x40, 0x94, - 0x90, 0x08, 0x40, 0x94, 0xf0, 0x02, 0x55, 0xc4, 0x80, 0x06, 0x84, 0xa4, - 0x4d, 0xc2, 0xc0, 0x2d, 0x44, 0x20, 0x08, 0x04, 0x80, 0x3c, 0x84, 0x01, - 0x49, 0xfe, 0x69, 0x71, 0xb4, 0x27, 0x84, 0x07, 0xdd, 0x21, 0x3c, 0x1d, - 0x5a, 0x4e, 0x84, 0x01, 0xdd, 0x21, 0x49, 0xff, 0xfe, 0x4c, 0x49, 0xfe, - 0x25, 0xf2, 0xb4, 0x27, 0x84, 0x08, 0xdd, 0x21, 0x04, 0x03, 0x00, 0x0f, - 0x42, 0x00, 0x68, 0x0b, 0x58, 0x84, 0x00, 0x04, 0x3c, 0x1d, 0x5b, 0x13, - 0x4e, 0x02, 0x00, 0xa0, 0x04, 0x03, 0x00, 0x0b, 0x54, 0x00, 0x00, 0x02, - 0x4e, 0x02, 0x00, 0x9a, 0x44, 0x00, 0x08, 0x05, 0x49, 0xfe, 0x69, 0x37, - 0x80, 0x3c, 0x48, 0x00, 0x00, 0x9a, 0x54, 0x04, 0x80, 0x08, 0xc0, 0x24, - 0x44, 0x20, 0x08, 0x06, 0x84, 0x28, 0x84, 0x01, 0x49, 0xfe, 0x69, 0x43, - 0xb4, 0x27, 0x84, 0x0a, 0xdd, 0x21, 0x49, 0xfe, 0x1d, 0x66, 0xb4, 0x27, - 0x84, 0x0b, 0xdd, 0x21, 0x04, 0x03, 0x00, 0x0f, 0x42, 0x00, 0x6c, 0x0b, - 0x58, 0x84, 0x00, 0x08, 0x3c, 0x1d, 0x5b, 0x13, 0x4e, 0x02, 0x00, 0x7a, - 0x04, 0x03, 0x00, 0x0b, 0x54, 0x00, 0x00, 0x02, 0xc0, 0x74, 0x44, 0x00, - 0x08, 0x07, 0x49, 0xfe, 0x69, 0x10, 0x48, 0x00, 0x00, 0x6f, 0x54, 0x04, - 0x80, 0x01, 0xc0, 0x44, 0x46, 0x08, 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, - 0x40, 0x00, 0x34, 0x08, 0x92, 0x1e, 0xc0, 0x17, 0x04, 0x33, 0x00, 0x15, - 0x46, 0x18, 0x10, 0x02, 0x46, 0x08, 0x10, 0x60, 0x96, 0xdc, 0x04, 0x10, - 0x80, 0x0e, 0x04, 0x20, 0x00, 0x28, 0xc3, 0x0b, 0x04, 0x03, 0x00, 0x0b, - 0x54, 0x00, 0x00, 0x80, 0xc0, 0x06, 0x96, 0x49, 0x44, 0x00, 0x90, 0xe0, - 0x49, 0xfe, 0x69, 0x55, 0x84, 0x01, 0x44, 0x20, 0x08, 0x00, 0x80, 0x20, - 0x49, 0xfe, 0x68, 0xff, 0xb4, 0x27, 0x84, 0x01, 0xdd, 0x21, 0x3c, 0x1d, - 0x5a, 0x4e, 0x84, 0x00, 0xdd, 0x21, 0x49, 0xfe, 0x1f, 0x12, 0xb4, 0x27, - 0x84, 0x02, 0xdd, 0x21, 0x04, 0x03, 0x00, 0x0f, 0x42, 0x00, 0x60, 0x0b, - 0x58, 0x84, 0x00, 0x01, 0x3c, 0x1d, 0x5b, 0x13, 0xc0, 0x34, 0x04, 0x03, - 0x00, 0x0b, 0x54, 0x00, 0x00, 0x02, 0xc0, 0x2f, 0x44, 0x00, 0x08, 0x01, - 0x49, 0xfe, 0x68, 0xc9, 0xd5, 0x2a, 0x54, 0x94, 0x80, 0x02, 0x4e, 0x92, - 0x00, 0x36, 0x44, 0x20, 0x08, 0x02, 0x84, 0x22, 0x84, 0x01, 0x49, 0xfe, - 0x68, 0xd6, 0xb4, 0x27, 0x84, 0x04, 0xdd, 0x21, 0x49, 0xfe, 0x1c, 0x3f, - 0xb4, 0x27, 0x84, 0x05, 0xdd, 0x21, 0x04, 0x03, 0x00, 0x0f, 0x42, 0x00, - 0x64, 0x0b, 0x58, 0x84, 0x00, 0x02, 0x3c, 0x1d, 0x5b, 0x13, 0xc0, 0x11, - 0x04, 0x03, 0x00, 0x0b, 0x54, 0x00, 0x00, 0x02, 0xc0, 0x0c, 0x44, 0x00, - 0x08, 0x03, 0x49, 0xfe, 0x68, 0xa4, 0xd5, 0x07, 0x84, 0x24, 0xd5, 0x06, - 0x84, 0x28, 0xd5, 0x04, 0x84, 0x21, 0xd5, 0x02, 0x84, 0x22, 0xb4, 0x0a, - 0x46, 0x4f, 0xff, 0x0f, 0x58, 0x42, 0x0f, 0xff, 0x40, 0x10, 0xc0, 0x08, - 0x40, 0x00, 0x10, 0x02, 0x40, 0x10, 0x80, 0x04, 0xb6, 0x2a, 0x3c, 0x0d, - 0x6c, 0x80, 0x84, 0xa8, 0xd8, 0x03, 0x49, 0xfe, 0x70, 0xfa, 0x3c, 0x0d, - 0x6c, 0x80, 0x84, 0x48, 0x4c, 0x01, 0x40, 0x04, 0x85, 0x20, 0xd5, 0x05, - 0x46, 0x08, 0x10, 0x02, 0x04, 0x90, 0x00, 0x04, 0x40, 0x04, 0x20, 0x05, - 0x96, 0x01, 0x40, 0x00, 0x24, 0x02, 0x4e, 0x03, 0xfd, 0xbc, 0x3c, 0x0d, - 0x58, 0xce, 0xdd, 0x20, 0x49, 0xff, 0x98, 0x23, 0xec, 0x0c, 0x3a, 0x6f, - 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0x8b, 0xbd, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x97, 0x80, 0x80, 0x06, - 0x49, 0xfe, 0xc9, 0xf9, 0x2e, 0x05, 0x24, 0x6c, 0x84, 0xa1, 0xd8, 0x06, - 0xce, 0x05, 0x49, 0xff, 0xff, 0xea, 0x3e, 0x65, 0x24, 0x6c, 0xec, 0x04, - 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0x82, 0xd3, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x81, 0xc9, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x80, 0xc0, 0xc8, 0x04, 0x80, 0x20, 0x48, 0x00, - 0x00, 0x85, 0x2e, 0x15, 0xe7, 0xc1, 0xc1, 0x72, 0x3c, 0x0d, 0x79, 0xf2, - 0x00, 0x53, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0xd8, 0x6b, 0x2e, 0x05, - 0xae, 0xf5, 0xc8, 0x68, 0x3c, 0x0d, 0x6b, 0xa8, 0x84, 0xa1, 0xd0, 0x0d, - 0x84, 0xa3, 0xd0, 0x0b, 0x8c, 0xad, 0xd0, 0x09, 0x49, 0xff, 0xff, 0xd9, - 0xc0, 0x18, 0x3c, 0x7d, 0x6b, 0xa8, 0x44, 0x50, 0x01, 0x00, 0xdf, 0x13, - 0x3c, 0x4d, 0x6b, 0xa8, 0x44, 0x10, 0x00, 0x10, 0x84, 0x03, 0x44, 0x20, - 0x10, 0x53, 0x9c, 0xcc, 0x49, 0xfe, 0x68, 0x4f, 0x00, 0x03, 0x00, 0x2c, - 0x49, 0xfd, 0x85, 0x2f, 0x84, 0x20, 0x12, 0x10, 0x01, 0x15, 0xd5, 0x46, - 0x49, 0xff, 0xff, 0xb5, 0xc0, 0x0a, 0x3c, 0x4d, 0x6b, 0xa8, 0x44, 0x10, - 0x00, 0x10, 0x84, 0x03, 0x44, 0x20, 0x10, 0x53, 0x9c, 0xcd, 0xd5, 0x23, - 0x3e, 0x0d, 0xae, 0xcc, 0x00, 0x20, 0x00, 0x27, 0x84, 0xa1, 0xda, 0x20, - 0x3c, 0x4d, 0x6b, 0xa8, 0x44, 0x50, 0x01, 0x00, 0xdc, 0x12, 0x3c, 0x1d, - 0x6c, 0xfc, 0x2e, 0x55, 0xb4, 0xbe, 0x44, 0x30, 0x00, 0x44, 0x42, 0x12, - 0x8c, 0x73, 0xa0, 0xc1, 0xa8, 0x43, 0x00, 0x51, 0x80, 0x2d, 0x00, 0x10, - 0x80, 0x2d, 0xd1, 0x03, 0x10, 0x20, 0x00, 0x21, 0x84, 0x03, 0x44, 0x10, - 0x00, 0x10, 0x44, 0x20, 0x10, 0x53, 0x9c, 0xce, 0x49, 0xfe, 0x68, 0x17, - 0xd5, 0x15, 0xa0, 0x71, 0x84, 0xa2, 0xd9, 0x07, 0x84, 0x41, 0x3e, 0x25, - 0x24, 0x6b, 0xa9, 0x83, 0x84, 0x26, 0xd5, 0x0d, 0x84, 0xa1, 0xd9, 0x0a, - 0x2e, 0x15, 0xb4, 0xbe, 0x00, 0x53, 0x00, 0x2c, 0xd1, 0x05, 0xa9, 0x83, - 0x44, 0x10, 0x00, 0x40, 0xd5, 0x02, 0x84, 0x20, 0x3e, 0x0d, 0x24, 0x90, - 0xa6, 0x80, 0x9c, 0x91, 0x96, 0x90, 0xae, 0x80, 0x5c, 0xf1, 0x00, 0xc9, - 0xe9, 0x06, 0x84, 0x40, 0x84, 0x20, 0xae, 0x80, 0x3c, 0x1f, 0x6b, 0xb6, - 0x3c, 0x0d, 0x6b, 0xb3, 0x84, 0xa2, 0xd8, 0x13, 0x84, 0xa6, 0xd9, 0x11, - 0x3c, 0x2d, 0x58, 0xea, 0x80, 0x06, 0xdd, 0x22, 0x80, 0x20, 0xc8, 0x0c, - 0x80, 0x80, 0x44, 0x10, 0x00, 0x10, 0x84, 0x03, 0x44, 0x20, 0x10, 0x53, - 0x9c, 0xcf, 0x49, 0xfe, 0x67, 0xde, 0xd5, 0x0f, 0xc1, 0x0e, 0x84, 0x42, - 0x3c, 0x2f, 0x6b, 0xa6, 0x46, 0x08, 0x10, 0x02, 0x04, 0x20, 0x00, 0x0e, - 0x3c, 0x2f, 0x49, 0x10, 0x84, 0x01, 0x3e, 0x05, 0x24, 0x6c, 0xd5, 0x0f, - 0x2e, 0x05, 0x24, 0x6c, 0x84, 0x21, 0x4c, 0x00, 0xc0, 0x07, 0x49, 0xff, - 0xff, 0x1a, 0x84, 0x20, 0x3e, 0x15, 0x24, 0x6c, 0x84, 0x20, 0x3e, 0x15, - 0x24, 0x6b, 0x84, 0x20, 0x80, 0x01, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x3e, 0x6d, 0xe7, 0x84, 0x00, 0x03, - 0x00, 0x3d, 0x4e, 0x02, 0x01, 0xbf, 0x02, 0x03, 0x00, 0x28, 0x49, 0xfd, - 0x84, 0xa0, 0x81, 0x00, 0xb4, 0x00, 0x54, 0x00, 0x00, 0x04, 0x4e, 0x03, - 0x01, 0xb5, 0x04, 0x63, 0x00, 0x11, 0x3c, 0x0d, 0x6b, 0xb7, 0x00, 0x53, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0xd8, 0x11, 0x3e, 0x0d, 0x83, 0xb0, - 0x00, 0x20, 0x00, 0x43, 0x00, 0x10, 0x00, 0x42, 0x98, 0x51, 0x96, 0x48, - 0xc9, 0x04, 0x00, 0x00, 0x00, 0x38, 0xc8, 0x05, 0x84, 0x00, 0x84, 0x21, - 0x49, 0xfd, 0xe9, 0x21, 0x3c, 0x0d, 0x49, 0x0c, 0xc0, 0x05, 0x2e, 0x05, - 0x24, 0x6a, 0x84, 0xa1, 0xd8, 0x69, 0x3e, 0x0d, 0xae, 0xcc, 0xa1, 0xc3, - 0x4c, 0x73, 0x40, 0x16, 0xb4, 0xa0, 0x84, 0x24, 0xd1, 0x12, 0xa0, 0x02, - 0x4c, 0x00, 0x80, 0x04, 0x84, 0xa6, 0xd8, 0x0d, 0x3c, 0x4d, 0x49, 0x0b, - 0x8c, 0x2c, 0x84, 0x03, 0x44, 0x20, 0x10, 0x93, 0x44, 0x30, 0x00, 0xff, - 0x49, 0xfe, 0x67, 0x73, 0x48, 0x00, 0x01, 0xab, 0x3e, 0x7d, 0x24, 0x2c, - 0xb4, 0x87, 0x85, 0x21, 0x4c, 0x44, 0x80, 0x05, 0x84, 0xa2, 0xdc, 0x4c, - 0xd5, 0x1d, 0x40, 0x14, 0x90, 0x08, 0x84, 0x03, 0x44, 0x20, 0x10, 0x53, - 0x80, 0x61, 0x49, 0xfe, 0x67, 0x60, 0x00, 0x03, 0x00, 0x2e, 0xc8, 0x07, - 0x84, 0x0f, 0x49, 0xfe, 0x5c, 0x1c, 0x3c, 0x0f, 0x49, 0x0a, 0xd5, 0x08, - 0x3c, 0x1d, 0x5a, 0x63, 0x80, 0x08, 0xdd, 0x21, 0x92, 0x01, 0x12, 0x04, - 0x01, 0x15, 0x84, 0x22, 0x3e, 0x0d, 0x24, 0x2c, 0xd5, 0x2e, 0x94, 0x6b, - 0x84, 0x03, 0x80, 0x61, 0x44, 0x20, 0x10, 0x53, 0x49, 0xfe, 0x67, 0x45, - 0x46, 0x08, 0x10, 0x02, 0x04, 0x10, 0x00, 0x0e, 0x3c, 0x0d, 0x49, 0x10, - 0x9a, 0x08, 0x94, 0x04, 0x92, 0x04, 0xe6, 0x10, 0xe9, 0x1d, 0x3c, 0x9f, - 0x49, 0x0c, 0x84, 0x40, 0x3e, 0x25, 0x24, 0x6a, 0xb7, 0x27, 0x40, 0x14, - 0x90, 0x08, 0x04, 0x33, 0x00, 0x0e, 0x84, 0x03, 0x10, 0x21, 0x81, 0x67, - 0x44, 0x20, 0x10, 0x53, 0x04, 0x43, 0x00, 0x0e, 0x80, 0x61, 0x10, 0x92, - 0x01, 0x46, 0xb4, 0x87, 0x49, 0xfe, 0x67, 0x23, 0xd5, 0x05, 0x3e, 0x0d, - 0x24, 0x2c, 0x84, 0x21, 0xb6, 0x20, 0x3c, 0x0d, 0x79, 0xf1, 0xa4, 0x40, - 0x2e, 0x05, 0x24, 0x7f, 0xe2, 0x20, 0xe8, 0x16, 0x3c, 0x2d, 0x60, 0xf0, - 0x84, 0xaa, 0xda, 0x04, 0x2e, 0x05, 0x83, 0xf0, 0xc8, 0x0f, 0x3c, 0x1d, - 0x79, 0xf2, 0x84, 0x02, 0x00, 0x10, 0x80, 0x2c, 0x49, 0xff, 0xad, 0xb9, - 0xc8, 0x07, 0x84, 0x41, 0x3c, 0x2f, 0x49, 0x0b, 0x80, 0xe0, 0x48, 0x00, - 0x01, 0x3c, 0x00, 0x13, 0x00, 0x2c, 0x84, 0x03, 0x49, 0xfe, 0x7e, 0x03, - 0xc0, 0x0f, 0x2e, 0x14, 0xa2, 0x9c, 0x2e, 0x04, 0xa2, 0x9f, 0x98, 0x49, - 0x9c, 0x4b, 0x98, 0x41, 0x98, 0x01, 0x00, 0x13, 0x00, 0x2c, 0x96, 0x00, - 0x49, 0xfe, 0x7d, 0xf5, 0xc8, 0x6d, 0x3c, 0x0d, 0x49, 0x0b, 0x84, 0xa2, - 0xd0, 0x69, 0x00, 0x03, 0x00, 0x2e, 0x84, 0xa1, 0xd8, 0x40, 0x46, 0x08, - 0x10, 0x02, 0x04, 0x10, 0x00, 0x0e, 0x3c, 0x0d, 0x49, 0x10, 0x9a, 0x08, - 0x94, 0x04, 0x92, 0x04, 0xe6, 0x0d, 0xe8, 0x35, 0x3e, 0x7c, 0xa2, 0x9c, - 0xa6, 0x78, 0xa6, 0x3b, 0x98, 0x49, 0x9c, 0x4b, 0x98, 0x41, 0x98, 0x01, - 0x00, 0x13, 0x00, 0x2c, 0x96, 0x00, 0x49, 0xfe, 0x7d, 0xe4, 0x84, 0xa1, - 0xd8, 0x26, 0x04, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x50, 0xc0, 0x21, - 0x04, 0x03, 0x00, 0x09, 0x84, 0x43, 0x00, 0x50, 0x00, 0x09, 0xd2, 0x1b, - 0x00, 0x13, 0x00, 0x2c, 0x80, 0x02, 0x49, 0xfe, 0x7d, 0xd2, 0xa6, 0xb8, - 0xa6, 0x7b, 0x98, 0x92, 0x9c, 0x93, 0x98, 0x8a, 0x98, 0x8a, 0x00, 0x13, - 0x00, 0x2c, 0x81, 0x40, 0x96, 0x10, 0x49, 0xfe, 0x7d, 0xc6, 0x40, 0x40, - 0x28, 0x00, 0x44, 0x10, 0x00, 0x10, 0x84, 0x03, 0x44, 0x20, 0x10, 0x53, - 0x9c, 0xc9, 0xd5, 0x41, 0xc6, 0x43, 0x46, 0x08, 0x10, 0x02, 0x04, 0x10, - 0x00, 0x0e, 0x3c, 0x1f, 0x49, 0x0f, 0x00, 0x13, 0x00, 0x2c, 0x84, 0x03, - 0x49, 0xfe, 0x7d, 0xb1, 0x2e, 0x24, 0xa2, 0x9c, 0x2e, 0x14, 0xa2, 0x9f, - 0x98, 0x92, 0x9c, 0x93, 0x98, 0x8a, 0x98, 0x8a, 0x00, 0x13, 0x00, 0x2c, - 0x81, 0x20, 0x96, 0x10, 0x49, 0xfe, 0x7d, 0xa3, 0x40, 0x40, 0x24, 0x00, - 0x44, 0x10, 0x00, 0x10, 0x84, 0x03, 0x44, 0x20, 0x10, 0x39, 0x9c, 0xc9, - 0x49, 0xfe, 0x66, 0x83, 0xd5, 0x1f, 0x00, 0x13, 0x00, 0x2c, 0x84, 0x03, - 0x49, 0xfe, 0x7d, 0x93, 0x2e, 0x24, 0xa2, 0x9c, 0x2e, 0x14, 0xa2, 0x9f, - 0x98, 0x92, 0x9c, 0x93, 0x98, 0x8a, 0x98, 0x8a, 0x00, 0x13, 0x00, 0x2c, - 0x81, 0x20, 0x96, 0x10, 0x49, 0xfe, 0x7d, 0x85, 0x40, 0x40, 0x24, 0x00, - 0x44, 0x10, 0x00, 0x10, 0x84, 0x03, 0x44, 0x20, 0x10, 0x53, 0x9c, 0xca, - 0x49, 0xfe, 0x66, 0x65, 0x84, 0xc0, 0x3c, 0x7d, 0x79, 0xf2, 0x84, 0xa1, - 0x00, 0x03, 0x80, 0x2e, 0xd8, 0x33, 0xce, 0x69, 0x22, 0x64, 0x01, 0x15, - 0x4e, 0x67, 0x00, 0x16, 0x3c, 0x0d, 0x6b, 0xb3, 0xc0, 0x04, 0x44, 0x55, - 0x00, 0x00, 0xd8, 0x03, 0x9f, 0xb1, 0xd5, 0x02, 0x9f, 0xb2, 0x97, 0xb3, - 0x4e, 0x67, 0x00, 0x0a, 0x2e, 0x05, 0x24, 0x72, 0xc0, 0x13, 0x3c, 0x0d, - 0x6b, 0xa8, 0x44, 0x50, 0x01, 0x00, 0xd8, 0x0e, 0x84, 0x01, 0x3c, 0x0f, - 0x49, 0x0b, 0x14, 0x04, 0x00, 0x49, 0x3c, 0x4d, 0x6b, 0xa8, 0x94, 0x44, - 0x84, 0x03, 0x44, 0x20, 0x10, 0x39, 0x9c, 0xca, 0xd5, 0x3f, 0x84, 0x03, - 0x44, 0x10, 0x00, 0x10, 0x44, 0x20, 0x10, 0x53, 0x9c, 0xcb, 0x80, 0x86, - 0x49, 0xfe, 0x66, 0x2f, 0x12, 0x64, 0x01, 0x15, 0xd5, 0x36, 0x3e, 0xad, - 0x24, 0x28, 0xc6, 0x07, 0x44, 0x00, 0x00, 0x1e, 0x49, 0xfe, 0x5a, 0xe7, - 0xb6, 0x0a, 0xd5, 0x2f, 0xb4, 0x0a, 0x49, 0xfe, 0x5a, 0xc4, 0xc0, 0x13, - 0x44, 0x00, 0x00, 0x1e, 0x3c, 0x7d, 0x79, 0xf2, 0x49, 0xfe, 0x5a, 0xdb, - 0x84, 0xa1, 0x3c, 0x4d, 0x6b, 0xa8, 0xb6, 0x0a, 0x94, 0x6c, 0x84, 0x03, - 0x44, 0x20, 0x10, 0x39, 0x9c, 0xcb, 0x3e, 0x55, 0x24, 0x69, 0xd5, 0x14, - 0x2e, 0x05, 0x24, 0x69, 0xc0, 0x16, 0x9f, 0x81, 0x84, 0xa3, 0x3e, 0x65, - 0x24, 0x69, 0x3c, 0x5f, 0x49, 0x0b, 0x3c, 0x7d, 0x79, 0xf2, 0x3c, 0x4d, - 0x6b, 0xa8, 0x80, 0x05, 0x44, 0x10, 0x00, 0x10, 0x44, 0x20, 0x10, 0x39, - 0x9c, 0xcc, 0x49, 0xfe, 0x65, 0xf8, 0xd5, 0x04, 0x84, 0xe0, 0xd5, 0x02, - 0x80, 0xe6, 0x3e, 0x6d, 0x83, 0xb0, 0x00, 0x03, 0x00, 0x38, 0xc0, 0x28, - 0x3c, 0x0d, 0x79, 0xf1, 0xa4, 0x40, 0x2e, 0x05, 0x24, 0x7f, 0xe2, 0x20, - 0xe9, 0x21, 0xa0, 0xb4, 0x84, 0xaf, 0xda, 0x1e, 0x2e, 0x05, 0x24, 0x7d, - 0xc8, 0x1b, 0x2e, 0xa5, 0x24, 0x7c, 0x84, 0xa1, 0x4c, 0xa2, 0xc0, 0x17, - 0x00, 0x83, 0x00, 0x34, 0x4e, 0x83, 0x00, 0x13, 0x80, 0x08, 0x49, 0xfe, - 0x75, 0x40, 0x92, 0x00, 0x50, 0x20, 0x00, 0x14, 0x3c, 0x3d, 0x5a, 0x57, - 0xa0, 0x34, 0x80, 0x28, 0xdd, 0x23, 0x3c, 0x1d, 0x52, 0xcd, 0x3e, 0xa5, - 0x24, 0x7d, 0x84, 0x0a, 0xdd, 0x21, 0x80, 0x07, 0x3a, 0x6f, 0xa8, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfe, 0xcd, 0xeb, - 0x92, 0x00, 0x84, 0xa1, 0xd0, 0x0d, 0x3c, 0x0d, 0x6b, 0xa8, 0xc0, 0x08, - 0x84, 0xa2, 0xd0, 0x06, 0x56, 0x00, 0x00, 0x0f, 0x5c, 0x00, 0x00, 0x01, - 0xd5, 0x02, 0x84, 0x01, 0x96, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x54, 0x90, 0x00, 0xff, 0x49, 0xfe, - 0x2d, 0x90, 0x84, 0xc0, 0x81, 0x40, 0x3e, 0x65, 0x24, 0x98, 0x3e, 0x7d, - 0xae, 0xcc, 0x49, 0xfe, 0x57, 0x72, 0x10, 0x63, 0x80, 0x26, 0x50, 0x03, - 0x80, 0x0c, 0x49, 0xff, 0x97, 0x1c, 0x80, 0xc0, 0xc6, 0x0f, 0x2e, 0x15, - 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, 0x4e, 0x02, - 0x00, 0xf9, 0x3c, 0x1d, 0x6a, 0x3f, 0x84, 0x02, 0xdd, 0x21, 0x48, 0x00, - 0x00, 0xf3, 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, - 0x96, 0x00, 0xc8, 0x05, 0x49, 0xfd, 0x84, 0x5d, 0x81, 0x00, 0xc0, 0x0c, - 0x3c, 0x1d, 0x58, 0xd5, 0x84, 0x01, 0xdd, 0x21, 0x81, 0x00, 0xc8, 0x0d, - 0x2e, 0x15, 0xb4, 0xbe, 0x3e, 0x15, 0xae, 0xec, 0xd5, 0x08, 0x2e, 0x15, - 0xb4, 0xbe, 0x3c, 0x0d, 0x6a, 0x3d, 0x10, 0x13, 0x80, 0x20, 0xdd, 0x20, - 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, - 0xc0, 0x10, 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x0e, 0x3c, 0x0d, 0x6a, 0x37, - 0xdd, 0x20, 0x80, 0xe0, 0xc0, 0x09, 0x80, 0x28, 0x49, 0xfe, 0x2f, 0x0d, - 0x80, 0xc0, 0xc0, 0x04, 0x48, 0x00, 0x00, 0xc0, 0x84, 0xe0, 0x49, 0xfd, - 0x84, 0x30, 0xc0, 0x25, 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x23, 0x2e, 0x55, - 0xb2, 0x48, 0x4c, 0x54, 0x40, 0x05, 0x3c, 0x7d, 0x6c, 0x89, 0xd5, 0x1b, - 0x3c, 0x0d, 0x49, 0x11, 0xdd, 0x20, 0x80, 0xe0, 0xc0, 0x16, 0x3c, 0x1d, - 0x6a, 0x3c, 0x84, 0x00, 0xdd, 0x21, 0x80, 0xe0, 0xc0, 0x10, 0x49, 0xff, - 0xd8, 0x40, 0x80, 0xe0, 0xc8, 0x0c, 0x3c, 0x4d, 0x59, 0x07, 0x46, 0x33, - 0x33, 0x33, 0x58, 0x31, 0x83, 0x33, 0x84, 0x03, 0x84, 0x22, 0x44, 0x20, - 0x74, 0x08, 0xdd, 0x24, 0x3c, 0x2d, 0x58, 0xe9, 0x80, 0x29, 0x80, 0x07, - 0xdd, 0x22, 0x80, 0xc0, 0x4e, 0x03, 0x00, 0x90, 0x3e, 0x7d, 0xae, 0xcc, - 0x2e, 0x15, 0xb4, 0xbe, 0x00, 0x03, 0x80, 0x20, 0x4c, 0x10, 0x00, 0x0c, - 0x04, 0x83, 0x80, 0x06, 0x49, 0xfd, 0xe9, 0x79, 0x40, 0x04, 0x00, 0x01, - 0x94, 0x04, 0x92, 0x04, 0xa8, 0x3f, 0xd5, 0x06, 0x46, 0x10, 0xff, 0xff, - 0x58, 0x10, 0x8f, 0xff, 0xa8, 0x7f, 0x3c, 0x3d, 0x6b, 0xba, 0xe6, 0x69, - 0xe8, 0x17, 0x2e, 0x25, 0xae, 0xec, 0x3c, 0x1d, 0x6c, 0xfc, 0x44, 0x00, - 0x00, 0x44, 0x42, 0x11, 0x00, 0x73, 0x96, 0xd9, 0x00, 0x40, 0x80, 0x2e, - 0x84, 0x03, 0x40, 0x42, 0x40, 0x08, 0x40, 0x42, 0x08, 0x04, 0x44, 0x10, - 0x00, 0x10, 0x44, 0x20, 0x10, 0x54, 0x49, 0xfe, 0x64, 0xf4, 0x3c, 0x2d, - 0x58, 0xeb, 0x84, 0x20, 0x84, 0x06, 0xdd, 0x22, 0xc0, 0x58, 0x49, 0xff, - 0xfd, 0x32, 0x49, 0xff, 0xfc, 0x6e, 0x80, 0xc0, 0xc8, 0x52, 0x49, 0xfe, - 0x56, 0xba, 0x84, 0xa1, 0x4c, 0xa2, 0xc0, 0x0e, 0x46, 0x18, 0x10, 0x00, - 0x04, 0x00, 0x80, 0x08, 0x40, 0x00, 0x34, 0x08, 0x92, 0x1e, 0xc0, 0x05, - 0x3e, 0xa5, 0xae, 0xf1, 0x95, 0xed, 0xd5, 0x40, 0x3e, 0x6d, 0xae, 0xcc, - 0x84, 0x00, 0x10, 0x03, 0x00, 0x25, 0x3c, 0x2d, 0x58, 0xda, 0x80, 0x29, - 0x50, 0x03, 0x00, 0x0c, 0xdd, 0x22, 0x80, 0xe0, 0xc8, 0x33, 0xa0, 0x31, - 0x00, 0x00, 0x00, 0x2e, 0xc8, 0x23, 0x49, 0xff, 0xff, 0x02, 0x81, 0x00, - 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x1e, 0x3c, 0x2d, 0x58, 0xeb, 0x80, 0x27, - 0x84, 0x08, 0xdd, 0x22, 0x4c, 0x04, 0x40, 0x17, 0x2e, 0x05, 0x24, 0x98, - 0xc8, 0x13, 0xb4, 0x26, 0x3c, 0x3d, 0x58, 0xd9, 0x80, 0x49, 0x50, 0x03, - 0x00, 0x0c, 0xdd, 0x23, 0x80, 0xc0, 0x3c, 0x4d, 0x59, 0x07, 0x44, 0x10, - 0x00, 0x10, 0x84, 0x03, 0x44, 0x20, 0x10, 0x52, 0x80, 0x66, 0xdd, 0x24, - 0xce, 0x0e, 0x49, 0xfe, 0x2b, 0x82, 0xc8, 0x0a, 0x2e, 0x05, 0x24, 0x98, - 0xc8, 0x07, 0x3c, 0x1d, 0x58, 0xe8, 0x80, 0x09, 0xdd, 0x21, 0x80, 0xc0, - 0xd5, 0x02, 0x80, 0xc7, 0x80, 0x06, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xfc, 0x3e, 0x7d, 0xae, 0xcc, - 0x84, 0xc0, 0x54, 0x90, 0x00, 0xff, 0x10, 0x63, 0x80, 0x26, 0x49, 0xfe, - 0x56, 0x72, 0x3e, 0x2d, 0xb0, 0x24, 0x00, 0x01, 0x01, 0xd6, 0x85, 0x01, - 0x4c, 0x04, 0x40, 0x05, 0xa0, 0x11, 0x84, 0xc8, 0xd5, 0x09, 0x00, 0x01, - 0x01, 0xd7, 0x84, 0xa1, 0x4c, 0x02, 0xc0, 0x7b, 0xa0, 0x11, 0x44, 0x60, - 0x00, 0x70, 0xa8, 0x3b, 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, - 0x98, 0x08, 0x96, 0x00, 0xc0, 0x6a, 0x3c, 0x1d, 0x6a, 0x3f, 0x84, 0x02, - 0xdd, 0x21, 0x48, 0x00, 0x00, 0x65, 0x3c, 0x0d, 0x6a, 0x37, 0xdd, 0x20, - 0xc0, 0x20, 0x00, 0x20, 0x00, 0x2c, 0x3e, 0x25, 0x6b, 0x62, 0xa8, 0x3b, - 0x3e, 0x85, 0x6b, 0x65, 0x10, 0x83, 0x80, 0x21, 0x44, 0x20, 0x10, 0x41, - 0xa0, 0x41, 0x40, 0x04, 0x10, 0x08, 0x56, 0x10, 0x80, 0x02, 0x10, 0x63, - 0x80, 0x24, 0x40, 0x64, 0x04, 0x1a, 0x40, 0x60, 0x04, 0x1b, 0x3c, 0x4d, - 0x59, 0x07, 0x10, 0x83, 0x80, 0x26, 0x84, 0x03, 0x84, 0x22, 0x80, 0x66, - 0xdd, 0x24, 0xd5, 0x41, 0x49, 0xfd, 0x83, 0x1f, 0xc0, 0x32, 0x2e, 0x05, - 0xb2, 0x48, 0x84, 0xa1, 0xd8, 0x05, 0x3c, 0x0d, 0x6c, 0x89, 0xc8, 0x19, - 0xd5, 0x2a, 0x3c, 0x1d, 0x6a, 0x3c, 0x84, 0x00, 0xdd, 0x21, 0xc0, 0x25, - 0x49, 0xff, 0xd7, 0x37, 0xc8, 0x0d, 0x3c, 0x4d, 0x59, 0x07, 0x46, 0x31, - 0x11, 0x11, 0x58, 0x31, 0x81, 0x11, 0x84, 0x03, 0x84, 0x22, 0x44, 0x20, - 0x74, 0x08, 0xdd, 0x24, 0xd5, 0x16, 0x84, 0x41, 0x3e, 0x25, 0xae, 0xf2, - 0x3c, 0x2d, 0x58, 0xe9, 0x80, 0x29, 0xdd, 0x22, 0x80, 0xc0, 0x3c, 0x4d, - 0x59, 0x07, 0x84, 0x22, 0x84, 0x03, 0x44, 0x20, 0x10, 0x42, 0x80, 0x66, - 0xdd, 0x24, 0xc6, 0x05, 0x84, 0x21, 0x3e, 0x15, 0xae, 0xed, 0xd5, 0x0d, - 0x3c, 0x0d, 0x6b, 0xb3, 0x44, 0x55, 0x00, 0x00, 0xd0, 0x03, 0x84, 0xc0, - 0xd5, 0x06, 0x49, 0xff, 0xfc, 0x4c, 0x49, 0xff, 0xfb, 0x88, 0x80, 0xc0, - 0x80, 0x06, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x2e, 0x15, - 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, 0xc0, 0xb5, - 0x48, 0xff, 0xff, 0x91, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0x84, 0xc0, - 0x3e, 0x65, 0x24, 0x98, 0x3e, 0x7d, 0xae, 0xcc, 0x54, 0x90, 0x80, 0xff, - 0x81, 0x40, 0x49, 0xfe, 0x55, 0xd4, 0x10, 0x63, 0x80, 0x26, 0x50, 0x03, - 0x80, 0x0c, 0x49, 0xfe, 0x27, 0x02, 0x80, 0xc0, 0xc6, 0x0f, 0x2e, 0x15, - 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, 0x4e, 0x02, - 0x01, 0x04, 0x3c, 0x1d, 0x6a, 0x3f, 0x84, 0x02, 0xdd, 0x21, 0x48, 0x00, - 0x00, 0xfe, 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, - 0x96, 0x00, 0xc8, 0x05, 0x49, 0xfd, 0x82, 0xa7, 0x81, 0x00, 0xc0, 0x18, - 0x3c, 0x1d, 0x58, 0xd5, 0x84, 0x00, 0xdd, 0x21, 0x81, 0x00, 0x2e, 0x05, - 0x24, 0x99, 0xc0, 0x08, 0x3c, 0x0d, 0x6b, 0xa8, 0xc8, 0x05, 0x3c, 0x0d, - 0x6b, 0xf6, 0x84, 0xa6, 0xd0, 0x03, 0x4e, 0x83, 0x00, 0x0f, 0x2e, 0x15, - 0xb4, 0xbe, 0x3e, 0x15, 0xae, 0xec, 0x85, 0x00, 0xd5, 0x08, 0x2e, 0x15, - 0xb4, 0xbe, 0x3c, 0x0d, 0x6a, 0x3d, 0x10, 0x13, 0x80, 0x20, 0xdd, 0x20, - 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, - 0xc0, 0x10, 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x0e, 0x3c, 0x0d, 0x6a, 0x37, - 0xdd, 0x20, 0x80, 0xe0, 0xc0, 0x09, 0x84, 0x20, 0x49, 0xfe, 0x2d, 0x4b, - 0x80, 0xc0, 0xc0, 0x04, 0x48, 0x00, 0x00, 0xbf, 0x84, 0xe0, 0x49, 0xfd, - 0x82, 0x6e, 0xc0, 0x25, 0x84, 0xa1, 0x4c, 0x82, 0xc0, 0x23, 0x2e, 0x55, - 0xb2, 0x48, 0x4c, 0x54, 0x40, 0x05, 0x3c, 0x7d, 0x6c, 0x89, 0xd5, 0x1b, - 0x3c, 0x0d, 0x49, 0x11, 0xdd, 0x20, 0x80, 0xe0, 0xc0, 0x16, 0x3c, 0x1d, - 0x6a, 0x3c, 0x84, 0x00, 0xdd, 0x21, 0x80, 0xe0, 0xc0, 0x10, 0x49, 0xff, - 0xd6, 0x7e, 0x80, 0xe0, 0xc8, 0x0c, 0x3c, 0x4d, 0x59, 0x07, 0x46, 0x32, - 0x22, 0x22, 0x58, 0x31, 0x82, 0x22, 0x84, 0x03, 0x84, 0x22, 0x44, 0x20, - 0x74, 0x08, 0xdd, 0x24, 0x3c, 0x2d, 0x58, 0xe9, 0x80, 0x29, 0x80, 0x07, - 0xdd, 0x22, 0x80, 0xc0, 0x4e, 0x03, 0x00, 0x8f, 0x3e, 0x7d, 0xae, 0xcc, - 0x2e, 0x15, 0xb4, 0xbe, 0x00, 0x03, 0x80, 0x20, 0x4c, 0x10, 0x00, 0x0c, - 0x04, 0x83, 0x80, 0x06, 0x49, 0xfd, 0xe7, 0xb7, 0x40, 0x04, 0x00, 0x01, - 0x94, 0x04, 0x92, 0x04, 0xa8, 0x3f, 0xd5, 0x06, 0x46, 0x10, 0xff, 0xff, - 0x58, 0x10, 0x8f, 0xff, 0xa8, 0x7f, 0x3c, 0x3d, 0x6b, 0xba, 0xe6, 0x69, - 0xe8, 0x17, 0x2e, 0x25, 0xae, 0xec, 0x3c, 0x1d, 0x6c, 0xfc, 0x44, 0x00, - 0x00, 0x44, 0x42, 0x11, 0x00, 0x73, 0x96, 0xd9, 0x00, 0x40, 0x80, 0x2e, - 0x84, 0x03, 0x40, 0x42, 0x40, 0x08, 0x40, 0x42, 0x08, 0x04, 0x44, 0x10, - 0x00, 0x10, 0x44, 0x20, 0x10, 0x54, 0x49, 0xfe, 0x63, 0x32, 0x3c, 0x2d, - 0x58, 0xeb, 0x84, 0x20, 0x84, 0x03, 0xdd, 0x22, 0xc0, 0x57, 0x44, 0x50, - 0x00, 0x20, 0x4c, 0xa2, 0x80, 0x54, 0x44, 0x50, 0x00, 0x60, 0x4c, 0xa2, - 0x80, 0x50, 0x49, 0xfe, 0x2d, 0x02, 0x81, 0x00, 0x3c, 0x0d, 0x49, 0x11, - 0xdd, 0x20, 0xc0, 0x0e, 0x49, 0xff, 0xfb, 0x61, 0x49, 0xff, 0xfa, 0x9d, - 0x80, 0xc0, 0xc0, 0x08, 0x84, 0x03, 0x44, 0x10, 0x00, 0x10, 0x44, 0x20, - 0x10, 0x94, 0x84, 0x61, 0xd5, 0x38, 0x3e, 0x7d, 0xae, 0xcc, 0x3c, 0x3d, - 0x58, 0xd9, 0xb4, 0x27, 0x50, 0x03, 0x80, 0x0c, 0x80, 0x49, 0xdd, 0x23, - 0x80, 0xc0, 0xc8, 0x1c, 0x49, 0xfe, 0x2a, 0x2f, 0xc0, 0x19, 0x49, 0xfe, - 0x26, 0x04, 0x84, 0xa1, 0xd0, 0x03, 0x95, 0xad, 0xd5, 0x13, 0x3c, 0x2d, - 0x58, 0xda, 0x10, 0x63, 0x80, 0x25, 0x80, 0x29, 0x50, 0x03, 0x80, 0x0c, - 0xdd, 0x22, 0x80, 0xc0, 0x3c, 0x4d, 0x59, 0x07, 0x44, 0x10, 0x00, 0x10, - 0x84, 0x03, 0x44, 0x20, 0x10, 0x55, 0x80, 0x66, 0xdd, 0x24, 0x4e, 0x83, - 0x00, 0x14, 0xce, 0x12, 0x2e, 0x05, 0x24, 0x98, 0xc8, 0x0f, 0x3c, 0x1d, - 0x58, 0xe8, 0x80, 0x09, 0xdd, 0x21, 0x80, 0xc0, 0x44, 0x10, 0x00, 0x10, - 0x84, 0x03, 0x44, 0x20, 0x10, 0x94, 0x84, 0x62, 0x80, 0x86, 0x49, 0xfe, - 0x62, 0xd6, 0x80, 0x06, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x48, 0x49, 0xfc, 0x8c, 0x7e, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0x9e, 0x6b, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x84, 0x06, 0x49, 0xff, - 0xff, 0xf2, 0xc0, 0x03, 0x84, 0x00, 0xd5, 0x10, 0x3c, 0x0d, 0x6b, 0xb6, - 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x2c, 0x49, 0xfd, 0x7f, 0x92, 0xc0, 0x07, - 0xb4, 0x00, 0x56, 0x00, 0x00, 0x04, 0x42, 0x00, 0x08, 0x0b, 0xd5, 0x02, - 0x84, 0x01, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xcc, 0x3e, 0x7d, 0xaf, 0x54, 0xa0, 0x3e, 0x50, 0x6f, - 0x80, 0x1c, 0x20, 0x90, 0x00, 0x20, 0x80, 0x06, 0x49, 0xfe, 0x04, 0x09, - 0x49, 0xfe, 0x57, 0x67, 0x00, 0x43, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x10, - 0x00, 0x23, 0x00, 0x0e, 0x00, 0x33, 0x00, 0x11, 0x40, 0x42, 0x20, 0x08, - 0x40, 0x10, 0xc0, 0x08, 0x98, 0x61, 0x98, 0x4a, 0x40, 0x41, 0xe0, 0x08, - 0x98, 0x4c, 0x94, 0x4b, 0x92, 0x26, 0x94, 0x4b, 0x94, 0x04, 0x92, 0x06, - 0x94, 0x02, 0x92, 0x21, 0x9a, 0x48, 0x94, 0x4c, 0x92, 0x24, 0x40, 0x00, - 0xdc, 0x09, 0x92, 0x65, 0x94, 0xdd, 0x54, 0x21, 0x00, 0x07, 0x95, 0x09, - 0x40, 0x22, 0x08, 0x04, 0x40, 0x30, 0x0c, 0x04, 0x40, 0x40, 0x9c, 0x09, - 0x84, 0x00, 0x92, 0x2f, 0x10, 0x13, 0x00, 0x10, 0x3e, 0x05, 0x6b, 0x66, - 0x10, 0x23, 0x00, 0x0e, 0x10, 0x43, 0x00, 0x0f, 0x10, 0x33, 0x00, 0x11, - 0x50, 0x8f, 0x80, 0x04, 0x10, 0x94, 0x00, 0x12, 0xb6, 0xc8, 0x14, 0x04, - 0x00, 0x03, 0x49, 0xfd, 0xcd, 0x88, 0x84, 0xa2, 0xd8, 0x24, 0xa6, 0x37, - 0x54, 0x00, 0x00, 0x04, 0xc0, 0x20, 0x49, 0xfe, 0x3b, 0x2a, 0xc8, 0x1d, - 0xa1, 0x3f, 0x84, 0xa4, 0xdc, 0x1a, 0xb4, 0x07, 0x49, 0xfe, 0x56, 0xeb, - 0x80, 0xc0, 0xc8, 0x15, 0x49, 0xff, 0xff, 0x87, 0xc0, 0x12, 0x3c, 0x1d, - 0x6a, 0x2a, 0xc1, 0x06, 0x80, 0x08, 0xdd, 0x21, 0xc0, 0x03, 0x80, 0x06, - 0xd5, 0x12, 0x84, 0x21, 0x3e, 0x15, 0x6b, 0x66, 0x3c, 0x1d, 0x59, 0x94, - 0x84, 0x05, 0xdd, 0x21, 0x84, 0x00, 0xd5, 0x09, 0x3c, 0x1d, 0x6a, 0x29, - 0xc9, 0x03, 0x80, 0x01, 0xd5, 0x04, 0x50, 0x0f, 0x80, 0x04, 0xdd, 0x21, - 0xec, 0x34, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xfc, 0x3e, 0x1d, 0xaf, 0x54, 0x3c, 0x2d, 0x6b, 0xb4, - 0xa0, 0xce, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x31, 0x80, 0x2c, 0x54, 0x90, - 0x00, 0xff, 0x4c, 0x31, 0x00, 0x0e, 0xa0, 0x0f, 0xe6, 0x03, 0xe9, 0x0a, - 0x44, 0x20, 0x00, 0x40, 0x3c, 0x2f, 0x6b, 0xa6, 0x84, 0x05, 0xa8, 0x0f, - 0x84, 0x20, 0x3e, 0x15, 0x6b, 0x66, 0x3e, 0x6d, 0xaf, 0x54, 0xa0, 0x36, - 0xa0, 0xf7, 0x04, 0x50, 0x00, 0x0e, 0x3c, 0x4d, 0x59, 0x07, 0x44, 0x10, - 0x04, 0x00, 0x84, 0x03, 0x44, 0x20, 0x10, 0x5f, 0x00, 0x72, 0x81, 0x45, - 0xdd, 0x24, 0xa0, 0xf7, 0xcb, 0x46, 0xa0, 0x76, 0x84, 0x01, 0x10, 0x00, - 0x80, 0x2e, 0x44, 0x40, 0x00, 0x11, 0xa0, 0x36, 0x04, 0x00, 0x00, 0x0e, - 0x10, 0x40, 0x01, 0x45, 0xa1, 0x36, 0xa0, 0x34, 0x04, 0x42, 0x00, 0x0e, - 0xa1, 0x75, 0xb6, 0x04, 0xa9, 0x61, 0x2e, 0x05, 0x6a, 0xa4, 0xc0, 0x18, - 0x3e, 0x35, 0x6a, 0xa4, 0x44, 0x00, 0x00, 0x18, 0x49, 0xfd, 0xf9, 0xdf, - 0x02, 0x03, 0x00, 0x10, 0x44, 0x10, 0x00, 0x18, 0x94, 0x04, 0x14, 0x13, - 0x00, 0x09, 0x49, 0xfe, 0x56, 0x94, 0x02, 0x13, 0x00, 0x10, 0xa8, 0x31, - 0x94, 0x0d, 0x49, 0xfe, 0x56, 0x8e, 0xa8, 0x32, 0xd5, 0x05, 0x04, 0x03, - 0x00, 0x09, 0x49, 0xfd, 0xf9, 0xca, 0x3e, 0x6d, 0xaf, 0x54, 0xa0, 0x33, - 0x9e, 0x02, 0x49, 0xfe, 0x56, 0x82, 0xb6, 0x06, 0x3c, 0x2d, 0x58, 0xd7, - 0xa0, 0x76, 0x84, 0x02, 0xdd, 0x22, 0x84, 0x05, 0xa8, 0x37, 0x3c, 0x1d, - 0x59, 0x94, 0x84, 0x02, 0xdd, 0x21, 0x84, 0x20, 0x3e, 0x15, 0x6b, 0x66, - 0x3e, 0x6d, 0xaf, 0x54, 0xa0, 0x77, 0x84, 0xa4, 0xd1, 0x34, 0xe6, 0x25, - 0xe8, 0x06, 0x84, 0xa2, 0xd1, 0x66, 0x84, 0xa3, 0xd9, 0x61, 0xd5, 0x0a, - 0x84, 0xa5, 0xd1, 0x04, 0x84, 0xa6, 0xd9, 0x5c, 0xd5, 0x49, 0x49, 0xfe, - 0x3b, 0x54, 0x84, 0x03, 0xd5, 0x55, 0x4e, 0x92, 0x00, 0x06, 0x49, 0xfe, - 0x3b, 0x4e, 0x84, 0x04, 0xd5, 0x4f, 0x84, 0xa2, 0xdf, 0x03, 0x49, 0xff, - 0xfe, 0xf2, 0x3e, 0x6d, 0xaf, 0x54, 0xa0, 0x37, 0x84, 0xa1, 0xd0, 0x4b, - 0xb4, 0x06, 0x49, 0xfe, 0x56, 0x2e, 0x46, 0x10, 0x20, 0x1c, 0xc0, 0x07, - 0x84, 0x01, 0xa8, 0x37, 0x84, 0x00, 0x3e, 0x05, 0x6b, 0x66, 0xd5, 0x3f, - 0x2e, 0x05, 0x6b, 0x66, 0x84, 0xa1, 0xd8, 0x03, 0x84, 0x06, 0xd5, 0x34, - 0x84, 0x05, 0xd5, 0x32, 0x84, 0xa2, 0xdf, 0x03, 0x49, 0xff, 0xfe, 0xd5, - 0x3e, 0x6d, 0xaf, 0x54, 0xa0, 0x37, 0x84, 0xa1, 0xd0, 0x15, 0xb4, 0x06, - 0x49, 0xfe, 0x56, 0x11, 0x46, 0x10, 0x20, 0x1c, 0xc0, 0x07, 0x84, 0x01, - 0xa8, 0x37, 0x84, 0x00, 0x3e, 0x05, 0x6b, 0x66, 0xd5, 0x09, 0x2e, 0x05, - 0x6b, 0x66, 0x84, 0xa1, 0xd8, 0x03, 0x84, 0x06, 0xd5, 0x02, 0x84, 0x03, - 0xa8, 0x37, 0x2e, 0x05, 0x6b, 0x0f, 0xc0, 0x17, 0xd5, 0x13, 0x80, 0x07, - 0x49, 0xfe, 0x3a, 0x63, 0xa1, 0x77, 0x84, 0x01, 0xd0, 0x10, 0xb4, 0x06, - 0x49, 0xfe, 0x55, 0xf3, 0x84, 0x21, 0x84, 0x45, 0x40, 0x31, 0x00, 0x1a, - 0x40, 0x30, 0x80, 0x1b, 0x80, 0x03, 0xa8, 0x37, 0xd5, 0x04, 0x84, 0x21, - 0x3c, 0x1f, 0x6b, 0xdc, 0x3c, 0x0d, 0x6b, 0xdc, 0x84, 0xa1, 0xd8, 0x03, - 0x49, 0xfe, 0x3b, 0x3d, 0xec, 0x04, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x80, 0xc0, 0x49, 0xfe, 0x1e, 0x13, - 0x84, 0xa1, 0xde, 0x14, 0x2e, 0x05, 0x6b, 0x87, 0x96, 0x04, 0xc0, 0x0c, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, 0x40, 0x00, 0x34, 0x08, - 0x92, 0x1e, 0xc0, 0x04, 0x3c, 0x0d, 0x59, 0xcd, 0xdd, 0x20, 0x49, 0xff, - 0xae, 0x60, 0x48, 0x00, 0x00, 0x82, 0x84, 0xa7, 0xde, 0x1b, 0x2e, 0x15, - 0x6b, 0x87, 0x46, 0x08, 0x10, 0x00, 0x54, 0x10, 0x80, 0x04, 0x04, 0x00, - 0x00, 0x0a, 0xc1, 0x6c, 0x54, 0x00, 0x00, 0x03, 0x84, 0xa1, 0xd0, 0x0a, - 0x84, 0xa3, 0xd8, 0x66, 0x46, 0x08, 0x10, 0x04, 0xa0, 0x07, 0x84, 0xa4, - 0x54, 0x00, 0x00, 0x07, 0xd8, 0x5f, 0x3c, 0x0d, 0x59, 0xce, 0xdd, 0x20, - 0xd5, 0x5b, 0x8c, 0xaa, 0xde, 0x26, 0x2e, 0x15, 0xe7, 0xc1, 0x4e, 0x12, - 0x00, 0x9f, 0x3c, 0x0d, 0x79, 0xf2, 0x3c, 0x5d, 0x5b, 0x43, 0x4c, 0x02, - 0xc0, 0x99, 0x04, 0x10, 0x00, 0x0e, 0x00, 0x30, 0x81, 0x45, 0x46, 0x10, - 0x20, 0x18, 0x3c, 0x3f, 0x49, 0x0d, 0x2e, 0x25, 0x24, 0x6a, 0x04, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x01, 0x67, 0x4c, 0x20, 0x00, 0x89, 0x3e, 0x05, - 0x24, 0x6a, 0xc8, 0x03, 0x84, 0x01, 0xd5, 0x03, 0x3c, 0x0d, 0x49, 0x0c, - 0x3c, 0x0f, 0x49, 0x0c, 0x48, 0x00, 0x00, 0x7e, 0x9d, 0x6a, 0xde, 0x0b, - 0x3e, 0x0d, 0x6c, 0x4c, 0xb4, 0x20, 0xc9, 0x77, 0x3c, 0x1d, 0x5b, 0x18, - 0x84, 0xa8, 0xd9, 0x73, 0x84, 0x2c, 0xd5, 0x2e, 0x9d, 0x69, 0xde, 0x24, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x46, 0x10, 0x01, 0x80, - 0x40, 0x00, 0x04, 0x02, 0x4c, 0x00, 0x80, 0x5c, 0x2e, 0x15, 0xe7, 0xc1, - 0xc1, 0x58, 0x3c, 0x0d, 0x79, 0xf2, 0x3c, 0x5d, 0x49, 0x0e, 0xd8, 0x53, - 0x3c, 0x1d, 0x49, 0x0d, 0x44, 0x20, 0xcf, 0x18, 0x54, 0x10, 0x80, 0x0f, - 0x40, 0x11, 0x04, 0x0e, 0x96, 0x4c, 0xc1, 0x49, 0x04, 0x00, 0x00, 0x0e, - 0x00, 0x10, 0x01, 0x46, 0x3c, 0x1f, 0x49, 0x0c, 0xd5, 0x42, 0x84, 0xa7, - 0xde, 0x09, 0x49, 0xff, 0xa7, 0xea, 0x3c, 0x1d, 0x5b, 0x43, 0x3e, 0x0d, - 0x24, 0x38, 0xb6, 0x20, 0xd5, 0x42, 0x84, 0xa1, 0xde, 0x04, 0x49, 0xff, - 0xa7, 0xf4, 0xd5, 0x3d, 0x84, 0xa5, 0xd6, 0x03, 0x84, 0xab, 0xde, 0x12, - 0x2e, 0x05, 0x24, 0x97, 0x84, 0xa1, 0xd8, 0x0e, 0x46, 0x00, 0x20, 0x18, - 0x2e, 0x15, 0x24, 0x7b, 0x9c, 0x49, 0x96, 0x48, 0x3e, 0x15, 0x24, 0x7b, - 0x5c, 0xf0, 0x80, 0x60, 0xe9, 0x03, 0x49, 0xff, 0xa7, 0xf2, 0x84, 0xa8, - 0xde, 0x04, 0x44, 0x00, 0xd3, 0x00, 0xd5, 0x21, 0x84, 0xab, 0xde, 0x04, - 0x44, 0x00, 0xd4, 0x00, 0xd5, 0x1c, 0x84, 0xa2, 0xde, 0x04, 0x44, 0x00, - 0xd1, 0x00, 0xd5, 0x17, 0x84, 0xa5, 0xde, 0x04, 0x44, 0x00, 0xd2, 0x00, - 0xd5, 0x12, 0x44, 0x50, 0x00, 0x17, 0xde, 0x04, 0x44, 0x00, 0xd5, 0x00, - 0xd5, 0x0c, 0x44, 0x50, 0x00, 0x14, 0xde, 0x04, 0x44, 0x00, 0xd7, 0x00, - 0xd5, 0x06, 0x44, 0x50, 0x00, 0x1a, 0xde, 0x05, 0x44, 0x00, 0xd6, 0x00, - 0x49, 0xff, 0x9c, 0x89, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, 0x7b, 0xd2, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0x3e, 0x7d, - 0xb2, 0xf8, 0x54, 0xa0, 0x00, 0xff, 0x84, 0xc0, 0xd5, 0x09, 0xa6, 0x38, - 0x9d, 0xf9, 0xe3, 0x40, 0xe8, 0x04, 0x80, 0x06, 0x49, 0xff, 0xff, 0xe9, - 0x9d, 0xb1, 0x2e, 0x05, 0x6b, 0x4e, 0x5c, 0xf0, 0x00, 0x3c, 0xe9, 0x04, - 0x44, 0x50, 0x00, 0x4f, 0xde, 0xf1, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0xbc, 0xef, 0xa8, 0x46, 0xa0, 0x00, 0xaf, - 0x58, 0xa5, 0x09, 0xf0, 0x3a, 0x05, 0x0c, 0x04, 0x50, 0x7f, 0x80, 0x3c, - 0x80, 0xc7, 0x46, 0x50, 0x00, 0xaf, 0x58, 0x52, 0x89, 0xd4, 0x50, 0x8f, - 0x80, 0x20, 0x3a, 0x03, 0x0c, 0x24, 0x46, 0x40, 0x00, 0xaf, 0x58, 0x42, - 0x09, 0xb8, 0x50, 0x9f, 0x80, 0x04, 0x3a, 0x05, 0x08, 0x00, 0x80, 0x66, - 0x81, 0x48, 0x3a, 0x01, 0x84, 0x24, 0x46, 0x60, 0x00, 0xab, 0x58, 0x63, - 0x05, 0x34, 0xac, 0x98, 0x3a, 0x02, 0x8c, 0x04, 0x3a, 0x05, 0x0c, 0x24, - 0x3a, 0x02, 0x88, 0x00, 0x80, 0x6a, 0x80, 0xa9, 0x3a, 0x01, 0x84, 0x24, - 0xac, 0x98, 0x3a, 0x02, 0x0c, 0x04, 0x3a, 0x02, 0x8c, 0x24, 0x3a, 0x02, - 0x08, 0x00, 0x80, 0x65, 0x3a, 0x01, 0x84, 0x24, 0x44, 0x00, 0x00, 0x23, - 0xac, 0x98, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x1f, 0xdd, 0x26, 0x44, 0x00, - 0x00, 0x19, 0xdd, 0x26, 0x44, 0x00, 0x00, 0x14, 0xdd, 0x26, 0x3c, 0x0d, - 0x5b, 0x10, 0x54, 0x10, 0x00, 0x07, 0xc1, 0x0a, 0x54, 0x10, 0x00, 0x08, - 0xc9, 0x07, 0x54, 0x00, 0x00, 0x04, 0x40, 0x74, 0x80, 0x1b, 0x40, 0x74, - 0x00, 0x1a, 0x84, 0xc0, 0xd5, 0x06, 0x38, 0x03, 0x98, 0x00, 0x9d, 0xb1, - 0x49, 0xff, 0x91, 0x21, 0x2e, 0x05, 0x6b, 0x4e, 0x5c, 0xf0, 0x00, 0x3c, - 0xe9, 0x04, 0x44, 0x50, 0x00, 0x1a, 0xde, 0xf4, 0xec, 0x58, 0x3a, 0x6f, - 0xa8, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0x49, 0xfc, 0x79, 0xb2, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xb4, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0a, 0x3c, 0x3a, 0x00, 0x0c, 0x00, 0x46, 0x60, 0x00, 0xaf, - 0x58, 0x63, 0x0a, 0x2c, 0x50, 0x7f, 0x80, 0x38, 0x50, 0x5f, 0x80, 0x28, - 0x3a, 0x03, 0x8c, 0x20, 0x46, 0x40, 0x00, 0xaf, 0x58, 0x42, 0x0a, 0x1c, - 0x51, 0xcf, 0x80, 0x18, 0x46, 0xa0, 0x00, 0xaf, 0x58, 0xa5, 0x0a, 0x0c, - 0x3a, 0x03, 0x0c, 0x00, 0x50, 0x9f, 0x80, 0x08, 0x84, 0xc0, 0x81, 0x06, - 0x3a, 0x02, 0x8c, 0x20, 0x80, 0xa9, 0x3a, 0x02, 0x0c, 0x00, 0x46, 0x40, - 0x00, 0xab, 0x58, 0x42, 0x06, 0x3c, 0x3a, 0x0e, 0x0c, 0x20, 0x3a, 0x05, - 0x0c, 0x00, 0x3a, 0x04, 0x8c, 0x20, 0x50, 0x0f, 0x80, 0x38, 0x38, 0x70, - 0x18, 0x02, 0x84, 0x20, 0x50, 0xaf, 0x80, 0x28, 0x38, 0x95, 0x18, 0x02, - 0x80, 0x07, 0x80, 0x41, 0xd5, 0x13, 0xa6, 0xd8, 0xe6, 0x71, 0xe8, 0x0d, - 0x50, 0xaf, 0x80, 0x18, 0x38, 0x35, 0x18, 0x02, 0x9c, 0x91, 0xe2, 0x03, - 0xe9, 0x06, 0x38, 0x32, 0x98, 0x02, 0xe2, 0x60, 0xe9, 0x02, 0x9c, 0x49, - 0xe6, 0x4e, 0xe8, 0x19, 0x9c, 0x01, 0x3e, 0xad, 0xb2, 0xf8, 0x40, 0x30, - 0x28, 0x00, 0xe3, 0x20, 0xe8, 0xe9, 0xd5, 0x2b, 0x3c, 0x2d, 0x5b, 0x10, - 0x84, 0x21, 0x40, 0x10, 0xa0, 0x0c, 0x40, 0x10, 0x88, 0x04, 0x3c, 0x1f, - 0x5b, 0x10, 0xd5, 0x23, 0xb6, 0x9f, 0xf5, 0x81, 0x9d, 0xf9, 0xdd, 0x24, - 0xf5, 0x01, 0xb4, 0x9f, 0x96, 0x38, 0xe3, 0x27, 0xe8, 0xf8, 0x84, 0x21, - 0x3c, 0x2d, 0x5b, 0x10, 0x40, 0x10, 0xa0, 0x0c, 0x40, 0x10, 0x84, 0x05, - 0x40, 0x10, 0x88, 0x02, 0x3c, 0x1f, 0x5b, 0x10, 0x8d, 0x01, 0x84, 0x04, - 0x9d, 0xb4, 0x4c, 0x80, 0x7f, 0xba, 0x49, 0xff, 0x9d, 0x88, 0x92, 0x00, - 0xec, 0x4c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0xe6, 0x27, 0xe9, 0xd5, - 0x3c, 0x1d, 0x5b, 0x10, 0x84, 0x01, 0x40, 0x00, 0x20, 0x0c, 0x40, 0x00, - 0x04, 0x02, 0xc0, 0xdd, 0xd5, 0xea, 0x3a, 0x6f, 0xa4, 0xbc, 0xef, 0xe4, - 0x46, 0x50, 0x00, 0xaf, 0x58, 0x52, 0x8a, 0x4c, 0x3a, 0x02, 0x8c, 0x04, - 0x80, 0x9f, 0x80, 0xdf, 0x50, 0x9f, 0x80, 0x14, 0x3a, 0x02, 0x0c, 0x24, - 0x3a, 0x02, 0x84, 0x00, 0x40, 0x30, 0xc0, 0x09, 0xb6, 0x04, 0x10, 0x34, - 0x80, 0x02, 0x12, 0x14, 0x80, 0x00, 0xd5, 0x05, 0x08, 0x03, 0x00, 0x01, - 0x49, 0xfd, 0xe8, 0xeb, 0x2e, 0x05, 0x6b, 0x51, 0x5c, 0xf0, 0x00, 0x3c, - 0xe9, 0x03, 0x4c, 0x64, 0xff, 0xf7, 0xec, 0x1c, 0x3a, 0x6f, 0xa4, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x97, 0x75, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x00, 0x00, 0x00, 0x2c, 0x49, 0xfd, 0x7b, 0xe4, 0xc0, 0x11, - 0xb4, 0xc0, 0x44, 0x2e, 0xec, 0x3a, 0x40, 0x63, 0x08, 0x02, 0xce, 0x0b, - 0x04, 0x10, 0x00, 0x92, 0xc9, 0x03, 0x84, 0x01, 0xd5, 0x07, 0x49, 0xfd, - 0xd2, 0xe0, 0x40, 0x03, 0x00, 0x06, 0xd5, 0x02, 0x84, 0x00, 0x3a, 0x6f, - 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x80, 0xe1, - 0x81, 0x02, 0x96, 0x00, 0xc1, 0x03, 0x80, 0xc1, 0xd5, 0x08, 0x3c, 0x6d, - 0x6c, 0xfc, 0x44, 0x10, 0x00, 0x44, 0x42, 0x60, 0x04, 0x73, 0xc6, 0x14, - 0xa0, 0x31, 0xc0, 0x12, 0x80, 0x06, 0x49, 0xff, 0xff, 0xd2, 0xc0, 0x0e, - 0x00, 0x03, 0x00, 0x2c, 0xc0, 0x0b, 0x3c, 0x0d, 0x6b, 0xa8, 0x44, 0x50, - 0x01, 0x00, 0xd8, 0x06, 0xc7, 0x02, 0xd5, 0x02, 0xb6, 0xc8, 0x84, 0x01, - 0xd5, 0x02, 0x84, 0x00, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x9a, 0xd9, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0x99, 0xdf, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, - 0x7a, 0xcc, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, 0x7a, 0x4a, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x3c, 0x3d, 0x78, 0x97, 0x3e, 0x0d, 0xb2, 0x6c, 0x84, 0x40, 0xf2, 0x81, - 0xa1, 0x01, 0x4e, 0x32, 0x00, 0x7f, 0x50, 0x00, 0x00, 0x6c, 0x3c, 0x2f, - 0x78, 0x97, 0x84, 0xc3, 0x80, 0x20, 0x00, 0x30, 0xff, 0xe0, 0xa7, 0x48, - 0x94, 0xdc, 0x80, 0x43, 0x42, 0x22, 0x98, 0x73, 0x98, 0x92, 0x54, 0x71, - 0x00, 0x07, 0xe2, 0xa3, 0xe8, 0x06, 0x40, 0x31, 0x0c, 0x09, 0xc7, 0x03, - 0x9c, 0x99, 0xd5, 0x02, 0x92, 0x43, 0x18, 0x20, 0x80, 0x01, 0x3e, 0x7d, - 0xb2, 0xf8, 0x4c, 0x13, 0xff, 0xea, 0xa6, 0xe0, 0xa7, 0xa1, 0x85, 0x02, - 0x9b, 0x73, 0xa6, 0x80, 0xa6, 0x41, 0x4c, 0x54, 0x40, 0x0f, 0x3f, 0xcd, - 0xb2, 0xf8, 0x99, 0xca, 0x50, 0xae, 0x00, 0x01, 0x40, 0x51, 0xa8, 0x00, - 0x90, 0xe1, 0x88, 0x7c, 0xae, 0x98, 0x88, 0xdc, 0xaf, 0xe8, 0xd5, 0x1e, - 0x84, 0xe3, 0xdf, 0x1d, 0x40, 0x80, 0x84, 0x00, 0x3f, 0xcd, 0xb2, 0xf8, - 0x40, 0x91, 0x08, 0x00, 0x89, 0x02, 0x50, 0xae, 0x00, 0x02, 0x40, 0x84, - 0x14, 0xf6, 0x89, 0x21, 0x40, 0x71, 0xa8, 0x00, 0x40, 0xa1, 0xf0, 0x00, - 0x10, 0x25, 0x00, 0x00, 0x88, 0xdc, 0x51, 0xce, 0x00, 0x01, 0x88, 0x7c, - 0x40, 0x24, 0x94, 0xb6, 0xae, 0x98, 0x10, 0x83, 0x80, 0x00, 0xae, 0x70, - 0x9c, 0x01, 0x3e, 0x1d, 0xb2, 0xf7, 0x9d, 0x21, 0x4c, 0x00, 0xff, 0xc9, - 0x84, 0xc0, 0x3e, 0x2d, 0xb2, 0xf8, 0x98, 0x32, 0xa6, 0x00, 0x5c, 0xf0, - 0x00, 0x2c, 0xe9, 0x12, 0x80, 0x06, 0x49, 0xff, 0xfd, 0xd4, 0xc6, 0x08, - 0x9e, 0x31, 0x96, 0x00, 0x49, 0xff, 0xfd, 0xcf, 0x44, 0x50, 0x00, 0x4e, - 0xd6, 0x0d, 0x9d, 0xb1, 0x97, 0xb0, 0x80, 0x06, 0x49, 0xff, 0xfd, 0xc7, - 0xd5, 0x07, 0x5c, 0xf0, 0x00, 0x28, 0xe8, 0x04, 0x80, 0x06, 0x49, 0xff, - 0xfe, 0x4e, 0x9d, 0xb1, 0x97, 0xb0, 0x5c, 0xf3, 0x00, 0x4f, 0xe9, 0xde, - 0x49, 0xff, 0xfe, 0x51, 0x84, 0xe0, 0x83, 0x87, 0x50, 0x6f, 0x80, 0x04, - 0x15, 0xcf, 0x80, 0x01, 0x80, 0x07, 0x80, 0x26, 0x49, 0xff, 0xff, 0x65, - 0x80, 0x07, 0x80, 0x26, 0x49, 0xff, 0xff, 0x57, 0xf0, 0x01, 0x96, 0x04, - 0xc0, 0x04, 0x80, 0x07, 0x49, 0xff, 0xfe, 0x33, 0x9d, 0xf9, 0x44, 0x50, - 0x00, 0x4f, 0xdf, 0xed, 0x84, 0xe0, 0x81, 0x27, 0x50, 0x6f, 0x80, 0x04, - 0x14, 0x9f, 0x80, 0x01, 0x80, 0x07, 0x80, 0x26, 0x49, 0xff, 0xe7, 0xd5, - 0x9d, 0xf9, 0x44, 0x50, 0x00, 0x25, 0xdf, 0xf7, 0x49, 0xff, 0xfd, 0xb7, - 0x2e, 0x05, 0x6b, 0x4f, 0xc0, 0x0c, 0x3e, 0x1d, 0xaa, 0x5c, 0x3e, 0x0d, - 0xae, 0x8c, 0x84, 0x4a, 0x49, 0xfe, 0xdf, 0x7f, 0x2e, 0x15, 0x6b, 0x4e, - 0x3e, 0x15, 0x6b, 0x51, 0x2e, 0x05, 0x6b, 0x50, 0xc0, 0x08, 0x3e, 0x0d, - 0xaa, 0x70, 0x3e, 0x1d, 0xaa, 0x5c, 0x84, 0x4a, 0x49, 0xfe, 0xdf, 0x71, - 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xf4, 0x84, 0xe0, 0xf7, 0x81, 0x80, 0xdf, 0xd5, 0x4c, - 0x49, 0xfd, 0xec, 0x2f, 0x9d, 0xf9, 0xc8, 0x03, 0x97, 0xf8, 0xd5, 0x46, - 0x84, 0xe0, 0x44, 0x90, 0x00, 0xff, 0x50, 0x6f, 0x80, 0x04, 0x44, 0x86, - 0x89, 0x74, 0x45, 0xc6, 0x89, 0xd0, 0x84, 0x40, 0x80, 0x07, 0x80, 0x26, - 0xf2, 0x81, 0x49, 0xff, 0xff, 0x0e, 0x80, 0x07, 0x80, 0x26, 0x49, 0xff, - 0xff, 0x00, 0xf0, 0x01, 0x96, 0x44, 0xc1, 0x04, 0x80, 0x07, 0xdd, 0x3c, - 0xd5, 0x25, 0x54, 0x00, 0x00, 0x04, 0xc0, 0x22, 0x54, 0xa3, 0x80, 0xff, - 0x4e, 0xa2, 0x00, 0x13, 0x80, 0x09, 0xdd, 0x28, 0xf0, 0x01, 0x54, 0x00, - 0x00, 0x20, 0xc0, 0x08, 0x84, 0xa1, 0x4c, 0xa2, 0x80, 0x0a, 0x50, 0x04, - 0xff, 0xff, 0x96, 0x00, 0xdd, 0x28, 0x44, 0x50, 0x00, 0x4e, 0x4c, 0xa2, - 0x80, 0x0e, 0x9c, 0x39, 0xdd, 0x28, 0xf0, 0x01, 0x54, 0x00, 0x00, 0x20, - 0xc0, 0x07, 0x44, 0x50, 0x00, 0x4d, 0x4c, 0xa2, 0x80, 0x04, 0x9c, 0x3a, - 0xdd, 0x28, 0x8d, 0x21, 0x9d, 0xf9, 0x44, 0x50, 0x00, 0x4f, 0x54, 0x94, - 0x80, 0xff, 0xdf, 0xc6, 0xd5, 0x08, 0x2e, 0x34, 0xa2, 0x9c, 0x80, 0x07, - 0x84, 0x20, 0x80, 0x5f, 0xe2, 0xe3, 0xe9, 0xaf, 0x49, 0xff, 0xfe, 0x65, - 0x49, 0xff, 0xfe, 0x3b, 0x2e, 0x15, 0x6b, 0x51, 0x5c, 0x10, 0x80, 0x33, - 0x3e, 0x15, 0x6b, 0x54, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xf0, 0x2e, 0x75, 0x9b, 0xcd, - 0x2e, 0x84, 0xa2, 0x9c, 0xcf, 0x0f, 0x3c, 0x0d, 0x5b, 0x0a, 0x44, 0x51, - 0x00, 0x00, 0xb4, 0x00, 0xd0, 0x09, 0x2e, 0x05, 0x6b, 0x4f, 0xc0, 0x09, - 0x49, 0xff, 0xfe, 0x9b, 0x3e, 0x75, 0x6b, 0x4f, 0xd5, 0x04, 0x84, 0x21, - 0x3e, 0x15, 0x6b, 0x4f, 0x2e, 0x75, 0xb6, 0x16, 0x3e, 0x6d, 0x6b, 0x50, - 0xcf, 0x07, 0xa6, 0x30, 0xc0, 0x07, 0x49, 0xff, 0xa1, 0x40, 0xaf, 0xf0, - 0xd5, 0x03, 0x84, 0x01, 0xae, 0x30, 0x3e, 0x1d, 0xae, 0x8c, 0x84, 0x4a, - 0x50, 0x0f, 0x80, 0x04, 0x49, 0xfe, 0xde, 0xd7, 0x84, 0x00, 0x49, 0xfe, - 0x6c, 0xa0, 0x3c, 0x1d, 0x78, 0x97, 0xc1, 0x03, 0x3c, 0x0f, 0x5b, 0x0c, - 0x3c, 0x1d, 0x5b, 0x0c, 0x84, 0xbf, 0xd1, 0x04, 0x9a, 0x41, 0x94, 0x4c, - 0x92, 0x24, 0x2e, 0x05, 0xb4, 0xce, 0xc0, 0x07, 0x5c, 0xf0, 0x92, 0xc0, - 0xe8, 0x04, 0x49, 0xff, 0xfe, 0x88, 0xd5, 0x12, 0x3e, 0x0d, 0x25, 0x70, - 0x3e, 0x1d, 0xa8, 0x20, 0x84, 0x4a, 0x49, 0xfe, 0xde, 0xb8, 0x2e, 0x05, - 0x6b, 0x4f, 0xc0, 0x03, 0x49, 0xff, 0xff, 0x49, 0x2e, 0x05, 0x6b, 0x50, - 0xc0, 0x03, 0x49, 0xff, 0xe6, 0xfe, 0x84, 0x00, 0x50, 0x3f, 0x80, 0x04, - 0x3e, 0x2d, 0xae, 0x8c, 0x98, 0x42, 0xa6, 0x48, 0x38, 0x51, 0x80, 0x00, - 0x9c, 0x01, 0xd1, 0x03, 0x84, 0x02, 0xd5, 0x04, 0x84, 0xaa, 0xd8, 0xf5, - 0x84, 0x00, 0x2e, 0x25, 0x6b, 0x51, 0x46, 0x10, 0x20, 0x1c, 0x5c, 0xf1, - 0x00, 0x33, 0xe9, 0x1d, 0x3e, 0x2d, 0xb3, 0xb4, 0x00, 0x31, 0x01, 0x19, - 0x84, 0x81, 0x3e, 0x45, 0x6b, 0x53, 0xc3, 0x18, 0x44, 0x10, 0x00, 0x44, - 0x42, 0x44, 0x04, 0x24, 0x84, 0x20, 0xd5, 0x0c, 0x04, 0x31, 0x00, 0x0f, - 0x98, 0xd9, 0xa1, 0x59, 0xc5, 0x05, 0x00, 0x51, 0x01, 0x27, 0x10, 0x51, - 0x80, 0x32, 0x50, 0x10, 0x80, 0x44, 0x4c, 0x12, 0x7f, 0xf5, 0xd5, 0x04, - 0x84, 0x40, 0x3e, 0x25, 0x6b, 0x53, 0x49, 0xff, 0xfe, 0x16, 0xec, 0x10, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0x49, 0xfc, 0x78, 0xb2, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x75, 0xeb, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa8, 0xbc, 0x80, 0xc1, 0x8e, 0x29, 0x81, 0x00, 0x54, 0xa1, 0x00, 0xff, - 0xe6, 0x22, 0xe8, 0x06, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x01, 0x70, - 0xd5, 0x05, 0x84, 0x02, 0x49, 0xfd, 0xef, 0x67, 0x80, 0xe0, 0x5c, 0xf3, - 0x80, 0x4f, 0xe8, 0x3f, 0x49, 0xfd, 0xd0, 0x93, 0xc0, 0x08, 0x44, 0x00, - 0x00, 0xff, 0x80, 0x28, 0x84, 0x40, 0x49, 0xfd, 0xeb, 0x0c, 0xc0, 0x35, - 0x49, 0xfe, 0xf4, 0x6d, 0x81, 0x20, 0x84, 0xa6, 0xd6, 0x11, 0xe6, 0xc7, - 0xe8, 0x08, 0x84, 0xa4, 0xd6, 0x18, 0xe6, 0xc5, 0xe8, 0x1a, 0x84, 0xa3, - 0xde, 0x24, 0xd5, 0x20, 0x84, 0xa9, 0xd6, 0x11, 0x84, 0xaa, 0xd6, 0x0b, - 0x84, 0xa7, 0xde, 0x1d, 0xd5, 0x08, 0x80, 0x2a, 0x80, 0x49, 0x80, 0x68, - 0x80, 0x07, 0x49, 0xff, 0x8d, 0xa6, 0xd5, 0x15, 0x80, 0x07, 0x49, 0xff, - 0x8d, 0xb6, 0xd5, 0x11, 0x80, 0x07, 0x49, 0xff, 0x8c, 0xf6, 0xd5, 0x0d, - 0x80, 0x08, 0x84, 0x25, 0x49, 0xff, 0xff, 0xb1, 0x80, 0x27, 0x80, 0x49, - 0x49, 0xff, 0x8d, 0x0f, 0xd5, 0x04, 0x80, 0x07, 0x49, 0xff, 0x8c, 0xf9, - 0x80, 0x07, 0x49, 0xff, 0xff, 0x9c, 0x92, 0x00, 0x3a, 0x6f, 0xa8, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xe8, 0x3c, 0x0d, 0x6c, 0x9b, - 0x84, 0xa1, 0xd0, 0x04, 0x84, 0xc0, 0x48, 0x00, 0x00, 0xb2, 0x2e, 0x25, - 0xb4, 0xbe, 0x3c, 0x1d, 0x6c, 0xfc, 0x44, 0x00, 0x00, 0x44, 0x42, 0x11, - 0x00, 0x73, 0x3c, 0x2d, 0x58, 0xd7, 0x44, 0x00, 0x00, 0x10, 0xdd, 0x22, - 0x2e, 0x05, 0x6b, 0x83, 0xc8, 0x19, 0x49, 0xfe, 0x6b, 0xb8, 0x3c, 0x1d, - 0x5b, 0x27, 0x84, 0xbf, 0xd1, 0x07, 0x9a, 0x41, 0x94, 0x4c, 0x92, 0x24, - 0x5c, 0xf0, 0x99, 0x01, 0xe9, 0x0a, 0x84, 0x42, 0x3e, 0x25, 0x6b, 0x83, - 0x84, 0x40, 0x3e, 0x25, 0x6b, 0x84, 0x3c, 0x0f, 0x5b, 0x27, 0xd5, 0x04, - 0x84, 0x07, 0x3e, 0x05, 0x6b, 0x83, 0x49, 0xfd, 0xdf, 0x5c, 0x80, 0xe0, - 0x49, 0xfd, 0xdf, 0x5d, 0x80, 0xc0, 0x2e, 0x55, 0xb4, 0xbe, 0xd7, 0x0b, - 0x84, 0xbf, 0xd6, 0x09, 0x80, 0x07, 0x49, 0xfd, 0xe0, 0x8a, 0x9b, 0xb0, - 0x95, 0xb4, 0x92, 0xc4, 0xe6, 0xc7, 0xe9, 0x72, 0x49, 0xff, 0x90, 0x09, - 0xc8, 0x6f, 0x3e, 0x1d, 0xb2, 0x6c, 0x00, 0x20, 0x80, 0xdb, 0xc2, 0x07, - 0xa0, 0x89, 0x10, 0x00, 0x80, 0xdb, 0xa0, 0x0a, 0xa8, 0x8a, 0xa8, 0x09, - 0x3c, 0x2d, 0x59, 0xe8, 0xa0, 0x09, 0x50, 0x10, 0x80, 0x4c, 0xdd, 0x22, - 0x84, 0x41, 0x3e, 0x25, 0x24, 0x98, 0xc0, 0x5a, 0x94, 0x14, 0x49, 0xfe, - 0x50, 0xc0, 0x3e, 0x2d, 0x6b, 0x83, 0xa6, 0x50, 0x9e, 0xca, 0x96, 0xd8, - 0x3c, 0x0f, 0x49, 0x36, 0xe6, 0x64, 0xe8, 0x04, 0x9c, 0x49, 0xae, 0x50, - 0xd5, 0x4b, 0x84, 0xa6, 0xd1, 0x03, 0x84, 0xa1, 0xd9, 0x05, 0x84, 0x27, - 0x3e, 0x15, 0x6b, 0x83, 0xd5, 0x43, 0x3c, 0x6d, 0x78, 0x97, 0x84, 0x00, - 0xae, 0x10, 0xc6, 0x3f, 0x2e, 0x05, 0xb4, 0xce, 0xc0, 0x0b, 0x84, 0x23, - 0x3c, 0x1f, 0x6a, 0x7d, 0x3c, 0x3d, 0x29, 0xa1, 0x84, 0x20, 0x44, 0x00, - 0x00, 0x49, 0x80, 0x41, 0xdd, 0x23, 0x2e, 0x05, 0x6b, 0x68, 0xc0, 0x14, - 0x3e, 0x6d, 0xb2, 0x6c, 0xa1, 0xf1, 0x50, 0x63, 0x00, 0x4c, 0x08, 0x43, - 0x00, 0x01, 0x08, 0x33, 0x80, 0x01, 0x84, 0x21, 0x84, 0x03, 0x44, 0x20, - 0x10, 0x90, 0x49, 0xfe, 0x5b, 0xd2, 0x3e, 0x5d, 0xb2, 0xd8, 0xde, 0xf4, - 0xd5, 0x19, 0x46, 0x08, 0x10, 0x06, 0x04, 0x40, 0x00, 0xd8, 0x84, 0x21, - 0x84, 0x03, 0x44, 0x20, 0x10, 0x90, 0x44, 0x30, 0x83, 0x5c, 0x49, 0xfe, - 0x5b, 0xc2, 0x46, 0x08, 0x10, 0x06, 0x04, 0x40, 0x00, 0xd9, 0x84, 0x21, - 0x84, 0x03, 0x44, 0x20, 0x10, 0x90, 0x44, 0x30, 0x83, 0x60, 0x49, 0xfe, - 0x5b, 0xb6, 0x84, 0xc1, 0xd5, 0x02, 0x84, 0xc0, 0x84, 0x22, 0x3c, 0x1f, - 0x6c, 0x9b, 0x3e, 0x7d, 0xb2, 0x6c, 0xb4, 0x47, 0x84, 0xa2, 0xda, 0x16, - 0x3c, 0x1d, 0x58, 0xd8, 0x84, 0x01, 0xdd, 0x21, 0x3c, 0x1d, 0x6a, 0x49, - 0x44, 0x30, 0x00, 0x1f, 0x84, 0x00, 0x40, 0x20, 0x18, 0x1b, 0x40, 0x21, - 0x98, 0x1a, 0xb6, 0x07, 0xc1, 0x07, 0x50, 0x73, 0x80, 0x4c, 0xf2, 0x83, - 0xf7, 0x81, 0x80, 0x1f, 0xdd, 0x21, 0xec, 0x18, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x8b, 0xff, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x3e, 0x6d, 0xaf, 0xac, 0xa0, 0x35, 0x49, 0xfe, 0x50, 0x25, - 0xc0, 0x1b, 0x49, 0xff, 0x8b, 0xd2, 0x2e, 0x05, 0xe7, 0xc1, 0xc0, 0x06, - 0x44, 0x00, 0x18, 0x00, 0x49, 0xfe, 0x50, 0x39, 0xd5, 0x0c, 0x2e, 0x05, - 0x24, 0x63, 0xc8, 0x04, 0x44, 0x00, 0x10, 0x00, 0xd5, 0x04, 0x02, 0x03, - 0x00, 0x1a, 0x94, 0x04, 0x49, 0xfe, 0x50, 0x2d, 0xa8, 0x35, 0x49, 0xfd, - 0xf3, 0x70, 0x3c, 0x0f, 0x49, 0x09, 0x3c, 0x1d, 0x58, 0xd2, 0x3c, 0x0d, - 0x6b, 0xf3, 0xdd, 0x21, 0x3c, 0x1d, 0x59, 0x94, 0x84, 0x02, 0xdd, 0x21, - 0x3c, 0x0d, 0x6b, 0xf3, 0x84, 0x24, 0x49, 0xff, 0x4d, 0xe0, 0x92, 0x00, - 0x3c, 0x1d, 0x59, 0xa9, 0x84, 0x08, 0xdd, 0x21, 0x3a, 0x6f, 0x98, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa8, 0xbc, 0xef, 0xe8, 0x3e, 0x6d, 0xaf, 0xac, - 0x04, 0x33, 0x00, 0x0b, 0x54, 0x80, 0x00, 0xff, 0xcb, 0x4a, 0x2e, 0x05, - 0xb4, 0xf2, 0xc0, 0x30, 0x2e, 0x05, 0x24, 0x67, 0x84, 0xa1, 0xd8, 0x27, - 0x3e, 0x35, 0x24, 0x67, 0x44, 0x00, 0x00, 0x18, 0x49, 0xfd, 0xf3, 0x3d, - 0x2e, 0x05, 0xe7, 0xc1, 0x44, 0x10, 0x00, 0x18, 0x3c, 0x1f, 0x49, 0x09, - 0xc0, 0x06, 0x44, 0x00, 0x18, 0x00, 0x49, 0xfe, 0x4f, 0xf0, 0xd5, 0x0c, - 0x2e, 0x05, 0x24, 0x63, 0xc8, 0x04, 0x44, 0x00, 0x10, 0x00, 0xd5, 0x04, - 0x02, 0x03, 0x00, 0x1a, 0x94, 0x04, 0x49, 0xfe, 0x4f, 0xe4, 0xa8, 0x35, - 0x3c, 0x02, 0xd7, 0xf0, 0x94, 0x05, 0x49, 0xfe, 0x4f, 0xde, 0x3c, 0x0f, - 0x6b, 0xf1, 0xd5, 0x0a, 0x3c, 0x0d, 0x49, 0x09, 0x49, 0xfd, 0xf3, 0x19, - 0xd5, 0x05, 0x44, 0x00, 0x00, 0x18, 0x49, 0xfd, 0xf3, 0x14, 0x3e, 0x6d, - 0xaf, 0xac, 0xb4, 0x06, 0x49, 0xfe, 0x4f, 0xcd, 0xa8, 0x33, 0x3c, 0x2d, - 0x58, 0xd7, 0x04, 0x13, 0x00, 0x08, 0x84, 0x00, 0xdd, 0x22, 0x3c, 0x1d, - 0x59, 0x94, 0x84, 0x02, 0xdd, 0x21, 0x84, 0x03, 0x14, 0x03, 0x00, 0x0b, - 0x3c, 0x1d, 0x6b, 0xb4, 0x3c, 0x2d, 0x6b, 0xf3, 0x00, 0x10, 0x80, 0x2c, - 0x00, 0x51, 0x00, 0x2c, 0xd1, 0x0e, 0x3c, 0x0d, 0x6b, 0xf6, 0x9e, 0x43, - 0xe6, 0x22, 0xe9, 0x03, 0x84, 0xac, 0xd8, 0x07, 0x84, 0x24, 0x3c, 0x1f, - 0x6b, 0xa6, 0x84, 0x23, 0x3c, 0x1f, 0x6b, 0xf6, 0x3c, 0x0d, 0x6b, 0xf6, - 0x9e, 0x06, 0xe6, 0x03, 0xe8, 0x05, 0x3c, 0x1d, 0x59, 0x94, 0x84, 0x03, - 0xdd, 0x21, 0x4e, 0x82, 0x00, 0x05, 0x44, 0x70, 0x00, 0x11, 0xd5, 0x07, - 0x3c, 0x0d, 0x6b, 0xf3, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x01, 0x45, - 0x3e, 0x6d, 0xaf, 0xac, 0x3c, 0x4d, 0x59, 0x07, 0x04, 0x33, 0x00, 0x0b, - 0x44, 0x10, 0x08, 0x00, 0x84, 0x03, 0x44, 0x20, 0x10, 0x62, 0xdd, 0x24, - 0x04, 0x13, 0x00, 0x0b, 0x85, 0x26, 0x4c, 0x14, 0x80, 0x8f, 0xe6, 0x27, - 0xe8, 0x11, 0x85, 0x43, 0x4c, 0x15, 0x00, 0x23, 0xe6, 0x24, 0xe8, 0x06, - 0x84, 0xa1, 0x4c, 0x12, 0xc1, 0x56, 0x48, 0x00, 0x01, 0x58, 0x84, 0xa4, - 0xd1, 0x23, 0x84, 0xa5, 0x4c, 0x12, 0xc1, 0x4f, 0xd5, 0x61, 0x85, 0x49, - 0x4c, 0x15, 0x00, 0xe2, 0xe6, 0x2a, 0xe8, 0x09, 0x84, 0xa7, 0x4c, 0x12, - 0x80, 0x9a, 0x84, 0xa8, 0x4c, 0x12, 0xc1, 0x43, 0x48, 0x00, 0x00, 0xc5, - 0x84, 0xaa, 0x4c, 0x12, 0x80, 0xfc, 0x84, 0xac, 0x4c, 0x12, 0xc1, 0x3b, - 0xd5, 0x2d, 0xa0, 0x33, 0x49, 0xfe, 0x4f, 0x3d, 0xc0, 0x03, 0x48, 0x00, - 0x00, 0xb1, 0x49, 0xff, 0xff, 0x0e, 0x48, 0x00, 0x01, 0x2a, 0x4e, 0x82, - 0x00, 0x09, 0x49, 0xff, 0xff, 0x08, 0x84, 0x0c, 0x14, 0x03, 0x00, 0x0b, - 0x48, 0x00, 0x01, 0x2b, 0x8c, 0xac, 0x4c, 0x72, 0xc0, 0x90, 0x04, 0x23, - 0x00, 0x08, 0x46, 0x08, 0x10, 0x02, 0x04, 0x10, 0x00, 0x0e, 0xa0, 0x15, - 0x98, 0x08, 0x49, 0xfd, 0xf2, 0xec, 0x84, 0x48, 0x3c, 0x2f, 0x6b, 0xa6, - 0xa0, 0x31, 0x49, 0xfe, 0x4f, 0x38, 0x84, 0x25, 0x14, 0x13, 0x00, 0x0b, - 0xa8, 0x34, 0x48, 0x00, 0x01, 0x12, 0x9d, 0x6c, 0xdf, 0x0b, 0x84, 0x48, - 0xa0, 0x31, 0x3c, 0x2f, 0x6b, 0xa6, 0x49, 0xfe, 0x4f, 0x2a, 0xa8, 0x34, - 0x14, 0x93, 0x00, 0x0b, 0xd5, 0x0e, 0xa0, 0x33, 0x49, 0xfe, 0x4f, 0x05, - 0xc0, 0x07, 0x3c, 0x1d, 0x59, 0xd8, 0x84, 0x02, 0xdd, 0x21, 0x84, 0x01, - 0xd5, 0x02, 0x84, 0x04, 0x14, 0x03, 0x00, 0x0b, 0x2e, 0x05, 0x6b, 0x0f, - 0x4e, 0x02, 0x00, 0xf5, 0x84, 0x21, 0x48, 0x00, 0x00, 0xa9, 0xa0, 0x34, - 0x49, 0xfe, 0x4e, 0xf1, 0xc0, 0x08, 0xa0, 0x33, 0x49, 0xfe, 0x4e, 0xed, - 0x4e, 0x02, 0x00, 0xdd, 0x48, 0x00, 0x00, 0x60, 0x3c, 0x1d, 0x58, 0xd2, - 0x04, 0x03, 0x00, 0x08, 0xdd, 0x21, 0x3c, 0x1d, 0x59, 0x94, 0x80, 0x0a, - 0xdd, 0x21, 0x04, 0x03, 0x00, 0x08, 0x84, 0x28, 0x49, 0xff, 0x4c, 0x5d, - 0x48, 0x00, 0x00, 0x53, 0x4e, 0x82, 0x00, 0x0f, 0x3c, 0x1d, 0x58, 0xd2, - 0x04, 0x03, 0x00, 0x08, 0xdd, 0x21, 0x04, 0x03, 0x00, 0x08, 0x84, 0x28, - 0x49, 0xff, 0x4c, 0x4f, 0x84, 0x07, 0x48, 0xff, 0xff, 0x9b, 0x44, 0x50, - 0x00, 0x10, 0xdf, 0x11, 0xa0, 0x32, 0x49, 0xfe, 0x4e, 0xe2, 0x84, 0x42, - 0x3c, 0x2f, 0x6b, 0xa6, 0xa8, 0x37, 0x49, 0xfe, 0x38, 0x64, 0x3e, 0x0d, - 0xb3, 0xbc, 0x49, 0xfe, 0x69, 0x58, 0x84, 0x08, 0x48, 0xff, 0xff, 0x88, - 0x84, 0x05, 0x48, 0xff, 0xff, 0x85, 0x8c, 0xa9, 0xdf, 0x1b, 0xa0, 0x32, - 0x49, 0xfe, 0x4e, 0xcd, 0x84, 0x42, 0xa8, 0x37, 0x3c, 0x2f, 0x6b, 0xa6, - 0x49, 0xfe, 0x38, 0x4f, 0x3e, 0x0d, 0xb3, 0xbc, 0x49, 0xfe, 0x69, 0x43, - 0x3c, 0x1d, 0x58, 0xd2, 0x04, 0x03, 0x00, 0x08, 0xdd, 0x21, 0x04, 0x03, - 0x00, 0x08, 0x49, 0xff, 0x4a, 0xd2, 0x14, 0xa3, 0x00, 0x0b, 0x48, 0x00, - 0x00, 0x96, 0xa0, 0x34, 0x49, 0xfe, 0x4e, 0x95, 0xc0, 0x0d, 0xa0, 0x33, - 0x49, 0xfe, 0x4e, 0x91, 0x4e, 0x02, 0x00, 0x81, 0x2e, 0x05, 0x6a, 0xa5, - 0x49, 0xfd, 0xf7, 0x3d, 0x84, 0x01, 0x48, 0xff, 0xff, 0x59, 0x14, 0x93, - 0x00, 0x0b, 0x48, 0x00, 0x00, 0x82, 0xa0, 0x37, 0x49, 0xfe, 0x4e, 0x81, - 0xc0, 0xdc, 0xa0, 0x33, 0x49, 0xfe, 0x4e, 0x7d, 0xc0, 0x02, 0xd5, 0xf1, - 0x04, 0x13, 0x00, 0x08, 0x04, 0x43, 0x00, 0x0a, 0x04, 0x10, 0x80, 0x0e, - 0x04, 0x23, 0x00, 0x09, 0xa9, 0x09, 0xd5, 0x5b, 0x4e, 0x82, 0x00, 0x0e, - 0x3c, 0x1d, 0x58, 0xd2, 0x04, 0x03, 0x00, 0x08, 0xdd, 0x21, 0x04, 0x03, - 0x00, 0x08, 0x49, 0xff, 0x4a, 0x9c, 0x84, 0x0a, 0x48, 0xff, 0xff, 0x34, - 0x8e, 0xf0, 0xe6, 0xe2, 0xe9, 0x13, 0x04, 0x03, 0x00, 0x08, 0x84, 0x45, - 0x04, 0x10, 0x00, 0x0e, 0x00, 0x30, 0x81, 0x4a, 0x42, 0x11, 0x88, 0x73, - 0x00, 0x10, 0x81, 0x4e, 0xc9, 0x07, 0x84, 0x2b, 0x14, 0x13, 0x00, 0x0b, - 0x84, 0x22, 0xa8, 0x41, 0xd5, 0x4b, 0x84, 0x28, 0x3c, 0x1f, 0x6b, 0xf6, - 0xd5, 0x47, 0x8e, 0xf0, 0xe6, 0xe2, 0xe9, 0x1c, 0x04, 0x03, 0x00, 0x08, - 0x84, 0x25, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x20, 0x01, 0x4a, 0x42, 0x01, - 0x04, 0x73, 0x00, 0x70, 0x01, 0x4e, 0xcf, 0x10, 0x3c, 0x1d, 0x59, 0xd8, - 0x84, 0x07, 0xdd, 0x21, 0x04, 0x03, 0x00, 0x08, 0x84, 0x2b, 0x14, 0x13, - 0x00, 0x0b, 0x84, 0x22, 0xa8, 0x41, 0x80, 0x07, 0x49, 0xfd, 0xf6, 0xdf, - 0xd5, 0x29, 0x3e, 0x6d, 0xaf, 0xac, 0xa0, 0x37, 0x49, 0xfe, 0x4e, 0x27, - 0xc0, 0x1c, 0xa0, 0x33, 0x49, 0xfe, 0x4e, 0x23, 0xc0, 0x03, 0x48, 0xff, - 0xff, 0x93, 0x04, 0x13, 0x00, 0x08, 0x04, 0x33, 0x00, 0x0a, 0x04, 0x10, - 0x80, 0x0e, 0x04, 0x23, 0x00, 0x09, 0xa8, 0xc9, 0xb6, 0x41, 0x04, 0x13, - 0x00, 0x08, 0x04, 0x10, 0x80, 0x0e, 0x10, 0x00, 0x81, 0x4c, 0x49, 0xfe, - 0x37, 0xee, 0x84, 0x04, 0x48, 0xff, 0xfe, 0xdc, 0x84, 0x09, 0x48, 0xff, - 0xfe, 0xd9, 0x44, 0x00, 0x00, 0x20, 0x49, 0xfc, 0xae, 0x24, 0x3c, 0x6d, - 0x6b, 0xf6, 0x84, 0xa1, 0xde, 0x21, 0x3c, 0x1d, 0x58, 0xd8, 0x80, 0x06, - 0xdd, 0x21, 0x49, 0xfd, 0xf7, 0x4a, 0x84, 0xa2, 0xd8, 0x08, 0x3c, 0x1d, - 0x59, 0x94, 0x84, 0x00, 0xdd, 0x21, 0x80, 0x06, 0x49, 0xfd, 0xf6, 0xa3, - 0x3c, 0x6d, 0x6b, 0xf3, 0x49, 0xfd, 0xda, 0xd3, 0x00, 0x10, 0x00, 0x0e, - 0x04, 0x03, 0x00, 0x0e, 0x54, 0x10, 0x80, 0x07, 0x10, 0x10, 0x01, 0x4c, - 0x3c, 0x1d, 0x6a, 0x25, 0x84, 0x44, 0x80, 0x1f, 0xd5, 0x1c, 0x84, 0xab, - 0xde, 0x20, 0x3c, 0x1d, 0x58, 0xd8, 0x84, 0x00, 0xdd, 0x21, 0x2e, 0x25, - 0xb4, 0xbe, 0x3c, 0x0d, 0x6c, 0xfc, 0x44, 0x10, 0x00, 0x44, 0x42, 0x01, - 0x04, 0x73, 0x84, 0x22, 0xa8, 0x41, 0x46, 0x08, 0x10, 0x02, 0x04, 0x10, - 0x00, 0x0e, 0x3c, 0x0d, 0x6b, 0xf3, 0x84, 0x40, 0xb6, 0x20, 0x3c, 0x1d, - 0x6a, 0x24, 0x80, 0x1f, 0xa8, 0x83, 0xc1, 0x02, 0xdd, 0x21, 0x84, 0x22, - 0x3c, 0x1f, 0x6b, 0xf6, 0xec, 0x18, 0x3a, 0x6f, 0xa8, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x77, 0x19, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xf4, 0x3c, 0x1d, 0x6c, 0xfc, 0x97, 0x80, 0x44, 0x80, - 0x00, 0x44, 0x42, 0x13, 0x20, 0x73, 0x2e, 0x74, 0xa2, 0x9c, 0x84, 0x00, - 0xa8, 0x09, 0x50, 0x0f, 0x80, 0x04, 0x49, 0xfa, 0xa0, 0xf0, 0x3c, 0x0d, - 0x6c, 0xfc, 0x84, 0x21, 0xd5, 0x02, 0x96, 0x58, 0x80, 0x40, 0x42, 0x20, - 0xa0, 0x73, 0x9c, 0xc9, 0xe2, 0x27, 0xe8, 0x03, 0xa0, 0x91, 0xc2, 0xf8, - 0x4c, 0x13, 0xc0, 0x15, 0x3e, 0x1d, 0xae, 0x98, 0xa0, 0x8a, 0x44, 0x50, - 0x01, 0x00, 0xda, 0x04, 0x84, 0x41, 0xb6, 0x41, 0xd5, 0x03, 0x84, 0x41, - 0xa8, 0x89, 0x2e, 0x25, 0xb4, 0xbe, 0x44, 0x10, 0x00, 0x44, 0x42, 0x01, - 0x04, 0x73, 0x84, 0x20, 0xa8, 0x41, 0xf0, 0x01, 0x49, 0xfa, 0xa0, 0xe1, - 0x80, 0x06, 0x49, 0xfe, 0x4a, 0x60, 0x84, 0x20, 0x3e, 0x0d, 0x29, 0x64, - 0x38, 0x10, 0x18, 0x08, 0x84, 0x3f, 0x3e, 0x0d, 0x29, 0x1c, 0x38, 0x10, - 0x1a, 0x0a, 0xec, 0x0c, 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x80, 0xe0, 0x84, 0x06, 0x4c, 0x70, 0x40, 0x2f, - 0x3c, 0x4d, 0x6b, 0xa6, 0x44, 0x50, 0x10, 0x00, 0xdc, 0x0f, 0x3c, 0x0d, - 0x5b, 0x13, 0x84, 0xac, 0xd8, 0x0b, 0x3c, 0x4d, 0x59, 0x07, 0x3c, 0x3d, - 0x6b, 0xb3, 0x84, 0x21, 0x84, 0x03, 0x44, 0x20, 0x10, 0x84, 0xdd, 0x24, - 0xd5, 0x1e, 0x46, 0x68, 0x10, 0x00, 0x58, 0x63, 0x00, 0x28, 0x3c, 0x3d, - 0x6b, 0xb3, 0xb4, 0x06, 0x94, 0xdc, 0x54, 0x00, 0x00, 0x03, 0x40, 0x31, - 0x80, 0x04, 0x44, 0x00, 0xff, 0xf3, 0x40, 0x31, 0x80, 0x02, 0x84, 0x21, - 0x84, 0x03, 0x44, 0x20, 0x10, 0x0d, 0x49, 0xfe, 0x58, 0x94, 0xb4, 0x06, - 0x92, 0x02, 0x94, 0x02, 0xb6, 0x06, 0x80, 0x07, 0x49, 0xfe, 0x10, 0xa5, - 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xaa, 0xbc, 0xef, 0xf4, 0x46, 0x28, 0x10, 0x00, 0x04, 0x91, 0x00, 0x0b, - 0x50, 0x60, 0x00, 0x1c, 0x40, 0x04, 0xac, 0x08, 0x92, 0x1e, 0xb6, 0x1f, - 0xf1, 0x81, 0x84, 0x63, 0x01, 0xc3, 0x00, 0x10, 0x54, 0x84, 0x83, 0xff, - 0x4c, 0x01, 0xc0, 0x61, 0xf5, 0x01, 0x84, 0x08, 0xd8, 0x06, 0x46, 0x08, - 0x10, 0x00, 0x58, 0x00, 0x0a, 0x60, 0xd5, 0x05, 0x46, 0x08, 0x10, 0x00, - 0x58, 0x00, 0x0f, 0x94, 0xb4, 0x00, 0x3c, 0x2d, 0x6a, 0x3e, 0xa4, 0x40, - 0x80, 0x1c, 0xdd, 0x22, 0x80, 0x1c, 0x49, 0xfd, 0x75, 0x42, 0x2e, 0x25, - 0x6b, 0x3a, 0x2e, 0x15, 0x6b, 0x3b, 0x02, 0x00, 0x01, 0x1d, 0x98, 0x51, - 0x96, 0x48, 0xc9, 0x04, 0x5c, 0xf4, 0x01, 0x00, 0xe9, 0x48, 0x5c, 0xf0, - 0x00, 0x43, 0xe8, 0x06, 0x46, 0x10, 0x00, 0x96, 0x58, 0x10, 0x84, 0xb0, - 0xd5, 0x1b, 0x40, 0x50, 0x20, 0x09, 0x44, 0x20, 0x00, 0x7f, 0xda, 0x1a, - 0x40, 0x00, 0x08, 0x02, 0xe6, 0x12, 0xe8, 0x0a, 0x46, 0x10, 0x00, 0x96, - 0x58, 0x10, 0x85, 0x38, 0x38, 0x50, 0x81, 0x00, 0x4c, 0x54, 0x40, 0x0f, - 0xd5, 0x04, 0x5c, 0xf0, 0x00, 0x23, 0xe8, 0x0a, 0x8e, 0x12, 0x46, 0x10, - 0x00, 0x96, 0x58, 0x10, 0x85, 0x5c, 0x38, 0x00, 0x81, 0x00, 0x4c, 0x04, - 0x00, 0x23, 0xa0, 0x77, 0x84, 0x45, 0x00, 0x00, 0x81, 0x4b, 0x42, 0x10, - 0x08, 0x73, 0x84, 0x0b, 0x50, 0x10, 0x81, 0x48, 0xa6, 0xcf, 0x56, 0x31, - 0x80, 0x01, 0xae, 0xcf, 0xa0, 0x77, 0x00, 0x30, 0x81, 0x4b, 0x42, 0x11, - 0x88, 0x73, 0x84, 0x40, 0x50, 0x10, 0x81, 0x48, 0xae, 0x8e, 0x48, 0x00, - 0x01, 0x95, 0x2e, 0x14, 0xa2, 0x9f, 0x2e, 0xa4, 0xa2, 0x9c, 0x89, 0x41, - 0x8d, 0x43, 0x54, 0xa5, 0x00, 0xff, 0xd5, 0x02, 0x85, 0x42, 0x3c, 0x0d, - 0x5b, 0x18, 0x84, 0xa3, 0xd8, 0x0e, 0xb4, 0xbf, 0xd0, 0x2e, 0xf0, 0x01, - 0x84, 0xa8, 0x4c, 0x02, 0x81, 0x80, 0x50, 0x03, 0x7f, 0xe4, 0x84, 0x21, - 0x49, 0xfd, 0xfd, 0xe5, 0x48, 0x00, 0x01, 0x79, 0x84, 0xa6, 0x4c, 0x02, - 0x81, 0x76, 0x84, 0xa7, 0xd8, 0x10, 0xb4, 0xbf, 0x84, 0x03, 0xd0, 0x1b, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x10, 0x03, 0xe5, 0x00, 0x03, 0x00, 0x10, - 0x80, 0x48, 0x84, 0x62, 0x49, 0xfe, 0x50, 0x0b, 0x48, 0x00, 0x01, 0x65, - 0x84, 0xa8, 0xd8, 0x0d, 0x49, 0xfe, 0x2d, 0x7f, 0xc8, 0x0a, 0x46, 0x08, - 0x10, 0x00, 0x04, 0x00, 0x03, 0xe5, 0x80, 0x28, 0x49, 0xfe, 0x2e, 0x5d, - 0x48, 0x00, 0x01, 0x57, 0xe7, 0x04, 0xe9, 0x57, 0x2e, 0x14, 0xa2, 0x9f, - 0x2e, 0x04, 0xa2, 0x9c, 0x98, 0x01, 0x9d, 0x43, 0x4c, 0xa2, 0xc0, 0x52, - 0x80, 0x1c, 0x49, 0xfd, 0x74, 0xae, 0x46, 0x28, 0x10, 0x00, 0x04, 0x41, - 0x02, 0x98, 0x3e, 0x2d, 0x29, 0x44, 0xa6, 0xe3, 0xa6, 0x62, 0x40, 0x31, - 0xa0, 0x08, 0x40, 0x11, 0x84, 0x04, 0xa6, 0xd0, 0x84, 0xa1, 0xdb, 0x03, - 0xa4, 0xd3, 0xd5, 0x07, 0x84, 0xa2, 0xdb, 0x03, 0xa4, 0xd2, 0xd5, 0x03, - 0xc3, 0x30, 0x84, 0x60, 0xa5, 0xd1, 0x02, 0x50, 0x01, 0x0e, 0xdf, 0x2b, - 0x4c, 0x30, 0xc0, 0x2a, 0xb4, 0x1f, 0x84, 0x22, 0x4c, 0x00, 0xc0, 0x2e, - 0xa6, 0x21, 0xa6, 0x60, 0x40, 0x00, 0x20, 0x08, 0x40, 0x50, 0x04, 0x04, - 0x50, 0x14, 0x7f, 0xfc, 0xd9, 0x24, 0x9c, 0x24, 0x49, 0xff, 0x87, 0xcb, - 0x80, 0x40, 0xc8, 0x1f, 0xa0, 0x77, 0x84, 0x65, 0x00, 0x40, 0x81, 0x4b, - 0x84, 0x0b, 0x42, 0x12, 0x0c, 0x73, 0x50, 0x10, 0x81, 0x48, 0xa7, 0x0f, - 0x56, 0x42, 0x00, 0x01, 0xaf, 0x0f, 0xa0, 0x77, 0x00, 0x40, 0x81, 0x4b, - 0x42, 0x12, 0x0c, 0x73, 0x10, 0x20, 0x81, 0x4e, 0x48, 0x00, 0x01, 0x06, - 0x3e, 0x3d, 0x29, 0x54, 0x4c, 0x21, 0x80, 0x06, 0x8c, 0x48, 0xd5, 0xc2, - 0x4e, 0x82, 0x00, 0x3c, 0x2e, 0x14, 0xa2, 0x9f, 0x2e, 0x04, 0xa2, 0x9c, - 0x98, 0x01, 0x9d, 0x43, 0x4c, 0xa2, 0xc0, 0x08, 0xa0, 0x37, 0xa1, 0xc5, - 0xc7, 0x04, 0x12, 0x83, 0x80, 0x06, 0xd5, 0x1f, 0x80, 0x3c, 0x80, 0x0a, - 0x80, 0x48, 0x49, 0xfe, 0x70, 0xc0, 0x80, 0xe0, 0x2e, 0x14, 0xa2, 0x9f, - 0x2e, 0x04, 0xa2, 0x9c, 0x98, 0x01, 0x9d, 0x43, 0x4c, 0xa2, 0xc0, 0x12, - 0x3c, 0x1d, 0x53, 0x92, 0x40, 0x10, 0xbc, 0x08, 0x92, 0x3f, 0xc1, 0x0b, - 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x08, 0xc0, 0x06, 0x44, 0x00, - 0x10, 0x2d, 0x80, 0x27, 0x49, 0xfe, 0x57, 0x0f, 0x40, 0x24, 0xb4, 0x08, - 0x92, 0x5d, 0xca, 0x08, 0xcf, 0x03, 0x80, 0x47, 0xd5, 0x20, 0x84, 0x01, - 0x10, 0x03, 0x80, 0x0a, 0xd5, 0x1c, 0x5c, 0x23, 0x80, 0x01, 0xd5, 0x19, - 0xa0, 0x37, 0x00, 0x00, 0x01, 0x6d, 0xc0, 0x13, 0x40, 0x04, 0xb4, 0x08, - 0x92, 0x1d, 0xc0, 0x0f, 0x3c, 0x2d, 0x58, 0xba, 0xf1, 0x01, 0x50, 0x03, - 0x7f, 0xe4, 0xdd, 0x22, 0x3c, 0x1d, 0x58, 0xc2, 0x80, 0x48, 0x9c, 0x49, - 0x3c, 0x1f, 0x58, 0xc2, 0x80, 0xe8, 0xd5, 0x03, 0x84, 0x40, 0x80, 0xe2, - 0xb4, 0x7f, 0x84, 0xa3, 0xd3, 0x0d, 0x40, 0x04, 0xb4, 0x08, 0x92, 0x1d, - 0xc0, 0x09, 0xa0, 0x77, 0x42, 0x04, 0xd4, 0x0b, 0x10, 0x20, 0x81, 0x65, - 0xa0, 0x77, 0x10, 0x00, 0x81, 0x46, 0xc2, 0x29, 0xa0, 0x77, 0x84, 0x45, - 0x00, 0x00, 0x81, 0x4b, 0x42, 0x10, 0x08, 0x73, 0x50, 0x10, 0x81, 0x48, - 0xa6, 0xcf, 0x56, 0x31, 0x80, 0x01, 0xae, 0xcf, 0xa0, 0x77, 0x00, 0x30, - 0x81, 0x4b, 0x42, 0x11, 0x88, 0x73, 0x50, 0x20, 0x81, 0x48, 0x84, 0x20, - 0xae, 0x56, 0x3c, 0x2d, 0x53, 0x92, 0x00, 0x13, 0x00, 0x10, 0x96, 0x94, - 0x4e, 0x22, 0x00, 0x7f, 0x3c, 0x0d, 0x53, 0x8c, 0x54, 0x00, 0x00, 0x08, - 0x4e, 0x02, 0x00, 0x79, 0x44, 0x00, 0x10, 0x22, 0x49, 0xfe, 0x56, 0xb3, - 0x48, 0x00, 0x00, 0x73, 0xc7, 0x71, 0x40, 0x94, 0xb4, 0x08, 0x93, 0x3d, - 0x4e, 0x92, 0x00, 0x08, 0x3c, 0x2d, 0x58, 0xba, 0xf1, 0x01, 0x50, 0x03, - 0x7f, 0xe4, 0xdd, 0x22, 0x50, 0x03, 0x7f, 0xe4, 0x49, 0xfd, 0xf3, 0xf5, - 0x2e, 0x05, 0xae, 0xed, 0xc8, 0x03, 0x49, 0xfd, 0xfb, 0x22, 0xb4, 0x7f, - 0x84, 0xa2, 0x10, 0x33, 0x80, 0x09, 0x4c, 0xa2, 0x80, 0x06, 0xa0, 0x37, - 0xa0, 0x05, 0xc8, 0x36, 0xd5, 0x09, 0xf0, 0x01, 0x84, 0xa8, 0xd8, 0x06, - 0x46, 0x08, 0x10, 0x00, 0x04, 0x90, 0x02, 0x98, 0xd5, 0x09, 0x46, 0x08, - 0x10, 0x00, 0xf2, 0x01, 0x84, 0x68, 0x04, 0x90, 0x03, 0xe5, 0x4c, 0x21, - 0xc0, 0x18, 0xa0, 0xb7, 0x3c, 0x1d, 0x58, 0xbe, 0x00, 0x01, 0x01, 0x48, - 0xdd, 0x21, 0xc8, 0x07, 0xa0, 0x37, 0x00, 0x00, 0x01, 0x48, 0x49, 0xfd, - 0xf3, 0x34, 0xc8, 0x0a, 0xa0, 0x37, 0x00, 0x00, 0x01, 0x48, 0x49, 0xfd, - 0xf3, 0x36, 0xc0, 0x03, 0x8d, 0x2c, 0xd5, 0x02, 0x8d, 0x34, 0xb4, 0xbf, - 0x84, 0x03, 0xd8, 0x07, 0xb4, 0x07, 0x80, 0x29, 0x80, 0x48, 0x49, 0xfe, - 0xd8, 0x38, 0xd5, 0x06, 0xb4, 0x07, 0x80, 0x29, 0x80, 0x48, 0x49, 0xfe, - 0xd8, 0x1e, 0x2e, 0x14, 0xa2, 0x9f, 0x2e, 0x04, 0xa2, 0x9c, 0x98, 0x01, - 0x9d, 0x43, 0x4c, 0xa2, 0xc0, 0x14, 0x2e, 0x05, 0x80, 0x9c, 0xc0, 0x06, - 0x80, 0x0a, 0x80, 0x3c, 0x49, 0xfe, 0x6f, 0x11, 0xd5, 0x05, 0x80, 0x0a, - 0x80, 0x3c, 0x49, 0xfe, 0x73, 0xd0, 0xa0, 0x37, 0xa0, 0x45, 0xc1, 0x08, - 0x84, 0x20, 0xa8, 0x45, 0xd5, 0x05, 0x80, 0x0a, 0x80, 0x3c, 0x49, 0xfe, - 0x73, 0xc6, 0x84, 0x04, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x48, 0x49, 0xfc, - 0x90, 0x02, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa0, 0xbc, 0x84, 0x00, 0x49, 0xfe, 0x65, 0xd7, 0x81, 0x00, 0x84, 0x00, - 0x80, 0x20, 0x49, 0xfe, 0x6d, 0x6e, 0xc0, 0x70, 0x84, 0x01, 0x84, 0x20, - 0x49, 0xfe, 0x6d, 0x69, 0xc8, 0x03, 0x48, 0x00, 0x00, 0x6a, 0x2e, 0x15, - 0xb4, 0xff, 0xc9, 0x25, 0x3c, 0x0d, 0x6d, 0x1b, 0x84, 0xa2, 0xd0, 0x03, - 0x84, 0xa3, 0xd8, 0x18, 0x3c, 0x0d, 0x3b, 0x5c, 0xdd, 0x20, 0x40, 0x04, - 0x00, 0x01, 0x94, 0x04, 0x92, 0x04, 0x3c, 0x72, 0xda, 0x4f, 0x92, 0x01, - 0xe2, 0x07, 0xe8, 0x0c, 0x3c, 0x0d, 0x3b, 0x5c, 0xdd, 0x20, 0x8b, 0x00, - 0x40, 0x84, 0x10, 0x08, 0x93, 0x04, 0x40, 0x64, 0x04, 0x09, 0x9b, 0xbe, - 0xd5, 0x09, 0x3c, 0x0d, 0x6d, 0x1b, 0x84, 0xa4, 0xd8, 0x04, 0x49, 0xfe, - 0x5a, 0xf8, 0xc0, 0x48, 0x84, 0xc0, 0x3c, 0x0d, 0x58, 0x72, 0x46, 0x1f, - 0x1f, 0xfc, 0x58, 0x10, 0x8f, 0x7f, 0x40, 0x00, 0x04, 0x02, 0xc8, 0x05, - 0x49, 0xfd, 0xc1, 0x5b, 0x84, 0xa2, 0xd0, 0x34, 0x49, 0xfd, 0xbe, 0x0b, - 0xc8, 0x31, 0x3c, 0x0d, 0x6b, 0xa6, 0x84, 0xa1, 0xd8, 0x2d, 0x3c, 0x0d, - 0x58, 0x56, 0xdd, 0x20, 0xc0, 0x29, 0x3c, 0x0d, 0x6d, 0x80, 0xc8, 0x26, - 0x3c, 0x0d, 0x58, 0x72, 0x42, 0x00, 0x68, 0x0b, 0xc8, 0x21, 0x3c, 0x0d, - 0x6a, 0x0e, 0x84, 0xbf, 0xd8, 0x1d, 0x2e, 0x05, 0xa8, 0x7e, 0xc8, 0x1a, - 0xce, 0x19, 0x3c, 0x0d, 0x6d, 0x1b, 0xc0, 0x16, 0x49, 0xfe, 0x5a, 0xcd, - 0xc0, 0x07, 0x3e, 0x0d, 0x9b, 0xda, 0x84, 0x26, 0x49, 0xfd, 0xc7, 0xa9, - 0xd5, 0x13, 0x3e, 0x0d, 0x9b, 0xda, 0x44, 0x10, 0x7f, 0xff, 0x49, 0xfd, - 0xc7, 0xa2, 0x84, 0x20, 0x44, 0x00, 0x7f, 0xdf, 0x49, 0xff, 0xff, 0x7f, - 0xd5, 0x07, 0x3e, 0x0d, 0x9b, 0xda, 0x44, 0x10, 0x06, 0x40, 0x49, 0xfd, - 0xc7, 0x96, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, - 0xa4, 0xbc, 0xef, 0xf4, 0x80, 0xc0, 0x84, 0x00, 0x80, 0x20, 0x49, 0xfe, - 0x6c, 0xec, 0x4e, 0x02, 0x01, 0x00, 0x84, 0x01, 0x84, 0x20, 0x49, 0xfe, - 0x6c, 0xe6, 0x4e, 0x02, 0x00, 0xfa, 0x3c, 0x0d, 0x6d, 0x1b, 0x4e, 0x02, - 0x00, 0xf6, 0x2e, 0x15, 0xb4, 0xff, 0xc9, 0x08, 0x84, 0x24, 0x4c, 0x00, - 0xc0, 0x06, 0x49, 0xfe, 0x5a, 0x90, 0x4e, 0x02, 0x00, 0xec, 0x2e, 0x05, - 0xa8, 0x66, 0x4e, 0x02, 0x00, 0xe8, 0x3c, 0x0d, 0x58, 0x7b, 0xdd, 0x20, - 0x4e, 0x02, 0x00, 0xe3, 0x2e, 0x05, 0x9b, 0xd3, 0x4e, 0x03, 0x00, 0xdf, - 0x2e, 0x15, 0x6b, 0x3a, 0x2e, 0x05, 0x6b, 0x3b, 0x98, 0x08, 0x96, 0x00, - 0x4e, 0x03, 0x00, 0xd7, 0x49, 0xfd, 0x75, 0xf1, 0x80, 0xe0, 0x4e, 0x03, - 0x00, 0xd2, 0x50, 0x0f, 0x80, 0x04, 0x49, 0xfd, 0xda, 0xe8, 0x4e, 0x02, - 0x00, 0xcc, 0x3c, 0x0d, 0x58, 0x56, 0xdd, 0x20, 0x4e, 0x02, 0x00, 0xc7, - 0x3c, 0x1d, 0x58, 0x68, 0x2e, 0x05, 0x9b, 0xd8, 0xdd, 0x21, 0x49, 0xfd, - 0x77, 0xd6, 0xb6, 0x1f, 0x80, 0x07, 0x49, 0xfe, 0x65, 0x0a, 0x80, 0xe0, - 0xb4, 0x3f, 0xf0, 0x01, 0x80, 0x47, 0x49, 0xff, 0xcd, 0x52, 0xb6, 0x1f, - 0xc6, 0x04, 0xe2, 0xc0, 0xe8, 0x02, 0xb6, 0xdf, 0x3c, 0x1d, 0x52, 0xd1, - 0x80, 0x07, 0xdd, 0x21, 0x80, 0xc0, 0x2e, 0x15, 0x82, 0xfc, 0x96, 0x4c, - 0xc1, 0x0b, 0x3c, 0x0d, 0x60, 0xbe, 0x84, 0x3f, 0x4c, 0x00, 0x80, 0x07, - 0x80, 0x27, 0x49, 0xfe, 0x4a, 0x10, 0x4e, 0x03, 0x00, 0x9e, 0xc6, 0x05, - 0xb4, 0x1f, 0xe2, 0xc0, 0xe8, 0x02, 0xb6, 0xdf, 0x49, 0xfe, 0x97, 0x4f, - 0xb4, 0x3f, 0x80, 0x47, 0x49, 0xff, 0xcd, 0x2f, 0xb6, 0x1f, 0x3c, 0x3d, - 0x58, 0x7a, 0x80, 0x3f, 0x84, 0x01, 0x80, 0x47, 0xdd, 0x23, 0x2e, 0x05, - 0x9b, 0xcd, 0xc8, 0x04, 0x2e, 0x05, 0xb6, 0x16, 0xc0, 0x0a, 0x2e, 0x05, - 0xa8, 0x88, 0x49, 0xfd, 0xc6, 0x32, 0xb4, 0x3f, 0x80, 0x47, 0x49, 0xff, - 0xcd, 0x1a, 0xb6, 0x1f, 0xb4, 0x1f, 0x9e, 0x01, 0x5c, 0xf0, 0x7f, 0xfe, - 0xe8, 0x77, 0x2e, 0x15, 0xb4, 0xff, 0xc9, 0x1f, 0x3c, 0x0d, 0x6d, 0x1b, - 0x84, 0x22, 0x4c, 0x00, 0x80, 0x05, 0x84, 0x23, 0x4c, 0x00, 0xc0, 0x18, - 0x3c, 0x0d, 0x3b, 0x5c, 0xdd, 0x20, 0x9a, 0x38, 0x94, 0x04, 0x92, 0x04, - 0x3c, 0x92, 0xda, 0x4f, 0x92, 0x01, 0xe2, 0x09, 0xe8, 0x0c, 0x3c, 0x0d, - 0x3b, 0x5c, 0xdd, 0x20, 0x9b, 0xf8, 0x95, 0xfc, 0x92, 0xe4, 0x40, 0x63, - 0x84, 0x09, 0x40, 0x64, 0x98, 0x01, 0xd5, 0x02, 0x84, 0xc0, 0xb5, 0x1f, - 0x49, 0xfe, 0x59, 0xe5, 0xe2, 0x08, 0xe8, 0x50, 0xce, 0x21, 0x49, 0xfe, - 0x59, 0xf4, 0xc0, 0x0b, 0x3e, 0x7d, 0x6b, 0x37, 0xa6, 0x38, 0xc8, 0x04, - 0x80, 0x46, 0x84, 0x06, 0xd5, 0x30, 0x80, 0x07, 0x84, 0x26, 0xd5, 0x40, - 0xb4, 0x9f, 0x84, 0x06, 0x84, 0x21, 0x44, 0x20, 0x74, 0x40, 0x80, 0x66, - 0x49, 0xfe, 0x55, 0x1f, 0x3c, 0x0d, 0x6b, 0xb4, 0xc8, 0x03, 0x80, 0x26, - 0xd5, 0x03, 0x00, 0x10, 0x00, 0x2c, 0xb4, 0x1f, 0x49, 0xff, 0xfe, 0x9b, - 0xd5, 0x2f, 0xb5, 0x1f, 0x49, 0xfe, 0x59, 0xbf, 0x98, 0x06, 0xe2, 0x08, - 0xe8, 0x29, 0x2e, 0x05, 0xb4, 0xff, 0xc8, 0x26, 0x3e, 0x7d, 0x6b, 0x37, - 0x00, 0x83, 0x80, 0x00, 0x4e, 0x83, 0x00, 0x15, 0x44, 0x20, 0x74, 0x41, - 0x84, 0x06, 0x84, 0x21, 0x80, 0x68, 0x80, 0x86, 0x49, 0xfe, 0x54, 0xfd, - 0x80, 0x06, 0x80, 0x48, 0x44, 0x15, 0xb3, 0x74, 0x80, 0x62, 0x80, 0x82, - 0x84, 0xa1, 0x49, 0xfd, 0xc6, 0xd0, 0xae, 0x38, 0xd5, 0x0d, 0x84, 0x21, - 0x84, 0x06, 0x80, 0x61, 0x44, 0x20, 0x74, 0x41, 0x80, 0x86, 0x49, 0xfe, - 0x54, 0xea, 0x80, 0x07, 0x80, 0x26, 0x49, 0xfd, 0xc6, 0x8a, 0xec, 0x0c, - 0x3a, 0x6f, 0xa4, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0x8f, 0x11, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x3e, 0x1d, 0xb2, 0x00, - 0xb4, 0x41, 0x84, 0x61, 0x96, 0x00, 0x4c, 0x21, 0xc0, 0x08, 0x3c, 0x2d, - 0x6b, 0xb4, 0xa1, 0x49, 0xd2, 0x03, 0xc2, 0x02, 0xa8, 0x89, 0x3c, 0x2d, - 0x6c, 0x80, 0x95, 0x5c, 0xda, 0x09, 0x3c, 0x1d, 0x6c, 0x82, 0x5c, 0xf0, - 0x80, 0x7e, 0xe9, 0x04, 0x84, 0x41, 0x3e, 0x25, 0x24, 0x85, 0x49, 0xfe, - 0x3e, 0xe4, 0x92, 0x00, 0x3c, 0x1d, 0x6c, 0x80, 0xc9, 0x05, 0x3c, 0x2d, - 0x59, 0x0d, 0x84, 0x03, 0xdd, 0x22, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0x49, 0xfc, - 0x86, 0x7c, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x7a, 0xd3, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xff, 0xff, 0xf3, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0xef, 0xb0, 0x3e, 0x7d, 0xa8, 0x38, - 0x49, 0xfe, 0x53, 0xe1, 0x54, 0x60, 0x00, 0x0f, 0xa4, 0x3e, 0x98, 0x76, - 0x98, 0x08, 0x49, 0xfe, 0x49, 0x44, 0x81, 0x00, 0xb4, 0x07, 0x49, 0xfe, - 0x49, 0x22, 0xc8, 0x06, 0xb4, 0x07, 0x80, 0x28, 0x49, 0xfe, 0x49, 0x05, - 0xc8, 0x06, 0x3c, 0x0d, 0x58, 0x72, 0x42, 0x00, 0x68, 0x0b, 0xc8, 0x12, - 0x3e, 0x0d, 0xa8, 0x47, 0x49, 0xfd, 0xc5, 0xa5, 0x84, 0x7f, 0x50, 0x1f, - 0x80, 0x04, 0x84, 0x40, 0x3c, 0x3f, 0x6a, 0x0e, 0x3c, 0x3d, 0x57, 0xeb, - 0xb6, 0x41, 0x44, 0x00, 0x00, 0x4f, 0xdd, 0x23, 0xd5, 0x19, 0x3e, 0x0d, - 0xa8, 0x38, 0xa4, 0x46, 0x8c, 0x0f, 0x98, 0x71, 0x49, 0xfd, 0xc5, 0xff, - 0x49, 0xff, 0xff, 0xc1, 0x80, 0xc0, 0xc8, 0x05, 0x46, 0x00, 0x20, 0x00, - 0x49, 0xfd, 0xba, 0xbd, 0x3c, 0x4d, 0x6a, 0x12, 0x96, 0xf1, 0x84, 0x06, - 0x84, 0x22, 0x44, 0x20, 0x75, 0x01, 0x49, 0xfe, 0x56, 0x40, 0xec, 0x50, - 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x49, 0xfc, 0x88, 0xcb, 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xff, 0xff, 0xf3, - 0x84, 0x00, 0x49, 0xfe, 0x6b, 0x58, 0xc8, 0x08, 0x80, 0x20, 0x3c, 0x3d, - 0x29, 0xa1, 0x80, 0x41, 0x44, 0x00, 0x00, 0x3d, 0xdd, 0x23, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x44, 0x50, 0x00, 0x3d, 0xd8, 0x04, 0x49, 0xff, 0xff, 0xe6, 0xd5, 0x03, - 0x49, 0xfa, 0xdb, 0xbf, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x97, 0xc0, 0x84, 0x05, 0x80, 0xc1, - 0x54, 0x81, 0x00, 0xff, 0x4c, 0x70, 0x40, 0x0b, 0xa4, 0x0e, 0x84, 0x22, - 0x49, 0xff, 0x8a, 0x6b, 0xa4, 0x36, 0x49, 0xfd, 0x70, 0xf8, 0xc8, 0x05, - 0xd5, 0x54, 0x84, 0xa8, 0xdf, 0x46, 0xd5, 0x08, 0x00, 0x00, 0x02, 0x46, - 0x49, 0xff, 0x8b, 0x95, 0x49, 0xff, 0x8b, 0x47, 0xd5, 0x4a, 0xa4, 0x0e, - 0x49, 0xfd, 0x70, 0xe9, 0x00, 0x20, 0x02, 0x46, 0x3c, 0x0d, 0x6c, 0xfc, - 0x44, 0x10, 0x00, 0x44, 0x42, 0x01, 0x04, 0x73, 0x04, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x01, 0x6d, 0xc0, 0x3a, 0x80, 0x07, 0x49, 0xfc, 0xa9, 0x1f, - 0xc0, 0x36, 0x84, 0x01, 0x84, 0x20, 0x84, 0x46, 0x49, 0xfe, 0x6d, 0x39, - 0xc8, 0x03, 0x84, 0x07, 0xd5, 0x33, 0xb4, 0x20, 0xc9, 0x04, 0x44, 0x00, - 0x00, 0x1f, 0xd5, 0x2e, 0x84, 0x44, 0xaf, 0xc8, 0xae, 0x89, 0xa6, 0xb0, - 0xae, 0x8a, 0x00, 0x23, 0x00, 0x0a, 0xae, 0x8d, 0x00, 0x23, 0x00, 0x0c, - 0xae, 0x8b, 0xa4, 0xb6, 0x92, 0x48, 0xae, 0x8c, 0x84, 0x41, 0x3e, 0x25, - 0x24, 0x68, 0x46, 0x10, 0x00, 0x9d, 0x58, 0x10, 0x85, 0xe8, 0xa8, 0x41, - 0x84, 0x01, 0x84, 0x20, 0x49, 0xfe, 0x71, 0x05, 0x84, 0x00, 0xd5, 0x12, - 0x95, 0x42, 0xdf, 0x0b, 0xa4, 0x0e, 0x49, 0xfd, 0x70, 0xaa, 0x00, 0x00, - 0x02, 0x46, 0x84, 0x40, 0x3e, 0x1d, 0x27, 0x54, 0x38, 0x20, 0x80, 0x08, - 0x80, 0x07, 0x80, 0x26, 0x80, 0x48, 0x49, 0xfc, 0xad, 0x06, 0x3a, 0x6f, - 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x84, - 0xa7, 0x03, 0xa6, 0xc4, 0x00, 0xa0, 0x00, 0x05, 0x00, 0x90, 0x00, 0x06, - 0xa7, 0xc7, 0x00, 0x50, 0x00, 0x08, 0x50, 0x2f, 0x80, 0x70, 0x9d, 0x84, - 0x40, 0x80, 0x80, 0x13, 0x44, 0x00, 0x08, 0x0b, 0xaf, 0x10, 0xae, 0xd1, - 0x10, 0xa1, 0x00, 0x02, 0x10, 0x91, 0x00, 0x03, 0xaf, 0xd4, 0xaf, 0x55, - 0x4c, 0x80, 0x00, 0x0d, 0x40, 0xa1, 0xa0, 0x08, 0x89, 0x44, 0x40, 0xa5, - 0x00, 0x13, 0x80, 0x0a, 0x12, 0xaf, 0x80, 0x03, 0x49, 0xfd, 0x70, 0x97, - 0xd5, 0x0d, 0x10, 0xa1, 0x00, 0x02, 0xaf, 0x10, 0xae, 0xd1, 0x10, 0x91, - 0x00, 0x03, 0xaf, 0xd4, 0xaf, 0x55, 0x80, 0x02, 0x85, 0x40, 0x49, 0xfd, - 0x70, 0xc2, 0x50, 0x9f, 0x80, 0x04, 0x87, 0x80, 0x44, 0x10, 0x08, 0x0b, - 0x80, 0xe0, 0x12, 0x84, 0x80, 0x00, 0x15, 0xc4, 0x80, 0x04, 0x4c, 0x80, - 0x80, 0xe1, 0x5c, 0xf4, 0x08, 0x0c, 0xe8, 0x07, 0x44, 0x50, 0x08, 0x03, - 0x4c, 0x82, 0xc0, 0xfe, 0x48, 0x00, 0x00, 0x85, 0x9d, 0x4a, 0x4c, 0x82, - 0x80, 0x06, 0x9d, 0x4e, 0x4c, 0x82, 0xc0, 0xf6, 0xd5, 0x3a, 0xc8, 0x0a, - 0x84, 0x42, 0x80, 0x09, 0x80, 0x27, 0x14, 0x24, 0x80, 0x04, 0x10, 0x74, - 0x80, 0x08, 0x48, 0x00, 0x00, 0x70, 0x50, 0x83, 0x00, 0x02, 0x00, 0x04, - 0x00, 0x00, 0x9d, 0xb1, 0xa6, 0x70, 0x40, 0x00, 0x20, 0x08, 0x98, 0x01, - 0xe4, 0x06, 0xe9, 0x02, 0xd5, 0x10, 0x2e, 0x25, 0x6b, 0x3a, 0x2e, 0x15, - 0x6b, 0x3b, 0x98, 0x51, 0x96, 0x48, 0xc1, 0x0e, 0x54, 0x00, 0x00, 0x04, - 0xc8, 0x0b, 0x80, 0x0a, 0x49, 0xff, 0x89, 0x89, 0x84, 0xa1, 0xd8, 0x06, - 0x44, 0x00, 0x00, 0x12, 0x14, 0x04, 0x80, 0x04, 0xd5, 0x09, 0x00, 0x04, - 0x00, 0x00, 0xa6, 0x70, 0x40, 0x00, 0x20, 0x08, 0x98, 0x01, 0x12, 0x03, - 0x81, 0x19, 0x50, 0x0f, 0x80, 0x04, 0x84, 0x20, 0x49, 0xfc, 0xb0, 0x9b, - 0x48, 0x00, 0x00, 0x7c, 0xb4, 0x87, 0x84, 0xa4, 0xdc, 0x0f, 0x04, 0x03, - 0x80, 0x5d, 0x84, 0xa1, 0xd8, 0x0b, 0x84, 0x4c, 0x14, 0x24, 0x80, 0x04, - 0x80, 0x09, 0x80, 0x3c, 0x49, 0xfc, 0xb0, 0x8b, 0x80, 0xfc, 0x48, 0x00, - 0x00, 0xb7, 0x2e, 0x05, 0xb3, 0xdd, 0x54, 0x00, 0x00, 0x02, 0xc8, 0x05, - 0x44, 0x70, 0x00, 0x11, 0x48, 0x00, 0x00, 0xae, 0xa6, 0xf6, 0xa7, 0x71, - 0xa6, 0x72, 0xa7, 0x33, 0xa6, 0xb4, 0xa6, 0x35, 0x4e, 0x72, 0x00, 0xa0, - 0x40, 0x10, 0xa0, 0x08, 0x98, 0x69, 0x96, 0x49, 0x44, 0x50, 0xff, 0xff, - 0x4c, 0x12, 0x80, 0x9c, 0x40, 0x21, 0x20, 0x08, 0x98, 0xa2, 0x96, 0x91, - 0x4c, 0x22, 0x80, 0x96, 0x40, 0x31, 0xa0, 0x08, 0x98, 0xc3, 0x96, 0xd9, - 0x4c, 0x32, 0x80, 0x90, 0x80, 0x07, 0x49, 0xff, 0xba, 0x38, 0x80, 0xe0, - 0x4e, 0x03, 0x00, 0x8c, 0x50, 0x0f, 0x80, 0x04, 0x80, 0x27, 0x49, 0xfc, - 0xb0, 0x58, 0x48, 0x00, 0x00, 0x85, 0x00, 0x83, 0x00, 0x08, 0xa7, 0x31, - 0x00, 0xa3, 0x00, 0x02, 0xa6, 0x33, 0x00, 0x93, 0x00, 0x04, 0xa6, 0xb5, - 0xa6, 0xf6, 0xa6, 0x77, 0xc7, 0x72, 0x40, 0xa5, 0x20, 0x08, 0x40, 0x94, - 0xa0, 0x08, 0x89, 0x44, 0x89, 0x20, 0x40, 0xa5, 0x00, 0x13, 0x40, 0x94, - 0x80, 0x13, 0xe3, 0x49, 0xe9, 0x1b, 0x44, 0x40, 0xff, 0xfe, 0x40, 0x04, - 0x90, 0x02, 0xc0, 0x16, 0x40, 0x61, 0xa0, 0x08, 0x99, 0x96, 0x97, 0xb1, - 0xc6, 0x11, 0x96, 0xb3, 0x4e, 0x25, 0x00, 0x0f, 0x40, 0x84, 0x20, 0x08, - 0x89, 0x01, 0x40, 0x84, 0x00, 0x13, 0x40, 0x14, 0x00, 0x11, 0x4e, 0x15, - 0x00, 0x06, 0x40, 0x14, 0x18, 0x00, 0xe0, 0x20, 0xe9, 0x08, 0x44, 0x00, - 0x00, 0x12, 0x80, 0x25, 0x49, 0xfc, 0xa7, 0x55, 0x84, 0xe0, 0xd5, 0x4b, - 0x02, 0x03, 0x81, 0x1b, 0x84, 0xaa, 0xd8, 0x0b, 0x02, 0x03, 0x81, 0x1c, - 0x44, 0x50, 0x22, 0xf7, 0xd8, 0x06, 0x00, 0x03, 0x82, 0x46, 0x49, 0xfd, - 0xa7, 0x94, 0xc8, 0x39, 0x80, 0x07, 0x80, 0x2a, 0x80, 0x49, 0x80, 0x66, - 0x80, 0x88, 0x49, 0xff, 0xb6, 0xd0, 0x80, 0xe0, 0xc8, 0x34, 0x44, 0x10, - 0x08, 0x03, 0xd5, 0x22, 0xc0, 0x2a, 0x02, 0x00, 0x01, 0x1b, 0x44, 0x50, - 0x00, 0x39, 0xd8, 0x0d, 0x02, 0x03, 0x81, 0x1c, 0x44, 0x50, 0x05, 0x28, - 0xd0, 0x22, 0x44, 0x50, 0x06, 0x11, 0xd0, 0x1f, 0x44, 0x50, 0x05, 0x06, - 0xd8, 0x09, 0xd5, 0x1b, 0x84, 0xaa, 0xd8, 0x06, 0x02, 0x03, 0x81, 0x1c, - 0x44, 0x50, 0x0c, 0x5c, 0xd0, 0x14, 0xa6, 0x75, 0x80, 0x07, 0x49, 0xff, - 0xb0, 0xea, 0x80, 0xe0, 0xc8, 0x12, 0x44, 0x10, 0x08, 0x0b, 0x49, 0xfc, - 0xa7, 0x16, 0xd5, 0x0d, 0x9e, 0x34, 0x80, 0x28, 0x49, 0xfc, 0x98, 0xb7, - 0x80, 0xe0, 0xd5, 0x07, 0x84, 0xe2, 0xd5, 0x05, 0x84, 0xec, 0xd5, 0x03, - 0x44, 0x70, 0x00, 0x12, 0x80, 0x07, 0xec, 0x7c, 0x3a, 0x6f, 0xaa, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x8c, 0x81, 0x20, 0x50, 0xa0, - 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x50, 0x74, 0x80, 0x03, 0xa6, 0xb8, - 0x97, 0x89, 0x40, 0x00, 0x20, 0x08, 0x51, 0xcf, 0x80, 0x04, 0x98, 0x02, - 0x12, 0x6e, 0x00, 0x00, 0x96, 0x01, 0x49, 0xfe, 0x73, 0x72, 0x81, 0x00, - 0x5c, 0xf3, 0x20, 0x13, 0xe8, 0x10, 0x5c, 0xf3, 0x20, 0x11, 0x4e, 0xf2, - 0x00, 0xa8, 0x44, 0x50, 0x20, 0x0c, 0xd6, 0x1a, 0x9d, 0x6c, 0x4c, 0x62, - 0x80, 0x9d, 0x9f, 0x6d, 0x4c, 0x62, 0xc0, 0xdc, 0x48, 0x00, 0x00, 0xc2, - 0x44, 0x50, 0x20, 0x2e, 0xd6, 0x65, 0x5c, 0xf3, 0x20, 0x2f, 0xe8, 0x05, - 0x8e, 0xaf, 0x4c, 0x62, 0xc0, 0xd1, 0xd5, 0x22, 0x9d, 0x69, 0x4c, 0x62, - 0x80, 0xae, 0x9d, 0x6b, 0x4c, 0x62, 0xc0, 0xca, 0xd5, 0x5b, 0xa6, 0x38, - 0xe6, 0x02, 0xe8, 0x0a, 0x00, 0x15, 0x00, 0x00, 0xe6, 0x22, 0xe8, 0x06, - 0x3c, 0x2d, 0x59, 0x29, 0xdd, 0x22, 0x80, 0xc0, 0xd5, 0x03, 0x44, 0x60, - 0x00, 0x12, 0xa6, 0x38, 0xc8, 0x04, 0x4e, 0x62, 0x00, 0xbe, 0x80, 0xc0, - 0x50, 0x2f, 0x80, 0x04, 0x80, 0x02, 0x84, 0x20, 0xa9, 0x94, 0x48, 0x00, - 0x00, 0x94, 0x3c, 0x7d, 0x6d, 0x80, 0x46, 0x04, 0x00, 0x00, 0x40, 0x73, - 0x80, 0x02, 0xcf, 0x2a, 0x84, 0x01, 0x80, 0x27, 0x84, 0x4c, 0x49, 0xfe, - 0x6b, 0x4c, 0x4e, 0x02, 0x00, 0xa7, 0xb4, 0x40, 0x84, 0x2e, 0xae, 0x50, - 0x84, 0x2a, 0xb4, 0x40, 0x80, 0xc7, 0xae, 0x51, 0x84, 0x21, 0xb4, 0x40, - 0xae, 0x52, 0x44, 0x20, 0x00, 0x1f, 0xb4, 0x60, 0x80, 0x27, 0xae, 0x9b, - 0x9c, 0x91, 0xb4, 0x60, 0xae, 0x9c, 0xb4, 0x40, 0xaf, 0xd5, 0xb4, 0x40, - 0xaf, 0xd6, 0xb4, 0x40, 0xaf, 0xd7, 0xb4, 0x00, 0x8c, 0x08, 0x49, 0xfc, - 0xa6, 0x1c, 0x84, 0x01, 0x80, 0x27, 0x49, 0xfe, 0x6f, 0x18, 0x48, 0x00, - 0x00, 0x86, 0x49, 0xfe, 0x90, 0x9a, 0x80, 0xc0, 0x4e, 0x02, 0x00, 0x81, - 0x84, 0x00, 0x80, 0x20, 0x80, 0x40, 0x49, 0xfe, 0x90, 0xb0, 0x48, 0x00, - 0x00, 0x79, 0x49, 0xfe, 0x67, 0x02, 0x48, 0x00, 0x00, 0x6f, 0x84, 0x25, - 0x10, 0x14, 0x80, 0x02, 0xc8, 0x04, 0x44, 0x60, 0x00, 0x12, 0xd5, 0x11, - 0xa6, 0x7a, 0x10, 0x10, 0x01, 0x00, 0xa6, 0x7b, 0x10, 0x10, 0x01, 0x01, - 0x84, 0x21, 0xa7, 0xfc, 0x10, 0x10, 0x01, 0x03, 0x10, 0x70, 0x01, 0x02, - 0x3c, 0x1d, 0x53, 0xce, 0xdd, 0x21, 0x80, 0xc0, 0x80, 0x06, 0x44, 0x10, - 0x20, 0x32, 0x49, 0xfc, 0xa6, 0x54, 0xce, 0x57, 0x04, 0x04, 0x00, 0x01, - 0x54, 0x00, 0x01, 0x00, 0xc8, 0x53, 0x04, 0x04, 0x00, 0x02, 0x84, 0xa1, - 0xd8, 0x4f, 0x80, 0x08, 0x80, 0x26, 0x49, 0xff, 0x93, 0x80, 0xd5, 0x4a, - 0x84, 0x01, 0x84, 0xc0, 0x49, 0xff, 0x90, 0x0b, 0xd5, 0x20, 0xa6, 0x38, - 0xe6, 0x02, 0xe9, 0x04, 0x44, 0x20, 0x00, 0x20, 0xd5, 0x12, 0x49, 0xfe, - 0x7e, 0xfc, 0xc0, 0x03, 0x84, 0x4c, 0xd5, 0x0d, 0x44, 0x50, 0x20, 0x11, - 0xa6, 0x38, 0xde, 0x05, 0x80, 0x2a, 0x49, 0xff, 0x8f, 0x7a, 0xd5, 0x04, - 0x80, 0x2a, 0x49, 0xff, 0x8f, 0x56, 0x80, 0x40, 0x50, 0x0f, 0x80, 0x04, - 0xa8, 0x84, 0x84, 0x20, 0x49, 0xfc, 0xae, 0xed, 0xd5, 0x26, 0x84, 0xc0, - 0xbe, 0x84, 0x80, 0x1c, 0x80, 0x26, 0x49, 0xfc, 0xae, 0xe6, 0xd5, 0x20, - 0x3c, 0x1d, 0x6d, 0x80, 0x44, 0x03, 0x00, 0x00, 0x40, 0x10, 0x80, 0x02, - 0xc9, 0x12, 0x3e, 0x15, 0x6a, 0xb3, 0xa6, 0xba, 0xa6, 0x7c, 0x00, 0x45, - 0x00, 0x00, 0xa6, 0xfb, 0x40, 0x21, 0x20, 0x08, 0x40, 0x10, 0xa0, 0x08, - 0x99, 0x54, 0x98, 0x4b, 0xd9, 0x04, 0x84, 0x21, 0x3e, 0x15, 0x6a, 0xb3, - 0x80, 0x26, 0x80, 0x09, 0x49, 0xfc, 0x9f, 0xb1, 0x80, 0xc0, 0xd5, 0x02, - 0x84, 0xc0, 0x80, 0x06, 0xec, 0x74, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x49, 0x49, 0xfc, - 0x9f, 0x3a, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0xa0, 0xbc, 0xef, 0x88, 0x84, 0xe0, 0x96, 0x49, 0x80, 0xc0, 0x44, 0x00, - 0x0c, 0x1a, 0xf7, 0x84, 0x12, 0x1f, 0x80, 0x00, 0x4c, 0x10, 0x00, 0x2d, - 0x5c, 0xf0, 0x8c, 0x1b, 0xe8, 0x05, 0x44, 0x50, 0x0c, 0x03, 0xd9, 0x5a, - 0xd5, 0x4b, 0x9d, 0x42, 0xd1, 0x03, 0x9d, 0x44, 0xd9, 0x55, 0x9c, 0xb3, - 0xa7, 0x11, 0xa6, 0xd3, 0xa7, 0x52, 0x56, 0x00, 0x8c, 0x1c, 0xa6, 0x50, - 0x40, 0x42, 0x20, 0x08, 0x40, 0x31, 0xa0, 0x08, 0x50, 0x2f, 0x80, 0x6c, - 0x99, 0x21, 0x98, 0xdd, 0xa8, 0xd1, 0xb6, 0x82, 0x80, 0x22, 0x5c, 0x00, - 0x00, 0x01, 0x49, 0xfd, 0xbb, 0x72, 0x3c, 0x3d, 0x66, 0xfd, 0x3c, 0x1d, - 0x66, 0xfa, 0xf0, 0x84, 0x3c, 0x3f, 0x49, 0x33, 0x3c, 0x1f, 0x49, 0x32, - 0xd5, 0x39, 0x3c, 0x0d, 0x49, 0x32, 0x3c, 0x1d, 0x49, 0x33, 0x4c, 0x00, - 0xc0, 0x10, 0x49, 0xfe, 0x50, 0x56, 0x3c, 0x1d, 0x49, 0x32, 0x3c, 0x2d, - 0x49, 0x33, 0x54, 0x00, 0x00, 0x1f, 0x9a, 0x90, 0x9a, 0x08, 0x3c, 0x2f, - 0x66, 0xfd, 0x3c, 0x0f, 0x66, 0xfa, 0xa6, 0x33, 0xe6, 0x04, 0xe8, 0x0c, - 0x84, 0xa3, 0xd8, 0x07, 0x3c, 0x5d, 0x66, 0xf9, 0xd8, 0x04, 0x84, 0x00, - 0xf0, 0x84, 0xd5, 0x1a, 0x49, 0xfd, 0xba, 0xd7, 0xd5, 0x03, 0x44, 0x00, - 0x00, 0x12, 0xf0, 0x84, 0xd5, 0x13, 0x84, 0x25, 0x3e, 0x14, 0xa7, 0xdd, - 0x3c, 0x2d, 0x29, 0x59, 0x84, 0x05, 0x80, 0x20, 0xdd, 0x22, 0x3e, 0x75, - 0x24, 0x64, 0x49, 0xfe, 0x4a, 0x90, 0x80, 0x07, 0xd5, 0x0a, 0x80, 0x06, - 0x49, 0xfc, 0x8e, 0xeb, 0xd5, 0x06, 0x80, 0x1f, 0x84, 0x20, 0x49, 0xfc, - 0xae, 0x42, 0x84, 0x00, 0xec, 0x78, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x49, 0x49, 0xfc, - 0x95, 0xd0, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x49, 0x49, 0xff, 0xff, 0xf2, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0x8c, - 0x80, 0xc0, 0x50, 0xa0, 0x00, 0x03, 0x9c, 0xb7, 0x00, 0x45, 0x00, 0x00, - 0xa7, 0x51, 0xa6, 0xc4, 0x50, 0x0f, 0x80, 0x64, 0xaf, 0x45, 0xaf, 0x00, - 0xae, 0xc1, 0x40, 0x80, 0x80, 0x13, 0xa6, 0x75, 0x81, 0x23, 0xae, 0x42, - 0x40, 0x94, 0xa0, 0x08, 0xa6, 0xf6, 0x89, 0x24, 0xae, 0xc3, 0x40, 0x94, - 0x80, 0x13, 0xa6, 0x90, 0xae, 0x84, 0x2f, 0xc4, 0xa2, 0x9f, 0x5c, 0xf4, - 0x82, 0x00, 0xe8, 0x03, 0x87, 0x80, 0xd5, 0x07, 0x51, 0xce, 0x01, 0xff, - 0x41, 0xce, 0x24, 0x07, 0x57, 0xce, 0x00, 0x01, 0x4f, 0xc2, 0x00, 0x07, - 0x80, 0x09, 0x84, 0xe0, 0x49, 0xfe, 0x71, 0xb1, 0xd5, 0x06, 0x80, 0x09, - 0x49, 0xfd, 0x6d, 0x8f, 0x80, 0xe0, 0x80, 0x1c, 0x54, 0x14, 0x03, 0xff, - 0x5c, 0xf0, 0x80, 0x46, 0xe9, 0x04, 0x84, 0xc1, 0x48, 0x00, 0x01, 0xa0, - 0x44, 0x50, 0x04, 0x19, 0x4c, 0x82, 0x81, 0x0c, 0x5c, 0xf4, 0x04, 0x1a, - 0xe8, 0x15, 0x44, 0x10, 0x04, 0x06, 0x4c, 0x80, 0x80, 0xe4, 0x5c, 0xf4, - 0x04, 0x07, 0xe8, 0x06, 0x9e, 0x89, 0x4c, 0x81, 0x41, 0x85, 0x48, 0x00, - 0x00, 0xb0, 0x44, 0x30, 0x04, 0x11, 0x4c, 0x81, 0x80, 0x1a, 0x9d, 0x5a, - 0x4c, 0x82, 0xc1, 0x7c, 0xd5, 0x1c, 0x9c, 0x2b, 0x4c, 0x80, 0x00, 0x6e, - 0x5c, 0xf4, 0x04, 0x1d, 0xe8, 0x05, 0x9e, 0x41, 0x4c, 0x80, 0xc1, 0x72, - 0xd5, 0x4e, 0x44, 0x20, 0x04, 0x28, 0x4c, 0x81, 0x01, 0x03, 0x44, 0x30, - 0x04, 0x43, 0x4c, 0x81, 0xc1, 0x69, 0x48, 0x00, 0x01, 0x62, 0x4e, 0x72, - 0x01, 0x6b, 0x80, 0x07, 0x49, 0xff, 0xd3, 0x37, 0x48, 0x00, 0x01, 0x64, - 0xcf, 0x03, 0x48, 0x00, 0x01, 0x63, 0xa6, 0x75, 0xe6, 0x22, 0x4e, 0xf2, - 0x01, 0x61, 0x00, 0x03, 0x82, 0x69, 0x4c, 0x00, 0xc0, 0x0d, 0x9c, 0x5a, - 0x84, 0x00, 0x49, 0xfc, 0xa4, 0xda, 0x80, 0x07, 0x84, 0x28, 0x84, 0x40, - 0x49, 0xfd, 0x56, 0x83, 0x48, 0x00, 0x01, 0x43, 0x00, 0x03, 0x82, 0x64, - 0x50, 0x20, 0x7f, 0xd1, 0x96, 0x90, 0xe6, 0x42, 0xe9, 0x0c, 0x44, 0x50, - 0x00, 0x33, 0xd0, 0x09, 0x9e, 0xa9, 0x4c, 0x01, 0x00, 0x07, 0x9c, 0xd2, - 0x4c, 0x01, 0x80, 0x04, 0x9d, 0x53, 0xd8, 0x0b, 0x44, 0x00, 0x00, 0x23, - 0x44, 0x10, 0x04, 0x13, 0x49, 0xfc, 0xa4, 0xbb, 0x44, 0x60, 0x00, 0x23, - 0x48, 0x00, 0x01, 0x38, 0x80, 0x07, 0x49, 0xfd, 0x5d, 0xb6, 0x80, 0xc0, - 0x4e, 0x03, 0x01, 0x32, 0x44, 0x10, 0x04, 0x13, 0x48, 0x00, 0x00, 0x79, - 0x4e, 0x72, 0x01, 0x28, 0x00, 0x03, 0x82, 0x5b, 0x84, 0x21, 0x96, 0x04, - 0x4c, 0x00, 0xc0, 0x0e, 0x80, 0x28, 0x84, 0x00, 0x49, 0xfc, 0xa4, 0xa1, - 0x80, 0x07, 0x50, 0x13, 0x81, 0xa8, 0x84, 0x40, 0x49, 0xfc, 0xf2, 0x0b, - 0x48, 0x00, 0x01, 0x09, 0x80, 0x07, 0x49, 0xfc, 0xfd, 0xfa, 0xd5, 0x5c, - 0x4e, 0x72, 0x01, 0x10, 0x00, 0x03, 0x82, 0x5b, 0x54, 0x00, 0x00, 0x04, - 0xc0, 0x26, 0x00, 0x93, 0x00, 0x05, 0x84, 0x41, 0x4c, 0x91, 0x40, 0x22, - 0x80, 0x28, 0x84, 0x00, 0x49, 0xfc, 0xa4, 0x85, 0x02, 0x33, 0x81, 0x0e, - 0x84, 0xc0, 0x12, 0x3f, 0x80, 0x06, 0x10, 0x9f, 0x80, 0x3d, 0xb6, 0xdf, - 0x50, 0x23, 0x81, 0x98, 0x00, 0x03, 0x82, 0x46, 0xf2, 0x87, 0x3c, 0x3d, - 0x57, 0xeb, 0x3e, 0x2d, 0x25, 0xb0, 0x38, 0x01, 0x00, 0x00, 0x80, 0x3f, - 0x10, 0x0f, 0x80, 0x3e, 0x80, 0x46, 0x44, 0x00, 0x00, 0x23, 0xdd, 0x23, - 0x48, 0x00, 0x00, 0xea, 0xa6, 0x75, 0x80, 0x07, 0x84, 0x41, 0x49, 0xfc, - 0xf3, 0x76, 0x80, 0xc0, 0x4e, 0x03, 0x00, 0xe2, 0x44, 0x10, 0x04, 0x1c, - 0xd5, 0x29, 0x50, 0x13, 0x00, 0x09, 0xa6, 0x09, 0xa6, 0x48, 0x40, 0x00, - 0x20, 0x08, 0x50, 0x7f, 0x80, 0x4c, 0x98, 0x01, 0x50, 0x1f, 0x80, 0x64, - 0xb6, 0x27, 0x49, 0xfc, 0x8d, 0x80, 0x00, 0x13, 0x00, 0x0e, 0x00, 0x43, - 0x00, 0x0d, 0x00, 0x33, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x0c, 0x40, 0x10, - 0xa0, 0x08, 0x98, 0x4c, 0xa8, 0x39, 0xa8, 0xfa, 0xa8, 0xbb, 0xa8, 0x7d, - 0x80, 0x07, 0x00, 0x63, 0x00, 0x0f, 0x10, 0x63, 0x80, 0x10, 0x49, 0xff, - 0xb1, 0xb2, 0x80, 0xc0, 0x4e, 0x03, 0x00, 0xb8, 0x80, 0x28, 0x49, 0xfc, - 0xa4, 0x34, 0x48, 0x00, 0x00, 0xb3, 0xa6, 0x75, 0x5c, 0xf4, 0x8f, 0x00, - 0x4e, 0xf2, 0x00, 0xac, 0x50, 0x20, 0xff, 0xed, 0xe6, 0x43, 0xe9, 0x0b, - 0x44, 0x50, 0x00, 0x1a, 0xd1, 0x08, 0x84, 0x45, 0x4c, 0x11, 0x00, 0x06, - 0x44, 0x30, 0x00, 0x29, 0x4c, 0x11, 0xc0, 0x9e, 0xc0, 0x05, 0x3c, 0x2d, - 0x53, 0xbe, 0xdd, 0x22, 0xd5, 0x04, 0x80, 0x09, 0x49, 0xff, 0xa6, 0x09, - 0x80, 0xc0, 0x4e, 0x03, 0x00, 0x95, 0x44, 0x10, 0x04, 0x06, 0xd5, 0xdc, - 0x00, 0x23, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0b, 0x40, 0x21, 0x20, 0x08, - 0x50, 0x1f, 0x80, 0x4c, 0x00, 0x43, 0x00, 0x09, 0x00, 0x33, 0x00, 0x0a, - 0x98, 0x90, 0x50, 0x5f, 0x80, 0x64, 0xb6, 0xa1, 0xa8, 0x8d, 0x84, 0xa8, - 0x84, 0x40, 0xa9, 0x49, 0xa9, 0x0a, 0xa8, 0xcb, 0x10, 0x20, 0x80, 0x10, - 0x80, 0x01, 0x49, 0xff, 0xb1, 0x2e, 0xd5, 0xbc, 0xa6, 0x34, 0x00, 0x15, - 0x00, 0x00, 0x40, 0x00, 0x20, 0x08, 0x98, 0x01, 0x96, 0x01, 0x80, 0x46, - 0x3e, 0x1d, 0x82, 0x58, 0x49, 0xfc, 0xf5, 0x4d, 0x02, 0x03, 0x81, 0x1b, - 0x84, 0xaa, 0xd8, 0x13, 0x02, 0x03, 0x81, 0x1c, 0x44, 0x10, 0x17, 0x33, - 0x4c, 0x00, 0xc0, 0x0e, 0x80, 0x07, 0x84, 0x21, 0x84, 0x40, 0x49, 0xfd, - 0x82, 0x94, 0x84, 0x01, 0x10, 0x03, 0x82, 0x84, 0x84, 0x21, 0x80, 0x07, - 0x49, 0xff, 0xaa, 0x31, 0x3e, 0x6d, 0x82, 0x58, 0x04, 0x03, 0x00, 0x11, - 0x49, 0xfc, 0xf0, 0x87, 0xc0, 0x1f, 0x80, 0x09, 0x49, 0xfd, 0x6c, 0x0b, - 0x00, 0x13, 0x00, 0x40, 0x04, 0x33, 0x00, 0x11, 0x50, 0x20, 0x01, 0xa8, - 0x54, 0x00, 0x80, 0x03, 0x50, 0x1f, 0x80, 0x6c, 0xf3, 0x9b, 0x49, 0xfd, - 0xa4, 0xd0, 0xc0, 0x0e, 0x04, 0x03, 0x00, 0x11, 0x46, 0x5c, 0xf3, 0xff, - 0x58, 0x52, 0x8f, 0xc7, 0x40, 0x00, 0x14, 0x02, 0x84, 0x20, 0x10, 0x13, - 0x00, 0x42, 0x14, 0x03, 0x00, 0x11, 0xc7, 0x12, 0x02, 0x03, 0x81, 0x1b, - 0x84, 0x2a, 0x4c, 0x00, 0xc0, 0x0e, 0x02, 0x03, 0x81, 0x1c, 0x44, 0x20, - 0x14, 0xf3, 0x4c, 0x01, 0x40, 0x08, 0x84, 0x20, 0x3e, 0x15, 0x82, 0x9a, - 0x84, 0x27, 0x3c, 0x1f, 0x60, 0xa7, 0x84, 0x40, 0x3c, 0x0d, 0x57, 0xea, - 0x44, 0x14, 0xea, 0xd4, 0x80, 0x62, 0x80, 0x82, 0x84, 0xa1, 0x49, 0xfd, - 0xc0, 0xc0, 0x84, 0xc0, 0xd5, 0x10, 0x84, 0x01, 0x49, 0xff, 0xad, 0x79, - 0x48, 0xff, 0xff, 0x53, 0x80, 0x06, 0x80, 0x28, 0x49, 0xfc, 0x97, 0xc5, - 0x80, 0xc0, 0xd5, 0x05, 0x84, 0xc2, 0xd5, 0x03, 0x44, 0x60, 0x00, 0x12, - 0x80, 0x06, 0xec, 0x74, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x49, 0xfc, 0x7e, 0x7d, 0x92, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0xa0, 0xbc, 0x44, 0x20, - 0xfc, 0x79, 0x96, 0x49, 0x80, 0xc0, 0x4c, 0x11, 0x00, 0x4e, 0xe2, 0x41, - 0xe9, 0x15, 0x44, 0x00, 0xfc, 0x5d, 0x4c, 0x10, 0x00, 0x97, 0xe2, 0x01, - 0xe9, 0x08, 0x44, 0x50, 0xfc, 0x0d, 0xd1, 0x4f, 0x8c, 0xaa, 0x4c, 0x12, - 0xc0, 0xc5, 0xd5, 0x21, 0x9d, 0x42, 0x4c, 0x12, 0x80, 0x87, 0x8c, 0xac, - 0x4c, 0x12, 0xc0, 0xbe, 0xd5, 0x32, 0x44, 0x20, 0xfc, 0xc9, 0x4c, 0x11, - 0x00, 0x27, 0xe2, 0x41, 0xe9, 0x0a, 0x44, 0x50, 0xfc, 0x93, 0xd1, 0x33, - 0x44, 0x50, 0xfc, 0xbc, 0x4c, 0x12, 0xc0, 0xb0, 0x48, 0x00, 0x00, 0x70, - 0x44, 0x50, 0xfc, 0xf4, 0x4c, 0x12, 0x80, 0x9c, 0x44, 0x50, 0xfd, 0x59, - 0x4c, 0x12, 0xc0, 0xa6, 0x48, 0x00, 0x00, 0xa0, 0xa6, 0x34, 0xa6, 0x76, - 0xa6, 0xb5, 0xa6, 0xf3, 0x40, 0x00, 0x20, 0x08, 0x40, 0x10, 0xa0, 0x08, - 0x98, 0x03, 0x98, 0x4a, 0x96, 0x01, 0x96, 0x49, 0x49, 0xff, 0xd4, 0x83, - 0x48, 0x00, 0x00, 0x98, 0x9c, 0x02, 0x49, 0xff, 0x83, 0xc0, 0x9c, 0x33, - 0x49, 0xff, 0xae, 0x9b, 0x48, 0x00, 0x00, 0x90, 0x9c, 0x32, 0x49, 0xfc, - 0xb7, 0x4e, 0x48, 0x00, 0x00, 0x8b, 0x9c, 0x02, 0x49, 0xff, 0xa1, 0x0b, - 0x48, 0x00, 0x00, 0x86, 0x84, 0x41, 0x3e, 0x25, 0x24, 0x64, 0x9c, 0x33, - 0x49, 0xfc, 0xc8, 0xe1, 0x48, 0x00, 0x00, 0x7e, 0x9d, 0xb3, 0x00, 0x73, - 0x00, 0x0c, 0x00, 0x23, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0b, 0x40, 0x21, - 0x40, 0x08, 0x00, 0x13, 0x00, 0x0e, 0x40, 0x73, 0xa0, 0x08, 0x99, 0xfa, - 0x40, 0x10, 0xe0, 0x08, 0x99, 0xf8, 0x80, 0x06, 0x99, 0xf9, 0x49, 0xfc, - 0xcd, 0xce, 0x84, 0x21, 0x3e, 0x15, 0x24, 0x64, 0x44, 0x51, 0x00, 0x02, - 0xdf, 0x62, 0xa6, 0x32, 0x9e, 0x01, 0x96, 0x00, 0x5c, 0xf0, 0x00, 0xfe, - 0xe9, 0x5c, 0x84, 0x21, 0x84, 0x04, 0x49, 0xfe, 0x5d, 0xe2, 0x3c, 0x1d, - 0x59, 0x94, 0x84, 0x00, 0xdd, 0x21, 0x84, 0x00, 0x49, 0xfd, 0xeb, 0xd1, - 0x3e, 0x0d, 0xb3, 0xbc, 0x49, 0xfd, 0x6b, 0x5b, 0x80, 0xc0, 0xc0, 0x4b, - 0x00, 0x00, 0x02, 0x46, 0x49, 0xfc, 0xb0, 0xdb, 0x80, 0x06, 0x49, 0xfd, - 0x6b, 0x86, 0xd5, 0x43, 0xa6, 0x33, 0x49, 0xff, 0xa0, 0x66, 0xd5, 0x3f, - 0x9c, 0x33, 0x49, 0xff, 0xa3, 0x82, 0xd5, 0x3b, 0x84, 0x01, 0x84, 0x20, - 0x94, 0x84, 0x49, 0xfe, 0x67, 0x72, 0xc0, 0x35, 0xb4, 0xc0, 0x44, 0x10, - 0x00, 0x5d, 0xae, 0x73, 0x84, 0x3c, 0x84, 0xe1, 0x84, 0x0e, 0xae, 0x74, - 0x84, 0x20, 0xae, 0x31, 0xae, 0x75, 0xae, 0x30, 0xaf, 0xf2, 0x46, 0x17, - 0x66, 0x80, 0x9c, 0x36, 0x58, 0x10, 0x82, 0x00, 0x49, 0xfc, 0xa2, 0x4b, - 0x10, 0x73, 0x00, 0x0b, 0x10, 0x73, 0x00, 0x0a, 0x50, 0x03, 0x00, 0x0c, - 0x84, 0x20, 0x49, 0xfc, 0xa2, 0x42, 0x84, 0x01, 0x84, 0x20, 0x49, 0xfe, - 0x6b, 0x3e, 0xd5, 0x13, 0x84, 0x43, 0x3e, 0x25, 0xb4, 0x97, 0x84, 0x5f, - 0x3e, 0x25, 0xb4, 0x96, 0x9c, 0x03, 0x49, 0xfc, 0xb7, 0xa8, 0xd5, 0x09, - 0x3c, 0x2d, 0x58, 0x1b, 0xdd, 0x22, 0xd5, 0x06, 0x80, 0x06, 0x49, 0xff, - 0x37, 0x1a, 0xd5, 0x02, 0x84, 0x00, 0x3a, 0x6f, 0xa0, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xec, 0x2e, 0x15, 0xb3, 0xd9, - 0x46, 0x20, 0x00, 0xa7, 0x58, 0x21, 0x0a, 0x68, 0x3e, 0x0d, 0x4b, 0x58, - 0x14, 0x20, 0x00, 0x2d, 0x54, 0x10, 0x81, 0x04, 0x46, 0x20, 0x00, 0xa4, - 0x58, 0x21, 0x00, 0xb0, 0x14, 0x20, 0x00, 0x2e, 0xc1, 0x06, 0x46, 0x10, - 0x00, 0xa2, 0x58, 0x10, 0x8b, 0x94, 0xd5, 0x03, 0x44, 0x15, 0x25, 0x70, - 0x14, 0x10, 0x00, 0x23, 0x46, 0x10, 0x00, 0xa3, 0x58, 0x10, 0x8f, 0x4c, - 0x3c, 0x1f, 0x58, 0x5a, 0x46, 0x10, 0x00, 0xab, 0x58, 0x10, 0x8b, 0x0c, - 0x3c, 0x1f, 0x58, 0x99, 0x46, 0x10, 0x00, 0xab, 0x58, 0x10, 0x8c, 0x58, - 0x3c, 0x1f, 0x58, 0x98, 0x46, 0x00, 0x00, 0xad, 0x58, 0x00, 0x01, 0x2c, - 0x3c, 0x0f, 0x52, 0x08, 0x46, 0x00, 0x00, 0xac, 0x58, 0x00, 0x0e, 0x84, - 0x3c, 0x0f, 0x52, 0x02, 0x46, 0x00, 0x00, 0xad, 0x58, 0x00, 0x04, 0x78, - 0x3c, 0x0f, 0x52, 0x01, 0x46, 0x00, 0x00, 0xad, 0x58, 0x00, 0x03, 0x48, - 0x3c, 0x0f, 0x52, 0x06, 0x3e, 0x6d, 0x4b, 0x58, 0x49, 0xff, 0x91, 0x91, - 0x46, 0x20, 0x00, 0xab, 0x58, 0x21, 0x03, 0x68, 0x3c, 0x2f, 0x58, 0xcd, - 0x46, 0x20, 0x00, 0xab, 0x58, 0x21, 0x0d, 0x04, 0x3c, 0x2f, 0x58, 0xfd, - 0x46, 0x20, 0x00, 0xa8, 0x58, 0x21, 0x00, 0x70, 0x3c, 0x2f, 0x59, 0x68, - 0x46, 0x20, 0x00, 0xa3, 0x58, 0x21, 0x0f, 0x38, 0x3c, 0x2f, 0x58, 0x2d, - 0x46, 0x10, 0x00, 0xa3, 0x58, 0x10, 0x8a, 0x84, 0x14, 0x13, 0x00, 0x13, - 0x46, 0x10, 0x00, 0xa3, 0x58, 0x10, 0x8a, 0x70, 0xa8, 0x74, 0x3e, 0x0d, - 0x6b, 0x49, 0x49, 0xfd, 0xbe, 0xa4, 0x84, 0x40, 0x3c, 0x0d, 0x5b, 0x09, - 0x80, 0xa2, 0x80, 0x62, 0x80, 0x82, 0x46, 0x10, 0x00, 0xa8, 0x58, 0x10, - 0x8b, 0x48, 0x49, 0xfd, 0xbf, 0x3e, 0x3e, 0x7d, 0x4b, 0x14, 0x3e, 0x05, - 0x6b, 0x49, 0x46, 0x10, 0x00, 0x9d, 0x58, 0x10, 0x89, 0xe4, 0x3c, 0x1f, - 0x53, 0xf4, 0x84, 0x61, 0xb4, 0xa7, 0x80, 0x83, 0x84, 0x02, 0x46, 0x10, - 0x00, 0xa8, 0x58, 0x10, 0x8c, 0x18, 0x44, 0x27, 0xbc, 0xf4, 0xdd, 0x25, - 0x84, 0x60, 0xb4, 0xa7, 0x80, 0x83, 0x46, 0x20, 0x00, 0xa6, 0x58, 0x21, - 0x06, 0xf8, 0x84, 0x04, 0x46, 0x10, 0x00, 0xa6, 0x58, 0x10, 0x87, 0xd0, - 0xdd, 0x25, 0x46, 0x10, 0x00, 0xa6, 0x58, 0x10, 0x8a, 0xc8, 0x84, 0x0a, - 0x49, 0xfd, 0xcf, 0x61, 0x46, 0x10, 0x00, 0xac, 0x58, 0x10, 0x89, 0xfc, - 0x3c, 0x1f, 0x58, 0x66, 0x46, 0x00, 0x00, 0xa6, 0x58, 0x00, 0x03, 0xc4, - 0x14, 0x03, 0x00, 0x20, 0x46, 0x00, 0x00, 0xa3, 0x58, 0x00, 0x01, 0x34, - 0xa8, 0x33, 0x49, 0xff, 0xc5, 0x32, 0x46, 0x20, 0x00, 0xa1, 0x58, 0x21, - 0x04, 0x60, 0x3c, 0x2f, 0x5a, 0x49, 0x46, 0x20, 0x00, 0xa1, 0x58, 0x21, - 0x04, 0x20, 0x3c, 0x2f, 0x5a, 0x4a, 0x46, 0x20, 0x00, 0x9d, 0x58, 0x21, - 0x06, 0xa0, 0x3c, 0x2f, 0x58, 0xb2, 0x46, 0x20, 0x00, 0xa3, 0x58, 0x21, - 0x01, 0xf8, 0x3c, 0x2f, 0x58, 0x8b, 0x46, 0x20, 0x00, 0xa3, 0x58, 0x21, - 0x01, 0xbc, 0x3c, 0x2f, 0x58, 0x87, 0x50, 0x0f, 0x80, 0x0c, 0x49, 0xfa, - 0x94, 0xfa, 0x46, 0x00, 0x00, 0xa9, 0x58, 0x00, 0x0f, 0x9c, 0x49, 0xfe, - 0x47, 0x7e, 0xf0, 0x03, 0x49, 0xfa, 0x95, 0x07, 0x46, 0x10, 0x00, 0xa7, - 0x58, 0x10, 0x8e, 0xf4, 0x3c, 0x1f, 0x58, 0x2f, 0x46, 0x10, 0x00, 0xa2, - 0x58, 0x10, 0x87, 0xa8, 0x3c, 0x1f, 0x53, 0xb9, 0x46, 0x10, 0x00, 0xa2, - 0x58, 0x10, 0x82, 0x98, 0x3c, 0x1f, 0x58, 0x58, 0x46, 0x10, 0x00, 0x9f, - 0x58, 0x10, 0x89, 0xfc, 0x3c, 0x1f, 0x58, 0xb7, 0x46, 0x00, 0x00, 0xa4, - 0x58, 0x00, 0x01, 0xc0, 0x3c, 0x0f, 0x53, 0x38, 0x46, 0x00, 0x00, 0xa4, - 0x58, 0x00, 0x00, 0xe8, 0x3c, 0x0f, 0x53, 0x39, 0x46, 0x00, 0x00, 0xa7, - 0x58, 0x00, 0x0e, 0xe0, 0xa8, 0x32, 0x49, 0xff, 0x95, 0x6c, 0x46, 0x10, - 0x00, 0xa0, 0x58, 0x10, 0x87, 0x20, 0x3c, 0x1f, 0x5a, 0x36, 0x49, 0xff, - 0x7b, 0x72, 0x44, 0x00, 0x00, 0x10, 0x46, 0x10, 0x00, 0xa7, 0x58, 0x10, - 0x81, 0xf4, 0x49, 0xfd, 0xce, 0xe8, 0x44, 0x40, 0x4a, 0x4a, 0x3c, 0x4a, - 0xa5, 0x85, 0x46, 0x50, 0x00, 0xa6, 0x58, 0x52, 0x8e, 0x8c, 0x3c, 0x5f, - 0x58, 0x67, 0x46, 0x50, 0x00, 0xa9, 0x58, 0x52, 0x85, 0x98, 0x3c, 0x5f, - 0x59, 0x4d, 0x84, 0xa0, 0x3e, 0x55, 0x6a, 0x7a, 0x46, 0x40, 0x00, 0xa7, - 0x58, 0x42, 0x08, 0xc8, 0x3c, 0x4f, 0x53, 0x27, 0x46, 0x40, 0x00, 0xa7, - 0x58, 0x42, 0x05, 0x9c, 0xa9, 0x3e, 0x44, 0x40, 0x00, 0x1e, 0x3e, 0x45, - 0x4b, 0x09, 0x46, 0x30, 0x00, 0xa7, 0x58, 0x31, 0x88, 0x8c, 0x3c, 0x3f, - 0x53, 0x26, 0x3e, 0x0d, 0x25, 0xb0, 0x84, 0x20, 0x84, 0x48, 0x49, 0xfe, - 0xce, 0x42, 0x46, 0x40, 0x00, 0x9f, 0x58, 0x42, 0x0c, 0xd8, 0x3c, 0x4f, - 0x29, 0xa1, 0x46, 0x40, 0x00, 0xa2, 0x58, 0x42, 0x00, 0x6c, 0x3c, 0x4f, - 0x59, 0x09, 0x3e, 0x0d, 0x29, 0x1c, 0x84, 0x3f, 0x84, 0x47, 0x49, 0xfe, - 0xce, 0x28, 0x84, 0x47, 0x3e, 0x0d, 0x29, 0x64, 0x84, 0x20, 0x49, 0xfe, - 0xce, 0x22, 0x84, 0x00, 0x46, 0x10, 0x00, 0xa7, 0x58, 0x10, 0x89, 0x88, - 0x49, 0xfd, 0xce, 0x9b, 0x46, 0x30, 0x00, 0x9f, 0x58, 0x31, 0x88, 0xa8, - 0x3c, 0x3f, 0x58, 0x59, 0x46, 0x30, 0x00, 0xa1, 0x58, 0x31, 0x8b, 0x34, - 0x3c, 0x3f, 0x57, 0xfc, 0x46, 0x30, 0x00, 0xa9, 0x58, 0x31, 0x80, 0xe8, - 0x3c, 0x3f, 0x59, 0x60, 0x46, 0x30, 0x00, 0xad, 0x58, 0x31, 0x88, 0x3c, - 0x3c, 0x3f, 0x57, 0xec, 0x46, 0x30, 0x00, 0xa8, 0x58, 0x31, 0x8c, 0x40, - 0x3c, 0x3f, 0x59, 0x62, 0x46, 0x30, 0x00, 0xa8, 0x58, 0x31, 0x8c, 0x2c, - 0x3c, 0x3f, 0x59, 0x63, 0x46, 0x30, 0x00, 0xa1, 0x58, 0x31, 0x8a, 0x20, - 0x3c, 0x3f, 0x58, 0x15, 0x46, 0x30, 0x00, 0xa9, 0x58, 0x31, 0x85, 0x84, - 0x3c, 0x3f, 0x59, 0x4e, 0x84, 0x00, 0x46, 0x10, 0x00, 0xa8, 0x58, 0x10, - 0x85, 0x54, 0x49, 0xfe, 0x99, 0x3e, 0x46, 0x10, 0x00, 0xa0, 0x58, 0x10, - 0x8e, 0x0c, 0x3c, 0x1f, 0x5a, 0x6b, 0x46, 0x10, 0x00, 0x9e, 0x58, 0x10, - 0x82, 0x28, 0x3c, 0x1f, 0x5a, 0x6c, 0x46, 0x10, 0x00, 0xa1, 0x58, 0x10, - 0x81, 0x1c, 0x3c, 0x1f, 0x5a, 0x57, 0x46, 0x00, 0x00, 0xa7, 0x58, 0x00, - 0x05, 0x84, 0xa8, 0x3d, 0x46, 0x10, 0x00, 0xa1, 0x58, 0x10, 0x80, 0x40, - 0x3c, 0x1f, 0x5a, 0x6e, 0x46, 0x10, 0x00, 0xa0, 0x58, 0x10, 0x8e, 0x20, - 0x3c, 0x1f, 0x5a, 0x3b, 0x46, 0x10, 0x00, 0xac, 0x58, 0x10, 0x8d, 0xa8, - 0x3c, 0x1f, 0x57, 0xeb, 0x49, 0xff, 0x82, 0x59, 0x46, 0x20, 0x00, 0xa0, - 0x58, 0x21, 0x0a, 0xf4, 0x3c, 0x2f, 0x5a, 0x2c, 0x46, 0x20, 0x00, 0xa0, - 0x58, 0x21, 0x0f, 0xf4, 0x3c, 0x2f, 0x5a, 0x69, 0x46, 0x10, 0x00, 0xa6, - 0x58, 0x10, 0x8a, 0x60, 0x46, 0x20, 0x00, 0xa6, 0x58, 0x21, 0x06, 0xe4, - 0x14, 0x13, 0x00, 0x33, 0x3c, 0x2f, 0x58, 0x5f, 0x46, 0x20, 0x00, 0xa6, - 0x58, 0x21, 0x06, 0xcc, 0x3c, 0x2f, 0x58, 0x5e, 0x2e, 0x05, 0x24, 0x63, - 0x46, 0x20, 0x00, 0xa6, 0x58, 0x21, 0x06, 0xa8, 0x3c, 0x2f, 0x58, 0x5d, - 0x46, 0x10, 0x00, 0xad, 0x58, 0x10, 0x84, 0x64, 0x3c, 0x1f, 0x52, 0x04, - 0xc8, 0x09, 0x44, 0x10, 0x02, 0x59, 0x3c, 0x1a, 0xda, 0x16, 0x44, 0x10, - 0x08, 0x21, 0x3c, 0x1a, 0xda, 0x18, 0x46, 0x42, 0x02, 0x00, 0x58, 0x42, - 0x08, 0x21, 0x3c, 0x4f, 0x57, 0xef, 0x44, 0x42, 0x59, 0x10, 0x3c, 0x4f, - 0x57, 0xf0, 0x46, 0x40, 0x00, 0xad, 0x58, 0x42, 0x03, 0x5c, 0x3c, 0x4f, - 0x52, 0x03, 0x44, 0x40, 0x08, 0x00, 0x3c, 0x4f, 0x49, 0x32, 0x95, 0x21, - 0x3c, 0x4f, 0x49, 0x33, 0x84, 0x8a, 0x3e, 0x45, 0xaa, 0x7d, 0x46, 0x30, - 0x00, 0xa7, 0x58, 0x31, 0x81, 0x8c, 0x85, 0x40, 0x3c, 0x3f, 0x52, 0xc6, - 0x3e, 0xa5, 0x24, 0x94, 0x84, 0x61, 0x3e, 0x35, 0xaa, 0xd1, 0x3e, 0xa5, - 0x6b, 0x4f, 0x3e, 0xa5, 0x6b, 0x50, 0x84, 0x88, 0x3e, 0xa5, 0x6b, 0x82, - 0x3e, 0x45, 0xaa, 0x59, 0x3e, 0xa5, 0x24, 0x95, 0x84, 0x8a, 0x87, 0xc5, - 0x84, 0xc2, 0x3e, 0x45, 0xaa, 0x7c, 0x84, 0x61, 0x84, 0x88, 0x3f, 0xe5, - 0xa9, 0xf1, 0x3f, 0xe5, 0xa9, 0xf0, 0x3e, 0x45, 0xaa, 0x58, 0x3e, 0x35, - 0xaa, 0xd0, 0x3e, 0x65, 0xaa, 0x69, 0x3e, 0x65, 0xaa, 0x68, 0x46, 0x10, - 0x00, 0x96, 0x58, 0x10, 0x8e, 0x7c, 0x84, 0x4a, 0x3e, 0x0d, 0x25, 0x70, - 0x49, 0xfe, 0xcd, 0x2d, 0x49, 0xff, 0xef, 0xfd, 0x46, 0x20, 0x00, 0x9f, - 0x58, 0x21, 0x00, 0x18, 0x3c, 0x2f, 0x59, 0x54, 0x3e, 0x65, 0x6a, 0x96, - 0x46, 0x20, 0x00, 0xaa, 0x58, 0x21, 0x0d, 0xf0, 0x3c, 0x2f, 0x58, 0xe1, - 0x46, 0x20, 0x00, 0xaa, 0x58, 0x21, 0x0a, 0x80, 0x3c, 0x2f, 0x58, 0xe2, - 0x46, 0x20, 0x00, 0xaa, 0x58, 0x21, 0x0c, 0xb4, 0x3c, 0x2f, 0x58, 0xe6, - 0x46, 0x20, 0x00, 0x9f, 0x58, 0x21, 0x08, 0x04, 0x3c, 0x2f, 0x58, 0x69, - 0x46, 0x20, 0x00, 0xa8, 0x58, 0x21, 0x09, 0x60, 0x3c, 0x2f, 0x59, 0x61, - 0x46, 0x10, 0x00, 0xa5, 0x58, 0x10, 0x8d, 0x98, 0x3c, 0x1f, 0x52, 0xc7, - 0x46, 0x10, 0x00, 0xa5, 0x58, 0x10, 0x8d, 0x84, 0x3c, 0x1f, 0x52, 0xcc, - 0x46, 0x10, 0x00, 0xa5, 0x58, 0x10, 0x88, 0x60, 0x3c, 0x1f, 0x52, 0xcf, - 0x46, 0x10, 0x00, 0xa5, 0x58, 0x10, 0x87, 0x54, 0x3c, 0x1f, 0x52, 0xd5, - 0x3e, 0x0d, 0x4d, 0xd8, 0x49, 0xfe, 0x4c, 0x57, 0x84, 0xc4, 0x3e, 0x3d, - 0x4a, 0x84, 0x84, 0x8c, 0xaf, 0x1b, 0xaf, 0x9a, 0x80, 0x23, 0x50, 0x01, - 0x80, 0x08, 0x44, 0x20, 0x00, 0x38, 0x49, 0xfe, 0xcc, 0xd0, 0x3e, 0x65, - 0x83, 0xe5, 0x46, 0x20, 0x00, 0xa6, 0x58, 0x21, 0x01, 0xb0, 0x3c, 0x2f, - 0x58, 0x63, 0x46, 0x20, 0x00, 0xab, 0x58, 0x21, 0x0f, 0x38, 0x3c, 0x2f, - 0x58, 0xf1, 0x46, 0x20, 0x00, 0xab, 0x58, 0x21, 0x01, 0x90, 0x3c, 0x2f, - 0x58, 0xef, 0x84, 0x09, 0x49, 0xff, 0x82, 0x71, 0x46, 0x30, 0x00, 0xa0, - 0x58, 0x31, 0x88, 0x40, 0x3c, 0x3f, 0x5a, 0x2d, 0x46, 0x30, 0x00, 0xa8, - 0x58, 0x31, 0x88, 0x58, 0x3c, 0x3f, 0x59, 0x55, 0x46, 0x30, 0x00, 0xa8, - 0x58, 0x31, 0x88, 0x44, 0x3e, 0x1d, 0x4e, 0xc8, 0x3c, 0x3f, 0x53, 0xba, - 0x46, 0x20, 0x00, 0xa8, 0x58, 0x21, 0x07, 0x98, 0xb6, 0x41, 0x46, 0x20, - 0x00, 0x9d, 0x58, 0x21, 0x0b, 0x08, 0xa8, 0x8e, 0x46, 0x20, 0x00, 0xa5, - 0x58, 0x21, 0x00, 0x40, 0xa8, 0x8a, 0x46, 0x20, 0x00, 0xa0, 0x58, 0x21, - 0x03, 0x7c, 0xa8, 0x8d, 0x46, 0x10, 0x00, 0xa8, 0x58, 0x10, 0x85, 0x90, - 0x3c, 0x1f, 0x53, 0xf3, 0x3e, 0xa5, 0x24, 0x6e, 0x3e, 0x0d, 0x9b, 0xda, - 0x49, 0xfd, 0xbc, 0x29, 0x84, 0x40, 0x80, 0x62, 0x80, 0x82, 0x80, 0xa2, - 0x46, 0x10, 0x00, 0xac, 0x58, 0x10, 0x88, 0xf4, 0x44, 0x00, 0x1f, 0x40, - 0x49, 0xfd, 0xbc, 0xc3, 0x46, 0x40, 0x00, 0xa9, 0x58, 0x42, 0x0f, 0x34, - 0x3c, 0x4f, 0x58, 0xf0, 0x46, 0x40, 0x00, 0xa0, 0x58, 0x42, 0x05, 0x90, - 0x3c, 0x4f, 0x58, 0xdf, 0x46, 0x40, 0x00, 0xa0, 0x58, 0x42, 0x0e, 0x80, - 0x3c, 0x4f, 0x5a, 0x37, 0x46, 0x30, 0x00, 0xa8, 0x58, 0x31, 0x83, 0x1c, - 0x3c, 0x3f, 0x53, 0xf2, 0x46, 0x40, 0x00, 0xa9, 0x58, 0x42, 0x0f, 0x20, - 0x3c, 0x4f, 0x58, 0xf5, 0x46, 0x40, 0x00, 0xa4, 0x58, 0x42, 0x0a, 0x10, - 0x3c, 0x4f, 0x53, 0x3b, 0x46, 0x40, 0x00, 0x9f, 0x58, 0x42, 0x0c, 0x64, - 0x3c, 0x4f, 0x29, 0x9c, 0x84, 0x88, 0x3e, 0x45, 0x6a, 0xfa, 0x46, 0x40, - 0x00, 0x9f, 0x58, 0x42, 0x0b, 0xbc, 0x3c, 0x4f, 0x29, 0x9b, 0x46, 0x40, - 0x00, 0xa8, 0x58, 0x42, 0x00, 0x5c, 0x3c, 0x4f, 0x59, 0x5e, 0x84, 0x81, - 0x3e, 0x45, 0x24, 0x73, 0x3e, 0x7d, 0x4b, 0x58, 0x46, 0x30, 0x00, 0xa4, - 0x58, 0x31, 0x8a, 0x24, 0x84, 0xc0, 0x14, 0x33, 0x80, 0x0b, 0x3c, 0x6f, - 0x5b, 0x2a, 0x3e, 0x65, 0x6a, 0x52, 0x3e, 0x5d, 0xb3, 0xb4, 0x3e, 0xa5, - 0x24, 0x96, 0x84, 0x7d, 0x10, 0x32, 0x80, 0xe2, 0x46, 0x30, 0x00, 0xa3, - 0x58, 0x31, 0x8c, 0xec, 0x10, 0xa2, 0x80, 0xe3, 0x10, 0xa2, 0x81, 0x7c, - 0x3e, 0x05, 0x9b, 0xda, 0x14, 0x33, 0x80, 0x17, 0x80, 0x26, 0x3e, 0x0d, - 0x94, 0xdc, 0x44, 0x20, 0x00, 0x24, 0x49, 0xfe, 0xcc, 0x34, 0x80, 0x26, - 0x84, 0x49, 0x3e, 0x0d, 0x25, 0xa4, 0x49, 0xfe, 0xcc, 0x2e, 0x46, 0x40, - 0x00, 0xa7, 0x58, 0x42, 0x0b, 0x18, 0x3c, 0x4f, 0x58, 0x79, 0x46, 0x40, - 0x00, 0xa9, 0x58, 0x42, 0x0b, 0xe0, 0x3c, 0x4f, 0x59, 0x59, 0x46, 0x40, - 0x00, 0xa2, 0x58, 0x42, 0x0d, 0x28, 0x3c, 0x4f, 0x58, 0x44, 0x44, 0x3f, - 0xa0, 0xa0, 0x3c, 0x3a, 0xa5, 0x65, 0x46, 0x40, 0x00, 0xa9, 0x58, 0x42, - 0x0e, 0x1c, 0x3c, 0x4f, 0x58, 0xb6, 0x46, 0x40, 0x00, 0xa8, 0x58, 0x42, - 0x00, 0x34, 0x3c, 0x4f, 0x59, 0x56, 0x46, 0x40, 0x00, 0x9e, 0x58, 0x42, - 0x02, 0x44, 0x3c, 0x4f, 0x5a, 0x2a, 0x46, 0x40, 0x00, 0xa0, 0x58, 0x42, - 0x09, 0x14, 0x3c, 0x4f, 0x5a, 0x2b, 0x46, 0x40, 0x00, 0xa7, 0x58, 0x42, - 0x0d, 0xbc, 0x3c, 0x4f, 0x58, 0x3a, 0x46, 0x30, 0x00, 0xa6, 0x58, 0x31, - 0x84, 0x80, 0x14, 0x33, 0x80, 0x1f, 0x46, 0x40, 0x00, 0xac, 0x58, 0x42, - 0x04, 0x50, 0x3c, 0x4f, 0x58, 0xcb, 0x46, 0x40, 0x00, 0xac, 0x58, 0x42, - 0x0c, 0x28, 0x3c, 0x4f, 0x58, 0xf6, 0x46, 0x40, 0x00, 0xac, 0x58, 0x42, - 0x0c, 0x7c, 0x3c, 0x4f, 0x59, 0x00, 0x46, 0x40, 0x00, 0xa8, 0x58, 0x42, - 0x00, 0x20, 0x3c, 0x4f, 0x59, 0x3b, 0x46, 0x40, 0x00, 0xa4, 0x58, 0x42, - 0x0a, 0xfc, 0x3c, 0x4f, 0x58, 0x6a, 0x44, 0x30, 0x02, 0x80, 0x3c, 0x3a, - 0xa5, 0x62, 0x84, 0x0d, 0x46, 0x10, 0x00, 0xa9, 0x58, 0x10, 0x8c, 0x4c, - 0x49, 0xfe, 0x97, 0x1d, 0x49, 0xfc, 0xd3, 0x3d, 0x49, 0xff, 0x79, 0x5f, - 0x44, 0x30, 0xbb, 0x80, 0x3c, 0x3f, 0x58, 0x4e, 0x46, 0x30, 0x00, 0xab, - 0x58, 0x31, 0x80, 0x34, 0x3c, 0x3f, 0x58, 0xe9, 0x46, 0x30, 0x00, 0xa6, - 0x58, 0x31, 0x80, 0xc0, 0x3c, 0x3f, 0x58, 0x6e, 0x46, 0x30, 0x00, 0xa6, - 0x58, 0x31, 0x80, 0x5c, 0x3c, 0x3f, 0x58, 0x6c, 0x44, 0x00, 0x00, 0x19, - 0x46, 0x10, 0x00, 0xa7, 0x58, 0x10, 0x8a, 0x54, 0x49, 0xfd, 0xcc, 0x21, - 0x46, 0x40, 0x00, 0x9d, 0x58, 0x42, 0x08, 0xcc, 0x3c, 0x4f, 0x49, 0x11, - 0x84, 0x9f, 0x3e, 0xa5, 0x24, 0x68, 0x3e, 0x45, 0x24, 0x83, 0x46, 0x40, - 0x00, 0xa1, 0x58, 0x42, 0x05, 0x20, 0x3c, 0x4f, 0x5a, 0x21, 0x46, 0x30, - 0x00, 0xa5, 0x58, 0x31, 0x84, 0x50, 0x3c, 0x3f, 0x52, 0xd0, 0x50, 0x6f, - 0x80, 0x04, 0x3e, 0xa5, 0x24, 0x75, 0x44, 0x00, 0x01, 0x5e, 0x80, 0x26, - 0x84, 0x42, 0x49, 0xfb, 0x12, 0xd4, 0xc8, 0x15, 0xa6, 0x30, 0x9e, 0x01, - 0x96, 0x00, 0x5c, 0xf0, 0x00, 0xfe, 0xe8, 0x0f, 0xa6, 0x31, 0x44, 0x10, - 0x00, 0xff, 0x4c, 0x00, 0x80, 0x0b, 0xc0, 0x09, 0x54, 0x20, 0x00, 0x30, - 0x90, 0x44, 0x92, 0x06, 0x3e, 0x25, 0x24, 0x80, 0x3e, 0x05, 0x24, 0x82, - 0x3e, 0x1d, 0x48, 0x24, 0x00, 0x40, 0x80, 0x1d, 0x00, 0x50, 0x80, 0x1e, - 0x46, 0x80, 0x00, 0xa1, 0x58, 0x84, 0x03, 0x1c, 0x3c, 0x8f, 0x5a, 0x51, - 0x92, 0xa5, 0x95, 0x6d, 0x54, 0x42, 0x00, 0x3f, 0x46, 0x80, 0x00, 0x9f, - 0x58, 0x84, 0x00, 0x50, 0x3c, 0x8f, 0x5a, 0x2f, 0x10, 0x50, 0x80, 0x1e, - 0x10, 0x40, 0x80, 0x1d, 0x84, 0x41, 0x46, 0x70, 0x00, 0xa2, 0x58, 0x73, - 0x8c, 0x00, 0x3e, 0x0d, 0x4f, 0x44, 0x3c, 0x7f, 0x58, 0x57, 0x3e, 0x25, - 0x49, 0xcf, 0x46, 0x70, 0x00, 0x9f, 0x58, 0x73, 0x89, 0x78, 0x46, 0x10, - 0x00, 0x9d, 0x58, 0x10, 0x8e, 0xa4, 0x3c, 0x7f, 0x58, 0xdc, 0x14, 0x10, - 0x00, 0x16, 0x46, 0x50, 0x00, 0xa2, 0x58, 0x52, 0x89, 0x74, 0x46, 0x10, - 0x00, 0x9d, 0x58, 0x10, 0x8f, 0xc8, 0x3c, 0x5f, 0x53, 0xd0, 0x14, 0x10, - 0x00, 0x17, 0x46, 0x50, 0x00, 0xa2, 0x58, 0x52, 0x88, 0x50, 0x46, 0x10, - 0x00, 0xa2, 0x58, 0x10, 0x8a, 0x34, 0x14, 0x50, 0x00, 0x0c, 0x14, 0x10, - 0x00, 0x18, 0x46, 0x70, 0x00, 0xa2, 0x58, 0x73, 0x87, 0xfc, 0x46, 0x10, - 0x00, 0xa2, 0x58, 0x10, 0x89, 0xb0, 0x3c, 0x7f, 0x59, 0x2d, 0x3c, 0x1f, - 0x53, 0xce, 0x46, 0x70, 0x00, 0xa7, 0x58, 0x73, 0x8f, 0xe0, 0x46, 0x10, - 0x00, 0xa2, 0x58, 0x10, 0x88, 0x80, 0x3c, 0x7f, 0x59, 0x69, 0x3e, 0x6d, - 0xb3, 0xb4, 0x14, 0x10, 0x00, 0x11, 0x46, 0x70, 0x00, 0xa2, 0x58, 0x73, - 0x86, 0x78, 0x46, 0x10, 0x00, 0xa2, 0x58, 0x10, 0x88, 0x6c, 0x3c, 0x7f, - 0x58, 0x2e, 0x10, 0x23, 0x01, 0x84, 0xa8, 0x41, 0x46, 0x08, 0x10, 0x00, - 0x04, 0x20, 0x00, 0x1c, 0x42, 0x21, 0x44, 0x08, 0x14, 0x20, 0x00, 0x1c, - 0x3c, 0x3d, 0x58, 0xdd, 0x3c, 0x2d, 0x58, 0xde, 0x46, 0x40, 0x02, 0x00, - 0x40, 0x31, 0x90, 0x04, 0x40, 0x21, 0x10, 0x04, 0x46, 0x50, 0x00, 0xa7, - 0x58, 0x52, 0x8c, 0xbc, 0x3c, 0x5f, 0x52, 0xe2, 0x46, 0x50, 0x00, 0xa9, - 0x58, 0x52, 0x8d, 0xdc, 0x3c, 0x5f, 0x58, 0xe4, 0x44, 0x50, 0xbb, 0x80, - 0x3c, 0x5f, 0x58, 0x4b, 0x46, 0x50, 0x00, 0xa2, 0x58, 0x52, 0x85, 0x10, - 0x3c, 0x5f, 0x53, 0x2f, 0x46, 0x50, 0x00, 0xa9, 0x58, 0x52, 0x8e, 0x30, - 0x3c, 0x3f, 0x58, 0xdd, 0x3c, 0x2f, 0x58, 0xde, 0x46, 0x10, 0x00, 0xa1, - 0x58, 0x10, 0x8c, 0x5c, 0x3c, 0x5f, 0x58, 0xf8, 0x46, 0x50, 0x00, 0xaa, - 0x58, 0x52, 0x84, 0x8c, 0x3c, 0x5f, 0x59, 0x53, 0x3c, 0x1f, 0x59, 0x37, - 0x3c, 0x0d, 0x57, 0xfb, 0xdd, 0x20, 0x84, 0x00, 0x49, 0xff, 0x87, 0x87, - 0x04, 0x03, 0x00, 0x0f, 0x00, 0x23, 0x01, 0x0a, 0x44, 0x10, 0x00, 0x44, - 0x42, 0x01, 0x04, 0x73, 0x49, 0xfd, 0xdb, 0xfb, 0x46, 0x10, 0x00, 0xa9, - 0x58, 0x10, 0x8d, 0xbc, 0x3c, 0x1f, 0x58, 0xba, 0xec, 0x14, 0x3a, 0x6f, - 0xaa, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x46, 0x80, - 0x00, 0xad, 0x58, 0x84, 0x0a, 0x14, 0x3c, 0x8f, 0x59, 0x01, 0x46, 0x80, - 0x00, 0xad, 0x58, 0x84, 0x08, 0x50, 0x3c, 0x8f, 0x59, 0x02, 0x46, 0x80, - 0x00, 0x9d, 0x58, 0x84, 0x02, 0x88, 0x3e, 0x0d, 0xb3, 0xb4, 0x3c, 0x8f, - 0x59, 0x03, 0x46, 0x80, 0x00, 0xa2, 0x58, 0x84, 0x00, 0x3c, 0x84, 0x60, - 0x3c, 0x8f, 0x59, 0x0d, 0x02, 0x20, 0x00, 0x7c, 0x84, 0x21, 0x84, 0xca, - 0x84, 0xa2, 0x84, 0x85, 0x3e, 0x35, 0x6a, 0x99, 0x3e, 0x15, 0x6a, 0x70, - 0x10, 0x60, 0x01, 0x12, 0x10, 0x50, 0x01, 0x13, 0x10, 0x10, 0x01, 0x15, - 0x10, 0x40, 0x01, 0x14, 0x10, 0x60, 0x01, 0x0e, 0x10, 0x50, 0x01, 0x0f, - 0x10, 0x10, 0x01, 0x11, 0x10, 0x40, 0x01, 0x10, 0x10, 0x30, 0x01, 0x1a, - 0xc2, 0x05, 0x44, 0x00, 0xff, 0xff, 0x4c, 0x20, 0x40, 0x0a, 0x2e, 0x05, - 0xb4, 0xff, 0xc8, 0x06, 0x49, 0xfe, 0x47, 0xcf, 0x92, 0x00, 0x3c, 0x0a, - 0xda, 0x56, 0x84, 0x23, 0x3e, 0x15, 0x6a, 0xc8, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, - 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, - 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, - 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, - 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, - 0x00, 0x09, 0x3e, 0x1d, 0x25, 0x44, 0x84, 0x01, 0x14, 0x00, 0x80, 0x00, - 0x3e, 0x1d, 0x25, 0x40, 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, - 0x3e, 0x0d, 0x24, 0xe8, 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, - 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, - 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, - 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, - 0x64, 0x00, 0x00, 0x04, 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, - 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, - 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, - 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, - 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, - 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1d, 0x25, 0x44, 0x84, 0x02, 0x14, 0x00, - 0x80, 0x00, 0x3e, 0x1d, 0x25, 0x40, 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, - 0x80, 0x00, 0x3e, 0x0d, 0x24, 0xe8, 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, - 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, - 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, - 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, - 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, - 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, - 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, - 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, - 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, - 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1d, 0x25, 0x44, 0x84, 0x03, - 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1d, 0x25, 0x40, 0x50, 0x0f, 0x80, 0x04, - 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0d, 0x24, 0xe8, 0x04, 0x00, 0x00, 0x00, - 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, - 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, - 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, - 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, 0x3b, 0xff, 0xfc, 0x7c, - 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, - 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, - 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, - 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, - 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1d, 0x25, 0x44, - 0x84, 0x04, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1d, 0x25, 0x40, 0x50, 0x0f, - 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0d, 0x24, 0xe8, 0x04, 0x00, - 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, - 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, - 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, - 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, 0x3b, 0xff, - 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, 0x3a, 0xff, - 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, 0x64, 0x12, - 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, 0x54, 0x70, - 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, 0x50, 0x90, - 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, 0x3e, 0x1d, - 0x25, 0x44, 0x84, 0x05, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1d, 0x25, 0x40, - 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0d, 0x24, 0xe8, - 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, 0x88, 0x04, - 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, 0x04, 0x03, - 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, 0xa8, 0x04, - 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, 0x00, 0x04, - 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, 0xa8, 0x3c, - 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, 0x00, 0x02, - 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, 0x88, 0x3c, - 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, 0x00, 0x08, - 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, 0x00, 0x09, - 0x3e, 0x1d, 0x25, 0x44, 0x84, 0x06, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x1d, - 0x25, 0x40, 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, 0x3e, 0x0d, - 0x24, 0xe8, 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, 0x3a, 0x0f, - 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, 0x64, 0x22, - 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, 0x3a, 0x3f, - 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, 0x64, 0x00, - 0x00, 0x04, 0x3b, 0xff, 0xfc, 0x7c, 0x3a, 0x0f, 0x88, 0x3c, 0x3a, 0x3f, - 0xa8, 0x3c, 0x3a, 0xff, 0xbc, 0x3c, 0x3b, 0xff, 0xff, 0xbc, 0x64, 0x02, - 0x00, 0x02, 0x64, 0x12, 0xa4, 0x02, 0x64, 0x22, 0x04, 0x02, 0x3a, 0x0f, - 0x88, 0x3c, 0x54, 0x70, 0x00, 0x06, 0x5c, 0x83, 0x80, 0x02, 0x4e, 0x83, - 0x00, 0x08, 0x50, 0x90, 0x7f, 0xfe, 0x64, 0x92, 0x00, 0x03, 0x64, 0x00, - 0x00, 0x09, 0x3e, 0x1d, 0x25, 0x44, 0x84, 0x07, 0x14, 0x00, 0x80, 0x00, - 0x3e, 0x1d, 0x25, 0x40, 0x50, 0x0f, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, - 0x3e, 0x0d, 0x24, 0xe8, 0x04, 0x00, 0x00, 0x00, 0x4b, 0xe0, 0x00, 0x01, - 0x3a, 0x0f, 0x88, 0x04, 0x64, 0x02, 0x00, 0x03, 0x64, 0x12, 0xa4, 0x03, - 0x64, 0x22, 0x04, 0x03, 0x3b, 0xff, 0xff, 0x84, 0x3a, 0xff, 0xbc, 0x04, - 0x3a, 0x3f, 0xa8, 0x04, 0x3a, 0x0f, 0x88, 0x04, 0x3b, 0xff, 0xfc, 0x40, - 0x64, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x3e, 0x7d, - 0x25, 0x40, 0xb4, 0x07, 0x3e, 0x6c, 0xa4, 0x78, 0xa0, 0x42, 0xb4, 0x46, - 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0b, 0x88, 0xdd, 0x22, 0xb4, 0x07, - 0xb4, 0x46, 0xa0, 0x43, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0b, 0x9c, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xa0, 0x44, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0b, 0xb0, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xa0, 0x45, - 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0b, 0xc4, 0xdd, 0x22, 0xb4, 0x07, - 0xb4, 0x46, 0xa0, 0x46, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0b, 0xd8, - 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xa0, 0x47, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0b, 0xec, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, - 0x00, 0x08, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0c, 0x00, 0xdd, 0x22, - 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x09, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0c, 0x14, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, - 0x00, 0x0a, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0c, 0x28, 0xdd, 0x22, - 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x0b, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0c, 0x3c, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, - 0x00, 0x0c, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0c, 0x50, 0xdd, 0x22, - 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x0d, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0c, 0x64, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, - 0x00, 0x0e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0c, 0x78, 0xdd, 0x22, - 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x0f, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0c, 0x8c, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, - 0x00, 0x10, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0c, 0xa0, 0xdd, 0x22, - 0xb4, 0x07, 0xb4, 0x46, 0x04, 0x10, 0x00, 0x11, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0c, 0xb4, 0xdd, 0x22, 0xb4, 0x07, 0xb4, 0x46, 0xa0, 0x41, - 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0c, 0xc8, 0xdd, 0x22, 0xb4, 0x07, - 0xb4, 0x46, 0xb4, 0x20, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0c, 0xdc, - 0xdd, 0x22, 0xb4, 0x07, 0x04, 0x70, 0x00, 0x11, 0x50, 0x83, 0x81, 0x90, - 0x80, 0x27, 0xb4, 0x66, 0xa2, 0xb9, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0c, 0xf0, 0xdd, 0x23, 0x4c, 0x74, 0x7f, 0xf8, 0x3a, 0x6f, 0xa0, 0x84, - 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, 0x3e, 0x7d, 0x25, 0x40, - 0xb4, 0x07, 0x3e, 0x6c, 0xa4, 0x78, 0xb4, 0x40, 0xb4, 0x66, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0d, 0x14, 0x84, 0x20, 0xdd, 0x23, 0xb4, 0x07, - 0xb4, 0x66, 0xa0, 0x81, 0x84, 0x21, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0d, 0x2c, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x82, 0x84, 0x22, - 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0d, 0x44, 0xdd, 0x23, 0xb4, 0x07, - 0xb4, 0x66, 0xa0, 0x83, 0x84, 0x23, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0d, 0x5c, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x84, 0x84, 0x24, - 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0d, 0x74, 0xdd, 0x23, 0xb4, 0x07, - 0xb4, 0x66, 0xa0, 0x85, 0x84, 0x25, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0d, 0x8c, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0xa0, 0x86, 0x84, 0x26, - 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0d, 0xa4, 0xdd, 0x23, 0xb4, 0x07, - 0xb4, 0x66, 0xa0, 0x87, 0x84, 0x27, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0d, 0xbc, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x08, - 0x84, 0x28, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0d, 0xd4, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x09, 0x84, 0x29, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0d, 0xec, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, - 0x04, 0x20, 0x00, 0x0a, 0x84, 0x2a, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0e, 0x04, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x0b, - 0x84, 0x2b, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0e, 0x1c, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x0c, 0x84, 0x2c, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0e, 0x34, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, - 0x04, 0x20, 0x00, 0x0d, 0x84, 0x2d, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0e, 0x4c, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x0e, - 0x84, 0x2e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0e, 0x64, 0xdd, 0x23, - 0xb4, 0x07, 0xb4, 0x66, 0x04, 0x20, 0x00, 0x0f, 0x84, 0x2f, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0e, 0x7c, 0xdd, 0x23, 0xb4, 0x07, 0xb4, 0x66, - 0x04, 0x20, 0x00, 0x10, 0x44, 0x10, 0x00, 0x10, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0e, 0x94, 0xdd, 0x23, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, - 0xdd, 0x9e, 0x46, 0x08, 0x20, 0x6c, 0x58, 0x00, 0x00, 0x64, 0x3c, 0x2d, - 0x49, 0x52, 0xb4, 0x20, 0x40, 0x21, 0x7c, 0x08, 0x42, 0x10, 0xfc, 0x09, - 0x40, 0x10, 0x88, 0x04, 0xb6, 0x20, 0x3c, 0x2d, 0x49, 0x53, 0x46, 0x37, - 0x00, 0x00, 0x40, 0x21, 0x70, 0x08, 0xb4, 0x20, 0x40, 0x21, 0x0c, 0x02, - 0x46, 0x38, 0xff, 0xff, 0x58, 0x31, 0x8f, 0xff, 0x40, 0x10, 0x8c, 0x02, - 0x40, 0x11, 0x04, 0x04, 0xb6, 0x20, 0xdd, 0x9e, 0x92, 0x00, 0x3e, 0x1d, - 0x2a, 0x18, 0x00, 0x00, 0x80, 0x14, 0xc0, 0x14, 0x00, 0x00, 0x80, 0x2c, - 0xc8, 0x03, 0x84, 0x01, 0xd5, 0x0f, 0x00, 0x00, 0x80, 0x44, 0xc8, 0x03, - 0x84, 0x02, 0xd5, 0x0a, 0x00, 0x30, 0x80, 0x5c, 0x84, 0x43, 0x44, 0x10, - 0x00, 0xff, 0x40, 0x01, 0x0c, 0x1a, 0x40, 0x00, 0x8c, 0x1b, 0xdd, 0x9e, - 0x92, 0x00, 0x3c, 0x2d, 0x49, 0x50, 0x3e, 0x1d, 0x2a, 0x2c, 0x84, 0x00, - 0xa7, 0x08, 0x9c, 0xc1, 0xc4, 0x07, 0xa7, 0x09, 0xc4, 0x05, 0x04, 0x40, - 0xff, 0xfb, 0xb4, 0xa2, 0xd4, 0x06, 0x96, 0x1a, 0x84, 0xa4, 0x8c, 0x38, - 0xd8, 0xf4, 0x84, 0x1f, 0xdd, 0x9e, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xf4, - 0x3e, 0x6c, 0xa4, 0x78, 0xb4, 0x26, 0x83, 0x80, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0e, 0xac, 0x3e, 0x9d, 0x2a, 0x18, 0xdd, 0x21, 0x15, 0xcf, - 0x80, 0x01, 0x81, 0x46, 0x3e, 0x7d, 0x2a, 0x2c, 0x80, 0xc9, 0x85, 0x00, - 0xa6, 0x38, 0xc0, 0x0e, 0xa1, 0x71, 0xa6, 0xba, 0xa6, 0xf9, 0xb4, 0x86, - 0x05, 0xc5, 0x00, 0x00, 0x9d, 0x69, 0x80, 0x28, 0x46, 0x00, 0x00, 0xaf, - 0x58, 0x00, 0x0e, 0xdc, 0xdd, 0x3c, 0x8d, 0x01, 0x84, 0x04, 0x8c, 0xf8, - 0x8c, 0xd8, 0x4c, 0x80, 0x7f, 0xed, 0x05, 0xcf, 0x80, 0x01, 0x84, 0x00, - 0xb7, 0x3c, 0xec, 0x0c, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xfc, 0x84, 0xc1, 0x3c, 0x6f, 0x49, 0x52, 0x3c, 0x0d, - 0x49, 0x3c, 0xdd, 0x20, 0x3c, 0x0f, 0x49, 0x54, 0x3c, 0x0d, 0x49, 0x3e, - 0xdd, 0x20, 0x49, 0xff, 0xff, 0xac, 0x3c, 0x1d, 0x49, 0x54, 0xe6, 0x26, - 0xe8, 0x06, 0xe6, 0x23, 0xe8, 0x07, 0x84, 0xa2, 0xd9, 0x13, 0xd5, 0x06, - 0x84, 0xa7, 0xd9, 0x10, 0xd5, 0x0d, 0x84, 0x42, 0xd5, 0x0e, 0x2e, 0x5d, - 0x24, 0x8a, 0xd8, 0x03, 0x84, 0x40, 0xd5, 0x09, 0x4e, 0x05, 0x00, 0x0a, - 0x3c, 0x6f, 0x49, 0x53, 0xd5, 0x06, 0x84, 0x43, 0xd5, 0x02, 0x84, 0x44, - 0x3c, 0x2f, 0x49, 0x53, 0x2e, 0x15, 0x25, 0x60, 0xc1, 0x12, 0x3c, 0x1d, - 0x49, 0x53, 0x84, 0xa3, 0xd9, 0x0e, 0x84, 0x20, 0x3e, 0x15, 0x25, 0x60, - 0x3c, 0x0d, 0x49, 0x50, 0x3c, 0x1f, 0x49, 0x52, 0x9c, 0x04, 0xb4, 0x20, - 0x42, 0x10, 0xac, 0x09, 0xb6, 0x20, 0xd5, 0x1a, 0x3c, 0x1d, 0x49, 0x53, - 0xc9, 0x08, 0x3c, 0x1d, 0x49, 0x44, 0x96, 0x00, 0xdd, 0x21, 0x84, 0x3f, - 0x3e, 0x15, 0x24, 0x8a, 0x3c, 0x0d, 0x49, 0x51, 0xc0, 0x0b, 0x84, 0xa6, - 0xd0, 0x09, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x10, 0x00, 0x19, 0x58, 0x10, - 0x81, 0x00, 0x14, 0x10, 0x00, 0x19, 0x49, 0xff, 0xff, 0x26, 0x84, 0x00, - 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0xe6, 0x04, 0xe9, 0x0a, 0x3c, 0x1d, - 0x29, 0x1e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0f, 0x0c, 0xdd, 0x21, - 0x84, 0x06, 0xd5, 0x12, 0x44, 0x30, 0x00, 0x18, 0x42, 0x30, 0x0c, 0x24, - 0x3e, 0x2d, 0x2a, 0x18, 0x98, 0xda, 0x80, 0x43, 0xaa, 0x51, 0x84, 0x00, - 0x50, 0x11, 0x80, 0x10, 0x84, 0x61, 0xb6, 0x02, 0xae, 0xcc, 0xae, 0x0e, - 0xae, 0xcd, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0xe6, 0x04, 0xe9, 0x0a, 0x3c, 0x1d, - 0x29, 0x1e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0f, 0x34, 0xdd, 0x21, - 0x84, 0x06, 0xd5, 0x0e, 0x44, 0x10, 0x00, 0x18, 0x42, 0x10, 0x04, 0x24, - 0x3e, 0x0d, 0x2a, 0x18, 0x98, 0x48, 0x8c, 0x30, 0xa6, 0x0c, 0xc0, 0x04, - 0x84, 0x01, 0xae, 0x0d, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, - 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0xe6, 0x04, - 0xe9, 0x0a, 0x3c, 0x1d, 0x29, 0x1e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0f, 0x34, 0xdd, 0x21, 0x84, 0x06, 0xd5, 0x0e, 0x44, 0x10, 0x00, 0x18, - 0x42, 0x10, 0x04, 0x24, 0x3e, 0x0d, 0x2a, 0x18, 0x98, 0x48, 0x8c, 0x30, - 0xa6, 0x0c, 0xc0, 0x04, 0x84, 0x00, 0xae, 0x0d, 0x84, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x96, 0x00, 0xe6, 0x04, 0xe9, 0x0a, 0x3c, 0x1d, 0x29, 0x1e, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0f, 0x0c, 0xdd, 0x21, 0x84, 0x06, 0xd5, 0x15, - 0x44, 0x40, 0x00, 0x18, 0x84, 0x63, 0x42, 0x30, 0x0c, 0x24, 0x42, 0x00, - 0x10, 0x24, 0x3e, 0x4d, 0x2a, 0x18, 0x98, 0x04, 0x9c, 0xd9, 0xaa, 0x44, - 0x94, 0xdb, 0x84, 0x21, 0x98, 0xdc, 0xae, 0x46, 0xae, 0x45, 0xae, 0x44, - 0xa8, 0x99, 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x96, 0x00, 0xe6, 0x04, - 0xe9, 0x0a, 0x3c, 0x1d, 0x29, 0x1e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0f, 0x34, 0xdd, 0x21, 0x84, 0x06, 0xd5, 0x0e, 0x44, 0x20, 0x00, 0x18, - 0x42, 0x00, 0x08, 0x24, 0x3e, 0x3d, 0x2a, 0x18, 0x98, 0x83, 0x00, 0x01, - 0x00, 0x14, 0xc0, 0x04, 0x9e, 0x49, 0xa8, 0x51, 0x84, 0x00, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x3c, 0x0d, 0x49, 0x52, 0xc8, 0x0a, 0x3c, 0x1d, 0x29, 0x1e, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0f, 0x60, 0xdd, 0x21, 0x84, 0x1f, 0xd5, 0x0c, - 0x3c, 0x1d, 0x49, 0x50, 0x9c, 0x4c, 0xb4, 0x81, 0x84, 0x60, 0x42, 0x42, - 0x2c, 0x09, 0xb6, 0x81, 0x3c, 0x3f, 0x49, 0x52, 0x80, 0x03, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x3c, 0x0d, 0x49, 0x52, 0xc8, 0x0a, 0x3c, 0x1d, 0x29, 0x1e, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0f, 0x78, 0xdd, 0x21, 0x84, 0x1f, 0xd5, 0x0c, - 0x3c, 0x1d, 0x49, 0x50, 0x84, 0x60, 0x9c, 0x4c, 0xb4, 0x81, 0x80, 0x03, - 0x58, 0x42, 0x08, 0x00, 0xb6, 0x81, 0x3c, 0x3f, 0x49, 0x52, 0xec, 0x04, - 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, 0x9c, 0xbc, 0xef, 0xfc, - 0x3c, 0x0d, 0x49, 0x3f, 0xdd, 0x20, 0xd5, 0x04, 0x3c, 0x0d, 0x49, 0x56, - 0xdd, 0x20, 0x3c, 0x0d, 0x49, 0x52, 0x84, 0xa1, 0xd0, 0xfa, 0x3c, 0x0d, - 0x49, 0x40, 0xdd, 0x20, 0xec, 0x04, 0x3a, 0x6f, 0x9c, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, 0x3c, 0x0d, 0x49, 0x52, - 0xc8, 0x0a, 0x3c, 0x1d, 0x29, 0x1e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0f, 0x78, 0xdd, 0x21, 0x84, 0x03, 0xd5, 0x04, 0x49, 0xff, 0xfc, 0xb1, - 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x96, 0x48, - 0x80, 0x60, 0x40, 0x40, 0x04, 0x17, 0xc0, 0x03, 0x84, 0x05, 0xd5, 0x11, - 0x84, 0xa1, 0xd9, 0x03, 0xa6, 0x58, 0xd5, 0x0c, 0x84, 0xa2, 0xd9, 0x05, - 0x42, 0x31, 0x80, 0x09, 0xa4, 0x58, 0xd5, 0x06, 0x84, 0xa4, 0xd9, 0x05, - 0x92, 0x62, 0x94, 0xda, 0xb4, 0x23, 0xb6, 0x22, 0xdd, 0x9e, 0x96, 0x90, - 0x80, 0x60, 0x40, 0x40, 0x08, 0x17, 0xc0, 0x03, 0x84, 0x05, 0xd5, 0x12, - 0x84, 0xa1, 0xda, 0x04, 0x96, 0x48, 0xae, 0x58, 0xd5, 0x0d, 0x84, 0xa2, - 0xda, 0x06, 0x42, 0x31, 0x80, 0x09, 0x96, 0x49, 0xac, 0x58, 0xd5, 0x06, - 0x84, 0xa4, 0xda, 0x04, 0x92, 0x62, 0x94, 0xda, 0xb6, 0x23, 0xdd, 0x9e, - 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x80, 0x60, 0x3c, 0x3f, 0x49, 0x55, - 0x80, 0x01, 0x84, 0x20, 0x80, 0xc2, 0x80, 0x41, 0xdd, 0x23, 0xb6, 0x06, - 0x84, 0x00, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x84, 0x44, - 0x3c, 0x2f, 0x49, 0x53, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0e, 0x7c, - 0x3c, 0x2f, 0x49, 0x3a, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x00, 0x80, - 0x3c, 0x2f, 0x49, 0x39, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0b, 0x88, - 0x3c, 0x2f, 0x49, 0x3b, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x03, 0x38, - 0x3c, 0x2f, 0x49, 0x3c, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x01, 0xd0, - 0x3c, 0x2f, 0x49, 0x3d, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x01, 0xa0, - 0x3c, 0x2f, 0x49, 0x3e, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0b, 0xec, - 0x3c, 0x2f, 0x49, 0x3f, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x03, 0x84, - 0x3c, 0x2f, 0x49, 0x40, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0c, 0xac, - 0x3c, 0x2f, 0x49, 0x41, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0c, 0xf4, - 0x3c, 0x2f, 0x49, 0x42, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0d, 0x34, - 0x3c, 0x2f, 0x49, 0x43, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x03, 0x44, - 0x3c, 0x2f, 0x49, 0x44, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0d, 0x74, - 0x3c, 0x2f, 0x49, 0x45, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0d, 0xc4, - 0x3c, 0x2f, 0x49, 0x46, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x02, 0xec, - 0x3c, 0x2f, 0x49, 0x49, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0e, 0x04, - 0x3c, 0x2f, 0x49, 0x4a, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0e, 0x40, - 0x3c, 0x2f, 0x49, 0x4b, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x00, 0x8c, - 0x3c, 0x2f, 0x49, 0x47, 0x46, 0x20, 0x00, 0xaf, 0x58, 0x21, 0x02, 0x5c, - 0x3c, 0x2f, 0x49, 0x48, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0e, 0xa8, - 0x3c, 0x2f, 0x49, 0x4c, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0e, 0xd4, - 0x3c, 0x2f, 0x49, 0x4d, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0f, 0x04, - 0x3c, 0x2f, 0x49, 0x4e, 0x46, 0x20, 0x00, 0xae, 0x58, 0x21, 0x0f, 0x38, - 0x84, 0x00, 0x3c, 0x2f, 0x49, 0x4f, 0x3c, 0x0f, 0x49, 0x52, 0x64, 0x06, - 0xe0, 0x03, 0xdd, 0x9e, 0x92, 0x00, 0x46, 0x08, 0x00, 0x00, 0x64, 0x06, - 0xe0, 0x03, 0x84, 0x00, 0xdd, 0x9e, 0x80, 0x40, 0xe6, 0x12, 0xe9, 0x0b, - 0x44, 0x00, 0x00, 0x1f, 0x4c, 0x20, 0x00, 0x04, 0x84, 0x02, 0xd5, 0x0a, - 0x64, 0x12, 0x64, 0x03, 0x84, 0x00, 0xd5, 0x06, 0x3c, 0x3d, 0x49, 0x50, - 0x84, 0x00, 0x38, 0x11, 0x8a, 0x0a, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, - 0xfc, 0xbc, 0xef, 0xfc, 0x44, 0x50, 0x00, 0x39, 0xd1, 0x4d, 0x5c, 0xf0, - 0x80, 0x3a, 0xe8, 0x1b, 0x8e, 0xa8, 0xd1, 0x3c, 0x5c, 0xf0, 0x80, 0x32, - 0xe8, 0x0e, 0x9f, 0x6f, 0xd1, 0x2e, 0x5c, 0xf0, 0x80, 0x2b, 0xe8, 0x04, - 0x9f, 0x69, 0xd9, 0x56, 0xd5, 0x25, 0x9d, 0x69, 0xd1, 0x29, 0x9d, 0x69, - 0xd9, 0x51, 0xd5, 0x29, 0x9c, 0xaa, 0x4c, 0x11, 0x00, 0x30, 0xe2, 0x22, - 0xe9, 0x2a, 0x9d, 0x51, 0xd9, 0x49, 0xd5, 0x2d, 0x8c, 0xa9, 0xd1, 0x3d, - 0x5c, 0xf0, 0x80, 0x43, 0xe8, 0x0e, 0x9f, 0x6e, 0xd1, 0x32, 0x5c, 0xf0, - 0x80, 0x3d, 0xe8, 0x06, 0x9f, 0x6a, 0xd1, 0x27, 0x9d, 0x69, 0xd9, 0x3a, - 0xd5, 0x27, 0x9d, 0x6d, 0xd9, 0x37, 0xd5, 0x2a, 0x9d, 0x69, 0xd1, 0x2e, - 0x9d, 0x69, 0xd9, 0x32, 0xd5, 0x2e, 0x64, 0x06, 0x00, 0x03, 0xd5, 0x35, - 0x64, 0x06, 0x04, 0x03, 0xd5, 0x32, 0x64, 0x06, 0x08, 0x03, 0xd5, 0x2f, - 0x64, 0x06, 0x0c, 0x03, 0xd5, 0x2c, 0x64, 0x06, 0x20, 0x03, 0xd5, 0x29, - 0x64, 0x06, 0x24, 0x03, 0xd5, 0x26, 0x64, 0x06, 0x28, 0x03, 0xd5, 0x23, - 0x64, 0x06, 0x2c, 0x03, 0xd5, 0x20, 0x64, 0x06, 0x40, 0x03, 0xd5, 0x1d, - 0x64, 0x06, 0x44, 0x03, 0xd5, 0x1a, 0x64, 0x06, 0x48, 0x03, 0xd5, 0x17, - 0x64, 0x06, 0x4c, 0x03, 0xd5, 0x14, 0x64, 0x06, 0x60, 0x03, 0xd5, 0x11, - 0x64, 0x06, 0x64, 0x03, 0xd5, 0x0e, 0x64, 0x06, 0x68, 0x03, 0xd5, 0x0b, - 0x64, 0x06, 0x6c, 0x03, 0xd5, 0x08, 0x3c, 0x2d, 0x29, 0x1e, 0x46, 0x00, - 0x00, 0xaf, 0x58, 0x00, 0x0f, 0x9c, 0xdd, 0x22, 0xec, 0x04, 0x3b, 0xff, - 0xfc, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xa0, 0xbc, 0x3e, 0x7d, - 0x2a, 0x2c, 0x44, 0x60, 0x00, 0x29, 0xa6, 0x38, 0xc0, 0x07, 0xa6, 0x39, - 0xc0, 0x05, 0x80, 0x26, 0x84, 0x00, 0x49, 0xff, 0xff, 0x7e, 0x9d, 0xb1, - 0x44, 0x50, 0x00, 0x2d, 0x8c, 0xf8, 0xde, 0xf4, 0x84, 0x00, 0x3a, 0x6f, - 0xa0, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0xaa, 0xbc, 0xef, 0xfc, - 0x3e, 0x8d, 0x2a, 0x18, 0x50, 0x94, 0x00, 0x14, 0x51, 0xc4, 0x00, 0x08, - 0x44, 0x60, 0x00, 0x29, 0x84, 0xe0, 0x46, 0xa0, 0x00, 0xaf, 0x58, 0xa5, - 0x00, 0xb4, 0x00, 0x04, 0x80, 0x00, 0xc0, 0x26, 0x00, 0x04, 0x80, 0x01, - 0xc0, 0x23, 0xb4, 0x08, 0x50, 0x13, 0x00, 0x08, 0xdd, 0x2a, 0x04, 0x04, - 0x00, 0x01, 0x50, 0x13, 0x00, 0x10, 0xdd, 0x2a, 0xb4, 0x1c, 0x50, 0x13, - 0x00, 0x18, 0xdd, 0x2a, 0x00, 0x04, 0x80, 0x02, 0xc8, 0x03, 0x84, 0xe2, - 0xd5, 0x0e, 0xb8, 0x01, 0xc8, 0x03, 0x84, 0xe3, 0xd5, 0x0a, 0x84, 0xa1, - 0xd8, 0x03, 0x84, 0xe5, 0xd5, 0x06, 0x56, 0x00, 0x00, 0x02, 0x84, 0x27, - 0x40, 0x70, 0x80, 0x1a, 0x80, 0x07, 0x80, 0x26, 0xdd, 0x2a, 0x9d, 0xb1, - 0x44, 0x50, 0x00, 0x2d, 0x8d, 0x38, 0x8d, 0x18, 0x51, 0xce, 0x00, 0x18, - 0xde, 0xd1, 0x84, 0x00, 0xec, 0x04, 0x3a, 0x6f, 0xaa, 0x84, 0xdd, 0x9e, - 0x92, 0x00, 0xe6, 0x12, 0xe9, 0x3f, 0x44, 0x50, 0x00, 0x3e, 0xd0, 0x39, - 0x5c, 0xf0, 0x00, 0x3f, 0xe8, 0x0e, 0x9f, 0x6b, 0xd0, 0x2b, 0x5c, 0xf0, - 0x00, 0x3c, 0xe8, 0x04, 0x8e, 0xbc, 0xd8, 0x13, 0xd5, 0x14, 0x9d, 0x69, - 0xd0, 0x26, 0x9d, 0x69, 0xd8, 0x0e, 0xd5, 0x26, 0x9d, 0x6e, 0xd0, 0x15, - 0x5c, 0xf0, 0x00, 0x45, 0xe8, 0x04, 0x9f, 0x69, 0xd8, 0x06, 0xd5, 0x0a, - 0x9d, 0x69, 0xd0, 0x10, 0x9d, 0x69, 0xd0, 0x11, 0x84, 0x42, 0xd5, 0x24, - 0x64, 0x02, 0x64, 0x02, 0xd5, 0x03, 0x64, 0x06, 0x20, 0x02, 0xb6, 0x01, - 0x84, 0x40, 0xd5, 0x1c, 0x64, 0x06, 0x24, 0x02, 0xd5, 0xfb, 0x64, 0x06, - 0x28, 0x02, 0xd5, 0xf8, 0x64, 0x06, 0x2c, 0x02, 0xd5, 0xf5, 0x64, 0x06, - 0x00, 0x02, 0xd5, 0xf2, 0x64, 0x06, 0x04, 0x02, 0xd5, 0xef, 0x64, 0x06, - 0x08, 0x02, 0xd5, 0xec, 0x64, 0x06, 0x0c, 0x02, 0xd5, 0xe9, 0x3c, 0x3d, - 0x49, 0x50, 0x84, 0x40, 0x38, 0x31, 0x82, 0x02, 0xb6, 0x61, 0x80, 0x02, - 0xdd, 0x9e, 0x3a, 0x6f, 0x98, 0xbc, 0x3c, 0x0d, 0x49, 0x52, 0x84, 0xa1, - 0xd8, 0x0a, 0x3c, 0x1d, 0x29, 0x1e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, - 0x0f, 0xb8, 0xdd, 0x21, 0x84, 0x04, 0xd5, 0x15, 0x49, 0xff, 0xfc, 0x11, - 0x92, 0x00, 0x3c, 0x2d, 0x49, 0x41, 0x3e, 0x05, 0x24, 0x8a, 0x64, 0x12, - 0xa4, 0x02, 0xdd, 0x22, 0x2e, 0x3d, 0x24, 0x8a, 0x84, 0x26, 0x5e, 0x31, - 0x80, 0x00, 0x84, 0x40, 0x40, 0x01, 0x0c, 0x1a, 0x40, 0x00, 0x8c, 0x1b, - 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x64, 0x02, 0x64, 0x02, 0x54, 0x00, - 0x00, 0x0f, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x44, 0x20, 0x00, 0x18, 0x96, 0x40, 0x42, 0x00, 0x88, 0x24, 0x3e, 0x3d, - 0x2a, 0x18, 0x98, 0x03, 0x00, 0x30, 0x00, 0x14, 0xcb, 0x0a, 0x3c, 0x2d, - 0x29, 0x1e, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0f, 0xe0, 0xdd, 0x22, - 0x84, 0x01, 0xd5, 0x06, 0x84, 0x20, 0x49, 0xfb, 0x2d, 0xe8, 0x92, 0x00, - 0x84, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x98, 0xbc, 0x49, 0x00, 0x00, 0x52, 0x44, 0x50, 0x11, 0x08, 0xd0, 0x19, - 0x49, 0x00, 0x00, 0x4d, 0x44, 0x50, 0x11, 0x07, 0xd8, 0x11, 0x3c, 0x0d, - 0x49, 0x53, 0x9e, 0x01, 0xe6, 0x02, 0xe8, 0x0c, 0x3c, 0x0d, 0x49, 0x50, - 0x84, 0x41, 0x3e, 0x25, 0x25, 0x60, 0x9c, 0x04, 0xb4, 0x20, 0x58, 0x10, - 0x88, 0x00, 0xb6, 0x20, 0xd5, 0x04, 0x3c, 0x0d, 0x49, 0x3d, 0xdd, 0x20, - 0x84, 0x24, 0x3c, 0x1f, 0x49, 0x53, 0x49, 0xff, 0xfb, 0x90, 0x84, 0x00, - 0x3c, 0x0f, 0x49, 0x51, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0xdd, 0x9e, - 0x92, 0x00, 0x46, 0x48, 0x20, 0x6c, 0x80, 0x44, 0x80, 0x22, 0x80, 0x61, - 0x84, 0x00, 0x14, 0x02, 0x00, 0x1a, 0x14, 0x01, 0x00, 0x1b, 0x14, 0x00, - 0x80, 0x1c, 0x14, 0x01, 0x00, 0x1b, 0x14, 0x00, 0x80, 0x1c, 0x14, 0x01, - 0x80, 0x19, 0xdd, 0x9e, 0x92, 0x00, 0x3b, 0xff, 0xfc, 0xbc, 0xef, 0xfc, - 0x46, 0x10, 0x00, 0xaf, 0x58, 0x10, 0x84, 0x5c, 0x3c, 0x1f, 0x49, 0x56, - 0x44, 0x10, 0xd5, 0xb8, 0x3c, 0x1f, 0x29, 0xf1, 0x49, 0xff, 0xff, 0xdf, - 0x92, 0x00, 0xec, 0x04, 0x3b, 0xff, 0xfc, 0x84, 0xdd, 0x9e, 0x3c, 0x0d, - 0x49, 0x16, 0xdd, 0x9e, 0x92, 0x00, 0x3a, 0x6f, 0x98, 0xbc, 0x3c, 0x1d, - 0x29, 0x1e, 0x80, 0xc0, 0x46, 0x00, 0x00, 0xaf, 0x58, 0x00, 0x0f, 0xf8, - 0xdd, 0x21, 0x84, 0x00, 0x80, 0x66, 0x80, 0x20, 0x44, 0x20, 0x00, 0xff, - 0x49, 0xfa, 0x91, 0xc5, 0x3a, 0x6f, 0x98, 0x84, 0xdd, 0x9e, 0x3a, 0x6f, - 0x9c, 0xbc, 0xef, 0xf4, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x10, 0x00, 0x1a, - 0x3c, 0x1f, 0x49, 0x16, 0x4e, 0x12, 0x01, 0xd0, 0x84, 0xc0, 0x44, 0x00, - 0x11, 0x08, 0xf6, 0x81, 0x2e, 0x35, 0x24, 0x9a, 0x4c, 0x10, 0x00, 0xb4, - 0x5c, 0xf0, 0x91, 0x09, 0xe8, 0x32, 0x9f, 0x47, 0x4c, 0x12, 0x80, 0x85, - 0x5c, 0xf0, 0x91, 0x02, 0xe8, 0x19, 0x44, 0x50, 0x10, 0x03, 0x4c, 0x12, - 0x80, 0xcd, 0x5c, 0xf0, 0x90, 0x04, 0xe8, 0x08, 0x9f, 0x6a, 0x4c, 0x12, - 0x80, 0xad, 0x9d, 0x69, 0xd9, 0x65, 0x48, 0x00, 0x00, 0xb9, 0x9c, 0xea, - 0x4c, 0x11, 0x80, 0xdb, 0xe2, 0x23, 0x4e, 0xf3, 0x00, 0xcd, 0x9d, 0x59, - 0xd9, 0x5b, 0x48, 0x00, 0x00, 0xdf, 0x9f, 0x44, 0x4c, 0x12, 0x81, 0x48, - 0x5c, 0xf0, 0x91, 0x05, 0xe8, 0x07, 0x9f, 0x46, 0xd1, 0x64, 0x9f, 0x45, - 0xd9, 0x4f, 0x48, 0x00, 0x00, 0x78, 0x9f, 0x42, 0xd1, 0x6d, 0x5c, 0xf0, - 0x91, 0x07, 0x4e, 0xf2, 0x00, 0x7e, 0xd5, 0x60, 0x44, 0x50, 0x11, 0x10, - 0x4c, 0x12, 0x81, 0x02, 0x5c, 0xf0, 0x91, 0x11, 0xe8, 0x18, 0x9d, 0x43, - 0x4c, 0x12, 0x81, 0x16, 0x5c, 0xf0, 0x91, 0x0c, 0xe8, 0x07, 0x9d, 0x41, - 0xd1, 0x73, 0x9d, 0x42, 0xd9, 0x35, 0x48, 0x00, 0x00, 0xc6, 0x9d, 0x46, - 0x4c, 0x12, 0x80, 0xd6, 0x5c, 0xf0, 0x91, 0x0f, 0x4e, 0xf2, 0x00, 0xdf, - 0x9d, 0x44, 0xd9, 0x2a, 0x48, 0x00, 0x00, 0xca, 0x44, 0x50, 0x12, 0x01, - 0xd1, 0x28, 0x5c, 0xf0, 0x92, 0x02, 0xe8, 0x0c, 0x44, 0x50, 0x11, 0x19, - 0x4c, 0x12, 0x81, 0x1b, 0x9d, 0x69, 0x4c, 0x12, 0x81, 0x31, 0x8e, 0xa9, - 0xd9, 0x19, 0x48, 0x00, 0x00, 0xe4, 0x44, 0x50, 0x1f, 0x01, 0x4c, 0x12, - 0x81, 0x22, 0x9d, 0x69, 0x4c, 0x12, 0x80, 0xf6, 0x44, 0x50, 0x12, 0x02, - 0xd1, 0x02, 0xd5, 0x0c, 0x46, 0x08, 0x20, 0x6c, 0x46, 0x1e, 0x1e, 0x1e, - 0x58, 0x10, 0x81, 0xe1, 0x14, 0x10, 0x00, 0x1b, 0x84, 0x00, 0x49, 0xfa, - 0x9a, 0xd4, 0x84, 0xc0, 0x48, 0x00, 0x01, 0x27, 0x46, 0x08, 0x20, 0x6c, - 0x46, 0x1e, 0x2e, 0x2e, 0x58, 0x10, 0x82, 0xe2, 0x14, 0x10, 0x00, 0x1b, - 0x80, 0x06, 0x49, 0xfa, 0x9f, 0xd2, 0x48, 0x00, 0x01, 0x1a, 0x3e, 0x0d, - 0x24, 0x54, 0xd5, 0x03, 0x3e, 0x0d, 0x24, 0xe4, 0xb4, 0x00, 0xdd, 0x20, - 0x80, 0xc0, 0x48, 0x00, 0x01, 0x10, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x00, - 0x00, 0x1b, 0x3e, 0x1d, 0x25, 0x08, 0x48, 0x00, 0x00, 0xd7, 0x46, 0x08, - 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, 0x3e, 0x1d, 0x25, 0x0c, 0x48, 0x00, - 0x00, 0xcf, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, 0x00, 0x1b, - 0x04, 0x10, 0x80, 0x1c, 0x3c, 0x2d, 0x49, 0x41, 0x96, 0x00, 0xdd, 0x22, - 0xd5, 0x0a, 0x3e, 0x0d, 0x25, 0x28, 0xd5, 0xdd, 0x3e, 0x0d, 0x25, 0x2c, - 0xd5, 0xda, 0x3c, 0x0d, 0x49, 0x49, 0xdd, 0x20, 0x80, 0xc0, 0x3c, 0x0d, - 0x49, 0x3d, 0xdd, 0x20, 0x48, 0x00, 0x00, 0xe5, 0x46, 0x78, 0x20, 0x6c, - 0x3c, 0x3d, 0x49, 0x4d, 0x04, 0x03, 0x80, 0x1b, 0x84, 0x21, 0x50, 0x2f, - 0x80, 0x04, 0xdd, 0x23, 0xf3, 0x01, 0x80, 0xc0, 0x14, 0x33, 0x80, 0x1b, - 0x48, 0x00, 0x00, 0xd5, 0x46, 0x78, 0x20, 0x6c, 0x58, 0x73, 0x80, 0x6c, - 0x3c, 0x3d, 0x49, 0x4d, 0xb4, 0x07, 0x84, 0x22, 0x48, 0x00, 0x00, 0xaa, - 0x46, 0x78, 0x20, 0x6c, 0x3c, 0x3d, 0x49, 0x4d, 0x04, 0x03, 0x80, 0x1b, - 0x84, 0x24, 0x40, 0x2f, 0x84, 0x00, 0xdd, 0x23, 0xf1, 0x01, 0x80, 0xc0, - 0x14, 0x13, 0x80, 0x1b, 0x48, 0x00, 0x00, 0xbb, 0x46, 0x08, 0x20, 0x6c, - 0x80, 0x20, 0x04, 0x00, 0x00, 0x1b, 0x3c, 0x3d, 0x49, 0x4e, 0x04, 0x10, - 0x80, 0x1c, 0x84, 0x41, 0xd5, 0x16, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, - 0x04, 0x00, 0x00, 0x1b, 0x3c, 0x3d, 0x49, 0x4e, 0x04, 0x10, 0x80, 0x1c, - 0x84, 0x42, 0xd5, 0x0b, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, - 0x00, 0x1b, 0x04, 0x10, 0x80, 0x1c, 0x3c, 0x3d, 0x49, 0x4e, 0x84, 0x44, - 0xdd, 0x23, 0x48, 0xff, 0xff, 0x87, 0x46, 0x78, 0x20, 0x6c, 0x3c, 0x2d, - 0x49, 0x48, 0x04, 0x03, 0x80, 0x1b, 0x50, 0x1f, 0x80, 0x04, 0xdd, 0x22, - 0xf2, 0x01, 0x80, 0xc0, 0x14, 0x23, 0x80, 0x1b, 0x48, 0x00, 0x00, 0x89, - 0x3e, 0x0d, 0x25, 0x30, 0x48, 0xff, 0xff, 0x72, 0x46, 0x08, 0x20, 0x6c, - 0x04, 0x00, 0x00, 0x1b, 0x46, 0x18, 0x20, 0x6c, 0x3c, 0x3d, 0x49, 0x45, - 0x04, 0x10, 0x80, 0x1c, 0x96, 0x00, 0x84, 0x41, 0xd5, 0x19, 0x46, 0x08, - 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, 0x46, 0x18, 0x20, 0x6c, 0x3c, 0x3d, - 0x49, 0x45, 0x04, 0x10, 0x80, 0x1c, 0x96, 0x00, 0x80, 0x46, 0xd5, 0x0c, - 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, 0x00, 0x1b, 0x04, 0x10, - 0x80, 0x1c, 0x3c, 0x3d, 0x49, 0x45, 0x96, 0x00, 0x84, 0x42, 0xdd, 0x23, - 0xd5, 0x5d, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, 0x00, 0x1b, - 0x04, 0x10, 0x80, 0x1c, 0x3c, 0x2d, 0x49, 0x46, 0x96, 0x00, 0xdd, 0x22, - 0x48, 0xff, 0xff, 0x29, 0x46, 0x08, 0x20, 0x6c, 0x80, 0x20, 0x04, 0x00, - 0x00, 0x1b, 0x3c, 0x2d, 0x49, 0x47, 0x04, 0x10, 0x80, 0x1c, 0xdd, 0x22, - 0x48, 0xff, 0xff, 0x34, 0x3c, 0x1d, 0x49, 0x3b, 0x50, 0x0f, 0x80, 0x04, - 0xdd, 0x21, 0x80, 0xc0, 0xf3, 0x01, 0x46, 0x08, 0x20, 0x6c, 0x14, 0x30, - 0x00, 0x1b, 0xd5, 0x38, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, - 0x3e, 0x1d, 0x25, 0x10, 0xb4, 0x21, 0x96, 0x00, 0xdd, 0x21, 0x48, 0xff, - 0xff, 0x1d, 0x46, 0x78, 0x20, 0x6c, 0x46, 0x18, 0x20, 0x6c, 0x58, 0x73, - 0x80, 0x6c, 0xb4, 0x07, 0x3c, 0x3d, 0x49, 0x4f, 0x04, 0x10, 0x80, 0x1c, - 0x50, 0x2f, 0x80, 0x04, 0xdd, 0x23, 0x80, 0xc0, 0xf0, 0x01, 0xb6, 0x07, - 0xd5, 0x1b, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, 0x49, 0xff, - 0xfe, 0x4e, 0xd5, 0x14, 0x46, 0x08, 0x20, 0x6c, 0x04, 0x00, 0x00, 0x1b, - 0x3e, 0x1d, 0x2a, 0x78, 0x38, 0x00, 0x8e, 0x0a, 0x46, 0x08, 0x20, 0x6c, - 0x9c, 0xd9, 0x04, 0x40, 0x00, 0x1c, 0x96, 0xd8, 0x9c, 0x19, 0x38, 0x40, - 0x8e, 0x0a, 0x3e, 0x05, 0x24, 0x9a, 0x3c, 0x0d, 0x49, 0x16, 0x44, 0x50, - 0x11, 0x1a, 0xd0, 0x04, 0x84, 0x20, 0x3e, 0x15, 0x24, 0x9a, 0x46, 0x08, - 0x20, 0x6c, 0x84, 0x20, 0x14, 0x10, 0x00, 0x1a, 0x46, 0x08, 0x20, 0x6c, - 0x58, 0x00, 0x00, 0x64, 0xb4, 0x20, 0x44, 0x2f, 0xff, 0x0f, 0x95, 0xb4, - 0x40, 0x10, 0x88, 0x02, 0x97, 0xb0, 0x40, 0x63, 0x04, 0x04, 0xb6, 0xc0, - 0xb4, 0x40, 0xb4, 0x20, 0x9c, 0x91, 0x54, 0x21, 0x00, 0x0f, 0x92, 0x24, - 0x94, 0x4c, 0x40, 0x11, 0x04, 0x04, 0xb6, 0x20, 0xec, 0x0c, 0x3a, 0x6f, - 0x9c, 0x84, 0xdd, 0x9e, 0x92, 0x00, 0x80, 0x60, 0xc2, 0x07, 0x99, 0x4a, - 0x08, 0x40, 0x80, 0x01, 0x18, 0x41, 0x80, 0x01, 0xd9, 0xfc, 0xdd, 0x9e, - 0x92, 0x00, 0x80, 0x60, 0x99, 0x5a, 0xd3, 0x04, 0x18, 0x11, 0x80, 0x01, - 0xd5, 0xfd, 0xdd, 0x9e, 0x92, 0x00, 0x64, 0x00, 0x00, 0x00, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x2f, 0x73, 0x79, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x5f, 0x62, 0x69, 0x6e, 0x5f, 0x74, 0x2e, 0x63, 0x00, 0x64, 0x65, - 0x62, 0x75, 0x67, 0x20, 0x75, 0x61, 0x72, 0x74, 0x20, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x2e, 0x2e, 0x2e, 0x0a, 0x00, 0x70, 0x61, 0x74, 0x63, 0x68, 0x2f, - 0x62, 0x74, 0x73, 0x79, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, - 0x62, 0x69, 0x6e, 0x5f, 0x74, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75, 0x0e, 0x9f, - 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b, 0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, - 0xf8, 0x69, 0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67, 0x38, 0xa9, - 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d, 0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, - 0xd2, 0x43, 0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51, 0x2a, 0xbb, - 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f, 0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, - 0x94, 0x05, 0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b, 0x6c, 0xfd, - 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19, 0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, - 0x86, 0x17, 0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d, 0x46, 0xd7, - 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33, 0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, - 0xb0, 0x21, 0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f, 0xe0, 0x71, - 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95, 0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, - 0x0a, 0x9b, 0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89, 0xf2, 0x63, - 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87, 0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, - 0x3c, 0xad, 0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3, 0xc4, 0x55, - 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1, 0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, - 0x2e, 0xbf, 0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5, 0x9e, 0x0f, - 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb, 0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, - 0x68, 0xf9, 0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7, 0xa8, 0x39, - 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd, 0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, - 0x42, 0xd3, 0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1, 0xba, 0x2b, - 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf, 0x64, 0x32, 0x21, 0x19, 0x14, 0x11, - 0x0e, 0x0d, 0x0b, 0x0a, 0x00, 0x00, 0x0a, 0x05, 0x03, 0x03, 0x02, 0x02, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x70, 0x85, 0x01, 0x02, 0x70, 0x0a, - 0x02, 0x02, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, - 0x31, 0x30, 0x16, 0x17, 0x18, 0x19, 0x2f, 0x2e, 0x2d, 0x2c, 0x15, 0x14, - 0x3c, 0x00, 0x13, 0x01, 0x00, 0x00, 0x16, 0x17, 0x18, 0x19, 0x2e, 0x2f, - 0x30, 0x31, 0x2d, 0x2c, 0x15, 0x14, 0x1a, 0x1b, 0x1c, 0x1d, 0x2b, 0x2a, - 0x29, 0x28, 0x1e, 0x1f, 0x27, 0x26, 0x20, 0x25, 0x00, 0x00, 0x4e, 0x4d, - 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x2f, 0x30, 0x16, 0x17, 0x31, 0x2e, - 0x18, 0x15, 0x46, 0x19, 0x14, 0x2d, 0x32, 0x00, 0x13, 0x01, 0x2c, 0x33, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x41, 0x00, - 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1e, 0x00, - 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x4e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x32, 0x00, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, - 0x48, 0x47, 0x2f, 0x30, 0x16, 0x17, 0x31, 0x2e, 0x18, 0x15, 0x46, 0x19, - 0x14, 0x2d, 0x32, 0x2c, 0x33, 0x00, 0x19, 0xe1, 0x1d, 0x40, 0x1e, 0x20, - 0x2c, 0x8f, 0x31, 0xa0, 0x36, 0x0d, 0x5c, 0x0e, 0x5d, 0x48, 0x60, 0x63, - 0x63, 0x86, 0x67, 0x6c, 0x6b, 0xc7, 0x75, 0x88, 0x79, 0x81, 0x0e, 0x00, - 0x00, 0x00, 0x0b, 0x01, 0x08, 0x04, 0x0d, 0x04, 0x0e, 0x05, 0x0c, 0x0a, - 0x0e, 0x0e, 0x0e, 0x16, 0x0e, 0x1f, 0x08, 0x04, 0x0d, 0x04, 0x0a, 0x00, - 0x00, 0x00, 0x0b, 0x01, 0x08, 0x04, 0x0d, 0x04, 0x0e, 0x05, 0x0c, 0x0a, - 0x0e, 0x0e, 0x0e, 0x16, 0x0e, 0x1f, 0x0f, 0x1f, 0x09, 0x00, 0x02, 0x01, - 0x0f, 0x00, 0x04, 0x00, 0x03, 0x00, 0x24, 0x25, 0x26, 0x25, 0x27, 0x27, - 0x26, 0x26, 0x25, 0x26, 0x0a, 0x00, 0x24, 0x25, 0x26, 0x25, 0x27, 0x27, - 0x26, 0x26, 0x30, 0x00, 0x09, 0x00, 0x15, 0x3b, 0x20, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x32, 0x38, 0x20, - 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x32, 0x39, 0x20, 0x30, 0x78, 0x25, 0x78, - 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x33, 0x30, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x31, 0x35, 0x20, - 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x33, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x34, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x35, 0x20, 0x30, - 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x36, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x37, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x38, 0x20, 0x30, - 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x39, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x31, 0x30, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x30, 0x20, 0x30, - 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x52, 0x31, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x52, 0x32, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, 0x52, 0x33, 0x31, 0x20, - 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x52, 0x2e, 0x53, 0x20, 0x50, 0x53, 0x57, 0x20, 0x30, 0x78, 0x25, 0x78, - 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x52, 0x2e, 0x53, 0x20, - 0x50, 0x43, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x44, 0x2e, 0x53, 0x20, 0x44, 0x3a, 0x30, 0x78, - 0x25, 0x78, 0x20, 0x25, 0x25, 0x4c, 0x45, 0x20, 0x25, 0x25, 0x4c, 0x4f, - 0x4e, 0x47, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x50, 0x43, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x50, 0x53, 0x57, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x32, 0x38, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x32, 0x39, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x33, 0x30, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x31, 0x35, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x33, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x34, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x35, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x36, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x37, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x38, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x39, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x31, 0x30, 0x28, 0x30, 0x78, 0x25, 0x78, - 0x29, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x30, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x31, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x52, 0x32, 0x28, 0x30, 0x78, 0x25, 0x78, 0x29, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x4e, 0x75, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x6e, - 0x62, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x0a, 0x00, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x20, 0x20, 0x25, 0x64, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x25, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x25, 0x64, 0x20, 0x30, 0x78, 0x25, 0x78, 0x20, 0x20, 0x20, - 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x79, - 0x20, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x20, 0x62, 0x72, - 0x65, 0x61, 0x6b, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x6f, 0x75, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x20, - 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x69, - 0x73, 0x20, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x69, - 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x65, 0x62, - 0x75, 0x67, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x0a, 0x00, 0x5b, 0x46, - 0x44, 0x42, 0x5d, 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, - 0x73, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x78, - 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x0a, 0x00, 0x5b, 0x46, 0x44, 0x42, 0x5d, 0x20, - 0x4e, 0x6f, 0x20, 0x42, 0x50, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x5b, 0x44, 0x49, 0x5d, 0x20, 0x73, - 0x65, 0x6e, 0x64, 0x5f, 0x77, 0x6d, 0x74, 0x5f, 0x63, 0x6d, 0x64, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x4f, 0x08, 0x00, 0xe4, 0xc4, - 0x06, 0x00, 0x70, 0x18, 0x08, 0x00, 0x94, 0x80, 0x0a, 0x00, 0xc8, 0xc4, - 0x0a, 0x00, 0x48, 0x80, 0x0a, 0x00, 0x02, 0x02, 0x06, 0x00, 0x26, 0x10, - 0x4e, 0x10, 0x00, 0xc0, 0x09, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xcc, 0xd8, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xef, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x02, 0xd0, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/meminfo_list.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/meminfo_list.h deleted file mode 100644 index 99c6959ffe..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/meminfo_list.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - meminfo_list.h -*/ -#ifndef __MEMINFO_LIST_H__ -#define __MEMINFO_LIST_H__ - -#ifdef MEM_ALLOC_INFO_SUPPORT - -#include "rtmp_comm.h" - -#define POOL_ENTRY_NUMBER 2000 -#define HASH_SIZE 1024 - -typedef struct _MEM_INFO_LIST_ENTRY { - DL_LIST mList; - UINT32 MemSize; - VOID *pMemAddr; - VOID *pCaller; -} MEM_INFO_LIST_ENTRY; -typedef struct _MEM_INFO_LIST_POOL { - MEM_INFO_LIST_ENTRY Entry[POOL_ENTRY_NUMBER]; - DL_LIST List; -} MEM_INFO_LIST_POOL; - -typedef struct _FREE_LIST_POOL { - MEM_INFO_LIST_ENTRY head; - MEM_INFO_LIST_POOL Poolhead; - UINT32 EntryNumber; - NDIS_SPIN_LOCK Lock; - UINT32 MLlistCnt; -} FREE_LIST_POOL; - -typedef struct _MEM_INFO_LIST { - MEM_INFO_LIST_ENTRY pHead[HASH_SIZE]; - NDIS_SPIN_LOCK Lock; - UINT32 EntryNumber; - UINT32 CurAlcSize; - UINT32 MaxAlcSize; - FREE_LIST_POOL *pFreeEntrylist; -} MEM_INFO_LIST; - -static FREE_LIST_POOL FreeEntrylist; - -static inline MEM_INFO_LIST_ENTRY *GetEntryFromFreeList(MEM_INFO_LIST *MIList) -{ - MEM_INFO_LIST_ENTRY *pEntry = NULL; - MEM_INFO_LIST_ENTRY *pheadEntry = NULL; - FREE_LIST_POOL *pFreeEntrylist = MIList->pFreeEntrylist; - ULONG IrqFlags = 0; - UINT32 i; - - OS_INT_LOCK(&pFreeEntrylist->Lock, IrqFlags); - - if (DlListEmpty(&pFreeEntrylist->head.mList)) { - MEM_INFO_LIST_POOL *Pool = NULL; - MEM_INFO_LIST_POOL *pFreepool = NULL; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: allocated new pool\n", __func__)); - Pool = kmalloc(sizeof(MEM_INFO_LIST_POOL), GFP_ATOMIC); - pFreepool = &pFreeEntrylist->Poolhead; - DlListAdd(&pFreepool->List, &Pool->List); - pheadEntry = &pFreeEntrylist->head; - - for (i = 0; i < POOL_ENTRY_NUMBER; i++) { - pEntry = &Pool->Entry[i]; - DlListAdd(&pheadEntry->mList, &pEntry->mList); - } - - pFreeEntrylist->EntryNumber += POOL_ENTRY_NUMBER; - } - - pheadEntry = &pFreeEntrylist->head; - pEntry = DlListFirst(&pheadEntry->mList, MEM_INFO_LIST_ENTRY, mList); - DlListDel(&pEntry->mList); - - if (pEntry != NULL) - pFreeEntrylist->EntryNumber -= 1; - - OS_INT_UNLOCK(&pFreeEntrylist->Lock, IrqFlags); - return pEntry; -} - -static inline UINT32 HashF(VOID *pMemAddr) -{ - LONG addr = (LONG)pMemAddr; - UINT32 a = addr & 0xF; - UINT32 b = (addr & 0xF0) >> 4; - UINT32 c = (addr & 0xF00) >> 8; - UINT32 d = (addr & 0xF000) >> 12; - UINT32 e = (addr & 0xF0000) >> 16; - UINT32 f = (addr & 0xF00000) >> 20; - UINT32 g = (addr & 0xF000000) >> 24; - UINT32 h = (addr & 0xF0000000) >> 28; - - return (a + b * 3 + c * 5 + d * 7 + e * 11 + f * 13 + g * 17 + h * 19) % - HASH_SIZE; -} -static inline VOID PoolInit(VOID) -{ - if (FreeEntrylist.MLlistCnt == 0) { - NdisAllocateSpinLock(NULL, &FreeEntrylist.Lock); - DlListInit(&FreeEntrylist.Poolhead.List); - DlListInit(&FreeEntrylist.head.mList); - } - - FreeEntrylist.MLlistCnt++; -} - -static inline VOID PoolUnInit(VOID) -{ - FreeEntrylist.MLlistCnt--; - - if (FreeEntrylist.MLlistCnt == 0) { - MEM_INFO_LIST_POOL *pEntry = NULL; - - while (!DlListEmpty(&FreeEntrylist.Poolhead.List)) { - pEntry = DlListFirst(&FreeEntrylist.Poolhead.List, - MEM_INFO_LIST_POOL, List); - DlListDel(&pEntry->List); - kfree(pEntry); - } - } -} - -static inline VOID MIListInit(MEM_INFO_LIST *MIList) -{ - UINT32 i; - - for (i = 0; i < HASH_SIZE; i++) - DlListInit(&MIList->pHead[i].mList); - - NdisAllocateSpinLock(NULL, &MIList->Lock); - MIList->EntryNumber = 0; - MIList->CurAlcSize = 0; - MIList->MaxAlcSize = 0; - PoolInit(); - - if (DlListEmpty(&FreeEntrylist.Poolhead.List)) { - MEM_INFO_LIST_POOL *Pool = NULL; - MEM_INFO_LIST_POOL *pFreepool = NULL; - MEM_INFO_LIST_ENTRY *pEntry = NULL; - MEM_INFO_LIST_ENTRY *newEntry = NULL; - - Pool = kmalloc(sizeof(MEM_INFO_LIST_POOL), GFP_ATOMIC); - pFreepool = &FreeEntrylist.Poolhead; - DlListAdd(&pFreepool->List, &Pool->List); - pEntry = &FreeEntrylist.head; - - for (i = 0; i < POOL_ENTRY_NUMBER; i++) { - newEntry = &Pool->Entry[i]; - DlListAdd(&pEntry->mList, &newEntry->mList); - } - - FreeEntrylist.EntryNumber += POOL_ENTRY_NUMBER; - } - - MIList->pFreeEntrylist = &FreeEntrylist; -} -static inline VOID MIListExit(MEM_INFO_LIST *MIList) -{ - UINT32 i = 0; - ULONG IrqFlags = 0; - - OS_INT_LOCK(&MIList->Lock, IrqFlags); - - for (i = 0; i < HASH_SIZE; i++) - DlListInit(&MIList->pHead[i].mList); - - OS_INT_UNLOCK(&MIList->Lock, IrqFlags); - NdisFreeSpinLock(&MIList->Lock); - MIList->EntryNumber = 0; - PoolUnInit(); -} - -static inline MEM_INFO_LIST_ENTRY *MIListRemove(MEM_INFO_LIST *MIList, - VOID *pMemAddr) -{ - UINT32 Index = HashF(pMemAddr); - ULONG IrqFlags = 0; - ULONG IrqFlags2 = 0; - MEM_INFO_LIST_ENTRY *pEntry = NULL; - MEM_INFO_LIST_ENTRY *pheadEntry = NULL; - FREE_LIST_POOL *pFreeEntrylist = MIList->pFreeEntrylist; - - OS_INT_LOCK(&MIList->Lock, IrqFlags); - DlListForEach(pEntry, &MIList->pHead[Index].mList, MEM_INFO_LIST_ENTRY, - mList) - { - if (pEntry->pMemAddr == pMemAddr) { - DlListDel(&pEntry->mList); - MIList->EntryNumber--; - MIList->CurAlcSize -= pEntry->MemSize; - OS_INT_LOCK(&pFreeEntrylist->Lock, IrqFlags2); - pheadEntry = &pFreeEntrylist->head; - DlListAddTail(&pheadEntry->mList, &pEntry->mList); - pFreeEntrylist->EntryNumber += 1; - OS_INT_UNLOCK(&pFreeEntrylist->Lock, IrqFlags2); - break; - } - } - OS_INT_UNLOCK(&MIList->Lock, IrqFlags); - return pEntry; -} - -static inline VOID MIListAddHead(MEM_INFO_LIST *MIList, UINT32 Size, - VOID *pMemAddr, VOID *pCaller) -{ - UINT32 Index = HashF(pMemAddr); - ULONG IrqFlags = 0; - MEM_INFO_LIST_ENTRY *pEntry; - MEM_INFO_LIST_ENTRY *pheadEntry; - - OS_INT_LOCK(&MIList->Lock, IrqFlags); - pEntry = GetEntryFromFreeList(MIList); - - if (!pEntry) { - OS_INT_UNLOCK(&MIList->Lock, IrqFlags); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: pEntry is null!!!\n", __func__)); - return; - } - - pEntry->MemSize = Size; - pEntry->pMemAddr = pMemAddr; - pEntry->pCaller = pCaller; - pheadEntry = &MIList->pHead[Index]; - DlListAdd(&pheadEntry->mList, &pEntry->mList); - MIList->EntryNumber++; - MIList->CurAlcSize += pEntry->MemSize; - - if (MIList->CurAlcSize > MIList->MaxAlcSize) - MIList->MaxAlcSize = MIList->CurAlcSize; - - OS_INT_UNLOCK(&MIList->Lock, IrqFlags); -} - -static inline VOID ShowMIList(MEM_INFO_LIST *MIList) -{ - UINT32 i, total = 0; - MEM_INFO_LIST_ENTRY *pEntry = NULL; - - for (i = 0; i < HASH_SIZE; i++) { - DlListForEach(pEntry, &MIList->pHead[i].mList, - MEM_INFO_LIST_ENTRY, mList) - { - if (pEntry->MemSize == 0) - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%u: addr = %p, caller is %pS\n", - ++total, pEntry->pMemAddr, - pEntry->pCaller)); - else - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%u: addr = %p, size = %u, caller is %pS\n", - ++total, pEntry->pMemAddr, - pEntry->MemSize, pEntry->pCaller)); - } - } - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("the number of allocated memory = %u\n", - MIList->EntryNumber)); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("the number of free pool entry = %u\n", - MIList->pFreeEntrylist->EntryNumber)); -} - -#endif /* MEM_ALLOC_INFO_SUPPORT */ -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mgmt/be_export.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mgmt/be_export.h deleted file mode 100644 index 0d4d51e556..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mgmt/be_export.h +++ /dev/null @@ -1,304 +0,0 @@ -/* * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __BE_EXPORT_H__ -#define __BE_EXPORT_H__ - -#include "rtmp_def.h" - -struct _RTMP_ADAPTER; - -enum { - WLAN_OPER_STATE_INVALID = 0, - WLAN_OPER_STATE_VALID, -}; - -struct freq_cfg { - UCHAR ht_bw; - UCHAR vht_bw; - UCHAR ext_cha; - UCHAR prim_ch; - UCHAR cen_ch_2; -}; - -struct freq_oper { - UCHAR ht_bw; - UCHAR vht_bw; - UCHAR bw; - UCHAR ext_cha; - UCHAR prim_ch; - UCHAR cen_ch_1; - UCHAR cen_ch_2; -}; - -/*basic info obj */ -/* -struct phy_cfg{ - UCHAR phy_mode; - UCHAR prim_ch; - UCHAR tx_stream; - UCHAR rx_stream; -}; - -struct phy_op { - UCHAR phy_mode; - UCHAR prim_ch; - UCHAR tx_stream; - UCHAR rx_stream; - UCHAR wdev_bw; - UCHAR central1; - UCHAR central2; -} - -struct ht_info { - UCHAR ext_cha; - UCHAR ht_bw; - UCHAR oper_mode; - UCHAR mcs_set[16]; - BOOLEAN ht_en; - BOOLEAN pre_nht_en; - BOOLEAN gf; - BOOLEAN sgi_20; - BOOLEAN sgi_40; - BOOLEAN bss_coexist2040; - BOOLEAN ldpc; - BOOLEAN itx_bf; - BOOLEAN etx_bf; - BOOLEAN tx_stbc; - BOOLEAN rx_stbc; - struct ba_cap ba_cap; -}; - -struct ht_op_status { - BOOLEAN obss_non_ht_exist; - BOOLEAN non_gf_present; - UCHAR central_ch; - HT_CAPABILITY_IE ht_cap; - ADD_HT_INFO_IE addht; - UINT16 non_gf_sta; -}; - -struct ba_cap { - UCHAR mm_ps_mode; - UCHAR amsdu_size; - UCHAR mpdu_density; - UCHAR policy; - UCHAR tx_ba_win_limit; - UCHAR rx_ba_win_limit; - UCHAR max_ra_mpdu_factor; - BOOLEAN amsdu_en; - BOOLEAN auto_ba; -}; - -struct vht_info { - BOOLEAN vht_en; - BOOLEAN force_vht; - UCHAR vht_bw; - UCHAR vht_sgi; - UCHAR vht_stbc; - UCHAR vht_bw_signal; - UCHAR vht_cent_ch; - UCHAR vht_cent_ch2; - UCHAR vht_mcs_cap; - UCHAR vht_nss_cap; - USHORT vht_tx_hrate; - USHORT vht_rx_hrate; - BOOLEAN ht20_forbid; - BOOLEAN vht_ldpc; - BOOLEAN g_band_256_qam; -}; - -struct vht_op_status{ -}; -*/ - -struct phy_op { - UCHAR prim_ch; - /*private attribute*/ - UCHAR wdev_bw; - UCHAR cen_ch_1; - UCHAR cen_ch_2; - UINT8 tx_stream; - UINT8 rx_stream; -}; - -struct ht_op { - UCHAR ext_cha; - UCHAR ht_bw; - UCHAR ht_stbc; - UCHAR ht_ldpc; - UCHAR ht_gi; - UINT32 frag_thld; - UCHAR pkt_thld; - UINT32 len_thld; - UCHAR retry_limit; - UCHAR l_sig_txop; -}; - -struct ht_op_status { - /* Useful as AP. */ - ADD_HT_INFO_IE addht; - HT_CAPABILITY_IE ht_cap_ie; - /* counters */ - UINT16 non_gf_sta; -}; - -struct vht_op { - UCHAR vht_bw; - UCHAR vht_stbc; - UCHAR vht_ldpc; - UCHAR vht_sgi; - UCHAR vht_bw_sig; - UCHAR max_mpdu_len; - UCHAR max_ampdu_exp; -}; - -struct vht_op_status { - VHT_CAP_INFO vht_cap; -}; - -struct dev_rate_info { - UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR SupRateLen; - UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR ExtRateLen; - /* OID_802_11_DESIRED_RATES */ - UCHAR DesireRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR MaxDesiredRate; - /* RATE_1, RATE_2, RATE_5_5, RATE_11 */ - UCHAR MaxTxRate; - /* Tx rate index in Rate Switch Table */ - UCHAR TxRateIndex; - /* RATE_1, RATE_2, RATE_5_5, RATE_11 */ - UCHAR MinTxRate; - /* Same value to fill in TXD. TxRate is 6-bit */ - UCHAR TxRate; -#ifdef MIN_PHY_RATE_SUPPORT - UCHAR MinPhyDataRate; - UCHAR MinPhyBeaconRate; - UCHAR MinPhyMgmtRate; - UCHAR MinPhyBcMcRate; - BOOL LimitClientSupportRate; - BOOL DisableCCKRate; - HTTRANSMIT_SETTING MinPhyDataRateTransmit; - HTTRANSMIT_SETTING MinPhyBeaconRateTransmit; - HTTRANSMIT_SETTING MinPhyMgmtRateTransmit; - HTTRANSMIT_SETTING MinPhyBcMcRateTransmit; -#endif /* MIN_PHY_RATE_SUPPORT */ - - /* MGMT frame PHY rate setting when operatin at Ht rate. */ - HTTRANSMIT_SETTING MlmeTransmit; -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - BOOLEAN Eap_SupRate_En; - UCHAR EapSupRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR EapExtSupRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR EapSupRateLen; - UCHAR EapExtSupRateLen; - UCHAR EapSupportRateMode; - UINT8 EapSupportCCKMCS; - UINT8 EapSupportOFDMMCS; - BOOLEAN Eap_HtSupRate_En; - UCHAR EapMCSSet[16]; - BOOLEAN Eap_VhtSupRate_En; - struct _VHT_MCS_MAP rx_mcs_map; - struct _VHT_MCS_MAP tx_mcs_map; - UINT32 EapSupportHTMCS; - HTTRANSMIT_SETTING BcnPhyMode; - HTTRANSMIT_SETTING BcnPhyMode_5G; -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ -#ifdef MCAST_RATE_SPECIFIC -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - MCAST_TYPE McastType; - HTTRANSMIT_SETTING BCastPhyMode; - HTTRANSMIT_SETTING BCastPhyMode_5G; -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - HTTRANSMIT_SETTING MCastPhyMode; - HTTRANSMIT_SETTING MCastPhyMode_5G; -#endif /* MCAST_RATE_SPECIFIC */ -}; - -#define WLAN_OPER_OK (0) -#define WLAN_OPER_FAIL (-1) - -/* -* Operate GET -*/ -struct _ADD_HT_INFO_IE *wlan_operate_get_addht(struct wifi_dev *wdev); -UCHAR wlan_operate_get_bw(struct wifi_dev *wdev); -UCHAR wlan_operate_get_ht_bw(struct wifi_dev *wdev); -UCHAR wlan_operate_get_ht_stbc(struct wifi_dev *wdev); -UCHAR wlan_operate_get_ht_ldpc(struct wifi_dev *wdev); -UCHAR wlan_operate_get_ext_cha(struct wifi_dev *wdev); -#ifdef DOT11_VHT_AC -UCHAR wlan_operate_get_vht_bw(struct wifi_dev *wdev); -UCHAR wlan_operate_get_vht_ldpc(struct wifi_dev *wdev); -#endif /*DOT11_VHT_AC*/ -UINT16 wlan_operate_get_non_gf_sta(struct wifi_dev *wdev); -UCHAR wlan_operate_get_prim_ch(struct wifi_dev *wdev); -UCHAR wlan_operate_get_cen_ch_2(struct wifi_dev *wdev); -UCHAR wlan_operate_get_cen_ch_1(struct wifi_dev *wdev); -UINT32 wlan_operate_get_frag_thld(struct wifi_dev *wdev); -UCHAR wlan_operate_get_rts_pkt_thld(struct wifi_dev *wdev); -UINT32 wlan_operate_get_rts_len_thld(struct wifi_dev *wdev); -UCHAR wlan_operate_get_rts_retry_limit(struct wifi_dev *wdev); -UINT8 wlan_operate_get_tx_stream(struct wifi_dev *wdev); -UINT8 wlan_operate_get_rx_stream(struct wifi_dev *wdev); -VOID *wlan_operate_get_ht_cap(struct wifi_dev *wdev); - -VOID dump_ht_cap(struct wifi_dev *wdev); -/* -* Operate Set -*/ - -#ifdef DOT11_VHT_AC -INT32 wlan_operate_set_vht_bw(struct wifi_dev *wdev, UCHAR vht_bw); -INT32 wlan_operate_set_vht_ldpc(struct wifi_dev *wdev, UCHAR vht_ldpc); -#endif /*DOT11_VHT_AC*/ -INT32 wlan_operate_set_support_ch_width_set(struct wifi_dev *wdev, - UCHAR ch_width_set); -INT32 wlan_operate_set_ht_bw(struct wifi_dev *wdev, UCHAR ht_bw, UCHAR ext_cha); -INT32 wlan_operate_set_ht_stbc(struct wifi_dev *wdev, UCHAR ht_stbc); -INT32 wlan_operate_set_ht_ldpc(struct wifi_dev *wdev, UCHAR ht_ldpc); -INT32 wlan_operate_set_non_gf_sta(struct wifi_dev *wdev, UINT16 non_gf_sta); -INT32 wlan_operate_set_max_amsdu_len(struct wifi_dev *wdev, UCHAR len); -INT32 wlan_operate_set_prim_ch(struct wifi_dev *wdev, UCHAR prim_ch); -INT32 wlan_operate_set_cen_ch_2(struct wifi_dev *wdev, UCHAR cen_ch_2); -INT32 wlan_operate_set_phy(struct wifi_dev *wdev, struct freq_cfg *cfg); -INT32 wlan_operate_set_frag_thld(struct wifi_dev *wdev, UINT32 frag_thld); -INT32 wlan_operate_set_rts_pkt_thld(struct wifi_dev *wdev, UCHAR pkt_num); -INT32 wlan_operate_set_rts_len_thld(struct wifi_dev *wdev, UINT32 pkt_len); -INT32 wlan_operate_set_tx_stream(struct wifi_dev *wdev, UINT8 tx_stream); -INT32 wlan_operate_set_rx_stream(struct wifi_dev *wdev, UINT8 rx_stream); -INT32 wlan_operate_set_min_start_space(struct wifi_dev *wdev, - UCHAR mpdu_density); -INT32 wlan_operate_set_mmps(struct wifi_dev *wdev, UCHAR mmps); -INT32 wlan_operate_set_ht_max_ampdu_len_exp(struct wifi_dev *wdev, - UCHAR exp_factor); -INT32 wlan_operate_set_ht_delayed_ba(struct wifi_dev *wdev, UCHAR support); -INT32 wlan_operate_set_lsig_txop_protect(struct wifi_dev *wdev, UCHAR support); -INT32 wlan_operate_set_psmp(struct wifi_dev *wdev, UCHAR psmp); - -/* - * Operate Update - */ -VOID wlan_operate_update_ht_stbc(struct wifi_dev *wdev, UCHAR use_stbc); -VOID wlan_operate_update_ht_cap(struct wifi_dev *wdev); -/* -* -*/ -VOID wlan_operate_init(struct wifi_dev *wdev); -VOID wlan_operate_exit(struct wifi_dev *wdev); -UCHAR wlan_operate_set_state(struct wifi_dev *wdev, UCHAR state); -UCHAR wlan_operate_get_state(struct wifi_dev *wdev); -BOOLEAN wlan_operate_scan(struct wifi_dev *wdev, UCHAR prim_ch); -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mgmt/be_internal.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mgmt/be_internal.h deleted file mode 100644 index 3fd0f534be..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mgmt/be_internal.h +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#ifndef __BE_INTERNAL_H__ -#define __BE_INTERNAL_H__ - -#include "mgmt/be_export.h" - -/* -* private structure definition to prevent direct access -*/ -struct wlan_config { - struct phy_cfg phy_conf; - struct ht_cfg ht_conf; - struct vht_cfg vht_conf; -}; - -struct wlan_operate { - struct phy_op phy_oper; - struct ht_op ht_oper; - struct ht_op_status ht_status; - struct vht_op vht_oper; - struct vht_op_status vht_status; - UCHAR state; -}; - -/* -* Utility -*/ -VOID phy_freq_get_cfg(struct wifi_dev *wdev, struct freq_cfg *cfg); - -/* -* internal export configure loader -*/ -VOID phy_oper_init(struct wifi_dev *wdev, struct phy_op *obj); -VOID phy_oper_exit(struct phy_op *obj); - -/* -*ht related -*/ -VOID ht_oper_init(struct wifi_dev *wdev, struct ht_op *obj); -VOID ht_oper_exit(struct ht_op *obj); - -/* -*vht info related -*/ -VOID vht_oper_init(struct wifi_dev *wdev, struct vht_op *obj); -VOID vht_oper_exit(struct vht_op *obj); - -/* -*vht phy op related -*/ -VOID vht_op_status_init(struct wifi_dev *wdev, struct vht_op_status *obj); -VOID vht_op_status_exit(struct vht_op_status *obj); - -/* -* ht operate related -*/ -VOID ht_op_status_init(struct wifi_dev *wdev, struct ht_op_status *obj); -VOID ht_op_status_exit(struct ht_op_status *obj); - -/* -* be_phy module -*/ -VOID operate_loader_prim_ch(struct wlan_operate *op); -VOID operate_loader_phy(struct wifi_dev *wdev, struct freq_cfg *fcfg); - -/* -* be_ht module -*/ -VOID operate_loader_ht_bw(struct wlan_operate *op); -VOID operate_loader_ext_cha(struct wlan_operate *op); -VOID operate_loader_frag_thld(struct wlan_operate *op, UINT32 frag_thld); -VOID operate_loader_rts_len_thld(struct wlan_operate *op, UINT32 len_thld); -VOID operate_loader_rts_pkt_thld(struct wlan_operate *op, UCHAR pkt_num); - -/* -* be_vht module -*/ -VOID operate_loader_vht_bw(struct wlan_operate *op); -VOID operate_loader_vht_ldpc(struct wlan_operate *op, UCHAR vht_ldpc); - -#endif /*__BE_INTERNAL_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/misc_app.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/misc_app.h deleted file mode 100644 index 2797bda2f0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/misc_app.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - *************************************************************************** - * Mediatek Tech Inc. - * No.1, Dusing 1st Rd., - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2018, Mediatek Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - misc_app.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs - - Carter Chen 2018-Oct-11 misc applications definitions. -*/ -#ifndef _MISC_APP_H_ -#define _MISC_APP_H_ - -#include "rtmp_type.h" -#include "rtmp_def.h" -#include "rtmp.h" - -enum wifi_cap_type { - WIFI_CAP_CHIP = 0, - WIFI_CAP_SEC, - WIFI_CAP_FEATURE, - WIFI_CAP_MAX, /*further capabilities, please add before WIFI_CAP_MAX*/ -}; - -enum wifi_chip_cap_type { - WIFI_CHIP_HT_MODE_SUP = 0, - WIFI_CHIP_VHT_MODE_SUP, - WIFI_CHIP_HE_MODE_SUP, - WIFI_CHIP_DBDC_MODE_SUP, - WIFI_CHIP_CH_SUP, - WIFI_CHIP_ADV_SEC_MODE_SUP, - WIFI_CHIP_BF_SUP, - WIFI_CHIP_MU_MIMO_SUP, - WIFI_CHIP_MBSS_NUM, - WIFI_CHIP_TX_STR_NUM, - WIFI_CHIP_RX_STR_NUM, - WIFI_CHIP_CAP_MAX, /*further capabilities, please add before WIFI_CHIP_CAP_MAX*/ -}; - -enum wifi_sec_cap_type { - WIFI_SEC_WEP = 0, - WIFI_SEC_WAPI, - WIFI_SEC_PMF, - WIFI_SEC_WPA1, - WIFI_SEC_WPA1PSK, - WIFI_SEC_WPA2, - WIFI_SEC_WPA2PSK, - WIFI_SEC_WPA3, - WIFI_SEC_WPA3PSK, - WIFI_SEC_WPA3_SUITE_B_192, - WIFI_SEC_WPA3_ENHANCE_OPEN, - WIFI_SEC_CAP_MAX, /*further capabilities, please add before WIFI_SEC_CAP_MAX*/ -}; - -enum wifi_feature_cap_type { - WIFI_FEATURE_AP = 0, - WIFI_FEATURE_STA, - WIFI_FEATURE_REPT, - WIFI_FEATURE_WDS, - WIFI_FEATURE_WPS, - WIFI_FEATURE_DFS, - WIFI_FEATURE_VOW, - WIFI_FEATURE_PASSPOINT, - WIFI_FEATURE_11R, - WIFI_FEATURE_11K, - WIFI_FEATURE_11V, - WIFI_FEATURE_MBO, - WIFI_FEATURE_MAP, - WIFI_FEATURE_MAX, /*further capabilities, please add before WIFI_FEATURE_MAX*/ -}; - -enum wifi_cap_operation_status { - WIFI_CAP_STATUS_OK = 0, - WIFI_CAP_STATUS_FAIL, - WIFI_CAP_STATUS_INVALID_PARAMETER, -}; - -enum wifi_cap_operation_status -wifi_sup_list_register(struct _RTMP_ADAPTER *ad, enum wifi_cap_type cap_type); - -enum wifi_cap_operation_status -wifi_sup_list_unregister(struct _RTMP_ADAPTER *ad, enum wifi_cap_type cap_type, - int sub_type); - -INT show_wifi_cap_list(struct _RTMP_ADAPTER *ad, char *arg); - -#endif /* _MISC_APP_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mlme.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mlme.h deleted file mode 100644 index 066b72632f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mlme.h +++ /dev/null @@ -1,1819 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mlme.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - John Chang 2003-08-28 Created - John Chang 2004-09-06 modified for RT2600 - -*/ -#ifndef __MLME_H__ -#define __MLME_H__ - -#include "rtmp_dot11.h" - -#ifdef CONFIG_RCSA_SUPPORT -#include "spectrum_def.h" -#endif - -#ifdef DOT11R_FT_SUPPORT -#include "common/link_list.h" -#include "ft_cmm.h" -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT -#include "dot11r_ft.h" -#endif /* DOT11K_RRM_SUPPORT */ - -#include "security/owe_cmm.h" -#ifdef WAPP_SUPPORT -#include "wapp/wapp_cmm_type.h" -#endif -/* Extern Variables */ -extern UCHAR WPS_OUI[]; -extern UCHAR RALINK_OUI[]; -#ifdef OCE_SUPPORT -extern UCHAR BROADCAST_ADDR[]; -#endif /* OCE_SUPPORT */ - -/* maximum supported capability information - */ -/* ESS, IBSS, Privacy, Short Preamble, Spectrum mgmt, Short Slot */ -#define SUPPORTED_CAPABILITY_INFO 0x0533 - -#define END_OF_ARGS -1 -#define LFSR_MASK 0x80000057 -#define MLME_TASK_EXEC_INTV 100 /*200*/ -#define LEAD_TIME 5 - -#define MLME_TASK_EXEC_MULTIPLE \ - 10 /*5*/ /* MLME_TASK_EXEC_MULTIPLE * MLME_TASK_EXEC_INTV = 1 sec */ -#define REORDER_EXEC_INTV 100 /* 0.1 sec */ -#define STA_KEEP_ALIVE_NOTIFY_L2 60 - -/*#define TBTT_PRELOAD_TIME 384 // usec. LomgPreamble + 24-byte at 1Mbps */ - -/* The definition of Radar detection duration region */ -#define CE 0 -#define FCC 1 -#define JAP 2 -#define JAP_W53 3 -#define JAP_W56 4 -#define CHN 5 -#define MAX_RD_REGION 6 -#if defined(CONFIG_MULTI_CHANNEL) || defined(DOT11Z_TDLS_SUPPORT) -#define BEACON_LOST_TIME (12 * OS_HZ) /* 2048 msec = 2 sec */ -#else -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || \ - defined(MT7637_FPGA) || defined(MT7615_FPGA) || \ - defined(MT7622_FPGA) || defined(P18_FPGA) || defined(MT7663_FPGA) -#define BEACON_LOST_TIME (40 * OS_HZ) /* 2048 msec = 2 sec */ -#else -#define BEACON_LOST_TIME (4 * OS_HZ) /* 2048 msec = 2 sec */ -#endif /* MT7603_FPGA */ -#endif /* defined(CONFIG_MULTI_CHANNEL) || defined(DOT11Z_TDLS_SUPPORT) */ - -#define DLS_TIMEOUT 1200 /* unit: msec */ -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || \ - defined(MT7637_FPGA) || defined(MT7615_FPGA) || \ - defined(MT7622_FPGA) || defined(P18_FPGA) || defined(MT7663_FPGA) -#define AUTH_TIMEOUT 5000 /* unit: msec */ -#define ASSOC_TIMEOUT 5000 /* unit: msec */ -#else -#define AUTH_TIMEOUT 300 /* unit: msec */ -#define ASSOC_TIMEOUT 300 /* unit: msec */ -#endif /* MT7603_FPGA */ - -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || \ - defined(MT7637_FPGA) || defined(MT7615_FPGA) || \ - defined(MT7622_FPGA) || defined(P18_FPGA) || defined(MT7663_FPGA) -#define JOIN_TIMEOUT 2000 /* unit: msec */ -#else -#define JOIN_TIMEOUT 2000 /* unit: msec */ -#endif /* MT7603_FPGA */ -#define SHORT_CHANNEL_TIME 90 /* unit: msec */ -#define MIN_CHANNEL_TIME 110 /* unit: msec, for dual band scan */ -#define MAX_CHANNEL_TIME 140 /* unit: msec, for single band scan */ -#define FAST_ACTIVE_SCAN_TIME \ - 30 /* Active scan waiting for probe response time */ - -#define AUTO_CHANNEL_SEL_TIMEOUT 400 /* uint: msec */ -#define LINK_DOWN_TIMEOUT 20000 /* unit: msec */ -#define AUTO_WAKEUP_TIMEOUT 70 /*unit: msec */ - -/* Note: RSSI_TO_DBM_OFFSET has been changed to variable for new RF (2004-0720). */ -/* SHould not refer to this constant anymore */ -/*#define RSSI_TO_DBM_OFFSET 120 // for RT2530 RSSI-115 = dBm */ -#define RSSI_FOR_MID_TX_POWER -55 /* -55 db is considered mid-distance */ -#define RSSI_FOR_LOW_TX_POWER \ - -45 /* -45 db is considered very short distance and */ -/* eligible to use a lower TX power */ -#define RSSI_FOR_LOWEST_TX_POWER -30 -/*#define MID_TX_POWER_DELTA 0 // 0 db from full TX power upon mid-distance to AP */ -#define LOW_TX_POWER_DELTA \ - 6 /* -3 db from full TX power upon very short distance. 1 grade is 0.5 db */ -#define LOWEST_TX_POWER_DELTA \ - 16 /* -8 db from full TX power upon shortest distance. 1 grade is 0.5 db */ - -#define RSSI_TRIGGERED_UPON_BELOW_THRESHOLD 0 -#define RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD 1 -#define RSSI_THRESHOLD_FOR_ROAMING 25 -#define RSSI_DELTA 5 - -/* Channel Quality Indication */ -#define CQI_IS_GOOD(cqi) ((cqi) >= 50) -/*#define CQI_IS_FAIR(cqi) (((cqi) >= 20) && ((cqi) < 50)) */ -#define CQI_IS_POOR(cqi) (cqi < 50) /*(((cqi) >= 5) && ((cqi) < 20)) */ -#define CQI_IS_BAD(cqi) (cqi < 5) -#define CQI_IS_DEAD(cqi) (cqi == 0) - -/* weighting factor to calculate Channel quality, total should be 100% */ -#define RSSI_WEIGHTING 50 -#define TX_WEIGHTING 30 -#define RX_WEIGHTING 20 - -#define BSS_NOT_FOUND 0xFFFFFFFF - -#define MAX_NUM_OF_MLME_QUEUE 1 -#ifndef MLME_MULTI_QUEUE_SUPPORT -#define MAX_LEN_OF_MLME_QUEUE 256 -#else -#define MAX_LEN_OF_MLME_QUEUE 128 -#define MAX_LEN_OF_MLME_HP_QUEUE 50 -#define MAX_LEN_OF_MLME_LP_QUEUE 128 - -#define RATION_OF_MLME_HP_QUEUE 5 -#define RATION_OF_MLME_QUEUE 3 -#define RATION_OF_MLME_LP_QUEUE 1 - -#undef MAX_NUM_OF_MLME_QUEUE -#define MAX_NUM_OF_MLME_QUEUE 3 -#endif /*MLME_MULTI_QUEUE_SUPPORT*/ - -enum SCAN_MODE { - /* Active scan, send probe request, and wait beacon and probe response */ - SCAN_ACTIVE = 0x00, /* all channels */ - SCAN_CISCO_ACTIVE = 0x1, /* single channel only */ - FAST_SCAN_ACTIVE = 0x2, -#ifdef WSC_INCLUDED - SCAN_WSC_ACTIVE = 0x3, -#endif /* WSC_INCLUDED */ -#ifdef DOT11N_DRAFT3 - SCAN_2040_BSS_COEXIST = 0x4, -#endif /* DOT11N_DRAFT3 */ - SCAN_ACTIVE_MAX, - - /* Passive scan, no probe request, only wait beacon and probe response */ - SCAN_PASSIVE = 0x80, /* all channels */ - SCAN_CISCO_PASSIVE = 0x81, /* single channel only */ - SCAN_CISCO_NOISE = - 0x82, /* single channel only, for noise histogram collection */ - SCAN_CISCO_CHANNEL_LOAD = - 0x83, /* single channel only, for channel load collection */ - SCAN_PASSIVE_MAX, - - SCAN_TYPE_MAX -}; - -#define SCAN_MASK 0x80 -#define SCAN_MODE_ACT(_x) (((_x)&SCAN_MASK) == 0) -#define SCAN_MODE_PSV(_x) (((_x)&SCAN_MASK) == SCAN_MASK) -#define SCAN_MODE_VALID(_x) \ - ((SCAN_MODE_ACT(_x) && ((_x) < SCAN_ACTIVE_MAX)) || \ - (SCAN_MODE_PSV(_x) && ((_x) < SCAN_PASSIVE_MAX))) - -/*#define BSS_TABLE_EMPTY(x) ((x).BssNr == 0) */ -#define MAC_ADDR_IS_GROUP(Addr) (((Addr[0]) & 0x01)) -#define MAC_ADDR_HASH(Addr) \ - (Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5]) -#define MAC_ADDR_HASH_INDEX(Addr) (MAC_ADDR_HASH(Addr) & (HASH_TABLE_SIZE - 1)) -#define TID_MAC_HASH(Addr, TID) \ - (TID ^ Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5]) -#define TID_MAC_HASH_INDEX(Addr, TID) \ - (TID_MAC_HASH(Addr, TID) & (HASH_TABLE_SIZE - 1)) - -/* bit definition of the 2-byte pBEACON->Capability field */ -#define CAP_IS_ESS_ON(x) (((x)&0x0001) != 0) -#define CAP_IS_IBSS_ON(x) (((x)&0x0002) != 0) -#define CAP_IS_CF_POLLABLE_ON(x) (((x)&0x0004) != 0) -#define CAP_IS_CF_POLL_REQ_ON(x) (((x)&0x0008) != 0) -#define CAP_IS_PRIVACY_ON(x) (((x)&0x0010) != 0) -#define CAP_IS_SHORT_PREAMBLE_ON(x) (((x)&0x0020) != 0) -#define CAP_IS_PBCC_ON(x) (((x)&0x0040) != 0) -#define CAP_IS_AGILITY_ON(x) (((x)&0x0080) != 0) -#define CAP_IS_SPECTRUM_MGMT(x) (((x)&0x0100) != 0) /* 802.11e d9 */ -#define CAP_IS_QOS(x) (((x)&0x0200) != 0) /* 802.11e d9 */ -#define CAP_IS_SHORT_SLOT(x) (((x)&0x0400) != 0) -#define CAP_IS_APSD(x) (((x)&0x0800) != 0) /* 802.11e d9 */ -#define CAP_IS_IMMED_BA(x) (((x)&0x1000) != 0) /* 802.11e d9 */ -#define CAP_IS_DSSS_OFDM(x) (((x)&0x2000) != 0) -#define CAP_IS_DELAY_BA(x) (((x)&0x4000) != 0) /* 802.11e d9 */ - -#define CAP_GENERATE(ess, ibss, priv, s_pre, s_slot, spectrum) \ - (((ess) ? 0x0001 : 0x0000) | ((ibss) ? 0x0002 : 0x0000) | \ - ((priv) ? 0x0010 : 0x0000) | ((s_pre) ? 0x0020 : 0x0000) | \ - ((s_slot) ? 0x0400 : 0x0000) | ((spectrum) ? 0x0100 : 0x0000)) - -/*#define STA_QOS_CAPABILITY 0 // 1-byte. see 802.11e d9.0 for bit definition */ - -#define ERP_IS_NON_ERP_PRESENT(x) (((x)&0x01) != 0) /* 802.11g */ -#define ERP_IS_USE_PROTECTION(x) (((x)&0x02) != 0) /* 802.11g */ -#define ERP_IS_USE_BARKER_PREAMBLE(x) (((x)&0x04) != 0) /* 802.11g */ - -#define BA_NOTUSE 2 -/*BA Policy subfiled value in ADDBA frame */ -#define IMMED_BA 1 -#define DELAY_BA 0 - -/* BA Initiator subfield in DELBA frame */ -#define ORIGINATOR 1 -#define RECIPIENT 0 - -/* ADDBA Status Code */ -#define ADDBA_RESULTCODE_SUCCESS 0 -#define ADDBA_RESULTCODE_REFUSED 37 -#define ADDBA_RESULTCODE_INVALID_PARAMETERS 38 - -/* DELBA Reason Code */ -#define DELBA_REASONCODE_QSTA_LEAVING 36 -#define DELBA_REASONCODE_END_BA 37 -#define DELBA_REASONCODE_UNKNOWN_BA 38 -#define DELBA_REASONCODE_TIMEOUT 39 - -/* reset all OneSecTx counters */ -#define RESET_ONE_SEC_TX_CNT(__pEntry) \ - do { \ - if (((__pEntry)) != NULL) { \ - (__pEntry)->OneSecTxRetryOkCount = 0; \ - (__pEntry)->OneSecTxFailCount = 0; \ - (__pEntry)->OneSecTxNoRetryOkCount = 0; \ - (__pEntry)->OneSecRxLGICount = 0; \ - (__pEntry)->OneSecRxSGICount = 0; \ - } \ - } while (0) - -/* - 802.11 frame formats -*/ - -typedef struct _TRIGGER_EVENTA { - BOOLEAN bValid; - UCHAR BSSID[6]; - UCHAR RegClass; /* Regulatory Class */ - USHORT Channel; -} TRIGGER_EVENTA, *PTRIGGER_EVENTA; - -/* 20/40 trigger event table */ -/* If one Event A delete or created, or if Event B is detected or not detected, STA should send 2040BSSCoexistence to AP. */ -#define MAX_TRIGGER_EVENT 64 -typedef struct _TRIGGER_EVENT_TAB { - UCHAR EventANo; - TRIGGER_EVENTA EventA[MAX_TRIGGER_EVENT]; - ULONG EventBCountDown; /* Count down counter for Event B. */ -} TRIGGER_EVENT_TAB, *PTRIGGER_EVENT_TAB; - -/* - Extended capabilities information IE( ID = 127 = IE_EXT_CAPABILITY) - -*/ -typedef struct GNU_PACKED _EXT_CAP_INFO_ELEMENT { -#ifdef RT_BIG_ENDIAN - UINT32 interworking : 1; - UINT32 TDLSChSwitchSupport : 1; /* bit30: TDLS Channel Switching */ - UINT32 TDLSPeerPSMSupport : 1; /* bit29: TDLS Peer PSM Support */ - UINT32 UAPSDBufSTASupport : 1; /* bit28: Peer U-APSD Buffer STA Support */ - UINT32 utc_tsf_offset : 1; - UINT32 DMSSupport : 1; - UINT32 ssid_list : 1; - UINT32 channel_usage : 1; - UINT32 timing_measurement : 1; - UINT32 mbssid : 1; - UINT32 ac_sta_cnt : 1; - UINT32 qos_traffic_cap : 1; - UINT32 BssTransitionManmt : 1; - UINT32 tim_bcast : 1; - UINT32 WNMSleepSupport : 1; /*bit 17*/ - UINT32 TFSSupport : 1; /*bit 16*/ - UINT32 geospatial_location : 1; - UINT32 civic_location : 1; - UINT32 collocated_interference_report : 1; - UINT32 proxy_arp : 1; - UINT32 FMSSupport : 1; /*bit 11*/ - UINT32 location_tracking : 1; - UINT32 mcast_diagnostics : 1; - UINT32 diagnostics : 1; - UINT32 event : 1; - UINT32 s_psmp_support : 1; - UINT32 rsv5 : 1; - UINT32 psmp_cap : 1; - UINT32 rsv3 : 1; - UINT32 ExtendChannelSwitch : 1; - UINT32 rsv1 : 1; - UINT32 BssCoexistMgmtSupport : 1; -#else - UINT32 BssCoexistMgmtSupport : 1; - UINT32 rsv1 : 1; - UINT32 ExtendChannelSwitch : 1; - UINT32 rsv3 : 1; - UINT32 psmp_cap : 1; - UINT32 rsv5 : 1; - UINT32 s_psmp_support : 1; - UINT32 event : 1; - UINT32 diagnostics : 1; - UINT32 mcast_diagnostics : 1; - UINT32 location_tracking : 1; - UINT32 FMSSupport : 1; /*bit 11*/ - UINT32 proxy_arp : 1; - UINT32 collocated_interference_report : 1; - UINT32 civic_location : 1; - UINT32 geospatial_location : 1; - UINT32 TFSSupport : 1; /*bit 16*/ - UINT32 WNMSleepSupport : 1; /*bit 17*/ - UINT32 tim_bcast : 1; - UINT32 BssTransitionManmt : 1; - UINT32 qos_traffic_cap : 1; - UINT32 ac_sta_cnt : 1; - UINT32 mbssid : 1; - UINT32 timing_measurement : 1; - UINT32 channel_usage : 1; - UINT32 ssid_list : 1; - UINT32 DMSSupport : 1; - UINT32 utc_tsf_offset : 1; - UINT32 UAPSDBufSTASupport : 1; /* bit28: Peer U-APSD Buffer STA Support */ - UINT32 TDLSPeerPSMSupport : 1; /* bit29: TDLS Peer PSM Support */ - UINT32 TDLSChSwitchSupport : 1; /* bit30: TDLS Channel Switching */ - UINT32 interworking : 1; -#endif /* RT_BIG_ENDIAN */ - -#ifdef RT_BIG_ENDIAN - UINT32 rsv63 : 1; - UINT32 operating_mode_notification : 1; - UINT32 tdls_wider_bw : 1; - UINT32 rsv49 : 12; - UINT32 utf8_ssid : 1; - UINT32 rsv47 : 1; - UINT32 wnm_notification : 1; - UINT32 uapsd_coex : 1; - UINT32 id_location : 1; - UINT32 service_interval_granularity : 3; - UINT32 reject_unadmitted_frame : 1; - UINT32 TDLSChSwitchProhibited : 1; /* bit39: TDLS Channel Switching Prohibited */ - UINT32 TDLSProhibited : 1; /* bit38: TDLS Prohibited */ - UINT32 TDLSSupport : 1; /* bit37: TDLS Support */ - UINT32 msgcf_cap : 1; - UINT32 rsv35 : 1; - UINT32 sspn_inf : 1; - UINT32 ebr : 1; - UINT32 qosmap : 1; -#else - UINT32 qosmap : 1; - UINT32 ebr : 1; - UINT32 sspn_inf : 1; - UINT32 rsv35 : 1; - UINT32 msgcf_cap : 1; - UINT32 TDLSSupport : 1; /* bit37: TDLS Support */ - UINT32 TDLSProhibited : 1; /* bit38: TDLS Prohibited */ - UINT32 TDLSChSwitchProhibited : 1; /* bit39: TDLS Channel Switching Prohibited */ - UINT32 reject_unadmitted_frame : 1; - UINT32 service_interval_granularity : 3; - UINT32 id_location : 1; - UINT32 uapsd_coex : 1; - UINT32 wnm_notification : 1; - UINT32 rsv47 : 1; - UINT32 utf8_ssid : 1; - UINT32 rsv49 : 12; - UINT32 tdls_wider_bw : 1; - UINT32 operating_mode_notification : 1; - UINT32 rsv63 : 1; -#endif /* RT_BIG_ENDIAN */ - -#ifdef RT_BIG_ENDIAN - UINT8 ftm_init : 1; /* bit71: FTM Initiator in 802.11mc D4.0*/ - UINT8 ftm_resp : 1; /* bit70: FTM responder */ - UINT8 rsv69 : 1; - UINT8 rsv68 : 1; - UINT8 rsv67 : 1; - UINT8 rsv66 : 1; - UINT8 rsv65 : 1; - UINT8 rsv64 : 1; -#else - UINT8 rsv64 : 1; - UINT8 rsv65 : 1; - UINT8 rsv66 : 1; - UINT8 rsv67 : 1; - UINT8 rsv68 : 1; - UINT8 rsv69 : 1; - UINT8 ftm_resp : 1; /* bit70: FTM responder */ - UINT8 ftm_init : 1; /* bit71: FTM Initiator in 802.11mc D4.0*/ -#endif /* RT_BIG_ENDIAN */ -#ifdef OCE_FILS_SUPPORT - UINT8 FILSCap : 1; - UINT8 rsv72 : 1; - UINT8 rsv73 : 1; - UINT8 rsv74 : 1; - UINT8 rsv75 : 1; - UINT8 rsv76 : 1; - UINT8 twt_requester_support : 1; - UINT8 twt_responder_support : 1; - UINT8 rsv_79 : 1; -#endif /* OCE_FILS_SUPPORT */ - -#ifdef RT_BIG_ENDIAN - UINT8 rsv87 : 1; - UINT8 rsv86 : 1; - UINT8 rsv85 : 1; - UINT8 rsv84 : 1; - UINT8 rsv83 : 1; - UINT8 sae_pwd_id_used_exclusively : 1; - UINT8 sae_pwd_id_in_use : 1; - UINT8 rsv80 : 1; -#else - UINT8 rsv80 : 1; - UINT8 sae_pwd_id_in_use : 1; - UINT8 sae_pwd_id_used_exclusively : 1; - UINT8 rsv83 : 1; - UINT8 rsv84 : 1; - UINT8 rsv85 : 1; - UINT8 rsv86 : 1; - UINT8 rsv87 : 1; -#endif /* RT_BIG_ENDIAN */ -} EXT_CAP_INFO_ELEMENT, *PEXT_CAP_INFO_ELEMENT; - -#define EXT_CAP_MIN_SAFE_LENGTH 8 - -/* 802.11n 7.3.2.61 */ -typedef struct GNU_PACKED _BSS_2040_COEXIST_ELEMENT { - UCHAR ElementID; /* ID = IE_2040_BSS_COEXIST = 72 */ - UCHAR Len; - BSS_2040_COEXIST_IE BssCoexistIe; -} BSS_2040_COEXIST_ELEMENT, *PBSS_2040_COEXIST_ELEMENT; - -/*802.11n 7.3.2.59 */ -typedef struct GNU_PACKED _BSS_2040_INTOLERANT_CH_REPORT { - UCHAR ElementID; /* ID = IE_2040_BSS_INTOLERANT_REPORT = 73 */ - UCHAR Len; - UCHAR RegulatoryClass; - UCHAR ChList[0]; -} BSS_2040_INTOLERANT_CH_REPORT, *PBSS_2040_INTOLERANT_CH_REPORT; - -/* The structure for channel switch annoucement IE. This is in 802.11n D3.03 */ -typedef struct GNU_PACKED _CHA_SWITCH_ANNOUNCE_IE { - UCHAR SwitchMode; /*channel switch mode */ - UCHAR NewChannel; - UCHAR SwitchCount; -} CHA_SWITCH_ANNOUNCE_IE, *PCHA_SWITCH_ANNOUNCE_IE; - -/* The structure for channel switch annoucement IE. This is in 802.11n D3.03 */ -typedef struct GNU_PACKED _SEC_CHA_OFFSET_IE { - UCHAR SecondaryChannelOffset; /* 1: Secondary above, 3: Secondary below, 0: no Secondary */ -} SEC_CHA_OFFSET_IE, *PSEC_CHA_OFFSET_IE; - -/* 802.11mc D4.3 8.4.2.20 */ -typedef struct GNU_PACKED _MEASUREMENT_REQ { - UCHAR ID; - UCHAR Length; - UCHAR Token; - UCHAR RequestMode; - UCHAR Type; -} MEASUREMENT_REQ; - -/* 802.11mc D4.3 8.4.2.21 */ -typedef struct GNU_PACKED _MEASUREMENT_REPORT { - UCHAR ID; - UCHAR Length; - UCHAR Token; - UCHAR ReportMode; - UCHAR Type; -} MEASUREMENT_REPORT; - -/* 802.11mc D4.3 8.4.2.166 */ -/* Length: 9 bytes */ -typedef struct GNU_PACKED _FTM_PARAMETER { - /* byte 0 */ - UCHAR status : 2; - UCHAR value : 5; - UCHAR rsv_1 : 1; - /* byte 1 */ - UCHAR num_burst_exponent : 4; - UCHAR burst_duration : 4; - /* byte 2 */ - UCHAR min_delta_ftm; - /* byte 3~4 */ - USHORT partial_tsf_timer; - /* byte 5 */ - UCHAR tsf_no_preference : 1; - UCHAR asap_capable : 1; - UCHAR asap : 1; - UCHAR ftms_per_burst : 5; - /* byte 6 */ - UCHAR rsv_2 : 2; - UCHAR ftm_format_and_bw : 6; - /* byte 7~8 */ - USHORT burst_period; /* unit: 100 ms */ -} FTM_PARAMETER, *PFTM_PARAMETER; - -#ifdef FTM_SUPPORT -/* 802.11mc D4.3 8.4.2.166 */ -typedef struct GNU_PACKED _FTM_PARM_IE { - UCHAR ID; - UCHAR Length; - FTM_PARAMETER p; -} FTM_PARM_IE, *PFTM_PARM_IE; -#endif /* FTM_SUPPORT */ - -/* This structure is extracted from struct RT_HT_CAPABILITY and RT_VHT_CAP */ -typedef struct _RT_PHY_INFO { - BOOLEAN bHtEnable; /* If we should use ht rate. */ - BOOLEAN bPreNHt; /* If we should use ht rate. */ - /*Substract from HT Capability IE */ - UCHAR MCSSet[16]; -#ifdef DOT11_VHT_AC - BOOLEAN bVhtEnable; - UCHAR vht_bw; - VHT_MCS_SET vht_mcs_set; -#endif /* DOT11_VHT_AC */ -} RT_PHY_INFO; - -#ifdef DOT11_VHT_AC -typedef struct _RT_VHT_CAP { - UINT32 vht_bw : 2; - UINT32 vht_txstbc : 1; - UINT32 vht_rxstbc : 3; - UINT32 sgi_80m : 1; - UINT32 vht_htc : 1; - - UINT32 vht_mcs_ss1 : 2; - UINT32 vht_mcs_ss2 : 2; - UINT32 vht_rx_rate : 2; - UINT32 vht_tx_rate : 2; - - UINT32 rsv : 16; -} RT_VHT_CAP; -#endif /* DOT11_VHT_AC */ - -/* - This structure substracts ralink supports from all 802.11n-related features. - Features not listed here but contained in 802.11n spec are not supported in rt2860 -*/ -typedef struct { -#ifdef RT_BIG_ENDIAN - USHORT rsv : 6; - USHORT AmsduSize : 1; /* Max receiving A-MSDU size */ - USHORT AmsduEnable : 1; /* Enable to transmit A-MSDU. Suggest disable. We should use A-MPDU to gain best benifit of 802.11n */ - USHORT RxSTBC : 2; - USHORT TxSTBC : 1; - USHORT ShortGIfor40 : 1; /*for40MHz */ - USHORT ShortGIfor20 : 1; - USHORT GF : 1; /*green field */ - USHORT MimoPs : 2; /*mimo power safe MMPS_ */ -#else - USHORT MimoPs : 2; /*mimo power safe MMPS_ */ - USHORT GF : 1; /*green field */ - USHORT ShortGIfor20 : 1; - USHORT ShortGIfor40 : 1; /*for 40MHz */ - USHORT TxSTBC : 1; /* 0:not supported, 1:if supported */ - USHORT RxSTBC : 2; /* 2 bits */ - USHORT AmsduEnable : 1; /* Enable to transmit A-MSDU. Suggest disable. We should use A-MPDU to gain best benifit of 802.11n */ - USHORT AmsduSize : 1; /* Max receiving A-MSDU size */ - USHORT rsv : 6; -#endif - - /*Substract from Addiont HT INFO IE */ -#ifdef RT_BIG_ENDIAN - UCHAR ExtChanOffset : 2; /* Please not the difference with following UCHAR NewExtChannelOffset; from 802.11n */ - UCHAR MpduDensity : 3; - UCHAR MaxRAmpduFactor : 2; -#else - UCHAR MaxRAmpduFactor : 2; - UCHAR MpduDensity : 3; - UCHAR ExtChanOffset : 2; /* Please not the difference with following UCHAR NewExtChannelOffset; from 802.11n */ -#endif - -#ifdef RT_BIG_ENDIAN - USHORT rsv2 : 11; - USHORT OBSS_NonHTExist : 1; - USHORT rsv3 : 1; - USHORT NonGfPresent : 1; - USHORT OperaionMode : 2; -#else - USHORT OperaionMode : 2; - USHORT NonGfPresent : 1; - USHORT rsv3 : 1; - USHORT OBSS_NonHTExist : 1; - USHORT rsv2 : 11; -#endif - - /* New Extension Channel Offset IE */ - UCHAR NewExtChannelOffset; - /* Extension Capability IE = 127 */ - UCHAR BSSCoexist2040; -} RT_HT_CAPABILITY, *PRT_HT_CAPABILITY; - -typedef struct GNU_PACKED _NEW_EXT_CHAN_IE { - UCHAR NewExtChanOffset; -} NEW_EXT_CHAN_IE, *PNEW_EXT_CHAN_IE; - -#ifdef DOT11U_INTERWORKING_IE_SUPPORT -typedef struct GNU_PACKED _INTERWORKING_IE { -#ifdef RT_BIG_ENDIAN - UCHAR UESA : 1; - UCHAR ESR : 1; - UCHAR ASRA : 1; - UCHAR Internet : 1; - UCHAR AccessNwType : 4; -#else - UCHAR AccessNwType : 4; - UCHAR Internet : 1; - UCHAR ASRA : 1; - UCHAR ESR : 1; - UCHAR UESA : 1; -#endif -} INTERWORKING_IE, *PINTERWORKING_IE; -#endif /* DOT11U_INTERWORKING_IE_SUPPORT */ - -typedef struct GNU_PACKED _FRAME_802_11 { - HEADER_802_11 Hdr; - UCHAR Octet[1]; -} FRAME_802_11, *PFRAME_802_11; - -/* QoSNull embedding of management action. When HT Control MA field set to 1. */ -typedef struct GNU_PACKED _MA_BODY { - UCHAR Category; - UCHAR Action; - UCHAR Octet[1]; -} MA_BODY, *PMA_BODY; - -typedef struct GNU_PACKED _HEADER_802_3 { - UCHAR DAAddr1[MAC_ADDR_LEN]; - UCHAR SAAddr2[MAC_ADDR_LEN]; - UCHAR Octet[2]; -} HEADER_802_3, *PHEADER_802_3; - -/* Block ACK related format */ -/* 2-byte BA Parameter field in DELBA frames to terminate an already set up bA */ -typedef struct GNU_PACKED _DELBA_PARM { -#ifdef RT_BIG_ENDIAN - USHORT TID : 4; /* value of TC os TS */ - USHORT Initiator : 1; /* 1: originator 0:recipient */ - USHORT Rsv : 11; /* always set to 0 */ -#else - USHORT Rsv : 11; /* always set to 0 */ - USHORT Initiator : 1; /* 1: originator 0:recipient */ - USHORT TID : 4; /* value of TC os TS */ -#endif /* RT_BIG_ENDIAN */ -} DELBA_PARM, *PDELBA_PARM; - -/* 2-byte BA Parameter Set field in ADDBA frames to signal parm for setting up a BA */ -typedef struct GNU_PACKED _BA_PARM { -#ifdef RT_BIG_ENDIAN - USHORT BufSize : 10; /* number of buffe of size 2304 octetsr */ - USHORT TID : 4; /* value of TC os TS */ - USHORT BAPolicy : 1; /* 1: immediately BA 0:delayed BA */ - USHORT AMSDUSupported : 1; /* 0: not permitted 1: permitted */ -#else - USHORT AMSDUSupported : 1; /* 0: not permitted 1: permitted */ - USHORT BAPolicy : 1; /* 1: immediately BA 0:delayed BA */ - USHORT TID : 4; /* value of TC os TS */ - USHORT BufSize : 10; /* number of buffe of size 2304 octetsr */ -#endif /* RT_BIG_ENDIAN */ -} BA_PARM, *PBA_PARM; - -/* 2-byte BA Starting Seq CONTROL field */ -typedef union GNU_PACKED _BASEQ_CONTROL { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - USHORT StartSeq : 12; /* sequence number of the 1st MSDU for which this BAR is sent */ - USHORT FragNum : 4; /* always set to 0 */ -#else - USHORT FragNum : 4; /* always set to 0 */ - USHORT StartSeq : 12; /* sequence number of the 1st MSDU for which this BAR is sent */ -#endif /* RT_BIG_ENDIAN */ - } field; - USHORT word; -} BASEQ_CONTROL, *PBASEQ_CONTROL; - -/*BAControl and BARControl are the same */ -/* 2-byte BA CONTROL field in BA frame */ -typedef struct GNU_PACKED _BA_CONTROL { -#ifdef RT_BIG_ENDIAN - USHORT TID : 4; - USHORT Rsv : 9; - USHORT Compressed : 1; - USHORT MTID : 1; /*EWC V1.24 */ - USHORT ACKPolicy : 1; /* only related to N-Delayed BA. But not support in RT2860b. 0:NormalACK 1:No ACK */ -#else - USHORT ACKPolicy : 1; /* only related to N-Delayed BA. But not support in RT2860b. 0:NormalACK 1:No ACK */ - USHORT MTID : 1; /*EWC V1.24 */ - USHORT Compressed : 1; - USHORT Rsv : 9; - USHORT TID : 4; -#endif /* RT_BIG_ENDIAN */ -} BA_CONTROL, *PBA_CONTROL; - -/* 2-byte BAR CONTROL field in BAR frame */ -typedef struct GNU_PACKED _BAR_CONTROL { -#ifdef RT_BIG_ENDIAN - USHORT TID : 4; - USHORT Rsv1 : 9; - USHORT Compressed : 1; - USHORT MTID : 1; /*if this bit1, use FRAME_MTBA_REQ, if 0, use FRAME_BA_REQ */ - USHORT ACKPolicy : 1; -#else - USHORT ACKPolicy : 1; /* 0:normal ack, 1:no ack. */ - USHORT MTID : 1; /*if this bit1, use FRAME_MTBA_REQ, if 0, use FRAME_BA_REQ */ - USHORT Compressed : 1; - USHORT Rsv1 : 9; - USHORT TID : 4; -#endif /* !RT_BIG_ENDIAN */ -} BAR_CONTROL, *PBAR_CONTROL; - -/* BARControl in MTBAR frame */ -typedef struct GNU_PACKED _MTBAR_CONTROL { -#ifdef RT_BIG_ENDIAN - USHORT NumTID : 4; - USHORT Rsv1 : 9; - USHORT Compressed : 1; - USHORT MTID : 1; - USHORT ACKPolicy : 1; -#else - USHORT ACKPolicy : 1; - USHORT MTID : 1; - USHORT Compressed : 1; - USHORT Rsv1 : 9; - USHORT NumTID : 4; -#endif /* RT_BIG_ENDIAN */ -} MTBAR_CONTROL, *PMTBAR_CONTROL; - -typedef struct GNU_PACKED _PER_TID_INFO { -#ifdef RT_BIG_ENDIAN - USHORT TID : 4; - USHORT Rsv1 : 12; -#else - USHORT Rsv1 : 12; - USHORT TID : 4; -#endif /* RT_BIG_ENDIAN */ -} PER_TID_INFO, *PPER_TID_INFO; - -typedef struct { - PER_TID_INFO PerTID; - BASEQ_CONTROL BAStartingSeq; -} EACH_TID, *PEACH_TID; - -/* BAREQ AND MTBAREQ have the same subtype BAR, 802.11n BAR use compressed bitmap. */ -typedef struct GNU_PACKED _FRAME_BA_REQ { - FRAME_CONTROL FC; - USHORT Duration; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - BAR_CONTROL BARControl; - BASEQ_CONTROL BAStartingSeq; -} FRAME_BA_REQ, *PFRAME_BA_REQ; - -typedef struct GNU_PACKED _FRAME_MTBA_REQ { - FRAME_CONTROL FC; - USHORT Duration; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - MTBAR_CONTROL MTBARControl; - PER_TID_INFO PerTIDInfo; - BASEQ_CONTROL BAStartingSeq; -} FRAME_MTBA_REQ, *PFRAME_MTBA_REQ; - -/* Compressed format is mandantory in HT STA */ -typedef struct GNU_PACKED _FRAME_MTBA { - FRAME_CONTROL FC; - USHORT Duration; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - BA_CONTROL BAControl; - BASEQ_CONTROL BAStartingSeq; - UCHAR BitMap[8]; -} FRAME_MTBA, *PFRAME_MTBA; - -typedef struct GNU_PACKED _FRAME_SMPS_ACTION { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; - UCHAR smps; /* 7.3.1.22 */ -} FRAME_SMPS_ACTION; - -typedef struct GNU_PACKED _FRAME_ACTION_HDR { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; -} FRAME_ACTION_HDR, *PFRAME_ACTION_HDR; - -/*Action Frame */ -/*Action Frame Category:Spectrum, Action:Channel Switch. 7.3.2.20 */ -typedef struct GNU_PACKED _CHAN_SWITCH_ANNOUNCE { - UCHAR ElementID; /* ID = IE_CHANNEL_SWITCH_ANNOUNCEMENT = 37 */ - UCHAR Len; - CHA_SWITCH_ANNOUNCE_IE CSAnnounceIe; -} CHAN_SWITCH_ANNOUNCE, *PCHAN_SWITCH_ANNOUNCE; - -/*802.11n : 7.3.2.20a */ -typedef struct GNU_PACKED _SECOND_CHAN_OFFSET { - UCHAR ElementID; /* ID = IE_SECONDARY_CH_OFFSET = 62 */ - UCHAR Len; - SEC_CHA_OFFSET_IE SecChOffsetIe; -} SECOND_CHAN_OFFSET, *PSECOND_CHAN_OFFSET; - -typedef struct GNU_PACKED _FRAME_SPETRUM_CS { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; - CHAN_SWITCH_ANNOUNCE CSAnnounce; - SECOND_CHAN_OFFSET SecondChannel; -} FRAME_SPETRUM_CS, *PFRAME_SPETRUM_CS; - -typedef struct GNU_PACKED _FRAME_ADDBA_REQ { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; - UCHAR Token; /* 1 */ - BA_PARM BaParm; /* 2 - 10 */ - USHORT TimeOutValue; /* 0 - 0 */ - BASEQ_CONTROL BaStartSeq; /* 0-0 */ -} FRAME_ADDBA_REQ, *PFRAME_ADDBA_REQ; - -typedef struct GNU_PACKED _FRAME_ADDBA_RSP { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; - UCHAR Token; - USHORT StatusCode; - BA_PARM BaParm; /*0 - 2 */ - USHORT TimeOutValue; -} FRAME_ADDBA_RSP, *PFRAME_ADDBA_RSP; - -typedef struct GNU_PACKED _FRAME_DELBA_REQ { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; - DELBA_PARM DelbaParm; - USHORT ReasonCode; -} FRAME_DELBA_REQ, *PFRAME_DELBA_REQ; - -/*7.2.1.7 */ -typedef struct GNU_PACKED _FRAME_BAR { - FRAME_CONTROL FC; - USHORT Duration; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - BAR_CONTROL BarControl; - BASEQ_CONTROL StartingSeq; -} FRAME_BAR, *PFRAME_BAR; - -/*7.2.1.7 */ -typedef struct GNU_PACKED _FRAME_BA { - FRAME_CONTROL FC; - USHORT Duration; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - BAR_CONTROL BarControl; - BASEQ_CONTROL StartingSeq; - UCHAR bitmask[8]; -} FRAME_BA, *PFRAME_BA; - -/* Radio Measuement Request Frame Format */ -typedef struct GNU_PACKED _FRAME_RM_REQ_ACTION { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; - UCHAR Token; - USHORT Repetition; - UCHAR data[0]; -} FRAME_RM_REQ_ACTION, *PFRAME_RM_REQ_ACTION; - -typedef struct GNU_PACKED _HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE { - UCHAR ID; - UCHAR Length; - UCHAR ChannelSwitchMode; - UCHAR NewRegClass; - UCHAR NewChannelNum; - UCHAR ChannelSwitchCount; -} HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE, - *PHT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE; - -#ifdef CONFIG_RCSA_SUPPORT -typedef struct _CSA_IE_INFO { - UCHAR wcid; - CH_SW_ANN_INFO ChSwAnnIE; - SEC_CHA_OFFSET_IE SChOffIE; - EXT_CH_SW_ANN_INFO ExtChSwAnnIE; - WIDE_BW_CH_SWITCH_ELEMENT wb_info; -} CSA_IE_INFO, *PCSA_IE_INFO; -#endif - -/* */ -/* _Limit must be the 2**n - 1 */ -/* _SEQ1 , _SEQ2 must be within 0 ~ _Limit */ -/* */ -#define SEQ_STEPONE(_SEQ1, _SEQ2, _Limit) ((_SEQ1 == ((_SEQ2 + 1) & _Limit))) -#define SEQ_SMALLER(_SEQ1, _SEQ2, _Limit) \ - (((_SEQ1 - _SEQ2) & ((_Limit + 1) >> 1))) -#define SEQ_LARGER(_SEQ1, _SEQ2, _Limit) \ - ((_SEQ1 != _SEQ2) && !(((_SEQ1 - _SEQ2) & ((_Limit + 1) >> 1)))) -#define SEQ_WITHIN_WIN(_SEQ1, _SEQ2, _WIN, _Limit) \ - (SEQ_LARGER(_SEQ1, _SEQ2, _Limit) && \ - SEQ_SMALLER(_SEQ1, ((_SEQ2 + _WIN + 1) & _Limit), _Limit)) - -/* - Contention-free parameter (without ID and Length) -*/ -typedef struct GNU_PACKED _CF_PARM { - BOOLEAN bValid; /* 1: variable contains valid value */ - UCHAR CfpCount; - UCHAR CfpPeriod; - USHORT CfpMaxDuration; - USHORT CfpDurRemaining; -} CF_PARM, *PCF_PARM; - -typedef struct _CIPHER_SUITE { - NDIS_802_11_ENCRYPTION_STATUS - PairCipher; /* Unicast cipher 1, this one has more secured cipher suite */ - NDIS_802_11_ENCRYPTION_STATUS - PairCipherAux; /* Unicast cipher 2 if AP announce two unicast cipher suite */ - NDIS_802_11_ENCRYPTION_STATUS GroupCipher; /* Group cipher */ - USHORT RsnCapability; /* RSN capability from beacon */ - BOOLEAN bMixMode; /* Indicate Pair & Group cipher might be different */ -} CIPHER_SUITE, *PCIPHER_SUITE; - -struct _vendor_ie_cap { - ULONG ra_cap; - ULONG mtk_cap; - ULONG brcm_cap; - BOOLEAN ldpc; - BOOLEAN sgi; - BOOLEAN is_rlt; - BOOLEAN is_mtk; - BOOLEAN is_brcm_etxbf_2G; -#ifdef CONFIG_MAP_SUPPORT - BOOLEAN map_vendor_ie_found; - struct map_vendor_ie map_info; -#endif -}; - -/* EDCA configuration from AP's BEACON/ProbeRsp */ -#define WMM_AC_BK 0 -#define WMM_AC_BE 1 -#define WMM_AC_VI 2 -#define WMM_AC_VO 3 -typedef struct _EDCA_PARM { - BOOLEAN bValid; /* 1: variable contains valid value */ - BOOLEAN bAdd; /* 1: variable contains valid value */ - BOOLEAN bQAck; - BOOLEAN bQueueRequest; - BOOLEAN bTxopRequest; - BOOLEAN bAPSDCapable; - /* BOOLEAN bMoreDataAck; */ - UCHAR EdcaUpdateCount; - UCHAR Aifsn[WMM_NUM_OF_AC]; /* 0:AC_BK, 1:AC_BE, 2:AC_VI, 3:AC_VO */ - UCHAR Cwmin[WMM_NUM_OF_AC]; - UCHAR Cwmax[WMM_NUM_OF_AC]; - USHORT Txop[WMM_NUM_OF_AC]; /* in unit of 32-us */ - BOOLEAN bACM[WMM_NUM_OF_AC]; /* 1: Admission Control of AC_BK is mandattory */ - UCHAR BandIdx; - UCHAR WmmSet; - UCHAR RefCnt; -} EDCA_PARM, *PEDCA_PARM; - -typedef struct _WMM_CFG { - struct wifi_dev *wdev; - struct _EDCA_PARM EdcaParm; -} WMM_CFG; - -struct pbc_ctrl { - struct wifi_dev *wdev; - struct _MAC_TABLE_ENTRY *entry; - UCHAR type; -}; - -struct rts_thld { - struct wifi_dev *wdev; - UCHAR pkt_thld; - UINT32 len_thld; - UCHAR retry_limit; -}; - -enum _ac_type { - AC_BK = (1 << WMM_AC_BK), - AC_BE = (1 << WMM_AC_BE), - AC_VI = (1 << WMM_AC_VI), - AC_VO = (1 << WMM_AC_VO), - AC_MSK = (AC_BK | AC_BE | AC_VI | AC_VO) -}; -#ifndef WAPP_SUPPORT -/* QBSS LOAD information from QAP's BEACON/ProbeRsp */ -typedef struct { - BOOLEAN bValid; /* 1: variable contains valid value */ - USHORT StaNum; - UCHAR ChannelUtilization; - USHORT RemainingAdmissionControl; /* in unit of 32-us */ -} QBSS_LOAD_PARM, *PQBSS_LOAD_PARM; -#endif - -/* QBSS Info field in QSTA's assoc req */ -typedef struct GNU_PACKED _QBSS_STA_INFO_PARM { -#ifdef RT_BIG_ENDIAN - UCHAR Rsv2 : 1; - UCHAR MaxSPLength : 2; - UCHAR Rsv1 : 1; - UCHAR UAPSD_AC_BE : 1; - UCHAR UAPSD_AC_BK : 1; - UCHAR UAPSD_AC_VI : 1; - UCHAR UAPSD_AC_VO : 1; -#else - UCHAR UAPSD_AC_VO : 1; - UCHAR UAPSD_AC_VI : 1; - UCHAR UAPSD_AC_BK : 1; - UCHAR UAPSD_AC_BE : 1; - UCHAR Rsv1 : 1; - UCHAR MaxSPLength : 2; - UCHAR Rsv2 : 1; -#endif /* RT_BIG_ENDIAN */ -} QBSS_STA_INFO_PARM, *PQBSS_STA_INFO_PARM; - -typedef struct { - QBSS_STA_INFO_PARM QosInfo; - UCHAR Rsv; - UCHAR Q_AC_BE[4]; - UCHAR Q_AC_BK[4]; - UCHAR Q_AC_VI[4]; - UCHAR Q_AC_VO[4]; -} QBSS_STA_EDCA_PARM, *PQBSS_STA_EDCA_PARM; - -/* QBSS Info field in QAP's Beacon/ProbeRsp */ -typedef struct GNU_PACKED _QBSS_AP_INFO_PARM { -#ifdef RT_BIG_ENDIAN - UCHAR UAPSD : 1; - UCHAR Rsv : 3; - UCHAR ParamSetCount : 4; -#else - UCHAR ParamSetCount : 4; - UCHAR Rsv : 3; - UCHAR UAPSD : 1; -#endif /* RT_BIG_ENDIAN */ -} QBSS_AP_INFO_PARM, *PQBSS_AP_INFO_PARM; - -/* QOS Capability reported in QAP's BEACON/ProbeRsp */ -/* QOS Capability sent out in QSTA's AssociateReq/ReAssociateReq */ -typedef struct { - BOOLEAN bValid; /* 1: variable contains valid value */ - BOOLEAN bQAck; - BOOLEAN bQueueRequest; - BOOLEAN bTxopRequest; - /* BOOLEAN bMoreDataAck; */ - UCHAR EdcaUpdateCount; -} QOS_CAPABILITY_PARM, *PQOS_CAPABILITY_PARM; - -typedef struct _BSS_ENTRY { - UCHAR MacAddr[MAC_ADDR_LEN]; - UCHAR Bssid[MAC_ADDR_LEN]; - UCHAR Channel; - UCHAR CentralChannel; /*Store the wide-band central channel for 40MHz. .used in 40MHz AP. Or this is the same as Channel. */ - ULONG ClientStatusFlags; - UCHAR BssType; - USHORT AtimWin; - USHORT BeaconPeriod; - - UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR SupRateLen; - UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR ExtRateLen; - UCHAR Erp; - HT_CAPABILITY_IE HtCapability; - UCHAR HtCapabilityLen; - ADD_HT_INFO_IE AddHtInfo; /* AP might use this additional ht info IE */ - UCHAR AddHtInfoLen; - EXT_CAP_INFO_ELEMENT - ExtCapInfo; /* this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. */ - UCHAR NewExtChanOffset; - CHAR Rssi; - -#ifdef CFG80211_SCAN_SIGNAL_AVG - SHORT AvgRssiX8; - CHAR AvgRssi; -#endif /* CFG80211_SCAN_SIGNAL_AVG */ - -#ifdef DOT11_VHT_AC - UCHAR vht_cap_len; - UCHAR vht_op_len; - VHT_CAP_IE vht_cap_ie; - VHT_OP_IE vht_op_ie; -#endif /* DOT11_VHT_AC */ - - CHAR MinSNR; - UCHAR Privacy; /* Indicate security function ON/OFF. Don't mess up with auth mode. */ - UCHAR Hidden; - - BOOLEAN FromBcnReport; /* source from beacon report */ - USHORT DtimPeriod; - USHORT CapabilityInfo; - - USHORT CfpCount; - USHORT CfpPeriod; - USHORT CfpMaxDuration; - USHORT CfpDurRemaining; - UCHAR SsidLen; - CHAR Ssid[MAX_LEN_OF_SSID]; - - UCHAR SameRxTimeCount; - ULONG LastBeaconRxTimeA; /* OS's timestamp */ - ULONG LastBeaconRxTime; /* OS's timestamp */ - - BOOLEAN bSES; - - UINT32 AKMMap; - UINT32 PairwiseCipher; /* Pairwise Key */ - UINT32 GroupCipher; /* Group Key */ - USHORT RsnCapability; /* RSN capability from beacon */ - - /* New for microsoft WPA support */ - NDIS_802_11_FIXED_IEs FixIEs; - NDIS_802_11_AUTHENTICATION_MODE - AuthModeAux; /* Addition mode for WPA2 / WPA capable AP */ - NDIS_802_11_AUTHENTICATION_MODE AuthMode; - NDIS_802_11_WEP_STATUS - WepStatus; /* Unicast Encryption Algorithm extract from VAR_IE */ - USHORT VarIELen; /* Length of next VIE include EID & Length */ - UCHAR VarIEs[MAX_VIE_LEN]; - USHORT VarIeFromProbeRspLen; - UCHAR *pVarIeFromProbRsp; -#ifdef DOT11W_PMF_SUPPORT - BOOLEAN IsSupportSHA256KeyDerivation; -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef DOT11_SAE_SUPPORT - UCHAR rsnxe_content[MAX_LEN_OF_RSNXEIE]; - UCHAR rsnxe_len; - BOOLEAN use_h2e_connect; -#endif - - /* CCX Ckip information */ - UCHAR CkipFlag; - - /* CCX 2 TSF */ - UCHAR PTSF[4]; /* Parent TSF */ - UCHAR TTSF[8]; /* Target TSF */ - - /* 802.11e d9, and WMM */ - EDCA_PARM EdcaParm; - QOS_CAPABILITY_PARM QosCapability; - QBSS_LOAD_PARM QbssLoad; - -#ifdef WSC_INCLUDED - UCHAR WpsAP; /* 0x00: not support WPS, 0x01: support normal WPS, 0x02: support Ralink auto WPS, 0x04: support WAC AP */ - USHORT WscDPIDFromWpsAP; -#endif /* WSC_INCLUDED */ - -#if defined(DOT11R_FT_SUPPORT) || defined(DOT11K_RRM_SUPPORT) - BOOLEAN bHasMDIE; - FT_MDIE FT_MDIE; -#endif /* DOT11R_FT_SUPPORT || DOT11K_RRM_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT - UINT8 RegulatoryClass; - UINT8 CondensedPhyType; - UINT8 RSNI; -#endif /* DOT11K_RRM_SUPPORT */ -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - ULONG LastBeaconRxTimeT; - UCHAR Snr[4]; - CHAR rssi[4]; - UCHAR vendorOUI0[3]; - UCHAR vendorOUI1[3]; -#endif -#ifdef CONFIG_OWE_SUPPORT - /* it can find a pairing OWE bss, - * hide this OPEN bss, - * skip to show it in scan result and skip to connect to it. - */ - BOOLEAN hide_owe_bss; - BOOLEAN bhas_owe_trans_ie; - - UCHAR owe_trans_ie[MAX_VIE_LEN]; - USHORT owe_trans_ie_len; - -#endif /*CONFIG_OWE_SUPPORT*/ -#ifdef CONFIG_MAP_SUPPORT - BOOLEAN map_vendor_ie_found; - struct map_vendor_ie map_info; - INT32 rssi_sum; - INT32 avg_rssi; - INT32 rx_cnt; -#endif -} BSS_ENTRY; - -#ifdef NEIGHBORING_AP_STAT -#define OID_CUST_SCAN_DONE_EVENT 0x2001 -#define OID_CUST_SCAN_REPORT_GET 0x2002 -#define MAX_RPI_CHANNEL_CNT 38 /*for 5g/2g band*/ -#define MAX_COUNT_OF_BSS_ENTRIES 128 -#define SCAN_RESULT_2G 0 -#define SCAN_RESULT_5G 1 -#define COUNT_2G_5G 2 -/* Each customer scan result item */ -typedef struct { - CHAR ssid[MAX_LEN_OF_SSID]; - UCHAR macAddr[MAC_ADDR_LEN]; - SHORT noise; - USHORT beaconPeriod; - USHORT dtimPeriod; - UCHAR channel; - UCHAR basicRate[MAX_LENGTH_OF_SUPPORT_RATES]; - UCHAR suppoRate[MAX_LENGTH_OF_SUPPORT_RATES]; - UINT32 basicRateLen; - UINT32 suppRateLen; -} SCAN_RPT_ITEM; -/* Each channel RPI histogram */ -typedef struct { - UCHAR channel; - INT32 hist[11]; - INT32 NF; -} SCAN_RPI_HIST; -/* All customer scan result entry*/ -typedef struct { - UINT32 ctr_cr[DBDC_BAND_NUM]; /* save ctrl cr original value */ - SCAN_RPT_ITEM items[MAX_LEN_OF_BSS_TABLE]; - UCHAR rpi_cnt; /* available rpi channel count */ - SCAN_RPI_HIST rpi[MAX_RPI_CHANNEL_CNT]; - UINT32 item_ctr; -} CUSTOM_SCAN_RESULT; -#endif - -typedef struct { - UINT BssNr; - UCHAR BssOverlapNr; - BSS_ENTRY BssEntry[MAX_LEN_OF_BSS_TABLE]; -#ifdef NEIGHBORING_AP_STAT - CUSTOM_SCAN_RESULT ScanResult[COUNT_2G_5G]; - UINT8 Ipi; /*1:set ipi config, 0: set RPI config*/ - ; -#endif -} BSS_TABLE, *PBSS_TABLE; - -struct raw_rssi_info { - CHAR raw_rssi[4]; -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - UCHAR raw_Snr[4]; -#endif - UCHAR raw_snr; - UCHAR Channel; -}; - -typedef struct _MLME_QUEUE_ELEM { - UCHAR Msg[MAX_MGMT_PKT_LEN]; /* move here to fix alignment issue for ARM CPU */ - ULONG Machine; - ULONG MsgType; - ULONG MsgLen; - LARGE_INTEGER TimeStamp; - struct raw_rssi_info rssi_info; -#if defined(CUSTOMER_DCC_FEATURE) || defined(NEIGHBORING_AP_STAT) - UCHAR Snr[4]; -#endif - UCHAR Signal; - UCHAR Channel; - UCHAR Wcid; - BOOLEAN Occupied; - UCHAR OpMode; - ULONG Priv; - UCHAR RxPhyMode; - struct wifi_dev *wdev; -} MLME_QUEUE_ELEM, *PMLME_QUEUE_ELEM; - -typedef struct _MLME_QUEUE { - ULONG Num; - ULONG Head; - ULONG Tail; - ULONG MaxLen; - NDIS_SPIN_LOCK Lock; -#ifdef MLME_MULTI_QUEUE_SUPPORT - UCHAR Ration; -#endif - MLME_QUEUE_ELEM Entry[MAX_LEN_OF_MLME_QUEUE]; -} MLME_QUEUE, *PMLME_QUEUE; - -#ifdef MLME_MULTI_QUEUE_SUPPORT -/*Mlme High priority queue */ -typedef struct _MLME_HP_QUEUE { - ULONG Num; - ULONG Head; - ULONG Tail; - ULONG MaxLen; - NDIS_SPIN_LOCK Lock; - UCHAR Ration; - MLME_QUEUE_ELEM Entry[MAX_LEN_OF_MLME_HP_QUEUE]; -} MLME_HP_QUEUE, *PMLME_HP_QUEUE; - -/*Mlme Low priority queue */ -typedef struct _MLME_LP_QUEUE { - ULONG Num; - ULONG Head; - ULONG Tail; - ULONG MaxLen; - NDIS_SPIN_LOCK Lock; - UCHAR Ration; - MLME_QUEUE_ELEM Entry[MAX_LEN_OF_MLME_LP_QUEUE]; -} MLME_LP_QUEUE, *PMLME_LP_QUEUE; -#endif /*MLME_MULTI_QUEUE_SUPPORT*/ - -typedef VOID (*STATE_MACHINE_FUNC)(VOID *pAd, MLME_QUEUE_ELEM *Elem); - -typedef struct _STATE_MACHINE { - ULONG Base; - ULONG NrState; - ULONG NrMsg; - ULONG CurrState; - STATE_MACHINE_FUNC *TransFunc; -} STATE_MACHINE, *PSTATE_MACHINE; - -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -typedef VOID (*APCLI_STATE_MACHINE_FUNC)(VOID *pAd, MLME_QUEUE_ELEM *Elem, - PULONG pCurrState, USHORT ifIndex); - -typedef struct _STA_STATE_MACHINE { - ULONG Base; - ULONG NrState; - ULONG NrMsg; - ULONG CurrState; - APCLI_STATE_MACHINE_FUNC *TransFunc; -} APCLI_STATE_MACHINE, *PSTA_STATE_MACHINE; -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -/* MLME AUX data structure that hold temporarliy settings during a connection attempt. */ -/* Once this attemp succeeds, all settings will be copy to pAd->StaActive. */ -/* A connection attempt (user set OID, roaming, CCX fast roaming,..) consists of */ -/* several steps (JOIN, AUTH, ASSOC or REASSOC) and may fail at any step. We purposely */ -/* separate this under-trial settings away from pAd->StaActive so that once */ -/* this new attempt failed, driver can auto-recover back to the active settings. */ -typedef struct _MLME_AUX { - UCHAR BssType; - UCHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR SsidLen; - UCHAR Bssid[MAC_ADDR_LEN]; - UCHAR AutoReconnectSsid[MAX_LEN_OF_SSID]; - UCHAR AutoReconnectSsidLen; - USHORT Alg; - UCHAR ScanType; - UCHAR Channel; - UCHAR OldChannel; - UCHAR CentralChannel; -#ifdef FOLLOW_HIDDEN_SSID_FEATURE - UCHAR Hidden; -#endif -#ifdef CONFIG_MULTI_CHANNEL - UCHAR InfraChannel; -#endif /* CONFIG_MULTI_CHANNEL */ - UCHAR DtimPeriod; - USHORT Aid; - USHORT CapabilityInfo; - USHORT BeaconPeriod; - USHORT CfpMaxDuration; - USHORT CfpPeriod; - USHORT AtimWin; - - /* Copy supported rate from desired AP's beacon. We are trying to match */ - /* AP's supported and extended rate settings. */ - UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR SupRateLen; - UCHAR ExtRateLen; - HT_CAPABILITY_IE HtCapability; - UCHAR HtCapabilityLen; - ADD_HT_INFO_IE AddHtInfo; /* AP might use this additional ht info IE */ - EXT_CAP_INFO_ELEMENT - ExtCapInfo; /* this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. */ - UCHAR NewExtChannelOffset; - /*RT_HT_CAPABILITY SupportedHtPhy; */ - -#ifdef DOT11_VHT_AC - UCHAR vht_cap_len; - UCHAR vht_op_len; - VHT_CAP_IE vht_cap; - VHT_OP_IE vht_op; - UCHAR vht_cent_ch; - BOOLEAN force_op_mode; - OPERATING_MODE op_mode; -#endif /* DOT11_VHT_AC */ - - /* new for QOS */ - QOS_CAPABILITY_PARM - APQosCapability; /* QOS capability of the current associated AP */ - EDCA_PARM APEdcaParm; /* EDCA parameters of the current associated AP */ - QBSS_LOAD_PARM APQbssLoad; /* QBSS load of the current associated AP */ - - /* new to keep Ralink specific feature */ - struct _vendor_ie_cap vendor_ie; - - BSS_TABLE SsidBssTab; /* AP list for the same SSID */ -#ifdef APCLI_OWE_SUPPORT - BSS_TABLE owe_bss_tab; /* AP list for the same SSID */ -#endif - BSS_TABLE RoamTab; /* AP list eligible for roaming */ - ULONG BssIdx; - ULONG RoamIdx; - BOOLEAN CurrReqIsFromNdis; - - RALINK_TIMER_STRUCT BeaconTimer, ScanTimer; - RALINK_TIMER_STRUCT AuthTimer; - RALINK_TIMER_STRUCT AssocTimer, ReassocTimer, DisassocTimer; - - TIMER_FUNC_CONTEXT BeaconTimerFuncContext; - TIMER_FUNC_CONTEXT ScanTimerFuncContext; - TIMER_FUNC_CONTEXT AuthTimerFuncContext; - TIMER_FUNC_CONTEXT AssocTimerFuncContext; - TIMER_FUNC_CONTEXT ReassocTimerFuncContext; - TIMER_FUNC_CONTEXT DisassocTimerFuncContext; - -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT - USHORT VarIELen; /* Length of next VIE include EID & Length */ - UCHAR VarIEs[MAX_VIE_LEN]; - LONG Rssi; /* Record the rssi value when receive Probe Rsp. */ - RALINK_TIMER_STRUCT ProbeTimer, ApCliAssocTimer, ApCliAuthTimer; - RALINK_TIMER_STRUCT WpaDisassocAndBlockAssocTimer; -#ifdef DOT11W_PMF_SUPPORT - RSN_CAPABILITIES RsnCap; - BOOLEAN IsSupportSHA256KeyDerivation; -#endif /* DOT11W_PMF_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef DOT11_SAE_SUPPORT - BOOLEAN use_h2e_connect; - UCHAR rsnxe_content[MAX_LEN_OF_RSNXEIE]; - UCHAR rsnxe_len; -#endif - - UINT32 AKMMap; - UINT32 PairwiseCipher; - UINT32 GroupCipher; - UINT32 IntegrityGroupCipher; - UINT32 candidate_score; -} MLME_AUX, *PMLME_AUX; - -#ifdef DOT11_N_SUPPORT -/* StaActive.SupportedHtPhy.MCSSet is copied from AP beacon. Don't need to update here. */ -#define COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd, _pEntry, _pStaCfg) \ - { \ - _pStaCfg->StaActive.SupportedHtPhy.MimoPs = \ - _pStaCfg->MlmeAux.HtCapability.HtCapInfo.MimoPs; \ - _pStaCfg->StaActive.SupportedHtPhy.GF = \ - _pStaCfg->MlmeAux.HtCapability.HtCapInfo.GF; \ - _pStaCfg->StaActive.SupportedHtPhy.ShortGIfor20 = \ - _pStaCfg->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20; \ - _pStaCfg->StaActive.SupportedHtPhy.ShortGIfor40 = \ - _pStaCfg->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40; \ - _pStaCfg->StaActive.SupportedHtPhy.TxSTBC = \ - _pStaCfg->MlmeAux.HtCapability.HtCapInfo.TxSTBC; \ - _pStaCfg->StaActive.SupportedHtPhy.RxSTBC = \ - _pStaCfg->MlmeAux.HtCapability.HtCapInfo.RxSTBC; \ - _pStaCfg->StaActive.SupportedHtPhy.ExtChanOffset = \ - _pStaCfg->MlmeAux.AddHtInfo.AddHtInfo.ExtChanOffset; \ - _pStaCfg->StaActive.SupportedHtPhy.OperaionMode = \ - _pStaCfg->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode; \ - _pStaCfg->StaActive.SupportedHtPhy.NonGfPresent = \ - _pStaCfg->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent; \ - NdisMoveMemory((_pEntry)->HTCapability.MCSSet, \ - (_pStaCfg)->StaActive.SupportedPhyInfo.MCSSet, \ - sizeof(UCHAR) * 16); \ - } - -#define COPY_AP_HTSETTINGS_FROM_BEACON(_pAd, _pHtCapability, _pEntry) \ - { \ - _pEntry->AMsduSize = \ - (UCHAR)(_pHtCapability->HtCapInfo.AMsduSize); \ - _pEntry->MmpsMode = (UCHAR)(_pHtCapability->HtCapInfo.MimoPs); \ - _pEntry->MaxRAmpduFactor = \ - (UCHAR)(_pHtCapability->HtCapParm.MaxRAmpduFactor); \ - } -#endif /* DOT11_N_SUPPORT */ - -#ifdef DOT11_VHT_AC -#define COPY_VHT_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd) \ - { \ - } -#endif /* DOT11_VHT_AC */ - -typedef struct _MLME_ADDBA_REQ_STRUCT { - UCHAR Wcid; - UCHAR pAddr[MAC_ADDR_LEN]; - UCHAR BaBufSize; - USHORT TimeOutValue; - UCHAR TID; - UCHAR Token; - USHORT BaStartSeq; -} MLME_ADDBA_REQ_STRUCT, *PMLME_ADDBA_REQ_STRUCT; - -typedef struct _MLME_DELBA_REQ_STRUCT { - UCHAR Wcid; /* */ - UCHAR Addr[MAC_ADDR_LEN]; - UCHAR TID; - UCHAR Initiator; -} MLME_DELBA_REQ_STRUCT, *PMLME_DELBA_REQ_STRUCT; - -/* assoc struct is equal to reassoc */ -typedef struct _MLME_ASSOC_REQ_STRUCT { - UCHAR Addr[MAC_ADDR_LEN]; - USHORT CapabilityInfo; - USHORT ListenIntv; - ULONG Timeout; -} MLME_ASSOC_REQ_STRUCT, *PMLME_ASSOC_REQ_STRUCT, MLME_REASSOC_REQ_STRUCT, - *PMLME_REASSOC_REQ_STRUCT; - -typedef struct _MLME_DISASSOC_REQ_STRUCT { - UCHAR Addr[MAC_ADDR_LEN]; - USHORT Reason; -} MLME_DISASSOC_REQ_STRUCT, *PMLME_DISASSOC_REQ_STRUCT; - -typedef struct _MLME_AUTH_REQ_STRUCT { - UCHAR Addr[MAC_ADDR_LEN]; - USHORT Alg; - ULONG Timeout; -#ifdef MAC_REPEATER_SUPPORT - UCHAR BssIdx; - UCHAR CliIdx; -#endif /* MAC_REPEATER_SUPPORT */ -} MLME_AUTH_REQ_STRUCT, *PMLME_AUTH_REQ_STRUCT; - -typedef struct _MLME_DEAUTH_REQ_STRUCT { - UCHAR Addr[MAC_ADDR_LEN]; - USHORT Reason; -} MLME_DEAUTH_REQ_STRUCT, *PMLME_DEAUTH_REQ_STRUCT; -typedef struct _MLME_BROADCAST_DEAUTH_REQ_STRUCT { - UCHAR Addr[MAC_ADDR_LEN]; - USHORT Reason; - struct wifi_dev *wdev; -} MLME_BROADCAST_DEAUTH_REQ_STRUCT, *PMLME_BROADCAST_DEAUTH_REQ_STRUCT; -typedef struct { - ULONG BssIdx; -} MLME_JOIN_REQ_STRUCT; - -typedef struct _MLME_SCAN_REQ_STRUCT { - UCHAR Bssid[MAC_ADDR_LEN]; - UCHAR BssType; - UCHAR ScanType; - UCHAR SsidLen; - CHAR Ssid[MAX_LEN_OF_SSID]; -} MLME_SCAN_REQ_STRUCT, *PMLME_SCAN_REQ_STRUCT; - -typedef struct _MLME_START_REQ_STRUCT { - CHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR SsidLen; -} MLME_START_REQ_STRUCT, *PMLME_START_REQ_STRUCT; - -/* Timing Measurement Frame REQ Format */ -typedef struct GNU_PACKED _FRAME_TMR_REQ_ACTION { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; - UCHAR Trigger; -} FRAME_TMR_REQ_ACTION, *PFRAME_TMR_REQ_ACTION; - -/* Timing Measurement Frame Format */ -typedef struct GNU_PACKED _FRAME_FTM_ACTION { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR Action; - UCHAR DialogToken; - UCHAR FollowUpDialogToken; - UCHAR TOD[6]; /*Unit 0.1ns */ - UCHAR TOA[6]; /*Unit 0.1ns */ - UCHAR TodErr[2]; - UCHAR ToaErr[2]; - /*TODO: three optional present IE. (LCI, LCivic, FTM IE)*/ -} FRAME_FTM_ACTION, *PFRAME_FTM_ACTION; - -/* ========================== AP mlme.h =============================== */ -#define TBTT_PRELOAD_TIME 384 /* usec. LomgPreamble + 24-byte at 1Mbps */ -#define DEFAULT_DTIM_PERIOD 1 - -/* weighting factor to calculate Channel quality, total should be 100% */ -/*#define RSSI_WEIGHTING 0 */ -/*#define TX_WEIGHTING 40 */ -/*#define RX_WEIGHTING 60 */ - -#define MAC_TABLE_AGEOUT_TIME 480 /* unit: sec */ -#define MAC_TABLE_MIN_AGEOUT_TIME 60 /* unit: sec */ -#define MAC_TABLE_ASSOC_TIMEOUT 5 /* unit: sec */ -/* #define MAC_TABLE_FULL(Tab) ((Tab).size == MAX_LEN_OF_MAC_TABLE) */ - -/* AP shall drop the sta if contine Tx fail count reach it. */ -#define MAC_ENTRY_LIFE_CHECK_CNT 1024 /* packet cnt. */ - -/* Value domain of pMacEntry->Sst */ -typedef enum _Sst { - SST_NOT_AUTH, /* 0: equivalent to IEEE 802.11/1999 state 1 */ - SST_AUTH, /* 1: equivalent to IEEE 802.11/1999 state 2 */ - SST_ASSOC /* 2: equivalent to IEEE 802.11/1999 state 3 */ -} SST; - -/* value domain of pMacEntry->AuthState */ -typedef enum _AuthState { - AS_NOT_AUTH, - AS_AUTH_OPEN, /* STA has been authenticated using OPEN SYSTEM */ - AS_AUTH_KEY, /* STA has been authenticated using SHARED KEY */ - AS_AUTHENTICATING, /* STA is waiting for AUTH seq#3 using SHARED KEY */ - AS_AUTH_SAE, /* STA has been authenticated using SAE */ -} AUTH_STATE; - -struct _build_ie_info { - UCHAR *frame_buf; - UCHAR frame_subtype; - BOOLEAN g_band_256_qam; - UCHAR channel; - UCHAR phy_mode; - BOOLEAN is_draft_n_type; - struct wifi_dev *wdev; - UINT16 pos; -}; - -#ifdef HOSTAPD_OWE_SUPPORT -typedef struct GNU_PACKED _EXT_ECDH_PARAMETER_IE { - UCHAR ext_ie_id; - UCHAR length; - UCHAR ext_id_ecdh; - UINT16 group; - UCHAR public_key[128]; -} EXT_ECDH_PARAMETER_IE, *PEXT_ECDH_PARAMETER_IE; -#endif - -struct _op_info { - UINT8 bw; - UINT8 cent_ch; -}; - -#ifdef IGMP_TVM_SUPPORT -#define IGMP_TVM_IE_LENGTH 7 -#define IGMP_TVM_IE_VERSION_1 0x01 -#define IGMP_TVM_IE_VERSION_2 0x00 - -struct GNU_PACKED _nec_tvm_ie { - UCHAR eid; - UINT8 len; - UCHAR oui_oitype[4]; - UCHAR version1; - UCHAR version2; - union { - struct { - UCHAR rsvd : 7; - UCHAR TVMode : 1; - } field; - } data; -}; -#endif /* IGMP_TVM_SUPPORT */ - -typedef struct _IE_lists { - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - UCHAR ApAddr[MAC_ADDR_LEN]; - USHORT CapabilityInfo; - USHORT ListenInterval; - UCHAR SsidLen; - UCHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR SupportedRatesLen; - UCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR SupportedChlLen; - UCHAR SupportedChl[MAX_LEN_OF_SUPPORTED_CHL]; - UCHAR RSN_IE[MAX_LEN_OF_RSNIE]; - UCHAR RSNIE_Len; - UCHAR rsnxe_ie[MAX_LEN_OF_RSNXEIE]; - UCHAR rsnxe_ie_len; - BOOLEAN bWmmCapable; -#if defined(WSC_AP_SUPPORT) || defined(RT_CFG80211_SUPPORT) - BOOLEAN bWscCapable; -#endif /* defined(WSC_AP_SUPPORT) || defined(RT_CFG80211_SUPPORT) */ - struct _vendor_ie_cap vendor_ie; - EXT_CAP_INFO_ELEMENT ExtCapInfo; -#ifdef DOT11R_FT_SUPPORT - FT_INFO FtInfo; -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - RRM_EN_CAP_IE RrmEnCap; -#endif /* DOT11K_RRM_SUPPORT */ -#ifdef CONFIG_MAP_SUPPORT - UCHAR MAP_AttriValue; -#ifdef MAP_R2 - UCHAR MAP_ProfileValue; - UINT16 MAP_default_vid; -#endif -#endif - UCHAR ht_cap_len; - HT_CAPABILITY_IE HTCapability; -#ifdef DOT11_VHT_AC - VHT_CAP_IE vht_cap; - VHT_OP_IE vht_op; - UCHAR vht_cap_len; - UCHAR vht_op_len; - UCHAR operating_mode_len; - OPERATING_MODE operating_mode; -#endif /* DOT11_VHT_AC */ -#if defined(CONFIG_OWE_SUPPORT) || defined(HOSTAPD_OWE_SUPPORT) - EXT_ECDH_PARAMETER_IE ecdh_ie; -#endif /*CONFIG_OWE_SUPPORT*/ - -#ifdef IGMP_TVM_SUPPORT - struct _nec_tvm_ie tvm_ie; -#endif /* IGMP_TVM_SUPPORT */ -} IE_LISTS; - -typedef struct _bcn_ie_list { - UCHAR Addr2[MAC_ADDR_LEN]; - UCHAR Bssid[MAC_ADDR_LEN]; - CHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR SsidLen; - UCHAR BssType; - USHORT BeaconPeriod; - UCHAR Channel; - UCHAR NewChannel; - USHORT AtimWin; - USHORT CapabilityInfo; - UCHAR Erp; - UCHAR DtimCount; - UCHAR DtimPeriod; - UCHAR BcastFlag; - UCHAR MessageToMe; - UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR SupRateLen; - UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; - UCHAR ExtRateLen; - UCHAR CkipFlag; - UCHAR AironetCellPowerLimit; - LARGE_INTEGER TimeStamp; - CF_PARM CfParm; - EDCA_PARM EdcaParm; - QBSS_LOAD_PARM QbssLoad; - QOS_CAPABILITY_PARM QosCapability; - struct _vendor_ie_cap vendor_ie; - EXT_CAP_INFO_ELEMENT ExtCapInfo; - UCHAR HtCapabilityLen; - UCHAR PreNHtCapabilityLen; - HT_CAPABILITY_IE HtCapability; - UCHAR AddHtInfoLen; - ADD_HT_INFO_IE AddHtInfo; - UCHAR NewExtChannelOffset; -#ifdef DOT11_VHT_AC - VHT_CAP_IE vht_cap_ie; - VHT_OP_IE vht_op_ie; - UCHAR vht_cap_len; - UCHAR vht_op_len; - WIDE_BW_CH_SWITCH_ELEMENT wb_info; -#endif /* DOT11_VHT_AC */ - BOOLEAN FromBcnReport; - BOOLEAN is_marvell_ap; - BOOLEAN is_atheros_ap; -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - UCHAR VendorID0[3]; - UCHAR VendorID1[3]; -#endif -#ifdef CONFIG_RCSA_SUPPORT - CSA_IE_INFO CsaInfo; -#endif -} BCN_IE_LIST; - -VOID MlmeHandler(struct _RTMP_ADAPTER *pAd); - -#define RTMP_MLME_HANDLER(pAd) RtmpMLMEUp(&((pAd)->mlmeTask)) - -#define ACTION_QOSMAP_CONFIG 4 - -typedef struct _QOSMAP_SET { - UCHAR DSCP_Field_Len; - USHORT DSCP_Field - [29]; /* Use to time out while slience, unit: second , set by UI */ -} QOSMAP_SET, *PQOSMAP_SET; - -typedef struct _MLME_QOS_ACTION_STRUCT { - UCHAR ActionField; - UCHAR Addr[MAC_ADDR_LEN]; - UCHAR apidx; - QOSMAP_SET QOSMap; -} MLME_QOS_ACTION_STRUCT, *PMLME_QOS_ACTION_STRUCT; - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -extern VOID ch_switch_monitor_state_machine_init(struct _RTMP_ADAPTER *pAd); -extern VOID ch_switch_monitor_del(struct _RTMP_ADAPTER *pAd); -#endif -#endif /* MLME_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mlme_sys.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mlme_sys.h deleted file mode 100644 index 88afe21994..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mlme_sys.h +++ /dev/null @@ -1,5 +0,0 @@ -/* - -*/ - -#include "rtmp_type.h" diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mt_io.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mt_io.h deleted file mode 100644 index 8f4a176c6d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mt_io.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_io.h -*/ - -#ifndef __MT_WIFI_IO_H__ -#define __MT_WIFI_IO_H__ - -struct _RTMP_ADAPTER; - -UINT32 mt_physical_addr_map(struct _RTMP_ADAPTER *pAd, UINT32 addr); -BOOLEAN mt_mac_cr_range_mapping(struct _RTMP_ADAPTER *pAd, UINT32 *mac_addr); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mt_rdm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mt_rdm.h deleted file mode 100644 index 2fae7a1a46..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/mt_rdm.h +++ /dev/null @@ -1,815 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_rdm.h//Jelly20150123 -*/ - -#ifndef _MT_RDM_H_ -#define _MT_RDM_H_ - -#ifdef MT_DFS_SUPPORT - -#include "rt_config.h" - -/* Remember add a RDM compile flag -- Shihwei 20141104 */ -/******************************************************************************* -* C O N S T A N T S -******************************************************************************** -*/ - -#if defined(MT7615) || defined(MT7622) -#define RDD_STOP 0 -#define RDD_START 1 -#define RDD_DET_MODE 2 -#define RDD_DETSTOP 3 -#define CAC_START 4 -#define CAC_END 5 -#define NORMAL_START 6 -#define DISABLE_DFS_CAL 7 -#define RDD_PULSEDBG 8 -#define RDD_READPULSE 9 -#define RDD_RESUME_BF 10 -#ifdef CONFIG_RCSA_SUPPORT -#define RDD_DETECT_INFO 11 -#define RDD_ALTX_CTRL 12 -#endif - -#else -typedef enum { - RDD_STOP = 0, - RDD_START, - RDD_DET_MODE, - RDD_RADAR_EMULATE, - RDD_START_TXQ = 20, - CAC_START = 50, - CAC_END, - NORMAL_START, - DISABLE_DFS_CAL, - RDD_PULSEDBG, - RDD_READPULSE, - RDD_RESUME_BF, - Dfs_CTRL_NUM, -} DFS_CTRL_TYPE; -#endif - -#define HW_RDD0 0 -#define HW_RDD1 1 -#define HW_RDD_NUM 2 - -#define RESTRICTION_BAND_LOW 116 -#define RESTRICTION_BAND_HIGH 128 -#define CHAN_SWITCH_PERIOD 10 -#define CHAN_NON_OCCUPANCY 1800 - -#if defined(OFFCHANNEL_SCAN_FEATURE) && defined(ONDEMAND_DFS) -#define CHAN_NON_OCCUPANCY_FREE 0 -#endif -#define CAC_NON_WETHER_BAND 65 -#define CAC_WETHER_BAND 605 -#define GROUP1_LOWER 36 -#define GROUP1_UPPER 48 -#define GROUP2_LOWER 52 -#define GROUP2_UPPER 64 -#define GROUP3_LOWER 100 -#define GROUP3_UPPER 112 -#define GROUP4_LOWER 116 -#define GROUP4_UPPER 128 - -#define DFS_BW_CH_QUERY_LEVEL1 1 -#define DFS_BW_CH_QUERY_LEVEL2 2 -#define DFS_AVAILABLE_LIST_BW_NUM 4 -#define DFS_AVAILABLE_LIST_CH_NUM 30 /*MAX_NUM_OF_CHANNELS*/ -#define DFS_BW40_GROUP_NUM 15 -#define DFS_BW80_GROUP_NUM 9 -#define DFS_BW160_GROUP_NUM 4 -#define DFS_BW40_PRIMCH_NUM 2 -#define DFS_BW80_PRIMCH_NUM 4 -#define DFS_BW160_PRIMCH_NUM 8 - -#define DFS_MACHINE_BASE 0 -#define DFS_BEFORE_SWITCH 0 -#define DFS_MAX_STATE 1 - -typedef enum _ENUM_AP_DFS_STATES { - DFS_CAC_END = 0, - DFS_CHAN_SWITCH_TIMEOUT, -#ifdef ONDEMAND_DFS - DFS_ONDEMAND_CAC_FINISH, -#endif -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - DFS_V10_W56_APDOWN_FINISH, - DFS_V10_W56_APDOWN_ENBL, - DFS_V10_ACS_CSA_UPDATE, -#endif - DFS_MAX_MSG -} ENUM_AP_DFS_STATES; - -#define DFS_FUNC_SIZE (DFS_MAX_STATE * DFS_MAX_MSG) - -#ifdef ONDEMAND_DFS -#define ONDEMAND_2x2MODE 0 -#define ONDEMAND_4x4MODE 1 - -#define IS_ONDEMAND_DFS_MODE_4x4(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bOnDemandDFSMode == TRUE) -#define SET_ONDEMAND_DFS_MODE(_pAd, _param) \ - (_pAd->CommonCfg.DfsParameter.bOnDemandDFSMode = _param) -#endif - -/* DFS zero wait */ -#define ZeroWaitCacApplyDefault 0xFF /* Apply default setting */ -#define BgnScanCacUnit 60000 /* unit is 1ms */ -#define DEFAULT_OFF_CHNL_CAC_TIME \ - (1 * BgnScanCacUnit + \ - 3000) /* 6*BgnScanCacUnit //6 mins, unit is 1minute for non-weather band channel */ -#define WEATHER_OFF_CHNL_CAC_TIME \ - (10 * BgnScanCacUnit + \ - 3000) /* 60*BgnScanCacUnit //60 mins, unit is 1minute for weather band channel */ -#define DYNAMIC_ZEROWAIT_ON 1 -#define DYNAMIC_ZEROWAIT_OFF 0 - -#define IS_CH_ABAND(_ch) (_ch > 14) - -#define GET_BGND_PARAM(_pAd, _param) DfsGetBgndParameter(pAd, _param) -enum { - BW80Group1 = 1, /* CH36~48 */ - BW80Group2, /* CH52~64 */ - BW80Group3, /* CH100~112 */ - BW80Group4, /* CH116~128 */ - BW80Group5, /* CH132~144 */ - BW80Group6, /* CH149~161 */ -}; - -enum { - RXSEL_0 = 0, /*RxSel = 0*/ - RXSEL_1, /*RxSel = 1*/ -}; - -enum { - REG_DEFAULT = 0, /*No region distinguish*/ - REG_JP_53, /*JAP_53*/ - REG_JP_56, /*JAP_56*/ -}; - -enum { - RDD_BAND0 = 0, - RDD_BAND1, -}; - -enum { - RDD_DETMODE_OFF = 0, - RDD_DETMODE_ON, -}; - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -#define V10_W52_SIZE 4 -#define V10_W53_SIZE 4 -#define V10_W56_VHT80_A_SIZE 4 -#define V10_W56_VHT80_B_SIZE 4 -#define V10_W56_VHT80_C_SIZE 4 -#define V10_W56_VHT80_SIZE \ - (V10_W56_VHT80_A_SIZE + V10_W56_VHT80_A_SIZE + V10_W56_VHT80_C_SIZE) -#define V10_W56_VHT20_SIZE 3 -#define V10_W56_SIZE 12 -#define V10_TOTAL_CHANNEL_COUNT \ - (V10_W52_SIZE + V10_W53_SIZE + V10_W56_VHT80_A_SIZE + \ - V10_W56_VHT80_B_SIZE + V10_W56_VHT80_C_SIZE) -#define V10_5G_TOTAL_CHNL_COUNT (V10_TOTAL_CHANNEL_COUNT + V10_LAST_SIZE) - -typedef enum _V10_NEC_GRP_LIST { - W52 = 0, /* CH36~48 */ - W53, /* CH52~64 */ - W56_UA, /* CH100~112 */ - W56_UB, /* CH116~128 */ - W56_UC, /* CH132~140 */ - W56_UAB, /* VHT80 Ch 100 ~ 128*/ - W56, /* All W56 */ - NA_GRP -} V10_NEC_GRP_LIST; - -#define V10_LAST_SIZE 5 - -#define GROUP5_LOWER 132 - -#define GROUP6_LOWER 149 - -#define V10_WEIGH_FACTOR_W53 3 -#define V10_WEIGH_FACTOR_W52 2 -#define V10_WEIGH_FACTOR_W56 1 - -#define V10_W56_APDOWN_TIME 1805 -#define V10_BGND_SCAN_TIME 20 -#define V10_NORMAL_SCAN_TIME 200 - -#define IS_V10_W56_VHT80_SWITCHED(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bV10W56SwitchVHT80 == TRUE) -#define SET_V10_W56_VHT80_SWITCH(_pAd, switch) \ - (_pAd->CommonCfg.DfsParameter.bV10W56SwitchVHT80 = switch) - -#define GET_V10_OFF_CHNL_TIME(_pAd) \ - (_pAd->CommonCfg.DfsParameter.gV10OffChnlWaitTime) -#define SET_V10_OFF_CHNL_TIME(_pAd, waitTime) \ - (_pAd->CommonCfg.DfsParameter.gV10OffChnlWaitTime = waitTime) - -#define IS_V10_W56_GRP_VALID(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bV10W56GrpValid == TRUE) -#define SET_V10_W56_GRP_VALID(_pAd, valid) \ - (_pAd->CommonCfg.DfsParameter.bV10W56GrpValid = valid) -#endif - -/******************************************************************************* -* M A C R O S -******************************************************************************** -*/ - -/******************************************************************************* -* D A T A T Y P E S -******************************************************************************** -*/ - -typedef struct _DFS_CHANNEL_LIST { - UCHAR Channel; - USHORT NonOccupancy; - UCHAR NOPClrCnt; - UCHAR SupportBwBitMap; - USHORT NOPSaveForClear; - UCHAR NOPSetByBw; -} DFS_CHANNEL_LIST, *PDFS_CHANNEL_LIST; - -#ifdef ONDEMAND_DFS -typedef struct _OD_CHANNEL_LIST { - UCHAR Channel; - BOOLEAN isConsumed; -} OD_CHANNEL_LIST, *POD_CHANNEL_LIST; -#endif - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -typedef struct _V10_CHANNEL_LIST { - UINT_32 BusyTime; - UCHAR Channel; - BOOLEAN isConsumed; -} V10_CHANNEL_LIST, *PV10_CHANNEL_LIST; -#endif - -enum DFS_SET_NEWCH_MODE { - DFS_SET_NEWCH_DISABLED = 0x0, - DFS_SET_NEWCH_ENABLED = 0x1, - DFS_SET_NEWCH_INIT = - 0xa, /* Magic number 0xa stands for initial value */ -}; - -enum { - DFS_IDLE = 0, - DFS_INIT_CAC, - DFS_CAC, /* Channel avail check state */ - DFS_OFF_CHNL_CAC_TIMEOUT, /* Off channel CAC timeout state */ - DFS_INSERV_MONI, /* In service monitor state */ - DFS_RADAR_DETECT, /* Radar detected state */ - DFS_MBSS_CAC, -}; - -enum { - INBAND_CH = 0, - INBAND_BW, - OUTBAND_CH, - OUTBAND_BW, - ORI_INBAND_CH, - ORI_INBAND_BW, -}; - -enum ZEROWAIT_ACT_CODE { - ZERO_WAIT_DFS_ENABLE = 0, /*0*/ - INIT_AVAL_CH_LIST_UPDATE, - MONITOR_CH_ASSIGN, - NOP_FORCE_SET, - PRE_ASSIGN_NEXT_TARGET, - SHOW_TARGET_INFO, - QUERY_AVAL_CH_LIST = 20, - QUERY_NOP_OF_CH_LIST, - -}; - -/*Report to Customer*/ -typedef struct _DFS_REPORT_AVALABLE_CH_LIST { - UCHAR Channel; - UCHAR RadarHitCnt; -} DFS_REPORT_AVALABLE_CH_LIST, *PDFS_REPORT_AVALABLE_CH_LIST; - -typedef struct _NOP_REPORT_CH_LIST { - UCHAR Channel; - UCHAR Bw; - USHORT NonOccupancy; -} NOP_REPORT_CH_LIST, *PNOP_REPORT_CH_LIST; - -union dfs_zero_wait_msg { - struct _aval_channel_list_msg { - UCHAR Action; - UCHAR Bw80TotalChNum; - UCHAR Bw40TotalChNum; - UCHAR Bw20TotalChNum; - DFS_REPORT_AVALABLE_CH_LIST - Bw80AvalChList[DFS_AVAILABLE_LIST_CH_NUM]; - DFS_REPORT_AVALABLE_CH_LIST - Bw40AvalChList[DFS_AVAILABLE_LIST_CH_NUM]; - DFS_REPORT_AVALABLE_CH_LIST - Bw20AvalChList[DFS_AVAILABLE_LIST_CH_NUM]; - } aval_channel_list_msg; - - struct _nop_of_channel_list_msg { - UCHAR Action; - UCHAR NOPTotalChNum; - NOP_REPORT_CH_LIST NopReportChList[DFS_AVAILABLE_LIST_CH_NUM]; - } nop_of_channel_list_msg; - - struct _set_monitored_ch_msg { - UCHAR Action; - UCHAR SyncNum; - UCHAR Channel; - UCHAR Bw; - UCHAR doCAC; - } set_monitored_ch_msg; - - struct _zerowait_dfs_ctrl_msg { - UCHAR Action; - UCHAR Enable; - } zerowait_dfs_ctrl_msg; - - struct _nop_force_set_msg { - UCHAR Action; - UCHAR Channel; - UCHAR Bw; - USHORT NOPTime; - } nop_force_set_msg; - - struct _assign_next_target { - UCHAR Channel; - UCHAR Bw; - USHORT CacValue; - } assign_next_target; - - struct _target_ch_show { - UCHAR mode; - } target_ch_show; -}; - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -typedef struct _DFS_RT_MATCHING_LIST { - RTMP_STRING *pRadarType; - RTMP_STRING *pMatchingRadarType; -} DFS_RT_MATCHING_LIST, *PDFS_RT_MATCHING_LIST; - -typedef struct _DFS_PULSE_THRESHOLD_PARAM { - UINT32 u4PulseWidthMax; /* unit us */ - INT32 i4PulsePwrMax; /* unit dbm */ - INT32 i4PulsePwrMin; /* unit dbm */ - UINT32 u4PRI_MIN_STGR; /* unit us */ - UINT32 u4PRI_MAX_STGR; /* unit us */ - UINT32 u4PRI_MIN_CR; /* unit us */ - UINT32 u4PRI_MAX_CR; /* unit us */ -} DFS_PULSE_THRESHOLD_PARAM, *PDFS_PULSE_THRESHOLD_PARAM; - -typedef struct _DFS_RADAR_THRESHOLD_PARAM { - DFS_PULSE_THRESHOLD_PARAM rPulseThresholdParam; - BOOLEAN afgSupportedRT[RT_NUM]; - SW_RADAR_TYPE_T arRadarType[RT_NUM]; -} DFS_RADAR_THRESHOLD_PARAM, *PDFS_RADAR_THRESHOLD_PARAM; -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -typedef struct _DFS_PARAM { - UCHAR Band0Ch; /* smaller channel number */ - UCHAR Band1Ch; /* larger channel number */ - UCHAR PrimCh; - UCHAR DbdcAdditionCh; - UCHAR PrimBand; - UCHAR Bw; - UCHAR RDDurRegion; - DFS_CHANNEL_LIST DfsChannelList[MAX_NUM_OF_CHANNELS]; - UCHAR ChannelListNum; - UCHAR AvailableBwChIdx[DFS_AVAILABLE_LIST_BW_NUM] - [DFS_AVAILABLE_LIST_CH_NUM]; - UCHAR Bw40GroupIdx[DFS_BW40_GROUP_NUM][DFS_BW40_PRIMCH_NUM]; - UCHAR Bw80GroupIdx[DFS_BW80_GROUP_NUM][DFS_BW80_PRIMCH_NUM]; - UCHAR Bw160GroupIdx[DFS_BW160_GROUP_NUM][DFS_BW160_PRIMCH_NUM]; - DFS_REPORT_AVALABLE_CH_LIST - Bw80AvailableChList[DFS_AVAILABLE_LIST_CH_NUM]; - DFS_REPORT_AVALABLE_CH_LIST - Bw40AvailableChList[DFS_AVAILABLE_LIST_CH_NUM]; - DFS_REPORT_AVALABLE_CH_LIST - Bw20AvailableChList[DFS_AVAILABLE_LIST_CH_NUM]; - BOOLEAN bIEEE80211H; - BOOLEAN DfsChBand[2]; - BOOLEAN RadarDetected[2]; - struct DOT11_H Dot11_H[DBDC_BAND_NUM]; - UCHAR RegTxSettingBW; - BOOLEAN bDfsCheck; - BOOLEAN RadarDetectState; - UCHAR NeedSetNewChList; - BOOLEAN DisableDfsCal; - BOOLEAN bNoSwitchCh; - BOOLEAN bShowPulseInfo; - BOOLEAN bDBDCMode; - BOOLEAN bDfsEnable; - BOOLEAN bNoAvailableCh; - UCHAR RadarHitIdxRecord; - UCHAR targetCh; - UCHAR targetBw; - USHORT targetCacValue; - /* DFS zero wait */ - BOOLEAN bZeroWaitSupport; /* Save the profile setting of DfsZeroWait */ - UCHAR ZeroWaitDfsState; /* for DFS zero wait state machine using */ - UCHAR DfsZeroWaitCacTime; /* unit is minute and Maximum Off-Channel CAC time is one hour */ - BOOLEAN bZeroWaitCacSecondHandle; - BOOLEAN bDedicatedZeroWaitSupport; -#ifdef ONDEMAND_DFS - BOOLEAN bOnDemandZeroWaitSupport; /* OnDemand DFS Support */ - BOOLEAN bOnDemandDFSMode; /* OnDemand DFS Mode: FALSE= 2x2, TRUE= 4x4*/ - BOOLEAN bOnDemandChannelListValid; /* Is ACS Channel List Valid */ - UCHAR MaxGroupCount; /* Max Group Count from ACS */ - POD_CHANNEL_LIST OnDemandChannelList; /* ACS CHannel List */ -#endif -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - ULONG gV10OffChnlWaitTime; - ULONG gV10W56TrgrApDownTime; - BOOLEAN bDFSV10Support; /* NEC DFS Support */ - BOOLEAN bV10ChannelListValid; - BOOLEAN bV10BootACSValid; - BOOLEAN bV10W56GrpValid; - BOOLEAN bV10W56SwitchVHT80; - BOOLEAN bV10W56APDownEnbl; - BOOLEAN bV10APBcnUpdateEnbl; - BOOLEAN bV10APInterfaceDownEnbl; - UCHAR GroupCount; /* Max Group Count from ACS */ - V10_CHANNEL_LIST DfsV10SortedACSList[V10_TOTAL_CHANNEL_COUNT]; -#endif - UCHAR OutBandCh; - UCHAR OutBandBw; - UCHAR OrigInBandCh; - UCHAR OrigInBandBw; - USHORT DedicatedOutBandCacCount; - BOOLEAN bOutBandAvailable; - BOOLEAN bSetInBandCacReStart; - BOOLEAN bDedicatedZeroWaitDefault; - BOOLEAN bInitOutBandBranch; - USHORT DedicatedOutBandCacTime; - BOOLEAN RadarHitReport; - UCHAR OutBandAvailableCh; - /* MBSS DFS zero wait */ - BOOLEAN bInitMbssZeroWait; - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT - /*Threshold params*/ - BOOLEAN fgHwRDDLogEnable; - BOOLEAN fgSwRDDLogEnable; - BOOLEAN fgSwRDDLogCond; - UINT16 u2FCC_LPN_MIN; - BOOLEAN fgRDRegionConfigured; - DFS_RADAR_THRESHOLD_PARAM rRadarThresholdParam; -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT - BOOLEAN fgRadarEmulate; -#endif /*RDM_FALSE_ALARM_DEBUG_SUPPORT */ - -#ifdef CONFIG_RCSA_SUPPORT - BOOLEAN bRCSAEn; - BOOLEAN fSendRCSA; - BOOLEAN fUseCsaCfg; - BOOLEAN fCheckRcsaTxDone; - UCHAR ChSwMode; -#endif - - STATE_MACHINE_FUNC DfsStateFunc[DFS_FUNC_SIZE]; - STATE_MACHINE DfsStatMachine; -} DFS_PARAM, *PDFS_PARAM; - -#ifdef MT_DFS_SUPPORT -typedef int (*_k_ARC_ZeroWait_DFS_CAC_Time_Meet_report_callback_fun_type)( - UCHAR SyncNum, UCHAR Bw, UCHAR monitored_Ch); -#endif /* MT_DFS_SUPPORT */ - -/******************************************************************************* -* E X T E R N A L R E F E R E N C E S -******************************************************************************** -*/ - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -extern DFS_RADAR_THRESHOLD_PARAM g_arRadarThresholdParam[4]; -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -/******************************************************************************* -* F U N C T I O N D E C L A R A T I O N S -******************************************************************************** -*/ - -INT ZeroWaitDfsCmdHandler(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq); - -INT ZeroWaitDfsQueryCmdHandler(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq); - -INT Set_RadarDetectStart_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_RadarDetectStop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_ByPassCac_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_RDDReport_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -UCHAR DfsPrimToCent(UCHAR Channel, UCHAR Bw); - -UCHAR DfsGetBgndParameter(IN PRTMP_ADAPTER pAd, UCHAR QueryParam); - -VOID DfsGetSysParameters(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - UCHAR vht_cent2, UCHAR phy_bw); - -VOID DfsParamInit(/* finish */ - IN PRTMP_ADAPTER pAd); - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -VOID DfsThresholdParamInit(IN PRTMP_ADAPTER pAd); - -INT Set_DfsDefaultRDDThresholdParam(IN PRTMP_ADAPTER pAd); -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -VOID DfsStateMachineInit(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -INT Set_DfsChannelShow_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_DfsBwShow_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_DfsRDModeShow_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_DfsRDDRegionShow_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Show_DfsNonOccupancy_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_DfsNOP_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -/* DFS Zero Wait */ -INT Set_DfsZeroWaitCacTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DedicatedBwCh_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DfsZeroWaitDynamicCtrl_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DfsZeroWaitNOP_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DfsTargetCh_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID DfsDedicatedExclude(IN PRTMP_ADAPTER pAd); - -VOID DfsSetCalibration(IN PRTMP_ADAPTER pAd, UINT_32 DisableDfsCal); - -VOID DfsSetZeroWaitCacSecond(IN PRTMP_ADAPTER pAd); - -BOOLEAN DfsBypassRadarStateCheck(struct wifi_dev *wdev); - -BOOLEAN DfsRadarChannelCheck(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - UCHAR vht_cent2, UCHAR phy_bw); - -VOID DfsSetNewChInit(IN PRTMP_ADAPTER pAd); - -VOID DfsCacEndUpdate(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); - -VOID DfsCacEndLoadDCOCData(IN PRTMP_ADAPTER pAd); - -#ifdef ONDEMAND_DFS -VOID DfsOutBandCacPass(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -#endif - -NTSTATUS DfsChannelSwitchTimeoutAction(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt); - -NTSTATUS DfsSwitchChAfterRadarDetected(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt); - -NTSTATUS DfsAPRestart(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt); - -VOID DfsCacNormalStart(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - UCHAR CompareMode); - -BOOLEAN DfsCacRestrictBand(IN PRTMP_ADAPTER pAd, IN UCHAR Bw, IN UCHAR Ch, - IN UCHAR SecCh); - -VOID DfsBuildChannelList(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev); - -VOID DfsBuildChannelGroupByBw(IN PRTMP_ADAPTER pAd); - -BOOLEAN DfsCheckBwGroupAllAvailable(UCHAR ChechChIdx, UCHAR Bw, - IN PDFS_PARAM pDfsParam); - -BOOLEAN DfsSwitchCheck(/* finish */ - IN PRTMP_ADAPTER pAd, UCHAR Channel, UCHAR bandIdx); - -BOOLEAN DfsStopWifiCheck(IN PRTMP_ADAPTER pAd); - -VOID DfsNonOccupancyUpdate(IN PRTMP_ADAPTER pAd); - -VOID DfsNonOccupancyCountDown(/*RemainingTimeForUse --, finish*/ - IN PRTMP_ADAPTER pAd); - -#ifdef ONDEMAND_DFS -USHORT -DfsOnDemandSelectBestChannel(/*Select the Channel from Rank List by Bgnd Scan*/ - IN PRTMP_ADAPTER pAd, BOOLEAN bSkipDfsCh); - -BOOLEAN CheckNonOccupancyOnDemandChannel(IN PRTMP_ADAPTER pAd, - IN UCHAR channel); - -#ifdef OFFCHANNEL_SCAN_FEATURE -VOID DfsNonOccupancyCmpltnEvent(IN PRTMP_ADAPTER pAd, IN UINT_8 chIndex, - IN BOOLEAN isNOPSaveForClear); -#endif -#endif - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -USHORT DfsV10SelectBestChannel(/*Select the Channel from Rank List by ACS*/ - IN PRTMP_ADAPTER pAd, IN UCHAR oldChannel); - -UCHAR DfsV10CheckChnlGrp(IN PRTMP_ADAPTER pAd, IN UCHAR Channel); - -BOOLEAN DfsV10CheckW56Grp(IN PRTMP_ADAPTER pAd, IN UCHAR channel); - -VOID DfsV10AddWeighingFactor(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *pwdev); - -BOOLEAN DfsV10CheckGrpChnlLeft(IN PRTMP_ADAPTER pAd, IN UCHAR chGrp, - IN UCHAR grpWidth); - -UINT_8 DfsV10W56FindMaxNopDuration(IN PRTMP_ADAPTER pAd); - -UINT_8 DfsV10FindNonNopChannel(IN PRTMP_ADAPTER pAd, IN UCHAR chGrp, - IN UCHAR grpWidth); - -BOOLEAN DfsV10W56APDownStart(IN PRTMP_ADAPTER pAd, IN PAUTO_CH_CTRL pAutoChCtrl, - IN ULONG V10W56TrgrApDownTime); - -VOID DfsV10W56APDownTimeCountDown(/*RemainingTimeForUse --*/ - IN PRTMP_ADAPTER pAd); - -VOID DfsV10W56APDownPass(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); - -VOID DfsV10W56APDownEnbl(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); - -VOID DfsV10APBcnUpdate(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); -#endif - -VOID WrapDfsRddReportHandle(/*handle the event of EXT_EVENT_ID_RDD_REPORT*/ - IN PRTMP_ADAPTER pAd, UCHAR ucRddIdx); - -BOOLEAN DfsRddReportHandle(/*handle the event of EXT_EVENT_ID_RDD_REPORT*/ - IN PRTMP_ADAPTER pAd, PDFS_PARAM pDfsParam, - UCHAR ucRddIdx, UCHAR bandIdx); - -VOID WrapDfsSetNonOccupancy(/*Set Channel non-occupancy time, finish */ - IN PRTMP_ADAPTER pAd, UCHAR bandIdx); - -VOID DfsSetNonOccupancy(/*Set Channel non-occupancy time, finish*/ - IN PRTMP_ADAPTER pAd, IN PDFS_PARAM pDfsParam, - UCHAR bandIdx); - -VOID WrapDfsSelectChannel(/*Select new channel, finish*/ - IN PRTMP_ADAPTER pAd, UCHAR bandIdx); - -VOID DfsSelectChannel(/*Select new channel, finish*/ - IN PRTMP_ADAPTER pAd, PDFS_PARAM pDfsParam); - -UCHAR WrapDfsRandomSelectChannel(/*Select new channel using random selection, finish*/ - IN PRTMP_ADAPTER pAd, BOOLEAN bSkipDfsCh, - UCHAR avoidCh); - -UCHAR DfsRandomSelectChannel(/*Select new channel using random selection, finish*/ - IN PRTMP_ADAPTER pAd, PDFS_PARAM pDfsParam, - BOOLEAN bSkipDfsCh, UCHAR avoidCh); - -USHORT -DfsBwChQueryByDefault(/*Query current available BW & Channel list or select default*/ - IN PRTMP_ADAPTER pAd, UCHAR Bw, PDFS_PARAM pDfsParam, - UCHAR level, BOOLEAN bDefaultSelect, - BOOLEAN SkipNonDfsCh); - -VOID DfsBwChQueryAllList(/*Query current All available BW & Channel list*/ - IN PRTMP_ADAPTER pAd, UCHAR Bw, PDFS_PARAM pDfsParam, - BOOLEAN SkipWorkingCh); - -BOOLEAN DfsDedicatedCheckChBwValid(IN PRTMP_ADAPTER pAd, UCHAR Channel, - UCHAR Bw); - -VOID DfsAdjustBwSetting(struct wifi_dev *wdev, UCHAR CurrentBw, UCHAR NewBw); - -VOID WrapDfsRadarDetectStart(/*Start Radar Detection or not, finish*/ - IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev); - -VOID DfsRadarDetectStart(/*Start Radar Detection or not, finish*/ - IN PRTMP_ADAPTER pAd, PDFS_PARAM pDfsParam, - struct wifi_dev *wdev); - -VOID WrapDfsRadarDetectStop(/*Start Radar Detection or not*/ - IN PRTMP_ADAPTER pAd); - -VOID DfsRadarDetectStop(/*Start Radar Detection or not, finish*/ - IN PRTMP_ADAPTER pAd, PDFS_PARAM pDfsParam); - -#ifdef ONDEMAND_DFS -VOID DfsOnDemandInBandRDDStart(IN PRTMP_ADAPTER pAd); - -UCHAR DfsOnDemandDynamicChannelUpdate(IN PRTMP_ADAPTER pAd, - IN struct wifi_dev *wdev, - IN UCHAR Channel); -#endif - -VOID DfsDedicatedOutBandRDDStart(IN PRTMP_ADAPTER pAd); - -VOID DfsDedicatedOutBandRDDRunning(IN PRTMP_ADAPTER pAd); - -VOID DfsDedicatedOutBandRDDStop(IN PRTMP_ADAPTER pAd); - -BOOLEAN DfsIsRadarHitReport(IN PRTMP_ADAPTER pAd); - -VOID DfsRadarHitReportReset(IN PRTMP_ADAPTER pAd); - -BOOLEAN DfsIsTargetChAvailable(IN PRTMP_ADAPTER pAd); - -VOID DfsReportCollision(IN PRTMP_ADAPTER pAd); - -BOOLEAN DfsIsOutBandAvailable(IN PRTMP_ADAPTER pAd); - -VOID DfsOutBandCacReset(IN PRTMP_ADAPTER pAd); - -VOID DfsSetCacRemainingTime(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev); - -VOID DfsOutBandCacCountUpdate(IN PRTMP_ADAPTER pAd); - -VOID DfsDedicatedExamineSetNewCh(IN struct _RTMP_ADAPTER *pAd, UCHAR Channel); - -UCHAR DfsGetCentCh(IN PRTMP_ADAPTER pAd, IN UCHAR Channel, IN UCHAR bw, - IN struct wifi_dev *wdev); - -INT mtRddControl(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucRddCtrl, - IN UCHAR ucRddIdex, IN UCHAR ucRddInSel, IN UCHAR ucSetVal); - -#ifdef BACKGROUND_SCAN_SUPPORT -/* Mbss Zero Wait */ -BOOLEAN MbssZeroWaitStopValidate(PRTMP_ADAPTER pAd, UCHAR MbssCh, INT MbssIdx); -VOID ZeroWaitUpdateForMbss(PRTMP_ADAPTER pAd, BOOLEAN bZeroWaitStop, - UCHAR MbssCh, INT MbssIdx); -VOID DfsDedicatedScanStart(IN PRTMP_ADAPTER pAd); -VOID DfsInitDedicatedScanStart(IN PRTMP_ADAPTER pAd); -VOID DfsSetInitDediatedScanStart(IN PRTMP_ADAPTER pAd); -VOID DfsDedicatedInBandSetChannel(IN PRTMP_ADAPTER pAd, UCHAR Channel, UCHAR Bw, - BOOLEAN doCAC); -VOID DfsDedicatedOutBandSetChannel(IN PRTMP_ADAPTER pAd, UCHAR Channel, - UCHAR Bw); -VOID DfsDedicatedDynamicCtrl(IN PRTMP_ADAPTER pAd, UINT_32 DfsDedicatedOnOff); -#endif /* BACKGROUND_SCAN_SUPPORT */ - -INT Set_ModifyChannelList_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_available_BwCh_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_NOP_Of_ChList(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_Target_Ch_Info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID ZeroWait_DFS_Initialize_Candidate_List( - IN struct _RTMP_ADAPTER *pAd, IN UCHAR Bw80Num, - IN PDFS_REPORT_AVALABLE_CH_LIST pBw80AvailableChList, IN UCHAR Bw40Num, - IN PDFS_REPORT_AVALABLE_CH_LIST pBw40AvailableChList, IN UCHAR Bw20Num, - IN PDFS_REPORT_AVALABLE_CH_LIST pBw20AvailableChList); - -VOID DfsProvideAvailableChList(IN PRTMP_ADAPTER pAd); - -VOID DfsProvideNopOfChList(IN PRTMP_ADAPTER pAd, union dfs_zero_wait_msg *msg); - -VOID ZeroWait_DFS_set_NOP_to_Channel_List(IN PRTMP_ADAPTER pAd, - IN UCHAR Channel, UCHAR Bw, - USHORT NOPTime); - -VOID ZeroWait_DFS_Pre_Assign_Next_Target_Channel(IN PRTMP_ADAPTER pAd, - IN UCHAR Channel, IN UCHAR Bw, - IN USHORT CacValue); - -VOID ZeroWait_DFS_Next_Target_Show(IN PRTMP_ADAPTER pAd, IN UCHAR mode); - -VOID ZeroWait_DFS_collision_report(IN PRTMP_ADAPTER pAd, IN UCHAR SynNum, - IN UCHAR Channel, UCHAR Bw); - -VOID DfsZeroHandOffRecovery(IN struct _RTMP_ADAPTER *pAd, - struct wifi_dev *wdev); - -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT -VOID UpdateRadarInfo(P_EXT_EVENT_RDD_REPORT_T prRadarReport); - -VOID DumpRadarHwPulsesInfo(IN PRTMP_ADAPTER pAd, - IN P_EXT_EVENT_RDD_REPORT_T prRadarReport); - -VOID DumpRadarSwPulsesInfo(IN PRTMP_ADAPTER pAd, - IN P_EXT_EVENT_RDD_REPORT_T prRadarReport); - -INT Show_DFS_Debug_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */ -#endif /*MT_DFS_SUPPORT*/ -#endif /*_MT_RDM_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/netif_block.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/netif_block.h deleted file mode 100644 index 50184d17f7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/netif_block.h +++ /dev/null @@ -1,23 +0,0 @@ - -#ifndef __NET_IF_BLOCK_H__ -#define __NET_IF_BLOCK_H__ - -#include "common/link_list.h" -#include "rtmp.h" - -#define FREE_NETIF_POOL_SIZE 32 - -typedef struct _NETIF_ENTRY { - struct _NETIF_ENTRY *pNext; - PNET_DEV pNetDev; -} NETIF_ENTRY, *PNETIF_ENTRY; - -void initblockQueueTab(IN PRTMP_ADAPTER pAd); - -BOOLEAN blockNetIf(IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry, IN PNET_DEV pNetDev); - -VOID releaseNetIf(IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry); - -VOID StopNetIfQueue(IN PRTMP_ADAPTER pAd, IN UCHAR QueIdx, - IN PNDIS_PACKET pPacket); -#endif /* __NET_IF_BLOCK_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/nfc.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/nfc.h deleted file mode 100644 index c49aabf35e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/nfc.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __WSC_NFC_H__ -#define __WSC_NFC_H__ - -VOID NfcParseRspCommand(IN PRTMP_ADAPTER pAd, IN PUCHAR pData, - IN USHORT DataLen); - -VOID NfcCommand(IN PRTMP_ADAPTER pAd, IN UCHAR Action, IN UCHAR Type, - IN SHORT DataLen, IN PUCHAR pData); - -VOID NfcGenRandomPasswd(IN PRTMP_ADAPTER pAd, IN PWSC_CTRL pWscCtrl); - -INT NfcBuildWscProfileTLV(IN PRTMP_ADAPTER pAd, IN PWSC_CTRL pWscCtrl, - OUT UCHAR *pbuf, OUT USHORT *pBufLen); - -INT NfcBuildOOBDevPasswdTLV(IN PRTMP_ADAPTER pAd, IN PWSC_CTRL pWscCtrl, - IN UCHAR HandoverType, OUT UCHAR *pbuf, - OUT USHORT *pBufLen); - -INT Set_NfcStatus_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_NfcPasswdToken_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_NfcConfigurationToken_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Get_NfcStatus_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DoWpsByNFC_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_NfcRegenPK_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#endif /* __WSC_NFC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oce.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oce.h deleted file mode 100644 index 0b1fb1bf32..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oce.h +++ /dev/null @@ -1,275 +0,0 @@ -#ifndef __OCE_H -#define __OCE_H - -#ifdef OCE_SUPPORT -#include "rtmp_type.h" -#include "rt_config.h" - -#define OCE_ATTR_MAX_LEN 252 /* ????? */ -#define OCE_SCAN_11BOCEAP_PERIOD_TIME 180000 /* 180 sec */ -#define OCE_RELEASE 0x1 /* OCE release = 1 */ -#define IS_STA_CFON 0x0 /* IS not STA CFON */ -#define HLP_ENABLED 0x1 /* HLP_ENABLED */ - -#define OCE_RELEASE_MASK BITS(0, 2) -#define OCE_RELEASE_OFFSET 0 -#define OCE_IS_STA_CFON_MASK BIT(3) -#define OCE_IS_STA_CFON_OFFSET 3 -#define OCE_11B_ONLY_PRESENT_MASK BIT(4) -#define OCE_11B_ONLY_PRESENT_OFFSET 4 -#define OCE_HLP_ENABLED_MASK BIT(5) -#define OCE_HLP_ENABLED_OFFSET 5 -#define OCE_NONOCE_PRESENT_MASK BIT(6) -#define OCE_NONOCE_PRESENT_OFFSET 6 -#define OCE_AVAILABLE_CAP_MASK BITS(0, 3) -#define OCE_AVAILABLE_CAP_OFFSET 4 - -#define OCE_SHORT_SSID_LEN 4 -#define OCE_RNR_IE_LEN 17 -#define OCE_FD_FRAME_PERIOD 20 /* unit: ms */ -#define OCE_RNR_SCAN_PERIOD 120000 /* unit: ms */ -#define OCE_RNR_UPDATE_TIME_LOG 2000 /* unit: ms */ - -#define OCE_GET_CONTROL_FIELD(_OceCapIndication, _mask, _offset) \ - (((_OceCapIndication) & (_mask)) >> (_offset)) - -#define OCE_SET_CONTROL_FIELD(_OceCapIndication, _value, _mask, _offset) \ - { \ - (_OceCapIndication) &= ~(_mask); \ - (_OceCapIndication) |= (((_value) << (_offset)) & (_mask)); \ - } - -#define OCE_GET_DOWNLINK_AVAILABLE_CAP(_AvailableCap, _mask, _offset) \ - ((_AvailableCap) >> (_offset)) - -#define OCE_SET_DOWNLINK_AVAILABLE_CAP(_AvailableCap, _value, _mask, _offset) \ - { \ - (_AvailableCap) &= (_mask); \ - (_AvailableCap) |= ((_value) << (_offset)); \ - } - -#define OCE_GET_UPLINK_AVAILABLE_CAP(_AvailableCap, _mask, _offset) \ - ((_AvailableCap) & (_mask)) - -#define OCE_SET_UPLINK_AVAILABLE_CAP(_AvailableCap, _value, _mask, _offset) \ - { \ - (_AvailableCap) &= ~(_mask); \ - (_AvailableCap) |= ((_value) & (_mask)); \ - } - -/* OCE Attribute Id List */ -#define OCE_ATTR_CAP_INDCATION 101 -#define OCE_ATTR_AP_RSSI_REJCTION 102 /* RSSI-based (Re-)Association*/ -#define OCE_ATTR_AP_REDUCED_WAN 103 /* Reduced WAN Metrics */ -#define OCE_ATTR_AP_RNR_COMPLETE 104 /* RNR Completeness */ -#define OCE_ATTR_STA_PRB_SUP_BSSID 105 /* Probe Suppression BSSIDs */ -#define OCE_ATTR_STA_PRB_SUP_SSID 106 /* Probe Suppression SSIDs */ -#define OCE_WDEV_ATTR_MAX_NUM 107 /* Should be updated according to ID list */ - -/* Element ID */ -#define FILS_REQ_ID_EXTENSION \ - 2 /* FILS Request Parameters Element ID Extension*/ - -/* OCE_ATTR_AP_CAP_INDCATION field value */ -#define OCE_AP_CAP_NOT_SUPPORT 0x0 - -#define IS_OCE_ENABLE(_wdev) ((_wdev)->OceCtrl.bOceEnable == TRUE) -#define IS_OCE_RNR_ENABLE(_wdev) ((_wdev)->OceCtrl.bApRnrCompleteEnable == TRUE) -#define IS_OCE_FD_FRAME_ENABLE(_wdev) ((_wdev)->OceCtrl.bFdFrameEnable == TRUE) -#define VALID_OCE_ATTR_ID(_I) (_I <= OCE_WDEV_ATTR_MAX_NUM) - -#define POLYNOMIAL 0x04c11db7L /* Standard CRC-32 ppolynomial */ - -#define FILS_CACHE_ID_LEN 2 -#define FILS_REALMS_HASH_LEN 2 - -typedef enum { - OCE_FRAME_TYPE_BEACON, - OCE_FRAME_TYPE_PROBE_REQ, - OCE_FRAME_TYPE_PROBE_RSP, - OCE_FRAME_TYPE_ASSOC_REQ, - OCE_FRAME_TYPE_ASSOC_RSP, -} OCE_FRAME_TYPE, - *P_OCE_FRAME_TYPE; - -typedef enum { - OCE_SUCCESS = 0, - OCE_INVALID_ARG, - OCE_RESOURCE_ALLOC_FAIL, - OCE_NOT_INITIALIZED, - OCE_UNEXP, -} OCE_ERR_CODE; - -enum FD_CIPHER_SUITE_TYPE { - FD_CIPHER_WEP40 = 1, - FD_CIPHER_TKIP = 2, - FD_CIPHER_RESERVED = 3, - FD_CIPHER_CCMP128 = 4, - FD_CIPHER_WEP104 = 5, - FD_CIPHER_BIPCMAC128 = 6, - FD_CIPHER_GROUP_TRAFFIC_NOT_ALLOWED = 7, - FD_CIPHER_GCMP128 = 8, - FD_CIPHER_GCMP256 = 9, - FD_CIPHER_CCMP256 = 10, - FD_CIPHER_BIPGMAC128 = 11, - FD_CIPHER_BIPGMAC256 = 12, - FD_CIPHER_BIPCMAC256 = 13, - FD_CIPHER_NO_SELECTED = 63, -}; - -enum FD_AKM_SUITE_TYPE { - FD_AKM_USE_FROM_BCN_PROBERSP = 0, - FD_AKM_FILS_SHA256 = 1, - FD_AKM_FILS_SHA384 = 2, - FD_AKM_FILS_SHA256_SHA384 = 3, - FD_AKM_FT_FILS_SHA384 = 4, - FD_AKM_NO_SELECTED = 63, -}; - -typedef struct GNU_PACKED _FD_CAP_SUB_FIELD { - UCHAR ESS : 1; - UCHAR Privacy : 1; - UCHAR BSSOpChWidth : 3; - UCHAR MaxNumSS : 3; - - UCHAR RESERVED : 1; - UCHAR MBSSIDSPresenceInd : 1; - UCHAR PhyIndex : 3; - UCHAR FILSMinRate : 3; -} FD_CAP_SUB_FIELD, *PFD_CAP_SUB_FIELD; - -typedef struct GNU_PACKED _FD_RSN_INFO { - RSN_CAPABILITIES RSNCap; - - UINT32 GroupDataCipher : 6; - UINT32 GroupMgmtCipher : 6; - UINT32 PairwiseCipher : 6; - UINT32 AKMSuiteSelector : 6; -} FD_RSN_INFO, *PFD_RSN_INFO; - -typedef struct GNU_PACKED _FILS_DIS_FRAME_CTRL { - UCHAR SsidLength : 5; - UCHAR CapPresenceInd : 1; - UCHAR ShortSsidInd : 1; - UCHAR AP_CSNPresenceInd : 1; - - UCHAR ANOPresenceInd : 1; - UCHAR ChCenterFreqSegPresenceInd : 1; - UCHAR PriChPresenceInd : 1; - UCHAR RSNInfoPresenceInd : 1; - UCHAR LengthPresenceInd : 1; - UCHAR MDPresenceInd : 1; - UCHAR AP11bPresent : 1; - UCHAR NonOceAPPresent : 1; -} FILS_DIS_FRAME_CTRL, *PFILS_DIS_FRAME_CTRL; - -typedef struct GNU_PACKED _FILS_INFORMATION { - UCHAR NumOfPublicKeyID : 3; - UCHAR NumOfRealmID : 3; - UCHAR FilsIPConf : 1; - UCHAR CacheIDIncluded : 1; - - UCHAR HESSIDIncluded : 1; - UCHAR FilsSKAuthNoPFS : 1; - UCHAR FilsSKAuthPFS : 1; - UCHAR FilsPublicKeyAuth : 1; - UCHAR RESERVED : 4; -} FILS_INFORMATION, *PFILS_INFORMATION; - -typedef struct _OCE_ATTR_STRUCT { - UCHAR AttrID; - UCHAR AttrLen; - CHAR AttrBody[OCE_ATTR_MAX_LEN]; -} OCE_ATTR_STRUCT, *P_OCE_ATTR_STRUCT; - -typedef struct _OCE_CTRL { - BOOLEAN bOceEnable; - BOOLEAN bFdFrameEnable; - BOOLEAN bApReducedWanEnable; - BOOLEAN bApRnrCompleteEnable; - BOOLEAN bApEspEnable; - BOOLEAN bOceFilsHlpEnable; - - UINT8 OceCapIndication; - UINT8 AvailableCap; /* DL & UL */ - - /* AssocReq Reject */ - UINT8 AssocRetryDelay; - INT8 AssocRSSIThres; - - /* FILS */ - UINT16 FilsRealmsHash; - UINT16 FilsCacheId; - UINT32 FilsDhcpServerIp; - UINT32 FilsDhcpServerPort; - - /* Timer */ - RALINK_TIMER_STRUCT Scan11bOceAPTimer; - BOOLEAN Scan11bOceAPTimerRunning; - RALINK_TIMER_STRUCT MaxChannelTimer; - BOOLEAN MaxChannelTimerRunning; - BOOLEAN MaxChannelTimesUp; - - BOOLEAN ShortSSIDEnabled; - UINT32 ShortSSID; - NDIS_802_11_MAC_ADDRESS OCE_SUPPRES_BSSID_LIST[]; -} OCE_CTRL, *P_OCE_CTRL; - -typedef struct GNU_PACKED _REDUCED_NR_LIST_INFO { - UINT32 ifindex; - UINT32 ValueLen; - UCHAR Value[512]; -} REDUCED_NR_LIST_INFO; - -OCE_ERR_CODE OceInit(PRTMP_ADAPTER pAd); - -OCE_ERR_CODE OceDeInit(PRTMP_ADAPTER pAd, struct wifi_dev *wdev); - -OCE_ERR_CODE OceRelease(PRTMP_ADAPTER pAd); - -OCE_ERR_CODE OceCollectAttribute(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *pEntry, - PUINT8 pAttrLen, PUINT8 pAttrBuf, - UINT8 FrameType); - -VOID OceParseStaOceIE(PRTMP_ADAPTER pAd, UCHAR *buf, UCHAR len, - PEER_PROBE_REQ_PARAM *ProbeReqParam); - -VOID OceTXSHandler(RTMP_ADAPTER *pAd, CHAR *Data); - -void Oce_read_parameters_from_file(IN PRTMP_ADAPTER pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *pBuffer); - -INT oce_build_ies(RTMP_ADAPTER *pAd, struct _build_ie_info *info, - BOOLEAN is_oce_sta); - -BOOLEAN OceCheckOceCap(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, UCHAR *buf, - UCHAR len); - -VOID OceSendFilsDiscoveryAction(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -INT build_rnr_element(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *buf, - UINT8 pos, UCHAR subtype); - -INT build_esp_element(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *buf); - -unsigned long Crcbitbybitfast(unsigned char *p, unsigned long len); - -INT Set_OceRssiThreshold_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT Set_OceAssocRetryDelay_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT Set_OceFdFrameCtrl_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT Set_OceReducedNRIndicate_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT Set_OceDownlinkAvailCap_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT Set_OceUplinkAvailCap_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT Set_OceReducedWanEnable_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT Set_OceEspEnable_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -#endif /* OCE_SUPPORT */ -#endif /* __OCE_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oid.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oid.h deleted file mode 100644 index 68f346accb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oid.h +++ /dev/null @@ -1,2528 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - oid.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ -#ifndef _OID_H_ -#define _OID_H_ - -/*#include */ -#ifdef WAPP_SUPPORT -#include "wapp/wapp_cmm_type.h" -#endif - -/* new types for Media Specific Indications */ -/* Extension channel offset */ -#define EXTCHA_NONE 0 -#define EXTCHA_ABOVE 0x1 -#define EXTCHA_BELOW 0x3 -#define EXTCHA_NOASSIGN 0xf - -/* BW */ -#define BAND_WIDTH_20 0 -#define BAND_WIDTH_40 1 -#define BAND_WIDTH_80 2 -#define BAND_WIDTH_160 3 -#define BAND_WIDTH_10 \ - 4 /* 802.11j has 10MHz. This definition is for internal usage. doesn't fill in the IE or other field. */ -#define BAND_WIDTH_5 5 -#define BAND_WIDTH_8080 6 -#define BAND_WIDTH_BOTH 7 /* BW20 + BW40 */ -#define BAND_WIDTH_25 8 -#define BAND_WIDTH_NUM 9 - -/* SHORTGI */ -#define GAP_INTERVAL_400 1 /* only support in HT mode */ -#define GAP_INTERVAL_800 0 -#define GAP_INTERVAL_BOTH 2 - -#define NdisMediaStateConnected 1 -#define NdisMediaStateDisconnected 0 - -#define NdisApMediaStateConnected 1 -#define NdisApMediaStateDisconnected 0 - -#define NDIS_802_11_LENGTH_SSID 32 - -#define MAC_ADDR_LEN 6 -#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */ -#define IEEE80211_NWID_LEN 32 - -#define NDIS_802_11_LENGTH_RATES 8 -#define NDIS_802_11_LENGTH_RATES_EX 16 - -#define OID_P2P_DEVICE_NAME_LEN 32 -/*#define MAX_NUM_OF_CHS 49 */ /* 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL terminationc */ -/*#define MAX_NUM_OF_CHS 54 */ /* 14 channels @2.4G + 12@UNII(lower/middle) + 16@HiperLAN2 + 11@UNII(upper) + 0 @Japan + 1 as NULL termination */ -#define MAX_NUMBER_OF_EVENT 10 /* entry # in EVENT table */ - -#ifdef BB_SOC -#define MAX_NUMBER_OF_MAC \ - 8 /* if MAX_MBSSID_NUM is 8, this value can't be larger than 211 */ -#else -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || \ - defined(MT7637_FPGA) -#define MAX_NUMBER_OF_MAC \ - 4 /* if MAX_MBSSID_NUM is 8, this value can't be larger than 211 */ -#elif defined(MT7603) || defined(MT7628) -#define MAX_NUMBER_OF_MAC 33 -#elif defined(MT7636) -#define MAX_NUMBER_OF_MAC 14 -#elif defined(MT7637) -#define MAX_NUMBER_OF_MAC 75 /*sync with 7615 fixed value*/ -#elif defined(MT76x2) -#ifdef MAC_REPEATER_SUPPORT /* ((MAX_EXT_MAC_ADDR_SIZE + 1) * MAC_APCLI_NUM) */ -#define MAX_NUMBER_OF_MAC (116 - ((16 + 1) * 1)) -#else -#define MAX_NUMBER_OF_MAC 116 -#endif /* MAC_REPEATER_SUPPORT */ -#else -/* - chip max wtbl idx = 128, - as AP role, need a group key entry. so max it will occupy 16 for 16 mbss. - - max rept entry = 32, - rept need apcli link, 1 for unicast, 1 for broadcast key from rootap. - - so 128 - 32 - 16 - 1 - 1 = 78. -*/ -#define MAX_NUMBER_OF_MAC 75 -#endif /* defined(MT7603_FPGA) || defined(MT7628_FPGA) */ -#endif /* BB_SOC */ - -#define MAX_NUMBER_OF_ACL 128 -#define MAX_LENGTH_OF_SUPPORT_RATES \ - 12 /* 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */ -#define MAX_NUMBER_OF_DLS_ENTRY 4 - -#define RT_QUERY_SIGNAL_CONTEXT 0x0402 -#define RT_SET_IAPP_PID 0x0404 -#define RT_SET_APD_PID 0x0405 -#define RT_SET_DEL_MAC_ENTRY 0x0406 -#define RT_QUERY_EVENT_TABLE 0x0407 -#ifdef DOT11R_FT_SUPPORT -#define RT_SET_FT_STATION_NOTIFY 0x0408 -#define RT_SET_FT_KEY_REQ 0x0409 -#define RT_SET_FT_KEY_RSP 0x040a -#define RT_FT_KEY_SET 0x040b -#define RT_FT_DATA_ENCRYPT 0x040c -#define RT_FT_DATA_DECRYPT 0x040d -#define RT_FT_NEIGHBOR_REPORT 0x040e -#define RT_FT_NEIGHBOR_REQUEST 0x040f -#define RT_FT_NEIGHBOR_RESPONSE 0x0410 -#define RT_FT_ACTION_FORWARD 0x0411 -#endif /* DOT11R_FT_SUPPORT */ -/* */ -/* IEEE 802.11 OIDs */ -/* */ -#define OID_GET_SET_TOGGLE 0x8000 -#define OID_GET_SET_FROM_UI 0x4000 - -#define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0103 -#define OID_802_11_NETWORK_TYPE_IN_USE 0x0104 -#define OID_802_11_RSSI_TRIGGER 0x0107 -#define RT_OID_802_11_RSSI 0x0108 /* rt2860 only */ -#define RT_OID_802_11_RSSI_1 0x0109 /* rt2860 only */ -#define RT_OID_802_11_RSSI_2 0x010A /* rt2860 only */ -#define OID_802_11_NUMBER_OF_ANTENNAS 0x010B -#define OID_802_11_RX_ANTENNA_SELECTED 0x010C -#define OID_802_11_TX_ANTENNA_SELECTED 0x010D -#define OID_802_11_SUPPORTED_RATES 0x010E -#define OID_802_11_ADD_WEP 0x0112 -#define OID_802_11_REMOVE_WEP 0x0113 -#define OID_802_11_DISASSOCIATE 0x0114 -#define OID_802_11_PRIVACY_FILTER 0x0118 -#define OID_802_11_ASSOCIATION_INFORMATION 0x011E -#define OID_802_11_TEST 0x011F - -#define RT_OID_802_11_COUNTRY_REGION 0x0507 -#define OID_802_11_BSSID_LIST_SCAN 0x0508 -#define OID_802_11_SSID 0x0509 -#define OID_802_11_BSSID 0x050A -#define RT_OID_802_11_RADIO 0x050B -#define RT_OID_802_11_PHY_MODE 0x050C -#define RT_OID_802_11_STA_CONFIG 0x050D -#define OID_802_11_DESIRED_RATES 0x050E -#define RT_OID_802_11_PREAMBLE 0x050F -#define OID_802_11_WEP_STATUS 0x0510 -#define OID_802_11_AUTHENTICATION_MODE 0x0511 -#define OID_802_11_INFRASTRUCTURE_MODE 0x0512 -#define RT_OID_802_11_RESET_COUNTERS 0x0513 -#define OID_802_11_RTS_THRESHOLD 0x0514 -#define OID_802_11_FRAGMENTATION_THRESHOLD 0x0515 -#define OID_802_11_POWER_MODE 0x0516 -#define OID_802_11_TX_POWER_LEVEL 0x0517 -#define RT_OID_802_11_ADD_WPA 0x0518 -#define OID_802_11_REMOVE_KEY 0x0519 -#define RT_OID_802_11_QUERY_PID 0x051A -#define RT_OID_802_11_QUERY_VID 0x051B -#define OID_802_11_ADD_KEY 0x0520 -#define OID_802_11_CONFIGURATION 0x0521 -#define OID_802_11_TX_PACKET_BURST 0x0522 -#define RT_OID_802_11_QUERY_NOISE_LEVEL 0x0523 -#define RT_OID_802_11_EXTRA_INFO 0x0524 -#define RT_OID_802_11_HARDWARE_REGISTER 0x0525 -#define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS -#define OID_802_11_DEAUTHENTICATION 0x0526 -#define OID_802_11_DROP_UNENCRYPTED 0x0527 -#define OID_802_11_MIC_FAILURE_REPORT_FRAME 0x0528 -#define OID_802_11_EAP_METHOD 0x0529 -#define OID_802_11_ACL_LIST 0x052A -#define OID_802_11_ACL_ADD_ENTRY 0x052B -#define OID_802_11_ACL_DEL_ENTRY 0x052C -#define OID_802_11_ACL_SET_POLICY 0x052D - -#ifdef VENDOR_FEATURE6_SUPPORT -#define OID_802_11_HT_STBC 0x052E -#define OID_802_11_UAPSD 0x052F -#define OID_802_11_AMSDU 0x0531 -#define OID_802_11_AMPDU 0x0532 -#define OID_802_11_APCFG 0x0533 -#define OID_802_11_ASSOLIST 0x0534 -#define OID_802_11_CURRENT_CRED 0x0535 -#define OID_802_11_PASSPHRASES 0x0536 -#define OID_802_11_CHANNEL_WIDTH 0x0537 -#define OID_802_11_BEACON_PERIOD 0x0538 -#endif /* VENDOR_FEATURE6_SUPPORT */ -#if (defined(VENDOR_FEATURE6_SUPPORT) || defined(CONFIG_MAP_SUPPORT)) -#define OID_802_11_COEXISTENCE 0x0530 -#endif -#ifdef AIR_MONITOR -#define OID_GET_AIR_MONITOR_RESULT 0x1802 -#endif - -/* For 802.1x daemin using */ -#ifdef DOT1X_SUPPORT -#define OID_802_DOT1X_CONFIGURATION 0x0540 -#define OID_802_DOT1X_PMKID_CACHE 0x0541 -#define OID_802_DOT1X_RADIUS_DATA 0x0542 -#define OID_802_DOT1X_WPA_KEY 0x0543 -#define OID_802_DOT1X_STATIC_WEP_COPY 0x0544 -#define OID_802_DOT1X_IDLE_TIMEOUT 0x0545 -#define OID_802_DOT1X_RADIUS_ACL_NEW_CACHE 0x0546 -#define OID_802_DOT1X_RADIUS_ACL_DEL_CACHE 0x0547 -#define OID_802_DOT1X_RADIUS_ACL_CLEAR_CACHE 0x0548 -#define OID_802_DOT1X_QUERY_STA_AID 0x0549 -#ifdef RADIUS_ACCOUNTING_SUPPORT -#define OID_802_DOT1X_QUERY_STA_DATA 0x0550 -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ -#define OID_802_DOT1X_QUERY_STA_RSN 0x0551 -#ifdef OCE_FILS_SUPPORT -#define OID_802_DOT1X_MLME_EVENT 0x0552 -#define OID_802_DOT1X_KEY_EVENT 0x0553 -#define OID_802_DOT1X_RSNE_SYNC 0x0554 -#define OID_802_DOT1X_PMK_CACHE_EVENT 0x0555 -#endif /* OCE_FILS_SUPPORT */ -#endif /* DOT1X_SUPPORT */ - -#define RT_OID_DEVICE_NAME 0x0607 -#define RT_OID_VERSION_INFO 0x0608 -#define OID_802_11_BSSID_LIST 0x0609 -#define OID_802_3_CURRENT_ADDRESS 0x060A -#define OID_GEN_MEDIA_CONNECT_STATUS 0x060B -#define RT_OID_802_11_QUERY_LINK_STATUS 0x060C -#define OID_802_11_RSSI 0x060D -#define OID_802_11_STATISTICS 0x060E -#define OID_GEN_RCV_OK 0x060F -#define OID_GEN_RCV_NO_BUFFER 0x0610 -#define RT_OID_802_11_QUERY_EEPROM_VERSION 0x0611 -#define RT_OID_802_11_QUERY_FIRMWARE_VERSION 0x0612 -#define RT_OID_802_11_QUERY_LAST_RX_RATE 0x0613 -#define RT_OID_802_11_TX_POWER_LEVEL_1 0x0614 -#define RT_OID_802_11_QUERY_PIDVID 0x0615 -/*for WPA_SUPPLICANT_SUPPORT */ -#define OID_SET_COUNTERMEASURES 0x0616 -#define OID_802_11_SET_IEEE8021X 0x0617 -#define OID_802_11_SET_IEEE8021X_REQUIRE_KEY 0x0618 -#define OID_802_11_PMKID 0x0620 -#define RT_OID_WPA_SUPPLICANT_SUPPORT 0x0621 -#define RT_OID_WE_VERSION_COMPILED 0x0622 -#define RT_OID_NEW_DRIVER 0x0623 -#define OID_AUTO_PROVISION_BSSID_LIST 0x0624 -#define RT_OID_WPS_PROBE_REQ_IE 0x0625 - -#define RT_OID_802_11_SNR_0 0x0630 -#define RT_OID_802_11_SNR_1 0x0631 -#define RT_OID_802_11_QUERY_LAST_TX_RATE 0x0632 -#define RT_OID_802_11_QUERY_HT_PHYMODE 0x0633 -#define RT_OID_802_11_SET_HT_PHYMODE 0x0634 -#define OID_802_11_RELOAD_DEFAULTS 0x0635 -#define RT_OID_802_11_QUERY_APSD_SETTING 0x0636 -#define RT_OID_802_11_SET_APSD_SETTING 0x0637 -#define RT_OID_802_11_QUERY_APSD_PSM 0x0638 -#define RT_OID_802_11_SET_APSD_PSM 0x0639 -#define RT_OID_802_11_QUERY_DLS 0x063A -#define RT_OID_802_11_SET_DLS 0x063B -#define RT_OID_802_11_QUERY_DLS_PARAM 0x063C -#define RT_OID_802_11_SET_DLS_PARAM 0x063D -#define RT_OID_802_11_QUERY_WMM 0x063E -#define RT_OID_802_11_SET_WMM 0x063F -#define RT_OID_802_11_QUERY_IMME_BA_CAP 0x0640 -#define RT_OID_802_11_SET_IMME_BA_CAP 0x0641 -#define RT_OID_802_11_QUERY_BATABLE 0x0642 -#define RT_OID_802_11_ADD_IMME_BA 0x0643 -#define RT_OID_802_11_TEAR_IMME_BA 0x0644 -#define RT_OID_DRIVER_DEVICE_NAME 0x0645 -#define RT_OID_802_11_QUERY_DAT_HT_PHYMODE 0x0646 -#define OID_WAPP_EVENT 0x0647 -#define OID_802_11_SET_PSPXLINK_MODE 0x0648 -/*+++ add by woody +++*/ -#define OID_802_11_SET_PASSPHRASE 0x0649 -#define RT_OID_802_11_QUERY_TX_PHYMODE 0x0650 -#define RT_OID_802_11_QUERY_MAP_REAL_TX_RATE 0x0678 -#define RT_OID_802_11_QUERY_MAP_REAL_RX_RATE 0x0679 -#define RT_OID_802_11_SNR_2 0x067A -#ifdef TXBF_SUPPORT -#define RT_OID_802_11_QUERY_TXBF_TABLE 0x067C -#endif -#define RT_OID_802_11_PER_BSS_STATISTICS 0x067D - -#define OID_802_11_VENDOR_IE_ADD 0x067E -#define OID_802_11_VENDOR_IE_UPDATE 0x067F -#define OID_802_11_VENDOR_IE_REMOVE 0x0680 -#define OID_802_11_VENDOR_IE_SHOW 0x0681 - -#ifdef ACL_BLK_COUNT_SUPPORT -#define OID_802_11_ACL_BLK_REJCT_COUNT_STATICS 0x069b -#endif /*ACL_BLK_COUNT_SUPPORT*/ - -#ifdef RTMP_RBUS_SUPPORT -#define OID_802_11_QUERY_WirelessMode 0x0718 -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef CUSTOMER_VENDOR_IE_SUPPORT -/*vendor ie oid: 0x1200~0x12ff*/ -#define OID_VENDOR_IE_BASE 0x1200 -enum vendor_ie_subcmd_oid { - OID_SUBCMD_AP_VENDOR_IE_SET, - OID_SUBCMD_AP_VENDOR_IE_DEL, - - NUM_OID_SUBCMD_VENDOR_IE, - MAX_NUM_OID_SUBCMD_VENDOR_IE = NUM_OID_SUBCMD_VENDOR_IE - 1 -}; - -#define OID_AP_VENDOR_IE_SET \ - (OID_VENDOR_IE_BASE | OID_SUBCMD_AP_VENDOR_IE_SET) /*0x1200*/ -#define OID_AP_VENDOR_IE_DEL (OID_VENDOR_IE_BASE | OID_SUBCMD_AP_VENDOR_IE_DEL) -#define RT_OID_AP_VENDOR_IE_SET \ - (OID_GET_SET_TOGGLE | OID_AP_VENDOR_IE_SET) /*0x9200*/ -#define RT_OID_AP_VENDOR_IE_DEL (OID_GET_SET_TOGGLE | OID_AP_VENDOR_IE_DEL) - -#define OID_SET_OUI_FILTER 0x1220 /**/ -#define RT_OID_SET_OUI_FILTER \ - (OID_GET_SET_TOGGLE | OID_SET_OUI_FILTER) /*0x9220*/ - -#define RT_PROBE_REQ_REPORT_EVENT 0x1700 - -#endif /* CUSTOMER_VENDOR_IE_SUPPORT */ - -#ifdef HOSTAPD_SUPPORT -#define SIOCSIWGENIE 0x8B30 -#define OID_HOSTAPD_SUPPORT 0x0661 - -#define HOSTAPD_OID_STATIC_WEP_COPY 0x0662 -#define HOSTAPD_OID_GET_1X_GROUP_KEY 0x0663 - -#define HOSTAPD_OID_SET_STA_AUTHORIZED 0x0664 -#define HOSTAPD_OID_SET_STA_DISASSOC 0x0665 -#define HOSTAPD_OID_SET_STA_DEAUTH 0x0666 -#define HOSTAPD_OID_DEL_KEY 0x0667 -#define HOSTAPD_OID_SET_KEY 0x0668 -#define HOSTAPD_OID_SET_802_1X 0x0669 -#define HOSTAPD_OID_GET_SEQ 0x0670 -#define HOSTAPD_OID_GETWPAIE 0x0671 -#define HOSTAPD_OID_COUNTERMEASURES 0x0672 -#define HOSTAPD_OID_SET_WPAPSK 0x0673 -#define HOSTAPD_OID_SET_WPS_BEACON_IE 0x0674 -#define HOSTAPD_OID_SET_WPS_PROBE_RESP_IE 0x0675 - -#define RT_HOSTAPD_OID_HOSTAPD_SUPPORT \ - (OID_GET_SET_TOGGLE | OID_HOSTAPD_SUPPORT) -#define RT_HOSTAPD_OID_STATIC_WEP_COPY \ - (OID_GET_SET_TOGGLE | HOSTAPD_OID_STATIC_WEP_COPY) -#define RT_HOSTAPD_OID_GET_1X_GROUP_KEY \ - (OID_GET_SET_TOGGLE | HOSTAPD_OID_GET_1X_GROUP_KEY) -#define RT_HOSTAPD_OID_SET_STA_AUTHORIZED \ - (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_STA_AUTHORIZED) -#define RT_HOSTAPD_OID_SET_STA_DISASSOC \ - (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_STA_DISASSOC) -#define RT_HOSTAPD_OID_SET_STA_DEAUTH \ - (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_STA_DEAUTH) -#define RT_HOSTAPD_OID_DEL_KEY (OID_GET_SET_TOGGLE | HOSTAPD_OID_DEL_KEY) -#define RT_HOSTAPD_OID_SET_KEY (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_KEY) -#define RT_HOSTAPD_OID_SET_802_1X (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_802_1X) -#define RT_HOSTAPD_OID_COUNTERMEASURES \ - (OID_GET_SET_TOGGLE | HOSTAPD_OID_COUNTERMEASURES) -#define RT_HOSTAPD_OID_SET_WPAPSK (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_WPAPSK) -#define RT_HOSTAPD_OID_SET_WPS_BEACON_IE \ - (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_WPS_BEACON_IE) -#define RT_HOSTAPD_OID_SET_WPS_PROBE_RESP_IE \ - (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_WPS_PROBE_RESP_IE) - -#define IEEE80211_IS_MULTICAST(_a) (*(_a)&0x01) -#define IEEE80211_KEYBUF_SIZE 16 -#define IEEE80211_MICBUF_SIZE (8 + 8) /* space for both tx+rx keys */ -#define IEEE80211_TID_SIZE 17 /* total number of TIDs */ - -#define IEEE80211_MLME_ASSOC 1 /* associate station */ -#define IEEE80211_MLME_DISASSOC 2 /* disassociate station */ -#define IEEE80211_MLME_DEAUTH 3 /* deauthenticate station */ -#define IEEE80211_MLME_AUTHORIZE 4 /* authorize station */ -#define IEEE80211_MLME_UNAUTHORIZE 5 /* unauthorize station */ -#define IEEE80211_MLME_CLEAR_STATS 6 /* clear station statistic */ -#define IEEE80211_1X_COPY_KEY 7 /* copy static-wep unicast key */ - -#define IEEE80211_MAX_OPT_IE 256 -#define IWEVEXPIRED 0x8C04 - -struct ieee80211req_mlme { - UINT8 im_op; /* operation to perform */ - UINT8 im_ssid_len; /* length of optional ssid */ - UINT16 im_reason; /* 802.11 reason code */ - UINT8 im_macaddr[IEEE80211_ADDR_LEN]; - UINT8 im_ssid[IEEE80211_NWID_LEN]; -}; - -struct ieee80211req_key { - UINT8 ik_type; /* key/cipher type */ - UINT8 ik_pad; - UINT16 ik_keyix; /* key index */ - UINT8 ik_keylen; /* key length in bytes */ - UINT8 ik_flags; - UINT8 ik_macaddr[IEEE80211_ADDR_LEN]; - UINT64 ik_keyrsc; /* key receive sequence counter */ - UINT64 ik_keytsc; /* key transmit sequence counter */ - UINT8 ik_keydata[IEEE80211_KEYBUF_SIZE + IEEE80211_MICBUF_SIZE]; - int txkey; -}; - -struct ieee80211req_del_key { - UINT8 idk_keyix; /* key index */ - UINT8 idk_macaddr[IEEE80211_ADDR_LEN]; -}; - -struct default_group_key { - UINT16 ik_keyix; /* key index */ - UINT8 ik_keylen; /* key length in bytes */ - UINT8 ik_keydata[IEEE80211_KEYBUF_SIZE + IEEE80211_MICBUF_SIZE]; -}; - -struct ieee80211req_wpaie { - UINT8 wpa_macaddr[IEEE80211_ADDR_LEN]; - UINT8 rsn_ie[IEEE80211_MAX_OPT_IE]; -}; - -struct hostapd_wpa_psk { - struct hostapd_wpa_psk *next; - int group; - UCHAR psk[32]; - UCHAR addr[6]; -}; - -#endif /*HOSTAPD_SUPPORT */ - -#define RT_OID_802_11_QUERY_TDLS_PARAM 0x0676 -#define RT_OID_802_11_QUERY_TDLS 0x0677 - -/* Ralink defined OIDs */ -/* Dennis Lee move to platform specific */ - -#define RT_OID_802_11_BSSID (OID_GET_SET_TOGGLE | OID_802_11_BSSID) -#define RT_OID_802_11_SSID (OID_GET_SET_TOGGLE | OID_802_11_SSID) -#define RT_OID_802_11_INFRASTRUCTURE_MODE \ - (OID_GET_SET_TOGGLE | OID_802_11_INFRASTRUCTURE_MODE) -#define RT_OID_802_11_ADD_WEP (OID_GET_SET_TOGGLE | OID_802_11_ADD_WEP) -#define RT_OID_802_11_ADD_KEY (OID_GET_SET_TOGGLE | OID_802_11_ADD_KEY) -#define RT_OID_802_11_REMOVE_WEP (OID_GET_SET_TOGGLE | OID_802_11_REMOVE_WEP) -#define RT_OID_802_11_REMOVE_KEY (OID_GET_SET_TOGGLE | OID_802_11_REMOVE_KEY) -#define RT_OID_802_11_DISASSOCIATE \ - (OID_GET_SET_TOGGLE | OID_802_11_DISASSOCIATE) -#define RT_OID_802_11_AUTHENTICATION_MODE \ - (OID_GET_SET_TOGGLE | OID_802_11_AUTHENTICATION_MODE) -#define RT_OID_802_11_PRIVACY_FILTER \ - (OID_GET_SET_TOGGLE | OID_802_11_PRIVACY_FILTER) -#define RT_OID_802_11_BSSID_LIST_SCAN \ - (OID_GET_SET_TOGGLE | OID_802_11_BSSID_LIST_SCAN) -#define RT_OID_802_11_WEP_STATUS (OID_GET_SET_TOGGLE | OID_802_11_WEP_STATUS) -#define RT_OID_802_11_RELOAD_DEFAULTS \ - (OID_GET_SET_TOGGLE | OID_802_11_RELOAD_DEFAULTS) -#define RT_OID_802_11_NETWORK_TYPE_IN_USE \ - (OID_GET_SET_TOGGLE | OID_802_11_NETWORK_TYPE_IN_USE) -#define RT_OID_802_11_TX_POWER_LEVEL \ - (OID_GET_SET_TOGGLE | OID_802_11_TX_POWER_LEVEL) -#define RT_OID_802_11_RSSI_TRIGGER \ - (OID_GET_SET_TOGGLE | OID_802_11_RSSI_TRIGGER) -#define RT_OID_802_11_FRAGMENTATION_THRESHOLD \ - (OID_GET_SET_TOGGLE | OID_802_11_FRAGMENTATION_THRESHOLD) -#define RT_OID_802_11_RTS_THRESHOLD \ - (OID_GET_SET_TOGGLE | OID_802_11_RTS_THRESHOLD) -#define RT_OID_802_11_RX_ANTENNA_SELECTED \ - (OID_GET_SET_TOGGLE | OID_802_11_RX_ANTENNA_SELECTED) -#define RT_OID_802_11_TX_ANTENNA_SELECTED \ - (OID_GET_SET_TOGGLE | OID_802_11_TX_ANTENNA_SELECTED) -#define RT_OID_802_11_SUPPORTED_RATES \ - (OID_GET_SET_TOGGLE | OID_802_11_SUPPORTED_RATES) -#define RT_OID_802_11_DESIRED_RATES \ - (OID_GET_SET_TOGGLE | OID_802_11_DESIRED_RATES) -#define RT_OID_802_11_CONFIGURATION \ - (OID_GET_SET_TOGGLE | OID_802_11_CONFIGURATION) -#define RT_OID_802_11_POWER_MODE (OID_GET_SET_TOGGLE | OID_802_11_POWER_MODE) -#define RT_OID_802_11_SET_PSPXLINK_MODE \ - (OID_GET_SET_TOGGLE | OID_802_11_SET_PSPXLINK_MODE) -#define RT_OID_802_11_EAP_METHOD (OID_GET_SET_TOGGLE | OID_802_11_EAP_METHOD) -#define RT_OID_802_11_SET_PASSPHRASE \ - (OID_GET_SET_TOGGLE | OID_802_11_SET_PASSPHRASE) - -#ifdef DOT1X_SUPPORT -#define RT_OID_802_DOT1X_PMKID_CACHE \ - (OID_GET_SET_TOGGLE | OID_802_DOT1X_PMKID_CACHE) -#define RT_OID_802_DOT1X_RADIUS_DATA \ - (OID_GET_SET_TOGGLE | OID_802_DOT1X_RADIUS_DATA) -#define RT_OID_802_DOT1X_WPA_KEY (OID_GET_SET_TOGGLE | OID_802_DOT1X_WPA_KEY) -#define RT_OID_802_DOT1X_STATIC_WEP_COPY \ - (OID_GET_SET_TOGGLE | OID_802_DOT1X_STATIC_WEP_COPY) -#define RT_OID_802_DOT1X_IDLE_TIMEOUT \ - (OID_GET_SET_TOGGLE | OID_802_DOT1X_IDLE_TIMEOUT) -#endif /* DOT1X_SUPPORT */ - -#define RT_OID_802_11_SET_TDLS_PARAM \ - (OID_GET_SET_TOGGLE | RT_OID_802_11_QUERY_TDLS_PARAM) -#define RT_OID_802_11_SET_TDLS (OID_GET_SET_TOGGLE | RT_OID_802_11_QUERY_TDLS) - -typedef enum _NDIS_802_11_STATUS_TYPE { - Ndis802_11StatusType_Authentication, - Ndis802_11StatusType_MediaStreamMode, - Ndis802_11StatusType_PMKID_CandidateList, - Ndis802_11StatusTypeMax /* not a real type, defined as an upper bound */ -} NDIS_802_11_STATUS_TYPE, - *PNDIS_802_11_STATUS_TYPE; - -typedef UCHAR NDIS_802_11_MAC_ADDRESS[6]; - -typedef struct _NDIS_802_11_STATUS_INDICATION { - NDIS_802_11_STATUS_TYPE StatusType; -} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; - -/* mask for authentication/integrity fields */ -#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f - -#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 -#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 -#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 -#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E - -typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST { - ULONG Length; /* Length of structure */ - NDIS_802_11_MAC_ADDRESS Bssid; - ULONG Flags; -} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; - -/*Added new types for PMKID Candidate lists. */ -typedef struct _PMKID_CANDIDATE { - NDIS_802_11_MAC_ADDRESS BSSID; - ULONG Flags; -} PMKID_CANDIDATE, *PPMKID_CANDIDATE; - -typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST { - ULONG Version; /* Version of the structure */ - ULONG NumCandidates; /* No. of pmkid candidates */ - PMKID_CANDIDATE CandidateList[1]; -} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST; - -/*Flags for PMKID Candidate list structure */ -#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED 0x01 - -/* Added new types for OFDM 5G and 2.4G */ -typedef enum _NDIS_802_11_NETWORK_TYPE { - Ndis802_11FH, - Ndis802_11DS, - Ndis802_11OFDM5, - Ndis802_11OFDM24, - Ndis802_11Automode, - Ndis802_11OFDM5_N, - Ndis802_11OFDM24_N, - Ndis802_11OFDM5_AC, - Ndis802_11NetworkTypeMax /* not a real type, defined as an upper bound */ -} NDIS_802_11_NETWORK_TYPE, - *PNDIS_802_11_NETWORK_TYPE; - -typedef struct _NDIS_802_11_NETWORK_TYPE_LIST { - UINT NumberOfItems; /* in list below, at least 1 */ - NDIS_802_11_NETWORK_TYPE NetworkType[1]; -} NDIS_802_11_NETWORK_TYPE_LIST, *PNDIS_802_11_NETWORK_TYPE_LIST; - -typedef enum _NDIS_802_11_POWER_MODE { - Ndis802_11PowerModeCAM, - Ndis802_11PowerModeMAX_PSP, - Ndis802_11PowerModeFast_PSP, - Ndis802_11PowerModeLegacy_PSP, - Ndis802_11PowerModeMax /* not a real mode, defined as an upper bound */ -} NDIS_802_11_POWER_MODE, - *PNDIS_802_11_POWER_MODE; - -typedef ULONG NDIS_802_11_TX_POWER_LEVEL; /* in milliwatts */ - -/* */ -/* Received Signal Strength Indication */ -/* */ -typedef LONG NDIS_802_11_RSSI; /* in dBm */ - -typedef struct _NDIS_802_11_CONFIGURATION_FH { - ULONG Length; /* Length of structure */ - ULONG HopPattern; /* As defined by 802.11, MSB set */ - ULONG HopSet; /* to one if non-802.11 */ - ULONG DwellTime; /* units are Kusec */ -} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; - -typedef struct _NDIS_802_11_CONFIGURATION { - ULONG Length; /* Length of structure */ - ULONG BeaconPeriod; /* units are Kusec */ - ULONG ATIMWindow; /* units are Kusec */ - ULONG DSConfig; /* Frequency, units are kHz */ - NDIS_802_11_CONFIGURATION_FH FHConfig; -} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; - -typedef struct _NDIS_802_11_STATISTICS { - ULONG Length; /* Length of structure */ - LARGE_INTEGER TransmittedFragmentCount; - LARGE_INTEGER MulticastTransmittedFrameCount; - LARGE_INTEGER FailedCount; - LARGE_INTEGER RetryCount; - LARGE_INTEGER MultipleRetryCount; - LARGE_INTEGER RTSSuccessCount; - LARGE_INTEGER RTSFailureCount; - LARGE_INTEGER ACKFailureCount; - LARGE_INTEGER FrameDuplicateCount; - LARGE_INTEGER ReceivedFragmentCount; - LARGE_INTEGER MulticastReceivedFrameCount; - LARGE_INTEGER FCSErrorCount; - LARGE_INTEGER TransmittedFrameCount; - LARGE_INTEGER WEPUndecryptableCount; - LARGE_INTEGER TKIPLocalMICFailures; - LARGE_INTEGER TKIPRemoteMICErrors; - LARGE_INTEGER TKIPICVErrors; - LARGE_INTEGER TKIPCounterMeasuresInvoked; - LARGE_INTEGER TKIPReplays; - LARGE_INTEGER CCMPFormatErrors; - LARGE_INTEGER CCMPReplays; - LARGE_INTEGER CCMPDecryptErrors; - LARGE_INTEGER FourWayHandshakeFailures; -} NDIS_802_11_STATISTICS, *PNDIS_802_11_STATISTICS; - -typedef struct _MBSS_STATISTICS { - LONG TxCount; - ULONG RxCount; - ULONG ReceivedByteCount; - ULONG TransmittedByteCount; - ULONG RxErrorCount; - ULONG RxDropCount; - ULONG TxErrorCount; - ULONG TxDropCount; - ULONG ucPktsTx; - ULONG ucPktsRx; - ULONG mcPktsTx; - ULONG mcPktsRx; - ULONG bcPktsTx; - ULONG bcPktsRx; -} MBSS_STATISTICS, *PMBSS_STATISTICS; - -typedef ULONG NDIS_802_11_KEY_INDEX; -typedef ULONGLONG NDIS_802_11_KEY_RSC; - -#ifdef DOT1X_SUPPORT -#define MAX_RADIUS_SRV_NUM 2 /* 802.1x failover number */ -#ifdef VENDOR_FEATURE7_SUPPORT -#define MAX_MBSSID_1X_NUM 8 -#else -#define MAX_MBSSID_1X_NUM 16 -#endif -/* The dot1x related structure. - It's used to communicate with DOT1X daemon */ -typedef struct GNU_PACKED _RADIUS_SRV_INFO { - UINT32 radius_ip; - UINT32 radius_port; - UCHAR radius_key[64]; - UCHAR radius_key_len; -} RADIUS_SRV_INFO, *PRADIUS_SRV_INFO; - -typedef struct GNU_PACKED _DOT1X_BSS_INFO { - UCHAR radius_srv_num; - RADIUS_SRV_INFO radius_srv_info[MAX_RADIUS_SRV_NUM]; - UCHAR ieee8021xWEP; /* dynamic WEP */ - UCHAR key_index; - UCHAR key_length; /* length of key in bytes */ - UCHAR key_material[13]; - UCHAR nasId[IFNAMSIZ]; - UCHAR nasId_len; -} DOT1X_BSS_INFO, *PDOT1X_BSS_INFO; - -#ifdef RADIUS_ACCOUNTING_SUPPORT -typedef struct GNU_PACKED _ACCT_BSS_INFO { - unsigned char radius_srv_num; - RADIUS_SRV_INFO radius_srv_info[MAX_RADIUS_SRV_NUM]; - /* int radius_request_cui; */ - int radius_acct_authentic; - int acct_interim_interval; - int acct_enable; -} ACCT_BSS_INFO, *PACCT_BSS_INFO; -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ - -typedef struct GNU_PACKED _DOT1X_CMM_CONF { - UINT32 Length; /* Length of this structure */ - UCHAR mbss_num; /* indicate multiple BSS number */ - UINT32 own_ip_addr; - UINT32 own_radius_port; - UINT32 retry_interval; - UINT32 session_timeout_interval; - UINT32 quiet_interval; - UCHAR EAPifname[MAX_MBSSID_1X_NUM][IFNAMSIZ]; - UCHAR EAPifname_len[MAX_MBSSID_1X_NUM]; - UCHAR PreAuthifname[MAX_MBSSID_1X_NUM][IFNAMSIZ]; - UCHAR PreAuthifname_len[MAX_MBSSID_1X_NUM]; - DOT1X_BSS_INFO Dot1xBssInfo[MAX_MBSSID_1X_NUM]; -#ifdef RADIUS_ACCOUNTING_SUPPORT - ACCT_BSS_INFO AcctBssInfo[MAX_MBSSID_1X_NUM]; -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ -#ifdef RADIUS_MAC_ACL_SUPPORT - UCHAR RadiusAclEnable[MAX_MBSSID_1X_NUM]; - UINT32 AclCacheTimeout[MAX_MBSSID_1X_NUM]; -#endif /* RADIUS_MAC_ACL_SUPPORT */ -} DOT1X_CMM_CONF, *PDOT1X_CMM_CONF; - -typedef struct GNU_PACKED _DOT1X_IDLE_TIMEOUT { - UCHAR StaAddr[6]; - UINT32 idle_timeout; -} DOT1X_IDLE_TIMEOUT, *PDOT1X_IDLE_TIMEOUT; - -typedef struct GNU_PACKED _DOT1X_QUERY_STA_AID { - UCHAR StaAddr[MAC_ADDR_LEN]; - UINT aid; - UINT wcid; -} DOT1X_QUERY_STA_AID, *PDOT1X_QUERY_STA_AID; - -struct GNU_PACKED DOT1X_QUERY_STA_RSN { - UCHAR sta_addr[MAC_ADDR_LEN]; - UINT32 akm; - UINT32 pairwise_cipher; - UINT32 group_cipher; - UINT32 group_mgmt_cipher; -}; - -#ifdef RADIUS_ACCOUNTING_SUPPORT -typedef struct GNU_PACKED _DOT1X_QUERY_STA_DATA { - UCHAR StaAddr[MAC_ADDR_LEN]; - unsigned long rx_packets; - unsigned long tx_packets; - unsigned long rx_bytes; - unsigned long tx_bytes; -} DOT1X_QUERY_STA_DATA, *PDOT1X_QUERY_STA_DATA; -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ -#endif /* DOT1X_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -typedef struct _NDIS_AP_802_11_KEY { - UINT Length; /* Length of this structure */ - UCHAR addr[6]; - UINT KeyIndex; - UINT KeyLength; /* length of key in bytes */ - UCHAR KeyMaterial[1]; /* variable length depending on above field */ -} NDIS_AP_802_11_KEY, *PNDIS_AP_802_11_KEY; -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef APCLI_SUPPORT -#endif /* APCLI_SUPPORT */ - -typedef struct _NDIS_802_11_REMOVE_KEY { - UINT Length; /* Length of this structure */ - UINT KeyIndex; - NDIS_802_11_MAC_ADDRESS BSSID; -} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; - -typedef struct _NDIS_802_11_WEP { - UINT Length; /* Length of this structure */ - UINT KeyIndex; /* 0 is the per-client key, 1-N are the */ - /* global keys */ - UINT KeyLength; /* length of key in bytes */ - UCHAR KeyMaterial[1]; /* variable length depending on above field */ -} NDIS_802_11_WEP, *PNDIS_802_11_WEP; - -/* Add new authentication modes */ -typedef enum _NDIS_802_11_AUTHENTICATION_MODE { - Ndis802_11AuthModeOpen, - Ndis802_11AuthModeShared, - Ndis802_11AuthModeAutoSwitch, - Ndis802_11AuthModeWPA, - Ndis802_11AuthModeWPAPSK, - Ndis802_11AuthModeWPANone, - Ndis802_11AuthModeWPA2, - Ndis802_11AuthModeWPA2PSK, - Ndis802_11AuthModeWPA1WPA2, - Ndis802_11AuthModeWPA1PSKWPA2PSK, - Ndis802_11AuthModeMax /* Not a real mode, defined as upper bound */ -} NDIS_802_11_AUTHENTICATION_MODE, - *PNDIS_802_11_AUTHENTICATION_MODE; - -typedef UCHAR - NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; /* Set of 8 data rates */ -typedef UCHAR NDIS_802_11_RATES_EX - [NDIS_802_11_LENGTH_RATES_EX]; /* Set of 16 data rates */ -typedef struct GNU_PACKED _NDIS80211PSK { - UINT WPAKeyLen; - UCHAR WPAKey[64]; -} NDIS80211PSK; -#ifndef WAPP_SUPPORT -typedef struct GNU_PACKED _NDIS_802_11_SSID { - UINT SsidLength; /* length of SSID field below, in bytes; */ - /* this can be zero. */ - UCHAR Ssid[NDIS_802_11_LENGTH_SSID]; /* SSID information field */ -} NDIS_802_11_SSID, *PNDIS_802_11_SSID; -#endif -typedef struct GNU_PACKED _NDIS_WLAN_BSSID { - ULONG Length; /* Length of this structure */ - NDIS_802_11_MAC_ADDRESS MacAddress; /* BSSID */ - UCHAR Reserved[2]; - NDIS_802_11_SSID Ssid; /* SSID */ - ULONG Privacy; /* WEP encryption requirement */ - NDIS_802_11_RSSI Rssi; /* receive signal strength in dBm */ - NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; - NDIS_802_11_CONFIGURATION Configuration; - NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; - NDIS_802_11_RATES SupportedRates; -} NDIS_WLAN_BSSID, *PNDIS_WLAN_BSSID; - -typedef struct GNU_PACKED _NDIS_802_11_BSSID_LIST { - UINT NumberOfItems; /* in list below, at least 1 */ - NDIS_WLAN_BSSID Bssid[1]; -} NDIS_802_11_BSSID_LIST, *PNDIS_802_11_BSSID_LIST; - -typedef struct { - BOOLEAN bValid; /* 1: variable contains valid value */ - USHORT StaNum; - UCHAR ChannelUtilization; - USHORT RemainingAdmissionControl; /* in unit of 32-us */ -} QBSS_LOAD_UI, *PQBSS_LOAD_UI; - -/* Added Capabilities, IELength and IEs for each BSSID */ -typedef struct GNU_PACKED _NDIS_WLAN_BSSID_EX { - ULONG Length; /* Length of this structure */ - NDIS_802_11_MAC_ADDRESS MacAddress; /* BSSID */ - UCHAR WpsAP; /* 0x00: not support WPS, 0x01: support normal WPS, 0x02: support Ralink auto WPS, 0x04: support Samsung WAC */ - CHAR MinSNR; - NDIS_802_11_SSID Ssid; /* SSID */ - UINT Privacy; /* WEP encryption requirement */ - NDIS_802_11_RSSI Rssi; /* receive signal */ - /* strength in dBm */ - NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; - NDIS_802_11_CONFIGURATION Configuration; - NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; - NDIS_802_11_RATES_EX SupportedRates; - ULONG IELength; - UCHAR IEs[1]; -} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; - -typedef struct GNU_PACKED _NDIS_802_11_BSSID_LIST_EX { - UINT NumberOfItems; /* in list below, at least 1 */ - NDIS_WLAN_BSSID_EX Bssid[1]; -} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; - -typedef struct GNU_PACKED _NDIS_802_11_FIXED_IEs { - UCHAR Timestamp[8]; - USHORT BeaconInterval; - USHORT Capabilities; -} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; - -typedef struct _NDIS_802_11_VARIABLE_IEs { - UCHAR ElementID; - UCHAR Length; /* Number of bytes in data field */ - UCHAR data[1]; -} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; - -typedef ULONG NDIS_802_11_FRAGMENTATION_THRESHOLD; - -typedef ULONG NDIS_802_11_RTS_THRESHOLD; - -typedef ULONG NDIS_802_11_ANTENNA; - -typedef enum _NDIS_802_11_PRIVACY_FILTER { - Ndis802_11PrivFilterAcceptAll, - Ndis802_11PrivFilter8021xWEP -} NDIS_802_11_PRIVACY_FILTER, - *PNDIS_802_11_PRIVACY_FILTER; - -/* Added new encryption types */ -/* Also aliased typedef to new name */ -typedef enum _NDIS_802_11_WEP_STATUS { - Ndis802_11WEPEnabled, - Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, - Ndis802_11WEPDisabled, - Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, - Ndis802_11WEPKeyAbsent, - Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, - Ndis802_11WEPNotSupported, - Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, - Ndis802_11TKIPEnable, - Ndis802_11Encryption2Enabled = Ndis802_11TKIPEnable, - Ndis802_11Encryption2KeyAbsent, - Ndis802_11AESEnable, - Ndis802_11Encryption3Enabled = Ndis802_11AESEnable, - Ndis802_11CCMP256Enable, - Ndis802_11GCMP128Enable, - Ndis802_11GCMP256Enable, - Ndis802_11Encryption3KeyAbsent, - Ndis802_11TKIPAESMix, - Ndis802_11Encryption4Enabled = - Ndis802_11TKIPAESMix, /* TKIP or AES mix */ - Ndis802_11Encryption4KeyAbsent, - Ndis802_11GroupWEP40Enabled, - Ndis802_11GroupWEP104Enabled, -} NDIS_802_11_WEP_STATUS, - *PNDIS_802_11_WEP_STATUS, NDIS_802_11_ENCRYPTION_STATUS, - *PNDIS_802_11_ENCRYPTION_STATUS; - -typedef enum _NDIS_802_11_RELOAD_DEFAULTS { - Ndis802_11ReloadWEPKeys -} NDIS_802_11_RELOAD_DEFAULTS, - *PNDIS_802_11_RELOAD_DEFAULTS; - -#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 -#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 -#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 - -#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 -#define NDIS_802_11_AI_RESFI_STATUSCODE 2 -#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 - -typedef struct _NDIS_802_11_AI_REQFI { - USHORT Capabilities; - USHORT ListenInterval; - NDIS_802_11_MAC_ADDRESS CurrentAPAddress; -} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; - -typedef struct _NDIS_802_11_AI_RESFI { - USHORT Capabilities; - USHORT StatusCode; - USHORT AssociationId; -} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; - -typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION { - ULONG Length; - USHORT AvailableRequestFixedIEs; - NDIS_802_11_AI_REQFI RequestFixedIEs; - ULONG RequestIELength; - ULONG OffsetRequestIEs; - USHORT AvailableResponseFixedIEs; - NDIS_802_11_AI_RESFI ResponseFixedIEs; - ULONG ResponseIELength; - ULONG OffsetResponseIEs; -} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; - -typedef struct _NDIS_802_11_AUTHENTICATION_EVENT { - NDIS_802_11_STATUS_INDICATION Status; - NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; -} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; - -/* -typedef struct _NDIS_802_11_TEST -{ - ULONG Length; - ULONG Type; - union - { - NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; - NDIS_802_11_RSSI RssiTrigger; - }; -} NDIS_802_11_TEST, *PNDIS_802_11_TEST; - */ - -/* 802.11 Media stream constraints, associated with OID_802_11_MEDIA_STREAM_MODE */ -typedef enum _NDIS_802_11_MEDIA_STREAM_MODE { - Ndis802_11MediaStreamOff, - Ndis802_11MediaStreamOn, -} NDIS_802_11_MEDIA_STREAM_MODE, - *PNDIS_802_11_MEDIA_STREAM_MODE; - -/* PMKID Structures */ -typedef UCHAR NDIS_802_11_PMKID_VALUE[16]; -#define INVALID_PMKID_IDX -1 - -#if defined(CONFIG_STA_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT) || \ - defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) -typedef struct _BSSID_INFO { - NDIS_802_11_MAC_ADDRESS BSSID; - NDIS_802_11_PMKID_VALUE PMKID; - UCHAR PMK[LEN_MAX_PMK]; -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - BOOLEAN Valid; -#endif -} BSSID_INFO, *PBSSID_INFO; - -typedef struct _NDIS_802_11_PMKID { - UINT Length; - UINT BSSIDInfoCount; - BSSID_INFO BSSIDInfo[1]; -} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID; -#endif /* defined(CONFIG_STA_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT) */ - -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#endif /* APCLI_SUPPORT */ - -typedef struct _AP_BSSID_INFO { - UCHAR Mbssidx; - NDIS_802_11_MAC_ADDRESS MAC; - NDIS_802_11_PMKID_VALUE PMKID; - UCHAR PMK[LEN_MAX_PMK]; - ULONG RefreshTime; - BOOLEAN Valid; -} AP_BSSID_INFO, *PAP_BSSID_INFO; - -#define MAX_PMKID_COUNT 128 -typedef struct _NDIS_AP_802_11_PMKID { - AP_BSSID_INFO BSSIDInfo[MAX_PMKID_COUNT]; -} NDIS_AP_802_11_PMKID, *PNDIS_AP_802_11_PMKID; -#endif /* CONFIG_AP_SUPPORT */ - -typedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION { - NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; - NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported; -} NDIS_802_11_AUTHENTICATION_ENCRYPTION, - *PNDIS_802_11_AUTHENTICATION_ENCRYPTION; - -typedef struct _NDIS_802_11_CAPABILITY { - ULONG Length; - ULONG Version; - ULONG NoOfPMKIDs; - ULONG NoOfAuthEncryptPairsSupported; - - NDIS_802_11_AUTHENTICATION_ENCRYPTION - AuthenticationEncryptionSupported[1]; -} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY; - -#ifdef DBG -/* - When use private ioctl oid get/set the configuration, we can use following flags to provide specific rules when handle the cmd - */ -#define RTPRIV_IOCTL_FLAG_UI 0x0001 /* Notidy this private cmd send by UI. */ -#define RTPRIV_IOCTL_FLAG_NODUMPMSG \ - 0x0002 /* Notify driver cannot dump msg to stdio/stdout when run this private ioctl cmd */ -#define RTPRIV_IOCTL_FLAG_NOSPACE \ - 0x0004 /* Notify driver didn't need copy msg to caller due to the caller didn't reserve space for this cmd */ -#endif /* DBG */ - -#ifdef SNMP_SUPPORT -/*SNMP ieee 802dot11 , 2008_0220 */ -/* dot11res(3) */ -#define RT_OID_802_11_MANUFACTUREROUI 0x0700 -#define RT_OID_802_11_MANUFACTURERNAME 0x0701 -#define RT_OID_802_11_RESOURCETYPEIDNAME 0x0702 - -/* dot11smt(1) */ -#define RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED 0x0703 -#define RT_OID_802_11_POWERMANAGEMENTMODE 0x0704 -#define OID_802_11_WEPDEFAULTKEYVALUE 0x0705 /* read , write */ -#define OID_802_11_WEPDEFAULTKEYID 0x0706 -#define RT_OID_802_11_WEPKEYMAPPINGLENGTH 0x0707 -#define OID_802_11_SHORTRETRYLIMIT 0x0708 -#define OID_802_11_LONGRETRYLIMIT 0x0709 -#define RT_OID_802_11_PRODUCTID 0x0710 -#define RT_OID_802_11_MANUFACTUREID 0x0711 -#endif /* SNMP_SUPPORT */ - -/* //dot11Phy(4) */ -#if (defined(SNMP_SUPPORT) || defined(WH_EZ_SETUP) || \ - defined(VENDOR_FEATURE6_SUPPORT)) -#define OID_802_11_CURRENTCHANNEL 0x0712 -#endif - -/*dot11mac */ -#define RT_OID_802_11_MAC_ADDRESS 0x0713 -#define OID_802_11_BUILD_CHANNEL_EX 0x0714 -#define OID_802_11_GET_CH_LIST 0x0715 -#define OID_802_11_GET_COUNTRY_CODE 0x0716 -#define OID_802_11_GET_CHANNEL_GEOGRAPHY 0x0717 - -/*#define RT_OID_802_11_STATISTICS (OID_GET_SET_TOGGLE | OID_802_11_STATISTICS) */ - -#ifdef WSC_INCLUDED -#define RT_OID_WAC_REQ 0x0736 -#define RT_OID_WSC_AUTO_PROVISION_WITH_BSSID 0x0737 -#define RT_OID_WSC_AUTO_PROVISION 0x0738 -#ifdef WSC_LED_SUPPORT -/*WPS LED MODE 10 for Dlink WPS LED */ -#define RT_OID_LED_WPS_MODE10 0x0739 -#endif /* WSC_LED_SUPPORT */ -#endif /* WSC_INCLUDED */ -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#define RT_OID_APCLI_WSC_PIN_CODE 0x074A -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#define RT_OID_WSC_FRAGMENT_SIZE 0x074D -#define RT_OID_WSC_V2_SUPPORT 0x074E -#define RT_OID_WSC_CONFIG_STATUS 0x074F -#define RT_OID_802_11_WSC_QUERY_PROFILE 0x0750 -/* for consistency with RT61 */ -#define RT_OID_WSC_QUERY_STATUS 0x0751 -#define RT_OID_WSC_PIN_CODE 0x0752 -#define RT_OID_WSC_UUID 0x0753 -#define RT_OID_WSC_SET_SELECTED_REGISTRAR 0x0754 -#define RT_OID_WSC_EAPMSG 0x0755 -#define RT_OID_WSC_MANUFACTURER 0x0756 -#define RT_OID_WSC_MODEL_NAME 0x0757 -#define RT_OID_WSC_MODEL_NO 0x0758 -#define RT_OID_WSC_SERIAL_NO 0x0759 -#define RT_OID_WSC_READ_UFD_FILE 0x075A -#define RT_OID_WSC_WRITE_UFD_FILE 0x075B -#define RT_OID_WSC_QUERY_PEER_INFO_ON_RUNNING 0x075C -#define RT_OID_WSC_MAC_ADDRESS 0x0760 -#ifdef VENDOR_FEATURE7_SUPPORT -#define ARRIS_OID_WSC_QUERY_STATE 0x0AA0 /* Case to return WPS STATE */ -#ifdef DOT11_N_SUPPORT -#define ARRIS_OID_HTEXTCHA_QUERY_VALUE 0x0AA1 /* Case to return HtExtCha */ -#endif -#endif - -#ifdef LLTD_SUPPORT -/* for consistency with RT61 */ -#define RT_OID_GET_PHY_MODE 0x761 -#ifdef CONFIG_AP_SUPPORT -#define RT_OID_GET_LLTD_ASSO_TABLE 0x762 -#ifdef APCLI_SUPPORT -#define RT_OID_GET_REPEATER_AP_LINEAGE 0x763 -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#endif /* LLTD_SUPPORT */ - -#ifdef DOT11R_FT_SUPPORT -#define OID_802_11R_SUPPORT 0x0780 -#define OID_802_11R_MDID 0x0781 -#define OID_802_11R_R0KHID 0x0782 -#define OID_802_11R_RIC 0x0783 -#define OID_802_11R_OTD 0x0784 -#define OID_802_11R_INFO 0x0785 - -#define RT_OID_802_11R_SUPPORT (OID_GET_SET_TOGGLE | OID_802_11R_SUPPORT) -#define RT_OID_802_11R_MDID (OID_GET_SET_TOGGLE | OID_802_11R_MDID) -#define RT_OID_802_11R_R0KHID (OID_GET_SET_TOGGLE | OID_802_11R_R0KHID) -#define RT_OID_802_11R_RIC (OID_GET_SET_TOGGLE | OID_802_11R_RIC) -#define RT_OID_802_11R_OTD (OID_GET_SET_TOGGLE | OID_802_11R_OTD) -#define RT_OID_802_11R_INFO (OID_GET_SET_TOGGLE | OID_802_11R_INFO) -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef CON_WPS -#define RT_OID_WSC_SET_CON_WPS_STOP 0x0764 -#endif /* CON_WPS */ - -/* New for MeetingHouse Api support */ -#define OID_MH_802_1X_SUPPORTED 0xFFEDC100 - -typedef union _HETRANSMIT_SETTING { -#ifdef RT_BIG_ENDIAN - struct { - USHORT MODE : 3; - USHORT eTxBF : 1; - USHORT STBC : 1; - USHORT ShortGI : 1; - USHORT BW : 2; - USHORT ldpc : 1; - USHORT MCS : 7; - } field; -#else - struct { - USHORT MCS : 7; - USHORT ldpc : 1; - USHORT BW : 2; - USHORT ShortGI : 1; - USHORT STBC : 1; - USHORT eTxBF : 1; - USHORT MODE : 3; - } field; -#endif - USHORT word; -} HETRANSMIT_SETTING, *PHETRANSMIT_SETTING; - -/* MIMO Tx parameter, ShortGI, MCS, STBC, etc. these are fields in TXWI. Don't change this definition!!! */ -typedef union _HTTRANSMIT_SETTING { -#ifdef RT_BIG_ENDIAN - struct { - USHORT MODE : 3; /* Use definition MODE_xxx. */ - USHORT iTxBF : 1; - USHORT eTxBF : 1; - USHORT STBC : 1; /* only support in HT/VHT mode with MCS0~7 */ - USHORT ShortGI : 1; - USHORT BW : 2; /* channel bandwidth 20MHz/40/80 MHz */ - USHORT ldpc : 1; - USHORT MCS : 6; /* MCS */ - } field; -#else - struct { - USHORT MCS : 6; - USHORT ldpc : 1; - USHORT BW : 2; - USHORT ShortGI : 1; - USHORT STBC : 1; - USHORT eTxBF : 1; - USHORT iTxBF : 1; - USHORT MODE : 3; - } field; -#endif - USHORT word; -} HTTRANSMIT_SETTING, *PHTTRANSMIT_SETTING; - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -typedef struct _CLIENT_INFO { - UCHAR Addr[MAC_ADDR_LEN]; - ULONG LastRxTimeCount; -} CLIENT_INFO, *PCLIENT_INFO; - -typedef struct MSG_CLIENT_LIST { - UINT16 ClientCnt; - CLIENT_INFO CLIENTLIST[128]; -} MSG_CLIENT_LIST, *PMSG_CLIENT_LIST; -#endif - -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE -typedef struct MSG_RSSI_LIST { - UCHAR Addr[MAC_ADDR_LEN]; - LONG CurRssi; -} MSG_RSSI_LIST, *PMSG_RSSI_LIST; -#endif - -#ifdef OFFCHANNEL_SCAN_FEATURE -#define MAX_AWAY_CHANNEL 5 -enum ASYNC_OFFCHANNEL_COMMAND_RSP { - GET_OFFCHANNEL_INFO = 34, - OFFCHANNEL_INFO_RSP, - TRIGGER_DRIVER_CHANNEL_SWITCH, - UPDATE_DRIVER_SORTED_CHANNEL_LIST, - DFS_DRIVER_CHANNEL_SWITCH, - DFS_RADAR_HIT, - DFS_CHANNEL_NOP_CMPLT, - DRIVER_CHANNEL_SWITCH_SUCCESSFUL -}; - -typedef struct GNU_PACKED operating_info { - UINT8 channel; - UCHAR cfg_ht_bw; - UCHAR cfg_vht_bw; - UCHAR RDDurRegion; - UCHAR region; - UCHAR is4x4Mode; - UCHAR vht_cent_ch2; -} OPERATING_INFO, *POPERATING_INFO; - -typedef struct GNU_PACKED _channel_info { - UINT8 channel; - UINT8 channel_idx; - INT32 NF; - UINT32 rx_time; - UINT32 tx_time; - UINT32 obss_time; - UINT32 channel_busy_time; - UINT8 dfs_req; - UCHAR actual_measured_time; -#ifdef MAP_R2 - UINT32 edcca; -#endif -} CHANNEL_INFO, *PCHANNEL_INFO; - -struct msg_channel_list { - CHANNEL_INFO CHANNELLIST[60]; -}; -typedef struct GNU_PACKED offchannel_param { - UCHAR channel[MAX_AWAY_CHANNEL]; - UCHAR scan_type[MAX_AWAY_CHANNEL]; - UCHAR scan_time[MAX_AWAY_CHANNEL]; - UCHAR bw; - UINT32 Num_of_Away_Channel; -} OFFCHANNEL_SCAN_PARAM, *POFFCHANNEL_SCAN_PARAM; - -typedef struct GNU_PACKED sorted_list_info { - UINT8 size; - UINT8 SortedMaxChannelBusyTimeList[MAX_NUM_OF_CHANNELS + 1]; - UINT8 SortedMinChannelBusyTimeList[MAX_NUM_OF_CHANNELS + 1]; - -} SORTED_CHANNEL_LIST, *PSORTED_CHANNEL_LIST; - -typedef struct GNU_PACKED _OFFCHANNEL_SCAN_MSG { - UINT8 Action; - UCHAR ifrn_name[32]; - UINT32 ifIndex; - union { - CHANNEL_INFO channel_data; - OFFCHANNEL_SCAN_PARAM offchannel_param; - OPERATING_INFO operating_ch_info; - SORTED_CHANNEL_LIST sorted_channel_list; - } data; -} OFFCHANNEL_SCAN_MSG, *POFFCHANNEL_SCAN_MSG; -#endif - -typedef enum _RT_802_11_PREAMBLE { - Rt802_11PreambleLong, - Rt802_11PreambleShort, - Rt802_11PreambleAuto -} RT_802_11_PREAMBLE, - *PRT_802_11_PREAMBLE; - -typedef enum _RT_802_11_PHY_MODE { - PHY_11BG_MIXED = 0, - PHY_11B = 1, - PHY_11A = 2, - PHY_11ABG_MIXED = 3, - PHY_11G = 4, -#ifdef DOT11_N_SUPPORT - PHY_11ABGN_MIXED = 5, /* both band 5 */ - PHY_11N_2_4G = 6, /* 11n-only with 2.4G band 6 */ - PHY_11GN_MIXED = 7, /* 2.4G band 7 */ - PHY_11AN_MIXED = 8, /* 5G band 8 */ - PHY_11BGN_MIXED = 9, /* if check 802.11b. 9 */ - PHY_11AGN_MIXED = 10, /* if check 802.11b. 10 */ - PHY_11N_5G = 11, /* 11n-only with 5G band 11 */ -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11_VHT_AC - PHY_11VHT_N_ABG_MIXED = 12, /* 12 -> AC/A/AN/B/G/GN mixed */ - PHY_11VHT_N_AG_MIXED = 13, /* 13 -> AC/A/AN/G/GN mixed */ - PHY_11VHT_N_A_MIXED = 14, /* 14 -> AC/AN/A mixed in 5G band */ - PHY_11VHT_N_MIXED = 15, /* 15 -> AC/AN mixed in 5G band */ -#endif /* DOT11_VHT_AC */ - PHY_MODE_MAX, -} RT_802_11_PHY_MODE; - -#ifdef DOT11_VHT_AC -#define PHY_MODE_IS_5G_BAND(__Mode) \ - ((__Mode == PHY_11A) || (__Mode == PHY_11ABG_MIXED) || \ - (__Mode == PHY_11ABGN_MIXED) || (__Mode == PHY_11AN_MIXED) || \ - (__Mode == PHY_11AGN_MIXED) || (__Mode == PHY_11N_5G) || \ - (__Mode == PHY_11VHT_N_MIXED) || (__Mode == PHY_11VHT_N_A_MIXED)) -#elif defined(DOT11_N_SUPPORT) -#define PHY_MODE_IS_5G_BAND(__Mode) \ - ((__Mode == PHY_11A) || (__Mode == PHY_11ABG_MIXED) || \ - (__Mode == PHY_11ABGN_MIXED) || (__Mode == PHY_11AN_MIXED) || \ - (__Mode == PHY_11AGN_MIXED) || (__Mode == PHY_11N_5G)) -#else - -#define PHY_MODE_IS_5G_BAND(__Mode) \ - ((__Mode == PHY_11A) || (__Mode == PHY_11ABG_MIXED)) -#endif /* DOT11_N_SUPPORT */ - -/* put all proprietery for-query objects here to reduce # of Query_OID */ -typedef struct _RT_802_11_LINK_STATUS { - ULONG CurrTxRate; /* in units of 0.5Mbps */ - ULONG ChannelQuality; /* 0..100 % */ - ULONG TxByteCount; /* both ok and fail */ - ULONG RxByteCount; /* both ok and fail */ - ULONG CentralChannel; /* 40MHz central channel number */ -} RT_802_11_LINK_STATUS, *PRT_802_11_LINK_STATUS; - -#ifdef SYSTEM_LOG_SUPPORT -typedef struct _RT_802_11_EVENT_LOG { - LARGE_INTEGER SystemTime; /* timestammp via NdisGetCurrentSystemTime() */ - UCHAR Addr[MAC_ADDR_LEN]; - USHORT Event; /* EVENT_xxx */ -} RT_802_11_EVENT_LOG, *PRT_802_11_EVENT_LOG; - -typedef struct _RT_802_11_EVENT_TABLE { - ULONG Num; - ULONG Rsv; /* to align Log[] at LARGE_INEGER boundary */ - RT_802_11_EVENT_LOG Log[MAX_NUMBER_OF_EVENT]; -} RT_802_11_EVENT_TABLE, *PRT_802_11_EVENT_TABLE; -#endif /* SYSTEM_LOG_SUPPORT */ - -/* MIMO Tx parameter, ShortGI, MCS, STBC, etc. these are fields in TXWI. Don't change this definition!!! */ -typedef union _MACHTTRANSMIT_SETTING { - struct { - USHORT MCS : 7; /* MCS */ - USHORT BW : 1; /*channel bandwidth 20MHz or 40 MHz */ - USHORT ShortGI : 1; - USHORT STBC : 2; /*SPACE */ - USHORT rsv : 3; - USHORT MODE : 2; /* Use definition MODE_xxx. */ - } field; - USHORT word; -} MACHTTRANSMIT_SETTING, *PMACHTTRANSMIT_SETTING; - -typedef struct _RT_802_11_MAC_ENTRY { - UCHAR ApIdx; - UCHAR Addr[MAC_ADDR_LEN]; - UCHAR Aid; - UCHAR Psm; /* 0:PWR_ACTIVE, 1:PWR_SAVE */ - UCHAR MimoPs; /* 0:MMPS_STATIC, 1:MMPS_DYNAMIC, 3:MMPS_Enabled */ - CHAR AvgRssi0; - CHAR AvgRssi1; - CHAR AvgRssi2; - CHAR AvgRssi3; - UINT32 ConnectedTime; - HTTRANSMIT_SETTING TxRate; -#ifdef CUSTOMER_DCC_FEATURE - UINT32 AvgSnr; -#endif /* CUSTOMER_DCC_FEATURE */ - UINT32 LastRxRate; - /* - sync with WEB UI's structure for ioctl usage. - */ -#ifndef CUSTOMER_DCC_FEATURE - SHORT StreamSnr - [3]; /* BF SNR from RXWI. Units=0.25 dB. 22 dB offset removed */ - SHORT SoundingRespSnr - [3]; /* SNR from Sounding Response. Units=0.25 dB. 22 dB offset removed */ - /* SHORT TxPER; */ /* TX PER over the last second. Percent */ - /* SHORT reserved;*/ -#endif /* !CUSTOMER_DCC_FEATURE */ -} RT_802_11_MAC_ENTRY, *PRT_802_11_MAC_ENTRY; - -typedef struct _RT_802_11_MAC_TABLE { - ULONG Num; - RT_802_11_MAC_ENTRY Entry[MAX_NUMBER_OF_MAC]; -} RT_802_11_MAC_TABLE, *PRT_802_11_MAC_TABLE; - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT -typedef struct { - ULONG TxSuccessCount; - ULONG TxRetryCount; - ULONG TxFailCount; - ULONG ETxSuccessCount; - ULONG ETxRetryCount; - ULONG ETxFailCount; - ULONG ITxSuccessCount; - ULONG ITxRetryCount; - ULONG ITxFailCount; -} RT_COUNTER_TXBF; - -typedef struct { - ULONG Num; - RT_COUNTER_TXBF Entry[MAX_NUMBER_OF_MAC]; -} RT_802_11_TXBF_TABLE; -#endif /* TXBF_SUPPORT */ -#endif /* DOT11_N_SUPPORT */ - -/* structure for query/set hardware register - MAC, BBP, RF register */ -typedef struct _RT_802_11_HARDWARE_REGISTER { - ULONG HardwareType; /* 0:MAC, 1:BBP, 2:RF register, 3:EEPROM */ - ULONG Offset; /* Q/S register offset addr */ - ULONG Data; /* R/W data buffer */ -} RT_802_11_HARDWARE_REGISTER, *PRT_802_11_HARDWARE_REGISTER; - -typedef struct _RT_802_11_AP_CONFIG { - ULONG EnableTxBurst; /* 0-disable, 1-enable */ - ULONG EnableTurboRate; /* 0-disable, 1-enable 72/100mbps turbo rate */ - ULONG IsolateInterStaTraffic; /* 0-disable, 1-enable isolation */ - ULONG HideSsid; /* 0-disable, 1-enable hiding */ - ULONG UseBGProtection; /* 0-AUTO, 1-always ON, 2-always OFF */ - ULONG UseShortSlotTime; /* 0-no use, 1-use 9-us short slot time */ - ULONG Rsv1; /* must be 0 */ - ULONG SystemErrorBitmap; /* ignore upon SET, return system error upon QUERY */ -} RT_802_11_AP_CONFIG, *PRT_802_11_AP_CONFIG; - -/* structure to query/set STA_CONFIG */ -typedef struct _RT_802_11_STA_CONFIG { - ULONG EnableTxBurst; /* 0-disable, 1-enable */ - ULONG EnableTurboRate; /* 0-disable, 1-enable 72/100mbps turbo rate */ - ULONG UseBGProtection; /* 0-AUTO, 1-always ON, 2-always OFF */ - ULONG UseShortSlotTime; /* 0-no use, 1-use 9-us short slot time when applicable */ - ULONG AdhocMode; /* 0-11b rates only (WIFI spec), 1 - b/g mixed, 2 - g only */ - ULONG HwRadioStatus; /* 0-OFF, 1-ON, default is 1, Read-Only */ - ULONG Rsv1; /* must be 0 */ - ULONG SystemErrorBitmap; /* ignore upon SET, return system error upon QUERY */ -} RT_802_11_STA_CONFIG, *PRT_802_11_STA_CONFIG; - -/* */ -/* For OID Query or Set about BA structure */ -/* */ -typedef struct _OID_BACAP_STRUC { - UCHAR RxBAWinLimit; - UCHAR TxBAWinLimit; - UCHAR Policy; /* 0: DELAY_BA 1:IMMED_BA (//BA Policy subfiled value in ADDBA frame) 2:BA-not use. other value invalid */ - UCHAR MpduDensity; /* 0: DELAY_BA 1:IMMED_BA (//BA Policy subfiled value in ADDBA frame) 2:BA-not use. other value invalid */ - UCHAR AmsduEnable; /*Enable AMSDU transmisstion */ - UCHAR AmsduSize; /* 0:3839, 1:7935 bytes. UINT MSDUSizeToBytes[] = { 3839, 7935}; */ - UCHAR MMPSmode; /* MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable */ - BOOLEAN AutoBA; /* Auto BA will automatically */ -} OID_BACAP_STRUC, *POID_BACAP_STRUC; - -typedef struct _RT_802_11_ACL_ENTRY { - UCHAR Addr[MAC_ADDR_LEN]; - USHORT Rsv; -#ifdef ACL_BLK_COUNT_SUPPORT - ULONG Reject_Count; -#endif /* ACL_BLK_COUNT_SUPPORT*/ -} RT_802_11_ACL_ENTRY, *PRT_802_11_ACL_ENTRY; - -typedef struct GNU_PACKED _RT_802_11_ACL { - ULONG Policy; /* 0-disable, 1-positive list, 2-negative list */ - ULONG Num; - RT_802_11_ACL_ENTRY Entry[MAX_NUMBER_OF_ACL]; -} RT_802_11_ACL, *PRT_802_11_ACL; - -#ifdef OCE_FILS_SUPPORT -#define MAX_OPT_IE 1024 -#define WPA_KEK_MAX_LEN 64 -#define WPA_NONCE_LEN 32 -#define FILS_NONCE_LEN 16 - -typedef struct GNU_PACKED _RT_802_11_STA_MLME_EVENT { - UCHAR addr[MAC_ADDR_LEN]; - INT16 seq; - INT16 status; - UCHAR ie[MAX_OPT_IE]; - UINT len; - UCHAR mgmt_subtype; - INT16 auth_algo; - UCHAR fils_anonce[WPA_NONCE_LEN]; - UCHAR fils_snonce[WPA_NONCE_LEN]; - UCHAR fils_kek[WPA_KEK_MAX_LEN]; - UINT fils_kek_len; -} RT_802_11_STA_MLME_EVENT, *PRT_802_11_STA_MLME_EVENT; - -typedef struct GNU_PACKED _RT_802_11_SEC_INFO_SYNC_EVENT { - UCHAR apidx; - UCHAR wpa; - UINT32 wpa_key_mgmt; - UINT32 wpa_group; - UINT32 wpa_pairwise; - UINT32 rsn_pairwise; - UCHAR rsne[MAX_OPT_IE]; - UINT rsne_len; - UINT16 CapabilityInfo; - UCHAR GN; - UCHAR GTK[LEN_MAX_GTK]; - UCHAR GTK_len; - UCHAR IGN; - UCHAR IGTK[LEN_MAX_GTK]; - UCHAR IGTK_len; - UINT16 FilsCacheId; - UINT32 FilsDhcpServerIp; -} RT_802_11_SEC_INFO_SYNC_EVENT, *PRT_802_11_SEC_INFO_SYNC_EVENT; - -typedef struct GNU_PACKED _NDIS_FILS_802_11_KEY { - UCHAR addr[MAC_ADDR_LEN]; - UINT KeyIndex; - UINT KeyLength; /* length of key in bytes */ - UCHAR KeyMaterial[64]; /* variable length depending on above field */ -} NDIS_FILS_802_11_KEY, *PNDIS_FILS_802_11_KEY; - -typedef struct _RT_802_11_KEY_EVENT { - UCHAR action; - NDIS_FILS_802_11_KEY keyInfo; - UINT keyrsc; - UINT keytsc; -} __attribute__((packed)) RT_802_11_KEY_EVENT; - -enum FILS_KEY_ACTION { - FILS_KEY_INSTALL_PTK = 0, - FILS_KEY_GET_RSC, - FILS_KEY_GET_TSC, -}; - -enum PMK_CACHE_ACTION { - PMK_CACHE_QUERY = 0, - PMK_CACHE_ADD, - PMK_CACHE_DEL, - - /* res */ - PMK_CACHE_STATUS_OK, - PMK_CACHE_STATUS_FAIL, -}; - -typedef struct _RT_802_11_PMK_CACHE_SYNC_EVENT { - UCHAR addr[MAC_ADDR_LEN]; - UCHAR pmkid[LEN_PMKID]; - UCHAR pmk[LEN_MAX_PMK]; - UCHAR pmk_len; - UINT32 akmp; /* WPA_KEY_MGMT_* */ - UCHAR res; -} __attribute__((packed)) RT_802_11_PMK_CACHE_SYNC_EVENT; -#endif /* OCE_FILS_SUPPORT */ - -#ifdef RADIUS_MAC_ACL_SUPPORT -typedef struct _RT_802_11_RADIUS_ACL_ENTRY { - struct _RT_802_11_RADIUS_ACL_ENTRY *pNext; - UCHAR Addr[MAC_ADDR_LEN]; - USHORT result; -} RT_802_11_RADIUS_ACL_ENTRY, *PRT_802_11_RADIUS_ACL_ENTRY; - -typedef struct GNU_PACKED _RT_802_11_RADIUS_ACL { -#define RADIUS_MAC_AUTH_ENABLE 1 -#define RADIUS_MAC_AUTH_DISABLE 0 - UCHAR Policy; - UINT32 Timeout; - LIST_HEADER cacheList; -} RT_802_11_RADIUS_ACL, *PRT_802_11_RADIUS_ACL; -#endif /* RADIUS_MAC_ACL_SUPPORT */ - -typedef struct _RT_802_11_WDS { - ULONG Num; - NDIS_802_11_MAC_ADDRESS Entry[24 /*MAX_NUM_OF_WDS_LINK */]; - ULONG KeyLength; - UCHAR KeyMaterial[32]; -} RT_802_11_WDS, *PRT_802_11_WDS; - -typedef struct _RT_802_11_TX_RATES_ { - UCHAR SupRateLen; - UCHAR SupRate[MAX_LENGTH_OF_SUPPORT_RATES]; - UCHAR ExtRateLen; - UCHAR ExtRate[MAX_LENGTH_OF_SUPPORT_RATES]; -} RT_802_11_TX_RATES, *PRT_802_11_TX_RATES; - -/* Definition of extra information code */ -#define GENERAL_LINK_UP 0x0 /* Link is Up */ -#define GENERAL_LINK_DOWN 0x1 /* Link is Down */ -#define HW_RADIO_OFF 0x2 /* Hardware radio off */ -#define SW_RADIO_OFF 0x3 /* Software radio off */ -#define AUTH_FAIL 0x4 /* Open authentication fail */ -#define AUTH_FAIL_KEYS 0x5 /* Shared authentication fail */ -#define ASSOC_FAIL 0x6 /* Association failed */ -#define EAP_MIC_FAILURE 0x7 /* Deauthencation because MIC failure */ -#define EAP_4WAY_TIMEOUT 0x8 /* Deauthencation on 4-way handshake timeout */ -#define EAP_GROUP_KEY_TIMEOUT \ - 0x9 /* Deauthencation on group key handshake timeout */ -#define EAP_SUCCESS 0xa /* EAP succeed */ -#define DETECT_RADAR_SIGNAL 0xb /* Radar signal occur in current channel */ -#define EXTRA_INFO_MAX 0xb /* Indicate Last OID */ - -#define EXTRA_INFO_CLEAR 0xffffffff - -/* This is OID setting structure. So only GF or MM as Mode. This is valid when our wirelss mode has 802.11n in use. */ -typedef struct { - RT_802_11_PHY_MODE PhyMode; /* */ - UCHAR TransmitNo; - UCHAR HtMode; /*HTMODE_GF or HTMODE_MM */ - UINT8 ExtOffset; /*extension channel above or below */ - UCHAR MCS; - UCHAR BW; - UCHAR STBC; - UCHAR SHORTGI; - UCHAR Channel; - UCHAR BandIdx; -} OID_SET_HT_PHYMODE, *POID_SET_HT_PHYMODE; - -#ifdef LLTD_SUPPORT -typedef struct _RT_LLTD_ASSOICATION_ENTRY { - UCHAR Addr[MAC_ADDR_LEN]; - unsigned short MOR; /* maximum operational rate */ - UCHAR phyMode; -} RT_LLTD_ASSOICATION_ENTRY, *PRT_LLTD_ASSOICATION_ENTRY; - -typedef struct _RT_LLTD_ASSOICATION_TABLE { - unsigned int Num; - RT_LLTD_ASSOICATION_ENTRY Entry[MAX_NUMBER_OF_MAC]; -} RT_LLTD_ASSOICATION_TABLE, *PRT_LLTD_ASSOICATION_TABLE; -#endif /* LLTD_SUPPORT */ - -#ifdef WSC_INCLUDED -#define RT_WSC_UPNP_EVENT_FLAG 0x109 -#endif /* WSC_INCLUDED */ - -/*#define MAX_CUSTOM_LEN 128 */ - -typedef struct _RT_CHANNEL_LIST_INFO { - UCHAR ChannelList - [MAX_NUM_OF_CHS]; /* list all supported channels for site survey */ - UCHAR ChannelListNum; /* number of channel in ChannelList[] */ -} RT_CHANNEL_LIST_INFO, *PRT_CHANNEL_LIST_INFO; -#ifndef WAPP_SUPPORT - -/* WSC configured credential */ -typedef struct _WSC_CREDENTIAL { - NDIS_802_11_SSID SSID; /* mandatory */ - USHORT AuthType; /* mandatory, 1: open, 2: wpa-psk, 4: shared, 8:wpa, 0x10: wpa2, 0x20: wpa2-psk */ - USHORT EncrType; /* mandatory, 1: none, 2: wep, 4: tkip, 8: aes */ - UCHAR Key[64]; /* mandatory, Maximum 64 byte */ - USHORT KeyLength; - UCHAR MacAddr[MAC_ADDR_LEN]; /* mandatory, AP MAC address */ - UCHAR KeyIndex; /* optional, default is 1 */ - UCHAR bFromUPnP; /* TRUE: This credential is from external UPnP registrar */ -#ifndef CONFIG_MAP_SUPPORT - UCHAR Rsvd[2]; /* Make alignment */ -#else - UCHAR bss_role; /*0-Fronthaul, 1-Backhaul*/ - UCHAR DevPeerRole; /* Device role for the peer device sending M8 */ -#endif -} WSC_CREDENTIAL, *PWSC_CREDENTIAL; -#endif -/* WSC configured profiles */ -typedef struct _WSC_PROFILE { - UINT ProfileCnt; - UINT ApplyProfileIdx; /* add by johnli, fix WPS test plan 5.1.1 */ - WSC_CREDENTIAL Profile[8]; /* Support up to 8 profiles */ -} WSC_PROFILE, *PWSC_PROFILE; - -#ifdef DOT11R_FT_SUPPORT -typedef struct _FT_CONFIG_INFO { - UCHAR MdId[2]; - UCHAR R0KHId[49]; - UCHAR R0KHIdLen; - BOOLEAN FtSupport; - BOOLEAN FtRicSupport; - BOOLEAN FtOtdSupport; -} FT_CONFIG_INFO, *PFT_CONFIG_INFO; -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef OFFCHANNEL_SCAN_FEATURE -enum channel_monitor_return_code { - CHANNEL_MONITOR_STRG_FAILURE = 0, - CHANNEL_MONITOR_STRG_SUCCESS, - CHANNEL_MONITOR_STRG_INVALID_ARG, -}; - -#endif - -enum { - OID_WIFI_TEST_BBP = 0x1000, - OID_WIFI_TEST_RF = 0x1001, - OID_WIFI_TEST_RF_BANK = 0x1002, - OID_WIFI_TEST_MEM_MAP_INFO = 0x1003, - OID_WIFI_TEST_BBP_NUM = 0x1004, - OID_WIFI_TEST_RF_NUM = 0x1005, - OID_WIFI_TEST_RF_BANK_OFFSET = 0x1006, - OID_WIFI_TEST_MEM_MAP_NUM = 0x1007, - OID_WIFI_TEST_BBP32 = 0x1008, - OID_WIFI_TEST_MAC = 0x1009, - OID_WIFI_TEST_MAC_NUM = 0x1010, - OID_WIFI_TEST_E2P = 0x1011, - OID_WIFI_TEST_E2P_NUM = 0x1012, - OID_WIFI_TEST_PHY_MODE = 0x1013, - OID_WIFI_TEST_RF_INDEX = 0x1014, - OID_WIFI_TEST_RF_INDEX_OFFSET = 0x1015, -}; - -struct bbp_info { - UINT32 bbp_start; - UINT32 bbp_end; - UINT8 bbp_value[0]; -}; - -struct bbp32_info { - UINT32 bbp_start; - UINT32 bbp_end; - UINT32 bbp_value[0]; -}; - -struct rf_info { - UINT16 rf_start; - UINT16 rf_end; - UINT8 rf_value[0]; -}; - -struct rf_bank_info { - UINT8 rf_bank; - UINT16 rf_start; - UINT16 rf_end; - UINT8 rf_value[0]; -}; - -struct rf_index_info { - UINT8 rf_index; - UINT16 rf_start; - UINT16 rf_end; - UINT32 rf_value[0]; -}; - -struct mac_info { - UINT32 mac_start; - UINT32 mac_end; - UINT32 mac_value[0]; -}; - -struct mem_map_info { - UINT32 base; - UINT16 mem_map_start; - UINT16 mem_map_end; - UINT32 mem_map_value[0]; -}; - -struct e2p_info { - UINT16 e2p_start; - UINT16 e2p_end; - UINT16 e2p_value[0]; -}; - -struct phy_mode_info { - int data_phy; - UINT8 data_bw; - UINT8 data_ldpc; - UINT8 data_mcs; - UINT8 data_gi; - UINT8 data_stbc; -}; - -struct anqp_req_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; - UINT32 anqp_req_len; - UCHAR anqp_req[0]; -}; - -struct anqp_rsp_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; - UINT16 status; - UINT32 anqp_rsp_len; - UCHAR anqp_rsp[0]; -}; - -struct hs_onoff { - UINT32 ifindex; - UCHAR hs_onoff; - UCHAR event_trigger; - UCHAR event_type; -}; - -#ifdef MAP_R2 -struct wnm_notify_req_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; - UINT32 wnm_req_len; - UCHAR wnm_req[0]; -}; -#endif -struct wapp_param_setting { - UINT32 param; - UINT32 value; -}; - -struct location_IE { - UINT16 type; - UINT8 len; - UCHAR location_buf[0]; -}; - -struct proxy_arp_entry { - UINT32 ifindex; - UCHAR ip_type; - UCHAR from_ds; - UCHAR IsDAD; - UCHAR source_mac_addr[6]; - UCHAR target_mac_addr[6]; - UCHAR ip_addr[0]; -}; - -struct security_type { - UINT32 ifindex; - UINT8 auth_mode; - UINT8 encryp_type; -}; - -struct wnm_req_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; - UINT32 type; - UINT32 wnm_req_len; - UCHAR wnm_req[0]; -}; - -struct qosmap_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; - UINT32 qosmap_len; - UCHAR qosmap[0]; -}; - -#define OID_802_11_WIFI_VER 0x0920 -#define OID_802_11_WAPP_SUPPORT_VER 0x0921 -#define OID_802_11_WAPP_IE 0x0922 -#define OID_802_11_HS_ANQP_REQ 0x0923 -#define OID_802_11_HS_ANQP_RSP 0x0924 -#define OID_802_11_HS_ONOFF 0x0925 -#define OID_802_11_WAPP_PARAM_SETTING 0x0927 -#define OID_802_11_WNM_BTM_REQ 0x0928 -#define OID_802_11_WNM_BTM_QUERY 0x0929 -#define OID_802_11_WNM_BTM_RSP 0x093a -#define OID_802_11_WNM_PROXY_ARP 0x093b -#define OID_802_11_WNM_IPV4_PROXY_ARP_LIST 0x093c -#define OID_802_11_WNM_IPV6_PROXY_ARP_LIST 0x093d -#define OID_802_11_SECURITY_TYPE 0x093e -#define OID_802_11_HS_RESET_RESOURCE 0x093f -#define OID_802_11_HS_AP_RELOAD 0x0940 -#define OID_802_11_HS_BSSID 0x0941 -#define OID_802_11_HS_OSU_SSID 0x0942 -/* #define OID_802_11_HS_OSU_NONTX 0x0944 */ -#define OID_802_11_HS_SASN_ENABLE 0x0943 -#define OID_802_11_WNM_NOTIFY_REQ 0x0944 -#define OID_802_11_QOSMAP_CONFIGURE 0x0945 -#define OID_802_11_GET_STA_HSINFO 0x0946 -#define OID_802_11_BSS_LOAD 0x0947 -#define OID_802_11_HS_LOCATION_DRV_INFORM_IE 0x0948 -#define OID_802_11_INTERWORKING_ENABLE 0x0949 - -#define OID_BNDSTRG_MSG 0x0950 -#define OID_BNDSTRG_GET_NVRAM 0x0951 -#define OID_BNDSTRG_SET_NVRAM 0x0952 - -#define OID_802_11_MBO_MSG 0x0953 -#define OID_NEIGHBOR_REPORT 0x0954 -#define OID_802_11_OCE_REDUCED_NEIGHBOR_REPORT 0x0969 - -#ifdef OFFCHANNEL_SCAN_FEATURE -#define OID_OFFCHANNEL_INFO 0x0955 -#define OID_802_11_CURRENT_CHANNEL_INFO 0x0956 -#define OID_OPERATING_INFO 0x0957 -#define OID_802_11_CHANNELINFO 0x0999 -#endif - -#define OID_WSC_UUID 0x0990 -#define OID_SET_SSID 0x0992 -#define OID_SET_PSK 0x0993 - -#define OID_SEND_OFFCHAN_ACTION_FRAME 0x09a3 -#define OID_802_11_CANCEL_ROC 0x09a4 -#define OID_802_11_START_ROC 0x09a5 -#ifdef DPP_SUPPORT -#define OID_802_11_SET_PMK 0x09a6 -#define OID_802_11_GET_DPP_FRAME 0x09a7 -#endif /* DPP_SUPPORT */ - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -#define OID_GET_RXDATA_LAPSE_TIME 0x0958 -#endif - -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE -#define OID_GET_CURRENT_RSSI 0x0959 -#define OID_SET_VENDOR10_RSSI 0x0980 -#endif - -/* for VOW SUPPORT web UI */ -#ifdef CONFIG_AP_SUPPORT -#ifdef VOW_SUPPORT - -/* not used for runtime enable/disable */ -#define OID_802_11_VOW_BW_EN 0x0960 -#define OID_802_11_VOW_BW_AT_EN 0x0961 -#define OID_802_11_VOW_BW_TPUT_EN 0x0962 - -#define OID_802_11_VOW_ATF_EN 0x0963 -#define OID_802_11_VOW_RX_EN 0x0964 - -#define OID_802_11_VOW_GROUP_MAX_RATE 0x0965 -#define OID_802_11_VOW_GROUP_MIN_RATE 0x0966 -#define OID_802_11_VOW_GROUP_MAX_RATIO 0x0967 -#define OID_802_11_VOW_GROUP_MIN_RATIO 0x0968 -#endif /* VOW_SUPPORT */ -#ifdef CUSTOMER_DCC_FEATURE -#define OID_802_11_SCAN_BSSID_LIST 0x069b -#ifdef MEMORY_OPTIMIZATION -#define MAX_LEN_OF_BSS_TABLE 128 -#define MAX_REORDERING_MPDU_NUM 256 -#else -#define MAX_LEN_OF_BSS_TABLE 256 /* 64 */ -#define MAX_LEN_OF_BSS_SCAN_TABLE 128 /* Customer Chnages */ -#if defined(MT7615) || defined(MT7622) -#define MAX_REORDERING_MPDU_NUM (512 * 4) -#else -#define MAX_REORDERING_MPDU_NUM 512 -#endif -#endif -typedef struct _DCC_CH { - UINT8 ChannelNo; - UINT32 FalseCCA; - UINT32 chanbusytime; -} DCC_CH, *PDCC_CH; - -typedef struct _WLAN_BSSID_LIST { - NDIS_802_11_MAC_ADDRESS Bssid; /* BSSID */ - UCHAR WpsAP; /* 0x00: not support WPS, 0x01: support normal WPS, 0x02: support Ralink auto WPS, 0x04: support Samsung WAC */ - USHORT WscDPIDFromWpsAP; - UCHAR Privacy; /* WEP encryption requirement */ - UINT Signal; /* receive signal strength in dBm */ - NDIS_802_11_NETWORK_TYPE wireless_mode; - NDIS_802_11_AUTHENTICATION_MODE AuthMode; - NDIS_802_11_WEP_STATUS - Cipher; /* Unicast Encryption Algorithm extract from VAR_IE */ - UINT8 Channel; - UINT8 ExtChannel; - UCHAR BssType; - UCHAR SupportedRates[MAX_LENGTH_OF_SUPPORT_RATES]; - BOOLEAN bQbssLoadValid; /* 1: variable contains valid value */ - USHORT QbssLoadStaNum; - UCHAR QbssLoadChannelUtilization; - UCHAR Snr[4]; - UINT8 NumSpatialStream; - CHAR rssi[4]; - UCHAR vendorOUI0[3]; - UCHAR vendorOUI1[3]; - UINT8 ChannelWidth; - NDIS_802_11_SSID Ssid; /* SSID */ -} WLAN_BSSID_LIST, *PWLAN_BSSID_LIST; - -typedef struct _BSSID_LIST_RESULTS { - UINT NumberOfItems; /* in list below, at least 1 */ - WLAN_BSSID_LIST BssidTable[MAX_LEN_OF_BSS_TABLE]; - DCC_CH DccCh[30]; /*anand to handle 5g and 2g both channels */ -} BSSID_LIST_RESULTS, *PBSSID_LIST_RESULTS; -#endif /* CUSTOMER_DCC_FEATURE */ - -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef WIFI_SPECTRUM_SUPPORT -#define OID_802_11_WIFISPECTRUM_SET_PARAMETER 0x0970 -#define OID_802_11_WIFISPECTRUM_GET_CAPTURE_STATUS 0x0971 -#define OID_802_11_WIFISPECTRUM_DUMP_DATA 0x0972 -#define OID_802_11_WIFISPECTRUM_GET_CAPTURE_BW 0x0973 -#define OID_802_11_WIFISPECTRUM_GET_CENTRAL_FREQ 0x0974 -#endif /* WIFI_SPECTRUM_SUPPORT */ - -#ifdef CUSTOMER_RSG_FEATURE -#define OID_802_11_GET_CURRENT_CHANNEL_FALSE_CCA_AVG 0x0690 -#define OID_802_11_GET_CURRENT_CHANNEL_CST_TIME_AVG 0x0691 -#define OID_802_11_GET_CURRENT_CHANNEL_BUSY_TIME_AVG 0x0692 -#define OID_802_11_GET_CURRENT_CHANNEL_STATS 0x0693 -#define OID_802_11_GET_CURRENT_CHANNEL_AP_ACTIVITY_AVG 0x0694 -#define OID_802_11_GET_RADIO_STATS_COUNT 0x0699 - -typedef struct _CURRENT_CHANNEL_STATS { - UINT32 SamplePeriod; - UINT32 FalseCCACount; - UINT32 ChannelApActivity; - UINT32 EdCcaBusyTime; - UINT32 ChannelBusyTime; -} CURRENT_CHANNEL_STATISTICS, *PCURRENT_CHANNEL_STATISTICS; - -#endif - -#ifdef CUSTOMER_DCC_FEATURE -#define OID_802_11_STA_STATISTICS 0x0695 -#define OID_802_11_GET_CURRENT_CHANNEL_AP_TABLE 0x0696 -#define OID_802_11_GET_ACCESS_CATEGORY_TRAFFIC_STATUS 0x0697 -#define OID_802_11_GET_SCAN_RESULTS 0x0698 -#define OID_802_11_GET_RADIO_STATS_COUNT 0x0699 -#define OID_802_11_MBSS_STATISTICS 0x069a -#define OID_802_11_SCAN_BSSID_LIST 0x069b - -typedef struct __RT_MBSS_STAT_ENTRY { - /* DATA counter */ - UINT32 RxCount; - UINT32 TxCount; - UINT32 ReceivedByteCount; - UINT32 TransmittedByteCount; - UINT32 RxErrorCount; - UINT32 RxDropCount; - UINT32 TxErrorCount; - UINT32 TxDropCount; - UINT32 UnicastPktsRx; - UINT32 UnicastPktsTx; - UINT32 MulticastPktsRx; - UINT32 MulticastPktsTx; - UINT32 BroadcastPktsRx; - UINT32 BroadcastPktsTx; - UINT32 TxRetriedPktCount; - UINT32 ChannelUseTime; - /* MGMT counter */ - UINT32 MGMTRxCount; - UINT32 MGMTTxCount; - UINT32 MGMTReceivedByteCount; - UINT32 MGMTTransmittedByteCount; - UINT32 MGMTRxErrorCount; - UINT32 MGMTRxDropCount; - UINT32 MGMTTxErrorCount; - UINT32 MGMTTxDropCount; -} RT_MBSS_STAT_ENTRY; - -typedef struct __RT_MBSS_STATISTICS_TABLE { - UINT32 Num; - RT_MBSS_STAT_ENTRY MbssEntry[8]; -} RT_MBSS_STATISTICS_TABLE; - -typedef struct __RT_STA_STAT_ENTRY { - UCHAR ApIdx; - UCHAR Addr[MAC_ADDR_LEN]; - UINT32 RxCount; - UINT32 TxCount; - UINT32 ReceivedByteCount; - UINT32 TransmittedByteCount; - UINT32 RxErrorCount; - UINT32 RxDropCount; - UINT32 TxErrorCount; - UINT32 TxDropCount; - UINT32 TxRetriedPktCount; - UINT32 ChannelUseTime; -} RT_STA_STAT_ENTRY; - -typedef struct __RT_STA_STATISTICS_TABLE { - int Num; - RT_STA_STAT_ENTRY STAEntry[MAX_NUMBER_OF_MAC]; -} RT_STA_STATISTICS_TABLE; - -typedef struct _BSS_ENTRY_TABLE { - UINT8 Bssid[MAC_ADDR_LEN]; - UINT16 SsidLen; - UINT8 Ssid[33]; - UINT8 Channel; - UINT8 ChannelWidth; - UINT8 ExtChannel; - CHAR RSSI; - UINT8 SNR; - UINT8 PhyMode; - UINT8 NumSpatialStream; -} BSS_ENTRY_TABLE, *PBSS_ENTRY_TABLE; - -typedef struct _BEACON_TABLE { - UINT8 Num; - BSS_ENTRY_TABLE BssTable[MAX_LEN_OF_BSS_TABLE]; -} BEACON_TABLE, *PBEACON_TABLE; - -typedef struct _SCAN_RESULTS { - UINT32 ch_busy_time; - UINT32 cca_err_cnt; - UINT32 num_ap; - BSS_ENTRY_TABLE BssTable[MAX_LEN_OF_BSS_TABLE]; -} SCAN_RESULTS, *PSCAN_RESULTS; - -#endif - -#ifdef MT_DFS_SUPPORT -#define OID_DFS_ZERO_WAIT 0x0985 -#endif - -#define OID_802_11_PROBE_RESPONSE 0x0986 - -#define MAX_CANDIDATE_NUM 5 -#define OP_LEN 16 -#define CH_LEN 30 -#define REQ_LEN 30 -#define SSID_LEN 33 - -#define OID_802_11_RRM_COMMAND 0x094C -#define OID_802_11_RRM_EVENT 0x094D -#define RT_QUERY_RRM_CAPABILITY (OID_GET_SET_FROM_UI | OID_802_11_RRM_COMMAND) - -enum rrm_cmd_subid { - OID_802_11_RRM_CMD_ENABLE = 0x01, - OID_802_11_RRM_CMD_CAP, - OID_802_11_RRM_CMD_SEND_BEACON_REQ, - OID_802_11_RRM_CMD_QUERY_CAP, - OID_802_11_RRM_CMD_SET_BEACON_REQ_PARAM, - OID_802_11_RRM_CMD_SEND_NEIGHBOR_REPORT, - OID_802_11_RRM_CMD_SET_NEIGHBOR_REPORT_PARAM, - OID_802_11_RRM_CMD_HANDLE_NEIGHBOR_REQUEST_BY_DAEMON, -}; - -enum rrm_event_subid { - OID_802_11_RRM_EVT_BEACON_REPORT = 0x01, - OID_802_11_RRM_EVT_NEIGHBOR_REQUEST, -}; - -typedef struct GNU_PACKED rrm_command_s { - UINT8 command_id; - UINT32 command_len; - UINT8 command_body[0]; -} rrm_command_t, *p_rrm_command_t; - -typedef struct GNU_PACKED rrm_event_s { - UINT8 event_id; - UINT32 event_len; - UINT8 event_body[0]; -} rrm_event_t, *p_rrm_event_t; - -struct GNU_PACKED nr_req_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; - UINT32 nr_req_len; - UCHAR nr_req[0]; -}; - -typedef struct GNU_PACKED nr_rsp_data_s { - UINT32 ifindex; - UINT8 dialog_token; - UINT8 peer_address[MAC_ADDR_LEN]; - UINT32 nr_rsp_len; - UINT8 nr_rsp[0]; -} nr_rsp_data_t, *p_nr_rsp_data_t; - -typedef struct GNU_PACKED bcn_req_data_s { - UINT32 ifindex; - UINT8 dialog_token; - UINT8 peer_address[MAC_ADDR_LEN]; - UINT32 bcn_req_len; - UINT8 bcn_req[0]; -} bcn_req_data_t, *p_bcn_req_data_t; - -/** @peer_address: mandatory; sta to send beacon request frame; -* @num_rpt: optional; number of repetitions; -* @regclass: only mandatory when channel is set to 0; operating class; -* @channum: mandatory; channel number; -* @random_ivl: optional; randomization interval; unit ms; -* the upper bound of the random delay to be used prior to make measurement; -* @duration: optional; measurement duration; unit ms; -* @bssid: optional; -* @mode: optional; measurement mode; -* As default value 0 is a valid value in spec, so here need remap the value and the meaning; -* 1 for passive mode; 2 for active mode; 3 for beacon table; -* @req_ssid: optional; subelement SSID; -* @timeout: optional; unit s; -* @rep_conditon: optional; subelement Beacon Reporting Information; -* @ref_value: optional; subelement Beacon Reporting Information; -* condition for report to be issued; -* driver will send timeout event after timeout value if no beacon report received; -* @detail: optional; subelement Reporting Detail; -* As default value 0 is a valid value in spec, so here need remap the value and the meaning; -* 1 for no fixed length fields or elements; -* 2 for all fixed length fields and any requested elements in the request IE; -* 3 for all fixed length fields and elements -* @op_class_len: mandatory only when channel is set to 255; -* @op_class_list: subelement Ap Channel Report; -* @ch_list_len: mandatory only when channel is set to 255; -* @ch_list: subelement Ap Channel Report; -* if you want use all the channels in operating classes then use default value -* otherwise specify all channels you want sta to do measurement -* @request_len: optional; -* @request: subelement Request; only valid when you specify request IDs -*/ -typedef struct GNU_PACKED bcn_req_info_s { - UINT8 peer_address[MAC_ADDR_LEN]; - UINT16 num_rpt; - UINT8 regclass; - UINT8 channum; - UINT16 random_ivl; - UINT16 duration; - UINT8 bssid[MAC_ADDR_LEN]; - UINT8 mode; - UINT8 req_ssid_len; - UINT8 req_ssid[SSID_LEN]; - UINT32 timeout; - UINT8 rep_conditon; - UINT8 ref_value; - UINT8 detail; - UINT8 op_class_len; - UINT8 op_class_list[OP_LEN]; - UINT8 ch_list_len; - UINT8 ch_list[CH_LEN]; - UINT8 request_len; - UINT8 request[REQ_LEN]; -} bcn_req_info, *p_bcn_req_info; - -typedef struct GNU_PACKED bcn_rsp_data_s { - UINT8 dialog_token; - UINT32 ifindex; - UINT8 peer_address[6]; - UINT32 bcn_rsp_len; - UINT8 bcn_rsp[0]; -} bcn_rsp_data_t, *p_bcn_rsp_data_t; - -/** -* @channum: optional; channel number; -* @phytype: optional; PHY type; -* @regclass: optional; operating class; -* @capinfo: optional; Same as AP's Capabilities Information field in Beacon; -* @bssid: mandatory; -* @preference: not used in neighbor report; optional in btm request; -* indicates the network preference for BSS transition to the BSS listed in this -* BSS Transition Candidate List Entries; 0 is a valid value in spec, but here -* need remap its meaning to not include preference IE in neighbor report -* response frame; -* @is_ht: optional; High Throughput; -* @is_vht: optional; Very High Throughput; -* @ap_reachability: optional; indicates whether the AP identified by this BSSID is -* reachable by the STA that requested the neighbor report. For example, -* the AP identified by this BSSID is reachable for the exchange of -* preauthentication frames; -* @security: optional; indicates whether the AP identified by this BSSID supports -* the same security provisioning as used by the STA in its current association; -* @key_scope: optional; indicates whether the AP indicated by this BSSID has the -* same authenticator as the AP sending the report; -* @Mobility: optional; indicate whether the AP represented by this BSSID is -* including an MDE in its Beacon frames and that the contents of that MDE are -* identical to the MDE advertised by the AP sending the report; -*/ -struct GNU_PACKED nr_info { - UINT8 channum; - UINT8 phytype; - UINT8 regclass; - UINT16 capinfo; - UINT8 bssid[MAC_ADDR_LEN]; - UINT8 preference; - UINT8 is_ht; - UINT8 is_vht; - UINT8 ap_reachability; - UINT8 security; - UINT8 key_scope; - UINT8 mobility; -}; - -/** -* @dialogtoken: mandatory; must the same with neighbor request from sta -* or 0 on behalf of automatic report -* @nrresp_info_count: mandatory; the num of neighbor elements;must bigger -* than 0 and not exceeds 5; -* @nrresp_info: info of neighbor elements; mandatory; -*/ -typedef struct GNU_PACKED rrm_nrrsp_info_custom_s { - UINT8 peer_address[MAC_ADDR_LEN]; - UINT8 dialogtoken; - UINT8 nrresp_info_count; - struct nr_info nrresp_info[0]; -} rrm_nrrsp_info_custom_t, *p_rrm_nrrsp_info_custom_t; - -/*#ifdef WNM_NEW_API*/ -#define URL_LEN 40 - -#define OID_802_11_WNM_COMMAND 0x094A -#define OID_802_11_WNM_EVENT 0x094B -#define RT_QUERY_WNM_CAPABILITY (OID_GET_SET_FROM_UI | OID_802_11_WNM_COMMAND) - -enum wnm_cmd_subid { - OID_802_11_WNM_CMD_ENABLE = 0x01, - OID_802_11_WNM_CMD_CAP, - OID_802_11_WNM_CMD_SEND_BTM_REQ, - OID_802_11_WNM_CMD_QUERY_BTM_CAP, - OID_802_11_WNM_CMD_SEND_BTM_REQ_IE, - OID_802_11_WNM_CMD_SET_BTM_REQ_PARAM, -}; - -enum wnm_event_subid { - OID_802_11_WNM_EVT_BTM_QUERY = 0x01, - OID_802_11_WNM_EVT_BTM_RSP, -}; - -struct GNU_PACKED wnm_command { - UINT8 command_id; - UINT8 command_len; - UINT8 command_body[0]; -}; - -struct GNU_PACKED wnm_event { - UINT8 event_id; - UINT32 event_len; - UINT8 event_body[0]; -}; - -typedef struct GNU_PACKED btm_req_ie_data_s { - UINT32 ifindex; - UINT8 peer_mac_addr[6]; - UINT8 dialog_token; - UINT32 timeout; - UINT32 btm_req_len; - UINT8 btm_req[0]; -} btm_req_ie_data_t, *p_btm_req_ie_data_t; - -struct GNU_PACKED btm_req_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; - UINT32 btm_req_len; - UCHAR btm_req[0]; -}; - -struct GNU_PACKED btm_query_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; - UINT32 btm_query_len; - UCHAR btm_query[0]; -}; - -struct GNU_PACKED btm_rsp_data { - UINT32 ifindex; - UCHAR peer_mac_addr[6]; -#ifdef CONFIG_STEERING_API_SUPPORT - UINT32 timestamp; -#endif - UINT32 btm_rsp_len; - UCHAR btm_rsp[0]; -}; - -struct GNU_PACKED reduced_neighbor_list_data { - u32 ifindex; - u32 reduced_neighbor_list_len; - char reduced_neighbor_list_req[0]; -}; - -struct GNU_PACKED neighbor_list_data { - u32 ifindex; - u32 neighbor_list_len; - char neighbor_list_req[0]; -}; - -/** -* @sta_mac: mandatory; mac of sta sending the frame; -* @dialogtoken: optional; dialog token; -* @reqmode: optional; request mode; -* @disassoc_timer: optional; the time(TBTTs) after which the AP will issue -* a Disassociation frame to this STA; -* @valint: optional; the number of beacon transmission times (TBTTs) until -* the BSS transition candidate list is no longer valid; -* @timeout: optional; driver will send timeout event after timeout value -* if no beacon report received; unit s; -* @TSF: optional; BSS Termination TSF; -* @duration: optional; number of minutes for which the BSS is not present; -* @url_len: optional; -* @url: optional; only valid when you specify url; -* @num_candidates: mandatory; num of candidates; -* @candidates: mandatory; request mode; the num of candidate is no larger -* than 5; -*/ -typedef struct GNU_PACKED btm_reqinfo_s { - UINT8 sta_mac[MAC_ADDR_LEN]; - UINT8 dialogtoken; - UINT8 reqmode; - UINT16 disassoc_timer; - UINT8 valint; - UINT32 timeout; - UINT64 TSF; - UINT16 duration; - UINT8 url_len; - UINT8 url[URL_LEN]; - UINT8 num_candidates; - struct nr_info candidates[0]; -} btm_reqinfo_t, *p_btm_reqinfo_t; - -struct GNU_PACKED vie_op_data_s { - UINT32 frm_type_map; - ULONG vie_length; /*the total length which starts from oui until the tail.*/ - UCHAR oui_oitype[4]; /*used to comparism*/ - /*if add/remove/update, pass the content to driver. if show, repoort the content to user space.*/ - UCHAR app_ie_ctnt[255]; /*ugly hard-code size.*/ -}; - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -#define OID_SET_CH_SWITCH_DURATION 0x1803 -#define CH_SWITCH_MONITOR_DONE_EVENT_FLAG 0x1804 -#endif -#ifdef CONFIG_STEERING_API_SUPPORT -#ifndef HASH_TABLE_SIZE -#define HASH_TABLE_SIZE 256 /* Size of hash tab must be power of 2. */ -#endif - -#define OID_802_11_BTM_ACTION_FRAME_REQUEST 0x06b0 -#define OID_STEER_ACTION 0x06b1 -#define OID_802_11_GET_OPERATING_CLASS 0x06b2 -#define OID_NON_ASSOCIATED_STA_REPORT_CAPABLE 0x06b3 -#define OID_NON_ASSOCIATED_STA_REPORT_ENABLE 0x06b4 -#define OID_NON_ASSOCIATED_STA_REPORT 0x06b5 -/* #define OID_802_11_BTM_ACTION_FRAME_RESPONSE 0x06b1 */ - -#define BLOCKED_LIST_MAX_TABLE_SIZE 128 -#define NA_STA_PROBE_DATA_LIST_SIZE 4 -#define NA_STA_REPORT_SIZE 2 - -typedef struct _BLACKLIST_ACTION { - UINT Action; - UINT Timer; -} BLACKLIST_ACTION, *PBLACKLIST_ACTION; - -typedef struct _STEER_ACTION_TYPE { - UCHAR StaMac[MAC_ADDR_LEN]; - INT Type; - BLACKLIST_ACTION BlkListAction; -} STEER_ACTION_TYPE, *PSTEER_ACTION_TYPE; - -typedef struct _BTM_REQUEST_ACTION_FRAME { - UCHAR CategoryType[4]; - UCHAR MacAddr[MAC_ADDR_LEN]; - UCHAR Payload[1024]; -} BTM_REQUEST_ACTION_FRAME, *PBTM_REQUEST_ACTION_FRAME; - -#endif - -#ifdef CUSTOMER_VENDOR_IE_SUPPORT -struct customer_vendor_ie { - NDIS_SPIN_LOCK vendor_ie_lock; - CHAR *pointer; - UINT16 length; -}; - -struct customer_oui_filter { - NDIS_SPIN_LOCK oui_filter_lock; - CHAR *pointer; - UINT16 length; -}; - -struct vendor_ie { - UCHAR element_id; - UCHAR len; - UCHAR custom_ie[255]; -}; - -struct probe_req_report { - UCHAR band; /*0:2.4G, 1:5G*/ - UCHAR sta_mac[MAC_ADDR_LEN]; - struct vendor_ie vendor_ie; -}; - -#endif /* CUSTOMER_VENDOR_IE_SUPPORT */ - -#ifdef APCLI_OWE_SUPPORT -#define OID_802_11_OWE_TRANS_COMMAND 0x0990 -#define OID_802_11_OWE_TRANS_EVENT 0x0991 - -enum owe_event_subid { - OID_802_11_OWE_EVT_DIFF_BAND = 0x01, - OID_802_11_OWE_EVT_SAME_BAND_DIFF_CHANNEL = 0x02, -}; - -struct GNU_PACKED owe_event { - UINT8 event_id; - UINT32 event_len; - UINT8 event_body[0]; -}; - -struct GNU_PACKED owe_trans_channel_change_info { - UCHAR ifname[IFNAMSIZ]; - UCHAR pair_bssid[MAC_ADDR_LEN]; - UCHAR pair_ssid[NDIS_802_11_LENGTH_SSID]; - UCHAR pair_ssid_len; - UCHAR pair_band; - UCHAR pair_ch; -}; - -#endif - -#define OID_802_11_CHAN_SANITY_FAIL_EVENT 0x09A0 - -#define OID_GET_CPU_TEMPERATURE 0x09A1 - -#define OID_QUERY_FEATURE_SUP_LIST 0x09A2 - -#define OID_GET_WSC_PROFILES 0x0994 -#define OID_GET_MISC_CAP 0x0995 -#define OID_GET_HT_CAP 0x0996 -#define OID_GET_VHT_CAP 0x0997 -#define OID_GET_CHAN_LIST 0x0998 -#define OID_GET_OP_CLASS 0x0999 -#define OID_GET_BSS_INFO 0x099A -#define OID_GET_AP_METRICS 0x099B -#define OID_GET_NOP_CHANNEL_LIST 0x099C -#define OID_GET_WMODE 0x099E -#ifdef MAP_R2 -#define OID_GET_ASSOC_REQ 0x099F -#define OID_GET_CAC_CAP 0x09A0 -#define OID_802_11_CAC_STOP 0x09A1 -#endif -#define OID_GET_ASSOC_REQ_FRAME 0x099F - -#ifdef ACS_CTCC_SUPPORT -#define OID_802_11_GET_ACS_CHANNEL_SCORE 0x2014 - -struct auto_ch_sel_score { - UINT32 score; - UINT32 channel; -}; -struct auto_ch_sel_grp_member { - UINT32 busy_time; - UINT32 channel; -}; -struct acs_channel_score { - struct auto_ch_sel_score acs_channel_score[MAX_NUM_OF_CHANNELS + 1]; - UINT32 acs_alg; -}; -#endif -#endif /* _OID_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oid_struct.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oid_struct.h deleted file mode 100644 index b85ab7abf7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/oid_struct.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - *************************************************************************** - * Mediatek Tech Inc. - * No.1, Dusing 1st Rd., - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2018, Mediatek Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - oid.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs - - Carter Chen 2018-Oct-11 move oid_related data structure to here. -*/ -#ifndef _OID_STRUCT_H_ -#define _OID_STRUCT_H_ - -/*--------OID_QUERY_FEATURE_SUP_LIST start-----------*/ - -/*beginning of chip capability supporting list*/ -#define WIFI_CAP_HT_MODE_BITS 0 -#define WIFI_CAP_HT_MODE_MASK 0x00000001 - -#define WIFI_CAP_VHT_MODE_BITS 1 -#define WIFI_CAP_VHT_MODE_MASK 0x00000002 - -#define WIFI_CAP_HE_MODE_BITS 2 -#define WIFI_CAP_HE_MODE_MASK 0x00000004 - -#define WIFI_CAP_DBDC_SUP_MODE_BITS 3 -#define WIFI_CAP_DBDC_SUP_MODE_MASK 0x00000018 -#define WIFI_CAP_DBDC_SUP_MODE_NONE 0 -#define WIFI_CAP_DBDC_SUP_MODE_2G5G 1 /*normal dbdc supporting*/ -#define WIFI_CAP_DBDC_SUP_MODE_5G5G 2 /*for instance, 7615A*/ - -#define WIFI_CAP_CH_SUP_MODE_BITS 5 -#define WIFI_CAP_CH_SUP_MODE_MASK 0x00000060 -#define WIFI_CAP_CH_SUP_MODE_2G 0 -#define WIFI_CAP_CH_SUP_MODE_5G 1 /*5G only supporting*/ -#define WIFI_CAP_CH_SUP_MODE_2G5G 2 - -#define WIFI_CAP_ADV_SEC_SUP_BITS 7 /*CCMP-256/GCMP-128/GCMP-256*/ -#define WIFI_CAP_ADV_SEC_SUP_MASK 0x00000080 - -#define WIFI_CAP_BF_SUP_BITS 8 -#define WIFI_CAP_BF_SUP_MASK 0x00000100 - -#define WIFI_CAP_MU_MIMO_SUP_BITS 9 -#define WIFI_CAP_MU_MIMO_SUP_MASK 0x00000200 - -#define WIFI_CAP_MBSS_NUM_BITS 10 -#define WIFI_CAP_MBSS_NUM_MASK 0x00007C00 - -#define WIFI_CAP_TX_STR_NUM_BITS 15 -#define WIFI_CAP_TX_STR_NUM_MASK 0x00078000 - -#define WIFI_CAP_RX_STR_NUM_BITS 19 -#define WIFI_CAP_RX_STR_NUM_MASK 0x00780000 -/*end of chip capability supporting list*/ - -/*beginning of security supporting list*/ -#define WIFI_SEC_WEP_SUP_BITS 0 -#define WIFI_SEC_WEP_SUP_MASK 0x00000001 - -#define WIFI_SEC_WAPI_SUP_BITS 1 -#define WIFI_SEC_WAPI_SUP_MASK 0x00000002 - -#define WIFI_SEC_PMF_SUP_BITS 2 -#define WIFI_SEC_PMF_SUP_MASK 0x00000004 - -#define WIFI_SEC_WPA1_SUP_BITS 3 -#define WIFI_SEC_WPA1_SUP_MASK 0x00000008 - -#define WIFI_SEC_WPA1PSK_SUP_BITS 4 -#define WIFI_SEC_WPA1PSK_SUP_MASK 0x00000010 - -#define WIFI_SEC_WPA2_SUP_BITS 5 -#define WIFI_SEC_WPA2_SUP_MASK 0x00000020 - -#define WIFI_SEC_WPA2PSK_SUP_BITS 6 -#define WIFI_SEC_WPA2PSK_SUP_MASK 0x00000040 - -#define WIFI_SEC_WPA3_SUP_BITS 7 -#define WIFI_SEC_WPA3_SUP_MASK 0x00000080 - -#define WIFI_SEC_WPA3PSK_SUP_BITS 8 -#define WIFI_SEC_WPA3PSK_SUP_MASK 0x00000100 - -#define WIFI_SEC_WPA3SUITEB192_SUP_BITS 9 -#define WIFI_SEC_WPA3SUITEB192_SUP_MASK 0x00000200 - -#define WIFI_SEC_ENHANCE_OPEN_SUP_BITS 10 -#define WIFI_SEC_ENHANCE_OPEN_SUP_MASK 0x00000400 -/*end of security supporting list*/ - -/*beginning of wifi feature supporting list*/ -#define WIFI_FEATURE_AP_SUP_BITS 0 -#define WIFI_FEATURE_AP_SUP_MASK 0x00000001 - -#define WIFI_FEATURE_STA_SUP_BITS 1 -#define WIFI_FEATURE_STA_SUP_MASK 0x00000002 - -#define WIFI_FEATURE_REPT_SUP_BITS 2 -#define WIFI_FEATURE_REPT_SUP_MASK 0x00000004 - -#define WIFI_FEATURE_WDS_SUP_BITS 3 -#define WIFI_FEATURE_WDS_SUP_MASK 0x00000008 - -#define WIFI_FEATURE_WPS_SUP_BITS 4 -#define WIFI_FEATURE_WPS_SUP_MASK 0x00000010 - -#define WIFI_FEATURE_DFS_SUP_BITS 5 -#define WIFI_FEATURE_DFS_SUP_MASK 0x00000020 - -#define WIFI_FEATURE_VOW_SUP_BITS 6 -#define WIFI_FEATURE_VOW_SUP_MASK 0x00000040 - -#define WIFI_FEATURE_PASSPOINT_SUP_BITS 7 -#define WIFI_FEATURE_PASSPOINT_SUP_MASK 0x00000080 - -#define WIFI_FEATURE_11R_SUP_BITS 8 -#define WIFI_FEATURE_11R_SUP_MASK 0x00000100 - -#define WIFI_FEATURE_11K_SUP_BITS 9 -#define WIFI_FEATURE_11K_SUP_MASK 0x00000200 - -#define WIFI_FEATURE_11V_SUP_BITS 10 -#define WIFI_FEATURE_11V_SUP_MASK 0x00000400 - -#define WIFI_FEATURE_MBO_SUP_BITS 11 -#define WIFI_FEATURE_MBO_SUP_MASK 0x00000800 - -#define WIFI_FEATURE_MAP_SUP_BITS 12 -#define WIFI_FEATURE_MAP_SUP_MASK 0x00001000 -/*end of wifi feature supporting list*/ - -struct wifi_feature_support_list_query { - UINT32 chip_cap_list; - UINT32 sec_cap_list; - UINT32 adv_feature_cap_list; - UINT32 reserved_cap[5]; /*future extension.*/ -}; - -/*--------OID_QUERY_FEATURE_SUP_LIST end-----------*/ - -#endif /* _OID_STRUCT_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/qm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/qm.h deleted file mode 100644 index 8ae70e252b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/qm.h +++ /dev/null @@ -1,235 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __QM_H__ -#define __QM_H__ - -#define MCAST_WCID_TO_REMOVE 0 - -struct _STA_TR_ENTRY; -struct dequeue_info; - -enum { - TX_QUE_LOW, - TX_QUE_HIGH, -}; - -enum { - TX_QUE_HIGH_TO_HIGH, - TX_QUE_HIGH_TO_LOW, - TX_QUE_LOW_TO_LOW, - TX_QUE_LOW_TO_HIGH, - TX_QUE_UNKNOW_CHANGE, -}; - -enum queue_mm { GENERIC_QM, FAST_PATH_QM, GENERIC_FAIR_QM, FAST_PATH_FAIR_QM }; - -struct qm_ctl { - UINT32 total_psq_cnt; -} ____cacheline_aligned; - -/** - * @init: qm resource initialization - * @exit: qm resource exit - * @enq_mgmt_pkt: en-queue packet to management queue operation - * @enq_data_pkt: en-queue packet to data queue operation - * @get_psq_pkt: get packet from power saving queue operation - * @enq_psq_pkt: en-queue packet to power saving queue operation - * @schedule_tx_que: schedule job that may use thread, worker, or tasklet to dequeue tx queue and service packet - * @sta_clean_queue: cleanup resource inside queue per station - * @sta_dump_queue: dump resource inside queue per station per queue index - * @dump_all_sw_queue: dump all sw queue information - * @deq_data_pkt: for fair queue dequeue packet - */ - -struct qm_ops { - /* INIT/EXIT */ - INT (*init)(struct _RTMP_ADAPTER *pAd); - INT (*exit)(struct _RTMP_ADAPTER *pAd); - INT (*sta_clean_queue)(struct _RTMP_ADAPTER *pAd, UCHAR wcid); - VOID(*sta_dump_queue) - (struct _RTMP_ADAPTER *pAd, UCHAR wcid, enum PACKET_TYPE pkt_type, - UCHAR q_idx); - INT (*bss_clean_queue)(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev); - INT (*dump_all_sw_queue)(struct _RTMP_ADAPTER *ad); - - /* TX */ - INT(*enq_mgmtq_pkt) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt) ____cacheline_aligned; - INT(*enq_dataq_pkt) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, PNDIS_PACKET pkt, - UCHAR q_idx); - NDIS_PACKET *(*get_psq_pkt)(struct _RTMP_ADAPTER *pAd, - struct _STA_TR_ENTRY *tr_entry); - INT(*enq_psq_pkt) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _STA_TR_ENTRY *tr_entry, PNDIS_PACKET pkt); - INT (*schedule_tx_que)(struct _RTMP_ADAPTER *pAd); - INT32(*deq_data_pkt) - (struct _RTMP_ADAPTER *pAd, struct _TX_BLK *tx_blk, INT32 max_cnt, - struct dequeue_info *info); -} ____cacheline_aligned; - -#define MGMT_QUE_MAX_NUMS 512 -#define HIGH_PRIO_QUE_MAX_NUMS 512 -#ifdef CONFIG_RALINK_MT7621 -#define DATA_QUE_MAX_NUMS 8192 -#else -#define DATA_QUE_MAX_NUMS 4096 -#endif - -enum pkt_tx_status { - PKT_SUCCESS = 0, - INVALID_PKT_LEN = 1, - INVALID_TR_WCID = 2, - INVALID_TR_ENTRY = 3, - INVALID_WDEV = 4, - INVALID_ETH_TYPE = 5, - DROP_PORT_SECURE = 6, - DROP_PSQ_FULL = 7, - DROP_TXQ_FULL = 8, - DROP_TX_JAM = 9, - DROP_TXQ_ENQ_FAIL = 10, -}; - -struct reason_id_str { - INT id; - RTMP_STRING *code_str; -}; - -#define InitializeQueueHeader(QueueHeader) \ - { \ - (QueueHeader)->Head = (QueueHeader)->Tail = NULL; \ - (QueueHeader)->Number = 0; \ - } - -#define RemoveHeadQueue(QueueHeader) \ - (QueueHeader)->Head; \ - { \ - PQUEUE_ENTRY pNext; \ - if ((QueueHeader)->Head != NULL) { \ - pNext = (QueueHeader)->Head->Next; \ - (QueueHeader)->Head->Next = NULL; \ - (QueueHeader)->Head = pNext; \ - if (pNext == NULL) \ - (QueueHeader)->Tail = NULL; \ - (QueueHeader)->Number--; \ - } \ - } - -#define RemoveTailQueue(QueueHeader) \ - (QueueHeader)->Tail; \ - { \ - PQUEUE_ENTRY pNext; \ - if ((QueueHeader)->Head != NULL) { \ - pNext = (QueueHeader)->Head; \ - if (pNext->Next == NULL) { \ - (QueueHeader)->Head = NULL; \ - (QueueHeader)->Tail = NULL; \ - } else { \ - while (pNext->Next != (QueueHeader)->Tail) { \ - pNext = pNext->Next; \ - } \ - (QueueHeader)->Tail = pNext; \ - pNext->Next = NULL; \ - } \ - (QueueHeader)->Number--; \ - } \ - } - -#define InsertHeadQueue(QueueHeader, QueueEntry) \ - { \ - ((PQUEUE_ENTRY)QueueEntry)->Next = (QueueHeader)->Head; \ - (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry); \ - if ((QueueHeader)->Tail == NULL) \ - (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry); \ - (QueueHeader)->Number++; \ - } - -#define InsertTailQueue(QueueHeader, QueueEntry) \ - { \ - ((PQUEUE_ENTRY)QueueEntry)->Next = NULL; \ - if ((QueueHeader)->Tail) \ - (QueueHeader)->Tail->Next = \ - (PQUEUE_ENTRY)(QueueEntry); \ - else \ - (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry); \ - (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry); \ - (QueueHeader)->Number++; \ - } - -#define InsertTailQueueAc(pAd, pEntry, QueueHeader, QueueEntry) \ - { \ - ((PQUEUE_ENTRY)QueueEntry)->Next = NULL; \ - if ((QueueHeader)->Tail) \ - (QueueHeader)->Tail->Next = \ - (PQUEUE_ENTRY)(QueueEntry); \ - else \ - (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry); \ - (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry); \ - (QueueHeader)->Number++; \ - } - -#define PickFromQueue(QueueHeader, QueuePrevEntry, QueueEntry) \ - do { \ - PQUEUE_ENTRY pHead; \ - if ((QueueHeader)->Head != (PQUEUE_ENTRY)QueueEntry) { \ - ((PQUEUE_ENTRY)QueuePrevEntry)->Next = \ - ((PQUEUE_ENTRY)QueueEntry)->Next; \ - ((PQUEUE_ENTRY)QueueEntry)->Next = NULL; \ - if (((QueueHeader)->Tail) == \ - (PQUEUE_ENTRY)QueueEntry) { \ - (QueueHeader)->Tail = \ - (PQUEUE_ENTRY)QueuePrevEntry; \ - (QueueHeader)->Tail->Next = \ - (PQUEUE_ENTRY)(QueuePrevEntry); \ - ((PQUEUE_ENTRY)QueuePrevEntry)->Next = NULL; \ - } \ - (QueueHeader)->Number--; \ - } else { \ - pHead = RemoveHeadQueue(QueueHeader); \ - ((PQUEUE_ENTRY)QueueEntry)->Next = NULL; \ - } \ - } while (0); - -#define DEQUEUE_LOCK(lock, bIntContext, IrqFlags) \ - do { \ - if (bIntContext == FALSE) \ - RTMP_IRQ_LOCK((lock), IrqFlags); \ - } while (0) - -#define DEQUEUE_UNLOCK(lock, bIntContext, IrqFlags) \ - do { \ - if (bIntContext == FALSE) \ - RTMP_IRQ_UNLOCK((lock), IrqFlags); \ - } while (0) - -VOID ge_tx_pkt_deq_func(struct _RTMP_ADAPTER *pAd); -VOID RTMPDeQueuePacket(struct _RTMP_ADAPTER *pAd, BOOLEAN bIntContext, - UCHAR QueIdx, INT wcid, INT Max_Tx_Packets); -INT ge_enq_req(struct _RTMP_ADAPTER *pAd, PNDIS_PACKET pkt, UCHAR qidx, - struct _STA_TR_ENTRY *tr_entry, QUEUE_HEADER *pPktQueue); -VOID ge_tx_swq_dump(struct _RTMP_ADAPTER *pAd, INT qidx); -INT qm_init(struct _RTMP_ADAPTER *pAd); -INT qm_exit(struct _RTMP_ADAPTER *pAd); -VOID qm_leave_queue_pkt(struct wifi_dev *wdev, struct _QUEUE_HEADER *queue, - NDIS_SPIN_LOCK *lock); -INT deq_packet_gatter(struct _RTMP_ADAPTER *pAd, struct dequeue_info *deq_info, - struct _TX_BLK *pTxBlk); -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ra_ac_q_mgmt.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ra_ac_q_mgmt.h deleted file mode 100644 index ab1c7dbe98..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/ra_ac_q_mgmt.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - ra_ac_q_mgmt.h -*/ - -#include "rt_config.h" - -#ifndef _RA_AC_Q_MGMT_H_ -#define _RA_AC_Q_MGMT_H_ - -#if defined(RED_SUPPORT) && (defined(MT7622) || defined(P18) || defined(MT7663)) -#define RED_SUPPORT_BY_HOST -#endif - -#define CFG_RED_TRUN_ON_RANDOM_DROP (0) -#define CFG_ESTIMATION_RED_CPU_UTILIZATION (0) - -#define RED_STA_REC_NUM MAX_LEN_OF_MAC_TABLE - -#define QLEN_SCALED_BIT (0) -#define PROB_SCALED_BIT (0) -#define QTH_WRIGTH_BIT (2) -#define WSCALING_BIT (16) -#define QLEN_SCALED (1 << QLEN_SCALED_BIT) -#define PROB_SCALED (1 << PROB_SCALED_BIT) - -#define RED_DROP_TH_LOWER_BOUND (20) -#define RED_DROP_TH_UPPER_BOUND (600) - -#define RED_VHT_BW20_DEFAULT_THRESHOLD (384) -#define RED_VHT_BW40_DEFAULT_THRESHOLD (768) -#define RED_VHT_BW80_DEFAULT_THRESHOLD (1536) -#define RED_HT_BW20_DEFAULT_THRESHOLD (192) -#define RED_HT_BW40_DEFAULT_THRESHOLD (384) -#define RED_LEGACY_DEFAULT_THRESHOLD (192) - -#define RED_WLOG_DEFAULT (10) -#define RED_MPDU_TIME_INIT (200) -#define RED_MULTIPLE_NUM_DEFAULT (30) -#define RA_AC_FREE_FOR_ALL (3072) - -#define RED_BAD_NODE_DROP_THRESHOLD (192) -#define RED_BAD_NODE_HT_VHT_DEFAULT_THRESHOLD (192) -#define RED_BAD_NODE_LEGACY_DEFAULT_THRESHOLD (60) -#define RED_MAX_BAD_NODE_CNT (10) -#define RED_MAX_GOOD_NODE_CNT (7) -#define RED_BAD_NODE_CNT_MASK (0x0f) -#define RED_GOOD_NODE_CNT_MASK (0x70) -#define RED_IS_BAD_NODE_MASK (0x80) -#define RED_GOOD_NODE_CNT_SHIFT_BIT (4) -#define RED_IS_BAD_NODE_SHIFT_BIT (7) - -#define VOW_FEATURE_CONFIGURE_CR (0x82060370) -#define VOW_WATF_MASK (0x02000000) -#define VOW_ATF_MASK (0x20000000) -#define VOW_ATC_SHIFT_BIT (31) -#define VOW_ATF_SHIFT_BIT (29) -#define VOW_WATF_SHIFT_BIT (25) - -#define FORCE_RATIO_THRESHOLD (25) - -#define TX_DONE_EVENT_Q_IDX_MASK (0xf8000000) -#define TX_DONE_EVENT_Q_IDX_SHIFT_BIT (27) -#define TX_DONE_EVENT_WLAN_ID_MASK (0x03ff0000) -#define TX_DONE_EVENT_WLAN_ID_SHIFT_BIT (16) - -#define RED_INUSE_BITSHIFT 5 -#define RED_INUSE_BITMASK (0x1f) - -/* per AC data structure */ -typedef struct _RED_AC_ElEMENT_T { - UINT32 u2TotalDropCnt; - UINT16 u2DropCnt; - UINT16 u2EnqueueCnt; - UINT16 u2DequeueCnt; - UINT16 u2qEmptyCnt; - UINT8 ucShiftBit; - UINT8 ucGBCnt; -#if (CFG_RED_TRUN_ON_RANDOM_DROP == 1) - INT8 iWlogBit; - UINT32 u4AvgLen; - UINT16 u2qRan; - UINT16 u2qCount; - UINT16 u2DropProbCnt; - UINT16 u2DropTailCnt; -#endif -} RED_AC_ElEMENT_T, *P_RED_AC_ElEMENT_T; - -/* per STA data structure */ -typedef struct _RED_STA_T { - INT32 i4MpduTime; - INT32 tx_msdu_avg_cnt; - INT32 tx_msdu_cnt; - UINT16 u4Dropth; - UINT16 u2DriverFRCnt; /* Record ForceRate counter which is from Driver. */ - UINT8 ucMultiplyNum; - RED_AC_ElEMENT_T arRedElm[WMM_NUM_OF_AC]; -#if (CFG_RED_TRUN_ON_RANDOM_DROP == 1) - BOOLEAN ucIsBadNode; - UINT32 u4IGMPCnt; - UINT32 u4TxmCnt; -#endif -} RED_STA_T, *P_RED_STA_T; - -VOID RedInit(PRTMP_ADAPTER pAd); - -VOID RedResetSta(UINT8 ucWlanIdx, UINT_8 ucMode, UINT_8 ucBW, - struct _RTMP_ADAPTER *pAd); - -VOID RedBadNode(UINT8 ucWlanIdx, UINT8 ATC_WATF_Enable, - struct _RTMP_ADAPTER *pAd); - -bool RedMarkPktDrop(UINT8 ucWlanIdx, UINT8 ucQidx, struct _RTMP_ADAPTER *pAd); - -bool red_mark_pktdrop_cr4(UINT8 ucWlanIdx, UINT8 ucQidx, - struct _RTMP_ADAPTER *pAd); - -VOID RedRecordCP(UINT8 ucWlanIdx, struct _RTMP_ADAPTER *pAd); - -VOID red_recordcp_cr4(UINT8 ucWlanIdx, struct _RTMP_ADAPTER *pAd); - -VOID RedEnqueueFail(UINT8 ucWlanIdx, UINT8 ucQidx, struct _RTMP_ADAPTER *pAd); - -VOID red_enqueue_fail_cr4(UINT8 ucWlanIdx, UINT8 ucQidx, - struct _RTMP_ADAPTER *pAd); - -VOID RedSetTargetDelay(INT16 i2TarDelay, struct _RTMP_ADAPTER *pAd); - -INT32 RedCalProbB(UINT8 ucWlanIdx, UINT8 ac); - -/* VOID RedUpdatePBC(P_WIFI_CMD_T prWiFiCmd); */ - -VOID RedRecordForceRateFromDriver(RTMP_ADAPTER *pAd, UCHAR wcid); - -VOID RedCalForceRateRatio(UINT8 ucWcid, UINT16 u2N9ARCnt, UINT16 u2N9FRCnt, - struct _RTMP_ADAPTER *pAd); - -VOID RedTxFreeEventNotifyHandler(RTMP_ADAPTER *pAd, UINT8 ucQidx, - PNDIS_PACKET pkt); - -VOID appShowRedDebugMessage(struct _RTMP_ADAPTER *pAd); - -VOID UpdateWlogBit(UINT8 ucWlanIdx, UINT32 u4Mpdutime); - -VOID UpdateThreshold(UINT8 ucWlanIdx, RTMP_ADAPTER *pAd); - -VOID UpdateAirtimeRatio(UINT8 ucWlanIdx, UINT8 ucAirtimeRatio, UINT8 ATCEnable, - struct _RTMP_ADAPTER *pAd); - -VOID UpdateTargetDelay(UINT8 ATC_WATF_Enable, struct _RTMP_ADAPTER *pAd); - -int uint32_log2(UINT32 n); - -INT set_red_enable(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT set_red_show_sta(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT set_red_target_delay(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT set_red_debug_enable(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT show_red_info(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -INT set_red_dump_reset(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -#endif /* _RA_AC_Q_MGMT_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/radar.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/radar.h deleted file mode 100644 index d2b4a22612..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/radar.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - radar.h - - Abstract: - CS/DFS common functions. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __RADAR_H__ -#define __RADAR_H__ - -struct freq_cfg; - -#define DEFAULT_CAL_BUF_TIME 60 -#define DEFAULT_CAL_BUF_TIME_MAX 0x10000 -#define RDD_CHECK_NOP_BY_WDEV 0 -/* RESTRICTION_BAND_1: 5600MHz ~ 5650MHz */ -#define RESTRICTION_BAND_1(_pAd, __Channel, _BW) \ - (_BW >= BW_40 ? ((__Channel >= 116) && (__Channel <= 128)) : \ - ((__Channel >= 120) && (__Channel <= 128))) - -#define RESTRICTION_BAND_KOREA(_pAd, __Channel, _BW) \ - (_BW >= BW_80 ? \ - ((__Channel >= 116) && (__Channel <= 128)) : \ - (_BW >= BW_40 ? ((__Channel >= 124) && (__Channel <= 128)) : \ - (__Channel == 128))) - -#define IS_DOT11_H_RADAR_STATE(_pAd, _RadarState, __Channel, _pDot11h) \ - ((__Channel > 14) && (_pAd->CommonCfg.bIEEE80211H == 1) && \ - RadarChannelCheck(_pAd, __Channel) && \ - _pDot11h->RDMode == _RadarState) - -#ifdef MT_DFS_SUPPORT -#define IS_SUPPORT_MT_DFS(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bDfsEnable == TRUE) - -#define UPDATE_MT_ZEROWAIT_DFS_STATE(_pAd, _State) \ - { \ - _pAd->CommonCfg.DfsParameter.ZeroWaitDfsState = _State; \ - } - -#define UPDATE_MT_ZEROWAIT_DFS_Support(_pAd, _Enable) \ - { \ - _pAd->CommonCfg.DfsParameter.bZeroWaitSupport = _Enable; \ - } - -#define IS_SUPPORT_MT_ZEROWAIT_DFS(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bZeroWaitSupport == TRUE) - -#define IS_SUPPORT_DEDICATED_ZEROWAIT_DFS(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bDedicatedZeroWaitSupport == TRUE) - -#ifdef ONDEMAND_DFS -#define IS_SUPPORT_ONDEMAND_ZEROWAIT_DFS(_pAd) \ - ((_pAd->CommonCfg.DfsParameter.bOnDemandZeroWaitSupport == TRUE) && \ - (_pAd->CommonCfg.DfsParameter.bDfsEnable == TRUE) && \ - (_pAd->CommonCfg.bIEEE80211H == TRUE)) - -#define IS_ONDEMAND_ACS_LIST_VALID(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bOnDemandChannelListValid == TRUE) -#define SET_ONDEMAND_ACS_LIST_INVALID(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bOnDemandChannelListValid = FALSE) -#endif - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -#define IS_SUPPORT_V10_DFS(_pAd) \ - ((_pAd->CommonCfg.DfsParameter.bDFSV10Support == TRUE) && \ - (_pAd->CommonCfg.DfsParameter.bDfsEnable == TRUE) && \ - (_pAd->CommonCfg.bIEEE80211H == TRUE)) - -#define IS_DFS_V10_ACS_VALID(_pAd) \ - (_pAd->CommonCfg.DfsParameter.bV10ChannelListValid == TRUE) -#define SET_DFS_V10_ACS_VALID(_pAd, valid) \ - (_pAd->CommonCfg.DfsParameter.bV10ChannelListValid = valid) -#endif - -#define CHK_MT_ZEROWAIT_DFS_STATE(_pAd, __STATE) \ - ((_pAd->CommonCfg.DfsParameter.ZeroWaitDfsState == __STATE)) - -#define GET_MT_ZEROWAIT_DFS_STATE(_pAd) \ - ((_pAd->CommonCfg.DfsParameter.ZeroWaitDfsState)) - -#define UPDATE_MT_INIT_ZEROWAIT_MBSS(_pAd, _Enable) \ - { \ - _pAd->CommonCfg.DfsParameter.bInitMbssZeroWait = _Enable; \ - } - -#define GET_MT_MT_INIT_ZEROWAIT_MBSS(_pAd) \ - ((_pAd->CommonCfg.DfsParameter.bInitMbssZeroWait)) - -#endif /* MT_DFS_SUPPORT */ - -/* 802.11H */ -struct DOT11_H { - /* 802.11H and DFS related params */ - UCHAR CSCount; /*Channel switch counter */ - UCHAR CSPeriod; /*Channel switch period (beacon count) */ - USHORT RDCount; /*Radar detection counter, if RDCount > ChMovingTime, start to send beacons*/ - UCHAR RDMode; /*Radar Detection mode */ - UCHAR org_ch; - UCHAR new_channel; - USHORT ChMovingTime; - USHORT DfsZeroWaitChMovingTime; - BOOLEAN bDFSIndoor; - ULONG InServiceMonitorCount; /* unit: sec */ - ULONG CalBufTime; /* A Timing buffer for befroe calibrations which generates Tx signals */ - UINT16 wdev_count; -#ifdef CONFIG_MAP_SUPPORT - BOOLEAN cac_not_required; -#endif -}; - -BOOLEAN RadarChannelCheck(IN PRTMP_ADAPTER pAd, IN UCHAR Ch); - -VOID RadarStateCheck(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -BOOLEAN CheckNonOccupancyChannel(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - IN UCHAR ch); - -ULONG JapRadarType(IN PRTMP_ADAPTER pAd); - -UCHAR get_channel_by_reference(IN PRTMP_ADAPTER pAd, IN UINT8 mode, - IN struct wifi_dev *wdev); - -#ifdef CONFIG_AP_SUPPORT -VOID ChannelSwitchingCountDownProc(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev); - -NTSTATUS Dot11HCntDownTimeoutAction(RTMP_ADAPTER *pAd, PCmdQElmt CMDQelmt); - -#ifdef CUSTOMER_DCC_FEATURE -VOID ChannelSwitchingCountDownProcNew(IN PRTMP_ADAPTER pAd, - struct wifi_dev *wdev); -#endif - -#endif /* CONFIG_AP_SUPPORT */ - -VOID RadarDetectPeriodic(IN PRTMP_ADAPTER pAd, IN UCHAR Channel); - -INT Set_CSPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_ChMovingTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_BlockChReset_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* wdev->pDot11H Initailization */ -VOID UpdateDot11hForWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BOOLEAN attach); - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -INT Set_RadarMinLPN_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_RadarThresholdParam_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_RadarPulseThresholdParam_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_RadarDbgLogConfig_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT -INT Set_RadarTestPulsePattern_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */ - -#endif /* __RADAR_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/routing_tab.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/routing_tab.h deleted file mode 100644 index b737d3087e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/routing_tab.h +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef __ROUTING_TAB_H__ -#define __ROUTING_TAB_H__ -/* - *************************************************************************** - * Ralink Tech Inc. - * 5F., No.36, Taiyuan St., Jhubei City, - * Hsinchu County 302, - * Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - - Module Name: - routing_tab.h - - Abstract: - This is a tab used to record all entries behind associated APClinet or STA/PC. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifdef ROUTING_TAB_SUPPORT -#include "rtmp_def.h" -#include "rtmp.h" - -#define ROUTING_ENTRY_AGEOUT (60 * OS_HZ) /* seconds */ -#define ROUTING_ENTRY_RETRY_TIME (2 * OS_HZ) /* seconds */ -#define ROUTING_ENTRY_MAX_RETRY 5 -#define ROUTING_POOL_SIZE 256 -#define ROUTING_HASH_TAB_SIZE \ - 64 /* the legth of hash table must be power of 2. */ - -enum ROUTING_ENTRY_FLAG { - ROUTING_ENTRY_NONE = 0x0, - ROUTING_ENTRY_A4 = 0x1, - ROUTING_ENTRY_IGMP = 0x2, - ROUTING_ALL_MASK = 0x3 -}; - -#define IS_VALID_ROUTING_ENTRY_FLAG(_x) (((_x)&ROUTING_ALL_MASK) != 0) -#define IS_ROUTING_ENTRY(_x) ((_x)->EntryFlag != ROUTING_ENTRY_NONE) -#define SET_ROUTING_ENTRY(_x, _y) ((_x)->EntryFlag |= (_y)) -#define CLEAR_ROUTING_ENTRY(_x, _y) ((_x)->EntryFlag &= ~(_y)) -#define ROUTING_ENTRY_TEST_FLAG(_x, _y) (((_x)->EntryFlag & (_y)) != 0) - -typedef struct _ROUTING_ENTRY { - struct _ROUTING_ENTRY *pNext; - UINT32 EntryFlag; - ULONG KeepAliveTime; - ULONG RetryTime; - UCHAR Retry; - UCHAR Valid; - UCHAR Wcid; - UINT32 IPAddr; - UCHAR Mac[MAC_ADDR_LEN]; -#ifdef A4_CONN - UCHAR NeedRefresh; -#endif -} ROUTING_ENTRY, *PROUTING_ENTRY; - -VOID RoutingTabInit(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN UINT32 Flag); - -VOID RoutingTabDestory(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN UINT32 Flag); - -VOID RoutingTabClear(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN UINT32 Flag); - -PROUTING_ENTRY RoutingTabGetFree(IN struct _RTMP_ADAPTER *pAd, - IN UCHAR ifIndex); - -VOID RoutingTabSetAllFree(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN UCHAR Wcid, IN UINT32 Flag); - -VOID RoutingTabSetOneFree(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN PUCHAR pMac, IN UINT32 Flag); - -VOID RoutingEntryRefresh(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN PROUTING_ENTRY pRoutingEntry); - -VOID RoutingEntrySet(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN UCHAR Wcid, IN PUCHAR pMac, - IN PROUTING_ENTRY pRoutingEntry); - -INT RoutingTabGetEntryCount(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex); - -INT32 GetHashID(IN PUCHAR pMac); - -PROUTING_ENTRY GetRoutingTabHead(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN INT32 Index); - -BOOLEAN GetRoutingEntryAll(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN UCHAR Wcid, IN UINT32 Flag, IN INT32 BufMaxCount, - OUT ROUTING_ENTRY **pEntryListBuf, - OUT PUINT32 pCount); - -PROUTING_ENTRY RoutingTabLookup(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN PUCHAR pMac, IN BOOLEAN bUpdateAliveTime, - OUT UCHAR *pWcid); - -VOID RoutingTabARPLookupUpdate(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN PROUTING_ENTRY pRoutingEntry, - IN UINT32 ARPSenderIP); - -INT RoutingEntrySendAliveCheck(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex, - IN PROUTING_ENTRY pRoutingEntry, - IN UCHAR *pSrcMAC, IN UINT32 SrcIP); - -VOID RoutingTabMaintain(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ifIndex); - -#endif /* ROUTING_TAB_SUPPORT */ -#endif /* __ROUTING_TAB_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rrm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rrm.h deleted file mode 100644 index 99c68b14d9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rrm.h +++ /dev/null @@ -1,476 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Abstract: - -***************************************************************************/ - -#ifndef __RRM_H -#define __RRM_H - -#ifdef DOT11K_RRM_SUPPORT -#include "rtmp_type.h" -#include "rrm_cmm.h" - -#define RRM_QUIET_CNT_DEC(_V, _M) ((_V) == 0 ? (_V = _M) : (_V)--) - -#define IS_RRM_ENABLE(_P) ((_P)->RrmCfg.bDot11kRRMEnable == TRUE) - -#define IS_RRM_CAPABLE(_P) ((_P)->CapabilityInfo & RRM_CAP_BIT) - -#define IS_RRM_BEACON_ACTIVE_MEASURE(_P) \ - ((_P)->RrmEnCap.field.BeaconActiveMeasureCap == 1) - -#define IS_RRM_BEACON_PASSIVE_MEASURE(_P) \ - ((_P)->RrmEnCap.field.BeaconPassiveMeasureCap == 1) - -#define IS_RRM_BEACON_TABLE_MEASURE(_P) \ - ((_P)->RrmEnCap.field.BeaconTabMeasureCap == 1) - -#define IS_RRM_QUIET(_P) ((_P)->RrmCfg.QuietCB.QuietState == RRM_QUIET_SILENT) - -#define RRM_BCNREQ_MODE_OFFSET 13 - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -void RRM_ReadParametersFromFile(IN PRTMP_ADAPTER pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *buffer); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -INT Set_Dot11kRRM_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -INT Set_BeaconReq_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BeaconReq_RandInt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -INT Set_LinkMeasureReq_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -INT Set_TxStreamMeasureReq_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -INT Set_RRM_Selftest_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -INT RRM_InfoDisplay_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_CfgInit(IN PRTMP_ADAPTER pAd); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_QuietUpdata(IN PRTMP_ADAPTER pAd); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertBcnReqIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN PUCHAR pBcnReq); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertBcnReqSsidSubIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN PUCHAR pSsid, - IN UINT8 SsidLen); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertBcnReqRepCndSubIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 RepCnd, - IN UINT8 Threshold); - -VOID RRM_InsertBcnReqRepDetailSubIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 Detail); - -/* - ========================================================================== - Description: - Insert RRM Enable Capabilitys IE into frame. - - Parametrs: - 1. frame buffer pointer. - 2. frame length. - - Return : None. - ========================================================================== - */ -VOID RRM_InsertRRMEnCapIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN INT BssIdx); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertNeighborRepIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 Len, - IN RRM_PNEIGHBOR_REP_INFO pNeighborRepInfo); -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertNeighborTSFOffsetSubIE(IN PRTMP_ADAPTER pAd, - OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT16 TSFOffset, - IN UINT16 BcnInterval); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertQuietIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 QuietCnt, - IN UINT8 QuietPeriod, IN UINT8 QuietDuration, - IN UINT8 QuietOffset); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertBssACDelayIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertBssAvailableACIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertRequestIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 ie_num, - IN PUINT8 ie_list); - -VOID RRM_InsertRequestIE_11KV_API(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN PUCHAR pRequest, - IN UINT8 RequestLen); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertTxStreamReqIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN PUCHAR pBuf); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_InsertTxStreamReqTriggerReportSubIE(IN PRTMP_ADAPTER pAd, - OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, - IN PUCHAR pBuf); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_EnqueueBcnReq(IN PRTMP_ADAPTER pAd, IN UINT8 Aid, IN UINT8 IfIdx, - IN PRRM_MLME_BCN_REQ_INFO pMlmeBcnReq); - -#ifdef CONFIG_11KV_API_SUPPORT -INT rrm_send_beacon_req_param(IN PRTMP_ADAPTER pAd, IN p_bcn_req_info pBcnReq, - IN UINT32 BcnReqLen); - -int check_rrm_BcnReq_custom_params(IN RTMP_ADAPTER *pAd, - IN p_bcn_req_info pBcnReq); - -VOID set_rrm_BcnReq_optional_params(IN RTMP_ADAPTER *pAd, - IN p_bcn_req_info p_beacon_req); - -void compose_rrm_BcnReq_ie(IN RTMP_ADAPTER *pAd, OUT PUCHAR beacon_req_ie, - OUT PUINT32 beacon_req_ie_len, - IN p_bcn_req_info p_beacon_req, - IN UINT8 measure_req_token, IN UCHAR ifidx); - -void wext_send_bcn_rsp_event(PNET_DEV net_dev, PUCHAR peer_mac_addr, - PUCHAR bcn_rsp, UINT32 bcn_rsp_len, - UINT8 dia_token); -#endif /* COFNIG_11KV_API_SUPPORT */ - -BOOLEAN RRM_CheckBssAndStaSecurityMatch(IN PRTMP_ADAPTER pAd, - IN PMAC_TABLE_ENTRY pEntry, - IN BSS_ENTRY *pBssEntry); - -VOID RRM_EnqueueNeighborRep(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN UINT8 DialogToken, IN PCHAR pSsid, - IN UINT8 SsidLen); - -VOID RRM_EnqueueLinkMeasureReq(IN PRTMP_ADAPTER pAd, IN UINT8 Aid, - IN UINT8 apidx); - -VOID RRM_EnqueueTxStreamMeasureReq( - IN PRTMP_ADAPTER pAd, IN UINT8 Aid, IN UINT8 apidx, - IN PRRM_MLME_TRANSMIT_REQ_INFO pMlmeTxMeasureReq); -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -BOOLEAN RRM_PeerNeighborReqSanity(IN PRTMP_ADAPTER pAd, IN VOID *pMsg, - IN ULONG MsgLen, OUT PUINT8 pDialogToken, - OUT PCHAR *pSsid, OUT PUINT8 pSsidLen); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -BOOLEAN RRM_PeerMeasureReportSanity(IN PRTMP_ADAPTER pAd, IN VOID *pMsg, - IN ULONG MsgLen, OUT PUINT8 pDialogToken, - OUT PMEASURE_REPORT_INFO pMeasureReportInfo, - OUT PVOID *pMeasureRep); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -VOID RRM_PeerNeighborReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID RRM_PeerMeasureRepAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -#ifdef FTM_SUPPORT -VOID RRM_InsertNeighborMsmtRptLocationLCISubIE( - IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, OUT PULONG pFrameLen, - IN PRRM_CONFIG pRrmCfg, IN PMSMT_RPT_SUBELEMENT pLciHdr, - IN PUSAGE_SUBELEMENT pLciUsage, IN PZ_ELEMENT pLciZ, IN PLCI_FIELD pLci, - IN BOOLEAN bSetZRpt); - -VOID RRM_InsertNeighborMsmtRptLocationCIVICSubIE( - IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, OUT PULONG pFrameLen, - IN PRRM_CONFIG pRrmCfg, IN PMSMT_RPT_SUBELEMENT pCivicHdr, - IN PLOCATION_CIVIC pCivic, IN UINT8 *pCA_Value); - -#endif /* FTM_SUPPORT */ - -void init_rrm_capabilities(PRRM_CONFIG pRrmCfg, BSS_STRUCT *pMBss); - -int set_rrm_capabilities(RTMP_ADAPTER *pAd, UINT8 *rrm_capabilities); - -int rrm_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq); - -int RRM_EnqueueBcnReqAction(IN PRTMP_ADAPTER pAd, IN UINT8 IfIdx, - IN p_bcn_req_data_t p_bcn_req_data); - -int Set_Dot11kRRM_Enable(RTMP_ADAPTER *pAd, UINT8 enable); - -#ifdef CONFIG_11KV_API_SUPPORT -int rrm_send_beacon_req(RTMP_ADAPTER *pAd, p_bcn_req_data_t p_bcn_req_data, - UINT32 bcn_req_len); -#else -int rrm_send_beacon_req(RTMP_ADAPTER *pAd, p_bcn_req_data_t p_bcn_req_data); -#endif /* COFNIG_11KV_API_SUPPORT */ - -void RRM_measurement_report_to_host(RTMP_ADAPTER *pAd, MLME_QUEUE_ELEM *Elem); - -#ifdef CONFIG_11KV_API_SUPPORT -int rrm_send_nr_rsp_param(RTMP_ADAPTER *pAd, - p_rrm_nrrsp_info_custom_t p_nr_rsp_data, - UINT32 nr_rsp_data_len); - -int rrm_send_nr_rsp_ie(RTMP_ADAPTER *pAd, p_nr_rsp_data_t p_nr_rsp_data, - UINT32 nr_rsp_data_len); - -int check_rrm_nrrsp_custom_params(RTMP_ADAPTER *pAd, - p_rrm_nrrsp_info_custom_t p_nr_rsp_data, - UINT32 nr_rsp_data_len); - -void compose_rrm_nrrsp_ie(RTMP_ADAPTER *pAd, PUCHAR nr_rsp_ie, PUINT32 p_ie_len, - struct nr_info *p_candidate_info, UINT8 cnt); - -VOID send_nr_rsp_param_toair(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID send_nr_resp_toair(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -void wext_send_nr_req_event(IN PNET_DEV net_dev, IN const char *peer_mac_addr, - IN const char *nr_req, IN UINT16 nr_req_len); - -int rrm_send_nr_rsp(IN RTMP_ADAPTER *pAd, IN p_nr_rsp_data_t p_nr_rsp_data); - -int rrm_set_handle_nr_req_flag(IN RTMP_ADAPTER *pAd, IN UINT8 by_daemon); - -VOID NRRspTimeout(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -enum NR_STATE NRPeerCurrentState(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem); - -VOID NRStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID RRMBcnReqStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -enum BCN_STATE BCNPeerCurrentState(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem); - -#endif /* CONFIG_11KV_API_SUPPORT*/ -#endif /* DOT11K_RRM_SUPPORT */ - -#endif /* __RRM_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rrm_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rrm_cmm.h deleted file mode 100644 index 24e47f707d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rrm_cmm.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Abstract: - -***************************************************************************/ - -#ifndef __RRM_CMM_H -#define __RRM_CMM_H - -#if defined(HOSTAPD_11K_SUPPORT) || defined(DOT11K_RRM_SUPPORT) - -#include "rtmp_type.h" -#include "dot11k_rrm.h" - -#define RRM_DEFAULT_QUIET_PERIOD 200 -#define RRM_DEFAULT_QUIET_DURATION 30 -#define RRM_DEFAULT_QUIET_OFFSET 20 - -#define RRM_QUIET_IDLE 0 -#define RRM_QUIET_SILENT 1 - -#define MAX_NUM_OF_REQ_IE 13 - -typedef struct _RRM_QUIET_CB { - BOOLEAN QuietState; - UINT16 CurAid; - UINT8 MeasureCh; - RALINK_TIMER_STRUCT QuietOffsetTimer; - RALINK_TIMER_STRUCT QuietTimer; - - UINT8 QuietCnt; - UINT8 QuietPeriod; - UINT8 QuietDuration; - UINT8 QuietOffset; -} RRM_QUIET_CB, *PRRM_QUIET_CB; - -typedef struct _RRM_CONFIG { - BOOLEAN bDot11kRRMEnableSet; - BOOLEAN bDot11kRRMEnable; - BOOLEAN bDot11kRRMNeighborRepTSFEnable; - RRM_QUIET_CB QuietCB; - - /* FOR AP Measurement Report */ - UINT8 PeerMeasurementToken; - /* UINT8 PeerMeasurementType; */ - BOOLEAN bPeerReqLCI; - BOOLEAN bPeerReqCIVIC; - RRM_EN_CAP_IE rrm_capabilities; - RRM_EN_CAP_IE max_rrm_capabilities; -#ifdef HOSTAPD_11K_SUPPORT - bool hstapd_nei_rep; - bool hstapd_lci; -#endif -} RRM_CONFIG, *PRRM_CONFIG; - -typedef union _RRM_BCN_REQ_CAP { - struct { -#ifdef RT_BIG_ENDIAN - UINT8 Reserved : 6; - UINT8 ChannelRep : 1; - UINT8 ReportCondition : 1; -#else - UINT8 ReportCondition : 1; - UINT8 ChannelRep : 1; - UINT8 Reserved : 6; -#endif - } field; - UINT8 word; -} RRM_BCN_REQ_CAP, *PRRM_BCN_REQ_CAP; - -typedef struct _RRM_MLME_BCN_REQ_INFO { - UINT16 MeasureDuration; - UINT8 Bssid[MAC_ADDR_LEN]; - UINT8 Addr[MAC_ADDR_LEN]; - PUINT8 pSsid; - UINT8 SsidLen; - UINT8 RegulatoryClass; - UINT8 MeasureCh; - UINT8 MeasureMode; - RRM_BCN_REQ_CAP BcnReqCapFlag; - UINT8 ChRepRegulatoryClass[MAX_NUM_OF_REGULATORY_CLASS]; - UINT8 ChRepList[MAX_NUM_OF_CHS]; - UINT16 RandInt; - UINT8 report_detail; - UINT8 request_ie_num; - UINT8 request_ie[MAX_NUM_OF_REQ_IE]; -} RRM_MLME_BCN_REQ_INFO, *PRRM_MLME_BCN_REQ_INFO; - -typedef struct _RRM_MLME_TRANSMIT_REQ_INFO { - UINT16 MeasureDuration; - UINT8 Tid; - UINT8 BinRange; - BOOLEAN bTriggerReport; - BOOLEAN ArvCondition; - BOOLEAN ConsecutiveCondition; - BOOLEAN DelayCondition; - UINT8 AvrErrorThreshold; - UINT8 ConsecutiveErrorThreshold; - UINT8 DelayThreshold; - UINT8 MeasureCnt; - UINT8 TriggerTimeout; - UINT8 bDurationMandatory; -} RRM_MLME_TRANSMIT_REQ_INFO, *PRRM_MLME_TRANSMIT_REQ_INFO; - -#ifdef CONFIG_11KV_API_SUPPORT -#define BCN_MACHINE_BASE 0 - -/* BCN states */ -enum BCN_STATE { - BCN_IDLE, - WAIT_BCN_REQ, - WAIT_BCN_REP, - MAX_BCN_STATE, -}; - -/* BCN events */ -enum BCN_EVENT { - BCN_REQ, - BCN_REQ_RAW, - BCN_REP_TIMEOUT, - MAX_BCN_MSG, -}; - -#define BCN_FUNC_SIZE (MAX_BCN_STATE * MAX_BCN_MSG) -#define BCN_REP_TIMEOUT_VALUE (60 * 1000) - -#define NR_MACHINE_BASE 0 - -/* NR states */ -enum NR_STATE { - WAIT_NR_RSP, - NR_UNKNOWN, - MAX_NR_STATE, -}; - -/* NR events */ -enum NR_EVENT { - NR_RSP, - NR_RSP_PARAM, - NR_RSP_TIMEOUT, - MAX_NR_MSG, -}; - -#define NR_FUNC_SIZE (MAX_NR_STATE * MAX_NR_MSG) -#define NR_RSP_TIMEOUT_VALUE (2 * 60 * 1000) - -typedef struct GNU_PACKED _BCN_EVENT_DATA { - UINT8 ControlIndex; - UINT8 MeasureReqToken; - UINT8 stamac[MAC_ADDR_LEN]; - UINT16 DataLen; - UCHAR Data[0]; -} BCN_EVENT_DATA, *PBCN_EVENT_DATA; - -/* this struct is used for mlme */ -typedef struct GNU_PACKED _NR_EVENT_DATA { - UINT8 ControlIndex; - UINT8 MeasureReqToken; - UINT8 stamac[MAC_ADDR_LEN]; - UINT16 DataLen; - UCHAR Data[0]; -} NR_EVENT_DATA, *PNR_EVENT_DATA; - -typedef struct GNU_PACKED _RRM_FRAME { - HEADER_802_11 Hdr; - UCHAR Category; - union { - struct { - UCHAR Action; - UCHAR DialogToken; - UCHAR Variable[0]; - } GNU_PACKED NR_RSP; - } u; -} RRM_FRAME, *PRRM_FRAME; - -DECLARE_TIMER_FUNCTION(WaitPeerBCNRepTimeout); -DECLARE_TIMER_FUNCTION(WaitNRRspTimeout); - -#endif /* CONFIG_11KV_API_SUPPORT */ -#endif /* DOT11K_RRM_SUPPORT */ - -#endif /* __RRM_CMM_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_cal.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_cal.h deleted file mode 100644 index 7d7b9165b5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_cal.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_rf_cal.c - - Abstract: - RF calibration and profile related functions - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Arvin Tai 2012/05/02 -*/ - -#define DPD_CAL_PASS_THRES 5 -#define DPD_CAL_MAX_RETRY 5 - -INT32 CalcRCalibrationCode(IN PRTMP_ADAPTER pAd, IN INT32 D1, IN INT32 D2); - -INT Set_TestRxIQCalibration_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID R_Calibration(IN PRTMP_ADAPTER pAd); - -VOID RtmpKickOutHwNullFrame(IN PRTMP_ADAPTER pAd, IN BOOLEAN bPrepareContent, - IN BOOLEAN bTransmit); - -VOID DPD_IQ_Swap_AM_PM_Inversion(IN PRTMP_ADAPTER pAd, IN UCHAR AntIdx); - -VOID DPD_AM_AM_LUT_Scaling(IN PRTMP_ADAPTER pAd, IN UCHAR AntIdx); - -UCHAR DPD_Calibration(IN PRTMP_ADAPTER pAd, IN UCHAR AntIdx); - -VOID DoDPDCalibration(IN PRTMP_ADAPTER pAd); - -INT Set_DPDCalPassThres_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TestDPDCalibration_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TestDPDCalibrationTX0_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TestDPDCalibrationTX1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID LOFT_IQ_Calibration(IN RTMP_ADAPTER *pAd); - -BOOLEAN BW_Filter_Calibration(IN PRTMP_ADAPTER pAd, IN BOOLEAN bTxCal); - -VOID RxDCOC_Calibration(IN PRTMP_ADAPTER pAd); - -VOID RXIQ_Calibration(IN PRTMP_ADAPTER pAd); - -VOID RF_SELF_TXDC_CAL(IN PRTMP_ADAPTER pAd); diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_config.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_config.h deleted file mode 100644 index 979c8e566d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_config.h +++ /dev/null @@ -1,380 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rt_config.h - - Abstract: - Central header file to maintain all include files for all NDIS - miniport driver routines. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Paul Lin 08-01-2002 created - -*/ -#ifndef __RT_CONFIG_H__ -#define __RT_CONFIG_H__ - -#include "rtmp_comm.h" - -#include "rtmp_def.h" -#include "rtmp_chip.h" -#include "rtmp_timer.h" - -#ifdef AGS_SUPPORT -#include "ags.h" -#endif /* AGS_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -#ifdef BAND_STEERING -#include "band_steering_def.h" -#endif /* BAND_STEERING */ - -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef MT_MAC -#ifdef CUT_THROUGH -#include "cut_through.h" -#endif /* CUT_THROUGH */ -#endif /* MT_MAC */ - -#include "mlme.h" -/*#include "rtmp_cmd.h" */ - -/* #ifdef VOW_SUPPORT */ -/* VOW support */ -#include "ap_vow.h" -/* #endif */ /* VOW_SUPPORT */ - -#include "qm.h" -#include "rtmp.h" -#include "security/sec.h" -#include "chlist.h" -#include "spectrum.h" -#ifdef CONFIG_AP_SUPPORT -#include "ap.h" -#include "ap_autoChSel.h" -#endif /* CONFIG_AP_SUPPORT */ -#include "rt_os_util.h" - -#include "eeprom.h" -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_USB_SUPPORT) -#include "mcu/mcu.h" -#endif - -#ifdef RTMP_EFUSE_SUPPORT -#include "efuse.h" -#endif /* RTMP_EFUSE_SUPPORT */ - -#undef AP_WSC_INCLUDED -#undef STA_WSC_INCLUDED -#undef WSC_INCLUDED - -#include "rt_os_net.h" - -#ifdef UAPSD_SUPPORT -#include "uapsd.h" -#endif /* UAPSD_SUPPORT */ - -#include "tx_power.h" - -#ifdef CONFIG_AP_SUPPORT -#ifdef MBSS_SUPPORT -#include "ap_mbss.h" -#endif /* MBSS_SUPPORT */ - -#ifdef WDS_SUPPORT -#include "ap_wds.h" -#endif /* WDS_SUPPORT */ - -#ifdef APCLI_SUPPORT -#include "ap_apcli.h" -#include "sta.h" -#endif /* APCLI_SUPPORT */ - -#ifdef WSC_AP_SUPPORT -#define AP_WSC_INCLUDED -#endif /* WSC_AP_SUPPORT */ - -#include "ap_ids.h" -#include "ap_cfg.h" - -#ifdef CLIENT_WDS -#include "client_wds.h" -#endif /* CLIENT_WDS */ - -#ifdef ROUTING_TAB_SUPPORT -#include "routing_tab.h" -#endif /* ROUTING_TAB_SUPPORT */ - -#ifdef A4_CONN -#include "a4_conn.h" -#endif - -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef MAT_SUPPORT -#include "mat.h" -#endif /* MAT_SUPPORT */ - -#ifdef BLOCK_NET_IF -#include "netif_block.h" -#endif /* BLOCK_NET_IF */ - -#ifdef IGMP_SNOOP_SUPPORT -#include "igmp_snoop.h" -#endif /* IGMP_SNOOP_SUPPORT */ -#ifdef CONFIG_MAP_SUPPORT -#include "map.h" -#endif -#ifdef WAPP_SUPPORT -#include "wapp/wapp_cmm_type.h" -#endif /* WAPP_SUPPORT */ -#ifdef CONFIG_ATE -#include "ate_agent.h" -#include "ate.h" -#include "mt_testmode.h" -#include "testmode_common.h" -#include -#endif /* CONFIG_ATE */ - -#ifdef WCX_SUPPORT -#include -#include "meta_agent.h" -#endif /* WCX_SUPPORT */ - -#ifdef CONFIG_QA -/* #include "qa_agent.h" */ -#include "testmode_ioctl.h" -#include "LoopBack.h" -#endif /* CONFIG_QA */ - -#ifdef CONFIG_QA -#ifndef CONFIG_ATE -#error "For supporting QA GUI, please set HAS_ATE=y and HAS_QA_SUPPORT=y." -#endif /* CONFIG_ATE */ -#endif /* CONFIG_QA */ - -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT -#include "ap_repeater.h" -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT -#include "rrm.h" -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef MBO_SUPPORT -#include "mbo.h" -#endif /* MBO_SUPPORT */ - -#ifdef OCE_SUPPORT -#include "oce.h" -#endif /* OCE_SUPPORT */ - -#if defined(AP_WSC_INCLUDED) || defined(STA_WSC_INCLUDED) -#define WSC_INCLUDED -#endif - -#ifdef CONFIG_AP_SUPPORT -#ifdef WDS_SUPPORT -#define RALINK_PASSPHRASE "Ralink" -#endif /* WDS_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef APCLI_WPA_SUPPLICANT_SUPPORT -#ifndef APCLI_SUPPORT -#error "Build Apcli for being controlled by NetworkManager or wext, please set HAS_APCLI_SUPPORT=y and HAS_APCLI_WPA_SUPPLICANT=y" -#endif /* APCLI_SUPPORT */ -#define WPA_SUPPLICANT_SUPPORT -#endif /* APCLI_WPA_SUPPLICANT_SUPPORT */ - -#ifdef WSC_INCLUDED -#include "security/crypt_biginteger.h" -#include "security/crypt_dh.h" -#include "wsc_tlv.h" - -#endif /* WSC_INCLUDED */ - -#ifdef IKANOS_VX_1X0 -#include "vr_ikans.h" -#endif /* IKANOS_VX_1X0 */ - -#ifdef DOT11R_FT_SUPPORT -#include "ft.h" -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT -#include "rrm.h" -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef DOT11W_PMF_SUPPORT -#include "security/pmf.h" -#endif /* DOT11W_PMF_SUPPORT */ - -#ifdef FTM_SUPPORT -#include "ftm.h" -#endif /* FTM_SUPPORT */ - -#ifdef DOT11_VHT_AC -#include "vht.h" -#endif /* DOT11_VHT_AC */ - -#ifdef RTMP_RBUS_SUPPORT -#ifdef VIDEO_TURBINE_SUPPORT -#include "video.h" -#endif /* VIDEO_TURBINE_SUPPORT */ -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef WORKQUEUE_BH -#include -#endif /* WORKQUEUE_BH / */ - -#ifdef MT_MAC -#ifdef CFG_SUPPORT_MU_MIMO -/* TODO: NeedModify-Jeffrey, shall we integrate the data structure definition in ap_mumimo.h and sta_mumimo.c? */ -#ifdef CONFIG_AP_SUPPORT -#include "ap_mumimo.h" -#endif /* CONFIG_AP_SUPPORT */ -#endif - -#ifdef CFG_SUPPORT_MU_MIMO_RA -#ifdef CONFIG_AP_SUPPORT -#include "ap_mura.h" -#endif /* CONFIG_AP_SUPPORT */ -#endif - -#endif /* MT_MAC */ - -#ifdef BAND_STEERING -#include "band_steering.h" -#endif /* BAND_STEERING */ - -#ifdef WAPP_SUPPORT -#include "wapp/wapp.h" -#endif /* WAPP_SUPPORT */ - -#ifdef TXBF_SUPPORT -#ifdef MT_MAC -#include "txbf/mt_txbf.h" -#else -#include "rt_txbf.h" -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) -#include "icap.h" -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - -#ifdef SMART_ANTENNA -#include "smartant.h" -#endif /* SMART_ANTENNA */ - -#ifdef MT_MAC -#include "mt_io.h" -#include "protocol/tmr.h" -#endif - -#ifdef SNIFFER_SUPPORT -#include "sniffer/sniffer.h" -#endif /* SNIFFER_SUPPORT */ - -#ifdef LINUX -#ifdef RT_CFG80211_SUPPORT -#include "cfg80211extr.h" -#include "cfg80211_cmm.h" -#endif /* RT_CFG80211_SUPPORT */ -#endif /* LINUX */ - -#ifdef CONFIG_DOT11U_INTERWORKING -#include "dot11u_interworking.h" -#include "gas.h" -#endif - -#ifdef CONFIG_DOT11V_WNM -#include "dot11v_wnm.h" -#include "wnm.h" -#endif - -#ifdef CONFIG_HOTSPOT -#include "hotspot.h" -#endif - -#ifdef LINUX -#ifdef CONFIG_TRACE_SUPPORT -#include "os/trace.h" -#endif -#endif - -#include "fp_qm.h" -#include "tm.h" -#include "hw_ctrl.h" -#include "hdev_ctrl.h" - -#include "protocol/protection.h" - -#ifdef SINGLE_SKU_V2 -#include "txpwr/single_sku.h" -#endif - -#include "bcn.h" - -#ifdef BACKGROUND_SCAN_SUPPORT -#include "bgnd_scan.h" -#endif /* BACKGROUND_SCAN_SUPPORT */ - -#ifdef SMART_CARRIER_SENSE_SUPPORT -#include "scs.h" -#endif /* SMART_CARRIER_SENSE_SUPPORT */ - -#ifdef REDUCE_TCP_ACK_SUPPORT -#include "cmm_tcprack.h" -#endif - -#include "wlan_config/config_export.h" -#include "mgmt/be_export.h" - -#if defined(BB_SOC) && defined(BB_RA_HWNAT_WIFI) -#include -#endif - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) -#include "phy/rlm_cal_cache.h" -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -#define MCAST_WCID_TO_REMOVE 0 /* Pat: */ - -#if defined(RED_SUPPORT) -#include "ra_ac_q_mgmt.h" -#endif /* RED_SUPPORT */ -#include "fq_qm.h" -#include "cmm_rvr_dbg.h" -#ifdef CONFIG_STEERING_API_SUPPORT -#include -#endif -#ifdef WIFI_DIAG -#include "os/diag.h" -#endif - -#include "misc_app.h" - -#endif /* __RT_CONFIG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_led.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_led.h deleted file mode 100644 index b7d9822516..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_led.h +++ /dev/null @@ -1,245 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002-2010, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rt_led.h - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __RT_LED_H__ -#define __RT_LED_H__ - -/* LED MCU command */ -#define MCU_SET_LED_MODE 0x50 -#define MCU_SET_LED_GPIO_SIGNAL_CFG 0x51 -#define MCU_SET_LED_AG_CFG 0x52 -#define MCU_SET_LED_ACT_CFG 0x53 -#define MCU_SET_LED_POLARITY 0x54 -#ifdef WSC_INCLUDED -#ifdef WSC_LED_SUPPORT -#define MCU_SET_WPS_LED_MODE \ - 0x55 /* Set WPS LED mode (based on WPS specification V1.0). */ -#define MCU_SET_ANT_DIVERSITY 0x73 -#endif /* WSC_LED_SUPPORT */ -#endif /* WSC_INCLUDED */ - -/* LED Mode */ -#define LED_MODE(pAd) ((pAd)->LedCntl.MCULedCntl.field.LedMode & 0x7F) -#define LED_HW_CONTROL \ - 19 /* set LED to controll by MAC registers instead of by firmware */ -#define LED_MODE_DEFAULT 0 /* value domain of pAd->LedCntl.LedMode and E2PROM */ -#define LED_MODE_TWO_LED 1 -#define LED_MODE_8SEC_SCAN \ - 2 /* Same as LED mode 1; except that fast blink for 8sec when doing scanning. */ -#define LED_MODE_SITE_SURVEY_SLOW_BLINK \ - 3 /* Same as LED mode 1; except that make ACT slow blinking during site survey period and blink once at power-up. */ -#define LED_MODE_WPS_LOW_POLARITY \ - 4 /* Same as LED mode 1; except that make ACT steady on during WPS period */ -#define LED_MODE_WPS_HIGH_POLARITY \ - 5 /* Same as LED mode 1; except that make ACT steady on during WPS period */ -/*#define LED_MODE_SIGNAL_STREGTH 8 // EEPROM define =8 */ -#define LED_MODE_SIGNAL_STREGTH 0x40 /* EEPROM define = 64 */ -#ifdef WSC_INCLUDED -#ifdef WSC_LED_SUPPORT -#define LED_WPS_MODE10_TURN_ON 16 /* For Dlink WPS LED, turn the WPS LED on */ -#define LED_WPS_MODE10_FLASH 17 /* For Dlink WPS LED, let the WPS LED flash */ -#define LED_WPS_MODE10_TURN_OFF 18 /* For Dlink WPS LED, turn the WPS LED off */ -#define WPS_LED_MODE_7 0x07 -#define WPS_LED_MODE_8 0x08 -#define WPS_LED_MODE_9 0x09 -#define WPS_LED_MODE_10 0x0a -/* */ -/* Chungwa Telecom (WPS LED and SD/HD LEDs) use WPS LED mode #11 and it is based on mode #7 */ -/* */ -/* GPIO #1: WPS LED */ -/* GPIO #2: SD (Standard Definition) LED */ -/* GPIO #4: HD (High Definition) LED */ -/* */ -#define WPS_LED_MODE_11 0x0b -#define WPS_LED_MODE_12 0x0c -#endif /* WSC_LED_SUPPORT */ -#endif /* WSC_INCLUDED */ - -/* Driver LED Status */ -#define LED_LINK_DOWN 0 -#define LED_LINK_UP 1 -#define LED_RADIO_OFF 2 -#define LED_RADIO_ON 3 -#define LED_HALT 4 -#define LED_WPS 5 -#define LED_ON_SITE_SURVEY 6 -#define LED_POWER_UP 7 -#ifdef WSC_INCLUDED -#ifdef WSC_LED_SUPPORT -/* For LED mode = 7 only */ -#define LED_WPS_IN_PROCESS \ - 8 /* The protocol is searching for a partner, connecting, or exchanging network parameters. */ -#define LED_WPS_ERROR \ - 9 /* Some error occurred which was not related to security, such as failed to find any partner or protocol prematurely aborted. */ -#define LED_WPS_SESSION_OVERLAP_DETECTED \ - 10 /* The Protocol detected overlapping operation (more than one Registrar in PBC mode): could be a security risk. */ -#define LED_WPS_SUCCESS \ - 11 /* The protocol is finished: no uncorrectable errors occured. Normally after guard time period. */ -#define LED_WPS_TURN_LED_OFF 12 /* Turn the WPS LEDs off. */ -#define LED_WPS_TURN_ON_BLUE_LED 13 /* Turn on the WPS blue LED. */ -#define LED_NORMAL_CONNECTION_WITHOUT_SECURITY \ - 14 /* Successful connection with an AP using OPEN-NONE. */ -#define LED_NORMAL_CONNECTION_WITH_SECURITY \ - 15 /* Successful connection with an AP using an encryption algorithm. */ -/* For LED Share Mode */ -#endif /* WSC_LED_SUPPORT */ -#endif /* WSC_INCLUDED */ - -#ifdef VENDOR_FEATURE7_SUPPORT -#define LED_FORCE_ON 20 -#define LED_FORCE_OFF 21 - -enum led_force_mode_list { - LED_FORCE_MODE_NONE = 0, - LED_FORCE_MODE_ON, - LED_FORCE_MODE_OFF -}; -#endif - -/* LED Index */ -enum led_id_list { LED_ID_WLAN_OD = 0, LED_ID_WPS, LED_ID_DBDC }; - -/* LED Type */ -#define LED_TX_OVER_BLINK_ENABLE 1 -#define LED_TX_OVER_BLINK_DISABLE 0 -#define LED_REVERSE_POLARITY_ENABLE 1 -#define LED_REVERSE_POLARITY_DISABLE 0 - -/* LED Index */ -enum led_band_list { LED_BAND_0 = 0, LED_BAND_1 }; - -/* LED Tx blink mode */ -enum led_tx_blink_mode_list { - LED_ALL_TX_FRAMES = 0, - LED_TX_FRAMES_NO_BEACON, - LED_TX_DATA_ONLY -}; - -/* LED Controller Mode */ -enum led_controller_mode_list { - LED_SOLID_ON = 0, - LED_SOLID_OFF = 1, - LED_TX_BLINKING = 2, - LED_BLINKING_500MS_ON_500MS_OFF = 3, - LED_BLINKING_250MS_ON_250MS_OFF = 4, - LED_BLINKING_170MS_ON_170MS_OFF = 5, - LED_BLINKING_500MS_ON_100MS_OFF = 6, - LED_BLINKING_500MS_ON_700MS_OFF = 7, - LED_WPS_3_BLINKING_PER_SECOND_FOR_4_SECONDS = 16, - LED_WPS_5S_ON_3S_OFF_THEN_BLINKING = 17, - LED_WPS_5S_ON = 18, - LED_GENERAL_FIX_BLINKING_FORMAT = 31, - LED_TWO_LED_INTERATIVE_BLINKING = 32 -}; - -/* MCU Led Link Status */ -#define LINK_STATUS_LINK_DOWN 0x20 -#define LINK_STATUS_ABAND_LINK_UP 0xa0 -#define LINK_STATUS_GBAND_LINK_UP 0x60 -#define LINK_STATUS_RADIO_ON 0x20 -#define LINK_STATUS_RADIO_OFF 0x00 -#define LINK_STATUS_WPS 0x10 -#define LINK_STATUS_ON_SITE_SURVEY 0x08 -#define LINK_STATUS_POWER_UP 0x04 -#define LINK_STATUS_HW_CONTROL 0x00 -#ifdef WSC_INCLUDED -#ifdef WSC_LED_SUPPORT -/* LED mode = 7 and 8 only */ -#define LINK_STATUS_WPS_IN_PROCESS \ - 0x00 /* The protocol is searching for a partner, connecting, or exchanging network parameters. */ -#define LINK_STATUS_WPS_SUCCESS_WITH_SECURITY \ - 0x01 /* The protocol is finished (with security): no uncorrectable errors occured. Normally after guard time period. */ -#define LINK_STATUS_WPS_ERROR \ - 0x02 /* Some error occurred which was not related to security, such as failed to find any partner or protocol prematurely aborted. */ -#define LINK_STATUS_WPS_SESSION_OVERLAP_DETECTED \ - 0x03 /* The Protocol detected overlapping operation (more than one Registrar in PBC mode): could be a security risk. */ -#define LINK_STATUS_WPS_TURN_LED_OFF 0x04 /* Turn the WPS LEDs off. */ -#define LINK_STATUS_WPS_SUCCESS_WITHOUT_SECURITY \ - 0X05 /* The protocol is finished (without security): no uncorrectable errors occured. Normally after guard time period. */ -#define LINK_STATUS_NORMAL_CONNECTION_WITHOUT_SECURITY \ - 0x06 /* Successful connection with an AP using OPEN-NONE. */ -#define LINK_STATUS_NORMAL_CONNECTION_WITH_SECURITY \ - 0x0E /* Successful connection with an AP using an encryption algorithm. */ -#define LINK_STATUS_WPS_BLUE_LED 0x01 /* WPS blue LED. */ -/* LED moe = 10 */ -#define LINK_STATUS_WPS_MODE10_TURN_ON \ - 0x00 /*Use only on Dlink WPS LED (mode 10), turn the WPS LED on. */ -#define LINK_STATUS_WPS_MODE10_FLASH \ - 0x01 /*Use only on Dlink WPS LED (mode 10), let the WPS LED flash, three times persecond. */ -#define LINK_STATUS_WPS_MODE10_TURN_OFF \ - 0x02 /*Use only on Dlink WPS LED (mode 10), turn the WPS LED off. */ -#endif /* WSC_LED_SUPPORT */ -#endif /* WSC_INCLUDED */ - -#define ACTIVE_LOW 0 -#define ACTIVE_HIGH 1 - -/* */ -/* MCU_LEDCS: MCU LED Control Setting. */ -/* */ -typedef union _MCU_LEDCS_STRUC { - struct { -#ifdef RT_BIG_ENDIAN - UCHAR Polarity : 1; - UCHAR LedMode : 7; -#else - UCHAR LedMode : 7; - UCHAR Polarity : 1; -#endif /* RT_BIG_ENDIAN */ - } field; - UCHAR word; -} MCU_LEDCS_STRUC, *PMCU_LEDCS_STRUC; - -void rtmp_read_led_setting_from_eeprom(IN RTMP_ADAPTER *pAd); -void RTMPInitLEDMode(IN RTMP_ADAPTER *pAd); -void RTMPExitLEDMode(IN RTMP_ADAPTER *pAd); - -VOID RTMPSetLEDStatus(RTMP_ADAPTER *pAd, UCHAR Status); -VOID RTMPSetSignalLED(RTMP_ADAPTER *pAd, NDIS_802_11_RSSI Dbm); - -INT RTMPSetLED(RTMP_ADAPTER *pAd, UCHAR Status); - -#ifdef WSC_STA_SUPPORT -#ifdef WSC_LED_SUPPORT -VOID LEDConnectionStart(IN PRTMP_ADAPTER pAd); - -VOID LEDConnectionCompletion(IN PRTMP_ADAPTER pAd, IN BOOLEAN bSuccess); -#endif /* WSC_LED_SUPPORT */ -#endif /* WSC_STA_SUPPORT */ - -typedef struct _LED_CONTROL { - MCU_LEDCS_STRUC MCULedCntl; /* LED Mode EEPROM 0x3b */ - USHORT LedAGCfg; /* LED A/G Configuration EEPROM 0x3c */ - USHORT LedACTCfg; /* LED ACT Configuration EEPROM 0x3e */ - USHORT LedPolarity; /* LED A/G/ACT polarity EEPROM 0x40 */ - UCHAR LedIndicatorStrength; - UCHAR RssiSingalstrengthOffet; - BOOLEAN bLedOnScanning; - UCHAR LedStatus; -} LED_CONTROL, *PLED_CONTROL; - -void RTMPStartLEDMode(IN RTMP_ADAPTER *pAd); - -#endif /* __RT_LED_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_os_net.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_os_net.h deleted file mode 100644 index 15293b6d3f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_os_net.h +++ /dev/null @@ -1,819 +0,0 @@ -/**************************************************************************** - - Module Name: - rt_os_net.h - - Abstract: - All function prototypes are defined in NETIF modules. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - -***************************************************************************/ - -#ifndef __RT_OS_NET_H__ -#define __RT_OS_NET_H__ - -#include "chip/chip_id.h" -#include "hif/hif.h" - -typedef VOID *(*RTMP_NET_ETH_CONVERT_DEV_SEARCH)(VOID *net_dev, UCHAR *pData); -typedef int (*RTMP_NET_PACKET_TRANSMIT)(VOID *pPacket); - -#ifdef LINUX -#ifdef OS_ABL_FUNC_SUPPORT - -/* ========================================================================== */ -/* operators used in NETIF module */ -/* Note: No need to put any compile option here */ -typedef struct _RTMP_DRV_ABL_OPS { - NDIS_STATUS (*RTMPAllocAdapterBlock)(PVOID handle, VOID **ppAdapter); - VOID (*RTMPFreeAdapter)(VOID *pAd); - - BOOLEAN (*RtmpRaDevCtrlExit)(VOID *pAd); - INT (*RtmpRaDevCtrlInit)(VOID *pAd, RTMP_INF_TYPE infType); - INT(*RTMP_COM_IoctlHandle) - (IN VOID *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq, IN INT cmd, - IN USHORT subcmd, IN VOID *pData, IN ULONG Data); - - int (*RTMPSendPackets)(IN NDIS_HANDLE MiniportAdapterContext, - IN PPNDIS_PACKET ppPacketArray, - IN UINT NumberOfPackets, IN UINT32 PktTotalLen, - IN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func); - - int (*P2P_PacketSend)(IN PNDIS_PACKET pPktSrc, IN PNET_DEV pDev, - IN RTMP_NET_PACKET_TRANSMIT Func); - - INT(*RTMP_AP_IoctlHandle) - (IN VOID *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq, IN INT cmd, - IN USHORT subcmd, IN VOID *pData, IN ULONG Data); - - INT(*RTMP_STA_IoctlHandle) - (IN VOID *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq, IN INT cmd, - IN USHORT subcmd, IN VOID *pData, IN ULONG Data, IN USHORT priv_flags); - - VOID (*RTMPDrvOpen)(VOID *pAd); - VOID (*RTMPDrvClose)(VOID *pAd, VOID *net_dev); - int (*mt_wifi_init)(VOID *pAd, RTMP_STRING *pDefaultMac, - RTMP_STRING *pHostName); -} RTMP_DRV_ABL_OPS; - -extern RTMP_DRV_ABL_OPS *pRtmpDrvOps; - -VOID RtmpDrvOpsInit(OUT VOID *pDrvOpsOrg, INOUT VOID *pDrvNetOpsOrg, - IN RTMP_PCI_CONFIG *pPciConfig, - IN RTMP_USB_CONFIG *pUsbConfig); -#endif /* OS_ABL_FUNC_SUPPORT */ -#endif /* LINUX */ - -/* ========================================================================== */ -/* operators used in DRIVER module */ -typedef void (*RTMP_DRV_USB_COMPLETE_HANDLER)(VOID *pURB); - -typedef struct _RTMP_NET_ABL_OPS { -} RTMP_NET_ABL_OPS; - -extern RTMP_NET_ABL_OPS *pRtmpDrvNetOps; - -VOID RtmpNetOpsInit(VOID *pNetOpsOrg); -VOID RtmpNetOpsSet(VOID *pNetOpsOrg); - -/* ========================================================================== */ -#if defined(RTMP_MODULE_OS) && defined(OS_ABL_FUNC_SUPPORT) -/* for UTIL/NETIF module in OS ABL mode */ - -#define RTMPAllocAdapterBlock \ - (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPAllocAdapterBlock) -#define RTMPFreeAdapter (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPFreeAdapter) -#define RtmpRaDevCtrlExit \ - (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RtmpRaDevCtrlExit) -#define RtmpRaDevCtrlInit \ - (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RtmpRaDevCtrlInit) -#define RTMPHandleInterrupt \ - (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPHandleInterrupt) -#define RTMP_COM_IoctlHandle \ - (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMP_COM_IoctlHandle) -#define RTMPSendPackets (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPSendPackets) -#define P2P_PacketSend (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->P2P_PacketSend) -#define RTMP_AP_IoctlHandle \ - (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMP_AP_IoctlHandle) -#define RTMP_STA_IoctlHandle \ - (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMP_STA_IoctlHandle) -#define RTMPDrvOpen (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPDrvOpen) -#define RTMPDrvClose (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->RTMPDrvClose) -#define mt_wifi_init (((RTMP_DRV_ABL_OPS *)(pRtmpDrvOps))->rt28xx_init) - -#else /* RTMP_MODULE_OS && OS_ABL_FUNC_SUPPORT */ - -NDIS_STATUS RTMPAllocAdapterBlock(PVOID handle, VOID **ppAdapter); -VOID RTMPFreeAdapter(VOID *pAd); -BOOLEAN RtmpRaDevCtrlExit(VOID *pAd); -INT RtmpRaDevCtrlInit(VOID *pAd, RTMP_INF_TYPE infType); -VOID mtd_isr(struct _RTMP_ADAPTER *pAd); -VOID mtd_non_rx_delay_isr(struct _RTMP_ADAPTER *pAd); -VOID isr_handle(VOID *pAdSrc); -void RTMPHandleInterruptSerDump(struct _RTMP_ADAPTER *pAd); - -INT RTMP_COM_IoctlHandle(IN VOID *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq, - IN INT cmd, IN USHORT subcmd, IN VOID *pData, - IN ULONG Data); - -int RTMPSendPackets(IN NDIS_HANDLE MiniportAdapterContext, - IN PPNDIS_PACKET ppPacketArray, IN UINT NumberOfPackets, - IN UINT32 PktTotalLen, - IN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func); - -int P2P_PacketSend(IN PNDIS_PACKET pPktSrc, IN PNET_DEV pDev, - IN RTMP_NET_PACKET_TRANSMIT Func); - -#ifdef CONFIG_AP_SUPPORT -INT RTMP_AP_IoctlHandle(IN VOID *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq, - IN INT cmd, IN USHORT subcmd, IN VOID *pData, - IN ULONG Data); -#endif /* CONFIG_AP_SUPPORT */ - -VOID RTMPDrvOpen(VOID *pAd); -VOID RTMPDrvClose(VOID *pAd, VOID *net_dev); -VOID enable_nf_support(VOID *pAd); - -int mt_wifi_init(VOID *pAd, RTMP_STRING *pDefaultMac, RTMP_STRING *pHostName); - -PNET_DEV RtmpPhyNetDevMainCreate(VOID *pAd); -#endif /* RTMP_MODULE_OS */ - -/* ========================================================================== */ -int virtual_if_init_handler(VOID *dev); -INT virtual_if_deinit_handler(VOID *dev); -int virtual_if_up_handler(VOID *dev); -int virtual_if_down_handler(VOID *dev); - -static inline INT VIRTUAL_IF_INIT(VOID *pAd, VOID *pDev) -{ - RT_CMD_INF_UP_DOWN InfConf = { virtual_if_init_handler, - virtual_if_deinit_handler, - virtual_if_up_handler, - virtual_if_down_handler, pDev }; - - if (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_INIT, - 0, &InfConf, 0) != NDIS_STATUS_SUCCESS) - return -1; - - return 0; -} - -static inline VOID VIRTUAL_IF_DEINIT(VOID *pAd, VOID *pDev) -{ - RT_CMD_INF_UP_DOWN InfConf = { virtual_if_init_handler, - virtual_if_deinit_handler, - virtual_if_up_handler, - virtual_if_down_handler, pDev }; - - RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_DEINIT, 0, - &InfConf, 0); -} - -static inline INT VIRTUAL_IF_UP(VOID *pAd, VOID *pDev) -{ - RT_CMD_INF_UP_DOWN InfConf = { virtual_if_init_handler, - virtual_if_deinit_handler, - virtual_if_up_handler, - virtual_if_down_handler, pDev }; - - if (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_UP, 0, - &InfConf, 0) != NDIS_STATUS_SUCCESS) - return -1; - - return 0; -} - -static inline VOID VIRTUAL_IF_DOWN(VOID *pAd, VOID *pDev) -{ - RT_CMD_INF_UP_DOWN InfConf = { virtual_if_init_handler, - virtual_if_deinit_handler, - virtual_if_up_handler, - virtual_if_down_handler, pDev }; - RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_DOWN, 0, - &InfConf, 0); - return; -} - -#ifdef RTMP_MODULE_OS - -#ifdef CONFIG_AP_SUPPORT -INT rt28xx_ap_ioctl(IN PNET_DEV net_dev, IN OUT struct ifreq *rq, IN INT cmd); -#endif /* CONFIG_AP_SUPPORT */ - -PNET_DEV RtmpPhyNetDevInit(IN VOID *pAd, IN RTMP_OS_NETDEV_OP_HOOK *pNetHook); - -BOOLEAN RtmpPhyNetDevExit(IN VOID *pAd, IN PNET_DEV net_dev); - -#endif /* RTMP_MODULE_OS && OS_ABL_FUNC_SUPPORT */ - -VOID RT28xx_MSTA_Init(VOID *pAd, PNET_DEV main_dev_p); -INT msta_virtual_if_open(PNET_DEV pDev); -INT msta_virtual_if_close(PNET_DEV pDev); -VOID RT28xx_MSTA_Remove(VOID *pAd); - -VOID RT28xx_MBSS_Init(VOID *pAd, PNET_DEV main_dev_p); -INT mbss_virtual_if_open(PNET_DEV pDev); -INT mbss_virtual_if_close(PNET_DEV pDev); -VOID RT28xx_MBSS_Remove(VOID *pAd); - -VOID RT28xx_WDS_Init(VOID *pAd, PNET_DEV net_dev); -INT wds_virtual_if_open(PNET_DEV pDev); -INT wds_virtual_if_close(PNET_DEV pDev); -VOID RT28xx_WDS_Remove(VOID *pAd); - -VOID RT28xx_ApCli_Init(VOID *pAd, PNET_DEV main_dev_p); -INT apcli_virtual_if_open(PNET_DEV pDev); -INT apcli_virtual_if_close(PNET_DEV pDev); -VOID RT28xx_ApCli_Remove(VOID *pAd); - -VOID RT28xx_Monitor_Init(VOID *pAd, PNET_DEV main_dev_p); -VOID RT28xx_Monitor_Remove(VOID *pAd); -VOID RTMP_Mesh_Init(VOID *pAd, PNET_DEV main_dev_p, RTMP_STRING *pHostName); -INT mesh_virtual_if_open(PNET_DEV pDev); -INT mesh_virtual_if_close(PNET_DEV pDev); -VOID RTMP_Mesh_Remove(VOID *pAd); - -VOID RTMP_P2P_Init(VOID *pAd, PNET_DEV main_dev_p); -INT p2p_virtual_if_open(PNET_DEV pDev); -INT p2p_virtual_if_close(PNET_DEV pDev); -INT P2P_VirtualIF_PacketSend(IN PNDIS_PACKET skb_p, IN PNET_DEV dev_p); -VOID RTMP_P2P_Remove(VOID *pAd); - -PNET_DEV RTMP_CFG80211_FindVifEntry_ByType(IN VOID *pAdSrc, IN UINT32 devType); - -VOID RTMP_CFG80211_AddVifEntry(IN VOID *pAdSrc, IN PNET_DEV pNewNetDev, - IN UINT32 DevType); - -VOID RTMP_CFG80211_RemoveVifEntry(IN VOID *pAdSrc, IN PNET_DEV pNewNetDev); - -PNET_DEV RTMP_CFG80211_VirtualIF_Get(IN VOID *pAdSrc); - -VOID RTMP_CFG80211_VirtualIF_Init(IN VOID *pAd, IN CHAR *pIfName, - IN UINT32 DevType); - -VOID RTMP_CFG80211_VirtualIF_Remove(IN VOID *pAd, IN PNET_DEV dev_p, - IN UINT32 DevType); - -VOID RTMP_CFG80211_AllVirtualIF_Remove(IN VOID *pAdSrc); - -#ifdef CFG80211_MULTI_STA -BOOLEAN RTMP_CFG80211_MULTI_STA_ON(VOID *pAdSrc, PNET_DEV pNewNetDev); -VOID RTMP_CFG80211_MutliStaIf_Init(VOID *pAd); -VOID RTMP_CFG80211_MutliStaIf_Remove(VOID *pAd); -#endif /* CFG80211_MULTI_STA */ - -#ifdef RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT -INT rt_android_private_command_entry(VOID *pAdSrc, struct net_device *net_dev, - struct ifreq *ifr, int cmd); -#endif /* RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT */ - -/* FOR communication with RALINK DRIVER module in NET module */ -/* general */ -#define RTMP_DRIVER_NET_DEV_GET(__pAd, __pNetDev) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_NETDEV_GET, 0, \ - __pNetDev, 0) - -#ifdef APCLI_CFG80211_SUPPORT -#define RTMP_DRIVER_APCLI_NET_DEV_GET(__pAd, __pNetDev) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_APCLI_NETDEV_GET, \ - 0, __pNetDev, 0) -#endif /* APCLI_CFG80211_SUPPORT */ - -#define RTMP_DRIVER_NET_DEV_SET(__pAd, __pNetDev) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_NETDEV_SET, 0, \ - __pNetDev, 0) - -#define RTMP_DRIVER_OP_MODE_GET(__pAd, __pOpMode) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_OPMODE_GET, 0, \ - __pOpMode, 0) - -#define RTMP_DRIVER_IW_STATS_GET(__pAd, __pIwStats) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_IW_STATUS_GET, \ - 0, __pIwStats, 0) - -#define RTMP_DRIVER_INF_STATS_GET(__pAd, __pInfStats) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_STATS_GET, 0, \ - __pInfStats, 0) - -#define RTMP_DRIVER_INF_TYPE_GET(__pAd, __pInfType) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_TYPE_GET, 0, \ - __pInfType, 0) - -#define RTMP_DRIVER_TASK_LIST_GET(__pAd, __pList) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_TASK_LIST_GET, 0, \ - __pList, 0) - -#define RTMP_DRIVER_NIC_NOT_EXIST_SET(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_NIC_NOT_EXIST, 0, \ - NULL, 0) - -#define RTMP_DRIVER_MCU_SLEEP_CLEAR(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MCU_SLEEP_CLEAR, 0, \ - NULL, 0) - -#define RTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_OFF(__pAd) \ - RTMP_COM_IoctlHandle( \ - __pAd, NULL, \ - CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_OFF, 0, NULL, 0) - -#define RTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_ON(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_ON, \ - 0, NULL, 0) - -#define RTMP_DRIVER_ADAPTER_SUSPEND_SET(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_SET, 0, NULL, 0) - -#define RTMP_DRIVER_ADAPTER_SUSPEND_CLEAR(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_CLEAR, 0, NULL, \ - 0) - -#define RTMP_DRIVER_VIRTUAL_INF_NUM_GET(__pAd, __pIfNum) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_GET, 0, \ - __pIfNum, 0) - -#define RTMP_DRIVER_CHANNEL_GET(__pAd, __pInfId, __Channel) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_SIOCGIWFREQ, 0, \ - __Channel, __pInfId) - -#define RTMP_DRIVER_IOCTL_SANITY_CHECK(__pAd, __SetCmd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_SANITY_CHECK, 0, \ - __SetCmd, 0) - -#define RTMP_DRIVER_BITRATE_GET(__pAd, __pBitRate) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_SIOCGIWRATE, 0, \ - __pBitRate, 0) - -#define RTMP_DRIVER_MAIN_INF_CREATE(__pAd, __ppNetDev) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_MAIN_CREATE, 0, \ - __ppNetDev, 0) - -#define RTMP_DRIVER_MAIN_INF_GET(__pAd, __pInfId) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_MAIN_ID_GET, 0, \ - __pInfId, 0) - -#define RTMP_DRIVER_MAIN_INF_CHECK(__pAd, __InfId) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_MAIN_CHECK, 0, \ - NULL, __InfId) - -#define RTMP_DRIVER_P2P_INF_CHECK(__pAd, __InfId) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_P2P_CHECK, 0, \ - NULL, __InfId) - -#ifdef EXT_BUILD_CHANNEL_LIST -#define RTMP_DRIVER_SET_PRECONFIG_VALUE(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_SET_PRECONFIG_VALUE, 0, \ - NULL, 0) -#endif /* EXT_BUILD_CHANNEL_LIST */ - -#ifdef RT_CFG80211_SUPPORT -/* General Part */ -#define RTMP_DRIVER_CFG80211_REGISTER(__pNetDev) \ - { \ - VOID *__pAd = NULL; \ - GET_PAD_FROM_NET_DEV(__pAd, __pNetDev); \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_REGISTER, 0, \ - __pNetDev, 0); \ - } - -#define RTMP_DRIVER_CFG80211_START(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_CFG80211_CFG_START, \ - 0, NULL, 0) - -#define RTMP_DRIVER_80211_UNREGISTER(__pAd, __pNetDev) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_UNREGISTER, \ - 0, __pNetDev, 0) - -#define RTMP_DRIVER_80211_CB_GET(__pAd, __ppCB) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CB_GET, 0, \ - __ppCB, 0) - -#define RTMP_DRIVER_80211_CB_SET(__pAd, __pCB) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CB_SET, 0, \ - __pCB, 0) - -#define RTMP_DRIVER_80211_RESET(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_RESET, 0, \ - NULL, 0) - -/* STA Part */ -#define RTMP_DRIVER_80211_SCAN_CHANNEL_LIST_SET(__pAd, __pData, __Len) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET, 0, \ - __pData, __Len) - -#ifdef APCLI_CFG80211_SUPPORT -#define RTMP_DRIVER_80211_APCLI_SCAN(__pAd, __pData) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_APCLI_SITE_SURVEY, \ - 0, __pData, 0) -#endif /* APCLI_CFG80211_SUPPORT */ - -#define RTMP_DRIVER_80211_SCAN(__pAd, __IfType) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_SCAN, 0, \ - NULL, __IfType) - -#define RTMP_DRIVER_80211_SCAN_STATUS_LOCK_INIT(__pAd, __isInit) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_SCAN_STATUS_LOCK_INIT, 0, \ - NULL, __isInit) - -#define RTMP_DRIVER_80211_SCAN_EXTRA_IE_SET(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_EXTRA_IES_SET, 0, NULL, 0) - -#define RTMP_DRIVER_80211_GEN_IE_SET(__pAd, __pData, __Len) \ - RTMP_STA_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWGENIE, \ - 0, __pData, __Len, 0) - -#define RTMP_DRIVER_80211_STA_KEY_ADD(__pAd, __pKeyInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_STA_KEY_ADD, \ - 0, __pKeyInfo, 0) - -#define RTMP_DRIVER_80211_STA_KEY_DEFAULT_SET(__pAd, __KeyId) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_STA_KEY_DEFAULT_SET, 0, \ - NULL, __KeyId) - -#define RTMP_DRIVER_80211_POWER_MGMT_SET(__pAd, __enable) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_POWER_MGMT_SET, 0, NULL, \ - __enable) - -#define RTMP_DRIVER_80211_STA_LEAVE(__pAd, __pNdev) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_STA_LEAVE, 0, \ - __pNdev, 0) - -#define RTMP_DRIVER_80211_STA_GET(__pAd, __pStaInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_STA_GET, 0, \ - __pStaInfo, 0) - -#define RTMP_DRIVER_80211_CONNECT(__pAd, __pConnInfo, __devType) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CONNECT_TO, \ - 0, __pConnInfo, __devType) - -#define RTMP_DRIVER_80211_IBSS_JOIN(__pAd, __pInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_IBSS_JOIN, 0, \ - __pInfo, 0) - -#define RTMP_DRIVER_80211_PMKID_CTRL(__pAd, __pPmkidInfo) \ - RTMP_STA_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_STA_SIOCSIWPMKSA, \ - 0, __pPmkidInfo, 0, 0) -#ifdef CFG_TDLS_SUPPORT -/* new TDLS */ -#define RTMP_DRIVER_80211_STA_TDLS_INSERT_DELETE_PENTRY(__pAd, __peerAddr, \ - __entryOP) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_STA_TDLS_INSERT_PENTRY, 0, \ - __peerAddr, __entryOP) - -#define RTMP_DRIVER_80211_STA_TDLS_SET_KEY_COPY_FLAG(__pAd) \ - RTMP_COM_IoctlHandle( \ - __pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_STA_TDLS_SET_KEY_COPY_FLAG, 0, NULL, 0) -#endif - -/* Information Part */ -#define RTMP_DRIVER_80211_BANDINFO_GET(__pAd, __pBandInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_BANDINFO_GET, \ - 0, __pBandInfo, 0) - -#define RTMP_DRIVER_80211_CHANGE_BSS_PARM(__pAd, __pBssInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_CHANGE_BSS_PARM, 0, \ - __pBssInfo, 0) - -#define RTMP_DRIVER_80211_CHAN_SET(__pAd, __pChan) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CHAN_SET, 0, \ - __pChan, 0) - -#define RTMP_DRIVER_80211_RFKILL(__pAd, __pActive) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_RFKILL, 0, \ - __pActive, 0) - -#define RTMP_DRIVER_80211_REG_NOTIFY(__pAd, __pNotify) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO, 0, \ - __pNotify, 0) - -#define RTMP_DRIVER_80211_SURVEY_GET(__pAd, __pSurveyInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_SURVEY_GET, \ - 0, __pSurveyInfo, 0) - -#define RTMP_DRIVER_80211_NETDEV_EVENT(__pAd, __pDev, __state) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_NETDEV_EVENT, \ - 0, __pDev, __state) - -/* AP Part */ - -#define RTMP_DRIVER_80211_BEACON_DEL(__pAd, __apidx) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_BEACON_DEL, \ - 0, NULL, __apidx) - -#define RTMP_DRIVER_80211_BEACON_ADD(__pAd, __pBeacon) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_BEACON_ADD, \ - 0, __pBeacon, 0) - -#define RTMP_DRIVER_80211_BEACON_SET(__pAd, __pBeacon) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_BEACON_SET, \ - 0, __pBeacon, 0) - -#define RTMP_DRIVER_80211_BITRATE_SET(__pAd, __pMask) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_BITRATE_SET, \ - 0, __pMask, 0) - -#define RTMP_DRIVER_80211_AP_KEY_DEL(__pAd, __pKeyInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_AP_KEY_DEL, \ - 0, __pKeyInfo, 0) - -#define RTMP_DRIVER_80211_AP_KEY_ADD(__pAd, __pKeyInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_AP_KEY_ADD, \ - 0, __pKeyInfo, 0) - -#define RTMP_DRIVER_80211_RTS_THRESHOLD_ADD(__pAd, __Rts_thresold) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_RTS_THRESHOLD_ADD, 0, \ - NULL, __Rts_thresold) - -#define RTMP_DRIVER_80211_FRAG_THRESHOLD_ADD(__pAd, __Frag_thresold) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_FRAG_THRESHOLD_ADD, 0, \ - NULL, __Frag_thresold) - -#define RTMP_DRIVER_80211_AP_KEY_DEFAULT_SET(__pAd, __KeyId) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_AP_KEY_DEFAULT_SET, 0, \ - NULL, __KeyId) - -#ifdef DOT11W_PMF_SUPPORT -#define RTMP_DRIVER_80211_AP_KEY_DEFAULT_MGMT_SET(__pAd, __pNdev, __KeyId) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_AP_KEY_DEFAULT_MGMT_SET, \ - 0, __pNdev, __KeyId) -#endif /* DOT11W_PMF_SUPPORT */ - -#define RTMP_DRIVER_80211_AP_PROBE_RSP(__pAd, __pFrame, __Len) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_AP_PROBE_RSP_EXTRA_IE, 0, \ - __pFrame, __Len) - -#define RTMP_DRIVER_80211_AP_ASSOC_RSP(__pAd, __pFrame, __Len) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_AP_ASSOC_RSP_EXTRA_IE, 0, \ - __pFrame, __Len) - -#define RTMP_DRIVER_80211_AP_MLME_PORT_SECURED(__pAd, __pMac, __Reg) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_PORT_SECURED, \ - 0, __pMac, __Reg) - -#ifdef HOSTAPD_MAP_SUPPORT /* This could be a generic fix */ -#define RTMP_DRIVER_80211_AP_STA_DEL(__pAd, __pData, __Reason) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_AP_STA_DEL, \ - 0, __pData, __Reason) -#else -#define RTMP_DRIVER_80211_AP_STA_DEL(__pAd, __pMac, __Reason) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_AP_STA_DEL, \ - 0, __pMac, __Reason) -#endif /* HOSTAPD_MAP_SUPPORT */ - -/* ap */ -#define RTMP_DRIVER_AP_BITRATE_GET(__pAd, __pConfig) \ - RTMP_AP_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ, 0, \ - __pConfig, 0) - -#define RTMP_DRIVER_AP_MAIN_OPEN(__pAd) \ - RTMP_AP_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MAIN_OPEN, 0, NULL, 0) - -/* P2P Part */ -#define RTMP_DRIVER_80211_ACTION_FRAME_REG(__pAd, __devPtr, __Reg) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_ACTION_FRAME_REG, 0, \ - __devPtr, __Reg) - -#define RTMP_DRIVER_80211_REMAIN_ON_CHAN_DUR_IMER_INIT(__pAd) \ - RTMP_COM_IoctlHandle( \ - __pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_DUR_TIMER_INIT, 0, NULL, \ - 0) - -#define RTMP_DRIVER_80211_REMAIN_ON_CHAN_SET(__pAd, __pChan, __Duration) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_SET, 0, \ - __pChan, __Duration) - -#define RTMP_DRIVER_80211_CANCEL_REMAIN_ON_CHAN_SET(__pAd, __cookie) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_CANCEL_REMAIN_ON_CHAN_SET, \ - 0, NULL, __cookie) - -#define RTMP_DRIVER_80211_CHANNEL_LOCK(__pAd, __Chan) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK, \ - 0, NULL, __Chan) - -#define RTMP_DRIVER_80211_MGMT_FRAME_REG(__pAd, __devPtr, __Reg) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_REG, 0, \ - __devPtr, __Reg) - -#define RTMP_DRIVER_80211_MGMT_FRAME_SEND(__pAd, __pFrame, __Len) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_SEND, 0, \ - __pFrame, __Len) - -#define RTMP_DRIVER_80211_P2P_CHANNEL_RESTORE(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_CHANNEL_RESTORE, 0, NULL, \ - 0) - -#define RTMP_DRIVER_80211_STA_ASSSOC_IE_SET(__pAd, __pFrame, __Len) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_P2PCLI_ASSSOC_IE_SET, 0, \ - __pFrame, __Len) - -#define RTMP_DRIVER_80211_P2P_CLIENT_KEY_ADD(__pAd, __pKeyInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_P2P_CLIENT_KEY_ADD, 0, \ - __pKeyInfo, 0) - -/* VIF Part */ -#define RTMP_DRIVER_80211_VIF_ADD(__pAd, __pInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_VIF_ADD, 0, \ - __pInfo, 0) - -#define RTMP_DRIVER_80211_VIF_DEL(__pAd, __devPtr, __type) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_VIF_DEL, 0, \ - __devPtr, __type) - -#define RTMP_DRIVER_80211_VIF_CHG(__pAd, __pVifInfo) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_VIF_CHG, 0, \ - __pVifInfo, 0) - -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT -#define RTMP_DRIVER_ADAPTER_MCC_DHCP_PROTECT_STATUS(__pAd, __flag) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_MCC_DHCP_PROTECT_STATUS, 0, \ - __flag, 0) - -#define RTMP_DRIVER_80211_SET_NOA(__pAd, __Devname) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_80211_SET_NOA, 0, \ - NULL, __Devname) -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - -#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT -#define RTMP_DRIVER_80211_SEND_WIRELESS_EVENT(__pAd, __pMacAddr) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_80211_SEND_WIRELESS_EVENT, 0, \ - __pMacAddr, 0) -#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */ -#endif /* RT_CFG80211_SUPPORT */ - -/* mesh */ -#define RTMP_DRIVER_MESH_REMOVE(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MESH_REMOVE, 0, \ - NULL, 0) - -/* inf ppa */ -#define RTMP_DRIVER_INF_PPA_INIT(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_PPA_INIT, 0, \ - NULL, 0) - -#define RTMP_DRIVER_INF_PPA_EXIT(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_INF_PPA_EXIT, 0, \ - NULL, 0) - -/* pci */ -#define RTMP_DRIVER_IRQ_INIT(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_IRQ_INIT, 0, NULL, 0) - -#define RTMP_DRIVER_IRQ_RELEASE(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_IRQ_RELEASE, 0, \ - NULL, 0) - -#define RTMP_DRIVER_PCI_SUSPEND(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PCI_SUSPEND, 0, \ - NULL, 0) - -#define RTMP_DRIVER_PCI_RESUME(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PCI_RESUME, 0, \ - NULL, 0) - -#define RTMP_DRIVER_RBUS_SUSPEND(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_RBUS_SUSPEND, 0, \ - NULL, 0) - -#define RTMP_DRIVER_RBUS_RESUME(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_RBUS_RESUME, 0, \ - NULL, 0) - -#define RTMP_DRIVER_PCI_CSR_SET(__pAd, __Address) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PCI_CSR_SET, 0, \ - NULL, __Address) - -#define RTMP_DRIVER_PCIE_INIT(__pAd, __pConfig, __pPciDev) \ - { \ - RT_CMD_PCIE_INIT *pConfig = __pConfig; \ - pConfig->pPciDev = __pPciDev; \ - pConfig->ConfigDeviceID = PCI_DEVICE_ID; \ - pConfig->ConfigSubsystemVendorID = PCI_SUBSYSTEM_VENDOR_ID; \ - pConfig->ConfigSubsystemID = PCI_SUBSYSTEM_ID; \ - pConfig->pci_init_succeed = FALSE; \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PCIE_INIT, \ - 0, __pConfig, 0); \ - } - -/* usb */ -#define RTMP_DRIVER_USB_MORE_FLAG_SET(__pAd, __pConfig) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_MORE_FLAG_SET, \ - 0, __pConfig, 0) - -#define RTMP_DRIVER_USB_CONFIG_INIT(__pAd, __pConfig) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_CONFIG_INIT, 0, \ - __pConfig, 0) - -#define RTMP_DRIVER_USB_SUSPEND(__pAd, __bIsRunning) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_SUSPEND, 0, \ - NULL, __bIsRunning) - -#define RTMP_DRIVER_USB_RESUME(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_RESUME, 0, \ - NULL, 0) - -#define RTMP_DRIVER_USB_INIT(__pAd, __pUsbDev, __driver_info) \ - do { \ - RT_CMD_USB_INIT __Config, *__pConfig = &__Config; \ - __pConfig->pUsbDev = __pUsbDev; \ - __pConfig->driver_info = __driver_info; \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_USB_INIT, \ - 0, __pConfig, 0); \ - } while (0) - -#define RTMP_DRIVER_SDIO_INIT(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_SDIO_INIT, 0, NULL, \ - 0) - -#define RTMP_DRIVER_CHIP_PREPARE(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_CHIP_PREPARE, 0, \ - NULL, 0) - -/* ap */ -#define RTMP_DRIVER_AP_BITRATE_GET(__pAd, __pConfig) \ - RTMP_AP_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ, 0, \ - __pConfig, 0) - -/* sta */ - -#ifdef PROFILE_PATH_DYNAMIC -#define RTMP_DRIVER_PROFILEPATH_SET(__pAd, __Type) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_PROFILEPATH_SET, 0, \ - NULL, __Type, __Type) -#endif /* PROFILE_PATH_DYNAMIC */ - -#define RTMP_DRIVER_MAC_ADDR_GET(__pAd, __pMacAddr) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_MAC_ADDR_GET, 0, \ - __pMacAddr, 0) - -#define RTMP_DRIVER_ADAPTER_CSO_SUPPORT_TEST(__pAd, __flag) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_ADAPTER_CSO_SUPPORT_TEST, 0, \ - __flag, 0) - -#define RTMP_DRIVER_ADAPTER_TSO_SUPPORT_TEST(__pAd, __flag) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_ADAPTER_TSO_SUPPORT_TEST, 0, \ - __flag, 0) - -#ifdef CONFIG_HAS_EARLYSUSPEND -#define RTMP_DRIVER_SET_SUSPEND_FLAG(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_SET_SUSPEND_FLAG, \ - 0, NULL, 0) - -#define RTMP_DRIVER_LOAD_FIRMWARE_CHECK(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_LOAD_FIRMWARE_CHECK, 0, NULL, 0) - -#define RTMP_DRIVER_OS_COOKIE_GET(__pAd, __os_cookie) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_OS_COOKIE_GET, 0, \ - __os_cookie, 0) - -#define RTMP_DRIVER_ADAPTER_REGISTER_EARLYSUSPEND(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_REGISTER_EARLYSUSPEND, 0, NULL, \ - 0) - -#define RTMP_DRIVER_ADAPTER_UNREGISTER_EARLYSUSPEND(__pAd) \ - RTMP_COM_IoctlHandle(__pAd, NULL, \ - CMD_RTPRIV_IOCTL_UNREGISTER_EARLYSUSPEND, 0, \ - NULL, 0) - -#define RTMP_DRIVER_ADAPTER_CHECK_EARLYSUSPEND(__pAd, __flag) \ - RTMP_COM_IoctlHandle(__pAd, NULL, CMD_RTPRIV_IOCTL_CHECK_EARLYSUSPEND, \ - 0, __flag, 0) -#endif /* CONFIG_HAS_EARLYSUSPEND */ - -#endif /* __RT_OS_NET_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_os_util.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_os_util.h deleted file mode 100644 index b6978c4669..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_os_util.h +++ /dev/null @@ -1,668 +0,0 @@ -/**************************************************************************** - - Module Name: - rt_os_util.h - - Abstract: - All function prototypes are provided from UTIL modules. - - Note: - But can not use any OS key word and compile option here. - All functions are provided from UTIL modules. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - -***************************************************************************/ - -#ifndef __RT_OS_UTIL_H__ -#define __RT_OS_UTIL_H__ - -#include "common/mt_os_util.h" - -/* ============================ rt_linux.c ================================== */ -/* General */ -VOID RtmpUtilInit(VOID); -UINT32 MtRandom32(VOID); - -/* OS Time */ -VOID RtmpusecDelay(ULONG usec); -VOID RtmpOsMsDelay(ULONG msec); - -void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time); - -ULONG RTMPMsecsToJiffies(UINT msec); -void RTMP_GetCurrentSystemTick(ULONG *pNow); - -VOID RtmpOsWait(UINT32 Time); -UINT32 RtmpOsTimerAfter(ULONG a, ULONG b); -UINT32 RtmpOsTimerBefore(ULONG a, ULONG b); -VOID RtmpOsGetSystemUpTime(ULONG *pTime); -UINT32 RtmpOsTickUnitGet(VOID); - -/* - OS Memory -*/ -/* - Function: - allocate memory - Parameters: - - Return: - - mem shall be set as NULL if allocation failed -*/ -NDIS_STATUS os_alloc_mem_suspend(VOID *pReserved, UCHAR **mem, ULONG size); - -NDIS_STATUS AdapterBlockAllocateMemory(IN VOID *handle, OUT VOID **ppAd, - IN UINT32 SizeOfpAd); - -VOID *RtmpOsVmalloc(ULONG Size); -VOID RtmpOsVfree(VOID *pMem); - -ULONG RtmpOsCopyFromUser(VOID *to, const void *from, ULONG n); -ULONG RtmpOsCopyToUser(VOID *to, const void *from, ULONG n); - -BOOLEAN RtmpOsStatsAlloc(VOID **ppStats, VOID **ppIwStats); - -/* OS Packet */ -PNDIS_PACKET RtmpOSNetPktAlloc(VOID *pReserved, int size); - -PNDIS_PACKET RTMP_AllocateFragPacketBuffer(VOID *pReserved, ULONG Length); - -NDIS_STATUS RTMPAllocateNdisPacket(IN VOID *pReserved, - OUT PNDIS_PACKET *ppPacket, - IN PUCHAR pHeader, IN UINT HeaderLen, - IN PUCHAR pData, IN UINT DataLen); - -VOID RTMPFreeNdisPacket(VOID *pReserved, PNDIS_PACKET pPacket); -VOID RTMPFreeNdisPacketIRQ(VOID *pReserved, PNDIS_PACKET pPacket); - -void RTMP_QueryPacketInfo(IN PNDIS_PACKET pPacket, OUT PACKET_INFO *pPacketInfo, - OUT PUCHAR *pSrcBufVA, OUT UINT *pSrcBufLen); - -PNDIS_PACKET ClonePacket(BOOLEAN moniflag, PNET_DEV ndev, PNDIS_PACKET pkt, - UCHAR *buf, ULONG sz); -#ifdef MAP_TS_TRAFFIC_SUPPORT -PNDIS_PACKET CopyPacket(IN PNET_DEV if_dev, IN PNDIS_PACKET pkt); -#endif -PNDIS_PACKET DuplicatePacket(PNET_DEV pNetDev, PNDIS_PACKET pPacket); - -PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(IN VOID *pReserved, - IN PNDIS_PACKET pOldPkt); - -PNDIS_PACKET duplicate_pkt_vlan(IN PNET_DEV pNetDev, IN USHORT VLAN_VID, - IN USHORT VLAN_Priority, IN PUCHAR pHeader802_3, - IN UINT HdrLen, IN PUCHAR pData, - IN ULONG DataSize, IN UCHAR *TPID); - -typedef void (*RTMP_CB_8023_PACKET_ANNOUNCE)(IN VOID *pCtrlBkPtr, - IN PNDIS_PACKET pPacket, - IN UCHAR OpMode); - -BOOLEAN -RTMPL2FrameTxAction(IN VOID *pCtrlBkPtr, IN PNET_DEV pNetDev, - IN RTMP_CB_8023_PACKET_ANNOUNCE _announce_802_3_packet, - IN UCHAR apidx, IN PUCHAR pData, IN UINT32 data_len, - IN UCHAR OpMode); - -PNDIS_PACKET ExpandPacket(IN VOID *pReserved, IN PNDIS_PACKET pPacket, - IN UINT32 ext_head_len, IN UINT32 ext_tail_len); - -void wlan_802_11_to_802_3_packet(IN PNET_DEV pNetDev, IN UCHAR OpMode, - IN USHORT VLAN_VID, IN USHORT VLAN_Priority, - IN PNDIS_PACKET pRxPacket, IN UCHAR *pData, - IN ULONG DataSize, IN PUCHAR pHeader802_3, - IN UCHAR *TPID); - -#ifdef SNIFFER_SUPPORT -void send_prism_monitor_packets(PNET_DEV pNetDev, PNDIS_PACKET pRxPacket, - VOID *dot11_hdr, UCHAR *pData, USHORT DataSize, - UCHAR L2PAD, UCHAR PHYMODE, UCHAR BW, - UCHAR ShortGI, UCHAR MCS, UCHAR AMPDU, - UCHAR STBC, UCHAR RSSI1, - UCHAR BssMonitorFlag11n, UCHAR *pDevName, - UCHAR Channel, UCHAR CentralChannel, - UINT32 MaxRssi); - -#ifdef SNIFFER_MT7615 -void send_radiotap_mt7615_monitor_packets(PNET_DEV pNetDev, UCHAR *rmac_info, - UINT32 rxv2_cyc1, - PNDIS_PACKET pRxPacket, UCHAR *pData, - USHORT DataSize, UCHAR *pDevName, - CHAR MaxRssi, UINT32 UP_value); -#endif - -void send_radiotap_monitor_packets( - PNET_DEV pNetDev, UINT8 AmsduState, UCHAR *rmac_info, - PNDIS_PACKET pRxPacket, VOID *fc_field, UCHAR *pData, USHORT DataSize, - UCHAR L2PAD, UCHAR PHYMODE, UCHAR BW, UCHAR ShortGI, UCHAR MCS, - UCHAR LDPC, UCHAR LDPC_EX_SYM, UCHAR AMPDU, UCHAR STBC, CHAR RSSI1, - UCHAR *pDevName, UCHAR Channel, UCHAR CentralChannel, - UCHAR sideband_index, CHAR MaxRssi, UINT32 timestamp, UINT32 UP_value); -#endif /* SNIFFER_SUPPORT */ - -UCHAR VLAN_8023_Header_Copy(IN USHORT VLAN_VID, IN USHORT VLAN_Priority, - IN PUCHAR pHeader802_3, IN UINT HdrLen, - OUT PUCHAR pData, IN UCHAR *TPID); - -#ifdef VLAN_SUPPORT -VOID *RtmpOsVLANInsertTag(PNDIS_PACKET pPacket, UINT16 tci); -#endif /*VLAN_SUPPORT*/ - -VOID RtmpOsSkbPullRcsum(struct sk_buff *skb, unsigned int len); -VOID RtmpOsSkbResetMacHeader(struct sk_buff *skb); -VOID RtmpOsSkbResetNetworkHeader(struct sk_buff *skb); -VOID RtmpOsSkbResetTransportHeader(struct sk_buff *skb); -VOID RtmpOsSkbResetMacLen(struct sk_buff *skb); - -VOID RtmpOsPktBodyCopy(IN PNET_DEV pNetDev, IN PNDIS_PACKET pNetPkt, - IN ULONG ThisFrameLen, IN PUCHAR pData); - -INT RtmpOsIsPktCloned(PNDIS_PACKET pNetPkt); -PNDIS_PACKET RtmpOsPktCopy(PNDIS_PACKET pNetPkt); -PNDIS_PACKET RtmpOsPktClone(PNDIS_PACKET pNetPkt); - -VOID RtmpOsPktDataPtrAssign(PNDIS_PACKET pNetPkt, UCHAR *pData); - -VOID RtmpOsPktLenAssign(PNDIS_PACKET pNetPkt, LONG Len); -VOID RtmpOsPktTailAdjust(PNDIS_PACKET pNetPkt, UINT removedTagLen); - -PUCHAR RtmpOsPktTailBufExtend(PNDIS_PACKET pNetPkt, UINT len); -PUCHAR RtmpOsPktHeadBufExtend(PNDIS_PACKET pNetPkt, UINT len); -VOID RtmpOsPktReserve(PNDIS_PACKET pNetPkt, UINT len); - -VOID RtmpOsPktProtocolAssign(PNDIS_PACKET pNetPkt); -VOID RtmpOsPktInfPpaSend(PNDIS_PACKET pNetPkt); -VOID RtmpOsPktRcvHandle(PNDIS_PACKET pNetPkt); -#ifdef CONFIG_FAST_NAT_SUPPORT -VOID RtmpOsPktNatMagicTag(PNDIS_PACKET pNetPkt); -#endif /*CONFIG_FAST_NAT_SUPPORT*/ -VOID RtmpOsPktInit(PNDIS_PACKET pNetPkt, PNET_DEV pNetDev, UCHAR *buf, - USHORT len); - -PNDIS_PACKET RtmpOsPktIappMakeUp(PNET_DEV pNetDev, UINT8 *pMac); - -BOOLEAN RtmpOsPktOffsetInit(VOID); - -UINT16 RtmpOsNtohs(UINT16 Value); -UINT16 RtmpOsHtons(UINT16 Value); -UINT32 RtmpOsNtohl(UINT32 Value); -UINT32 RtmpOsHtonl(UINT32 Value); - -/* OS File */ -RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode); -int RtmpOSFileClose(RTMP_OS_FD osfd); -void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset); -int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen); -int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen); - -INT32 RtmpOsFileIsErr(VOID *pFile); - -void RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfoOrg, BOOLEAN bSet); - -/* OS Network Interface */ -int RtmpOSNetDevAddrSet(IN UCHAR OpMode, IN PNET_DEV pNetDev, - IN PUCHAR pMacAddr, IN PUCHAR dev_name); - -void RtmpOSNetDevClose(PNET_DEV pNetDev); -void RtmpOSNetDevFree(PNET_DEV pNetDev); -INT RtmpOSNetDevAlloc(PNET_DEV *new_dev_p, UINT32 privDataSize); -INT RtmpOSNetDevOpsAlloc(PVOID *pNetDevOps); - -PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, RTMP_STRING *pDevName); - -void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev); - -INT RtmpOSNetDevDestory(VOID *pReserved, PNET_DEV pNetDev); -void RtmpOSNetDevDetach(PNET_DEV pNetDev); -int RtmpOSNetDevAttach(IN UCHAR OpMode, IN PNET_DEV pNetDev, - IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook); - -void RtmpOSNetDevProtect(IN BOOLEAN lock_it); - -PNET_DEV RtmpOSNetDevCreate(IN INT32 MC_RowID, IN UINT32 *pIoctlIF, - IN INT devType, IN INT devNum, IN INT privMemSize, - IN char *pNamePrefix, IN BOOLEAN autoSuffix); - -BOOLEAN RtmpOSNetDevIsUp(VOID *pDev); - -unsigned char *RtmpOsNetDevGetPhyAddr(VOID *pDev); - -VOID RtmpOsNetQueueStart(PNET_DEV pDev); -VOID RtmpOsNetQueueStop(PNET_DEV pDev); -VOID RtmpOsNetQueueWake(PNET_DEV pDev); - -VOID RtmpOsSetPktNetDev(VOID *pPkt, VOID *pDev); -PNET_DEV RtmpOsPktNetDevGet(VOID *pPkt); - -unsigned long RtmpOSGetNetDevQState(VOID *pDev, unsigned int q_idx); -unsigned int RtmpOSGetNetDevQNum(VOID *pDev); -unsigned int RtmpOSGetNetDevFlag(VOID *pDev); -unsigned long RtmpOSGetNetDevState(VOID *pDev); - -char *RtmpOsGetNetDevName(VOID *pDev); - -UINT32 RtmpOsGetNetIfIndex(IN VOID *pDev); - -VOID RtmpOsSetNetDevPriv(VOID *pDev, VOID *pPriv); -VOID *RtmpOsGetNetDevPriv(VOID *pDev); - -VOID RtmpOsSetNetDevWdev(VOID *net_dev, VOID *wdev); -VOID *RtmpOsGetNetDevWdev(VOID *pDev); - -USHORT RtmpDevPrivFlagsGet(VOID *pDev); -VOID RtmpDevPrivFlagsSet(VOID *pDev, USHORT PrivFlags); - -VOID RtmpOsSetNetDevType(VOID *pDev, USHORT Type); -VOID RtmpOsSetNetDevTypeMonitor(VOID *pDev); -UCHAR get_sniffer_mode(VOID *pDev); -VOID set_sniffer_mode(VOID *pDev, UCHAR mode); - -VOID RtmpOsCmdUp(RTMP_OS_TASK *pCmdQTask); -BOOLEAN RtmpOsIsCmdThreadRunning(RTMP_OS_TASK *pCmdQTask); -/* OS Semaphore */ -BOOLEAN RtmpOsSemaInitLocked(RTMP_OS_SEM *pSemOrg, LIST_HEADER *pSemList); -BOOLEAN RtmpOsSemaInit(RTMP_OS_SEM *pSemOrg, LIST_HEADER *pSemList); -BOOLEAN RtmpOsSemaDestory(RTMP_OS_SEM *pSemOrg); -INT RtmpOsSemaWaitInterruptible(RTMP_OS_SEM *pSemOrg); -VOID RtmpOsSemaWakeUp(RTMP_OS_SEM *pSemOrg); -VOID RtmpOsMlmeUp(RTMP_OS_TASK *pMlmeQTask); - -VOID RtmpOsInitCompletion(RTMP_OS_COMPLETION *pCompletion); -VOID RtmpOsExitCompletion(RTMP_OS_COMPLETION *pCompletion); -VOID RtmpOsComplete(RTMP_OS_COMPLETION *pCompletion); -ULONG RtmpOsWaitForCompletionTimeout(RTMP_OS_COMPLETION *pCompletion, - ULONG Timeout); - -/* OS Task */ -BOOLEAN RtmpOsTaskletSche(RTMP_NET_TASK_STRUCT *pTasklet); - -BOOLEAN RtmpOsTaskletInit(RTMP_NET_TASK_STRUCT *pTasklet, - VOID (*pFunc)(unsigned long data), ULONG Data, - LIST_HEADER *pTaskletList); - -BOOLEAN RtmpOsTaskletKill(RTMP_NET_TASK_STRUCT *pTasklet); -VOID RtmpOsTaskletDataAssign(RTMP_NET_TASK_STRUCT *pTasklet, ULONG Data); - -VOID RtmpOsTaskWakeUp(RTMP_OS_TASK *pTaskOrg); -INT32 RtmpOsTaskIsKilled(RTMP_OS_TASK *pTaskOrg); - -BOOLEAN RtmpOsCheckTaskLegality(RTMP_OS_TASK *pTaskOrg); - -BOOLEAN RtmpOSTaskAlloc(RTMP_OS_TASK *pTask, LIST_HEADER *pTaskList); - -VOID RtmpOSTaskFree(RTMP_OS_TASK *pTask); - -NDIS_STATUS RtmpOSTaskKill(RTMP_OS_TASK *pTaskOrg); - -INT RtmpOSTaskNotifyToExit(RTMP_OS_TASK *pTaskOrg); - -VOID RtmpOSTaskCustomize(RTMP_OS_TASK *pTaskOrg); - -NDIS_STATUS RtmpOSTaskAttach(IN RTMP_OS_TASK *pTaskOrg, - IN RTMP_OS_TASK_CALLBACK fn, IN ULONG arg); - -NDIS_STATUS RtmpOSTaskInit(IN RTMP_OS_TASK *pTaskOrg, IN RTMP_STRING *pTaskName, - IN VOID *pPriv, IN LIST_HEADER *pTaskList, - IN LIST_HEADER *pSemList); - -BOOLEAN RtmpOSTaskWait(IN VOID *pReserved, IN RTMP_OS_TASK *pTaskOrg, - IN INT32 *pStatus); - -BOOLEAN RtmpOSTaskWaitCond(IN VOID *pReserved, IN RTMP_OS_TASK *pTaskOrg, - IN UINT32 u4Cond, IN INT32 *pStatus); - -VOID *RtmpOsTaskDataGet(RTMP_OS_TASK *pTaskOrg); - -INT32 RtmpThreadPidKill(RTMP_OS_PID PID); - -/* OS Cache */ -VOID RtmpOsDCacheFlush(ULONG AddrStart, ULONG Size); - -/* OS Timer */ -VOID RTMP_SetPeriodicTimer(IN NDIS_MINIPORT_TIMER *pTimerOrg, - IN unsigned long timeout); - -VOID RTMP_OS_Init_Timer(IN VOID *pReserved, IN NDIS_MINIPORT_TIMER *pTimerOrg, - IN TIMER_FUNCTION function, IN PVOID data, - IN LIST_HEADER *pTimerList); - -VOID RTMP_OS_Add_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout); -VOID RTMP_OS_Mod_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout); -VOID RTMP_OS_Del_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, BOOLEAN *pCancelled); -VOID RTMP_OS_Release_Timer(NDIS_MINIPORT_TIMER *pTimerOrg); - -BOOLEAN RTMP_OS_Alloc_Rsc(LIST_HEADER *pRscList, VOID *pRsc, UINT32 RscLen); -VOID RTMP_OS_Free_Rscs(LIST_HEADER *pRscList); - -/* OS Lock */ -BOOLEAN RtmpOsAllocateLock(NDIS_SPIN_LOCK *pLock, LIST_HEADER *pLockList); -VOID RtmpOsFreeSpinLock(NDIS_SPIN_LOCK *pLockOrg); -VOID RtmpOsSpinLockBh(NDIS_SPIN_LOCK *pLockOrg); -VOID RtmpOsSpinUnLockBh(NDIS_SPIN_LOCK *pLockOrg); -VOID RtmpOsIntLock(NDIS_SPIN_LOCK *pLockOrg, ULONG *pIrqFlags); -VOID RtmpOsIntUnLock(NDIS_SPIN_LOCK *pLockOrg, ULONG IrqFlags); - -/* OS PID */ -VOID RtmpOsGetPid(ULONG *pDst, ULONG PID); -VOID RtmpOsTaskPidInit(RTMP_OS_PID *pPid); - -/* OS I/O */ -VOID RTMP_PCI_Writel(ULONG Value, VOID *pAddr); -VOID RTMP_PCI_Writew(ULONG Value, VOID *pAddr); -VOID RTMP_PCI_Writeb(ULONG Value, VOID *pAddr); -ULONG RTMP_PCI_Readl(VOID *pAddr); -ULONG RTMP_PCI_Readw(VOID *pAddr); -ULONG RTMP_PCI_Readb(VOID *pAddr); - -int RtmpOsPciConfigReadWord(IN VOID *pDev, IN UINT32 Offset, - OUT UINT16 *pValue); - -int RtmpOsPciConfigWriteWord(VOID *pDev, UINT32 Offset, UINT16 Value); -int RtmpOsPciConfigReadDWord(VOID *pDev, UINT32 Offset, UINT32 *pValue); -int RtmpOsPciConfigWriteDWord(VOID *pDev, UINT32 Offset, UINT32 Value); - -int RtmpOsPciFindCapability(VOID *pDev, INT Cap); - -VOID *RTMPFindHostPCIDev(VOID *pPciDevSrc); - -int RtmpOsPciMsiEnable(VOID *pDev); -VOID RtmpOsPciMsiDisable(VOID *pDev); - -/* OS Wireless */ -ULONG RtmpOsMaxScanDataGet(VOID); - -/* OS Interrutp */ -INT32 RtmpOsIsInInterrupt(VOID); - -/* OS USB */ -VOID *RtmpOsUsbUrbDataGet(VOID *pUrb); -NTSTATUS RtmpOsUsbUrbStatusGet(VOID *pUrb); -ULONG RtmpOsUsbUrbLenGet(VOID *pUrb); - -/* OS Atomic */ -BOOLEAN RtmpOsAtomicInit(RTMP_OS_ATOMIC *pAtomic, LIST_HEADER *pAtomicList); -VOID RtmpOsAtomicDestroy(RTMP_OS_ATOMIC *pAtomic); -LONG RtmpOsAtomicRead(RTMP_OS_ATOMIC *pAtomic); -VOID RtmpOsAtomicDec(RTMP_OS_ATOMIC *pAtomic); -VOID RtmpOsAtomicInterlockedExchange(RTMP_OS_ATOMIC *pAtomicSrc, LONG Value); - -/* OS Utility */ -void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen); - -typedef VOID (*RTMP_OS_SEND_WLAN_EVENT)(IN VOID *pAdSrc, IN USHORT Event_flag, - IN PUCHAR pAddr, IN UCHAR BssIdx, - IN CHAR Rssi); - -VOID RtmpOsSendWirelessEvent(IN VOID *pAd, IN USHORT Event_flag, - IN PUCHAR pAddr, IN UCHAR BssIdx, IN CHAR Rssi, - IN RTMP_OS_SEND_WLAN_EVENT pFunc); - -#ifdef CONFIG_AP_SUPPORT -void SendSignalToDaemon(IN INT sig, IN RTMP_OS_PID pid, - IN unsigned long pid_no); -#endif /* CONFIG_AP_SUPPORT */ - -int RtmpOSWrielessEventSend(IN PNET_DEV pNetDev, IN UINT32 eventType, - IN INT flags, IN PUCHAR pSrcMac, IN PUCHAR pData, - IN UINT32 dataLen); - -int RtmpOSWrielessEventSendExt(IN PNET_DEV pNetDev, IN UINT32 eventType, - IN INT flags, IN PUCHAR pSrcMac, IN PUCHAR pData, - IN UINT32 dataLen, IN UINT32 family); - -UINT RtmpOsWirelessExtVerGet(VOID); - -VOID RtmpDrvAllMacPrint(IN VOID *pReserved, IN UINT32 *pBufMac, - IN UINT32 AddrStart, IN UINT32 AddrEnd, - IN UINT32 AddrStep); - -VOID RtmpDrvAllE2PPrint(IN VOID *pReserved, IN USHORT *pMacContent, - IN UINT32 AddrEnd, IN UINT32 AddrStep); - -VOID RtmpDrvAllRFPrint(IN VOID *pReserved, IN UCHAR *pBuf, IN UINT32 BufLen); - -int RtmpOSIRQRelease(IN PNET_DEV pNetDev, IN UINT32 infType, - IN PPCI_DEV pci_dev, IN BOOLEAN *pHaveMsi); - -VOID RtmpOsWlanEventSet(IN VOID *pReserved, IN BOOLEAN *pCfgWEnt, - IN BOOLEAN FlgIsWEntSup); - -UINT16 RtmpOsGetUnaligned(UINT16 *pWord); - -UINT32 RtmpOsGetUnaligned32(UINT32 *pWord); - -ULONG RtmpOsGetUnalignedlong(ULONG *pWord); - -long RtmpOsSimpleStrtol(IN const char *cp, IN char **endp, - IN unsigned int base); - -VOID RtmpOsOpsInit(RTMP_OS_ABL_OPS *pOps); - -/* ============================ rt_os_util.c ================================ */ -VOID RtmpDrvMaxRateGet(IN VOID *pReserved, IN UINT8 MODE, IN UINT8 ShortGI, - IN UINT8 BW, IN UINT8 MCS, IN UINT8 Antenna, - OUT UINT32 *pRate); - -char *rtstrchr(const char *s, int c); - -RTMP_STRING *WscGetAuthTypeStr(USHORT authFlag); - -RTMP_STRING *WscGetEncryTypeStr(USHORT encryFlag); - -USHORT WscGetAuthTypeFromStr(RTMP_STRING *arg); - -USHORT WscGetEncrypTypeFromStr(RTMP_STRING *arg); - -VOID RtmpMeshDown(IN VOID *pDrvCtrlBK, IN BOOLEAN WaitFlag, - IN BOOLEAN (*RtmpMeshLinkCheck)(IN VOID *pAd)); - -USHORT RtmpOsNetPrivGet(PNET_DEV pDev); - -BOOLEAN RtmpOsCmdDisplayLenCheck(IN UINT32 LenSrc, IN UINT32 Offset); - -VOID WpaSendMicFailureToWpaSupplicant(IN PNET_DEV pNetDev, - IN const PUCHAR src_addr, - IN BOOLEAN bUnicast, IN INT key_id, - IN const PUCHAR tsc); - -int wext_notify_event_assoc(IN PNET_DEV pNetDev, IN UCHAR *ReqVarIEs, - IN UINT32 ReqVarIELen); - -VOID SendAssocIEsToWpaSupplicant(IN PNET_DEV pNetDev, IN UCHAR *ReqVarIEs, - IN UINT32 ReqVarIELen); - -/* ============================ rt_rbus_pci_util.c ========================== */ -void RtmpAllocDescBuf(IN VOID *pDev, IN UINT Index, IN ULONG Length, - IN BOOLEAN Cached, OUT VOID **VirtualAddress, - OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); - -void RtmpFreeDescBuf(IN VOID *pDev, IN ULONG Length, IN VOID *VirtualAddress, - IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - -void RTMP_AllocateFirstTxBuffer(IN VOID *pDev, IN UINT Index, IN ULONG Length, - IN BOOLEAN Cached, OUT VOID **VirtualAddress, - OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); - -void RTMP_FreeFirstTxBuffer(IN VOID *pDev, IN ULONG Length, IN BOOLEAN Cached, - IN PVOID VirtualAddress, - IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - -enum MEM_ALLOC_TYPE { - DYNAMIC_PAGE_ALLOC, - DYNAMIC_SLAB_ALLOC, - PRE_SLAB_ALLOC, -}; - -PNDIS_PACKET RTMP_AllocateRxPacketBuffer( - VOID *pReserved, VOID *pDev, enum MEM_ALLOC_TYPE type, ULONG Length, - PVOID *VirtualAddress, PNDIS_PHYSICAL_ADDRESS PhysicalAddress); - -ra_dma_addr_t linux_pci_map_single(void *pDev, void *ptr, size_t size, - int sd_idx, int direction); - -void linux_pci_unmap_single(void *pDev, ra_dma_addr_t dma_addr, size_t size, - int direction); - -/* ============================ rt_usb_util.c =============================== */ - -#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) -void RtmpFlashRead(void *hdev_ctrl, UCHAR *p, ULONG a, ULONG b); - -void RtmpFlashWrite(void *hdev_ctrl, UCHAR *p, ULONG a, ULONG b); -#endif /* defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) */ - -UINT32 RtmpOsGetUsbDevVendorID(IN VOID *pUsbDev); - -UINT32 RtmpOsGetUsbDevProductID(IN VOID *pUsbDev); - -/* CFG80211 */ -#ifdef RT_CFG80211_SUPPORT -typedef struct __CFG80211_BAND { - UINT8 RFICType; - UINT8 MpduDensity; - UINT8 TxStream; - UINT8 RxStream; - UINT32 MaxTxPwr; - UINT32 MaxBssTable; - - UINT16 RtsThreshold; - UINT16 FragmentThreshold; - UINT32 RetryMaxCnt; /* bit0~7: short; bit8 ~ 15: long */ - BOOLEAN FlgIsBMode; -} CFG80211_BAND; - -VOID CFG80211OS_UnRegister(IN VOID *pCB, IN VOID *pNetDev); - -BOOLEAN CFG80211_SupBandInit(IN VOID *pCB, IN CFG80211_BAND *pBandInfo, - IN VOID *pWiphyOrg, IN VOID *pChannelsOrg, - IN VOID *pRatesOrg); - -BOOLEAN CFG80211OS_SupBandReInit(IN VOID *pCB, IN CFG80211_BAND *pBandInfo); - -VOID CFG80211OS_RegHint(IN VOID *pCB, IN UCHAR *pCountryIe, - IN ULONG CountryIeLen); - -VOID CFG80211OS_RegHint11D(IN VOID *pCB, IN UCHAR *pCountryIe, - IN ULONG CountryIeLen); - -BOOLEAN CFG80211OS_BandInfoGet(IN VOID *pCB, IN VOID *pWiphyOrg, - OUT VOID **ppBand24, OUT VOID **ppBand5); - -UINT32 CFG80211OS_ChanNumGet(IN VOID *pCB, IN VOID *pWiphyOrg, - IN UINT32 IdBand); - -BOOLEAN CFG80211OS_ChanInfoGet(IN VOID *pCB, IN VOID *pWiphyOrg, - IN UINT32 IdBand, IN UINT32 IdChan, - OUT UINT32 *pChanId, OUT UINT32 *pPower, - OUT BOOLEAN *pFlgIsRadar); - -BOOLEAN CFG80211OS_ChanInfoInit(IN VOID *pCB, IN UINT32 InfoIndex, - IN UCHAR ChanId, IN UCHAR MaxTxPwr, - IN BOOLEAN FlgIsNMode, IN BOOLEAN FlgIsBW20M); - -VOID CFG80211OS_Scaning(IN VOID *pCB, IN UINT32 ChanId, IN UCHAR *pFrame, - IN UINT32 FrameLen, IN INT32 RSSI, - IN BOOLEAN FlgIsNMode, IN UINT8 BW); - -VOID CFG80211OS_ScanEnd(IN VOID *pCB, IN BOOLEAN FlgIsAborted); - -void CFG80211OS_ConnectResultInform(IN VOID *pCB, IN UCHAR *pBSSID, - IN UCHAR *pReqIe, IN UINT32 ReqIeLen, - IN UCHAR *pRspIe, IN UINT32 RspIeLen, - IN UCHAR FlgIsSuccess); - -void CFG80211OS_P2pClientConnectResultInform(IN PNET_DEV pNetDev, - IN UCHAR *pBSSID, IN UCHAR *pReqIe, - IN UINT32 ReqIeLen, - IN UCHAR *pRspIe, - IN UINT32 RspIeLen, - IN UCHAR FlgIsSuccess); - -BOOLEAN CFG80211OS_RxMgmt(IN PNET_DEV pNetDev, IN INT32 freq, IN PUCHAR frame, - IN UINT32 len); -VOID CFG80211OS_TxStatus(IN PNET_DEV pNetDev, IN INT32 cookie, IN PUCHAR frame, - IN UINT32 len, IN BOOLEAN ack); -VOID CFG80211OS_NewSta(IN PNET_DEV pNetDev, IN const PUCHAR mac_addr, - IN const PUCHAR assoc_frame, IN UINT32 assoc_len, - IN BOOLEAN isReassoc); -VOID CFG80211OS_DelSta(IN PNET_DEV pNetDev, IN const PUCHAR mac_addr); -VOID CFG80211OS_MICFailReport(IN PNET_DEV pNetDev, IN const PUCHAR src_addr, - IN BOOLEAN unicast, IN INT key_id, - IN const PUCHAR tsc); -VOID CFG80211OS_Roamed(PNET_DEV pNetDev, IN UCHAR *pBSSID, IN UCHAR *pReqIe, - IN UINT32 ReqIeLen, IN UCHAR *pRspIe, - IN UINT32 RspIeLen); -VOID CFG80211OS_JoinIBSS(IN PNET_DEV pNetDev, IN const PUCHAR pBssid); -VOID CFG80211OS_Disconnected(IN PNET_DEV pNetDev); -VOID CFG80211OS_PutBss(IN VOID *pWiphyOrg, IN VOID *pCfg80211Bss); -#endif /* RT_CFG80211_SUPPORT */ - -/* ================================ MACRO =================================== */ -#define RTMP_UTIL_DCACHE_FLUSH(__AddrStart, __Size) - -/* ================================ EXTERN ================================== */ -extern UCHAR SNAP_802_1H[6]; -extern UCHAR SNAP_BRIDGE_TUNNEL[6]; -extern UCHAR EAPOL[2]; -extern UCHAR TPID[]; -extern UCHAR IPX[2]; -extern UCHAR APPLE_TALK[2]; -extern UCHAR NUM_BIT8[8]; -extern ULONG RTPktOffsetData, RTPktOffsetLen, RTPktOffsetCB; - -extern ULONG OS_NumOfMemAlloc, OS_NumOfMemFree; - -extern INT32 ralinkrate[]; -extern UINT32 RT_RateSize; - -#ifdef PLATFORM_UBM_IPX8 -#include "vrut_ubm.h" -#endif /* PLATFORM_UBM_IPX8 */ - -INT32 RtPrivIoctlSetVal(VOID); - -void OS_SPIN_LOCK(NDIS_SPIN_LOCK *lock); -void OS_SPIN_UNLOCK(NDIS_SPIN_LOCK *lock); -void OS_SPIN_LOCK_IRQSAVE(NDIS_SPIN_LOCK *lock, unsigned long *flags); -void OS_SPIN_UNLOCK_IRQRESTORE(NDIS_SPIN_LOCK *lock, unsigned long *flags); -void OS_SPIN_LOCK_IRQ(NDIS_SPIN_LOCK *lock); -void OS_SPIN_UNLOCK_IRQ(NDIS_SPIN_LOCK *lock); -void RtmpOsSpinLockIrqSave(NDIS_SPIN_LOCK *lock, unsigned long *flags); -void RtmpOsSpinUnlockIrqRestore(NDIS_SPIN_LOCK *lock, unsigned long *flags); -void RtmpOsSpinLockIrq(NDIS_SPIN_LOCK *lock); -void RtmpOsSpinUnlockIrq(NDIS_SPIN_LOCK *lock); -int OS_TEST_BIT(int bit, ULONG *flags); -void OS_SET_BIT(int bit, ULONG *flags); -void OS_CLEAR_BIT(int bit, ULONG *flags); -void OS_LOAD_CODE_FROM_BIN(unsigned char **image, char *bin_name, void *inf_dev, - UINT32 *code_len); -#ifdef MEM_ALLOC_INFO_SUPPORT -VOID MemInfoListInital(VOID); -UINT32 ShowMemAllocInfo(VOID); -UINT32 ShowPktAllocInfo(VOID); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -INT set_qiscdump_proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -VOID wifi_dump_info(VOID); - -#ifdef RTMP_WLAN_HOOK_SUPPORT -#include - -/*define os layer hook function implementation*/ -#define WLAN_HOOK_CALL(hook, ad, priv) mt_wlan_hook_call(hook, ad, priv) -#define WLAN_HOOK_INIT() mt_wlan_hook_init() - -#else -#define WLAN_HOOK_CALL(hook, ad, priv) -#define WLAN_HOOK_INIT() -#endif - -INT32 CFG80211OS_UpdateRegRuleByRegionIdx(IN VOID *pCB, IN VOID *pChDesc2G, - IN VOID *pChDesc5G); - -#endif /* __RT_OS_UTIL_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_txbf.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_txbf.h deleted file mode 100644 index 41096dff55..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_txbf.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_txbf.c - - Abstract: - Tx Beamforming related constants and data structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Shiang 2010/06/29 -*/ - -#ifndef _RT_TXBF_H_ -#define _RT_TXBF_H_ - -#ifdef TXBF_SUPPORT - -/* #define MRQ_FORCE_TX //Force MRQ regardless the capability of the station */ - -/* TxSndgPkt Sounding type definitions */ -#define SNDG_TYPE_DISABLE 0 -#define SNDG_TYPE_SOUNDING 1 -#define SNDG_TYPE_NDP 2 - -/* Explicit TxBF feedback mechanism */ -#define ETXBF_FB_DISABLE 0 -#define ETXBF_FB_CSI 1 -#define ETXBF_FB_NONCOMP 2 -#define ETXBF_FB_COMP 4 - -/* #define MRQ_FORCE_TX //Force MRQ regardless the capability of the station */ - -/* - eTxBfEnCond values: - 0:no etxbf, - 1:etxbf update periodically, - 2:etxbf updated if mcs changes in RateSwitchingAdapt() or APQuickResponeForRateUpExecAdapt(). - 3:auto-selection: if mfb changes or timer expires, then send sounding packets <------not finished yet!!! - note: - when = 1 or 3, NO_SNDG_CNT_THRD controls the frequency to update the - matrix(ETXBF_EN_COND=1) or activate the whole bf evaluation process(not defined) -*/ - -/* Defines to include optional code. */ -/* NOTE: Do not define these options. ETxBfEnCond==3 and */ -/* MCS Feedback are not fully implemented */ -/* #define ETXBF_EN_COND3_SUPPORT // Include ETxBfEnCond==3 code */ -/* #define MFB_SUPPORT // Include MCS Feedback code */ - -/* MCS FB definitions */ -#define MSI_TOGGLE_BF 6 -#define TOGGLE_BF_PKTS 5 /* the number of packets with inverted BF status */ - -/* TXBF State definitions */ -#define READY_FOR_SNDG0 \ - 0 /* jump to WAIT_SNDG_FB0 when channel change or periodically */ -#define WAIT_SNDG_FB0 1 /* jump to WAIT_SNDG_FB1 when bf report0 is received */ -#define WAIT_SNDG_FB1 2 -#define WAIT_MFB 3 -#define WAIT_USELESS_RSP 4 -#define WAIT_BEST_SNDG 5 - -#define NO_SNDG_CNT_THRD \ - 0 /* send sndg packet if there is no sounding for (NO_SNDG_CNT_THRD+1)*500msec. If this =0, bf matrix is updated at each call of APMlmeDynamicTxRateSwitchingAdapt() */ - -/* ------------ BEAMFORMING PROFILE HANDLING ------------ */ - -#define IMP_MAX_BYTES 14 /* Implicit: 14 bytes per subcarrier */ -#define IMP_MAX_BYTES_ONE_COL \ - 7 /* Implicit: 7 bytes per subcarrier, when reading first column */ -#define EXP_MAX_BYTES 18 /* Explicit: 18 bytes per subcarrier */ -#define IMP_COEFF_SIZE 9 /* 9 bits/coeff */ -#define IMP_COEFF_MASK 0x1FF - -#define PROFILE_MAX_CARRIERS_20 56 /* Number of subcarriers in 20 MHz mode */ -#define PROFILE_MAX_CARRIERS_40 114 /* Number of subcarriers in 40 MHz mode */ - -/* Indices of valid rows in Implicit and Explicit profiles for 20 and 40 MHz */ -typedef struct { - int lwb1, upb1; - int lwb2, upb2; -} SC_TABLE_ENTRY; - -typedef struct { - BOOLEAN impProfile; - BOOLEAN fortyMHz; - int rows, columns; - int grouping; - UCHAR tag[EXP_MAX_BYTES]; - UCHAR data[PROFILE_MAX_CARRIERS_40][EXP_MAX_BYTES]; -} PROFILE_DATA; - -extern PROFILE_DATA profData; - -typedef struct { -#if defined(RT2883) || defined(RT3883) || defined(RT3593) - UCHAR E0gBeg[2]; - UCHAR E0gEnd[2]; - UCHAR E0aLowBeg[2]; - UCHAR E0aLowEnd[2]; - UCHAR E0aMidBeg[2]; - UCHAR E0aMidEnd[2]; - UCHAR E0aHighBeg[2]; - UCHAR E0aHighEnd[2]; -#endif - -#ifdef MT76x2 - UCHAR E1gBeg; - UCHAR E1gEnd; - UCHAR E1aHighBeg; - UCHAR E1aHighEnd; - UCHAR E1aLowBeg; - UCHAR E1aLowEnd; - UCHAR E1aMidBeg; - UCHAR E1aMidMid; - UCHAR E1aMidEnd; -#endif -} ITXBF_PHASE_PARAMS; /* ITxBF BBP reg phase calibration parameters */ - -typedef struct { -#if defined(RT2883) || defined(RT3883) || defined(RT3593) - UCHAR E0gBeg[2]; - UCHAR E0gEnd[2]; - UCHAR E0aLowBeg[2]; - UCHAR E0aLowEnd[2]; - UCHAR E0aMidBeg[2]; - UCHAR E0aMidEnd[2]; - UCHAR E0aHighBeg[2]; - UCHAR E0aHighEnd[2]; -#endif - -#ifdef MT76x2 - UCHAR E1gBeg[3]; - UCHAR E1gEnd[3]; - UCHAR E1aHighBeg[3]; - UCHAR E1aHighEnd[3]; - UCHAR E1aLowBeg[3]; - UCHAR E1aLowEnd[3]; - UCHAR E1aMidBeg[3]; - UCHAR E1aMidMid[3]; - UCHAR E1aMidEnd[3]; -#endif -} ITXBF_LNA_PARAMS; /* ITxBF BBP reg LNA calibration parameters */ - -typedef struct { -#if defined(RT2883) || defined(RT3883) || defined(RT3593) - UCHAR E0gBeg[2]; - UCHAR E0gEnd[2]; - UCHAR E0aLow[2]; - UCHAR E0aMid[2]; - UCHAR E0aHigh[2]; -#endif - -#ifdef MT76x2 - UCHAR E1gBeg; - UCHAR E1gEnd; - UCHAR E1aHighBeg; - UCHAR E1aHighEnd; - UCHAR E1aLowBeg; - UCHAR E1aLowEnd; - UCHAR E1aMidBeg; - UCHAR E1aMidMid; - UCHAR E1aMidEnd; -#endif -} ITXBF_DIV_PARAMS; /* ITxBF Divider Calibration parameters */ - -void ITxBFGetEEPROM(IN RTMP_ADAPTER *pAd, IN ITXBF_PHASE_PARAMS *phaseParams, - IN ITXBF_LNA_PARAMS *lnaParams, - IN ITXBF_DIV_PARAMS *divParams); - -INT ITxBFDividerCalibration(IN RTMP_ADAPTER *pAd, IN int calFunction, - IN int calMethod, OUT UCHAR *divPhase); - -VOID ITxBFLoadLNAComp(IN RTMP_ADAPTER *pAd); - -int ITxBFLNACalibration(IN RTMP_ADAPTER *pAd, IN int calFunction, - IN int calMethod, IN BOOLEAN gBand); - -void Read_TxBfProfile(IN RTMP_ADAPTER *pAd, IN PROFILE_DATA *prof, - IN int profileNum, IN BOOLEAN implicitProfile); - -void Write_TxBfProfile(IN RTMP_ADAPTER *pAd, IN PROFILE_DATA *prof, - IN int profileNum); - -void Read_TagField(IN PRTMP_ADAPTER pAd, IN UCHAR *row, IN int profileNum); - -/* Write_TagField - write a profile tagfield */ -void Write_TagField(IN RTMP_ADAPTER *pAd, IN UCHAR *row, IN int profileNum); - -/* displayTagfield - display one tagfield */ -void displayTagfield(IN RTMP_ADAPTER *pAd, IN int profileNum, - IN BOOLEAN implicitProfile); - -/* Unpack an ITxBF matrix element from a row of bytes */ -int Unpack_IBFValue(IN UCHAR *row, IN int elemNum); - -int iCalcCalibration(IN RTMP_ADAPTER *pAd, IN int calParams[2], - IN int profileNum); - -void ITxBFSetEEPROM(IN RTMP_ADAPTER *pAd, IN ITXBF_PHASE_PARAMS *phaseParams, - IN ITXBF_LNA_PARAMS *lnaParams, - IN ITXBF_DIV_PARAMS *divParams); - -#endif /* TXBF_SUPPORT // */ - -#endif /* _RT_TXBF_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_udma.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_udma.h deleted file mode 100644 index 346c28d460..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rt_udma.h +++ /dev/null @@ -1,24 +0,0 @@ -/**************************************************************************** - - Module Name: - rt_udma.h - - Abstract: - For Puma6 UDMA implementation. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - Anjan Chanda 05-05-2015 Initial creation - -***************************************************************************/ - -#ifndef __RT_UDMA_H__ -#define __RT_UDMA_H__ - -int mt_udma_pkt_send(VOID *ctx, PNDIS_PACKET pRxPkt); - -int mt_udma_register(VOID *pAd, PNET_DEV main_dev_p); -int mt_udma_unregister(VOID *pAd); - -#endif /* __RT_UDMA_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp.h deleted file mode 100644 index 12563c7a98..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp.h +++ /dev/null @@ -1,11443 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rtmp.h - - Abstract: - Miniport generic portion header file - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - -*/ -#ifndef __RTMP_H__ -#define __RTMP_H__ -#include "common/link_list.h" -#include "common/module.h" -#include "spectrum_def.h" - -#include "rtmp_dot11.h" - -#include "security/sec_cmm.h" - -#ifdef DOT11_SAE_SUPPORT -#include "security/sae_cmm.h" -#include "security/crypt_biginteger.h" -#endif /* DOT11_SAE_SUPPORT */ - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) -#include "icap.h" -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - -#ifdef CONFIG_AP_SUPPORT -#include "ap_autoChSel_cmm.h" -#endif /* CONFIG_AP_SUPPORT */ - -#include "wsc.h" -#ifdef MAT_SUPPORT -#include "mat.h" -#endif /* MAT_SUPPORT */ - -#include "rtmp_chip.h" - -#ifdef DOT11R_FT_SUPPORT -#include "ft_cmm.h" -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT -#include "rrm_cmm.h" -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef CLIENT_WDS -#include "client_wds_cmm.h" -#endif /* CLIENT_WDS */ - -#ifdef FTM_SUPPORT -#include "ftm_cmm.h" -#endif /* FTM_SUPPORT */ - -#ifdef RT_CFG80211_SUPPORT -#include "cfg80211_cmm.h" -#endif /* RT_CFG80211_SUPPORT */ - -#include "rate_ctrl/ra_ctrl.h" - -#ifdef MT_MAC -#ifdef TXBF_SUPPORT -#include "txbf/mt_txbf.h" -#include "txbf/mt_txbf_cal.h" -#endif -#endif - -#ifdef ROUTING_TAB_SUPPORT -#include "routing_tab.h" -#endif /* ROUTING_TAB_SUPPORT */ - -#include "tr.h" - -/* vendor specific ie */ -#include "vendor.h" - -#ifdef IGMP_SNOOP_SUPPORT -#include "ipv6.h" -#endif - -struct _RTMP_RA_LEGACY_TB; - -typedef struct _RTMP_ADAPTER RTMP_ADAPTER; -typedef struct _RTMP_ADAPTER *PRTMP_ADAPTER; -typedef struct _AUTO_CH_CTRL AUTO_CH_CTRL; -typedef struct _AUTO_CH_CTRL *PAUTO_CH_CTRL; - -typedef struct wifi_dev RTMP_WDEV; -typedef struct wifi_dev *PRTMP_WDEV; - -typedef struct _STA_ADMIN_CONFIG STA_ADMIN_CONFIG; -typedef struct _STA_ADMIN_CONFIG *PSTA_ADMIN_CONFIG; -/* typedef struct _RTMP_CHIP_OP RTMP_CHIP_OP; */ -/* typedef struct _RTMP_CHIP_CAP RTMP_CHIP_CAP; */ - -typedef struct _RX_BLK RX_BLK; - -typedef struct _PEER_PROBE_REQ_PARAM PEER_PROBE_REQ_PARAM; -#ifdef BB_SOC -#include "os/bb_soc.h" -#endif - -#include "mcu/mcu.h" - -#ifdef CONFIG_ANDES_SUPPORT -#include "mcu/andes_core.h" -#endif - -#include "radar.h" - -#ifdef CARRIER_DETECTION_SUPPORT -#include "cs.h" -#endif /* CARRIER_DETECTION_SUPPORT */ - -#ifdef MT_DFS_SUPPORT -#include "mt_rdm.h" /* Jelly20150322 */ -#endif - -#ifdef LED_CONTROL_SUPPORT -#include "rt_led.h" -#endif /* LED_CONTROL_SUPPORT */ - -#ifdef CONFIG_ATE -#include "ate.h" -#endif - -#ifdef CONFIG_DOT11U_INTERWORKING -#include "dot11u_interworking.h" -#include "gas.h" -#endif - -#ifdef CONFIG_DOT11V_WNM -#include "dot11v_wnm.h" -#include "wnm.h" -#endif - -#ifdef CONFIG_HOTSPOT -#include "hotspot.h" -#endif - -#ifdef MBO_SUPPORT -#include "mbo.h" -#endif - -#ifdef OCE_SUPPORT -#include "oce.h" -#endif /* OCE_SUPPORT */ - -#ifdef SNIFFER_SUPPORT -#include "sniffer/sniffer.h" -#endif - -#ifdef CONFIG_MAP_SUPPORT -#include "map.h" -#endif - -#ifdef COEX_SUPPORT -#include "mcu/btcoex.h" -#endif /* COEX_SUPPORT */ - -#include "hw_ctrl/cmm_asic.h" - -#include "hw_ctrl/cmm_chip.h" - -#include "rtmp_dmacb.h" - -#include "common/wifi_sys_info.h" -#include "wifi_sys_notify.h" - -#ifdef BACKGROUND_SCAN_SUPPORT -#include "bgnd_scan.h" -#endif /* BACKGROUND_SCAN_SUPPORT */ - -#ifdef SMART_CARRIER_SENSE_SUPPORT -#include "scs.h" -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -#include "cmm_rvr_dbg.h" -#ifdef REDUCE_TCP_ACK_SUPPORT -#include "cmm_tcprack.h" -#endif - -#include "wlan_config/config_export.h" -#include "mgmt/be_export.h" -#include "fsm/fsm_sync.h" - -#ifdef RED_SUPPORT -#include "ra_ac_q_mgmt.h" -#endif -#ifdef FQ_SCH_SUPPORT -#include "fq_qm.h" -#endif - -#include "protocol/protection.h" - -#include "oid_struct.h" - -/* TODO: shiang-6590, remove it after ATE fully re-organized! copy from rtmp_bbp.h */ - -/* Debug log color */ -#define KNRM "\x1B[0m" -#define KRED "\x1B[31m" -#define KGRN "\x1B[32m" -#define KYEL "\x1B[33m" -#define KBLU "\x1B[34m" -#define KMAG "\x1B[35m" -#define KCYN "\x1B[36m" -#define KWHT "\x1B[37m" - -#ifdef ACK_CTS_TIMEOUT_SUPPORT -#define CCK_OFDM_MAX_ACK_TIMEOUT 0xFFFF -#endif - -#ifdef AMPDU_CONF_SUPPORT -#define AGG_AALCR (WF_AGG_BASE + 0x040) /* 0x21240 */ -#define AC0_AGG_LIMIT_MASK (0x3f) -#define AC0_AGG_LIMIT(p) (((p)&0x3f)) -#define AC1_AGG_LIMIT_MASK (0x3f << 8) -#define AC1_AGG_LIMIT(p) (((p)&0x3f) << 8) -#define AC2_AGG_LIMIT_MASK (0x3f << 16) -#define AC2_AGG_LIMIT(p) (((p)&0x3f) << 16) -#define AC3_AGG_LIMIT_MASK (0x3f << 24) -#define AC3_AGG_LIMIT(p) (((p)&0x3f) << 24) - -#define AGG_AALCR1 (WF_AGG_BASE + 0x044) /* 0x21244 */ -#define AC10_AGG_LIMIT_MASK (0x3f) -#define AC10_AGG_LIMIT(p) (((p)&0x3f)) -#define AC11_AGG_LIMIT_MASK (0x3f << 8) -#define AC11_AGG_LIMIT(p) (((p)&0x3f) << 8) -#define AC12_AGG_LIMIT_MASK (0x3f << 16) -#define AC12_AGG_LIMIT(p) (((p)&0x3f) << 16) -#define AC13_AGG_LIMIT_MASK (0x3f << 24) -#define AC13_AGG_LIMIT(p) (((p)&0x3f) << 24) -#endif /* AMPDU_CONF_SUPPORT*/ - -#ifndef MAX_BBP_ID -#ifdef RTMP_RBUS_SUPPORT -/* TODO: for this definition, need to modify it!! */ -/*#define MAX_BBP_ID 255 */ -#define MAX_BBP_ID 200 - -#else -#define MAX_BBP_ID 136 - -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef IGMP_TVM_SUPPORT -/* Switch to enable/disable TVM Igmp Mode from iwpriv command */ -enum { - IGMP_TVM_SWITCH_DISABLE = 0, - IGMP_TVM_SWITCH_ENABLE, - IGMP_TVM_SWITCH_INVAL = 0xFF -}; - -#define IS_IGMP_TVM_MODE_EN(_EnMode) (_EnMode == IGMP_TVM_SWITCH_ENABLE) - -/* This is will come from Dat file, set from WebUI */ -enum { IGMP_TVM_MODE_DISABLE = 0, IGMP_TVM_MODE_ENABLE, IGMP_TVM_MODE_AUTO }; - -/* This will come in TV IE in MGMT frame */ -/* In AUTO Mode, AP Disables its mode (If AP mode = AUTO) if the STA not connected ad Enabled if connected */ -/* Currenlt STA always set AUTO */ -enum { - IGMP_TVM_IE_MODE_AUTO = 0, - IGMP_TVM_IE_MODE_ENABLE, - /* This is only for internal Driver/CR4 to disable the Conversion for STA who do not have TVM_IE */ - IGMP_TVM_IE_MODE_DISABLE -}; -#endif /* IGMP_TVM_SUPPORT */ - -#endif -/* TODO: ---End */ -#define NUM_OF_BITS_IN_BYTE 8 -#define NUM_BITS_IN_ULONG 64 - -#define FW_OWN_POLLING_COUNTER 300 - -#define NON_DEFINED_BSSINFO_IDX 0xff - -#ifdef RTMP_UDMA_SUPPORT -#define UDMA_PORT0 0 -#define UDMA_PORT1 1 -#endif /*RTMP_UDMA_SUPPORT*/ - -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) -#define CHANNEL_SWITCHING_MODE 1 -#define NORMAL_MODE 0 -#endif -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) -#define MOV_AVG_CONST 8 -#define MOV_AVG_CONST_SHIFT 3 -#endif - -/*+++Used for merge MiniportMMRequest() and MiniportDataMMRequest() into one function */ -#define MGMT_USE_QUEUE_FLAG 0x80 -#define MGMT_USE_PS_FLAG 0x40 -/*---Used for merge MiniportMMRequest() and MiniportDataMMRequest() into one function */ -/* The number of channels for per-channel Tx power offset */ - -#define MAXSEQ (0xFFF) - -#define MAX_MCS_SET 16 /* From MCS 0 ~ MCS 15 */ - -#ifdef AIR_MONITOR -#define MAX_NUM_OF_MONITOR_STA 16 -#define MAX_NUM_OF_MONITOR_GROUP 8 /* (MAX_NUM_OF_MONITOR_STA/2) */ -#define MONITOR_MUAR_BASE_INDEX 32 -#define MAX_NUM_PER_GROUP 2 -#endif /* AIR_MONITOR */ - -#define MAX_TXPOWER_ARRAY_SIZE 5 - -#define MAX_EEPROM_BUFFER_SIZE 1024 -#define PS_RETRIEVE_TOKEN 0x76 - -#ifdef DSCP_QOS_MAP_SUPPORT -#define fgDscpQosMapEnable (1 << 4) -enum DSCP_QOS_UPDATE_TYPE { - fgDscpUpdateBssCapability = (1 << 0), - fgUpdateStaDSCPMap = (1 << 1), - fgUpdateDSCPPoolMap = (1 << 2), -}; -#endif - -#define MAX_RXVB_BUFFER_IN_NORMAL 1024 - -extern unsigned char CISCO_OUI[]; -extern UCHAR BaSizeArray[4]; - -extern UCHAR BROADCAST_ADDR[MAC_ADDR_LEN]; -extern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN]; -extern char *CipherName[]; -extern UCHAR SNAP_802_1H[6]; -extern UCHAR SNAP_BRIDGE_TUNNEL[6]; -extern UCHAR EAPOL[2]; -extern UCHAR IPX[2]; -extern UCHAR TPID[]; -extern UCHAR APPLE_TALK[2]; -extern UCHAR OfdmRateToRxwiMCS[]; -extern UCHAR WMM_UP2AC_MAP[8]; - -extern unsigned char RateIdToMbps[]; -extern USHORT RateIdTo500Kbps[]; - -extern UCHAR CipherSuiteWpaNoneTkip[]; -extern UCHAR CipherSuiteWpaNoneTkipLen; - -extern UCHAR CipherSuiteWpaNoneAes[]; -extern UCHAR CipherSuiteWpaNoneAesLen; - -extern UCHAR SsidIe; -extern UCHAR SupRateIe; -extern UCHAR ExtRateIe; - -#ifdef DOT11_N_SUPPORT -extern UCHAR HtCapIe; -extern UCHAR AddHtInfoIe; -extern UCHAR NewExtChanIe; -extern UCHAR BssCoexistIe; -extern UCHAR ExtHtCapIe; -#endif /* DOT11_N_SUPPORT */ -extern UCHAR ExtCapIe; - -extern UCHAR ErpIe; -extern UCHAR DsIe; -extern UCHAR TimIe; -extern UCHAR WpaIe; -extern UCHAR Wpa2Ie; -extern UCHAR IbssIe; -extern UCHAR WapiIe; - -extern UCHAR WPA_OUI[]; -extern UCHAR RSN_OUI[]; -#ifdef DPP_SUPPORT -extern UCHAR DPP_OUI[]; -#endif /* DPP_SUPPORT */ -extern UCHAR WAPI_OUI[]; -extern UCHAR WME_INFO_ELEM[]; -extern UCHAR WME_PARM_ELEM[]; -extern UCHAR RALINK_OUI[]; -#if (defined(WH_EZ_SETUP) || defined(MWDS) || defined(WAPP_SUPPORT)) -extern UCHAR MTK_OUI[]; -#endif -extern UCHAR PowerConstraintIE[]; -#ifdef CUSTOMER_DCC_FEATURE -extern UCHAR FILTER_OUI[]; -#endif - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - -extern struct wifi_fwd_func_table wf_drv_tbl; - -extern UCHAR wf_apcli_active_links; -#endif - -#ifdef RANDOM_PKT_GEN -extern INT32 RandomTxCtrl; -extern UINT32 Qidmapping[16]; -#endif - -#ifdef CSO_TEST_SUPPORT -extern INT32 CsCtrl; -#endif - -/*VLAN (802.1Q) Related*/ -#define TX_VLAN 0 -#define RX_VLAN 1 -#define MASK_CLEAR_PCP 0xFFFF1FFF -#define MASK_CLEAR_VID 0xFFFFF000 -#define MASK_CLEAR_TCI_VID 0xF000 -#define MASK_CLEAR_TCI_PCP 0x1FFF -#define MASK_TCI_VID 0x0FFF -#define MAX_VID 0x0FFF -#define MAX_PCP 7 -#define PCP_LEN 3 -#define CFI_LEN 1 -#define VID_LEN 12 - -#ifdef VLAN_SUPPORT - -/*VLAN (802.1Q) Related*/ -#define TX_VLAN 0 -#define RX_VLAN 1 -#define MASK_CLEAR_PCP 0xFFFF1FFF -#define MASK_CLEAR_VID 0xFFFFF000 -#define MASK_CLEAR_TCI_VID 0xF000 -#define MASK_CLEAR_TCI_PCP 0x1FFF -#define MASK_TCI_VID 0x0FFF -#define MAX_VID 0x0FFF -#define MAX_PCP 7 -#define PCP_LEN 3 -#define CFI_LEN 1 -#define VID_LEN 12 - -/* - VLAN TX Checking Policy : - If the VLAN ID of the pkt is different from the wdev's VLANID - 0 : Drop this pkt (Drop) - 1 : Do nothing (Allow) - 2 : Replace the VLAN ID by the wdev's VLAN ID.(REPLACE VID ) - 3 : Replace the VLAN tag by the wdev's VLAN tag.(REPLACE ALL) -*/ -enum VLAN_TX_Policy { - VLAN_TX_DROP = 0, - VLAN_TX_KEEP_TAG, - VLAN_TX_REPLACE_VID, - VLAN_TX_REPLACE_ALL, - VLAN_TX_ALLOW, - VLAN_TX_POLICY_NUM, -}; -/* - VLAN RX Checking Policy : - If the VLAN ID of the pkt is different from the wdev's VLANID - 0 : Drop this pkt (Drop) - 1 : Remove VLAN Tag (Untag) - 2 : Do nothing (Allow) - 3 : Replace the VID only. (Replace VID) - Insert the VLAN Tag if the ingress pkt is non-vlan - 4 : Replace the VLAN tag by the wdev's VLAN tag (Replace ALL) - Insert the VLAN Tag if the ingress pkt is non-vlan -*/ -enum VLAN_RX_Policy { - VLAN_RX_DROP = 0, - VLAN_RX_UNTAG, - VLAN_RX_ALLOW, - VLAN_RX_REPLACE_VID, - VLAN_RX_REPLACE_ALL, - VLAN_RX_POLICY_NUM, -}; - -#endif /*VLAN_SUPPORT*/ - -struct _RX_BLK; -struct raw_rssi_info; - -typedef struct _UAPSD_INFO { - BOOLEAN bAPSDCapable; -} UAPSD_INFO; - -typedef union _CAPTURE_MODE_PACKET_BUFFER { - struct { - UINT32 BYTE0 : 8; - UINT32 BYTE1 : 8; - UINT32 BYTE2 : 8; - UINT32 BYTE3 : 8; - } field; - UINT32 Value; -} CAPTURE_MODE_PACKET_BUFFER; - -#ifdef APCLI_SUPPORT -#ifdef APCLI_AUTO_CONNECT_SUPPORT -typedef enum _APCLI_CONNECT_SCAN_TYPE { - TRIGGER_SCAN_BY_USER = 0, - TRIGGER_SCAN_BY_DRIVER = 1, -} APCLI_CONNECT_SCAN_TYPE; -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ -#ifdef WSC_AP_SUPPORT -typedef enum _APCLI_WSC_SCAN_TYPE { - TRIGGER_FULL_SCAN = 0, - TRIGGER_PARTIAL_SCAN = 1 -} APCLI_WSC_SCAN_TYPE; - -#endif /* WSC_AP_SUPPORT */ -#endif /* APCLI_SUPPORT */ - -#define SET_FLAG_CONN_IN_PROG(_a, _b) OS_SET_BIT(_a, _b) -#define RESET_FLAG_CONN_IN_PROG(_a, _b) OS_CLEAR_BIT(_a, _b) - -#ifdef AIR_MONITOR -#define RULE_CTL BIT(0) -#define RULE_CTL_OFFSET 0 -#define RULE_MGT BIT(1) -#define RULE_MGT_OFFSET 1 -#define RULE_DATA BIT(2) -#define RULE_DATA_OFFSET 2 -#define RULE_A1 BIT(3) -#define RULE_A1_OFFSET 3 -#define RULE_A2 BIT(4) -#define RULE_A2_OFFSET 4 -#define DEFAULT_MNTR_RULE (RULE_MGT | RULE_DATA | RULE_A1 | RULE_A2) - -typedef enum _MNT_BAND_TYPE { MNT_BAND0 = 1, MNT_BAND1 = 2 } MNT_BAND_TYPE; - -typedef struct _MNT_MUAR_GROUP { - BOOLEAN bValid; - UCHAR Count; - UCHAR Band; - UCHAR MuarGroupBase; -} MNT_MUAR_GROUP, *PMNT_MUAR_GROUP; - -typedef struct _MNT_STA_ENTRY { - BOOLEAN bValid; - UCHAR Band; - UCHAR muar_idx; - UCHAR muar_group_idx; - ULONG Count; - ULONG data_cnt; - ULONG mgmt_cnt; - ULONG cntl_cnt; - UCHAR addr[MAC_ADDR_LEN]; - RSSI_SAMPLE RssiSample; - VOID *pMacEntry; -} MNT_STA_ENTRY, *PMNT_STA_ENTRY; - -typedef struct _HEADER_802_11_4_ADDR { - FRAME_CONTROL FC; - USHORT Duration; - USHORT SN; - UCHAR FN; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; - UCHAR Addr3[MAC_ADDR_LEN]; - UCHAR Addr4[MAC_ADDR_LEN]; -} HEADER_802_11_4_ADDR, *PHEADER_802_11_4_ADDR; - -typedef struct _AIR_RADIO_INFO { - CHAR PHYMODE; - CHAR STREAM; - CHAR MCS; - CHAR BW; - CHAR ShortGI; - ULONG RATE; - CHAR RSSI[4]; - UCHAR Channel; -} AIR_RADIO_INFO, *PAIR_RADIO_INFO; - -typedef struct _AIR_RAW { - AIR_RADIO_INFO wlan_radio_tap; - HEADER_802_11_4_ADDR wlan_header; -} AIR_RAW, *PAIR_RAW; -#endif /* AIR_MONITOR */ - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -enum CH_SWITCH_STATE { - CH_SWITCH_STATE_BASE = 0, - CH_SWITCH_STATE_INIT = CH_SWITCH_STATE_BASE, - CH_SWITCH_STATE_RUNNING, - CH_SWITCH_STATE_MAX -}; -enum CH_SWITCH_MSG { - CH_SWITCH_MSG_LISTEN = 0, - CH_SWITCH_MSG_CANCLE, - CH_SWITCH_MSG_TIMEOUT, - CH_SWITCH_MSG_MAX -}; -#define CH_SWITCH_DFT_LISTEN_TIME 200 -#define CH_SWITCH_FUNC_SIZE 6 /*CH_SWITCH_STATE_MAX * CH_SWITCH_MSG_MAX*/ -struct ch_switch_cfg { - UCHAR channel; - USHORT duration; - BOOLEAN ch_sw_on_going; - INT ioctl_if; - struct wifi_dev *wdev; - RALINK_TIMER_STRUCT ch_sw_timer; - STATE_MACHINE ch_switch_sm; - RTMP_OS_COMPLETION chan_switch_done; - STATE_MACHINE_FUNC ch_switch_state_func[CH_SWITCH_FUNC_SIZE]; -}; -#endif -typedef enum _ENUM_DBDC_MODE_T { - ENUM_SingleBand = 0, - ENUM_DBDC_2G5G = 1, - ENUM_DBDC_5G5G = 2 -} ENUM_DBDC_MODE; - -#ifdef IGMP_SNOOP_SUPPORT -typedef struct _MULTICAST_WHITE_LIST_ENTRY { - BOOLEAN bValid; - UCHAR EntryIPType; - union { - UCHAR IPv4[IPV4_ADDR_LEN]; - UCHAR IPv6[IPV6_ADDR_LEN]; - } IPData; - union { - UINT8 Byte[IPV6_ADDR_LEN]; - UINT32 DWord[IPV6_ADDR_LEN / sizeof(UINT32)]; - } PrefixMask; /* IPv6, Size 128 bits */ - UCHAR PrefixLen; - UCHAR Addr[MAC_ADDR_LEN]; -} MULTICAST_WHITE_LIST_ENTRY, *PMULTICAST_WHITE_LIST_ENTRY; - -typedef struct _MULTICAST_WHITE_LIST_FILTER_TABLE { - UCHAR EntryNum; - MULTICAST_WHITE_LIST_ENTRY EntryTab[MULTICAST_WHITE_LIST_SIZE_MAX]; - NDIS_SPIN_LOCK MulticastWLTabLock; -} MULTICAST_WHITE_LIST_FILTER_TABLE, *PMULTICAST_WHITE_LIST_FILTER_TABLE; -#endif - -/* */ -/* Macros for flag and ref count operations */ -/* */ -#define RTMP_SET_FLAG(_M, _F) ((_M)->Flags |= (_F)) -#define RTMP_CLEAR_FLAG(_M, _F) ((_M)->Flags &= ~(_F)) -#define RTMP_CLEAR_FLAGS(_M) ((_M)->Flags = 0) -#define RTMP_TEST_FLAG(_M, _F) (((_M)->Flags & (_F)) != 0) -#define RTMP_TEST_FLAGS(_M, _F) (((_M)->Flags & (_F)) == (_F)) -/* Macro for power save flag. */ -#define RTMP_SET_PSFLAG(_M, _F) ((_M)->PSFlags |= (_F)) -#define RTMP_CLEAR_PSFLAG(_M, _F) ((_M)->PSFlags &= ~(_F)) -#define RTMP_CLEAR_PSFLAGS(_M) ((_M)->PSFlags = 0) -#define RTMP_TEST_PSFLAG(_M, _F) (((_M)->PSFlags & (_F)) != 0) -#define RTMP_TEST_PSFLAGS(_M, _F) (((_M)->PSFlags & (_F)) == (_F)) - -#define OPSTATUS_SET_FLAG(_pAd, _F) ((_pAd)->CommonCfg.OpStatusFlags |= (_F)) -#define OPSTATUS_CLEAR_FLAG(_pAd, _F) ((_pAd)->CommonCfg.OpStatusFlags &= ~(_F)) -#define OPSTATUS_TEST_FLAG(_pAd, _F) \ - (((_pAd)->CommonCfg.OpStatusFlags & (_F)) != 0) - -#define OPSTATUS_SET_FLAG_WDEV(_Wdev, _F) ((_Wdev)->OpStatusFlags |= (_F)) -#define OPSTATUS_CLEAR_FLAG_WDEV(_Wdev, _F) ((_Wdev)->OpStatusFlags &= ~(_F)) -#define OPSTATUS_TEST_FLAG_WDEV(_Wdev, _F) \ - (((_Wdev)->OpStatusFlags & (_F)) != 0) -#define OPSTATUS_EQUAL_FLAG_WDEV(_Wdev, _F) \ - (((_Wdev)->OpStatusFlags & (_F)) == (_F)) - -#define WIFI_TEST_SET_FLAG(_pAd, _F) ((_pAd)->CommonCfg.WiFiTestFlags |= (_F)) -#define WIFI_TEST_CLEAR_FLAG(_pAd, _F) \ - ((_pAd)->CommonCfg.WiFiTestFlags &= ~(_F)) -#define WIFI_TEST_CHECK_FLAG(_pAd, _F) \ - (((_pAd)->CommonCfg.WiFiTestFlags & (_F)) != 0) - -#define CLIENT_STATUS_SET_FLAG(_pEntry, _F) \ - ((_pEntry)->ClientStatusFlags |= (_F)) -#define CLIENT_STATUS_CLEAR_FLAG(_pEntry, _F) \ - ((_pEntry)->ClientStatusFlags &= ~(_F)) -#define CLIENT_STATUS_TEST_FLAG(_pEntry, _F) \ - (((_pEntry)->ClientStatusFlags & (_F)) != 0) - -#define CLIENT_CAP_SET_FLAG(_pEntry, _F) ((_pEntry)->cli_cap_flags |= (_F)) -#define CLIENT_CAP_CLEAR_FLAG(_pEntry, _F) ((_pEntry)->cli_cap_flags &= ~(_F)) -#define CLIENT_CAP_TEST_FLAG(_pEntry, _F) \ - (((_pEntry)->cli_cap_flags & (_F)) != 0) - -#define RX_FILTER_SET_FLAG(_pAd, _F) ((_pAd)->CommonCfg.PacketFilter |= (_F)) -#define RX_FILTER_CLEAR_FLAG(_pAd, _F) ((_pAd)->CommonCfg.PacketFilter &= ~(_F)) -#define RX_FILTER_TEST_FLAG(_pAd, _F) \ - (((_pAd)->CommonCfg.PacketFilter & (_F)) != 0) - -#define RTMP_SET_MORE_FLAG(_M, _F) ((_M)->MoreFlags |= (_F)) -#define RTMP_TEST_MORE_FLAG(_M, _F) (((_M)->MoreFlags & (_F)) != 0) -#define RTMP_CLEAR_MORE_FLAG(_M, _F) ((_M)->MoreFlags &= ~(_F)) - -#define SET_ASIC_CAP(_pAd, _caps) (hc_set_asic_cap(_pAd->hdev_ctrl, _caps)) -#define IS_ASIC_CAP(_pAd, _caps) \ - ((hc_get_asic_cap(_pAd->hdev_ctrl) & (_caps)) != 0) -#define CLR_ASIC_CAP(_pAd, _caps) (hc_clear_asic_cap(_pAd->hdev_ctrl, _caps)) -#define IS_HIF_TYPE(_pAd, _type) (hc_get_hif_type(_pAd->hdev_ctrl) == _type) -#define GET_HIF_TYPE(_pAd) (hc_get_hif_type(_pAd->hdev_ctrl)) - -#define TX_FLAG_STOP_DEQUEUE \ - (fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS | \ - fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET) - -#define INC_RING_INDEX(_idx, _RingSize) \ - { \ - (_idx) = (_idx + 1) % (_RingSize); \ - } - -#define TR_ENQ_COUNT_INC(tr) \ - { \ - tr->enqCount++; \ - } - -#define TR_ENQ_COUNT_DEC(tr) \ - { \ - tr->enqCount--; \ - } - -#define TR_TOKEN_COUNT_INC(tr, qid) \ - { \ - tr->TokenCount[qid]++; \ - } - -#define TR_TOKEN_COUNT_DEC(tr, qid) \ - { \ - tr->TokenCount[qid]--; \ - } - -#define SQ_ENQ_PS_MAX 32 -#define SQ_ENQ_PSQ_MAX 32 -#define SQ_ENQ_PSQ_TOTAL_MAX 1024 -#define SQ_ENQ_NORMAL_MAX (SQ_ENQ_RESERVE_PERAC * 4) -#define SQ_ENQ_RESERVE_PERAC (2048) -#ifdef PS_QUEUE_INC_SUPPORT -#define DEFAULT_MAX_720P_PS_QUE_PKT_NUM 256 -#define DEFAULT_MIN_STA_NUM_SMALL_PS_QUE_CTL 2 -#define DEFAULT_MIN_720P_NUM_SMALL_PS_QUE_CTL 8 -#endif - -#ifdef USB_BULK_BUF_ALIGMENT -#define CUR_WRITE_IDX_INC(_idx, _RingSize) \ - { \ - (_idx) = (_idx + 1) % (_RingSize); \ - } -#endif /* USB_BULK_BUF_ALIGMENT */ - -/* - Common fragment list structure - Identical to the scatter gather frag list structure -*/ -#define NIC_MAX_PHYS_BUF_COUNT 8 - -typedef struct _RTMP_SCATTER_GATHER_ELEMENT { - PVOID Address; - ULONG Length; - PULONG Reserved; -} RTMP_SCATTER_GATHER_ELEMENT, *PRTMP_SCATTER_GATHER_ELEMENT; - -typedef struct _RTMP_SCATTER_GATHER_LIST { - ULONG NumberOfElements; - PULONG Reserved; - RTMP_SCATTER_GATHER_ELEMENT Elements[NIC_MAX_PHYS_BUF_COUNT]; -} RTMP_SCATTER_GATHER_LIST, *PRTMP_SCATTER_GATHER_LIST; - -typedef struct _MT_MIB_BUCKET_ONE_SEC { - UCHAR Enabled[DBDC_BAND_NUM]; - UINT32 ChannelBusyTime - [DBDC_BAND_NUM]; /* Every second update once. primary channel only*/ - UINT32 ChannelBusyTimeCcaNavTx - [DBDC_BAND_NUM]; /* Every second update once. including CCA NAV TX time*/ - UINT32 OBSSAirtime[DBDC_BAND_NUM]; - UINT32 MyTxAirtime[DBDC_BAND_NUM]; - UINT32 MyRxAirtime[DBDC_BAND_NUM]; - UINT32 EDCCAtime[DBDC_BAND_NUM]; - UINT32 PdCount[DBDC_BAND_NUM]; - UINT32 MdrdyCount[DBDC_BAND_NUM]; -} MT_MIB_BUCKET_ONE_SEC, *PMT_MIB_BUCKET_ONE_SEC; - -typedef struct _MT_MIB_BUCKET_MS { - UCHAR CurIdx; - UCHAR Enabled; - UINT32 ChannelBusyTime[DBDC_BAND_NUM][2]; - UINT32 ChannelBusyTimeCcaNavTx[DBDC_BAND_NUM][2]; - UINT32 OBSSAirtime[DBDC_BAND_NUM][2]; - UINT32 MyTxAirtime[DBDC_BAND_NUM][2]; - UINT32 MyRxAirtime[DBDC_BAND_NUM][2]; - UINT32 EDCCAtime[DBDC_BAND_NUM][2]; - UINT32 PdCount[DBDC_BAND_NUM][2]; - UINT32 MdrdyCount[DBDC_BAND_NUM][2]; -} MT_MIB_BUCKET_MS, *PMT_MIB_BUCKET_MS; - -/* - Some utility macros -*/ -#define GET_LNA_GAIN(_pAd) \ - ((_pAd->LatchRfRegs.Channel <= 14) ? \ - (_pAd->BLNAGain) : \ - ((_pAd->LatchRfRegs.Channel <= 64) ? \ - (_pAd->ALNAGain0) : \ - ((_pAd->LatchRfRegs.Channel <= 128) ? \ - (_pAd->ALNAGain1) : \ - (_pAd->ALNAGain2)))) - -#define INC_COUNTER64(Val) (Val.QuadPart++) - -#define INFRA_ON(_p) (STA_STATUS_TEST_FLAG(_p, fSTA_STATUS_INFRA_ON)) -#define ADHOC_ON(_p) (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_ADHOC_ON)) -#define MONITOR_ON(_p) (((_p)->monitor_ctrl[0].bMonitorOn) == TRUE) -#define IDLE_ON(_pAd, _pStaCfg) (!INFRA_ON(_pStaCfg) && !ADHOC_ON(_pAd)) - -/* Check LEAP & CCKM flags */ -#define LEAP_ON(_p) (((_p)->StaCfg[0].LeapAuthMode) == CISCO_AuthModeLEAP) -#define LEAP_CCKM_ON(_p) \ - ((((_p)->StaCfg[0].LeapAuthMode) == CISCO_AuthModeLEAP) && \ - ((_p)->StaCfg[0].LeapAuthInfo.CCKM == TRUE)) - -/* if orginal Ethernet frame contains no LLC/SNAP, then an extra LLC/SNAP encap is required */ -#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(_pBufVA, _pExtraLlcSnapEncap) \ - { \ - if (((*(_pBufVA + 12) << 8) + *(_pBufVA + 13)) > 1500) { \ - _pExtraLlcSnapEncap = SNAP_802_1H; \ - if (NdisEqualMemory(IPX, _pBufVA + 12, 2) || \ - NdisEqualMemory(APPLE_TALK, _pBufVA + 12, 2)) \ - _pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL; \ - } else \ - _pExtraLlcSnapEncap = NULL; \ - } - -/* New Define for new Tx Path. */ -#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(_pBufVA, _pExtraLlcSnapEncap) \ - { \ - if (((*(_pBufVA) << 8) + *(_pBufVA + 1)) > 1500) { \ - _pExtraLlcSnapEncap = SNAP_802_1H; \ - if (NdisEqualMemory(IPX, _pBufVA, 2) || \ - NdisEqualMemory(APPLE_TALK, _pBufVA, 2)) \ - _pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL; \ - } else \ - _pExtraLlcSnapEncap = NULL; \ - } - -#define MAKE_802_3_HEADER(_buf, _pMac1, _pMac2, _pType) \ - { \ - NdisMoveMemory(_buf, _pMac1, MAC_ADDR_LEN); \ - NdisMoveMemory((_buf + MAC_ADDR_LEN), _pMac2, MAC_ADDR_LEN); \ - NdisMoveMemory((_buf + MAC_ADDR_LEN * 2), _pType, \ - LENGTH_802_3_TYPE); \ - } - -/* - if pData has no LLC/SNAP (neither RFC1042 nor Bridge tunnel), - keep it that way. - else if the received frame is LLC/SNAP-encaped IPX or APPLETALK, - preserve the LLC/SNAP field - else remove the LLC/SNAP field from the result Ethernet frame - - Patch for WHQL only, which did not turn on Netbios but use IPX within its payload - Note: - _pData & _DataSize may be altered (remove 8-byte LLC/SNAP) by this MACRO - _pRemovedLLCSNAP: pointer to removed LLC/SNAP; NULL is not removed -*/ -#define CONVERT_TO_802_3(_p8023hdr, _pDA, _pSA, _pData, _DataSize, \ - _pRemovedLLCSNAP) \ - { \ - char LLC_Len[2]; \ - \ - _pRemovedLLCSNAP = NULL; \ - if (NdisEqualMemory(SNAP_802_1H, _pData, 6) || \ - NdisEqualMemory(SNAP_BRIDGE_TUNNEL, _pData, 6)) { \ - PUCHAR pProto = _pData + 6; \ - \ - if ((NdisEqualMemory(IPX, pProto, 2) || \ - NdisEqualMemory(APPLE_TALK, pProto, 2)) && \ - NdisEqualMemory(SNAP_802_1H, _pData, 6)) { \ - LLC_Len[0] = (UCHAR)(_DataSize >> 8); \ - LLC_Len[1] = (UCHAR)(_DataSize & (256 - 1)); \ - MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, \ - LLC_Len); \ - } else { \ - MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, \ - pProto); \ - _pRemovedLLCSNAP = _pData; \ - _DataSize -= LENGTH_802_1_H; \ - _pData += LENGTH_802_1_H; \ - } \ - } else { \ - LLC_Len[0] = (UCHAR)(_DataSize >> 8); \ - LLC_Len[1] = (UCHAR)(_DataSize & (256 - 1)); \ - MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len); \ - } \ - } - -/* - Enqueue this frame to MLME engine - We need to enqueue the whole frame because MLME need to pass data type - information from 802.11 header -*/ -#if !(defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT)) -#define REPORT_MGMT_FRAME_TO_MLME(_pAd, Wcid, _pFrame, _FrameSize, _Rssi0, \ - _Rssi1, _Rssi2, _Rssi3, _MinSNR, _channel, \ - _OpMode, _wdev, _RxPhyMode) \ - do { \ - struct raw_rssi_info _rssi_info; \ - _rssi_info.raw_rssi[0] = _Rssi0; \ - _rssi_info.raw_rssi[1] = _Rssi1; \ - _rssi_info.raw_rssi[2] = _Rssi2; \ - _rssi_info.raw_rssi[3] = _Rssi3; \ - _rssi_info.raw_snr = _MinSNR; \ - _rssi_info.Channel = _channel; \ - MlmeEnqueueForRecv(_pAd, Wcid, &_rssi_info, _FrameSize, \ - _pFrame, _OpMode, _wdev, _RxPhyMode); \ - } while (0) -#else -#define REPORT_MGMT_FRAME_TO_MLME(_pAd, Wcid, _pFrame, _FrameSize, _Rssi0, \ - _Rssi1, _Rssi2, _Rssi3, _Snr0, _Snr1, _Snr2, \ - _Snr3, _MinSNR, _channel, _OpMode, _wdev, \ - _RxPhyMode) \ - do { \ - struct raw_rssi_info _rssi_info; \ - _rssi_info.raw_rssi[0] = _Rssi0; \ - _rssi_info.raw_rssi[1] = _Rssi1; \ - _rssi_info.raw_rssi[2] = _Rssi2; \ - _rssi_info.raw_rssi[3] = _Rssi3; \ - _rssi_info.raw_Snr[0] = _Snr0; \ - _rssi_info.raw_Snr[1] = _Snr1; \ - _rssi_info.raw_Snr[2] = _Snr2; \ - _rssi_info.raw_Snr[3] = _Snr3; \ - _rssi_info.raw_snr = _MinSNR; \ - _rssi_info.Channel = _channel; \ - MlmeEnqueueForRecv(_pAd, Wcid, &_rssi_info, _FrameSize, \ - _pFrame, _OpMode, _wdev, _RxPhyMode); \ - } while (0) -#endif - -#ifdef OUI_CHECK_SUPPORT -enum { OUI_MGROUP_ACT_JOIN = 0, OUI_MGROUP_ACT_LEAVE = 1 }; -#define MAC_OUI_EQUAL(pAddr1, pAddr2) \ - RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), 4) -#endif /*OUI_CHECK_SUPPORT*/ -#define IPV4_ADDR_EQUAL(pAddr1, pAddr2) \ - RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), 4) -#define IPV6_ADDR_EQUAL(pAddr1, pAddr2) \ - RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), 16) -#define MAC_ADDR_EQUAL(pAddr1, pAddr2) \ - RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), MAC_ADDR_LEN) -#define SSID_EQUAL(ssid1, len1, ssid2, len2) \ - ((len1 == len2) && (RTMPEqualMemory(ssid1, ssid2, len1))) - -#define ONE_SEC_2_US 0xF4240 -#define OBSSAIRTIME_TH 60 -#define RX_MIBTIME_CLR_OFFSET 31 -#define RX_MIBTIME_EN_OFFSET 30 -#define OBSS_OCCUPY_PERCENT_HIGH_TH 40 -#define OBSS_OCCUPY_PERCENT_LOW_TH 40 -#define EDCCA_OCCUPY_PERCENT_TH 40 -#define My_OCCUPY_PERCENT 15 -#define ALL_AIR_OCCUPY_PERCENT 90 -#define TX_RATIO_TH 90 - -#define BAND0_SPE_IDX 0x18 -#define BAND1_SPE_IDX 0x19 - -BOOLEAN MonitorRxRing(struct _RTMP_ADAPTER *pAd); -BOOLEAN MonitorTxRing(struct _RTMP_ADAPTER *pAd); -BOOLEAN MonitorRxPse(struct _RTMP_ADAPTER *pAd); - -/* - Statistic counter structure -*/ -typedef struct _COUNTER_802_3 { - /* General Stats */ - ULONG GoodTransmits; - ULONG GoodReceives; - ULONG TxErrors; - ULONG RxErrors; - ULONG RxNoBuffer; -} COUNTER_802_3, *PCOUNTER_802_3; - -typedef struct _COUNTER_802_11 { - ULONG Length; - /* LARGE_INTEGER LastTransmittedFragmentCount; */ - LARGE_INTEGER TransmittedFragmentCount; - LARGE_INTEGER MulticastTransmittedFrameCount; - LARGE_INTEGER FailedCount; - LARGE_INTEGER RetryCount; - LARGE_INTEGER MultipleRetryCount; - LARGE_INTEGER RTSSuccessCount; - LARGE_INTEGER RTSFailureCount; - LARGE_INTEGER ACKFailureCount; - LARGE_INTEGER FrameDuplicateCount; - LARGE_INTEGER ReceivedFragmentCount; - LARGE_INTEGER MulticastReceivedFrameCount; - LARGE_INTEGER FCSErrorCount; - LARGE_INTEGER TransmittedFrameCount; - LARGE_INTEGER WEPUndecryptableCount; - LARGE_INTEGER TransmitCountFrmOs; -#ifdef OUI_CHECK_SUPPORT - LARGE_INTEGER RxHWLookupWcidErrCount; -#endif -#ifdef MT_MAC - LARGE_INTEGER TxAggRange1Count; - LARGE_INTEGER TxAggRange2Count; - LARGE_INTEGER TxAggRange3Count; - LARGE_INTEGER TxAggRange4Count; - - /* for PER debug */ - LARGE_INTEGER AmpduFailCount; - LARGE_INTEGER AmpduSuccessCount; - /* for PER debug */ - LARGE_INTEGER CurrentBwTxCount; - LARGE_INTEGER OtherBwTxCount; - -#endif /* MT_MAC */ -} COUNTER_802_11, *PCOUNTER_802_11; - -typedef struct _COUNTER_RALINK { - UINT32 OneSecStart; /* for one sec count clear use */ - UINT32 OneSecBeaconSentCnt; - UINT32 OneSecFalseCCACnt; /* CCA error count, for debug purpose, might move to global counter */ - UINT32 OneSecRxFcsErrCnt; /* CRC error */ - UINT32 OneSecRxOkCnt; /* RX without error */ - UINT32 OneSecTxFailCount; - UINT32 OneSecTxNoRetryOkCount; - UINT32 OneSecTxRetryOkCount; - UINT32 OneSecRxOkDataCnt; /* unicast-to-me DATA frame count */ - UINT32 OneSecTransmittedByteCount; /* both successful and failure, used to calculate TX throughput */ - - ULONG *OneSecOsTxCount; - ULONG *OneSecDmaDoneCount; - UINT32 OneSecTxDoneCount; - ULONG OneSecRxCount; - UINT32 OneSecReceivedByteCount; - UINT32 OneSecTxARalinkCnt; /* Tx Ralink Aggregation frame cnt */ - UINT32 OneSecRxARalinkCnt; /* Rx Ralink Aggregation frame cnt */ - UINT32 OneSecEnd; /* for one sec count clear use */ - - ULONG TransmittedByteCount; /* both successful and failure, used to calculate TX throughput */ - ULONG ReceivedByteCount; /* both CRC okay and CRC error, used to calculate RX throughput */ - ULONG BadCQIAutoRecoveryCount; - ULONG PoorCQIRoamingCount; - ULONG MgmtRingFullCount; - ULONG RxCountSinceLastNULL; - ULONG RxCount; - ULONG KickTxCount; - LARGE_INTEGER RealFcsErrCount; - ULONG PendingNdisPacketCount; - ULONG FalseCCACnt; /* CCA error count */ - - UINT32 LastOneSecTotalTxCount; /* OneSecTxNoRetryOkCount + OneSecTxRetryOkCount + OneSecTxFailCount */ - UINT32 LastOneSecRxOkDataCnt; /* OneSecRxOkDataCnt */ - ULONG DuplicateRcv; - ULONG TxAggCount; - ULONG TxNonAggCount; - ULONG TxAgg1MPDUCount; - ULONG TxAgg2MPDUCount; - ULONG TxAgg3MPDUCount; - ULONG TxAgg4MPDUCount; - ULONG TxAgg5MPDUCount; - ULONG TxAgg6MPDUCount; - ULONG TxAgg7MPDUCount; - ULONG TxAgg8MPDUCount; - ULONG TxAgg9MPDUCount; - ULONG TxAgg10MPDUCount; - ULONG TxAgg11MPDUCount; - ULONG TxAgg12MPDUCount; - ULONG TxAgg13MPDUCount; - ULONG TxAgg14MPDUCount; - ULONG TxAgg15MPDUCount; - ULONG TxAgg16MPDUCount; - - LARGE_INTEGER TxAMSDUCount; - LARGE_INTEGER RxAMSDUCount; - LARGE_INTEGER TransmittedAMPDUCount; - LARGE_INTEGER TransmittedMPDUsInAMPDUCount; - LARGE_INTEGER TransmittedOctetsInAMPDUCount; - LARGE_INTEGER MPDUInReceivedAMPDUCount; - - ULONG PhyErrCnt; - ULONG PlcpErrCnt; -} COUNTER_RALINK, *PCOUNTER_RALINK; - -typedef struct _COUNTER_DRS { - /* to record the each TX rate's quality. 0 is best, the bigger the worse. */ - USHORT TxQuality[MAX_TX_RATE_INDEX + 1]; - UCHAR PER[MAX_TX_RATE_INDEX + 1]; - UCHAR TxRateUpPenalty; /* extra # of second penalty due to last unstable condition */ - /*BOOLEAN fNoisyEnvironment; */ - BOOLEAN fLastSecAccordingRSSI; - UCHAR LastSecTxRateChangeAction; /* 0: no change, 1:rate UP, 2:rate down */ - UCHAR LastTimeTxRateChangeAction; /*Keep last time value of LastSecTxRateChangeAction */ - ULONG LastTxOkCount; -} COUNTER_DRS, *PCOUNTER_DRS; - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT -typedef struct _COUNTER_TXBF { - ULONG TxSuccessCount; - ULONG TxRetryCount; - ULONG TxFailCount; - ULONG ETxSuccessCount; - ULONG ETxRetryCount; - ULONG ETxFailCount; - ULONG ITxSuccessCount; - ULONG ITxRetryCount; - ULONG ITxFailCount; -} COUNTER_TXBF; -#endif /* TXBF_SUPPORT */ -#endif /* DOT11_N_SUPPORT */ - -#ifdef STREAM_MODE_SUPPORT -typedef struct _STREAM_MODE_ENTRY_ { -#define STREAM_MODE_STATIC 1 - USHORT flag; - UCHAR macAddr[MAC_ADDR_LEN]; -} STREAM_MODE_ENTRY; -#endif /* STREAM_MODE_SUPPORT */ - -/* for Microwave oven */ -#ifdef MICROWAVE_OVEN_SUPPORT -typedef struct _MO_CFG_STRUCT { - BOOLEAN bEnable; - UINT8 nPeriod_Cnt; /* measurement period 100ms, mitigate the interference period 900 ms */ - UINT16 nFalseCCACnt; - UINT16 nFalseCCATh; /* default is 100 */ -} MO_CFG_STRUCT, *PMO_CFG_STRUCT; -#endif /* MICROWAVE_OVEN_SUPPORT */ - -/* TODO: need to integrate with MICROWAVE_OVEN_SUPPORT */ -#ifdef DYNAMIC_VGA_SUPPORT -/* for dynamic vga */ -typedef struct _LNA_VGA_CTL_STRUCT { - BOOLEAN bEnable; - BOOLEAN bDyncVgaEnable; - UINT8 nPeriod_Cnt; /* measurement period 100ms, mitigate the interference period 900 ms */ - UINT16 nFalseCCACnt; - UINT16 nFalseCCATh; /* default is 100 */ - UINT16 nLowFalseCCATh; - UCHAR agc_vga_init_0; - UCHAR agc_vga_ori_0; /* the original vga gain initialized by firmware at start up */ - UINT16 agc_0_vga_set1_2; - UCHAR agc_vga_init_1; - UCHAR agc_vga_ori_1; /* the original vga gain initialized by firmware at start up */ - UINT16 agc_1_vga_set1_2; -} LNA_VGA_CTL_STRUCT, *PLNA_VGA_CTL_STRUCT; -#endif /* DYNAMIC_VGA_SUPPORT */ - -/*************************************************************************** - * security key related data structure - **************************************************************************/ - -/* structure to define WPA Group Key Rekey Interval */ -typedef struct GNU_PACKED _RT_802_11_WPA_REKEY { - ULONG ReKeyMethod; /* mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based */ - ULONG ReKeyInterval; /* time-based: seconds, packet-based: kilo-packets */ -} RT_WPA_REKEY, *PRT_WPA_REKEY, RT_802_11_WPA_REKEY, *PRT_802_11_WPA_REKEY; - -typedef struct { - UCHAR Addr[MAC_ADDR_LEN]; - UCHAR ErrorCode[2]; /*00 01-Invalid authentication type */ - /*00 02-Authentication timeout */ - /*00 03-Challenge from AP failed */ - /*00 04-Challenge to AP failed */ - BOOLEAN Reported; -} ROGUEAP_ENTRY, *PROGUEAP_ENTRY; - -typedef struct { - UCHAR RogueApNr; - ROGUEAP_ENTRY RogueApEntry[MAX_LEN_OF_BSS_TABLE]; -} ROGUEAP_TABLE, *PROGUEAP_TABLE; - -/* - * Fragment Frame structure - */ -typedef struct _FRAGMENT_FRAME { - PNDIS_PACKET pFragPacket; - ULONG RxSize; - USHORT Sequence; - USHORT LastFrag; - ULONG Flags; /* Some extra frame information. bit 0: LLC presented */ - BOOLEAN Header_802_3; -} FRAGMENT_FRAME, *PFRAGMENT_FRAME; - -/* - Tkip Key structure which RC4 key & MIC calculation -*/ -typedef struct _TKIP_KEY_INFO { - UINT nBytesInM; /* # bytes in M for MICKEY */ - UINT32 IV16; - UINT32 IV32; - UINT32 K0; /* for MICKEY Low */ - UINT32 K1; /* for MICKEY Hig */ - UINT32 L; /* Current state for MICKEY */ - UINT32 R; /* Current state for MICKEY */ - UINT32 M; /* Message accumulator for MICKEY */ - UCHAR RC4KEY[16]; - UCHAR MIC[8]; -} TKIP_KEY_INFO, *PTKIP_KEY_INFO; - -/* - Private / Misc data, counters for driver internal use -*/ -typedef struct __PRIVATE_STRUC { - /* Tx ring full occurrance number */ - UINT TxRingFullCnt; - /* Tkip stuff */ - TKIP_KEY_INFO Tx; - TKIP_KEY_INFO Rx; -} PRIVATE_STRUC, *PPRIVATE_STRUC; - -/*************************************************************************** - * Channel and BBP related data structures - **************************************************************************/ -/* structure to tune BBP R66 (BBP TUNING) */ -typedef struct _BBP_R66_TUNING { - BOOLEAN bEnable; - USHORT FalseCcaLowerThreshold; /* default 100 */ - USHORT FalseCcaUpperThreshold; /* default 512 */ - UCHAR R66Delta; - UCHAR R66CurrentValue; - BOOLEAN R66LowerUpperSelect; /*Before LinkUp, Used LowerBound or UpperBound as R66 value. */ -} BBP_R66_TUNING, *PBBP_R66_TUNING; - -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 -#define EFFECTED_CH_SECONDARY 0x1 -#define EFFECTED_CH_PRIMARY 0x2 -#define EFFECTED_CH_LEGACY 0x4 -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - -/* structure to store channel TX power */ -typedef struct _CHANNEL_TX_POWER { - USHORT RemainingTimeForUse; /*unit: sec */ - UCHAR Channel; -#ifdef DOT11N_DRAFT3 - BOOLEAN bEffectedChannel; /* For BW 40 operating in 2.4GHz , the "effected channel" is the channel that is covered in 40Mhz. */ -#endif /* DOT11N_DRAFT3 */ - CHAR Power; - CHAR Power2; - UCHAR MaxTxPwr; - UCHAR DfsReq; - UCHAR RegulatoryDomain; - - /* - Channel property: - - CHANNEL_DISABLED: The channel is disabled. - CHANNEL_PASSIVE_SCAN: Only passive scanning is allowed. - CHANNEL_NO_IBSS: IBSS is not allowed. - CHANNEL_RADAR: Radar detection is required. - CHANNEL_NO_FAT_ABOVE: Extension channel above this channel is not allowed. - CHANNEL_NO_FAT_BELOW: Extension channel below this channel is not allowed. - CHANNEL_40M_CAP: 40 BW channel group - CHANNEL_80M_CAP: 800 BW channel group - */ -#define CHANNEL_DEFAULT_PROP 0x00 -#define CHANNEL_DISABLED 0x01 /* no use */ -#define CHANNEL_PASSIVE_SCAN 0x02 -#define CHANNEL_NO_IBSS 0x04 -#define CHANNEL_RADAR 0x08 -#define CHANNEL_NO_FAT_ABOVE 0x10 -#define CHANNEL_NO_FAT_BELOW 0x20 -#define CHANNEL_40M_CAP 0x40 -#define CHANNEL_80M_CAP 0x80 -#define CHANNEL_160M_CAP 0x100 - - UINT Flags; -} CHANNEL_TX_POWER, *PCHANNEL_TX_POWER; - -typedef enum { - CH_LIST_STATE_NONE = 0, - CH_LIST_STATE_DONE, -} CH_LIST_STATE; - -typedef struct _CHANNEL_CTRL { - CHANNEL_TX_POWER ChList - [MAX_NUM_OF_CHANNELS]; /* list all supported channels for site survey */ - UCHAR ChListNum; /* number of channel in ChannelList[] */ - /* Channel Group*/ - UCHAR ChGrpABandEn; - UCHAR ChGrpABandChList[MAX_NUM_OF_CHANNELS]; - UCHAR ChGrpABandChNum; - CH_LIST_STATE ChListStat; /* State of channel list, 0: None, 1: Done */ -} CHANNEL_CTRL, *PCHANNEL_CTRL; -/* Channel list subset */ -typedef struct _CHANNEL_LIST_SUB { - UCHAR Channel; - UCHAR IdxMap; /* Index mapping to original channel list */ -} CHANNEL_LIST_SUB, *PCHANNEL_LIST_SUB; - -typedef struct _SOFT_RX_ANT_DIVERSITY_STRUCT { - UCHAR EvaluatePeriod; /* 0:not evalute status, 1: evaluate status, 2: switching status */ - UCHAR EvaluateStableCnt; - UCHAR Pair1PrimaryRxAnt; /* 0:Ant-E1, 1:Ant-E2 */ - UCHAR Pair1SecondaryRxAnt; /* 0:Ant-E1, 1:Ant-E2 */ - SHORT Pair1LastAvgRssi; /* */ - SHORT Pair2LastAvgRssi; /* */ - ULONG RcvPktNumWhenEvaluate; - BOOLEAN FirstPktArrivedWhenEvaluate; -#ifdef CONFIG_AP_SUPPORT - LONG Pair1AvgRssiGroup1[2]; - LONG Pair1AvgRssiGroup2[2]; - ULONG RcvPktNum[2]; -#endif /* CONFIG_AP_SUPPORT */ -} SOFT_RX_ANT_DIVERSITY, *PSOFT_RX_ANT_DIVERSITY; - -typedef enum _ABGBAND_STATE_ { - UNKNOWN_BAND, - BG_BAND, - A_BAND, -} ABGBAND_STATE; - -/*************************************************************************** - * structure for MLME state machine - **************************************************************************/ -typedef struct _MLME_STRUCT { - STATE_MACHINE_FUNC ActFunc[ACT_FUNC_SIZE]; - /* Action */ - STATE_MACHINE ActMachine; - -#ifdef WSC_INCLUDED - STATE_MACHINE WscMachine; - STATE_MACHINE_FUNC WscFunc[WSC_FUNC_SIZE]; - -#endif /* WSC_INCLUDED */ - -#ifdef CONFIG_HOTSPOT - STATE_MACHINE HSCtrlMachine; - STATE_MACHINE_FUNC HSCtrlFunc[GAS_FUNC_SIZE]; -#endif - -#ifdef CONFIG_DOT11U_INTERWORKING - STATE_MACHINE GASMachine; - STATE_MACHINE_FUNC GASFunc[GAS_FUNC_SIZE]; -#endif - -#ifdef DOT11K_RRM_SUPPORT -#ifdef CONFIG_11KV_API_SUPPORT - STATE_MACHINE BCNMachine; - STATE_MACHINE_FUNC BCNFunc[BCN_FUNC_SIZE]; - STATE_MACHINE NRMachine; - STATE_MACHINE_FUNC NRFunc[NR_FUNC_SIZE]; -#endif -#endif - -#ifdef CONFIG_DOT11V_WNM - STATE_MACHINE BTMMachine; - STATE_MACHINE_FUNC BTMFunc[BTM_FUNC_SIZE]; - STATE_MACHINE WNMNotifyMachine; - STATE_MACHINE_FUNC WNMNotifyFunc[WNM_NOTIFY_FUNC_SIZE]; -#endif - -#ifdef CONFIG_AP_SUPPORT - /* AP state machines */ - STATE_MACHINE ApAssocMachine; - STATE_MACHINE ApAuthMachine; - STATE_MACHINE ApSyncMachine; - STATE_MACHINE_FUNC ApAssocFunc[AP_ASSOC_FUNC_SIZE]; - /* STATE_MACHINE_FUNC ApDlsFunc[DLS_FUNC_SIZE]; */ - STATE_MACHINE_FUNC ApAuthFunc[AP_AUTH_FUNC_SIZE]; - STATE_MACHINE_FUNC ApSyncFunc[AP_SYNC_FUNC_SIZE]; -#ifdef APCLI_SUPPORT - STATE_MACHINE ApCliAuthMachine; - STATE_MACHINE ApCliAssocMachine; - STATE_MACHINE ApCliCtrlMachine; - STATE_MACHINE ApCliSyncMachine; - STATE_MACHINE ApCliWpaPskMachine; - - STATE_MACHINE_FUNC ApCliAuthFunc[APCLI_AUTH_FUNC_SIZE]; - STATE_MACHINE_FUNC ApCliAssocFunc[APCLI_ASSOC_FUNC_SIZE]; - STATE_MACHINE_FUNC ApCliCtrlFunc[APCLI_CTRL_FUNC_SIZE]; - STATE_MACHINE_FUNC ApCliSyncFunc[APCLI_SYNC_FUNC_SIZE]; -#endif /* APCLI_SUPPORT */ - ULONG ChannelQuality; /* 0..100, Channel Quality Indication for Roaming */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef WDS_SUPPORT - STATE_MACHINE WdsMachine; - STATE_MACHINE_FUNC WdsFunc[WDS_FUNC_SIZE]; -#endif - /* common WPA state machine */ - STATE_MACHINE WpaMachine; - STATE_MACHINE_FUNC WpaFunc[WPA_FUNC_SIZE]; - - ULONG Now32; /* latch the value of NdisGetSystemUpTime() */ - ULONG LastSendNULLpsmTime; - - BOOLEAN bRunning; - BOOLEAN suspend; - NDIS_SPIN_LOCK TaskLock; - MLME_QUEUE Queue; -#ifdef MLME_MULTI_QUEUE_SUPPORT - BOOLEAN MultiQEnable; - MLME_HP_QUEUE HPQueue; - MLME_LP_QUEUE LPQueue; -#endif /*MLME_MULTI_QUEUE_SUPPORT */ - /*used for record jiffies than define as ULONG*/ - ULONG ShiftReg; - -#ifdef BT_COEXISTENCE_SUPPORT - RALINK_TIMER_STRUCT MiscDetectTimer; -#endif /* BT_COEXISTENCE_SUPPORT */ - RALINK_TIMER_STRUCT PeriodicTimer; - RALINK_TIMER_STRUCT APSDPeriodicTimer; - - RALINK_TIMER_STRUCT LinkUpTimer; -#ifdef RTMP_MAC_PCI - UCHAR bPsPollTimerRunning; - RALINK_TIMER_STRUCT PsPollTimer; - RALINK_TIMER_STRUCT RadioOnOffTimer; -#endif /* RTMP_MAC_PCI */ - ULONG PeriodicRound; - ULONG GPIORound; - ULONG OneSecPeriodicRound; - - UCHAR RealRxPath; - BOOLEAN bLowThroughput; - BOOLEAN bEnableAutoAntennaCheck; - RALINK_TIMER_STRUCT RxAntEvalTimer; - -#ifdef CONFIG_MULTI_CHANNEL - - BOOLEAN bStartMcc; - BOOLEAN bpkt_dbg; - - UINT32 channel_1st_staytime; - UINT32 channel_2nd_staytime; - UINT32 switch_idle_time; - UINT32 null_frame_count; - - UINT32 channel_1st_bw; - UINT32 channel_2nd_bw; - UINT32 channel_1st_primary_ch; - UINT32 channel_2nd_primary_ch; - UINT32 channel_1st_center_ch; - UINT32 channel_2nd_center_ch; - - ULONG BeaconNow32; /* latch the value of NdisGetSystemUpTime() */ -#endif /* CONFIG_MULTI_CHANNEL */ - BOOLEAN bStartScc; - struct notify_entry wsys_ne; -} MLME_STRUCT, *PMLME_STRUCT; - -#ifdef DOT11_N_SUPPORT -/*************************************************************************** - * 802.11 N related data structures - **************************************************************************/ -struct reordering_mpdu; - -struct reordering_list { - struct reordering_mpdu *next; - struct reordering_mpdu *tail; - int qlen; -}; - -struct reordering_mpdu { - struct reordering_mpdu *next; - struct reordering_list AmsduList; - PNDIS_PACKET pPacket; /* coverted to 802.3 frame */ - int Sequence; /* sequence number of MPDU */ - BOOLEAN bAMSDU; - UCHAR OpMode; -}; - -struct reordering_mpdu_pool { - PVOID mem; - NDIS_SPIN_LOCK lock; - struct reordering_list freelist; -}; - -typedef enum _REC_BLOCKACK_STATUS { - Recipient_NONE = 0, - Recipient_USED, - Recipient_HandleRes, - Recipient_Initialization, - Recipient_Established -} REC_BLOCKACK_STATUS, - *PREC_BLOCKACK_STATUS; - -typedef enum _ORI_BLOCKACK_STATUS { - Originator_NONE = 0, - Originator_USED, - Originator_WaitRes, - Originator_Done -} ORI_BLOCKACK_STATUS, - *PORI_BLOCKACK_STATUS; - -typedef struct _BA_ORI_ENTRY { - UCHAR Wcid; - UCHAR TID; - UCHAR BAWinSize; - UCHAR Token; - UCHAR amsdu_cap; - /* Sequence is to fill every outgoing QoS DATA frame's sequence field in 802.11 header. */ - USHORT Sequence; - USHORT TimeOutValue; - ORI_BLOCKACK_STATUS ORI_BA_Status; - RALINK_TIMER_STRUCT ORIBATimer; - PVOID pAdapter; -} BA_ORI_ENTRY, *PBA_ORI_ENTRY; - -typedef struct _BA_REC_ENTRY { - BOOLEAN check_amsdu_miss ____cacheline_aligned; - UINT8 PreviousAmsduState; - UINT16 PreviousSN; - UINT16 PreviousReorderCase; - REC_BLOCKACK_STATUS REC_BA_Status; - USHORT LastIndSeq; - NDIS_SPIN_LOCK RxReRingLock; /* Rx Ring spinlock */ - UCHAR BAWinSize; /* 7.3.1.14. each buffer is capable of holding a max AMSDU or MSDU. */ - ULONG LastIndSeqAtTimer; - ULONG nDropPacket; - struct reordering_list list; - struct reordering_mpdu *CurMpdu; -#define STEP_ONE 0 -#define REPEAT 1 -#define OLDPKT 2 -#define WITHIN 3 -#define SURPASS 4 - UCHAR Wcid; - UCHAR TID; - USHORT TimeOutValue; - RALINK_TIMER_STRUCT RECBATimer; - PVOID pAdapter; -} BA_REC_ENTRY, *PBA_REC_ENTRY; - -typedef struct { - ULONG numAsRecipient; /* I am recipient of numAsRecipient clients. These client are in the BARecEntry[] */ - ULONG numAsOriginator; /* I am originator of numAsOriginator clients. These clients are in the BAOriEntry[] */ - ULONG numDoneOriginator; /* count Done Originator sessions */ - BA_ORI_ENTRY BAOriEntry[MAX_LEN_OF_BA_ORI_TABLE]; - BA_REC_ENTRY BARecEntry[MAX_LEN_OF_BA_REC_TABLE]; - BOOLEAN ba_timeout_check; -#define BA_TIMEOUT_BITMAP_LEN (MAX_LEN_OF_BA_REC_TABLE / 32) - UINT32 ba_timeout_bitmap[BA_TIMEOUT_BITMAP_LEN]; -} BA_TABLE, *PBA_TABLE; - -/*For QureyBATableOID use; */ -typedef struct GNU_PACKED _OID_BA_REC_ENTRY { - UCHAR MACAddr[MAC_ADDR_LEN]; - UCHAR BaBitmap; /* if (BaBitmap&(1<> 3) + 1) /* /8 + 1 */ - -enum BCN_TX_STATE { - BCN_TX_UNINIT = 0, - BCN_TX_IDLE = 1, - BCN_TX_WRITE_TO_DMA = 2, - BCN_TX_DMA_DONE = 3 -}; - -typedef enum { - PHY_IDLE = 0, - PHY_INUSE = 1, - PHY_RADIOOFF = 2, -} PHY_STATUS; - -#ifdef MT_MAC -typedef struct _TIM_BUF_STRUCT { - BOOLEAN bTimSntReq; /* used in if beacon send or stop */ - UCHAR TimBufIdx; - PNDIS_PACKET TimPkt; - /* PNDIS_PACKET TimPkt2; */ -} TIM_BUF_STRUC; - -INT wdev_tim_buf_init(RTMP_ADAPTER *pAd, TIM_BUF_STRUC *tim_info); -#endif - -typedef struct _BCN_BUF_STRUCT { - BOOLEAN bBcnSntReq; /* used in if beacon send or stop */ -#ifdef RT_CFG80211_SUPPORT - UCHAR BcnBufIdx; /* this value with meaning for RT chip only */ -#endif - enum BCN_TX_STATE - bcn_state; /* Make sure if no packet pending in the Hardware */ - PNDIS_PACKET BeaconPkt; - UCHAR cap_ie_pos; - struct wifi_dev *pWdev; /* point to associated wdev.*/ - - UCHAR TimBitmaps[WLAN_MAX_NUM_OF_TIM]; - UINT16 TimIELocationInBeacon; -#ifdef MT_MAC - TIM_BUF_STRUC tim_buf; - UCHAR TimIELocationInTim; -#endif /* MT_MAC */ - - UINT16 CsaIELocationInBeacon; - - NDIS_SPIN_LOCK BcnContentLock; - UCHAR BcnUpdateMethod; -} BCN_BUF_STRUC; - -#ifdef DOT11N_DRAFT3 -typedef enum _BSS2040COEXIST_FLAG { - BSS_2040_COEXIST_DISABLE = 0, - BSS_2040_COEXIST_TIMER_FIRED = 1, - BSS_2040_COEXIST_INFO_SYNC = 2, - BSS_2040_COEXIST_INFO_NOTIFY = 4, -} BSS2040COEXIST_FLAG; - -typedef struct _BssCoexChRange_ { - UCHAR primaryCh; - UCHAR secondaryCh; - UCHAR effectChStart; - UCHAR effectChEnd; -} BSS_COEX_CH_RANGE; -#endif /* DOT11N_DRAFT3 */ - -#define IS_VHT_STA(_pMacEntry) (_pMacEntry->MaxHTPhyMode.field.MODE == MODE_VHT) -#define IS_HT_STA(_pMacEntry) \ - (_pMacEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX) - -#define IS_HT_RATE(_pMacEntry) (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX) - -#ifdef DOT11_VHT_AC -#define IS_VHT_RATE(_pMacEntry) (_pMacEntry->HTPhyMode.field.MODE == MODE_VHT) -#endif -#define PEER_IS_HT_RATE(_pMacEntry) \ - (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX) - -#endif /* DOT11_N_SUPPORT */ - -/*This structure is for all 802.11n card InterOptibilityTest action. Reset all Num every n second. (Details see MLMEPeriodic) */ -typedef struct _IOT_STRUC { - BOOLEAN bRTSLongProtOn; -} IOT_STRUC; - -/* This is the registry setting for 802.11n transmit setting. Used in advanced page. */ -typedef union _REG_TRANSMIT_SETTING { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 rsv : 13; - UINT32 EXTCHA : 2; - UINT32 HTMODE : 1; - UINT32 TRANSNO : 2; - UINT32 STBC : 1; /*SPACE */ - UINT32 ShortGI : 1; - UINT32 TxBF : 1; /* 3*3 */ - UINT32 ITxBfEn : 1; - UINT32 rsv0 : 10; - /*UINT32 MCS:7; // MCS */ - /*UINT32 PhyMode:4; */ - } field; -#else - struct { - /*UINT32 PhyMode:4; */ - /*UINT32 MCS:7; // MCS */ - UINT32 rsv0 : 10; - UINT32 ITxBfEn : 1; - UINT32 TxBF : 1; - UINT32 ShortGI : 1; - UINT32 STBC : 1; /*SPACE */ - UINT32 TRANSNO : 2; - UINT32 HTMODE : 1; - UINT32 EXTCHA : 2; - UINT32 rsv : 13; - } field; -#endif - UINT32 word; -} REG_TRANSMIT_SETTING; - -typedef union _DESIRED_TRANSMIT_SETTING { -#ifdef RT_BIG_ENDIAN - struct { - USHORT rsv : 2; - USHORT FixedTxMode : 3; /* If MCS isn't AUTO, fix rate in CCK, OFDM, HT or VHT mode. */ - USHORT PhyMode : 4; - USHORT MCS : 7; /* MCS */ - } field; -#else - struct { - USHORT MCS : 7; - USHORT PhyMode : 4; - USHORT FixedTxMode : 3; - USHORT rsv : 2; - } field; -#endif - USHORT word; -} DESIRED_TRANSMIT_SETTING; - -struct hw_setting { - CHAR lan_gain; -}; - -/** @ingroup wifi_dev_system */ -enum WDEV_TYPE { - WDEV_TYPE_AP = (1 << 0), - WDEV_TYPE_STA = (1 << 1), - WDEV_TYPE_ADHOC = (1 << 2), - WDEV_TYPE_WDS = (1 << 3), - WDEV_TYPE_MESH = (1 << 4), - WDEV_TYPE_GO = (1 << 5), - WDEV_TYPE_GC = (1 << 6), - WDEV_TYPE_APCLI = (1 << 7), - WDEV_TYPE_REPEATER = (1 << 8), - WDEV_TYPE_P2P_DEVICE = (1 << 9), - WDEV_TYPE_TDLS = (1 << 10), -}; - -#define WDEV_WITH_BCN_ABILITY(_wdev) \ - (((_wdev)->wdev_type == WDEV_TYPE_AP) || \ - ((_wdev)->wdev_type == WDEV_TYPE_GO) || \ - ((_wdev)->wdev_type == WDEV_TYPE_MESH)) - -enum BSS_INFO_DRIVER_MAINTIAN_STATE { - BSS_INFO_INIT = 0, - BSS_INFO_SEND_ENABLE = 1, - BSS_INFO_SEND_DISABLE = 2, -}; - -enum MSDU_FORBID_REASON { - MSDU_FORBID_CONNECTION_NOT_READY = 0, - MSDU_FORBID_CHANNEL_MISMATCH = 1, -}; - -#define FLG_IS_OUTPUT 1 -#define FLAG_IS_INPUT 0 -#define MSDU_FORBID_SET(_wdev, _reason) \ - (OS_SET_BIT(_reason, &((_wdev)->forbid_data_tx))) -#define MSDU_FORBID_CLEAR(_wdev, _reason) \ - (OS_CLEAR_BIT(_reason, &((_wdev)->forbid_data_tx))) - -typedef struct _RX_TA_TID_SEQ_MAPPING { - UINT8 RxDWlanIdx; - UINT8 MuarIdx; - UINT16 TID_SEQ[8]; - UINT8 LatestTID; -} RX_TA_TID_SEQ_MAPPING, *PRX_TA_TID_SEQ_MAPPING; - -typedef struct _RX_TRACKING_T { - RX_TA_TID_SEQ_MAPPING LastRxWlanIdx; - UINT32 TriggerNum; -} RX_TRACKING_T, *PRX_TRACKING_T; - -struct _TX_BLK; - -#ifdef IGMP_TVM_SUPPORT -typedef struct _MULTICAST_BLACK_LIST_ENTRY { - BOOLEAN bValid; /* True or False */ - UCHAR EntryIPType; /* IPv4 or IPv6 */ - BOOLEAN bStatic; /* Specifies it as static or dynamic */ - union { - UCHAR IPv4[IPV4_ADDR_LEN]; - UCHAR IPv6[IPV6_ADDR_LEN]; - } IPData; - union { - UINT8 Byte[sizeof(UINT32) * 4]; - UINT32 DWord[sizeof(UINT32)]; - } PrefixMask; - UCHAR PrefixLen; -} MULTICAST_BLACK_LIST_ENTRY, *PMULTICAST_BLACK_LIST_ENTRY; - -typedef struct _MULTICAST_BLACK_LIST_FILTER_TABLE { - UCHAR EntryNum; - MULTICAST_BLACK_LIST_ENTRY EntryTab[MULTICAST_BLACK_LIST_SIZE_MAX]; -} MULTICAST_BLACK_LIST_FILTER_TABLE, *PMULTICAST_BLACK_LIST_FILTER_TABLE; -#endif /* IGMP_TVM_SUPPORT */ - -/** - * @send_mlme_pkt: TX mlme pakcet en-queue pre handle that will call enq_data_pkt/enq_mgmt_pkt depend on which queue type that enqueue to - * @send_data_pkt: TX data packet en-queue (TX sw queue) pre handle - * @fp_send_data_pkt: TX data packet en-queue (TX sw queue) pre handle for fast path - * @tx_pkt_allowed: early check for allow unicast/multicast packet to send or not - * @fp_tx_pkt_allowed: early check for allow unicast/multicast packet to send or not for fast path - * @tx_pkt_handle: TX data per packet handle - * @fill_offload_tx_blk: fill tx_blk information to build 802.11 header and hw descriptor header for txd offload frame - * @fill_non_offload_tx_blk: fill tx_blk information to build 802.11 header and hw descriptor header for non-txd offload frame - * @legacy_tx: build tx_blk, 802.11 header if not enable header translation and txd header then kick out to HIF - * @ampdu_tx: same as legacy_tx except that can do cache operation (802.11 header cache) - * @frag_tx: fragment TX data packet according to fragment threshold, fragment do not support header translation, so need to build 802.11 header - * @amsdu_tx: aggrgation msdu packet into a-msdu packet - * @mlme_mgmtq_tx: build tx_blk, and txd header and kick out to HIF for MLME frame that dequeue from management sw queue - * @mlme_dataq_tx: build tx_blk, and txd header and kick out to HIF for MLME frame that dequeue from data sw queue - * @ate_tx: build tx_blk, and txd header and kick out to HIF for ATE frames - * @ieee_802_11_data_tx: build 802.11 header - * @ieee_802_3_data_tx: for header translation disable case, do not need build 802.11 header any more - * @rx_pkt_allowed: early check for allow unicast/multicast packet to receive or not - * @ieee_802_11_data_rx: per 802.11 data packet handle (build RX_BLK, process 802.11 header nad indicate to TCP layer or forward to other STA) - * @ieee_802_3_data_rx: per 802.3 data packet handle (build RX_BLK and indicate to TCP layer or forward to other STA) - * @ieee_802_11_ctl_rx: per 802.11 control packet handle (receive control frame and en-queue to MLME state machine) - * @rx_pkt_forward: per 802.3 data packet forward handing - * @find_cipher_algorithm: find encrypt key and decide cipher alogorithm - * @detect_wmm_traffic: detect wmm traffic for purpose that determine if turn off txop or not - */ - -struct wifi_dev_ops { - /* TX */ - INT(*send_data_pkt) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt) ____cacheline_aligned; - INT(*fp_send_data_pkt) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, PNDIS_PACKET pkt); - INT(*send_mlme_pkt) - (struct _RTMP_ADAPTER *pAd, PNDIS_PACKET pkt, struct wifi_dev *wdev, - UCHAR q_idx, BOOLEAN is_data_queue); - INT(*tx_pkt_allowed) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, PNDIS_PACKET pkt); - INT(*fp_tx_pkt_allowed) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, PNDIS_PACKET pkt); - INT(*tx_pkt_handle) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - INT(*legacy_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - INT(*ampdu_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - INT(*amsdu_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - INT(*frag_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - INT(*mlme_mgmtq_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - INT(*mlme_dataq_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - INT(*ate_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - BOOLEAN(*fill_offload_tx_blk) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - BOOLEAN(*fill_non_offload_tx_blk) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - VOID(*ieee_802_11_data_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - VOID(*ieee_802_3_data_tx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - - /* RX */ - INT(*rx_pkt_allowed) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _RX_BLK *rx_blk) ____cacheline_aligned; - INT(*rx_pkt_hdr_chk) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _RX_BLK *rx_blk); - INT(*rx_ps_handle) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _RX_BLK *rx_blk); - INT(*ieee_802_11_data_rx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _RX_BLK *rx_blk, struct _MAC_TABLE_ENTRY *entry); - INT(*ieee_802_3_data_rx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _RX_BLK *rx_blk, struct _MAC_TABLE_ENTRY *entry); - INT(*ieee_802_11_mgmt_rx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _RX_BLK *rx_blk); - INT(*ieee_802_11_ctl_rx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _RX_BLK *rx_blk); - INT(*rx_pkt_foward) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, PNDIS_PACKET pkt); - VOID(*find_cipher_algorithm) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); - VOID(*detect_wmm_traffic) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR up, - UCHAR flg_is_output); - - /* General */ - INT (*open)(struct wifi_dev *wdev) ____cacheline_aligned; - INT (*close)(struct wifi_dev *wdev); - INT (*linkup)(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); - INT (*linkdown)(struct wifi_dev *wdev); - INT (*conn_act)(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); - INT(*disconn_act) - (struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); - VOID(*mac_entry_lookup) - (RTMP_ADAPTER *pAd, UCHAR *pAddr, struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY **entry); -}; - -struct conn_sta_info { - UINT16 nonerp_sta_cnt; - UINT16 nongf_sta_cnt; - UINT16 ht_bw20_sta_cnt; -}; - -struct dpp_frame_list { - DL_LIST List; - struct wapp_event *dpp_frame_event; -}; - -enum { - QUICK_CH_SWICH_DISABLE, - QUICK_CH_SWICH_ENABLE_W_DISCONNECTION, - QUICK_CH_SWICH_ENABLE_WO_DISCONNECTION, -}; - -/** - * @wdev_idx: index refer from pAd->wdev_list[] - * @func_idx: index refer to func_dev which pointer to - * @tr_tb_idx: index refer to BSS which this device belong to - * @wdev_ops: wifi device operation - */ - -struct wifi_dev { - PNET_DEV if_dev; - VOID *func_dev; - VOID *sys_handle; - CHAR wdev_idx; /* index refer from pAd->wdev_list[] */ - CHAR BssIdx; - CHAR func_idx; /* index refer to func_dev which pointer to */ - CHAR func_type; /*Indicator to func type*/ - UCHAR tr_tb_idx; /* index refer to BSS which this device belong */ - UINT32 wdev_type; - UCHAR PhyMode; - UCHAR channel; -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - BOOLEAN bV10OldChannelValid; /* Retain Previous Channel during Driver Reload */ -#endif - UCHAR if_addr[MAC_ADDR_LEN]; - UCHAR bssid[MAC_ADDR_LEN]; - UCHAR hw_bssid_idx; - BOOLEAN if_up_down_state; - BOOLEAN open_state; - BOOLEAN start_stop_running; - RTMP_OS_COMPLETION start_stop_complete; - - /* security segment */ - struct _SECURITY_CONFIG SecConfig; - - UCHAR PortSecured; - -#ifdef DOT11R_FT_SUPPORT - FT_CFG FtCfg; -#endif /* DOT11R_FT_SUPPORT */ -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE - BOOLEAN isRssiEnbl; /* RSSI Enable */ -#endif - - /* transmit segment */ - ULONG forbid_data_tx; /* Use long, becasue we want to do atomic bit operation */ - BOOLEAN IgmpSnoopEnable; /* Only enabled for AP/WDS mode */ -#ifdef IGMP_TVM_SUPPORT - UCHAR IsTVModeEnable; /* Valid for both AP and Apcli wdev */ - UCHAR TVModeType; /* 0:Disable, 1:Enable, or 2:Auto, Valid only for AP wdev*/ - MULTICAST_BLACK_LIST_FILTER_TABLE McastBLTable; - /* This temporary table is used to have book keeping of all the entries received from CR4 in multiple events */ - P_IGMP_MULTICAST_TABLE pIgmpMcastTable; - UINT32 IgmpTableSize; - UINT_32 u4AgeOutTime; /* Time in sec */ -#endif /* IGMP_TVM_SUPPORT */ - RT_PHY_INFO DesiredHtPhyInfo; - DESIRED_TRANSMIT_SETTING - DesiredTransmitSetting; /* Desired transmit setting. this is for reading registry setting only. not useful. */ - BOOLEAN bAutoTxRateSwitch; - HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, - MinHTPhyMode; /* For transmit phy setting in TXWI. */ - - /* 802.11 protocol related characters */ - BOOLEAN bWmmCapable; /* 0:disable WMM, 1:enable WMM */ - UCHAR EdcaIdx; /*mapping edca parameter to CommonCfg.APEdca[EdcaIdx]*/ - /* UAPSD information: such as enable or disable, do not remove */ - UAPSD_INFO UapsdInfo; - - /* for protocol layer using */ - UINT32 protection; - - /* tx burst */ - UINT32 prio_bitmap; - UINT16 txop_level[MAX_PRIO_NUM]; - - /* VLAN related */ - BOOLEAN bVLAN_Tag; - USHORT VLAN_VID; - USHORT VLAN_Priority; - USHORT VLAN_Policy[2]; /*[0] for Tx , [1] for Rx*/ - - UCHAR restore_channel; - struct wifi_dev_ops *wdev_ops; - - /* last received packet's SNR for each antenna */ - UCHAR LastSNR0; - UCHAR LastSNR1; - RSSI_SAMPLE RssiSample; - ULONG NumOfAvgRssiSample; - BOOLEAN bLinkUpDone; - BOOLEAN bGotEapolPkt; - struct _RX_BLK *pEapolPktFromAP; - -#ifdef WIFI_EAP_FEATURE - BOOLEAN mgmt_txpwr_force_on; - UCHAR txd_txpwr_offset; -#endif - - /* 7636 psm */ - USHORT Psm; /* power management mode (PWR_ACTIVE|PWR_SAVE), Please use this value to replace pAd->StaCfg[0].Psm in the future*/ - BOOLEAN bBeaconLost; - BOOLEAN bTriggerRoaming; - UINT8 ucDtimPeriod; - UINT8 ucBeaconPeriod; - UINT8 OmacIdx; -#if defined(RT_CFG80211_SUPPORT) || defined(HOSTAPD_SUPPORT) - NDIS_HOSTAPD_STATUS Hostapd; - BOOLEAN IsCFG1xWdev; -#endif -#ifdef MBSS_AS_WDS_AP_SUPPORT - BOOLEAN wds_enable; -#endif -#ifdef RADIUS_MAC_AUTH_SUPPORT - BOOLEAN radius_mac_auth_enable; -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - UINT8 csa_count; - BCN_BUF_STRUC bcn_buf; - struct _BSS_INFO_ARGUMENT_T bss_info_argument; - struct _DEV_INFO_CTRL_T DevInfo; - VOID *pHObj; - - BOOLEAN fgRadioOnRequest; -#ifdef MT_MAC - RX_TRACKING_T rx_tracking; -#endif - - BOOLEAN fAnyStationPeekTpBound; - struct dev_rate_info rate; - /*wlan profile, use for configuration part.*/ - void *wpf_cfg; - /*wlan profile, use for operating configurion, update by wcfg & mlme*/ - void *wpf_op; - /* struct conn_sta_info conn_sta; */ - /* struct protection_cfg prot_cfg; */ - /* Flag migrate from pAd partially */ - UINT32 OpStatusFlags; - BOOLEAN bAllowBeaconing; /* Device opened and ready for beaconing */ -#ifdef DOT11K_RRM_SUPPORT - RRM_CONFIG RrmCfg; -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef MBO_SUPPORT - MBO_CTRL MboCtrl; -#endif /* MBO_SUPPORT */ -#ifdef OCE_SUPPORT - OCE_CTRL OceCtrl; -#endif /* OCE_SUPPORT */ - /* NEW FSM Segment - */ - SCAN_INFO ScanInfo; - VOID *sync_fsm_ops; - -#ifdef WSC_INCLUDED - /* - WPS segment - */ - WSC_LV_INFO WscIEBeacon; - WSC_LV_INFO WscIEProbeResp; - WSC_CTRL WscControl; - WSC_SECURITY_MODE WscSecurityMode; -#endif /* WSC_INCLUDED */ -#ifdef BAND_STEERING -#ifdef CONFIG_AP_SUPPORT - BOOLEAN bInfReady; -#endif /* CONFIG_AP_SUPPORT */ -#endif /* BAND_STEERING */ - BOOLEAN quick_ch_change; -#ifdef CONFIG_MAP_SUPPORT - MAP_CONFIG MAPCfg; - BOOLEAN cac_not_required; - UCHAR dev_role; -#ifdef DFS_CAC_R2 - struct cac_capability_lib cac_capability; -#endif -#endif - UINT8 auto_channel_cen_ch_2; - BOOLEAN is_marvell_ap; - BOOLEAN is_atheros_ap; - VOID *pDot11_H; - VIE_CTRL vie_ctrl[VIE_FRM_TYPE_MAX]; -#ifdef DPP_SUPPORT - UCHAR dpp_frame_da[MAC_ADDR_LEN]; - BOOLEAN is_gas_frame; - DL_LIST dpp_frame_event_list; -#endif /* DPP_SUPPORT */ -#ifdef WAPP_SUPPORT - BOOLEAN avoid_apcli_linkdown; -#endif -#ifdef MGMT_TXPWR_CTRL - BOOLEAN bPwrCtrlEn; - CHAR TxBasePwr; - CHAR TxPwrDelta; - CHAR MgmtTxPwr; /* Read from profile parameter*/ - CHAR MgmtTxPwrBak; -#endif -#ifdef AMPDU_CONF_SUPPORT - UINT8 bRetryEnable; - UINT8 bAMPDURetrynum; -#endif /* AMPDU_CONF_SUPPORT*/ -#ifdef CONFIG_MAP_SUPPORT - UCHAR map_radar_detect; - UCHAR map_radar_channel; - UCHAR map_indicate_channel_change; -#endif - BOOLEAN bUseShortSlotTime; /* 0: disable, 1 - use short slot (9us) */ - UINT8 SlotTimeValue; -}; - -struct greenap_ctrl { - /* capability of rreenap */ - BOOLEAN cap; - /* greenap_allow=TRUE only when AP or AP+AP case */ - BOOLEAN allow; - /* suspend greenap operation ex. when do AP backdround scan */ - UINT32 suspend; - NDIS_SPIN_LOCK lock; -}; - -struct greenap_on_off_ctrl { - UINT8 band_idx; - BOOLEAN reduce_core_power; -}; - -typedef struct _PWR_MGMT_STRUCT_ { - USHORT Psm; /* power management mode (PWR_ACTIVE|PWR_SAVE), Please use this value to replace pAd->StaCfg[0].Psm in the future*/ - BOOLEAN bBeaconLost; - BOOLEAN bTriggerRoaming; - BOOLEAN bEnterPsmNull; - UINT8 ucDtimPeriod; - UINT8 ucBeaconPeriod; - /* Usign this wcid instead of pEntry->wcid for race condition. ex STA in PS --> BCN lost --> - Linkdown --> Exit h/w LP with pEntry->wcid (pEntry might be NULL at this moment)*/ - UCHAR ucWcid; - BOOLEAN bDoze; -} PWR_MGMT_STRUCT, *PPWR_MGMT_STRUCT; - -/*************************************************************************** - * Multiple SSID related data structures - **************************************************************************/ -#define WLAN_CT_TIM_BCMC_OFFSET 0 /* unit: 32B */ - -/* clear bcmc TIM bit */ -#define WLAN_MR_TIM_BCMC_CLEAR(apidx) \ - (pAd->ApCfg.MBSSID[apidx] \ - .wdev.bcn_buf.TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] &= \ - ~NUM_BIT8[0]) - -/* set bcmc TIM bit */ -#define WLAN_MR_TIM_BCMC_SET(apidx) \ - (pAd->ApCfg.MBSSID[apidx] \ - .wdev.bcn_buf.TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] |= \ - NUM_BIT8[0]) - -#define WLAN_MR_TIM_BCMC_GET(apidx) \ - (pAd->ApCfg.MBSSID[apidx] \ - .wdev.bcn_buf.TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & \ - NUM_BIT8[0]) - -/* clear a station PS TIM bit */ -#define WLAN_MR_TIM_BIT_CLEAR(ad_p, apidx, _aid) \ - { \ - UCHAR tim_offset = _aid >> 3; \ - UCHAR bit_offset = _aid & 0x7; \ - ad_p->ApCfg.MBSSID[apidx] \ - .wdev.bcn_buf.TimBitmaps[tim_offset] &= \ - (~NUM_BIT8[bit_offset]); \ - } - -/* set a station PS TIM bit */ -#define WLAN_MR_TIM_BIT_SET(ad_p, apidx, _aid) \ - { \ - UCHAR tim_offset = _aid >> 3; \ - UCHAR bit_offset = _aid & 0x7; \ - ad_p->ApCfg.MBSSID[apidx] \ - .wdev.bcn_buf.TimBitmaps[tim_offset] |= \ - NUM_BIT8[bit_offset]; \ - } - -#ifdef CONFIG_AP_SUPPORT -#ifdef MT_MAC -#define MAX_TIME_RECORD 5 -#endif -#ifdef TXRX_STAT_SUPPORT - -typedef struct _TXRX_STAT_BSS { - LARGE_INTEGER TxDataPacketCount; - LARGE_INTEGER TxDataPacketByte; - LARGE_INTEGER TxDataPayloadByte; - LARGE_INTEGER RxDataPacketCount; - LARGE_INTEGER RxDataPacketByte; - LARGE_INTEGER RxDataPayloadByte; - LARGE_INTEGER TxDataPacketCountPerAC[4]; /*per access category*/ - LARGE_INTEGER RxDataPacketCountPerAC[4]; /*per access category*/ - LARGE_INTEGER TxUnicastDataPacket; - LARGE_INTEGER TxMulticastDataPacket; - LARGE_INTEGER TxBroadcastDataPacket; - LARGE_INTEGER RxUnicastDataPacket; - LARGE_INTEGER TxPacketDroppedCount; - LARGE_INTEGER RxPacketDroppedCount; - LARGE_INTEGER TxRetriedPacketCount; - LARGE_INTEGER RxMICErrorCount; - LARGE_INTEGER RxDecryptionErrorCount; - LARGE_INTEGER TxMgmtPacketCount; - LARGE_INTEGER TxMgmtOffChPktCount; - LARGE_INTEGER RxMgmtPacketCount; - LARGE_INTEGER LastSecTxBytes; - LARGE_INTEGER LastSecRxBytes; - HTTRANSMIT_SETTING LastMulticastTxRate; - UINT32 LastPktStaWcid; - UINT32 Last1SecPER; - UINT32 Last1TxFailCnt; - UINT32 Last1TxCnt; -} TXRX_STAT_BSS, *PTXRX_STAT_BSS; - -#endif -typedef struct _BSS_STRUCT { - struct wifi_dev wdev; - - INT mbss_idx; - -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - /* In this state actually AP will be ON by default, but from user point of view */ - /* it may either never beacon or will start beaconing only after ApCLi connection successful with RootAP */ - UINT_8 APStartPseduState; -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - -#ifdef HOSTAPD_SUPPORT - NDIS_HOSTAPD_STATUS Hostapd; - BOOLEAN HostapdWPS; -#endif - -#ifdef OCE_SUPPORT - BOOLEAN ReducedNRListExist; - REDUCED_NR_LIST_INFO ReducedNRListInfo; -#endif /* OCE_SUPPORT */ - -#ifdef DSCP_QOS_MAP_SUPPORT - UINT8 DscpQosPoolId; - BOOLEAN DscpQosMapEnable; -#endif - - CHAR Ssid[MAX_LEN_OF_SSID + 1]; - UCHAR SsidLen; - BOOLEAN bHideSsid; - - USHORT CapabilityInfo; - UCHAR ErpIeContent; - - UCHAR MaxStaNum; /* Limit the STA connection number per BSS */ - UCHAR StaCount; - UINT16 StationKeepAliveTime; /* unit: second */ -#ifdef MBSS_DTIM_SUPPORT - UCHAR DtimCount; /* 0.. DtimPeriod-1 */ - UCHAR DtimPeriod; -#endif - - /* - Security segment - */ -#ifdef DISABLE_HOSTAPD_BEACON - UINT8 RSNIE_ID[2]; -#endif - UCHAR RSNIE_Len[2]; - UCHAR RSN_IE[2][MAX_LEN_OF_RSNIE]; - -#ifdef HOSTAPD_OWE_SUPPORT - UCHAR TRANSIE_Len; - UCHAR TRANS_IE[MAX_LEN_OF_TRANS_IE]; -#endif - /* WPA */ - UCHAR GMK[32]; - UCHAR PSK[65]; - UCHAR PMK[LEN_MAX_PMK]; - UCHAR GTK[32]; - UCHAR GNonce[32]; - NDIS_802_11_PRIVACY_FILTER PrivacyFilter; - - /* for Group Rekey, AP ONLY */ - RT_WPA_REKEY WPAREKEY; - ULONG REKEYCOUNTER; - RALINK_TIMER_STRUCT REKEYTimer; - UCHAR REKEYTimerRunning; - UINT8 RekeyCountDown; - - /* For PMK Cache using, AP ONLY */ - ULONG PMKCachePeriod; /* unit : jiffies */ - - /* - Transmitting segment - */ - UCHAR TxRate; /* RATE_1, RATE_2, RATE_5_5, RATE_11, ... */ - UCHAR DesiredRates - [MAX_LEN_OF_SUPPORTED_RATES]; /* OID_802_11_DESIRED_RATES */ - UCHAR DesiredRatesIndex; - UCHAR MaxTxRate; /* RATE_1, RATE_2, RATE_5_5, RATE_11 */ - - /* - Statistics segment - */ - /*MBSS_STATISTICS MbssStat;*/ - ULONG TxCount; - ULONG RxCount; - ULONG ReceivedByteCount; - ULONG TransmittedByteCount; - ULONG RxErrorCount; - ULONG RxDropCount; -#ifdef CUSTOMER_DCC_FEATURE - /* Retry Packet Count */ - ULONG TxRetriedPktCount; - UINT64 ChannelUseTime; - /* MGMT counter */ - ULONG MGMTRxCount; - ULONG MGMTTxCount; - ULONG MGMTReceivedByteCount; - ULONG MGMTTransmittedByteCount; - ULONG MGMTRxErrorCount; - ULONG MGMTRxDropCount; - ULONG MGMTTxErrorCount; - ULONG MGMTTxDropCount; -#endif - ULONG TxErrorCount; - ULONG TxDropCount; - ULONG ucPktsTx; - ULONG ucPktsRx; - ULONG mcPktsTx; - ULONG mcPktsRx; - ULONG bcPktsTx; - ULONG bcPktsRx; -#ifdef MAP_R2 - ULONG ucBytesTx; - ULONG ucBytesRx; - ULONG mcBytesTx; - ULONG mcBytesRx; - ULONG bcBytesTx; - ULONG bcBytesRx; -#endif - UCHAR BANClass3Data; - ULONG IsolateInterStaTraffic; - UCHAR IsolateInterStaMBCast; - - RT_802_11_ACL AccessControlList; - - /* EDCA QoS */ - /*BOOLEAN bWmmCapable;*/ /* 0:disable WMM, 1:enable WMM */ - BOOLEAN bDLSCapable; /* 0:disable DLS, 1:enable DLS */ - - /* - Why need the parameter: 2009/09/22 - - 1. iwpriv ra0 set WmmCapable=0 - 2. iwpriv ra0 set WirelessMode=9 - 3. iwpriv ra0 set WirelessMode=0 - 4. iwpriv ra0 set SSID=SampleAP - - After the 4 commands, WMM is still enabled. - So we need the parameter to recover WMM Capable flag. - - No the problem in station mode. - */ - BOOLEAN bWmmCapableOrg; /* origin Wmm Capable in non-11n mode */ - /* -` WPS segment - */ - WSC_LV_INFO WscIEBeacon; - WSC_LV_INFO WscIEProbeResp; -#ifdef WSC_AP_SUPPORT - WSC_CTRL WscControl; - WSC_SECURITY_MODE WscSecurityMode; -#endif /* WSC_AP_SUPPORT */ - -#ifdef IDS_SUPPORT - UINT32 RcvdConflictSsidCount; - UINT32 RcvdSpoofedAssocRespCount; - UINT32 RcvdSpoofedReassocRespCount; - UINT32 RcvdSpoofedProbeRespCount; - UINT32 RcvdSpoofedBeaconCount; - UINT32 RcvdSpoofedDisassocCount; - UINT32 RcvdSpoofedAuthCount; - UINT32 RcvdSpoofedDeauthCount; - UINT32 RcvdSpoofedUnknownMgmtCount; - UINT32 RcvdReplayAttackCount; - - CHAR RssiOfRcvdConflictSsid; - CHAR RssiOfRcvdSpoofedAssocResp; - CHAR RssiOfRcvdSpoofedReassocResp; - CHAR RssiOfRcvdSpoofedProbeResp; - CHAR RssiOfRcvdSpoofedBeacon; - CHAR RssiOfRcvdSpoofedDisassoc; - CHAR RssiOfRcvdSpoofedAuth; - CHAR RssiOfRcvdSpoofedDeauth; - CHAR RssiOfRcvdSpoofedUnknownMgmt; - CHAR RssiOfRcvdReplayAttack; -#endif /* IDS_SUPPORT */ - - /* YF@20120417: Avoid connecting to AP in Poor Env, value 0 fOr disable. */ - CHAR AssocReqRssiThreshold; - CHAR RssiLowForStaKickOut; - -#ifdef CONFIG_DOT11U_INTERWORKING - GAS_CTRL GASCtrl; -#endif - -#ifdef CONFIG_HOTSPOT - HOTSPOT_CTRL HotSpotCtrl; -#endif - -#ifdef CONFIG_DOT11V_WNM - WNM_CTRL WNMCtrl; -#endif - -#ifdef SPECIFIC_TX_POWER_SUPPORT - CHAR TxPwrAdj; -#endif /* SPECIFIC_TX_POWER_SUPPORT */ - -#ifdef RT_CFG80211_SUPPORT - /* Extra IEs for (Re)Association Response provided by wpa_supplicant. E.g, WPS & P2P & WFD...etc */ - UCHAR AssocRespExtraIe[512]; - UINT32 AssocRespExtraIeLen; -#endif /* RT_CFG80211_SUPPORT */ - -#ifdef MT_MAC - ULONG WriteBcnDoneTime[MAX_TIME_RECORD]; - ULONG BcnDmaDoneTime[MAX_TIME_RECORD]; - UCHAR bcn_not_idle_time; - UINT32 bcn_recovery_num; - ULONG TXS_TSF[MAX_TIME_RECORD]; - ULONG TXS_SN[MAX_TIME_RECORD]; - UCHAR timer_loop; -#endif /* MT_MAC */ - -#ifdef ROUTING_TAB_SUPPORT - BOOLEAN bRoutingTabInit; - UINT32 RoutingTabFlag; - NDIS_SPIN_LOCK RoutingTabLock; - ROUTING_ENTRY *pRoutingEntryPool; - LIST_HEADER RoutingEntryFreeList; - LIST_HEADER RoutingTab[ROUTING_HASH_TAB_SIZE]; -#endif /* ROUTING_TAB_SUPPORT */ - -#ifdef A4_CONN - UCHAR a4_init; - NDIS_SPIN_LOCK a4_entry_lock; - DL_LIST a4_entry_list; -#endif /* A4_CONN */ -#ifdef WAPP_SUPPORT - UCHAR ESPI_AC_BE[3]; - UCHAR ESPI_AC_BK[3]; - UCHAR ESPI_AC_VO[3]; - UCHAR ESPI_AC_VI[3]; -#endif -#if defined(A4_CONN) && defined(IGMP_SNOOP_SUPPORT) - UINT8 IgmpQueryHoldTick; /*Duration to hold IGMP query in unit of 10 sec*/ - BOOLEAN IGMPPeriodicQuerySent; /*Whether Pertiodic IGMP query already sent on a MBSS*/ - UINT8 MldQueryHoldTick; /*Duration to hold MLD query in unit of 10 sec*/ - BOOLEAN MLDPeriodicQuerySent; /* Whether Pertiodic MLD query already sent on a MBSS*/ - BOOLEAN IgmpQueryHoldTickChanged; /* Whether IgmpQueryHoldTick already modified*/ - BOOLEAN MldQueryHoldTickChanged; /*Whether MldQueryHoldTick already modified*/ - UCHAR ipv6LinkLocalSrcAddr - [16]; /* Ipv6 link local address for this MBSS as per it's BSSID*/ - UINT16 MldQryChkSum; /* Chksum to use in MLD query msg on this MBSS*/ -#endif - - struct conn_sta_info conn_sta; -#ifdef CUSTOMER_VENDOR_IE_SUPPORT - /*For AP vendor ie*/ - struct customer_vendor_ie ap_vendor_ie; -#endif /* CUSTOMER_VENDOR_IE_SUPPORT */ - -#ifdef DOT11U_INTERWORKING_IE_SUPPORT - BOOLEAN bEnableInterworkingIe; - INTERWORKING_IE InterWorkingIe; -#endif /* DOT11U_INTERWORKING_IE_SUPPORT */ - -#ifdef DSCP_PRI_SUPPORT - INT8 dscp_pri_map[64]; /*priority mapping for dscp values */ -#endif - -#ifdef TXRX_STAT_SUPPORT - TXRX_STAT_BSS stat_bss; -#endif -#if defined(CONFIG_MAP_SUPPORT) && defined(MAP_BL_SUPPORT) - /* BS Blcklist Support */ - LIST_HEADER BlackList; - NDIS_SPIN_LOCK BlackListLock; -#endif -} BSS_STRUCT; - -#endif /* CONFIG_AP_SUPPORT */ -#ifdef MAP_R2 - -typedef struct _radio_info { - u8 ra_id[ETH_ALEN]; - u8 cu_noise; - u8 cu_tx; - u8 cu_rx; - u8 cu_other; -} radio_info; - -#endif -#ifdef CUSTOMER_DCC_FEATURE -typedef struct _CHANNEL_SWITCH { - UCHAR CHSWCount; - UCHAR CHSWPeriod; - UCHAR Dot11_H_CSPeriod; - UCHAR CHSWMode; - UCHAR Channel; -} CHANNEL_SWITCH, *PCHANNEL_SWITCH; -#endif - -#ifdef WAPP_SUPPORT -struct BSS_LOAD_INFO { - UINT8 current_status[DBDC_BAND_NUM]; - UINT8 current_load[DBDC_BAND_NUM]; - UINT8 high_thrd[DBDC_BAND_NUM]; - UINT8 low_thrd[DBDC_BAND_NUM]; -}; -#endif /* WAPP_SUPPORT */ - -/* configuration common to OPMODE_AP as well as OPMODE_STA */ -typedef struct _COMMON_CONFIG { - BOOLEAN bCountryFlag; - UCHAR CountryCode[4]; -#ifdef EXT_BUILD_CHANNEL_LIST - UCHAR Geography; - UCHAR DfsType; - PUCHAR pChDesp; -#endif /* EXT_BUILD_CHANNEL_LIST */ - PUCHAR pChDesc2G; - PUCHAR pChDesc5G; - UCHAR CountryRegion; /* Enum of country region, 0:FCC, 1:IC, 2:ETSI, 3:SPAIN, 4:France, 5:MKK, 6:MKK1, 7:Israel */ - UCHAR CountryRegionForABand; /* Enum of country region for A band */ - UCHAR cfg_wmode; - UCHAR SavedPhyMode; - USHORT Dsifs; /* in units of usec */ - ULONG PacketFilter; /* Packet filter for receiving */ - /* UINT8 RegulatoryClass[MAX_NUM_OF_REGULATORY_CLASS]; */ /* unify to using get_regulatory_class from driver table */ - - USHORT BeaconPeriod; - /* Channel Group*/ - UCHAR ChGrpEn; - UCHAR ChGrpChannelList[MAX_NUM_OF_CHANNELS]; - UCHAR ChGrpChannelNum; -#ifdef CUSTOMER_DCC_FEATURE - CHANNEL_SWITCH channelSwitch; - BOOLEAN bChannelSwitchOn; -#endif - UCHAR ExpectedACKRate[MAX_LEN_OF_SUPPORTED_RATES]; - - ULONG BasicRateBitmap; /* backup basic ratebitmap */ - ULONG BasicRateBitmapOld; /* backup basic ratebitmap */ - - BOOLEAN bInServicePeriod; - - UCHAR EtherTrafficBand; - UCHAR WfFwdDisabled; - - BOOLEAN bAPSDAC_BE; - BOOLEAN bAPSDAC_BK; - BOOLEAN bAPSDAC_VI; - BOOLEAN bAPSDAC_VO; - -#if defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) - BOOLEAN TDLS_bAPSDAC_BE; - BOOLEAN TDLS_bAPSDAC_BK; - BOOLEAN TDLS_bAPSDAC_VI; - BOOLEAN TDLS_bAPSDAC_VO; - UCHAR TDLS_MaxSPLength; -#endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) */ - - /* because TSPEC can modify the APSD flag, we need to keep the APSD flag - requested in association stage from the station; - we need to recover the APSD flag after the TSPEC is deleted. */ - BOOLEAN bACMAPSDBackup[4]; /* for delivery-enabled & trigger-enabled both */ - BOOLEAN bACMAPSDTr[4]; /* no use */ - UCHAR MaxSPLength; - - BOOLEAN bNeedSendTriggerFrame; - BOOLEAN bAPSDForcePowerSave; /* Force power save mode, should only use in APSD-STAUT */ - ULONG TriggerTimerCount; - REG_TRANSMIT_SETTING - RegTransmitSetting; /*registry transmit setting. this is for reading registry setting only. not useful. */ - - UCHAR TxRate; /* Same value to fill in TXD. TxRate is 6-bit */ - UCHAR MaxTxRate; /* RATE_1, RATE_2, RATE_5_5, RATE_11 */ - UCHAR TxRateIndex; /* Tx rate index in Rate Switch Table */ - UCHAR MinTxRate; /* RATE_1, RATE_2, RATE_5_5, RATE_11 */ - UCHAR RtsRate; /* RATE_xxx */ - UCHAR MlmeRate; /* RATE_xxx, used to send MLME frames */ - UCHAR BasicMlmeRate; /* Default Rate for sending MLME frames */ - - UCHAR TxPower; /* in unit of mW */ - UINT8 ucTxPowerPercentage[DBDC_BAND_NUM]; /* 0~100 % */ - - UCHAR PowerUpenable[DBDC_BAND_NUM]; - CHAR cPowerUpCckOfdm[DBDC_BAND_NUM][POWER_UP_CATEGORY_RATE_NUM]; - CHAR cPowerUpHt20[DBDC_BAND_NUM][POWER_UP_CATEGORY_RATE_NUM]; - CHAR cPowerUpHt40[DBDC_BAND_NUM][POWER_UP_CATEGORY_RATE_NUM]; - CHAR cPowerUpVht20[DBDC_BAND_NUM][POWER_UP_CATEGORY_RATE_NUM]; - CHAR cPowerUpVht40[DBDC_BAND_NUM][POWER_UP_CATEGORY_RATE_NUM]; - CHAR cPowerUpVht80[DBDC_BAND_NUM][POWER_UP_CATEGORY_RATE_NUM]; - CHAR cPowerUpVht160[DBDC_BAND_NUM][POWER_UP_CATEGORY_RATE_NUM]; - - UCHAR SKUenable[DBDC_BAND_NUM]; - UCHAR SKUTableIdx; - CHAR cTxPowerCompBackup[DBDC_BAND_NUM][SKU_TABLE_SIZE] - [SKU_TX_SPATIAL_STREAM_NUM]; - UCHAR PERCENTAGEenable[DBDC_BAND_NUM]; - UCHAR BFBACKOFFenable[DBDC_BAND_NUM]; - UINT8 CCKTxStream[DBDC_BAND_NUM]; - - UCHAR ucEDCCACtrl[DBDC_BAND_NUM]; - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) - UCHAR CalCacheApply; -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - - UINT8 ThermalRecalMode; - UINT8 ucTxPowerDefault[DBDC_BAND_NUM]; /* keep for TxPowerPercentage */ - UINT8 PwrConstraint; - -#ifdef DOT11_N_SUPPORT - BACAP_STRUC - BACapability; /* NO USE = 0XFF ; IMMED_BA =1 ; DELAY_BA=0 */ - BACAP_STRUC - REGBACapability; /* NO USE = 0XFF ; IMMED_BA =1 ; DELAY_BA=0 */ -#endif /* DOT11_N_SUPPORT */ - - BOOLEAN dbdc_mode; - ENUM_DBDC_MODE eDBDC_mode; - -#ifdef DOT11_VHT_AC - BOOLEAN force_vht; - UCHAR vht_cent_ch; - UCHAR vht_cent_ch2; - UCHAR vht_mcs_cap; - UCHAR vht_nss_cap; - USHORT vht_tx_hrate; - USHORT vht_rx_hrate; - BOOLEAN ht20_forbid; - BOOLEAN g_band_256_qam; -#ifdef VHT_MU_MIMO - BOOLEAN vht_mu_mimo; -#endif /* VHT_MU_MIMO */ -#endif /* DOT11_VHT_AC */ - - IOT_STRUC IOTestParm; /* 802.11n InterOpbility Test Parameter; */ - ULONG TxPreamble; /* Rt802_11PreambleLong, Rt802_11PreambleShort, Rt802_11PreambleAuto */ - BOOLEAN bUseZeroToDisableFragment; /* Microsoft use 0 as disable */ - ULONG UseBGProtection; /* 0: auto, 1: always use, 2: always not use */ - BOOLEAN bUseShortSlotTime; /* 0: disable, 1 - use short slot (9us) */ - BOOLEAN bEnableTxBurst; /* 1: enble TX PACKET BURST (when BA is established or AP is not a legacy WMM AP), 0: disable TX PACKET BURST */ - BOOLEAN bAggregationCapable; /* 1: enable TX aggregation when the peer supports it */ - BOOLEAN bPiggyBackCapable; /* 1: enable TX piggy-back according MAC's version */ - BOOLEAN bIEEE80211H; /* 1: enable IEEE802.11h spec. */ - UCHAR RDDurRegion; /* Region of radar detection */ - ULONG DisableOLBCDetect; /* 0: enable OLBC detect; 1 disable OLBC detect */ -#ifdef VLAN_SUPPORT - BOOLEAN bEnableVlan; /* 1: enble vlan function 0: disable vlan function */ -#endif /*VLAN_SUPPORT*/ -#ifdef TPC_SUPPORT - BOOLEAN b80211TPC; -#endif /* TPC_SUPPORT */ - -#ifdef DOT11_N_SUPPORT - BOOLEAN bRdg; -#endif /* DOT11_N_SUPPORT */ - QOS_CAPABILITY_PARM - APQosCapability; /* QOS capability of the current associated AP */ - EDCA_PARM APEdcaParm - [WMM_NUM]; /* EDCA parameters of the current associated AP */ - QBSS_LOAD_PARM APQbssLoad; /* QBSS load of the current associated AP */ - UCHAR AckPolicy - [WMM_NUM_OF_AC]; /* ACK policy of the specified AC. see ACK_xxx */ - /* a bitmap of BOOLEAN flags. each bit represent an operation status of a particular */ - /* BOOLEAN control, either ON or OFF. These flags should always be accessed via */ - /* OPSTATUS_TEST_FLAG(), OPSTATUS_SET_FLAG(), OP_STATUS_CLEAR_FLAG() macros. */ - /* see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition */ - ULONG OpStatusFlags; - - BOOLEAN NdisRadioStateOff; /*For HCT 12.0, set this flag to TRUE instead of called MlmeRadioOff. */ - ABGBAND_STATE BandState; /* For setting BBP used on B/G or A mode. */ - -#ifdef MT_DFS_SUPPORT - DFS_PARAM DfsParameter; -#endif - -#ifdef CARRIER_DETECTION_SUPPORT - CARRIER_DETECTION_STRUCT CarrierDetect; -#endif /* CARRIER_DETECTION_SUPPORT */ - -#ifdef DOT11_N_SUPPORT - /* HT */ - HT_CAPABILITY_IE HtCapability; - /*This IE is used with channel switch announcement element when changing to a new 40MHz. */ - /*This IE is included in channel switch ammouncement frames 7.4.1.5, beacons, probe Rsp. */ - NEW_EXT_CHAN_IE - NewExtChanOffset; /*7.3.2.20A, 1 if extension channel is above the control channel, 3 if below, 0 if not present */ - - EXT_CAP_INFO_ELEMENT - ExtCapIE; /* this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. */ - -#ifdef DOT11N_DRAFT3 - BOOLEAN bBssCoexEnable; - /* - Following two paramters now only used for the initial scan operation. the AP only do - bandwidth fallback when BssCoexApCnt > BssCoexApCntThr - By default, the "BssCoexApCntThr" is set as 0 in "UserCfgInit()". - */ - UCHAR BssCoexApCntThr; - UCHAR BssCoexApCnt; - - UCHAR Bss2040CoexistFlag; /* bit 0: bBssCoexistTimerRunning, bit 1: NeedSyncAddHtInfo. */ - RALINK_TIMER_STRUCT Bss2040CoexistTimer; - UCHAR Bss2040NeedFallBack; /* 1: Need Fall back to 20MHz */ - - /*This IE is used for 20/40 BSS Coexistence. */ - BSS_2040_COEXIST_IE BSS2040CoexistInfo; - - USHORT Dot11OBssScanPassiveDwell; /* Unit : TU. 5~1000 */ - USHORT Dot11OBssScanActiveDwell; /* Unit : TU. 10~1000 */ - USHORT Dot11BssWidthTriggerScanInt; /* Unit : Second */ - USHORT Dot11OBssScanPassiveTotalPerChannel; /* Unit : TU. 200~10000 */ - USHORT Dot11OBssScanActiveTotalPerChannel; /* Unit : TU. 20~10000 */ - USHORT Dot11BssWidthChanTranDelayFactor; - USHORT Dot11OBssScanActivityThre; /* Unit : percentage */ - - ULONG Dot11BssWidthChanTranDelay; /* multiple of (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor) */ - ULONG CountDownCtr; /* CountDown Counter from (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor) */ - - BSS_2040_COEXIST_IE LastBSSCoexist2040; - BSS_2040_COEXIST_IE BSSCoexist2040; - TRIGGER_EVENT_TAB TriggerEventTab; - UCHAR ChannelListIdx; - - BOOLEAN bOverlapScanning; - BOOLEAN bBssCoexNotify; -#endif /* DOT11N_DRAFT3 */ - - BOOLEAN bSeOff; - UINT8 ucAntennaIndex; - - BOOLEAN bMIMOPSEnable; - BOOLEAN bBADecline; - BOOLEAN bDisableReordering; - BOOLEAN bForty_Mhz_Intolerant; - BOOLEAN bExtChannelSwitchAnnouncement; - BOOLEAN bRcvBSSWidthTriggerEvents; - ULONG LastRcvBSSWidthTriggerEventsTime; - - UCHAR TxBASize; - - BOOLEAN bRalinkBurstMode; - UINT32 RestoreBurstMode; -#endif /* DOT11_N_SUPPORT */ - -#ifdef DOT11_VHT_AC - UINT32 cfg_vht; - VHT_CAP_INFO vht_info; - VHT_CAP_IE vht_cap_ie; - BOOLEAN bNonVhtDisallow; /* Disallow non-VHT connection */ -#endif /* DOT11_VHT_AC */ - -#ifdef SYSTEM_LOG_SUPPORT - /* Enable wireless event */ - BOOLEAN bWirelessEvent; -#endif /* SYSTEM_LOG_SUPPORT */ - - BOOLEAN bWiFiTest; /* Enable this parameter for WiFi test */ - - /* Tx & Rx Stream number selection */ - UCHAR TxStream; - UCHAR RxStream; - - /* transmit phy mode, trasmit rate for Multicast. */ - /* - #ifdef MCAST_RATE_SPECIFIC - UCHAR McastTransmitMcs; - UCHAR McastTransmitPhyMode; - #endif // MCAST_RATE_SPECIFIC - */ - BOOLEAN bHardwareRadio; /* Hardware controlled Radio enabled */ - -#ifdef WSC_INCLUDED - /* WSC hardware push button function 0811 */ - UINT8 WscHdrPshBtnCheckCount; -#endif /* WSC_INCLUDED */ - - NDIS_SPIN_LOCK MeasureReqTabLock; - PMEASURE_REQ_TAB pMeasureReqTab; - - NDIS_SPIN_LOCK TpcReqTabLock; - PTPC_REQ_TAB pTpcReqTab; - - /* transmit phy mode, trasmit rate for Multicast. */ -#ifdef MCAST_RATE_SPECIFIC -#ifdef MCAST_BCAST_RATE_SET_SUPPORT - MCAST_TYPE McastType; - HTTRANSMIT_SETTING BCastPhyMode; - HTTRANSMIT_SETTING BCastPhyMode_5G; - BOOLEAN McastTypeFlag; -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ - HTTRANSMIT_SETTING MCastPhyMode; - HTTRANSMIT_SETTING MCastPhyMode_5G; -#endif /* MCAST_RATE_SPECIFIC */ - -#ifdef RTMP_RBUS_SUPPORT - ULONG CID; - ULONG CN; -#endif /* RTMP_RBUS_SUPPORT */ - - BOOLEAN HT_DisallowTKIP; /* Restrict the encryption type in 11n HT mode */ -#ifdef DOT11K_RRM_SUPPORT - BOOLEAN VoPwrConstraintTest; -#endif /* DOT11K_RRM_SUPPORT */ - - BOOLEAN HT_Disable; /* 1: disable HT function; 0: enable HT function */ - -#if defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) - USHORT lowTrafficThrd; /* Threshold for reverting to default MCS when traffic is low */ - SHORT TrainUpRuleRSSI; /* If TrainUpRule=2 then use Hybrid rule when RSSI < TrainUpRuleRSSI */ - USHORT TrainUpLowThrd; /* QuickDRS Hybrid train up low threshold */ - USHORT TrainUpHighThrd; /* QuickDRS Hybrid train up high threshold */ - BOOLEAN TrainUpRule; /* QuickDRS train up criterion: 0=>Throughput, 1=>PER, 2=> Throughput & PER */ -#endif /* defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) */ - -#ifdef STREAM_MODE_SUPPORT -#define STREAM_MODE_STA_NUM 4 - - UCHAR StreamMode; /* 0=disabled, 1=enable for 1SS, 2=enable for 2SS, 3=enable for 1,2SS */ - UCHAR StreamModeMac[STREAM_MODE_STA_NUM][MAC_ADDR_LEN]; - UINT16 StreamModeMCS; /* Bit map for enabling Stream Mode based on MCS */ -#endif /* STREAM_MODE_SUPPORT */ - -#ifdef DOT11_N_SUPPORT -#ifdef TXBF_SUPPORT - ULONG ITxBfTimeout; - ULONG ETxBfTimeout; - ULONG ETxBfEnCond; /* Enable sending of sounding and beamforming */ - ULONG MUTxRxEnable; /* Enable MUTxRxEnable */ - BOOLEAN ETxBfNoncompress; /* Force non-compressed Sounding Response */ - BOOLEAN ETxBfIncapable; /* Report Incapable of BF in TX BF Capabilities */ -#ifdef TXBF_DYNAMIC_DISABLE - UINT_8 ucAutoSoundingCtrl; /* Initial AutoSoundingCtrl for rStaRecBf */ -#endif /* TXBF_DYNAMIC_DISABLE */ -#endif /* TXBF_SUPPORT */ -#endif /* DOT11_N_SUPPORT */ - -#ifdef RTMP_MAC_PCI - BOOLEAN bPCIeBus; /* The adapter runs over PCIe bus */ -#endif /* RTMP_MAC_PCI */ - -#ifdef WSC_INCLUDED - BOOLEAN WscPBCOverlap; - WSC_STA_PBC_PROBE_INFO WscStaPbcProbeInfo; -#endif /* WSC_INCLUDED */ - -#ifdef CONFIG_ZTE_RADIO_ONOFF - BOOLEAN bRadioEnable; -#endif /* CONFIG_ZTE_RADIO_ONOFF */ - -#ifdef MICROWAVE_OVEN_SUPPORT - MO_CFG_STRUCT - MO_Cfg; /* data structure for mitigating microwave interference */ -#endif /* MICROWAVE_OVEN_SUPPORT */ - - /* TODO: need to integrate with MICROWAVE_OVEN_SUPPORT */ -#ifdef DYNAMIC_VGA_SUPPORT - LNA_VGA_CTL_STRUCT lna_vga_ctl; -#endif /* DYNAMIC_VGA_SUPPORT */ -#ifdef RTMP_UDMA_SUPPORT - BOOLEAN bUdmaFlag; - UCHAR UdmaPortNum; -#endif /*RTMP_UDMA_SUPPORT*/ - BOOLEAN bStopReadTemperature; /* avoid race condition between FW/driver */ - BOOLEAN bTXRX_RXV_ON; - BOOLEAN ManualTxop; - ULONG ManualTxopThreshold; - UCHAR ManualTxopUpBound; - UCHAR ManualTxopLowBound; -#ifdef REDUCE_TCP_ACK_SUPPORT - UINT32 ReduceAckEnable; - UINT32 ReduceAckProbability; - UINT32 ReduceAckTimeout; - UINT32 ReduceAckCnxTimeout; -#endif -#ifdef WHNAT_SUPPORT - BOOLEAN whnat_en; -#endif /*WHNAT_SUPPORT*/ - UCHAR need_fallback; -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - BOOLEAN bCh144Enabled; -#endif - BOOLEAN set_ch_async_flag; /* it's an indicator which means "set channel process" is asynchronous (need csa event from FW)*/ - RTMP_OS_COMPLETION set_ch_aync_done; - BOOLEAN iwpriv_event_flag; /* it's an indicator, standing for an iwpriv event */ -} COMMON_CONFIG, *PCOMMON_CONFIG; - -#ifdef CFG_TDLS_SUPPORT -typedef struct _CFG_TDLS_STRUCT { - /* For TPK handshake */ - UCHAR ANonce[32]; /* Generated in Message 1, random variable */ - UCHAR SNonce[32]; /* Generated in Message 2, random variable */ - ULONG KeyLifetime; /* Use type= 'Key Lifetime Interval' unit: Seconds, min lifetime = 300 seconds */ - UCHAR TPK[LEN_PMK]; /* TPK-KCK(16 bytes) for MIC + TPK-TP (16 bytes) for data */ - UCHAR TPKName[LEN_PMK_NAME]; - BOOLEAN IneedKey; - BOOLEAN bCfgTDLSCapable; /* 0:disable TDLS, 1:enable TDLS ; using supplicant sm */ - BOOLEAN TdlsChSwitchSupp; - BOOLEAN TdlsPsmSupp; - - UINT8 TdlsLinkCount; - UINT8 TdlsDialogToken; - CFG_TDLS_ENTRY TDLSEntry[MAX_NUM_OF_CFG_TDLS_ENTRY]; - /* Channel Switch */ - UCHAR CHSWPeerMacAddr[MAC_ADDR_LEN]; - BOOLEAN bDoingPeriodChannelSwitch; - BOOLEAN IamInOffChannel; - USHORT ChSwitchTime; - USHORT ChSwitchTimeout; - UINT BaseChannelStayTime; - UINT OffChannelStayTime; - RALINK_TIMER_STRUCT BaseChannelSwitchTimer; /* Use to channel switch */ - USHORT BaseChannel; - USHORT BaseChannelBW; - USHORT OrigTargetOffChannel; - USHORT TargetOffChannel; - USHORT TargetOffChannelBW; - USHORT TargetOffChannelExt; - BOOLEAN bChannelSwitchInitiator; - BOOLEAN IsentCHSW; -} CFG_TDLS_STRUCT, *PCFG_TDLS_STRUCT; -#endif /* CFG_TDLS_SUPPORT */ - -#if defined(APCLI_CFG80211_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT) -typedef struct _WPA_SUPPLICANT_INFO { - /* - 802.1x WEP + MD5 will set key to driver before assoc, but we need to apply the key to - ASIC after get EAPOL-Success frame, so we use this flag to indicate that - */ - BOOLEAN IEEE8021x_required_keys; - CIPHER_KEY DesireSharedKey[4]; /* Record user desired WEP keys */ - UCHAR DesireSharedKeyId; - - /* 0x00: driver ignores wpa_supplicant */ - /* 0x01: wpa_supplicant initiates scanning and AP selection */ - /* 0x02: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters */ - /* 0x80: wpa_supplicant trigger driver to do WPS */ - UCHAR WpaSupplicantUP; - UCHAR WpaSupplicantScanCount; - BOOLEAN bRSN_IE_FromWpaSupplicant; - BOOLEAN bLostAp; - UCHAR *pWpsProbeReqIe; - UINT WpsProbeReqIeLen; - UCHAR *pWpaAssocIe; - UINT WpaAssocIeLen; -#ifdef CFG_TDLS_SUPPORT - CFG_TDLS_STRUCT CFG_Tdls_info; -#endif -} WPA_SUPPLICANT_INFO; -#endif /* WPA_SUPPLICANT_SUPPORT || APCLI_CFG80211_SUPPORT */ - -#ifdef RTMP_RBUS_SUPPORT -#ifdef VIDEO_TURBINE_SUPPORT -/* Video Mode related configuration */ -typedef struct _AP_VIDEO_CONFIG { - BOOLEAN Enable; - BOOLEAN ClassifierEnable; - BOOLEAN HighTxMode; - UCHAR TxPwr; - BOOLEAN VideoMCSEnable; - UCHAR VideoMCS; - UCHAR TxBASize; - BOOLEAN TxLifeTimeMode; /* 1: Packet Life Time mode, 0: Retry Limit mode */ - UCHAR TxLifeTime; - UINT16 TxRetryLimit; -} AP_VIDEO_STRUCT, *PAP_VIDEO_STRUCT; - -#endif /* VIDEO_TURBINE_SUPPORT */ -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -/*************************************************************************** - * AP related data structures - **************************************************************************/ -/* AUTH-RSP State Machine Aux data structure */ -typedef struct _AP_MLME_AUX { - UCHAR Addr[MAC_ADDR_LEN]; - USHORT Alg; - CHAR Challenge[CIPHER_TEXT_LEN]; -} AP_MLME_AUX, *PAP_MLME_AUX; -#endif /* CONFIG_AP_SUPPORT */ - -typedef struct _STA_TR_ENTRY { - UINT32 EntryType; - struct wifi_dev *wdev; - - UCHAR wcid; - /* - func_tb_idx used to indicate following index: - in ApCfg.ApCliTab - in pAd->MeshTab - in WdsTab.MacTab - */ - - UCHAR func_tb_idx; - UCHAR Addr[MAC_ADDR_LEN]; - /* - Tx Info - */ - USHORT NonQosDataSeq; - USHORT TxSeq[NUM_OF_TID]; - - QUEUE_HEADER tx_queue[WMM_QUE_NUM]; - QUEUE_HEADER ps_queue; - UINT enqCount; - UINT TokenCount[WMM_QUE_NUM]; - INT ps_qbitmap; - UCHAR ps_state; - UCHAR retrieve_start_state; - UCHAR token_enq_all_fail; - - BOOLEAN tx_pend_for_agg[WMM_QUE_NUM]; - NDIS_SPIN_LOCK txq_lock[WMM_QUE_NUM]; - NDIS_SPIN_LOCK ps_queue_lock; - NDIS_SPIN_LOCK ps_sync_lock; - - UINT deq_cnt; - UINT deq_bytes; - ULONG PsQIdleCount; - - BOOLEAN enq_cap; - BOOLEAN deq_cap; - - /* - STA status - */ - - UCHAR bssid[MAC_ADDR_LEN]; - BOOLEAN bIAmBadAtheros; /* Flag if this is Atheros chip that has IOT problem. We need to turn on RTS/CTS protection. */ - BOOLEAN isCached; - UCHAR PortSecured; - UCHAR PsMode; - UCHAR FlgPsModeIsWakeForAWhile; /* wake up for a while until a condition */ - BOOLEAN LockEntryTx; /* TRUE = block to WDS Entry traffic, FALSE = not. */ - - UCHAR CurrTxRate; - -#ifdef VENDOR_FEATURE1_SUPPORT - /* total 128B, use UINT32 to avoid alignment problem */ - UINT32 HeaderBuf - [32]; /* (total 128B) TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP */ - UCHAR HdrPadLen; /* padding length*/ - UCHAR MpduHeaderLen; /* 802.11 header + LLC/SNAP not including padding */ - UCHAR wifi_hdr_len; /* 802.11 header */ - UINT16 Protocol; -#endif /* VENDOR_FEATURE1_SUPPORT */ - -#ifdef DOT11_N_SUPPORT - UINT32 CachedBuf[16]; /* UINT (4 bytes) for alignment */ - - USHORT RXBAbitmap; /* fill to on-chip RXWI_BA_BITMASK in 8.1.3RX attribute entry format */ - USHORT TXBAbitmap; /* This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI */ - USHORT tx_amsdu_bitmap; - USHORT TXAutoBAbitmap; - USHORT BADeclineBitmap; - USHORT BARecWcidArray - [NUM_OF_TID]; /* The mapping wcid of recipient session. if RXBAbitmap bit is masked */ - USHORT BAOriWcidArray - [NUM_OF_TID]; /* The mapping wcid of originator session. if TXBAbitmap bit is masked */ - USHORT BAOriSequence - [NUM_OF_TID]; /* The mapping wcid of originator session. if TXBAbitmap bit is masked */ - - UCHAR MpduDensity; - UCHAR MaxRAmpduFactor; - UCHAR AMsduSize; - UCHAR MmpsMode; /* MIMO power save mode. */ -#endif /* DOT11_N_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - BOOLEAN bReptCli; - BOOLEAN bReptEthCli; - UCHAR MatchReptCliIdx; - UCHAR ReptCliAddr[MAC_ADDR_LEN]; - ULONG ReptCliIdleCount; -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef TXBF_SUPPORT - UCHAR TxSndgType; - NDIS_SPIN_LOCK TxSndgLock; - - /* ETxBF */ - UCHAR bfState; - UCHAR sndgMcs; - UCHAR sndgBW; - UCHAR sndg0Mcs; - INT sndg0Snr0, sndg0Snr1, sndg0Snr2; - -#ifdef ETXBF_EN_COND3_SUPPORT - UCHAR bestMethod; - UCHAR sndgRateIdx; - UCHAR bf0Mcs, sndg0RateIdx, bf0RateIdx; - UCHAR sndg1Mcs, bf1Mcs, sndg1RateIdx, bf1RateIdx; - INT sndg1Snr0, sndg1Snr1, sndg1Snr2; -#endif /* ETXBF_EN_COND3_SUPPORT */ - UCHAR noSndgCnt; - UCHAR eTxBfEnCond; - UCHAR noSndgCntThrd, ndpSndgStreams; - UCHAR iTxBfEn; - RALINK_TIMER_STRUCT eTxBfProbeTimer; - - BOOLEAN phyETxBf; /* True=>Set ETxBF bit in PHY rate */ - BOOLEAN phyITxBf; /* True=>Set ITxBF bit in PHY rate */ - UCHAR lastNonBfRate; /* Last good non-BF rate */ - BOOLEAN lastRatePhyTxBf; /* For Quick Check. True if last rate was BF */ - USHORT BfTxQuality[MAX_TX_RATE_INDEX + 1]; /* Beamformed TX Quality */ - - COUNTER_TXBF TxBFCounters; /* TxBF Statistics */ - UINT LastETxCount; /* Used to compute %BF statistics */ - UINT LastITxCount; - UINT LastTxCount; -#endif /* TXBF_SUPPORT */ - -#ifdef VHT_TXBF_SUPPORT - UINT8 snd_dialog_token; -#ifdef SOFT_SOUNDING - BOOLEAN snd_reqired; - HTTRANSMIT_SETTING snd_rate; -#endif /* SOFT_SOUNDING */ -#endif /* VHT_TXBF_SUPPORT */ - - /* - Statistics related parameters - */ - UINT32 ContinueTxFailCnt; - ULONG TimeStamp_toTxRing; - ULONG NoDataIdleCount; - -#ifdef CONFIG_AP_SUPPORT - LARGE_INTEGER TxPackets; - LARGE_INTEGER RxPackets; - ULONG TxBytes; - ULONG RxBytes; -#endif /* CONFIG_AP_SUPPORT */ - ULONG one_sec_tx_pkts; - ULONG avg_tx_pkts; - UINT8 previous_amsdu_state[NUM_OF_UP]; - INT previous_sn[NUM_OF_UP]; - INT cacheSn[NUM_OF_UP]; -#ifdef MT_SDIO_ADAPTIVE_TC_RESOURCE_CTRL -#if TC_PAGE_BASED_DEMAND - INT32 TotalPageCount[WMM_QUE_NUM]; -#endif -#endif - /* - Used to ignore consecutive PS poll. - set: when we get a PS poll. - clear: when a PS data is sent or two period passed. - */ - UINT8 PsDeQWaitCnt; - - UINT8 OmacIdx; - struct _STA_REC_CTRL_T StaRec; - -#ifdef DBG_AMSDU -#define TIME_SLOT_NUMS 10 - UINT32 amsdu_1; - UINT32 amsdu_1_rec[TIME_SLOT_NUMS]; - UINT32 amsdu_2; - UINT32 amsdu_2_rec[TIME_SLOT_NUMS]; - UINT32 amsdu_3; - UINT32 amsdu_3_rec[TIME_SLOT_NUMS]; - UINT32 amsdu_4; - UINT32 amsdu_4_rec[TIME_SLOT_NUMS]; -#endif - UINT16 token_cnt; -#ifdef FQ_SCH_SUPPORT - struct fq_stainfo_type fq_sta_rec; -#endif -} STA_TR_ENTRY; - -#ifdef OCE_SUPPORT -#ifdef OCE_FILS_SUPPORT -struct fils_info { - UINT16 last_pending_id; - UCHAR *pending_ie; - UINT pending_ie_len; - UCHAR *extra_ie; - UINT extra_ie_len; - struct raw_rssi_info rssi_info; - - UCHAR auth_algo; - - UCHAR PTK[80]; - UCHAR PTK_len; - - INT16 status; - BOOLEAN is_pending_auth; - BOOLEAN is_pending_assoc; - BOOLEAN is_pending_decrypt; - BOOLEAN is_pending_encrypt; - BOOLEAN is_post_assoc; - - VOID (*pending_action)(PRTMP_ADAPTER pAd, MLME_QUEUE_ELEM *Elem); - VOID(*pending_decrypt) - (PRTMP_ADAPTER pAd, struct _MAC_TABLE_ENTRY *pEntry, - struct _SECURITY_CONFIG *pSecConfig, MLME_QUEUE_ELEM *Elem); -}; -#endif /* OCE_FILS_SUPPORT */ -struct oce_info { - INT8 DeltaAssocRSSI; -}; - -typedef union GNU_PACKED _ESP_INFO { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT32 None : 8; /* bit 24 ~ 31 */ - UINT32 DataPPDUDurationTarget : 8; /* bit 16 ~ 23 */ - UINT32 EstimatedAirTimeFraction : 8; /* bit 8 ~ 15 */ - UINT32 BAWinSize : 3; /* bit 5 ~ 7 */ - UINT32 DataFormat : 2; /* bit 3 ~ 4 */ - UINT32 Reserved : 1; /* bit 2 */ - UINT32 ACI : 2; /* bit 0 ~ 1 */ - /* ------------------------------------- */ - /* ACI AC Access Category */ - /* ------------------------------------- */ - /* 00 AC_BE Best Effort */ - /* 01 AC_BK Background */ - /* 10 AC_VI Video */ - /* 11 AC_VO Voice */ - /* ------------------------------------- */ -#else - UINT32 ACI : 2; /* bit 0 ~ 1 */ - /* ------------------------------------- */ - /* ACI AC Access Category */ - /* ------------------------------------- */ - /* 00 AC_BE Best Effort */ - /* 01 AC_BK Background */ - /* 10 AC_VI Video */ - /* 11 AC_VO Voice */ - /* ------------------------------------- */ - UINT32 Reserved : 1; /* bit 2 */ - UINT32 DataFormat : 2; /* bit 3 ~ 4 */ - UINT32 BAWinSize : 3; /* bit 5 ~ 7 */ - UINT32 EstimatedAirTimeFraction : 8; /* bit 8 ~ 15 */ - UINT32 DataPPDUDurationTarget : 8; /* bit 16 ~ 23 */ - UINT32 None : 8; /* bit 24 ~ 31 */ -#endif /* RT_BIG_ENDIAN */ - } field; - UINT32 word; -} ESP_INFO, *PESP_INFO; - -#endif /* OCE_SUPPORT */ - -#ifdef HOSTAPD_11R_SUPPORT -typedef struct _AUTH_FRAME_INFO { - UCHAR addr1[MAC_ADDR_LEN]; - UCHAR addr2[MAC_ADDR_LEN]; - USHORT auth_alg; - USHORT auth_seq; - USHORT auth_status; - CHAR Chtxt[CIPHER_TEXT_LEN]; -#ifdef DOT11R_FT_SUPPORT - FT_INFO FtInfo; -#endif /* DOT11R_FT_SUPPORT */ -} AUTH_FRAME_INFO; -#endif /* HOSTAPD_11R_SUPPORT */ - -typedef struct _RADIUS_ACCOUNT_ENTRY { - BOOLEAN occupied; - UCHAR Addr[MAC_ADDR_LEN]; - struct wifi_dev *wdev; - HTTRANSMIT_SETTING HTPhyMode; - RSSI_SAMPLE RssiSample; - ULONG TxBytes; - ULONG RxBytes; - LARGE_INTEGER TxPackets; - LARGE_INTEGER RxPackets; - ULONG NoDataIdleCount; -} RADIUS_ACCOUNT_ENTRY, *PRADIUS_ACCOUNT_ENTRY; - -typedef struct _MAC_TABLE_ENTRY { - UINT32 EntryType; - UINT32 EntryState; - struct wifi_dev *wdev; - PVOID pAd; - struct _MAC_TABLE_ENTRY *pNext; - - /* - A bitmap of BOOLEAN flags. each bit represent an operation status of a particular - BOOLEAN control, either ON or OFF. These flags should always be accessed via - CLIENT_STATUS_TEST_FLAG(), CLIENT_STATUS_SET_FLAG(), CLIENT_STATUS_CLEAR_FLAG() macros. - see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition. fCLIENT_STATUS_AMSDU_INUSED - */ - ULONG ClientStatusFlags; - ULONG cli_cap_flags; - - HTTRANSMIT_SETTING HTPhyMode, - MaxHTPhyMode; /* For transmit phy setting in TXWI. */ - HTTRANSMIT_SETTING MinHTPhyMode; -#ifdef CUSTOMER_DCC_FEATURE - HTTRANSMIT_SETTING LastTransmitRate; -#endif -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE - INT16 CurRssi; /* Current Average RSSI */ -#endif - - /* - wcid: - - tr_tb_idx: - - func_tb_idx used to indicate following index: - in ApCfg.ApCliTab - in pAd->MeshTab - in WdsTab.MacTab - - apidx: should remove this - */ -#ifdef OCE_SUPPORT -#ifdef OCE_FILS_SUPPORT - struct fils_info filsInfo; -#endif /* OCE_FILS_SUPPORT */ - struct oce_info oceInfo; -#endif /* OCE_SUPPORT */ - - UCHAR wcid; - UCHAR tr_tb_idx; - UCHAR func_tb_idx; - UCHAR apidx; /* MBSS number */ - - BOOLEAN isRalink; - BOOLEAN bIAmBadAtheros; /* Flag if this is Atheros chip that has IOT problem. We need to turn on RTS/CTS protection. */ - -#ifdef MBO_SUPPORT - BOOLEAN bIndicateNPC; - BOOLEAN bIndicateCDC; - BOOLEAN bindicate_NPC_event; - BOOLEAN bindicate_CDC_event; - MBO_STA_CH_PREF_CDC_INFO MboStaInfoNPC; - MBO_STA_CH_PREF_CDC_INFO MboStaInfoCDC; -#endif /* MBO_SUPPORT */ -#ifdef A4_CONN - UCHAR a4_entry; /* Determine if this entry act which A4 role */ -#endif /* A4_CONN */ - -#ifdef DYNAMIC_VLAN_SUPPORT - UINT32 vlan_id; -#endif - -#ifdef MBSS_AS_WDS_AP_SUPPORT - BOOLEAN bEnable4Addr; -#endif -#ifdef RADIUS_MAC_AUTH_SUPPORT - BOOLEAN bAllowTraffic; -#endif /* RADIUS_MAC_AUTH_SUPPORT */ - - UCHAR Addr[MAC_ADDR_LEN]; -#ifdef CONFIG_AP_SUPPORT - BSS_STRUCT *pMbss; -#ifdef APCLI_SUPPORT - PVOID pApCli; -#ifdef ROAMING_ENHANCE_SUPPORT - BOOLEAN bRoamingRefreshDone; -#endif /* ROAMING_ENHANCE_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - - /* - STATE MACHINE Status - */ - USHORT Aid; /* in range 1~2007, with bit 14~15 = b'11, e.g., 0xc001~0xc7d7 */ - SST Sst; - AUTH_STATE - AuthState; /* for SHARED KEY authentication state machine used only */ - - /* Rx status related parameters */ - RSSI_SAMPLE RssiSample; - UINT32 LastTxRate; - UINT32 LastRxRate; -#ifdef CONFIG_MAP_SUPPORT - UINT32 map_LastTxRate; - UINT32 map_LastRxRate; -#endif - SHORT freqOffset; /* Last RXWI FOFFSET */ - SHORT freqOffsetValid; /* Set when freqOffset field has been updated */ - -#ifdef AIR_MONITOR - UCHAR mnt_idx[BAND_NUM]; - UCHAR mnt_band; -#endif /* AIR_MONITOR */ - - /* WPA/WPA2 4-way database */ - UCHAR EnqueueEapolStartTimerRunning; /* Enqueue EAPoL-Start for triggering EAP SM */ - - struct _SECURITY_CONFIG SecConfig; - UCHAR RSNIE_Len; - UCHAR RSN_IE[MAX_LEN_OF_RSNIE]; - UCHAR CMTimerRunning; - NDIS_802_11_PRIVACY_FILTER - PrivacyFilter; /* PrivacyFilter enum for 802.1X */ - - UCHAR bssid[MAC_ADDR_LEN]; - BOOLEAN IsReassocSta; /* Indicate whether this is a reassociation procedure */ - ULONG NoDataIdleCount; -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - ULONG LastRxTimeCount; -#endif - ULONG AssocDeadLine; - UINT16 StationKeepAliveCount; /* unit: second */ - USHORT CapabilityInfo; - UCHAR PsMode; - UCHAR FlgPsModeIsWakeForAWhile; /* wake up for a while until a condition */ - UCHAR VirtualTimeout; /* peer power save virtual timeout */ - -#ifdef WDS_SUPPORT - BOOLEAN LockEntryTx; /* TRUE = block to WDS Entry traffic, FALSE = not. */ -#endif /* WDS_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - BOOLEAN bReptCli; - BOOLEAN bReptEthCli; - BOOLEAN bReptEthBridgeCli; - UCHAR MatchReptCliIdx; - UCHAR ReptCliAddr[MAC_ADDR_LEN]; - ULONG ReptCliIdleCount; -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - - UINT32 StaConnectTime; /* the live time of this station since associated with AP */ - UINT32 StaIdleTimeout; /* idle timeout per entry */ - -#ifdef UAPSD_SUPPORT - /* these UAPSD states are used on the fly */ - /* 0:AC_BK, 1:AC_BE, 2:AC_VI, 3:AC_VO */ - BOOLEAN bAPSDCapablePerAC[4]; /* for trigger-enabled */ - BOOLEAN bAPSDDeliverEnabledPerAC[4]; /* for delivery-enabled */ - - UCHAR MaxSPLength; - - BOOLEAN bAPSDAllAC; /* 1: all AC are delivery-enabled U-APSD */ - - QUEUE_HEADER UAPSDQueue[WMM_NUM_OF_AC]; /* queue for each U-APSD */ - USHORT UAPSDQIdleCount; /* U-APSD queue timeout */ - - PQUEUE_ENTRY pUAPSDEOSPFrame; /* the last U-APSD frame */ - USHORT UAPSDTxNum; /* total U-APSD frame number */ - BOOLEAN bAPSDFlagEOSPOK; /* 1: EOSP frame is tx by ASIC */ - BOOLEAN bAPSDFlagSPStart; /* 1: SP is started */ - - /* need to use unsigned long, because time parameters in OS is defined as - unsigned long */ - unsigned long UAPSDTimeStampLast; /* unit: 1000000/OS_HZ */ - BOOLEAN bAPSDFlagSpRoughUse; /* 1: use rough SP (default: accurate) */ - - /* we will set the flag when PS-poll frame is received and - clear it when statistics handle. - if the flag is set when PS-poll frame is received then calling - statistics handler to clear it. */ - BOOLEAN bAPSDFlagLegacySent; /* 1: Legacy PS sent but yet statistics handle */ - -#endif /* UAPSD_SUPPORT */ - -#ifdef STREAM_MODE_SUPPORT - UINT32 StreamModeMACReg; /* MAC reg used to control stream mode for this client. 0=>No stream mode */ -#endif /* STREAM_MODE_SUPPORT */ - - UINT FIFOCount; - UINT DebugFIFOCount; - UINT DebugTxCount; - -#ifdef DOT11_N_SUPPORT - USHORT NoBADataCountDown; -#endif /* DOT11_N_SUPPORT */ - - /* ==================================================== */ - enum RATE_ADAPT_ALG rateAlg; - /* TODO: shiang-usw, use following parameters to replace "RateLen/MaxSupportedRate" */ - UCHAR RateLen; - UCHAR MaxSupportedRate; - - BOOLEAN bAutoTxRateSwitch; - UCHAR CurrTxRate; - UCHAR CurrTxRateIndex; - UCHAR lastRateIdx; - UCHAR *pTable; /* Pointer to this entry's Tx Rate Table */ - -#ifdef NEW_RATE_ADAPT_SUPPORT - UCHAR lowTrafficCount; - UCHAR fewPktsCnt; - BOOLEAN perThrdAdj; - UCHAR mcsGroup; /* the mcs group to be tried */ -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#ifdef AGS_SUPPORT - AGS_CONTROL AGSCtrl; /* AGS control */ -#endif /* AGS_SUPPORT */ - - /* to record the each TX rate's quality. 0 is best, the bigger the worse. */ - USHORT TxQuality[MAX_TX_RATE_INDEX + 1]; - BOOLEAN fLastSecAccordingRSSI; - UCHAR LastSecTxRateChangeAction; /* 0: no change, 1:rate UP, 2:rate down */ - CHAR LastTimeTxRateChangeAction; /* Keep last time value of LastSecTxRateChangeAction */ - ULONG LastTxOkCount; /* TxSuccess count in last Rate Adaptation interval */ - UCHAR LastTxPER; /* Tx PER in last Rate Adaptation interval */ - UCHAR PER[MAX_TX_RATE_INDEX + 1]; - UINT32 CurrTxRateStableTime; /* # of second in current TX rate */ - UCHAR TxRateUpPenalty; /* extra # of second penalty due to last unstable condition */ - - BOOLEAN fgGband256QAMSupport; - UCHAR SupportRateMode; /* 1: CCK 2:OFDM 4: HT, 8:VHT */ - UINT8 SupportCCKMCS; - UINT8 SupportOFDMMCS; -#ifdef DOT11_N_SUPPORT - UINT32 SupportHTMCS; -#ifdef DOT11_VHT_AC - UINT16 SupportVHTMCS1SS; - UINT16 SupportVHTMCS2SS; - UINT16 SupportVHTMCS3SS; - UINT16 SupportVHTMCS4SS; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - -#ifdef PEER_DELBA_TX_ADAPT - BOOLEAN bPeerDelBaTxAdaptEn; -#endif /* PEER_DELBA_TX_ADAPT */ - -#ifdef MFB_SUPPORT - UCHAR lastLegalMfb; /* last legal mfb which is used to set rate */ - BOOLEAN isMfbChanged; /* purpose: true when mfb has changed but the new mfb is not adopted for Tx */ - struct _RTMP_RA_LEGACY_TB *LegalMfbRS; - BOOLEAN fLastChangeAccordingMfb; - NDIS_SPIN_LOCK fLastChangeAccordingMfbLock; - /* Tx MRQ */ - BOOLEAN toTxMrq; - UCHAR msiToTx, - mrqCnt; /*mrqCnt is used to count down the inverted-BF mrq to be sent */ - /* Rx mfb */ - UCHAR pendingMfsi; - /* Tx MFB */ - BOOLEAN toTxMfb; - UCHAR mfbToTx; - UCHAR mfb0, mfb1; -#endif /* MFB_SUPPORT */ -#ifdef TXBF_SUPPORT - UCHAR TxSndgType; - NDIS_SPIN_LOCK TxSndgLock; - - /* ETxBF */ - UCHAR bfState; - UCHAR sndgMcs; - UCHAR sndgBW; - UCHAR sndg0Mcs; - INT sndg0Snr0, sndg0Snr1, sndg0Snr2; - -#ifdef ETXBF_EN_COND3_SUPPORT - UCHAR bestMethod; - UCHAR sndgRateIdx; - UCHAR bf0Mcs, sndg0RateIdx, bf0RateIdx; - UCHAR sndg1Mcs, bf1Mcs, sndg1RateIdx, bf1RateIdx; - INT sndg1Snr0, sndg1Snr1, sndg1Snr2; -#endif /* ETXBF_EN_COND3_SUPPORT */ - UCHAR noSndgCnt; - UCHAR eTxBfEnCond; - UCHAR noSndgCntThrd, ndpSndgStreams; - UCHAR iTxBfEn; - RALINK_TIMER_STRUCT eTxBfProbeTimer; - - BOOLEAN phyETxBf; /* True=>Set ETxBF bit in PHY rate */ - BOOLEAN phyITxBf; /* True=>Set ITxBF bit in PHY rate */ - UCHAR lastNonBfRate; /* Last good non-BF rate */ - BOOLEAN lastRatePhyTxBf; /* For Quick Check. True if last rate was BF */ - USHORT BfTxQuality[MAX_TX_RATE_INDEX + 1]; /* Beamformed TX Quality */ - - COUNTER_TXBF TxBFCounters; /* TxBF Statistics */ - UINT LastETxCount; /* Used to compute %BF statistics */ - UINT LastITxCount; - UINT LastTxCount; - -#ifdef MT_MAC - VENDOR_BF_SETTING rStaBfRecVendorUpdate; - TXBF_PFMU_STA_INFO rStaRecBf; -#endif - -#endif /* TXBF_SUPPORT */ - -#ifdef VHT_TXBF_SUPPORT - UINT8 snd_dialog_token; -#ifdef SOFT_SOUNDING - BOOLEAN snd_reqired; - HTTRANSMIT_SETTING snd_rate; -#endif /* SOFT_SOUNDING */ -#endif /* VHT_TXBF_SUPPORT */ - - UINT32 OneSecTxNoRetryOkCount; - UINT32 OneSecTxRetryOkCount; - UINT32 OneSecTxFailCount; - UINT32 OneSecRxLGICount; /* unicast-to-me Long GI count */ - UINT32 OneSecRxSGICount; /* unicast-to-me Short GI count */ - UINT32 ContinueTxFailCnt; - ULONG TimeStamp_toTxRing; - - /*==================================================== */ - EXT_CAP_INFO_ELEMENT ext_cap; - struct _vendor_ie_cap vendor_ie; -#ifdef DOT11_N_SUPPORT - HT_CAPABILITY_IE HTCapability; - - USHORT RXBAbitmap; /* fill to on-chip RXWI_BA_BITMASK in 8.1.3RX attribute entry format */ - USHORT TXBAbitmap; /* This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI */ - USHORT tx_amsdu_bitmap; - USHORT TXAutoBAbitmap; - USHORT BADeclineBitmap; - USHORT BARecWcidArray - [NUM_OF_TID]; /* The mapping wcid of recipient session. if RXBAbitmap bit is masked */ - USHORT BAOriWcidArray - [NUM_OF_TID]; /* The mapping wcid of originator session. if TXBAbitmap bit is masked */ - USHORT BAOriSequence - [NUM_OF_TID]; /* The mapping wcid of originator session. if TXBAbitmap bit is masked */ - - UCHAR MpduDensity; - UCHAR MaxRAmpduFactor; - UCHAR AMsduSize; - UINT32 amsdu_limit_len; - UINT32 amsdu_limit_len_adjust; - UCHAR MmpsMode; /* MIMO power save mode. */ - -#ifdef DOT11N_DRAFT3 - UCHAR BSS2040CoexistenceMgmtSupport; - BOOLEAN bForty_Mhz_Intolerant; -#endif /* DOT11N_DRAFT3 */ - -#ifdef DOT11_VHT_AC - VHT_CAP_IE vht_cap_ie; - - /* only take effect if ext_cap.operating_mode_notification = 1 */ - BOOLEAN force_op_mode; - OPERATING_MODE operating_mode; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - -#ifdef CONFIG_DOT11V_WNM - UCHAR BssTransitionManmtSupport; -#endif /* CONFIG_DOT11V_WNM */ - - BOOLEAN bWscCapable; - UCHAR Receive_EapolStart_EapRspId; - - UINT32 TXMCSExpected[MAX_MCS_SET]; - UINT32 TXMCSSuccessful[MAX_MCS_SET]; - UINT32 TXMCSFailed[MAX_MCS_SET]; - UINT32 TXMCSAutoFallBack[MAX_MCS_SET][MAX_MCS_SET]; - -#ifdef DOT11R_FT_SUPPORT - FT_MDIE_INFO MdIeInfo; - FT_FTIE_INFO FtIeInfo; - - UINT8 InitialMDIE[5]; - UINT8 InitialFTIE[256]; - UINT InitialFTIE_Len; - - UCHAR FT_PMK_R0[32]; - UCHAR FT_PMK_R0_NAME[16]; - UCHAR FT_PMK_R1[32]; - UCHAR FT_PMK_R1_NAME[16]; - UCHAR PTK_NAME[16]; - - UCHAR FT_UCipher[4]; - UCHAR FT_Akm[4]; - UCHAR FT_PTK[LEN_MAX_PTK]; /* 512 bits max, KCK(16)+KEK(16)+TK(32) */ - UCHAR FT_Status; - UCHAR FT_R1kh_CacheMiss_Times; - -#ifdef R1KH_HARD_RETRY - UCHAR FT_R1kh_CacheMiss_Hard; - RTMP_OS_COMPLETION ack_r1kh; -#endif /* R1KH_HARD_RETRY */ - -#ifdef HOSTAPD_11R_SUPPORT - AUTH_FRAME_INFO auth_info_resp; -#endif - -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT - RRM_EN_CAP_IE RrmEnCap; -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef CONFIG_MAP_SUPPORT - UCHAR assoc_req_frame[ASSOC_REQ_LEN_MAX]; - USHORT assoc_req_len; - UCHAR DevPeerRole; - UCHAR cur_rssi_status; - UCHAR pre_rssi_status; - BOOLEAN isTriggerSteering; - UCHAR pre_traffic_mode; -#ifdef MAP_R2 - UCHAR profile; - UINT32 TxRxTime[4][2]; - UINT32 wrapArTxRxTime[4][2]; -#endif - UINT32 TxBytesMAP; - UINT32 RxBytesMAP; -#endif - -#ifdef CONFIG_AP_SUPPORT - LARGE_INTEGER TxPackets; - LARGE_INTEGER RxPackets; -#ifdef TXRX_STAT_SUPPORT - LARGE_INTEGER TxDataPacketCount; - LARGE_INTEGER TxDataPacketByte; - LARGE_INTEGER TxUnicastPktCount; - LARGE_INTEGER TxDataPacketCount1SecValue; - LARGE_INTEGER TxDataPacketByte1SecValue; - LARGE_INTEGER LastTxDataPacketCountValue; - LARGE_INTEGER LastTxDataPacketByteValue; - LARGE_INTEGER TxDataPacketCountPerAC[4]; /*per access category*/ - LARGE_INTEGER TxMgmtPacketCount; - LARGE_INTEGER RxDataPacketCount; - LARGE_INTEGER RxDataPacketByte; - LARGE_INTEGER RxUnicastPktCount; - LARGE_INTEGER RxUnicastByteCount; - LARGE_INTEGER RxDataPacketCount1SecValue; - LARGE_INTEGER RxDataPacketByte1SecValue; - LARGE_INTEGER LastRxDataPacketCountValue; - LARGE_INTEGER LastRxDataPacketByteValue; - LARGE_INTEGER RxDataPacketCountPerAC[4]; /*per access category*/ - LARGE_INTEGER RxMgmtPacketCount; - LARGE_INTEGER RxDecryptionErrorCount; - LARGE_INTEGER RxMICErrorCount; - ULONG RxLastMgmtPktRate; - CHAR LastDataPktRssi[4]; - CHAR LastMgmtPktRssi[4]; - UINT32 LastOneSecTxTotalCountByWtbl; - UINT32 LastOneSecTxFailCountByWtbl; - UINT32 LastOneSecPER; - UINT32 TxSuccessByWtbl; /*data/unicast same variable, updated per sec*/ -#endif -#ifdef EAP_STATS_SUPPORT - LARGE_INTEGER mpdu_attempts; - LARGE_INTEGER mpdu_retries; - LARGE_INTEGER mpdu_low_rate_fail_cnt; - struct timeval tx_latency_min_tv; - struct timeval tx_latency_max_tv; - struct timeval tx_latency_avg_tv; -#endif /* EAP_STATS_SUPPORT */ - ULONG TxBytes; - ULONG RxBytes; -#ifdef CUSTOMER_DCC_FEATURE - UINT64 RxCount; - UINT64 TxCount; - UINT64 ReceivedByteCount; - UINT64 TransmittedByteCount; - UINT64 RxErrorCount; - UINT64 RxDropCount; - UINT64 TxErrorCount; - UINT64 TxDropCount; - UINT64 TxRetriedPktCount; - UINT64 ChannelUseTime; -#endif -#endif /* CONFIG_AP_SUPPORT */ - ULONG OneSecTxBytes; - ULONG OneSecRxBytes; - ULONG AvgTxBytes; - ULONG AvgRxBytes; - ULONG one_sec_tx_pkts; - ULONG avg_tx_pkts; - ULONG one_sec_tx_succ_pkts; - ULONG avg_rx_pkts; - ULONG one_sec_rx_pkts; - -#if defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) - UINT16 TdlsTxFailCount; - UINT32 TdlsKeyLifeTimeCount; - UCHAR MatchTdlsEntryIdx; /* indicate the index in pAd->StaCfg[0].DLSEntry */ -#endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) // */ - -#ifdef SMART_ANTENNA - UINT32 saLstTxNoRtyCnt; - UINT32 saLstTxRtyCnt; - UINT32 saLstTxFailCnt; - UCHAR *pRateTable; - UCHAR orgTxRateCol; - CHAR baseAvgRSSI[3]; - INT32 curRSSI[3]; - INT32 cntRSSI[3]; - INT32 rssi_zero_cnt[3]; - INT32 sumSNR[3]; - INT32 cntSNR[3]; - INT32 sumPreSNR[3]; - INT32 cntPreSNR[3]; - CHAR avgRssi[3]; - CHAR prevAvgRssi[3]; - CHAR avgSNR[3]; - CHAR avgPreSNR[3]; - CHAR curAvgRSSI[3]; - - UINT32 hwTxSucCnt; - UINT32 hwTxRtyCnt; - ULONG calcTime; - - UINT32 saTxCnt; - UINT32 saRxCnt; - ULONG mcsUsage[33]; - ULONG curMcsApplyTime; - CHAR mcsInUse; - - VOID *pTrainEntry; -#endif /* SMART_ANTENNA */ - - ULONG ChannelQuality; /* 0..100, Channel Quality Indication for Roaming */ -#ifdef CONFIG_HOTSPOT_R2 - UCHAR IsWNMReqValid; - UCHAR QosMapSupport; - UCHAR DscpExceptionCount; - USHORT DscpRange[8]; - USHORT DscpException[21]; - struct wnm_req_data *ReqData; - struct _sta_hs_info hs_info; - UCHAR OSEN_IE_Len; - UCHAR OSEN_IE[MAX_LEN_OF_RSNIE]; -#endif /* CONFIG_HOTSPOT_R2 */ -#if defined(CONFIG_HOTSPOT_R2) || defined(CONFIG_DOT11V_WNM) - UCHAR IsBTMReqValid; - UCHAR IsKeep; - UINT16 BTMDisassocCount; - BOOLEAN bBSSMantSTASupport; - struct btm_req_data *ReqbtmData; -#endif -#ifdef DSCP_QOS_MAP_SUPPORT - UINT8 PoolId; -#endif - - BOOLEAN bACMBit[WMM_NUM_OF_AC]; - - RA_ENTRY_INFO_T RaEntry; - RA_INTERNAL_INFO_T RaInternal; - UINT32 ConnectionType; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - UINT8 TxStatRspCnt; - UINT32 TotalTxSuccessCnt; /* Accumulated Tx success count from N9 (WTBL) */ -#endif - -#ifdef HTC_DECRYPT_IOT - UINT32 HTC_ICVErrCnt; /* keep the ICV Error cnt of HTC Rx Cnt */ - UCHAR HTC_AAD_OM_Force; /* when reach the threshold, force set the WTBL.DW2.AAD_OM to 1 */ - UINT32 HTC_AAD_OM_CountDown; /* settling time (1 count 1 second) for start count HTC_ICVErrCnt */ - UCHAR HTC_AAD_OM_Freeze; /* Treat the entry's AAD_OM setting is correct now */ -#endif /* HTC_DECRYPT_IOT */ - -#ifdef PN_UC_REPLAY_DETECTION_SUPPORT - UINT64 CCMP_UC_PN[NUM_OF_TID]; -#endif /* PN_UC_REPLAY_DETECTION_SUPPORT */ - UINT64 CCMP_BC_PN[4]; - BOOLEAN Init_CCMP_BC_PN_Passed[4]; - BOOLEAN AllowUpdateRSC; - -#ifdef HOSTAPD_11R_SUPPORT - IE_LISTS *ie_list; -#endif - -#ifdef RATE_PRIOR_SUPPORT - ULONG McsTotalRxCount; - ULONG McsLowRateRxCount; -#endif /*RATE_PRIOR_SUPPORT*/ - -#ifdef IGMP_TVM_SUPPORT - UCHAR TVMode; -#endif /* IGMP_TVM_SUPPORT */ -#ifdef APCLI_OWE_SUPPORT - BOOLEAN need_process_ecdh_ie; - EXT_ECDH_PARAMETER_IE ecdh_ie; -#endif - ULONG NoDataLastIdleCount; - USHORT KeepAliveSend; - USHORT KeepAliveSendError; - USHORT KeepAliveSendSucess; - USHORT Sta_Idle_Check_At_Sec; -} MAC_TABLE_ENTRY, *PMAC_TABLE_ENTRY; - -typedef enum _MAC_ENT_STATUS_ { - /* fAnyStationInPsm */ - MAC_TB_ANY_PSM = 0x1, - /* - fAnyStationBadAtheros - Check if any Station is atheros 802.11n Chip. We need to use RTS/CTS with Atheros 802,.11n chip. - */ - MAC_TB_ANY_ATH = 0x2, - /* - fAnyTxOPForceDisable - Check if it is necessary to disable BE TxOP - */ - MAC_TB_FORCE_TxOP = 0x4, - /* - fAllStationAsRalink - Check if all stations are ralink-chipset - */ - MAC_TB_ALL_RALINK = 0x8, - /* - fAnyStationIsLegacy - Check if I use legacy rate to transmit to my BSS Station - */ - MAC_TB_ANY_LEGACY = 0x10, - /* - fAnyStationNonGF - Check if any Station can't support GF - */ - MAC_TB_ANY_NON_GF = 0x20, - /* fAnyStation20Only */ - MAC_TB_ANY_HT20 = 0x40, - /* - fAnyStationMIMOPSDynamic - Check if any Station is MIMO Dynamic - */ - MAC_TB_ANY_MIMO_DYNAMIC = 0x80, - /* - fAnyBASession - Check if there is BA session. Force turn on RTS/CTS - */ - MAC_TB_ANY_BA = 0x100, - /* fAnyStaFortyIntolerant */ - MAC_TB_ANY_40_INTOlERANT = 0x200, - /* - fAllStationGainGoodMCS - Check if all stations more than MCS threshold - */ - MAC_TB_ALL_GOOD_MCS = 0x400, - /* - fAnyStationIsHT - Check if still has any station set the Intolerant bit on! - */ - MAC_TB_ANY_HT = 0x800, - /* fAnyWapiStation */ - MAC_TB_ANY_WAPI = 0x1000, -} MAC_ENT_STATUS; - -#define BAND_NUM_MAX 2 -typedef struct _MAC_TABLE { - MAC_TABLE_ENTRY *Hash[HASH_TABLE_SIZE]; - MAC_TABLE_ENTRY Content[MAX_LEN_OF_MAC_TABLE]; - STA_TR_ENTRY tr_entry[MAX_LEN_OF_TR_TABLE]; - /* - Be care in mgmt_entrytb.c MacTableReset() will NdisZeroMemory(&pAd->MacTab.Size, sizeof(MAC_TABLE)-offsetof(MAC_TABLE, Size)); - above need to be backup, klock's warnnig @118489 should be mark as not an issue. - */ - UINT16 Size; - QUEUE_HEADER McastPsQueue; - ULONG PsQIdleCount; - MAC_ENT_STATUS sta_status; - - BOOLEAN fAnyStationInPsm; - BOOLEAN fAnyStationBadAtheros; /* Check if any Station is atheros 802.11n Chip. We need to use RTS/CTS with Atheros 802,.11n chip. */ - BOOLEAN fAnyTxOPForceDisable; /* Check if it is necessary to disable BE TxOP */ - BOOLEAN fAllStationAsRalink - [2]; /* Check if all stations are ralink-chipset */ - BOOLEAN fCurrentStaBw40; /* Check if only one STA w/ BW40 */ -#ifdef DOT11_N_SUPPORT - BOOLEAN fAnyStationIsLegacy; /* Check if I use legacy rate to transmit to my BSS Station/ */ - BOOLEAN fAnyStationNonGF; /* Check if any Station can't support GF. */ - BOOLEAN fAnyStation20Only; /* Check if any Station can't support GF. */ - BOOLEAN fAnyStationMIMOPSDynamic; /* Check if any Station is MIMO Dynamic */ - BOOLEAN fAnyBASession; /* Check if there is BA session. Force turn on RTS/CTS */ - BOOLEAN fAnyStaFortyIntolerant; /* Check if still has any station set the Intolerant bit on! */ - BOOLEAN fAllStationGainGoodMCS; /* Check if all stations more than MCS threshold */ - -#endif /* DOT11_N_SUPPORT */ - - USHORT MsduLifeTime; /* life time for PS packet */ -#ifdef OUI_CHECK_SUPPORT - UCHAR oui_mgroup_cnt; - UINT32 repeater_wcid_error_cnt; - UINT32 repeater_bm_wcid_error_cnt; -#endif /*OUI_CHECK_SUPPORT*/ -} MAC_TABLE, *PMAC_TABLE; - -#ifdef SNIFFER_SUPPORT -#define MONITOR_MODE_OFF 0 -#define MONITOR_MODE_REGULAR_RX 1 -#define MONITOR_MODE_FULL 2 -#endif /*SNIFFER_SUPPORT*/ - -typedef struct _MONITOR_STRUCT { - struct wifi_dev wdev; - INT CurrentMonitorMode; - UINT FilterSize; - UINT FrameType; - UCHAR MacFilterAddr[MAC_ADDR_LEN]; - BOOLEAN MacFilterOn; - BOOLEAN bMonitorInitiated; - BOOLEAN bMonitorOn; -} MONITOR_STRUCT; - -#ifdef CONFIG_AP_SUPPORT -/*************************************************************************** - * AP WDS related data structures - **************************************************************************/ -#if defined(WDS_SUPPORT) || defined(CLIENT_WDS) -typedef struct _WDS_COUNTER { - LARGE_INTEGER ReceivedFragmentCount; - LARGE_INTEGER TransmittedFragmentCount; - ULONG ReceivedByteCount; - ULONG TransmittedByteCount; - ULONG RxErrorCount; - ULONG TxErrors; - LARGE_INTEGER MulticastReceivedFrameCount; - ULONG RxNoBuffer; -} WDS_COUNTER, *PWDS_COUNTER; - -typedef struct _WDS_ENTRY { - BOOLEAN Valid; - UCHAR Addr[MAC_ADDR_LEN]; - ULONG NoDataIdleCount; - struct _WDS_ENTRY *pNext; -} WDS_ENTRY, *PWDS_ENTRY; - -typedef struct _RT_802_11_WDS_ENTRY { - struct wifi_dev wdev; - UCHAR Valid; - UCHAR PeerWdsAddr[MAC_ADDR_LEN]; - UCHAR MacTabMatchWCID; /* ASIC */ - UCHAR KeyIdx; - CIPHER_KEY WdsKey; - UCHAR PhyOpMode; - - WDS_COUNTER WdsCounter; -} RT_802_11_WDS_ENTRY, *PRT_802_11_WDS_ENTRY; - -typedef struct _WDS_TABLE { - UCHAR Mode; - UINT Size; - NDIS_SPIN_LOCK WdsTabLock; - BOOLEAN flg_wds_init; - RT_802_11_WDS_ENTRY WdsEntry[MAX_WDS_ENTRY]; -} WDS_TABLE, *PWDS_TABLE; -#endif /* WDS_SUPPORT */ - -#ifdef MAC_REPEATER_SUPPORT -#define MAX_IGNORE_AS_REPEATER_ENTRY_NUM 32 - -typedef struct _MBSS_TO_CLI_LINK_MAP_T { - struct wifi_dev *mbss_wdev; - struct wifi_dev *cli_link_wdev; -} MBSS_TO_CLI_LINK_MAP_T; - -/* -* ------------------------NOTE!!!!-------------------------- -* This structure must keep sync with partner driver. -* if new member will be added, it's better to append to end. -* ---------------------------------------------------------- -*/ -typedef struct _REPEATER_CLIENT_ENTRY { - /*BOOLEAN bValid;*/ - BOOLEAN CliEnable; - BOOLEAN CliValid; - BOOLEAN bEthCli; - UCHAR MatchApCliIdx; - UCHAR MatchLinkIdx; - UCHAR MacTabWCID; - UCHAR CliConnectState; /* 0: disconnect 1: connecting 2: connected */ - - ULONG CtrlCurrState; - ULONG SyncCurrState; - ULONG AuthCurrState; - ULONG AssocCurrState; - - RALINK_TIMER_STRUCT ApCliAssocTimer, ApCliAuthTimer; - - USHORT AuthReqCnt; - USHORT AssocReqCnt; - ULONG CliTriggerTime; - - /* For WPA countermeasures */ - ULONG LastMicErrorTime; /* record last MIC error time */ - BOOLEAN bBlockAssoc; /* Block associate attempt for 60 seconds after counter measure occurred. */ - - UCHAR OriginalAddress[MAC_ADDR_LEN]; - UCHAR CurrentAddress[MAC_ADDR_LEN]; - PVOID pAd; - struct _REPEATER_CLIENT_ENTRY *pNext; - - ULONG Disconnect_Sub_Reason; - - ULONG LinkDownReason; - - BSS_INFO_ARGUMENT_T bss_info_argument; - RTMP_OS_COMPLETION free_ack; - - UCHAR BandIdx; /*link on which Apcli link bandidx.*/ - RALINK_TIMER_STRUCT ReptCliResetTimer; - struct wifi_dev *wdev; /*pointer to the linking Apcli interface wdev. */ - -#ifdef FAST_EAPOL_WAR - BOOLEAN pre_entry_alloc; -#endif /* FAST_EAPOL_WAR */ -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - BSSID_INFO SavedPMK[PMKID_NO]; - UINT SavedPMKNum; /* Saved PMKID number */ -#endif -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - NDIS_SPIN_LOCK SavedPMK_lock; -#endif -#ifdef APCLI_SAE_SUPPORT - UCHAR sae_cfg_group; -#endif -#ifdef APCLI_OWE_SUPPORT - UCHAR curr_owe_group; -#endif - -} REPEATER_CLIENT_ENTRY, *PREPEATER_CLIENT_ENTRY; - -typedef struct _REPEATER_CLIENT_ENTRY_MAP { - PREPEATER_CLIENT_ENTRY pReptCliEntry; - struct _REPEATER_CLIENT_ENTRY_MAP *pNext; -} REPEATER_CLIENT_ENTRY_MAP, *PREPEATER_CLIENT_ENTRY_MAP; - -typedef struct _INVAILD_TRIGGER_MAC_ENTRY { - UCHAR MacAddr[MAC_ADDR_LEN]; - UCHAR entry_idx; - BOOLEAN bInsert; - struct _INVAILD_TRIGGER_MAC_ENTRY *pNext; -} INVAILD_TRIGGER_MAC_ENTRY, *PINVAILD_TRIGGER_MAC_ENTRY; - -typedef struct _REPEATER_CTRL_STRUCT { - INVAILD_TRIGGER_MAC_ENTRY - IgnoreAsRepeaterEntry[MAX_IGNORE_AS_REPEATER_ENTRY_NUM]; - INVAILD_TRIGGER_MAC_ENTRY *IgnoreAsRepeaterHash[HASH_TABLE_SIZE]; - UCHAR IgnoreAsRepeaterEntrySize; -} REPEATER_CTRL_STRUCT, *PREPEATER_CTRL_STRUCT; -#endif /* MAC_REPEATER_SUPPORT */ - -typedef struct _REPEATER_ADAPTER_DATA_TABLE { - bool Enabled; - void *EntryLock; - void **CliHash; - void **MapHash; - void *Wdev_ifAddr; - void *Wdev_ifAddr_DBDC; -} REPEATER_ADAPTER_DATA_TABLE; - -/*************************************************************************** - * AP APCLI related data structures - **************************************************************************/ -typedef struct _APCLI_STRUCT { - struct wifi_dev wdev; - BOOLEAN ApCliInit; /* Set it as 1 if ApCli is initialized */ - BOOLEAN Enable; /* Set it as 1 if the apcli interface was configured to "1" or by iwpriv cmd "ApCliEnable" */ - BOOLEAN Valid; /* Set it as 1 if the apcli interface associated success to remote AP. */ -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - UCHAR ApCliMode; -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ -#ifdef FAST_EAPOL_WAR - BOOLEAN pre_entry_alloc; -#endif /* FAST_EAPOL_WAR */ - MLME_AUX MlmeAux; /* temporary settings used during MLME state machine */ - - UCHAR MacTabWCID; /*WCID value, which point to the entry of ASIC Mac table. */ - UCHAR SsidLen; - CHAR Ssid[MAX_LEN_OF_SSID]; -#ifdef APCLI_CONNECTION_TRIAL - UCHAR TrialCh; /* the channel that Apcli interface will try to connect the rootap locates */ - RALINK_TIMER_STRUCT TrialConnectTimer; - RALINK_TIMER_STRUCT TrialConnectPhase2Timer; - RALINK_TIMER_STRUCT TrialConnectRetryTimer; - MAC_TABLE_ENTRY oldRootAP; - USHORT NewRootApRetryCnt; -#endif /* APCLI_CONNECTION_TRIAL */ - UCHAR ifIndex; - PVOID pAd; - - UCHAR CfgSsidLen; - CHAR CfgSsid[MAX_LEN_OF_SSID]; - UCHAR CfgApCliBssid[MAC_ADDR_LEN]; - - ULONG ApCliRcvBeaconTime_MlmeEnqueueForRecv; - ULONG ApCliRcvBeaconTime_MlmeEnqueueForRecv_2; - ULONG ApCliRcvBeaconTime; - ULONG ApCliLinkUpTime; - USHORT ApCliBeaconPeriod; - - ULONG CtrlCurrState; - ULONG SyncCurrState; - ULONG AuthCurrState; - ULONG AssocCurrState; - ULONG WpaPskCurrState; - ULONG LinkDownReason; - ULONG Disconnect_Sub_Reason; - -#ifdef APCLI_AUTO_CONNECT_SUPPORT - USHORT ProbeReqCnt; - BOOLEAN AutoConnectFlag; -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - USHORT AuthReqCnt; - USHORT AssocReqCnt; - - UCHAR MpduDensity; - - BOOLEAN bPeerExist; /* TRUE if we hear Root AP's beacon */ - - /* - Security segment - */ - /* Add to support different cipher suite for WPA2/WPA mode */ - NDIS_802_11_ENCRYPTION_STATUS GroupCipher; /* Multicast cipher suite */ - NDIS_802_11_ENCRYPTION_STATUS PairCipher; /* Unicast cipher suite */ - BOOLEAN bMixCipher; /* Indicate current Pair & Group use different cipher suites */ - USHORT RsnCapability; - - UCHAR PSK[100]; /* reserve PSK key material */ - UCHAR PSKLen; - UCHAR PMK[LEN_MAX_PMK]; /* WPA PSK mode PMK */ - UCHAR GTK[32]; /* GTK from authenticator */ - - /* store RSN_IE built by driver */ - UCHAR RSN_IE[MAX_LEN_OF_RSNIE]; /* The content saved here should be convert to little-endian format. */ - UCHAR RSNIE_Len; - - /* For WPA countermeasures */ - ULONG LastMicErrorTime; /* record last MIC error time */ - ULONG MicErrCnt; /* Should be 0, 1, 2, then reset to zero (after disassoiciation). */ - BOOLEAN bBlockAssoc; /* Block associate attempt for 60 seconds after counter measure occurred. */ - - /* For WPA-PSK supplicant state */ - UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY]; - UCHAR SNonce[32]; /* SNonce for WPA-PSK */ - UCHAR GNonce[32]; /* GNonce for WPA-PSK from authenticator */ - -#if defined(APCLI_CFG80211_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT) - WPA_SUPPLICANT_INFO wpa_supplicant_info; - BOOLEAN bScanReqIsFromWebUI; - BOOLEAN bConfigChanged; - NDIS_802_11_ASSOCIATION_INFORMATION AssocInfo; - USHORT ReqVarIELen; /* Length of next VIE include EID & Length */ - UCHAR ReqVarIEs - [MAX_VIE_LEN]; /* The content saved here should be little-endian format. */ - USHORT ResVarIELen; /* Length of next VIE include EID & Length */ - UCHAR ResVarIEs[MAX_VIE_LEN]; - UCHAR LastSsidLen; /* the actual ssid length in used */ - CHAR LastSsid[MAX_LEN_OF_SSID]; /* NOT NULL-terminated */ - UCHAR LastBssid[MAC_ADDR_LEN]; -#ifdef APCLI_CFG80211_SUPPORT - BOOLEAN MarkToClose; - BOOLEAN ReadyToConnect; -#endif /* APCLI_CFG80211_SUPPORT */ -#endif /* WPA_SUPPLICANT_SUPPORT || APCLI_CFG80211_SUPPORT */ - -#if defined(APCLI_CFG80211_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT) || \ - defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) -#ifndef APCLI_CFG80211_SUPPORT - BSSID_INFO SavedPMK[PMKID_NO]; -#endif /* APCLI_CFG80211_SUPPORT */ - UINT SavedPMKNum; /* Saved PMKID number */ - -#if defined(APCLI_SAE_SUPPORT) || defined(APCLI_OWE_SUPPORT) - NDIS_SPIN_LOCK SavedPMK_lock; -#endif - -#endif - - /* - WPS segment - */ -#ifdef WSC_AP_SUPPORT - WSC_CTRL WscControl; -#endif /* WSC_AP_SUPPORT */ - - /* - Transmitting segment - */ - UCHAR RxMcsSet[16]; - - PSPOLL_FRAME PsPollFrame; - HEADER_802_11 NullFrame; - RTMP_OS_COMPLETION ifdown_complete; - RTMP_OS_COMPLETION linkdown_complete; -#ifdef APCLI_CFG80211_SUPPORT - RTMP_OS_COMPLETION scan_complete; -#endif /* APCLI_CFG80211_SUPPORT */ - BOOLEAN need_wait; - - /*MBSS_STATISTICS MbssStat;*/ - ULONG TxCount; - ULONG RxCount; - ULONG ReceivedByteCount; - ULONG TransmittedByteCount; - ULONG RxErrorCount; - ULONG RxDropCount; - ULONG OneSecTxBytes; - ULONG OneSecRxBytes; -#ifdef APCLI_CERT_SUPPORT - BOOLEAN NeedFallback; -#endif /* APCLI_CERT_SUPPORT */ - - ULONG TxErrorCount; - ULONG TxDropCount; - ULONG ucPktsTx; - ULONG ucPktsRx; - ULONG mcPktsTx; - ULONG mcPktsRx; - ULONG bcPktsTx; - ULONG bcPktsRx; - UINT8 dync_txop_histogram[5]; -#ifdef CON_WPS - UINT ConWpsApCliModeScanDoneStatus; -#endif /* CON_WPS */ - -#ifdef A4_CONN - UCHAR a4_init; - UCHAR a4_apcli; -#endif -#ifdef CONFIG_MAP_SUPPORT - UCHAR last_controller_connectivity; - UCHAR PeerMAPEnable; -#endif -#ifdef APCLI_SAE_SUPPORT - UCHAR sae_cfg_group; -#endif -#ifdef APCLI_OWE_SUPPORT - UCHAR curr_owe_group; - UCHAR owe_trans_ssid_len; - CHAR owe_trans_ssid[MAX_LEN_OF_SSID]; - CHAR owe_trans_bssid[MAC_ADDR_LEN]; - UCHAR owe_trans_open_ssid_len; - CHAR owe_trans_open_ssid[MAX_LEN_OF_SSID]; - CHAR owe_trans_open_bssid[MAC_ADDR_LEN]; - -#endif -} APCLI_STRUCT, *PAPCLI_STRUCT; - -#ifdef DSCP_QOS_MAP_SUPPORT -typedef struct _DSCP_QOS_MAP_TABLE_T { - UINT8 ucPoolValid; - UINT8 ucDscpExceptionCount; - UINT32 u4Ac; - UINT16 au2DscpRange[8]; - UINT16 au2DscpException[21]; -} DSCP_QOS_MAP_TABLE_T, *P_DSCP_QOS_MAP_TABLE_T; -#endif -#ifdef CONFIG_STEERING_API_SUPPORT -typedef struct _DATE_TIME { - UINT32 year; - UINT32 month; - UINT32 day; - UINT32 hour; - UINT32 minute; - UINT32 sec; -} DATE_TIME, *PDATE_TIME; - -typedef struct _PROBE_DATA { - CHAR rssi; - DATE_TIME dateTime; - /* UINT32 dataLen; */ - /* UCHAR data[MGMT_DMA_BUFFER_SIZE]; */ -} PROBE_DATA, *PPROBE_DATA; - -typedef struct _STA_REPORT_DATA { - UCHAR MacAddr[MAC_ADDR_LEN]; - UCHAR dataCount; - UCHAR CyclicIndex; - PROBE_DATA probeData[NA_STA_PROBE_DATA_LIST_SIZE]; -} STA_REPORT_DATA, *PSTA_REPORT_DATA; - -typedef struct _NA_STA_REPORT_LIST { - STA_REPORT_DATA reportData[NA_STA_REPORT_SIZE]; - UCHAR reportSize; -} NA_STA_REPORT_LIST, *PNA_STA_REPORT_LIST; - -typedef struct _NA_STA_ENTRY { - UCHAR MacAddr[MAC_ADDR_LEN]; - UCHAR ListIndex; - BOOLEAN bValid; - PVOID pAd; - struct _NA_STA_ENTRY *pNext; -} NA_STA_ENTRY, *PNA_STA_ENTRY; - -typedef struct _NA_STA_MAC_LIST { - NA_STA_ENTRY Entry[NA_STA_REPORT_SIZE]; - PNA_STA_ENTRY Hash[HASH_TABLE_SIZE]; - UCHAR StaCount; - UCHAR OldStaIdx; - NDIS_SPIN_LOCK Lock; -} NA_STA_MAC_LIST, *PNA_STA_MAC_LIST; - -typedef struct _BTM_ACTION_FRAME_LIST { - RTMP_OS_SEM BTMActionFrameListLock; - DL_LIST BTMActionFrameList; -} BTM_ACTION_FRAME_LIST, *PBTM_ACTION_FRAME_LIST; - -typedef struct _BLOCKED_STA_ENTRY { - UCHAR MacAddr[MAC_ADDR_LEN]; - BOOLEAN bValid; - UINT64 BlockTime; - RALINK_TIMER_STRUCT WaitRemoveStaTimer; - PVOID pAd; - struct _BLOCKED_STA_ENTRY *pNext; -} BLOCKED_STA_ENTRY, *PBLOCKED_STA_ENTRY; - -typedef struct _STA_BLACK_LIST { - BLOCKED_STA_ENTRY Entry[BLOCKED_LIST_MAX_TABLE_SIZE]; - PBLOCKED_STA_ENTRY Hash[HASH_TABLE_SIZE]; - UINT32 StaCount; - NDIS_SPIN_LOCK Lock; -} STA_BLACK_LIST, *PSTA_BLACK_LIST; - -typedef struct _BTM_REQ_INFO { - UINT8 category; - UINT8 type; - UINT8 dialogtoken; - UINT8 reqmode; - UINT16 disassoc_timer; - UINT8 valint; -} BTM_REQ_INFO, *PBTM_REQ_INFO; - -typedef struct _BTM_REQ_FRAME_DATA { - UCHAR PeerMACAddr[MAC_ADDR_LEN]; - UCHAR CategoryType[4]; - UCHAR Payload[1024]; - UINT32 Len; -} BTM_REQ_FRAME_DATA, *PBTM_REQ_FRAME_DATA; - -typedef struct _BTM_PEER_AACTION_FRAME_ENTRY { - DL_LIST List; - BTM_REQ_FRAME_DATA reqFrameData; - void *Priv; -} BTM_PEER_AACTION_FRAME_ENTRY, *PBTM_PEER_AACTION_FRAME_ENTRY; - -#endif - -#ifdef BW_VENDOR10_CUSTOM_FEATURE -typedef struct _AUTO_BW_MAJOR_POLICY { - UCHAR ApCliBWSyncBandSupport; /* 0: No Support, 1: Same Band, 2: Diff (or Both) Band */ - BOOLEAN ApCliBWSyncDeauthSupport; /* 0: No Deauth, 1: Deauth */ -} AUTO_BW_MAJOR_POLICY; - -typedef struct _AUTO_BW_MINOR_POLICY { - UCHAR ApCliBWSyncHTSupport; /* HT Poilcies */ - UCHAR ApCliBWSyncVHTSupport; /* VHT Poilcies */ -} AUTO_BW_MINOR_POLICY; - -typedef struct _AUTO_BW_POLICY_TABLE { - AUTO_BW_MAJOR_POLICY majorPolicy; - AUTO_BW_MINOR_POLICY minorPolicy; -} AUTO_BW_POLICY_TABLE; -#endif - -typedef struct _AP_ADMIN_CONFIG { - USHORT CapabilityInfo; - /* Multiple SSID */ - UCHAR BssidNum; - UCHAR MacMask; - BSS_STRUCT MBSSID[HW_BEACON_MAX_NUM]; - UCHAR Pf2MbssIdxMap[MAX_BEACON_NUM]; /* PROFILE to MBSSID index mapping */ - ULONG IsolateInterStaTrafficBTNBSSID; -#ifdef CONFIG_INIT_RADIO_ONOFF - BOOLEAN bRadioOn; -#endif -#ifdef APCLI_SUPPORT - UCHAR ApCliInfRunned; /* Number of ApClient interface which was running. value from 0 to MAX_APCLI_INTERFACE */ - UINT8 ApCliNum; - BOOLEAN FlgApCliIsUapsdInfoUpdated; - APCLI_STRUCT ApCliTab[MAX_APCLI_NUM]; /*AP-client */ -#ifdef APCLI_AUTO_CONNECT_SUPPORT - APCLI_CONNECT_SCAN_TYPE ApCliAutoConnectType - [MAX_APCLI_NUM]; /* 0 : User Trigger SCAN Mode, 1 : Driver Trigger SCAN Mode, this is for Sigma DUT test , Peer AP may change BSSID, but SSID is the same */ - BOOLEAN ApCliAutoConnectRunning[MAX_APCLI_NUM]; - BOOLEAN ApCliAutoConnectChannelSwitching; - UINT8 ApCliAutoBWAdjustCnt[MAX_APCLI_NUM]; -#ifdef BT_APCLI_SUPPORT - BOOLEAN ApCliAutoBWBTSupport; -#endif -#ifdef BW_VENDOR10_CUSTOM_FEATURE - AUTO_BW_POLICY_TABLE ApCliAutoBWRules; - BOOLEAN AutoBWDeauthEnbl; /* Auto BW Feature Client Deauth Enable */ -#endif -#endif /* APCLI_AUTO_CONNECT_SUPPORT */ - BOOLEAN bPartialScanEnable[MAX_APCLI_NUM]; - BOOLEAN bPartialScanning[MAX_APCLI_NUM]; - ULONG ApCliIssueScanTime[MAX_APCLI_NUM]; -#ifdef ROAMING_ENHANCE_SUPPORT - BOOLEAN bRoamingEnhance; -#endif /* ROAMING_ENHANCE_SUPPORT */ -#endif /* APCLI_SUPPORT */ - struct wifi_dev *ScanReqwdev; - -#ifdef MAC_REPEATER_SUPPORT - BOOLEAN bMACRepeaterEn; - UCHAR MACRepeaterOuiMode; - UINT8 EthApCliIdx; - UCHAR RepeaterCliSize; - NDIS_SPIN_LOCK ReptCliEntryLock; - REPEATER_CLIENT_ENTRY *ReptCliHash[HASH_TABLE_SIZE]; - REPEATER_CLIENT_ENTRY_MAP *ReptMapHash[HASH_TABLE_SIZE]; - UCHAR BridgeAddress[MAC_ADDR_LEN]; - REPEATER_CTRL_STRUCT ReptControl; - - NDIS_SPIN_LOCK CliLinkMapLock; - MBSS_TO_CLI_LINK_MAP_T MbssToCliLinkMap[HW_BEACON_MAX_NUM]; - REPEATER_CLIENT_ENTRY *pRepeaterCliPool; - REPEATER_CLIENT_ENTRY_MAP *pRepeaterCliMapPool; -#endif /* MAC_REPEATER_SUPPORT */ - - /* for wpa */ - RALINK_TIMER_STRUCT CounterMeasureTimer; - - UCHAR CMTimerRunning; - UCHAR BANClass3Data; - LARGE_INTEGER aMICFailTime; - LARGE_INTEGER PrevaMICFailTime; - ULONG MICFailureCounter; - - NDIS_AP_802_11_PMKID PMKIDCache; - - RSSI_SAMPLE RssiSample; - ULONG NumOfAvgRssiSample; - - BOOLEAN bAutoChannelAtBootup[DBDC_BAND_NUM]; /* 0: disable, 1: enable */ - ChannelSel_Alg - AutoChannelAlg[DBDC_BAND_NUM]; /* Alg for selecting Channel */ -#ifdef ACS_CTCC_SUPPORT - BOOLEAN auto_ch_score_flag; /* score for Channel, and don't switch channel */ -#endif -#ifdef AP_SCAN_SUPPORT - UINT32 ACSCheckTime - [DBDC_BAND_NUM]; /* Periodic timer to trigger Auto Channel Selection (unit: second) */ - UINT32 ACSCheckCount - [DBDC_BAND_NUM]; /* if ACSCheckCount > ACSCheckTime, then do ACS check */ -#endif /* AP_SCAN_SUPPORT */ - BOOLEAN bAvoidDfsChannel; /* 0: disable, 1: enable */ - BOOLEAN bIsolateInterStaTraffic; - BOOLEAN bHideSsid; - - /* temporary latch for Auto channel selection */ - ULONG ApCnt; /* max RSSI during Auto Channel Selection period */ - UCHAR AutoChannel_Channel; /* channel number during Auto Channel Selection */ - UCHAR current_channel_index; /* current index of channel list */ - UCHAR AutoChannelSkipListNum; /* number of rejected channel list */ -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - UCHAR AutoChannelSkipList[20]; -#else - UCHAR AutoChannelSkipList[MAX_NUM_OF_CHANNELS + 1]; -#endif - UCHAR DtimCount; /* 0.. DtimPeriod-1 */ - UCHAR DtimPeriod; /* default = 3 */ - ULONG LastOLBCDetectTime; - ULONG LastNoneHTOLBCDetectTime; - ULONG LastScanTime; /* Record last scan time for issue BSSID_SCAN_LIST */ - - RALINK_TIMER_STRUCT ApQuickResponeForRateUpTimer; - BOOLEAN ApQuickResponeForRateUpTimerRunning; - -#ifdef IDS_SUPPORT - /* intrusion detection parameter */ - BOOLEAN IdsEnable; - UINT32 AuthFloodThreshold; /* Authentication frame flood threshold */ - UINT32 AssocReqFloodThreshold; /* Association request frame flood threshold */ - UINT32 ReassocReqFloodThreshold; /* Re-association request frame flood threshold */ - UINT32 ProbeReqFloodThreshold; /* Probe request frame flood threshold */ - UINT32 DisassocFloodThreshold; /* Disassociation frame flood threshold */ - UINT32 DeauthFloodThreshold; /* Deauthentication frame flood threshold */ - UINT32 EapReqFloodThreshold; /* EAP request frame flood threshold */ - UINT32 DataFloodThreshold; /* Malicious data frame flood threshold */ - - UINT32 RcvdAuthCount; - UINT32 RcvdAssocReqCount; - UINT32 RcvdReassocReqCount; - UINT32 RcvdProbeReqCount; - UINT32 RcvdDisassocCount; - UINT32 RcvdDeauthCount; - UINT32 RcvdEapReqCount; - UINT32 RcvdMaliciousDataCount; /* Data Frame DDOS */ - - RALINK_TIMER_STRUCT IDSTimer; - BOOLEAN IDSTimerRunning; -#endif /* IDS_SUPPORT */ - - /* Indicate the maximum idle timeout */ - UINT32 StaIdleTimeout; - - ULONG EntryLifeCheck; - -#ifdef IGMP_SNOOP_SUPPORT - BOOLEAN IgmpSnoopEnable[DBDC_BAND_NUM]; /* 0: disable, 1: enable. */ -#ifdef IGMP_TVM_SUPPORT - UCHAR IsTVModeEnable[DBDC_BAND_NUM]; /* Valid for both AP and Apcli wdev */ - UCHAR TVModeType - [DBDC_BAND_NUM]; /* 0:Disable, 1:Enable, or 2:Auto, Valid only for AP wdev*/ -#endif /* IGMP_TVM_SUPPORT */ -#endif /* IGMP_SNOOP_SUPPORT */ - -#ifdef DOT11R_FT_SUPPORT - FT_TAB FtTab; -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef CLIENT_WDS - NDIS_SPIN_LOCK CliWdsTabLock; - PCLIWDS_PROXY_ENTRY pCliWdsEntryPool; - LIST_HEADER CliWdsEntryFreeList; - LIST_HEADER CliWdsProxyTb[CLIWDS_HASH_TAB_SIZE]; -#endif /* CLIENT_WDS */ - UCHAR EntryClientCount; -#ifdef MBSS_AS_WDS_AP_SUPPORT - UCHAR wds_mac[MAC_ADDR_LEN]; -#endif -#ifdef MT_MAC - UINT32 ext_mbss_enable_bitmap; - UINT32 ext_mbss_tttt_enable_bitmap; -#endif /*MT_MAC*/ -#ifdef BAND_STEERING - BOOLEAN BandSteering; - UINT8 BndStrgBssIdx[HW_BEACON_MAX_NUM]; - BND_STRG_CLI_TABLE BndStrgTable[DBDC_BAND_NUM]; - UINT32 BndStrgHeartbeatCount; - UINT32 BndStrgHeartbeatMonitor; - UINT32 BndStrgHeartbeatNoChange; -#endif /* BAND_STEERING */ -#ifdef VENDOR_FEATURE7_SUPPORT - UINT16 BSSEnabled; /* each bit stands for a BSS */ - - UCHAR rts_retry_cnt; /* RTS Retry Cnt */ - UCHAR tx_retry_cnt; /* TX Retry Cnt */ -#endif -#ifdef CONFIG_HOTSPOT_R2 - QOS_MAP_TABLE_T HsQosMapTable[MAX_QOS_MAP_TABLE_SIZE]; -#endif /* CONFIG_HOTSPOT_R2 */ - -#ifdef DSCP_QOS_MAP_SUPPORT - DSCP_QOS_MAP_TABLE_T DscpQosMapTable[2]; - UINT8 DscpQosMapSupport[2]; -#endif -#ifdef DSCP_PRI_SUPPORT - UINT8 DscpPriMapSupport; -#endif - -#ifdef CON_WPS - UINT ConWpsApCliMode; /* means get profile from rootAp by 2G, 5G perferred or AUTO */ - BOOLEAN ConWpsApCliStatus; /* status of Received the EAPOL-FAIL */ - BOOLEAN ConWpsApCliDisableSetting; - BOOLEAN ConWpsApDisableSetting; - BOOLEAN ConWpsApCliDisabled; - RALINK_TIMER_STRUCT ConWpsApCliBandMonitorTimer; - BOOLEAN ConWpsMonitorTimerRunning; - UINT ConWpsApcliAutoPreferIface; -#endif /* CON_WPS */ -#ifdef CONFIG_MAP_SUPPORT - struct map_policy_setting SteerPolicy; -#endif -#ifdef GREENAP_SUPPORT - struct greenap_ctrl greenap; -#endif /* GREENAP_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT -#ifdef CONFIG_11KV_API_SUPPORT - BOOLEAN HandleNRReqbyUplayer; -#endif -#endif -#ifdef CONFIG_STEERING_API_SUPPORT - BOOLEAN NonAssocStaReport; - BOOLEAN PauseNonAssocStaReport; - BOOLEAN NonAssocStaEnable; - BTM_ACTION_FRAME_LIST BTMActionFrameList; - STA_BLACK_LIST StaBlackList; - NA_STA_MAC_LIST NaStaMacList; - NA_STA_REPORT_LIST NAStaReportList; -#endif -#ifdef CUSTOMER_VENDOR_IE_SUPPORT - struct customer_oui_filter ap_customer_oui; -#endif /* CUSTOMER_VENDOR_IE_SUPPORT */ - USHORT ObssGBandChanBitMap; - -#ifdef OCE_SUPPORT - RALINK_TIMER_STRUCT FdFrameTimer; - BOOLEAN FdFrameTimerRunning; - BOOLEAN FdFrameTxsEnabled; - BOOLEAN FdFrameCurNum; - RALINK_TIMER_STRUCT APAutoScanNeighborTimer; -#endif /* OCE_SUPPORT */ -#ifdef MGMT_TXPWR_CTRL - BOOLEAN fEpaReq; - BOOLEAN fgEPA[DBDC_BAND_NUM]; - INT8 EpaGain[DBDC_BAND_NUM]; -#endif -} AP_ADMIN_CONFIG; - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#ifdef CONFIG_AP_SUPPORT -typedef struct _BCN_CHECK_INFO_STRUC { - UINT32 nobcncnt0; /* nobcn accumulative cnt for band 0 */ - UINT32 prebcncnt0; /* previous 2.5s bcn cnt for band 0 */ - UINT32 totalbcncnt0; /* total bcn cnt for band 0 */ - UINT32 nobcncnt1; /* nobcn accumulative cnt for band 1 */ - UINT32 prebcncnt1; /* previous 2.5s bcn cnt for band 1 */ - UINT32 totalbcncnt1; /* total bcn cnt for band 1 */ -} BCN_CHECK_INFO_STRUC, *PBCN_CHECK_INFO_STRUC; -#endif -#endif - -#ifdef IGMP_SNOOP_SUPPORT -typedef enum _IGMP_GROUP_TYPE { - MODE_IS_INCLUDE = 1, - MODE_IS_EXCLUDE, - CHANGE_TO_INCLUDE_MODE, - CHANGE_TO_EXCLUDE_MODE, - ALLOW_NEW_SOURCES, - BLOCK_OLD_SOURCES -} IgmpGroupType; - -#define GROUP_ENTRY_TYPE_BITMASK 0x0F - -typedef enum _MULTICAST_FILTER_ENTRY_TYPE { - /* Group Entry Types (0 to 0xF) -> Detail of overall entry for a group address*/ - MCAT_FILTER_STATIC = 0, - MCAT_FILTER_DYNAMIC, -#ifdef IGMP_TVM_SUPPORT - /* If both the ENABLE and AUTO are not set means DISABLE. */ - /* This is used to configure whether each client connected */ - /* to AP has if TV Mode, ENABLED or AUTO, otherwise DISABLED */ - MCAT_FILTER_TVM_ENABLE = 0x10, - MCAT_FILTER_TVM_AUTO = 0x20, -#endif /* IGMP_TVM_SUPPORT */ -/* Member Types (0x10 to 0xFF) -> Detail of the member to be added/included in group address entry*/ -#ifdef A4_CONN - MCAT_FILTER_MWDS_CLI = 0x80, -#endif -} MulticastFilterEntryType; - -typedef struct _MEMBER_ENTRY { - struct _MEMBER_ENTRY *pNext; - UCHAR Addr[MAC_ADDR_LEN]; -#ifdef IGMP_TVM_SUPPORT - UINT8 TVMode; -#endif /* IGMP_TVM_SUPPORT */ -#ifdef A4_CONN - BOOLEAN onMWDSLink; /*indicates whether this member is on MWDS link*/ -#endif - /* USHORT Aid; */ -} MEMBER_ENTRY, *PMEMBER_ENTRY; - -typedef struct _MULTICAST_FILTER_TABLE_ENTRY { - BOOLEAN Valid; - MulticastFilterEntryType type; /* 0: static, 1: dynamic. */ - ULONG lastTime; - UINT32 AgeOutTime; - PNET_DEV net_dev; - UCHAR Addr[MAC_ADDR_LEN]; - LIST_HEADER MemberList; - struct _MULTICAST_FILTER_TABLE_ENTRY *pNext; -} MULTICAST_FILTER_TABLE_ENTRY, *PMULTICAST_FILTER_TABLE_ENTRY; - -typedef struct _MULTICAST_FILTER_TABLE { - UCHAR Size; - - PMULTICAST_FILTER_TABLE_ENTRY - Hash[MAX_LEN_OF_MULTICAST_FILTER_HASH_TABLE]; - MULTICAST_FILTER_TABLE_ENTRY Content[MAX_LEN_OF_MULTICAST_FILTER_TABLE]; - NDIS_SPIN_LOCK MulticastFilterTabLock; - NDIS_SPIN_LOCK FreeMemberPoolTabLock; - MEMBER_ENTRY freeMemberPool[FREE_MEMBER_POOL_SIZE]; - LIST_HEADER freeEntryList; -} MULTICAST_FILTER_TABLE, *PMULTICAST_FILTER_TABLE; -#endif /* IGMP_SNOOP_SUPPORT */ - -#ifdef DOT11_N_SUPPORT -#ifdef GREENAP_SUPPORT -typedef enum _RT_GREEN_AP_LEVEL { - GREENAP_11BGN_STAS = 0, - GREENAP_ONLY_11BG_STAS, - GREENAP_WITHOUT_ANY_STAS_CONNECT -} RT_GREEN_AP_LEVEL; - -typedef enum _GREEN_AP_SUSPEND_REASON { - AP_BACKGROUND_SCAN = (1 << 0), -} GREEN_AP_SUSPEND_REASON; -#endif /* GREENAP_SUPPORT */ -#endif /* DOT11_N_SUPPORT */ - -/* ----------- end of AP ---------------------------- */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef BLOCK_NET_IF -typedef struct _BLOCK_QUEUE_ENTRY { - BOOLEAN SwTxQueueBlockFlag; - LIST_HEADER NetIfList; -} BLOCK_QUEUE_ENTRY, *PBLOCK_QUEUE_ENTRY; -#endif /* BLOCK_NET_IF */ - -struct wificonf { - BOOLEAN bShortGI; - BOOLEAN bGreenField; -}; - -typedef struct _RTMP_DEV_INFO_ { - UCHAR chipName[16]; - RTMP_INF_TYPE infType; -} RTMP_DEV_INFO; - -#ifdef DBG_DIAGNOSE -#define MAX_VHT_MCS_SET 20 /* for 1ss~ 2ss with MCS0~9 */ - -#define DIAGNOSE_TIME 10 /* 10 sec */ - -struct dbg_diag_info { - USHORT TxDataCnt[WMM_NUM_OF_AC]; /* Tx total data count */ - USHORT TxFailCnt; - USHORT RxDataCnt; /* Rx Total Data count. */ - USHORT RxCrcErrCnt; - -#ifdef DBG_TXQ_DEPTH - /* TxSwQ length in scale of 0, 1, 2, 3, 4, 5, 6, 7, >=8 */ - USHORT TxSWQueCnt[WMM_NUM_OF_AC][9]; - UINT32 enq_fall_cnt[WMM_NUM_OF_AC]; - UINT32 deq_fail_no_resource_cnt[WMM_NUM_OF_AC]; - UINT32 deq_called; - UINT32 deq_round; - UINT32 deq_cnt[9]; -#endif /* DBG_TXQ_DEPTH */ - -#ifdef DBG_TX_AGG_CNT - USHORT TxAggCnt; - USHORT TxNonAggCnt; - /* TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1. */ - USHORT TxAMPDUCnt[16]; -#endif /* DBG_TX_AGG_CNT */ -}; - -typedef enum { - DIAG_COND_ALL = 0, - DIAG_COND_TXQ_DEPTH = 4, -} DIAG_COND_STATUS; - -typedef struct _RtmpDiagStrcut_ { /* Diagnosis Related element */ - BOOLEAN inited; - UCHAR wcid; - UCHAR qIdx; - UCHAR ArrayStartIdx; - UCHAR ArrayCurIdx; - UINT32 diag_cond; - - struct dbg_diag_info diag_info[DIAGNOSE_TIME]; -} RtmpDiagStruct; -#endif /* DBG_DIAGNOSE */ - -/* */ -/* The entry of transmit power control over MAC */ -/* */ -typedef struct _TX_POWER_CONTROL_OVER_MAC_ENTRY { - USHORT MACRegisterOffset; /* MAC register offset */ - ULONG RegisterValue; /* Register value */ -} TX_POWER_CONTROL_OVER_MAC_ENTRY, *PTX_POWER_CONTROL_OVER_MAC_ENTRY; - -/* */ -/* The maximum registers of transmit power control */ -/* */ -#define MAX_TX_PWR_CONTROL_OVER_MAC_REGISTERS 5 - -/* */ -/* The configuration of the transmit power control over MAC */ -/* */ -typedef struct _CONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC { - UCHAR NumOfEntries; /* Number of entries */ - TX_POWER_CONTROL_OVER_MAC_ENTRY - TxPwrCtrlOverMAC[MAX_TX_PWR_CONTROL_OVER_MAC_REGISTERS]; -} CONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC, - *PCONFIGURATION_OF_TX_POWER_CONTROL_OVER_MAC; - -/* */ -/* The extension of the transmit power control over MAC */ -/* */ -typedef struct _TX_POWER_CONTROL_EXT_OVER_MAC { - struct { - ULONG TxPwrCfg0; /* MAC 0x1314 */ - ULONG TxPwrCfg0Ext; /* MAC 0x1390 */ - ULONG TxPwrCfg1; /* MAC 0x1318 */ - ULONG TxPwrCfg1Ext; /* MAC 0x1394 */ - ULONG TxPwrCfg2; /* MAC 0x131C */ - ULONG TxPwrCfg2Ext; /* MAC 0x1398 */ - ULONG TxPwrCfg3; /* MAC 0x1320 */ - ULONG TxPwrCfg3Ext; /* MAC 0x139C */ - ULONG TxPwrCfg4; /* MAC 0x1324 */ - ULONG TxPwrCfg4Ext; /* MAC 0x13A0 */ - ULONG TxPwrCfg5; /* MAC 0x1384 */ - ULONG TxPwrCfg6; /* MAC 0x1388 */ - ULONG TxPwrCfg7; /* MAC 0x13D4 */ - ULONG TxPwrCfg8; /* MAC 0x13D8 */ - ULONG TxPwrCfg9; /* MAC 0x13DC */ - } BW20Over2Dot4G; - - struct { - ULONG TxPwrCfg0; /* MAC 0x1314 */ - ULONG TxPwrCfg0Ext; /* MAC 0x1390 */ - ULONG TxPwrCfg1; /* MAC 0x1318 */ - ULONG TxPwrCfg1Ext; /* MAC 0x1394 */ - ULONG TxPwrCfg2; /* MAC 0x131C */ - ULONG TxPwrCfg2Ext; /* MAC 0x1398 */ - ULONG TxPwrCfg3; /* MAC 0x1320 */ - ULONG TxPwrCfg3Ext; /* MAC 0x139C */ - ULONG TxPwrCfg4; /* MAC 0x1324 */ - ULONG TxPwrCfg4Ext; /* MAC 0x13A0 */ - ULONG TxPwrCfg5; /* MAC 0x1384 */ - ULONG TxPwrCfg6; /* MAC 0x1388 */ - ULONG TxPwrCfg7; /* MAC 0x13D4 */ - ULONG TxPwrCfg8; /* MAC 0x13D8 */ - ULONG TxPwrCfg9; /* MAC 0x13DC */ - } BW40Over2Dot4G; - - struct { - ULONG TxPwrCfg0; /* MAC 0x1314 */ - ULONG TxPwrCfg0Ext; /* MAC 0x1390 */ - ULONG TxPwrCfg1; /* MAC 0x1318 */ - ULONG TxPwrCfg1Ext; /* MAC 0x1394 */ - ULONG TxPwrCfg2; /* MAC 0x131C */ - ULONG TxPwrCfg2Ext; /* MAC 0x1398 */ - ULONG TxPwrCfg3; /* MAC 0x1320 */ - ULONG TxPwrCfg3Ext; /* MAC 0x139C */ - ULONG TxPwrCfg4; /* MAC 0x1324 */ - ULONG TxPwrCfg4Ext; /* MAC 0x13A0 */ - ULONG TxPwrCfg5; /* MAC 0x1384 */ - ULONG TxPwrCfg6; /* MAC 0x1388 */ - ULONG TxPwrCfg7; /* MAC 0x13D4 */ - ULONG TxPwrCfg8; /* MAC 0x13D8 */ - ULONG TxPwrCfg9; /* MAC 0x13DC */ - } BW20Over5G; - - struct { - ULONG TxPwrCfg0; /* MAC 0x1314 */ - ULONG TxPwrCfg0Ext; /* MAC 0x1390 */ - ULONG TxPwrCfg1; /* MAC 0x1318 */ - ULONG TxPwrCfg1Ext; /* MAC 0x1394 */ - ULONG TxPwrCfg2; /* MAC 0x131C */ - ULONG TxPwrCfg2Ext; /* MAC 0x1398 */ - ULONG TxPwrCfg3; /* MAC 0x1320 */ - ULONG TxPwrCfg3Ext; /* MAC 0x139C */ - ULONG TxPwrCfg4; /* MAC 0x1324 */ - ULONG TxPwrCfg4Ext; /* MAC 0x13A0 */ - ULONG TxPwrCfg5; /* MAC 0x1384 */ - ULONG TxPwrCfg6; /* MAC 0x1388 */ - ULONG TxPwrCfg7; /* MAC 0x13D4 */ - ULONG TxPwrCfg8; /* MAC 0x13D8 */ - ULONG TxPwrCfg9; /* MAC 0x13DC */ - } BW40Over5G; -} TX_POWER_CONTROL_EXT_OVER_MAC, *PTX_POWER_CONTROL_EXT_OVER_MAC; - -/* For Wake on Wireless LAN */ -#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || \ - defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) -typedef struct _WOW_CFG_STRUCT { - BOOLEAN bEnable; /* Enable WOW function*/ - BOOLEAN bWOWFirmware; /* Enable WOW function, trigger to reload WOW-support firmware */ - BOOLEAN bInBand; /* use in-band signal to wakeup system */ - BOOLEAN bWowIfDownSupport; - UINT8 nSelectedGPIO; /* Side band signal to wake up system */ - UINT8 nDelay; /* Delay number is multiple of 3 secs, and it used to postpone the WOW function */ - UINT32 nHoldTime; /* GPIO pulse hold time, unit: 1us, 0 means hold forever.*/ - BOOLEAN bWoWRunning; /* WOW function is working */ - UINT8 nWakeupInterface; /* PCI:0 USB:1 GPIO:2 */ - UINT8 IPAddress[16]; /* Used for ARP response */ - UINT8 bGPIOHighLow; /* 0: low to high, 1: high to low */ -} WOW_CFG_STRUCT, *PWOW_CFG_STRUCT; - -typedef enum { WOW_GPIO_LOW_TO_HIGH, WOW_GPIO_HIGH_TO_LOW } WOW_GPIO_HIGH_LOW_T; - -typedef enum { - WOW_GPIO_OOTPUT_DISABLE = 0, - WOW_GPIO_OUTPUT_ENABLE = 1, -} WOW_GPIO_OUTPUT_ENABLE_T; - -typedef enum { - WOW_GPIO_OUTPUT_LEVEL_LOW = 0, - WOW_GPIO_OUTPUT_LEVEL_HIGH = 1, -} WOW_GPIO_OUTPUT_LEVEL_T; - -typedef enum { - WOW_GPIO_WAKEUP_LEVEL_LOW = 0, - WOW_GPIO_WAKEUP_LEVEL_HIGH = 1, -} WOW_GPIO_WAKEUP_LEVEL_T; - -#define WOW_GPIO_LOW_TO_HIGH_PARAMETER \ - ((WOW_GPIO_OUTPUT_ENABLE << 0) | (WOW_GPIO_OUTPUT_LEVEL_LOW << 1) | \ - (WOW_GPIO_WAKEUP_LEVEL_HIGH << 2)) - -#define WOW_GPIO_HIGH_TO_LOW_PARAMETER \ - ((WOW_GPIO_OUTPUT_ENABLE << 0) | (WOW_GPIO_OUTPUT_LEVEL_HIGH << 1) | \ - (WOW_GPIO_WAKEUP_LEVEL_LOW << 2)); - -typedef enum { WOW_PKT_TO_HOST, WOW_PKT_TO_ANDES } WOW_PKT_FLOW_T; - -typedef enum { - WOW_WAKEUP_BY_PCIE, - WOW_WAKEUP_BY_USB, - WOW_WAKEUP_BY_GPIO -} WOW_WAKEUP_METHOD_T; - -typedef enum { WOW_ENABLE = 1, WOW_TRAFFIC = 3, WOW_WAKEUP = 4 } WOW_FEATURE_T; - -typedef enum { - WOW_MASK_CFG = 1, - WOW_SEC_CFG, - WOW_INFRA_CFG, - WOW_P2P_CFG, -} WOW_CONFIG_T; - -enum { WOW_MAGIC_PKT, WOW_BITMAP, WOW_IPV4_TCP_SYNC, WOW_IPV6_TCP_SYNC }; - -typedef struct NEW_WOW_MASK_CFG_STRUCT { - UINT32 Config_Type; - UINT32 Function_Enable; - UINT32 Detect_Mask; - UINT32 Event_Mask; -} NEW_WOW_MASK_CFG_STRUCT, PNEW_WOW_MASK_CFG_STRUCT; - -typedef struct NEW_WOW_SEC_CFG_STRUCT { - UINT32 Config_Type; - UINT32 WPA_Ver; - UCHAR PTK[64]; - UCHAR R_COUNTER[8]; - UCHAR Key_Id; - UCHAR Cipher_Alg; - UCHAR WCID; - UCHAR Group_Cipher; -} NEW_WOW_SEC_CFG_STRUCT, PNEW_WOW_SEC_CFG_STRUCT; - -typedef struct NEW_WOW_INFRA_CFG_STRUCT { - UINT32 Config_Type; - UCHAR STA_MAC[6]; - UCHAR AP_MAC[6]; - UINT32 AP_Status; -} NEW_WOW_INFRA_CFG_STRUCT, PNEW_WOW_INFRA_CFG_STRUCT; - -typedef struct _NEW_WOW_P2P_CFG_STRUCT { - UINT32 Config_Type; - UCHAR GO_MAC[6]; - UCHAR CLI_MAC[6]; - UINT32 P2P_Status; -} NEW_WOW_P2P_CFG_STRUCT, *PNEW_WOW_P2P_CFG_STRUCT; - -typedef struct _NEW_WOW_PARAM_STRUCT { - UINT32 Parameter; - UINT32 Value; -} NEW_WOW_PARAM_STRUCT, *PNEW_WOW_PARAM_STRUCT; - -#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) */ - -/* - Packet drop reason code -*/ -typedef enum { - PKT_ATE_ON = 1 << 8, - PKT_RADAR_ON = 2 << 8, - PKT_RRM_QUIET = 3 << 8, - PKT_TX_STOP = 4 << 8, - PKT_TX_JAM = 5 << 8, - - PKT_NETDEV_DOWN = 6 < 8, - PKT_NETDEV_NO_MATCH = 7 << 8, - PKT_NOT_ALLOW_SEND = 8 << 8, - - PKT_INVALID_DST = 9 << 8, - PKT_INVALID_SRC = 10 << 8, - PKT_INVALID_PKT_DATA = 11 << 8, - PKT_INVALID_PKT_LEN = 12 << 8, - PKT_INVALID_ETH_TYPE = 13 << 8, - PKT_INVALID_TXBLK_INFO = 14 << 8, - PKT_INVALID_SW_ENCRYPT = 15 << 8, - PKT_INVALID_PKT_TYPE = 16 << 8, - PKT_INVALID_PKT_MIC = 17 << 8, - - PKT_PORT_NOT_SECURE = 18 << 8, - PKT_TSPEC_NO_MATCH = 19 << 8, - PKT_NO_ASSOCED_STA = 20 << 8, - PKT_INVALID_MAC_ENTRY = 21 << 8, - - PKT_TX_QUE_FULL = 22 << 8, - PKT_TX_QUE_ADJUST = 23 << 8, - - PKT_PS_QUE_TIMEOUT = 24 << 8, - PKT_PS_QUE_CLEAN = 25 << 8, - PKT_MCAST_PS_QUE_FULL = 26 << 8, - PKT_UCAST_PS_QUE_FULL = 27 << 8, - - PKT_RX_EAPOL_SANITY_FAIL = 28 << 8, - PKT_RX_NOT_TO_KERNEL = 29 << 8, - PKT_RX_MESH_SIG_FAIL = 30 << 8, - PKT_APCLI_FAIL = 31 << 8, - PKT_ZERO_DATA = 32 << 8, - PKT_SW_DECRYPT_FAIL = 33 << 8, - PKT_TX_SW_ENC_FAIL = 34 << 8, - - PKT_ACM_FAIL = 35 << 8, - PKT_IGMP_GRP_FAIL = 36 << 8, - PKT_MGMT_FAIL = 37 << 8, - PKT_AMPDU_OUT_ORDER = 38 << 8, - PKT_UAPSD_EOSP = 39 << 8, - PKT_UAPSD_Q_FULL = 40 << 8, - - PKT_DRO_REASON_MAX = 41, -} PKT_DROP_REASON; - -/* Packet drop Direction code */ -typedef enum { - PKT_TX = 0, - PKT_RX = 1 << 31, -} PKT_DROP_DIECTION; - -#ifdef SMART_ANTENNA -/* - 1. The combination of all possible training patterns = - txNss : the maxima antennas used for transmission, - e.g., for 3*3 device, the txNss = 3 - When user try to select the antenna, they shall use following format to do the selection - iwpriv ra0 set sa_ant=1,5 - => it means user try to use PinHeader 1 and pinHeader 5 as the tx antenna - - 2. The Training sequence used for smart antenna traing - pTrainSeq: is a sequence used to do antenna selection. - - the time of one round for the antenna selection training: - totalTime = maxAntTry -*/ - -#define SA_TX_NSS_MAX_NUM 3 -#define SA_DBG_LOG_MAX_CNT 10 -#define SA_ENTRY_MAX_NUM 1 - -#define SA_DEFAULT_TX_CNT 100 -#define SA_DEFAULT_TX_NSS 2 -#define SA_DEFAULT_MCS_BOUND 23 -#define SA_DEFAULT_MSC 5 -#define SA_DEFAULT_CHK_PERIOD 200 /* 400 */ -#define SA_DEFAULT_ANT_TRIAL 1 -#define SA_DEFAULT_RSSI_VAR 8 /* 5 */ -#define SA_DEFAULT_RSSI_THRESHOLD -80 - -typedef enum _RTMP_SA_OP_MODE_ { - SA_MODE_NONE = 0, - SA_MODE_MANUAL = 1, - SA_MODE_ONESHOT = 2, - SA_MODE_AUTO = 3, -} RTMP_SA_OP_MODE; - -typedef enum _RTMP_SA_STA_RULE_ { - SA_STA_BY_DEFAULT = 0, /* first in or static assign */ - SA_STA_BY_RSSI = 1, -} RTMP_SA_STA_RULE; - -typedef struct _RTMP_SA_AGSP_MAP_ { - UINT8 hdrPin; - UINT32 regOffset; /* The GPIO address */ - UINT32 gpioBit; /* the bit field in the regOffset */ -} RTMP_SA_AGSP_MAP; - -typedef struct _RTMP_SA_TRAIN_LOG_ELEMENT_ { - UINT32 antPattern; - UINT32 patternOffset; - UCHAR antWeight; - UCHAR candWeight; - ULONG srtTime; - ULONG endTime; - UINT32 txMcs; - UINT32 txCnt; /* txNoRtyCnt + RtyOkCnt + FailCnt */ - UINT32 txNoRtyCnt; - UINT32 txRtyCnt; /* RtyOkCnt + FailCnt */ - UINT32 txRtyFailCnt; /* FailCnt */ - UINT32 PER; /* (txRtyCnt * 100) / txCnt */ - UINT32 rxCnt; - INT32 sumRSSI[SA_TX_NSS_MAX_NUM]; - UINT32 cntRSSI[SA_TX_NSS_MAX_NUM]; - INT32 avgRSSI[SA_TX_NSS_MAX_NUM]; - INT32 sumSNR[SA_TX_NSS_MAX_NUM]; - UINT32 cntSNR[SA_TX_NSS_MAX_NUM]; - INT32 avgSNR[SA_TX_NSS_MAX_NUM]; - INT32 sumPreSNR[SA_TX_NSS_MAX_NUM]; - UINT32 cntPreSNR[SA_TX_NSS_MAX_NUM]; - -#ifdef SA_DBG - UINT32 rssiDist[SA_TX_NSS_MAX_NUM][33]; - UINT32 SNRDist[SA_TX_NSS_MAX_NUM][33]; - UINT32 preSNRDist[SA_TX_NSS_MAX_NUM][33]; - UINT32 txMcsDist[MAX_MCS_SET]; /* the txMcs distruction cnt; */ - UINT32 rxMcsDist[MAX_MCS_SET]; /* the rxMcs distruction cnt; */ -#endif /* SA_DBG // */ -} RTMP_SA_TRAIN_LOG_ELEMENT; - -typedef struct _RTMP_SA_TRAIN_LOG_ { - UINT32 antPattern; - int lastRnd; - int firstRnd; - RTMP_SA_TRAIN_LOG_ELEMENT record[SA_DBG_LOG_MAX_CNT]; -} RTMP_SA_TRAIN_LOG; - -typedef struct _RTMP_SA_TRAIN_SEQ_ { - UINT32 antPattern; - RTMP_SA_AGSP_MAP *pAgspEntry; -} RTMP_SA_TRAIN_SEQ; - -/* - For SmartAntenna auto training mode, it's a three-stages loop state machine - 1. Initial stage (first time) - do fully scan for all antenna patterns - 2. Confirm stage (second time) - do fully scan for all antenna patterns - - if Initial stage and confirm stage results are the same - => goto Monitor stage - else - => goto confirm stage - 3. Monitor stage (third and following) - Only do RSSI monitoring. - - if | CurrentRSSI - previousRSSI| <= 5 - => stay in Monitor stage - else - => go to initial stage -*/ -typedef enum { - SA_INVALID_STAGE = 0, - SA_INIT_STAGE = 1, - SA_CONFIRM_STAGE = 2, - SA_MONITOR_STAGE = 3, -} RTMP_SA_TRAIN_STAGE; - -#define ANT_WEIGHT_SCAN_ALL 0xf0 -#define ANT_WEIGHT_SCAN_AVG 0x70 -#define ANT_WEIGHT_SCAN_ONE 0x10 - -#define ANT_WEIGHT_CAND_HIGH 0x01 -#define ANT_WEIGHT_CAND_AVG 0x02 -#define ANT_WEIGHT_CAND_LOW 0x03 -#define ANT_WEIGHT_CAND_INIT 0xff - -#define ANT_SELECT_FIRST 0x01 -#define ANT_SELECT_IGNORE_BASE 0x02 -#define ANT_SELECT_BASE 0x04 - -typedef struct _RTMP_SA_TRAINING_PARAM_ { - RTMP_SA_TRAIN_LOG_ELEMENT *pTrainInfo; - - UCHAR macAddr[MAC_ADDR_LEN]; - BOOLEAN bStatic; /* Indicate if this entry assigned by user or by driver itself */ - - MAC_TABLE_ENTRY *pMacEntry; - - /* Indicate the info */ - RTMP_SA_TRAIN_LOG_ELEMENT antBaseInfo; - - UINT32 curAntPattern; /* indicate current antenna pattern used for transmission */ - UINT32 patternOffset; /* Indicate the offset of the antPattern compare to the pSAParam->pTrainSeq; */ - RTMP_SA_TRAIN_LOG_ELEMENT *pCurTrainInfo; - - UINT32 canAntPattern; /* The best candidate until now! */ - RTMP_SA_TRAIN_LOG_ELEMENT *pCanTrainInfo; - - RTMP_SA_TRAIN_STAGE trainStage; - UINT32 ant_init_stage; - UINT32 ant_confirm_stage; - ULONG time_to_start; /* in units of system Clk */ - - UCHAR mcsStableCnt; - UCHAR trainWeight; - BOOLEAN bTraining; /* set as TRUE when trianing procedure is on-going */ - BOOLEAN bLastRnd; - -#ifdef SA_TRAIN_SBS - BOOLEAN bRoundDone; -#endif /* SA_TRAIN_SBS // */ - -#ifdef SA_LUMP_SUM - UINT32 sumTxCnt; - UINT32 sumTxRtyCnt; - UINT32 sumTxFailCnt; -#endif /* SA_LUMP_SUM // */ -} RTMP_SA_TRAINING_PARAM; - -typedef struct _SMART_ANTENNA_STRUCT_ { - RTMP_SA_OP_MODE saMode; /* 1 = manually, 2= one shot , 3 =auto learn */ - - /* Number of antennas used for the transmission in the same time. */ - UCHAR txNss; - - /* Mcs Stable Count, define the requirements for trigger the - Antenna switch algorithm, - 0~254: valid count. - 255: reserved value - */ - UCHAR saMsc; - - /* - MCS upper bound for SmartAntenna adaptive tunning. - */ - UCHAR saMcsBound; - - /* The maximum number of antenna pattern in one testing period */ - UCHAR maxAntTry; - - /* condition for sa training */ - UINT32 trainCond; /* used for method 3 */ - - /* Method for Antenna candidate selection */ - UINT32 candMethod; - - /* the delay time(in seconds) before do the antenna switching training procedures */ - UINT32 trainDelay; - - /* Time period of simple the data info for a specific antenna period. */ - INT32 chkPeriod; - - /* RSSI variance threshod for training procedures */ - UCHAR rssiVar; - - /* threshold value used for select target training entry */ - CHAR rssiThreshold; - - /* condition to check if need to skip the confirm stage when run in auto mode */ - BOOLEAN bSkipConfStage; - - /* indicate if any station associate/disassociate to us and need to re-do the training procedure */ - BOOLEAN bStaChange; - - /* indicate if the Rssi variance is larger than threshold for sa training */ - BOOLEAN bRssiChange; - - /* the antenna header pin and gpio mapping */ - RTMP_SA_AGSP_MAP *agsp; - INT32 agspCnt; - - /* Training sequence of antenna pattern used to do simpling. - 0x0: indicate the end of the sequence. - */ - UINT32 *pTrainSeq; - RTMP_SA_TRAIN_LOG_ELEMENT *pTrainMem; - /* Total length of the training sequence, not include the terminator. */ - int trainSeqCnt; - - RALINK_TIMER_STRUCT saSwitchTimer; - - /* Rule used to select the target Training entry */ - UINT32 candStaRule; - - RTMP_SA_TRAINING_PARAM trainEntry[SA_ENTRY_MAX_NUM]; - -} SMART_ANTENNA_STRUCT; -#endif /* SMART_ANTENNA // */ - -typedef struct _BBP_RESET_CTL { -#define BBP_RECORD_NUM 49 - REG_PAIR BBPRegDB[BBP_RECORD_NUM]; - BOOLEAN AsicCheckEn; -} BBP_RESET_CTL, *PBBP_RESET_CTL; - -#define DEFLAUT_PARTIAL_SCAN_CH_NUM 1 -#define DEFLAUT_PARTIAL_SCAN_BREAK_TIME \ - 4 /* Period of partial scaning: unit: 100ms */ -#define DEFAULT_PARTIAL_SCAN_TRIGGER_PERIOD 3000 /* Default 5min, unit:100ms */ - -typedef struct _PARTIAL_SCAN_ { - BOOLEAN bScanning; /* Doing partial scan or not */ - UINT8 NumOfChannels; /* How many channels to scan each time */ - UINT8 LastScanChannel; /* last scaned channel */ - UINT32 BreakTime; /* Period of partial scanning: unit: 100ms */ - struct wifi_dev *pwdev; - - BOOLEAN bPeriodicPartialScan; - UINT32 TriggerPeriod; - UINT32 TriggerCount; - -} PARTIAL_SCAN; - -#ifdef OFFCHANNEL_SCAN_FEATURE - -typedef enum { - OFFCHANNEL_SCAN_INVALID = 0, - OFFCHANNEL_SCAN_START, - OFFCHANNEL_SCAN_COMPLETE, - OFFCHANNEL_SCAN_MAX -} RTMP_OFFCHANNEL_SCAN_STAGE; - -#define BW_20_SCAN 0 -#define BW_OPER_SCAN 1 -#endif - -typedef struct _SCAN_CTRL_ { - UCHAR ScanType; - UCHAR BssType; - UCHAR Channel; - UCHAR SsidLen; - CHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR Bssid[MAC_ADDR_LEN]; -#ifdef OFFCHANNEL_SCAN_FEATURE - UCHAR if_name[32]; - UCHAR ScanGivenChannel[MAX_AWAY_CHANNEL]; - UCHAR ScanTime[MAX_AWAY_CHANNEL]; - UCHAR CurrentGivenChan_Index; - UCHAR Num_Of_Channels; - UCHAR Offchan_Scan_Type[MAX_AWAY_CHANNEL]; - RTMP_OFFCHANNEL_SCAN_STAGE state; - BOOLEAN OffChScan_Band0; - BOOLEAN OffChScan0_Ongoing; - BOOLEAN OffChScan_Band1; - BOOLEAN OffChScan1_Ongoing; - UCHAR Off_Ch_Scan_BW; - NDIS_SPIN_LOCK NF_Lock; -#endif -/*In OFFCHANNEL_SCAN_FEATURE also actual time is desired */ -#if (defined(CUSTOMER_DCC_FEATURE) || defined(OFFCHANNEL_SCAN_FEATURE)) - ULONG ScanTimeActualStart; - ULONG ScanTimeActualEnd; - UCHAR ScanTimeActualDiff; -#endif -#ifdef CONFIG_AP_SUPPORT - RALINK_TIMER_STRUCT APScanTimer; -#endif /* CONFIG_AP_SUPPORT */ - PARTIAL_SCAN PartialScan; -} SCAN_CTRL; - -#ifdef CUSTOMER_RSG_FEATURE -typedef struct _RADIO_STATS_COUNTER { - UINT32 TotalBeaconSentCount; - UINT32 TotalTxCount; - UINT32 TotalRxCount; - UINT32 TxDataCount; - UINT32 RxDataCount; - UINT32 TxRetriedPktCount; - UINT32 TxRetryCount; -} RADIO_STATS_COUNTER, *PRADIO_STATS_COUNTER; - -#endif - -#ifdef CUSTOMER_DCC_FEATURE -typedef struct _STREAMING_TYPE_STATUS { - BOOLEAN BE; - UINT64 BE_Time; - BOOLEAN BK; - UINT64 BK_Time; - BOOLEAN VI; - UINT64 VI_Time; - BOOLEAN VO; - UINT64 VO_Time; -} STREAMING_TYPE_STATUS, *PSTREAMING_TYPE_STATUS; - -typedef struct _ALLOWED_STA { - UCHAR MacAddr[6]; - UINT64 DissocTime; -} ALLOWED_STA, *PALLOWED_STA; - -typedef struct _ALLOWED_STA_LIST { - ALLOWED_STA AllowedSta[MAX_LEN_OF_MAC_TABLE]; - UINT32 StaCount; -} ALLOWED_STA_LIST, *PALLOWED_STA_LIST; -#endif - -#define TX_SWQ_FIFO_LEN 4096 -typedef struct tx_swq_fifo { - UCHAR swq[TX_SWQ_FIFO_LEN]; /* value 0 is used to indicate free to insert, value 1~127 used to incidate the WCID entry */ - UINT enqIdx; - UINT deqIdx; - UINT low_water_mark; - UINT high_water_mark; - BOOLEAN q_state; - NDIS_SPIN_LOCK swq_lock; /* spinlock for swq */ -} TX_SWQ_FIFO; - -#ifdef RT_CFG80211_SUPPORT -typedef struct _CFG80211_VIF_DEV { - struct _CFG80211_VIF_DEV *pNext; - BOOLEAN isMainDev; - UINT32 devType; - PNET_DEV net_dev; - UCHAR CUR_MAC[MAC_ADDR_LEN]; - - /* ProbeReq Frame */ - BOOLEAN Cfg80211RegisterProbeReqFrame; - CHAR Cfg80211ProbeReqCount; - - /* Action Frame */ - BOOLEAN Cfg80211RegisterActionFrame; - CHAR Cfg80211ActionCount; -} CFG80211_VIF_DEV, *PCFG80211_VIF_DEV; - -typedef struct _CFG80211_VIF_DEV_SET { -#define MAX_CFG80211_VIF_DEV_NUM 2 - - BOOLEAN inUsed; - UINT32 vifDevNum; - LIST_HEADER vifDevList; - BOOLEAN isGoingOn; /* To check any vif in list */ -} CFG80211_VIF_DEV_SET; - -/* TxMmgt Related */ -typedef struct _CFG80211_TX_PACKET { - struct _CFG80211_TX_PACKET *pNext; - UINT32 TxStatusSeq; /* TxMgmt Packet ID from sequence */ - UCHAR *pTxStatusBuf; /* TxMgmt Packet buffer content */ - UINT32 TxStatusBufLen; /* TxMgmt Packet buffer Length */ - -} CFG80211_TX_PACKET, *PCFG80211_TX_PACKET; - -/* CFG80211 Total CTRL Point */ -typedef struct _CFG80211_CONTROL { - BOOLEAN FlgCfg8021Disable2040Scan; - BOOLEAN FlgCfg80211Scanning; /* Record it When scanReq from wpa_supplicant */ - BOOLEAN FlgCfg80211Connecting; /* Record it When ConnectReq from wpa_supplicant*/ - - /* Scan Related */ - UINT32 *pCfg80211ChanList; /* the channel list from from wpa_supplicant */ - UCHAR Cfg80211ChanListLen; /* channel list length */ - UCHAR Cfg80211CurChanIndex; /* current index in channel list when driver in scanning */ - - UCHAR *pExtraIe; /* Carry on Scan action from supplicant */ - UINT ExtraIeLen; - - UCHAR Cfg_pending_Ssid[MAX_LEN_OF_SSID + - 1]; /* Record the ssid, When ScanTable Full */ - UCHAR Cfg_pending_SsidLen; - - /* ROC Related */ - RALINK_TIMER_STRUCT Cfg80211RocTimer; - CMD_RTPRIV_IOCTL_80211_CHAN Cfg80211ChanInfo; - BOOLEAN Cfg80211RocTimerInit; - BOOLEAN Cfg80211RocTimerRunning; - - /* Tx_Mmgt Related */ - UINT32 TxStatusSeq; /* TxMgmt Packet ID from sequence */ - UCHAR *pTxStatusBuf; /* TxMgmt Packet buffer content */ - UINT32 TxStatusBufLen; /* TxMgmt Packet buffer Length */ - BOOLEAN TxStatusInUsed; - LIST_HEADER cfg80211TxPacketList; - - /* P2P Releated*/ - UCHAR P2PCurrentAddress[MAC_ADDR_LEN]; /* User changed MAC address */ - BOOLEAN isCfgDeviceInP2p; /* For BaseRate 6 */ - - /* MainDevice Info. */ - CFG80211_VIF_DEV cfg80211MainDev; -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) - /* For add_virtual_intf */ - CFG80211_VIF_DEV_SET Cfg80211VifDevSet; -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ - -#ifdef CFG80211_MULTI_STA - PNET_DEV multi_sta_net_dev; - BOOLEAN flg_cfg_multi_sta_init; -#endif /* CFG80211_MULTI_STA */ - - /* In AP Mode */ - UINT8 isCfgInApMode; /* Is any one Device in AP Mode */ - UCHAR *beacon_tail_buf; /* Beacon buf from upper layer */ - UINT32 beacon_tail_len; - BOOLEAN beaconIsSetFromHostapd; /* set true after BeaconAdd */ - - UCHAR *pCfg80211ExtraIeAssocRsp; - UINT32 Cfg80211ExtraIeAssocRspLen; - - /* for AdHoc Mode */ - UCHAR *BeaconExtraIe; - UINT BeaconExtraIeLen; - - /* Mcc Part */ - /* BOOLEAN isMccOn; */ - - /* TODO: need fix it */ - UCHAR Cfg80211_Alpha2[2]; - CMD_RTPRIV_IOCTL_80211_KEY WepKeyInfoBackup; -#ifdef HOSTAPD_11R_SUPPORT - AUTH_FRAME_INFO auth_info; -#endif -} CFG80211_CTRL, *PCFG80211_CTRL; -#endif /* RT_CFG80211_SUPPORT */ - -typedef struct rtmp_mac_ctrl { -#ifdef MT_MAC - UINT8 wtbl_entry_cnt[4]; - UINT16 wtbl_entry_size[4]; - UINT32 wtbl_base_addr[4]; /* base address for WTBL2/3/4 */ - UINT32 wtbl_base_fid[4]; - UINT32 page_size; -#endif /* MT_MAC */ - -} RTMP_MAC_CTRL; - -typedef struct _RADIO_CTRL { - UCHAR BandIdx; - UCHAR CurStat; - UCHAR PhyMode; - UCHAR Channel; - UCHAR Channel2; - UCHAR CentralCh; - UCHAR Bw; - UCHAR ExtCha; - /*check first radio update is for scan or not*/ - BOOLEAN scan_state; - BOOLEAN IsBfBand; -#ifdef GREENAP_SUPPORT - BOOLEAN bGreenAPActive; -#endif /* GREENAP_SUPPORT */ -#ifdef TR181_SUPPORT - UINT32 CurChannelUpTime; /*usecs since system up*/ - UINT32 RefreshACSChannelChangeCount; - UINT32 ForceACSChannelChangeCount; - UINT32 ManualChannelChangeCount; - UINT32 DFSTriggeredChannelChangeCount; - UINT32 TotalChannelChangeCount; - UINT8 ACSTriggerFlag; -#endif -#ifdef TXRX_STAT_SUPPORT - LARGE_INTEGER TxDataPacketCount; - LARGE_INTEGER TxDataPacketByte; - LARGE_INTEGER RxDataPacketCount; - LARGE_INTEGER RxDataPacketByte; - LARGE_INTEGER TxUnicastDataPacket; - LARGE_INTEGER TxMulticastDataPacket; - LARGE_INTEGER TxBroadcastDataPacket; - LARGE_INTEGER TxMgmtPacketCount; - LARGE_INTEGER RxMgmtPacketCount; - LARGE_INTEGER TxBeaconPacketCount; - LARGE_INTEGER TxDataPacketCountPerAC[4]; /*per access category*/ - LARGE_INTEGER RxDataPacketCountPerAC[4]; /*per access category*/ - CHAR LastDataPktRssi[4]; - LARGE_INTEGER TxPacketDroppedCount; - LARGE_INTEGER RxDecryptionErrorCount; - LARGE_INTEGER RxCRCErrorCount; - LARGE_INTEGER RxMICErrorCount; - LARGE_INTEGER LastSecTxByte; - LARGE_INTEGER LastSecRxByte; - UINT32 TotalPER; - UINT32 TotalTxFailCnt; - UINT32 TotalTxCnt; - UINT32 Last1SecPER; - UINT32 Last1TxFailCnt; - UINT32 Last1TxCnt; -#endif -} RADIO_CTRL; - -#ifdef CONFIG_AP_SUPPORT -#ifdef AP_QLOAD_SUPPORT -typedef struct _QLOAD_CTRL { - UINT8 FlgQloadEnable; /* 1: any BSS WMM is enabled */ - ULONG QloadUpTimeLast; /* last up time */ - UINT8 QloadChanUtil; /* last QBSS Load, unit: us, primary channel only */ - UINT8 QloadChanUtilCcaNavTx; /* last QBSS Load, unit: us, including CCA NAV TX time */ - UINT32 QloadChanUtilTotal; /* current QBSS Load Total, primary channel only */ - UINT32 QloadChanUtilTotalCcaNavTx; /* current QBSS Load Total, including CCA NAV TX time*/ - UINT8 QloadChanUtilBeaconCnt; /* 1~100, default: 50 */ - UINT8 QloadChanUtilBeaconInt; /* 1~100, default: 50 */ - UINT32 QloadLatestChannelBusyTimePri; - UINT32 QloadLatestChannelBusyTimeSec; - - /* - ex: For 100ms beacon interval, - if the busy time in last TBTT is smaller than 5ms, QloadBusyCount[0] ++; - if the busy time in last TBTT is between 5 and 10ms, QloadBusyCount[1] ++; - ...... - if the busy time in last TBTT is larger than 95ms, QloadBusyCount[19] ++; - - Command: "iwpriv ra0 qload show". - */ - - /* provide busy time statistics for every TBTT */ -#define QLOAD_FUNC_BUSY_TIME_STATS - - /* provide busy time alarm mechanism */ - /* use the function to avoid to locate in some noise environments */ -#define QLOAD_FUNC_BUSY_TIME_ALARM - -#ifdef QLOAD_FUNC_BUSY_TIME_STATS -#define QLOAD_BUSY_INTERVALS 20 /* partition TBTT to QLOAD_BUSY_INTERVALS */ - /* for primary channel & secondary channel */ - UINT32 QloadBusyCountPri[QLOAD_BUSY_INTERVALS]; - UINT32 QloadBusyCountSec[QLOAD_BUSY_INTERVALS]; -#endif /* QLOAD_FUNC_BUSY_TIME_STATS */ - -#ifdef QLOAD_FUNC_BUSY_TIME_ALARM -#define QLOAD_DOES_ALARM_OCCUR(pAd) \ - (HcGetQloadCtrl(pAd)->FlgQloadAlarmIsSuspended == TRUE) -#define QLOAD_ALARM_EVER_OCCUR(pAd) (HcGetQloadCtrl(pAd)->QloadAlarmNumber > 0) - BOOLEAN FlgQloadAlarmIsSuspended; /* 1: suspend */ - - UINT8 QloadAlarmBusyTimeThreshold; /* unit: 1/100 */ - UINT8 QloadAlarmBusyNumThreshold; /* unit: 1 */ - UINT8 QloadAlarmBusyNum; - UINT8 QloadAlarmDuration; /* unit: TBTT */ - - UINT32 QloadAlarmNumber; /* total alarm times */ - BOOLEAN FlgQloadAlarm; /* 1: alarm occurs */ - - /* speed up use */ - UINT32 QloadTimePeriodLast; - UINT32 QloadBusyTimeThreshold; -#else - -#define QLOAD_DOES_ALARM_OCCUR(pAd) 0 -#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */ -} QLOAD_CTRL; -#endif /* AP_QLOAD_SUPPORT */ - -struct _AUTO_CH_CTRL { - PCHANNELINFO pChannelInfo; - PBSSINFO pBssInfoTab; -#ifdef CONFIG_AP_SUPPORT - AUTOCH_SEL_CTRL AutoChSelCtrl; -#endif -}; - -#endif /*CONFIG_AP_SUPPORT*/ - -typedef struct rtmp_phy_ctrl { - UINT8 rf_band_cap; -#ifdef CONFIG_AP_SUPPORT - AUTO_CH_CTRL AutoChCtrl; -#ifdef AP_QLOAD_SUPPORT - QLOAD_CTRL QloadCtrl; -#endif /*AP_QLOAD_SUPPORT*/ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG - struct ch_switch_cfg ch_sw_cfg; -#endif - RADIO_CTRL RadioCtrl; -} RTMP_PHY_CTRL; - -typedef struct _MANUAL_CONN { - UINT8 peer_mac[MAC_ADDR_LEN]; - UINT8 peer_band; /* band 0/1 */ - UINT8 peer_op_type; /* ap/sta for "OPMODE_AP"/"OPMODE_STA" */ - UINT8 ownmac_idx; - UINT8 wtbl_idx; - UINT8 peer_phy_mode; /* a/b/g/gn/an/ac for "WMODE_A/B/G/GN/AN/AC" */ - UINT8 peer_bw; /* 20/40/80/160 for "BW_20/40/80/160" */ - UINT8 peer_nss; /* 1 ~ 4 */ - UINT16 pfmuId; - UINT8 spe_idx; - UCHAR gid; - UINT16 aid; - UINT8 rca2; - UINT8 rv; - UINT8 peer_maxrate_mode; /* cck/ofdm/htmix/htgf/vht for "MODE_CCK/OFDM/HTMIX/HTGF/VHT" */ - UINT32 peer_maxrate_mcs; /* MODE_CCK: 0~3, MODE_OFDM: 0~7, MODE_HTMIX/GF: 0~32, MODE_VHT:0~9 */ - UINT8 ba_info[WMM_NUM_OF_AC]; - - /* protocol wise */ - HT_CAP_INFO ht_cap_info; /* HT capability information */ -#ifdef DOT11_VHT_AC - VHT_CAP_INFO vht_cap_info; /* VHT capability information */ - VHT_MCS_SET vht_mcs_set; -#endif -} MANUAL_CONN, *P_MANUAL_CONN; - -#ifdef WFA_VHT_R2_PF -typedef struct _MANUAL_DUMP { - UINT8 VhtBwSignal; - UINT8 VhtCapIE; - UINT8 VhtOpNotify; -} MANUAL_DUMP, *P_MANUAL_DUMP; -#endif /* WFA_VHT_R2_PF */ - -/* Rx Statistic */ -#define MAX_ANT_NUM 4 -typedef struct _RX_STATISTIC_RXV { - INT32 FreqOffsetFromRx; - UINT32 RSSI[MAX_ANT_NUM]; - UINT32 SNR[MAX_ANT_NUM]; - UINT32 RCPI[MAX_ANT_NUM]; - UINT32 FAGC_RSSI_IB[MAX_ANT_NUM]; - UINT32 FAGC_RSSI_WB[MAX_ANT_NUM]; -} RX_STATISTIC_RXV; - -typedef struct _RX_STATISTIC_CR { - UINT32 RxMacFCSErrCount; - UINT32 RxMacMdrdyCount; - UINT32 RxMacFCSOKCount; - UINT32 PhyMdrdyOFDM; - UINT32 PhyMdrdyCCK; - UINT32 FCSErr_OFDM; - UINT32 FCSErr_CCK; - UINT32 RxLenMismatch; - UINT32 OFDM_PD; - UINT32 CCK_PD; - UINT32 CCK_SIG_Err; - UINT32 CCK_SFD_Err; - UINT32 OFDM_SIG_Err; - UINT32 OFDM_TAG_Err; - UINT32 ACIHitLow; - UINT32 ACIHitHigh; - UINT32 Inst_IB_RSSSI[MAX_ANT_NUM]; - UINT32 Inst_WB_RSSSI[MAX_ANT_NUM]; - UINT32 RxMacFCSErrCount_band1; - UINT32 RxMacMdrdyCount_band1; - UINT32 RxMacFCSOKCount_band1; - UINT32 PhyMdrdyOFDM_band1; - UINT32 PhyMdrdyCCK_band1; - UINT32 RxLenMismatch_band1; - UINT32 OFDM_PD_band1; - UINT32 CCK_PD_band1; - UINT32 CCK_SIG_Err_band1; - UINT32 CCK_SFD_Err_band1; - UINT32 OFDM_SIG_Err_band1; - UINT32 OFDM_TAG_Err_band1; -} RX_STATISTIC_CR; - -struct peak_tp_ctl { - UCHAR client_nums; - struct wifi_dev *cur_wdev; - BOOLEAN cli_peak_tp_running; - UINT32 max_tx_tp; - BOOLEAN cli_peak_tp_txop_enable; - UINT16 cli_peak_tp_txop_level; - BOOLEAN cli_ampdu_efficiency_running; -}; - -struct txop_ctl { - UCHAR multi_client_nums; - struct wifi_dev *cur_wdev; - BOOLEAN multi_cli_txop_running; -}; - -struct multi_cli_ctl { - UINT32 pkt_avg_len; - UCHAR sta_nums; - UCHAR amsdu_cnt; - UINT32 rts_length; - UINT32 rts_pkt; - BOOLEAN c2s_only; - ULONG last_tx_cnt; - ULONG last_tx_fail_cnt; -}; - -typedef struct _RxVBQElmt { - UINT8 valid; - UINT8 isEnd; - UINT8 rxblk_setting_done; - UINT8 rxv_setting_done; - UINT8 rxblk_search_done; - UINT8 rxv_search_done; - UINT8 rxv_sn; - UINT8 wcid; - UINT8 aggcnt; - UINT8 g0_debug_set; - UINT8 g1_debug_set; - UINT8 g2_debug_set; - UCHAR chipid[5]; - UINT32 MPDUbytecnt; - UINT32 timestamp; - UINT32 arFCScheckBitmap[8]; - UINT32 RXV_CYCLE[9]; -} RxVBQElmt, *PRxVBQElmt; -struct scan_req { - INT32 scan_id; - INT32 last_bss_cnt; - INT32 if_index; -}; -#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(TR181_SUPPORT) || \ - defined(TXRX_STAT_SUPPORT) -typedef struct _CHANNEL_STATS { - UINT32 MibUpdateOBSSAirtime[2]; - UINT32 MibUpdateMyTxAirtime[2]; - UINT32 MibUpdateMyRxAirtime[2]; - UINT32 TotalDuration; - UINT32 MeasurementDuration; - UINT32 LastReadTime; -#ifdef CUSTOMER_RSG_FEATURE - UINT32 msec100counts; - UINT32 ChBusytime; - UINT32 ChBusyTimeAvg; - UINT32 ChBusyTime1secValue; - UINT32 CCABusytime; - UINT32 CCABusyTimeAvg; - UINT32 CCABusyTime1secValue; - UINT32 FalseCCACount; - UINT32 FalseCCACountAvg; - UINT32 FalseCCACount1secValue; - UINT32 ChannelApActivity; - UINT32 ChannelApActivityAvg; - UINT32 ChannelApActivity1secValue; - UINT32 MibUpdateEDCCAtime[2]; - UINT32 MibUpdatePdCount[2]; - UINT32 MibUpdateMdrdyCount[2]; -#endif -#ifdef TXRX_STAT_SUPPORT - UINT32 Radio100msecCounts; -#endif -} CHANNEL_STATS, *PCHANNEL_STATS; -#endif - -#ifdef RATE_PRIOR_SUPPORT -typedef struct _LOWRATE_CTRL { - BOOLEAN RatePrior; - UINT LowRateRatioThreshold; - UINT LowRateCountPeriod; - UINT TotalCntThreshold; - DL_LIST BlackList; - UINT BlackListTimeout; - NDIS_SPIN_LOCK BlackListLock; -} LOWRATE_CTRL, *PLOWRATE_CTRL; -typedef struct _BLACK_STA { - UCHAR Addr[MAC_ADDR_LEN]; - DL_LIST List; - ULONG Jiff; -} BLACK_STA, *PBLACK_STA; -#endif /*RATE_PRIOR_SUPPORT*/ - -/* - The miniport adapter structure -*/ -struct _RTMP_ADAPTER { - VOID *OS_Cookie; /* save specific structure relative to OS */ - PNET_DEV net_dev; - - NDIS_SPIN_LOCK WdevListLock; - struct wifi_dev *wdev_list[WDEV_NUM_MAX]; - - /*About MacTab, the sta driver will use #0 and #1 for multicast and AP. */ - MAC_TABLE MacTab; /* ASIC on-chip WCID entry table. At TX, ASIC always use key according to this on-chip table. */ - NDIS_SPIN_LOCK MacTabLock; -#ifdef TR181_SUPPORT - UINT32 ApBootACSChannelChangePerBandCount[DBDC_BAND_NUM]; -#endif -#ifdef DOT11_N_SUPPORT - BA_TABLE BATable; - NDIS_SPIN_LOCK BATabLock; - RALINK_TIMER_STRUCT RECBATimer; -#endif /* DOT11_N_SUPPORT */ - - UINT8 ucBFBackOffMode; - -#ifdef RF_LOCKDOWN - BOOLEAN fgQAEffuseWriteBack; -#endif /* RF_LOCKDOWN */ - INT32 Avg_NF[DBDC_BAND_NUM]; - INT32 Avg_NFx16[DBDC_BAND_NUM]; -#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(TR181_SUPPORT) || \ - defined(TXRX_STAT_SUPPORT) - CHANNEL_BUSY_TIME Ch_Stats[DBDC_BAND_NUM]; - UINT32 Ch_BusyTime[DBDC_BAND_NUM]; - CHANNEL_STATS ChannelStats; -#endif -#ifdef OFFCHANNEL_SCAN_FEATURE - SORTED_CHANNEL_LIST sorted_list; - UINT8 last_selected_channel; - BOOLEAN radar_hit; -#endif -#if defined(TR181_SUPPORT) || defined(TXRX_STAT_SUPPORT) - UINT32 Ch_BusyTime_11k[DBDC_BAND_NUM]; -#endif - - UINT8 MuHwSwPatch; - -#ifdef ETSI_RX_BLOCKER_SUPPORT - /* Set fix WBRSSI/IBRSSI pattern */ - BOOLEAN fgFixWbIBRssiEn; - - CHAR c1WbRssiWF0; - CHAR c1WbRssiWF1; - CHAR c1WbRssiWF2; - CHAR c1WbRssiWF3; - CHAR c1IbRssiWF0; - CHAR c1IbRssiWF1; - CHAR c1IbRssiWF2; - CHAR c1IbRssiWF3; - - /* set RSSI threshold */ - CHAR c1RWbRssiHTh; - CHAR c1RWbRssiLTh; - CHAR c1RIbRssiLTh; - CHAR c1WBRssiTh4R; - /* set RX BLOCKER check para. */ - UINT8 u1CheckTime; - UINT8 u1To1RCheckCnt; - UINT16 u2To1RvaildCntTH; - UINT16 u2To4RvaildCntTH; - - /* for verification */ - UINT8 u1RxBlockerState; - UINT8 u1ValidCnt; - UINT8 u14RValidCnt; - - UINT8 i1MaxWRssiIdxPrev; - UINT8 u1TimeCnt; - BOOLEAN fgAdaptRxBlock; -#endif /* end of ETSI_RX_BLOCKER_SUPPORT */ - - BOOLEAN fgEPA; - -#ifdef SINGLE_SKU_V2 - UINT8 TxPowerSKU[SKU_SIZE]; -#if defined(MT7615) || defined(MT7622) -#else - UINT8 u1SkuParamLen[SINGLE_SKU_TYPE_PARSE_NUM]; - UINT8 u1SkuChBandNeedParse[SINGLE_SKU_TYPE_PARSE_NUM]; - UINT8 u1SkuFillParamLen[SINGLE_SKU_TYPE_NUM]; - UINT8 u1BackoffParamLen[BACKOFF_TYPE_PARSE_NUM]; - UINT8 u1BackoffChBandNeedParse[BACKOFF_TYPE_PARSE_NUM]; - UINT8 u1BackoffFillParamLen[BACKOFF_TYPE_NUM]; -#endif /* defined(MT7615) || defined(MT7622) */ -#endif - -#ifdef RTMP_MAC_PCI - /*****************************************************************************************/ - /* PCI related parameters */ - /*****************************************************************************************/ - PUCHAR CSRBaseAddress; /* PCI MMIO Base Address, all access will use */ - unsigned int irq_num; - PCI_HIF_T PciHif; - USHORT RLnkCtrlConfiguration; - USHORT RLnkCtrlOffset; - USHORT HostLnkCtrlConfiguration; - USHORT HostLnkCtrlOffset; - USHORT PCIePowerSaveLevel; - ULONG AccessBBPFailCount; - BOOLEAN bPCIclkOff; /* flag that indicate if the PICE power status in Configuration SPace.. */ - BOOLEAN bPCIclkOffDisableTx; - - BOOLEAN brt30xxBanMcuCmd; /* when = 0xff means all commands are ok to set . */ - BOOLEAN b3090ESpecialChip; /* 3090E special chip that write EEPROM 0x24=0x9280. */ - /* ULONG CheckDmaBusyCount; // Check Interrupt Status Register Count. */ - - NDIS_SPIN_LOCK LockInterrupt; - NDIS_SPIN_LOCK tssi_lock; - - BOOLEAN reschedule_rx0; - BOOLEAN reschedule_rx1; - - UINT32 wrong_wlan_idx_num; - -#ifdef CUT_THROUGH - VOID *PktTokenCb; -#endif /* CUT_THROUGH */ - - NDIS_SPIN_LOCK fp_que_lock; - QUEUE_HEADER fp_que; - UINT32 fp_que_max_size; - NDIS_SPIN_LOCK mgmt_que_lock; - QUEUE_HEADER mgmt_que; - NDIS_SPIN_LOCK high_prio_que_lock; - QUEUE_HEADER high_prio_que; - BOOLEAN tx_dequeue_scheduable; -#ifdef INTELP6_UDMA_CPU_LOAD_OPTIMIZATION - BOOLEAN is_blocked; -#endif - RTMP_NET_TASK_STRUCT tx_deque_tasklet; - struct workqueue_struct *qm_wq; - struct work_struct tx_deq_work; - struct work_struct cmd_msg_work; - -#ifdef DBG_AMSDU - UINT32 dbg_time_slot; - RALINK_TIMER_STRUCT amsdu_history_timer; -#endif - BOOLEAN amsdu_fix; - UCHAR amsdu_fix_num; - UCHAR amsdu_max_num; - -#ifdef INT_STATISTIC - ULONG INTCNT; -#ifdef MT_MAC - ULONG INTWFMACINT0CNT; - ULONG INTWFMACINT1CNT; - ULONG INTWFMACINT2CNT; - ULONG INTWFMACINT3CNT; - ULONG INTWFMACINT4CNT; - ULONG INTBCNDLY; - ULONG INTBMCDLY; -#endif - ULONG INTTxCoherentCNT; - ULONG INTRxCoherentCNT; - ULONG INTTxRxCoherentCNT; - ULONG INTFifoStaFullIntCNT; - ULONG INTMGMTDLYCNT; - ULONG INTRXDATACNT; - ULONG INTRXCMDCNT; - ULONG INTHCCACNT; - ULONG INTAC3CNT; - ULONG INTAC2CNT; - ULONG INTAC1CNT; - ULONG INTAC0CNT; - - ULONG INTPreTBTTCNT; - ULONG INTTBTTIntCNT; - ULONG INTGPTimeOutCNT; - ULONG INTRadarCNT; - ULONG INTAutoWakeupIntCNT; -#endif - -#endif /* RTMP_MAC_PCI */ - - NDIS_SPIN_LOCK irq_lock; - - /*======Cmd Thread in PCI/RBUS/USB */ - CmdQ CmdQ; - NDIS_SPIN_LOCK CmdQLock; /* CmdQLock spinlock */ - RTMP_OS_TASK cmdQTask; - HW_CTRL_T HwCtrl; - RTMP_OS_SEM AutoRateLock; - -#if defined(CONFIG_AP_SUPPORT) && defined(AP_SCAN_SUPPORT) && \ - defined(OFFCHANNEL_SCAN_FEATURE) - CHANNELINFO ChannelInfo; -#endif - -#ifdef CONFIG_ATE - /* lock for ATE */ - NDIS_SPIN_LOCK GenericLock; /* ATE Tx/Rx generic spinlock */ -#endif /* CONFIG_ATE */ - - /*********************************************************/ - /* Both PCI/USB related parameters */ - /*********************************************************/ - /*RTMP_DEV_INFO chipInfo; */ - RTMP_INF_TYPE infType; - UCHAR AntMode; - - /*********************************************************/ - /* Driver Mgmt related parameters */ - /*********************************************************/ - /* OP mode: either AP or STA */ - UCHAR OpMode; /* OPMODE_STA, OPMODE_AP */ - - UINT32 BssInfoIdxBitMap0; /* mapping BssInfoIdx inside wdev struct with FW BssInfoIdx */ - UINT32 BssInfoIdxBitMap1; /* mapping BssInfoIdx inside wdev struct with FW BssInfoIdx */ - NDIS_SPIN_LOCK BssInfoIdxBitMapLock; - - RTMP_OS_TASK mlmeTask; -#ifdef RTMP_TIMER_TASK_SUPPORT - /* If you want use timer task to handle the timer related jobs, enable this. */ - RTMP_TIMER_TASK_QUEUE TimerQ; - NDIS_SPIN_LOCK TimerQLock; - RTMP_OS_TASK timerTask; -#endif /* RTMP_TIMER_TASK_SUPPORT */ - - /*********************************************************/ - /* Tx related parameters */ - /*********************************************************/ - BOOLEAN *DeQueueRunning; /* for ensuring RTUSBDeQueuePacket get call once */ - NDIS_SPIN_LOCK *DeQueueLock; - - /* resource for software backlog queues */ - QUEUE_HEADER *TxSwQueue; /* 4 AC + 1 HCCA */ - NDIS_SPIN_LOCK *TxSwQueueLock; /* TxSwQueue spinlock */ -#if defined(MT_MAC) && defined(IP_ASSEMBLY) - DL_LIST *assebQueue; - VOID *cur_ip_assem_data; -#endif - - /* Maximum allowed tx software Queue length */ - UINT TxSwQMaxLen; - NDIS_SPIN_LOCK tx_swq_lock[WMM_NUM_OF_AC]; - struct tx_swq_fifo tx_swq[WMM_NUM_OF_AC]; - - UCHAR LastMCUCmd; - -#ifdef REDUCE_TCP_ACK_SUPPORT - struct hlist_head ackCnxHashTbl[REDUCE_ACK_MAX_HASH_BUCKETS]; - struct list_head ackCnxList; - UINT32 ReduceAckConnections; - struct delayed_work ackFlushWork; - struct delayed_work cnxFlushWork; - NDIS_SPIN_LOCK ReduceAckLock; -#endif - -#ifdef RACTRL_LIMIT_MAX_PHY_RATE - BOOLEAN fgRaLimitPhyRate; -#endif /* RACTRL_LIMIT_MAX_PHY_RATE */ - - /*********************************************************/ - /* Rx related parameters */ - /*********************************************************/ - -#ifdef RTMP_MAC_PCI - /* TODO: shiang, check the purpose of following lock "McuCmdLock" */ - NDIS_SPIN_LOCK - McuCmdLock; /*MCU Command Queue spinlock for RT3090/3592/3390/3593/5390/5392/5592/3290 */ -#endif /* RTMP_MAC_PCI */ - - /* RX re-assembly buffer for fragmentation */ - FRAGMENT_FRAME FragFrame; /* Frame storage for fragment frame */ - -#ifdef MT_MAC - TXS_CTL TxSCtl; - TMR_CTRL_STRUCT *pTmrCtrlStruct; -#endif - -#ifdef FTM_SUPPORT - PFTM_CTRL pFtmCtrl; -#endif /* FTM_SUPPORT */ - -#ifdef CONFIG_CSO_SUPPORT - RX_CSO_STRUCT rCso; -#endif - - /***********************************************************/ - /* ASIC related parameters */ - /***********************************************************/ - RTMP_ARCH_OP archOps; - struct qm_ctl qm_ctl; - struct qm_ops *qm_ops; - struct notify_entry qm_wsys_ne; - struct tm_ops *tm_qm_ops; - struct tm_ops *tm_hif_ops; - struct phy_ops *phy_op; - struct hw_setting hw_cfg; - - UINT32 MACVersion; /* MAC version. Record rt2860C(0x28600100) or rt2860D (0x28600101).. */ - UINT32 ChipID; - UINT32 HWVersion; - UINT32 FWVersion; - UINT16 ee_chipId; /* Chip version. Read from EEPROM 0x00 to identify RT5390H */ - INT dev_idx; - -#ifdef MT_MAC - struct rtmp_mac_ctrl mac_ctrl; - USHORT rx_pspoll_filter; -#endif /* MT_MAC */ - - /* --------------------------- */ - /* E2PROM */ - /* --------------------------- */ - enum EEPROM_STORAGE_TYPE eeprom_type; - - ULONG EepromVersion; /* byte 0: version, byte 1: revision, byte 2~3: unused */ - ULONG FirmwareVersion; /* byte 0: Minor version, byte 1: Major version, otherwise unused. */ - USHORT EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS]; - UCHAR EEPROMAddressNum; /* 93c46=6 93c66=8 */ - BOOLEAN EepromAccess; - UCHAR EFuseTag; - -#ifdef RTMP_EFUSE_SUPPORT - BOOLEAN bUseEfuse; -#endif /* RTMP_EFUSE_SUPPORT */ - - UCHAR *EEPROMImage; - UCHAR E2pAccessMode; /* Used to identify flash, efuse, eeprom or bin from start-up */ - struct _EEPROM_CONTROL E2pCtrl; - -#ifdef RF_LOCKDOWN - BOOLEAN fgCalFreeApply; - UINT16 RFlockTempIdx; - UINT16 CalFreeTempIdx; -#endif /* RF_LOCKDOWN */ - -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) - UINT32 CalFileOffset; -#endif /* CAL_BIN_FILE_SUPPORT */ -#ifdef PRE_CAL_TRX_SET1_SUPPORT - BOOLEAN bDCOCReloaded; - BOOLEAN bDPDReloaded; - UCHAR *CalDCOCImage; - UCHAR *CalDPDAPart1Image; - UCHAR *CalDPDAPart2Image; -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#ifdef PRE_CAL_MT7622_SUPPORT -#define CAL_LOG_SIZE 5000 -#define CAL_TXLPFG_SIZE (4 * sizeof(UINT32)) -#define CAL_TXDCIQ_SIZE (48 * sizeof(UINT32)) -#define CAL_TXDPD_PERCHAN_SIZE (304 * sizeof(UINT32)) -#define CAL_TXDPD_SIZE (CAL_TXDPD_PERCHAN_SIZE * 14) - BOOLEAN bPreCalMode; - UCHAR *CalTXLPFGImage; - UCHAR *CalTXDCIQImage; - UCHAR *CalTXDPDImage; - UINT16 TxDpdCalOfst; -#endif /*PRE_CAL_MT7622_SUPPORT*/ -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) - UCHAR *PreCalReStoreBuffer; - UCHAR *PreCalStoreBuffer; - UINT16 PreCalWriteOffSet; - UINT16 ChGrpMap; -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) - VOID *rlmCalCache; -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - - EEPROM_ANTENNA_STRUC - Antenna; /* Since ANtenna definition is different for a & g. We need to save it for future reference. */ -#ifdef DBDC_MODE - UINT8 dbdc_band0_tx_path; - UINT8 dbdc_band0_rx_path; - UINT8 dbdc_band1_tx_path; - UINT8 dbdc_band1_rx_path; -#endif - EEPROM_NIC_CONFIG2_STRUC NicConfig2; - - /* --------------------------- */ - /* BBP Control */ - /* --------------------------- */ -#if defined(RTMP_BBP) || defined(CONFIG_ATE) - /* TODO: shiang-6590, remove "defined(CONFIG_ATE)" after ATE has fully re-organized! */ - UCHAR BbpWriteLatch - [MAX_BBP_ID + - 1]; /* record last BBP register value written via BBP_IO_WRITE/BBP_IO_WRITE_VY_REG_ID */ - UCHAR Bbp94; -#endif /* defined(RTMP_BBP) || defined(CONFIG_ATE) */ - - CHAR BbpRssiToDbmDelta; /* change from UCHAR to CHAR for high power */ - BBP_R66_TUNING BbpTuning; - - /* ---------------------------- */ - /* RFIC control */ - /* ---------------------------- */ - UCHAR RfIcType; /* RFIC_xxx */ - UCHAR RfFreqOffset; /* Frequency offset for channel switching */ - - RTMP_RF_REGS - LatchRfRegs; /* latch th latest RF programming value since RF IC doesn't support READ */ - -#ifdef RTMP_RBUS_SUPPORT - UCHAR RfFreqDelta; /* Frequency Delta */ -#endif /* RTMP_RBUS_SUPPORT */ -#ifdef RTMP_MAC_PCI - UCHAR ShowRf; /* Show RF register write for 2880 */ -#endif /* RTMP_MAC_PCI */ - - /* This soft Rx Antenna Diversity mechanism is used only when user set */ - /* RX Antenna = DIVERSITY ON */ - SOFT_RX_ANT_DIVERSITY RxAnt; - - /* ---------------------------- */ - /* TxPower control */ - /* ---------------------------- */ - CHANNEL_TX_POWER TxPower - [MAX_NUM_OF_CHANNELS]; /* Store Tx power value for all channels. */ - CHANNEL_TX_POWER ChannelList - [MAX_NUM_OF_CHANNELS]; /* list all supported channels for site survey */ - - UCHAR MaxTxPwr; /*announced in beacon*/ - - UCHAR ChannelListNum; /* number of channel in ChannelList[] */ - BOOLEAN BbpForCCK; - ULONG Tx20MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE]; - ULONG Tx20MPwrCfgGBand[MAX_TXPOWER_ARRAY_SIZE]; - ULONG Tx40MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE]; - ULONG Tx40MPwrCfgGBand[MAX_TXPOWER_ARRAY_SIZE]; -#ifdef DOT11_VHT_AC - ULONG Tx80MPwrCfgABand - [MAX_TXPOWER_ARRAY_SIZE]; /* Per-rate Tx power control for VHT BW80 (5GHz only) */ - BOOLEAN force_vht_op_mode; -#endif /* DOT11_VHT_AC */ - - BOOLEAN bAutoTxAgcA; /* Enable driver auto Tx Agc control */ - UCHAR TssiRefA; /* Store Tssi reference value as 25 temperature. */ - UCHAR TssiPlusBoundaryA - [2] - [8]; /* Tssi boundary for increase Tx power to compensate. [Group][Boundary Index]*/ - UCHAR TssiMinusBoundaryA - [2] - [8]; /* Tssi boundary for decrease Tx power to compensate. [Group][Boundary Index]*/ - UCHAR TxAgcStepA; /* Store Tx TSSI delta increment / decrement value */ - CHAR TxAgcCompensateA; /* Store the compensation (TxAgcStep * (idx-1)) */ - CHAR TssiCalibratedOffset; /* reference temperature(e2p[D1h]) */ - UCHAR ChBndryIdx; /* 5G Channel Group Boundary Index for Temperature Compensation */ - - BOOLEAN bAutoTxAgcG; /* Enable driver auto Tx Agc control */ - UCHAR TssiRefG; /* Store Tssi reference value as 25 temperature. */ - UCHAR TssiPlusBoundaryG - [8]; /* Tssi boundary for increase Tx power to compensate. */ - UCHAR TssiMinusBoundaryG - [8]; /* Tssi boundary for decrease Tx power to compensate. */ - UCHAR TxAgcStepG; /* Store Tx TSSI delta increment / decrement value */ - CHAR TxAgcCompensateG; /* Store the compensation (TxAgcStep * (idx-1)) */ - CHAR mp_delta_pwr; /* calculated by MP ATE temperature */ - -#ifdef THERMAL_PROTECT_SUPPORT - BOOLEAN force_one_tx_stream; - BOOLEAN force_radio_off; - BOOLEAN fgThermalProtectToggle; - INT32 last_thermal_pro_temp; - INT32 thermal_pro_high_criteria; - BOOLEAN thermal_pro_high_en; - INT32 thermal_pro_low_criteria; - BOOLEAN thermal_pro_low_en; - UINT32 recheck_timer; - INT32 thermal_pro_RFOff_criteria; - BOOLEAN thermal_pro_RFOff_en; -#endif /* THERMAL_PROTECT_SUPPORT */ - - signed char BGRssiOffset - [4]; /* Store B/G RSSI #0/1/2 Offset value on EEPROM 0x46h */ - signed char ARssiOffset - [4]; /* Store A RSSI 0/1/2 Offset value on EEPROM 0x4Ah */ - - CHAR BLNAGain; /* Store B/G external LNA#0 value on EEPROM 0x44h */ - CHAR ALNAGain0; /* Store A external LNA#0 value for ch36~64 */ - CHAR ALNAGain1; /* Store A external LNA#1 value for ch100~128 */ - CHAR ALNAGain2; /* Store A external LNA#2 value for ch132~165 */ - UCHAR TxMixerGain24G; /* Tx mixer gain value from EEPROM to improve Tx EVM / Tx DAC, 2.4G */ - UCHAR TxMixerGain5G; - -#ifdef LED_CONTROL_SUPPORT - /* LED control */ - LED_CONTROL LedCntl; -#endif /* LED_CONTROL_SUPPORT */ - - /* ---------------------------- */ - /* MAC control */ - /* ---------------------------- */ - UCHAR wmm_cw_min; /* CW_MIN_IN_BITS, actual CwMin = 2^CW_MIN_IN_BITS - 1 */ - UCHAR wmm_cw_max; /* CW_MAX_IN_BITS, actual CwMax = 2^CW_MAX_IN_BITS - 1 */ - - /*****************************************************************************************/ - /* 802.11 related parameters */ - /*****************************************************************************************/ - /* outgoing BEACON frame buffer and corresponding TXD */ - USHORT BeaconOffset[HW_BEACON_MAX_NUM]; - - /* pre-build PS-POLL and NULL frame upon link up. for efficiency purpose. */ - HEADER_802_11 NullFrame; - -#ifdef UAPSD_SUPPORT - NDIS_SPIN_LOCK UAPSDEOSPLock; /* EOSP frame access lock use */ - BOOLEAN bAPSDFlagSPSuspend; /* 1: SP is suspended; 0: SP is not */ -#endif /* UAPSD_SUPPORT */ - - MONITOR_STRUCT monitor_ctrl[MONITOR_MAX_DEV_NUM]; - -#ifdef DOT11_SAE_SUPPORT - SAE_CFG SaeCfg; -#endif /* DOT11_SAE_SUPPORT */ - - /*=========AP=========== */ -#ifdef CONFIG_AP_SUPPORT - /* ----------------------------------------------- */ - /* AP specific configuration & operation status */ - /* used only when pAd->OpMode == OPMODE_AP */ - /* ----------------------------------------------- */ - AP_ADMIN_CONFIG ApCfg; /* user configuration when in AP mode */ - AP_MLME_AUX ApMlmeAux; - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - BCN_CHECK_INFO_STRUC BcnCheckInfo; -#endif - -#ifdef RT_CFG80211_SUPPORT - RADIUS_ACCOUNT_ENTRY radius_tbl[MAX_LEN_OF_MAC_TABLE]; -#endif - -#if defined(WDS_SUPPORT) || defined(CLIENT_WDS) - WDS_TABLE WdsTab; /* WDS table when working as an AP */ -#endif /* WDS_SUPPORT */ - -#ifdef MBSS_SUPPORT - BOOLEAN FlgMbssInit; -#endif /* MBSS_SUPPORT */ - -#ifdef APCLI_SUPPORT - BOOLEAN flg_apcli_init; -#ifdef APCLI_CERT_SUPPORT - BOOLEAN bApCliCertTest; -#endif /* APCLI_CERT_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#ifdef WSC_AP_SUPPORT - BOOLEAN bWpsCertTest; -#endif - - /*#ifdef AUTO_CH_SELECT_ENHANCE */ - PBSSINFO pBssInfoTab; - PCHANNELINFO pChannelInfo; - /*#endif // AUTO_CH_SELECT_ENHANCE */ - -#endif /* CONFIG_AP_SUPPORT */ - - /*=======STA=========== */ - - /*=======Common=========== */ - enum RATE_ADAPT_ALG rateAlg; /* Rate adaptation algorithm */ - -#ifdef PROFILE_PATH_DYNAMIC - CHAR *profilePath; -#endif /* PROFILE_PATH_DYNAMIC */ - - NDIS_MEDIA_STATE - IndicateMediaState; /* Base on Indication state, default is NdisMediaStateDisConnected */ - -#ifdef PROFILE_STORE - RTMP_OS_TASK WriteDatTask; - BOOLEAN bWriteDat; -#endif /* PROFILE_STORE */ - -#ifdef CREDENTIAL_STORE - STA_CONNECT_INFO StaCtIf; -#endif /* CREDENTIAL_STORE */ - -#ifdef WSC_INCLUDED - RTMP_OS_TASK wscTask; - UCHAR WriteWscCfgToDatFile; - BOOLEAN WriteWscCfgToAr9DatFile; - NDIS_SPIN_LOCK WscElmeLock; - MLME_QUEUE_ELEM *pWscElme; - - /* WSC hardware push button function 0811 */ - BOOLEAN WscHdrPshBtnFlag; /* 1: support, read from EEPROM */ -#ifdef CONFIG_AP_SUPPORT - BOOLEAN bWscDriverAutoUpdateCfg; -#endif /* CONFIG_AP_SUPPORT */ -#endif /* WSC_INCLUDED */ - - /* MAT related parameters */ -#ifdef MAT_SUPPORT - MAT_STRUCT MatCfg; -#endif /* MAT_SUPPORT */ - -#ifdef RTMP_RBUS_SUPPORT -#ifdef VIDEO_TURBINE_SUPPORT - AP_VIDEO_STRUCT VideoTurbine; -#endif /* VIDEO_TURBINE_SUPPORT */ -#endif /* RTMP_RBUS_SUPPORT */ - - /* - Frequency setting for rate adaptation - @ra_interval: for baseline time interval - @ra_fast_interval: for quick response time interval - */ - UINT32 ra_interval; - UINT32 ra_fast_interval; - - /* configuration: read from Registry & E2PROM */ - BOOLEAN bLocalAdminMAC; /* Use user changed MAC */ - UCHAR PermanentAddress[MAC_ADDR_LEN]; /* Factory default MAC address */ - UCHAR CurrentAddress[MAC_ADDR_LEN]; /* User changed MAC address */ - -#ifdef MT_MAC - UCHAR ExtendMBssAddr[EXTEND_MBSS_MAC_MAX] - [MAC_ADDR_LEN]; /* User defined MAC address for MBSSID*/ - BOOLEAN bLocalAdminExtendMBssMAC; /* Use user changed MAC */ -#endif - - /* ------------------------------------------------------ */ - /* common configuration to both OPMODE_STA and OPMODE_AP */ - /* ------------------------------------------------------ */ - UINT VirtualIfCnt; - NDIS_SPIN_LOCK VirtualIfLock; - - COMMON_CONFIG CommonCfg; -#ifdef COEX_SUPPORT - BOOLEAN BtCoexBeaconLimit; - UINT32 BtWlanStatus; - UINT32 BtCoexSupportMode; - UINT32 BtCoexMode; - UINT32 BtCoexLiveTime; - UINT32 BtCoexBASize; - UINT32 BtCoexOriBASize; - UCHAR BtProtectionMode; - UCHAR BtProtectionRate; - UCHAR BtSkipFDDFix20MH; -#endif /* COEX_SUPPORT */ - MLME_STRUCT Mlme; - - /* AP needs those vaiables for site survey feature. */ - -#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) - SCAN_CTRL ScanCtrl; - BSS_TABLE ScanTab; /* store the latest SCAN result */ -#endif /* defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) */ -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - UCHAR ErrRecoveryCheck; -#endif -#endif -#ifdef TXRX_STAT_SUPPORT - BOOLEAN TXRX_EnableReadRssi; - BOOLEAN EnableTxRxStats; -#endif -#ifdef CUSTOMER_RSG_FEATURE - BOOLEAN EnableChannelStatsCheck; - RADIO_STATS_COUNTER RadioStatsCounter; - UINT32 beacon_cnt; -#endif -#ifdef CUSTOMER_DCC_FEATURE - BOOLEAN EnableRssiReadDataPacket; - BOOLEAN ApDisableSTAConnectFlag; - ALLOWED_STA_LIST AllowedStaList; - STREAMING_TYPE_STATUS StreamingTypeStatus; -#endif -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - BSS_TABLE AvailableBSS; /* stores the information of the BSS on the channel on which AP is operating */ - BOOLEAN ApEnableBeaconTable; -#endif - - EXT_CAP_INFO_ELEMENT ExtCapInfo; - -#ifdef AIR_MONITOR - UCHAR MntEnable; - MNT_STA_ENTRY MntTable[MAX_NUM_OF_MONITOR_STA]; - MNT_MUAR_GROUP MntGroupTable[MAX_NUM_OF_MONITOR_GROUP]; - UCHAR MntIdx; - UCHAR curMntAddr[MAC_ADDR_LEN]; - UINT32 MonitrCnt[BAND_NUM]; - UCHAR MntRuleBitMap; -#endif /* AIR_MONITOR */ - - /* DOT11_H */ - struct DOT11_H Dot11_H[DBDC_BAND_NUM]; - - /* encryption/decryption KEY tables */ - CIPHER_KEY SharedKey[HW_BEACON_MAX_NUM + MAX_P2P_NUM] - [4]; /* STA always use SharedKey[BSS0][0..3] */ - - /* various Counters */ - COUNTER_802_3 Counters8023; /* 802.3 counters */ - COUNTER_802_11 WlanCounters[DBDC_BAND_NUM]; /* 802.11 MIB counters */ - COUNTER_RALINK RalinkCounters; /* Ralink propriety counters */ - /* COUNTER_DRS DrsCounters; */ /* counters for Dynamic TX Rate Switching */ - PRIVATE_STRUC PrivateInfo; /* Private information & counters */ - - /* flags, see fRTMP_ADAPTER_xxx flags */ - ULONG Flags; /* Represent current device status */ - ULONG PSFlags; /* Power Save operation flag. */ - ULONG MoreFlags; /* Represent specific requirement */ - - /* current TX sequence # */ - USHORT Sequence; - - /* Control disconnect / connect event generation */ - /*+++Didn't used anymore */ - ULONG LinkDownTime; - /*--- */ - ULONG LastRxRate; - ULONG LastTxRate; - -#ifdef CONFIG_AP_SUPPORT - BOOLEAN bConfigChanged; /* Config Change flag for the same SSID setting */ -#endif - /*+++Used only for Station */ - BOOLEAN bDisableRtsProtect; - /*--- */ - - ULONG ExtraInfo; /* Extra information for displaying status of UI */ - ULONG SystemErrorBitmap; /* b0: E2PROM version error */ - -#ifdef SYSTEM_LOG_SUPPORT - /* --------------------------- */ - /* System event log */ - /* --------------------------- */ - RT_802_11_EVENT_TABLE EventTab; -#endif /* SYSTEM_LOG_SUPPORT */ - -#ifdef HOSTAPD_SUPPORT - UINT32 IoctlIF; -#endif /* HOSTAPD_SUPPORT */ -#ifdef INF_PPA_SUPPORT - UINT32 g_if_id; - BOOLEAN PPAEnable; - PPA_DIRECTPATH_CB *pDirectpathCb; -#endif /* INF_PPA_SUPPORT */ - - /**********************************************************/ - /* Statistic related parameters */ - /**********************************************************/ - - BOOLEAN bUpdateBcnCntDone; - - ULONG macwd; - /* ---------------------------- */ - /* DEBUG paramerts */ - /* ---------------------------- */ - - BOOLEAN bLinkAdapt; - BOOLEAN bForcePrintTX; - BOOLEAN bForcePrintRX; - BOOLEAN bStaFifoTest; - BOOLEAN bProtectionTest; - BOOLEAN bHCCATest; - BOOLEAN bGenOneHCCA; - BOOLEAN bBroadComHT; - ULONG BulkOutReq; - ULONG BulkOutComplete; - ULONG BulkOutCompleteOther; - ULONG BulkOutCompleteCancel; /* seems not use now? */ - struct wificonf WIFItestbed; - - UCHAR TssiGain; - -#ifdef CONFIG_ATE - struct _ATE_CTRL ATECtrl; - struct _LOOPBACK_CTRL LbCtrl; -#endif -#ifdef PRE_CAL_TRX_SET1_SUPPORT - BOOLEAN KtoFlashDebug; -#endif - -#ifdef DOT11_N_SUPPORT - struct reordering_mpdu_pool mpdu_blk_pool; -#endif /* DOT11_N_SUPPORT */ - - /* statistics count */ - - VOID *iw_stats; - VOID *stats; - -#ifdef BLOCK_NET_IF - BLOCK_QUEUE_ENTRY *blockQueueTab; -#endif /* BLOCK_NET_IF */ - -#ifdef CONFIG_AP_SUPPORT -#ifdef IGMP_SNOOP_SUPPORT - PMULTICAST_FILTER_TABLE pMulticastFilterTable; - UCHAR IgmpGroupTxRate; - PMULTICAST_WHITE_LIST_FILTER_TABLE pMcastWLTable; -#endif /* IGMP_SNOOP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef MULTIPLE_CARD_SUPPORT - INT32 MC_RowID; - RTMP_STRING MC_FileName[256]; - UINT32 E2P_OFFSET_IN_FLASH[MAX_NUM_OF_MULTIPLE_CARD]; -#endif /* MULTIPLE_CARD_SUPPORT */ - - ULONG TbttTickCount; /* beacon timestamp work-around */ - -#ifdef CONFIG_AP_SUPPORT - RALINK_TIMER_STRUCT PeriodicTimer; -#endif /* CONFIG_AP_SUPPORT */ - - /* for detect_wmm_traffic() BE TXOP use */ - ULONG OneSecondnonBEpackets; /* record non BE packets per second */ -#define ONE_SECOND_NON_BE_PACKETS_THRESHOLD (50) - UCHAR is_on; - - /* for detect_wmm_traffic() BE/BK TXOP use */ -#define TIME_BASE (1000000 / OS_HZ) -#define TIME_ONE_SECOND (1000000 / TIME_BASE) - UCHAR flg_be_adjust; - ULONG be_adjust_last_time; - -#ifdef WSC_INCLUDED - /* for multiple card */ - UCHAR *pHmacData; -#endif /* WSC_INCLUDED */ - -#ifdef IKANOS_VX_1X0 - struct IKANOS_TX_INFO IkanosTxInfo; - struct IKANOS_TX_INFO IkanosRxInfo[HW_BEACON_MAX_NUM + MAX_WDS_ENTRY + - MAX_APCLI_NUM + MAX_MESH_NUM]; -#endif /* IKANOS_VX_1X0 */ - - UINT8 FlgCtsEnabled; - UINT8 PM_FlgSuspend; - - UCHAR FifoUpdateDone, FifoUpdateRx; - -#ifdef LINUX -#ifdef RT_CFG80211_SUPPORT - CFG80211_CTRL cfg80211_ctrl; - VOID *pCfg80211_CB; -#endif /* RT_CFG80211_SUPPORT */ -#endif /* LINUX */ - -#ifdef OS_ABL_SUPPORT -#ifdef MAT_SUPPORT - /* used in OS_ABL */ - BOOLEAN (*MATPktRxNeedConvert)(RTMP_ADAPTER *pAd, PNET_DEV net_dev); - - PUCHAR(*MATEngineRxHandle) - (RTMP_ADAPTER *pAd, PNDIS_PACKET pPkt, UINT infIdx); -#endif /* MAT_SUPPORT */ -#endif /* OS_ABL_SUPPORT */ - - UINT32 ContinueMemAllocFailCount; - - struct { - INT IeLen; - UCHAR *pIe; - } ProbeRespIE[MAX_LEN_OF_BSS_TABLE]; - - /* purpose: We free all kernel resources when module is removed */ - LIST_HEADER RscTimerMemList; /* resource timers memory */ - LIST_HEADER RscTaskMemList; /* resource tasks memory */ - LIST_HEADER RscLockMemList; /* resource locks memory */ - LIST_HEADER RscTaskletMemList; /* resource tasklets memory */ - LIST_HEADER RscSemMemList; /* resource semaphore memory */ - LIST_HEADER RscAtomicMemList; /* resource atomic memory */ - - /* purpose: Cancel all timers when module is removed */ - LIST_HEADER RscTimerCreateList; /* timers list */ - -#ifdef OS_ABL_SUPPORT -#ifdef RTMP_PCI_SUPPORT - RTMP_PCI_CONFIG PciConfig; -#endif /* RTMP_PCI_SUPPORT */ -#endif /* OS_ABL_SUPPORT */ - -#ifdef SMART_ANTENNA - int smartAntEnable; /* trigger to enable the smartAntenna function */ - int smartAntDbgOn; - SMART_ANTENNA_STRUCT *pSAParam; - NDIS_SPIN_LOCK - smartAntLock; /* lock used to handle synchronization of smart antenna algorithms. */ -#endif /* SMART_ANTENNA */ - -#ifdef CONFIG_MULTI_CHANNEL - CHAR NullFrBuf[256]; - UINT32 MultiChannelFlowCtl; - RTMP_OS_TASK MultiChannelTask; - UCHAR MultiChannelAction; -#endif /* CONFIG_MULTI_CHANNEL */ - -#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || \ - defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) - WOW_CFG_STRUCT WOW_Cfg; /* data structure for wake on wireless */ -#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) */ - -#ifdef MULTI_MAC_ADDR_EXT_SUPPORT - BOOLEAN bUseMultiMacAddrExt; -#endif /* MULTI_MAC_ADDR_EXT_SUPPORT */ - -#ifdef HW_TX_RATE_LOOKUP_SUPPORT - BOOLEAN bUseHwTxLURate; -#endif /* HW_TX_RATE_LOOKUP_SUPPORT */ - -#ifdef CONFIG_ANDES_SUPPORT - struct MCU_CTRL MCUCtrl; -#endif /* CONFIG_ANDES_SUPPORT */ - -#ifdef WLAN_SKB_RECYCLE - struct sk_buff_head rx0_recycle; -#endif /* WLAN_SKB_RECYCLE */ - -#ifdef CONFIG_MULTI_CHANNEL - /* TODO: shiang-usw, duplicate definition with */ - USHORT NullBufOffset[2]; - CHAR NullFrBuf[100]; - UINT32 NullFrLen; - /* - UINT32 MultiChannelFlowCtl; - RTMP_OS_TASK MultiChannelTask; - UCHAR MultiChannelAction; - */ -#endif /* CONFIG_MULTI_CHANNEL */ - -#ifdef SINGLE_SKU_V2 - DL_LIST PwrLimitSkuList; - DL_LIST PwrLimitBackoffList; - UCHAR DefaultTargetPwr; - CHAR SingleSkuRatePwrDiff[19]; - BOOLEAN bOpenFileSuccess; -#endif /* SINGLE_SKU_V2 */ - -#if defined(WFA_VHT_PF) || defined(MT7603_FPGA) || defined(MT7628_FPGA) || \ - defined(MT7636_FPGA) || defined(MT7637_FPGA) - BOOLEAN force_amsdu; -#endif -#ifdef WFA_VHT_PF - BOOLEAN force_noack; - BOOLEAN vht_force_sgi; - BOOLEAN vht_force_tx_stbc; - - BOOLEAN force_vht_op_mode; - UCHAR vht_pf_op_ss; - UCHAR vht_pf_op_bw; -#endif /* WFA_VHT_PF */ - -#ifdef DBG_DIAGNOSE - RtmpDiagStruct DiagStruct; -#endif /* DBG_DIAGNOSE */ - -#ifdef SNIFFER_SUPPORT - struct sniffer_control sniffer_ctl; -#endif - -#ifdef TXBF_SUPPORT - MANUAL_CONN AteManualConnInfo; - PUCHAR piBfPhaseG0; - PUCHAR piBfPhaseGx; - BOOLEAN fgCalibrationFail; - BOOLEAN fgGroupIdPassFailStatus[9]; - BOOLEAN fgAutoStart; -#ifdef VHT_TXBF_SUPPORT - BOOLEAN NDPA_Request; -#endif - TXBF_PFMU_STA_INFO rStaRecBf; - PFMU_PROFILE_TAG1 rPfmuTag1; - PFMU_PROFILE_TAG2 rPfmuTag2; - PFMU_DATA prof; - UCHAR ApCli_idx; - UCHAR ApCli_CmmWlanId; - BOOLEAN fgApCliBfStaRecRegister; - BOOLEAN fgApClientMode; - BOOLEAN fgClonedStaWithBfeeSelected; - UCHAR ReptClonedStaEntry_CliIdx; -#endif /* TXBF_SUPPORT */ - - BOOLEAN bPS_Retrieve; - - UINT32 rxv2_cyc3[10]; - -#ifdef DBG -#ifdef MT_MAC - UCHAR BcnCnt; /* Carter debug */ - ULONG HandleInterruptTime; - ULONG HandlePreInterruptTime; -#endif -#endif - -#ifdef RTMP_MAC_PCI - UINT32 RxResetDropCount; - BOOLEAN RxRest; - BOOLEAN PDMAWatchDogEn; - BOOLEAN PDMAWatchDogDbg; - UINT8 TxDMACheckTimes; - UINT8 RxDMACheckTimes; - ULONG TxDMAResetCount; - ULONG RxDMAResetCount; - ULONG PDMAResetFailCount; -#endif - BOOLEAN PSEWatchDogEn; - UINT8 RxPseCheckTimes; - RTMP_OS_SEM IndirectUpdateLock; - ULONG PSEResetCount; - ULONG PSETriggerType1Count; - ULONG PSETriggerType2Count; - ULONG PSEResetFailCount; - - ULONG TxTotalByteCnt; - ULONG RxTotalByteCnt; -#ifdef MT_MAC - TX_AC_PARAM_T CurrEdcaParam[CMD_EDCA_AC_MAX]; -#endif /* MT_MAC */ - -#ifdef CONFIG_DVT_MODE - DVTCTRL_T rDvtCtrl; -#endif /* CONFIG_DVT_MODE */ - - /* ------------------- */ - /* For heart beat detection*/ - /* ------------------- */ - UINT32 pre_cr4_heart_beat_cnt; - UINT32 pre_n9_heart_beat_cnt; - UINT8 heart_beat_stop; - -#ifdef FW_DUMP_SUPPORT - /* ---------------------------- */ - /* For FW crash dump */ - /* ---------------------------- */ -#define MAX_FW_DUMP_SIZE 1024000 - UCHAR *fw_dump_buffer; - UINT32 fw_dump_max_size; - UINT32 fw_dump_size; - UINT32 fw_dump_read; -#endif - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) - INT32 SpectrumStatus; - INT32 ICapStatus; - UINT8 ICapMode; - UINT32 SpectrumEventCnt; - UINT32 SpectrumIdx; - UINT32 ICapEventCnt; - UINT32 ICapDataCnt; - UINT32 ICapL32Cnt; - UINT32 ICapM32Cnt; - UINT32 ICapH32Cnt; - UINT32 ICapIdx; - UINT32 ICapCapLen; - PUINT32 pL32Bit; - PUINT32 pM32Bit; - PUINT32 pH32Bit; - RTMP_OS_FD pSrcf_IQ; - RTMP_OS_FD pSrcf_Gain; - RTMP_STRING *pSrc_IQ; - RTMP_STRING *pSrc_Gain; - RTMP_OS_COMPLETION SpectrumDumpDataDone; - RTMP_OS_COMPLETION ICapDumpDone; - P_RBIST_IQ_DATA_T pIQ_Array; -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - -#ifdef BACKGROUND_SCAN_SUPPORT - BACKGROUND_SCAN_CTRL BgndScanCtrl; -#endif /* BACKGROUND_SCAN_SUPPORT */ - VOID *hdev_ctrl; -#ifdef CONFIG_AP_SUPPORT - /*for VOW HW CR address change.*/ - VOW_CR_OFFSET_FOR_GEN_T vow_gen; -#endif /* CONFIG_AP_SUPPORT */ -#ifdef VOW_SUPPORT -#ifdef CONFIG_AP_SUPPORT - VOW_RX_TIME_CFG_T vow_rx_time_cfg; - VOW_BSS_USER_CFG_T vow_bss_cfg[VOW_MAX_GROUP_NUM]; - /* VOW_STA_USER_CFG_T vow_sta_cfg[MAX_LEN_OF_MAC_TABLE]; */ - VOW_STA_USER_CFG_T vow_sta_cfg[128]; - VOW_CFG_T vow_cfg; - VOW_AT_ESTIMATOR_T vow_at_est; - VOW_BAD_NODE_T vow_badnode; - VOW_MISC_CFG_T vow_misc_cfg; - UINT8 vow_dvt_en; - - UINT8 vow_monitor_sta; - UINT8 vow_monitor_bss; - UINT8 vow_monitor_mbss; - UINT16 vow_avg_num; - UINT32 vow_show_sta; - UINT32 vow_show_mbss; - - UINT8 vow_watf_en; - UINT8 vow_watf_q_lv0; - UINT8 vow_watf_q_lv1; - UINT8 vow_watf_q_lv2; - UINT8 vow_watf_q_lv3; - - VOW_WATF vow_watf_mac[VOW_WATF_LEVEL_NUM]; - - UINT8 vow_sta_frr_quantum; /* for fast round robin */ - BOOLEAN vow_sta_frr_flag; - struct multi_cli_ctl vow_mcli_ctl; - struct video_ctl vow_video_ctl; -#endif /* CONFIG_AP_SUPPORT */ -#endif /* VOW_SUPPORT */ - UINT8 red_en; -#ifdef RED_SUPPORT - UINT8 red_have_cr4; - UINT8 red_debug_en; - RED_STA_T red_sta[MAX_LEN_OF_MAC_TABLE]; - UINT16 red_targetdelay; - UINT16 red_atm_on_targetdelay; - UINT16 red_atm_off_targetdelay; - UINT8 red_sta_num; - UINT8 red_in_use_sta; - RALINK_TIMER_STRUCT red_badnode_timer; -#endif /* RED_SUPPORT */ -#ifdef FQ_SCH_SUPPORT - struct fq_ctrl_type fq_ctrl; -#endif /* FQ_SCH_SUPPORT */ - UINT8 cp_support; - UINT8 cp_have_cr4; - - UINT8 ucRxRateRecordEn; - UINT32 arRateCCK[8]; - UINT32 arRateOFDM[8]; - UINT32 arRateHT[4][10]; - UINT32 arRateVHT[4][10]; - - /* Start pointer of RxVB element */ - PRxVBQElmt prxvbstartelmt; - /* Current pointer of RxVB element */ - PRxVBQElmt prxvbcurelmt; - UINT32 rxvbsize; - - UINT8 ucRxvRecordEn; - UINT8 ucRxvMode; - UINT8 ucRxvWcid; - UINT8 ucRxvCurSN; - UINT8 ucFirstWrite; - UINT8 ucRxvBandIdx; - UINT8 ucRxvG0; - UINT8 ucRxvG1; - UINT8 ucRxvG2; - UINT8 ucCurRxvQsize; - UINT32 u4RFCRBand0ori; - UINT32 u4RFCRBand1ori; - UINT32 u4BN0RFCR0ori; - UINT32 u4BN1RFCR0ori; - UINT32 u4RxvDumpCnt; - UINT32 u4RxvCurCnt; - CHAR RxvFilePath[256]; -#ifdef CONFIG_FWOWN_SUPPORT -#ifdef RTMP_MAC_PCI - UINT8 bDrvOwn; - UINT8 bCRAccessing; - UINT8 bSetFWOwnRunning; - NDIS_SPIN_LOCK DriverOwnLock; - /* NDIS_SPIN_LOCK PowerLock; */ -#endif -#endif /* CONFIG_FWOWN_SUPPORT */ - - WIFI_SYS_INFO_T WifiSysInfo; - - struct tx_rx_ctl tr_ctl; - -#ifdef ERR_RECOVERY - ERR_RECOVERY_CTRL_T ErrRecoveryCtl; -#endif -#ifdef TX_AGG_ADJUST_WKR - BOOLEAN TxAggAdjsut; -#endif /* TX_AGG_ADJUST_WKR */ - NDIS_SPIN_LOCK TimerSemLock; - - RX_STATISTIC_RXV rx_stat_rxv; - UINT32 parse_rxv_stat_enable; - UINT32 AccuOneSecRxBand0FcsErrCnt; - UINT32 AccuOneSecRxBand0MdrdyCnt; - UINT32 AccuOneSecRxBand1FcsErrCnt; - UINT32 AccuOneSecRxBand1MdrdyCnt; - -#ifdef TRACELOG_TCP_PKT - UINT32 u4TcpRxAckCnt; - UINT32 u4TcpTxDataCnt; -#endif - -#ifdef SMART_CARRIER_SENSE_SUPPORT - SMART_CARRIER_SENSE_CTRL SCSCtrl; -#endif /* SMART_CARRIER_SENSE_SUPPORT */ - RvR_Debug_CTRL RVRDBGCtrl; - - UINT16 CCI_ACI_TxOP_Value[DBDC_BAND_NUM]; - UINT16 MUMIMO_TxOP_Value; - BOOL G_MODE_INFRA_TXOP_RUNNING; - struct wifi_dev *g_mode_txop_wdev; - - MT_MIB_BUCKET_ONE_SEC OneSecMibBucket; - MT_MIB_BUCKET_MS MsMibBucket; - struct peak_tp_ctl peak_tp_ctl[DBDC_BAND_NUM]; - struct txop_ctl txop_ctl[DBDC_BAND_NUM]; - struct multi_cli_ctl mcli_ctl; -#ifdef PKT_BUDGET_CTRL_SUPPORT - UINT16 pbc_bound[PBC_AC_NUM]; -#endif /*PKT_BUDGET_CTRL_SUPPORT*/ - -#ifdef HTC_DECRYPT_IOT - UINT32 HTC_ICV_Err_TH; /* threshold */ -#endif /* HTC_DECRYPT_IOT */ - -#ifdef DHCP_UC_SUPPORT - BOOLEAN DhcpUcEnable; -#endif /* DHCP_UC_SUPPORT */ - struct wpf_ctrl wpf; - /* For QAtool log buffer limitation. */ - UINT16 u2LogEntryIdx; - UINT8 fgDumpStart; - UINT8 fgQAtoolBatchDumpSupport; -#ifdef LTF_SNR_SUPPORT - INT16 Avg_LTFSNR; - INT16 Avg_LTFSNRx16; -#endif -#ifdef CCK_LQ_SUPPORT - INT16 Avg_LQ; - INT16 Avg_LQx16; -#endif -#ifdef MULTI_PROFILE - VOID *multi_pf_ctrl; -#endif /*MULTI_PROFILE*/ -#ifdef A4_CONN - UINT32 a4_interface_count; - UINT32 a4_need_refresh; -#endif - -#if defined(A4_CONN) && defined(IGMP_SNOOP_SUPPORT) - BOOLEAN bIGMPperiodicQuery; /* Enable/Disable Periodic IGMP query to non-MWDS STA*/ - UINT8 IgmpQuerySendTick; /* Period for IGMP Query in unit of 10 sec*/ - BOOLEAN bMLDperiodicQuery; /* Enable/Disable Periodic MLD query to non-MWDS STA*/ - UINT8 MldQuerySendTick; /* Period for MLD queryin unit of 10 sec*/ -#endif - - UINT8 nearfar_far_client_num; /* far client number in near/far condition */ -#ifdef DBG_STARVATION - struct starv_log starv_log_ctrl; -#endif /*DBG_STARVATION*/ -#ifdef MBO_SUPPORT - UINT8 MboBssTermCountDown; -#endif /* MBO_SUPPORT */ -#ifdef CONFIG_MAP_SUPPORT - struct wifi_dev *bh_bss_wdev[DBDC_BAND_NUM]; - UCHAR MAPMode; - UCHAR bMAPQuickChChangeEn; - UCHAR bMAPAvoidScanDuringCac; - UCHAR get_all_sta_rate_wcid_idx; -#ifdef MAP_R2 - UCHAR bMapR2Enable; -#endif -#ifdef MAP_TS_TRAFFIC_SUPPORT - UCHAR bTSEnable; -#endif -#endif /* CONFIG_MAP_SUPPORT */ -#ifdef WAPP_SUPPORT - struct BSS_LOAD_INFO bss_load_info; -#endif /* WAPP_SUPPORT */ - - UCHAR reg_domain; - - /* When connection in process with client set the bit corresponds */ - /* to the AID of client and after connection phase over reset the same */ -#if (MAX_LEN_OF_MAC_TABLE == 0) - ULONG ConInPrgress[1]; -#elif ((MAX_LEN_OF_MAC_TABLE % NUM_BITS_IN_ULONG) == 0) - ULONG ConInPrgress[(MAX_LEN_OF_MAC_TABLE) / - (sizeof(ULONG) * NUM_OF_BITS_IN_BYTE)]; -#else - ULONG ConInPrgress[(MAX_LEN_OF_MAC_TABLE) / - (sizeof(ULONG) * NUM_OF_BITS_IN_BYTE) + - 1]; -#endif - struct scan_req last_scan_req; -#ifdef PS_QUEUE_INC_SUPPORT - UINT32 TotalStaCnt; -#endif - -#ifdef RATE_PRIOR_SUPPORT - LOWRATE_CTRL LowRateCtrl; -#endif /*RATE_PRIOR_SUPPORT*/ - - struct wifi_feature_support_list_query wifi_cap_list; -#ifdef DPP_SUPPORT - UCHAR bDppEnable; - UINT32 dpp_rx_frm_counter; -#endif /* DPP_SUPPORT */ -#ifdef WIFI_DIAG - void *pDiagCtrl; -#endif -#ifdef MAP_R2 - radio_info ra_info[DBDC_BAND_NUM]; -#endif -#ifdef ANTENNA_CONTROL_SUPPORT - UINT8 TxStream[DBDC_BAND_NUM]; - UINT8 RxStream[DBDC_BAND_NUM]; - UINT8 bAntennaSetAPEnable[DBDC_BAND_NUM]; -#endif /* ANTENNA_CONTROL_SUPPORT */ - BOOLEAN StaFastIdleCheckEnable; - UCHAR StaIdleCheck_At_Sec; - UCHAR StaIdleCheck_At_TxPktCnt; - UCHAR StaIdleCheck_At_NullFrameTxFailCnt; - UCHAR StaIdleCheck_At_NullFrameTxCnt; - - MT_MIB_BUCKET_MS _rPrevMibCnt; -}; - -typedef struct _PEER_PROBE_REQ_PARAM { -#ifdef OCE_SUPPORT - UCHAR Addr1[MAC_ADDR_LEN]; -#endif /* OCE_SUPPORT */ - - UCHAR Addr2[MAC_ADDR_LEN]; - CHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR SsidLen; - BOOLEAN bRequestRssi; -#ifdef CONFIG_HOTSPOT - BOOLEAN IsIWIE; - BOOLEAN IsIWCapability; - UCHAR Hessid[MAC_ADDR_LEN]; - BOOLEAN IsHessid; - UINT8 AccessNetWorkType; -#endif /* CONFIG_HOTSPOT */ -#ifdef BAND_STEERING - BOOLEAN IsHtSupport; - BOOLEAN IsVhtSupport; - UINT32 RxMCSBitmask; - /* WPS_BandSteering Support */ - BOOLEAN bWpsCapable; -#endif -#ifdef CUSTOMER_VENDOR_IE_SUPPORT - struct probe_req_report report_param; -#endif /* CUSTOMER_VENDOR_IE_SUPPORT */ - BOOLEAN IsFromIos; /* For IOS immediately connect */ -#ifdef OCE_SUPPORT - BOOLEAN bProbeSupp[WDEV_NUM_MAX]; - BOOLEAN IsOceCapability; - UINT32 MaxChannelTime; -#endif - -} PEER_PROBE_REQ_PARAM, *PPEER_PROBE_REQ_PARAM; - -/*************************************************************************** - * Rx Path software control block related data structures - **************************************************************************/ -typedef enum RX_BLK_FLAGS { - fRX_AMPDU = (1 << 0), - fRX_AMSDU = (1 << 1), - fRX_ARALINK = (1 << 2), - fRX_HTC = (1 << 3), - fRX_PAD = (1 << 4), - fRX_QOS = (1 << 5), - fRX_EAP = (1 << 6), - fRX_WPI = (1 << 7), - fRX_AP = (1 << 8), /* Packet received from AP */ - fRX_STA = (1 << 9), /* Packet received from Client(Infra mode) */ - fRX_ADHOC = (1 << 10), /* packet received from AdHoc peer */ - fRX_WDS = (1 << 11), /* Packet received from WDS */ - fRX_MESH = (1 << 12), /* Packet received from MESH */ - fRX_DLS = (1 << 13), /* Packet received from DLS peer */ - fRX_TDLS = (1 << 14), /* Packet received from TDLS peer */ - fRX_RETRIEVE = (1 << 15), /* Packet received from mcu */ - fRX_CMD_RSP = (1 << 16), /* Pakket received from mcu command response */ - fRX_TXRX_RXV = (1 << 17), /* RxV received from Rx Ring1 */ - fRX_HDR_TRANS = (1 << 18), - fRX_WCID_MISMATCH = (1 << 19), /* for HW Lookup Wcid Mismatch */ -} RX_BLK_FLAGS; - -typedef struct _RX_BLK { - UCHAR hw_rx_info - [RXD_SIZE]; /* include "RXD_STRUC RxD" and "RXINFO_STRUC rx_info " */ - RXINFO_STRUC * - pRxInfo; /* for RLT, in head of frame buffer, for RTMP, in hw_rx_info[RXINFO_OFFSET] */ - /* TODO: shiang-usw, revise this! */ - RXWI_STRUC *pRxWI; /*in frame buffer and after "rx_info" fields */ - UCHAR *rmac_info; - UCHAR *FC; - UINT16 Duration; - UCHAR FN; - UINT16 SN; - UCHAR *Addr1; - UCHAR *Addr2; - UCHAR *Addr3; - UCHAR *Addr4; - PNDIS_PACKET pRxPacket; /* os_packet pointer, shall not change */ - UCHAR *pData; /* init to pRxPacket->data, refer to frame buffer, may changed depends on processing */ - USHORT DataSize; /* init to RXWI->MPDUtotalByteCnt, and may changes depends on processing */ - RX_BLK_FLAGS Flags; - - /* Mirror info of partial fields of RxWI and RxInfo */ - USHORT MPDUtotalByteCnt; /* Refer to RXWI->MPDUtotalByteCnt */ - UCHAR UserPriority; /* for calculate TKIP MIC using */ - UCHAR OpMode; /* 0:OPMODE_STA 1:OPMODE_AP */ - UCHAR wcid; /* copy of pRxWI->wcid */ - UCHAR U2M; - UCHAR key_idx; - UCHAR bss_idx; - UCHAR TID; - UINT32 TimeStamp; - struct rx_signal_info rx_signal; - CHAR ldpc_ex_sym; - HTTRANSMIT_SETTING rx_rate; - UINT32 rxv2_cyc1; - UINT32 rxv2_cyc2; - UINT32 rxv2_cyc3; -#ifdef HDR_TRANS_SUPPORT - BOOLEAN bHdrVlanTaged; /* VLAN tag is added to this header */ - UCHAR *pTransData; - USHORT TransDataSize; -#endif /* HDR_TRANS_SUPPORT */ -#ifdef CONFIG_CSO_SUPPORT - RX_CSO_STRUCT rCso; -#endif -#ifdef CUT_THROUGH - UINT16 token_id; -#endif /* CUT_THROUGH */ - BOOLEAN CipherMis; - UINT8 AmsduState; - BOOLEAN DeAmsduFail; - UINT64 CCMP_PN; -#ifdef LTF_SNR_SUPPORT - INT16 Ofdm_SNR; -#endif -} RX_BLK ____cacheline_aligned; - -#define RX_BLK_SET_FLAG(_pRxBlk, _flag) (_pRxBlk->Flags |= _flag) -#define RX_BLK_TEST_FLAG(_pRxBlk, _flag) (_pRxBlk->Flags & _flag) -#define RX_BLK_CLEAR_FLAG(_pRxBlk, _flag) (_pRxBlk->Flags &= ~(_flag)) - -#define AMSDU_SUBHEAD_LEN 14 -#define ARALINK_SUBHEAD_LEN 14 -#define ARALINK_HEADER_LEN 2 - -typedef enum TX_FRAME_TYPE { - TX_UNKOWN_FRAME, - TX_MCAST_FRAME = (1 << 0), - TX_LEGACY_FRAME = (1 << 1), - TX_AMPDU_FRAME = (1 << 2), - TX_AMSDU_FRAME = (1 << 3), - TX_FRAG_FRAME = (1 << 4), - TX_MLME_MGMTQ_FRAME = (1 << 5), - TX_MLME_DATAQ_FRAME = (1 << 6), - TX_ATE_FRAME = (1 << 7), -} TX_FRAME_TYPE; - -#define TX_FRAG_ID_NO 0x0 -#define TX_FRAG_ID_FIRST 0x1 -#define TX_FRAG_ID_MIDDLE 0x2 -#define TX_FRAG_ID_LAST 0x3 - -#define TX_AMSDU_ID_NO 0x0 -#define TX_AMSDU_ID_FIRST 0x1 -#define TX_AMSDU_ID_MIDDLE 0x2 -#define TX_AMSDU_ID_LAST 0x3 - -typedef enum TX_BLK_FLAGS { - fTX_bRtsRequired = (1 << 0), - fTX_bAckRequired = (1 << 1), - fTX_bPiggyBack = (1 << 2), - fTX_bHTRate = (1 << 3), - fTX_bWMM = (1 << 4), - fTX_bAllowFrag = (1 << 5), - fTX_bMoreData = (1 << 6), - fTX_bClearEAPFrame = (1 << 8), - fTX_bApCliPacket = (1 << 9), - fTX_bSwEncrypt = (1 << 10), - fTX_bWMM_UAPSD_EOSP = (1 << 11), - fTX_bWDSEntry = (1 << 12), - fTX_bDonglePkt = (1 << 13), - fTX_bMeshEntry = (1 << 14), - fTX_bWPIDataFrame = (1 << 15), - fTX_bClientWDSFrame = (1 << 16), - fTX_bTdlsEntry = (1 << 17), - fTX_AmsduInAmpdu = (1 << 18), - fTX_ForceRate = (1 << 19), - fTX_CT_WithTxD = (1 << 20), - fTX_CT_WithoutTxD = (1 << 21), - fTX_DumpPkt = (1 << 22), - fTX_HDR_TRANS = (1 << 23), - fTX_MCU_OFFLOAD = (1 << 24), - fTX_MCAST_CLONE = (1 << 25), - fTX_HIGH_PRIO = (1 << 26), -#ifdef A4_CONN - fTX_bA4Frame = (1 << 27), -#endif - fTX_HW_AMSDU = (1 << 28), -} TX_BLK_FLAGS; - -typedef struct _TX_BLK { - UCHAR resource_idx ____cacheline_aligned; - UCHAR QueIdx; - UCHAR WmmIdx; - UCHAR TotalFrameNum; /* Total frame number want to send-out in one batch */ - UCHAR TotalFragNum; /* Total frame fragments required in one batch */ - UCHAR TxFrameType; /* Indicate the Transmission type of the all frames in one batch */ - USHORT TotalFrameLen; /* Total length of all frames want to send-out in one batch */ - STA_TR_ENTRY *tr_entry; - PNDIS_PACKET pPacket; - struct wifi_dev *wdev; - MAC_TABLE_ENTRY * - pMacEntry; /* NULL: packet with 802.11 RA field is multicast/broadcast address */ - TX_BLK_FLAGS Flags; - UCHAR UserPriority; /* priority class of packet */ - UCHAR Wcid; /* The MAC entry associated to this packet */ - UINT8 wmm_set; - UINT8 dbdc_band; - UCHAR *pSrcBufHeader; /* Reference to the head of sk_buff->data */ - UINT SrcBufLen; /* Length of packet payload which not including Layer 2 header */ - UCHAR wifi_hdr_len; /* 802.11 header */ - UCHAR frame_idx; - UCHAR amsdu_state; - UCHAR FragIdx; /* refer to TX_FRAG_ID_xxxx */ - UCHAR *pSrcBufData; /* Reference to the sk_buff->data, will changed depends on hanlding progresss */ - UCHAR HdrPadLen; /* padding length*/ - UCHAR MpduHeaderLen; /* 802.11 header + LLC/SNAP not including padding */ - INT16 tx_bytes_len; /* txd + packet length not including txp */ - UCHAR txp_len; - UCHAR hw_rsv_len; - UCHAR first_buf_len; - ra_dma_addr_t SrcBufPA; - QUEUE_HEADER TxPacketList; - HTTRANSMIT_SETTING *pTransmit; - UCHAR *pExtraLlcSnapEncap; /* NULL means no extra LLC/SNAP is required */ - UCHAR *HeaderBuf; - UCHAR *wifi_hdr; - UCHAR FrameGap; /* what kind of IFS this packet use */ - UCHAR MpduReqNum; /* number of fragments of this frame */ - UCHAR TxRate; /* TODO: Obsoleted? Should change to MCS? */ - UINT32 CipherAlg; /* cipher alogrithm */ - PCHAR pKey; - UCHAR KeyIdx; /* Indicate the transmit key index */ - UCHAR OpMode; -#ifdef DSCP_PRI_SUPPORT - INT8 DscpMappedPri; -#endif -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT - UINT ApCliIfidx; - PAPCLI_STRUCT pApCliEntry; -#endif /* APCLI_SUPPORT */ - BSS_STRUCT *pMbss; -#endif /* CONFIG_AP_SUPPORT */ - ULONG Priv; /* Hardware specific value saved in here. */ - -#if defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_TSO_SUPPORT) - UCHAR naf_type; -#endif /* defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_TSO_SUPPORT) */ - -#ifdef TXBF_SUPPORT - UCHAR TxSndgPkt; /* 1: sounding 2: NDP sounding */ - UCHAR TxNDPSndgBW; - UCHAR TxNDPSndgMcs; -#endif /* TXBF_SUPPORT */ - UINT8 dot11_type; - UINT8 dot11_subtype; - UINT8 TxSFormat; - UINT8 Pid; - UINT8 TxS2Host; - UINT8 TxS2Mcu; - UINT32 TxSPriv; -#ifdef RANDOM_PKT_GEN - UINT8 lmac_qidx; -#endif - BOOLEAN DropPkt; - UINT32 HeaderBuffer[32] ____cacheline_aligned; -} TX_BLK; - -#define TX_BLK_SET_FLAG(_pTxBlk, _flag) (_pTxBlk->Flags |= _flag) -#define TX_BLK_TEST_FLAG(_pTxBlk, _flag) \ - (((_pTxBlk->Flags & _flag) == _flag) ? 1 : 0) -#define TX_BLK_CLEAR_FLAG(_pTxBlk, _flag) (_pTxBlk->Flags &= ~(_flag)) - -#ifdef DBG_DEQUE -struct deq_log_struct { - UCHAR que_depth[WMM_NUM_OF_AC]; - UCHAR deq_cnt[WMM_NUM_OF_AC]; - UCHAR deq_round; -}; -#endif /* DBG_DEQUE */ - -typedef struct dequeue_info { - BOOLEAN inited; - UCHAR start_q; - UCHAR end_q; - CHAR cur_q; - UCHAR target_wcid; - UCHAR target_que; - UCHAR cur_wcid; - USHORT q_max_cnt[WMM_QUE_NUM]; - INT pkt_bytes; - INT pkt_cnt; - INT deq_pkt_bytes; - INT deq_pkt_cnt; - INT status; - BOOLEAN full_qid[WMM_QUE_NUM]; -#ifdef DBG_DEQUE - deq_log_struct deq_log; -#endif /* DBG_DEQUE */ -} DEQUE_INFO; - -#ifdef TRACELOG_TCP_PKT -#define TCP_TRAFFIC_DATAPKT_MIN_SIZE 1000 -static inline BOOLEAN RTMPIsTcpDataPkt(IN PNDIS_PACKET pPacket) -{ - UINT32 pktlen; - - pktlen = GET_OS_PKT_LEN(pPacket); - - if (pktlen > TCP_TRAFFIC_DATAPKT_MIN_SIZE) - return TRUE; - else - return FALSE; -} -#define TCP_TRAFFIC_ACKPKT_SIZE 54 -static inline BOOLEAN RTMPIsTcpAckPkt(IN PNDIS_PACKET pPacket) -{ - UINT32 pktlen; - - pktlen = GET_OS_PKT_LEN(pPacket); - - if (pktlen == TCP_TRAFFIC_ACKPKT_SIZE) - return TRUE; - else - return FALSE; -} -#endif /* TRACELOG_TCP_PKT */ - -#ifdef RT_BIG_ENDIAN -#include "hdev_ctrl.h" -/*************************************************************************** - * Endian conversion related functions - **************************************************************************/ - -#ifdef MT_MAC -static inline VOID mt_rmac_d0_endian_change(UINT32 *rxinfo) -{ - (*rxinfo) = SWAP32(*rxinfo); -} - -static inline VOID mt_rmac_base_info_endian_change(IN RTMP_ADAPTER *pAd, - IN UCHAR *rxinfo) -{ - int i; - - for (i = 1; i < 4; i++) - *(((UINT32 *)rxinfo) + i) = SWAP32(*(((UINT32 *)rxinfo) + i)); -} -#endif /* MT_MAC */ - -/* - ======================================================================== - - Routine Description: - Endian conversion of Tx/Rx descriptor . - - Arguments: - pAd Pointer to our adapter - pData Pointer to Tx/Rx descriptor - DescriptorType Direction of the frame - - Return Value: - None - - Note: - Call this function when read or update descriptor - ======================================================================== -*/ -static inline VOID RTMPWIEndianChange(IN RTMP_ADAPTER *pAd, IN UCHAR *pData, - IN ULONG DescriptorType) -{ - int size; - int i; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 TXWISize = cap->TXWISize; - UINT8 RXWISize = cap->RXWISize; - - size = ((DescriptorType == TYPE_TXWI) ? TXWISize : RXWISize); - - if (DescriptorType == TYPE_TXWI) { - *((UINT32 *)(pData)) = - SWAP32(*((UINT32 *)(pData))); /* Byte 0~3 */ - *((UINT32 *)(pData + 4)) = - SWAP32(*((UINT32 *)(pData + 4))); /* Byte 4~7 */ - - if (size > 16) - *((UINT32 *)(pData + 16)) = SWAP32( - *((UINT32 *)(pData + 16))); /* Byte 16~19 */ - } else { - for (i = 0; i < size / 4; i++) - *(((UINT32 *)pData) + i) = - SWAP32(*(((UINT32 *)pData) + i)); - } -} - -#ifdef MT_MAC -/* - ======================================================================== - - Routine Description: - Endian conversion of MacTxInfo/MacRxInfo descriptor . - - Arguments: - pAd Pointer to our adapter - pData Pointer to Tx/Rx descriptor - DescriptorType Direction of the frame - Length Length of MacTxInfo/MacRxInfo - - Return Value: - None - - Note: - Call this function when read or update descriptor - ======================================================================== -*/ -static inline VOID MTMacInfoEndianChange(IN RTMP_ADAPTER *pAd, IN UCHAR *pData, - IN ULONG DescriptorType, - IN UINT16 Length) -{ - int i; - - if (DescriptorType == TYPE_TMACINFO) { - for (i = 0; i < Length / 4; i++) - *(((UINT32 *)pData) + i) = - SWAP32(*(((UINT32 *)pData) + i)); - } else { /* TYPE_RMACINFO */ - for (i = 1; i < Length / 4; - i++) /* i from 1, due to 1st DW had endia change already, so skip it here. */ - *(((UINT32 *)pData) + i) = - SWAP32(*(((UINT32 *)pData) + i)); - } -} -#endif /* MT_MAC */ - -#ifdef RTMP_MAC_PCI -static inline VOID WriteBackToDescriptor(IN UCHAR *Dest, IN UCHAR *Src, - IN BOOLEAN DoEncrypt, - IN ULONG DescriptorType) -{ - UINT32 *p1, *p2; - - p1 = ((UINT32 *)Dest); - p2 = ((UINT32 *)Src); - *p1 = *p2; - *(p1 + 2) = *(p2 + 2); - /*new txd & rxd just have 3 word*/ -#ifndef MT7615 - *(p1 + 3) = *(p2 + 3); -#endif - /* +++Add by shiang for jeffrey debug */ -#ifdef LINUX - wmb(); -#endif /* LINUX */ - /* ---Add by shiang for jeffrey debug */ - *(p1 + 1) = *(p2 + 1); /* Word 1; this must be written back last */ -} -#endif /* RTMP_MAC_PCI */ - -/* - ======================================================================== - - Routine Description: - Endian conversion of Tx/Rx descriptor . - - Arguments: - pAd Pointer to our adapter - pData Pointer to Tx/Rx descriptor - DescriptorType Direction of the frame - - Return Value: - None - - Note: - Call this function when read or update descriptor - ======================================================================== -*/ -#ifdef RTMP_MAC_PCI -static inline VOID RTMPDescriptorEndianChange(UCHAR *pData, ULONG DescType) -{ - *((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData))); /* Byte 0~3 */ - *((UINT32 *)(pData + 8)) = - SWAP32(*((UINT32 *)(pData + 8))); /* Byte 8~11 */ - /*new txd & rxd just have 3 word*/ -#ifndef MT7615 - *((UINT32 *)(pData + 12)) = - SWAP32(*((UINT32 *)(pData + 12))); /* Byte 12~15 */ -#endif - *((UINT32 *)(pData + 4)) = SWAP32( - *((UINT32 *)(pData + - 4))); /* Byte 4~7, this must be swapped last */ -} -#endif /* RTMP_MAC_PCI */ - -/* - ======================================================================== - - Routine Description: - Endian conversion of all kinds of 802.11 frames . - - Arguments: - pAd Pointer to our adapter - pData Pointer to the 802.11 frame structure - Dir Direction of the frame - FromRxDoneInt Caller is from RxDone interrupt - - Return Value: - None - - Note: - Call this function when read or update buffer data - ======================================================================== -*/ -static inline VOID RTMPFrameEndianChange(IN RTMP_ADAPTER *pAd, IN PUCHAR pData, - IN ULONG Dir, IN BOOLEAN FromRxDoneInt) -{ - PHEADER_802_11 pFrame; - PUCHAR pMacHdr; - - /* swab 16 bit fields - Frame Control field */ - if (Dir == DIR_READ) - *(USHORT *)pData = SWAP16(*(USHORT *)pData); - - pFrame = (PHEADER_802_11)pData; - pMacHdr = (PUCHAR)pFrame; - /* swab 16 bit fields - Duration/ID field */ - *(USHORT *)(pMacHdr + 2) = SWAP16(*(USHORT *)(pMacHdr + 2)); - - if (pFrame->FC.Type != FC_TYPE_CNTL) { - /* swab 16 bit fields - Sequence Control field */ - *(USHORT *)(pMacHdr + 22) = SWAP16(*(USHORT *)(pMacHdr + 22)); - } - - if (pFrame->FC.Type == FC_TYPE_MGMT) { - switch (pFrame->FC.SubType) { - case SUBTYPE_ASSOC_REQ: - case SUBTYPE_REASSOC_REQ: - /* swab 16 bit fields - CapabilityInfo field */ - pMacHdr += sizeof(HEADER_802_11); - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - /* swab 16 bit fields - Listen Interval field */ - pMacHdr += 2; - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - break; - - case SUBTYPE_ASSOC_RSP: - case SUBTYPE_REASSOC_RSP: - /* swab 16 bit fields - CapabilityInfo field */ - pMacHdr += sizeof(HEADER_802_11); - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - /* swab 16 bit fields - Status Code field */ - pMacHdr += 2; - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - /* swab 16 bit fields - AID field */ - pMacHdr += 2; - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - break; - - case SUBTYPE_AUTH: - - /* When the WEP bit is on, don't do the conversion here. - This is only shared WEP can hit this condition. - For AP, it shall do conversion after decryption. - For STA, it shall do conversion before encryption. */ - if (pFrame->FC.Wep == 1) - break; - else { - /* swab 16 bit fields - Auth Alg No. field */ - pMacHdr += sizeof(HEADER_802_11); - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - /* swab 16 bit fields - Auth Seq No. field */ - pMacHdr += 2; - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - /* swab 16 bit fields - Status Code field */ - pMacHdr += 2; - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - } - - break; - - case SUBTYPE_BEACON: - case SUBTYPE_PROBE_RSP: - /* swab 16 bit fields - BeaconInterval field */ - pMacHdr += (sizeof(HEADER_802_11) + TIMESTAMP_LEN); - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - /* swab 16 bit fields - CapabilityInfo field */ - pMacHdr += sizeof(USHORT); - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - break; - - case SUBTYPE_DEAUTH: - case SUBTYPE_DISASSOC: - - /* If the PMF is negotiated, those frames shall be encrypted */ - if (!FromRxDoneInt && pFrame->FC.Wep == 1) - break; - else { - /* swab 16 bit fields - Reason code field */ - pMacHdr += sizeof(HEADER_802_11); - *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); - } - - break; - } - - } else if (pFrame->FC.Type == FC_TYPE_DATA) { - } else if (pFrame->FC.Type == FC_TYPE_CNTL) { - switch (pFrame->FC.SubType) { - case SUBTYPE_BLOCK_ACK_REQ: { - PFRAME_BA_REQ pBAReq = (PFRAME_BA_REQ)pFrame; - *(USHORT *)(&pBAReq->BARControl) = - SWAP16(*(USHORT *)(&pBAReq->BARControl)); - pBAReq->BAStartingSeq.word = - SWAP16(pBAReq->BAStartingSeq.word); - } break; - - case SUBTYPE_BLOCK_ACK: - /* For Block Ack packet, the HT_CONTROL field is in the same offset with Addr3 */ - *(UINT32 *)(&pFrame->Addr3[0]) = - SWAP32(*(UINT32 *)(&pFrame->Addr3[0])); - break; - - case SUBTYPE_ACK: - /*For ACK packet, the HT_CONTROL field is in the same offset with Addr2 */ - *(UINT32 *)(&pFrame->Addr2[0]) = - SWAP32(*(UINT32 *)(&pFrame->Addr2[0])); - break; - } - } else - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Invalid Frame Type!!!\n")); - - /* swab 16 bit fields - Frame Control */ - if (Dir == DIR_WRITE) - *(USHORT *)pData = SWAP16(*(USHORT *)pData); -} -/* - ======================================================================== - - Routine Description: - Endian conversion of normal data ,data type should be int or uint. - - Arguments: - pAd Pointer to our adapter - pData Pointer to data - size length of data - - Return Value: - None - -======================================================================== -*/ - -static inline VOID RTMPEndianChange(IN UCHAR *pData, IN UINT size) -{ - int i; - - if (size % 4) - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Invalid DATA Type!!!\n")); - else { - for (i = 0; i < size / 4; i++) - *(((UINT32 *)pData) + i) = - SWAP32(*(((UINT32 *)pData) + i)); - } -} -#endif /* RT_BIG_ENDIAN */ - -/*************************************************************************** - * Other static inline function definitions - **************************************************************************/ -static inline VOID ConvertMulticastIP2MAC(IN PUCHAR pIpAddr, - IN PUCHAR *ppMacAddr, - IN UINT16 ProtoType) -{ - if (pIpAddr == NULL) - return; - - if (ppMacAddr == NULL || *ppMacAddr == NULL) - return; - - switch (ProtoType) { - case ETH_P_IPV6: - /* memset(*ppMacAddr, 0, MAC_ADDR_LEN); */ - *(*ppMacAddr) = 0x33; - *(*ppMacAddr + 1) = 0x33; - *(*ppMacAddr + 2) = pIpAddr[12]; - *(*ppMacAddr + 3) = pIpAddr[13]; - *(*ppMacAddr + 4) = pIpAddr[14]; - *(*ppMacAddr + 5) = pIpAddr[15]; - break; - - case ETH_P_IP: - default: - /* memset(*ppMacAddr, 0, MAC_ADDR_LEN); */ - *(*ppMacAddr) = 0x01; - *(*ppMacAddr + 1) = 0x00; - *(*ppMacAddr + 2) = 0x5e; - *(*ppMacAddr + 3) = pIpAddr[1] & 0x7f; - *(*ppMacAddr + 4) = pIpAddr[2]; - *(*ppMacAddr + 5) = pIpAddr[3]; - break; - } - - return; -} - -char *get_phymode_str(int phy_mode); - -NDIS_STATUS alloc_chip_cap_dep_data(RTMP_ADAPTER *pAd); -VOID free_chip_cap_dep_data(RTMP_ADAPTER *pAd); -NDIS_STATUS alloc_chip_cap_dep_data_cmm(RTMP_ADAPTER *pAd); -VOID free_chip_cap_dep_data_cmm(RTMP_ADAPTER *pAd); -NDIS_STATUS alloc_chip_cap_dep_data_pci(void *hdev_ctrl); -VOID free_chip_cap_dep_data_pci(void *hdev_ctrl); -NDIS_STATUS alloc_chip_cap_dep_data_usb(RTMP_ADAPTER *pAd); -VOID free_chip_cap_dep_data_usb(RTMP_ADAPTER *pAd); - -NDIS_STATUS RTMPAllocTxRxRingMemory(RTMP_ADAPTER *pAd); - -#ifdef RESOURCE_PRE_ALLOC -NDIS_STATUS RTMPInitTxRxRingMemory(RTMP_ADAPTER *pAd); -#endif /* RESOURCE_PRE_ALLOC */ - -struct dev_type_name_map_t { - INT type; - RTMP_STRING prefix[IFNAMSIZ]; -}; - -void rtmp_eeprom_of_platform(RTMP_ADAPTER *pAd); -NDIS_STATUS load_dev_l1profile(RTMP_ADAPTER *pAd); -UCHAR *get_dev_l2profile(RTMP_ADAPTER *pAd); -INT get_dev_config_idx(RTMP_ADAPTER *pAd); -UCHAR *get_dev_name_prefix(RTMP_ADAPTER *pAd, INT dev_type); -#ifdef SINGLE_SKU_V2 -UCHAR *get_single_sku_path(RTMP_ADAPTER *pAd); -UCHAR *get_bf_sku_path(RTMP_ADAPTER *pAd); -#endif -int ShowL1profile(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -NDIS_STATUS RTMPReadParametersHook(RTMP_ADAPTER *pAd); -NDIS_STATUS RTMPSetProfileParameters(RTMP_ADAPTER *pAd, RTMP_STRING *pBuffer); -NDIS_STATUS RTMPPreReadProfile(RTMP_ADAPTER *pAd); -NDIS_STATUS RTMPSetPreProfileParameters(RTMP_ADAPTER *pAd, - RTMP_STRING *pBuffer); - -INT RTMPGetKeyParameter(IN RTMP_STRING *key, OUT RTMP_STRING *dest, - IN INT destsize, IN RTMP_STRING *buffer, - IN BOOLEAN bTrimSpace); - -INT RTMPSetKeyParameter(IN RTMP_STRING *key, OUT CHAR *value, IN INT destsize, - IN RTMP_STRING *buffer, IN BOOLEAN bTrimSpace); - -INT RTMPAddKeyParameter(IN RTMP_STRING *key, OUT CHAR *value, IN INT destsize, - IN RTMP_STRING *buffer); - -INT RTMPGetKeyParameterWithOffset(IN RTMP_STRING *key, OUT RTMP_STRING *dest, - OUT USHORT *end_offset, IN INT destsize, - IN RTMP_STRING *buffer, - IN BOOLEAN bTrimSpace); - -#ifdef MIN_PHY_RATE_SUPPORT -VOID RTMPMinPhyDataRateCfg(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *Buffer); - -VOID RTMPMinPhyBeaconRateCfg(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *Buffer); - -VOID RTMPMinPhyMgmtRateCfg(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *Buffer); - -VOID RTMPMinPhyBcMcRateCfg(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *Buffer); - -VOID RTMPLimitClientSupportRateCfg(IN RTMP_ADAPTER *pAd, - IN RTMP_STRING *Buffer); - -VOID RTMPDisableCCKRateCfg(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *Buffer); -#endif /* MIN_PHY_RATE_SUPPORT */ - -#ifdef WSC_INCLUDED -VOID rtmp_read_wsc_user_parms_from_file(IN RTMP_ADAPTER *pAd, IN char *tmpbuf, - IN char *buffer); -#endif /*WSC_INCLUDED*/ - -#ifdef DSCP_QOS_MAP_SUPPORT -VOID dscp_qosmap_update_sta_mapping_to_cr4(IN RTMP_ADAPTER *pAd, - IN struct _MAC_TABLE_ENTRY *pEntry, - IN UINT8 PoolID); - -VOID DscpQosMapInit(IN RTMP_ADAPTER *pAd); -#endif - -#ifdef CONFIG_STEERING_API_SUPPORT -VOID BTMActionFrameListInit(RTMP_ADAPTER *pAd); -VOID BTMActionFrameListExit(RTMP_ADAPTER *pAd); -#endif - -INT rtmp_band_index_get_by_order(struct _RTMP_ADAPTER *pAd, UCHAR order); - -#ifdef VOW_SUPPORT -#ifdef CONFIG_AP_SUPPORT -void rtmp_read_vow_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, - char *buffer); -#endif /* CONFIG_AP_SUPPORT */ -#endif /* VOW_SUPPORT */ - -#ifdef RED_SUPPORT -void rtmp_read_red_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, - char *buffer); -#endif /* RED_SUPPORT */ -#ifdef FQ_SCH_SUPPORT -void rtmp_read_fq_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, - char *buffer); -#endif /* FQ_SCH_SUPPORT */ - -void rtmp_read_cp_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, - char *buffer); - -VOID cp_support_is_enabled(PRTMP_ADAPTER pAd); - -INT set_cp_support_en(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -#ifdef SINGLE_SKU_V2 -NDIS_STATUS RTMPSetSkuParam(RTMP_ADAPTER *pAd); -NDIS_STATUS RTMPSetBackOffParam(RTMP_ADAPTER *pAd); -NDIS_STATUS RTMPResetSkuParam(RTMP_ADAPTER *pAd); -NDIS_STATUS RTMPResetBackOffParam(RTMP_ADAPTER *pAd); - -VOID InitSkuRateDiffTable(RTMP_ADAPTER *pAd); -UCHAR GetSkuChannelBasePwr(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR channel); -VOID UpdateSkuRatePwr(RTMP_ADAPTER *pAd, UCHAR ch, UCHAR bw, CHAR base_pwr); -#endif /* SINGLE_SKU_V2 */ - -#ifdef RTMP_RF_RW_SUPPORT -VOID RTMP_ReadRF(IN RTMP_ADAPTER *pAd, IN UCHAR RegID, OUT PUCHAR pValue1, - OUT PUCHAR pValue2, IN UCHAR BitMask); - -VOID RTMP_WriteRF(IN RTMP_ADAPTER *pAd, IN UCHAR RegID, IN UCHAR Value, - IN UCHAR BitMask); - -NDIS_STATUS RT30xxWriteRFRegister(IN RTMP_ADAPTER *pAd, IN UCHAR regID, - IN UCHAR value); - -NDIS_STATUS RT30xxReadRFRegister(IN RTMP_ADAPTER *pAd, IN UCHAR regID, - IN PUCHAR pValue); - -NDIS_STATUS RT635xWriteRFRegister(IN RTMP_ADAPTER *pAd, IN UCHAR bank, - IN UCHAR regID, IN UCHAR value); - -NDIS_STATUS RT635xReadRFRegister(IN RTMP_ADAPTER *pAd, IN UCHAR bank, - IN UCHAR regID, IN PUCHAR pValue); - -BOOLEAN RTMPAdjustFrequencyOffset(IN RTMP_ADAPTER *pAd, - INOUT PUCHAR pRefFreqOffset); -#endif /* RTMP_RF_RW_SUPPORT */ - -BOOLEAN RTMPCheckPhyMode(IN RTMP_ADAPTER *pAd, IN UINT8 BandSupported, - INOUT UCHAR *pPhyMode); - -#ifdef RTMP_MAC_PCI -INT NICInitPwrPinCfg(RTMP_ADAPTER *pAd); -#endif /* RTMP_MAC_PCI */ - -VOID NICInitAsicFromEEPROM(RTMP_ADAPTER *pAd); - -NDIS_STATUS NICInitializeAdapter(RTMP_ADAPTER *pAd); -NDIS_STATUS NICInitializeAsic(RTMP_ADAPTER *pAd); - -VOID NICResetFromError(RTMP_ADAPTER *pAd); - -VOID RTMPRingCleanUp(IN RTMP_ADAPTER *pAd, IN UCHAR RingType); - -VOID UserCfgExit(RTMP_ADAPTER *pAd); -VOID UserCfgInit(RTMP_ADAPTER *pAd); - -VOID NICUpdateFifoStaCounters(RTMP_ADAPTER *pAd); -VOID NICUpdateRawCounters(RTMP_ADAPTER *pAd); - -UINT32 AsicGetCrcErrCnt(RTMP_ADAPTER *pAd); -UINT32 AsicGetCCACnt(RTMP_ADAPTER *pAd); -UINT32 AsicGetChBusyCnt(RTMP_ADAPTER *pAd, UCHAR ch_idx); - -VOID AsicDMASchedulerInit(RTMP_ADAPTER *pAd, INT mode); -VOID AsicTxCntUpdate(RTMP_ADAPTER *pAd, UCHAR Wcid, MT_TX_COUNTER *pTxInfo); - -VOID NicResetRawCounters(RTMP_ADAPTER *pAd); -VOID NicGetTxRawCounters(IN RTMP_ADAPTER *pAd, IN TX_STA_CNT0_STRUC *pStaTxCnt0, - IN TX_STA_CNT1_STRUC *pStaTxCnt1); - -VOID RTMPZeroMemory(VOID *pSrc, ULONG Length); -ULONG RTMPCompareMemory(VOID *pSrc1, VOID *pSrc2, ULONG Length); -VOID RTMPMoveMemory(VOID *pDest, VOID *pSrc, ULONG Length); - -VOID AtoH(RTMP_STRING *src, UCHAR *dest, int destlen); -UCHAR BtoH(char ch); - -VOID RTMP_TimerListAdd(RTMP_ADAPTER *pAd, VOID *pRsc); -VOID RTMP_TimerListRelease(RTMP_ADAPTER *pAd, VOID *pRsc); -VOID RTMP_AllTimerListRelease(RTMP_ADAPTER *pAd); - -VOID RTMPInitTimer(IN RTMP_ADAPTER *pAd, IN RALINK_TIMER_STRUCT *pTimer, - IN VOID *pTimerFunc, IN VOID *pData, IN BOOLEAN Repeat); - -VOID RTMPSetTimer(RALINK_TIMER_STRUCT *pTimer, ULONG Value); -VOID RTMPModTimer(RALINK_TIMER_STRUCT *pTimer, ULONG Value); -VOID RTMPCancelTimer(RALINK_TIMER_STRUCT *pTimer, BOOLEAN *pCancelled); -VOID RTMPReleaseTimer(RALINK_TIMER_STRUCT *pTimer, BOOLEAN *pCancelled); -VOID RTMPShowTimerList(RTMP_ADAPTER *pAd); - -VOID RTMPEnableRxTx(RTMP_ADAPTER *pAd); -VOID RTMPDisableRxTx(RTMP_ADAPTER *pAd); - -VOID AntCfgInit(RTMP_ADAPTER *pAd); - -VOID rtmp_init_hook_set(RTMP_ADAPTER *pAd); - -/* */ -/* prototype in action.c */ -/* */ -VOID ActHeaderInit(IN RTMP_ADAPTER *pAd, IN OUT HEADER_802_11 *pHdr80211, - IN UCHAR *da, IN UCHAR *sa, IN UCHAR *bssid); - -VOID ActionStateMachineInit(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID MlmeADDBAAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeDELBAAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID SendSMPSAction(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, IN UCHAR smps); - -#ifdef CONFIG_AP_SUPPORT -VOID SendBeaconRequest(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid); -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef DOT11_N_SUPPORT -VOID RECBATimerTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID ORIBATimerTimeout(IN RTMP_ADAPTER *pAd); - -VOID SendRefreshBAR(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry); - -#ifdef DOT11N_DRAFT3 -VOID RTMP_11N_D3_TimerInit(IN RTMP_ADAPTER *pAd); - -VOID RTMP_11N_D3_TimerRelease(IN RTMP_ADAPTER *pAd); - -VOID SendBSS2040CoexistMgmtAction(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN UCHAR apidx, IN UCHAR InfoReq); - -VOID SendNotifyBWActionFrame(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN UCHAR apidx); - -BOOLEAN ChannelSwitchSanityCheck(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN UCHAR NewChannel, IN UCHAR Secondary); - -VOID ChannelSwitchAction(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, IN UCHAR Channel, - IN UCHAR Secondary); - -ULONG BuildIntolerantChannelRep(IN RTMP_ADAPTER *pAd, IN PUCHAR pDest); - -VOID Update2040CoexistFrameAndNotify(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN BOOLEAN bAddIntolerantCha); - -VOID Send2040CoexistAction(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN BOOLEAN bAddIntolerantCha); - -VOID UpdateBssScanParm(IN RTMP_ADAPTER *pAd, IN OVERLAP_BSS_SCAN_IE APBssScan); -#endif /* DOT11N_DRAFT3 */ - -INT AsicSetRalinkBurstMode(RTMP_ADAPTER *pAd, BOOLEAN enable); -#endif /* DOT11_N_SUPPORT */ -UCHAR get_regulatory_class(RTMP_ADAPTER *pAd, UCHAR Channel, UCHAR PhyMode, - struct wifi_dev *wdev); - -UCHAR get_channel_set_num(UCHAR *ChannelSet); - -PUCHAR get_channelset_by_reg_class(IN RTMP_ADAPTER *pAd, - IN UINT8 RegulatoryClass, IN UCHAR PhyMode); - -INT Set_Reg_Domain_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID BarHeaderInit(IN RTMP_ADAPTER *pAd, IN OUT PFRAME_BAR pCntlBar, - IN PUCHAR pDA, IN PUCHAR pSA); - -VOID InsertActField(IN RTMP_ADAPTER *pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 Category, IN UINT8 ActCode); - -BOOLEAN QosBADataParse(IN RTMP_ADAPTER *pAd, IN BOOLEAN bAMSDU, - IN PUCHAR p8023Header, IN UCHAR WCID, IN UCHAR TID, - IN USHORT Sequence, IN UCHAR DataOffset, - IN USHORT Datasize, IN UINT CurRxIndex); - -BOOLEAN bar_process(RTMP_ADAPTER *pAd, ULONG Wcid, ULONG MsgLen, - PFRAME_BA_REQ pMsg); - -VOID BaAutoManSwitch(IN RTMP_ADAPTER *pAd); - -VOID HTIOTCheck(IN RTMP_ADAPTER *pAd, IN UCHAR BatRecIdx); - -INT32 wdev_init(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - enum WDEV_TYPE wdev_type, PNET_DEV if_dev, INT8 func_idx, - VOID *func_dev, VOID *sys_handle); - -INT32 wdev_deinit(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -enum queue_mm; -INT wdev_ops_register(struct wifi_dev *wdev, enum WDEV_TYPE wdev_type, - struct wifi_dev_ops *ops, UCHAR wmm_detect_method); -INT32 wdev_attr_update(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -INT wdev_tx_pkts(NDIS_HANDLE dev_hnd, PPNDIS_PACKET pkt_list, UINT pkt_cnt, - struct wifi_dev *wdev); -UCHAR get_frag_num(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pPacket); -BOOLEAN check_if_fragment(struct wifi_dev *wdev, PNDIS_PACKET pPacket); -#ifdef TX_AGG_ADJUST_WKR -BOOLEAN tx_check_for_agg_adjust(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -#endif /* TX_AGG_ADJUST_WKR */ -VOID tx_bytes_calculate(RTMP_ADAPTER *pAd, TX_BLK *tx_blk); -struct wifi_dev *wdev_search_by_address(RTMP_ADAPTER *pAd, UCHAR *Address); -#ifdef RT_CFG80211_SUPPORT -struct wifi_dev *WdevSearchByBssid(RTMP_ADAPTER *pAd, UCHAR *Address); -#endif -struct wifi_dev *wdev_search_by_omac_idx(RTMP_ADAPTER *pAd, UINT8 BssIndex); -struct wifi_dev *wdev_search_by_wcid(RTMP_ADAPTER *pAd, UINT8 wcid); -struct wifi_dev *wdev_search_by_pkt(RTMP_ADAPTER *pAd, PNDIS_PACKET pkt); -struct wifi_dev *wdev_search_by_idx(RTMP_ADAPTER *pAd, UINT32 idx); -struct wifi_dev *wdev_search_by_netdev(RTMP_ADAPTER *pAd, VOID *pDev); -VOID BssInfoArgumentLinker(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -INT32 GetBssInfoIdx(RTMP_ADAPTER *pAd); -INT32 wdev_idx_reg(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -INT32 wdev_idx_unreg(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID ReleaseBssIdx(RTMP_ADAPTER *pAd, UINT32 BssIdx); -VOID BssInfoArgumentUnLink(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID BssInfoArgumentLink(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - struct _BSS_INFO_ARGUMENT_T *bssinfo); -VOID wdev_if_up_down(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - BOOLEAN if_up_down_state); -INT32 wdev_config_init(struct _RTMP_ADAPTER *pAd); -void wdev_sync_ch_by_rfic(struct _RTMP_ADAPTER *ad, UCHAR rfic, UCHAR ch); -void wdev_sync_prim_ch(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev); - -#ifdef BW_VENDOR10_CUSTOM_FEATURE -#ifdef DOT11_N_SUPPORT -void wdev_sync_ht_bw(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - ADD_HTINFO *add_ht_info); -#endif -#ifdef DOT11_VHT_AC -void wdev_sync_vht_bw(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR bw, UINT8 channel); -#endif -BOOLEAN IS_SYNC_BW_POLICY_VALID(struct _RTMP_ADAPTER *pAd, BOOLEAN isHTPolicy, - UCHAR policy); -#endif - -#ifdef IP_ASSEMBLY - -typedef union ip_flags_frag_offset { - struct { -#ifdef RT_BIG_ENDIAN - USHORT flags_reserved : 1; - USHORT flags_may_frag : 1; - USHORT flags_more_frag : 1; - USHORT frag_offset : 13; -#else - USHORT frag_offset : 13; - USHORT flags_more_frag : 1; - USHORT flags_may_frag : 1; - USHORT flags_reserved : 1; -#endif - } field; - USHORT word; -} IP_FLAGS_FRAG_OFFSET; - -typedef struct ip_v4_hdr { -#ifdef RT_BIG_ENDIAN - UCHAR version : 4, ihl : 4; -#else - UCHAR ihl : 4, version : 4; -#endif - UCHAR tos; - USHORT tot_len; - USHORT identifier; -} IP_V4_HDR; - -typedef struct ip_assemble_data { - DL_LIST list; - QUEUE_HEADER queue; - INT32 identify; - INT32 fragSize; - ULONG createTime; -} IP_ASSEMBLE_DATA; - -INT rtmp_IpAssembleHandle(RTMP_ADAPTER *pAd, STA_TR_ENTRY *pTrEntry, - PNDIS_PACKET pPacket, UCHAR queIdx, - PACKET_INFO packetInfo); -#endif - -VOID ba_ori_session_start(IN RTMP_ADAPTER *pAd, IN STA_TR_ENTRY *tr_entry, - IN UINT8 UserPriority); - -INT rtmp_tx_burst_set(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID enable_tx_burst(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT8 ac_type, UINT8 prio, UINT16 level); -VOID disable_tx_burst(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT8 ac_type, UINT8 prio, UINT16 level); -UINT8 query_tx_burst_prio(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -INT TxOPUpdatingAlgo(RTMP_ADAPTER *pAd); - -VOID mt_detect_wmm_traffic(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR UserPriority, UCHAR FlgIsOutput); -VOID rx_802_3_data_frm_announce(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - RX_BLK *pRxBlk, struct wifi_dev *wdev); - -VOID rx_data_frm_announce(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN RX_BLK *pRxBlk, IN struct wifi_dev *wdev); - -INT sta_rx_pkt_allow(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, RX_BLK *pRxBlk); -INT rx_chk_duplicate_frame(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - struct wifi_dev *wdev); -VOID mt_dynamic_wmm_be_tx_op(IN RTMP_ADAPTER *pAd, IN ULONG nonBEpackets); - -NDIS_STATUS RTMPFreeTXDRequest(IN RTMP_ADAPTER *pAd, IN UCHAR RingType, - IN UCHAR NumberRequired, IN PUCHAR FreeNumberIs); - -NDIS_STATUS MlmeHardTransmit(IN RTMP_ADAPTER *pAd, IN UCHAR QueIdx, - IN PNDIS_PACKET pPacket, IN BOOLEAN FlgDataQForce, - IN BOOLEAN FlgIsLocked, IN BOOLEAN FlgIsCheckPS); - -NDIS_STATUS MlmeHardTransmitMgmtRing(IN RTMP_ADAPTER *pAd, IN UCHAR QueIdx, - IN PNDIS_PACKET pPacket); - -#ifdef RTMP_MAC_PCI -NDIS_STATUS MlmeHardTransmitTxRing(IN RTMP_ADAPTER *pAd, IN UCHAR QueIdx, - IN PNDIS_PACKET pPacket); - -NDIS_STATUS MlmeDataHardTransmit(IN RTMP_ADAPTER *pAd, IN UCHAR QueIdx, - IN PNDIS_PACKET pPacket); - -#endif /* RTMP_MAC_PCI */ - -USHORT RTMPCalcDuration(IN RTMP_ADAPTER *pAd, IN UCHAR Rate, IN ULONG Size); - -VOID mtd_write_tmac_info_fixed_rate(IN RTMP_ADAPTER *pAd, IN UCHAR *tmac_info, - IN MAC_TX_INFO *info, - IN HTTRANSMIT_SETTING *pTransmit); - -VOID mt_write_tmac_info_fixed_rate(IN RTMP_ADAPTER *pAd, IN UCHAR *tmac_info, - IN MAC_TX_INFO *info, - IN HTTRANSMIT_SETTING *pTransmit); - -VOID rtmp_write_tmac_info_fixed_rate(IN RTMP_ADAPTER *pAd, IN UCHAR *tmac_info, - IN MAC_TX_INFO *info, - IN HTTRANSMIT_SETTING *pTransmit); - -VOID write_tmac_info_Cache(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk); -#ifdef RANDOM_PKT_GEN -VOID random_write_qidx(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk); -#endif - -#ifdef MT_MAC -VOID mt_write_tmac_info_beacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *tmac_buf, - HTTRANSMIT_SETTING *BeaconTransmit, - ULONG frmLen); -#endif /* MT_MAC */ - -VOID RTMPSuspendMsduTransmission(IN RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -VOID RTMPResumeMsduTransmission(IN RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -NDIS_STATUS MiniportMMRequest(IN RTMP_ADAPTER *pAd, IN UCHAR QueIdx, - IN UCHAR *pData, IN UINT Length); - -VOID LowPowerDebug(PRTMP_ADAPTER pAd, PSTA_ADMIN_CONFIG pStaCfg); - -VOID RTMPSendNullFrame(IN RTMP_ADAPTER *pAd, IN PSTA_ADMIN_CONFIG pStaCfg, - IN UCHAR TxRate, IN BOOLEAN bQosNull, IN USHORT PwrMgmt); - -BOOLEAN RTMPFreeTXDUponTxDmaDone(IN RTMP_ADAPTER *pAd, IN UCHAR QueIdx, - IN UCHAR RingIdx, BOOLEAN ForceFree); - -#ifdef MT_MAC -UINT32 pkt_alloc_fail_handle(RTMP_ADAPTER *ad, PNDIS_PACKET rx_packet); -UINT32 mt_rx_pkt_process(RTMP_ADAPTER *, UINT8 hif_idx, RX_BLK *pRxBlk, - PNDIS_PACKET pRxPacket); -#endif /* MT_MAC */ - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -BOOLEAN is_looping_packet(IN RTMP_ADAPTER *pAd, IN NDIS_PACKET *pPacket); - -VOID set_wf_fwd_cb(IN RTMP_ADAPTER *pAd, IN PNDIS_PACKET pPacket, - IN struct wifi_dev *wdev); - -#endif /* CONFIG_WIFI_PKT_FWD */ - -BOOLEAN is_udp_packet(RTMP_ADAPTER *pAd, PNDIS_PACKET pkt); - -#if defined(CUSTOMER_DCC_FEATURE) || defined(TXRX_STAT_SUPPORT) -BOOLEAN RTMPGetUserPriority(IN RTMP_ADAPTER *pAd, IN PNDIS_PACKET pPacket, - IN struct wifi_dev *wdev, OUT UCHAR *pUserPriority, - OUT UCHAR *pQueIdx); - -#endif -#ifdef CUSTOMER_DCC_FEATURE - -VOID APGetStreamingStatus(IN PRTMP_ADAPTER pAd, IN UCHAR QueIdx); -#endif - -BOOLEAN RTMPCheckEtherType(IN RTMP_ADAPTER *pAd, IN PNDIS_PACKET pPacket, - IN STA_TR_ENTRY *tr_entry, IN struct wifi_dev *wdev); - -VOID RTMPCckBbpTuning(IN RTMP_ADAPTER *pAd, IN UINT TxRate); - -/* - MLME routines -*/ - -/* Asic/RF/BBP related functions */ -VOID AsicGetTxPowerOffset(IN PRTMP_ADAPTER pAd, IN PULONG TxPwr); - -VOID AsicGetAutoAgcOffsetForExternalTxAlc(IN PRTMP_ADAPTER pAd, - IN PCHAR pDeltaPwr, - IN PCHAR pTotalDeltaPwr, - IN PCHAR pAgcCompensate, - IN PCHAR pDeltaPowerByBbpR1); - -VOID AsicExtraPowerOverMAC(RTMP_ADAPTER *pAd); - -VOID AsicPercentageDeltaPower(IN PRTMP_ADAPTER pAd, IN CHAR Rssi, - INOUT PCHAR pDeltaPwr, - INOUT PCHAR pDeltaPowerByBbpR1); - -VOID AsicCompensatePowerViaBBP(IN RTMP_ADAPTER *pAd, - INOUT CHAR *pTotalDeltaPower); - -VOID AsicAdjustTxPower(RTMP_ADAPTER *pAd); - -#define WMM_PARAM_TXOP 0 -#define WMM_PARAM_AIFSN 1 -#define WMM_PARAM_CWMIN 2 -#define WMM_PARAM_CWMAX 3 -#define WMM_PARAM_ALL 4 - -#define WMM_PARAM_AC_0 0 -#define WMM_PARAM_AC_1 1 -#define WMM_PARAM_AC_2 2 -#define WMM_PARAM_AC_3 3 - -#ifdef RTMP_RBUS_SUPPORT -int RtmpAsicSendCommandToSwMcu(IN RTMP_ADAPTER *pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN FlgIsNeedLocked); -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef STREAM_MODE_SUPPORT -UINT32 StreamModeRegVal(IN RTMP_ADAPTER *pAd); - -/* - Update the Tx chain address - Parameters - pAd: The adapter data structure - pMacAddress: The MAC address of the peer STA - - Return Value: - None -*/ -VOID AsicUpdateTxChainAddress(IN RTMP_ADAPTER *pAd, IN PUCHAR pMacAddress); - -INT Set_StreamMode_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_StreamModeMac_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_StreamModeMCS_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -#endif /* STREAM_MODE_SUPPORT */ - -VOID MacAddrRandomBssid(IN RTMP_ADAPTER *pAd, OUT PUCHAR pAddr); - -VOID MgtMacHeaderInit(IN RTMP_ADAPTER *pAd, INOUT HEADER_802_11 *pHdr80211, - IN UCHAR SubType, IN UCHAR ToDs, IN UCHAR *pDA, - IN UCHAR *pSA, IN UCHAR *pBssid); - -VOID MgtMacHeaderInitExt(IN RTMP_ADAPTER *pAd, IN OUT PHEADER_802_11 pHdr80211, - IN UCHAR SubType, IN UCHAR ToDs, IN PUCHAR pDA, - IN PUCHAR pSA, IN PUCHAR pBssid); - -VOID MlmeRadioOff(IN RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -VOID MlmeRadioOn(IN RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -VOID MlmeLpEnter(IN RTMP_ADAPTER *pAd); - -VOID MlmeLpExit(IN RTMP_ADAPTER *pAd); - -VOID BssTableInit(IN BSS_TABLE *Tab); - -#if defined(DBDC_MODE) && defined(DOT11K_RRM_SUPPORT) -VOID BssTableInitByBand(IN BSS_TABLE *Tab, IN UCHAR Band); -#endif /* defined(DBDC_MODE) && defined(DOT11K_RRM_SUPPORT) */ - -#ifdef DOT11_N_SUPPORT -VOID BATableInit(IN RTMP_ADAPTER *pAd, IN BA_TABLE *Tab); - -VOID BATableExit(IN RTMP_ADAPTER *pAd); -#endif /* DOT11_N_SUPPORT */ - -ULONG BssTableSearch(IN BSS_TABLE *Tab, IN PUCHAR pBssid, IN UCHAR Channel); - -ULONG BssSsidTableSearch(IN BSS_TABLE *Tab, IN PUCHAR pBssid, IN PUCHAR pSsid, - IN UCHAR SsidLen, IN UCHAR Channel); - -ULONG BssTableSearchWithSSID(IN BSS_TABLE *Tab, IN PUCHAR Bssid, - IN PUCHAR pSsid, IN UCHAR SsidLen, - IN UCHAR Channel); - -ULONG BssSsidTableSearchBySSID(IN BSS_TABLE *Tab, IN PUCHAR pSsid, - IN UCHAR SsidLen); - -VOID BssTableDeleteEntry(IN OUT PBSS_TABLE pTab, IN PUCHAR pBssid, - IN UCHAR Channel); - -ULONG BssTableSetEntry(IN RTMP_ADAPTER *pAd, OUT BSS_TABLE *Tab, - IN BCN_IE_LIST *ie_list, IN CHAR Rssi, - IN USHORT LengthVIE, IN PNDIS_802_11_VARIABLE_IEs pVIE -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - , - IN UCHAR *Snr0, IN CHAR *rssi -#endif -); - -#ifdef DOT11_N_SUPPORT -VOID BATableInsertEntry(IN RTMP_ADAPTER *pAd, IN USHORT Aid, - IN USHORT TimeOutValue, IN USHORT StartingSeq, - IN UCHAR TID, IN UCHAR BAWinSize, - IN UCHAR OriginatorStatus, IN BOOLEAN IsRecipient); - -BOOLEAN bss_coex_insert_effected_ch_list(RTMP_ADAPTER *pAd, UCHAR Channel, - BCN_IE_LIST *ie_list, - struct wifi_dev *pwdev); - -#ifdef DOT11N_DRAFT3 -VOID Bss2040CoexistTimeOut(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID TriEventInit(IN RTMP_ADAPTER *pAd); - -INT TriEventTableSetEntry(IN RTMP_ADAPTER *pAd, OUT TRIGGER_EVENT_TAB *Tab, - IN PUCHAR pBssid, IN HT_CAPABILITY_IE *pHtCapability, - IN UCHAR HtCapabilityLen, IN UCHAR RegClass, - IN UCHAR ChannelNo); - -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - -VOID BssTableSsidSort(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - OUT BSS_TABLE *OutTab, IN CHAR Ssid[], IN UCHAR SsidLen); - -VOID BssTableSortByRssi(IN OUT BSS_TABLE *OutTab, IN BOOLEAN isInverseOrder); - -NDIS_STATUS MlmeQueueInit(IN RTMP_ADAPTER *pAd); - -VOID MlmeQueueDestroy(IN struct _MLME_STRUCT *mlme); - -#ifdef MLME_MULTI_QUEUE_SUPPORT -VOID *MlmeQueueSelByMach(IN RTMP_ADAPTER *pAd, IN ULONG Machine, - IN ULONG MsgType, IN VOID *pHeader); -#endif /*MLME_MULTI_QUEUE_SUPPORT*/ - -#ifdef CONFIG_AP_SUPPORT -BOOLEAN MlmeEnqueue(IN RTMP_ADAPTER *pAd, IN ULONG Machine, IN ULONG MsgType, - IN ULONG MsgLen, IN VOID *Msg, IN ULONG Priv); -#endif - -BOOLEAN MlmeEnqueueWithWdev(IN RTMP_ADAPTER *pAd, IN ULONG Machine, - IN ULONG MsgType, IN ULONG MsgLen, IN VOID *Msg, - IN ULONG Priv, IN struct wifi_dev *wdev); - -BOOLEAN MlmeEnqueueForRecv(IN RTMP_ADAPTER *pAd, IN ULONG Wcid, - IN struct raw_rssi_info *rssi_info, IN ULONG MsgLen, - IN PVOID Msg, IN UCHAR OpMode, - IN struct wifi_dev *wdev, IN UCHAR RxPhyMode); - -#ifdef WSC_INCLUDED -BOOLEAN MlmeEnqueueForWsc(IN RTMP_ADAPTER *pAd, IN ULONG eventID, - IN LONG senderID, IN ULONG Machine, IN ULONG MsgType, - IN ULONG MsgLen, IN VOID *Msg, - IN struct wifi_dev *wdev); -#endif /* WSC_INCLUDED */ - -BOOLEAN MlmeDequeue(IN MLME_QUEUE *Queue, OUT MLME_QUEUE_ELEM **Elem); - -VOID MlmeRestartStateMachine(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -BOOLEAN MlmeQueueEmpty(IN MLME_QUEUE *Queue); - -BOOLEAN MlmeQueueFull(IN MLME_QUEUE *Queue, IN UCHAR SendId); - -BOOLEAN MsgTypeSubst(IN RTMP_ADAPTER *pAd, IN PFRAME_802_11 pFrame, - OUT INT *Machine, OUT INT *MsgType); - -VOID StateMachineInit(IN STATE_MACHINE *Sm, IN STATE_MACHINE_FUNC Trans[], - IN ULONG StNr, IN ULONG MsgNr, - IN STATE_MACHINE_FUNC DefFunc, IN ULONG InitState, - IN ULONG Base); - -VOID StateMachineSetAction(IN STATE_MACHINE *S, IN ULONG St, ULONG Msg, - IN STATE_MACHINE_FUNC F); - -VOID StateMachinePerformAction(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *S, - IN MLME_QUEUE_ELEM *Elem, IN ULONG CurrState); - -VOID Drop(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID AssocStateMachineInit(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID ReassocTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID AssocTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID DisassocTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -/*---------------------------------------------- */ -VOID MlmeDisassocReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeAssocReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeReassocReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeDisassocReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerAssocRspAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerReassocRspAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerDisassocAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID DisassocTimeoutAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID AssocTimeoutAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID ReassocTimeoutAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID Cls3errAction(IN RTMP_ADAPTER *pAd, IN PUCHAR pAddr); - -VOID InvalidStateWhenAssoc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID InvalidStateWhenReassoc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID InvalidStateWhenDisassociate(IN RTMP_ADAPTER *pAd, - IN MLME_QUEUE_ELEM *Elem); - -VOID ComposePsPoll(IN RTMP_ADAPTER *pAd, IN PPSPOLL_FRAME pPsPollFrame, - IN USHORT Aid, IN UCHAR *pBssid, IN UCHAR *pTa); - -VOID ComposeNullFrame(RTMP_ADAPTER *pAd, PHEADER_802_11 pNullFrame, - UCHAR *pAddr1, UCHAR *pAddr2, UCHAR *pAddr3); - -VOID AssocPostProc(IN RTMP_ADAPTER *pAd, IN PUCHAR pAddr2, - IN USHORT CapabilityInfo, IN USHORT Aid, IN UCHAR SupRate[], - IN UCHAR SupRateLen, IN UCHAR ExtRate[], IN UCHAR ExtRateLen, - IN PEDCA_PARM pEdcaParm, struct _IE_lists *ie_list, - IN HT_CAPABILITY_IE *pHtCapability, IN UCHAR HtCapabilityLen, - IN ADD_HT_INFO_IE *pAddHtInfo, IN MAC_TABLE_ENTRY *pEntry); - -VOID AuthStateMachineInit(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN PSTATE_MACHINE sm, OUT STATE_MACHINE_FUNC Trans[]); - -VOID AuthTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID MlmeAuthReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerAuthRspAtSeq2Action(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerAuthRspAtSeq4Action(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID AuthTimeoutAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID Cls2errAction(IN struct wifi_dev *wdev, IN PUCHAR pAddr); - -VOID MlmeDeauthReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID InvalidStateWhenAuth(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -/*============================================= */ - -VOID AuthRspStateMachineInit(IN RTMP_ADAPTER *pAd, IN PSTATE_MACHINE Sm, - IN STATE_MACHINE_FUNC Trans[]); - -VOID PeerDeauthAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerAuthSimpleRspGenAndSend(IN RTMP_ADAPTER *pAd, - IN PHEADER_802_11 pHdr80211, IN USHORT Alg, - IN USHORT Seq, IN USHORT Reason, - IN USHORT Status); - -BOOLEAN PeerProbeReqSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT PEER_PROBE_REQ_PARAM *Param); - -/*======================================== */ - -VOID SyncStateMachineInit(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN STATE_MACHINE *Sm, OUT STATE_MACHINE_FUNC Trans[]); - -VOID BeaconTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID ScanTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID MlmeScanReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID InvalidStateWhenScan(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID InvalidStateWhenJoin(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID InvalidStateWhenStart(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerBeacon(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID EnqueueProbeRequest(IN RTMP_ADAPTER *pAd); - -BOOLEAN ScanRunning(IN RTMP_ADAPTER *pAd); -/*========================================= */ - -VOID MlmeCntlInit(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev); - -VOID MlmeCntlMachinePerformAction(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *S, - IN MLME_QUEUE_ELEM *Elem); - -VOID CntlIdleProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlOidScanProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlOidSsidProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlOidRTBssidProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlMlmeRoamingProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlWaitDisassocProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlWaitJoinProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlWaitReassocProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlWaitStartProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlWaitAuthProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlWaitAuthProc2(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID CntlWaitAssocProc(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID LinkUp(IN RTMP_ADAPTER *pAd, IN UCHAR BssType, IN struct wifi_dev *wdev); - -VOID LinkDown(IN RTMP_ADAPTER *pAd, IN BOOLEAN IsReqFromAP, - IN struct wifi_dev *wdev); - -VOID IterateOnBssTab(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -VOID IterateOnBssTab2(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -VOID JoinParmFill(IN RTMP_ADAPTER *pAd, IN OUT MLME_JOIN_REQ_STRUCT *JoinReq, - IN ULONG BssIdx); - -VOID AssocParmFill(IN RTMP_ADAPTER *pAd, IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq, - IN PUCHAR pAddr, IN USHORT CapabilityInfo, IN ULONG Timeout, - IN USHORT ListenIntv); - -VOID ScanParmFill(IN RTMP_ADAPTER *pAd, IN OUT MLME_SCAN_REQ_STRUCT *ScanReq, - IN RTMP_STRING Ssid[], IN UCHAR SsidLen, IN UCHAR BssType, - IN UCHAR ScanType); - -VOID DisassocParmFill(IN RTMP_ADAPTER *pAd, - IN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq, - IN PUCHAR pAddr, IN USHORT Reason); - -VOID StartParmFill(IN RTMP_ADAPTER *pAd, IN OUT MLME_START_REQ_STRUCT *StartReq, - IN CHAR Ssid[], IN UCHAR SsidLen); - -VOID AuthParmFill(IN RTMP_ADAPTER *pAd, IN OUT MLME_AUTH_REQ_STRUCT *AuthReq, - IN PUCHAR pAddr, IN USHORT Alg); - -VOID EnqueuePsPoll(IN RTMP_ADAPTER *pAd, PSTA_ADMIN_CONFIG pStaCfg); - -VOID EnqueueBeaconFrame(IN RTMP_ADAPTER *pAd); - -VOID MlmeJoinReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeScanReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeStartReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeForceJoinReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeForceScanReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID ScanTimeoutAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -#ifdef CUSTOMER_DCC_FEATURE -VOID APChannelSwitch(IN PRTMP_ADAPTER pAd, IN PCmdQElmt CMDQelmt); -#endif - -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE -#define IS_VENDOR10_RSSI_VALID(_wdev) (_wdev->isRssiEnbl == TRUE) -#define SET_VENDOR10_RSSI_VALID(_wdev, enable) (_wdev->isRssiEnbl = enable) - -VOID Vendor10RssiUpdate(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN BOOLEAN isBcn, IN INT RealRssi); -#endif - -VOID BeaconTimeoutAtJoinAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerBeaconAtScanAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerBeaconAtJoinAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerBeacon(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PeerProbeReqAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID ScanNextChannel(IN RTMP_ADAPTER *pAd, IN UCHAR OpMode, - IN struct wifi_dev *wdev); - -BOOLEAN MlmeScanReqSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT UCHAR *BssType, OUT CHAR ssid[], - OUT UCHAR *SsidLen, OUT UCHAR *ScanType); - -BOOLEAN PeerBeaconAndProbeRspSanity_Old( - IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - IN UCHAR MsgChannel, OUT PUCHAR pAddr2, OUT PUCHAR pBssid, - OUT CHAR Ssid[], OUT UCHAR *pSsidLen, OUT UCHAR *pBssType, - OUT USHORT *pBeaconPeriod, OUT UCHAR *pChannel, OUT UCHAR *pNewChannel, - OUT LARGE_INTEGER *pTimestamp, OUT CF_PARM *pCfParm, - OUT USHORT *pAtimWin, OUT USHORT *pCapabilityInfo, OUT UCHAR *pErp, - OUT UCHAR *pDtimCount, OUT UCHAR *pDtimPeriod, OUT UCHAR *pBcastFlag, - OUT UCHAR *pMessageToMe, OUT UCHAR SupRate[], OUT UCHAR *pSupRateLen, - OUT UCHAR ExtRate[], OUT UCHAR *pExtRateLen, OUT UCHAR *pCkipFlag, - OUT UCHAR *pAironetCellPowerLimit, OUT PEDCA_PARM pEdcaParm, - OUT PQBSS_LOAD_PARM pQbssLoad, OUT PQOS_CAPABILITY_PARM pQosCapability, - OUT ULONG *pRalinkIe, OUT UCHAR *pHtCapabilityLen, - OUT HT_CAPABILITY_IE *pHtCapability, - OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo, OUT UCHAR *AddHtInfoLen, - OUT ADD_HT_INFO_IE *AddHtInfo, OUT UCHAR *NewExtChannel, - OUT USHORT *LengthVIE, OUT PNDIS_802_11_VARIABLE_IEs pVIE); - -BOOLEAN PeerBeaconAndProbeRspSanity(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *wdev, IN VOID *Msg, - IN ULONG MsgLen, IN UCHAR MsgChannel, - OUT BCN_IE_LIST *ie_list, - OUT USHORT *LengthVIE, - OUT PNDIS_802_11_VARIABLE_IEs pVIE, - IN BOOLEAN bGetDtim, - - IN BOOLEAN bFromBeaconReport); - -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 -BOOLEAN PeerBeaconAndProbeRspSanity2(IN RTMP_ADAPTER *pAd, IN VOID *Msg, - IN ULONG MsgLen, - IN OVERLAP_BSS_SCAN_IE *BssScan, - OUT UCHAR *RegClass); -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - -BOOLEAN PeerAddBAReqActionSanity(IN RTMP_ADAPTER *pAd, IN VOID *pMsg, - IN ULONG MsgLen, OUT PUCHAR pAddr2); - -BOOLEAN PeerAddBARspActionSanity(IN RTMP_ADAPTER *pAd, IN VOID *pMsg, - IN ULONG MsgLen); - -BOOLEAN PeerDelBAActionSanity(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN VOID *pMsg, IN ULONG MsgLen); - -BOOLEAN MlmeAssocReqSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT PUCHAR pApAddr, OUT USHORT *CapabilityInfo, - OUT ULONG *Timeout, OUT USHORT *ListenIntv); - -BOOLEAN MlmeAuthReqSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT PUCHAR pAddr, OUT ULONG *Timeout, - OUT USHORT *Alg); - -BOOLEAN MlmeStartReqSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT CHAR Ssid[], OUT UCHAR *Ssidlen); - -BOOLEAN PeerAuthSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT PUCHAR pAddr, OUT USHORT *Alg, OUT USHORT *Seq, - OUT USHORT *Status, OUT CHAR ChlgText[]); - -BOOLEAN PeerAssocRspSanity( - IN struct wifi_dev *wdev, IN VOID *pMsg, IN ULONG MsgLen, - OUT PUCHAR pAddr2, OUT USHORT *pCapabilityInfo, OUT USHORT *pStatus, - OUT USHORT *pAid, OUT UCHAR SupRate[], OUT UCHAR *pSupRateLen, - OUT UCHAR ExtRate[], OUT UCHAR *pExtRateLen, - OUT HT_CAPABILITY_IE *pHtCapability, - OUT ADD_HT_INFO_IE - *pAddHtInfo, /* AP might use this additional ht info IE */ - OUT UCHAR *pHtCapabilityLen, OUT UCHAR *pAddHtInfoLen, - OUT UCHAR *pNewExtChannelOffset, OUT PEDCA_PARM pEdcaParm, - OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo, OUT UCHAR *pCkipFlag, - struct _IE_lists *ie_list); - -BOOLEAN PeerDisassocSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT PUCHAR pAddr2, OUT USHORT *Reason); - -BOOLEAN PeerDeauthSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT PUCHAR pAddr1, OUT PUCHAR pAddr2, - OUT PUCHAR pAddr3, OUT USHORT *Reason); - -BOOLEAN GetTimBit(IN CHAR *Ptr, IN USHORT Aid, OUT UCHAR *TimLen, - OUT UCHAR *BcastFlag, OUT UCHAR *DtimCount, - OUT UCHAR *DtimPeriod, OUT UCHAR *MessageToMe); - -UCHAR ChannelSanity(IN RTMP_ADAPTER *pAd, IN UCHAR channel); - -UCHAR ChannelSanityByWdev(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - IN UCHAR channel); - -NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(IN BSS_ENTRY *pBss); - -BOOLEAN MlmeDelBAReqSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen); - -BOOLEAN MlmeAddBAReqSanity(IN RTMP_ADAPTER *pAd, IN VOID *Msg, IN ULONG MsgLen, - OUT PUCHAR pAddr2); - -ULONG MakeOutgoingFrame(OUT UCHAR *Buffer, OUT ULONG *Length, ...); - -UCHAR RandomByte(IN RTMP_ADAPTER *pAd); - -UCHAR RandomByte2(IN RTMP_ADAPTER *pAd); - -VOID MlmePeriodicExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID MlmePeriodicExecTimer(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID LinkDownExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID LinkUpExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID STAMlmePeriodicExec(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -VOID MlmeAutoScan(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -VOID MlmeAutoReconnectLastSSID(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -BOOLEAN MlmeValidateSSID(IN PUCHAR pSsid, IN UCHAR SsidLen); - -VOID MlmeCheckForRoaming(IN RTMP_ADAPTER *pAd, IN ULONG Now32); - -BOOLEAN MlmeCheckForFastRoaming(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -#ifdef TXBF_SUPPORT -BOOLEAN MlmeTxBfAllowed(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN struct _RTMP_RA_LEGACY_TB *pTxRate); -#endif /* TXBF_SUPPORT */ - -VOID MlmeCalculateChannelQuality(IN RTMP_ADAPTER *pAd, - IN PMAC_TABLE_ENTRY pMacEntry, IN ULONG Now); - -VOID MlmeCheckPsmChange(IN RTMP_ADAPTER *pAd, IN ULONG Now32, - IN struct wifi_dev *wdev); - -VOID MlmeSetPsmBit(IN RTMP_ADAPTER *pAd, IN PSTA_ADMIN_CONFIG pStaCfg, - IN USHORT psm); - -#ifdef STA_LP_PHASE_1_SUPPORT -VOID RTMPSetEnterPsmNullBit(IN PPWR_MGMT_STRUCT pPwrMgmt); - -VOID RTMPClearEnterPsmNullBit(IN PPWR_MGMT_STRUCT pPwrMgmt); - -BOOLEAN RTMPEnterPsmNullBitStatus(IN PPWR_MGMT_STRUCT pPwrMgmt); -#endif /* STA_LP_PHASE_1_SUPPORT */ - -VOID MlmeSetTxPreamble(IN RTMP_ADAPTER *pAd, IN USHORT TxPreamble); - -VOID UpdateBasicRateBitmap(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -VOID MlmeUpdateTxRates(IN RTMP_ADAPTER *pAd, IN BOOLEAN bLinkUp, - IN UCHAR apidx); - -VOID MlmeUpdateTxRatesWdev(RTMP_ADAPTER *pAd, BOOLEAN bLinkUp, - struct wifi_dev *wdev); - -#ifdef DOT11_N_SUPPORT -VOID MlmeUpdateHtTxRates(IN PRTMP_ADAPTER pAd, IN UCHAR apidx); - -#ifdef DOT11_VHT_AC -VOID MlmeUpdateVhtTxRates(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN UCHAR apidx); -#endif /* DOT11_VHT_AC */ - -#endif /* DOT11_N_SUPPORT */ - -VOID RTMPCheckRates(IN RTMP_ADAPTER *pAd, IN OUT UCHAR SupRate[], - IN OUT UCHAR *SupRateLen, IN UCHAR PhyMode); - -BOOLEAN RTMPCheckHt(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, - INOUT HT_CAPABILITY_IE *pHtCapability, - INOUT ADD_HT_INFO_IE *pAddHtInfo); - -#ifdef DOT11_VHT_AC -BOOLEAN RTMPCheckVht(IN RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN VHT_CAP_IE *vht_cap, IN VHT_OP_IE *vht_op); -#endif /* DOT11_VHT_AC */ - -VOID RTMPUpdateMlmeRate(IN RTMP_ADAPTER *pAd); - -CHAR RTMPMaxRssi(IN RTMP_ADAPTER *pAd, IN CHAR Rssi0, IN CHAR Rssi1, - IN CHAR Rssi2 -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - IN CHAR Rssi3 -#endif - -); - -CHAR RTMPMinRssi(IN RTMP_ADAPTER *pAd, IN CHAR Rssi0, IN CHAR Rssi1, - IN CHAR Rssi2, IN CHAR Rssi3); - -CHAR RTMPAvgRssi(IN RTMP_ADAPTER *pAd, IN RSSI_SAMPLE *pRssi); - -CHAR RTMPMinSnr(IN RTMP_ADAPTER *pAd, IN CHAR Snr0, IN CHAR Snr1); - -#ifdef MICROWAVE_OVEN_SUPPORT -INT Set_MO_FalseCCATh_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -#endif /* MICROWAVE_OVEN_SUPPORT */ - -#ifdef RTMP_EFUSE_SUPPORT -INT set_eFuseGetFreeBlockCount_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_eFusedump_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_eFuseLoadFromBin_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -UCHAR eFuseReadRegisters(RTMP_ADAPTER *pAd, USHORT Offset, UINT16 Length, - UINT16 *pData); -VOID EfusePhysicalReadRegisters(RTMP_ADAPTER *pAd, USHORT Offset, USHORT Length, - USHORT *pData); - -#ifdef CONFIG_ATE -INT Set_LoadEepromBufferFromEfuse_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_eFuseBufferModeWriteBack_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_BinModeWriteBack_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CONFIG_ATE */ - -VOID rtmp_ee_load_from_efuse(RTMP_ADAPTER *pAd); - -#endif /* RTMP_EFUSE_SUPPORT */ - -VOID AsicEvaluateRxAnt(RTMP_ADAPTER *pAd); - -VOID AsicRxAntEvalTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID APSDPeriodicExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(IN RTMP_ADAPTER *pAd, - IN PMAC_TABLE_ENTRY pEntry); - -UCHAR RTMPStaFixedTxMode(IN RTMP_ADAPTER *pAd, IN PMAC_TABLE_ENTRY pEntry); - -VOID RTMPUpdateLegacyTxSetting(IN UCHAR fixed_tx_mode, - IN PMAC_TABLE_ENTRY pEntry); - -BOOLEAN RTMPAutoRateSwitchCheck(RTMP_ADAPTER *pAd); - -VOID MlmeHalt(RTMP_ADAPTER *pAd); -NDIS_STATUS MlmeInit(RTMP_ADAPTER *pAd); -VOID MlmeResetRalinkCounters(RTMP_ADAPTER *pAd); - -VOID BuildChannelList(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -UCHAR ApAutoChannelAtBootUp(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -BOOLEAN ApAutoChannelSkipListBuild(IN RTMP_ADAPTER *pAd, - IN struct wifi_dev *wdev); -#endif - -UCHAR FirstChannel(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -UCHAR NextChannel(RTMP_ADAPTER *pAd, UCHAR channel, struct wifi_dev *wdev); -UCHAR FindScanChannel(RTMP_ADAPTER *pAd, UINT8 LastScanChannel, - struct wifi_dev *wdev); -UCHAR FindPartialScanChannel(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -INT PartialScanInit(RTMP_ADAPTER *pAd); - -VOID ChangeToCellPowerLimit(RTMP_ADAPTER *pAd, UCHAR AironetCellPowerLimit); - -VOID RTMPInitMICEngine(IN RTMP_ADAPTER *pAd, IN PUCHAR pKey, IN PUCHAR pDA, - IN PUCHAR pSA, IN UCHAR UserPriority, IN PUCHAR pMICKey); - -BOOLEAN RTMPTkipCompareMICValue(IN RTMP_ADAPTER *pAd, IN PUCHAR pSrc, - IN PUCHAR pDA, IN PUCHAR pSA, IN PUCHAR pMICKey, - IN UCHAR UserPriority, IN UINT Len); - -VOID RTMPCalculateMICValue(IN RTMP_ADAPTER *pAd, IN PNDIS_PACKET pPacket, - IN PUCHAR pEncap, IN PUCHAR pKey, IN PUCHAR pMIC, - IN UCHAR apidx); - -VOID RTMPTkipAppendByte(TKIP_KEY_INFO *pTkip, UCHAR uChar); -VOID RTMPTkipAppend(TKIP_KEY_INFO *pTkip, UCHAR *pSrc, UINT nBytes); -VOID RTMPTkipGetMIC(TKIP_KEY_INFO *pTkip); - -INT RT_CfgSetCountryRegion(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg, - IN INT band); - -INT RT_CfgSetWirelessMode(RTMP_ADAPTER *pAd, RTMP_STRING *arg, - struct wifi_dev *wdev); - -/*update phy mode for all of wdev*/ -VOID RtmpUpdatePhyMode(RTMP_ADAPTER *pAd, UCHAR *pWmode); -RT_802_11_PHY_MODE wmode_2_cfgmode(UCHAR wmode); -UCHAR cfgmode_2_wmode(UCHAR cfg_mode); -#ifdef MIN_PHY_RATE_SUPPORT -HTTRANSMIT_SETTING MinPhyRate_2_HtTransmit(UCHAR MinPhyRate); -#endif /* MIN_PHY_RATE_SUPPORT */ -BOOLEAN wmode_valid_and_correct(RTMP_ADAPTER *pAd, UCHAR *wmode); -UCHAR *wmode_2_str(UCHAR wmode); - -#ifdef CONFIG_AP_SUPPORT -#ifdef MBSS_SUPPORT -INT RT_CfgSetMbssWirelessMode(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* MBSS_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -INT RT_CfgSetShortSlot(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT RT_CfgSetWepKey(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *keyString, - IN CIPHER_KEY *pSharedKey, IN INT keyIdx); - -INT RT_CfgSetFixedTxPhyMode(RTMP_STRING *arg); -INT RT_CfgSetMacAddress(RTMP_ADAPTER *pAd, RTMP_STRING *arg, UCHAR idx); -INT RT_CfgSetTxMCSProc(RTMP_STRING *arg, BOOLEAN *pAutoRate); -INT RT_CfgSetAutoFallBack(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef WSC_INCLUDED -INT RT_CfgSetWscPinCode(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *pPinCodeStr, - OUT PWSC_CTRL pWscControl); -#endif /* WSC_INCLUDED */ - -INT Set_Antenna_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef HW_TX_RATE_LOOKUP_SUPPORT -INT Set_HwTxRateLookUp_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* HW_TX_RATE_LOOKUP_SUPPORT */ - -#ifdef MULTI_MAC_ADDR_EXT_SUPPORT -INT Set_EnMultiMacAddrExt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_MultiMacAddrExt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* MULTI_MAC_ADDR_EXT_SUPPORT */ - -INT set_tssi_enable(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef MT_MAC - -INT set_cr4_query(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_cr4_set(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_cr4_capability(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_cr4_debug(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT dump_cr4_pdma_debug_probe(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT dump_remap_cr_content(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_re_calibration(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_thermal_recal_mode(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_get_fid(RTMP_ADAPTER *pAd, char *arg); -INT set_fw_log(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_isr_cmd(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_txop_cfg(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_rts_cfg(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_ser(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 set_fw_cmd(RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT32 get_fw_cmd(RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -INT SetManualTxOP(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_themal_sensor(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetManualTxOPThreshold(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetManualTxOPUpBound(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetManualTxOPLowBound(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetPSEWatchDog_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT setTmrEnableProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT setTmrVerProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT SetTmrCalProc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); - -#ifdef FW_DUMP_SUPPORT -INT set_fwdump_path(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT fwdump_print(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_fwdump_max_size(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -#endif /* MT_MAC */ - -#ifdef RTMP_MAC_PCI -INT Set_PDMAWatchDog_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -INT Set_RadioOn_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -#ifdef CUSTOMER_RSG_FEATURE -INT Set_ApEnableRadioChStats_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif -#ifdef CUSTOMER_DCC_FEATURE -INT Set_ApDisableSTAConnect_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_ApEnableBeaconTable_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -VOID RTMPIoctlQuerySTAStat(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlQueryMbssStat(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif - -#ifdef NEW_SET_RX_STREAM -INT Set_RxStream_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif - -INT Set_Lp_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT set_fix_amsdu(PRTMP_ADAPTER pAd, char *arg); - -INT set_rx_max_cnt(PRTMP_ADAPTER pAd, char *arg); - -INT set_rx1_max_cnt(PRTMP_ADAPTER pAd, char *arg); - -INT set_rx_dly_ctl(PRTMP_ADAPTER pAd, char *arg); - -INT set_tx_dly_ctl(PRTMP_ADAPTER pAd, char *arg); - -#ifdef MAP_R2 -INT show_traffic_separation_info(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -#endif - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -void set_pcie_aspm_dym_ctrl_cap(PRTMP_ADAPTER pAd, - BOOLEAN flag_pcie_aspm_dym_ctrl); - -BOOLEAN get_pcie_aspm_dym_ctrl_cap(PRTMP_ADAPTER pAd); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -#ifdef CONFIG_DVT_MODE -INT16 i2SetDvt(RTMP_ADAPTER *pAd, RTMP_STRING *pArg); -#endif /* CONFIG_DVT_MODE */ - -NDIS_STATUS RTMPWPARemoveKeyProc(IN RTMP_ADAPTER *pAd, IN PVOID pBuf); - -VOID RTMPWPARemoveAllKeys(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -BOOLEAN RTMPCheckStrPrintAble(IN CHAR *pInPutStr, IN UCHAR strLen); - -VOID RTMPSetDefaultChannel(IN PRTMP_ADAPTER pAd); - -VOID RTMPUpdateRateInfo(UCHAR phymode, struct dev_rate_info *rate); -VOID RTMPSetPhyMode(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN UCHAR phymode); - -VOID RTMPUpdateHTIE(IN UCHAR *pMcsSet, IN struct wifi_dev *wdev, - OUT HT_CAPABILITY_IE *pHtCapability, - OUT ADD_HT_INFO_IE *pAddHtInfo); - -VOID RTMPAddWcidAttributeEntry(IN RTMP_ADAPTER *pAd, IN UCHAR BssIdx, - IN UCHAR KeyIdx, IN UCHAR CipherAlg, - IN MAC_TABLE_ENTRY *pEntry); - -RTMP_STRING *GetEncryptType(CHAR enc); -RTMP_STRING *GetAuthMode(CHAR auth); - -VOID MacTableSetEntryRaCap(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *ent, - struct _vendor_ie_cap *vendor_ie); - -#ifdef DOT11_N_SUPPORT -VOID set_sta_ht_cap(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *ent, - HT_CAPABILITY_IE *ht_ie); - -VOID RTMPSetHT(RTMP_ADAPTER *pAd, OID_SET_HT_PHYMODE *pHTPhyMode, - struct wifi_dev *wdev); -VOID RTMPSetIndividualHT(RTMP_ADAPTER *pAd, UCHAR apidx); -UINT32 starec_ht_feature_decision(struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, - UINT32 *feature); - -UCHAR get_cent_ch_by_htinfo(RTMP_ADAPTER *pAd, ADD_HT_INFO_IE *ht_op, - HT_CAPABILITY_IE *ht_cap); - -INT get_ht_cent_ch(RTMP_ADAPTER *pAd, UINT8 *rf_bw, UINT8 *ext_ch, - UCHAR Channel); -INT ht_mode_adjust(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - HT_CAPABILITY_IE *peer_ht_cap); -UINT8 get_max_nss_by_htcap_ie_mcs(UCHAR *cap_mcs); -INT set_ht_fixed_mcs(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - UCHAR fixed_mcs, UCHAR mcs_bound); -INT get_ht_max_mcs(RTMP_ADAPTER *pAd, UCHAR *desire_mcs, UCHAR *cap_mcs); -UCHAR cal_ht_cent_ch(UCHAR prim_ch, UCHAR phy_bw, UCHAR ext_cha, UCHAR *cen_ch); -INT build_ht_ies(RTMP_ADAPTER *pAd, struct _build_ie_info *info); - -#define MAKE_IE_TO_BUF(__BUF, __CONTENT, __CONTENT_LEN, __CUR_LEN) \ - { \ - NdisMoveMemory((__BUF + __CUR_LEN), (UCHAR *)(__CONTENT), \ - __CONTENT_LEN); \ - __CUR_LEN += __CONTENT_LEN; \ - } -#endif /* DOT11_N_SUPPORT */ - -VOID RTMPDisableDesiredHtInfo(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -#ifdef SYSTEM_LOG_SUPPORT -VOID RtmpDrvSendWirelessEvent(IN VOID *pAdSrc, IN USHORT Event_flag, - IN PUCHAR pAddr, IN UCHAR wdev_idx, IN CHAR Rssi); -#else -#define RtmpDrvSendWirelessEvent(_pAd, _Event_flag, _pAddr, wdev_idx, _Rssi) -#endif /* SYSTEM_LOG_SUPPORT */ - -CHAR ConvertToRssi(IN RTMP_ADAPTER *pAd, IN struct raw_rssi_info *rssi_info, - IN UCHAR rssi_idx); - -CHAR ConvertToSnr(RTMP_ADAPTER *pAd, UCHAR Snr); - -BOOLEAN AdjustBwToSyncAp(RTMP_ADAPTER *pAd, BCN_IE_LIST *ie_list, UCHAR Wcid, - UCHAR fun_tb_idx); - -#ifdef DOT11N_DRAFT3 -VOID BuildEffectedChannelList(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -VOID CntlChannelWidth(IN RTMP_ADAPTER *pAd, IN UCHAR PrimaryChannel, - IN UCHAR CentralChannel, IN UCHAR ChannelWidth, - IN UCHAR SecondaryChannelOffset); - -#endif /* DOT11N_DRAFT3 */ - -VOID APAsicEvaluateRxAnt(IN RTMP_ADAPTER *pAd); - -VOID APAsicRxAntEvalTimeout(RTMP_ADAPTER *pAd); - -MAC_TABLE_ENTRY *PACInquiry(RTMP_ADAPTER *pAd, UCHAR Wcid); - -VOID HandleCounterMeasure(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry); - -VOID WPAStart4WayHS(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN ULONG TimeInterval); - -VOID WPAStart2WayGroupHS(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry); - -VOID CMTimerExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -#ifdef TXBF_SUPPORT -#ifndef MT_MAC -VOID eTxBfProbeTimerExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - -VOID RTMPHandleSTAKey(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN MLME_QUEUE_ELEM *Elem); - -VOID MlmeDeAuthAction(IN RTMP_ADAPTER *pAd, IN PMAC_TABLE_ENTRY pEntry, - IN USHORT Reason, IN BOOLEAN bDataFrameFirst); - -#ifdef DOT11W_PMF_SUPPORT -VOID PMF_SAQueryTimeOut(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID PMF_SAQueryConfirmTimeOut(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); -#endif /* DOT11W_PMF_SUPPORT */ - -VOID AES_128_CMAC(IN PUCHAR key, IN PUCHAR input, IN INT len, OUT PUCHAR mac); - -#ifdef DOT1X_SUPPORT -VOID WpaSend(IN RTMP_ADAPTER *pAd, IN PUCHAR pPacket, IN ULONG Len); - -INT RTMPAddPMKIDCache(IN NDIS_AP_802_11_PMKID *pPMKIDCache, IN INT apidx, - IN UCHAR *pAddr, IN UCHAR *PMKID, IN UCHAR *PMK, - IN UINT8 pmk_len); - -INT RTMPSearchPMKIDCache(IN NDIS_AP_802_11_PMKID *pPMKIDCache, IN INT apidx, - IN UCHAR *pAddr); - -INT RTMPSearchPMKIDCacheByPmkId(IN NDIS_AP_802_11_PMKID *pPMKIDCache, - IN INT apidx, IN UCHAR *pAddr, - IN UCHAR *pPmkId); - -INT RTMPValidatePMKIDCache(IN NDIS_AP_802_11_PMKID *pPMKIDCache, IN INT apidx, - IN UCHAR *pAddr, IN UCHAR *pPMKID); - -VOID RTMPDeletePMKIDCache(IN NDIS_AP_802_11_PMKID *pPMKIDCache, IN INT apidx, - IN INT idx); - -VOID RTMPMaintainPMKIDCache(IN RTMP_ADAPTER *pAd); - -UCHAR is_rsne_pmkid_cache_match(IN UINT8 *rsnie, IN UINT rsnie_len, - IN NDIS_AP_802_11_PMKID *pmkid_cache, - IN INT apidx, IN UCHAR *addr, - OUT INT *cacheidx); -#else -#define RTMPMaintainPMKIDCache(_pAd) -#endif /* DOT1X_SUPPORT */ - -#ifdef RESOURCE_PRE_ALLOC -VOID RTMPResetTxRxRingMemory(IN RTMP_ADAPTER *pAd); -#endif /* RESOURCE_PRE_ALLOC */ - -VOID *alloc_rx_buf_1k(void *hif_resource); -VOID free_rx_buf_1k(void *hif_resource); -VOID *alloc_rx_buf_64k(void *hif_resource); -VOID free_rx_buf_64k(void *hif_resource); -VOID free_rx_buf(void *hdev_ctrl, UCHAR hif_idx); -VOID RTMPFreeTxRxRingMemory(RTMP_ADAPTER *pAd); -BOOLEAN fill_tx_blk(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _TX_BLK *tx_blk); -UINT16 tx_pkt_classification(RTMP_ADAPTER *pAd, PNDIS_PACKET pPacket, - TX_BLK *pTxBlk); -INT send_data_pkt(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, PNDIS_PACKET pkt); -INT send_mlme_pkt(RTMP_ADAPTER *pAd, PNDIS_PACKET pkt, struct wifi_dev *wdev, - UCHAR q_idx, BOOLEAN is_data_queue); -INT32 fp_send_data_pkt(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt); - -void announce_802_3_packet(IN VOID *pAdSrc, IN PNDIS_PACKET pPacket, - IN UCHAR OpMode); - -UINT announce_amsdu_pkt(RTMP_ADAPTER *pAd, PNDIS_PACKET pPacket, UCHAR OpMode); - -PNET_DEV get_netdev_from_bssid(RTMP_ADAPTER *pAd, UCHAR FromWhichBSSID); - -#ifdef DOT11_N_SUPPORT -void ba_flush_reordering_timeout_mpdus(IN RTMP_ADAPTER *pAd, - IN PBA_REC_ENTRY pBAEntry, - IN ULONG Now32); - -void ba_timeout_flush(RTMP_ADAPTER *pAd); -void ba_timeout_monitor(RTMP_ADAPTER *pAd); - -VOID ba_ori_session_setup(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, UCHAR TID, - USHORT TimeOut, ULONG DelayTime, BOOLEAN isForced); - -BOOLEAN ba_rec_session_add(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - FRAME_ADDBA_REQ *pFrame); - -VOID ba_session_tear_down_all(RTMP_ADAPTER *pAd, UCHAR Wcid); - -VOID ba_ori_session_tear_down(RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR TID, - BOOLEAN bPassive, BOOLEAN bForceSend); - -VOID ba_resource_dump_all(RTMP_ADAPTER *pAd); -VOID ba_reordering_resource_dump_all(RTMP_ADAPTER *pAd); -VOID ba_reodering_resource_dump(RTMP_ADAPTER *pAd, UCHAR wcid); -VOID ba_rec_session_tear_down(RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR TID, - BOOLEAN bPassive); -#endif /* DOT11_N_SUPPORT */ - -BOOLEAN ba_reordering_resource_init(RTMP_ADAPTER *pAd, int num); -void ba_reordering_resource_release(RTMP_ADAPTER *pAd); -struct reordering_mpdu *ba_reordering_mpdu_probe(struct reordering_list *list); - -INT ComputeChecksum(IN UINT PIN); - -UINT GenerateWpsPinCode(IN RTMP_ADAPTER *pAd, IN BOOLEAN bFromApcli, - IN UCHAR apidx); - -#ifdef WSC_INCLUDED -INT Set_WscGenPinCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef BB_SOC -INT Set_WscResetPinCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -INT Set_WscVendorPinCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef WSC_AP_SUPPORT -VOID RTMPIoctlSetWSCOOB(IN RTMP_ADAPTER *pAd); -#endif - -/* */ -/* prototype in wsc.c */ -/* */ -BOOLEAN WscMsgTypeSubst(IN UCHAR EAPType, IN UCHAR EAPCode, OUT INT *MsgType); - -VOID WscStateMachineInit(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID WscEAPOLStartAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID WscEAPAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID WscEapEnrolleeAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem, - IN UCHAR MsgType, IN MAC_TABLE_ENTRY *pEntry, - IN PWSC_CTRL pWscControl); - -#ifdef CONFIG_AP_SUPPORT -VOID WscEapApProxyAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem, - IN UCHAR MsgType, IN MAC_TABLE_ENTRY *pEntry, - IN PWSC_CTRL pWscControl); -#endif /* CONFIG_AP_SUPPORT */ - -VOID WscEapRegistrarAction(IN RTMP_ADAPTER *pAd, IN MLME_QUEUE_ELEM *Elem, - IN UCHAR MsgType, IN MAC_TABLE_ENTRY *pEntry, - IN PWSC_CTRL pWscControl); - -VOID WscEAPOLTimeOutAction(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID Wsc2MinsTimeOutAction(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -UCHAR WscRxMsgType(IN RTMP_ADAPTER *pAd, IN PMLME_QUEUE_ELEM pElem); - -VOID WscInitRegistrarPair(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN UCHAR apidx); - -VOID WscSendEapReqId(IN RTMP_ADAPTER *pAd, IN PMAC_TABLE_ENTRY pEntry, - IN UCHAR CurOpMode); - -VOID WscSendEapolStart(IN RTMP_ADAPTER *pAd, IN PUCHAR pBssid, - IN UCHAR CurOpMode, IN VOID *wdev_obj); - -VOID WscSendEapRspId(IN RTMP_ADAPTER *pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PWSC_CTRL pWscControl); - -VOID WscMacHeaderInit(IN RTMP_ADAPTER *pAd, IN OUT PHEADER_802_11 Hdr, - IN PUCHAR pAddr1, IN PUCHAR pBSSID, - IN BOOLEAN bFromApCli); - -VOID WscSendMessage( - IN RTMP_ADAPTER *pAd, IN UCHAR OpCode, IN PUCHAR pData, IN INT Len, - IN PWSC_CTRL pWscControl, - IN UCHAR OpMode, /* 0: AP Mode, 1: AP Client Mode, 2: STA Mode */ - IN UCHAR EapType); - -VOID WscSendEapReqAck(IN RTMP_ADAPTER *pAd, IN PMAC_TABLE_ENTRY pEntry); - -VOID WscSendEapReqDone(IN RTMP_ADAPTER *pAd, IN PMLME_QUEUE_ELEM pElem); - -VOID WscSendEapFail(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN BOOLEAN bSendDeAuth); - -VOID WscM2DTimeOutAction(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID WscUPnPMsgTimeOutAction(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); - -int WscSendUPnPConfReqMsg(IN RTMP_ADAPTER *pAd, IN UCHAR apIdx, - IN PUCHAR ssidStr, IN PUCHAR macAddr, IN INT Status, - IN UINT eventID, IN UCHAR CurOpMode); - -int WscSendUPnPMessage(IN RTMP_ADAPTER *pAd, IN UCHAR apIdx, IN USHORT msgType, - IN USHORT msgSubType, IN PUCHAR pData, IN INT dataLen, - IN UINT eventID, IN UINT toIPAddr, IN PUCHAR pMACAddr, - IN UCHAR CurOpMode); - -VOID WscUPnPErrHandle(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN UINT eventID); - -VOID WscBuildBeaconIE(IN RTMP_ADAPTER *pAd, IN UCHAR b_configured, - IN BOOLEAN b_selRegistrar, IN USHORT devPwdId, - IN USHORT selRegCfgMethods, IN UCHAR apidx, - IN UCHAR *pAuthorizedMACs, IN UCHAR AuthorizedMACsLen, - IN UCHAR CurOpMode); - -VOID WscBuildProbeRespIE(IN RTMP_ADAPTER *pAd, IN UCHAR respType, - IN UCHAR scState, IN BOOLEAN b_selRegistrar, - IN USHORT devPwdId, IN USHORT selRegCfgMethods, - IN UCHAR apidx, IN UCHAR *pAuthorizedMACs, - IN INT AuthorizedMACsLen, IN UCHAR CurOpMode); - -#ifdef CONFIG_AP_SUPPORT -VOID WscBuildAssocRespIE(IN RTMP_ADAPTER *pAd, IN UCHAR ApIdx, IN UCHAR Reason, - OUT PUCHAR pOutBuf, OUT PUCHAR pIeLen); - -VOID WscSelectedRegistrar(IN RTMP_ADAPTER *pAd, IN PUCHAR RegInfo, - IN UINT length, IN UCHAR apidx); - -VOID WscInformFromWPA(IN PMAC_TABLE_ENTRY pEntry); - -#ifdef WSC_AP_SUPPORT -#ifdef APCLI_SUPPORT -VOID WscApCliLinkDownById(IN PRTMP_ADAPTER pAd, IN UCHAR apidx); -#endif /* APCLI_SUPPORT */ -#endif /* WSC_AP_SUPPORT */ - -#endif /* CONFIG_AP_SUPPORT */ - -VOID WscBuildProbeReqIE(IN RTMP_ADAPTER *pAd, IN VOID *wdev_obj, - OUT PUCHAR pOutBuf, OUT PUCHAR pIeLen); - -VOID WscBuildAssocReqIE(IN PWSC_CTRL pWscControl, OUT PUCHAR pOutBuf, - OUT PUCHAR pIeLen); - -VOID WscProfileRetryTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID WscPBCTimeOutAction(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); -#ifdef CON_WPS -VOID WscScanDoneCheckTimeOutAction(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); -#endif /*CON_WPS*/ - -#ifdef WSC_STA_SUPPORT -VOID WscPINTimeOutAction(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); -#endif - -VOID WscScanTimeOutAction(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -INT WscGenerateUUID(RTMP_ADAPTER *pAd, UCHAR *uuidHexStr, UCHAR *uuidAscStr, - int apIdx, BOOLEAN bUseCurrentTime, BOOLEAN from_apcli); - -VOID WscStop(IN RTMP_ADAPTER *pAd, -#ifdef CONFIG_AP_SUPPORT - IN BOOLEAN bFromApcli, -#endif /* CONFIG_AP_SUPPORT */ - IN PWSC_CTRL pWscControl); - -VOID WscInit(IN RTMP_ADAPTER *pAd, IN BOOLEAN bFromApcli, IN UCHAR BssIndex); -#ifdef CON_WPS -VOID WscConWpsStop(IN PRTMP_ADAPTER pAd, IN BOOLEAN bFromApCli, - IN PWSC_CTRL pWscControl); -#endif /* CON_WPS */ - -BOOLEAN ValidateChecksum(UINT PIN); - -UINT WscRandomGen4digitPinCode(RTMP_ADAPTER *pAd); - -UINT WscRandomGeneratePinCode(IN RTMP_ADAPTER *pAd, IN UCHAR apidx); - -int BuildMessageM1(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageM2(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageM2D(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageM3(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageM4(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageM5(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageM6(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageM7(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageM8(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageDONE(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageACK(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int BuildMessageNACK(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - OUT VOID *pbuf); - -int ProcessMessageM1(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN VOID *precv, IN INT Length, OUT PWSC_REG_DATA pReg); - -int ProcessMessageM2(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN VOID *precv, IN INT Length, IN UCHAR apidx, - OUT PWSC_REG_DATA pReg); - -int ProcessMessageM2D(IN RTMP_ADAPTER *pAd, IN VOID *precv, IN INT Length, - OUT PWSC_REG_DATA pReg); - -int ProcessMessageM3(IN RTMP_ADAPTER *pAd, IN VOID *precv, IN INT Length, - OUT PWSC_REG_DATA pReg); - -int ProcessMessageM4(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN VOID *precv, IN INT Length, OUT PWSC_REG_DATA pReg); - -int ProcessMessageM5(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN VOID *precv, IN INT Length, OUT PWSC_REG_DATA pReg); - -int ProcessMessageM6(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN VOID *precv, IN INT Length, OUT PWSC_REG_DATA pReg); - -int ProcessMessageM7(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN VOID *precv, IN INT Length, OUT PWSC_REG_DATA pReg); - -int ProcessMessageM8(IN RTMP_ADAPTER *pAd, IN VOID *precv, IN INT Length, - IN PWSC_CTRL pWscControl); - -USHORT WscGetAuthType(IN UINT32 authType); - -USHORT WscGetEncryType(IN UINT32 encryType); - -NDIS_STATUS WscThreadInit(RTMP_ADAPTER *pAd); - -BOOLEAN WscThreadExit(RTMP_ADAPTER *pAd); - -int AppendWSCTLV(IN USHORT index, OUT UCHAR *obuf, IN UCHAR *ibuf, - IN USHORT varlen); - -VOID WscGetRegDataPIN(IN RTMP_ADAPTER *pAd, IN UINT PinCode, - IN PWSC_CTRL pWscControl); - -VOID WscPushPBCAction(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl); - -#ifdef WSC_STA_SUPPORT -VOID WscPINAction(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl); - -BOOLEAN WscPINExec(IN RTMP_ADAPTER *pAd, IN BOOLEAN bFromM2, - IN PWSC_CTRL pWscControl); - -VOID WscPINBssTableSort(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl); -#endif - -VOID WscScanExec(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl); - -BOOLEAN WscPBCExec(IN RTMP_ADAPTER *pAd, IN BOOLEAN bFromM2, - IN PWSC_CTRL pWscControl); - -VOID WscPBCBssTableSort(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl); - -VOID WscGenRandomKey(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - INOUT PUCHAR pKey, INOUT PUSHORT pKeyLen); - -VOID WscCreateProfileFromCfg( - IN RTMP_ADAPTER *pAd, - IN UCHAR OpMode, /* 0: AP Mode, 1: AP Client Mode, 2: STA Mode */ - IN PWSC_CTRL pWscControl, OUT PWSC_PROFILE pWscProfile); - -void WscWriteConfToPortCfg(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN PWSC_CREDENTIAL pCredential, - IN BOOLEAN bEnrollee); - -#ifdef APCLI_SUPPORT -void WscWriteConfToApCliCfg(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN PWSC_CREDENTIAL pCredential, - IN BOOLEAN bEnrollee); -#endif /* APCLI_SUPPORT */ - -VOID WpsSmProcess(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID WscPBCSessionOverlapCheck(IN RTMP_ADAPTER *pAd, IN UCHAR current_band); - -VOID WscPBC_DPID_FromSTA(IN RTMP_ADAPTER *pAd, IN PUCHAR pMacAddr, - IN UCHAR current_band); - -#ifdef CONFIG_AP_SUPPORT -INT WscGetConfWithoutTrigger(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN BOOLEAN bFromUPnP); - -BOOLEAN WscReadProfileFromUfdFile(IN RTMP_ADAPTER *pAd, IN UCHAR ApIdx, - IN RTMP_STRING *pUfdFileName); - -BOOLEAN WscWriteProfileToUfdFile(IN RTMP_ADAPTER *pAd, IN UCHAR ApIdx, - IN RTMP_STRING *pUfdFileName); -#endif /* CONFIG_AP_SUPPORT */ - -VOID WscCheckWpsIeFromWpsAP(IN RTMP_ADAPTER *pAd, IN PEID_STRUCT pEid, - OUT PUSHORT pDPIDFromAP); - -/* WSC hardware push button function 0811 */ -VOID WSC_HDR_BTN_Init(RTMP_ADAPTER *pAd); -VOID WSC_HDR_BTN_Stop(RTMP_ADAPTER *pAd); -VOID WSC_HDR_BTN_CheckHandler(RTMP_ADAPTER *pAd); -#ifdef WSC_LED_SUPPORT -BOOLEAN WscSupportWPSLEDMode(RTMP_ADAPTER *pAd); -BOOLEAN WscSupportWPSLEDMode10(RTMP_ADAPTER *pAd); - -BOOLEAN WscAPHasSecuritySetting(RTMP_ADAPTER *pAd, PWSC_CTRL pWscControl); - -VOID WscLEDTimer(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID WscSkipTurnOffLEDTimer(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); -#endif /* WSC_LED_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -VOID WscUpdatePortCfgTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); -#endif /* CONFIG_AP_SUPPORT */ - -VOID WscCheckPeerDPID(IN RTMP_ADAPTER *pAd, IN PFRAME_802_11 Fr, - IN PUCHAR eid_data, IN INT eid_len, - IN UCHAR current_band); - -VOID WscClearPeerList(PLIST_HEADER pWscEnList); - -PWSC_PEER_ENTRY WscFindPeerEntry(PLIST_HEADER pWscEnList, UCHAR *pMacAddr); -VOID WscDelListEntryByMAC(PLIST_HEADER pWscEnList, UCHAR *pMacAddr); -VOID WscInsertPeerEntryByMAC(PLIST_HEADER pWscEnList, UCHAR *pMacAddr); - -#ifdef CONFIG_AP_SUPPORT -INT WscApShowPeerList(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT WscApShowPin(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CONFIG_AP_SUPPORT */ - -VOID WscMaintainPeerList(RTMP_ADAPTER *pAd, PWSC_CTRL pWpsCtrl); - -VOID WscAssignEntryMAC(RTMP_ADAPTER *pAd, PWSC_CTRL pWpsCtrl); - -#ifdef WSC_V2_SUPPORT -#ifdef CONFIG_AP_SUPPORT -VOID WscOnOff(RTMP_ADAPTER *pAd, INT ApIdx, BOOLEAN bOff); - -VOID WscAddEntryToAclList(RTMP_ADAPTER *pAd, INT ApIdx, UCHAR *pMacAddr); -VOID WscDeleteEntryFromAclList(RTMP_ADAPTER *pAd, INT ApIdx, UCHAR *pMacAddr); - -VOID WscSetupLockTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID WscCheckPinAttackCount(RTMP_ADAPTER *pAd, PWSC_CTRL pWscControl); -#endif /* CONFIG_AP_SUPPORT */ - -BOOLEAN WscGenV2Msg(IN PWSC_CTRL pWpsCtrl, IN BOOLEAN bSelRegistrar, - IN PUCHAR pAuthorizedMACs, IN INT AuthorizedMACsLen, - OUT UCHAR **pOutBuf, OUT INT *pOutBufLen); - -BOOLEAN WscParseV2SubItem(IN UCHAR SubID, IN PUCHAR pData, IN USHORT DataLen, - OUT PUCHAR pOutBuf, OUT PUCHAR pOutBufLen); - -VOID WscSendEapFragAck(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN PMAC_TABLE_ENTRY pEntry); - -VOID WscSendEapFragData(IN RTMP_ADAPTER *pAd, IN PWSC_CTRL pWscControl, - IN PMAC_TABLE_ENTRY pEntry); -#endif /* WSC_V2_SUPPORT */ - -BOOLEAN WscGetDataFromPeerByTag(IN RTMP_ADAPTER *pAd, IN PUCHAR pIeData, - IN INT IeDataLen, IN USHORT WscTag, - OUT PUCHAR pWscBuf, OUT PUSHORT pWscBufLen); - -VOID WscUUIDInit(IN PRTMP_ADAPTER pAd, IN INT inf_idx, IN UCHAR from_apcli); - -#ifdef CONFIG_AP_SUPPORT -INT Set_AP_WscMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_AP_WscGetConf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CONFIG_AP_SUPPORT */ -#endif /* WSC_INCLUDED */ - -INT32 ShowRFInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 ShowBBPInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 show_redirect_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 ShowWifiInterruptCntProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -BOOLEAN rtstrmactohex(RTMP_STRING *s1, RTMP_STRING *s2); -BOOLEAN rtstrcasecmp(RTMP_STRING *s1, RTMP_STRING *s2); -RTMP_STRING *rtstrstruncasecmp(RTMP_STRING *s1, RTMP_STRING *s2); - -RTMP_STRING *rtstrstr(const RTMP_STRING *s1, const RTMP_STRING *s2); -RTMP_STRING *rstrtok(RTMP_STRING *s, const RTMP_STRING *ct); -int rtinet_aton(const RTMP_STRING *cp, unsigned int *addr); - -/*//////// common ioctl functions ////////*/ -INT show_driverinfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CountryRegion_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CountryRegionABand_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_WirelessMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef RT_CFG80211_SUPPORT -INT Set_DisableCfg2040Scan_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -INT Set_MBSS_WirelessMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Probe_Rsp_Times_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Channel_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef CONVERTER_MODE_SWITCH_SUPPORT -INT Set_V10ConverterMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*CONVERTER_MODE_SWITCH_SUPPORT*/ -INT rtmp_set_channel(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR Channel); -#ifdef CUSTOMER_DCC_FEATURE -INT Set_ApChannelSwitch_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif -INT Set_ShortSlot_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxPower_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MaxTxPwr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BGProtection_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxPreamble_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_RTSThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_FragThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBurst_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef RTMP_MAC_PCI -INT Set_ShowRF_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* RTMP_MAC_PCI */ - -#ifdef AGGREGATION_SUPPORT -INT Set_PktAggregate_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* AGGREGATION_SUPPORT */ - -INT Set_IEEE80211H_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef EXT_BUILD_CHANNEL_LIST -INT Set_ExtCountryCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ExtDfsType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ChannelListAdd_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ChannelListShow_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ChannelListDel_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* EXT_BUILD_CHANNEL_LIST */ - -#ifdef DBG -INT Set_Debug_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_DebugCategory_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID RTMPIoctlMAC(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif - -#ifdef RATE_PRIOR_SUPPORT -INT Set_RatePrior_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BlackListTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_LowRateRatio_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_LowRateCountPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TotalCntThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*RATE_PRIOR_SUPPORT*/ - -#ifdef RANDOM_PKT_GEN -INT Set_TxCtrl_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -VOID regular_pause_umac(RTMP_ADAPTER *pAd); -#endif - -#ifdef CSO_TEST_SUPPORT -INT Set_CsCtrl_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -#ifdef MT_MAC -INT Show_TxVinfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -#ifdef THERMAL_PROTECT_SUPPORT -INT set_thermal_protection_criteria_proc(IN RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT set_thermal_protection_admin_ctrl_duty_proc(IN RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); -#endif /* THERMAL_PROTECT_SUPPORT */ - -#ifdef TXBF_SUPPORT -INT Set_ReadITxBf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ReadETxBf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_WriteITxBf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_WriteETxBf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_StatITxBf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_StatETxBf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfTag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ITxBfTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ETxBfTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_InvTxBfTag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ITxBfCal_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ITxBfDivCal_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ITxBfLnaCal_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ETxBfEnCond_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ETxBfCodebook_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ETxBfCoefficient_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ETxBfGrouping_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ETxBfNoncompress_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ETxBfIncapable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_NoSndgCntThrd_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_NdpSndgStreams_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Trigger_Sounding_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_Stop_Sounding_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ITxBfEn_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_StaITxBfEnCond_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#if defined(MT76x2) || defined(MT7636) -INT Set_TxBfProfileTag_Help(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTagValid(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTagRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTagWrite(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileDataRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileDataWrite(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileDataWriteAll(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileDataReadAll(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTag_Valid(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTag_Matrix(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTag_SNR(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTag_TxScale(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTag_MAC(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfProfileTag_Flg(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* MT76x2 || MT7636 */ - -#ifdef MT_MAC -INT Set_TxBfProfileTag_Help(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_PfmuIdx(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_BfType(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_DBW(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_SuMu(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_InValid(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_Mem(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_Matrix(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_SNR(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_SmartAnt(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_SeIdx(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_RmsdThrd(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_McsThrd(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_TimeOut(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_DesiredBW(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_DesiredNc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTag_DesiredNr(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTagRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileTagWrite(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileDataRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfileDataWrite(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfilePnRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfProfilePnWrite(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfQdRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TxBfTxApply(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfPfmuMemAlloc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfPfmuMemRelease(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfPfmuMemAllocMapRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_StaRecCmmUpdate(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_StaRecBfUpdate(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_StaRecBfRead(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TxBfAwareCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BssInfoUpdate(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_DevInfoUpdate(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef TXBF_DYNAMIC_DISABLE -INT Set_TxBfDynamicDisable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* TXBF_DYNAMIC_DISABLE */ -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - -#ifdef VHT_TXBF_SUPPORT -INT Set_VhtNDPA_Sounding_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* VHT_TXBF_SUPPORT */ - -#ifdef MT_MAC -INT Set_Force_Vht_For_Ht(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -INT WifiFwdSet(IN int disabled); -INT Set_WifiFwd_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_WifiFwd_Down(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -INT Set_WifiFwdAccessSchedule_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_WifiFwdHijack_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_WifiFwdBpdu_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_WifiFwdRepDevice(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_WifiFwdShowEntry(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_WifiFwdDeleteEntry(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_PacketSourceShowEntry(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_PacketSourceDeleteEntry(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -INT Set_WifiFwdBridge_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -#endif /* CONFIG_WIFI_PKT_FWD */ - -INT Set_RateAdaptInterval(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Show_DescInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_MacTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef ACL_BLK_COUNT_SUPPORT -INT Show_ACLRejectCount_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*ACL_BLK_COUNT_SUPPORT*/ - -#ifdef DOT11_N_SUPPORT -INT Show_BaTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_ChannelSet_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* DOT11_N_SUPPORT */ - -#ifdef DFS_VENDOR10_CUSTOM_FEATURE -INT show_client_idle_time(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#define IS_V10_OLD_CHNL_VALID(_wdev) (_wdev->bV10OldChannelValid == TRUE) -#define SET_V10_OLD_CHNL_VALID(_wdev, valid) \ - (_wdev->bV10OldChannelValid = valid) -#endif - -#ifdef BW_VENDOR10_CUSTOM_FEATURE -#define IS_APCLI_BW_SYNC_FEATURE_ENBL(_pAd) \ - ((BOOLEAN)(_pAd->ApCfg.ApCliAutoBWRules.minorPolicy \ - .ApCliBWSyncHTSupport) || \ - (_pAd->ApCfg.ApCliAutoBWRules.minorPolicy.ApCliBWSyncVHTSupport)) - -#define IS_V10_AUTO_BAND_FEATURE_ENBL(_pAd) \ - ((BOOLEAN)(_pAd->ApCfg.ApCliAutoBWRules.majorPolicy \ - .ApCliBWSyncBandSupport) || \ - (_pAd->ApCfg.ApCliAutoBWRules.majorPolicy.ApCliBWSyncDeauthSupport)) - -typedef enum _ENUM_AUTO_BW_POLICY { - HT_2040_UP_ENBL = 0, /* HT 20 -> 40 : BIT 0*/ - HT_4020_DOWN_ENBL, /* HT 40 -> 20 : BIT 1 */ - VHT_2040_80_UP_ENBL, /* VHT 20/40 -> 80 : BIT 0 */ - VHT_2040_160_UP_ENBL, /* VHT 20/40 -> 160 : BIT 1 */ - VHT_80_160_UP_ENBL, /* VHT 80 -> 160 : BIT 2 */ - VHT_80_2040_DOWN_ENBL, /* VHT 80 -> 20/40 : BIT 3 */ - VHT_160_2040_DOWN_ENBL, /* VHT 160 -> 20/40 : BIT 4 */ - VHT_160_80_DOWN_ENBL, /* VHT 160 -> 80 : BIT 5 */ - BW_MAX_POLICY /* Reserved */ -} ENUM_AUTO_BW_POLICY; - -#define VHT_POLICY_OFFSET 2 - -#define VHT_2040_80_UP_CHK (VHT_2040_80_UP_ENBL - VHT_POLICY_OFFSET) -#define VHT_80_2040_DOWN_CHK (VHT_80_2040_DOWN_ENBL - VHT_POLICY_OFFSET) -#define VHT_2040_160_UP_CHK (VHT_2040_160_UP_ENBL - VHT_POLICY_OFFSET) -#define VHT_80_160_UP_CHK (VHT_80_160_UP_ENBL - VHT_POLICY_OFFSET) -#define VHT_80_2040_DOWN_CHK (VHT_80_2040_DOWN_ENBL - VHT_POLICY_OFFSET) -#define VHT_160_2040_DOWN_CHK (VHT_160_2040_DOWN_ENBL - VHT_POLICY_OFFSET) -#define VHT_160_80_DOWN_CHK (VHT_160_80_DOWN_ENBL - VHT_POLICY_OFFSET) - -#define SET_APCLI_AUTO_BW_HT_VALID(_pAd, valid) \ - (_pAd->ApCfg.ApCliAutoBWRules.minorPolicy.ApCliBWSyncHTSupport |= \ - (1 << valid)) - -#define SET_APCLI_AUTO_BW_VHT_VALID(_pAd, valid) \ - (_pAd->ApCfg.ApCliAutoBWRules.minorPolicy.ApCliBWSyncVHTSupport |= \ - (1 << valid)) - -typedef enum _ENUM_BAND_BW_POLICY { - SAME_BAND_SYNC = 0, /* Sync Same Band BW */ - DIFF_BAND_SYNC, /* Sync Diff Band BW */ - DEAUTH_PEERS, /* Deauth Clients */ - BAND_MAX_POLICY -} ENUM_BAND_BW_POLICY; - -#define POLICY_DISABLE 0 - -#define IS_APCLI_SYNC_BAND_VALID(_pAd, condition) \ - (1 & \ - (_pAd->ApCfg.ApCliAutoBWRules.majorPolicy.ApCliBWSyncBandSupport >> \ - condition)) -#define SET_APCLI_SYNC_BAND_VALID(_pAd, valid) \ - (_pAd->ApCfg.ApCliAutoBWRules.majorPolicy.ApCliBWSyncBandSupport |= \ - (1 << valid)) -#define SET_APCLI_SYNC_BAND_FEATURE_DISABLE(_pAd, valid) \ - (_pAd->ApCfg.ApCliAutoBWRules.majorPolicy.ApCliBWSyncBandSupport = \ - valid) - -#define IS_APCLI_SYNC_PEER_DEAUTH_VALID(_pAd) \ - (_pAd->ApCfg.ApCliAutoBWRules.majorPolicy.ApCliBWSyncDeauthSupport) -#define SET_APCLI_SYNC_PEER_DEAUTH_VALID(_pAd, valid) \ - (_pAd->ApCfg.ApCliAutoBWRules.majorPolicy.ApCliBWSyncDeauthSupport = \ - valid) - -#define IS_APCLI_SYNC_PEER_DEAUTH_ENBL(_pAd) (_pAd->ApCfg.AutoBWDeauthEnbl) -#define SET_APCLI_SYNC_PEER_DEAUTH_ENBL(_pAd, valid) \ - (_pAd->ApCfg.AutoBWDeauthEnbl = valid) -#endif - -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE -INT show_current_rssi(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -#ifdef MT_MAC -INT Show_PSTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_wtbl_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_wtbltlv_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_mib_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_amsdu_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 show_wifi_sys(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef DBDC_MODE -INT32 ShowDbdcProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -INT32 ShowChCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef GREENAP_SUPPORT -INT32 ShowGreenAPProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* GREENAP_SUPPORT */ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -INT32 show_pcie_aspm_dym_ctrl_cap_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -INT32 show_tx_burst_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 ShowTmacInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 ShowAggInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowManualTxOP(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_dmasch_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 ShowPseInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 ShowPseData(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT ShowPLEInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_TXD_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowTXDInfo(RTMP_ADAPTER *pAd, UINT fid); -INT show_mem_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_protect_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_cca_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef CUT_THROUGH -INT ShowCutThroughInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CUT_THROUGH */ - -#endif /* MT_MAC */ -INT Show_sta_tr_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_stainfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_devinfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_sysinfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_trinfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_tpinfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_txqinfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_swqinfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_efuseinfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#if defined(MT_MAC) && (!defined(MT7636)) && defined(TXBF_SUPPORT) -INT Show_AteIbfPhaseCalStatus(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -INT Set_ResetStatCounter_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT SetCommonHtVht(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -INT Set_AP_SlotTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef DOT11_N_SUPPORT -INT Set_BASetup_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BADecline_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BAOriTearDown_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BARecTearDown_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtBw_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtMcs_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtGi_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtOpMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtLdpc_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtStbc_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtExtcha_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_extcha_for_wdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR value); -INT Set_HtMpduDensity_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtBaWinSize_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtRdg_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtLinkAdapt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtAmsdu_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtAutoBa_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtProtect_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtMimoPs_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef DOT11N_DRAFT3 -INT Set_HT_BssCoex_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HT_BssCoexApCntThr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* DOT11N_DRAFT3 */ - -#ifdef CONFIG_AP_SUPPORT -INT Set_HtTxStream_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtRxStream_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef DOT11_N_SUPPORT -#ifdef GREENAP_SUPPORT -INT Set_GreenAP_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* GREENAP_SUPPORT */ -#endif /* DOT11_N_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -INT set_pcie_aspm_dym_ctrl_cap_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -INT SetCommonHT(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -INT Set_ForceShortGI_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ForceGF_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_SendSMPSAction_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -void convert_reordering_packet_to_preAMSDU_or_802_3_packet(IN RTMP_ADAPTER *pAd, - IN RX_BLK *pRxBlk, - IN UCHAR wdev_idx); - -INT Set_HtMIMOPSmode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtTxBASize_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_HtDisallowTKIP_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BurstMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* DOT11_N_SUPPORT */ - -#ifdef DOT11_VHT_AC -INT Set_VhtBw_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_VhtLdpc_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_VhtStbc_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_VhtBwSignal_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_VhtDisallowNonVHT_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* DOT11_VHT_AC */ - -#ifdef VENDOR10_CUSTOM_RSSI_FEATURE -INT Set_RSSI_Enbl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif - -#ifdef APCLI_SUPPORT -INT RTMPIoctlConnStatus(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*APCLI_SUPPORT*/ - -#ifdef MEM_ALLOC_INFO_SUPPORT -INT Show_MemInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_PktInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - -RTMP_STRING *GetAuthModeStr(IN UINT32 authMode); - -RTMP_STRING *GetEncryModeStr(IN UINT32 encryMode); - -UINT32 SecAuthModeOldToNew(IN USHORT authMode); - -UINT32 SecEncryModeOldToNew(IN USHORT encryMode); - -USHORT SecAuthModeNewToOld(IN UINT32 authMode); - -USHORT SecEncryModeNewToOld(IN UINT32 encryMode); - -VOID detect_wmm_traffic(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR up, - UCHAR bOutput); -#ifdef CONFIG_AP_SUPPORT -VOID dynamic_tune_be_tx_op(RTMP_ADAPTER *pAd, ULONG nonBEpackets); -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef DOT11_N_SUPPORT -VOID Handle_BSS_Width_Trigger_Events(RTMP_ADAPTER *pAd, UCHAR Channel); - -#if defined(A_BAND_SUPPORT) && defined(CONFIG_AP_SUPPORT) -void build_ext_channel_switch_ie(IN RTMP_ADAPTER *pAd, - IN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE, - IN UCHAR Channel, IN UCHAR PhyMode, - IN struct wifi_dev *wdev); -#endif /*defined (A_BAND_SUPPORT) && defined (CONFIG_AP_SUPPORT)*/ - -void assoc_ht_info_debugshow(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN UCHAR ht_cap_len, - IN HT_CAPABILITY_IE *pHTCapability); -#endif /* DOT11_N_SUPPORT */ - -INT header_packet_process(RTMP_ADAPTER *pAd, PNDIS_PACKET pRxPacket, - RX_BLK *pRxBlk); - -NDIS_STATUS rx_packet_process(RTMP_ADAPTER *pAd, PNDIS_PACKET pRxPacket, - RX_BLK *pRxBlk); - -VOID ap_ieee802_3_data_rx(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); -VOID sta_ieee802_3_data_rx(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); - -BOOLEAN rtmp_rx_done_handle(RTMP_ADAPTER *pAd); -BOOLEAN mtd_rx_done_handle(RTMP_ADAPTER *pAd); - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -#ifdef CONFIG_ANDES_SUPPORT -BOOLEAN RxRing1DoneInterruptHandle(RTMP_ADAPTER *pAd); -VOID RTMPHandleTxRing8DmaDoneInterrupt(RTMP_ADAPTER *pAd); -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -BOOLEAN RTMPHandleFwDwloCmdRingDmaDoneInterrupt(RTMP_ADAPTER *pAd); -#endif /* defined(MT7615) || defined(MT7622) */ -#endif /* CONFIG_ANDES_SUPPORT */ - -#ifdef MT_MAC -VOID RTMPHandleBcnDmaDoneInterrupt(RTMP_ADAPTER *pAd); -#endif /* MT_MAC */ -#endif /* RTMP_PCI_SUPPORT */ - -VOID indicate_rx_pkt(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR wdev_idx); -VOID indicate_ampdu_pkt(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR wdev_idx); -VOID indicate_amsdu_pkt(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR wdev_idx); -VOID ba_reorder(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR wdev_idx); -VOID ba_reorder_buf_maintain(RTMP_ADAPTER *pAd); - -VOID indicate_802_3_pkt(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR wdev_idx); -VOID indicate_802_11_pkt(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR wdev_idx); -VOID indicate_eapol_pkt(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR wdev_idx); - -UINT deaggregate_amsdu_announce(IN RTMP_ADAPTER *pAd, PNDIS_PACKET pPacket, - IN PUCHAR pData, IN ULONG DataSize, - IN UCHAR OpMode); - -#ifdef TXBF_SUPPORT -BOOLEAN clientSupportsETxBF(RTMP_ADAPTER *pAd, HT_BF_CAP *pTxBFCap); -void setETxBFCap(RTMP_ADAPTER *pAd, HT_BF_CAP *pTxBFCap); -#ifdef VHT_TXBF_SUPPORT -BOOLEAN clientSupportsVHTETxBF(RTMP_ADAPTER *pAd, VHT_CAP_INFO *pTxBFCapInfo); -void setVHTETxBFCap(RTMP_ADAPTER *pAd, VHT_CAP_INFO *pTxBFCap); -#endif /* VHT_TXBF_SUPPORT */ - -#ifdef ETXBF_EN_COND3_SUPPORT -VOID txSndgSameMcs(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEnt, UCHAR smoothMfb); -VOID txSndgOtherGroup(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -VOID txMrqInvTxBF(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -VOID chooseBestMethod(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, UCHAR mfb); -VOID rxBestSndg(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -#endif /* ETXBF_EN_COND3_SUPPORT */ - -VOID handleBfFb(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); -VOID TxBFInit(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, BOOLEAN supETxBF); - -#ifndef MT_MAC -VOID eTxBFProbing(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -#endif - -/* #ifndef MT_MAC */ -/* VOID Trigger_Sounding_Packet( */ -/* IN RTMP_ADAPTER *pAd, */ -/* IN UCHAR SndgType, */ -/* IN UCHAR SndgBW, */ -/* IN UCHAR SndgMcs, */ -/* IN MAC_TABLE_ENTRY *pEntry); */ -/* #endif */ - -#ifndef MT_MAC -VOID rtmp_asic_set_bf(RTMP_ADAPTER *pAd); -#endif - -BOOLEAN rtmp_chk_itxbf_calibration(RTMP_ADAPTER *pAd); - -#endif /* TXBF_SUPPORT */ - -/* remove LLC and get 802_3 Header */ -#define RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3) \ - { \ - PUCHAR _pRemovedLLCSNAP = NULL, _pDA, _pSA; \ - \ - if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_WDS) || \ - RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH)) { \ - _pDA = _pRxBlk->Addr3; \ - _pSA = _pRxBlk->Addr4; \ - } else if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_AP)) { \ - _pDA = _pRxBlk->Addr1; \ - if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_DLS)) \ - _pSA = _pRxBlk->Addr2; \ - else \ - _pSA = _pRxBlk->Addr3; \ - } else if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_STA)) { \ - _pDA = _pRxBlk->Addr3; \ - _pSA = _pRxBlk->Addr2; \ - } else if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_ADHOC)) { \ - _pDA = _pRxBlk->Addr1; \ - _pSA = _pRxBlk->Addr2; \ - } else { \ - /* TODO: shiang-usw, where shall we go here?? */ \ - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("%s():Un-assigned Peer's Role!\n", \ - __func__)); \ - _pDA = _pRxBlk->Addr3; \ - _pSA = _pRxBlk->Addr2; \ - } \ - \ - CONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk->pData, \ - _pRxBlk->DataSize, _pRemovedLLCSNAP); \ - } - -VOID announce_or_forward_802_3_pkt(RTMP_ADAPTER *pAd, PNDIS_PACKET pPacket, - struct wifi_dev *wdev, UCHAR op_mode); - -VOID indicate_agg_ralink_pkt(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN RX_BLK *pRxBlk, IN UCHAR wdev_idx); - -#ifdef CUSTOMER_DCC_FEATURE -VOID Update_Snr_Sample(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct rx_signal_info *signal); -#endif - -VOID Update_Rssi_Sample(IN RTMP_ADAPTER *pAd, IN RSSI_SAMPLE *pRssi, - IN struct rx_signal_info *signal, IN UCHAR phymode, - IN UCHAR bw); - -UINT32 mtd_pci_get_resource_idx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - enum PACKET_TYPE, UCHAR q_idx); - -PNDIS_PACKET mtd_pci_get_pkt_from_rx_resource(RTMP_ADAPTER *pAd, - BOOLEAN *pbReschedule, - UINT32 *pRxPending, - UCHAR RxRingNo); - -PNDIS_PACKET mtd_pci_get_pkt_from_rx_resource_io(RTMP_ADAPTER *pAd, - BOOLEAN *pbReschedule, - UINT32 *pRxPending, - UCHAR RxRingNo); - -PNDIS_PACKET pci_get_pkt_from_rx_resource(RTMP_ADAPTER *pAd, - BOOLEAN *pbReschedule, - UINT32 *pRxPending, UCHAR RxRingNo); - -PNDIS_PACKET usb_get_pkt_from_rx_resource(RTMP_ADAPTER *pAd, - BOOLEAN *pbReschedule, - UINT32 *pRxPending, UCHAR RxRingNo); - -PNDIS_PACKET sdio_get_pkt_from_rx_resource(RTMP_ADAPTER *pAd, - BOOLEAN *pbReschedule, - UINT32 *pRxPending, UCHAR RxRingNo); - -UCHAR *mt_pci_get_hif_buf(RTMP_ADAPTER *pAd, struct _TX_BLK *tx_blk, - UCHAR hif_idx, UCHAR frame_type); - -VOID de_fragment_data_pkt(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); - -#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) -VOID RTMPIoctlGetSiteSurvey(IN RTMP_ADAPTER *pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif - -#ifdef CUSTOMER_RSG_FEATURE -VOID RTMPIoctlGetRadioStatsCount(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif - -#ifdef CONFIG_AP_SUPPORT -#ifdef CUSTOMER_DCC_FEATURE -UINT32 GetNumberofSpatialStreams(IN HT_CAPABILITY_IE htCapabilityIE); - -VOID RTMPIoctlGetStreamType(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetApTable(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID RTMPIoctlGetApScanResults(IN PRTMP_ADAPTER pAdapter, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -#endif - -#ifdef APCLI_SUPPORT -INT Set_ApCli_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_apcli_enable_proc2(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ApCli_Ssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef APCLI_CFG80211_SUPPORT -INT Set_ApCli_EncrypType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ApCli_AuthMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* APCLI_CFG80211_SUPPORT */ -#ifdef ROAMING_ENHANCE_SUPPORT -BOOLEAN IsApCliLinkUp(IN PRTMP_ADAPTER pAd); -BOOLEAN ApCliDoRoamingRefresh(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PNDIS_PACKET pRxPacket, - IN struct wifi_dev *wdev); -#endif /* ROAMING_ENHANCE_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef MAT_SUPPORT - -VOID getIPv6MacTbInfo(MAT_STRUCT *, char *, ULONG); -VOID getIPMacTbInfo(MAT_STRUCT *pMatCfg, char *pOutBuf, ULONG BufLen); - -NDIS_STATUS MATEngineInit(RTMP_ADAPTER *pAd); -NDIS_STATUS MATEngineExit(RTMP_ADAPTER *pAd); - -PUCHAR MATEngineRxHandle(RTMP_ADAPTER *pAd, PNDIS_PACKET pPkt, UINT infIdx); -PUCHAR MATEngineTxHandle(RTMP_ADAPTER *pAd, PNDIS_PACKET pPkt, UINT infIdx, - UCHAR OpMode); - -BOOLEAN MATPktRxNeedConvert(RTMP_ADAPTER *pAd, PNET_DEV net_dev); - -#endif /* MAT_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -typedef struct CountryCodeToCountryRegion { - USHORT CountryNum; - UCHAR IsoName[3]; - /*UCHAR CountryName[40]; */ - RTMP_STRING *pCountryName; - BOOLEAN SupportABand; - /*ULONG RegDomainNum11A; */ - UCHAR RegDomainNum11A; - BOOLEAN SupportGBand; - /*ULONG RegDomainNum11G; */ - UCHAR RegDomainNum11G; -} COUNTRY_CODE_TO_COUNTRY_REGION; -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef SNMP_SUPPORT -/*for snmp */ -typedef struct _DefaultKeyIdxValue { - UCHAR KeyIdx; - UCHAR Value[16]; -} DefaultKeyIdxValue, *PDefaultKeyIdxValue; -#endif - -void STA_MonPktSend(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR DevIdx); - -INT Set_FixedTxMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef CONFIG_APSTA_MIXED_SUPPORT -INT Set_OpMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* CONFIG_APSTA_MIXED_SUPPORT */ - -INT Set_LongRetryLimit_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_ShortRetryLimit_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_AutoFallBack_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -VOID RT28XXDMADisable(RTMP_ADAPTER *pAd); -VOID RT28XXDMAEnable(RTMP_ADAPTER *pAd); -VOID RT28XXDMAReset(RTMP_ADAPTER *pAd); - -#ifdef RTMP_MAC_PCI -VOID PDMAWatchDog(RTMP_ADAPTER *pAd); -VOID PDMAResetAndRecovery(RTMP_ADAPTER *pAd); -#endif - -#ifdef MT_MAC -VOID DumpPseInfo(RTMP_ADAPTER *pAd); -VOID PSEWatchDog(RTMP_ADAPTER *pAd); -VOID PSEResetAndRecovery(RTMP_ADAPTER *pAd); -#endif - -VOID MtUpdateBeaconToAsic(IN RTMP_ADAPTER *pAd, VOID *wdev_void, - IN UINT16 FrameLen, IN UCHAR UpdatePktType); - -void CfgInitHook(RTMP_ADAPTER *pAd); - -NDIS_STATUS RtmpMgmtTaskInit(RTMP_ADAPTER *pAd); -VOID mtd_net_tasklet_exit(RTMP_ADAPTER *pAd); -VOID RtmpMgmtTaskExit(RTMP_ADAPTER *pAd); - -void tbtt_tasklet(unsigned long data); - -#ifdef MT_MAC -void mt_mac_int_0_tasklet(unsigned long data); -void mt_mac_int_1_tasklet(unsigned long data); -void mt_mac_int_2_tasklet(unsigned long data); -void mt_mac_int_3_tasklet(unsigned long data); -void mt_mac_int_4_tasklet(unsigned long data); -#endif /* MT_MAC */ - -#ifdef RTMP_MAC_PCI -BOOLEAN RT28xxPciAsicRadioOff(IN RTMP_ADAPTER *pAd, IN UCHAR Level, - IN USHORT TbttNumToNextWakeUp); - -BOOLEAN RT28xxPciAsicRadioOn(RTMP_ADAPTER *pAd, UCHAR Level); -VOID RTMPInitPCIeDevice(RT_CMD_PCIE_INIT *pConfig, VOID *pAd); - -VOID PciMlmeRadioOn(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID PciMlmeRadioOFF(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -ra_dma_addr_t RtmpDrvPciMapSingle(IN RTMP_ADAPTER *pAd, IN VOID *ptr, - IN size_t size, IN INT sd_idx, - IN INT direction); - -VOID pci_io_write32(RTMP_ADAPTER *ad, UINT32 addr, UINT32 value); -VOID pci_io_read32(RTMP_ADAPTER *ad, UINT32 addr, UINT32 *value); - -#endif /* RTMP_MAC_PCI */ - -INT irq_init(RTMP_ADAPTER *pAd); - -#ifdef NEW_WOW_SUPPORT -VOID RT28xxAndesWOWEnable(RTMP_ADAPTER *pAd); -VOID RT28xxAndesWOWDisable(RTMP_ADAPTER *pAd); -#endif /* NEW_WOW_SUPPORT */ - -#ifdef MT_WOW_SUPPORT -VOID MT76xxAndesWOWEnable(RTMP_ADAPTER *pAd, PSTA_ADMIN_CONFIG pStaCfg); -VOID MT76xxAndesWOWDisable(RTMP_ADAPTER *pAd, PSTA_ADMIN_CONFIG pStaCfg); -VOID MT76xxAndesWOWInit(RTMP_ADAPTER *pAd); -#endif - -#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) -VOID RT28xxAsicWOWEnable(RTMP_ADAPTER *pAd, PSTA_ADMIN_CONFIG pStaCfg); -VOID RT28xxAsicWOWDisable(RTMP_ADAPTER *pAd); -#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */ - -/*////////////////////////////////////*/ - -/*///////////////////////////////////*/ -INT RTMPShowCfgValue(RTMP_ADAPTER *pAd, RTMP_STRING *name, RTMP_STRING *buf, - UINT32 MaxLen); -/*//////////////////////////////////*/ - -#ifdef TXBF_SUPPORT -VOID handleHtcField(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); -#endif /* TXBF_SUPPORT */ - -#ifdef MFB_SUPPORT -VOID MFB_PerPareMRQ(RTMP_ADAPTER *pAd, VOID *pBuf, MAC_TABLE_ENTRY *pEntry); -VOID MFB_PerPareMFB(RTMP_ADAPTER *pAd, VOID *pBuf, MAC_TABLE_ENTRY *pEntry); -#endif /* MFB_SUPPORT */ - -UINT VIRTUAL_IF_INC(RTMP_ADAPTER *pAd); -UINT VIRTUAL_IF_DEC(RTMP_ADAPTER *pAd); -UINT VIRTUAL_IF_NUM(RTMP_ADAPTER *pAd); - -#ifdef SOFT_ENCRYPT -BOOLEAN RTMPExpandPacketForSwEncrypt(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk); -VOID RTMPUpdateSwCacheCipherInfo(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk, - UCHAR *pHdr); -INT tx_sw_encrypt(RTMP_ADAPTER *pAd, TX_BLK *pTxBlk, UCHAR *buf_ptr, - HEADER_802_11 *wifi_hdr); -#endif /* SOFT_ENCRYPT */ - -/* - OS Related funciton prototype definitions. - TODO: Maybe we need to move these function prototypes to other proper place. -*/ -VOID RTInitializeCmdQ(PCmdQ cmdq); - -INT RTPCICmdThread(ULONG Context); - -VOID CMDHandler(RTMP_ADAPTER *pAd); - -VOID RTThreadDequeueCmd(PCmdQ cmdq, PCmdQElmt *pcmdqelmt); - -NDIS_STATUS RTEnqueueInternalCmd(IN RTMP_ADAPTER *pAd, IN NDIS_OID Oid, - IN PVOID pInformationBuffer, - IN UINT32 InformationBufferLength); - -void RtmpCmdQExit(RTMP_ADAPTER *pAd); -void RtmpCmdQInit(RTMP_ADAPTER *pAd); - -#ifdef HOSTAPD_SUPPORT -VOID ieee80211_notify_michael_failure(IN RTMP_ADAPTER *pAd, - IN PHEADER_802_11 pHeader, IN UINT keyix, - IN INT report); - -const CHAR *ether_sprintf(const UINT8 *mac); -#endif /*HOSTAPD_SUPPORT*/ - -#ifdef VENDOR_FEATURE3_SUPPORT -VOID RTMP_IO_WRITE32(RTMP_ADAPTER *pAd, UINT32 Offset, UINT32 Value); -#endif /* VENDOR_FEATURE3_SUPPORT */ - -BOOLEAN CHAN_PropertyCheck(RTMP_ADAPTER *pAd, UINT32 ChanNum, UCHAR Property); - -INT32 getLegacyOFDMMCSIndex(UINT8 MCS); -void getRate(HTTRANSMIT_SETTING HTSetting, ULONG *fLastTxRxRate); - -#ifdef APCLI_SUPPORT - -VOID ApCliRTMPSendNullFrame(IN RTMP_ADAPTER *pAd, IN UCHAR TxRate, - IN BOOLEAN bQosNull, IN MAC_TABLE_ENTRY *pMacEntry, - IN USHORT PwrMgmt); - -#endif /*APCLI_SUPPORT*/ - -void RTMP_IndicateMediaState(IN RTMP_ADAPTER *pAd, - IN NDIS_MEDIA_STATE media_state); - -INT RTMPSetInformation(IN RTMP_ADAPTER *pAd, IN OUT RTMP_IOCTL_INPUT_STRUCT *rq, - IN INT cmd, IN struct wifi_dev *wdev); - -INT RTMPQueryInformation(IN RTMP_ADAPTER *pAd, - INOUT RTMP_IOCTL_INPUT_STRUCT *rq, IN INT cmd, - IN struct wifi_dev *wdev); - -VOID RTMPIoctlShow(IN RTMP_ADAPTER *pAd, IN RTMP_IOCTL_INPUT_STRUCT *rq, - IN UINT32 subcmd, IN VOID *pData, IN ULONG Data); - -INT RTMP_COM_IoctlHandle(IN VOID *pAdSrc, IN RTMP_IOCTL_INPUT_STRUCT *wrq, - IN INT cmd, IN USHORT subcmd, IN VOID *pData, - IN ULONG Data); - -#ifdef CONFIG_AP_SUPPORT -INT RTMP_AP_IoctlPrepare(RTMP_ADAPTER *pAd, VOID *pCB); -#endif /* CONFIG_AP_SUPPORT */ -#ifdef SNIFFER_SUPPORT -INT Set_MonitorMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorFilterSize_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorFrameType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorMacFilter_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_MonitorMacFilterOff_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* SNIFFER_SUPPORT */ - -INT Set_VcoPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_RateAlg_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -NDIS_STATUS RtmpEnqueueTokenFrame(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr, - IN UCHAR TxRate, IN UCHAR AID, IN UCHAR apidx, - IN UCHAR OldUP); - -VOID RtmpEnqueueNullFrame(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr, - IN UCHAR TxRate, IN UCHAR AID, IN UCHAR apidx, - IN BOOLEAN bQosNull, IN BOOLEAN bEOSP, - IN UCHAR OldUP); - -VOID RtmpCleanupPsQueue(IN RTMP_ADAPTER *pAd, IN PQUEUE_HEADER pQueue); - -NDIS_STATUS RtmpInsertPsQueue(IN RTMP_ADAPTER *pAd, IN PNDIS_PACKET pPacket, - IN MAC_TABLE_ENTRY *pMacEntry, IN UCHAR QueIdx); - -VOID RtmpHandleRxPsPoll(RTMP_ADAPTER *pAd, UCHAR *pAddr, USHORT Aid, - BOOLEAN isActive); -BOOLEAN RtmpPsIndicate(RTMP_ADAPTER *pAd, UCHAR *pAddr, UCHAR wcid, UCHAR Psm); - -#ifdef MT_MAC -VOID MtHandleRxPsPoll(RTMP_ADAPTER *pAd, UCHAR *pAddr, USHORT wcid, - BOOLEAN isActive); -BOOLEAN MtPsIndicate(RTMP_ADAPTER *pAd, UCHAR *pAddr, UCHAR wcid, UCHAR Psm); -VOID MtPsRedirectDisableCheck(RTMP_ADAPTER *pAd, UCHAR wcid); -VOID MtPsSendToken(RTMP_ADAPTER *pAd, UINT32 WlanIdx); -VOID MtPsRecovery(RTMP_ADAPTER *pAd); -VOID MtSetIgnorePsm(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, UCHAR value); -VOID MtEnqTxSwqFromPsQueue(RTMP_ADAPTER *pAd, UCHAR qidx, - STA_TR_ENTRY *tr_entry); -VOID CheckSkipTX(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -#endif /* MT_MAC */ - -#ifdef CONFIG_MULTI_CHANNEL -VOID RtmpEnqueueLastNullFrame(IN RTMP_ADAPTER *pAd, IN PUCHAR pAddr, - IN UCHAR TxRate, IN UCHAR PID, IN UCHAR apidx, - IN BOOLEAN bQosNull, IN BOOLEAN bEOSP, - IN UCHAR OldUP, IN UCHAR PwrMgmt, - IN UCHAR OpMode); - -VOID EnableMACTxPacket(IN RTMP_ADAPTER *pAd, IN PMAC_TABLE_ENTRY pEntry, - IN UCHAR PwrMgmt, IN BOOLEAN bTxNullFramei, - IN UCHAR QSel); - -VOID DisableMACTxPacket(IN RTMP_ADAPTER *pAd, IN PMAC_TABLE_ENTRY pEntry, - IN UCHAR PwrMgmt, IN BOOLEAN bWaitACK, IN UCHAR QSel); - -VOID InitMultiChannelRelatedValue(IN RTMP_ADAPTER *pAd, IN UCHAR Channel, - IN UCHAR CentralChannel); - -VOID EDCA_ActionTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID HCCA_ActionTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -NDIS_STATUS MultiChannelThreadInit(RTMP_ADAPTER *pAd); -BOOLEAN MultiChannelThreadExit(RTMP_ADAPTER *pAd); -VOID MultiChannelTimerStop(RTMP_ADAPTER *pAd); -VOID MultiChannelTimerStart(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -#endif /* CONFIG_MULTI_CHANNEL */ - -VOID dev_rx_802_11_data_frm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); -VOID dev_rx_mgmt_frm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); -VOID dev_rx_ctrl_frm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); - -#ifdef DOT11_N_SUPPORT -void DisplayTxAgg(RTMP_ADAPTER *pAd); -#endif /* DOT11_N_SUPPORT */ - -VOID set_default_ap_edca_param(EDCA_PARM *pEdca); -VOID set_default_sta_edca_param(EDCA_PARM *pEdca); - -UCHAR dot11_2_ra_rate(UCHAR MaxSupportedRateIn500Kbps); -UCHAR dot11_max_sup_rate(INT SupRateLen, UCHAR *SupRate, INT ExtRateLen, - UCHAR *ExtRate); - -VOID TRTableResetEntry(RTMP_ADAPTER *pAd, UCHAR tr_tb_idx); -VOID TRTableInsertEntry(RTMP_ADAPTER *pAd, UCHAR tr_tb_idx, - MAC_TABLE_ENTRY *pEntry); -VOID TRTableInsertMcastEntry(RTMP_ADAPTER *pAd, UCHAR tr_tb_idx, - struct wifi_dev *wdev); -VOID TRTableEntryDump(RTMP_ADAPTER *pAd, INT tr_idx, const RTMP_STRING *caller, - INT line); -VOID MgmtTableSetMcastEntry(RTMP_ADAPTER *pAd, UCHAR wcid); -VOID DataTableSetMcastEntry(RTMP_ADAPTER *pAd, UCHAR wcid); -VOID MacTableSetEntryPhyCfg(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry); -VOID MacTableReset(RTMP_ADAPTER *pAd); -VOID MacTableResetWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -MAC_TABLE_ENTRY *MacTableLookup(RTMP_ADAPTER *pAd, UCHAR *pAddr); -MAC_TABLE_ENTRY *MacTableLookup2(RTMP_ADAPTER *pAd, UCHAR *pAddr, - struct wifi_dev *wdev); -BOOLEAN MacTableDeleteEntry(RTMP_ADAPTER *pAd, USHORT wcid, UCHAR *pAddr); -MAC_TABLE_ENTRY *MacTableInsertEntry(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr, - IN struct wifi_dev *wdev, - IN UINT32 ent_type, IN UCHAR OpMode, - IN BOOLEAN CleanAll); - -VOID dump_rxblk(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); - -#ifdef RTMP_MAC_PCI -VOID dump_rxd(RTMP_ADAPTER *pAd, RXD_STRUC *pRxD); -#endif /* RTMP_MAC_PCI */ - -INT set_no_bcn(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#if defined(WFA_VHT_PF) || defined(MT7603_FPGA) || defined(MT7628_FPGA) || \ - defined(MT7636_FPGA) || defined(MT7637_FPGA) -INT set_force_amsdu(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* defined(WFA_VHT_PF) || defined(MT7603_FPGA) */ - -#ifdef WFA_VHT_PF -/* for SIGMA */ -INT set_vht_nss_mcs_cap(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_vht_nss_mcs_opt(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_vht_opmode_notify_ie(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT set_force_operating_mode(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_force_noack(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_force_vht_sgi(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_force_vht_tx_stbc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_force_ext_cca(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* WFA_VHT_PF */ - -#if defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_TSO_SUPPORT) -INT rlt_net_acc_init(RTMP_ADAPTER *pAd); -#endif - -INT SetRF(RTMP_ADAPTER *pAd, RTMP_STRING *Arg); -int write_reg(RTMP_ADAPTER *ad, UINT32 base, UINT16 offset, UINT32 value); -int read_reg(struct _RTMP_ADAPTER *ad, UINT32 base, UINT16 offset, - UINT32 *value); - -#ifdef MT_MAC -VOID StatRateToString(RTMP_ADAPTER *pAd, CHAR *Output, UCHAR TxRx, - UINT32 RawData); -#endif /* MT_MAC */ - -#ifdef CONFIG_MULTI_CHANNEL -VOID Start_MCC(RTMP_ADAPTER *pAd); -VOID Stop_MCC(RTMP_ADAPTER *pAd, INT channel); -#endif /* CONFIG_MULTI_CHANNEL */ - -NDIS_STATUS RTMPInitHifAdapterBlock(RTMP_ADAPTER *pAd); -NDIS_STATUS RTMPFreeHifAdapterBlock(RTMP_ADAPTER *pAd); -VOID rtmp_hif_data_init(RTMP_ADAPTER *pAd); -BOOLEAN wmode_band_equal(UCHAR smode, UCHAR tmode); -UCHAR wmode_2_rfic(UCHAR PhyMode); - -struct wifi_dev *get_wdev_by_ioctl_idx_and_iftype(RTMP_ADAPTER *pAd, INT idx, - INT if_type); -struct wifi_dev *get_wdev_by_idx(RTMP_ADAPTER *pAd, INT idx); - -#ifdef SNIFFER_SUPPORT -VOID Monitor_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps); -VOID Monitor_Remove(RTMP_ADAPTER *pAd); -BOOLEAN Monitor_Open(RTMP_ADAPTER *pAd, PNET_DEV dev_p); -BOOLEAN Monitor_Close(RTMP_ADAPTER *pAd, PNET_DEV dev_p); -#endif /* SNIFFER_SUPPORT */ - -#ifdef CONFIG_FWOWN_SUPPORT -VOID FwOwn(RTMP_ADAPTER *pAd); -INT32 DriverOwn(RTMP_ADAPTER *pAd); -#endif - -#ifdef ERR_RECOVERY -INT Set_ErrDetectOn_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_ErrDetectMode_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif /* ERR_RECOVERY */ - -VOID mac_entry_lookup(RTMP_ADAPTER *pAd, UCHAR *pAddr, struct wifi_dev *wdev, - MAC_TABLE_ENTRY **entry); -VOID mac_entry_delete(struct _RTMP_ADAPTER *ad, struct _MAC_TABLE_ENTRY *entry); -INT test_flag_con_in_prog(ULONG *ConInPrgress); -#define TEST_FLAG_CONN_IN_PROG(_a) test_flag_con_in_prog(_a) - -INT32 MtAcquirePowerControl(RTMP_ADAPTER *pAd, UINT32 Offset); -void MtReleasePowerControl(RTMP_ADAPTER *pAd, UINT32 Offset); - -#ifdef BACKGROUND_SCAN_SUPPORT -INT set_background_scan(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_background_scan_cfg(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_background_scan_test(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_background_scan_notify(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_background_scan_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* BACKGROUND_SCAN_SUPPORT */ - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) -INT32 Set_RBIST_Switch_Mode(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -INT32 Set_RBIST_Capture_Start(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -INT32 Get_RBIST_Capture_Status(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -INT32 Get_RBIST_Raw_Data_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -INT32 Get_RBIST_IQ_Data(IN RTMP_ADAPTER *pAd, IN PINT32 pData, - IN PINT32 pDataLen, IN UINT32 IQ_Type, - IN UINT32 WF_Num); -INT32 Get_RBIST_IQ_Data_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -UINT32 Get_System_CapNode_Info(IN RTMP_ADAPTER *pAd); -UINT32 Get_System_CenFreq_Info(IN RTMP_ADAPTER *pAd, IN UINT32 CapNode); -UINT8 Get_System_Bw_Info(IN RTMP_ADAPTER *pAd, IN UINT32 CapNode); -INT32 Get_System_Wireless_Info(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - -#define QA_IRR_WF0 1 -#define QA_IRR_WF1 2 -#define QA_IRR_WF2 4 -#define QA_IRR_WF3 8 -#define WF0 0 -#define WF1 1 -#define WF2 2 -#define WF3 3 -#define WF_NUM 4 -#define BITMAP_WF0 1 -#define BITMAP_WF1 2 -#define BITMAP_WF2 4 -#define BITMAP_WF3 8 -#define BITMAP_WF_ALL 15 -INT Set_IRR_ADC(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_IRR_RxGain(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_IRR_TTG(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_IRR_TTGOnOff(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT set_manual_protect(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_manual_rdg(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_cca_en(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -typedef enum _Stat_Action { RESET_COUNTER = 0, SHOW_RX_STATISTIC } Stat_Action; - -INT Set_Rx_Vector_Control(RTMP_ADAPTER *pAd, RTMP_STRING *arg, - RTMP_IOCTL_INPUT_STRUCT *wrq); -INT Show_Rx_Statistic(RTMP_ADAPTER *pAd, RTMP_STRING *arg, - RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /* defined(MT7615) || defined(MT7622) */ - -#ifdef CUT_THROUGH -INT Set_CtLowWaterMark_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*CUT_THROUGH*/ - -#ifdef SMART_CARRIER_SENSE_SUPPORT -INT Set_SCSEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_SCSCfg_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_SCSPd_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_SCSinfo_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -#ifdef WIFI_EAP_FEATURE -#ifdef CHUTIL_SUPPORT -INT Show_ChUtil_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -#endif -INT Set_MibBucket_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_MibBucket_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef DHCP_UC_SUPPORT -UINT16 RTMP_UDP_Checksum(IN PNDIS_PACKET pSkb); -#endif /* DHCP_UC_SUPPORT */ -#ifdef RTMP_UDMA_SUPPORT -#endif /*RTMP_UDMA_SUPPORT*/ - -INT SetSKUCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetPercentageCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetPowerDropCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetBfBackoffCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetThermoCompCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetCCKTxStream(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef ANTENNA_CONTROL_SUPPORT -INT Set_Antenna_Control_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_Antenna_Control_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Antenna_Control_Init(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -#endif /* ANTENNA_CONTROL_SUPPORT */ -INT SetRfTxAnt(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTxPowerInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTOAECtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetEDCCACtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowEDCCAStatus(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetSKUInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetBFBackoffInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef WIFI_EAP_FEATURE -INT SetEDCCAThresholdCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetInitIPICtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT ShowIPIValue(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_mgmt_txpwr_offset(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_data_txpwr_offset(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT set_fw_ratbl_ctrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_ratbl_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* WIFI_EAP_FEATURE */ -#ifdef ACK_CTS_TIMEOUT_SUPPORT -INT Show_CCK_ACK_Timeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_OFDM_ACK_Timeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_CCK_ACK_Timeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_OFDM_ACK_Timeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -INT SetMUTxPower(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetBFNDPATxDCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetTxPowerCompInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetThermalManualCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef TX_POWER_CONTROL_SUPPORT -INT SetTxPowerBoostCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* TX_POWER_CONTROL_SUPPORT */ -#ifdef RF_LOCKDOWN -INT SetCalFreeApply(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#if defined(MT7615) -INT SetWriteEffuseRFpara(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetRFBackup(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -#endif /* RF_LOCKDOWN */ - -#ifdef ETSI_RX_BLOCKER_SUPPORT -INT SetFixWbIbRssiCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetRssiThCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetCheckThCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetAdaptRxBlockCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetWbRssiDirectCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetIbRssiDirectCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT ShowRssiThInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* end of ETSI_RX_BLOCKER_SUPPORT */ - -#ifdef TXPWRMANUAL -INT TxPowerManualCtrl(PRTMP_ADAPTER pAd, BOOLEAN fgPwrManCtrl, - UINT8 u1TxPwrModeManual, UINT8 u1TxPwrBwManual, - UINT8 u1TxPwrRateManual, INT8 i1TxPwrValueManual, - UCHAR ucBandIdx); -INT SetTxPwrManualCtrl(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* TXPWRMANUAL */ - -INT TxPowerPercentCtrl(PRTMP_ADAPTER pAd, BOOLEAN fgTxPowerPercentEn, - UCHAR ucBandIdx); -INT TxPowerDropCtrl(PRTMP_ADAPTER pAd, UINT8 ucPowerDrop, UCHAR ucBandIdx); -#ifdef SINGLE_SKU_V2 -#if defined(MT7615) || defined(MT7622) -INT TxPowerSKUCtrl(PRTMP_ADAPTER pAd, BOOLEAN fgTxPowerSKUEn, UCHAR ucBandIdx); -INT TxPowerBfBackoffCtrl(PRTMP_ADAPTER pAd, BOOLEAN fgTxBFBackoffEn, - UCHAR ucBandIdx); -INT TxPowerBfBackoffParaCtrl(PRTMP_ADAPTER pAd, UCHAR ChannelBand, - UCHAR ControlChannel, UCHAR ucBandIdx); -#else -#endif /* defined(MT7615) || defined(MT7622) */ -#endif /* SINGLE_SKU_V2 */ -INT TxCCKStreamCtrl(PRTMP_ADAPTER pAd, UINT8 u1CCKTxStream, UCHAR ucBandIdx); -INT ThermoCompCtrl(PRTMP_ADAPTER pAd, BOOLEAN fgThermoCompEn, UCHAR ucBandIdx); -INT TxPowerRfTxAnt(PRTMP_ADAPTER pAd, UINT8 ucTxAntIdx); -INT TxPowerShowInfo(PRTMP_ADAPTER pAd, UCHAR ucTxPowerInfoCatg, - UINT8 ucBandIdx); -INT show_BSSEdca_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_APEdca_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef WIFI_EAP_FEATURE -INT SetEdccaThreshold(PRTMP_ADAPTER pAd, UINT32 edcca_threshold); -INT InitIPICtrl(PRTMP_ADAPTER pAd, UINT8 BandIdx); -INT GetIPIValue(PRTMP_ADAPTER pAd, UINT8 BandIdx); -INT SetDataTxPwrOffset(PRTMP_ADAPTER pAd, UINT8 WlanIdx, INT8 TxPwr_Offset, - UINT8 BandIdx); -INT SetFwRaTable(PRTMP_ADAPTER pAd, UINT8 BandIdx, UINT8 TblType, - UINT8 TblIndex, UINT16 TblLength, PUCHAR Buffer); -INT GetRaTblInfo(PRTMP_ADAPTER pAd, UINT8 BandIdx, UINT8 TblType, - UINT8 TblIndex, UINT8 ReadnWrite); -#endif -#ifdef NF_SUPPORT -INT Show_noise_floor_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* NF_SUPPORT*/ -INT TOAECtrlCmd(PRTMP_ADAPTER pAd, UCHAR TOAECtrl); -INT EDCCACtrlCmd(PRTMP_ADAPTER pAd, UCHAR ucBandIdx, UCHAR EDCCACtrl); -INT MUPowerCtrlCmd(PRTMP_ADAPTER pAd, BOOLEAN MUPowerForce, UCHAR MUPowerCtrl); -INT BFNDPATxDCtrlCmd(PRTMP_ADAPTER pAd, BOOLEAN fgNDPA_ManualMode, - UINT8 ucNDPA_TxMode, UINT8 ucNDPA_Rate, UINT8 ucNDPA_BW, - UINT8 ucNDPA_PowerOffset); -INT TemperatureCtrl(PRTMP_ADAPTER pAd, BOOLEAN fgManualMode, CHAR cTemperature); -#ifdef TX_POWER_CONTROL_SUPPORT -INT TxPwrUpCtrl(PRTMP_ADAPTER pAd, UINT8 ucBandIdx, CHAR cPwrUpCat, - CHAR cPwrUpValue[POWER_UP_CATEGORY_RATE_NUM]); -#endif /* TX_POWER_CONTROL_SUPPORT */ - -UINT8 TxPowerGetChBand(UINT8 ucBandIdx, UINT8 CentralCh); -#ifdef TPC_SUPPORT -INT TxPowerTpcFeatureCtrl(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - INT8 TpcPowerValue); -INT TxPowerTpcFeatureForceCtrl(PRTMP_ADAPTER pAd, INT8 TpcPowerValue, - UINT8 ucBandIdx, UINT8 CentralChannel); -#endif /* TPC_SUPPORT */ - -#define RETURN_STATUS_TRUE 0 - -INT set_hnat_register(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -enum { - MSDU_FORMAT, - FINAL_AMSDU_FORMAT, - MIDDLE_AMSDU_FORMAT, - FIRST_AMSDU_FORMAT, -}; - -#define RETURN_IF_PAD_NULL(_pAd) \ - { \ - if (_pAd == NULL) { \ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("%s():Unexpected pAd NULL!\n", __func__)); \ - return; \ - } \ - } -#define RETURN_ZERO_IF_PAD_NULL(_pAd) \ - { \ - if (_pAd == NULL) { \ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("%s():Unexpected pAd NULL!\n", __func__)); \ - return 0; \ - } \ - } -#define PF_TO_BSS_IDX(_pAd, _pfIdx) ((_pAd)->ApCfg.Pf2MbssIdxMap[_pfIdx]) - -UINT32 Get_OBSS_AirTime(PRTMP_ADAPTER pAd, UCHAR BandIdx); -VOID Reset_OBSS_AirTime(PRTMP_ADAPTER pAd, UCHAR BandIdx); -UINT32 Get_My_Tx_AirTime(PRTMP_ADAPTER pAd, UCHAR BandIdx); -UINT32 Get_My_Rx_AirTime(PRTMP_ADAPTER pAd, UCHAR BandIdx); -UINT32 Get_EDCCA_Time(PRTMP_ADAPTER pAd, UCHAR BandIdx); -VOID CCI_ACI_scenario_maintain(PRTMP_ADAPTER pAd); -#ifdef VENDOR_FEATURE7_SUPPORT -#ifdef DOT11_N_SUPPORT -INT Show_HtBw_Proc(IN PRTMP_ADAPTER pAd, OUT RTMP_STRING *pBuf, - IN ULONG BufLen); -INT Show_HtExtcha_Proc(IN PRTMP_ADAPTER pAd, OUT RTMP_STRING *pBuf, - IN ULONG BufLen); -#endif -#endif -#if defined(MT_MAC) && defined(VHT_TXBF_SUPPORT) -VOID Mumimo_scenario_maintain(PRTMP_ADAPTER pAd); -#endif - -#ifdef LED_CONTROL_SUPPORT -INT Set_Led_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -INT wdev_edca_acquire(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev); -struct wifi_dev *get_default_wdev(struct _RTMP_ADAPTER *ad); -UCHAR decide_phy_bw_by_channel(struct _RTMP_ADAPTER *ad, UCHAR channel); -void update_att_from_wdev(struct wifi_dev *dev1, struct wifi_dev *dev2); -BOOLEAN IsPublicActionFrame(PRTMP_ADAPTER pAd, VOID *pbuf); - -#ifdef ERR_RECOVERY -INT32 ShowSerProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT32 ShowSerProc2(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif -INT32 ShowBcnProc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef TX_POWER_CONTROL_SUPPORT -INT32 ShowTxPowerBoostInfo(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* TX_POWER_CONTROL_SUPPORT */ - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -INT Show_Radar_Threshold_Param_Proc(PRTMP_ADAPTER pAd, RTMP_STRING *arg); -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -#ifdef MT_FDB -void fdb_enable(struct _RTMP_ADAPTER *pAd); -INT show_fdb_n9_log(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_fdb_cr4_log(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* MT_FDB */ - -INT wdev_do_open(struct wifi_dev *wdev); -INT wdev_do_close(struct wifi_dev *wdev); -INT wdev_do_linkup(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT wdev_do_linkdown(struct wifi_dev *wdev); -INT wdev_do_conn_act(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT wdev_do_disconn_act(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -#ifdef CON_WPS -VOID APMlmeScanCompleteAction(PRTMP_ADAPTER pAd, MLME_QUEUE_ELEM *Elem); -#endif /* CON_WPS */ - -void ApSendBroadcastDeauth(void *ad_obj, struct wifi_dev *wdev); - -#if defined(BAND_STEERING) && defined(RT_CFG80211_SUPPORT) -VOID APPeerAuthSimpleRspGenAndSend(IN PRTMP_ADAPTER pAd, IN PHEADER_802_11 pHdr, - IN USHORT Alg, IN USHORT Seq, - IN USHORT StatusCode); -#endif /* defined(BAND_STEERING) && defined(RT_CFG80211_SUPPORT) */ - -#if defined(WH_EZ_SETUP) || defined(CONFIG_MAP_SUPPORT) -VOID APMlmeDeauthReqAction(IN PRTMP_ADAPTER pAd, IN PMLME_QUEUE_ELEM Elem); -#endif -#ifdef PS_QUEUE_INC_SUPPORT -INT32 MtCmdSetPSQueueInc(RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 en); -#endif -#ifdef OFFCHANNEL_SCAN_FEATURE - -INT Set_ScanResults_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_ApScan_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Channel_Info_MsgHandle(PRTMP_ADAPTER pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, - POS_COOKIE pObj); -#endif -#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(TR181_SUPPORT) || \ - defined(TXRX_STAT_SUPPORT) -VOID ReadChannelStats(IN PRTMP_ADAPTER pAd); -#endif - -VOID Calculate_NF(RTMP_ADAPTER *pAd, UCHAR bandidx); -VOID ResetEnable_NF_Registers(RTMP_ADAPTER *pAd, UCHAR bandidx); - -#ifdef MULTI_PROFILE -typedef enum MTB_PROFILE_ID_T { - MTB_2G_PROFILE, - MTB_5G_PROFILE, - MTB_MERGE_PROFILE, - MTB_DEV_PREFIX -} MTB_PROFILE_ID; - -NDIS_STATUS update_mtb_value(RTMP_ADAPTER *pAd, UCHAR profile_id, UINT_32 extra, - RTMP_STRING *value); -INT multi_profile_apcli_devname_req(struct _RTMP_ADAPTER *ad, UCHAR *final_name, - INT *ifidx); -UCHAR is_multi_profile_enable(struct _RTMP_ADAPTER *ad); -UCHAR multi_profile_get_pf1_num(struct _RTMP_ADAPTER *ad); -UCHAR multi_profile_get_pf2_num(struct _RTMP_ADAPTER *ad); -#endif /*MULTI_PROFILE*/ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -typedef enum _ENUM_PCIE_ASPM_TYPE_T { - PCIE_ASPM_TYPE_L0S, - PCIE_ASPM_TYPE_L1, - PCIE_ASPM_TYPE_NUM, -} ENUM_PCIE_ASPM_TYPE_T, - *P_ENUM_PCIE_ASPM_TYPE_T; -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -INT build_extra_ie(RTMP_ADAPTER *pAd, struct _build_ie_info *info); -INT build_extended_cap_ie(RTMP_ADAPTER *pAd, struct _build_ie_info *info); -INT build_rsn_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *buf); -INT build_wsc_ie(RTMP_ADAPTER *pAd, struct _build_ie_info *info); -INT build_wmm_cap_ie(RTMP_ADAPTER *pAd, struct _build_ie_info *info); -ULONG build_support_rate_ie(struct wifi_dev *wdev, UCHAR *sup_rate, - UCHAR sup_rate_len, UCHAR *buf); -ULONG build_support_ext_rate_ie(struct wifi_dev *wdev, UCHAR sup_rate_len, - UCHAR *ext_sup_rate, UCHAR ext_sup_rate_len, - UCHAR *buf); -VOID parse_support_rate_ie(struct dev_rate_info *rate, EID_STRUCT *eid_ptr); -VOID parse_support_ext_rate_ie(struct dev_rate_info *rate, EID_STRUCT *eid_ptr); -VOID parse_RXV_packet_v1(RTMP_ADAPTER *pAd, UINT32 Type, RX_BLK *RxBlk, - UCHAR *Data); -VOID parse_RXV_packet_v2(RTMP_ADAPTER *pAd, UINT32 Type, RX_BLK *RxBlk, - UCHAR *Data); -INT32 txs_handler_v1(RTMP_ADAPTER *pAd, RX_BLK *rx_blk, VOID *rx_packet); -INT32 txs_handler_v2(RTMP_ADAPTER *pAd, RX_BLK *rx_blk, VOID *rx_packet); - -INT SetRxRateRecordEn(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT SetRxvRecordEn(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -BOOLEAN SetCsdDebugSet(RTMP_ADAPTER *pAd, UINT8 band_idx, UINT8 g0_value, - UINT8 g1_value, UINT8 g2_value); -INT ShowRxRateHistogram(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -PRxVBQElmt RxVBDequeue(IN PRTMP_ADAPTER pAd); - -PRxVBQElmt RxVBQueueSearch(IN PRTMP_ADAPTER pAd, IN UINT8 rxv_sn, - IN UINT32 Type); - -VOID RecordRxVB(RTMP_ADAPTER *pAd, RX_BLK *RxBlk, UCHAR *Data, UINT32 Type); - -VOID RxVB_Report_Action(PRTMP_ADAPTER pAd, UCHAR wcid, PRxVBQElmt prxvbqelmt); - -UINT16 Checksum16(UINT8 *pData, int len); -UINT16 UdpChecksum16(UINT8 *pData, int len); -#ifdef CONFIG_STEERING_API_SUPPORT -PBLOCKED_STA_ENTRY BlackList_InsertEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, - IN UINT32 BlockTime); - -INT BlackList_DeleteEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr); - -PBLOCKED_STA_ENTRY BlackList_StaLookup(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr); - -PNA_STA_ENTRY NAStaList_InsertEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr); - -INT NAStaList_DeleteEntry(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr); - -PNA_STA_ENTRY NaStaList_Lookup(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr); - -INT NaStaReportListInsertEntry(IN PRTMP_ADAPTER pAd, IN PCHAR Rssi, - IN VOID *Msg, IN ULONG MsgLen, IN UCHAR *Index, - IN PUCHAR pAddr, IN struct wifi_dev *wdev); - -INT SendBtmReqToAir(IN PRTMP_ADAPTER pAd, IN PUCHAR PeerMACAddr, - IN BTM_REQ_FRAME_DATA BtmReqFramedata); - -INT Delete_Btm_Action_Frame_Request(IN PRTMP_ADAPTER pAd, IN UCHAR *Addr); - -DECLARE_TIMER_FUNCTION(WaitRemoveStaFromBlackList); - -#endif -extern INT Set_PartialScan_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -INT Set_BSSAifsn_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BSSCwmin_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BSSCwmax_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_BSSTxop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_APAifsn_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_APCwmin_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_APCwmax_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_APTxop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#ifdef MAP_R2 -int get_idx_from_channel(int chan); -#endif -#ifdef MGMT_TXPWR_CTRL -INT set_mgmt_frame_power(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT show_mgmt_frame_power(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT update_mgmt_frame_power(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -#endif -#ifdef AMPDU_CONF_SUPPORT -INT Set_AMPDU_MPDU_Count(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_AMPDU_Retry_Count(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_AMPDU_MPDU_Count(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Show_AMPDU_retry_Count(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* AMPDU_CONF_SUPPORT*/ - -#ifdef MLME_MULTI_QUEUE_SUPPORT -INT set_mlme_queue_ration(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /*MLME_MULTI_QUEUE_SUPPORT*/ -#endif /* __RTMP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_chip.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_chip.h deleted file mode 100644 index 7d7ffaf663..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_chip.h +++ /dev/null @@ -1,525 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rtmp_chip.h - - Abstract: - Ralink Wireless Chip related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __RTMP_CHIP_H__ -#define __RTMP_CHIP_H__ - -#include "rtmp_type.h" -#include "eeprom.h" -#include "tx_power.h" -#include "hif/hif.h" -#include "mac/mac.h" -#include "mcu/mcu.h" - -#ifdef MT7615 -#include "chip/mt7615.h" -#endif /* MT7615 */ - -#ifdef MT7622 -#include "chip/mt7622.h" -#endif /* MT7622 */ - -#include "hw_ctrl/hw_init.h" - -#define IS_MT7650(_pAd) (((_pAd)->ChipID & 0xffff0000) == 0x76500000) -#define IS_MT7630(_pAd) (((_pAd)->ChipID & 0xffff0000) == 0x76300000) - -#define IS_MT7662(_pAd) (((_pAd)->ChipID & 0xffff0000) == 0x76620000) -#define IS_MT7612(_pAd) (((_pAd)->ChipID & 0xffff0000) == 0x76120000) -#define IS_MT7602(_pAd) (((_pAd)->ChipID & 0xffff0000) == 0x76020000) -#define REV_MT76x2E3 0x0022 -#define REV_MT76x2E4 0x0033 - -#define IS_MT76xx(_pAd) (IS_MT76x0(_pAd)) - -#define IS_MT7603(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007603) -#define IS_MT7603E(_pAd) \ - ((((_pAd)->ChipID & 0x0000ffff) == 0x00007603) && IS_PCIE_INF(_pAd)) -#define IS_MT7603U(_pAd) \ - ((((_pAd)->ChipID & 0x0000ffff) == 0x00007603) && IS_USB_INF(_pAd) && \ - (_pAd->AntMode == 0)) -#define IS_MT76031U(_pAd) \ - ((((_pAd)->ChipID & 0x0000ffff) == 0x00007603) && IS_USB_INF(_pAd) && \ - (_pAd->AntMode == 1)) - -#define MT7603E1 0x0000 -#define MT7603E2 0x0010 - -/* -#define IS_MT7636(_pAd) ((((_pAd)->ChipID & 0x0000ffff) == 0x00007606)||\ - (((_pAd)->ChipID & 0x0000ffff) == 0x00007636) || \ - (((_pAd)->ChipID & 0x0000ffff) == 0x00007611)) -*/ - -/* MT76x6 series: 7636/7606/7611 - 1. For definition/compiler option, use MT7636 for all 7636/7603/7611 - 2. For run time case (specific H/W), please use IS_MT7636(), IS_MT7606(), MT7611() - 3. For run time case (all H/Ws), please use IS_MT76x6() - 4. For different interface, please use IS_MT7636U(), IS_MT7636S() */ -#define IS_MT76x6(_pAd) \ - ((((_pAd)->ChipID & 0x0000ffff) == 0x00007606) || \ - (((_pAd)->ChipID & 0x0000ffff) == 0x00007636) || \ - (((_pAd)->ChipID & 0x0000ffff) == 0x00007611)) - -#define IS_MT7636U(_pAd) \ - ((((_pAd)->ChipID & 0x0000ffff) == 0x00007606) && IS_USB_INF(_pAd)) -#define IS_MT7636S(_pAd) \ - ((((_pAd)->ChipID & 0x0000ffff) == 0x00007606) && IS_SDIO_INF(_pAd)) - -#define IS_MT7636(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007636) -#define IS_MT7606(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007606) -#define IS_MT7611(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007611) - -/* MT7636 Hardeware Version */ -#define MT76x6E1 0x0000 /* MT7636 E1 0x8A00 */ -#define MT76x6E2 0x0001 /* MT7636 E2 0x8A01 */ -#define MT76x6E3 0x0010 /* MT7636 E3 0x8A10 */ - -/* MT7636 Firmware Version */ -#define MT76x6_FW_VER_E1 \ - 0x00 /* MT7636 FW Ver E1 0x8A00, use E1 rom patch */ -#define MT76x6_FW_VER_E3 \ - 0x10 /* MT7636 FW Ver E3 0x8A10, use E3 rom patch */ - -#define IS_MT76x6_FW_VER_E1(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT76x6_FW_VER_E1) -#define IS_MT76x6_FW_VER_E3(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT76x6_FW_VER_E3) - -/* MT7637 series: TBD */ -#define IS_MT7637(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007637) -#define IS_MT7637U(_pAd) (IS_MT7637(_pAd) && IS_USB_INF(_pAd)) -#define IS_MT7637S(_pAd) (IS_MT7637(_pAd) && IS_SDIO_INF(_pAd)) -#define IS_MT7637E(_pAd) (IS_MT7637(_pAd) && IS_PCIE_INF(_pAd)) - -/* MT7637 Hardeware Version */ -#define MT7637E1 0x0000 /* MT7637 E1 0x8A00 */ -#define MT7637E2 0x0010 /* MT7637 E2 0x8A10 */ - -/* MT7637 Firmware Version */ -#define MT7637_FW_VER_E1 \ - 0x00 /* MT7637 FW Ver E1 0x8A00, use E1 rom patch */ -#define MT7637_FW_VER_E2 \ - 0x10 /* MT7637 FW Ver E2 0x8A10, use E2 rom patch */ - -#define IS_MT7637_FW_VER_E1(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT7637_FW_VER_E1) -#define IS_MT7637_FW_VER_E2(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT7637_FW_VER_E2) - -/* MT7615 Firmware Version */ -#define MT7615_FW_VER_E1 \ - 0x00 /* MT7615 FW Ver E1 0x8A00, use E1 RAM IMAGE */ -#define MT7615_FW_VER_E3 \ - 0x10 /* MT7615 FW Ver E3 0x8A10, use E3 RAM IMAGE */ - -#define IS_MT7615_FW_VER_E1(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT7615_FW_VER_E1) -#define IS_MT7615_FW_VER_E3(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT7615_FW_VER_E3) - -/* MT7622 Firmware Version */ -#define MT7622_FW_VER_E1 \ - 0x00 /* MT7622 FW Ver E1 0x8A00, use E1 RAM IMAGE */ -#define MT7622_FW_VER_E2 \ - 0x10 /* MT7622 FW Ver E2 0x8A10, use E2 RAM IMAGE */ - -#define IS_MT7622_FW_VER_E1(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT7622_FW_VER_E1) -#define IS_MT7622_FW_VER_E2(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT7622_FW_VER_E2) - -/* P18 Firmware Version */ -#define P18_FW_VER_E1 0x00 /* P18 FW Ver E1 0x8A00, use E1 RAM IMAGE */ - -#define IS_P18_FW_VER_E1(_pAd) (((_pAd)->FWVersion & 0xff) == P18_FW_VER_E1) - -/* MT7663 Firmware Version */ -#define MT7663_FW_VER_E1 \ - 0x00 /* MT7663 FW Ver E1 0x8A00, use E1 RAM IMAGE */ - -#define IS_MT7663_FW_VER_E1(_pAd) \ - (((_pAd)->FWVersion & 0xff) == MT7663_FW_VER_E1) - -#define IS_MT7628(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007628) - -#define MT7628E1 0x0000 -#define MT7628E2 0x0010 - -#define IS_MT7615(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007615) - -#define MT7615E1 0x0000 /* MT7615 E1 0x8A00 */ -#define MT7615E2 0x0001 /* MT7615 E2 0x8A01 */ -#define MT7615E3 0x0010 /* MT7615 E3 0x8A10 */ - -#define IS_MT7622(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007622) - -#define IS_P18(_pAd) \ - (((_pAd)->ChipID & 0x0000ffff) == \ - 0x00006632) /* 0x6632 is for FPGA release v10 */ -#define IS_MT7663(_pAd) (((_pAd)->ChipID & 0x0000ffff) == 0x00007663) -/* RT3592BC8 (WiFi + BT) */ -#define RT_REV_LT(_pAd, _chip, _rev) \ - (IS_##_chip(_pAd) && (((_pAd)->MACVersion & 0x0000FFFF) < (_rev))) - -#define RT_REV_GTE(_pAd, _chip, _rev) \ - (IS_##_chip(_pAd) && (((_pAd)->MACVersion & 0x0000FFFF) >= (_rev))) - -#define MT_REV_LT(_pAd, _chip, _rev) \ - (IS_##_chip(_pAd) && (((_pAd)->ChipID & 0x0000FFFF) < (_rev))) - -#define MT_REV_GTE(_pAd, _chip, _rev) \ - (IS_##_chip(_pAd) && (((_pAd)->ChipID & 0x0000FFFF) >= (_rev))) - -#define MTK_REV_LT(_pAd, _chip, _rev) \ - (IS_##_chip(_pAd) && (((_pAd)->HWVersion & 0x000000ff) < (_rev))) - -#define MT_REV_ET(_pAd, _chip, _rev) \ - (IS_##_chip(_pAd) && (((_pAd)->ChipID & 0x0000FFFF) == (_rev))) - -#define MTK_REV_GTE(_pAd, _chip, _rev) \ - (IS_##_chip(_pAd) && (((_pAd)->HWVersion & 0x000000ff) >= (_rev))) - -/* Dual-band NIC (RF/BBP/MAC are in the same chip.) */ - -#define IS_RT_NEW_DUAL_BAND_NIC(_pAd) ((FALSE)) - -#define CCA_AVG_MAX_COUNT 5 - -/* ------------------------------------------------------ */ -/* PCI registers - base address 0x0000 */ -/* ------------------------------------------------------ */ -#define CHIP_PCI_CFG 0x0000 -#define CHIP_PCI_EECTRL 0x0004 -#define CHIP_PCI_MCUCTRL 0x0008 - -#define OPT_14 0x114 - -#define RETRY_LIMIT 10 - -/* ------------------------------------------------------ */ -/* BBP & RF definition */ -/* ------------------------------------------------------ */ -#define BUSY 1 -#define IDLE 0 - -/*------------------------------------------------------------------------- */ -/* EEPROM definition */ -/*------------------------------------------------------------------------- */ -#define EEDO 0x08 -#define EEDI 0x04 -#define EECS 0x02 -#define EESK 0x01 -#define EERL 0x80 - -#define EEPROM_WRITE_OPCODE 0x05 -#define EEPROM_READ_OPCODE 0x06 -#define EEPROM_EWDS_OPCODE 0x10 -#define EEPROM_EWEN_OPCODE 0x13 - -#define NUM_EEPROM_BBP_PARMS \ - 19 /* Include NIC Config 0, 1, CR, TX ALC step, BBPs */ -#define NUM_EEPROM_TX_G_PARMS 7 - -#define VALID_EEPROM_VERSION 1 -#define EEPROM_VERSION_OFFSET 0x02 -#define EEPROM_NIC1_OFFSET \ - 0x34 /* The address is from NIC config 0, not BBP register ID */ -#define EEPROM_NIC2_OFFSET \ - 0x36 /* The address is from NIC config 1, not BBP register ID */ - -#define EEPROM_COUNTRY_REGION 0x38 -#define COUNTRY_REGION_A_BAND_MASK (0xff) -#define COUNTRY_REGION_G_BAND (0xff << 8) - -#define EEPROM_DEFINE_MAX_TXPWR 0x4e -#define MAX_EIRP_TX_PWR_G_BAND_MASK (0xff) -#define MAX_EIRP_TX_PWR_A_BAND_MASK (0xff << 8) - -#define EEPROM_FREQ_OFFSET 0x3a -#define FREQ_OFFSET_MASK (0x7f) -#define FREQ_OFFSET_DIP (1 << 7) -#define LED_MODE_MASK (0xff << 8) - -#define EEPROM_LEDAG_CONF_OFFSET 0x3c -#define EEPROM_LEDACT_CONF_OFFSET 0x3e -#define EEPROM_LED_POLARITY_OFFSET 0x40 - -#define EEPROM_LNA_OFFSET 0x44 -#define LNA_GAIN_G_BAND_MASK (0x7f) -#define LNA_GAIN_G_BAND_EN (1 << 7) -#define LNA_GAIN_A_BAND_CH36_64_MASK (0x7f << 8) -#define LNA_GAIN_A_BAND_CH36_64_EN (1 << 15) - -#define EEPROM_RSSI_BG_OFFSET 0x46 -#define RSSI0_OFFSET_G_BAND_MASK (0x3f) -#define RSSI0_OFFSET_G_BAND_SIGN (1 << 6) -#define RSSI0_OFFSET_G_BAND_EN (1 << 7) -#define RSSI1_OFFSET_G_BAND_MASK (0x3f << 8) -#define RSSI1_OFFSET_G_BAND_SIGN (1 << 14) -#define RSSI1_OFFSET_G_BAND_EN (1 << 15) - -#define EEPROM_TXMIXER_GAIN_2_4G 0x48 -#define LNA_GAIN_A_BAND_CH100_128_MASK (0x7f << 8) -#define LNA_GAIN_A_BAND_CH100_128_EN (1 << 15) - -#define EEPROM_RSSI_A_OFFSET 0x4a -#define RSSI0_OFFSET_A_BAND_MASK (0x3f) -#define RSSI0_OFFSET_A_BAND_SIGN (1 << 6) -#define RSSI0_OFFSET_A_BANE_EN (1 << 7) -#define RSSI1_OFFSET_A_BAND_MASK (0x3f << 8) -#define RSSI1_OFFSET_A_BAND_SIGN (1 << 14) -#define RSSI1_OFFSET_A_BAND_EN (1 << 15) - -#define EEPROM_TXMIXER_GAIN_5G 0x4c -#define LNA_GAIN_A_BAND_CH132_165_MASK (0x7f << 8) -#define LNA_GAIN_A_BAND_CH132_165_EN (1 << 15) - -#define EEPROM_TXPOWER_DELTA \ - 0x50 /* 20MHZ AND 40 MHZ use different power. This is delta in 40MHZ. */ - -#define EEPROM_G_TX_PWR_OFFSET 0x52 -#define EEPROM_G_TX2_PWR_OFFSET 0x60 - -#define EEPROM_G_TSSI_BOUND1 0x6e -#define EEPROM_G_TSSI_BOUND2 0x70 -#define EEPROM_G_TSSI_BOUND3 0x72 -#define EEPROM_G_TSSI_BOUND4 0x74 -#define EEPROM_G_TSSI_BOUND5 0x76 - -#define EEPROM_A_TX_PWR_OFFSET 0x78 -#define EEPROM_A_TX2_PWR_OFFSET 0xa6 - -enum FREQ_CAL_INIT_MODE { - FREQ_CAL_INIT_MODE0, - FREQ_CAL_INIT_MODE1, - FREQ_CAL_INIT_MODE2, - FREQ_CAL_INIT_UNKNOW, -}; - -enum FREQ_CAL_MODE { - FREQ_CAL_MODE0, - FREQ_CAL_MODE1, - FREQ_CAL_MODE2, -}; - -enum RXWI_FRQ_OFFSET_FIELD { - RXWI_FRQ_OFFSET_FIELD0, /* SNR1 */ - RXWI_FRQ_OFFSET_FIELD1, /* Frequency Offset */ -}; - -#define EEPROM_A_TSSI_BOUND1 0xd4 -#define EEPROM_A_TSSI_BOUND2 0xd6 -#define EEPROM_A_TSSI_BOUND3 0xd8 -#define EEPROM_A_TSSI_BOUND4 0xda -#define EEPROM_A_TSSI_BOUND5 0xdc - -#define EEPROM_TXPOWER_BYRATE 0xde /* 20MHZ power. */ -#define EEPROM_TXPOWER_BYRATE_20MHZ_2_4G 0xde /* 20MHZ 2.4G tx power. */ -#define EEPROM_TXPOWER_BYRATE_40MHZ_2_4G 0xee /* 40MHZ 2.4G tx power. */ -#define EEPROM_TXPOWER_BYRATE_20MHZ_5G 0xfa /* 20MHZ 5G tx power. */ -#define EEPROM_TXPOWER_BYRATE_40MHZ_5G 0x10a /* 40MHZ 5G tx power. */ - -#define EEPROM_BBP_BASE_OFFSET \ - 0xf0 /* The address is from NIC config 0, not BBP register ID */ - -/* */ -/* Bit mask for the Tx ALC and the Tx fine power control */ -/* */ -#define GET_TX_ALC_BIT_MASK 0x1F /* Valid: 0~31, and in 0.5dB step */ -#define GET_TX_FINE_POWER_CTRL_BIT_MASK 0xE0 /* Valid: 0~4, and in 0.1dB step */ -#define NUMBER_OF_BITS_FOR_TX_ALC \ - 5 /* The length, in bit, of the Tx ALC field */ - -/* TSSI gain and TSSI attenuation */ - -#define EEPROM_TSSI_GAIN_AND_ATTENUATION 0x76 - -/*#define EEPROM_Japan_TX_PWR_OFFSET 0x90 // 802.11j */ -/*#define EEPROM_Japan_TX2_PWR_OFFSET 0xbe */ -/*#define EEPROM_TSSI_REF_OFFSET 0x54 */ -/*#define EEPROM_TSSI_DELTA_OFFSET 0x24 */ -/*#define EEPROM_CCK_TX_PWR_OFFSET 0x62 */ -/*#define EEPROM_CALIBRATE_OFFSET 0x7c */ - -#define EEPROM_NIC_CFG1_OFFSET 0 -#define EEPROM_NIC_CFG2_OFFSET 1 -#define EEPROM_NIC_CFG3_OFFSET 2 -#define EEPROM_COUNTRY_REG_OFFSET 3 -#define EEPROM_BBP_ARRAY_OFFSET 4 - -#ifdef RT_BIG_ENDIAN -typedef union _EEPROM_ANTENNA_STRUC { - struct { - USHORT RssiIndicationMode : 1; /* RSSI indication mode */ - USHORT Rsv : 1; - USHORT BoardType : 2; /* 0: mini card; 1: USB pen */ - USHORT RfIcType : 4; /* see E2PROM document */ - USHORT TxPath : 4; /* 1: 1T, 2: 2T, 3: 3T */ - USHORT RxPath : 4; /* 1: 1R, 2: 2R, 3: 3R */ - } field; - USHORT word; -} EEPROM_ANTENNA_STRUC, *PEEPROM_ANTENNA_STRUC; -#else -typedef union _EEPROM_ANTENNA_STRUC { - struct { - USHORT RxPath : 4; /* 1: 1R, 2: 2R, 3: 3R */ - USHORT TxPath : 4; /* 1: 1T, 2: 2T, 3: 3T */ - USHORT RfIcType : 4; /* see E2PROM document */ - USHORT BoardType : 2; /* 0: mini card; 1: USB pen */ - USHORT Rsv : 1; - USHORT RssiIndicationMode : 1; /* RSSI indication mode */ - } field; - USHORT word; -} EEPROM_ANTENNA_STRUC, *PEEPROM_ANTENNA_STRUC; -#endif - -struct RF_BANK_OFFSET { - UINT8 RFBankIndex; - UINT16 RFStart; - UINT16 RFEnd; -}; - -struct RF_INDEX_OFFSET { - UINT8 RFIndex; - UINT16 RFStart; - UINT16 RFEnd; -}; - -struct _RSSI_SAMPLE; -struct _EXT_CMD_EFUSE_BUFFER_MODE_T; - -VOID AsicInitTxRxRing(struct _RTMP_ADAPTER *pAd); - -int RtmpChipOpsHook(VOID *pCB); -VOID RtmpChipBcnInit(struct _RTMP_ADAPTER *pAd); -#ifdef MT_MAC -VOID mt_bcn_buf_init(struct _RTMP_ADAPTER *pAd); -VOID mt_chip_bcn_parameter_init(struct _RTMP_ADAPTER *pAd); -#endif /* MT_MAC */ - -UINT8 NICGetBandSupported(struct _RTMP_ADAPTER *pAd); - -VOID RtmpChipWriteHighMemory(IN struct _RTMP_ADAPTER *pAd, IN USHORT Offset, - IN UINT32 Value, IN UINT8 Unit); - -VOID RtmpChipWriteMemory(IN struct _RTMP_ADAPTER *pAd, IN USHORT Offset, - IN UINT32 Value, IN UINT8 Unit); - -VOID RTMPReadChannelPwr(struct _RTMP_ADAPTER *pAd); -VOID RTMPReadTxPwrPerRate(struct _RTMP_ADAPTER *pAd); - -INT tx_pwr_comp_init(struct _RTMP_ADAPTER *pAd); -VOID NetDevNickNameInit(IN struct _RTMP_ADAPTER *pAd); - -#ifdef GREENAP_SUPPORT -struct greenap_ctrl; -struct greenap_on_off_ctrl; -VOID greenap_init(struct greenap_ctrl *greenap); -VOID greenap_exit(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct greenap_ctrl *greenap); -VOID greenap_show(struct _RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap); -BOOLEAN greenap_check_when_if_down_up(struct _RTMP_ADAPTER *pAd); -VOID greenap_check_peer_connection_status(struct _RTMP_ADAPTER *pAd, - UINT8 band_idx, - BOOLEAN previous_greenap_active, - BOOLEAN greenap_allow); -VOID greenap_check_peer_connection_at_link_up_down(struct _RTMP_ADAPTER *pAd, - struct wifi_dev *wdev, - struct greenap_ctrl *greenap); -BOOLEAN greenap_get_suspend_status(struct greenap_ctrl *greenap); -VOID greenap_suspend(struct _RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap, - UINT32 reason); -VOID greenap_resume(struct _RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap, - UINT32 reason); -VOID greenap_check_allow_status(struct _RTMP_ADAPTER *pAd, - struct greenap_ctrl *greenap); -BOOLEAN greenap_get_allow_status(struct greenap_ctrl *greenap); -VOID greenap_set_capability(struct greenap_ctrl *greenap, BOOLEAN greenap_cap); -BOOLEAN greenap_get_capability(struct greenap_ctrl *greenap); -VOID greenap_proc(struct _RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap, - BOOLEAN greenap_cap_on); - -VOID enable_greenap(struct _RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off); -VOID disable_greenap(struct _RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off); -VOID EnableAPMIMOPSv2(struct _RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off); -VOID DisableAPMIMOPSv2(struct _RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off); -VOID EnableAPMIMOPSv1(struct _RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off); -VOID DisableAPMIMOPSv1(struct _RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off); -#endif /* GREENAP_SUPPORT */ - -/* global variable */ -extern FREQUENCY_ITEM RtmpFreqItems3020[]; -extern FREQUENCY_ITEM FreqItems3020_Xtal20M[]; -extern UCHAR NUM_OF_3020_CHNL; -extern FREQUENCY_ITEM *FreqItems3020; -extern RTMP_RF_REGS RF2850RegTable[]; -extern UCHAR NUM_OF_2850_CHNL; - -INT AsicGetMacVersion(struct _RTMP_ADAPTER *pAd); - -INT WaitForAsicReady(struct _RTMP_ADAPTER *pAd); - -INT AsicWaitMacTxRxIdle(struct _RTMP_ADAPTER *pAd); - -#define ASIC_MAC_TX 1 -#define ASIC_MAC_RX 2 -#define ASIC_MAC_TXRX 3 -#define ASIC_MAC_TXRX_RXV 4 -#define ASIC_MAC_RXV 5 -#define ASIC_MAC_RX_RXV 6 - -INT AsicSetMacTxRx(struct _RTMP_ADAPTER *pAd, INT32 txrx, BOOLEAN enable); - -enum { - PDMA_TX, - PDMA_RX, - PDMA_TX_RX, -}; - -INT AsicSetWPDMA(struct _RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN enable); -BOOLEAN AsicWaitPDMAIdle(struct _RTMP_ADAPTER *pAd, INT round, INT wait_us); -BOOLEAN AsicResetWPDMA(struct _RTMP_ADAPTER *pAd); - -INT AsicSetMacWD(struct _RTMP_ADAPTER *pAd); - -INT AsicReadAggCnt(struct _RTMP_ADAPTER *pAd, ULONG *aggCnt, int cnt_len); - -INT AsicTOPInit(struct _RTMP_ADAPTER *pAd); - -#ifdef MT_MAC -INT rt28xx_read16(struct _RTMP_ADAPTER *pAd, USHORT, USHORT *); -#endif /* MT_MAC */ - -#endif /* __RTMP_CHIP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_cmd.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_cmd.h deleted file mode 100644 index ebe28a2f94..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_cmd.h +++ /dev/null @@ -1,885 +0,0 @@ -#ifndef __RTMP_CMD_H__ -#define __RTMP_CMD_H__ - -#include "rtmp_type.h" - -/* OS_RTCMDUp is only used in UTIL/NETIF module */ -#define OS_RTCMDUp RtmpOsCmdUp -#define OS_RTCMDRunning RtmpOsIsCmdThreadRunning - -/* RALINK command status code */ -#define RTMP_IO_EINVAL 30000 -#define RTMP_IO_EOPNOTSUPP 30001 -#define RTMP_IO_EFAULT 30002 -#define RTMP_IO_ENETDOWN 30003 -#define RTMP_IO_E2BIG 30004 -#define RTMP_IO_ENOMEM 30005 -#define RTMP_IO_EAGAIN 30006 -#define RTMP_IO_ENOTCONN 30007 - -enum { -#ifdef MAT_SUPPORT - SHOW_IPV4_MAT_INFO = 1, - SHOW_IPV6_MAT_INFO = 2, - SHOW_ETH_CLONE_MAC = 3, -#endif /* MAT_SUPPORT */ - SHOW_CONN_STATUS = 4, - SHOW_DRVIER_VERION = 5, - SHOW_BA_INFO = 6, - SHOW_DESC_INFO = 7, - RAIO_OFF = 10, - RAIO_ON = 11, - SHOW_CFG_VALUE = 21, - SHOW_ADHOC_ENTRY_INFO = 22, -#if defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) - SHOW_TDLS_ENTRY_INFO = 25, -#endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) */ - SHOW_DEV_INFO = 26, - SHOW_STA_INFO = 27, - SHOW_TR_INFO = 28, - SHOW_SYS_INFO = 29, - SHOW_PWR_INFO = 30, - SHOW_DIAGNOSE_INFO = 31, -#ifdef MT_MAC - SHOW_WTBL_INFO = 32, - SHOW_MIB_INFO = 33, - SHOW_PS_INFO = 34, - SHOW_TMAC_INFO = 35, - SHOW_AGG_INFO = 36, - SHOW_PSE_INFO = 37, - SHOW_PSE_DATA = 38, - SHOW_DSCH_INFO = 39, -#ifdef CUT_THROUGH - SHOW_CT_INFO = 40, -#endif /* CUT_THROUGH */ -#ifdef DBDC_MODE - SHOW_DBDC_INFO = 41, -#endif /*DBDC_MODE*/ - SHOW_WTBLTLV_INFO = 42, -#endif -#ifdef MEM_ALLOC_INFO_SUPPORT - SHOW_MEM_INFO = 43, - SHOW_PKTMEM_INFO = 44, -#endif /* MEM_ALLOC_INFO_SUPPORT */ - SHOW_WIFI_INT_CNT = 45, - SHOW_EFUSE_INFO = 46, - SHOW_PLE_INFO = 47, -#ifdef REDUCE_TCP_ACK_SUPPORT - SHOW_TCP_RACK_INFO = 48, -#endif - SHOW_TXOP_INFO = 49, - SHOW_TXD_INFO = 50, - DUMP_MEM_INFO = 51, - SHOW_E2P_INFO = 52, - SHOW_TP_INFO = 53, - SHOW_CHCTRL_INFO = 54, -}; - -/* RALINK command handle ID */ -/* ap commands */ -typedef enum _CMD_RTPRIV_IOCTL_AP { - - /* general */ - CMD_RTPRIV_IOCTL_SET_WSCOOB = 0x0001, - CMD_RTPRIV_IOCTL_GET_MAC_TABLE, - CMD_RTPRIV_IOCTL_GSITESURVEY, - CMD_RTPRIV_IOCTL_STATISTICS, - CMD_MTPRIV_IOCTL_RD, - CMD_RTPRIV_IOCTL_RX_STATISTICS, - CMD_RTPRIV_IOCTL_QUERY_BATABLE, - CMD_RTPRIV_IOCTL_E2P, - CMD_RTPRIV_IOCTL_BBP, - CMD_RTPRIV_IOCTL_MAC, - CMD_RTPRIV_IOCTL_RF, - CMD_RT_PRIV_IOCTL, - CMD_RTPRIV_IOCTL_SET, - CMD_RTPRIV_IOCTL_SHOW, - CMD_RTPRIV_IOCTL_ATE, - CMD_RTPRIV_IOCTL_CHID_2_FREQ, - CMD_RTPRIV_IOCTL_FREQ_2_CHID, - CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT, - - /* mbss */ - CMD_RTPRIV_IOCTL_MBSS_BEACON_UPDATE, - CMD_RTPRIV_IOCTL_MBSS_OPEN, - CMD_RTPRIV_IOCTL_MBSS_CLOSE, - CMD_RTPRIV_IOCTL_MBSS_INIT, - CMD_RTPRIV_IOCTL_MBSS_REMOVE, -#ifdef MT_MAC - CMD_RTPRIV_IOCTL_MBSS_CR_ENABLE, - CMD_RTPRIV_IOCTL_MBSS_CR_DISABLE, -#endif - - /* wsc */ - CMD_RTPRIV_IOCTL_WSC_PROFILE, - CMD_RTPRIV_IOCTL_WSC_INIT, - - /* apc */ - CMD_RTPRIV_IOCTL_APC_UP, - CMD_RTPRIV_IOCTL_APC_DISCONNECT, - CMD_RTPRIV_IOCTL_APC_INIT, - CMD_RTPRIV_IOCTL_APC_REMOVE, - - /* interface */ - CMD_RTPRIV_IOCTL_MAIN_OPEN, - - /* ioctl */ - CMD_RTPRIV_IOCTL_PREPARE, - CMD_RTPRIV_IOCTL_AP_SIOCGIWAP, - CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR, - CMD_RTPRIV_IOCTL_AP_SIOCGIWESSID, - CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ, - CMD_RTPRIV_IOCTL_AP_SIOCSIWGENIE, - - CMD_RTPRIV_IOCTL_GET_DRIVER_INFO, -#ifdef WIFI_DIAG - CMD_RTPRIV_IOCTL_GET_PROCESS_INFO, -#endif - - /* can not exceed 0x5000 */ -} CMD_RTPRIV_IOCTL_AP; - -/* common commands */ -typedef enum _CMD_RTPRIV_IOCTL_COMMON { - - /* general */ - CMD_RTPRIV_IOCTL_NETDEV_GET = 0x5000, - CMD_RTPRIV_IOCTL_NETDEV_SET, - CMD_RTPRIV_IOCTL_OPMODE_GET, - CMD_RTPRIV_IOCTL_TASK_LIST_GET, - CMD_RTPRIV_IOCTL_IRQ_INIT, - CMD_RTPRIV_IOCTL_IRQ_RELEASE, - CMD_RTPRIV_IOCTL_NIC_NOT_EXIST, - CMD_RTPRIV_IOCTL_MCU_SLEEP_CLEAR, - CMD_RTPRIV_IOCTL_SANITY_CHECK, - CMD_RTPRIV_IOCTL_SANITY_CHECK_ON_SET_CMD, -#ifdef EXT_BUILD_CHANNEL_LIST - CMD_RTPRIV_SET_PRECONFIG_VALUE, -#endif /* EXT_BUILD_CHANNEL_LIST */ - - /* sniffer */ - CMD_RTPRIV_IOCTL_SNIFF_UP, - CMD_RTPRIV_IOCTL_SNIFF_DISCONNECT, - CMD_RTPRIV_IOCTL_SNIFF_INIT, - CMD_RTPRIV_IOCTL_SNIFF_OPEN, - CMD_RTPRIV_IOCTL_SNIFF_CLOSE, - CMD_RTPRIV_IOCTL_SNIFF_REMOVE, - - /* mesh */ - CMD_RTPRIV_IOCTL_MESH_INIT, - CMD_RTPRIV_IOCTL_MESH_REMOVE, - CMD_RTPRIV_IOCTL_MESH_OPEN_PRE, - CMD_RTPRIV_IOCTL_MESH_OPEN_POST, - CMD_RTPRIV_IOCTL_MESH_IS_VALID, - CMD_RTPRIV_IOCTL_MESH_CLOSE, - - /* p2p */ - CMD_RTPRIV_IOCTL_P2P_INIT, - CMD_RTPRIV_IOCTL_P2P_REMOVE, - CMD_RTPRIV_IOCTL_P2P_OPEN_PRE, - CMD_RTPRIV_IOCTL_P2P_OPEN_POST, - CMD_RTPRIV_IOCTL_P2P_IS_VALID, - CMD_RTPRIV_IOCTL_P2P_CLOSE, - - /* usb */ - CMD_RTPRIV_IOCTL_USB_MORE_FLAG_SET, - CMD_RTPRIV_IOCTL_USB_CONFIG_INIT, - CMD_RTPRIV_IOCTL_USB_SUSPEND, - CMD_RTPRIV_IOCTL_USB_RESUME, - CMD_RTPRIV_IOCTL_USB_INIT, - - /* pci */ - CMD_RTPRIV_IOCTL_PCI_SUSPEND, - CMD_RTPRIV_IOCTL_PCI_RESUME, - CMD_RTPRIV_IOCTL_PCI_CSR_SET, - CMD_RTPRIV_IOCTL_PCIE_INIT, - - /* rbus */ - CMD_RTPRIV_IOCTL_RBUS_SUSPEND, - CMD_RTPRIV_IOCTL_RBUS_RESUME, - - /* cfg80211 */ - CMD_RTPRIV_IOCTL_CFG80211_CFG_START, - - /* inf ppa */ - CMD_RTPRIV_IOCTL_INF_PPA_INIT, - CMD_RTPRIV_IOCTL_INF_PPA_EXIT, - - /* wireless */ - CMD_RTPRIV_IOCTL_BEACON_UPDATE, - CMD_RTPRIV_IOCTL_RXPATH_GET, - CMD_RTPRIV_IOCTL_CHAN_LIST_NUM_GET, - CMD_RTPRIV_IOCTL_CHAN_LIST_GET, - CMD_RTPRIV_IOCTL_FREQ_LIST_GET, - - /* interface */ - CMD_RTPRIV_IOCTL_VIRTUAL_INF_UP, - CMD_RTPRIV_IOCTL_VIRTUAL_INF_DOWN, - CMD_RTPRIV_IOCTL_VIRTUAL_INF_INIT, - CMD_RTPRIV_IOCTL_VIRTUAL_INF_DEINIT, - CMD_RTPRIV_IOCTL_VIRTUAL_INF_GET, - CMD_RTPRIV_IOCTL_INF_TYPE_GET, - CMD_RTPRIV_IOCTL_INF_STATS_GET, - CMD_RTPRIV_IOCTL_INF_IW_STATUS_GET, - CMD_RTPRIV_IOCTL_INF_MAIN_CREATE, - CMD_RTPRIV_IOCTL_INF_MAIN_ID_GET, - CMD_RTPRIV_IOCTL_INF_MAIN_CHECK, - CMD_RTPRIV_IOCTL_INF_P2P_CHECK, - - /* ioctl */ - CMD_RTPRIV_IOCTL_SIOCGIWFREQ, - CMD_RTPRIV_IOCTL_SIOCGIWNAME, - CMD_RTPRIV_IOCTL_SIOCGIWRATE, - - /* wds */ - CMD_RTPRIV_IOCTL_WDS_INIT, - CMD_RTPRIV_IOCTL_WDS_REMOVE, - CMD_RTPRIV_IOCTL_WDS_STATS_GET, - - CMD_RTPRIV_IOCTL_MAC_ADDR_GET, - -#ifdef RT_CFG80211_SUPPORT - /* cfg802.11 */ - /* Note: All cfg commands must be continue. */ - /* CFG_TODO Sort by function */ - CMD_RTPRIV_IOCTL_80211_START, - CMD_RTPRIV_IOCTL_80211_CB_GET, - CMD_RTPRIV_IOCTL_80211_CB_SET, - CMD_RTPRIV_IOCTL_80211_CHAN_SET, - CMD_RTPRIV_IOCTL_80211_VIF_CHG, - CMD_RTPRIV_IOCTL_80211_SCAN, - CMD_RTPRIV_IOCTL_80211_IBSS_JOIN, - CMD_RTPRIV_IOCTL_80211_STA_LEAVE, - CMD_RTPRIV_IOCTL_80211_STA_GET, - CMD_RTPRIV_IOCTL_80211_STA_KEY_ADD, - CMD_RTPRIV_IOCTL_80211_STA_KEY_DEFAULT_SET, - CMD_RTPRIV_IOCTL_80211_POWER_MGMT_SET, - CMD_RTPRIV_IOCTL_80211_AP_KEY_DEFAULT_SET, - CMD_RTPRIV_IOCTL_80211_AP_KEY_DEFAULT_MGMT_SET, - CMD_RTPRIV_IOCTL_80211_CONNECT_TO, - CMD_RTPRIV_IOCTL_80211_RFKILL, - CMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO, - CMD_RTPRIV_IOCTL_80211_UNREGISTER, - CMD_RTPRIV_IOCTL_80211_BANDINFO_GET, - CMD_RTPRIV_IOCTL_80211_SURVEY_GET, - CMD_RTPRIV_IOCTL_80211_EXTRA_IES_SET, - CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_SET, - CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_REG, - CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK, - CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_SEND, - CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET, - CMD_RTPRIV_IOCTL_80211_ACTION_FRAME_REG, - CMD_RTPRIV_IOCTL_80211_BEACON_ADD, - CMD_RTPRIV_IOCTL_80211_BEACON_SET, - CMD_RTPRIV_IOCTL_80211_BEACON_DEL, - CMD_RTPRIV_IOCTL_80211_AP_KEY_ADD, - CMD_RTPRIV_IOCTL_80211_RTS_THRESHOLD_ADD, - CMD_RTPRIV_IOCTL_80211_FRAG_THRESHOLD_ADD, - CMD_RTPRIV_IOCTL_80211_CHANGE_BSS_PARM, - CMD_RTPRIV_IOCTL_80211_AP_KEY_DEL, - CMD_RTPRIV_IOCTL_80211_AP_PROBE_RSP_EXTRA_IE, - CMD_RTPRIV_IOCTL_80211_AP_ASSOC_RSP_EXTRA_IE, - CMD_RTPRIV_IOCTL_80211_PORT_SECURED, - CMD_RTPRIV_IOCTL_80211_AP_STA_DEL, - CMD_RTPRIV_IOCTL_80211_CANCEL_REMAIN_ON_CHAN_SET, - CMD_RTPRIV_IOCTL_80211_BITRATE_SET, - CMD_RTPRIV_IOCTL_80211_VIF_ADD, - CMD_RTPRIV_IOCTL_80211_VIF_DEL, - CMD_RTPRIV_IOCTL_80211_RESET, - CMD_RTPRIV_IOCTL_80211_P2PCLI_ASSSOC_IE_SET, - CMD_RTPRIV_IOCTL_80211_P2P_CLIENT_KEY_ADD, - CMD_RTPRIV_IOCTL_80211_CHANNEL_RESTORE, - CMD_RTPRIV_IOCTL_80211_SCAN_STATUS_LOCK_INIT, - CMD_RTPRIV_IOCTL_80211_NETDEV_EVENT, -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - CMD_RTPRIV_IOCTL_MCC_DHCP_PROTECT_STATUS, - CMD_RTPRIV_IOCTL_80211_SET_NOA, -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ -#ifdef RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT - CMD_RTPRIV_IOCTL_80211_ANDROID_PRIV_CMD, -#endif /* RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT */ -#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT - CMD_RTPRIV_IOCTL_80211_SEND_WIRELESS_EVENT, -#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */ -#ifdef CFG_TDLS_SUPPORT - /* new TDLS */ - CMD_RTPRIV_IOCTL_80211_STA_TDLS_INSERT_PENTRY, - CMD_RTPRIV_IOCTL_80211_STA_TDLS_SET_KEY_COPY_FLAG, -#endif -#ifdef APCLI_CFG80211_SUPPORT - CMD_RTPRIV_IOCTL_APCLI_SITE_SURVEY, -#endif /* APCLI_CFG80211_SUPPORT */ - CMD_RTPRIV_IOCTL_80211_REGISTER, - CMD_RTPRIV_IOCTL_80211_END, -#endif /* RT_CFG80211_SUPPORT */ - - CMD_RTPRIV_IOCTL_ADAPTER_CSO_SUPPORT_TEST, - CMD_RTPRIV_IOCTL_ADAPTER_TSO_SUPPORT_TEST, -#ifdef CONFIG_HAS_EARLYSUSPEND - CMD_RTPRIV_IOCTL_LOAD_FIRMWARE_CHECK, - CMD_RTPRIV_IOCTL_REGISTER_EARLYSUSPEND, - CMD_RTPRIV_IOCTL_UNREGISTER_EARLYSUSPEND, - CMD_RTPRIV_IOCTL_CHECK_EARLYSUSPEND, - CMD_RTPRIV_IOCTL_OS_COOKIE_GET, - CMD_RTPRIV_IOCTL_SET_SUSPEND_FLAG, -#endif - CMD_RTPRIV_IOCTL_SDIO_INIT, - CMD_RTPRIV_IOCTL_CHIP_PREPARE, -#ifdef PROFILE_PATH_DYNAMIC - CMD_RTPRIV_IOCTL_PROFILEPATH_SET, -#endif /* PROFILE_PATH_DYNAMIC */ -#ifdef APCLI_CFG80211_SUPPORT - CMD_RTPRIV_IOCTL_APCLI_NETDEV_GET, -#endif /* APCLI_CFG80211_SUPPORT */ -#ifdef DYNAMIC_VLAN_SUPPORT - CMD_RTPRIV_IOCTL_SET_STA_VLAN, -#endif -#ifdef HOSTAPD_11R_SUPPORT - CMD_RTPRIV_IOCTL_SET_FT_PARAM, -#endif /* HOSTAPD_11R_SUPPORT */ - /* can not exceed 0xa000 */ - CMD_RTPRIV_IOCTL_80211_COM_LATEST_ONE, -} CMD_RTPRIV_IOCTL_COMMON; - -#ifdef RT_CFG80211_SUPPORT -typedef struct __CMD_RTPRIV_IOCTL_80211_VIF_SET { - INT vifType; - char vifName[IFNAMSIZ]; - INT vifNameLen; -} CMD_RTPRIV_IOCTL_80211_VIF_SET; - -typedef struct __CMD_RTPRIV_IOCTL_80211_BSS_PARM { - INT use_cts_prot; - INT use_short_preamble; - INT use_short_slot_time; - UINT8 *basic_rates; - UINT8 basic_rates_len; - INT ap_isolate; - INT ht_opmode; - -} CMD_RTPRIV_IOCTL_80211_BSS_PARM; - -typedef struct __CMD_RTPRIV_IOCTL_80211_BEACON { - INT32 interval; - INT32 dtim_period; - UCHAR *beacon_head; - UCHAR *beacon_tail; - UINT32 beacon_head_len; /* Before TIM IE */ - UINT32 beacon_tail_len; /* After TIM IE */ - UINT32 apidx; - PNET_DEV pNetDev; - -#if (KERNEL_VERSION(3, 4, 0) <= LINUX_VERSION_CODE) - UCHAR *beacon_ies; - UINT32 beacon_ies_len; - UCHAR *proberesp_ies; - UINT32 proberesp_ies_len; - UCHAR *assocresp_ies; - UINT32 assocresp_ies_len; - UCHAR *probe_resp; - UINT32 probe_resp_len; - ULONG ssid_len; - CHAR ssid[32]; - UCHAR hidden_ssid; - struct cfg80211_crypto_settings crypto; - BOOLEAN privacy; - UCHAR auth_type; - INT32 inactivity_timeout; -#endif /* LINUX_VERSION_CODE: 3.4.0 */ -} CMD_RTPRIV_IOCTL_80211_BEACON; - -#define RT_CMD_80211_IFTYPE_UNSPECIFIED 0x00 -#define RT_CMD_80211_IFTYPE_ADHOC 0x01 -#define RT_CMD_80211_IFTYPE_STATION 0x02 -#define RT_CMD_80211_IFTYPE_AP 0x03 -#define RT_CMD_80211_IFTYPE_AP_VLAN 0x04 -#define RT_CMD_80211_IFTYPE_WDS 0x05 -#define RT_CMD_80211_IFTYPE_MONITOR 0x06 -#define RT_CMD_80211_IFTYPE_P2P_CLIENT 0x08 -#define RT_CMD_80211_IFTYPE_P2P_GO 0x09 -#define RT_CMD_80211_IFTYPE_P2P_DEVICE 0x10 - -/* Must sync with nl80211_channel_type@nl80211.h */ -#define RT_CMD_80211_CHANTYPE_NOHT 0x00 -#define RT_CMD_80211_CHANTYPE_HT20 0x01 -#define RT_CMD_80211_CHANTYPE_HT40MINUS 0x02 -#define RT_CMD_80211_CHANTYPE_HT40PLUS 0x03 -#define RT_CMD_80211_CHANTYPE_VHT80 0x04 - -typedef struct __CMD_RTPRIV_IOCTL_80211_CHAN { - UINT8 ChanId; - UINT8 CenterChanId; - UINT8 IfType; - UINT8 ChanType; - - UINT32 MonFilterFlag; - - UINT64 cookie; - PVOID chan; -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - PWIRELESS_DEV pWdev; -#endif /* LINUX_VERSION_CODE: 3.6.0 */ -} CMD_RTPRIV_IOCTL_80211_CHAN; - -#define RT_CMD_80211_FILTER_FCSFAIL 0x01 -#define RT_CMD_80211_FILTER_PLCPFAIL 0x02 -#define RT_CMD_80211_FILTER_CONTROL 0x04 -#define RT_CMD_80211_FILTER_OTHER_BSS 0x08 - -typedef struct __CMD_RTPRIV_IOCTL_80211_VIF_PARM { - PNET_DEV net_dev; - UINT8 newIfType; - UINT8 oldIfType; - - UINT32 MonFilterFlag; - -} CMD_RTPRIV_IOCTL_80211_VIF_PARM; - -typedef struct __CMD_RTPRIV_IOCTL_80211_IBSS { - UINT BeaconInterval; - UCHAR Ssid[33]; - UINT privacy; - PUCHAR BeaconExtraIe; - UINT BeaconExtraIeLen; -} CMD_RTPRIV_IOCTL_80211_IBSS; - -#define RT_CMD_80211_TXRATE_LEGACY 0x01 -#define RT_CMD_80211_TXRATE_BW_40 0x02 -#define RT_CMD_80211_TXRATE_SHORT_GI 0x04 - -typedef struct __CMD_RTPRIV_IOCTL_80211_STA { - UINT8 MAC[MAC_ADDR_LEN]; - ULONG DataRate; - - UINT32 TxRateFlags; - - UINT32 TxRateMCS; - INT32 Signal; - UINT32 TxPacketCnt; - UINT32 InactiveTime; - - UINT32 rx_packets; - UINT32 tx_packets; - UINT64 rx_bytes; - UINT64 tx_bytes; - UINT32 tx_retries; - UINT32 tx_failed; -} CMD_RTPRIV_IOCTL_80211_STA; - -#define RT_CMD_80211_KEY_WEP40 0x00 -#define RT_CMD_80211_KEY_WEP104 0x01 -#define RT_CMD_80211_KEY_WPA 0x02 - -#ifdef DOT11W_PMF_SUPPORT -#define RT_CMD_80211_KEY_AES_CMAC 0x03 -#endif /* DOT11W_PMF_SUPPORT */ - -typedef struct __CMD_RTPRIV_IOCTL_80211_KEY { - UINT8 KeyType; - UINT8 KeyBuf[50]; - UINT8 KeyId; - BOOLEAN bPairwise; - UINT8 KeyLen; - UINT32 cipher; - UINT8 MAC[MAC_ADDR_LEN]; - PNET_DEV pNetDev; -} CMD_RTPRIV_IOCTL_80211_KEY; - -#define RT_CMD_80211_CONN_ENCRYPT_NONE 0x01 -#define RT_CMD_80211_CONN_ENCRYPT_WEP 0x02 -#define RT_CMD_80211_CONN_ENCRYPT_TKIP 0x04 -#define RT_CMD_80211_CONN_ENCRYPT_CCMP 0x08 - -typedef struct __CMD_RTPRIV_IOCTL_80211_CONNECT { - UINT8 WpaVer; - BOOLEAN FlgIs8021x; - UINT8 AuthType; - - UINT8 PairwiseEncrypType; - UINT8 GroupwiseEncrypType; - - UINT8 *pKey; - UINT32 KeyLen; - UINT8 KeyIdx; - - UINT8 *pSsid; - UINT32 SsidLen; - - UINT8 *pBssid; - - BOOLEAN bWpsConnection; - PNET_DEV pNetDev; -#ifdef DOT11W_PMF_SUPPORT - BOOLEAN mfp; -#endif /* DOT11W_PMF_SUPPORT */ -} CMD_RTPRIV_IOCTL_80211_CONNECT; - -typedef struct __CMD_RTPRIV_IOCTL_80211_ASSOC_IE { - PNET_DEV pNetDev; - UINT8 *ie; - UINT32 ie_len; -} CMD_RTPRIV_IOCTL_80211_ASSOC_IE; - -typedef struct __CMD_RTPRIV_IOCTL_80211_REG_NOTIFY { - UCHAR Alpha2[2]; - VOID *pWiphy; -} CMD_RTPRIV_IOCTL_80211_REG_NOTIFY; - -typedef struct __CMD_RTPRIV_IOCTL_80211_SURVEY { - VOID *pCfg80211; - /* UINT64 ChannelTime; */ /* idle + busy, not support */ - UINT64 ChannelTimeBusy; - UINT64 ChannelTimeExtBusy; -} CMD_RTPRIV_IOCTL_80211_SURVEY; - -#ifdef HOSTAPD_MAP_SUPPORT /* This could be a generic fix */ -typedef struct __CMD_RTPRIV_IOCTL_AP_STA_DEL { - IN UINT8 *pSta_MAC; - IN struct wifi_dev *pWdev; -} CMD_RTPRIV_IOCTL_AP_STA_DEL; -#endif /* HOSTAPD_MAP_SUPPORT */ -#endif /* RT_CFG80211_SUPPORT */ - -/* station commands */ - -/* when adding any new type, please also add codes in LINUX_WEVENT_TRANSLATE */ -#define RT_WLAN_EVENT_CUSTOM 0x01 -#define RT_WLAN_EVENT_CGIWAP 0x02 -#define RT_WLAN_EVENT_ASSOC_REQ_IE 0x03 -#define RT_WLAN_EVENT_SCAN 0x04 -#define RT_WLAN_EVENT_EXPIRED 0x05 -#define RT_WLAN_EVENT_SHOWPIN 0x06 -#define RT_WLAN_EVENT_PIN 0x07 - -typedef struct __RT_CMD_RATE_SET { - IN UINT32 Rate; - IN UINT32 Fixed; -} RT_CMD_RATE_SET; - -typedef struct __RT_CMD_PARAM_SET { - IN RTMP_STRING *pThisChar; - IN RTMP_STRING *pValue; -} RT_CMD_PARAM_SET; - -typedef struct __RT_CMD_SHARED_KEY_ADD { - IN UCHAR KeyIdx; - IN BOOLEAN FlgHaveGTK; -} RT_CMD_SHARED_KEY_ADD; - -typedef struct __RT_CMD_MBSS_KICKOUT { - INT BssId; - USHORT Reason; -} RT_CMD_MBSS_KICKOUT; - -typedef struct __RT_CMD_USB_MORE_FLAG_CONFIG { - UINT32 VendorID; - UINT32 ProductID; -} RT_CMD_USB_MORE_FLAG_CONFIG; - -typedef struct __RT_CMD_USB_DEV_CONFIG { - UINT NumberOfPipes; - UINT8 BulkInEpAddr[2]; - USHORT BulkInMaxPacketSize; - UINT8 BulkOutEpAddr[6]; - USHORT BulkOutMaxPacketSize; - VOID *pConfig; -} RT_CMD_USB_DEV_CONFIG; - -typedef struct __RT_CMD_WAIT_QUEUE_LIST { - RTMP_OS_TASK *pMlmeTask; - RTMP_OS_TASK *pTimerTask; - RTMP_OS_TASK *pCmdQTask; - RTMP_OS_TASK *pWscTask; -} RT_CMD_WAIT_QUEUE_LIST; - -typedef struct __RT_CMD_INF_UP_DOWN { - IN int (*virtual_if_init_handler)(VOID *net_dev); - IN int (*virtual_if_deinit_handler)(VOID *net_dev); - IN int (*virtual_if_up_handler)(VOID *net_dev); - IN int (*virtual_if_down_handler)(VOID *net_dev); - PNET_DEV operation_dev_p; -} RT_CMD_INF_UP_DOWN; - -typedef struct __RT_CMD_STATS { - IN VOID *pNetDev; - - OUT VOID *pStats; /* point to pAd->stats */ - - OUT unsigned long rx_packets; /* total packets received */ - OUT unsigned long tx_packets; /* total packets transmitted */ - OUT unsigned long rx_bytes; /* total bytes received */ - OUT unsigned long tx_bytes; /* total bytes transmitted */ - OUT unsigned long rx_errors; /* bad packets received */ - OUT unsigned long tx_errors; /* packet transmit problems */ - OUT unsigned long multicast; /* multicast packets received */ - OUT unsigned long collisions; - - OUT unsigned long rx_over_errors; /* receiver ring buff overflow */ - OUT unsigned long rx_crc_errors; /* recved pkt with crc error */ - OUT unsigned long rx_frame_errors; /* recv'd frame alignment error */ - OUT unsigned long - rx_fifo_errors; /* recv'r fifo overrun */ -} RT_CMD_STATS; - -typedef struct __RT_CMD_IW_STATS { - ULONG priv_flags; - UCHAR *dev_addr; - - VOID *pStats; /* point to pAd->iw_stats */ - - UINT8 qual; - UINT8 level; - UINT8 noise; - UINT8 updated; -} RT_CMD_IW_STATS; - -typedef struct __RT_CMD_PCIE_INIT { - VOID *pPciDev; - UINT32 ConfigDeviceID; - UINT32 ConfigSubsystemVendorID; - UINT32 ConfigSubsystemID; - BOOLEAN pci_init_succeed; -} RT_CMD_PCIE_INIT; - -typedef struct __RT_CMD_AP_IOCTL_CONFIG { - VOID *net_dev; - VOID *wdev; - ULONG priv_flags; - char *pCmdData; - INT32 CmdId_RTPRIV_IOCTL_SET; - char *name; - INT apidx; - - INT32 Status; -} RT_CMD_AP_IOCTL_CONFIG; - -typedef struct __RT_CMD_IOCTL_INTERFACE_CONFIG { - VOID *net_dev; - VOID *wdev; - ULONG priv_flags; - char *name; - INT interface_idx; - - INT32 Status; -} RT_CMD_IOCTL_INTERFACE_CONFIG; - -typedef struct __RT_CMD_AP_IOCTL_SSID { - ULONG priv_flags; - INT apidx; - - char *pSsidStr; - INT32 length; -} RT_CMD_AP_IOCTL_SSID; - -#ifdef DYNAMIC_VLAN_SUPPORT -typedef struct __RT_CMD_AP_STA_VLAN { - UCHAR sta_addr[6]; - UINT32 vlan_id; -} RT_CMD_AP_STA_VLAN; -#endif - -#ifdef HOSTAPD_11R_SUPPORT -typedef struct __RT_CMD_AP_11R_PARAM { - UCHAR nas_identifier[64]; - INT nas_id_len; - UCHAR r1_key_holder[ETH_ALEN]; - UCHAR own_mac[ETH_ALEN]; - u32 reassociation_deadline; -} RT_CMD_AP_11R_PARAM; -#endif /* HOSTAPD_11R_SUPPORT */ - -typedef struct __RT_CMD_IOCTL_RATE { - IN ULONG priv_flags; - OUT UINT32 BitRate; -} RT_CMD_IOCTL_RATE; - -#define RTMP_CMD_STA_MODE_AUTO 0x00 -#define RTMP_CMD_STA_MODE_ADHOC 0x01 -#define RTMP_CMD_STA_MODE_INFRA 0x02 -#define RTMP_CMD_STA_MODE_MONITOR 0x03 - -typedef struct __RT_CMD_STA_IOCTL_FREQ { - IN INT32 m; /* Mantissa */ - IN INT16 e; /* Exponent */ -} RT_CMD_STA_IOCTL_FREQ; - -typedef struct __RT_CMD_STA_IOCTL_BSS { - OUT UCHAR Bssid[6]; - OUT UCHAR ChannelQuality; - OUT CHAR Rssi; - OUT CHAR Noise; -} RT_CMD_STA_IOCTL_BSS; - -typedef struct __RT_CMD_STA_IOCTL_BSS_LIST { - IN UINT32 MaxNum; - OUT UINT32 BssNum; - OUT RT_CMD_STA_IOCTL_BSS *pList; -} RT_CMD_STA_IOCTL_BSS_LIST; - -typedef struct __RT_CMD_STA_IOCTL_SCAN { - IN UCHAR FlgScanThisSsid; - IN UINT32 SsidLen; - IN CHAR *pSsid; - IN UINT ScanType; - OUT INT32 Status; -} RT_CMD_STA_IOCTL_SCAN; - -typedef struct __RT_CMD_STA_IOCTL_BSS_TABLE { - UCHAR Bssid[6]; - UCHAR Channel; - UCHAR BssType; - UCHAR HtCapabilityLen; - - UCHAR SupRate[12]; - UCHAR SupRateLen; - UCHAR ExtRate[12]; - UCHAR ExtRateLen; - - UCHAR SsidLen; - CHAR Ssid[32]; - - USHORT CapabilityInfo; - UCHAR ChannelWidth, ShortGIfor40, ShortGIfor20, MCSSet; - - USHORT WpaIeLen; - UCHAR *pWpaIe; - - USHORT RsnIeLen; - UCHAR *pRsnIe; - - USHORT WpsIeLen; - UCHAR *pWpsIe; - - UCHAR FlgIsPrivacyOn; - - RT_CMD_STA_IOCTL_BSS Signal; -} RT_CMD_STA_IOCTL_BSS_TABLE; - -typedef struct __RT_CMD_STA_IOCTL_SCAN_TABLE { - ULONG priv_flags; - UINT32 BssNr; - RT_CMD_STA_IOCTL_BSS_TABLE *pBssTable; /* must be freed by caller */ - UCHAR MainSharedKey[4][16]; -} RT_CMD_STA_IOCTL_SCAN_TABLE; - -typedef struct __RT_CMD_STA_IOCTL_SSID { - UCHAR FlgAnySsid; - UINT32 SsidLen; - CHAR *pSsid; - INT32 Status; -} RT_CMD_STA_IOCTL_SSID; - -typedef struct __RT_CMD_STA_IOCTL_NICK_NAME { - UINT NameLen; - CHAR *pName; -} RT_CMD_STA_IOCTL_NICK_NAME; - -typedef struct __RT_CMD_STA_IOCTL_SECURITY { - CHAR *pData; - UINT16 length; - INT32 KeyIdx; - INT32 MaxKeyLen; - -#define RT_CMD_STA_IOCTL_SECURITY_ALG_NONE 0x01 -#define RT_CMD_STA_IOCTL_SECURITY_ALG_WEP 0x02 -#define RT_CMD_STA_IOCTL_SECURITY_ALG_TKIP 0x03 -#define RT_CMD_STA_IOCTL_SECURITY_ALG_CCMP 0x04 - UINT32 Alg; - -#define RT_CMD_STA_IOCTL_SECURTIY_EXT_SET_TX_KEY 0x01 -#define RT_CMD_STA_IOCTL_SECURTIY_EXT_GROUP_KEY 0x02 - UINT16 ext_flags; - -#define RT_CMD_STA_IOCTL_SECURITY_DISABLED 0x01 -#define RT_CMD_STA_IOCTL_SECURITY_ENABLED 0x02 -#define RT_CMD_STA_IOCTL_SECURITY_RESTRICTED 0x04 -#define RT_CMD_STA_IOCTL_SECURITY_OPEN 0x08 -#define RT_CMD_STA_IOCTL_SECURITY_NOKEY 0x10 -#define RT_CMD_STA_IOCTL_SECURITY_MODE 0x20 - UINT16 flags; - - INT32 Status; -} RT_CMD_STA_IOCTL_SECURITY; - -typedef struct __RT_CMD_STA_IOCTL_WSC_U32_ITEM { - IN UINT32 *pUWrq; - OUT INT32 Status; -} RT_CMD_STA_IOCTL_WSC_U32_ITEM; - -typedef struct __RT_CMD_STA_IOCTL_WSC_STR_ITEM { - IN UINT32 Subcmd; - IN CHAR *pData; - IN UINT32 length; - - OUT INT32 Status; -} RT_CMD_STA_IOCTL_WSC_STR_ITEM; - -typedef struct __RT_CMD_STA_IOCTL_SHOW { - IN CHAR *pData; - IN UINT32 MaxSize; - IN UINT32 InfType; -} RT_CMD_STA_IOCTL_SHOW; - -#define RT_CMD_STA_IOCTL_IW_MLME_DEAUTH 0x01 -#define RT_CMD_STA_IOCTL_IW_MLME_DISASSOC 0x02 - -typedef struct __RT_CMD_STA_IOCTL_SECURITY_ADV { -#define RT_CMD_STA_IOCTL_WPA_VERSION 0x10 -#define RT_CMD_STA_IOCTL_WPA_VERSION1 0x11 -#define RT_CMD_STA_IOCTL_WPA_VERSION2 0x12 - -#define RT_CMD_STA_IOCTL_WPA_PAIRWISE 0x20 -#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_NONE 0x21 -#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_WEP40 0x22 -#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_WEP104 0x23 -#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_TKIP 0x24 -#define RT_CMD_STA_IOCTL_WPA_PAIRWISE_CCMP 0x25 - -#define RT_CMD_STA_IOCTL_WPA_GROUP 0x30 -#define RT_CMD_STA_IOCTL_WPA_GROUP_NONE 0x31 -#define RT_CMD_STA_IOCTL_WPA_GROUP_WEP40 0x32 -#define RT_CMD_STA_IOCTL_WPA_GROUP_WEP104 0x33 -#define RT_CMD_STA_IOCTL_WPA_GROUP_TKIP 0x34 -#define RT_CMD_STA_IOCTL_WPA_GROUP_CCMP 0x35 - -#define RT_CMD_STA_IOCTL_WPA_KEY_MGMT 0x40 -#define RT_CMD_STA_IOCTL_WPA_KEY_MGMT_1X 0x41 -#define RT_CMD_STA_IOCTL_WPA_KEY_MGMT_WPS 0x42 - -#define RT_CMD_STA_IOCTL_WPA_AUTH_RX_UNENCRYPTED_EAPOL 0x50 -#define RT_CMD_STA_IOCTL_WPA_AUTH_PRIVACY_INVOKED 0x60 -#define RT_CMD_STA_IOCTL_WPA_AUTH_DROP_UNENCRYPTED 0x70 - -#define RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG 0x80 -#define RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_SHARED 0x81 -#define RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_OPEN 0x82 -#define RT_CMD_STA_IOCTL_WPA_AUTH_80211_AUTH_ALG_LEAP 0x83 - -#define RT_CMD_STA_IOCTL_WPA_AUTH_WPA_ENABLED 0x90 - -#define RT_CMD_STA_IOCTL_WPA_AUTH_COUNTERMEASURES 0xA0 - - UINT32 flags; - UINT32 value; -} RT_CMD_STA_IOCTL_SECURITY_ADV; - -typedef struct __RT_CMD_STA_IOCTL_RSN_IE { - UINT32 length; - UCHAR *pRsnIe; -} RT_CMD_STA_IOCTL_RSN_IE; - -typedef struct __RT_CMD_STA_IOCTL_PMA_SA { -#define RT_CMD_STA_IOCTL_PMA_SA_FLUSH 0x01 -#define RT_CMD_STA_IOCTL_PMA_SA_REMOVE 0x02 -#define RT_CMD_STA_IOCTL_PMA_SA_ADD 0x03 - UINT32 Cmd; - UCHAR *pBssid; - UCHAR *pPmkid; -} RT_CMD_STA_IOCTL_PMA_SA; - -typedef struct __RT_CMD_USB_INIT { - VOID *pUsbDev; - UINT32 driver_info; -} RT_CMD_USB_INIT; - -#endif /* __RTMP_CMD_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_comm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_comm.h deleted file mode 100644 index 673cd4981f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_comm.h +++ /dev/null @@ -1,429 +0,0 @@ -/**************************************************************************** - - Module Name: - rtmp_comm.h - - Abstract: - All common definitions and macros for UTIL/DRIVER/NETIF. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - -***************************************************************************/ - -#ifndef __RT_COMM_H__ -#define __RT_COMM_H__ - -#define VENDOR_FEATURE1_SUPPORT -#ifdef BB_SOC -#define VENDOR_FEATURE3_SUPPORT -#endif - -/*#define MONITOR_FLAG_11N_SNIFFER_SUPPORT */ - -#ifdef VENDOR_FEATURE3_SUPPORT -#ifndef BB_SOC -#ifdef DOT1X_SUPPORT -#undef DOT1X_SUPPORT -#endif /* DOT1X_SUPPORT */ -#ifdef SYSTEM_LOG_SUPPORT -#undef SYSTEM_LOG_SUPPORT -#endif /* SYSTEM_LOG_SUPPORT */ -#endif -#ifdef LED_CONTROL_SUPPORT -#undef LED_CONTROL_SUPPORT -#endif /* LED_CONTROL_SUPPORT */ -#ifdef WSC_LED_SUPPORT -#undef WSC_LED_SUPPORT -#endif /* WSC_LED_SUPPORT */ -#endif /* VENDOR_FEATURE3_SUPPORT */ - -/* following macros are new features, enable it to reduce CPU loading */ -/* Group 1 */ -#define CFG_CPU_LOADING_DISABLE_IOREAD 1 -#define CFG_CPU_LOADING_RXRING_DLY 0 - -/* Group 2 */ -#define CFG_CPU_LOADING_DISABLE_TXDONE0 1 -#define CFG_CPU_LOADING_DMADONE 0 - -#ifdef VENDOR_FEATURE1_SUPPORT -#define FIFO_STAT_READ_PERIOD 4 -#else -#define FIFO_STAT_READ_PERIOD 0 -#endif /* VENDOR_FEATURE1_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT - -#ifndef VENDOR_FEATURE3_SUPPORT -#define AP_QLOAD_SUPPORT -#endif /* VENDOR_FEATURE3_SUPPORT */ - -#endif /* CONFIG_AP_SUPPORT */ - -/* ======================== Before include files ============================ */ -/* - 14 channels @2.4G + 12@UNII(lower/middle) + 16@HiperLAN2 + 11@UNII(upper) + 0 @Japan + 1 as NULL termination - Refer to CH_HZ_ID_MAP[] in rt_channel.c -*/ -#ifdef DOT11_VHT_AC -#define MAX_NUM_OF_CHS \ - (54 + 5) /* 5 channels for central channel of VHT 80MHz */ -#else -#define MAX_NUM_OF_CHS 54 -#endif /* DOT11_VHT_AC*/ -#ifndef WAPP_SUPPORT -/* 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL termination */ -#define MAX_NUM_OF_CHANNELS MAX_NUM_OF_CHS -#define MAX_NUM_OF_SUB_CHANNELS \ - (MAX_NUM_OF_CHANNELS / 2) /*Assume half size for sub channels*/ -#endif - -#include "rtmp_type.h" -#include "rtmp_os.h" -#include "common/debug.h" -#include "common/link_list.h" -#include "rtmp_cmd.h" -#include "cmm_cmd.h" -#include "hw_ctrl.h" -#include "iface/iface_util.h" -#ifdef SNIFFER_SUPPORT -#include "sniffer/sniffer.h" -#endif /* SNIFFER_SUPPORT */ -#ifdef MEM_ALLOC_INFO_SUPPORT -#include "meminfo_list.h" -#endif /* MEM_ALLOC_INFO_SUPPORT */ - -/* ======================== Definition ====================================== */ -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -#define BIT0 (1 << 0) -#define BIT1 (1 << 1) -#define BIT2 (1 << 2) -#define BIT3 (1 << 3) -#define BIT4 (1 << 4) -#define BIT5 (1 << 5) -#define BIT6 (1 << 6) -#define BIT7 (1 << 7) -#define BIT8 (1 << 8) -#define BIT9 (1 << 9) -#define BIT10 (1 << 10) -#define BIT11 (1 << 11) -#define BIT12 (1 << 12) -#define BIT13 (1 << 13) -#define BIT14 (1 << 14) -#define BIT15 (1 << 15) -#define BIT16 (1 << 16) -#define BIT17 (1 << 17) -#define BIT18 (1 << 18) -#define BIT19 (1 << 19) -#define BIT20 (1 << 20) -#define BIT21 (1 << 21) -#define BIT22 (1 << 22) -#define BIT23 (1 << 23) -#define BIT24 (1 << 24) -#define BIT25 (1 << 25) -#define BIT26 (1 << 26) -#define BIT27 (1 << 27) -#define BIT28 (1 << 28) -#define BIT29 (1 << 29) -#define BIT30 (1 << 30) -#define BIT31 (1 << 31) - -/* definition of pAd->OpMode */ -#define OPMODE_STA 0 -#define OPMODE_AP 1 -#define OPMODE_ADHOC \ - 2 /*Carter add, align the number definition as MT hw arb module. */ -#define OPMODE_APSTA 3 /* as AP and STA at the same time */ - -#define MAIN_MBSSID 0 -#define FIRST_MBSSID 1 - -/* Endian byte swapping codes */ -#define SWAP16(x) \ - ((UINT16)((((UINT16)(x) & (UINT16)0x00ffU) << 8) | \ - (((UINT16)(x) & (UINT16)0xff00U) >> 8))) - -#define SWAP32(x) \ - ((UINT32)((((UINT32)(x) & (UINT32)0x000000ffUL) << 24) | \ - (((UINT32)(x) & (UINT32)0x0000ff00UL) << 8) | \ - (((UINT32)(x) & (UINT32)0x00ff0000UL) >> 8) | \ - (((UINT32)(x) & (UINT32)0xff000000UL) >> 24))) - -#define SWAP64(x) \ - ((UINT64)((UINT64)(((UINT64)(x) & (UINT64)0x00000000000000ffULL) \ - << 56) | \ - (UINT64)(((UINT64)(x) & (UINT64)0x000000000000ff00ULL) \ - << 40) | \ - (UINT64)(((UINT64)(x) & (UINT64)0x0000000000ff0000ULL) \ - << 24) | \ - (UINT64)(((UINT64)(x) & (UINT64)0x00000000ff000000ULL) \ - << 8) | \ - (UINT64)(((UINT64)(x) & (UINT64)0x000000ff00000000ULL) >> \ - 8) | \ - (UINT64)(((UINT64)(x) & (UINT64)0x0000ff0000000000ULL) >> \ - 24) | \ - (UINT64)(((UINT64)(x) & (UINT64)0x00ff000000000000ULL) >> \ - 40) | \ - (UINT64)(((UINT64)(x) & (UINT64)0xff00000000000000ULL) >> \ - 56))) - -#ifdef RT_BIG_ENDIAN - -#define cpu2le64(x) SWAP64((x)) -#define le2cpu64(x) SWAP64((x)) -#define cpu2le32(x) SWAP32((x)) -#define le2cpu32(x) SWAP32((x)) -#define cpu2le16(x) SWAP16((x)) -#define le2cpu16(x) SWAP16((x)) -#define cpu2be64(x) ((UINT64)(x)) -#define be2cpu64(x) ((UINT64)(x)) -#define cpu2be32(x) ((UINT32)(x)) -#define be2cpu32(x) ((UINT32)(x)) -#define cpu2be16(x) ((UINT16)(x)) -#define be2cpu16(x) ((UINT16)(x)) - -#else /* Little_Endian */ - -#define cpu2le64(x) ((UINT64)(x)) -#define le2cpu64(x) ((UINT64)(x)) -#define cpu2le32(x) ((UINT32)(x)) -#define le2cpu32(x) ((UINT32)(x)) -#define cpu2le16(x) ((UINT16)(x)) -#define le2cpu16(x) ((UINT16)(x)) -#define cpu2be64(x) SWAP64((x)) -#define be2cpu64(x) SWAP64((x)) -#define cpu2be32(x) SWAP32((x)) -#define be2cpu32(x) SWAP32((x)) -#define cpu2be16(x) SWAP16((x)) -#define be2cpu16(x) SWAP16((x)) - -#endif /* RT_BIG_ENDIAN */ - -#define MAX_CUSTOM_LEN 128 - -#define MONITOR_MAX_DEV_NUM 0 -#ifdef SNIFFER_SUPPORT -#undef MONITOR_MAX_DEV_NUM -#ifdef DBDC_MODE -#define MONITOR_MAX_DEV_NUM 2 -#else -#define MONITOR_MAX_DEV_NUM 1 -#endif -#endif -#define RX_BUFFER_SIZE_MIN 14 -/* */ -/* IEEE 802.11 Structures and definitions */ -/* */ -#define MAX_TX_POWER_LEVEL 100 /* mW */ -#define MAX_RSSI_TRIGGER -10 /* dBm */ -#define MIN_RSSI_TRIGGER -200 /* dBm */ -#define MAX_FRAG_THRESHOLD 2346 /* byte count */ -#define MIN_FRAG_THRESHOLD 256 /* byte count */ -#define DEFAULT_FRAG_THLD (MAX_FRAG_THRESHOLD) -#define MAX_RTS_PKT_THRESHOLD 0xFF /* max. pkt count */ -#define MAX_RTS_THRESHOLD 0xfffff /* max. byte count */ -#define DEFAULT_RTS_PKT_THLD 0x2 /*2*/ -#define DEFAULT_RTS_LEN_THLD 0x92B /*2347*/ - -typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE { - Ndis802_11IBSS, - Ndis802_11Infrastructure, - Ndis802_11AutoUnknown, - Ndis802_11Monitor, - Ndis802_11InfrastructureMax /* Not a real value, defined as upper bound */ -} NDIS_802_11_NETWORK_INFRASTRUCTURE, - *PNDIS_802_11_NETWORK_INFRASTRUCTURE; - -/* ======================== Memory ========================================== */ -#ifdef VENDOR_FEATURE2_SUPPORT - -extern ULONG OS_NumOfPktAlloc, OS_NumOfPktFree; - -#define NUMOfPKTALLOC() (OS_NumOfPktAlloc++); -#define NUMOfPKTFREE() (OS_NumOfPktFree++); -#else -#define NUMOfPKTALLOC() -#define NUMOfPKTFREE() -#endif /* VENDOR_FEATURE2_SUPPORT */ - -#ifdef MEM_ALLOC_INFO_SUPPORT -extern MEM_INFO_LIST PktInfoList; - -#define MEM_DBG_PKT_ALLOC_INC(__pPacket) \ - { \ - MIListAddHead(&PktInfoList, 0, __pPacket, \ - __builtin_return_address(0)); \ - NUMOfPKTALLOC(); \ - } -#define MEM_DBG_PKT_FREE_INC(__pPacket) \ - { \ - if (MIListRemove(&PktInfoList, __pPacket) == NULL) { \ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("the packet has not been allocated\n")); \ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("mem addr = %p, caller is %pS\n", __pPacket, \ - __builtin_return_address(0))); \ - dump_stack(); \ - } \ - NUMOfPKTFREE(); \ - } -#else -#define MEM_DBG_PKT_ALLOC_INC(__pPacket) -#define MEM_DBG_PKT_FREE_INC(__pPacket) -#endif /* MEM_ALLOC_INFO_SUPPORT */ - -/* All PHY rate summary in TXD */ -/* Preamble MODE in TxD */ -#define MODE_CCK 0 -#define MODE_OFDM 1 -#ifdef DOT11_N_SUPPORT -#define MODE_HTMIX 2 -#define MODE_HTGREENFIELD 3 -#endif /* DOT11_N_SUPPORT */ -#define MODE_VHT 4 - -#ifdef NO_CONSISTENT_MEM_SUPPORT -/* current support RXD_SIZE = 16B and cache line = 16 or 32B */ -#define RTMP_DCACHE_FLUSH(__AddrStart, __Size) \ - RtmpOsDCacheFlush((ULONG)(__AddrStart), (ULONG)(__Size)) -#else -#define RTMP_DCACHE_FLUSH(__AddrStart, __Size) -#endif /* NO_CONSISTENT_MEM_SUPPORT */ - -/* ======================== Interface ======================================= */ - -#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT) -#define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd) if (_pAd->OpMode == OPMODE_AP) -#define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd) if (_pAd->OpMode == OPMODE_STA) -#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode) if (__OpMode == OPMODE_AP) -#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode) if (__OpMode == OPMODE_STA) -#else -#define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd) -#define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd) -#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode) -#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode) -#endif - -/*********************************************************************************** - * IOCTL related definitions and data structures. - **********************************************************************************/ -typedef struct __RTMP_IOCTL_INPUT_STRUCT { - union { - char ifrn_name[IFNAMSIZ]; /* if name, e.g. "eth0" */ - } ifr_ifrn; - union { - CHAR *name; - struct { - CHAR *pointer; - UINT16 length; - UINT16 flags; - } data; - } u; -} RTMP_IOCTL_INPUT_STRUCT; - -#define RT_CMD_STATUS_TRANSLATE(__Status) \ - { \ - if (__Status == RTMP_IO_EINVAL) \ - __Status = -EINVAL; \ - else if (__Status == RTMP_IO_EOPNOTSUPP) \ - __Status = -EOPNOTSUPP; \ - else if (__Status == RTMP_IO_EFAULT) \ - __Status = -EFAULT; \ - else if (__Status == RTMP_IO_E2BIG) \ - __Status = -E2BIG; \ - else if (__Status == RTMP_IO_ENOMEM) \ - __Status = -ENOMEM; \ - else if (__Status == RTMP_IO_EAGAIN) \ - __Status = -EAGAIN; \ - else if (__Status == RTMP_IO_ENOTCONN) \ - __Status = -ENOTCONN; \ - } - -/* ======================== Timer =========================================== */ -typedef struct _LIST_RESOURCE_OBJ_ENTRY { - struct _LIST_RESOURCE_OBJ_ENTRY *pNext; - VOID *pRscObj; -} LIST_RESOURCE_OBJ_ENTRY, *PLIST_RESOURCE_OBJ_ENTRY; - -/* ======================== IC =========================================== */ -#define RFIC_24GHZ 0x01 -#define RFIC_5GHZ 0x02 -#define RFIC_DUAL_BAND (RFIC_24GHZ | RFIC_5GHZ) - -/* ======================== CFG80211 ======================================== */ -#define RT_CFG80211_DEBUG /* debug use */ - -#ifdef RT_CFG80211_DEBUG -#define CFG80211DBG(__Flg, __pMsg) \ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, __Flg, __pMsg) -#else -#define CFG80211DBG(__Flg, __pMsg) -#endif /* RT_CFG80211_DEBUG */ - -/* 1 ~ 14 */ -#define CFG80211_NUM_OF_CHAN_2GHZ 14 - -/* 36 ~ 64, 100 ~ 136, 140 ~ 161 */ -#define CFG80211_NUM_OF_CHAN_5GHZ \ - (sizeof(Cfg80211_Chan) - CFG80211_NUM_OF_CHAN_2GHZ) - -/* ======================== Packet ========================================== */ -#define LENGTH_802_11 24 -#define LENGTH_802_11_AND_H 30 -#define LENGTH_802_11_CRC_H 34 -#define LENGTH_802_11_CRC 28 -#define LENGTH_802_11_WITH_ADDR4 30 -#define LENGTH_802_3 14 -#define LENGTH_802_3_TYPE 2 -#define LENGTH_802_1_H 8 -#define LENGTH_EAPOL_H 4 -#define LENGTH_WMMQOS_H 2 -#define LENGTH_CRC 4 -#define MAX_SEQ_NUMBER 0x0fff -#define LENGTH_802_3_NO_TYPE 12 -#define LENGTH_802_1Q 4 /* VLAN related */ - -/* - Packet information for NdisQueryPacket -*/ -typedef struct _PACKET_INFO { - UINT PhysicalBufferCount; /* Physical breaks of buffer descripor chained */ - UINT BufferCount; /* Number of Buffer descriptor chained */ - UINT TotalPacketLength; /* Self explained */ - PNDIS_BUFFER pFirstBuffer; /* Pointer to first buffer descriptor */ -} PACKET_INFO, *PPACKET_INFO; - -#define MAC_ADDR_LEN 6 - -#define IS_BM_MAC_ADDR(Addr) (((Addr[0]) & 0x01) == 0x01) -#define IS_MULTICAST_MAC_ADDR(Addr) \ - ((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) != 0xff)) -#define IS_BROADCAST_MAC_ADDR(Addr) ((((Addr[0]) & 0xff) == 0xff)) - -#define RLT_MAC_BASE 0x01 -#define MT_MAC_BASE 0x2 - -#ifdef USB_IOT_WORKAROUND2 -#define W2_IOT_MAX_PADDING_SIZE 1028 /* 512+512+4 */ -#define W2_MAX_TX_SIZE 3000 -#define W2_MAX_HTTX_SIZE 32768 -#endif - -#define MAX_NUM_OF_INF 3 - -#ifdef MULTI_INF_SUPPORT -/* Index 0 for 2.4G, 1 for 5Ghz Card */ -extern VOID *adapt_list[MAX_NUM_OF_INF]; -#endif /* MULTI_INF_SUPPORT */ -#ifdef CREATE_ALL_INTERFACE_AT_INIT -#define MAX_MBSS_NUM 8 -#endif -#endif /* __RT_COMM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_def.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_def.h deleted file mode 100644 index 47083446fa..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_def.h +++ /dev/null @@ -1,2491 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rtmp_def.h - - Abstract: - Miniport related definition header - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Paul Lin 08-01-2002 created - John Chang 08-05-2003 add definition for 11g & other drafts -*/ -#ifndef __RTMP_DEF_H__ -#define __RTMP_DEF_H__ - -#include "oid.h" -#include "oid_struct.h" - -#undef AP_WSC_INCLUDED -#undef STA_WSC_INCLUDED -#undef WSC_INCLUDED - -#ifdef CONFIG_AP_SUPPORT -#ifdef WSC_AP_SUPPORT -#define AP_WSC_INCLUDED -#endif /* WSC_AP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#if defined(AP_WSC_INCLUDED) || defined(STA_WSC_INCLUDED) -#define WSC_INCLUDED -#endif - -#define BAND_5G 1 -#define BAND_24G 2 -#define BAND_BOTH (BAND_5G | BAND_24G) -#ifdef MAP_R2 -#define DFS_CAC_R2 -#endif -#undef PS_QUEUE_INC_SUPPORT -/*#define PS_QUEUE_INC_SUPPORT*/ -#ifdef SNMP_SUPPORT -/* for snmp, to get manufacturer OUI, 2008_0220 */ -#define ManufacturerOUI_LEN 3 -#define ManufacturerNAME ("Ralink Technology Company.") -#define ResourceTypeIdName ("Ralink_ID") -#endif - -#ifndef IPV4_ADDR_LEN -#define IPV4_ADDR_LEN 4 -#endif - -#define RALINK_2883_VERSION ((UINT32)0x28830300) -#define RALINK_2880E_VERSION ((UINT32)0x28720200) -#define RALINK_3883_VERSION ((UINT32)0x38830400) -#define RALINK_3070_VERSION ((UINT32)0x30700200) - -#define MAX_MGMT_PKT_LEN 2304 /* MMPDU size limit */ -#define MAX_RX_PKT_LEN 1520 - -#define PCI_VIRT_TO_PHYS(__Addr) (((UINT32)(__Addr)) & 0x0FFFFFFF) - -#ifdef MULTIPLE_CARD_SUPPORT -/* MC: Multple Cards */ -#define MAX_NUM_OF_MULTIPLE_CARD 32 -#endif /* MULTIPLE_CARD_SUPPORT */ - -#ifdef MEMORY_OPTIMIZATION -#define MAX_RX_PROCESS 32 -#else -#ifdef BB_SOC -#define MAX_RX_PROCESS 64 -#else -#define MAX_RX_PROCESS 128 /*64 //32 */ -#endif /* BB_SOC */ -#endif -#define NUM_OF_LOCAL_TXBUF 2 -#define TXD_SIZE 16 /* TXD_SIZE = TxD + TxInfo */ -#define RXD_SIZE 16 - -#define RXINFO_OFFSET 12 -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#define NUM_OF_UP 17 /*number of user priority: 4set WMM + non QoS*/ -#else -#define NUM_OF_UP 9 /*number of user priority: 2set WMM + non QoS*/ -#endif - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#define TX_DMA_1ST_BUFFER_SIZE \ - 128 /* only the 1st physical buffer is pre-allocated */ -#else -/* TXINFO_SIZE + TXWI_SIZE + 802.11 Header Size + AMSDU sub frame header */ -#define TX_DMA_1ST_BUFFER_SIZE \ - 96 /* only the 1st physical buffer is pre-allocated */ -#endif /* defined(MT7615) || defined(MT7622) */ - -#ifdef CSD_VERIFICATION -#define RX_BUFFER_AGGRESIZE 4224 -#else -#define RX_BUFFER_AGGRESIZE 1900 /*3904 //3968 //4096 //2048 //4096 */ -#endif -#define RX1_BUFFER_SIZE 1700 -#define RX_BUFFER_NORMSIZE 3840 /*3904 //3968 //4096 //2048 //4096 */ -#define TX_BUFFER_NORMSIZE RX_BUFFER_NORMSIZE -#define MAX_FRAME_SIZE 2346 /* Maximum 802.11 frame size */ -#define MAX_AGGREGATION_SIZE 3840 /*3904 //3968 //4096 */ -#define MAX_NUM_OF_TUPLE_CACHE 2 -#define MAX_MCAST_LIST_SIZE 32 -#define MAX_LEN_OF_VENDOR_DESC 64 -/*#define MAX_SIZE_OF_MCAST_PSQ (NUM_OF_LOCAL_TXBUF >> 2) // AP won't spend more than 1/4 of total buffers on M/BCAST PSQ */ -#define MAX_SIZE_OF_MCAST_PSQ 32 - -#define MAX_RX_PROCESS_CNT 64 -#define MAX_RX1_PROCESS_CNT 64 -#define RX_SW_READ_IDX_INC_THD 5 - -#ifdef WLAN_SKB_RECYCLE -#define NUM_RX_DESC 128 -#endif /* WLAN_SKB_RECYCLE */ - -/* - WMM Note: If memory of your system is not much, please reduce the definition; - or when you do WMM test, the queue for low priority AC will be full, i.e. - TX_RING_SIZE + MAX_PACKETS_IN_QUEUE packets for the AC will be buffered in - WLAN, maybe no any packet buffer can be got in Ethernet driver. - - Sometimes no packet buffer can be got in Ethernet driver, the system will - send flow control packet to the sender to slow down its sending rate. - So no WMM can be saw in the air. -*/ - -/* - Need to use 64 in vxworks for test case WMM A5-T07 - Two dnlink (10Mbps) from a WMM station to a non-WMM station. - If use 256, queue is not enough. - And in rt_main_end.c, clConfig.clNum = RX_RING_SIZE * 3; is changed to - clConfig.clNum = RX_RING_SIZE * 4; -*/ - -#define MAX_PACKETS_IN_MCAST_PS_QUEUE 32 -#define MAX_PACKETS_IN_PS_QUEUE 128 /*32 */ -#define WMM_NUM_OF_AC 4 /* AC0, AC1, AC2, and AC3 */ -#define WMM_NUM 4 - -#ifdef CONFIG_AP_SUPPORT -#ifdef IGMP_SNOOP_SUPPORT -#ifdef MEMORY_OPTIMIZATION -#define MAX_LEN_OF_MULTICAST_FILTER_TABLE 16 -#define MULTICAST_WHITE_LIST_SIZE_MAX 20 -#else -#define MAX_LEN_OF_MULTICAST_FILTER_TABLE 64 -#define MULTICAST_WHITE_LIST_SIZE_MAX 20 -#endif -#ifdef IGMP_TVM_SUPPORT -#define MULTICAST_BLACK_LIST_STATIC_SIZE 3 -#define MULTICAST_BLACK_LIST_SIZE_MAX (20 + MULTICAST_BLACK_LIST_STATIC_SIZE) -#endif /* IGMP_TVM_SUPPORT */ - -/* Size of hash tab must be power of 2. */ -#define MAX_LEN_OF_MULTICAST_FILTER_HASH_TABLE \ - ((MAX_LEN_OF_MULTICAST_FILTER_TABLE)*2) -#define FREE_MEMBER_POOL_SIZE 64 -#endif /* IGMP_SNOOP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifndef IPV4_ADDR_LEN -#define IPV4_ADDR_LEN 4 -#endif - -#define MAX_AGG_3SS_BALIMIT 31 - -/* RxFilter */ -#define STANORMAL 0x17f97 -#define APNORMAL 0x15f97 - -#ifdef EXT_BUILD_CHANNEL_LIST -#define MAX_PRECONFIG_DESP_ENTRY_SIZE 11 -#endif /* EXT_BUILD_CHANNEL_LIST */ - -#ifdef HW_COEXISTENCE_SUPPORT -#define WLAN_WIFI_ACT_PULL_HIGH 0x124C -#endif /* HW_COEXISTENCE_SUPPORT */ -#ifdef BT_COEXISTENCE_SUPPORT -#define WLAN_WIFI_ACT_PULL_LOW 0x024C -#endif /* BT_COEXISTENCE_SUPPORT */ - -/* - RTMP_ADAPTER flags -*/ -/* #define fRTMP_ADAPTER_INTERRUPT_IN_USE 0x00000002 */ -#define fRTMP_ADAPTER_INTERRUPT_REGISTER_TO_OS 0x00000002 -/*Used for checking System Ready (means AP/STA Mlme ready)*/ -#define fRTMP_ADAPTER_SYSEM_READY 0x00000004 -#define fRTMP_SG 0x00000008 /* Scatter and Gather */ - -#define fRTMP_ADAPTER_HALT_IN_PROGRESS 0x00000040 - -#define fRTMP_ADAPTER_NIC_NOT_EXIST 0x00000100 -/* #define fRTMP_ADAPTER_TX_RING_ALLOCATED 0x00000200 */ -#define fRTMP_ADAPTER_REMOVE_IN_PROGRESS 0x00000400 -#define fRTMP_ADAPTER_MIMORATE_INUSED 0x00000800 - -/* #define fRTMP_ADAPTER_RX_RING_ALLOCATED 0x00001000 */ -#define fRTMP_ADAPTER_INTERRUPT_ACTIVE 0x00002000 -#define fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS 0x00004000 -#define fRTMP_ADAPTER_REASSOC_IN_PROGRESS 0x00008000 - -#define fRTMP_ADAPTER_RADIO_OFF 0x00020000 -#define fRTMP_ADAPTER_BULKOUT_RESET 0x00040000 -#define fRTMP_ADAPTER_BULKIN_RESET 0x00080000 - -#define fRTMP_ADAPTER_RDG_ACTIVE 0x00100000 -#define fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE 0x00200000 -#define fRTMP_ADAPTER_RALINK_BURST_MODE 0x00400000 -#define fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET 0x00800000 - -#define fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD 0x01000000 -#define fRTMP_ADAPTER_CMD_RADIO_OFF 0x02000000 -#define fRTMP_ADAPTER_RADIO_MEASUREMENT 0x08000000 - -#define fRTMP_ADAPTER_START_UP \ - 0x10000000 /*Devive already initialized and enabled Tx/Rx. */ -/* #ifdef CONFIG_PM */ -/* #ifdef USB_SUPPORT_SELECTIVE_SUSPEND */ -#define fRTMP_ADAPTER_SUSPEND 0x20000000 -/* #endif */ /* USB_SUPPORT_SELECTIVE_SUSPEND */ -/* #endif */ /* CONFIG_PM */ -/* #define fRTMP_ADAPTER_MEDIA_STATE_CHANGE 0x20000000 */ -#define fRTMP_ADAPTER_IDLE_RADIO_OFF 0x40000000 -#define fRTMP_ADAPTER_POLL_IDLE 0x80000000 - -#define fRTMP_ADAPTER_DISABLE_DOT_11N 0x00000001 -#define fRTMP_ADAPTER_WSC_PBC_PIN0 0x00000002 -#define fRTMP_ADAPTER_DISABLE_DEQUEUE 0x00000004 - -#define PHY_CAP_2G(_x) (((_x)&fPHY_CAP_24G) == fPHY_CAP_24G) -#define PHY_CAP_5G(_x) (((_x)&fPHY_CAP_5G) == fPHY_CAP_5G) -#define PHY_CAP_N(_x) (((_x)&fPHY_CAP_HT) == fPHY_CAP_HT) -#define PHY_CAP_AC(_x) (((_x)&fPHY_CAP_VHT) == fPHY_CAP_VHT) -#ifndef WAPP_SUPPORT -enum WIFI_MODE { - WMODE_INVALID = 0, - WMODE_A = 1 << 0, - WMODE_B = 1 << 1, - WMODE_G = 1 << 2, - WMODE_GN = 1 << 3, - WMODE_AN = 1 << 4, - WMODE_AC = 1 << 5, - WMODE_COMP = - 6, /* total types of supported wireless mode, add this value once yow add new type */ -}; -#endif - -#define WMODE_CAP_5G(_x) (((_x) & (WMODE_A | WMODE_AN | WMODE_AC)) != 0) -#define WMODE_CAP_2G(_x) (((_x) & (WMODE_B | WMODE_G | WMODE_GN)) != 0) -#define WMODE_CAP_N(_x) (((_x) & (WMODE_GN | WMODE_AN)) != 0) -#define WMODE_CAP_AC(_x) (((_x) & (WMODE_AC)) != 0) -#define WMODE_CAP(_x, _mode) (((_x) & (_mode)) != 0) - -#define WMODE_EQUAL(_x, _mode) ((_x) == (_mode)) - -#define WMODE_5G_ONLY(_x) (((_x) & (WMODE_B | WMODE_G | WMODE_GN)) == 0) -#define WMODE_2G_ONLY(_x) (((_x) & (WMODE_A | WMODE_AN | WMODE_AC)) == 0) -#define WMODE_HT_ONLY(_x) (((_x) & (~(WMODE_GN | WMODE_AN | WMODE_AC))) == 0) -#define WMODE_VHT_ONLY(_x) (((_x) & (~(WMODE_AC))) == 0) - -/*define for DBDC chip support check*/ -#define IS_CAP_DBDC(_cap) (_cap.asic_caps & fASIC_CAP_DBDC) - -#define IS_CAP_BW160(_cap) \ - ((_cap->phy_caps & (fPHY_CAP_BW160NC | fPHY_CAP_BW160C)) != 0) - -/* - STA operation status flags -*/ -#define fSTA_STATUS_INFRA_ON 0x00000001 -/* #define fOP_STATUS_INFRA_ON 0x00000001 */ -#define fOP_STATUS_ADHOC_ON 0x00000002 -#define fOP_STATUS_BG_PROTECTION_INUSED 0x00000004 -#ifdef CONFIG_AP_SUPPORT -#define fOP_STATUS_SHORT_SLOT_INUSED 0x00000008 -#endif -#define fOP_STATUS_SHORT_PREAMBLE_INUSED 0x00000010 -#define fOP_STATUS_RECEIVE_DTIM 0x00000020 -/*#define fOP_STATUS_TX_RATE_SWITCH_ENABLED 0x00000040 */ -#ifdef CONFIG_AP_SUPPORT -#define fOP_STATUS_MEDIA_STATE_CONNECTED 0x00000080 -#endif -#define fOP_STATUS_WMM_INUSED 0x00000100 -#define fOP_STATUS_DOZE 0x00000400 /* debug purpose */ -#define fOP_STATUS_APSD_INUSED 0x00001000 -#define fOP_STATUS_TX_AMSDU_INUSED 0x00002000 -#define fOP_STATUS_MAX_RETRY_ENABLED 0x00004000 -#define fOP_STATUS_WAKEUP_NOW 0x00008000 -#define fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE 0x00020000 - -#define fOP_AP_STATUS_MEDIA_STATE_CONNECTED 0x00200000 - -/* - RTMP_ADAPTER PSFlags : related to advanced power save -*/ -/* Indicate whether driver can go to sleep mode from now. This flag is useful AFTER link up */ -#define fRTMP_PS_CAN_GO_SLEEP 0x00000001 -/* Indicate whether driver has issue a LinkControl command to PCIe L1 */ -#define fRTMP_PS_SET_PCI_CLK_OFF_COMMAND 0x00000002 -/* Indicate driver should disable kick off hardware to send packets from now. */ -#define fRTMP_PS_DISABLE_TX 0x00000004 -/* Indicate driver should IMMEDIATELY fo to sleep after receiving AP's beacon in which doesn't indicate unicate nor multicast packets for me */ -/* This flag is used ONLY in RTMPHandleRxDoneInterrupt routine. */ -#define fRTMP_PS_GO_TO_SLEEP_NOW 0x00000008 -#define fRTMP_PS_TOGGLE_L1 \ - 0x00000010 /* Use Toggle L1 mechanism for rt28xx PCIe */ - -#define fRTMP_PS_MCU_SLEEP 0x00000020 - -#define WAKE_MCU_CMD 0x31 -#define SLEEP_MCU_CMD 0x30 -#define RFOFF_MCU_CMD 0x35 - -#ifdef DOT11N_DRAFT3 -#define fOP_STATUS_SCAN_2040 0x00040000 -#endif /* DOT11N_DRAFT3 */ - -#define CCKSETPROTECT 0x1 -#define OFDMSETPROTECT 0x2 -#define MM20SETPROTECT 0x4 -#define MM40SETPROTECT 0x8 -#define GF20SETPROTECT 0x10 -#define GR40SETPROTECT 0x20 -#define ALLN_SETPROTECT \ - (GR40SETPROTECT | GF20SETPROTECT | MM40SETPROTECT | MM20SETPROTECT) - -/* - AP's client table operation status flags -*/ -#define fCLIENT_STATUS_WMM_CAPABLE \ - 0x00000001 /* CLIENT can parse QOS DATA frame */ -#define fCLIENT_STATUS_AGGREGATION_CAPABLE \ - 0x00000002 /* CLIENT can receive Ralink's proprietary TX aggregation frame */ -#define fCLIENT_STATUS_PIGGYBACK_CAPABLE \ - 0x00000004 /* CLIENT support piggy-back */ -#define fCLIENT_STATUS_AMSDU_INUSED 0x00000008 -#define fCLIENT_STATUS_SGI20_CAPABLE 0x00000010 -#define fCLIENT_STATUS_SGI40_CAPABLE 0x00000020 -#define fCLIENT_STATUS_TxSTBC_CAPABLE 0x00000040 -#define fCLIENT_STATUS_RxSTBC_CAPABLE 0x00000080 -#define fCLIENT_STATUS_HTC_CAPABLE 0x00000100 -#define fCLIENT_STATUS_RDG_CAPABLE 0x00000200 -#define fCLIENT_STATUS_MCSFEEDBACK_CAPABLE 0x00000400 -#define fCLIENT_STATUS_APSD_CAPABLE 0x00000800 /* UAPSD STATION */ - -#ifdef DOT11N_DRAFT3 -#define fCLIENT_STATUS_BSSCOEXIST_CAPABLE 0x00001000 -#endif /* DOT11N_DRAFT3 */ -#define fCLIENT_STATUS_SOFTWARE_ENCRYPT \ - 0x00002000 /* Indicate the client encrypt/decrypt by software */ - -#ifdef DOT11_VHT_AC -#define fCLIENT_STATUS_SGI80_CAPABLE 0x00010000 -#define fCLIENT_STATUS_SGI160_CAPABLE 0x00020000 -#define fCLIENT_STATUS_VHT_TXSTBC_CAPABLE 0x00040000 -#define fCLIENT_STATUS_VHT_RXSTBC_CAPABLE 0x00080000 -#endif /* DOT11_VHT_AC */ - -#define fCLIENT_STATUS_RALINK_CHIPSET 0x00100000 - -#ifdef CLIENT_WDS -#define fCLIENT_STATUS_CLI_WDS 0x00200000 -#endif /* CLIENT_WDS */ - -#define fCLIENT_STATUS_VHT_RX_LDPC_CAPABLE 0x00800000 -#define fCLIENT_STATUS_HT_RX_LDPC_CAPABLE 0x01000000 - -#ifdef CONFIG_HOTSPOT_R2 -#define fCLIENT_STATUS_OSEN_CAPABLE 0x02000000 -#endif - -#define fCLIENT_STATUS_HT_CAPABLE 0x04000000 -#define fCLIENT_STATUS_VHT_CAPABLE 0x08000000 - -/* - STA configuration flags -*/ -/*#define fSTA_CFG_ENABLE_TX_BURST 0x00000001 */ - -/* 802.11n Operating Mode Definition. 0-3 also used in ASICUPdateProtect switch case */ -#define HT_NO_PROTECT 0 -#define HT_LEGACY_PROTECT 1 -#define HT_40_PROTECT 2 -#define HT_2040_PROTECT 3 -#define HT_RTSCTS_6M 7 -/*following is our own definition in order to turn on our ASIC protection register in INFRASTRUCTURE. */ -#define HT_ATHEROS \ - 8 /* rt2860c has problem with atheros chip. we need to turn on RTS/CTS . */ -#define HT_FORCERTSCTS \ - 9 /* Force turn on RTS/CTS first. then go to evaluate if this force RTS is necessary. */ - -/* - RX Packet Filter control flags. Apply on pAd->PacketFilter -*/ -#define fRX_FILTER_ACCEPT_DIRECT NDIS_PACKET_TYPE_DIRECTED -#define fRX_FILTER_ACCEPT_MULTICAST NDIS_PACKET_TYPE_MULTICAST -#define fRX_FILTER_ACCEPT_BROADCAST NDIS_PACKET_TYPE_BROADCAST -#define fRX_FILTER_ACCEPT_ALL_MULTICAST NDIS_PACKET_TYPE_ALL_MULTICAST -#define fRX_FILTER_ACCEPT_PROMISCUOUS NDIS_PACKET_TYPE_PROMISCUOUS - -/* - Error code section -*/ -/* NDIS_ERROR_CODE_ADAPTER_NOT_FOUND */ -#define ERRLOG_READ_PCI_SLOT_FAILED 0x00000101L -#define ERRLOG_WRITE_PCI_SLOT_FAILED 0x00000102L -#define ERRLOG_VENDOR_DEVICE_NOMATCH 0x00000103L - -/* NDIS_ERROR_CODE_ADAPTER_DISABLED */ -#define ERRLOG_BUS_MASTER_DISABLED 0x00000201L - -/* NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION */ -#define ERRLOG_INVALID_SPEED_DUPLEX 0x00000301L -#define ERRLOG_SET_SECONDARY_FAILED 0x00000302L - -/* NDIS_ERROR_CODE_OUT_OF_RESOURCES */ -#define ERRLOG_OUT_OF_MEMORY 0x00000401L -#define ERRLOG_OUT_OF_SHARED_MEMORY 0x00000402L -#define ERRLOG_OUT_OF_MAP_REGISTERS 0x00000403L -#define ERRLOG_OUT_OF_BUFFER_POOL 0x00000404L -#define ERRLOG_OUT_OF_NDIS_BUFFER 0x00000405L -#define ERRLOG_OUT_OF_PACKET_POOL 0x00000406L -#define ERRLOG_OUT_OF_NDIS_PACKET 0x00000407L -#define ERRLOG_OUT_OF_LOOKASIDE_MEMORY 0x00000408L - -/* NDIS_ERROR_CODE_HARDWARE_FAILURE */ -#define ERRLOG_SELFTEST_FAILED 0x00000501L -#define ERRLOG_INITIALIZE_ADAPTER 0x00000502L -#define ERRLOG_REMOVE_MINIPORT 0x00000503L - -/* NDIS_ERROR_CODE_RESOURCE_CONFLICT */ -#define ERRLOG_MAP_IO_SPACE 0x00000601L -#define ERRLOG_QUERY_ADAPTER_RESOURCES 0x00000602L -#define ERRLOG_NO_IO_RESOURCE 0x00000603L -#define ERRLOG_NO_INTERRUPT_RESOURCE 0x00000604L -#define ERRLOG_NO_MEMORY_RESOURCE 0x00000605L - -/* WDS definition */ -#define MAX_WDS_ENTRY 0 -#ifdef WDS_SUPPORT -#undef MAX_WDS_ENTRY -#define MAX_WDS_ENTRY 4 -#endif /* WDS_SUPPORT */ -#define WDS_PAIRWISE_KEY_OFFSET \ - 60 /* WDS links uses pairwise key#60 ~ 63 in ASIC pairwise key table */ - -#define WDS_DISABLE_MODE 0 -#define WDS_RESTRICT_MODE 1 -#define WDS_BRIDGE_MODE 2 -#define WDS_REPEATER_MODE 3 -#define WDS_LAZY_MODE 4 - -#define MAX_MESH_NUM 0 - -#define MAX_APCLI_NUM 0 -#ifdef APCLI_SUPPORT -#undef MAX_APCLI_NUM -#if defined(MT7615) && defined(DBDC_MODE) -#define MAX_APCLI_NUM_DEFAULT 2 -#else -#define MAX_APCLI_NUM_DEFAULT 1 -#endif -#define MAX_APCLI_NUM MAX_APCLI_NUM_DEFAULT -#ifdef APCLI_CONNECTION_TRIAL -#undef MAX_APCLI_NUM -#define MAX_APCLI_NUM (MAX_APCLI_NUM_DEFAULT + 1) -#endif /* APCLI_CONNECTION_TRIAL */ -#endif /* APCLI_SUPPORT */ - -#define MAX_P2P_NUM 0 - -#define MAX_MBSSID_NUM(__pAd) 1 - -#ifdef MAC_APCLI_SUPPORT -#define APCLI_BSS_BASE 8 -#else -#define APCLI_BSS_BASE 0 -#endif /* MAC_APCLI_SUPPORT */ - -#ifdef MBSS_SUPPORT -#undef MAX_MBSSID_NUM -#define MAX_MBSSID_NUM(__pAd) (hc_get_chip_bcn_max_num(__pAd->hdev_ctrl)) -#define HW_BEACON_MAX_COUNT(__pAd) (hc_get_chip_bcn_hw_num(__pAd->hdev_ctrl)) -#else -#define HW_BEACON_MAX_COUNT(__pAd) 8 -#endif /* MBSS_SUPPORT */ - -#define HW_BEACON_MAX_NUM 16 -#define MAX_BEACON_NUM 32 - -enum { - EXTEND_MBSS_MAC_0_1 = 0, - EXTEND_MBSS_MAC_0_2, - EXTEND_MBSS_MAC_0_3, - EXTEND_MBSS_MAC_0_4, - EXTEND_MBSS_MAC_0_5, - EXTEND_MBSS_MAC_0_6, - EXTEND_MBSS_MAC_0_7, - EXTEND_MBSS_MAC_0_8, - EXTEND_MBSS_MAC_0_9, - EXTEND_MBSS_MAC_0_10, - EXTEND_MBSS_MAC_0_11, - EXTEND_MBSS_MAC_0_12, - EXTEND_MBSS_MAC_0_13, - EXTEND_MBSS_MAC_0_14, - EXTEND_MBSS_MAC_0_15, - EXTEND_MBSS_MAC_MAX -}; - -#define WDEV_NUM_MAX \ - (HW_BEACON_MAX_NUM + MAX_WDS_ENTRY + MAX_APCLI_NUM + MAX_P2P_NUM + \ - MAX_MESH_NUM + MONITOR_MAX_DEV_NUM) - -/* - BSSINFO of WDS/Repeater is used for CR4 to do offload related matter. - the BSSINFO information of WDS/REPEATER will not send to N9, - but send to CR4. -*/ -#ifdef MAC_REPEATER_SUPPORT -#define BSSINFO_NUM_MAX(_pChipCap) \ - (HW_BSSID_MAX + EXTEND_MBSS_MAC_MAX + MAX_WDS_ENTRY + \ - GET_MAX_REPEATER_ENTRY_NUM(_pChipCap)) -#else -#define BSSINFO_NUM_MAX(_pChipCap) \ - (HW_BSSID_MAX + EXTEND_MBSS_MAC_MAX + MAX_WDS_ENTRY) -#endif /*MAC_REPEATER_SUPPORT*/ - -#define MAX_MULTI_STA 2 -#define MAIN_MSTA_ID 0 - -/* sanity check for apidx */ -#define MBSS_MR_APIDX_SANITY_CHECK(__pAd, apidx) \ - { \ - if ((apidx >= MAX_MBSSID_NUM(__pAd)) || \ - (apidx >= HW_BEACON_MAX_NUM)) { \ - MTWF_LOG(DBG_CAT_AP, CATAP_MBSS, DBG_LVL_ERROR, \ - ("%s> Error! apidx = %d > MAX_MBSSID_NUM!\n", \ - __func__, apidx)); \ - apidx = MAIN_MBSSID; \ - } \ - } - -#define VALID_MBSS(_pAd, _apidx) \ - ((_apidx < MAX_MBSSID_NUM(_pAd)) && (_apidx < HW_BEACON_MAX_NUM)) - -#define MAX_BEACON_SIZE 512 -#define MAX_TIM_SIZE 256 -/* Carter: TIM ie max length could achieve 257 byte in spec, - but it will never reach this value in Ralink Driver */ - -/* Then dedicate wcid of DFS and Carrier-Sense. */ -#define DFS_CTS_WCID(__pAd) (HW_RESERVED_WCID(__pAd) - 1) -#define CS_CTS_WCID(__pAd) (HW_RESERVED_WCID(__pAd) - 2) - -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || \ - defined(MT7637_FPGA) -#define LAST_SPECIFIC_WCID(__pAd) 20 -/* TODO: out-of-date MAX_AVAILABLE_CLIENT_WCID need to be refine.*/ -/* #define MAX_AVAILABLE_CLIENT_WCID(__pAd) (LAST_SPECIFIC_WCID(__pAd) - MAX_MBSSID_NUM(__pAd)) */ -#else -#define LAST_SPECIFIC_WCID(__pAd) (HW_RESERVED_WCID(__pAd) - 2) - -/* If MAX_MBSSID_NUM is 8, the maximum available wcid for the associated STA is 211. */ -/* If MAX_MBSSID_NUM is 7, the maximum available wcid for the associated STA is 228. */ -/* TODO: out-of-date MAX_AVAILABLE_CLIENT_WCID need to be refine.*/ -/* #define MAX_AVAILABLE_CLIENT_WCID(__pAd) (LAST_SPECIFIC_WCID(__pAd) - MAX_MBSSID_NUM(__pAd) - 1) */ -#endif /* MT7603_FPGA */ - -#define GET_GroupKey_WCID(__wdev, __wcid) \ - { \ - __wcid = __wdev->bss_info_argument.ucBcMcWlanIdx; \ - } - -#ifdef DOT11W_PMF_SUPPORT -#define GET_PMF_GroupKey_WCID(__pAd, __wcid, __bssidx) \ - { \ - __wcid = LAST_SPECIFIC_WCID(__pAd) - \ - (MAX_MBSSID_NUM(__pAd) * 2) + __bssidx; \ - } -#endif /* DOT11W_PMF_SUPPORT */ - -/*#define IsGroupKeyWCID(__pAd, __wcid) (((__wcid) < LAST_SPECIFIC_WCID) && ((__wcid) >= (LAST_SPECIFIC_WCID - (MAX_MBSSID_NUM(__pAd))))) */ - -/* definition to support multiple BSSID */ -#define BSS0 0 -#define BSS1 1 -#define BSS2 2 -#define BSS3 3 -#define BSS4 4 -#define BSS5 5 -#define BSS6 6 -#define BSS7 7 - -/*============================================================ */ -/* Length definitions */ -#define PEER_KEY_NO 2 -#define TIMESTAMP_LEN 8 -#define MAX_LEN_OF_SUPPORTED_RATES \ - MAX_LENGTH_OF_SUPPORT_RATES /* 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */ -#define MAX_LEN_OF_SUPPORTED_CHL 64 -#define MAX_NUM_OF_REGULATORY_CLASS 16 -#define MAX_LEN_OF_KEY 32 /* 32 octets == 256 bits, Redefine for WPA */ -/* #define MAX_NUM_OF_CHANNELS MAX_NUM_OF_CHS */ /* 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL termination */ -#define MAX_NUM_OF_11JCHANNELS \ - 20 /* 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL termination */ -#define MAX_LEN_OF_SSID 32 -#define CIPHER_TEXT_LEN 128 -#define HASH_TABLE_SIZE 256 /* Size of hash tab must be power of 2. */ -#define MAX_VIE_LEN 1024 /* New for WPA cipher suite variable IE sizes. */ -#define MAX_SUPPORT_MCS 32 -#define MAX_NUM_OF_BBP_LATCH 256 -#undef MAX_NUM_OF_BBP_LATCH -#define MAX_NUM_OF_BBP_LATCH 255 - -#define MAX_LEN_OF_CCK_RATES 4 -#define MAX_LEN_OF_OFDM_RATES 8 -#define MAX_LEN_OF_HT_RATES 24 -#ifdef DOT11_VHT_AC -#define MAX_LEN_OF_VHT_RATES 20 -#endif /* DOT11_VHT_AC */ -#define SUPPORT_CCK_MODE 1 -#define SUPPORT_OFDM_MODE 2 -#define SUPPORT_HT_MODE 4 -#define SUPPORT_VHT_MODE 8 - -/*============================================================ */ -/* ASIC WCID Table definition. */ -/*============================================================ */ - -/* We have retired BSSID_WCID. If you need this constant, please contact Patrick. */ -/* #define BSSID_WCID 1 */ /* in infra mode, always put bssid with this WCID */ -#define MCAST_WCID 0x0 -/* #define APCLI_MCAST_WCID (MAX_LEN_OF_MAC_TABLE + HW_BEACON_MAX_NUM + MAX_APCLI_NUM) */ -#define BSS0Mcast_WCID 0x0 -#define BSS1Mcast_WCID 0xf8 -#define BSS2Mcast_WCID 0xf9 -#define BSS3Mcast_WCID 0xfa -#define BSS4Mcast_WCID 0xfb -#define BSS5Mcast_WCID 0xfc -#define BSS6Mcast_WCID 0xfd -#define BSS7Mcast_WCID 0xfe -#define RESERVED_WCID 0xff -#define WCID_ALL 0xff - -#define MAX_NUM_OF_ACL_LIST MAX_NUMBER_OF_ACL - -#define MAX_LEN_OF_MAC_TABLE 128 -#define VALID_WCID(_wcid) ((_wcid) < MAX_LEN_OF_MAC_TABLE) - -#define MAX_LEN_OF_TR_TABLE MAX_LEN_OF_MAC_TABLE -#define VALID_TR_WCID(_wcid) ((_wcid) < MAX_LEN_OF_TR_TABLE) - -#define VALID_UCAST_ENTRY_WCID(_pAd, _wcid) ((_wcid) < HcGetMaxStaNum(_pAd)) -#define GET_MAX_UCAST_NUM(_pAd) HcGetMaxStaNum(_pAd) - -/*#if MAX_LEN_OF_MAC_TABLE>MAX_AVAILABLE_CLIENT_WCID */ -/*#error MAX_LEN_OF_MAC_TABLE can not be larger than MAX_AVAILABLE_CLIENT_WCID!!!! */ -/*#endif */ - -#define MAX_NUM_OF_WDS_LINK_PERBSSID 3 -/*#define MAX_NUM_OF_WDS_LINK (MAX_NUM_OF_WDS_LINK_PERBSSID*MAX_MBSSID_NUM) // no use */ -#define MAX_NUM_OF_EVENT MAX_NUMBER_OF_EVENT -/* #define WDS_LINK_START_WCID (MAX_LEN_OF_MAC_TABLE-1)//non used. */ - -#define NUM_OF_TID 8 -#define MAX_AID_BA 4 - -#define MAX_LEN_OF_BA_REC_TABLE \ - ((NUM_OF_TID * MAX_LEN_OF_MAC_TABLE) / \ - 2) /* (NUM_OF_TID*MAX_AID_BA + 32) //Block ACK recipient */ -#define MAX_LEN_OF_BA_ORI_TABLE \ - ((NUM_OF_TID * MAX_LEN_OF_MAC_TABLE) / \ - 2) /* (NUM_OF_TID*MAX_AID_BA + 32) // Block ACK originator */ - -#ifdef MEMORY_OPTIMIZATION -#define MAX_LEN_OF_BSS_TABLE 128 -#define MAX_REORDERING_MPDU_NUM 256 -#else -#define MAX_LEN_OF_BSS_TABLE 256 /* 64 */ -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#define MAX_REORDERING_MPDU_NUM (512 * 4) -#else -#define MAX_REORDERING_MPDU_NUM 512 -#endif -#endif - -/* key related definitions */ -#define SHARE_KEY_NUM 4 -#define MAX_LEN_OF_SHARE_KEY 16 /* byte count */ -#define MAX_LEN_OF_PEER_KEY 16 /* byte count */ -#define PAIRWISE_KEY_NUM 64 /* in MAC ASIC pairwise key table */ -#define GROUP_KEY_NUM 4 -#define PMK_LEN 32 -#define WDS_PAIRWISE_KEY_OFFSET \ - 60 /* WDS links uses pairwise key#60 ~ 63 in ASIC pairwise key table */ -#define PMKID_NO 4 /* Number of PMKID saved supported */ -#define MAX_LEN_OF_MLME_BUFFER 2048 - -/* power status related definitions */ -#define PWR_ACTIVE 0 -#define PWR_SAVE 1 -#define PWR_MMPS 2 /*MIMO power save */ - -/* For AP PS retrieve status */ -#define APPS_RETRIEVE_IDLE 0 -#define APPS_RETRIEVE_CR_PADDING 1 -#define APPS_RETRIEVE_START_PS 2 -#define APPS_RETRIEVE_GOING 3 -#define APPS_RETRIEVE_WAIT_EVENT 4 -#define APPS_RETRIEVE_DONE 5 -#ifdef MTFWD -enum nl_msg_id { - FWD_CMD_ADD_TX_SRC = 3, - FWD_CMD_DEL_TX_SRC = 4, -}; -#endif - -/*#define PWR_UNKNOWN 2 */ - -/* Auth and Assoc mode related definitions */ -#define AUTH_MODE_OPEN 0x00 -#define AUTH_MODE_KEY 0x01 -#define AUTH_MODE_FT 0x02 -#define AUTH_MODE_SAE 0x03 -#define AUTH_MODE_FILS 0x04 -#define AUTH_MODE_FILS_PFS 0x05 -#define AUTH_MODE_VENDOR 0xffff - -/* BSS Type definitions */ -#define BSS_ADHOC 0 /* = Ndis802_11IBSS */ -#define BSS_INFRA 1 /* = Ndis802_11Infrastructure */ -#define BSS_ANY 2 /* = Ndis802_11AutoUnknown */ -#define BSS_MONITOR 3 /* = Ndis802_11Monitor */ - -/* Reason code definitions */ -#define REASON_RESERVED 0 -#define REASON_UNSPECIFY 1 -#define REASON_NO_LONGER_VALID 2 -#define REASON_DEAUTH_STA_LEAVING 3 -#define REASON_DISASSOC_INACTIVE 4 -#define REASON_DISASSPC_AP_UNABLE 5 -#define REASON_CLS2ERR 6 -#define REASON_CLS3ERR 7 -#define REASON_DISASSOC_STA_LEAVING 8 -#define REASON_STA_REQ_ASSOC_NOT_AUTH 9 -#define REASON_INVALID_IE 13 -#define REASON_MIC_FAILURE 14 -#define REASON_4_WAY_TIMEOUT 15 -#define REASON_GROUP_KEY_HS_TIMEOUT 16 -#define REASON_IE_DIFFERENT 17 -#define REASON_MCIPHER_NOT_VALID 18 -#define REASON_UCIPHER_NOT_VALID 19 -#define REASON_AKMP_NOT_VALID 20 -#define REASON_UNSUPPORT_RSNE_VER 21 -#define REASON_INVALID_RSNE_CAP 22 -#define REASON_8021X_AUTH_FAIL 23 -#define REASON_CIPHER_SUITE_REJECTED 24 -#define REASON_DECLINED 37 - -#define REASON_QOS_UNSPECIFY 32 -#define REASON_QOS_LACK_BANDWIDTH 33 -#define REASON_POOR_CHANNEL_CONDITION 34 -#define REASON_QOS_OUTSIDE_TXOP_LIMITION 35 -#define REASON_QOS_QSTA_LEAVING_QBSS 36 -#define REASON_QOS_UNWANTED_MECHANISM 37 -#define REASON_QOS_MECH_SETUP_REQUIRED 38 -#define REASON_QOS_REQUEST_TIMEOUT 39 -#define REASON_QOS_CIPHER_NOT_SUPPORT 45 - -#ifdef WIFI_DIAG -#define REASON_STANDARD_MAX 0xFFFF /* 65535 */ -#define REASON_UNKNOWN (REASON_STANDARD_MAX + 1) -#define REASON_AGING_TIME_OUT (REASON_STANDARD_MAX + 2) -#define REASON_CONTINUE_TX_FAIL (REASON_STANDARD_MAX + 3) -#define REASON_RSSI_TOO_LOW (REASON_STANDARD_MAX + 4) -#define REASON_AUTH_WRONG_ALGORITHM (REASON_STANDARD_MAX + 5) -#define REASON_CHALLENGE_FAIL (REASON_STANDARD_MAX + 6) -#define REASON_4WAY_HS_MSG1_FAIL (REASON_STANDARD_MAX + 7) -#define REASON_4WAY_HS_MSG2_FAIL (REASON_STANDARD_MAX + 8) -#define REASON_4WAY_HS_MSG3_FAIL (REASON_STANDARD_MAX + 9) -#define REASON_4WAY_HS_MSG4_FAIL (REASON_STANDARD_MAX + 10) -#define REASON_2WAY_HS_MSG1_FAIL (REASON_STANDARD_MAX + 11) -#define REASON_2WAY_HS_MSG2_FAIL (REASON_STANDARD_MAX + 12) -#define REASON_DECRYPTION_FAIL (REASON_STANDARD_MAX + 13) -#define REASON_NO_RESOURCE (REASON_STANDARD_MAX + 14) -#define REASON_REJ_TEMPORARILY (REASON_STANDARD_MAX + 15) -#endif - -#define REASON_FT_INVALID_FTIE 55 - -/* Status code definitions */ -#define MLME_SUCCESS 0 -#define MLME_UNSPECIFY_FAIL 1 -#define MLME_SECURITY_WEAK 5 -#define MLME_CANNOT_SUPPORT_CAP 10 -#define MLME_REASSOC_DENY_ASSOC_EXIST 11 -#define MLME_ASSOC_DENY_OUT_SCOPE 12 -#define MLME_ALG_NOT_SUPPORT 13 -#define MLME_SEQ_NR_OUT_OF_SEQUENCE 14 -#define MLME_REJ_CHALLENGE_FAILURE 15 -#define MLME_REJ_TIMEOUT 16 -#define MLME_ASSOC_REJ_UNABLE_HANDLE_STA 17 -#define MLME_ASSOC_REJ_DATA_RATE 18 - -#define MLME_ASSOC_REJ_NO_EXT_RATE 22 -#define MLME_ASSOC_REJ_NO_EXT_RATE_PBCC 23 -#define MLME_ASSOC_REJ_NO_CCK_OFDM 24 - -#ifdef DOT11W_PMF_SUPPORT -#define MLME_ASSOC_REJ_TEMPORARILY 30 -#define MLME_ROBUST_MGMT_POLICY_VIOLATION 31 -#endif /* DOT11W_PMF_SUPPORT */ -#define MLME_QOS_UNSPECIFY 32 -#define MLME_DISASSOC_LOW_ACK 34 -#define MLME_REQUEST_DECLINED 37 -#define MLME_REQUEST_WITH_INVALID_PARAM 38 -#define MLME_INVALID_INFORMATION_ELEMENT 40 -#define MLME_INVALID_GROUP_CIPHER 41 -#define MLME_INVALID_PAIRWISE_CIPHER 42 -#define MLME_INVALID_AKMP 43 -#define MLME_NOT_SUPPORT_RSN_VERSION 44 -#define MLME_INVALID_RSN_CAPABILITIES 45 -#define MLME_INVALID_SECURITY_POLICY \ - 46 /* Cipher suite rejected because of security policy */ -#define MLME_DLS_NOT_ALLOW_IN_QBSS 48 -#define MLME_DEST_STA_NOT_IN_QBSS 49 -#define MLME_DEST_STA_IS_NOT_A_QSTA 50 -#define MLME_INVALID_PMKID 53 - -#define MLME_INVALID_FORMAT 0x51 -#define MLME_FAIL_NO_RESOURCE 0x52 -#define MLME_STATE_MACHINE_REJECT 0x53 -#define MLME_MAC_TABLE_FAIL 0x54 - -#define MLME_ANTI_CLOGGING_TOKEN_REQ 76 -#define MLME_FINITE_CYCLIC_GROUP_NOT_SUPPORTED 77 - -#define MLME_UNKNOWN_PASSWORD_IDENTIFIER 123 -#define MLME_SAE_HASH_TO_ELEMENT 126 - -/* IE code */ -#define IE_SSID 0 -#define IE_SUPP_RATES 1 -#define IE_FH_PARM 2 -#define IE_DS_PARM 3 -#define IE_CF_PARM 4 -#define IE_TIM 5 -#define IE_IBSS_PARM 6 -#define IE_COUNTRY 7 /* 802.11d */ -#define IE_802_11D_REQUEST 10 /* 802.11d */ -#define IE_QBSS_LOAD 11 /* 802.11e d9 */ -#define IE_EDCA_PARAMETER 12 /* 802.11e d9 */ -#define IE_TSPEC 13 /* 802.11e d9 */ -#define IE_TCLAS 14 /* 802.11e d9 */ -#define IE_SCHEDULE 15 /* 802.11e d9 */ -#define IE_CHALLENGE_TEXT 16 -#define IE_POWER_CONSTRAINT 32 /* 802.11h d3.3 */ -#define IE_POWER_CAPABILITY 33 /* 802.11h d3.3 */ -#define IE_TPC_REQUEST 34 /* 802.11h d3.3 */ -#define IE_TPC_REPORT 35 /* 802.11h d3.3 */ -#define IE_SUPP_CHANNELS 36 /* 802.11h d3.3 */ -#define IE_CHANNEL_SWITCH_ANNOUNCEMENT 37 /* 802.11h d3.3 */ -#define IE_MEASUREMENT_REQUEST 38 /* 802.11h d3.3 */ -#define IE_MEASUREMENT_REPORT 39 /* 802.11h d3.3 */ -#define IE_QUIET 40 /* 802.11h d3.3 */ -#define IE_IBSS_DFS 41 /* 802.11h d3.3 */ -#define IE_ERP 42 /* 802.11g */ -#define IE_TS_DELAY 43 /* 802.11e d9 */ -#define IE_TCLAS_PROCESSING 44 /* 802.11e d9 */ -#define IE_QOS_CAPABILITY 46 /* 802.11e d6 */ -#define IE_HT_CAP 45 /* 802.11n d1. HT CAPABILITY. ELEMENT ID TBD */ -#define IE_AP_CHANNEL_REPORT 51 /* 802.11k d6 */ -#define IE_HT_CAP2 52 /* 802.11n d1. HT CAPABILITY. ELEMENT ID TBD */ -#define IE_RSN 48 /* 802.11i d3.0 */ -#define IE_WPA2 48 /* WPA2 */ -#define IE_EXT_SUPP_RATES 50 /* 802.11g */ -#define IE_TIMEOUT_INTERVAL 56 /* 802.11w */ -#define IE_SUPP_REG_CLASS 59 /* 802.11y. Supported regulatory classes. */ -#define IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT 60 /* 802.11n */ -#define IE_ADD_HT 61 /* 802.11n d1. ADDITIONAL HT CAPABILITY. ELEMENT ID TBD */ -#define IE_ADD_HT2 53 /* 802.11n d1. ADDITIONAL HT CAPABILITY. ELEMENT ID TBD */ - -/* For 802.11n D3.03 */ -/*#define IE_NEW_EXT_CHA_OFFSET 62 // 802.11n d1. New extension channel offset elemet */ -#define IE_SECONDARY_CH_OFFSET \ - 62 /* 802.11n D3.03 Secondary Channel Offset element */ -#define IE_WAPI \ - 68 /* WAPI information element. Same as Bss Ac Access Dealy Element. */ -#define IE_TIME_ADVERTISEMENT 69 /* 802.11p */ -#define IE_RM_ENABLE 70 /* 802.11mc D4.0 */ -#define IE_2040_BSS_COEXIST 72 /* 802.11n D3.0.3 */ -#define IE_2040_BSS_INTOLERANT_REPORT 73 /* 802.11n D3.03 */ -#define IE_OVERLAPBSS_SCAN_PARM 74 /* 802.11n D3.03 */ -#define IE_CHANNEL_USAGE \ - 97 /* Cisco advertises suggested channel using this IE. */ -#define IE_TIME_ZONE 98 /* 802.11V */ -#define IE_INTERWORKING 107 /* 802.11u */ -#define IE_ADVERTISEMENT_PROTO 108 /* 802.11u */ -#define IE_QOS_MAP_SET 110 /* 802.11u */ -#define IE_ROAMING_CONSORTIUM 111 /* 802.11u */ -#define IE_EXT_CAPABILITY 127 /* 802.11n D3.03 */ -#define IE_LAST_BCN_REPORT_INDICATION_REQUEST \ - 164 /*Last Beacon Report Indication Request*/ -#define IE_OPERATING_MODE_NOTIFY 199 -#define IE_FTM_PARM 206 /* 802.11mc D4.0 */ - -#define IE_WPA 221 /* WPA */ -#define IE_VENDOR_SPECIFIC 221 /* Wifi WMM (WME) */ -#define IE_WFA_WSC 221 -#define IE_FILS_INDICATION 240 -#define IE_RSNXE 244 - -#define IE_WLAN_EXTENSION 255 -#define IE_EXTENSION_ID_ECDH 32 -#define IE_EXTENSION_ID_ESP 11 -#define IE_WLAN_EXTENSION 255 - -/* Extended RSN Capabilities */ -/* bits 0-3: Field length (n-1) */ -#define IE_RSNXE_CAPAB_PROTECTED_TWT 4 -#define IE_RSNXE_CAPAB_SAE_H2E 5 - -#define BSS_MEMBERSHIP_SELECTOR_HT_PHY 127 -#define BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126 -#define BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY 123 -#define BSS_MEMBERSHIP_SELECTOR_HE_PHY 122 - -#define BSS_MEMBERSHIP_SELECTOR_VALID 0x80 - -typedef struct GNU_PACKED _EID_STRUCT { - UCHAR Eid; - UCHAR Len; - UCHAR Octet[1]; -} EID_STRUCT, *PEID_STRUCT, BEACON_EID_STRUCT, *PBEACON_EID_STRUCT; - -#define OUI_P2P 0x09 -#define OUI_HS2_INDICATION 0x10 -#define OUI_BROADCOM_HT 51 /* */ -#define OUI_BROADCOM_HTADD 52 /* */ -#define OUI_PREN_HT_CAP 51 /* */ -#define OUI_PREN_ADD_HT 52 /* */ - -/* CCX information */ -#define IE_AIRONET_CKIP 133 /* CCX1.0 ID 85H for CKIP */ -#define IE_AP_TX_POWER 150 /* CCX 2.0 for AP transmit power */ -#define IE_MEASUREMENT_CAPABILITY 221 /* CCX 2.0 */ -#define IE_CCX_V2 221 -#define IE_AIRONET_IPADDRESS 149 /* CCX ID 95H for IP Address */ -#define IE_AIRONET_CCKMREASSOC \ - 156 /* CCX ID 9CH for CCKM Reassociation Request element */ -#define CKIP_NEGOTIATION_LENGTH 30 -#define AIRONET_IPADDRESS_LENGTH 10 -#define AIRONET_CCKMREASSOC_LENGTH 24 - -/* ======================================================== */ -/* MLME state machine definition */ -/* ======================================================== */ - -/* STA MLME state mahcines */ -#define ASSOC_STATE_MACHINE 1 -#define AUTH_STATE_MACHINE 2 -#define AUTH_RSP_STATE_MACHINE 3 -#define SYNC_STATE_MACHINE 4 -#define MLME_CNTL_STATE_MACHINE 5 -#define WPA_PSK_STATE_MACHINE 6 -/*#define LEAP_STATE_MACHINE 7 */ -#define AIRONET_STATE_MACHINE 8 -#define ACTION_STATE_MACHINE 9 - -/* AP MLME state machines */ -#define AP_ASSOC_STATE_MACHINE 11 -#define AP_AUTH_STATE_MACHINE 12 -#define AP_SYNC_STATE_MACHINE 14 -#define AP_CNTL_STATE_MACHINE 15 -#define WSC_STATE_MACHINE 17 -#define WSC_UPNP_STATE_MACHINE 18 - -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#define APCLI_AUTH_STATE_MACHINE 19 -#define APCLI_ASSOC_STATE_MACHINE 20 -#define APCLI_SYNC_STATE_MACHINE 21 -#define APCLI_CTRL_STATE_MACHINE 22 -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#define WPA_STATE_MACHINE 23 - -#ifdef DOT11R_FT_SUPPORT -#define FT_OTA_AUTH_STATE_MACHINE 27 -#define FT_OTD_ACT_STATE_MACHINE 28 -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef CONFIG_DOT11U_INTERWORKING -#define GAS_STATE_MACHINE 39 -#endif - -#ifdef CONFIG_DOT11V_WNM -#define BTM_STATE_MACHINE 40 -#define WNM_NOTIFY_STATE_MACHINE 41 -#endif - -#ifdef CONFIG_HOTSPOT -#define HSCTRL_STATE_MACHINE 42 -#endif - -#ifdef BACKGROUND_SCAN_SUPPORT -#define BGND_SCAN_STATE_MACHINE 43 -#endif /* BACKGROUND_SCAN_SUPPORT */ - -#ifdef MT_DFS_SUPPORT -#define DFS_STATE_MACHINE 44 /* Jelly20150402 */ -#endif /* MT_DFS_SUPPORT */ - -#define DOT11_H_STATE_MACHINE 45 - -#ifdef CONFIG_AP_SUPPORT -#define AUTO_CH_SEL_STATE_MACHINE 46 -#endif /* CONFIG_AP_SUPPORT */ -#ifdef WDS_SUPPORT -#define WDS_STATE_MACHINE 47 -#endif - -#ifdef DOT11K_RRM_SUPPORT -#define NEIGHBOR_STATE_MACHINE 48 -#define BCN_STATE_MACHINE 49 -#endif - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -#define CH_SWITCH_MONITOR_STATE_MACHINE 50 -#endif - -#ifdef WIFI_DIAG -#define WIFI_DAIG_STATE_MACHINE 51 -#endif - -/* - STA's CONTROL/CONNECT state machine: states, events, total function # -*/ -#define CNTL_IDLE 0 -#define CNTL_WAIT_DISASSOC 1 -#define CNTL_WAIT_JOIN 2 -#define CNTL_WAIT_REASSOC 3 -#define CNTL_WAIT_START 4 -#define CNTL_WAIT_AUTH 5 -#define CNTL_WAIT_ASSOC 6 -#define CNTL_WAIT_AUTH2 7 -#define CNTL_WAIT_OID_LIST_SCAN 8 -#define CNTL_WAIT_OID_DISASSOC 9 -#define CNTL_WAIT_SCAN_FOR_CONNECT 10 - -#define MT2_ASSOC_CONF 34 -#define MT2_AUTH_CONF 35 -#define MT2_DEAUTH_CONF 36 -#define MT2_DISASSOC_CONF 37 -#define MT2_REASSOC_CONF 38 -#define MT2_PWR_MGMT_CONF 39 -#define MT2_JOIN_CONF 40 -#define MT2_SCAN_CONF 41 -#define MT2_START_CONF 42 -#define MT2_GET_CONF 43 -#define MT2_SET_CONF 44 -#define MT2_RESET_CONF 45 -#define MT2_FT_OTD_CONF 46 -#define MT2_MLME_ROAMING_REQ 52 - -#define CNTL_FUNC_SIZE 1 - -/* - STA's ASSOC state machine: states, events, total function # -*/ -#define ASSOC_IDLE 0 -#define ASSOC_WAIT_RSP 1 -#define REASSOC_WAIT_RSP 2 -#define DISASSOC_WAIT_RSP 3 -#define MAX_ASSOC_STATE 4 - -#define ASSOC_MACHINE_BASE 0 -#define MT2_MLME_ASSOC_REQ 0 -#define MT2_MLME_REASSOC_REQ 1 -#define MT2_MLME_DISASSOC_REQ 2 -#define MT2_PEER_DISASSOC_REQ 3 -#define MT2_PEER_ASSOC_REQ 4 -#define MT2_PEER_ASSOC_RSP 5 -#define MT2_PEER_REASSOC_REQ 6 -#define MT2_PEER_REASSOC_RSP 7 -#define MT2_DISASSOC_TIMEOUT 8 -#define MT2_ASSOC_TIMEOUT 9 -#define MT2_REASSOC_TIMEOUT 10 -#define MAX_ASSOC_MSG 11 - -#define ASSOC_FUNC_SIZE (MAX_ASSOC_STATE * MAX_ASSOC_MSG) - -/* - ACT state machine: states, events, total function # -*/ -#define ACT_IDLE 0 -#define MAX_ACT_STATE 1 - -#define ACT_MACHINE_BASE 0 - -/* - Those PEER_xx_CATE number is based on real Categary value in IEEE spec. - Please doesn't modify it by yourself. - */ -/*Category */ -#define MT2_PEER_SPECTRUM_CATE 0 -#define MT2_PEER_QOS_CATE 1 -#define MT2_PEER_DLS_CATE 2 -#define MT2_PEER_BA_CATE 3 -#define MT2_PEER_PUBLIC_CATE 4 -#define MT2_PEER_RM_CATE 5 -/* "FT_CATEGORY_BSS_TRANSITION equal to 6" is defined file of "dot11r_ft.h" */ -#define MT2_PEER_HT_CATE 7 /* 7.4.7 */ -#define MT2_PEER_PMF_CATE 8 /* defined in IEEE 802.11w-D8.0 7.3.1.11 */ -#define MT2_PEER_RESV_9 9 -#define MT2_PEER_RESV_10 10 -#define MT2_PEER_RESV_11 11 -#define MT2_PEER_RESV_12 12 -#define MT2_PEER_RESV_13 13 -#define MT2_PEER_RESV_14 14 -#define MT2_PEER_RESV_15 15 -#define MT2_PEER_RESV_16 16 -/* - In WMM spec v1.1. the category must be 17 - (see Table 7 Management Action Frame Fields) -*/ -#define MT2_PEER_WMM 17 -#define WNM_CATEGORY_BSS_TRANSITION 18 -#define MT2_PEER_RESV_19 19 -#define MT2_PEER_RESV_20 20 -#define MT2_PEER_VHT_CATE 21 -#define MAX_IEEE_STD_CATE \ - 21 /* Indicate the maximum category code defined in IEEE-802.11-Std */ -#define MAX_PEER_CATE_MSG MAX_IEEE_STD_CATE - -#define MT2_MLME_ADD_BA_CATE (MAX_IEEE_STD_CATE + 1) -#define MT2_MLME_ORI_DELBA_CATE (MAX_IEEE_STD_CATE + 2) -#define MT2_MLME_REC_DELBA_CATE (MAX_IEEE_STD_CATE + 3) -#define MT2_MLME_QOS_CATE (MAX_IEEE_STD_CATE + 4) -#define MT2_MLME_DLS_CATE (MAX_IEEE_STD_CATE + 5) -#define MT2_ACT_INVALID (MAX_IEEE_STD_CATE + 6) - -#define MAX_ACT_MSG (MAX_IEEE_STD_CATE + 7) - -#if defined(DOT11V_WNM_SUPPORT) || defined(CONFIG_DOT11V_WNM) -#define WNM_CATEGORY_BSS_TRANSITION 18 -#undef MAX_ACT_MSG -#define MAX_ACT_MSG (MAX_IEEE_STD_CATE + 8) -#undef MAX_PEER_CATE_MSG -#define MAX_PEER_CATE_MSG (MAX_IEEE_STD_CATE + 8) -#endif /* DOT11V_WNM_SUPPORT */ - -#define MT2_ACT_VENDOR 0x7F - -/* Category field */ -#define CATEGORY_SPECTRUM 0 -#define CATEGORY_QOS 1 -#define CATEGORY_DLS 2 -#define CATEGORY_BA 3 -#define CATEGORY_PUBLIC 4 -#define CATEGORY_RM 5 -#define CATEGORY_FT 6 -#define CATEGORY_HT 7 -#define CATEGORY_SA 8 /* defined in IEEE 802.11w-D8.0 7.3.1.11*/ -#define CATEGORY_PD 9 /* Protected Dual of Action defined in IEEE 802.11w */ -#define CATEGORY_WNM 10 -#define CATEGORY_UN_PROTECTED_WNM 11 -#define CATEGORY_VSP 126 /* Vendor-specific Protected defined in IEEE 802.11w */ -/* #ifdef WFD_SUPPORT */ -#define CATEGORY_VENDOR_SPECIFIC_WFD \ - 127 /* CFG_TODO CATEGORY_VENDOR, WHY ONLY WFD ? */ -/* #endif */ /* WFD_SUPPORT */ - -#ifdef DOT11_VHT_AC -#define CATEGORY_VHT 21 - -#define ACT_VHT_COMPRESS_BF 0 /* VHT Compressed Beamforming */ -#define ACT_VHT_GRP_ID_MGMT 1 /* Group ID Management */ -#define ACT_VHT_OPMODE_NOTIFY 2 /* Operating Mode Notification */ -#endif /* DOT11_VHT_AC */ - -#ifdef DOT11W_PMF_SUPPORT -/* SA Query Action frame definition */ -#define ACTION_SAQ_REQUEST 0 -#define ACTION_SAQ_RESPONSE 1 -#endif /* DOT11W_PMF_SUPPORT */ - -/* DLS Action frame definition */ -#define ACTION_DLS_REQUEST 0 -#define ACTION_DLS_RESPONSE 1 -#define ACTION_DLS_TEARDOWN 2 - -/* Spectrum Action field value 802.11h 7.4.1 */ -#define SPEC_MRQ 0 /* Request */ -#define SPEC_MRP 1 /*Report */ -#define SPEC_TPCRQ 2 -#define SPEC_TPCRP 3 -#define SPEC_CHANNEL_SWITCH 4 - -/* BA Action field value */ -#define ADDBA_REQ 0 -#define ADDBA_RESP 1 -#define DELBA 2 - -/* Public's Action field value in Public Category. Some in 802.11y and some in 11n */ -#define ACTION_BSS_2040_COEXIST 0 /* 11n */ -#define ACTION_DSE_ENABLEMENT 1 /* 11y D9.0 */ -#define ACTION_DSE_DEENABLEMENT 2 /* 11y D9.0 */ -#define ACTION_DSE_REG_LOCATION_ANNOUNCE 3 /* 11y D9.0 */ -#define ACTION_EXT_CH_SWITCH_ANNOUNCE 4 /* 11y D9.0 */ -#define ACTION_DSE_MEASUREMENT_REQ 5 /* 11y D9.0 */ -#define ACTION_DSE_MEASUREMENT_REPORT 6 /* 11y D9.0 */ -#define ACTION_MEASUREMENT_PILOT_ACTION 7 /* 11y D9.0 */ -#define ACTION_DSE_POWER_CONSTRAINT 8 /* 11y D9.0 */ -#define ACTION_WIFI_DIRECT 9 /* 11y */ -#define ACTION_GAS_INITIAL_REQ 10 /* 11U */ -#define ACTION_GAS_INITIAL_RSP 11 /* 11U */ -#define ACTION_GAS_COMEBACK_REQ 12 /* 11U */ -#define ACTION_GAS_COMEBACK_RSP 13 /* 11U */ -#define ACTION_TDLS_DISCOVERY_RSP 14 /* 11z D13.0 */ -#define ACTION_FTM_REQUEST 32 /* 11mc D3.0 */ -#define ACTION_FTM 33 /* 11mc D3.0 */ -#define ACTION_FILS_DISCOVERY 34 /* 2016ai */ -#define ACTION_VENDOR_USAGE 221 - -#ifdef DPP_SUPPORT -#define WFA_DPP_SUBTYPE 0x1A -#endif /* DPP_SUPPORT */ - -/*HT Action field value */ -#define NOTIFY_BW_ACTION 0 -#define SMPS_ACTION 1 -#define PSMP_ACTION 2 -#define SETPCO_ACTION 3 -#define MIMO_CHA_MEASURE_ACTION 4 -#define MIMO_N_BEACONFORM 5 /* non-compressed beamforming report */ -#define MIMO_BEACONFORM 6 /* compressed beamforming report */ -#define ANTENNA_SELECT 7 - -/* VHT Action field value */ -#define ACT_VHT_COMP_BFING 0 /* VHT Compressed Beamforming */ -#define ACT_VHT_GRP_ID_MGMT 1 /* Group ID Management */ -#define ACT_VHT_OPMODE_NOTIFY 2 /* Operating Mode Notification */ - -#define ACT_FUNC_SIZE (MAX_ACT_STATE * MAX_ACT_MSG) -/* - STA's AUTHENTICATION state machine: states, evvents, total function # -*/ -#define AUTH_REQ_IDLE 0 -#define AUTH_WAIT_SEQ2 1 -#define AUTH_WAIT_SEQ4 2 -#define AUTH_WAIT_SAE 3 -#define MAX_AUTH_STATE 4 - -#define AUTH_MACHINE_BASE 0 -#define MT2_MLME_AUTH_REQ 0 -#define MT2_PEER_AUTH_EVEN 1 -#define MT2_AUTH_TIMEOUT 2 -#define MT2_MLME_SAE_AUTH_REQ 3 -#define MT2_MLME_SAE_AUTH_COMMIT 4 -#define MT2_MLME_SAE_AUTH_CONFIRM 5 -#define MAX_AUTH_MSG 6 - -#define AUTH_FUNC_SIZE (MAX_AUTH_STATE * MAX_AUTH_MSG) - -/* - STA's AUTH_RSP state machine: states, events, total function # -*/ -#define AUTH_RSP_IDLE 0 -#define AUTH_RSP_WAIT_CHAL 1 -#define MAX_AUTH_RSP_STATE 2 - -#define AUTH_RSP_MACHINE_BASE 0 -#define MT2_AUTH_CHALLENGE_TIMEOUT 0 -#define MT2_PEER_AUTH_ODD 1 -#define MT2_PEER_DEAUTH 2 -#define MAX_AUTH_RSP_MSG 3 - -#define AUTH_RSP_FUNC_SIZE (MAX_AUTH_RSP_STATE * MAX_AUTH_RSP_MSG) - -/* - STA's SYNC state machine: states, events, total function # -*/ -#define SYNC_IDLE \ - 0 /* merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state */ -#define JOIN_WAIT_BEACON 1 -#define SCAN_LISTEN 2 -#define SCAN_PENDING 3 -#define MAX_SYNC_STATE 4 - -#define SYNC_MACHINE_BASE 0 -#define MT2_MLME_SCAN_REQ 0 -#define MT2_MLME_JOIN_REQ 1 -#define MT2_MLME_START_REQ 2 -#define MT2_PEER_BEACON 3 -#define MT2_PEER_PROBE_RSP 4 -#define MT2_PEER_ATIM 5 -#define MT2_SCAN_TIMEOUT 6 -#define MT2_BEACON_TIMEOUT 7 -#define MT2_ATIM_TIMEOUT 8 -#define MT2_PEER_PROBE_REQ 9 -#define MT2_MLME_FORCE_JOIN_REQ 10 -#define MT2_MLME_FORCE_SCAN_REQ 11 -#define MAX_SYNC_MSG 12 - -#define SYNC_FUNC_SIZE (MAX_SYNC_STATE * MAX_SYNC_MSG) - -/*Messages for the DLS state machine */ -#define DLS_IDLE 0 -#define MAX_DLS_STATE 1 - -#define DLS_MACHINE_BASE 0 -#define MT2_MLME_DLS_REQ 0 -#define MT2_PEER_DLS_REQ 1 -#define MT2_PEER_DLS_RSP 2 -#define MT2_MLME_DLS_TEAR_DOWN 3 -#define MT2_PEER_DLS_TEAR_DOWN 4 -#define MAX_DLS_MSG 5 - -#define DLS_FUNC_SIZE (MAX_DLS_STATE * MAX_DLS_MSG) - -/* - WSC State machine: states, events, total function # -*/ -#ifdef WSC_INCLUDED -/*Messages for the WSC State machine */ -#define WSC_IDLE 0 -#define MAX_WSC_STATE 1 -#define WSC_FUNC_SIZE (MAX_WSC_STATE * MAX_WSC_MSG) - -#endif /* WSC_INCLUDED */ - -/* - AP's CONTROL/CONNECT state machine: states, events, total function # -*/ -#define AP_CNTL_FUNC_SIZE 1 - -/* - AP's ASSOC state machine: states, events, total function # -*/ -#define AP_ASSOC_IDLE 0 -#define AP_MAX_ASSOC_STATE 1 - -#define AP_ASSOC_MACHINE_BASE 0 -#define APMT2_MLME_DISASSOC_REQ 0 -#define APMT2_PEER_DISASSOC_REQ 1 -#define APMT2_PEER_ASSOC_REQ 2 -#define APMT2_PEER_REASSOC_REQ 3 -#define APMT2_CLS3ERR 4 -#define AP_MAX_ASSOC_MSG 5 - -#define AP_ASSOC_FUNC_SIZE (AP_MAX_ASSOC_STATE * AP_MAX_ASSOC_MSG) - -/* - AP's AUTHENTICATION state machine: states, events, total function # -*/ -#define AP_AUTH_REQ_IDLE 0 -#define AP_MAX_AUTH_STATE 1 - -#define AP_AUTH_MACHINE_BASE 0 -#define APMT2_MLME_DEAUTH_REQ 0 -#define APMT2_CLS2ERR 1 -#define APMT2_PEER_DEAUTH 2 -#define APMT2_PEER_AUTH_REQ 3 -#define APMT2_PEER_AUTH_CONFIRM 4 -#define AP_MAX_AUTH_MSG 5 - -#define AP_AUTH_FUNC_SIZE (AP_MAX_AUTH_STATE * AP_MAX_AUTH_MSG) - -/* - AP's SYNC state machine: states, events, total function # -*/ -#define AP_SYNC_IDLE 0 -#ifdef AP_SCAN_SUPPORT -#define AP_SCAN_LISTEN 1 -#define AP_MAX_SYNC_STATE 2 -#else -#define AP_MAX_SYNC_STATE 1 -#endif - -#define AP_SYNC_MACHINE_BASE 0 -#define APMT2_PEER_PROBE_REQ 0 -#define APMT2_PEER_BEACON 1 -#define APMT2_PEER_PROBE_RSP 2 - -#ifdef AP_SCAN_SUPPORT -#define APMT2_MLME_SCAN_REQ 3 -#define APMT2_SCAN_TIMEOUT 4 -#define APMT2_MLME_SCAN_CNCL 5 -#ifdef CON_WPS -#define APMT2_MLME_SCAN_COMPLETE 6 -#ifdef CUSTOMER_DCC_FEATURE -#define APMT2_CHANNEL_SWITCH 7 -#define AP_MAX_SYNC_MSG 8 -#else -#define AP_MAX_SYNC_MSG 7 -#endif /* CUSTOMER_DCC_FEATURE*/ - -#else /* CON_WPS */ - -#ifdef CUSTOMER_DCC_FEATURE -#define APMT2_CHANNEL_SWITCH 6 -#define AP_MAX_SYNC_MSG 7 -#else -#define AP_MAX_SYNC_MSG 6 -#endif - -#endif /* CON_WPS */ -#else -#define AP_MAX_SYNC_MSG 3 -#endif - -#define AP_SYNC_FUNC_SIZE (AP_MAX_SYNC_STATE * AP_MAX_SYNC_MSG) - -#ifdef WDS_SUPPORT -/*WDS state machine: states, events, total function #*/ -#define WDS_IDLE 0 -#define WDS_MAX_STATE 1 - -#define WDS_MACHINE_BASE 0 -#define APMT2_WDS_RECV_UC_DATA 0 -#define WDS_BSS_LINKDOWN 1 -#define WDS_MAX_MSG 2 - -#define WDS_FUNC_SIZE (WDS_MAX_STATE * WDS_MAX_MSG) - -#endif - -#ifdef APCLI_SUPPORT -/*ApCli authentication state machine */ -#define APCLI_AUTH_REQ_IDLE 0 -#define APCLI_AUTH_WAIT_SEQ2 1 -#define APCLI_AUTH_WAIT_SEQ4 2 -#ifdef APCLI_SAE_SUPPORT -#define APCLI_AUTH_WAIT_SAE 3 -#define APCLI_MAX_AUTH_STATE 4 -#else -#define APCLI_MAX_AUTH_STATE 3 -#endif -#define APCLI_AUTH_MACHINE_BASE 0 -#define APCLI_MT2_MLME_AUTH_REQ 0 -#define APCLI_MT2_MLME_DEAUTH_REQ 1 -#define APCLI_MT2_PEER_AUTH_EVEN 2 -#define APCLI_MT2_PEER_DEAUTH 3 -#define APCLI_MT2_AUTH_TIMEOUT 4 -#ifdef APCLI_SAE_SUPPORT -#define APCLI_MT2_MLME_SAE_AUTH_REQ 5 -#define APCLI_MT2_MLME_SAE_AUTH_COMMIT 6 -#define APCLI_MT2_MLME_SAE_AUTH_CONFIRM 7 -#define APCLI_MAX_AUTH_MSG 8 -#else -#define APCLI_MAX_AUTH_MSG 5 -#endif -#define APCLI_AUTH_FUNC_SIZE (APCLI_MAX_AUTH_STATE * APCLI_MAX_AUTH_MSG) - -/*ApCli association state machine */ -#define APCLI_ASSOC_IDLE 0 -#define APCLI_ASSOC_WAIT_RSP 1 -#define APCLI_MAX_ASSOC_STATE 2 - -#define APCLI_ASSOC_MACHINE_BASE 0 -#define APCLI_MT2_MLME_ASSOC_REQ 0 -#define APCLI_MT2_MLME_DISASSOC_REQ 1 -#define APCLI_MT2_PEER_DISASSOC_REQ 2 -#define APCLI_MT2_PEER_ASSOC_RSP 3 -#define APCLI_MT2_ASSOC_TIMEOUT 4 -#define APCLI_MAX_ASSOC_MSG 5 - -#define APCLI_ASSOC_FUNC_SIZE (APCLI_MAX_ASSOC_STATE * APCLI_MAX_ASSOC_MSG) - -/*ApCli sync state machine */ -#define APCLI_SYNC_IDLE \ - 0 /* merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state */ -#define APCLI_JOIN_WAIT_PROBE_RSP 1 -#define APCLI_MAX_SYNC_STATE 2 - -#define APCLI_SYNC_MACHINE_BASE 0 -#define APCLI_MT2_MLME_PROBE_REQ 0 -#define APCLI_MT2_PEER_PROBE_RSP 1 -#define APCLI_MT2_PEER_BEACON 2 -#define APCLI_MT2_PROBE_TIMEOUT 3 -#define APCLI_MAX_SYNC_MSG 4 - -#define APCLI_SYNC_FUNC_SIZE (APCLI_MAX_SYNC_STATE * APCLI_MAX_SYNC_MSG) - -/*ApCli ctrl state machine */ -#define APCLI_CTRL_DISCONNECTED \ - 0 /* merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state */ -#define APCLI_CTRL_PROBE 1 -#define APCLI_CTRL_AUTH 2 -#define APCLI_CTRL_AUTH_2 3 -#define APCLI_CTRL_ASSOC 4 -#define APCLI_CTRL_DEASSOC 5 -#define APCLI_CTRL_CONNECTED 6 -#ifndef APCLI_CONNECTION_TRIAL -#define APCLI_MAX_CTRL_STATE 7 -#else -#undef APCLI_MAC_CTRL_STATE -#define APCLI_CTRL_TRIAL_TRIGGERED 7 -#define APCLI_MAX_CTRL_STATE 8 -#endif /* APCLI_CONNECTION_TRIAL */ - -#define APCLI_CTRL_MACHINE_BASE 0 -#define APCLI_CTRL_JOIN_REQ 0 -#define APCLI_CTRL_PROBE_RSP 1 -#define APCLI_CTRL_AUTH_RSP 2 -#define APCLI_CTRL_DISCONNECT_REQ 3 -#define APCLI_CTRL_PEER_DISCONNECT_REQ 4 -#define APCLI_CTRL_ASSOC_RSP 5 -#define APCLI_CTRL_DEASSOC_RSP 6 -#define APCLI_CTRL_JOIN_REQ_TIMEOUT 7 -#define APCLI_CTRL_AUTH_REQ_TIMEOUT 8 -#define APCLI_CTRL_ASSOC_REQ_TIMEOUT 9 -#define APCLI_CTRL_MT2_AUTH_REQ 10 -#define APCLI_CTRL_MT2_ASSOC_REQ 11 -#define APCLI_CTRL_SCAN_DONE 12 -#define APCLI_MIC_FAILURE_REPORT_FRAME 13 -#ifndef APCLI_CONNECTION_TRIAL -#define APCLI_MAX_CTRL_MSG 14 -#else -#undef APCLI_MAX_CTRL_MSG -#define APCLI_CTRL_TRIAL_CONNECT 14 -#define APCLI_CTRL_TRIAL_CONNECT_TIMEOUT 15 -#define APCLI_CTRL_TRIAL_PHASE2_TIMEOUT 16 -#define APCLI_CTRL_TRIAL_RETRY_TIMEOUT 17 -#define APCLI_MAX_CTRL_MSG 18 -#endif /* APCLI_CONNECTION_TRIAL */ - -#define APCLI_CTRL_FUNC_SIZE (APCLI_MAX_CTRL_STATE * APCLI_MAX_CTRL_MSG) - -/*ApCli,Repeater Link Down reason */ -#define APCLI_LINKDOWN_NONE 0 -#define APCLI_LINKDOWN_DEAUTH_REQ 1 -#define APCLI_LINKDOWN_DEASSOC_REQ 2 -#define APCLI_LINKDOWN_PEER_DEASSOC_REQ 3 -#define APCLI_LINKDOWN_DISCONNECT_REQ 4 -#define APCLI_LINKDOWN_PEER_DEASSOC_RSP 5 - -#define APCLI_DISCONNECT_SUB_REASON_NONE 0 -#define APCLI_DISCONNECT_SUB_REASON_REPTLM_TRIGGER_TOO_LONG 1 -#define APCLI_DISCONNECT_SUB_REASON_MTM_IDLE_TOO_LONG 2 -#define APCLI_DISCONNECT_SUB_REASON_MTM_REMOVE_STA 3 -#define APCLI_DISCONNECT_SUB_REASON_APCLI_IF_DOWN 4 -#define APCLI_DISCONNECT_SUB_REASON_MNT_NO_BEACON 5 -#define APCLI_DISCONNECT_SUB_REASON_AP_PEER_DISASSOC_REQ 6 -#define APCLI_DISCONNECT_SUB_REASON_AP_PEER_DEAUTH_REQ 7 -#define APCLI_DISCONNECT_SUB_REASON_APCFG_DEL_MAC_ENTRY 8 -#define APCLI_DISCONNECT_SUB_REASON_CHANGE_APCLI_IF 9 -#define APCLI_DISCONNECT_SUB_REASON_APCLI_TRIGGER_TOO_LONG 10 - -#endif /* APCLI_SUPPORT */ - -/* ============================================================================= */ - -/* ACK policy of QOS Control field bit 6:5 */ -#define NORMAL_ACK 0x00 /* b6:5 = 00 */ -#define NO_ACK 0x20 /* b6:5 = 01 */ -#define NO_EXPLICIT_ACK 0x40 /* b6:5 = 10 */ -#define BLOCK_ACK 0x60 /* b6:5 = 11 */ - -#ifdef USB_BULK_BUF_ALIGMENT -#define BUF_ALIGMENT_RINGSIZE 6 /*BUF_ALIGMENT_RINGSIZE must >= 3 */ -#endif /* USB_BULK_BUF_ALIGMENT */ - -/* STA_CSR4.field.TxResult */ -#define TX_RESULT_SUCCESS 0 -#define TX_RESULT_ZERO_LENGTH 1 -#define TX_RESULT_UNDER_RUN 2 -#define TX_RESULT_OHY_ERROR 4 -#define TX_RESULT_RETRY_FAIL 6 - -/* MCS for CCK. BW.SGI.STBC are reserved */ -#define MCS_LONGP_RATE_1 0 /* long preamble CCK 1Mbps */ -#define MCS_LONGP_RATE_2 1 /* long preamble CCK 1Mbps */ -#define MCS_LONGP_RATE_5_5 2 -#define MCS_LONGP_RATE_11 3 -#define MCS_SHORTP_RATE_1 \ - 4 /* long preamble CCK 1Mbps. short is forbidden in 1Mbps */ -#define MCS_SHORTP_RATE_2 5 /* short preamble CCK 2Mbps */ -#define MCS_SHORTP_RATE_5_5 6 -#define MCS_SHORTP_RATE_11 7 -/* To send duplicate legacy OFDM. set BW=BW_40. SGI.STBC are reserved */ -#define MCS_RATE_6 0 /* legacy OFDM */ -#define MCS_RATE_9 1 /* OFDM */ -#define MCS_RATE_12 2 /* OFDM */ -#define MCS_RATE_18 3 /* OFDM */ -#define MCS_RATE_24 4 /* OFDM */ -#define MCS_RATE_36 5 /* OFDM */ -#define MCS_RATE_48 6 /* OFDM */ -#define MCS_RATE_54 7 /* OFDM */ -/* HT */ -#define MCS_0 0 /* 1S */ -#define MCS_1 1 -#define MCS_2 2 -#define MCS_3 3 -#define MCS_4 4 -#define MCS_5 5 -#define MCS_6 6 -#define MCS_7 7 -#define MCS_8 8 /* 2S */ -#define MCS_9 9 -#define MCS_10 10 -#define MCS_11 11 -#define MCS_12 12 -#define MCS_13 13 -#define MCS_14 14 -#define MCS_15 15 -#define MCS_16 16 /* 3*3 */ -#define MCS_17 17 -#define MCS_18 18 -#define MCS_19 19 -#define MCS_20 20 -#define MCS_21 21 -#define MCS_22 22 -#define MCS_23 23 -#define MCS_24 24 /* 3*3 */ -#define MCS_25 25 -#define MCS_26 26 -#define MCS_27 27 -#define MCS_28 28 -#define MCS_29 29 -#define MCS_30 30 -#define MCS_31 31 -#define MCS_32 32 -#define MCS_AUTO 33 - -#ifdef DOT11_VHT_AC -#define MCS_VHT_2SS_MCS9 0x29 -#define MCS_VHT_2SS_MCS8 0x28 -#define MCS_VHT_2SS_MCS7 0x27 -#define MCS_VHT_2SS_MCS6 0x26 -#define MCS_VHT_2SS_MCS5 0x25 -#define MCS_VHT_2SS_MCS4 0x24 -#define MCS_VHT_2SS_MCS3 0x23 -#define MCS_VHT_2SS_MCS2 0x22 -#define MCS_VHT_2SS_MCS1 0x21 -#define MCS_VHT_2SS_MCS0 0x20 - -#define MCS_VHT_1SS_MCS9 0x19 -#define MCS_VHT_1SS_MCS8 0x18 -#define MCS_VHT_1SS_MCS7 0x17 -#define MCS_VHT_1SS_MCS6 0x16 -#define MCS_VHT_1SS_MCS5 0x15 -#define MCS_VHT_1SS_MCS4 0x14 -#define MCS_VHT_1SS_MCS3 0x13 -#define MCS_VHT_1SS_MCS2 0x12 -#define MCS_VHT_1SS_MCS1 0x11 -#define MCS_VHT_1SS_MCS0 0x10 - -#define VHT_RATE_IDX_1SS_MCS0 0 -#define VHT_RATE_IDX_1SS_MCS1 1 -#define VHT_RATE_IDX_1SS_MCS2 2 -#define VHT_RATE_IDX_1SS_MCS3 3 -#define VHT_RATE_IDX_1SS_MCS4 4 -#define VHT_RATE_IDX_1SS_MCS5 5 -#define VHT_RATE_IDX_1SS_MCS6 6 -#define VHT_RATE_IDX_1SS_MCS7 7 -#define VHT_RATE_IDX_1SS_MCS8 8 -#define VHT_RATE_IDX_1SS_MCS9 9 - -#define VHT_RATE_IDX_2SS_MCS0 10 -#define VHT_RATE_IDX_2SS_MCS1 11 -#define VHT_RATE_IDX_2SS_MCS2 12 -#define VHT_RATE_IDX_2SS_MCS3 13 -#define VHT_RATE_IDX_2SS_MCS4 14 -#define VHT_RATE_IDX_2SS_MCS5 15 -#define VHT_RATE_IDX_2SS_MCS6 16 -#define VHT_RATE_IDX_2SS_MCS7 17 -#define VHT_RATE_IDX_2SS_MCS8 18 -#define VHT_RATE_IDX_2SS_MCS9 19 -#endif /* DOT11_VHT_AC */ - -#ifdef DOT11_N_SUPPORT -/* OID_HTPHYMODE */ -/* MODE */ -#define HTMODE_MM 0 -#define HTMODE_GF 1 -#endif /* DOT11_N_SUPPORT */ - -/* Fixed Tx MODE - HT, CCK or OFDM */ -#define FIXED_TXMODE_HT 0 -#define FIXED_TXMODE_CCK 1 -#define FIXED_TXMODE_OFDM 2 -#define FIXED_TXMODE_VHT 3 - -/* BW */ -#define BW_20 BAND_WIDTH_20 -#define BW_40 BAND_WIDTH_40 -#define BW_80 BAND_WIDTH_80 -#define BW_160 BAND_WIDTH_160 /* 160MHz */ -#define BW_10 \ - BAND_WIDTH_10 /* 802.11j has 10MHz. This definition is for internal usage. doesn't fill in the IE or other field. */ -#define BW_5 BAND_WIDTH_5 -#define BW_8080 BAND_WIDTH_8080 -#define BW_25 BAND_WIDTH_25 -#define BW_NUM BAND_WIDTH_NUM - -#define RF_BW_20 0x01 -#define RF_BW_40 0x02 -#define RF_BW_10 0x04 -#define RF_BW_80 0x08 -#define RF_BW_8080 0x10 -#define RF_BW_160 0x20 - -#define RF_MODE_CCK 1 -#define RF_MODE_OFDM 2 - -#ifdef DOT11_N_SUPPORT -#define HT_BW_20 0 -#define HT_BW_40 1 -#endif /* DOT11_N_SUPPORT */ - -#ifdef DOT11_VHT_AC -#define VHT_BW_2040 0 -#define VHT_BW_80 1 -#define VHT_BW_160 2 -#define VHT_BW_8080 3 -#endif /* DOT11_VHT_AC */ - -#ifdef DOT11_N_SUPPORT -/* SHORTGI */ -#define GI_400 GAP_INTERVAL_400 /* only support in HT mode */ -#define GI_BOTH GAP_INTERVAL_BOTH -#endif /* DOT11_N_SUPPORT */ -#define GI_800 GAP_INTERVAL_800 - -/* Min. MPDU Start Spacing */ -enum { - MPDU_DENSITY_NO_RESTRICT = 0, - MPDU_DENSITY_QUARTER_US, - MPDU_DENSITY_HALF_US, - MPDU_DENSITY_1_US, - MPDU_DENSITY_2_US, - MPDU_DENSITY_4_US, - MPDU_DENSITY_8_US, - MPDU_DENSITY_16_US -}; - -/* STBC */ -#define STBC_NONE 0 -#ifdef DOT11_N_SUPPORT -#define STBC_USE 1 /* limited use in rt2860b phy */ -#define RXSTBC_ONE 1 /* rx support of one spatial stream */ -#define RXSTBC_TWO 2 /* rx support of 1 and 2 spatial stream */ -#define RXSTBC_THR 3 /* rx support of 1~3 spatial stream */ -/* MCS FEEDBACK */ -#define MCSFBK_NONE 0 /* not support mcs feedback / */ -#define MCSFBK_RSV 1 /* reserved */ -#define MCSFBK_UNSOLICIT 2 /* only support unsolict mcs feedback */ -#define MCSFBK_MRQ 3 /* response to both MRQ and unsolict mcs feedback */ - -/* MIMO power safe */ -#define MMPS_STATIC 0 -#define MMPS_DYNAMIC 1 -#define MMPS_RSV 2 -#define MMPS_DISABLE 3 - -/* A-MSDU size */ -#define AMSDU_0 0 -#define AMSDU_1 1 - -#endif /* DOT11_N_SUPPORT */ - -/* MCS use 7 bits */ -#define TXRATEMIMO 0x80 -#define TXRATEMCS 0x7F -#define TXRATEOFDM 0x7F -#define RATE_1 0 -#define RATE_2 1 -#define RATE_5_5 2 -#define RATE_11 3 -#define RATE_6 4 /* OFDM */ -#define RATE_9 5 /* OFDM */ -#define RATE_12 6 /* OFDM */ -#define RATE_18 7 /* OFDM */ -#define RATE_24 8 /* OFDM */ -#define RATE_36 9 /* OFDM */ -#define RATE_48 10 /* OFDM */ -#define RATE_54 11 /* OFDM */ -#define RATE_FIRST_OFDM_RATE RATE_6 -#define RATE_LAST_OFDM_RATE RATE_54 -#define RATE_6_5 12 /* HT mix */ -#define RATE_13 13 /* HT mix */ -#define RATE_19_5 14 /* HT mix */ -#define RATE_26 15 /* HT mix */ -#define RATE_39 16 /* HT mix */ -#define RATE_52 17 /* HT mix */ -#define RATE_58_5 18 /* HT mix */ -#define RATE_65 19 /* HT mix */ -#define RATE_78 20 /* HT mix */ -#define RATE_104 21 /* HT mix */ -#define RATE_117 22 /* HT mix */ -#define RATE_130 23 /* HT mix */ -/*#define RATE_AUTO_SWITCH 255 // for StaCfg[0].FixedTxRate only */ -#define HTRATE_0 12 -#define RATE_FIRST_MM_RATE HTRATE_0 -#define RATE_FIRST_HT_RATE HTRATE_0 -#define RATE_LAST_HT_RATE HTRATE_0 - -#ifdef MIN_PHY_RATE_SUPPORT -#define PHY_RATE_1 1 -#define PHY_RATE_2 2 -#define PHY_RATE_5 5 -#define PHY_RATE_11 11 -#define PHY_RATE_6 6 -#define PHY_RATE_9 9 -#define PHY_RATE_12 12 -#define PHY_RATE_18 18 -#define PHY_RATE_24 24 -#define PHY_RATE_36 36 -#define PHY_RATE_48 48 -#define PHY_RATE_54 54 -#endif /* MIN_PHY_RATE_SUPPORT */ - -/* pTxWI->txop */ -#define IFS_HTTXOP 0 /* The txop will be handles by ASIC. */ -#define IFS_PIFS 1 -#define IFS_SIFS 2 -#define IFS_BACKOFF 3 - -/* pTxD->RetryMode */ -#define LONG_RETRY 1 -#define SHORT_RETRY 0 - -/* Country Region definition */ -#define REGION_MINIMUM_BG_BAND 0 -#define REGION_0_BG_BAND 0 /* 1-11 */ -#define REGION_1_BG_BAND 1 /* 1-13 */ -#define REGION_2_BG_BAND 2 /* 10-11 */ -#define REGION_3_BG_BAND 3 /* 10-13 */ -#define REGION_4_BG_BAND 4 /* 14 */ -#define REGION_5_BG_BAND 5 /* 1-14 */ -#define REGION_6_BG_BAND 6 /* 3-9 */ -#define REGION_7_BG_BAND 7 /* 5-13 */ -#define REGION_31_BG_BAND 31 /* 5-13 */ -#define REGION_32_BG_BAND 32 /* 1 - 13 */ -#define REGION_33_BG_BAND 33 /* 1 - 14 */ -#define REGION_MAXIMUM_BG_BAND 7 - -#define REGION_MINIMUM_A_BAND 0 -#define REGION_0_A_BAND \ - 0 /* 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 */ -#define REGION_1_A_BAND \ - 1 /* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 */ -#define REGION_2_A_BAND 2 /* 36, 40, 44, 48, 52, 56, 60, 64 */ -#define REGION_3_A_BAND 3 /* 52, 56, 60, 64, 149, 153, 157, 161 */ -#define REGION_4_A_BAND 4 /* 149, 153, 157, 161, 165 */ -#define REGION_5_A_BAND 5 /* 149, 153, 157, 161 */ -#define REGION_6_A_BAND 6 /* 36, 40, 44, 48 */ -#define REGION_7_A_BAND \ - 7 /* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165, 169, 173 */ -#define REGION_8_A_BAND 8 /* 52, 56, 60, 64 */ -#define REGION_9_A_BAND \ - 9 /* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 */ -#define REGION_10_A_BAND 10 /* 36, 40, 44, 48, 149, 153, 157, 161, 165 */ -#define REGION_11_A_BAND \ - 11 /* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 */ -#define REGION_12_A_BAND \ - 12 /* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 */ -#define REGION_13_A_BAND \ - 13 /* 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161 */ -#define REGION_14_A_BAND \ - 14 /* 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165 */ -#define REGION_15_A_BAND 15 /* 149, 153, 157, 161, 165, 169, 173 */ -#define REGION_16_A_BAND 16 /* 52, 56, 60, 64, 149, 153, 157, 161, 165 */ -#define REGION_17_A_BAND 17 -#define REGION_18_A_BAND 18 -#define REGION_19_A_BAND 19 -#define REGION_20_A_BAND 20 -#define REGION_21_A_BAND 21 -#define REGION_22_A_BAND 22 -#define REGION_MAXIMUM_A_BAND 37 - -#ifdef HW_COEXISTENCE_SUPPORT -#endif /* HW_COEXISTENCE_SUPPORT */ - -/* RC4 init value, used fro WEP & TKIP */ -#define PPPINITFCS32 0xffffffff /* Initial FCS value */ - -/* value domain of pAd->StaCfg[0].PortSecured. 802.1X controlled port definition */ -#define WPA_802_1X_PORT_SECURED 1 -#define WPA_802_1X_PORT_NOT_SECURED 2 - -#define PAIRWISE_KEY 1 -#define GROUP_KEY 2 - -/* Rate Adaptation simpling interval setting */ -#ifdef SMART_ANTENNA -#define DEF_QUICK_RA_TIME_INTERVAL 50 /* Quick RA 50 msec after rate change */ -#else -#define DEF_QUICK_RA_TIME_INTERVAL 100 -#endif - -#define DEF_RA_TIME_INTRVAL 500 - -/*definition of DRS */ -#define MAX_TX_RATE_INDEX 33 /* Maximum Tx Rate Table Index value */ - -/* pre-allocated free NDIS PACKET/BUFFER poll for internal usage */ -#define MAX_NUM_OF_FREE_NDIS_PACKET 128 - -/*Block ACK */ -#define MAX_TX_REORDERBUF 64 -#define MAX_RX_REORDERBUF 64 -#define DEFAULT_TX_TIMEOUT 30 -#define DEFAULT_RX_TIMEOUT 30 -#ifdef CONFIG_AP_SUPPORT -#define MAX_BARECI_SESSION 16 -#endif /* CONFIG_AP_SUPPORT */ - -/* definition of Recipient or Originator */ -#define I_RECIPIENT TRUE -#define I_ORIGINATOR FALSE - -#define DEFAULT_BBP_TX_POWER 0 -#define DEFAULT_RF_TX_POWER 5 -#define DEFAULT_BBP_TX_FINE_POWER_CTRL 0 - -#define MAX_INI_BUFFER_SIZE 16384 -#define MAX_PARAM_BUFFER_SIZE (2048) /* enough for ACL (18*64) */ -/*18 : the length of Mac address acceptable format "01:02:03:04:05:06;") */ -/*64 : MAX_NUM_OF_ACL_LIST */ - -#ifdef RT_BIG_ENDIAN -#define DIR_READ 0 -#define DIR_WRITE 1 -#define TYPE_TXD 0 -#define TYPE_RXD 1 -#define TYPE_TXINFO 0 -#define TYPE_RXINFO 1 -#define TYPE_TXWI 0 -#define TYPE_RXWI 1 -#define TYPE_TMACINFO 0 -#define TYPE_RMACINFO 1 -#endif - -/* ========================= AP rtmp_def.h =========================== */ -/* value domain for pAd->EventTab.Log[].Event */ -#define EVENT_RESET_ACCESS_POINT 0 /* Log = "hh:mm:ss Restart Access Point" */ -#define EVENT_ASSOCIATED \ - 1 /* Log = "hh:mm:ss STA 00:01:02:03:04:05 associated" */ -#define EVENT_DISASSOCIATED \ - 2 /* Log = "hh:mm:ss STA 00:01:02:03:04:05 left this BSS" */ -#define EVENT_AGED_OUT \ - 3 /* Log = "hh:mm:ss STA 00:01:02:03:04:05 was aged-out and removed from this BSS" */ -#define EVENT_COUNTER_M 4 -#define EVENT_INVALID_PSK 5 -#define EVENT_MAX_EVENT_TYPE 6 -/* ==== end of AP rtmp_def.h ============ */ - -/* definition RSSI Number */ -#define RSSI_IDX_0 0 -#define RSSI_IDX_1 1 -#define RSSI_IDX_2 2 -#define RSSI_IDX_3 3 - -/* definition of radar detection */ -#define RD_NORMAL_MODE 0 /* Not found radar signal */ -#define RD_SWITCHING_MODE 1 /* Found radar signal, and doing channel switch */ -#define RD_SILENCE_MODE \ - 2 /* After channel switch, need to be silence a while to ensure radar not found */ -#define RD_MAX_STATE RD_SILENCE_MODE - -/*Driver defined cid for mapping status and command. */ -#define SLEEPCID 0x11 -#define WAKECID 0x22 -#define QUERYPOWERCID 0x33 -#define OWNERMCU 0x1 -#define OWNERCPU 0x0 - -/* MBSSID definition */ -#define ENTRY_NOT_FOUND 0xFF - -/* The signal threshold (RSSI) over new rate adaption */ -#define SIGNAL_THRESHOLD_OVER_NEW_RATE_ADAPT -65 - -/* After Linux 2.6.9, - * VLAN module use Private (from user) interface flags (netdevice->priv_flags). - * #define IFF_802_1Q_VLAN 0x1 -- 802.1Q VLAN device. in if.h - * ref to ip_sabotage_out() [ out->priv_flags & IFF_802_1Q_VLAN ] in br_netfilter.c - * - * For this reason, we MUST use EVEN value in priv_flags - */ -#define INT_MAIN 0x0100 -#define INT_MBSSID 0x0200 -#define INT_WDS 0x0300 -#define INT_APCLI 0x0400 -#define INT_MESH 0x0500 -#define INT_P2P 0x0600 -#define INT_MONITOR 0x0700 -#define INT_MSTA 0x0800 -#define MAX_INT_TYPES 8 - -/* TODO: Shiang-usw, need to revise this, consider both wdev->wdev_type and pEntry->EntryType!! */ - -/* - Connected peers can be seperate as following two sub groups: - Category + Type(Properties) - 1. Category: - NONE - Invalid Category to indicate/un-used entry - STA - entry which use 802.11 Auth/Assoc method to connect to us - AP - entry which provide 802.11 BSS feature and work as a AP mode - WDS - entry which are 4-address repeater mode - MESH - entry which are 4-address and follow 802.11s - - MCAST - entry which used internally for binding MCAT/BCAST info for a - specifi wifi_dev instance which work as a AP mode - WDEV - entry which are used internally for binding to a specific - wifi_dev instance - - 2. Type - -*/ -#define ENTRY_CAT_NONE 0x000 -#define ENTRY_CAT_STA 0x001 -#define ENTRY_CAT_AP 0x002 -#define ENTRY_CAT_WDS 0x004 -#define ENTRY_CAT_MESH 0x008 -#ifdef AIR_MONITOR -#define ENTRY_CAT_MONITOR 0x010 -#endif -#define ENTRY_CAT_MCAST 0x400 -#define ENTRY_CAT_WDEV 0x800 -#define ENTRY_CAT_MASK 0xfff - -enum { ENTRY_STATE_NONE, ENTRY_STATE_SYNC }; - -typedef struct _WIFI_NODE_TYPE { - UINT32 rsv : 26; - UINT32 type : 3; - UINT32 cat : 3; -} WIFI_NODE_TYPE; - -#define ENTRY_AP ENTRY_CAT_AP -#define ENTRY_GO (ENTRY_CAT_AP | 0x01000) - -#define ENTRY_INFRA ENTRY_CAT_STA -#define ENTRY_GC (ENTRY_CAT_STA | 0x01000) -#define ENTRY_ADHOC (ENTRY_CAT_STA | 0x02000) -#define ENTRY_APCLI (ENTRY_CAT_STA | 0x04000) -#define ENTRY_DLS (ENTRY_CAT_STA | 0x08000) -#define ENTRY_TDLS (ENTRY_CAT_STA | 0x10000) -#define ENTRY_CLIENT (ENTRY_CAT_STA | 0x20000) -#define ENTRY_REPEATER (ENTRY_CAT_STA | 0x40000) - -#define ENTRY_WDS ENTRY_CAT_WDS -#define ENTRY_MESH ENTRY_CAT_MESH - -#ifdef AIR_MONITOR -#define ENTRY_MONITOR ENTRY_CAT_MONITOR -#endif - -#define ENTRY_NONE ENTRY_CAT_NONE - -#define IS_ENTRY_NONE(_x) ((_x)->EntryType == ENTRY_CAT_NONE) -#define IS_ENTRY_CLIENT(_x) ((_x)->EntryType == ENTRY_CLIENT) -#define IS_ENTRY_WDS(_x) ((_x)->EntryType & ENTRY_CAT_WDS) -#ifdef AIR_MONITOR -#define IS_ENTRY_MONITOR(_x) ((_x)->EntryType == ENTRY_CAT_MONITOR) -#endif /* AIR_MONITOR */ -#define IS_ENTRY_APCLI(_x) ((_x)->EntryType == ENTRY_APCLI) -#define IS_ENTRY_REPEATER(_x) ((_x)->EntryType == ENTRY_REPEATER) -#define IS_ENTRY_ADHOC(_x) ((_x)->EntryType & ENTRY_ADHOC) -#define IS_ENTRY_AP(_x) ((_x)->EntryType & ENTRY_CAT_AP) -#define IS_ENTRY_MESH(_x) ((_x)->EntryType & ENTRY_CAT_MESH) -#define IS_ENTRY_DLS(_x) ((_x)->EntryType == ENTRY_DLS) -#define IS_ENTRY_TDLS(_x) ((_x)->EntryType == ENTRY_TDLS) -#define IS_ENTRY_MCAST(_x) ((_x)->EntryType == ENTRY_CAT_MCAST) - -#ifdef CLIENT_WDS -#define IS_ENTRY_CLIWDS(_x) \ - CLIENT_STATUS_TEST_FLAG((_x), fCLIENT_STATUS_CLI_WDS) -#endif /* CLIENT_WDS */ - -#define IS_VALID_ENTRY(_x) (((_x) != NULL) && ((_x)->EntryType != ENTRY_NONE)) - -#define SET_ENTRY_NONE(_x) ((_x)->EntryType = ENTRY_NONE) -#define SET_ENTRY_CLIENT(_x) ((_x)->EntryType = ENTRY_CLIENT) -#define SET_ENTRY_WDS(_x) ((_x)->EntryType = ENTRY_WDS) -#define SET_ENTRY_APCLI(_x) ((_x)->EntryType = ENTRY_APCLI) -#define SET_ENTRY_AP(_x) ((_x)->EntryType = ENTRY_AP) -#ifdef AIR_MONITOR -#define SET_ENTRY_MONITOR(_x) ((_x)->EntryType = ENTRY_MONITOR) -#endif /* AIR_MONITOR */ -#define SET_ENTRY_ADHOC(_x) ((_x)->EntryType = ENTRY_ADHOC) -#define SET_ENTRY_MESH(_x) ((_x)->EntryType = ENTRY_MESH) -#define SET_ENTRY_DLS(_x) ((_x)->EntryType = ENTRY_DLS) -#define SET_ENTRY_TDLS(_x) ((_x)->EntryType = ENTRY_TDLS) -#define SET_ENTRY_REPEATER(_x) ((_x)->EntryType = ENTRY_REPEATER) -#define SET_CONNECTION_TYPE(_x, _type) ((_x)->ConnectionType = (_type)) -#ifdef CLIENT_WDS -#define SET_ENTRY_CLIWDS(_x) \ - CLIENT_STATUS_SET_FLAG((_x), fCLIENT_STATUS_CLI_WDS) -#endif /* CLIENT_WDS */ -/* CFG_TODO */ -#define SET_PKT_OPMODE_AP(_x) ((_x)->OpMode = OPMODE_AP) -#define SET_PKT_OPMODE_STA(_x) ((_x)->OpMode = OPMODE_STA) -#define IS_PKT_OPMODE_AP(_x) ((_x)->OpMode == OPMODE_AP) -#define IS_PKT_OPMODE_STA(_x) ((_x)->OpMode == OPMODE_STA) - -#define IS_OPMODE_AP(_x) ((_x)->OpMode == OPMODE_AP) -#define IS_OPMODE_STA(_x) ((_x)->OpMode == OPMODE_STA) - -#if defined(ANDROID_SUPPORT) || defined(RT_CFG80211_SUPPORT) -#if defined(CONFIG_SUPPORT_OPENWRT) -#define INF_MAIN_DEV_NAME "rai" -#define INF_MBSSID_DEV_NAME "rai" -#else -#if CONFIG_RTPCI_AP_RF_OFFSET == 0x48000 -#define INF_MAIN_DEV_NAME "wlani" -#define INF_MBSSID_DEV_NAME "wlani" -#else -#define INF_MAIN_DEV_NAME "wlan" -#define INF_MBSSID_DEV_NAME "wlan" -#endif -#endif /* CONFIG_SUPPORT_OPENWRT */ -#else /* !ANDROID_SUPPORT || RT_CFG80211_SUPPORT */ -#if defined(BB_SOC) && !defined(MULTI_INF_SUPPORT) -#define INF_MAIN_DEV_NAME "rai0" -#define INF_MBSSID_DEV_NAME "rai" -#else -#if CONFIG_RTPCI_AP_RF_OFFSET == 0x48000 -#define INF_MAIN_DEV_NAME "rai" -#define INF_MBSSID_DEV_NAME "rai" -#else -#define INF_MAIN_DEV_NAME "ra0" -#define INF_MBSSID_DEV_NAME "ra" -#endif -#endif /* BB_SOC */ -#endif /* ANDROID_SUPPORT */ - -#define INF_MSTA_DEV_NAME "ra" - -#if CONFIG_RTPCI_AP_RF_OFFSET == 0x48000 -#define INF_WDS_DEV_NAME "wdsi" -#define INF_APCLI_DEV_NAME "apclii" -#define INF_MESH_DEV_NAME "meshi" -#define INF_P2P_DEV_NAME "p2pi" -#define INF_MONITOR_DEV_NAME "moni" -#else -#define INF_WDS_DEV_NAME "wds" -#define INF_APCLI_DEV_NAME "apcli" -#define INF_MESH_DEV_NAME "mesh" -#define INF_P2P_DEV_NAME "p2p" -#define INF_MONITOR_DEV_NAME "mon" -#endif - -/* WEP Key TYPE */ -#define WEP_HEXADECIMAL_TYPE 0 -#define WEP_ASCII_TYPE 1 - -/* WIRELESS EVENTS definition */ -/* Max number of char in custom event, refer to wireless_tools.28/wireless.20.h */ -#define IW_CUSTOM_MAX_LEN 255 /* In bytes */ - -/* For system event - start */ -#define IW_SYS_EVENT_FLAG_START 0x0200 -#define IW_ASSOC_EVENT_FLAG 0x0200 -#define IW_DISASSOC_EVENT_FLAG 0x0201 -#define IW_DEAUTH_EVENT_FLAG 0x0202 -#define IW_AGEOUT_EVENT_FLAG 0x0203 -#define IW_COUNTER_MEASURES_EVENT_FLAG 0x0204 -#define IW_REPLAY_COUNTER_DIFF_EVENT_FLAG 0x0205 -#define IW_RSNIE_DIFF_EVENT_FLAG 0x0206 -#define IW_MIC_DIFF_EVENT_FLAG 0x0207 -#define IW_ICV_ERROR_EVENT_FLAG 0x0208 -#define IW_MIC_ERROR_EVENT_FLAG 0x0209 -#define IW_GROUP_HS_TIMEOUT_EVENT_FLAG 0x020A -#define IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG 0x020B -#define IW_RSNIE_SANITY_FAIL_EVENT_FLAG 0x020C -#define IW_SET_KEY_DONE_WPA1_EVENT_FLAG 0x020D -#define IW_SET_KEY_DONE_WPA2_EVENT_FLAG 0x020E -#define IW_STA_LINKUP_EVENT_FLAG 0x020F -#define IW_STA_LINKDOWN_EVENT_FLAG 0x0210 -#define IW_SCAN_COMPLETED_EVENT_FLAG 0x0211 -#define IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG 0x0212 -#define IW_CHANNEL_CHANGE_EVENT_FLAG 0x0213 -#define IW_STA_MODE_EVENT_FLAG 0x0214 -#define IW_MAC_FILTER_LIST_EVENT_FLAG 0x0215 -#define IW_AUTH_REJECT_CHALLENGE_FAILURE 0x0216 -#define IW_SCANNING_EVENT_FLAG 0x0217 -#define IW_START_IBSS_FLAG 0x0218 -#define IW_JOIN_IBSS_FLAG 0x0219 -#define IW_SHARED_WEP_FAIL 0x021A -#define IW_WPS_END_EVENT_FLAG 0x021B -/* if add new system event flag, please upadte the IW_SYS_EVENT_FLAG_END */ -#define IW_SYS_EVENT_FLAG_END 0x021B -#define IW_SYS_EVENT_TYPE_NUM \ - (IW_SYS_EVENT_FLAG_END - IW_SYS_EVENT_FLAG_START + 1) -/* For system event - end */ - -#ifdef IDS_SUPPORT -/* For spoof attack event - start */ -#define IW_SPOOF_EVENT_FLAG_START 0x0300 -#define IW_CONFLICT_SSID_EVENT_FLAG 0x0300 -#define IW_SPOOF_ASSOC_RESP_EVENT_FLAG 0x0301 -#define IW_SPOOF_REASSOC_RESP_EVENT_FLAG 0x0302 -#define IW_SPOOF_PROBE_RESP_EVENT_FLAG 0x0303 -#define IW_SPOOF_BEACON_EVENT_FLAG 0x0304 -#define IW_SPOOF_DISASSOC_EVENT_FLAG 0x0305 -#define IW_SPOOF_AUTH_EVENT_FLAG 0x0306 -#define IW_SPOOF_DEAUTH_EVENT_FLAG 0x0307 -#define IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG 0x0308 -#define IW_REPLAY_ATTACK_EVENT_FLAG 0x0309 -/* if add new spoof attack event flag, please upadte the IW_SPOOF_EVENT_FLAG_END */ -#define IW_SPOOF_EVENT_FLAG_END 0x0309 -#define IW_SPOOF_EVENT_TYPE_NUM \ - (IW_SPOOF_EVENT_FLAG_END - IW_SPOOF_EVENT_FLAG_START + 1) -/* For spoof attack event - end */ - -/* For flooding attack event - start */ -#define IW_FLOOD_EVENT_FLAG_START 0x0400 -#define IW_FLOOD_AUTH_EVENT_FLAG 0x0400 -#define IW_FLOOD_ASSOC_REQ_EVENT_FLAG 0x0401 -#define IW_FLOOD_REASSOC_REQ_EVENT_FLAG 0x0402 -#define IW_FLOOD_PROBE_REQ_EVENT_FLAG 0x0403 -#define IW_FLOOD_DISASSOC_EVENT_FLAG 0x0404 -#define IW_FLOOD_DEAUTH_EVENT_FLAG 0x0405 -#define IW_FLOOD_EAP_REQ_EVENT_FLAG 0x0406 -/* if add new flooding attack event flag, please upadte the IW_FLOOD_EVENT_FLAG_END */ -#define IW_FLOOD_EVENT_FLAG_END 0x0406 -#define IW_FLOOD_EVENT_TYPE_NUM \ - (IW_FLOOD_EVENT_FLAG_END - IW_FLOOD_EVENT_FLAG_START + 1) -/* For flooding attack - end */ -#endif /* IDS_SUPPORT */ - -#ifdef WSC_INCLUDED -/* For WSC wireless event - start */ -#define IW_WSC_EVENT_FLAG_START 0x0500 -#define IW_WSC_PBC_SESSION_OVERLAP 0x0500 -#define IW_WSC_REGISTRAR_SUPPORT_PBC 0x0501 -#define IW_WSC_REGISTRAR_SUPPORT_PIN 0x0502 -#define IW_WSC_STATUS_SUCCESS 0x0503 -#define IW_WSC_STATUS_FAIL 0x0504 -#define IW_WSC_2MINS_TIMEOUT 0x0505 -#define IW_WSC_SEND_EAPOL_START 0x0506 -#define IW_WSC_SEND_WSC_START 0x0507 -#define IW_WSC_SEND_M1 0x0508 -#define IW_WSC_SEND_M2 0x0509 -#define IW_WSC_SEND_M3 0x050a -#define IW_WSC_SEND_M4 0x050b -#define IW_WSC_SEND_M5 0x050c -#define IW_WSC_SEND_M6 0x050d -#define IW_WSC_SEND_M7 0x050e -#define IW_WSC_SEND_M8 0x050f -#define IW_WSC_SEND_DONE 0x0510 -#define IW_WSC_SEND_ACK 0x0511 -#define IW_WSC_SEND_NACK 0x0512 -#define IW_WSC_RECEIVE_WSC_START 0x0513 -#define IW_WSC_RECEIVE_M1 0x0514 -#define IW_WSC_RECEIVE_M2 0x0515 -#define IW_WSC_RECEIVE_M3 0x0516 -#define IW_WSC_RECEIVE_M4 0x0517 -#define IW_WSC_RECEIVE_M5 0x0518 -#define IW_WSC_RECEIVE_M6 0x0519 -#define IW_WSC_RECEIVE_M7 0x051a -#define IW_WSC_RECEIVE_M8 0x051b -#define IW_WSC_RECEIVE_DONE 0x051c -#define IW_WSC_RECEIVE_ACK 0x051d -#define IW_WSC_RECEIVE_NACK 0x051e -#define IW_WSC_MANY_CANDIDATE 0x051f -#define IW_WSC_NEXT_CANDIDATE 0x0520 -#define IW_WSC_T1_TIMER_TIMEOUT 0x0521 -#define IW_WSC_T2_TIMER_TIMEOUT 0x0522 -#define IW_WSC_EVENT_FLAG_END 0x0522 -#define IW_WSC_EVENT_TYPE_NUM \ - (IW_WSC_EVENT_FLAG_END - IW_WSC_EVENT_FLAG_START + 1) -/* For WSC wireless event - end */ -#endif /* WSC_INCLUDED */ -/* End - WIRELESS EVENTS definition */ - -#ifdef MCAST_RATE_SPECIFIC -#ifdef MCAST_BCAST_RATE_SET_SUPPORT -typedef enum { - MCAST_TYPE_BOTH_BCM_PKT = 0, - MCAST_TYPE_MULTICAST_PKT, - MCAST_TYPE_BROADCAST_PKT -} MCAST_TYPE; -#endif /* MCAST_BCAST_RATE_SET_SUPPORT */ -#define MCAST_DISABLE 0 -#define MCAST_CCK 1 -#define MCAST_OFDM 2 -#define MCAST_HTMIX 3 -#define MCAST_VHT 4 -#endif /* MCAST_RATE_SPECIFIC */ - -#ifdef CONFIG_RA_PHY_RATE_SUPPORT -#define BCN_DISABLE 0 -#define BCN_CCK 1 -#define BCN_OFDM 2 -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - -/* For AsicRadioOff/AsicRadioOn function */ -/* TODO: shiang-usw, check those RADIO ON/OFF values here!!! */ -#define DOT11POWERSAVE 0 -#define GUIRADIO_OFF 1 -#define RTMP_HALT 2 -#define GUI_IDLE_POWER_SAVE 3 - -enum { - RESUME_RADIO_ON, - SUSPEND_RADIO_OFF, - MLME_RADIO_ON, - MLME_RADIO_OFF, - DOT11_RADIO_ON, - DOT11_RADIO_OFF, -}; - -/* -- */ - -/* definition for WpaSupport flag */ -#define WPA_SUPPLICANT_DISABLE 0x00 -#define WPA_SUPPLICANT_ENABLE 0x01 -#define WPA_SUPPLICANT_ENABLE_WITH_WEB_UI 0x02 -#define WPA_SUPPLICANT_ENABLE_WPS 0x80 - -#ifdef MICROWAVE_OVEN_SUPPORT -/* definition for mitigating microwave interference */ -#define MO_FALSE_CCA_TH 25 -#define MO_MEAS_PERIOD 0 /* 0 ~ 100 ms */ -#define MO_IDLE_PERIOD 1 /* 100 ~ 1000 ms */ -#endif /* MICROWAVE_OVEN_SUPPORT */ - -typedef enum _ETHER_BAND_BINDDING { - EtherTrafficBand2G, - EtherTrafficBand5G, -} ETHER_BAND_BINDDING, - *PETHER_BAND_BINDDING; - -/* definition for Antenna Diversity flag */ -typedef enum { - ANT_DIVERSITY_DISABLE, - ANT_DIVERSITY_ENABLE, - ANT_FIX_ANT0, - ANT_FIX_ANT1, - ANT_SW_DIVERSITY_ENABLE, - ANT_HW_DIVERSITY_ENABLE, - ANT_DIVERSITY_DEFAULT -} ANT_DIVERSITY_TYPE; - -enum IEEE80211_BAND { - IEEE80211_BAND_2G, - IEEE80211_BAND_5G, - IEEE80211_BAND_NUMS -}; - -#ifdef CONFIG_SWITCH_CHANNEL_OFFLOAD -#define CHANNEL_SWITCH_OFFLOAD 0x68 -#define CHANNEL_MCU_READY 0x7064 -#endif /* CONFIG_SWITCH_CHANNEL_OFFLOAD */ - -#if defined(CONFIG_MULTI_CHANNEL) || defined(DOT11Z_TDLS_SUPPORT) -#define HW_NULL_FRAME_1_OFFSET 0x7700 -#define HW_NULL_FRAME_2_OFFSET 0x7780 - -enum { - EDCA_AC0_DEQUEUE_DISABLE = (1 << 0), - EDCA_AC1_DEQUEUE_DISABLE = (1 << 1), - EDCA_AC2_DEQUEUE_DISABLE = (1 << 2), - EDCA_AC3_DEQUEUE_DISBALE = (1 << 3), - HCCA_DEQUEUE_DISABLE = (1 << 4) -}; - -enum { HCCA_TO_EDCA, EDCA_TO_HCCA = 0x55 }; - -#define MUL_CHANNEL_ENABLE 0x77 -#define HCCA_TIMEOUT 400 -#define EDCA_TIMEOUT 400 -#endif /* defined(CONFIG_MULTI_CHANNEL) || defined(DOT11Z_TDLS_SUPPORT) */ - -/* add bcn v2 support , 1.5k beacon support */ -#ifdef CONFIG_AP_SUPPORT -/* #define BCN_V2_SUPPORT 1 */ -#endif - -#define ABS(_x, _y) (((_x) > (_y)) ? ((_x) - (_y)) : ((_y) - (_x))) - -#define A2Dec(_X, _p) \ - { \ - UCHAR *p; \ - _X = 0; \ - p = _p; \ - while (((*p >= '0') && (*p <= '9'))) { \ - if ((*p >= '0') && (*p <= '9')) \ - _X = _X * 10 + *p - 48; \ - p++; \ - } \ - } - -#define A2Hex(_X, _p) \ - do { \ - char *__p; \ - (_X) = 0; \ - __p = (char *)(_p); \ - while (((*__p >= 'a') && (*__p <= 'f')) || \ - ((*__p >= 'A') && (*__p <= 'F')) || \ - ((*__p >= '0') && (*__p <= '9'))) { \ - if ((*__p >= 'a') && (*__p <= 'f')) \ - (_X) = (_X)*16 + *__p - 87; \ - else if ((*__p >= 'A') && (*__p <= 'F')) \ - (_X) = (_X)*16 + *__p - 55; \ - else if ((*__p >= '0') && (*__p <= '9')) \ - (_X) = (_X)*16 + *__p - 48; \ - __p++; \ - } \ - } while (0) - -#ifndef min -#define min(_a, _b) (((_a) < (_b)) ? (_a) : (_b)) -#endif - -#ifndef max -#define max(_a, _b) (((_a) > (_b)) ? (_a) : (_b)) -#endif - -/* ========================================================================== */ -/* - The full range (1-4,095) of VLAN IDs must be supported by the 802.1Q - implementation. - VLAN ID 0 is reserved. -*/ - -#define RT_VLAN_8023_HEADER_COPY(__pAd, __VLAN_VID, __VLAN_Priority, \ - __pHeader8023, __HdrLen, __pData, __TPID) \ - { \ - VLAN_8023_Header_Copy(__VLAN_VID, __VLAN_Priority, \ - __pHeader8023, __HdrLen, __pData, \ - __TPID); \ - } - -#define RT_80211_TO_8023_PACKET(__pAd, __VLAN_VID, __VLAN_Priority, __pRxBlk, \ - __pHeader802_3, _wdev_idx, __TPID) \ - { \ - wlan_802_11_to_802_3_packet( \ - get_netdev_from_bssid(__pAd, _wdev_idx), \ - __pRxBlk->OpMode, __VLAN_VID, __VLAN_Priority, \ - __pRxBlk->pRxPacket, __pRxBlk->pData, \ - __pRxBlk->DataSize, __pHeader802_3, __TPID); \ - } - -/* TODO: shiang-usw, fix me for pEntry->apidx to func_tb_idx */ -#define RTMP_L2_FRAME_TX_ACTION(__pAd, __ApIdx, __FrameBuf, __FrameLen) \ - RTMPL2FrameTxAction(__pAd, get_netdev_from_bssid(__pAd, __ApIdx), \ - announce_802_3_packet, __ApIdx, __FrameBuf, \ - __FrameLen, __pAd->OpMode) - -#define RTMP_UPDATE_OS_PACKET_INFO(__pAd, __pRxBlk, _wdev_idx) \ - RtmpOsPktInit(__pRxBlk->pRxPacket, \ - get_netdev_from_bssid(__pAd, _wdev_idx), \ - __pRxBlk->pData, __pRxBlk->DataSize); - -#ifdef SYSTEM_LOG_SUPPORT -/* - RTMPSendWirelessEvent --> RtmpOsSendWirelessEvent --> RtmpDrvSendWirelessEvent -*/ -#define RTMPSendWirelessEvent(__pAd, __Event_flag, __pAddr, _wdev_idx, __Rssi) \ - RtmpOsSendWirelessEvent(__pAd, __Event_flag, __pAddr, _wdev_idx, \ - __Rssi, RtmpDrvSendWirelessEvent); -#else -#define RTMPSendWirelessEvent(__pAd, __Event_flag, __pAddr, __BssIdx, __Rssi) -#endif /* SYSTEM_LOG_SUPPORT */ - -#define RTMP_OS_TASK_INIT(__pTask, __pTaskName, __pAd) \ - RtmpOSTaskInit(__pTask, __pTaskName, __pAd, &(__pAd)->RscTaskMemList, \ - &(__pAd)->RscSemMemList); - -#define BandOffset 0x200 -#endif /* __RTMP_DEF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_dmacb.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_dmacb.h deleted file mode 100644 index 931bf00475..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_dmacb.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __RTMP_DMACB_H__ -#define __RTMP_DMACB_H__ - -/* - Data buffer for DMA operation, the buffer must be contiguous physical memory - Both DMA to / from CPU use the same structure. -*/ -typedef struct _RTMP_DMABUF { - ULONG AllocSize; - PVOID AllocVa; - NDIS_PHYSICAL_ADDRESS AllocPa; -} RTMP_DMABUF, *PRTMP_DMABUF; - -/* - Control block (Descriptor) for all ring descriptor DMA operation, buffer must be - contiguous physical memory. NDIS_PACKET stored the binding Rx packet descriptor - which won't be released, driver has to wait until upper layer return the packet - before giveing up this rx ring descriptor to ASIC. NDIS_BUFFER is assocaited pair - to describe the packet buffer. For Tx, NDIS_PACKET stored the tx packet descriptor - which driver should ACK upper layer when the tx is physically done or failed. -*/ -typedef struct _RTMP_DMACB { - ULONG AllocSize; /* Control block size */ - PVOID AllocVa; /* Control block virtual address */ - NDIS_PHYSICAL_ADDRESS AllocPa; /* Control block physical address */ - PNDIS_PACKET pNdisPacket; - PNDIS_PACKET pNextNdisPacket; - NDIS_PHYSICAL_ADDRESS PacketPa; - RTMP_DMABUF DmaBuf; -#ifdef CUT_THROUGH - UINT16 token_id; -#endif /* CUT_THROUGH */ -} RTMP_DMACB, *PRTMP_DMACB ____cacheline_aligned; - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_dot11.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_dot11.h deleted file mode 100644 index 70308e846f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_dot11.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - -*/ - -#ifndef __DOT11_BASE_H__ -#define __DOT11_BASE_H__ - -#include "rtmp_type.h" -#include "dot11_base.h" -#include "security/dot11i_wpa.h" - -#ifdef DOT11_N_SUPPORT -#include "dot11n_ht.h" - -#ifdef DOT11_VHT_AC -#include "dot11ac_vht.h" -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT -#include "dot11k_rrm.h" -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef TXBF_SUPPORT -/* CSI/Steering values */ -#define DOT11N_BF_FB_NONE 0 -#define DOT11N_BF_FB_CSI 1 -#define DOT11N_BF_FB_NOCOMP 2 -#define DOT11N_BF_FB_COMP 3 -#endif /* TXBF_SUPPORT */ - -/* 4-byte HTC field. maybe included in any frame except non-QOS data frame. The Order bit must set 1. */ -typedef struct GNU_PACKED _HT_CONTROL { -#ifdef RT_BIG_ENDIAN - UINT32 RDG : 1; - UINT32 ACConstraint : 1; - UINT32 rsv2 : 5; - UINT32 NDPAnnounce : 1; - UINT32 CSISTEERING : 2; - UINT32 rsv1 : 2; - UINT32 CalSeq : 2; - UINT32 CalPos : 2; - UINT32 MFBorASC : 7; - UINT32 MFSI : 3; - UINT32 MSI : 3; - UINT32 MRQ : 1; - UINT32 TRQ : 1; - UINT32 vht : 1; -#else - UINT32 vht : 1; /* indicate for VHT variant or HT variant */ - UINT32 TRQ : 1; /*sounding request */ - UINT32 MRQ : 1; /*MCS feedback. Request for a MCS feedback */ - UINT32 MSI : 3; /*MCS Request, MRQ Sequence identifier */ - UINT32 MFSI : 3; /*SET to the received value of MRS. 0x111 for unsolicited MFB. */ - UINT32 MFBorASC : 7; /*Link adaptation feedback containing recommended MCS. 0x7f for no feedback or not available */ - UINT32 CalPos : 2; /* calibration position */ - UINT32 CalSeq : 2; /*calibration sequence */ - UINT32 rsv1 : 2; /* Reserved */ - UINT32 CSISTEERING : 2; /*CSI/ STEERING */ - UINT32 NDPAnnounce : 1; /* ZLF announcement */ - UINT32 rsv2 : 5; /*calibration sequence */ - UINT32 ACConstraint : 1; /*feedback request */ - UINT32 RDG : 1; /*RDG / More PPDU */ -#endif /* !RT_BIG_ENDIAN */ -} HT_CONTROL, *PHT_CONTROL; - -/* 2-byte QOS CONTROL field */ -typedef struct GNU_PACKED _QOS_CONTROL { -#ifdef RT_BIG_ENDIAN - USHORT Txop_QueueSize : 8; - USHORT AMsduPresent : 1; - USHORT AckPolicy : 2; /*0: normal ACK 1:No ACK 2:scheduled under MTBA/PSMP 3: BA */ - USHORT EOSP : 1; - USHORT TID : 4; -#else - USHORT TID : 4; - USHORT EOSP : 1; - USHORT AckPolicy : 2; /*0: normal ACK 1:No ACK 2:scheduled under MTBA/PSMP 3: BA */ - USHORT AMsduPresent : 1; - USHORT Txop_QueueSize : 8; -#endif /* !RT_BIG_ENDIAN */ -} QOS_CONTROL, *PQOS_CONTROL; - -typedef struct GNU_PACKED _AC_PARAM_RECORD { - UINT8 aci_aifsn; - UINT8 ecw_max : 4; - UINT8 ecw_min : 4; - UINT16 txop_limit; -} AC_PARAM_RECORD; - -typedef struct GNU_PACKED _PSPOLL_FRAME { - FRAME_CONTROL FC; - USHORT Aid; - UCHAR Bssid[MAC_ADDR_LEN]; - UCHAR Ta[MAC_ADDR_LEN]; -} PSPOLL_FRAME, *PPSPOLL_FRAME; - -typedef struct GNU_PACKED _RTS_FRAME { - FRAME_CONTROL FC; - USHORT Duration; - UCHAR Addr1[MAC_ADDR_LEN]; - UCHAR Addr2[MAC_ADDR_LEN]; -} RTS_FRAME, *PRTS_FRAME; - -#endif /* __DOT11_BASE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_iface.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_iface.h deleted file mode 100644 index a399dc65b1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_iface.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rt_iface.h - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __RTMP_IFACE_H__ -#define __RTMP_IFACE_H__ - -#ifdef RTMP_PCI_SUPPORT -#include "iface/rtmp_pci.h" -#endif /* RTMP_PCI_SUPPORT */ - -#ifdef RTMP_RBUS_SUPPORT -#include "iface/rtmp_rbs.h" -#endif /* RTMP_RBUS_SUPPORT */ - -typedef struct _INF_PCI_CONFIG_ { - unsigned long - CSRBaseAddress; /* PCI MMIO Base Address, all access will use */ - unsigned int irq_num; -} INF_PCI_CONFIG; - -typedef struct _INF_USB_CONFIG_ { - unsigned char BulkInEpAddr; /* bulk-in endpoint address */ - unsigned char BulkOutEpAddr[6]; /* bulk-out endpoint address */ -} INF_USB_CONFIG; - -typedef struct _INF_RBUS_CONFIG_ { - unsigned long csr_addr; - unsigned int irq; -} INF_RBUS_CONFIG; - -typedef union _RTMP_INF_CONFIG_ { - struct _INF_PCI_CONFIG_ pciConfig; - struct _INF_USB_CONFIG_ usbConfig; - struct _INF_RBUS_CONFIG_ rbusConfig; -} RTMP_INF_CONFIG; - -#endif /* __RTMP_IFACE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_os.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_os.h deleted file mode 100644 index b1ebb7b697..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_os.h +++ /dev/null @@ -1,143 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rtmp_os.h - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __RTMP_OS_H__ -#define __RTMP_OS_H__ - -/* Driver Operators */ -typedef int (*RTMP_PRINTK)(const char *ftm, ...); -typedef int (*RTMP_SNPRINTF)(char *, ULONG, const char *ftm, ...); - -typedef struct _RTMP_OS_ABL_OPS { - int (*ra_printk)(const char *ftm, ...); - int (*ra_snprintf)(char *, ULONG, const char *ftm, ...); -} RTMP_OS_ABL_OPS; - -extern RTMP_OS_ABL_OPS *pRaOsOps; - -#ifndef CONFIG_RTPCI_AP_RF_OFFSET -#define CONFIG_RTPCI_AP_RF_OFFSET 0 -#endif - -#ifdef LINUX -#ifndef OS_ABL_FUNC_SUPPORT -#include "os/rt_linux.h" - -#else - -#ifdef RTMP_MODULE_OS -/* for util/netif */ -#include "os/rt_linux.h" -#else -/* for core */ -#include "os/rt_drv.h" -#endif /* RTMP_MODULE_OS */ -#endif /* OS_ABL_FUNC_SUPPORT */ -#endif /* LINUX */ - -/* TODO: shiang, temporary put it here! */ -#include "os/pkt_meta.h" - -/* - This data structure mainly strip some callback function defined in - "struct net_device" in kernel source "include/linux/netdevice.h". - - The definition of this data structure may various depends on different - OS. Use it carefully. -*/ -typedef struct _RTMP_OS_NETDEV_OP_HOOK_ { - void *open; - void *stop; - void *xmit; - void *ioctl; - void *get_stats; - void *priv; - void *get_wstats; - void *iw_handler; - void *wdev; - int priv_flags; - unsigned char devAddr[6]; - unsigned char devName[16]; - unsigned char needProtcted; -} RTMP_OS_NETDEV_OP_HOOK, *PRTMP_OS_NETDEV_OP_HOOK; - -typedef enum _RTMP_TASK_STATUS_ { - RTMP_TASK_STAT_UNKNOWN = 0, - RTMP_TASK_STAT_INITED = 1, - RTMP_TASK_STAT_RUNNING = 2, - RTMP_TASK_STAT_STOPED = 4, -} RTMP_TASK_STATUS; -#define RTMP_TASK_CAN_DO_INSERT (RTMP_TASK_STAT_INITED | RTMP_TASK_STAT_RUNNING) - -#define RTMP_OS_TASK_NAME_LEN 16 - -#if defined(RTMP_MODULE_OS) || !defined(OS_ABL_FUNC_SUPPORT) -/* used in UTIL/NETIF module */ -typedef struct _RTMP_OS_TASK_ { - char taskName[RTMP_OS_TASK_NAME_LEN]; - void *priv; - /*unsigned long taskFlags; */ - RTMP_TASK_STATUS taskStatus; - unsigned char task_killed; - struct task_struct *kthread_task; - wait_queue_head_t kthread_q; - BOOLEAN kthread_running; -} OS_TASK; -#endif /* RTMP_MODULE_OS || ! OS_ABL_FUNC_SUPPORT */ - -int RtmpOSIRQRequest(PNET_DEV pNetDev); - -#ifndef OS_ABL_SUPPORT -#define RTMP_MATOpsInit(__pAd) -#define RTMP_MATPktRxNeedConvert(__pAd, __pDev) \ - MATPktRxNeedConvert(__pAd, __pDev) -#define RTMP_MATEngineRxHandle(__pAd, __pPkt, __InfIdx) \ - MATEngineRxHandle(__pAd, __pPkt, __InfIdx) -#else - -#define RTMP_MATOpsInit(__pAd) \ - do { \ - (__pAd)->MATPktRxNeedConvert = MATPktRxNeedConvert; \ - (__pAd)->MATEngineRxHandle = MATEngineRxHandle; \ - } while (0) - -#define RTMP_MATPktRxNeedConvert(__pAd, __pDev) \ - ((__pAd)->MATPktRxNeedConvert(__pAd, __pDev)) -#define RTMP_MATEngineRxHandle(__pAd, __pPkt, __InfIdx) \ - ((__pAd)->MATEngineRxHandle(__pAd, __pPkt, __InfIdx)) -#endif /* OS_ABL_SUPPORT */ - -#ifndef LINUX -typedef struct _os_kref { - NDIS_SPIN_LOCK lock; - UCHAR refcount; -} os_kref; -#endif - -void os_kref_init(os_kref *kref); -void os_kref_get(os_kref *kref); -int os_kref_put(os_kref *kref, void (*release)(os_kref *kref)); - -#endif /* __RMTP_OS_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_osabl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_osabl.h deleted file mode 100644 index 7c15efe023..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_osabl.h +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** - - Module Name: - OS/rtmp_osabl.h - - Abstract: - Some structure/definitions for OS ABL function. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - -***************************************************************************/ - -#ifndef __RTMP_OS_ABL_H__ -#define __RTMP_OS_ABL_H__ - -#ifdef OS_ABL_FUNC_SUPPORT - -#ifdef OS_ABL_OS_PCI_SUPPORT -#ifndef RTMP_MAC_PCI -#define RTMP_MAC_PCI -#endif /* RTMP_MAC_PCI */ -#ifndef RTMP_PCI_SUPPORT -#define RTMP_PCI_SUPPORT -#endif /* RTMP_PCI_SUPPORT */ -#endif /* OS_ABL_OS_PCI_SUPPORT */ - -#ifdef OS_ABL_OS_USB_SUPPORT -#include - -#define RTMP_MAC_USB -#define RTMP_USB_SUPPORT -#endif /* OS_ABL_OS_USB_SUPPORT */ - -#ifdef OS_ABL_OS_RBUS_SUPPORT -#ifndef RTMP_RBUS_SUPPORT -#define RTMP_RBUS_SUPPORT -#endif /* RTMP_RBUS_SUPPORT */ -#endif /* OS_ABL_OS_RBUS_SUPPORT */ - -#ifdef OS_ABL_OS_AP_SUPPORT -#ifndef CONFIG_AP_SUPPORT -#define CONFIG_AP_SUPPORT -#endif /* CONFIG_AP_SUPPORT */ -#endif /* OS_ABL_OS_AP_SUPPORT */ - -#ifdef OS_ABL_OS_STA_SUPPORT -#define CONFIG_STA_SUPPORT -#endif /* OS_ABL_OS_STA_SUPPORT */ - -/* AP & STA con-current */ -#undef RT_CONFIG_IF_OPMODE_ON_AP -#undef RT_CONFIG_IF_OPMODE_ON_STA - -#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT) -#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode) if (__OpMode == OPMODE_AP) -#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode) if (__OpMode == OPMODE_STA) -#else -#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode) -#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode) -#endif - -#endif /* OS_ABL_FUNC_SUPPORT */ - -#endif /* __RTMP_OS_ABL_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_timer.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_timer.h deleted file mode 100644 index 9e6ed016e2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_timer.h +++ /dev/null @@ -1,260 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2008, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rtmp_timer.h - - Abstract: - Ralink Wireless Driver timer related data structures and delcarations - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs - Shiang Tu Aug-28-2008 init version - -*/ - -#ifndef __RTMP_TIMER_H__ -#define __RTMP_TIMER_H__ - -#include "rtmp_os.h" - -struct _RTMP_ADAPTER; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -#define DECLARE_TIMER_FUNCTION(_func) \ - void rtmp_timer_##_func(struct timer_list *_timer) -#else -#define DECLARE_TIMER_FUNCTION(_func) \ - void rtmp_timer_##_func(unsigned long data) -#endif - -#define GET_TIMER_FUNCTION(_func) (PVOID) rtmp_timer_##_func - -/* ----------------- Timer Related MARCO ---------------*/ -/* In some os or chipset, we have a lot of timer functions and will read/write register, */ -/* it's not allowed in Linux USB sub-system to do it ( because of sleep issue when */ -/* submit to ctrl pipe). So we need a wrapper function to take care it. */ - -#ifdef RTMP_TIMER_TASK_SUPPORT -typedef VOID (*RTMP_TIMER_TASK_HANDLE)(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); -#endif /* RTMP_TIMER_TASK_SUPPORT */ - -typedef struct _RALINK_TIMER_STRUCT { - RTMP_OS_TIMER TimerObj; /* Ndis Timer object */ - BOOLEAN Valid; /* Set to True when call RTMPInitTimer */ - BOOLEAN State; /* True if timer cancelled */ - BOOLEAN PeriodicType; /* True if timer is periodic timer */ - BOOLEAN Repeat; /* True if periodic timer */ - ULONG TimerValue; /* Timer value in milliseconds */ - ULONG cookie; /* os specific object */ - void *pAd; - NDIS_SPIN_LOCK *timer_lock; -#ifdef RTMP_TIMER_TASK_SUPPORT - RTMP_TIMER_TASK_HANDLE handle; -#endif /* RTMP_TIMER_TASK_SUPPORT */ - VOID *pCaller; -} RALINK_TIMER_STRUCT, *PRALINK_TIMER_STRUCT; - -typedef struct _TIMER_FUNC_CONTEXT { - struct _RTMP_ADAPTER *pAd; - struct wifi_dev *wdev; - UCHAR BandIdx; -} TIMER_FUNC_CONTEXT, *PTIMER_FUNC_CONTEXT; - -#ifdef RTMP_TIMER_TASK_SUPPORT -typedef struct _RTMP_TIMER_TASK_ENTRY_ { - RALINK_TIMER_STRUCT *pRaTimer; - struct _RTMP_TIMER_TASK_ENTRY_ *pNext; -} RTMP_TIMER_TASK_ENTRY; - -#define TIMER_QUEUE_SIZE_MAX 128 -typedef struct _RTMP_TIMER_TASK_QUEUE_ { - unsigned int status; - unsigned char *pTimerQPoll; - RTMP_TIMER_TASK_ENTRY *pQPollFreeList; - RTMP_TIMER_TASK_ENTRY *pQHead; - RTMP_TIMER_TASK_ENTRY *pQTail; -} RTMP_TIMER_TASK_QUEUE; - -INT RtmpTimerQThread(ULONG Context); - -RTMP_TIMER_TASK_ENTRY *RtmpTimerQInsert(IN struct _RTMP_ADAPTER *pAd, - IN RALINK_TIMER_STRUCT *pTimer); - -BOOLEAN RtmpTimerQRemove(IN struct _RTMP_ADAPTER *pAd, - IN RALINK_TIMER_STRUCT *pTimer); - -void RtmpTimerQExit(struct _RTMP_ADAPTER *pAd); -void RtmpTimerQInit(struct _RTMP_ADAPTER *pAd); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -#define BUILD_TIMER_FUNCTION(_func) \ - void rtmp_timer_##_func(struct timer_list *_timer) \ - { \ - PRALINK_TIMER_STRUCT _pTimer = \ - from_timer(_pTimer, _timer, _timer); \ - RTMP_TIMER_TASK_ENTRY *_pQNode; \ - RTMP_ADAPTER *_pAd; \ - \ - _pTimer->handle = _func; \ - _pAd = (RTMP_ADAPTER *)_pTimer->pAd; \ - _pQNode = RtmpTimerQInsert(_pAd, _pTimer); \ - if ((_pQNode == NULL) && \ - (_pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT)) \ - RTMP_OS_Add_Timer(&_pTimer->TimerObj, OS_HZ); \ - } - -#else -#define BUILD_TIMER_FUNCTION(_func) \ - void rtmp_timer_##_func(unsigned long data) \ - { \ - PRALINK_TIMER_STRUCT _pTimer = (PRALINK_TIMER_STRUCT)data; \ - RTMP_TIMER_TASK_ENTRY *_pQNode; \ - RTMP_ADAPTER *_pAd; \ - \ - _pTimer->handle = _func; \ - _pAd = (RTMP_ADAPTER *)_pTimer->pAd; \ - _pQNode = RtmpTimerQInsert(_pAd, _pTimer); \ - if ((_pQNode == NULL) && \ - (_pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT)) \ - RTMP_OS_Add_Timer(&_pTimer->TimerObj, OS_HZ); \ - } -#endif -#else /* !RTMP_TIMER_TASK_SUPPORT */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -#define BUILD_TIMER_FUNCTION(_func) \ - void rtmp_timer_##_func(struct timer_list *_timer) \ - { \ - PRALINK_TIMER_STRUCT pTimer = \ - from_timer(pTimer, _timer, TimerObj); \ - \ - _func(NULL, (PVOID)pTimer->cookie, NULL, pTimer); \ - if (pTimer->Repeat) \ - RTMP_OS_Add_Timer(&pTimer->TimerObj, \ - pTimer->TimerValue); \ - } -#else -#define BUILD_TIMER_FUNCTION(_func) \ - void rtmp_timer_##_func(unsigned long data) \ - { \ - PRALINK_TIMER_STRUCT pTimer = (PRALINK_TIMER_STRUCT)data; \ - \ - _func(NULL, (PVOID)pTimer->cookie, NULL, pTimer); \ - if (pTimer->Repeat) \ - RTMP_OS_Add_Timer(&pTimer->TimerObj, \ - pTimer->TimerValue); \ - } -#endif -#endif /* RTMP_TIMER_TASK_SUPPORT */ - -DECLARE_TIMER_FUNCTION(MlmePeriodicExecTimer); -DECLARE_TIMER_FUNCTION(MlmeRssiReportExec); -DECLARE_TIMER_FUNCTION(AsicRxAntEvalTimeout); -DECLARE_TIMER_FUNCTION(APSDPeriodicExec); - -#ifdef DOT11W_PMF_SUPPORT -DECLARE_TIMER_FUNCTION(PMF_SAQueryTimeOut); -DECLARE_TIMER_FUNCTION(PMF_SAQueryConfirmTimeOut); -#endif /* DOT11W_PMF_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -DECLARE_TIMER_FUNCTION(APDetectOverlappingExec); - -#ifdef DOT11N_DRAFT3 -DECLARE_TIMER_FUNCTION(Bss2040CoexistTimeOut); -#endif /* DOT11N_DRAFT3 */ - -DECLARE_TIMER_FUNCTION(CMTimerExec); -#ifdef AP_SCAN_SUPPORT -DECLARE_TIMER_FUNCTION(APScanTimeout); -#endif /* AP_SCAN_SUPPORT */ -DECLARE_TIMER_FUNCTION(APQuickResponeForRateUpExec); - -#ifdef IDS_SUPPORT -DECLARE_TIMER_FUNCTION(RTMPIdsPeriodicExec); -#endif /* IDS_SUPPORT */ - -#ifdef DOT11R_FT_SUPPORT -DECLARE_TIMER_FUNCTION(FT_KDP_InfoBroadcast); -#endif /* DOT11R_FT_SUPPORT */ - -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef TXBF_SUPPORT -DECLARE_TIMER_FUNCTION(eTxBfProbeTimerExec); -#endif /* TXBF_SUPPORT */ - -#ifdef WSC_INCLUDED -DECLARE_TIMER_FUNCTION(WscEAPOLTimeOutAction); -DECLARE_TIMER_FUNCTION(Wsc2MinsTimeOutAction); -DECLARE_TIMER_FUNCTION(WscUPnPMsgTimeOutAction); -DECLARE_TIMER_FUNCTION(WscM2DTimeOutAction); -DECLARE_TIMER_FUNCTION(WscPBCTimeOutAction); -#ifdef CON_WPS -DECLARE_TIMER_FUNCTION(WscScanDoneCheckTimeOutAction); -#endif /*CON_WPS*/ -#ifdef WSC_STA_SUPPORT -DECLARE_TIMER_FUNCTION(WscPINTimeOutAction); -#endif -DECLARE_TIMER_FUNCTION(WscScanTimeOutAction); -DECLARE_TIMER_FUNCTION(WscProfileRetryTimeout); -#ifdef WSC_LED_SUPPORT -DECLARE_TIMER_FUNCTION(WscLEDTimer); -DECLARE_TIMER_FUNCTION(WscSkipTurnOffLEDTimer); -#endif /* WSC_LED_SUPPORT */ -#ifdef CONFIG_AP_SUPPORT -DECLARE_TIMER_FUNCTION(WscUpdatePortCfgTimeout); -#ifdef WSC_V2_SUPPORT -DECLARE_TIMER_FUNCTION(WscSetupLockTimeout); -#endif /* WSC_V2_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#endif /* WSC_INCLUDED */ - -#ifdef CONFIG_HOTSPOT - -#ifdef CONFIG_AP_SUPPORT -DECLARE_TIMER_FUNCTION(PostReplyTimeout); -#endif /* CONFIG_AP_SUPPORT */ -#endif /* CONFIG_HOTSPOT */ - -#ifdef CONFIG_ATE -DECLARE_TIMER_FUNCTION(ATEPeriodicExec); -#endif /* CONFIG_ATE */ -#ifdef FTM_SUPPORT -DECLARE_TIMER_FUNCTION(FtmTimerCallback); -DECLARE_TIMER_FUNCTION(FtmTxTimerCallback); -DECLARE_TIMER_FUNCTION(FtmReqTxTimerCallback); -#endif /* FTM_SUPPORT */ - -#ifdef BACKGROUND_SCAN_SUPPORT -DECLARE_TIMER_FUNCTION(BackgroundScanTimeout); -DECLARE_TIMER_FUNCTION(DfsZeroWaitTimeout); -#endif /* BACKGROUND_SCAN_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -DECLARE_TIMER_FUNCTION(AutoChSelScanTimeout); -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef CHANNEL_SWITCH_MONITOR_CONFIG -DECLARE_TIMER_FUNCTION(ch_switch_monitor_timeout); -#endif -#endif /* __RTMP_TIMER_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_type.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_type.h deleted file mode 100644 index e3f1f71bda..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/rtmp_type.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rtmp_type.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs - Paul Lin 1-2-2004 -*/ - -#ifndef __RTMP_TYPE_H__ -#define __RTMP_TYPE_H__ - -#ifndef GNU_PACKED -#define GNU_PACKED __attribute__((packed)) -#endif /* GNU_PACKED */ - -#ifdef LINUX -/* Put platform dependent declaration here */ -/* For example, linux type definition */ -typedef signed char INT8; -typedef unsigned char UINT8; -typedef unsigned short UINT16; -typedef unsigned int UINT32; -typedef unsigned long long UINT64; -typedef signed short INT16; -typedef signed int INT32; -typedef long long INT64; - -typedef unsigned char UCHAR; -typedef unsigned short USHORT; -typedef unsigned int UINT; -typedef unsigned long ULONG; -#endif /* LINUX */ - -typedef unsigned char *PUINT8; -typedef unsigned short *PUINT16; -typedef unsigned int *PUINT32; -typedef unsigned long long *PUINT64; -typedef signed int *PINT32; -typedef signed long long *PINT64; - -/* modified for fixing compile warning on Sigma 8634 platform */ -/* typedef char STRING; */ -typedef char RTMP_STRING; - -typedef signed char CHAR; - -typedef signed short SHORT; -typedef signed int INT; -typedef signed int *PINT; -typedef signed long LONG; -typedef signed long long LONGLONG; - -typedef unsigned long long ULONGLONG; - -typedef unsigned char BOOLEAN; - -#ifdef LINUX -typedef void VOID; -#endif /* LINUX */ - -typedef VOID *PVOID; -typedef CHAR *PCHAR; -typedef UCHAR *PUCHAR; -typedef USHORT *PUSHORT; -typedef LONG *PLONG; -typedef ULONG *PULONG; -typedef UINT *PUINT; - -typedef unsigned int NDIS_MEDIA_STATE; - -typedef union _LARGE_INTEGER { - struct { -#ifdef RT_BIG_ENDIAN - INT32 HighPart; - UINT LowPart; -#else - UINT LowPart; - INT32 HighPart; -#endif - } u; - INT64 QuadPart; -} LARGE_INTEGER; - -/* Register set pair for initialzation register set definition */ -typedef struct _RTMP_REG_PAIR { - UINT32 Register; - UINT32 Value; -} RTMP_REG_PAIR, *PRTMP_REG_PAIR; - -typedef struct _REG_CHK_PAIR { - UINT32 Register; - UINT32 Mask; - UINT32 Value; -} REG_CHK_PAIR; - -typedef struct _REG_PAIR { - UCHAR Register; - UCHAR Value; -} REG_PAIR, *PREG_PAIR; - -typedef struct _REG_PAIR_CHANNEL { - UCHAR Register; - UCHAR FirstChannel; - UCHAR LastChannel; - UCHAR Value; -} REG_PAIR_CHANNEL, *PREG_PAIR_CHANNEL; - -typedef struct _REG_PAIR_BW { - UCHAR Register; - UCHAR BW; - UCHAR Value; -} REG_PAIR_BW, *PREG_PAIR_BW; - -typedef struct _REG_PAIR_PHY { - UCHAR reg; - UCHAR s_ch; - UCHAR e_ch; - UCHAR phy; /* RF_MODE_XXX */ - UCHAR bw; /* RF_BW_XX */ - UCHAR val; -} REG_PAIR_PHY; - -/* Register set pair for initialzation register set definition */ -typedef struct _RTMP_RF_REGS { - UCHAR Channel; - UINT32 R1; - UINT32 R2; - UINT32 R3; - UINT32 R4; -} RTMP_RF_REGS, *PRTMP_RF_REGS; - -typedef struct _FREQUENCY_ITEM { - UCHAR Channel; - UCHAR N; - UCHAR R; - UCHAR K; -} FREQUENCY_ITEM, *PFREQUENCY_ITEM; - -typedef int NTSTATUS; - -#define STATUS_SUCCESS 0x00 -#define STATUS_UNSUCCESSFUL 0x01 - -typedef struct _QUEUE_ENTRY { - struct _QUEUE_ENTRY *Next; -} QUEUE_ENTRY, *PQUEUE_ENTRY; - -/* Queue structure */ -typedef struct _QUEUE_HEADER { - PQUEUE_ENTRY Head; - PQUEUE_ENTRY Tail; - UINT Number; -} QUEUE_HEADER, *PQUEUE_HEADER; - -typedef struct _CR_REG { - UINT32 flags; - UINT32 offset; - UINT32 value; -} CR_REG, *PCR_REG; - -typedef struct _BANK_RF_CR_REG { - UINT32 flags; - UCHAR bank; - UCHAR offset; - UCHAR value; -} BANK_RF_CR_REG, *PBANK_RF_CR_REG; - -typedef struct _BANK_RF_REG_PAIR { - UCHAR Bank; - UCHAR Register; - UCHAR Value; -} BANK_RF_REG_PAIR, *PBANK_RF_REG_PAIR; - -typedef struct _R_M_W_REG { - UINT32 Register; - UINT32 ClearBitMask; - UINT32 Value; -} R_M_W_REG, *PR_M_W_REG; - -typedef struct _RF_R_M_W_REG { - UCHAR Bank; - UCHAR Register; - UCHAR ClearBitMask; - UCHAR Value; -} RF_R_M_W_REG, *PRF_R_M_W_REG; - -struct mt_dev_priv { - void *sys_handle; - void *wifi_dev; - unsigned long priv_flags; - UCHAR sniffer_mode; -}; -#endif /* __RTMP_TYPE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/scs.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/scs.h deleted file mode 100644 index ca6a50a2a9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/scs.h +++ /dev/null @@ -1,140 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Abstract: - - - */ - -#ifndef __SCS_H__ -#define __SCS_H__ - -#define TriggerTrafficeTh 250000 /*2M*/ -#define MAX_LEN_OF_SCS_BSS_TABLE 6 -#define MinRssiTolerance 10 -#define ThTolerance 10 -#define PdBlkEnabeOffset 19 -#define RTSDropCntEnabeOffset 0 -#define RTSDropRdClrEnabeOffset 8 -#define RtsDropCountOffset 16 -#define RTSDropCountMask 0x0000ffff -#define PdBlkEnabeOffsetB1 25 -#define PdBlkOfmdThMask 0x1ff -#define PdBlkOfmdThOffset 20 -#define PdBlkOfmdThOffsetB1 16 /* Band1 */ -#define PdBlkCckThMask 0xff -#define PdBlkCckThOffset 1 -#define PdBlkCck1RThOffset 24 -#define PdBlkOfmdThDefault 0x13c -#define PdBlkCckThDefault 0x92 /*-110dBm*/ -#define BandNum 1 /*MT7615 HW not support DBDC/MT7622 only Band0*/ -#define BssNum 4 -#define BssOffset 0x10 -#define RtsRtyCountOffset 16 -#define RtsCountMask 0x0000ffff -#define TxTrafficTh 9 -/* #define BandOffset 0x200 */ -#define OneStep 2 /* dB */ -#define FastInitTh 0xa6 /* -90dBm */ -#define FastInitThOfdm 0x14c /* -90dBm */ -#define FalseCcaUpBondDefault 500 -#define FalseCcaLowBondDefault 50 -#define CckFixedRssiBondDefault 184 /* -72dBm. -72+256 */ -#define OfdmFixedRssiBondDefault 368 /* -72dBm. (-72*2)+512 */ - -enum { - SCS_DISABLE, - SCS_ENABLE, - SCS_MANUAL, -}; - -enum { - PD_BLOCKING_OFF, - PD_BLOCKING_ON, -}; - -enum { - SCS_Gen1, /* old chip */ - SCS_Gen2, /* MT7615 */ - SCS_Gen3, /* MT7622 */ -}; - -typedef struct _SCS_BSS_ENTRY { - UCHAR Bssid[MAC_ADDR_LEN]; - /* UCHAR Channel; */ -} SCS_BSS_ENTRY; - -typedef struct { - UCHAR BssNr; - UCHAR BssOverlapNr; - SCS_BSS_ENTRY BssEntry[MAX_LEN_OF_SCS_BSS_TABLE]; /* Number is 6 */ -} SCS_BSS_TABLE, *PSCS_BSS_TABLE; - -/* -IPI Level Power(dBm) - 0 IPI<=-92 - 1 -92= 100 (taken from table 4.4 in the Handbook of - * Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; - * original paper: Damgaard, Landrock, Pomerance: Average case error - * estimates for the strong probable prime test. -- Math. Comp. 61 (1993) - * 177-194) - */ -#define BN_prime_checks_for_size(b) \ - ((b) >= 1300 ? 2 : \ - (b) >= 850 ? 3 : \ - (b) >= 650 ? 4 : \ - (b) >= 550 ? 5 : \ - (b) >= 450 ? 6 : \ - (b) >= 400 ? 7 : \ - (b) >= 350 ? 8 : \ - (b) >= 300 ? 9 : \ - (b) >= 250 ? 12 : \ - (b) >= 200 ? 15 : \ - (b) >= 150 ? 18 : \ - /* b >= 100 */ 27) - -#define BN_num_bytes(a) ((BN_num_bits(a) + 7) / 8) - -#define BN_one(a) (BN_set_word((a), 1)) - -#define BN_zero(a) BN_zero_ex(a) - -/* BN_BLINDING flags */ -#define BN_BLINDING_NO_UPDATE 0x00000001 -#define BN_BLINDING_NO_RECREATE 0x00000002 - -/*- - * BN_window_bits_for_exponent_size -- macro for sliding window mod_exp functions - * - * - * For window size 'w' (w >= 2) and a random 'b' bits exponent, - * the number of multiplications is a constant plus on average - * - * 2^(w-1) + (b-w)/(w+1); - * - * here 2^(w-1) is for precomputing the table (we actually need - * entries only for windows that have the lowest bit set), and - * (b-w)/(w+1) is an approximation for the expected number of - * w-bit windows, not counting the first one. - * - * Thus we should use - * - * w >= 6 if b > 671 - * w = 5 if 671 > b > 239 - * w = 4 if 239 > b > 79 - * w = 3 if 79 > b > 23 - * w <= 2 if 23 > b - * - * (with draws in between). Very small exponents are often selected - * with low Hamming weight, so we use w = 1 for b <= 23. - */ -#define BN_window_bits_for_exponent_size(b) \ - ((b) > 671 ? 6 : (b) > 239 ? 5 : (b) > 79 ? 4 : (b) > 23 ? 3 : 1) - -/* - * BN_mod_exp_mont_conttime is based on the assumption that the L1 data cache - * line width of the target processor is at least the following value. - */ -#define MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH (64) -#define MOD_EXP_CTIME_MIN_CACHE_LINE_MASK \ - (MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH - 1) - -/* - * Window sizes optimized for fixed window size modular exponentiation - * algorithm (BN_mod_exp_mont_consttime). To achieve the security goals of - * BN_mode_exp_mont_consttime, the maximum size of the window must not exceed - * log_2(MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH). Window size thresholds are - * defined for cache line sizes of 32 and 64, cache line sizes where - * log_2(32)=5 and log_2(64)=6 respectively. A window size of 7 should only be - * used on processors that have a 128 byte or greater cache line size. - */ -#if MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH == 64 - -#define BN_window_bits_for_ctime_exponent_size(b) \ - ((b) > 937 ? 6 : (b) > 306 ? 5 : (b) > 89 ? 4 : (b) > 22 ? 3 : 1) -#define BN_MAX_WINDOW_BITS_FOR_CTIME_EXPONENT_SIZE (6) - -#elif MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH == 32 - -#define BN_window_bits_for_ctime_exponent_size(b) \ - ((b) > 306 ? 5 : (b) > 89 ? 4 : (b) > 22 ? 3 : 1) -#define BN_MAX_WINDOW_BITS_FOR_CTIME_EXPONENT_SIZE (5) - -#endif - -void BN_set_flags(BIGNUM *b, int n); -int BN_get_flags(const BIGNUM *b, int n); -/* - * get a clone of a BIGNUM with changed flags, for *temporary* use only (the - * two BIGNUMs cannot be used in parallel!). Also only for *read only* use. The - * value |dest| should be a newly allocated BIGNUM obtained via BN_new() that - * has not been otherwise initialised or used. - */ -void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags); - -void BN_zero_ex(BIGNUM *a); -int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w); -int BN_is_zero(const BIGNUM *a); -int BN_is_one(const BIGNUM *a); -int BN_is_word(const BIGNUM *a, const BN_ULONG w); -int BN_is_odd(const BIGNUM *a); - -int BN_num_bits(const BIGNUM *a); -int BN_num_bits_word(BN_ULONG l); -int BN_security_bits(int L, int N); - -const BIGNUM *BN_value_one(void); - -BIGNUM *BN_new(void); -BIGNUM *BN_secure_new(void); -void BN_clear_free(BIGNUM *a); -BIGNUM *BN_dup(const BIGNUM *a); -BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); -void BN_swap(BIGNUM *a, BIGNUM *b); -BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); -int BN_bn2bin(const BIGNUM *a, unsigned char *to); -int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen); -BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret); -int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen); -BIGNUM *bn_wexpand(BIGNUM *a, int words); -void bn_correct_top(BIGNUM *a); -int BN_set_word(BIGNUM *a, BN_ULONG w); - -int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, - BN_MONT_CTX *mont, BN_CTX *ctx); -int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, - BN_CTX *ctx); -int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, - BN_CTX *ctx); - -BN_CTX *BN_CTX_new(void); -BN_CTX *BN_CTX_secure_new(void); -void BN_CTX_free(BN_CTX *c); -void BN_CTX_start(BN_CTX *ctx); -BIGNUM *BN_CTX_get(BN_CTX *ctx); -void BN_CTX_end(BN_CTX *ctx); -void BN_MONT_CTX_init(BN_MONT_CTX *ctx); -BN_MONT_CTX *BN_MONT_CTX_new(void); -int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx); -void BN_MONT_CTX_free(BN_MONT_CTX *mont); - -void BN_STACK_init(BN_STACK *); -void BN_STACK_finish(BN_STACK *); -int BN_STACK_push(BN_STACK *, unsigned int); -unsigned int BN_STACK_pop(BN_STACK *); -void BN_POOL_init(BN_POOL *); -void BN_POOL_finish(BN_POOL *); -BIGNUM *BN_POOL_get(BN_POOL *, int); -void BN_POOL_release(BN_POOL *, unsigned int); - -int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); -int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); -void bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, int n, BN_ULONG *tmp); - -BIGNUM *BN_mod_inverse(BIGNUM *in, const BIGNUM *a, const BIGNUM *n, - BN_CTX *ctx); - -int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); -int BN_lshift1(BIGNUM *r, const BIGNUM *a); -int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); -int BN_rshift1(BIGNUM *r, const BIGNUM *a); - -int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); -int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, - BN_CTX *ctx); -/* - * BN_mod_add variant that may be used if both a and b are non-negative and - * less than m - */ -int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, - const BIGNUM *m); -int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, - BN_CTX *ctx); -/* - * BN_mod_sub variant that may be used if both a and b are non-negative and - * less than m - */ -int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, - const BIGNUM *m); -/* slow but works */ -int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, - BN_CTX *ctx); -int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); -int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); -/* - * BN_mod_lshift1 variant that may be used if a is non-negative and less than - * m - */ -int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); -int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, - BN_CTX *ctx); -/* - * BN_mod_lshift variant that may be used if a is non-negative and less than - * m - */ -int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); - -int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); -/* unsigned add of b to a */ -int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); -/* unsigned subtraction of b from a, a must be larger than b. */ -int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); -int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); - -BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); -BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); -int BN_add_word(BIGNUM *a, BN_ULONG w); -int BN_sub_word(BIGNUM *a, BN_ULONG w); -int BN_mul_word(BIGNUM *a, BN_ULONG w); - -#define BN_mod(rem, m, d, ctx) BN_div(NULL, (rem), (m), (d), (ctx)) -int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, - BN_CTX *ctx); - -int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); - -int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, - BN_CTX *ctx); -int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); -int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, - BN_MONT_CTX *in_mont); -int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); -int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, - const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, - BN_CTX *ctx, BN_MONT_CTX *m_ctx); -int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx); - -int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, BN_RECP_CTX *recp, - BN_CTX *ctx); - -int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); - -int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, - BN_RECP_CTX *recp, BN_CTX *ctx); -int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx); - -/** BN_set_negative sets sign of a BIGNUM - * \param b pointer to the BIGNUM object - * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise - */ -void BN_set_negative(BIGNUM *b, int n); - -/** BN_is_negative returns 1 if the BIGNUM is negative - * \param b pointer to the BIGNUM object - * \return 1 if a < 0 and 0 otherwise - */ -int BN_is_negative(const BIGNUM *b); - -int BN_cmp(const BIGNUM *a, const BIGNUM *b); -void BN_free(BIGNUM *a); -int BN_ucmp(const BIGNUM *a, const BIGNUM *b); - -int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); -int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); -int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); -char *BN_bn2hex(const BIGNUM *a); - -BIGNUM *BN_mod_sqrt(BIGNUM *ret, const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); - -int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); - -/* BEGIN ERROR CODES */ -/* - * The following lines are auto generated by the script mkerr.pl. Any changes - * made after this point may be overwritten when the script is next run. - */ - -int ERR_load_BN_strings(void); - -/* Error codes for the BN functions. */ - -/* Function codes. */ -#define BN_F_BNRAND 127 -#define BN_F_BN_BLINDING_CONVERT_EX 100 -#define BN_F_BN_BLINDING_CREATE_PARAM 128 -#define BN_F_BN_BLINDING_INVERT_EX 101 -#define BN_F_BN_BLINDING_NEW 102 -#define BN_F_BN_BLINDING_UPDATE 103 -#define BN_F_BN_BN2DEC 104 -#define BN_F_BN_BN2HEX 105 -#define BN_F_BN_COMPUTE_WNAF 142 -#define BN_F_BN_CTX_GET 116 -#define BN_F_BN_CTX_NEW 106 -#define BN_F_BN_CTX_START 129 -#define BN_F_BN_DIV 107 -#define BN_F_BN_DIV_RECP 130 -#define BN_F_BN_EXP 123 -#define BN_F_BN_EXPAND_INTERNAL 120 -#define BN_F_BN_GENCB_NEW 143 -#define BN_F_BN_GENERATE_DSA_NONCE 140 -#define BN_F_BN_GENERATE_PRIME_EX 141 -#define BN_F_BN_GF2M_MOD 131 -#define BN_F_BN_GF2M_MOD_EXP 132 -#define BN_F_BN_GF2M_MOD_MUL 133 -#define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134 -#define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135 -#define BN_F_BN_GF2M_MOD_SQR 136 -#define BN_F_BN_GF2M_MOD_SQRT 137 -#define BN_F_BN_LSHIFT 145 -#define BN_F_BN_MOD_EXP2_MONT 118 -#define BN_F_BN_MOD_EXP_MONT 109 -#define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124 -#define BN_F_BN_MOD_EXP_MONT_WORD 117 -#define BN_F_BN_MOD_EXP_RECP 125 -#define BN_F_BN_MOD_EXP_SIMPLE 126 -#define BN_F_BN_MOD_INVERSE 110 -#define BN_F_BN_MOD_INVERSE_NO_BRANCH 139 -#define BN_F_BN_MOD_LSHIFT_QUICK 119 -#define BN_F_BN_MOD_SQRT 121 -#define BN_F_BN_MPI2BN 112 -#define BN_F_BN_NEW 113 -#define BN_F_BN_RAND 114 -#define BN_F_BN_RAND_RANGE 122 -#define BN_F_BN_RSHIFT 146 -#define BN_F_BN_SET_WORDS 144 -#define BN_F_BN_USUB 115 - -/* Reason codes. */ -#define BN_R_ARG2_LT_ARG3 100 -#define BN_R_BAD_RECIPROCAL 101 -#define BN_R_BIGNUM_TOO_LONG 114 -#define BN_R_BITS_TOO_SMALL 118 -#define BN_R_CALLED_WITH_EVEN_MODULUS 102 -#define BN_R_DIV_BY_ZERO 103 -#define BN_R_ENCODING_ERROR 104 -#define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105 -#define BN_R_INPUT_NOT_REDUCED 110 -#define BN_R_INVALID_LENGTH 106 -#define BN_R_INVALID_RANGE 115 -#define BN_R_INVALID_SHIFT 119 -#define BN_R_NOT_A_SQUARE 111 -#define BN_R_NOT_INITIALIZED 107 -#define BN_R_NO_INVERSE 108 -#define BN_R_NO_SOLUTION 116 -#define BN_R_PRIVATE_KEY_TOO_LARGE 117 -#define BN_R_P_IS_NOT_PRIME 112 -#define BN_R_TOO_MANY_ITERATIONS 113 -#define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 - -/* fatal error */ -#define ERR_R_FATAL 64 -#define ERR_R_MALLOC_FAILURE (1 | ERR_R_FATAL) -#define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (2 | ERR_R_FATAL) -#define ERR_R_PASSED_NULL_PARAMETER (3 | ERR_R_FATAL) -#define ERR_R_INTERNAL_ERROR (4 | ERR_R_FATAL) -#define ERR_R_DISABLED (5 | ERR_R_FATAL) -#define ERR_R_INIT_FAIL (6 | ERR_R_FATAL) -#define ERR_R_PASSED_INVALID_ARGUMENT (7) - -#endif - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_aes.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_aes.h deleted file mode 100644 index 2cc29a8699..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_aes.h +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - AES - - Abstract: - RFC 3394: Advanced Encryption Standard (AES) Key Wrap Algorithm - RFC 3601: Counter with CBC-MAC (CCM) - RFC 4493: The AES-CMAC Algorithm - FIPS PUBS 197: ADVANCED ENCRYPTION STANDARD (AES) - NIST 800-38A: Recommendation for Block Cipher Modes of Operation - NIST 800-38C: The CCM Mode for Authentication and Confidentiality - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2009/05/19 Create AES-Key Wrap - Eddy 2009/04/20 Create AES-CMAC, AES-CCM - Eddy 2009/01/19 Create AES-128, AES-192, AES-256, AES-CBC -***************************************************************************/ - -#ifndef __CRYPT_AES_H__ -#define __CRYPT_AES_H__ - -#include "rtmp_type.h" -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef INOUT -#define INOUT -#endif - -/* AES definition & structure */ -#define AES_STATE_ROWS 4 /* Block size: 4*4*8 = 128 bits */ -#define AES_STATE_COLUMNS 4 -#define AES_BLOCK_SIZES (AES_STATE_ROWS * AES_STATE_COLUMNS) -#define AES_KEY_ROWS 4 -#define AES_KEY_COLUMNS 8 /*Key length: 4*{4,6,8}*8 = 128, 192, 256 bits */ -#define AES_KEY128_LENGTH 16 -#define AES_KEY192_LENGTH 24 -#define AES_KEY256_LENGTH 32 -#define AES_CBC_IV_LENGTH 16 - -typedef struct { - UINT8 State[AES_STATE_ROWS][AES_STATE_COLUMNS]; - UINT8 KeyWordExpansion[AES_KEY_ROWS][AES_KEY_ROWS * - ((AES_KEY256_LENGTH >> 2) + 6 + 1)]; -} AES_CTX_STRUC, *PAES_CTX_STRUC; - -/* AES operations */ -VOID RT_AES_KeyExpansion(IN UINT8 Key[], IN UINT KeyLength, - INOUT AES_CTX_STRUC *paes_ctx); - -VOID RT_AES_Encrypt(IN UINT8 PlainBlock[], IN UINT PlainBlockSize, - IN UINT8 Key[], IN UINT KeyLength, OUT UINT8 CipherBlock[], - INOUT UINT *CipherBlockSize); - -VOID RT_AES_Decrypt(IN UINT8 CipherBlock[], IN UINT CipherBlockSize, - IN UINT8 Key[], IN UINT KeyLength, OUT UINT8 PlainBlock[], - INOUT UINT *PlainBlockSize); - -/* AES Counter with CBC-MAC operations */ -VOID AES_CCM_MAC(IN UINT8 Payload[], IN UINT PayloadLength, IN UINT8 Key[], - IN UINT KeyLength, IN UINT8 Nonce[], IN UINT NonceLength, - IN UINT8 AAD[], IN UINT AADLength, IN UINT MACLength, - OUT UINT8 MACText[]); - -INT AES_CCM_Encrypt(IN UINT8 PlainText[], IN UINT PlainTextLength, - IN UINT8 Key[], IN UINT KeyLength, IN UINT8 Nonce[], - IN UINT NonceLength, IN UINT8 AAD[], IN UINT AADLength, - IN UINT MACLength, OUT UINT8 CipherText[], - INOUT UINT *CipherTextLength); - -INT AES_CCM_Decrypt(IN UINT8 CipherText[], IN UINT CipherTextLength, - IN UINT8 Key[], IN UINT KeyLength, IN UINT8 Nonce[], - IN UINT NonceLength, IN UINT8 AAD[], IN UINT AADLength, - IN UINT MACLength, OUT UINT8 PlainText[], - INOUT UINT *PlainTextLength); - -/* AES-CMAC operations */ -VOID AES_CMAC_GenerateSubKey(IN UINT8 Key[], IN UINT KeyLength, - OUT UINT8 SubKey1[], OUT UINT8 SubKey2[]); - -VOID AES_CMAC(IN UINT8 PlainText[], IN UINT PlainTextLength, IN UINT8 Key[], - IN UINT KeyLength, OUT UINT8 MACText[], - INOUT UINT *MACTextLength); - -/* AES-CBC operations */ -VOID AES_CBC_Encrypt(IN UINT8 PlainText[], IN UINT PlainTextLength, - IN UINT8 Key[], IN UINT KeyLength, IN UINT8 IV[], - IN UINT IVLength, OUT UINT8 CipherText[], - INOUT UINT *CipherTextLength); - -VOID AES_CBC_Decrypt(IN UINT8 CipherText[], IN UINT CipherTextLength, - IN UINT8 Key[], IN UINT KeyLength, IN UINT8 IV[], - IN UINT IVLength, OUT UINT8 PlainText[], - INOUT UINT *PlainTextLength); - -/* AES key wrap operations */ -INT AES_Key_Wrap(IN UINT8 PlainText[], IN UINT PlainTextLength, IN UINT8 Key[], - IN UINT KeyLength, OUT UINT8 CipherText[], - OUT UINT *CipherTextLength); - -INT AES_Key_Unwrap(IN UINT8 CipherText[], IN UINT CipherTextLength, - IN UINT8 Key[], IN UINT KeyLength, OUT UINT8 PlainText[], - OUT UINT *PlainTextLength); - -#endif /* __CRYPT_AES_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_arc4.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_arc4.h deleted file mode 100644 index e912773bac..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_arc4.h +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - RC4 - - Abstract: - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2009/05/13 ARC4 -***************************************************************************/ - -#ifndef __CRYPT_ARC4_H__ -#define __CRYPT_ARC4_H__ - -#include "rtmp_type.h" -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef INOUT -#define INOUT -#endif - -/* ARC4 definition & structure */ -#define ARC4_KEY_BLOCK_SIZE 256 - -typedef struct { - UINT BlockIndex1; - UINT BlockIndex2; - UINT8 KeyBlock[256]; -} ARC4_CTX_STRUC, *PARC4_CTX_STRUC; - -/* ARC4 operations */ -VOID ARC4_INIT(IN ARC4_CTX_STRUC *pARC4_CTX, IN PUCHAR pKey, IN UINT KeyLength); - -VOID ARC4_Compute(IN ARC4_CTX_STRUC *pARC4_CTX, IN UINT8 InputBlock[], - IN UINT InputBlockSize, OUT UINT8 OutputBlock[]); - -VOID ARC4_Discard_KeyLength(IN ARC4_CTX_STRUC *pARC4_CTX, IN UINT Length); - -#endif /* __CRYPT_ARC4_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_biginteger.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_biginteger.h deleted file mode 100644 index 0157996a25..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_biginteger.h +++ /dev/null @@ -1,307 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - BigInteger - - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2009/01/12 Create -***************************************************************************/ - -#ifndef __CRYPT_BIGINTEGER_H__ -#define __CRYPT_BIGINTEGER_H__ - -#include "rtmp_type.h" -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef INOUT -#define INOUT -#endif - -typedef struct _BIG_INTEGER_STRUC BIG_INTEGER, *PBIG_INTEGER; -typedef struct _BI_OP_TIME_INTERVAL BI_OP_TIME_INTERVAL; -typedef struct _MONT_STRUC MONT_STRUC, *PMONT_STRUC; - -/* BigInteger definition & structure */ -#define SLIDING_WINDOW 16 -#ifndef DOT11_SAE_OPENSSL_BN -/*#define BI_POOL*/ -#endif -/*#define BI_TIME_REC */ -/*#define BI_POOL_DBG*/ - -#ifdef BI_POOL_DBG -#define POOL_COUNTER_CHECK_BEGIN(_expect_cnt) \ - { \ - _expect_cnt = sae_dump_pool_info_check(0, FALSE, FALSE); \ - } -#define POOL_COUNTER_CHECK_END(_expect_cnt) \ - { \ - _expect_cnt = \ - sae_dump_pool_info_check(_expect_cnt, TRUE, FALSE); \ - } -#else -#define POOL_COUNTER_CHECK_BEGIN(_expect_cnt) -#define POOL_COUNTER_CHECK_END(_expect_cnt) -#endif - -#ifdef BI_POOL -#define GET_BI_INS_FROM_POOL(_ptr) \ - { \ - _ptr = get_temporal_usage_big_interger(); \ - } -#else -#define GET_BI_INS_FROM_POOL(_ptr) -#endif - -struct _BIG_INTEGER_STRUC { - RTMP_STRING Name[10]; - UINT32 *pIntegerArray; - UINT AllocSize; - UINT ArrayLength; - UINT IntegerLength; - INT Signed; - UCHAR invalid; -}; - -struct _BI_OP_TIME_INTERVAL { - ULONG avg_time_interval; - ULONG time_interval; - UINT32 exe_times; -}; - -struct _MONT_STRUC { - UINT16 Bits_Of_R; - BIG_INTEGER *pBI_X; - BIG_INTEGER *pBI_R; - BIG_INTEGER *pBI_PInverse; -}; - -typedef struct _BI_OP_TIME_RECORD { - BI_OP_TIME_INTERVAL add_op; - BI_OP_TIME_INTERVAL sub_op; - BI_OP_TIME_INTERVAL mul_op; - BI_OP_TIME_INTERVAL div_op; - BI_OP_TIME_INTERVAL mod_op; - BI_OP_TIME_INTERVAL square_op; - BI_OP_TIME_INTERVAL sqrt_op; - BI_OP_TIME_INTERVAL exp_mod_op; - BI_OP_TIME_INTERVAL div_mod_op; - BI_OP_TIME_INTERVAL sqrt_mod_op; - BI_OP_TIME_INTERVAL mod_mul_inv_op; - BI_OP_TIME_INTERVAL simple_exp_mod_op; -} BI_OP_TIME_RECORD, *PBI_OP_TIME_RECORD; - -typedef struct _EC_POINT_OP_TIME_RECORD { - BI_OP_TIME_INTERVAL add_op; - BI_OP_TIME_INTERVAL dbl_op; - BI_OP_TIME_INTERVAL mul_op; - BI_OP_TIME_INTERVAL find_y_op; - BI_OP_TIME_INTERVAL on_curve_check_op; -} EC_POINT_OP_TIME_RECORD, *PEC_POINT_OP_TIME_RECORD; - -#ifdef BI_POOL -VOID big_integer_pool_init(VOID); - -VOID big_integer_pool_deinit(VOID); - -BIG_INTEGER *get_temporal_usage_big_interger(VOID); - -UINT32 sae_dump_pool_info_check(INT32 expect_cnt, UCHAR is_check, - UCHAR is_print); -#endif - -VOID release_temporal_usage_big_interger(IN BIG_INTEGER **pBI); - -VOID BigInteger_record_time_begin(BI_OP_TIME_INTERVAL *time_rec); - -VOID BigInteger_record_time_end(BI_OP_TIME_INTERVAL *time_rec); - -/* BigInteger operations */ -VOID BigInteger_Print(IN PBIG_INTEGER pBI); - -VOID BigInteger_Init(INOUT PBIG_INTEGER *pBI); - -VOID BigInteger_Free_AllocSize(IN PBIG_INTEGER *pBI); - -VOID BigInteger_Free(IN PBIG_INTEGER *pBI); - -VOID BigInteger_AllocSize(IN PBIG_INTEGER *pBI, IN INT Length); - -VOID BigInteger_ClearHighBits(IN PBIG_INTEGER pBI); - -UINT32 BigInteger_getlen(IN BIG_INTEGER *pBI); - -VOID BigInteger_BI2Bin(IN PBIG_INTEGER pBI, OUT UINT8 *pValue, - OUT UINT *Length); - -VOID BigInteger_BI2Bin_with_pad(IN PBIG_INTEGER pBI, OUT UINT8 *pValue, - OUT UINT *Length, IN UINT32 PadLen); - -VOID BigInteger_Bin2BI(IN UINT8 *pValue, IN UINT Length, OUT PBIG_INTEGER *pBI); - -VOID BigInteger_BitsOfBI(IN PBIG_INTEGER pBI, OUT UINT *Bits_Of_P); - -INT BigInteger_GetBitValue(IN PBIG_INTEGER pBI, IN UINT Index); - -UINT8 BigInteger_GetByteValue(IN PBIG_INTEGER pBI, IN UINT Index); - -VOID BigInteger_Copy(IN PBIG_INTEGER pBI_Copied, OUT PBIG_INTEGER *pBI_Result); - -INT BigInteger_UnsignedCompare(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand); - -VOID BigInteger_Add(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Sub(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mul(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Square(IN PBIG_INTEGER pBI, OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Div(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result, - OUT PBIG_INTEGER *pBI_Remainder); - -VOID BigInteger_Montgomery_MulMod(IN PBIG_INTEGER pBI_A, IN PBIG_INTEGER pBI_B, - IN PBIG_INTEGER pBI_P, - IN PBIG_INTEGER pBI_PInverse, - IN UINT Bits_Of_R, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Montgomery_ExpMod(IN PBIG_INTEGER pBI_G, IN PBIG_INTEGER pBI_E, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Montgomery_MulMod_with_mont(IN PBIG_INTEGER pBI_A, - IN PBIG_INTEGER pBI_B, - IN PBIG_INTEGER pBI_P, - IN MONT_STRUC *mont, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Montgomery_ExpMod_with_mont(IN PBIG_INTEGER pBI_G, - IN PBIG_INTEGER pBI_E, - IN PBIG_INTEGER pBI_P, - IN MONT_STRUC *mont, - OUT PBIG_INTEGER *pBI_Result); - -UCHAR BigInteger_is_zero(IN PBIG_INTEGER pBI); - -UCHAR BigInteger_is_one(IN PBIG_INTEGER pBI); - -VOID BigInteger_Mod(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Mul(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -UCHAR BigInteger_is_odd(IN PBIG_INTEGER pBI); - -VOID BigInteger_Mod_Square(IN PBIG_INTEGER pFirstOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Add(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Sub(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Add_quick(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Sub_quick(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Div(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Sqrt(IN PBIG_INTEGER pFirstOperand, IN PBIG_INTEGER pBI_P, - IN MONT_STRUC *mont, OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Euclidean_Div(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - IN PBIG_INTEGER prev_u, IN PBIG_INTEGER prev_v, - INOUT PBIG_INTEGER curr_u, - INOUT PBIG_INTEGER curr_v); - -VOID BigInteger_Mod_Mul_Inverse(IN PBIG_INTEGER pBI, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Mul_Inverse2(IN PBIG_INTEGER pBI, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -UCHAR BigInteger_Sqrt(IN PBIG_INTEGER pBI, OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Shift_Right1(IN PBIG_INTEGER pBI, OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Mod_Shift_Left(IN PBIG_INTEGER pBI, IN UCHAR bit, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_Shift_Left(IN PBIG_INTEGER pBI, IN UINT32 shift_bit, - OUT PBIG_INTEGER *pBI_Result); - -/* treat pBi is positve and non-zero */ -VOID BigInteger_minus_one(INOUT PBIG_INTEGER pBI); - -/* treat pBi is positve and non-zero */ -VOID BigInteger_plus_one(INOUT PBIG_INTEGER pBI); - -/* an integer q is called a quadratic residue modulo n if it is congruent to a perfect square modulo n */ -UCHAR BigInteger_is_quadratic_residue(IN BIG_INTEGER *q, IN BIG_INTEGER *prime, - IN MONT_STRUC *mont); - -VOID BigInteger_Montgomery_ExpMod32(IN PBIG_INTEGER pBI_G, - IN PBIG_INTEGER pBI_E, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result); - -VOID BigInteger_DWtoBI(IN UINT32 value, OUT PBIG_INTEGER *pBI); - -VOID BigInteger_Add_DW(INOUT PBIG_INTEGER pBI, IN UINT32 value); - -VOID BigInteger_Mod_DW(INOUT PBIG_INTEGER pBI, IN UINT32 value, - OUT UINT32 *rem); - -VOID BigInteger_DtoH(INOUT PBIG_INTEGER pBI); - -VOID BigInteger_dump_time(VOID); - -INT BigInteger_rand_range(IN BIG_INTEGER *range, INOUT BIG_INTEGER *r); - -#endif /* __CRYPT_BIGINTEGER_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_bignum.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_bignum.h deleted file mode 100644 index eb9f3f8d8f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_bignum.h +++ /dev/null @@ -1,139 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - Bignum - - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2009/01/12 Create -***************************************************************************/ - -#ifndef __CRYPT_BIGNUM_H__ -#define __CRYPT_BIGNUM_H__ - -#include "rtmp_type.h" -#include "security/bn.h" - -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef INOUT -#define INOUT -#endif - -/* Bignum operations */ -VOID Bignum_Print(IN BIGNUM *pBI); - -VOID Bignum_Init(INOUT BIGNUM **pBI); - -VOID Bignum_Free(IN BIGNUM **pBI); - -UINT32 Bignum_getlen(IN BIGNUM *pBI); - -INT Bignum_Get_rand_range(IN BIGNUM *range, INOUT BIGNUM *r); - -VOID Bignum_BI2Bin(IN BIGNUM *pBI, OUT UINT8 *pValue, OUT UINT *Length); - -VOID Bignum_BI2Bin_with_pad(IN BIGNUM *pBI, OUT UINT8 *pValue, OUT UINT *Length, - IN UINT32 PadLen); - -VOID Bignum_Bin2BI(IN UINT8 *pValue, IN UINT Length, OUT BIGNUM **pBI); - -VOID Bignum_Copy(IN BIGNUM *pBI_Copied, OUT BIGNUM **pBI_Result); - -INT Bignum_UnsignedCompare(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand); - -VOID Bignum_Add(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - OUT BIGNUM **pBI_Result); - -VOID Bignum_Sub(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Mul(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result); - -VOID Bignum_Montgomery_ExpMod(IN BIGNUM *pBI_G, IN BIGNUM *pBI_E, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result); - -UCHAR Bignum_is_zero(IN BIGNUM *pBI); - -UCHAR Bignum_is_one(IN BIGNUM *pBI); - -UCHAR Bignum_is_odd(IN BIGNUM *pBI); - -VOID Bignum_Mod_Square(IN BIGNUM *pFirstOperand, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Add(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Sub(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Add_quick(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Sub_quick(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Div(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Sqrt(IN BIGNUM *pFirstOperand, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Mul_Inverse(IN BIGNUM *pBI, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result); - -UCHAR Bignum_Sqrt(IN BIGNUM *pBI, OUT BIGNUM **pBI_Result); - -VOID Bignum_Shift_Right1(IN BIGNUM *pBI, OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Shift_Left1(IN BIGNUM *pBI, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result); - -VOID Bignum_Mod_Shift_Left(IN BIGNUM *pBI, IN UCHAR bit, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result); - -VOID Bignum_Shift_Left(IN BIGNUM *pBI, IN UINT32 shift_bit, - OUT BIGNUM **pBI_Result); - -/* treat pBi is positve and non-zero */ -VOID Bignum_minus_one(INOUT BIGNUM *pBI); - -/* treat pBi is positve and non-zero */ -VOID Bignum_plus_one(INOUT BIGNUM *pBI); - -/* an integer q is called a quadratic residue modulo n if it is congruent to a perfect square modulo n */ -UCHAR Bignum_is_quadratic_residue(IN BIGNUM *q, IN BIGNUM *prime); - -VOID Bignum_DWtoBI(IN UINT32 value, OUT BIGNUM **pBI); - -VOID Bignum_Add_DW(INOUT BIGNUM *pBI, IN UINT32 value); - -VOID Bignum_Mod_DW(INOUT BIGNUM *pBI, IN UINT32 value, OUT UINT32 *rem); - -VOID Bignum_DtoH(INOUT BIGNUM *pBI); - -#endif /* __CRYPT_BIGNUM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_dh.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_dh.h deleted file mode 100644 index a82c2efa40..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_dh.h +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - DH - - Abstract: - RFC 2631: Diffie-Hellman Key Agreement Method - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2009/01/21 Create Diffie-Hellman, Montgomery Algorithm -***************************************************************************/ - -#ifndef __CRYPT_DH_H__ -#define __CRYPT_DH_H__ - -#include "rtmp_type.h" -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef INOUT -#define INOUT -#endif - -/* DH operations */ -void DH_PublicKey_Generate(IN UINT8 GValue[], IN UINT GValueLength, - IN UINT8 PValue[], IN UINT PValueLength, - IN UINT8 PrivateKey[], IN UINT PrivateKeyLength, - OUT UINT8 PublicKey[], INOUT UINT *PublicKeyLength); - -void DH_SecretKey_Generate(IN UINT8 PublicKey[], IN UINT PublicKeyLength, - IN UINT8 PValue[], IN UINT PValueLength, - IN UINT8 PrivateKey[], IN UINT PrivateKeyLength, - OUT UINT8 SecretKey[], INOUT UINT *SecretKeyLength); - -#define RT_DH_PublicKey_Generate(GK, GKL, PV, PVL, PriK, PriKL, PubK, PubKL) \ - DH_PublicKey_Generate((GK), (GKL), (PV), (PVL), (PriK), (PriKL), \ - (UINT8 *)(PubK), (UINT *)(PubKL)) - -#define RT_DH_SecretKey_Generate(PubK, PubKL, PV, PVL, PriK, PriKL, SecK, \ - SecKL) \ - DH_SecretKey_Generate((PubK), (PubKL), (PV), (PVL), (PriK), (PriKL), \ - (UINT8 *)(SecK), (UINT *)(SecKL)) - -#define RT_DH_FREE_ALL() - -#endif /* __CRYPT_DH_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_hmac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_hmac.h deleted file mode 100644 index 44ab6323fe..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_hmac.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - HMAC - - Abstract: - FIPS 198: The Keyed-Hash Message Authentication Code (HMAC) - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2008/11/24 Create HMAC-SHA1, HMAC-SHA256 -***************************************************************************/ - -#ifndef __CRYPT_HMAC_H__ -#define __CRYPT_HMAC_H__ - -#include "rtmp_type.h" -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef INOUT -#define INOUT -#endif - -#ifdef SHA1_SUPPORT -VOID RT_HMAC_SHA1(IN const UINT8 Key[], IN UINT KeyLen, - IN const UINT8 Message[], IN UINT MessageLen, OUT UINT8 MAC[], - IN UINT MACLen); -#endif /* SHA1_SUPPORT */ - -#ifdef SHA256_SUPPORT -VOID RT_HMAC_SHA256(IN const UINT8 Key[], IN UINT KeyLen, - IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 MAC[], IN UINT MACLen); - -VOID RT_HMAC_SHA256_VECTOR(IN const UINT8 key[], IN UINT key_len, - IN UCHAR element_num, IN const UINT8 *message[], - IN UINT *message_len, OUT UINT8 mac[], - IN UINT mac_len); -#endif /* SHA256_SUPPORT */ - -#ifdef SHA384_SUPPORT -VOID RT_HMAC_SHA384(IN const UINT8 Key[], IN UINT KeyLen, - IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 MAC[], IN UINT MACLen); - -VOID RT_HMAC_SHA384_VECTOR(IN const UINT8 key[], IN UINT key_len, - IN UCHAR element_num, IN const UINT8 *message[], - IN UINT *message_len, OUT UINT8 mac[], - IN UINT mac_len); -#endif /* SHA384_SUPPORT */ - -#ifdef MD5_SUPPORT -VOID RT_HMAC_MD5(IN const UINT8 Key[], IN UINT KeyLen, IN const UINT8 Message[], - IN UINT MessageLen, OUT UINT8 MAC[], IN UINT MACLen); -#endif /* MD5_SUPPORT */ - -#endif /* __CRYPT_HMAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_md5.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_md5.h deleted file mode 100644 index 6daeda28f5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_md5.h +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - MD5 - - Abstract: - RFC1321: The MD5 Message-Digest Algorithm - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2008/11/24 Create md5 -***************************************************************************/ - -#ifndef __CRYPT_MD5_H__ -#define __CRYPT_MD5_H__ - -#include "rtmp_type.h" -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef INOUT -#define INOUT -#endif - -/* Algorithm options */ -#define MD5_SUPPORT - -#ifdef MD5_SUPPORT -#define MD5_BLOCK_SIZE 64 /* 512 bits = 64 bytes */ -#define MD5_DIGEST_SIZE 16 /* 128 bits = 16 bytes */ -typedef struct { - UINT32 HashValue[4]; - UINT64 MessageLen; - UINT8 Block[MD5_BLOCK_SIZE]; - UINT BlockLen; -} MD5_CTX_STRUC, *PMD5_CTX_STRUC; - -VOID RT_MD5_Init(IN MD5_CTX_STRUC *pMD5_CTX); -VOID RT_MD5_Hash(IN MD5_CTX_STRUC *pMD5_CTX); -VOID RT_MD5_Append(IN MD5_CTX_STRUC *pMD5_CTX, IN const UINT8 Message[], - IN UINT MessageLen); -VOID RT_MD5_End(IN MD5_CTX_STRUC *pMD5_CTX, OUT UINT8 DigestMessage[]); -VOID RT_MD5(IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 DigestMessage[]); -#endif /* MD5_SUPPORT */ - -#endif /* __CRYPT_MD5_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_sha2.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_sha2.h deleted file mode 100644 index 0eddd1e56d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/crypt_sha2.h +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - SHA2 - - Abstract: - FIPS 180-2: Secure Hash Standard (SHS) - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2008/11/24 Create SHA1 - Eddy 2008/07/23 Create SHA256 -***************************************************************************/ - -#ifndef __CRYPT_SHA2_H__ -#define __CRYPT_SHA2_H__ - -#include "rtmp_type.h" -#ifndef IN -#define IN -#endif -#ifndef OUT -#define OUT -#endif -#ifndef INOUT -#define INOUT -#endif - -/* Algorithm options */ -#define SHA1_SUPPORT -#define SHA256_SUPPORT -#define SHA384_SUPPORT - -#ifdef SHA1_SUPPORT -#define SHA1_BLOCK_SIZE 64 /* 512 bits = 64 bytes */ -#define SHA1_DIGEST_SIZE 20 /* 160 bits = 20 bytes */ -typedef struct _SHA1_CTX_STRUC { - UINT32 HashValue[5]; /* 5 = (SHA1_DIGEST_SIZE / 32) */ - UINT64 MessageLen; /* total size */ - UINT8 Block[SHA1_BLOCK_SIZE]; - UINT BlockLen; -} SHA1_CTX_STRUC, *PSHA1_CTX_STRUC; - -VOID RT_SHA1_Init(IN SHA1_CTX_STRUC *pSHA_CTX); -VOID RT_SHA1_Hash(IN SHA1_CTX_STRUC *pSHA_CTX); -VOID RT_SHA1_Append(IN SHA1_CTX_STRUC *pSHA_CTX, IN const UINT8 Message[], - IN UINT MessageLen); -VOID RT_SHA1_End(IN SHA1_CTX_STRUC *pSHA_CTX, OUT UINT8 DigestMessage[]); -VOID RT_SHA1(IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 DigestMessage[]); -#endif /* SHA1_SUPPORT */ - -#ifdef SHA256_SUPPORT -#define SHA256_BLOCK_SIZE 64 /* 512 bits = 64 bytes */ -#define SHA256_DIGEST_SIZE 32 /* 256 bits = 32 bytes */ -typedef struct _SHA256_CTX_STRUC { - UINT32 HashValue[8]; /* 8 = (SHA256_DIGEST_SIZE / 32) */ - UINT64 MessageLen; /* total size */ - UINT8 Block[SHA256_BLOCK_SIZE]; - UINT BlockLen; -} SHA256_CTX_STRUC, *PSHA256_CTX_STRUC; - -VOID RT_SHA256_Init(IN SHA256_CTX_STRUC *pSHA_CTX); -VOID RT_SHA256_Hash(IN SHA256_CTX_STRUC *pSHA_CTX); -VOID RT_SHA256_Append(IN SHA256_CTX_STRUC *pSHA_CTX, IN const UINT8 Message[], - IN UINT MessageLen); -VOID RT_SHA256_End(IN SHA256_CTX_STRUC *pSHA_CTX, OUT UINT8 DigestMessage[]); -VOID RT_SHA256(IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 DigestMessage[]); -VOID rt_sha256_vector(IN UCHAR num, IN const unsigned char **message, - IN UINT *messageLen, OUT UINT8 *digestmessage); - -#endif /* SHA256_SUPPORT */ - -#ifdef SHA384_SUPPORT -#define SHA384_BLOCK_SIZE 128 /* 1024 bits = 128 bytes */ -#define SHA384_DIGEST_SIZE 48 /* 384 bits = 64 bytes */ -typedef struct _SHA384_CTX_STRUC { - UINT64 HashValue[8]; /* 8 = (SHA384_DIGEST_SIZE / 64) */ - UINT64 MessageLen; /* total size */ - UINT8 Block[SHA384_BLOCK_SIZE]; - UINT BlockLen; -} SHA384_CTX_STRUC, *PSHA384_CTX_STRUC; -VOID RT_SHA384_Init(IN SHA384_CTX_STRUC *pSHA_CTX); -VOID RT_SHA384_Hash(IN SHA384_CTX_STRUC *pSHA_CTX); -VOID RT_SHA384_Append(IN SHA384_CTX_STRUC *pSHA_CTX, IN const UINT8 Message[], - IN UINT MessageLen); -VOID RT_SHA384_End(IN SHA384_CTX_STRUC *pSHA_CTX, OUT UINT8 DigestMessage[]); -VOID RT_SHA384(IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 DigestMessage[]); -VOID rt_sha384_vector(IN UCHAR num, IN const unsigned char **message, - IN UINT *messageLen, OUT UINT8 *digestmessage); -#endif /* SHA384_SUPPORT */ - -/*#ifdef SHA512_SUPPORT*/ -/*FIXME: wrape it by SHA512_SUPPORT */ -#define SHA512_BLOCK_SIZE 128 /* 1024 bits = 128 bytes */ -#define SHA512_DIGEST_SIZE 64 /* 384 bits = 64 bytes */ -/*#endif*/ - -#endif /* __CRYPT_SHA2_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dh_key.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dh_key.h deleted file mode 100644 index 16d5a08cdd..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dh_key.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef HEADER_DH_KEY_H -#define HEADER_DH_KEY_H - -#define NN_DIGIT_BITS 32 -#define DH_KEY_LEN 192 -#define NN_DIGIT_LEN 4 -#define MAX_NN_DIGITS 49 - -extern void GenerateDHPublicKey(unsigned char *memPtr, unsigned char *ran_buf, - int ran_len, unsigned char *dhkey, - int *dhkey_len); - -extern void GenerateDHSecreteKey(unsigned char *memPtr, unsigned char *ran_buf, - int ran_len, unsigned char *peer_dhkey, - int peer_dhkey_len, - unsigned char *secrete_dhkey, - int *secrete_dhkey_len); - -extern void DH_freeall(void); - -#endif /*HEADER_DH_KEY_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dot11i_wpa.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dot11i_wpa.h deleted file mode 100644 index 93f8ccc040..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dot11i_wpa.h +++ /dev/null @@ -1,317 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 5F., No.36 Taiyuan St., Jhubei City, - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2008, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - dot11i_wpa.h - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - -*/ - -#ifndef __DOT11I_WPA_H__ -#define __DOT11I_WPA_H__ - -#include "rtmp_type.h" -#include "dot11_base.h" - -/* The length is the EAPoL-Key frame except key data field. - Please refer to 802.11i-2004 ,Figure 43u in p.78 */ -#define MIN_LEN_OF_EAPOL_KEY_MSG 95 - -/* The related length of the EAPOL Key frame */ -#define LEN_KEY_DESC_NONCE 32 -#define LEN_KEY_DESC_IV 16 -#define LEN_KEY_DESC_RSC 8 -#define LEN_KEY_DESC_ID 8 -#define LEN_KEY_DESC_REPLAY 8 -#define LEN_KEY_DESC_MIC 16 -#define LEN_KEY_DESC_MIC_SHA384 24 -#define LEN_KEY_DESC_MIC_MAX LEN_KEY_DESC_MIC_SHA384 - -/* EAP Code Type */ -#define EAP_CODE_REQUEST 1 -#define EAP_CODE_RESPONSE 2 -#define EAP_CODE_SUCCESS 3 -#define EAP_CODE_FAILURE 4 - -/* EAPOL frame Protocol Version */ -#define EAPOL_VER 1 -#define EAPOL_VER2 2 - -/* EAPOL-KEY Descriptor Type */ -#define WPA1_KEY_DESC 0xfe -#define WPA2_KEY_DESC 0x02 -#define OSEN_KEY_DESC 0x00 - -/* Key Descriptor Version of Key Information */ -#define KEY_DESC_NOT_DEFINED 0 -#define KEY_DESC_OSEN KEY_DESC_NOT_DEFINED -#define KEY_DESC_TKIP 1 -#define KEY_DESC_AES 2 -#define KEY_DESC_EXT 3 - -#define IE_WPA 221 -#define IE_RSN 48 - -#define WPA_KDE_TYPE 0xdd - -/*EAP Packet Type */ -#define EAPPacket 0 -#define EAPOLStart 1 -#define EAPOLLogoff 2 -#define EAPOLKey 3 -#define EAPOLASFAlert 4 -#define EAPTtypeMax 5 - -#define PAIRWISEKEY 1 -#define GROUPKEY 0 - -/* RSN IE Length definition */ -#define MAX_LEN_OF_RSNIE 255 -#define MIN_LEN_OF_RSNIE 2 -#define MAX_LEN_OF_RSNXEIE 255 -#define MIN_LEN_OF_RSNXEIE 2 -#define MAX_LEN_GTK 32 -#define MIN_LEN_GTK 5 - -#ifdef HOSTAPD_OWE_SUPPORT -#define MAX_LEN_OF_TRANS_IE 48 -#endif - -#define LEN_PSK 64 -#define LEN_MAX_PMK 64 -#define LEN_PMK_SHA512 64 -#define LEN_PMK_SHA384 48 -#define LEN_PMK 32 -#define LEN_MAXPMK 64 -#define LEN_PMKID 16 -#define LEN_PMK_NAME 16 - -#define LEN_GMK 32 - -#define LEN_PTK_KCK 16 -#define LEN_PTK_KEK 16 -#define LEN_TK 16 /* The length Temporal key. */ -#define LEN_TKIP_MIC 8 /* The length of TX/RX Mic of TKIP */ -#define LEN_TK2 (2 * LEN_TKIP_MIC) -#define LEN_PTK (LEN_PTK_KCK + LEN_PTK_KEK + LEN_TK + LEN_TK2) - -#define LEN_PTK_KCK_SHA384 24 -#define LEN_PTK_KEK_SHA384 32 -#define LEN_TK_SHA384 32 -#define LEN_PTK_SHA384 (LEN_PTK_KCK_SHA384 + LEN_PTK_KEK_SHA384 + LEN_TK_SHA384) -#define LEN_OWE_PTK_SHA384 \ - (LEN_PTK_KCK_SHA384 + LEN_PTK_KEK_SHA384 + LEN_AES_TK) - -#define LEN_TKIP_PTK LEN_PTK -#define LEN_AES_PTK (LEN_PTK_KCK + LEN_PTK_KEK + LEN_TK) -#define LEN_MAX_PTK 88 /* 512 bits max, KCK(24)+KEK(32)+TK(32) */ -#define LEN_TKIP_GTK (LEN_TK + LEN_TK2) -#define LEN_AES_GTK LEN_TK -#define LEN_MAX_GTK 32 -#define LEN_MAX_IGTK 32 -#define LEN_TKIP_TK (LEN_TK + LEN_TK2) -#define LEN_AES_TK LEN_TK -#define LEN_CCMP128_TK 16 -#define LEN_CCMP256_TK 32 -#define LEN_GCMP128_TK 16 -#define LEN_GCMP256_TK 32 -#define LEN_BIP128_IGTK 16 -#define LEN_BIP256_IGTK 32 - -#define LEN_WEP64 5 -#define LEN_WEP128 13 - -#define OFFSET_OF_PTK_TK \ - (LEN_PTK_KCK + \ - LEN_PTK_KEK) /* The offset of the PTK Temporal key in PTK */ -#define OFFSET_OF_TKIP_RX_MIC (OFFSET_OF_PTK_TK + LEN_TK) -#define OFFSET_OF_TKIP_TX_MIC (OFFSET_OF_TKIP_RX_MIC + LEN_TKIP_MIC) - -#define LEN_KDE_HDR 6 -#define LEN_NONCE 32 -#define LEN_PN 6 -#define LEN_TKIP_IV_HDR 8 -#define LEN_CCMP_HDR 8 -#define LEN_CCMP_MIC 8 -#define LEN_OUI_SUITE 4 -#define LEN_WEP_TSC 3 -#define LEN_WPA_TSC 6 -#define LEN_WEP_IV_HDR 4 -#define LEN_ICV 4 - -/* It's defined in IEEE Std 802.11-2007 Table 8-4 */ -typedef enum _WPA_KDE_ID { - KDE_RESV0, - KDE_GTK, - KDE_RESV2, - KDE_MAC_ADDR, - KDE_PMKID, - KDE_SMK, - KDE_NONCE, - KDE_LIFETIME, - KDE_ERROR, -#ifdef DOT11W_PMF_SUPPORT - KDE_IGTK, /* Defined in IEEE 802.11w/D10.0 */ -#endif /* DOT11W_PMF_SUPPORT */ - KDE_RESV_OTHER -} WPA_KDE_ID; - -/* EAPOL Key Information definition within Key descriptor format */ -typedef struct GNU_PACKED _KEY_INFO { -#ifdef RT_BIG_ENDIAN - UCHAR KeyAck : 1; - UCHAR Install : 1; - UCHAR KeyIndex : 2; - UCHAR KeyType : 1; - UCHAR KeyDescVer : 3; - UCHAR Rsvd : 3; - UCHAR EKD_DL : 1; /* EKD for AP; DL for STA */ - UCHAR Request : 1; - UCHAR Error : 1; - UCHAR Secure : 1; - UCHAR KeyMic : 1; -#else - UCHAR KeyMic : 1; - UCHAR Secure : 1; - UCHAR Error : 1; - UCHAR Request : 1; - UCHAR EKD_DL : 1; /* EKD for AP; DL for STA */ - UCHAR Rsvd : 3; - UCHAR KeyDescVer : 3; - UCHAR KeyType : 1; - UCHAR KeyIndex : 2; - UCHAR Install : 1; - UCHAR KeyAck : 1; -#endif -} KEY_INFO, *PKEY_INFO; - -/* EAPOL Key descriptor format */ -typedef struct GNU_PACKED _KEY_DESCRIPTER { - UCHAR Type; - KEY_INFO KeyInfo; - UCHAR KeyLength[2]; - UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY]; - UCHAR KeyNonce[LEN_KEY_DESC_NONCE]; - UCHAR KeyIv[LEN_KEY_DESC_IV]; - UCHAR KeyRsc[LEN_KEY_DESC_RSC]; - UCHAR KeyId[LEN_KEY_DESC_ID]; - UCHAR KeyMicAndData[0]; -} KEY_DESCRIPTER, *PKEY_DESCRIPTER; - -typedef struct GNU_PACKED _EAPOL_PACKET { - UCHAR ProVer; - UCHAR ProType; - UCHAR Body_Len[2]; - KEY_DESCRIPTER KeyDesc; -} EAPOL_PACKET, *PEAPOL_PACKET; - -typedef struct GNU_PACKED _KDE_HDR { - UCHAR Type; - UCHAR Len; - UCHAR OUI[3]; - UCHAR DataType; - UCHAR octet[0]; -} KDE_HDR, *PKDE_HDR; - -/*802.11i D10 page 83 */ -typedef struct GNU_PACKED _GTK_KDE { -#ifndef RT_BIG_ENDIAN - UCHAR Kid : 2; - UCHAR tx : 1; - UCHAR rsv : 5; - UCHAR rsv1; -#else - UCHAR rsv : 5; - UCHAR tx : 1; - UCHAR Kid : 2; - UCHAR rsv1; -#endif - UCHAR GTK[0]; -} GTK_KDE, *PGTK_KDE; - -/* For WPA1 */ -typedef struct GNU_PACKED _RSNIE { - UCHAR oui[4]; - USHORT version; - UCHAR mcast[4]; - USHORT ucount; - struct GNU_PACKED { - UCHAR oui[4]; - } ucast[1]; -} RSNIE, *PRSNIE; - -/* For WPA2 */ -typedef struct GNU_PACKED _RSNIE2 { - USHORT version; - UCHAR mcast[4]; - USHORT ucount; - struct GNU_PACKED { - UCHAR oui[4]; - } ucast[1]; -} RSNIE2, *PRSNIE2; - -/* AKM Suite */ -typedef struct GNU_PACKED _RSNIE_AUTH { - USHORT acount; - struct GNU_PACKED { - UCHAR oui[4]; - } auth[1]; -} RSNIE_AUTH, *PRSNIE_AUTH; - -/* PMKID List */ -typedef struct GNU_PACKED _RSNIE_PMKID { - USHORT pcount; - struct GNU_PACKED { - UCHAR list[16]; - } pmkid[1]; -} RSNIE_PMKID, *PRSNIE_PMKID; - -typedef union GNU_PACKED _RSN_CAPABILITIES { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - USHORT Rsvd : 8; - USHORT MFPC : 1; - USHORT MFPR : 1; - USHORT GTKSA_R_Counter : 2; - USHORT PTKSA_R_Counter : 2; - USHORT No_Pairwise : 1; - USHORT PreAuth : 1; -#else - USHORT PreAuth : 1; - USHORT No_Pairwise : 1; - USHORT PTKSA_R_Counter : 2; - USHORT GTKSA_R_Counter : 2; - USHORT MFPR : 1; - USHORT MFPC : 1; - USHORT Rsvd : 8; -#endif - } field; - USHORT word; -} RSN_CAPABILITIES, *PRSN_CAPABILITIES; - -typedef struct GNU_PACKED _EAP_HDR { - UCHAR ProVer; - UCHAR ProType; - UCHAR Body_Len[2]; - UCHAR code; - UCHAR identifier; - UCHAR length[2]; /* including code and identifier, followed by length-2 octets of data */ -} EAP_HDR, *PEAP_HDR; - -#endif /* __DOT11I_WPA_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dot11w_pmf.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dot11w_pmf.h deleted file mode 100644 index 2c0c4ea359..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/dot11w_pmf.h +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - dot11w_pmf.h - - Abstract: - Defined status code, IE and frame structures that PMF (802.11w) needed. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - Albert Yang 4-02-2009 created for IEEE802.11W PMF - */ - -#ifndef __DOT11W_PMF_H -#define __DOT11W_PMF_H - -#ifdef DOT11W_PMF_SUPPORT - -#include "rtmp_type.h" - -#define LEN_PMF_MMIE 16 -#define PMF_CIPHER_SUITE_LEN 4 -#define LEN_PMF_BIP_AAD_HDR 20 -#define LEN_PMF_BIP_MIC 8 -#define LEN_PMF_IGTK_KDE 24 - -/* PMF Action filed value */ -#define PMF_ACTION_QA_QUERY_REQ 0 -#define PMF_ACTION_QA_QUERY_RESP 1 - -/* Information element ID defined in 802.11w specification. */ -#define IE_PMF_MMIE 76 - -/* The definition in IEEE 802.11w - Table 7-32 Cipher suite selectors */ -extern UCHAR OUI_PMF_BIP_CIPHER[]; - -/* The definition in IEEE 802.11w - Table 7-34 AKM suite selectors */ -extern UCHAR OUI_PMF_8021X_AKM[]; -extern UCHAR OUI_PMF_PSK_AKM[]; - -/* The Key ID filed */ -typedef union GNU_PACKED _PMF_IGTK_KEY_ID { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT16 Reserved : 4; - UINT16 KeyId : 12; -#else - UINT16 KeyId : 12; - UINT16 Reserved : 4; -#endif - } field; - UINT16 word; -} PMF_IGTK_KEY_ID, *PPMF_IGTK_KEY_ID; - -/* The SubIE of Fast BSS transition information element */ -typedef struct GNU_PACKED _FT_IGTK_SUB_ELEMENT { - UINT8 KeyID[2]; /* indicates the value of the BIP key ID */ - UINT8 IPN[6]; /* indicates the receive sequence counter for the IGTK being installed */ - UINT8 KeyLen; /* the length of IGTK in octets */ - UINT8 Key[24]; /* The length of the resulting AES-Keywrapped IGTK in the Key field */ -} FT_IGTK_SUB_ELEMENT, *PFT_IGTK_SUB_ELEMENT; - -/* Management MIC information element */ -typedef struct GNU_PACKED _PMF_MMIE { - UINT8 KeyID[2]; /* identifies the IGTK used to compute the MIC */ - UINT8 IPN[6]; /* indicates the receive sequence counter for the IGTK being installed */ - UINT8 MIC[LEN_PMF_BIP_MIC]; /* The length of the resulting AES-Keywrapped IGTK in the Key field */ -} PMF_MMIE, *PPMF_MMIE; - -/* IGTK KDE format */ -typedef struct GNU_PACKED _PMF_IGTK_KDE { - UINT8 KeyID[2]; /* identifies the IGTK used to compute the MIC */ - UINT8 IPN[6]; /* indicates the receive sequence counter for the IGTK being installed */ - UINT8 IGTK[0]; /* The length of the IGTK */ -} PMF_IGTK_KDE, *PPMF_IGTK_KDE; - -/* ===================== - * PMF SA Query Action - * ===================== */ -typedef struct GNU_PACKED _PMF_SA_QUERY_ACTION { - UCHAR Category; - UCHAR Action; - - /* a 16-bit non-negative counter value */ - UINT8 TransactionID[2]; -} PMF_SA_QUERY_ACTION, *PPMF_SA_QUERY_ACTION; - -#endif /* DOT11W_PMF_SUPPORT */ - -#endif /* __DOT11W_PMF_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/ecc.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/ecc.h deleted file mode 100644 index 27746598a5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/ecc.h +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef __ECC_H__ -#define __ECC_H__ - -#include "security/bn.h" -#include "security/sae_cmm.h" - -typedef struct __EC_GROUP_INFO_BI { - INT32 group_id; - SAE_BN *prime; - SAE_BN *order; - SAE_BN *a; - SAE_BN *b; - SAE_BN *gx; - SAE_BN *gy; - SAE_BN *z; /* sswu curve parameter */ - SAE_BN *cofactor; - MONT_STRUC *mont; - UCHAR is_minus_3; - UCHAR is_init; -} EC_GROUP_INFO_BI, *PEC_GROUP_INFO_BI; - -typedef struct __EC_GROUP_INFO { - INT32 group_id; - const UCHAR *prime; - UINT32 prime_len; - const UCHAR *order; - UINT32 order_len; - const UCHAR *a; - UINT32 a_len; - const UCHAR *b; - UINT32 b_len; - const UCHAR *z; /* sswu curve parameter */ - UINT32 z_len; - const UCHAR *X; - UINT32 X_len; - const UCHAR *R; - UINT32 R_len; - const UCHAR *PInverse; - UINT32 PInverse_len; - UINT16 bits_of_R; -} EC_GROUP_INFO, *PEC_GROUP_INFO; - -struct __EC_GROUP_INFO *get_ecc_group_info(IN INT32 group); - -EC_GROUP_INFO_BI *get_ecc_group_info_bi(IN INT32 group); - -VOID group_info_bi_deinit(VOID); - -VOID ecc_point_init(IN BIG_INTEGER_EC_POINT **ec_point_res); - -VOID ecc_point_free(IN BIG_INTEGER_EC_POINT **ec_point_res); - -VOID ecc_point_copy(IN BIG_INTEGER_EC_POINT *point, - OUT BIG_INTEGER_EC_POINT **ec_point_res); - -/* if (x1, y2) != (x2, y2), but x1 = x2 => result is infinity */ -/* if point1 + point2 and point1 is infinity => result is point2 */ -VOID ecc_point_add(IN BIG_INTEGER_EC_POINT *point, - IN BIG_INTEGER_EC_POINT *point2, - IN struct __EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res); -/* if point is infinity, result is infinity */ -VOID ecc_point_double(IN BIG_INTEGER_EC_POINT *point, - IN struct __EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res); - -VOID ecc_point_add_3d(IN BIG_INTEGER_EC_POINT *point, - IN BIG_INTEGER_EC_POINT *point2, - IN struct __EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res); - -VOID ecc_point_double_3d(IN BIG_INTEGER_EC_POINT *point, - IN struct __EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res); - -VOID ecc_point_3d_to_2d(IN struct __EC_GROUP_INFO_BI *ec_group_bi, - INOUT BIG_INTEGER_EC_POINT *ec_point_res); - -VOID ecc_point_set_z_to_one(INOUT BIG_INTEGER_EC_POINT *ec_point_res); - -/* https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication */ -/* double and add */ -VOID ecc_point_mul_dblandadd(IN BIG_INTEGER_EC_POINT *point, IN SAE_BN *scalar, - IN struct __EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res); - -/* https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication */ -/* w-ary non-adjacent form (wNAF) method */ -VOID ecc_point_mul_wNAF(IN BIG_INTEGER_EC_POINT *point, IN SAE_BN *scalar, - IN struct __EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res); - -/* https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication */ -/* w-ary non-adjacent form (wNAF) method */ -VOID ecc_point_mul_windowed(IN BIG_INTEGER_EC_POINT *point, IN SAE_BN *scalar, - IN struct __EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res); - -/* (x,y) => (x, p-y) */ -VOID ecc_point_inverse(IN BIG_INTEGER_EC_POINT *point, IN SAE_BN *prime, - OUT BIG_INTEGER_EC_POINT **point_res); - -UCHAR ecc_point_is_on_curve(IN struct __EC_GROUP_INFO_BI *ec_group_bi, - IN BIG_INTEGER_EC_POINT *point); - -UCHAR ecc_point_is_on_curve_3d(IN EC_GROUP_INFO_BI *ec_group_bi, - IN BIG_INTEGER_EC_POINT *point); - -/* y^2 = x^3 + ax + b */ -UCHAR ecc_point_find_by_x(IN struct __EC_GROUP_INFO_BI *ec_group_bi, - IN SAE_BN *x, IN SAE_BN **res_y, IN UCHAR need_res_y); - -VOID ecc_point_dump_time(VOID); - -BIG_INTEGER_EC_POINT *ecc_point_add_cmm(IN BIG_INTEGER_EC_POINT *point, - IN BIG_INTEGER_EC_POINT *point2, - IN SAE_BN *lamda, - IN EC_GROUP_INFO_BI *ec_group_bi); - -INT ecc_gen_key(EC_GROUP_INFO *ec_group, EC_GROUP_INFO_BI *ec_group_bi, - INOUT SAE_BN **priv_key, BIG_INTEGER_EC_POINT *generator, - INOUT VOID **pub_key); -#endif /* __ECC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/owe_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/owe_cmm.h deleted file mode 100644 index b1de49a2d2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/owe_cmm.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef OWE_CMM_H -#define OWE_CMM_H - -#ifdef CONFIG_OWE_SUPPORT -#include "security/sae_cmm.h" - -#define ECDH_GROUP_256 19 -#define ECDH_GROUP_384 20 -#define ECDH_GROUP_521 21 - -#define OWE_TRANSITION_ORG_ID 0x506f9a -#define OWE_TRANSITION_ORG_ID_LEN 3 - -#define APCLI_MAX_SUPPORTED_OWE_GROUPS 2 - -#ifdef APCLI_OWE_SUPPORT -extern UCHAR apcli_owe_supp_groups[]; -#endif - -typedef struct GNU_PACKED _EXT_ECDH_PARAMETER_IE { - UCHAR ext_ie_id; - UCHAR length; - UCHAR ext_id_ecdh; - UINT16 group; - UCHAR public_key[128]; -} EXT_ECDH_PARAMETER_IE, *PEXT_ECDH_PARAMETER_IE; - -typedef struct owe_info { - VOID *group_info; - VOID *group_info_bi; - VOID *peer_pub_key; /*actually, BIG_INTEGER_EC_POINT*/ - VOID *pub_key; /*actually, BIG_INTEGER_EC_POINT*/ - VOID *generator; /*actually, BIG_INTEGER_EC_POINT*/ - SAE_BN *priv_key; - UCHAR curr_group; - UCHAR last_try_group; - BOOLEAN inited; - UCHAR *pmkid; -} OWE_INFO; - -INT process_ecdh_element(struct _RTMP_ADAPTER *ad, - struct _MAC_TABLE_ENTRY *entry, - EXT_ECDH_PARAMETER_IE *ext_ie_ptr, UCHAR ie_len, - UCHAR type, BOOLEAN update_only_grp_info); - -INT build_owe_dh_ie(struct _RTMP_ADAPTER *ad, struct _MAC_TABLE_ENTRY *pentry, - UCHAR *buf, UCHAR group); - -INT init_owe_group(OWE_INFO *owe, UCHAR group); - -INT deinit_owe_group(OWE_INFO *owe); - -INT owe_calculate_secret(OWE_INFO *owe, SAE_BN **secret); - -#ifdef CONFIG_AP_SUPPORT -USHORT owe_pmkid_ecdh_process(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry, UCHAR *rsn_ie, - UCHAR rsn_ie_len, EXT_ECDH_PARAMETER_IE *ecdh_ie, - UCHAR ecdh_ie_length, UINT8 *pmkid, - UINT8 *pmkid_count, UCHAR type); -#endif - -BOOLEAN extract_pair_owe_bss_info(UCHAR *owe_vendor_ie, UCHAR owe_vendor_ie_len, - UCHAR *pair_bssid, UCHAR *pair_ssid, - UCHAR *pair_ssid_len, UCHAR *pair_band, - UCHAR *pair_ch); - -extern UCHAR OWE_TRANS_OUI[]; - -void wext_send_owe_trans_chan_event(PNET_DEV net_dev, UCHAR event_id, - UCHAR *pair_bssid, UCHAR *pair_ssid, - UCHAR *pair_ssid_len, UCHAR *pair_band, - UCHAR *pair_ch); - -#endif /*CONFIG_OWE_SUPPORT*/ -#endif /* OWE_CMM_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/pmf.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/pmf.h deleted file mode 100644 index 5772e5ddcc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/pmf.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Abstract: - IEEE P802.11w - - */ -#ifndef __PMF_H -#define __PMF_H -#ifdef DOT11W_PMF_SUPPORT - -VOID PMF_PeerAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PMF_MlmeSAQueryReq(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry); - -VOID PMF_PeerSAQueryReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PMF_PeerSAQueryRspAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID PMF_DeriveIGTK(IN PRTMP_ADAPTER pAd, OUT UCHAR *output); - -VOID PMF_InsertIGTKKDE(IN PRTMP_ADAPTER pAd, IN INT apidx, IN PUCHAR pFrameBuf, - OUT PULONG pFrameLen); - -BOOLEAN PMF_ExtractIGTKKDE(IN PUCHAR pBuf, IN INT buf_len, OUT PUCHAR IGTK, - OUT UCHAR *IGTKLEN, OUT PUCHAR IPN, - OUT UINT8 *IGTK_KeyIdx); - -BOOLEAN PMF_MakeRsnIeGMgmtCipher(IN SECURITY_CONFIG *pSecConfig, - IN UCHAR ie_idx, OUT UCHAR *rsn_len); - -UINT PMF_RsnCapableValidation(IN PUINT8 pRsnie, IN UINT rsnie_len, - IN BOOLEAN self_MFPC, IN BOOLEAN self_MFPR, - IN UINT32 self_igtk_cipher, IN UCHAR end_field, - IN struct _SECURITY_CONFIG *pSecConfigEntry); - -BOOLEAN PMF_PerformTxFrameAction(IN PRTMP_ADAPTER pAd, - IN PHEADER_802_11 pHeader_802_11, - IN UINT SrcBufLen, IN UINT8 tx_hw_hdr_len, - OUT UCHAR *prot); - -BOOLEAN PMF_PerformRxFrameAction(IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk); - -int PMF_RobustFrameClassify(IN PHEADER_802_11 pHdr, IN PUCHAR pFrame, - IN UINT frame_len, IN PUCHAR pData, - IN BOOLEAN IsRx); - -#ifdef SOFT_ENCRYPT -int PMF_EncapBIPAction(IN PRTMP_ADAPTER pAd, IN PUCHAR pMgmtFrame, - IN UINT mgmt_len); -#endif /* SOFT_ENCRYPT */ - -void PMF_AddMMIE(IN PMF_CFG *pPmfCfg, IN PUCHAR pMgmtFrame, IN UINT mgmt_len); - -void rtmp_read_pmf_parameters_from_file(IN PRTMP_ADAPTER pAd, - IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer); - -INT Set_PMFMFPC_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_PMFMFPR_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_PMFSHA256_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_PMFSA_Q_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -#endif /* DOT11W_PMF_SUPPORT */ - -#endif /* __PMF_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/pmf_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/pmf_cmm.h deleted file mode 100644 index e80589db05..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/pmf_cmm.h +++ /dev/null @@ -1,92 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - Management Frame Protection Required is defined in IEEE802.11w - - Define all structures, data types that rtmp.h needed in this file. Don't - put any sturctures and functions definition which refer to RTMP_ADAPTER - Here. - -***************************************************************************/ - -#ifdef DOT11W_PMF_SUPPORT - -#ifndef __PMF_CMM_H__ -#define __PMF_CMM_H__ - -#include "rtmp_type.h" -#include "security/dot11w_pmf.h" - -#define NORMAL_FRAME 0 -#define ERROR_FRAME 1 -#define NOT_ROBUST_GROUP_FRAME 2 -#define NOT_ROBUST_UNICAST_FRAME 3 -#define UNICAST_ROBUST_FRAME 4 -#define GROUP_ROBUST_FRAME 5 - -typedef enum _PMF_STATUS_NUM { - PMF_STATUS_SUCCESS, - PMF_POLICY_VIOLATION, - PMF_UNICAST_ENCRYPT_FAILURE, - PMF_ENCAP_BIP_FAILURE, - PMF_UNICAST_DECRYPT_FAILURE, - PMF_EXTRACT_BIP_FAILURE, - PMF_STATUS_RESV -} PMF_STATUS_NUM; - -/* - * Management Frame Protection Required is defined in IEEE802.11w - */ -typedef struct GNU_PACKED _PMF_CFG { - /* - * A STA sets this bit to 1 to advertise that protection of Robust - * Management Frames is enabled. - */ - BOOLEAN MFPC; /* This is actual active */ - BOOLEAN Desired_MFPC; /* This is user desired */ - - /* - * A STA sets this bit to 1 to advertise that protection of - * Robust Management Frames is mandatory. - * If a STA sets this bit to 1, then that STA only allows RSNAs - * from STAs which provide Management Frame Protection. - */ - BOOLEAN MFPR; /* This is actual active */ - BOOLEAN Desired_MFPR; /* This is user desired */ - - BOOLEAN PMFSHA256; /* This is actual active */ - BOOLEAN Desired_PMFSHA256; /* This is user desired */ - - /* Connect State */ - BOOLEAN UsePMFConnect; - - UINT32 igtk_cipher; - - UINT8 IGTK_KeyIdx; /* It shall be 4 or 5 */ - UCHAR IGTK[2][LEN_MAX_IGTK]; - UCHAR IPN[2][LEN_WPA_TSC]; - - UCHAR PmfTxTsc[LEN_WPA_TSC]; - UCHAR PmfRxTsc[LEN_WPA_TSC]; - RALINK_TIMER_STRUCT SAQueryTimer; - RALINK_TIMER_STRUCT SAQueryConfirmTimer; - UCHAR SAQueryStatus; - USHORT TransactionID; -} PMF_CFG, *PPMF_CFG; - -#endif /* __PMF_CMM_H__ */ -#endif /* DOT11W_PMF_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sae.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sae.h deleted file mode 100644 index f7596b2070..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sae.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - sae.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __SAE_H__ -#define __SAE_H__ -#ifdef DOT11_SAE_SUPPORT - -#include "rt_config.h" - -INT show_sae_info_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -VOID sae_cfg_init(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg); - -VOID sae_cfg_deinit(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg); - -SAE_INSTANCE *search_sae_instance(IN SAE_CFG *pSaeCfg, IN UCHAR *own_mac, - IN UCHAR *peer_mac); - -SAE_INSTANCE *create_sae_instance(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg, - IN UCHAR *own_mac, IN UCHAR *peer_mac, - IN UCHAR *bssid, IN UCHAR *psk, - IN struct pwd_id_list *pwd_id_list_head, - IN UCHAR is_pwd_id_only); - -VOID delete_sae_instance(IN SAE_INSTANCE *pSaeIns); - -UCHAR set_sae_instance_removable(IN SAE_CFG *pSaeCfg, IN UCHAR *own_mac, - IN UCHAR *peer_mac); - -VOID sae_ins_init(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg, - IN SAE_INSTANCE *pSaeIns, IN UCHAR *own_mac, - IN UCHAR *peer_mac, IN UCHAR *bssid, IN UCHAR *psk, - IN struct pwd_id_list *pwd_id_list_head, - IN UCHAR is_pwd_id_only); - -/* partial */ -VOID sae_clear_data(IN SAE_INSTANCE *pSaeIns); - -VOID sae_dump_time(IN SAE_TIME_INTERVAL *time_cost); - -UCHAR sae_using_anti_clogging(IN SAE_CFG *pSaeCfg); - -VOID sae_set_retransmit_timer(IN SAE_INSTANCE *pSaeIns); - -VOID sae_clear_retransmit_timer(IN SAE_INSTANCE *pSaeIns); - -DECLARE_TIMER_FUNCTION(sae_auth_retransmit); - -VOID sae_auth_retransmit(IN VOID *SystemSpecific1, IN VOID *FunctionContext, - IN VOID *SystemSpecific2, IN VOID *SystemSpecific3); - -UCHAR sae_auth_init(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg, - IN UCHAR *own_mac, IN UCHAR *peer_mac, IN UCHAR *bssid, - IN UCHAR *psk, IN struct sae_pt *pt_list, IN INT32 group); - -UCHAR sae_handle_auth(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg, IN VOID *msg, - IN UINT32 msg_len, IN UCHAR *psk, - IN struct sae_pt *pt_list, - IN struct sae_capability *sae_cap, -#ifdef DOT11_SAE_PWD_ID_SUPPORT - IN struct pwd_id_list *pwd_id_list_head, -#endif - IN USHORT auth_seq, IN USHORT auth_status, - OUT UCHAR **pmk, OUT UCHAR *is_h2e_connect); - -USHORT sae_sm_step(IN RTMP_ADAPTER *pAd, IN SAE_INSTANCE *pSaeIns, - IN USHORT auth_seq); - -UCHAR sae_check_big_sync(IN SAE_INSTANCE *pSaeIns); - -UCHAR sae_get_pmk_cache(IN SAE_CFG *pSaeCfg, IN UCHAR *own_mac, - IN UCHAR *peer_mac, OUT UCHAR *pmkid, OUT UCHAR *pmk); - -UCHAR sae_build_token_req(IN RTMP_ADAPTER *pAd, IN SAE_INSTANCE *pSaeIns, - OUT UCHAR *token_req, OUT UINT32 *token_req_len); - -UCHAR sae_check_token(IN SAE_INSTANCE *pSaeIns, IN UCHAR *peer_token, - IN UINT32 peer_token_len); - -USHORT sae_parse_commit(IN SAE_CFG *pSaeCfg, IN SAE_INSTANCE *pSaeIns, - IN UCHAR *msg, IN UINT32 msg_len, IN UCHAR **token, - IN UINT32 *token_len, IN UCHAR is_token_req); - -VOID sae_parse_commit_token(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end, IN UCHAR **token, - IN UINT32 *token_len); - -USHORT sae_parse_commit_scalar(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end); - -USHORT sae_parse_commit_element(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end); - -UCHAR is_sae_pwd_id_element(IN UCHAR *pos, IN UCHAR *end, OUT UINT32 *len); - -UCHAR is_sae_rejected_group_element(IN UCHAR *pos, IN UCHAR *end, - OUT UINT32 *len); - -USHORT sae_parse_password_identifier(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end, IN UCHAR is_pwd_id_only); - -USHORT sae_parse_rejected_groups(IN SAE_INSTANCE *pSaeIns, IN UCHAR *pos, - IN UCHAR *end); - -USHORT sae_check_rejected_group(IN SAE_INSTANCE *pSaeIns); - -USHORT sae_prepare_commit(IN SAE_INSTANCE *pSaeIns); - -USHORT sae_derive_commit(IN SAE_INSTANCE *pSaeIns); - -USHORT sae_process_commit(IN SAE_INSTANCE *pSaeIns); - -UCHAR sae_derive_key(IN SAE_INSTANCE *pSaeIns, IN UCHAR *k); - -VOID sae_send_auth(IN RTMP_ADAPTER *pAd, IN UCHAR *own_mac, IN UCHAR *peer_mac, - IN UCHAR *bssid, IN USHORT alg, IN USHORT seq, - IN USHORT status_code, IN UCHAR *buf, IN UINT32 buf_len); - -UCHAR sae_send_auth_commit(IN RTMP_ADAPTER *pAd, IN SAE_INSTANCE *pSaeIns); - -UCHAR sae_send_auth_confirm(IN RTMP_ADAPTER *pAd, IN SAE_INSTANCE *pSaeIns); - -USHORT sae_parse_confirm(IN SAE_INSTANCE *pSaeIns, IN UCHAR *msg, - IN UINT32 msg_len); - -USHORT sae_check_confirm(IN SAE_INSTANCE *pSaeIns, IN UCHAR *peer_confirm); - -SAE_BN *sae_gen_rand(IN SAE_INSTANCE *pSaeIns); - -INT sae_set_k_iteration(IN struct _RTMP_ADAPTER *ad, IN RTMP_STRING *arg); - -INT sae_set_anti_clogging_th(IN struct _RTMP_ADAPTER *ad, IN RTMP_STRING *arg); - -USHORT sae_group_allowed(IN SAE_INSTANCE *pSaeIns, IN UCHAR *allowed_groups, - IN INT32 group); - -VOID sae_derive_pt(IN SAE_CFG *pSaeCfg, IN UCHAR *psk, IN CHAR *ssid, - IN UCHAR ssid_len, OUT struct sae_pt **pt); - -VOID sae_pt_list_deinit(INOUT struct sae_pt **pt_list); - -UCHAR is_sae_group_ecc(IN INT32 group); - -UCHAR is_sae_group_ffc(IN INT32 group); - -#ifdef group_related -/* - ===================================== - group related - ===================================== -*/ -#endif -VOID sae_group_init_ecc(IN SAE_INSTANCE *pSaeIns, IN INT32 group); - -VOID sae_group_init_ffc(IN SAE_INSTANCE *pSaeIns, IN INT32 group); - -VOID sae_group_deinit_ecc(IN SAE_INSTANCE *pSaeIns); - -VOID sae_group_deinit_ffc(IN SAE_INSTANCE *pSaeIns); - -VOID sae_cn_confirm_ecc(IN SAE_INSTANCE *pSaeIns, - IN UCHAR is_send, /* otherwise, is verfication */ - OUT UCHAR *confirm); - -VOID sae_cn_confirm_ffc(IN SAE_INSTANCE *pSaeIns, - IN UCHAR is_send, /* otherwise, is verfication */ - OUT UCHAR *confirm); - -VOID sae_cn_confirm_cmm(IN SAE_INSTANCE *pSaeIns, IN SAE_BN *scalar1, - IN SAE_BN *scalar2, IN UCHAR *element_bin1, - IN UCHAR *element_bin2, IN UINT32 element_len, - IN USHORT send_confirm, OUT UCHAR *confirm); - -USHORT sae_parse_commit_element_ecc(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end); - -USHORT sae_parse_commit_element_ffc(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end); - -UCHAR sae_derive_commit_element_ecc(IN SAE_INSTANCE *pSaeIns, IN SAE_BN *mask); - -UCHAR sae_derive_commit_element_ffc(IN SAE_INSTANCE *pSaeIns, IN SAE_BN *mask); - -USHORT sae_derive_pwe_ecc(IN SAE_INSTANCE *pSaeIns); - -USHORT sae_derive_pwe_pt_ecc(IN SAE_INSTANCE *pSaeIns); - -USHORT sae_derive_pwe_ffc(IN SAE_INSTANCE *pSaeIns); - -UCHAR sae_derive_k_ecc(IN SAE_INSTANCE *pSaeIns, OUT UCHAR *k); - -UCHAR sae_derive_k_ffc(IN SAE_INSTANCE *pSaeIns, OUT UCHAR *k); - -USHORT sae_reflection_check_ecc(IN SAE_INSTANCE *pSaeIns); - -USHORT sae_reflection_check_ffc(IN SAE_INSTANCE *pSaeIns); - -#endif /* DOT11_SAE_SUPPORT */ -#endif /* __SAE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sae_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sae_cmm.h deleted file mode 100644 index e2a6fdbe8b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sae_cmm.h +++ /dev/null @@ -1,711 +0,0 @@ -#ifndef SAE_CMM_H -#define SAE_CMM_H - -#ifdef DOT11_SAE_SUPPORT - -#ifdef DOT11_SAE_OPENSSL_BN -#include "security/crypt_bignum.h" -#include "security/crypt_biginteger.h" -#include "security/bn.h" - -#define SAE_BN BIGNUM - -#define SAE_BN_INIT(_in) Bignum_Init(_in) -#define SAE_BN_FREE(_in) Bignum_Free(_in) -#define SAE_BN_PRINT(_in) Bignum_Print(_in) -#define SAE_BN_RELEASE_BACK_TO_POOL(_in) Bignum_Free(_in) -#define SAE_BN_COPY(_in, _out) Bignum_Copy(_in, _out) -#define SAE_BN_BIN2BI(_ptr, _len, _out) Bignum_Bin2BI(_ptr, _len, _out) -#define SAE_BN_BI2BIN_WITH_PAD(_in, _ptr, _len, _padlen) \ - Bignum_BI2Bin_with_pad(_in, _ptr, _len, _padlen) -#define SAE_BN_GET_LEN(_in) Bignum_getlen(_in) - -#define SAE_BN_UCMP(_a, _b) Bignum_UnsignedCompare(_a, _b) -#define SAE_BN_IS_ZERO(_in) Bignum_is_zero(_in) -#define SAE_BN_IS_ONE(_in) Bignum_is_one(_in) -#define SAE_BN_IS_ODD(_in) Bignum_is_odd(_in) -#define SAE_BN_RSHIFT1(_in, _out) Bignum_Shift_Right1(_in, _out) -#define SAE_BN_MOD_LSHIFT1(_in, _p, _out) Bignum_Mod_Shift_Left1(_in, _p, _out) -#define SAE_BN_MOD_LSHIFT(_in, _bit, _p, _out) \ - Bignum_Mod_Shift_Left(_in, _bit, _p, _out) -#define SAE_BN_IS_QUADRATIC_RESIDE(_q, _p, _m) \ - Bignum_is_quadratic_residue(_q, _p) - -#define SAE_BN_ADD(_a, _b, _r) Bignum_Add(_a, _b, _r) /* no use */ -#define SAE_BN_SUB(_a, _b, _r) Bignum_Sub(_a, _b, _r) -#define SAE_BN_ADD_DW(_inout, _v) Bignum_Add_DW(_inout, _v) - -#define SAE_BN_MOD(_a, _p, _r) Bignum_Mod(_a, _p, _r) -#define SAE_BN_MOD_ADD(_a, _b, _p, _r) Bignum_Mod_Add(_a, _b, _p, _r) -#define SAE_BN_MOD_ADD_QUICK(_a, _b, _p, _r) \ - Bignum_Mod_Add_quick(_a, _b, _p, _r) -#define SAE_BN_MOD_SUB(_a, _b, _p, _r) Bignum_Mod_Sub(_a, _b, _p, _r) -#define SAE_BN_MOD_SUB_QUICK(_a, _b, _p, _r) \ - Bignum_Mod_Sub_quick(_a, _b, _p, _r) -#define SAE_BN_MOD_MUL(_a, _b, _p, _r) Bignum_Mod_Mul(_a, _b, _p, _r) -#define SAE_BN_MOD_DIV(_a, _b, _p, _r) Bignum_Mod_Div(_a, _b, _p, _r) -#define SAE_BN_MOD_SQR(_a, _p, _r) Bignum_Mod_Square(_a, _p, _r) -#define SAE_BN_MOD_SQRT(_a, _p, _mont, _r) Bignum_Mod_Sqrt(_a, _p, _r) -#define SAE_BN_MOD_MUL_INV(_a, _p, _r) Bignum_Mod_Mul_Inverse(_a, _p, _r) -#define SAE_BN_MOD_DW(_inout, _v, _rem) Bignum_Mod_DW(_inout, _v, _rem) - -#define SAE_BN_MOD_EXP_MONT(_a, _b, _p, _r) \ - Bignum_Montgomery_ExpMod(_a, _b, _p, _r) -#define SAE_LOG_TIME_BEGIN(_timerec) BigInteger_record_time_begin(_timerec) -#define SAE_LOG_TIME_END(_timerec) BigInteger_record_time_end(_timerec) -#define SAE_LOG_TIME_DUMP() BigInteger_dump_time() -#define SAE_GET_RAND_RANGE(_r, _range) Bignum_Get_rand_range(_range, _r) - -#else -#include "security/crypt_biginteger.h" - -#define SAE_BN BIG_INTEGER - -#define SAE_BN_INIT(_in) BigInteger_Init(_in) -#define SAE_BN_FREE(_in) BigInteger_Free(_in) -#define SAE_BN_PRINT(_in) BigInteger_Print(_in) -#define SAE_BN_RELEASE_BACK_TO_POOL(_in) \ - release_temporal_usage_big_interger(_in) -#define SAE_BN_COPY(_in, _out) BigInteger_Copy(_in, _out) -#define SAE_BN_BIN2BI(_ptr, _len, _out) BigInteger_Bin2BI(_ptr, _len, _out) -#define SAE_BN_BI2BIN_WITH_PAD(_in, _ptr, _len, _padlen) \ - BigInteger_BI2Bin_with_pad(_in, _ptr, _len, _padlen) -#define SAE_BN_GET_LEN(_in) BigInteger_getlen(_in) -#define SAE_BN_UCMP(_a, _b) BigInteger_UnsignedCompare(_a, _b) -#define SAE_BN_IS_ZERO(_in) BigInteger_is_zero(_in) -#define SAE_BN_IS_ONE(_in) BigInteger_is_one(_in) -#define SAE_BN_IS_ODD(_in) BigInteger_is_odd(_in) -#define SAE_BN_RSHIFT1(_in, _out) BigInteger_Shift_Right1(_in, _out) -#define SAE_BN_MOD_LSHIFT1(_in, _p, _out) \ - BigInteger_Mod_Shift_Left(_in, 1, _p, _out) -#define SAE_BN_MOD_LSHIFT(_in, _bit, _p, _out) \ - BigInteger_Mod_Shift_Left(_in, _bit, _p, _out) -#define SAE_BN_IS_QUADRATIC_RESIDE(_q, _p, _m) \ - BigInteger_is_quadratic_residue(_q, _p, _m) - -#define SAE_BN_ADD(_a, _b, _r) BigInteger_Add(_a, _b, _r) /* no use */ -#define SAE_BN_SUB(_a, _b, _r) BigInteger_Sub(_a, _b, _r) -#define SAE_BN_ADD_DW(_inout, _v) BigInteger_Add_DW(_inout, _v) - -#define SAE_BN_MOD(_a, _p, _r) BigInteger_Mod(_a, _p, _r) -#define SAE_BN_MOD_ADD(_a, _b, _p, _r) BigInteger_Mod_Add(_a, _b, _p, _r) -#define SAE_BN_MOD_ADD_QUICK(_a, _b, _p, _r) \ - BigInteger_Mod_Add_quick(_a, _b, _p, _r) -#define SAE_BN_MOD_SUB(_a, _b, _p, _r) BigInteger_Mod_Sub(_a, _b, _p, _r) -#define SAE_BN_MOD_SUB_QUICK(_a, _b, _p, _r) \ - BigInteger_Mod_Sub_quick(_a, _b, _p, _r) -#define SAE_BN_MOD_MUL(_a, _b, _p, _r) BigInteger_Mod_Mul(_a, _b, _p, _r) -#define SAE_BN_MOD_DIV(_a, _b, _p, _r) BigInteger_Mod_Div(_a, _b, _p, _r) -#define SAE_BN_MOD_SQR(_a, _p, _r) BigInteger_Mod_Square(_a, _p, _r) -#define SAE_BN_MOD_SQRT(_a, _p, _mont, _r) \ - BigInteger_Mod_Sqrt(_a, _p, _mont, _r) -#define SAE_BN_MOD_MUL_INV(_a, _p, _r) BigInteger_Mod_Mul_Inverse(_a, _p, _r) -#define SAE_BN_MOD_DW(_inout, _v, _rem) BigInteger_Mod_DW(_inout, _v, _rem) - -#define SAE_BN_MOD_EXP_MONT(_a, _b, _p, _r) \ - BigInteger_Montgomery_ExpMod(_a, _b, _p, _r) -#define SAE_LOG_TIME_BEGIN(_timerec) BigInteger_record_time_begin(_timerec) -#define SAE_LOG_TIME_END(_timerec) BigInteger_record_time_end(_timerec) -#define SAE_LOG_TIME_DUMP() BigInteger_dump_time() -#define SAE_GET_RAND_RANGE(_r, _range) BigInteger_rand_range(_range, _r) - -#endif - -#define SAE_ECC_3D -#ifdef SAE_ECC_3D -#define SAE_ECC_3D_to_2D(_group_info, _inout) \ - ecc_point_3d_to_2d(_group_info, _inout) -#define SAE_ECC_SET_Z_TO_1(_inout) ecc_point_set_z_to_one(_inout) -#else -#define SAE_ECC_3D_to_2D(_group_info, _inout) -#define SAE_ECC_SET_Z_TO_1(_inout) - -#endif -#define EID_EXT_PASSWORD_IDENTIFIER 33 -#define EID_EXT_REJECTED_GROUP 92 -#define SAE_MAX_PWD_ID 40 /* this parameter is not defined in spec */ -#define SAE_TOKEN_KEY_LEN 6 /* this parameter is not defined in spec */ - -#define MAX_SAE_KCK_LEN 64 /*SHA512_DIGEST_SIZE */ -#define SAE_KCK_LEN 32 -#define SAE_PMKID_LEN 16 -#define SAE_KEYSEED_KEY_LEN 32 -#define SAE_MAX_PRIME_LEN 1024 -#define SAE_MAX_ECC_PRIME_LEN 66 -#define SAE_COMMIT_MAX_LEN (2 + 3 * SAE_MAX_PRIME_LEN) -#define SAE_CONFIRM_MAX_LEN (2 + SAE_MAX_PRIME_LEN) - -#define SAE_COMMIT_SEQ 1 -#define SAE_CONFIRM_SEQ 2 - -#define MAX_SIZE_OF_ALLOWED_GROUP 2 - -#define DOT11RSNASAESYNC 5 - -#define SAE_SILENTLY_DISCARDED 65535 -#define SAE_MAX_SEND_CONFIRM 65535 - -#define MAX_SAE_GROUP 32 -#define SAE_DEFAULT_GROUP SAE_DEFAULT_GROUP_ECC -#define SAE_DEFAULT_GROUP_ECC 19 -#define SAE_DEFAULT_GROUP_FFC 5 - -#define ECC_POINT_MUL(_point, _scalar, _ec_group_bi, _ec_point_res) \ - ecc_point_mul_windowed(_point, _scalar, _ec_group_bi, _ec_point_res) - -#define SET_NOTHING_STATE(_pSaeIns) \ - { \ - if (_pSaeIns->pParentSaeCfg && \ - ((_pSaeIns->state == SAE_COMMITTED) || \ - (_pSaeIns->state == SAE_CONFIRMED))) \ - _pSaeIns->pParentSaeCfg->open--; \ - _pSaeIns->state = SAE_NOTHING; \ - } - -#define SET_COMMITTED_STATE(_pSaeIns) \ - { \ - if (_pSaeIns->pParentSaeCfg && \ - ((_pSaeIns->state == SAE_NOTHING) || \ - (_pSaeIns->state == SAE_ACCEPTED))) \ - _pSaeIns->pParentSaeCfg->open++; \ - _pSaeIns->state = SAE_COMMITTED; \ - } - -#define SET_CONFIRMED_STATE(_pSaeIns) \ - { \ - if (_pSaeIns->pParentSaeCfg && \ - ((_pSaeIns->state == SAE_NOTHING) || \ - (_pSaeIns->state == SAE_ACCEPTED))) \ - _pSaeIns->pParentSaeCfg->open++; \ - _pSaeIns->state = SAE_CONFIRMED; \ - } - -#define SET_ACCEPTED_STATE(_pSaeIns) \ - { \ - if (_pSaeIns->pParentSaeCfg && \ - ((_pSaeIns->state == SAE_COMMITTED) || \ - (_pSaeIns->state == SAE_CONFIRMED))) \ - _pSaeIns->pParentSaeCfg->open--; \ - _pSaeIns->state = SAE_ACCEPTED; \ - } - -typedef enum { - SAE_NOTHING, - SAE_COMMITTED, - SAE_CONFIRMED, - SAE_ACCEPTED -} SAE_STATE_TYPE, - *PSAE_STATE_TYPE; - -struct pwd_id_list { - DL_LIST list; - UCHAR pwd[LEN_PSK + 1]; - UCHAR pwd_id[SAE_MAX_PWD_ID + 1]; -}; - -typedef struct __SAE_GROUP_OP SAE_GROUP_OP; - -typedef struct __SAE_INSTANCE SAE_INSTANCE; - -typedef struct __SAE_CFG SAE_CFG; - -struct __SAE_GROUP_OP { - VOID (*sae_group_init)(IN SAE_INSTANCE *pSaeIns, IN INT32 group); - VOID (*sae_group_deinit)(IN SAE_INSTANCE *pSaeIns); - VOID(*sae_cn_confirm) - (IN SAE_INSTANCE *pSaeIns, IN UCHAR is_send, OUT UCHAR *confirm); - USHORT(*sae_parse_commit_element) - (IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, IN UCHAR *end); - UCHAR(*sae_derive_commit_element) - (IN SAE_INSTANCE *pSaeIns, IN SAE_BN *mask); - USHORT (*sae_derive_pwe)(IN SAE_INSTANCE *pSaeIns); - USHORT (*sae_derive_pwe_pt)(IN SAE_INSTANCE *pSaeIns); - UCHAR (*sae_derive_k)(IN SAE_INSTANCE *pSaeIns, OUT UCHAR *k); - USHORT (*sae_reflection_check)(IN SAE_INSTANCE *pSaeIns); -}; - -/* NdisGetSystemUpTime */ -typedef struct __SAE_TIME_INTERVAL { - ULONG derive_pwe_time; - ULONG parse_commit_scalar_time; - ULONG parse_commit_element_time; - ULONG derive_commit_scalar_time; - ULONG derive_commit_element_time; - ULONG derive_k_time; - ULONG derive_pmk_time; -} SAE_TIME_INTERVAL, *PSAE_TIME_INTERVAL; -struct sae_pt { - struct sae_pt *next; - USHORT group; - VOID *pt; -}; - -enum { - PWE_MIXED = 0, - PWE_LOOPING_ONLY, /* hunting-and-pecking only */ - PWE_HASH_ONLY, /* hash-to-element only */ - MAX_PWE_METHOD, -}; - -struct sae_capability { - UCHAR gen_pwe_method; /* 0: mixed, 1: hunting-and-pecking only, 2: hash-to-element only */ -#ifdef DOT11_SAE_PWD_ID_SUPPORT - UCHAR pwd_id_only; -#endif -}; - -struct __SAE_INSTANCE { - SAE_STATE_TYPE state; - USHORT send_confirm; - USHORT last_peer_sc; - UCHAR pmk[LEN_PMK]; - SAE_BN *peer_commit_scalar; - USHORT group; - INT8 sync; - UINT8 support_group_idx; - UCHAR kck[MAX_SAE_KCK_LEN]; - UCHAR kck_len; - SAE_BN *own_commit_scalar; - VOID *own_commit_element; - VOID *peer_commit_element; - VOID *pwe; - SAE_BN *sae_rand; - UINT32 prime_len; - UINT32 order_len; - VOID *group_info; - VOID *group_info_bi; - SAE_BN *prime; - SAE_BN *order; - UCHAR *anti_clogging_token; - UINT32 anti_clogging_token_len; - USHORT peer_send_confirm; - UCHAR need_recalculate_key; - struct pwd_id_list *pwd_id_ptr; - UCHAR is_pwd_id_only; - /* peer_pwd_id is temp pointer only for BadId case, - * it is not expected to use this for successful case due to this pointer is pointed to packet buffer which might be freed */ - UCHAR *peer_pwd_id; - UINT32 peer_pwd_id_len; - const SAE_GROUP_OP *group_op; - SAE_TIME_INTERVAL sae_cost_time; - - VOID *pt; - UCHAR peer_rejected_group[12]; - UINT32 peer_rejected_group_len; - /************************************************/ - /* if the parameter is assigned before sae_group_allowed*/ - /* the parameter ahead of "valid" will be clear **********/ - /************************************************/ - UCHAR valid; - UCHAR removable; - RALINK_TIMER_STRUCT sae_retry_timer; - /* Each instance of the protocol is identified by a tuple consisting of the local MAC address and the peer MAC address */ - UCHAR own_mac[MAC_ADDR_LEN]; - UCHAR peer_mac[MAC_ADDR_LEN]; - UCHAR bssid[MAC_ADDR_LEN]; - UCHAR *psk; - struct pwd_id_list *pwd_id_list_head; - SAE_INSTANCE *same_mac_ins; - SAE_CFG *pParentSaeCfg; - UINT16 last_rcv_auth_seq; - UCHAR h2e_connect; - UINT32 rejected_group; /* bitwise */ -}; - -struct __SAE_CFG { - SAE_INSTANCE sae_ins[MAX_LEN_OF_MAC_TABLE]; - UCHAR support_group[MAX_SIZE_OF_ALLOWED_GROUP]; - UINT32 open; - UINT32 total_ins; - ULONG last_token_key_time; - UCHAR token_key[SAE_TOKEN_KEY_LEN]; - UINT32 sae_anti_clogging_threshold; - UCHAR k_iteration_var; - ULONG dot11RSNASAERetransPeriod; - struct _RTMP_ADAPTER *pAd; - NDIS_SPIN_LOCK sae_cfg_lock; -}; - -typedef struct __BIG_INTEGER_EC_POINT { - SAE_BN *x; - SAE_BN *y; - SAE_BN *z; - UCHAR z_is_one; -} BIG_INTEGER_EC_POINT, *PBIG_INTEGER_EC_POINT; - -/* - ===================================== - group related - ===================================== -*/ - -/* - ===================================== - FFC group related - ===================================== -*/ -/* RFC 3526, 4. Group 15 - 3072 Bit MODP - * Generator: 2 - * Prime: 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 } - */ -static const UCHAR dh_group15_generator[1] = { 0x02 }; -static const UCHAR dh_group15_prime[384] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, - 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, - 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, - 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, - 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, - 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, - 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, - 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, - 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, - 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, - 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, - 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, - 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, - 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, - 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, - 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, - 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, - 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, - 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C, - 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, - 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D, - 0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, - 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57, - 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, - 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0, - 0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, - 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73, - 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, - 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0, - 0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, - 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20, - 0xA9, 0x3A, 0xD2, 0xCA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; -static const UCHAR dh_group15_order[384] = { - 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x87, 0xED, 0x51, - 0x10, 0xB4, 0x61, 0x1A, 0x62, 0x63, 0x31, 0x45, 0xC0, 0x6E, 0x0E, 0x68, - 0x94, 0x81, 0x27, 0x04, 0x45, 0x33, 0xE6, 0x3A, 0x01, 0x05, 0xDF, 0x53, - 0x1D, 0x89, 0xCD, 0x91, 0x28, 0xA5, 0x04, 0x3C, 0xC7, 0x1A, 0x02, 0x6E, - 0xF7, 0xCA, 0x8C, 0xD9, 0xE6, 0x9D, 0x21, 0x8D, 0x98, 0x15, 0x85, 0x36, - 0xF9, 0x2F, 0x8A, 0x1B, 0xA7, 0xF0, 0x9A, 0xB6, 0xB6, 0xA8, 0xE1, 0x22, - 0xF2, 0x42, 0xDA, 0xBB, 0x31, 0x2F, 0x3F, 0x63, 0x7A, 0x26, 0x21, 0x74, - 0xD3, 0x1B, 0xF6, 0xB5, 0x85, 0xFF, 0xAE, 0x5B, 0x7A, 0x03, 0x5B, 0xF6, - 0xF7, 0x1C, 0x35, 0xFD, 0xAD, 0x44, 0xCF, 0xD2, 0xD7, 0x4F, 0x92, 0x08, - 0xBE, 0x25, 0x8F, 0xF3, 0x24, 0x94, 0x33, 0x28, 0xF6, 0x72, 0x2D, 0x9E, - 0xE1, 0x00, 0x3E, 0x5C, 0x50, 0xB1, 0xDF, 0x82, 0xCC, 0x6D, 0x24, 0x1B, - 0x0E, 0x2A, 0xE9, 0xCD, 0x34, 0x8B, 0x1F, 0xD4, 0x7E, 0x92, 0x67, 0xAF, - 0xC1, 0xB2, 0xAE, 0x91, 0xEE, 0x51, 0xD6, 0xCB, 0x0E, 0x31, 0x79, 0xAB, - 0x10, 0x42, 0xA9, 0x5D, 0xCF, 0x6A, 0x94, 0x83, 0xB8, 0x4B, 0x4B, 0x36, - 0xB3, 0x86, 0x1A, 0xA7, 0x25, 0x5E, 0x4C, 0x02, 0x78, 0xBA, 0x36, 0x04, - 0x65, 0x0C, 0x10, 0xBE, 0x19, 0x48, 0x2F, 0x23, 0x17, 0x1B, 0x67, 0x1D, - 0xF1, 0xCF, 0x3B, 0x96, 0x0C, 0x07, 0x43, 0x01, 0xCD, 0x93, 0xC1, 0xD1, - 0x76, 0x03, 0xD1, 0x47, 0xDA, 0xE2, 0xAE, 0xF8, 0x37, 0xA6, 0x29, 0x64, - 0xEF, 0x15, 0xE5, 0xFB, 0x4A, 0xAC, 0x0B, 0x8C, 0x1C, 0xCA, 0xA4, 0xBE, - 0x75, 0x4A, 0xB5, 0x72, 0x8A, 0xE9, 0x13, 0x0C, 0x4C, 0x7D, 0x02, 0x88, - 0x0A, 0xB9, 0x47, 0x2D, 0x45, 0x55, 0x62, 0x16, 0xD6, 0x99, 0x8B, 0x86, - 0x82, 0x28, 0x3D, 0x19, 0xD4, 0x2A, 0x90, 0xD5, 0xEF, 0x8E, 0x5D, 0x32, - 0x76, 0x7D, 0xC2, 0x82, 0x2C, 0x6D, 0xF7, 0x85, 0x45, 0x75, 0x38, 0xAB, - 0xAE, 0x83, 0x06, 0x3E, 0xD9, 0xCB, 0x87, 0xC2, 0xD3, 0x70, 0xF2, 0x63, - 0xD5, 0xFA, 0xD7, 0x46, 0x6D, 0x84, 0x99, 0xEB, 0x8F, 0x46, 0x4A, 0x70, - 0x25, 0x12, 0xB0, 0xCE, 0xE7, 0x71, 0xE9, 0x13, 0x0D, 0x69, 0x77, 0x35, - 0xF8, 0x97, 0xFD, 0x03, 0x6C, 0xC5, 0x04, 0x32, 0x6C, 0x3B, 0x01, 0x39, - 0x9F, 0x64, 0x35, 0x32, 0x29, 0x0F, 0x95, 0x8C, 0x0B, 0xBD, 0x90, 0x06, - 0x5D, 0xF0, 0x8B, 0xAB, 0xBD, 0x30, 0xAE, 0xB6, 0x3B, 0x84, 0xC4, 0x60, - 0x5D, 0x6C, 0xA3, 0x71, 0x04, 0x71, 0x27, 0xD0, 0x3A, 0x72, 0xD5, 0x98, - 0xA1, 0xED, 0xAD, 0xFE, 0x70, 0x7E, 0x88, 0x47, 0x25, 0xC1, 0x68, 0x90, - 0x54, 0x9D, 0x69, 0x65, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; -typedef struct __DH_GROUP_INFO { - INT32 group_id; - const UCHAR *generator; - UINT32 generator_len; - const UCHAR *prime; - UINT32 prime_len; - const UCHAR *order; - UINT32 order_len; - UCHAR safe_prime; -} DH_GROUP_INFO, *PDH_GROUP_INFO; - -typedef struct __DH_GROUP_INFO_BI { - INT32 group_id; - SAE_BN *generator; - SAE_BN *prime; - SAE_BN *order; - UCHAR safe_prime; - UCHAR is_init; -} DH_GROUP_INFO_BI, *PDH_GROUP_INFO_BI; - -#define DH_GROUP_NUM (sizeof(dh_groups) / sizeof(DH_GROUP_INFO)) - -#define DH_GROUP(id, safe) \ - { \ - id, dh_group##id##_generator, \ - sizeof(dh_group##id##_generator), \ - dh_group##id##_prime, sizeof(dh_group##id##_prime), \ - dh_group##id##_order, sizeof(dh_group##id##_order), \ - safe \ - } - -#define DH_GROUP_BI(id, safe) \ - { \ - .group_id = id, .safe_prime = safe, .is_init = FALSE \ - } - -/* - ===================================== - ECC group related - ===================================== -*/ - -/* - * RFC 5114, 2.6. - * Group 19 - 256-bit random ECP group - */ -static const UCHAR ec_group19_prime[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; -static const UCHAR ec_group19_order[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, - 0x9E, 0x84, 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51 -}; -static const UCHAR ec_group19_a[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC - -}; -static const UCHAR ec_group19_b[] = { 0x5A, 0xC6, 0x35, 0xD8, 0xAA, 0x3A, 0x93, - 0xE7, 0xB3, 0xEB, 0xBD, 0x55, 0x76, 0x98, - 0x86, 0xBC, 0x65, 0x1D, 0x06, 0xB0, 0xCC, - 0x53, 0xB0, 0xF6, 0x3B, 0xCE, 0x3C, 0x3E, - 0x27, 0xD2, 0x60, 0x4B }; - -static const UCHAR ec_group19_gx[] = { - 0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, - 0xE5, 0x63, 0xA4, 0x40, 0xF2, 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, - 0x33, 0xA0, 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96 - -}; -static const UCHAR ec_group19_gy[] = { 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, - 0x9b, 0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0x0f, - 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, - 0x31, 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, - 0x37, 0xbf, 0x51, 0xf5 }; - -static const UCHAR ec_group19_z[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5 - -}; - -#define EC_GROUP19_BITS_OF_R 257 - -static const UCHAR ec_group19_X[] = { - 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -}; - -static const UCHAR ec_group19_R[] = { - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static const UCHAR ec_group19_PInverse[] = { - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -}; - -/* - * RFC 5114, 2.7. - * Group 20 - 384-bit random ECP group - */ -static const UCHAR ec_group20_prime[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF -}; -static const UCHAR ec_group20_order[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37, 0x2D, 0xDF, 0x58, 0x1A, 0x0D, 0xB2, - 0x48, 0xB0, 0xA7, 0x7A, 0xEC, 0xEC, 0x19, 0x6A, 0xCC, 0xC5, 0x29, 0x73 - -}; -static const UCHAR ec_group20_a[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, -}; -static const UCHAR ec_group20_b[] = { - 0xB3, 0x31, 0x2F, 0xA7, 0xE2, 0x3E, 0xE7, 0xE4, 0x98, 0x8E, 0x05, 0x6B, - 0xE3, 0xF8, 0x2D, 0x19, 0x18, 0x1D, 0x9C, 0x6E, 0xFE, 0x81, 0x41, 0x12, - 0x03, 0x14, 0x08, 0x8F, 0x50, 0x13, 0x87, 0x5A, 0xC6, 0x56, 0x39, 0x8D, - 0x8A, 0x2E, 0xD1, 0x9D, 0x2A, 0x85, 0xC8, 0xED, 0xD3, 0xEC, 0x2A, 0xEF -}; - -static const UCHAR ec_group20_gx[] = { - 0xAA, 0x87, 0xCA, 0x22, 0xBE, 0x8B, 0x05, 0x37, 0x8E, 0xB1, 0xC7, 0x1E, - 0xF3, 0x20, 0xAD, 0x74, 0x6E, 0x1D, 0x3B, 0x62, 0x8B, 0xA7, 0x9B, 0x98, - 0x59, 0xF7, 0x41, 0xE0, 0x82, 0x54, 0x2A, 0x38, 0x55, 0x02, 0xF2, 0x5D, - 0xBF, 0x55, 0x29, 0x6C, 0x3A, 0x54, 0x5E, 0x38, 0x72, 0x76, 0x0A, 0xB7 -}; - -static const UCHAR ec_group20_gy[] = { - 0x36, 0x17, 0xde, 0x4a, 0x96, 0x26, 0x2c, 0x6f, 0x5d, 0x9e, 0x98, 0xbf, - 0x92, 0x92, 0xdc, 0x29, 0xf8, 0xf4, 0x1d, 0xbd, 0x28, 0x9a, 0x14, 0x7c, - 0xe9, 0xda, 0x31, 0x13, 0xb5, 0xf0, 0xb8, 0xc0, 0x0a, 0x60, 0xb1, 0xce, - 0x1d, 0x7e, 0x81, 0x9d, 0x7a, 0x43, 0x1d, 0x7c, 0x90, 0xea, 0x0e, 0x5f -}; - -static const UCHAR ec_group20_z[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF3, -}; - -#define EC_GROUP20_BITS_OF_R 385 - -static const UCHAR ec_group20_X[] = { - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, -}; - -static const UCHAR ec_group20_R[] = { - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static const UCHAR ec_group20_PInverse[] = { - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, -}; - -/* - * RFC 5114, 2.8. - * Group 21 - 521-bit random ECP group - */ -static const UCHAR ec_group21_prime[] = { - 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; -static const UCHAR ec_group21_order[] = { - 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, - 0x51, 0x86, 0x87, 0x83, 0xBF, 0x2F, 0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, - 0xF7, 0x09, 0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C, 0x47, 0xAE, - 0xBB, 0x6F, 0xB7, 0x1E, 0x91, 0x38, 0x64, 0x09 -}; -static const UCHAR ec_group21_a[] = { - 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC -}; -static const UCHAR ec_group21_b[] = { - 0x00, 0x00, 0x00, 0x51, 0x95, 0x3E, 0xB9, 0x61, 0x8E, 0x1C, 0x9A, 0x1F, - 0x92, 0x9A, 0x21, 0xA0, 0xB6, 0x85, 0x40, 0xEE, 0xA2, 0xDA, 0x72, 0x5B, - 0x99, 0xB3, 0x15, 0xF3, 0xB8, 0xB4, 0x89, 0x91, 0x8E, 0xF1, 0x09, 0xE1, - 0x56, 0x19, 0x39, 0x51, 0xEC, 0x7E, 0x93, 0x7B, 0x16, 0x52, 0xC0, 0xBD, - 0x3B, 0xB1, 0xBF, 0x07, 0x35, 0x73, 0xDF, 0x88, 0x3D, 0x2C, 0x34, 0xF1, - 0xEF, 0x45, 0x1F, 0xD4, 0x6B, 0x50, 0x3F, 0x00 -}; - -static const UCHAR ec_group21_gx[] = { - 0x00, 0xC6, 0x85, 0x8E, 0x06, 0xB7, 0x04, 0x04, 0xE9, 0xCD, 0x9E, - 0x3E, 0xCB, 0x66, 0x23, 0x95, 0xB4, 0x42, 0x9C, 0x64, 0x81, 0x39, - 0x05, 0x3F, 0xB5, 0x21, 0xF8, 0x28, 0xAF, 0x60, 0x6B, 0x4D, 0x3D, - 0xBA, 0xA1, 0x4B, 0x5E, 0x77, 0xEF, 0xE7, 0x59, 0x28, 0xFE, 0x1D, - 0xC1, 0x27, 0xA2, 0xFF, 0xA8, 0xDE, 0x33, 0x48, 0xB3, 0xC1, 0x85, - 0x6A, 0x42, 0x9B, 0xF9, 0x7E, 0x7E, 0x31, 0xC2, 0xE5, 0xBD, 0x66 -}; - -static const UCHAR ec_group21_gy[] = { - 0x01, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, 0xc0, 0x04, 0x5c, - 0x8a, 0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9, 0x98, 0xf5, 0x44, 0x49, - 0x57, 0x9b, 0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17, 0x27, 0x3e, 0x66, - 0x2c, 0x97, 0xee, 0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40, 0xc5, 0x50, - 0xb9, 0x01, 0x3f, 0xad, 0x07, 0x61, 0x35, 0x3c, 0x70, 0x86, 0xa2, - 0x72, 0xc2, 0x40, 0x88, 0xbe, 0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50 -}; - -static const UCHAR ec_group21_z[] = { - 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB -}; - -#define EC_GROUP21_BITS_OF_R 522 - -static const UCHAR ec_group21_X[] = { - 0x00, - 0x00, - 0x00, - 0x01, -}; - -static const UCHAR ec_group21_R[] = { - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static const UCHAR ec_group21_PInverse[] = { - 0x00, - 0x00, - 0x00, - 0x01, -}; - -#define EC_GROUP(id, bits_of_R) \ - { \ - id, ec_group##id##_prime, sizeof(ec_group##id##_prime), \ - ec_group##id##_order, sizeof(ec_group##id##_order), \ - ec_group##id##_a, sizeof(ec_group##id##_a), \ - ec_group##id##_b, sizeof(ec_group##id##_b), \ - ec_group##id##_z, sizeof(ec_group##id##_z), \ - ec_group##id##_X, sizeof(ec_group##id##_X), \ - ec_group##id##_R, sizeof(ec_group##id##_R), \ - ec_group##id##_PInverse, \ - sizeof(ec_group##id##_PInverse), bits_of_R \ - } - -#define EC_GROUP_NUM (sizeof(ec_groups) / sizeof(EC_GROUP_INFO)) - -#define EC_GROUP_BI(id) \ - { \ - .group_id = id, .is_init = FALSE, .mont = NULL, \ - .is_minus_3 = FALSE \ - } - -#endif -#endif /* SAE_CMM_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sec.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sec.h deleted file mode 100644 index 295bc68da5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sec.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - sec.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __SEC_H__ -#define __SEC_H__ - -#include "security/sec_cmm.h" -#include "security/crypt_md5.h" -#include "security/crypt_sha2.h" -#include "security/crypt_hmac.h" -#include "security/crypt_aes.h" -#include "security/crypt_arc4.h" -#include "security/wpa.h" - -#ifdef DOT11W_PMF_SUPPORT -#include "security/pmf.h" -#endif /* DOT11W_PMF_SUPPORT */ - -#ifdef DOT11_SAE_SUPPORT -#include "security/sae.h" -#include "security/sae_cmm.h" -#include "security/owe_cmm.h" -#endif /* DOT11_SAE_SUPPORT */ - -#if defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT) -#include "security/ecc.h" -#endif -/*======================================== - The prototype is defined in cmm_sec.c - ========================================*/ -VOID SetWdevAuthMode(IN struct _SECURITY_CONFIG *pSecConfig, - IN RTMP_STRING *arg); - -VOID SetWdevEncrypMode(IN struct _SECURITY_CONFIG *pSecConfig, - IN RTMP_STRING *arg); - -INT Set_SecAuthMode_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_SecEncrypType_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_SecDefaultKeyID_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_SecWPAPSK_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_SecWEPKey_Proc(IN PRTMP_ADAPTER pAd, IN CHAR KeyId, - IN RTMP_STRING *arg); - -INT Set_SecKey1_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_SecKey2_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_SecKey3_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -INT Set_SecKey4_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); - -UINT8 SecHWCipherSuitMapping(IN UINT32 encryMode); - -INT ParseWebKey(IN struct _SECURITY_CONFIG *pSecConfig, IN RTMP_STRING *buffer, - IN INT KeyIdx, IN INT Keylength); - -#ifdef DOT1X_SUPPORT -INT SetWdevOwnIPAddr(IN struct _SECURITY_CONFIG *pSecConfig, - IN RTMP_STRING *arg); - -VOID ReadRadiusParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer); - -#ifdef CONFIG_AP_SUPPORT -VOID Dot1xIoctlQueryRadiusConf(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID Dot1xIoctlRadiusData(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID Dot1xIoctlAddWPAKey(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq); - -VOID Dot1xIoctlStaticWepCopy(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq); -#endif /* CONFIG_AP_SUPPORT */ -#endif /* DOT1X_SUPPORT */ - -#ifdef APCLI_SUPPORT -VOID ReadApcliSecParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer); -#endif /* APCLI_SUPPORT */ - -VOID ReadSecurityParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer); - -#ifdef DOT11_SAE_PWD_ID_SUPPORT -VOID sae_pwd_id_deinit(IN PRTMP_ADAPTER pAd); -#endif - -VOID fill_wtbl_key_info_struc(IN struct _ASIC_SEC_INFO *pInfo, - OUT CMD_WTBL_SECURITY_KEY_T *rWtblSecurityKey); - -VOID store_pmkid_cache_in_sec_config(IN RTMP_ADAPTER *pAd, - IN MAC_TABLE_ENTRY *pEntry, - IN INT32 cache_idx); - -VOID process_pmkid(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - MAC_TABLE_ENTRY *entry, INT CacheIdx); - -UCHAR is_pmkid_cache_in_sec_config(IN struct _SECURITY_CONFIG *pSecConfig); - -INT build_rsnxe_ie(IN struct _SECURITY_CONFIG *sec_cfg, IN UCHAR *buf); - -UINT parse_rsnxe_ie(IN struct _SECURITY_CONFIG *sec_cfg, IN UCHAR *rsnxe_ie, - IN UCHAR rsnxe_ie_len, IN UCHAR need_copy); - -INT set_wpa3_test(IN RTMP_ADAPTER *ad, RTMP_STRING *arg); - -#ifdef CONFIG_AP_SUPPORT -/* ======================================== - The prototype is defined in ap/ap_sec.c - ========================================*/ -INT APSecInit(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -INT ap_sec_deinit(IN struct wifi_dev *wdev); - -INT APKeyTableInit(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN STA_REC_CTRL_T *sta_rec); - -DECLARE_TIMER_FUNCTION(GroupRekeyExec); -VOID GroupRekeyExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID WPAGroupRekeyByWdev(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -VOID APStartRekeyTimer(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -VOID APStopRekeyTimer(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -VOID APReleaseRekeyTimer(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev); - -INT Show_APSecurityInfo_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -VOID CheckBMCPortSecured(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN BOOLEAN isConnect); - -#endif /* CONFIG_AP_SUPPORT */ - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sec_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sec_cmm.h deleted file mode 100644 index 380545fb2f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/sec_cmm.h +++ /dev/null @@ -1,545 +0,0 @@ -#ifndef SEC_CMM_H -#define SEC_CMM_H - -#include "rtmp_type.h" -#include "security/dot11i_wpa.h" - -#ifdef DOT11W_PMF_SUPPORT -#include "security/pmf_cmm.h" -#endif /* DOT11W_PMF_SUPPORT */ - -#include "security/owe_cmm.h" - -#ifdef DOT11_SAE_SUPPORT -#include "security/sae_cmm.h" -#endif /* DOT11_SAE_SUPPORT */ - -/* Key Related definitions */ -#define SEC_SHARE_KEY_NUM 4 -#define SEC_KEY_NUM SEC_SHARE_KEY_NUM -#define SEC_RSNIE_NUM 2 /* Support IE, 1:WPA1_IE or WAPI_IE, 2: WPA2_IE */ - -typedef enum _SEC_RSNIE_TYPE { - SEC_RSNIE_NONE, - SEC_RSNIE_WPA1_IE, - SEC_RSNIE_WPA2_IE, - SEC_RSNIE_MAX /* Not a real mode, defined as upper bound */ -} SEC_RSNIE_TYPE, - *PSEC_RSNIE_TYPE; - -/* 802.11 authentication and key management */ -typedef enum _SEC_AKM_MODE { - SEC_AKM_OPEN, - SEC_AKM_SHARED, - SEC_AKM_AUTOSWITCH, - SEC_AKM_WPA1, /* Enterprise security over 802.1x */ - SEC_AKM_WPA1PSK, - SEC_AKM_WPANone, /* For Win IBSS, directly PTK, no handshark */ - SEC_AKM_WPA2, /* Enterprise security over 802.1x */ - SEC_AKM_WPA2PSK, - SEC_AKM_FT_WPA2, - SEC_AKM_FT_WPA2PSK, - SEC_AKM_WPA2_SHA256, - SEC_AKM_WPA2PSK_SHA256, - SEC_AKM_TDLS, - SEC_AKM_SAE_SHA256, - SEC_AKM_FT_SAE_SHA256, - SEC_AKM_SUITEB_SHA256, - SEC_AKM_SUITEB_SHA384, - SEC_AKM_FT_WPA2_SHA384, - SEC_AKM_WAICERT, /* WAI certificate authentication */ - SEC_AKM_WAIPSK, /* WAI pre-shared key */ - SEC_AKM_OWE, - SEC_AKM_FILS_SHA256, - SEC_AKM_FILS_SHA384, - SEC_AKM_WPA3, /* WPA3(ent) = WPA2(ent) + PMF MFPR=1 => WPA3 code flow is same as WPA2, the usage of SEC_AKM_WPA3 is to force pmf on */ - SEC_AKM_DPP, - SEC_AKM_MAX /* Not a real mode, defined as upper bound */ -} SEC_AKM_MODE, - *PSEC_AKM_MODE; - -enum SEC_KEY_DERI_ALG { - SEC_KEY_DERI_SHA1 = 0, - SEC_KEY_DERI_SHA256, - SEC_KEY_DERI_SHA384, - SEC_KEY_DERI_SHA512 -}; - -enum RSN_FIELD { - RSN_FIELD_NONE = 0, - RSN_FIELD_GROUP_CIPHER, - RSN_FIELD_PAIRWISE_CIPHER, - RSN_FIELD_AKM, - RSN_FIELD_RSN_CAP, - RSN_FIELD_PMKID, - RSN_FIELD_GROUP_MGMT_CIPHER, - RSN_FIELD_EXTENSIBLE_ELE -}; - -#define GET_SEC_AKM(_SecConfig) ((_SecConfig)->AKMMap) -#define CLEAR_SEC_AKM(_AKMMap) (_AKMMap = 0x0) -#define SET_AKM_OPEN(_AKMMap) (_AKMMap |= (1 << SEC_AKM_OPEN)) -#define SET_AKM_SHARED(_AKMMap) (_AKMMap |= (1 << SEC_AKM_SHARED)) -#define SET_AKM_AUTOSWITCH(_AKMMap) (_AKMMap |= (1 << SEC_AKM_AUTOSWITCH)) -#define SET_AKM_WPA1(_AKMMap) (_AKMMap |= (1 << SEC_AKM_WPA1)) -#define SET_AKM_WPA1PSK(_AKMMap) (_AKMMap |= (1 << SEC_AKM_WPA1PSK)) -#define SET_AKM_WPANONE(_AKMMap) (_AKMMap |= (1 << SEC_AKM_WPANone)) -#define SET_AKM_WPA2(_AKMMap) (_AKMMap |= (1 << SEC_AKM_WPA2)) -#define SET_AKM_WPA2PSK(_AKMMap) (_AKMMap |= (1 << SEC_AKM_WPA2PSK)) -#define SET_AKM_FT_WPA2(_AKMMap) (_AKMMap |= (1 << SEC_AKM_FT_WPA2)) -#define SET_AKM_FT_WPA2PSK(_AKMMap) (_AKMMap |= (1 << SEC_AKM_FT_WPA2PSK)) -#define SET_AKM_WPA2_SHA256(_AKMMap) (_AKMMap |= (1 << SEC_AKM_WPA2_SHA256)) -#define SET_AKM_WPA2PSK_SHA256(_AKMMap) \ - (_AKMMap |= (1 << SEC_AKM_WPA2PSK_SHA256)) -#define SET_AKM_TDLS(_AKMMap) (_AKMMap |= (1 << SEC_AKM_TDLS)) -#define SET_AKM_SAE_SHA256(_AKMMap) (_AKMMap |= (1 << SEC_AKM_SAE_SHA256)) -#define SET_AKM_FT_SAE_SHA256(_AKMMap) (_AKMMap |= (1 << SEC_AKM_FT_SAE_SHA256)) -#define SET_AKM_SUITEB_SHA256(_AKMMap) (_AKMMap |= (1 << SEC_AKM_SUITEB_SHA256)) -#define SET_AKM_SUITEB_SHA384(_AKMMap) (_AKMMap |= (1 << SEC_AKM_SUITEB_SHA384)) -#define SET_AKM_FT_WPA2_SHA384(_AKMMap) \ - (_AKMMap |= (1 << SEC_AKM_FT_WPA2_SHA384)) -#define SET_AKM_OWE(_AKMMap) (_AKMMap |= (1 << SEC_AKM_OWE)) -#ifdef OCE_FILS_SUPPORT -#define SET_AKM_FILS_SHA256(_AKMMap) (_AKMMap |= (1 << SEC_AKM_FILS_SHA256)) -#define SET_AKM_FILS_SHA384(_AKMMap) (_AKMMap |= (1 << SEC_AKM_FILS_SHA384)) -#endif /* OCE_FILS_SUPPORT */ -#define SET_AKM_WPA3(_AKMMap) (_AKMMap |= (1 << SEC_AKM_WPA3)) -#define SET_AKM_DPP(_AKMMap) (_AKMMap |= (1 << SEC_AKM_DPP)) - -#define IS_AKM_OPEN(_AKMMap) ((_AKMMap & (1 << SEC_AKM_OPEN)) > 0) -#define IS_AKM_SHARED(_AKMMap) ((_AKMMap & (1 << SEC_AKM_SHARED)) > 0) -#define IS_AKM_AUTOSWITCH(_AKMMap) ((_AKMMap & (1 << SEC_AKM_AUTOSWITCH)) > 0) -#define IS_AKM_WPA1(_AKMMap) ((_AKMMap & (1 << SEC_AKM_WPA1)) > 0) -#define IS_AKM_WPA1PSK(_AKMMap) ((_AKMMap & (1 << SEC_AKM_WPA1PSK)) > 0) -#define IS_AKM_WPANONE(_AKMMap) ((_AKMMap & (1 << SEC_AKM_WPANone)) > 0) -#define IS_AKM_WPA2(_AKMMap) ((_AKMMap & (1 << SEC_AKM_WPA2)) > 0) -#define IS_AKM_WPA2PSK(_AKMMap) ((_AKMMap & (1 << SEC_AKM_WPA2PSK)) > 0) -#define IS_AKM_FT_WPA2(_AKMMap) ((_AKMMap & (1 << SEC_AKM_FT_WPA2)) > 0) -#define IS_AKM_FT_WPA2PSK(_AKMMap) ((_AKMMap & (1 << SEC_AKM_FT_WPA2PSK)) > 0) -#define IS_AKM_WPA2_SHA256(_AKMMap) ((_AKMMap & (1 << SEC_AKM_WPA2_SHA256)) > 0) -#define IS_AKM_WPA2PSK_SHA256(_AKMMap) \ - ((_AKMMap & (1 << SEC_AKM_WPA2PSK_SHA256)) > 0) -#define IS_AKM_TDLS(_AKMMap) ((_AKMMap & (1 << SEC_AKM_TDLS)) > 0) -#define IS_AKM_SAE_SHA256(_AKMMap) ((_AKMMap & (1 << SEC_AKM_SAE_SHA256)) > 0) -#define IS_AKM_FT_SAE_SHA256(_AKMMap) \ - ((_AKMMap & (1 << SEC_AKM_FT_SAE_SHA256)) > 0) -#define IS_AKM_SUITEB_SHA256(_AKMMap) \ - ((_AKMMap & (1 << SEC_AKM_SUITEB_SHA256)) > 0) -#define IS_AKM_SUITEB_SHA384(_AKMMap) \ - ((_AKMMap & (1 << SEC_AKM_SUITEB_SHA384)) > 0) -#define IS_AKM_FT_WPA2_SHA384(_AKMMap) \ - ((_AKMMap & (1 << SEC_AKM_FT_WPA2_SHA384)) > 0) -#define IS_AKM_OWE(_AKMMap) ((_AKMMap & (1 << SEC_AKM_OWE)) > 0) -#define IS_AKM_WPA3(_AKMMap) ((_AKMMap & (1 << SEC_AKM_WPA3)) > 0) - -#define IS_AKM_DPP(_AKMMap) ((_AKMMap & (1 << SEC_AKM_DPP)) > 0) - -#if defined(DOT11_SUITEB_SUPPORT) || defined(HOSTAPD_SUITEB_SUPPORT) -#define IS_AKM_WPA3_192BIT(_AKMMap) (IS_AKM_SUITEB_SHA384(_AKMMap)) -#define SET_AKM_WPA3_192BIT(_AKMMap) SET_AKM_SUITEB_SHA384(_AKMMap) -#else -#define IS_AKM_WPA3_192BIT(_AKMMap) (FALSE) -#define SET_AKM_WPA3_192BIT(_AKMMap) -#endif - -#ifdef OCE_FILS_SUPPORT -#define IS_AKM_FILS_SHA256(_AKMMap) ((_AKMMap & (1 << SEC_AKM_FILS_SHA256)) > 0) -#define IS_AKM_FILS_SHA384(_AKMMap) ((_AKMMap & (1 << SEC_AKM_FILS_SHA384)) > 0) -#define IS_AKM_FILS(_AKMMap) \ - (IS_AKM_FILS_SHA256(_AKMMap) || IS_AKM_FILS_SHA384(_AKMMap)) - -#define IS_AKM_FILS_Entry(_Entry) \ - (IS_AKM_FILS_SHA256((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_FILS_SHA384((_Entry)->SecConfig.AKMMap)) - -#endif /* OCE_FILS_SUPPORT */ - -#if defined(DOT11_SAE_SUPPORT) || defined(HOSTAPD_SAE_SUPPORT) -#define IS_AKM_WPA3PSK(_AKMMap) (IS_AKM_SAE_SHA256(_AKMMap)) -#define SET_AKM_WPA3PSK(_AKMMap) SET_AKM_SAE_SHA256(_AKMMap) -#else -#define IS_AKM_WPA3PSK(_AKMMap) (FALSE) -#define SET_AKM_WPA3PSK(_AKMMap) -#endif -#ifdef APCLI_SAE_SUPPORT - -#define IS_AKM_WPA2PSK_ONLY(_AKMMap) (_AKMMap == (1 << SEC_AKM_WPA2PSK)) -#define IS_AKM_WPA3PSK_ONLY(_AKMMap) (_AKMMap == (1 << SEC_AKM_SAE_SHA256)) - -#endif - -#define IS_AKM_SAE(_AKMMap) \ - (IS_AKM_SAE_SHA256(_AKMMap) || IS_AKM_FT_SAE_SHA256(_AKMMap)) - -#define IS_AKM_PSK(_AKMMap) \ - (IS_AKM_WPA1PSK(_AKMMap) || IS_AKM_WPA2PSK(_AKMMap) || \ - IS_AKM_WPA3PSK(_AKMMap) || IS_AKM_DPP(_AKMMap) || \ - IS_AKM_OWE(_AKMMap)) - -#define IS_AKM_1X(_AKMMap) \ - (IS_AKM_WPA1(_AKMMap) || IS_AKM_WPA2(_AKMMap) || \ - IS_AKM_WPA3_192BIT(_AKMMap)) - -#define IS_AKM_WPA_CAPABILITY(_AKMMap) \ - (IS_AKM_WPA1(_AKMMap) || IS_AKM_WPA1PSK(_AKMMap) || \ - IS_AKM_WPANONE(_AKMMap) || IS_AKM_WPA2(_AKMMap) || \ - IS_AKM_WPA2PSK(_AKMMap) || IS_AKM_WPA2_SHA256(_AKMMap) || \ - IS_AKM_WPA2PSK_SHA256(_AKMMap) || IS_AKM_WPA3_192BIT(_AKMMap) || \ - IS_AKM_WPA3PSK(_AKMMap) || IS_AKM_DPP(_AKMMap) || \ - IS_AKM_OWE(_AKMMap)) - -#define IS_AKM_SHA256(_AKMMap) \ - (IS_AKM_FT_WPA2(_AKMMap) || IS_AKM_FT_WPA2PSK(_AKMMap) || \ - IS_AKM_WPA2PSK_SHA256(_AKMMap) || IS_AKM_WPA2_SHA256(_AKMMap) || \ - IS_AKM_SAE_SHA256(_AKMMap) || IS_AKM_FT_SAE_SHA256(_AKMMap) || \ - IS_AKM_SUITEB_SHA256(_AKMMap)) - -#define IS_AKM_SHA384(_AKMMap) \ - (IS_AKM_SUITEB_SHA384(_AKMMap) || IS_AKM_FT_WPA2_SHA384(_AKMMap)) - -typedef enum _SEC_CIPHER_MODE { - SEC_CIPHER_NONE, - SEC_CIPHER_WEP40, - SEC_CIPHER_WEP104, - SEC_CIPHER_WEP128, - SEC_CIPHER_TKIP, - SEC_CIPHER_CCMP128, - SEC_CIPHER_CCMP256, - SEC_CIPHER_GCMP128, - SEC_CIPHER_GCMP256, - SEC_CIPHER_BIP_CMAC128, - SEC_CIPHER_BIP_CMAC256, - SEC_CIPHER_BIP_GMAC128, - SEC_CIPHER_BIP_GMAC256, - SEC_CIPHER_WPI_SMS4, /* WPI SMS4 support */ - SEC_CIPHER_MAX /* Not a real mode, defined as upper bound */ -} SEC_CIPHER_MODE; - -#define CLEAR_PAIRWISE_CIPHER(_SecConfig) ((_SecConfig)->PairwiseCipher = 0x0) -#define CLEAR_GROUP_CIPHER(_SecConfig) ((_SecConfig)->GroupCipher = 0x0) -#define GET_PAIRWISE_CIPHER(_SecConfig) ((_SecConfig)->PairwiseCipher) -#define GET_GROUP_CIPHER(_SecConfig) ((_SecConfig)->GroupCipher) -#define CLEAR_CIPHER(_cipher) (_cipher = 0x0) -#define SET_CIPHER_NONE(_cipher) (_cipher |= (1 << SEC_CIPHER_NONE)) -#define SET_CIPHER_WEP40(_cipher) (_cipher |= (1 << SEC_CIPHER_WEP40)) -#define SET_CIPHER_WEP104(_cipher) (_cipher |= (1 << SEC_CIPHER_WEP104)) -#define SET_CIPHER_WEP128(_cipher) (_cipher |= (1 << SEC_CIPHER_WEP128)) -#define SET_CIPHER_WEP(_cipher) \ - (_cipher |= (1 << SEC_CIPHER_WEP40) | (1 << SEC_CIPHER_WEP104) | \ - (1 << SEC_CIPHER_WEP128)) -#define SET_CIPHER_TKIP(_cipher) (_cipher |= (1 << SEC_CIPHER_TKIP)) -#define SET_CIPHER_CCMP128(_cipher) (_cipher |= (1 << SEC_CIPHER_CCMP128)) -#define SET_CIPHER_CCMP256(_cipher) (_cipher |= (1 << SEC_CIPHER_CCMP256)) -#define SET_CIPHER_GCMP128(_cipher) (_cipher |= (1 << SEC_CIPHER_GCMP128)) -#define SET_CIPHER_GCMP256(_cipher) (_cipher |= (1 << SEC_CIPHER_GCMP256)) -#define SET_CIPHER_BIP_CMAC128(_cipher) \ - (_cipher = (1 << SEC_CIPHER_BIP_CMAC128)) -#define SET_CIPHER_BIP_CMAC256(_cipher) \ - (_cipher = (1 << SEC_CIPHER_BIP_CMAC256)) -#define SET_CIPHER_BIP_GMAC128(_cipher) \ - (_cipher = (1 << SEC_CIPHER_BIP_GMAC128)) -#define SET_CIPHER_BIP_GMAC256(_cipher) \ - (_cipher = (1 << SEC_CIPHER_BIP_GMAC256)) - -#define IS_CIPHER_NONE(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_NONE)) > 0) -#define IS_CIPHER_WEP40(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_WEP40)) > 0) -#define IS_CIPHER_WEP104(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_WEP104)) > 0) -#define IS_CIPHER_WEP128(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_WEP128)) > 0) -#define IS_CIPHER_WEP(_Cipher) \ - (((_Cipher) & ((1 << SEC_CIPHER_WEP40) | (1 << SEC_CIPHER_WEP104) | \ - (1 << SEC_CIPHER_WEP128))) > 0) -#define IS_CIPHER_TKIP(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_TKIP)) > 0) -#define IS_CIPHER_WEP_TKIP_ONLY(_Cipher) \ - ((IS_CIPHER_WEP(_Cipher) || IS_CIPHER_TKIP(_Cipher)) && \ - (_Cipher < (1 << SEC_CIPHER_CCMP128))) -#define IS_CIPHER_CCMP128(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_CCMP128)) > 0) -#define IS_CIPHER_CCMP256(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_CCMP256)) > 0) -#define IS_CIPHER_GCMP128(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_GCMP128)) > 0) -#define IS_CIPHER_GCMP256(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_GCMP256)) > 0) -#define IS_CIPHER_BIP_CMAC128(_Cipher) \ - (((_Cipher) & (1 << SEC_CIPHER_BIP_CMAC128)) > 0) -#define IS_CIPHER_BIP_CMAC256(_Cipher) \ - (((_Cipher) & (1 << SEC_CIPHER_BIP_CMAC256)) > 0) -#define IS_CIPHER_BIP_GMAC128(_Cipher) \ - (((_Cipher) & (1 << SEC_CIPHER_BIP_GMAC128)) > 0) -#define IS_CIPHER_BIP_GMAC256(_Cipher) \ - (((_Cipher) & (1 << SEC_CIPHER_BIP_GMAC256)) > 0) - -#define IS_AKM_OPEN_ONLY(_AKMMap) ((_AKMMap) == (1 << SEC_AKM_OPEN)) -#define IS_CIPHER_NONE_ONLY(_Cipher) ((_Cipher) == (1 << SEC_CIPHER_NONE)) -#define IS_SECURITY(_SecConfig) \ - ((!IS_AKM_OPEN_ONLY((_SecConfig)->AKMMap)) || \ - (!IS_CIPHER_NONE_ONLY((_SecConfig)->PairwiseCipher))) -#define IS_NO_SECURITY(_SecConfig) \ - (IS_AKM_OPEN((_SecConfig)->AKMMap) && \ - IS_CIPHER_NONE((_SecConfig)->PairwiseCipher)) -#define IS_SECURITY_OPEN_WEP(_SecConfig) \ - (IS_AKM_OPEN((_SecConfig)->AKMMap) && \ - IS_CIPHER_WEP((_SecConfig)->PairwiseCipher)) - -#define IS_SECURITY_WPA2PSK_AES(_SecConfig) \ - ((IS_AKM_WPA2((_SecConfig)->AKMMap) || \ - IS_AKM_WPA2PSK((_SecConfig)->AKMMap)) && \ - (IS_CIPHER_CCMP128((_SecConfig)->PairwiseCipher))) - -#ifdef DOT1X_SUPPORT -#define IS_IEEE8021X(_SecConfig) ((_SecConfig)->IEEE8021X == TRUE) -#endif - -/* Need to remove --START */ -#define IS_AKM_1X_Entry(_Entry) \ - (IS_AKM_WPA1((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA2((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA3_192BIT((_Entry)->SecConfig.AKMMap)) - -#ifdef DOT1X_SUPPORT -#define IS_IEEE8021X_Entry(_Entry) ((_Entry)->SecConfig.IEEE8021X == TRUE) -#endif - -#define IS_AKM_WPA_CAPABILITY_Entry(_Entry) \ - (IS_AKM_WPA1((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA1PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPANONE((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA2((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA2PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA2_SHA256((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA2PSK_SHA256((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA3_192BIT((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA3PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_DPP((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_OWE((_Entry)->SecConfig.AKMMap)) - -#define IS_AKM_PSK_Entry(_Entry) \ - (IS_AKM_WPA1PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA2PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA3PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_DPP((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_OWE((_Entry)->SecConfig.AKMMap)) - -#ifdef DOT11R_FT_SUPPORT -#undef IS_AKM_PSK_Entry -#define IS_AKM_PSK_Entry(_Entry) \ - (IS_AKM_WPA1PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA2PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_FT_WPA2PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_WPA3PSK((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_DPP((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_FT_SAE_SHA256((_Entry)->SecConfig.AKMMap) || \ - IS_AKM_OWE((_Entry)->SecConfig.AKMMap)) -#endif /* DOT11R_FT_SUPPORT */ - -#define IS_AKM_FT_WPAPSKWPA2PSK_Entry(_Entry) \ - (IS_AKM_WPA1PSK((_Entry)->SecConfig.AKMMap) && \ - IS_AKM_WPA2PSK((_Entry)->SecConfig.AKMMap)) - -#define IS_SECURITY_Entry(_Entry) (IS_SECURITY(&(_Entry)->SecConfig)) -#define IS_AKM_WPA1_Entry(_Entry) (IS_AKM_WPA1((_Entry)->SecConfig.AKMMap)) -#define IS_AKM_WPA1PSK_Entry(_Entry) \ - (IS_AKM_WPA1PSK((_Entry)->SecConfig.AKMMap)) -#define IS_AKM_WPA2_Entry(_Entry) (IS_AKM_WPA2((_Entry)->SecConfig.AKMMap)) -#define IS_AKM_WPA2PSK_Entry(_Entry) \ - (IS_AKM_WPA2PSK((_Entry)->SecConfig.AKMMap)) -#define IS_AKM_WPA3_192BIT_Entry(_Entry) \ - (IS_AKM_WPA3_192BIT((_Entry)->SecConfig.AKMMap)) -#define IS_AKM_WPA3PSK_Entry(_Entry) \ - (IS_AKM_WPA3PSK((_Entry)->SecConfig.AKMMap)) -#define IS_AKM_DPP_Entry(_Entry) (IS_AKM_DPP((_Entry)->SecConfig.AKMMap)) -#define IS_AKM_OWE_Entry(_Entry) (IS_AKM_OWE((_Entry)->SecConfig.AKMMap)) -#define IS_CIPHER_WEP_Entry(_Entry) \ - (IS_CIPHER_WEP((_Entry)->SecConfig.PairwiseCipher)) -#define IS_CIPHER_TKIP_Entry(_Entry) \ - (IS_CIPHER_TKIP((_Entry)->SecConfig.PairwiseCipher)) -#define IS_CIPHER_AES_Entry(_Entry) \ - (IS_CIPHER_CCMP128((_Entry)->SecConfig.PairwiseCipher)) - -#define IS_CIPHER_NONE_OR_WEP_Entry(_Entry) \ - (IS_NO_SECURITY(&(_Entry)->SecConfig) || \ - IS_CIPHER_WEP((_Entry)->SecConfig.PairwiseCipher)) - -#define IS_SECURITY_OPEN_NONE_Entry(_Entry) \ - (IS_NO_SECURITY(&(_Entry)->SecConfig)) - -#define IS_SECURITY_SHARED_WEP_Entry(_Entry) \ - (IS_AKM_SHARED((_Entry)->SecConfig.AKMMap) && \ - IS_CIPHER_WEP((_Entry)->SecConfig.PairwiseCipher)) -#define IS_SECURITY_AUTOSWITCH_Entry(_Entry) \ - (IS_AKM_AUTOSWITCH((_Entry)->SecConfig.AKMMap) && \ - IS_CIPHER_WEP((_Entry)->SecConfig.PairwiseCipher)) -#define IS_NO_SECURITY_Entry(_Entry) \ - (IS_AKM_OPEN((_Entry)->SecConfig.AKMMap) && \ - IS_CIPHER_NONE((_Entry)->SecConfig.PairwiseCipher)) - -#define SET_AKM_OPEN_Entry(_Entry) (SET_AKM_OPEN((_Entry)->SecConfig.AKMMap)) -#define SET_CIPHER_NONE_Entry(_Entry) \ - (SET_CIPHER_NONE((_Entry)->SecConfig.PairwiseCipher)) - -/* Need to remove --END */ - -typedef enum _SEC_GROUP_REKEY_METHOD { - SEC_GROUP_REKEY_DISABLE, - SEC_GROUP_REKEY_TIME, - SEC_GROUP_REKEY_PACKET, - SEC_GROUP_REKEY_MAX /* Not a real mode, defined as upper bound */ -} SEC_GROUP_REKEY_METHOD; - -#define DEFAULT_GROUP_REKEY_INTERVAL 3600 /* one hour */ -#define MAX_GROUP_REKEY_INTERVAL 0x3ffffff - -typedef struct _HANDSHAKE_PROFILE { - UCHAR AAddr[MAC_ADDR_LEN]; /* For nonce and key calculate */ - UCHAR SAddr[MAC_ADDR_LEN]; /* For nonce and key calculate */ - UCHAR ANonce[LEN_KEY_DESC_NONCE]; - UCHAR SNonce[LEN_KEY_DESC_NONCE]; - UCHAR GNonce[LEN_KEY_DESC_NONCE]; - UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY]; - UINT8 WpaState; - UINT8 GTKState; - UCHAR MsgType; /*Record 4 way/2 way status for message retry judgement */ - UCHAR RSC[6]; - RALINK_TIMER_STRUCT MsgRetryTimer; - UCHAR MsgRetryCounter; - BOOLEAN AllowInsPTK; -} HANDSHAKE_PROFILE, *PHANDSHAKE_PROFILE; - -typedef struct _SECURITY_CONFIG { - UINT32 AKMMap; - - /* WEP Key */ - SEC_KEY_INFO WepKey[SEC_KEY_NUM]; - - /* Pairwise Key */ - UINT32 PairwiseCipher; - UCHAR PairwiseKeyId; - UCHAR PSK[LEN_PSK + 1]; /* Add "\0" length */ - UCHAR PMK[LEN_MAX_PMK]; - UCHAR PTK[LEN_MAX_PTK]; /* 512 bits max, KCK(16)+KEK(16)+TK(32) */ - - /* Group Key */ - UINT32 GroupCipher; - UCHAR GroupKeyId; - UCHAR GMK[LEN_GMK]; - UCHAR GTK[LEN_MAX_GTK]; - /* Group Key control parameter */ - SEC_GROUP_REKEY_METHOD GroupReKeyMethod; - ULONG GroupReKeyInterval; /* time-based: seconds, packet-based: kilo-packets */ - ULONG GroupPacketCounter; - UCHAR GroupReKeyInstallCountDown; /*unit: second, Install key after 2 way completed or 1 seconds */ - - ULONG PMKCachePeriod; - - UINT8 key_deri_alg; - - /* WPA/WPA2 4way database */ - RALINK_TIMER_STRUCT StartFor4WayTimer; - RALINK_TIMER_STRUCT StartFor2WayTimer; - RALINK_TIMER_STRUCT GroupRekeyTimer; - HANDSHAKE_PROFILE Handshake; - - /* Dirty code for repeater */ - UINT STARec_Bssid; - -#ifdef DOT11W_PMF_SUPPORT - PMF_CFG PmfCfg; -#endif /* DOT11W_PMF_SUPPORT */ - -#if defined(CONFIG_HOTSPOT) && defined(CONFIG_AP_SUPPORT) - UCHAR HsUniGTK[LEN_MAX_GTK]; /* for storing HS DGAF uni GTK */ -#endif /* defined(CONFIG_HOTSPOT) && defined(CONFIG_AP_SUPPORT) */ - - /* 802.1x */ -#ifdef DOT1X_SUPPORT - UINT32 own_ip_addr; - UINT32 own_radius_port; - UINT32 retry_interval; - UINT32 session_timeout_interval; - UINT32 quiet_interval; - UCHAR EAPifname - [IFNAMSIZ]; /* indicate as the binding interface for EAP negotiation. */ - UCHAR EAPifname_len; - UCHAR PreAuthifname - [IFNAMSIZ]; /* indicate as the binding interface for WPA2 Pre-authentication. */ - UCHAR PreAuthifname_len; - BOOLEAN PreAuth; - UINT8 NasId[IFNAMSIZ]; - UINT8 NasIdLen; - UCHAR radius_srv_num; - RADIUS_SRV_INFO radius_srv_info[MAX_RADIUS_SRV_NUM]; -#ifdef RADIUS_ACCOUNTING_SUPPORT - UINT8 radius_acct_srv_num; - RADIUS_SRV_INFO radius_acct_srv_info[MAX_RADIUS_SRV_NUM]; - /* int radius_request_cui; */ - int radius_acct_authentic; - int acct_interim_interval; - int acct_enable; -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ -#ifdef RADIUS_MAC_ACL_SUPPORT - RT_802_11_RADIUS_ACL RadiusMacAuthCache; - UINT32 RadiusMacAuthCacheTimeout; -#endif /* RADIUS_MAC_ACL_SUPPORT */ -#endif /* DOT1X_SUPPORT */ - - /* pmk cahce */ - UCHAR *pmkid; - UCHAR *pmk_cache; - -#if defined(DOT1X_SUPPORT) || defined(WPA_SUPPLICANT_SUPPORT) - BOOLEAN IEEE8021X; /* Only indicate if we are running in dynamic WEP mode (WEP+802.1x) */ -#endif - BOOLEAN is_eapol_encrypted; -#ifdef DISABLE_HOSTAPD_BEACON - UINT8 RsnCap[2]; -#endif -#ifdef APCLI_OWE_SUPPORT - UCHAR last_tried_group; -#endif - /* IE for WPA1/WPA2/WAPI */ - SEC_RSNIE_TYPE RSNE_Type[SEC_RSNIE_NUM]; - UCHAR RSNE_EID[SEC_RSNIE_NUM][1]; - UCHAR RSNE_Len[SEC_RSNIE_NUM]; - UCHAR RSNE_Content[SEC_RSNIE_NUM][MAX_LEN_OF_RSNIE]; - UCHAR rsnxe_content[MAX_LEN_OF_RSNXEIE]; - UCHAR rsnxe_len; - - UCHAR LastGroupKeyId; - UCHAR LastGTK[LEN_MAX_GTK]; -#ifdef CONFIG_OWE_SUPPORT - OWE_INFO owe; -#endif /*CONFIG_OWE_SUPPORT*/ -#ifdef DOT11_SAE_SUPPORT -#ifdef DOT11_SAE_PWD_ID_SUPPORT - UCHAR pwd_id_only; - UCHAR pwd_id_cnt; - struct pwd_id_list pwd_id_list_head; -#endif - struct sae_capability sae_cap; - UCHAR is_h2e_connect; - struct sae_pt *pt_list; -#endif -} SECURITY_CONFIG, *PSECURITY_CONFIG; - -/******************************************************* - Security support by feature and wireless mode - *******************************************************/ - -#ifdef CONFIG_AP_SUPPORT -/* List AP support AKMs */ -#define AKM_AP_MASK \ - ((1 << SEC_AKM_WPA1) | (1 << SEC_AKM_WPA1PSK) | (1 << SEC_AKM_WPA2) | \ - (1 << SEC_AKM_WPA2PSK) | (1 << SEC_AKM_WAICERT) | \ - (1 << SEC_AKM_WAIPSK) | (1 << SEC_AKM_SAE_SHA256) | \ - (1 << SEC_AKM_SUITEB_SHA384) | (1 << SEC_AKM_DPP) | \ - (1 << SEC_AKM_OWE)) -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef APCLI_SUPPORT -/* List apcli support AKMs and Ciphers */ -#define AKM_APCLI_MASK \ - ((1 << SEC_AKM_WPA1PSK) | (1 << SEC_AKM_WPA2PSK) | \ - (1 << SEC_AKM_SAE_SHA256) | (1 << SEC_AKM_DPP) | (1 << SEC_AKM_OWE)) -#endif /* APCLI_SUPPORT */ - -#define MAX_PARAMETER_LEN \ - 600 /* worse case: WEP128 for MBSS0~15 = (32+1)*16=528 */ - -UCHAR sec_get_cipher_key_len(UINT32 cipher); -#endif /* SEC_CMM_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/wpa.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/wpa.h deleted file mode 100644 index 0b42a538e5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/wpa.h +++ /dev/null @@ -1,486 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wpa.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __WPA_H__ -#define __WPA_H__ - -#ifndef ROUND_UP -#define ROUND_UP(__x, __y) (((ULONG)((__x) + ((__y)-1))) & ((ULONG) ~((__y)-1))) -#endif - -#define SET_UINT16_TO_ARRARY(_V, _LEN) \ - { \ - _V[0] = ((UINT16)_LEN) >> 8; \ - _V[1] = ((UINT16)_LEN & 0xFF); \ - } - -#define INC_UINT16_TO_ARRARY(_V, _LEN) \ - { \ - UINT16 var_len; \ - \ - var_len = (_V[0] << 8) | (_V[1]); \ - var_len += _LEN; \ - \ - _V[0] = (var_len & 0xFF00) >> 8; \ - _V[1] = (var_len & 0xFF); \ - } - -#define CONV_ARRARY_TO_UINT16(_V) ((_V[0] << 8) | (_V[1])) - -#define ADD_ONE_To_64BIT_VAR(_V) \ - { \ - UCHAR cnt = LEN_KEY_DESC_REPLAY; \ - do { \ - cnt--; \ - _V[cnt]++; \ - if (cnt == 0) \ - break; \ - } while (_V[cnt] == 0); \ - } - -#define INC_TX_TSC(_tsc, _cnt) \ - { \ - INT i = 0; \ - while (++_tsc[i] == 0x0) { \ - i++; \ - if (i == (_cnt)) \ - break; \ - } \ - } - -#define IS_WPA_CAPABILITY(a) \ - (((a) >= Ndis802_11AuthModeWPA) && \ - ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK)) - -/* - WFA recommend to restrict the encryption type in 11n-HT mode. - So, the WEP and TKIP shall not be allowed to use HT rate. - */ -#define IS_INVALID_HT_SECURITY(_mode) \ - ((IS_CIPHER_WEP(_mode) || IS_CIPHER_TKIP(_mode)) && \ - (!IS_CIPHER_CCMP128(_mode))) - -#define MIX_CIPHER_WPA_TKIP_ON(x) (((x)&0x08) != 0) -#define MIX_CIPHER_WPA_AES_ON(x) (((x)&0x04) != 0) -#define MIX_CIPHER_WPA2_TKIP_ON(x) (((x)&0x02) != 0) -#define MIX_CIPHER_WPA2_AES_ON(x) (((x)&0x01) != 0) - -/* Some definition are different between Keneral mode and Daemon mode */ -#ifdef WPA_DAEMON_MODE -/* The definition for Daemon mode */ -#define WPA_GET_BSS_NUM(_pAd) ((_pAd)->mbss_num) - -#define WPA_GET_PMK(_pAd, _pEntry, _pmk) \ - { \ - _pmk = _pAd->MBSS[_pEntry->func_tb_idx].PMK; \ - } - -#define WPA_GET_GTK(_pAd, _pEntry, _gtk) \ - { \ - _gtk = _pAd->MBSS[_pEntry->func_tb_idx].GTK; \ - } - -#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \ - { \ - _cipher = (_pAd)->MBSS[_pEntry->func_tb_idx].GroupEncrypType; \ - } - -#define WPA_GET_DEFAULT_KEY_ID(_pAd, _pEntry, _idx) \ - { \ - _idx = (_pAd)->MBSS[_pEntry->func_tb_idx].DefaultKeyId; \ - } - -#define WPA_GET_BMCST_TSC(_pAd, _pEntry, _tsc) \ - { \ - _tsc = 1; \ - } - -#define WPA_BSSID(_pAd, _apidx) ((_pAd)->MBSS[_apidx].wlan_addr) - -#define WPA_OS_MALLOC(_p, _s) \ - { \ - _p = os_malloc(_s); \ - } - -#define WPA_OS_FREE(_p) \ - { \ - os_free(_p); \ - } - -#define WPA_GET_CURRENT_TIME(_time) \ - { \ - struct timeval tv; \ - gettimeofday(&tv, NULL); \ - *(_time) = tv.tv_sec; \ - } - -#else -/* The definition for Driver mode */ - -#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT) -#define WPA_GET_BSS_NUM(_pAd) \ - (((_pAd)->OpMode == OPMODE_AP) ? (_pAd)->ApCfg.BssidNum : 1) -#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \ - { \ - _cipher = Ndis802_11WEPDisabled; \ - if ((_pAd)->OpMode == OPMODE_AP) { \ - if (IS_ENTRY_APCLI(_pEntry) && \ - ((_pEntry)->wdev_idx < MAX_APCLI_NUM)) \ - _cipher = \ - (_pAd)->ApCfg \ - .ApCliTab[(_pEntry)->wdev_idx] \ - .GroupCipher; \ - else if ((_pEntry)->func_tb_idx < \ - (_pAd)->ApCfg.BssidNum) \ - _cipher = \ - (_pAd)->ApCfg \ - .MBSSID[_pEntry->func_tb_idx] \ - .GroupKeyWepStatus; \ - } else \ - _cipher = (_pAd)->StaCfg[0].GroupCipher; \ - } - -#define WPA_BSSID(_pAd, _apidx) \ - (((_pAd)->OpMode == OPMODE_AP) ? (_pAd)->ApCfg.MBSSID[_apidx].Bssid : \ - (_pAd)->CommonCfg.Bssid) -#elif defined(CONFIG_AP_SUPPORT) -#define WPA_GET_BSS_NUM(_pAd) ((_pAd)->ApCfg.BssidNum) -#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \ - { \ - _cipher = Ndis802_11WEPDisabled; \ - if (IS_ENTRY_APCLI(_pEntry) && \ - ((_pEntry)->wdev_idx < MAX_APCLI_NUM)) \ - _cipher = (_pAd)->ApCfg.ApCliTab[(_pEntry)->wdev_idx] \ - .GroupCipher; \ - else if ((_pEntry)->func_tb_idx < (_pAd)->ApCfg.BssidNum) \ - _cipher = (_pAd)->ApCfg.MBSSID[_pEntry->func_tb_idx] \ - .GroupKeyWepStatus; \ - } - -#define WPA_BSSID(_pAd, _apidx) ((_pAd)->ApCfg.MBSSID[_apidx].Bssid) - -#elif defined(CONFIG_STA_SUPPORT) -#define WPA_GET_BSS_NUM(_pAd) 1 -#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \ - { \ - _cipher = (_pAd)->StaCfg[0].GroupCipher; \ - } -#define WPA_BSSID(_pAd, _apidx) ((_pAd)->CommonCfg.Bssid) -#endif /* defined(CONFIG_STA_SUPPORT) */ - -#define WPA_OS_MALLOC(_p, _s) \ - { \ - os_alloc_mem(NULL, (PUCHAR *)&_p, _s); \ - } - -#define WPA_OS_FREE(_p) \ - { \ - os_free_mem(_p); \ - } - -#define WPA_GET_CURRENT_TIME(_time) NdisGetSystemUpTime(_time); - -#endif /* End of Driver Mode */ - -/*======================================== - The prototype is defined in cmm_wpa.c - ========================================*/ -void inc_iv_byte(UCHAR *iv, UINT len, UINT cnt); - -BOOLEAN WpaMsgTypeSubst(IN UCHAR EAPType, OUT INT *MsgType); - -int RtmpPasswordHash(char *password, unsigned char *ssid, int ssidlength, - unsigned char *output); - -PUINT8 WPA_ExtractSuiteFromRSNIE(IN PUINT8 rsnie, IN UINT rsnie_len, - IN UINT8 type, OUT UINT8 *count); - -VOID WpaShowAllsuite(IN PUINT8 rsnie, IN UINT rsnie_len); - -VOID RTMPInsertRSNIE(IN PUCHAR pFrameBuf, OUT PULONG pFrameLen, - IN PUINT8 rsnie_ptr, IN UINT8 rsnie_len, - IN PUINT8 pmkid_ptr, IN UINT8 pmkid_len); - -/* - ===================================== - function prototype in cmm_wpa.c - ===================================== -*/ -VOID WpaStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *Sm, - OUT STATE_MACHINE_FUNC Trans[]); - -VOID WpaDerivePTK(IN UCHAR *PMK, IN UCHAR *ANonce, IN UCHAR *AA, - IN UCHAR *SNonce, IN UCHAR *SA, OUT UCHAR *output, - IN UINT len); - -VOID WpaDerivePTK_KDF_256(IN UCHAR *PMK, IN UCHAR *ANonce, IN UCHAR *AA, - IN UCHAR *SNonce, IN UCHAR *SA, OUT UCHAR *output, - IN UINT len); - -VOID WpaDerivePTK_KDF_384(IN UCHAR *PMK, IN UCHAR *ANonce, IN UCHAR *AA, - IN UCHAR *SNonce, IN UCHAR *SA, OUT UCHAR *output, - IN UINT len); - -VOID WpaDeriveGTK(IN UCHAR *PMK, IN UCHAR *GNonce, IN UCHAR *AA, - OUT UCHAR *output, IN UINT len); - -VOID WPA_ConstructKdeHdr(IN UINT8 data_type, IN UINT8 data_len, - OUT PUCHAR pBuf); - -#if defined(SOFT_ENCRYPT) || defined(ADHOC_WPA2PSK_SUPPORT) -PCIPHER_KEY RTMPSwCipherKeySelection(IN PRTMP_ADAPTER pAd, IN PUCHAR pIV, - IN RX_BLK *pRxBlk, - IN PMAC_TABLE_ENTRY pEntry); - -NDIS_STATUS RTMPSoftDecryptionAction(IN PRTMP_ADAPTER pAd, IN PUCHAR pHdr, - IN UCHAR UserPriority, IN PCIPHER_KEY pKey, - INOUT PUCHAR pData, - INOUT UINT16 *DataByteCnt); - -VOID RTMPSoftConstructIVHdr(IN UCHAR CipherAlg, IN UCHAR key_id, - IN PUCHAR pTxIv, OUT PUCHAR pHdrIv, - OUT UINT8 *hdr_iv_len); - -VOID RTMPSoftEncryptionAction(IN PRTMP_ADAPTER pAd, IN UCHAR CipherAlg, - IN PUCHAR pHdr, IN PUCHAR pSrcBufData, - IN UINT32 SrcBufLen, IN UCHAR KeyIdx, - IN PCIPHER_KEY pKey, OUT UINT8 *ext_len); -#endif /* SOFT_ENCRYPT || ADHOC_WPA2PSK_SUPPORT */ - -VOID WPAInstallPairwiseKey(PRTMP_ADAPTER pAd, UINT8 BssIdx, - PMAC_TABLE_ENTRY pEntry, BOOLEAN bAE); - -VOID WPAInstallSharedKey(PRTMP_ADAPTER pAd, UINT8 GroupCipher, UINT8 BssIdx, - UINT8 KeyIdx, UINT8 Wcid, BOOLEAN bAE, PUINT8 pGtk, - UINT8 GtkLen); - -VOID CalculateMIC(IN UCHAR KeyDescVer, IN UCHAR *PTK, OUT PEAPOL_PACKET pMsg); - -RTMP_STRING *GetEapolMsgType(CHAR msg); - -/* - ===================================== - function prototype in cmm_wep.c - ===================================== -*/ -UINT RTMP_CALC_FCS32(IN UINT Fcs, IN PUCHAR Cp, IN INT Len); - -VOID RTMPConstructWEPIVHdr(IN UINT8 key_idx, IN UCHAR *pn, OUT UCHAR *iv_hdr); - -BOOLEAN RTMPSoftEncryptWEP(IN PUCHAR pIvHdr, IN PSEC_KEY_INFO pKey, - INOUT PUCHAR pData, IN ULONG DataByteCnt); - -BOOLEAN RTMPSoftDecryptWEP(IN PSEC_KEY_INFO pKey, INOUT PUCHAR pData, - INOUT UINT16 *DataByteCnt); - -/* - ===================================== - function prototype in cmm_tkip.c - ===================================== -*/ -BOOLEAN RTMPSoftDecryptTKIP(IN PRTMP_ADAPTER pAd, IN PUCHAR pHdr, - IN UCHAR UserPriority, IN PCIPHER_KEY pKey, - INOUT PUCHAR pData, IN UINT16 *DataByteCnt); - -VOID TKIP_GTK_KEY_WRAP(IN UCHAR *key, IN UCHAR *iv, IN UCHAR *input_text, - IN UINT32 input_len, OUT UCHAR *output_text); - -VOID TKIP_GTK_KEY_UNWRAP(IN UCHAR *key, IN UCHAR *iv, IN UCHAR *input_text, - IN UINT32 input_len, OUT UCHAR *output_text); - -/* - ===================================== - function prototype in cmm_aes.c - ===================================== -*/ -BOOLEAN RTMPSoftDecryptAES(IN PRTMP_ADAPTER pAd, IN PUCHAR pData, - IN ULONG DataByteCnt, IN PCIPHER_KEY pWpaKey); - -VOID RTMPConstructCCMPHdr(IN UINT8 key_idx, IN UCHAR *pn, OUT UCHAR *ccmp_hdr); - -BOOLEAN RTMPSoftEncryptCCMP(IN PRTMP_ADAPTER pAd, IN PUCHAR pHdr, IN PUCHAR pIV, - IN PUCHAR pKey, INOUT PUCHAR pData, - IN UINT32 DataLen); - -BOOLEAN RTMPSoftDecryptCCMP(IN PRTMP_ADAPTER pAd, IN PUCHAR pHdr, - IN PCIPHER_KEY pKey, INOUT PUCHAR pData, - INOUT UINT16 *DataLen); - -VOID CCMP_test_vector(IN PRTMP_ADAPTER pAd, IN INT input); - -#ifdef RT_CFG80211_SUPPORT -BOOLEAN RTMPIsValidIEs(IN UCHAR *Ies, IN INT32 Len); -const UCHAR *RTMPFindIE(IN UCHAR Eid, IN const UCHAR *Ies, IN INT32 Len); -const UCHAR *RTMPFindWPSIE(IN const UCHAR *Ies, IN INT32 Len); -#endif /* RT_CFG80211_SUPPORT */ - -/* --------------------Eddy---------------- */ -VOID PRF(IN UCHAR *key, IN INT key_len, IN UCHAR *prefix, IN INT prefix_len, - IN UCHAR *data, IN INT data_len, OUT UCHAR *output, IN INT len); - -VOID KDF(IN PUINT8 key, IN INT key_len, IN PUINT8 label, IN INT label_len, - IN PUINT8 data, IN INT data_len, OUT PUINT8 output, IN USHORT len); - -VOID KDF_384(IN PUINT8 key, IN INT key_len, IN PUINT8 label, IN INT label_len, - IN PUINT8 data, IN INT data_len, OUT PUINT8 output, IN USHORT len); - -VOID HKDF_expand_sha256(IN UCHAR *secret, IN INT secret_len, IN UCHAR *info, - IN INT info_len, OUT UCHAR *output, INT output_Len); - -VOID HKDF_expand_sha384(IN UCHAR *secret, IN INT secret_len, IN UCHAR *info, - IN INT info_len, OUT UCHAR *output, INT output_Len); - -VOID GenRandom(IN PRTMP_ADAPTER pAd, IN UCHAR *macAddr, OUT UCHAR *random); - -VOID RTMPToWirelessSta(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PUCHAR pHeader802_3, IN UINT HdrLen, IN PUCHAR pData, - IN UINT DataLen, IN BOOLEAN bClearFrame); - -BOOLEAN RTMPCheckWPAframe(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PUCHAR pData, IN ULONG DataByteCount, - IN UCHAR wdev_idx, IN BOOLEAN eth_frm); - -INT WPAPasswordHash(IN CHAR *password, IN UCHAR *ssid, IN INT ssidlength, - OUT UCHAR *output); - -INT SetWPAPSKKey(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *keyString, - IN INT keyStringLen, IN UCHAR *pHashStr, IN INT hashStrLen, - OUT PUCHAR pPMKBuf); - -BOOLEAN rtmp_chk_tkip_mic(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN RX_BLK *pRxBlk); - -VOID ReadWPAParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer); - -VOID WPAMakeRSNIE(IN UINT32 wdev_type, IN struct _SECURITY_CONFIG *pSecConfig, - IN PMAC_TABLE_ENTRY pEntry); - -BOOLEAN wpa_rsne_sanity(IN PUCHAR rsnie_ptr, IN UCHAR rsnie_len, - OUT UCHAR *end_field); - -UINT WPAValidateRSNIE(IN struct _SECURITY_CONFIG *pSecConfigSelf, - IN struct _SECURITY_CONFIG *pSecConfigEntry, - IN PUCHAR pRsnIe, IN UCHAR rsnie_len); - -VOID WpaDeriveGTK(IN UCHAR *PMK, IN UCHAR *GNonce, IN UCHAR *AA, - OUT UCHAR *output, IN UINT len); - -VOID WPAInstallKey(IN PRTMP_ADAPTER pAd, IN struct _ASIC_SEC_INFO *pInfo, - IN BOOLEAN bAE, IN BOOLEAN is_install); - -VOID WPACalculateMIC(IN UCHAR KeyDescVer, IN UINT32 AKMMap, IN UCHAR *PTK, - IN UINT8 key_deri_alg, OUT PEAPOL_PACKET pMsg); - -VOID WPAInsertRSNIE(IN PUCHAR pFrameBuf, OUT PULONG pFrameLen, - IN PUINT8 rsnie_ptr, IN UINT8 rsnie_len, - IN PUINT8 pmkid_ptr, IN UINT8 pmkid_len); - -VOID WPAConstructKdeHdr(IN UINT8 data_type, IN UINT8 data_len, OUT PUCHAR pBuf); - -VOID WPAConstructEapolKeyData(IN PMAC_TABLE_ENTRY pEntry, IN UCHAR MsgType, - IN UCHAR keyDescVer, - IN struct _SECURITY_CONFIG *pSecPairwise, - IN struct _SECURITY_CONFIG *pSecGroup, - OUT PEAPOL_PACKET pMsg); - -VOID WPAConstructEapolMsg(IN PMAC_TABLE_ENTRY pEntry, IN UCHAR MsgType, - IN struct _SECURITY_CONFIG *pSecPairwise, - IN struct _SECURITY_CONFIG *pSecGroup, - OUT PEAPOL_PACKET pMsg); - -BOOLEAN WpaMessageSanity(IN PRTMP_ADAPTER pAd, IN PEAPOL_PACKET pMsg, - IN ULONG MsgLen, IN UCHAR MsgType, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry); - -VOID WPABuildPairMsg1(IN RTMP_ADAPTER *pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry); - -VOID WPABuildPairMsg2(IN RTMP_ADAPTER *pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry); - -VOID WPABuildPairMsg3(IN RTMP_ADAPTER *pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry); - -VOID WPABuildPairMsg4(IN RTMP_ADAPTER *pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry); - -VOID WPABuildGroupMsg1(IN PRTMP_ADAPTER pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry); - -VOID WPABuildGroupMsg2(IN PRTMP_ADAPTER pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry); - -VOID PeerPairMsg1Action(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem); - -VOID PeerPairMsg2Action(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem); - -VOID PeerPairMsg3Action(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem); - -VOID PeerPairMsg4Action(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem); - -VOID PeerGroupMsg1Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem); - -VOID PeerGroupMsg2Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem); - -DECLARE_TIMER_FUNCTION(WPAStartFor4WayExec); -DECLARE_TIMER_FUNCTION(WPAStartFor2WayExec); -DECLARE_TIMER_FUNCTION(WPAHandshakeMsgRetryExec); -VOID WPAStartFor4WayExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID WPAStartFor2WayExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - -VOID WPAHandshakeMsgRetryExec(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); - -INT set_wpa3_test(IN struct _RTMP_ADAPTER *ad, IN RTMP_STRING *arg); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/wpa_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/wpa_cmm.h deleted file mode 100644 index bd5b2e38dd..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/security/wpa_cmm.h +++ /dev/null @@ -1,246 +0,0 @@ - -#ifndef WPA_CMM_H -#define WPA_CMM_H - -#include "rtmp_type.h" -#include "dot11i_wpa.h" - -#define TX_EAPOL_BUFFER 1500 - -/* ---EddySEC Start---*/ -/* Retry timer counter initial value */ -#define PEER_MSG1_RETRY_TIMER_CTR 0 -#define PEER_MSG3_RETRY_TIMER_CTR 10 -#define GROUP_MSG1_RETRY_TIMER_CTR 20 - -/* WPA mechanism retry timer interval */ -#define PEER_MSG1_RETRY_EXEC_INTV 1000 /* 1 sec */ -#define PEER_MSG3_RETRY_EXEC_INTV 1000 /* 1 sec */ -#define GROUP_MSG1_RETRY_EXEC_INTV 1000 /* 1 sec */ -#define GROUP_MSG1_RETRY_EXEC_EXTEND \ - 60000 /* 60 sec, When group retry counter > limit, extend rekey time interval */ -#define GROUP_KEY_UPDATE_EXEC_INTV \ - 1000 /* 1 sec, for peridic group rekey timer */ - -/* Retry counter limitation */ -#define PEER_MSG1_RETRY_LIMIT 2 -#define PEER_MSG3_RETRY_LIMIT 2 -#define GROUP_MSG1_RETRY_LIMIT 10 - -#define EAPOL_MSG_INVALID 0 -#define EAPOL_PAIR_MSG_1 1 -#define EAPOL_PAIR_MSG_2 2 -#define EAPOL_PAIR_MSG_3 3 -#define EAPOL_PAIR_MSG_4 4 -#define EAPOL_GROUP_MSG_1 5 -#define EAPOL_GROUP_MSG_2 6 - -#define ENQUEUE_EAPOL_START_TIMER 100 /* 100 ms, for 4 way */ -#define ENQUEUE_EAPOL_2WAY_START_TIMER 500 /* 300 ms, for 2 way */ - -#define EAPOL_START_DISABLE 0 -#define EAPOL_START_PSK 1 -#define EAPOL_START_1X 2 - -/* ---EddySEC End ---*/ - -#define PEER_GROUP_KEY_UPDATE_INIV 2000 /* 2 sec */ - -/* group rekey interval */ -#define TIME_REKEY 0 -#define PKT_REKEY 1 -#define DISABLE_REKEY 2 -#define MAX_REKEY 2 - -#define MAX_REKEY_INTER 0x3ffffff - -/* */ -/* Common WPA state machine: states, events, total function # */ -/* */ -#define WPA_PTK 0 -#define MAX_WPA_PTK_STATE 1 - -#define WPA_MACHINE_BASE 0 -#define MT2_EAPPacket 0 -#define MT2_EAPOLStart 1 -#define MT2_EAPOLLogoff 2 -#define MT2_EAPOLKey 3 -#define MT2_EAPOLASFAlert 4 -#define MAX_WPA_MSG 5 - -#define WPA_FUNC_SIZE (MAX_WPA_PTK_STATE * MAX_WPA_MSG) - -typedef enum _WpaRole { - WPA_NONE, /* 0 */ - WPA_Authenticator, /* 1 */ - WPA_Supplicant, /* 2 */ - WPA_BOTH, /* 3: Authenticator and Supplicant */ -} WPA_ROLE; - -/*for-wpa value domain of pMacEntry->WpaState 802.1i D3 p.114 */ -typedef enum _ApWpaState { - AS_NOTUSE, /* 0 */ - AS_DISCONNECT, /* 1 */ - AS_DISCONNECTED, /* 2 */ - AS_INITIALIZE, /* 3 */ - AS_AUTHENTICATION, /* 4 */ - AS_AUTHENTICATION2, /* 5 */ - AS_INITPMK, /* 6 */ - AS_INITPSK, /* 7 */ - AS_PTKSTART, /* 8 */ - AS_PTKINIT_NEGOTIATING, /* 9 */ - AS_PTKINITDONE, /* 10 */ - AS_UPDATEKEYS, /* 11 */ - AS_INTEGRITY_FAILURE, /* 12 */ - AS_KEYUPDATE, /* 13 */ -} AP_WPA_STATE; - -/* For supplicant state machine states. 802.11i Draft 4.1, p. 97 */ -/* We simplified it */ -typedef enum _WpaState { - SS_NOTUSE, /* 0 */ - SS_START, /* 1 */ - SS_WAIT_MSG_3, /* 2 */ - SS_WAIT_GROUP, /* 3 */ - SS_FINISH, /* 4 */ - SS_KEYUPDATE, /* 5 */ -} WPA_STATE; - -/* for-wpa value domain of pMacEntry->WpaState 802.1i D3 p.114 */ -typedef enum _GTKState { - REKEY_NEGOTIATING, - REKEY_ESTABLISHED, - REKEY_FAILURE, -} GTK_STATE; - -/* for-wpa value domain of pMacEntry->WpaState 802.1i D3 p.114 */ -typedef enum _WpaGTKState { - SETKEYS, - SETKEYS_DONE, -} WPA_GTK_STATE; - -/* WPA internal command type */ -#define WPA_SM_4WAY_HS_START 1 -#define WPA_SM_DISCONNECT 0xff - -/* WPA element IDs */ -typedef enum _WPA_VARIABLE_ELEMENT_ID { - WPA_ELEM_CMD = 1, - WPA_ELEM_PEER_RSNIE, - WPA_ELEM_LOCAL_RSNIE, - WPA_ELEM_PMK, - WPA_ELEM_RESV -} WPA_VARIABLE_ELEMENT_ID; - -#define GROUP_SUITE 0 -#define PAIRWISE_SUITE 1 -#define AKM_SUITE 2 -#define RSN_CAP_INFO 3 -#define PMKID_LIST 4 -#define G_MGMT_SUITE 5 - -/* */ -/* The definition of the cipher combination */ -/* */ -/* bit3 bit2 bit1 bit0 */ -/* +------------+------------+ */ -/* | WPA | WPA2 | */ -/* +------+-----+------+-----+ */ -/* | TKIP | AES | TKIP | AES | */ -/* | 0 | 1 | 1 | 0 | -> 0x06 */ -/* | 0 | 1 | 1 | 1 | -> 0x07 */ -/* | 1 | 0 | 0 | 1 | -> 0x09 */ -/* | 1 | 0 | 1 | 1 | -> 0x0B */ -/* | 1 | 1 | 0 | 1 | -> 0x0D */ -/* | 1 | 1 | 1 | 0 | -> 0x0E */ -/* | 1 | 1 | 1 | 1 | -> 0x0F */ -/* +------+-----+------+-----+ */ -/* */ -typedef enum _WpaMixPairCipher { - MIX_CIPHER_NOTUSE = 0x00, - WPA_NONE_WPA2_TKIPAES = 0x03, /* WPA2-TKIPAES */ - WPA_AES_WPA2_TKIP = 0x06, - WPA_AES_WPA2_TKIPAES = 0x07, - WPA_TKIP_WPA2_AES = 0x09, - WPA_TKIP_WPA2_TKIPAES = 0x0B, - WPA_TKIPAES_WPA2_NONE = 0x0C, /* WPA-TKIPAES */ - WPA_TKIPAES_WPA2_AES = 0x0D, - WPA_TKIPAES_WPA2_TKIP = 0x0E, - WPA_TKIPAES_WPA2_TKIPAES = 0x0F, -} WPA_MIX_PAIR_CIPHER; - -/* The internal command list for ralink dot1x daemon using */ -typedef enum _Dot1xInternalCmd { - DOT1X_DISCONNECT_ENTRY, - DOT1X_RELOAD_CONFIG, - DOT1X_ACL_ENTRY, - DOT1X_MLME_EVENT, - DOT1X_AEAD_DECR_EVENT, - DOT1X_AEAD_ENCR_EVENT, -#ifdef RADIUS_ACCOUNTING_SUPPORT - DOT1X_LOCAL_AUTH_ENTRY -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ - -} DOT1X_INTERNAL_CMD; - -/* 802.1x authentication format */ -typedef struct _IEEE8021X_FRAME { - UCHAR Version; /* 1.0 */ - UCHAR Type; /* 0 = EAP Packet */ - USHORT Length; -} IEEE8021X_FRAME, *PIEEE8021X_FRAME; - -typedef struct GNU_PACKED _RSN_IE_HEADER_STRUCT { - UCHAR Eid; - UCHAR Length; - USHORT Version; /* Little endian format */ -} RSN_IE_HEADER_STRUCT, *PRSN_IE_HEADER_STRUCT; - -/* Cipher suite selector types */ -typedef struct GNU_PACKED _CIPHER_SUITE_STRUCT { - UCHAR Oui[3]; - UCHAR Type; -} CIPHER_SUITE_STRUCT, *PCIPHER_SUITE_STRUCT; - -/* Authentication and Key Management suite selector */ -typedef struct GNU_PACKED _AKM_SUITE_STRUCT { - UCHAR Oui[3]; - UCHAR Type; -} AKM_SUITE_STRUCT, *PAKM_SUITE_STRUCT; - -/* RSN capability */ -typedef struct GNU_PACKED _RSN_CAPABILITY { - USHORT Rsv : 10; - USHORT GTKSAReplayCnt : 2; - USHORT PTKSAReplayCnt : 2; - USHORT NoPairwise : 1; - USHORT PreAuth : 1; -} RSN_CAPABILITY, *PRSN_CAPABILITY; - -typedef struct _CIPHER_KEY { - UCHAR Key[16]; /* 128 bits max */ - UCHAR TxMic[8]; - UCHAR RxMic[8]; - UCHAR TxTsc[16]; /* TSC value. Change it from 48bit to 128bit */ - UCHAR RxTsc[16]; /* TSC value. Change it from 48bit to 128bit */ - UCHAR CipherAlg; /* 0:none, 1:WEP64, 2:WEP128, 3:TKIP, 4:AES, 5:CKIP64, 6:CKIP128 */ - UCHAR KeyLen; /* Key length for each key, 0: entry is invalid */ - UCHAR Type; /* Indicate Pairwise/Group when reporting MIC error */ -} CIPHER_KEY, *PCIPHER_KEY; - -typedef struct _CMD_802_11_KEY { - UINT8 ucAddRemove; - UINT8 ucTxKey; /* 1 : Tx key */ - UINT8 ucKeyType; /* 0 : group Key, 1 : Pairwise key */ - UINT8 ucIsAuthenticator; /* 1 : authenticator */ - UINT8 aucPeerAddr[6]; - UINT8 ucBssIndex; /* the BSS index */ - UINT8 ucAlgorithmId; - UINT8 ucKeyId; - UINT8 ucKeyLen; - UINT8 ucWlanIndex; - UINT8 ucReverved; - UINT8 aucKeyMaterial[32]; - UINT8 aucKeyRsc[16]; -} CMD_802_11_KEY, *P_CMD_802_11_KEY; -#endif /* WPA_CMM_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/smartant.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/smartant.h deleted file mode 100644 index c7ead2ddc0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/smartant.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - - -*/ -#ifndef __SMART_ANT_H__ -#define __SMART_ANT_H__ - -#include "rtmp_type.h" - -struct _RTMP_ADAPTER; - -typedef enum _SA_TRAIN_COND { - SA_TRAIN_UPPER_MCS = - 0x1, /* 0x1: trainUpperMCS instead of train CurrentMCS */ - SA_TRAIN_GRADUAL_APPROACH = 0x2, /* 0x2: train one antenna one time */ -} SA_TRAIN_COND; - -typedef struct _SA_GPIO_PAIR_ { - UINT32 regAddr; - UINT32 bitMask; -} SA_GPIO_PAIR; - -#define RTMP_SA_WORK_ON(pAd) ((pAd->smartAntEnable == TRUE) && (pAd->pSAParam)) - -INT Show_SA_CfgInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Show_SA_DbgInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SA_McsBound_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_McsStableCnt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_MaxAntennaTry_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -int Set_SA_AGSP_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -int Set_SA_TrainSeq_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *args); - -int Set_SA_TrainDelay_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -int Set_SA_AntCand_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -int Set_SA_TrainCond_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SA_RssiVariance_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SA_RssiThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SA_SkipConfirmStage_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SmartAnt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TestPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_DbgLogOn_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SA_StaticAntPair_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT set_SA_txNss_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SA_Mode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SA_Station_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_SA_StationCandRule_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT RtmpSATrainInfoUpdate(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_SA_TRAINING_PARAM *pTrainEntry, - IN RXWI_STRUC *pRxWI, IN UCHAR txNss); - -BOOLEAN sa_del_train_entry(IN RTMP_ADAPTER *pAd, IN UCHAR *pMacAddr, - IN BOOLEAN bForced); - -RTMP_SA_TRAINING_PARAM *sa_add_train_entry(IN RTMP_ADAPTER *pAd, - IN UCHAR *pMacAddr, - IN BOOLEAN bAddByUser); - -VOID RtmpSAUpdateRxSignal(IN RTMP_ADAPTER *pAd); - -INT RtmpSAChkAndGo(IN struct _RTMP_ADAPTER *pAd); - -int RtmpSAStop(IN struct _RTMP_ADAPTER *pAd); - -int RtmpSAStart(IN struct _RTMP_ADAPTER *pAd); - -int RtmpSAInit(IN struct _RTMP_ADAPTER *pAd); - -int RtmpSAExit(IN struct _RTMP_ADAPTER *pAd); - -#endif /* __SMART_ANT_H__ // */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sniffer/radiotap.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sniffer/radiotap.h deleted file mode 100644 index a0d89cca76..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sniffer/radiotap.h +++ /dev/null @@ -1,311 +0,0 @@ -/*- - * Copyright (c) 2003, 2004 David Young. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of David Young may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID - * YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - */ - -/* - * Modifications to fit into the linux IEEE 802.11 stack, - * Mike Kershaw (dragorn@kismetwireless.net) - */ - -#ifndef IEEE80211RADIOTAP_H -#define IEEE80211RADIOTAP_H - -/* Base version of the radiotap packet header data */ -#define PKTHDR_RADIOTAP_VERSION 0 - -/* A generic radio capture format is desirable. There is one for - * Linux, but it is neither rigidly defined (there were not even - * units given for some fields) nor easily extensible. - * - * I suggest the following extensible radio capture format. It is - * based on a bitmap indicating which fields are present. - * - * I am trying to describe precisely what the application programmer - * should expect in the following, and for that reason I tell the - * units and origin of each measurement (where it applies), or else I - * use sufficiently weaselly language ("is a monotonically nondecreasing - * function of...") that I cannot set false expectations for lawyerly - * readers. - */ - -/* The radio capture header precedes the 802.11 header. - * All data in the header is little endian on all platforms. - */ -struct ieee80211_radiotap_header { - uint8_t it_version; /* Version 0. Only increases - * for drastic changes, - * introduction of compatible - * new fields does not count. - */ - uint8_t it_pad; - uint16_t it_len; /* length of the whole - * header in bytes, including - * it_version, it_pad, - * it_len, and data fields. - */ - uint32_t it_present; /* A bitmap telling which - * fields are present. Set bit 31 - * (0x80000000) to extend the - * bitmap by another 32 bits. - * Additional extensions are made - * by setting bit 31. - */ -}; - -/* Name Data type Units - * ---- --------- ----- - * - * IEEE80211_RADIOTAP_TSFT __le64 microseconds - * - * Value in microseconds of the MAC's 64-bit 802.11 Time - * Synchronization Function timer when the first bit of the - * MPDU arrived at the MAC. For received frames, only. - * - * IEEE80211_RADIOTAP_CHANNEL 2 x uint16_t MHz, bitmap - * - * Tx/Rx frequency in MHz, followed by flags (see below). - * - * IEEE80211_RADIOTAP_FHSS uint16_t see below - * - * For frequency-hopping radios, the hop set (first byte) - * and pattern (second byte). - * - * IEEE80211_RADIOTAP_RATE u8 500kb/s - * - * Tx/Rx data rate - * - * IEEE80211_RADIOTAP_DBM_ANTSIGNAL s8 decibels from - * one milliwatt (dBm) - * - * RF signal power at the antenna, decibel difference from - * one milliwatt. - * - * IEEE80211_RADIOTAP_DBM_ANTNOISE s8 decibels from - * one milliwatt (dBm) - * - * RF noise power at the antenna, decibel difference from one - * milliwatt. - * - * IEEE80211_RADIOTAP_DB_ANTSIGNAL u8 decibel (dB) - * - * RF signal power at the antenna, decibel difference from an - * arbitrary, fixed reference. - * - * IEEE80211_RADIOTAP_DB_ANTNOISE u8 decibel (dB) - * - * RF noise power at the antenna, decibel difference from an - * arbitrary, fixed reference point. - * - * IEEE80211_RADIOTAP_LOCK_QUALITY uint16_t unitless - * - * Quality of Barker code lock. Unitless. Monotonically - * nondecreasing with "better" lock strength. Called "Signal - * Quality" in datasheets. (Is there a standard way to measure - * this?) - * - * IEEE80211_RADIOTAP_TX_ATTENUATION uint16_t unitless - * - * Transmit power expressed as unitless distance from max - * power set at factory calibration. 0 is max power. - * Monotonically nondecreasing with lower power levels. - * - * IEEE80211_RADIOTAP_DB_TX_ATTENUATION uint16_t decibels (dB) - * - * Transmit power expressed as decibel distance from max power - * set at factory calibration. 0 is max power. Monotonically - * nondecreasing with lower power levels. - * - * IEEE80211_RADIOTAP_DBM_TX_POWER s8 decibels from - * one milliwatt (dBm) - * - * Transmit power expressed as dBm (decibels from a 1 milliwatt - * reference). This is the absolute power level measured at - * the antenna port. - * - * IEEE80211_RADIOTAP_FLAGS u8 bitmap - * - * Properties of transmitted and received frames. See flags - * defined below. - * - * IEEE80211_RADIOTAP_ANTENNA u8 antenna index - * - * Unitless indication of the Rx/Tx antenna for this packet. - * The first antenna is antenna 0. - * - * IEEE80211_RADIOTAP_RX_FLAGS uint16_t bitmap - * - * Properties of received frames. See flags defined below. - * - * IEEE80211_RADIOTAP_TX_FLAGS uint16_t bitmap - * - * Properties of transmitted frames. See flags defined below. - * - * IEEE80211_RADIOTAP_RTS_RETRIES u8 data - * - * Number of rts retries a transmitted frame used. - * - * IEEE80211_RADIOTAP_DATA_RETRIES u8 data - * - * Number of unicast retries a transmitted frame used. - * - * IEEE80211_RADIOTAP_MCS u8, u8, u8 unitless - * - * Contains a bitmap of known fields/flags, the flags, and - * the MCS index. - * - * IEEE80211_RADIOTAP_AMPDU_STATUS u32, u16, u8, u8 unitlesss - * - * Contains the AMPDU information for the subframe. - * - * IEEE80211_RADIOTAP_VHT u16, u8, u8, u8[4], u8, u8, u16 - * - * Contains VHT information about this frame. - */ -enum ieee80211_radiotap_type { - IEEE80211_RADIOTAP_TSFT = 0, - IEEE80211_RADIOTAP_FLAGS = 1, - IEEE80211_RADIOTAP_RATE = 2, - IEEE80211_RADIOTAP_CHANNEL = 3, - IEEE80211_RADIOTAP_FHSS = 4, - IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5, - IEEE80211_RADIOTAP_DBM_ANTNOISE = 6, - IEEE80211_RADIOTAP_LOCK_QUALITY = 7, - IEEE80211_RADIOTAP_TX_ATTENUATION = 8, - IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9, - IEEE80211_RADIOTAP_DBM_TX_POWER = 10, - IEEE80211_RADIOTAP_ANTENNA = 11, - IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12, - IEEE80211_RADIOTAP_DB_ANTNOISE = 13, - IEEE80211_RADIOTAP_RX_FLAGS = 14, - IEEE80211_RADIOTAP_TX_FLAGS = 15, - IEEE80211_RADIOTAP_RTS_RETRIES = 16, - IEEE80211_RADIOTAP_DATA_RETRIES = 17, - - IEEE80211_RADIOTAP_MCS = 19, - IEEE80211_RADIOTAP_AMPDU_STATUS = 20, - IEEE80211_RADIOTAP_VHT = 21, - - /* valid in every it_present bitmap, even vendor namespaces */ - IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, - IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, - IEEE80211_RADIOTAP_EXT = 31 -}; - -/* Channel flags. */ -#define IEEE80211_CHAN_TURBO 0x0010 /* Turbo channel */ -#define IEEE80211_CHAN_CCK 0x0020 /* CCK channel */ -#define IEEE80211_CHAN_OFDM 0x0040 /* OFDM channel */ -#define IEEE80211_CHAN_2GHZ 0x0080 /* 2 GHz spectrum channel. */ -#define IEEE80211_CHAN_5GHZ 0x0100 /* 5 GHz spectrum channel */ -#define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */ -#define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */ -#define IEEE80211_CHAN_GFSK 0x0800 /* GFSK channel (FHSS PHY) */ - -/* For IEEE80211_RADIOTAP_FLAGS */ -#define IEEE80211_RADIOTAP_F_CFP \ - 0x01 /* sent/received - * during CFP - */ -#define IEEE80211_RADIOTAP_F_SHORTPRE \ - 0x02 /* sent/received - * with short - * preamble - */ -#define IEEE80211_RADIOTAP_F_WEP \ - 0x04 /* sent/received - * with WEP encryption - */ -#define IEEE80211_RADIOTAP_F_FRAG \ - 0x08 /* sent/received - * with fragmentation - */ -#define IEEE80211_RADIOTAP_F_FCS 0x10 /* frame includes FCS */ -#define IEEE80211_RADIOTAP_F_DATAPAD \ - 0x20 /* frame has padding between - * 802.11 header and payload - * (to 32-bit boundary) - */ -#define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* frame failed FCS check */ - -#define IEEE80211_RADIOTAP_F_SHORTGI 0x80 - -/* For IEEE80211_RADIOTAP_RX_FLAGS */ -#define IEEE80211_RADIOTAP_F_RX_BADPLCP 0x0002 /* bad PLCP */ - -/* For IEEE80211_RADIOTAP_TX_FLAGS */ -#define IEEE80211_RADIOTAP_F_TX_FAIL \ - 0x0001 /* failed due to excessive - * retries */ -#define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */ -#define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */ - -/* For IEEE80211_RADIOTAP_AMPDU_STATUS */ -#define IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN 0x0001 -#define IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN 0x0002 -#define IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN 0x0004 -#define IEEE80211_RADIOTAP_AMPDU_IS_LAST 0x0008 -#define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR 0x0010 -#define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN 0x0020 - -/* For IEEE80211_RADIOTAP_MCS */ -#define IEEE80211_RADIOTAP_MCS_HAVE_BW 0x01 -#define IEEE80211_RADIOTAP_MCS_HAVE_MCS 0x02 -#define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04 -#define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08 -#define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10 - -#define IEEE80211_RADIOTAP_MCS_HAVE_STBC 0x20 - -#define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03 -#define IEEE80211_RADIOTAP_MCS_BW_20 0 -#define IEEE80211_RADIOTAP_MCS_BW_40 1 -#define IEEE80211_RADIOTAP_MCS_BW_20L 2 -#define IEEE80211_RADIOTAP_MCS_BW_20U 3 -#define IEEE80211_RADIOTAP_MCS_SGI 0x04 -#define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08 -#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10 - -/* For IEEE80211_RADIOTAP_VHT */ -#define IEEE80211_RADIOTAP_VHT_KNOWN_STBC 0x0001 -#define IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA 0x0002 -#define IEEE80211_RADIOTAP_VHT_KNOWN_GI 0x0004 -#define IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS 0x0008 -#define IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM 0x0010 -#define IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED 0x0020 -#define IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH 0x0040 -#define IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID 0x0080 -#define IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID 0x0100 - -#define IEEE80211_RADIOTAP_VHT_FLAG_STBC 0x01 -#define IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA 0x02 -#define IEEE80211_RADIOTAP_VHT_FLAG_SGI 0x04 -#define IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 0x08 -#define IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM 0x10 -#define IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED 0x20 - -#endif /* IEEE80211_RADIOTAP_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sniffer/sniffer.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sniffer/sniffer.h deleted file mode 100644 index b2bca2ff27..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sniffer/sniffer.h +++ /dev/null @@ -1,343 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - sniffer.h -*/ - -#ifndef __SNIFFER_H__ -#define __SNIFFER_H__ - -#include "radiotap.h" - -struct sniffer_control { - UINT8 sniffer_type; -}; - -#define RADIOTAP_TYPE 0 -#define PRISM_TYPE 1 - -enum { - DIDmsg_lnxind_wlansniffrm = 0x00000044, - DIDmsg_lnxind_wlansniffrm_hosttime = 0x00010044, - DIDmsg_lnxind_wlansniffrm_mactime = 0x00020044, - DIDmsg_lnxind_wlansniffrm_channel = 0x00030044, - DIDmsg_lnxind_wlansniffrm_rssi = 0x00040044, - DIDmsg_lnxind_wlansniffrm_sq = 0x00050044, - DIDmsg_lnxind_wlansniffrm_signal = 0x00060044, - DIDmsg_lnxind_wlansniffrm_noise = 0x00070044, - DIDmsg_lnxind_wlansniffrm_rate = 0x00080044, - DIDmsg_lnxind_wlansniffrm_istx = 0x00090044, - DIDmsg_lnxind_wlansniffrm_frmlen = 0x000A0044 -}; -enum { P80211ENUM_msgitem_status_no_value = 0x00 }; - -enum { P80211ENUM_truth_false = 0x00, P80211ENUM_truth_true = 0x01 }; - -/* Definition from madwifi */ -typedef struct { - UINT32 did; - UINT16 status; - UINT16 len; - UINT32 data; -} p80211item_uint32_t; - -typedef struct { - UINT32 msgcode; - UINT32 msglen; -#define WLAN_DEVNAMELEN_MAX 16 - UINT8 devname[WLAN_DEVNAMELEN_MAX]; - p80211item_uint32_t hosttime; - p80211item_uint32_t mactime; - p80211item_uint32_t channel; - p80211item_uint32_t rssi; - p80211item_uint32_t sq; - p80211item_uint32_t signal; - p80211item_uint32_t noise; - p80211item_uint32_t rate; - p80211item_uint32_t istx; - p80211item_uint32_t frmlen; -} wlan_ng_prism2_header; - -#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT -/* - Note: 2009/11/10 - Used in WiFi Sigma Test Engine RT3593 (replace RT2883). -*/ -#ifdef RT_BIG_ENDIAN -typedef struct _ETHEREAL_RADIO { - UCHAR Flag_80211n; - UCHAR signal_level; /* dBm */ - UCHAR data_rate; /* rate index */ - UCHAR channel; /* Channel number */ -} ETHEREAL_RADIO, *PETHEREAL_RADIO; -#else -typedef struct _ETHEREAL_RADIO { - UCHAR channel; /* Channel number */ - UCHAR data_rate; /* rate index */ - UCHAR signal_level; /* dBm */ - UCHAR Flag_80211n; -} ETHEREAL_RADIO, *PETHEREAL_RADIO; -#endif - -#define WIRESHARK_11N_FLAG_3x3 0x01 -#define WIRESHARK_11N_FLAG_GF 0x02 -#define WIRESHARK_11N_FLAG_AMPDU 0x04 -#define WIRESHARK_11N_FLAG_STBC 0x08 -#define WIRESHARK_11N_FLAG_SGI 0x10 -#define WIRESHARK_11N_FLAG_BW20U 0x20 -#define WIRESHARK_11N_FLAG_BW20D 0x40 -#define WIRESHARK_11N_FLAG_BW40 0x80 -#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */ - -struct mtk_radiotap_header { - struct ieee80211_radiotap_header rt_hdr; - UCHAR variable[0]; -}; - -#define HT_BW(p) ((p)&IEEE80211_RADIOTAP_MCS_BW_MASK) -#define HT_GI(p) ((p << 2) & IEEE80211_RADIOTAP_MCS_SGI) -#define HT_FORMAT(p) ((p << 3) & IEEE80211_RADIOTAP_MCS_FMT_GF) -#define HT_FEC_TYPE(p) ((p << 4) & IEEE80211_RADIOTAP_MCS_FEC_LDPC) - -#define VHT_MCS_MASK 0x0f -#define GET_VHT_MCS(p) (((p)&VHT_MCS_MASK)) -#define VHT_NSS_MASK (0x03 << 4) -#define GET_VHT_NSS(p) ((((p)&VHT_NSS_MASK) >> 4) + 1) - -/* copy from dot11_base.h, here we duplicate this only for sniffer use! */ -/* 2-byte Frame control field */ -typedef struct GNU_PACKED _FC_FIELD { -#ifdef RT_BIG_ENDIAN - UINT16 Order : 1; /* Strict order expected */ - UINT16 Wep : 1; /* Wep data */ - UINT16 MoreData : 1; /* More data bit */ - UINT16 PwrMgmt : 1; /* Power management bit */ - UINT16 Retry : 1; /* Retry status bit */ - UINT16 MoreFrag : 1; /* More fragment bit */ - UINT16 FrDs : 1; /* From DS indication */ - UINT16 ToDs : 1; /* To DS indication */ - UINT16 SubType : 4; /* MSDU subtype */ - UINT16 Type : 2; /* MSDU type */ - UINT16 Ver : 2; /* Protocol version */ -#else - UINT16 Ver : 2; /* Protocol version */ - UINT16 Type : 2; /* MSDU type, refer to FC_TYPE_XX */ - UINT16 SubType : 4; /* MSDU subtype, refer to SUBTYPE_XXX */ - UINT16 ToDs : 1; /* To DS indication */ - UINT16 FrDs : 1; /* From DS indication */ - UINT16 MoreFrag : 1; /* More fragment bit */ - UINT16 Retry : 1; /* Retry status bit */ - UINT16 PwrMgmt : 1; /* Power management bit */ - UINT16 MoreData : 1; /* More data bit */ - UINT16 Wep : 1; /* Wep data */ - UINT16 Order : 1; /* Strict order expected */ -#endif /* !RT_BIG_ENDIAN */ -} FC_FIELD; - -typedef struct GNU_PACKED _DOT_11_HDR { - FC_FIELD FC; - UINT16 Duration; - UCHAR Addr1[6]; - UCHAR Addr2[6]; - UCHAR Addr3[6]; -#ifdef RT_BIG_ENDIAN - UINT16 Sequence : 12; - UINT16 Frag : 4; -#else - UINT16 Frag : 4; - UINT16 Sequence : 12; -#endif /* !RT_BIG_ENDIAN */ - UCHAR Octet[0]; -} DOT_11_HDR; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_1 { - UINT32 RxDBssidIdx : 6; - UINT32 PayloadFmt : 2; - UINT32 HdrTranslation : 1; - UINT32 HdrOffset : 1; - UINT32 MacHdrLen : 6; - UINT32 ChFreq : 8; - UINT32 Others1 : 8; -} RMAC_1, *PRMAC_1; -#else -typedef struct GNU_PACKED _RMAC_1 { - UINT32 Others1 : 8; - UINT32 ChFreq : 8; - UINT32 MacHdrLen : 6; - UINT32 HdrOffset : 1; - UINT32 HdrTranslation : 1; - UINT32 PayloadFmt : 2; - UINT32 RxDBssidIdx : 6; -} RMAC_1, *PRMAC_1; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_2 { - UINT32 NonAmpduFrm : 1; - UINT32 NonAmpduSfrm : 1; - UINT32 NonDataFrm : 1; - UINT32 NullFrm : 1; - UINT32 FragFrm : 1; - UINT32 Others1 : 9; - UINT32 FcsErr : 1; - UINT32 Others2 : 17; -} RMAC_2, *PRMAC_2; -#else -typedef struct GNU_PACKED _RMAC_2 { - UINT32 Others2 : 17; - UINT32 FcsErr : 1; - UINT32 Others1 : 9; - UINT32 FragFrm : 1; - UINT32 NullFrm : 1; - UINT32 NonDataFrm : 1; - UINT32 NonAmpduSfrm : 1; - UINT32 NonAmpduFrm : 1; -} RMAC_2, *PRMAC_2; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_3 { - UINT32 Others : 24; - UINT32 RxVSeq : 8; -} RMAC_3, *PRMAC_3; -#else -typedef struct GNU_PACKED _RMAC_3 { - UINT32 RxVSeq : 8; - UINT32 Others : 24; -} RMAC_3, *PRMAC_3; -#endif - -typedef struct GNU_PACKED _BASE_STRUCT { - UINT32 RxD0; - struct _RMAC_1 RxD1; - struct _RMAC_2 RxD2; - struct _RMAC_3 RxD3; -} BASE_STRUCT, *PBASE_STRUCT; - -typedef struct GNU_PACKED _GRP1_STRUCT { - UINT32 rxd_8; - UINT32 rxd_9; - UINT32 rxd_10; - UINT32 rxd_11; -} GRP1_STRUCT; - -typedef struct GNU_PACKED _RMAC_12 { - UINT32 Timestamp; -} RMAC_12, *PRMAC_12; - -typedef struct GNU_PACKED _RMAC_13 { - UINT32 Crc; -} RMAC_13, *PRMAC_13; - -typedef struct GNU_PACKED _GRP2_STRUCT { - struct _RMAC_12 rxd_12; - struct _RMAC_13 rxd_13; -} GRP2_STRUCT; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_14 { - UINT32 ACID_DET_UPPER : 1; - UINT32 ACID_DET_LOWER : 1; - UINT32 VHTA2_B8_B3 : 6; - UINT32 NumRx : 2; - UINT32 HtNoSound : 1; - UINT32 HtSmooth : 1; - UINT32 HtShortGi : 1; - UINT32 HtAggregation : 1; - UINT32 VHTA1_B22 : 1; - UINT32 FrMode : 2; - UINT32 TxMode : 3; - UINT32 HtExtltf : 2; - UINT32 HtAdCode : 1; - UINT32 HtStbc : 2; - UINT32 TxRate : 7; -} RMAC_14; -#else -typedef struct GNU_PACKED _RMAC_14 { - UINT32 TxRate : 7; - UINT32 HtStbc : 2; - UINT32 HtAdCode : 1; - UINT32 HtExtltf : 2; - UINT32 TxMode : 3; - UINT32 FrMode : 2; - UINT32 VHTA1_B22 : 1; - UINT32 HtAggregation : 1; - UINT32 HtShortGi : 1; - UINT32 HtSmooth : 1; - UINT32 HtNoSound : 1; - UINT32 NumRx : 2; - UINT32 VHTA2_B8_B3 : 6; - UINT32 ACID_DET_LOWER : 1; - UINT32 ACID_DET_UPPER : 1; -} RMAC_14; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_15 { - UINT32 Others : 5; - UINT32 GroupId : 6; - UINT32 Length : 21; -} RMAC_15; -#else -typedef struct GNU_PACKED _RMAC_15 { - UINT32 Length : 21; - UINT32 GroupId : 6; - UINT32 Others : 5; -} RMAC_15; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_16 { - UINT32 Others : 20; - UINT32 VHTA1_B21_B10 : 12; -} RMAC_16; -#else -typedef struct GNU_PACKED _RMAC_16 { - UINT32 VHTA1_B21_B10 : 12; - UINT32 Others : 20; -} RMAC_16; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_20 { - UINT32 Others1 : 8; - UINT32 VHT_A2 : 2; - UINT32 Others2 : 22; -} RMAC_20; -#else -typedef struct GNU_PACKED _RMAC_20 { - UINT32 Others2 : 22; - UINT32 VHT_A2 : 2; - UINT32 Others1 : 8; -} RMAC_20; -#endif - -typedef struct GNU_PACKED _GRP3_STRUCT { - struct _RMAC_14 rxd_14; - struct _RMAC_15 rxd_15; - struct _RMAC_16 rxd_16; - UINT32 rxd_17; - UINT32 rxd_18; - UINT32 rxd_19; - struct _RMAC_20 rxd_20; -} GRP3_STRUCT; - -typedef struct GNU_PACKED _RMAC_STRUCT { - struct _BASE_STRUCT RxRMACBase; - struct _GRP1_STRUCT RxRMACGrp1; - struct _GRP2_STRUCT RxRMACGrp2; - struct _GRP3_STRUCT RxRMACGrp3; -} RMAC_STRUCT; - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/spectrum.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/spectrum.h deleted file mode 100644 index acd9e45562..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/spectrum.h +++ /dev/null @@ -1,194 +0,0 @@ - -#ifndef __SPECTRUM_H__ -#define __SPECTRUM_H__ - -#include "rtmp_type.h" -#include "spectrum_def.h" - -UINT8 GetRegulatoryMaxTxPwr(IN PRTMP_ADAPTER pAd, IN UINT8 channel, - IN struct wifi_dev *wdev); - -CHAR RTMP_GetTxPwr(IN PRTMP_ADAPTER pAd, IN HTTRANSMIT_SETTING HTTxMode, - IN UCHAR Channel, IN struct wifi_dev *wdev); - -UINT8 GetMaxTxPwr(IN PRTMP_ADAPTER pAd); - -/* - ========================================================================== - Description: - Prepare Measurement request action frame and enqueue it into - management queue waiting for transmition. - - Parametrs: - 1. the destination mac address of the frame. - - Return : None. - ========================================================================== - */ -VOID MakeMeasurementReqFrame(IN PRTMP_ADAPTER pAd, OUT PUCHAR pOutBuffer, - OUT PULONG pFrameLen, IN UINT8 TotalLen, - IN UINT8 Category, IN UINT8 Action, - IN UINT8 MeasureToken, IN UINT8 MeasureReqMode, - IN UINT8 MeasureReqType, - IN UINT16 NumOfRepetitions); - -/* - ========================================================================== - Description: - Prepare Measurement report action frame and enqueue it into - management queue waiting for transmition. - - Parametrs: - 1. the destination mac address of the frame. - - Return : None. - ========================================================================== - */ -VOID EnqueueMeasurementRep(IN PRTMP_ADAPTER pAd, IN PUCHAR pDA, - IN UINT8 DialogToken, IN UINT8 MeasureToken, - IN UINT8 MeasureReqMode, IN UINT8 MeasureReqType, - IN UINT8 ReportInfoLen, IN PUINT8 pReportInfo); - -/* - ========================================================================== - Description: - Prepare TPC Request action frame and enqueue it into - management queue waiting for transmition. - - Parametrs: - 1. the destination mac address of the frame. - - Return : None. - ========================================================================== - */ -VOID EnqueueTPCReq(IN PRTMP_ADAPTER pAd, IN PUCHAR pDA, IN UCHAR DialogToken); - -/* - ========================================================================== - Description: - Prepare TPC Report action frame and enqueue it into - management queue waiting for transmition. - - Parametrs: - 1. the destination mac address of the frame. - - Return : None. - ========================================================================== - */ -VOID EnqueueTPCRep(IN PRTMP_ADAPTER pAd, IN PUCHAR pDA, IN UINT8 DialogToken, - IN UINT8 TxPwr, IN UINT8 LinkMargin); - -#ifdef WDS_SUPPORT -/* - ========================================================================== - Description: - Prepare Channel Switch Announcement action frame and enqueue it into - management queue waiting for transmition. - - Parametrs: - 1. the destination mac address of the frame. - 2. Channel switch announcement mode. - 2. a New selected channel. - - Return : None. - ========================================================================== - */ -VOID EnqueueChSwAnn(IN PRTMP_ADAPTER pAd, IN PUCHAR pDA, IN UINT8 ChSwMode, - IN UINT8 NewCh); -#endif /* WDS_SUPPORT */ - -/* - ========================================================================== - Description: - Spectrun action frames Handler such as channel switch annoucement, - measurement report, measurement request actions frames. - - Parametrs: - Elme - MLME message containing the received frame - - Return : None. - ========================================================================== - */ -VOID PeerSpectrumAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -/* - ========================================================================== - Description: - - Parametrs: - - Return : None. - ========================================================================== - */ -INT Set_MeasureReq_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TpcReq_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TpcReqByAddr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_PwrConstraint(RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef TPC_SUPPORT -INT Set_TpcCtrl_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -INT Set_TpcEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* TPC_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT -INT Set_VoPwrConsTest(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* DOT11K_RRM_SUPPORT */ - -NDIS_STATUS MeasureReqTabInit(IN PRTMP_ADAPTER pAd); - -VOID MeasureReqTabExit(IN PRTMP_ADAPTER pAd); - -PMEASURE_REQ_ENTRY MeasureReqLookUp(IN PRTMP_ADAPTER pAd, IN UINT8 DialogToken); - -PMEASURE_REQ_ENTRY MeasureReqInsert(IN PRTMP_ADAPTER pAd, IN UINT8 DialogToken); - -VOID MeasureReqDelete(IN PRTMP_ADAPTER pAd, IN UINT8 DialogToken); - -VOID InsertChannelRepIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN RTMP_STRING *pCountry, - IN UINT8 RegulatoryClass, IN UINT8 *ChReptList, - IN UCHAR PhyMode, IN UINT8 IfIdx); - -VOID InsertBcnReportIndicationReqIE(IN RTMP_ADAPTER *pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 Data); - -VOID InsertTpcReportIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 TxPwr, - IN UINT8 LinkMargin); - -VOID InsertDialogToken(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PULONG pFrameLen, IN UINT8 DialogToken); - -NDIS_STATUS TpcReqTabInit(IN PRTMP_ADAPTER pAd); - -VOID TpcReqTabExit(IN PRTMP_ADAPTER pAd); - -VOID NotifyChSwAnnToPeerAPs(IN PRTMP_ADAPTER pAd, IN PUCHAR pRA, IN PUCHAR pTA, - IN UINT8 ChSwMode, IN UINT8 Channel); - -VOID RguClass_BuildBcnChList(IN PRTMP_ADAPTER pAd, OUT PUCHAR pBuf, - OUT PULONG pBufLen, IN struct wifi_dev *wdev, - IN UCHAR RegClass); -#ifdef CUSTOMER_DCC_FEATURE -INT NotifyChSwAnnToConnectedSTAs(IN PRTMP_ADAPTER pAd, IN UINT8 ChSwMode, - IN UINT8 OriChannel, IN UINT8 Channel, - struct wifi_dev *wdev); - -VOID EnqueueChSwAnnNew(IN PRTMP_ADAPTER pAd, IN PUCHAR pDA, IN UINT8 ChSwMode, - IN UINT8 NewCh, IN PUCHAR pSA, struct wifi_dev *wdev); -#endif - -#ifdef CONFIG_RCSA_SUPPORT -INT NotifyChSwAnnToBackhaulAP(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - IN UINT8 Channel, IN UINT8 ChSwMode); - -INT ApCliPeerCsaSanity(IN MLME_QUEUE_ELEM *Elem, OUT CSA_IE_INFO *CsaInfo); - -VOID ChannelSwitchAction_1(IN RTMP_ADAPTER *pAd, IN CSA_IE_INFO *CsaInfo); - -VOID RcsaRecovery(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev); - -#endif -#endif /* __SPECTRUM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/spectrum_def.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/spectrum_def.h deleted file mode 100644 index 7af205897c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/spectrum_def.h +++ /dev/null @@ -1,242 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - spectrum_def.h - - Abstract: - Handle association related requests either from WSTA or from local MLME - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - Fonchi Wu 2008 created for 802.11h - */ - -#ifndef __SPECTRUM_DEF_H__ -#define __SPECTRUM_DEF_H__ - -#define MAX_MEASURE_REQ_TAB_SIZE 32 -/* Size of hash tab must be power of 2. */ -#define MAX_HASH_MEASURE_REQ_TAB_SIZE MAX_MEASURE_REQ_TAB_SIZE - -#define MAX_TPC_REQ_TAB_SIZE 32 -/* Size of hash tab must be power of 2. */ -#define MAX_HASH_TPC_REQ_TAB_SIZE MAX_TPC_REQ_TAB_SIZE - -#define MIN_RCV_PWR 100 /* Negative value ((dBm) */ - -#define TPC_REQ_AGE_OUT 500 /* ms */ -#define MQ_REQ_AGE_OUT 500 /* ms */ - -#define TPC_DIALOGTOKEN_HASH_INDEX(_DialogToken) \ - ((_DialogToken) & (MAX_HASH_TPC_REQ_TAB_SIZE - 1)) -#define MQ_DIALOGTOKEN_HASH_INDEX(_DialogToken) \ - ((_DialogToken) & (MAX_MEASURE_REQ_TAB_SIZE - 1)) - -typedef enum { REG_LOCAL, REG_GLOBAL } REG_DOMAIN; - -typedef struct _MEASURE_REQ_ENTRY { - struct _MEASURE_REQ_ENTRY *pNext; - ULONG lastTime; - BOOLEAN Valid; - UINT8 DialogToken; - UINT8 MeasureDialogToken - [3]; /* 0:basic measure, 1: CCA measure, 2: RPI_Histogram measure. */ -#ifdef CONFIG_11KV_API_SUPPORT - BOOLEAN skip_time_check; - UINT8 CurrentState; - void *Priv; - RALINK_TIMER_STRUCT WaitNRRspTimer; - UINT8 StaMac[MAC_ADDR_LEN]; - UCHAR ControlIndex; - RALINK_TIMER_STRUCT WaitBCNRepTimer; -#endif -} MEASURE_REQ_ENTRY, *PMEASURE_REQ_ENTRY; - -typedef struct _MEASURE_REQ_TAB { - UCHAR Size; - PMEASURE_REQ_ENTRY Hash[MAX_HASH_MEASURE_REQ_TAB_SIZE]; - MEASURE_REQ_ENTRY Content[MAX_MEASURE_REQ_TAB_SIZE]; -} MEASURE_REQ_TAB, *PMEASURE_REQ_TAB; - -typedef struct _TPC_REQ_ENTRY { - struct _TPC_REQ_ENTRY *pNext; - ULONG lastTime; - BOOLEAN Valid; - UINT8 DialogToken; -} TPC_REQ_ENTRY, *PTPC_REQ_ENTRY; - -typedef struct _TPC_REQ_TAB { - UCHAR Size; - PTPC_REQ_ENTRY Hash[MAX_HASH_TPC_REQ_TAB_SIZE]; - TPC_REQ_ENTRY Content[MAX_TPC_REQ_TAB_SIZE]; -} TPC_REQ_TAB, *PTPC_REQ_TAB; - -/* The regulatory information */ -typedef struct _DOT11_CHANNEL_SET { - UCHAR NumberOfChannels; - UINT8 MaxTxPwr; - UCHAR ChannelList[16]; -} DOT11_CHANNEL_SET; - -typedef struct _DOT11_REGULATORY_INFO { - UCHAR RegulatoryClass; - DOT11_CHANNEL_SET ChannelSet; -} DOT11_REGULATORY_INFO; - -#define RM_TPC_REQ 0 -#define RM_MEASURE_REQ 1 - -#define RM_BASIC 0 -#define RM_CCA 1 -#define RM_RPI_HISTOGRAM 2 -#define RM_CH_LOAD 3 -#define RM_NOISE_HISTOGRAM 4 - -typedef struct GNU_PACKED _TPC_REPORT_INFO { - INT8 TxPwr; - INT8 LinkMargin; -} TPC_REPORT_INFO, *PTPC_REPORT_INFO; - -typedef struct GNU_PACKED _CH_SW_ANN_INFO { - UINT8 ChSwMode; - UINT8 Channel; - UINT8 ChSwCnt; -} CH_SW_ANN_INFO, *PCH_SW_ANN_INFO; - -#ifdef CONFIG_RCSA_SUPPORT -typedef struct GNU_PACKED _EXT_CH_SW_ANN_INFO { - UINT8 ChSwMode; - UINT8 RegClass; - UINT8 Channel; - UINT8 ChSwCnt; -} EXT_CH_SW_ANN_INFO, *PEXT_CH_SW_ANN_INFO; -#endif - -typedef union GNU_PACKED _MEASURE_REQ_MODE { -#ifdef RT_BIG_ENDIAN - struct GNU_PACKED { - UINT8 Reserved : 3; - UINT8 DurationMandatory : 1; - UINT8 Report : 1; - UINT8 Request : 1; - UINT8 Enable : 1; - UINT8 Parallel : 1; - } field; -#else - struct GNU_PACKED { - UINT8 Parallel : 1; - UINT8 Enable : 1; - UINT8 Request : 1; - UINT8 Report : 1; - UINT8 DurationMandatory : 1; - UINT8 Reserved : 3; - } field; -#endif /* RT_BIG_ENDIAN */ - UINT8 word; -} MEASURE_REQ_MODE, *PMEASURE_REQ_MODE; - -typedef struct GNU_PACKED _MEASURE_REQ { - UINT8 ChNum; - UINT64 MeasureStartTime; - UINT16 MeasureDuration; -} MEASURE_REQ, *PMEASURE_REQ; - -typedef struct GNU_PACKED _MEASURE_REQ_INFO { - UINT8 Token; - MEASURE_REQ_MODE ReqMode; - UINT8 ReqType; - UINT8 Oct[0]; -} MEASURE_REQ_INFO, *PMEASURE_REQ_INFO; - -typedef union GNU_PACKED _MEASURE_BASIC_REPORT_MAP { -#ifdef RT_BIG_ENDIAN - struct GNU_PACKED { - UINT8 Rev : 3; - - UINT8 Unmeasure : 1; - UINT8 Radar : 1; - UINT8 UnidentifiedSignal : 1; - UINT8 OfdmPreamble : 1; - UINT8 BSS : 1; - } field; -#else - struct GNU_PACKED { - UINT8 BSS : 1; - - UINT8 OfdmPreamble : 1; - UINT8 UnidentifiedSignal : 1; - UINT8 Radar : 1; - UINT8 Unmeasure : 1; - UINT8 Rev : 3; - } field; -#endif /* RT_BIG_ENDIAN */ - UINT8 word; -} MEASURE_BASIC_REPORT_MAP, *PMEASURE_BASIC_REPORT_MAP; - -typedef struct GNU_PACKED _MEASURE_BASIC_REPORT { - UINT8 ChNum; - UINT64 MeasureStartTime; - UINT16 MeasureDuration; - MEASURE_BASIC_REPORT_MAP Map; -} MEASURE_BASIC_REPORT, *PMEASURE_BASIC_REPORT; - -typedef struct GNU_PACKED _MEASURE_CCA_REPORT { - UINT8 ChNum; - UINT64 MeasureStartTime; - UINT16 MeasureDuration; - UINT8 CCA_Busy_Fraction; -} MEASURE_CCA_REPORT, *PMEASURE_CCA_REPORT; - -typedef struct GNU_PACKED _MEASURE_RPI_REPORT { - UINT8 ChNum; - UINT64 MeasureStartTime; - UINT16 MeasureDuration; - UINT8 RPI_Density[8]; -} MEASURE_RPI_REPORT, *PMEASURE_RPI_REPORT; - -typedef union GNU_PACKED _MEASURE_REPORT_MODE { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UINT8 Rev : 5; - UINT8 Refused : 1; - UINT8 Incapable : 1; - UINT8 Late : 1; -#else - UINT8 Late : 1; - UINT8 Incapable : 1; - UINT8 Refused : 1; - UINT8 Rev : 5; -#endif /* RT_BIG_ENDIAN */ - } field; - UINT8 word; -} MEASURE_REPORT_MODE, *PMEASURE_REPORT_MODE; - -typedef struct GNU_PACKED _MEASURE_REPORT_INFO { - UINT8 Token; - UINT8 ReportMode; - UINT8 ReportType; - UINT8 Octect[0]; -} MEASURE_REPORT_INFO, *PMEASURE_REPORT_INFO; - -typedef struct GNU_PACKED _QUIET_INFO { - UINT8 QuietCnt; - UINT8 QuietPeriod; - UINT16 QuietDuration; - UINT16 QuietOffset; -} QUIET_INFO, *PQUIET_INFO; - -#endif /* __SPECTRUM_DEF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sta.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sta.h deleted file mode 100644 index 8b3e802191..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sta.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - sta.h - - Abstract: - Miniport generic portion header file - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __STA_H__ -#define __STA_H__ - -#define STA_NO_SECURITY_ON(_p) \ - (IS_CIPHER_NONE(_p->StaCfg[0].wdev.SecConfig.PairwiseCipher)) -#define STA_WEP_ON(_p) \ - (IS_CIPHER_WEP(_p->StaCfg[0].wdev.SecConfig.PairwiseCipher)) -#define STA_TKIP_ON(_p) \ - (IS_CIPHER_TKIP(_p->StaCfg[0].wdev.SecConfig.PairwiseCipher)) -#define STA_AES_ON(_p) \ - (IS_CIPHER_CCMP128(_p->StaCfg[0].wdev.SecConfig.PairwiseCipher)) - -#define STA_TGN_WIFI_ON(_p) (_p->StaCfg[0].bTGnWifiTest == TRUE) - -#define CKIP_KP_ON(_p) \ - ((((_p)->StaCfg[0].CkipFlag) & 0x10) && \ - ((_p)->StaCfg[0].bCkipCmicOn == TRUE)) -#define CKIP_CMIC_ON(_p) \ - ((((_p)->StaCfg[0].CkipFlag) & 0x08) && \ - ((_p)->StaCfg[0].bCkipCmicOn == TRUE)) - -#define STA_EXTRA_SETTING(_pAd) -#ifdef DOT11R_FT_SUPPORT -#undef STA_EXTRA_SETTING -#define STA_EXTRA_SETTING(_pAd) \ - { \ - if ((_pAd)->StaCfg[0].Dot11RCommInfo.bFtSupport && \ - (_pAd)->MlmeAux.MdIeInfo.Len && \ - (_pAd)->StaCfg[0].AuthMode == Ndis802_11AuthModeWPA2PSK) \ - (_pAd)->StaCfg[0].Dot11RCommInfo.bInMobilityDomain = \ - TRUE; \ - } -#endif /* DOT11R_FT_SUPPORT */ - -#define STA_PORT_SECURED(_pAd) \ - { \ - BOOLEAN Cancelled; \ - struct wifi_dev *pwdev = &((_pAd)->StaCfg[0].wdev); \ - PSTA_ADMIN_CONFIG pStaCfg = GetStaCfgByWdev(_pAd, pwdev); \ - MAC_TABLE_ENTRY *pMEntry = NULL; \ - pMEntry = GetAssociatedAPByWdev(_pAd, pwdev); \ - pwdev->PortSecured = WPA_802_1X_PORT_SECURED; \ - RTMP_IndicateMediaState(_pAd, NdisMediaStateConnected); \ - NdisAcquireSpinLock(&((_pAd)->MacTabLock)); \ - (_pAd)->MacTab.tr_entry[pMEntry->wcid].PortSecured = \ - pwdev->PortSecured; \ - pMEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; \ - NdisReleaseSpinLock(&(_pAd)->MacTabLock); \ - RTMPCancelTimer(&(pStaCfg->LinkDownTimer), &Cancelled); \ - STA_EXTRA_SETTING(_pAd); \ - } - -BOOLEAN RTMPCheckChannel(RTMP_ADAPTER *pAd, UCHAR CentralCh, UCHAR Ch, - struct wifi_dev *wdev); - -VOID InitChannelRelatedValue(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -VOID AdjustChannelRelatedValue(IN PRTMP_ADAPTER pAd, OUT UCHAR *pBwFallBack, - IN USHORT ifIndex, IN BOOLEAN BandWidth, - IN UCHAR PriCh, IN UCHAR ExtraCh, - IN struct wifi_dev *wdev); - -VOID RTMPReportMicError(IN PRTMP_ADAPTER pAd, IN PSTA_ADMIN_CONFIG pStaCfg, - IN PCIPHER_KEY pWpaKey); - -VOID WpaMicFailureReportFrame(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID WpaDisassocApAndBlockAssoc(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); - -VOID WpaStaPairwiseKeySetting(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID WpaStaGroupKeySetting(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID WpaSendEapolStart(RTMP_ADAPTER *pAd, UCHAR *pBssid, struct wifi_dev *wdev); - -INT sta_tx_pkt_handle(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT sta_ampdu_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT sta_amsdu_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT sta_legacy_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT sta_frag_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *pTxBlk); -INT sta_mlme_mgmtq_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *tx_blk); -INT sta_mlme_dataq_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, TX_BLK *tx_blk); -VOID sta_ieee_802_11_data_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk); -VOID sta_ieee_802_3_data_tx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk); -INT sta_ieee_802_3_data_rx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - RX_BLK *pRxBlk, MAC_TABLE_ENTRY *pEntry); -INT sta_ieee_802_11_data_rx(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - RX_BLK *pRxBlk, MAC_TABLE_ENTRY *pEntry); -INT sta_tx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pPacket); -VOID sta_find_cipher_algorithm(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - TX_BLK *pTxBlk); -BOOLEAN sta_dev_rx_mgmt_frm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - MAC_TABLE_ENTRY *pEntry); -INT adhoc_link_up(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT sta_inf_open(struct wifi_dev *wdev); -INT sta_inf_close(struct wifi_dev *wdev); -UINT32 bssinfo_sta_feature_decision(struct wifi_dev *wdev, UCHAR wcid, - UINT32 *feature); - -INT StaAllowToSendPacket_new(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN PNDIS_PACKET pPacket, IN UCHAR *pWcid); - -INT sta_rx_fwd_hnd(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, PNDIS_PACKET pkt); - -INT sta_func_init(RTMP_ADAPTER *pAd); - -INT STAInitialize(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -VOID rtmp_sta_init(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); - -VOID RTMPStaCfgRadioCtrlFromEEPROM(RTMP_ADAPTER *pAd, - EEPROM_NIC_CONFIG2_STRUC NicConfig2); - -VOID MSTA_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps); -VOID MSTA_Remove(RTMP_ADAPTER *pAd); -VOID MSTAStop(RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID sta_deauth_act(struct wifi_dev *wdev); - -#endif /* __STA_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sta_cfg.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sta_cfg.h deleted file mode 100644 index 5ca4749705..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/sta_cfg.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - sta_cfg.h - - Abstract: - - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - -*/ - -#ifndef __STA_CFG_H__ -#define __STA_CFG_H__ - -INT RTMPSTAPrivIoctlSet(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *SetProcName, - IN RTMP_STRING *ProcArg); - -#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || \ - defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) -/* set WOW enable */ -INT Set_WOW_Enable(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* set GPIO pin for wake-up signal */ -INT Set_WOW_GPIO(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* set delay time for WOW really enable */ -INT Set_WOW_Delay(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* set wake up hold time */ -INT Set_WOW_Hold(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* set wakeup signal type */ -INT Set_WOW_InBand(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* set wakeup interface */ -INT Set_WOW_Interface(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* set wow if down support */ -INT Set_WOW_IfDown_Support(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* set IPAdress for ARP response */ -INT Set_WOW_IPAddress(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -/* set wakeup GPIO High Low */ -INT Set_WOW_GPIOHighLow(RTMP_ADAPTER *pAd, RTMP_STRING *arg); -#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) */ - -#endif /* __STA_CFG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tm.h deleted file mode 100644 index 89546f42cc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tm.h +++ /dev/null @@ -1,53 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __TM_H__ -#define __TM_H__ - -enum task_type { - TX_DEQ_TASK, - CMD_MSG_TASK, - TX_DONE_TASK, - RX_DONE_TASK, - RX1_DONE_TASK, - ERROR_RECOVERY_TASK, - FW_OWN_TASK, -#ifdef MULTI_LAYER_INTERRUPT - SUBSYS_INT_TASK, -#endif - TR_DONE_TASK, -}; - -/** - * @init: tm resource initialization - * @exit: tm resource exit - * @schedule_task: schedule task to coressponding tm according to task type - * @schedule_task_on: schedule task to coressponding tm and specific cpu according to task type - */ -struct tm_ops { - INT (*init)(struct _RTMP_ADAPTER *pAd); - INT (*exit)(struct _RTMP_ADAPTER *pAd); - INT (*schedule_task)(struct _RTMP_ADAPTER *pAd, enum task_type type); - INT(*schedule_task_on) - (struct _RTMP_ADAPTER *pAd, INT cpu, enum task_type type); -} ____cacheline_aligned; - -INT tm_init(struct _RTMP_ADAPTER *pAd); -INT tm_exit(struct _RTMP_ADAPTER *pAd); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tr.h deleted file mode 100644 index bd65aa8789..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tr.h +++ /dev/null @@ -1,143 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __TR_H__ -#define __TR_H__ - -struct tx_delay_control { - RALINK_TIMER_STRUCT que_agg_timer; - BOOLEAN que_agg_timer_running; - BOOLEAN que_agg_en; - BOOLEAN force_deq; -#define TX_BATCH_CNT 4 - UINT32 tx_process_batch_cnt; -#define MIN_AGG_PKT_LEN 58 -#define MAX_AGG_PKT_LEN 135 -#define MAX_AGG_EN_TP 700 -#define MIN_AGG_EN_TP 50 - UINT32 min_pkt_len; - UINT32 max_pkt_len; -#define QUE_AGG_TIMEOUT 4000 - UINT32 que_agg_timeout_value; -}; - -struct dly_ctl_cfg { - UINT32 avg_tp; - UINT32 dly_cfg; -}; - -struct tr_delay_control { - RALINK_TIMER_STRUCT rx_delay_timer; - BOOLEAN rx_delay_timer_running; - BOOLEAN rx_delay_en; - struct dly_ctl_cfg *dl_rx_dly_ctl_tbl; - UINT32 dl_rx_dly_ctl_tbl_size; - struct dly_ctl_cfg *ul_rx_dly_ctl_tbl; - UINT32 ul_rx_dly_ctl_tbl_size; - BOOLEAN tx_delay_en; -}; - -#define TP_DBG_TIME_SLOT_NUMS 10 -struct tp_debug { - UINT32 IsrTxDlyCnt; - UINT32 IsrTxDlyCntRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IsrTxCnt; - UINT32 IsrTxCntRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IsrRxDlyCnt; - UINT32 IsrRxDlyCntRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IsrRxCnt; - UINT32 IsrRxCntRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IsrRx1Cnt; - UINT32 IsrRx1CntRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IoReadTx; - UINT32 IoReadTxRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IoWriteTx; - UINT32 IoWriteTxRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IoReadRx; - UINT32 IoReadRxRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IoReadRx1; - UINT32 IoReadRx1Rec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IoWriteRx; - UINT32 IoWriteRxRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 IoWriteRx1; - UINT32 IoWriteRx1Rec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 MaxProcessCntRx; - UINT32 MaxProcessCntRxRec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 MaxProcessCntRx1; - UINT32 MaxProcessCntRx1Rec[TP_DBG_TIME_SLOT_NUMS]; - UINT32 RxMaxProcessCntA; - UINT32 MaxProcessCntRxRecA[TP_DBG_TIME_SLOT_NUMS]; - UINT32 RxMaxProcessCntB; - UINT32 MaxProcessCntRxRecB[TP_DBG_TIME_SLOT_NUMS]; - UINT32 RxMaxProcessCntC; - UINT32 MaxProcessCntRxRecC[TP_DBG_TIME_SLOT_NUMS]; - UINT32 RxMaxProcessCntD; - UINT32 MaxProcessCntRxRecD[TP_DBG_TIME_SLOT_NUMS]; - UINT32 Rx1MaxProcessCntA; - UINT32 MaxProcessCntRx1RecA[TP_DBG_TIME_SLOT_NUMS]; - UINT32 Rx1MaxProcessCntB; - UINT32 MaxProcessCntRx1RecB[TP_DBG_TIME_SLOT_NUMS]; - UINT32 Rx1MaxProcessCntC; - UINT32 MaxProcessCntRx1RecC[TP_DBG_TIME_SLOT_NUMS]; - UINT32 Rx1MaxProcessCntD; - UINT32 MaxProcessCntRx1RecD[TP_DBG_TIME_SLOT_NUMS]; - UINT32 RxDropPacket; - UINT16 time_slot; - RALINK_TIMER_STRUCT tp_dbg_history_timer; -}; - -struct tr_flow_control { - UINT8 *TxFlowBlockState; - NDIS_SPIN_LOCK *TxBlockLock; - DL_LIST *TxBlockDevList; - BOOLEAN IsTxBlocked; - UINT8 RxFlowBlockState; -}; - -struct tx_rx_ctl { - struct tr_flow_control tr_flow_ctl; - struct tx_delay_control tx_delay_ctl; - UINT32 tx_sw_q_drop; - UINT32 net_if_stop_cnt; -#ifdef CONFIG_TP_DBG - struct tp_debug tp_dbg; -#endif - struct tr_delay_control tr_delay_ctl; - UINT32 rx_icv_err_cnt; -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS - ULONG total_int_count; - ULONG rx_data_int_count; - ULONG rx_cmd_int_count; -#endif -}; - -struct _RTMP_ADAPTER; - -enum { - NO_ENOUGH_SWQ_SPACE = (1 << 0), -}; - -INT32 tr_ctl_init(struct _RTMP_ADAPTER *pAd); -INT32 tr_ctl_exit(struct _RTMP_ADAPTER *pAd); -BOOLEAN tx_flow_check_state(struct _RTMP_ADAPTER *pAd, UINT8 State, - UINT8 RingIdx); -INT32 tx_flow_block(struct _RTMP_ADAPTER *pAd, PNET_DEV NetDev, UINT8 State, - BOOLEAN Block, UINT8 RingIdx); -INT32 tx_flow_set_state_block(struct _RTMP_ADAPTER *pAd, PNET_DEV NetDev, - UINT8 State, BOOLEAN Block, UINT8 RingIdx); -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tx_power.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tx_power.h deleted file mode 100644 index 10ee036aea..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/tx_power.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifndef __TX_PWR_H__ -#define __TX_PWR_H__ - -#ifdef MT_MAC -#include "eeprom/mt_tx_pwr.h" -#endif - -#define DEFAULT_BO 4 -#define LIN2DB_ERROR_CODE (-10000) - -#define G_BAND_LOW 0 -#define G_BAND_MID 1 -#define G_BAND_HI 2 - -#define A_BAND_LOW 0 -#define A_BAND_HI 1 - -#ifdef SINGLE_SKU_V2 -#define SKU_PHYMODE_CCK_1M_2M 0 -#define SKU_PHYMODE_CCK_5M_11M 1 -#define SKU_PHYMODE_OFDM_6M_9M 2 -#define SKU_PHYMODE_OFDM_12M_18M 3 -#define SKU_PHYMODE_OFDM_24M_36M 4 -#define SKU_PHYMODE_OFDM_48M_54M 5 -#define SKU_PHYMODE_HT_MCS0_MCS1 6 -#define SKU_PHYMODE_HT_MCS2_MCS3 7 -#define SKU_PHYMODE_HT_MCS4_MCS5 8 -#define SKU_PHYMODE_HT_MCS6_MCS7 9 -#define SKU_PHYMODE_HT_MCS8_MCS9 10 -#define SKU_PHYMODE_HT_MCS10_MCS11 11 -#define SKU_PHYMODE_HT_MCS12_MCS13 12 -#define SKU_PHYMODE_HT_MCS14_MCS15 13 -#define SKU_PHYMODE_STBC_MCS0_MCS1 14 -#define SKU_PHYMODE_STBC_MCS2_MCS3 15 -#define SKU_PHYMODE_STBC_MCS4_MCS5 16 -#define SKU_PHYMODE_STBC_MCS6_MCS7 17 -#endif /* SINGLE_SKU_V2 */ - -VOID LoadTssiInfoFromEEPROM(struct _RTMP_ADAPTER *pAd); -INT32 get_low_mid_hi_index(UINT8 Channel); -#endif /* __TX_PWR_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/uapsd.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/uapsd.h deleted file mode 100644 index 6a89aeb811..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/uapsd.h +++ /dev/null @@ -1,693 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - All related WMM UAPSD definitions & function prototype. - -***************************************************************************/ - -/* only for UAPSD_TIMING_RECORD */ - -#ifndef __UAPSD_H__ -#define __UAPSD_H__ - -struct uapsd_config; - -#define UAPSD_TIMING_RECORD_MAX 1000 -#define UAPSD_TIMING_RECORD_DISPLAY_TIMES 10 - -#define UAPSD_QUEUE_TIMEOUT 5 /* unit: seconds */ - -#define UAPSD_TIMING_RECORD_ISR 1 -#define UAPSD_TIMING_RECORD_TASKLET 2 -#define UAPSD_TIMING_RECORD_TRG_RCV 3 -#define UAPSD_TIMING_RECORD_MOVE2TX 4 -#define UAPSD_TIMING_RECORD_TX2AIR 5 - -#define UAPSD_TIMING_CTRL_STOP 0 -#define UAPSD_TIMING_CTRL_START 1 -#define UAPSD_TIMING_CTRL_SUSPEND 2 - -#ifdef UAPSD_TIMING_RECORD_FUNC -#define UAPSD_TIMING_RECORD_START() \ - UAPSD_TimingRecordCtrl(UAPSD_TIMING_CTRL_START); -#define UAPSD_TIMING_RECORD_STOP() \ - UAPSD_TimingRecordCtrl(UAPSD_TIMING_CTRL_STOP); -#define UAPSD_TIMING_RECORD(__pAd, __Type) UAPSD_TimingRecord(__pAd, __Type); -#define UAPSD_TIMING_RECORD_INDEX(__LoopIndex) \ - UAPSD_TimeingRecordLoopIndex(__LoopIndex); -#else - -#define UAPSD_TIMING_RECORD_START() -#define UAPSD_TIMING_RECORD_STOP() -#define UAPSD_TIMING_RECORD(__pAd, __type) -#define UAPSD_TIMING_RECORD_INDEX(__LoopIndex) -#endif /* UAPSD_TIMING_RECORD_FUNC */ - -VOID uapsd_config_get(struct wifi_dev *wdev, struct uapsd_config *cfg); - -/* timing */ -#define UAPSD_TIMESTAMP_GET(__pAd, __TimeStamp) \ - { \ - UINT32 tsf_l = 0, tsf_h = 0; \ - UINT64 __Value64; \ - AsicGetTsfTime((__pAd), &tsf_h, &tsf_l); \ - __TimeStamp = (UINT64)tsf_l; \ - __Value64 = (UINT64)tsf_h; \ - __TimeStamp |= (tsf_h << 32); \ - } - -#define UAPSD_TIME_GET(__pAd, __Time) \ - { \ - NdisGetSystemUpTime(&__Time); \ - } - -/* uapsd initialization */ -#define UAPSD_INFO_INIT(__pInfo) \ - { \ - (__pInfo)->bAPSDCapable = FALSE; \ - } - -#define UAPSD_SP_START(__pAd, __pEntry) (__pEntry->bAPSDFlagSPStart = 1) - -/* for AP, we maybe sleep until all SPs are closed */ -#define UAPSD_SP_END(__pAd, __pEntry) (__pEntry->bAPSDFlagSPStart = 0) - -/* recover the peer power save mode virtually */ -#define RTMP_PS_VIRTUAL_SLEEP(__pMacEntry) \ - { \ - __pMacEntry->FlgPsModeIsWakeForAWhile = FALSE; \ - __pMacEntry->VirtualTimeout = 0; \ - MTWF_LOG( \ - DBG_CAT_PS, CATPS_UAPSD, DBG_LVL_TRACE, \ - ("%02x:%02x:%02x:%02x:%02x:%02x can sleep (ps mode = %d)!\n", \ - PRINT_MAC(__pMacEntry->Addr), __pMacEntry->PsMode)); \ - } - -/* check if the peer virtual ps mode timeout */ -#define RTMP_PS_VIRTUAL_TIMEOUT_HANDLE(__pMacEntry) \ - { \ - if (__pMacEntry->VirtualTimeout > 0) { \ - __pMacEntry->VirtualTimeout--; \ - if (__pMacEntry->VirtualTimeout == 0) { \ - MTWF_LOG( \ - DBG_CAT_PS, CATPS_UAPSD, \ - DBG_LVL_TRACE, \ - ("tdls uapsd> virtual ps timeout!\n")); \ - RTMP_PS_VIRTUAL_SLEEP(__pMacEntry); \ - } \ - } \ - } - -/* extern MACRO & function */ -#ifndef MODULE_WMM_UAPSD - -#define UAPSD_EXTERN extern - -/* Public Marco list */ - -/* - Init some parameters in packet structure for QoS Null frame; - purpose: is for management frame tx done use -*/ -#define UAPSD_MR_QOS_NULL_HANDLE(__pAd, __pData, __pPacket) \ - { \ - PHEADER_802_11 __pHeader = (PHEADER_802_11)(__pData); \ - MAC_TABLE_ENTRY *__pEntry; \ - if (__pHeader->FC.SubType == SUBTYPE_QOS_NULL) { \ - RTMP_SET_PACKET_QOS_NULL((__pPacket)); \ - __pEntry = MacTableLookup((__pAd), __pHeader->Addr1); \ - if (__pEntry != NULL) \ - RTMP_SET_PACKET_WCID((__pPacket), \ - __pEntry->wcid); \ - } else \ - RTMP_SET_PACKET_NON_QOS_NULL((__pPacket)); \ - } - -/* - Init MAC entry UAPSD parameters; - purpose: initialize UAPSD PS queue and control parameters -*/ -#define UAPSD_MR_ENTRY_INIT(__pEntry) \ - { \ - UINT16 __IdAc; \ - for (__IdAc = 0; __IdAc < WMM_NUM_OF_AC; __IdAc++) \ - InitializeQueueHeader( \ - &(__pEntry)->UAPSDQueue[__IdAc]); \ - (__pEntry)->UAPSDTxNum = 0; \ - (__pEntry)->pUAPSDEOSPFrame = NULL; \ - (__pEntry)->bAPSDFlagSPStart = 0; \ - (__pEntry)->bAPSDFlagEOSPOK = 0; \ - (__pEntry)->MaxSPLength = 0; \ - MTWF_LOG(DBG_CAT_PS, CATPS_UAPSD, DBG_LVL_TRACE, \ - ("uapsd> MaxSPLength = 0!\n")); \ - } - -/* - Reset MAC entry UAPSD parameters; - purpose: clean all UAPSD PS queue; release the EOSP frame if exists; - reset control parameters -*/ -#define UAPSD_MR_ENTRY_RESET(__pAd, __pEntry) \ - { \ - MAC_TABLE_ENTRY *__pSta; \ - UINT32 __IdAc; \ - __pSta = (__pEntry); \ - /* clear all U-APSD queues */ \ - for (__IdAc = 0; __IdAc < WMM_NUM_OF_AC; __IdAc++) \ - RtmpCleanupPsQueue((__pAd), \ - &__pSta->UAPSDQueue[__IdAc]); \ - /* clear EOSP frame */ \ - __pSta->UAPSDTxNum = 0; \ - if (__pSta->pUAPSDEOSPFrame != NULL) { \ - RELEASE_NDIS_PACKET((__pAd), \ - QUEUE_ENTRY_TO_PACKET( \ - __pSta->pUAPSDEOSPFrame), \ - NDIS_STATUS_FAILURE); \ - __pSta->pUAPSDEOSPFrame = NULL; \ - } \ - __pSta->bAPSDFlagSPStart = 0; \ - __pSta->bAPSDFlagEOSPOK = 0; \ - UAPSD_SP_END(__pAd, __pSta); \ - MTWF_LOG(DBG_CAT_PS, CATPS_UAPSD, DBG_LVL_TRACE, \ - ("uapsd> clear UAPSD queues!\n")); \ - } - -/* - * we can not use bMoreData bit to get EOSP bit because - * maybe bMoreData = 1 & EOSP = 1 when Max SP Length != 0 - */ -#define UAPSD_MR_EOSP_SET(__pQosCtrl, __pTxBlk) \ - do { \ - if (CLIENT_STATUS_TEST_FLAG((__pTxBlk)->pMacEntry, \ - fCLIENT_STATUS_APSD_CAPABLE)) { \ - if (TX_BLK_TEST_FLAG((__pTxBlk), fTX_bWMM_UAPSD_EOSP)) \ - *(__pQosCtrl) |= (1 << 4); \ - } \ - } while (0) - -/* - Enable or disable UAPSD flag in WMM element in beacon frame; - purpose: set UAPSD enable/disable bit -*/ -#define UAPSD_MR_IE_FILL(__QosCtrlField, __pUapsdInfo) \ - ((__QosCtrlField) |= ((__pUapsdInfo)->bAPSDCapable) ? 0x80 : 0x00) - -/* - Check if we do NOT need to control TIM bit for the station; - note: we control TIM bit only when all AC are UAPSD AC -*/ -#define UAPSD_MR_IS_NOT_TIM_BIT_NEEDED_HANDLED(__pMacEntry, __QueIdx) \ - (CLIENT_STATUS_TEST_FLAG((__pMacEntry), \ - fCLIENT_STATUS_APSD_CAPABLE) && \ - (!(__pMacEntry)->bAPSDDeliverEnabledPerAC[QID_AC_VO] || \ - !(__pMacEntry)->bAPSDDeliverEnabledPerAC[QID_AC_VI] || \ - !(__pMacEntry)->bAPSDDeliverEnabledPerAC[QID_AC_BE] || \ - !(__pMacEntry)->bAPSDDeliverEnabledPerAC[QID_AC_BK]) && \ - (__pMacEntry)->bAPSDDeliverEnabledPerAC[__QueIdx]) - -/* check if the AC is UAPSD delivery-enabled AC */ -#define UAPSD_MR_IS_UAPSD_AC(__pMacEntry, __AcId) \ - (CLIENT_STATUS_TEST_FLAG((__pMacEntry), \ - fCLIENT_STATUS_APSD_CAPABLE) && \ - ((0 <= (__AcId)) && ((__AcId) < WMM_NUM_OF_AC)) && /* 0 ~ 3 */ \ - (__pMacEntry)->bAPSDDeliverEnabledPerAC[(__AcId)]) - -/* check if all AC are UAPSD delivery-enabled AC */ -#define UAPSD_MR_IS_ALL_AC_UAPSD(__FlgIsActive, __pMacEntry) \ - (((__FlgIsActive) == FALSE) && ((__pMacEntry)->bAPSDAllAC == 1)) - -/* suspend SP */ -#define UAPSD_MR_SP_SUSPEND(__pAd) ((__pAd)->bAPSDFlagSPSuspend = 1) - -/* resume SP */ -#define UAPSD_MR_SP_RESUME(__pAd) ((__pAd)->bAPSDFlagSPSuspend = 0) - -/* mark PS poll frame sent in mix mode */ -#ifdef RTMP_MAC_PCI -/* - Note: - (1) When SP is not started, try to mark a flag to record if the legacy ps - packet is handled in statistics handler; - (2) When SP is started, increase the UAPSD count number for the legacy PS. -*/ -#define UAPSD_MR_MIX_PS_POLL_RCV(__pAd, __pMacEntry) \ - do { \ - if ((__pMacEntry)->bAPSDFlagSpRoughUse == 0) { \ - if ((__pMacEntry)->bAPSDFlagSPStart == 0) { \ - if ((__pMacEntry)->bAPSDFlagLegacySent == 1) \ - NICUpdateFifoStaCounters((__pAd)); \ - (__pMacEntry)->bAPSDFlagLegacySent = 1; \ - } else \ - (__pMacEntry)->UAPSDTxNum++; \ - } \ - } while (0) - -#endif /* RTMP_MAC_PCI */ - -#else - -#define UAPSD_EXTERN -#define UAPSD_QOS_NULL_QUE_ID 0x7f - -#ifdef RTMP_MAC_PCI -/* - In RT2870, FIFO counter is for all stations, not for per-entry, - so we can not use accurate method in RT2870 -*/ - -/* - Note for SP ACCURATE Mechanism: - 1. When traffic is busy for the PS station - Statistics FIFO counter maybe overflow before we read it, so UAPSD - counting mechanism will not accurately. - - Solution: - We need to avoid the worse case so we suggest a maximum interval for - a SP that the interval between last frame from QAP and data frame from - QSTA is larger than UAPSD_EPT_SP_INT. - - 2. When traffic use CCK/1Mbps from QAP - Statistics FIFO will not count the packet. There are 2 cases: - (1) We force to downgrage ARP response & DHCP packet to 1Mbps; - (2) After rate switch mechanism, tx rate is fixed to 1Mbps. - - Solution: - Use old DMA UAPSD mechanism. - - 3. When part of AC uses legacy PS mode - Statistics count will inclue packet statistics for legacy PS packets - so we can not know which one is UAPSD, which one is legacy. - - Solution: - Cound the legacy PS packet. - - 4. Check FIFO statistics count in Rx Done function - We can not to check TX FIFO statistics count in Rx Done function or - the real packet tx/rx sequence will be disarranged. - - Solution: - Suspend SP handle before rx done and resume SP handle after rx done. -*/ -/* TODO: shiang-usw, why PCI need to disable this when run P2P Sigma 6.1.12??? */ -#define UAPSD_SP_ACCURATE /* use more accurate method to send EOSP */ - -#endif /* RTMP_MAC_PCI */ - -#define UAPSD_EPT_SP_INT (100000 / (1000000 / OS_HZ)) /* 100ms */ - -#endif /* MODULE_WMM_UAPSD */ - -/* max UAPSD buffer queue size */ -#define MAX_PACKETS_IN_UAPSD_QUEUE 16 /* for each AC = 16*4 = 64 */ - -/* Public function list */ -/* -======================================================================== -Routine Description: - UAPSD Module Init. - -Arguments: - pAd Pointer to our adapter - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_Init(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - UAPSD Module Release. - -Arguments: - pAd Pointer to our adapter - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_Release(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - Check if ASIC can enter sleep mode. Not software sleep. - -Arguments: - pAd Pointer to our adapter - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID RtmpAsicSleepHandle(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - Close current Service Period. - -Arguments: - pAd Pointer to our adapter - pEntry Close the SP of the entry - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_SP_Close(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry); - -/* -======================================================================== -Routine Description: - Check if the SP for entry is closed. - -Arguments: - pAd Pointer to our adapter - pEntry the peer entry - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN BOOLEAN UAPSD_SP_IsClosed(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry); - -/* -======================================================================== -Routine Description: - Deliver all queued packets. - -Arguments: - pAd Pointer to our adapter - *pEntry STATION - -Return Value: - None - -Note: - SMP protection by caller for packet enqueue. -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_AllPacketDeliver(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry); - -/* -======================================================================== -Routine Description: - Parse the UAPSD field in WMM element in (re)association request frame. - -Arguments: - pAd Pointer to our adapter - *pEntry STATION - *pElm QoS information field - FlgApsdCapable TRUE: Support UAPSD - -Return Value: - None - -Note: - No protection is needed. - - 1. Association -> TSPEC: - use static UAPSD settings in Association - update UAPSD settings in TSPEC - - 2. Association -> TSPEC(11r) -> Reassociation: - update UAPSD settings in TSPEC - backup static UAPSD settings in Reassociation - - 3. Association -> Reassociation: - update UAPSD settings in TSPEC - backup static UAPSD settings in Reassociation -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_AssocParse(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry, IN UCHAR *pElm, - IN BOOLEAN FlgApsdCapable); - -/* -======================================================================== -Routine Description: - Enqueue a UAPSD packet. - -Arguments: - pAd Pointer to our adapter - *pEntry STATION - pPacket UAPSD dnlink packet - IdAc UAPSD AC ID (0 ~ 3) - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_PacketEnqueue(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry, - IN PNDIS_PACKET pPacket, IN UINT32 IdAc, - IN BOOLEAN bFromHead); - -/* -======================================================================== -Routine Description: - Handle QoS Null Frame Tx Done or Management Tx Done interrupt. - -Arguments: - pAd Pointer to our adapter - pPacket Completed TX packet - pDstMac Destinated MAC address - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_QoSNullTxMgmtTxDoneHandle(IN PRTMP_ADAPTER pAd, - IN PNDIS_PACKET pPacket, - IN UCHAR *pDstMac, - IN BOOLEAN FlgIsLocked); - -/* -======================================================================== -Routine Description: - Maintenance our UAPSD PS queue. Release all queued packet if timeout. - -Arguments: - pAd Pointer to our adapter - *pEntry STATION - -Return Value: - None - -Note: - If in RT2870, pEntry can not be removed during UAPSD_QueueMaintenance() -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_QueueMaintenance(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry); - -/* -======================================================================== -Routine Description: - Close SP in Tx Done, not Tx DMA Done. - -Arguments: - pAd Pointer to our adapter - pEntry destination entry - FlgSuccess 0:tx success, 1:tx fail - -Return Value: - None - -Note: - For RT28xx series, for packetID=0 or multicast frame, no statistics - count can be got, ex: ARP response or DHCP packets, we will use - low rate to set (CCK, MCS=0=packetID). - So SP will not be close until UAPSD_EPT_SP_INT timeout. - - So if the tx rate is 1Mbps for a entry, we will use DMA done, not - use UAPSD_SP_AUE_Handle(). -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_SP_AUE_Handle(IN RTMP_ADAPTER *pAd, - IN MAC_TABLE_ENTRY *pEntry, - IN UCHAR FlgSuccess); - -/* -======================================================================== -Routine Description: - Close current Service Period. - -Arguments: - pAd Pointer to our adapter - -Return Value: - None - -Note: - When we receive EOSP frame tx done interrupt and a uplink packet - from the station simultaneously, we will regard it as a new trigger - frame because the packet is received when EOSP frame tx done interrupt. - - We can not sure the uplink packet is sent after old SP or in the old SP. - So we must close the old SP in receive done ISR to avoid the problem. -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_SP_CloseInRVDone(IN PRTMP_ADAPTER pAd); - -/* -======================================================================== -Routine Description: - Check if we need to close current SP. - -Arguments: - pAd Pointer to our adapter - pPacket Completed TX packet - pDstMac Destinated MAC address - -Return Value: - None - -Note: - 1. We need to call the function in TxDone ISR. - 2. SMP protection by caller for packet enqueue. -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_SP_PacketCheck(IN PRTMP_ADAPTER pAd, - IN PNDIS_PACKET pPacket, - IN UCHAR *pDstMac); - -#ifdef UAPSD_TIMING_RECORD_FUNC -/* -======================================================================== -Routine Description: - Enable/Disable Timing Record Function. - -Arguments: - pAd Pointer to our adapter - Flag 1 (Enable) or 0 (Disable) - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_TimingRecordCtrl(IN UINT32 Flag); - -/* -======================================================================== -Routine Description: - Record some timings. - -Arguments: - pAd Pointer to our adapter - Type The timing is for what type - -Return Value: - None - -Note: - UAPSD_TIMING_RECORD_ISR - UAPSD_TIMING_RECORD_TASKLET - UAPSD_TIMING_RECORD_TRG_RCV - UAPSD_TIMING_RECORD_MOVE2TX - UAPSD_TIMING_RECORD_TX2AIR -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_TimingRecord(IN PRTMP_ADAPTER pAd, IN UINT32 Type); - -/* -======================================================================== -Routine Description: - Record the loop index for received packet handle. - -Arguments: - pAd Pointer to our adapter - LoopIndex The RxProcessed in rtmp_rx_done_handle() - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_TimeingRecordLoopIndex(IN UINT32 LoopIndex); -#endif /* UAPSD_TIMING_RECORD_FUNC */ - -/* -======================================================================== -Routine Description: - Get the queue status for delivery-enabled AC. - -Arguments: - pAd Pointer to our adapter - pEntry the peer entry - pFlgIsAnyPktForBK TRUE: At lease a BK packet is queued - pFlgIsAnyPktForBE TRUE: At lease a BE packet is queued - pFlgIsAnyPktForVI TRUE: At lease a VI packet is queued - pFlgIsAnyPktForVO TRUE: At lease a VO packet is queued - -Return Value: - None - -Note: -======================================================================== -*/ -VOID UAPSD_QueueStatusGet(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - OUT BOOLEAN *pFlgIsAnyPktForBK, - OUT BOOLEAN *pFlgIsAnyPktForBE, - OUT BOOLEAN *pFlgIsAnyPktForVI, - OUT BOOLEAN *pFlgIsAnyPktForVO); - -/* -======================================================================== -Routine Description: - Handle UAPSD Trigger Frame. - -Arguments: - pAd Pointer to our adapter - *pEntry the source STATION - UpOfFrame the UP of the trigger frame - -Return Value: - None - -Note: -======================================================================== -*/ -UAPSD_EXTERN VOID UAPSD_TriggerFrameHandle(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry, - IN UCHAR UpOfFrame); - -/* End of ap_uapsd.h */ -#endif /*__UAPSD_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vendor.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vendor.h deleted file mode 100644 index ddfeb3ec4b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vendor.h +++ /dev/null @@ -1,143 +0,0 @@ - -struct _RTMP_ADAPTER; - -#define RALINK_IE_LEN 0x9 -#define MEDIATEK_IE_LEN 0x9 - -#define OUI_LEN 3 -#define MAX_VENDOR_IE_LEN 255 - -#define RALINK_AGG_CAP (1 << 0) -#define RALINK_PIGGY_CAP (1 << 1) -#define RALINK_RDG_CAP (1 << 2) -#define RALINK_256QAM_CAP (1 << 3) - -#define MEDIATEK_256QAM_CAP (1 << 3) -#define BROADCOM_256QAM_CAP (1 << 0) - -typedef enum vendor_ie_in_frame_type { - VIE_BEACON = 0, /*make sure it starts from 0, for initialization.*/ - VIE_PROBE_REQ, - VIE_PROBE_RESP, - VIE_ASSOC_REQ, - VIE_ASSOC_RESP, - /*due to there is less opportunity to add vendor ie in Auth. arranage them in the bottom seq.*/ - VIE_AUTH_REQ, - VIE_AUTH_RESP, - VIE_FRM_TYPE_MAX, -} VIE_FRM_TYPE; - -#define VIE_BEACON_BITMAP (1 << VIE_BEACON) -#define VIE_PROBE_REQ_BITMAP (1 << VIE_PROBE_REQ) -#define VIE_PROBE_RESP_BITMAP (1 << VIE_PROBE_RESP) -#define VIE_ASSOC_REQ_BITMAP (1 << VIE_ASSOC_REQ) -#define VIE_ASSOC_RESP_BITMAP (1 << VIE_ASSOC_RESP) -#define VIE_AUTH_REQ_BITMAP (1 << VIE_AUTH_REQ) -#define VIE_AUTH_RESP_BITMAP (1 << VIE_AUTH_RESP) -#define VIE_FRM_TYPE_MAX_BITMAP \ - (1 << VIE_FRM_TYPE_MAX) /*for sanity check purpose*/ - -#define GET_VIE_FRM_BITMAP(_frm_type) (1 << _frm_type) - -typedef struct vie_struct { - ULONG vie_length; /*the total length which starts from oui until the tail.*/ - UCHAR oui_oitype[4]; /*used to comparism*/ - UCHAR *ie_ctnt; - struct vie_struct *next_vie; -} VIE_STRUCT; - -typedef enum vendor_ie_oper { - VIE_ADD = 1, - VIE_UPDATE, - VIE_REMOVE, - VIE_SHOW, - VIE_OPER_MAX, -} VIE_OPERATION; - -typedef struct vie_ctrl_struct { - VIE_FRM_TYPE type; - UCHAR vie_num; - struct vie_struct *vie_in_frm; -} VIE_CTRL; - -INT32 add_vie(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT32 frm_type_map, UINT32 oui_oitype, ULONG ie_length, - UCHAR *frame_buffer); - -INT32 remove_vie(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT32 frm_type_map, UINT32 oui_oitype, ULONG ie_length, - UCHAR *frame_buffer); - -VOID print_vie(struct wifi_dev *wdev, UINT32 frm_map); - -VOID init_vie_ctrl(struct wifi_dev *wdev); -VOID deinit_vie_ctrl(struct wifi_dev *wdev); -INT vie_oper_proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -typedef struct GNU_PACKED _ie_hdr { - UCHAR eid; - UINT8 len; -} IE_HEADER; - -struct GNU_PACKED _generic_vie_t { - IE_HEADER ie_hdr; - UCHAR vie_ctnt[MAX_VENDOR_IE_LEN]; -}; - -struct GNU_PACKED _ralink_ie { - IE_HEADER ie_hdr; - UCHAR oui[3]; - UCHAR cap0; - UCHAR cap1; - UCHAR cap2; - UCHAR cap3; -}; - -typedef struct GNU_PACKED _vht_cap_ie { - IE_HEADER ie_hdr; - UCHAR vht_cap_info[4]; - UCHAR support_vht_mcs_nss[8]; -} VHT_CAP; - -typedef struct GNU_PACKED _vht_op_ie { - IE_HEADER ie_hdr; - UCHAR vht_op_info[3]; - UCHAR basic_vht_mcs_nss[2]; -} VHT_OP; - -typedef struct GNU_PACKED _vht_tx_pwr_env_ie { - IE_HEADER ie_hdr; - UCHAR tx_pwr_info; - UCHAR local_max_txpwr_20Mhz; - UCHAR local_max_txpwr_40Mhz; -} VHT_TX_PWR_ENV; - -struct GNU_PACKED _mediatek_ie { - IE_HEADER ie_hdr; - UCHAR oui[3]; - UCHAR cap0; - UCHAR cap1; - UCHAR cap2; - UCHAR cap3; -}; - -struct GNU_PACKED _mediatek_vht_ie { - VHT_CAP vht_cap; - VHT_OP vht_op; - VHT_TX_PWR_ENV vht_txpwr_env; -}; - -struct GNU_PACKED _broadcom_ie { - IE_HEADER ie_hdr; - UCHAR oui[3]; - UCHAR fixed_pattern[2]; - VHT_CAP vht_cap; - VHT_OP vht_op; - VHT_TX_PWR_ENV vht_txpwr_env; -}; - -ULONG build_vendor_ie(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *frame_buffer, VIE_FRM_TYPE vie_frm_type); - -VOID check_vendor_ie(struct _RTMP_ADAPTER *pAd, UCHAR *ie_buffer, - struct _vendor_ie_cap *vendor_ie); diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vht.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vht.h deleted file mode 100644 index dc0a8f9cca..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vht.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "dot11ac_vht.h" - -struct _RTMP_ADAPTER; -struct _RT_PHY_INFO; -struct _build_ie_info; -struct _op_info; - -struct vht_ch_layout *get_ch_array(UINT8 bw); - -VOID dump_vht_cap(struct _RTMP_ADAPTER *pAd, VHT_CAP_IE *vht_ie); -VOID dump_vht_op(struct _RTMP_ADAPTER *pAd, VHT_OP_IE *vht_ie); - -INT build_vht_txpwr_envelope(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *buf); -INT build_vht_ies(struct _RTMP_ADAPTER *pAd, struct _build_ie_info *info); -INT build_vht_cap_ie(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *buf); -void update_vht_op_info(UINT8 cap_bw, VHT_OP_INFO *vht_op_info, - struct _op_info *op_info); - -UCHAR vht_prim_ch_idx(UCHAR vht_cent_ch, UCHAR prim_ch, UINT8 rf_bw); -UCHAR vht_cent_ch_freq(UCHAR prim_ch, UCHAR vht_bw); -INT vht_mode_adjust(struct _RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - VHT_CAP_IE *cap, VHT_OP_IE *op); -INT dot11_vht_mcs_to_internal_mcs(struct _RTMP_ADAPTER *pAd, - struct wifi_dev *wdev, VHT_CAP_IE *vht_cap, - HTTRANSMIT_SETTING *tx); -VOID set_vht_cap(struct _RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *entry, - VHT_CAP_IE *vht_cap_ie); -INT SetCommonVHT(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID rtmp_set_vht(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct _RT_PHY_INFO *phy_info); -char *VhtBw2Str(INT VhtBw); - -#ifdef VHT_TXBF_SUPPORT -VOID trigger_vht_ndpa(struct _RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *entry); -#endif /* VHT_TXBF_SUPPORT */ - -void assoc_vht_info_debugshow(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN VHT_CAP_IE *vht_cap, IN VHT_OP_IE *vht_op); - -#ifdef ACS_CTCC_SUPPORT -BOOLEAN vht40_channel_group(struct _RTMP_ADAPTER *pAd, UCHAR channel); -#endif -BOOLEAN vht80_channel_group(struct _RTMP_ADAPTER *pAd, UCHAR channel); -BOOLEAN vht160_channel_group(struct _RTMP_ADAPTER *pAd, UCHAR channel); -void print_vht_op_info(VHT_OP_INFO *vht_op); -UINT32 starec_vht_feature_decision(struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, - UINT32 *feature); -UCHAR rf_bw_2_vht_bw(UCHAR rf_bw); -UCHAR check_vht_op_bw(VHT_OP_INFO *vht_op_info); diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/video.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/video.h deleted file mode 100644 index 031bab6f4c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/video.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifdef VIDEO_TURBINE_SUPPORT -extern AP_VIDEO_STRUCT GLOBAL_AP_VIDEO_CONFIG; - -VOID VideoModeUpdate(IN PRTMP_ADAPTER pAd); -VOID VideoModeDynamicTune(IN PRTMP_ADAPTER pAd); -UINT32 GetAsicDefaultRetry(IN PRTMP_ADAPTER pAd); -UCHAR GetAsicDefaultTxBA(IN PRTMP_ADAPTER pAd); -UINT32 GetAsicVideoRetry(IN PRTMP_ADAPTER pAd); -UCHAR GetAsicVideoTxBA(IN PRTMP_ADAPTER pAd); -VOID VideoConfigInit(IN PRTMP_ADAPTER pAd); -#endif /* VIDEO_TURBINE_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vr_ikans.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vr_ikans.h deleted file mode 100644 index 7bda623def..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vr_ikans.h +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - vr_ikans.h - - Abstract: - Only for IKANOS Vx160 or Vx180 platform. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Sample Lin 01-28-2008 Created - - */ - -#ifndef __VR_IKANS_H__ -#define __VR_IKANS_H__ - -#ifdef IKANOS_VX_1X0 -typedef void (*IkanosWlanTxCbFuncP)(void *, void *); - -struct IKANOS_TX_INFO { - struct net_device *netdev; - IkanosWlanTxCbFuncP *fp; -}; -#endif /* IKANOS_VX_1X0 */ - -#ifndef MODULE_IKANOS -extern void VR_IKANOS_FP_Init(UINT8 BssNum, UINT8 *pApMac); -extern INT32 IKANOS_DataFramesTx(struct sk_buff *pSkb, - struct net_device *pNetDev); -extern void IKANOS_DataFrameRx(PRTMP_ADAPTER pAd, struct sk_buff *pSkb); -#else -void VR_IKANOS_FP_Init(UINT8 BssNum, UINT8 *pApMac); -INT32 IKANOS_DataFramesTx(struct sk_buff *pSkb, struct net_device *pNetDev); -void IKANOS_DataFrameRx(PRTMP_ADAPTER pAd, struct sk_buff *pSkb); -#endif /* MODULE_IKANOS */ - -#endif /* __VR_IKANS_H__ */ - -/* End of vr_ikans.h */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vrut_ubm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vrut_ubm.h deleted file mode 100644 index 1b77c00d86..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/vrut_ubm.h +++ /dev/null @@ -1,41 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2010, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - All Related Structure & Definition for UBICOM platform. - - Only used in UTIL module. - -***************************************************************************/ - -#ifndef __VR_UBICOM_H__ -#define __VR_UBICOM_H__ - -#ifdef PLATFORM_UBM_IPX8 - -#include - -#undef RTMP_UTIL_DCACHE_FLUSH -#define RTMP_UTIL_DCACHE_FLUSH(__AddrStart, __Size) \ - flush_dcache_range((ULONG)(__AddrStart), \ - (ULONG)(((UCHAR *)(__AddrStart)) + __Size - 1)) - -#endif /* PLATFORM_UBM_IPX8 */ - -#endif /* __VR_UBICOM_H__ */ - -/* End of vrut_ubm.h */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wapp/wapp.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wapp/wapp.h deleted file mode 100644 index 1073af6094..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wapp/wapp.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - wapp.h -*/ -#include "rt_config.h" - -#ifndef _WAPP_H_ -#define __WAPP_H__ - -#ifdef WAPP_SUPPORT -struct wapp_req; -struct wapp_event; -struct _wdev_op_class_info; -struct _wdev_chn_info; - -typedef enum { - INACTIVE = 0, - ACTIVE, -} STA_STATUS; - -INT wapp_event_handle(PRTMP_ADAPTER pAd, struct wapp_req *req); - -INT wapp_send_cli_join_event(PRTMP_ADAPTER pAd, MAC_TABLE_ENTRY *mac_entry); - -INT wapp_send_cli_leave_event(PRTMP_ADAPTER pAd, UINT32 ifindex, - UCHAR *mac_addr, MAC_TABLE_ENTRY *mac_entry); - -INT wapp_send_cli_probe_event(PRTMP_ADAPTER pAd, UINT32 ifindex, - UCHAR *mac_addr, MLME_QUEUE_ELEM *elem); - -BOOLEAN wapp_init(PRTMP_ADAPTER pAd, BSS_STRUCT *pMbss); - -VOID wext_send_wapp_qry_rsp(PNET_DEV pNetDev, struct wapp_event *event); - -INT wapp_send_bss_state_change(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - UINT8 bss_state); - -INT wapp_send_ch_change_rsp(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, UINT8 ch); - -INT wapp_send_apcli_association_change(UINT8 apcli_assoc_state, - struct _RTMP_ADAPTER *ad, - struct _APCLI_STRUCT *ApCliEntry); - -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - -INT wapp_send_apcli_association_change_vendor10( - UINT8 apcli_assoc_state, struct _RTMP_ADAPTER *ad, - struct _APCLI_STRUCT *ApCliEntry); - -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - -INT wapp_send_bssload_crossing(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - UCHAR bssload_high_thrd, UCHAR bssload_low_thrd, - UCHAR bssload); - -VOID wapp_send_bcn_report(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PUCHAR pFramePtr, IN ULONG MsgLen); - -VOID wapp_send_bcn_report_complete(IN PRTMP_ADAPTER pAd, - IN PMAC_TABLE_ENTRY pEntry); - -#ifdef AIR_MONITOR -VOID wapp_send_air_mnt_rssi(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PMNT_STA_ENTRY pMntEntry); -#endif - -#ifdef CONFIG_MAP_SUPPORT -VOID wapp_send_cac_period_event(IN PRTMP_ADAPTER pAd, IN UINT32 ifindex, - IN UCHAR channel, IN UCHAR cac_enable, - IN USHORT cac_time); -#endif -VOID wapp_bss_load_check(struct _RTMP_ADAPTER *ad); - -VOID wapp_send_csa_event(IN PRTMP_ADAPTER pAd, IN UINT32 ifindex, - IN UCHAR new_channel); - -VOID wapp_send_cli_active_change(IN PRTMP_ADAPTER pAd, - IN PMAC_TABLE_ENTRY pEntry, - IN STA_STATUS stat); - -INT set_wapp_param(IN PRTMP_ADAPTER pAd, UINT32 Param, UINT32 Value); - -INT wapp_set_ap_ie(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *IE, IN UINT32 IELen, - IN UCHAR ApIdx); - -INT wapp_send_sta_connect_rejected(struct _RTMP_ADAPTER *ad, - struct wifi_dev *wdev, UCHAR *sta_mac_addr, - UCHAR *bssid, UINT8 connect_stage, - UINT16 reason, USHORT status_code, - USHORT reason_code); - -INT wapp_send_wsc_scan_complete_notification(PRTMP_ADAPTER pAd, - struct wifi_dev *wdev); -INT wapp_send_wsc_eapol_start_notification(PRTMP_ADAPTER pAd, - struct wifi_dev *wdev); -INT wapp_send_wsc_eapol_complete_notif(PRTMP_ADAPTER pAd, - struct wifi_dev *wdev); -#ifdef CONFIG_MAP_SUPPORT -INT wapp_send_scan_complete_notification(PRTMP_ADAPTER pAd, - struct wifi_dev *wdev); -#endif -VOID wapp_send_cac_stop(IN PRTMP_ADAPTER pAd, IN UINT32 ifindex, - IN UCHAR channel, IN UCHAR ret); -#ifdef DFS_CAC_R2 -void wapp_get_cac_cap(IN PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct cac_capability_lib *cac_cap); -#endif - -#ifdef A4_CONN -INT wapp_send_a4_entry_missing(PRTMP_ADAPTER pAd, UINT32 ifindex, UCHAR *ip); -#endif -UINT8 get_channel_utilization(PRTMP_ADAPTER pAd, u32 ifindex); -UCHAR map_set_op_class_info(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct _wdev_op_class_info *op_class); - -VOID setChannelList(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - struct _wdev_chn_info *chn_list); -#ifdef MAP_R2 -INT wapp_send_sta_disassoc_stats_event(PRTMP_ADAPTER pAd, - MAC_TABLE_ENTRY *pEntry, USHORT reason); - -void wapp_handle_sta_disassoc(PRTMP_ADAPTER pAd, UINT16 wcid, UINT16 Reason); - -#endif - -INT wapp_send_radar_detect_notif(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - unsigned char channel, - unsigned char ch_status); -void wapp_prepare_nop_channel_list(PRTMP_ADAPTER pAd, - struct nop_channel_list_s *nop_list); -#ifdef DPP_SUPPORT -void cache_dpp_frame_rx_event(struct wifi_dev *wdev, const char *peer_mac_addr, - UINT channel, const char *frm, UINT16 frm_len, - BOOL is_gas, UINT32 frm_count); -void wext_send_dpp_frame_rx_event(struct wifi_dev *wdev, UINT32 frm_count); -void wext_send_dpp_action_frame(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - const char *peer_mac_addr, UINT channel, - const char *frm, UINT16 frm_len, - BOOLEAN is_gas); -void wext_send_dpp_frame_tx_status(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - BOOLEAN tx_error, UINT16 seq_no); - -#endif /* DPP_SUPPORT */ -#ifdef MAP_R2 -VOID Update_Mib_Bucket_for_map(RTMP_ADAPTER *pAd); -#endif -#endif /* WAPP_SUPPORT */ -#endif /* _WAPP_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wapp/wapp_cmm_type.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wapp/wapp_cmm_type.h deleted file mode 100644 index 4c2ba6f8b5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wapp/wapp_cmm_type.h +++ /dev/null @@ -1,900 +0,0 @@ -/* - * Copyright (c) [2020], MediaTek Inc. All rights reserved. - * - * This software/firmware and related documentation ("MediaTek Software") are - * protected under relevant copyright laws. - * The information contained herein is confidential and proprietary to - * MediaTek Inc. and/or its licensors. - * Except as otherwise provided in the applicable licensing terms with - * MediaTek Inc. and/or its licensors, any reproduction, modification, use or - * disclosure of MediaTek Software, and information contained herein, in whole - * or in part, shall be strictly prohibited. -*/ -/* - - Module Name: - wapp_cmm_type.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -/* This file is used by wifi driver and wapp. - Keep data structure sync */ - -#ifndef __WAPP_TYPES_H__ -#define __WAPP_TYPES_H__ - -/* #include */ -#ifdef WAPP_SUPPORT -#define MAX_BSSLOAD_THRD 100 -#endif /* WAPP_SUPPORT */ - -#ifndef GNU_PACKED -#define GNU_PACKED (__attribute__((packed))) -#endif /* GNU_PACKED */ - -#ifndef MAC_ADDR_LEN -#define MAC_ADDR_LEN 6 -#endif -#ifndef LEN_PMK -#define LEN_PMK 32 -#endif -#ifndef LEN_PMKID -#define LEN_PMKID 16 -#endif - -#ifndef AC_NUM -#define AC_NUM 4 -#endif -#define MAX_HE_MCS_LEN 12 -#define MAX_OP_CLASS 16 -#define MAX_LEN_OF_SSID 32 -#define MAX_NUM_OF_CHANNELS 59 -#define PREQ_IE_LEN 128 -#define BCN_RPT_LEN 200 -#define IWSC_MAX_SUB_MASK_LIST_COUNT 3 -#define WMODE_CAP_N(_x) (((_x) & (WMODE_GN | WMODE_AN)) != 0) -#define WMODE_CAP_AC(_x) (((_x) & (WMODE_AC)) != 0) -#define WMODE_CAP_AX(_x) ((_x) & (WMODE_AX_24G | WMODE_AX_5G | WMODE_AX_6G)) -#define WMODE_CAP(_x, _mode) (((_x) & (_mode)) != 0) - -#define MAX_SUPPORT_INF_NUM (17 * MAX_NUM_OF_RADIO) /* 16MBSS+1APCLI */ -#define MAX_NUM_OF_WAPP_CHANNELS 59 -#define MAX_PROFILE_CNT 4 -#define PER_EVENT_LIST_MAX_NUM 5 -#define DAEMON_NEIGHBOR_REPORT_MAX_NUM 128 -#define VERSION_WAPP_CMM "v2.0.2" -typedef enum { - WAPP_STA_INVALID, - WAPP_STA_DISCONNECTED, - WAPP_STA_CONNECTED, -} WAPP_STA_STATE; - -typedef enum { - WAPP_BSS_STOP = 0, - WAPP_BSS_START, -} WAPP_BSS_STATE; - -typedef enum { WAPP_AUTH = 0, WAPP_ASSOC, WAPP_EAPOL } WAPP_CNNCT_STAGE; - -typedef enum { - WAPP_BSSLOAD_NORMAL = 0, - WAPP_BSSLOAD_HIGH, - WAPP_BSSLOAD_LOW, -} WAPP_BSSLOAD_STATE; - -typedef enum { - NOT_FAILURE = 0, - AP_NOT_READY, - ACL_CHECK_FAIL, - BSSID_NOT_FOUND, - BSSID_MISMATCH, - BSSID_IF_NOT_READY, - BND_STRG_CONNECT_CHECK_FAIL, - DISALLOW_NEW_ASSOCI, - EZ_CONNECT_DISALLOW, - EZ_SETUP_FUNC_DISABLED, - FT_ERROR, - GO_UPDATE_NOT_COMPLETE, - MLME_NO_RESOURCE, - MLME_ASSOC_REJ_TEMP, - MLME_UNABLE_HANDLE_STA, - MLME_EZ_CNNCT_LOOP, - MLME_REQ_WITH_INVALID_PARAM, - MLME_REJECT_TIMEOUT, - MLME_UNSPECIFY_FAILURE, - NOT_FOUND_IN_RADIUS_ACL, - PEER_REQ_SANITY_FAIL, -} WAPP_CNNCT_FAIL_REASON_LIST; - -typedef enum { - WAPP_APCLI_DISASSOCIATED = 0, - WAPP_APCLI_ASSOCIATED, -} WAPP_APCLI_ASSOC_STATE; - -typedef enum { - WAPP_DEV_QUERY_RSP = 1, - WAPP_HT_CAP_QUERY_RSP, - WAPP_VHT_CAP_QUERY_RSP, - WAPP_HE_CAP_QUERY_RSP, - WAPP_MISC_CAP_QUERY_RSP, - WAPP_CLI_QUERY_RSP, - WAPP_CLI_LIST_QUERY_RSP, - WAPP_CLI_JOIN_EVENT, - WAPP_CLI_LEAVE_EVENT, - WAPP_CLI_PROBE_EVENT, - WAPP_CHN_LIST_RSP, - WAPP_OP_CLASS_RSP, - WAPP_BSS_INFO_RSP, - WAPP_AP_METRIC_RSP, - WAPP_CH_UTIL_QUERY_RSP, - WAPP_AP_CONFIG_RSP, - WAPP_APCLI_QUERY_RSP, - MAP_BH_STA_WPS_DONE, - MAP_TRIGGER_RSSI_STEER, - WAPP_RCEV_BCN_REPORT, - WAPP_RCEV_BCN_REPORT_COMPLETE, - WAPP_RCEV_MONITOR_INFO, - WAPP_BSSLOAD_RSP, - WAPP_BSSLOAD_CROSSING, - WAPP_BSS_STATE_CHANGE, - WAPP_CH_CHANGE, - WAPP_TX_POWER_CHANGE, - WAPP_APCLI_ASSOC_STATE_CHANGE, - WAPP_STA_RSSI_RSP, - WAPP_CLI_ACTIVE_CHANGE, - WAPP_CSA_EVENT, - WAPP_STA_CNNCT_REJ, - WAPP_APCLI_RSSI_RSP, - WAPP_SCAN_RESULT_RSP, - WAPP_MAP_VENDOR_IE, - WAPP_WSC_SCAN_COMP_NOTIF, - WAPP_MAP_WSC_CONFIG, - WAPP_WSC_EAPOL_START_NOTIF, - WAPP_WSC_EAPOL_COMPLETE_NOTIF, - WAPP_SCAN_COMPLETE_NOTIF, - WAPP_A4_ENTRY_MISSING_NOTIF, - WAPP_RADAR_DETECT_NOTIF, - WAPP_APCLI_ASSOC_STATE_CHANGE_VENDOR10, - WAPP_CAC_STOP, -#ifdef MAP_R2 - WAPP_STA_DISASSOC_EVENT, - WAPP_RADIO_METRIC_RSP, -#endif -#ifdef DPP_SUPPORT - WAPP_DPP_ACTION_FRAME_RECEIVED, - WAPP_DPP_ACTION_FRAME_STATUS, -#endif - WAPP_CAC_PERIOD_EVENT, -#ifdef WIFI_MD_COEX_SUPPORT - WAPP_UNSAFE_CHANNEL_EVENT, - WAPP_BAND_STATUS_CHANGE_EVENT, -#endif -} WAPP_EVENT_ID; - -typedef enum { - WAPP_DEV_QUERY_REQ = 1, - WAPP_HT_CAP_QUERY_REQ, - WAPP_VHT_CAP_QUERY_REQ, - WAPP_HE_CAP_QUERY_REQ, - WAPP_MISC_CAP_QUERY_REQ, - WAPP_CLI_QUERY_REQ, - WAPP_CLI_LIST_QUERY_REQ, - WAPP_CHN_LIST_QUERY_REQ, - WAPP_OP_CLASS_QUERY_REQ, - WAPP_BSS_INFO_QUERY_REQ, - WAPP_AP_METRIC_QUERY_REQ, - WAPP_CH_UTIL_QUERY_REQ, - WAPP_APCLI_QUERY_REQ, - WAPP_BSS_START_REQ, - WAPP_BSS_STOP_REQ, - WAPP_TXPWR_PRCTG_REQ, - WAPP_STEERING_POLICY_SET_REQ, - WAPP_BSS_LOAD_THRD_SET_REQ, - WAPP_AP_CONFIG_SET_REQ, - WAPP_BSSLOAD_QUERY_REQ, - WAPP_HECAP_QUERY_REQ, - WAPP_STA_RSSI_QUERY_REQ, - WAPP_APCLI_RSSI_QUERY_REQ, - WAPP_GET_SCAN_RESULTS, - WAPP_SEND_NULL_FRAMES, - WAPP_WSC_PBC_EXEC, - WAPP_WSC_SET_BH_PROFILE, - WAPP_SET_SCAN_BH_SSIDS, - WAPP_SET_AVOID_SCAN_CAC, -#ifdef MAP_R2 - WAPP_RADIO_METRICS_REQ, -#endif -} WAPP_REQ_ID; - -typedef enum { - PARAM_DGAF_DISABLED, - PARAM_PROXY_ARP, - PARAM_L2_FILTER, - PARAM_ICMPV4_DENY, - PARAM_MMPDU_SIZE, - PARAM_EXTERNAL_ANQP_SERVER_TEST, - PARAM_GAS_COME_BACK_DELAY, - PARAM_WNM_NOTIFICATION, - PARAM_QOSMAP, - PARAM_WNM_BSS_TRANSITION_MANAGEMENT, -} WAPP_PARAM; - -typedef struct GNU_PACKED _WAPP_CONNECT_FAILURE_REASON { - u8 connect_stage; - u16 reason; -} WAPP_CONNECT_FAILURE_REASON; - -typedef struct GNU_PACKED _wapp_dev_info { - u32 ifindex; - u8 ifname[IFNAMSIZ]; - u8 mac_addr[MAC_ADDR_LEN]; - u8 dev_type; - u8 radio_id; - u16 wireless_mode; - uintptr_t adpt_id; - u8 dev_active; -} wapp_dev_info; - -typedef struct GNU_PACKED _wdev_ht_cap { - u8 tx_stream; - u8 rx_stream; - u8 sgi_20; - u8 sgi_40; - u8 ht_40; -} wdev_ht_cap; - -typedef struct GNU_PACKED _wdev_vht_cap { - u8 sup_tx_mcs[2]; - u8 sup_rx_mcs[2]; - u8 tx_stream; - u8 rx_stream; - u8 sgi_80; - u8 sgi_160; - u8 vht_160; - u8 vht_8080; - u8 su_bf; - u8 mu_bf; -} wdev_vht_cap; - -typedef struct GNU_PACKED _wdev_he_cap { - unsigned char he_mcs_len; - unsigned char he_mcs[MAX_HE_MCS_LEN]; - unsigned char tx_stream; - unsigned char rx_stream; - unsigned char he_8080; - unsigned char he_160; - unsigned char su_bf_cap; - unsigned char mu_bf_cap; - unsigned char ul_mu_mimo_cap; - unsigned char ul_mu_mimo_ofdma_cap; - unsigned char dl_mu_mimo_ofdma_cap; - unsigned char ul_ofdma_cap; - unsigned char dl_ofdma_cap; -} wdev_he_cap; - -#ifdef MAP_R2 -typedef struct GNU_PACKED _wdev_extended_ap_metrics { - u32 uc_tx; - u32 uc_rx; - u32 mc_tx; - u32 mc_rx; - u32 bc_tx; - u32 bc_rx; -} wdev_extended_ap_metric; - -typedef struct GNU_PACKED _wdev_sta_extended_info { - u32 last_data_ul_rate; - u32 last_data_dl_rate; - u32 utilization_rx; - u32 utilization_tx; -} wdev_sta_ext_info; - -typedef struct GNU_PACKED _wdev_extended_sta_metrics { - wdev_sta_ext_info sta_info; -} wdev_extended_sta_metrics; - -#endif -typedef struct GNU_PACKED _wapp_cac_info { - u8 channel; - u8 ret; - u8 cac_timer; -} wapp_cac_info; -#ifdef MAP_R2 -typedef enum cac_mode { - CONTINUOUS_CAC, - DEDICATED_CAC, - REDUCED_MIMO_CAC, -} CAC_MODE; -#endif - -typedef struct GNU_PACKED _wdev_misc_cap { - u8 max_num_of_cli; - u8 max_num_of_bss; - u8 num_of_bss; - u8 max_num_of_block_cli; -} wdev_misc_cap; - -struct GNU_PACKED he_nss { - u16 nss_80 : 2; - u16 nss_160 : 2; - u16 nss_8080 : 2; -}; - -struct GNU_PACKED map_cli_cap { - u16 bw : 2; - u16 phy_mode : 3; - u16 nss : 2; - u16 btm_capable : 1; - u16 rrm_capable : 1; - u16 mbo_capable : 1; - struct he_nss nss_he; -}; - -typedef struct GNU_PACKED _wapp_client_info { - u8 mac_addr[MAC_ADDR_LEN]; - u8 bssid[MAC_ADDR_LEN]; - u8 sta_status; /* WAPP_STA_STATE */ - u16 assoc_time; - u16 downlink; - u16 uplink; - signed char uplink_rssi; - /*traffic stats*/ - u32 bytes_sent; - u32 bytes_received; - u32 packets_sent; - u32 packets_received; - u32 tx_packets_errors; - u32 rx_packets_errors; - u32 retransmission_count; - u16 link_availability; - u16 assoc_req_len; - u8 bLocalSteerDisallow; - u8 bBTMSteerDisallow; - u8 status; - /* ht_cap */ - /* vht_cap */ - - /* Throughput for Tx/Rx */ - u32 tx_tp; - u32 rx_tp; - struct map_cli_cap cli_caps; -#ifdef MAP_R2 - wdev_extended_sta_metrics ext_metric_info; - u16 disassoc_reason; - u8 IsReassoc; -#endif - u8 is_APCLI; -} wapp_client_info; - -struct GNU_PACKED chnList { - u8 channel; - u8 pref; - u16 cac_timer; -}; - -typedef struct GNU_PACKED _wdev_chn_info { - u8 op_ch; - u8 op_class; - u16 band; /* 24g; 5g1; 5g2 */ - u8 ch_list_num; - u8 non_op_chn_num; - u16 dl_mcs; - struct chnList ch_list[16]; - u8 non_op_ch_list[16]; -} wdev_chn_info; - -struct GNU_PACKED opClassInfo { - u8 op_class; - u8 num_of_ch; - u8 ch_list[13]; -}; - -typedef struct GNU_PACKED _wdev_op_class_info { - u8 num_of_op_class; - struct opClassInfo opClassInfo[MAX_OP_CLASS]; -} wdev_op_class_info; - -typedef struct GNU_PACKED _wdev_bss_info { - u8 if_addr[MAC_ADDR_LEN]; - u8 bssid[MAC_ADDR_LEN]; - char ssid[MAX_LEN_OF_SSID + 1]; - u8 SsidLen; - u8 map_role; - u32 auth_mode; - u32 enc_type; - u8 key_len; - u8 key[64 + 1]; - u8 hidden_ssid; -} wdev_bss_info; - -typedef struct GNU_PACKED _wsc_apcli_config { - char ssid[MAX_LEN_OF_SSID + 1]; - u8 SsidLen; - u16 AuthType; - u16 EncrType; - u8 Key[64]; - u16 KeyLength; - u8 KeyIndex; - u8 bssid[MAC_ADDR_LEN]; - u8 peer_map_role; - u8 own_map_role; -} wsc_apcli_config; - -typedef struct GNU_PACKED _wsc_apcli_config_msg { - u32 profile_count; - wsc_apcli_config apcli_config[0]; -} wsc_apcli_config_msg, *p_wsc_apcli_config_msg; - -typedef struct GNU_PACKED _wdev_ap_metric { - u8 bssid[MAC_ADDR_LEN]; - u8 cu; - u8 ESPI_AC[AC_NUM][3]; -#ifdef MAP_R2 - wdev_extended_ap_metric ext_ap_metric; -#endif -} wdev_ap_metric; - -#ifdef MAP_R2 -typedef struct GNU_PACKED _wdev_radio_metric { - u8 cu_noise; - u8 cu_tx; - u8 cu_rx; - u8 cu_other; - u32 edcca; -} wdev_radio_metric; -#endif -typedef struct GNU_PACKED _wdev_ap_config { - u8 sta_report_on_cop; - u8 sta_report_not_cop; - u8 rssi_steer; -} wdev_ap_config; - -typedef struct GNU_PACKED _wdev_tx_power { - signed char pwr_limit; - u16 tx_pwr; -} wdev_tx_power; - -/*Driver detects sta needed to steer*/ -typedef struct GNU_PACKED _wdev_steer_sta { - u8 mac_addr[MAC_ADDR_LEN]; -} wdev_steer_sta; - -typedef struct GNU_PACKED _wapp_probe_info { - u8 mac_addr[MAC_ADDR_LEN]; - u8 channel; - signed char rssi; - u8 preq_len; - u8 preq[PREQ_IE_LEN]; -} wapp_probe_info; - -typedef struct GNU_PACKED _wapp_bcn_rpt_info { - u8 sta_addr[MAC_ADDR_LEN]; - u8 last_fragment; - u16 bcn_rpt_len; - u8 bcn_rpt[BCN_RPT_LEN]; -} wapp_bcn_rpt_info; - -typedef struct GNU_PACKED wapp_bhsta_info { - u8 mac_addr[MAC_ADDR_LEN]; - u8 connected_bssid[MAC_ADDR_LEN]; - u8 peer_map_enable; -} wapp_bhsta_info; - -typedef struct GNU_PACKED _wdev_steer_policy { - u8 steer_policy; - u8 cu_thr; - u8 rcpi_thr; -} wdev_steer_policy; - -typedef struct GNU_PACKED _bssload_threshold { - u8 high_bssload_thrd; - u8 low_bssload_thrd; -} bssload_threshold; - -typedef struct GNU_PACKED _wapp_bssload_info { - u16 sta_cnt; - u8 ch_util; - u16 AvalAdmCap; -} wapp_bssload_info; - -/* By air monitor*/ -typedef struct GNU_PACKED _wapp_mnt_info { - u8 sta_addr[MAC_ADDR_LEN]; - signed char rssi; -} wapp_mnt_info; - -typedef struct GNU_PACKED _wapp_csa_info { - u8 new_channel; -} wapp_csa_info; - -typedef struct GNU_PACKED _wapp_bss_state_info { - u32 interface_index; - WAPP_BSS_STATE bss_state; -} wapp_bss_state_info; - -typedef struct GNU_PACKED _wapp_ch_change_info { - u32 interface_index; - u8 new_ch; /*New channel IEEE number*/ - u8 op_class; -} wapp_ch_change_info; - -typedef struct GNU_PACKED _wapp_txpower_change_info { - u32 interface_index; - u16 new_tx_pwr; /*New TX power*/ -} wapp_txpower_change_info; - -typedef struct GNU_PACKED _wapp_apcli_association_info { - u32 interface_index; - WAPP_APCLI_ASSOC_STATE apcli_assoc_state; - signed char rssi; - signed char PeerMAPEnable; -} wapp_apcli_association_info; - -typedef struct GNU_PACKED _wapp_bssload_crossing_info { - u32 interface_index; - u8 bssload_high_thrd; - u8 bssload_low_thrd; - u8 bssload; -} wapp_bssload_crossing_info; - -typedef struct GNU_PACKED _wapp_sta_cnnct_rejected_info { - u32 interface_index; - u8 sta_mac[MAC_ADDR_LEN]; - u8 bssid[MAC_ADDR_LEN]; - WAPP_CONNECT_FAILURE_REASON cnnct_fail; -#ifdef MAP_R2 - u16 assoc_status_code; - u16 assoc_reason_code; -#endif -} wapp_sta_cnnct_rej_info; - -struct GNU_PACKED map_vendor_ie { - u8 type; - u8 subtype; - u8 root_distance; - u8 connectivity_to_controller; - u16 uplink_rate; - u8 uplink_bssid[MAC_ADDR_LEN]; - u8 bssid_5g[MAC_ADDR_LEN]; - u8 bssid_2g[MAC_ADDR_LEN]; -}; - -typedef struct _qbss_load_param { - u8 bValid; /* 1: variable contains valid value */ - u16 StaNum; - u8 ChannelUtilization; - u16 RemainingAdmissionControl; /* in unit of 32-us */ -} QBSS_LOAD_PARM, *PQBSS_LOAD_PARM; - -#ifdef MAP_R2 -typedef struct GNU_PACKED _wapp_qbss_load { - u8 bValid; /*1: variable contains valid value*/ - u16 StaNum; - u8 ChannelUtilization; - u16 RemainingAdmissionControl; /*in unit of 32-us*/ -} WAPP_QBSS_LOAD_PARM; - -#endif - -struct GNU_PACKED scan_bss_info { - u8 Bssid[MAC_ADDR_LEN]; - u8 Channel; - u8 CentralChannel; - signed char Rssi; - signed char MinSNR; - u8 Privacy; - - u8 SsidLen; - u8 Ssid[MAX_LEN_OF_SSID]; - - u16 AuthMode; - u16 EncrypType; - wdev_ht_cap ht_cap; - wdev_vht_cap vht_cap; - wdev_he_cap he_cap; - u8 map_vendor_ie_found; - struct map_vendor_ie map_info; -#ifdef MAP_R2 - WAPP_QBSS_LOAD_PARM QbssLoad; -#endif -}; -struct GNU_PACKED wapp_scan_info { - u32 interface_index; - u8 more_bss; - u8 bss_count; - struct scan_bss_info bss[0]; -}; - -struct GNU_PACKED wapp_wsc_scan_info { - u8 bss_count; - u8 Uuid[16]; -}; - -struct GNU_PACKED radar_notif_s { - u32 channel; - u32 status; -}; - -typedef struct GNU_PACKED _NDIS_802_11_SSID { - u32 SsidLength; /* length of SSID field below, in bytes; */ - /* this can be zero. */ - char Ssid[MAX_LEN_OF_SSID]; /* SSID information field */ -} NDIS_802_11_SSID, *PNDIS_802_11_SSID; -struct GNU_PACKED nop_channel_list_s { - u8 channel_count; - u8 channel_list[MAX_NUM_OF_WAPP_CHANNELS]; -}; - -/* WSC configured credential */ -typedef struct _WSC_CREDENTIAL { - NDIS_802_11_SSID SSID; /* mandatory */ - u16 AuthType; /* mandatory, 1: open, 2: wpa-psk, 4: shared, 8:wpa, 0x10: wpa2, 0x20: wpa2-psk */ - u16 EncrType; /* mandatory, 1: none, 2: wep, 4: tkip, 8: aes */ - u8 Key[64]; /* mandatory, Maximum 64 byte */ - u16 KeyLength; - u8 MacAddr[MAC_ADDR_LEN]; /* mandatory, AP MAC address */ - u8 KeyIndex; /* optional, default is 1 */ - u8 bFromUPnP; /* TRUE: This credential is from external UPnP registrar */ - u8 bss_role; /*0-Fronthaul, 1-Backhaul*/ - u8 DevPeerRole; /* Device role for the peer device sending M8 */ - u16 IpConfigMethod; - u32 RegIpv4Addr; - u32 Ipv4SubMask; - u32 EnrIpv4Addr; - u32 AvaIpv4SubmaskList[IWSC_MAX_SUB_MASK_LIST_COUNT]; -} WSC_CREDENTIAL, *PWSC_CREDENTIAL; - -struct scan_SSID { - char ssid[MAX_LEN_OF_SSID + 1]; - unsigned char SsidLen; -}; - -struct vendor_map_element { - u8 eid; - u8 length; - char oui[3]; /* 0x50 6F 9A */ - char mtk_ie_element[4]; - char type; - char subtype; - char root_distance; - char controller_connectivity; - short uplink_rate; - char uplink_bssid[MAC_ADDR_LEN]; - char _5g_bssid[MAC_ADDR_LEN]; - char _2g_bssid[MAC_ADDR_LEN]; -}; - -struct GNU_PACKED scan_BH_ssids { - unsigned long scan_cookie; - unsigned char scan_channel_count; - unsigned char scan_channel_list[32]; - unsigned char profile_cnt; - struct scan_SSID scan_SSID_val[MAX_PROFILE_CNT]; -}; - -#ifdef DPP_SUPPORT -struct GNU_PACKED wapp_dpp_action_frame { - u8 src[MAC_ADDR_LEN]; - u32 wapp_dpp_frame_id_no; - u32 chan; - u32 frm_len; - u32 is_gas; - u8 frm[0]; -}; - -struct GNU_PACKED wapp_dpp_frm_tx_status { - u8 tx_success; - u16 seq_no; -}; - -struct GNU_PACKED action_frm_data { - u32 ifindex; - u8 bssid[MAC_ADDR_LEN]; - u8 destination_addr[MAC_ADDR_LEN]; - u8 transmitter_addr[MAC_ADDR_LEN]; - u32 chan; - u32 wait_time; - u32 no_cck; - u32 frm_len; - u16 seq_no; - char frm[0]; -}; - -struct GNU_PACKED roc_req { - u32 ifindex; - u32 chan; - u32 wait_time; -}; - -struct GNU_PACKED pmk_req { - u32 ifindex; - u8 pmk[LEN_PMK]; - u8 pmk_len; - u8 pmkid[LEN_PMKID]; - u8 authenticator_addr[MAC_ADDR_LEN]; - u8 supplicant_addr[MAC_ADDR_LEN]; - int timeout; - int akmp; -}; -#endif /*DPP_SUPPORT*/ - -#ifdef WIFI_MD_COEX_SUPPORT -#define LTE_CHN_MASK_IDX_NUM 4 - -struct GNU_PACKED unsafe_channel_notif_s { - u32 ch_bitmap[LTE_CHN_MASK_IDX_NUM]; -}; - -struct GNU_PACKED band_status_change { - u8 status; /*0-radio temporarily cannot be used, 1-radio can be used*/ -}; -#endif - -typedef union GNU_PACKED _wapp_event_data { - wapp_dev_info dev_info; - wdev_ht_cap ht_cap; - wdev_vht_cap vht_cap; - wdev_misc_cap misc_cap; - wapp_client_info cli_info; - wdev_chn_info chn_list; - wdev_op_class_info op_class; - wdev_bss_info bss_info; - wdev_ap_metric ap_metrics; - wdev_ap_config ap_conf; - wdev_tx_power tx_pwr; - wdev_steer_sta str_sta; - wapp_probe_info probe_info; - wapp_bcn_rpt_info bcn_rpt_info; - wapp_bssload_info bssload_info; - wapp_bssload_crossing_info bssload_crossing_info; - wapp_mnt_info mnt_info; - wapp_bss_state_info bss_state_info; - wapp_ch_change_info ch_change_info; - wapp_txpower_change_info txpwr_change_info; - wapp_apcli_association_info apcli_association_info; - wapp_bhsta_info bhsta_info; - wapp_csa_info csa_info; - wapp_sta_cnnct_rej_info sta_cnnct_rej_info; - u8 ch_util; - struct wapp_scan_info scan_info; - struct wapp_wsc_scan_info wsc_scan_info; - u32 a4_missing_entry_ip; - struct radar_notif_s radar_notif; - wapp_cac_info cac_info; -#ifdef MAP_R2 - wdev_extended_ap_metric ext_ap_metrics; - wdev_radio_metric radio_metrics; -#endif -#ifdef DPP_SUPPORT - u32 wapp_dpp_frame_id_no; - struct wapp_dpp_action_frame frame; - struct wapp_dpp_frm_tx_status tx_status; -#endif /*DPP_SUPPORT*/ - unsigned char cac_enable; -#ifdef WIFI_MD_COEX_SUPPORT - struct unsafe_channel_notif_s unsafe_ch_notif; - struct band_status_change band_status; -#endif -} wapp_event_data; -typedef struct GNU_PACKED _wapp_req_data { - u32 ifindex; - u8 mac_addr[MAC_ADDR_LEN]; - u32 value; - bssload_threshold bssload_thrd; - wdev_steer_policy str_policy; - wdev_ap_config ap_conf; - WSC_CREDENTIAL bh_wsc_profile; - struct scan_BH_ssids scan_bh_ssids; -} wapp_req_data; - -struct GNU_PACKED wapp_req { - u8 req_id; - u8 data_len; - wapp_req_data data; -}; - -struct GNU_PACKED wapp_event { - u8 len; - u8 event_id; - u32 ifindex; - wapp_event_data data; -}; - -typedef struct GNU_PACKED _tbtt_info_set { - u8 NrAPTbttOffset; - u32 ShortBssid; -} tbtt_info_set; - -typedef struct GNU_PACKED _wapp_nr_info { - u8 Bssid[MAC_ADDR_LEN]; - u32 BssidInfo; - u8 RegulatoryClass; - u8 ChNum; - u8 PhyType; - u8 CandidatePrefSubID; - u8 CandidatePrefSubLen; - u8 CandidatePref; - /* extra sec info */ - u32 akm; - u32 cipher; - u8 TbttInfoSetNum; - tbtt_info_set TbttInfoSet; - u8 Rssi; -} wapp_nr_info; - -/* for NR IE , append Bssid ~ CandidatePref */ -#define NEIGHBOR_REPORT_IE_SIZE (sizeof(wapp_nr_info) - 15) - -typedef struct daemon_nr_list { - u8 CurrListNum; - wapp_nr_info NRInfo[DAEMON_NEIGHBOR_REPORT_MAX_NUM]; -} DAEMON_NR_LIST, *P_DAEMON_NR_LIST; - -typedef struct GNU_PACKED daemon_neighbor_report_list { - u8 Newlist; - u8 TotalNum; - u8 CurrNum; - u8 reserved; - wapp_nr_info EvtNRInfo[PER_EVENT_LIST_MAX_NUM]; -} DAEMON_EVENT_NR_LIST, *P_DAEMON_EVENT_NR_LIST; - -typedef struct GNU_PACKED neighbor_report_msg { - DAEMON_EVENT_NR_LIST evt_nr_list; -} DAEMON_NR_MSG, *P_DAEMON_NR_MSG; - -/* for coverting wireless mode to string */ -enum WIFI_MODE { - WMODE_INVALID = 0, - WMODE_A = 1 << 0, - WMODE_B = 1 << 1, - WMODE_G = 1 << 2, - WMODE_GN = 1 << 3, - WMODE_AN = 1 << 4, - WMODE_AC = 1 << 5, - WMODE_AX_24G = 1 << 6, - WMODE_AX_5G = 1 << 7, - WMODE_AX_6G = 1 << 8, - WMODE_COMP = - 9, /* total types of supported wireless mode, add this value once yow add new type */ -}; -typedef union GNU_PACKED _RRM_BSSID_INFO { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - u32 Reserved : 18; - u32 FTM : 1; - u32 VHT : 1; - u32 HT : 1; - u32 MobilityDomain : 1; - u32 ImmediateBA : 1; - u32 DelayBlockAck : 1; - u32 RRM : 1; - u32 APSD : 1; - u32 Qos : 1; - u32 SpectrumMng : 1; - u32 KeyScope : 1; - u32 Security : 1; - u32 APReachAble : 2; -#else - u32 APReachAble : 2; - u32 Security : 1; - u32 KeyScope : 1; - u32 SpectrumMng : 1; - u32 Qos : 1; - u32 APSD : 1; - u32 RRM : 1; - u32 DelayBlockAck : 1; - u32 ImmediateBA : 1; - u32 MobilityDomain : 1; - u32 HT : 1; - u32 VHT : 1; - u32 FTM : 1; - u32 Reserved : 18; -#endif - } field; - u32 word; -} RRM_BSSID_INFO, *PRRM_BSSID_INFO; -#endif /* __WAPP_TYPES_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wfa_p2p.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wfa_p2p.h deleted file mode 100644 index 5c4eaff52e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wfa_p2p.h +++ /dev/null @@ -1,168 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - wfa_p2p.h - - Abstract: - Defined status code, IE and frame structures that WiFi Direct needed. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - - */ - -#ifndef __WFA_P2P_H -#define __WFA_P2P_H - -#include "rtmp_type.h" - -#if defined(P2P_SUPPORT) || defined(RT_CFG80211_SUPPORT) - -typedef struct _P2P_PUBLIC_FRAME { - HEADER_802_11 p80211Header; - UCHAR Category; - UCHAR Action; - UCHAR OUI[3]; - UCHAR OUIType; - UCHAR Subtype; - UCHAR Token; - UCHAR ElementID; - UCHAR Length; - UCHAR OUI2[3]; - UCHAR OUIType2; - UCHAR Octet[1]; -} P2P_PUBLIC_FRAME, *PP2P_PUBLIC_FRAME; - -typedef struct _P2P_ACTION_FRAME { - HEADER_802_11 p80211Header; - UCHAR Category; - UCHAR OUI[3]; - UCHAR OUIType; - UCHAR Subtype; - UCHAR Token; - UCHAR Octet[1]; -} P2P_ACTION_FRAME, *PP2P_ACTION_FRAME; - -typedef struct _FRAME_P2P_ACTION { - HEADER_802_11 Hdr; - UCHAR Category; - UCHAR OUI[3]; - UCHAR OUIType; /* 1 */ - UCHAR OUISubType; /* 1 */ - UCHAR Token; /* 1 */ -} FRAME_P2P_ACTION, *PFRAME_P2P_ACTION; - -typedef struct _MLME_P2P_ACTION_STRUCT { - UCHAR TabIndex; /* sometimes it's Mactable index, sometime it's P2P table index. depend on the command. */ - UCHAR Addr[MAC_ADDR_LEN]; -} MLME_P2P_ACTION_STRUCT, *PMLME_P2P_ACTION_STRUCT; - -typedef struct _P2P_NOA_DESC { - UCHAR Count; - UCHAR Duration[4]; - UCHAR Interval[4]; - UCHAR StartTime[4]; -} P2P_NOA_DESC, *PP2P_NOA_DESC; - -/* General format of P2P attribut(4.1.1) */ -#define SUBID_P2P_STATUS 0 -#define SUBID_P2P_MINOR_REASON 1 -#define SUBID_P2P_CAP 2 -#define SUBID_P2P_DEVICE_ID 3 -#define SUBID_P2P_OWNER_INTENT 4 -#define SUBID_P2P_CONFIG_TIMEOUT 5 -#define SUBID_P2P_LISTEN_CHANNEL 6 -#define SUBID_P2P_GROUP_BSSID 7 -#define SUBID_P2P_EXT_LISTEN_TIMING 8 -#define SUBID_P2P_INTERFACE_ADDR 9 -#define SUBID_P2P_MANAGEABILITY 10 -#define SUBID_P2P_CHANNEL_LIST 11 -#define SUBID_P2P_NOA 12 -#define SUBID_P2P_DEVICE_INFO 13 -#define SUBID_P2P_GROUP_INFO 14 -#define SUBID_P2P_GROUP_ID 15 -#define SUBID_P2P_INTERFACE 16 -#define SUBID_P2P_OP_CHANNEL 17 -#define SUBID_P2P_INVITE_FLAG 18 -#define SUBID_P2P_VENDOR 221 - -/* Status Code definitions(4.1.2) */ -#define P2PSTATUS_SUCCESS 0 -#define P2PSTATUS_PASSED 1 -#define P2PSTATUS_IMCOMPA_PARM 2 -#define P2PSTATUS_LIMIT 3 -#define P2PSTATUS_INVALID_PARM 4 -#define P2PSTATUS_UNABLE 5 -#define P2PSTATUS_NO_CHANNEL 7 -#define P2PSTATUS_UNKNOWN_GROUP 8 -#define P2PSTATUS_BOTH_INTENT15 9 -#define P2PSTATUS_INCOMPATIBLE_PROVISION 10 -#define P2PSTATUS_REJECT_BY_USER 11 - -/* bitmap of P2P Capability/ 1st byte is DEVCAP, 2nd byte is GRPCAP */ -/* Device Capability Bitmap definitio(4.1.4) */ -#define DEVCAP_SD 0x1 /* Service discovery */ -#define DEVCAP_CLIENT_DISCOVER 0x2 -#define DEVCAP_CLIENT_CONCURRENT 0x4 -#define DEVCAP_INFRA_MANAGED 0x8 -#define DEVCAP_DEVICE_LIMIT 0x10 -#define DEVCAP_INVITE 0x20 - -/*Group Capability Bitmap definition(4.1.4) */ -#define GRPCAP_OWNER 0x1 -#define GRPCAP_PERSISTENT 0x2 -#define GRPCAP_LIMIT 0x4 -#define GRPCAP_INTRA_BSS 0x8 -#define GRPCAP_CROSS_CONNECT 0x10 -#define GRPCAP_PERSISTENT_RECONNECT 0x20 -#define GRPCAP_GROUP_FORMING 0x40 - -/* P2P public action frame typ(4.2.8) */ -#define GO_NEGOCIATION_REQ 0 -#define GO_NEGOCIATION_RSP 1 -#define GO_NEGOCIATION_CONFIRM 2 -#define P2P_INVITE_REQ 3 -#define P2P_INVITE_RSP 4 -#define P2P_DEV_DIS_REQ 5 -#define P2P_DEV_DIS_RSP 6 -#define P2P_PROVISION_REQ 7 -#define P2P_PROVISION_RSP 8 - -/* P2P action frame typ(4.2.9) */ -#define P2PACT_NOA 0 -#define P2PACT_PERSENCE_REQ 1 -#define P2PACT_PERSENCE_RSP 2 -#define P2PACT_GO_DISCOVER_REQ 3 - -/* Service Protocol Type */ -#define SERVICE_PROTOCOL_TYPE_ALL 0 -#define SERVICE_PROTOCOL_TYPE_BONJOUR 1 -#define SERVICE_PROTOCOL_TYPE_UPNP 2 -#define SERVICE_PROTOCOL_TYPE_WS_DISCOVERY 3 -#define SERVICE_PROTOCOL_TYPE_WFD 4 -#define SERVICE_PROTOCOL_TYPE_VENDOR_SPECIFIC 255 - -#define SET_GO_NEGO_CONFIRM_TX_PID(__pAd, __OUI, __Pid) \ - { \ - if (IS_HIF_TYPE(__pAd, HIF_MT)) { \ - if (NdisEqualMemory(__OUI, P2POUIBYTE, 4)) \ - __Pid = (UCHAR)PID_P2P_ACTION; \ - } \ - } -#endif /* P2P_SUPPORT || RT_CFG80211_SUPPORT */ - -#endif /* __WFA_P2P_H */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wifi_sys_notify.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wifi_sys_notify.h deleted file mode 100644 index ae27908128..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wifi_sys_notify.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef __WIFI_SYS_NOTIFY_H__ -#define __WIFI_SYS_NOTIFY_H__ - -struct notify_entry; - -typedef INT (*notify_cb_t)(struct notify_entry *entry, INT action, VOID *data); - -struct notify_entry { - notify_cb_t notify_call; - struct notify_entry *next; - INT priority; - void *priv; -}; - -struct notify_head { - NDIS_SPIN_LOCK lock; - struct notify_entry *head; -}; - -#define INIT_NOTIFY_HEAD(_ad, _name) \ - do { \ - NdisAllocateSpinLock(_ad, &(_name)->lock); \ - (_name)->head = NULL; \ - } while (0) - -enum { - NOTIFY_STAT_DONE, - NOTIFY_STAT_OK, - NOTIFY_STAT_STOP = 0x8000, -}; - -INT mt_notify_chain_register(struct notify_head *head, - struct notify_entry *entry); -INT mt_notify_chain_unregister(struct notify_head *head, - struct notify_entry *entry); -INT mt_notify_call_chain(struct notify_head *head, INT val, VOID *v); - -#endif /*__WIFI_SYS_NOTIFY_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wlan_config/config_export.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wlan_config/config_export.h deleted file mode 100644 index eaefc53543..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wlan_config/config_export.h +++ /dev/null @@ -1,152 +0,0 @@ -/* * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __CONFIG_EXPORT_H__ -#define __CONFIG_EXPORT_H__ - -struct _RTMP_ADAPTER; - -struct wpf_data { - UCHAR idx; - void *dev; - void *conf; - void *oper; -}; - -struct wpf_ctrl { - struct wpf_data pf[WDEV_NUM_MAX]; -}; - -struct phy_cfg { - UINT8 tx_stream; - UINT8 rx_stream; - UCHAR cen_ch_2; - UCHAR ack_policy[WMM_NUM_OF_AC]; -#ifdef TXBF_SUPPORT - UCHAR ETxBfEnCond; - UCHAR ITxBfEn; -#endif /* TXBF_SUPPORT */ -}; - -struct ht_cfg { - UCHAR ext_cha; - UCHAR ht_bw; - UCHAR ht_stbc; - UCHAR ht_ldpc; - UCHAR ht_gi; - UCHAR ht_protect_en; - UCHAR ht_mode; /* mix_mode or gf_mode */ - UCHAR gf_support; - UCHAR ht40_intolerant; - UINT32 frag_thld; - UCHAR pkt_thld; - UINT32 len_thld; - UCHAR retry_limit; - UCHAR min_mpdu_start_space; - UCHAR amsdu_en; - UCHAR mmps; - /* EDCA parameters to be announced to its local BSS */ - struct _EDCA_PARM EdcaParm; -}; - -struct vht_cfg { - UCHAR vht_bw; - UCHAR vht_stbc; - UCHAR vht_ldpc; - UCHAR vht_sgi; /* including both bw80 & bw160 */ - UCHAR vht_bw_sig; /* 0:n/a, 1:static, 2:dynamic */ -}; - -/*for profile usage*/ -VOID wpf_init(struct _RTMP_ADAPTER *ad); -VOID wpf_exit(struct _RTMP_ADAPTER *ad); -VOID wpf_config_exit(struct _RTMP_ADAPTER *ad); -VOID wpf_config_init(struct _RTMP_ADAPTER *ad); - -/* -* Configure Get -*/ -UCHAR wlan_config_get_ht_bw(struct wifi_dev *wdev); -UINT8 wlan_config_get_tx_stream(struct wifi_dev *wdev); -UINT8 wlan_config_get_rx_stream(struct wifi_dev *wdev); -#ifdef TXBF_SUPPORT -UCHAR wlan_config_get_etxbf(struct wifi_dev *wdev); -UCHAR wlan_config_get_itxbf(struct wifi_dev *wdev); -#endif /* TXBF_SUPPORT */ -UCHAR wlan_config_get_ht_stbc(struct wifi_dev *wdev); -UCHAR wlan_config_get_ht_ldpc(struct wifi_dev *wdev); -#ifdef DOT11_VHT_AC -UCHAR wlan_config_get_vht_bw(struct wifi_dev *wdev); -UCHAR wlan_config_get_vht_stbc(struct wifi_dev *wdev); -UCHAR wlan_config_get_vht_ldpc(struct wifi_dev *wdev); -UCHAR wlan_config_get_vht_sgi(struct wifi_dev *wdev); -UCHAR wlan_config_get_vht_bw_sig(struct wifi_dev *wdev); -#endif /*DOT11_VHT_AC*/ -UCHAR wlan_config_get_ext_cha(struct wifi_dev *wdev); -UCHAR wlan_config_get_cen_ch_2(struct wifi_dev *wdev); -UCHAR wlan_config_get_ack_policy(struct wifi_dev *wdev, UCHAR ac_id); -BOOLEAN wlan_config_get_edca_valid(struct wifi_dev *wdev); -struct _EDCA_PARM *wlan_config_get_ht_edca(struct wifi_dev *wdev); -UINT32 wlan_config_get_frag_thld(struct wifi_dev *wdev); -UINT32 wlan_config_get_rts_len_thld(struct wifi_dev *wdev); -UCHAR wlan_config_get_rts_pkt_thld(struct wifi_dev *wdev); -UCHAR wlan_config_get_ht_gi(struct wifi_dev *wdev); -UCHAR wlan_config_get_ht_protect_en(struct wifi_dev *wdev); -UCHAR wlan_config_get_ht_mode(struct wifi_dev *wdev); -UCHAR wlan_config_get_greenfield(struct wifi_dev *wdev); -UCHAR wlan_config_get_40M_intolerant(struct wifi_dev *wdev); -UCHAR wlan_config_get_amsdu_en(struct wifi_dev *wdev); -UCHAR wlan_config_get_min_mpdu_start_space(struct wifi_dev *wdev); -UCHAR wlan_config_get_mmps(struct wifi_dev *wdev); -/* -* Configure Set -*/ -VOID wlan_config_set_ht_bw(struct wifi_dev *wdev, UCHAR ht_bw); -VOID wlan_config_set_ht_bw_all(struct wpf_ctrl *ctrl, UCHAR ht_bw); -VOID wlan_config_set_tx_stream(struct wifi_dev *wdev, UINT8 tx_stream); -VOID wlan_config_set_rx_stream(struct wifi_dev *wdev, UINT8 rx_stream); -#ifdef TXBF_SUPPORT -VOID wlan_config_set_etxbf(struct wifi_dev *wdev, UCHAR ETxBfEnCond); -VOID wlan_config_set_itxbf(struct wifi_dev *wdev, UCHAR ITxBfEn); -#endif /* TXBF_SUPPORT */ -VOID wlan_config_set_ht_stbc(struct wifi_dev *wdev, UCHAR ht_stbc); -VOID wlan_config_set_ht_ldpc(struct wifi_dev *wdev, UCHAR ht_ldpc); -VOID wlan_config_set_ht_mode(struct wifi_dev *wdev, UCHAR ht_mode); -VOID wlan_config_set_40M_intolerant(struct wifi_dev *wdev, UCHAR val); -#ifdef DOT11_VHT_AC -VOID wlan_config_set_vht_stbc(struct wifi_dev *wdev, UCHAR vht_stbc); -VOID wlan_config_set_vht_ldpc(struct wifi_dev *wdev, UCHAR vht_ldpc); -VOID wlan_config_set_vht_sgi(struct wifi_dev *wdev, UCHAR vht_sgi); -VOID wlan_config_set_vht_bw_sig(struct wifi_dev *wdev, UCHAR vht_bw_sig); -VOID wlan_config_set_vht_bw(struct wifi_dev *wdev, UCHAR vht_bw); -VOID wlan_config_set_vht_bw_all(struct wpf_ctrl *ctrl, UCHAR vht_bw); -#endif /*DOT11_VHT_AC*/ -VOID wlan_config_set_ht_ext_cha(struct wifi_dev *wdev, UCHAR ext_cha); -VOID wlan_config_set_ht_ext_cha_all(struct wpf_ctrl *ctrl, UCHAR ext_cha); -VOID wlan_config_set_ext_cha(struct wifi_dev *wdev, UCHAR ext_cha); -VOID wlan_config_set_cen_ch_2(struct wifi_dev *wdev, UCHAR cen_ch_2); -VOID wlan_config_set_cen_ch_2_all(struct wpf_ctrl *ctrl, UCHAR cen_ch_2); -VOID wlan_config_set_ack_policy(struct wifi_dev *wdev, UCHAR *policy); -VOID wlan_config_set_ack_policy_all(struct wpf_ctrl *ctrl, UCHAR *policy); -VOID wlan_config_set_edca_valid(struct wifi_dev *wdev, BOOLEAN bValid); -VOID wlan_config_set_edca_valid_all(struct wpf_ctrl *ctrl, BOOLEAN bValid); -VOID wlan_config_set_frag_thld(struct wifi_dev *wdev, UINT32 frag_thld); -VOID wlan_config_set_rts_len_thld(struct wifi_dev *wdev, UINT32 len_thld); -VOID wlan_config_set_rts_pkt_thld(struct wifi_dev *wdev, UCHAR pkt_thld); -VOID wlan_config_set_ht_gi(struct wifi_dev *wdev, UCHAR ht_git); -VOID wlan_config_set_ht_protect_en(struct wifi_dev *wdev, UCHAR ht_protect); -VOID wlan_config_set_amsdu_en(struct wifi_dev *wdev, UCHAR enable); -VOID wlan_config_set_min_mpdu_start_space(struct wifi_dev *wdev, - UCHAR mpdu_density); -VOID wlan_config_set_mmps(struct wifi_dev *wdev, UCHAR mmps); -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wlan_config/config_internal.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wlan_config/config_internal.h deleted file mode 100644 index 674000c09e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wlan_config/config_internal.h +++ /dev/null @@ -1,49 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#ifndef __CONFIG_INTERNAL_H__ -#define __CONFIG_INTERNAL_H__ - -#include "mgmt/be_internal.h" - -/* -* define struct constructor & deconstructor -*/ - -VOID phy_cfg_init(struct phy_cfg *obj); -VOID phy_cfg_exit(struct phy_cfg *obj); - -/* -*ht phy info related -*/ -VOID ht_cfg_init(struct ht_cfg *obj); -VOID ht_cfg_exit(struct ht_cfg *obj); - -/* -*vht info related -*/ -#ifdef DOT11_VHT_AC -VOID vht_cfg_init(struct vht_cfg *obj); -VOID vht_cfg_exit(struct vht_cfg *obj); -#endif /* #ifdef DOT11_VHT_AC */ - -/* -* internal export configure loader -*/ - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wnm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wnm.h deleted file mode 100644 index 3cf1c2269e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wnm.h +++ /dev/null @@ -1,385 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2011, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wnm.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WNM_H__ -#define __WNM_H__ - -#include "ipv6.h" -#include "mat.h" - -#define BTM_MACHINE_BASE 0 -#ifdef CONFIG_11KV_API_SUPPORT -#define WaitPeerBTMRspTimeoutVale (15 * 1000) -#define WaitPeerBTMReqTimeoutVale (30 * 1000) -#else -#define WaitPeerBTMRspTimeoutVale 4000 -#define WaitPeerBTMReqTimeoutVale (1024) -#endif /* CONFIG_11KV_API_SUPPORT */ - -#define BTM_ENABLE_OFFSET (1 << 0) -#ifdef CONFIG_11KV_API_SUPPORT -#define BTM_CANDIDATE_OFFSET (1 << 0) -#define BTM_ABRIDGED_OFFSET (1 << 1) -#define BTM_DISASSOC_OFFSET (1 << 2) -#define BTM_TERMINATION_OFFSET (1 << 3) -#define BTM_URL_OFFSET (1 << 4) -#endif /* CONFIG_11KV_API_SUPPORT */ - -/* BTM states */ -enum BTM_STATE { - WAIT_BTM_QUERY, - WAIT_PEER_BTM_QUERY, - WAIT_BTM_REQ, - WAIT_BTM_RSP, - WAIT_PEER_BTM_REQ, - WAIT_PEER_BTM_RSP, - BTM_UNKNOWN, - MAX_BTM_STATE, -}; - -/* BTM events */ -enum BTM_EVENT { - BTM_QUERY, - PEER_BTM_QUERY, - BTM_REQ, - BTM_REQ_IE, - BTM_REQ_PARAM, - BTM_REQ_FRAME, - BTM_RSP, - PEER_BTM_REQ, - PEER_BTM_RSP, - BTM_REQ_TIMEOUT, - PEER_BTM_RSP_TIMEOUT, - MAX_BTM_MSG, -}; - -#define BTM_FUNC_SIZE (MAX_BTM_STATE * MAX_BTM_MSG) - -enum IPV6_TYPE { - IPV6_LINK_LOCAL, - IPV6_GLOBAL, -}; - -typedef struct GNU_PACKED _BTM_EVENT_DATA { - UCHAR ControlIndex; - UCHAR PeerMACAddr[MAC_ADDR_LEN]; - UINT16 EventType; - union { -#ifdef CONFIG_AP_SUPPORT - struct { - UCHAR DialogToken; - UINT16 BTMReqLen; - UCHAR BTMReq[0]; - } GNU_PACKED BTM_REQ_DATA; - - struct { - UCHAR DialogToken; - UINT16 BTMQueryLen; - UCHAR BTMQuery[0]; - } GNU_PACKED PEER_BTM_QUERY_DATA; - - struct { - UCHAR DialogToken; - UINT16 BTMRspLen; - UCHAR BTMRsp[0]; - } GNU_PACKED PEER_BTM_RSP_DATA; -#endif /* CONFIG_AP_SUPPORT */ - } u; -} BTM_EVENT_DATA, *PBTM_EVENT_DATA; - -typedef struct _BTM_PEER_ENTRY { - DL_LIST List; - enum BTM_STATE CurrentState; - UCHAR ControlIndex; - UCHAR PeerMACAddr[MAC_ADDR_LEN]; - UCHAR DialogToken; - void *Priv; -#ifdef CONFIG_AP_SUPPORT - RALINK_TIMER_STRUCT WaitPeerBTMRspTimer; - RALINK_TIMER_STRUCT WaitPeerBTMReqTimer; -#endif /* CONFIG_AP_SUPPORT */ - UINT32 WaitPeerBTMRspTime; -} BTM_PEER_ENTRY, *PBTM_PEER_ENTRY; - -typedef struct _PROXY_ARP_IPV4_ENTRY { - DL_LIST List; - UCHAR TargetMACAddr[MAC_ADDR_LEN]; - UCHAR TargetIPAddr[4]; -} PROXY_ARP_IPV4_ENTRY, *PPROXY_ARP_IPV4_ENTRY; - -typedef struct _PROXY_ARP_IPV4_UNIT { - UCHAR TargetMACAddr[MAC_ADDR_LEN]; - UCHAR TargetIPAddr[4]; -} PROXY_ARP_IPV4_UNIT, *PPROXY_ARP_IPV4_UNIT; - -typedef struct _PROXY_ARP_IPV6_ENTRY { - DL_LIST List; - UCHAR TargetMACAddr[MAC_ADDR_LEN]; - UCHAR TargetIPType; - UCHAR TargetIPAddr[16]; -} PROXY_ARP_IPV6_ENTRY, *PPROXY_ARP_IPV6_ENTRY; - -typedef struct _PROXY_ARP_IPV6_UNIT { - UCHAR TargetMACAddr[MAC_ADDR_LEN]; - UCHAR TargetIPType; - UCHAR TargetIPAddr[16]; -} PROXY_ARP_IPV6_UNIT, *PPROXY_ARP_IPV6_UNIT; - -typedef struct _WNM_CTRL { - UINT32 TimeadvertisementIELen; - UINT32 TimezoneIELen; - PUCHAR TimeadvertisementIE; - PUCHAR TimezoneIE; - RTMP_OS_SEM BTMPeerListLock; - RTMP_OS_SEM WNMNotifyPeerListLock; - BOOLEAN ProxyARPEnable; - BOOLEAN WNMNotifyEnable; - BOOLEAN WNMBTMEnable; - BOOLEAN WNMCertEnable; - RTMP_OS_SEM ProxyARPListLock; - RTMP_OS_SEM ProxyARPIPv6ListLock; - DL_LIST IPv4ProxyARPList; - DL_LIST IPv6ProxyARPList; - DL_LIST BTMPeerList; - DL_LIST WNMNotifyPeerList; -} WNM_CTRL, *PWNM_CTRL; - -#ifdef BB_SOC -#ifdef IPV6 -#undef IPV6 -enum IPTYPE { IPV4, IPV6 }; -#endif -#else -enum IPTYPE { IPV4, IPV6 }; -#endif /* BB_SOC */ - -struct _BSS_STRUCT; - -typedef struct GNU_PACKED _BTM_REQUEST_PARAM { - UINT8 request_mode; - UINT16 disassociation_timer; - UINT8 validity_interval; -} BTM_REQUEST_PARAM, *PBTM_REQUEST_PARAM; - -BOOLEAN IsGratuitousARP(IN PRTMP_ADAPTER pAd, IN PUCHAR pData, - IN UCHAR *DAMacAddr, IN struct _BSS_STRUCT *pMbss); - -BOOLEAN IsUnsolicitedNeighborAdver(PRTMP_ADAPTER pAd, PUCHAR pData); - -BOOLEAN IsIPv4ProxyARPCandidate(IN PRTMP_ADAPTER pAd, IN PUCHAR pData); - -BOOLEAN IsIPv6ProxyARPCandidate(IN PRTMP_ADAPTER pAd, IN PUCHAR pData); - -BOOLEAN IsIPv6DHCPv6Solicitation(IN PRTMP_ADAPTER pAd, IN PUCHAR pData); - -BOOLEAN IsIPv6RouterSolicitation(IN PRTMP_ADAPTER pAd, IN PUCHAR pData); - -BOOLEAN IsIPv6RouterAdvertisement(IN PRTMP_ADAPTER pAd, IN PUCHAR pData, - IN PUCHAR pOffset); - -BOOLEAN IsTDLSPacket(IN PRTMP_ADAPTER pAd, IN PUCHAR pData); - -BOOLEAN IPv4ProxyARP(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss, - IN PUCHAR pData, IN BOOLEAN FromDS); - -BOOLEAN IsIpv6DuplicateAddrDetect(PRTMP_ADAPTER pAd, PUCHAR pData, - PUCHAR pOffset); - -BOOLEAN IPv6ProxyARP(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss, - IN PUCHAR pData, IN BOOLEAN FromDS); - -UINT32 AddIPv4ProxyARPEntry(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss, - IN PUCHAR pTargetMACAddr, IN PUCHAR pTargetIPAddr); - -UINT32 AddIPv6ProxyARPEntry(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss, - IN PUCHAR pTargetMACAddr, IN PUCHAR pTargetIPAddr); - -UINT32 IPv4ProxyARPTableLen(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss); - -UINT32 IPv6ProxyARPTableLen(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss); - -BOOLEAN GetIPv4ProxyARPTable(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss, - OUT PUCHAR *ProxyARPTable); - -BOOLEAN GetIPv6ProxyARPTable(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss, - OUT PUCHAR *ProxyARPTable); - -VOID RemoveIPv4ProxyARPEntry(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss, - PUCHAR pTargetMACAddr); - -VOID RemoveIPv6ProxyARPEntry(IN PRTMP_ADAPTER pAd, IN struct _BSS_STRUCT *pMbss, - PUCHAR pTargetMACAddr); - -VOID WNMCtrlInit(IN PRTMP_ADAPTER pAd); -VOID WNMCtrlExit(IN PRTMP_ADAPTER pAd); -VOID Clear_All_PROXY_TABLE(IN PRTMP_ADAPTER pAd); -/* WNM Notification states */ -enum WNM_NOTIFY_STATE { - WAIT_WNM_NOTIFY_REQ, - WAIT_WNM_NOTIFY_RSP, - WNM_NOTIFY_UNKNOWN, - MAX_WNM_NOTIFY_STATE, -}; - -/* WNM Notification events */ -enum WNM_NOTIFY_EVENT { - WNM_NOTIFY_REQ, - WNM_NOTIFY_RSP, - MAX_WNM_NOTIFY_MSG, -}; - -#define WNM_NOTIFY_FUNC_SIZE (MAX_WNM_NOTIFY_STATE * MAX_WNM_NOTIFY_MSG) - -#ifdef CONFIG_AP_SUPPORT -VOID WNMIPv4ProxyARPCheck(IN PRTMP_ADAPTER pAd, PNDIS_PACKET pPacket, - USHORT srcPort, USHORT dstPort, PUCHAR pSrcBuf); - -VOID WNMIPv6ProxyARPCheck(IN PRTMP_ADAPTER pAd, PNDIS_PACKET pPacket, - PUCHAR pSrcBuf); - -DECLARE_TIMER_FUNCTION(WaitPeerBTMRspTimeout); -DECLARE_TIMER_FUNCTION(WaitPeerWNMNotifyRspTimeout); -DECLARE_TIMER_FUNCTION(WaitPeerBTMReqTimeout); - -VOID BTMStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -enum BTM_STATE BTMPeerCurrentState(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem); - -VOID ReceiveWNMNotifyReq(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -NDIS_STATUS wnm_handle_command(IN PRTMP_ADAPTER pAd, - IN struct wnm_command *pCmd_data); - -void WNM_ReadParametersFromFile(IN PRTMP_ADAPTER pAd, RTMP_STRING *tmpbuf, - RTMP_STRING *buffer); - -INT Set_WNMCertEnable_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -VOID ReceiveWNMNotifyRsp(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID SendWNMNotifyConfirm(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -VOID WNMNotifyStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); - -#define WNM_NOTIFY_MACHINE_BASE 0 -#define WaitPeerWNMNotifyRspTimeoutVale 1024 - -typedef struct GNU_PACKED _WNM_NOTIFY_EVENT_DATA { - UCHAR ControlIndex; - UCHAR PeerMACAddr[MAC_ADDR_LEN]; - UINT16 EventType; - union { -#ifdef CONFIG_AP_SUPPORT - struct { - UCHAR DialogToken; - UINT16 WNMNotifyReqLen; - UCHAR WNMNotifyReq[0]; - } GNU_PACKED WNM_NOTIFY_REQ_DATA; - - struct { - UCHAR DialogToken; - UINT16 WNMNotifyRspLen; - UCHAR WNMNotifyRsp[0]; - } GNU_PACKED WNM_NOTIFY_RSP_DATA; -#endif /* CONFIG_AP_SUPPORT */ - } u; -} WNM_NOTIFY_EVENT_DATA, *PWNM_NOTIFY_EVENT_DATA; - -typedef struct _WNM_NOTIFY_PEER_ENTRY { - DL_LIST List; - enum WNM_NOTIFY_STATE CurrentState; - UCHAR ControlIndex; - UCHAR PeerMACAddr[MAC_ADDR_LEN]; - UCHAR DialogToken; - void *Priv; -#ifdef CONFIG_AP_SUPPORT - RALINK_TIMER_STRUCT WaitPeerWNMNotifyRspTimer; -#endif /* CONFIG_AP_SUPPORT */ -} WNM_NOTIFY_PEER_ENTRY, *PWNM_NOTIFY_PEER_ENTRY; - -INT Send_BTM_Req(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *BTMReq, IN UINT32 BTMReqLen); - -INT Send_WNM_Notify_Req(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *WNMNotifyReq, IN UINT32 WNMNotifyReqLen, - IN UINT32 type); - -INT Send_QOSMAP_Configure(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *PeerMACAddr, - IN RTMP_STRING *QosMapBuf, IN UINT32 QosMapLen, - IN UINT8 Apidx); - -#ifdef CONFIG_HOTSPOT_R2 -VOID WNMSetPeerCurrentState(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem, - IN enum WNM_NOTIFY_STATE State); - -enum WNM_NOTIFY_STATE WNMNotifyPeerCurrentState(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem); - -VOID WNMNotifyStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]); -#endif /* CONFIG_HOTSPOT_R2 */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef CONFIG_11KV_API_SUPPORT -int send_btm_req_param(IN PRTMP_ADAPTER pAd, IN p_btm_reqinfo_t p_btm_req_data, - IN UINT32 btm_req_data_len); - -int send_btm_req_ie(IN PRTMP_ADAPTER pAd, IN p_btm_req_ie_data_t p_btm_req_data, - IN UINT32 btm_req_data_len); - -int check_btm_custom_params(IN PRTMP_ADAPTER pAd, - IN p_btm_reqinfo_t p_btm_req_data, - IN UINT32 btm_req_data_len); - -int compose_btm_req_ie(IN PRTMP_ADAPTER pAd, OUT PUCHAR p_btm_req_ie, - OUT PUINT32 p_btm_req_ie_len, - IN p_btm_reqinfo_t p_btm_req_data, - IN UINT32 btm_req_data_len); - -VOID WNM_InsertBSSTerminationSubIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PUINT32 pFrameLen, IN UINT64 TSF, - IN UINT16 Duration); - -VOID RRM_InsertPreferenceSubIE(IN PRTMP_ADAPTER pAd, OUT PUCHAR pFrameBuf, - OUT PUINT32 pFrameLen, IN UINT8 preference); -#endif /* CONFIG_11KV_API_SUPPORT */ - -#ifdef CONFIG_DOT11V_WNM -INT Set_SendBTMReq_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg); -#endif -#ifdef MAP_R2 -void SendBTMQueryEvent(PNET_DEV net_dev, const char *peer_mac_addr, - const char *btm_query, UINT16 btm_query_len, - UINT8 ipc_type); - -void SendWNMNotifyEvent(PNET_DEV net_dev, const char *peer_mac_addr, - const char *wnm_req, UINT16 wnm_req_len); -#endif -#endif /* __WNM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wnm_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wnm_cmm.h deleted file mode 100644 index 86a2c8e871..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wnm_cmm.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Abstract: - -***************************************************************************/ - -#ifndef __WNM_CONFIG_H__ -#define __WNM_CONFIG_H__ - -#endif /* __WNM_CONFIG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wsc.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wsc.h deleted file mode 100644 index ac3bf2a050..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wsc.h +++ /dev/null @@ -1,924 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wsc.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs - Paul Lin 06-08-08 Initial -*/ - -#ifndef __WSC_H__ -#define __WSC_H__ - -#if defined(__ECOS) && defined(BRANCH_ADV) -extern int CFG_set(int id, void *val); -extern int CFG_str2id(char *var); -extern int CFG_commit(int id); -#else -#define CFG_set(a, b) \ - { \ - } -#define CFG_str2id(a) \ - { \ - } -#define CFG_commit(a) \ - { \ - } -#endif /*__ECOS && BRANCH_ADV */ - -/* WSC OUI SMI */ -#define WSC_OUI 0x0050f204 -#define WSC_SMI 0x00372A -#define WSC_VENDOR_TYPE 0x00000001 - -/* EAP code */ -#define EAP_CODE_REQ 0x01 -#define EAP_CODE_RSP 0x02 -#define EAP_CODE_FAIL 0x04 -#define EAP_TYPE_ID 0x01 -#define EAP_TYPE_NOTIFY 0x02 -#define EAP_TYPE_WSC 0xfe - -#define WDEV_WSC_AP(__wdev) \ - ((__wdev->wdev_type == WDEV_TYPE_AP) || \ - (__wdev->wdev_type == WDEV_TYPE_GO)) - -#ifdef CON_WPS -typedef struct GNU_PACKED _WSC_UPNP_CTRL_WSC_BAND_STOP { - char ifName[IFNAMSIZ]; - CHAR is2gBand; - CHAR isApCli; - INT status; -} WSC_UPNP_CTRL_WSC_BAND_STOP, *PWSC_UPNP_CTRL_WSC_BAND_STOP; - -enum { - CON_WPS_APCLI_BAND_AUTO, - CON_WPS_APCLI_BAND_2G, - CON_WPS_APCLI_BAND_5G, - CON_WPS_APCLI_BAND_MAX, -}; - -enum { - CON_WPS_APCLI_AUTO_PREFER_IFACE0, - CON_WPS_APCLI_AUTO_PREFER_IFACE1, - CON_WPS_APCLI_AUTO_PREFER_IFACE_MAX, -}; - -enum { - CON_WPS_APCLI_SCANDONE_STATUS_NOTRIGGER, - CON_WPS_APCLI_SCANDONE_STATUS_ONGOING, - CON_WPS_APCLI_SCANDONE_STATUS_FINISH, -}; - -#ifdef CON_WPS -#define CON_WPS_STATUS_DISABLED 0x00 -#define CON_WPS_STATUS_AP_RUNNING 0x01 -#define CON_WPS_STATUS_APCLI_RUNNING 0x02 -#endif /* CON_WPS */ - -VOID ConWpsApCliMonitorTimeout(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); - -#define CON_WPS_APCLIENT_MONITOR_TIME 10000 -#endif /* CON_WPS */ - -/* structure to store Simple Config Attributes Info */ -typedef struct GNU_PACKED _WSC_LV_INFO { - USHORT ValueLen; - UCHAR Value[512]; -} WSC_LV_INFO; - -typedef struct GNU_PACKED _WSC_IE_HEADER { - UCHAR elemId; - UCHAR length; - UCHAR oui[4]; -} WSC_IE_HEADER; - -/* WSC IE structure */ -typedef struct GNU_PACKED _WSC_IE { - USHORT Type; - USHORT Length; - UCHAR Data[1]; /* variable length data */ -} WSC_IE, *PWSC_IE; - -/* WSC fixed information within EAP */ -typedef struct GNU_PACKED _WSC_FRAME { - UCHAR SMI[3]; - UINT VendorType; - UCHAR OpCode; - UCHAR Flags; -} WSC_FRAME, *PWSC_FRAME; - -/* EAP frame format */ -typedef struct GNU_PACKED _EAP_FRAME { - UCHAR Code; /* 1 = Request, 2 = Response */ - UCHAR Id; - USHORT Length; - UCHAR Type; /* 1 = Identity, 0xfe = reserved, used by WSC */ -} EAP_FRAME, *PEAP_FRAME; - -static inline BOOLEAN WscCheckWSCHeader(UCHAR *pData) -{ - WSC_FRAME *pWsc = (WSC_FRAME *)pData; - - /* Verify SMI first */ - if (((pWsc->SMI[0] * 256 + pWsc->SMI[1]) * 256 + pWsc->SMI[2]) != - WSC_SMI) - return FALSE; /* Wrong WSC SMI Vendor ID, Update WSC status */ - - /* Verify Vendor Type */ - if (cpu2be32(get_unaligned32(&pWsc->VendorType)) != WSC_VENDOR_TYPE) - return FALSE; /* Wrong WSC Vendor Type, Update WSC status */ - - return TRUE; -} - -#ifdef WSC_INCLUDED - -/* WSC HDR PSH BTN FUNC */ -/* WSC hardware push button function 0811 */ -#define WSC_HDR_BTN_CHECK_PERIOD \ - MLME_TASK_EXEC_INTV /* unit: ms, check pin every 100ms */ -#ifdef VENDOR_FEATURE7_SUPPORT -#define WSC_HDR_BTN_PRESS_TIME 3000 /* unit: ms, press button for 3s */ -#else -#define WSC_HDR_BTN_PRESS_TIME 2000 /* unit: ms, press button for 2s */ -#endif -#define WSC_HDR_BTN_CONT_TIMES \ - (WSC_HDR_BTN_PRESS_TIME / WSC_HDR_BTN_CHECK_PERIOD) -#define WSC_HDR_BTN_GPIO_0 ((UINT32)0x00000001) /* bit 0 for RT2860/RT2870 */ -#define WSC_HDR_BTN_GPIO_3 ((UINT32)0x00000008) /* bit 3 for RT2860/RT2870 */ - -/* bit7: WPS PBC (0:off, 1:on) */ -#define WSC_HDR_BTN_MR_HDR_SUPPORT_SET(__pAd, __FlgIsSup) \ - ((__pAd)->WscHdrPshBtnFlag = __FlgIsSup) - -/* check if hardware push button is supported */ -#define WSC_HDR_BTN_MR_IS_HDR_SUPPORT(__pAd) ((__pAd)->WscHdrPshBtnFlag) - -/* run hardware push button handler */ -#define WSC_HDR_BTN_MR_HANDLE(__pAd) \ - do { \ - if ((__pAd)->WscHdrPshBtnFlag) \ - WSC_HDR_BTN_CheckHandler(__pAd); \ - } while (0) - -/* bit3: WPS PBC function is controlled through GPIO[3] */ - -/* currently only for RT2860 & RT2870 */ -/* TODO: shiang-7603 */ -#define WSC_HDR_BTN_MR_PRESS_FLG_GET(__pAd, __FlgIsPressed) \ - { \ - UINT32 __gpio_value, mask; \ - if (IS_HIF_TYPE(__pAd, HIF_MT)) { \ - MTWF_LOG(DBG_CAT_SEC, CATSEC_WPS, DBG_LVL_OFF, \ - ("%s(%d): Not support for HIF_MT yet!\n", \ - __func__, __LINE__)); \ - } else { \ - RTMP_IO_READ32(__pAd, GPIO_CTRL_CFG, (&__gpio_value)); \ - if (RTMP_TEST_MORE_FLAG(__pAd, \ - fRTMP_ADAPTER_WSC_PBC_PIN0)) \ - mask = WSC_HDR_BTN_GPIO_0; \ - else \ - mask = WSC_HDR_BTN_GPIO_3; \ - if (__gpio_value & mask) \ - __FlgIsPressed = 0; \ - else \ - __FlgIsPressed = 1; \ - } \ - } -/* WSC HDR PSH BTN FUNC */ - -#define WSC_TIMER_INIT(_pAd, _pData, _time_var, _time_flg, _time_fn) \ - do { \ - RTMPInitTimer((_pAd), (_time_var), \ - GET_TIMER_FUNCTION(_time_fn), (_pData), FALSE); \ - (_time_flg) = FALSE; \ - } while (0) - -/*Messages for the WSC state machine, */ -#define WSC_MACHINE_BASE 34 -#define WSC_EAPOL_PACKET_MSG 34 -#define WSC_EAPOL_START_MSG 35 -#define WSC_EAPOL_UPNP_MSG 36 - -#define MAX_WSC_MSG 3 - -/* WSC Opcode */ -#define WSC_OPCODE_START 0x01 -#define WSC_OPCODE_ACK 0x02 -#define WSC_OPCODE_NACK 0x03 -#define WSC_OPCODE_MSG 0x04 -#define WSC_OPCODE_DONE 0x05 -#define WSC_OPCODE_FRAG_ACK 0x06 - -/* Flags */ -#define WSC_MSG_FLAG_MF 0x01 /* More fragments */ -#define WSC_MSG_FLAG_LF 0x02 /* Length field */ - -#define WSC_OPCODE_UPNP_MASK 0x10 -#define WSC_OPCODE_UPNP_DATA 0x11 -#define WSC_OPCODE_UPNP_MGMT 0x12 -#define WSC_OPCODE_UPNP_CTRL 0x13 - -#define WSC_UPNP_MGMT_SUB_PROBE_REQ 0x01 -#define WSC_UPNP_MGMT_SUB_CONFIG_REQ 0x02 -#define WSC_UPNP_MGMT_SUB_REG_SELECT 0x03 - -/*patch for Atheros External registrar */ -#define WSC_UPNP_DATA_SUB_INCLUDE_MAC 0x0100 - -#define WSC_UPNP_DATA_SUB_NORMAL 0x00 -#define WSC_UPNP_DATA_SUB_TO_ALL 0x01 -#define WSC_UPNP_DATA_SUB_TO_ONE 0x02 -#define WSC_UPNP_DATA_SUB_ACK 0x03 -#define WSC_UPNP_DATA_SUB_M1 0x04 -#define WSC_UPNP_DATA_SUB_M2 0x05 -#define WSC_UPNP_DATA_SUB_M2D 0x06 -#define WSC_UPNP_DATA_SUB_M3 0x07 -#define WSC_UPNP_DATA_SUB_M4 0x08 -#define WSC_UPNP_DATA_SUB_M5 0x09 -#define WSC_UPNP_DATA_SUB_M6 0x0A -#define WSC_UPNP_DATA_SUB_M7 0x0B -#define WSC_UPNP_DATA_SUB_M8 0x0C -#define WSC_UPNP_DATA_SUB_WSC_ACK 0x0D -#define WSC_UPNP_DATA_SUB_WSC_NACK 0x0E -#define WSC_UPNP_DATA_SUB_WSC_DONE 0x0F -#define WSC_UPNP_DATA_SUB_PBC_OVERLAP 0x10 -#define WSC_UPNP_DATA_SUB_WSC_TIMEOUT 0x20 -#define WSC_UPNP_DATA_SUB_WSC_UNKNOWN 0xff - -/* Wsc EAP Messges type */ -#define WSC_MSG_EAP_RSP_ID 0x21 -#define WSC_MSG_EAP_REG_RSP_ID 0x22 -#define WSC_MSG_EAP_ENR_RSP_ID 0x23 -#define WSC_MSG_EAP_UPNP_RSP_ID 0x24 -#define WSC_MSG_EAP_REQ_ID 0x25 -#define WSC_MSG_EAP_REQ_START 0x26 -#define WSC_MSG_EAP_FAIL 0x27 -#define WSC_MSG_EAP_FRAG_ACK 0x28 -#define WSC_MSG_PROB_RSP 0x01 -#define WSC_MSG_EAPOL_START 0x02 -#define WSC_MSG_M1 0x04 -#define WSC_MSG_M2 0x05 -#define WSC_MSG_M2D 0x06 -#define WSC_MSG_M3 0x07 -#define WSC_MSG_M4 0x08 -#define WSC_MSG_M5 0x09 -#define WSC_MSG_M6 0x0A -#define WSC_MSG_M7 0x0B -#define WSC_MSG_M8 0x0C -#define WSC_MSG_WSC_ACK 0x0D -#define WSC_MSG_WSC_NACK 0x0E -#define WSC_MSG_WSC_DONE 0x0F -#define WSC_MSG_UNKNOWN 0xff - -/* WSC connection mode */ -#define WSC_PIN_MODE 1 -#define WSC_PBC_MODE 2 -#define WSC_SMPBC_MODE 3 - -/* Value of WSC_IE_DEV_PASS_ID 0x1012 */ -#define DEV_PASS_ID_PIN 0x0000 -#define DEV_PASS_ID_USER 0x0001 -#define DEV_PASS_ID_MACHINE 0x0002 -#define DEV_PASS_ID_REKEY 0x0003 -#define DEV_PASS_ID_PBC 0x0004 -#define DEV_PASS_ID_REG 0x0005 -#define DEV_PASS_ID_SMPBC 0x0006 -#define DEV_PASS_ID_NOSPEC 0xffff - -/* Common definition */ -#define WSC_VERSION 0x10 -#define WSC_CONFIG_METHODS 0x008C - -/* Wsc status code */ -#define STATUS_WSC_NOTUSED 0 -#define STATUS_WSC_IDLE 1 -#define STATUS_WSC_FAIL 2 /* WSC Process Fail */ -#define STATUS_WSC_LINK_UP 3 /* Start WSC Process */ -#define STATUS_WSC_EAPOL_START_RECEIVED 4 /* Received EAPOL-Start */ -#define STATUS_WSC_EAP_REQ_ID_SENT 5 /* Sending EAP-Req(ID) */ -#define STATUS_WSC_EAP_RSP_ID_RECEIVED 6 /* Receive EAP-Rsp(ID) */ -#define STATUS_WSC_EAP_RSP_WRONG_SMI \ - 7 /* Receive EAP-Req with wrong WSC SMI Vendor Id */ -#define STATUS_WSC_EAP_RSP_WRONG_VENDOR_TYPE \ - 8 /* Receive EAPReq with wrong WSC Vendor Type */ -#define STATUS_WSC_EAP_REQ_WSC_START 9 /* Sending EAP-Req(WSC_START) */ -#define STATUS_WSC_EAP_M1_SENT 10 /* Send M1 */ -#define STATUS_WSC_EAP_M1_RECEIVED 11 /* Received M1 */ -#define STATUS_WSC_EAP_M2_SENT 12 /* Send M2 */ -#define STATUS_WSC_EAP_M2_RECEIVED 13 /* Received M2 */ -#define STATUS_WSC_EAP_M2D_RECEIVED 14 /* Received M2D */ -#define STATUS_WSC_EAP_M3_SENT 15 /* Send M3 */ -#define STATUS_WSC_EAP_M3_RECEIVED 16 /* Received M3 */ -#define STATUS_WSC_EAP_M4_SENT 17 /* Send M4 */ -#define STATUS_WSC_EAP_M4_RECEIVED 18 /* Received M4 */ -#define STATUS_WSC_EAP_M5_SENT 19 /* Send M5 */ -#define STATUS_WSC_EAP_M5_RECEIVED 20 /* Received M5 */ -#define STATUS_WSC_EAP_M6_SENT 21 /* Send M6 */ -#define STATUS_WSC_EAP_M6_RECEIVED 22 /* Received M6 */ -#define STATUS_WSC_EAP_M7_SENT 23 /* Send M7 */ -#define STATUS_WSC_EAP_M7_RECEIVED 24 /* Received M7 */ -#define STATUS_WSC_EAP_M8_SENT 25 /* Send M8 */ -#define STATUS_WSC_EAP_M8_RECEIVED 26 /* Received M8 */ -#define STATUS_WSC_EAP_RAP_RSP_ACK 27 /* Processing EAP Response (ACK) */ -#define STATUS_WSC_EAP_RAP_REQ_DONE_SENT 28 /* Processing EAP Request (Done) */ -#define STATUS_WSC_EAP_RAP_RSP_DONE_SENT 29 /* Processing EAP Response (Done) */ -#define STATUS_WSC_EAP_FAIL_SENT 30 /* Sending EAP-Fail */ -#define STATUS_WSC_ERROR_HASH_FAIL 31 /* WSC_ERROR_HASH_FAIL */ -#define STATUS_WSC_ERROR_HMAC_FAIL 32 /* WSC_ERROR_HMAC_FAIL */ -#define STATUS_WSC_ERROR_DEV_PWD_AUTH_FAIL 33 /* WSC_ERROR_DEV_PWD_AUTH_FAIL */ -#define STATUS_WSC_CONFIGURED 34 -#define STATUS_WSC_SCAN_AP 35 /* Scanning AP */ -#define STATUS_WSC_EAPOL_START_SENT 36 -#define STATUS_WSC_EAP_RSP_DONE_SENT 37 -#define STATUS_WSC_WAIT_PIN_CODE 38 -#define STATUS_WSC_START_ASSOC 39 -#define STATUS_WSC_IBSS_WAIT_NEXT_SMPBC_ENROLLEE 40 -#define STATUS_WSC_IBSS_NEW_RANDOM_PIN 41 -#define STATUS_WSC_IBSS_FIXED_PIN 42 - -/* All error message dtarting from 0x0100 */ -#define STATUS_WSC_PBC_TOO_MANY_AP 0x0101 /* Too many PBC AP avaliable */ -#define STATUS_WSC_PBC_NO_AP 0x0102 /* No PBC AP avaliable */ -#define STATUS_WSC_EAP_FAIL_RECEIVED 0x0103 /* Received EAP-FAIL */ -#define STATUS_WSC_EAP_NONCE_MISMATCH 0x0104 /* Receive EAP with wrong NONCE */ -#define STATUS_WSC_EAP_INVALID_DATA \ - 0x0105 /* Receive EAP without integrity (Hmac mismatch) */ -#define STATUS_WSC_PASSWORD_MISMATCH \ - 0x0106 /* Error PIN Code (R-Hash mismatch) */ -#define STATUS_WSC_EAP_REQ_WRONG_SMI \ - 0x0107 /* Receive EAP-Req with wrong WPS SMI Vendor Id */ -#define STATUS_WSC_EAP_REQ_WRONG_VENDOR_TYPE \ - 0x0108 /* Receive EAPReq with wrong WPS Vendor Type */ -#define STATUS_WSC_PBC_SESSION_OVERLAP 0x0109 /* AP PBC session overlap */ -#define STATUS_WSC_SMPBC_TOO_MANY_REGISTRAR \ - 0x010a /* Too many SMPBC Registrars avaliable */ -#define STATUS_WSC_EMPTY_IPV4_SUBMASK_LIST \ - 0x010b /* Empty available IPv4 Submask list */ -#define STATUS_WSC_SMPBC_NO_AP 0x010c /* No SMPBC AP avaliable */ - -#define WSC_DISABLE 0x0 -#define WSC_ENROLLEE 0x1 -#define WSC_PROXY 0x2 -#define WSC_REGISTRAR 0x4 -#define WSC_ENROLLEE_PROXY (WSC_ENROLLEE | WSC_PROXY) -#define WSC_ENROLLEE_REGISTRAR (WSC_ENROLLEE | WSC_REGISTRAR) -#define WSC_PROXY_REGISTRAR (WSC_PROXY | WSC_REGISTRAR) -#define WSC_ENROLLEE_PROXY_REGISTRAR (WSC_ENROLLEE | WSC_PROXY | WSC_REGISTRAR) - -/* Device request/response type */ -#define WSC_MSGTYPE_ENROLLEE_INFO_ONLY 0x00 -#define WSC_MSGTYPE_ENROLLEE_OPEN_8021X 0x01 -#define WSC_MSGTYPE_REGISTRAR 0x02 -#define WSC_MSGTYPE_AP_WLAN_MGR 0x03 - -/* RF Band */ -#define WSC_RFBAND_24GHZ 0x01 -#define WSC_RFBAND_50GHZ 0x02 - -/* Simple Config state */ -#define WSC_SCSTATE_UNCONFIGURED 0x01 -#define WSC_SCSTATE_CONFIGURED 0x02 - -/* Common definition */ -#define WSC_MANUFACTURE "Ralink Technology, Corp." -#ifdef CONFIG_AP_SUPPORT -#define AP_WSC_MODEL_NAME "Ralink Wireless Access Point" -#define AP_WSC_DEVICE_NAME "RalinkAPS" -#ifdef VENDOR_FEATURE7_SUPPORT -#define AP_WSC_DEVICE_NAME_5G "ARRIS_5GAP" -#define AP_WSC_DEVICE_NAME_2G "ARRIS_24GAP" -#define AP_WSC_DEVICE_NAME_OOB "un-configured" -#endif -#endif /* CONFIG_AP_SUPPORT */ -#define WSC_MODEL_NUMBER "RT2860" -#define WSC_MODEL_SERIAL "12345678" - -/* Time-Out, param for timer func, count by micro-sec, not ticks */ -#define WSC_EAPOL_START_TIME_OUT 2000 -#define WSC_EAP_ID_TIME_OUT 5000 -#define WSC_EAP_MSG_TIME_OUT 5000 -#define WSC_EAP_MSG_ACK_TIME_OUT 1000 -#define WSC_EAP_EAP_FAIL_TIME_OUT 1000 -#define WSC_TWO_MINS_TIME_OUT 120000 -#define WSC_UPNP_M2D_TIME_OUT 15000 -#define WSC_UPNP_MSG_TIME_OUT 15000 -#define WSC_PROFILE_RETRY_TIME_OUT 15000 -#ifdef WSC_LED_SUPPORT -#define WSC_SUCCESSFUL_LED_PATTERN_TIMEOUT 300000 /* 300 seconds */ -#define WSC_WPS_FAIL_LED_PATTERN_TIMEOUT 15000 /* 15 seconds. */ -#define WSC_WPS_SKIP_TURN_OFF_LED_TIMEOUT 2500 /* 2.5 seconds. */ -#define WSC_WPS_TURN_OFF_LED_TIMEOUT 1000 /* 1 second. */ -#endif /* WSC_LED_SUPPORT */ - -#ifdef WSC_V2_SUPPORT -#define WSC_WPS_AP_SETUP_LOCK_TIME 60 /* 60 mins */ -#define WSC_WPS_AP_MAX_PIN_ATTACK 3 -#define WSC_LOCK_FOREVER_PIN_ATTACK 10 -#endif /* WSC_V2_SUPPORT */ - -#define WSC_INIT_ENTRY_APIDX 0xFF -#define WSC_MAX_DATA_LEN 1024 - -#define WSC_ENTRY_GET_EAPOL_START 0x1 -#define WSC_ENTRY_GET_EAP_RSP_ID 0x2 - -/* Pack struct to align at byte */ -/*#pragma pack(1) */ - -/* General used field */ - -/* UUID related definition */ -#define UUID_LEN_HEX 16 /* 128 bits => 16 bytes */ -#define UUID_LEN_STR 37 /* hex to string, plus 4 dash, plus 1 '\0' */ -#define UUID_VERSION 1 /* We currently just support version 1 */ - -/* user define length add by woody */ -#define WSC_MANUFACTURE_LEN 64 -#define WSC_MODELNAME_LEN 32 -#define WSC_MODELNUNBER_LEN 32 -#define WSC_DEVICENAME_LEN 32 -#define WSC_SERIALNUNBER_LEN 32 -#define MAX_2ND_DEV_TYPE_LIST 2 -#define MAX_2ND_DEV_TYPE_LIST_BUFFER (1 + (8 * MAX_2ND_DEV_TYPE_LIST)) - -typedef struct _WSC_UUID_T { - UINT32 timeLow; - UINT16 timeMid; - UINT16 timeHi_Version; - UCHAR clockSeqHi_Var; - UCHAR clockSeqLow; - UCHAR node[6]; -} WSC_UUID_T; - -/* For WSC state machine states. */ -/* We simplified it */ -typedef enum _WscState { - WSC_STATE_OFF, - WSC_STATE_INIT, - WSC_STATE_START, - WSC_STATE_FAIL, - WSC_STATE_CONFIGURED, - WSC_STATE_LINK_UP, - WSC_STATE_SEND_EAPOL_START, - WSC_STATE_WAIT_EAPOL_START, - WSC_STATE_WAIT_UPNP_START, - WSC_STATE_WAIT_REQ_ID, - WSC_STATE_WAIT_RESP_ID, - WSC_STATE_WAIT_WSC_START, - WSC_STATE_WAIT_M1, - WSC_STATE_SENT_M1, - WSC_STATE_SENT_M2D, - WSC_STATE_WAIT_M2, - WSC_STATE_RX_M2D, - WSC_STATE_WAIT_PIN, - WSC_STATE_WAIT_M3, - WSC_STATE_WAIT_M4, - WSC_STATE_WAIT_M5, - WSC_STATE_WAIT_M6, - WSC_STATE_WAIT_M7, - WSC_STATE_WAIT_M8, - WSC_STATE_WAIT_DONE, - WSC_STATE_WAIT_ACK, - WSC_STATE_WAIT_EAPFAIL, - WSC_STATE_WAIT_DISCONN -} WSC_STATE; - -/* WSC saved message */ -typedef struct _WSC_MESSAGE { - INT Length; /* Length of saved message */ - UCHAR Data[2048]; /* Contents */ -} WSC_MESSAGE, *PWSC_MESSAGE; - -/* Data structure to hold Enrollee and Registrar information */ -typedef struct _WSC_DEV_INFO { - UCHAR Version; - UCHAR Version2; - UCHAR Uuid[16]; - UCHAR MacAddr[6]; - UCHAR DeviceName[32]; - UCHAR PriDeviceType[8]; - UCHAR SecDevTypList - [MAX_2ND_DEV_TYPE_LIST_BUFFER]; /* 2nd Device Type List, ref. P2P Spec. v1.1 Table 29*/ - USHORT AuthTypeFlags; - USHORT EncrTypeFlags; - UCHAR ConnTypeFlags; - USHORT ConfigMethods; - UCHAR ScState; - UCHAR Manufacturer[64]; - UCHAR ModelName[32]; - UCHAR ModelNumber[32]; - UCHAR SerialNumber[32]; - UCHAR RfBand; - UINT OsVersion; - UINT FeatureId; - USHORT AssocState; - USHORT DevPwdId; - USHORT ConfigError; - UCHAR Ssid[32]; - UCHAR NewKey[64 + - 1]; /* not sure sprintf would add '\0' or not, add one byte for \0' */ - INT NewKeyLen; - UCHAR NewKeyIndex; -#ifdef CONFIG_MAP_SUPPORT - UCHAR map_DevPeerRole; -#endif -} WSC_DEV_INFO, *PWSC_DEV_INFO; - -/* data structure to store info of the instance of Registration protocol */ -typedef struct _WSC_REG_DATA { - /* filled in by device self */ - WSC_DEV_INFO SelfInfo; - /* filled in by wps peer */ - WSC_DEV_INFO PeerInfo; - - /*Diffie Hellman parameters */ - /* BIGNUM *DH_PubKey_Peer; //peer's pub key stored in bignum format */ - /* DH *DHSecret; //local key pair in bignum format */ - UCHAR EnrolleeRandom[192]; /* Saved random byte for public key generation */ - - UCHAR ReComputePke; - UCHAR Pke[192]; /*enrollee's raw pub key */ - UCHAR Pkr[192]; /*registrar's raw pub key */ - - UCHAR SecretKey[192]; /* Secret key calculated by enrollee */ - - UCHAR StaEncrSettings[128]; /* to be sent in M2/M8 by reg & M7 by enrollee */ - UCHAR ApEncrSettings[1024]; - - /* Saved Message content for authenticator calculation */ - WSC_MESSAGE LastTx; - WSC_MESSAGE LastRx; - - /* Device password */ - UCHAR PIN[8]; - UCHAR PinCodeLen; - - /* From KDF Key */ - UCHAR AuthKey[32]; - UCHAR KeyWrapKey[16]; - UCHAR Emsk[32]; - - USHORT EnrolleePwdId; - UCHAR EnrolleeNonce[16]; /*N1, from enrollee */ - UCHAR RegistrarNonce[16]; /*N2, from registrar */ - UCHAR SelfNonce[16]; - - UCHAR Psk1[16]; - UCHAR Psk2[16]; - - UCHAR EHash1[32]; - UCHAR EHash2[32]; - UCHAR Es1[16]; - UCHAR Es2[16]; - - UCHAR RHash1[32]; - UCHAR RHash2[32]; - UCHAR Rs1[16]; - UCHAR Rs2[16]; -} WSC_REG_DATA, *PWSC_REG_DATA; - -/* WSC UPnP node info. */ -typedef struct _WSC_UPNP_NODE_INFO { - BOOLEAN bUPnPInProgress; - BOOLEAN bUPnPMsgTimerRunning; - BOOLEAN bUPnPMsgTimerPending; - UINT registrarID; - RALINK_TIMER_STRUCT UPnPMsgTimer; -} WSC_UPNP_NODE_INFO, *PWSC_UPNP_NODE_INFO; - -#define MAX_PBC_STA_TABLE_SIZE 4 -#define MAX_NUM_BAND 3 -typedef struct _WSC_STA_PBC_PROBE_INFO { - ULONG ReciveTime[MAX_NUM_BAND][MAX_PBC_STA_TABLE_SIZE]; - UCHAR WscPBCStaProbeCount[MAX_NUM_BAND]; - UCHAR StaMacAddr[MAX_NUM_BAND][MAX_PBC_STA_TABLE_SIZE][MAC_ADDR_LEN]; - UCHAR Valid[MAX_NUM_BAND][MAX_PBC_STA_TABLE_SIZE]; -} WSC_STA_PBC_PROBE_INFO, *PWSC_STA_PBC_PROBE_INFO; - -typedef struct GNU_PACKED _WSC_PEER_DEV_INFO { - UCHAR WscPeerDeviceName[32]; - UCHAR WscPeerManufacturer[64]; - UCHAR WscPeerModelName[32]; - UCHAR WscPeerModelNumber[32]; - UCHAR WscPeerSerialNumber[32]; - UCHAR WscPeerMAC[6]; -} WSC_PEER_DEV_INFO, *PWSC_PEER_DEV_INFO; - -#ifdef WSC_V2_SUPPORT -#define WSC_PIN_ATTACK_CHECK 600 -#define WSC_V2_VERSION 0x20 -#define TLV_ASCII 0 -#define TLV_HEX 1 - -typedef struct _WSC_TLV { - USHORT TlvTag; - USHORT TlvLen; - PUCHAR pTlvData; - UCHAR TlvType; /* 0: ASCII, 1: Hex */ -} WSC_TLV, *PWSC_TLV; - -typedef struct _WSC_V2_INFO { - WSC_TLV ExtraTlv; - BOOLEAN bWpsEnable; /* FALSE: disable WSC , TRUE: enable WSC */ - BOOLEAN bEnableWpsV2; /* FALSE: not support WSC 2.0, TRUE: support WSC 2.0 */ -} WSC_V2_INFO, *PWSC_V2_INFO; -#endif /* WSC_V2_SUPPORT */ - -/* WSC control block */ -typedef struct _WSC_CTRL { - INT WscConfMode; /* 0 Wsc not enable; 1 un-configure AP ; 3 un-configure AP with Proxy ; */ - /* 5 un-configure AP with Registrar ; 7 un-configure AP with proxy and Registrar */ - INT WscMode; /* 1 PIN ;2 PBC set from UI dynamically */ - UCHAR WscConfStatus; /* 1 un-configured; 2 configured; need to update to .dat */ - USHORT WscConfigMethods; /* Registrar support list. The List is bitwise. PBC:0x0080 Lable:0x0004 Display:0x0008 */ - INT WscStatus; /* for user to monitor the status */ - INT WscState; /* WSC Protocl State: M1 to M8 */ - UINT WscPinCode; /* record the UI's PIN code input when we are registrar */ - UCHAR WscPinCodeLen; /* record the UI's PIN code input length when we are registrar */ - BOOLEAN WscEnrollee4digitPinCode; /* flag to use 4 or 8 digit Device own PIN code. */ - UINT WscEnrolleePinCode; /* recored Device own PIN code. */ - UCHAR WscEnrolleePinCodeLen; /* recored Device own PIN code length */ - INT WscSelReg; /* record the UI's PIN code input when we are registrar */ - NDIS_802_11_SSID - WscSsid; /* select a desired ssid to connect for PIN mode */ - UCHAR WscPBCBssCount; /* Count of PBC activated APs. */ - UCHAR WscBssid[MAC_ADDR_LEN]; /* select a desired bssid to connect */ - UCHAR WscPeerUuid[UUID_LEN_HEX]; /* Peer AP UUID*/ - WSC_REG_DATA RegData; /* Registrar pair data */ - UCHAR lastId; - UCHAR WscUseUPnP; - BOOLEAN EapMsgRunning; /* already recived Eap-Rsp(Identity) and sent M1 or Eap-Req(Start) */ - UCHAR WscRetryCount; - UCHAR EntryIfIdx; - UCHAR EntryAddr[MAC_ADDR_LEN]; - BOOLEAN Wsc2MinsTimerRunning; - RALINK_TIMER_STRUCT Wsc2MinsTimer; - WSC_PROFILE WscProfile; /* Saved WSC profile after M8 */ - WSC_PROFILE WscBhProfiles; /* Saved Additional WSC profile after M8 */ - WSC_UPNP_NODE_INFO - WscUPnPNodeInfo; /*Use to save UPnP node related info. */ - - BOOLEAN EapolTimerRunning; - BOOLEAN EapolTimerPending; - RALINK_TIMER_STRUCT EapolTimer; - - BOOLEAN WscPBCTimerRunning; - RALINK_TIMER_STRUCT WscPBCTimer; - BOOLEAN WscScanTimerRunning; - RALINK_TIMER_STRUCT WscScanTimer; - BOOLEAN WscProfileRetryTimerRunning; - RALINK_TIMER_STRUCT WscProfileRetryTimer; -#ifdef CON_WPS - BOOLEAN ConWscApcliScanDoneCheckTimerRunning; - RALINK_TIMER_STRUCT ConWscApcliScanDoneCheckTimer; - INT conWscStatus; /* 0x0 Disabled, 0x01 ApRunning, 0x02 ApCliRunning */ -#endif /*CON_WPS*/ -#ifdef WSC_LED_SUPPORT - ULONG WscLEDMode; /* WPS LED mode: LED_WPS_XXX definitions. */ - ULONG WscLastWarningLEDMode; /* LED_WPS_ERROR or LED_WPS_SESSION_OVERLAP_DETECTED */ - BOOLEAN bSkipWPSTurnOffLED; /* Skip the WPS turn off LED command. */ - BOOLEAN WscLEDTimerRunning; - RALINK_TIMER_STRUCT WscLEDTimer; - BOOLEAN WscSkipTurnOffLEDTimerRunning; - RALINK_TIMER_STRUCT WscSkipTurnOffLEDTimer; - /* This variable is TRUE after the 120 seconds WPS walk time expiration. */ - /* Note that in the case of LED mode 9, the error LED should be turned on only after WPS walk time expiration */ - /* if the NIC cannot find any WPS PBC-enabled APs in the last scanning result. */ - BOOLEAN bWPSWalkTimeExpiration; -#endif /* WSC_LED_SUPPORT */ - UCHAR WpaPsk[LEN_PSK]; - INT WpaPskLen; - BOOLEAN bWscTrigger; /* TRUE: AP-Enrollee & AP-Registrar work, FALSE: AP-Enrollee & AP-Registrar stop working */ - PVOID pAd; - PVOID wdev; - UINT WscLastPinFromEnrollee; - BOOLEAN WscRejectSamePinFromEnrollee; -#ifdef CONFIG_AP_SUPPORT - NDIS_802_11_SSID - WscDefaultSsid; /* Default WPS SSID after WPS process complete with Enrollee when AP is un-configured Registrar. */ - BOOLEAN bWCNTest; -#endif /* CONFIG_AP_SUPPORT */ - INT WscKeyASCII; /*WscKeyASCII (0:Hex, 1:ASCII(random length), others: ASCII length(8~63, default 8)) */ - INT WscActionMode; - UCHAR Wsc_Uuid_E[UUID_LEN_HEX]; - UCHAR Wsc_Uuid_Str[UUID_LEN_STR]; - - UCHAR WpsApBand; /* Preferred WPS AP PHY type. Ref: PREFERRED_WPS_AP_PHY_TYPE */ - /*add by woody */ - UCHAR Flags; - - WSC_PEER_DEV_INFO WscPeerInfo; - BOOLEAN bCheckMultiByte; -#ifdef WSC_V2_SUPPORT - WSC_V2_INFO WscV2Info; -#endif /* WSC_V2_SUPPORT */ - RALINK_TIMER_STRUCT WscUpdatePortCfgTimer; - BOOLEAN WscUpdatePortCfgTimerRunning; -#ifdef CONFIG_AP_SUPPORT - RALINK_TIMER_STRUCT WscSetupLockTimer; - BOOLEAN WscSetupLockTimerRunning; - RALINK_TIMER_STRUCT WscPinAttackCountCheckTimer; - BOOLEAN WscPinAttackCountCheckTimerRunning; - BOOLEAN bSetupLock; - UCHAR PinAttackCount; - UCHAR MaxPinAttack; - UINT SetupLockTime; /* unit: minute */ -#endif /* CONFIG_AP_SUPPORT */ - BOOLEAN bWscAutoTigeer; - BOOLEAN bWscFragment; - PUCHAR pWscRxBuf; - INT WscRxBufLen; - USHORT WscFragSize; - INT WscTxBufLen; - PUCHAR pWscTxBuf; - BOOLEAN bWscLastOne; - BOOLEAN bWscFirstOne; - PUCHAR pWscCurBufIdx; - NDIS_SPIN_LOCK WscPeerListSemLock; - LIST_HEADER WscPeerList; - RALINK_TIMER_STRUCT M2DTimer; - BOOLEAN bM2DTimerRunning; - INT M2DACKBalance; -#ifdef CONFIG_AP_SUPPORT - BOOLEAN bWscAutoTriggerDisable; /* Default setting is FALSE */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef APCLI_SUPPORT - UCHAR WscApCliScanMode; /* Only for ApClient , default setting is full scan */ -#endif /* APCLI_SUPPORT */ - char IfName[IFNAMSIZ]; -} WSC_CTRL, *PWSC_CTRL; - -typedef struct GNU_PACKED _WSC_CONFIGURED_VALUE { - USHORT WscConfigured; /* 1 un-configured; 2 configured */ - UCHAR WscSsid[32 + 1]; - USHORT WscAuthMode; /* mandatory, 0x01: open, 0x02: wpa-psk, 0x04: shared, 0x08:wpa, 0x10: wpa2, 0x20: wpa2-psk */ - USHORT WscEncrypType; /* 0x01: none, 0x02: wep, 0x04: tkip, 0x08: aes */ - UCHAR DefaultKeyIdx; - UCHAR WscWPAKey[64 + 1]; -} WSC_CONFIGURED_VALUE; - -#ifdef VENDOR_FEATURE6_SUPPORT -typedef struct GNU_PACKED _WSC_CONFIGURED_VALUE_2 { - USHORT WscConfigured; /* 1 un-configured; 2 configured */ - UCHAR WscSsid[32]; - UCHAR WscSsidLen; - USHORT WscAuthMode; /* mandatory, 0x01: open, 0x02: wpa-psk, 0x04: shared, 0x08:wpa, 0x10: wpa2, 0x20: wpa2-psk */ - USHORT WscEncrypType; /* 0x01: none, 0x02: wep, 0x04: tkip, 0x08: aes */ - UCHAR DefaultKeyIdx; - UCHAR WscWPAKey[64]; - UCHAR WscWPAKeyLen; -} WSC_CONFIGURED_VALUE_2; -#endif /* VENDOR_FEATURE6_SUPPORT */ -/* - Following definitions are used for UPnP module to communicate msg. -*/ - -/* Ralink specific message header for Linux specific NETLINK socket. */ -#define RTMP_WSC_NLMSG_HDR_LEN \ - 30 /*signature(8) + envID(4) + ackID(4) + msgLen(4) + Flag(2) + segLen(2) + devAddr(6) */ -typedef struct GNU_PACKED _RTMP_WSC_NLMSG_HDR { - UCHAR signature - [8]; /* Signature used to identify that this's a Ralink specific NETLINK message. - MUST be "RAWSCMSG" currently. - */ - UINT envID; /* Unique event Identification assigned by sender. */ - UINT ackID; /* Notify that this message is a repsone for the message whose event identifier is "ackID". */ - UINT msgLen; /* Totally length for this message. This message may seperate in serveral packets. */ - USHORT flags; - USHORT segLen; /* The "segLen" means the actual data length in this one msg packet. - Because the NETLINK socket just support 256bytes for "IWCUSTOM" typed message, so we may - need to do fragement for our msg. If one message was fragemented as serveral pieces, the - user space receiver need to re-assemble it. - */ - UCHAR devAddr[MAC_ADDR_LEN]; /* MAC address of the net device which send this netlink msg. */ -} RTMP_WSC_NLMSG_HDR; - -/* - Ralink specific WSC Mesage Header definition. -*/ -#define RTMP_WSC_MSG_HDR_LEN \ - 12 /*msgType(2) + msgSubType(2) + ipAddr(4) + len(4) */ -typedef struct GNU_PACKED _RTMP_WSC_MSG_HDR { - USHORT msgType; - USHORT msgSubType; - UINT ipAddr; - UINT msgLen; /*Not include this header. */ -} RTMP_WSC_MSG_HDR; - -#define WSC_MSG_TYPE_ENROLLEE 0x1 -#define WSC_MSG_TYPE_PROXY 0x2 -#define WSC_MSG_TYPE_REGISTRAR 0x3 -#define WSC_MSG_TYPE_CTRL 0x4 -#define WSC_MSG_TYPE_MGMT 0x5 - -RTMP_STRING *WscGetAuthTypeStr(USHORT authFlag); - -RTMP_STRING *WscGetEncryTypeStr(USHORT encryFlag); - -#define IWEVCUSTOM_MSG_MAX_LEN \ - 255 /*refer to kernel definition. */ -#define IWEVCUSTOM_PAYLOD_MAX_LEN \ - (IWEVCUSTOM_MSG_MAX_LEN - RTMP_WSC_NLMSG_HDR_LEN) - -#define WSC_U2KMSG_HDR_LEN 41 -typedef struct GNU_PACKED _RTMP_WSC_U2KMSG_HDR { - UINT envID; /*Event ID. */ - UCHAR Addr1[MAC_ADDR_LEN]; /*RA, should be the MAC address of the AP. */ - UCHAR Addr2[MAC_ADDR_LEN]; /*TA, should be the ipAddress of remote UPnP Device/CotrnolPoint. */ - UCHAR Addr3[MAC_ADDR_LEN]; /*DA, Not used now. */ - UCHAR rsvWLHdr[2]; /*Reserved space for remained 802.11 hdr content. */ - UCHAR rsv1HHdr[LENGTH_802_1_H]; /*Reserved space for 802.1h header */ - IEEE8021X_FRAME IEEE8021XHdr; /*802.1X header */ - EAP_FRAME EAPHdr; /*EAP frame header. */ -} RTMP_WSC_U2KMSG_HDR; -/*--- Used for UPnP module to communicate msg. */ - -/* define OpMode for WscSendMessage */ -#undef AP_MODE -#undef AP_CLIENT_MODE -#undef STA_MODE - -#define AP_MODE 0x00 -#define AP_CLIENT_MODE 0x01 -#define STA_MODE 0x02 -#define REGISTRAR_ACTION 0x40 -#define ENROLLEE_ACTION 0x80 - -/* Definition for Config Methods */ -#define WPS_CONFIG_METHODS_USBA 0x0001 -#define WPS_CONFIG_METHODS_ETHERNET 0x0002 -#define WPS_CONFIG_METHODS_LABEL 0x0004 -#define WPS_CONFIG_METHODS_DISPLAY 0x0008 -#define WPS_CONFIG_METHODS_ENT 0x0010 /* External NFC Token */ -#define WPS_CONFIG_METHODS_INT 0x0020 /* Integrated NFC Token */ -#define WPS_CONFIG_METHODS_NFCI 0x0040 /* NFC Interface */ -#define WPS_CONFIG_METHODS_PBC 0x0080 -#define WPS_CONFIG_METHODS_KEYPAD 0x0100 - -typedef struct _UUID_BSSID_CH_INFO { - UCHAR Uuid[16]; - UCHAR Bssid[MAC_ADDR_LEN]; - UCHAR Channel; - UCHAR Band; - UCHAR Ssid[MAX_LEN_OF_SSID]; - UCHAR SsidLen; - UCHAR MacAddr[MAC_ADDR_LEN]; -} UUID_BSSID_CH_INFO, *PUUID_BSSID_CH_INFO; - -/* - Preferred WPS AP type. - - a) PREFERRED_WPS_AP_PHY_TYPE_2DOT4_G_FIRST - Select 2.4G WPS AP first. Otherwise select 5G WPS AP. - b) PREFERRED_WPS_AP_PHY_TYPE_5_G_FIRST - Select the 5G WPS AP first. Otherwise select the 2.4G WPS AP. - c) PREFERRED_WPS_AP_PHY_TYPE_AUTO_SELECTION - Automactically select WPS AP. -*/ -typedef enum _PREFERRED_WPS_AP_PHY_TYPE { - PREFERRED_WPS_AP_PHY_TYPE_2DOT4_G_FIRST = 0, - PREFERRED_WPS_AP_PHY_TYPE_5_G_FIRST, - PREFERRED_WPS_AP_PHY_TYPE_AUTO_SELECTION, - PREFERRED_WPS_AP_PHY_TYPE_MAXIMUM, -} PREFERRED_WPS_AP_PHY_TYPE; - -typedef enum _WscSecurityMode { - WPA2PSKAES, - WPA2PSKTKIP, - WPAPSKAES, - WPAPSKTKIP, -} WSC_SECURITY_MODE; - -typedef struct _WSC_PEER_ENTRY { - struct _WSC_PEER_ENTRY *pNext; - ULONG receive_time; - UCHAR mac_addr[MAC_ADDR_LEN]; -} WSC_PEER_ENTRY, *PWSC_PEER_ENTRY; -#endif /* WSC_INCLUDED */ - -#endif /* __WSC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wsc_tlv.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wsc_tlv.h deleted file mode 100644 index cbd1b8482c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/include/wsc_tlv.h +++ /dev/null @@ -1,286 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wsc_tlv.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs - JuemingChen 06-09-11 Initial -*/ - -#ifndef __WSC_TLV_H__ -#define __WSC_TLV_H__ - -extern UINT8 WPS_DH_G_VALUE[1]; -extern UINT8 WPS_DH_P_VALUE[192]; - -/* Data Element Definitions */ -#define WSC_ID_AP_CHANNEL 0x1001 -#define WSC_ID_ASSOC_STATE 0x1002 -#define WSC_ID_AUTH_TYPE 0x1003 -#define WSC_ID_AUTH_TYPE_FLAGS 0x1004 -#define WSC_ID_AUTHENTICATOR 0x1005 -#define WSC_ID_CONFIG_METHODS 0x1008 -#define WSC_ID_CONFIG_ERROR 0x1009 -#define WSC_ID_CONF_URL4 0x100A -#define WSC_ID_CONF_URL6 0x100B -#define WSC_ID_CONN_TYPE 0x100C -#define WSC_ID_CONN_TYPE_FLAGS 0x100D -#define WSC_ID_CREDENTIAL 0x100E -#define WSC_ID_ENCR_TYPE 0x100F -#define WSC_ID_ENCR_TYPE_FLAGS 0x1010 -#define WSC_ID_DEVICE_NAME 0x1011 -#define WSC_ID_DEVICE_PWD_ID 0x1012 -#define WSC_ID_E_HASH1 0x1014 -#define WSC_ID_E_HASH2 0x1015 -#define WSC_ID_E_SNONCE1 0x1016 -#define WSC_ID_E_SNONCE2 0x1017 -#define WSC_ID_ENCR_SETTINGS 0x1018 -#define WSC_ID_ENROLLEE_NONCE 0x101A -#define WSC_ID_FEATURE_ID 0x101B -#define WSC_ID_IDENTITY 0x101C -#define WSC_ID_IDENTITY_PROOF 0x101D -#define WSC_ID_KEY_WRAP_AUTH 0x101E -#define WSC_ID_KEY_IDENTIFIER 0x101F -#define WSC_ID_MAC_ADDR 0x1020 -#define WSC_ID_MANUFACTURER 0x1021 -#define WSC_ID_MSG_TYPE 0x1022 -#define WSC_ID_MODEL_NAME 0x1023 -#define WSC_ID_MODEL_NUMBER 0x1024 -#define WSC_ID_NW_INDEX 0x1026 -#define WSC_ID_NW_KEY 0x1027 -#define WSC_ID_NW_KEY_INDEX 0x1028 -#define WSC_ID_NEW_DEVICE_NAME 0x1029 -#define WSC_ID_NEW_PWD 0x102A -#define WSC_ID_OOB_DEV_PWD 0x102C -#define WSC_ID_OS_VERSION 0x102D -#define WSC_ID_POWER_LEVEL 0x102F -#define WSC_ID_PSK_CURRENT 0x1030 -#define WSC_ID_PSK_MAX 0x1031 -#define WSC_ID_PUBLIC_KEY 0x1032 -#define WSC_ID_RADIO_ENABLED 0x1033 -#define WSC_ID_REBOOT 0x1034 -#define WSC_ID_REGISTRAR_CURRENT 0x1035 -#define WSC_ID_REGISTRAR_ESTBLSHD 0x1036 -#define WSC_ID_REGISTRAR_LIST 0x1037 -#define WSC_ID_REGISTRAR_MAX 0x1038 -#define WSC_ID_REGISTRAR_NONCE 0x1039 -#define WSC_ID_REQ_TYPE 0x103A -#define WSC_ID_RESP_TYPE 0x103B -#define WSC_ID_RF_BAND 0x103C -#define WSC_ID_R_HASH1 0x103D -#define WSC_ID_R_HASH2 0x103E -#define WSC_ID_R_SNONCE1 0x103F -#define WSC_ID_R_SNONCE2 0x1040 -#define WSC_ID_SEL_REGISTRAR 0x1041 -#define WSC_ID_SERIAL_NUM 0x1042 -#define WSC_ID_SC_STATE 0x1044 -#define WSC_ID_SSID 0x1045 -#define WSC_ID_TOT_NETWORKS 0x1046 -#define WSC_ID_UUID_E 0x1047 -#define WSC_ID_UUID_R 0x1048 -#define WSC_ID_VENDOR_EXT 0x1049 -#define WSC_ID_VERSION 0x104A -#define WSC_ID_X509_CERT_REQ 0x104B -#define WSC_ID_X509_CERT 0x104C -#define WSC_ID_EAP_IDENTITY 0x104D -#define WSC_ID_MSG_COUNTER 0x104E -#define WSC_ID_PUBKEY_HASH 0x104F -#define WSC_ID_REKEY_KEY 0x1050 -#define WSC_ID_KEY_LIFETIME 0x1051 -#define WSC_ID_PERM_CFG_METHODS 0x1052 -#define WSC_ID_SEL_REG_CFG_METHODS 0x1053 -#define WSC_ID_PRIM_DEV_TYPE 0x1054 -#define WSC_ID_SEC_DEV_TYPE_LIST 0x1055 -#define WSC_ID_PORTABLE_DEVICE 0x1056 -#define WSC_ID_AP_SETUP_LOCKED 0x1057 -#define WSC_ID_APP_LIST 0x1058 -#define WSC_ID_EAP_TYPE 0x1059 -#define WSC_ID_INIT_VECTOR 0x1060 -#define WSC_ID_KEY_PROVIDED_AUTO 0x1061 -#define WSC_ID_8021X_ENABLED 0x1062 -#define WSC_ID_APPSESSIONKEY 0x1063 -#define WSC_ID_WEPTRANSMITKEY 0x1064 - -/* WFA Vendor Extension Subelements */ -#define WFA_EXT_ID_VERSION2 0x00 -#define WFA_EXT_ID_AUTHORIZEDMACS 0x01 -#define WFA_EXT_ID_NW_KEY_SHAREABLE 0x02 -#define WFA_EXT_ID_REQ_TO_ENROLL 0x03 -#define WFA_EXT_ID_SETTINGS_DELAY_TIME 0x04 -#define WFA_EXT_ID_MAP_EXT_ATTRIBUTE 0x06 - -/* Association states */ -#define WSC_ASSOC_NOT_ASSOCIATED 0 -#define WSC_ASSOC_CONN_SUCCESS 1 -#define WSC_ASSOC_CONFIG_FAIL 2 -#define WSC_ASSOC_ASSOC_FAIL 3 -#define WSC_ASSOC_IP_FAIL 4 - -/* Authentication types */ -#define WSC_AUTHTYPE_OPEN 0x0001 -#define WSC_AUTHTYPE_WPAPSK 0x0002 -#define WSC_AUTHTYPE_SHARED 0x0004 -#define WSC_AUTHTYPE_WPA 0x0008 -#define WSC_AUTHTYPE_WPA2 0x0010 -#define WSC_AUTHTYPE_WPA2PSK 0x0020 -#define WSC_AUTHTYPE_SAE \ - 0x0040 /* Required to work with WPA3 support on MAP_R1 */ -#define WSC_AUTHTYPE_WPANONE 0x0080 - -/* Config methods */ -#define WSC_CONFMET_USBA 0x0001 -#define WSC_CONFMET_ETHERNET 0x0002 -#define WSC_CONFMET_LABEL 0x0004 -#define WSC_CONFMET_DISPLAY 0x0008 -#define WSC_CONFMET_EXT_NFC_TOK 0x0010 -#define WSC_CONFMET_INT_NFC_TOK 0x0020 -#define WSC_CONFMET_NFC_INTF 0x0040 -#define WSC_CONFMET_PBC 0x0080 -#define WSC_CONFMET_KEYPAD 0x0100 - -/* WSC error messages */ -#define WSC_ERROR_NO_ERROR 0 -#define WSC_ERROR_OOB_INT_READ_ERR 1 -#define WSC_ERROR_DECRYPT_CRC_FAIL 2 -#define WSC_ERROR_CHAN24_NOT_SUPP 3 -#define WSC_ERROR_CHAN50_NOT_SUPP 4 -#define WSC_ERROR_SIGNAL_WEAK 5 -#define WSC_ERROR_NW_AUTH_FAIL 6 -#define WSC_ERROR_NW_ASSOC_FAIL 7 -#define WSC_ERROR_NO_DHCP_RESP 8 -#define WSC_ERROR_FAILED_DHCP_CONF 9 -#define WSC_ERROR_IP_ADDR_CONFLICT 10 -#define WSC_ERROR_FAIL_CONN_REGISTRAR 11 -#define WSC_ERROR_MULTI_PBC_DETECTED 12 -#define WSC_ERROR_ROGUE_SUSPECTED 13 -#define WSC_ERROR_DEVICE_BUSY 14 -#define WSC_ERROR_SETUP_LOCKED 15 -#define WSC_ERROR_MSG_TIMEOUT 16 -#define WSC_ERROR_REG_SESSION_TIMEOUT 17 -#define WSC_ERROR_DEV_PWD_AUTH_FAIL 18 -#define WSC_ERROR_PUBLIC_KEY_HASH_MISMATCH 20 -#define WSC_ERROR_DO_MULTI_PBC_DETECTION 251 -#define WSC_ERROR_CAN_NOT_ALLOCMEM 252 -#define WSC_ERROR_WANTING_FIELD 253 -#define WSC_ERROR_HASH_FAIL 254 -#define WSC_ERROR_HMAC_FAIL 255 - -/* Connection types */ -#define WSC_CONNTYPE_ESS 0x01 -#define WSC_CONNTYPE_IBSS 0x02 - -/* Device password ID */ -#define WSC_DEVICEPWDID_DEFAULT 0x0000 -#define WSC_DEVICEPWDID_USER_SPEC 0x0001 -#define WSC_DEVICEPWDID_MACHINE_SPEC 0x0002 -#define WSC_DEVICEPWDID_REKEY 0x0003 -#define WSC_DEVICEPWDID_PUSH_BTN 0x0004 -#define WSC_DEVICEPWDID_REG_SPEC 0x0005 - -/* Device type */ -#define WSC_DEVICETYPE_COMPUTER "Computer" -#define WSC_DEVICETYPE_AP "Access_Point" -#define WSC_DEVICETYPE_ROUTER_AP "Router_AP" -#define WSC_DEVICETYPE_PRINTER "Printer" -#define WSC_DEVICETYPE_PRINTER_BRIDGE "Printer_Brigde" -#define WSC_DEVICETYPE_ELECT_PIC_FRAME "Electronic_Picture_Frame" -#define WSC_DEVICETYPE_DIG_AUDIO_RECV "Digital_Audio_Receiver" -#define WSC_DEVICETYPE_WIN_MCE "Windows_Media_Center_Extender" -#define WSC_DEVICETYPE_WIN_MOBILE "Windows_Mobile" -#define WSC_DEVICETYPE_PVR "Personal_Video_Recorder" -#define WSC_DEVICETYPE_VIDEO_STB "Video_STB" -#define WSC_DEVICETYPE_PROJECTOR "Projector" -#define WSC_DEVICETYPE_IP_TV "IP_TV" -#define WSC_DEVICETYPE_DIG_STILL_CAM "Digital_Still_Camera" -#define WSC_DEVICETYPE_PHONE "Phone" -#define WSC_DEVICETYPE_VOID_PHONE "VoIP_Phone" -#define WSC_DEVICETYPE_GAME_CONSOLE "Game_console" -#define WSC_DEVICETYPE_OTHER "Other" - -/* Encryption type */ -#define WSC_ENCRTYPE_NONE 0x0001 -#define WSC_ENCRTYPE_WEP 0x0002 -#define WSC_ENCRTYPE_TKIP 0x0004 -#define WSC_ENCRTYPE_AES 0x0008 - -/* WSC Message Types */ -#define WSC_ID_BEACON 0x01 -#define WSC_ID_PROBE_REQ 0x02 -#define WSC_ID_PROBE_RESP 0x03 -#define WSC_ID_MESSAGE_M1 0x04 -#define WSC_ID_MESSAGE_M2 0x05 -#define WSC_ID_MESSAGE_M2D 0x06 -#define WSC_ID_MESSAGE_M3 0x07 -#define WSC_ID_MESSAGE_M4 0x08 -#define WSC_ID_MESSAGE_M5 0x09 -#define WSC_ID_MESSAGE_M6 0x0A -#define WSC_ID_MESSAGE_M7 0x0B -#define WSC_ID_MESSAGE_M8 0x0C -#define WSC_ID_MESSAGE_ACK 0x0D -#define WSC_ID_MESSAGE_NACK 0x0E -#define WSC_ID_MESSAGE_DONE 0x0F -#define WSC_ID_MESSAGE_EAP_REQ_ID 0x21 -#define WSC_ID_MESSAGE_EAP_REQ_START 0x22 -#define WSC_ID_MESSAGE_EAP_FAIL 0x23 -#define WSC_ID_MESSAGE_UNKNOWN 0xFF - -/* Device Type categories for primary and secondary device types */ -#define WSC_DEVICE_TYPE_CAT_COMPUTER 1 -#define WSC_DEVICE_TYPE_CAT_INPUT_DEVICE 2 -#define WSC_DEVICE_TYPE_CAT_PRINTER 3 -#define WSC_DEVICE_TYPE_CAT_CAMERA 4 -#define WSC_DEVICE_TYPE_CAT_STORAGE 5 -#define WSC_DEVICE_TYPE_CAT_NW_INFRA 6 -#define WSC_DEVICE_TYPE_CAT_DISPLAYS 7 -#define WSC_DEVICE_TYPE_CAT_MM_DEVICES 8 -#define WSC_DEVICE_TYPE_CAT_GAME_DEVICES 9 -#define WSC_DEVICE_TYPE_CAT_TELEPHONE 10 - -/* Device Type sub categories for primary and secondary device types */ -#define WSC_DEVICE_TYPE_SUB_CAT_COMP_PC 1 -#define WSC_DEVICE_TYPE_SUB_CAT_COMP_SERVER 2 -#define WSC_DEVICE_TYPE_SUB_CAT_COMP_MEDIA_CTR 3 -#define WSC_DEVICE_TYPE_SUB_CAT_PRTR_PRINTER 1 -#define WSC_DEVICE_TYPE_SUB_CAT_PRTR_SCANNER 2 -#define WSC_DEVICE_TYPE_SUB_CAT_CAM_DGTL_STILL 1 -#define WSC_DEVICE_TYPE_SUB_CAT_STOR_NAS 1 -#define WSC_DEVICE_TYPE_SUB_CAT_NW_AP 1 -#define WSC_DEVICE_TYPE_SUB_CAT_NW_ROUTER 2 -#define WSC_DEVICE_TYPE_SUB_CAT_NW_SWITCH 3 -#define WSC_DEVICE_TYPE_SUB_CAT_DISP_TV 1 -#define WSC_DEVICE_TYPE_SUB_CAT_DISP_PIC_FRAME 2 -#define WSC_DEVICE_TYPE_SUB_CAT_DISP_PROJECTOR 3 -#define WSC_DEVICE_TYPE_SUB_CAT_MM_DAR 1 -#define WSC_DEVICE_TYPE_SUB_CAT_MM_PVR 2 -#define WSC_DEVICE_TYPE_SUB_CAT_MM_MCX 3 -#define WSC_DEVICE_TYPE_SUB_CAT_GAM_XBOX 1 -#define WSC_DEVICE_TYPE_SUB_CAT_GAM_XBOX_360 2 -#define WSC_DEVICE_TYPE_SUB_CAT_GAM_PS 3 -#define WSC_DEVICE_TYPE_SUB_CAT_PHONE_WM 1 - -typedef struct _WSC_TLV_0B { - /*USHORT tag;*/ - USHORT len; -} WSC_TLV_0B, *PWSC_TLV_0B; - -#endif /* __WSC_TLV_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/andes_core.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/andes_core.c deleted file mode 100644 index d7afc1bc51..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/andes_core.c +++ /dev/null @@ -1,946 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - andes_core.c -*/ -#include "rt_config.h" - -#ifdef DBG_STARVATION -static void andes_starv_timeout_handle(struct starv_dbg *starv, - struct starv_log_entry *entry) -{ - struct cmd_msg *cmd = container_of(starv, struct cmd_msg, starv); - struct MCU_CTRL *ctrl = starv->block->priv; - struct starv_log_basic *log = NULL; - - os_alloc_mem(NULL, (UCHAR **)&log, sizeof(struct starv_log_basic)); - if (!log) - return; - - log->qsize = DlListLen(&ctrl->txq); - log->id = cmd->attr.ext_type; - entry->log = log; -} - -static void andes_starv_block_init(struct starv_log *ctrl, - struct MCU_CTRL *mcu_ctrl) -{ - struct starv_dbg_block *block = &mcu_ctrl->block; - - strncpy(block->name, "andes", sizeof(block->name)); - block->priv = mcu_ctrl; - block->ctrl = ctrl; - block->timeout = 1000; - block->timeout_fn = andes_starv_timeout_handle; - block->log_fn = starv_timeout_log_basic; - register_starv_block(block); -} -#endif /*DBG_STARVATION*/ - -struct cmd_msg *AndesAllocCmdMsg(RTMP_ADAPTER *ad, unsigned int length) -{ - struct cmd_msg *msg = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - struct MCU_CTRL *ctl = &ad->MCUCtrl; - PNDIS_PACKET net_pkt = NULL; - INT32 AllocateSize = - cap->cmd_header_len + length + cap->cmd_padding_len; - net_pkt = RTMP_AllocateFragPacketBuffer(ad, AllocateSize); - - if (!net_pkt) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("can not allocate net_pkt\n")); - goto error0; - } - - OS_PKT_RESERVE(net_pkt, cap->cmd_header_len); - os_alloc_mem(NULL, (PUCHAR *)&msg, sizeof(*msg)); - - if (!msg) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("can not allocate cmd msg\n")); - goto error1; - } - - CMD_MSG_CB(net_pkt)->msg = msg; - os_zero_mem(msg, sizeof(*msg)); - msg->priv = (void *)ad; - msg->net_pkt = net_pkt; - ctl->alloc_cmd_msg++; - return msg; - -error1: - RTMPFreeNdisPacket(ad, net_pkt); -error0: - return NULL; -} - -VOID AndesInitCmdMsg(struct cmd_msg *msg, CMD_ATTRIBUTE attr) -{ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:: mcu_dest(%d), cmd_type(0x%x), ExtCmdType(0x%x)\n", - __func__, attr.mcu_dest, attr.type, attr.ext_type)); - SET_CMD_MSG_PORT_QUEUE_ID(msg, GetRealPortQueueID(msg, attr.type)); - SET_CMD_MSG_MCU_DEST(msg, attr.mcu_dest); - SET_CMD_MSG_TYPE(msg, attr.type); - SET_CMD_MSG_CTRL_FLAGS(msg, attr.ctrl.flags); - SET_CMD_MSG_EXT_TYPE(msg, attr.ext_type); - SET_CMD_MSG_CTRL_RSP_WAIT_MS_TIME(msg, attr.ctrl.wait_ms_time); - - if (IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) - RTMP_OS_INIT_COMPLETION(&msg->ack_done); - - SET_CMD_MSG_RETRY_TIMES(msg, 0); - SET_CMD_MSG_CTRL_RSP_EXPECT_SIZE(msg, attr.ctrl.expect_size); - SET_CMD_MSG_RSP_WB_BUF_IN_CALBK(msg, attr.rsp.wb_buf_in_calbk); - SET_CMD_MSG_RSP_HANDLER(msg, attr.rsp.handler); -} - -VOID AndesAppendCmdMsg(struct cmd_msg *msg, char *data, unsigned int len) -{ - PNDIS_PACKET net_pkt; - - if (!msg) - return; - - net_pkt = msg->net_pkt; - - if (data) - memcpy(OS_PKT_TAIL_BUF_EXTEND(net_pkt, len), data, len); -} - -VOID AndesAppendHeadCmdMsg(struct cmd_msg *msg, char *data, unsigned int len) -{ - PNDIS_PACKET net_pkt = msg->net_pkt; - - if (data) - memcpy(OS_PKT_HEAD_BUF_EXTEND(net_pkt, len), data, len); -} - -VOID AndesFreeCmdMsg(struct cmd_msg *msg) -{ - RTMP_ADAPTER *ad = NULL; - ULONG flags = 0; - struct MCU_CTRL *ctl = NULL; - - if (!msg) - return; - - ad = (RTMP_ADAPTER *)(msg->priv); - - if (!ad) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: pAd is null\n", __func__)); - goto free_memory; - } - - ctl = &ad->MCUCtrl; - - if (!ctl) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MCUCtrl is null\n", __func__)); - goto free_memory; - } - - if (IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) - RTMP_OS_EXIT_COMPLETION(&msg->ack_done); - - if (msg->retry_pkt) - RTMPFreeNdisPacket(ad, msg->retry_pkt); - - OS_SPIN_LOCK_IRQSAVE(&ctl->msg_lock, &flags); - ctl->free_cmd_msg++; - OS_SPIN_UNLOCK_IRQRESTORE(&ctl->msg_lock, &flags); -free_memory: - os_free_mem(msg); -} - -VOID AndesForceFreeCmdMsg(struct cmd_msg *msg) -{ - RTMP_ADAPTER *ad = NULL; - struct MCU_CTRL *ctl = NULL; - ULONG flags = 0; - - if (!msg) - return; - - ad = (RTMP_ADAPTER *)(msg->priv); - - if (!ad) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: pAd is null\n", __func__)); - goto free_memory; - } - - ctl = &ad->MCUCtrl; - - if (!ctl) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MCUCtrl is null\n", __func__)); - goto free_memory; - } - - if (IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) - RTMP_OS_EXIT_COMPLETION(&msg->ack_done); - - OS_SPIN_LOCK_IRQSAVE(&ctl->msg_lock, &flags); - ctl->free_cmd_msg++; - OS_SPIN_UNLOCK_IRQRESTORE(&ctl->msg_lock, &flags); -free_memory: - - if (ad && msg->net_pkt) - RTMPFreeNdisPacket(ad, msg->net_pkt); - - os_free_mem(msg); -} - -BOOLEAN IsInbandCmdProcessing(RTMP_ADAPTER *ad) -{ - BOOLEAN ret = 0; - return ret; -} - -UCHAR GetCmdRspNum(RTMP_ADAPTER *ad) -{ - UCHAR Num = 0; - return Num; -} - -VOID AndesIncErrorCount(struct MCU_CTRL *ctl, enum cmd_msg_error_type type) -{ - if (OS_TEST_BIT(MCU_INIT, &ctl->flags)) { - switch (type) { - case error_tx_kickout_fail: - ctl->tx_kickout_fail_count++; - break; - - case error_tx_timeout_fail: - ctl->tx_timeout_fail_count++; - break; - - case error_rx_receive_fail: - ctl->rx_receive_fail_count++; - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:unknown cmd_msg_error_type(%d)\n", - __func__, type)); - } - } -} - -static NDIS_SPIN_LOCK *AndesGetSpinLock(struct MCU_CTRL *ctl, DL_LIST *list) -{ - NDIS_SPIN_LOCK *lock = NULL; - - if (list == &ctl->txq) - lock = &ctl->txq_lock; - else if (list == &ctl->rxq) - lock = &ctl->rxq_lock; - else if (list == &ctl->ackq) - lock = &ctl->ackq_lock; - else if (list == &ctl->kickq) - lock = &ctl->kickq_lock; - else if (list == &ctl->tx_doneq) - lock = &ctl->tx_doneq_lock; - else if (list == &ctl->rx_doneq) - lock = &ctl->rx_doneq_lock; - - else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("list pointer = %p\n", list)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("txq = %p, rxq = %p, ackq = %p, kickq = %p, tx_doneq = %p, rx_doneq = %p\n", - &ctl->txq, &ctl->rxq, &ctl->ackq, &ctl->kickq, - &ctl->tx_doneq, &ctl->rx_doneq)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:illegal list\n", __func__)); - } - - return lock; -} - -static inline UCHAR AndesGetCmdMsgSeq(RTMP_ADAPTER *ad) -{ - struct MCU_CTRL *ctl = &ad->MCUCtrl; - struct cmd_msg *msg; - unsigned long flags; - UINT8 msg_seq; - - RTMP_SPIN_LOCK_IRQSAVE(&ctl->ackq_lock, &flags); -get_seq: - ctl->cmd_seq >= 0xf ? ctl->cmd_seq = 1 : ctl->cmd_seq++; - DlListForEach(msg, &ctl->ackq, struct cmd_msg, list) - { - if (msg->seq == ctl->cmd_seq) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("command(seq: %d) is still running\n", - ctl->cmd_seq)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("command response nums = %d\n", - GetCmdRspNum(ad))); - goto get_seq; - } - } - msg_seq = ctl->cmd_seq; - RTMP_SPIN_UNLOCK_IRQRESTORE(&ctl->ackq_lock, &flags); - return msg_seq; -} - -static VOID _AndesQueueTailCmdMsg(DL_LIST *list, struct cmd_msg *msg, - enum cmd_msg_state state) -{ - msg->state = state; - DlListAddTail(list, &msg->list); -} - -VOID AndesQueueTailCmdMsg(DL_LIST *list, struct cmd_msg *msg, - enum cmd_msg_state state) -{ - unsigned long flags; - NDIS_SPIN_LOCK *lock; - RTMP_ADAPTER *ad = (RTMP_ADAPTER *)msg->priv; - struct MCU_CTRL *ctl = &ad->MCUCtrl; - - lock = AndesGetSpinLock(ctl, list); - - if (lock) { - RTMP_SPIN_LOCK_IRQSAVE(lock, &flags); - _AndesQueueTailCmdMsg(list, msg, state); - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - } -} - -static VOID _AndesQueueHeadCmdMsg(DL_LIST *list, struct cmd_msg *msg, - enum cmd_msg_state state) -{ - msg->state = state; - DlListAdd(list, &msg->list); -} - -VOID AndesQueueHeadCmdMsg(DL_LIST *list, struct cmd_msg *msg, - enum cmd_msg_state state) -{ - unsigned long flags; - NDIS_SPIN_LOCK *lock; - RTMP_ADAPTER *ad = (RTMP_ADAPTER *)msg->priv; - struct MCU_CTRL *ctl = &ad->MCUCtrl; - - lock = AndesGetSpinLock(ctl, list); - - if (lock) { - RTMP_SPIN_LOCK_IRQSAVE(lock, &flags); - _AndesQueueHeadCmdMsg(list, msg, state); - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - } -} - -UINT32 AndesQueueLen(struct MCU_CTRL *ctl, DL_LIST *list) -{ - UINT32 qlen = 0; - unsigned long flags; - NDIS_SPIN_LOCK *lock; - - lock = AndesGetSpinLock(ctl, list); - - if (lock) { - RTMP_SPIN_LOCK_IRQSAVE(lock, &flags); - qlen = DlListLen(list); - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - } - - return qlen; -} - -/*AndesQueueEmpty is uselsess, disable it*/ - -static VOID AndesQueueInit(struct MCU_CTRL *ctl, DL_LIST *list) -{ - unsigned long flags; - NDIS_SPIN_LOCK *lock; - - lock = AndesGetSpinLock(ctl, list); - - if (lock) { - RTMP_SPIN_LOCK_IRQSAVE(lock, &flags); - DlListInit(list); - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - } -} - -VOID _AndesUnlinkCmdMsg(struct cmd_msg *msg, DL_LIST *list) -{ - if (!msg) - return; - if ((msg->list.Next != NULL) && (msg->list.Prev != NULL)) - DlListDel(&msg->list); -} - -VOID AndesUnlinkCmdMsg(struct cmd_msg *msg, DL_LIST *list) -{ - unsigned long flags; - NDIS_SPIN_LOCK *lock; - RTMP_ADAPTER *ad = (RTMP_ADAPTER *)msg->priv; - struct MCU_CTRL *ctl = &ad->MCUCtrl; - - lock = AndesGetSpinLock(ctl, list); - - if (lock) { - RTMP_SPIN_LOCK_IRQSAVE(lock, &flags); - _AndesUnlinkCmdMsg(msg, list); - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - } -} - -static struct cmd_msg *_AndesDequeueCmdMsg(DL_LIST *list) -{ - struct cmd_msg *msg; - - msg = DlListFirst(list, struct cmd_msg, list); - _AndesUnlinkCmdMsg(msg, list); - return msg; -} - -struct cmd_msg *AndesDequeueCmdMsg(struct MCU_CTRL *ctl, DL_LIST *list) -{ - unsigned long flags; - struct cmd_msg *msg = NULL; - NDIS_SPIN_LOCK *lock; - - lock = AndesGetSpinLock(ctl, list); - - if (lock) { - RTMP_SPIN_LOCK_IRQSAVE(lock, &flags); - msg = _AndesDequeueCmdMsg(list); - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - } - - return msg; -} - -#ifdef RTMP_PCI_SUPPORT -VOID PciKickOutCmdMsgComplete(PNDIS_PACKET net_pkt) -{ - struct cmd_msg *msg = CMD_MSG_CB(net_pkt)->msg; - RTMP_ADAPTER *ad = (RTMP_ADAPTER *)msg->priv; - struct MCU_CTRL *ctl = &ad->MCUCtrl; - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) - return; - - if (!IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) { - AndesUnlinkCmdMsg(msg, &ctl->kickq); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: msg state = %d\n", __func__, msg->state)); - AndesQueueTailCmdMsg(&ctl->tx_doneq, msg, tx_done); - } else { - if (msg->state != tx_done) - msg->state = wait_ack; - } - - AndesBhSchedule(ad); -} -#endif /* RTMP_PCI_SUPPORT */ - -VOID AndesRxProcessCmdMsg(RTMP_ADAPTER *ad, struct cmd_msg *rx_msg) -{ - RX_BLK RxBlk; - - mt_rx_pkt_process(ad, HIF_RX_IDX1, &RxBlk, rx_msg->net_pkt); -} - -VOID AndesCmdMsgBh(unsigned long param) -{ - RTMP_ADAPTER *ad = (RTMP_ADAPTER *)param; - struct MCU_CTRL *ctl = &ad->MCUCtrl; - struct cmd_msg *msg = NULL; - - while ((msg = AndesDequeueCmdMsg(ctl, &ctl->rx_doneq))) { - switch (msg->state) { - case rx_done: - AndesRxProcessCmdMsg(ad, msg); - AndesFreeCmdMsg(msg); - break; - - case rx_receive_fail: - AndesFreeCmdMsg(msg); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("unknow msg state(%d)\n", msg->state)); - AndesFreeCmdMsg(msg); - break; - } - } - - while ((msg = AndesDequeueCmdMsg(ctl, &ctl->tx_doneq))) { - switch (msg->state) { - case tx_done: - case tx_kickout_fail: - case tx_timeout_fail: -#ifdef DBG_STARVATION - starv_dbg_put(&msg->starv); -#endif /*DBG_STARVATION*/ - AndesFreeCmdMsg(msg); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("unknow msg state(%d)\n", msg->state)); - AndesFreeCmdMsg(msg); - break; - } - } - - if (OS_TEST_BIT(MCU_INIT, &ctl->flags)) { - AndesBhSchedule(ad); - } -} - -VOID AndesBhSchedule(RTMP_ADAPTER *ad) -{ - struct MCU_CTRL *ctl = &ad->MCUCtrl; - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) - return; - - if (((AndesQueueLen(ctl, &ctl->rx_doneq) > 0) || - (AndesQueueLen(ctl, &ctl->tx_doneq) > 0)) && - OS_TEST_BIT(MCU_INIT, &ctl->flags)) { -#ifndef WORKQUEUE_BH - RTMP_NET_TASK_DATA_ASSIGN(&ctl->cmd_msg_task, - (unsigned long)(ad)); - RTMP_OS_TASKLET_SCHE(&ctl->cmd_msg_task); -#else - tasklet_hi_schedule(&ctl->cmd_msg_task); -#endif - } -} - -VOID AndesCleanupCmdMsg(RTMP_ADAPTER *ad, DL_LIST *list) -{ - unsigned long flags; - struct cmd_msg *msg, *msg_tmp; - NDIS_SPIN_LOCK *lock; - struct MCU_CTRL *ctl = &ad->MCUCtrl; - - lock = AndesGetSpinLock(ctl, list); - if (lock) - RTMP_SPIN_LOCK_IRQSAVE(lock, &flags); - DlListForEachSafe(msg, msg_tmp, list, struct cmd_msg, list) - { - _AndesUnlinkCmdMsg(msg, list); - - /*If need wait, clean up need to trigger complete for andes send cmd to free msg*/ - if (IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) - RTMP_OS_EXIT_COMPLETION(&msg->ack_done); - else - AndesFreeCmdMsg(msg); - } - DlListInit(list); - if (lock) - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); -} - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -static VOID AndesCtrlPciInit(RTMP_ADAPTER *ad) -{ - struct MCU_CTRL *ctl = &ad->MCUCtrl; - - RTMP_CLEAR_FLAG(ad, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD); - ctl->cmd_seq = 0; -#ifndef WORKQUEUE_BH - RTMP_OS_TASKLET_INIT(ad, &ctl->cmd_msg_task, AndesCmdMsgBh, - (unsigned long)ad); -#else - tasklet_init(&ctl->cmd_msg_task, AndesCmdMsgBh, (unsigned long)ad); -#endif - NdisAllocateSpinLock(ad, &ctl->txq_lock); - AndesQueueInit(ctl, &ctl->txq); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ctl->txq = %p\n", &ctl->txq)); - NdisAllocateSpinLock(ad, &ctl->rxq_lock); - AndesQueueInit(ctl, &ctl->rxq); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ctl->rxq = %p\n", &ctl->rxq)); - NdisAllocateSpinLock(ad, &ctl->ackq_lock); - AndesQueueInit(ctl, &ctl->ackq); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ctl->ackq = %p\n", &ctl->ackq)); - NdisAllocateSpinLock(ad, &ctl->kickq_lock); - AndesQueueInit(ctl, &ctl->kickq); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ctl->kickq = %p\n", &ctl->kickq)); - NdisAllocateSpinLock(ad, &ctl->tx_doneq_lock); - AndesQueueInit(ctl, &ctl->tx_doneq); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ctl->tx_doneq = %p\n", &ctl->tx_doneq)); - NdisAllocateSpinLock(ad, &ctl->rx_doneq_lock); - AndesQueueInit(ctl, &ctl->rx_doneq); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ctl->rx_doneq = %p\n", &ctl->rx_doneq)); - ctl->tx_kickout_fail_count = 0; - ctl->tx_timeout_fail_count = 0; - ctl->rx_receive_fail_count = 0; - ctl->alloc_cmd_msg = 0; - ctl->free_cmd_msg = 0; - OS_SET_BIT(MCU_INIT, &ctl->flags); - ctl->ad = ad; -} -#endif - -VOID AndesCtrlInit(RTMP_ADAPTER *pAd) -{ - struct MCU_CTRL *ctl = &pAd->MCUCtrl; - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) { -#ifdef RTMP_MAC_PCI - - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) - AndesCtrlPciInit(pAd); - -#endif - } - - ctl->power_on = FALSE; - ctl->dpd_on = FALSE; - ctl->RxStream0 = 0; - ctl->RxStream1 = 0; - NdisAllocateSpinLock(pAd, &ctl->msg_lock); -#ifdef DBG_STARVATION - andes_starv_block_init(&pAd->starv_log_ctrl, ctl); -#endif /*DBG_STARVATION*/ -} - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -static VOID AndesCtrlPciExit(RTMP_ADAPTER *ad) -{ - struct MCU_CTRL *ctl = &ad->MCUCtrl; - - RTMP_CLEAR_FLAG(ad, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD); - /*clear andes queue by tasklet*/ - AndesBhSchedule(ad); - OS_CLEAR_BIT(MCU_INIT, &ctl->flags); - RTMP_OS_TASKLET_KILL(&ctl->cmd_msg_task); - AndesCleanupCmdMsg(ad, &ctl->txq); - NdisFreeSpinLock(&ctl->txq_lock); - AndesCleanupCmdMsg(ad, &ctl->ackq); - NdisFreeSpinLock(&ctl->ackq_lock); - AndesCleanupCmdMsg(ad, &ctl->rxq); - NdisFreeSpinLock(&ctl->rxq_lock); - AndesCleanupCmdMsg(ad, &ctl->kickq); - NdisFreeSpinLock(&ctl->kickq_lock); - AndesCleanupCmdMsg(ad, &ctl->tx_doneq); - NdisFreeSpinLock(&ctl->tx_doneq_lock); - AndesCleanupCmdMsg(ad, &ctl->rx_doneq); - NdisFreeSpinLock(&ctl->rx_doneq_lock); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("tx_kickout_fail_count = %ld\n", ctl->tx_kickout_fail_count)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("tx_timeout_fail_count = %ld\n", ctl->tx_timeout_fail_count)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("rx_receive_fail_count = %ld\n", ctl->rx_receive_fail_count)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("alloc_cmd_msg = %ld\n", ctl->alloc_cmd_msg)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("free_cmd_msg = %ld\n", ctl->free_cmd_msg)); -} -#endif - -VOID AndesCtrlExit(RTMP_ADAPTER *pAd) -{ - struct MCU_CTRL *ctl = &pAd->MCUCtrl; - - if (OS_TEST_BIT(MCU_INIT, &ctl->flags)) { -#ifdef DBG_STARVATION - unregister_starv_block(&ctl->block); -#endif /*DBG_STARVATION*/ -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) - AndesCtrlPciExit(pAd); - -#endif - } - - ctl->power_on = FALSE; - ctl->dpd_on = FALSE; -} - -static INT32 AndesDequeueAndKickOutCmdMsgs(RTMP_ADAPTER *ad) -{ - struct cmd_msg *msg = NULL; - VOID *net_pkt = NULL; - struct MCU_CTRL *ctl = &ad->MCUCtrl; - int ret = NDIS_STATUS_SUCCESS; - struct _RTMP_CHIP_OP *chip_ops = hc_get_chip_ops(ad->hdev_ctrl); - - while ((msg = AndesDequeueCmdMsg(ctl, &ctl->txq)) != NULL) { - if (!RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD) || - RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_NIC_NOT_EXIST) || - RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_SUSPEND)) { - if (!IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) - AndesForceFreeCmdMsg(msg); - - continue; - } - - net_pkt = (VOID *)msg->net_pkt; - - if (msg->state != tx_retransmit) { - if (IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) - msg->seq = AndesGetCmdMsgSeq(ad); - else - msg->seq = 0; - - if (chip_ops->andes_fill_cmd_header != NULL) - chip_ops->andes_fill_cmd_header(msg, net_pkt); - } - - if (msg->retry_times > 1) { - OS_PKT_CLONE(ad, net_pkt, msg->retry_pkt, - MEM_ALLOC_FLAG); - } - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - - if (chip_ops->pci_kick_out_cmd_msg != NULL) - ret = chip_ops->pci_kick_out_cmd_msg(ad, msg); - -#endif - - if (ret) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("kick out msg fail\n")); - - if (ret == NDIS_STATUS_FAILURE) - AndesForceFreeCmdMsg(msg); - - break; - } - } - - AndesBhSchedule(ad); - return ret; -} - -static ULONG AndesWaitForCompleteTimeout(struct cmd_msg *msg, ULONG timeout) -{ - ULONG ret = 0; - ULONG expire = timeout ? RTMPMsecsToJiffies(timeout) : - RTMPMsecsToJiffies(CMD_MSG_TIMEOUT); - ret = RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&msg->ack_done, expire); - return ret; -} - -INT32 AndesSendCmdMsg(PRTMP_ADAPTER ad, struct cmd_msg *msg) -{ - struct MCU_CTRL *ctl = &ad->MCUCtrl; - BOOLEAN is_cmd_need_wait = IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg); - int ret = NDIS_STATUS_SUCCESS; -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); -#endif -#endif - - if (in_interrupt() && IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("BUG: %s is called from invalid context\n", - __func__)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Command type = %x, Extension command type = %x\n", - __func__, msg->attr.type, msg->attr.ext_type)); - AndesForceFreeCmdMsg(msg); - return NDIS_STATUS_FAILURE; - } - - if (!RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD) || - RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_NIC_NOT_EXIST) || - RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_SUSPEND)) { - if (!RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD)) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Could not send in band command due to disabled fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD\n", - __func__)); - } else if (RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Could not send in band command due to fRTMP_ADAPTER_NIC_NOT_EXIST\n", - __func__)); - } else if (RTMP_TEST_FLAG(ad, fRTMP_ADAPTER_SUSPEND)) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Could not send in band command due to fRTMP_ADAPTER_SUSPEND\n", - __func__)); - } - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Command type = %x, Extension command type = %x\n", - __func__, msg->attr.type, msg->attr.ext_type)); - - AndesForceFreeCmdMsg(msg); - return NDIS_STATUS_FAILURE; - } - -#ifdef DBG_STARVATION - starv_dbg_init(&ctl->block, &msg->starv); - starv_dbg_get(&msg->starv); -#endif /*DBG_STARVATION*/ - AndesQueueTailCmdMsg(&ctl->txq, msg, tx_start); -retransmit: - - if (AndesDequeueAndKickOutCmdMsgs(ad) != NDIS_STATUS_SUCCESS) - goto bailout; - - /* Wait for response */ - if (is_cmd_need_wait) { - enum cmd_msg_state state = 0; - ULONG IsComplete; - - IsComplete = AndesWaitForCompleteTimeout( - msg, msg->attr.ctrl.wait_ms_time); - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) { - /*If need wait, clean up will trigger complete for here to free msg*/ - AndesFreeCmdMsg(msg); - goto bailout; - } - - if (!IsComplete) { - ret = NDIS_STATUS_FAILURE; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("FWCmdTimeout: command (%x), ext_cmd_type (%x), seq(%d), timeout(%dms)\n", - msg->attr.type, msg->attr.ext_type, msg->seq, - (msg->attr.ctrl.wait_ms_time == 0) ? - CMD_MSG_TIMEOUT : - msg->attr.ctrl.wait_ms_time)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pAd->Flags = 0x%.8lx\n", ad->Flags)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("txq qlen = %d\n", - AndesQueueLen(ctl, &ctl->txq))); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("rxq qlen = %d\n", - AndesQueueLen(ctl, &ctl->rxq))); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("kickq qlen = %d\n", - AndesQueueLen(ctl, &ctl->kickq))); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ackq qlen = %d\n", - AndesQueueLen(ctl, &ctl->ackq))); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("tx_doneq.qlen = %d\n", - AndesQueueLen(ctl, &ctl->tx_doneq))); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("rx_done qlen = %d\n", - AndesQueueLen(ctl, &ctl->rx_doneq))); - - if (msg->state == wait_cmd_out_and_ack) { - AndesUnlinkCmdMsg(msg, &ctl->ackq); - } else if (msg->state == wait_ack) - AndesUnlinkCmdMsg(msg, &ctl->ackq); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: msg state = %d\n", __func__, - msg->state)); - AndesIncErrorCount(ctl, error_tx_timeout_fail); - state = tx_timeout_fail; - - if (msg->retry_times > 0) - msg->retry_times--; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("msg->retry_times = %d\n", msg->retry_times)); -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - /* To many continuous soft reboot on puma6 plateform make HW to go in unstabe state and - * driver fails to communicate with FW - */ - ad->ErrRecoveryCheck++; - if (ops->heart_beat_check) - ops->heart_beat_check(ad); - if (RTMP_TEST_FLAG(ad, - fRTMP_ADAPTER_INTERRUPT_ACTIVE)) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("Disabling interrupt\n")); - RTMP_ASIC_INTERRUPT_DISABLE(ad); - } - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("Enabling interrupt\n")); - RTMP_ASIC_INTERRUPT_ENABLE(ad); -#else - ASSERT(FALSE); -#endif -#else - ASSERT(FALSE); -#endif - } else { - if (msg->state == tx_kickout_fail) { - state = tx_kickout_fail; - msg->retry_times--; - } else { - if (msg->state == wait_cmd_out_and_ack) { - AndesUnlinkCmdMsg(msg, &ctl->ackq); - } else if (msg->state == wait_ack) - AndesUnlinkCmdMsg(msg, &ctl->ackq); - - state = tx_done; - msg->retry_times = 0; - } - } - - if (is_cmd_need_wait && (msg->retry_times > 0)) { - RTMP_OS_EXIT_COMPLETION(&msg->ack_done); - RTMP_OS_INIT_COMPLETION(&msg->ack_done); - msg->net_pkt = msg->retry_pkt; - msg->retry_pkt = NULL; - state = tx_retransmit; - AndesQueueHeadCmdMsg(&ctl->txq, msg, state); - goto retransmit; - } else { - if (msg->attr.ext_type == EXT_CMD_STAREC_UPDATE) { - /* Only StaRec update command read FW's response to minimize the impact. - FW's response will become the final return value. - */ - ret = msg->cmd_return_status; - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: msg state = %d\n", __func__, state)); - /* msg will be free after enqueuing to tx_doneq. So msg is not able to pass FW's response to caller. */ - AndesQueueTailCmdMsg(&ctl->tx_doneq, msg, state); - } -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - if (IsComplete) - ad->ErrRecoveryCheck = 0; -#endif -#endif - } -bailout: - return ret; -} - -INT32 MtCmdSendMsg(PRTMP_ADAPTER ad, struct cmd_msg *msg) -{ - INT32 ret = 0; - - ret = AndesSendCmdMsg(ad, msg); - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/andes_mt.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/andes_mt.c deleted file mode 100644 index 9baae38527..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/andes_mt.c +++ /dev/null @@ -1,5102 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - andes_mt.c -*/ - -#include "rt_config.h" -#ifdef TXRX_STAT_SUPPORT -#include "hdev/hdev_basic.h" -#endif -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) -#include "phy/rlm_cal_cache.h" -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -#ifdef UNIFY_FW_CMD -/* static decaration */ -static VOID AndesMTFillTxDHeader(struct cmd_msg *msg, PNDIS_PACKET net_pkt); -#endif /* UNIFY_FW_CMD */ - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -INT32 AndesMTPciKickOutCmdMsg(PRTMP_ADAPTER pAd, struct cmd_msg *msg) -{ - int ret = NDIS_STATUS_SUCCESS; - unsigned long flags = 0; - ULONG FreeNum; - PNDIS_PACKET net_pkt = msg->net_pkt; - UINT32 SwIdx = 0; - UCHAR *pSrcBufVA; - UINT SrcBufLen = 0; - PACKET_INFO PacketInfo; - TXD_STRUC *pTxD; - struct MCU_CTRL *ctl = &pAd->MCUCtrl; -#ifdef RT_BIG_ENDIAN - TXD_STRUC *pDestTxD; - UCHAR tx_hw_info[TXD_SIZE]; -#endif - struct _PCI_HIF_T *hif = hc_get_hif_ctrl(pAd->hdev_ctrl); - RTMP_CTRL_RING *ring = &hif->CtrlRing; - NDIS_SPIN_LOCK *lock = &hif->CtrlRingLock; - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) - return NDIS_STATUS_FAILURE; - - FreeNum = GET_CTRLRING_FREENO(pAd); - - if (FreeNum < 10) { - if (IS_MT7615(pAd)) - hif->dma_done_handle[TX_CMD](pAd, HIF_TX_IDX2); - else if (IS_MT7622(pAd)) - hif->dma_done_handle[TX_CMD](pAd, HIF_TX_IDX15); - FreeNum = GET_CTRLRING_FREENO(pAd); - } - - if (FreeNum == 0) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s FreeNum == 0 (TxCpuIdx = %d, TxDmaIdx = %d, TxSwFreeIdx = %d)\n", - __func__, ring->TxCpuIdx, ring->TxDmaIdx, - ring->TxSwFreeIdx)); - return NDIS_STATUS_FAILURE; - } - - RTMP_SPIN_LOCK_IRQSAVE(lock, &flags); - RTMP_QueryPacketInfo(net_pkt, &PacketInfo, &pSrcBufVA, &SrcBufLen); - - if (pSrcBufVA == NULL) { - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s pSrcBufVA is NULL!!\n", __func__)); - return NDIS_STATUS_FAILURE; - } - - SwIdx = ring->TxCpuIdx; -#ifdef RT_BIG_ENDIAN - pDestTxD = (TXD_STRUC *)ring->Cell[SwIdx].AllocVa; - NdisMoveMemory(&tx_hw_info[0], (UCHAR *)pDestTxD, TXD_SIZE); - pTxD = (TXD_STRUC *)&tx_hw_info[0]; -#else - pTxD = (TXD_STRUC *)ring->Cell[SwIdx].AllocVa; -#endif -#ifdef RT_BIG_ENDIAN - RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); -#endif /* RT_BIG_ENDIAN */ - ring->Cell[SwIdx].pNdisPacket = net_pkt; - ring->Cell[SwIdx].pNextNdisPacket = NULL; - ring->Cell[SwIdx].PacketPa = PCI_MAP_SINGLE( - pAd, (pSrcBufVA), (SrcBufLen), 0, RTMP_PCI_DMA_TODEVICE); - pTxD->LastSec0 = 1; - pTxD->LastSec1 = 0; - pTxD->SDLen0 = SrcBufLen; - pTxD->SDLen1 = 0; - pTxD->SDPtr0 = ring->Cell[SwIdx].PacketPa; - pTxD->Burst = 0; - pTxD->DMADONE = 0; -#ifdef RT_BIG_ENDIAN - RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); - WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); -#endif - /* flush dcache if no consistent memory is supported */ - RTMP_DCACHE_FLUSH(SrcBufPA, SrcBufLen); - RTMP_DCACHE_FLUSH(ring->Cell[SwIdx].AllocPa, TXD_SIZE); - /* Increase TX_CTX_IDX, but write to register later.*/ - INC_RING_INDEX(ring->TxCpuIdx, CTL_RING_SIZE); - - if (IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) { - AndesQueueTailCmdMsg(&ctl->ackq, msg, wait_ack); - msg->sending_time_in_jiffies = jiffies; - } else - AndesQueueTailCmdMsg(&ctl->tx_doneq, msg, tx_done); - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) { - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - return -1; - } - - HIF_IO_WRITE32(pAd, ring->hw_cidx_addr, ring->TxCpuIdx); - RTMP_SPIN_UNLOCK_IRQRESTORE(lock, &flags); - return ret; -} - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -INT32 AndesMTPciKickOutCmdMsgFwDlRing(PRTMP_ADAPTER pAd, struct cmd_msg *msg) -{ - int ret = NDIS_STATUS_SUCCESS; - unsigned long flags = 0; - ULONG FreeNum; - PNDIS_PACKET net_pkt = msg->net_pkt; - UINT32 SwIdx = 0; - UCHAR *pSrcBufVA; - UINT SrcBufLen = 0; - PACKET_INFO PacketInfo; - TXD_STRUC *pTxD; - struct MCU_CTRL *ctl = &pAd->MCUCtrl; - RTMP_RING *pRing; -#ifdef RT_BIG_ENDIAN - TXD_STRUC *pDestTxD; - UCHAR tx_hw_info[TXD_SIZE]; -#endif - struct _PCI_HIF_T *hif = hc_get_hif_ctrl(pAd->hdev_ctrl); - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) - return -1; - - pRing = (RTMP_RING *)(&(hif->FwDwloRing)); - FreeNum = GET_FWDWLORING_FREENO(pRing); - - if (FreeNum < 10) { - hif->dma_done_handle[TX_FW_DL](pAd, HIF_TX_IDX3); - FreeNum = GET_FWDWLORING_FREENO(pRing); - } - - if (FreeNum == 0) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s FreeNum == 0 (TxCpuIdx = %d, TxDmaIdx = %d, TxSwFreeIdx = %d)\n", - __func__, pRing->TxCpuIdx, pRing->TxDmaIdx, - pRing->TxSwFreeIdx)); - return NDIS_STATUS_FAILURE; - } - - RTMP_SPIN_LOCK_IRQSAVE(&pRing->RingLock, &flags); - RTMP_QueryPacketInfo(net_pkt, &PacketInfo, &pSrcBufVA, &SrcBufLen); - - if (pSrcBufVA == NULL) { - RTMP_SPIN_UNLOCK_IRQRESTORE(&pRing->RingLock, &flags); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s pSrcBufVA is NULL!!\n", __func__)); - return NDIS_STATUS_FAILURE; - } - - SwIdx = pRing->TxCpuIdx; -#ifdef RT_BIG_ENDIAN - pDestTxD = (TXD_STRUC *)pRing->Cell[SwIdx].AllocVa; - NdisMoveMemory(&tx_hw_info[0], (UCHAR *)pDestTxD, TXD_SIZE); - pTxD = (TXD_STRUC *)&tx_hw_info[0]; -#else - pTxD = (TXD_STRUC *)pRing->Cell[SwIdx].AllocVa; -#endif -#ifdef RT_BIG_ENDIAN - /* RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); */ -#endif /* RT_BIG_ENDIAN */ - pRing->Cell[SwIdx].pNdisPacket = net_pkt; - pRing->Cell[SwIdx].pNextNdisPacket = NULL; - pRing->Cell[SwIdx].PacketPa = PCI_MAP_SINGLE( - pAd, (pSrcBufVA), (SrcBufLen), 0, RTMP_PCI_DMA_TODEVICE); - pTxD->LastSec0 = 1; - pTxD->LastSec1 = 0; - pTxD->SDLen0 = SrcBufLen; - pTxD->SDLen1 = 0; - pTxD->SDPtr0 = pRing->Cell[SwIdx].PacketPa; - pTxD->Burst = 0; - pTxD->DMADONE = 0; -#ifdef RT_BIG_ENDIAN - RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); - WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); -#endif - /* flush dcache if no consistent memory is supported */ - RTMP_DCACHE_FLUSH(pRing->Cell[SwIdx].PacketPa, SrcBufLen); - RTMP_DCACHE_FLUSH(pRing->Cell[SwIdx].AllocPa, TXD_SIZE); - /* Increase TX_CTX_IDX, but write to register later.*/ - INC_RING_INDEX(pRing->TxCpuIdx, CTL_RING_SIZE); - - if (IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) - AndesQueueTailCmdMsg(&ctl->ackq, msg, wait_ack); - else - AndesQueueTailCmdMsg(&ctl->tx_doneq, msg, tx_done); - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) { - RTMP_SPIN_UNLOCK_IRQRESTORE(&pRing->RingLock, &flags); - return -1; - } - - HIF_IO_WRITE32(pAd, pRing->hw_cidx_addr, pRing->TxCpuIdx); - RTMP_SPIN_UNLOCK_IRQRESTORE(&pRing->RingLock, &flags); - return ret; -} -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ -#endif /* defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) */ - -static VOID EventExtCmdResult(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); -} - -#if defined(MT7636) && defined(TXBF_SUPPORT) -INT32 CmdETxBfSoundingPeriodicTriggerCtrl(RTMP_ADAPTER *pAd, UCHAR SndgEn, - UCHAR SndgBW, UCHAR NDPAMcs, - UINT32 u4SNDPeriod, UINT32 wlanidx) -{ - struct cmd_msg *msg; - struct _EXT_CMD_ETXBf_SND_PERIODIC_TRIGGER_CTRL_T - ETxBfSdPeriodicTriggerCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Sounding trigger enable = %d\n", __func__, SndgEn)); - msg = AndesAllocCmdMsg(pAd, sizeof(ETxBfSdPeriodicTriggerCtrl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ETxBfSdPeriodicTriggerCtrl, - sizeof(ETxBfSdPeriodicTriggerCtrl)); - ETxBfSdPeriodicTriggerCtrl.ucWlanIdx = (wlanidx); - ETxBfSdPeriodicTriggerCtrl.ucWMMIdx = (1); - ETxBfSdPeriodicTriggerCtrl.ucBW = (SndgBW); - ETxBfSdPeriodicTriggerCtrl.u2NDPARateCode = cpu2le16(NDPAMcs); - ETxBfSdPeriodicTriggerCtrl.u2NDPRateCode = cpu2le16(8); /* MCS8 */ - ETxBfSdPeriodicTriggerCtrl.u4SoundingInterval = cpu2le32(u4SNDPeriod); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, ((SndgEn) ? EXT_CMD_BF_SOUNDING_START : - EXT_CMD_BF_SOUNDING_STOP)); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - AndesInitCmdMsg(msg, attr); - AndesAppendCmdMsg(msg, (char *)&ETxBfSdPeriodicTriggerCtrl, - sizeof(ETxBfSdPeriodicTriggerCtrl)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* MT7636 && TXBF_SUPPORT */ - -#ifdef UNIFY_FW_CMD -static VOID AndesMTFillTxDHeader(struct cmd_msg *msg, PNDIS_PACKET net_pkt) -{ - TMAC_TXD_L *txd; - UCHAR *tmac_info; - tmac_info = - (UCHAR *)OS_PKT_HEAD_BUF_EXTEND(net_pkt, sizeof(TMAC_TXD_L)); - txd = (TMAC_TXD_L *)tmac_info; - NdisZeroMemory(txd, sizeof(TMAC_TXD_L)); - txd->TxD0.TxByteCount = GET_OS_PKT_LEN(net_pkt); - txd->TxD0.p_idx = (msg->pq_id & 0x8000) >> 15; - txd->TxD0.q_idx = (msg->pq_id & 0x7c00) >> 10; - txd->TxD1.ft = 0x1; - txd->TxD1.hdr_format = 0x1; - - if (msg->attr.type == MT_FW_SCATTER) - txd->TxD1.pkt_ft = TMI_PKT_FT_HIF_FW; - else - txd->TxD1.pkt_ft = TMI_PKT_FT_HIF_CMD; - -#ifdef RT_BIG_ENDIAN - MTMacInfoEndianChange(NULL, (UCHAR *)tmac_info, TYPE_TMACINFO, - sizeof(TMAC_TXD_L)); -#endif - return; -} -#endif /* UNIFY_FW_CMD */ - -/* old chip (before mt7615) use this compact format for cmd header */ -VOID AndesMTFillCmdHeader(struct cmd_msg *msg, VOID *pkt) -{ - FW_TXD *fw_txd = NULL; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; - struct MCU_CTRL *Ctl = &pAd->MCUCtrl; - PNDIS_PACKET net_pkt = (PNDIS_PACKET)pkt; - - if (Ctl->fwdl_ctrl.stage == FWDL_STAGE_FW_RUNNING) - fw_txd = (FW_TXD *)OS_PKT_HEAD_BUF_EXTEND(net_pkt, - sizeof(*fw_txd)); - else - fw_txd = (FW_TXD *)OS_PKT_HEAD_BUF_EXTEND(net_pkt, 12); - - fw_txd->fw_txd_0.field.length = GET_OS_PKT_LEN(net_pkt); - fw_txd->fw_txd_0.field.pq_id = msg->pq_id; - fw_txd->fw_txd_1.field.cid = msg->attr.type; - fw_txd->fw_txd_1.field.pkt_type_id = PKT_ID_CMD; - fw_txd->fw_txd_1.field.set_query = - IS_CMD_MSG_NA_FLAG_SET(msg) ? - CMD_NA : - IS_CMD_MSG_SET_QUERY_FLAG_SET(msg); - fw_txd->fw_txd_1.field.seq_num = msg->seq; - fw_txd->fw_txd_2.field.ext_cid = msg->attr.ext_type; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: fw_txd: 0x%x 0x%x 0x%x, Length=%d\n", __func__, - fw_txd->fw_txd_0.word, fw_txd->fw_txd_1.word, - fw_txd->fw_txd_2.word, fw_txd->fw_txd_0.field.length)); - - if ((IS_EXT_CMD_AND_SET_NEED_RSP(msg)) && - !(IS_CMD_MSG_NA_FLAG_SET(msg))) - fw_txd->fw_txd_2.field.ext_cid_option = EXT_CID_OPTION_NEED_ACK; - else - fw_txd->fw_txd_2.field.ext_cid_option = - EXT_CID_OPTION_NO_NEED_ACK; - - fw_txd->fw_txd_0.word = cpu2le32(fw_txd->fw_txd_0.word); - fw_txd->fw_txd_1.word = cpu2le32(fw_txd->fw_txd_1.word); - fw_txd->fw_txd_2.word = cpu2le32(fw_txd->fw_txd_2.word); -#ifdef CONFIG_TRACE_SUPPORT - TRACE_MCU_CMD_INFO( - fw_txd->fw_txd_0.field.length, fw_txd->fw_txd_0.field.pq_id, - fw_txd->fw_txd_1.field.cid, fw_txd->fw_txd_1.field.pkt_type_id, - fw_txd->fw_txd_1.field.set_query, - fw_txd->fw_txd_1.field.seq_num, fw_txd->fw_txd_2.field.ext_cid, - fw_txd->fw_txd_2.field.ext_cid_option, - (char *)(GET_OS_PKT_DATAPTR(net_pkt)), GET_OS_PKT_LEN(net_pkt)); -#endif /* CONFIG_TRACE_SUPPORT */ -} - -/* unify cmd header since mt7615 */ -VOID AndesMTFillCmdHeaderWithTXD(struct cmd_msg *msg, VOID *pkt) -{ - FW_TXD *fw_txd = NULL; - PNDIS_PACKET net_pkt = (PNDIS_PACKET)pkt; - - fw_txd = (FW_TXD *)OS_PKT_HEAD_BUF_EXTEND(net_pkt, sizeof(FW_TXD)); - AndesMTFillTxDHeader(msg, net_pkt); - NdisZeroMemory(fw_txd, sizeof(FW_TXD)); - - fw_txd->fw_txd_0.field.length = - GET_OS_PKT_LEN(net_pkt) - sizeof(TMAC_TXD_L); - fw_txd->fw_txd_0.field.pq_id = msg->pq_id; - fw_txd->fw_txd_1.field.cid = msg->attr.type; - fw_txd->fw_txd_1.field.pkt_type_id = PKT_ID_CMD; - fw_txd->fw_txd_1.field.set_query = - IS_CMD_MSG_NA_FLAG_SET(msg) ? - CMD_NA : - IS_CMD_MSG_SET_QUERY_FLAG_SET(msg); - fw_txd->fw_txd_1.field.seq_num = msg->seq; - fw_txd->fw_txd_2.field.ext_cid = msg->attr.ext_type; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: mcu_dest(%d):%s\n", __func__, msg->attr.mcu_dest, - (msg->attr.mcu_dest == HOST2N9) ? "HOST2N9" : "HOST2CR4")); - - if (msg->attr.mcu_dest == HOST2N9) - fw_txd->fw_txd_2.field.ucS2DIndex = HOST2N9; - else - fw_txd->fw_txd_2.field.ucS2DIndex = HOST2CR4; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: fw_txd: 0x%x 0x%x 0x%x, Length=%d\n", __func__, - fw_txd->fw_txd_0.word, fw_txd->fw_txd_1.word, - fw_txd->fw_txd_2.word, fw_txd->fw_txd_0.field.length)); - - if ((IS_EXT_CMD_AND_SET_NEED_RSP(msg)) && - !(IS_CMD_MSG_NA_FLAG_SET(msg))) - fw_txd->fw_txd_2.field.ext_cid_option = EXT_CID_OPTION_NEED_ACK; - else - fw_txd->fw_txd_2.field.ext_cid_option = - EXT_CID_OPTION_NO_NEED_ACK; - - fw_txd->fw_txd_0.word = cpu2le32(fw_txd->fw_txd_0.word); - fw_txd->fw_txd_1.word = cpu2le32(fw_txd->fw_txd_1.word); - fw_txd->fw_txd_2.word = cpu2le32(fw_txd->fw_txd_2.word); -#ifdef CONFIG_TRACE_SUPPORT - TRACE_MCU_CMD_INFO( - fw_txd->fw_txd_0.field.length, fw_txd->fw_txd_0.field.pq_id, - fw_txd->fw_txd_1.field.cid, fw_txd->fw_txd_1.field.pkt_type_id, - fw_txd->fw_txd_1.field.set_query, - fw_txd->fw_txd_1.field.seq_num, fw_txd->fw_txd_2.field.ext_cid, - fw_txd->fw_txd_2.field.ext_cid_option, - (char *)(GET_OS_PKT_DATAPTR(net_pkt)), GET_OS_PKT_LEN(net_pkt)); -#endif /* CONFIG_TRACE_SUPPORT */ -} - -static VOID EventChPrivilegeHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - struct MCU_CTRL *ctl = &pAd->MCUCtrl; - UINT32 Value; - - if (IS_MT7603(pAd) || IS_MT7628(pAd) || IS_MT76x6(pAd) || - IS_MT7637(pAd)) { - RTMP_IO_READ32(pAd, RMAC_RMCR, &Value); - - if (ctl->RxStream0 == 1) - Value |= RMAC_RMCR_RX_STREAM_0; - else - Value &= ~RMAC_RMCR_RX_STREAM_0; - - if (ctl->RxStream1 == 1) - Value |= RMAC_RMCR_RX_STREAM_1; - else - Value &= ~RMAC_RMCR_RX_STREAM_1; - - RTMP_IO_WRITE32(pAd, RMAC_RMCR, Value); - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); -} - -static VOID ExtEventBeaconLostHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - struct _EXT_EVENT_BEACON_LOSS_T *pExtEventBeaconLoss = - (struct _EXT_EVENT_BEACON_LOSS_T *)Data; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::FW LOG, Beacon lost (%02x:%02x:%02x:%02x:%02x:%02x), Reason 0x%x\n", - __func__, pExtEventBeaconLoss->aucBssid[0], - pExtEventBeaconLoss->aucBssid[1], - pExtEventBeaconLoss->aucBssid[2], - pExtEventBeaconLoss->aucBssid[3], - pExtEventBeaconLoss->aucBssid[4], - pExtEventBeaconLoss->aucBssid[5], - pExtEventBeaconLoss->ucReason)); - - switch (pExtEventBeaconLoss->ucReason) { -#ifdef CONFIG_AP_SUPPORT - - case ENUM_BCN_LOSS_AP_DISABLE: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Beacon lost - AP disabled!!!\n")); - break; - - case ENUM_BCN_LOSS_AP_SER_TRIGGER: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Beacon lost - SER happened!!!\n")); - break; - - case ENUM_BCN_LOSS_AP_ERROR: - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Beacon lost - Error!!! Re-issue BCN_OFFLOAD cmd\n")); - /* update Beacon again if operating in AP mode. */ - UpdateBeaconHandler(pAd, NULL, BCN_UPDATE_AP_RENEW); - break; -#endif - - default: - break; - } -} - -#ifdef MT_DFS_SUPPORT /* Jelly20140123 */ -static VOID ExtEventRddReportHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - struct _EXT_EVENT_RDD_REPORT_T *pExtEventRddReport = - (struct _EXT_EVENT_RDD_REPORT_T *)Data; - UCHAR ucRddIdx = pExtEventRddReport->ucRddIdx; -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT - BOOLEAN fgRadarDetected = FALSE; - - UpdateRadarInfo(pExtEventRddReport); - if ((pExtEventRddReport->ucLongDetected == TRUE) || - (pExtEventRddReport->ucConstantPRFDetected == TRUE) || - (pExtEventRddReport->ucStaggeredPRFDetected == TRUE)) - fgRadarDetected = TRUE; - - if (pAd->CommonCfg.DfsParameter.fgSwRDDLogEnable == TRUE) - DumpRadarSwPulsesInfo(pAd, pExtEventRddReport); - if (pAd->CommonCfg.DfsParameter.fgHwRDDLogEnable == TRUE) - DumpRadarHwPulsesInfo(pAd, pExtEventRddReport); - - if ((pAd->CommonCfg.DfsParameter.fgRadarEmulate == TRUE) || - (fgRadarDetected == TRUE)) -#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */ - WrapDfsRddReportHandle(pAd, ucRddIdx); -} - -#endif - -#ifdef WIFI_SPECTRUM_SUPPORT -/* - ========================================================================== - Description: - Unsolicited extend event handler of wifi-spectrum. - Return: - ========================================================================== -*/ -static VOID ExtEventWifiSpectrumHandler(IN RTMP_ADAPTER *pAd, IN UINT8 *pData, - IN UINT32 Length) -{ - EXT_EVENT_SPECTRUM_RESULT_T *pResult = - (EXT_EVENT_SPECTRUM_RESULT_T *)pData; - -#ifdef RT_BIG_ENDIAN - pResult->u4FuncIndex = le2cpu32(pResult->u4FuncIndex); -#endif - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: FuncIndex = %d\n", __func__, pResult->u4FuncIndex)); - - switch (pResult->u4FuncIndex) { - case SPECTRUM_CTRL_FUNCID_DUMP_RAW_DATA: - RTEnqueueInternalCmd(pAd, CMDTHRED_WIFISPECTRUM_DUMP_RAW_DATA, - (VOID *)pData, Length); - break; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return; -} - -/* - ========================================================================== - Description: - Cmd queue raw data handler of wifi-spectrum. - Return: - ========================================================================== -*/ -NTSTATUS WifiSpectrumRawDataHandler(IN RTMP_ADAPTER *pAd, IN PCmdQElmt CMDQelmt) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->SpectrumEventRawDataHandler != NULL) { - ops->SpectrumEventRawDataHandler(pAd, CMDQelmt->buffer, - CMDQelmt->bufferlength); - return NDIS_STATUS_SUCCESS; - } else - return NDIS_STATUS_FAILURE; -} - -/* - ========================================================================== - Description: - Extend event raw data handler of wifi-spectrum. - Return: - ========================================================================== -*/ -VOID ExtEventWifiSpectrumRawDataHandler(IN RTMP_ADAPTER *pAd, IN UINT8 *pData, - IN UINT32 Length) -{ - UINT32 i, CapNode, Data; - UINT8 msg_IQ[CAP_FILE_MSG_LEN], msg_Gain[CAP_FILE_MSG_LEN]; - INT32 retval, Status; - INT16 I_0, Q_0, LNA, LPF; - RTMP_OS_FS_INFO osFSInfo; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 BankNum = pChipCap->SpectrumBankNum; - RBIST_DESC_T *pSpectrumDesc = &pChipCap->pSpectrumDesc[0]; - EXT_EVENT_RBIST_DUMP_RAW_DATA_T *pSpectrumEvent = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update pSpectrumEvent */ - pSpectrumEvent = (EXT_EVENT_RBIST_DUMP_RAW_DATA_T *)pData; - pSpectrumEvent->u4FuncIndex = le2cpu32(pSpectrumEvent->u4FuncIndex); - pSpectrumEvent->u4PktNum = le2cpu32(pSpectrumEvent->u4PktNum); - - /* If file is closed, we need to drop this packet. */ - if ((pAd->pSrcf_IQ == NULL) || (pAd->pSrcf_Gain == NULL)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[31m%s: File is already closed!!\x1b[m\n", - __func__)); - return; - } - - /* If we receive the packet which is delivered from last time data-capure, we need to drop it.*/ - if (pSpectrumEvent->u4PktNum > pAd->SpectrumEventCnt) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[31m%s: Packet out of order: Pkt num %d, EventCnt %d\x1b[m\n", - __func__, pSpectrumEvent->u4PktNum, - pAd->SpectrumEventCnt)); - return; - } - - /* Change limits of authority in order to read/write file */ - RtmpOSFSInfoChange(&osFSInfo, TRUE); - - /* Dump I/Q/LNA/LPF data to file */ - for (i = 0; i < SPECTRUM_EVENT_DATA_SAMPLE; i++) { - Data = le2cpu32(pSpectrumEvent->u4Data[i]); - os_zero_mem(msg_IQ, CAP_FILE_MSG_LEN); - os_zero_mem(msg_Gain, CAP_FILE_MSG_LEN); - /* Parse I/Q/LNA/LPF data and dump these data to file */ - CapNode = Get_System_CapNode_Info(pAd); - if ((CapNode == pChipCap->SpectrumWF0ADC) || - (CapNode == pChipCap->SpectrumWF1ADC) || - (CapNode == pChipCap->SpectrumWF2ADC) || - (CapNode == - pChipCap->SpectrumWF3ADC)) { /* Dump 1-way RXADC */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Dump 1-way RXADC\n", __func__)); - - if (pSpectrumDesc->ucADCRes == 10) { - /* Parse and dump I/Q data */ - Q_0 = (Data & 0x3FF); - I_0 = ((Data & (0x3FF << 10)) >> 10); - - if (Q_0 >= 512) - Q_0 -= 1024; - - if (I_0 >= 512) - I_0 -= 1024; - - sprintf(msg_IQ, "%+04d\t%+04d\n", I_0, Q_0); - retval = RtmpOSFileWrite(pAd->pSrcf_IQ, - (RTMP_STRING *)msg_IQ, - strlen(msg_IQ)); - /* Parse and dump LNA/LPF data */ - LNA = ((Data & (0x3 << 28)) >> 28); - LPF = ((Data & (0xF << 24)) >> 24); - sprintf(msg_Gain, "%+04d\t%+04d\n", LNA, LPF); - retval = - RtmpOSFileWrite(pAd->pSrcf_Gain, - (RTMP_STRING *)msg_Gain, - strlen(msg_Gain)); - } - } else if ((CapNode == pChipCap->SpectrumWF0FIIQ) || - (CapNode == pChipCap->SpectrumWF1FIIQ) || - (CapNode == pChipCap->SpectrumWF2FIIQ) || - (CapNode == pChipCap->SpectrumWF3FIIQ) || - (CapNode == pChipCap->SpectrumWF0FDIQ) || - (CapNode == pChipCap->SpectrumWF1FDIQ) || - (CapNode == pChipCap->SpectrumWF2FDIQ) || - (CapNode == - pChipCap->SpectrumWF3FDIQ)) { /* Dump 1-way RXIQC */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Dump 1-way RXIQC\n", __func__)); - - if (pSpectrumDesc->ucIQCRes == 12) { - /* Parse and dump I/Q data */ - Q_0 = (Data & 0xFFF); - I_0 = ((Data & (0xFFF << 12)) >> 12); - - if (Q_0 >= 2048) - Q_0 -= 4096; - - if (I_0 >= 2048) - I_0 -= 4096; - - sprintf(msg_IQ, "%+05d\t%+05d\n", I_0, Q_0); - retval = RtmpOSFileWrite(pAd->pSrcf_IQ, - (RTMP_STRING *)msg_IQ, - strlen(msg_IQ)); - /* Parse and dump LNA/LPF data */ - LNA = ((Data & (0x3 << 28)) >> 28); - LPF = ((Data & (0xF << 24)) >> 24); - sprintf(msg_Gain, "%+04d\t%+04d\n", LNA, LPF); - retval = - RtmpOSFileWrite(pAd->pSrcf_Gain, - (RTMP_STRING *)msg_Gain, - strlen(msg_Gain)); - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : 0x%08x\n", __func__, Data)); - } - - /* Change limits of authority in order to read/write file */ - RtmpOSFSInfoChange(&osFSInfo, FALSE); - /* Update SpectrumEventCnt */ - pAd->SpectrumEventCnt++; - - if (IS_MT7615(pAd)) { - /* Check whether is the last FW event of whole data query or not */ - if (pAd->SpectrumEventCnt == MT7615_SPECTRUM_TOTAL_SIZE) { - /* Reset SpectrumEventCnt */ - pAd->SpectrumEventCnt = 0; - /* Update SpectrumStatus */ - pAd->SpectrumStatus = CAP_SUCCESS; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[31m%s: Dump 128K done !! \x1b[m\n", - __func__)); - RTMP_OS_COMPLETE(&pAd->SpectrumDumpDataDone); - } - } else { - /* Update pSpectrumDesc */ - pSpectrumDesc = &pChipCap->pSpectrumDesc[pAd->SpectrumIdx]; - - /* Check whether is the last FW event of data query in the same bank */ - if (pAd->SpectrumEventCnt == pSpectrumDesc->u4BankSize) { - /* Check whether is the last bank or not */ - if ((pAd->SpectrumIdx + 1) == BankNum) { - /* Print log to console to indicate data process done */ - { - UINT32 TotalSize = 0; - - for (i = 0; i < BankNum; i++) { - /* Update pSpectrumDesc */ - pSpectrumDesc = - &pChipCap->pSpectrumDesc - [i]; - /* Calculate total size */ - TotalSize = - TotalSize + - pSpectrumDesc - ->u4BankSize; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("\x1b[31m%s: Dump %d K done !! \x1b[m\n", - __func__, TotalSize)); - } - /* Update status */ - pAd->SpectrumStatus = CAP_SUCCESS; - } - - /* Reset SpectrumEventCnt */ - pAd->SpectrumEventCnt = 0; - /* OS wait for completion done */ - RTMP_OS_COMPLETE(&pAd->SpectrumDumpDataDone); - } - } - - /* Update status */ - Status = pAd->SpectrumStatus; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return; -} -#endif /* WIFI_SPECTRUM_SUPPORT */ - -#ifdef INTERNAL_CAPTURE_SUPPORT -/* - ========================================================================== - Description: - Cmd queue raw data handler of ICAP. - Return: - ========================================================================== -*/ -NTSTATUS ICapRawDataHandler(IN RTMP_ADAPTER *pAd, IN PCmdQElmt CMDQelmt) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->ICapEventRawDataHandler != NULL) { - ops->ICapEventRawDataHandler(pAd, CMDQelmt->buffer, - CMDQelmt->bufferlength); - return NDIS_STATUS_SUCCESS; - } else - return NDIS_STATUS_FAILURE; -} - -/* - ========================================================================== - Description: - Extend event of 96-bit raw data parser of ICAP. - Return: - ========================================================================== -*/ -VOID ExtEventICap96BitDataParser(IN RTMP_ADAPTER *pAd) -{ - INT32 retval, Status; - UINT32 i, j, StopPoint, CapNode; - BOOLEAN Wrap; - PUINT32 pTemp_L32Bit = NULL, pTemp_M32Bit = NULL, pTemp_H32Bit = NULL; - RTMP_REG_PAIR RegStartAddr, RegStopAddr, RegWrap; - P_RBIST_IQ_DATA_T pIQ_Array = NULL; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - RBIST_DESC_T *pICapDesc = &pChipCap->pICapDesc[0]; - UINT8 BankNum = pChipCap->ICapBankNum; - UINT32 BankSmplCnt = pChipCap->ICapBankSmplCnt; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Get RBIST start address */ - RegStartAddr.Register = RBISTCR2; - MtCmdMultipleMacRegAccessRead(pAd, &RegStartAddr, 1); - /* Get RBIST stop address */ - RegStopAddr.Register = RBISTCR9; - MtCmdMultipleMacRegAccessRead(pAd, &RegStopAddr, 1); - /* Calculate stop point */ - StopPoint = (RegStopAddr.Value - RegStartAddr.Value) / 4; - /* Get RBIST wrapper */ - RegWrap.Register = RBISTCR0; - MtCmdMultipleMacRegAccessRead(pAd, &RegWrap, 1); - Wrap = ((RegWrap.Value & BIT(ICAP_WRAP)) >> ICAP_WRAP); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[42m RBISTCR2: 0x%08x, RBISTCR9: 0x%08x, Wrap: %d \x1b[m\n", - RegStartAddr.Value, RegStopAddr.Value, Wrap)); - - /* Re-arrange each buffer by stop address and wrapper */ - if (!Wrap) { - UINT32 Len, Offset; - - Len = ((BankNum / 3) * BankSmplCnt - StopPoint - 1) * - sizeof(UINT32); - Offset = StopPoint + 1; - /* Set the rest of redundant data to zero */ - os_zero_mem((pAd->pL32Bit + Offset), Len); - os_zero_mem((pAd->pM32Bit + Offset), Len); - os_zero_mem((pAd->pH32Bit + Offset), Len); - } else { - UINT32 Len, Offset; - - /* Dynamic allocate memory for pTemp_L32Bit */ - Len = (BankNum / 3) * BankSmplCnt * sizeof(UINT32); - retval = os_alloc_mem(pAd, (UCHAR **)&pTemp_L32Bit, Len); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - - /* Dynamic allocate memory for pTemp_M32Bit */ - retval = os_alloc_mem(pAd, (UCHAR **)&pTemp_M32Bit, Len); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - - /* Dynamic allocate memory for pTemp_H32Bit */ - retval = os_alloc_mem(pAd, (UCHAR **)&pTemp_H32Bit, Len); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - - /* Initialization of data buffer of Temp_L32Bit/Temp_M32Bit/Temp_H32Bit */ - os_zero_mem(pTemp_L32Bit, Len); - os_zero_mem(pTemp_M32Bit, Len); - os_zero_mem(pTemp_H32Bit, Len); - os_move_mem(pTemp_L32Bit, pAd->pL32Bit, Len); - os_move_mem(pTemp_M32Bit, pAd->pM32Bit, Len); - os_move_mem(pTemp_H32Bit, pAd->pH32Bit, Len); - - for (i = 0; i < (Len / sizeof(UINT32)); i++) { - /* Re-arrange data buffer of L32Bit/M32Bit/H32Bit */ - Offset = (StopPoint + 1 + i) % (Len / sizeof(UINT32)); - *(pAd->pL32Bit + i) = *(pTemp_L32Bit + Offset); - *(pAd->pM32Bit + i) = *(pTemp_M32Bit + Offset); - *(pAd->pH32Bit + i) = *(pTemp_H32Bit + Offset); - } - } - - /* Reset IQ_Array */ - pIQ_Array = pAd->pIQ_Array; - os_zero_mem(pIQ_Array, MAX_ICAP_IQ_DATA_CNT * sizeof(RBIST_IQ_DATA_T)); - - /* Parse I/Q data and store these data to buffer */ - CapNode = Get_System_CapNode_Info(pAd); - if (CapNode == pChipCap->ICapFourWayADC) { /* 4-way ADC */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[42m4-Way RXADC ------> \x1b[m\n")); - - for (i = 0; i < (pChipCap->ICapADCIQCnt / 3); i++) { - if (pICapDesc->ucADCRes == 4) { - /* Parse I/Q data */ - pIQ_Array[3 * i].IQ_Array[CAP_WF0][CAP_Q_TYPE] = - ((*(pAd->pL32Bit + i) & (0xF << 8)) >> - 8); /* Parsing Q0 */ - pIQ_Array[3 * i + 1] - .IQ_Array[CAP_WF0][CAP_Q_TYPE] = - ((*(pAd->pL32Bit + i) & (0xF << 4)) >> - 4); /* Parsing Q0 */ - pIQ_Array[3 * i + 2] - .IQ_Array[CAP_WF0][CAP_Q_TYPE] = - (*(pAd->pL32Bit + i) & - 0xF); /* Parsing Q0 */ - pIQ_Array[3 * i].IQ_Array[CAP_WF0][CAP_I_TYPE] = - ((*(pAd->pL32Bit + i) & (0xF << 20)) >> - 20); /* Parsing I0 */ - pIQ_Array[3 * i + 1] - .IQ_Array[CAP_WF0][CAP_I_TYPE] = - ((*(pAd->pL32Bit + i) & (0xF << 16)) >> - 16); /* Parsing I0 */ - pIQ_Array[3 * i + 2] - .IQ_Array[CAP_WF0][CAP_I_TYPE] = - ((*(pAd->pL32Bit + i) & (0xF << 12)) >> - 12); /* Parsing I0 */ - pIQ_Array[3 * i].IQ_Array[CAP_WF1][CAP_Q_TYPE] = - (*(pAd->pM32Bit + i) & - 0xF); /* Parsing Q1 */ - pIQ_Array[3 * i + 1] - .IQ_Array[CAP_WF1][CAP_Q_TYPE] = - ((*(pAd->pL32Bit + i) & (0xF << 28)) >> - 28); /* Parsing Q1 */ - pIQ_Array[3 * i + 2] - .IQ_Array[CAP_WF1][CAP_Q_TYPE] = - ((*(pAd->pL32Bit + i) & (0xF << 24)) >> - 24); /* Parsing Q1 */ - pIQ_Array[3 * i].IQ_Array[CAP_WF1][CAP_I_TYPE] = - ((*(pAd->pM32Bit + i) & (0xF << 12)) >> - 12); /* Parsing I1 */ - pIQ_Array[3 * i + 1] - .IQ_Array[CAP_WF1][CAP_I_TYPE] = - ((*(pAd->pM32Bit + i) & (0xF << 8)) >> - 8); /* Parsing I1 */ - pIQ_Array[3 * i + 2] - .IQ_Array[CAP_WF1][CAP_I_TYPE] = - ((*(pAd->pM32Bit + i) & (0xF << 4)) >> - 4); /* Parsing I1 */ - pIQ_Array[3 * i].IQ_Array[CAP_WF2][CAP_Q_TYPE] = - ((*(pAd->pM32Bit + i) & (0xF << 24)) >> - 24); /* Parsing Q2 */ - pIQ_Array[3 * i + 1] - .IQ_Array[CAP_WF2][CAP_Q_TYPE] = - ((*(pAd->pM32Bit + i) & (0xF << 20)) >> - 20); /* Parsing Q2 */ - pIQ_Array[3 * i + 2] - .IQ_Array[CAP_WF2][CAP_Q_TYPE] = - ((*(pAd->pM32Bit + i) & (0xF << 16)) >> - 16); /* Parsing Q2 */ - pIQ_Array[3 * i].IQ_Array[CAP_WF2][CAP_I_TYPE] = - ((*(pAd->pH32Bit + i) & (0xF << 4)) >> - 4); /* Parsing I2 */ - pIQ_Array[3 * i + 1] - .IQ_Array[CAP_WF2][CAP_I_TYPE] = - (*(pAd->pH32Bit + i) & - 0xF); /* Parsing I2 */ - pIQ_Array[3 * i + 2] - .IQ_Array[CAP_WF2][CAP_I_TYPE] = - ((*(pAd->pM32Bit + i) & (0xF << 28)) >> - 28); /* Parsing I2 */ - pIQ_Array[3 * i].IQ_Array[CAP_WF3][CAP_Q_TYPE] = - ((*(pAd->pH32Bit + i) & (0xF << 16)) >> - 16); /* Parsing Q3 */ - pIQ_Array[3 * i + 1] - .IQ_Array[CAP_WF3][CAP_Q_TYPE] = - ((*(pAd->pH32Bit + i) & (0xF << 12)) >> - 12); /* Parsing Q3 */ - pIQ_Array[3 * i + 2] - .IQ_Array[CAP_WF3][CAP_Q_TYPE] = - ((*(pAd->pH32Bit + i) & (0xF << 8)) >> - 8); /* Parsing Q3 */ - pIQ_Array[3 * i].IQ_Array[CAP_WF3][CAP_I_TYPE] = - ((*(pAd->pH32Bit + i) & (0xF << 28)) >> - 28); /* Parsing I3 */ - pIQ_Array[3 * i + 1] - .IQ_Array[CAP_WF3][CAP_I_TYPE] = - ((*(pAd->pH32Bit + i) & (0xF << 24)) >> - 24); /* Parsing I3 */ - pIQ_Array[3 * i + 2] - .IQ_Array[CAP_WF3][CAP_I_TYPE] = - ((*(pAd->pH32Bit + i) & (0xF << 20)) >> - 20); /* Parsing I3 */ - - /* Calculation of two-complement to decimal */ - for (j = 0; j < 3; j++) { - pIQ_Array[3 * i + j] - .IQ_Array[CAP_WF0][CAP_Q_TYPE] -= - 8; - pIQ_Array[3 * i + j] - .IQ_Array[CAP_WF0][CAP_I_TYPE] -= - 8; - pIQ_Array[3 * i + j] - .IQ_Array[CAP_WF1][CAP_Q_TYPE] -= - 8; - pIQ_Array[3 * i + j] - .IQ_Array[CAP_WF1][CAP_I_TYPE] -= - 8; - pIQ_Array[3 * i + j] - .IQ_Array[CAP_WF2][CAP_Q_TYPE] -= - 8; - pIQ_Array[3 * i + j] - .IQ_Array[CAP_WF2][CAP_I_TYPE] -= - 8; - pIQ_Array[3 * i + j] - .IQ_Array[CAP_WF3][CAP_Q_TYPE] -= - 8; - pIQ_Array[3 * i + j] - .IQ_Array[CAP_WF3][CAP_I_TYPE] -= - 8; - } - } - } - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[42m 4-Way IQC ------> \x1b[m\n")); - - for (i = 0; i < pChipCap->ICapIQCIQCnt; i++) { - if (pICapDesc->ucIQCRes == 12) { - /* Parse I/Q data */ - pIQ_Array[i].IQ_Array[CAP_WF0][CAP_Q_TYPE] = - (*(pAd->pL32Bit + i) & - 0xFFF); /* Parsing Q0 */ - pIQ_Array[i].IQ_Array[CAP_WF0][CAP_I_TYPE] = - ((*(pAd->pL32Bit + i) & - (0xFFF << 12)) >> - 12); /* Parsing I0 */ - pIQ_Array[i].IQ_Array[CAP_WF1][CAP_Q_TYPE] = - ((*(pAd->pL32Bit + i) & (0xFF << 24)) >> - 24); /* Parsing Q1 */ - pIQ_Array[i].IQ_Array[CAP_WF1][CAP_Q_TYPE] |= - ((*(pAd->pM32Bit + i) & 0xF) - << 8); /* Parsing Q1 */ - pIQ_Array[i].IQ_Array[CAP_WF1][CAP_I_TYPE] = - ((*(pAd->pM32Bit + i) & (0xFFF << 4)) >> - 4); /* Parsing I1 */ - pIQ_Array[i].IQ_Array[CAP_WF2][CAP_Q_TYPE] = - ((*(pAd->pM32Bit + i) & - (0xFFF << 16)) >> - 16); /* Parsing Q2 */ - pIQ_Array[i].IQ_Array[CAP_WF2][CAP_I_TYPE] = - ((*(pAd->pM32Bit + i) & (0xF << 28)) >> - 28); /* Parsing I2 */ - pIQ_Array[i].IQ_Array[CAP_WF2][CAP_I_TYPE] |= - ((*(pAd->pH32Bit + i) & 0xFF) - << 4); /* Parsing I2 */ - pIQ_Array[i].IQ_Array[CAP_WF3][CAP_Q_TYPE] = - ((*(pAd->pH32Bit + i) & (0xFFF << 8)) >> - 8); /* Parsing Q3 */ - pIQ_Array[i].IQ_Array[CAP_WF3][CAP_I_TYPE] = - ((*(pAd->pH32Bit + i) & - (0xFFF << 20)) >> - 20); /* Parsing I3 */ - - /* Calculation of two-complement to decimal */ - if (pIQ_Array[i].IQ_Array[CAP_WF0][CAP_Q_TYPE] >= - 2048) - pIQ_Array[i].IQ_Array[CAP_WF0] - [CAP_Q_TYPE] -= - 4096; - - if (pIQ_Array[i].IQ_Array[CAP_WF0][CAP_I_TYPE] >= - 2048) - pIQ_Array[i].IQ_Array[CAP_WF0] - [CAP_I_TYPE] -= - 4096; - - if (pIQ_Array[i].IQ_Array[CAP_WF1][CAP_Q_TYPE] >= - 2048) - pIQ_Array[i].IQ_Array[CAP_WF1] - [CAP_Q_TYPE] -= - 4096; - - if (pIQ_Array[i].IQ_Array[CAP_WF1][CAP_I_TYPE] >= - 2048) - pIQ_Array[i].IQ_Array[CAP_WF1] - [CAP_I_TYPE] -= - 4096; - - if (pIQ_Array[i].IQ_Array[CAP_WF2][CAP_Q_TYPE] >= - 2048) - pIQ_Array[i].IQ_Array[CAP_WF2] - [CAP_Q_TYPE] -= - 4096; - - if (pIQ_Array[i].IQ_Array[CAP_WF2][CAP_I_TYPE] >= - 2048) - pIQ_Array[i].IQ_Array[CAP_WF2] - [CAP_I_TYPE] -= - 4096; - - if (pIQ_Array[i].IQ_Array[CAP_WF3][CAP_Q_TYPE] >= - 2048) - pIQ_Array[i].IQ_Array[CAP_WF3] - [CAP_Q_TYPE] -= - 4096; - - if (pIQ_Array[i].IQ_Array[CAP_WF3][CAP_I_TYPE] >= - 2048) - pIQ_Array[i].IQ_Array[CAP_WF3] - [CAP_I_TYPE] -= - 4096; - } - } - } - - /* Print log to console to indicate data process done */ - { - UINT32 TotalSize = 0; - - for (i = 0; i < BankNum; i++) { - /* Update pICapDesc */ - pICapDesc = &pChipCap->pICapDesc[i]; - /* Calculate total size */ - TotalSize = TotalSize + pICapDesc->u4BankSize; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[31m%s: Dump %d K done !! \x1b[m\n", __func__, - TotalSize)); - } - /* Update ICap overall status */ - pAd->ICapStatus = CAP_SUCCESS; - -error: - if (pTemp_L32Bit != NULL) - os_free_mem(pTemp_L32Bit); - - if (pTemp_M32Bit != NULL) - os_free_mem(pTemp_M32Bit); - - if (pTemp_H32Bit != NULL) - os_free_mem(pTemp_H32Bit); - - /* Update status */ - Status = pAd->ICapStatus; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return; -} - -/* - ========================================================================== - Description: - Extend event 96-bit raw data handler of ICAP. - Return: - ========================================================================== -*/ -VOID ExtEventICap96BitRawDataHandler(IN RTMP_ADAPTER *pAd, IN UINT8 *pData, - IN UINT32 Length) -{ - INT32 retval, Status; - UINT32 i, j; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - RBIST_DESC_T *pICapDesc = &pChipCap->pICapDesc[0]; - UINT8 BankNum = pChipCap->ICapBankNum; - UINT32 BankSmplCnt = pChipCap->ICapBankSmplCnt; - EXT_EVENT_RBIST_DUMP_RAW_DATA_T *pICapEvent = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update pICapEvent */ - pICapEvent = (EXT_EVENT_RBIST_DUMP_RAW_DATA_T *)pData; - pICapEvent->u4FuncIndex = le2cpu32(pICapEvent->u4FuncIndex); - pICapEvent->u4PktNum = le2cpu32(pICapEvent->u4PktNum); - pICapEvent->u4Bank = le2cpu32(pICapEvent->u4Bank); - - /* If we receive the packet which is delivered from last time data-capure, we need to drop it. */ - if (pICapEvent->u4PktNum > pAd->ICapEventCnt) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[31m%s: Packet out of order: Pkt num %d, EventCnt %d\x1b[m\n", - __func__, pICapEvent->u4PktNum, pAd->ICapEventCnt)); - return; - } - - /* Dynamic allocate memory for L32Bit/M32Bit/H32Bit buffer */ - { - UINT32 Len; - - Len = (BankNum / 3) * BankSmplCnt * sizeof(UINT32); - if (pAd->pL32Bit == NULL) { - retval = - os_alloc_mem(pAd, (UCHAR **)&pAd->pL32Bit, Len); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - } - - if (pAd->pM32Bit == NULL) { - retval = - os_alloc_mem(pAd, (UCHAR **)&pAd->pM32Bit, Len); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - } - - if (pAd->pH32Bit == NULL) { - retval = - os_alloc_mem(pAd, (UCHAR **)&pAd->pH32Bit, Len); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - } - - /* Initialization of data buffer of L32Bit/M32Bit/H32Bit */ - if ((pAd->ICapL32Cnt == 0) && (pAd->ICapM32Cnt == 0) && - (pAd->ICapH32Cnt == 0)) { - os_zero_mem(pAd->pL32Bit, Len); - os_zero_mem(pAd->pM32Bit, Len); - os_zero_mem(pAd->pH32Bit, Len); - } - } - - /* Store L32Bit, M32Bit, H32Bit data to each buffer */ - for (j = 0; j < (BankNum / 3); j++) { - if (pICapEvent->u4Bank == pICapDesc->pLBank[j]) { - for (i = 0; i < ICAP_EVENT_DATA_SAMPLE; i++) { - pAd->pL32Bit[pAd->ICapL32Cnt] = - le2cpu32(pICapEvent->u4Data[i]); - pAd->ICapL32Cnt++; - } - } else if (pICapEvent->u4Bank == pICapDesc->pMBank[j]) { - for (i = 0; i < ICAP_EVENT_DATA_SAMPLE; i++) { - pAd->pM32Bit[pAd->ICapM32Cnt] = - le2cpu32(pICapEvent->u4Data[i]); - pAd->ICapM32Cnt++; - } - } else if (pICapEvent->u4Bank == pICapDesc->pHBank[j]) { - for (i = 0; i < ICAP_EVENT_DATA_SAMPLE; i++) { - pAd->pH32Bit[pAd->ICapH32Cnt] = - le2cpu32(pICapEvent->u4Data[i]); - pAd->ICapH32Cnt++; - } - } - } - - /* Print ICap data to console for debugging purpose */ - for (i = 0; i < ICAP_EVENT_DATA_SAMPLE; i++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[42m 0x%08x\x1b[m\n", - le2cpu32(pICapEvent->u4Data[i]))); - } - - /* Update ICapEventCnt */ - pAd->ICapEventCnt++; - /* Update pICapDesc */ - pICapDesc = &pChipCap->pICapDesc[pAd->ICapIdx]; - - /* Check whether is the last FW event or not */ - if (pAd->ICapEventCnt == pICapDesc->u4BankSize) { - /* Check whether is the last bank or not */ - if ((pAd->ICapIdx + 1) == BankNum) - ExtEventICap96BitDataParser(pAd); - - /* Reset ICapEventCnt */ - pAd->ICapEventCnt = 0; - /* OS wait for completion done */ - RTMP_OS_COMPLETE(&pAd->ICapDumpDone); - } - -error: - /* Update status */ - Status = pAd->ICapStatus; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return; -} - -/* - ========================================================================== - Description: - Extend event of querying data-captured status handler of ICAP. - Return: - ========================================================================== -*/ -VOID ExtEventICapStatusHandler(IN RTMP_ADAPTER *pAd, IN UINT8 *pData, - IN UINT32 Length) -{ - EXT_EVENT_RBIST_ADDR_T *prICapGetEvent = - (EXT_EVENT_RBIST_ADDR_T *)pData; - -#ifdef RT_BIG_ENDIAN - prICapGetEvent->u4FuncIndex = le2cpu32(prICapGetEvent->u4FuncIndex); - prICapGetEvent->u4FuncLength = le2cpu32(prICapGetEvent->u4FuncLength); - prICapGetEvent->u4StartAddr1 = le2cpu32(prICapGetEvent->u4StartAddr1); - prICapGetEvent->u4StartAddr2 = le2cpu32(prICapGetEvent->u4StartAddr2); - prICapGetEvent->u4StartAddr3 = le2cpu32(prICapGetEvent->u4StartAddr3); - prICapGetEvent->u4EndAddr = le2cpu32(prICapGetEvent->u4EndAddr); - prICapGetEvent->u4StopAddr = le2cpu32(prICapGetEvent->u4StopAddr); - prICapGetEvent->u4Wrap = le2cpu32(prICapGetEvent->u4Wrap); -#endif - - /* save iCap result */ - /* send iCap result to QA tool */ -#ifdef CONFIG_ATE - NdisMoveMemory(&(pAd->ATECtrl.icap_info), prICapGetEvent, - sizeof(EXT_EVENT_RBIST_ADDR_T)); -#endif /* CONFIG_ATE */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: prICapGetEvent->" - "u4StartAddr1 = 0x%x\n", - __func__, prICapGetEvent->u4StartAddr1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: prICapGetEvent->" - "u4StartAddr2 = 0x%x\n", - __func__, prICapGetEvent->u4StartAddr2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: prICapGetEvent->" - "u4StartAddr3 = 0x%x\n", - __func__, prICapGetEvent->u4StartAddr3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: prICapGetEvent->" - "u4EndAddr = 0x%x\n", - __func__, prICapGetEvent->u4EndAddr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: prICapGetEvent->" - "u4StopAddr = 0x%x\n", - __func__, prICapGetEvent->u4StopAddr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: prICapGetEvent->" - "u4Wrap = 0x%x\n", - __func__, prICapGetEvent->u4Wrap)); -#ifdef CONFIG_ATE - RTMP_OS_COMPLETE(&(pAd->ATECtrl.cmd_done)); -#endif /* CONFIG_ATE */ -} -#endif /* INTERNAL_CAPTURE_SUPPORT */ - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT -static VOID ExtEventThroughputBurst(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - BOOLEAN fgEnable = FALSE; - UCHAR pkt_num = 0, retry_limit = 0; - UINT32 length = 0; -#ifdef CONFIG_AP_SUPPORT - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; -#endif - - if (!Data || !wdev) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: Data is NULL\n", __func__)); - return; - } - - fgEnable = (BOOLEAN)(*Data); - pAd->bDisableRtsProtect = fgEnable; - - if (pAd->bDisableRtsProtect) { - pkt_num = MAX_RTS_PKT_THRESHOLD; - length = MAX_RTS_THRESHOLD; - retry_limit = 0; - } else { - pkt_num = wlan_operate_get_rts_pkt_thld(wdev); - length = wlan_operate_get_rts_len_thld(wdev); - retry_limit = wlan_operate_get_rts_retry_limit(wdev); - } - - HW_SET_RTS_THLD(pAd, wdev, pkt_num, length, retry_limit); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::%d\n", __func__, fgEnable)); -} - -static VOID ExtEventGBand256QamProbeResule(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_EXT_EVENT_G_BAND_256QAM_PROBE_RESULT_T pResult; - MAC_TABLE_ENTRY *pEntry = NULL; - - if (Data != NULL) { - pResult = (P_EXT_EVENT_G_BAND_256QAM_PROBE_RESULT_T)(Data); - pEntry = &pAd->MacTab.Content[pResult->ucWlanIdx]; - - if (IS_ENTRY_NONE(pEntry)) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: pEntry is NONE\n", __func__)); - return; - } - - if (pResult->ucResult == RA_G_BAND_256QAM_PROBE_SUCCESS) - pEntry->fgGband256QAMSupport = TRUE; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::Gband256QAMSupport = %d\n", __func__, - pResult->ucResult)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: Data is NULL\n", __func__)); - } -} -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - -UINT max_line = 130; - -static VOID ExtEventAssertDumpHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length, EVENT_RXD *event_rxd) -{ - struct _EXT_EVENT_ASSERT_DUMP_T *pExtEventAssertDump = - (struct _EXT_EVENT_ASSERT_DUMP_T *)Data; - - if (max_line) { - if (max_line == 130) - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("**************************************************\n\n")); - - max_line--; - pExtEventAssertDump->aucBuffer[Length] = 0; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", pExtEventAssertDump->aucBuffer)); - } - -#ifdef FW_DUMP_SUPPORT - - if (!pAd->fw_dump_buffer) { - os_alloc_mem(pAd, &pAd->fw_dump_buffer, pAd->fw_dump_max_size); - pAd->fw_dump_size = 0; - pAd->fw_dump_read = 0; - - if (pAd->fw_dump_buffer) { - if (event_rxd->fw_rxd_2.field.s2d_index == N92HOST) - RTMP_OS_FWDUMP_PROCCREATE(pAd, "_N9"); - else if (event_rxd->fw_rxd_2.field.s2d_index == - CR42HOST) - RTMP_OS_FWDUMP_PROCCREATE(pAd, "_CR4"); - else - RTMP_OS_FWDUMP_PROCCREATE(pAd, "\0"); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: cannot alloc mem for FW dump\n", - __func__)); - } - } - - if (pAd->fw_dump_buffer) { - if ((pAd->fw_dump_size + Length) <= pAd->fw_dump_max_size) { - os_move_mem(pAd->fw_dump_buffer + pAd->fw_dump_size, - Data, Length); - pAd->fw_dump_size += Length; - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: FW dump size too big\n", __func__)); - } - } - -#endif -} - -static VOID ExtEventPsSyncHandler(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - struct _EXT_EVENT_PS_SYNC_T *pExtEventPsSync = - (struct _EXT_EVENT_PS_SYNC_T *)Data; - - struct _STA_TR_ENTRY *tr_entry = NULL; - UCHAR wcid = pExtEventPsSync->ucWtblIndex; - struct qm_ctl *qm_ctl = &pAd->qm_ctl; - struct qm_ops *qm_ops = pAd->qm_ops; - NDIS_PACKET *pkt = NULL; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: PsSync Event from FW APPS WIdx=%d PSBit=%d len=%d\n", - __func__, wcid, pExtEventPsSync->ucPsBit, Length)); - - if (VALID_TR_WCID(wcid)) { - tr_entry = &pAd->MacTab.tr_entry[wcid]; - - RTMP_SEM_LOCK(&tr_entry->ps_sync_lock); - - tr_entry->ps_state = - (pExtEventPsSync->ucPsBit == 0) ? FALSE : TRUE; - - if (tr_entry->ps_state == PWR_ACTIVE) { - do { - pkt = qm_ops->get_psq_pkt(pAd, tr_entry); - - if (pkt) { - UCHAR q_idx = - RTMP_GET_PACKET_QUEIDX(pkt); - UCHAR wdev_idx = - RTMP_GET_PACKET_WDEV(pkt); - struct wifi_dev *wdev = - pAd->wdev_list[wdev_idx]; - - qm_ctl->total_psq_cnt--; - qm_ops->enq_dataq_pkt(pAd, wdev, pkt, - q_idx); - } - } while (pkt); - } - - RTMP_SEM_UNLOCK(&tr_entry->ps_sync_lock); - - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: wtbl index(%d) is invalid\n", __func__, wcid)); - } -} - -#if defined(MT_MAC) && (!defined(MT7636)) && defined(TXBF_SUPPORT) -VOID ExtEventBfStatusRead(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - struct _EXT_EVENT_BF_STATUS_T *pExtEventBfStatus = - (struct _EXT_EVENT_BF_STATUS_T *)Data; - struct _EXT_EVENT_IBF_STATUS_T *pExtEventIBfStatus = - (struct _EXT_EVENT_IBF_STATUS_T *)Data; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - -#if defined(CONFIG_ATE) && defined(CONFIG_QA) - - if (ATE_ON(pAd)) - HQA_BF_INFO_CB(pAd, Data, Length); - -#endif - - switch (pExtEventBfStatus->ucBfDataFormatID) { - case BF_PFMU_TAG: - TxBfProfileTagPrint(pAd, pExtEventBfStatus->fgBFer, - pExtEventBfStatus->aucBuffer); - break; - - case BF_PFMU_DATA: - TxBfProfileDataPrint(pAd, - le2cpu16(pExtEventBfStatus->u2subCarrIdx), - pExtEventBfStatus->aucBuffer); - break; - - case BF_PFMU_PN: - TxBfProfilePnPrint(pExtEventBfStatus->ucBw, - pExtEventBfStatus->aucBuffer); - break; - - case BF_PFMU_MEM_ALLOC_MAP: - TxBfProfileMemAllocMap(pExtEventBfStatus->aucBuffer); - break; - - case BF_STAREC: - StaRecBfRead(pAd, pExtEventBfStatus->aucBuffer); - break; - - case BF_CAL_PHASE: - ops->iBFPhaseCalReport(pAd, pExtEventIBfStatus->ucGroup_L_M_H, - pExtEventIBfStatus->ucGroup, - pExtEventIBfStatus->fgSX2, - pExtEventIBfStatus->ucStatus, - pExtEventIBfStatus->ucPhaseCalType, - pExtEventIBfStatus->aucBuffer); - break; - - default: - break; - } -} -#endif /* MT_MAC && TXBF_SUPPORT */ - -#define NET_DEV_NAME_MAX_LENGTH 16 -static VOID ExtEventFwLog2HostHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length, EVENT_RXD *event_rxd) -{ - UCHAR *dev_name = NULL; - UCHAR empty_name[] = " "; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: s2d_index = 0x%x\n", __func__, - event_rxd->fw_rxd_2.field.s2d_index)); - dev_name = RtmpOsGetNetDevName(pAd->net_dev); - - if ((dev_name == NULL) || strlen(dev_name) >= NET_DEV_NAME_MAX_LENGTH) - dev_name = &empty_name[0]; - - if (event_rxd->fw_rxd_2.field.s2d_index == N92HOST) { -#ifdef PRE_CAL_TRX_SET1_SUPPORT - - if (pAd->KtoFlashDebug) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("(%s): %s", dev_name, Data)); - else -#endif /*PRE_CAL_TRX_SET1_SUPPORT*/ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("N9 LOG(%s): %s\n", dev_name, Data)); - } else if (event_rxd->fw_rxd_2.field.s2d_index == CR42HOST) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CR4 LOG(%s): %s\n", dev_name, Data)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("unknow MCU LOG(%s): %s", dev_name, Data)); - } -} - -#ifdef COEX_SUPPORT -static VOID ExtEventBTCoexHandler(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - UINT8 SubOpCode; - MAC_TABLE_ENTRY *pEntry; - struct _EVENT_EXT_COEXISTENCE_T *coext_event_t = - (struct _EVENT_EXT_COEXISTENCE_T *)Data; - SubOpCode = coext_event_t->ucSubOpCode; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SubOpCode: 0x%x\n", coext_event_t->ucSubOpCode)); - hex_dump("Coex Event payload ", coext_event_t->aucBuffer, Length); - - if (SubOpCode == 0x01) { - struct _EVENT_COEX_CMD_RESPONSE_T *CoexResp = - (struct _EVENT_COEX_CMD_RESPONSE_T *) - coext_event_t->aucBuffer; - CoexResp->u4Status = le2cpu32(CoexResp->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->Cmd_Resp=0x%x\n", CoexResp->u4Status)); - } else if (SubOpCode == 0x02) { - struct _EVENT_COEX_REPORT_COEX_MODE_T *CoexReportMode = - (struct _EVENT_COEX_REPORT_COEX_MODE_T *) - coext_event_t->aucBuffer; - CoexReportMode->u4SupportCoexMode = - le2cpu32(CoexReportMode->u4SupportCoexMode); - CoexReportMode->u4CurrentCoexMode = - le2cpu32(CoexReportMode->u4CurrentCoexMode); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->SupportCoexMode=0x%x\n", - CoexReportMode->u4SupportCoexMode)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->CurrentCoexMode=0x%x\n", - CoexReportMode->u4CurrentCoexMode)); - pAd->BtCoexSupportMode = - ((CoexReportMode->u4SupportCoexMode) & 0x3); - pAd->BtCoexMode = ((CoexReportMode->u4CurrentCoexMode) & 0x3); - } else if (SubOpCode == 0x03) { - struct _EVENT_COEX_MASK_OFF_TX_RATE_T *CoexMaskTxRate = - (struct _EVENT_COEX_MASK_OFF_TX_RATE_T *) - coext_event_t->aucBuffer; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->MASK_OFF_TX_RATE=0x%x\n", CoexMaskTxRate->ucOn)); - } else if (SubOpCode == 0x04) { - struct _EVENT_COEX_CHANGE_RX_BA_SIZE_T *CoexChgBaSize = - (struct _EVENT_COEX_CHANGE_RX_BA_SIZE_T *) - coext_event_t->aucBuffer; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->Change_BA_Size ucOn=%d\n", CoexChgBaSize->ucOn)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->Change_BA_Size=0x%x\n", - CoexChgBaSize->ucRXBASize)); - pEntry = &pAd->MacTab.Content[BSSID_WCID]; - - if (CoexChgBaSize->ucOn == 1) { - BA_REC_ENTRY *pBAEntry = NULL; - UCHAR Idx; - - Idx = pEntry->BARecWcidArray[0]; - pBAEntry = &pAd->BATable.BARecEntry[Idx]; - pAd->BtCoexBASize = CoexChgBaSize->ucRXBASize; - - if (pBAEntry->BAWinSize == 0) { - pBAEntry->BAWinSize = - pAd->CommonCfg.REGBACapability.field - .RxBAWinLimit; - } - - if (pAd->BtCoexBASize != 0 && - ((pAd->BtCoexBASize < pAd->CommonCfg.REGBACapability - .field.RxBAWinLimit) || - (pAd->BtCoexBASize < - pAd->CommonCfg.REGBACapability.field - .TxBAWinLimit))) { - if (pAd->BtCoexBASize < - pAd->CommonCfg.REGBACapability.field - .RxBAWinLimit) - pAd->CommonCfg.BACapability.field - .RxBAWinLimit = - pAd->BtCoexBASize; - if (pAd->BtCoexBASize < - pAd->CommonCfg.REGBACapability.field - .TxBAWinLimit) - pAd->CommonCfg.BACapability.field - .TxBAWinLimit = - pAd->BtCoexBASize; - - ba_ori_session_tear_down(pAd, BSSID_WCID, 0, - FALSE, FALSE); - ba_rec_session_tear_down(pAd, BSSID_WCID, 0, - FALSE); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("COEX: TDD mode: Set RxBASize to %d\n", - pAd->BtCoexBASize)); - } - } else { - pAd->CommonCfg.BACapability.field.RxBAWinLimit = - pAd->CommonCfg.REGBACapability.field - .RxBAWinLimit; - pAd->CommonCfg.BACapability.field.TxBAWinLimit = - pAd->CommonCfg.REGBACapability.field - .TxBAWinLimit; - - ba_ori_session_tear_down(pAd, BSSID_WCID, 0, FALSE, - FALSE); - ba_rec_session_tear_down(pAd, BSSID_WCID, 0, FALSE); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("COEX: TDD mode: Set RxBASize to %d\n", - pAd->BtCoexOriBASize)); - } - } else if (SubOpCode == 0x05) { - struct _EVENT_COEX_LIMIT_BEACON_SIZE_T *CoexLimitBeacon = - (struct _EVENT_COEX_LIMIT_BEACON_SIZE_T *) - coext_event_t->aucBuffer; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->COEX_LIMIT_BEACON_SIZE ucOn =%d\n", - CoexLimitBeacon->ucOn)); - pAd->BtCoexBeaconLimit = CoexLimitBeacon->ucOn; - } else if (SubOpCode == 0x06) { - struct _EVENT_COEX_EXTEND_BTO_ROAMING_T *CoexExtendBTORoam = - (struct _EVENT_COEX_EXTEND_BTO_ROAMING_T *) - coext_event_t->aucBuffer; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--->EVENT_COEX_EXTEND_BNCTO_ROAMING ucOn =%d\n", - CoexExtendBTORoam->ucOn)); - } -} -#endif /* COEX_SUPPORT */ - -#ifdef BCN_OFFLOAD_SUPPORT -BOOLEAN MtUpdateBcnAndTimToMcu(IN RTMP_ADAPTER *pAd, VOID *wdev_void, - IN UINT16 FrameLen, IN UCHAR UpdatePktType) -{ - BCN_BUF_STRUC *bcn_buf = NULL; -#ifdef CONFIG_AP_SUPPORT - TIM_BUF_STRUC *tim_buf = NULL; -#endif - UCHAR *buf; - INT len; - PNDIS_PACKET *pkt = NULL; - CMD_BCN_OFFLOAD_T *bcn_offload = NULL; - struct wifi_dev *wdev = (struct wifi_dev *)wdev_void; - BOOLEAN bSntReq = FALSE; - UCHAR TimIELocation = 0, CsaIELocation = 0; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - - os_alloc_mem(NULL, (PUCHAR *)&bcn_offload, sizeof(*bcn_offload)); - if (!bcn_offload) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("can not allocate bcn_offload\n")); - return FALSE; - } - os_zero_mem(bcn_offload, sizeof(*bcn_offload)); - - if (!wdev) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): wdev is NULL!\n", __func__)); - os_free_mem(bcn_offload); - return FALSE; - } - - bcn_buf = &wdev->bcn_buf; - - if (!bcn_buf) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): bcn_buf is NULL!\n", __func__)); - os_free_mem(bcn_offload); - return FALSE; - } - - if ((UpdatePktType == PKT_BCN) -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - || (UpdatePktType == PKT_V2_BCN) -#endif - ) { - pkt = bcn_buf->BeaconPkt; - bSntReq = bcn_buf->bBcnSntReq; - TimIELocation = bcn_buf->TimIELocationInBeacon; - CsaIELocation = bcn_buf->CsaIELocationInBeacon; - } - -#ifdef CONFIG_AP_SUPPORT - else { /* tim pkt case in AP mode. */ - if (pAd->OpMode == OPMODE_AP) - tim_buf = &wdev->bcn_buf.tim_buf; - - if (!tim_buf) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): tim_buf is NULL!\n", __func__)); - os_free_mem(bcn_offload); - return FALSE; - } - - pkt = tim_buf->TimPkt; - bSntReq = tim_buf->bTimSntReq; - TimIELocation = bcn_buf->TimIELocationInTim; - CsaIELocation = bcn_buf->CsaIELocationInBeacon; - } -#endif /* CONFIG_AP_SUPPORT */ - - if (pkt) { - buf = (UCHAR *)GET_OS_PKT_DATAPTR(pkt); - len = FrameLen + tx_hw_hdr_len; /* TXD & pkt content. */ - bcn_offload->ucEnable = bSntReq; - bcn_offload->ucWlanIdx = 0; /* hardcode at present */ - bcn_offload->ucOwnMacIdx = wdev->OmacIdx; - bcn_offload->ucBandIdx = HcGetBandByWdev(wdev); - bcn_offload->u2PktLength = len; - bcn_offload->ucPktType = UpdatePktType; - bcn_offload->fgNeedPretbttIntEvent = - cap->fgIsNeedPretbttIntEvent; -#ifdef CONFIG_AP_SUPPORT - bcn_offload->u2TimIePos = TimIELocation + tx_hw_hdr_len; - bcn_offload->u2CsaIePos = CsaIELocation + tx_hw_hdr_len; - bcn_offload->ucCsaCount = wdev->csa_count; -#endif - NdisCopyMemory(bcn_offload->acPktContent, buf, len); - MtCmdBcnOffloadSet(pAd, bcn_offload); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): BeaconPkt is NULL!\n", __func__)); - os_free_mem(bcn_offload); - return FALSE; - } - os_free_mem(bcn_offload); - - return TRUE; -} -#endif /*BCN_OFFLOAD*/ - -#if defined(PRETBTT_INT_EVENT_SUPPORT) || defined(BCN_OFFLOAD_SUPPORT) -static VOID ExtEventPretbttIntHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - if ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) || - (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) || - (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) - return; - - RTMP_HANDLE_PRETBTT_INT_EVENT(pAd); -} -#endif - -#ifdef THERMAL_PROTECT_SUPPORT -static VOID EventThermalProtect(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - EXT_EVENT_THERMAL_PROTECT_T *EvtThermalProtect; - UINT8 HLType; - UINT8 Reason; - struct wifi_dev *wdev; - POS_COOKIE pObj; - pObj = (POS_COOKIE)pAd->OS_Cookie; -#ifdef CONFIG_AP_SUPPORT - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; -#endif - EvtThermalProtect = (EXT_EVENT_THERMAL_PROTECT_T *)Data; - HLType = EvtThermalProtect->ucHLType; - Reason = EvtThermalProtect->ucReason; - pAd->last_thermal_pro_temp = EvtThermalProtect->cCurrentTemp; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: HLType = %d, CurrentTemp = %d, Reason = %d\n", __func__, - HLType, pAd->last_thermal_pro_temp, Reason)); - - if (Reason == THERAML_PROTECTION_REASON_RADIO) { - pAd->force_radio_off = TRUE; - /* AsicRadioOnOffCtrl(pAd, HcGetBandByWdev(wdev), WIFI_RADIO_OFF); */ - /* Set Radio off Process*/ - /* Set_RadioOn_Proc(pAd, "0"); */ - RTMP_SET_THERMAL_RADIO_OFF(pAd); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Radio Off due to too high temperature.\n")); - } -} -#endif -#ifdef CFG_TDLS_SUPPORT -static VOID ExtEventTdlsBackToBaseHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_EXT_EVENT_TDLS_STATUS_T prEventExtCmdResult = - (P_EXT_EVENT_TDLS_STATUS_T)Data; - INT chsw_fw_resp = 0; - chsw_fw_resp = prEventExtCmdResult->ucResultId; - - switch (chsw_fw_resp) { - case 1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("RX RSP_EVT_TYPE_TDLS_STAY_TIME_OUT\n")); - PCFG_TDLS_STRUCT pCfgTdls = - &pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info; - cfg_tdls_chsw_resp(pAd, pCfgTdls->CHSWPeerMacAddr, - pCfgTdls->ChSwitchTime, - pCfgTdls->ChSwitchTimeout, 0); - break; - - case 2: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("RX RSP_EVT_TYPE_TDLS_BACK_TO_BASE_CHANNEL\n")); - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.IamInOffChannel = - FALSE; - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s : unknown event type %d\n", __func__, - chsw_fw_resp)); - break; - } -} -#endif /* CFG_TDLS_SUPPORT */ - -#define MAX_MSDU_SIZE 1544 -static VOID ExtEventMaxAmsduLengthUpdate(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_EXT_EVENT_MAX_AMSDU_LENGTH_UPDATE_T len_update = - (P_EXT_EVENT_MAX_AMSDU_LENGTH_UPDATE_T)Data; - MAC_TABLE_ENTRY *mac_entry = NULL; - UINT8 wcid = len_update->ucWlanIdx; - UINT8 amsdu_len = len_update->ucAmsduLen; - - /* this is a temporary workaround to fix no amsdu at HT20 high rate */ - if (amsdu_len == 0) - amsdu_len = 1; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ExtEventMaxAmsduLengthUpdate: wlan_idx = %d,\ - amsdu_len = %d\n", - wcid, amsdu_len)); - - if (!VALID_UCAST_ENTRY_WCID(pAd, wcid)) - return; - - mac_entry = &pAd->MacTab.Content[wcid]; - - if (mac_entry->amsdu_limit_len != 0) { - mac_entry->amsdu_limit_len_adjust = - (mac_entry->amsdu_limit_len < - (MAX_MSDU_SIZE * amsdu_len) ? - mac_entry->amsdu_limit_len : - (MAX_MSDU_SIZE * amsdu_len)); - } -} - -static VOID ExtEventBaTriggerHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_CMD_BA_TRIGGER_EVENT_T prEventExtBaTrigger = - (P_CMD_BA_TRIGGER_EVENT_T)Data; - STA_TR_ENTRY *tr_entry = NULL; - MAC_TABLE_ENTRY *mac_entry = NULL; - UINT8 wcid = 0; - UINT8 tid = 0; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("RX P_CMD_BA_TRIGGER_EVENT_T: Wcid=%d, Tid=%d\n", - prEventExtBaTrigger->ucWlanIdx, prEventExtBaTrigger->ucTid)); - wcid = prEventExtBaTrigger->ucWlanIdx; - - if (!VALID_UCAST_ENTRY_WCID(pAd, wcid)) - return; - - tid = prEventExtBaTrigger->ucTid; - tr_entry = &pAd->MacTab.tr_entry[wcid]; - mac_entry = &pAd->MacTab.Content[tr_entry->wcid]; - ba_ori_session_setup(pAd, mac_entry, tid, 0, 10, FALSE); -} - -static VOID ExtEventTmrCalcuInfoHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_EXT_EVENT_TMR_CALCU_INFO_T ptmr_calcu_info; - TMR_FRM_STRUC *p_tmr_frm; - ptmr_calcu_info = (P_EXT_EVENT_TMR_CALCU_INFO_T)Data; - p_tmr_frm = (TMR_FRM_STRUC *)ptmr_calcu_info->aucTmrFrm; -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)p_tmr_frm, sizeof(TMR_FRM_STRUC)); -#endif - /*Tmr pkt comes to FW event, fw already take cares of the whole calculation.*/ - TmrReportParser(pAd, p_tmr_frm, TRUE, - le2cpu32(ptmr_calcu_info->u4TOAECalibrationResult)); -} - -static VOID ExtEventCswNotifyHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_EXT_EVENT_CSA_NOTIFY_T csa_notify_event = - (P_EXT_EVENT_CSA_NOTIFY_T)Data; - struct wifi_dev *wdev; - struct DOT11_H *pDot11h = NULL; - UCHAR Index; - struct wifi_dev *wdevEach = NULL; - - wdev = wdev_search_by_omac_idx(pAd, csa_notify_event->ucOwnMacIdx); - - if (!wdev) - return; - - wdev->csa_count = csa_notify_event->ucChannelSwitchCount; - - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) - return; - - for (Index = 0; Index < WDEV_NUM_MAX; Index++) { - wdevEach = pAd->wdev_list[Index]; - if (wdevEach == NULL) - continue; - if (wdevEach->pHObj == NULL) - continue; - if (HcGetBandByWdev(wdevEach) == HcGetBandByWdev(wdev)) { - wdevEach->csa_count = wdev->csa_count; - } - } - -#ifdef CUSTOMER_DCC_FEATURE - if (pAd->CommonCfg.channelSwitch.CHSWMode == CHANNEL_SWITCHING_MODE) { - pAd->CommonCfg.channelSwitch.CHSWCount = - pAd->CommonCfg.channelSwitch.CHSWPeriod; - ChannelSwitchingCountDownProcNew(pAd, wdev); - return; - } -#endif - - if ((HcIsRfSupport(pAd, RFIC_5GHZ)) && - (pAd->CommonCfg.bIEEE80211H == 1) && - ((pDot11h->RDMode == RD_SWITCHING_MODE) || - (pDot11h->RDMode == RD_SILENCE_MODE))) { -#ifdef CONFIG_AP_SUPPORT - pDot11h->CSCount = pDot11h->CSPeriod; - ChannelSwitchingCountDownProc(pAd, wdev); -#endif /*CONFIG_AP_SUPPORT*/ - } -} - -static VOID ExtEventBssAcQPktNumHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_EVENT_BSS_ACQ_PKT_NUM_T prEventBssAcQPktNum = - (P_EVENT_BSS_ACQ_PKT_NUM_T)Data; - UINT8 i = 0; - UINT32 sum = 0; - P_EVENT_PER_BSS_ACQ_PKT_NUM_T prPerBssInfo = NULL; -#ifdef RT_BIG_ENDIAN - prEventBssAcQPktNum->u4BssMap = le2cpu32(prEventBssAcQPktNum->u4BssMap); -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("RX ExtEventBssAcQPktNumHandler: u4BssMap=0x%08X\n", - prEventBssAcQPktNum->u4BssMap)); - - for (i = 0; (i < CR4_CFG_BSS_NUM) && - (prEventBssAcQPktNum->u4BssMap & (1 << i)); - i++) { - prPerBssInfo = &prEventBssAcQPktNum->bssPktInfo[i]; -#ifdef RT_BIG_ENDIAN - prPerBssInfo->au4AcqPktCnt[WMM_AC_BK] = - le2cpu32(prPerBssInfo->au4AcqPktCnt[WMM_AC_BK]); - prPerBssInfo->au4AcqPktCnt[WMM_AC_BE] = - le2cpu32(prPerBssInfo->au4AcqPktCnt[WMM_AC_BE]); - prPerBssInfo->au4AcqPktCnt[WMM_AC_VI] = - le2cpu32(prPerBssInfo->au4AcqPktCnt[WMM_AC_VI]); - prPerBssInfo->au4AcqPktCnt[WMM_AC_VO] = - le2cpu32(prPerBssInfo->au4AcqPktCnt[WMM_AC_VO]); -#endif - sum = prPerBssInfo->au4AcqPktCnt[WMM_AC_BK] + - prPerBssInfo->au4AcqPktCnt[WMM_AC_VI] + - prPerBssInfo->au4AcqPktCnt[WMM_AC_VO]; - - if (sum) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("BSS[%d], AC_BK = %d, AC_BE = %d, AC_VI = %d, AC_VO = %d\n", - i, prPerBssInfo->au4AcqPktCnt[WMM_AC_BK], - prPerBssInfo->au4AcqPktCnt[WMM_AC_BE], - prPerBssInfo->au4AcqPktCnt[WMM_AC_VI], - prPerBssInfo->au4AcqPktCnt[WMM_AC_VO])); - pAd->OneSecondnonBEpackets += sum; - } - } - - mt_dynamic_wmm_be_tx_op(pAd, ONE_SECOND_NON_BE_PACKETS_THRESHOLD); -} - -#ifdef CONFIG_HOTSPOT_R2 -static VOID ExtEventReprocessPktHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_CMD_PKT_REPROCESS_EVENT_T prReprocessPktEvt = - (P_CMD_PKT_REPROCESS_EVENT_T)Data; - PNDIS_PACKET pPacket = NULL; - UINT8 Type = 0; - UINT16 reprocessToken = 0; - PKT_TOKEN_CB *pktTokenCb = pAd->PktTokenCb; - PKT_TOKEN_QUEUE *listq = &pktTokenCb->tx_id_list; - - prReprocessPktEvt->u2MsduToken = - le2cpu16(prReprocessPktEvt->u2MsduToken); - reprocessToken = prReprocessPktEvt->u2MsduToken; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s - Reprocess Token ID = %d\n", __func__, reprocessToken)); - pPacket = listq->list->pkt_token[reprocessToken].pkt_buf; - - if (pPacket == NULL) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s - Unexpected Reprocessing TOKEN ID %d, pkt_buf NULL!!!!!!!\n", - __func__, reprocessToken)); - return; - } - - listq->list->pkt_token[reprocessToken].Reprocessed = TRUE; - cut_through_tx_deq(pAd->PktTokenCb, reprocessToken, &Type); - - if (hotspot_check_dhcp_arp(pAd, pPacket) == TRUE) { - USHORT Wcid = RTMP_GET_PACKET_WCID(pPacket); - MAC_TABLE_ENTRY *pMacEntry = &pAd->MacTab.Content[Wcid]; - struct wifi_dev *wdev = pMacEntry->wdev; - RTMP_SET_PACKET_DIRECT_TX(pPacket, 1); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s - Driver Direct TX\n", __func__)); - send_data_pkt(pAd, wdev, pPacket); - } else { - if (Type == TOKEN_TX_DATA) - RELEASE_NDIS_PACKET_IRQ(pAd, pPacket, - NDIS_STATUS_SUCCESS); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s - Unexpected Reprocessing Mgmt!!\n", - __func__)); - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); - } - } -} - -static VOID ExtEventGetHotspotCapabilityHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_CMD_GET_CR4_HOTSPOT_CAPABILITY_T prGetCapaEvt = - (P_CMD_GET_CR4_HOTSPOT_CAPABILITY_T)Data; - UINT8 i = 0; - - for (i = 0; i < 2; i++) { - PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[i].HotSpotCtrl; - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[i].WNMCtrl; - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("======== BSSID %d CR4 ======\n", i)); - hotspot_bssflag_dump(prGetCapaEvt->ucHotspotBssFlags[i]); - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("======== BSSID %d DRIVER ======\n", i)); - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pHSCtrl->HotSpotEnable = %d\n" - "pHSCtrl->ProxyARPEnable = %d\n" - "pHSCtrl->ASANEnable = %d\n" - "pHSCtrl->DGAFDisable = %d\n" - "pHSCtrl->QosMapEnable = %d\n", - pHSCtrl->HotSpotEnable, pWNMCtrl->ProxyARPEnable, - pHSCtrl->bASANEnable, pHSCtrl->DGAFDisable, - pHSCtrl->QosMapEnable)); - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("======== BSSID %d END======\n", i)); - } -} -#endif /* CONFIG_HOTSPOT_R2 */ - -static VOID ext_event_get_cr4_tx_statistics(RTMP_ADAPTER *pAd, UINT8 *data, - UINT32 len) -{ - P_EXT_EVENT_GET_CR4_TX_STATISTICS_T tx_statistics = - (P_EXT_EVENT_GET_CR4_TX_STATISTICS_T)data; - MAC_TABLE *table = &pAd->MacTab; - MAC_TABLE_ENTRY *entry = &table->Content[tx_statistics->wlan_index]; - entry->OneSecTxBytes = le2cpu32(tx_statistics->one_sec_tx_bytes); - entry->one_sec_tx_pkts = le2cpu32(tx_statistics->one_sec_tx_cnts); - entry->AvgTxBytes = - (entry->AvgTxBytes == 0) ? - entry->OneSecTxBytes : - ((entry->AvgTxBytes + entry->OneSecTxBytes) >> 1); - entry->avg_tx_pkts = - (entry->avg_tx_pkts == 0) ? - entry->one_sec_tx_pkts : - ((entry->avg_tx_pkts + entry->one_sec_tx_pkts) >> 1); -} - -#ifdef IGMP_TVM_SUPPORT -static VOID ext_event_get_igmp_multicast_table(RTMP_ADAPTER *pAd, UINT8 *data, - UINT32 len) -{ - P_EXT_EVENT_ID_IGMP_MULTICAST_SET_GET_T IgmpMulticastGet = - (P_EXT_EVENT_ID_IGMP_MULTICAST_SET_GET_T)data; - - if (len < sizeof(EXT_EVENT_ID_IGMP_MULTICAST_SET_GET)) { - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Cmd Event ength %u is less than required size %u\n", - __func__, len, - sizeof(EXT_EVENT_ID_IGMP_MULTICAST_SET_GET))); - return; - } - - switch (IgmpMulticastGet->ucRspType) { - case MCAST_RSP_ENTRY_TABLE: - IgmpSnoopingGetMulticastTable( - pAd, IgmpMulticastGet->ucOwnMacIdx, - &IgmpMulticastGet->RspData.McastTable); - break; - default: - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: Cmd Event ID %u is not supported\n", __func__, - IgmpMulticastGet->ucRspType)); - } -} -#endif /* IGMP_TVM_SUPPORT */ - -#ifdef CUSTOMER_RSG_FEATURE -static VOID ExtEventGetWtblTxCounter(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - EXT_EVENT_WTBL_TX_COUNTER_RESULT_T *CmdWtblTxCounterResult = - (EXT_EVENT_WTBL_TX_COUNTER_RESULT_T *)Data; - - CmdWtblTxCounterResult->u4Field = - le2cpu32(CmdWtblTxCounterResult->u4Field); - CmdWtblTxCounterResult->CurrentBWTxCount = - le2cpu32(CmdWtblTxCounterResult->CurrentBWTxCount); - CmdWtblTxCounterResult->OtherBWTxCount = - le2cpu32(CmdWtblTxCounterResult->OtherBWTxCount); - CmdWtblTxCounterResult->DataFrameRetryCnt = - le2cpu32(CmdWtblTxCounterResult->DataFrameRetryCnt); - CmdWtblTxCounterResult->MgmtRetryCnt = - le2cpu32(CmdWtblTxCounterResult->MgmtRetryCnt); - - if (CmdWtblTxCounterResult->u4Field & GET_WTBL_TX_COUNT) { - pAd->RadioStatsCounter.TotalTxCount += - CmdWtblTxCounterResult->CurrentBWTxCount + - CmdWtblTxCounterResult->OtherBWTxCount; - - pAd->RadioStatsCounter.TxDataCount += - CmdWtblTxCounterResult->CurrentBWTxCount + - CmdWtblTxCounterResult->OtherBWTxCount; - - pAd->RadioStatsCounter.TxRetriedPktCount += - CmdWtblTxCounterResult->DataFrameRetryCnt + - CmdWtblTxCounterResult->MgmtRetryCnt; - } -#ifdef CUSTOMER_DCC_FEATURE - if (CmdWtblTxCounterResult->u4Field & GET_WTBL_PER_STA_TX_COUNT) { - UINT32 WcidIdx; - PMAC_TABLE_ENTRY pEntry = NULL; - for (WcidIdx = 0; WcidIdx < MAX_LEN_OF_MAC_TABLE; WcidIdx++) { - pEntry = &pAd->MacTab.Content[WcidIdx]; - if (pEntry && IS_ENTRY_CLIENT(pEntry) && - pEntry->Sst == SST_ASSOC) { - CmdWtblTxCounterResult - ->PerStaRetriedPktCnt[WcidIdx] = le2cpu32( - CmdWtblTxCounterResult - ->PerStaRetriedPktCnt[WcidIdx]); - pEntry->TxRetriedPktCount += - CmdWtblTxCounterResult - ->PerStaRetriedPktCnt[WcidIdx]; - pEntry->pMbss->TxRetriedPktCount += - CmdWtblTxCounterResult - ->PerStaRetriedPktCnt[WcidIdx]; - } - } - } -#endif -} -#endif -#ifdef CONFIG_MAP_SUPPORT -static UINT8 findNextCmdWcidIdx(RTMP_ADAPTER *pAd, UINT_8 EventWcidStart) -{ - UINT8 NextEventWcidStart, TotalValidWcid = 0; - - TotalValidWcid = pAd->ApCfg.EntryClientCount; - if (TotalValidWcid < (EventWcidStart + CFG_STA_REC_NUM_PER_EVENT)) { - NextEventWcidStart = 1; - } else { - NextEventWcidStart = - (EventWcidStart + CFG_STA_REC_NUM_PER_EVENT); - } - - return NextEventWcidStart; -} -static VOID ExtEventGetStaTxRate(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_TX_RATE_RESULT_T prEventExtCmdResult = - (P_EXT_EVENT_TX_RATE_RESULT_T)Data; - HTTRANSMIT_SETTING LastTxRate; - PMAC_TABLE_ENTRY pEntry = NULL; - UINT32 Idx; -#ifdef MAP_R2 - UINT32 k; -#endif - pAd->get_all_sta_rate_wcid_idx = findNextCmdWcidIdx( - pAd, prEventExtCmdResult->rAllTxRateResult[0].ucWlanIdx); - for (Idx = 0; Idx < prEventExtCmdResult->ucStaNum; Idx++) { - pEntry = &pAd->MacTab.Content[prEventExtCmdResult - ->rAllTxRateResult[Idx] - .ucWlanIdx]; - if (pEntry && pEntry->wdev && IS_ENTRY_CLIENT(pEntry) && - pEntry->Sst == SST_ASSOC) { - LastTxRate.field.MODE = - prEventExtCmdResult->rAllTxRateResult[Idx] - .rEntryTxRate.MODE; - LastTxRate.field.BW = - prEventExtCmdResult->rAllTxRateResult[Idx] - .rEntryTxRate.BW; - LastTxRate.field.ldpc = - prEventExtCmdResult->rAllTxRateResult[Idx] - .rEntryTxRate.ldpc ? - 1 : - 0; - LastTxRate.field.ShortGI = - prEventExtCmdResult->rAllTxRateResult[Idx] - .rEntryTxRate.ShortGI ? - 1 : - 0; - LastTxRate.field.STBC = - prEventExtCmdResult->rAllTxRateResult[Idx] - .rEntryTxRate.STBC; - if (LastTxRate.field.MODE == MODE_VHT) { - LastTxRate.field.MCS = - (((prEventExtCmdResult - ->rAllTxRateResult[Idx] - .rEntryTxRate.VhtNss - - 1) & - 0x3) - << 4) + - prEventExtCmdResult - ->rAllTxRateResult[Idx] - .rEntryTxRate.MCS; - } else if (LastTxRate.field.MODE == MODE_OFDM) { - LastTxRate.field.MCS = - getLegacyOFDMMCSIndex( - prEventExtCmdResult - ->rAllTxRateResult[Idx] - .rEntryTxRate.MCS) & - 0x0000003F; - } else { - LastTxRate.field.MCS = - prEventExtCmdResult - ->rAllTxRateResult[Idx] - .rEntryTxRate.MCS; - } - pEntry->LastTxRate = (UINT32)LastTxRate.word; -#ifdef MAP_R2 - for (k = 0; k < 4; k++) { - pEntry->TxRxTime[k][0] = - prEventExtCmdResult - ->rAllTxRateResult[Idx] - .txRxAdmInfo.arTxAdmInfo[k] - .u4ACTxBytes; - pEntry->TxRxTime[k][1] = - prEventExtCmdResult - ->rAllTxRateResult[Idx] - .txRxAdmInfo.arTxAdmInfo[k] - .u4ACTxTime; - } -#endif - } - } -} -#endif - -#if defined(TXRX_STAT_SUPPORT) || defined(EAP_STATS_SUPPORT) -static VOID ExtEventGetStaTxStat(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - EXT_EVENT_STA_TX_STAT_RESULT_T *CmdStaTxStatResult = - (EXT_EVENT_STA_TX_STAT_RESULT_T *)Data; - UINT32 WcidIdx; -#ifndef EAP_STATS_SUPPORT - UINT32 i, band_idx; - struct hdev_ctrl *ctrl = (struct hdev_ctrl *)pAd->hdev_ctrl; -#endif /* EAP_STATS_SUPPORT */ - PMAC_TABLE_ENTRY pEntry = NULL; - -#ifndef EAP_STATS_SUPPORT - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - pAd->ApCfg.MBSSID[i].stat_bss.Last1TxCnt = 0; - pAd->ApCfg.MBSSID[i].stat_bss.Last1TxFailCnt = 0; - } - for (i = 0; i < DBDC_BAND_NUM; i++) { - ctrl->rdev[i].pRadioCtrl->Last1TxCnt = 0; - ctrl->rdev[i].pRadioCtrl->Last1TxFailCnt = 0; - } - for (WcidIdx = 0; WcidIdx < MAX_LEN_OF_MAC_TABLE; WcidIdx++) { - pEntry = &pAd->MacTab.Content[WcidIdx]; - if (pEntry && pEntry->wdev && IS_ENTRY_CLIENT(pEntry) && - pEntry->Sst == SST_ASSOC) { - pEntry->LastOneSecPER = 0; - } - } -#endif /* EAP_STATS_SUPPORT */ - for (WcidIdx = 0; WcidIdx < MAX_LEN_OF_MAC_TABLE; WcidIdx++) { - pEntry = &pAd->MacTab.Content[WcidIdx]; - if (pEntry && pEntry->wdev && IS_ENTRY_CLIENT(pEntry) && - pEntry->Sst == SST_ASSOC) { -#ifndef EAP_STATS_SUPPORT - band_idx = HcGetBandByWdev(pEntry->wdev); -#endif /* EAP_STATS_SUPPORT */ - CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx] = le2cpu32( - CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx]); - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx] = - le2cpu32(CmdStaTxStatResult - ->PerStaTxFailPktCnt[WcidIdx]); -#ifdef EAP_STATS_SUPPORT - pEntry->mpdu_attempts.QuadPart += - CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx]; - pEntry->mpdu_retries.QuadPart += - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]; - pEntry->mpdu_low_rate_fail_cnt.QuadPart += - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]; -#endif /* EAP_STATS_SUPPORT */ - -#ifndef EAP_STATS_SUPPORT - pEntry->LastOneSecTxTotalCountByWtbl = - CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx]; - pEntry->LastOneSecTxFailCountByWtbl = - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]; - pEntry->TxSuccessByWtbl += - CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx] - - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]; - ctrl->rdev[band_idx].pRadioCtrl->TotalTxCnt += - CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx]; - ctrl->rdev[band_idx].pRadioCtrl->TotalTxFailCnt += - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]; - - if (ctrl->rdev[band_idx].pRadioCtrl->TotalTxCnt && - ctrl->rdev[band_idx].pRadioCtrl->TotalTxFailCnt) - ctrl->rdev[band_idx].pRadioCtrl->TotalPER = - ((100 * (ctrl->rdev[band_idx] - .pRadioCtrl - ->TotalTxFailCnt)) / - ctrl->rdev[band_idx] - .pRadioCtrl->TotalTxCnt); - ctrl->rdev[band_idx].pRadioCtrl->Last1TxCnt += - CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx]; - ctrl->rdev[band_idx].pRadioCtrl->Last1TxFailCnt += - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]; - pEntry->pMbss->stat_bss.Last1TxCnt += - CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx]; - pEntry->pMbss->stat_bss.Last1TxFailCnt += - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]; - pEntry->pMbss->stat_bss.TxRetriedPacketCount.QuadPart += - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]; - /*PER in percentage*/ - if (CmdStaTxStatResult->PerStaTxPktCnt[WcidIdx] && - CmdStaTxStatResult->PerStaTxFailPktCnt[WcidIdx]) { - pEntry->LastOneSecPER = - ((100 * - (CmdStaTxStatResult->PerStaTxFailPktCnt - [WcidIdx])) / - CmdStaTxStatResult - ->PerStaTxPktCnt[WcidIdx]); - } -#endif /* EAP_STATS_SUPPORT */ - } - } -} -#endif -static BOOLEAN IsUnsolicitedEvent(EVENT_RXD *event_rxd) -{ - if ((GET_EVENT_FW_RXD_SEQ_NUM(event_rxd) == 0) || - (GET_EVENT_FW_RXD_EXT_EID(event_rxd) == EXT_EVENT_FW_LOG_2_HOST) || - (GET_EVENT_FW_RXD_EXT_EID(event_rxd) == - EXT_EVENT_THERMAL_PROTECT) || - (GET_EVENT_FW_RXD_EXT_EID(event_rxd) == EXT_EVENT_ID_ASSERT_DUMP) || - (GET_EVENT_FW_RXD_EXT_EID(event_rxd) == EXT_EVENT_ID_PS_SYNC)) - return TRUE; - - return FALSE; -} - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) -static INT ExtEventPreCalStoreProc(RTMP_ADAPTER *pAd, UINT32 EventId, - UINT8 *Data) -{ - UINT32 Offset = 0, IDOffset = 0, LenOffset = 0, HeaderSize = 0, - CalDataSize = 0, BitMap = 0; - UINT32 i, Length, TotalSize, ChGroupId = 0; - UINT16 DoPreCal = 0; - static int rf_count; - int rf_countMax; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[41m %s ------------> \x1b[m\n", __FUNCTION__)); - rf_countMax = pAd->ChGrpMap == 0x1FF ? 9 : 6; - - switch (EventId) { - case PRECAL_TXLPF: { - TXLPF_CAL_INFO_T *prTxLPFGetEvent = (TXLPF_CAL_INFO_T *)Data; - /* Store header */ - HeaderSize = (UINT32)(uintptr_t) & - ((TXLPF_CAL_INFO_T *)NULL)->au4Data[0]; - /* Update Cal data size */ - CalDataSize = TXLPF_PER_GROUP_DATA_SIZE; - /* Update channel group BitMap */ - prTxLPFGetEvent->u2BitMap = le2cpu16(prTxLPFGetEvent->u2BitMap); - BitMap = prTxLPFGetEvent->u2BitMap; - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM; i++) - prTxLPFGetEvent->au4Data[i] = - le2cpu32(prTxLPFGetEvent->au4Data[i]); - } break; - - case PRECAL_TXIQ: { - TXIQ_CAL_INFO_T *prTxIQGetEvent = (TXIQ_CAL_INFO_T *)Data; - /* Store header */ - HeaderSize = (UINT32)(uintptr_t) & - ((TXIQ_CAL_INFO_T *)NULL)->au4Data[0]; - /* Update Cal data size */ - CalDataSize = TXIQ_PER_GROUP_DATA_SIZE; - /* Update channel group BitMap */ - prTxIQGetEvent->u2BitMap = le2cpu16(prTxIQGetEvent->u2BitMap); - BitMap = prTxIQGetEvent->u2BitMap; - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 6; i++) - prTxIQGetEvent->au4Data[i] = - le2cpu32(prTxIQGetEvent->au4Data[i]); - } break; - - case PRECAL_TXDC: { - TXDC_CAL_INFO_T *prTxDCGetEvent = (TXDC_CAL_INFO_T *)Data; - /* Store header */ - HeaderSize = (UINT32)(uintptr_t) & - ((TXDC_CAL_INFO_T *)NULL)->au4Data[0]; - /* Update Cal data size */ - CalDataSize = TXDC_PER_GROUP_DATA_SIZE; - /* Update channel group BitMap */ - prTxDCGetEvent->u2BitMap = le2cpu16(prTxDCGetEvent->u2BitMap); - BitMap = prTxDCGetEvent->u2BitMap; - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 6; i++) - prTxDCGetEvent->au4Data[i] = - le2cpu32(prTxDCGetEvent->au4Data[i]); - } break; - - case PRECAL_RXFI: { - RXFI_CAL_INFO_T *prRxFIGetEvent = (RXFI_CAL_INFO_T *)Data; - /* Store header */ - HeaderSize = (UINT32)(uintptr_t) & - ((RXFI_CAL_INFO_T *)NULL)->au4Data[0]; - /* Update Cal data size */ - CalDataSize = RXFI_PER_GROUP_DATA_SIZE; - /* Update channel group BitMap */ - prRxFIGetEvent->u2BitMap = le2cpu16(prRxFIGetEvent->u2BitMap); - BitMap = prRxFIGetEvent->u2BitMap; - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 4; i++) - prRxFIGetEvent->au4Data[i] = - le2cpu32(prRxFIGetEvent->au4Data[i]); - } break; - - case PRECAL_RXFD: { - RXFD_CAL_INFO_T *prRxFDGetEvent = (RXFD_CAL_INFO_T *)Data; - /* Store header */ - HeaderSize = (UINT32)(uintptr_t) & - ((RXFD_CAL_INFO_T *)NULL)->au4Data[0]; - /* Update Cal data size */ - CalDataSize = RXFD_PER_GROUP_DATA_SIZE; - /* Update channel group BitMap */ - prRxFDGetEvent->u2BitMap = le2cpu16(prRxFDGetEvent->u2BitMap); - BitMap = prRxFDGetEvent->u2BitMap; - /* Update group ID */ - prRxFDGetEvent->u4ChGroupId = - le2cpu32(prRxFDGetEvent->u4ChGroupId); - ChGroupId = prRxFDGetEvent->u4ChGroupId; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[33m%s: RXFD ChGroupId %d\x1b[m\n", __FUNCTION__, - ChGroupId)); - for (i = 0; i < (SCN_NUM * RX_SWAGC_LNA_NUM) + - (SCN_NUM * RX_FDIQ_LPF_GAIN_NUM * - RX_FDIQ_TABLE_SIZE * 3); - i++) - prRxFDGetEvent->au4Data[i] = - le2cpu32(prRxFDGetEvent->au4Data[i]); - } break; - - default: - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[41m %s: Not support this calibration item !!!! \x1b[m\n", - __FUNCTION__)); - break; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[33m%s: EventID = %d, Bitmp = %x\x1b[m\n", __FUNCTION__, - EventId, BitMap)); - /* Update offset parameter */ - IDOffset = LenOffset = Offset = pAd->PreCalWriteOffSet; - LenOffset += 4; /*Skip ID field*/ - Offset += 8; /*Skip (ID + Len) field*/ - - if (pAd->PreCalStoreBuffer != NULL) { - /* Store ID */ - os_move_mem(pAd->PreCalStoreBuffer + IDOffset, &EventId, - sizeof(EventId)); - /* Store header */ - os_move_mem(pAd->PreCalStoreBuffer + Offset, Data, - (ULONG)HeaderSize); - Offset += HeaderSize; /*Skip header*/ - Data += HeaderSize; /*Skip header*/ - - /* Store pre-cal data */ - if (EventId == PRECAL_RXFD) { - if ((rf_count < rf_countMax) && - (BitMap & (1 << ChGroupId))) { - rf_count++; - os_move_mem(pAd->PreCalStoreBuffer + Offset, - Data, CalDataSize); - Offset += CalDataSize; - } - } else { - int count = 0; - int countMax = pAd->ChGrpMap == 0x1FF ? 8 : 5; - - for (i = 0; i < CHANNEL_GROUP_NUM; i++) { - if (count > countMax) - break; - - if (BitMap & (1 << i)) { - count++; - os_move_mem(pAd->PreCalStoreBuffer + - Offset, - Data + i * CalDataSize, - CalDataSize); - Offset += CalDataSize; - } - } - } - - /* Update current temp buffer write-offset */ - pAd->PreCalWriteOffSet = Offset; - /* Calculate buffer size (len + header + data) for each calibration item */ - Length = Offset - LenOffset; - /* Store buffer size for each calibration item */ - os_move_mem(pAd->PreCalStoreBuffer + LenOffset, &Length, - sizeof(Length)); - - /* The last event ID - update calibration data to flash */ - if (EventId == PRECAL_RXFI) { - TotalSize = pAd->PreCalWriteOffSet; -#ifdef RTMP_FLASH_SUPPORT - /* Write pre-cal data to flash */ - if (pAd->E2pAccessMode == E2P_FLASH_MODE) - RtmpFlashWrite(pAd->hdev_ctrl, - pAd->PreCalStoreBuffer, - get_dev_eeprom_offset(pAd) + - PRECALPART_OFFSET, - TotalSize); -#endif /* RTMP_FLASH_SUPPORT */ - if (pAd->E2pAccessMode == E2P_BIN_MODE) - rtmp_cal_write_to_bin(pAd, - pAd->PreCalStoreBuffer, - PRECALPART_OFFSET, - TotalSize); - - /* Raise DoPreCal bits */ - if (pAd->E2pAccessMode == E2P_FLASH_MODE || - pAd->E2pAccessMode == E2P_BIN_MODE) { - RT28xx_EEPROM_READ16(pAd, 0x52, DoPreCal); - DoPreCal |= (1 << 2); - RT28xx_EEPROM_WRITE16(pAd, 0x52, DoPreCal); - } - - /* Reset parameter */ - pAd->PreCalWriteOffSet = 0; - rf_count = 0; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[41m %s: Pre-calibration done !! \x1b[m\n", - __FUNCTION__)); - } - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[41m %s: PreCalStoreBuffer is NULL !! \x1b[m\n", - __FUNCTION__)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[41m %s <------------ \x1b[m\n", __FUNCTION__)); - return TRUE; -} - -NTSTATUS PreCalTxLPFStoreProcHandler(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt) -{ - ExtEventPreCalStoreProc(pAd, PRECAL_TXLPF, CMDQelmt->buffer); - return 0; -} - -NTSTATUS PreCalTxIQStoreProcHandler(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt) -{ - ExtEventPreCalStoreProc(pAd, PRECAL_TXIQ, CMDQelmt->buffer); - return 0; -} - -NTSTATUS PreCalTxDCStoreProcHandler(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt) -{ - ExtEventPreCalStoreProc(pAd, PRECAL_TXDC, CMDQelmt->buffer); - return 0; -} - -NTSTATUS PreCalRxFIStoreProcHandler(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt) -{ - ExtEventPreCalStoreProc(pAd, PRECAL_RXFI, CMDQelmt->buffer); - return 0; -} - -NTSTATUS PreCalRxFDStoreProcHandler(PRTMP_ADAPTER pAd, PCmdQElmt CMDQelmt) -{ - ExtEventPreCalStoreProc(pAd, PRECAL_RXFD, CMDQelmt->buffer); - return 0; -} -static VOID ExtEventTxLPFCalInfoHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - hex_dump("P_TXLPF_CAL_INFO", Data, Length); - - if (RLM_PRECAL_TXLPF_TO_FLASH_CHECK(Data)) { - /* Store pre-cal data to flash */ - RTEnqueueInternalCmd(pAd, CMDTHRED_PRECAL_TXLPF, (VOID *)Data, - Length); - } else { - RlmCalCacheTxLpfInfo(pAd->rlmCalCache, Data, Length); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[42m%s: Not store to flash !! \x1b[m\n", - __FUNCTION__)); - } - - return; -}; - -static VOID ExtEventTxIQCalInfoHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - hex_dump("P_TXIQ_CAL_INFO", Data, Length); - - if (RLM_PRECAL_TXIQ_TO_FLASH_CHECK(Data)) { - /* Store pre-cal data to flash */ - RTEnqueueInternalCmd(pAd, CMDTHRED_PRECAL_TXIQ, (VOID *)Data, - Length); - } else { - RlmCalCacheTxIqInfo(pAd->rlmCalCache, Data, Length); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[42m%s: Not store to flash !! \x1b[m\n", - __FUNCTION__)); - } - - return; -}; - -static VOID ExtEventTxDCCalInfoHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - hex_dump("P_TXDC_CAL_INFO", Data, Length); - - if (RLM_PRECAL_TXDC_TO_FLASH_CHECK(Data)) { - /* Store pre-cal data to flash */ - RTEnqueueInternalCmd(pAd, CMDTHRED_PRECAL_TXDC, (VOID *)Data, - Length); - } else { - RlmCalCacheTxDcInfo(pAd->rlmCalCache, Data, Length); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[42m%s: Not store to flash !! \x1b[m\n", - __FUNCTION__)); - } - - return; -}; - -static VOID ExtEventRxFICalInfoHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - hex_dump("P_RXFI_CAL_INFO", Data, Length); - - if (RLM_PRECAL_RXFI_TO_FLASH_CHECK(Data)) { - /* Store pre-cal data to flash */ - RTEnqueueInternalCmd(pAd, CMDTHRED_PRECAL_RXFI, (VOID *)Data, - Length); - } else { - RlmCalCacheRxFiInfo(pAd->rlmCalCache, Data, Length); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[42m%s: Not store to flash !! \x1b[m\n", - __FUNCTION__)); - } - - return; -}; - -static VOID ExtEventRxFDCalInfoHandler(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - hex_dump("P_RXFD_CAL_INFO", Data, Length); - - if (RLM_PRECAL_RXFD_TO_FLASH_CHECK(Data)) { - /* Store pre-cal data to flash */ - RTEnqueueInternalCmd(pAd, CMDTHRED_PRECAL_RXFD, (VOID *)Data, - Length); - } else { - RlmCalCacheRxFdInfo(pAd->rlmCalCache, Data, Length); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[42m%s: Not store to flash !! \x1b[m\n", - __FUNCTION__)); - } - - return; -}; -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT -static VOID event_get_tx_statistic_handle(struct _RTMP_ADAPTER *pAd, - UINT8 *data, UINT32 Length) -{ - struct _EXT_EVENT_TX_STATISTIC_RESULT_T *event = - (struct _EXT_EVENT_TX_STATISTIC_RESULT_T *)data; - UCHAR wcid = event->ucWlanIdx; - struct _MAC_TABLE_ENTRY *entry; - struct _STA_TR_ENTRY *tr_entry; - UINT32 tx_success; - - if (!VALID_UCAST_ENTRY_WCID(pAd, wcid)) - return; - - entry = &pAd->MacTab.Content[wcid]; - - if (IS_ENTRY_NONE(entry)) - return; - - tr_entry = &pAd->MacTab.tr_entry[entry->tr_tb_idx]; - - if (tr_entry->StaRec.ConnectionState != STATE_PORT_SECURE) - return; - - if (entry->TxStatRspCnt) { - tx_success = event->u4EntryTxCount - event->u4EntryTxFailCount; - entry->TotalTxSuccessCnt += tx_success; - entry->one_sec_tx_succ_pkts = tx_success; - } - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): wcid(%d), TotalTxCnt(%u) - TotalTxFail(%u) = %u (%s)\n", - __func__, wcid, event->u4EntryTxCount, - event->u4EntryTxFailCount, entry->TotalTxSuccessCnt, - (entry->TxStatRspCnt) ? "Valid" : "Invalid")); - entry->TxStatRspCnt++; -} -#endif /*RACTRL_FW_OFFLOAD_SUPPORT*/ - -static VOID EventExtEventHandler(RTMP_ADAPTER *pAd, UINT8 ExtEID, UINT8 *Data, - UINT32 Length, EVENT_RXD *event_rxd) -{ - switch (ExtEID) { - case EXT_EVENT_CMD_RESULT: - EventExtCmdResult(NULL, Data, Length); - break; - - case EXT_EVENT_ID_PS_SYNC: - ExtEventPsSyncHandler(pAd, Data, Length); - break; - - case EXT_EVENT_FW_LOG_2_HOST: - ExtEventFwLog2HostHandler(pAd, Data, Length, event_rxd); - break; -#ifdef COEX_SUPPORT - - case EXT_EVENT_BT_COEX: - ExtEventBTCoexHandler(pAd, Data, Length); - break; -#endif /* COEX_SUPPORT */ -#ifdef THERMAL_PROTECT_SUPPORT - - case EXT_EVENT_THERMAL_PROTECT: - EventThermalProtect(pAd, Data, Length); - break; -#endif -#if defined(PRETBTT_INT_EVENT_SUPPORT) || defined(BCN_OFFLOAD_SUPPORT) - - case EXT_EVENT_PRETBTT_INT: - ExtEventPretbttIntHandler(pAd, Data, Length); - break; -#endif /*PRETBTT_INT_EVENT_SUPPORT*/ - - case EXT_EVENT_BEACON_LOSS: - ExtEventBeaconLostHandler(pAd, Data, Length); - break; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - - case EXT_EVENT_RA_THROUGHPUT_BURST: - ExtEventThroughputBurst(pAd, Data, Length); - break; - - case EXT_EVENT_G_BAND_256QAM_PROBE_RESULT: - ExtEventGBand256QamProbeResule(pAd, Data, Length); - break; -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - - case EXT_EVENT_ID_ASSERT_DUMP: - ExtEventAssertDumpHandler(pAd, Data, Length, event_rxd); - break; -#ifdef CFG_TDLS_SUPPORT - - case EXT_EVENT_TDLS_STATUS: - ExtEventTdlsBackToBaseHandler(pAd, Data, Length); - break; -#endif -#if defined(MT_MAC) && defined(TXBF_SUPPORT) - - case EXT_EVENT_ID_BF_STATUS_READ: - /* ExtEventFwLog2HostHandler(pAd, Data, Length); */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EXT_EVENT_ID_BF_STATUS_READ\n", __func__)); - ExtEventBfStatusRead(pAd, Data, Length); - break; -#endif /* MT_MAC && TXBF_SUPPORT */ -#ifdef CONFIG_ATE - - case EXT_EVENT_ID_RF_TEST: - MT_ATERFTestCB(pAd, Data, Length); - break; -#endif -#ifdef MT_DFS_SUPPORT - - case EXT_EVENT_ID_RDD_REPORT: - ExtEventRddReportHandler(pAd, Data, Length); - break; -#endif - - case EXT_EVENT_ID_MAX_AMSDU_LENGTH_UPDATE: - ExtEventMaxAmsduLengthUpdate(pAd, Data, Length); - break; - - case EXT_EVENT_ID_BA_TRIGGER: - ExtEventBaTriggerHandler(pAd, Data, Length); - break; - -#ifdef WIFI_SPECTRUM_SUPPORT - case EXT_EVENT_ID_WIFI_SPECTRUM: - ExtEventWifiSpectrumHandler(pAd, Data, Length); - break; -#endif /* WIFI_SPECTRUM_SUPPORT */ - - case EXT_EVENT_CSA_NOTIFY: - ExtEventCswNotifyHandler(pAd, Data, Length); - break; - - case EXT_EVENT_TMR_CALCU_INFO: - ExtEventTmrCalcuInfoHandler(pAd, Data, Length); - break; - - case EXT_EVENT_ID_BSS_ACQ_PKT_NUM: - ExtEventBssAcQPktNumHandler(pAd, Data, Length); - break; -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) - - case EXT_EVENT_ID_TXLPF_CAL_INFO: - ExtEventTxLPFCalInfoHandler(pAd, Data, Length); - break; - - case EXT_EVENT_ID_TXIQ_CAL_INFO: - ExtEventTxIQCalInfoHandler(pAd, Data, Length); - break; - - case EXT_EVENT_ID_TXDC_CAL_INFO: - ExtEventTxDCCalInfoHandler(pAd, Data, Length); - break; - - case EXT_EVENT_ID_RXFI_CAL_INFO: - ExtEventRxFICalInfoHandler(pAd, Data, Length); - break; - - case EXT_EVENT_ID_RXFD_CAL_INFO: - ExtEventRxFDCalInfoHandler(pAd, Data, Length); - break; -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - - case EXT_EVENT_ID_TX_POWER_FEATURE_CTRL: - EventTxPowerHandler(pAd, Data, Length); - break; -#ifdef CONFIG_HOTSPOT_R2 - - case EXT_EVENT_ID_INFORM_HOST_REPROCESS_PKT: - ExtEventReprocessPktHandler(pAd, Data, Length); - break; - - case EXT_EVENT_ID_GET_CR4_HOTSPOT_CAPABILITY: - ExtEventGetHotspotCapabilityHandler(pAd, Data, Length); - break; -#endif /* CONFIG_HOTSPOT_R2 */ -#if defined(RED_SUPPORT) && (defined(MT7622) || defined(P18) || \ - defined(MT7663) || defined(MT7615)) - - case EXT_EVENT_ID_MPDU_TIME_UPDATE: - ExtEventMpduTimeHandler(pAd, Data, Length); - break; -#endif /* defined(RED_SUPPORT) && (defined(MT7622) || defined(P18) || defined(MT7663)) */ - - case EXT_EVENT_GET_CR4_TX_STATISTICS: - ext_event_get_cr4_tx_statistics(pAd, Data, Length); - break; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - case EXT_EVENT_GET_TX_STATISTIC: - event_get_tx_statistic_handle(pAd, Data, Length); - break; -#endif /*RACTRL_FW_OFFLOAD_SUPPORT*/ -#ifdef CUSTOMER_RSG_FEATURE - case EXT_EVENT_ID_GET_WTBL_TX_COUNTER: - ExtEventGetWtblTxCounter(pAd, Data, Length); - break; -#endif - -#if defined(TXRX_STAT_SUPPORT) || defined(EAP_STATS_SUPPORT) - case EXT_EVENT_ID_GET_STA_TX_STAT: - ExtEventGetStaTxStat(pAd, Data, Length); - break; -#endif -#ifdef CONFIG_MAP_SUPPORT - case EXT_EVENT_ID_GET_TX_RATE: - ExtEventGetStaTxRate(pAd, Data, Length); - break; -#endif - -#ifdef IGMP_TVM_SUPPORT - case EXT_EVENT_ID_IGMP_MULTICAST_RESP: - ext_event_get_igmp_multicast_table(pAd, Data, Length); - break; -#endif /* IGMP_TVM_SUPPORT */ - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Unknown Ext Event(%x)\n", __func__, ExtEID)); - break; - } -} - -static VOID EventExtGenericEventHandler(UINT8 *Data) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - - if (EventExtCmdResult->u4Status == CMD_RESULT_SUCCESS) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: CMD Success\n", __func__)); - } else if (EventExtCmdResult->u4Status == CMD_RESULT_NONSUPPORT) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: CMD Non-Support\n", __func__)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: CMD Fail!, EventExtCmdResult.u4Status = 0x%x\n", - __func__, EventExtCmdResult->u4Status)); - } -} - -static VOID EventGenericEventHandler(UINT8 *Data) -{ - struct _INIT_EVENT_CMD_RESULT *EventCmdResult = - (struct _INIT_EVENT_CMD_RESULT *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventCmdResult.ucCID = 0x%x\n", __func__, - EventCmdResult->ucCID)); - - if (EventCmdResult->ucStatus == CMD_RESULT_SUCCESS) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: CMD Success\n", __func__)); - } else if (EventCmdResult->ucStatus == CMD_RESULT_NONSUPPORT) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: CMD Non-Support\n", __func__)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: CMD Fail!, EventCmdResult.ucStatus = 0x%x\n", - __func__, EventCmdResult->ucStatus)); - } -} - -static VOID GenericEventHandler(UINT8 EID, UINT8 ExtEID, UINT8 *Data) -{ - switch (EID) { - case EXT_EVENT: - EventExtGenericEventHandler(Data); - break; - - case GENERIC_EVENT: - EventGenericEventHandler(Data); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Unknown Event(%x)\n", __func__, EID)); - break; - } -} - -static VOID UnsolicitedEventHandler(RTMP_ADAPTER *pAd, UINT8 EID, UINT8 ExtEID, - UINT8 *Data, UINT32 Length, - EVENT_RXD *event_rxd) -{ - switch (EID) { - case EVENT_CH_PRIVILEGE: - EventChPrivilegeHandler(pAd, Data, Length); - break; - - case EXT_EVENT: - EventExtEventHandler(pAd, ExtEID, Data, Length, event_rxd); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Unknown Event(%x)\n", __func__, EID)); - break; - } -} - -static BOOLEAN IsRspLenVariableAndMatchSpecificMinLen(EVENT_RXD *event_rxd, - struct cmd_msg *msg) -{ - if ((msg->attr.ctrl.expect_size <= - GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd)) && - (msg->attr.ctrl.expect_size != 0) && - IS_CMD_MSG_LEN_VAR_FLAG_SET(msg)) - return TRUE; - else - return FALSE; -} - -static BOOLEAN IsRspLenNonZeroAndMatchExpected(EVENT_RXD *event_rxd, - struct cmd_msg *msg) -{ - if ((msg->attr.ctrl.expect_size == - GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd)) && - (msg->attr.ctrl.expect_size != 0)) - return TRUE; - else - return FALSE; -} - -static VOID HandlSeq0AndOtherUnsolicitedEvents(RTMP_ADAPTER *pAd, - EVENT_RXD *event_rxd, - PNDIS_PACKET net_pkt) -{ - UnsolicitedEventHandler(pAd, GET_EVENT_FW_RXD_EID(event_rxd), - GET_EVENT_FW_RXD_EXT_EID(event_rxd), - GET_EVENT_HDR_ADDR(net_pkt), - GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd), - event_rxd); -} - -static void CompleteWaitCmdMsgOrFreeCmdMsg(struct cmd_msg *msg) -{ - if (IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg)) - RTMP_OS_COMPLETE(&msg->ack_done); - else { - DlListDel(&msg->list); - AndesFreeCmdMsg(msg); - } -} - -static void FillRspPayloadLenAndDumpExpectLenAndRspLenInfo(EVENT_RXD *event_rxd, - struct cmd_msg *msg) -{ - /* Error occurs!!! dump info for debugging */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("expect response len(%d), command response len(%zd) invalid\n", - msg->attr.ctrl.expect_size, - GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd))); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:cmd_type = 0x%x, ext_cmd_type = 0x%x, FW_RXD_EXT_EID = 0x%x\n", - __func__, msg->attr.type, msg->attr.ext_type, - GET_EVENT_FW_RXD_EXT_EID(event_rxd))); - msg->attr.ctrl.expect_size = - GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd); -} - -static VOID HandleLayer1GenericEvent(UINT8 EID, UINT8 ExtEID, UINT8 *Data) -{ - GenericEventHandler(EID, ExtEID, Data); -} - -static void CallEventHookHandlerOrDumpErrorMsg(EVENT_RXD *event_rxd, - struct cmd_msg *msg, - PNDIS_PACKET net_pkt) -{ - if (msg->attr.rsp.handler == NULL) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): rsp_handler is NULL!!!!(cmd_type = 0x%x, ext_cmd_type = 0x%x, FW_RXD_EXT_EID = 0x%x)\n", - __func__, msg->attr.type, msg->attr.ext_type, - GET_EVENT_FW_RXD_EXT_EID(event_rxd))); - - if (GET_EVENT_FW_RXD_EXT_EID(event_rxd) == 0) { - HandleLayer1GenericEvent( - GET_EVENT_FW_RXD_EID(event_rxd), - GET_EVENT_FW_RXD_EXT_EID(event_rxd), - GET_EVENT_HDR_ADDR(net_pkt)); - } - } else { - msg->attr.rsp.handler( - msg, GET_EVENT_HDR_ADDR(net_pkt), - GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd)); - } -} - -static void FwDebugPurposeHandler(EVENT_RXD *event_rxd, struct cmd_msg *msg, - PNDIS_PACKET net_pkt) -{ - /* hanle FW debug purpose only */ - CallEventHookHandlerOrDumpErrorMsg(event_rxd, msg, net_pkt); -} - -static VOID HandleNormalLayer1Events(EVENT_RXD *event_rxd, struct cmd_msg *msg, - PNDIS_PACKET net_pkt) -{ - CallEventHookHandlerOrDumpErrorMsg(event_rxd, msg, net_pkt); -} - -static void EventLenVariableHandler(EVENT_RXD *event_rxd, struct cmd_msg *msg, - PNDIS_PACKET net_pkt) -{ - /* hanle event len variable */ - HandleNormalLayer1Events(event_rxd, msg, net_pkt); -} - -static void HandleLayer1Events(EVENT_RXD *event_rxd, struct cmd_msg *msg, - PNDIS_PACKET net_pkt) -{ - /* handler normal layer 1 event */ - if (IsRspLenNonZeroAndMatchExpected(event_rxd, msg)) - HandleNormalLayer1Events(event_rxd, msg, net_pkt); - else if (IsRspLenVariableAndMatchSpecificMinLen(event_rxd, msg)) { - /* hanle event len variable */ - EventLenVariableHandler(event_rxd, msg, net_pkt); - } else if (IS_IGNORE_RSP_PAYLOAD_LEN_CHECK(msg)) { - /* hanle FW debug purpose only */ - FwDebugPurposeHandler(event_rxd, msg, net_pkt); - } else - FillRspPayloadLenAndDumpExpectLenAndRspLenInfo(event_rxd, msg); -} - -static VOID HandleLayer0GenericEvent(UINT8 EID, UINT8 ExtEID, UINT8 *Data) -{ - GenericEventHandler(EID, ExtEID, Data); -} - -static BOOLEAN IsNormalLayer0Events(EVENT_RXD *event_rxd) -{ - if ((GET_EVENT_FW_RXD_EID(event_rxd) == MT_FW_START_RSP) || - (GET_EVENT_FW_RXD_EID(event_rxd) == MT_RESTART_DL_RSP) || - (GET_EVENT_FW_RXD_EID(event_rxd) == MT_TARGET_ADDRESS_LEN_RSP) || - (GET_EVENT_FW_RXD_EID(event_rxd) == MT_PATCH_SEM_RSP) || - (GET_EVENT_FW_RXD_EID(event_rxd) == EVENT_ACCESS_REG)) - return TRUE; - else - return FALSE; -} -static void HandleLayer0Events(EVENT_RXD *event_rxd, struct cmd_msg *msg, - PNDIS_PACKET net_pkt) -{ - /* handle layer0 generic event */ - if (GET_EVENT_FW_RXD_EID(event_rxd) == GENERIC_EVENT) { - HandleLayer0GenericEvent(GET_EVENT_FW_RXD_EID(event_rxd), - GET_EVENT_FW_RXD_EXT_EID(event_rxd), - GET_EVENT_HDR_ADDR(net_pkt) - 4); - } else { - /* handle normal layer0 event */ - if (IsNormalLayer0Events(event_rxd)) { -#ifdef RT_BIG_ENDIAN - event_rxd->fw_rxd_2.word = - cpu2le32(event_rxd->fw_rxd_2.word); -#endif - msg->attr.rsp.handler( - msg, GET_EVENT_HDR_ADDR(net_pkt) - 4, - GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd) + - 4); - } else if (IsRspLenVariableAndMatchSpecificMinLen(event_rxd, - msg)) { - /* hanle event len is variable */ - EventLenVariableHandler(event_rxd, msg, net_pkt); - } else if (IS_IGNORE_RSP_PAYLOAD_LEN_CHECK(msg)) { - /* hanle FW debug purpose only */ - FwDebugPurposeHandler(event_rxd, msg, net_pkt); - } else - FillRspPayloadLenAndDumpExpectLenAndRspLenInfo( - event_rxd, msg); - } -} - -static VOID GetMCUCtrlAckQueueSpinLock(struct MCU_CTRL **ctl, - unsigned long *flags) -{ -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - RTMP_SPIN_LOCK_IRQSAVE(&((*ctl)->ackq_lock), flags); -#endif -} - -static VOID ReleaseMCUCtrlAckQueueSpinLock(struct MCU_CTRL **ctl, - unsigned long *flags) -{ -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - RTMP_SPIN_UNLOCK_IRQRESTORE(&((*ctl)->ackq_lock), flags); -#endif -} - -static UINT8 GetEventFwRxdSequenceNumber(EVENT_RXD *event_rxd) -{ - return (UINT8)(GET_EVENT_FW_RXD_SEQ_NUM(event_rxd)); -} -static VOID HandleSeqNonZeroNormalEvents(RTMP_ADAPTER *pAd, - EVENT_RXD *event_rxd, - PNDIS_PACKET net_pkt) -{ - UINT8 peerSeq; - struct cmd_msg *msg, *msg_tmp; - struct MCU_CTRL *ctl = &pAd->MCUCtrl; - unsigned long flags = 0; - GetMCUCtrlAckQueueSpinLock(&ctl, &flags); - DlListForEachSafe(msg, msg_tmp, &ctl->ackq, struct cmd_msg, list) - { - peerSeq = GetEventFwRxdSequenceNumber(event_rxd); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: msg->seq=%x, field.seq_num=%x, msg->attr.ctrl.expect_size=%d\n", - __func__, msg->seq, peerSeq, - msg->attr.ctrl.expect_size)); - - if (msg->seq == peerSeq) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s (seq=%d)\n", __func__, msg->seq)); - msg->receive_time_in_jiffies = jiffies; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: CMD_ID(0x%x 0x%x),total spent %ld ms\n", - __func__, msg->attr.type, msg->attr.ext_type, - ((msg->receive_time_in_jiffies - - msg->sending_time_in_jiffies) * - 1000 / OS_HZ))); - - if (GET_EVENT_FW_RXD_EID(event_rxd) == EXT_EVENT) - HandleLayer1Events(event_rxd, msg, net_pkt); - else - HandleLayer0Events(event_rxd, msg, net_pkt); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: need_wait=%d\n", __func__, - IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg))); - CompleteWaitCmdMsgOrFreeCmdMsg(msg); - break; - } - } - ReleaseMCUCtrlAckQueueSpinLock(&ctl, &flags); -} - -static VOID AndesMTRxProcessEvent(RTMP_ADAPTER *pAd, struct cmd_msg *rx_msg) -{ - PNDIS_PACKET net_pkt = rx_msg->net_pkt; - EVENT_RXD *event_rxd = (EVENT_RXD *)GET_OS_PKT_DATAPTR(net_pkt); -#ifdef CONFIG_TRACE_SUPPORT - TRACE_MCU_EVENT_INFO(GET_EVENT_FW_RXD_LENGTH(event_rxd), - GET_EVENT_FW_RXD_PKT_TYPE_ID(event_rxd), - GET_EVENT_FW_RXD_EID(event_rxd), - GET_EVENT_FW_RXD_SEQ_NUM(event_rxd), - GET_EVENT_FW_RXD_EXT_EID(event_rxd), - GET_EVENT_HDR_ADDR(net_pkt), - GET_EVENT_HDR_ADD_PAYLOAD_TOTAL_LEN(event_rxd)); -#endif - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: seq_num=%d, ext_eid=%x\n", __func__, - GET_EVENT_FW_RXD_SEQ_NUM(event_rxd), - GET_EVENT_FW_RXD_EXT_EID(event_rxd))); - - if (IsUnsolicitedEvent(event_rxd)) - HandlSeq0AndOtherUnsolicitedEvents(pAd, event_rxd, net_pkt); - else - HandleSeqNonZeroNormalEvents(pAd, event_rxd, net_pkt); -} - -VOID AndesMTRxEventHandler(RTMP_ADAPTER *pAd, UCHAR *data) -{ - struct cmd_msg *msg; - struct MCU_CTRL *ctl = &pAd->MCUCtrl; - EVENT_RXD *event_rxd = (EVENT_RXD *)data; - - if (!OS_TEST_BIT(MCU_INIT, &ctl->flags)) - return; - -#ifdef RT_BIG_ENDIAN - event_rxd->fw_rxd_0.word = le2cpu32(event_rxd->fw_rxd_0.word); - event_rxd->fw_rxd_1.word = le2cpu32(event_rxd->fw_rxd_1.word); - event_rxd->fw_rxd_2.word = le2cpu32(event_rxd->fw_rxd_2.word); -#endif - msg = AndesAllocCmdMsg(pAd, GET_EVENT_FW_RXD_LENGTH(event_rxd)); - - if (!msg) - return; - - AndesAppendCmdMsg(msg, (char *)data, - GET_EVENT_FW_RXD_LENGTH(event_rxd)); - AndesMTRxProcessEvent(pAd, msg); -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - - RTMPFreeNdisPacket(pAd, msg->net_pkt); - -#endif - AndesFreeCmdMsg(msg); -} - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -VOID AndesMTPciFwInit(RTMP_ADAPTER *pAd) -{ - struct MCU_CTRL *Ctl = &pAd->MCUCtrl; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__)); - Ctl->fwdl_ctrl.stage = FWDL_STAGE_FW_NOT_DL; -#if defined(MT7615) - - if (MTK_REV_GTE(pAd, MT7615, MT7615E3)) - EnhancedPDMAInit(pAd); - -#endif - /* Enable Interrupt*/ - RTMP_IRQ_ENABLE(pAd); - RT28XXDMAEnable(pAd); - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP); - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD); -} - -VOID AndesMTPciFwExit(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__)); - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_START_UP); - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD); - RT28XXDMADisable(pAd); - RTMP_ASIC_INTERRUPT_DISABLE(pAd); -} -#endif /* defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) */ - -VOID EventTxPowerHandler(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - UINT8 ucEventCategoryID; - - /* Get Event Category ID */ - ucEventCategoryID = *Data; - - /* Event Handle for different Category ID */ - switch (ucEventCategoryID) { - case TXPOWER_EVENT_SHOW_INFO: - EventTxPowerShowInfo(pAd, Data, Length); - break; - - case TXPOWER_EVENT_UPDATE_COMPENSATE_TABLE: - EventTxPowerCompTable(pAd, Data, Length); - break; - - case TXPOWER_EVENT_UPDATE_EPA_STATUS: - EventTxPowerEPAInfo(pAd, Data, Length); - break; - - case TXPOWER_EVENT_THERMAL_SENSOR_SHOW_INFO: - EventThermalStateShowInfo(pAd, Data, Length); - break; - - case TXPOWER_EVENT_POWER_BACKUP_TABLE_SHOW_INFO: - EventPowerTableShowInfo(pAd, Data, Length); - break; - - case TXPOWER_EVENT_THERMAL_COMPENSATE_TABLE_SHOW_INFO: - EventThermalCompTableShowInfo(pAd, Data, Length); - break; - - case TXPOWER_EVENT_TXV_BBP_POWER_SHOW_INFO: - EventTxvBbpPowerInfo(pAd, Data, Length); - break; - - default: - break; - } -} - -VOID EventTxPowerShowInfo(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_TXPOWER_INFO_T prEventTxPowerInfo; - UINT8 TMACIdx, LoopIdx, RatePowerTableIdx, ColumnIdx, BFBackoffIdx, - BBPCRIdx; - UINT8 Value; - UINT8 ucBandIdx; - BOOLEAN fg2GEPA; - BOOLEAN fg5GEPA; - BOOLEAN fgSKUEnable; - BOOLEAN fgPERCENTAGEEnable; - BOOLEAN fgBFBACKOFFEnable; - BOOLEAN fgThermalCompEnable; - INT8 cSKUTable[SKU_TABLE_SIZE_ALL]; - INT8 cThermalCompValue; - INT8 cPowerDrop; - UINT32 u4RatePowerCRValue[RATE_POWER_TMAC_SIZE]; - INT8 cTxPwrBFBackoffValue[BF_BACKOFF_MODE][BF_BACKOFF_CASE]; - UINT32 u4BackoffCRValue[6]; - UINT32 u4PowerBoundCRValue; - UINT32 u4BBPAddress; - UINT8 ucPwrBoundIdx; - UINT8 ucChannelBandIdx; - TX_POWER_BOUND_TABLE_T TxPowerBoundTable[4] = { - { MAX_POWER_BAND0, 0, 0 }, - { MIN_POWER_BAND0, 0, 0 }, - { MAX_POWER_BAND1, 0, 0 }, - { MIN_POWER_BAND1, 0, 0 } - }; - TX_RATE_POWER_TABLE_T TxRatePowerTable[30] = { - { OFDM_48M, 0, 0 }, { OFDM_24M_36M, 0, 0 }, - { OFDM_12M_18M, 0, 0 }, { OFDM_6M_9M, 0, 0 }, - { HT20_MCS5, 0, 0 }, { HT20_MCS3_4, 0, 0 }, - { HT20_MCS1_2, 0, 0 }, { HT20_MCS0, 0, 0 }, - { HT40_MCS5, 0, 0 }, { HT40_MCS3_4, 0, 0 }, - { HT40_MCS1_2, 0, 0 }, { HT40_MCS0, 0, 0 }, - { HT40_MCS32, 0, 0 }, { CCK_5M11M, 0, 0 }, - { OFDM_54M, 0, 0 }, { CCK_1M2M, 0, 0 }, - { HT40_MCS7, 0, 0 }, { HT40_MCS6, 0, 0 }, - { HT20_MCS7, 0, 0 }, { HT20_MCS6, 0, 0 }, - { VHT20_MCS5_6, 0, 0 }, { VHT20_MCS3_4, 0, 0 }, - { VHT20_MCS1_2, 0, 0 }, { VHT20_MCS0, 0, 0 }, - { VHT20_MCS9, 0, 0 }, { VHT20_MCS8, 0, 0 }, - { VHT20_MCS7, 0, 0 }, { VHT160, 0, 0 }, - { VHT80, 0, 0 }, { VHT40, 0, 0 } - }; - - prEventTxPowerInfo = (P_EXT_EVENT_TXPOWER_INFO_T)Data; - for (TMACIdx = 0; TMACIdx < RATE_POWER_TMAC_SIZE; TMACIdx++) - prEventTxPowerInfo->u4RatePowerCRValue[TMACIdx] = le2cpu32( - prEventTxPowerInfo->u4RatePowerCRValue[TMACIdx]); - - prEventTxPowerInfo->u4PowerBoundCRValue = - le2cpu32(prEventTxPowerInfo->u4PowerBoundCRValue); - - /* get DBDC Band Info */ - ucBandIdx = prEventTxPowerInfo->ucBandIdx; - - /* get Channel Band Info */ - ucChannelBandIdx = prEventTxPowerInfo->ucChannelBandIdx; - - /* EPPROME Info */ - fg2GEPA = prEventTxPowerInfo->fg2GEPA; - fg5GEPA = prEventTxPowerInfo->fg5GEPA; - - /* SKU enable/disable */ - fgSKUEnable = prEventTxPowerInfo->fgSKUEnable; - - /* Power Percentage enable/disable */ - fgPERCENTAGEEnable = prEventTxPowerInfo->fgPERCENTAGEEnable; - cPowerDrop = prEventTxPowerInfo->cPowerDrop; - - /* BF Backoff enable/disable */ - fgBFBACKOFFEnable = prEventTxPowerInfo->fgBFBACKOFFEnable; - - /* SKU Info */ - os_move_mem(cSKUTable, prEventTxPowerInfo->cSKUTable, - SKU_TABLE_SIZE_ALL); - - /* TMAC Info */ - os_move_mem(u4RatePowerCRValue, prEventTxPowerInfo->u4RatePowerCRValue, - RATE_POWER_TMAC_SIZE * 4); - - /* Per Rate Tx Power for TMAC CR (Band0) */ - for (TMACIdx = 0, LoopIdx = 0, RatePowerTableIdx = 0; - TMACIdx < RATE_POWER_TMAC_SIZE; TMACIdx++) { - for (ColumnIdx = 0; ColumnIdx < CR_COLUMN_SIZE; - ColumnIdx++, LoopIdx++) { - Value = (UINT8)((u4RatePowerCRValue[TMACIdx] & - BITS((3 - ColumnIdx) * 8, - (3 - ColumnIdx) * 8 + 7)) >> - ((3 - ColumnIdx) * 8)); - - /* Update Power DAC value and Power Decimal value for valid CR value in TMAC column */ - if ((LoopIdx != 24) && (LoopIdx != 28)) { - TxRatePowerTable[RatePowerTableIdx].CRValue = - Value; - - if (TxRatePowerTable[RatePowerTableIdx].CRValue > - 63) - TxRatePowerTable[RatePowerTableIdx] - .PowerDecimal = - TxRatePowerTable[RatePowerTableIdx] - .CRValue - - 128; - else - TxRatePowerTable[RatePowerTableIdx] - .PowerDecimal = - TxRatePowerTable[RatePowerTableIdx] - .CRValue; - - RatePowerTableIdx++; - } - } - } - - /* BF Backoff Info */ - u4BBPAddress = (0 == ucBandIdx) ? (0x8207067C) : (0x8207087C); - os_move_mem(cTxPwrBFBackoffValue, - prEventTxPowerInfo->cTxPwrBFBackoffValue, - BF_BACKOFF_MODE * BF_BACKOFF_CASE); - os_move_mem(u4BackoffCRValue, prEventTxPowerInfo->u4BackoffCRValue, - BFBACKOFF_BBPCR_SIZE * 4); - - /* Power Upper Bound Info */ - ucPwrBoundIdx = ucBandIdx << 1; - u4PowerBoundCRValue = - prEventTxPowerInfo->u4PowerBoundCRValue; /* TMAC: 0x820F4080 */ - - for (ColumnIdx = 0; ColumnIdx < CR_COLUMN_SIZE; ColumnIdx++) { - Value = (UINT8)((u4PowerBoundCRValue & - BITS((3 - ColumnIdx) * 8, - (3 - ColumnIdx) * 8 + 7)) >> - ((3 - ColumnIdx) * 8)); - TxPowerBoundTable[ColumnIdx].CRValue = Value; - - if (TxPowerBoundTable[ColumnIdx].CRValue > 63) - TxPowerBoundTable[ColumnIdx].PowerDecimal = - (INT8)TxPowerBoundTable[ColumnIdx].CRValue - - 128; - else - TxPowerBoundTable[ColumnIdx].PowerDecimal = - (INT8)TxPowerBoundTable[ColumnIdx].CRValue; - } - - /* Thermal Compensation Info */ - fgThermalCompEnable = prEventTxPowerInfo->fgThermalCompEnable; - cThermalCompValue = prEventTxPowerInfo->cThermalCompValue; - -#ifdef MGMT_TXPWR_CTRL - /* Updated Tx base power */ - /* 2G band*/ - if (fg2GEPA != pAd->ApCfg.fgEPA[BAND0]) { - pAd->ApCfg.fgEPA[BAND0] = TRUE; - pAd->ApCfg.EpaGain[BAND0] = prEventTxPowerInfo->cEpaGain[BAND0]; - } - - /* 5G band*/ - if (fg5GEPA != pAd->ApCfg.fgEPA[BAND1]) { - pAd->ApCfg.fgEPA[BAND1] = TRUE; - pAd->ApCfg.EpaGain[BAND1] = prEventTxPowerInfo->cEpaGain[BAND1]; - } - - if (pAd->ApCfg.fEpaReq == TRUE) { - pAd->ApCfg.fEpaReq = FALSE; - return; - } -#endif - - /* Show Info in Debug Log */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" EPPROME Info \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" EPA_%s = %d \n", - (ucChannelBandIdx == 1) ? "5G" : "2G", - (ucChannelBandIdx == 1) ? fg5GEPA : fg2GEPA)); -#ifdef MGMT_TXPWR_CTRL - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" ePA Gain = %d \n", (ucChannelBandIdx == 1) ? - pAd->ApCfg.EpaGain[BAND1] : - pAd->ApCfg.EpaGain[BAND0])); -#endif - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" SKU Info \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" SKU Enable status: (Band%d): %d \n", - ucBandIdx, fgSKUEnable)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Band%d \n", - ucBandIdx)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" CCK_1M2M = 0x%2x \n", - cSKUTable[CCK1M2M])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" CCK_5M11M = 0x%2x \n", - cSKUTable[CCK5M11M])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" OFDM_6M9M = 0x%2x \n", - cSKUTable[OFDM6M9M])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" OFDM_12M18M = 0x%2x \n", - cSKUTable[OFDM12M18M])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" OFDM_24M36M = 0x%2x \n", - cSKUTable[OFDM24M36M])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" OFDM_48M = 0x%2x \n", - cSKUTable[OFDM48M])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" OFDM_54M = 0x%2x \n", - cSKUTable[OFDM54M])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT20_M0 = 0x%2x \n", - cSKUTable[HT20M0])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT20_M32 = 0x%2x \n", - cSKUTable[HT20M32])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT20_M1M2 = 0x%2x \n", - cSKUTable[HT20M1M2])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT20_M3M4 = 0x%2x \n", - cSKUTable[HT20M3M4])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT20_M5 = 0x%2x \n", - cSKUTable[HT20M5])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT20_M6 = 0x%2x \n", - cSKUTable[HT20M6])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT20_M7 = 0x%2x \n", - cSKUTable[HT20M7])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT40_M0 = 0x%2x \n", - cSKUTable[HT40M0])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT40_M32 = 0x%2x \n", - cSKUTable[HT40M32])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT40_M1M2 = 0x%2x \n", - cSKUTable[HT40M1M2])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT40_M3M4 = 0x%2x \n", - cSKUTable[HT40M3M4])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT40_M5 = 0x%2x \n", - cSKUTable[HT40M5])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT40_M6 = 0x%2x \n", - cSKUTable[HT40M6])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" HT40_M7 = 0x%2x \n", - cSKUTable[HT40M7])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT20_M0 = 0x%2x \n", - cSKUTable[VHT20M0])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT20_M1M2 = 0x%2x \n", - cSKUTable[VHT20M1M2])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT20_M3M4 = 0x%2x \n", - cSKUTable[VHT20M3M4])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT20_M5M6 = 0x%2x \n", - cSKUTable[VHT20M5M6])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT20_M7 = 0x%2x \n", - cSKUTable[VHT20M7])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT20_M8 = 0x%2x \n", - cSKUTable[VHT20M8])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT20_M9 = 0x%2x \n", - cSKUTable[VHT20M9])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT40_M0 = 0x%2x \n", - cSKUTable[VHT40M0])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT40_M1M2 = 0x%2x \n", - cSKUTable[VHT40M1M2])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT40_M3M4 = 0x%2x \n", - cSKUTable[VHT40M3M4])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT40_M5M6 = 0x%2x \n", - cSKUTable[VHT40M5M6])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT40_M7 = 0x%2x \n", - cSKUTable[VHT40M7])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT40_M8 = 0x%2x \n", - cSKUTable[VHT40M8])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT40_M9 = 0x%2x \n", - cSKUTable[VHT40M9])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT80_M0 = 0x%2x \n", - cSKUTable[VHT80M0])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT80_M1M2 = 0x%2x \n", - cSKUTable[VHT80M1M2])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT80_M3M4 = 0x%2x \n", - cSKUTable[VHT80M3M4])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT80_M5M6 = 0x%2x \n", - cSKUTable[VHT80M5M6])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT80_M7 = 0x%2x \n", - cSKUTable[VHT80M7])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT80_M8 = 0x%2x \n", - cSKUTable[VHT80M8])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT80_M9 = 0x%2x \n", - cSKUTable[VHT80M9])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT160_M0 = 0x%2x \n", - cSKUTable[VHT160M0])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT160_M1M2 = 0x%2x \n", - cSKUTable[VHT160M1M2])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT160_M3M4 = 0x%2x \n", - cSKUTable[VHT160M3M4])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT160_M5M6 = 0x%2x \n", - cSKUTable[VHT160M5M6])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT160_M7 = 0x%2x \n", - cSKUTable[VHT160M7])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT160_M8 = 0x%2x \n", - cSKUTable[VHT160M8])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" VHT160_M9 = 0x%2x \n", - cSKUTable[VHT160M9])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 1SS_OFFSET = 0x%2x \n", - cSKUTable[TXPOWER_1SS_OFFSET])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 2SS_OFFSET = 0x%2x \n", - cSKUTable[TXPOWER_2SS_OFFSET])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 3SS_OFFSET = 0x%2x \n", - cSKUTable[TXPOWER_3SS_OFFSET])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 4SS_OFFSET = 0x%2x \n", - cSKUTable[TXPOWER_4SS_OFFSET])); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Power Percentage Info \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Power Percentage Enable status : (Band%d): %d \n", - ucBandIdx, fgPERCENTAGEEnable)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" PowerDrop status : (Band%d): %d \n", - ucBandIdx, cPowerDrop)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" BF Backoff Info \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" BF BACKOFF Enable status: (Band%d): %d \n", - ucBandIdx, fgBFBACKOFFEnable)); - - for (BFBackoffIdx = 0; BFBackoffIdx < BFBACKOFF_TABLE_SIZE; - BFBackoffIdx++) - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" BFBACKOFFTableOn[%d] = 0x%02x \n", - BFBackoffIdx, - cTxPwrBFBackoffValue[BF_BACKOFF_ON_MODE] - [BFBackoffIdx])); - - for (BFBackoffIdx = 0; BFBackoffIdx < BFBACKOFF_TABLE_SIZE; - BFBackoffIdx++) - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" BFBACKOFFTableOff[%d] = 0x%02x \n", - BFBackoffIdx, - cTxPwrBFBackoffValue[BF_BACKOFF_OFF_MODE] - [BFBackoffIdx])); - - for (BBPCRIdx = 0; BBPCRIdx < BFBACKOFF_BBPCR_SIZE; BBPCRIdx++) - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" BackoffCRValue[%d] 0x%x = 0x%08x \n", - BBPCRIdx, u4BBPAddress + 4 * BBPCRIdx, - u4BackoffCRValue[BBPCRIdx])); - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Power Upper Bound Info \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Power Bound CRValue (0x820F4080) = 0x%08x \n", - u4PowerBoundCRValue)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Thermal Compensation Info \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Thermal Compensation Enable: %d \n", - fgThermalCompEnable)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Thermal Compensation Value : %d \n", - cThermalCompValue)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" TMAC Info (Band%d) \n", - ucBandIdx)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [CCK_1M2M] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[CCK_1M2M].CRValue, - TxRatePowerTable[CCK_1M2M].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [CCK_5M11M] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[CCK_5M11M].CRValue, - TxRatePowerTable[CCK_5M11M].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [OFDM_6M_9M] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[OFDM_6M_9M].CRValue, - TxRatePowerTable[OFDM_6M_9M].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [OFDM_12M_18M] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[OFDM_12M_18M].CRValue, - TxRatePowerTable[OFDM_12M_18M].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [OFDM_24M_36M] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[OFDM_24M_36M].CRValue, - TxRatePowerTable[OFDM_24M_36M].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [OFDM_48M] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[OFDM_48M].CRValue, - TxRatePowerTable[OFDM_48M].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [OFDM_54M] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[OFDM_54M].CRValue, - TxRatePowerTable[OFDM_54M].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT20_MCS0] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT20_MCS0].CRValue, - TxRatePowerTable[HT20_MCS0].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT20_MCS1_2] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT20_MCS1_2].CRValue, - TxRatePowerTable[HT20_MCS1_2].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT20_MCS3_4] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT20_MCS3_4].CRValue, - TxRatePowerTable[HT20_MCS3_4].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT20_MCS5] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT20_MCS5].CRValue, - TxRatePowerTable[HT20_MCS5].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT20_MCS6] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT20_MCS6].CRValue, - TxRatePowerTable[HT20_MCS6].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT20_MCS7] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT20_MCS7].CRValue, - TxRatePowerTable[HT20_MCS7].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT40_MCS32] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT40_MCS32].CRValue, - TxRatePowerTable[HT40_MCS32].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT40_MCS0] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT40_MCS0].CRValue, - TxRatePowerTable[HT40_MCS0].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT40_MCS1_2] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT40_MCS1_2].CRValue, - TxRatePowerTable[HT40_MCS1_2].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT40_MCS3_4] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT40_MCS3_4].CRValue, - TxRatePowerTable[HT40_MCS3_4].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT40_MCS5] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT40_MCS5].CRValue, - TxRatePowerTable[HT40_MCS5].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT40_MCS6] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT40_MCS6].CRValue, - TxRatePowerTable[HT40_MCS6].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [HT40_MCS7] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[HT40_MCS7].CRValue, - TxRatePowerTable[HT40_MCS7].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT20_MCS0] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT20_MCS0].CRValue, - TxRatePowerTable[VHT20_MCS0].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT20_MCS1_2] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT20_MCS1_2].CRValue, - TxRatePowerTable[VHT20_MCS1_2].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT20_MCS3_4] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT20_MCS3_4].CRValue, - TxRatePowerTable[VHT20_MCS3_4].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT20_MCS5_6] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT20_MCS5_6].CRValue, - TxRatePowerTable[VHT20_MCS5_6].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT20_MCS7] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT20_MCS7].CRValue, - TxRatePowerTable[VHT20_MCS7].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT20_MCS8] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT20_MCS8].CRValue, - TxRatePowerTable[VHT20_MCS8].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT20_MCS9] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT20_MCS9].CRValue, - TxRatePowerTable[VHT20_MCS9].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT40][Offset] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT40].CRValue, - TxRatePowerTable[VHT40].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT80][Offset] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT80].CRValue, - TxRatePowerTable[VHT80].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [VHT160][Offset] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxRatePowerTable[VHT160].CRValue, - TxRatePowerTable[VHT160].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [MAX][Bound] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxPowerBoundTable[ucPwrBoundIdx].CRValue, - TxPowerBoundTable[ucPwrBoundIdx].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" [MIN][Bound] Power DAC value: 0x%2x, Power Decimal value: %d \n", - TxPowerBoundTable[ucPwrBoundIdx + 1].CRValue, - TxPowerBoundTable[ucPwrBoundIdx + 1].PowerDecimal)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); -} - -VOID EventTxPowerEPAInfo(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_EPA_STATUS_T prEventTxPowerEPAInfo; - prEventTxPowerEPAInfo = (P_EXT_EVENT_EPA_STATUS_T)Data; - /* update EPA status */ - pAd->fgEPA = prEventTxPowerEPAInfo->fgEPA; -} - -NTSTATUS EventTxvBbpPowerInfo(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_TXV_BBP_POWER_INFO_T prEventTxvBbpPowerInfo; - UINT8 ucBandIdx = 0; - UINT8 ucAntIdx = 0; - UINT8 ucAbsoTxvPower = 0; - PUINT8 pu1AbsoBbpPower = NULL; - UINT8 ucNegTxv = 0; - PUINT8 pu1NegBbp = NULL; - UINT8 ucWfNum = 0; - - /* get event info buffer contents */ - prEventTxvBbpPowerInfo = (P_EXT_EVENT_TXV_BBP_POWER_INFO_T)Data; - - if (Length != sizeof(EXT_EVENT_TXV_BBP_POWER_INFO_T)) - return STATUS_UNSUCCESSFUL; - - /*WF Path*/ - ucWfNum = prEventTxvBbpPowerInfo->ucWfNum; - - /* allocate memory for buffer power limit value */ - os_alloc_mem(pAd, (UINT8 **)&pu1AbsoBbpPower, ucWfNum); - - /*Check allocated memory*/ - if (!pu1AbsoBbpPower) - return STATUS_UNSUCCESSFUL; - - os_alloc_mem(pAd, (UINT8 **)&pu1NegBbp, ucWfNum); - - /*Check allocated memory and Free memory*/ - if (!pu1NegBbp) { - os_free_mem(pu1AbsoBbpPower); - return STATUS_UNSUCCESSFUL; - } - - /* initinal memory */ - os_zero_mem(pu1AbsoBbpPower, ucWfNum); - os_zero_mem(pu1NegBbp, ucWfNum); - - if (prEventTxvBbpPowerInfo->cTxvPower < 0) { - ucAbsoTxvPower = ~prEventTxvBbpPowerInfo->cTxvPower + 1; - ucNegTxv = 1; - } else - ucAbsoTxvPower = prEventTxvBbpPowerInfo->cTxvPower; - - for (ucAntIdx = 0; ucAntIdx < ucWfNum; ucAntIdx++) { - if (prEventTxvBbpPowerInfo->cBbpPower[ucAntIdx] < 0) { - *(pu1AbsoBbpPower + ucAntIdx) = - ~prEventTxvBbpPowerInfo->cBbpPower[ucAntIdx] + - 1; - *(pu1NegBbp + ucAntIdx) = 1; - } else - *(pu1AbsoBbpPower + ucAntIdx) = - prEventTxvBbpPowerInfo->cBbpPower[ucAntIdx]; - } - - ucBandIdx = prEventTxvBbpPowerInfo->ucBandIdx; - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================================================\n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Target TXV and BBP POWER INFO (per packet) \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=============================================================================\n")); - - /* get cTxvPower */ - if (prEventTxvBbpPowerInfo->cTxvPower % 2) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s] TXV Power (0x%x [%02d:%02d]): 0x%02x (%s%02d.5 dBm)\n", - (ucBandIdx == 1) ? "BAND1" : "BAND0", - (prEventTxvBbpPowerInfo->u2TxvPowerCR), - (prEventTxvBbpPowerInfo->ucTxvPowerMaskEnd), - (prEventTxvBbpPowerInfo->ucTxvPowerMaskBegin), - (prEventTxvBbpPowerInfo->cTxvPowerDac), - (ucNegTxv == 1) ? "-" : " ", (ucAbsoTxvPower >> 1))); - } else { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s] TXV Power (0x%x [%02d:%02d]): 0x%02x (%s%02d dBm)\n", - (ucBandIdx == 1) ? "BAND1" : "BAND0", - (prEventTxvBbpPowerInfo->u2TxvPowerCR), - (prEventTxvBbpPowerInfo->ucTxvPowerMaskEnd), - (prEventTxvBbpPowerInfo->ucTxvPowerMaskBegin), - (prEventTxvBbpPowerInfo->cTxvPowerDac), - (ucNegTxv == 1) ? "-" : " ", (ucAbsoTxvPower >> 1))); - } - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-----------------------------------------------------------------------------\n")); - - /* BBP POWER INFO */ - for (ucAntIdx = 0; ucAntIdx < ucWfNum; ucAntIdx++) { - if (prEventTxvBbpPowerInfo->cBbpPower[ucAntIdx] % 2) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[WF%01d] BBP Power (0x%x [%02d:%02d]): 0x%02x (%s%02d.5 dBm)\n", - ucAntIdx, - prEventTxvBbpPowerInfo->u2BbpPowerCR[ucAntIdx], - prEventTxvBbpPowerInfo->ucBbpPowerMaskEnd, - prEventTxvBbpPowerInfo->ucBbpPowerMaskBegin, - (prEventTxvBbpPowerInfo - ->cBbpPowerDac[ucAntIdx]), - (*(pu1NegBbp + ucAntIdx) == 1) ? "-" : " ", - (*(pu1AbsoBbpPower + ucAntIdx) >> 1))); - } else { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[WF%01d] BBP Power (0x%x [%02d:%02d]): 0x%02x (%s%02d dBm)\n", - ucAntIdx, - prEventTxvBbpPowerInfo->u2BbpPowerCR[ucAntIdx], - prEventTxvBbpPowerInfo->ucBbpPowerMaskEnd, - prEventTxvBbpPowerInfo->ucBbpPowerMaskBegin, - (prEventTxvBbpPowerInfo - ->cBbpPowerDac[ucAntIdx]), - (*(pu1NegBbp + ucAntIdx) == 1) ? "-" : " ", - (*(pu1AbsoBbpPower + ucAntIdx) >> 1))); - } - } - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-----------------------------------------------------------------------------\n")); - - /* free allocated memory */ - os_free_mem(pu1AbsoBbpPower); - os_free_mem(pu1NegBbp); - - return STATUS_SUCCESS; -} - -VOID EventThermalStateShowInfo(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_THERMAL_STATE_INFO_T prEventThermalStateInfo; - UINT8 ucThermalItemIdx; - CHAR *cThermalItem[THERMO_ITEM_NUM] = { - "DPD_CAL ", /* 0 */ - "OVERHEAT ", /* 1 */ - "BB_HI ", /* 2 */ - "BB_LO ", /* 3 */ - "NTX_PROTECT_HI ", /* 4 */ - "NTX_PROTECT_LO ", /* 5 */ - "ADM_PROTECT_HI ", /* 6 */ - "ADM_PROTECT_LO ", /* 7 */ - "RF_PROTECT_HI ", /* 8 */ - "_TSSI_COMP ", /* 9 */ - "TEMP_COMP_N7_2G4 ", /* 10 */ - "TEMP_COMP_N6_2G4 ", /* 11 */ - "TEMP_COMP_N5_2G4 ", /* 12 */ - "TEMP_COMP_N4_2G4 ", /* 13 */ - "TEMP_COMP_N3_2G4 ", /* 14 */ - "TEMP_COMP_N2_2G4 ", /* 15 */ - "TEMP_COMP_N1_2G4 ", /* 16 */ - "TEMP_COMP_N0_2G4 ", /* 17 */ - "TEMP_COMP_P1_2G4 ", /* 18 */ - "TEMP_COMP_P2_2G4 ", /* 19 */ - "TEMP_COMP_P3_2G4 ", /* 20 */ - "TEMP_COMP_P4_2G4 ", /* 21 */ - "TEMP_COMP_P5_2G4 ", /* 22 */ - "TEMP_COMP_P6_2G4 ", /* 23 */ - "TEMP_COMP_P7_2G4 ", /* 24 */ - "TEMP_COMP_N7_5G ", /* 25 */ - "TEMP_COMP_N6_5G ", /* 26 */ - "TEMP_COMP_N5_5G ", /* 27 */ - "TEMP_COMP_N4_5G ", /* 28 */ - "TEMP_COMP_N3_5G ", /* 29 */ - "TEMP_COMP_N2_5G ", /* 30 */ - "TEMP_COMP_N1_5G ", /* 31 */ - "TEMP_COMP_N0_5G ", /* 32 */ - "TEMP_COMP_P1_5G ", /* 33 */ - "TEMP_COMP_P2_5G ", /* 34 */ - "TEMP_COMP_P3_5G ", /* 35 */ - "TEMP_COMP_P4_5G ", /* 36 */ - "TEMP_COMP_P5_5G ", /* 37 */ - "TEMP_COMP_P6_5G ", /* 38 */ - "TEMP_COMP_P7_5G ", /* 39 */ - "DYNAMIC_G0 " /* 40 */ - }; - - /* Get pointer of Event Info Structure */ - prEventThermalStateInfo = (P_EXT_EVENT_THERMAL_STATE_INFO_T)Data; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Total Thermo Item Num: %d\n\n", - prEventThermalStateInfo->ucThermoItemsNum)); - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("================================================================================== \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Item Type LowEn HighEn LowerBnd UpperBnd \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("================================================================================== \n")); - - /* Thermal State Info Table */ - for (ucThermalItemIdx = 0; - ucThermalItemIdx < prEventThermalStateInfo->ucThermoItemsNum; - ucThermalItemIdx++) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s %3d %3d %3d %3d %3d\n", - cThermalItem[prEventThermalStateInfo - ->arThermoItems[ucThermalItemIdx] - .ucThermoItem], - prEventThermalStateInfo - ->arThermoItems[ucThermalItemIdx] - .ucThermoType, - prEventThermalStateInfo - ->arThermoItems[ucThermalItemIdx] - .fgLowerEn, - prEventThermalStateInfo - ->arThermoItems[ucThermalItemIdx] - .fgUpperEn, - prEventThermalStateInfo - ->arThermoItems[ucThermalItemIdx] - .cLowerBound, - prEventThermalStateInfo - ->arThermoItems[ucThermalItemIdx] - .cUpperBound)); - } -} - -VOID EventPowerTableShowInfo(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_TX_POWER_BACKUP_TABLE_INFO_T prEventPowerTableInfo; - UINT8 ucPowerTblIdx; - CHAR *cPowerItem[SKU_TABLE_SIZE] = { - "CCK_1M2M ", "CCK_5M11M ", "OFDM_6M9M ", "OFDM_12M18M ", - "OFDM_24M36M ", "OFDM_48M ", "OFDM_54M ", "HT20_MCS0 ", - "HT20_MCS32 ", "HT20_MCS12 ", "HT20_MCS34 ", "HT20_MCS5 ", - "HT20_MCS6 ", "HT20_MCS7 ", "HT40_MCS0 ", "HT40_MCS32 ", - "HT40_MCS12 ", "HT40_MCS34 ", "HT40_MCS5 ", "HT40_MCS6 ", - "HT40_MCS7 ", "VHT20_MCS0 ", "VHT20_MCS12 ", "VHT20_MCS34 ", - "VHT20_MCS56 ", "VHT20_MCS7 ", "VHT20_MCS8 ", "VHT20_MCS9 ", - "VHT40_MCS0 ", "VHT40_MCS12 ", "VHT40_MCS34 ", "VHT40_MCS56 ", - "VHT40_MCS7 ", "VHT40_MCS8 ", "VHT40_MCS9 ", "VHT80_MCS0 ", - "VHT80_MCS12 ", "VHT80_MCS34 ", "VHT80_MCS56 ", "VHT80_MCS7 ", - "VHT80_MCS8 ", "VHT80_MCS9 ", "VHT160_MCS0 ", "VHT160_MCS12", - "VHT160_MCS34", "VHT160_MCS56", "VHT160_MCS7 ", "VHT160_MCS8 ", - "VHT160_MCS9 " - }; - - /* Get pointer of Event Info Structure */ - prEventPowerTableInfo = (P_EXT_EVENT_TX_POWER_BACKUP_TABLE_INFO_T)Data; - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Phy Rate 1SS 2SS 3SS 4SS \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("============================================================================= \n")); - - for (ucPowerTblIdx = 0; ucPowerTblIdx < SKU_TABLE_SIZE; - ucPowerTblIdx++) { - /* Neglect Invalid rate HT20 MCS32 */ - if (HT20M32 == ucPowerTblIdx) - continue; - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s %2d %2d %2d %2d\n", - cPowerItem[ucPowerTblIdx], - prEventPowerTableInfo - ->cTxPowerBackup[ucPowerTblIdx] - [SKU_TX_SPATIAL_STREAM_1SS], - prEventPowerTableInfo - ->cTxPowerBackup[ucPowerTblIdx] - [SKU_TX_SPATIAL_STREAM_2SS], - prEventPowerTableInfo - ->cTxPowerBackup[ucPowerTblIdx] - [SKU_TX_SPATIAL_STREAM_3SS], - prEventPowerTableInfo - ->cTxPowerBackup[ucPowerTblIdx] - [SKU_TX_SPATIAL_STREAM_4SS])); - } -} - -VOID EventThermalCompTableShowInfo(RTMP_ADAPTER *pAd, UINT8 *Data, - UINT32 Length) -{ - P_EXT_EVENT_THERMAL_COMPENSATION_TABLE_INFO_T - prEventThermalCompTableInfo = NULL; - UINT8 ucIdx = 0; - UINT8 ucChBand = 0; - UINT8 ucBandIdx = 0; - CHAR cPowerItem[THERMAL_TABLE_SIZE][20] = { - "-7_Step_Number ", "-6_Step_Number ", "-5_Step_Number ", - "-4_Step_Number ", "-3_Step_Number ", "-2_Step_Number ", - "-1_Step_Number ", " 0_Step_Number ", " 1_Step_Number ", - " 2_Step_Number ", " 3_Step_Number ", " 4_Step_Number ", - " 5_Step_Number ", " 6_Step_Number ", " 7_Step_Number " - }; - if (Data == NULL) - return; - - /* Get pointer of Event Info Structure */ - prEventThermalCompTableInfo = - (P_EXT_EVENT_THERMAL_COMPENSATION_TABLE_INFO_T)Data; - - /* get Band Info */ - ucChBand = prEventThermalCompTableInfo->ucBand; - - /* get Band Index */ - ucBandIdx = prEventThermalCompTableInfo->ucBandIdx; - - /* Show Thermal Compensation Table */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=========================================\n")); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Thermal Compensation Table \n")); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=========================================\n")); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" Band Index: %d, Channel Band: %s\n", - prEventThermalCompTableInfo->ucBandIdx, - (prEventThermalCompTableInfo->ucBand) ? ("2G") : ("5G"))); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("-----------------------------------------\n")); - - for (ucIdx = 0; ucIdx < THERMAL_TABLE_SIZE; ucIdx++) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s = 0x%x \n", cPowerItem[ucIdx], - prEventThermalCompTableInfo->cThermalComp[ucIdx])); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("------------------------------------------\n")); -} - -VOID EventTxPowerCompTable(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_TXPOWER_BACKUP_T prEventTxPowerCompTable; - prEventTxPowerCompTable = (P_EXT_EVENT_TXPOWER_BACKUP_T)Data; - - /* update power compensation value table */ - os_move_mem( - pAd->CommonCfg - .cTxPowerCompBackup[prEventTxPowerCompTable->ucBandIdx], - prEventTxPowerCompTable->cTxPowerCompBackup, - sizeof(INT8) * SKU_TABLE_SIZE * SKU_TX_SPATIAL_STREAM_NUM); -} - -#ifdef LED_CONTROL_SUPPORT -#if defined(MT7615) || defined(MT7622) -INT AndesLedEnhanceOP(RTMP_ADAPTER *pAd, UCHAR led_idx, UCHAR tx_over_blink, - UCHAR reverse_polarity, UCHAR band, UCHAR blink_mode, - UCHAR off_time, UCHAR on_time, UCHAR led_control_mode) -#else -INT AndesLedEnhanceOP(RTMP_ADAPTER *pAd, UCHAR led_idx, UCHAR tx_over_blink, - UCHAR reverse_polarity, UCHAR blink_mode, UCHAR off_time, - UCHAR on_time, UCHAR led_control_mode) -#endif -{ - struct cmd_msg *msg; - CHAR *pos, *buf; - UINT32 len; - UINT32 arg0; - INT32 ret; - LED_ENHANCE led_enhance; - struct _CMD_ATTRIBUTE attr = { 0 }; - len = sizeof(LED_ENHANCE) + sizeof(arg0); - msg = AndesAllocCmdMsg(pAd, len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LED); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - /* Led ID and Parameter */ - arg0 = led_idx; - led_enhance.word = 0; - led_enhance.field.on_time = on_time; - led_enhance.field.off_time = off_time; - led_enhance.field.tx_blink = blink_mode; -#if defined(MT7615) || defined(MT7622) - if (IS_MT7622(pAd)) - led_enhance.field.band_select = BAND0; - else if (IS_MT7615(pAd)) - led_enhance.field.band_select = band; -#endif - led_enhance.field.reverse_polarity = reverse_polarity; - led_enhance.field.tx_over_blink = tx_over_blink; - /* - if (pAd->LedCntl.LedMethod == 1) - { - led_enhance.field.tx_blink=2; - led_enhance.field.reverse_polarity=1; - if (led_control_mode == 1 || led_control_mode == 0) - led_control_mode = ~(led_control_mode) & 0x1; - } - */ - led_enhance.field.idx = led_control_mode; - os_alloc_mem(pAd, (UCHAR **)&buf, len); - - if (buf == NULL) - return NDIS_STATUS_RESOURCES; - - NdisZeroMemory(buf, len); - pos = buf; - /* Parameter */ -#ifdef RT_BIG_ENDIAN - arg0 = cpu2le32(arg0); - led_enhance.word = cpu2le32(led_enhance.word); -#endif - NdisMoveMemory(pos, &arg0, 4); - NdisMoveMemory(pos + 4, &led_enhance, sizeof(led_enhance)); - pos += 4; - hex_dump("AndesLedOPEnhance: ", buf, len); - AndesAppendCmdMsg(msg, (char *)buf, len); - ret = AndesSendCmdMsg(pAd, msg); - os_free_mem(buf); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif - -#ifdef FQ_SCH_SUPPORT -VOID ExtEventMpduTimeHandler_fp(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_MPDU_TIME_FQ_UPDATE_T prMpduTimeFQEvt = - (P_EXT_EVENT_MPDU_TIME_FQ_UPDATE_T)Data; - PMAC_TABLE_ENTRY pEntry; - STA_TR_ENTRY *tr_entry; - UINT8 i; - UINT8 ucInUseSta = 0; - UINT8 not_active = 0; - UINT32 MpduTime = 0; - UINT32 Value[WMM_NUM_OF_AC]; - UINT32 dwrr_quantum; - - RTMP_IO_READ32(pAd, UMAC_AIRTIME_QUANTUM_SETTING0, &dwrr_quantum); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR1, &Value[0]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR1, &Value[1]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR0, &Value[2]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR0, &Value[3]); - - if (prMpduTimeFQEvt->ucfgValid) { - for (i = 0; i < RED_STA_REC_NUM; i++) { - pEntry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_NONE(pEntry)) - continue; - - if (!VALID_UCAST_ENTRY_WCID(pAd, pEntry->wcid)) - continue; - - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; - if (tr_entry->StaRec.ConnectionState == - STATE_PORT_SECURE) { - /*Calcualte in used station number */ - if ((i > 0) && - (i < (MAX_LEN_OF_MAC_TABLE - - HW_BEACON_MAX_NUM)) && - (prMpduTimeFQEvt->arMpduTime[i] > 0)) - ucInUseSta++; - } - - if (pAd->fq_ctrl.enable & FQ_READY) { - MpduTime = prMpduTimeFQEvt->arMpduTime[i]; - if (fq_update_thMax(pAd, tr_entry, i, MpduTime, - dwrr_quantum, Value) != - NDIS_STATUS_SUCCESS) - not_active++; - } - } - - /*update in used station number */ - pAd->red_in_use_sta = ucInUseSta; - if (pAd->fq_ctrl.enable & FQ_READY) - pAd->fq_ctrl.nactive = pAd->red_in_use_sta - not_active; - } -} -#endif /* defined(FQ_SCH_SUPPORT) */ - -#ifdef RED_SUPPORT -VOID ExtEventMpduTimeHandler_avg(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_MPDU_TIME_UPDATE_T prMpduTimeEvt = - (P_EXT_EVENT_MPDU_TIME_UPDATE_T)Data; - P_MPDU_SHORT_AVG_TIME_UPDATE_T prMpduShortTimeUpdate = NULL; - /* P_STA_RECORD_T prStaRec = cnmGetStaRecByIndex(0); */ - PMAC_TABLE_ENTRY pEntry; - STA_TR_ENTRY *tr_entry; - P_RED_STA_T prRedSta = &pAd->red_sta[0]; - UINT8 i; - UINT8 ucInUseSta = 0; - UINT8 ucPhyMode = 0; - UINT8 ucBW = 0; -#ifdef VOW_SUPPORT - UINT8 fgATCEnable = pAd->vow_cfg.en_bw_ctrl; - UINT8 fgATFEnable = pAd->vow_cfg.en_airtime_fairness; - UINT8 fgWATFEnable = pAd->vow_watf_en; - UINT8 fgATCorWATFEnable = fgATCEnable || (fgATFEnable && fgWATFEnable); -#else - enum { fgATCorWATFEnable = false }; -#endif /* VOW_SUPPORT */ -#ifdef FQ_SCH_SUPPORT - UINT8 j; - UINT8 active = 0, bcmc_active = 0, pow_save = 0; - struct fq_stainfo_type *pfq_sta = NULL; - STA_TR_ENTRY *tr_entry_tmp; - UINT32 Value[WMM_NUM_OF_AC]; - UINT32 dwrr_quantum; -#endif - prMpduShortTimeUpdate = - (P_MPDU_SHORT_AVG_TIME_UPDATE_T)(Data + - sizeof(EXT_EVENT_MPDU_TIME_UPDATE_T)); -#ifdef FQ_SCH_SUPPORT - RTMP_IO_READ32(pAd, UMAC_AIRTIME_QUANTUM_SETTING0, &dwrr_quantum); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR1, &Value[0]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR1, &Value[1]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR0, &Value[2]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR0, &Value[3]); -#endif - for (i = 0; i < RED_STA_REC_NUM; i++) { - if ((prMpduTimeEvt->staInUseBitmap[i >> RED_INUSE_BITSHIFT] & - (1 << (i & RED_INUSE_BITMASK))) == 0) { -#ifdef FQ_SCH_SUPPORT - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - pfq_sta = &tr_entry_tmp->fq_sta_rec; - - for (j = 0; j < WMM_NUM_OF_AC; j++) { - RTMP_SEM_LOCK(&pfq_sta->lock[j]); - if (pAd->fq_ctrl - .list_map[j][i >> FQ_BITMAP_SHIFT] & - (1 << (i & FQ_BITMAP_MASK))) - pfq_sta->status[j] = FQ_UN_CLEAN_STA; - RTMP_SEM_UNLOCK(&pfq_sta->lock[j]); - } -#endif - continue; - } - pEntry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_NONE(pEntry)) { -#ifdef FQ_SCH_SUPPORT - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - pfq_sta = &tr_entry_tmp->fq_sta_rec; - for (j = 0; j < WMM_NUM_OF_AC; j++) { - RTMP_SEM_LOCK(&pfq_sta->lock[j]); - if (pAd->fq_ctrl - .list_map[j][i >> FQ_BITMAP_SHIFT] & - (1 << (i & FQ_BITMAP_MASK))) - pfq_sta->status[j] = FQ_UN_CLEAN_STA; - RTMP_SEM_UNLOCK(&pfq_sta->lock[j]); - } -#endif - prMpduShortTimeUpdate++; - continue; - } - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; - prRedSta = &pAd->red_sta[i]; - - if (!VALID_UCAST_ENTRY_WCID(pAd, pEntry->wcid)) { -#ifdef FQ_SCH_SUPPORT - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - prRedSta = &pAd->red_sta[i]; - if (pAd->fq_ctrl.enable & FQ_READY) { - prRedSta->tx_msdu_avg_cnt = - ((prRedSta->tx_msdu_avg_cnt) >> 1) + - (prRedSta->tx_msdu_cnt >> 1); - prRedSta->i4MpduTime = - (prMpduShortTimeUpdate->arMpduTime < - 0) ? - (prMpduShortTimeUpdate - ->arMpduTime) : - ((prRedSta->tx_msdu_avg_cnt > - 0) ? - (prMpduShortTimeUpdate - ->arMpduTime / - prRedSta->tx_msdu_avg_cnt) : - prRedSta->i4MpduTime); - prRedSta->tx_msdu_cnt = 0; - if (fq_update_thMax(pAd, tr_entry_tmp, i, - prRedSta->i4MpduTime, - dwrr_quantum, Value) == - NDIS_STATUS_SUCCESS) { - active++; - bcmc_active++; - } - } -#endif - prMpduShortTimeUpdate++; - continue; - } - - if (tr_entry->StaRec.ConnectionState == STATE_PORT_SECURE) { - prRedSta->tx_msdu_avg_cnt = - ((prRedSta->tx_msdu_avg_cnt) >> 1) + - (prRedSta->tx_msdu_cnt >> 1); - prRedSta->i4MpduTime = - (prMpduShortTimeUpdate->arMpduTime < 0) ? - prMpduShortTimeUpdate->arMpduTime : - ((prRedSta->tx_msdu_avg_cnt > 0) ? - (prMpduShortTimeUpdate - ->arMpduTime / - prRedSta->tx_msdu_avg_cnt) : - prRedSta->i4MpduTime); - - prRedSta->tx_msdu_cnt = 0; - ucPhyMode = prMpduShortTimeUpdate->arPhymodeBW >> 4; - ucBW = prMpduShortTimeUpdate->arPhymodeBW & 0x0F; - /*If TxForceCnt/TxCnt > 25% and not badnode, then reset to default.*/ - RedCalForceRateRatio(i, - prMpduShortTimeUpdate->arN9TxARCnt, - prMpduShortTimeUpdate->arN9TxFRCnt, - pAd); - - /*Calcualte in used station number */ - if ((i > 0) && (i < MAX_LEN_OF_MAC_TABLE) && - (prMpduShortTimeUpdate->arMpduTime > 0)) - ucInUseSta++; - - if (prRedSta->i4MpduTime < 0) - RedResetSta(i, ucPhyMode, ucBW, pAd); - else - UpdateThreshold(i, pAd); - - UpdateAirtimeRatio( - i, prMpduShortTimeUpdate->arAirtimeRatio, - fgATCorWATFEnable, pAd); -#ifdef FQ_SCH_SUPPORT - if (pAd->fq_ctrl.enable & FQ_READY) { - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - if (fq_update_thMax(pAd, tr_entry_tmp, i, - prRedSta->i4MpduTime, - dwrr_quantum, Value) == - NDIS_STATUS_SUCCESS) - active++; - } -#endif - } else { - /*fgIsInUse == FALSE, don't care PHY mode. */ - RedResetSta(i, MODE_CCK, BW_20, pAd); - prRedSta->i4MpduTime = RED_MPDU_TIME_INIT; - prRedSta->tx_msdu_cnt = 0; -#ifdef FQ_SCH_SUPPORT - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - pfq_sta = &tr_entry_tmp->fq_sta_rec; - - for (j = 0; j < WMM_NUM_OF_AC; j++) { - RTMP_SEM_LOCK(&pfq_sta->lock[j]); - if (pAd->fq_ctrl - .list_map[j][i >> FQ_BITMAP_SHIFT] & - (1 << (i & FQ_BITMAP_MASK))) - pfq_sta->status[j] = FQ_UN_CLEAN_STA; - RTMP_SEM_UNLOCK(&pfq_sta->lock[j]); - } -#endif - } -#ifdef FQ_SCH_SUPPORT - if (tr_entry->PsMode == PWR_SAVE) - pow_save++; -#endif - prMpduShortTimeUpdate++; - } - - /*update in used station number */ - pAd->red_in_use_sta = ucInUseSta; -#ifdef FQ_SCH_SUPPORT - if (pAd->fq_ctrl.enable & FQ_READY) { - pAd->fq_ctrl.nactive = active; - pAd->fq_ctrl.nbcmc_active = bcmc_active; - pAd->fq_ctrl.npow_save = pow_save; - fq_clean_list(pAd, WMM_NUM_OF_AC); - } -#endif -} -#endif - -#ifdef RED_SUPPORT -VOID ExtEventMpduTimeHandler(RTMP_ADAPTER *pAd, UINT8 *Data, UINT32 Length) -{ - P_EXT_EVENT_MPDU_TIME_UPDATE_T prMpduTimeEvt = - (P_EXT_EVENT_MPDU_TIME_UPDATE_T)Data; - P_MPDU_SHORT_TIME_UPDATE_T prMpduShortTimeUpdate = NULL; - /* P_STA_RECORD_T prStaRec = cnmGetStaRecByIndex(0); */ - PMAC_TABLE_ENTRY pEntry; - STA_TR_ENTRY *tr_entry; - P_RED_STA_T prRedSta = &pAd->red_sta[0]; - UINT8 i; - UINT8 ucInUseSta = 0; - UINT8 ucPhyMode = 0; - UINT8 ucBW = 0; -#ifdef VOW_SUPPORT - UINT8 fgATCEnable = pAd->vow_cfg.en_bw_ctrl; - UINT8 fgATFEnable = pAd->vow_cfg.en_airtime_fairness; - UINT8 fgWATFEnable = pAd->vow_watf_en; - UINT8 fgATCorWATFEnable = fgATCEnable || (fgATFEnable && fgWATFEnable); -#else - enum { fgATCorWATFEnable = false }; -#endif /* VOW_SUPPORT */ -#ifdef FQ_SCH_SUPPORT - UINT8 j; - UINT8 active = 0, bcmc_active = 0, pow_save = 0; - struct fq_stainfo_type *pfq_sta = NULL; - STA_TR_ENTRY *tr_entry_tmp; - UINT32 Value[WMM_NUM_OF_AC]; - UINT32 dwrr_quantum; - - for (j = 0; j < FQ_BITMAP_DWORD; j++) - pAd->fq_ctrl.staInUseBitmap[j] = - prMpduTimeEvt->staInUseBitmap[j]; -#endif - if (prMpduTimeEvt->ucfgValid == 2) - return ExtEventMpduTimeHandler_avg(pAd, Data, Length); - -#ifdef FQ_SCH_SUPPORT - if (IS_MT7615(pAd)) - return ExtEventMpduTimeHandler_fp(pAd, Data, Length); -#endif -#ifdef FQ_SCH_SUPPORT - RTMP_IO_READ32(pAd, UMAC_AIRTIME_QUANTUM_SETTING0, &dwrr_quantum); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR1, &Value[0]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR1, &Value[1]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR0, &Value[2]); - RTMP_IO_READ32(pAd, TMAC_ACTXOPLR0, &Value[3]); -#endif - prMpduShortTimeUpdate = - (P_MPDU_SHORT_TIME_UPDATE_T)(Data + - sizeof(EXT_EVENT_MPDU_TIME_UPDATE_T)); - for (i = 0; i < RED_STA_REC_NUM; i++) { - if ((prMpduTimeEvt->staInUseBitmap[i >> RED_INUSE_BITSHIFT] & - (1 << (i & RED_INUSE_BITMASK))) == 0) { -#ifdef FQ_SCH_SUPPORT - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - pfq_sta = &tr_entry_tmp->fq_sta_rec; - - for (j = 0; j < WMM_NUM_OF_AC; j++) { - RTMP_SEM_LOCK(&pfq_sta->lock[j]); - if (pAd->fq_ctrl - .list_map[j][i >> FQ_BITMAP_SHIFT] & - (1 << (i & FQ_BITMAP_MASK))) - pfq_sta->status[j] = FQ_UN_CLEAN_STA; - RTMP_SEM_UNLOCK(&pfq_sta->lock[j]); - } -#endif - continue; - } - pEntry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_NONE(pEntry)) { -#ifdef FQ_SCH_SUPPORT - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - pfq_sta = &tr_entry_tmp->fq_sta_rec; - for (j = 0; j < WMM_NUM_OF_AC; j++) { - RTMP_SEM_LOCK(&pfq_sta->lock[j]); - if (pAd->fq_ctrl - .list_map[j][i >> FQ_BITMAP_SHIFT] & - (1 << (i & FQ_BITMAP_MASK))) - pfq_sta->status[j] = FQ_UN_CLEAN_STA; - RTMP_SEM_UNLOCK(&pfq_sta->lock[j]); - } -#endif - prMpduShortTimeUpdate++; - continue; - } - - if (!VALID_UCAST_ENTRY_WCID(pAd, pEntry->wcid)) { -#ifdef FQ_SCH_SUPPORT - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - prRedSta = &pAd->red_sta[i]; - if (pAd->fq_ctrl.enable & FQ_READY) { - prRedSta->tx_msdu_avg_cnt = - ((prRedSta->tx_msdu_avg_cnt) >> 1) + - (prRedSta->tx_msdu_cnt >> 1); - prRedSta->i4MpduTime = - (prMpduShortTimeUpdate->arMpduTime < - 0) ? - (prMpduShortTimeUpdate - ->arMpduTime) : - ((prRedSta->tx_msdu_avg_cnt > - 0) ? - (prMpduShortTimeUpdate - ->arMpduTime / - prRedSta->tx_msdu_avg_cnt) : - prRedSta->i4MpduTime); - prRedSta->tx_msdu_cnt = 0; - if (fq_update_thMax(pAd, tr_entry_tmp, i, - prRedSta->i4MpduTime, - dwrr_quantum, Value) == - NDIS_STATUS_SUCCESS) { - active++; - bcmc_active++; - } - } -#endif - prMpduShortTimeUpdate++; - continue; - } - - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; - prRedSta = &pAd->red_sta[i]; - if (tr_entry->StaRec.ConnectionState == STATE_PORT_SECURE) { - prRedSta->tx_msdu_avg_cnt = - ((prRedSta->tx_msdu_avg_cnt) >> 1) + - (prRedSta->tx_msdu_cnt >> 1); - - prRedSta->i4MpduTime = - (prMpduShortTimeUpdate->arMpduTime < 0) ? - prMpduShortTimeUpdate->arMpduTime : - ((prRedSta->tx_msdu_avg_cnt > 0) ? - (prMpduShortTimeUpdate - ->arMpduTime / - prRedSta->tx_msdu_avg_cnt) : - prRedSta->i4MpduTime); - - prRedSta->tx_msdu_cnt = 0; - - ucPhyMode = prMpduShortTimeUpdate->arPhymodeBW >> 4; - ucBW = prMpduShortTimeUpdate->arPhymodeBW & 0x0F; - /*If TxForceCnt/TxCnt > 25% and not badnode, then reset to default.*/ - RedCalForceRateRatio(i, - prMpduShortTimeUpdate->arN9TxARCnt, - prMpduShortTimeUpdate->arN9TxFRCnt, - pAd); - - /*Calcualte in used station number */ - if ((i > 0) && (i < MAX_LEN_OF_MAC_TABLE) && - (prMpduShortTimeUpdate->arMpduTime > 0)) - ucInUseSta++; - - if (prRedSta->i4MpduTime < 0) - RedResetSta(i, ucPhyMode, ucBW, pAd); - else - UpdateThreshold(i, pAd); - - UpdateAirtimeRatio( - i, prMpduShortTimeUpdate->arAirtimeRatio, - fgATCorWATFEnable, pAd); -#ifdef FQ_SCH_SUPPORT - if (pAd->fq_ctrl.enable & FQ_READY) { - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - if (fq_update_thMax(pAd, tr_entry_tmp, i, - prRedSta->i4MpduTime, - dwrr_quantum, Value) == - NDIS_STATUS_SUCCESS) - active++; - } -#endif - } else { - /*fgIsInUse == FALSE, don't care PHY mode. */ - RedResetSta(i, MODE_CCK, BW_20, pAd); - prRedSta->i4MpduTime = RED_MPDU_TIME_INIT; - prRedSta->tx_msdu_cnt = 0; -#ifdef FQ_SCH_SUPPORT - tr_entry_tmp = &pAd->MacTab.tr_entry[i]; - pfq_sta = &tr_entry_tmp->fq_sta_rec; - - for (j = 0; j < WMM_NUM_OF_AC; j++) { - RTMP_SEM_LOCK(&pfq_sta->lock[j]); - if (pAd->fq_ctrl - .list_map[j][i >> FQ_BITMAP_SHIFT] & - (1 << (i & FQ_BITMAP_MASK))) - pfq_sta->status[j] = FQ_UN_CLEAN_STA; - RTMP_SEM_UNLOCK(&pfq_sta->lock[j]); - } -#endif - } -#ifdef FQ_SCH_SUPPORT - if (tr_entry->PsMode == PWR_SAVE) - pow_save++; -#endif - prMpduShortTimeUpdate++; - } - - /*update in used station number */ - pAd->red_in_use_sta = ucInUseSta; -#ifdef FQ_SCH_SUPPORT - if (pAd->fq_ctrl.enable & FQ_READY) { - pAd->fq_ctrl.nactive = active; - pAd->fq_ctrl.nbcmc_active = bcmc_active; - pAd->fq_ctrl.npow_save = pow_save; - fq_clean_list(pAd, WMM_NUM_OF_AC); - } -#endif -} -#endif /* defined(RED_SUPPORT) */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/mcu.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/mcu.c deleted file mode 100644 index 40b6927193..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mcu/mcu.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rtmp_mcu.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" - -INT MCUBurstWrite(PRTMP_ADAPTER pAd, UINT32 Offset, UINT32 *Data, UINT32 Cnt) -{ - return 0; -} - -INT MCURandomWrite(PRTMP_ADAPTER pAd, RTMP_REG_PAIR *RegPair, UINT32 Num) -{ - UINT32 Index; - - for (Index = 0; Index < Num; Index++) - RTMP_IO_WRITE32(pAd, RegPair->Register, RegPair->Value); - - return 0; -} - -INT32 MCUSysPrepare(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__)); - MCU_CTRL_INIT(pAd); - chip_fw_init(pAd); - - return Ret; -} - -INT32 MCUSysInit(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__)); - MCU_CTRL_INIT(pAd); - chip_fw_init(pAd); - { - UINT32 Value; -#ifdef WIFI_SPECTRUM_SUPPORT - /* Refer to profile setting to decide the sysram partition format */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Before NICLoadFirmware, check ICapMode = %d\n", - __func__, pAd->ICapMode)); - - if (pAd->ICapMode == 2) { /* Wifi-spectrum */ - if (IS_MT7615(pAd)) { - HW_IO_READ32(pAd, CONFG_COM1_REG3, &Value); - Value = Value | CONFG_COM1_REG3_FWOPMODE; - HW_IO_WRITE32(pAd, CONFG_COM1_REG3, Value); - } else if (IS_MT7622(pAd)) { - HW_IO_READ32(pAd, CONFG_COM2_REG3, &Value); - Value = Value | CONFG_COM2_REG3_FWOPMODE; - HW_IO_WRITE32(pAd, CONFG_COM2_REG3, Value); - } - } else -#endif /* WIFI_SPECTRUM_SUPPORT */ - { - if (IS_MT7615(pAd)) { - HW_IO_READ32(pAd, CONFG_COM1_REG3, &Value); - Value = Value & (~CONFG_COM1_REG3_FWOPMODE); - HW_IO_WRITE32(pAd, CONFG_COM1_REG3, Value); - } else if (IS_MT7622(pAd)) { - HW_IO_READ32(pAd, CONFG_COM2_REG3, &Value); - Value = Value & (~CONFG_COM2_REG3_FWOPMODE); - HW_IO_WRITE32(pAd, CONFG_COM2_REG3, Value); - } - } - } - Ret = NICLoadFirmware(pAd); - - if (Ret != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: NICLoadFirmware failed, Status[=0x%08x]\n", - __func__, Ret)); - return -1; - } - - return Ret; -} - -INT32 MCUSysExit(RTMP_ADAPTER *pAd) -{ - INT32 Ret = 0; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->FwExit) - ops->FwExit(pAd); - - MCU_CTRL_EXIT(pAd); - return Ret; -} - -VOID ChipOpsMCUHook(PRTMP_ADAPTER pAd, enum MCU_TYPE MCUType) -{ - RTMP_CHIP_OP *pChipOps = hc_get_chip_ops(pAd->hdev_ctrl); - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - -#ifdef CONFIG_ANDES_SUPPORT - - if ((MCUType & ANDES) == ANDES) { -#ifdef MT_MAC - if (cap->hif_type == HIF_MT) { -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - if (IS_PCIE_INF(pAd) || IS_RBUS_INF(pAd)) { - pChipOps->FwInit = AndesMTPciFwInit; - pChipOps->FwExit = AndesMTPciFwExit; - pChipOps->pci_kick_out_cmd_msg = - AndesMTPciKickOutCmdMsg; - } -#endif /* defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) */ - pChipOps->andes_fill_cmd_header = - AndesMTFillCmdHeaderWithTXD; - pChipOps->rx_event_handler = AndesMTRxEventHandler; - } -#endif /* MT_MAC */ - - pChipOps->MtCmdTx = AndesSendCmdMsg; - pChipOps->MCUCtrlInit = AndesCtrlInit; - pChipOps->MCUCtrlExit = AndesCtrlExit; - - FwdlHookInit(pAd); - } - -#endif /* CONFIG_ANDES_SUPPORT */ -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_basic.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_basic.c deleted file mode 100644 index af6e7f5c09..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_basic.c +++ /dev/null @@ -1,197 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#include "rt_config.h" -#include "mgmt/be_internal.h" - -VOID dump_ht_cap(struct wifi_dev *wdev) -{ - HT_CAPABILITY_IE *ht_cap = NULL; - - if (wdev) { - ht_cap = (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Caller: %pS\n", __builtin_return_address(0))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("phy_mode=%d, ch=%d, wdev_type=%d\n", wdev->PhyMode, - wdev->channel, wdev->wdev_type)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ht_cap->HtCapInfo: ldpc=%d,ch_width=%d,gf=%d,sgi20=%d,sgi40=%d,tx_stbc=%d,rx_stbc=%d,amsdu_size=%d\n", - ht_cap->HtCapInfo.ht_rx_ldpc, - ht_cap->HtCapInfo.ChannelWidth, ht_cap->HtCapInfo.GF, - ht_cap->HtCapInfo.ShortGIfor20, - ht_cap->HtCapInfo.ShortGIfor40, - ht_cap->HtCapInfo.TxSTBC, ht_cap->HtCapInfo.RxSTBC, - ht_cap->HtCapInfo.AMsduSize)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ht_cap->HtCapParm: mdpu_density=%d, ampdu_factor=%d\n", - ht_cap->HtCapParm.MpduDensity, - ht_cap->HtCapParm.MaxRAmpduFactor)); - } -} - -/*init radio*/ -static VOID radio_operate_init(struct wifi_dev *wdev) -{ - struct freq_cfg fcfg; -#ifdef CONFIG_AP_SUPPORT - struct _RTMP_ADAPTER *ad = NULL; - - if (wdev == NULL) - return; - ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - - if (CheckNonOccupancyChannel(ad, wdev, RDD_CHECK_NOP_BY_WDEV) == - FALSE) { -#ifdef DFS_VENDOR10_CUSTOM_FEATURE - UCHAR grpWidth = 0, channel = 0; - UCHAR chGrp = DfsV10CheckChnlGrp(ad, wdev->channel); - - if (IS_SUPPORT_V10_DFS(ad) && WMODE_CAP_5G(wdev->PhyMode) && - (chGrp >= W53 && chGrp <= W56)) { - if (chGrp >= W56_UA && chGrp <= W56_UC) { - chGrp = W56; - if (ad->CommonCfg.bCh144Enabled) - grpWidth = V10_W56_SIZE; - else - grpWidth = V10_W56_SIZE - 1; - } else if (chGrp == W53) - grpWidth = V10_W53_SIZE; - - channel = DfsV10FindNonNopChannel(ad, chGrp, grpWidth); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] NOP channel %d grp %d\n", __func__, - channel, chGrp)); - if (channel && - (DfsV10CheckChnlGrp(ad, channel) == W56_UC && - (ad->CommonCfg.bCh144Enabled == FALSE))) { - AutoChSelUpdateChannel(ad, channel, TRUE, wdev); - wlan_config_set_ht_bw(wdev, HT_BW_20); - wlan_config_set_vht_bw(wdev, VHT_BW_2040); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("[%s] Set BW to HT20.\n", __func__)); - } - - if (!channel && chGrp == W53) - wdev->channel = FirstChannel(ad, wdev); - else if (!channel && chGrp == W56) { - DfsV10W56APDownStart( - ad, HcGetAutoChCtrlbyBandIdx(ad, BAND0), - DfsV10W56FindMaxNopDuration(ad)); - SET_V10_APINTF_DOWN(ad, TRUE); - } - } else -#endif /* DFS_VENDOR10_CUSTOM_FEATURE */ - wdev->channel = FirstChannel(ad, wdev); - } -#endif - - phy_freq_get_cfg(wdev, &fcfg); - -#ifdef CONFIG_AP_SUPPORT - /*Check RDMode before setting channel*/ -#ifdef MT_DFS_SUPPORT - if (!DfsBypassRadarStateCheck(wdev)) -#endif - RadarStateCheck(ad, wdev); -#endif - operate_loader_phy(wdev, &fcfg); -} - -/* -* private structure definition to prevent direct access -*/ -VOID wlan_operate_init(struct wifi_dev *wdev) -{ - struct wlan_operate *obj = (struct wlan_operate *)wdev->wpf_op; - - if (!obj) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Can't find wlan operate for wdev.\n", - __func__)); - return; - } - - /*reset to default*/ - phy_oper_init(wdev, &obj->phy_oper); - ht_oper_init(wdev, &obj->ht_oper); - ht_op_status_init(wdev, &obj->ht_status); -#ifdef DOT11_VHT_AC - vht_oper_init(wdev, &obj->vht_oper); - vht_op_status_init(wdev, &obj->vht_status); -#endif /* DOT11_VHT_AC */ - /*adjust radio operate from configure*/ - radio_operate_init(wdev); - - dump_ht_cap(wdev); -} - -VOID wlan_operate_exit(struct wifi_dev *wdev) -{ - struct wlan_operate *obj = (struct wlan_operate *)wdev->wpf_op; - - if (!obj) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Can't find wlan operate for wdev.\n", - __func__)); - return; - } - - phy_oper_exit(&obj->phy_oper); - ht_oper_exit(&obj->ht_oper); -#ifdef DOT11_VHT_AC - vht_oper_exit(&obj->vht_oper); -#endif /* DOT11_VHT_AC */ - ht_op_status_exit(&obj->ht_status); -#ifdef DOT11_VHT_AC - vht_op_status_exit(&obj->vht_status); -#endif /* DOT11_VHT_AC */ -} - -UCHAR wlan_operate_get_state(struct wifi_dev *wdev) -{ - struct wlan_operate *obj = (struct wlan_operate *)wdev->wpf_op; - - if (!obj) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Can't find wlan operate for wdev.\n", - __func__)); - return WLAN_OPER_STATE_INVALID; - } - - return obj->state; -} - -UCHAR wlan_operate_set_state(struct wifi_dev *wdev, UCHAR state) -{ - struct wlan_operate *obj = (struct wlan_operate *)wdev->wpf_op; - - if (!obj) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Can't find wlan operate for wdev.\n", - __func__)); - return WLAN_OPER_FAIL; - } - - obj->state = state; - return WLAN_OPER_OK; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_ht.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_ht.c deleted file mode 100644 index 1f798d73f4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_ht.c +++ /dev/null @@ -1,575 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#include "rt_config.h" -#include "mgmt/be_internal.h" - -/* -*ht phy info related -*/ -VOID ht_oper_init(struct wifi_dev *wdev, struct ht_op *obj) -{ - /*initial ht_phy_info value*/ -#ifdef BW_VENDOR10_CUSTOM_FEATURE - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; - if (IS_APCLI_SYNC_PEER_DEAUTH_ENBL(pAd)) { - obj->ht_bw = wlan_operate_get_ht_bw(wdev); - obj->ext_cha = wlan_operate_get_ext_cha(wdev); - } else { -#endif - obj->ht_bw = HT_BW_20; - obj->ext_cha = EXTCHA_NONE; -#ifdef BW_VENDOR10_CUSTOM_FEATURE - } -#endif - - obj->ht_ldpc = wlan_config_get_ht_ldpc(wdev); - obj->ht_stbc = wlan_config_get_ht_stbc(wdev); - obj->ht_gi = wlan_config_get_ht_gi(wdev); - obj->frag_thld = wlan_config_get_frag_thld(wdev); - obj->len_thld = wlan_config_get_rts_len_thld(wdev); - obj->pkt_thld = wlan_config_get_rts_pkt_thld(wdev); - /* frag threshold */ - wlan_operate_set_frag_thld(wdev, obj->frag_thld); - /* rts threshold */ - wlan_operate_set_rts_len_thld(wdev, obj->len_thld); - wlan_operate_set_rts_pkt_thld(wdev, obj->pkt_thld); -} - -VOID ht_oper_exit(struct ht_op *obj) -{ - os_zero_mem(obj, sizeof(*obj)); -} - -/* -* ht operate related -*/ -VOID ht_op_status_init(struct wifi_dev *wdev, struct ht_op_status *obj) -{ - wlan_operate_update_ht_cap(wdev); -} - -VOID ht_op_status_exit(struct ht_op_status *obj) -{ - os_zero_mem(obj, sizeof(struct ht_op_status)); -} - -/* -* Configure loader -*/ -static VOID ht_oper_set_ext_cha(struct wifi_dev *wdev, UCHAR ext_cha) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - struct wlan_operate *op; - struct freq_cfg cfg; - struct wifi_dev *twdev; - UCHAR i; - - /*update extcha since radio is changed*/ - for (i = 0; i < WDEV_NUM_MAX; i++) { - twdev = ad->wdev_list[i]; - - if (!twdev) - continue; - - if (twdev->channel != wdev->channel) - continue; - - if (wlan_operate_get_state(twdev) != WLAN_OPER_STATE_VALID) - continue; - - op = (struct wlan_operate *)twdev->wpf_op; - - if ((op->ht_oper.ext_cha != EXTCHA_NONE) && - (op->ht_oper.ext_cha != ext_cha)) { - phy_freq_get_cfg(twdev, &cfg); - cfg.ext_cha = ext_cha; - operate_loader_phy(twdev, &cfg); - } - } -} - -/* -* -Operate loader -*/ -VOID operate_loader_ht_bw(struct wlan_operate *op) -{ - op->ht_status.addht.AddHtInfo.RecomWidth = op->ht_oper.ht_bw; -} - -VOID operate_loader_ext_cha(struct wlan_operate *op) -{ - op->ht_status.addht.AddHtInfo.ExtChanOffset = op->ht_oper.ext_cha; -} - -VOID operate_loader_ht_stbc(struct wlan_operate *op, UCHAR tx_nsts, - UCHAR rx_nsts, UCHAR ht_stbc) -{ - UCHAR tx_stbc = STBC_NONE, rx_stbc = STBC_NONE; - - if (ht_stbc == STBC_USE) { - if (tx_nsts > 1) - tx_stbc = STBC_USE; - if (rx_nsts >= 1) - rx_stbc = - RXSTBC_ONE; /*current hw only support rx 1ss STBC */ - if ((tx_stbc == STBC_NONE) && (rx_stbc == STBC_NONE)) - ht_stbc = STBC_NONE; - } - op->ht_oper.ht_stbc = ht_stbc; - op->ht_status.ht_cap_ie.HtCapInfo.TxSTBC = tx_stbc; - op->ht_status.ht_cap_ie.HtCapInfo.RxSTBC = rx_stbc; -} - -VOID operate_loader_ht_ldpc(struct wlan_operate *op, UCHAR ht_ldpc) -{ - op->ht_oper.ht_ldpc = ht_ldpc; - op->ht_status.ht_cap_ie.HtCapInfo.ht_rx_ldpc = ht_ldpc; -} - -VOID operate_loader_ht_gi(struct wlan_operate *op, UCHAR ht_bw, UCHAR ht_gi) -{ - UCHAR ht20_gi = GI_800, ht40_gi = GI_800; - - if (ht_gi == GI_400) { - ht20_gi = GI_400; - if (ht_bw == HT_BW_40) - ht40_gi = GI_400; - } - op->ht_oper.ht_gi = ht_gi; - op->ht_status.ht_cap_ie.HtCapInfo.ShortGIfor20 = ht20_gi; - op->ht_status.ht_cap_ie.HtCapInfo.ShortGIfor40 = ht40_gi; -} - -VOID operate_loader_greenfield(struct wlan_operate *op, UCHAR ht_gf) -{ - /*TODO: should check if STA is nonHT */ - op->ht_status.ht_cap_ie.HtCapInfo.GF = ht_gf; -} - -VOID operate_loader_max_amsdu_len(struct wlan_operate *op, UCHAR len) -{ - if (len > MPDU_7991_OCTETS) - len = MPDU_7991_OCTETS; - op->ht_status.ht_cap_ie.HtCapInfo.AMsduSize = len; -} - -VOID operate_loader_min_mpdu_start_space(struct wlan_operate *op, - UCHAR min_start_space) -{ - op->ht_status.ht_cap_ie.HtCapParm.MpduDensity = min_start_space; -} - -VOID operate_loader_ht_max_ampdu_len_exp(struct wlan_operate *op, - UCHAR exp_factor) -{ - /* recv. cap. max_ampdu_len = 2^(13+exp) - 1, from 0 to 3 */ - op->ht_status.ht_cap_ie.HtCapParm.MaxRAmpduFactor = exp_factor; -} - -VOID operate_loader_support_ch_width_set(struct wlan_operate *op, - UCHAR ch_width_set) -{ - op->ht_status.ht_cap_ie.HtCapInfo.ChannelWidth = ch_width_set; -} - -VOID operate_loader_smps(struct wlan_operate *op, UCHAR smps) -{ - /* TODO: need to confirm MMPS equal to SMPS? */ - op->ht_status.ht_cap_ie.HtCapInfo.MimoPs = smps; -} - -VOID operate_loader_cckin40(struct wlan_operate *op, UCHAR ch, UCHAR ht_bw) -{ - UCHAR cckin40 = 0; - - if ((ch < 14) && (ht_bw == HT_BW_40)) - cckin40 = 1; - op->ht_status.ht_cap_ie.HtCapInfo.CCKmodein40 = cckin40; -} - -VOID operate_loader_rts_len_thld(struct wlan_operate *op, UINT32 pkt_len) -{ - op->ht_oper.len_thld = pkt_len; -} - -VOID operate_loader_frag_thld(struct wlan_operate *op, UINT32 frag_thld) -{ - op->ht_oper.frag_thld = frag_thld; -} - -VOID operate_loader_rts_pkt_thld(struct wlan_operate *op, UCHAR pkt_num) -{ - op->ht_oper.pkt_thld = pkt_num; -} -/* -* export operate function -*/ -/* -* Set -*/ -INT32 wlan_operate_set_support_ch_width_set(struct wifi_dev *wdev, - UCHAR ch_width_set) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (!wdev) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): can't find wlan opeate!\n", __func__)); - return ret; - } - - op = (struct wlan_operate *)wdev->wpf_op; - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - operate_loader_support_ch_width_set(op, ch_width_set); - } - return ret; -} - -INT32 wlan_operate_set_ht_bw(struct wifi_dev *wdev, UCHAR ht_bw, UCHAR ext_cha) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - UCHAR cap_ht_bw = wlan_config_get_ht_bw(wdev); - INT32 ret = WLAN_OPER_OK; - struct freq_cfg cfg; - - if ((ht_bw == op->ht_oper.ht_bw) && (ext_cha == op->ht_oper.ext_cha)) - return ret; - - if (ht_bw > cap_ht_bw) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): new ht_bw:%d > cap_ht_bw: %d, correct to cap_ht_bw\n", - __func__, ht_bw, cap_ht_bw)); - ht_bw = cap_ht_bw; - ret = WLAN_OPER_FAIL; - } - - phy_freq_get_cfg(wdev, &cfg); - cfg.ht_bw = ht_bw; - cfg.ext_cha = ext_cha; - operate_loader_phy(wdev, &cfg); - - if (op->ht_oper.ext_cha != EXTCHA_NONE) - ht_oper_set_ext_cha(wdev, op->ht_oper.ext_cha); - - return ret; -} - -INT32 wlan_operate_set_non_gf_sta(struct wifi_dev *wdev, UINT16 non_gf_sta) -{ - struct wlan_operate *op; - - /*due to use in MACTableMaintaince*/ - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - op->ht_status.non_gf_sta = non_gf_sta; - } - - return WLAN_OPER_OK; -} - -INT32 wlan_operate_set_ht_stbc(struct wifi_dev *wdev, UCHAR ht_stbc) -{ - INT32 ret = WLAN_OPER_OK; - - if (wdev) - wlan_operate_update_ht_stbc(wdev, ht_stbc); - return ret; -} - -INT32 wlan_operate_set_ht_ldpc(struct wifi_dev *wdev, UCHAR ht_ldpc) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - operate_loader_ht_ldpc(op, ht_ldpc); - } - return ret; -} - -INT32 wlan_operate_set_max_amsdu_len(struct wifi_dev *wdev, UCHAR len) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - operate_loader_max_amsdu_len(op, len); - } - return ret; -} - -INT32 wlan_operate_set_min_start_space(struct wifi_dev *wdev, - UCHAR mpdu_density) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - operate_loader_min_mpdu_start_space(op, mpdu_density); - } - return ret; -} - -INT32 wlan_operate_set_mmps(struct wifi_dev *wdev, UCHAR mmps) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - operate_loader_smps(op, mmps); - } - return ret; -} - -INT32 wlan_operate_set_ht_max_ampdu_len_exp(struct wifi_dev *wdev, - UCHAR exp_factor) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - operate_loader_ht_max_ampdu_len_exp(op, exp_factor); - } - return ret; -} - -INT32 wlan_operate_set_ht_delayed_ba(struct wifi_dev *wdev, UCHAR support) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - op->ht_status.ht_cap_ie.HtCapInfo.DelayedBA = support; - } - return ret; -} - -INT32 wlan_operate_set_lsig_txop_protect(struct wifi_dev *wdev, UCHAR support) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - op->ht_oper.l_sig_txop = support; - op->ht_status.ht_cap_ie.HtCapInfo.LSIGTxopProSup = support; - } - return ret; -} - -INT32 wlan_operate_set_psmp(struct wifi_dev *wdev, UCHAR psmp) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - op->ht_status.ht_cap_ie.HtCapInfo.PSMP = psmp; - } - return ret; -} - -INT32 wlan_operate_set_frag_thld(struct wifi_dev *wdev, UINT32 frag_thld) -{ - struct wlan_operate *op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - operate_loader_frag_thld(op, frag_thld); - } - return ret; -} - -INT32 wlan_operate_set_rts_pkt_thld(struct wifi_dev *wdev, UCHAR pkt_num) -{ - struct wlan_operate *op; - struct _RTMP_ADAPTER *ad; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - operate_loader_rts_pkt_thld(op, pkt_num); - HW_SET_RTS_THLD(ad, wdev, op->ht_oper.pkt_thld, - op->ht_oper.len_thld, op->ht_oper.retry_limit); - } - return ret; -} - -INT32 wlan_operate_set_rts_len_thld(struct wifi_dev *wdev, UINT32 pkt_len) -{ - struct wlan_operate *op; - struct _RTMP_ADAPTER *ad; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - operate_loader_rts_len_thld(op, pkt_len); - HW_SET_RTS_THLD(ad, wdev, op->ht_oper.pkt_thld, - op->ht_oper.len_thld, op->ht_oper.retry_limit); - } - return ret; -} - -/* -*Get -*/ -UCHAR wlan_operate_get_ht_bw(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->ht_oper.ht_bw; -} - -UCHAR wlan_operate_get_ht_stbc(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->ht_oper.ht_stbc; -} - -UCHAR wlan_operate_get_ht_ldpc(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->ht_oper.ht_ldpc; -} - -UCHAR wlan_operate_get_ext_cha(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->ht_oper.ext_cha; -} - -struct _ADD_HT_INFO_IE *wlan_operate_get_addht(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return &op->ht_status.addht; -} - -UINT16 wlan_operate_get_non_gf_sta(struct wifi_dev *wdev) -{ - struct wlan_operate *op; - - if (wdev && wdev->wpf_op) { - op = (struct wlan_operate *)wdev->wpf_op; - return op->ht_status.non_gf_sta; - } - - return 0; -} - -UINT32 wlan_operate_get_frag_thld(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->ht_oper.frag_thld; -} - -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(wlan_operate_get_frag_thld); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ - -UCHAR wlan_operate_get_rts_pkt_thld(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->ht_oper.pkt_thld; -} - -UINT32 wlan_operate_get_rts_len_thld(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->ht_oper.len_thld; -} - -UCHAR wlan_operate_get_rts_retry_limit(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - return op->ht_oper.retry_limit; -} - -VOID *wlan_operate_get_ht_cap(struct wifi_dev *wdev) -{ - struct wlan_operate *op = NULL; - - op = (struct wlan_operate *)wdev->wpf_op; - if (op) - return &op->ht_status.ht_cap_ie; - - return NULL; -} -/* -* Update -*/ -VOID wlan_operate_update_ht_stbc(struct wifi_dev *wdev, UCHAR use_stbc) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - UCHAR tx_nsts = ad->Antenna.field.TxPath; - UCHAR rx_nsts = ad->Antenna.field.RxPath; - - if (op) - operate_loader_ht_stbc(op, tx_nsts, rx_nsts, use_stbc); -} - -VOID wlan_operate_update_ht_cap(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - - if (cfg && op) { - /* set from .dat */ - operate_loader_ht_ldpc(op, cfg->ht_conf.ht_ldpc); - operate_loader_support_ch_width_set(op, cfg->ht_conf.ht_bw); - operate_loader_ht_gi(op, cfg->ht_conf.ht_bw, - cfg->ht_conf.ht_gi); - operate_loader_greenfield(op, cfg->ht_conf.gf_support); - operate_loader_min_mpdu_start_space( - op, cfg->ht_conf.min_mpdu_start_space); - operate_loader_smps(op, cfg->ht_conf.mmps); - wlan_operate_update_ht_stbc(wdev, cfg->ht_conf.ht_stbc); - /* set from chip cap */ - operate_loader_max_amsdu_len(op, cap->max_amsdu_len); - operate_loader_ht_max_ampdu_len_exp(op, - cap->ht_max_ampdu_len_exp); - /* set from fix */ - wlan_operate_set_ht_delayed_ba(wdev, 0); - wlan_operate_set_lsig_txop_protect(wdev, 0); - wlan_operate_set_psmp(wdev, 0); - operate_loader_cckin40(op, wdev->channel, cfg->ht_conf.ht_bw); - } -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_phy.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_phy.c deleted file mode 100644 index 18d70ea5f4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_phy.c +++ /dev/null @@ -1,499 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#include "rt_config.h" -#include "mgmt/be_internal.h" -#include "hdev/hdev.h" - -/* -* define constructor & deconstructor & method -*/ -VOID phy_oper_init(struct wifi_dev *wdev, struct phy_op *obj) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - UINT8 ucTxPath = ad->Antenna.field.TxPath; - UINT8 ucRxPath = ad->Antenna.field.RxPath; - -#ifdef DBDC_MODE - if (ad->CommonCfg.dbdc_mode) { - UINT8 band_idx = HcGetBandByWdev(wdev); - - if (band_idx == DBDC_BAND0) { - ucTxPath = ad->dbdc_band0_tx_path; - ucRxPath = ad->dbdc_band0_rx_path; - } else { - ucTxPath = ad->dbdc_band1_tx_path; - ucRxPath = ad->dbdc_band1_rx_path; - } - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Swap TX/RX Stream number to (%d,%d) since DBDC_MODE EN\n", - __func__, ucTxPath, ucRxPath)); - } -#endif - - obj->wdev_bw = BW_20; - obj->tx_stream = wlan_config_get_tx_stream(wdev); - obj->rx_stream = wlan_config_get_rx_stream(wdev); - - if ((obj->tx_stream == 0) || (obj->tx_stream > ucTxPath)) - obj->tx_stream = ucTxPath; - - if ((obj->rx_stream == 0) || (obj->rx_stream > ucRxPath)) - obj->rx_stream = ucRxPath; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): operate TxStream = %d, RxStream = %d\n", __func__, - obj->tx_stream, obj->rx_stream)); -} - -VOID phy_oper_exit(struct phy_op *obj) -{ - os_zero_mem(obj, sizeof(*obj)); -} - -/* -* phy_freq internal related function -*/ -static UCHAR phy_bw_adjust(UCHAR ht_bw, UCHAR vht_bw) -{ - UCHAR wdev_bw; - - if (ht_bw == HT_BW_40) - ht_bw = HT_BW_40; - else - ht_bw = HT_BW_20; - - if (ht_bw == HT_BW_20) - wdev_bw = BW_20; - else { -#ifdef DOT11_VHT_AC - - if (vht_bw == VHT_BW_80) - wdev_bw = BW_80; - else if (vht_bw == VHT_BW_160) - wdev_bw = BW_160; - else if (vht_bw == VHT_BW_8080) - wdev_bw = BW_8080; - else -#endif /* DOT11_VHT_AC */ - wdev_bw = BW_40; - } - - return wdev_bw; -} - -static VOID phy_ht_vht_bw_adjust(UCHAR bw, UCHAR *ht_bw, UCHAR *vht_bw) -{ - if (bw < BW_40) - *ht_bw = HT_BW_20; - else - *ht_bw = HT_BW_40; - -#ifdef DOT11_VHT_AC - *vht_bw = rf_bw_2_vht_bw(bw); -#endif /*DOT11_VHT_AC*/ - return; -} - -static BOOLEAN phy_freq_adjust(struct wifi_dev *wdev, struct freq_cfg *cfg, - struct freq_oper *op) -{ - UCHAR reg_cap_bw; - UCHAR sec_ch_2_80_capable = 0; - struct _RTMP_ADAPTER *ad = NULL; - ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - - /*initial to legacy setting*/ - if (cfg->prim_ch == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : no prim_ch value for adjust!\n", __func__)); - return FALSE; - } - - op->ht_bw = HT_BW_20; - op->ext_cha = EXTCHA_NONE; -#ifdef DOT11_VHT_AC - op->vht_bw = VHT_BW_2040; -#endif /*DOT11_VHT_AC*/ - op->prim_ch = cfg->prim_ch; - op->cen_ch_2 = 0; - op->cen_ch_1 = op->prim_ch; -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(wdev->PhyMode)) { - op->ht_bw = cfg->ht_bw; - op->ext_cha = cfg->ext_cha; - ht_ext_cha_adjust(wdev->sys_handle, op->prim_ch, &op->ht_bw, - &op->ext_cha, wdev); - } - -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(wdev->PhyMode)) - op->vht_bw = - (op->ht_bw >= HT_BW_40) ? cfg->vht_bw : VHT_BW_2040; - -#endif /*DOT11_VHT_AC*/ - op->bw = phy_bw_adjust(op->ht_bw, op->vht_bw); - /*check region capability*/ - reg_cap_bw = get_channel_bw_cap(wdev, op->prim_ch); - - if ((op->bw > reg_cap_bw) && (!sec_ch_2_80_capable)) { - if (!(op->bw == BW_8080 && reg_cap_bw == BW_160)) { - op->bw = reg_cap_bw; - phy_ht_vht_bw_adjust(op->bw, &op->ht_bw, &op->vht_bw); - } - } - - /*central ch*/ - if (op->bw == BW_40) { - if (cal_ht_cent_ch(op->prim_ch, op->bw, op->ext_cha, - &op->cen_ch_1) != TRUE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : buggy here.\n", __func__)); - return FALSE; - } - } - -#ifdef DOT11_VHT_AC - else if (op->bw > BW_40) - op->cen_ch_1 = vht_cent_ch_freq(op->prim_ch, op->vht_bw); - - if (op->bw == BW_8080) - op->cen_ch_2 = cfg->cen_ch_2; - -#endif /*DOT11_VHT_AC*/ -#endif /*DOT11_N_SUPPORT*/ - return TRUE; -} - -static VOID phy_freq_update(struct wifi_dev *wdev, struct freq_oper *oper) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; -#ifdef RT_CFG80211_SUPPORT - struct _RTMP_ADAPTER *ad = NULL; - ADD_HT_INFO_IE *addht; - addht = wlan_operate_get_addht(wdev); - ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; -#endif - op->phy_oper.prim_ch = oper->prim_ch; - operate_loader_prim_ch(op); - op->phy_oper.cen_ch_1 = oper->cen_ch_1; - op->phy_oper.cen_ch_2 = oper->cen_ch_2; - op->phy_oper.wdev_bw = oper->bw; - op->ht_oper.ht_bw = oper->ht_bw; -#ifdef RT_CFG80211_SUPPORT - if ((ad->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq == 1) && - (ad->MacTab.fAnyStaFortyIntolerant != TRUE) && - ((ad->CommonCfg.BssCoexApCnt > 0))) { - } else -#endif - operate_loader_ht_bw(op); - - op->ht_oper.ext_cha = oper->ext_cha; -#ifdef RT_CFG80211_SUPPORT - if ((ad->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq == 1) && - (ad->MacTab.fAnyStaFortyIntolerant != TRUE) && - ((ad->CommonCfg.BssCoexApCnt > 0))) { - } else -#endif - operate_loader_ext_cha(op); -#ifdef DOT11_VHT_AC - op->vht_oper.vht_bw = oper->vht_bw; - operate_loader_vht_bw(op); -#endif /*DOT11_VHT_AC*/ -} - -static VOID phy_freq_get_max(struct wifi_dev *wdev, struct freq_oper *result) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - if (op->phy_oper.prim_ch != result->prim_ch) - return; - - /*bw*/ - if (op->phy_oper.wdev_bw > result->bw) { - result->bw = op->phy_oper.wdev_bw; - result->cen_ch_1 = op->phy_oper.cen_ch_1; - result->cen_ch_2 = op->phy_oper.cen_ch_2; - result->ext_cha = op->ht_oper.ext_cha; - } -} - -static VOID phy_freq_decision(struct wifi_dev *wdev, struct freq_oper *want, - struct freq_oper *result) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - struct wifi_dev *cur_wdev; - UCHAR i; - /*basic setting*/ - os_move_mem(result, want, sizeof(struct freq_oper)); - - /*check max capability for each operating*/ - for (i = 0; i < WDEV_NUM_MAX; i++) { - cur_wdev = ad->wdev_list[i]; - - if (cur_wdev && wlan_operate_get_state(cur_wdev) && - wmode_band_equal(wdev->PhyMode, cur_wdev->PhyMode)) - phy_freq_get_max(cur_wdev, result); - } -} - -/* -* Utility -*/ -VOID phy_freq_get_cfg(struct wifi_dev *wdev, struct freq_cfg *fcfg) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; -#ifdef BW_VENDOR10_CUSTOM_FEATURE - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; -#endif - - os_zero_mem(fcfg, sizeof(struct freq_cfg)); - fcfg->prim_ch = wdev->channel; - fcfg->cen_ch_2 = cfg->phy_conf.cen_ch_2; -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (IS_APCLI_SYNC_PEER_DEAUTH_ENBL(pAd)) { - fcfg->ht_bw = wlan_operate_get_ht_bw(wdev); - fcfg->ext_cha = wlan_operate_get_ext_cha(wdev); - fcfg->vht_bw = wlan_operate_get_vht_bw(wdev); - } else { -#endif - fcfg->ht_bw = cfg->ht_conf.ht_bw; - fcfg->ext_cha = cfg->ht_conf.ext_cha; - fcfg->vht_bw = cfg->vht_conf.vht_bw; -#ifdef BW_VENDOR10_CUSTOM_FEATURE - } -#endif -} - -/* -* Configure loader -*/ - -/* -* Operater loader -*/ -VOID operate_loader_prim_ch(struct wlan_operate *op) -{ - UCHAR prim_ch = op->phy_oper.prim_ch; - - op->ht_status.addht.ControlChan = prim_ch; -} - -/* -* -*/ -VOID operate_loader_phy(struct wifi_dev *wdev, struct freq_cfg *cfg) -{ - struct freq_oper oper_dev; - struct freq_oper oper_radio; - struct radio_res res; - struct wifi_dev *tdev = NULL; - UCHAR i = 0; - UCHAR band_idx = 0; - struct _RTMP_ADAPTER *ad = NULL; - if (wdev == NULL) - return; - ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): oper_cfg: prim_ch(%d), ht_bw(%d), extcha(%d), vht_bw(%d), cen_ch_2(%d), PhyMode=%d!\n", - __func__, cfg->prim_ch, cfg->ht_bw, cfg->ext_cha, cfg->vht_bw, - cfg->cen_ch_2, wdev->PhyMode)); - os_zero_mem(&oper_dev, sizeof(oper_dev)); - if (!phy_freq_adjust(wdev, cfg, &oper_dev)) - goto end; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): oper_dev after adjust: bw(%d), prim_ch(%d), cen_ch_1(%d), cen_ch_2(%d),ext_cha(%d)!\n", - __func__, oper_dev.bw, oper_dev.prim_ch, oper_dev.cen_ch_1, - oper_dev.cen_ch_2, oper_dev.ext_cha)); - /*get last radio result for hdev check and update*/ - phy_freq_decision(wdev, &oper_dev, &oper_radio); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): oper_radio after decision: bw(%d), prim_ch(%d), cen_ch_1(%d), cen_ch_2(%d)!\n", - __func__, oper_radio.bw, oper_radio.prim_ch, - oper_radio.cen_ch_1, oper_radio.cen_ch_2)); - /*acquire radio resouce*/ - res.reason = REASON_NORMAL_SW; -#ifdef OFFCHANNEL_SCAN_FEATURE - if (ad->ScanCtrl.state == OFFCHANNEL_SCAN_START) { - res.reason = REASON_NORMAL_SCAN; - } -#endif - res.oper = &oper_radio; - -#ifdef CONFIG_AP_SUPPORT -#ifdef MT_DFS_SUPPORT - /*Perform CAC only for DFS Channel*/ - if (RadarChannelCheck(ad, oper_radio.prim_ch)) - DfsCacNormalStart(ad, wdev, RD_SILENCE_MODE); -#endif -#endif - - if (hc_radio_res_request(wdev, &res) != TRUE) { - /*can't get radio resource, update operating to radio setting*/ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): oper_dev request radio fail! bw(%d), prim_ch(%d), cen_ch_1(%d), cen_ch_2(%d)!\n", - __func__, oper_dev.bw, oper_dev.prim_ch, - oper_dev.cen_ch_1, oper_dev.cen_ch_2)); - return; - } - -#ifdef CONFIG_AP_SUPPORT -#ifdef MT_DFS_SUPPORT - DfsCacNormalStart(ad, wdev, RD_NORMAL_MODE); - /*Perform CAC & Radar Detect only for DFS Channel*/ - if (RadarChannelCheck(ad, oper_radio.prim_ch)) { - WrapDfsRadarDetectStart(ad, wdev); - } -#endif -#endif - -end: - wdev_sync_prim_ch(ad, wdev); - band_idx = HcGetBandByWdev(wdev); - for (i = 0; i < WDEV_NUM_MAX; i++) { - tdev = ad->wdev_list[i]; - if (tdev && HcIsRadioAcq(tdev) && - (band_idx == HcGetBandByWdev(tdev))) - phy_freq_update(tdev, &oper_dev); - } -} - -/* -* export function -*/ - -/* -* operation function -*/ -UCHAR wlan_operate_get_bw(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->phy_oper.wdev_bw; -} - -UCHAR wlan_operate_get_prim_ch(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->phy_oper.prim_ch; -} - -INT32 wlan_operate_set_prim_ch(struct wifi_dev *wdev, UCHAR prim_ch) -{ - struct freq_cfg cfg; - - phy_freq_get_cfg(wdev, &cfg); - cfg.prim_ch = prim_ch; - operate_loader_phy(wdev, &cfg); - return WLAN_OPER_OK; -} - -INT32 wlan_operate_set_phy(struct wifi_dev *wdev, struct freq_cfg *cfg) -{ - operate_loader_phy(wdev, cfg); - return WLAN_OPER_OK; -} - -INT32 wlan_operate_set_tx_stream(struct wifi_dev *wdev, UINT8 tx_stream) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - op->phy_oper.tx_stream = tx_stream; - return WLAN_OPER_OK; -} - -INT32 wlan_operate_set_rx_stream(struct wifi_dev *wdev, UINT8 rx_stream) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - op->phy_oper.rx_stream = rx_stream; - return WLAN_OPER_OK; -} - -UCHAR wlan_operate_get_cen_ch_2(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->phy_oper.cen_ch_2; -} - -INT32 wlan_operate_set_cen_ch_2(struct wifi_dev *wdev, UCHAR cen_ch_2) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - struct freq_cfg cfg; - - if (op->phy_oper.cen_ch_2 == cen_ch_2) - return WLAN_OPER_OK; - - phy_freq_get_cfg(wdev, &cfg); - cfg.cen_ch_2 = cen_ch_2; - operate_loader_phy(wdev, &cfg); - return WLAN_OPER_OK; -} - -UCHAR wlan_operate_get_cen_ch_1(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->phy_oper.cen_ch_1; -} - -UINT8 wlan_operate_get_tx_stream(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->phy_oper.tx_stream; -} - -UINT8 wlan_operate_get_rx_stream(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->phy_oper.rx_stream; -} - -BOOLEAN wlan_operate_scan(struct wifi_dev *wdev, UCHAR prim_ch) -{ - struct radio_res radio, *res = &radio; - struct freq_oper oper; - BOOLEAN ret; - - os_zero_mem(&oper, sizeof(oper)); - res->oper = &oper; - oper.bw = BW_20; - oper.cen_ch_1 = prim_ch; - oper.ext_cha = EXTCHA_NONE; - oper.ht_bw = HT_BW_20; -#ifdef DOT11_VHT_AC - oper.cen_ch_2 = 0; - oper.vht_bw = VHT_BW_2040; -#endif /*DOT11_VHT_AC*/ - oper.prim_ch = prim_ch; - res->reason = REASON_NORMAL_SCAN; - ret = hc_radio_res_request(wdev, res); - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_vht.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_vht.c deleted file mode 100644 index 84abc1fa77..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/be_vht.c +++ /dev/null @@ -1,112 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#include "rt_config.h" -#include "mgmt/be_internal.h" - -/* -*vht phy related -*/ -#ifdef DOT11_VHT_AC -VOID vht_oper_init(struct wifi_dev *wdev, struct vht_op *obj) -{ -#ifdef BW_VENDOR10_CUSTOM_FEATURE - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; - if (IS_APCLI_SYNC_PEER_DEAUTH_ENBL(pAd)) - obj->vht_bw = wlan_operate_get_vht_bw(wdev); - else -#endif - obj->vht_bw = VHT_BW_80; -} - -VOID vht_oper_exit(struct vht_op *obj) -{ - os_zero_mem(obj, sizeof(*obj)); -} - -/* -* internal used configure loader -*/ -VOID operate_loader_vht_bw(struct wlan_operate *op) -{ -} - -VOID operate_loader_vht_ldpc(struct wlan_operate *op, UCHAR vht_ldpc) -{ - op->vht_oper.vht_ldpc = vht_ldpc; - op->vht_status.vht_cap.rx_ldpc = vht_ldpc; -} -/* -* exported operation function. -*/ -/* -* Set -*/ -INT32 wlan_operate_set_vht_bw(struct wifi_dev *wdev, UCHAR vht_bw) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - UCHAR cap_vht_bw = wlan_config_get_vht_bw(wdev); - INT32 ret = WLAN_OPER_OK; - struct freq_cfg cfg; - - if (vht_bw == op->vht_oper.vht_bw) - return ret; - - if (vht_bw > cap_vht_bw) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): new vht_bw:%d > cap_vht_bw: %d, correct to cap_vht_bw\n", - __func__, vht_bw, cap_vht_bw)); - vht_bw = cap_vht_bw; - ret = WLAN_OPER_FAIL; - } - - /*configure loader*/ - phy_freq_get_cfg(wdev, &cfg); - cfg.vht_bw = vht_bw; - operate_loader_phy(wdev, &cfg); - return ret; -} - -INT32 wlan_operate_set_vht_ldpc(struct wifi_dev *wdev, UCHAR vht_ldpc) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - INT32 ret = WLAN_OPER_OK; - - if (wdev && wdev->wpf_op) - operate_loader_vht_ldpc(op, vht_ldpc); - - return ret; -} -/* -* Get -*/ -UCHAR wlan_operate_get_vht_bw(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->vht_oper.vht_bw; -} - -UCHAR wlan_operate_get_vht_ldpc(struct wifi_dev *wdev) -{ - struct wlan_operate *op = (struct wlan_operate *)wdev->wpf_op; - - return op->vht_oper.vht_ldpc; -} -#endif /* DOT11_VHT_AC */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/bss_ops.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/bss_ops.c deleted file mode 100644 index 57414a0a0a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/bss_ops.c +++ /dev/null @@ -1,1393 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - bss.c - - Abstract: - - Revision History: - Who When What - -------- ---------- -------------------------------------------- - 2016-08-25 AP/APCLI/STA SYNC FSM Integration -*/ - -#include "rt_config.h" - -UCHAR CISCO_OUI[] = { 0x00, 0x40, 0x96 }; -UCHAR RALINK_OUI[] = { 0x00, 0x0c, 0x43 }; -UCHAR WPA_OUI[] = { 0x00, 0x50, 0xf2, 0x01 }; -UCHAR RSN_OUI[] = { 0x00, 0x0f, 0xac }; -UCHAR WAPI_OUI[] = { 0x00, 0x14, 0x72 }; -UCHAR WME_INFO_ELEM[] = { 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01 }; -UCHAR WME_PARM_ELEM[] = { 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01 }; -UCHAR BROADCOM_OUI[] = { 0x00, 0x90, 0x4c }; -UCHAR MARVELL_OUI[] = { 0x00, 0x50, 0x43 }; -UCHAR ATHEROS_OUI[] = { 0x00, 0x03, 0x7F }; -UCHAR WPS_OUI[] = { 0x00, 0x50, 0xf2, 0x04 }; -#if defined(WH_EZ_SETUP) || defined(MWDS) || defined(WAPP_SUPPORT) -UCHAR MTK_OUI[] = { 0x00, 0x0c, 0xe7 }; -#endif /* WH_EZ_SETUP || MWDS */ - -#ifdef DPP_SUPPORT -UCHAR DPP_OUI[] = { 0x50, 0x6f, 0x9a, 0x02 }; -#endif /* DPP_SUPPORT */ - -#ifdef IGMP_TVM_SUPPORT -UCHAR IGMP_TVM_OUI[] = { 0x00, 0x0D, 0x02, 0x03 }; -#endif /* IGMP_TVM_SUPPORT */ -#ifdef OCE_SUPPORT -UCHAR MBO_OCE_OUIBYTE[] = { 0x50, 0x6f, 0x9a, 0x16 }; -#endif - -extern UCHAR WPA_OUI[]; -extern UCHAR SES_OUI[]; - -UCHAR ZeroSsid[MAX_LEN_OF_SSID] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 }; - -static VOID BssCipherParse(BSS_ENTRY *pBss) -{ - PEID_STRUCT pEid; - PUCHAR pTmp; - PRSN_IE_HEADER_STRUCT pRsnHeader; - PCIPHER_SUITE_STRUCT pCipher; - PAKM_SUITE_STRUCT pAKM; - USHORT Count; - SHORT Length; - UCHAR end_field = 0; - UCHAR res = TRUE; - /* WepStatus will be reset later, if AP announce TKIP or AES on the beacon frame.*/ - CLEAR_SEC_AKM(pBss->AKMMap); - CLEAR_CIPHER(pBss->PairwiseCipher); - CLEAR_CIPHER(pBss->GroupCipher); - Length = (SHORT)pBss->VarIELen; - - while (Length > 0) { - /* Parse cipher suite base on WPA1 & WPA2, they should be parsed differently*/ - pTmp = ((PUCHAR)pBss->VarIEs) + pBss->VarIELen - - ((USHORT)Length); - pEid = (PEID_STRUCT)pTmp; - - switch (pEid->Eid) { - case IE_WPA: - if (NdisEqualMemory(pEid->Octet, SES_OUI, 3) && - (pEid->Len == 7)) { - pBss->bSES = TRUE; - break; - } else if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4) != - 1) { - /* if unsupported vendor specific IE*/ - break; - } - - /* - Skip OUI, version, and multicast suite - This part should be improved in the future when AP supported multiple cipher suite. - For now, it's OK since almost all APs have fixed cipher suite supported. - */ - /* pTmp = (PUCHAR) pEid->Octet;*/ - pTmp += 11; - - /* - Cipher Suite Selectors from Spec P802.11i/D3.2 P26. - Value Meaning - 0 None - 1 WEP-40 - 2 Tkip - 3 WRAP - 4 AES - 5 WEP-104 - */ - /* Parse group cipher*/ - switch (*pTmp) { - case 1: - SET_CIPHER_WEP40(pBss->GroupCipher); - break; - - case 5: - SET_CIPHER_WEP104(pBss->GroupCipher); - break; - - case 2: - SET_CIPHER_TKIP(pBss->GroupCipher); - break; - - case 4: - SET_CIPHER_CCMP128(pBss->GroupCipher); - break; - - default: - break; - } - - /* number of unicast suite*/ - pTmp += 1; - /* skip all unicast cipher suites*/ - /*Count = *(PUSHORT) pTmp; */ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - - /* Parsing all unicast cipher suite*/ - while (Count > 0) { - /* Skip OUI*/ - pTmp += 3; - - switch (*pTmp) { - case 1: - SET_CIPHER_WEP40(pBss->PairwiseCipher); - break; - - case 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway*/ - SET_CIPHER_WEP104(pBss->PairwiseCipher); - break; - - case 2: - SET_CIPHER_TKIP(pBss->PairwiseCipher); - break; - - case 4: - SET_CIPHER_CCMP128( - pBss->PairwiseCipher); - break; - - default: - break; - } - - pTmp++; - Count--; - } - - /* 4. get AKM suite counts*/ - /*Count = *(PUSHORT) pTmp;*/ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - pTmp += 3; - - switch (*pTmp) { - case 1: - /* Set AP support WPA-enterprise mode*/ - SET_AKM_WPA1(pBss->AKMMap); - break; - - case 2: - /* Set AP support WPA-PSK mode*/ - SET_AKM_WPA1PSK(pBss->AKMMap); - break; - - default: - break; - } - - pTmp += 1; - - /* Fixed for WPA-None*/ - if (pBss->BssType == BSS_ADHOC) - SET_AKM_WPANONE(pBss->AKMMap); - - break; - - case IE_RSN: - pRsnHeader = (PRSN_IE_HEADER_STRUCT)pTmp; - res = wpa_rsne_sanity(pTmp, pRsnHeader->Length + 2, - &end_field); - - if (res == FALSE) - break; - - if (end_field < RSN_FIELD_GROUP_CIPHER) - SET_CIPHER_CCMP128(pBss->GroupCipher); - if (end_field < RSN_FIELD_PAIRWISE_CIPHER) - SET_CIPHER_CCMP128(pBss->PairwiseCipher); - if (end_field < RSN_FIELD_AKM) - SET_AKM_WPA2(pBss->AKMMap); - - /* 0. Version must be 1*/ - if (le2cpu16(pRsnHeader->Version) != 1) - break; - - /* 1. Check group cipher*/ - if (end_field < RSN_FIELD_GROUP_CIPHER) - break; - - pTmp += sizeof(RSN_IE_HEADER_STRUCT); - /* 1. Check group cipher*/ - pCipher = (PCIPHER_SUITE_STRUCT)pTmp; - - if (!RTMPEqualMemory(&pCipher->Oui, RSN_OUI, 3)) - break; - - /* Parse group cipher*/ - switch (pCipher->Type) { - case 1: - SET_CIPHER_WEP40(pBss->GroupCipher); - break; - - case 2: - SET_CIPHER_TKIP(pBss->GroupCipher); - break; - - case 4: - SET_CIPHER_CCMP128(pBss->GroupCipher); - break; - - case 5: - SET_CIPHER_WEP104(pBss->GroupCipher); - break; - - case 8: - SET_CIPHER_GCMP128(pBss->GroupCipher); - break; - - case 9: - SET_CIPHER_GCMP256(pBss->GroupCipher); - break; - - case 10: - SET_CIPHER_CCMP256(pBss->GroupCipher); - break; - - default: - break; - } - - /* set to correct offset for next parsing*/ - pTmp += sizeof(CIPHER_SUITE_STRUCT); - /* 2. Get pairwise cipher counts*/ - if (end_field < RSN_FIELD_PAIRWISE_CIPHER) - break; - /*Count = *(PUSHORT) pTmp;*/ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - - /* 3. Get pairwise cipher*/ - /* Parsing all unicast cipher suite*/ - while (Count > 0) { - /* Skip OUI*/ - pCipher = (PCIPHER_SUITE_STRUCT)pTmp; - - switch (pCipher->Type) { - case 1: - SET_CIPHER_WEP40(pBss->PairwiseCipher); - break; - - case 2: - SET_CIPHER_TKIP(pBss->PairwiseCipher); - break; - - case 4: - SET_CIPHER_CCMP128( - pBss->PairwiseCipher); - break; - - case 5: - SET_CIPHER_WEP104(pBss->PairwiseCipher); - break; - - case 8: - SET_CIPHER_GCMP128( - pBss->PairwiseCipher); - break; - - case 9: - SET_CIPHER_GCMP256( - pBss->PairwiseCipher); - break; - - case 10: - SET_CIPHER_CCMP256( - pBss->PairwiseCipher); - break; - - default: - break; - } - - pTmp += sizeof(CIPHER_SUITE_STRUCT); - Count--; - } - - /* 4. get AKM suite counts*/ - if (end_field < RSN_FIELD_AKM) - break; - /*Count = *(PUSHORT) pTmp;*/ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - - /* 5. Get AKM ciphers*/ - /* Parsing all AKM ciphers*/ - while (Count > 0) { - pAKM = (PAKM_SUITE_STRUCT)pTmp; - - if (!RTMPEqualMemory(pTmp, RSN_OUI, 3) -#ifdef DPP_SUPPORT - && !RTMPEqualMemory(pTmp, DPP_OUI, 3) -#endif /* DPP_SUPPORT */ - ) - break; - - switch (pAKM->Type) { - case 0: - SET_AKM_WPANONE(pBss->AKMMap); - break; - - case 1: - SET_AKM_WPA2(pBss->AKMMap); - break; - - case 2: -#ifdef DPP_SUPPORT - if (RTMPEqualMemory(pTmp, RSN_OUI, 3)) - SET_AKM_WPA2PSK(pBss->AKMMap); - else if (!RTMPEqualMemory(pTmp, DPP_OUI, - 3)) - SET_AKM_DPP(pBss->AKMMap); -#else - SET_AKM_WPA2PSK(pBss->AKMMap); -#endif /* DPP_SUPPORT */ - break; - - case 3: - SET_AKM_FT_WPA2(pBss->AKMMap); - break; - - case 4: - SET_AKM_FT_WPA2PSK(pBss->AKMMap); - break; -#ifdef DOT11W_PMF_SUPPORT - - case 5: - /* SET_AKM_WPA2_SHA256(pBss->AKMMap); */ - SET_AKM_WPA2(pBss->AKMMap); - pBss->IsSupportSHA256KeyDerivation = - TRUE; - break; - - case 6: - /* SET_AKM_WPA2PSK_SHA256(pBss->AKMMap); */ - SET_AKM_WPA2PSK(pBss->AKMMap); - pBss->IsSupportSHA256KeyDerivation = - TRUE; - break; -#endif /* DOT11W_PMF_SUPPORT */ - - case 7: - SET_AKM_TDLS(pBss->AKMMap); - break; - - case 8: - SET_AKM_SAE_SHA256(pBss->AKMMap); - break; - - case 9: - SET_AKM_FT_SAE_SHA256(pBss->AKMMap); - break; - - case 11: - SET_AKM_SUITEB_SHA256(pBss->AKMMap); - break; - - case 12: - SET_AKM_SUITEB_SHA384(pBss->AKMMap); - break; - - case 13: - SET_AKM_FT_WPA2_SHA384(pBss->AKMMap); - break; - - case 18: - SET_AKM_OWE(pBss->AKMMap); - break; - - default: - break; - } - - pTmp += sizeof(AKM_SUITE_STRUCT); - Count--; - } - - /* Fixed for WPA-None*/ - if (pBss->BssType == BSS_ADHOC) - SET_AKM_WPANONE(pBss->AKMMap); - - /* 6. Get RSN capability*/ - if (end_field < RSN_FIELD_RSN_CAP) - break; - /*pBss->WPA2.RsnCapability = *(PUSHORT) pTmp;*/ - pBss->RsnCapability = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - break; - case IE_RSNXE: -#ifdef DOT11_SAE_SUPPORT - if (pEid->Octet[0] & (1 << IE_RSNXE_CAPAB_SAE_H2E)) - pBss->use_h2e_connect = TRUE; - pBss->rsnxe_len = pEid->Len + 2; - NdisMoveMemory(pBss->rsnxe_content, (UCHAR *)pEid, - pBss->rsnxe_len); -#endif - break; - - default: - break; - } - - Length -= (pEid->Len + 2); - } - - if (pBss->AKMMap == 0x0) { - SET_AKM_OPEN(pBss->AKMMap); - - if (pBss->Privacy) { - SET_AKM_SHARED(pBss->AKMMap); - SET_CIPHER_WEP(pBss->PairwiseCipher); - SET_CIPHER_WEP(pBss->GroupCipher); - } else { - SET_CIPHER_NONE(pBss->PairwiseCipher); - SET_CIPHER_NONE(pBss->GroupCipher); - } - } -} - -/*! \brief initialize BSS table - * \param p_tab pointer to the table - * \return none - * \pre - * \post - - IRQL = PASSIVE_LEVEL - IRQL = DISPATCH_LEVEL - - */ -VOID BssTableInit(BSS_TABLE *Tab) -{ - int i; - - Tab->BssNr = 0; - Tab->BssOverlapNr = 0; - - for (i = 0; i < MAX_LEN_OF_BSS_TABLE; i++) { - UCHAR *pOldAddr = Tab->BssEntry[i].pVarIeFromProbRsp; - - NdisZeroMemory(&Tab->BssEntry[i], sizeof(BSS_ENTRY)); - Tab->BssEntry[i].Rssi = - -127; /* initial the rssi as a minimum value */ - - if (pOldAddr) { - RTMPZeroMemory(pOldAddr, MAX_VIE_LEN); - Tab->BssEntry[i].pVarIeFromProbRsp = pOldAddr; - } - } -} - -#if defined(DBDC_MODE) -/* - backup the other band's scan result, and init the Band from input. - - Band 0 : init 2.4G - Band 1 : init 5G -*/ -VOID BssTableInitByBand(BSS_TABLE *Tab, UCHAR Band) -{ - int i; - INT bss_2G_cnt = 0; - INT bss_5G_cnt = 0; - INT bss_backup_cnt = 0; - UCHAR *pOldAddr = NULL; - BSS_TABLE *tab_buf = NULL; - - /* check the total 2.4G/5G BSS */ - if (Tab->BssNr > 0) { - for (i = 0; i < Tab->BssNr; i++) { - if (Tab->BssEntry[i].Channel > 14) - bss_5G_cnt++; - else - bss_2G_cnt++; - } - } - - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): ==> Band=%u, bss_2G_cnt=%d, bss_5G_cnt=%d\n", - __FUNCTION__, Band, bss_2G_cnt, bss_5G_cnt)); - - if (((Band == 0) && bss_5G_cnt) || ((Band == 1) && bss_2G_cnt)) { - os_alloc_mem(NULL, (UCHAR **)&tab_buf, sizeof(BSS_TABLE)); - - if (tab_buf == NULL) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): alloc tab_buf fail!!\n", - __FUNCTION__)); - return; - } - - /* backup the dedicated band */ - for (i = 0; i < Tab->BssNr; i++) { - if (((Tab->BssEntry[i].Channel > 14) && - (Band == 0)) /* init 2.4G, backup 5G */ - || ((Tab->BssEntry[i].Channel > 0) && - (Tab->BssEntry[i].Channel <= 14) && - (Band == 1))) /* init 5G, backup 2.4G */ { - pOldAddr = Tab->BssEntry[i].pVarIeFromProbRsp; - os_move_mem(&tab_buf->BssEntry[bss_backup_cnt], - &Tab->BssEntry[i], - sizeof(BSS_ENTRY)); - if (Tab->BssEntry[i].VarIeFromProbeRspLen && - pOldAddr) - os_move_mem( - tab_buf->BssEntry[bss_backup_cnt] - .pVarIeFromProbRsp, - pOldAddr, - Tab->BssEntry[i] - .VarIeFromProbeRspLen); - bss_backup_cnt++; - } - } - - tab_buf->BssNr = bss_backup_cnt; - tab_buf->BssOverlapNr = 0; - /* MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): ==> Band=%u, bss_2G_cnt=%d, bss_5G_cnt=%d, bss_backup_cnt=%d\n",__FUNCTION__,Band, bss_2G_cnt, bss_5G_cnt, bss_backup_cnt)); */ - /* reset the global table */ - BssTableInit(Tab); - /* restore the backup band */ - for (i = 0; i < bss_backup_cnt; i++) { - pOldAddr = tab_buf->BssEntry[i].pVarIeFromProbRsp; - os_move_mem(&Tab->BssEntry[i], &tab_buf->BssEntry[i], - sizeof(BSS_ENTRY)); - - if (tab_buf->BssEntry[i].VarIeFromProbeRspLen && - pOldAddr) - os_move_mem( - Tab->BssEntry[i].pVarIeFromProbRsp, - pOldAddr, - Tab->BssEntry[i].VarIeFromProbeRspLen); - } - - Tab->BssNr = tab_buf->BssNr; - Tab->BssOverlapNr = tab_buf->BssOverlapNr; - - /* MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s(): <== Band=%u, Tab->BssNr=%d\n",__FUNCTION__,Band, Tab->BssNr)); */ - if (tab_buf != NULL) - os_free_mem(tab_buf); - } else { /* no need to backup, reset the global table */ - BssTableInit(Tab); - } -} -#endif /* defined(DBDC_MODE) && defined(DOT11K_RRM_SUPPORT) */ - -/*! \brief search the BSS table by SSID - * \param p_tab pointer to the bss table - * \param ssid SSID string - * \return index of the table, BSS_NOT_FOUND if not in the table - * \pre - * \post - * \note search by sequential search - - IRQL = DISPATCH_LEVEL - - */ -ULONG BssTableSearch(BSS_TABLE *Tab, UCHAR *pBssid, UCHAR Channel) -{ - UCHAR i; - - for (i = 0; i < Tab->BssNr && Tab->BssNr < MAX_LEN_OF_BSS_TABLE; i++) { - /* - Some AP that support A/B/G mode that may used the same BSSID on 11A and 11B/G. - We should distinguish this case. - */ - if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) || - ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) && - MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid)) - return i; - } - - return (ULONG)BSS_NOT_FOUND; -} - -ULONG BssSsidTableSearch(IN BSS_TABLE *Tab, IN PUCHAR pBssid, IN PUCHAR pSsid, - IN UCHAR SsidLen, IN UCHAR Channel) -{ - UCHAR i; - - for (i = 0; i < Tab->BssNr && Tab->BssNr < MAX_LEN_OF_BSS_TABLE; i++) { - /* Some AP that support A/B/G mode that may used the same BSSID on 11A and 11B/G.*/ - /* We should distinguish this case.*/ - /* */ - if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) || - ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) && - MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid) && - SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, - Tab->BssEntry[i].SsidLen)) - return i; - } - - return (ULONG)BSS_NOT_FOUND; -} - -ULONG BssTableSearchWithSSID(IN BSS_TABLE *Tab, IN PUCHAR Bssid, - IN PUCHAR pSsid, IN UCHAR SsidLen, - IN UCHAR Channel) -{ - UCHAR i; - - for (i = 0; i < Tab->BssNr && Tab->BssNr < MAX_LEN_OF_BSS_TABLE; i++) { - if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) || - ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) && - MAC_ADDR_EQUAL(&(Tab->BssEntry[i].Bssid), Bssid) && - (SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, - Tab->BssEntry[i].SsidLen) || - (NdisEqualMemory(pSsid, ZeroSsid, SsidLen)) || - (NdisEqualMemory(Tab->BssEntry[i].Ssid, ZeroSsid, - Tab->BssEntry[i].SsidLen)))) - return i; - } - - return (ULONG)BSS_NOT_FOUND; -} - -ULONG BssSsidTableSearchBySSID(BSS_TABLE *Tab, UCHAR *pSsid, UCHAR SsidLen) -{ - UCHAR i; - - for (i = 0; i < Tab->BssNr && Tab->BssNr < MAX_LEN_OF_BSS_TABLE; i++) { - if (SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, - Tab->BssEntry[i].SsidLen)) - return i; - } - - return (ULONG)BSS_NOT_FOUND; -} - -VOID BssTableDeleteEntry(BSS_TABLE *Tab, UCHAR *pBssid, UCHAR Channel) -{ - UCHAR i, j; - - for (i = 0; i < Tab->BssNr && Tab->BssNr < MAX_LEN_OF_BSS_TABLE; i++) { - if ((Tab->BssEntry[i].Channel == Channel) && - (MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid))) { - UCHAR *pOldAddr = NULL; - - for (j = i; j < Tab->BssNr - 1; j++) { - pOldAddr = Tab->BssEntry[j].pVarIeFromProbRsp; - NdisMoveMemory(&(Tab->BssEntry[j]), - &(Tab->BssEntry[j + 1]), - sizeof(BSS_ENTRY)); - - if (pOldAddr) { - RTMPZeroMemory(pOldAddr, MAX_VIE_LEN); - NdisMoveMemory( - pOldAddr, - Tab->BssEntry[j + 1] - .pVarIeFromProbRsp, - Tab->BssEntry[j + 1] - .VarIeFromProbeRspLen); - Tab->BssEntry[j].pVarIeFromProbRsp = - pOldAddr; - } - } - - pOldAddr = - Tab->BssEntry[Tab->BssNr - 1].pVarIeFromProbRsp; - NdisZeroMemory(&(Tab->BssEntry[Tab->BssNr - 1]), - sizeof(BSS_ENTRY)); - - if (pOldAddr) { - RTMPZeroMemory(pOldAddr, MAX_VIE_LEN); - Tab->BssEntry[Tab->BssNr - 1].pVarIeFromProbRsp = - pOldAddr; - } - - Tab->BssNr -= 1; - return; - } - } -} - -#ifdef CONFIG_OWE_SUPPORT -static VOID update_bss_by_owe_trans(struct _RTMP_ADAPTER *ad, ULONG bss_idx, - UCHAR *pair_bssid, UCHAR *pair_ssid, - UCHAR pair_ssid_len) -{ - BSS_ENTRY *extracted_trans_bss = &ad->ScanTab.BssEntry[bss_idx]; - - if (MAC_ADDR_EQUAL(extracted_trans_bss->Bssid, pair_bssid)) { - if (extracted_trans_bss->Hidden == 1) { - /*double confirm the hidden bss is OWE AKM*/ - if (!IS_AKM_OWE(extracted_trans_bss->AKMMap)) - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : %02x-%02x-%02x-%02x-%02x-%02x, hidden SSID but not OWE_AKM:0x%x!?\n", - __func__, - PRINT_MAC(extracted_trans_bss->Bssid), - extracted_trans_bss->AKMMap)); - - extracted_trans_bss->hide_owe_bss = TRUE; - - extracted_trans_bss->bhas_owe_trans_ie = TRUE; - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : %02x-%02x-%02x-%02x-%02x-%02x, update hidden SSID:%s\n", - __func__, - PRINT_MAC(extracted_trans_bss->Bssid), - extracted_trans_bss->Ssid)); - } - } -} -#endif - -/*! \brief - * \param - * \return - * \pre - * \post - */ -VOID BssEntrySet(IN RTMP_ADAPTER *pAd, OUT BSS_ENTRY *pBss, - IN BCN_IE_LIST *ie_list, IN CHAR Rssi, IN USHORT LengthVIE, - IN PNDIS_802_11_VARIABLE_IEs pVIE -#ifdef CONFIG_AP_SUPPORT -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - , - IN UCHAR *Snr, IN CHAR *rssi -#endif -#endif -) - -{ -#ifdef NEIGHBORING_AP_STAT - UINT8 index = SCAN_RESULT_2G; - SCAN_RPT_ITEM *item = NULL; - UCHAR idx = 0; - BOOLEAN Bssid_Found = FALSE; -#endif - COPY_MAC_ADDR(pBss->Bssid, ie_list->Bssid); - /* Default Hidden SSID to be TRUE, it will be turned to FALSE after coping SSID*/ - pBss->Hidden = 1; - pBss->FromBcnReport = ie_list->FromBcnReport; - - if (ie_list->SsidLen > 0) { - /* For hidden SSID AP, it might send beacon with SSID len equal to 0*/ - /* Or send beacon /probe response with SSID len matching real SSID length,*/ - /* but SSID is all zero. such as "00-00-00-00" with length 4.*/ - /* We have to prevent this case overwrite correct table*/ - if (NdisEqualMemory(ie_list->Ssid, ZeroSsid, - ie_list->SsidLen) == 0) { - NdisZeroMemory(pBss->Ssid, MAX_LEN_OF_SSID); - NdisMoveMemory(pBss->Ssid, ie_list->Ssid, - ie_list->SsidLen); - pBss->SsidLen = ie_list->SsidLen; - pBss->Hidden = 0; - } - } else { - /* avoid Hidden SSID form beacon to overwirite correct SSID from probe response */ - if (NdisEqualMemory(pBss->Ssid, ZeroSsid, pBss->SsidLen)) { - NdisZeroMemory(pBss->Ssid, MAX_LEN_OF_SSID); - pBss->SsidLen = 0; - } - } - - pBss->BssType = ie_list->BssType; - pBss->BeaconPeriod = ie_list->BeaconPeriod; - - if (ie_list->BssType == BSS_INFRA) { - if (ie_list->CfParm.bValid) { - pBss->CfpCount = ie_list->CfParm.CfpCount; - pBss->CfpPeriod = ie_list->CfParm.CfpPeriod; - pBss->CfpMaxDuration = ie_list->CfParm.CfpMaxDuration; - pBss->CfpDurRemaining = ie_list->CfParm.CfpDurRemaining; - } - } else - pBss->AtimWin = ie_list->AtimWin; - - NdisGetSystemUpTime(&pBss->LastBeaconRxTime); - pBss->CapabilityInfo = ie_list->CapabilityInfo; - /* The privacy bit indicate security is ON, it maight be WEP, TKIP or AES*/ - /* Combine with AuthMode, they will decide the connection methods.*/ - pBss->Privacy = CAP_IS_PRIVACY_ON(pBss->CapabilityInfo); - ASSERT(ie_list->SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES); - - if (ie_list->SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES) - NdisMoveMemory(pBss->SupRate, ie_list->SupRate, - ie_list->SupRateLen); - else - NdisMoveMemory(pBss->SupRate, ie_list->SupRate, - MAX_LEN_OF_SUPPORTED_RATES); - - pBss->SupRateLen = ie_list->SupRateLen; - ASSERT(ie_list->ExtRateLen <= MAX_LEN_OF_SUPPORTED_RATES); - - if (ie_list->ExtRateLen > MAX_LEN_OF_SUPPORTED_RATES) - ie_list->ExtRateLen = MAX_LEN_OF_SUPPORTED_RATES; - - NdisMoveMemory(pBss->ExtRate, ie_list->ExtRate, ie_list->ExtRateLen); - pBss->NewExtChanOffset = ie_list->NewExtChannelOffset; - pBss->ExtRateLen = ie_list->ExtRateLen; - pBss->Erp = ie_list->Erp; - pBss->Channel = ie_list->Channel; - pBss->CentralChannel = ie_list->Channel; - pBss->Rssi = Rssi; -#ifdef CONFIG_AP_SUPPORT -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - pBss->Snr[0] = Snr[0]; - pBss->Snr[1] = Snr[1]; - pBss->Snr[2] = Snr[2]; - pBss->Snr[3] = Snr[3]; - - pBss->rssi[0] = rssi[0]; - pBss->rssi[1] = rssi[1]; - pBss->rssi[2] = rssi[2]; - pBss->rssi[3] = rssi[3]; -#endif -#endif - -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - NdisMoveMemory(pBss->vendorOUI0, ie_list->VendorID0, 3); - NdisMoveMemory(pBss->vendorOUI1, ie_list->VendorID1, 3); -#endif - -#ifdef CONFIG_AP_SUPPORT -#ifdef NEIGHBORING_AP_STAT - pBss->DtimPeriod = ie_list->DtimPeriod; - if (ie_list->Channel <= 14) - index = SCAN_RESULT_2G; - else - index = SCAN_RESULT_5G; - for (idx = 0; - (idx < pAd->ScanTab.ScanResult[index].item_ctr) && - (pAd->ScanTab.ScanResult[index].item_ctr < MAX_LEN_OF_BSS_TABLE); - idx++) { - if (MAC_ADDR_EQUAL( - pAd->ScanTab.ScanResult[index].items[idx].macAddr, - ie_list->Bssid)) - Bssid_Found = TRUE; - } - if (!Bssid_Found) { - item = &pAd->ScanTab.ScanResult[index] - .items[pAd->ScanTab.ScanResult[index].item_ctr]; - NdisMoveMemory(item->ssid, pBss->Ssid, pBss->SsidLen); - NdisMoveMemory(item->macAddr, ie_list->Bssid, MAC_ADDR_LEN); - item->noise = pBss->Rssi - pBss->Snr[0]; - item->beaconPeriod = ie_list->BeaconPeriod; - item->dtimPeriod = ie_list->DtimPeriod; - item->channel = ie_list->Channel; - for (idx = 0; idx < ie_list->SupRateLen; idx++) { - if (pBss->SupRate[idx] & 0x80) - item->basicRate[item->basicRateLen++] = - ie_list->SupRate[idx] & 0x7F; - else - item->suppoRate[item->suppRateLen++] = - ie_list->SupRate[idx]; - } - pAd->ScanTab.ScanResult[index].item_ctr++; - } -#endif -#endif - /* Update CkipFlag. if not exists, the value is 0x0*/ - pBss->CkipFlag = ie_list->CkipFlag; - /* New for microsoft Fixed IEs*/ - NdisMoveMemory(pBss->FixIEs.Timestamp, &ie_list->TimeStamp, 8); - pBss->FixIEs.BeaconInterval = ie_list->BeaconPeriod; - pBss->FixIEs.Capabilities = ie_list->CapabilityInfo; -#ifdef CONFIG_AP_SUPPORT -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - pBss->LastBeaconRxTimeT = jiffies_to_msecs(jiffies); -#endif -#endif - -#ifdef CONFIG_OWE_SUPPORT - NdisZeroMemory(pBss->owe_trans_ie, MAX_VIE_LEN); - pBss->owe_trans_ie_len = 0; - pBss->bhas_owe_trans_ie = FALSE; -#endif - - /* New for microsoft Variable IEs*/ - if (LengthVIE != 0) { - pBss->VarIELen = LengthVIE; - NdisMoveMemory(pBss->VarIEs, pVIE, pBss->VarIELen); - } else - pBss->VarIELen = 0; - -#ifdef CONFIG_MAP_SUPPORT - pBss->map_vendor_ie_found = ie_list->vendor_ie.map_vendor_ie_found; - if (pBss->map_vendor_ie_found) - NdisMoveMemory(&pBss->map_info, &ie_list->vendor_ie.map_info, - sizeof(struct map_vendor_ie)); -#endif - - pBss->AddHtInfoLen = 0; - pBss->HtCapabilityLen = 0; -#ifdef DOT11_N_SUPPORT - - if (ie_list->HtCapabilityLen > 0) { - pBss->HtCapabilityLen = ie_list->HtCapabilityLen; - NdisMoveMemory(&pBss->HtCapability, &ie_list->HtCapability, - ie_list->HtCapabilityLen); - - if (ie_list->AddHtInfoLen > 0) { - pBss->AddHtInfoLen = ie_list->AddHtInfoLen; - NdisMoveMemory(&pBss->AddHtInfo, &ie_list->AddHtInfo, - ie_list->AddHtInfoLen); - pBss->CentralChannel = - get_cent_ch_by_htinfo(pAd, &ie_list->AddHtInfo, - &ie_list->HtCapability); - } - -#ifdef DOT11_VHT_AC - - if (ie_list->vht_cap_len) { - NdisMoveMemory(&pBss->vht_cap_ie, &ie_list->vht_cap_ie, - ie_list->vht_cap_len); - pBss->vht_cap_len = ie_list->vht_cap_len; - } - - if (ie_list->vht_op_len) { - VHT_OP_IE *vht_op; - - NdisMoveMemory(&pBss->vht_op_ie, &ie_list->vht_op_ie, - ie_list->vht_op_len); - pBss->vht_op_len = ie_list->vht_op_len; - vht_op = &ie_list->vht_op_ie; - - if ((vht_op->vht_op_info.ch_width > 0) && - (ie_list->AddHtInfo.AddHtInfo.ExtChanOffset != - EXTCHA_NONE) && - (ie_list->HtCapability.HtCapInfo.ChannelWidth == - BW_40) && - (pBss->CentralChannel != - ie_list->AddHtInfo.ControlChan)) { - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s():VHT vht_op_info->center_freq_1=%d, Bss->CentCh=%d, change from CentralChannel to cent_ch!\n", - __func__, - vht_op->vht_op_info.center_freq_1, - pBss->CentralChannel)); - pBss->CentralChannel = - vht_op->vht_op_info.center_freq_1; - } - } - -#endif /* DOT11_VHT_AC */ - } - -#endif /* DOT11_N_SUPPORT */ - BssCipherParse(pBss); - - /* new for QOS*/ - if (ie_list->EdcaParm.bValid) - NdisMoveMemory(&pBss->EdcaParm, &ie_list->EdcaParm, - sizeof(EDCA_PARM)); - else - pBss->EdcaParm.bValid = FALSE; - - if (ie_list->QosCapability.bValid) - NdisMoveMemory(&pBss->QosCapability, &ie_list->QosCapability, - sizeof(QOS_CAPABILITY_PARM)); - else - pBss->QosCapability.bValid = FALSE; - - if (ie_list->QbssLoad.bValid) - NdisMoveMemory(&pBss->QbssLoad, &ie_list->QbssLoad, - sizeof(QBSS_LOAD_PARM)); - else - pBss->QbssLoad.bValid = FALSE; - - { - PEID_STRUCT pEid; - USHORT Length = 0; -#ifdef WSC_INCLUDED - pBss->WpsAP = 0x00; - pBss->WscDPIDFromWpsAP = 0xFFFF; -#endif /* WSC_INCLUDED */ - pEid = (PEID_STRUCT)pVIE; - - while ((Length + 2 + (USHORT)pEid->Len) <= LengthVIE) { -#define WPS_AP 0x01 - - switch (pEid->Eid) { - case IE_WPA: - if (NdisEqualMemory(pEid->Octet, WPS_OUI, 4)) { -#ifdef WSC_INCLUDED - pBss->WpsAP |= WPS_AP; - WscCheckWpsIeFromWpsAP( - pAd, pEid, - &pBss->WscDPIDFromWpsAP); -#endif /* WSC_INCLUDED */ - break; - } - -#ifdef CONFIG_OWE_SUPPORT - if (NdisEqualMemory(pEid->Octet, OWE_TRANS_OUI, - 4)) { - ULONG bss_idx = BSS_NOT_FOUND; - UCHAR pair_ch = 0; - UCHAR pair_bssid[MAC_ADDR_LEN] = { 0 }; - UCHAR pair_ssid[MAX_LEN_OF_SSID] = { 0 }; - UCHAR pair_band = 0; - UCHAR pair_ssid_len = 0; - - NdisZeroMemory(pBss->owe_trans_ie, - MAX_VIE_LEN); - NdisMoveMemory(pBss->owe_trans_ie, - pEid->Octet + 4, - pEid->Len - 4); - pBss->owe_trans_ie_len = pEid->Len - 4; - - pBss->bhas_owe_trans_ie = TRUE; - - extract_pair_owe_bss_info( - pEid->Octet + 4, pEid->Len - 4, - pair_bssid, pair_ssid, - &pair_ssid_len, &pair_band, - &pair_ch); - if (pair_ch != 0) - bss_idx = BssTableSearch( - &pAd->ScanTab, - pair_bssid, pair_ch); - else - bss_idx = BssTableSearch( - &pAd->ScanTab, - pair_bssid, - ie_list->Channel); - - if (bss_idx != BSS_NOT_FOUND) - update_bss_by_owe_trans( - pAd, bss_idx, - pair_bssid, pair_ssid, - pair_ssid_len); - } -#endif - break; - } - - Length = - Length + 2 + - (USHORT)pEid - ->Len; /* Eid[1] + Len[1]+ content[Len]*/ - pEid = (PEID_STRUCT)((UCHAR *)pEid + 2 + pEid->Len); - } - } -} - -/*! - * \brief insert an entry into the bss table - * \param p_tab The BSS table - * \param Bssid BSSID - * \param ssid SSID - * \param ssid_len Length of SSID - * \param bss_type - * \param beacon_period - * \param timestamp - * \param p_cf - * \param atim_win - * \param cap - * \param rates - * \param rates_len - * \param channel_idx - * \return none - * \pre - * \post - * \note If SSID is identical, the old entry will be replaced by the new one - - IRQL = DISPATCH_LEVEL - - */ -ULONG BssTableSetEntry(IN PRTMP_ADAPTER pAd, OUT BSS_TABLE *Tab, - IN BCN_IE_LIST *ie_list, IN CHAR Rssi, - IN USHORT LengthVIE, IN PNDIS_802_11_VARIABLE_IEs pVIE -#ifdef CONFIG_AP_SUPPORT -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - , - IN UCHAR *Snr, IN CHAR *rssi -#endif -#endif -) -{ - ULONG Idx; -#ifdef APCLI_SUPPORT - BOOLEAN bInsert = FALSE; - PAPCLI_STRUCT pApCliEntry = NULL; - UCHAR i; -#endif /* APCLI_SUPPORT */ - Idx = BssTableSearch(Tab, ie_list->Bssid, ie_list->Channel); - - if (Idx == BSS_NOT_FOUND) { - if (Tab->BssNr >= MAX_LEN_OF_BSS_TABLE) { - /* - It may happen when BSS Table was full. - The desired AP will not be added into BSS Table - In this case, if we found the desired AP then overwrite BSS Table. - */ -#ifdef APCLI_SUPPORT - for (i = 0; i < pAd->ApCfg.ApCliNum; i++) { - pApCliEntry = &pAd->ApCfg.ApCliTab[i]; - - if (MAC_ADDR_EQUAL(pApCliEntry->MlmeAux.Bssid, - ie_list->Bssid) || - SSID_EQUAL(pApCliEntry->MlmeAux.Ssid, - pApCliEntry->MlmeAux.SsidLen, - ie_list->Ssid, - ie_list->SsidLen)) { - bInsert = TRUE; - break; - } - if (MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, - ie_list->Bssid) || - SSID_EQUAL(pApCliEntry->CfgSsid, - pApCliEntry->CfgSsidLen, - ie_list->Ssid, - ie_list->SsidLen)) { - bInsert = TRUE; - break; - } - } - -#endif /* APCLI_SUPPORT */ - - if ( -#ifdef CONFIG_AP_SUPPORT - !OPSTATUS_TEST_FLAG( - pAd, - fOP_STATUS_MEDIA_STATE_CONNECTED) || -#endif - !OPSTATUS_TEST_FLAG( - pAd, - fOP_AP_STATUS_MEDIA_STATE_CONNECTED)) { - if (MAC_ADDR_EQUAL(pAd->ScanCtrl.Bssid, - ie_list->Bssid) || - SSID_EQUAL(pAd->ScanCtrl.Ssid, - pAd->ScanCtrl.SsidLen, - ie_list->Ssid, ie_list->SsidLen) -#ifdef APCLI_SUPPORT - || bInsert -#endif /* APCLI_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT - /* YF: Driver ScanTable full but supplicant the SSID exist on supplicant */ - || - SSID_EQUAL( - pAd->cfg80211_ctrl.Cfg_pending_Ssid, - pAd->cfg80211_ctrl - .Cfg_pending_SsidLen, - ie_list->Ssid, ie_list->SsidLen) -#endif /* RT_CFG80211_SUPPORT */ - ) { - Idx = Tab->BssOverlapNr; - NdisZeroMemory(&(Tab->BssEntry[Idx]), - sizeof(BSS_ENTRY)); - BssEntrySet(pAd, &Tab->BssEntry[Idx], - ie_list, Rssi, LengthVIE, - pVIE -#ifdef CONFIG_AP_SUPPORT -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - , - Snr, rssi -#endif -#endif - ); - Tab->BssOverlapNr += 1; - Tab->BssOverlapNr = - Tab->BssOverlapNr % - MAX_LEN_OF_BSS_TABLE; -#ifdef RT_CFG80211_SUPPORT - pAd->cfg80211_ctrl.Cfg_pending_SsidLen = - 0; - NdisZeroMemory( - pAd->cfg80211_ctrl - .Cfg_pending_Ssid, - MAX_LEN_OF_SSID + 1); -#endif /* RT_CFG80211_SUPPORT */ - } - - return Idx; - } else - return BSS_NOT_FOUND; - } - - Idx = Tab->BssNr; - BssEntrySet(pAd, &Tab->BssEntry[Idx], ie_list, Rssi, LengthVIE, - pVIE -#ifdef CONFIG_AP_SUPPORT -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - , - Snr, rssi -#endif -#endif - ); - Tab->BssNr++; - } else if (Idx < MAX_LEN_OF_BSS_TABLE) - BssEntrySet(pAd, &Tab->BssEntry[Idx], ie_list, Rssi, LengthVIE, - pVIE -#ifdef CONFIG_AP_SUPPORT -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) || \ - defined(NEIGHBORING_AP_STAT) - , - Snr, rssi -#endif -#endif - ); - else - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(error):Idx is larger than MAX_LEN_OF_BSS_TABLE", - __func__)); - - return Idx; -} - -VOID BssTableSortByRssi(IN OUT BSS_TABLE *OutTab, IN BOOLEAN isInverseOrder) -{ - INT i, j; - BSS_ENTRY *pTmpBss = NULL; - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&pTmpBss, sizeof(BSS_ENTRY)); - - if (pTmpBss == NULL) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return; - } - - if (OutTab->BssNr == 0) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: BssNr=%d!!!\n", __func__, OutTab->BssNr)); - os_free_mem(pTmpBss); - return; - } - - for (i = 0; i < OutTab->BssNr - 1; i++) { - for (j = i + 1; j < OutTab->BssNr; j++) { - if (OutTab->BssEntry[j].Rssi > - OutTab->BssEntry[i].Rssi ? - !isInverseOrder : - isInverseOrder) { - if (OutTab->BssEntry[j].Rssi != - OutTab->BssEntry[i].Rssi) { - NdisMoveMemory(pTmpBss, - &OutTab->BssEntry[j], - sizeof(BSS_ENTRY)); - NdisMoveMemory(&OutTab->BssEntry[j], - &OutTab->BssEntry[i], - sizeof(BSS_ENTRY)); - NdisMoveMemory(&OutTab->BssEntry[i], - pTmpBss, - sizeof(BSS_ENTRY)); - } - } - } - } - - if (pTmpBss != NULL) - os_free_mem(pTmpBss); -} - -BOOLEAN bss_coex_insert_effected_ch_list(RTMP_ADAPTER *pAd, UCHAR Channel, - BCN_IE_LIST *ie_list, - struct wifi_dev *pwdev) -{ - BOOLEAN Inserted = FALSE; -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - - if (pAd->CommonCfg.bOverlapScanning == TRUE) { - INT index, secChIdx; - ADD_HTINFO *pAdd_HtInfo; - struct freq_oper oper; - UCHAR BandIdx; - CHANNEL_CTRL *pChCtrl; - - hc_radio_query_by_channel(pAd, Channel, &oper); - BandIdx = HcGetBandByChannel(pAd, Channel); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - - for (index = 0; index < pChCtrl->ChListNum; index++) { - /* found the effected channel, mark that. */ - if (pChCtrl->ChList[index].Channel == - ie_list->Channel) { - secChIdx = -1; - - if (ie_list->HtCapabilityLen > 0 && - ie_list->AddHtInfoLen > 0) { - /* This is a 11n AP. */ - pChCtrl->ChList[index] - .bEffectedChannel |= - EFFECTED_CH_PRIMARY; /* 2; // 2 for 11N 20/40MHz AP with primary channel set as this channel. */ - pAdd_HtInfo = - &ie_list->AddHtInfo.AddHtInfo; - - if (pAdd_HtInfo->ExtChanOffset == - EXTCHA_BELOW) { - if (ie_list->Channel > 14) - secChIdx = - ((index > 0) ? - (index - - 1) : - -1); - else - secChIdx = - ((index >= 4) ? - (index - - 4) : - -1); - } else if (pAdd_HtInfo->ExtChanOffset == - EXTCHA_ABOVE) { - if (ie_list->Channel > 14) - secChIdx = - (((index + 1) < - pChCtrl->ChListNum) ? - (index + - 1) : - -1); - else - secChIdx = - (((index + 4) < - pChCtrl->ChListNum) ? - (index + - 4) : - -1); - } - - if (secChIdx >= 0) - pChCtrl->ChList[secChIdx] - .bEffectedChannel |= - EFFECTED_CH_SECONDARY; /* 1; */ - - if ((Channel != ie_list->Channel) || - (pAdd_HtInfo->ExtChanOffset != - oper.ext_cha)) { - pAd->CommonCfg.BssCoexApCnt++; - Inserted = TRUE; - } - } else { - /* This is a legacy AP. */ - pChCtrl->ChList[index] - .bEffectedChannel |= - EFFECTED_CH_LEGACY; /* 4; 1 for legacy AP. */ - pAd->CommonCfg.BssCoexApCnt++; - Inserted = TRUE; - } - } - } - } - -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ - return Inserted; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_dev.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_dev.c deleted file mode 100644 index 9cd6a3f1e2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_dev.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" - -/** - * @param pAd - * @param ioctl wifi device type - * @param func_index function device index - * - * Get wifi_dev according to ioctl wifi device type - * - * @return wifi_dev - */ -struct wifi_dev *get_wdev_by_ioctl_idx_and_iftype(RTMP_ADAPTER *pAd, INT idx, - INT if_type) -{ - INT net_device_offset = 0; - - switch (if_type) { -#ifdef CONFIG_AP_SUPPORT - - case INT_MAIN: - case INT_MBSSID: - net_device_offset = MIN_NET_DEVICE_FOR_MBSSID; - break; -#ifdef APCLI_SUPPORT - - case INT_APCLI: - net_device_offset = MIN_NET_DEVICE_FOR_APCLI; - break; -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - - case INT_WDS: - net_device_offset = MIN_NET_DEVICE_FOR_WDS; - break; -#endif /* WDS_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - - default: - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: can not find ioctl_if_type(%d), if_idx(%d)\n", - __func__, if_type, idx)); - break; - } - - return get_wdev_by_idx(pAd, (idx + net_device_offset)); -} - -struct wifi_dev *get_wdev_by_idx(RTMP_ADAPTER *pAd, INT idx) -{ - struct wifi_dev *wdev = NULL; - - do { -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT - - if (idx >= MIN_NET_DEVICE_FOR_APCLI) { - idx -= MIN_NET_DEVICE_FOR_APCLI; - - if (idx < MAX_APCLI_NUM) { - wdev = &pAd->ApCfg.ApCliTab[idx].wdev; - break; - } - } - -#endif /* APCLI_SUPPORT */ - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef WDS_SUPPORT - - if (idx >= MIN_NET_DEVICE_FOR_WDS) { - idx -= MIN_NET_DEVICE_FOR_WDS; - - if (idx < MAX_WDS_ENTRY) { - wdev = &pAd->WdsTab.WdsEntry[idx].wdev; - break; - } - } - -#endif /* WDS_SUPPORT */ - - if ((idx < pAd->ApCfg.BssidNum) && - (idx < MAX_MBSSID_NUM(pAd)) && - (idx < HW_BEACON_MAX_NUM)) - wdev = &pAd->ApCfg.MBSSID[idx].wdev; - - break; - } -#endif /* CONFIG_AP_SUPPORT */ - } while (FALSE); - - if (wdev == NULL) - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("get_wdev_by_idx: invalid idx(%d)\n", idx)); - - return wdev; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_entrytb.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_entrytb.c deleted file mode 100644 index e4266a4737..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_entrytb.c +++ /dev/null @@ -1,1961 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include -#ifdef VOW_SUPPORT -#include -#endif /* VOW_SUPPORT */ - -VOID TRTableEntryDump(RTMP_ADAPTER *pAd, INT tr_idx, const RTMP_STRING *caller, - INT line) -{ - STA_TR_ENTRY *tr_entry; - INT qidx; - struct qm_ops *ops = pAd->qm_ops; - - ASSERT(tr_idx < MAX_LEN_OF_TR_TABLE); - - if (tr_idx >= MAX_LEN_OF_TR_TABLE) - return; - - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dump TR_ENTRY called by function %s(%d)\n", caller, line)); - tr_entry = &pAd->MacTab.tr_entry[tr_idx]; - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TR_ENTRY[%d]\n", tr_idx)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tEntryType=%x\n", tr_entry->EntryType)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twdev=%p\n", tr_entry->wdev)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twcid=%d\n", tr_entry->wcid)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tfunc_tb_idx=%d\n", tr_entry->func_tb_idx)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAddr=%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(tr_entry->Addr))); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBSSID=%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(tr_entry->bssid))); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tFlags\n")); - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tbIAmBadAtheros=%d, isCached=%d, PortSecured=%d, PsMode=%d, LockEntryTx=%d\n", - tr_entry->bIAmBadAtheros, tr_entry->isCached, - tr_entry->PortSecured, tr_entry->PsMode, - tr_entry->LockEntryTx)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTxRx Characters\n")); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNonQosDataSeq=%d\n", tr_entry->NonQosDataSeq)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxSeq[0]=%d, TxSeq[1]=%d, TxSeq[2]=%d, TxSeq[3]=%d\n", - tr_entry->TxSeq[0], tr_entry->TxSeq[1], tr_entry->TxSeq[2], - tr_entry->TxSeq[3])); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCurrTxRate=%x\n", tr_entry->CurrTxRate)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tQueuing Info\n")); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tenq_cap=%d, deq_cap=%d\n", tr_entry->enq_cap, - tr_entry->deq_cap)); - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tQueuedPkt: TxQ[0]=%d, TxQ[1]=%d, TxQ[2]=%d, TxQ[3]=%d, PSQ=%d\n", - tr_entry->tx_queue[0].Number, tr_entry->tx_queue[1].Number, - tr_entry->tx_queue[2].Number, tr_entry->tx_queue[3].Number, - tr_entry->ps_queue.Number)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tdeq_cnt=%d, deq_bytes=%d\n", tr_entry->deq_cnt, - tr_entry->deq_bytes)); - - for (qidx = 0; qidx < 4; qidx++) { - if (ops->sta_dump_queue) - ops->sta_dump_queue(pAd, tr_entry->wcid, TX_DATA, qidx); - - ge_tx_swq_dump(pAd, qidx); - } -} - -VOID TRTableResetEntry(RTMP_ADAPTER *pAd, UCHAR tr_tb_idx) -{ - struct _STA_TR_ENTRY *tr_entry; - INT qidx; - struct qm_ops *ops = pAd->qm_ops; - - if (tr_tb_idx >= MAX_LEN_OF_TR_TABLE) - return; - - tr_entry = &pAd->MacTab.tr_entry[tr_tb_idx]; - - if (IS_ENTRY_NONE(tr_entry)) - return; - - tr_entry->enq_cap = FALSE; - tr_entry->deq_cap = FALSE; - - if (ops->sta_clean_queue) - ops->sta_clean_queue(pAd, tr_entry->wcid); - - SET_ENTRY_NONE(tr_entry); - - for (qidx = 0; qidx < WMM_QUE_NUM; qidx++) - NdisFreeSpinLock(&tr_entry->txq_lock[qidx]); - - NdisFreeSpinLock(&tr_entry->ps_queue_lock); - NdisFreeSpinLock(&tr_entry->ps_sync_lock); - return; -} - -VOID TRTableInsertEntry(RTMP_ADAPTER *pAd, UCHAR tr_tb_idx, - MAC_TABLE_ENTRY *pEntry) -{ - struct _STA_TR_ENTRY *tr_entry; - INT qidx, tid, upId; -#ifdef FQ_SCH_SUPPORT - struct fq_stainfo_type *pfq_sta = NULL; -#endif - if (tr_tb_idx < MAX_LEN_OF_TR_TABLE) { - tr_entry = &pAd->MacTab.tr_entry[tr_tb_idx]; - pEntry->tr_tb_idx = tr_tb_idx; - tr_entry->EntryType = pEntry->EntryType; - tr_entry->wdev = pEntry->wdev; - tr_entry->func_tb_idx = pEntry->func_tb_idx; - tr_entry->wcid = pEntry->wcid; - NdisMoveMemory(tr_entry->Addr, pEntry->Addr, MAC_ADDR_LEN); - tr_entry->NonQosDataSeq = 0; - - for (tid = 0; tid < NUM_OF_TID; tid++) - tr_entry->TxSeq[tid] = 0; - - for (upId = 0; upId < NUM_OF_UP; upId++) { - tr_entry->cacheSn[upId] = -1; - tr_entry->previous_sn[upId] = -1; - tr_entry->previous_amsdu_state[upId] = MSDU_FORMAT; - } - -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (tr_entry->wdev) - tr_entry->OmacIdx = pEntry->wdev->OmacIdx; - else - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: wdev == NULL\n", __func__)); - } - -#endif /* MT_MAC */ - tr_entry->PsMode = PWR_ACTIVE; - tr_entry->ps_state = PWR_ACTIVE; - tr_entry->isCached = FALSE; - tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; - tr_entry->CurrTxRate = pEntry->CurrTxRate; - - for (qidx = 0; qidx < WMM_QUE_NUM; qidx++) { - InitializeQueueHeader(&tr_entry->tx_queue[qidx]); -#ifdef MT_SDIO_ADAPTIVE_TC_RESOURCE_CTRL -#if TC_PAGE_BASED_DEMAND - tr_entry->TotalPageCount[qidx] = 0; -#endif -#endif - NdisAllocateSpinLock(pAd, &tr_entry->txq_lock[qidx]); - } - - InitializeQueueHeader(&tr_entry->ps_queue); - NdisAllocateSpinLock(pAd, &tr_entry->ps_queue_lock); - NdisAllocateSpinLock(pAd, &tr_entry->ps_sync_lock); - tr_entry->deq_cnt = 0; - tr_entry->deq_bytes = 0; - tr_entry->PsQIdleCount = 0; - tr_entry->enq_cap = TRUE; - tr_entry->deq_cap = TRUE; - NdisMoveMemory(tr_entry->bssid, pEntry->wdev->bssid, - MAC_ADDR_LEN); -#ifdef FQ_SCH_SUPPORT - if (pAd->fq_ctrl.enable & FQ_READY) { - pfq_sta = &tr_entry->fq_sta_rec; - for (qidx = 0; qidx < WMM_QUE_NUM; qidx++) - pfq_sta->status[qidx] = FQ_UN_CLEAN_STA; - fq_clean_list(pAd, WMM_NUM_OF_AC); - } -#endif - } -} - -VOID TRTableInsertMcastEntry(RTMP_ADAPTER *pAd, UCHAR tr_tb_idx, - struct wifi_dev *wdev) -{ - struct _STA_TR_ENTRY *tr_entry = NULL; - INT qidx, tid; - - if (tr_tb_idx >= MAX_LEN_OF_TR_TABLE) - return; - - tr_entry = &pAd->MacTab.tr_entry[tr_tb_idx]; - - if (!tr_entry) - return; - - tr_entry->EntryType = ENTRY_CAT_MCAST; - tr_entry->wdev = wdev; - tr_entry->func_tb_idx = wdev->func_idx; - tr_entry->PsMode = PWR_ACTIVE; - tr_entry->isCached = FALSE; - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; - tr_entry->CurrTxRate = pAd->CommonCfg.MlmeRate; - NdisMoveMemory(tr_entry->Addr, &BROADCAST_ADDR[0], MAC_ADDR_LEN); - /* TODO: shiang-usw, for following fields, need better assignment! */ - tr_entry->wcid = tr_tb_idx; - tr_entry->NonQosDataSeq = 0; - - for (tid = 0; tid < NUM_OF_TID; tid++) - tr_entry->TxSeq[tid] = 0; - - for (qidx = 0; qidx < WMM_QUE_NUM; qidx++) { - InitializeQueueHeader(&tr_entry->tx_queue[qidx]); - NdisAllocateSpinLock(pAd, &tr_entry->txq_lock[qidx]); - } - - InitializeQueueHeader(&tr_entry->ps_queue); - NdisAllocateSpinLock(pAd, &tr_entry->ps_queue_lock); - NdisAllocateSpinLock(pAd, &tr_entry->ps_sync_lock); - tr_entry->deq_cnt = 0; - tr_entry->deq_bytes = 0; - tr_entry->PsQIdleCount = 0; - tr_entry->enq_cap = TRUE; - tr_entry->deq_cap = TRUE; -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (tr_entry->wdev) - tr_entry->OmacIdx = wdev->OmacIdx; - else - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: wdev == NULL\n", __func__)); - } - -#endif /* MT_MAC */ - /* - Carter check, - if Mcast pkt will reference the bssid field for do something? - if so, need to check flow. - */ - NdisMoveMemory(tr_entry->bssid, wdev->bssid, MAC_ADDR_LEN); -} - -/* TODO: this function not finish yet!! */ -VOID MgmtTableSetMcastEntry(RTMP_ADAPTER *pAd, UCHAR wcid) -{ - MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[wcid]; - - pEntry->EntryType = ENTRY_CAT_MCAST; - pEntry->Sst = SST_ASSOC; - pEntry->Aid = wcid; - pEntry->wcid = wcid; - pEntry->PsMode = PWR_ACTIVE; - pEntry->CurrTxRate = pAd->CommonCfg.MlmeRate; - pEntry->Addr[0] = 0x01; - pEntry->HTPhyMode.field.MODE = MODE_OFDM; - pEntry->HTPhyMode.field.MCS = 3; - NdisMoveMemory(pEntry->Addr, &BROADCAST_ADDR[0], MAC_ADDR_LEN); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - pEntry->wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - } -#endif /* CONFIG_AP_SUPPORT */ -} - -VOID MacTableSetEntryPhyCfg(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry) -{ - if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) { - pEntry->MaxHTPhyMode.field.MODE = MODE_CCK; - pEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate; - pEntry->MinHTPhyMode.field.MODE = MODE_CCK; - pEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate; - pEntry->HTPhyMode.field.MODE = MODE_CCK; - pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate; - } else { - pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM; - pEntry->MaxHTPhyMode.field.MCS = - OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; - pEntry->MinHTPhyMode.field.MODE = MODE_OFDM; - pEntry->MinHTPhyMode.field.MCS = - OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; - pEntry->HTPhyMode.field.MODE = MODE_OFDM; - pEntry->HTPhyMode.field.MCS = - OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; - } -} - -VOID MacTableSetEntryRaCap(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *ent, - struct _vendor_ie_cap *vendor_ie) -{ - ULONG ra_ie = vendor_ie->ra_cap; - ULONG mtk_ie = vendor_ie->mtk_cap; -#ifdef DOT11_VHT_AC - ULONG brcm_ie = vendor_ie->brcm_cap; -#endif /*DOT11_VHT_AC*/ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("vendor_ie_cap for ra_cap=%08x, mtk_cap=%08x\n", - (UINT32)ra_ie, (UINT32)mtk_ie)); - NdisCopyMemory(&ent->vendor_ie, vendor_ie, - sizeof(struct _vendor_ie_cap)); - CLIENT_CAP_CLEAR_FLAG(ent, fCLIENT_STATUS_RALINK_CHIPSET); - CLIENT_CAP_CLEAR_FLAG(ent, fCLIENT_STATUS_AGGREGATION_CAPABLE); - CLIENT_CAP_CLEAR_FLAG(ent, fCLIENT_STATUS_PIGGYBACK_CAPABLE); - CLIENT_CAP_CLEAR_FLAG(ent, fCLIENT_STATUS_RDG_CAPABLE); - CLIENT_STATUS_CLEAR_FLAG(ent, fCLIENT_STATUS_RALINK_CHIPSET); - CLIENT_STATUS_CLEAR_FLAG(ent, fCLIENT_STATUS_AGGREGATION_CAPABLE); - CLIENT_STATUS_CLEAR_FLAG(ent, fCLIENT_STATUS_PIGGYBACK_CAPABLE); - CLIENT_STATUS_CLEAR_FLAG(ent, fCLIENT_STATUS_RDG_CAPABLE); - - /* TODO: need MTK CAP ? */ - - /* Set cap flags */ - if (vendor_ie->is_rlt == TRUE) { - CLIENT_CAP_SET_FLAG(ent, fCLIENT_STATUS_RALINK_CHIPSET); - CLIENT_STATUS_SET_FLAG(ent, fCLIENT_STATUS_RALINK_CHIPSET); -#ifdef AGGREGATION_SUPPORT - - if (ra_ie & RALINK_AGG_CAP) { - CLIENT_CAP_SET_FLAG(ent, - fCLIENT_STATUS_AGGREGATION_CAPABLE); - - if (pAd->CommonCfg.bAggregationCapable) { - CLIENT_STATUS_SET_FLAG( - ent, - fCLIENT_STATUS_AGGREGATION_CAPABLE); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_INFO, ("RaAggregate= 1\n")); - } - } - -#endif /* AGGREGATION_SUPPORT */ -#ifdef PIGGYBACK_SUPPORT - - if (ra_ie & RALINK_PIGGY_CAP) { - CLIENT_CAP_SET_FLAG(ent, - fCLIENT_STATUS_PIGGYBACK_CAPABLE); - - if (pAd->CommonCfg.bPiggyBackCapable) { - CLIENT_STATUS_SET_FLAG( - ent, fCLIENT_STATUS_PIGGYBACK_CAPABLE); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_INFO, ("PiggyBack= 1\n")); - } - } - -#endif /* PIGGYBACK_SUPPORT */ - - if (ra_ie & RALINK_RDG_CAP) { - CLIENT_CAP_SET_FLAG(ent, fCLIENT_STATUS_RDG_CAPABLE); - - if (pAd->CommonCfg.bRdg) { - CLIENT_STATUS_SET_FLAG( - ent, fCLIENT_STATUS_RDG_CAPABLE); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_INFO, ("Rdg = 1\n")); - } - } - -#ifdef DOT11_VHT_AC - - if ((ra_ie & RALINK_256QAM_CAP) && - (pAd->CommonCfg.g_band_256_qam)) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("RALINK_256QAM_CAP for 2.4G\n")); - ent->fgGband256QAMSupport = TRUE; - } - -#endif /*DOT11_VHT_AC*/ - } -#ifdef DOT11_VHT_AC - else if ((mtk_ie & MEDIATEK_256QAM_CAP) && - (pAd->CommonCfg.g_band_256_qam)) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("MEDIATEK_256QAM_CAP for 2.4G\n")); - ent->fgGband256QAMSupport = TRUE; - } else if ((brcm_ie & BROADCOM_256QAM_CAP) && - (pAd->CommonCfg.g_band_256_qam)) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("BROADCOM_256QAM_CAP for 2.4G\n")); - ent->fgGband256QAMSupport = TRUE; - } - -#endif /*DOT11_VHT_AC*/ -} - -/* - ========================================================================== - Description: - Look up the MAC address in the MAC table. Return NULL if not found. - Return: - pEntry - pointer to the MAC entry; NULL is not found - ========================================================================== -*/ -MAC_TABLE_ENTRY *MacTableLookup(RTMP_ADAPTER *pAd, UCHAR *pAddr) -{ - ULONG HashIdx; - MAC_TABLE_ENTRY *pEntry = NULL; - - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - pEntry = pAd->MacTab.Hash[HashIdx]; - - while (pEntry && !IS_ENTRY_NONE(pEntry)) { - if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) - break; - else - pEntry = pEntry->pNext; - } - - return pEntry; -} - -MAC_TABLE_ENTRY *MacTableLookup2(RTMP_ADAPTER *pAd, UCHAR *pAddr, - struct wifi_dev *wdev) -{ - ULONG HashIdx; - MAC_TABLE_ENTRY *pEntry = NULL; - - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - pEntry = pAd->MacTab.Hash[HashIdx]; - - if (wdev) { - while (pEntry && !IS_ENTRY_NONE(pEntry)) { - if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr) && - (pEntry->wdev == wdev)) - break; - else - pEntry = pEntry->pNext; - } - } else { - while (pEntry && !IS_ENTRY_NONE(pEntry)) { - if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) - break; - else - pEntry = pEntry->pNext; - } - } - - return pEntry; -} - -static INT MacTableResetEntry(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - BOOLEAN clean) -{ - BOOLEAN Cancelled; - struct _SECURITY_CONFIG *pSecConfig = &pEntry->SecConfig; - - RTMPCancelTimer(&pSecConfig->StartFor4WayTimer, &Cancelled); - RTMPCancelTimer(&pSecConfig->StartFor2WayTimer, &Cancelled); - RTMPCancelTimer(&pSecConfig->Handshake.MsgRetryTimer, &Cancelled); -#ifdef DOT11W_PMF_SUPPORT - RTMPCancelTimer(&pSecConfig->PmfCfg.SAQueryTimer, &Cancelled); - RTMPCancelTimer(&pSecConfig->PmfCfg.SAQueryConfirmTimer, &Cancelled); -#endif /* DOT11W_PMF_SUPPORT */ - ba_session_tear_down_all(pAd, pEntry->wcid); - NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); - - if (clean == TRUE) { - pEntry->MaxSupportedRate = RATE_11; - pEntry->CurrTxRate = RATE_11; - NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); - } - - return 0; -} - -#ifdef OUI_CHECK_SUPPORT -static VOID oui_mgroup_update(MAC_TABLE *mtb, UCHAR *addr, UCHAR act) -{ - UCHAR tmp_cnt = 0; - UCHAR i = 0; - MAC_TABLE_ENTRY *entry; - - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): update mgroup before num:%d. act=%d\n", __func__, - mtb->oui_mgroup_cnt, act)); - - for (i = 0; i <= mtb->Size; i++) { - entry = &mtb->Content[i]; - - if (MAC_OUI_EQUAL(entry->Addr, addr) && - !MAC_ADDR_EQUAL(entry->Addr, addr)) { - tmp_cnt++; - - if (tmp_cnt > 2) - break; - } - } - - /*only 1 oui equal means new match group*/ - if (tmp_cnt == 1) { - mtb->oui_mgroup_cnt = (act == OUI_MGROUP_ACT_JOIN) ? - (mtb->oui_mgroup_cnt + 1) : - (mtb->oui_mgroup_cnt - 1); - } - - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): update mgroup after num:%d\n", __func__, - mtb->oui_mgroup_cnt)); -} -#endif /*OUI_CHECK_SUPPORT*/ - -MAC_TABLE_ENTRY *MacTableInsertEntry(IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr, - IN struct wifi_dev *wdev, - IN UINT32 ent_type, IN UCHAR OpMode, - IN BOOLEAN CleanAll) -{ - UCHAR HashIdx; - int i; - MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry; - /* ASIC_SEC_INFO Info = {0}; */ - struct _RTMP_CHIP_CAP *cap; - - if (pAd->MacTab.Size >= GET_MAX_UCAST_NUM(pAd)) - return NULL; - - cap = hc_get_chip_cap(pAd->hdev_ctrl); - - /* allocate one MAC entry*/ - NdisAcquireSpinLock(&pAd->MacTabLock); - /* TODO:Carter, check why start from 1 */ - i = HcAcquireUcastWcid(pAd, wdev); - - if (i == INVAILD_WCID) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s(): Entry full!\n", __func__)); - NdisReleaseSpinLock(&pAd->MacTabLock); - return NULL; - } - - /* pick up the first available vacancy*/ - if (IS_ENTRY_NONE(&pAd->MacTab.Content[i])) { - pEntry = &pAd->MacTab.Content[i]; - MacTableResetEntry(pAd, pEntry, CleanAll); - /* ENTRY PREEMPTION: initialize the entry */ - pEntry->wdev = wdev; - pEntry->wcid = i; - pEntry->func_tb_idx = wdev->func_idx; - pEntry->bIAmBadAtheros = FALSE; - pEntry->pAd = pAd; - pEntry->CMTimerRunning = FALSE; - COPY_MAC_ADDR(pEntry->Addr, pAddr); - { - struct _SECURITY_CONFIG *pSecConfig = - &pEntry->SecConfig; - - RTMPInitTimer(pAd, &pSecConfig->StartFor4WayTimer, - GET_TIMER_FUNCTION(WPAStartFor4WayExec), - pEntry, FALSE); - RTMPInitTimer(pAd, &pSecConfig->StartFor2WayTimer, - GET_TIMER_FUNCTION(WPAStartFor2WayExec), - pEntry, FALSE); - RTMPInitTimer( - pAd, &pSecConfig->Handshake.MsgRetryTimer, - GET_TIMER_FUNCTION(WPAHandshakeMsgRetryExec), - pEntry, FALSE); -#ifdef DOT11W_PMF_SUPPORT - RTMPInitTimer(pAd, &pSecConfig->PmfCfg.SAQueryTimer, - GET_TIMER_FUNCTION(PMF_SAQueryTimeOut), - pEntry, FALSE); - RTMPInitTimer( - pAd, &pSecConfig->PmfCfg.SAQueryConfirmTimer, - GET_TIMER_FUNCTION(PMF_SAQueryConfirmTimeOut), - pEntry, FALSE); -#endif /* DOT11W_PMF_SUPPORT */ - } - pEntry->Sst = SST_NOT_AUTH; - pEntry->AuthState = AS_NOT_AUTH; - pEntry->Aid = (USHORT)i; - pEntry->CapabilityInfo = 0; - pEntry->AssocDeadLine = MAC_TABLE_ASSOC_TIMEOUT; - pEntry->PsMode = PWR_ACTIVE; - pEntry->NoDataIdleCount = 0; - pEntry->NoDataLastIdleCount = 0; - pEntry->ContinueTxFailCnt = 0; -#ifdef WDS_SUPPORT - pEntry->LockEntryTx = FALSE; -#endif /* WDS_SUPPORT */ - pEntry->TimeStamp_toTxRing = 0; - /* TODO: shiang-usw, remove upper setting becasue we need to migrate to tr_entry! */ - pAd->MacTab.tr_entry[i].PsMode = PWR_ACTIVE; - pAd->MacTab.tr_entry[i].NoDataIdleCount = 0; - pAd->MacTab.tr_entry[i].ContinueTxFailCnt = 0; - pAd->MacTab.tr_entry[i].LockEntryTx = FALSE; - pAd->MacTab.tr_entry[i].TimeStamp_toTxRing = 0; - pAd->MacTab.tr_entry[i].PsDeQWaitCnt = 0; - pEntry->SecConfig.pmkid = NULL; - pEntry->SecConfig.pmk_cache = NULL; -#ifdef APCLI_OWE_SUPPORT - NdisZeroMemory(&pEntry->ecdh_ie, sizeof(EXT_ECDH_PARAMETER_IE)); - -#endif - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - pEntry->TotalTxSuccessCnt = 0; - pEntry->TxStatRspCnt = 0; -#endif - - do { -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT - - if (ent_type == ENTRY_APCLI) { - SET_ENTRY_APCLI(pEntry); - /* SET_ENTRY_AP(pEntry);//Carter, why set entry to APCLI then set to AP???? */ - COPY_MAC_ADDR(pEntry->bssid, pAddr); - pEntry->pApCli = - &pAd->ApCfg - .ApCliTab[pEntry->func_tb_idx]; - pEntry->SecConfig.AKMMap = - pAd->ApCfg.ApCliTab[pEntry->func_tb_idx] - .MlmeAux.AKMMap; - pEntry->SecConfig.PairwiseCipher = - pAd->ApCfg.ApCliTab[pEntry->func_tb_idx] - .MlmeAux.PairwiseCipher; - pEntry->SecConfig.GroupCipher = - pAd->ApCfg.ApCliTab[pEntry->func_tb_idx] - .MlmeAux.GroupCipher; - SET_CONNECTION_TYPE( - pEntry, - CONNECTION_INFRA_AP); /*the peer type related to APCLI is AP role.*/ - - if ((IS_AKM_OPEN(pEntry->SecConfig.AKMMap)) || - (IS_AKM_SHARED(pEntry->SecConfig.AKMMap)) || - (IS_AKM_AUTOSWITCH( - pEntry->SecConfig.AKMMap))) { - pEntry->SecConfig.Handshake.WpaState = - AS_NOTUSE; - pEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - } else { - pEntry->SecConfig.Handshake.WpaState = - AS_INITIALIZE; - pEntry->PrivacyFilter = - Ndis802_11PrivFilter8021xWEP; - } -#ifdef PS_QUEUE_INC_SUPPORT - pAd->TotalStaCnt++; -#endif - break; - } -#ifdef MAC_REPEATER_SUPPORT - else if (ent_type == ENTRY_REPEATER) { - PAPCLI_STRUCT pApCliEntry = - &pAd->ApCfg - .ApCliTab[pEntry->func_tb_idx]; - MAC_TABLE_ENTRY *pRootApEntry = - &pAd->MacTab.Content - [pApCliEntry->MacTabWCID]; - - SET_ENTRY_REPEATER(pEntry); - COPY_MAC_ADDR(pEntry->bssid, pAddr); - pEntry->pApCli = - &pAd->ApCfg - .ApCliTab[pEntry->func_tb_idx]; - pEntry->SecConfig.AKMMap = - pRootApEntry->SecConfig.AKMMap; - pEntry->SecConfig.PairwiseCipher = - pRootApEntry->SecConfig.PairwiseCipher; - pEntry->SecConfig.GroupCipher = - pRootApEntry->SecConfig.GroupCipher; - SET_CONNECTION_TYPE( - pEntry, - CONNECTION_INFRA_AP); /*the peer type related to Rept is AP role.*/ - - if ((IS_AKM_OPEN(pEntry->SecConfig.AKMMap)) || - (IS_AKM_SHARED(pEntry->SecConfig.AKMMap)) || - (IS_AKM_AUTOSWITCH( - pEntry->SecConfig.AKMMap))) { - pEntry->SecConfig.Handshake.WpaState = - AS_NOTUSE; - pEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - } else { - pEntry->SecConfig.Handshake.WpaState = - AS_INITIALIZE; - pEntry->PrivacyFilter = - Ndis802_11PrivFilter8021xWEP; - } -#ifdef PS_QUEUE_INC_SUPPORT - pAd->TotalStaCnt++; -#endif - -#ifdef VOW_SUPPORT - if (VOW_IS_ENABLED(pAd)) { - UCHAR func_tb_idx = pEntry->func_tb_idx; - /* apcli group idx assignments are from (VOW_MAX_GROUP_NUM-1) reversely - * e.g. entry[0] => group idx: VOW_MAX_GROUP_NUM - 1 - * entry[1] => group idx: VOW_MAX_GROUP_NUM - 2 - */ - pEntry->func_tb_idx = - VOW_MAX_GROUP_NUM - - func_tb_idx - 1; - RTMP_SET_STA_DWRR(pAd, pEntry); - pEntry->func_tb_idx = func_tb_idx; - } -#endif /* VOW_SUPPORT */ - - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Repeater Security wcid=%d, AKMMap=0x%x, PairwiseCipher=0x%x, GroupCipher=0x%x\n", - pEntry->wcid, pEntry->SecConfig.AKMMap, - pEntry->SecConfig.PairwiseCipher, - pEntry->SecConfig.GroupCipher)); - break; - } - -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - - if (ent_type == ENTRY_WDS) { - SET_ENTRY_WDS(pEntry); - SET_CONNECTION_TYPE(pEntry, CONNECTION_WDS); - COPY_MAC_ADDR(pEntry->bssid, - pAd->ApCfg.MBSSID[MAIN_MBSSID] - .wdev.bssid); - break; - } - -#endif /* WDS_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef CONFIG_AP_SUPPORT - - if (ent_type == ENTRY_CLIENT) { - /* be a regular-entry*/ - if (pAd->ApCfg.EntryClientCount >= - GET_MAX_UCAST_NUM(pAd)) { - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s: The station number is over MaxUcastEntryNum = %d\n", - __func__, - GET_MAX_UCAST_NUM(pAd))); - HcReleaseUcastWcid(pAd, wdev, - pEntry->wcid); - MacTableResetEntry(pAd, pEntry, - CleanAll); - NdisReleaseSpinLock(&pAd->MacTabLock); - return NULL; - } - - if (pEntry->func_tb_idx >= HW_BEACON_MAX_NUM) { - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s: pEntry->func_tb_idx >= %d \n", - __func__, HW_BEACON_MAX_NUM)); - HcReleaseUcastWcid(pAd, wdev, - pEntry->wcid); - MacTableResetEntry(pAd, pEntry, - CleanAll); - NdisReleaseSpinLock(&pAd->MacTabLock); - return NULL; - } - - if ((pEntry->func_tb_idx < - pAd->ApCfg.BssidNum) && - (pEntry->func_tb_idx < - MAX_MBSSID_NUM(pAd)) && - ((pEntry->func_tb_idx < - HW_BEACON_MAX_NUM)) && - (pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .MaxStaNum != 0) && - (pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .StaCount >= - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .MaxStaNum)) { - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s: The connection table is full in ra%d.\n", - __func__, - pEntry->func_tb_idx)); - HcReleaseUcastWcid(pAd, wdev, - pEntry->wcid); - MacTableResetEntry(pAd, pEntry, - CleanAll); - NdisReleaseSpinLock(&pAd->MacTabLock); - return NULL; - } - - ASSERT((wdev == - &pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev)); - SET_ENTRY_CLIENT(pEntry); - SET_CONNECTION_TYPE(pEntry, - CONNECTION_INFRA_STA); - pEntry->pMbss = - &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; - MBSS_MR_APIDX_SANITY_CHECK(pAd, - pEntry->func_tb_idx); - COPY_MAC_ADDR(pEntry->bssid, wdev->bssid); - - if (IS_SECURITY_OPEN_WEP(&wdev->SecConfig)) { - /* OPEN WEP */ - pEntry->SecConfig.AKMMap = - wdev->SecConfig.AKMMap; - pEntry->SecConfig.PairwiseCipher = - wdev->SecConfig.PairwiseCipher; - pEntry->SecConfig.PairwiseKeyId = - wdev->SecConfig.PairwiseKeyId; - pEntry->SecConfig.GroupCipher = - wdev->SecConfig.GroupCipher; - pEntry->SecConfig.GroupKeyId = - wdev->SecConfig.GroupKeyId; - os_move_mem(pEntry->SecConfig.WepKey, - wdev->SecConfig.WepKey, - sizeof(SEC_KEY_INFO) * - SEC_KEY_NUM); - pEntry->SecConfig.GroupKeyId = - wdev->SecConfig.GroupKeyId; - } - - if ((IS_AKM_OPEN(wdev->SecConfig.AKMMap)) || - (IS_SECURITY_OPEN_WEP(&wdev->SecConfig)) || - (IS_AKM_SHARED(wdev->SecConfig.AKMMap))) - pEntry->SecConfig.Handshake.WpaState = - AS_NOTUSE; - else - pEntry->SecConfig.Handshake.WpaState = - AS_INITIALIZE; - - pEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - pEntry->StaIdleTimeout = - pAd->ApCfg.StaIdleTimeout; - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .StaCount++; - pAd->ApCfg.EntryClientCount++; -#ifdef CONFIG_LED_ACTIVITY_ON_MAIN_MBSS - if (pAd->ApCfg.MBSSID[MAIN_MBSSID].StaCount > 0) - RTMPSetLED( - pAd, - LED_LINK_UP); /* Set Tx Blink mode for bss0 */ -#endif /* CONFIG_LED_ACTIVITY_ON_MAIN_MBSS */ -#ifdef PS_QUEUE_INC_SUPPORT - pAd->TotalStaCnt++; -#endif -#ifdef VOW_SUPPORT - - /* vow_set_client(pAd, pEntry->func_tb_idx, pEntry->wcid); */ - if (VOW_IS_ENABLED(pAd)) { - if (vow_watf_is_enabled(pAd)) - set_vow_watf_sta_dwrr( - pAd, &pEntry->Addr[0], - pEntry->wcid); - - RTMP_SET_STA_DWRR(pAd, pEntry); - } - -#endif /* VOW_SUPPORT */ - -#ifdef ROAMING_ENHANCE_SUPPORT -#ifdef APCLI_SUPPORT - pEntry->bRoamingRefreshDone = FALSE; -#endif /* APCLI_SUPPORT */ -#endif /* ROAMING_ENHANCE_SUPPORT */ - break; - } -#ifdef AIR_MONITOR - else if (ent_type == ENTRY_MONITOR) { - SET_ENTRY_MONITOR(pEntry); - break; - } - -#endif /* AIR_MONITOR */ -#endif /* CONFIG_AP_SUPPORT */ - } while (FALSE); - - RTMP_SET_TR_ENTRY(pAd, pEntry); -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - - if (cap->FlgHwTxBfCap) { - RTMPInitTimer(pAd, &pEntry->eTxBfProbeTimer, - GET_TIMER_FUNCTION(eTxBfProbeTimerExec), - pEntry, FALSE); - NdisAllocateSpinLock(pAd, &pEntry->TxSndgLock); - } - -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ -#ifdef STREAM_MODE_SUPPORT - /* Enable Stream mode for first three entries in MAC table */ -#endif /* STREAM_MODE_SUPPORT */ -#ifdef UAPSD_SUPPORT - - /* Ralink WDS doesn't support any power saving.*/ - if (IS_ENTRY_CLIENT(pEntry) -#if defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) - || IS_ENTRY_TDLS(pEntry) -#endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) */ - ) { - /* init U-APSD enhancement related parameters */ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): INIT UAPSD MR ENTRY", __func__)); - UAPSD_MR_ENTRY_INIT(pEntry); - } - -#endif /* UAPSD_SUPPORT */ - pAd->MacTab.Size++; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef WSC_AP_SUPPORT - pEntry->bWscCapable = FALSE; - pEntry->Receive_EapolStart_EapRspId = 0; -#endif /* WSC_AP_SUPPORT */ - } - -#endif /* CONFIG_AP_SUPPORT */ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): alloc entry #%d, Total= %d\n", __func__, i, - pAd->MacTab.Size)); - } - - /* add this MAC entry into HASH table */ - if (pEntry) { - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - - if (pAd->MacTab.Hash[HashIdx] == NULL) - pAd->MacTab.Hash[HashIdx] = pEntry; - else { - pCurrEntry = pAd->MacTab.Hash[HashIdx]; - - while (pCurrEntry->pNext != NULL) - pCurrEntry = pCurrEntry->pNext; - - pCurrEntry->pNext = pEntry; - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef WSC_AP_SUPPORT - - if (IS_ENTRY_CLIENT(pEntry) && - (pEntry->func_tb_idx < pAd->ApCfg.BssidNum) && - MAC_ADDR_EQUAL(pEntry->Addr, - pAd->ApCfg - .MBSSID[pEntry->func_tb_idx] - .wdev.WscControl.EntryAddr)) - NdisZeroMemory( - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.WscControl.EntryAddr, - MAC_ADDR_LEN); - -#endif /* WSC_AP_SUPPORT */ -#ifdef SMART_ANTENNA - pEntry->mcsInUse = -1; -#endif /* SMART_ANTENNA */ -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if (IS_ENTRY_CLIENT(pEntry) && - wf_drv_tbl.wf_fwd_add_entry_inform_hook) - wf_drv_tbl.wf_fwd_add_entry_inform_hook( - pEntry->Addr); - -#endif /* CONFIG_WIFI_PKT_FWD */ -#ifdef MTFWD - if (IS_ENTRY_CLIENT(pEntry)) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("New Sta:%pM\n", pEntry->Addr)); - RtmpOSWrielessEventSend(pEntry->wdev->if_dev, - RT_WLAN_EVENT_CUSTOM, - FWD_CMD_ADD_TX_SRC, - NULL, - (PUCHAR)pEntry->Addr, - MAC_ADDR_LEN); - } -#endif - -#ifdef ANTENNA_CONTROL_SUPPORT - if (IS_ENTRY_CLIENT(pEntry)) { - UINT32 WtblAddr = - pAd->mac_ctrl.wtbl_base_addr[0] + - pEntry->wcid * - pAd->mac_ctrl.wtbl_entry_size[0]; - - WtblAddr += 4 * 28; /* wtbl rcpi offset*/ - HW_IO_WRITE32(pAd, WtblAddr, - 0xffffffff); /* reset rcpi */ - } -#endif - } - -#endif /* CONFIG_AP_SUPPORT */ - } - -#ifdef OUI_CHECK_SUPPORT - oui_mgroup_update(&pAd->MacTab, pAddr, OUI_MGROUP_ACT_JOIN); -#endif - NdisReleaseSpinLock(&pAd->MacTabLock); - - /*update tx burst, must after unlock pAd->MacTabLock*/ - /* rtmp_tx_burst_set(pAd); */ - return pEntry; -} - -static INT32 MacTableDelEntryFromHash(RTMP_ADAPTER *pAd, - MAC_TABLE_ENTRY *pEntry) -{ - USHORT HashIdx; - MAC_TABLE_ENTRY *pPrevEntry, *pProbeEntry; - - HashIdx = MAC_ADDR_HASH_INDEX(pEntry->Addr); - pPrevEntry = NULL; - pProbeEntry = pAd->MacTab.Hash[HashIdx]; - ASSERT(pProbeEntry); - - /* update Hash list*/ - while (pProbeEntry) { - if (pProbeEntry == pEntry) { - if (pPrevEntry == NULL) - pAd->MacTab.Hash[HashIdx] = pEntry->pNext; - else - pPrevEntry->pNext = pEntry->pNext; - - break; - } - - pPrevEntry = pProbeEntry; - pProbeEntry = pProbeEntry->pNext; - }; - - ASSERT(pProbeEntry != NULL); - - return TRUE; -} - -/* - ========================================================================== - Description: - Delete a specified client from MAC table - ========================================================================== - */ -static VOID mac_entry_disconn_act(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry) -{ - STA_TR_ENTRY *tr_entry = NULL; - struct wifi_dev *wdev = pEntry->wdev; - - if (!pEntry || IS_ENTRY_NONE(pEntry)) - return; - - if (!wdev) - return; - - /* Set port secure to NOT_SECURED here to avoid race condition with ba_ori_session_start */ - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; - tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; - - ba_session_tear_down_all(pAd, pEntry->wcid); - /* RTMP_STA_ENTRY_MAC_RESET--> AsicDelWcidTab() should be integrated to below function*/ - /*in the future */ - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - /* peer link up needs pEntry type information to decide txop disable or not*/ - /* so invalid pEntry type later */ - if (wdev_do_disconn_act(pEntry->wdev, pEntry) != TRUE) - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): disconnection fail!\n", __func__)); - } -} - -BOOLEAN MacTableDeleteEntry(RTMP_ADAPTER *pAd, USHORT wcid, UCHAR *pAddr) -{ - MAC_TABLE_ENTRY *pEntry; - STA_TR_ENTRY *tr_entry; - BOOLEAN Cancelled; - BOOLEAN bDeleteEntry = FALSE; -#ifdef SMART_ANTENNA - unsigned long irqflags; -#endif /* SMART_ANTENNA */ -#ifdef CONFIG_AP_SUPPORT - BSS_STRUCT *mbss = NULL; -#endif /*CONFIG_AP_SUPPORT*/ - struct wifi_dev *wdev; - ADD_HT_INFO_IE *addht; - UCHAR i; -#ifdef GREENAP_SUPPORT - struct greenap_ctrl *greenap = &pAd->ApCfg.greenap; -#endif /* GREENAP_SUPPORT */ -#ifdef CONFIG_AP_SUPPORT -#if defined(RT_CFG80211_SUPPORT) || defined(MBO_SUPPORT) || \ - defined(WAPP_SUPPORT) - UCHAR TmpAddrForIndicate[MAC_ADDR_LEN] = { 0 }; -#endif -#if defined(RT_CFG80211_SUPPORT) || defined(MBO_SUPPORT) - BOOLEAN bIndicateSendEvent = FALSE; -#endif /* defined(RT_CFG80211_SUPPORT) || defined(MBO_SUPPORT) */ -#endif /* CONFIG_AP_SUPPORT */ - struct _RTMP_CHIP_CAP *cap; - - if (!pAd) - return FALSE; - - if (!(VALID_UCAST_ENTRY_WCID(pAd, wcid))) - return FALSE; - - cap = hc_get_chip_cap(pAd->hdev_ctrl); - - pEntry = &pAd->MacTab.Content[wcid]; - tr_entry = &pAd->MacTab.tr_entry[wcid]; - - /*disconnect first*/ - mac_entry_disconn_act(pAd, pEntry); - - NdisAcquireSpinLock(&pAd->MacTabLock); - - if (pEntry && !IS_ENTRY_NONE(pEntry)) { -#ifdef CONFIG_AP_SUPPORT - mbss = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; -#endif /*CONFIG_AP_SUPPORT*/ -#ifdef BAND_STEERING - if ((pAd->ApCfg.BandSteering) && IS_ENTRY_CLIENT(pEntry) && - IS_VALID_MAC(pEntry->Addr)) - BndStrg_UpdateEntry(pAd, pEntry, NULL, FALSE); -#endif -#ifdef CONFIG_STEERING_API_SUPPORT - if (IS_ENTRY_CLIENT(pEntry)) - Delete_Btm_Action_Frame_Request(pAd, pEntry->Addr); -#endif -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - map_a4_peer_disable(pAd, pEntry, TRUE); -#endif - /*get wdev*/ - wdev = pEntry->wdev; -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - if (wdev->wdev_type == WDEV_TYPE_APCLI) { - if (IS_MAP_TURNKEY_ENABLE(pAd)) { - pAd->ApCfg.ApCliTab[wdev->func_idx].Enable = - FALSE; - } - wapp_send_apcli_association_change( - WAPP_APCLI_DISASSOCIATED, pAd, wdev->func_dev); - } -#endif /*WAPP_SUPPORT*/ -#ifdef CONFIG_AP_SUPPORT - WLAN_MR_TIM_BIT_CLEAR(pAd, pEntry->func_tb_idx, pEntry->Aid); -#endif /* CONFIG_AP_SUPPORT */ -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if (wf_drv_tbl.wf_fwd_delete_entry_inform_hook) - wf_drv_tbl.wf_fwd_delete_entry_inform_hook( - pEntry->Addr); - -#endif /* CONFIG_WIFI_PKT_FWD */ -#ifdef MTFWD - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("Del Sta:%pM\n", pEntry->Addr)); - RtmpOSWrielessEventSend(pEntry->wdev->if_dev, - RT_WLAN_EVENT_CUSTOM, - FWD_CMD_DEL_TX_SRC, NULL, - (PUCHAR)pEntry->Addr, MAC_ADDR_LEN); -#endif - - if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) { -#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_DOT11V_WNM) - - if (pAd->ApCfg.MBSSID[pEntry->apidx] - .WNMCtrl.ProxyARPEnable) { - RemoveIPv4ProxyARPEntry(pAd, mbss, - pEntry->Addr); - RemoveIPv6ProxyARPEntry(pAd, mbss, - pEntry->Addr); - } - -#if defined(CONFIG_HOTSPOT_R2) || defined(CONFIG_DOT11V_WNM) - pEntry->IsKeep = 0; -#endif /* CONFIG_HOTSPOT_R2 */ -#endif - bDeleteEntry = TRUE; -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - - if (cap->FlgHwTxBfCap) - RTMPReleaseTimer(&pEntry->eTxBfProbeTimer, - &Cancelled); - -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ -#ifdef STREAM_MODE_SUPPORT - - /* Clear Stream Mode register for this client */ - if (pEntry->StreamModeMACReg != 0) - RTMP_IO_WRITE32( - pAd, pEntry->StreamModeMACReg + 4, 0); - -#endif /* STREAM_MODE_SUPPORT // */ -#ifdef CONFIG_AP_SUPPORT -#ifdef CLIENT_WDS - if (IS_ENTRY_CLIWDS(pEntry)) - CliWdsEnryFreeAid(pAd, pEntry->Aid); -#endif - - if (IS_ENTRY_CLIENT(pEntry)) { - INT32 aid = pEntry->wcid; - - RESET_FLAG_CONN_IN_PROG(aid, pAd->ConInPrgress); -#ifdef DOT1X_SUPPORT - - /* Notify 802.1x daemon to clear this sta info*/ - if (IS_AKM_1X_Entry(pEntry) || - IS_IEEE8021X_Entry(wdev) -#ifdef RADIUS_ACCOUNTING_SUPPORT - || IS_AKM_WPA_CAPABILITY_Entry(pEntry) -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ -#ifdef OCE_FILS_SUPPORT - || IS_AKM_FILS_Entry(pEntry) -#endif /* OCE_FILS_SUPPORT */ - ) - DOT1X_InternalCmdAction( - pAd, pEntry, - DOT1X_DISCONNECT_ENTRY); - -#endif /* DOT1X_SUPPORT */ -#ifdef IGMP_SNOOP_SUPPORT - IgmpGroupDelMembers(pAd, (PUCHAR)pEntry->Addr, - wdev, pEntry->wcid); -#endif /* IGMP_SNOOP_SUPPORT */ - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .StaCount--; - pAd->ApCfg.EntryClientCount--; -#ifdef CONFIG_LED_ACTIVITY_ON_MAIN_MBSS - if (pAd->ApCfg.MBSSID[MAIN_MBSSID].StaCount == - 0) - RTMPSetLED( - pAd, - LED_LINK_DOWN); /* Set solid led on when no clients */ -#endif /* CONFIG_LED_ACTIVITY_ON_MAIN_MBSS */ - -#ifdef CUSTOMER_DCC_FEATURE - if (pEntry->Sst == SST_ASSOC) { - UINT64 time; - INT32 i; - INT32 count = - pAd->AllowedStaList.StaCount; - BOOLEAN Flag = FALSE; - - time = jiffies_to_msecs(jiffies); - - for (i = 0; i < count; i++) { - if (NdisEqualMemory( - &pAd->AllowedStaList - .AllowedSta - [i] - .MacAddr[0], - pAddr, - MAC_ADDR_LEN)) { - pAd->AllowedStaList - .AllowedSta[count] - .DissocTime = - jiffies_to_msecs( - jiffies); - Flag = TRUE; - } - } - if ((!Flag) && - (pAd->AllowedStaList.StaCount < - MAX_LEN_OF_MAC_TABLE)) { - NdisCopyMemory( - &(pAd->AllowedStaList - .AllowedSta - [count] - .MacAddr[0]), - pEntry->Addr, - MAC_ADDR_LEN); - pAd->AllowedStaList - .AllowedSta[count] - .DissocTime = - jiffies_to_msecs( - jiffies); - pAd->AllowedStaList.StaCount++; - } - } -#endif - -#ifdef HOSTAPD_SUPPORT - - if (pEntry && mbss->Hostapd == Hostapd_EXT) { - RtmpOSWrielessEventSendExt( - pAd->net_dev, - RT_WLAN_EVENT_EXPIRED, -1, - pEntry->Addr, NULL, 0, - pEntry->func_tb_idx); - } - -#endif /* HOSTAPD_SUPPORT */ - } -#ifdef PS_QUEUE_INC_SUPPORT - if (pEntry && (IS_ENTRY_CLIENT(pEntry) || - IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry))) - pAd->TotalStaCnt--; -#endif - -#endif /* CONFIG_AP_SUPPORT */ - MacTableDelEntryFromHash(pAd, pEntry); -#ifdef CONFIG_AP_SUPPORT - APCleanupPsQueue( - pAd, - &tr_entry->ps_queue); /* return all NDIS packet in PSQ*/ -#endif /* CONFIG_AP_SUPPORT */ - TRTableResetEntry(pAd, wcid); -#ifdef UAPSD_SUPPORT -#if defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) - hex_dump("mac=", pEntry->Addr, 6); - UAPSD_MR_ENTRY_RESET(pAd, pEntry); -#else -#ifdef CONFIG_AP_SUPPORT - UAPSD_MR_ENTRY_RESET(pAd, pEntry); -#endif /* CONFIG_AP_SUPPORT */ -#endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) */ -#endif /* UAPSD_SUPPORT */ - { - struct _SECURITY_CONFIG *pSecConfig = - &pEntry->SecConfig; - - RTMPCancelTimer(&pSecConfig->StartFor4WayTimer, - &Cancelled); - RTMPCancelTimer(&pSecConfig->StartFor2WayTimer, - &Cancelled); - RTMPCancelTimer( - &pSecConfig->Handshake.MsgRetryTimer, - &Cancelled); - RTMPReleaseTimer(&pSecConfig->StartFor4WayTimer, - &Cancelled); - RTMPReleaseTimer(&pSecConfig->StartFor2WayTimer, - &Cancelled); - RTMPReleaseTimer( - &pSecConfig->Handshake.MsgRetryTimer, - &Cancelled); -#ifdef DOT11W_PMF_SUPPORT - RTMPCancelTimer( - &pSecConfig->PmfCfg.SAQueryTimer, - &Cancelled); - RTMPCancelTimer( - &pSecConfig->PmfCfg.SAQueryConfirmTimer, - &Cancelled); - RTMPReleaseTimer( - &pSecConfig->PmfCfg.SAQueryTimer, - &Cancelled); - RTMPReleaseTimer( - &pSecConfig->PmfCfg.SAQueryConfirmTimer, - &Cancelled); -#endif /* DOT11W_PMF_SUPPORT */ - } -#ifdef CONFIG_AP_SUPPORT -#ifdef WSC_AP_SUPPORT - - if (IS_ENTRY_CLIENT(pEntry)) { - PWSC_CTRL pWscControl = &mbss->wdev.WscControl; - - if (MAC_ADDR_EQUAL(pEntry->Addr, - pWscControl->EntryAddr)) { - /* - Some WPS Client will send dis-assoc close to WSC_DONE. - If AP misses WSC_DONE, WPS Client still sends dis-assoc to AP. - Do not cancel timer if WscState is WSC_STATE_WAIT_DONE. - */ - if ((pWscControl->EapolTimerRunning == - TRUE) && - (pWscControl->WscState != - WSC_STATE_WAIT_DONE)) { - RTMPCancelTimer( - &pWscControl->EapolTimer, - &Cancelled); - pWscControl->EapolTimerRunning = - FALSE; - pWscControl->EapMsgRunning = - FALSE; - NdisZeroMemory( - &(pWscControl - ->EntryAddr[0]), - MAC_ADDR_LEN); - } - } - - pEntry->Receive_EapolStart_EapRspId = 0; - pEntry->bWscCapable = FALSE; - } - -#endif /* WSC_AP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef SMART_ANTENNA - RTMP_IRQ_LOCK(&pAd->smartAntLock, irqflags); - - if (RTMP_SA_WORK_ON(pAd)) { - RTMP_SA_TRAINING_PARAM *pTrainEntry = - pEntry->pTrainEntry; - - if (pTrainEntry) { - sa_del_train_entry(pAd, pEntry->Addr, - FALSE); - pEntry->pTrainEntry = NULL; - } - - pAd->pSAParam->bStaChange = TRUE; - } - - RTMP_IRQ_UNLOCK(&pAd->smartAntLock, irqflags); -#endif /* SMART_ANTENNA */ -#ifdef CONFIG_AP_SUPPORT -#if defined(RT_CFG80211_SUPPORT) || defined(MBO_SUPPORT) || \ - defined(WAPP_SUPPORT) - COPY_MAC_ADDR(TmpAddrForIndicate, pEntry->Addr); -#endif -#if defined(RT_CFG80211_SUPPORT) || defined(MBO_SUPPORT) - bIndicateSendEvent = TRUE; -#endif /* defined(RT_CFG80211_SUPPORT) || defined(MBO_SUPPORT) */ -#endif /* CONFIG_AP_SUPPORT */ - - /* NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); */ - NdisZeroMemory(pEntry->Addr, MAC_ADDR_LEN); - pAd->MacTab.Size--; -#ifdef TXBF_SUPPORT -#ifndef MT_MAC - - if (cap->FlgHwTxBfCap) - NdisFreeSpinLock(&pEntry->TxSndgLock); - -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MacTableDeleteEntry1 - Total= %d\n", - pAd->MacTab.Size)); - } else { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n%s: Impossible Wcid = %d !!!!!\n", - __func__, wcid)); -#ifdef CONFIG_AP_SUPPORT -#if defined(RT_CFG80211_SUPPORT) || defined(MBO_SUPPORT) - bIndicateSendEvent = FALSE; -#endif /* defined(RT_CFG80211_SUPPORT) || defined(MBO_SUPPORT) */ -#endif /* CONFIG_AP_SUPPORT */ - } - -#ifdef CONFIG_AP_SUPPORT - ApUpdateCapabilityAndErpIe(pAd, mbss); -#endif /* CONFIG_AP_SUPPORT */ - } - -#ifdef OUI_CHECK_SUPPORT - oui_mgroup_update(&pAd->MacTab, pAddr, OUI_MGROUP_ACT_LEAVE); -#endif - - /*update tx burst, must after unlock pAd->MacTabLock*/ - /* rtmp_tx_burst_set(pAd); */ - - if (bDeleteEntry) { - /*release ucast wcid*/ - HcReleaseUcastWcid(pAd, pEntry->wdev, wcid); -#ifdef CONFIG_AP_SUPPORT - /* - * move CFG80211_ApStaDelSendEvent here after the entry & hash are deleted , - * to prevent removing the same hash twice - */ -#ifdef RT_CFG80211_SUPPORT - - if (bIndicateSendEvent && pEntry && !IS_ENTRY_NONE(pEntry) && - IS_ENTRY_CLIENT(pEntry)) { - if (RTMP_CFG80211_HOSTAPD_ON(pAd)) - CFG80211_ApStaDelSendEvent( - pAd, TmpAddrForIndicate, - pEntry->wdev->if_dev); - } - -#endif /* RT_CFG80211_SUPPORT */ -#ifdef MBO_SUPPORT - /* mbo - indicate daemon to remve this sta */ - { - MBO_EVENT_STA_DISASSOC evt_sta_disassoc; - - COPY_MAC_ADDR(evt_sta_disassoc.mac_addr, - TmpAddrForIndicate); - MboIndicateStaDisassocToDaemon(pAd, &evt_sta_disassoc, - MBO_MSG_REMOVE_STA); - } -#endif /* MBO_SUPPORT */ -#ifdef WAPP_SUPPORT - if (IS_ENTRY_CLIENT(pEntry)) - wapp_send_cli_leave_event( - pAd, RtmpOsGetNetIfIndex(wdev->if_dev), - TmpAddrForIndicate, pEntry); -#endif /* WAPP_SUPPORT */ - if (IS_ENTRY_CLIENT(pEntry)) - nonerp_sta_num(pEntry, PEER_LEAVE); -#endif /* CONFIG_AP_SUPPORT */ - /* invalidate the entry */ - SET_ENTRY_NONE(pEntry); -#ifdef GREENAP_SUPPORT - - if (greenap_get_capability(greenap) && - greenap_get_allow_status(greenap)) - greenap_check_peer_connection_at_link_up_down(pAd, wdev, - greenap); - -#endif /* GREENAP_SUPPORT */ -#ifdef R1KH_HARD_RETRY - RTMP_OS_EXIT_COMPLETION(&pEntry->ack_r1kh); -#endif /* R1KH_HARD_RETRY */ - } - NdisReleaseSpinLock(&pAd->MacTabLock); - /*Reset operating mode when no Sta.*/ - if (pAd->MacTab.Size == 0) { -#ifdef DOT11_N_SUPPORT - - for (i = 0; i < WDEV_NUM_MAX; i++) { - wdev = pAd->wdev_list[i]; - - if (!wdev) - continue; - - if (wdev->wdev_type != WDEV_TYPE_AP) - continue; - - addht = wlan_operate_get_addht(wdev); - addht->AddHtInfo2.OperaionMode = 0; - } - -#endif /* DOT11_N_SUPPORT */ - } - - return TRUE; -} - -/* - ========================================================================== - Description: - This routine reset the entire MAC table. All packets pending in - the power-saving queues are freed here. - ========================================================================== - */ -VOID MacTableResetWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - int i; -#ifdef CONFIG_AP_SUPPORT - UCHAR *pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - HEADER_802_11 DeAuthHdr; - USHORT Reason; - struct _BSS_STRUCT *mbss; -#endif /* CONFIG_AP_SUPPORT */ - MAC_TABLE_ENTRY *pMacEntry; - - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MacTableResetWdev\n")); - - /* TODO:Carter, check why start from 1 */ - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pMacEntry = &pAd->MacTab.Content[i]; - - if (pMacEntry->wdev != wdev) - continue; - - if (IS_ENTRY_CLIENT(pMacEntry)) { - pMacEntry->EnqueueEapolStartTimerRunning = - EAPOL_START_DISABLE; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - /* Before reset MacTable, send disassociation packet to client.*/ - if (pMacEntry->Sst == SST_ASSOC) { - /* send out a De-authentication request frame*/ - NStatus = MlmeAllocateMemory( - pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_MLME, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" MlmeAllocateMemory fail ..\n")); - /*NdisReleaseSpinLock(&pAd->MacTabLock);*/ - return; - } - - Reason = REASON_NO_LONGER_VALID; - -#ifdef MAP_R2 - if (IS_ENTRY_CLIENT(pMacEntry) && - IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc( - pAd, pMacEntry->wcid, - Reason); -#endif - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("Send DeAuth (Reason=%d) to %02x:%02x:%02x:%02x:%02x:%02x\n", - Reason, - PRINT_MAC(pMacEntry->Addr))); - MgtMacHeaderInit(pAd, &DeAuthHdr, - SUBTYPE_DEAUTH, 0, - pMacEntry->Addr, - wdev->if_addr, - wdev->bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), - &DeAuthHdr, 2, - &Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, - FrameLen); - MlmeFreeMemory(pOutBuffer); - RtmpusecDelay(5000); - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* Delete a entry via WCID */ - MacTableDeleteEntry(pAd, i, pMacEntry->Addr); - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - mbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; -#ifdef WSC_AP_SUPPORT - { - BOOLEAN Cancelled; - - RTMPCancelTimer(&mbss->wdev.WscControl.EapolTimer, - &Cancelled); - mbss->wdev.WscControl.EapolTimerRunning = FALSE; - NdisZeroMemory(mbss->wdev.WscControl.EntryAddr, - MAC_ADDR_LEN); - mbss->wdev.WscControl.EapMsgRunning = FALSE; - } -#endif /* WSC_AP_SUPPORT */ - mbss->StaCount = 0; - } -#endif /* CONFIG_AP_SUPPORT */ - return; -} - -VOID MacTableReset(RTMP_ADAPTER *pAd) -{ - int i; -#ifdef CONFIG_AP_SUPPORT -#ifdef RTMP_MAC_PCI - unsigned long IrqFlags = 0; -#endif /* RTMP_MAC_PCI */ - UCHAR *pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - HEADER_802_11 DeAuthHdr; - USHORT Reason; - UCHAR apidx = MAIN_MBSSID; -#endif /* CONFIG_AP_SUPPORT */ - MAC_TABLE_ENTRY *pMacEntry; - /* - MAC_TABLE_ENTRY *Hash[HASH_TABLE_SIZE]; - MAC_TABLE_ENTRY Content[MAX_LEN_OF_MAC_TABLE]; - NdisZeroMemory(Hash, sizeof(Hash)); - NdisZeroMemory(Content, sizeof(Content)); - */ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MacTableReset\n")); - - /*NdisAcquireSpinLock(&pAd->MacTabLock);*/ - - /* TODO:Carter, check why start from 1 */ - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pMacEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_CLIENT(pMacEntry)) { - pMacEntry->EnqueueEapolStartTimerRunning = - EAPOL_START_DISABLE; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - /* Before reset MacTable, send disassociation packet to client.*/ - if (pMacEntry->Sst == SST_ASSOC) { - /* send out a De-authentication request frame*/ - NStatus = MlmeAllocateMemory( - pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_MLME, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" MlmeAllocateMemory fail ..\n")); - /*NdisReleaseSpinLock(&pAd->MacTabLock);*/ - return; - } - - Reason = REASON_NO_LONGER_VALID; -#ifdef WIFI_DIAG - if (pMacEntry && - IS_ENTRY_CLIENT(pMacEntry)) - DiagConnError( - pAd, - pMacEntry->func_tb_idx, - pMacEntry->Addr, - DIAG_CONN_DEAUTH, - Reason); -#endif -#ifdef MAP_R2 - if (IS_ENTRY_CLIENT(pMacEntry) && - IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc( - pAd, pMacEntry->wcid, - Reason); -#endif - - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("Send DeAuth (Reason=%d) to %02x:%02x:%02x:%02x:%02x:%02x\n", - Reason, - PRINT_MAC(pMacEntry->Addr))); - MgtMacHeaderInit( - pAd, &DeAuthHdr, SUBTYPE_DEAUTH, - 0, pMacEntry->Addr, - pAd->ApCfg - .MBSSID[pMacEntry->func_tb_idx] - .wdev.if_addr, - pAd->ApCfg - .MBSSID[pMacEntry->func_tb_idx] - .wdev.bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), - &DeAuthHdr, 2, - &Reason, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, - FrameLen); - MlmeFreeMemory(pOutBuffer); - RtmpusecDelay(5000); - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* Delete a entry via WCID */ - MacTableDeleteEntry(pAd, i, pMacEntry->Addr); - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - MAC_TABLE_ENTRY **Hash = NULL; - MAC_TABLE_ENTRY *Content = NULL; - STA_TR_ENTRY *tr_entry = NULL; - - if (GET_MAX_UCAST_NUM(pAd) > MAX_LEN_OF_MAC_TABLE) { - ASSERT(0); - return; - } - - Hash = RtmpOsVmalloc(sizeof(struct _MAC_TABLE_ENTRY *) * - HASH_TABLE_SIZE); - if (!Hash) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" MACTABLE AllocateMemory Hash fail\n")); - ASSERT(0); - return; - } - Content = RtmpOsVmalloc(sizeof(struct _MAC_TABLE_ENTRY) * - GET_MAX_UCAST_NUM(pAd)); - if (!Content) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" MACTABLE AllocateMemory Content fail\n")); - RtmpOsVfree(Hash); - ASSERT(0); - return; - } - tr_entry = RtmpOsVmalloc(sizeof(STA_TR_ENTRY) * - MAX_LEN_OF_TR_TABLE); - if (!tr_entry) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" MACTABLE AllocateMemory tr_entry fail\n")); - RtmpOsVfree(Hash); - RtmpOsVfree(Content); - ASSERT(0); - return; - } - - NdisZeroMemory(&Hash[0], sizeof(struct _MAC_TABLE_ENTRY *) * - HASH_TABLE_SIZE); - NdisZeroMemory(&Content[0], sizeof(struct _MAC_TABLE_ENTRY) * - GET_MAX_UCAST_NUM(pAd)); - NdisZeroMemory(&tr_entry[0], - sizeof(STA_TR_ENTRY) * MAX_LEN_OF_TR_TABLE); - - /* MAC_TABLE_ENTRY Content[MAX_LEN_OF_MAC_TABLE]; */ - - for (apidx = MAIN_MBSSID; apidx < pAd->ApCfg.BssidNum; - apidx++) { -#ifdef WSC_AP_SUPPORT - BOOLEAN Cancelled; - - RTMPCancelTimer(&pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.EapolTimer, - &Cancelled); - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.EapolTimerRunning = FALSE; - NdisZeroMemory(pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.EntryAddr, - MAC_ADDR_LEN); - pAd->ApCfg.MBSSID[apidx].wdev.WscControl.EapMsgRunning = - FALSE; -#endif /* WSC_AP_SUPPORT */ - pAd->ApCfg.MBSSID[apidx].StaCount = 0; - } - -#ifdef RTMP_MAC_PCI - RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); -#endif /* RTMP_MAC_PCI */ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("McastPsQueue.Number %d...\n", - pAd->MacTab.McastPsQueue.Number)); - - if (pAd->MacTab.McastPsQueue.Number > 0) - APCleanupPsQueue(pAd, &pAd->MacTab.McastPsQueue); - - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("2McastPsQueue.Number %d...\n", - pAd->MacTab.McastPsQueue.Number)); - /* ENTRY PREEMPTION: Zero Mac Table but entry's content */ - /* NdisZeroMemory(&pAd->MacTab.Size, sizeof(MAC_TABLE)-offsetof(MAC_TABLE, Size)); */ - NdisCopyMemory(&Hash[0], pAd->MacTab.Hash, - sizeof(struct _MAC_TABLE_ENTRY *) * - HASH_TABLE_SIZE); - NdisCopyMemory(&Content[0], pAd->MacTab.Content, - sizeof(struct _MAC_TABLE_ENTRY) * - GET_MAX_UCAST_NUM(pAd)); - NdisCopyMemory(&tr_entry[0], pAd->MacTab.tr_entry, - sizeof(STA_TR_ENTRY) * MAX_LEN_OF_TR_TABLE); - NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE)); - NdisCopyMemory(pAd->MacTab.Hash, &Hash[0], - sizeof(struct _MAC_TABLE_ENTRY *) * - HASH_TABLE_SIZE); - NdisCopyMemory(pAd->MacTab.Content, &Content[0], - sizeof(struct _MAC_TABLE_ENTRY) * - GET_MAX_UCAST_NUM(pAd)); - NdisCopyMemory(pAd->MacTab.tr_entry, &tr_entry[0], - sizeof(STA_TR_ENTRY) * MAX_LEN_OF_TR_TABLE); - RtmpOsVfree(Hash); - RtmpOsVfree(Content); - RtmpOsVfree(tr_entry); - InitializeQueueHeader(&pAd->MacTab.McastPsQueue); - /*NdisReleaseSpinLock(&pAd->MacTabLock);*/ -#ifdef RTMP_MAC_PCI - RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); -#endif /* RTMP_MAC_PCI */ - } -#endif /* CONFIG_AP_SUPPORT */ - return; -} - -static VOID SetHtVhtForWdev(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ -#ifdef DOT11_N_SUPPORT - SetCommonHT(pAd, wdev); -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(wdev->PhyMode)) - SetCommonVHT(pAd, wdev); - -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ -} - -INT SetCommonHtVht(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - if (wdev) - SetHtVhtForWdev(pAd, wdev); - else - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Can't update HT/VHT due to wdev is null!\n", - __func__)); - - return TRUE; -} - -VOID mac_entry_lookup(RTMP_ADAPTER *pAd, UCHAR *pAddr, struct wifi_dev *wdev, - MAC_TABLE_ENTRY **entry) -{ - ULONG HashIdx; - MAC_TABLE_ENTRY *pEntry = NULL; - - HashIdx = MAC_ADDR_HASH_INDEX(pAddr); - pEntry = pAd->MacTab.Hash[HashIdx]; - - while (pEntry && !IS_ENTRY_NONE(pEntry)) { - if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) - break; - else - pEntry = pEntry->pNext; - } - - *entry = pEntry; -} - -/* -* Delete MacTableEntry and equeue to cmd thread -*/ -VOID mac_entry_delete(struct _RTMP_ADAPTER *ad, struct _MAC_TABLE_ENTRY *entry) -{ - RTEnqueueInternalCmd(ad, CMDTHRED_MAC_TABLE_DEL, (VOID *)entry, - sizeof(struct _MAC_TABLE_ENTRY)); -} - -INT test_flag_con_in_prog(ULONG *ConInPrgress) -{ - UCHAR i = 0, ConInProgInx; - INT ret = 0; -#if (MAX_LEN_OF_MAC_TABLE == 0) - ConInProgInx = 1; -#elif ((MAX_LEN_OF_MAC_TABLE % NUM_BITS_IN_ULONG) == 0) - ConInProgInx = - (MAX_LEN_OF_MAC_TABLE) / (sizeof(ULONG) * NUM_OF_BITS_IN_BYTE); -#else - ConInProgInx = - (MAX_LEN_OF_MAC_TABLE) / (sizeof(ULONG) * NUM_OF_BITS_IN_BYTE) + - 1; -#endif - while (i < ConInProgInx) { - if (ConInPrgress[i]) { - ret = 1; - break; - } - i++; - } - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_ht.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_ht.c deleted file mode 100644 index cd95c9663b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_ht.c +++ /dev/null @@ -1,1157 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" - -#ifdef DOT11_N_SUPPORT - -INT ht_support_bw_by_channel_boundary(RTMP_ADAPTER *pAd, - MAC_TABLE_ENTRY *pEntry, - IE_LISTS *peer_ie_list) -{ - struct wifi_dev *wdev = pEntry->wdev; - UCHAR supported_bw; - UCHAR ext_cha; - - if (!wdev) - return HT_BW_20; - - supported_bw = wlan_operate_get_ht_bw(wdev); - ext_cha = wlan_operate_get_ext_cha(wdev); - if (!peer_ie_list) - return supported_bw; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(), Channel = %d, supported_bw = %d, extcha = %d, PeerSupChlLen = %d\n", - __func__, wdev->channel, supported_bw, ext_cha, - peer_ie_list->SupportedChlLen)); - - /* So far, only check 2.4G band */ - if ((wdev->channel <= 14) && (peer_ie_list->SupportedChlLen >= 2)) { - UCHAR i; - UCHAR peer_sup_chl_min_2g = 1; - UCHAR peer_sup_chl_max_2g = 14; - - /* Get Min/Max 2.4G supported channels */ - for (i = 0; i < peer_ie_list->SupportedChlLen; i += 2) { - if (peer_ie_list->SupportedChl[i] <= 14) { - peer_sup_chl_min_2g = - peer_ie_list->SupportedChl[i]; - peer_sup_chl_max_2g = - peer_ie_list->SupportedChl[i] + - peer_ie_list->SupportedChl[i + 1] - 1; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - (" peer_sup_chl_min_2g = %d, peer_sup_chl_max_2g = %d\n", - peer_sup_chl_min_2g, - peer_sup_chl_max_2g)); - } - } - - /* Check Min/Max 2.4G channel boundary in BW40 case */ - if ((supported_bw == BW_40) && (ext_cha != EXTCHA_NONE)) { - if (((ext_cha == EXTCHA_ABOVE) && - ((wdev->channel + 4) > peer_sup_chl_max_2g)) || - ((ext_cha == EXTCHA_BELOW) && - ((wdev->channel - 4) < peer_sup_chl_min_2g))) - supported_bw = BW_20; - } - } - - return supported_bw; -} - -INT ht_mode_adjust(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - HT_CAPABILITY_IE *peer_ht_cap) -{ - struct wifi_dev *wdev = pEntry->wdev; - ADD_HT_INFO_IE *addht; - HT_CAPABILITY_IE *ht_cap; - - if (!wdev) - return FALSE; - - addht = wlan_operate_get_addht(wdev); - ht_cap = (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - - if ((peer_ht_cap->HtCapInfo.GF) && (ht_cap->HtCapInfo.GF)) - pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD; - else { - pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; - pAd->MacTab.fAnyStationNonGF = TRUE; - } - - pEntry->MaxHTPhyMode.field.BW = (peer_ht_cap->HtCapInfo.ChannelWidth & - wlan_operate_get_ht_bw(wdev)); - if (pEntry->MaxHTPhyMode.field.BW == HT_BW_40) { - pEntry->MaxHTPhyMode.field.ShortGI = - ((ht_cap->HtCapInfo.ShortGIfor40) & - (peer_ht_cap->HtCapInfo.ShortGIfor40)); - } else { - pEntry->MaxHTPhyMode.field.ShortGI = - ((ht_cap->HtCapInfo.ShortGIfor20) & - (peer_ht_cap->HtCapInfo.ShortGIfor20)); - pAd->MacTab.fAnyStation20Only = TRUE; - } - pEntry->MaxHTPhyMode.field.STBC = - (peer_ht_cap->HtCapInfo.RxSTBC & ht_cap->HtCapInfo.TxSTBC); - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(), MODE = %d, BW = %d, SGI = %d, STBC = %d\n", __func__, - pEntry->MaxHTPhyMode.field.MODE, - pEntry->MaxHTPhyMode.field.BW, - pEntry->MaxHTPhyMode.field.ShortGI, - pEntry->MaxHTPhyMode.field.STBC)); - return TRUE; -} - -INT set_ht_fixed_mcs(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - UCHAR fixed_mcs, UCHAR mcs_bound) -{ - if (fixed_mcs == 32) { - /* Fix MCS as HT Duplicated Mode */ - pEntry->MaxHTPhyMode.field.BW = 1; - pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; - pEntry->MaxHTPhyMode.field.STBC = 0; - pEntry->MaxHTPhyMode.field.ShortGI = 0; - pEntry->MaxHTPhyMode.field.MCS = 32; - } else if (pEntry->MaxHTPhyMode.field.MCS > mcs_bound) { - /* STA supports fixed MCS */ - pEntry->MaxHTPhyMode.field.MCS = mcs_bound; - } - - return TRUE; -} - -UINT8 get_max_nss_by_htcap_ie_mcs(UCHAR *cap_mcs) -{ - UINT8 index, nss = 0; - UCHAR bitmask; - - index = 32; - do { - index--; - nss = index / 8; - bitmask = (1 << (index - (nss * 8))); - - if (cap_mcs[nss] & bitmask) - break; - } while (index); - - return nss; -} - -INT get_ht_max_mcs(RTMP_ADAPTER *pAd, UCHAR *desire_mcs, UCHAR *cap_mcs) -{ - INT i, j; - UCHAR bitmask; - - for (i = 31; i >= 0; i--) { - j = i / 8; - bitmask = (1 << (i - (j * 8))); - - if ((desire_mcs[j] & bitmask) && (cap_mcs[j] & bitmask)) { - /*pEntry->MaxHTPhyMode.field.MCS = i; */ - /* find it !!*/ - break; - } - - if (i == 0) - break; - } - - return i; -} - -INT get_ht_cent_ch(RTMP_ADAPTER *pAd, UINT8 *rf_bw, UINT8 *ext_ch, - UCHAR Channel) -{ - UCHAR op_ht_bw = HT_BW_20; - UCHAR op_ext_cha = EXTCHA_NONE; - UCHAR i; - struct wifi_dev *wdev; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - wdev = pAd->wdev_list[i]; - - if (!wdev) - continue; - - /*check in the same band*/ - if (Channel == wdev->channel && - wlan_operate_get_state(wdev) == WLAN_OPER_STATE_INVALID) { - op_ht_bw = wlan_operate_get_ht_bw(wdev); - op_ext_cha = wlan_operate_get_ext_cha(wdev); - - if (op_ht_bw == HT_BW_40) - break; - } - } - - if ((op_ht_bw == BW_40) && (op_ext_cha == EXTCHA_ABOVE)) { - *rf_bw = BW_40; - *ext_ch = EXTCHA_ABOVE; - } else if ((Channel > 2) && (op_ht_bw == BW_40) && - (op_ext_cha == EXTCHA_BELOW)) { - *rf_bw = BW_40; - *ext_ch = EXTCHA_BELOW; - - } else - return FALSE; - - return TRUE; -} - -UCHAR cal_ht_cent_ch(UCHAR prim_ch, UCHAR phy_bw, UCHAR ext_cha, UCHAR *cen_ch) -{ - *cen_ch = prim_ch; - - if ((phy_bw == BW_40) && (ext_cha == EXTCHA_ABOVE)) - *cen_ch = prim_ch + 2; - else if ((prim_ch > 2) && (phy_bw == BW_40) && - (ext_cha == EXTCHA_BELOW)) { - if (prim_ch == 14) - *cen_ch = prim_ch - 1; - else - *cen_ch = prim_ch - 2; - } else - return FALSE; - - return TRUE; -} - -UCHAR get_cent_ch_by_htinfo(RTMP_ADAPTER *pAd, ADD_HT_INFO_IE *ht_op, - HT_CAPABILITY_IE *ht_cap) -{ - UCHAR cent_ch; - - if ((ht_op->ControlChan > 2) && - (ht_op->AddHtInfo.ExtChanOffset == EXTCHA_BELOW) && - (ht_cap->HtCapInfo.ChannelWidth == BW_40)) - cent_ch = ht_op->ControlChan - 2; - else if ((ht_op->AddHtInfo.ExtChanOffset == EXTCHA_ABOVE) && - (ht_cap->HtCapInfo.ChannelWidth == BW_40)) - cent_ch = ht_op->ControlChan + 2; - else - cent_ch = ht_op->ControlChan; - - return cent_ch; -} - -UINT16 ht_max_mpdu_size[2] = { 3839u, 7935u }; - -VOID set_sta_ht_cap(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *entry, - HT_CAPABILITY_IE *ht_ie) -{ - UCHAR ht_gi = GI_400; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - /* set HT capabilty flag for entry */ - CLIENT_STATUS_SET_FLAG(entry, fCLIENT_STATUS_HT_CAPABLE); - - ht_gi = wlan_config_get_ht_gi(entry->wdev); - if (ht_gi == GI_400) { - if (ht_ie->HtCapInfo.ShortGIfor20) - CLIENT_STATUS_SET_FLAG(entry, - fCLIENT_STATUS_SGI20_CAPABLE); - - if (ht_ie->HtCapInfo.ShortGIfor40) - CLIENT_STATUS_SET_FLAG(entry, - fCLIENT_STATUS_SGI40_CAPABLE); - } - - if (ht_ie->HtCapInfo.TxSTBC) - CLIENT_STATUS_SET_FLAG(entry, fCLIENT_STATUS_TxSTBC_CAPABLE); - - if (ht_ie->HtCapInfo.RxSTBC) - CLIENT_STATUS_SET_FLAG(entry, fCLIENT_STATUS_RxSTBC_CAPABLE); - - if (ht_ie->ExtHtCapInfo.PlusHTC) { - CLIENT_CAP_SET_FLAG(entry, fCLIENT_STATUS_HTC_CAPABLE); - CLIENT_STATUS_SET_FLAG(entry, fCLIENT_STATUS_HTC_CAPABLE); - } - - if (pAd->CommonCfg.bRdg && ht_ie->ExtHtCapInfo.RDGSupport) - CLIENT_STATUS_SET_FLAG(entry, fCLIENT_STATUS_RDG_CAPABLE); - - if (ht_ie->ExtHtCapInfo.MCSFeedback == 0x03) - CLIENT_STATUS_SET_FLAG(entry, - fCLIENT_STATUS_MCSFEEDBACK_CAPABLE); - - if (wlan_config_get_ht_ldpc(entry->wdev) && - (cap->phy_caps & fPHY_CAP_LDPC)) { - if (ht_ie->HtCapInfo.ht_rx_ldpc) - CLIENT_STATUS_SET_FLAG( - entry, fCLIENT_STATUS_HT_RX_LDPC_CAPABLE); - } - - if (wlan_config_get_amsdu_en(entry->wdev) && - (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE)) - CLIENT_STATUS_SET_FLAG(entry, fCLIENT_STATUS_AMSDU_INUSED); - - entry->MpduDensity = ht_ie->HtCapParm.MpduDensity; - entry->MaxRAmpduFactor = ht_ie->HtCapParm.MaxRAmpduFactor; - entry->MmpsMode = (UCHAR)ht_ie->HtCapInfo.MimoPs; - entry->AMsduSize = (UCHAR)ht_ie->HtCapInfo.AMsduSize; - - if (entry->AMsduSize < (ARRAY_SIZE(ht_max_mpdu_size))) - entry->amsdu_limit_len = ht_max_mpdu_size[entry->AMsduSize]; - else - entry->amsdu_limit_len = 0; - entry->amsdu_limit_len_adjust = entry->amsdu_limit_len; -} - -/* - ======================================================================== - Routine Description: - Caller ensures we has 802.11n support. - Calls at setting HT from AP/STASetinformation - - Arguments: - pAd - Pointer to our adapter - phymode - - - ======================================================================== -*/ -VOID RTMPSetHT(IN RTMP_ADAPTER *pAd, IN OID_SET_HT_PHYMODE *pHTPhyMode, - IN struct wifi_dev *wdev) -{ - INT idx; -#ifdef CONFIG_MULTI_CHANNEL -#if defined(RT_CFG80211_SUPPORT) && defined(CONFIG_AP_SUPPORT) - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[CFG_GO_BSSID_IDX]; -#endif /* defined(RT_CFG80211_SUPPORT) && defined(CONFIG_AP_SUPPORT) */ -#endif /* CONFIG_MULTI_CHANNEL */ - HT_CAPABILITY_IE *ht_cap = - (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - struct _RTMP_CHIP_CAP *cap; - - cap = hc_get_chip_cap(pAd->hdev_ctrl); -#ifdef CONFIG_AP_SUPPORT - - /* sanity check for extention channel */ - if (CHAN_PropertyCheck(pAd, pHTPhyMode->Channel, - CHANNEL_NO_FAT_BELOW | CHANNEL_NO_FAT_ABOVE) == - TRUE) { - /* only 20MHz is allowed */ - pHTPhyMode->BW = 0; - } else if (pHTPhyMode->ExtOffset == EXTCHA_BELOW) { - /* extension channel below this channel is not allowed */ - if (CHAN_PropertyCheck(pAd, pHTPhyMode->Channel, - CHANNEL_NO_FAT_BELOW) == TRUE) - pHTPhyMode->ExtOffset = EXTCHA_ABOVE; - } else if (pHTPhyMode->ExtOffset == EXTCHA_ABOVE) { - /* extension channel above this channel is not allowed */ - if (CHAN_PropertyCheck(pAd, pHTPhyMode->Channel, - CHANNEL_NO_FAT_ABOVE) == TRUE) - pHTPhyMode->ExtOffset = EXTCHA_BELOW; - } -#endif /* CONFIG_AP_SUPPORT */ - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n", - pHTPhyMode->HtMode, pHTPhyMode->ExtOffset, pHTPhyMode->MCS, - pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->SHORTGI)); - RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset, - sizeof(pAd->CommonCfg.NewExtChanOffset)); - - /* Decide Rx MCSSet*/ - ht_cap->MCSSet[3] = 0x00; - ht_cap->MCSSet[2] = 0x00; - ht_cap->MCSSet[1] = 0x00; - ht_cap->MCSSet[0] = 0x00; - switch (wlan_config_get_rx_stream(wdev)) { - case 4: -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - if (wdev->rate.Eap_HtSupRate_En == TRUE) - ht_cap->MCSSet[3] = wdev->rate.EapMCSSet[3]; - else -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - ht_cap->MCSSet[3] = 0xff; - /* FALLTHRU */ - - case 3: -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - if (wdev->rate.Eap_HtSupRate_En == TRUE) - ht_cap->MCSSet[2] = wdev->rate.EapMCSSet[2]; - else -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - ht_cap->MCSSet[2] = 0xff; - /* FALLTHRU */ - - case 2: -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - if (wdev->rate.Eap_HtSupRate_En == TRUE) - ht_cap->MCSSet[1] = wdev->rate.EapMCSSet[1]; - else -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - ht_cap->MCSSet[1] = 0xff; - /* FALLTHRU */ - - case 1: - default: -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - if (wdev->rate.Eap_HtSupRate_En == TRUE) - ht_cap->MCSSet[0] = wdev->rate.EapMCSSet[0]; - else -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - ht_cap->MCSSet[0] = 0xff; - - break; - } - - if (pAd->CommonCfg.bForty_Mhz_Intolerant && (pHTPhyMode->BW == BW_40)) { - pHTPhyMode->BW = BW_20; - wlan_config_set_40M_intolerant(wdev, 1); - } - - /* TODO: shiang-6590, how about the "bw" when channel 14 for JP region??? */ - if (pHTPhyMode->BW == BW_40) { - UCHAR ext_cha = (pHTPhyMode->ExtOffset == EXTCHA_BELOW) ? - (EXTCHA_BELOW) : - EXTCHA_ABOVE; - - ht_cap->MCSSet[4] = 0x1; /* MCS 32*/ - wlan_config_set_ht_bw(wdev, HT_BW_40); - - if (pHTPhyMode->Channel <= 14) - ht_cap->HtCapInfo.CCKmodein40 = 1; - - wlan_operate_set_ht_bw(wdev, HT_BW_40, ext_cha); - } else { - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - } - -#ifdef CONFIG_MULTI_CHANNEL -#if defined(RT_CFG80211_SUPPORT) && defined(CONFIG_AP_SUPPORT) - - if ((pHTPhyMode->BW == BW_20) && (pHTPhyMode->Channel != 0)) { - wlan_config_set_ht_bw(wdev, HT_BW_20); - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - } else if (INFRA_ON(pAd)) { - struct wifi_dev *p2p_dev = &pAd->StaCfg[0].wdev; - UCHAR ht_bw = wlan_config_get_ht_bw(p2p_dev); - UCHAR ext_cha = wlan_config_get_ext_cha(p2p_dev); - - wlan_operate_set_ht_bw(p2p_dev, ht_bw, ext_cha); - } - -#endif /* defined(RT_CFG80211_SUPPORT) && defined(CONFIG_AP_SUPPORT) */ -#endif /* CONFIG_MULTI_CHANNEL */ - -#ifdef TXBF_SUPPORT - - if (cap->FlgHwTxBfCap) { -#ifdef MT_MAC - /* Set ETxBF */ - mt_WrapSetETxBFCap(pAd, wdev, &ht_cap->TxBFCap); - /* Check ITxBF */ -#else - /* Set ETxBF */ - setETxBFCap(pAd, &ht_cap->TxBFCap); - /* Check ITxBF */ - pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn &= - rtmp_chk_itxbf_calibration(pAd); -#endif /* MT_MAC */ - /* Apply to ASIC */ - } - -#endif /* TXBF_SUPPORT */ -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) - RTMPSetIndividualHT(pAd, idx); - -#ifdef APCLI_SUPPORT - - for (idx = 0; idx < MAX_APCLI_NUM; idx++) - RTMPSetIndividualHT(pAd, - idx + MIN_NET_DEVICE_FOR_APCLI); - -#endif /* APCLI_SUPPORT */ - } -#endif /* CONFIG_AP_SUPPORT */ - /* dump_ht_cap(wdev); for Debug purpose */ -} - -/* - ======================================================================== - Routine Description: - Caller ensures we has 802.11n support. - Calls at setting HT from AP/STASetinformation - - Arguments: - pAd - Pointer to our adapter - phymode - - - ======================================================================== -*/ -VOID RTMPSetIndividualHT(RTMP_ADAPTER *pAd, UCHAR apidx) -{ - RT_PHY_INFO *pDesired_ht_phy = NULL; - UCHAR TxStream = 1; - UCHAR DesiredMcs = MCS_AUTO; - UINT32 encrypt_mode = 0; - struct wifi_dev *wdev = NULL; - UCHAR cfg_ht_bw; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): apidx=%d\n", __func__, apidx)); - - do { -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT - - if (apidx >= MIN_NET_DEVICE_FOR_APCLI) { - UCHAR idx = apidx - MIN_NET_DEVICE_FOR_APCLI; - - if (idx < MAX_APCLI_NUM) { - wdev = &pAd->ApCfg.ApCliTab[idx].wdev; - if (!wdev) - return; - pDesired_ht_phy = &wdev->DesiredHtPhyInfo; - DesiredMcs = - wdev->DesiredTransmitSetting.field.MCS; - encrypt_mode = wdev->SecConfig.PairwiseCipher; - wdev->bAutoTxRateSwitch = - (DesiredMcs == MCS_AUTO) ? TRUE : FALSE; - break; - } else { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: invalid idx(%d)\n", __func__, - idx)); - return; - } - } - -#endif /* APCLI_SUPPORT */ - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef WDS_SUPPORT - - if (apidx >= MIN_NET_DEVICE_FOR_WDS) { - UCHAR idx = apidx - MIN_NET_DEVICE_FOR_WDS; - - if (idx < MAX_WDS_ENTRY) { - wdev = &pAd->WdsTab.WdsEntry[idx].wdev; - if (!wdev) - return; - pDesired_ht_phy = - &wdev->DesiredHtPhyInfo; - DesiredMcs = - wdev->DesiredTransmitSetting - .field.MCS; - /*encrypt_mode = pAd->WdsTab.WdsEntry[idx].WepStatus;*/ - wdev->bAutoTxRateSwitch = - (DesiredMcs == MCS_AUTO) ? - TRUE : - FALSE; - break; - } else { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: invalid apidx(%d)\n", - __func__, apidx)); - return; - } - } - -#endif /* WDS_SUPPORT */ - - if ((apidx < pAd->ApCfg.BssidNum) && - (apidx < MAX_MBSSID_NUM(pAd)) && - (apidx < HW_BEACON_MAX_NUM)) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - if (!wdev) - return; - pDesired_ht_phy = &wdev->DesiredHtPhyInfo; - DesiredMcs = - wdev->DesiredTransmitSetting.field.MCS; -#ifdef WFA_VHT_PF - - /* TODO: Sigma, this code segment used to work around for Sigma Automation! */ - if (WMODE_CAP_AC(wdev->PhyMode) && - (DesiredMcs != MCS_AUTO)) { - DesiredMcs += - ((wlan_operate_get_tx_stream( - wdev) - - 1) - << 4); - pAd->ApCfg.MBSSID[apidx] - .DesiredTransmitSetting.field - .FixedTxMode = FIXED_TXMODE_VHT; - RT_CfgSetAutoFallBack(pAd, "0"); - } else - RT_CfgSetAutoFallBack(pAd, "1"); - -#endif /* WFA_VHT_PF */ - encrypt_mode = wdev->SecConfig.PairwiseCipher; - wdev->bWmmCapable = TRUE; - wdev->bAutoTxRateSwitch = - (DesiredMcs == MCS_AUTO) ? TRUE : FALSE; - break; - } - - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: invalid apidx(%d)\n", __func__, apidx)); - return; - } -#endif /* CONFIG_AP_SUPPORT */ - } while (FALSE); - - if (pDesired_ht_phy == NULL) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: invalid apidx(%d)\n", __func__, apidx)); - return; - } - - TxStream = wlan_operate_get_tx_stream(wdev); - - RTMPZeroMemory(pDesired_ht_phy, sizeof(RT_PHY_INFO)); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs)); - - /* Check the validity of MCS */ - if ((TxStream == 1) && - ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15))) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: MCS(%d) is invalid in 1S, reset it as MCS_7\n", - __func__, DesiredMcs)); - DesiredMcs = MCS_7; - } - - cfg_ht_bw = wlan_config_get_ht_bw(wdev); - - if ((cfg_ht_bw == HT_BW_20) && (DesiredMcs == MCS_32)) { - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n", - __func__)); - DesiredMcs = MCS_0; - } - - /* - WFA recommend to restrict the encryption type in 11n-HT mode. - So, the WEP and TKIP are not allowed in HT rate. - */ - if (pAd->CommonCfg.HT_DisallowTKIP && - IS_INVALID_HT_SECURITY(encrypt_mode)) { - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s : Use legacy rate in WEP/TKIP encryption mode (apidx=%d)\n", - __func__, apidx)); - return; - } - - if (pAd->CommonCfg.HT_Disable) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : HT is disabled\n", __func__)); - return; - } - - pDesired_ht_phy->bHtEnable = TRUE; - - /* Decide desired Tx MCS*/ - switch (TxStream) { - case 1: - if (DesiredMcs == MCS_AUTO) - pDesired_ht_phy->MCSSet[0] = 0xff; - else if (DesiredMcs <= MCS_7) - pDesired_ht_phy->MCSSet[0] = 1 << DesiredMcs; - - break; - - case 2: - if (DesiredMcs == MCS_AUTO) { - pDesired_ht_phy->MCSSet[0] = 0xff; - pDesired_ht_phy->MCSSet[1] = 0xff; - } else if (DesiredMcs <= MCS_15) { - ULONG mode; - - mode = DesiredMcs / 8; - - if (mode < 2) - pDesired_ht_phy->MCSSet[mode] = - (1 << (DesiredMcs - mode * 8)); - } - - break; - - case 3: - if (DesiredMcs == MCS_AUTO) { - /* MCS0 ~ MCS23, 3 bytes */ - pDesired_ht_phy->MCSSet[0] = 0xff; - pDesired_ht_phy->MCSSet[1] = 0xff; - pDesired_ht_phy->MCSSet[2] = 0xff; - } else if (DesiredMcs <= MCS_23) { - ULONG mode; - - mode = DesiredMcs / 8; - - if (mode < 3) - pDesired_ht_phy->MCSSet[mode] = - (1 << (DesiredMcs - mode * 8)); - } - - break; - - case 4: - if (DesiredMcs == MCS_AUTO) { - /* MCS0 ~ MCS31, 4 bytes */ - pDesired_ht_phy->MCSSet[0] = 0xff; - pDesired_ht_phy->MCSSet[1] = 0xff; - pDesired_ht_phy->MCSSet[2] = 0xff; - pDesired_ht_phy->MCSSet[3] = 0xff; - } else if (DesiredMcs <= MCS_31) { - ULONG mode; - - mode = DesiredMcs / 8; - - if (mode < 4) - pDesired_ht_phy->MCSSet[mode] = - (1 << (DesiredMcs - mode * 8)); - } - - break; - } - - if (cfg_ht_bw == HT_BW_40) { - if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32) - pDesired_ht_phy->MCSSet[4] = 0x1; - } - - /* update HT Rate setting */ - if (pAd->OpMode == OPMODE_STA) { - MlmeUpdateHtTxRates(pAd, BSS0); - } else - MlmeUpdateHtTxRates(pAd, apidx); - -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(wdev->PhyMode)) { - pDesired_ht_phy->bVhtEnable = TRUE; - rtmp_set_vht(pAd, wdev, pDesired_ht_phy); - } - -#endif /* DOT11_VHT_AC */ -} - -/* - ======================================================================== - Routine Description: - Clear the desire HT info per interface - - Arguments: - - ======================================================================== -*/ -VOID RTMPDisableDesiredHtInfo(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - RTMPZeroMemory(&wdev->DesiredHtPhyInfo, sizeof(RT_PHY_INFO)); -} - -INT SetCommonHT(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - OID_SET_HT_PHYMODE SetHT; - UCHAR op_ht_bw = wlan_operate_get_ht_bw(wdev); - UCHAR ext_cha = wlan_operate_get_ext_cha(wdev); - - if (!WMODE_CAP_N(wdev->PhyMode)) { - /* Clear previous HT information */ - RTMPDisableDesiredHtInfo(pAd, wdev); - return FALSE; - } - - SetHT.PhyMode = (RT_802_11_PHY_MODE)(wdev->PhyMode); - SetHT.TransmitNo = ((UCHAR)pAd->Antenna.field.TxPath); - SetHT.HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE; - SetHT.MCS = MCS_AUTO; - SetHT.STBC = wlan_config_get_ht_stbc(wdev); - SetHT.SHORTGI = (UCHAR)wlan_config_get_ht_gi(wdev); - SetHT.Channel = wdev->channel; - SetHT.BandIdx = 0; -#ifdef BW_VENDOR10_CUSTOM_FEATURE - if (IS_APCLI_BW_SYNC_FEATURE_ENBL(pAd)) { - SetHT.BW = wlan_config_get_ht_bw(wdev); - SetHT.ExtOffset = (SetHT.BW == BW_20) ? (0) : (ext_cha); - } else { -#endif - SetHT.BW = (UCHAR)op_ht_bw; - SetHT.ExtOffset = ext_cha; -#ifdef BW_VENDOR10_CUSTOM_FEATURE - } -#endif - - RTMPSetHT(pAd, &SetHT, wdev); -#ifdef DOT11N_DRAFT3 - - if (pAd->CommonCfg.bBssCoexEnable && - pAd->CommonCfg.Bss2040NeedFallBack) { - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - pAd->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq = 1; - pAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC; - pAd->CommonCfg.Bss2040NeedFallBack = 1; - } - -#endif /* DOT11N_DRAFT3 */ - return TRUE; -} - -/* - ======================================================================== - Routine Description: - Update HT IE from our capability. - - Arguments: - Send all HT IE in beacon/probe rsp/assoc rsp/action frame. - - - ======================================================================== -*/ -VOID RTMPUpdateHTIE(IN UCHAR *pMcsSet, IN struct wifi_dev *wdev, - OUT HT_CAPABILITY_IE *pHtCapability, - OUT ADD_HT_INFO_IE *pAddHtInfo) -{ - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - UCHAR op_ht_bw = wlan_config_get_ht_bw(wdev); - HT_CAPABILITY_IE *ht_cap = - (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - struct _ADD_HT_INFO_IE *add_ht = wlan_operate_get_addht(wdev); - - RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE)); - RTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE)); - pHtCapability->HtCapInfo.ChannelWidth = cfg_ht_bw; - pHtCapability->HtCapInfo.MimoPs = ht_cap->HtCapInfo.MimoPs; - pHtCapability->HtCapInfo.GF = ht_cap->HtCapInfo.GF; - pHtCapability->HtCapInfo.ShortGIfor20 = ht_cap->HtCapInfo.ShortGIfor20; - pHtCapability->HtCapInfo.ShortGIfor40 = ht_cap->HtCapInfo.ShortGIfor40; - pHtCapability->HtCapInfo.TxSTBC = ht_cap->HtCapInfo.TxSTBC; - pHtCapability->HtCapInfo.RxSTBC = ht_cap->HtCapInfo.RxSTBC; - pHtCapability->HtCapInfo.AMsduSize = ht_cap->HtCapInfo.AMsduSize; - pHtCapability->HtCapParm.MaxRAmpduFactor = - ht_cap->HtCapParm.MaxRAmpduFactor; - pHtCapability->HtCapParm.MpduDensity = ht_cap->HtCapParm.MpduDensity; - pAddHtInfo->AddHtInfo.ExtChanOffset = add_ht->AddHtInfo.ExtChanOffset; - pAddHtInfo->AddHtInfo.RecomWidth = op_ht_bw; - pAddHtInfo->AddHtInfo2.OperaionMode = add_ht->AddHtInfo2.OperaionMode; - pAddHtInfo->AddHtInfo2.NonGfPresent = add_ht->AddHtInfo2.NonGfPresent; - RTMPMoveMemory( - pAddHtInfo->MCSSet, pMcsSet, - 4); /* rt2860 only support MCS max=32, no need to copy all 16 uchar.*/ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTMPUpdateHTIE <==\n")); -} - -/*sta rec ht features decision*/ -UINT32 starec_ht_feature_decision(struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, - UINT32 *feature) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - UINT32 features = 0; - UCHAR amsdu_en = wlan_config_get_amsdu_en(wdev); - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - - if ((cap->SupportAMSDU == TRUE) && amsdu_en) { - features |= STA_REC_AMSDU_FEATURE; -#ifdef HW_TX_AMSDU_SUPPORT - /* notify FW the entry is support HW AMSDU and config HW AMSDU parameter (length and number) */ - features |= STA_REC_HW_AMSDU_FEATURE; -#endif - entry->tx_amsdu_bitmap = 0xffff; - } else { - entry->tx_amsdu_bitmap = 0x0; - } - - if (CLIENT_STATUS_TEST_FLAG(entry, fCLIENT_STATUS_HT_CAPABLE)) - features |= STA_REC_BASIC_HT_INFO_FEATURE; - - /*return value, must use or operation*/ - *feature |= features; - return TRUE; -} - -static INT build_bcm_ht_cap_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *buf) -{ - const UCHAR BROADCOM[4] = { 0x0, 0x90, 0x4c, 0x33 }; - UCHAR HtLen; - INT len = 0; - HT_CAPABILITY_IE HtCapabilityTmp; - HT_CAPABILITY_IE *curr_ht_cap = - (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - - HtLen = SIZE_HT_CAP_IE + 4; /* including BCM IE */ - NdisMoveMemory(&HtCapabilityTmp, curr_ht_cap, SIZE_HT_CAP_IE); - HtCapabilityTmp.HtCapInfo.ChannelWidth = cfg_ht_bw; - - if (HcIsBfCapSupport(wdev) == FALSE) { - UCHAR ucEBfCap; - - ucEBfCap = wlan_config_get_etxbf(wdev); - wlan_config_set_etxbf(wdev, SUBF_OFF); - mt_WrapSetETxBFCap(pAd, wdev, &HtCapabilityTmp.TxBFCap); - wlan_config_set_etxbf(wdev, ucEBfCap); - } - -#ifdef RT_BIG_ENDIAN - *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = - SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); -#ifdef UNALIGNMENT_SUPPORT - { - EXT_HT_CAP_INFO extHtCapInfo; - - NdisMoveMemory((PUCHAR)(&extHtCapInfo), - (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), - sizeof(EXT_HT_CAP_INFO)); - *(USHORT *)(&extHtCapInfo) = - cpu2le16(*(USHORT *)(&extHtCapInfo)); - NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), - (PUCHAR)(&extHtCapInfo), - sizeof(EXT_HT_CAP_INFO)); - } -#else - *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = - cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); -#endif /* UNALIGNMENT_SUPPORT */ -#endif /* RT_BIG_ENDIAN */ - - MAKE_IE_TO_BUF(buf, &WpaIe, 1, len); - MAKE_IE_TO_BUF(buf, &HtLen, 1, len); - MAKE_IE_TO_BUF(buf, BROADCOM, 4, len); - MAKE_IE_TO_BUF(buf, &HtCapabilityTmp, SIZE_HT_CAP_IE, len); - - return len; -} - -static INT build_bcm_ht_op_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *buf) -{ - INT len = 0; - - const UCHAR BROADCOM_AHTINFO[4] = { 0x0, 0x90, 0x4c, 0x34 }; - UCHAR AddHtLen = 0; - ADD_HT_INFO_IE *addht; -#ifdef RT_BIG_ENDIAN - ADD_HT_INFO_IE addHTInfoTmp; -#endif /* RT_BIG_ENDIAN */ - UCHAR epigram_ie_len = 0; - - addht = wlan_operate_get_addht(wdev); - AddHtLen = sizeof(ADD_HT_INFO_IE); - epigram_ie_len = AddHtLen + 4; - - /*New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame */ -#ifdef RT_BIG_ENDIAN - NdisMoveMemory(&addHTInfoTmp, addht, AddHtLen); - *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = - SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); - *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = - SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); - - MAKE_IE_TO_BUF(buf, &WpaIe, 1, len); - MAKE_IE_TO_BUF(buf, &epigram_ie_len, 1, len); - MAKE_IE_TO_BUF(buf, BROADCOM_AHTINFO, 4, len) - MAKE_IE_TO_BUF(buf, &addHTInfoTmp, AddHtLen, len); -#else - - MAKE_IE_TO_BUF(buf, &WpaIe, 1, len); - MAKE_IE_TO_BUF(buf, &epigram_ie_len, 1, len); - MAKE_IE_TO_BUF(buf, BROADCOM_AHTINFO, 4, len) - MAKE_IE_TO_BUF(buf, addht, AddHtLen, len); -#endif /* RT_BIG_ENDIAN */ - - return len; -} - -static INT build_ht_cap_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *buf) -{ - UCHAR HtLen = 0; - INT len = 0; - HT_CAPABILITY_IE HtCapabilityTmp; - HT_CAPABILITY_IE *curr_ht_cap = - (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - - HtLen = sizeof(HT_CAPABILITY_IE); - NdisMoveMemory(&HtCapabilityTmp, curr_ht_cap, HtLen); - HtCapabilityTmp.HtCapInfo.ChannelWidth = cfg_ht_bw; - -#ifdef TXBF_SUPPORT - if (HcIsBfCapSupport(wdev) == FALSE) { - UCHAR ucEBfCap; - - ucEBfCap = wlan_config_get_etxbf(wdev); - wlan_config_set_etxbf(wdev, SUBF_OFF); - mt_WrapSetETxBFCap(pAd, wdev, &HtCapabilityTmp.TxBFCap); - wlan_config_set_etxbf(wdev, ucEBfCap); - } -#endif /* TXBF_SUPPORT */ - -#ifdef RT_BIG_ENDIAN - *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = - SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); -#ifdef UNALIGNMENT_SUPPORT - { - EXT_HT_CAP_INFO extHtCapInfo; - - NdisMoveMemory((PUCHAR)(&extHtCapInfo), - (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), - sizeof(EXT_HT_CAP_INFO)); - *(USHORT *)(&extHtCapInfo) = - cpu2le16(*(USHORT *)(&extHtCapInfo)); - NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), - (PUCHAR)(&extHtCapInfo), - sizeof(EXT_HT_CAP_INFO)); - } -#else - *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = - cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); -#endif /* UNALIGNMENT_SUPPORT */ -#endif /* RT_BIG_ENDIAN */ - - MAKE_IE_TO_BUF(buf, &HtCapIe, 1, len); - MAKE_IE_TO_BUF(buf, &HtLen, 1, len); - MAKE_IE_TO_BUF(buf, &HtCapabilityTmp, HtLen, len); - - return len; -} - -static INT build_ht_op_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *buf) -{ - INT len = 0; - UCHAR AddHtLen = 0; - ADD_HT_INFO_IE *addht; -#ifdef RT_BIG_ENDIAN - ADD_HT_INFO_IE addHTInfoTmp; -#endif /* RT_BIG_ENDIAN */ - - addht = wlan_operate_get_addht(wdev); - AddHtLen = sizeof(ADD_HT_INFO_IE); - - /*New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame */ -#ifdef RT_BIG_ENDIAN - NdisMoveMemory(&addHTInfoTmp, addht, AddHtLen); - *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = - SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); - *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = - SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); - - MAKE_IE_TO_BUF(buf, &AddHtInfoIe, 1, len); - MAKE_IE_TO_BUF(buf, &AddHtLen, 1, len); - MAKE_IE_TO_BUF(buf, &addHTInfoTmp, AddHtLen, len); -#else - - MAKE_IE_TO_BUF(buf, &AddHtInfoIe, 1, len); - MAKE_IE_TO_BUF(buf, &AddHtLen, 1, len); - MAKE_IE_TO_BUF(buf, addht, AddHtLen, len); -#endif /* RT_BIG_ENDIAN */ - - return len; -} - -static INT build_overlapping_bss_ie(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR Channel, UCHAR *buf) -{ - INT len = 0; - UCHAR cfg_ht_bw = HT_BW_20; - -#ifdef DOT11N_DRAFT3 - cfg_ht_bw = wlan_config_get_ht_bw(wdev); - - /* P802.11n_D3.03, 7.3.2.60 Overlapping BSS Scan Parameters IE */ - if ((Channel <= 14) && (cfg_ht_bw == HT_BW_40)) { - OVERLAP_BSS_SCAN_IE OverlapScanParam; - UCHAR OverlapScanIE, ScanIELen; - - OverlapScanIE = IE_OVERLAPBSS_SCAN_PARM; - ScanIELen = 14; - OverlapScanParam.ScanPassiveDwell = - cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveDwell); - OverlapScanParam.ScanActiveDwell = - cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveDwell); - OverlapScanParam.TriggerScanInt = - cpu2le16(pAd->CommonCfg.Dot11BssWidthTriggerScanInt); - OverlapScanParam.PassiveTalPerChannel = cpu2le16( - pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel); - OverlapScanParam.ActiveTalPerChannel = cpu2le16( - pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel); - OverlapScanParam.DelayFactor = cpu2le16( - pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor); - OverlapScanParam.ScanActThre = - cpu2le16(pAd->CommonCfg.Dot11OBssScanActivityThre); - - MAKE_IE_TO_BUF(buf, &OverlapScanIE, 1, len); - MAKE_IE_TO_BUF(buf, &ScanIELen, 1, len); - MAKE_IE_TO_BUF(buf, &OverlapScanParam, ScanIELen, len); - } -#endif /* DOT11N_DRAFT3 */ - - return len; -} - -INT build_ht_ies(RTMP_ADAPTER *pAd, struct _build_ie_info *info) -{ - INT len = 0; - - if (info->is_draft_n_type == TRUE) - len += build_bcm_ht_cap_ie(pAd, info->wdev, - (UCHAR *)(info->frame_buf + len)); - else - len += build_ht_cap_ie(pAd, info->wdev, - (UCHAR *)(info->frame_buf + len)); - - if ((info->frame_subtype == SUBTYPE_BEACON) || - (info->frame_subtype == SUBTYPE_PROBE_RSP) || - (info->frame_subtype == SUBTYPE_ASSOC_RSP) || - (info->frame_subtype == SUBTYPE_REASSOC_RSP)) { - if (info->is_draft_n_type == TRUE) - len += build_bcm_ht_op_ie( - pAd, info->wdev, - (UCHAR *)(info->frame_buf + len)); - else - len += build_ht_op_ie(pAd, info->wdev, - (UCHAR *)(info->frame_buf + len)); - } - - if ((info->frame_subtype == SUBTYPE_BEACON) || - (info->frame_subtype == SUBTYPE_PROBE_RSP) || - (info->frame_subtype == SUBTYPE_ASSOC_RSP) || - (info->frame_subtype == SUBTYPE_REASSOC_RSP)) { - len += build_overlapping_bss_ie( - pAd, info->wdev, info->channel, - (UCHAR *)(info->frame_buf + len)); - } - - return len; -} - -#endif /* DOT11_N_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_hw.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_hw.c deleted file mode 100644 index f49f6a49e7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_hw.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_vht.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_vht.c deleted file mode 100644 index de88fd2e1a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/mgmt/mgmt_vht.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" - -#ifdef DOT11_VHT_AC - -static char *vht_bw_str[] = { - "20/40", "80", "160", "80+80", "invalid", -}; - -char *VhtBw2Str(INT VhtBw) -{ - if (VhtBw <= VHT_BW_8080) - return vht_bw_str[VhtBw]; - else - return vht_bw_str[4]; -} -/* - ======================================================================== - Routine Description: - Caller ensures we has 802.11ac support. - Calls at setting VHT from AP/STASetinformation - - Arguments: - pAd - Pointer to our adapter - phymode - - - ======================================================================== -*/ -VOID RTMPSetVHT(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev) -{ -#ifdef VHT_TXBF_SUPPORT - VHT_CAP_INFO *vht_cap = &pAd->CommonCfg.vht_cap_ie.vht_cap; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (cap->FlgHwTxBfCap) { - /* Set ETxBF */ -#ifdef MT_MAC - mt_WrapSetVHTETxBFCap(pAd, wdev, vht_cap); -#else - setVHTETxBFCap(pAd, vht_cap); -#endif - } - -#endif /* TXBF_SUPPORT */ -} - -VOID rtmp_set_vht(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - RT_PHY_INFO *phy_info) -{ - UCHAR vht_bw; - - if (!phy_info) - return; - - vht_bw = wlan_config_get_vht_bw(wdev); - - if (phy_info->bVhtEnable) { - if (vht_bw <= VHT_BW_8080) - phy_info->vht_bw = vht_bw; - else - phy_info->vht_bw = VHT_BW_2040; - } -} - -INT SetCommonVHT(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - if (!WMODE_CAP_AC(wdev->PhyMode)) { - /* Clear previous VHT information */ - return FALSE; - } - - RTMPSetVHT(pAd, wdev); - return TRUE; -} - -#endif /* DOT11_VHT_AC */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/Makefile b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/Makefile deleted file mode 100644 index 3bbcd2e2cf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -export MODULE_FLAGS - -KBUILD_EXTRA_SYMBOLS+= $(RT28xx_DIR)/os/linux/Module.symvers - -ifdef CONFIG_WHNAT_SUPPORT -obj-m+= whnat/ -MODULE_LIST+=mt_whnat -endif - -clean: - find . -name "*.o" | xargs rm -rf - find . -name "*.ko" | xargs rm -rf - find . -name "modules.order" | xargs rm -rf - find . -name "Module.symvers" | xargs rm -rf -install: diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/Makefile b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/Makefile deleted file mode 100644 index 874b376507..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -ccflags-y += $(MODULE_FLAGS) -Inet/nat - -MODULE_NAME=mt_whnat - -OBJS:= woe_main.o -OBJS+= woe_basic.o -OBJS+= wed.o -OBJS+= wdma.o -OBJS+= woe_proc.o -OBJS+= woe_hw.o -OBJS+= woe_mt7615.o -OBJS+= woe_hif.o -OBJS+= woe_ser.o - -####################################### -# For integrating to kernel source -###################################### -obj-m += $(MODULE_NAME).o - - -$(MODULE_NAME)-objs += $(OBJS) - -install: - -clean: - rm -rf *.o *.ko *.modules .*.cmd .*.o *.order $(MODULE_NAME).mod.c diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wdma.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wdma.c deleted file mode 100644 index 250e3b74d9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wdma.c +++ /dev/null @@ -1,311 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - wdma.c -*/ - -#include "wdma.h" -#include "woe.h" - -/*global definition*/ -#define WDMA_DEV_NODE "mediatek,wed-wdma" - -/* -* -*/ -static void dump_wdma_rx_ring(struct whnat_ring *ring) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "hw_desc_base:\t%x\n", ring->hw_desc_base); - WHNAT_DBG(WHNAT_DBG_OFF, "hw_cnt_addr:\t%x\n", ring->hw_cnt_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "hw_cidx_addr:\t%x\n", ring->hw_cidx_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "hw_didx_addr:\t%x\n", ring->hw_didx_addr); -} -/* -* -*/ -static void dump_wdma_basic(struct wdma_entry *wdma) -{ - int i; - struct wdma_rx_ring_ctrl *ring_ctrl = - &wdma->res_ctrl.rx_ctrl.rx_ring_ctrl; - - WHNAT_DBG(WHNAT_DBG_OFF, "Base Addr:\t%lx\n", wdma->base_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "IRQ:\t%d:%d:%d\n", wdma->irq[0], wdma->irq[1], - wdma->irq[2]); - WHNAT_DBG(WHNAT_DBG_OFF, "Pdev:\t%p\n", wdma->pdev); - WHNAT_DBG(WHNAT_DBG_OFF, "Proc:\t%p\n", wdma->proc); - WHNAT_DBG(WHNAT_DBG_OFF, "ring_num:\t%d\n", ring_ctrl->ring_num); - WHNAT_DBG(WHNAT_DBG_OFF, "ring_len:\t%d\n", ring_ctrl->ring_len); - WHNAT_DBG(WHNAT_DBG_OFF, "rxd_len:\t%d\n", ring_ctrl->rxd_len); - - for (i = 0; i < ring_ctrl->ring_num; i++) { - dump_wdma_rx_ring(&ring_ctrl->ring[i]); - whnat_dump_dmabuf(&ring_ctrl->desc[i]); - } -} - -/* -* -*/ -static void dump_rx_ring_raw(struct wdma_entry *wdma, unsigned char ring_id, - unsigned int idx) -{ - struct whnat_ring *ring = - &wdma->res_ctrl.rx_ctrl.rx_ring_ctrl.ring[ring_id]; - unsigned char *addr; - unsigned int size; - /*WDMA Tx Ring content*/ - WHNAT_DBG(WHNAT_DBG_OFF, - "==========WDMA RX RING RAW (%d/0x%x)==========\n", ring_id, - idx); - whnat_dump_dmacb(&ring->cell[idx]); - addr = (unsigned char *)ring->cell[idx].alloc_va; - size = ring->cell[idx].alloc_size; - whnat_dump_raw("WDMA_RX_RING", addr, size); -} - -/* -* assign tx description for tx ring entry -*/ -#define DMADONE_DONE 1 -static int rx_dma_cb_init(struct whnat_dma_buf *desc, unsigned int idx, - struct whnat_dma_cb *dma_cb) -{ - struct WDMA_RXD *rxd; - - dma_cb->pkt = NULL; - /* Init Tx Ring Size, Va, Pa variables */ - dma_cb->alloc_size = sizeof(struct WDMA_RXD); - dma_cb->alloc_va = desc->alloc_va + (idx * dma_cb->alloc_size); - dma_cb->alloc_pa = desc->alloc_pa + (idx * dma_cb->alloc_size); - /* link the pre-allocated TxBuf to TXD */ - rxd = (struct WDMA_RXD *)dma_cb->alloc_va; - /* advance to next ring descriptor address */ - rxd->ddone = DMADONE_DONE; - return 0; -} - -/* -* local function -*/ -static void rx_ring_exit(struct wdma_entry *entry, unsigned char idx, - struct wdma_rx_ring_ctrl *ring_ctrl) -{ - struct whnat_dma_buf *desc = &ring_ctrl->desc[idx]; - - whnat_dma_buf_free(entry->pdev, desc); -} - -/* -* -*/ -static int rx_ring_init(struct wdma_entry *entry, unsigned char idx, - struct wdma_rx_ring_ctrl *ring_ctrl) -{ - int i; - unsigned int len = 0; - struct whnat_dma_buf *desc = &ring_ctrl->desc[idx]; - struct whnat_ring *ring = &ring_ctrl->ring[idx]; - unsigned int offset = idx * WIFI_RING_OFFSET; - - len = ring_ctrl->rxd_len * ring_ctrl->ring_len; - ring->hw_desc_base = WDMA_RX_BASE_PTR_0 + offset; - ring->hw_cnt_addr = WDMA_RX_MAX_CNT_0 + offset; - ring->hw_cidx_addr = WDMA_RX_CRX_IDX_0 + offset; - ring->hw_didx_addr = WDMA_RX_DRX_IDX_0 + offset; - - if (whnat_dma_buf_alloc(entry->pdev, desc, len) < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): allocate rx ring fail!\n", - __func__); - return -1; - } - - for (i = 0; i < ring_ctrl->ring_len; i++) - rx_dma_cb_init(desc, i, &ring->cell[i]); - - return 0; -} - -/* -* -*/ -static void wdma_rx_ring_exit(struct wdma_entry *wdma, - struct wdma_rx_ring_ctrl *ring_ctrl) -{ - int i; - - for (i = 0; i < ring_ctrl->ring_num; i++) - rx_ring_exit(wdma, i, ring_ctrl); - - if (ring_ctrl->ring) - kfree(ring_ctrl->ring); - - if (ring_ctrl->desc) - kfree(ring_ctrl->desc); - - memset(ring_ctrl, 0, sizeof(*ring_ctrl)); -} - -/* -* -*/ -static int wdma_rx_ring_init(struct wdma_entry *wdma, - struct wdma_rx_ring_ctrl *ring_ctrl) -{ - unsigned int len; - struct whnat_entry *whnat = (struct whnat_entry *)wdma->whnat; - int i; - - ring_ctrl->rxd_len = sizeof(struct WDMA_RXD); - ring_ctrl->ring_num = whnat->wifi.tx_ring_num; - ring_ctrl->ring_len = WDMA_TX_BM_RING_SIZE; - len = sizeof(struct whnat_dma_buf) * ring_ctrl->ring_num; - ring_ctrl->desc = kmalloc(len, GFP_KERNEL); - memset(ring_ctrl->desc, 0, len); - - if (!ring_ctrl->desc) - goto err; - - len = sizeof(struct whnat_ring) * ring_ctrl->ring_num; - ring_ctrl->ring = kmalloc(len, GFP_KERNEL); - memset(ring_ctrl->ring, 0, len); - - if (!ring_ctrl->ring) - goto err; - - len = ring_ctrl->ring_len * ring_ctrl->rxd_len; - - for (i = 0; i < ring_ctrl->ring_num; i++) { - if (rx_ring_init(wdma, i, ring_ctrl) < 0) - goto err; - } - - return 0; -err: - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): rx ring init faild\n", __func__); - wdma_rx_ring_exit(wdma, ring_ctrl); - return -1; -} - -/* -* -*/ -int wdma_init(struct platform_device *pdev, unsigned char idx, - struct wdma_entry *wdma) -{ - struct device_node *node = NULL; - unsigned char i = 0; - unsigned char irq_idx = 0; - - node = of_find_compatible_node(NULL, NULL, WDMA_DEV_NODE); - WHNAT_DBG(WHNAT_DBG_INF, "%s(): get node=%p\n", __func__, &node); - /* iomap registers */ - wdma->base_addr = (unsigned long)of_iomap(node, idx); - wdma->pdev = pdev; - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): wdma(%d) base addr=%lx\n", __func__, - idx, wdma->base_addr); - - for (i = 0; i < WDMA_IRQ_NUM; i++) { - irq_idx = i + (idx * WDMA_IRQ_NUM); - wdma->irq[i] = irq_of_parse_and_map(node, irq_idx); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): wdma(%d) irq[%d]=%d\n", - __func__, idx, i, wdma->irq[i]); - } - - memset(&wdma->res_ctrl, 0, sizeof(wdma->res_ctrl)); - /*initial wdma related resource*/ -#ifdef WED_HW_TX_SUPPORT - wdma_ring_init(wdma); -#endif - return 0; -} - -/* -* -*/ -int wdma_exit(struct platform_device *pdev, struct wdma_entry *wdma) -{ - if (wdma) { -#ifdef WED_HW_TX_SUPPORT - /*remove ring & token buffer*/ - wdma_ring_exit(wdma); -#endif - iounmap((void *)wdma->base_addr); - memset(wdma, 0, sizeof(*wdma)); - } - - return 0; -} - -/* -* -*/ -int wdma_ring_init(struct wdma_entry *wdma) -{ - struct wdma_res_ctrl *res = &wdma->res_ctrl; - struct wdma_rx_ctrl *rx_ctrl = &res->rx_ctrl; - - wdma_rx_ring_init(wdma, &rx_ctrl->rx_ring_ctrl); - return 0; -} - -/* -* -*/ -void wdma_ring_exit(struct wdma_entry *wdma) -{ - struct wdma_res_ctrl *res = &wdma->res_ctrl; - struct wdma_rx_ctrl *rx_ctrl = &res->rx_ctrl; - - wdma_rx_ring_exit(wdma, &rx_ctrl->rx_ring_ctrl); -} - -/* -* -*/ -void dump_wdma_value(struct wdma_entry *wdma, char *name, unsigned int addr) -{ - unsigned int value; - - WHNAT_IO_READ32(wdma, addr, &value); - WHNAT_DBG(WHNAT_DBG_OFF, "%s\t:%x\n", name, value); -} - -/* -* -*/ -void wdma_proc_handle(struct wdma_entry *wdma, char choice, char *arg) -{ - unsigned int i; - char *str; - char *end; - unsigned char idx; - - switch (choice) { - case WDMA_PROC_BASIC: - dump_wdma_basic(wdma); - break; - - case WDMA_PROC_RX_CELL: { - str = strsep(&arg, " "); - str = strsep(&arg, " "); - idx = whnat_str_tol(str, &end, 10); - str = strsep(&arg, " "); - i = whnat_str_tol(str, &end, 16); - dump_rx_ring_raw(wdma, idx, i); - } break; - - default: - break; - } -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wdma.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wdma.h deleted file mode 100644 index 418460bc44..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wdma.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - wdma.h -*/ - -#ifndef _WDMA_H -#define _WDMA_H - -#include "woe_basic.h" - -#define WDMA_IRQ_NUM 3 -#define WDMA_TX_BM_RING_SIZE 512 -#define WHNAT_WDMA_PORT 3 - -struct wdma_rx_ring_ctrl { - unsigned int ring_num; - unsigned int ring_len; - unsigned int rxd_len; - struct whnat_dma_buf *desc; - struct whnat_ring *ring; -}; - -struct wdma_rx_ctrl { - struct wdma_rx_ring_ctrl rx_ring_ctrl; -}; - -struct wdma_res_ctrl { - struct wdma_rx_ctrl rx_ctrl; -}; - -struct wdma_entry { - struct platform_device *pdev; - unsigned long base_addr; - unsigned int irq[WDMA_IRQ_NUM]; - struct wdma_res_ctrl res_ctrl; - void *proc; - void *whnat; -}; - -#ifdef RT_BIG_ENDIAN -struct WDMA_RXD { - /* Word 0 */ - unsigned int sdp0; - /* Word 1 */ - unsigned int ddone : 1; - unsigned int ls : 1; - unsigned int sdl0 : 14; - unsigned int res1 : 16; - /* Word 2 */ - unsigned int res2; - /* Word 3*/ - unsigned int rx_info; -} __packed; -#else -struct WDMA_RXD { - /* Word 0 */ - unsigned int sdp0; - /* Word 1 */ - unsigned int res1 : 16; - unsigned int sdl0 : 14; - unsigned int ls : 1; - unsigned int ddone : 1; - /*Word2 */ - unsigned int res2; - /*Word3*/ - unsigned int rx_info; -} __packed; -#endif - -enum { WDMA_PROC_BASIC = 0, WDMA_PROC_RX_CELL = 1, WDMA_PROC_END }; - -int wdma_init(struct platform_device *pdev, unsigned char idx, - struct wdma_entry *wdma); -int wdma_exit(struct platform_device *pdev, struct wdma_entry *wdma); - -int wdma_ring_init(struct wdma_entry *wdma); -void wdma_ring_exit(struct wdma_entry *wdma); -void wdma_dump_entry(struct wdma_entry *wdma); -void wdma_proc_handle(struct wdma_entry *wdma, char choice, char *value); -void dump_wdma_value(struct wdma_entry *wdma, char *name, unsigned int addr); - -/*CR Definition*/ - -#define WDMA_OFFSET 0x400 -#define WDMA0_OFST0 0x2a042a20 -#define WDMA0_OFST1 0x29002800 -#define WDMA1_OFST0 0x2e042e20 -#define WDMA1_OFST1 0x2d002c00 - -#define WDMA_BIT(shift) shift -/* - * WDMA0 Base: 0x1B102800 - * WDMA1 Base: 0x1B102C00 - */ -/*WDMA TX Ring #0 Base Pointer*/ -#define WDMA_TX_BASE_PTR_0 0x000 -#define WDMA_TX_BASE_PTR_0_TX_BASE_PTR WDMA_BIT(0) -/*WDMA TX Ring #0 Maximum Count*/ -#define WDMA_TX_MAX_CNT_0 0x004 -#define WDMA_TX_MAX_CNT_0_TX_MAX_CNT WDMA_BIT(0) -/*WDMA TX Ring #0 CPU pointer*/ -#define WDMA_TX_CTX_IDX_0 0x008 -#define WDMA_TX_CTX_IDX_0_TX_CTX_IDX WDMA_BIT(0) -/*WDMA TX Ring #0 DMA poitner*/ -#define WDMA_TX_DTX_IDX_0 0x00c -#define WDMA_TX_DTX_IDX_0_TX_DTX_IDX_MIRO WDMA_BIT(0) -/*WDMA TX Ring #1 Base Pointer*/ -#define WDMA_TX_BASE_PTR_1 0x010 -#define WDMA_TX_BASE_PTR_1_TX_BASE_PTR WDMA_BIT(0) -/*WDMA TX Ring #1 Maximum Count*/ -#define WDMA_TX_MAX_CNT_1 0x014 -#define WDMA_TX_MAX_CNT_1_TX_MAX_CNT WDMA_BIT(0) -/*WDMA TX Ring #1 CPU pointer*/ -#define WDMA_TX_CTX_IDX_1 0x018 -#define WDMA_TX_CTX_IDX_1_TX_CTX_IDX WDMA_BIT(0) -/*WDMA TX Ring #1 DMA poitner*/ -#define WDMA_TX_DTX_IDX_1 0x01c -#define WDMA_TX_DTX_IDX_1_TX_DTX_IDX_MIRO WDMA_BIT(0) -/*WDMA RX Ring #0 Base Pointer*/ -#define WDMA_RX_BASE_PTR_0 0x100 -#define WDMA_RX_BASE_PTR_0_RX_BASE_PTR WDMA_BIT(0) -/*WDMA RX Ring #0 Maximum Count*/ -#define WDMA_RX_MAX_CNT_0 0x104 -#define WDMA_RX_MAX_CNT_0_RX_MAX_CNT WDMA_BIT(0) -/*WDMA RX Ring #0 CPU pointer*/ -#define WDMA_RX_CRX_IDX_0 0x108 -#define WDMA_RX_CRX_IDX_0_RX_CRX_IDX WDMA_BIT(0) -/*WDMA RX Ring #0 DMA poitner*/ -#define WDMA_RX_DRX_IDX_0 0x10c -#define WDMA_RX_DRX_IDX_0_RX_DRX_IDX_MIRO WDMA_BIT(0) -/*WDMA RX Ring #1 Base Pointer*/ -#define WDMA_RX_BASE_PTR_1 0x110 -#define WDMA_RX_BASE_PTR_1_RX_BASE_PTR WDMA_BIT(0) -/*WDMA RX Ring #1 Maximum Count*/ -#define WDMA_RX_MAX_CNT_1 0x114 -#define WDMA_RX_MAX_CNT_1_RX_MAX_CNT WDMA_BIT(0) -/*WDMA RX Ring #1 CPU pointer*/ -#define WDMA_RX_CRX_IDX_1 0x118 -#define WDMA_RX_CRX_IDX_1_RX_CRX_IDX WDMA_BIT(0) -/*WDMA RX Ring #1 DMA poitner*/ -#define WDMA_RX_DRX_IDX_1 0x11c -#define WDMA_RX_DRX_IDX_1_RX_DRX_IDX_MIRO WDMA_BIT(0) -/*WDMA Information*/ -#define WDMA_INFO 0x200 -#define WDMA_INFO_REV WDMA_BIT(28) -#define WDMA_INFO_INDEX_WIDTH WDMA_BIT(24) -#define WDMA_INFO_BASE_PTR_WIDTH WDMA_BIT(16) -#define WDMA_INFO_RX_RING_NUM WDMA_BIT(8) -#define WDMA_INFO_TX_RING_NUM WDMA_BIT(0) -/*WDMA Global Configuration*/ -#define WDMA_GLO_CFG 0x204 -#define WDMA_GLO_CFG_RX_2B_OFFSET WDMA_BIT(31) -#define WDMA_GLO_CFG_CSR_CLKGATE_BYP WDMA_BIT(30) -#define WDMA_GLO_CFG_BYTE_SWAP WDMA_BIT(29) -#define WDMA_GLO_CFG_RX_INFO1_PRERESERVE WDMA_BIT(28) -#define WDMA_GLO_CFG_RX_INFO2_PRERESERVE WDMA_BIT(27) -#define WDMA_GLO_CFG_RX_INFO3_PRERESERVE WDMA_BIT(26) -#define WDMA_GLO_CFG_REV0 WDMA_BIT(11) -#define WDMA_GLO_CFG_MULTI_EN WDMA_BIT(10) -#define WDMA_GLO_CFG_EXT_FIFO_EN WDMA_BIT(9) -#define WDMA_GLO_CFG_DESC_32B_E WDMA_BIT(8) -#define WDMA_GLO_CFG_BIG_ENDIAN WDMA_BIT(7) -#define WDMA_GLO_CFG_TX_WB_DDONE WDMA_BIT(6) -#define WDMA_GLO_CFG_WDMA_BT_SIZE WDMA_BIT(4) -#define WDMA_GLO_CFG_RX_DMA_BUSY WDMA_BIT(3) -#define WDMA_GLO_CFG_RX_DMA_EN WDMA_BIT(2) -#define WDMA_GLO_CFG_TX_DMA_BUSY WDMA_BIT(1) -#define WDMA_GLO_CFG_TX_DMA_EN WDMA_BIT(0) -/*WDMA Reset Index*/ -#define WDMA_RST_IDX 0x208 -#define WDMA_RST_IDX_RST_DRX_IDX1 WDMA_BIT(17) -#define WDMA_RST_IDX_RST_DRX_IDX0 WDMA_BIT(16) -#define WDMA_RST_IDX_RST_DTX_IDX3 WDMA_BIT(3) -#define WDMA_RST_IDX_RST_DTX_IDX2 WDMA_BIT(2) -#define WDMA_RST_IDX_RST_DTX_IDX1 WDMA_BIT(1) -#define WDMA_RST_IDX_RST_DTX_IDX0 WDMA_BIT(0) - -/*WDMA Interrupt Status Record*/ -#define WDMA_INT_STA_REC 0x220 -#define WDMA_INT_STA_REC_RX_COHERENT WDMA_BIT(31) -#define WDMA_INT_STA_REC_RX_DLY_INT WDMA_BIT(30) -#define WDMA_INT_STA_REC_TX_COHERENT WDMA_BIT(29) -#define WDMA_INT_STA_REC_TX_DLY_INT WDMA_BIT(28) -#define WDMA_INT_STA_REC_RX_DONE_INT1 WDMA_BIT(17) -#define WDMA_INT_STA_REC_RX_DONE_INT0 WDMA_BIT(16) -#define WDMA_INT_STA_REC_TX_DONE_INT3 WDMA_BIT(3) -#define WDMA_INT_STA_REC_TX_DONE_INT2 WDMA_BIT(2) -#define WDMA_INT_STA_REC_TX_DONE_INT1 WDMA_BIT(1) -#define WDMA_INT_STA_REC_TX_DONE_INT0 WDMA_BIT(0) -/*WDMA Interrupt Mask*/ -#define WDMA_INT_MSK 0x228 -#define WDMA_INT_MSK_RX_COHERENT WDMA_BIT(31) -#define WDMA_INT_MSK_RX_DLY_INT WDMA_BIT(30) -#define WDMA_INT_MSK_TX_COHERENT WDMA_BIT(29) -#define WDMA_INT_MSK_TX_DLY_INT WDMA_BIT(28) -#define WDMA_INT_MSK_RX_DONE_INT1 WDMA_BIT(17) -#define WDMA_INT_MSK_RX_DONE_INT0 WDMA_BIT(16) -#define WDMA_INT_MSK_TX_DONE_INT3 WDMA_BIT(3) -#define WDMA_INT_MSK_TX_DONE_INT2 WDMA_BIT(2) -#define WDMA_INT_MSK_TX_DONE_INT1 WDMA_BIT(1) -#define WDMA_INT_MSK_TX_DONE_INT0 WDMA_BIT(0) - -#define WDMA_DELAY_INT_CFG 0x20C -#define WDMA_FREEQ_THRES 0x210 -#define WDMA_INT_STS_GRP0 0x240 -#define WDMA_INT_STS_GRP1 0x244 -#define WDMA_INT_STS_GRP2 0x248 -#define WDMA_INT_GRP1 0x250 -#define WDMA_INT_GRP2 0x254 -#define WDMA_SCH_Q01_CFG 0x280 -#define WDMA_SCH_Q23_CFG 0x284 - -#endif /*_WDMA_H*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed.c deleted file mode 100644 index 0396680276..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed.c +++ /dev/null @@ -1,1124 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - wed.c -*/ -#include "wed.h" -#include "woe.h" -#include "wed_def.h" -#include "woe_hw.h" -/*global definition*/ -#define WED_DEV_NODE "mediatek,wed" - -/* -*define local function -*/ - -/* -* -*/ -static void dump_tx_ring(struct whnat_ring *ring) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "hw_desc_base\t: 0x%x\n", ring->hw_desc_base); - WHNAT_DBG(WHNAT_DBG_OFF, "hw_cidx_addr\t: 0x%x\n", ring->hw_cidx_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "hw_didx_addr\t: 0x%x\n", ring->hw_didx_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "hw_cnt_addr\t: 0x%X\n", ring->hw_cnt_addr); -} - -/* -* -*/ -void dump_token_info(struct wed_buf_res *res, unsigned int id) -{ - struct wed_token_info *info; - struct list_head *cur; - unsigned int token_id = (id + WED_TOKEN_START); - - list_for_each (cur, &res->pkt_head) { - info = list_entry(cur, struct wed_token_info, list); - - if (token_id == info->token_id) { - WHNAT_DBG(WHNAT_DBG_OFF, "token_id\t: %d\n", - info->token_id); - WHNAT_DBG(WHNAT_DBG_OFF, "desc_len\t: %d\n", - info->desc_len); - WHNAT_DBG(WHNAT_DBG_OFF, "desc_pa\t: %pad\n", - &info->desc_pa); - WHNAT_DBG(WHNAT_DBG_OFF, "desc_va\t: 0x%p\n", - info->desc_va); - WHNAT_DBG(WHNAT_DBG_OFF, "len\t: %d\n", info->len); - WHNAT_DBG(WHNAT_DBG_OFF, "pkt\t: 0x%p\n", info->pkt); - WHNAT_DBG(WHNAT_DBG_OFF, "pkt_pa\t: %pad\n", - &info->pkt_pa); - WHNAT_DBG(WHNAT_DBG_OFF, "pkt_va\t: 0x%p\n", - info->pkt_va); - WHNAT_DBG(WHNAT_DBG_OFF, "fd_len\t: %d\n", - info->fd_len); - WHNAT_DBG(WHNAT_DBG_OFF, "fd_pa\t: %pad\n", - &info->fdesc_pa); - WHNAT_DBG(WHNAT_DBG_OFF, "fd_va\t: 0x%p\n", - info->fdesc_va); - whnat_dump_raw("WED_TX_DMAD", info->desc_va, - info->desc_len); - whnat_dump_raw("WED_TX_BM", info->fdesc_va, - info->fd_len); - } - } -} - -/* -* -*/ -static void dump_buf_res(struct wed_buf_res *res) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "token_num\t: %d\n", res->token_num); - WHNAT_DBG(WHNAT_DBG_OFF, "pkt_num\t: %d\n", res->pkt_num); - WHNAT_DBG(WHNAT_DBG_OFF, "des_buf\t:\n"); - whnat_dump_dmabuf(&res->des_buf); - WHNAT_DBG(WHNAT_DBG_OFF, "dma_len\t: %d\n", res->dmad_len); - WHNAT_DBG(WHNAT_DBG_OFF, "fbuf\t:\n"); - whnat_dump_dmabuf(&res->fbuf); - WHNAT_DBG(WHNAT_DBG_OFF, "buf_len\t: %d\n", res->fd_len); - WHNAT_DBG(WHNAT_DBG_OFF, "pkt_len\t: %d\n", res->pkt_len); -} - -/* -* -*/ -static void dump_tx_ring_ctrl_basic(struct wed_tx_ring_ctrl *ring_ctrl) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "txd_len\t: %d\n", ring_ctrl->txd_len); - WHNAT_DBG(WHNAT_DBG_OFF, "ring_num\t: %d\n", ring_ctrl->ring_num); - WHNAT_DBG(WHNAT_DBG_OFF, "ring_len\t: %d\n", ring_ctrl->ring_len); - WHNAT_DBG(WHNAT_DBG_OFF, "desc\t:\n"); - whnat_dump_dmabuf(ring_ctrl->desc); -} - -/* -* -*/ -static void dump_tx_ring_ctrl(struct wed_tx_ring_ctrl *ring_ctrl) -{ - unsigned char i; - - dump_tx_ring_ctrl_basic(ring_ctrl); - - for (i = 0; i < ring_ctrl->ring_num; i++) { - WHNAT_DBG(WHNAT_DBG_OFF, "ring\t: %d\n", i); - dump_tx_ring(&ring_ctrl->ring[i]); - } -} - -/* -* -*/ -static void dump_tx_ctrl(struct wed_tx_ctrl *tx_ctrl) -{ - struct wed_buf_res *res = &tx_ctrl->res; - struct wed_tx_ring_ctrl *ring_ctrl = &tx_ctrl->ring_ctrl; - - WHNAT_DBG(WHNAT_DBG_OFF, "buf_res\t:\n"); - dump_buf_res(res); - WHNAT_DBG(WHNAT_DBG_OFF, "ring_ctrl\t:\n"); - dump_tx_ring_ctrl(ring_ctrl); -} - -/* -* -*/ -static void dump_res_ctrl(struct wed_res_ctrl *res_ctrl) -{ - struct wed_tx_ctrl *tx_ctrl = &res_ctrl->tx_ctrl; - - WHNAT_DBG(WHNAT_DBG_OFF, "tx_ctrl:\n"); - dump_tx_ctrl(tx_ctrl); -} - -/* -* -*/ -void dump_wed_value(struct wed_entry *wed, char *name, unsigned int addr) -{ - unsigned int value; - - WHNAT_IO_READ32(wed, addr, &value); - WHNAT_DBG(WHNAT_DBG_OFF, "%s\t:%x\n", name, value); -} - -/* -* -*/ -static void dump_wed_debug_info(struct wed_entry *wed) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "==========WED DEBUG INFO:==========\n"); - dump_wed_value(wed, "WED_IRQ_MON", WED_IRQ_MON); - dump_wed_value(wed, "WED_TX_BM_VB_FREE_0_31", WED_TX_BM_VB_FREE_0_31); - dump_wed_value(wed, "WED_TX_BM_VB_FREE_32_63", WED_TX_BM_VB_FREE_32_63); - dump_wed_value(wed, "WED_TX_BM_VB_USED_0_31", WED_TX_BM_VB_USED_0_31); - dump_wed_value(wed, "WED_TX_BM_VB_USED_32_63", WED_TX_BM_VB_USED_32_63); - dump_wed_value(wed, "WED_WDMA_INT_MON", WED_WDMA_INT_MON); - dump_wed_value(wed, "WED_WPDMA_INT_CLR", WED_WPDMA_INT_CLR); - dump_wed_value(wed, "WED_WPDMA_INT_CTRL", WED_WPDMA_INT_CTRL); - dump_wed_value(wed, "WED_WPDMA_INT_MSK", WED_WPDMA_INT_MSK); - dump_wed_value(wed, "WED_WPDMA_INT_MON", WED_WPDMA_INT_MON); - dump_wed_value(wed, "WED_WPDMA_SPR", WED_WPDMA_SPR); - dump_wed_value(wed, "WED_PCIE_INTM_REC", WED_PCIE_INTM_REC); - dump_wed_value(wed, "WED_PCIE_INT_CTRL", WED_PCIE_INT_CTRL); - dump_wed_value(wed, "WED_TXD_DW0", WED_TXD_DW0); - dump_wed_value(wed, "WED_TXD_DW1", WED_TXD_DW1); - dump_wed_value(wed, "WED_TXD_DW2", WED_TXD_DW2); - dump_wed_value(wed, "WED_TXD_DW3", WED_TXD_DW3); - dump_wed_value(wed, "WED_TXD_DW4", WED_TXD_DW4); - dump_wed_value(wed, "WED_TXD_DW5", WED_TXD_DW5); - dump_wed_value(wed, "WED_TXD_DW6", WED_TXD_DW6); - dump_wed_value(wed, "WED_TXD_DW7", WED_TXD_DW7); - dump_wed_value(wed, "WED_TXP_DW0", WED_TXP_DW0); - dump_wed_value(wed, "WED_TXP_DW1", WED_TXP_DW1); - dump_wed_value(wed, "WED_DBG_CTRL", WED_DBG_CTRL); - dump_wed_value(wed, "WED_DBG_PRB0", WED_DBG_PRB0); - dump_wed_value(wed, "WED_DBG_PRB1", WED_DBG_PRB1); - dump_wed_value(wed, "WED_DBG_PRB2", WED_DBG_PRB2); - dump_wed_value(wed, "WED_DBG_PRB3", WED_DBG_PRB3); - dump_wed_value(wed, "WED_TX_COHERENT_MIB", WED_TX_COHERENT_MIB); - dump_wed_value(wed, "WED_TXP_DW0", WED_TXP_DW0); -} - -/* -* -*/ -static inline void eint_disable(struct wed_entry *wed, unsigned int isr) -{ - wed->ext_int_mask &= ~(1 << isr); -} - -/* -* -*/ -static inline void eint_enable(struct wed_entry *wed, unsigned int isr) -{ - wed->ext_int_mask |= (1 << isr); - whnat_hal_eint_ctrl(wed->whnat, TRUE); -} - -/* -* -*/ -struct sk_buff *alloc_dma_tx_pkt(struct platform_device *pdev, unsigned int len, - void **vaddr, dma_addr_t *paddr) -{ - struct sk_buff *pkt; -#ifdef BB_SOC - pkt = skbmgr_dev_alloc_skb4k(); -#else - pkt = dev_alloc_skb(len); -#endif - - if (pkt == NULL) - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): can't allocate tx %d size packet\n", __func__, - len); - - if (pkt) { - *vaddr = (void *)pkt->data; - *paddr = dma_map_single(&pdev->dev, *vaddr, len, - PCI_DMA_TODEVICE); - } else { - *vaddr = (void *)NULL; - *paddr = (dma_addr_t)0; - } - - return pkt; -} - -/* -* -*/ -int free_dma_tx_pkt(struct platform_device *pdev, struct sk_buff *pkt, - dma_addr_t pa, unsigned int len) -{ - if (pkt == NULL) - return -1; - - dma_unmap_single(&pdev->dev, pa, len, PCI_DMA_FROMDEVICE); - dev_kfree_skb_any(pkt); - return 0; -} - -/* -* -*/ -static void token_buf_exit(struct wed_entry *entry, struct wed_buf_res *res, - unsigned int sid, unsigned int size) - -{ -} - -/* -* -*/ -static int token_buf_init(struct wed_entry *entry, struct wed_buf_res *res, - unsigned int sid, unsigned int size) -{ - struct wed_token_info *info; - struct list_head *cur; - struct whnat_txdmad *txdma = NULL; - unsigned int eid = sid + size; - unsigned int id; - - list_for_each (cur, &res->pkt_head) { - info = list_entry(cur, struct wed_token_info, list); - - if (info->token_id > WED_TOKEN_END) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): token id out of range (%d,%d)!\n", - __func__, info->token_id, WED_TOKEN_END); - goto err; - } - - id = info->token_id - WED_TOKEN_START; - - if (id >= sid && id < eid) { - /*init token entry*/ - txdma = (struct whnat_txdmad *)info->desc_va; - txdma->sdp0 = info->fdesc_pa; - txdma->sdl0 = info->fd_len; - txdma->sdp1 = info->pkt_pa; - txdma->sdlen1 = info->len; - txdma->last0 = 0; - txdma->last1 = 1; - txdma->burst = 0; - txdma->ddone = 0; - /*init firt buf with MAC TXD+CR4 TXP*/ - wifi_fbuf_init((unsigned char *)info->fdesc_va, - txdma->sdp1, info->token_id); - } - } - return 0; -err: - token_buf_exit(entry, res, sid, size); - return -1; -} - -/* -* -*/ -static void token_info_free(struct wed_entry *entry, struct wed_buf_res *res, - unsigned int sid, unsigned int size) -{ - struct wed_token_info *info; - struct list_head *cur; - struct list_head *next; - struct platform_device *pdev = entry->pdev; - unsigned int id; - unsigned int eid = sid + size; - - list_for_each_safe (cur, next, &res->pkt_head) { - info = list_entry(cur, struct wed_token_info, list); - id = info->token_id - WED_TOKEN_START; - - if (id >= sid && id < eid) { - free_dma_tx_pkt(pdev, info->pkt, info->pkt_pa, - info->len); - list_del(&info->list); - memset(info, 0, sizeof(*info)); - kfree(info); - } - } -} - -/* -* -*/ -static int token_info_alloc(struct wed_entry *entry, struct wed_buf_res *res, - unsigned int sid, unsigned int size) -{ - unsigned int i; - unsigned int eid = sid + size; - struct wed_token_info *info; - - /*prepare info and add to list */ - for (i = sid; i < eid; i++) { - /*check token id*/ - if (i >= WED_TOKEN_CNT_MAX) { - WHNAT_DBG( - WHNAT_DBG_ERR, - "%s(): allocate wrong token id %d,sid=%d,size=%d!\n", - __func__, i, sid, eid); - goto err; - } - - /*allocate token info*/ - info = kmalloc(sizeof(struct wed_token_info), GFP_KERNEL); - - if (info == NULL) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): allocate token %d info fail!\n", - __func__, i); - goto err; - } - - memset(info, 0, sizeof(struct wed_token_info)); - info->token_id = (WED_TOKEN_START + i); - info->len = res->pkt_len; - /*allocate skb*/ - info->pkt = alloc_dma_tx_pkt(entry->pdev, info->len, - &info->pkt_va, &info->pkt_pa); - - if (info->pkt == NULL) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): allocate pkt for token %d fail!\n", - __func__, i); - kfree(info); - goto err; - } - - /*allocate txd*/ - info->desc_len = res->dmad_len; - info->desc_pa = res->des_buf.alloc_pa + (i * info->desc_len); - info->desc_va = res->des_buf.alloc_va + (i * info->desc_len); - /*allocate first buffer*/ - info->fd_len = res->fd_len; - info->fdesc_pa = res->fbuf.alloc_pa + (i * info->fd_len); - info->fdesc_va = res->fbuf.alloc_va + (i * info->fd_len); - /*insert to list*/ - list_add_tail(&info->list, &res->pkt_head); - } - - return 0; -err: - token_info_free(entry, res, sid, size); - return -1; -} - -/* -* -*/ -static void token_info_exit(struct wed_entry *entry, struct wed_buf_res *res) -{ - struct platform_device *pdev = entry->pdev; - - if (!res->des_buf.alloc_va) - return; - - token_info_free(entry, res, 0, res->pkt_num); - whnat_dma_buf_free(pdev, &res->des_buf); - whnat_dma_buf_free(pdev, &res->fbuf); -} - -/* -* -*/ -static int token_info_init(struct wed_entry *entry, struct wed_buf_res *res) -{ - unsigned int len; - - len = res->dmad_len * res->token_num; - - /*allocate wed descript buffer*/ - if (whnat_dma_buf_alloc(entry->pdev, &res->des_buf, len) < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): allocate txd buffer fail!\n", - __func__); - goto err; - } - - /*for test only*/ - { - unsigned int i; - struct whnat_txdmad *txd; - - for (i = 0; i < res->token_num; i++) { - txd = res->des_buf.alloc_va + (i * res->dmad_len); - txd->rsv = i; - } - } - /*allocate wed descript buffer*/ - len = res->fd_len * res->token_num; - - if (whnat_dma_buf_alloc(entry->pdev, &res->fbuf, len) < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): allocate txd buffer fail!\n", - __func__); - goto err; - } - - /*initial list */ - INIT_LIST_HEAD(&res->pkt_head); - - if (token_info_alloc(entry, res, 0, res->pkt_num) < 0) - goto err; - - return 0; -err: - token_info_exit(entry, res); - return -1; -} - -#ifdef WED_DYNAMIC_BM_SUPPORT -/* -* -*/ -static int token_buf_expend(struct wed_entry *entry, unsigned int grp_num) -{ - struct wed_tx_ctrl *tx_ctrl = &entry->res_ctrl.tx_ctrl; - struct wed_buf_res *res = &tx_ctrl->res; - unsigned int size = grp_num * WED_TOKEN_EXPEND_SIZE; - - /*tx resource allocate*/ - if (token_info_alloc(entry, res, res->pkt_num, size) < 0) - goto err; - - if (token_buf_init(entry, res, res->pkt_num, size) < 0) - goto err; - - res->pkt_num += WED_TOKEN_EXPEND_SIZE; - return 0; -err: - /*error handle*/ - token_info_free(entry, res, res->pkt_num, size); - return -1; -} - -/* -* -*/ -static void token_buf_reduce(struct wed_entry *entry, unsigned int grp_num) -{ - struct wed_tx_ctrl *tx_ctrl = &entry->res_ctrl.tx_ctrl; - struct wed_buf_res *res = &tx_ctrl->res; - unsigned int size = grp_num * WED_TOKEN_EXPEND_SIZE; - - res->pkt_num -= size; - /*tx buffer deinit*/ - token_buf_exit(entry, res, res->pkt_num, size); - /*tx resource allocate*/ - token_info_free(entry, res, res->pkt_num, size); -} - -/* -* -*/ -static void token_free_task(unsigned long data) -{ - struct wed_entry *wed = (struct wed_entry *)data; - struct wed_buf_res *res = &wed->res_ctrl.tx_ctrl.res; - unsigned int size = res->pkt_num - (1 * WED_TOKEN_EXPEND_SIZE); - - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): old packet num:%d\n", __func__, - res->pkt_num); - - if (size > WED_TOKEN_CNT) { - token_buf_reduce(wed, 1); - whnat_hal_bfm_update(wed, TRUE); - eint_enable(wed, (WED_EX_INT_STA_FLD_TX_FBUF_LTH | - WED_EX_INT_STA_FLD_TX_FBUF_HTH)); - } - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): update packet num:%d\n", __func__, - res->pkt_num); -} - -/* -* -*/ -static void token_alloc_task(unsigned long data) -{ - struct wed_entry *wed = (struct wed_entry *)data; - struct wed_buf_res *res = &wed->res_ctrl.tx_ctrl.res; - unsigned int size = res->pkt_num + (1 * WED_TOKEN_EXPEND_SIZE); - - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): old packet num:%d\n", __func__, - res->pkt_num); - - if (size <= WED_TOKEN_CNT_MAX) { - token_buf_expend(wed, 1); - whnat_hal_bfm_update(wed, FALSE); - eint_enable(wed, (WED_EX_INT_STA_FLD_TX_FBUF_LTH | - WED_EX_INT_STA_FLD_TX_FBUF_HTH)); - } - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): update packet num:%d\n", __func__, - res->pkt_num); -} -#endif /*WED_DYNAMIC_BM_SUPPORT*/ - -/* -* -*/ -static void tx_dma_cb_exit(struct wed_entry *entry, struct whnat_dma_cb *dma_cb) -{ - struct _TXD_STRUC *txd; - struct sk_buff *pkt; - - txd = (TXD_STRUC *)(dma_cb->alloc_va); - pkt = dma_cb->pkt; - - if (pkt) - free_dma_tx_pkt(entry->pdev, pkt, txd->SDPtr0, txd->SDLen0); - - /*Always assign pNdisPacket as NULL after clear*/ - dma_cb->pkt = NULL; - memset(dma_cb, 0, sizeof(struct whnat_dma_cb)); -} - -/* -* assign tx description for tx ring entry -*/ -static int tx_dma_cb_init(struct whnat_dma_buf *desc, unsigned int idx, - struct whnat_dma_cb *dma_cb) -{ - dma_cb->pkt = NULL; - /* Init Tx Ring Size, Va, Pa variables */ - dma_cb->alloc_size = WIFI_PDMA_TXD_SIZE; - dma_cb->alloc_va = desc->alloc_va + (idx * dma_cb->alloc_size); - dma_cb->alloc_pa = desc->alloc_pa + (idx * dma_cb->alloc_size); - /* advance to next ring descriptor address */ - WIFI_TXD_INIT(dma_cb->alloc_va); - return 0; -} - -/* -* -*/ -static void tx_ring_exit(struct wed_entry *entry, struct whnat_ring *ring, - struct whnat_dma_buf *desc) -{ - unsigned int i; - - for (i = 0; i < WIFI_TX_RING_SIZE; i++) - tx_dma_cb_exit(entry, &ring->cell[i]); - - whnat_dma_buf_free(entry->pdev, desc); -} - -/* -* -*/ -static int tx_ring_init(struct wed_entry *entry, unsigned char idx, - struct wed_tx_ring_ctrl *ring_ctrl) -{ - unsigned int i; - unsigned int len; - struct whnat_ring *ring = &ring_ctrl->ring[idx]; - struct whnat_dma_buf *desc = &ring_ctrl->desc[idx]; - unsigned int offset = idx * WIFI_RING_OFFSET; - - len = ring_ctrl->txd_len * ring_ctrl->ring_len; - - if (whnat_dma_buf_alloc(entry->pdev, desc, len) < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): allocate desc fail, len=%d\n", - __func__, len); - return -1; - } - - /*should find wifi cr & control it*/ - ring->hw_desc_base = - whnat_wifi_cr_get(WHNAT_CR_WED, WED_TX0_CTRL0 + offset); - ring->hw_cnt_addr = - whnat_wifi_cr_get(WHNAT_CR_WED, WED_TX0_CTRL1 + offset); - ring->hw_cidx_addr = - whnat_wifi_cr_get(WHNAT_CR_WED, WED_TX0_CTRL2 + offset); - ring->hw_didx_addr = - whnat_wifi_cr_get(WHNAT_CR_WED, WED_TX0_CTRL3 + offset); - - for (i = 0; i < ring_ctrl->ring_len; i++) - tx_dma_cb_init(desc, i, &ring->cell[i]); - - return 0; -} - -/* -* -*/ -static int tx_ring_reset(struct wed_entry *entry, unsigned char idx, - struct wed_tx_ring_ctrl *ring_ctrl) -{ - unsigned int i; - struct whnat_ring *ring = &ring_ctrl->ring[idx]; - struct whnat_dma_buf *desc = &ring_ctrl->desc[idx]; - struct whnat_dma_cb *dma_cb; - - for (i = 0; i < ring_ctrl->ring_len; i++) { - dma_cb = &ring->cell[i]; - - if (dma_cb->pkt) - tx_dma_cb_exit(entry, dma_cb); - - tx_dma_cb_init(desc, i, dma_cb); - } - - return 0; -} - -/* -* -*/ -static void wed_tx_ring_exit(struct wed_entry *entry, - struct wed_tx_ctrl *tx_ctrl) -{ - struct wed_tx_ring_ctrl *ring_ctrl = &tx_ctrl->ring_ctrl; - unsigned int len; - unsigned char i; - - len = sizeof(struct whnat_ring) * ring_ctrl->ring_num; - - /*free skb in ring*/ - for (i = 0; i < ring_ctrl->ring_num; i++) - tx_ring_exit(entry, &ring_ctrl->ring[i], &ring_ctrl->desc[i]); - - /*free wed tx ring*/ - kfree(ring_ctrl->ring); - /*free desc*/ - kfree(ring_ctrl->desc); -} - -/* -* -*/ -static int wed_tx_ring_init(struct wed_entry *entry, - struct wed_tx_ctrl *tx_ctrl) -{ - struct wed_tx_ring_ctrl *ring_ctrl = &tx_ctrl->ring_ctrl; - struct whnat_entry *whnat = (struct whnat_entry *)entry->whnat; - unsigned int len; - unsigned char i; - - ring_ctrl->ring_num = whnat->wifi.tx_ring_num; - ring_ctrl->ring_len = WIFI_TX_RING_SIZE; - ring_ctrl->txd_len = WIFI_PDMA_TXD_SIZE; - /*allocate wed descript for original chip ring*/ - len = sizeof(struct whnat_dma_buf) * ring_ctrl->ring_num; - ring_ctrl->desc = kmalloc(len, GFP_KERNEL); - memset(ring_ctrl->desc, 0, len); - - if (!ring_ctrl->desc) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): allocate tx desc faild\n", - __func__); - goto err; - } - - /*allocate wed tx ring, assign initial value */ - len = sizeof(struct whnat_ring) * ring_ctrl->ring_num; - ring_ctrl->ring = kmalloc(len, GFP_KERNEL); - memset(ring_ctrl->ring, 0, len); - - if (!ring_ctrl->ring) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): allocate tx ring faild\n", - __func__); - goto err; - } - - for (i = 0; i < ring_ctrl->ring_num; i++) { - /*initial for "PDMA" TX ring*/ - if (tx_ring_init(entry, i, ring_ctrl) < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): init tx ring faild\n", - __func__); - goto err; - } - } - - return 0; -err: - wed_tx_ring_exit(entry, tx_ctrl); - return -1; -} - -/* -* -*/ -static int wed_tx_ring_reset(struct wed_entry *entry, - struct wed_tx_ctrl *tx_ctrl) -{ - unsigned int i; - struct wed_tx_ring_ctrl *ring_ctrl = &tx_ctrl->ring_ctrl; - - for (i = 0; i < ring_ctrl->ring_num; i++) { - /*reset for "PDMA" TX ring*/ - tx_ring_reset(entry, i, ring_ctrl); - } - - return 0; -} - -/* -* -*/ -int wed_init(struct platform_device *pdev, unsigned char idx, - struct wed_entry *wed) -{ - /*assign to pdev*/ - struct resource *res; - unsigned int irq; - unsigned long base_addr; - - res = platform_get_resource(pdev, IORESOURCE_MEM, idx); - irq = platform_get_irq(pdev, idx); - base_addr = (unsigned long)devm_ioremap(&pdev->dev, res->start, - resource_size(res)); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(%d): irq=%d,base_addr=0x%lx\n", __func__, - idx, irq, base_addr); - wed->base_addr = base_addr; - wed->pdev = pdev; - wed->irq = irq; - /*allocate ring first*/ -#ifdef WED_TX_SUPPORT - wed_ring_init(wed); -#endif - /*assign tx ring to ad*/ -#ifdef WED_HW_TX_SUPPORT - wed_token_buf_init(wed); -#endif /*WED_HW_TX_SUPPORT*/ -#ifdef WED_DYNAMIC_BM_SUPPORT - tasklet_init(&wed->tbuf_alloc_task, token_alloc_task, - (unsigned long)wed); - tasklet_init(&wed->tbuf_free_task, token_free_task, (unsigned long)wed); -#endif /*WED_DYNAMIC_BM_SUPPORT*/ -#ifdef ERR_RECOVERY - wed_ser_init(wed); -#endif /*ERR_RECOVERY*/ - return 0; -} - -/* -* -*/ -void wed_exit(struct platform_device *pdev, struct wed_entry *wed) -{ -#ifdef ERR_RECOVERY - wed_ser_exit(wed); -#endif /*ERR_RECOVERY*/ -#ifdef WED_TX_SUPPORT - wed_ring_exit(wed); -#endif -#ifdef WED_HW_TX_SUPPORT - wed_token_buf_exit(wed); -#endif - /*assign to pdev*/ - devm_iounmap(&pdev->dev, (void *)wed->base_addr); - memset(wed, 0, sizeof(*wed)); -} - -/* -* -*/ -unsigned char wed_num_get(void) -{ - struct device_node *node = NULL; - unsigned int num = 0; - - node = of_find_compatible_node(NULL, NULL, WED_DEV_NODE); - - if (of_property_read_u32_index(node, "wed_num", 0, &num)) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): get WED number from DTS fail!!\n", __func__); - return 0; - } - - return (unsigned char)num; -} - -/* -* -*/ -unsigned char wed_slot_map_get(unsigned int idx) -{ - struct device_node *node = NULL; - unsigned int num = 0; - - node = of_find_compatible_node(NULL, NULL, WED_DEV_NODE); - - if (of_property_read_u32_index(node, "pci_slot_map", idx, &num)) { - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): get WED slot from DTS fail!!\n", - __func__); - WHNAT_DBG( - WHNAT_DBG_OFF, - "%s(): assign default value: (slot0->devfn0), (slot1->devfn1)!!\n", - __func__); - num = (idx == 0) ? 0 : 1; - } - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): assign slot_id:%d for entry: %d!\n", - __func__, num, idx); - return (unsigned char)num; -} - -/* -* -*/ -int wed_ring_init(struct wed_entry *entry) -{ - struct wed_res_ctrl *res_ctrl = &entry->res_ctrl; - struct wed_tx_ctrl *tx_ctrl = &res_ctrl->tx_ctrl; - int ret; - - ret = wed_tx_ring_init(entry, tx_ctrl); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): wed ring init result = %d\n", __func__, - ret); - return ret; -} - -/* -* -*/ -int wed_ring_reset(struct wed_entry *entry) -{ - struct wed_res_ctrl *res_ctrl = &entry->res_ctrl; - struct wed_tx_ctrl *tx_ctrl = &res_ctrl->tx_ctrl; - int ret; - - ret = wed_tx_ring_reset(entry, tx_ctrl); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): wed ring reset result = %d\n", __func__, - ret); - return ret; -} - -/* -* -*/ -void wed_ring_exit(struct wed_entry *entry) -{ - struct wed_res_ctrl *res_ctrl = &entry->res_ctrl; - struct wed_tx_ctrl *tx_ctrl = &res_ctrl->tx_ctrl; - - wed_tx_ring_exit(entry, tx_ctrl); -} - -/* -* -*/ -void wed_token_buf_exit(struct wed_entry *entry) -{ - struct wed_tx_ctrl *tx_ctrl = &entry->res_ctrl.tx_ctrl; - struct wed_buf_res *res = &tx_ctrl->res; - /*tx resource free*/ - token_buf_exit(entry, res, 0, res->pkt_num); - token_info_exit(entry, res); -} - -/* -* -*/ -int wed_token_buf_init(struct wed_entry *entry) -{ - struct wed_tx_ctrl *tx_ctrl = &entry->res_ctrl.tx_ctrl; - struct wed_buf_res *res = &tx_ctrl->res; - /*tx resource allocate*/ - res->token_num = WED_TOKEN_CNT_MAX; - res->pkt_num = WED_TOKEN_CNT; - res->dmad_len = WIFI_PDMA_TXD_SIZE; - res->fd_len = WIFI_TX_1ST_BUF_SIZE; - res->pkt_len = WIFI_TX_BUF_SIZE; - - if (token_info_init(entry, res) < 0) - goto err; - - if (token_buf_init(entry, res, 0, res->pkt_num) < 0) - goto err; - - return 0; -err: - /*error handle*/ - wed_token_buf_exit(entry); - return -1; -} - -/* -* -*/ -void dump_wed_basic(struct wed_entry *wed) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "virtual addr:\t 0x%lx\n", wed->base_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "irq:\t %d\n", wed->irq); - dump_res_ctrl(&wed->res_ctrl); -} - -/* -* -*/ -static void dump_tx_ring_raw(struct wed_entry *wed, unsigned char ring_id, - unsigned int idx) -{ - struct whnat_entry *whnat = (struct whnat_entry *)wed->whnat; - struct wifi_entry *wifi = &whnat->wifi; - struct whnat_ring *ring = - &wed->res_ctrl.tx_ctrl.ring_ctrl.ring[ring_id]; - unsigned char *addr; - unsigned int size; - - WHNAT_DBG(WHNAT_DBG_OFF, - "==========WED TX RING RAW (%d/0x%x)==========\n", ring_id, - idx); - wifi_dump_tx_ring_info(wifi, ring_id, idx); - /*WED_WPDMA Tx Ring content*/ - WHNAT_DBG(WHNAT_DBG_OFF, - "==========WPDAM TX RING RAW (%d/0x%x)==========\n", ring_id, - idx); - whnat_dump_dmacb(&ring->cell[idx]); - addr = (unsigned char *)ring->cell[idx].alloc_va; - size = ring->cell[idx].alloc_size; - whnat_dump_raw("WPDMA_TX_RING", addr, size); -} - -/* -* -*/ -void wed_proc_handle(struct wed_entry *wed, char choice, char *arg) -{ - unsigned int i; - char *str; - char *end; - unsigned char idx; - struct wed_res_ctrl *res = &wed->res_ctrl; - struct wed_tx_ctrl *tx_ctrl = &res->tx_ctrl; - struct wed_buf_res *buf_res = &tx_ctrl->res; - - switch (choice) { - case WED_PROC_TX_RING_BASIC: - dump_wed_basic(wed); - break; - - case WED_PROC_TX_BUF_BASIC: - dump_buf_res(buf_res); - break; - - case WED_PROC_TX_BUF_INFO: { - str = strsep(&arg, " "); - str = strsep(&arg, " "); - i = whnat_str_tol(str, &end, 16); - dump_token_info(buf_res, i); - } break; - - case WED_PROC_TX_RING_CELL: { - str = strsep(&arg, " "); - str = strsep(&arg, " "); - idx = whnat_str_tol(str, &end, 10); - str = strsep(&arg, " "); - i = whnat_str_tol(str, &end, 16); - dump_tx_ring_raw(wed, idx, i); - } break; - - case WED_PROC_DBG_INFO: - dump_wed_debug_info(wed); - break; -#ifdef WED_DYNAMIC_BM_SUPPORT - - case WED_PROC_TX_DYNAMIC_ALLOC: { - eint_disable(wed, WED_EX_INT_STA_FLD_TX_FBUF_LTH); - token_alloc_task((unsigned long)wed); - } break; - - case WED_PROC_TX_DYNAMIC_FREE: { - eint_disable(wed, WED_EX_INT_STA_FLD_TX_FBUF_HTH); - token_free_task((unsigned long)wed); - } break; -#endif -#ifdef WED_HW_TX_SUPPORT - - case WED_PROC_TX_FREE_CNT: - whnat_hal_bfm_freecnt(wed, &i); - break; -#endif - - case WED_PROC_TX_RESET: - case WED_PROC_RX_RESET: - whnat_hal_hw_reset(wed->whnat, WHNAT_RESET_IDX_ONLY); - break; - - default: - break; - } -} - -/* -* -*/ -void wed_eint_handle(struct wed_entry *wed, unsigned int status) -{ -#ifdef WED_DYNAMIC_RX_BM_SUPPORT - - if (status & (1 << WED_EX_INT_STA_FLD_RX_FBUF_HTH)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): rx rbuf high threshold!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_RX_FBUF_LTH)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): rx rbuf low threshold!\n", - __func__); - -#endif - - if (status & (1 << WED_EX_INT_STA_FLD_TF_LEN_ERR)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): tx free notify len error!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_TF_TKID_WO_PYLD)) - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): tx free token has no packet to point!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_TX_FBUF_HTH)) { -#ifdef WED_DYNAMIC_BM_SUPPORT - eint_disable(wed, WED_EX_INT_STA_FLD_TX_FBUF_HTH); - if ((WED_PKT_NUM_GET(wed) - WED_TOKEN_EXPEND_SIZE) >= - WED_TOKEN_CNT) { - WHNAT_DBG(WHNAT_DBG_INF, - "%s(): tx buf high threshold!\n", __func__); - tasklet_hi_schedule(&wed->tbuf_free_task); - } -#endif /*WED_DYNAMIC_BM_SUPPORT*/ - } - - if (status & (1 << WED_EX_INT_STA_FLD_TX_FBUF_LTH)) { -#ifdef WED_DYNAMIC_BM_SUPPORT - eint_disable(wed, WED_EX_INT_STA_FLD_TX_FBUF_LTH); - if ((WED_PKT_NUM_GET(wed) + WED_TOKEN_EXPEND_SIZE) <= - WED_TOKEN_CNT_MAX) { - WHNAT_DBG(WHNAT_DBG_INF, - "%s(): tx buf low threshold!\n", __func__); - tasklet_hi_schedule(&wed->tbuf_alloc_task); - } - -#endif /*WED_DYNAMIC_BM_SUPPORT*/ - } - - if (status & (1 << WED_EX_INT_STA_FLD_TX_DMA_W_RESP_ERR)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): tx dma write resp err!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_TX_DMA_R_RESP_ERR)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): tx dma read resp err!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_RX_DRV_INTI_WDMA_ENABLE)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): rx drv inti wdma enable!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_RX_DRV_COHERENT)) - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): rx drv coherent!\n", __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_RX_DRV_W_RESP_ERR)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): rx drv write resp err!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_RX_DRV_R_RESP_ERR)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): rx drv read resp err!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_TF_TKID_TITO_INVLD)) - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): tx free token id is invaild!\n", - __func__); - - if (status & (1 << WED_EX_INT_STA_FLD_RX_DRV_BM_DMAD_COHERENT)) - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): rx drv buffer mgmt dmad coherent!\n", - __func__); -#ifdef WED_WDMA_RECYCLE - if (status & (1 << WED_EX_INT_STA_FLD_RX_DRV_DMA_RECYCLE)) - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): rx drv dma recycle!\n", - __func__); -#endif /*WED_WDMA_RECYCLE*/ -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed.h deleted file mode 100644 index 505e677594..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - wed.h -*/ - -#ifndef _WED_H -#define _WED_H - -#include "woe_basic.h" - -/*WED Token setting*/ -#define WED_TOKEN_STATUS_INIT 1 -#define WED_TOKEN_UNIT 128 -#define WED_TOKEN_STATUS_UNIT 32 -#define WED_TOKEN_RSV 0 -/*buffer mgmet initial token cnt*/ -/*max cr4 support token id, mt7622 can support up to 8192*/ -#define WED_TOKEN_ID_MAX 4096 - -#ifdef WED_DYNAMIC_BM_SUPPORT -#define WED_TOKEN_EXPEND_SIZE 128 -#define WED_TOKEN_LOW 2 -#define WED_TOKEN_HIGH (2 * WED_TOKEN_LOW - 1) -#endif /*WED_DYNAMIC_BM_SUPPORT*/ -/*buffer manager token id range, start -> end*/ -#define WED_TOKEN_START WIFI_TX_TOKEN_CNT -#define WED_TOKEN_END (WED_TOKEN_ID_MAX - 1) - -/*buffer mgmet can allocate max token number*/ -#define WED_TOKEN_CNT_MAX (WED_TOKEN_ID_MAX - WED_TOKEN_START) -#ifdef WED_DYNAMIC_BM_SUPPORT -#define WED_TOKEN_CNT 1152 -#else -#define WED_TOKEN_CNT WED_TOKEN_CNT_MAX -#endif - -#define WED_PKT_NUM_GET(_wed) (_wed->res_ctrl.tx_ctrl.res.pkt_num) -#define WED_DLY_INT_VALUE 0xC014C014 -#define WED_WDMA_RECYCLE_TIME 0xffff - -#ifdef RT_BIG_ENDIAN -struct whnat_txdmad { - /* Word 0 */ - unsigned int sdp0; - - /* Word 1 */ - unsigned int ddone : 1; - unsigned int last0 : 1; - unsigned int sdl0 : 14; - unsigned int burst : 1; - unsigned int last1 : 1; - unsigned int sdlen1 : 14; - /* Word 2 */ - unsigned int sdp1; - /* Word 3*/ - unsigned int rsv : 16; - unsigned int winfo : 16; -} __packed; -#else -struct whnat_txdmad { - /* Word 0 */ - unsigned int sdp0; - /* Word 1 */ - unsigned int sdlen1 : 14; - unsigned int last1 : 1; - unsigned int burst : 1; - unsigned int sdl0 : 14; - unsigned int last0 : 1; - unsigned int ddone : 1; - /*Word2 */ - unsigned int sdp1; - /* Word 3*/ - unsigned int winfo : 16; - unsigned int rsv : 16; -} __packed; -#endif /* RT_BIG_ENDIAN */ - -struct wed_token_info { - unsigned int token_id; - unsigned int len; - unsigned int desc_len; - unsigned int fd_len; - dma_addr_t pkt_pa; - dma_addr_t desc_pa; - dma_addr_t fdesc_pa; - void *pkt_va; - void *desc_va; - void *fdesc_va; - struct sk_buff *pkt; - struct list_head list; -}; - -struct wed_buf_res { - unsigned int token_num; - unsigned int dmad_len; - unsigned int fd_len; - unsigned int pkt_len; - unsigned int pkt_num; - struct whnat_dma_buf fbuf; - struct whnat_dma_buf des_buf; - struct list_head pkt_head; -}; - -struct wed_tx_ring_ctrl { - unsigned int ring_num; - unsigned int ring_len; - unsigned int txd_len; - struct whnat_dma_buf *desc; - struct whnat_ring *ring; -}; - -struct wed_tx_ctrl { - struct wed_buf_res res; - struct wed_tx_ring_ctrl ring_ctrl; -}; - -struct wed_res_ctrl { - struct wed_tx_ctrl tx_ctrl; -}; - -#ifdef ERR_RECOVERY -struct wed_ser_state { - /*WED_TX_DMA*/ - unsigned int tx_dma_stat; - unsigned int tx0_mib; - unsigned int tx1_mib; - unsigned int tx0_cidx; - unsigned int tx0_didx; - unsigned int tx1_cidx; - unsigned int tx1_didx; - /*WED_WDMA*/ - unsigned int wdma_stat; - unsigned int wdma_rx0_mib; - unsigned int wdma_rx1_mib; - unsigned int wdma_rx0_recycle_mib; - unsigned int wdma_rx1_recycle_mib; - /*WED_WPDMA*/ - unsigned int wpdma_stat; - unsigned int wpdma_tx0_mib; - unsigned int wpdma_tx1_mib; - /*WED_BM*/ - unsigned int bm_tx_stat; - unsigned int txfree_to_bm_mib; - unsigned int txbm_to_wdma_mib; -}; - -struct wed_ser_ctrl { - struct task_struct *ser_task; - struct wed_ser_state state; - unsigned int tx_dma_err_cnt; - unsigned int tx_dma_ser_cnt; - unsigned int wdma_err_cnt; - unsigned int tx_bm_err_cnt; - unsigned int wdma_ser_cnt; - unsigned int wpdma_idle_cnt; - unsigned int wpdma_ser_cnt; - unsigned int tx_bm_ser_cnt; - unsigned int period_time; - unsigned char recovery; - spinlock_t ser_lock; -}; -#endif /*ERR_RECOVERY*/ - -struct wed_entry { - struct platform_device *pdev; - unsigned long base_addr; - unsigned int irq; - unsigned int ext_int_mask; -#ifdef WED_DYNAMIC_BM_SUPPORT - struct tasklet_struct tbuf_alloc_task; - struct tasklet_struct tbuf_free_task; -#endif /*WED_DYNAMIC_BM_SUPPORT*/ -#ifdef ERR_RECOVERY - struct wed_ser_ctrl ser_ctrl; -#endif /*ERR_RECOVERY*/ - struct wed_res_ctrl res_ctrl; - void *proc; - void *whnat; -}; - -enum { - WED_PROC_TX_RING_BASIC = 0, - WED_PROC_TX_BUF_BASIC = 1, - WED_PROC_TX_BUF_INFO = 2, - WED_PROC_TX_RING_CELL = 3, - WED_PROC_TX_RING_RAW = 4, - WED_PROC_DBG_INFO = 5, - WED_PROC_TX_DYNAMIC_FREE = 6, - WED_PROC_TX_DYNAMIC_ALLOC = 7, - WED_PROC_TX_FREE_CNT = 8, - WED_PROC_TX_RESET = 9, - WED_PROC_RX_RESET = 10, - WED_PROC_END -}; - -int wed_init(struct platform_device *pdev, unsigned char idx, - struct wed_entry *wed); -void wed_exit(struct platform_device *pdev, struct wed_entry *wed); -int wed_ring_init(struct wed_entry *entry); -void wed_ring_exit(struct wed_entry *entry); -int wed_ring_reset(struct wed_entry *entry); -int wed_token_buf_init(struct wed_entry *entry); -void wed_token_buf_exit(struct wed_entry *entry); -void wed_proc_handle(struct wed_entry *entry, char choice, char *arg); -#ifdef WED_DYNAMIC_BM_SUPPORT -int wed_token_buf_expend(struct wed_entry *entry, unsigned int grp_num); -void wed_token_buf_reduce(struct wed_entry *entry, unsigned int grp_num); -#endif /*WED_DYNAMIC_BM_SUPPORT*/ - -unsigned char wed_num_get(void); -unsigned char wed_slot_map_get(unsigned int idx); - -void wed_eint_handle(struct wed_entry *wed, unsigned int status); - -#define WED_TX_RING_GET(_wed, _idx) \ - (&(_wed)->res_ctrl.tx_ctrl.ring_ctrl.ring[_idx]) - -void dump_wed_value(struct wed_entry *wed, char *name, unsigned int addr); - -#ifdef ERR_RECOVERY -int wed_ser_init(struct wed_entry *wed); -void wed_ser_exit(struct wed_entry *wed); -void wed_ser_dump(struct wed_entry *wed); -#endif /*ERR_RECOVERY*/ - -#endif /*_WED_H*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed_def.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed_def.h deleted file mode 100644 index 12ba11a7b3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/wed_def.h +++ /dev/null @@ -1,499 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - wed_def.h -*/ - -#ifndef REG_FLD -#define REG_FLD(width, shift) (shift) -#endif /*REG_FLD*/ - -/*1020A000*/ -#define WED_REG_BASE 0 - -#define WED_REV (WED_REG_BASE + 0x00000000) -#define WED_MOD_RST (WED_REG_BASE + 0x00000008) -#define WED_CTRL (WED_REG_BASE + 0x0000000C) -#define WED_AXI_CTRL (WED_REG_BASE + 0x00000010) -#define WED_EX_INT_STA (WED_REG_BASE + 0x00000020) -#define WED_EX_INT_MSK (WED_REG_BASE + 0x00000028) -#define WED_ST (WED_REG_BASE + 0x00000060) -#define WED_WPDMA_ST (WED_REG_BASE + 0x00000064) -#define WED_WDMA_ST (WED_REG_BASE + 0x00000068) -#define WED_BM_ST (WED_REG_BASE + 0x0000006C) -#define WED_TX_BM_CTRL (WED_REG_BASE + 0x00000080) -#define WED_TX_BM_BASE (WED_REG_BASE + 0x00000084) -#define WED_TX_BM_TKID (WED_REG_BASE + 0x00000088) -#define WED_TX_BM_BLEN (WED_REG_BASE + 0x0000008C) -#define WED_TX_BM_STS (WED_REG_BASE + 0x00000090) -#define WED_TX_BM_INTF (WED_REG_BASE + 0x0000009C) -#define WED_TX_BM_DYN_TH (WED_REG_BASE + 0x000000A0) -#define WED_TX_BM_RECYC (WED_REG_BASE + 0x000000A8) -#define WED_TX_BM_VB_FREE_0_31 (WED_REG_BASE + 0x000000B0) -#define WED_TX_BM_VB_FREE_32_63 (WED_REG_BASE + 0x000000B4) -#define WED_TX_BM_VB_USED_0_31 (WED_REG_BASE + 0x000000B8) -#define WED_TX_BM_VB_USED_32_63 (WED_REG_BASE + 0x000000BC) -#define WED_INT_STA (WED_REG_BASE + 0x00000200) -#define WED_INT_MSK (WED_REG_BASE + 0x00000204) -#define WED_GLO_CFG (WED_REG_BASE + 0x00000208) -#define WED_RST_IDX (WED_REG_BASE + 0x0000020C) -#define WED_DLY_INT_CFG (WED_REG_BASE + 0x00000210) -#define WED_TX0_MIB (WED_REG_BASE + 0x000002A0) -#define WED_TX1_MIB (WED_REG_BASE + 0x000002A4) -#define WED_RX0_MIB (WED_REG_BASE + 0x000002E0) -#define WED_RX1_MIB (WED_REG_BASE + 0x000002E4) -#define WED_TX0_CTRL0 (WED_REG_BASE + 0x00000300) -#define WED_TX0_CTRL1 (WED_REG_BASE + 0x00000304) -#define WED_TX0_CTRL2 (WED_REG_BASE + 0x00000308) -#define WED_TX0_CTRL3 (WED_REG_BASE + 0x0000030C) -#define WED_TX1_CTRL0 (WED_REG_BASE + 0x00000310) -#define WED_TX1_CTRL1 (WED_REG_BASE + 0x00000314) -#define WED_TX1_CTRL2 (WED_REG_BASE + 0x00000318) -#define WED_TX1_CTRL3 (WED_REG_BASE + 0x0000031C) -#define WED_RX0_CTRL0 (WED_REG_BASE + 0x00000400) -#define WED_RX0_CTRL1 (WED_REG_BASE + 0x00000404) -#define WED_RX0_CTRL2 (WED_REG_BASE + 0x00000408) -#define WED_RX0_CTRL3 (WED_REG_BASE + 0x0000040C) -#define WED_RX1_CTRL0 (WED_REG_BASE + 0x00000410) -#define WED_RX1_CTRL1 (WED_REG_BASE + 0x00000414) -#define WED_RX1_CTRL2 (WED_REG_BASE + 0x00000418) -#define WED_RX1_CTRL3 (WED_REG_BASE + 0x0000041C) -#define WED_WPDMA_INT_STA_REC (WED_REG_BASE + 0x00000500) -#define WED_WPDMA_INT_TRIG (WED_REG_BASE + 0x00000504) -#define WED_WPDMA_GLO_CFG (WED_REG_BASE + 0x00000508) -#define WED_WPDMA_RST_IDX (WED_REG_BASE + 0x0000050C) - -#define WED_PCIE_CFG_BASE (WED_REG_BASE + 0x00000560) -#define WED_PCIE_OFST (WED_REG_BASE + 0x00000564) -#define WED_PCIE_INTS_TRIG (WED_REG_BASE + 0x00000570) -#define WED_PCIE_INTS_REC (WED_REG_BASE + 0x00000574) -#define WED_WPDMA_CFG_BASE (WED_REG_BASE + 0x00000580) -#define WED_WPDMA_OFST0 (WED_REG_BASE + 0x00000584) -#define WED_WPDMA_OFST1 (WED_REG_BASE + 0x00000588) -#define WED_WPDMA_TX0_MIB (WED_REG_BASE + 0x000005A0) -#define WED_WPDMA_TX1_MIB (WED_REG_BASE + 0x000005A4) -#define WED_WPDMA_TX0_COHERENT_MIB (WED_REG_BASE + 0x000005D0) -#define WED_WPDMA_TX1_COHERENT_MIB (WED_REG_BASE + 0x000005D4) -#define WED_WPDMA_RX1_COHERENT_MIB (WED_REG_BASE + 0x000005F4) -#define WED_WPDMA_RX0_MIB (WED_REG_BASE + 0x000005E0) -#define WED_WPDMA_RX1_MIB (WED_REG_BASE + 0x000005E4) -#define WED_WPDMA_TX0_CTRL0 (WED_REG_BASE + 0x00000600) -#define WED_WPDMA_TX0_CTRL1 (WED_REG_BASE + 0x00000604) -#define WED_WPDMA_TX0_CTRL2 (WED_REG_BASE + 0x00000608) -#define WED_WPDMA_TX0_CTRL3 (WED_REG_BASE + 0x0000060C) -#define WED_WPDMA_TX1_CTRL0 (WED_REG_BASE + 0x00000610) -#define WED_WPDMA_TX1_CTRL1 (WED_REG_BASE + 0x00000614) -#define WED_WPDMA_TX1_CTRL2 (WED_REG_BASE + 0x00000618) -#define WED_WPDMA_TX1_CTRL3 (WED_REG_BASE + 0x0000061C) -#define WED_WPDMA_RX0_CTRL0 (WED_REG_BASE + 0x00000700) -#define WED_WPDMA_RX0_CTRL1 (WED_REG_BASE + 0x00000704) -#define WED_WPDMA_RX0_CTRL2 (WED_REG_BASE + 0x00000708) -#define WED_WPDMA_RX0_CTRL3 (WED_REG_BASE + 0x0000070C) -#define WED_WPDMA_RX1_CTRL0 (WED_REG_BASE + 0x00000710) -#define WED_WPDMA_RX1_CTRL1 (WED_REG_BASE + 0x00000714) -#define WED_WPDMA_RX1_CTRL2 (WED_REG_BASE + 0x00000718) -#define WED_WPDMA_RX1_CTRL3 (WED_REG_BASE + 0x0000071C) -#define WED_WDMA_TX0_BASE (WED_REG_BASE + 0x00000800) -#define WED_WDMA_TX0_CNT (WED_REG_BASE + 0x00000804) -#define WED_WDMA_TX0_CTX_IDX (WED_REG_BASE + 0x00000808) -#define WED_WDMA_TX0_DTX_IDX (WED_REG_BASE + 0x0000080C) -#define WED_WDMA_TX1_BASE (WED_REG_BASE + 0x00000810) -#define WED_WDMA_TX1_CNT (WED_REG_BASE + 0x00000814) -#define WED_WDMA_TX1_CTX_IDX (WED_REG_BASE + 0x00000818) -#define WED_WDMA_TX1_DTX_IDX (WED_REG_BASE + 0x0000081C) -#define WED_WDMA_RX0_BASE (WED_REG_BASE + 0x00000900) -#define WED_WDMA_RX0_CNT (WED_REG_BASE + 0x00000904) -#define WED_WDMA_RX0_CRX_IDX (WED_REG_BASE + 0x00000908) -#define WED_WDMA_RX0_DRX_IDX (WED_REG_BASE + 0x0000090C) -#define WED_WDMA_RX1_BASE (WED_REG_BASE + 0x00000910) -#define WED_WDMA_RX1_CNT (WED_REG_BASE + 0x00000914) -#define WED_WDMA_RX1_CRX_IDX (WED_REG_BASE + 0x00000918) -#define WED_WDMA_RX1_DRX_IDX (WED_REG_BASE + 0x0000091C) -#define WED_WDMA_RX0_THRES_CFG (WED_REG_BASE + 0x00000940) -#define WED_WDMA_RX1_THRES_CFG (WED_REG_BASE + 0x00000944) -#define WED_WDMA_INFO (WED_REG_BASE + 0x00000A00) -#define WED_WDMA_GLO_CFG (WED_REG_BASE + 0x00000A04) -#define WED_WDMA_RST_IDX (WED_REG_BASE + 0x00000A08) -#define WED_WDMA_LOAD_DRV_IDX (WED_REG_BASE + 0x00000A10) -#define WED_WDMA_LOAD_CRX_IDX (WED_REG_BASE + 0x00000A14) -#define WED_WDMA_SPR (WED_REG_BASE + 0x00000A1C) - -#define WED_WDMA_INT_STA_REC (WED_REG_BASE + 0x00000A20) -#define WED_WDMA_INT_CLR (WED_REG_BASE + 0x00000A24) -#define WED_WDMA_INT_TRIG (WED_REG_BASE + 0x00000A28) -#define WED_WDMA_INT_CTRL (WED_REG_BASE + 0x00000A2C) -#define WED_WDMA_CFG_BASE (WED_REG_BASE + 0x00000AA0) -#define WED_WDMA_OFST0 (WED_REG_BASE + 0x00000AA4) -#define WED_WDMA_OFST1 (WED_REG_BASE + 0x00000AA8) -#define WED_WDMA_RX0_MIB (WED_REG_BASE + 0x00000AE0) -#define WED_WDMA_RX1_MIB (WED_REG_BASE + 0x00000AE4) - -#define WED_IRQ_MON (WED_REG_BASE + 0x00000050) - -#define WED_TX_BM_VB_FREE_0_31 (WED_REG_BASE + 0x000000B0) -#define WED_TX_BM_VB_FREE_32_63 (WED_REG_BASE + 0x000000B4) -#define WED_TX_BM_VB_USED_0_31 (WED_REG_BASE + 0x000000B8) -#define WED_TX_BM_VB_USED_32_63 (WED_REG_BASE + 0x000000BC) - -#define WED_WDMA_INT_MON (WED_REG_BASE + 0x00000A3C) -#define WED_WPDMA_INT_CTRL (WED_REG_BASE + 0x00000520) -#define WED_WPDMA_INT_MSK (WED_REG_BASE + 0x00000524) -#define WED_WPDMA_INT_CLR (WED_REG_BASE + 0x00000528) -#define WED_WPDMA_INT_MON (WED_REG_BASE + 0x0000052C) -#define WED_WPDMA_SPR (WED_REG_BASE + 0x0000053C) -#define WED_PCIE_INTM_REC (WED_REG_BASE + 0x00000578) -#define WED_PCIE_INT_CTRL (WED_REG_BASE + 0x0000057c) - -#define WED_TXD_DW0 (WED_REG_BASE + 0x00000100) -#define WED_TXD_DW1 (WED_REG_BASE + 0x00000104) -#define WED_TXD_DW2 (WED_REG_BASE + 0x00000108) -#define WED_TXD_DW3 (WED_REG_BASE + 0x0000010C) -#define WED_TXD_DW4 (WED_REG_BASE + 0x00000110) -#define WED_TXD_DW5 (WED_REG_BASE + 0x00000114) -#define WED_TXD_DW6 (WED_REG_BASE + 0x00000118) -#define WED_TXD_DW7 (WED_REG_BASE + 0x0000011C) -#define WED_TXDP_CTRL (WED_REG_BASE + 0x00000130) - -#define WED_TXP_DW0 (WED_REG_BASE + 0x00000120) -#define WED_TXP_DW1 (WED_REG_BASE + 0x00000124) - -#define WED_TX_FREE_TO_TX_BM_TKID_MIB (WED_REG_BASE + 0x000001C0) -#define WED_TX_BM_TO_WDMA_RX_DRV_TKID_MIB (WED_REG_BASE + 0x000001C4) - -#define WED_DBG_CTRL (WED_REG_BASE + 0x00000BC0) -#define WED_DBG_PRB0 (WED_REG_BASE + 0x00000BD0) -#define WED_DBG_PRB1 (WED_REG_BASE + 0x00000BD4) -#define WED_DBG_PRB2 (WED_REG_BASE + 0x00000BD8) -#define WED_DBG_PRB3 (WED_REG_BASE + 0x00000BDC) - -#define WED_CTRL2 (WED_REG_BASE + 0x0000001C) -#define WED_TX_COHERENT_MIB (WED_REG_BASE + 0x000002D0) -#define WED_WPDAM_CTRL (WED_REG_BASE + 0x00000518) -#define WED_WDMA_RX0_THRES_CFG (WED_REG_BASE + 0x00000940) -#define WED_WDMA_RX1_THRES_CFG (WED_REG_BASE + 0x00000944) -#define WED_WDMA_RX0_RECYCLE_MIB (WED_REG_BASE + 0x00000AE8) -#define WED_WDMA_RX1_RECYCLE_MIB (WED_REG_BASE + 0x00000AEC) -#define WED_WDMA_RX0_PROCESSED_MIB (WED_REG_BASE + 0x00000AF0) -#define WED_WDMA_RX1_PROCESSED_MIB (WED_REG_BASE + 0x00000AF4) -#define WED_WDMA_RX_COHERENT_MIB (WED_REG_BASE + 0x00000AF8) -#define WED_BMF_VALID_TABLE_START (WED_REG_BASE + 0x00000C00) -#define WED_BMF_VALID_TABLE_END (WED_REG_BASE + 0x00000FFC) - -#define WED_REV_FLD_PROJECT REG_FLD(16, 16) -#define WED_REV_FLD_VERSION REG_FLD(8, 0) - -#define WED_MOD_RST_FLD_WED REG_FLD(1, 31) -#define WED_MOD_RST_FLD_TX_FREE_AGT REG_FLD(1, 4) -#define WED_MOD_RST_FLD_WPDMA_TX_DRV REG_FLD(1, 8) -#define WED_MOD_RST_FLD_WPDMA_RX_DRV REG_FLD(1, 9) -#define WED_MOD_RST_FLD_WPDMA_INT_AGT REG_FLD(1, 11) -#define WED_MOD_RST_FLD_WED_TX_DMA REG_FLD(1, 12) -#define WED_MOD_RST_FLD_WDMA_RX_DRV REG_FLD(1, 17) -#define WED_MOD_RST_FLD_WDMA_INT_AGT REG_FLD(1, 19) -#define WED_MOD_RST_FLD_TX_BM REG_FLD(1, 0) - -#define WED_CTRL_FLD_MIB_RD_CLR REG_FLD(1, 28) -#define WED_CTRL_FLD_FINAL_DIDX_RD REG_FLD(1, 24) -#define WED_CTRL_FLD_BUSY_RSV REG_FLD(1, 13) -#define WED_CTRL_FLD_EN_RSV REG_FLD(1, 12) -#define WED_CTRL_FLD_WED_TX_FREE_AGT_BUSY REG_FLD(1, 11) -#define WED_CTRL_FLD_WED_TX_FREE_AGT_EN REG_FLD(1, 10) -#define WED_CTRL_FLD_WED_TX_BM_BUSY REG_FLD(1, 9) -#define WED_CTRL_FLD_WED_TX_BM_EN REG_FLD(1, 8) -#define WED_CTRL_FLD_WDMA_INT_AGT_BUSY REG_FLD(1, 3) -#define WED_CTRL_FLD_WDMA_INT_AGT_EN REG_FLD(1, 2) -#define WED_CTRL_FLD_WPDMA_INT_AGT_BUSY REG_FLD(1, 1) -#define WED_CTRL_FLD_WPDMA_INT_AGT_EN REG_FLD(1, 0) - -#define WED_EX_INT_STA_FLD_RX_DRV_DMA_RECYCLE REG_FLD(1, 24) -#define WED_EX_INT_STA_FLD_TX_DMA_W_RESP_ERR REG_FLD(1, 22) -#define WED_EX_INT_STA_FLD_TX_DMA_R_RESP_ERR REG_FLD(1, 21) -#define WED_EX_INT_STA_FLD_RX_DRV_BM_DMAD_COHERENT REG_FLD(1, 20) -#define WED_EX_INT_STA_FLD_RX_DRV_INTI_WDMA_ENABLE REG_FLD(1, 19) -#define WED_EX_INT_STA_FLD_RX_DRV_COHERENT REG_FLD(1, 18) -#define WED_EX_INT_STA_FLD_RX_DRV_W_RESP_ERR REG_FLD(1, 17) -#define WED_EX_INT_STA_FLD_RX_DRV_R_RESP_ERR REG_FLD(1, 16) -#define WED_EX_INT_STA_FLD_RX_FBUF_HTH REG_FLD(1, 13) -#define WED_EX_INT_STA_FLD_RX_FBUF_LTH REG_FLD(1, 12) -#define WED_EX_INT_STA_FLD_TX_FBUF_HTH REG_FLD(1, 9) -#define WED_EX_INT_STA_FLD_TX_FBUF_LTH REG_FLD(1, 8) -#define WED_EX_INT_STA_FLD_TF_TKID_TITO_INVLD REG_FLD(1, 4) -#define WED_EX_INT_STA_FLD_TF_TKID_WO_PYLD REG_FLD(1, 1) -#define WED_EX_INT_STA_FLD_TF_LEN_ERR REG_FLD(1, 0) - -#define WED_EX_INT_MSK_FLD_EX_INT_MSK REG_FLD(32, 0) - -#define WED_ST_FLD_TX_ST REG_FLD(8, 8) - -#define WED_WPDMA_ST_FLD_ISR_ST REG_FLD(8, 16) -#define WED_WPDMA_ST_FLD_TX_DRV_ST REG_FLD(8, 8) -#define WED_WPDMA_ST_FLD_RX_DRV_ST REG_FLD(8, 0) - -#define WED_WPDMA_INT_CTRL_FLD_SUBRT_ADV REG_FLD(1, 21) -#define WED_WPDMA_INT_CTRL_FLD_MSK_ON_DLY REG_FLD(1, 23) -#define WED_WPDMA_INT_CTRL_FLD_MSK_ON_DLY_PRD REG_FLD(8, 0) - -#define WED_WDMA_ST_FLD_ISR_ST REG_FLD(8, 16) -#define WED_WDMA_ST_FLD_TX_DRV_ST REG_FLD(8, 8) -#define WED_WDMA_ST_FLD_RX_DRV_ST REG_FLD(8, 0) - -#define WED_BM_ST_FLD_FREE_AGENT_ST REG_FLD(8, 24) -#define WED_BM_ST_FLD_REODR_AGENT_ST REG_FLD(8, 16) -#define WED_BM_ST_FLD_TX_BMU_ST REG_FLD(8, 8) -#define WED_BM_ST_FLD_RX_BMU_ST REG_FLD(8, 0) - -#define WED_TX_BM_CTRL_FLD_PAUSE REG_FLD(1, 28) -#define WED_TX_BM_CTRL_FLD_RSV_GRP_NUM REG_FLD(7, 16) -#define WED_TX_BM_CTRL_FLD_RSV_GRP_NUM_MASK 0x7f -#define WED_TX_BM_CTRL_FLD_VLD_GRP_NUM REG_FLD(7, 0) -#define WED_TX_BM_CTRL_FLD_VLD_GRP_NUM_MASK 0x7f - -#define WED_TX_BM_TKID_FLD_END_ID REG_FLD(16, 16) -#define WED_TX_BM_TKID_FLD_START_ID REG_FLD(16, 0) - -#define WED_TX_BM_BLEN_FLD_BYTE_LEN REG_FLD(14, 0) -#define WED_TX_BM_BLEN_FLD_BYTE_LEN_MASK 0x3fff -#define WED_TX_BM_STS_FLD_DMAD_RD REG_FLD(1, 25) -#define WED_TX_BM_STS_FLD_DMAD_VLD REG_FLD(1, 24) -#define WED_TX_BM_STS_FLD_DMAD_NUM REG_FLD(5, 16) -#define WED_TX_BM_STS_FLD_FREE_NUM REG_FLD(16, 0) - -#define WED_TX_BM_INTF_FLD_FREE_TKID_RD REG_FLD(1, 29) -#define WED_TX_BM_INTF_FLD_FREE_TKID_VLD REG_FLD(1, 28) -#define WED_TX_BM_INTF_FLD_FREE_TKFIFO_FDEP REG_FLD(7, 16) -#define WED_TX_BM_INTF_FLD_FREE_TKID REG_FLD(16, 0) - -#define WED_TX_BM_DYN_TH_FLD_HI_GRP_NUM REG_FLD(7, 16) -#define WED_TX_BM_DYN_TH_FLD_HI_GRP_MASK 0x7f -#define WED_TX_BM_DYN_TH_FLD_LOW_GRP_NUM REG_FLD(7, 0) -#define WED_TX_BM_DYN_TH_FLD_LOW_GRP_MASK 0x7f - -#define WED_TX_BM_RECYC_FLD_START_GRP_IDX REG_FLD(7, 0) - -#define WED_INT_STA_FLD_FW_CLR_OWN_INT REG_FLD(1, 31) -#define WED_INT_STA_FLD_MCU_CMD_INT REG_FLD(1, 30) -#define WED_INT_STA_FLD_MAC_INT_5 REG_FLD(1, 29) -#define WED_INT_STA_FLD_MAC_INT_4 REG_FLD(1, 28) -#define WED_INT_STA_FLD_MAC_INT_3 REG_FLD(1, 27) -#define WED_INT_STA_FLD_MAC_INT_2 REG_FLD(1, 26) -#define WED_INT_STA_FLD_MAC_INT_1 REG_FLD(1, 25) -#define WED_INT_STA_FLD_MAC_INT_0 REG_FLD(1, 24) -#define WED_INT_STA_FLD_TX_DLY_INT REG_FLD(1, 23) -#define WED_INT_STA_FLD_RX_DLY_INT REG_FLD(1, 22) -#define WED_INT_STA_FLD_TX_COHERENT REG_FLD(1, 21) -#define WED_INT_STA_FLD_RX_COHERENT REG_FLD(1, 20) -#define WED_INT_STA_FLD_TX_DONE_INT15 REG_FLD(1, 19) -#define WED_INT_STA_FLD_TX_DONE_INT14 REG_FLD(1, 18) -#define WED_INT_STA_FLD_TX_DONE_INT13 REG_FLD(1, 17) -#define WED_INT_STA_FLD_TX_DONE_INT12 REG_FLD(1, 16) -#define WED_INT_STA_FLD_TX_DONE_INT11 REG_FLD(1, 15) -#define WED_INT_STA_FLD_TX_DONE_INT10 REG_FLD(1, 14) -#define WED_INT_STA_FLD_TX_DONE_INT9 REG_FLD(1, 13) -#define WED_INT_STA_FLD_TX_DONE_INT8 REG_FLD(1, 12) -#define WED_INT_STA_FLD_TX_DONE_INT7 REG_FLD(1, 11) -#define WED_INT_STA_FLD_TX_DONE_INT6 REG_FLD(1, 10) -#define WED_INT_STA_FLD_TX_DONE_INT5 REG_FLD(1, 9) -#define WED_INT_STA_FLD_TX_DONE_INT4 REG_FLD(1, 8) -#define WED_INT_STA_FLD_TX_DONE_INT3 REG_FLD(1, 7) -#define WED_INT_STA_FLD_TX_DONE_INT2 REG_FLD(1, 6) -#define WED_INT_STA_FLD_TX_DONE_INT1 REG_FLD(1, 5) -#define WED_INT_STA_FLD_TX_DONE_INT0 REG_FLD(1, 4) -#define WED_INT_STA_FLD_RX_DONE_INT3 REG_FLD(1, 3) -#define WED_INT_STA_FLD_RX_DONE_INT2 REG_FLD(1, 2) -#define WED_INT_STA_FLD_RX_DONE_INT1 REG_FLD(1, 1) -#define WED_INT_STA_FLD_RX_DONE_INT0 REG_FLD(1, 0) - -#define WED_INT_MSK_FLD_FW_CLR_OWN_INT REG_FLD(1, 31) -#define WED_INT_MSK_FLD_MCU_CMD_INT REG_FLD(1, 30) -#define WED_INT_MSK_FLD_MAC_INT5 REG_FLD(1, 29) -#define WED_INT_MSK_FLD_MAC_INT4 REG_FLD(1, 28) -#define WED_INT_MSK_FLD_MAC_INT3 REG_FLD(1, 27) -#define WED_INT_MSK_FLD_MAC_INT2 REG_FLD(1, 26) -#define WED_INT_MSK_FLD_MAC_INT1 REG_FLD(1, 25) -#define WED_INT_MSK_FLD_MAC_INT0 REG_FLD(1, 24) -#define WED_INT_MSK_FLD_TX_DLY_INT REG_FLD(1, 23) -#define WED_INT_MSK_FLD_RX_DLY_INT REG_FLD(1, 22) -#define WED_INT_MSK_FLD_TX_COHERENT REG_FLD(1, 21) -#define WED_INT_MSK_FLD_RX_COHERENT REG_FLD(1, 20) -#define WED_INT_MSK_FLD_TX_DONE_INT15 REG_FLD(1, 19) -#define WED_INT_MSK_FLD_TX_DONE_INT14 REG_FLD(1, 18) -#define WED_INT_MSK_FLD_TX_DONE_INT13 REG_FLD(1, 17) -#define WED_INT_MSK_FLD_TX_DONE_INT12 REG_FLD(1, 16) -#define WED_INT_MSK_FLD_TX_DONE_INT11 REG_FLD(1, 15) -#define WED_INT_MSK_FLD_TX_DONE_INT10 REG_FLD(1, 14) -#define WED_INT_MSK_FLD_TX_DONE_INT9 REG_FLD(1, 13) -#define WED_INT_MSK_FLD_TX_DONE_INT8 REG_FLD(1, 12) -#define WED_INT_MSK_FLD_TX_DONE_INT7 REG_FLD(1, 11) -#define WED_INT_MSK_FLD_TX_DONE_INT6 REG_FLD(1, 10) -#define WED_INT_MSK_FLD_TX_DONE_INT5 REG_FLD(1, 9) -#define WED_INT_MSK_FLD_TX_DONE_INT4 REG_FLD(1, 8) -#define WED_INT_MSK_FLD_TX_DONE_INT3 REG_FLD(1, 7) -#define WED_INT_MSK_FLD_TX_DONE_INT2 REG_FLD(1, 6) -#define WED_INT_MSK_FLD_TX_DONE_INT1 REG_FLD(1, 5) -#define WED_INT_MSK_FLD_TX_DONE_INT0 REG_FLD(1, 4) -#define WED_INT_MSK_FLD_RX_DONE_INT3 REG_FLD(1, 3) -#define WED_INT_MSK_FLD_RX_DONE_INT2 REG_FLD(1, 2) -#define WED_INT_MSK_FLD_RX_DONE_INT1 REG_FLD(1, 1) -#define WED_INT_MSK_FLD_RX_DONE_INT0 REG_FLD(1, 0) - -#define WED_WPDMA_INT_TRIG_FLD_RX_DONE_INT1 REG_FLD(1, 1) -#define WED_WPDMA_INT_TRIG_FLD_TX_DONE_INT0 REG_FLD(1, 4) -#define WED_WPDMA_INT_TRIG_FLD_TX_DONE_INT1 REG_FLD(1, 5) - -#define WED_GLO_CFG_FLD_RX_2B_OFFSET REG_FLD(1, 31) -#define WED_GLO_CFG_FLD_BYTE_SWAP REG_FLD(1, 29) -#define WED_GLO_CFG_FLD_OMIT_TX_INFO REG_FLD(1, 28) -#define WED_GLO_CFG_FLD_OMIT_RX_INFO REG_FLD(1, 27) -#define WED_GLO_CFG_FLD_FIRST_TOKEN_ONLY REG_FLD(1, 26) -#define WED_GLO_CFG_FLD_SW_RST REG_FLD(1, 24) -#define WED_GLO_CFG_FLD_TX_BT_SIZE_BIT21 REG_FLD(2, 22) -#define WED_GLO_CFG_FLD_MI_DEPTH_RD_8_6 REG_FLD(3, 19) -#define WED_GLO_CFG_FLD_MI_DEPTH_RD_5_3 REG_FLD(3, 16) -#define WED_GLO_CFG_FLD_MI_DEPTH_RD_2_0 REG_FLD(3, 13) -#define WED_GLO_CFG_FLD_FIFO_LITTLE_ENDIAN REG_FLD(1, 12) -#define WED_GLO_CFG_FLD_MULTI_DMA_EN REG_FLD(2, 10) -#define WED_GLO_CFG_FLD_TX_BT_SIZE_BIT0 REG_FLD(1, 9) -#define WED_GLO_CFG_FLD_DIS_BT_SIZE_ALIGN REG_FLD(1, 8) -#define WED_GLO_CFG_FLD_BIG_ENDIAN REG_FLD(1, 7) -#define WED_GLO_CFG_FLD_TX_WB_DDONE REG_FLD(1, 6) -#define WED_GLO_CFG_FLD_RX_BT_SIZE REG_FLD(2, 4) -#define WED_GLO_CFG_FLD_RX_DMA_BUSY REG_FLD(1, 3) -#define WED_GLO_CFG_FLD_RX_DMA_EN REG_FLD(1, 2) -#define WED_GLO_CFG_FLD_TX_DMA_BUSY REG_FLD(1, 1) -#define WED_GLO_CFG_FLD_TX_DMA_EN REG_FLD(1, 0) - -#define WED_RST_IDX_FLD_DRX_IDX1 REG_FLD(1, 17) -#define WED_RST_IDX_FLD_DRX_IDX0 REG_FLD(1, 16) -#define WED_RST_IDX_FLD_DTX_IDX3 REG_FLD(1, 3) -#define WED_RST_IDX_FLD_DTX_IDX2 REG_FLD(1, 2) -#define WED_RST_IDX_FLD_DTX_IDX1 REG_FLD(1, 1) -#define WED_RST_IDX_FLD_DTX_IDX0 REG_FLD(1, 0) - -#define WED_DLY_INT_CFG_FLD_TX_DLY_INT_EN REG_FLD(1, 31) -#define WED_DLY_INT_CFG_FLD_TX_MAX_PINT REG_FLD(7, 24) -#define WED_DLY_INT_CFG_FLD_TX_MAX_PTIME REG_FLD(8, 16) -#define WED_DLY_INT_CFG_FLD_RX_DLY_INT_EN REG_FLD(1, 15) -#define WED_DLY_INT_CFG_FLD_RX_MAX_PINT REG_FLD(7, 8) -#define WED_DLY_INT_CFG_FLD_RX_MAX_PTIME REG_FLD(8, 0) - -#define WED_TX0_MIB_FLD_PKT_CNT REG_FLD(32, 0) - -#define WED_TX1_MIB_FLD_PKT_CNT REG_FLD(32, 0) - -#define WED_RX0_MIB_FLD_PKT_CNT REG_FLD(32, 0) - -#define WED_RX1_MIB_FLD_PKT_CNT REG_FLD(32, 0) - -#define WED_TX0_CTRL0_FLD_BASE_PTR REG_FLD(32, 0) - -#define WED_TX0_CTRL1_FLD_MAX_CNT REG_FLD(12, 0) - -#define WED_TX0_CTRL2_FLD_CPU_IDX REG_FLD(12, 0) - -#define WED_TX0_CTRL3_FLD_DMA_IDX REG_FLD(12, 0) - -#define WED_TX1_CTRL0_FLD_BASE_PTR REG_FLD(32, 0) - -#define WED_TX1_CTRL1_FLD_MAX_CNT REG_FLD(12, 0) - -#define WED_TX1_CTRL2_FLD_CPU_IDX REG_FLD(12, 0) - -#define WED_TX1_CTRL3_FLD_DMA_IDX REG_FLD(12, 0) - -#define WED_RX0_CTRL0_FLD_BASE_PTR REG_FLD(32, 0) - -#define WED_RX0_CTRL1_FLD_MAX_CNT REG_FLD(12, 0) - -#define WED_RX0_CTRL2_FLD_CPU_IDX REG_FLD(12, 0) - -#define WED_RX0_CTRL3_FLD_DMA_IDX REG_FLD(12, 0) - -#define WED_RX1_CTRL0_FLD_BASE_PTR REG_FLD(32, 0) - -#define WED_RX1_CTRL1_FLD_MAX_CNT REG_FLD(12, 0) - -#define WED_RX1_CTRL2_FLD_CPU_IDX REG_FLD(12, 0) - -#define WED_RX1_CTRL3_FLD_DMA_IDX REG_FLD(12, 0) - -#define WED_WPDMA_INT_STA_REC_FLD_INT_STA REG_FLD(32, 0) - -#define WED_WPDMA_GLO_CFG_FLD_RX_2B_OFFSET REG_FLD(1, 31) -#define WED_WPDMA_GLO_CFG_FLD_BYTE_SWAP REG_FLD(1, 29) -#define WED_WPDMA_GLO_CFG_FLD_OMIT_TX_INFO REG_FLD(1, 28) -#define WED_WPDMA_GLO_CFG_FLD_OMIT_RX_INFO REG_FLD(1, 27) -#define WED_WPDMA_GLO_CFG_FLD_FIRST_TOKEN_ONLY REG_FLD(1, 26) -#define WED_WPDMA_GLO_CFG_FLD_SW_RST REG_FLD(1, 24) -#define WED_WPDMA_GLO_CFG_FLD_TX_BT_SIZE_BIT21 REG_FLD(2, 22) -#define WED_WPDMA_GLO_CFG_FLD_MI_DEPTH_RD_8_6 REG_FLD(3, 19) -#define WED_WPDMA_GLO_CFG_FLD_MI_DEPTH_RD_5_3 REG_FLD(3, 16) -#define WED_WPDMA_GLO_CFG_FLD_MI_DEPTH_RD_2_0 REG_FLD(3, 13) -#define WED_WPDMA_GLO_CFG_FLD_FIFO_LITTLE_ENDIAN REG_FLD(1, 12) -#define WED_WPDMA_GLO_CFG_FLD_MULTI_DMA_EN REG_FLD(2, 10) -#define WED_WPDMA_GLO_CFG_FLD_TX_BT_SIZE_BIT0 REG_FLD(1, 9) -#define WED_WPDMA_GLO_CFG_FLD_DIS_BT_SIZE_ALIGN REG_FLD(1, 8) -#define WED_WPDMA_GLO_CFG_FLD_BIG_ENDIAN REG_FLD(1, 7) -#define WED_WPDMA_GLO_CFG_FLD_TX_WB_DDONE REG_FLD(1, 6) -#define WED_WPDMA_GLO_CFG_FLD_RX_BT_SIZE REG_FLD(2, 4) -#define WED_WPDMA_GLO_CFG_FLD_RX_DRV_BUSY REG_FLD(1, 3) -#define WED_WPDMA_GLO_CFG_FLD_RX_DRV_EN REG_FLD(1, 2) -#define WED_WPDMA_GLO_CFG_FLD_TX_DRV_BUSY REG_FLD(1, 1) -#define WED_WPDMA_GLO_CFG_FLD_TX_DRV_EN REG_FLD(1, 0) - -#define WED_WPDMA_RST_IDX_FLD_CTX_IDX0 REG_FLD(1, 0) -#define WED_WPDMA_RST_IDX_FLD_CTX_IDX1 REG_FLD(1, 1) -#define WED_WPDMA_RST_IDX_FLD_CRX_IDX1 REG_FLD(1, 17) - -#define WED_WDMA_GLO_CFG_FLD_RXDRV_CLKGATE_BYP REG_FLD(1, 30) -#define WED_WDMA_GLO_CFG_FLD_RST_INIT_COMPLETE_FLAG REG_FLD(1, 26) -#define WED_WDMA_GLO_CFG_FLD_DYNAMIC_DMAD_RECYCLE REG_FLD(1, 25) -#define WED_WDMA_GLO_CFG_FLD_DYNAMIC_SKIP_DMAD_PREPARE REG_FLD(1, 24) -#define WED_WDMA_GLO_CFG_FLD_IDLE_STATE_DMAD_SUPPLY_EN REG_FLD(1, 23) -#define WED_WDMA_GLO_CFG_FLD_IDLE_STATE_DMAD_SUPPLY_SINGLE_DMAD_WRITE \ - REG_FLD(1, 22) -#define WED_WDMA_GLO_CFG_FLD_AXI_W_AFTER_AW_EN REG_FLD(1, 21) -#define WED_WDMA_GLO_CFG_FLD_WAIT_COHERENT_EN REG_FLD(1, 20) -#define WED_WDMA_GLO_CFG_FLD_FSM_RETURN_IDLE REG_FLD(1, 19) -#define WED_WDMA_GLO_CFG_FLD_INIT_PHASE_BYPASS REG_FLD(1, 18) -#define WED_WDMA_GLO_CFG_FLD_INIT_PHASE_ENABLING_RXDMA_BYPASS REG_FLD(1, 17) -#define WED_WDMA_GLO_CFG_FLD_WCOMPLETE_SEL REG_FLD(1, 16) -#define WED_WDMA_GLO_CFG_FLD_RX_DRV_DISABLE_FSM_AUTO_IDLE REG_FLD(1, 13) -#define WED_WDMA_GLO_CFG_FLD_BIG_ENDIAN REG_FLD(1, 7) -#define WED_WDMA_GLO_CFG_FLD_TX_WB_DDONE REG_FLD(1, 6) -#define WED_WDMA_GLO_CFG_FLD_RX_DRV_BUSY REG_FLD(1, 3) -#define WED_WDMA_GLO_CFG_FLD_RX_DRV_EN REG_FLD(1, 2) -#define WED_WDMA_GLO_CFG_FLD_TX_DRV_EN REG_FLD(1, 0) -#define WED_WDMA_GLO_CFG_FLD_WDMA_BT_SIZE REG_FLD(2, 4) -#define WED_WDMA_GLO_CFG_FLD_WDMA_BT_SIZE_MASK 0x3 - -#define WED_WDMA_RST_IDX_FLD_CRX_IDX0 REG_FLD(1, 16) -#define WED_WDMA_RST_IDX_FLD_CRX_IDX1 REG_FLD(1, 17) -#define WED_WDMA_RST_IDX_FLD_DRV_IDX0 REG_FLD(1, 24) -#define WED_WDMA_RST_IDX_FLD_DRV_IDX1 REG_FLD(1, 25) - -#define WED_WDMA_INT_TRIG_FLD_RX_DONE1 REG_FLD(1, 17) -#define WED_WDMA_INT_TRIG_FLD_RX_DONE0 REG_FLD(1, 16) - -#define WED_WDMA_INT_CTRL_FLD_POLL_PRD REG_FLD(8, 0) -#define WED_WDMA_INT_CTRL_FLD_POLL_EN REG_FLD(1, 12) -#define WED_WDMA_INT_CTRL_FLD_POLL_SRC_SEL REG_FLD(2, 16) -#define WED_WDMA_INT_CTRL_FLD_POLL_SRC_SEL_MASK 0x3 - -#define WED_WDMA_RX_THRES_CFG_FLD_WAIT_BM_CNT_MAX REG_FLD(12, 0) -#define WED_WDMA_RX_THRES_CFG_FLD_DRX_CRX_DISTANCE_THRES REG_FLD(12, 16) -#define WED_PCIE_INT_CTRL_FLD_POLL_PRD REG_FLD(8, 0) -#define WED_PCIE_INT_CTRL_FLD_POLL_EN REG_FLD(2, 12) -#define WED_PCIE_INT_CTRL_FLD_SRC_SEL REG_FLD(2, 16) -#define WED_PCIE_INT_CTRL_FLD_MSK_EN_POLA REG_FLD(1, 20) -#define WED_DBG_CTRL_FLD_TX_BM_MEM_DBG REG_FLD(1, 28) -#define WED_DBG_CTRL_FLD_PRB_SEL REG_FLD(1, 0) diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe.h deleted file mode 100644 index a180ba2553..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - whnat.h -*/ - -#ifndef _WHNAT_H -#define _WHNAT_H - -#include "wdma.h" -#include "wed.h" -#include "woe_hif.h" -#include "woe_basic.h" - -struct whnat_cfg { - char cr_mirror_en; - char hw_tx_en; -}; - -struct whnat_entry { - unsigned char idx; - unsigned char slot_id; - struct wifi_entry wifi; - struct platform_driver pdriver; - struct wdma_entry wdma; - struct wed_entry wed; - struct platform_dev *pdev; - struct whnat_cfg cfg; - void *proc; - void *proc_stat; - void *proc_cr; - void *proc_cfg; - void *proc_tx; - void *proc_rx; - void *proc_ctrl; -}; - -struct whnat_ctrl { - unsigned char whnat_num; - struct whnat_entry *entry; - struct whnat_hif_cfg hif_cfg; - unsigned int whnat_driver_idx; - void *proc; - void *proc_trace; -}; - -struct whnat_wifi_cr_map { - unsigned int wifi_cr; - unsigned int whnat_cr; - char whnat_type; -}; - -void whnat_proc_handle(struct whnat_entry *entry); -void whnat_dump_cfg(struct whnat_entry *whnat); -void whnat_dump_txinfo(struct whnat_entry *whnat); -void whnat_dump_rxinfo(struct whnat_entry *whnat); - -struct whnat_ctrl *whnat_ctrl_get(void); -struct whnat_entry *whnat_entry_search(void *cookie); - -int whnat_entry_proc_init(struct whnat_ctrl *whnat_ctrl, - struct whnat_entry *whnat); -void whnat_entry_proc_exit(struct whnat_ctrl *whnat_ctrl, - struct whnat_entry *whnat); -int whnat_ctrl_proc_init(struct whnat_ctrl *whnat_ctrl); -void whnat_ctrl_proc_exit(struct whnat_ctrl *whnat_ctrl); -int wed_entry_proc_init(struct whnat_entry *whnat, struct wed_entry *wed); -void wed_entry_proc_exit(struct whnat_entry *whnat, struct wed_entry *wed); -int wdma_entry_proc_init(struct whnat_entry *whnat, struct wdma_entry *wdma); -void wdma_entry_proc_exit(struct whnat_entry *whnat, struct wdma_entry *wdma); - -#endif /*_WHNAT_H*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_basic.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_basic.c deleted file mode 100644 index 3dc3af9490..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_basic.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - whnat_basic.c -*/ - -#include "woe_basic.h" - -static char whnat_log_level = WHNAT_DBG_ERR; - -/* -* -*/ -char whnat_log_get(void) -{ - return whnat_log_level; -} - -/* -* -*/ -void whnat_log_set(char log) -{ - whnat_log_level = log; -} - -/* -* -*/ -void whnat_dma_buf_free(struct platform_device *dev, - struct whnat_dma_buf *dma_buf) -{ - if (!dev || !dma_buf->alloc_va) - return; - - memset(dma_buf->alloc_va, 0, dma_buf->alloc_size); - dma_free_coherent(&dev->dev, dma_buf->alloc_size, dma_buf->alloc_va, - dma_buf->alloc_pa); - memset(dma_buf, 0, sizeof(struct whnat_dma_buf)); -} - -/* -* -*/ -int whnat_dma_buf_alloc(struct platform_device *dev, - struct whnat_dma_buf *dma_buf, UINT size) -{ - dma_addr_t paddr; - void *vaddr; - - dma_buf->alloc_size = size; - vaddr = dma_alloc_coherent(&dev->dev, size, &paddr, GFP_KERNEL); - - if (vaddr == NULL) { - WHNAT_DBG(WHNAT_DBG_ERR, - "Failed to allocate a big buffer,size=%d\n", size); - return -1; - } - - dma_buf->alloc_pa = paddr; - dma_buf->alloc_va = vaddr; - /*zero init this memory block*/ - memset(dma_buf->alloc_va, 0, size); - return 0; -} - -/* -* -*/ -void whnat_dump_dmabuf(struct whnat_dma_buf *buf) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "AllocPA\t:%pad\n", &buf->alloc_pa); - WHNAT_DBG(WHNAT_DBG_OFF, "AllocVa\t:0x%p\n", buf->alloc_va); - WHNAT_DBG(WHNAT_DBG_OFF, "Size\t:%lu\n", buf->alloc_size); -} - -/* -* -*/ -void whnat_dump_dmacb(struct whnat_dma_cb *cb) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "AllocPA\t: %pad\n", &cb->alloc_pa); - WHNAT_DBG(WHNAT_DBG_OFF, "AllocVa\t: %p\n", cb->alloc_va); - WHNAT_DBG(WHNAT_DBG_OFF, "Size\t: %lu\n", cb->alloc_size); - WHNAT_DBG(WHNAT_DBG_OFF, "Pkt\t: %p\n", cb->pkt); - WHNAT_DBG(WHNAT_DBG_OFF, "token_id\t: %d\n", cb->token_id); -} - -/* -* -*/ -void whnat_dump_raw(char *str, unsigned char *va, unsigned int size) -{ - unsigned char *pt; - char buf[512] = ""; - unsigned int len = 0; - int x; - - pt = va; - WHNAT_DBG(WHNAT_DBG_OFF, "%s: %p, len = %d\n", str, va, size); - - for (x = 0; x < size; x++) { - if (x % 16 == 0) { - sprintf(buf + len, "\n0x%04x : ", x); - len = strlen(buf); - } - - sprintf(buf + len, "%02x ", ((unsigned char)pt[x])); - len = strlen(buf); - } - - WHNAT_DBG(WHNAT_DBG_OFF, "%s\n", buf); -} - -long whnat_str_tol(const char *str, char **endptr, int base) -{ - return simple_strtol(str, endptr, base); -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_basic.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_basic.h deleted file mode 100644 index 6f9c680f3d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_basic.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - whnat_basic.h -*/ - -#ifndef _WHNAT_BASIC_H_ -#define _WHNAT_BASIC_H_ - -#include -#include -#include -#include -#include -#include -#include - -#include "woe_wifi.h" -#include "woe_hw.h" - -/*configuration*/ -/*Label 0*/ -#define CFG_INTER_AGENT_SUPPORT 1 - -/*Label 1*/ -#define CFG_TX_SUPPORT 1 -#define CFG_RX_SUPPORT 1 - -/*Label 2*/ -#define CFG_CR_MIRROR_SUPPORT 1 -#define CFG_DELAY_INT_SUPPORT 1 - -/*Label 3*/ -#define CFG_HW_TX_SUPPORT 1 - -/*Label 4*/ -#define CFG_DYNAMIC_BM_SUPPORT 0 -#define CFG_WDMA_RECYCLE 0 - -/*should remove when feature is ready or fix*/ -#define CFG_WORK_AROUND_128_ALIGN 1 -/*should not enable since hw fixed*/ -#define CFG_WORK_AROUND_INT_POLL 0 -/*should not enable since hw fixed*/ -#define CFG_WORK_AROUND_WDMA_RETURN_IDLE 0 - -/*workaround*/ -#if CFG_WORK_AROUND_128_ALIGN -#define WED_WORK_AROUND_128_ALIGN -#endif - -#if CFG_WORK_AROUND_INT_POLL -#define WED_WORK_AROUND_INT_POLL -#endif - -#if CFG_WORK_AROUND_WDMA_RETURN_IDLE -#define WED_WORK_AROUND_WDMA_RETURN_IDLE -#endif - -/*compiler flag rule*/ -#if CFG_INTER_AGENT_SUPPORT -#define WED_INTER_AGENT_SUPPORT -#endif - -#if (CFG_INTER_AGENT_SUPPORT && CFG_TX_SUPPORT) -#define WED_TX_SUPPORT -#endif - -#if (CFG_INTER_AGENT_SUPPORT && CFG_RX_SUPPORT) -#define WED_RX_SUPPORT -#endif - -#if (CFG_INTER_AGENT_SUPPORT && CFG_TX_SUPPORT && CFG_RX_SUPPORT && \ - CFG_CR_MIRROR_SUPPORT) -#define WED_CR_MIRROR_SUPPORT -#endif - -#if (CFG_INTER_AGENT_SUPPORT && CFG_TX_SUPPORT && CFG_RX_SUPPORT && \ - CFG_DELAY_INT_SUPPORT) -#define WED_DELAY_INT_SUPPORT -#endif - -#if (CFG_INTER_AGENT_SUPPORT && CFG_TX_SUPPORT && CFG_RX_SUPPORT && \ - CFG_HW_TX_SUPPORT) -#define WED_HW_TX_SUPPORT -#endif - -#if (CFG_INTER_AGENT_SUPPORT && CFG_TX_SUPPORT && CFG_RX_SUPPORT && \ - CFG_HW_TX_SUPPORT && CFG_DYNAMIC_BM_SUPPORT) -#define WED_DYNAMIC_BM_SUPPORT -#endif - -#if (CFG_INTER_AGENT_SUPPORT && CFG_TX_SUPPORT && CFG_RX_SUPPORT && \ - CFG_HW_TX_SUPPORT && CFG_WDMA_RECYCLE) -#define WED_WDMA_RECYCLE -#endif - -#define MAX_NAME_SIZE 64 - -enum { - WHNAT_DBG_START, - WHNAT_DBG_OFF = WHNAT_DBG_START, - WHNAT_DBG_ERR, - WHNAT_DBG_INF, - WHNAT_DBG_LOU, - WHNAT_DBG_END -}; - -enum { - WHNAT_CR_START = 0, - WHNAT_CR_WED = WHNAT_CR_START, - WHNAT_CR_WDMA, - WHNAT_CR_WIFI, - WHNAT_CR_END -}; - -/*platform register Read/Write*/ -#define WHNAT_IO_WRITE32(_A, _R, _V) \ - writel(_V, (void *)((_A)->base_addr + (_R))) - -#define WHNAT_IO_READ32(_A, _R, _pV) \ - (*(_pV) = readl((void *)((_A)->base_addr + (_R)))) - -#define WHNAT_DBG_EN 1 -/*debug macro*/ -#if WHNAT_DBG_EN -#define WHNAT_DBG(lev, fmt, args...) \ - { \ - if (lev <= whnat_log_get()) \ - pr_info(fmt, ##args); \ - } -#else -#define WHNAT_DBG(lev, fmt, args...) -#endif - -struct whnat_dma_buf { - unsigned long alloc_size; - void *alloc_va; - struct list_head list; - dma_addr_t alloc_pa; -}; - -struct whnat_dma_cb { - unsigned long alloc_size; - void *alloc_va; - dma_addr_t alloc_pa; - struct sk_buff *pkt; - dma_addr_t pkt_pa; - unsigned short token_id; -}; - -struct whnat_ring { - struct whnat_dma_cb cell[WIFI_TX_RING_SIZE]; - struct whnat_dma_buf desc; - unsigned int hw_desc_base; - unsigned int hw_cidx_addr; - unsigned int hw_didx_addr; - unsigned int hw_cnt_addr; -}; - -char whnat_log_get(void); -void whnat_log_set(char log); - -void whnat_dump_dmabuf(struct whnat_dma_buf *buf); -void whnat_dump_dmacb(struct whnat_dma_cb *cb); - -int whnat_dma_buf_alloc(struct platform_device *dev, - struct whnat_dma_buf *dma_buf, UINT size); -void whnat_dma_buf_free(struct platform_device *dev, - struct whnat_dma_buf *dma_buf); - -void whnat_dump_raw(char *str, unsigned char *va, unsigned int size); -long whnat_str_tol(const char *str, char **endptr, int base); -#endif /*_WHNAT_BASIC_H_*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hif.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hif.c deleted file mode 100644 index 801c91c503..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hif.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: whnat - whnat_hif.c -*/ - -#include "woe_hif.h" - -#define PCIE_MIRRO_DEV_NODE "mediatek,pcie-mirror" -#define BUS_TRACE_DEV_NODE "mediatek,BUS_DBG" - -#ifdef WHNAT_CPU_TRACER -/* -* -*/ -static irqreturn_t cputracer_isr(int irq, void *data) -{ - unsigned int value; - unsigned int sta; - struct whnat_cputracer *tracer = (struct whnat_cputracer *)data; - - WHNAT_IO_READ32(tracer, CPU_TRACER_CFG, &sta); - value = sta | (1 << CPU_TRACER_CON_IRQ_CLR); - - if (sta & (1 << CPU_TRACER_CON_IRQ_WP_STA)) - WHNAT_DBG(WHNAT_DBG_OFF, - "[TRACKER] Watch address: 0x%x was touched\n", - tracer->trace_addr); - - if (sta & (1 << CPU_TRACER_CON_IRQ_AR_STA)) - WHNAT_DBG(WHNAT_DBG_OFF, "[TRAKER] Read time out trigger\n"); - - if (sta & (1 << CPU_TRACER_CON_IRQ_AW_STA)) - WHNAT_DBG(WHNAT_DBG_OFF, "[TRAKER] Write time out trigger\n"); - - WHNAT_IO_WRITE32(tracer, CPU_TRACER_CFG, value); - return IRQ_HANDLED; -} - -/* -* -*/ -static void whnat_hif_cputracer_probe(struct whnat_hif_cfg *hif) -{ - struct device_node *node = NULL; - struct whnat_cputracer *tracer = &hif->tracer; - - node = of_find_compatible_node(NULL, NULL, BUS_TRACE_DEV_NODE); - tracer->base_addr = (unsigned long)of_iomap(node, 0); - tracer->irq = irq_of_parse_and_map(node, 0); - tracer->trace_addr = WHNAT_CPU_TRACER_DEFAULT_ADDR; - tracer->trace_en = WHNAT_CPU_TRACER_DEFAULT_EN; - tracer->trace_mask = WHNAT_CPU_TRACER_DEFAULT_MASK; - - if (request_irq(tracer->irq, (irq_handler_t)cputracer_isr, - IRQF_TRIGGER_LOW, "cpu_tracer", (tracer))) - WHNAT_DBG(WHNAT_DBG_OFF, - "%s(): register irq: %d for cpu tracer fail!\n", - __func__, tracer->irq); - else - WHNAT_DBG(WHNAT_DBG_OFF, - "%s(): register irq: %d for cpu tracer ok!\n", - __func__, tracer->irq); - - whnat_hal_trace_set(tracer); -} -#endif /*WHNAT_CPU_TRACER*/ - -#ifdef WED_CR_MIRROR_SUPPORT -/* -* -*/ -static void whnat_hif_pcie_mirror_probe(struct whnat_hif_cfg *hif) -{ - struct device_node *node = NULL; - /*CR mirror*/ - node = of_find_compatible_node(NULL, NULL, PCIE_MIRRO_DEV_NODE); - WHNAT_DBG(WHNAT_DBG_INF, "%s(): get node=%p\n", __func__, &node); - /* iomap registers */ - hif->base_addr = (unsigned long)of_iomap(node, 0); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): hif_cfg base addr=%lx\n", __func__, - hif->base_addr); - whnat_hal_hif_init(hif); -} -#endif /*WED_CR_MIRROR_SUPPORT*/ - -/* -* -*/ -static void whnat_hif_pcie_probe(struct whnat_hif_cfg *hif) -{ - hif->pcie_base[0] = PCIE_BASE_ADDR0; - hif->pcie_base[1] = PCIE_BASE_ADDR1; - hif->wpdma_base[0] = WPDMA_BASE_ADDR0; - hif->wpdma_base[1] = WPDMA_BASE_ADDR1; -} - -/* -* -*/ -int whnat_hif_init(struct whnat_hif_cfg *hif) -{ - whnat_hif_pcie_probe(hif); -#ifdef WED_CR_MIRROR_SUPPORT - whnat_hif_pcie_mirror_probe(hif); -#endif /*WED_CR_MIRROR_SUPPORT*/ -#ifdef WHNAT_CPU_TRACER - whnat_hif_cputracer_probe(hif); -#endif /*WHNAT_CPU_TRACER*/ - return 0; -} - -/* -* -*/ -int whnat_hif_exit(struct whnat_hif_cfg *hif) -{ - if (hif) { -#ifdef WED_CR_MIRROR_SUPPORT - iounmap((void *)hif->base_addr); -#endif /*WED_CR_MIRROR_SUPPORT*/ -#ifdef WHNAT_CPU_TRACER - { - struct whnat_cputracer *tracer = &hif->tracer; - - WHNAT_IO_WRITE32(tracer, CPU_TRACER_CFG, 0); - iounmap((void *)tracer->base_addr); - } -#endif - memset(hif, 0, sizeof(*hif)); - } - - return 0; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hif.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hif.h deleted file mode 100644 index 996c9fb10b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hif.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: whnat - whnat_hif.h -*/ - -#ifndef _WHNAT_HIF_H -#define _WHNAT_HIF_H - -#include "woe_basic.h" - -/* #define WHNAT_CPU_TRACER */ -#define WHNAT_CPU_TRACER_DEFAULT_EN 1 -#define WHNAT_CPU_TRACER_DEFAULT_ADDR 0x1a143424 -#define WHNAT_CPU_TRACER_DEFAULT_MASK 0 - -struct whnat_cputracer { - unsigned long base_addr; - unsigned char irq; - unsigned char trace_en; - unsigned int trace_addr; - unsigned int trace_mask; -}; - -struct whnat_hif_cfg { - unsigned long base_addr; - unsigned int pcie_base[2]; - unsigned int wpdma_base[2]; - struct whnat_cputracer tracer; -}; - -enum { - WHNAT_TRACE_EN, - WHNAT_TRACE_ADDR, - WHNAT_TRACE_MSK, -}; - -int whnat_hif_init(struct whnat_hif_cfg *hif); -int whnat_hif_exit(struct whnat_hif_cfg *hif); - -#define PCIE_MIRRO_BASE 0 - -#define PCIE0_MAP (PCIE_MIRRO_BASE + 0x0) -#define PCIE1_MAP (PCIE_MIRRO_BASE + 0x4) -#define WED0_MAP (PCIE_MIRRO_BASE + 0x8) -#define WED1_MAP (PCIE_MIRRO_BASE + 0xC) - -#define PCIE_MAP_FLD_PCIE_REMAP_EN 0 -#define PCIE_MAP_FLD_PCIE_REMAP 1 -#define PCIE_MAP_FLD_PCIE_ADDR_REMAP 12 - -#define CPU_TRACER_BASE 0 - -#define CPU_TRACER_CFG (CPU_TRACER_BASE + 0x0) -#define CPU_TRACER_WP_ADDR (CPU_TRACER_BASE + 0xC) -#define CPU_TRACER_WP_MASK (CPU_TRACER_BASE + 0x10) -#define CPU_TRACER_TO_TIME (CPU_TRACER_BASE + 0x4) -#define CPU_TRACER_CR_TIME (CPU_TRACER_BASE + 0x8) - -#define CPU_TRACER_CON_BUS_DBG_EN 0 -#define CPU_TRACER_CON_TIMEOUT_EN 1 -#define CPU_TRACER_CON_SLV_ERR_EN 2 -#define CPU_TRACER_CON_WP_EN 3 -#define CPU_TRACER_CON_IRQ_AR_EN 4 -#define CPU_TRACER_CON_IRQ_AW_EN 5 -/* DE uses exotic name for ESO items... we use another human-readable name */ -#define CPU_TRACER_CON_IRQ_WP_EN 6 -#define CPU_TRACER_CON_IRQ_CLR 7 -#define CPU_TRACER_CON_IRQ_AR_STA 8 -#define CPU_TRACER_CON_IRQ_AW_STA 9 -#define CPU_TRACER_CON_IRQ_WP_STA 10 - -#define PCIE_BASE_ADDR0 0x1A143000 -#define PCIE_BASE_ADDR1 0x1A145000 - -/*default usage, should get from pcie device*/ -#define WPDMA_BASE_ADDR0 0x20004000 -#define WPDMA_BASE_ADDR1 0x20104000 -#define WPDMA_OFFSET 0x4000 - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hw.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hw.c deleted file mode 100644 index 812762468a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hw.c +++ /dev/null @@ -1,1535 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - whnat_hw.c -*/ - -#include "woe.h" -#include "woe_hw.h" -#include "wed_def.h" - -/*whnat cr interesting list*/ -static struct whnat_wifi_cr_map cr_map_list[] = { - { WIFI_INT_STA, WED_INT_STA, WHNAT_CR_WED }, - { WIFI_INT_MSK, WED_INT_MSK, WHNAT_CR_WED }, -/* {WIFI_WPDMA_GLO_CFG,WED_GLO_CFG,WHNAT_CR_WED}, */ -#ifdef WED_RX_SUPPORT - { WIFI_RX_RING1_BASE, WED_RX1_CTRL0, WHNAT_CR_WED }, - { WIFI_RX_RING1_CNT, WED_RX1_CTRL1, WHNAT_CR_WED }, - { WIFI_RX_RING1_CIDX, WED_RX1_CTRL2, WHNAT_CR_WED }, - { WIFI_RX_RING1_DIDX, WED_RX1_CTRL3, WHNAT_CR_WED }, -#endif /*RX*/ -#ifdef WED_TX_SUPPORT - { WIFI_TX_RING0_BASE, WED_TX0_CTRL0, WHNAT_CR_WED }, - { WIFI_TX_RING0_CNT, WED_TX0_CTRL1, WHNAT_CR_WED }, - { WIFI_TX_RING0_CIDX, WED_TX0_CTRL2, WHNAT_CR_WED }, - { WIFI_TX_RING0_DIDX, WED_TX0_CTRL3, WHNAT_CR_WED }, - { WIFI_TX_RING1_BASE, WED_TX1_CTRL0, WHNAT_CR_WED }, - { WIFI_TX_RING1_CNT, WED_TX1_CTRL1, WHNAT_CR_WED }, - { WIFI_TX_RING1_CIDX, WED_TX1_CTRL2, WHNAT_CR_WED }, - { WIFI_TX_RING1_DIDX, WED_TX1_CTRL3, WHNAT_CR_WED }, -#endif - { 0, 0 } -}; - -#define WHNAT_RESET(_entry, _addr, _value) \ - { \ - unsigned int cnt = 0; \ - WHNAT_IO_WRITE32(_entry, _addr, _value); \ - while (_value != 0 && cnt < WED_POLL_MAX) { \ - WHNAT_IO_READ32(_entry, _addr, &_value); \ - cnt++; \ - } \ - if (cnt >= WED_POLL_MAX) { \ - WHNAT_DBG( \ - WHNAT_DBG_ERR, \ - "%s(): Reset addr=%x,value=%x,cnt=%d fail!\n", \ - __func__, _addr, _value, cnt); \ - } \ - } - -/*Local function*/ - -/* -* -*/ -static inline int wed_agt_dis_ck(struct wed_entry *wed, unsigned int addr, - unsigned int busy_bit) -{ - unsigned int cnt = 0; - unsigned int value; - - WHNAT_IO_READ32(wed, addr, &value); - - while ((value & (1 << busy_bit)) && cnt < WED_POLL_MAX) { - usleep_range(10000, 15000); - WHNAT_IO_READ32(wed, addr, &value); - cnt++; - } - - if (cnt >= WED_POLL_MAX) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): %x disable bit %d fail!!\n", - __func__, addr, busy_bit); - return -1; - } - - return 0; -} - -/* -* -*/ -static inline int wdma_agt_dis_ck(struct wdma_entry *wdma, unsigned int addr, - unsigned busy_bit) -{ - unsigned int cnt = 0; - unsigned int value; - - WHNAT_IO_READ32(wdma, addr, &value); - - while ((value & (1 << busy_bit)) && cnt < WED_POLL_MAX) { - usleep_range(10000, 15000); - WHNAT_IO_READ32(wdma, addr, &value); - cnt++; - } - - if (cnt >= WED_POLL_MAX) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): %x disable bit %d fail!!\n", - __func__, addr, busy_bit); - return -1; - } - - return 0; -} - -/* -* -*/ -static inline int wifi_agt_dis_ck(struct wifi_entry *wifi, unsigned int addr, - unsigned int busy_bit) -{ - unsigned int cnt = 0; - unsigned int value; - - WHNAT_IO_READ32(wifi, addr, &value); - - while ((value & (1 << busy_bit)) && cnt < WED_POLL_MAX) { - usleep_range(10000, 15000); - WHNAT_IO_READ32(wifi, addr, &value); - cnt++; - } - - if (cnt >= WED_POLL_MAX) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): %x disable bit %d fail!!\n", - __func__, addr, busy_bit); - return -1; - } - - return 0; -} - -/* -* -*/ -static void wed_dma_ctrl(struct wed_entry *wed, unsigned char txrx) -{ - unsigned int wed_cfg; - unsigned int wed_wdma_cfg; - unsigned int wed_wpdma_cfg; - /*reset wed*/ - WHNAT_IO_READ32(wed, WED_GLO_CFG, &wed_cfg); - wed_cfg &= ~((1 << WED_GLO_CFG_FLD_TX_DMA_EN) | - (1 << WED_GLO_CFG_FLD_RX_DMA_EN)); - WHNAT_IO_READ32(wed, WED_WPDMA_GLO_CFG, &wed_wpdma_cfg); - wed_wpdma_cfg &= ~((1 << WED_WPDMA_GLO_CFG_FLD_TX_DRV_EN) | - (1 << WED_WPDMA_GLO_CFG_FLD_RX_DRV_EN)); - WHNAT_IO_READ32(wed, WED_WDMA_GLO_CFG, &wed_wdma_cfg); - wed_wdma_cfg &= ~((1 << WED_WDMA_GLO_CFG_FLD_TX_DRV_EN) | - (1 << WED_WDMA_GLO_CFG_FLD_RX_DRV_EN)); - - switch (txrx) { - case WHNAT_DMA_TX: { - WHNAT_DBG(WHNAT_DBG_INF, "%s(): %s DMA TX.\n", __func__, - (txrx ? "ENABLE" : "DISABLE")); - wed_cfg |= (1 << WED_GLO_CFG_FLD_TX_DMA_EN); - wed_wpdma_cfg |= (1 << WED_WPDMA_GLO_CFG_FLD_TX_DRV_EN); - wed_wdma_cfg |= (1 << WED_WDMA_GLO_CFG_FLD_RX_DRV_EN); - } break; - - case WHNAT_DMA_RX: { - WHNAT_DBG(WHNAT_DBG_INF, "%s(): %s DMA RX.\n", __func__, - (txrx ? "ENABLE" : "DISABLE")); - wed_cfg |= (1 << WED_GLO_CFG_FLD_RX_DMA_EN); - wed_wpdma_cfg |= (1 << WED_WPDMA_GLO_CFG_FLD_RX_DRV_EN); - } break; - - case WHNAT_DMA_TXRX: { - WHNAT_DBG(WHNAT_DBG_INF, "%s(): %s DMA TXRX.\n", __func__, - (txrx ? "ENABLE" : "DISABLE")); - wed_cfg |= ((1 << WED_GLO_CFG_FLD_TX_DMA_EN) | - (1 << WED_GLO_CFG_FLD_RX_DMA_EN)); - wed_wpdma_cfg |= ((1 << WED_WPDMA_GLO_CFG_FLD_TX_DRV_EN) | - (1 << WED_WPDMA_GLO_CFG_FLD_RX_DRV_EN)); - wed_wdma_cfg |= (1 << WED_WDMA_GLO_CFG_FLD_RX_DRV_EN); - } break; - } - - WHNAT_IO_WRITE32(wed, WED_GLO_CFG, wed_cfg); -#ifdef WED_HW_TX_SUPPORT - WHNAT_IO_WRITE32(wed, WED_WDMA_GLO_CFG, wed_wdma_cfg); -#endif /*WED_HW_TX_SUPPORT*/ - WHNAT_IO_WRITE32(wed, WED_WPDMA_GLO_CFG, wed_wpdma_cfg); -} - -/* -* -*/ -static void wdma_dma_ctrl(struct wdma_entry *wdma, unsigned char txrx) -{ - unsigned int wdma_cfg = 0; - - WHNAT_IO_READ32(wdma, WDMA_GLO_CFG, &wdma_cfg); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): WDMA_GLO_CFG=%x\n", __func__, wdma_cfg); - - if (txrx) { - /*reset wdma*/ - wdma_cfg |= (1 << WDMA_GLO_CFG_RX_INFO1_PRERESERVE); - wdma_cfg |= (1 << WDMA_GLO_CFG_RX_INFO2_PRERESERVE); - wdma_cfg |= (1 << WDMA_GLO_CFG_RX_INFO3_PRERESERVE); - WHNAT_IO_WRITE32(wdma, WDMA_GLO_CFG, wdma_cfg); - } else { - wdma_cfg &= ~(1 << WDMA_GLO_CFG_RX_INFO1_PRERESERVE); - wdma_cfg &= ~(1 << WDMA_GLO_CFG_RX_INFO2_PRERESERVE); - WHNAT_IO_WRITE32(wdma, WDMA_GLO_CFG, wdma_cfg); - } -} - -/* -* -*/ -#ifdef WED_HW_TX_SUPPORT -static void whnat_hal_bfm_init(struct whnat_entry *whnat) -{ - struct wed_entry *wed = &whnat->wed; - struct wed_buf_res *res = &wed->res_ctrl.tx_ctrl.res; - struct wed_tx_ring_ctrl *ring_ctrl = &wed->res_ctrl.tx_ctrl.ring_ctrl; - unsigned int value = 0; - /*PAUSE BUF MGMT*/ - value = (1 << WED_TX_BM_CTRL_FLD_PAUSE); - /*should be set before WED_MOD_RST is invoked*/ - value |= ((res->pkt_num / WED_TOKEN_UNIT) - << WED_TX_BM_CTRL_FLD_VLD_GRP_NUM); - value |= - ((ring_ctrl->ring_len / 256) << WED_TX_BM_CTRL_FLD_RSV_GRP_NUM); - WHNAT_IO_WRITE32(wed, WED_TX_BM_CTRL, value); - /*TX BM_BASE*/ - value = res->des_buf.alloc_pa; - WHNAT_IO_WRITE32(wed, WED_TX_BM_BASE, value); - /*TX token cfg */ - value = ((WED_TOKEN_START) << WED_TX_BM_TKID_FLD_START_ID); - value |= ((WED_TOKEN_END) << WED_TX_BM_TKID_FLD_END_ID); - WHNAT_IO_WRITE32(wed, WED_TX_BM_TKID, value); - /*TX packet len*/ - value = (res->pkt_len & WED_TX_BM_BLEN_FLD_BYTE_LEN_MASK); - WHNAT_IO_WRITE32(wed, WED_TX_BM_BLEN, value); - /*dynamic adjust*/ -#ifdef WED_DYNAMIC_BM_SUPPORT - value = (WED_TOKEN_LOW << WED_TX_BM_DYN_TH_FLD_LOW_GRP_NUM); - value |= (WED_TOKEN_HIGH << WED_TX_BM_DYN_TH_FLD_HI_GRP_NUM); -#else - value = (1 << WED_TX_BM_DYN_TH_FLD_LOW_GRP_NUM); - value |= (WED_TX_BM_DYN_TH_FLD_HI_GRP_MASK - << WED_TX_BM_DYN_TH_FLD_HI_GRP_NUM); -#endif /*WED_DYNAMIC_BW_SUPPORT*/ - WHNAT_IO_WRITE32(wed, WED_TX_BM_DYN_TH, value); - /*Reset Buf mgmt for ready to start*/ - value = 1 << WED_MOD_RST_FLD_TX_BM; - WHNAT_RESET(wed, WED_MOD_RST, value); - /*Enable agent for BM*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value |= (1 << WED_CTRL_FLD_WED_TX_BM_EN); - value |= (1 << WED_CTRL_FLD_WED_TX_FREE_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - WHNAT_IO_READ32(wed, WED_TX_BM_CTRL, &value); - value &= ~(1 << WED_TX_BM_CTRL_FLD_PAUSE); - WHNAT_IO_WRITE32(wed, WED_TX_BM_CTRL, value); -} - -/* -* -*/ -void whnat_hal_bfm_freecnt(struct wed_entry *wed, unsigned int *cnt) -{ - unsigned int value; - unsigned int tcnt = 0; - unsigned int fcnt = 0; - unsigned int cr; - unsigned int i; - unsigned int j = 0; - unsigned int k = 0; - unsigned int grp = 0; - char str[256] = ""; - struct wed_buf_res *buf_res = &wed->res_ctrl.tx_ctrl.res; - - grp = buf_res->pkt_num / WED_TOKEN_STATUS_UNIT; - tcnt = buf_res->pkt_num % WED_TOKEN_STATUS_UNIT; - value = 1 << WED_DBG_CTRL_FLD_TX_BM_MEM_DBG; - WHNAT_IO_WRITE32(wed, WED_DBG_CTRL, value); - - for (cr = WED_BMF_VALID_TABLE_START; cr <= WED_BMF_VALID_TABLE_END; - cr += 4) { - if (j % 4 == 0) - sprintf(str, "%08x:\t", cr); - - WHNAT_IO_READ32(wed, cr, &value); - - if (k < grp) { - for (i = 0; i < WED_TOKEN_STATUS_UNIT; i++) { - if (value & (1 << i)) - fcnt++; - } - } else if (k == grp) { - for (i = 0; i < tcnt; i++) { - if (value & (1 << i)) - fcnt++; - } - } - - k++; - sprintf(str + strlen(str), "%08x\t", value); - - if (j % 4 == 3) { - WHNAT_DBG(WHNAT_DBG_OFF, "%s\n", str); - memset(str, 0, sizeof(str)); - } - - j++; - } - - value = 0x14; - WHNAT_IO_WRITE32(wed, WED_DBG_CTRL, value); - WHNAT_IO_READ32(wed, WED_DBG_PRB1, &value); - WHNAT_DBG( - WHNAT_DBG_OFF, - "Total Free Cnt(%d), CR: Free Cnt(%d), Usage Cnt(%d),Pkt Cnt(%d)\n", - fcnt, ((value >> 16) & 0xffff), (value & 0xffff), - buf_res->pkt_num); - *cnt = ((value >> 16) & 0xffff); - /*Disable debug*/ - WHNAT_IO_WRITE32(wed, WED_DBG_CTRL, 0); -} - -/* -* -*/ -void whnat_hal_bfm_free(struct wed_entry *wed) -{ - unsigned int value; - unsigned int cr = 0; - unsigned int cnt = 0; - unsigned int grp = 0; - unsigned int i; - struct wed_buf_res *buf_res = &wed->res_ctrl.tx_ctrl.res; - /*PAUSE BUF MGMT*/ - WHNAT_IO_READ32(wed, WED_TX_BM_CTRL, &value); - value |= (1 << WED_TX_BM_CTRL_FLD_PAUSE); - WHNAT_IO_WRITE32(wed, WED_TX_BM_CTRL, value); - /*POLL status bit*/ - WHNAT_IO_READ32(wed, WED_ST, &value); - - while ((value & (0xff << WED_ST_FLD_TX_ST)) && cnt < WED_POLL_MAX) { - WHNAT_IO_READ32(wed, WED_ST, &value); - cnt++; - } - - /*Set SRAM enable*/ - value = 1 << WED_DBG_CTRL_FLD_TX_BM_MEM_DBG; - WHNAT_IO_WRITE32(wed, WED_DBG_CTRL, value); - grp = buf_res->pkt_num / WED_TOKEN_STATUS_UNIT; - cnt = buf_res->pkt_num % WED_TOKEN_STATUS_UNIT; - - for (i = 0; i < grp; i++) { - cr = WED_BMF_VALID_TABLE_START + 4 * i; - WHNAT_IO_WRITE32(wed, cr, 0xffffffff); - } - - value = 0; - cr += 4; - - for (i = 0; i < cnt; i++) - value |= (1 << cnt); - - WHNAT_IO_WRITE32(wed, cr, value); - /*Disable SRAM Mapping*/ - WHNAT_IO_WRITE32(wed, WED_DBG_CTRL, 0); - /*Disable PAUSE*/ - WHNAT_IO_READ32(wed, WED_TX_BM_CTRL, &value); - value &= ~(1 << WED_TX_BM_CTRL_FLD_PAUSE); - WHNAT_IO_WRITE32(wed, WED_TX_BM_CTRL, value); -} -#endif /*WED_HW_TX_SUPPORT*/ - -#ifdef WED_DYNAMIC_BM_SUPPORT -/* -* -*/ -void whnat_hal_bfm_update(struct wed_entry *wed, unsigned char reduce) -{ - struct wed_buf_res *res = &wed->res_ctrl.tx_ctrl.res; - struct wed_tx_ring_ctrl *ring_ctrl = &wed->res_ctrl.tx_ctrl.ring_ctrl; - unsigned int value = 0; - unsigned int vld_num = 0; - unsigned int reduce_grp = 0; - unsigned int cnt = 0; - /*PAUSE BUF MGMT*/ - WHNAT_IO_READ32(wed, WED_TX_BM_CTRL, &value); - value |= (1 << WED_TX_BM_CTRL_FLD_PAUSE); - vld_num = (value & WED_TX_BM_CTRL_FLD_VLD_GRP_NUM_MASK); - WHNAT_IO_WRITE32(wed, WED_TX_BM_CTRL, value); - /*POLL status bit*/ - WHNAT_IO_READ32(wed, WED_ST, &value); - - while ((value & (0xff << WED_ST_FLD_TX_ST)) && cnt < WED_POLL_MAX) { - WHNAT_IO_READ32(wed, WED_ST, &value); - cnt++; - } - - if (cnt == WED_POLL_MAX) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): can't poll tx buf status to clear!\n", - __func__); - goto end; - } - - /*check token can reduce or not*/ - if (reduce) { - reduce_grp = (res->pkt_num / WED_TOKEN_UNIT) - vld_num; - vld_num -= reduce_grp; - - if (vld_num > FREE_CR_SIZE) - WHNAT_IO_READ32(wed, WED_TX_BM_VB_FREE_32_63, &value); - else - WHNAT_IO_READ32(wed, WED_TX_BM_VB_FREE_0_31, &value); - - vld_num = (vld_num - 1) % FREE_CR_SIZE; - - if ((value & (1 << vld_num)) == 0) { - WHNAT_DBG( - WHNAT_DBG_ERR, - "%s(): reduce too much packet buffer, buffer still inused!\n", - __func__); - goto end; - } - } - - /*update token*/ - value = (1 << WED_TX_BM_CTRL_FLD_PAUSE); - value |= ((res->pkt_num / WED_TOKEN_UNIT) - << WED_TX_BM_CTRL_FLD_VLD_GRP_NUM); - value |= - ((ring_ctrl->ring_len / 256) << WED_TX_BM_CTRL_FLD_RSV_GRP_NUM); - WHNAT_IO_WRITE32(wed, WED_TX_BM_CTRL, value); - WHNAT_DBG(WHNAT_DBG_INF, "%s(): update packet buffer done!\n", - __func__); -end: - /*Disable PAUSE BUF MGMT*/ - WHNAT_IO_READ32(wed, WED_TX_BM_CTRL, &value); - value &= ~(1 << WED_TX_BM_CTRL_FLD_PAUSE); - WHNAT_IO_WRITE32(wed, WED_TX_BM_CTRL, value); -} -#endif /*WED_DYNAMIC_BM_SUPPORT*/ - -/* -* -*/ -static int reset_wed_tx_dma(struct wed_entry *wed, unsigned int reset_type) -{ -#ifdef WED_TX_SUPPORT - unsigned int value; - - WHNAT_IO_READ32(wed, WED_GLO_CFG, &value); - value &= ~(1 << WED_GLO_CFG_FLD_TX_DMA_EN); - WHNAT_IO_WRITE32(wed, WED_GLO_CFG, value); - - if (wed_agt_dis_ck(wed, WED_GLO_CFG, WED_GLO_CFG_FLD_TX_DMA_BUSY) < 0) - return -1; - - if (reset_type == WHNAT_RESET_IDX_ONLY) { - value = (1 << WED_RST_IDX_FLD_DTX_IDX0); - value |= (1 << WED_RST_IDX_FLD_DTX_IDX1); - WHNAT_IO_WRITE32(wed, WED_RST_IDX, value); - WHNAT_IO_WRITE32(wed, WED_RST_IDX, 0); - } else { - value = (1 << WED_MOD_RST_FLD_WED_TX_DMA); - WHNAT_RESET(wed, WED_MOD_RST, value); - } - -#endif /*WED_TX_SUPPORT*/ - return 0; -} - -/* -* -*/ -static int reset_wdma(struct wdma_entry *wdma) -{ - unsigned int value; - /*Stop Frame Engin WDMA*/ - WHNAT_IO_READ32(wdma, WDMA_GLO_CFG, &value); - value &= ~(1 << WDMA_GLO_CFG_RX_DMA_EN); - WHNAT_IO_WRITE32(wdma, WDMA_GLO_CFG, value); - - if (wdma_agt_dis_ck(wdma, WDMA_GLO_CFG, WDMA_GLO_CFG_RX_DMA_BUSY) < 0) - return -1; - - /*Reset Frame Engine WDMA DRX/CRX index*/ - value = 1 << WDMA_RST_IDX_RST_DRX_IDX0; - value |= 1 << WDMA_RST_IDX_RST_DRX_IDX1; - WHNAT_IO_WRITE32(wdma, WDMA_RST_IDX, value); - WHNAT_IO_WRITE32(wdma, WDMA_RST_IDX, 0); - WHNAT_IO_WRITE32(wdma, WDMA_RX_CRX_IDX_0, 0); - WHNAT_IO_WRITE32(wdma, WDMA_RX_CRX_IDX_1, 0); - return 0; -} - -/* -* -*/ -static int reset_wed_rx_drv(struct wed_entry *wed, unsigned int reset_type) -{ -#ifdef WED_HW_TX_SUPPORT - struct whnat_entry *whnat = (struct whnat_entry *)wed->whnat; - struct wdma_entry *wdma = &whnat->wdma; - unsigned int value; - /*Stop Frame Engin WDMA*/ - WHNAT_IO_READ32(wdma, WDMA_GLO_CFG, &value); - value &= ~(1 << WDMA_GLO_CFG_RX_DMA_EN); - WHNAT_IO_WRITE32(wdma, WDMA_GLO_CFG, value); - - if (wdma_agt_dis_ck(wdma, WDMA_GLO_CFG, WDMA_GLO_CFG_RX_DMA_BUSY) < 0) - return -1; - - /*Stop WED WDMA Rx Driver Engine*/ - WHNAT_IO_READ32(wed, WED_WDMA_GLO_CFG, &value); - value |= (1 << WED_WDMA_GLO_CFG_FLD_RX_DRV_DISABLE_FSM_AUTO_IDLE); - value &= ~(1 << WED_WDMA_GLO_CFG_FLD_RX_DRV_EN); -#ifdef WED_WORK_AROUND_WDMA_RETURN_IDLE - value |= (1 << WED_WDMA_GLO_CFG_FLD_FSM_RETURN_IDLE); -#endif /*WED_WORK_AROUND_WDMA_RETURN_IDLE*/ - WHNAT_IO_WRITE32(wed, WED_WDMA_GLO_CFG, value); - - if (wed_agt_dis_ck(wed, WED_WDMA_GLO_CFG, - WED_WDMA_GLO_CFG_FLD_RX_DRV_BUSY) < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): rx drv can't return idle state!\n", __func__); -#ifdef WED_WORK_AROUND_WDMA_RETURN_IDLE - value &= ~(1 << WED_WDMA_GLO_CFG_FLD_FSM_RETURN_IDLE); - WHNAT_IO_WRITE32(wed, WED_WDMA_GLO_CFG, value); -#endif /*WED_WORK_AROUND_WDMA_RETURN_IDLE*/ - return -1; - } - -#ifdef WED_WORK_AROUND_WDMA_RETURN_IDLE - value &= ~(1 << WED_WDMA_GLO_CFG_FLD_FSM_RETURN_IDLE); - WHNAT_IO_WRITE32(wed, WED_WDMA_GLO_CFG, value); -#endif /*WED_WORK_AROUND_WDMA_RETURN_IDLE*/ - /*Reset Frame Engine WDMA DRX/CRX index*/ - value = 1 << WDMA_RST_IDX_RST_DRX_IDX0; - value |= 1 << WDMA_RST_IDX_RST_DRX_IDX1; - WHNAT_IO_WRITE32(wdma, WDMA_RST_IDX, value); - WHNAT_IO_WRITE32(wdma, WDMA_RST_IDX, 0); - WHNAT_IO_WRITE32(wdma, WDMA_RX_CRX_IDX_0, 0); - WHNAT_IO_WRITE32(wdma, WDMA_RX_CRX_IDX_1, 0); - - /*Reset WED WDMA RX Driver Engin DRV/CRX index only*/ - if (reset_type == WHNAT_RESET_IDX_ONLY) { - value = (1 << WED_WDMA_RST_IDX_FLD_CRX_IDX0); - value |= (1 << WED_WDMA_RST_IDX_FLD_CRX_IDX1); - value |= (1 << WED_WDMA_RST_IDX_FLD_DRV_IDX0); - value |= (1 << WED_WDMA_RST_IDX_FLD_DRV_IDX1); - WHNAT_IO_WRITE32(wed, WED_WDMA_RST_IDX, value); - WHNAT_IO_WRITE32(wed, WED_WDMA_RST_IDX, 0); - WHNAT_IO_READ32(wed, WED_WDMA_GLO_CFG, &value); - value |= (1 << WED_WDMA_GLO_CFG_FLD_RST_INIT_COMPLETE_FLAG); - WHNAT_IO_WRITE32(wed, WED_WDMA_GLO_CFG, value); - value &= ~(1 << WED_WDMA_GLO_CFG_FLD_RST_INIT_COMPLETE_FLAG); - WHNAT_IO_WRITE32(wed, WED_WDMA_GLO_CFG, value); - } else { - /*Reset WDMA Interrupt Agent*/ - value &= ~(1 << WED_CTRL_FLD_WDMA_INT_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - - if (wed_agt_dis_ck(wed, WED_CTRL, - WED_CTRL_FLD_WDMA_INT_AGT_BUSY) < 0) - return -1; - - value = 1 << WED_MOD_RST_FLD_WDMA_INT_AGT; - WHNAT_RESET(wed, WED_MOD_RST, value); - /*Reset WED RX Driver Engin*/ - value = 1 << WED_MOD_RST_FLD_WDMA_RX_DRV; - WHNAT_RESET(wed, WED_MOD_RST, value); - } - -#endif /*WED_HW_TX_SUPPORT*/ - return 0; -} - -/* -* -*/ -static int reset_wed_tx_bm(struct wed_entry *wed) -{ -#ifdef WED_HW_TX_SUPPORT - unsigned int value; - unsigned int cnt = 0; - /*Tx Free Agent Reset*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value &= ~(1 << WED_CTRL_FLD_WED_TX_FREE_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - - if (wed_agt_dis_ck(wed, WED_CTRL, WED_CTRL_FLD_WED_TX_FREE_AGT_BUSY) < - 0) { - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): tx free agent reset faild!\n", - __func__); - return -1; - } - - WHNAT_IO_READ32(wed, WED_TX_BM_INTF, &value); - - while (((value >> 16) & 0xffff) != 0x40 && cnt < WED_POLL_MAX) { - WHNAT_IO_READ32(wed, WED_TX_BM_INTF, &value); - cnt++; - } - - if (cnt >= WED_POLL_MAX) { - WHNAT_DBG(WHNAT_DBG_OFF, - "%s(): tx free agent fifo reset faild!\n", __func__); - return -1; - } - - value = 1 << WED_MOD_RST_FLD_TX_FREE_AGT; - WHNAT_RESET(wed, WED_MOD_RST, value); - /*Reset TX Buffer manager*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value &= ~(1 << WED_CTRL_FLD_WED_TX_BM_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - - if (wed_agt_dis_ck(wed, WED_CTRL, WED_CTRL_FLD_WED_TX_BM_BUSY) < 0) { - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): tx bm reset faild!\n", - __func__); - return -1; - } - - value = 1 << WED_MOD_RST_FLD_TX_BM; - WHNAT_RESET(wed, WED_MOD_RST, value); -#endif /*WED_HW_TX_SUPPORT*/ - return 0; -} - -/* -* -*/ -static int reset_wed_tx_drv(struct wed_entry *wed, unsigned int reset_type) -{ -#ifdef WED_TX_SUPPORT - unsigned int value; - /*Disable TX driver*/ - WHNAT_IO_READ32(wed, WED_WPDMA_GLO_CFG, &value); - value &= ~(1 << WED_WPDMA_GLO_CFG_FLD_TX_DRV_EN); - WHNAT_IO_WRITE32(wed, WED_WPDMA_GLO_CFG, value); - - if (wed_agt_dis_ck(wed, WED_WPDMA_GLO_CFG, - WED_WPDMA_GLO_CFG_FLD_TX_DRV_BUSY) < 0) - return -1; - - if (reset_type == WHNAT_RESET_IDX_ONLY) { - /*Reset TX Ring only*/ - value = (1 << WED_WPDMA_RST_IDX_FLD_CTX_IDX0); - value |= (1 << WED_WPDMA_RST_IDX_FLD_CTX_IDX1); - WHNAT_IO_WRITE32(wed, WED_WPDMA_RST_IDX, value); - WHNAT_IO_WRITE32(wed, WED_WPDMA_RST_IDX, 0); - } else { - /*Reset TX Interrupt agent*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value &= ~(1 << WED_CTRL_FLD_WPDMA_INT_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - - if (wed_agt_dis_ck(wed, WED_CTRL, - WED_CTRL_FLD_WPDMA_INT_AGT_BUSY) < 0) - return -1; - - value = 1 << WED_MOD_RST_FLD_WPDMA_INT_AGT; - WHNAT_RESET(wed, WED_MOD_RST, value); - /*Reset Tx driver*/ - value = 1 << WED_MOD_RST_FLD_WPDMA_TX_DRV; - WHNAT_RESET(wed, WED_MOD_RST, value); - } - -#endif /*WED_TX_SUPPORT*/ - return 0; -} - -/* -* -*/ -static int reset_tx_traffic(struct wed_entry *wed, unsigned int reset_type) -{ - int ret = 0; - - ret = reset_wed_tx_dma(wed, reset_type); - - if (ret < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): wed_tx_dma reset fail,ret=%d\n", - __func__, ret); - return ret; - } - - ret = reset_wed_rx_drv(wed, reset_type); - - if (ret < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): wed_tx_drv reset fail,ret=%d\n", - __func__, ret); - return ret; - } - - ret = reset_wed_tx_bm(wed); - - if (ret < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): wed_tx_bm reset fail,ret=%d\n", - __func__, ret); - return ret; - } - - ret = reset_wed_tx_drv(wed, reset_type); - - if (ret < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, "%s(): wed_tx_drv reset fail,ret=%d\n", - __func__, ret); - return ret; - } - - return ret; -} - -/* -* -*/ -static int reset_rx_traffic(struct wed_entry *wed, unsigned int reset_type) -{ -#ifdef WED_RX_SUPPORT - unsigned int value; - /*disable WPDMA RX Driver Engine*/ - WHNAT_IO_READ32(wed, WED_WPDMA_GLO_CFG, &value); - value &= ~(1 << WED_WPDMA_GLO_CFG_FLD_RX_DRV_EN); - WHNAT_IO_WRITE32(wed, WED_WPDMA_GLO_CFG, value); - - if (wed_agt_dis_ck(wed, WED_WPDMA_GLO_CFG, - WED_WPDMA_GLO_CFG_FLD_RX_DRV_BUSY) < 0) - return -1; - - WHNAT_IO_READ32(wed, WED_GLO_CFG, &value); - value &= ~(1 << WED_GLO_CFG_FLD_RX_DMA_EN); - WHNAT_IO_WRITE32(wed, WED_GLO_CFG, value); - - if (wed_agt_dis_ck(wed, WED_GLO_CFG, WED_GLO_CFG_FLD_RX_DMA_BUSY) < 0) - return -1; - - if (reset_type == WHNAT_RESET_IDX_ONLY) { - value = (1 << WED_WPDMA_RST_IDX_FLD_CRX_IDX1); - WHNAT_IO_WRITE32(wed, WED_WPDMA_RST_IDX, value); - value = (1 << WED_RST_IDX_FLD_DRX_IDX1); - WHNAT_IO_WRITE32(wed, WED_RST_IDX, value); - WHNAT_IO_WRITE32(wed, WED_WPDMA_RST_IDX, 0); - WHNAT_IO_WRITE32(wed, WED_RST_IDX, 0); - WHNAT_IO_WRITE32(wed, WED_RX1_CTRL2, 0); - } else { - /*WPDMA interrupt agent*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value &= ~(1 << WED_CTRL_FLD_WPDMA_INT_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - - if (wed_agt_dis_ck(wed, WED_CTRL, - WED_CTRL_FLD_WPDMA_INT_AGT_BUSY) < 0) - return -1; - - value = (1 << WED_MOD_RST_FLD_WPDMA_INT_AGT); - WHNAT_RESET(wed, WED_MOD_RST, value); - /*WPDMA RX Driver Engin*/ - value = (1 << WED_MOD_RST_FLD_WPDMA_RX_DRV); - WHNAT_RESET(wed, WED_MOD_RST, value); - WHNAT_IO_WRITE32(wed, WED_RX1_CTRL2, 0); - } - -#endif /*WED_RX_SUPPORT*/ - return 0; -} - -/* -* -*/ -static void reset_all(struct whnat_entry *whnat) -{ - struct wed_entry *wed = &whnat->wed; - struct wdma_entry *wdma = &whnat->wdma; - unsigned int value; - /*Reset WDMA*/ - reset_wdma(wdma); - /*Reset WED*/ - value = 1 << WED_MOD_RST_FLD_WED; - WHNAT_RESET(wed, WED_MOD_RST, value); -} - -/* -* -*/ -static void restore_tx_traffic(struct wed_entry *wed) -{ - unsigned int value; - /*WPDMA*/ -#ifdef WED_TX_SUPPORT - /*Enable TX Driver*/ - WHNAT_IO_READ32(wed, WED_WPDMA_GLO_CFG, &value); - value |= (1 << WED_WPDMA_GLO_CFG_FLD_TX_DRV_EN); - WHNAT_IO_WRITE32(wed, WED_WPDMA_GLO_CFG, value); -#endif /*WED_TX_SUPPORT*/ - /*Enable TX interrupt agent*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value |= (1 << WED_CTRL_FLD_WPDMA_INT_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); -#ifdef WED_HW_TX_SUPPORT - /*TX BM*/ - /*Enable TX buffer mgnt*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value |= (1 << WED_CTRL_FLD_WED_TX_BM_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - WHNAT_IO_READ32(wed, WED_TX_BM_CTRL, &value); - value &= ~(1 << WED_TX_BM_CTRL_FLD_PAUSE); - WHNAT_IO_WRITE32(wed, WED_TX_BM_CTRL, value); - /*Enable TX free agent*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value |= (1 << WED_CTRL_FLD_WED_TX_FREE_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - /*WDMA*/ - { - struct whnat_entry *whnat = (struct whnat_entry *)wed->whnat; - struct wdma_entry *wdma = (struct wdma_entry *)&whnat->wdma; - /*Enable WDMA RX Driver*/ - WHNAT_IO_READ32(wed, WED_WDMA_GLO_CFG, &value); - value |= (1 << WED_WDMA_GLO_CFG_FLD_RX_DRV_EN); - WHNAT_IO_WRITE32(wed, WED_WDMA_GLO_CFG, value); - /*Enable WDMA RX DMA*/ - WHNAT_IO_READ32(wdma, WDMA_GLO_CFG, &value); - value |= (1 << WDMA_GLO_CFG_RX_DMA_EN); - WHNAT_IO_WRITE32(wdma, WDMA_GLO_CFG, value); - /*Enable WDMA interrupt agent*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value |= (1 << WED_CTRL_FLD_WDMA_INT_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); - /*Enable WED WDMA RX Engine*/ - WHNAT_IO_READ32(wed, WED_GLO_CFG, &value); - value |= (1 << WED_GLO_CFG_FLD_TX_DMA_EN); - WHNAT_IO_WRITE32(wed, WED_GLO_CFG, value); - } -#endif /*WED_HW_TX_SUPPORT*/ -} - -/* -* -*/ -static void restore_rx_traffic(struct wed_entry *wed) -{ -#ifdef WED_RX_SUPPORT - unsigned int value; - /*Enable WED RX DMA*/ - WHNAT_IO_READ32(wed, WED_GLO_CFG, &value); - value |= (1 << WED_GLO_CFG_FLD_RX_DMA_EN); - WHNAT_IO_WRITE32(wed, WED_GLO_CFG, value); - /*Enable WPDMA Rx Driver*/ - WHNAT_IO_READ32(wed, WED_WPDMA_GLO_CFG, &value); - value |= (1 << WED_WPDMA_GLO_CFG_FLD_RX_DRV_EN); - WHNAT_IO_WRITE32(wed, WED_WPDMA_GLO_CFG, value); - /*Enable WPDAM RX interrupt agent*/ - WHNAT_IO_READ32(wed, WED_CTRL, &value); - value |= (1 << WED_CTRL_FLD_WPDMA_INT_AGT_EN); - WHNAT_IO_WRITE32(wed, WED_CTRL, value); -#endif /*WED_RX_SUPPORT*/ -} - -/* -* -*/ -static void wed_ctr_intr_set(struct wed_entry *wed, unsigned char enable) -{ - unsigned int value = 0; - - WHNAT_IO_READ32(wed, WED_CTRL, &value); - - /*whnat extra interrupt*/ - if (enable) { - /*whnat interrupt agent*/ - value |= (1 << WED_CTRL_FLD_WPDMA_INT_AGT_EN); -#ifdef WED_HW_TX_SUPPORT - value |= (1 << WED_CTRL_FLD_WDMA_INT_AGT_EN); -#endif /*WED_HW_TX_SUPPORT*/ - } else { - value &= ~(1 << WED_CTRL_FLD_WPDMA_INT_AGT_EN); -#ifdef WED_HW_TX_SUPPORT - value &= ~(1 << WED_CTRL_FLD_WDMA_INT_AGT_EN); -#endif /*WED_HW_TX_SUPPORT*/ - } - - WHNAT_IO_WRITE32(wed, WED_CTRL, value); -#ifdef WED_DELAY_INT_SUPPORT - WHNAT_IO_WRITE32(wed, WED_DLY_INT_CFG, WED_DLY_INT_VALUE); -#endif /*WED_DELAY_INT_SUPPORT*/ -} - -/* -* -*/ -unsigned int whnat_wifi_cr_get(char type, unsigned int cr) -{ - unsigned int i = 0; - - while (cr_map_list[i].wifi_cr != 0) { - if ((cr_map_list[i].whnat_cr == cr) && - (cr_map_list[i].whnat_type == type)) - return cr_map_list[i].wifi_cr; - - i++; - } - - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): can't get wifi cr from whnat cr %x, type=%d\n", - __func__, cr, type); - return 0; -} - -/* -* -*/ -unsigned int whnat_cr_search(unsigned int cr) -{ - unsigned int i = 0; - - while (cr_map_list[i].wifi_cr != 0) { - if (cr_map_list[i].wifi_cr == cr) - return cr_map_list[i].whnat_cr; - - i++; - } - - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): can't get wifi cr from whnat cr %x\n", - __func__, cr); - return 0; -} - -/* -* assign tx descripton to hw cr -*/ -void whnat_hal_cr_handle(struct whnat_entry *entry, char type, char is_write, - unsigned long addr, unsigned int *cr_value) -{ - struct wed_entry *wed = &entry->wed; - struct wdma_entry *wdma = &entry->wdma; - struct wifi_entry *wifi = &entry->wifi; - - switch (type) { - case WHNAT_CR_WED: - if (is_write) - WHNAT_IO_WRITE32(wed, addr, *cr_value); - else - WHNAT_IO_READ32(wed, addr, cr_value); - - break; - - case WHNAT_CR_WDMA: - if (is_write) - WHNAT_IO_WRITE32(wdma, addr, *cr_value); - else - WHNAT_IO_READ32(wdma, addr, cr_value); - - break; - - case WHNAT_CR_WIFI: - if (is_write) - WHNAT_IO_WRITE32(wifi, addr, *cr_value); - else - WHNAT_IO_READ32(wifi, addr, cr_value); - - break; - - default: - break; - } -} - -/* -* -*/ -void whnat_hal_cr_mirror_set(struct whnat_entry *whnat, unsigned char enable) -{ - struct whnat_ctrl *ctrl = whnat_ctrl_get(); - struct whnat_hif_cfg *hif = &ctrl->hif_cfg; - struct wifi_entry *wifi = &whnat->wifi; - unsigned int value; - unsigned int cr; - - cr = (whnat->idx) ? PCIE1_MAP : PCIE0_MAP; - /*Disable CR mirror mode*/ - WHNAT_IO_READ32(hif, cr, &value); - value &= ~(0xfffff << PCIE_MAP_FLD_PCIE_ADDR_REMAP); - value |= ((wifi->wpdma_base & 0xfffff000)); - - if (enable) - value |= (1 << PCIE_MAP_FLD_PCIE_REMAP_EN); - else - value &= ~(1 << PCIE_MAP_FLD_PCIE_REMAP_EN); - - WHNAT_IO_WRITE32(hif, cr, value); -} - -/* -* interrupt control -*/ -void whnat_hal_int_ctrl(struct whnat_entry *entry, unsigned char enable) -{ - struct wed_entry *wed = &entry->wed; - struct wifi_entry *wifi = &entry->wifi; - unsigned int value = 0; - /*wed control cr set*/ - wed_ctr_intr_set(wed, enable); - /*pcie interrupt status trigger register*/ - WHNAT_IO_WRITE32(wed, WED_PCIE_INTS_TRIG, PCIE_INT_STA_OFFSET); - /*WPDMA interrupt triger*/ - value = 0; - - if (enable) { -#ifdef WED_RX_SUPPORT - value |= (1 << WED_WPDMA_INT_TRIG_FLD_RX_DONE_INT1); -#endif /*WED_RX_SUPPORT*/ -#ifdef WED_TX_SUPPORT - value |= (1 << WED_WPDMA_INT_TRIG_FLD_TX_DONE_INT0); - value |= (1 << WED_WPDMA_INT_TRIG_FLD_TX_DONE_INT1); -#endif /*WED_TX_SUPPORT*/ - } - - WHNAT_IO_WRITE32(wed, WED_WPDMA_INT_TRIG, value); - WHNAT_IO_READ32(wed, WED_WPDMA_INT_CTRL, &value); - value |= (1 << WED_WPDMA_INT_CTRL_FLD_SUBRT_ADV); - /*disable due to interrupr lost issue should not happen in ASIC*/ - /*value |= (1 << WED_WPDMA_INT_CTRL_FLD_MSK_ON_DLY);*/ - WHNAT_IO_WRITE32(wed, WED_WPDMA_INT_CTRL, value); -#ifdef WED_HW_TX_SUPPORT - { - struct wdma_entry *wdma = &entry->wdma; - /*WED_WDMA Interrupt agent */ - value = 0; - - if (enable) { - value |= (1 << WED_WDMA_INT_TRIG_FLD_RX_DONE0); - value |= (1 << WED_WDMA_INT_TRIG_FLD_RX_DONE1); - } - - WHNAT_IO_WRITE32(wed, WED_WDMA_INT_TRIG, value); - /*WED_WDMA_SRC SEL */ - WHNAT_IO_READ32(wed, WED_WDMA_INT_CTRL, &value); - /*setting for wdma_int0->wdma0, wdma_int1->wdma1*/ - value &= ~(WED_WDMA_INT_CTRL_FLD_POLL_SRC_SEL_MASK - << WED_WDMA_INT_CTRL_FLD_POLL_SRC_SEL); - WHNAT_IO_WRITE32(wed, WED_WDMA_INT_CTRL, value); - /*WDMA interrupt enable*/ - value = 0; - - if (enable) { - value |= (1 << WDMA_INT_MSK_RX_DONE_INT1); - value |= (1 << WDMA_INT_MSK_RX_DONE_INT0); - } - - WHNAT_IO_WRITE32(wdma, WDMA_INT_MSK, value); - WHNAT_IO_WRITE32(wdma, WDMA_INT_GRP2, value); - } -#endif /*WED_HW_TX_SUPPORT*/ - - if (enable) - WHNAT_IO_WRITE32(wifi, WIFI_INT_MSK, *wifi->int_mask); - else - WHNAT_IO_WRITE32(wifi, WIFI_INT_MSK, 0); -} - -/* -* -*/ -void whnat_hal_eint_init(struct whnat_entry *entry) -{ - struct wed_entry *wed = &entry->wed; - unsigned int value = 0; -#ifdef WED_DYNAMIC_BM_SUPPORT - value |= (1 << WED_EX_INT_STA_FLD_TX_FBUF_HTH); - value |= (1 << WED_EX_INT_STA_FLD_TX_FBUF_LTH); -#endif /*WED_DYNAMIC_BM_SUPPORT*/ - value |= (1 << WED_EX_INT_STA_FLD_TF_LEN_ERR); - value |= (1 << WED_EX_INT_STA_FLD_TF_TKID_WO_PYLD); -#ifdef WED_DYNAMIC_RX_BM_SUPPORT - value |= (1 << WED_EX_INT_STA_FLD_RX_FBUF_HTH); - value |= (1 << WED_EX_INT_STA_FLD_RX_FBUF_LTH); -#endif /*WED_DYNAMIC_RX_BM_SUPPORT*/ - value |= (1 << WED_EX_INT_STA_FLD_TX_DMA_W_RESP_ERR); - value |= (1 << WED_EX_INT_STA_FLD_TX_DMA_R_RESP_ERR); - value |= (1 << WED_EX_INT_STA_FLD_RX_DRV_INTI_WDMA_ENABLE); - value |= (1 << WED_EX_INT_STA_FLD_RX_DRV_COHERENT); - value |= (1 << WED_EX_INT_STA_FLD_RX_DRV_W_RESP_ERR); - value |= (1 << WED_EX_INT_STA_FLD_RX_DRV_R_RESP_ERR); - value |= (1 << WED_EX_INT_STA_FLD_TF_TKID_TITO_INVLD); -#ifdef WED_WDMA_RECYCLE - value |= (1 << WED_EX_INT_STA_FLD_RX_DRV_DMA_RECYCLE); -#endif /*WED_WDMA_RECYCLE*/ - wed->ext_int_mask = value; -} - -/* -* -*/ -void whnat_hal_eint_ctrl(struct whnat_entry *entry, unsigned char enable) -{ - struct wed_entry *wed = &entry->wed; - unsigned int value = 0; - - if (enable) - value = wed->ext_int_mask; - - WHNAT_IO_WRITE32(wed, WED_EX_INT_MSK, value); - WHNAT_IO_READ32(wed, WED_EX_INT_MSK, &value); -} - -/* -* -*/ -void whnat_hal_eint_stat_get(struct whnat_entry *entry, unsigned int *state) -{ - struct wed_entry *wed = &entry->wed; - /*read stat*/ - WHNAT_IO_READ32(wed, WED_EX_INT_STA, state); - /*write 1 clear*/ - WHNAT_IO_WRITE32(wed, WED_EX_INT_STA, *state); -} - -/* -* -*/ -void whnat_hal_dma_ctrl(struct whnat_entry *entry, unsigned char txrx) -{ - struct wed_entry *wed = &entry->wed; - - wed_dma_ctrl(wed, txrx); -} - -/* -* -*/ -void whnat_hal_wed_init(struct whnat_entry *entry) -{ - struct wed_entry *wed = &entry->wed; - unsigned int wed_wdma_cfg; -#ifdef WED_WDMA_RECYCLE - struct wdma_entry *wdma = &entry->wdma; - unsigned int value; - /*set wdma recycle threshold*/ - value = (WED_WDMA_RECYCLE_TIME & 0xffff) - << WED_WDMA_RX_THRES_CFG_FLD_WAIT_BM_CNT_MAX; - value |= (((wdma->res_ctrl.rx_ctrl.rx_ring_ctrl.ring_len - 3) & 0xfff) - << WED_WDMA_RX_THRES_CFG_FLD_DRX_CRX_DISTANCE_THRES); - WHNAT_IO_WRITE32(wed, WED_WDMA_RX0_THRES_CFG, value); - WHNAT_IO_WRITE32(wed, WED_WDMA_RX1_THRES_CFG, value); -#endif /*WED_WDMA_RECYCLE*/ - /*cfg wdma recycle*/ - WHNAT_IO_READ32(wed, WED_WDMA_GLO_CFG, &wed_wdma_cfg); - wed_wdma_cfg &= ~(WED_WDMA_GLO_CFG_FLD_WDMA_BT_SIZE_MASK - << WED_WDMA_GLO_CFG_FLD_WDMA_BT_SIZE); - wed_wdma_cfg &= - ~((1 << WED_WDMA_GLO_CFG_FLD_IDLE_STATE_DMAD_SUPPLY_EN) | - (1 << WED_WDMA_GLO_CFG_FLD_DYNAMIC_SKIP_DMAD_PREPARE) | - (1 << WED_WDMA_GLO_CFG_FLD_DYNAMIC_DMAD_RECYCLE)); - /*disable auto idle*/ - wed_wdma_cfg &= - ~(1 << WED_WDMA_GLO_CFG_FLD_RX_DRV_DISABLE_FSM_AUTO_IDLE); - /*Set to 16 DWORD for 64bytes*/ - wed_wdma_cfg |= (0x2 << WED_WDMA_GLO_CFG_FLD_WDMA_BT_SIZE); - /*enable skip state for fix dma busy issue*/ - wed_wdma_cfg |= ((1 << WED_WDMA_GLO_CFG_FLD_IDLE_STATE_DMAD_SUPPLY_EN) | - (1 << WED_WDMA_GLO_CFG_FLD_DYNAMIC_SKIP_DMAD_PREPARE)); -#ifdef WED_WDMA_RECYCLE - wed_wdma_cfg |= (1 << WED_WDMA_GLO_CFG_FLD_DYNAMIC_DMAD_RECYCLE) | - (1 << WED_WDMA_GLO_CFG_FLD_DYNAMIC_SKIP_DMAD_PREPARE) | - (1 << WED_WDMA_GLO_CFG_FLD_IDLE_STATE_DMAD_SUPPLY_EN); -#endif /*WED_WDMA_RECYCLE*/ -#ifdef WED_HW_TX_SUPPORT - WHNAT_IO_WRITE32(wed, WED_WDMA_GLO_CFG, wed_wdma_cfg); -#endif /*WED_HW_TX_SUPPORT*/ -} - -/* -* -*/ -int whnat_hal_io_read(void *cookie, unsigned int addr, unsigned int *value) -{ - struct whnat_entry *entry = whnat_entry_search(cookie); - struct wed_entry *wed; - unsigned int whnat_cr = 0; - - if (!entry) - return -1; - - wed = &entry->wed; - whnat_cr = whnat_cr_search(addr); - - if (whnat_cr == 0) - return -1; - - WHNAT_IO_READ32(wed, whnat_cr, value); - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): Read addr (%x)=%x\n", __func__, addr, - *value); - return 0; -} - -/* -* -*/ -int whnat_hal_io_write(void *cookie, unsigned int addr, unsigned int value) -{ - struct whnat_entry *entry = whnat_entry_search(cookie); - struct wed_entry *wed; - unsigned int whnat_cr = 0; - - if (!entry) - return -1; - - wed = &entry->wed; - whnat_cr = whnat_cr_search(addr); - - if (whnat_cr == 0) - return -1; - -#ifdef WED_DELAY_INT_SUPPORT - - if (whnat_cr == WED_INT_MSK) { - value &= ~((1 << WED_INT_MSK_FLD_TX_DONE_INT0) | - (1 << WED_INT_MSK_FLD_TX_DONE_INT1)); - value &= ~(1 << WED_INT_MSK_FLD_RX_DONE_INT1); - value |= (1 << WED_INT_MSK_FLD_TX_DLY_INT); - value |= (1 << WED_INT_MSK_FLD_RX_DLY_INT); - } - -#endif /*WED_DELAY_INT_SUPPORT*/ - WHNAT_IO_WRITE32(wed, whnat_cr, value); - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): Write addr (%x)=%x\n", __func__, addr, - value); - return 0; -} - -/* -* -*/ -void whnat_hal_wdma_init(struct whnat_entry *whnat) -{ - unsigned int value = 0; - struct wed_entry *wed = &whnat->wed; - /*Apply WDMA related setting*/ - wdma_dma_ctrl(&whnat->wdma, WHNAT_DMA_TXRX); - /*offset 0*/ - value = (whnat->idx) ? WDMA1_OFST0 : WDMA0_OFST0; - WHNAT_IO_WRITE32(wed, WED_WDMA_OFST0, value); - /*offset 1*/ - value = (whnat->idx) ? WDMA1_OFST1 : WDMA0_OFST1; - WHNAT_IO_WRITE32(wed, WED_WDMA_OFST1, value); -} - -/* -* -*/ -void whnat_hal_wdma_ring_init(struct whnat_entry *entry) -{ -#ifdef WED_HW_TX_SUPPORT - struct wdma_entry *wdma = &entry->wdma; - struct wed_entry *wed = &entry->wed; - struct wdma_rx_ring_ctrl *ring_ctrl = - &wdma->res_ctrl.rx_ctrl.rx_ring_ctrl; - struct whnat_ring *ring; - unsigned int offset; - int i; - - /*set PDMA & WED_WPDMA Ring, wifi driver will configure WDMA ring by whnat_hal_tx_ring_ctrl */ - /*tx ring*/ - for (i = 0; i < ring_ctrl->ring_num; i++) { - offset = i * WIFI_RING_OFFSET; - ring = &ring_ctrl->ring[i]; - WHNAT_DBG(WHNAT_DBG_INF, "%s(): configure ring %d setting\n", - __func__, i); - WHNAT_DBG(WHNAT_DBG_INF, - "%s(): wed:%p,wdma:%p: %x=%lx,%x=%d,%x=%d\n", - __func__, wed, wdma, ring->hw_desc_base, - (unsigned long)ring->cell[0].pkt_pa, - ring->hw_cnt_addr, ring_ctrl->ring_len, - ring->hw_cidx_addr, 0); - /*PDMA*/ - WHNAT_IO_WRITE32(wdma, ring->hw_desc_base, - ring->cell[0].alloc_pa); - WHNAT_IO_WRITE32(wdma, ring->hw_cnt_addr, ring_ctrl->ring_len); - WHNAT_IO_WRITE32(wdma, ring->hw_cidx_addr, 0); - /*WED_WPDMA*/ - WHNAT_IO_WRITE32(wed, WED_WDMA_RX0_BASE + offset, - ring->cell[0].alloc_pa); - WHNAT_IO_WRITE32(wed, WED_WDMA_RX0_CNT + offset, - ring_ctrl->ring_len); - } - -#endif /*WED_HW_TX_SUPPORT*/ -} - -/* -* -*/ -void whnat_hal_wpdma_ring_init(struct whnat_entry *entry) -{ -#ifdef WED_TX_SUPPORT - struct wifi_entry *wifi = &entry->wifi; - struct wed_entry *wed = &entry->wed; - struct wed_tx_ring_ctrl *ring_ctrl = &wed->res_ctrl.tx_ctrl.ring_ctrl; - struct whnat_ring *ring; - unsigned int offset = (WIFI_TX_RING0_BASE - WED_WPDMA_TX0_CTRL0); - int i; - - /*set PDMA & WED_WPDMA Ring, wifi driver will configure WDMA ring by whnat_hal_tx_ring_ctrl */ - for (i = 0; i < ring_ctrl->ring_num; i++) { - ring = &ring_ctrl->ring[i]; - WHNAT_DBG(WHNAT_DBG_INF, "%s(): configure ring %d setting\n", - __func__, i); - WHNAT_DBG(WHNAT_DBG_INF, - "%s(): wed:%p wifi:%p: %x=%lx,%x=%d,%x=%d\n", - __func__, wed, wifi, ring->hw_desc_base, - (unsigned long)ring->cell[0].alloc_pa, - ring->hw_cnt_addr, ring_ctrl->ring_len, - ring->hw_cidx_addr, 0); - /*WPDMA*/ - WHNAT_IO_WRITE32(wifi, ring->hw_desc_base, - ring->cell[0].alloc_pa); - WHNAT_IO_WRITE32(wifi, ring->hw_cnt_addr, ring_ctrl->ring_len); - WHNAT_IO_WRITE32(wifi, ring->hw_cidx_addr, 0); - /*WED_WPDMA*/ - WHNAT_IO_WRITE32(wed, (ring->hw_desc_base - offset), - ring->cell[0].alloc_pa); - WHNAT_IO_WRITE32(wed, (ring->hw_cnt_addr - offset), - ring_ctrl->ring_len); - WHNAT_IO_WRITE32(wed, (ring->hw_cidx_addr - offset), 0); - } - -#endif /*WED_TX_SUPPORT*/ -#ifdef WED_RX_SUPPORT - { - unsigned int value; - struct wed_entry *wed = &entry->wed; - struct wifi_entry *wifi = &entry->wifi; - /*Rx Ring base */ - WHNAT_IO_READ32(wed, WED_RX1_CTRL0, &value); - WHNAT_IO_WRITE32(wed, WED_WPDMA_RX1_CTRL0, value); - WHNAT_IO_WRITE32(wifi, WIFI_RX_RING1_BASE, value); - /*Rx CNT*/ - WHNAT_IO_READ32(wed, WED_RX1_CTRL1, &value); - WHNAT_IO_WRITE32(wed, WED_WPDMA_RX1_CTRL1, value); - WHNAT_IO_WRITE32(wifi, WIFI_RX_RING1_CNT, value); - /*cpu idx*/ - WHNAT_IO_READ32(wed, WED_RX1_CTRL2, &value); - WHNAT_IO_WRITE32(wed, WED_WPDMA_RX1_CTRL2, value); - WHNAT_IO_WRITE32(wifi, WIFI_RX_RING1_CIDX, value); - } -#endif /*WED_RX_SUPPORT*/ -#ifdef WED_HW_TX_SUPPORT - /*initial buf mgmt setting*/ - whnat_hal_bfm_init(entry); -#endif /*WED_HW_TX_SUPPORT*/ -} - -/* -* -*/ -void whnat_hal_hif_init(struct whnat_hif_cfg *hif) -{ - unsigned int v1 = 0; - unsigned int v2 = 0; - /*debug only*/ - WHNAT_IO_READ32(hif, WED0_MAP, &v1); - WHNAT_IO_READ32(hif, WED1_MAP, &v2); - WHNAT_DBG(WHNAT_DBG_INF, "%s(): WED0_MAP: %x,WED1_MAP:%x\n", __func__, - v1, v2); - /*default remap pcie0 to wed0*/ - v1 = hif->wpdma_base[0] & 0xfffff000; - v1 &= ~(1 << PCIE_MAP_FLD_PCIE_REMAP_EN); - v1 &= ~(1 << PCIE_MAP_FLD_PCIE_REMAP); - /*default remap pcie1 to wed1*/ - v2 = hif->wpdma_base[1] & 0xfffff000; - v2 &= ~(1 << PCIE_MAP_FLD_PCIE_REMAP_EN); - v2 |= (1 << PCIE_MAP_FLD_PCIE_REMAP); - WHNAT_DBG(WHNAT_DBG_INF, "%s(): PCIE0_MAP: %x,PCIE1_MAP:%x\n", __func__, - v1, v2); - WHNAT_IO_WRITE32(hif, PCIE0_MAP, v1); - WHNAT_IO_WRITE32(hif, PCIE1_MAP, v2); -} - -/* -* -*/ -void whnat_hal_trace_set(struct whnat_cputracer *tracer) -{ - unsigned int value = 0; - /*enable cpu tracer*/ - WHNAT_IO_WRITE32(tracer, CPU_TRACER_WP_ADDR, tracer->trace_addr); - WHNAT_IO_WRITE32(tracer, CPU_TRACER_WP_ADDR, tracer->trace_mask); - - if (tracer->trace_en) { - value = (1 << CPU_TRACER_CON_BUS_DBG_EN) | - (1 << CPU_TRACER_CON_WP_EN) | - (1 << CPU_TRACER_CON_IRQ_WP_EN); - } - - WHNAT_IO_WRITE32(tracer, CPU_TRACER_CFG, value); -} - -/* -* -*/ -int whnat_hal_hw_reset(struct whnat_entry *whnat, unsigned int reset_type) -{ - struct wed_entry *wed = &whnat->wed; - int ret = 0; - - switch (reset_type) { - case WHNAT_RESET_IDX_ONLY: - case WHNAT_RESET_IDX_MODULE: - ret = reset_tx_traffic(wed, reset_type); - - if (ret < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): wed_tx reset fail,ret=%d\n", __func__, - ret); - return ret; - } - - ret = reset_rx_traffic(wed, reset_type); - - if (ret < 0) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): wed_rx reset fail,ret=%d\n", __func__, - ret); - return ret; - } - - break; - - case WHNAT_RESET_ALL: - reset_all(whnat); - break; - } - - return ret; -} - -/* -* -*/ -void whnat_hal_hw_restore(struct whnat_entry *whnat) -{ - struct wed_entry *wed = &whnat->wed; - - restore_rx_traffic(wed); - restore_tx_traffic(wed); -} - -/* -* -*/ -void whnat_hal_pcie_map(struct whnat_entry *whnat) -{ - struct whnat_ctrl *ctrl = whnat_ctrl_get(); - struct wed_entry *wed = &whnat->wed; - struct wifi_entry *wifi = &whnat->wifi; - unsigned int value = ctrl->hif_cfg.pcie_base[whnat->idx]; - - WHNAT_IO_WRITE32(wed, WED_PCIE_CFG_BASE, value); - /*pcie interrupt agent control*/ -#ifdef WED_WORK_AROUND_INT_POLL - value = (PCIE_POLL_MODE_ALWAYS << WED_PCIE_INT_CTRL_FLD_POLL_EN); - WHNAT_IO_WRITE32(wed, WED_PCIE_INT_CTRL, value); -#endif /*WED_WORK_AROUND_INT_POLL*/ - value = wifi->wpdma_base; - WHNAT_IO_WRITE32(wed, WED_WPDMA_CFG_BASE, value); -} - -/* -* -*/ -void whnat_hal_pdma_mask_set(struct whnat_entry *whnat) -{ - struct wed_entry *wed = &whnat->wed; - - WHNAT_IO_WRITE32(wed, WED_WPDMA_INT_MSK, WIFI_IMR_VAL); -} - -#ifdef ERR_RECOVERY -/* -* -*/ -void whnat_hal_ser_trigger(struct whnat_entry *whnat) -{ - struct wifi_entry *wifi = &whnat->wifi; - WHNAT_IO_WRITE32(wifi, WIFI_MCU_INT_EVENT, WIFI_TRIGGER_SER); -} - -/* -* -*/ -void whnat_hal_ser_update(struct wed_entry *wed, struct wed_ser_state *state) -{ - /*WED_TX_DMA*/ - WHNAT_IO_READ32(wed, WED_ST, &state->tx_dma_stat); - state->tx_dma_stat = (state->tx_dma_stat >> WED_ST_FLD_TX_ST) & 0xff; - WHNAT_IO_READ32(wed, WED_TX0_MIB, &state->tx0_mib); - WHNAT_IO_READ32(wed, WED_TX1_MIB, &state->tx1_mib); - WHNAT_IO_READ32(wed, WED_TX0_CTRL2, &state->tx0_cidx); - WHNAT_IO_READ32(wed, WED_TX1_CTRL2, &state->tx1_cidx); - WHNAT_IO_READ32(wed, WED_TX0_CTRL3, &state->tx0_didx); - WHNAT_IO_READ32(wed, WED_TX1_CTRL3, &state->tx1_didx); - /*WED_WDMA*/ - WHNAT_IO_READ32(wed, WED_WDMA_ST, &state->wdma_stat); - state->wdma_stat = state->wdma_stat & 0xff; - WHNAT_IO_READ32(wed, WED_WDMA_RX0_MIB, &state->wdma_rx0_mib); - WHNAT_IO_READ32(wed, WED_WDMA_RX1_MIB, &state->wdma_rx1_mib); - WHNAT_IO_READ32(wed, WED_WDMA_RX0_RECYCLE_MIB, - &state->wdma_rx0_recycle_mib); - WHNAT_IO_READ32(wed, WED_WDMA_RX1_RECYCLE_MIB, - &state->wdma_rx1_recycle_mib); - /*WED_WPDMA*/ - WHNAT_IO_READ32(wed, WED_WPDMA_ST, &state->wpdma_stat); - state->wpdma_stat = - (state->wpdma_stat >> WED_WPDMA_ST_FLD_TX_DRV_ST) & 0xff; - WHNAT_IO_READ32(wed, WED_WPDMA_TX0_MIB, &state->wpdma_tx0_mib); - WHNAT_IO_READ32(wed, WED_WPDMA_TX1_MIB, &state->wpdma_tx1_mib); - /*WED_BM*/ - WHNAT_IO_READ32(wed, WED_TX_BM_STS, &state->bm_tx_stat); - state->bm_tx_stat = state->bm_tx_stat & 0xffff; - WHNAT_IO_READ32(wed, WED_TX_FREE_TO_TX_BM_TKID_MIB, - &state->txfree_to_bm_mib); - WHNAT_IO_READ32(wed, WED_TX_BM_TO_WDMA_RX_DRV_TKID_MIB, - &state->txbm_to_wdma_mib); - return; -} -#endif /*ERR_RECOVERY*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hw.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hw.h deleted file mode 100644 index 23e14beecf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_hw.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - whnat_hw.h -*/ - -#ifndef _WHNAT_HW_H -#define _WHNAT_HW_H - -struct whnat_entry; -struct wed_entry; -struct whnat_hif_cfg; -struct whnat_cputracer; -#ifdef ERR_RECOVERY -struct wed_ser_state; -#endif /*ERR_RECOVERY*/ - -#define DMADONE_DONE 1 -#define WED_POLL_MAX 100 - -#define PCIE_INT_STA_OFFSET (1 << 16) -#define PCIE_POLL_MODE_ASSERT 1 -#define PCIE_POLL_MODE_ALWAYS 2 -#define FREE_CR_SIZE (sizeof(unsigned int)) - -enum { WHNAT_DMA_DISABLE, WHNAT_DMA_TX, WHNAT_DMA_RX, WHNAT_DMA_TXRX }; - -enum { - WHNAT_RESET_IDX_ONLY, - WHNAT_RESET_IDX_MODULE, - WHNAT_RESET_ALL, -}; - -void whnat_hal_int_ctrl(struct whnat_entry *whnat, unsigned char enable); -void whnat_hal_eint_ctrl(struct whnat_entry *whnat, unsigned char enable); -void whnat_hal_eint_init(struct whnat_entry *entry); -void whnat_hal_eint_stat_get(struct whnat_entry *whnat, unsigned int *state); -void whnat_hal_wdma_init(struct whnat_entry *whnat); -void whnat_hal_wdma_ring_init(struct whnat_entry *whnat); -void whnat_hal_wpdma_ring_init(struct whnat_entry *whnat); -void whnat_hal_dma_ctrl(struct whnat_entry *whnat, unsigned char txrx); -void whnat_hal_hif_init(struct whnat_hif_cfg *hif); -void whnat_hal_trace_set(struct whnat_cputracer *tracer); -void whnat_hal_bfm_update(struct wed_entry *wed, unsigned char reduce); -void whnat_hal_bfm_freecnt(struct wed_entry *wed, unsigned int *cnt); -int whnat_hal_tx_reset(struct wed_entry *wed, unsigned int reset_type); -int whnat_hal_rx_reset(struct wed_entry *wed, unsigned int reset_type); -void whnat_hal_cr_mirror_set(struct whnat_entry *whnat, unsigned char enable); -void whnat_hal_pcie_map(struct whnat_entry *whnat); -void whnat_hal_hw_restore(struct whnat_entry *whnat); -int whnat_hal_hw_reset(struct whnat_entry *whnat, unsigned int reset_type); -void whnat_hal_wed_init(struct whnat_entry *entry); -unsigned int whnat_wifi_cr_get(char type, unsigned int cr); -void whnat_hal_pdma_mask_set(struct whnat_entry *whnat); -#ifdef ERR_RECOVERY -void whnat_hal_ser_trigger(struct whnat_entry *whnat); -void whnat_hal_ser_update(struct wed_entry *wed, struct wed_ser_state *state); -#endif /*ERR_RECOVERY*/ - -int whnat_hal_io_read(void *cookie, unsigned int addr, unsigned int *value); - -int whnat_hal_io_write(void *cookie, unsigned int addr, unsigned int value); - -void whnat_hal_cr_handle(struct whnat_entry *entry, char type, char is_write, - unsigned long addr, unsigned int *cr_value); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_main.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_main.c deleted file mode 100644 index 963a25e9cc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_main.c +++ /dev/null @@ -1,900 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: whnat - whnat.c -*/ - -/*Main module of WHNAT, use to for register hook function and probe for wifi chip*/ - -#include -#include - -#include "woe.h" -#include "wed_def.h" - -/* - * Defination -*/ -#define DRIVER_DESC "Register for MTK WIFI-to-Eth Offload Engain " -#define WHNAT_PLATFORM_DEV_NAME "whnat_dev" - -static struct whnat_ctrl sys_wc; - -/* -* -*/ - -static const struct of_device_id whnat_of_ids[] = { - { - .compatible = "mediatek,wed", - }, - { - .compatible = "mediatek,wed2", - }, - {}, -}; - -/*whnat support list write here*/ -static const unsigned int whnat_support_list[] = { 0x7615, 0 }; - -/*local function*/ -/* -* -*/ -static unsigned char whnat_cap_support(void *cookie) -{ - unsigned int i = 0; - unsigned int chip_id; - - chip_id = wifi_chip_id_get(cookie); - - while (whnat_support_list[i] != 0) { - if (chip_id == whnat_support_list[i]) { - WHNAT_DBG(WHNAT_DBG_OFF, - "%s(): chip_id=%x is in WHNAT support list\n", - __func__, chip_id); - return 1; - } - - i++; - } - - return 0; -} - -/* -* -*/ -static struct whnat_entry *whnat_entry_acquire(void *cookie) -{ - int i; - unsigned int slot_id; - struct whnat_ctrl *wc = whnat_ctrl_get(); - struct whnat_entry *entry = NULL; - /*search by slot*/ - slot_id = wifi_slot_get(cookie); - - /*check is acquired or not*/ - for (i = 0; i < wc->whnat_num; i++) { - entry = &wc->entry[i]; - if (entry->slot_id == slot_id) { - entry->wifi.cookie = cookie; - WHNAT_DBG( - WHNAT_DBG_OFF, - "%s(): PCIE SLOT:%d, hook to WHNAT,entry id=%d\n", - __func__, i, entry->idx); - return entry; - } - } - - return NULL; -} - -/* -* -*/ -static void whnat_entry_release(struct whnat_entry *whnat) -{ - whnat->wifi.cookie = NULL; - memset(&whnat->pdriver, 0, sizeof(whnat->pdriver)); -} - -/* -* -*/ -static struct whnat_entry *whnat_entry_acquire_for_pdev(void *pdev) -{ - unsigned char i; - struct whnat_ctrl *wc = whnat_ctrl_get(); - struct whnat_entry *entry; - - for (i = 0; i < wc->whnat_num; i++) { - entry = &wc->entry[i]; - - if (entry->pdev == NULL && entry->pdriver.probe != NULL) { - entry->pdev = pdev; - return &wc->entry[i]; - } - } - - return NULL; -} - -/* -* -*/ -static struct whnat_entry *whnat_entry_get_for_pdev(void *pdev) -{ - unsigned char i; - struct whnat_ctrl *wc = whnat_ctrl_get(); - struct whnat_entry *entry; - - for (i = 0; i < wc->whnat_num; i++) { - entry = &wc->entry[i]; - - if (entry->pdev == pdev) - return &wc->entry[i]; - } - - return NULL; -} - -/* -* -*/ -static void whnat_entry_release_pdev(struct whnat_entry *whnat) -{ - whnat->pdev = NULL; -} - -/* -* -*/ -static int whnat_probe(struct platform_device *pdev) -{ - struct whnat_entry *whnat; - struct wed_entry *wed; - struct wdma_entry *wdma; - struct wifi_entry *wifi; - - whnat = whnat_entry_acquire_for_pdev(pdev); - - if (whnat == NULL) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): probe fail since whnat is full!\n", __func__); - return -1; - } - - /*pre-allocate wifi information*/ - wifi = &whnat->wifi; - wifi_cap_get(wifi); - /*initial wed entry */ - wed = &whnat->wed; - wed->whnat = whnat; - wed_init(pdev, whnat->idx, wed); - wed_entry_proc_init(whnat, wed); - /*initial wdma entry*/ - wdma = &whnat->wdma; - wdma->whnat = whnat; - wdma_init(pdev, whnat->idx, wdma); - wdma_entry_proc_init(whnat, wdma); - /*wifi chip related setting*/ - wifi_chip_probe(wifi, wed->irq); - /*after wifi probe should write wpdma mask to wed*/ - whnat_hal_pdma_mask_set(whnat); - /*pcie mapping*/ - whnat_hal_pcie_map(whnat); - WHNAT_DBG(WHNAT_DBG_INF, "%s(): platform device probe is done\n", - __func__); - return 0; -} - -/* -* -*/ -static int whnat_remove(struct platform_device *pdev) -{ - struct whnat_entry *whnat; - struct wed_entry *wed; - struct wdma_entry *wdma; - struct wifi_entry *wifi; - - whnat = whnat_entry_get_for_pdev(pdev); - - if (whnat == NULL) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): remove faild since can't find whnat entry!\n", - __func__); - return -1; - } - - wed = &whnat->wed; - wdma = &whnat->wdma; - wifi = &whnat->wifi; - /*remove wifi related setting*/ - wifi_chip_remove(wifi); - /*remove wdma related setting*/ - wdma_entry_proc_exit(whnat, wdma); - wdma_exit(pdev, wdma); - /*remove wed related setting*/ - wed_entry_proc_exit(whnat, wed); - wed_exit(pdev, wed); - /*reomve whnat entry from whnat_ctrl*/ - whnat_entry_release_pdev(whnat); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): whnat remove done!!\n", __func__); - return 0; -} - -/* -* -*/ -static int whnat_driver_init(void *cookie) -{ - struct platform_driver *pdriver; - struct whnat_entry *entry; - char name[MAX_NAME_SIZE] = ""; - struct whnat_ctrl *wc = whnat_ctrl_get(); - - if (!whnat_cap_support(cookie)) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): chip not support wifi hardware nat feature\n", - __func__); - goto err; - } - - if (!wifi_whnat_en_get(cookie)) { - WHNAT_DBG(WHNAT_DBG_OFF, - "%s(): chip not enable wifi hardware nat feature!\n", - __func__); - goto err; - } - - entry = whnat_entry_acquire(cookie); - - if (!entry) { - WHNAT_DBG( - WHNAT_DBG_OFF, - "%s(): can't acquire a new whnat entry since full! cookie=%p\n", - __func__, cookie); - goto err; - } - - snprintf(name, sizeof(name), "%s%d", WHNAT_PLATFORM_DEV_NAME, - wc->whnat_driver_idx++); - pdriver = &entry->pdriver; - pdriver->probe = whnat_probe; - pdriver->remove = whnat_remove; - pdriver->driver.name = name; - pdriver->driver.owner = THIS_MODULE; - pdriver->driver.of_match_table = whnat_of_ids; - whnat_entry_proc_init(wc, entry); - return platform_driver_register(pdriver); -err: - wifi_whnat_en_set(cookie, FALSE); - return -1; -} - -/* -* -*/ -static void whnat_driver_exit(void *cookie) -{ - struct whnat_entry *whnat; - struct whnat_ctrl *wc = whnat_ctrl_get(); - - whnat = whnat_entry_search(cookie); - - if (!whnat) - return; - - platform_driver_unregister(&whnat->pdriver); - whnat_entry_release(whnat); - whnat_entry_proc_exit(wc, whnat); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): whnat entry clear done!!\n", __func__); -} - -/* -* -*/ -static int whnat_entry_init(struct whnat_entry *whnat, unsigned int idx) -{ - struct whnat_cfg *cfg = &whnat->cfg; - - whnat->idx = idx; - whnat->wifi.cookie = NULL; - whnat->wifi.base_addr = 0; - whnat->pdev = NULL; - whnat->slot_id = wed_slot_map_get(idx); - memset(cfg, 0, sizeof(*cfg)); - cfg->hw_tx_en = CFG_HW_TX_SUPPORT; - cfg->cr_mirror_en = CFG_CR_MIRROR_SUPPORT; - return 0; -} - -/* -* -*/ -static void whnat_entry_exit(struct whnat_entry *whnat) -{ - if (whnat->wifi.cookie) - whnat_driver_exit(whnat->wifi.cookie); -} - -/* -* -*/ -static int whnat_ctrl_init(struct whnat_ctrl *wc) -{ - unsigned char num = wed_num_get(); - unsigned char i; - unsigned int size; - - wc->whnat_num = num; - wc->whnat_driver_idx = 0; - size = sizeof(struct whnat_entry) * num; - wc->entry = kmalloc(size, GFP_KERNEL); - memset(wc->entry, 0, size); - - if (!wc->entry) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): allocate whnat control entry faild!\n", - __func__); - return -1; - } - - memset(wc->entry, 0, size); - - for (i = 0; i < num; i++) - whnat_entry_init(&wc->entry[i], i); - - return 0; -} - -/* -* -*/ -static void whnat_ctrl_exit(struct whnat_ctrl *wc) -{ - unsigned char num = wed_num_get(); - unsigned char i; - - wc->whnat_num = num; - - for (i = 0; i < num; i++) - whnat_entry_exit(&wc->entry[i]); - - kfree(wc->entry); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): whnat entry free done!!\n", __func__); -} - -/*hook handler*/ -/* -* -*/ -static int whnat_ring_init(void *cookie) -{ - struct whnat_entry *whnat; - - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): cookie=%p\n", __func__, cookie); - whnat = whnat_entry_search(cookie); - - if (!whnat) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): whnat can't find for cookie:%p\n", __func__, - cookie); - return -1; - } - - WHNAT_DBG(WHNAT_DBG_INF, "%s(): set whnat %p hw setting,idx=%d\n", - __func__, whnat, whnat->idx); - /*initial wed*/ - whnat_hal_wed_init(whnat); - /*initial wdma*/ - whnat_hal_wdma_init(whnat); - /*hw setting for wdma enable*/ - whnat_hal_wdma_ring_init(whnat); - /*hw setting for wed enable*/ - whnat_hal_wpdma_ring_init(whnat); - /*enable wed interrupt*/ - whnat_hal_int_ctrl(whnat, TRUE); - /*enable wed ext interrupt*/ - whnat_hal_eint_init(whnat); - whnat_hal_eint_ctrl(whnat, TRUE); - - /*enable HW CR mirror or not*/ - if (whnat->cfg.cr_mirror_en) { - wifi_chip_cr_mirror_set(&whnat->wifi, TRUE); - whnat_hal_cr_mirror_set(whnat, TRUE); - } - - return 0; -} - -/* -* -*/ -static void whnat_ring_exit(void *cookie) -{ - struct whnat_entry *whnat; - - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): cookie=%p\n", __func__, cookie); - whnat = whnat_entry_search(cookie); - - if (!whnat) { - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): whnat can't find for cookie:%p\n", __func__, - cookie); - return; - } - - if (whnat->cfg.cr_mirror_en) { - wifi_chip_cr_mirror_set(&whnat->wifi, FALSE); - whnat_hal_cr_mirror_set(whnat, FALSE); - } - - /*flush all hw path*/ - wifi_tx_tuple_reset(); - /*Reset Ring and HW setting*/ - whnat_hal_dma_ctrl(whnat, WHNAT_DMA_DISABLE); - whnat_hal_eint_ctrl(whnat, FALSE); - whnat_hal_int_ctrl(whnat, FALSE); - whnat_hal_hw_reset(whnat, WHNAT_RESET_ALL); -} - -/* -* -*/ -static void whnat_wlan_tx(void *cookie, UCHAR *tx_info) -{ - struct whnat_entry *whnat; - - WHNAT_DBG(WHNAT_DBG_INF, "%s(): cookie=%p\n", __func__, cookie); - whnat = whnat_entry_search(cookie); - - if (!whnat) - return; - - if (wifi_hw_tx_allow(cookie, tx_info) == FALSE) - return; - -#ifdef WED_HW_TX_SUPPORT - wifi_tx_tuple_add(whnat, tx_info); -#endif /*WED_HW_TX_SUPPORT*/ -} - -/* -* -*/ -static void whnat_isr_handler(void *cookie) -{ - struct whnat_entry *entry; - unsigned int status = 0; - - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): cookie=%p\n", __func__, cookie); - entry = whnat_entry_search(cookie); - - if (!entry) - return; - - whnat_hal_eint_ctrl(entry, FALSE); - whnat_hal_eint_stat_get(entry, &status); - wed_eint_handle(&entry->wed, status); - whnat_hal_eint_ctrl(entry, TRUE); -} - -/* -* -*/ -static void whnat_dma_handler(void *cookie, int *dma_info) -{ - struct whnat_entry *entry; - unsigned char dma_cfg; - - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): cookie=%p\n", __func__, cookie); - entry = whnat_entry_search(cookie); - - if (!entry) - return; - - wifi_dma_cfg_wrapper(*dma_info, &dma_cfg); - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): Set DMA =%d\n", __func__, dma_cfg); - whnat_hal_dma_ctrl(entry, dma_cfg); -} - -/* -* -*/ -static void whnat_ser_handler(void *cookie, void *ser_ctrl) -{ -#ifdef ERR_RECOVERY - struct whnat_entry *entry; - - WHNAT_DBG(WHNAT_DBG_LOU, "%s(): cookie=%p\n", __func__, cookie); - entry = whnat_entry_search(cookie); - - if (!entry) - return; - - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): status=%d\n", __func__, - wifi_ser_status(ser_ctrl)); - - switch (wifi_ser_status(ser_ctrl)) { - case WIFI_ERR_RECOV_STOP_IDLE: { - if (entry->cfg.cr_mirror_en) { - wifi_chip_cr_mirror_set(&entry->wifi, FALSE); - whnat_hal_cr_mirror_set(entry, FALSE); - } - - whnat_hal_eint_ctrl(entry, FALSE); - whnat_hal_int_ctrl(entry, FALSE); - } break; - - case WIFI_ERR_RECOV_STOP_IDLE_DONE: { - whnat_hal_int_ctrl(entry, TRUE); - } break; - - case WIFI_ERR_RECOV_STOP_PDMA0: { - /*flush all hw path*/ - wifi_tx_tuple_reset(); - wed_ring_reset(&entry->wed); - - /*Reset TX path first*/ - if (whnat_hal_hw_reset(entry, WHNAT_RESET_IDX_ONLY) < 0) { - WHNAT_DBG( - WHNAT_DBG_INF, - "%s(): Reset index faild, change to reset module!\n", - __func__); - whnat_hal_hw_reset(entry, WHNAT_RESET_IDX_MODULE); - } - } break; - - case WIFI_ERR_RECOV_RESET_PDMA0: - default: - WHNAT_DBG(WHNAT_DBG_INF, "%s(): status=%d, do nothing\n", - __func__, wifi_ser_status(ser_ctrl)); - break; - } - -#endif /*ERR_RECOVERY*/ -} -/* -* -*/ -static unsigned int whnat_handle(unsigned short hook, void *ad, void *priv) -{ - switch (hook) { - case WLAN_HOOK_HIF_INIT: - whnat_ring_init(ad); - break; - - case WLAN_HOOK_HIF_EXIT: - whnat_ring_exit(ad); - break; - - case WLAN_HOOK_TX: - whnat_wlan_tx(ad, priv); - break; - - case WLAN_HOOK_SYS_UP: - whnat_driver_init(ad); - break; - - case WLAN_HOOK_SYS_DOWN: - whnat_driver_exit(ad); - break; - - case WLAN_HOOK_ISR: - whnat_isr_handler(ad); - break; - - case WLAN_HOOK_DMA_SET: - whnat_dma_handler(ad, priv); - break; - - case WLAN_HOOK_SER: - whnat_ser_handler(ad, priv); - break; - - default: - WHNAT_DBG(WHNAT_DBG_ERR, - "%s(): can't find whnat handle (hook: %u)\n", - __func__, hook); - break; - } - - return 0; -} - -/*global function*/ -/* -* -*/ -void whnat_proc_handle(struct whnat_entry *entry) -{ - WHNAT_DBG(WHNAT_DBG_OFF, "Idx\t: %d\n", entry->idx); - WHNAT_DBG(WHNAT_DBG_OFF, "Cookie\t: %p\n", entry->wifi.cookie); - WHNAT_DBG(WHNAT_DBG_OFF, "WIFI base\t: %lx\n", entry->wifi.base_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "Pdev\t: %p\n", entry->pdev); - WHNAT_DBG(WHNAT_DBG_OFF, "Pdriver\t: %p\n", &entry->pdriver); - WHNAT_DBG(WHNAT_DBG_OFF, "wdma\t: %p\n", &entry->wdma); - WHNAT_DBG(WHNAT_DBG_OFF, "wed\t: %p\n", &entry->wed); - WHNAT_DBG(WHNAT_DBG_OFF, "log_evel\t: %d\n", whnat_log_get()); -} - -/* -* -*/ -void whnat_dump_cfg(struct whnat_entry *whnat) -{ - struct wed_entry *wed = &whnat->wed; - struct wifi_entry *wifi = &whnat->wifi; - struct wdma_entry *wdma = &whnat->wdma; - - WHNAT_DBG(WHNAT_DBG_OFF, "==========WED basic info:==========\n"); - dump_wed_value(wed, "WED_REV", WED_REV); - dump_wed_value(wed, "WED_CTRL", WED_CTRL); - dump_wed_value(wed, "WED_CTRL2", WED_CTRL2); - dump_wed_value(wed, "WED_EX_INT_STA", WED_EX_INT_STA); - dump_wed_value(wed, "WED_EX_INT_MSK", WED_EX_INT_MSK); - dump_wed_value(wed, "WED_ST", WED_ST); - dump_wed_value(wed, "WED_GLO_CFG", WED_GLO_CFG); - dump_wed_value(wed, "WED_INT_STA", WED_INT_STA); - dump_wed_value(wed, "WED_INT_MSK", WED_INT_MSK); - dump_wed_value(wed, "WED_AXI_CTRL", WED_AXI_CTRL); - WHNAT_DBG(WHNAT_DBG_OFF, "==========WED TX buf info:==========\n"); - dump_wed_value(wed, "WED_BM_ST", WED_BM_ST); - dump_wed_value(wed, "WED_TX_BM_BASE", WED_TX_BM_BASE); - dump_wed_value(wed, "WED_TX_BM_CTRL", WED_TX_BM_CTRL); - dump_wed_value(wed, "WED_TX_BM_TKID", WED_TX_BM_TKID); - dump_wed_value(wed, "WED_TX_BM_STS", WED_TX_BM_STS); - dump_wed_value(wed, "WED_TX_BM_DYN_TH", WED_TX_BM_DYN_TH); - dump_wed_value(wed, "WED_TX_BM_INTF", WED_TX_BM_INTF); - dump_wed_value(wed, "WED_TX_BM_RECYC", WED_TX_BM_RECYC); - WHNAT_DBG(WHNAT_DBG_OFF, "==========WED PCI Host Control:==========\n"); - dump_wed_value(wed, "WED_PCIE_CFG_BASE", WED_PCIE_CFG_BASE); - dump_wed_value(wed, "WED_PCIE_OFST", WED_PCIE_OFST); - dump_wed_value(wed, "WED_PCIE_INTS_TRIG", WED_PCIE_INTS_TRIG); - dump_wed_value(wed, "WED_PCIE_INT_CTRL", WED_PCIE_INT_CTRL); - WHNAT_DBG(WHNAT_DBG_OFF, "==========WED_WPDMA basic info:==========\n"); - dump_wed_value(wed, "WED_WPDMA_ST", WED_WPDMA_ST); - dump_wed_value(wed, "WED_WPDMA_INT_STA_REC", WED_WPDMA_INT_STA_REC); - dump_wed_value(wed, "WED_WPDMA_GLO_CFG", WED_WPDMA_GLO_CFG); - dump_wed_value(wed, "WED_WPDMA_CFG_BASE", WED_WPDMA_CFG_BASE); - dump_wed_value(wed, "WED_WPDMA_OFST0", WED_WPDMA_OFST0); - dump_wed_value(wed, "WED_WPDMA_OFST1", WED_WPDMA_OFST1); - dump_wed_value(wed, "WED_WPDAM_CTRL", WED_WPDAM_CTRL); - WHNAT_DBG(WHNAT_DBG_OFF, "==========WED_WDMA basic info:==========\n"); - dump_wed_value(wed, "WED_WDMA_ST", WED_WDMA_ST); - dump_wed_value(wed, "WED_WDMA_INFO", WED_WDMA_INFO); - dump_wed_value(wed, "WED_WDMA_GLO_CFG", WED_WDMA_GLO_CFG); - dump_wed_value(wed, "WED_WDMA_RST_IDX", WED_WDMA_RST_IDX); - dump_wed_value(wed, "WED_WDMA_LOAD_DRV_IDX", WED_WDMA_LOAD_DRV_IDX); - dump_wed_value(wed, "WED_WDMA_LOAD_CRX_IDX", WED_WDMA_LOAD_CRX_IDX); - dump_wed_value(wed, "WED_WDMA_SPR", WED_WDMA_SPR); - dump_wed_value(wed, "WED_WDMA_INT_STA_REC", WED_WDMA_INT_STA_REC); - dump_wed_value(wed, "WED_WDMA_INT_TRIG", WED_WDMA_INT_TRIG); - dump_wed_value(wed, "WED_WDMA_INT_CTRL", WED_WDMA_INT_CTRL); - dump_wed_value(wed, "WED_WDMA_INT_CLR", WED_WDMA_INT_CLR); - dump_wed_value(wed, "WED_WDMA_CFG_BASE", WED_WDMA_CFG_BASE); - dump_wed_value(wed, "WED_WDMA_OFST0", WED_WDMA_OFST0); - dump_wed_value(wed, "WED_WDMA_OFST1", WED_WDMA_OFST1); - /*other part setting*/ - WHNAT_DBG(WHNAT_DBG_OFF, "==========WDMA basic info:==========\n"); - dump_wdma_value(wdma, "WDMA_GLO_CFG", WDMA_GLO_CFG); - dump_wdma_value(wdma, "WDMA_INT_MSK", WDMA_INT_MSK); - dump_wdma_value(wdma, "WDMA_INT_STA", WDMA_INT_STA_REC); - dump_wdma_value(wdma, "WDMA_INFO", WDMA_INFO); - dump_wdma_value(wdma, "WDMA_DELAY_INT_CFG", WDMA_DELAY_INT_CFG); - dump_wdma_value(wdma, "WDMA_FREEQ_THRES", WDMA_FREEQ_THRES); - dump_wdma_value(wdma, "WDMA_INT_STS_GRP0", WDMA_INT_STS_GRP0); - dump_wdma_value(wdma, "WDMA_INT_STS_GRP1", WDMA_INT_STS_GRP1); - dump_wdma_value(wdma, "WDMA_INT_STS_GRP2", WDMA_INT_STS_GRP2); - dump_wdma_value(wdma, "WDMA_INT_GRP1", WDMA_INT_GRP1); - dump_wdma_value(wdma, "WDMA_INT_GRP2", WDMA_INT_GRP2); - dump_wdma_value(wdma, "WDMA_SCH_Q01_CFG", WDMA_SCH_Q01_CFG); - dump_wdma_value(wdma, "WDMA_SCH_Q23_CFG", WDMA_SCH_Q23_CFG); - WHNAT_DBG(WHNAT_DBG_OFF, "==========WPDMA basic info:==========\n"); - dump_wifi_value(wifi, "WPDMA_GLO_CFG", WIFI_WPDMA_GLO_CFG); - dump_wifi_value(wifi, "WPDMA_INT_MSK", WIFI_INT_MSK); - dump_wifi_value(wifi, "WPDMA_INT_STA", WIFI_INT_STA); -} - -/* -* -*/ -void whnat_dump_txinfo(struct whnat_entry *whnat) -{ - struct wed_entry *wed = &whnat->wed; - struct wifi_entry *wifi = &whnat->wifi; - struct wdma_entry *wdma = &whnat->wdma; - - WHNAT_DBG(WHNAT_DBG_OFF, "==========WED TX ring info:==========\n"); - dump_wed_value(wed, "WED_TX0_MIB", WED_TX0_MIB); - dump_wed_value(wed, "WED_TX1_MIB", WED_TX1_MIB); - dump_wed_value(wed, "WED_TX0_BASE", WED_TX0_CTRL0); - dump_wed_value(wed, "WED_TX0_CNT", WED_TX0_CTRL1); - dump_wed_value(wed, "WED_TX0_CIDX", WED_TX0_CTRL2); - dump_wed_value(wed, "WED_TX0_DIDX", WED_TX0_CTRL3); - dump_wed_value(wed, "WED_TX1_BASE", WED_TX1_CTRL0); - dump_wed_value(wed, "WED_TX1_CNT", WED_TX1_CTRL1); - dump_wed_value(wed, "WED_TX1_CIDX", WED_TX1_CTRL2); - dump_wed_value(wed, "WED_TX1_DIDX", WED_TX1_CTRL3); - /*WPDMA status from WED*/ - WHNAT_DBG(WHNAT_DBG_OFF, - "==========WED WPDMA TX ring info:==========\n"); - dump_wed_value(wed, "WED_WPDMA_TX0_MIB", WED_WPDMA_TX0_MIB); - dump_wed_value(wed, "WED_WPDMA_TX0_BASE", WED_WPDMA_TX0_CTRL0); - dump_wed_value(wed, "WED_WPDMA_TX0_CNT", WED_WPDMA_TX0_CTRL1); - dump_wed_value(wed, "WED_WPDMA_TX0_CIDX", WED_WPDMA_TX0_CTRL2); - dump_wed_value(wed, "WED_WPDMA_TX0_DIDX", WED_WPDMA_TX0_CTRL3); - dump_wed_value(wed, "WED_WPDMA_TX0_COHERENT_MIB", - WED_WPDMA_TX0_COHERENT_MIB); - dump_wed_value(wed, "WED_WPDMA_TX1_MIB", WED_WPDMA_TX1_MIB); - dump_wed_value(wed, "WED_WPDMA_TX1_BASE", WED_WPDMA_TX1_CTRL0); - dump_wed_value(wed, "WED_WPDMA_TX1_CNT", WED_WPDMA_TX1_CTRL1); - dump_wed_value(wed, "WED_WPDMA_TX1_CIDX", WED_WPDMA_TX1_CTRL2); - dump_wed_value(wed, "WED_WPDMA_TX1_DIDX", WED_WPDMA_TX1_CTRL3); - dump_wed_value(wed, "WED_WPDMA_TX1_COHERENT_MIB", - WED_WPDMA_TX1_COHERENT_MIB); - /*WPDMA*/ - WHNAT_DBG(WHNAT_DBG_OFF, "==========WPDMA TX ring info:==========\n"); - dump_wifi_value(wifi, "WPDMA_TX0_BASE", WIFI_TX_RING0_BASE); - dump_wifi_value(wifi, "WPDMA_TX0_CNT", WIFI_TX_RING0_CNT); - dump_wifi_value(wifi, "WPDMA_TX0_CRX_IDX", WIFI_TX_RING0_CIDX); - dump_wifi_value(wifi, "WPDMA_TX0_DRX_IDX", WIFI_TX_RING0_DIDX); - dump_wifi_value(wifi, "WPDMA_TX1_BASE", WIFI_TX_RING1_BASE); - dump_wifi_value(wifi, "WPDMA_TX1_CNT", WIFI_TX_RING1_CNT); - dump_wifi_value(wifi, "WPDMA_TX1_CRX_IDX", WIFI_TX_RING1_CIDX); - dump_wifi_value(wifi, "WPDMA_TX1_DRX_IDX", WIFI_TX_RING1_DIDX); - /*WDMA status from WED*/ - WHNAT_DBG(WHNAT_DBG_OFF, - "==========WED WDMA RX ring info:==========\n"); - dump_wed_value(wed, "WED_WDMA_RX0_MIB", WED_WDMA_RX0_MIB); - dump_wed_value(wed, "WED_WDMA_RX0_BASE", WED_WDMA_RX0_BASE); - dump_wed_value(wed, "WED_WDMA_RX0_CNT", WED_WDMA_RX0_CNT); - dump_wed_value(wed, "WED_WDMA_RX0_CRX_IDX", WED_WDMA_RX0_CRX_IDX); - dump_wed_value(wed, "WED_WDMA_RX0_DRX_IDX", WED_WDMA_RX0_DRX_IDX); - dump_wed_value(wed, "WED_WDMA_RX0_THRES_CFG", WED_WDMA_RX0_THRES_CFG); - dump_wed_value(wed, "WED_WDMA_RX0_RECYCLE_MIB", - WED_WDMA_RX0_RECYCLE_MIB); - dump_wed_value(wed, "WED_WDMA_RX0_PROCESSED_MIB", - WED_WDMA_RX0_PROCESSED_MIB); - dump_wed_value(wed, "WED_WDMA_RX1_MIB", WED_WDMA_RX1_MIB); - dump_wed_value(wed, "WED_WDMA_RX1_BASE", WED_WDMA_RX1_BASE); - dump_wed_value(wed, "WED_WDMA_RX1_CNT", WED_WDMA_RX1_CNT); - dump_wed_value(wed, "WED_WDMA_RX1_CRX_IDX", WED_WDMA_RX1_CRX_IDX); - dump_wed_value(wed, "WED_WDMA_RX1_DRX_IDX", WED_WDMA_RX1_DRX_IDX); - dump_wed_value(wed, "WED_WDMA_RX1_THRES_CFG", WED_WDMA_RX1_THRES_CFG); - dump_wed_value(wed, "WED_WDMA_RX1_RECYCLE_MIB", - WED_WDMA_RX1_RECYCLE_MIB); - dump_wed_value(wed, "WED_WDMA_RX1_PROCESSED_MIB", - WED_WDMA_RX1_PROCESSED_MIB); - /*WDMA*/ - WHNAT_DBG(WHNAT_DBG_OFF, - "==========WED WDMA RX ring info:==========\n"); - dump_wdma_value(wdma, "WDMA_RX_BASE_PTR_0", WDMA_RX_BASE_PTR_0); - dump_wdma_value(wdma, "WDMA_RX_MAX_CNT_0", WDMA_RX_MAX_CNT_0); - dump_wdma_value(wdma, "WDMA_RX_CRX_IDX_0", WDMA_RX_CRX_IDX_0); - dump_wdma_value(wdma, "WDMA_RX_DRX_IDX_0", WDMA_RX_DRX_IDX_0); - dump_wdma_value(wdma, "WDMA_RX_BASE_PTR_1", WDMA_RX_BASE_PTR_1); - dump_wdma_value(wdma, "WDMA_RX_MAX_CNT_1", WDMA_RX_MAX_CNT_1); - dump_wdma_value(wdma, "WDMA_RX_CRX_IDX_1", WDMA_RX_CRX_IDX_1); - dump_wdma_value(wdma, "WDMA_RX_DRX_IDX_1", WDMA_RX_DRX_IDX_1); -} - -/* -* -*/ -void whnat_dump_rxinfo(struct whnat_entry *whnat) -{ - struct wed_entry *wed = &whnat->wed; - struct wifi_entry *wifi = &whnat->wifi; - - WHNAT_DBG(WHNAT_DBG_OFF, "==========WED RX ring info:==========\n"); - dump_wed_value(wed, "WED_RX1_MIB", WED_RX1_MIB); - dump_wed_value(wed, "WED_RX1_BASE", WED_RX1_CTRL0); - dump_wed_value(wed, "WED_RX1_CNT", WED_RX1_CTRL1); - dump_wed_value(wed, "WED_RX1_CIDX", WED_RX1_CTRL2); - dump_wed_value(wed, "WED_RX1_DIDX", WED_RX1_CTRL3); - /*WPDMA status from WED*/ - WHNAT_DBG(WHNAT_DBG_OFF, "==========WPDMA RX ring info:==========\n"); - dump_wed_value(wed, "WED_WPDMA_RX1_MIB", WED_WPDMA_RX1_MIB); - dump_wed_value(wed, "WED_WPDMA_RX1_BASE", WED_WPDMA_RX1_CTRL0); - dump_wed_value(wed, "WED_WPDMA_RX1_CNT", WED_WPDMA_RX1_CTRL1); - dump_wed_value(wed, "WED_WPDMA_RX1_CIDX", WED_WPDMA_RX1_CTRL2); - dump_wed_value(wed, "WED_WPDMA_RX1_DIDX", WED_WPDMA_RX1_CTRL3); - dump_wed_value(wed, "WED_WPDMA_RX1_COHERENT_MIB", - WED_WPDMA_RX1_COHERENT_MIB); - /*WPDMA*/ - WHNAT_DBG(WHNAT_DBG_OFF, "==========WPDMA RX ring info:==========\n"); - dump_wifi_value(wifi, "WPDMA_RX1_BASE", WIFI_RX_RING1_BASE); - dump_wifi_value(wifi, "WPDMA_RX1_CNT", WIFI_RX_RING1_CNT); - dump_wifi_value(wifi, "WPDMA_RX1_CRX_IDX", WIFI_RX_RING1_CIDX); - dump_wifi_value(wifi, "WPDMA_RX1_DRX_IDX", WIFI_RX_RING1_DIDX); -} - -/* -* -*/ -struct whnat_entry *whnat_entry_search(void *cookie) -{ - unsigned char i; - struct whnat_ctrl *wc = whnat_ctrl_get(); - - for (i = 0; i < wc->whnat_num; i++) { - if (wc->entry[i].wifi.cookie && - wc->entry[i].wifi.cookie == cookie) - return &wc->entry[i]; - } - - return NULL; -} - -/* -* global function -*/ -struct whnat_ctrl *whnat_ctrl_get(void) -{ - return &sys_wc; -} - -/* - * Gloab variable - */ -static struct mt_wlan_hook_ops whnat_ops = { - .name = "WHNAT", - .hooks = (1 << WLAN_HOOK_HIF_INIT) | (1 << WLAN_HOOK_HIF_EXIT) | - (1 << WLAN_HOOK_DMA_SET) | (1 << WLAN_HOOK_SYS_UP) | - (1 << WLAN_HOOK_SYS_DOWN) | (1 << WLAN_HOOK_ISR) | - (1 << WLAN_HOOK_TX) | (1 << WLAN_HOOK_SER), - .fun = whnat_handle, - .priority = WLAN_HOOK_PRI_WOE -}; - -static int __init whnat_module_init(void) -{ - struct whnat_ctrl *wc = whnat_ctrl_get(); - - WHNAT_DBG(WHNAT_DBG_OFF, - "%s(): module init and register callback for whnat\n", - __func__); - /*initial global whnat control*/ - memset(wc, 0, sizeof(struct whnat_ctrl)); - /*register hook function*/ - mt_wlan_hook_register(&whnat_ops); - /*register proc*/ - whnat_ctrl_proc_init(wc); - /*initial whnat driver and check */ - whnat_ctrl_init(wc); - /*initial pci cr mirror cfg*/ - whnat_hif_init(&wc->hif_cfg); - return 0; -} - -static void __exit whnat_module_exit(void) -{ - struct whnat_ctrl *wc = whnat_ctrl_get(); - - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): whnat module exist\n", __func__); - whnat_hif_exit(&wc->hif_cfg); - whnat_ctrl_exit(wc); - whnat_ctrl_proc_exit(wc); - mt_wlan_hook_unregister(&whnat_ops); -} - -module_init(whnat_module_init); -module_exit(whnat_module_exit); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_SUPPORTED_DEVICE("mt7615 within mt7622"); diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_mt7615.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_mt7615.c deleted file mode 100644 index 2612b44f0e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_mt7615.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: whnat - whnat_mt7615.c -*/ - -#ifdef MT7615 -#include "woe_mt7615.h" -#include "woe.h" -#include "hwnat/ra_nat.h" -#include -#include -#include -#include - -/*Local function part*/ -/* -* -*/ -static void wifi_pcie_match(struct wifi_entry *wifi) -{ - unsigned char idx = 0; - idx = wifi_slot_get(wifi->cookie); - wifi->slot_id = idx; - wifi->wpdma_base = wifi_wpdma_base_get(wifi->cookie); -} - -/*Gloable function*/ -/* -* -*/ -void wifi_fbuf_init(unsigned char *fbuf, unsigned int pkt_pa, unsigned int tkid) -{ - TMAC_TXD_L *txd; - TMAC_TXD_0 *txd0; - TMAC_TXD_1 *txd1; - CR4_TXP_MSDU_INFO *txp; - - txd = (TMAC_TXD_L *)fbuf; - txp = (CR4_TXP_MSDU_INFO *)(fbuf + sizeof(TMAC_TXD_L)); - memset(txd, 0, sizeof(*txd)); - memset(txp, 0, sizeof(*txp)); - /*initial txd*/ - txd0 = &txd->TxD0; - txd0->TxByteCount = sizeof(*txd); - txd0->p_idx = P_IDX_LMAC; - txd0->q_idx = 0; - txd1 = &txd->TxD1; - txd1->ft = TMI_FT_LONG; - txd1->txd_len = 0; - txd1->pkt_ft = TMI_PKT_FT_HIF_CT; - txd1->hdr_format = TMI_HDR_FT_NON_80211; - TMI_HDR_INFO_VAL(TMI_HDR_FT_NON_80211, 0, 0, 0, 0, 0, 0, 0, - txd1->hdr_info); - txd1->hdr_pad = (TMI_HDR_PAD_MODE_HEAD << TMI_HDR_PAD_BIT_MODE) | 0x1; - /*init txp*/ - txp->msdu_token = tkid; - /*without TXD, CR4 will take care it*/ - txp->type_and_flags = 0; - txp->buf_num = 1; - txp->buf_ptr[0] = pkt_pa; - txp->buf_len[0] = 0; -} - -/* -* -*/ -static inline void wifi_tx_info_wrapper(unsigned char *tx_info, - struct wlan_tx_info *info) -{ - struct _TX_BLK *txblk = (struct _TX_BLK *)tx_info; - - info->pkt = txblk->pPacket; - info->bssidx = txblk->wdev->bss_info_argument.ucBssIndex; - info->ringidx = txblk->dbdc_band; -#ifdef MAC_REPEATER_SUPPORT - - if (txblk->pMacEntry && IS_ENTRY_REPEATER(txblk->pMacEntry)) - info->wcid = txblk->pMacEntry->wcid; - else -#endif -#ifdef A4_CONN - if (txblk->pMacEntry && IS_ENTRY_A4(txblk->pMacEntry)) - info->wcid = txblk->pMacEntry->wcid; - else -#endif /* A4_CONN */ - { - info->wcid = 0xff; - } -} - -#ifdef WHNAT_DBG_EN -/* -* -*/ -static void wifi_dump_skb(struct whnat_entry *entry, struct wlan_tx_info *info, - struct sk_buff *skb) -{ - struct iphdr *hdr = ip_hdr(skb); - - WHNAT_DBG(WHNAT_DBG_INF, - "%s(): add entry: wdma=%d,ringId=%d,wcid=%d,bssid=%d\n", - __func__, entry->idx, info->ringidx, info->wcid, - info->bssidx); - - if (hdr->version != 4) - return; - - WHNAT_DBG(WHNAT_DBG_INF, "%s():src=%d.%d.%d.%d\n", __func__, - (0xff & hdr->saddr), (0xff00 & hdr->saddr) >> 8, - (0xff0000 & hdr->saddr) >> 16, - (0xff000000 & hdr->saddr) >> 24); - - WHNAT_DBG(WHNAT_DBG_INF, "%s(): dst=%d.%d.%d.%d\n", __func__, - (0xff & hdr->daddr), (0xff00 & hdr->daddr) >> 8, - (0xff0000 & hdr->daddr) >> 16, - (0xff000000 & hdr->daddr) >> 24); - - if (hdr->protocol == IPPROTO_TCP) { - struct tcphdr *tcph = tcp_hdr(skb); - WHNAT_DBG(WHNAT_DBG_INF, - "%s(): protocol=TCP,sport=%d,dstport=%d\n", __func__, - tcph->source, tcph->dest); - } - - if (hdr->protocol == IPPROTO_UDP) { - struct udphdr *udph = udp_hdr(skb); - WHNAT_DBG(WHNAT_DBG_INF, - "%s(): protocol=UDP,sport=%d,dstport=%d\n", __func__, - udph->source, udph->dest); - } -} -#endif /*WHNAT_DBG_EN*/ - -/* -* -*/ -void wifi_tx_tuple_add(void *entry, unsigned char *tx_info) -{ - struct whnat_entry *whnat = (struct whnat_entry *)entry; - struct wlan_tx_info t, *info = &t; - struct _TX_BLK *txblk = (struct _TX_BLK *)tx_info; - - memset(info, 0, sizeof(*info)); - wifi_tx_info_wrapper(tx_info, info); - WHNAT_DBG(WHNAT_DBG_INF, "WDMAID: %d,RingID: %d, Wcid: %d, Bssid: %d\n", - whnat->idx, info->ringidx, info->wcid, info->bssidx); - - if (whnat && ra_sw_nat_hook_tx && whnat->cfg.hw_tx_en) { - struct sk_buff *skb = (struct sk_buff *)info->pkt; - - if ((FOE_AI_HEAD(skb) == HIT_UNBIND_RATE_REACH) || - (FOE_AI_TAIL(skb) == HIT_UNBIND_RATE_REACH)) { - if (IS_SPACE_AVAILABLE_HEAD(skb)) { - /*WDMA idx*/ - FOE_WDMA_ID_HEAD(skb) = whnat->idx; - /*Ring idx*/ - FOE_RX_ID_HEAD(skb) = info->ringidx; - /*wtable Idx*/ - FOE_WC_ID_HEAD(skb) = info->wcid; - /*Bssidx*/ - FOE_BSS_ID_HEAD(skb) = info->bssidx; - } - if (IS_SPACE_AVAILABLE_TAIL(skb)) { - /*WDMA idx*/ - FOE_WDMA_ID_TAIL(skb) = whnat->idx; - /*Ring idx*/ - FOE_RX_ID_TAIL(skb) = info->ringidx; - /*wtable Idx*/ - FOE_WC_ID_TAIL(skb) = info->wcid; - /*Bssidx*/ - FOE_BSS_ID_TAIL(skb) = info->bssidx; - } - } - - /*use port for specify which hw_nat architecture*/ - if (ra_sw_nat_hook_tx) { - if (ra_sw_nat_hook_tx(skb, WHNAT_WDMA_PORT) != 1) { - txblk->DropPkt = TRUE; - } - } - -#ifdef WHNAT_DBG_EN - wifi_dump_skb(whnat, info, skb); -#endif /*WHNAT_DBG_EN*/ - } -} - -/* -* -*/ -char wifi_hw_tx_allow(void *cookie, unsigned char *tx_info) -{ - struct _TX_BLK *txblk = (struct _TX_BLK *)tx_info; - struct wifi_dev *wdev = txblk->wdev; - - if (!wdev) - return FALSE; - - if (wlan_operate_get_frag_thld(wdev) != DEFAULT_FRAG_THLD) - return FALSE; - - return TRUE; -} - -/* -* -*/ -void wifi_dma_cfg_wrapper(int wifi_cfg, unsigned char *dma_cfg) -{ - if (wifi_cfg == -1) - *dma_cfg = WHNAT_DMA_DISABLE; - else { - switch (wifi_cfg) { - case PDMA_TX_RX: - *dma_cfg = WHNAT_DMA_TXRX; - break; - - case PDMA_TX: - *dma_cfg = WHNAT_DMA_TX; - break; - - case PDMA_RX: - *dma_cfg = PDMA_TX_RX; - break; - } - } -} - -/* -* -*/ -void wifi_tx_tuple_reset(void) -{ - /* FoeTblClean(); */ -} - -/* -* -*/ -unsigned int wifi_ser_status(void *ser_ctrl) -{ -#ifdef ERR_RECOVERY - ERR_RECOVERY_CTRL_T *ctrl = (ERR_RECOVERY_CTRL_T *)ser_ctrl; - - if (ctrl) - return ctrl->errRecovState; - -#endif /*ERR_RECOVERY*/ - return WIFI_ERR_RECOV_NONE; -} - -/* -* Wifi function part -*/ - -/* -* -*/ -void dump_wifi_value(struct wifi_entry *wifi, char *name, unsigned int addr) -{ - unsigned int value; - - WHNAT_IO_READ32(wifi, addr, &value); - WHNAT_DBG(WHNAT_DBG_OFF, "%s\t:%x\n", name, value); -} - -/* -* -*/ -void wifi_dump_tx_ring_info(struct wifi_entry *wifi, unsigned char ring_id, - unsigned int idx) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wifi->cookie; - struct _PCI_HIF_T *pci_cfg = &ad->PciHif; - RTMP_DMACB *cb = &pci_cfg->TxRing[ring_id].Cell[idx]; - - WHNAT_DBG(WHNAT_DBG_OFF, "AllocPA\t: %pad\n", &cb->AllocPa); - WHNAT_DBG(WHNAT_DBG_OFF, "AllocVa\t: %p\n", cb->AllocVa); - WHNAT_DBG(WHNAT_DBG_OFF, "Size\t: %lu\n", cb->AllocSize); - WHNAT_DBG(WHNAT_DBG_OFF, "pNdisPacket\t: %p\n", cb->pNdisPacket); - WHNAT_DBG(WHNAT_DBG_OFF, "token_id\t: %d\n", cb->token_id); - whnat_dump_raw("WED_TX_RING", cb->AllocVa, cb->AllocSize); -} - -/* -* -*/ -unsigned int wifi_chip_id_get(void *cookie) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)cookie; - - return ad->ChipID; -} - -/* -* -*/ -unsigned int wifi_whnat_en_get(void *cookie) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)cookie; - - return ad->CommonCfg.whnat_en; -} - -/* -* -*/ -void wifi_whnat_en_set(void *cookie, unsigned int en) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)cookie; - - ad->CommonCfg.whnat_en = en; -} - -/* -* -*/ -void wifi_chip_cr_mirror_set(struct wifi_entry *wifi, unsigned char enable) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wifi->cookie; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - if (enable) { - ops->hif_io_read32 = NULL; - ops->hif_io_write32 = NULL; - } else { - ops->hif_io_read32 = whnat_hal_io_read; - ops->hif_io_write32 = whnat_hal_io_write; - } -} - -/* -* CHIP related setting -*/ -void wifi_chip_probe(struct wifi_entry *wifi, unsigned int irq) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wifi->cookie; - struct os_cookie *os_cookie = (struct os_cookie *)ad->OS_Cookie; - struct pci_dev *pci_dev = os_cookie->pci_dev; - struct net_device *dev = ad->net_dev; - - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): Chang CHIP IRQ: %d to WHNAT IRQ: %d\n", - __func__, pci_dev->irq, irq); - wifi->irq = pci_dev->irq; - pci_dev->irq = irq; - dev->irq = irq; - /*always disable hw cr mirror first */ - wifi_chip_cr_mirror_set(wifi, FALSE); - wifi->base_addr = (unsigned long)ad->PciHif.CSRBaseAddress; - wifi->int_mask = &ad->PciHif.IntEnableReg; - wifi_pcie_match(wifi); -} - -/* -* -*/ -void wifi_chip_remove(struct wifi_entry *wifi) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wifi->cookie; - struct os_cookie *os_cookie = (struct os_cookie *)ad->OS_Cookie; - struct pci_dev *pci_dev = os_cookie->pci_dev; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): Chang WED IRQ: %d to CHIP IRQ: %d\n", - __func__, pci_dev->irq, wifi->irq); - /*revert pci irq as original irq*/ - pci_dev->irq = wifi->irq; - wifi->irq = 0; - ops->hif_io_read32 = NULL; - ops->hif_io_write32 = NULL; - wifi->base_addr = 0; - wifi->int_mask = NULL; -} - -/* -* -*/ -int wifi_slot_get(void *cookie) -{ - struct _RTMP_ADAPTER *ad = (RTMP_ADAPTER *)cookie; - struct os_cookie *os_cookie = (struct os_cookie *)ad->OS_Cookie; - struct pci_dev *pci_dev = os_cookie->pci_dev; - unsigned int id = 1; - if (pci_dev->bus) { - id = (pci_dev->bus->self->devfn >> 3) & 0x1f; - WHNAT_DBG(WHNAT_DBG_OFF, - "%s(): bus name=%s, funid=%d, get slot id=%d\n", - __func__, pci_dev->bus->name, - pci_dev->bus->self->devfn, id); - } - return id; -} - -/* -* -*/ -unsigned int wifi_wpdma_base_get(void *cookie) -{ - struct _RTMP_ADAPTER *ad = (RTMP_ADAPTER *)cookie; - struct os_cookie *os_cookie = (struct os_cookie *)ad->OS_Cookie; - struct pci_dev *pci_dev = os_cookie->pci_dev; - unsigned int wpdma_base = 0; - - if (pci_dev->bus) { - wpdma_base = (unsigned int)pci_resource_start(pci_dev, 0); - wpdma_base |= WPDMA_OFFSET; - } - return wpdma_base; -} - -/* -* -*/ -void wifi_cap_get(struct wifi_entry *wifi) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wifi->cookie; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - - wifi->tx_ring_num = cap->num_of_tx_ring; -} - -#endif /*MT7615*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_mt7615.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_mt7615.h deleted file mode 100644 index 5d2fcfb885..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_mt7615.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - woe_mt7615.h -*/ - -#ifndef _WOE_MT7615_H_ -#define _WOE_MT7615_H_ - -#include "rt_config.h" -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" -#include - -extern int (*ra_sw_nat_hook_tx)(struct sk_buff *skb, int gmac_no); -extern struct _RTMP_CHIP_CAP *hc_get_chip_cap(void *hdev_ctrl); -#ifdef MULTI_INF_SUPPORT -/*EXPORT symbol from wifi drvier*/ -extern int multi_inf_get_idx(VOID *pAd); -#endif /*MULTI_INF_SUPPORT*/ - -#define WIFI_RING_OFFSET 0x10 -#define WIFI_TX_RING_SIZE (1024) -#define WIFI_PDMA_TXD_SIZE (TXD_SIZE) -#define WIFI_TX_TOKEN_CNT (DEFAUT_WHNAT_PKT_TX_TOKEN_ID_MAX + 1) -#define WIFI_TX_1ST_BUF_SIZE 128 -#define WIFI_RX1_RING_SIZE (512) -#define WIFI_TX_BUF_SIZE 1900 -#define WIFI_IMR_VAL 0xfff000e3 - -/*CR usage remapping*/ -#define WIFI_TX_RING0_BASE MT_WPDMA_TX_RING0_CTRL0 -#define WIFI_TX_RING0_CNT MT_WPDMA_TX_RING0_CTRL1 -#define WIFI_TX_RING0_CIDX MT_WPDMA_TX_RING0_CTRL2 -#define WIFI_TX_RING0_DIDX MT_WPDMA_TX_RING0_CTRL3 -#define WIFI_TX_RING1_BASE MT_WPDMA_TX_RING1_CTRL0 -#define WIFI_TX_RING1_CNT MT_WPDMA_TX_RING1_CTRL1 -#define WIFI_TX_RING1_CIDX MT_WPDMA_TX_RING1_CTRL2 -#define WIFI_TX_RING1_DIDX MT_WPDMA_TX_RING1_CTRL3 - -#define WIFI_RX_RING1_BASE MT_WPDMA_RX_RING1_CTRL0 -#define WIFI_RX_RING1_CNT MT_WPDMA_RX_RING1_CTRL1 -#define WIFI_RX_RING1_CIDX MT_WPDMA_RX_RING1_CTRL2 -#define WIFI_RX_RING1_DIDX MT_WPDMA_RX_RING1_CTRL3 - -#define WIFI_INT_STA MT_INT_SOURCE_CSR -#define WIFI_INT_MSK MT_INT_MASK_CSR -#define WIFI_WPDMA_GLO_CFG MT_WPDMA_GLO_CFG -#define WIFI_WPDMA_GLO_CFG_FLD_TX_DMA_EN (0) -#define WIFI_WPDMA_GLO_CFG_FLD_TX_DMA_BUSY (1) -#define WIFI_WPDMA_GLO_CFG_FLD_RX_DMA_EN (2) -#define WIFI_WPDMA_GLO_CFG_FLD_RX_DMA_BUSY (3) -#define WIFI_WPDMA_RESET_PTR WPDMA_RST_PTR -#define WIFI_WPDMA_RESET_PTR_FLD_RST_DRX_IDX1 (17) -#define WIFI_WPDMA_RESET_PTR_FLD_RST_DTX_IDX0 (0) -#define WIFI_WPDMA_RESET_PTR_FLD_RST_DTX_IDX1 (1) - -#ifdef ERR_RECOVERY -#define WIFI_MCU_INT_EVENT MT_MCU_INT_EVENT -#define WIFI_ERR_RECOV_STOP_IDLE ERR_RECOV_STOP_IDLE -#define WIFI_ERR_RECOV_STOP_PDMA0 ERR_RECOV_STOP_PDMA0 -#define WIFI_ERR_RECOV_RESET_PDMA0 ERR_RECOV_RESET_PDMA0 -#define WIFI_ERR_RECOV_STOP_IDLE_DONE ERR_RECOV_STOP_IDLE_DONE -#define WIFI_TRIGGER_SER MCU_INT_SER_TRIGGER_FROM_HOST -#endif - -#define WIFI_TXD_INIT(_txd) \ - (((struct _TXD_STRUC *)_txd)->DMADONE = DMADONE_DONE) - -#endif /*_WOE_MT7615_H_*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_proc.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_proc.c deleted file mode 100644 index ba537f9169..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_proc.c +++ /dev/null @@ -1,818 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: whnat - whnat_proc.c -*/ -#include -#include -#include -#include -#include -#include "woe.h" - -/*define proc*/ -#define PROC_ROOT_DIR "whnat_ctrl" /*global dir for whnat*/ -#define PROC_TRACE_DIR "tracer" /*tracer */ -#define PROC_WHNAT_DIR "whnat" /*specific for each whnat*/ -#define PROC_CFG_DIR "cfg" /*all of related configure*/ -#define PROC_CR_DIR "cr" /*get specific domain cr*/ -#define PROC_CTRL_DIR "ctrl" /*get/set control whnat*/ -#define PROC_STAT_DIR "stat" /*all of status for debug*/ -#define PROC_TX_DIR "tx" /*tx top information*/ -#define PROC_RX_DIR "rx" /*rx top information*/ -#define PROC_WED_DIR "wed" /*wed specific information*/ -#define PROC_WDMA_DIR "wdma" /*wdma specic information*/ - -/* -* WDMA -*/ -static int wdma_proc_show(struct seq_file *seq, void *v) -{ - struct wdma_entry *wdma = (struct wdma_entry *)seq->private; - - WHNAT_DBG(WHNAT_DBG_LOU, "wdma: %p\n", wdma); - WHNAT_DBG(WHNAT_DBG_OFF, "WDMA_PROC_BASIC\t: echo 0 > wdma\n"); - WHNAT_DBG(WHNAT_DBG_OFF, - "WDMA_PROC_RX_CELL\t: echo 1 [ringid] [idx] > wdma\n"); - return 0; -} - -/* -* -*/ -static int wdma_proc_open(struct inode *inode, struct file *file) -{ - return single_open(file, wdma_proc_show, PDE_DATA(file_inode(file))); -} - -/* -* -*/ -static ssize_t wdma_proc_write(struct file *file, const char __user *buff, - size_t len1, loff_t *ppos) - -{ - char value[64]; - char *end; - char choice; - struct wdma_entry *wdma = - (struct wdma_entry *)PDE_DATA(file_inode(file)); - - if (buff && !copy_from_user(value, buff, len1)) { - choice = whnat_str_tol(value, &end, 10); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): Choice=%d\n", __func__, choice); - wdma_proc_handle(wdma, choice, value); - } - - return len1; -} - -/* - * WED proc operation -*/ -/* -* -*/ -static int wed_proc_show(struct seq_file *seq, void *v) -{ - struct wed_entry *wed = (struct wed_entry *)seq->private; - - WHNAT_DBG(WHNAT_DBG_LOU, "wed: %p\n", wed); - WHNAT_DBG(WHNAT_DBG_OFF, "WED_PROC_TX_RING_BASIC\t: echo 0 > wed\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "WED_PROC_TX_BUF_BASIC\t: echo 1 > wed\n"); - WHNAT_DBG(WHNAT_DBG_OFF, - "WED_PROC_TX_BUF_INFO\t: echo 2 [tkid] > wed\n"); - WHNAT_DBG(WHNAT_DBG_OFF, - "WED_PROC_TX_RING_CELL\t: echo 3 [ringid] [idx] > wed\n"); - WHNAT_DBG(WHNAT_DBG_OFF, - "WED_PROC_TX_RING_RAW\t: echo 4 [ringid] [idx] > wed\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "WED_PROC_DBG_INFO\t: echo 5 > wed\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "WED_PROC_TX_DYNAMIC_FREE\t: echo 6 > wed\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "WED_PROC_TX_DYNAMIC_ALLOC\t: echo 7 > wed\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "WED_PROC_TX_FREE_CNT\t: echo 8 > wed\n"); - return 0; -} - -/* -* -*/ -static int wed_proc_open(struct inode *inode, struct file *file) -{ - return single_open(file, wed_proc_show, PDE_DATA(file_inode(file))); -} - -/* -* -*/ -static ssize_t wed_proc_write(struct file *file, const char __user *buff, - size_t len1, loff_t *ppos) -{ - char value[64]; - char *end; - char choice; - struct wed_entry *wed = (struct wed_entry *)PDE_DATA(file_inode(file)); - - if (buff && !copy_from_user(value, buff, len1)) { - choice = whnat_str_tol(value, &end, 10); - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): Choice=%d\n", __func__, choice); - wed_proc_handle(wed, choice, value); - } - - return len1; -} - -/* -* WHNAT -*/ -/* -* -*/ -static int whnat_proc_cr_show(struct seq_file *seq, void *v) -{ - struct whnat_entry *whnat = (struct whnat_entry *)seq->private; - /*usage*/ - WHNAT_DBG(WHNAT_DBG_OFF, "WED\t: base addr=%lx\n", - whnat->wed.base_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "WDMA\t: base addr=%lx\n", - whnat->wdma.base_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "WIFI\t: base addr=%lx\n", - whnat->wifi.base_addr); - WHNAT_DBG( - WHNAT_DBG_OFF, - "echo [0:WED|1:WDMA|2:WIFI] [0:READ|1:WRITE] [ADDR] {VALUE} > cr\n"); - return 0; -} - -/* -* -*/ -static int whnat_proc_cr_open(struct inode *inode, struct file *file) -{ - return single_open(file, whnat_proc_cr_show, - PDE_DATA(file_inode(file))); -} - -/* -* -*/ -static ssize_t whnat_proc_cr_write(struct file *file, const char __user *buff, - size_t len1, loff_t *ppos) - -{ - char value[64]; - char *end; - char *token; - char is_write; - char type; - char *s = value; - unsigned long addr; - unsigned int cr_value = 0; - struct whnat_entry *whnat = - (struct whnat_entry *)PDE_DATA(file_inode(file)); - - if (buff && !copy_from_user(value, buff, len1)) { - token = strsep(&s, " "); - type = whnat_str_tol(token, &end, 10); - token = strsep(&s, " "); - is_write = whnat_str_tol(token, &end, 10); - token = strsep(&s, " "); - addr = whnat_str_tol(token, &end, 16); - - if (is_write) { - token = strsep(&s, " "); - cr_value = whnat_str_tol(token, &end, 16); - } - - whnat_hal_cr_handle(whnat, type, is_write, addr, &cr_value); - WHNAT_DBG(WHNAT_DBG_OFF, - "%s():Type=%d,IsWrite=%d,Addr=%lx, Value=%x\n", - __func__, type, is_write, addr, cr_value); - } - - return len1; -} - -/* -* CTRL operate -*/ -enum { - TYPE_HW_TX_EN = 0, - TYPE_CR_MIRROR_EN = 1, -}; - -/* -* -*/ -static void whnat_proc_ctrl_handle(struct whnat_entry *entry, char type, - char is_true) -{ - struct whnat_cfg *cfg = &entry->cfg; - switch (type) { - case TYPE_HW_TX_EN: - if (cfg->hw_tx_en != is_true) { - cfg->hw_tx_en = is_true; - } - break; - case TYPE_CR_MIRROR_EN: - if (cfg->cr_mirror_en != is_true) { - wifi_chip_cr_mirror_set(&entry->wifi, is_true); - cfg->cr_mirror_en = is_true; - } - break; - default: - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): set wrong type: %d!\n", - __func__, type); - break; - } -} - -/* -* -*/ -static int whnat_proc_ctrl_show(struct seq_file *seq, void *v) -{ - struct whnat_entry *whnat = (struct whnat_entry *)seq->private; - /*usage*/ - WHNAT_DBG(WHNAT_DBG_OFF, "HW_TX_EN\t: %s\n", - whnat->cfg.hw_tx_en ? "TRUE" : "FALSE"); - WHNAT_DBG(WHNAT_DBG_OFF, "CR_MIRROR_EN\t: %s\n", - whnat->cfg.cr_mirror_en ? "TRUE" : "FALSE"); - WHNAT_DBG( - WHNAT_DBG_OFF, - "echo [0:HW_TX_EN |1:CR_MIRROR_EN] [0:FALSE|1:TRUE] > ctrl\n"); - return 0; -} - -/* -* -*/ -static int whnat_proc_ctrl_open(struct inode *inode, struct file *file) -{ - return single_open(file, whnat_proc_ctrl_show, - PDE_DATA(file_inode(file))); -} - -/* -* -*/ -static ssize_t whnat_proc_ctrl_write(struct file *file, const char __user *buff, - size_t len1, loff_t *ppos) - -{ - char value[64]; - char *end; - char *token; - char is_true; - char type; - char *s = value; - struct whnat_entry *whnat = - (struct whnat_entry *)PDE_DATA(file_inode(file)); - - if (buff && !copy_from_user(value, buff, len1)) { - token = strsep(&s, " "); - type = whnat_str_tol(token, &end, 10); - token = strsep(&s, " "); - is_true = whnat_str_tol(token, &end, 10); - - whnat_proc_ctrl_handle(whnat, type, is_true); - WHNAT_DBG(WHNAT_DBG_OFF, "%s():Type=%d,IsTrue=%d\n", __func__, - type, is_true); - } - - return len1; -} - -/* - * WHNAT trace tool operation -*/ - -/* -* -*/ -static int whnat_proc_trace_show(struct seq_file *seq, void *v) -{ - struct whnat_ctrl *ctrl = (struct whnat_ctrl *)seq->private; - struct whnat_cputracer *tracer = &ctrl->hif_cfg.tracer; - - WHNAT_DBG(WHNAT_DBG_OFF, "CFG:\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "Irq ID: %d\n", tracer->irq); - WHNAT_DBG(WHNAT_DBG_OFF, "BaseAddr: %lx\n", tracer->base_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "Address: 0x%x\n", tracer->trace_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "Mask: 0x%x\n", tracer->trace_mask); - WHNAT_DBG(WHNAT_DBG_OFF, - "echo 0 [ 0 | 1 ] > trace, for enable or disable trace\n"); - WHNAT_DBG(WHNAT_DBG_OFF, - "echo 1 [ phy_addr] > trace, for set watch address\n"); - WHNAT_DBG(WHNAT_DBG_OFF, - "echo 2 [ mask ] > trace, for set watch mask\n"); - return 0; -} - -/* -* -*/ -static int whnat_proc_trace_open(struct inode *inode, struct file *file) -{ - return single_open(file, whnat_proc_trace_show, - PDE_DATA(file_inode(file))); -} - -/* -* -*/ -static ssize_t whnat_proc_trace_write(struct file *file, - const char __user *buff, size_t len1, - loff_t *ppos) - -{ - char value[64]; - char *end; - char choice; - char *token; - char *s = value; - unsigned int tmp; - struct whnat_ctrl *ctrl = - (struct whnat_ctrl *)PDE_DATA(file_inode(file)); - struct whnat_cputracer *tracer = &ctrl->hif_cfg.tracer; - - if (buff && !copy_from_user(value, buff, len1)) { - token = strsep(&s, " "); - choice = whnat_str_tol(token, &end, 10); - token = strsep(&s, " "); - - switch (choice) { - case WHNAT_TRACE_EN: - tmp = whnat_str_tol(token, &end, 10); - tracer->trace_en = tmp; - break; - - case WHNAT_TRACE_ADDR: - tmp = whnat_str_tol(token, &end, 16); - tracer->trace_addr = tmp; - break; - - case WHNAT_TRACE_MSK: - tmp = whnat_str_tol(token, &end, 16); - tracer->trace_mask = tmp; - break; - } - - WHNAT_DBG(WHNAT_DBG_OFF, "Choice:%d\n", choice); - WHNAT_DBG(WHNAT_DBG_OFF, "EN:%d\n", tracer->trace_en); - WHNAT_DBG(WHNAT_DBG_OFF, "ADDR:%x\n", tracer->trace_addr); - WHNAT_DBG(WHNAT_DBG_OFF, "MASK:%x\n", tracer->trace_mask); - whnat_hal_trace_set(tracer); - } - - return len1; -} - -/* -* -*/ -static int whnat_proc_state_show(struct seq_file *seq, void *v) -{ - struct whnat_entry *whnat = (struct whnat_entry *)seq->private; - - whnat_proc_handle(whnat); - WHNAT_DBG(WHNAT_DBG_OFF, "echo [LOG_LEVEL] > stat\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "LOG_LEVEL:\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "(0):WHNAT_DBG_OFF\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "(1):WHNAT_DBG_ERR\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "(2):WHNAT_DBG_INF\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "(3):WHNAT_DBG_LOU\n"); - return 0; -} - -/* -* -*/ -static int whnat_proc_state_open(struct inode *inode, struct file *file) -{ - return single_open(file, whnat_proc_state_show, - PDE_DATA(file_inode(file))); -} - -/* -* -*/ -static ssize_t whnat_proc_state_write(struct file *file, - const char __user *buff, size_t len1, - loff_t *ppos) - -{ - char value[64]; - char *end; - char log; - struct whnat_entry *whnat = - (struct whnat_entry *)PDE_DATA(file_inode(file)); - - if (buff && !copy_from_user(value, buff, len1)) { - log = whnat_str_tol(value, &end, 10); - -#ifdef ERR_RECOVERY - switch (log) { - case 10: - whnat_hal_ser_trigger(whnat); - return len1; - case 11: - wed_ser_dump(&whnat->wed); - return len1; - } -#endif /*ERR_RECOVERY*/ - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): LogLevel=%d\n", __func__, log); - whnat_log_set(log); - } - - return len1; -} - -/* -* -*/ -static int whnat_proc_cfg_show(struct seq_file *seq, void *v) -{ - struct whnat_entry *whnat = (struct whnat_entry *)seq->private; - - whnat_dump_cfg(whnat); - return 0; -} - -/* -* -*/ -static int whnat_proc_cfg_open(struct inode *inode, struct file *file) -{ - return single_open(file, whnat_proc_cfg_show, - PDE_DATA(file_inode(file))); -} - -/* -* -*/ -static int whnat_proc_tx_show(struct seq_file *seq, void *v) -{ - struct whnat_entry *whnat = (struct whnat_entry *)seq->private; - - whnat_dump_txinfo(whnat); - return 0; -} - -/* -* -*/ -static int whnat_proc_tx_open(struct inode *inode, struct file *file) -{ - return single_open(file, whnat_proc_tx_show, - PDE_DATA(file_inode(file))); -} - -/* -* -*/ -static int whnat_proc_rx_show(struct seq_file *seq, void *v) -{ - struct whnat_entry *whnat = (struct whnat_entry *)seq->private; - - whnat_dump_rxinfo(whnat); - return 0; -} - -/* -* -*/ -static int whnat_proc_rx_open(struct inode *inode, struct file *file) -{ - return single_open(file, whnat_proc_rx_show, - PDE_DATA(file_inode(file))); -} - -/* - * global file operation -*/ -static const struct file_operations proc_whnat_trace_fops = { - .owner = THIS_MODULE, - .open = whnat_proc_trace_open, - .write = whnat_proc_trace_write, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations proc_whnat_cr_fops = { - .owner = THIS_MODULE, - .open = whnat_proc_cr_open, - .write = whnat_proc_cr_write, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations proc_whnat_stat_fops = { - .owner = THIS_MODULE, - .open = whnat_proc_state_open, - .write = whnat_proc_state_write, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations proc_whnat_cfg_fops = { - .owner = THIS_MODULE, - .open = whnat_proc_cfg_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations proc_whnat_tx_fops = { - .owner = THIS_MODULE, - .open = whnat_proc_tx_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations proc_whnat_rx_fops = { - .owner = THIS_MODULE, - .open = whnat_proc_rx_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations proc_wed_fops = { - .owner = THIS_MODULE, - .open = wed_proc_open, - .write = wed_proc_write, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations proc_wdma_fops = { - .owner = THIS_MODULE, - .open = wdma_proc_open, - .write = wdma_proc_write, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations proc_ctrl_fops = { - .owner = THIS_MODULE, - .open = whnat_proc_ctrl_open, - .write = whnat_proc_ctrl_write, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -/* - * proc register/unregister -*/ -int wdma_entry_proc_init(struct whnat_entry *whnat, struct wdma_entry *wdma) -{ - struct proc_dir_entry *root = (struct proc_dir_entry *)whnat->proc; - struct proc_dir_entry *proc; - - proc = proc_create_data(PROC_WDMA_DIR, 0, root, &proc_wdma_fops, wdma); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!\n", PROC_WDMA_DIR); - return -1; - } - - wdma->proc = (void *)proc; - WHNAT_DBG(WHNAT_DBG_INF, "create %s ok!\n", PROC_WDMA_DIR); - return 0; -} - -/* -* -*/ -void wdma_entry_proc_exit(struct whnat_entry *whnat, struct wdma_entry *wdma) -{ - struct proc_dir_entry *root = (struct proc_dir_entry *)whnat->proc; - struct proc_dir_entry *proc = (struct proc_dir_entry *)wdma->proc; - - if (proc && root) - remove_proc_entry(PROC_WDMA_DIR, root); -} - -/* -* -*/ -int wed_entry_proc_init(struct whnat_entry *whnat, struct wed_entry *wed) -{ - struct proc_dir_entry *root = (struct proc_dir_entry *)whnat->proc; - struct proc_dir_entry *proc; - - proc = proc_create_data(PROC_WED_DIR, 0, root, &proc_wed_fops, wed); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!\n", PROC_WED_DIR); - return -1; - } - - wed->proc = (void *)proc; - WHNAT_DBG(WHNAT_DBG_OFF, "create %s ok!!!\n", PROC_WED_DIR); - return 0; -} - -/* -* -*/ -void wed_entry_proc_exit(struct whnat_entry *whnat, struct wed_entry *wed) -{ - struct proc_dir_entry *root = (struct proc_dir_entry *)whnat->proc; - struct proc_dir_entry *proc = (struct proc_dir_entry *)wed->proc; - - if (proc && root) - remove_proc_entry(PROC_WED_DIR, root); -} - -/* -* -*/ -int whnat_entry_proc_init(struct whnat_ctrl *whnat_ctrl, - struct whnat_entry *whnat) -{ - struct proc_dir_entry *root = (struct proc_dir_entry *)whnat_ctrl->proc; - struct proc_dir_entry *proc; - char name[64] = ""; - - snprintf(name, sizeof(name), "%s%d", PROC_WHNAT_DIR, whnat->idx); - proc = proc_mkdir(name, root); - whnat->proc = (void *)proc; - proc = proc_create_data(PROC_STAT_DIR, 0, whnat->proc, - &proc_whnat_stat_fops, whnat); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!!!\n", - PROC_STAT_DIR); - goto err1; - } - - whnat->proc_stat = (void *)proc; - proc = proc_create_data(PROC_CR_DIR, 0, whnat->proc, - &proc_whnat_cr_fops, whnat); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!!!\n", PROC_CR_DIR); - goto err2; - } - - whnat->proc_cr = (void *)proc; - proc = proc_create_data(PROC_CFG_DIR, 0, whnat->proc, - &proc_whnat_cfg_fops, whnat); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!!!\n", PROC_CFG_DIR); - goto err3; - } - - whnat->proc_cfg = (void *)proc; - proc = proc_create_data(PROC_TX_DIR, 0, whnat->proc, - &proc_whnat_tx_fops, whnat); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!!!\n", PROC_TX_DIR); - goto err4; - } - - whnat->proc_tx = (void *)proc; - proc = proc_create_data(PROC_RX_DIR, 0, whnat->proc, - &proc_whnat_rx_fops, whnat); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!!!\n", PROC_RX_DIR); - goto err4; - } - - whnat->proc_rx = (void *)proc; - proc = proc_create_data(PROC_CTRL_DIR, 0, whnat->proc, &proc_ctrl_fops, - whnat); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!!!\n", - PROC_CTRL_DIR); - goto err5; - } - - whnat->proc_ctrl = (void *)proc; - WHNAT_DBG(WHNAT_DBG_INF, "create %s ok!!!\n", name); - return 0; -err5: - remove_proc_entry(PROC_RX_DIR, whnat->proc); -err4: - remove_proc_entry(PROC_TX_DIR, whnat->proc); -err3: - remove_proc_entry(PROC_CR_DIR, whnat->proc); -err2: - remove_proc_entry(PROC_STAT_DIR, whnat->proc); -err1: - remove_proc_entry(name, root); - return -1; -} - -/* -* -*/ -void whnat_entry_proc_exit(struct whnat_ctrl *whnat_ctrl, - struct whnat_entry *whnat) -{ - struct proc_dir_entry *root = (struct proc_dir_entry *)whnat_ctrl->proc; - struct proc_dir_entry *proc = (struct proc_dir_entry *)whnat->proc; - char name[64] = ""; - - if (whnat->proc_cfg) { - remove_proc_entry(PROC_CFG_DIR, proc); - whnat->proc_cfg = NULL; - } - - if (whnat->proc_tx) { - remove_proc_entry(PROC_TX_DIR, proc); - whnat->proc_tx = NULL; - } - - if (whnat->proc_rx) { - remove_proc_entry(PROC_RX_DIR, proc); - whnat->proc_rx = NULL; - } - - if (whnat->proc_cr) { - remove_proc_entry(PROC_CR_DIR, proc); - whnat->proc_cr = NULL; - } - - if (whnat->proc_stat) { - remove_proc_entry(PROC_STAT_DIR, proc); - whnat->proc_stat = NULL; - } - - if (whnat->proc_ctrl) { - remove_proc_entry(PROC_CTRL_DIR, proc); - whnat->proc_ctrl = NULL; - } - - snprintf(name, sizeof(name), "%s%d", PROC_WHNAT_DIR, whnat->idx); - - if (proc) { - remove_proc_entry(name, root); - whnat->proc = NULL; - } -} - -/* -* -*/ -int whnat_ctrl_proc_init(struct whnat_ctrl *whnat_ctrl) -{ - struct proc_dir_entry *proc; - - proc = proc_mkdir(PROC_ROOT_DIR, NULL); - - if (!proc) { - WHNAT_DBG(WHNAT_DBG_ERR, "create %s failed!!!\n", - PROC_ROOT_DIR); - return -1; - } - - whnat_ctrl->proc = (void *)proc; - proc = proc_create_data(PROC_TRACE_DIR, 0, whnat_ctrl->proc, - &proc_whnat_trace_fops, whnat_ctrl); - - if (!proc) - goto err1; - - whnat_ctrl->proc_trace = proc; - WHNAT_DBG(WHNAT_DBG_OFF, "create %s ok!!!\n", PROC_ROOT_DIR); - return 0; -err1: - remove_proc_entry(PROC_ROOT_DIR, whnat_ctrl->proc); - return 0; -} - -/* -* -*/ -void whnat_ctrl_proc_exit(struct whnat_ctrl *whnat_ctrl) -{ - struct proc_dir_entry *proc = (struct proc_dir_entry *)whnat_ctrl->proc; - - if (proc) { - remove_proc_entry(PROC_TRACE_DIR, proc); - remove_proc_entry(PROC_ROOT_DIR, NULL); - } -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_ser.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_ser.c deleted file mode 100644 index 197a2ccf00..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_ser.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: whnat - woe_ser.c -*/ - -/*ser detect related file*/ -#ifdef ERR_RECOVERY - -#include - -#include "woe.h" -#include "wed_def.h" - -#define WED_THREAD_NAME "wed_task" -#define WED_THREAD_PERIOD 100 -#define WED_MAX_ERR_CNT 3 -#define WED_RECYCLE_DIFF(_period_time) (_period_time * 10) -#define WED_SER_RECOVERY_DEFAULT FALSE - -/* -* -*/ -static int wed_ser_check(struct wed_entry *wed) -{ - struct wed_ser_ctrl *ser_ctrl = &wed->ser_ctrl; - - if (ser_ctrl->wpdma_idle_cnt > WED_MAX_ERR_CNT && - ser_ctrl->tx_dma_err_cnt > WED_MAX_ERR_CNT && - ser_ctrl->wdma_err_cnt > WED_MAX_ERR_CNT) { - ser_ctrl->wpdma_ser_cnt++; - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): wed_wpdma_tx_drv error !\n", - __func__); - return TRUE; - } - - if (ser_ctrl->tx_bm_err_cnt > WED_MAX_ERR_CNT) { - ser_ctrl->tx_bm_ser_cnt++; - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): wed_tx_bm error !\n", __func__); - return TRUE; - } - return FALSE; -} - -#ifdef WED_TX_SUPPORT -/* -* -*/ -void wed_ser_err_cnt_wpdma_update(struct wed_ser_ctrl *ser_ctrl, - struct wed_ser_state *new_state) -{ - struct wed_ser_state *state = &ser_ctrl->state; - /*check WED_WPDMA_TX_DRV*/ - if (state->wpdma_stat == 0 && new_state->wpdma_stat == 0) { - if ((state->wpdma_tx0_mib == new_state->wpdma_tx0_mib) && - (state->wpdma_tx1_mib == new_state->wpdma_tx1_mib)) { - ser_ctrl->wpdma_idle_cnt++; - } else { - ser_ctrl->wpdma_idle_cnt = 0; - } - } else { - ser_ctrl->wpdma_idle_cnt = 0; - } -} - -/* -* -*/ -void wed_ser_err_cnt_txdma_update(struct wed_ser_ctrl *ser_ctrl, - struct wed_ser_state *new_state) -{ - struct wed_ser_state *state = &ser_ctrl->state; - /*check WED_TX_DMA*/ - if ((state->tx_dma_stat == 0xF && new_state->tx_dma_stat == 0xF) && - ((state->tx0_mib == new_state->tx0_mib) && - (state->tx1_mib == new_state->tx1_mib))) - ser_ctrl->tx_dma_err_cnt++; - else if ((state->tx_dma_stat == 0 && new_state->tx_dma_stat == 0) && - ((state->tx0_mib == new_state->tx0_mib) && - (state->tx1_mib == new_state->tx1_mib)) && - ((new_state->tx0_cidx != new_state->tx0_didx) || - (new_state->tx1_cidx != new_state->tx1_didx))) - ser_ctrl->tx_dma_err_cnt++; - else - ser_ctrl->tx_dma_err_cnt = 0; -} - -#ifdef WED_HW_TX_SUPPORT -/* -* -*/ -void wed_ser_err_cnt_wdma_update(struct wed_ser_ctrl *ser_ctrl, - struct wed_ser_state *new_state) -{ - struct wed_ser_state *state = &ser_ctrl->state; - /*check WED_WDMA_DRV*/ - if ((state->wdma_stat == 0x8 && new_state->wdma_stat == 0x8) || - (state->wdma_stat == 0x5 && new_state->wdma_stat == 0x5)) { - if ((state->wdma_rx0_mib == new_state->wdma_rx0_mib) && - (state->wdma_rx1_mib == new_state->wdma_rx1_mib)) { - ser_ctrl->wdma_err_cnt++; - } else { - ser_ctrl->wdma_err_cnt = 0; - } - } else { - ser_ctrl->wdma_err_cnt = 0; - } -} - -/* -* -*/ -void wed_ser_err_cnt_bm_update(struct wed_ser_ctrl *ser_ctrl, - struct wed_ser_state *new_state) -{ - struct wed_ser_state *state = &ser_ctrl->state; - /*check TX_BM*/ -#ifdef WED_WDMA_RECYCLE - unsigned int recy_diff = WED_RECYCLE_DIFF(ser_ctrl->period_time); - if (((new_state->wdma_rx0_recycle_mib - state->wdma_rx0_recycle_mib) <= - recy_diff) && - ((new_state->wdma_rx1_recycle_mib - state->wdma_rx1_recycle_mib) <= - recy_diff)) - goto normal; -#else - if (state->wdma_stat != 0x9 || new_state->wdma_stat != 0x9) - goto normal; - - if ((state->wdma_rx0_mib != new_state->wdma_rx0_mib) || - (state->wdma_rx1_mib != new_state->wdma_rx1_mib)) - goto normal; -#endif /*WED_WDMA_RECYCLE*/ - - if (new_state->bm_tx_stat != 0) - goto normal; - - if ((state->txbm_to_wdma_mib != new_state->txbm_to_wdma_mib) || - (state->txfree_to_bm_mib != new_state->txfree_to_bm_mib)) - goto normal; - - /*error ocured*/ - ser_ctrl->tx_bm_err_cnt++; - return; -normal: - ser_ctrl->tx_bm_err_cnt = 0; -} -#endif /*WED_HW_TX_SUPPORT*/ -#endif /*WED_TX_SUPPORT*/ -/* -* -*/ -static void wed_ser_error_cnt_update(struct wed_entry *wed, - struct wed_ser_state *new_state) -{ - struct wed_ser_ctrl *ser_ctrl = &wed->ser_ctrl; - struct wed_ser_state *state = &ser_ctrl->state; - - spin_lock(&ser_ctrl->ser_lock); -#ifdef WED_TX_SUPPORT - wed_ser_err_cnt_wpdma_update(ser_ctrl, new_state); - wed_ser_err_cnt_txdma_update(ser_ctrl, new_state); -#ifdef WED_HW_TX_SUPPORT - wed_ser_err_cnt_wdma_update(ser_ctrl, new_state); - wed_ser_err_cnt_bm_update(ser_ctrl, new_state); -#endif /*WED_HW_TX_SUPPORT*/ -#endif /*WED_TX_SUPPORT*/ - - /*update new value to ser ctrl*/ - memcpy(state, new_state, sizeof(struct wed_ser_state)); - spin_unlock(&ser_ctrl->ser_lock); -} - -/* -* -*/ -static void wed_ser_detect(struct wed_entry *wed) -{ - struct wed_ser_state state; - - memset(&state, 0, sizeof(state)); - /*update status*/ - whnat_hal_ser_update(wed, &state); - - /*update error count*/ - wed_ser_error_cnt_update(wed, &state); - - /*check ser should trigger or not*/ - if (wed_ser_check(wed) == TRUE) { - WHNAT_DBG(WHNAT_DBG_OFF, - "%s(): wed_ser_detect!!!, wed->irq=%d\n", __func__, - wed->irq); - if (wed->ser_ctrl.recovery == TRUE) { - whnat_hal_ser_trigger((struct whnat_entry *)wed->whnat); - } else { - wed_ser_dump(wed); - wed->ser_ctrl.period_time = 1000; - WHNAT_DBG( - WHNAT_DBG_OFF, - "%s(): not recovery ~, delay periodic check to 1 sec for debug!", - __func__); - } - } - return; -} - -/* -* -*/ -static int wed_ser_task(void *data) -{ - struct wed_entry *wed = data; - struct wed_ser_ctrl *ser_ctrl = &wed->ser_ctrl; - - while (!kthread_should_stop()) { - wed_ser_detect(wed); - msleep(ser_ctrl->period_time); - } - WHNAT_DBG(WHNAT_DBG_OFF, "%s(): wed_ser exist, wed->irq=%d!\n", - __func__, wed->irq); - return 0; -} - -/* -* -*/ -void wed_ser_dump(struct wed_entry *wed) -{ - struct wed_ser_ctrl *ser_ctrl = &wed->ser_ctrl; - struct wed_ser_state *state = &ser_ctrl->state; - - WHNAT_DBG(WHNAT_DBG_OFF, "======wed ser status========\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "wpdma_tx_drv_ser_cnt\t:%d\n", - ser_ctrl->wpdma_ser_cnt); - WHNAT_DBG(WHNAT_DBG_OFF, "wdma_rx_drv_ser_cnt\t:%d\n", - ser_ctrl->wdma_ser_cnt); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_ser_cnt\t:%d\n", - ser_ctrl->tx_dma_ser_cnt); - WHNAT_DBG(WHNAT_DBG_OFF, "bm_tx_ser_cnt\t\t:%d\n", - ser_ctrl->tx_bm_ser_cnt); - WHNAT_DBG(WHNAT_DBG_OFF, "======current ser indicate========\n"); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_err_cnt\t:%d\n", - ser_ctrl->tx_dma_err_cnt); - WHNAT_DBG(WHNAT_DBG_OFF, "wdma_rx_drv_err_cnt\t:%d\n", - ser_ctrl->wdma_err_cnt); - WHNAT_DBG(WHNAT_DBG_OFF, "wpdma_tx_drv_idle_cnt\t:%d\n", - ser_ctrl->wpdma_idle_cnt); - WHNAT_DBG(WHNAT_DBG_OFF, "bm_err_cnt\t\t:%d\n", - ser_ctrl->tx_bm_err_cnt); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_state\t:%d\n", state->tx_dma_stat); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_tx0_mib\t:%d\n", state->tx0_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_tx0_cidx\t:%d\n", state->tx0_cidx); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_tx0_didx\t:%d\n", state->tx0_didx); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_tx1_mib\t:%d\n", state->tx1_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_tx1_cidx\t:%d\n", state->tx1_cidx); - WHNAT_DBG(WHNAT_DBG_OFF, "wed_tx_dma_tx1_didx\t:%d\n", state->tx1_didx); - WHNAT_DBG(WHNAT_DBG_OFF, "wdma_rx_drv_state\t:%d\n", state->wdma_stat); - WHNAT_DBG(WHNAT_DBG_OFF, "wdma_rx_drv_rx0_mib\t:%d\n", - state->wdma_rx0_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "wdma_rx_drv_rx1_mib\t:%d\n", - state->wdma_rx1_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "wdma_rx_drv_rx0_rc_mib\t:%d\n", - state->wdma_rx0_recycle_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "wdma_rx_drv_rx1_rc_mib\t:%d\n", - state->wdma_rx1_recycle_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "wpdma_tx_drv_state\t:%d\n", - state->wpdma_stat); - WHNAT_DBG(WHNAT_DBG_OFF, "wpdma_tx_drv_tx0_mib\t:%d\n", - state->wpdma_tx0_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "wpdma_tx_drv_tx0_mib\t:%d\n", - state->wpdma_tx1_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "bm_tx_state\t\t:%d\n", state->bm_tx_stat); - WHNAT_DBG(WHNAT_DBG_OFF, "txfree_to_bm_mib\t:%d\n", - state->txfree_to_bm_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "txbm_to_wdma_mib\t:%d\n", - state->txbm_to_wdma_mib); - WHNAT_DBG(WHNAT_DBG_OFF, "txbm_to_wdma_diff\t:%d\n", - (state->txbm_to_wdma_mib - state->txfree_to_bm_mib)); -} - -/* -* -*/ -int wed_ser_init(struct wed_entry *wed) -{ - int ret = 0; - char name[32] = ""; - struct wed_ser_ctrl *ser_ctrl = &wed->ser_ctrl; - struct whnat_entry *whnat = wed->whnat; - - snprintf(name, sizeof(name), "%s%d", WED_THREAD_NAME, whnat->idx); - ser_ctrl->ser_task = kthread_create(wed_ser_task, wed, name); - if (IS_ERR(ser_ctrl->ser_task)) { - ser_ctrl->ser_task = NULL; - goto err; - } - - ser_ctrl->tx_dma_err_cnt = 0; - ser_ctrl->tx_dma_ser_cnt = 0; - ser_ctrl->wdma_err_cnt = 0; - ser_ctrl->wdma_ser_cnt = 0; - ser_ctrl->wpdma_idle_cnt = 0; - ser_ctrl->wpdma_ser_cnt = 0; - ser_ctrl->tx_bm_err_cnt = 0; - ser_ctrl->tx_bm_ser_cnt = 0; - ser_ctrl->recovery = WED_SER_RECOVERY_DEFAULT; - ser_ctrl->period_time = WED_THREAD_PERIOD; - memset(&ser_ctrl->state, 0, sizeof(ser_ctrl->state)); - spin_lock_init(&ser_ctrl->ser_lock); - wake_up_process(ser_ctrl->ser_task); - return 0; -err: - return ret; -} - -/* -* -*/ -void wed_ser_exit(struct wed_entry *wed) -{ - struct wed_ser_ctrl *ser_ctrl = &wed->ser_ctrl; - - kthread_stop(ser_ctrl->ser_task); - spin_lock_init(&ser_ctrl->ser_lock); - memset(&ser_ctrl->state, 0, sizeof(ser_ctrl->state)); -} - -#endif /*ERR_RECOVERY*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_wifi.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_wifi.h deleted file mode 100644 index a10e94b61b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/plug_in/whnat/woe_wifi.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: wifi_offload - woe_wifi.h -*/ -#ifndef _WOE_WIFI_H_ - -#ifdef MT7615 -#include "woe_mt7615.h" -#endif - -/*TX hook structure*/ -struct wlan_tx_info { - UCHAR *pkt; - UINT32 bssidx; - UINT32 wcid; - UINT32 ringidx; -}; - -struct wifi_entry { - void *cookie; - unsigned char slot_id; - unsigned int irq; - unsigned int wpdma_base; - unsigned int tx_ring_num; - unsigned int *int_mask; - unsigned long base_addr; -}; - -/*default SER status*/ -#define WIFI_ERR_RECOV_NONE 0x10 - -void dump_wifi_value(struct wifi_entry *wifi, char *name, unsigned int addr); -/*wifi related hal*/ -void wifi_fbuf_init(unsigned char *fbuf, unsigned int pkt_pa, - unsigned int tkid); -void wifi_tx_tuple_add(void *woe, unsigned char *tx_info); -void wifi_tx_tuple_reset(void); -char wifi_hw_tx_allow(void *cookie, unsigned char *tx_info); -void wifi_dma_cfg_wrapper(int wifi_cfg, unsigned char *dma_cfg); -void wifi_dump_tx_ring_info(struct wifi_entry *wifi, unsigned char ring_id, - unsigned int idx); -void wifi_chip_cr_mirror_set(struct wifi_entry *wifi, unsigned char enable); -void wifi_chip_probe(struct wifi_entry *wifi, unsigned int irq); -void wifi_chip_remove(struct wifi_entry *wifi); -unsigned int wifi_chip_id_get(void *cookie); -unsigned int wifi_whnat_en_get(void *cookie); -void wifi_whnat_en_set(void *cookie, unsigned int en); -unsigned int wifi_ser_status(void *ser_ctrl); -int wifi_slot_get(void *cookie); -void wifi_cap_get(struct wifi_entry *wifi); -unsigned int wifi_wpdma_base_get(void *cookie); - -#endif /*_WOE_WIFI_H_*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/bn_lib.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/bn_lib.c deleted file mode 100644 index a9c0ffe38f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/bn_lib.c +++ /dev/null @@ -1,7007 +0,0 @@ -/* ==================================================================== - * Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgment: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgment: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -#ifdef DOT11_SAE_OPENSSL_BN - -#include "security/bn.h" - -static BIGNUM *BN_mod_inverse_no_branch(BIGNUM *in, const BIGNUM *a, - const BIGNUM *n, BN_CTX *ctx); - -void OPENSSL_cleanse(void *ptr, ULONG len) -{ - memset(ptr, 0, len); -} - -const BIGNUM *BN_value_one(void) -{ - static const BN_ULONG data_one = 1L; - static const BIGNUM const_one = { (BN_ULONG *)&data_one, 1, 1, 0, - BN_FLG_STATIC_DATA }; - return &const_one; -} - -int BN_num_bits_word(BN_ULONG l) -{ - static const char bits[256] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - }; - { - if (l & 0xffff0000L) { - if (l & 0xff000000L) - return (bits[(int)(l >> 24L)] + 24); - else - return (bits[(int)(l >> 16L)] + 16); - } else { - if (l & 0xff00L) - return (bits[(int)(l >> 8)] + 8); - else - return bits[(int)(l)]; - } - } -} - -int BN_num_bits(const BIGNUM *a) -{ - int i = a->top - 1; - bn_check_top(a); - - if (BN_is_zero(a)) - return 0; - - return ((i * BN_BITS2) + BN_num_bits_word(a->d[i])); -} - -static void bn_free_d(BIGNUM *a) -{ - if (a->d) - os_free_mem(a->d); -} - -void BN_clear_free(BIGNUM *a) -{ - int i; - - if (a == NULL) - return; - - bn_check_top(a); - - if (a->d != NULL) { - memset(a->d, 0, a->dmax * sizeof(a->d[0])); - - if (!BN_get_flags(a, BN_FLG_STATIC_DATA)) - bn_free_d(a); - } - - i = BN_get_flags(a, BN_FLG_MALLOCED); - memset(a, 0, sizeof(*a)); - - if (i) - os_free_mem(a); -} - -void BN_free(BIGNUM *a) -{ - if (a == NULL) - return; - - bn_check_top(a); - - if (!BN_get_flags(a, BN_FLG_STATIC_DATA)) - bn_free_d(a); - - if (a->flags & BN_FLG_MALLOCED) - os_free_mem(a); - else { - a->d = NULL; - } -} - -void bn_init(BIGNUM *a) -{ - static BIGNUM nilbn; - *a = nilbn; - bn_check_top(a); -} - -BIGNUM *BN_new(void) -{ - BIGNUM *ret; - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(struct bignum_st)); - - if (ret == NULL) - return NULL; - - ret->flags = BN_FLG_MALLOCED; - /* ellis */ - ret->top = 0; - ret->dmax = 0; - ret->d = NULL; - ret->neg = 0; - bn_check_top(ret); - return ret; -} - -BIGNUM *BN_secure_new(void) -{ - BIGNUM *ret = BN_new(); - - if (ret != NULL) - ret->flags |= BN_FLG_SECURE; - - return ret; -} - -/* This is used by bn_expand2() */ -/* The caller MUST check that words > b->dmax before calling this */ -static BN_ULONG *bn_expand_internal(const BIGNUM *b, int words) -{ - BN_ULONG *A, *a = NULL; - const BN_ULONG *B; - int i; - bn_check_top(b); - - if (words > (INT_MAX / (4 * BN_BITS2))) { - BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_BIGNUM_TOO_LONG); - return NULL; - } - - if (BN_get_flags(b, BN_FLG_STATIC_DATA)) { - BNerr(BN_F_BN_EXPAND_INTERNAL, - BN_R_EXPAND_ON_STATIC_BIGNUM_DATA); - return NULL; - } - - os_alloc_mem(NULL, (UCHAR **)&A, sizeof(BN_ULONG) * words); - memset(A, 0, sizeof(BN_ULONG) * words); - a = A; - - if (A == NULL) { - BNerr(BN_F_BN_EXPAND_INTERNAL, ERR_R_MALLOC_FAILURE); - return NULL; - } - - B = b->d; - - /* Check if the previous number needs to be copied */ - if (B != NULL) { - for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) { - /* - * The fact that the loop is unrolled - * 4-wise is a tribute to Intel. It's - * the one that doesn't have enough - * registers to accommodate more data. - * I'd unroll it 8-wise otherwise:-) - * - * - */ - BN_ULONG a0, a1, a2, a3; - a0 = B[0]; - a1 = B[1]; - a2 = B[2]; - a3 = B[3]; - A[0] = a0; - A[1] = a1; - A[2] = a2; - A[3] = a3; - } - - switch (b->top & 3) { - case 3: - A[2] = B[2]; - - /* fall thru */ - case 2: - A[1] = B[1]; - - /* fall thru */ - case 1: - A[0] = B[0]; - - /* fall thru */ - case 0: - /* Without the "case 0" some old optimizers got this wrong. */ - ; - } - } - - return a; -} - -/* - * This is an internal function that should not be used in applications. It - * ensures that 'b' has enough room for a 'words' word number and initialises - * any unused part of b->d with leading zeros. It is mostly used by the - * various BIGNUM routines. If there is an error, NULL is returned. If not, - * 'b' is returned. - */ - -BIGNUM *bn_expand2(BIGNUM *b, int words) -{ - bn_check_top(b); - - if (words > b->dmax) { - BN_ULONG *a = bn_expand_internal(b, words); - - if (!a) - return NULL; - - if (b->d) { - memset(b->d, 0, b->dmax * sizeof(b->d[0])); - bn_free_d(b); - } - - b->d = a; - b->dmax = words; - } - - bn_check_top(b); - return b; -} - -static inline BIGNUM *bn_expand(BIGNUM *a, int bits) -{ - if (bits > (INT_MAX - BN_BITS2 + 1)) - return NULL; - - if (((bits + BN_BITS2 - 1) / BN_BITS2) <= (a)->dmax) - return a; - - return bn_expand2((a), (bits + BN_BITS2 - 1) / BN_BITS2); -} - -BIGNUM *BN_dup(const BIGNUM *a) -{ - BIGNUM *t; - - if (a == NULL) - return NULL; - - bn_check_top(a); - t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new(); - - if (t == NULL) - return NULL; - - if (!BN_copy(t, a)) { - BN_free(t); - return NULL; - } - - bn_check_top(t); - return t; -} - -BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b) -{ - int i; - BN_ULONG *A; - const BN_ULONG *B; - bn_check_top(b); - - if (a == b) - return a; - - if (bn_wexpand(a, b->top) == NULL) - return NULL; - - A = a->d; - B = b->d; - - for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) { - BN_ULONG a0, a1, a2, a3; - a0 = B[0]; - a1 = B[1]; - a2 = B[2]; - a3 = B[3]; - A[0] = a0; - A[1] = a1; - A[2] = a2; - A[3] = a3; - } - - /* ultrix cc workaround, see comments in bn_expand_internal */ - switch (b->top & 3) { - case 3: - A[2] = B[2]; - - /* fall thru */ - case 2: - A[1] = B[1]; - - /* fall thru */ - case 1: - A[0] = B[0]; - - /* fall thru */ - case 0:; - } - - if (BN_get_flags(b, BN_FLG_CONSTTIME) != 0) - BN_set_flags(a, BN_FLG_CONSTTIME); - - a->top = b->top; - a->neg = b->neg; - bn_check_top(a); - return a; -} - -void BN_swap(BIGNUM *a, BIGNUM *b) -{ - int flags_old_a, flags_old_b; - BN_ULONG *tmp_d; - int tmp_top, tmp_dmax, tmp_neg; - bn_check_top(a); - bn_check_top(b); - flags_old_a = a->flags; - flags_old_b = b->flags; - tmp_d = a->d; - tmp_top = a->top; - tmp_dmax = a->dmax; - tmp_neg = a->neg; - a->d = b->d; - a->top = b->top; - a->dmax = b->dmax; - a->neg = b->neg; - b->d = tmp_d; - b->top = tmp_top; - b->dmax = tmp_dmax; - b->neg = tmp_neg; - a->flags = (flags_old_a & BN_FLG_MALLOCED) | - (flags_old_b & BN_FLG_STATIC_DATA); - b->flags = (flags_old_b & BN_FLG_MALLOCED) | - (flags_old_a & BN_FLG_STATIC_DATA); - bn_check_top(a); - bn_check_top(b); -} - -void BN_clear(BIGNUM *a) -{ - bn_check_top(a); - - if (a->d != NULL) - memset(a->d, 0, sizeof(*a->d) * a->dmax); - - a->top = 0; - a->neg = 0; -} - -BN_ULONG BN_get_word(const BIGNUM *a) -{ - if (a->top > 1) - return BN_MASK2; - else if (a->top == 1) - return a->d[0]; - - /* a->top == 0 */ - return 0; -} - -int BN_set_word(BIGNUM *a, BN_ULONG w) -{ - bn_check_top(a); - - if (bn_expand(a, (int)sizeof(BN_ULONG) * 8) == NULL) - return 0; - - a->neg = 0; - a->d[0] = w; - a->top = (w ? 1 : 0); - bn_check_top(a); - return 1; -} - -BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret) -{ - unsigned int i, m; - unsigned int n; - BN_ULONG l; - BIGNUM *bn = NULL; - - if (ret == NULL) - ret = bn = BN_new(); - - if (ret == NULL) - return NULL; - - bn_check_top(ret); - - /* Skip leading zero's. */ - for (; len > 0 && *s == 0; s++, len--) - continue; - - n = len; - - if (n == 0) { - ret->top = 0; - return ret; - } - - i = ((n - 1) / BN_BYTES) + 1; - m = ((n - 1) % (BN_BYTES)); - - if (bn_wexpand(ret, (int)i) == NULL) { - BN_free(bn); - return NULL; - } - - ret->top = i; - ret->neg = 0; - l = 0; - - while (n--) { - l = (l << 8L) | *(s++); - - if (m-- == 0) { - ret->d[--i] = l; - l = 0; - m = BN_BYTES - 1; - } - } - - /* - * need to call this due to clear byte at top if avoiding having the top - * bit set (-ve number) - */ - bn_correct_top(ret); - return ret; -} - -/* ignore negative */ -static int bn2binpad(const BIGNUM *a, unsigned char *to, int tolen) -{ - int i; - BN_ULONG l; - bn_check_top(a); - i = BN_num_bytes(a); - - if (tolen == -1) - tolen = i; - else if (tolen < i) - return -1; - - /* Add leading zeroes if necessary */ - if (tolen > i) { - memset(to, 0, tolen - i); - to += tolen - i; - } - - while (i--) { - l = a->d[i / BN_BYTES]; - *(to++) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff; - } - - return tolen; -} - -int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen) -{ - if (tolen < 0) - return -1; - - return bn2binpad(a, to, tolen); -} - -int BN_bn2bin(const BIGNUM *a, unsigned char *to) -{ - return bn2binpad(a, to, -1); -} - -BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret) -{ - unsigned int i, m; - unsigned int n; - BN_ULONG l; - BIGNUM *bn = NULL; - - if (ret == NULL) - ret = bn = BN_new(); - - if (ret == NULL) - return NULL; - - bn_check_top(ret); - s += len; - - /* Skip trailing zeroes. */ - for (; len > 0 && s[-1] == 0; s--, len--) - continue; - - n = len; - - if (n == 0) { - ret->top = 0; - return ret; - } - - i = ((n - 1) / BN_BYTES) + 1; - m = ((n - 1) % (BN_BYTES)); - - if (bn_wexpand(ret, (int)i) == NULL) { - BN_free(bn); - return NULL; - } - - ret->top = i; - ret->neg = 0; - l = 0; - - while (n--) { - s--; - l = (l << 8L) | *s; - - if (m-- == 0) { - ret->d[--i] = l; - l = 0; - m = BN_BYTES - 1; - } - } - - /* - * need to call this due to clear byte at top if avoiding having the top - * bit set (-ve number) - */ - bn_correct_top(ret); - return ret; -} - -int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen) -{ - int i; - BN_ULONG l; - bn_check_top(a); - i = BN_num_bytes(a); - - if (tolen < i) - return -1; - - /* Add trailing zeroes if necessary */ - if (tolen > i) - memset(to + i, 0, tolen - i); - - to += i; - - while (i--) { - l = a->d[i / BN_BYTES]; - to--; - *to = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff; - } - - return tolen; -} - -int BN_ucmp(const BIGNUM *a, const BIGNUM *b) -{ - int i; - BN_ULONG t1, t2, *ap, *bp; - bn_check_top(a); - bn_check_top(b); - i = a->top - b->top; - - if (i != 0) - return i; - - ap = a->d; - bp = b->d; - - for (i = a->top - 1; i >= 0; i--) { - t1 = ap[i]; - t2 = bp[i]; - - if (t1 != t2) - return ((t1 > t2) ? 1 : -1); - } - - return 0; -} - -int BN_cmp(const BIGNUM *a, const BIGNUM *b) -{ - int i; - int gt, lt; - BN_ULONG t1, t2; - - if ((a == NULL) || (b == NULL)) { - if (a != NULL) - return -1; - else if (b != NULL) - return 1; - else - return 0; - } - - bn_check_top(a); - bn_check_top(b); - - if (a->neg != b->neg) { - if (a->neg) - return -1; - else - return 1; - } - - if (a->neg == 0) { - gt = 1; - lt = -1; - } else { - gt = -1; - lt = 1; - } - - if (a->top > b->top) - return gt; - - if (a->top < b->top) - return lt; - - for (i = a->top - 1; i >= 0; i--) { - t1 = a->d[i]; - t2 = b->d[i]; - - if (t1 > t2) - return gt; - - if (t1 < t2) - return lt; - } - - return 0; -} - -int BN_set_bit(BIGNUM *a, int n) -{ - int i, j, k; - - if (n < 0) - return 0; - - i = n / BN_BITS2; - j = n % BN_BITS2; - - if (a->top <= i) { - if (bn_wexpand(a, i + 1) == NULL) - return 0; - - for (k = a->top; k < i + 1; k++) - a->d[k] = 0; - - a->top = i + 1; - } - - a->d[i] |= (((BN_ULONG)1) << j); - bn_check_top(a); - return 1; -} - -int BN_clear_bit(BIGNUM *a, int n) -{ - int i, j; - bn_check_top(a); - - if (n < 0) - return 0; - - i = n / BN_BITS2; - j = n % BN_BITS2; - - if (a->top <= i) - return 0; - - a->d[i] &= (~(((BN_ULONG)1) << j)); - bn_correct_top(a); - return 1; -} - -int BN_is_bit_set(const BIGNUM *a, int n) -{ - int i, j; - bn_check_top(a); - - if (n < 0) - return 0; - - i = n / BN_BITS2; - j = n % BN_BITS2; - - if (a->top <= i) - return 0; - - return (int)(((a->d[i]) >> j) & ((BN_ULONG)1)); -} - -int BN_mask_bits(BIGNUM *a, int n) -{ - int b, w; - bn_check_top(a); - - if (n < 0) - return 0; - - w = n / BN_BITS2; - b = n % BN_BITS2; - - if (w >= a->top) - return 0; - - if (b == 0) - a->top = w; - else { - a->top = w + 1; - a->d[w] &= ~(BN_MASK2 << b); - } - - bn_correct_top(a); - return 1; -} - -void BN_set_negative(BIGNUM *a, int b) -{ - if (b && !BN_is_zero(a)) - a->neg = 1; - else - a->neg = 0; -} - -int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n) -{ - int i; - BN_ULONG aa, bb; - aa = a[n - 1]; - bb = b[n - 1]; - - if (aa != bb) - return ((aa > bb) ? 1 : -1); - - for (i = n - 2; i >= 0; i--) { - aa = a[i]; - bb = b[i]; - - if (aa != bb) - return ((aa > bb) ? 1 : -1); - } - - return 0; -} - -/* - * Here follows a specialised variants of bn_cmp_words(). It has the - * capability of performing the operation on arrays of different sizes. The - * sizes of those arrays is expressed through cl, which is the common length - * ( basically, min(len(a),len(b)) ), and dl, which is the delta between the - * two lengths, calculated as len(a)-len(b). All lengths are the number of - * BN_ULONGs... - */ - -int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl) -{ - int n, i; - n = cl - 1; - - if (dl < 0) { - for (i = dl; i < 0; i++) { - if (b[n - i] != 0) - return -1; /* a < b */ - } - } - - if (dl > 0) { - for (i = dl; i > 0; i--) { - if (a[n + i] != 0) - return 1; /* a > b */ - } - } - - return bn_cmp_words(a, b, cl); -} - -/* - * Constant-time conditional swap of a and b. - * a and b are swapped if condition is not 0. The code assumes that at most one bit of condition is set. - * nwords is the number of words to swap. The code assumes that at least nwords are allocated in both a and b, - * and that no more than nwords are used by either a or b. - * a and b cannot be the same number - */ -void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords) -{ - BN_ULONG t; - int i; - bn_wcheck_size(a, nwords); - bn_wcheck_size(b, nwords); - ASSERT(a != b); - ASSERT((condition & (condition - 1)) == 0); - ASSERT(sizeof(BN_ULONG) >= sizeof(int)); - condition = ((condition - 1) >> (BN_BITS2 - 1)) - 1; - t = (a->top ^ b->top) & condition; - a->top ^= t; - b->top ^= t; -#define BN_CONSTTIME_SWAP(ind) \ - do { \ - t = (a->d[ind] ^ b->d[ind]) & condition; \ - a->d[ind] ^= t; \ - b->d[ind] ^= t; \ - } while (0) - - switch (nwords) { - default: - for (i = 10; i < nwords; i++) - BN_CONSTTIME_SWAP(i); - - /* Fallthrough */ - case 10: - BN_CONSTTIME_SWAP(9); /* Fallthrough */ - - case 9: - BN_CONSTTIME_SWAP(8); /* Fallthrough */ - - case 8: - BN_CONSTTIME_SWAP(7); /* Fallthrough */ - - case 7: - BN_CONSTTIME_SWAP(6); /* Fallthrough */ - - case 6: - BN_CONSTTIME_SWAP(5); /* Fallthrough */ - - case 5: - BN_CONSTTIME_SWAP(4); /* Fallthrough */ - - case 4: - BN_CONSTTIME_SWAP(3); /* Fallthrough */ - - case 3: - BN_CONSTTIME_SWAP(2); /* Fallthrough */ - - case 2: - BN_CONSTTIME_SWAP(1); /* Fallthrough */ - - case 1: - BN_CONSTTIME_SWAP(0); - } - -#undef BN_CONSTTIME_SWAP -} - -/* Bits of security, see SP800-57 */ - -int BN_security_bits(int L, int N) -{ - int secbits, bits; - - if (L >= 15360) - secbits = 256; - else if (L >= 7680) - secbits = 192; - else if (L >= 3072) - secbits = 128; - else if (L >= 2048) - secbits = 112; - else if (L >= 1024) - secbits = 80; - else - return 0; - - if (N == -1) - return secbits; - - bits = N / 2; - - if (bits < 80) - return 0; - - return bits >= secbits ? secbits : bits; -} - -void BN_zero_ex(BIGNUM *a) -{ - a->top = 0; - a->neg = 0; -} - -int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w) -{ - return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0)); -} - -int BN_is_zero(const BIGNUM *a) -{ - return a->top == 0; -} - -int BN_is_one(const BIGNUM *a) -{ - return BN_abs_is_word(a, 1) && !a->neg; -} - -int BN_is_word(const BIGNUM *a, const BN_ULONG w) -{ - return BN_abs_is_word(a, w) && (!w || !a->neg); -} - -int BN_is_odd(const BIGNUM *a) -{ - return (a->top > 0) && (a->d[0] & 1); -} - -int BN_is_negative(const BIGNUM *a) -{ - return (a->neg != 0); -} - -int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, BN_CTX *ctx) -{ - return BN_mod_mul_montgomery(r, a, &(mont->RR), mont, ctx); -} - -void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags) -{ - dest->d = b->d; - dest->top = b->top; - dest->dmax = b->dmax; - dest->neg = b->neg; - dest->flags = - ((dest->flags & BN_FLG_MALLOCED) | - (b->flags & ~BN_FLG_MALLOCED) | BN_FLG_STATIC_DATA | flags); -} - -BN_GENCB *BN_GENCB_new(void) -{ - BN_GENCB *ret; - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(BN_GENCB)); - - if (ret == NULL) - return NULL; - - return ret; -} - -void BN_GENCB_free(BN_GENCB *cb) -{ - if (cb == NULL) - return; - - os_free_mem(cb); -} - -void BN_set_flags(BIGNUM *b, int n) -{ - b->flags |= n; -} - -int BN_get_flags(const BIGNUM *b, int n) -{ - return b->flags & n; -} - -/* Populate a BN_GENCB structure with an "old"-style callback */ -void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback)(int, int, void *), - void *cb_arg) -{ - BN_GENCB *tmp_gencb = gencb; - tmp_gencb->ver = 1; - tmp_gencb->arg = cb_arg; - tmp_gencb->cb.cb_1 = callback; -} - -/* Populate a BN_GENCB structure with a "new"-style callback */ -void BN_GENCB_set(BN_GENCB *gencb, int (*callback)(int, int, BN_GENCB *), - void *cb_arg) -{ - BN_GENCB *tmp_gencb = gencb; - tmp_gencb->ver = 2; - tmp_gencb->arg = cb_arg; - tmp_gencb->cb.cb_2 = callback; -} - -void *BN_GENCB_get_arg(BN_GENCB *cb) -{ - return cb->arg; -} - -BIGNUM *bn_wexpand(BIGNUM *a, int words) -{ - return (words <= a->dmax) ? a : bn_expand2(a, words); -} - -void bn_correct_top(BIGNUM *a) -{ - BN_ULONG *ftl; - int tmp_top = a->top; - - if (tmp_top > 0) { - for (ftl = &(a->d[tmp_top]); tmp_top > 0; tmp_top--) { - ftl--; - - if (*ftl != 0) - break; - } - - a->top = tmp_top; - } - - if (a->top == 0) - a->neg = 0; - - bn_pollute(a); -} - -#define LBITS(a) ((a)&BN_MASK2l) -#define HBITS(a) (((a) >> BN_BITS4) & BN_MASK2l) -#define L2HBITS(a) (((a) << BN_BITS4) & BN_MASK2) - -#define mul64(l, h, bl, bh) \ - { \ - BN_ULONG m, m1, lt, ht; \ - \ - lt = l; \ - ht = h; \ - m = (bh) * (lt); \ - lt = (bl) * (lt); \ - m1 = (bl) * (ht); \ - ht = (bh) * (ht); \ - m = (m + m1) & BN_MASK2; \ - if (m < m1) \ - ht += L2HBITS((BN_ULONG)1); \ - ht += HBITS(m); \ - m1 = L2HBITS(m); \ - lt = (lt + m1) & BN_MASK2; \ - if (lt < m1) \ - ht++; \ - (l) = lt; \ - (h) = ht; \ - } - -#define sqr64(lo, ho, in) \ - { \ - BN_ULONG l, h, m; \ - \ - h = (in); \ - l = LBITS(h); \ - h = HBITS(h); \ - m = (l) * (h); \ - l *= l; \ - h *= h; \ - h += (m & BN_MASK2h1) >> (BN_BITS4 - 1); \ - m = (m & BN_MASK2l) << (BN_BITS4 + 1); \ - l = (l + m) & BN_MASK2; \ - if (l < m) \ - h++; \ - (lo) = l; \ - (ho) = h; \ - } - -#define mul_add(r, a, bl, bh, c) \ - { \ - BN_ULONG l, h; \ - \ - h = (a); \ - l = LBITS(h); \ - h = HBITS(h); \ - mul64(l, h, (bl), (bh)); \ - \ - /* non-multiply part */ \ - l = (l + (c)) & BN_MASK2; \ - if (l < (c)) \ - h++; \ - (c) = (r); \ - l = (l + (c)) & BN_MASK2; \ - if (l < (c)) \ - h++; \ - (c) = h & BN_MASK2; \ - (r) = l; \ - } - -#define mul(r, a, bl, bh, c) \ - { \ - BN_ULONG l, h; \ - \ - h = (a); \ - l = LBITS(h); \ - h = HBITS(h); \ - mul64(l, h, (bl), (bh)); \ - \ - /* non-multiply part */ \ - l += (c); \ - if ((l & BN_MASK2) < (c)) \ - h++; \ - (c) = h & BN_MASK2; \ - (r) = l & BN_MASK2; \ - } - -static BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, - BN_ULONG w) -{ - BN_ULONG c = 0; - BN_ULONG bl, bh; - - if (num <= 0) - return ((BN_ULONG)0); - - bl = LBITS(w); - bh = HBITS(w); - - for (;;) { - mul_add(rp[0], ap[0], bl, bh, c); - - if (--num == 0) - break; - - mul_add(rp[1], ap[1], bl, bh, c); - - if (--num == 0) - break; - - mul_add(rp[2], ap[2], bl, bh, c); - - if (--num == 0) - break; - - mul_add(rp[3], ap[3], bl, bh, c); - - if (--num == 0) - break; - - ap += 4; - rp += 4; - } - - return c; -} - -static BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, - BN_ULONG w) -{ - BN_ULONG carry = 0; - BN_ULONG bl, bh; - - if (num <= 0) - return ((BN_ULONG)0); - - bl = LBITS(w); - bh = HBITS(w); - - for (;;) { - mul(rp[0], ap[0], bl, bh, carry); - - if (--num == 0) - break; - - mul(rp[1], ap[1], bl, bh, carry); - - if (--num == 0) - break; - - mul(rp[2], ap[2], bl, bh, carry); - - if (--num == 0) - break; - - mul(rp[3], ap[3], bl, bh, carry); - - if (--num == 0) - break; - - ap += 4; - rp += 4; - } - - return carry; -} - -static void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) -{ - if (n <= 0) - return; - - for (;;) { - sqr64(r[0], r[1], a[0]); - - if (--n == 0) - break; - - sqr64(r[2], r[3], a[1]); - - if (--n == 0) - break; - - sqr64(r[4], r[5], a[2]); - - if (--n == 0) - break; - - sqr64(r[6], r[7], a[3]); - - if (--n == 0) - break; - - a += 4; - r += 8; - } -} - -static BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - int n) -{ - BN_ULONG c, l, t; - - if (n <= 0) - return ((BN_ULONG)0); - - c = 0; - - for (;;) { - t = a[0]; - t = (t + c) & BN_MASK2; - c = (t < c); - l = (t + b[0]) & BN_MASK2; - c += (l < t); - r[0] = l; - - if (--n <= 0) - break; - - t = a[1]; - t = (t + c) & BN_MASK2; - c = (t < c); - l = (t + b[1]) & BN_MASK2; - c += (l < t); - r[1] = l; - - if (--n <= 0) - break; - - t = a[2]; - t = (t + c) & BN_MASK2; - c = (t < c); - l = (t + b[2]) & BN_MASK2; - c += (l < t); - r[2] = l; - - if (--n <= 0) - break; - - t = a[3]; - t = (t + c) & BN_MASK2; - c = (t < c); - l = (t + b[3]) & BN_MASK2; - c += (l < t); - r[3] = l; - - if (--n <= 0) - break; - - a += 4; - b += 4; - r += 4; - } - - return ((BN_ULONG)c); -} - -static BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - int n) -{ - BN_ULONG t1, t2; - int c = 0; - - if (n <= 0) - return ((BN_ULONG)0); - - for (;;) { - t1 = a[0]; - t2 = b[0]; - r[0] = (t1 - t2 - c) & BN_MASK2; - - if (t1 != t2) - c = (t1 < t2); - - if (--n <= 0) - break; - - t1 = a[1]; - t2 = b[1]; - r[1] = (t1 - t2 - c) & BN_MASK2; - - if (t1 != t2) - c = (t1 < t2); - - if (--n <= 0) - break; - - t1 = a[2]; - t2 = b[2]; - r[2] = (t1 - t2 - c) & BN_MASK2; - - if (t1 != t2) - c = (t1 < t2); - - if (--n <= 0) - break; - - t1 = a[3]; - t2 = b[3]; - r[3] = (t1 - t2 - c) & BN_MASK2; - - if (t1 != t2) - c = (t1 < t2); - - if (--n <= 0) - break; - - a += 4; - b += 4; - r += 4; - } - - return c; -} - -/* Divide h,l by d and return the result. */ -/* I need to test this some more :-( */ -BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d) -{ - BN_ULONG dh, dl, q, ret = 0, th, tl, t; - int i, count = 2; - - if (d == 0) - return BN_MASK2; - - i = BN_num_bits_word(d); - /* ASSERT((i == BN_BITS2) || (h <= (BN_ULONG)1 << i)); check point */ - i = BN_BITS2 - i; - - if (h >= d) - h -= d; - - if (i) { - d <<= i; - h = (h << i) | (l >> (BN_BITS2 - i)); - l <<= i; - } - - dh = (d & BN_MASK2h) >> BN_BITS4; - dl = (d & BN_MASK2l); - - for (;;) { - if ((h >> BN_BITS4) == dh) - q = BN_MASK2l; - else - q = h / dh; - - th = q * dh; - tl = dl * q; - - for (;;) { - t = h - th; - - if ((t & BN_MASK2h) || - ((tl) <= - ((t << BN_BITS4) | ((l & BN_MASK2h) >> BN_BITS4)))) - break; - - q--; - th -= dh; - tl -= dl; - } - - t = (tl >> BN_BITS4); - tl = (tl << BN_BITS4) & BN_MASK2h; - th += t; - - if (l < tl) - th++; - - l -= tl; - - if (h < th) { - h += d; - q--; - } - - h -= th; - - if (--count == 0) - break; - - ret = q << BN_BITS4; - h = ((h << BN_BITS4) | (l >> BN_BITS4)) & BN_MASK2; - l = (l & BN_MASK2l) << BN_BITS4; - } - - ret |= q; - return ret; -} - -#define BN_MUL_COMBA -#define BN_SQR_COMBA - -#ifdef BN_MUL_COMBA - -#undef bn_mul_comba8 -#undef bn_mul_comba4 -#undef bn_sqr_comba8 -#undef bn_sqr_comba4 - -/* mul_add_c(a,b,c0,c1,c2) -- c+=a*b for three word number c=(c2,c1,c0) */ -/* mul_add_c2(a,b,c0,c1,c2) -- c+=2*a*b for three word number c=(c2,c1,c0) */ -/* sqr_add_c(a,i,c0,c1,c2) -- c+=a[i]^2 for three word number c=(c2,c1,c0) */ -/* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */ - -#define mul_add_c(a, b, c0, c1, c2) \ - do { \ - t1 = LBITS(a); \ - t2 = HBITS(a); \ - bl = LBITS(b); \ - bh = HBITS(b); \ - mul64(t1, t2, bl, bh); \ - c0 = (c0 + t1) & BN_MASK2; \ - if ((c0) < t1) \ - t2++; \ - c1 = (c1 + t2) & BN_MASK2; \ - if ((c1) < t2) \ - c2++; \ - } while (0) - -#define mul_add_c2(a, b, c0, c1, c2) \ - do { \ - t1 = LBITS(a); \ - t2 = HBITS(a); \ - bl = LBITS(b); \ - bh = HBITS(b); \ - mul64(t1, t2, bl, bh); \ - if (t2 & BN_TBIT) \ - c2++; \ - t2 = (t2 + t2) & BN_MASK2; \ - if (t1 & BN_TBIT) \ - t2++; \ - t1 = (t1 + t1) & BN_MASK2; \ - c0 = (c0 + t1) & BN_MASK2; \ - if ((c0 < t1) && (((++t2) & BN_MASK2) == 0)) \ - c2++; \ - c1 = (c1 + t2) & BN_MASK2; \ - if ((c1) < t2) \ - c2++; \ - } while (0) - -#define sqr_add_c(a, i, c0, c1, c2) \ - do { \ - sqr64(t1, t2, (a)[i]); \ - c0 = (c0 + t1) & BN_MASK2; \ - if ((c0) < t1) \ - t2++; \ - c1 = (c1 + t2) & BN_MASK2; \ - if ((c1) < t2) \ - c2++; \ - } while (0) - -#define sqr_add_c2(a, i, j, c0, c1, c2) mul_add_c2((a)[i], (a)[j], c0, c1, c2) - -static void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) -{ - BN_ULONG bl, bh; - BN_ULONG t1, t2; - BN_ULONG c1, c2, c3; - c1 = 0; - c2 = 0; - c3 = 0; - mul_add_c(a[0], b[0], c1, c2, c3); - r[0] = c1; - c1 = 0; - mul_add_c(a[0], b[1], c2, c3, c1); - mul_add_c(a[1], b[0], c2, c3, c1); - r[1] = c2; - c2 = 0; - mul_add_c(a[2], b[0], c3, c1, c2); - mul_add_c(a[1], b[1], c3, c1, c2); - mul_add_c(a[0], b[2], c3, c1, c2); - r[2] = c3; - c3 = 0; - mul_add_c(a[0], b[3], c1, c2, c3); - mul_add_c(a[1], b[2], c1, c2, c3); - mul_add_c(a[2], b[1], c1, c2, c3); - mul_add_c(a[3], b[0], c1, c2, c3); - r[3] = c1; - c1 = 0; - mul_add_c(a[4], b[0], c2, c3, c1); - mul_add_c(a[3], b[1], c2, c3, c1); - mul_add_c(a[2], b[2], c2, c3, c1); - mul_add_c(a[1], b[3], c2, c3, c1); - mul_add_c(a[0], b[4], c2, c3, c1); - r[4] = c2; - c2 = 0; - mul_add_c(a[0], b[5], c3, c1, c2); - mul_add_c(a[1], b[4], c3, c1, c2); - mul_add_c(a[2], b[3], c3, c1, c2); - mul_add_c(a[3], b[2], c3, c1, c2); - mul_add_c(a[4], b[1], c3, c1, c2); - mul_add_c(a[5], b[0], c3, c1, c2); - r[5] = c3; - c3 = 0; - mul_add_c(a[6], b[0], c1, c2, c3); - mul_add_c(a[5], b[1], c1, c2, c3); - mul_add_c(a[4], b[2], c1, c2, c3); - mul_add_c(a[3], b[3], c1, c2, c3); - mul_add_c(a[2], b[4], c1, c2, c3); - mul_add_c(a[1], b[5], c1, c2, c3); - mul_add_c(a[0], b[6], c1, c2, c3); - r[6] = c1; - c1 = 0; - mul_add_c(a[0], b[7], c2, c3, c1); - mul_add_c(a[1], b[6], c2, c3, c1); - mul_add_c(a[2], b[5], c2, c3, c1); - mul_add_c(a[3], b[4], c2, c3, c1); - mul_add_c(a[4], b[3], c2, c3, c1); - mul_add_c(a[5], b[2], c2, c3, c1); - mul_add_c(a[6], b[1], c2, c3, c1); - mul_add_c(a[7], b[0], c2, c3, c1); - r[7] = c2; - c2 = 0; - mul_add_c(a[7], b[1], c3, c1, c2); - mul_add_c(a[6], b[2], c3, c1, c2); - mul_add_c(a[5], b[3], c3, c1, c2); - mul_add_c(a[4], b[4], c3, c1, c2); - mul_add_c(a[3], b[5], c3, c1, c2); - mul_add_c(a[2], b[6], c3, c1, c2); - mul_add_c(a[1], b[7], c3, c1, c2); - r[8] = c3; - c3 = 0; - mul_add_c(a[2], b[7], c1, c2, c3); - mul_add_c(a[3], b[6], c1, c2, c3); - mul_add_c(a[4], b[5], c1, c2, c3); - mul_add_c(a[5], b[4], c1, c2, c3); - mul_add_c(a[6], b[3], c1, c2, c3); - mul_add_c(a[7], b[2], c1, c2, c3); - r[9] = c1; - c1 = 0; - mul_add_c(a[7], b[3], c2, c3, c1); - mul_add_c(a[6], b[4], c2, c3, c1); - mul_add_c(a[5], b[5], c2, c3, c1); - mul_add_c(a[4], b[6], c2, c3, c1); - mul_add_c(a[3], b[7], c2, c3, c1); - r[10] = c2; - c2 = 0; - mul_add_c(a[4], b[7], c3, c1, c2); - mul_add_c(a[5], b[6], c3, c1, c2); - mul_add_c(a[6], b[5], c3, c1, c2); - mul_add_c(a[7], b[4], c3, c1, c2); - r[11] = c3; - c3 = 0; - mul_add_c(a[7], b[5], c1, c2, c3); - mul_add_c(a[6], b[6], c1, c2, c3); - mul_add_c(a[5], b[7], c1, c2, c3); - r[12] = c1; - c1 = 0; - mul_add_c(a[6], b[7], c2, c3, c1); - mul_add_c(a[7], b[6], c2, c3, c1); - r[13] = c2; - c2 = 0; - mul_add_c(a[7], b[7], c3, c1, c2); - r[14] = c3; - r[15] = c1; -} -#ifdef BN_RECURSION -static void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) -{ - BN_ULONG bl, bh; - BN_ULONG t1, t2; - BN_ULONG c1, c2, c3; - c1 = 0; - c2 = 0; - c3 = 0; - mul_add_c(a[0], b[0], c1, c2, c3); - r[0] = c1; - c1 = 0; - mul_add_c(a[0], b[1], c2, c3, c1); - mul_add_c(a[1], b[0], c2, c3, c1); - r[1] = c2; - c2 = 0; - mul_add_c(a[2], b[0], c3, c1, c2); - mul_add_c(a[1], b[1], c3, c1, c2); - mul_add_c(a[0], b[2], c3, c1, c2); - r[2] = c3; - c3 = 0; - mul_add_c(a[0], b[3], c1, c2, c3); - mul_add_c(a[1], b[2], c1, c2, c3); - mul_add_c(a[2], b[1], c1, c2, c3); - mul_add_c(a[3], b[0], c1, c2, c3); - r[3] = c1; - c1 = 0; - mul_add_c(a[3], b[1], c2, c3, c1); - mul_add_c(a[2], b[2], c2, c3, c1); - mul_add_c(a[1], b[3], c2, c3, c1); - r[4] = c2; - c2 = 0; - mul_add_c(a[2], b[3], c3, c1, c2); - mul_add_c(a[3], b[2], c3, c1, c2); - r[5] = c3; - c3 = 0; - mul_add_c(a[3], b[3], c1, c2, c3); - r[6] = c1; - r[7] = c2; -} -#endif /*BN_RECURSION */ -static void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a) -{ - BN_ULONG bl, bh; - BN_ULONG t1, t2; - BN_ULONG c1, c2, c3; - c1 = 0; - c2 = 0; - c3 = 0; - sqr_add_c(a, 0, c1, c2, c3); - r[0] = c1; - c1 = 0; - sqr_add_c2(a, 1, 0, c2, c3, c1); - r[1] = c2; - c2 = 0; - sqr_add_c(a, 1, c3, c1, c2); - sqr_add_c2(a, 2, 0, c3, c1, c2); - r[2] = c3; - c3 = 0; - sqr_add_c2(a, 3, 0, c1, c2, c3); - sqr_add_c2(a, 2, 1, c1, c2, c3); - r[3] = c1; - c1 = 0; - sqr_add_c(a, 2, c2, c3, c1); - sqr_add_c2(a, 3, 1, c2, c3, c1); - sqr_add_c2(a, 4, 0, c2, c3, c1); - r[4] = c2; - c2 = 0; - sqr_add_c2(a, 5, 0, c3, c1, c2); - sqr_add_c2(a, 4, 1, c3, c1, c2); - sqr_add_c2(a, 3, 2, c3, c1, c2); - r[5] = c3; - c3 = 0; - sqr_add_c(a, 3, c1, c2, c3); - sqr_add_c2(a, 4, 2, c1, c2, c3); - sqr_add_c2(a, 5, 1, c1, c2, c3); - sqr_add_c2(a, 6, 0, c1, c2, c3); - r[6] = c1; - c1 = 0; - sqr_add_c2(a, 7, 0, c2, c3, c1); - sqr_add_c2(a, 6, 1, c2, c3, c1); - sqr_add_c2(a, 5, 2, c2, c3, c1); - sqr_add_c2(a, 4, 3, c2, c3, c1); - r[7] = c2; - c2 = 0; - sqr_add_c(a, 4, c3, c1, c2); - sqr_add_c2(a, 5, 3, c3, c1, c2); - sqr_add_c2(a, 6, 2, c3, c1, c2); - sqr_add_c2(a, 7, 1, c3, c1, c2); - r[8] = c3; - c3 = 0; - sqr_add_c2(a, 7, 2, c1, c2, c3); - sqr_add_c2(a, 6, 3, c1, c2, c3); - sqr_add_c2(a, 5, 4, c1, c2, c3); - r[9] = c1; - c1 = 0; - sqr_add_c(a, 5, c2, c3, c1); - sqr_add_c2(a, 6, 4, c2, c3, c1); - sqr_add_c2(a, 7, 3, c2, c3, c1); - r[10] = c2; - c2 = 0; - sqr_add_c2(a, 7, 4, c3, c1, c2); - sqr_add_c2(a, 6, 5, c3, c1, c2); - r[11] = c3; - c3 = 0; - sqr_add_c(a, 6, c1, c2, c3); - sqr_add_c2(a, 7, 5, c1, c2, c3); - r[12] = c1; - c1 = 0; - sqr_add_c2(a, 7, 6, c2, c3, c1); - r[13] = c2; - c2 = 0; - sqr_add_c(a, 7, c3, c1, c2); - r[14] = c3; - r[15] = c1; -} - -static void bn_sqr_comba4(BN_ULONG *r, const BN_ULONG *a) -{ - BN_ULONG bl, bh; - BN_ULONG t1, t2; - BN_ULONG c1, c2, c3; - c1 = 0; - c2 = 0; - c3 = 0; - sqr_add_c(a, 0, c1, c2, c3); - r[0] = c1; - c1 = 0; - sqr_add_c2(a, 1, 0, c2, c3, c1); - r[1] = c2; - c2 = 0; - sqr_add_c(a, 1, c3, c1, c2); - sqr_add_c2(a, 2, 0, c3, c1, c2); - r[2] = c3; - c3 = 0; - sqr_add_c2(a, 3, 0, c1, c2, c3); - sqr_add_c2(a, 2, 1, c1, c2, c3); - r[3] = c1; - c1 = 0; - sqr_add_c(a, 2, c2, c3, c1); - sqr_add_c2(a, 3, 1, c2, c3, c1); - r[4] = c2; - c2 = 0; - sqr_add_c2(a, 3, 2, c3, c1, c2); - r[5] = c3; - c3 = 0; - sqr_add_c(a, 3, c1, c2, c3); - r[6] = c1; - r[7] = c2; -} -#endif /* !BN_MUL_COMBA */ - -#define MONT_WORD /* use the faster word-based algorithm */ - -#ifdef MONT_WORD -static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont); -#endif - -int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, - BN_MONT_CTX *mont, BN_CTX *ctx) -{ - BIGNUM *tmp; - int ret = 0; -#if defined(OPENSSL_BN_ASM_MONT) && defined(MONT_WORD) - int num = mont->N.top; - - if (num > 1 && a->top == num && b->top == num) { - if (bn_wexpand(r, num) == NULL) - return 0; - - if (bn_mul_mont(r->d, a->d, b->d, mont->N.d, mont->n0, num)) { - r->neg = a->neg ^ b->neg; - r->top = num; - bn_correct_top(r); - return 1; - } - } - -#endif - BN_CTX_start(ctx); - tmp = BN_CTX_get(ctx); - - if (tmp == NULL) - goto err; - - bn_check_top(tmp); - - if (a == b) { - if (!BN_sqr(tmp, a, ctx)) - goto err; - } else { - if (!BN_mul(tmp, a, b, ctx)) - goto err; - } - - /* reduce from aRR to aR */ -#ifdef MONT_WORD - - if (!BN_from_montgomery_word(r, tmp, mont)) - goto err; - -#else - - if (!BN_from_montgomery(r, tmp, mont, ctx)) - goto err; - -#endif - bn_check_top(r); - ret = 1; -err: - BN_CTX_end(ctx); - return ret; -} - -#ifdef MONT_WORD -static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont) -{ - BIGNUM *n; - BN_ULONG *ap, *np, *rp, n0, v, carry; - int nl, max, i; - n = &(mont->N); - nl = n->top; - - if (nl == 0) { - ret->top = 0; - return 1; - } - - max = (2 * nl); /* carry is stored separately */ - - if (bn_wexpand(r, max) == NULL) - return 0; - - r->neg ^= n->neg; - np = n->d; - rp = r->d; - /* clear the top words of T */ - i = max - r->top; - - if (i) - memset(&rp[r->top], 0, sizeof(*rp) * i); - - r->top = max; - n0 = mont->n0[0]; - - for (carry = 0, i = 0; i < nl; i++, rp++) { - v = bn_mul_add_words(rp, np, nl, (rp[0] * n0) & BN_MASK2); - v = (v + carry + rp[nl]) & BN_MASK2; - carry |= (v != rp[nl]); - carry &= (v <= rp[nl]); - rp[nl] = v; - } - - if (bn_wexpand(ret, nl) == NULL) - return 0; - - ret->top = nl; - ret->neg = r->neg; - rp = ret->d; - ap = &(r->d[nl]); -#define BRANCH_FREE 0 -#if BRANCH_FREE - { - BN_ULONG *nrp; - size_t m; - v = bn_sub_words(rp, ap, np, nl) - carry; - /* - * if subtraction result is real, then trick unconditional memcpy - * below to perform in-place "refresh" instead of actual copy. - */ - m = (0 - (size_t)v); - nrp = (BN_ULONG *)(((PTR_SIZE_INT)rp & ~m) | - ((PTR_SIZE_INT)ap & m)); - - for (i = 0, nl -= 4; i < nl; i += 4) { - BN_ULONG t1, t2, t3, t4; - t1 = nrp[i + 0]; - t2 = nrp[i + 1]; - t3 = nrp[i + 2]; - ap[i + 0] = 0; - t4 = nrp[i + 3]; - ap[i + 1] = 0; - rp[i + 0] = t1; - ap[i + 2] = 0; - rp[i + 1] = t2; - ap[i + 3] = 0; - rp[i + 2] = t3; - rp[i + 3] = t4; - } - - for (nl += 4; i < nl; i++) - rp[i] = nrp[i], ap[i] = 0; - } -#else - - if (bn_sub_words(rp, ap, np, nl) - carry) - memcpy(rp, ap, nl * sizeof(BN_ULONG)); - -#endif - bn_correct_top(r); - bn_correct_top(ret); - bn_check_top(ret); - return 1; -} -#endif /* MONT_WORD */ - -int BN_from_montgomery(BIGNUM *ret, const BIGNUM *a, BN_MONT_CTX *mont, - BN_CTX *ctx) -{ - int retn = 0; -#ifdef MONT_WORD - BIGNUM *t; - BN_CTX_start(ctx); - - t = BN_CTX_get(ctx); - if (t && BN_copy(t, a)) - retn = BN_from_montgomery_word(ret, t, mont); - - BN_CTX_end(ctx); -#else /* !MONT_WORD */ - BIGNUM *t1, *t2; - BN_CTX_start(ctx); - t1 = BN_CTX_get(ctx); - t2 = BN_CTX_get(ctx); - - if (t1 == NULL || t2 == NULL) - goto err; - - if (!BN_copy(t1, a)) - goto err; - - BN_mask_bits(t1, mont->ri); - - if (!BN_mul(t2, t1, &mont->Ni, ctx)) - goto err; - - BN_mask_bits(t2, mont->ri); - - if (!BN_mul(t1, t2, &mont->N, ctx)) - goto err; - - if (!BN_add(t2, a, t1)) - goto err; - - if (!BN_rshift(ret, t2, mont->ri)) - goto err; - - if (BN_ucmp(ret, &(mont->N)) >= 0) { - if (!BN_usub(ret, ret, &(mont->N))) - goto err; - } - - retn = 1; - bn_check_top(ret); -err: - BN_CTX_end(ctx); -#endif /* MONT_WORD */ - return retn; -} - -BN_MONT_CTX *BN_MONT_CTX_new(void) -{ - BN_MONT_CTX *ret; - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(BN_MONT_CTX)); - - if (ret == NULL) - return NULL; - - BN_MONT_CTX_init(ret); - ret->flags = BN_FLG_MALLOCED; - return ret; -} - -void BN_MONT_CTX_init(BN_MONT_CTX *ctx) -{ - ctx->ri = 0; - bn_init(&(ctx->RR)); - bn_init(&(ctx->N)); - bn_init(&(ctx->Ni)); - ctx->n0[0] = ctx->n0[1] = 0; - ctx->flags = 0; -} - -void BN_MONT_CTX_free(BN_MONT_CTX *mont) -{ - if (mont == NULL) - return; - - BN_clear_free(&(mont->RR)); - BN_clear_free(&(mont->N)); - BN_clear_free(&(mont->Ni)); - - if (mont->flags & BN_FLG_MALLOCED) - os_free_mem(mont); -} - -int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx) -{ - int ret = 0; - BIGNUM *Ri, *R; - - if (BN_is_zero(mod)) - return 0; - - BN_CTX_start(ctx); - - Ri = BN_CTX_get(ctx); - if (Ri == NULL) - goto err; - - R = &(mont->RR); /* grab RR as a temp */ - - if (!BN_copy(&(mont->N), mod)) - goto err; /* Set N */ - - mont->N.neg = 0; -#ifdef MONT_WORD - { - BIGNUM tmod; - BN_ULONG buf[2]; - bn_init(&tmod); - tmod.d = buf; - tmod.dmax = 2; - tmod.neg = 0; - - if (BN_get_flags(mod, BN_FLG_CONSTTIME) != 0) - BN_set_flags(&tmod, BN_FLG_CONSTTIME); - - mont->ri = (BN_num_bits(mod) + (BN_BITS2 - 1)) / BN_BITS2 * - BN_BITS2; -#if defined(OPENSSL_BN_ASM_MONT) && (BN_BITS2 <= 32) - /* - * Only certain BN_BITS2<=32 platforms actually make use of n0[1], - * and we could use the #else case (with a shorter R value) for the - * others. However, currently only the assembler files do know which - * is which. - */ - BN_zero(R); - - if (!(BN_set_bit(R, 2 * BN_BITS2))) - goto err; - - tmod.top = 0; - - buf[0] = mod->d[0]; - if (buf[0]) - tmod.top = 1; - - buf[1] = mod->top > 1 ? mod->d[1] : 0; - if (buf[1]) - tmod.top = 2; - - if ((BN_mod_inverse(Ri, R, &tmod, ctx)) == NULL) - goto err; - - if (!BN_lshift(Ri, Ri, 2 * BN_BITS2)) - goto err; /* R*Ri */ - - if (!BN_is_zero(Ri)) { - if (!BN_sub_word(Ri, 1)) - goto err; - } else { /* if N mod word size == 1 */ - if (bn_expand(Ri, (int)sizeof(BN_ULONG) * 2) == NULL) - goto err; - - /* Ri-- (mod double word size) */ - Ri->neg = 0; - Ri->d[0] = BN_MASK2; - Ri->d[1] = BN_MASK2; - Ri->top = 2; - } - - if (!BN_div(Ri, NULL, Ri, &tmod, ctx)) - goto err; - - /* - * Ni = (R*Ri-1)/N, keep only couple of least significant words: - */ - mont->n0[0] = (Ri->top > 0) ? Ri->d[0] : 0; - mont->n0[1] = (Ri->top > 1) ? Ri->d[1] : 0; -#else - BN_zero(R); - - if (!(BN_set_bit(R, BN_BITS2))) - goto err; /* R */ - - buf[0] = mod->d[0]; /* tmod = N mod word size */ - buf[1] = 0; - tmod.top = buf[0] != 0 ? 1 : 0; - - /* Ri = R^-1 mod N */ - if ((BN_mod_inverse(Ri, R, &tmod, ctx)) == NULL) - goto err; - - if (!BN_lshift(Ri, Ri, BN_BITS2)) - goto err; /* R*Ri */ - - if (!BN_is_zero(Ri)) { - if (!BN_sub_word(Ri, 1)) - goto err; - } else { /* if N mod word size == 1 */ - if (!BN_set_word(Ri, BN_MASK2)) - goto err; /* Ri-- (mod word size) */ - } - - if (!BN_div(Ri, NULL, Ri, &tmod, ctx)) - goto err; - - /* - * Ni = (R*Ri-1)/N, keep only least significant word: - */ - mont->n0[0] = (Ri->top > 0) ? Ri->d[0] : 0; - mont->n0[1] = 0; -#endif - } -#else /* !MONT_WORD */ - { /* bignum version */ - mont->ri = BN_num_bits(&mont->N); - BN_zero(R); - - if (!BN_set_bit(R, mont->ri)) - goto err; /* R = 2^ri */ - - /* Ri = R^-1 mod N */ - if ((BN_mod_inverse(Ri, R, &mont->N, ctx)) == NULL) - goto err; - - if (!BN_lshift(Ri, Ri, mont->ri)) - goto err; /* R*Ri */ - - if (!BN_sub_word(Ri, 1)) - goto err; - - /* - * Ni = (R*Ri-1) / N - */ - if (!BN_div(&(mont->Ni), NULL, Ri, &mont->N, ctx)) - goto err; - } -#endif - /* setup RR for conversions */ - BN_zero(&(mont->RR)); - - if (!BN_set_bit(&(mont->RR), mont->ri * 2)) - goto err; - - if (!BN_mod(&(mont->RR), &(mont->RR), &(mont->N), ctx)) - goto err; - - ret = 1; -err: - BN_CTX_end(ctx); - return ret; -} - -BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from) -{ - if (to == from) - return to; - - if (!BN_copy(&(to->RR), &(from->RR))) - return NULL; - - if (!BN_copy(&(to->N), &(from->N))) - return NULL; - - if (!BN_copy(&(to->Ni), &(from->Ni))) - return NULL; - - to->ri = from->ri; - to->n0[0] = from->n0[0]; - to->n0[1] = from->n0[1]; - return to; -} - -void BN_STACK_init(BN_STACK *st) -{ - st->indexes = NULL; - st->depth = st->size = 0; -} - -void BN_STACK_finish(BN_STACK *st) -{ - if (st->indexes) - os_free_mem(st->indexes); - - st->indexes = NULL; -} - -int BN_STACK_push(BN_STACK *st, unsigned int idx) -{ - if (st->depth == st->size) { - /* Need to expand */ - unsigned int newsize = - st->size ? (st->size * 3 / 2) : BN_CTX_START_FRAMES; - unsigned int *newitems; - os_alloc_mem(NULL, (UCHAR **)&newitems, - sizeof(*newitems) * newsize); - - if (newitems == NULL) - return 0; - - if (st->depth) - memcpy(newitems, st->indexes, - sizeof(*newitems) * st->depth); - - if (st->indexes) - os_free_mem(st->indexes); - - st->indexes = newitems; - st->size = newsize; - } - - st->indexes[(st->depth)++] = idx; - return 1; -} - -unsigned int BN_STACK_pop(BN_STACK *st) -{ - return st->indexes[--(st->depth)]; -} - -void BN_POOL_init(BN_POOL *p) -{ - p->head = NULL; - p->curr = NULL; - p->tail = NULL; - p->used = 0; - p->size = 0; -} - -void BN_POOL_finish(BN_POOL *p) -{ - unsigned int loop; - BIGNUM *bn; - - while (p->head) { - for (loop = 0, bn = p->head->vals; loop++ < BN_CTX_POOL_SIZE; - bn++) - if (bn->d) - BN_clear_free(bn); - - p->curr = p->head->next; - - if (p->head) - os_free_mem(p->head); - - p->head = p->curr; - } -} - -BIGNUM *BN_POOL_get(BN_POOL *p, int flag) -{ - BIGNUM *bn; - unsigned int loop; - - /* Full; allocate a new pool item and link it in. */ - if (p->used == p->size) { - BN_POOL_ITEM *item; - os_alloc_mem(NULL, (UCHAR **)&item, sizeof(BN_POOL_ITEM)); - - if (item == NULL) - return NULL; - - for (loop = 0, bn = item->vals; loop++ < BN_CTX_POOL_SIZE; - bn++) { - bn_init(bn); - - if ((flag & BN_FLG_SECURE) != 0) - BN_set_flags(bn, BN_FLG_SECURE); - } - - item->prev = p->tail; - item->next = NULL; - - if (p->head == NULL) - p->head = p->curr = p->tail = item; - else { - p->tail->next = item; - p->tail = item; - p->curr = item; - } - - p->size += BN_CTX_POOL_SIZE; - p->used++; - /* Return the first bignum from the new pool */ - return item->vals; - } - - if (!p->used) - p->curr = p->head; - else if ((p->used % BN_CTX_POOL_SIZE) == 0) - p->curr = p->curr->next; - - return p->curr->vals + ((p->used++) % BN_CTX_POOL_SIZE); -} - -void BN_POOL_release(BN_POOL *p, unsigned int num) -{ - unsigned int offset = (p->used - 1) % BN_CTX_POOL_SIZE; - p->used -= num; - - while (num--) { - bn_check_top(p->curr->vals + offset); - - if (offset == 0) { - offset = BN_CTX_POOL_SIZE - 1; - p->curr = p->curr->prev; - } else - offset--; - } -} - -BN_CTX *BN_CTX_new(void) -{ - BN_CTX *ret; - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(BN_CTX)); - memset(ret, 0, sizeof(BN_CTX)); - - if (ret == NULL) - return NULL; - - /* Initialise the structure */ - BN_POOL_init(&ret->pool); - BN_STACK_init(&ret->stack); - return ret; -} - -BN_CTX *BN_CTX_secure_new(void) -{ - BN_CTX *ret = BN_CTX_new(); - - if (ret != NULL) - ret->flags = BN_FLG_SECURE; - - return ret; -} - -void BN_CTX_free(BN_CTX *ctx) -{ - if (ctx == NULL) - return; - - BN_STACK_finish(&ctx->stack); - BN_POOL_finish(&ctx->pool); - - if (ctx) - os_free_mem(ctx); -} - -void BN_CTX_start(BN_CTX *ctx) -{ - /* If we're already overflowing ... */ - if (ctx->err_stack || ctx->too_many) - ctx->err_stack++; - /* (Try to) get a new frame pointer */ - else if (!BN_STACK_push(&ctx->stack, ctx->used)) { - BNerr(BN_F_BN_CTX_START, BN_R_TOO_MANY_TEMPORARY_VARIABLES); - ctx->err_stack++; - } -} - -void BN_CTX_end(BN_CTX *ctx) -{ - if (ctx->err_stack) - ctx->err_stack--; - else { - unsigned int fp = BN_STACK_pop(&ctx->stack); - - /* Does this stack frame have anything to release? */ - if (fp < ctx->used) - BN_POOL_release(&ctx->pool, ctx->used - fp); - - ctx->used = fp; - /* Unjam "too_many" in case "get" had failed */ - ctx->too_many = 0; - } -} - -BIGNUM *BN_CTX_get(BN_CTX *ctx) -{ - BIGNUM *ret; - - if (ctx->err_stack || ctx->too_many) - return NULL; - - ret = BN_POOL_get(&ctx->pool, ctx->flags); - if (ret == NULL) { - /* - * Setting too_many prevents repeated "get" attempts from cluttering - * the error stack. - */ - ctx->too_many = 1; - BNerr(BN_F_BN_CTX_GET, BN_R_TOO_MANY_TEMPORARY_VARIABLES); - return NULL; - } - - /* OK, make sure the returned bignum is "zero" */ - BN_zero(ret); - ctx->used++; - return ret; -} - -void BN_RECP_CTX_init(BN_RECP_CTX *recp) -{ - memset(recp, 0, sizeof(*recp)); - bn_init(&(recp->N)); - bn_init(&(recp->Nr)); -} - -BN_RECP_CTX *BN_RECP_CTX_new(void) -{ - BN_RECP_CTX *ret; - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(BN_RECP_CTX)); - - if (ret == NULL) - return NULL; - - bn_init(&(ret->N)); - bn_init(&(ret->Nr)); - ret->flags = BN_FLG_MALLOCED; - return ret; -} - -void BN_RECP_CTX_free(BN_RECP_CTX *recp) -{ - if (recp == NULL) - return; - - BN_free(&(recp->N)); - BN_free(&(recp->Nr)); - - if (recp->flags & BN_FLG_MALLOCED) - os_free_mem(recp); -} - -int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *d, BN_CTX *ctx) -{ - if (!BN_copy(&(recp->N), d)) - return 0; - - BN_zero(&(recp->Nr)); - recp->num_bits = BN_num_bits(d); - recp->shift = 0; - return 1; -} - -int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, - BN_RECP_CTX *recp, BN_CTX *ctx) -{ - int ret = 0; - BIGNUM *a; - const BIGNUM *ca; - BN_CTX_start(ctx); - - a = BN_CTX_get(ctx); - if (a == NULL) - goto err; - - if (y != NULL) { - if (x == y) { - if (!BN_sqr(a, x, ctx)) - goto err; - } else { - if (!BN_mul(a, x, y, ctx)) - goto err; - } - - ca = a; - } else - ca = x; /* Just do the mod */ - - ret = BN_div_recp(NULL, r, ca, recp, ctx); -err: - BN_CTX_end(ctx); - bn_check_top(r); - return ret; -} - -int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, BN_RECP_CTX *recp, - BN_CTX *ctx) -{ - int i, j, ret = 0; - BIGNUM *a, *b, *d, *r; - BN_CTX_start(ctx); - a = BN_CTX_get(ctx); - b = BN_CTX_get(ctx); - - if (dv != NULL) - d = dv; - else - d = BN_CTX_get(ctx); - - if (rem != NULL) - r = rem; - else - r = BN_CTX_get(ctx); - - if (a == NULL || b == NULL || d == NULL || r == NULL) - goto err; - - if (BN_ucmp(m, &(recp->N)) < 0) { - BN_zero(d); - - if (!BN_copy(r, m)) { - BN_CTX_end(ctx); - return 0; - } - - BN_CTX_end(ctx); - return 1; - } - - /* - * We want the remainder Given input of ABCDEF / ab we need multiply - * ABCDEF by 3 digests of the reciprocal of ab - */ - /* i := max(BN_num_bits(m), 2*BN_num_bits(N)) */ - i = BN_num_bits(m); - j = recp->num_bits << 1; - - if (j > i) - i = j; - - /* Nr := round(2^i / N) */ - if (i != recp->shift) - recp->shift = BN_reciprocal(&(recp->Nr), &(recp->N), i, ctx); - - /* BN_reciprocal could have returned -1 for an error */ - if (recp->shift == -1) - goto err; - - /*- - * d := |round(round(m / 2^BN_num_bits(N)) * recp->Nr / 2^(i - BN_num_bits(N)))| - * = |round(round(m / 2^BN_num_bits(N)) * round(2^i / N) / 2^(i - BN_num_bits(N)))| - * <= |(m / 2^BN_num_bits(N)) * (2^i / N) * (2^BN_num_bits(N) / 2^i)| - * = |m/N| - */ - if (!BN_rshift(a, m, recp->num_bits)) - goto err; - - if (!BN_mul(b, a, &(recp->Nr), ctx)) - goto err; - - if (!BN_rshift(d, b, i - recp->num_bits)) - goto err; - - d->neg = 0; - - if (!BN_mul(b, &(recp->N), d, ctx)) - goto err; - - if (!BN_usub(r, m, b)) - goto err; - - r->neg = 0; - j = 0; - - while (BN_ucmp(r, &(recp->N)) >= 0) { - if (j++ > 2) { - BNerr(BN_F_BN_DIV_RECP, BN_R_BAD_RECIPROCAL); - goto err; - } - - if (!BN_usub(r, r, &(recp->N))) - goto err; - - if (!BN_add_word(d, 1)) - goto err; - } - - r->neg = BN_is_zero(r) ? 0 : m->neg; - d->neg = m->neg ^ recp->N.neg; - ret = 1; -err: - BN_CTX_end(ctx); - bn_check_top(dv); - bn_check_top(rem); - return ret; -} - -/* - * len is the expected size of the result We actually calculate with an extra - * word of precision, so we can do faster division if the remainder is not - * required. - */ -/* r := 2^len / m */ -int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx) -{ - int ret = -1; - BIGNUM *t; - BN_CTX_start(ctx); - - t = BN_CTX_get(ctx); - if (t == NULL) - goto err; - - if (!BN_set_bit(t, len)) - goto err; - - if (!BN_div(r, NULL, t, m, ctx)) - goto err; - - ret = len; -err: - bn_check_top(r); - BN_CTX_end(ctx); - return ret; -} - -int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) -{ - int max, al; - int ret = 0; - BIGNUM *tmp, *rr; - bn_check_top(a); - al = a->top; - - if (al <= 0) { - r->top = 0; - r->neg = 0; - return 1; - } - - BN_CTX_start(ctx); - rr = (a != r) ? r : BN_CTX_get(ctx); - tmp = BN_CTX_get(ctx); - - if (!rr || !tmp) - goto err; - - max = 2 * al; /* Non-zero (from above) */ - - if (bn_wexpand(rr, max) == NULL) - goto err; - - if (al == 4) { -#ifndef BN_SQR_COMBA - BN_ULONG t[8]; - bn_sqr_normal(rr->d, a->d, 4, t); -#else - bn_sqr_comba4(rr->d, a->d); -#endif - } else if (al == 8) { -#ifndef BN_SQR_COMBA - BN_ULONG t[16]; - bn_sqr_normal(rr->d, a->d, 8, t); -#else - bn_sqr_comba8(rr->d, a->d); -#endif - } else { -#if defined(BN_RECURSION) - - if (al < BN_SQR_RECURSIVE_SIZE_NORMAL) { - BN_ULONG t[BN_SQR_RECURSIVE_SIZE_NORMAL * 2]; - bn_sqr_normal(rr->d, a->d, al, t); - } else { - int j, k; - j = BN_num_bits_word((BN_ULONG)al); - j = 1 << (j - 1); - k = j + j; - - if (al == j) { - if (bn_wexpand(tmp, k * 2) == NULL) - goto err; - - bn_sqr_recursive(rr->d, a->d, al, tmp->d); - } else { - if (bn_wexpand(tmp, max) == NULL) - goto err; - - bn_sqr_normal(rr->d, a->d, al, tmp->d); - } - } - -#else - - if (bn_wexpand(tmp, max) == NULL) - goto err; - - bn_sqr_normal(rr->d, a->d, al, tmp->d); -#endif - } - - rr->neg = 0; - - /* - * If the most-significant half of the top word of 'a' is zero, then the - * square of 'a' will max-1 words. - */ - if (a->d[al - 1] == (a->d[al - 1] & BN_MASK2l)) - rr->top = max - 1; - else - rr->top = max; - - if (r != rr && BN_copy(r, rr) == NULL) - goto err; - - ret = 1; -err: - bn_check_top(rr); - bn_check_top(tmp); - BN_CTX_end(ctx); - return ret; -} - -/* tmp must have 2*n words */ -void bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, int n, BN_ULONG *tmp) -{ - int i, j, max; - const BN_ULONG *ap; - BN_ULONG *rp; - max = n * 2; - ap = a; - rp = r; - rp[0] = rp[max - 1] = 0; - rp++; - j = n; - - if (--j > 0) { - ap++; - rp[j] = bn_mul_words(rp, ap, j, ap[-1]); - rp += 2; - } - - for (i = n - 2; i > 0; i--) { - j--; - ap++; - rp[j] = bn_mul_add_words(rp, ap, j, ap[-1]); - rp += 2; - } - - bn_add_words(r, r, r, max); - /* There will not be a carry */ - bn_sqr_words(tmp, a, n); - bn_add_words(r, r, tmp, max); -} - -#ifdef BN_RECURSION -/*- - * r is 2*n words in size, - * a and b are both n words in size. (There's not actually a 'b' here ...) - * n must be a power of 2. - * We multiply and return the result. - * t must be 2*n words in size - * We calculate - * a[0]*b[0] - * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0]) - * a[1]*b[1] - */ -void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, int n2, BN_ULONG *t) -{ - int n = n2 / 2; - int zero, c1; - BN_ULONG ln, lo, *p; - - if (n2 == 4) { -#ifndef BN_SQR_COMBA - bn_sqr_normal(r, a, 4, t); -#else - bn_sqr_comba4(r, a); -#endif - return; - } else if (n2 == 8) { -#ifndef BN_SQR_COMBA - bn_sqr_normal(r, a, 8, t); -#else - bn_sqr_comba8(r, a); -#endif - return; - } - - if (n2 < BN_SQR_RECURSIVE_SIZE_NORMAL) { - bn_sqr_normal(r, a, n2, t); - return; - } - - /* r=(a[0]-a[1])*(a[1]-a[0]) */ - c1 = bn_cmp_words(a, &(a[n]), n); - zero = 0; - - if (c1 > 0) - bn_sub_words(t, a, &(a[n]), n); - else if (c1 < 0) - bn_sub_words(t, &(a[n]), a, n); - else - zero = 1; - - /* The result will always be negative unless it is zero */ - p = &(t[n2 * 2]); - - if (!zero) - bn_sqr_recursive(&(t[n2]), t, n, p); - else - memset(&t[n2], 0, sizeof(*t) * n2); - - bn_sqr_recursive(r, a, n, p); - bn_sqr_recursive(&(r[n2]), &(a[n]), n, p); - /*- - * t[32] holds (a[0]-a[1])*(a[1]-a[0]), it is negative or zero - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - */ - c1 = (int)(bn_add_words(t, r, &(r[n2]), n2)); - /* t[32] is negative */ - c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2)); - /*- - * t[32] holds (a[0]-a[1])*(a[1]-a[0])+(a[0]*a[0])+(a[1]*a[1]) - * r[10] holds (a[0]*a[0]) - * r[32] holds (a[1]*a[1]) - * c1 holds the carry bits - */ - c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2)); - - if (c1) { - p = &(r[n + n2]); - lo = *p; - ln = (lo + c1) & BN_MASK2; - *p = ln; - - /* - * The overflow will stop before we over write words we should not - * overwrite - */ - if (ln < (BN_ULONG)c1) { - do { - p++; - lo = *p; - ln = (lo + 1) & BN_MASK2; - *p = ln; - } while (ln == 0); - } - } -} -#endif - -/* - * BN_mod_inverse_no_branch is a special version of BN_mod_inverse. It does - * not contain branches that may leak sensitive information. - */ -static BIGNUM *BN_mod_inverse_no_branch(BIGNUM *in, const BIGNUM *a, - const BIGNUM *n, BN_CTX *ctx) -{ - BIGNUM *A, *B, *X, *Y, *M, *D, *T, *R = NULL; - BIGNUM *ret = NULL; - int sign; - bn_check_top(a); - bn_check_top(n); - BN_CTX_start(ctx); - A = BN_CTX_get(ctx); - B = BN_CTX_get(ctx); - X = BN_CTX_get(ctx); - D = BN_CTX_get(ctx); - M = BN_CTX_get(ctx); - Y = BN_CTX_get(ctx); - T = BN_CTX_get(ctx); - - if (T == NULL) - goto err; - - if (in == NULL) - R = BN_new(); - else - R = in; - - if (R == NULL) - goto err; - - BN_one(X); - BN_zero(Y); - - if (BN_copy(B, a) == NULL) - goto err; - - if (BN_copy(A, n) == NULL) - goto err; - - A->neg = 0; - - if (B->neg || (BN_ucmp(B, A) >= 0)) { - /* - * Turn BN_FLG_CONSTTIME flag on, so that when BN_div is invoked, - * BN_div_no_branch will be called eventually. - */ - { - BIGNUM local_B; - bn_init(&local_B); - BN_with_flags(&local_B, B, BN_FLG_CONSTTIME); - - if (!BN_nnmod(B, &local_B, A, ctx)) - goto err; - - /* Ensure local_B goes out of scope before any further use of B */ - } - } - - sign = -1; - /*- - * From B = a mod |n|, A = |n| it follows that - * - * 0 <= B < A, - * -sign*X*a == B (mod |n|), - * sign*Y*a == A (mod |n|). - */ - - while (!BN_is_zero(B)) { - BIGNUM *tmp; - /*- - * 0 < B < A, - * (*) -sign*X*a == B (mod |n|), - * sign*Y*a == A (mod |n|) - */ - /* - * Turn BN_FLG_CONSTTIME flag on, so that when BN_div is invoked, - * BN_div_no_branch will be called eventually. - */ - { - BIGNUM local_A; - bn_init(&local_A); - BN_with_flags(&local_A, A, BN_FLG_CONSTTIME); - - /* (D, M) := (A/B, A%B) ... */ - if (!BN_div(D, M, &local_A, B, ctx)) - goto err; - - /* Ensure local_A goes out of scope before any further use of A */ - } - /*- - * Now - * A = D*B + M; - * thus we have - * (**) sign*Y*a == D*B + M (mod |n|). - */ - tmp = A; /* keep the BIGNUM object, the value does not matter */ - /* (A, B) := (B, A mod B) ... */ - A = B; - B = M; - /* ... so we have 0 <= B < A again */ - - /*- - * Since the former M is now B and the former B is now A, - * (**) translates into - * sign*Y*a == D*A + B (mod |n|), - * i.e. - * sign*Y*a - D*A == B (mod |n|). - * Similarly, (*) translates into - * -sign*X*a == A (mod |n|). - * - * Thus, - * sign*Y*a + D*sign*X*a == B (mod |n|), - * i.e. - * sign*(Y + D*X)*a == B (mod |n|). - * - * So if we set (X, Y, sign) := (Y + D*X, X, -sign), we arrive back at - * -sign*X*a == B (mod |n|), - * sign*Y*a == A (mod |n|). - * Note that X and Y stay non-negative all the time. - */ - - if (!BN_mul(tmp, D, X, ctx)) - goto err; - - if (!BN_add(tmp, tmp, Y)) - goto err; - - M = Y; /* keep the BIGNUM object, the value does not matter */ - Y = X; - X = tmp; - sign = -sign; - } - - /*- - * The while loop (Euclid's algorithm) ends when - * A == gcd(a,n); - * we have - * sign*Y*a == A (mod |n|), - * where Y is non-negative. - */ - - if (sign < 0) { - if (!BN_sub(Y, n, Y)) - goto err; - } - - /* Now Y*a == A (mod |n|). */ - - if (BN_is_one(A)) { - /* Y*a == 1 (mod |n|) */ - if (!Y->neg && BN_ucmp(Y, n) < 0) { - if (!BN_copy(R, Y)) - goto err; - } else { - if (!BN_nnmod(R, Y, n, ctx)) - goto err; - } - } else { - BNerr(BN_F_BN_MOD_INVERSE_NO_BRANCH, BN_R_NO_INVERSE); - goto err; - } - - ret = R; -err: - - if ((ret == NULL) && (in == NULL)) - BN_free(R); - - BN_CTX_end(ctx); - bn_check_top(ret); - return ret; -} - -BIGNUM *int_bn_mod_inverse(BIGNUM *in, const BIGNUM *a, const BIGNUM *n, - BN_CTX *ctx, int *pnoinv) -{ - BIGNUM *A, *B, *X, *Y, *M, *D, *T, *R = NULL; - BIGNUM *ret = NULL; - int sign; - - if (pnoinv) - *pnoinv = 0; - - if ((BN_get_flags(a, BN_FLG_CONSTTIME) != 0) || - (BN_get_flags(n, BN_FLG_CONSTTIME) != 0)) - return BN_mod_inverse_no_branch(in, a, n, ctx); - - bn_check_top(a); - bn_check_top(n); - BN_CTX_start(ctx); - A = BN_CTX_get(ctx); - B = BN_CTX_get(ctx); - X = BN_CTX_get(ctx); - D = BN_CTX_get(ctx); - M = BN_CTX_get(ctx); - Y = BN_CTX_get(ctx); - T = BN_CTX_get(ctx); - - if (T == NULL) - goto err; - - if (in == NULL) - R = BN_new(); - else - R = in; - - if (R == NULL) - goto err; - - BN_one(X); - BN_zero(Y); - - if (BN_copy(B, a) == NULL) - goto err; - - if (BN_copy(A, n) == NULL) - goto err; - - A->neg = 0; - - if (B->neg || (BN_ucmp(B, A) >= 0)) { - if (!BN_nnmod(B, B, A, ctx)) - goto err; - } - - sign = -1; - /*- - * From B = a mod |n|, A = |n| it follows that - * - * 0 <= B < A, - * -sign*X*a == B (mod |n|), - * sign*Y*a == A (mod |n|). - */ - - if (BN_is_odd(n) && (BN_num_bits(n) <= 2048)) { - /* - * Binary inversion algorithm; requires odd modulus. This is faster - * than the general algorithm if the modulus is sufficiently small - * (about 400 .. 500 bits on 32-bit systems, but much more on 64-bit - * systems) - */ - int shift; - - while (!BN_is_zero(B)) { - /*- - * 0 < B < |n|, - * 0 < A <= |n|, - * (1) -sign*X*a == B (mod |n|), - * (2) sign*Y*a == A (mod |n|) - */ - /* - * Now divide B by the maximum possible power of two in the - * integers, and divide X by the same value mod |n|. When we're - * done, (1) still holds. - */ - shift = 0; - - while (!BN_is_bit_set(B, shift)) { /* note that 0 < B */ - shift++; - - if (BN_is_odd(X)) { - if (!BN_uadd(X, X, n)) - goto err; - } - - /* - * now X is even, so we can easily divide it by two - */ - if (!BN_rshift1(X, X)) - goto err; - } - - if (shift > 0) { - if (!BN_rshift(B, B, shift)) - goto err; - } - - /* - * Same for A and Y. Afterwards, (2) still holds. - */ - shift = 0; - - while (!BN_is_bit_set(A, shift)) { /* note that 0 < A */ - shift++; - - if (BN_is_odd(Y)) { - if (!BN_uadd(Y, Y, n)) - goto err; - } - - /* now Y is even */ - if (!BN_rshift1(Y, Y)) - goto err; - } - - if (shift > 0) { - if (!BN_rshift(A, A, shift)) - goto err; - } - - /*- - * We still have (1) and (2). - * Both A and B are odd. - * The following computations ensure that - * - * 0 <= B < |n|, - * 0 < A < |n|, - * (1) -sign*X*a == B (mod |n|), - * (2) sign*Y*a == A (mod |n|), - * - * and that either A or B is even in the next iteration. - */ - if (BN_ucmp(B, A) >= 0) { - /* -sign*(X + Y)*a == B - A (mod |n|) */ - if (!BN_uadd(X, X, Y)) - goto err; - - /* - * NB: we could use BN_mod_add_quick(X, X, Y, n), but that - * actually makes the algorithm slower - */ - if (!BN_usub(B, B, A)) - goto err; - } else { - /* sign*(X + Y)*a == A - B (mod |n|) */ - if (!BN_uadd(Y, Y, X)) - goto err; - - /* - * as above, BN_mod_add_quick(Y, Y, X, n) would slow things down - */ - if (!BN_usub(A, A, B)) - goto err; - } - } - } else { - /* general inversion algorithm */ - while (!BN_is_zero(B)) { - BIGNUM *tmp; - - /*- - * 0 < B < A, - * (*) -sign*X*a == B (mod |n|), - * sign*Y*a == A (mod |n|) - */ - - /* (D, M) := (A/B, A%B) ... */ - if (BN_num_bits(A) == BN_num_bits(B)) { - if (!BN_one(D)) - goto err; - - if (!BN_sub(M, A, B)) - goto err; - } else if (BN_num_bits(A) == BN_num_bits(B) + 1) { - /* A/B is 1, 2, or 3 */ - if (!BN_lshift1(T, B)) - goto err; - - if (BN_ucmp(A, T) < 0) { - /* A < 2*B, so D=1 */ - if (!BN_one(D)) - goto err; - - if (!BN_sub(M, A, B)) - goto err; - } else { - /* A >= 2*B, so D=2 or D=3 */ - if (!BN_sub(M, A, T)) - goto err; - - if (!BN_add(D, T, B)) - goto err; /* use D (:= 3*B) as temp */ - - if (BN_ucmp(A, D) < 0) { - /* A < 3*B, so D=2 */ - if (!BN_set_word(D, 2)) - goto err; - - /* - * M (= A - 2*B) already has the correct value - */ - } else { - /* only D=3 remains */ - if (!BN_set_word(D, 3)) - goto err; - - /* - * currently M = A - 2*B, but we need M = A - 3*B - */ - if (!BN_sub(M, M, B)) - goto err; - } - } - } else { - if (!BN_div(D, M, A, B, ctx)) - goto err; - } - - /*- - * Now - * A = D*B + M; - * thus we have - * (**) sign*Y*a == D*B + M (mod |n|). - */ - tmp = A; /* keep the BIGNUM object, the value does not matter */ - /* (A, B) := (B, A mod B) ... */ - A = B; - B = M; - /* ... so we have 0 <= B < A again */ - - /*- - * Since the former M is now B and the former B is now A, - * (**) translates into - * sign*Y*a == D*A + B (mod |n|), - * i.e. - * sign*Y*a - D*A == B (mod |n|). - * Similarly, (*) translates into - * -sign*X*a == A (mod |n|). - * - * Thus, - * sign*Y*a + D*sign*X*a == B (mod |n|), - * i.e. - * sign*(Y + D*X)*a == B (mod |n|). - * - * So if we set (X, Y, sign) := (Y + D*X, X, -sign), we arrive back at - * -sign*X*a == B (mod |n|), - * sign*Y*a == A (mod |n|). - * Note that X and Y stay non-negative all the time. - */ - - /* - * most of the time D is very small, so we can optimize tmp := D*X+Y - */ - if (BN_is_one(D)) { - if (!BN_add(tmp, X, Y)) - goto err; - } else { - if (BN_is_word(D, 2)) { - if (!BN_lshift1(tmp, X)) - goto err; - } else if (BN_is_word(D, 4)) { - if (!BN_lshift(tmp, X, 2)) - goto err; - } else if (D->top == 1) { - if (!BN_copy(tmp, X)) - goto err; - - if (!BN_mul_word(tmp, D->d[0])) - goto err; - } else { - if (!BN_mul(tmp, D, X, ctx)) - goto err; - } - - if (!BN_add(tmp, tmp, Y)) - goto err; - } - - M = Y; /* keep the BIGNUM object, the value does not matter */ - Y = X; - X = tmp; - sign = -sign; - } - } - - /*- - * The while loop (Euclid's algorithm) ends when - * A == gcd(a,n); - * we have - * sign*Y*a == A (mod |n|), - * where Y is non-negative. - */ - - if (sign < 0) { - if (!BN_sub(Y, n, Y)) - goto err; - } - - /* Now Y*a == A (mod |n|). */ - - if (BN_is_one(A)) { - /* Y*a == 1 (mod |n|) */ - if (!Y->neg && BN_ucmp(Y, n) < 0) { - if (!BN_copy(R, Y)) - goto err; - } else { - if (!BN_nnmod(R, Y, n, ctx)) - goto err; - } - } else { - if (pnoinv) - *pnoinv = 1; - - goto err; - } - - ret = R; -err: - - if ((ret == NULL) && (in == NULL)) - BN_free(R); - - BN_CTX_end(ctx); - bn_check_top(ret); - return ret; -} - -BIGNUM *BN_mod_inverse(BIGNUM *in, const BIGNUM *a, const BIGNUM *n, - BN_CTX *ctx) -{ - BIGNUM *rv; - int noinv; - rv = int_bn_mod_inverse(in, a, n, ctx, &noinv); - - if (noinv) - BNerr(BN_F_BN_MOD_INVERSE, BN_R_NO_INVERSE); - - return rv; -} - -int BN_lshift1(BIGNUM *r, const BIGNUM *a) -{ - register BN_ULONG *ap, *rp, t, c; - int i; - bn_check_top(r); - bn_check_top(a); - - if (r != a) { - r->neg = a->neg; - - if (bn_wexpand(r, a->top + 1) == NULL) - return 0; - - r->top = a->top; - } else { - if (bn_wexpand(r, a->top + 1) == NULL) - return 0; - } - - ap = a->d; - rp = r->d; - c = 0; - - for (i = 0; i < a->top; i++) { - t = *(ap++); - *(rp++) = ((t << 1) | c) & BN_MASK2; - c = (t & BN_TBIT) ? 1 : 0; - } - - if (c) { - *rp = 1; - r->top++; - } - - bn_check_top(r); - return 1; -} - -int BN_rshift1(BIGNUM *r, const BIGNUM *a) -{ - BN_ULONG *ap, *rp, t, c; - int i, j; - bn_check_top(r); - bn_check_top(a); - - if (BN_is_zero(a)) { - BN_zero(r); - return 1; - } - - i = a->top; - ap = a->d; - j = i - (ap[i - 1] == 1); - - if (a != r) { - if (bn_wexpand(r, j) == NULL) - return 0; - - r->neg = a->neg; - } - - rp = r->d; - t = ap[--i]; - c = (t & 1) ? BN_TBIT : 0; - - if (t >>= 1) - rp[i] = t; - - while (i > 0) { - t = ap[--i]; - rp[i] = ((t >> 1) & BN_MASK2) | c; - c = (t & 1) ? BN_TBIT : 0; - } - - r->top = j; - - if (!r->top) - r->neg = 0; /* don't allow negative zero */ - - bn_check_top(r); - return 1; -} - -int BN_lshift(BIGNUM *r, const BIGNUM *a, int n) -{ - int i, nw, lb, rb; - BN_ULONG *t, *f; - BN_ULONG l; - bn_check_top(r); - bn_check_top(a); - - if (n < 0) { - BNerr(BN_F_BN_LSHIFT, BN_R_INVALID_SHIFT); - return 0; - } - - nw = n / BN_BITS2; - - if (bn_wexpand(r, a->top + nw + 1) == NULL) - return 0; - - r->neg = a->neg; - lb = n % BN_BITS2; - rb = BN_BITS2 - lb; - f = a->d; - t = r->d; - t[a->top + nw] = 0; - - if (lb == 0) - for (i = a->top - 1; i >= 0; i--) - t[nw + i] = f[i]; - else - for (i = a->top - 1; i >= 0; i--) { - l = f[i]; - t[nw + i + 1] |= (l >> rb) & BN_MASK2; - t[nw + i] = (l << lb) & BN_MASK2; - } - - memset(t, 0, sizeof(*t) * nw); - r->top = a->top + nw + 1; - bn_correct_top(r); - bn_check_top(r); - return 1; -} - -int BN_rshift(BIGNUM *r, const BIGNUM *a, int n) -{ - int i, j, nw, lb, rb; - BN_ULONG *t, *f; - BN_ULONG l, tmp; - bn_check_top(r); - bn_check_top(a); - - if (n < 0) { - BNerr(BN_F_BN_RSHIFT, BN_R_INVALID_SHIFT); - return 0; - } - - nw = n / BN_BITS2; - rb = n % BN_BITS2; - lb = BN_BITS2 - rb; - - if (nw >= a->top || a->top == 0) { - BN_zero(r); - return 1; - } - - i = (BN_num_bits(a) - n + (BN_BITS2 - 1)) / BN_BITS2; - - if (r != a) { - if (bn_wexpand(r, i) == NULL) - return 0; - - r->neg = a->neg; - } else { - if (n == 0) - return 1; /* or the copying loop will go berserk */ - } - - f = &(a->d[nw]); - t = r->d; - j = a->top - nw; - r->top = i; - - if (rb == 0) { - for (i = j; i != 0; i--) - *(t++) = *(f++); - } else { - l = *(f++); - - for (i = j - 1; i != 0; i--) { - tmp = (l >> rb) & BN_MASK2; - l = *(f++); - *(t++) = (tmp | (l << lb)) & BN_MASK2; - } - l = (l >> rb); - if ((l & BN_MASK2)) - *(t) = l; - } - - if (!r->top) - r->neg = 0; /* don't allow negative zero */ - - bn_check_top(r); - return 1; -} - -int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx) -{ - /* - * like BN_mod, but returns non-negative remainder (i.e., 0 <= r < |d| - * always holds) - */ - if (!(BN_mod(r, m, d, ctx))) - return 0; - - if (!r->neg) - return 1; - - /* now -|d| < r < 0, so we have to set r := r + |d| */ - return (d->neg ? BN_sub : BN_add)(r, r, d); -} - -int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, - BN_CTX *ctx) -{ - if (!BN_add(r, a, b)) - return 0; - - return BN_nnmod(r, r, m, ctx); -} - -/* - * BN_mod_add variant that may be used if both a and b are non-negative and - * less than m - */ -int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, - const BIGNUM *m) -{ - if (!BN_uadd(r, a, b)) - return 0; - - if (BN_ucmp(r, m) >= 0) - return BN_usub(r, r, m); - - return 1; -} - -int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, - BN_CTX *ctx) -{ - if (!BN_sub(r, a, b)) - return 0; - - return BN_nnmod(r, r, m, ctx); -} - -/* - * BN_mod_sub variant that may be used if both a and b are non-negative and - * less than m - */ -int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, - const BIGNUM *m) -{ - if (!BN_sub(r, a, b)) - return 0; - - if (r->neg) - return BN_add(r, r, m); - - return 1; -} - -/* slow but works */ -int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, - BN_CTX *ctx) -{ - BIGNUM *t; - int ret = 0; - bn_check_top(a); - bn_check_top(b); - bn_check_top(m); - BN_CTX_start(ctx); - - t = BN_CTX_get(ctx); - if (t == NULL) - goto err; - - if (a == b) { - if (!BN_sqr(t, a, ctx)) - goto err; - } else { - if (!BN_mul(t, a, b, ctx)) - goto err; - } - - if (!BN_nnmod(r, t, m, ctx)) - goto err; - - bn_check_top(r); - ret = 1; -err: - BN_CTX_end(ctx); - return ret; -} - -int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) -{ - if (!BN_sqr(r, a, ctx)) - return 0; - - /* r->neg == 0, thus we don't need BN_nnmod */ - return BN_mod(r, r, m, ctx); -} - -int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) -{ - if (!BN_lshift1(r, a)) - return 0; - - bn_check_top(r); - return BN_nnmod(r, r, m, ctx); -} - -/* - * BN_mod_lshift1 variant that may be used if a is non-negative and less than - * m - */ -int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m) -{ - if (!BN_lshift1(r, a)) - return 0; - - bn_check_top(r); - - if (BN_cmp(r, m) >= 0) - return BN_sub(r, r, m); - - return 1; -} - -int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, - BN_CTX *ctx) -{ - BIGNUM *abs_m = NULL; - int ret; - - if (!BN_nnmod(r, a, m, ctx)) - return 0; - - if (m->neg) { - abs_m = BN_dup(m); - - if (abs_m == NULL) - return 0; - - abs_m->neg = 0; - } - - ret = BN_mod_lshift_quick(r, r, n, (abs_m ? abs_m : m)); - bn_check_top(r); - BN_free(abs_m); - return ret; -} - -/* - * BN_mod_lshift variant that may be used if a is non-negative and less than - * m - */ -int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m) -{ - if (r != a) { - if (BN_copy(r, a) == NULL) - return 0; - } - - while (n > 0) { - int max_shift; - /* 0 < r < m */ - max_shift = BN_num_bits(m) - BN_num_bits(r); - /* max_shift >= 0 */ - - if (max_shift < 0) { - BNerr(BN_F_BN_MOD_LSHIFT_QUICK, BN_R_INPUT_NOT_REDUCED); - return 0; - } - - if (max_shift > n) - max_shift = n; - - if (max_shift) { - if (!BN_lshift(r, r, max_shift)) - return 0; - - n -= max_shift; - } else { - if (!BN_lshift1(r, r)) - return 0; - - --n; - } - - /* BN_num_bits(r) <= BN_num_bits(m) */ - - if (BN_cmp(r, m) >= 0) { - if (!BN_sub(r, r, m)) - return 0; - } - } - - bn_check_top(r); - return 1; -} - -/* r can == a or b */ -int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) -{ - int a_neg = a->neg, ret; - bn_check_top(a); - bn_check_top(b); - - /*- - * a + b a+b - * a + -b a-b - * -a + b b-a - * -a + -b -(a+b) - */ - if (a_neg ^ b->neg) { - /* only one is negative */ - if (a_neg) { - const BIGNUM *tmp; - tmp = a; - a = b; - b = tmp; - } - - /* we are now a - b */ - - if (BN_ucmp(a, b) < 0) { - if (!BN_usub(r, b, a)) - return 0; - - r->neg = 1; - } else { - if (!BN_usub(r, a, b)) - return 0; - - r->neg = 0; - } - - return 1; - } - - ret = BN_uadd(r, a, b); - r->neg = a_neg; - bn_check_top(r); - return ret; -} - -/* unsigned add of b to a */ -int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) -{ - int max, min, dif; - const BN_ULONG *ap, *bp; - BN_ULONG *rp, carry, t1, t2; - bn_check_top(a); - bn_check_top(b); - - if (a->top < b->top) { - const BIGNUM *tmp; - tmp = a; - a = b; - b = tmp; - } - - max = a->top; - min = b->top; - dif = max - min; - - if (bn_wexpand(r, max + 1) == NULL) - return 0; - - r->top = max; - ap = a->d; - bp = b->d; - rp = r->d; - carry = bn_add_words(rp, ap, bp, min); - rp += min; - ap += min; - - while (dif) { - dif--; - t1 = *(ap++); - t2 = (t1 + carry) & BN_MASK2; - *(rp++) = t2; - carry &= (t2 == 0); - } - - *rp = carry; - r->top += carry; - r->neg = 0; - bn_check_top(r); - return 1; -} - -/* unsigned subtraction of b from a, a must be larger than b. */ -int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) -{ - int max, min, dif; - BN_ULONG t1, t2, borrow, *rp; - const BN_ULONG *ap, *bp; - bn_check_top(a); - bn_check_top(b); - max = a->top; - min = b->top; - dif = max - min; - - if (dif < 0) { /* hmm... should not be happening */ - BNerr(BN_F_BN_USUB, BN_R_ARG2_LT_ARG3); - return 0; - } - - if (bn_wexpand(r, max) == NULL) - return 0; - - ap = a->d; - bp = b->d; - rp = r->d; - borrow = bn_sub_words(rp, ap, bp, min); - ap += min; - rp += min; - - while (dif) { - dif--; - t1 = *(ap++); - t2 = (t1 - borrow) & BN_MASK2; - *(rp++) = t2; - borrow &= (t1 == 0); - } - - r->top = max; - r->neg = 0; - bn_correct_top(r); - return 1; -} - -int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) -{ - int max; - int add = 0, neg = 0; - bn_check_top(a); - bn_check_top(b); - - /*- - * a - b a-b - * a - -b a+b - * -a - b -(a+b) - * -a - -b b-a - */ - if (a->neg) { - if (b->neg) { - const BIGNUM *tmp; - tmp = a; - a = b; - b = tmp; - } else { - add = 1; - neg = 1; - } - } else { - if (b->neg) { - add = 1; - neg = 0; - } - } - - if (add) { - if (!BN_uadd(r, a, b)) - return 0; - - r->neg = neg; - return 1; - } - - /* We are actually doing a - b :-) */ - max = (a->top > b->top) ? a->top : b->top; - - if (bn_wexpand(r, max) == NULL) - return 0; - - if (BN_ucmp(a, b) < 0) { - if (!BN_usub(r, b, a)) - return 0; - - r->neg = 1; - } else { - if (!BN_usub(r, a, b)) - return 0; - - r->neg = 0; - } - - bn_check_top(r); - return 1; -} - -BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w) -{ -#ifndef BN_LLONG - BN_ULONG ret = 0; -#else - BN_ULLONG ret = 0; -#endif - int i; - - if (w == 0) - return (BN_ULONG)-1; - -#ifndef BN_LLONG - - /* - * If |w| is too long and we don't have BN_ULLONG then we need to fall - * back to using BN_div_word - */ - if (w > ((BN_ULONG)1 << BN_BITS4)) { - BIGNUM *tmp = BN_dup(a); - - if (tmp == NULL) - return (BN_ULONG)-1; - - ret = BN_div_word(tmp, w); - BN_free(tmp); - return ret; - } - -#endif - bn_check_top(a); - w &= BN_MASK2; - - for (i = a->top - 1; i >= 0; i--) { -#ifndef BN_LLONG - /* - * We can assume here that | w <= ((BN_ULONG)1 << BN_BITS4) | and so - * | ret < ((BN_ULONG)1 << BN_BITS4) | and therefore the shifts here are - * safe and will not overflow - */ - ret = ((ret << BN_BITS4) | - ((a->d[i] >> BN_BITS4) & BN_MASK2l)) % - w; - ret = ((ret << BN_BITS4) | (a->d[i] & BN_MASK2l)) % w; -#else - ret = (BN_ULLONG)(((ret << (BN_ULLONG)BN_BITS2) | a->d[i]) % - (BN_ULLONG)w); -#endif - } - - return ((BN_ULONG)ret); -} - -BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w) -{ - BN_ULONG ret = 0; - int i, j; - bn_check_top(a); - w &= BN_MASK2; - - if (!w) - /* actually this an error (division by zero) */ - return (BN_ULONG)-1; - - if (a->top == 0) - return 0; - - /* normalize input (so bn_div_words doesn't complain) */ - j = BN_BITS2 - BN_num_bits_word(w); - w <<= j; - - if (!BN_lshift(a, a, j)) - return (BN_ULONG)-1; - - for (i = a->top - 1; i >= 0; i--) { - BN_ULONG l, d; - l = a->d[i]; - d = bn_div_words(ret, l, w); - ret = (l - ((d * w) & BN_MASK2)) & BN_MASK2; - a->d[i] = d; - } - - if ((a->top > 0) && (a->d[a->top - 1] == 0)) - a->top--; - - ret >>= j; - - if (!a->top) - a->neg = 0; /* don't allow negative zero */ - - bn_check_top(a); - return ret; -} - -int BN_add_word(BIGNUM *a, BN_ULONG w) -{ - BN_ULONG l; - int i; - bn_check_top(a); - w &= BN_MASK2; - - /* degenerate case: w is zero */ - if (!w) - return 1; - - /* degenerate case: a is zero */ - if (BN_is_zero(a)) - return BN_set_word(a, w); - - /* handle 'a' when negative */ - if (a->neg) { - a->neg = 0; - i = BN_sub_word(a, w); - - if (!BN_is_zero(a)) - a->neg = !(a->neg); - - return i; - } - - for (i = 0; w != 0 && i < a->top; i++) { - a->d[i] = l = (a->d[i] + w) & BN_MASK2; - w = (w > l) ? 1 : 0; - } - - if (w && i == a->top) { - if (bn_wexpand(a, a->top + 1) == NULL) - return 0; - - a->top++; - a->d[i] = w; - } - - bn_check_top(a); - return 1; -} - -int BN_sub_word(BIGNUM *a, BN_ULONG w) -{ - int i; - bn_check_top(a); - w &= BN_MASK2; - - /* degenerate case: w is zero */ - if (!w) - return 1; - - /* degenerate case: a is zero */ - if (BN_is_zero(a)) { - i = BN_set_word(a, w); - - if (i != 0) - BN_set_negative(a, 1); - - return i; - } - - /* handle 'a' when negative */ - if (a->neg) { - a->neg = 0; - i = BN_add_word(a, w); - a->neg = 1; - return i; - } - - if ((a->top == 1) && (a->d[0] < w)) { - a->d[0] = w - a->d[0]; - a->neg = 1; - return 1; - } - - i = 0; - - for (;;) { - if (a->d[i] >= w) { - a->d[i] -= w; - break; - } else { - a->d[i] = (a->d[i] - w) & BN_MASK2; - i++; - w = 1; - } - } - - if ((a->d[i] == 0) && (i == (a->top - 1))) - a->top--; - - bn_check_top(a); - return 1; -} - -int BN_mul_word(BIGNUM *a, BN_ULONG w) -{ - BN_ULONG ll; - bn_check_top(a); - w &= BN_MASK2; - - if (a->top) { - if (w == 0) - BN_zero(a); - else { - ll = bn_mul_words(a->d, a->d, a->top, w); - - if (ll) { - if (bn_wexpand(a, a->top + 1) == NULL) - return 0; - - a->d[a->top++] = ll; - } - } - } - - bn_check_top(a); - return 1; -} - -/*- - * BN_div computes dv := num / divisor, rounding towards - * zero, and sets up rm such that dv*divisor + rm = num holds. - * Thus: - * dv->neg == num->neg ^ divisor->neg (unless the result is zero) - * rm->neg == num->neg (unless the remainder is zero) - * If 'dv' or 'rm' is NULL, the respective value is not returned. - */ -int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, - BN_CTX *ctx) -{ - int norm_shift, i, loop; - BIGNUM *tmp, wnum, *snum, *sdiv, *res; - BN_ULONG *resp, *wnump; - BN_ULONG d0, d1; - int num_n, div_n; - int no_branch = 0; - - /* - * Invalid zero-padding would have particularly bad consequences so don't - * just rely on bn_check_top() here (bn_check_top() works only for - * BN_DEBUG builds) - */ - if ((num->top > 0 && num->d[num->top - 1] == 0) || - (divisor->top > 0 && divisor->d[divisor->top - 1] == 0)) { - BNerr(BN_F_BN_DIV, BN_R_NOT_INITIALIZED); - return 0; - } - - bn_check_top(num); - bn_check_top(divisor); - - if ((BN_get_flags(num, BN_FLG_CONSTTIME) != 0) || - (BN_get_flags(divisor, BN_FLG_CONSTTIME) != 0)) - no_branch = 1; - - bn_check_top(dv); - bn_check_top(rm); - /*- bn_check_top(num); */ /* - * 'num' has been checked already - */ - /*- bn_check_top(divisor); */ /* - * 'divisor' has been checked already - */ - - if (BN_is_zero(divisor)) { - BNerr(BN_F_BN_DIV, BN_R_DIV_BY_ZERO); - return 0; - } - - if (!no_branch && BN_ucmp(num, divisor) < 0) { - if (rm != NULL) { - if (BN_copy(rm, num) == NULL) - return 0; - } - - if (dv != NULL) - BN_zero(dv); - - return 1; - } - - BN_CTX_start(ctx); - tmp = BN_CTX_get(ctx); - snum = BN_CTX_get(ctx); - sdiv = BN_CTX_get(ctx); - - if (dv == NULL) - res = BN_CTX_get(ctx); - else - res = dv; - - if (sdiv == NULL || res == NULL || tmp == NULL || snum == NULL) - goto err; - - /* First we normalise the numbers */ - norm_shift = BN_BITS2 - ((BN_num_bits(divisor)) % BN_BITS2); - - if (!(BN_lshift(sdiv, divisor, norm_shift))) - goto err; - - sdiv->neg = 0; - norm_shift += BN_BITS2; - - if (!(BN_lshift(snum, num, norm_shift))) - goto err; - - snum->neg = 0; - - if (no_branch) { - /* - * Since we don't know whether snum is larger than sdiv, we pad snum - * with enough zeroes without changing its value. - */ - if (snum->top <= sdiv->top + 1) { - if (bn_wexpand(snum, sdiv->top + 2) == NULL) - goto err; - - for (i = snum->top; i < sdiv->top + 2; i++) - snum->d[i] = 0; - - snum->top = sdiv->top + 2; - } else { - if (bn_wexpand(snum, snum->top + 1) == NULL) - goto err; - - snum->d[snum->top] = 0; - snum->top++; - } - } - - div_n = sdiv->top; - num_n = snum->top; - loop = num_n - div_n; - /* - * Lets setup a 'window' into snum This is the part that corresponds to - * the current 'area' being divided - */ - wnum.neg = 0; - wnum.d = &(snum->d[loop]); - wnum.top = div_n; - /* - * only needed when BN_ucmp messes up the values between top and max - */ - wnum.dmax = snum->dmax - loop; /* so we don't step out of bounds */ - /* Get the top 2 words of sdiv */ - /* div_n=sdiv->top; */ - d0 = sdiv->d[div_n - 1]; - d1 = (div_n == 1) ? 0 : sdiv->d[div_n - 2]; - /* pointer to the 'top' of snum */ - wnump = &(snum->d[num_n - 1]); - - /* Setup to 'res' */ - if (!bn_wexpand(res, (loop + 1))) - goto err; - - res->neg = (num->neg ^ divisor->neg); - res->top = loop - no_branch; - resp = &(res->d[loop - 1]); - - /* space for temp */ - if (!bn_wexpand(tmp, (div_n + 1))) - goto err; - - if (!no_branch) { - if (BN_ucmp(&wnum, sdiv) >= 0) { - /* - * If BN_DEBUG_RAND is defined BN_ucmp changes (via bn_pollute) - * the const bignum arguments => clean the values between top and - * max again - */ - bn_sub_words(wnum.d, wnum.d, sdiv->d, div_n); - *resp = 1; - } else - res->top--; - } - - /* Increase the resp pointer so that we never create an invalid pointer. */ - resp++; - - /* - * if res->top == 0 then clear the neg value otherwise decrease the resp - * pointer - */ - if (res->top == 0) - res->neg = 0; - else - resp--; - - for (i = 0; i < loop - 1; i++, wnump--) { - BN_ULONG q, l0; - /* - * the first part of the loop uses the top two words of snum and sdiv - * to calculate a BN_ULONG q such that | wnum - sdiv * q | < sdiv - */ -#if defined(BN_DIV3W) && !defined(OPENSSL_NO_ASM) - BN_ULONG bn_div_3_words(BN_ULONG *, BN_ULONG, BN_ULONG); - q = bn_div_3_words(wnump, d1, d0); -#else - BN_ULONG n0, n1, rem = 0; - n0 = wnump[0]; - n1 = wnump[-1]; - - if (n0 == d0) - q = BN_MASK2; - else { /* n0 < d0 */ -#ifdef BN_LLONG - BN_ULLONG t2; -#if defined(BN_LLONG) && defined(BN_DIV2W) && !defined(bn_div_words) - q = (BN_ULONG)(((((BN_ULLONG)n0) << BN_BITS2) | n1) / - d0); -#else - q = bn_div_words(n0, n1, d0); -#endif -#ifndef REMAINDER_IS_ALREADY_CALCULATED - /* - * rem doesn't have to be BN_ULLONG. The least we - * know it's less that d0, isn't it? - */ - rem = (n1 - q * d0) & BN_MASK2; -#endif - t2 = (BN_ULLONG)d1 * q; - - for (;;) { - if (t2 <= ((((BN_ULLONG)rem) << BN_BITS2) | - wnump[-2])) - break; - - q--; - rem += d0; - - if (rem < d0) - break; /* don't let rem overflow */ - - t2 -= d1; - } - -#else /* !BN_LLONG */ - BN_ULONG t2l, t2h; - q = bn_div_words(n0, n1, d0); -#ifndef REMAINDER_IS_ALREADY_CALCULATED - rem = (n1 - q * d0) & BN_MASK2; -#endif -#if defined(BN_UMULT_LOHI) - BN_UMULT_LOHI(t2l, t2h, d1, q); -#elif defined(BN_UMULT_HIGH) - t2l = d1 * q; - t2h = BN_UMULT_HIGH(d1, q); -#else - { - BN_ULONG ql, qh; - t2l = LBITS(d1); - t2h = HBITS(d1); - ql = LBITS(q); - qh = HBITS(q); - mul64(t2l, t2h, ql, - qh); /* t2=(BN_ULLONG)d1*q; */ - } -#endif - - for (;;) { - if ((t2h < rem) || - ((t2h == rem) && (t2l <= wnump[-2]))) - break; - - q--; - rem += d0; - - if (rem < d0) - break; /* don't let rem overflow */ - - if (t2l < d1) - t2h--; - - t2l -= d1; - } - -#endif /* !BN_LLONG */ - } - -#endif /* !BN_DIV3W */ - l0 = bn_mul_words(tmp->d, sdiv->d, div_n, q); - tmp->d[div_n] = l0; - wnum.d--; - - /* - * ingore top values of the bignums just sub the two BN_ULONG arrays - * with bn_sub_words - */ - if (bn_sub_words(wnum.d, wnum.d, tmp->d, div_n + 1)) { - /* - * Note: As we have considered only the leading two BN_ULONGs in - * the calculation of q, sdiv * q might be greater than wnum (but - * then (q-1) * sdiv is less or equal than wnum) - */ - q--; - - if (bn_add_words(wnum.d, wnum.d, sdiv->d, div_n)) - /* - * we can't have an overflow here (assuming that q != 0, but - * if q == 0 then tmp is zero anyway) - */ - (*wnump)++; - } - - /* store part of the result */ - resp--; - *resp = q; - } - - bn_correct_top(snum); - - if (rm != NULL) { - /* - * Keep a copy of the neg flag in num because if rm==num BN_rshift() - * will overwrite it. - */ - int neg = num->neg; - BN_rshift(rm, snum, norm_shift); - - if (!BN_is_zero(rm)) - rm->neg = neg; - - bn_check_top(rm); - } - - if (no_branch) - bn_correct_top(res); - - BN_CTX_end(ctx); - return 1; -err: - bn_check_top(rm); - BN_CTX_end(ctx); - return 0; -} - -static inline unsigned int constant_time_msb(unsigned int a) -{ - return 0 - (a >> (sizeof(a) * 8 - 1)); -} - -static inline unsigned int constant_time_is_zero(unsigned int a) -{ - return constant_time_msb(~a & (a - 1)); -} - -static inline unsigned int constant_time_eq(unsigned int a, unsigned int b) -{ - return constant_time_is_zero(a ^ b); -} - -static inline unsigned int constant_time_eq_int(int a, int b) -{ - return constant_time_eq((unsigned)(a), (unsigned)(b)); -} - -/* maximum precomputation table size for *variable* sliding windows */ -#define TABLESIZE 32 - -/* this one works - simple but works */ -int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) -{ - int i, bits, ret = 0; - BIGNUM *v, *rr; - - if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0 || - BN_get_flags(a, BN_FLG_CONSTTIME) != 0) { - /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */ - BNerr(BN_F_BN_EXP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } - - BN_CTX_start(ctx); - - if ((r == a) || (r == p)) - rr = BN_CTX_get(ctx); - else - rr = r; - - v = BN_CTX_get(ctx); - - if (rr == NULL || v == NULL) - goto err; - - if (BN_copy(v, a) == NULL) - goto err; - - bits = BN_num_bits(p); - - if (BN_is_odd(p)) { - if (BN_copy(rr, a) == NULL) - goto err; - } else { - if (!BN_one(rr)) - goto err; - } - - for (i = 1; i < bits; i++) { - if (!BN_sqr(v, v, ctx)) - goto err; - - if (BN_is_bit_set(p, i)) { - if (!BN_mul(rr, rr, v, ctx)) - goto err; - } - } - - if (r != rr && BN_copy(r, rr) == NULL) - goto err; - - ret = 1; -err: - BN_CTX_end(ctx); - bn_check_top(r); - return ret; -} - -int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, - BN_CTX *ctx) -{ - int ret; - bn_check_top(a); - bn_check_top(p); - bn_check_top(m); - /*- - * For even modulus m = 2^k*m_odd, it might make sense to compute - * a^p mod m_odd and a^p mod 2^k separately (with Montgomery - * exponentiation for the odd part), using appropriate exponent - * reductions, and combine the results using the CRT. - * - * For now, we use Montgomery only if the modulus is odd; otherwise, - * exponentiation using the reciprocal-based quick remaindering - * algorithm is used. - * - * (Timing obtained with expspeed.c [computations a^p mod m - * where a, p, m are of the same length: 256, 512, 1024, 2048, - * 4096, 8192 bits], compared to the running time of the - * standard algorithm: - * - * BN_mod_exp_mont 33 .. 40 % [AMD K6-2, Linux, debug configuration] - * 55 .. 77 % [UltraSparc processor, but - * debug-solaris-sparcv8-gcc conf.] - * - * BN_mod_exp_recp 50 .. 70 % [AMD K6-2, Linux, debug configuration] - * 62 .. 118 % [UltraSparc, debug-solaris-sparcv8-gcc] - * - * On the Sparc, BN_mod_exp_recp was faster than BN_mod_exp_mont - * at 2048 and more bits, but at 512 and 1024 bits, it was - * slower even than the standard algorithm! - * - * "Real" timings [linux-elf, solaris-sparcv9-gcc configurations] - * should be obtained when the new Montgomery reduction code - * has been integrated into OpenSSL.) - */ -#define MONT_MUL_MOD -#define MONT_EXP_WORD -#define RECP_MUL_MOD -#ifdef MONT_MUL_MOD - /* - * I have finally been able to take out this pre-condition of the top bit - * being set. It was caused by an error in BN_div with negatives. There - * was also another problem when for a^b%m a >= m. eay 07-May-97 - */ - /* if ((m->d[m->top-1]&BN_TBIT) && BN_is_odd(m)) */ - - if (BN_is_odd(m)) { -#ifdef MONT_EXP_WORD - - if (a->top == 1 && !a->neg && - (BN_get_flags(p, BN_FLG_CONSTTIME) == 0) && - (BN_get_flags(a, BN_FLG_CONSTTIME) == 0) && - (BN_get_flags(m, BN_FLG_CONSTTIME) == 0)) { - BN_ULONG A = a->d[0]; - ret = BN_mod_exp_mont_word(r, A, p, m, ctx, NULL); - } else -#endif - ret = BN_mod_exp_mont(r, a, p, m, ctx, NULL); - } else -#endif -#ifdef RECP_MUL_MOD - { - ret = BN_mod_exp_recp(r, a, p, m, ctx); - } - -#else - { - ret = BN_mod_exp_simple(r, a, p, m, ctx); - } -#endif - bn_check_top(r); - return ret; -} - -int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx) -{ - int i, j, bits, ret = 0, wstart, wend, window, wvalue; - int start = 1; - BIGNUM *aa; - /* Table of variables obtained from 'ctx' */ - BIGNUM *val[TABLESIZE]; - BN_RECP_CTX recp; - - if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0 || - BN_get_flags(a, BN_FLG_CONSTTIME) != 0 || - BN_get_flags(m, BN_FLG_CONSTTIME) != 0) { - /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */ - BNerr(BN_F_BN_MOD_EXP_RECP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } - - bits = BN_num_bits(p); - - if (bits == 0) { - /* x**0 mod 1 is still zero. */ - if (BN_is_one(m)) { - ret = 1; - BN_zero(r); - } else - ret = BN_one(r); - - return ret; - } - - BN_CTX_start(ctx); - aa = BN_CTX_get(ctx); - val[0] = BN_CTX_get(ctx); - - if (!aa || !val[0]) - goto err; - - BN_RECP_CTX_init(&recp); - - if (m->neg) { - /* ignore sign of 'm' */ - if (!BN_copy(aa, m)) - goto err; - - aa->neg = 0; - - if (BN_RECP_CTX_set(&recp, aa, ctx) <= 0) - goto err; - } else { - if (BN_RECP_CTX_set(&recp, m, ctx) <= 0) - goto err; - } - - if (!BN_nnmod(val[0], a, m, ctx)) - goto err; /* 1 */ - - if (BN_is_zero(val[0])) { - BN_zero(r); - ret = 1; - goto err; - } - - window = BN_window_bits_for_exponent_size(bits); - - if (window > 1) { - if (!BN_mod_mul_reciprocal(aa, val[0], val[0], &recp, ctx)) - goto err; /* 2 */ - - j = 1 << (window - 1); - - for (i = 1; i < j; i++) { - val[i] = BN_CTX_get(ctx); - if ((val[i] == NULL) || - !BN_mod_mul_reciprocal(val[i], val[i - 1], aa, - &recp, ctx)) - goto err; - } - } - - start = 1; /* This is used to avoid multiplication etc when there is only the value '1' in the buffer. */ - wvalue = 0; /* The 'value' of the window */ - wstart = bits - 1; /* The top bit of the window */ - wend = 0; /* The bottom bit of the window */ - - if (!BN_one(r)) - goto err; - - for (;;) { - if (BN_is_bit_set(p, wstart) == 0) { - if (!start) - if (!BN_mod_mul_reciprocal(r, r, r, &recp, ctx)) - goto err; - - if (wstart == 0) - break; - - wstart--; - continue; - } - - /* - * We now have wstart on a 'set' bit, we now need to work out how bit - * a window to do. To do this we need to scan forward until the last - * set bit before the end of the window - */ - j = wstart; - wvalue = 1; - wend = 0; - - for (i = 1; i < window; i++) { - if (wstart - i < 0) - break; - - if (BN_is_bit_set(p, wstart - i)) { - wvalue <<= (i - wend); - wvalue |= 1; - wend = i; - } - } - - /* wend is the size of the current window */ - j = wend + 1; - - /* add the 'bytes above' */ - if (!start) - for (i = 0; i < j; i++) { - if (!BN_mod_mul_reciprocal(r, r, r, &recp, ctx)) - goto err; - } - - /* wvalue will be an odd number < 2^window */ - if (!BN_mod_mul_reciprocal(r, r, val[wvalue >> 1], &recp, ctx)) - goto err; - - /* move the 'window' down further */ - wstart -= wend + 1; - wvalue = 0; - start = 0; - - if (wstart < 0) - break; - } - - ret = 1; -err: - BN_CTX_end(ctx); - BN_RECP_CTX_free(&recp); - bn_check_top(r); - return ret; -} - -int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont) -{ - int i, j, bits, ret = 0, wstart, wend, window, wvalue; - int start = 1; - BIGNUM *d, *r; - const BIGNUM *aa; - /* Table of variables obtained from 'ctx' */ - BIGNUM *val[TABLESIZE]; - BN_MONT_CTX *mont = NULL; - - if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0 || - BN_get_flags(a, BN_FLG_CONSTTIME) != 0 || - BN_get_flags(m, BN_FLG_CONSTTIME) != 0) - return BN_mod_exp_mont_consttime(rr, a, p, m, ctx, in_mont); - - bn_check_top(a); - bn_check_top(p); - bn_check_top(m); - - if (!BN_is_odd(m)) { - BNerr(BN_F_BN_MOD_EXP_MONT, BN_R_CALLED_WITH_EVEN_MODULUS); - return 0; - } - - bits = BN_num_bits(p); - - if (bits == 0) { - /* x**0 mod 1 is still zero. */ - if (BN_is_one(m)) { - ret = 1; - BN_zero(rr); - } else - ret = BN_one(rr); - - return ret; - } - - BN_CTX_start(ctx); - d = BN_CTX_get(ctx); - r = BN_CTX_get(ctx); - val[0] = BN_CTX_get(ctx); - - if (!d || !r || !val[0]) - goto err; - - /* - * If this is not done, things will break in the montgomery part - */ - - if (in_mont != NULL) - mont = in_mont; - else { - mont = BN_MONT_CTX_new(); - if (mont == NULL) - goto err; - - if (!BN_MONT_CTX_set(mont, m, ctx)) - goto err; - } - - if (a->neg || BN_ucmp(a, m) >= 0) { - if (!BN_nnmod(val[0], a, m, ctx)) - goto err; - - aa = val[0]; - } else - aa = a; - - if (BN_is_zero(aa)) { - BN_zero(rr); - ret = 1; - goto err; - } - - if (!BN_to_montgomery(val[0], aa, mont, ctx)) - goto err; /* 1 */ - - window = BN_window_bits_for_exponent_size(bits); - - if (window > 1) { - if (!BN_mod_mul_montgomery(d, val[0], val[0], mont, ctx)) - goto err; /* 2 */ - - j = 1 << (window - 1); - - for (i = 1; i < j; i++) { - val[i] = BN_CTX_get(ctx); - if ((val[i] == NULL) || - !BN_mod_mul_montgomery(val[i], val[i - 1], d, mont, - ctx)) - goto err; - } - } - - start = 1; /* This is used to avoid multiplication etc when there is only the value '1' in the buffer. */ - wvalue = 0; /* The 'value' of the window */ - wstart = bits - 1; /* The top bit of the window */ - wend = 0; /* The bottom bit of the window */ - j = m->top; /* borrow j */ - - if (m->d[j - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) { - if (bn_wexpand(r, j) == NULL) - goto err; - - /* 2^(top*BN_BITS2) - m */ - r->d[0] = (0 - m->d[0]) & BN_MASK2; - - for (i = 1; i < j; i++) - r->d[i] = (~m->d[i]) & BN_MASK2; - - r->top = j; - /* - * Upper words will be zero if the corresponding words of 'm' were - * 0xfff[...], so decrement r->top accordingly. - */ - bn_correct_top(r); - } else if (!BN_to_montgomery(r, BN_value_one(), mont, ctx)) - goto err; - - for (;;) { - if (BN_is_bit_set(p, wstart) == 0) { - if (!start) { - if (!BN_mod_mul_montgomery(r, r, r, mont, ctx)) - goto err; - } - - if (wstart == 0) - break; - - wstart--; - continue; - } - - /* - * We now have wstart on a 'set' bit, we now need to work out how bit - * a window to do. To do this we need to scan forward until the last - * set bit before the end of the window - */ - j = wstart; - wvalue = 1; - wend = 0; - - for (i = 1; i < window; i++) { - if (wstart - i < 0) - break; - - if (BN_is_bit_set(p, wstart - i)) { - wvalue <<= (i - wend); - wvalue |= 1; - wend = i; - } - } - - /* wend is the size of the current window */ - j = wend + 1; - - /* add the 'bytes above' */ - if (!start) - for (i = 0; i < j; i++) { - if (!BN_mod_mul_montgomery(r, r, r, mont, ctx)) - goto err; - } - - /* wvalue will be an odd number < 2^window */ - if (!BN_mod_mul_montgomery(r, r, val[wvalue >> 1], mont, ctx)) - goto err; - - /* move the 'window' down further */ - wstart -= wend + 1; - wvalue = 0; - start = 0; - - if (wstart < 0) - break; - } - -#if defined(SPARC_T4_MONT) - - if (OPENSSL_sparcv9cap_P[0] & (SPARCV9_VIS3 | SPARCV9_PREFER_FPU)) { - j = mont->N.top; /* borrow j */ - val[0]->d[0] = 1; /* borrow val[0] */ - - for (i = 1; i < j; i++) - val[0]->d[i] = 0; - - val[0]->top = j; - - if (!BN_mod_mul_montgomery(rr, r, val[0], mont, ctx)) - goto err; - } else -#endif - if (!BN_from_montgomery(rr, r, mont, ctx)) - goto err; - - ret = 1; -err: - - if (in_mont == NULL) - BN_MONT_CTX_free(mont); - - BN_CTX_end(ctx); - bn_check_top(rr); - return ret; -} - -#if defined(SPARC_T4_MONT) -static BN_ULONG bn_get_bits(const BIGNUM *a, int bitpos) -{ - BN_ULONG ret = 0; - int wordpos; - wordpos = bitpos / BN_BITS2; - bitpos %= BN_BITS2; - - if (wordpos >= 0 && wordpos < a->top) { - ret = a->d[wordpos] & BN_MASK2; - - if (bitpos) { - ret >>= bitpos; - - if (++wordpos < a->top) - ret |= a->d[wordpos] << (BN_BITS2 - bitpos); - } - } - - return ret & BN_MASK2; -} -#endif - -/* - * BN_mod_exp_mont_consttime() stores the precomputed powers in a specific - * layout so that accessing any of these table values shows the same access - * pattern as far as cache lines are concerned. The following functions are - * used to transfer a BIGNUM from/to that table. - */ - -static int MOD_EXP_CTIME_COPY_TO_PREBUF(const BIGNUM *b, int top, - unsigned char *buf, int idx, int window) -{ - int i, j; - int width = 1 << window; - BN_ULONG *table = (BN_ULONG *)buf; - - if (top > b->top) - top = b->top; /* this works because 'buf' is explicitly zeroed */ - - for (i = 0, j = idx; i < top; i++, j += width) - table[j] = b->d[i]; - - return 1; -} - -static int MOD_EXP_CTIME_COPY_FROM_PREBUF(BIGNUM *b, int top, - unsigned char *buf, int idx, - int window) -{ - int i, j; - int width = 1 << window; - /* - * We declare table 'volatile' in order to discourage compiler - * from reordering loads from the table. Concern is that if - * reordered in specific manner loads might give away the - * information we are trying to conceal. Some would argue that - * compiler can reorder them anyway, but it can as well be - * argued that doing so would be violation of standard... - */ - volatile BN_ULONG *table = (volatile BN_ULONG *)buf; - - if (bn_wexpand(b, top) == NULL) - return 0; - - if (window <= 3) { - for (i = 0; i < top; i++, table += width) { - BN_ULONG acc = 0; - - for (j = 0; j < width; j++) { - acc |= table[j] & - ((BN_ULONG)0 - - (constant_time_eq_int(j, idx) & 1)); - } - - b->d[i] = acc; - } - } else { - int xstride = 1 << (window - 2); - BN_ULONG y0, y1, y2, y3; - i = idx >> (window - 2); /* equivalent of idx / xstride */ - idx &= xstride - 1; /* equivalent of idx % xstride */ - y0 = (BN_ULONG)0 - (constant_time_eq_int(i, 0) & 1); - y1 = (BN_ULONG)0 - (constant_time_eq_int(i, 1) & 1); - y2 = (BN_ULONG)0 - (constant_time_eq_int(i, 2) & 1); - y3 = (BN_ULONG)0 - (constant_time_eq_int(i, 3) & 1); - - for (i = 0; i < top; i++, table += width) { - BN_ULONG acc = 0; - - for (j = 0; j < xstride; j++) { - acc |= ((table[j + 0 * xstride] & y0) | - (table[j + 1 * xstride] & y1) | - (table[j + 2 * xstride] & y2) | - (table[j + 3 * xstride] & y3)) & - ((BN_ULONG)0 - - (constant_time_eq_int(j, idx) & 1)); - } - - b->d[i] = acc; - } - } - - b->top = top; - bn_correct_top(b); - return 1; -} - -/* - * Given a pointer value, compute the next address that is a cache line - * multiple. - */ -#define MOD_EXP_CTIME_ALIGN(x_) \ - ((unsigned char *)(x_) + \ - (MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH - \ - (((size_t)(x_)) & (MOD_EXP_CTIME_MIN_CACHE_LINE_MASK)))) - -/* - * This variant of BN_mod_exp_mont() uses fixed windows and the special - * precomputation memory layout to limit data-dependency to a minimum to - * protect secret exponents (cf. the hyper-threading timing attacks pointed - * out by Colin Percival, - * http://www.daemonology.net/hyperthreading-considered-harmful/) - */ -int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, - BN_MONT_CTX *in_mont) -{ - int i, bits, ret = 0, window, wvalue; - int top; - BN_MONT_CTX *mont = NULL; - int numPowers; - unsigned char *powerbufFree = NULL; - int powerbufLen = 0; - unsigned char *powerbuf = NULL; - BIGNUM tmp, am; -#if defined(SPARC_T4_MONT) - unsigned int t4 = 0; -#endif - bn_check_top(a); - bn_check_top(p); - bn_check_top(m); - - if (!BN_is_odd(m)) { - BNerr(BN_F_BN_MOD_EXP_MONT_CONSTTIME, - BN_R_CALLED_WITH_EVEN_MODULUS); - return 0; - } - - top = m->top; - bits = BN_num_bits(p); - - if (bits == 0) { - /* x**0 mod 1 is still zero. */ - if (BN_is_one(m)) { - ret = 1; - BN_zero(rr); - } else - ret = BN_one(rr); - - return ret; - } - - BN_CTX_start(ctx); - - /* - * Allocate a montgomery context if it was not supplied by the caller. If - * this is not done, things will break in the montgomery part. - */ - if (in_mont != NULL) - mont = in_mont; - else { - mont = BN_MONT_CTX_new(); - if (mont == NULL) - goto err; - - if (!BN_MONT_CTX_set(mont, m, ctx)) - goto err; - } - -#ifdef RSAZ_ENABLED - - /* - * If the size of the operands allow it, perform the optimized - * RSAZ exponentiation. For further information see - * crypto/bn/rsaz_exp.c and accompanying assembly modules. - */ - if ((16 == a->top) && (16 == p->top) && (BN_num_bits(m) == 1024) && - rsaz_avx2_eligible()) { - if (NULL == bn_wexpand(rr, 16)) - goto err; - - RSAZ_1024_mod_exp_avx2(rr->d, a->d, p->d, m->d, mont->RR.d, - mont->n0[0]); - rr->top = 16; - rr->neg = 0; - bn_correct_top(rr); - ret = 1; - goto err; - } else if ((8 == a->top) && (8 == p->top) && (BN_num_bits(m) == 512)) { - if (NULL == bn_wexpand(rr, 8)) - goto err; - - RSAZ_512_mod_exp(rr->d, a->d, p->d, m->d, mont->n0[0], - mont->RR.d); - rr->top = 8; - rr->neg = 0; - bn_correct_top(rr); - ret = 1; - goto err; - } - -#endif - /* Get the window size to use with size of p. */ - window = BN_window_bits_for_ctime_exponent_size(bits); -#if defined(SPARC_T4_MONT) - - if (window >= 5 && (top & 15) == 0 && top <= 64 && - (OPENSSL_sparcv9cap_P[1] & (CFR_MONTMUL | CFR_MONTSQR)) == - (CFR_MONTMUL | CFR_MONTSQR) && - (OPENSSL_sparcv9cap_P[0])) { - t4 = OPENSSL_sparcv9cap_P[0]; - window = 5; - } else -#endif -#if defined(OPENSSL_BN_ASM_MONT5) - if (window >= 5) { - window = - 5; /* ~5% improvement for RSA2048 sign, and even for RSA4096 */ - /* reserve space for mont->N.d[] copy */ - powerbufLen += top * sizeof(mont->N.d[0]); - } - -#endif - (void)0; - /* - * Allocate a buffer large enough to hold all of the pre-computed powers - * of am, am itself and tmp. - */ - numPowers = 1 << window; - powerbufLen += sizeof(m->d[0]) * - (top * numPowers + - ((2 * top) > numPowers ? (2 * top) : numPowers)); -#ifdef alloca - - if (powerbufLen < 3072) - powerbufFree = alloca(powerbufLen + - MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH); - else -#endif - os_alloc_mem(NULL, (UCHAR **)&powerbufFree, - powerbufLen + MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH); - - if (powerbufFree == NULL) - goto err; - - powerbuf = MOD_EXP_CTIME_ALIGN(powerbufFree); - memset(powerbuf, 0, powerbufLen); -#ifdef alloca - - if (powerbufLen < 3072) - powerbufFree = NULL; - -#endif - /* lay down tmp and am right after powers table */ - tmp.d = (BN_ULONG *)(powerbuf + sizeof(m->d[0]) * top * numPowers); - am.d = tmp.d + top; - tmp.top = am.top = 0; - tmp.dmax = am.dmax = top; - tmp.neg = am.neg = 0; - tmp.flags = am.flags = BN_FLG_STATIC_DATA; - /* prepare a^0 in Montgomery domain */ - - if (m->d[top - 1] & (((BN_ULONG)1) << (BN_BITS2 - 1))) { - /* 2^(top*BN_BITS2) - m */ - tmp.d[0] = (0 - m->d[0]) & BN_MASK2; - - for (i = 1; i < top; i++) - tmp.d[i] = (~m->d[i]) & BN_MASK2; - - tmp.top = top; - } else if (!BN_to_montgomery(&tmp, BN_value_one(), mont, ctx)) - goto err; - - /* prepare a^1 in Montgomery domain */ - if (a->neg || BN_ucmp(a, m) >= 0) { - if (!BN_mod(&am, a, m, ctx)) - goto err; - - if (!BN_to_montgomery(&am, &am, mont, ctx)) - goto err; - } else if (!BN_to_montgomery(&am, a, mont, ctx)) - goto err; - -#if defined(SPARC_T4_MONT) - - if (t4) { - typedef int (*bn_pwr5_mont_f)(BN_ULONG * tp, const BN_ULONG *np, - const BN_ULONG *n0, - const void *table, int power, - int bits); - int bn_pwr5_mont_t4_8(BN_ULONG * tp, const BN_ULONG *np, - const BN_ULONG *n0, const void *table, - int power, int bits); - int bn_pwr5_mont_t4_16(BN_ULONG * tp, const BN_ULONG *np, - const BN_ULONG *n0, const void *table, - int power, int bits); - int bn_pwr5_mont_t4_24(BN_ULONG * tp, const BN_ULONG *np, - const BN_ULONG *n0, const void *table, - int power, int bits); - int bn_pwr5_mont_t4_32(BN_ULONG * tp, const BN_ULONG *np, - const BN_ULONG *n0, const void *table, - int power, int bits); - static const bn_pwr5_mont_f pwr5_funcs[4] = { - bn_pwr5_mont_t4_8, bn_pwr5_mont_t4_16, - bn_pwr5_mont_t4_24, bn_pwr5_mont_t4_32 - }; - bn_pwr5_mont_f pwr5_worker = pwr5_funcs[top / 16 - 1]; - typedef int (*bn_mul_mont_f)(BN_ULONG * rp, const BN_ULONG *ap, - const void *bp, const BN_ULONG *np, - const BN_ULONG *n0); - int bn_mul_mont_t4_8(BN_ULONG * rp, const BN_ULONG *ap, - const void *bp, const BN_ULONG *np, - const BN_ULONG *n0); - int bn_mul_mont_t4_16(BN_ULONG * rp, const BN_ULONG *ap, - const void *bp, const BN_ULONG *np, - const BN_ULONG *n0); - int bn_mul_mont_t4_24(BN_ULONG * rp, const BN_ULONG *ap, - const void *bp, const BN_ULONG *np, - const BN_ULONG *n0); - int bn_mul_mont_t4_32(BN_ULONG * rp, const BN_ULONG *ap, - const void *bp, const BN_ULONG *np, - const BN_ULONG *n0); - static const bn_mul_mont_f mul_funcs[4] = { bn_mul_mont_t4_8, - bn_mul_mont_t4_16, - bn_mul_mont_t4_24, - bn_mul_mont_t4_32 }; - bn_mul_mont_f mul_worker = mul_funcs[top / 16 - 1]; - void bn_mul_mont_vis3(BN_ULONG * rp, const BN_ULONG *ap, - const void *bp, const BN_ULONG *np, - const BN_ULONG *n0, int num); - void bn_mul_mont_t4(BN_ULONG * rp, const BN_ULONG *ap, - const void *bp, const BN_ULONG *np, - const BN_ULONG *n0, int num); - void bn_mul_mont_gather5_t4(BN_ULONG * rp, const BN_ULONG *ap, - const void *table, - const BN_ULONG *np, - const BN_ULONG *n0, int num, - int power); - void bn_flip_n_scatter5_t4(const BN_ULONG *inp, size_t num, - void *table, size_t power); - void bn_gather5_t4(BN_ULONG * out, size_t num, void *table, - size_t power); - void bn_flip_t4(BN_ULONG * dst, BN_ULONG * src, size_t num); - BN_ULONG *np = mont->N.d, *n0 = mont->n0; - int stride = - 5 * (6 - (top / 16 - - 1)); /* multiple of 5, but less than 32 */ - - /* - * BN_to_montgomery can contaminate words above .top [in - * BN_DEBUG[_DEBUG] build]... - */ - for (i = am.top; i < top; i++) - am.d[i] = 0; - - for (i = tmp.top; i < top; i++) - tmp.d[i] = 0; - - bn_flip_n_scatter5_t4(tmp.d, top, powerbuf, 0); - bn_flip_n_scatter5_t4(am.d, top, powerbuf, 1); - - if (!(*mul_worker)(tmp.d, am.d, am.d, np, n0) && - !(*mul_worker)(tmp.d, am.d, am.d, np, n0)) - bn_mul_mont_vis3(tmp.d, am.d, am.d, np, n0, top); - - bn_flip_n_scatter5_t4(tmp.d, top, powerbuf, 2); - - for (i = 3; i < 32; i++) { - /* Calculate a^i = a^(i-1) * a */ - if (!(*mul_worker)(tmp.d, tmp.d, am.d, np, n0) && - !(*mul_worker)(tmp.d, tmp.d, am.d, np, n0)) - bn_mul_mont_vis3(tmp.d, tmp.d, am.d, np, n0, - top); - - bn_flip_n_scatter5_t4(tmp.d, top, powerbuf, i); - } - - /* switch to 64-bit domain */ - np = alloca(top * sizeof(BN_ULONG)); - top /= 2; - bn_flip_t4(np, mont->N.d, top); - bits--; - - for (wvalue = 0, i = bits % 5; i >= 0; i--, bits--) - wvalue = (wvalue << 1) + BN_is_bit_set(p, bits); - - bn_gather5_t4(tmp.d, top, powerbuf, wvalue); - - /* - * Scan the exponent one window at a time starting from the most - * significant bits. - */ - while (bits >= 0) { - if (bits < stride) - stride = bits + 1; - - bits -= stride; - wvalue = bn_get_bits(p, bits + 1); - - if ((*pwr5_worker)(tmp.d, np, n0, powerbuf, wvalue, - stride)) - continue; - - /* retry once and fall back */ - if ((*pwr5_worker)(tmp.d, np, n0, powerbuf, wvalue, - stride)) - continue; - - bits += stride - 5; - wvalue >>= stride - 5; - wvalue &= 31; - bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont_t4(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont_gather5_t4(tmp.d, tmp.d, powerbuf, np, n0, - top, wvalue); - } - - bn_flip_t4(tmp.d, tmp.d, top); - top *= 2; - /* back to 32-bit domain */ - tmp.top = top; - bn_correct_top(&tmp); - memset(np, 0, top * sizeof(BN_ULONG)); - } else -#endif -#if defined(OPENSSL_BN_ASM_MONT5) - if (window == 5 && top > 1) { - /* - * This optimization uses ideas from http://eprint.iacr.org/2011/239, - * specifically optimization of cache-timing attack countermeasures - * and pre-computation optimization. - */ - /* - * Dedicated window==4 case improves 512-bit RSA sign by ~15%, but as - * 512-bit RSA is hardly relevant, we omit it to spare size... - */ - void bn_mul_mont_gather5(BN_ULONG * rp, const BN_ULONG *ap, - const void *table, const BN_ULONG *np, - const BN_ULONG *n0, int num, - int power); - void bn_scatter5(const BN_ULONG *inp, size_t num, void *table, - size_t power); - void bn_gather5(BN_ULONG * out, size_t num, void *table, - size_t power); - void bn_power5(BN_ULONG * rp, const BN_ULONG *ap, - const void *table, const BN_ULONG *np, - const BN_ULONG *n0, int num, int power); - int bn_get_bits5(const BN_ULONG *ap, int off); - int bn_from_montgomery(BN_ULONG * rp, const BN_ULONG *ap, - const BN_ULONG *not_used, - const BN_ULONG *np, const BN_ULONG *n0, - int num); - BN_ULONG *n0 = mont->n0, *np; - - /* - * BN_to_montgomery can contaminate words above .top [in - * BN_DEBUG[_DEBUG] build]... - */ - for (i = am.top; i < top; i++) - am.d[i] = 0; - - for (i = tmp.top; i < top; i++) - tmp.d[i] = 0; - - /* - * copy mont->N.d[] to improve cache locality - */ - for (np = am.d + top, i = 0; i < top; i++) - np[i] = mont->N.d[i]; - - bn_scatter5(tmp.d, top, powerbuf, 0); - bn_scatter5(am.d, am.top, powerbuf, 1); - bn_mul_mont(tmp.d, am.d, am.d, np, n0, top); - bn_scatter5(tmp.d, top, powerbuf, 2); -#if 0 - - for (i = 3; i < 32; i++) { - /* Calculate a^i = a^(i-1) * a */ - bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np, n0, top, i - 1); - bn_scatter5(tmp.d, top, powerbuf, i); - } - -#else - - /* same as above, but uses squaring for 1/2 of operations */ - for (i = 4; i < 32; i *= 2) { - bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_scatter5(tmp.d, top, powerbuf, i); - } - - for (i = 3; i < 8; i += 2) { - int j; - bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np, n0, top, - i - 1); - bn_scatter5(tmp.d, top, powerbuf, i); - - for (j = 2 * i; j < 32; j *= 2) { - bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_scatter5(tmp.d, top, powerbuf, j); - } - } - - for (; i < 16; i += 2) { - bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np, n0, top, - i - 1); - bn_scatter5(tmp.d, top, powerbuf, i); - bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_scatter5(tmp.d, top, powerbuf, 2 * i); - } - - for (; i < 32; i += 2) { - bn_mul_mont_gather5(tmp.d, am.d, powerbuf, np, n0, top, - i - 1); - bn_scatter5(tmp.d, top, powerbuf, i); - } - -#endif - bits--; - - for (wvalue = 0, i = bits % 5; i >= 0; i--, bits--) - wvalue = (wvalue << 1) + BN_is_bit_set(p, bits); - - bn_gather5(tmp.d, top, powerbuf, wvalue); - - /* - * Scan the exponent one window at a time starting from the most - * significant bits. - */ - if (top & 7) - while (bits >= 0) { - for (wvalue = 0, i = 0; i < 5; i++, bits--) - wvalue = (wvalue << 1) + - BN_is_bit_set(p, bits); - - bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont(tmp.d, tmp.d, tmp.d, np, n0, top); - bn_mul_mont_gather5(tmp.d, tmp.d, powerbuf, np, - n0, top, wvalue); - } - else { - while (bits >= 0) { - wvalue = bn_get_bits5(p->d, bits - 4); - bits -= 5; - bn_power5(tmp.d, tmp.d, powerbuf, np, n0, top, - wvalue); - } - } - - ret = bn_from_montgomery(tmp.d, tmp.d, NULL, np, n0, top); - tmp.top = top; - bn_correct_top(&tmp); - - if (ret) { - if (!BN_copy(rr, &tmp)) - ret = 0; - - goto err; /* non-zero ret means it's not error */ - } - } else -#endif - { - if (!MOD_EXP_CTIME_COPY_TO_PREBUF(&tmp, top, powerbuf, 0, - window)) - goto err; - - if (!MOD_EXP_CTIME_COPY_TO_PREBUF(&am, top, powerbuf, 1, - window)) - goto err; - - /* - * If the window size is greater than 1, then calculate - * val[i=2..2^winsize-1]. Powers are computed as a*a^(i-1) (even - * powers could instead be computed as (a^(i/2))^2 to use the slight - * performance advantage of sqr over mul). - */ - if (window > 1) { - if (!BN_mod_mul_montgomery(&tmp, &am, &am, mont, ctx)) - goto err; - - if (!MOD_EXP_CTIME_COPY_TO_PREBUF(&tmp, top, powerbuf, - 2, window)) - goto err; - - for (i = 3; i < numPowers; i++) { - /* Calculate a^i = a^(i-1) * a */ - if (!BN_mod_mul_montgomery(&tmp, &am, &tmp, - mont, ctx)) - goto err; - - if (!MOD_EXP_CTIME_COPY_TO_PREBUF( - &tmp, top, powerbuf, i, window)) - goto err; - } - } - - bits--; - - for (wvalue = 0, i = bits % window; i >= 0; i--, bits--) - wvalue = (wvalue << 1) + BN_is_bit_set(p, bits); - - if (!MOD_EXP_CTIME_COPY_FROM_PREBUF(&tmp, top, powerbuf, wvalue, - window)) - goto err; - - /* - * Scan the exponent one window at a time starting from the most - * significant bits. - */ - while (bits >= 0) { - wvalue = 0; /* The 'value' of the window */ - - /* Scan the window, squaring the result as we go */ - for (i = 0; i < window; i++, bits--) { - if (!BN_mod_mul_montgomery(&tmp, &tmp, &tmp, - mont, ctx)) - goto err; - - wvalue = (wvalue << 1) + BN_is_bit_set(p, bits); - } - - /* - * Fetch the appropriate pre-computed value from the pre-buf - */ - if (!MOD_EXP_CTIME_COPY_FROM_PREBUF(&am, top, powerbuf, - wvalue, window)) - goto err; - - /* Multiply the result into the intermediate result */ - if (!BN_mod_mul_montgomery(&tmp, &tmp, &am, mont, ctx)) - goto err; - } - } - - /* Convert the final result from montgomery to standard format */ -#if defined(SPARC_T4_MONT) - - if (OPENSSL_sparcv9cap_P[0] & (SPARCV9_VIS3 | SPARCV9_PREFER_FPU)) { - am.d[0] = 1; /* borrow am */ - - for (i = 1; i < top; i++) - am.d[i] = 0; - - if (!BN_mod_mul_montgomery(rr, &tmp, &am, mont, ctx)) - goto err; - } else -#endif - if (!BN_from_montgomery(rr, &tmp, mont, ctx)) - goto err; - - ret = 1; -err: - - if (in_mont == NULL) - BN_MONT_CTX_free(mont); - - if (powerbuf != NULL) { - memset(powerbuf, 0, powerbufLen); - os_free_mem(powerbufFree); - } - - BN_CTX_end(ctx); - return ret; -} - -int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont) -{ - BN_MONT_CTX *mont = NULL; - int b, bits, ret = 0; - int r_is_one; - BN_ULONG w, next_w; - BIGNUM *d, *r, *t; - BIGNUM *swap_tmp; -#define BN_MOD_MUL_WORD(r, w, m) \ - (BN_mul_word(r, (w)) && \ - (/* BN_ucmp(r, (m)) < 0 ? 1 :*/ \ - (BN_mod(t, r, m, ctx) && (swap_tmp = r, r = t, t = swap_tmp, 1)))) - /* - * BN_MOD_MUL_WORD is only used with 'w' large, so the BN_ucmp test is - * probably more overhead than always using BN_mod (which uses BN_copy if - * a similar test returns true). - */ - /* - * We can use BN_mod and do not need BN_nnmod because our accumulator is - * never negative (the result of BN_mod does not depend on the sign of - * the modulus). - */ -#define BN_TO_MONTGOMERY_WORD(r, w, mont) \ - (BN_set_word(r, (w)) && BN_to_montgomery(r, r, (mont), ctx)) - - if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0 || - BN_get_flags(m, BN_FLG_CONSTTIME) != 0) { - /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */ - BNerr(BN_F_BN_MOD_EXP_MONT_WORD, - ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } - - bn_check_top(p); - bn_check_top(m); - - if (!BN_is_odd(m)) { - BNerr(BN_F_BN_MOD_EXP_MONT_WORD, BN_R_CALLED_WITH_EVEN_MODULUS); - return 0; - } - - if (m->top == 1) - a %= m->d[0]; /* make sure that 'a' is reduced */ - - bits = BN_num_bits(p); - - if (bits == 0) { - /* x**0 mod 1 is still zero. */ - if (BN_is_one(m)) { - ret = 1; - BN_zero(rr); - } else - ret = BN_one(rr); - - return ret; - } - - if (a == 0) { - BN_zero(rr); - ret = 1; - return ret; - } - - BN_CTX_start(ctx); - d = BN_CTX_get(ctx); - r = BN_CTX_get(ctx); - t = BN_CTX_get(ctx); - - if (d == NULL || r == NULL || t == NULL) - goto err; - - if (in_mont != NULL) - mont = in_mont; - else { - mont = BN_MONT_CTX_new(); - if (mont == NULL) - goto err; - - if (!BN_MONT_CTX_set(mont, m, ctx)) - goto err; - } - - r_is_one = 1; /* except for Montgomery factor */ - /* bits-1 >= 0 */ - /* The result is accumulated in the product r*w. */ - w = a; /* bit 'bits-1' of 'p' is always set */ - - for (b = bits - 2; b >= 0; b--) { - /* First, square r*w. */ - next_w = w * w; - - if ((next_w / w) != w) { /* overflow */ - if (r_is_one) { - if (!BN_TO_MONTGOMERY_WORD(r, w, mont)) - goto err; - - r_is_one = 0; - } else { - if (!BN_MOD_MUL_WORD(r, w, m)) - goto err; - } - - next_w = 1; - } - - w = next_w; - - if (!r_is_one) { - if (!BN_mod_mul_montgomery(r, r, r, mont, ctx)) - goto err; - } - - /* Second, multiply r*w by 'a' if exponent bit is set. */ - if (BN_is_bit_set(p, b)) { - next_w = w * a; - - if ((next_w / a) != w) { /* overflow */ - if (r_is_one) { - if (!BN_TO_MONTGOMERY_WORD(r, w, mont)) - goto err; - - r_is_one = 0; - } else { - if (!BN_MOD_MUL_WORD(r, w, m)) - goto err; - } - - next_w = a; - } - - w = next_w; - } - } - - /* Finally, set r:=r*w. */ - if (w != 1) { - if (r_is_one) { - if (!BN_TO_MONTGOMERY_WORD(r, w, mont)) - goto err; - - r_is_one = 0; - } else { - if (!BN_MOD_MUL_WORD(r, w, m)) - goto err; - } - } - - if (r_is_one) { /* can happen only if a == 1 */ - if (!BN_one(rr)) - goto err; - } else { - if (!BN_from_montgomery(rr, r, mont, ctx)) - goto err; - } - - ret = 1; -err: - - if (in_mont == NULL) - BN_MONT_CTX_free(mont); - - BN_CTX_end(ctx); - bn_check_top(rr); - return ret; -} - -/* The old fallback, simple version :-) */ -int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, - const BIGNUM *m, BN_CTX *ctx) -{ - int i, j, bits, ret = 0, wstart, wend, window, wvalue; - int start = 1; - BIGNUM *d; - /* Table of variables obtained from 'ctx' */ - BIGNUM *val[TABLESIZE]; - - if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0 || - BN_get_flags(a, BN_FLG_CONSTTIME) != 0 || - BN_get_flags(m, BN_FLG_CONSTTIME) != 0) { - /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */ - BNerr(BN_F_BN_MOD_EXP_SIMPLE, - ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } - - bits = BN_num_bits(p); - - if (bits == 0) { - /* x**0 mod 1 is still zero. */ - if (BN_is_one(m)) { - ret = 1; - BN_zero(r); - } else - ret = BN_one(r); - - return ret; - } - - BN_CTX_start(ctx); - d = BN_CTX_get(ctx); - val[0] = BN_CTX_get(ctx); - - if (!d || !val[0]) - goto err; - - if (!BN_nnmod(val[0], a, m, ctx)) - goto err; /* 1 */ - - if (BN_is_zero(val[0])) { - BN_zero(r); - ret = 1; - goto err; - } - - window = BN_window_bits_for_exponent_size(bits); - - if (window > 1) { - if (!BN_mod_mul(d, val[0], val[0], m, ctx)) - goto err; /* 2 */ - - j = 1 << (window - 1); - - for (i = 1; i < j; i++) { - val[i] = BN_CTX_get(ctx); - if ((val[i] == NULL) || - !BN_mod_mul(val[i], val[i - 1], d, m, ctx)) - goto err; - } - } - - start = 1; /* This is used to avoid multiplication etc when there is only the value '1' in the buffer. */ - wvalue = 0; /* The 'value' of the window */ - wstart = bits - 1; /* The top bit of the window */ - wend = 0; /* The bottom bit of the window */ - - if (!BN_one(r)) - goto err; - - for (;;) { - if (BN_is_bit_set(p, wstart) == 0) { - if (!start) - if (!BN_mod_mul(r, r, r, m, ctx)) - goto err; - - if (wstart == 0) - break; - - wstart--; - continue; - } - - /* - * We now have wstart on a 'set' bit, we now need to work out how bit - * a window to do. To do this we need to scan forward until the last - * set bit before the end of the window - */ - j = wstart; - wvalue = 1; - wend = 0; - - for (i = 1; i < window; i++) { - if (wstart - i < 0) - break; - - if (BN_is_bit_set(p, wstart - i)) { - wvalue <<= (i - wend); - wvalue |= 1; - wend = i; - } - } - - /* wend is the size of the current window */ - j = wend + 1; - - /* add the 'bytes above' */ - if (!start) - for (i = 0; i < j; i++) { - if (!BN_mod_mul(r, r, r, m, ctx)) - goto err; - } - - /* wvalue will be an odd number < 2^window */ - if (!BN_mod_mul(r, r, val[wvalue >> 1], m, ctx)) - goto err; - - /* move the 'window' down further */ - wstart -= wend + 1; - wvalue = 0; - start = 0; - - if (wstart < 0) - break; - } - - ret = 1; -err: - BN_CTX_end(ctx); - bn_check_top(r); - return ret; -} - -void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb) -{ - BN_ULONG *rr; - - if (na < nb) { - int itmp; - BN_ULONG *ltmp; - itmp = na; - na = nb; - nb = itmp; - ltmp = a; - a = b; - b = ltmp; - } - - rr = &(r[na]); - - if (nb <= 0) { - (void)bn_mul_words(r, a, na, 0); - return; - } else - rr[0] = bn_mul_words(r, a, na, b[0]); - - for (;;) { - if (--nb <= 0) - return; - - rr[1] = bn_mul_add_words(&(r[1]), a, na, b[1]); - - if (--nb <= 0) - return; - - rr[2] = bn_mul_add_words(&(r[2]), a, na, b[2]); - - if (--nb <= 0) - return; - - rr[3] = bn_mul_add_words(&(r[3]), a, na, b[3]); - - if (--nb <= 0) - return; - - rr[4] = bn_mul_add_words(&(r[4]), a, na, b[4]); - rr += 4; - r += 4; - b += 4; - } -} - -int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) -{ - int ret = 0; - int top, al, bl; - BIGNUM *rr; -#if defined(BN_MUL_COMBA) || defined(BN_RECURSION) - int i; -#endif -#ifdef BN_RECURSION - BIGNUM *t = NULL; - int j = 0, k; -#endif - bn_check_top(a); - bn_check_top(b); - bn_check_top(r); - al = a->top; - bl = b->top; - - if ((al == 0) || (bl == 0)) { - BN_zero(r); - return 1; - } - - top = al + bl; - BN_CTX_start(ctx); - - if ((r == a) || (r == b)) { - rr = BN_CTX_get(ctx); - if (rr == NULL) - goto err; - } else - rr = r; - -#if defined(BN_MUL_COMBA) || defined(BN_RECURSION) - i = al - bl; -#endif -#ifdef BN_MUL_COMBA - - if (i == 0) { -#if 0 - - if (al == 4) { - if (bn_wexpand(rr, 8) == NULL) - goto err; - - rr->top = 8; - bn_mul_comba4(rr->d, a->d, b->d); - goto end; - } - -#endif - - if (al == 8) { - if (bn_wexpand(rr, 16) == NULL) - goto err; - - rr->top = 16; - bn_mul_comba8(rr->d, a->d, b->d); - goto end; - } - } - -#endif /* BN_MUL_COMBA */ -#ifdef BN_RECURSION - - if ((al >= BN_MULL_SIZE_NORMAL) && (bl >= BN_MULL_SIZE_NORMAL)) { - if (i >= -1 && i <= 1) { - /* - * Find out the power of two lower or equal to the longest of the - * two numbers - */ - if (i >= 0) - j = BN_num_bits_word((BN_ULONG)al); - - if (i == -1) - j = BN_num_bits_word((BN_ULONG)bl); - - j = 1 << (j - 1); - assert(j <= al || j <= bl); - k = j + j; - t = BN_CTX_get(ctx); - - if (t == NULL) - goto err; - - if (al > j || bl > j) { - if (bn_wexpand(t, k * 4) == NULL) - goto err; - - if (bn_wexpand(rr, k * 4) == NULL) - goto err; - - bn_mul_part_recursive(rr->d, a->d, b->d, j, - al - j, bl - j, t->d); - } else { /* al <= j || bl <= j */ - if (bn_wexpand(t, k * 2) == NULL) - goto err; - - if (bn_wexpand(rr, k * 2) == NULL) - goto err; - - bn_mul_recursive(rr->d, a->d, b->d, j, al - j, - bl - j, t->d); - } - - rr->top = top; - goto end; - } - } - -#endif /* BN_RECURSION */ - - if (bn_wexpand(rr, top) == NULL) - goto err; - - rr->top = top; - bn_mul_normal(rr->d, a->d, al, b->d, bl); -#if defined(BN_MUL_COMBA) || defined(BN_RECURSION) -end: -#endif - rr->neg = a->neg ^ b->neg; - bn_correct_top(rr); - - if (r != rr && BN_copy(r, rr) == NULL) - goto err; - - ret = 1; -err: - bn_check_top(r); - BN_CTX_end(ctx); - return ret; -} - -/* least significant word */ -#define BN_lsw(n) (((n)->top == 0) ? (BN_ULONG)0 : (n)->d[0]) - -/* Returns -2 for errors because both -1 and 0 are valid results. */ -int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) -{ - int i; - int ret = -2; /* avoid 'uninitialized' warning */ - int err = 0; - BIGNUM *A, *B, *tmp; - /*- - * In 'tab', only odd-indexed entries are relevant: - * For any odd BIGNUM n, - * tab[BN_lsw(n) & 7] - * is $(-1)^{(n^2-1)/8}$ (using TeX notation). - * Note that the sign of n does not matter. - */ - static const int tab[8] = { 0, 1, 0, -1, 0, -1, 0, 1 }; - bn_check_top(a); - bn_check_top(b); - BN_CTX_start(ctx); - A = BN_CTX_get(ctx); - B = BN_CTX_get(ctx); - - if (B == NULL) - goto end; - - err = !BN_copy(A, a); - - if (err) - goto end; - - err = !BN_copy(B, b); - - if (err) - goto end; - - /* - * Kronecker symbol, implemented according to Henri Cohen, - * "A Course in Computational Algebraic Number Theory" - * (algorithm 1.4.10). - */ - - /* Cohen's step 1: */ - - if (BN_is_zero(B)) { - ret = BN_abs_is_word(A, 1); - goto end; - } - - /* Cohen's step 2: */ - - if (!BN_is_odd(A) && !BN_is_odd(B)) { - ret = 0; - goto end; - } - - /* now B is non-zero */ - i = 0; - - while (!BN_is_bit_set(B, i)) - i++; - - err = !BN_rshift(B, B, i); - - if (err) - goto end; - - if (i & 1) { - /* i is odd */ - /* (thus B was even, thus A must be odd!) */ - /* set 'ret' to $(-1)^{(A^2-1)/8}$ */ - ret = tab[BN_lsw(A) & 7]; - } else { - /* i is even */ - ret = 1; - } - - if (B->neg) { - B->neg = 0; - - if (A->neg) - ret = -ret; - } - - /* - * now B is positive and odd, so what remains to be done is to compute - * the Jacobi symbol (A/B) and multiply it by 'ret' - */ - - while (1) { - /* Cohen's step 3: */ - - /* B is positive and odd */ - if (BN_is_zero(A)) { - ret = BN_is_one(B) ? ret : 0; - goto end; - } - - /* now A is non-zero */ - i = 0; - - while (!BN_is_bit_set(A, i)) - i++; - - err = !BN_rshift(A, A, i); - - if (err) - goto end; - - if (i & 1) { - /* i is odd */ - /* multiply 'ret' by $(-1)^{(B^2-1)/8}$ */ - ret = ret * tab[BN_lsw(B) & 7]; - } - - /* Cohen's step 4: */ - /* multiply 'ret' by $(-1)^{(A-1)(B-1)/4}$ */ - if ((A->neg ? ~BN_lsw(A) : BN_lsw(A)) & BN_lsw(B) & 2) - ret = -ret; - - /* (A, B) := (B mod |A|, |A|) */ - err = !BN_nnmod(B, B, A, ctx); - - if (err) - goto end; - - tmp = A; - A = B; - B = tmp; - tmp->neg = 0; - } - -end: - BN_CTX_end(ctx); - - if (err) - return -2; - else - return ret; -} - -static UCHAR randombyte(void) -{ - ULONG i; - UCHAR R, Result; - static ULONG ShiftReg; - R = 0; - - if (ShiftReg == 0) - NdisGetSystemUpTime((ULONG *)&ShiftReg); - - for (i = 0; i < 8; i++) { - if (ShiftReg & 0x00000001) { - ShiftReg = ((ShiftReg ^ LFSR_MASK) >> 1) | 0x80000000; - Result = 1; - } else { - ShiftReg = ShiftReg >> 1; - Result = 0; - } - - R = (R << 1) | Result; - } - - return R; -} - -static int bnrand(int pseudorand, BIGNUM *rnd, int bits, int top, int bottom) -{ - unsigned char *buf = NULL; - int ret = 0, bit, bytes, mask; - time_t tim; - UINT32 i; - - if (bits == 0) { - if (top != BN_RAND_TOP_ANY || bottom != BN_RAND_BOTTOM_ANY) - goto toosmall; - - BN_zero(rnd); - return 1; - } - - if (bits < 0 || (bits == 1 && top > 0)) - goto toosmall; - - bytes = (bits + 7) / 8; - bit = (bits - 1) % 8; - mask = 0xff << (bit + 1); - os_alloc_mem(NULL, (UCHAR **)&buf, bytes); - - if (buf == NULL) { - BNerr(BN_F_BNRAND, ERR_R_MALLOC_FAILURE); - goto err; - } - - /* make a random number and set the top and bottom bits */ - NdisGetSystemUpTime((ULONG *)(&tim)); - - for (i = 0; i < bytes; i++) - buf[i] = randombyte(); - - if (pseudorand == 2) { - /* - * generate patterns that are more likely to trigger BN library bugs - */ - int i; - unsigned char c; - - for (i = 0; i < bytes; i++) { - c = randombyte(); - - if (c >= 128 && i > 0) - buf[i] = buf[i - 1]; - else if (c < 42) - buf[i] = 0; - else if (c < 84) - buf[i] = 255; - } - } - - if (top >= 0) { - if (top) { - if (bit == 0) { - buf[0] = 1; - buf[1] |= 0x80; - } else - buf[0] |= (3 << (bit - 1)); - } else - buf[0] |= (1 << bit); - } - - buf[0] &= ~mask; - - if (bottom) /* set bottom bit if requested */ - buf[bytes - 1] |= 1; - - if (!BN_bin2bn(buf, bytes, rnd)) - goto err; - - ret = 1; -err: - os_free_mem(buf); - bn_check_top(rnd); - return ret; -toosmall: - BNerr(BN_F_BNRAND, BN_R_BITS_TOO_SMALL); - return 0; -} - -/* random number r: 0 <= r < range */ -static int bn_rand_range(int pseudo, BIGNUM *r, const BIGNUM *range) -{ - int (*bn_rand)(BIGNUM *, int, int, int) = - pseudo ? BN_pseudo_rand : BN_rand; - int n; - int count = 100; - - if (range->neg || BN_is_zero(range)) - return 0; - - n = BN_num_bits(range); /* n > 0 */ - - /* BN_is_bit_set(range, n - 1) always holds */ - - if (n == 1) - BN_zero(r); - else if (!BN_is_bit_set(range, n - 2) && !BN_is_bit_set(range, n - 3)) { - /* - * range = 100..._2, so 3*range (= 11..._2) is exactly one bit longer - * than range - */ - do { - if (!bn_rand(r, n + 1, -1, 0)) - return 0; - /* - * If r < 3*range, use r := r MOD range (which is either r, r - - * range, or r - 2*range). Otherwise, iterate once more. Since - * 3*range = 11..._2, each iteration succeeds with probability >= - * .75. - */ - if (BN_cmp(r, range) >= 0) { - if (!BN_sub(r, r, range)) - return 0; - if (BN_cmp(r, range) >= 0) - if (!BN_sub(r, r, range)) - return 0; - } - - if (!--count) - return 0; - } while (BN_cmp(r, range) >= 0); - } else { - do { - /* range = 11..._2 or range = 101..._2 */ - if (!bn_rand(r, n, -1, 0)) - return 0; - - if (!--count) - return 0; - } while (BN_cmp(r, range) >= 0); - } - - bn_check_top(r); - return 1; -} - -int BN_rand(BIGNUM *rnd, int bits, int top, int bottom) -{ - return bnrand(0, rnd, bits, top, bottom); -} - -int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom) -{ - return bnrand(1, rnd, bits, top, bottom); -} - -int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom) -{ - return bnrand(2, rnd, bits, top, bottom); -} - -int BN_rand_range(BIGNUM *r, const BIGNUM *range) -{ - return bn_rand_range(0, r, range); -} - -BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) -/* - * Returns 'ret' such that ret^2 == a (mod p), using the Tonelli/Shanks - * algorithm (cf. Henri Cohen, "A Course in Algebraic Computational Number - * Theory", algorithm 1.5.1). 'p' must be prime! - */ -{ - BIGNUM *ret = in; - int err = 1; - int r; - BIGNUM *A, *b, *q, *t, *x, *y; - int e, i, j; - - if (!BN_is_odd(p) || BN_abs_is_word(p, 1)) { - if (BN_abs_is_word(p, 2)) { - if (ret == NULL) - ret = BN_new(); - - if (ret == NULL) - goto end; - - if (!BN_set_word(ret, BN_is_bit_set(a, 0))) { - if (ret != in) - BN_free(ret); - - return NULL; - } - - bn_check_top(ret); - return ret; - } - - BNerr(BN_F_BN_MOD_SQRT, BN_R_P_IS_NOT_PRIME); - return NULL; - } - - if (BN_is_zero(a) || BN_is_one(a)) { - if (ret == NULL) - ret = BN_new(); - - if (ret == NULL) - goto end; - - if (!BN_set_word(ret, BN_is_one(a))) { - if (ret != in) - BN_free(ret); - - return NULL; - } - - bn_check_top(ret); - return ret; - } - - BN_CTX_start(ctx); - A = BN_CTX_get(ctx); - b = BN_CTX_get(ctx); - q = BN_CTX_get(ctx); - t = BN_CTX_get(ctx); - x = BN_CTX_get(ctx); - y = BN_CTX_get(ctx); - - if (y == NULL) - goto end; - - if (ret == NULL) - ret = BN_new(); - - if (ret == NULL) - goto end; - - /* A = a mod p */ - if (!BN_nnmod(A, a, p, ctx)) - goto end; - - /* now write |p| - 1 as 2^e*q where q is odd */ - e = 1; - - while (!BN_is_bit_set(p, e)) - e++; - - /* we'll set q later (if needed) */ - - if (e == 1) { - /*- - * The easy case: (|p|-1)/2 is odd, so 2 has an inverse - * modulo (|p|-1)/2, and square roots can be computed - * directly by modular exponentiation. - * We have - * 2 * (|p|+1)/4 == 1 (mod (|p|-1)/2), - * so we can use exponent (|p|+1)/4, i.e. (|p|-3)/4 + 1. - */ - if (!BN_rshift(q, p, 2)) - goto end; - - q->neg = 0; - - if (!BN_add_word(q, 1)) - goto end; - - if (!BN_mod_exp(ret, A, q, p, ctx)) - goto end; - - err = 0; - goto vrfy; - } - - if (e == 2) { - /*- - * |p| == 5 (mod 8) - * - * In this case 2 is always a non-square since - * Legendre(2,p) = (-1)^((p^2-1)/8) for any odd prime. - * So if a really is a square, then 2*a is a non-square. - * Thus for - * b := (2*a)^((|p|-5)/8), - * i := (2*a)*b^2 - * we have - * i^2 = (2*a)^((1 + (|p|-5)/4)*2) - * = (2*a)^((p-1)/2) - * = -1; - * so if we set - * x := a*b*(i-1), - * then - * x^2 = a^2 * b^2 * (i^2 - 2*i + 1) - * = a^2 * b^2 * (-2*i) - * = a*(-i)*(2*a*b^2) - * = a*(-i)*i - * = a. - * - * (This is due to A.O.L. Atkin, - * , - * November 1992.) - */ - - /* t := 2*a */ - if (!BN_mod_lshift1_quick(t, A, p)) - goto end; - - /* b := (2*a)^((|p|-5)/8) */ - if (!BN_rshift(q, p, 3)) - goto end; - - q->neg = 0; - - if (!BN_mod_exp(b, t, q, p, ctx)) - goto end; - - /* y := b^2 */ - if (!BN_mod_sqr(y, b, p, ctx)) - goto end; - - /* t := (2*a)*b^2 - 1 */ - if (!BN_mod_mul(t, t, y, p, ctx)) - goto end; - - if (!BN_sub_word(t, 1)) - goto end; - - /* x = a*b*t */ - if (!BN_mod_mul(x, A, b, p, ctx)) - goto end; - - if (!BN_mod_mul(x, x, t, p, ctx)) - goto end; - - if (!BN_copy(ret, x)) - goto end; - - err = 0; - goto vrfy; - } - - /* - * e > 2, so we really have to use the Tonelli/Shanks algorithm. First, - * find some y that is not a square. - */ - if (!BN_copy(q, p)) - goto end; /* use 'q' as temp */ - - q->neg = 0; - i = 2; - - do { - /* - * For efficiency, try small numbers first; if this fails, try random - * numbers. - */ - if (i < 22) { - if (!BN_set_word(y, i)) - goto end; - } else { - if (!BN_pseudo_rand(y, BN_num_bits(p), 0, 0)) - goto end; - - if (BN_ucmp(y, p) >= 0) { - if (!(p->neg ? BN_add : BN_sub)(y, y, p)) - goto end; - } - - /* now 0 <= y < |p| */ - if (BN_is_zero(y)) - if (!BN_set_word(y, i)) - goto end; - } - - r = BN_kronecker(y, q, ctx); /* here 'q' is |p| */ - - if (r < -1) - goto end; - - if (r == 0) { - /* m divides p */ - BNerr(BN_F_BN_MOD_SQRT, BN_R_P_IS_NOT_PRIME); - goto end; - } - } while (r == 1 && ++i < 82); - - if (r != -1) { - /* - * Many rounds and still no non-square -- this is more likely a bug - * than just bad luck. Even if p is not prime, we should have found - * some y such that r == -1. - */ - BNerr(BN_F_BN_MOD_SQRT, BN_R_TOO_MANY_ITERATIONS); - goto end; - } - - /* Here's our actual 'q': */ - if (!BN_rshift(q, q, e)) - goto end; - - /* - * Now that we have some non-square, we can find an element of order 2^e - * by computing its q'th power. - */ - if (!BN_mod_exp(y, y, q, p, ctx)) - goto end; - - if (BN_is_one(y)) { - BNerr(BN_F_BN_MOD_SQRT, BN_R_P_IS_NOT_PRIME); - goto end; - } - - /*- - * Now we know that (if p is indeed prime) there is an integer - * k, 0 <= k < 2^e, such that - * - * a^q * y^k == 1 (mod p). - * - * As a^q is a square and y is not, k must be even. - * q+1 is even, too, so there is an element - * - * X := a^((q+1)/2) * y^(k/2), - * - * and it satisfies - * - * X^2 = a^q * a * y^k - * = a, - * - * so it is the square root that we are looking for. - */ - - /* t := (q-1)/2 (note that q is odd) */ - if (!BN_rshift1(t, q)) - goto end; - - /* x := a^((q-1)/2) */ - if (BN_is_zero(t)) { /* special case: p = 2^e + 1 */ - if (!BN_nnmod(t, A, p, ctx)) - goto end; - - if (BN_is_zero(t)) { - /* special case: a == 0 (mod p) */ - BN_zero(ret); - err = 0; - goto end; - } else if (!BN_one(x)) - goto end; - } else { - if (!BN_mod_exp(x, A, t, p, ctx)) - goto end; - - if (BN_is_zero(x)) { - /* special case: a == 0 (mod p) */ - BN_zero(ret); - err = 0; - goto end; - } - } - - /* b := a*x^2 (= a^q) */ - if (!BN_mod_sqr(b, x, p, ctx)) - goto end; - - if (!BN_mod_mul(b, b, A, p, ctx)) - goto end; - - /* x := a*x (= a^((q+1)/2)) */ - if (!BN_mod_mul(x, x, A, p, ctx)) - goto end; - - while (1) { - /*- - * Now b is a^q * y^k for some even k (0 <= k < 2^E - * where E refers to the original value of e, which we - * don't keep in a variable), and x is a^((q+1)/2) * y^(k/2). - * - * We have a*b = x^2, - * y^2^(e-1) = -1, - * b^2^(e-1) = 1. - */ - if (BN_is_one(b)) { - if (!BN_copy(ret, x)) - goto end; - - err = 0; - goto vrfy; - } - - /* find smallest i such that b^(2^i) = 1 */ - i = 1; - - if (!BN_mod_sqr(t, b, p, ctx)) - goto end; - - while (!BN_is_one(t)) { - i++; - - if (i == e) { - BNerr(BN_F_BN_MOD_SQRT, BN_R_NOT_A_SQUARE); - goto end; - } - - if (!BN_mod_mul(t, t, t, p, ctx)) - goto end; - } - - /* t := y^2^(e - i - 1) */ - if (!BN_copy(t, y)) - goto end; - - for (j = e - i - 1; j > 0; j--) { - if (!BN_mod_sqr(t, t, p, ctx)) - goto end; - } - - if (!BN_mod_mul(y, t, t, p, ctx)) - goto end; - - if (!BN_mod_mul(x, x, t, p, ctx)) - goto end; - - if (!BN_mod_mul(b, b, y, p, ctx)) - goto end; - - e = i; - } - -vrfy: - - if (!err) { - /* - * verify the result -- the input might have been not a square (test - * added in 0.9.8) - */ - if (!BN_mod_sqr(x, ret, p, ctx)) - err = 1; - - if (!err && 0 != BN_cmp(x, A)) { - BNerr(BN_F_BN_MOD_SQRT, BN_R_NOT_A_SQUARE); - err = 1; - } - } - -end: - - if (err) { - if (ret != in) - BN_clear_free(ret); - - ret = NULL; - } - - BN_CTX_end(ctx); - bn_check_top(ret); - return ret; -} - -static const char Hex[] = "0123456789ABCDEF"; - -char *BN_bn2hex(const BIGNUM *a) -{ - int i, j, v, z = 0; - char *buf; - char *p; - - if (BN_is_zero(a)) - return NULL; - - os_alloc_mem(NULL, (UCHAR **)&buf, a->top * BN_BYTES * 2 + 2); - - if (buf == NULL) - goto err; - p = buf; - if (a->neg) - *(p++) = '-'; - for (i = a->top - 1; i >= 0; i--) { - for (j = BN_BITS2 - 8; j >= 0; j -= 8) { - /* strip leading zeros */ - v = ((int)(a->d[i] >> (long)j)) & 0xff; - if (z || (v != 0)) { - *(p++) = Hex[v >> 4]; - *(p++) = Hex[v & 0x0f]; - z = 1; - } - } - } - *p = '\0'; -err: - return buf; -} - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_aes.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_aes.c deleted file mode 100644 index f16430c029..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_aes.c +++ /dev/null @@ -1,975 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_aes.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Paul Wu 02-25-02 Initial -*/ - -#include "rt_config.h" - -/*****************************/ -/******** SBOX Table *********/ -/*****************************/ - -UCHAR SboxTable[256] = { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16 -}; - -VOID xor_32(IN PUCHAR a, IN PUCHAR b, OUT PUCHAR out) -{ - INT i; - - for (i = 0; i < 4; i++) - out[i] = a[i] ^ b[i]; -} - -VOID xor_128(IN PUCHAR a, IN PUCHAR b, OUT PUCHAR out) -{ - INT i; - - for (i = 0; i < 16; i++) - out[i] = a[i] ^ b[i]; -} - -UCHAR RTMPCkipSbox(IN UCHAR a) -{ - return SboxTable[(int)a]; -} - -VOID next_key(IN PUCHAR key, IN INT round) -{ - UCHAR rcon; - UCHAR sbox_key[4]; - UCHAR rcon_table[12] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, - 0x40, 0x80, 0x1b, 0x36, 0x36, 0x36 }; - sbox_key[0] = RTMPCkipSbox(key[13]); - sbox_key[1] = RTMPCkipSbox(key[14]); - sbox_key[2] = RTMPCkipSbox(key[15]); - sbox_key[3] = RTMPCkipSbox(key[12]); - rcon = rcon_table[round]; - xor_32(&key[0], sbox_key, &key[0]); - key[0] = key[0] ^ rcon; - xor_32(&key[4], &key[0], &key[4]); - xor_32(&key[8], &key[4], &key[8]); - xor_32(&key[12], &key[8], &key[12]); -} - -VOID byte_sub(IN PUCHAR in, OUT PUCHAR out) -{ - INT i; - - for (i = 0; i < 16; i++) - out[i] = RTMPCkipSbox(in[i]); -} - -/************************************/ -/* bitwise_xor() */ -/* A 128 bit, bitwise exclusive or */ -/************************************/ - -void bitwise_xor(unsigned char *ina, unsigned char *inb, unsigned char *out) -{ - int i; - - for (i = 0; i < 16; i++) - out[i] = ina[i] ^ inb[i]; -} - -VOID shift_row(IN PUCHAR in, OUT PUCHAR out) -{ - out[0] = in[0]; - out[1] = in[5]; - out[2] = in[10]; - out[3] = in[15]; - out[4] = in[4]; - out[5] = in[9]; - out[6] = in[14]; - out[7] = in[3]; - out[8] = in[8]; - out[9] = in[13]; - out[10] = in[2]; - out[11] = in[7]; - out[12] = in[12]; - out[13] = in[1]; - out[14] = in[6]; - out[15] = in[11]; -} - -VOID mix_column(IN PUCHAR in, OUT PUCHAR out) -{ - INT i; - UCHAR add1b[4]; - UCHAR add1bf7[4]; - UCHAR rotl[4]; - UCHAR swap_halfs[4]; - UCHAR andf7[4]; - UCHAR rotr[4]; - UCHAR temp[4]; - UCHAR tempb[4]; - - for (i = 0; i < 4; i++) { - if ((in[i] & 0x80) == 0x80) - add1b[i] = 0x1b; - else - add1b[i] = 0x00; - } - - swap_halfs[0] = in[2]; /* Swap halfs */ - swap_halfs[1] = in[3]; - swap_halfs[2] = in[0]; - swap_halfs[3] = in[1]; - rotl[0] = in[3]; /* Rotate left 8 bits */ - rotl[1] = in[0]; - rotl[2] = in[1]; - rotl[3] = in[2]; - andf7[0] = in[0] & 0x7f; - andf7[1] = in[1] & 0x7f; - andf7[2] = in[2] & 0x7f; - andf7[3] = in[3] & 0x7f; - - for (i = 3; i > 0; i--) { /* logical shift left 1 bit */ - andf7[i] = andf7[i] << 1; - - if ((andf7[i - 1] & 0x80) == 0x80) - andf7[i] = (andf7[i] | 0x01); - } - - andf7[0] = andf7[0] << 1; - andf7[0] = andf7[0] & 0xfe; - xor_32(add1b, andf7, add1bf7); - xor_32(in, add1bf7, rotr); - temp[0] = rotr[0]; /* Rotate right 8 bits */ - rotr[0] = rotr[1]; - rotr[1] = rotr[2]; - rotr[2] = rotr[3]; - rotr[3] = temp[0]; - xor_32(add1bf7, rotr, temp); - xor_32(swap_halfs, rotl, tempb); - xor_32(temp, tempb, out); -} - -/************************************************/ -/* construct_mic_header1() */ -/* Builds the first MIC header block from */ -/* header fields. */ -/************************************************/ - -void construct_mic_header1(unsigned char *mic_header1, int header_length, - unsigned char *mpdu) -{ - mic_header1[0] = (unsigned char)((header_length - 2) / 256); - mic_header1[1] = (unsigned char)((header_length - 2) % 256); - mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ - mic_header1[3] = - mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ - mic_header1[4] = mpdu[4]; /* A1 */ - mic_header1[5] = mpdu[5]; - mic_header1[6] = mpdu[6]; - mic_header1[7] = mpdu[7]; - mic_header1[8] = mpdu[8]; - mic_header1[9] = mpdu[9]; - mic_header1[10] = mpdu[10]; /* A2 */ - mic_header1[11] = mpdu[11]; - mic_header1[12] = mpdu[12]; - mic_header1[13] = mpdu[13]; - mic_header1[14] = mpdu[14]; - mic_header1[15] = mpdu[15]; -} - -/************************************************/ -/* construct_mic_header2() */ -/* Builds the last MIC header block from */ -/* header fields. */ -/************************************************/ - -void construct_mic_header2(unsigned char *mic_header2, unsigned char *mpdu, - int a4_exists, int qc_exists) -{ - int i; - - for (i = 0; i < 16; i++) - mic_header2[i] = 0x00; - - mic_header2[0] = mpdu[16]; /* A3 */ - mic_header2[1] = mpdu[17]; - mic_header2[2] = mpdu[18]; - mic_header2[3] = mpdu[19]; - mic_header2[4] = mpdu[20]; - mic_header2[5] = mpdu[21]; - /* In Sequence Control field, mute sequence numer bits (12-bit) */ - mic_header2[6] = mpdu[22] & 0x0f; /* SC */ - mic_header2[7] = 0x00; /* mpdu[23]; */ - - if ((!qc_exists) & a4_exists) { - for (i = 0; i < 6; i++) - mic_header2[8 + i] = mpdu[24 + i]; /* A4 */ - } - - if (qc_exists && (!a4_exists)) { - mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */ - mic_header2[9] = mpdu[25] & 0x00; - } - - if (qc_exists && a4_exists) { - for (i = 0; i < 6; i++) - mic_header2[8 + i] = mpdu[24 + i]; /* A4 */ - - mic_header2[14] = mpdu[30] & 0x0f; - mic_header2[15] = mpdu[31] & 0x00; - } -} - -/************************************************/ -/* construct_mic_iv() */ -/* Builds the MIC IV from header fields and PN */ -/************************************************/ - -void construct_mic_iv(unsigned char *mic_iv, int qc_exists, int a4_exists, - unsigned char *mpdu, unsigned int payload_length, - unsigned char *pn_vector) -{ - int i; - - mic_iv[0] = 0x59; - - if (qc_exists && a4_exists) - mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ - - if (qc_exists && !a4_exists) - mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ - - if (!qc_exists) - mic_iv[1] = 0x00; - - for (i = 2; i < 8; i++) - mic_iv[i] = - mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ - -#ifdef CONSISTENT_PN_ORDER - - for (i = 8; i < 14; i++) - mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */ - -#else - - for (i = 8; i < 14; i++) - mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */ - -#endif - mic_iv[14] = (unsigned char)(payload_length / 256); - mic_iv[15] = (unsigned char)(payload_length % 256); -} - -/****************************************/ -/* aes128k128d() */ -/* Performs a 128 bit AES encrypt with */ -/* 128 bit data. */ -/****************************************/ -void aes128k128d(unsigned char *key, unsigned char *data, - unsigned char *ciphertext) -{ - int round; - int i; - unsigned char intermediatea[16]; - unsigned char intermediateb[16]; - unsigned char round_key[16]; - - for (i = 0; i < 16; i++) - round_key[i] = key[i]; - - for (round = 0; round < 11; round++) { - if (round == 0) { - xor_128(round_key, data, ciphertext); - next_key(round_key, round); - } else if (round == 10) { - byte_sub(ciphertext, intermediatea); - shift_row(intermediatea, intermediateb); - xor_128(intermediateb, round_key, ciphertext); - } else { /* 1 - 9 */ - byte_sub(ciphertext, intermediatea); - shift_row(intermediatea, intermediateb); - mix_column(&intermediateb[0], &intermediatea[0]); - mix_column(&intermediateb[4], &intermediatea[4]); - mix_column(&intermediateb[8], &intermediatea[8]); - mix_column(&intermediateb[12], &intermediatea[12]); - xor_128(intermediatea, round_key, ciphertext); - next_key(round_key, round); - } - } -} - -void construct_ctr_preload(unsigned char *ctr_preload, int a4_exists, - int qc_exists, unsigned char *mpdu, - unsigned char *pn_vector, int c) -{ - int i = 0; - - for (i = 0; i < 16; i++) - ctr_preload[i] = 0x00; - - i = 0; - ctr_preload[0] = 0x01; /* flag */ - - if (qc_exists && a4_exists) - ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */ - - if (qc_exists && !a4_exists) - ctr_preload[1] = mpdu[24] & 0x0f; - - for (i = 2; i < 8; i++) - ctr_preload[i] = - mpdu[i + - 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ - -#ifdef CONSISTENT_PN_ORDER - - for (i = 8; i < 14; i++) - ctr_preload[i] = - pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */ - -#else - - for (i = 8; i < 14; i++) - ctr_preload[i] = - pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */ - -#endif - ctr_preload[14] = (unsigned char)(c / 256); /* Ctr */ - ctr_preload[15] = (unsigned char)(c % 256); -} - -BOOLEAN RTMPSoftDecryptAES(IN PRTMP_ADAPTER pAd, IN PUCHAR pData, - IN ULONG DataByteCnt, IN PCIPHER_KEY pWpaKey) -{ - UINT HeaderLen; - UCHAR PN[6]; - UINT payload_len; - UINT num_blocks; - UINT payload_remainder; - USHORT fc; - UCHAR fc0; - UCHAR fc1; - UINT frame_type; - UINT frame_subtype; - UINT from_ds; - UINT to_ds; - INT a4_exists; - INT qc_exists; - UCHAR aes_out[16]; - int payload_index; - UINT i; - UCHAR ctr_preload[16]; - UCHAR chain_buffer[16]; - UCHAR padded_buffer[16]; - UCHAR mic_iv[16]; - UCHAR mic_header1[16]; - UCHAR mic_header2[16]; - UCHAR MIC[8]; - UCHAR TrailMIC[8]; -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pData, DIR_READ, FALSE); -#endif - fc0 = *pData; - fc1 = *(pData + 1); - fc = *((PUSHORT)pData); - frame_type = ((fc0 >> 2) & 0x03); - frame_subtype = ((fc0 >> 4) & 0x0f); - from_ds = (fc1 & 0x2) >> 1; - to_ds = (fc1 & 0x1); - a4_exists = (from_ds & to_ds); - qc_exists = ((frame_subtype == 0x08) || /* Assumed QoS subtypes */ - (frame_subtype == 0x09) || /* Likely to change. */ - (frame_subtype == 0x0a) || (frame_subtype == 0x0b)); - HeaderLen = 24; - - if (a4_exists) - HeaderLen += 6; - - if (qc_exists) - HeaderLen += 2; - - if (pWpaKey->KeyLen == 0) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTMPSoftDecryptAES failed!(the Length can not be 0)\n")); - return FALSE; - } - - PN[0] = *(pData + HeaderLen); - PN[1] = *(pData + HeaderLen + 1); - PN[2] = *(pData + HeaderLen + 4); - PN[3] = *(pData + HeaderLen + 5); - PN[4] = *(pData + HeaderLen + 6); - PN[5] = *(pData + HeaderLen + 7); - payload_len = DataByteCnt - HeaderLen - 8 - - 8; /* 8 bytes for CCMP header , 8 bytes for MIC*/ - payload_remainder = (payload_len) % 16; - num_blocks = (payload_len) / 16; - /* Find start of payload*/ - payload_index = HeaderLen + 8; /*IV+EIV*/ - - for (i = 0; i < num_blocks; i++) { - construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pData, - PN, i + 1); - aes128k128d(pWpaKey->Key, ctr_preload, aes_out); - bitwise_xor(aes_out, pData + payload_index, chain_buffer); - NdisMoveMemory(pData + payload_index - 8, chain_buffer, 16); - payload_index += 16; - } - - /* If there is a short final block, then pad it*/ - /* encrypt it and copy the unpadded part back */ - - if (payload_remainder > 0) { - construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pData, - PN, num_blocks + 1); - NdisZeroMemory(padded_buffer, 16); - NdisMoveMemory(padded_buffer, pData + payload_index, - payload_remainder); - aes128k128d(pWpaKey->Key, ctr_preload, aes_out); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - NdisMoveMemory(pData + payload_index - 8, chain_buffer, - payload_remainder); - payload_index += payload_remainder; - } - - /* Descrypt the MIC*/ - construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pData, PN, 0); - NdisZeroMemory(padded_buffer, 16); - NdisMoveMemory(padded_buffer, pData + payload_index, 8); - aes128k128d(pWpaKey->Key, ctr_preload, aes_out); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - NdisMoveMemory(TrailMIC, chain_buffer, 8); - /*Force the protected frame bit on*/ - *(pData + 1) = *(pData + 1) | 0x40; - /* Find start of payload*/ - /* Because the CCMP header has been removed*/ - payload_index = HeaderLen; - construct_mic_iv(mic_iv, qc_exists, a4_exists, pData, payload_len, PN); - construct_mic_header1(mic_header1, HeaderLen, pData); - construct_mic_header2(mic_header2, pData, a4_exists, qc_exists); - aes128k128d(pWpaKey->Key, mic_iv, aes_out); - bitwise_xor(aes_out, mic_header1, chain_buffer); - aes128k128d(pWpaKey->Key, chain_buffer, aes_out); - bitwise_xor(aes_out, mic_header2, chain_buffer); - aes128k128d(pWpaKey->Key, chain_buffer, aes_out); - - /* iterate through each 16 byte payload block */ - for (i = 0; i < num_blocks; i++) { - bitwise_xor(aes_out, pData + payload_index, chain_buffer); - payload_index += 16; - aes128k128d(pWpaKey->Key, chain_buffer, aes_out); - } - - /* Add on the final payload block if it needs padding */ - if (payload_remainder > 0) { - NdisZeroMemory(padded_buffer, 16); - NdisMoveMemory(padded_buffer, pData + payload_index, - payload_remainder); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - aes128k128d(pWpaKey->Key, chain_buffer, aes_out); - } - - /* aes_out contains padded mic, discard most significant*/ - /* 8 bytes to generate 64 bit MIC*/ - for (i = 0; i < 8; i++) - MIC[i] = aes_out[i]; - - if (!NdisEqualMemory(MIC, TrailMIC, 8)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTMPSoftDecryptAES, MIC Error !\n")); /* MIC error. */ - return FALSE; - } - -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pData, DIR_READ, FALSE); -#endif - return TRUE; -} - -/* - ======================================================================== - - Routine Description: - Construct AAD of CCMP. - - Arguments: - - Return Value: - - Note: - It's described in IEEE Std 802.11-2007. - The AAD is constructed from the MPDU header. - - ======================================================================== -*/ -VOID RTMPConstructCCMPAAD(IN PUCHAR pHdr, IN BOOLEAN isDataFrame, - IN UINT8 a4_exists, IN UINT8 qc_exists, - OUT UCHAR *aad_hdr, OUT UINT *aad_len) -{ - UINT len = 0; - - /* Frame control - - Subtype bits (bits 4 5 6) in a Data MPDU masked to 0 - Retry bit (bit 11) masked to 0 - PwrMgt bit (bit 12) masked to 0 - MoreData bit (bit 13) masked to 0 - Protected Frame bit (bit 14) always set to 1 */ - if (isDataFrame) - aad_hdr[0] = (*pHdr) & 0x8f; - else - aad_hdr[0] = (*pHdr); - - aad_hdr[1] = (*(pHdr + 1)) & 0xc7; - aad_hdr[1] = aad_hdr[1] | 0x40; - len = 2; - /* Append Addr 1, 2 & 3 */ - NdisMoveMemory(&aad_hdr[len], pHdr + 4, 3 * MAC_ADDR_LEN); - len += (3 * MAC_ADDR_LEN); - /* SC - - MPDU Sequence Control field, with the Sequence Number - subfield (bits 4-15 of the Sequence Control field) - masked to 0. The Fragment Number subfield is not modified. */ - aad_hdr[len] = (*(pHdr + 22)) & 0x0f; - aad_hdr[len + 1] = 0x00; - len += 2; - - /* Append the Addr4 field if present. */ - if (a4_exists) { - NdisMoveMemory(&aad_hdr[len], pHdr + 24, MAC_ADDR_LEN); - len += MAC_ADDR_LEN; - } - - /* QC - - QoS Control field, if present, a 2-octet field that includes - the MSDU priority. The QC TID field is used in the - construction of the AAD and the remaining QC fields are - set to 0 for the AAD calculation (bits 4 to 15 are set to 0). */ - if (qc_exists & a4_exists) { - aad_hdr[len] = (*(pHdr + 30)) & 0x0f; /* Qos_TC */ - aad_hdr[len + 1] = 0x00; - len += 2; - } else if (qc_exists & !a4_exists) { - aad_hdr[len] = (*(pHdr + 24)) & 0x0f; /* Qos_TC */ - aad_hdr[len + 1] = 0x00; - len += 2; - } - - *aad_len = len; -} - -/* - ======================================================================== - - Routine Description: - Construct NONCE header of CCMP. - - Arguments: - - Return Value: - - Note: - - ======================================================================== -*/ -VOID RTMPConstructCCMPNonce(IN PUCHAR pHdr, IN UINT8 a4_exists, - IN UINT8 qc_exists, IN BOOLEAN isMgmtFrame, - IN UCHAR *pn, OUT UCHAR *nonce_hdr, - OUT UINT *nonce_hdr_len) -{ - UINT n_offset = 0; - INT i; - - /* Decide the Priority Octet - The Priority sub-field of the Nonce Flags field shall - be set to the fixed value 0 when there is no QC field - present in the MPDU header. When the QC field is present, - bits 0 to 3 of the Priority field shall be set to the - value of the QC TID (bits 0 to 3 of the QC field).*/ - if (qc_exists && a4_exists) - nonce_hdr[0] = (*(pHdr + 30)) & 0x0f; - - if (qc_exists && !a4_exists) - nonce_hdr[0] = (*(pHdr + 24)) & 0x0f; - -#ifdef DOT11W_PMF_SUPPORT - - /* When Management Frame Protection is negotiated, the Management - field of the Nonce Flags field shall be set to 1 if the Type - field of the Frame Control field is 00 (Management frame); otherwise it - is set to 0. */ - if (isMgmtFrame) - nonce_hdr[0] = nonce_hdr[0] | 0x10; - -#endif /* DOT11W_PMF_SUPPORT */ - n_offset += 1; - /* Fill in MPDU Address A2 field */ - NdisMoveMemory(&nonce_hdr[n_offset], pHdr + 10, MAC_ADDR_LEN); - n_offset += MAC_ADDR_LEN; - - /* Fill in the PN. The PN field occupies octets 7¡V12. - The octets of PN shall be ordered so that PN0 is at octet index 12 - and PN5 is at octet index 7. */ - for (i = 0; i < 6; i++) - nonce_hdr[n_offset + i] = pn[5 - i]; - - n_offset += LEN_PN; - *nonce_hdr_len = n_offset; -} - -/* - ======================================================================== - Routine Description: - Construct CCMP header. - - Arguments: - - Return Value: - - Note: - It's a 8-octets header. - ======================================================================== -*/ -VOID RTMPConstructCCMPHdr(IN UINT8 key_idx, IN UCHAR *pn, OUT UCHAR *ccmp_hdr) -{ - NdisZeroMemory(ccmp_hdr, LEN_CCMP_HDR); - ccmp_hdr[0] = pn[0]; - ccmp_hdr[1] = pn[1]; - ccmp_hdr[3] = (key_idx << 6) | 0x20; - ccmp_hdr[4] = pn[2]; - ccmp_hdr[5] = pn[3]; - ccmp_hdr[6] = pn[4]; - ccmp_hdr[7] = pn[5]; -} - -/* - ======================================================================== - Routine Description: - - Arguments: - - Return Value: - - Note: - ======================================================================== -*/ -BOOLEAN RTMPSoftEncryptCCMP(IN PRTMP_ADAPTER pAd, IN PUCHAR pHdr, IN PUCHAR pIV, - IN PUCHAR pKey, INOUT PUCHAR pData, - IN UINT32 DataLen) -{ - UINT8 frame_type, frame_subtype; - UINT8 from_ds, to_ds; - UINT8 a4_exists, qc_exists; - UINT8 aad_hdr[30]; - UINT aad_len = 0; - UINT8 nonce_hdr[13]; - UINT32 nonce_hdr_len = 0; - UINT32 out_len = DataLen + 8; -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE); -#endif - /* Initial variable */ - NdisZeroMemory(aad_hdr, 30); - NdisZeroMemory(nonce_hdr, 13); - /* Indicate type and subtype of Frame Control field */ - frame_type = (((*pHdr) >> 2) & 0x03); - frame_subtype = (((*pHdr) >> 4) & 0x0f); - /* Indicate the fromDS and ToDS */ - from_ds = ((*(pHdr + 1)) & 0x2) >> 1; - to_ds = ((*(pHdr + 1)) & 0x1); - /* decide if the Address 4 exist or QoS exist */ - a4_exists = (from_ds & to_ds); - qc_exists = 0; - - if (frame_type == FC_TYPE_DATA) { - qc_exists = ((frame_subtype == SUBTYPE_QDATA) || - (frame_subtype == SUBTYPE_QDATA_CFACK) || - (frame_subtype == SUBTYPE_QDATA_CFPOLL) || - (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL)); - } - - /* Construct AAD header */ - RTMPConstructCCMPAAD(pHdr, (frame_type == FC_TYPE_DATA), a4_exists, - qc_exists, aad_hdr, &aad_len); - /* Construct NONCE header */ - RTMPConstructCCMPNonce(pHdr, a4_exists, qc_exists, - (frame_type == FC_TYPE_MGMT), pIV, nonce_hdr, - &nonce_hdr_len); - - /* CCM originator processing - - Use the temporal key, AAD, nonce, and MPDU data to - form the cipher text and MIC. */ - if (AES_CCM_Encrypt(pData, DataLen, pKey, 16, nonce_hdr, nonce_hdr_len, - aad_hdr, aad_len, LEN_CCMP_MIC, pData, &out_len)) - return FALSE; - -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE); -#endif - return TRUE; -} - -/* - ======================================================================== - Routine Description: - Decrypt data with CCMP. - - Arguments: - - Return Value: - - Note: - ======================================================================== -*/ -BOOLEAN RTMPSoftDecryptCCMP(IN PRTMP_ADAPTER pAd, IN PUCHAR pHdr, - IN PCIPHER_KEY pKey, INOUT PUCHAR pData, - INOUT UINT16 *DataLen) -{ - UINT8 frame_type, frame_subtype; - UINT8 from_ds, to_ds; - UINT8 a4_exists, qc_exists; - UINT8 aad_hdr[30]; - UINT aad_len = 0; - UINT8 pn[LEN_PN]; - PUCHAR cipherData_ptr; - UINT32 cipherData_len; - UINT8 nonce_hdr[13]; - UINT32 nonce_hdr_len = 0; - UINT32 out_len = *DataLen; -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE); -#endif - - /* Check the key is valid */ - if (pKey->KeyLen == 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The key is not available !\n", __func__)); - return FALSE; - } - - /* Initial variable */ - NdisZeroMemory(aad_hdr, 30); - NdisZeroMemory(nonce_hdr, 13); - /* Indicate type and subtype of Frame Control field */ - frame_type = (((*pHdr) >> 2) & 0x03); - frame_subtype = (((*pHdr) >> 4) & 0x0f); - /* Indicate the fromDS and ToDS */ - from_ds = ((*(pHdr + 1)) & 0x2) >> 1; - to_ds = ((*(pHdr + 1)) & 0x1); - /* decide if the Address 4 exist or QoS exist */ - a4_exists = (from_ds & to_ds); - qc_exists = 0; - - if (frame_type == FC_TYPE_DATA) { - qc_exists = ((frame_subtype == SUBTYPE_QDATA) || - (frame_subtype == SUBTYPE_QDATA_CFACK) || - (frame_subtype == SUBTYPE_QDATA_CFPOLL) || - (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL)); - } - - /* Extract PN and from CCMP header */ - pn[0] = pData[0]; - pn[1] = pData[1]; - pn[2] = pData[4]; - pn[3] = pData[5]; - pn[4] = pData[6]; - pn[5] = pData[7]; - /* skip ccmp header */ - cipherData_ptr = pData + LEN_CCMP_HDR; - cipherData_len = *DataLen - LEN_CCMP_HDR; - - /*skip payload length is zero*/ - if ((*DataLen) <= LEN_CCMP_HDR) - return FALSE; - - /* Construct AAD header */ - RTMPConstructCCMPAAD(pHdr, (frame_type == FC_TYPE_DATA), a4_exists, - qc_exists, aad_hdr, &aad_len); - /* Construct NONCE header */ - RTMPConstructCCMPNonce(pHdr, a4_exists, qc_exists, - (frame_type == FC_TYPE_MGMT), pn, nonce_hdr, - &nonce_hdr_len); - - /* CCM recipient processing - - uses the temporal key, AAD, nonce, MIC, - and MPDU cipher text data */ - if (AES_CCM_Decrypt(cipherData_ptr, cipherData_len, pKey->Key, 16, - nonce_hdr, nonce_hdr_len, aad_hdr, aad_len, - LEN_CCMP_MIC, pData, &out_len)) - return FALSE; - - *DataLen = out_len; -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE); -#endif - return TRUE; -} - -/* - ======================================================================== - Routine Description: - CCMP test vector - - Arguments: - - Return Value: - - Note: - ======================================================================== -*/ -VOID CCMP_test_vector(IN PRTMP_ADAPTER pAd, IN INT input) -{ - UINT8 Key_ID = 0; - /*UINT8 A1[6] = {0x0f, 0xd2, 0xe1, 0x28, 0xa5, 0x7c};*/ - /*UINT8 A2[6] = {0x50, 0x30, 0xf1, 0x84, 0x44, 0x08};*/ - /*UINT8 A3[6] = {0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba};*/ - UINT8 TK[16] = { 0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85, - 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f }; - UINT8 PN[6] = { 0x0C, 0xE7, 0x76, 0x97, 0x03, 0xB5 }; - UINT8 HDR[24] = { 0x08, 0x48, 0xc3, 0x2c, 0x0f, 0xd2, 0xe1, 0x28, - 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, - 0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba, 0x80, 0x33 }; - UINT8 AAD[22] = { 0x08, 0x40, 0x0f, 0xd2, 0xe1, 0x28, 0xa5, 0x7c, - 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0xab, 0xae, - 0xa5, 0xb8, 0xfc, 0xba, 0x00, 0x00 }; - UINT8 CCMP_HDR[8] = { 0x0c, 0xe7, 0x00, 0x20, 0x76, 0x97, 0x03, 0xb5 }; - UINT8 CCM_NONCE[13] = { 0x00, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, - 0xb5, 0x03, 0x97, 0x76, 0xe7, 0x0c }; - UINT8 P_TEXT_DATA[20] = { 0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, - 0xae, 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, - 0xa8, 0xeb, 0x7e, 0x78, 0xa0, 0x50 }; - UINT8 C_TEXT_DATA[28] = { 0xf3, 0xd0, 0xa2, 0xfe, 0x9a, 0x3d, 0xbf, - 0x23, 0x42, 0xa6, 0x43, 0xe4, 0x32, 0x46, - 0xe8, 0x0c, 0x3c, 0x04, 0xd0, 0x19, 0x78, - 0x45, 0xce, 0x0b, 0x16, 0xf9, 0x76, 0x23 }; - UINT8 res_buf[100]; - UINT res_len = 0; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("== CCMP test vector ==\n")); - /* Check AAD */ - NdisZeroMemory(res_buf, 100); - res_len = 0; - RTMPConstructCCMPAAD(HDR, TRUE, 0, 0, res_buf, &res_len); - - if (res_len == 22 && NdisEqualMemory(res_buf, AAD, res_len)) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Construct AAD is OK!!!\n")); - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n!!!Construct AAD is FAILURE!!!\n\n")); - hex_dump("Calculate AAD", res_buf, res_len); - } - - /* Check NONCE */ - NdisZeroMemory(res_buf, 100); - res_len = 0; - RTMPConstructCCMPNonce(HDR, 0, 0, FALSE, PN, res_buf, &res_len); - - if (res_len == 13 && NdisEqualMemory(res_buf, CCM_NONCE, res_len)) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Construct NONCE is OK!!!\n")); - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n!!!Construct NONCE is FAILURE!!!\n\n")); - hex_dump("Calculate NONCE", res_buf, res_len); - } - - /* Check CCMP-Header */ - NdisZeroMemory(res_buf, 100); - res_len = 0; - RTMPConstructCCMPHdr(Key_ID, PN, res_buf); - - if (NdisEqualMemory(res_buf, CCMP_HDR, 8)) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Construct CCMP_HDR is OK!!!\n")); - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n!!!Construct CCMP_HDR is FAILURE!!!\n\n")); - hex_dump("Calculate CCMP_HDR", res_buf, 8); - } - - /* Encrypt action */ - NdisZeroMemory(res_buf, 100); - NdisMoveMemory(res_buf, P_TEXT_DATA, sizeof(P_TEXT_DATA)); - res_len = sizeof(C_TEXT_DATA); - - if (AES_CCM_Encrypt(res_buf, sizeof(P_TEXT_DATA), TK, sizeof(TK), - CCM_NONCE, sizeof(CCM_NONCE), AAD, sizeof(AAD), 8, - res_buf, &res_len) == 0) { - if (res_len == sizeof(C_TEXT_DATA) && - NdisEqualMemory(res_buf, C_TEXT_DATA, res_len)) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CCM_Encrypt is OK!!!\n")); - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n!!!CCM_Encrypt is FAILURE!!!\n\n")); - hex_dump("CCM_Encrypt", res_buf, res_len); - } - } - - /* Decrypt action */ - NdisZeroMemory(res_buf, 100); - NdisMoveMemory(res_buf, C_TEXT_DATA, sizeof(C_TEXT_DATA)); - res_len = sizeof(P_TEXT_DATA); - - if (AES_CCM_Decrypt(res_buf, sizeof(C_TEXT_DATA), TK, 16, CCM_NONCE, - sizeof(CCM_NONCE), AAD, sizeof(AAD), 8, res_buf, - &res_len) == 0) { - if (res_len == sizeof(P_TEXT_DATA) && - NdisEqualMemory(res_buf, P_TEXT_DATA, res_len)) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CCM_Decrypt is OK!!!\n")); - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n!!!CCM_Decrypt is FAILURE!!!\n\n")); - hex_dump("CCM_Decrypt", res_buf, res_len); - } - } - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("== CCMP test vector ==\n")); -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_sec.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_sec.c deleted file mode 100644 index 1553f86f4e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_sec.c +++ /dev/null @@ -1,2618 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_sec.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#include "rt_config.h" - -VOID SetWdevAuthMode(IN struct _SECURITY_CONFIG *pSecConfig, - IN RTMP_STRING *arg) -{ - UINT32 AKMMap = 0; - - CLEAR_SEC_AKM(AKMMap); - - if (rtstrcasecmp(arg, "OPEN") == TRUE) - SET_AKM_OPEN(AKMMap); - else if (rtstrcasecmp(arg, "SHARED") == TRUE) - SET_AKM_SHARED(AKMMap); - else if (rtstrcasecmp(arg, "WEPAUTO") == TRUE) { - SET_AKM_OPEN(AKMMap); - SET_AKM_AUTOSWITCH(AKMMap); - } else if (rtstrcasecmp(arg, "WPA") == TRUE) - SET_AKM_WPA1(AKMMap); - else if (rtstrcasecmp(arg, "WPAPSK") == TRUE) - SET_AKM_WPA1PSK(AKMMap); - else if (rtstrcasecmp(arg, "WPANONE") == TRUE) - SET_AKM_WPANONE(AKMMap); - else if (rtstrcasecmp(arg, "WPA2") == TRUE) - SET_AKM_WPA2(AKMMap); - else if (rtstrcasecmp(arg, "WPA2PSK") == TRUE) - SET_AKM_WPA2PSK(AKMMap); - else if (rtstrcasecmp(arg, "WPA3") == TRUE) { - /* WPA3 code flow is same as WPA2, the usage of SEC_AKM_WPA3 is to force pmf on */ - SET_AKM_WPA2(AKMMap); - SET_AKM_WPA3(AKMMap); - } -#ifdef DOT11_SUITEB_SUPPORT - else if (rtstrcasecmp(arg, "WPA3-192") == TRUE) - SET_AKM_WPA3_192BIT(AKMMap); -#endif -#ifdef DOT11_SAE_SUPPORT - else if (rtstrcasecmp(arg, "WPA3PSK") == TRUE) - SET_AKM_SAE_SHA256(AKMMap); - else if (rtstrcasecmp(arg, "WPA2PSKWPA3PSK") == TRUE) { - SET_AKM_SAE_SHA256(AKMMap); - SET_AKM_WPA2PSK(AKMMap); - } -#endif /* DOT11_SAE_SUPPORT */ - else if (rtstrcasecmp(arg, "WPA1WPA2") == TRUE) { - SET_AKM_WPA1(AKMMap); - SET_AKM_WPA2(AKMMap); - } else if (rtstrcasecmp(arg, "WPAPSKWPA2PSK") == TRUE) { - SET_AKM_WPA1PSK(AKMMap); - SET_AKM_WPA2PSK(AKMMap); - } else if ((rtstrcasecmp(arg, "WPA_AES_WPA2_TKIPAES") == TRUE) || - (rtstrcasecmp(arg, "WPA_AES_WPA2_TKIP") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIP_WPA2_AES") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIP_WPA2_TKIPAES") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIPAES_WPA2_AES") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIPAES_WPA2_TKIPAES") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIPAES_WPA2_TKIP") == TRUE)) { - SET_AKM_WPA1PSK(AKMMap); - SET_AKM_WPA2PSK(AKMMap); - } else if (rtstrcasecmp(arg, "OWE") == TRUE) { - SET_AKM_OWE(AKMMap); - } -#ifdef OCE_FILS_SUPPORT - else if (rtstrcasecmp(arg, "FILS_SHA256") == TRUE) { - SET_AKM_WPA2(AKMMap); - SET_AKM_FILS_SHA256(AKMMap); - } else if (rtstrcasecmp(arg, "FILS_SHA384") == TRUE) { - SET_AKM_WPA2(AKMMap); - SET_AKM_FILS_SHA384(AKMMap); - } -#endif /* OCE_FILS_SUPPORT */ -#ifdef DPP_SUPPORT - else if (rtstrcasecmp(arg, "DPP") == TRUE) { - SET_AKM_DPP(AKMMap); - } else if (rtstrcasecmp(arg, "DPPWPA3PSK") == TRUE) { - SET_AKM_DPP(AKMMap); - SET_AKM_SAE_SHA256(AKMMap); - } else if (rtstrcasecmp(arg, "DPPWPA3PSKWPA2PSK") == TRUE) { - SET_AKM_DPP(AKMMap); - SET_AKM_SAE_SHA256(AKMMap); - SET_AKM_WPA2PSK(AKMMap); - } -#endif /* DPP_SUPPORT */ - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: Not support (AuthMode=%s, len=%d)\n", __func__, - arg, (int)strlen(arg))); - } - - if (AKMMap != 0x0) - pSecConfig->AKMMap = AKMMap; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::AuthMode=0x%x\n", __func__, pSecConfig->AKMMap)); -} - -VOID SetWdevEncrypMode(IN struct _SECURITY_CONFIG *pSecConfig, - IN RTMP_STRING *arg) -{ - UINT Cipher = 0; - - if (rtstrcasecmp(arg, "NONE") == TRUE) - SET_CIPHER_NONE(Cipher); - else if (rtstrcasecmp(arg, "WEP") == TRUE) - SET_CIPHER_WEP(Cipher); - else if (rtstrcasecmp(arg, "TKIP") == TRUE) - SET_CIPHER_TKIP(Cipher); - else if ((rtstrcasecmp(arg, "AES") == TRUE) || - (rtstrcasecmp(arg, "CCMP128") == TRUE)) - SET_CIPHER_CCMP128(Cipher); - else if (rtstrcasecmp(arg, "CCMP256") == TRUE) - SET_CIPHER_CCMP256(Cipher); - else if (rtstrcasecmp(arg, "GCMP128") == TRUE) - SET_CIPHER_GCMP128(Cipher); - else if (rtstrcasecmp(arg, "GCMP256") == TRUE) - SET_CIPHER_GCMP256(Cipher); - else if ((rtstrcasecmp(arg, "TKIPAES") == TRUE) || - (rtstrcasecmp(arg, "TKIPCCMP128") == TRUE)) { - SET_CIPHER_TKIP(Cipher); - SET_CIPHER_CCMP128(Cipher); - } else if ((rtstrcasecmp(arg, "WPA_AES_WPA2_TKIPAES") == TRUE) || - (rtstrcasecmp(arg, "WPA_AES_WPA2_TKIP") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIP_WPA2_AES") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIP_WPA2_TKIPAES") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIPAES_WPA2_AES") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIPAES_WPA2_TKIPAES") == TRUE) || - (rtstrcasecmp(arg, "WPA_TKIPAES_WPA2_TKIP") == TRUE)) { - SET_CIPHER_TKIP(Cipher); - SET_CIPHER_CCMP128(Cipher); - } - - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:: Not support (EncrypType=%s, len=%d)\n", - __func__, arg, (int)strlen(arg))); - } - - if (Cipher != 0x0) { - pSecConfig->PairwiseCipher = Cipher; - CLEAR_GROUP_CIPHER(pSecConfig); - } - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::PairwiseCipher=0x%x\n", __func__, - GET_PAIRWISE_CIPHER(pSecConfig))); -} - -INT Set_SecAuthMode_Proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct _SECURITY_CONFIG *pSecConfig = pObj->pSecConfig; - if (pSecConfig == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: pSecConfig == NULL, arg=%s\n", __func__, arg)); - return FALSE; - } - - SetWdevAuthMode(pSecConfig, arg); - return TRUE; -} - -INT Set_SecEncrypType_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct _SECURITY_CONFIG *pSecConfig = pObj->pSecConfig; - - if (pSecConfig == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: pSecConfig == NULL, arg=%s\n", __func__, arg)); - return FALSE; - } - - SetWdevEncrypMode(pSecConfig, arg); - return TRUE; -} - -INT Set_SecDefaultKeyID_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct _SECURITY_CONFIG *pSecConfig = pObj->pSecConfig; - ULONG KeyIdx; - - if (pSecConfig == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: pSecConfig == NULL, arg=%s\n", __func__, arg)); - return FALSE; - } - - KeyIdx = os_str_tol(arg, 0, 10); - - if ((KeyIdx >= 1) && (KeyIdx <= 4)) - pSecConfig->PairwiseKeyId = (UCHAR)(KeyIdx - 1); - else - return FALSE; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s ==> DefaultKeyId=%d\n", __func__, - pSecConfig->PairwiseKeyId)); - return TRUE; -} - -INT Set_SecWPAPSK_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct _SECURITY_CONFIG *pSecConfig = pObj->pSecConfig; -#ifdef CONFIG_AP_SUPPORT - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if]; - INT i; -#endif - - if (pSecConfig == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: pSecConfig == NULL, arg=%s\n", __func__, arg)); - return FALSE; - } - - if (strlen(arg) < 65) { -#ifdef CONFIG_AP_SUPPORT - if (strlen(arg) != strlen(pSecConfig->PSK) || - !RTMPEqualMemory(arg, pSecConfig->PSK, strlen(arg))) { - for (i = 0; i < MAX_PMKID_COUNT; i++) { - if ((pAd->ApCfg.PMKIDCache.BSSIDInfo[i].Valid == - TRUE) && - (pAd->ApCfg.PMKIDCache.BSSIDInfo[i] - .Mbssidx == pMbss->mbss_idx)) { - pAd->ApCfg.PMKIDCache.BSSIDInfo[i] - .Valid = FALSE; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s():Modify PSK and clear PMKID (idx %d)from (mbssidx %d)\n", - __func__, i, pMbss->mbss_idx)); - } - } - } -#endif - os_move_mem(pSecConfig->PSK, arg, strlen(arg)); - pSecConfig->PSK[strlen(arg)] = '\0'; - } else - pSecConfig->PSK[0] = '\0'; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PSK = %s\n", __func__, arg)); -#ifdef CONFIG_AP_SUPPORT -#ifdef WSC_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - WSC_CTRL *pWscControl = NULL; - - if ((pObj->ioctl_if_type == INT_MAIN || - pObj->ioctl_if_type == INT_MBSSID)) { - UCHAR apidx = pObj->ioctl_if; - - pWscControl = &pAd->ApCfg.MBSSID[apidx].wdev.WscControl; - } -#ifdef APCLI_SUPPORT - else if (pObj->ioctl_if_type == INT_APCLI) { - UCHAR apcli_idx = pObj->ioctl_if; - - pWscControl = - &pAd->ApCfg.ApCliTab[apcli_idx].wdev.WscControl; - } - -#endif /* APCLI_SUPPORT */ - - if (pWscControl) { - NdisZeroMemory(pWscControl->WpaPsk, 64); - pWscControl->WpaPskLen = 0; - pWscControl->WpaPskLen = strlen(arg); - NdisMoveMemory(pWscControl->WpaPsk, arg, - pWscControl->WpaPskLen); - } - } -#endif /* WSC_AP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -INT Set_SecWEPKey_Proc(IN PRTMP_ADAPTER pAd, IN CHAR KeyId, IN RTMP_STRING *arg) -{ - INT retVal = FALSE; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct _SECURITY_CONFIG *pSecConfig = pObj->pSecConfig; - - if (pSecConfig == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: pSecConfig == NULL, arg=%s\n", __func__, arg)); - return FALSE; - } - - retVal = ParseWebKey(pSecConfig, arg, KeyId, 0); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::KeyID=%d, key=%s\n", __func__, KeyId, arg)); - return retVal; -} - -INT Set_SecKey1_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - return Set_SecWEPKey_Proc(pAd, 0, arg); -} - -INT Set_SecKey2_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - return Set_SecWEPKey_Proc(pAd, 1, arg); -} - -INT Set_SecKey3_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - return Set_SecWEPKey_Proc(pAd, 2, arg); -} - -INT Set_SecKey4_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - return Set_SecWEPKey_Proc(pAd, 3, arg); -} - -RTMP_STRING *GetAuthModeStr(IN UINT32 authMode) -{ - if (IS_AKM_OPEN(authMode)) - return "OPEN"; - else if (IS_AKM_SHARED(authMode)) - return "SHARED"; - else if (IS_AKM_AUTOSWITCH(authMode)) - return "WEPAUTO"; - else if (IS_AKM_WPANONE(authMode)) - return "WPANONE"; - else if (IS_AKM_WPA1(authMode) && IS_AKM_WPA2(authMode)) - return "WPA1WPA2"; - else if (IS_AKM_WPA1PSK(authMode) && IS_AKM_WPA2PSK(authMode)) - return "WPAPSKWPA2PSK"; - else if (IS_AKM_WPA2PSK(authMode) && IS_AKM_WPA3PSK(authMode)) - return "WPA2PSKWPA3PSK"; - else if (IS_AKM_FT_SAE_SHA256(authMode)) - return "FT-SAE"; - else if (IS_AKM_WPA3PSK(authMode)) - return "WPA3PSK"; - else if (IS_AKM_WPA1(authMode)) - return "WPA"; - else if (IS_AKM_WPA1PSK(authMode)) - return "WPAPSK"; - else if (IS_AKM_FT_WPA2(authMode)) - return "FT-WPA2"; - else if (IS_AKM_FT_WPA2PSK(authMode)) - return "FT-WPA2PSK"; - else if (IS_AKM_WPA3( - authMode)) /* WPA3 will be always accompanied by WPA2, so it should put before the WPA2 */ - return "WPA3"; - else if (IS_AKM_WPA2(authMode)) - return "WPA2"; - else if (IS_AKM_WPA2PSK(authMode)) - return "WPA2PSK"; - else if (IS_AKM_WPA3_192BIT(authMode)) - return "WPA3-192"; - else if (IS_AKM_OWE(authMode)) - return "OWE"; -#ifdef DPP_SUPPORT - else if (IS_AKM_DPP(authMode)) - return "DPP"; -#endif /* DPP_SUPPORT */ - else - return "UNKNOW"; -} - -RTMP_STRING *GetEncryModeStr(IN UINT32 encryMode) -{ - if (IS_CIPHER_NONE(encryMode)) - return "NONE"; - else if (IS_CIPHER_WEP(encryMode)) - return "WEP"; - else if (IS_CIPHER_TKIP(encryMode) && IS_CIPHER_CCMP128(encryMode)) - return "TKIPAES"; - else if (IS_CIPHER_TKIP(encryMode)) - return "TKIP"; - else if (IS_CIPHER_CCMP128(encryMode)) - return "AES"; - else if (IS_CIPHER_CCMP256(encryMode)) - return "CCMP256"; - else if (IS_CIPHER_GCMP128(encryMode)) - return "GCMP128"; - else if (IS_CIPHER_GCMP256(encryMode)) - return "GCMP256"; - else if (IS_CIPHER_BIP_CMAC128(encryMode)) - return "BIP-CMAC128"; - else if (IS_CIPHER_BIP_CMAC256(encryMode)) - return "BIP-CMAC256"; - else if (IS_CIPHER_BIP_GMAC128(encryMode)) - return "BIP-GMAC128"; - else if (IS_CIPHER_BIP_GMAC256(encryMode)) - return "BIP-GMAC256"; - else - return "UNKNOW"; -} - -UINT32 SecAuthModeOldToNew(IN USHORT authMode) -{ - UINT32 AKMMap = 0; - - switch (authMode) { - case Ndis802_11AuthModeOpen: - SET_AKM_OPEN(AKMMap); - break; - - case Ndis802_11AuthModeShared: - SET_AKM_SHARED(AKMMap); - break; - - case Ndis802_11AuthModeAutoSwitch: - SET_AKM_AUTOSWITCH(AKMMap); - break; - - case Ndis802_11AuthModeWPA: - SET_AKM_WPA1(AKMMap); - break; - - case Ndis802_11AuthModeWPAPSK: - SET_AKM_WPA1PSK(AKMMap); - break; - - case Ndis802_11AuthModeWPANone: - SET_AKM_WPANONE(AKMMap); - break; - - case Ndis802_11AuthModeWPA2: - SET_AKM_WPA2(AKMMap); - break; - - case Ndis802_11AuthModeWPA2PSK: - SET_AKM_WPA2PSK(AKMMap); - break; - - case Ndis802_11AuthModeWPA1WPA2: - SET_AKM_WPA1(AKMMap); - SET_AKM_WPA2(AKMMap); - break; - - case Ndis802_11AuthModeWPA1PSKWPA2PSK: - SET_AKM_WPA1PSK(AKMMap); - SET_AKM_WPA2PSK(AKMMap); - break; - } - - return AKMMap; -} - -UINT32 SecEncryModeOldToNew(IN USHORT encryMode) -{ - UINT32 EncryType = 0; - - switch (encryMode) { - case Ndis802_11WEPDisabled: - SET_CIPHER_NONE(EncryType); - break; - - case Ndis802_11WEPEnabled: - SET_CIPHER_WEP(EncryType); - break; - - case Ndis802_11TKIPEnable: - SET_CIPHER_TKIP(EncryType); - break; - - case Ndis802_11AESEnable: - SET_CIPHER_CCMP128(EncryType); - break; - - case Ndis802_11TKIPAESMix: - SET_CIPHER_TKIP(EncryType); - SET_CIPHER_CCMP128(EncryType); - break; - } - - return EncryType; -} - -USHORT SecAuthModeNewToOld(IN UINT32 authMode) -{ - if (IS_AKM_OPEN(authMode)) - return Ndis802_11AuthModeOpen; - else if (IS_AKM_SHARED(authMode)) - return Ndis802_11AuthModeShared; - else if (IS_AKM_AUTOSWITCH(authMode)) - return Ndis802_11AuthModeAutoSwitch; - else if (IS_AKM_WPANONE(authMode)) - return Ndis802_11AuthModeWPANone; - else if (IS_AKM_WPA1(authMode) && IS_AKM_WPA2(authMode)) - return Ndis802_11AuthModeWPA1WPA2; - else if (IS_AKM_WPA1PSK(authMode) && IS_AKM_WPA2PSK(authMode)) - return Ndis802_11AuthModeWPA1PSKWPA2PSK; - else if (IS_AKM_WPA1(authMode)) - return Ndis802_11AuthModeWPA; - else if (IS_AKM_WPA1PSK(authMode)) - return Ndis802_11AuthModeWPAPSK; - else if (IS_AKM_WPA2(authMode)) - return Ndis802_11AuthModeWPA2; - else if (IS_AKM_WPA2PSK(authMode)) - return Ndis802_11AuthModeWPA2PSK; - - else - return Ndis802_11AuthModeOpen; -} - -USHORT SecEncryModeNewToOld(IN UINT32 encryMode) -{ - if (IS_CIPHER_NONE(encryMode)) - return Ndis802_11WEPDisabled; - else if (IS_CIPHER_WEP(encryMode)) - return Ndis802_11WEPEnabled; - else if (IS_CIPHER_TKIP(encryMode)) - return Ndis802_11TKIPEnable; - else if (IS_CIPHER_CCMP128(encryMode)) - return Ndis802_11AESEnable; - else if (IS_CIPHER_TKIP(encryMode) && IS_CIPHER_CCMP128(encryMode)) - return Ndis802_11TKIPAESMix; - - else - return Ndis802_11WEPDisabled; -} - -UINT8 SecHWCipherSuitMapping(IN UINT32 encryMode) -{ - if (IS_CIPHER_NONE(encryMode)) - return CIPHER_SUIT_NONE; - else if (IS_CIPHER_WEP(encryMode)) - return CIPHER_SUIT_WEP_40; - else if (IS_CIPHER_TKIP(encryMode)) - return CIPHER_SUIT_TKIP_W_MIC; - else if (IS_CIPHER_CCMP128(encryMode)) - return CIPHER_SUIT_CCMP_W_MIC; - else if (IS_CIPHER_CCMP256(encryMode)) - return CIPHER_SUIT_CCMP_256; - else if (IS_CIPHER_GCMP128(encryMode)) - return CIPHER_SUIT_GCMP_128; - else if (IS_CIPHER_GCMP256(encryMode)) - return CIPHER_SUIT_GCMP_256; - - else - return CIPHER_SUIT_NONE; -} - -INT ParseWebKey(IN struct _SECURITY_CONFIG *pSecConfig, IN RTMP_STRING *buffer, - IN INT KeyIdx, IN INT Keylength) -{ - INT KeyLen = Keylength; - SEC_KEY_INFO *pWebKey = &pSecConfig->WepKey[KeyIdx]; - INT i = 0; - - if (KeyLen == 0) - KeyLen = strlen(buffer); - - switch (KeyLen) { - case 5: /*wep 40 Ascii type*/ - case 13: /*wep 104 Ascii type*/ - case 16: /*wep 128 Ascii type*/ - NdisZeroMemory(pWebKey, sizeof(SEC_KEY_INFO)); - pWebKey->KeyLen = KeyLen; - NdisMoveMemory(pWebKey->Key, buffer, KeyLen); - break; - - case 10: /*wep 40 Hex type*/ - case 26: /*wep 104 Hex type*/ - case 32: /*wep 128 Hex type*/ - for (i = 0; i < KeyLen; i++) { - if (!isxdigit(*(buffer + i))) - return FALSE; /*Not Hex value;*/ - } - - NdisZeroMemory(pWebKey, sizeof(SEC_KEY_INFO)); - pWebKey->KeyLen = KeyLen / 2; - AtoH(buffer, pWebKey->Key, pWebKey->KeyLen); - break; - - default: /*Invalid argument */ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::(keyIdx=%d):Invalid argument (arg=%s)\n", - __func__, KeyIdx, buffer)); - return FALSE; - } - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::(KeyIdx=%d, Alg=0x%x)\n", __func__, KeyIdx, - pSecConfig->PairwiseCipher)); - return TRUE; -} - -#ifdef DOT1X_SUPPORT -INT SetWdevOwnIPAddr(IN struct _SECURITY_CONFIG *pSecConfig, - IN RTMP_STRING *arg) -{ - UINT32 ip_addr; - - if (rtinet_aton(arg, &ip_addr)) { - pSecConfig->own_ip_addr = ip_addr; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("own_ip_addr=%s(%x)\n", arg, - pSecConfig->own_ip_addr)); - } - - return TRUE; -} - -VOID ReadRadiusParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer) -{ - RTMP_STRING tok_str[16], *macptr; - UINT32 ip_addr; - INT i = 0; - BOOLEAN bUsePrevFormat = FALSE; - USHORT offset; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; -#ifdef CONFIG_AP_SUPPORT - INT apidx; -#endif /* CONFIG_AP_SUPPORT */ -#ifdef RADIUS_ACCOUNTING_SUPPORT - BOOLEAN bAcctUsePrevFormat = FALSE; - /* INT acct_count[HW_BEACON_MAX_NUM]; */ -#endif /*RADIUS_ACCOUNTING_SUPPORT*/ - - /* own_ip_addr*/ - if (RTMPGetKeyParameter("own_ip_addr", tmpbuf, 32, pBuffer, TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> ", INF_MBSSID_DEV_NAME, - apidx)); - SetWdevOwnIPAddr(pSecConfig, macptr); - } - - /* Apply to remaining MBSS*/ - if (apidx >= 1) { - /* - * own_ip_addr is global setting , don't need to merge in dbdc multi profile, - * in this point, let all bss set the same own_ip_addr for safe - */ - for (apidx = 1; apidx < pAd->ApCfg.BssidNum; - apidx++) { - pSecConfig = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig; - pSecConfig->own_ip_addr = - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .own_ip_addr; - } - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - if (RTMPGetKeyParameter("own_radius_port", tmpbuf, 32, pBuffer, TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> ", INF_MBSSID_DEV_NAME, - apidx)); - - pSecConfig->own_radius_port = - simple_strtol(macptr, 0, 10); - } - - /* Apply to remaining MBSS*/ - if (apidx >= 1) { - /* - * own_radius_port is global setting , let all bss set the same own_radius_port - */ - for (apidx = 1; apidx < pAd->ApCfg.BssidNum; - apidx++) { - pSecConfig = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig; - pSecConfig->own_radius_port = - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .own_radius_port; - } - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* session_timeout_interval*/ - if (RTMPGetKeyParameter("session_timeout_interval", tmpbuf, 32, pBuffer, - TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - pSecConfig->session_timeout_interval = - os_str_tol(macptr, 0, 10); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> session_timeout_interval=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->session_timeout_interval)); - } - - /* Apply to remaining MBSS*/ - if (apidx == 1) { - for (apidx = 1; apidx < pAd->ApCfg.BssidNum; - apidx++) { - pSecConfig = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig; - pSecConfig->session_timeout_interval = - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .session_timeout_interval; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> session_timeout_interval=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig - ->session_timeout_interval)); - } - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* quiet_interval */ - if (RTMPGetKeyParameter("quiet_interval", tmpbuf, 32, pBuffer, TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - pSecConfig->quiet_interval = - os_str_tol(macptr, 0, 10); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> quiet_interval=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->quiet_interval)); - } - - /* Apply to remaining MBSS*/ - if (apidx == 1) { - for (apidx = 1; apidx < pAd->ApCfg.BssidNum; - apidx++) { - pSecConfig = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig; - pSecConfig->quiet_interval = - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .quiet_interval; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> quiet_interval=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->quiet_interval)); - } - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* EAPifname*/ - if (RTMPGetKeyParameter("EAPifname", tmpbuf, 256, pBuffer, TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (strlen(macptr) > 0 && - strlen(macptr) <= IFNAMSIZ) { - pSecConfig->EAPifname_len = - strlen(macptr); - NdisMoveMemory(pSecConfig->EAPifname, - macptr, strlen(macptr)); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> EAPifname=%s, len=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->EAPifname, - pSecConfig->EAPifname_len)); - } - } - - /* Apply to remaining MBSS*/ - if (apidx == 1) { - for (apidx = 1; apidx < pAd->ApCfg.BssidNum; - apidx++) { - pSecConfig = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig; - pSecConfig->EAPifname_len = - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .EAPifname_len; - NdisMoveMemory( - pSecConfig->EAPifname, - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .EAPifname, - strlen(pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .EAPifname)); - } - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* PreAuthifname*/ - if (RTMPGetKeyParameter("PreAuthifname", tmpbuf, 256, pBuffer, TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (strlen(macptr) > 0 && - strlen(macptr) <= IFNAMSIZ) { - pSecConfig->PreAuthifname_len = - strlen(macptr); - NdisMoveMemory( - pSecConfig->PreAuthifname, - macptr, strlen(macptr)); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> PreAuthifname=%s, len=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->PreAuthifname, - pSecConfig->PreAuthifname_len)); - } - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* PreAuth */ - if (RTMPGetKeyParameter("PreAuth", tmpbuf, 256, pBuffer, TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (os_str_tol(macptr, 0, 10) != 0) /*Enable*/ - pSecConfig->PreAuth = TRUE; - else /*Disable*/ - pSecConfig->PreAuth = FALSE; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> PreAuth=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->PreAuth)); - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* IEEE8021X */ - if (RTMPGetKeyParameter("IEEE8021X", tmpbuf, 256, pBuffer, TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (os_str_tol(macptr, 0, 10) != 0) /*Enable*/ - pSecConfig->IEEE8021X = TRUE; - else /*Disable*/ - pSecConfig->IEEE8021X = FALSE; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> IEEE8021X=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->IEEE8021X)); - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - -#ifdef RADIUS_ACCOUNTING_SUPPORT - - /*radius_request_cui - if(RTMPGetKeyParameter("radius_request_cui", tmpbuf, 32, buffer, TRUE)) - { - for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++) - { - if (i >= pAd->ApCfg.BssidNum) - break; - - if(os_str_tol(macptr, 0, 10) != 0) - pAd->ApCfg.MBSSID[i].radius_request_cui = TRUE; - else - pAd->ApCfg.MBSSID[i].radius_request_cui = FALSE; - - DBGPRINT(RT_DEBUG_ERROR, ("IF(ra%d), radius_request_cui=%d\n", i, pAd->ApCfg.MBSSID[i].radius_request_cui)); - } - }*/ - /*radius_acct_authentic*/ - if (RTMPGetKeyParameter("radius_acct_authentic", tmpbuf, 32, pBuffer, - TRUE)) { - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - pSecConfig->radius_acct_authentic = - os_str_tol(macptr, 0, 10); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_acct_authentic=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->radius_acct_authentic)); - } - } - } - - /*acct_interim_interval*/ - if (RTMPGetKeyParameter("acct_interim_interval", tmpbuf, 32, pBuffer, - TRUE)) { - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - pSecConfig->acct_interim_interval = - os_str_tol(macptr, 0, 10); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> acct_interim_interval=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->acct_interim_interval)); - } - } - } - - /*acct_enable*/ - if (RTMPGetKeyParameter("acct_enable", tmpbuf, 32, pBuffer, TRUE)) { - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - pSecConfig->acct_enable = - os_str_tol(macptr, 0, 10); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> acct_enable=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->acct_enable)); - } - } - } - -#endif /* RADIUS_ACCOUNTING_SUPPORT */ - /* RADIUS_Server */ - offset = 0; - - while (RTMPGetKeyParameterWithOffset("RADIUS_Server", tmpbuf, &offset, - 256, pBuffer, TRUE)) { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < MAX_MBSSID_NUM(pAd)); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (rtinet_aton(macptr, &ip_addr) && - (pSecConfig->radius_srv_num < MAX_RADIUS_SRV_NUM)) { - pSecConfig->radius_srv_info[0].radius_ip = - ip_addr; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_ip(seq-%d)=%s\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->radius_srv_num, macptr)); - pSecConfig->radius_srv_num++; - } - } - } - - /* RADIUS_Port */ - offset = 0; - - while (RTMPGetKeyParameterWithOffset("RADIUS_Port", tmpbuf, &offset, - 256, pBuffer, TRUE)) { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < MAX_MBSSID_NUM(pAd)); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - pSecConfig->radius_srv_info[0].radius_port = - (UINT32)os_str_tol(macptr, 0, 10); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_port(seq-%d)=%d\n", - INF_MBSSID_DEV_NAME, apidx, 0, - pSecConfig->radius_srv_info[0].radius_port)); - } - } - - /* RADIUS_Key */ - offset = 0; - - while (RTMPGetKeyParameterWithOffset("RADIUS_Key", tmpbuf, &offset, 256, - pBuffer, TRUE)) { - if (strlen(tmpbuf) > 0) - bUsePrevFormat = TRUE; - - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < MAX_MBSSID_NUM(pAd)); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (strlen(macptr) > 0) { - RADIUS_SRV_INFO *p_radius_srv_info = - &pSecConfig->radius_srv_info[0]; - - p_radius_srv_info->radius_key_len = - strlen(macptr) > 64 ? 64 : - strlen(macptr); - NdisMoveMemory( - p_radius_srv_info->radius_key, macptr, - p_radius_srv_info->radius_key_len); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_key(seq-%d)=%s, len=%d\n", - INF_MBSSID_DEV_NAME, apidx, 0, macptr, - p_radius_srv_info->radius_key_len)); - } - } - } - - if (!bUsePrevFormat) { - for (i = 0; i < MAX_MBSSID_NUM(pAd); i++) { - snprintf(tok_str, sizeof(tok_str), "RADIUS_Key%d", - i + 1); - offset = 0; - wdev = &pAd->ApCfg.MBSSID[i].wdev; - pSecConfig = &wdev->SecConfig; - - while (RTMPGetKeyParameterWithOffset(tok_str, tmpbuf, - &offset, 128, - pBuffer, FALSE)) { - if (strlen(tmpbuf) > 0) { - RADIUS_SRV_INFO *p_radius_srv_info = - &pSecConfig->radius_srv_info[0]; - - p_radius_srv_info->radius_key_len = - strlen(tmpbuf) > 64 ? - 64 : - strlen(tmpbuf); - NdisMoveMemory( - p_radius_srv_info->radius_key, - tmpbuf, - p_radius_srv_info - ->radius_key_len); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_key(seq-%d)=%s, len=%d\n", - INF_MBSSID_DEV_NAME, i, 0, - p_radius_srv_info->radius_key, - p_radius_srv_info - ->radius_key_len)); - } - } - } - } - - /* NasIdX, X indicate the interface index(1~8) */ - for (i = 0; i < MAX_MBSSID_NUM(pAd); i++) { - wdev = &pAd->ApCfg.MBSSID[i].wdev; - pSecConfig = &wdev->SecConfig; - snprintf(tok_str, sizeof(tok_str), "NasId%d", i + 1); - - if (RTMPGetKeyParameter(tok_str, tmpbuf, 33, pBuffer, FALSE)) { - if (strlen(tmpbuf) > 0) { - pSecConfig->NasIdLen = - strlen(tmpbuf) > IFNAMSIZ ? - IFNAMSIZ : - strlen(tmpbuf); - NdisMoveMemory(pSecConfig->NasId, tmpbuf, - pSecConfig->NasIdLen); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> NAS-ID=%s, len=%d\n", - INF_MBSSID_DEV_NAME, i, - pSecConfig->NasId, - pSecConfig->NasIdLen)); - } - } - } - -#ifdef RADIUS_ACCOUNTING_SUPPORT - /* RADIUS_Acct_Server*/ - offset = 0; - - while (RTMPGetKeyParameterWithOffset("RADIUS_Acct_Server", tmpbuf, - &offset, 256, pBuffer, TRUE)) { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < MAX_MBSSID_NUM(pAd)); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (rtinet_aton(macptr, &ip_addr) && - (pSecConfig->radius_acct_srv_num < - MAX_RADIUS_SRV_NUM)) { - pSecConfig - ->radius_acct_srv_info - [pSecConfig->radius_acct_srv_num] - .radius_ip = ip_addr; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_acct_ip(seq-%d)=%s\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->radius_acct_srv_num, - macptr)); - pSecConfig->radius_acct_srv_num++; - } - } - } - - /* RADIUS_Acct_Port*/ - offset = 0; - - while (RTMPGetKeyParameterWithOffset("RADIUS_Acct_Port", tmpbuf, - &offset, 256, pBuffer, TRUE)) { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < MAX_MBSSID_NUM(pAd)); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - pSecConfig->radius_acct_srv_info[0].radius_port = - (UINT32)os_str_tol(macptr, 0, - 10); /* TODO: idx */ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_acct_port(seq-%d)=%d\n", - INF_MBSSID_DEV_NAME, apidx, 0, - pSecConfig->radius_acct_srv_info[0] - .radius_port)); - } - } - - /* RADIUS_Key*/ - offset = 0; - - while (RTMPGetKeyParameterWithOffset("RADIUS_Acct_Key", tmpbuf, &offset, - 256, pBuffer, TRUE)) { - if (strlen(tmpbuf) > 0) - bAcctUsePrevFormat = TRUE; - - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < MAX_MBSSID_NUM(pAd)); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - - if (strlen(macptr) > 0) { - RADIUS_SRV_INFO *p_radius_srv_info = - &pSecConfig->radius_acct_srv_info - [0]; /* TODO: idx */ - - p_radius_srv_info->radius_key_len = - strlen(macptr) > 64 ? 64 : - strlen(macptr); - NdisMoveMemory( - p_radius_srv_info->radius_key, macptr, - p_radius_srv_info->radius_key_len); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_acct_key(seq-%d)=%s, len=%d\n", - INF_MBSSID_DEV_NAME, apidx, 0, macptr, - p_radius_srv_info->radius_key_len)); - } - } - } - - if (!bAcctUsePrevFormat) { - for (i = 0; i < MAX_MBSSID_NUM(pAd); i++) { - snprintf(tok_str, sizeof(tok_str), "RADIUS_Acct_Key%d", - i + 1); - offset = 0; - wdev = &pAd->ApCfg.MBSSID[i].wdev; - pSecConfig = &wdev->SecConfig; - - while (RTMPGetKeyParameterWithOffset(tok_str, tmpbuf, - &offset, 128, - pBuffer, FALSE)) { - if (strlen(tmpbuf) > 0) { - RADIUS_SRV_INFO *p_radius_srv_info = - &pSecConfig->radius_acct_srv_info - [0]; /* TODO: idx */ - - p_radius_srv_info->radius_key_len = - strlen(tmpbuf) > 64 ? - 64 : - strlen(tmpbuf); - NdisMoveMemory( - p_radius_srv_info->radius_key, - tmpbuf, - p_radius_srv_info - ->radius_key_len); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("IF(%s%d) ==> radius_acct_key(seq-%d)=%s, len=%d\n", - INF_MBSSID_DEV_NAME, i, 0, - p_radius_srv_info->radius_key, - p_radius_srv_info - ->radius_key_len)); - } - } - } - } - -#endif /* RADIUS_ACCOUNTING_SUPPORT */ -} - -#ifdef CONFIG_AP_SUPPORT -VOID Dot1xIoctlQueryRadiusConf(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - UCHAR apidx, srv_idx, keyidx, KeyLen = 0; - UCHAR *mpool; - PDOT1X_CMM_CONF pConf; - struct _SECURITY_CONFIG *pSecConfigMain = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR main_apidx = (UCHAR)pObj->ioctl_if; - UCHAR last_apidx = pAd->ApCfg.BssidNum - 1; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s==>\n", __func__)); - -#ifdef MULTI_PROFILE - if ((main_apidx == BSS0) && (is_multi_profile_enable(pAd) == TRUE)) - last_apidx = multi_profile_get_pf1_num(pAd) - 1; -#endif - if ((main_apidx > pAd->ApCfg.BssidNum - 1) || - (main_apidx > last_apidx)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid MBSSID index(%d)!\n", __func__, - main_apidx)); - return; - } - - pSecConfigMain = &pAd->ApCfg.MBSSID[main_apidx].wdev.SecConfig; - - /* Allocate memory */ - os_alloc_mem(NULL, (PUCHAR *)&mpool, sizeof(DOT1X_CMM_CONF)); - - if (mpool == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s: out of resource!!!\n", __func__)); - return; - } - - NdisZeroMemory(mpool, sizeof(DOT1X_CMM_CONF)); - pConf = (PDOT1X_CMM_CONF)mpool; - /* get MBSS number */ - pConf->mbss_num = (last_apidx - main_apidx + 1); - /* get own ip address */ - pConf->own_ip_addr = pSecConfigMain->own_ip_addr; - /* get own radius port */ - pConf->own_radius_port = pSecConfigMain->own_radius_port; - /* get retry interval */ - pConf->retry_interval = pSecConfigMain->retry_interval; - /* get session timeout interval */ - pConf->session_timeout_interval = - pSecConfigMain->session_timeout_interval; - /* Get the quiet interval */ - pConf->quiet_interval = pSecConfigMain->quiet_interval; - - for (apidx = main_apidx; apidx <= last_apidx; apidx++) { - struct _SECURITY_CONFIG *pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - UCHAR apidx_locate = apidx - main_apidx; - PDOT1X_BSS_INFO p1xBssInfo = &pConf->Dot1xBssInfo[apidx_locate]; -#ifdef RADIUS_ACCOUNTING_SUPPORT - PACCT_BSS_INFO pAcctBssInfo = &pConf->AcctBssInfo[apidx_locate]; - - pAcctBssInfo->radius_srv_num = pSecConfig->radius_acct_srv_num; -#endif /* RADIUS_ACCOUNTING_SUPPORT */ - p1xBssInfo->radius_srv_num = pSecConfig->radius_srv_num; - - /* prepare radius ip, port and key */ - for (srv_idx = 0; srv_idx < pSecConfig->radius_srv_num; - srv_idx++) { - if (pSecConfig->radius_srv_info[srv_idx].radius_ip != - 0) { - p1xBssInfo->radius_srv_info[srv_idx].radius_ip = - pSecConfig->radius_srv_info[srv_idx] - .radius_ip; - p1xBssInfo->radius_srv_info[srv_idx] - .radius_port = - pSecConfig->radius_srv_info[srv_idx] - .radius_port; - p1xBssInfo->radius_srv_info[srv_idx] - .radius_key_len = - pSecConfig->radius_srv_info[srv_idx] - .radius_key_len; - - if (pSecConfig->radius_srv_info[srv_idx] - .radius_key_len > 0) { - NdisMoveMemory( - p1xBssInfo - ->radius_srv_info[srv_idx] - .radius_key, - pSecConfig - ->radius_srv_info[srv_idx] - .radius_key, - pSecConfig - ->radius_srv_info[srv_idx] - .radius_key_len); - } - } - } - -#ifdef RADIUS_ACCOUNTING_SUPPORT - - /* prepare accounting radius ip, port and key */ - for (srv_idx = 0; srv_idx < pSecConfig->radius_acct_srv_num; - srv_idx++) { - if (pSecConfig->radius_acct_srv_info[srv_idx] - .radius_ip != 0) { - pAcctBssInfo->radius_srv_info[srv_idx] - .radius_ip = - pSecConfig - ->radius_acct_srv_info[srv_idx] - .radius_ip; - pAcctBssInfo->radius_srv_info[srv_idx] - .radius_port = - pSecConfig - ->radius_acct_srv_info[srv_idx] - .radius_port; - pAcctBssInfo->radius_srv_info[srv_idx] - .radius_key_len = - pSecConfig - ->radius_acct_srv_info[srv_idx] - .radius_key_len; - - if (pSecConfig->radius_acct_srv_info[srv_idx] - .radius_key_len > 0) { - NdisMoveMemory( - pAcctBssInfo - ->radius_srv_info[srv_idx] - .radius_key, - pSecConfig - ->radius_acct_srv_info - [srv_idx] - .radius_key, - pSecConfig - ->radius_acct_srv_info - [srv_idx] - .radius_key_len); - } - } - } - -#endif /* RADIUS_ACCOUNTING_SUPPORT */ - p1xBssInfo->ieee8021xWEP = (pSecConfig->IEEE8021X) ? 1 : 0; - - if (p1xBssInfo->ieee8021xWEP) { - /* Default Key index, length and material */ - keyidx = pSecConfig->PairwiseKeyId; - p1xBssInfo->key_index = keyidx; - /* Determine if the key is valid. */ - KeyLen = pSecConfig->WepKey[keyidx].KeyLen; - - if (KeyLen == 5 || KeyLen == 13) { - p1xBssInfo->key_length = KeyLen; - NdisMoveMemory(p1xBssInfo->key_material, - pSecConfig->WepKey[keyidx].Key, - KeyLen); - } - } - - /* Get NAS-ID per BSS */ - if (pSecConfig->NasIdLen > 0) { - p1xBssInfo->nasId_len = pSecConfig->NasIdLen; - NdisMoveMemory(p1xBssInfo->nasId, pSecConfig->NasId, - pSecConfig->NasIdLen); - } - - /* get EAPifname */ - if (pSecConfig->EAPifname_len > 0) { - pConf->EAPifname_len[apidx_locate] = - pSecConfig->EAPifname_len; - NdisMoveMemory(pConf->EAPifname[apidx_locate], - pSecConfig->EAPifname, - pSecConfig->EAPifname_len); - } - - /* get PreAuthifname */ - if (pSecConfig->PreAuthifname_len > 0) { - pConf->PreAuthifname_len[apidx_locate] = - pSecConfig->PreAuthifname_len; - NdisMoveMemory(pConf->PreAuthifname[apidx_locate], - pSecConfig->PreAuthifname, - pSecConfig->PreAuthifname_len); - } - -#ifdef RADIUS_ACCOUNTING_SUPPORT - /* pAcctBssInfo->radius_request_cui = (pSecConfig->radius_request_cui) ? 1 : 0; */ - pAcctBssInfo->radius_acct_authentic = - pSecConfig->radius_acct_authentic; - pAcctBssInfo->acct_interim_interval = - pSecConfig->acct_interim_interval; - pAcctBssInfo->acct_enable = pSecConfig->acct_enable; -#endif /* RADIUS_ACCOUNTING_SUPPORT */ -#ifdef RADIUS_MAC_ACL_SUPPORT - /* Radius MAC Auth Config */ - pConf->RadiusAclEnable[apidx_locate] = - pSecConfig->RadiusMacAuthCache.Policy; - /* Radius MAC Auth Cache Timeout in 1XDaemon */ - pConf->AclCacheTimeout[apidx_locate] = - pSecConfig->RadiusMacAuthCacheTimeout; -#endif /* RADIUS_MAC_ACL_SUPPORT */ - } - - wrq->u.data.length = sizeof(DOT1X_CMM_CONF); - - if (copy_to_user(wrq->u.data.pointer, pConf, wrq->u.data.length)) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: copy_to_user() fail\n", __func__)); - - os_free_mem(mpool); -} - -VOID Dot1xIoctlRadiusData(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, IF(ra%d)\n", __func__, pObj->ioctl_if)); - - if (pObj->ioctl_if > pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid MBSSID index(%d)!\n", __func__, - pObj->ioctl_if)); - return; - } - - pSecConfig = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.SecConfig; - - if (IS_AKM_1X(pSecConfig->AKMMap) || (pSecConfig->IEEE8021X == TRUE)) - WpaSend(pAd, (PUCHAR)wrq->u.data.pointer, wrq->u.data.length); -} - -/* - ========================================================================== - Description: - UI should not call this function, it only used by 802.1x daemon - Arguments: - pAd Pointer to our adapter - wrq Pointer to the ioctl argument - ========================================================================== -*/ -VOID Dot1xIoctlAddWPAKey(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - NDIS_AP_802_11_KEY *pKey; - ULONG KeyIdx; - MAC_TABLE_ENTRY *pEntry; - UCHAR apidx; - struct _SECURITY_CONFIG *pSecConfig = NULL; - struct wifi_dev *wdev = NULL; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - apidx = (UCHAR)pObj->ioctl_if; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s-IF(ra%d)\n", __func__, apidx)); - pKey = (PNDIS_AP_802_11_KEY)wrq->u.data.pointer; - pSecConfig = &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - if (IS_AKM_1X(pSecConfig->AKMMap)) { - UCHAR key_len = LEN_PMK; - - if ((pKey->KeyLength == 32) || (pKey->KeyLength == 64)) { - pEntry = MacTableLookup(pAd, pKey->addr); - - if (pEntry != NULL) { - INT k_offset = 0; -#ifdef DOT11R_FT_SUPPORT - /* The key shall be the second 256 bits of the MSK. */ - if (IS_FT_RSN_STA(pEntry) && - pKey->KeyLength == 64) - k_offset = 32; - -#endif /* DOT11R_FT_SUPPORT */ - if (IS_AKM_WPA3_192BIT(pSecConfig->AKMMap) && - (pKey->KeyLength == 64)) - key_len = LEN_PMK_SHA384; - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_SHA384( - pEntry->SecConfig.AKMMap) && - pKey->KeyLength == 64) - key_len = LEN_PMK_SHA384; -#endif /* OCE_FILS_SUPPORT */ - - NdisMoveMemory(pSecConfig->PMK, - pKey->KeyMaterial + k_offset, - key_len); - hex_dump("PMK", pSecConfig->PMK, key_len); - } - } - } else { /* Old WEP stuff */ - ASIC_SEC_INFO Info = { 0 }; - - if (pKey->KeyLength > 16) - return; - - KeyIdx = pKey->KeyIndex & 0x0fffffff; - - if (KeyIdx < 4) { - /* For Group key setting */ - if (pKey->KeyIndex & 0x80000000) { - UINT8 Wcid; - /* Default key for tx (shared key) */ - pSecConfig->GroupKeyId = (UCHAR)KeyIdx; - - /* set key material and key length */ - if (pKey->KeyLength > 16) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s-IF(ra%d) : Key length too long %d\n", - __func__, apidx, - pKey->KeyLength)); - pKey->KeyLength = 16; - } - - pSecConfig->WepKey[KeyIdx].KeyLen = - (UCHAR)pKey->KeyLength; - NdisMoveMemory(pSecConfig->WepKey[KeyIdx].Key, - &pKey->KeyMaterial, - pKey->KeyLength); - - /* Set Ciper type */ - if (pKey->KeyLength == 5) - SET_CIPHER_WEP40( - pSecConfig->GroupCipher); - else - SET_CIPHER_WEP104( - pSecConfig->GroupCipher); - - /* Get a specific WCID to record this MBSS key attribute */ - GET_GroupKey_WCID(wdev, Wcid); - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_GROUP_KEY; - Info.Direction = SEC_ASIC_KEY_TX; - Info.Wcid = Wcid; - Info.BssIndex = apidx; - Info.Cipher = pSecConfig->GroupCipher; - Info.KeyIdx = pSecConfig->GroupKeyId; - os_move_mem(&Info.PeerAddr[0], BROADCAST_ADDR, - MAC_ADDR_LEN); - os_move_mem(&Info.Key, - &pSecConfig->WepKey[Info.KeyIdx], - sizeof(SEC_KEY_INFO)); - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - } else { /* For Pairwise key setting */ - STA_TR_ENTRY *tr_entry = NULL; - - pEntry = MacTableLookup(pAd, pKey->addr); - - if (pEntry) { - pSecConfig = &pEntry->SecConfig; - pSecConfig->PairwiseKeyId = - (UCHAR)KeyIdx; - /* set key material and key length */ - pSecConfig->WepKey[KeyIdx].KeyLen = - (UCHAR)pKey->KeyLength; - NdisMoveMemory( - pSecConfig->WepKey[KeyIdx].Key, - &pKey->KeyMaterial, - pKey->KeyLength); - - /* Set Ciper type */ - if (pKey->KeyLength == 5) - SET_CIPHER_WEP40( - pSecConfig - ->PairwiseCipher); - else - SET_CIPHER_WEP104( - pSecConfig - ->PairwiseCipher); - - /* Set key material to Asic */ - os_zero_mem(&Info, - sizeof(ASIC_SEC_INFO)); - Info.Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pEntry->wcid; - Info.BssIndex = pEntry->func_tb_idx; - Info.Cipher = - pSecConfig->PairwiseCipher; - Info.KeyIdx = pSecConfig->PairwiseKeyId; - os_move_mem(&Info.PeerAddr[0], - pEntry->Addr, MAC_ADDR_LEN); - os_move_mem( - &Info.Key, - &pSecConfig->WepKey[Info.KeyIdx], - sizeof(SEC_KEY_INFO)); - /* HW_ADDREMOVE_KEYTABLE(pAd, &Info); */ - /* open 802.1x port control and privacy filter */ - tr_entry = - &pAd->MacTab - .tr_entry[pEntry->wcid]; - tr_entry->PortSecured = - WPA_802_1X_PORT_SECURED; - pEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - WifiSysUpdatePortSecur(pAd, pEntry, - &Info); - } - } - } - } -} - -/* - ========================================================================== - Description: - UI should not call this function, it only used by 802.1x daemon - Arguments: - pAd Pointer to our adapter - wrq Pointer to the ioctl argument - ========================================================================== -*/ -VOID Dot1xIoctlStaticWepCopy(IN PRTMP_ADAPTER pAd, - IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - MAC_TABLE_ENTRY *pEntry; - UCHAR MacAddr[MAC_ADDR_LEN]; - UCHAR apidx; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - - apidx = (UCHAR)pObj->ioctl_if; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTMPIoctlStaticWepCopy-IF(ra%d)\n", apidx)); - - if (wrq->u.data.length != sizeof(MacAddr)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTMPIoctlStaticWepCopy: the length isn't match (%d)\n", - wrq->u.data.length)); - return; - } else { - UINT32 len; - - len = copy_from_user(&MacAddr, wrq->u.data.pointer, - wrq->u.data.length); - pEntry = MacTableLookup(pAd, MacAddr); - - if (!pEntry) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTMPIoctlStaticWepCopy: the mac address isn't match\n")); - return; - } else { - struct _SECURITY_CONFIG *pSecConfigEnrty = NULL; - struct _SECURITY_CONFIG *pSecConfigProfile = NULL; - STA_TR_ENTRY *tr_entry = NULL; - ASIC_SEC_INFO Info = { 0 }; - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS(pEntry->SecConfig.AKMMap)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("RTMPIoctlStaticWepCopy: skip for FILS\n")); - return; - } -#endif /* OCE_FILS_SUPPORT */ - - pSecConfigProfile = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - pSecConfigEnrty = &pEntry->SecConfig; - pSecConfigEnrty->PairwiseKeyId = - pSecConfigProfile->PairwiseKeyId; - pSecConfigEnrty->PairwiseCipher = - pSecConfigProfile->PairwiseCipher; - os_move_mem(&pSecConfigEnrty->WepKey, - &pSecConfigProfile->WepKey, - sizeof(SEC_KEY_INFO) * SEC_KEY_NUM); - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pEntry->wcid; - Info.BssIndex = pEntry->func_tb_idx; - Info.Cipher = pEntry->SecConfig.PairwiseCipher; - Info.KeyIdx = pEntry->SecConfig.PairwiseKeyId; - os_move_mem(&Info.Key, - &pEntry->SecConfig.WepKey - [pEntry->SecConfig.PairwiseKeyId], - sizeof(SEC_KEY_INFO)); - os_move_mem(&Info.PeerAddr[0], pEntry->Addr, - MAC_ADDR_LEN); - /* HW_ADDREMOVE_KEYTABLE(pAd, &Info); */ - /* open 802.1x port control and privacy filter */ - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; - pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; - WifiSysUpdatePortSecur(pAd, pEntry, &Info); - } - } - - return; -} -#endif /* CONFIG_AP_SUPPORT */ -#endif /* DOT1X_SUPPORT */ - -#ifdef APCLI_SUPPORT -VOID ReadApcliSecParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer) -{ - RTMP_STRING *macptr; - INT i, idx; -#ifdef DBDC_MODE - INT apcli_idx; - RTMP_STRING tok_str[16]; -#endif - struct _SECURITY_CONFIG *pSecConfig = NULL; - - /*ApCliAuthMode*/ - if (RTMPGetKeyParameter("ApCliAuthMode", tmpbuf, 255, pBuffer, TRUE)) { - RTMP_STRING *orig_tmpbuf; - - orig_tmpbuf = tmpbuf; - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_APCLI_NUM); - macptr = rstrtok(NULL, ";"), i++) { - if ((i == 0) && (macptr != orig_tmpbuf)) - i = 1; - pSecConfig = &pAd->ApCfg.ApCliTab[i].wdev.SecConfig; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) ==> ", i)); - SetWdevAuthMode(pSecConfig, macptr); - } - } - - /*ApCliEncrypType*/ - if (RTMPGetKeyParameter("ApCliEncrypType", tmpbuf, 255, pBuffer, - TRUE)) { - RTMP_STRING *orig_tmpbuf; - - orig_tmpbuf = tmpbuf; - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_APCLI_NUM); - macptr = rstrtok(NULL, ";"), i++) { - if ((i == 0) && (macptr != orig_tmpbuf)) - i = 1; - pSecConfig = &pAd->ApCfg.ApCliTab[i].wdev.SecConfig; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d) ==> ", i)); - SetWdevEncrypMode(pSecConfig, macptr); - } - } - -#ifdef DBDC_MODE - - for (apcli_idx = 0; apcli_idx < MAX_APCLI_NUM; apcli_idx++) { - pSecConfig = &pAd->ApCfg.ApCliTab[apcli_idx].wdev.SecConfig; - - if (apcli_idx == 0) - snprintf(tok_str, sizeof(tok_str), "ApCliWPAPSK"); - else - snprintf(tok_str, sizeof(tok_str), "ApCliWPAPSK%d", - apcli_idx); - - if (RTMPGetKeyParameter(tok_str, tmpbuf, 65, pBuffer, FALSE)) { - if (strlen(tmpbuf) < 65) { - os_move_mem(pSecConfig->PSK, tmpbuf, - strlen(tmpbuf)); - pSecConfig->PSK[strlen(tmpbuf)] = '\0'; - } else - pSecConfig->PSK[0] = '\0'; - } - } - -#else - - /*ApCliWPAPSK*/ - if (RTMPGetKeyParameter("ApCliWPAPSK", tmpbuf, 255, pBuffer, FALSE)) { - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_APCLI_NUM); - macptr = rstrtok(NULL, ";"), i++) { - pSecConfig = &pAd->ApCfg.ApCliTab[i].wdev.SecConfig; - - if (strlen(macptr) < 65) { - os_move_mem(pSecConfig->PSK, macptr, - strlen(macptr)); - pSecConfig->PSK[strlen(macptr)] = '\0'; - } else - pSecConfig->PSK[0] = '\0'; - } - } - -#endif - - /*ApCliDefaultKeyID*/ - if (RTMPGetKeyParameter("ApCliDefaultKeyID", tmpbuf, 255, pBuffer, - TRUE)) { - ULONG KeyIdx = 0; - RTMP_STRING *orig_tmpbuf; - - orig_tmpbuf = tmpbuf; - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_APCLI_NUM); - macptr = rstrtok(NULL, ";"), i++) { - if ((i == 0) && (macptr != orig_tmpbuf)) - i = 1; - pSecConfig = &pAd->ApCfg.ApCliTab[i].wdev.SecConfig; - KeyIdx = os_str_tol(macptr, 0, 10); - - if ((KeyIdx >= 1) && (KeyIdx <= 4)) - pSecConfig->PairwiseKeyId = (UCHAR)(KeyIdx - 1); - else - pSecConfig->PairwiseKeyId = 0; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(apcli%d)) ==> DefaultKeyId=%d\n", i, - pSecConfig->PairwiseKeyId)); - } - } - - /*ApCliKeyXType, ApCliKeyXStr*/ - for (idx = 0; idx < 4; idx++) { - RTMP_STRING tok_str[16]; - ULONG KeyType[MAX_APCLI_NUM]; - - snprintf(tok_str, sizeof(tok_str), "ApCliKey%dType", idx + 1); - - /*ApCliKey1Type*/ - if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, pBuffer, TRUE)) { - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_APCLI_NUM); - macptr = rstrtok(NULL, ";"), i++) - KeyType[i] = os_str_tol(macptr, 0, 10); - -#ifdef DBDC_MODE - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (i = 0; i < MAX_APCLI_NUM; i++) { - if (i == 0) - snprintf(tok_str, - sizeof(tok_str), - "ApCliKey%dStr", - idx + 1); - else - snprintf(tok_str, - sizeof(tok_str), - "ApCliKey%dStr%d", - idx + 1, i); - - if (RTMPGetKeyParameter(tok_str, tmpbuf, - 128, pBuffer, - FALSE)) { - pSecConfig = - &pAd->ApCfg.ApCliTab[i] - .wdev.SecConfig; - ParseWebKey(pSecConfig, tmpbuf, - idx, 0); - } - } - } -#else - snprintf(tok_str, sizeof(tok_str), "ApCliKey%dStr", - idx + 1); - - /*ApCliKey1Str*/ - if (RTMPGetKeyParameter(tok_str, tmpbuf, 512, pBuffer, - FALSE)) { - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_APCLI_NUM); - macptr = rstrtok(NULL, ";"), i++) { - pSecConfig = &pAd->ApCfg.ApCliTab[i] - .wdev.SecConfig; - ParseWebKey(pSecConfig, macptr, idx, 0); - } - } - -#endif - } - } -} -#endif /* APCLI_SUPPORT */ - -#ifdef WDS_SUPPORT -VOID ReadWDSSecParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer) -{ - RTMP_STRING *macptr; - INT i, idx; - BOOLEAN bUsePrevFormat = FALSE; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - /* WDS direct insert Key to Asic, not need do 4-way */ - /* WdsEncrypType */ - if (RTMPGetKeyParameter("WdsEncrypType", tmpbuf, 255, pBuffer, TRUE)) { - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_WDS_ENTRY); - macptr = rstrtok(NULL, ";"), i++) { - pSecConfig = &pAd->WdsTab.WdsEntry[i].wdev.SecConfig; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(wds%d) ==> ", i)); - SetWdevEncrypMode(pSecConfig, macptr); - } - } - - /*WdsKey*/ - if (RTMPGetKeyParameter("WdsKey", tmpbuf, 255, pBuffer, FALSE)) { - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_WDS_ENTRY); - macptr = rstrtok(NULL, ";"), i++) { - pSecConfig = &pAd->WdsTab.WdsEntry[i].wdev.SecConfig; - - if ((strlen(macptr) > 0) && (strlen(macptr) < 65)) { - os_move_mem(pSecConfig->PSK, macptr, - strlen(macptr)); - pSecConfig->PSK[strlen(macptr)] = '\0'; - bUsePrevFormat = TRUE; - } else - pSecConfig->PSK[0] = '\0'; - } - } - - /*WdsDefaultKeyID*/ - if (RTMPGetKeyParameter("WdsDefaultKeyID", tmpbuf, 255, pBuffer, - TRUE)) { - ULONG KeyIdx = 0; - - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < MAX_APCLI_NUM); - macptr = rstrtok(NULL, ";"), i++) { - pSecConfig = &pAd->WdsTab.WdsEntry[i].wdev.SecConfig; - KeyIdx = os_str_tol(macptr, 0, 10); - - if ((KeyIdx >= 1) && (KeyIdx <= 4)) - pSecConfig->PairwiseKeyId = (UCHAR)(KeyIdx - 1); - else - pSecConfig->PairwiseKeyId = 0; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("I/F(wds%d)) ==> DefaultKeyId=%d\n", i, - pSecConfig->PairwiseKeyId)); - } - } - - /*WdsXKey */ - if (bUsePrevFormat == FALSE) { - for (idx = 0; idx < MAX_WDS_ENTRY; idx++) { - RTMP_STRING tok_str[16]; - - snprintf(tok_str, sizeof(tok_str), "Wds%dKey", idx); - pSecConfig = &pAd->WdsTab.WdsEntry[idx].wdev.SecConfig; - - if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, pBuffer, - FALSE)) { - if (IS_CIPHER_WEP(pSecConfig->PairwiseCipher)) - ParseWebKey(pSecConfig, tmpbuf, - pSecConfig->PairwiseKeyId, - 0); - else if (IS_CIPHER_TKIP( - pSecConfig->PairwiseCipher) || - IS_CIPHER_CCMP128( - pSecConfig->PairwiseCipher) || - IS_CIPHER_CCMP256( - pSecConfig->PairwiseCipher) || - IS_CIPHER_GCMP128( - pSecConfig->PairwiseCipher) || - IS_CIPHER_GCMP256( - pSecConfig->PairwiseCipher)) { - if (strlen(tmpbuf) < 65) { - os_move_mem(pSecConfig->PSK, - tmpbuf, - strlen(tmpbuf)); - pSecConfig->PSK[strlen(tmpbuf)] = - '\0'; - } else - pSecConfig->PSK[0] = '\0'; - } - } - } - } -} -#endif /* WDS_SUPPORT */ - -#ifdef DOT11_SAE_SUPPORT -#ifdef DOT11_SAE_PWD_ID_SUPPORT -VOID sae_pwd_id_deinit(IN PRTMP_ADAPTER pAd) -{ -#ifdef CONFIG_AP_SUPPORT - INT i = 0; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - struct _SECURITY_CONFIG *sec_cfg = - &pAd->ApCfg.MBSSID[i].wdev.SecConfig; - struct pwd_id_list *pwd_id_ins = &sec_cfg->pwd_id_list_head; - struct pwd_id_list *pwd_id_tmp; - - if (sec_cfg->pwd_id_cnt == 0) - continue; - while (DlListEmpty(&pwd_id_ins->list)) { - pwd_id_tmp = DlListFirst(&pwd_id_ins->list, - struct pwd_id_list, list); - DlListDel(&pwd_id_tmp->list); - os_free_mem(pwd_id_tmp); - } - } -#endif /* CONFIG_AP_SUPPORT */ -} - -VOID insert_pwd_id(struct _SECURITY_CONFIG *sec_cfg, - struct pwd_id_list *pwd_id_list_head, RTMP_STRING *arg) -{ - RTMP_STRING *pwdid; - RTMP_STRING *pwd; - ULONG len; - struct pwd_id_list *pwd_id_ins = NULL; - - if (arg == NULL) - return; - - pwd = rstrtok(arg, ":"); - pwdid = rstrtok(NULL, ":"); - - if (pwdid == NULL) { - os_zero_mem(sec_cfg->PSK, sizeof(sec_cfg->PSK)); - os_move_mem(sec_cfg->PSK, pwd, strlen(pwd)); - sec_cfg->sae_cap.pwd_id_only = FALSE; - return; - } - - os_alloc_mem(NULL, (UCHAR **)&pwd_id_ins, sizeof(struct pwd_id_list)); - os_zero_mem(pwd_id_ins, sizeof(struct pwd_id_list)); - - len = strlen(pwd); - os_move_mem(pwd_id_ins->pwd, pwd, len); - pwd_id_ins->pwd[len] = '\0'; - - len = strlen(pwdid); - os_move_mem(pwd_id_ins->pwd_id, pwdid, len); - pwd_id_ins->pwd_id[len] = '\0'; - - DlListAddTail(&pwd_id_list_head->list, &pwd_id_ins->list); - sec_cfg->pwd_id_cnt++; -} -#endif - -static VOID read_sae_parma_from_file(IN PRTMP_ADAPTER pAd, - IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer) -{ - INT i = 0; - struct _SECURITY_CONFIG *sec_cfg = NULL; - RTMP_STRING *macptr; - - if (RTMPGetKeyParameter("PweMethod", tmpbuf, MAX_PARAMETER_LEN, pBuffer, - TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), i++) { - UCHAR pwe_method = 0; - - sec_cfg = - &pAd->ApCfg - .MBSSID[PF_TO_BSS_IDX(pAd, i)] - .wdev.SecConfig; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> ", INF_MBSSID_DEV_NAME, - i)); - if (macptr) - pwe_method = os_str_tol(macptr, 0, 10); - - if (pwe_method > MAX_PWE_METHOD) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("pwe method is should not be %d", - pwe_method)); - } - sec_cfg->sae_cap.gen_pwe_method = pwe_method; - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - -#ifdef DOT11_SAE_PWD_ID_SUPPORT - if (RTMPGetKeyParameter("PWDIDR", tmpbuf, MAX_PARAMETER_LEN, pBuffer, - TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (i = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && i < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), i++) { - UCHAR pwd_id_only = 0; - sec_cfg = &pAd->ApCfg.MBSSID[i].wdev.SecConfig; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> ", INF_MBSSID_DEV_NAME, - i)); - if (macptr) - pwd_id_only = os_str_tol(macptr, 0, 10); - sec_cfg->sae_cap.pwd_id_only = - (pwd_id_only) ? TRUE : FALSE; - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - RTMP_STRING *macptr2; - RTMP_STRING tok_str[16]; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - snprintf(tok_str, sizeof(tok_str), "PWDID%d", i + 1); - - if (RTMPGetKeyParameter(tok_str, tmpbuf, - MAX_PARAMETER_LEN, pBuffer, - FALSE)) { - sec_cfg = &pAd->ApCfg.MBSSID[i].wdev.SecConfig; - DlListInit(&sec_cfg->pwd_id_list_head.list); - macptr = tmpbuf; - do { - macptr = rstrtok(macptr, ";"); - macptr2 = rstrtok(NULL, "\0"); - - insert_pwd_id( - sec_cfg, - &sec_cfg->pwd_id_list_head, - macptr); - macptr = macptr2; - } while (macptr); - } - } - } -#endif /* CONFIG_AP_SUPPORT */ -#endif -} -#endif - -VOID ReadSecurityParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer) -{ - RTMP_STRING *macptr; -#ifdef CONFIG_AP_SUPPORT - INT apidx; -#endif /* CONFIG_AP_SUPPORT */ - INT idx; - struct wifi_dev *wdev = NULL; - struct _SECURITY_CONFIG *pSecConfig = NULL; - - /*AuthMode*/ - if (RTMPGetKeyParameter("AuthMode", tmpbuf, MAX_PARAMETER_LEN, pBuffer, - TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pSecConfig = &wdev->SecConfig; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> ", INF_MBSSID_DEV_NAME, - apidx)); - SetWdevAuthMode(pSecConfig, macptr); - wdev->PortSecured = WPA_802_1X_PORT_NOT_SECURED; - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /*EncrypType*/ - if (RTMPGetKeyParameter("EncrypType", tmpbuf, MAX_PARAMETER_LEN, - pBuffer, TRUE)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), apidx++) { - pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ==> ", INF_MBSSID_DEV_NAME, - apidx)); - SetWdevEncrypMode(pSecConfig, macptr); - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* Web DefaultKeyID */ - if (RTMPGetKeyParameter("DefaultKeyID", tmpbuf, MAX_PARAMETER_LEN, - pBuffer, TRUE)) { - ULONG KeyIdx = 0; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), apidx++) { - pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - KeyIdx = os_str_tol(macptr, 0, 10); - - if ((KeyIdx >= 1) && (KeyIdx <= 4)) - pSecConfig->PairwiseKeyId = - (UCHAR)(KeyIdx - 1); - else - pSecConfig->PairwiseKeyId = 0; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d)) ==> DefaultKeyId=%d\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->PairwiseKeyId)); - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - /* KeyType, KeyStr for WEP */ - for (idx = 0; idx < 4; idx++) { - INT i = 0; - RTMP_STRING tok_str[16]; - ULONG KeyType[HW_BEACON_MAX_NUM]; - - snprintf(tok_str, sizeof(tok_str), "Key%dType", idx + 1); - - if (RTMPGetKeyParameter(tok_str, tmpbuf, MAX_PARAMETER_LEN, - pBuffer, TRUE)) { - for (i = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), i++) - if (i < MAX_MBSSID_NUM(pAd)) - KeyType[i] = os_str_tol(macptr, 0, 10); - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - BOOLEAN bKeyxStryIsUsed = FALSE; - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - snprintf(tok_str, sizeof(tok_str), - "Key%dStr%d", idx + 1, i + 1); - - if (RTMPGetKeyParameter( - tok_str, tmpbuf, - MAX_PARAMETER_LEN, pBuffer, - FALSE)) { - pSecConfig = - &pAd->ApCfg.MBSSID[i] - .wdev.SecConfig; - ParseWebKey(pSecConfig, tmpbuf, - idx, 0); - - if (bKeyxStryIsUsed == FALSE) - bKeyxStryIsUsed = TRUE; - } - } - - if (bKeyxStryIsUsed == FALSE) { - snprintf(tok_str, sizeof(tok_str), - "Key%dStr", idx + 1); - - if (RTMPGetKeyParameter( - tok_str, tmpbuf, - MAX_PARAMETER_LEN, pBuffer, - FALSE)) { - if (pAd->ApCfg.BssidNum == 1) { - pSecConfig = - &pAd->ApCfg - .MBSSID[BSS0] - .wdev - .SecConfig; - ParseWebKey(pSecConfig, - tmpbuf, idx, - 0); - } else { - /* Anyway, we still do the legacy dissection of the whole KeyxStr string.*/ - for (i = 0, - macptr = rstrtok( - tmpbuf, - ";"); - macptr; - macptr = rstrtok( - NULL, ";"), - i++) { - pSecConfig = - &pAd->ApCfg - .MBSSID[i] - .wdev - .SecConfig; - ParseWebKey( - pSecConfig, - macptr, - idx, 0); - } - } - } - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - } - - ReadWPAParameterFromFile(pAd, tmpbuf, pBuffer); -#ifdef DOT11_SAE_SUPPORT - read_sae_parma_from_file(pAd, tmpbuf, pBuffer); -#endif -#ifdef DOT1X_SUPPORT - ReadRadiusParameterFromFile(pAd, tmpbuf, pBuffer); -#endif /* DOT1X_SUPPORT */ -#ifdef APCLI_SUPPORT - ReadApcliSecParameterFromFile(pAd, tmpbuf, pBuffer); -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - ReadWDSSecParameterFromFile(pAd, tmpbuf, pBuffer); -#endif /* WDS_SUPPORT */ -#ifdef DOT11W_PMF_SUPPORT - rtmp_read_pmf_parameters_from_file(pAd, tmpbuf, pBuffer); -#endif /* DOT11W_PMF_SUPPORT */ -} - -VOID fill_wtbl_key_info_struc(IN struct _ASIC_SEC_INFO *pInfo, - OUT CMD_WTBL_SECURITY_KEY_T *rWtblSecurityKey) -{ - if (IS_REMOVEKEY_OPERATION(pInfo)) { - rWtblSecurityKey->ucAddRemove = 1; - rWtblSecurityKey->ucKeyLen = - sizeof(rWtblSecurityKey->aucKeyMaterial); - } else { /* Add Key */ - SEC_KEY_INFO *pSecKey = &pInfo->Key; - - rWtblSecurityKey->ucAddRemove = 0; - rWtblSecurityKey->ucKeyId = pInfo->KeyIdx; - - if (pSecKey->KeyLen > sizeof(rWtblSecurityKey->aucKeyMaterial)) - rWtblSecurityKey->ucKeyLen = - sizeof(rWtblSecurityKey->aucKeyMaterial); - else - rWtblSecurityKey->ucKeyLen = pSecKey->KeyLen; - - os_move_mem(rWtblSecurityKey->aucKeyMaterial, pSecKey->Key, - rWtblSecurityKey->ucKeyLen); - - if (IS_CIPHER_WEP(pInfo->Cipher)) { - if (rWtblSecurityKey->ucKeyLen == 5) - rWtblSecurityKey->ucAlgorithmId = - CIPHER_SUIT_WEP_40; - else if (rWtblSecurityKey->ucKeyLen == 13) - rWtblSecurityKey->ucAlgorithmId = - CIPHER_SUIT_WEP_104; - else if (rWtblSecurityKey->ucKeyLen == 16) - rWtblSecurityKey->ucAlgorithmId = - CIPHER_SUIT_WEP_128; - } else if (IS_CIPHER_TKIP(pInfo->Cipher)) { - rWtblSecurityKey->ucAlgorithmId = - CIPHER_SUIT_TKIP_W_MIC; - os_move_mem(&rWtblSecurityKey->aucKeyMaterial[16], - pSecKey->RxMic, LEN_TKIP_MIC); - os_move_mem(&rWtblSecurityKey->aucKeyMaterial[24], - pSecKey->TxMic, LEN_TKIP_MIC); - } else if (IS_CIPHER_CCMP128(pInfo->Cipher)) - rWtblSecurityKey->ucAlgorithmId = - CIPHER_SUIT_CCMP_W_MIC; - else if (IS_CIPHER_CCMP256(pInfo->Cipher)) - rWtblSecurityKey->ucAlgorithmId = CIPHER_SUIT_CCMP_256; - else if (IS_CIPHER_GCMP128(pInfo->Cipher)) - rWtblSecurityKey->ucAlgorithmId = CIPHER_SUIT_GCMP_128; - else if (IS_CIPHER_GCMP256(pInfo->Cipher)) - rWtblSecurityKey->ucAlgorithmId = CIPHER_SUIT_GCMP_256; - - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support Cipher[0x%x]\n", - __func__, __LINE__, pInfo->Cipher)); - return; - } - - if ((pInfo->Direction == SEC_ASIC_KEY_TX) || - (pInfo->Direction == SEC_ASIC_KEY_BOTH)) { - rWtblSecurityKey->ucRkv = 0; - rWtblSecurityKey->ucIkv = 0; - } - - if ((pInfo->Direction == SEC_ASIC_KEY_RX) || - (pInfo->Direction == SEC_ASIC_KEY_BOTH)) { - rWtblSecurityKey->ucRkv = 1; - - if (IS_CIPHER_BIP_CMAC128(pInfo->Cipher) || - ((IS_CIPHER_CCMP128(pInfo->Cipher)) && - (rWtblSecurityKey->ucKeyLen == 32))) - rWtblSecurityKey->ucIkv = 1; - } - } -} - -VOID process_pmkid(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - MAC_TABLE_ENTRY *entry, INT CacheIdx) -{ - if (CacheIdx != INVALID_PMKID_IDX) { - /* Enqueue a EAPOL-start message with the pEntry for WPAPSK State Machine */ - if ((entry->EnqueueEapolStartTimerRunning == EAPOL_START_DISABLE -#ifdef HOSTAPD_SUPPORT - && wdev->Hostapd == Hostapd_Disable -#endif /*HOSTAPD_SUPPORT*/ - ) -#ifdef WSC_AP_SUPPORT - && !entry->bWscCapable -#endif /* WSC_AP_SUPPORT */ - ) { - /* Enqueue a EAPOL-start message with the pEntry */ - entry->EnqueueEapolStartTimerRunning = EAPOL_START_PSK; - entry->SecConfig.Handshake.WpaState = AS_INITPSK; - os_move_mem(&entry->SecConfig.Handshake.AAddr, - wdev->bssid, MAC_ADDR_LEN); - os_move_mem(&entry->SecConfig.Handshake.SAddr, - entry->Addr, MAC_ADDR_LEN); - RTMPSetTimer(&entry->SecConfig.StartFor4WayTimer, - ENQUEUE_EAPOL_START_TIMER); - } - - store_pmkid_cache_in_sec_config(pAd, entry, CacheIdx); - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ASSOC - 2.PMKID matched and start key cache algorithm\n")); - } else { - store_pmkid_cache_in_sec_config(pAd, entry, INVALID_PMKID_IDX); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ASSOC - 2.PMKID not found\n")); - - /* Enqueue a EAPOL-start message to trigger EAP SM */ - if (entry->EnqueueEapolStartTimerRunning == EAPOL_START_DISABLE -#ifdef HOSTAPD_SUPPORT - && wdev->Hostapd == Hostapd_Disable -#endif /*HOSTAPD_SUPPORT*/ - ) { - entry->EnqueueEapolStartTimerRunning = EAPOL_START_1X; - RTMPSetTimer(&entry->SecConfig.StartFor4WayTimer, - ENQUEUE_EAPOL_START_TIMER); - } - } -} - -VOID store_pmkid_cache_in_sec_config(IN RTMP_ADAPTER *pAd, - IN MAC_TABLE_ENTRY *pEntry, - IN INT32 cache_idx) -{ - if (!pEntry) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): pEntry is null\n", __func__)); - return; - } - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_LOUD, - ("EntryType = %d\n", pEntry->EntryType)); - - if (cache_idx == INVALID_PMKID_IDX) { - pEntry->SecConfig.pmkid = NULL; - pEntry->SecConfig.pmk_cache = NULL; - } else { - if (IS_ENTRY_CLIENT(pEntry)) { -#ifdef CONFIG_AP_SUPPORT - pEntry->SecConfig.pmkid = - pAd->ApCfg.PMKIDCache.BSSIDInfo[cache_idx].PMKID; - pEntry->SecConfig.pmk_cache = - pAd->ApCfg.PMKIDCache.BSSIDInfo[cache_idx].PMK; -#endif - } - } -} - -UCHAR is_pmkid_cache_in_sec_config(IN struct _SECURITY_CONFIG *pSecConfig) -{ - if (pSecConfig && pSecConfig->pmkid && pSecConfig->pmk_cache) - return TRUE; - else - return FALSE; -} - -INT build_rsnxe_ie(IN struct _SECURITY_CONFIG *sec_cfg, IN UCHAR *buf) -{ - INT extend_length = 0; -#ifdef DOT11_SAE_SUPPORT - UCHAR ie = IE_RSNXE; - UCHAR ie_len = 1; - UCHAR cap = - 1 - << IE_RSNXE_CAPAB_SAE_H2E; /* only sae use now, so use uchar */ - - if (!IS_AKM_SAE(sec_cfg->AKMMap)) - return 0; - - if (sec_cfg->sae_cap.gen_pwe_method == PWE_LOOPING_ONLY) - return 0; - - NdisMoveMemory(buf + extend_length, &ie, sizeof(ie)); - extend_length += sizeof(ie); - NdisMoveMemory(buf + extend_length, &ie_len, sizeof(ie_len)); - extend_length += sizeof(ie_len); - NdisMoveMemory(buf + extend_length, &cap, sizeof(cap)); - extend_length += sizeof(cap); -#endif - - return extend_length; -} - -UINT parse_rsnxe_ie(IN struct _SECURITY_CONFIG *sec_cfg, IN UCHAR *rsnxe_ie, - IN UCHAR rsnxe_ie_len, IN UCHAR need_copy) -{ -#ifdef DOT11_SAE_SUPPORT - if (IS_AKM_SAE(sec_cfg->AKMMap) && sec_cfg->is_h2e_connect) { - if (rsnxe_ie[1] == 0 || - !(rsnxe_ie[2] & (1 << IE_RSNXE_CAPAB_SAE_H2E))) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: IE_RSNXE_CAPAB_SAE_H2E should not be 0\n", - __func__)); - return MLME_UNSPECIFY_FAIL; - } - } - - if (need_copy) { - NdisMoveMemory(sec_cfg->rsnxe_content, rsnxe_ie, rsnxe_ie_len); - sec_cfg->rsnxe_len = rsnxe_ie_len; - } else if (sec_cfg->rsnxe_len == 0) - return MLME_UNSPECIFY_FAIL; - else if (NdisCmpMemory(sec_cfg->rsnxe_content, rsnxe_ie, - rsnxe_ie_len) != 0) - return MLME_UNSPECIFY_FAIL; -#endif - - return MLME_SUCCESS; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_tkip.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_tkip.c deleted file mode 100644 index 135f66107e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_tkip.c +++ /dev/null @@ -1,812 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_tkip.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Paul Wu 02-25-02 Initial -*/ - -#include "rt_config.h" - -#define MCAST_WCID_TO_REMOVE 0 /* Pat: TODO */ - -/* Rotation functions on 32 bit values */ -#define ROL32(A, n) (((A) << (n)) | (((A) >> (32 - (n))) & ((1UL << (n)) - 1))) -#define ROR32(A, n) ROL32((A), 32 - (n)) - -UINT Tkip_Sbox_Lower[256] = { - 0xA5, 0x84, 0x99, 0x8D, 0x0D, 0xBD, 0xB1, 0x54, 0x50, 0x03, 0xA9, 0x7D, - 0x19, 0x62, 0xE6, 0x9A, 0x45, 0x9D, 0x40, 0x87, 0x15, 0xEB, 0xC9, 0x0B, - 0xEC, 0x67, 0xFD, 0xEA, 0xBF, 0xF7, 0x96, 0x5B, 0xC2, 0x1C, 0xAE, 0x6A, - 0x5A, 0x41, 0x02, 0x4F, 0x5C, 0xF4, 0x34, 0x08, 0x93, 0x73, 0x53, 0x3F, - 0x0C, 0x52, 0x65, 0x5E, 0x28, 0xA1, 0x0F, 0xB5, 0x09, 0x36, 0x9B, 0x3D, - 0x26, 0x69, 0xCD, 0x9F, 0x1B, 0x9E, 0x74, 0x2E, 0x2D, 0xB2, 0xEE, 0xFB, - 0xF6, 0x4D, 0x61, 0xCE, 0x7B, 0x3E, 0x71, 0x97, 0xF5, 0x68, 0x00, 0x2C, - 0x60, 0x1F, 0xC8, 0xED, 0xBE, 0x46, 0xD9, 0x4B, 0xDE, 0xD4, 0xE8, 0x4A, - 0x6B, 0x2A, 0xE5, 0x16, 0xC5, 0xD7, 0x55, 0x94, 0xCF, 0x10, 0x06, 0x81, - 0xF0, 0x44, 0xBA, 0xE3, 0xF3, 0xFE, 0xC0, 0x8A, 0xAD, 0xBC, 0x48, 0x04, - 0xDF, 0xC1, 0x75, 0x63, 0x30, 0x1A, 0x0E, 0x6D, 0x4C, 0x14, 0x35, 0x2F, - 0xE1, 0xA2, 0xCC, 0x39, 0x57, 0xF2, 0x82, 0x47, 0xAC, 0xE7, 0x2B, 0x95, - 0xA0, 0x98, 0xD1, 0x7F, 0x66, 0x7E, 0xAB, 0x83, 0xCA, 0x29, 0xD3, 0x3C, - 0x79, 0xE2, 0x1D, 0x76, 0x3B, 0x56, 0x4E, 0x1E, 0xDB, 0x0A, 0x6C, 0xE4, - 0x5D, 0x6E, 0xEF, 0xA6, 0xA8, 0xA4, 0x37, 0x8B, 0x32, 0x43, 0x59, 0xB7, - 0x8C, 0x64, 0xD2, 0xE0, 0xB4, 0xFA, 0x07, 0x25, 0xAF, 0x8E, 0xE9, 0x18, - 0xD5, 0x88, 0x6F, 0x72, 0x24, 0xF1, 0xC7, 0x51, 0x23, 0x7C, 0x9C, 0x21, - 0xDD, 0xDC, 0x86, 0x85, 0x90, 0x42, 0xC4, 0xAA, 0xD8, 0x05, 0x01, 0x12, - 0xA3, 0x5F, 0xF9, 0xD0, 0x91, 0x58, 0x27, 0xB9, 0x38, 0x13, 0xB3, 0x33, - 0xBB, 0x70, 0x89, 0xA7, 0xB6, 0x22, 0x92, 0x20, 0x49, 0xFF, 0x78, 0x7A, - 0x8F, 0xF8, 0x80, 0x17, 0xDA, 0x31, 0xC6, 0xB8, 0xC3, 0xB0, 0x77, 0x11, - 0xCB, 0xFC, 0xD6, 0x3A -}; - -UINT Tkip_Sbox_Upper[256] = { - 0xC6, 0xF8, 0xEE, 0xF6, 0xFF, 0xD6, 0xDE, 0x91, 0x60, 0x02, 0xCE, 0x56, - 0xE7, 0xB5, 0x4D, 0xEC, 0x8F, 0x1F, 0x89, 0xFA, 0xEF, 0xB2, 0x8E, 0xFB, - 0x41, 0xB3, 0x5F, 0x45, 0x23, 0x53, 0xE4, 0x9B, 0x75, 0xE1, 0x3D, 0x4C, - 0x6C, 0x7E, 0xF5, 0x83, 0x68, 0x51, 0xD1, 0xF9, 0xE2, 0xAB, 0x62, 0x2A, - 0x08, 0x95, 0x46, 0x9D, 0x30, 0x37, 0x0A, 0x2F, 0x0E, 0x24, 0x1B, 0xDF, - 0xCD, 0x4E, 0x7F, 0xEA, 0x12, 0x1D, 0x58, 0x34, 0x36, 0xDC, 0xB4, 0x5B, - 0xA4, 0x76, 0xB7, 0x7D, 0x52, 0xDD, 0x5E, 0x13, 0xA6, 0xB9, 0x00, 0xC1, - 0x40, 0xE3, 0x79, 0xB6, 0xD4, 0x8D, 0x67, 0x72, 0x94, 0x98, 0xB0, 0x85, - 0xBB, 0xC5, 0x4F, 0xED, 0x86, 0x9A, 0x66, 0x11, 0x8A, 0xE9, 0x04, 0xFE, - 0xA0, 0x78, 0x25, 0x4B, 0xA2, 0x5D, 0x80, 0x05, 0x3F, 0x21, 0x70, 0xF1, - 0x63, 0x77, 0xAF, 0x42, 0x20, 0xE5, 0xFD, 0xBF, 0x81, 0x18, 0x26, 0xC3, - 0xBE, 0x35, 0x88, 0x2E, 0x93, 0x55, 0xFC, 0x7A, 0xC8, 0xBA, 0x32, 0xE6, - 0xC0, 0x19, 0x9E, 0xA3, 0x44, 0x54, 0x3B, 0x0B, 0x8C, 0xC7, 0x6B, 0x28, - 0xA7, 0xBC, 0x16, 0xAD, 0xDB, 0x64, 0x74, 0x14, 0x92, 0x0C, 0x48, 0xB8, - 0x9F, 0xBD, 0x43, 0xC4, 0x39, 0x31, 0xD3, 0xF2, 0xD5, 0x8B, 0x6E, 0xDA, - 0x01, 0xB1, 0x9C, 0x49, 0xD8, 0xAC, 0xF3, 0xCF, 0xCA, 0xF4, 0x47, 0x10, - 0x6F, 0xF0, 0x4A, 0x5C, 0x38, 0x57, 0x73, 0x97, 0xCB, 0xA1, 0xE8, 0x3E, - 0x96, 0x61, 0x0D, 0x0F, 0xE0, 0x7C, 0x71, 0xCC, 0x90, 0x06, 0xF7, 0x1C, - 0xC2, 0x6A, 0xAE, 0x69, 0x17, 0x99, 0x3A, 0x27, 0xD9, 0xEB, 0x2B, 0x22, - 0xD2, 0xA9, 0x07, 0x33, 0x2D, 0x3C, 0x15, 0xC9, 0x87, 0xAA, 0x50, 0xA5, - 0x03, 0x59, 0x09, 0x1A, 0x65, 0xD7, 0x84, 0xD0, 0x82, 0x29, 0x5A, 0x1E, - 0x7B, 0xA8, 0x6D, 0x2C -}; - -/* Expanded IV for TKIP function.*/ -struct GNU_PACKED _IV_CONTROL_ { - union GNU_PACKED { - struct GNU_PACKED { - UCHAR rc0; - UCHAR rc1; - UCHAR rc2; - - union GNU_PACKED { - struct GNU_PACKED { -#ifdef RT_BIG_ENDIAN - UCHAR KeyID : 2; - UCHAR ExtIV : 1; - UCHAR Rsvd : 5; -#else - UCHAR Rsvd : 5; - UCHAR ExtIV : 1; - UCHAR KeyID : 2; -#endif - } field; - UCHAR Byte; - } CONTROL; - } field; - - UINT32 word; - } IV16; - - UINT32 IV32; -}; - -/* - ======================================================================== - - Routine Description: - Convert from UCHAR[] to UINT32 in a portable way - - Arguments: - pMICKey pointer to MIC Key - - Return Value: - None - - Note: - - ======================================================================== -*/ -UINT32 RTMPTkipGetUInt32(IN PUCHAR pMICKey) -{ - UINT32 res = 0; - INT i; - - for (i = 0; i < 4; i++) - res |= (*pMICKey++) << (8 * i); - - return res; -} - -/* - ======================================================================== - - Routine Description: - Convert from UINT32 to UCHAR[] in a portable way - - Arguments: - pDst pointer to destination for convert UINT32 to UCHAR[] - val the value for convert - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - Note: - - ======================================================================== -*/ -VOID RTMPTkipPutUInt32(IN OUT PUCHAR pDst, IN UINT32 val) -{ - INT i; - - for (i = 0; i < 4; i++) { - *pDst++ = (UCHAR)(val & 0xff); - val >>= 8; - } -} - -/* - ======================================================================== - - Routine Description: - Set the MIC Key. - - Arguments: - pAd Pointer to our adapter - pMICKey pointer to MIC Key - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - Note: - - ======================================================================== -*/ -VOID RTMPTkipSetMICKey(IN PTKIP_KEY_INFO pTkip, IN PUCHAR pMICKey) -{ - /* Set the key */ - pTkip->K0 = RTMPTkipGetUInt32(pMICKey); - pTkip->K1 = RTMPTkipGetUInt32(pMICKey + 4); - /* and reset the message */ - pTkip->L = pTkip->K0; - pTkip->R = pTkip->K1; - pTkip->nBytesInM = 0; - pTkip->M = 0; -} - -/* - ======================================================================== - - Routine Description: - Calculate the MIC Value. - - Arguments: - pAd Pointer to our adapter - uChar Append this uChar - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - Note: - - ======================================================================== -*/ -VOID RTMPTkipAppendByte(IN PTKIP_KEY_INFO pTkip, IN UCHAR uChar) -{ - /* Append the byte to our word-sized buffer */ - pTkip->M |= (uChar << (8 * pTkip->nBytesInM)); - pTkip->nBytesInM++; - - /* Process the word if it is full. */ - if (pTkip->nBytesInM >= 4) { - pTkip->L ^= pTkip->M; - pTkip->R ^= ROL32(pTkip->L, 17); - pTkip->L += pTkip->R; - pTkip->R ^= ((pTkip->L & 0xff00ff00) >> 8) | - ((pTkip->L & 0x00ff00ff) << 8); - pTkip->L += pTkip->R; - pTkip->R ^= ROL32(pTkip->L, 3); - pTkip->L += pTkip->R; - pTkip->R ^= ROR32(pTkip->L, 2); - pTkip->L += pTkip->R; - /* Clear the buffer */ - pTkip->M = 0; - pTkip->nBytesInM = 0; - } -} - -/* - ======================================================================== - - Routine Description: - Calculate the MIC Value. - - Arguments: - pAd Pointer to our adapter - pSrc Pointer to source data for Calculate MIC Value - Len Indicate the length of the source data - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - Note: - - ======================================================================== -*/ -VOID RTMPTkipAppend(IN PTKIP_KEY_INFO pTkip, IN PUCHAR pSrc, IN UINT nBytes) -{ - /* This is simple */ - while (nBytes > 0) { - RTMPTkipAppendByte(pTkip, *pSrc++); - nBytes--; - } -} - -/* - ======================================================================== - - Routine Description: - Get the MIC Value. - - Arguments: - pAd Pointer to our adapter - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - Note: - the MIC Value is store in pAd->PrivateInfo.MIC - ======================================================================== -*/ -VOID RTMPTkipGetMIC(IN PTKIP_KEY_INFO pTkip) -{ - /* Append the minimum padding*/ - RTMPTkipAppendByte(pTkip, 0x5a); - RTMPTkipAppendByte(pTkip, 0); - RTMPTkipAppendByte(pTkip, 0); - RTMPTkipAppendByte(pTkip, 0); - RTMPTkipAppendByte(pTkip, 0); - - /* and then zeroes until the length is a multiple of 4 */ - while (pTkip->nBytesInM != 0) - RTMPTkipAppendByte(pTkip, 0); - - /* The appendByte function has already computed the result. */ - RTMPTkipPutUInt32(pTkip->MIC, pTkip->L); - RTMPTkipPutUInt32(pTkip->MIC + 4, pTkip->R); -} - -/* - ======================================================================== - - Routine Description: - Init MIC Value calculation function which include set MIC key & - calculate first 16 bytes (DA + SA + priority + 0) - - Arguments: - pAd Pointer to our adapter - pTKey Pointer to the Temporal Key (TK), TK shall be 128bits. - pDA Pointer to DA address - pSA Pointer to SA address - pMICKey pointer to MIC Key - - Return Value: - None - - Note: - - ======================================================================== -*/ -VOID RTMPInitMICEngine(IN PRTMP_ADAPTER pAd, IN PUCHAR pKey, IN PUCHAR pDA, - IN PUCHAR pSA, IN UCHAR UserPriority, IN PUCHAR pMICKey) -{ - UCHAR Priority[4] = { 0 }; - Priority[0] = UserPriority; - /* Init MIC value calculation*/ - RTMPTkipSetMICKey(&pAd->PrivateInfo.Tx, pMICKey); - /* DA*/ - RTMPTkipAppend(&pAd->PrivateInfo.Tx, pDA, MAC_ADDR_LEN); - /* SA*/ - RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSA, MAC_ADDR_LEN); - /* Priority + 3 bytes of 0*/ - RTMPTkipAppend(&pAd->PrivateInfo.Tx, (PUCHAR)&Priority, 4); -} - -/* - ======================================================================== - - Routine Description: - Compare MIC value of received MSDU - - Arguments: - pAd Pointer to our adapter - pSrc Pointer to the received Plain text data - pDA Pointer to DA address - pSA Pointer to SA address - pMICKey pointer to MIC Key - Len the length of the received plain text data exclude MIC value - - Return Value: - TRUE MIC value matched - FALSE MIC value mismatched - - IRQL = DISPATCH_LEVEL - - Note: - - ======================================================================== -*/ -BOOLEAN RTMPTkipCompareMICValue(IN PRTMP_ADAPTER pAd, IN PUCHAR pSrc, - IN PUCHAR pDA, IN PUCHAR pSA, IN PUCHAR pMICKey, - IN UCHAR UserPriority, IN UINT Len) -{ - UCHAR OldMic[8]; - UCHAR Priority[4] = { 0 }; - - Priority[0] = UserPriority; - /* Init MIC value calculation*/ - RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey); - /* DA*/ - RTMPTkipAppend(&pAd->PrivateInfo.Rx, pDA, MAC_ADDR_LEN); - /* SA*/ - RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSA, MAC_ADDR_LEN); - /* Priority + 3 bytes of 0*/ - RTMPTkipAppend(&pAd->PrivateInfo.Rx, (PUCHAR)&Priority, 4); - /* Calculate MIC value from plain text data*/ - RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSrc, Len); - /* Get MIC valude from received frame*/ - NdisMoveMemory(OldMic, pSrc + Len, 8); - /* Get MIC value from decrypted plain data*/ - RTMPTkipGetMIC(&pAd->PrivateInfo.Rx); - - /* Move MIC value from MSDU, this steps should move to data path.*/ - /* Since the MIC value might cross MPDUs.*/ - if (!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTMPTkipCompareMICValue(): TKIP MIC Error !\n")); /*MIC error.*/ - return FALSE; - } - - return TRUE; -} - -/* - ======================================================================== - - Routine Description: - Copy frame from waiting queue into relative ring buffer and set - appropriate ASIC register to kick hardware transmit function - - Arguments: - pAd Pointer to our adapter - PNDIS_PACKET Pointer to Ndis Packet for MIC calculation - pEncap Pointer to LLC encap data - LenEncap Total encap length, might be 0 which indicates no encap - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - Note: - - ======================================================================== -*/ -VOID RTMPCalculateMICValue(IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket, - IN PUCHAR pEncap, IN PUCHAR pKey, IN PUCHAR pMIC, - IN UCHAR apidx) -{ - PACKET_INFO PacketInfo; - PUCHAR pSrcBufVA; - UINT SrcBufLen; - PUCHAR pSrc; - UCHAR UserPriority; - UCHAR vlan_offset = 0; - - RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); - UserPriority = RTMP_GET_PACKET_UP(pPacket); - pSrc = pSrcBufVA; - - /* determine if this is a vlan packet */ - if (((*(pSrc + 12) << 8) + *(pSrc + 13)) == 0x8100) - vlan_offset = 4; - -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT - - /* Start Calculate MIC Value*/ - if (apidx >= MIN_NET_DEVICE_FOR_APCLI && - ((apidx - MIN_NET_DEVICE_FOR_APCLI) < MAX_APCLI_NUM) && - (pAd->OpMode == OPMODE_AP)) { - /* For packet which need to do MATConvert, we need to use the CurrentAddress of specific ApCli interface.*/ - RTMPInitMICEngine( - pAd, pKey, pSrc, - pAd->ApCfg.ApCliTab[apidx - MIN_NET_DEVICE_FOR_APCLI] - .wdev.if_addr, - UserPriority, pMIC); - } else -#endif /* APCLI_SUPPORT */ -#ifdef IGMP_SNOOP_SUPPORT - if ((RTMP_GET_PACKET_WCID(pPacket) != MCAST_WCID_TO_REMOVE) && - (*pSrc & 0x01) && (pAd->OpMode == OPMODE_AP)) { - UCHAR wcid = RTMP_GET_PACKET_WCID(pPacket); - - RTMPInitMICEngine(pAd, pKey, pAd->MacTab.Content[wcid].Addr, - pSrc + 6, UserPriority, pMIC); - } else -#endif /* IGMP_SNOOP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - { - RTMPInitMICEngine(pAd, pKey, pSrc, pSrc + 6, UserPriority, - pMIC); - } - - if (pEncap != NULL) { - /* LLC encapsulation*/ - RTMPTkipAppend(&pAd->PrivateInfo.Tx, pEncap, 6); - /* Protocol Type*/ - RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc + 12 + vlan_offset, - 2); - } - - SrcBufLen -= (14 + vlan_offset); - pSrc += (14 + vlan_offset); - - do { - if (SrcBufLen > 0) - RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc, SrcBufLen); - - break; /* No need handle next packet */ - } while (TRUE); - - /* Compute the final MIC Value*/ - RTMPTkipGetMIC(&pAd->PrivateInfo.Tx); -} - -/************************************************************/ -/* tkip_sbox() */ -/* Returns a 16 bit value from a 64K entry table. The Table */ -/* is synthesized from two 256 entry byte wide tables. */ -/************************************************************/ - -UINT tkip_sbox(UINT index) -{ - UINT index_low; - UINT index_high; - UINT left, right; - - index_low = (index % 256); - index_high = ((index >> 8) % 256); - left = Tkip_Sbox_Lower[index_low] + (Tkip_Sbox_Upper[index_low] * 256); - right = Tkip_Sbox_Upper[index_high] + - (Tkip_Sbox_Lower[index_high] * 256); - return left ^ right; -} - -UINT rotr1(UINT a) -{ - unsigned int b; - - if ((a & 0x01) == 0x01) - b = (a >> 1) | 0x8000; - else - b = (a >> 1) & 0x7fff; - - b = b % 65536; - return b; -} - -VOID RTMPTkipMixKey(UCHAR *key, UCHAR *ta, - UINT32 pnl, /* Least significant 16 bits of PN */ - UINT32 pnh, /* Most significant 32 bits of PN */ - UCHAR *rc4key, UINT *p1k) -{ - UINT tsc0; - UINT tsc1; - UINT tsc2; - UINT ppk0; - UINT ppk1; - UINT ppk2; - UINT ppk3; - UINT ppk4; - UINT ppk5; - INT i; - INT j; - - tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */ - tsc1 = (unsigned int)(pnh % 65536); - tsc2 = (unsigned int)(pnl % 65536); /* lsb */ - /* Phase 1, step 1 */ - p1k[0] = tsc1; - p1k[1] = tsc0; - p1k[2] = (UINT)(ta[0] + (ta[1] * 256)); - p1k[3] = (UINT)(ta[2] + (ta[3] * 256)); - p1k[4] = (UINT)(ta[4] + (ta[5] * 256)); - - /* Phase 1, step 2 */ - for (i = 0; i < 8; i++) { - j = 2 * (i & 1); - p1k[0] = (p1k[0] + - tkip_sbox((p1k[4] ^ ((256 * key[1 + j]) + key[j])) % - 65536)) % - 65536; - p1k[1] = (p1k[1] + tkip_sbox((p1k[0] ^ ((256 * key[5 + j]) + - key[4 + j])) % - 65536)) % - 65536; - p1k[2] = (p1k[2] + tkip_sbox((p1k[1] ^ ((256 * key[9 + j]) + - key[8 + j])) % - 65536)) % - 65536; - p1k[3] = (p1k[3] + tkip_sbox((p1k[2] ^ ((256 * key[13 + j]) + - key[12 + j])) % - 65536)) % - 65536; - p1k[4] = (p1k[4] + - tkip_sbox((p1k[3] ^ (((256 * key[1 + j]) + key[j]))) % - 65536)) % - 65536; - p1k[4] = (p1k[4] + i) % 65536; - } - - /* Phase 2, Step 1 */ - ppk0 = p1k[0]; - ppk1 = p1k[1]; - ppk2 = p1k[2]; - ppk3 = p1k[3]; - ppk4 = p1k[4]; - ppk5 = (p1k[4] + tsc2) % 65536; - /* Phase2, Step 2 */ - ppk0 = ppk0 + tkip_sbox((ppk5 ^ ((256 * key[1]) + key[0])) % 65536); - ppk1 = ppk1 + tkip_sbox((ppk0 ^ ((256 * key[3]) + key[2])) % 65536); - ppk2 = ppk2 + tkip_sbox((ppk1 ^ ((256 * key[5]) + key[4])) % 65536); - ppk3 = ppk3 + tkip_sbox((ppk2 ^ ((256 * key[7]) + key[6])) % 65536); - ppk4 = ppk4 + tkip_sbox((ppk3 ^ ((256 * key[9]) + key[8])) % 65536); - ppk5 = ppk5 + tkip_sbox((ppk4 ^ ((256 * key[11]) + key[10])) % 65536); - ppk0 = ppk0 + rotr1(ppk5 ^ ((256 * key[13]) + key[12])); - ppk1 = ppk1 + rotr1(ppk0 ^ ((256 * key[15]) + key[14])); - ppk2 = ppk2 + rotr1(ppk1); - ppk3 = ppk3 + rotr1(ppk2); - ppk4 = ppk4 + rotr1(ppk3); - ppk5 = ppk5 + rotr1(ppk4); - /* Phase 2, Step 3 */ - /* Phase 2, Step 3 */ - tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */ - tsc1 = (unsigned int)(pnh % 65536); - tsc2 = (unsigned int)(pnl % 65536); /* lsb */ - rc4key[0] = (tsc2 >> 8) % 256; - rc4key[1] = (((tsc2 >> 8) % 256) | 0x20) & 0x7f; - rc4key[2] = tsc2 % 256; - rc4key[3] = ((ppk5 ^ ((256 * key[1]) + key[0])) >> 1) % 256; - rc4key[4] = ppk0 % 256; - rc4key[5] = (ppk0 >> 8) % 256; - rc4key[6] = ppk1 % 256; - rc4key[7] = (ppk1 >> 8) % 256; - rc4key[8] = ppk2 % 256; - rc4key[9] = (ppk2 >> 8) % 256; - rc4key[10] = ppk3 % 256; - rc4key[11] = (ppk3 >> 8) % 256; - rc4key[12] = ppk4 % 256; - rc4key[13] = (ppk4 >> 8) % 256; - rc4key[14] = ppk5 % 256; - rc4key[15] = (ppk5 >> 8) % 256; -} - -/* - TRUE: Success! - FALSE: Decrypt Error! -*/ -BOOLEAN RTMPSoftDecryptTKIP(IN PRTMP_ADAPTER pAd, IN PUCHAR pHdr, - IN UCHAR UserPriority, IN PCIPHER_KEY pKey, - INOUT PUCHAR pData, IN UINT16 *DataByteCnt) -{ - PHEADER_802_11 pFrame; - UINT8 frame_type; - UINT8 frame_subtype; - UINT8 from_ds; - UINT8 to_ds; - UINT8 a4_exists; - UINT8 qc_exists; - UCHAR TA[MAC_ADDR_LEN]; - UCHAR DA[MAC_ADDR_LEN]; - UCHAR SA[MAC_ADDR_LEN]; - UCHAR RC4Key[16]; - UINT p1k[5]; /*for mix_key;*/ - UINT32 pnl; /* Least significant 16 bits of PN */ - UINT32 pnh; /* Most significant 32 bits of PN */ - ARC4_CTX_STRUC ARC4_CTX; - PUCHAR plaintext_ptr; - UINT32 plaintext_len; - PUCHAR ciphertext_ptr; - UINT32 ciphertext_len; - UINT crc32 = 0; - UINT trailfcs = 0; - UCHAR MIC[8]; - UCHAR TrailMIC[8]; -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE); -#endif - - if (pKey->KeyLen == 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : the key is empty)\n", __func__)); - return FALSE; - } - - /* Indicate type and subtype of Frame Control field */ - frame_type = (((*pHdr) >> 2) & 0x03); - frame_subtype = (((*pHdr) >> 4) & 0x0f); - /* Indicate the fromDS and ToDS */ - from_ds = ((*(pHdr + 1)) & 0x2) >> 1; - to_ds = ((*(pHdr + 1)) & 0x1); - /* decide if the Address 4 exist or QoS exist */ - a4_exists = (from_ds & to_ds); - qc_exists = ((frame_subtype == SUBTYPE_QDATA) || - (frame_subtype == SUBTYPE_QDATA_CFACK) || - (frame_subtype == SUBTYPE_QDATA_CFPOLL) || - (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL)); - /* pointer to 802.11 header */ - pFrame = (PHEADER_802_11)pHdr; - - /* Assign DA, SA and TA for TKIP calculation */ - if (to_ds == 0 && from_ds == 1) { - NdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN); - NdisMoveMemory(TA, pFrame->Addr2, - MAC_ADDR_LEN); /*BSSID */ - NdisMoveMemory(SA, pFrame->Addr3, MAC_ADDR_LEN); - } else if (to_ds == 0 && from_ds == 0) { - NdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN); - NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); - NdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN); - } else if (to_ds == 1 && from_ds == 0) { - NdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN); - NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); - NdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN); - } else { /* (to_ds == 1 && from_ds == 1) - To Fix Coverity issue */ - NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); - NdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN); - NdisMoveMemory(SA, pFrame->Octet, MAC_ADDR_LEN); - } - - pnl = (*(pData)) << 8 | (*(pData + 2)); - pnh = *((PUINT32)(pData + 4)); - pnh = cpu2le32(pnh); - RTMPTkipMixKey(pKey->Key, TA, pnl, pnh, RC4Key, p1k); - /* skip 8-bytes TKIP IV/EIV header */ - ciphertext_ptr = pData + LEN_TKIP_IV_HDR; - ciphertext_len = *DataByteCnt - LEN_TKIP_IV_HDR; - - /* skip payload length is zero*/ - if ((*DataByteCnt) <= LEN_TKIP_IV_HDR) - return FALSE; - - /* WEP Decapsulation */ - /* Generate an RC4 key stream */ - ARC4_INIT(&ARC4_CTX, &RC4Key[0], 16); - /* Decrypt the TKIP MPDU by ARC4. - It shall include plaintext, MIC and ICV. - The result output would overwrite the original TKIP IV/EIV header position */ - ARC4_Compute(&ARC4_CTX, ciphertext_ptr, ciphertext_len, pData); - /* Point to the decrypted data frame and its length shall exclude ICV length */ - plaintext_ptr = pData; - plaintext_len = ciphertext_len - LEN_ICV; - /* Extract peer's ICV */ - NdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV); - /* Re-computes the ICV and - bit-wise compares with the peer's ICV. */ - crc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len); - crc32 ^= 0xffffffff; /* complement */ - - if (crc32 != cpu2le32(trailfcs)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("! WEP Data CRC Error !\n")); /*CRC error.*/ - return FALSE; - } - - /* Extract peer's MIC and subtract MIC length from total data length */ - plaintext_len -= LEN_TKIP_MIC; - NdisMoveMemory(TrailMIC, plaintext_ptr + plaintext_len, LEN_TKIP_MIC); - RTMPInitMICEngine(pAd, pKey->Key, DA, SA, UserPriority, pKey->RxMic); - RTMPTkipAppend(&pAd->PrivateInfo.Tx, plaintext_ptr, plaintext_len); - RTMPTkipGetMIC(&pAd->PrivateInfo.Tx); - NdisMoveMemory(MIC, pAd->PrivateInfo.Tx.MIC, LEN_TKIP_MIC); - - if (!NdisEqualMemory(MIC, TrailMIC, LEN_TKIP_MIC)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("! TKIP MIC Error !\n")); /*MIC error.*/ - return FALSE; - } - - /* Update the total data length */ - *DataByteCnt = plaintext_len; -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE); -#endif - return TRUE; -} - -/* - ======================================================================== - - Routine Description: - Use RC4 to protect the Key Data field of EAPoL frame. - It's defined in IEEE 802.11i-2004 p.84 - - Arguments: - - Return Value: - None - - Note: - - ======================================================================== -*/ -VOID TKIP_GTK_KEY_WRAP(IN UCHAR *key, IN UCHAR *iv, IN UCHAR *input_text, - IN UINT32 input_len, OUT UCHAR *output_text) -{ - UCHAR ekey[LEN_KEY_DESC_IV + LEN_PTK_KEK]; - /* ARC4_CTX_STRUC ARC4_CTX;*/ - ARC4_CTX_STRUC *pARC4_CTX = NULL; - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&pARC4_CTX, sizeof(ARC4_CTX_STRUC)); - - if (pARC4_CTX == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return; - } - - /* The encryption key is generated by concatenating the - EAPOL-Key IV field and the KEK. */ - NdisMoveMemory(ekey, iv, LEN_KEY_DESC_IV); - NdisMoveMemory(&ekey[LEN_KEY_DESC_IV], key, LEN_PTK_KEK); - /* RC4 stream cipher initialization with the KEK */ - ARC4_INIT(pARC4_CTX, &ekey[0], LEN_KEY_DESC_IV + LEN_PTK_KEK); - /* The first 256 octets of the RC4 key stream shall be discarded */ - ARC4_Discard_KeyLength(pARC4_CTX, 256); - /* encryption begins using the 257th key stream octet */ - ARC4_Compute(pARC4_CTX, input_text, input_len, output_text); - - if (pARC4_CTX != NULL) - os_free_mem(pARC4_CTX); -} - -VOID TKIP_GTK_KEY_UNWRAP(IN UCHAR *key, IN UCHAR *iv, IN UCHAR *input_text, - IN UINT32 input_len, OUT UCHAR *output_text) -{ - TKIP_GTK_KEY_WRAP(key, iv, input_text, input_len, output_text); -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_wep.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_wep.c deleted file mode 100644 index 5f3c47555d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_wep.c +++ /dev/null @@ -1,309 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rtmp_wep.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Paul Wu 10-28-02 Initial -*/ - -#include "rt_config.h" - -UINT FCSTAB_32[256] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, - 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, - 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, - 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, - 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, - 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, - 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, - 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, - 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, - 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, - 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, - 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, - 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, - 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, - 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, - 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, - 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, - 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -/* - ======================================================================== - - Routine Description: - Calculate a new FCS given the current FCS and the new data. - - Arguments: - Fcs the original FCS value - Cp pointer to the data which will be calculate the FCS - Len the length of the data - - Return Value: - UINT - FCS 32 bits - - IRQL = DISPATCH_LEVEL - - Note: - - ======================================================================== -*/ -UINT RTMP_CALC_FCS32(IN UINT Fcs, IN PUCHAR Cp, IN INT Len) -{ - while (Len--) - Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]); - - return Fcs; -} - -/* - ======================================================================== - - Routine Description: - Init WEP function. - - Arguments: - pAd Pointer to our adapter - pKey Pointer to the WEP KEY - KeyId WEP Key ID - KeyLen the length of WEP KEY - pDest Pointer to the destination which Encryption data will store in. - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - Note: - - ======================================================================== -*/ -VOID RTMPInitWepEngine(IN PUCHAR pIv, IN PUCHAR pKey, IN UCHAR KeyLen, - OUT ARC4_CTX_STRUC *pARC4_CTX) -{ - PUCHAR seed = NULL; - UINT8 seed_len; - - os_alloc_mem(NULL, (UCHAR **)&seed, sizeof(UCHAR) * 16); - - if (seed == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: seed Allocate memory fail!!!\n", __func__)); - return; - } - - /* WEP seed construction */ - NdisZeroMemory(seed, 16); - NdisMoveMemory(seed, pIv, 3); - NdisMoveMemory(&seed[3], pKey, KeyLen); - seed_len = 3 + KeyLen; - /* RC4 uses a pseudo-random number generator (PRNG) - to generate a key stream */ - ARC4_INIT(pARC4_CTX, &seed[0], seed_len); - os_free_mem(seed); -} - -/* - ======================================================================== - - Routine Description: - Construct WEP IV header. - - Arguments: - - Return Value: - - Note: - It's a 4-octets header. - - ======================================================================== -*/ -VOID RTMPConstructWEPIVHdr(IN UINT8 key_idx, IN UCHAR *pn, OUT UCHAR *iv_hdr) -{ - NdisZeroMemory(iv_hdr, LEN_WEP_IV_HDR); - NdisMoveMemory(iv_hdr, pn, LEN_WEP_TSC); - /* Append key index */ - iv_hdr[3] = (key_idx << 6); -} - -/* - ======================================================================== - - Routine Description: - WEP MPDU cryptographic encapsulation - - Arguments: - pAdapter Pointer to our adapter - pSrc Pointer to the received data - Len the length of the received data - - Return Value: - - Note: - - ======================================================================== -*/ -BOOLEAN RTMPSoftEncryptWEP(IN PUCHAR pIvHdr, IN PSEC_KEY_INFO pKey, - INOUT PUCHAR pData, IN ULONG DataByteCnt) -{ - ARC4_CTX_STRUC *ARC4_CTX = NULL; - UINT FCSCRC32; - - os_alloc_mem(NULL, (UCHAR **)&ARC4_CTX, sizeof(ARC4_CTX_STRUC)); - - if (ARC4_CTX == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: ARC4_CTX Allocate memory fail!!!\n", __func__)); - return FALSE; - } - - if (pKey->KeyLen == 0) { - os_free_mem(ARC4_CTX); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The key is empty !\n", __func__)); - return FALSE; - } - - /* Initialize WEP key stream */ - RTMPInitWepEngine(pIvHdr, pKey->Key, pKey->KeyLen, ARC4_CTX); - /* WEP computes the ICV over the plaintext data */ - FCSCRC32 = RTMP_CALC_FCS32(PPPINITFCS32, pData, DataByteCnt); - FCSCRC32 ^= 0xffffffff; /* complement */ - FCSCRC32 = cpu2le32(FCSCRC32); - /* Append 4-bytes ICV after the MPDU data */ - NdisMoveMemory(pData + DataByteCnt, (PUCHAR)&FCSCRC32, LEN_ICV); - /* Encrypt the MPDU plaintext data and ICV using ARC4 with a seed */ - ARC4_Compute(ARC4_CTX, pData, DataByteCnt + LEN_ICV, pData); - os_free_mem(ARC4_CTX); - return TRUE; -} - -/* - ======================================================================== - - Routine Description: - Decrypt received WEP data - - Arguments: - pAdapter Pointer to our adapter - pSrc Pointer to the received data - Len the length of the received data - - Return Value: - TRUE Decrypt WEP data success - FALSE Decrypt WEP data failed - - Note: - - ======================================================================== -*/ -BOOLEAN RTMPSoftDecryptWEP(IN PSEC_KEY_INFO pKey, INOUT PUCHAR pData, - INOUT UINT16 *DataByteCnt) -{ - /*ARC4_CTX_STRUC ARC4_CTX;*/ - ARC4_CTX_STRUC *ARC4_CTX = NULL; - PUCHAR plaintext_ptr; - UINT16 plaintext_len; - PUCHAR ciphertext_ptr; - UINT16 ciphertext_len; - UINT trailfcs; - UINT crc32; - - os_alloc_mem(NULL, (UCHAR **)&ARC4_CTX, sizeof(ARC4_CTX_STRUC)); - - if (ARC4_CTX == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: ARC4_CTX Allocate memory fail!!!\n", __func__)); - return FALSE; - } - - if (pKey->KeyLen == 0) { - os_free_mem(ARC4_CTX); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The key is not available !\n", __func__)); - return FALSE; - } - - /* Initialize WEP key stream */ - RTMPInitWepEngine(pData, pKey->Key, pKey->KeyLen, ARC4_CTX); - /* Skip the WEP IV header (4-bytes) */ - ciphertext_ptr = pData + LEN_WEP_IV_HDR; - ciphertext_len = *DataByteCnt - LEN_WEP_IV_HDR; - - /*skip payload length is zero*/ - if ((*DataByteCnt) <= LEN_WEP_IV_HDR) { - os_free_mem(ARC4_CTX); - return FALSE; - } - - /* Decrypt the WEP MPDU. It shall include plaintext and ICV. - The result output would overwrite the original WEP IV header position */ - ARC4_Compute(ARC4_CTX, ciphertext_ptr, ciphertext_len, pData); - /* Point to the decrypted data frame and its length shall exclude ICV length */ - plaintext_ptr = pData; - plaintext_len = ciphertext_len - LEN_ICV; - /* Extract peer's the ICV */ - NdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV); - /* WEP recomputes the ICV and - bit-wise compares it with the decrypted ICV from the MPDU. */ - crc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len); - crc32 ^= 0xffffffff; /* complement */ - - if (crc32 != cpu2le32(trailfcs)) { - os_free_mem(ARC4_CTX); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("! WEP Data CRC Error !\n")); /*CRC error.*/ - return FALSE; - } - - /* Update the total data length */ - *DataByteCnt = plaintext_len; - os_free_mem(ARC4_CTX); - return TRUE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_wpa.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_wpa.c deleted file mode 100644 index bc99aa6bea..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/cmm_wpa.c +++ /dev/null @@ -1,7155 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wpa.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Jan Lee 03-07-22 Initial - Paul Lin 03-11-28 Modify for supplicant -*/ -#include "rt_config.h" - -/* --------------------EddySEC Start---------------- */ - -UCHAR SES_OUI[] = { 0x00, 0x90, 0x4c }; - -/* WPA OUI*/ -UCHAR OUI_WPA[3] = { 0x00, 0x50, 0xF2 }; -UCHAR OUI_WPA_NONE_AKM[4] = { 0x00, 0x50, 0xF2, 0x00 }; -UCHAR OUI_WPA_VERSION[4] = { 0x00, 0x50, 0xF2, 0x01 }; -UCHAR OUI_WPA_WEP40[4] = { 0x00, 0x50, 0xF2, 0x01 }; -UCHAR OUI_WPA_TKIP[4] = { 0x00, 0x50, 0xF2, 0x02 }; -UCHAR OUI_WPA_CCMP[4] = { 0x00, 0x50, 0xF2, 0x04 }; -UCHAR OUI_WPA_WEP104[4] = { 0x00, 0x50, 0xF2, 0x05 }; -UCHAR OUI_WPA_8021X_AKM[4] = { 0x00, 0x50, 0xF2, 0x01 }; -UCHAR OUI_WPA_PSK_AKM[4] = { 0x00, 0x50, 0xF2, 0x02 }; - -/* WPA2 OUI*/ -UCHAR OUI_WPA2[3] = { 0x00, 0x0F, 0xAC }; -UCHAR OUI_WPA2_CIPHER[3] = { 0x00, 0x0F, 0xAC }; -UCHAR OUI_WPA2_CIPHER_WEP40[4] = { 0x00, 0x0F, 0xAC, 0x01 }; -UCHAR OUI_WPA2_CIPHER_TKIP[4] = { 0x00, 0x0F, 0xAC, 0x02 }; -UCHAR OUI_WPA2_CIPHER_CCMP128[4] = { 0x00, 0x0F, 0xAC, 0x04 }; -UCHAR OUI_WPA2_CIPHER_WEP104[4] = { 0x00, 0x0F, 0xAC, 0x05 }; -UCHAR OUI_WPA2_CIPHER_BIPCMAC128[4] = { 0x00, 0x0F, 0xAC, 0x06 }; -UCHAR OUI_WPA2_CIPHER_GCMP128[4] = { 0x00, 0x0F, 0xAC, 0x08 }; -UCHAR OUI_WPA2_CIPHER_GCMP256[4] = { 0x00, 0x0F, 0xAC, 0x09 }; -UCHAR OUI_WPA2_CIPHER_CCMP256[4] = { 0x00, 0x0F, 0xAC, 0x0A }; -UCHAR OUI_WPA2_CIPHER_BIPGMAC128[4] = { 0x00, 0x0F, 0xAC, 0x0B }; -UCHAR OUI_WPA2_CIPHER_BIPGMAC256[4] = { 0x00, 0x0F, 0xAC, 0x0C }; -UCHAR OUI_WPA2_CIPHER_BIPCMAC256[4] = { 0x00, 0x0F, 0xAC, 0x0D }; - -UCHAR OUI_WPA2_AKM_8021X[4] = { 0x00, 0x0F, 0xAC, 0x01 }; -UCHAR OUI_WPA2_AKM_PSK[4] = { 0x00, 0x0F, 0xAC, 0x02 }; -UCHAR OUI_WPA2_AKM_FT_8021X[4] = { 0x00, 0x0F, 0xAC, 0x03 }; -UCHAR OUI_WPA2_AKM_FT_PSK[4] = { 0x00, 0x0F, 0xAC, 0x04 }; -UCHAR OUI_WPA2_AKM_8021X_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x05 }; -UCHAR OUI_WPA2_AKM_PSK_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x06 }; -UCHAR OUI_WPA2_AKM_TDLS[4] = { 0x00, 0x0F, 0xAC, 0x07 }; -UCHAR OUI_WPA2_AKM_SAE_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x08 }; -UCHAR OUI_WPA2_AKM_FT_SAE_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x09 }; -UCHAR OUI_WPA2_AKM_SUITEB_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x0B }; -UCHAR OUI_WPA2_AKM_SUITEB_SHA384[4] = { 0x00, 0x0F, 0xAC, 0x0C }; -UCHAR OUI_WPA2_AKM_FT_8021X_SHA384[4] = { 0x00, 0x0F, 0xAC, 0x0D }; -#ifdef OCE_FILS_SUPPORT -UCHAR OUI_WPA2_AKM_FILS_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x0E }; -UCHAR OUI_WPA2_AKM_FILS_SHA384[4] = { 0x00, 0x0F, 0xAC, 0x0F }; -#endif /* OCE_FILS_SUPPORT */ - -UCHAR OUI_WPA2_AKM_OWE[4] = { 0x00, 0x0F, 0xAC, 0x12 /*d'18*/ }; - -BUILD_TIMER_FUNCTION(WPAStartFor4WayExec); -BUILD_TIMER_FUNCTION(WPAStartFor2WayExec); -BUILD_TIMER_FUNCTION(WPAHandshakeMsgRetryExec); -/* --------------------EddySEC END---------------- */ - -#ifdef CONFIG_HOTSPOT_R2 -UCHAR OSEN_IE[] = { 0x50, 0x6f, 0x9a, 0x12, 0x00, 0x0f, 0xac, 0x07, - 0x01, 0x00, 0x00, 0x0f, 0xac, 0x04, 0x01, 0x00, - 0x50, 0x6f, 0x9a, 0x01, 0x00, 0x00 }; -UCHAR OSEN_IELEN = sizeof(OSEN_IE); -#endif - -static VOID WpaEAPPacketAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -static VOID WpaEAPOLASFAlertAction(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem); - -static VOID WpaEAPOLLogoffAction(IN PRTMP_ADAPTER pAd, - IN MLME_QUEUE_ELEM *Elem); - -static VOID WpaEAPOLStartAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -static VOID WpaEAPOLKeyAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem); - -/* - ========================================================================== - Description: - association state machine init, including state transition and timer init - Parameters: - S - pointer to the association state machine - ========================================================================== - */ -VOID WpaStateMachineInit(IN PRTMP_ADAPTER pAd, IN STATE_MACHINE *S, - OUT STATE_MACHINE_FUNC Trans[]) -{ - StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_WPA_PTK_STATE, - MAX_WPA_MSG, (STATE_MACHINE_FUNC)Drop, WPA_PTK, - WPA_MACHINE_BASE); - StateMachineSetAction(S, WPA_PTK, MT2_EAPPacket, - (STATE_MACHINE_FUNC)WpaEAPPacketAction); - StateMachineSetAction(S, WPA_PTK, MT2_EAPOLStart, - (STATE_MACHINE_FUNC)WpaEAPOLStartAction); - StateMachineSetAction(S, WPA_PTK, MT2_EAPOLLogoff, - (STATE_MACHINE_FUNC)WpaEAPOLLogoffAction); - StateMachineSetAction(S, WPA_PTK, MT2_EAPOLKey, - (STATE_MACHINE_FUNC)WpaEAPOLKeyAction); - StateMachineSetAction(S, WPA_PTK, MT2_EAPOLASFAlert, - (STATE_MACHINE_FUNC)WpaEAPOLASFAlertAction); -} - -/* - ========================================================================== - Description: - this is state machine function. - When receiving EAP packets which is for 802.1x authentication use. - Not use in PSK case - Return: - ========================================================================== -*/ -VOID WpaEAPPacketAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ -} - -VOID WpaEAPOLASFAlertAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ -} - -VOID WpaEAPOLLogoffAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ -} - -UCHAR sec_get_kek_len(struct _SECURITY_CONFIG *pSecConfig) -{ -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_SHA256(pSecConfig->AKMMap)) { - return 32; - } else if (IS_AKM_FILS_SHA384(pSecConfig->AKMMap)) { - return 64; - } -#endif /* OCE_FILS_SUPPORT */ - - return 0; -} - -UCHAR sec_get_kck_len(struct _SECURITY_CONFIG *pSecConfig) -{ -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS(pSecConfig->AKMMap)) { - return 0; - } -#endif /* OCE_FILS_SUPPORT */ - - return 0; -} - -UCHAR sec_get_cipher_key_len(UINT32 cipher) -{ - if (IS_CIPHER_TKIP(cipher)) - return LEN_TKIP_TK; - else if (IS_CIPHER_CCMP128(cipher)) - return LEN_CCMP128_TK; - else if (IS_CIPHER_CCMP256(cipher)) - return LEN_CCMP256_TK; - else if (IS_CIPHER_GCMP128(cipher)) - return LEN_GCMP128_TK; - else if (IS_CIPHER_GCMP256(cipher)) - return LEN_GCMP256_TK; - - return 0; -} - -/* - ======================================================================== - - Routine Description: - Classify WPA EAP message type - - Arguments: - EAPType Value of EAP message type - MsgType Internal Message definition for MLME state machine - - Return Value: - TRUE Found appropriate message type - FALSE No appropriate message type - - IRQL = DISPATCH_LEVEL - - Note: - All these constants are defined in wpa_cmm.h - For supplicant, there is only EAPOL Key message avaliable - - ======================================================================== -*/ -BOOLEAN WpaMsgTypeSubst(IN UCHAR EAPType, OUT INT *MsgType) -{ - switch (EAPType) { - case EAPPacket: - *MsgType = MT2_EAPPacket; - break; - - case EAPOLStart: - *MsgType = MT2_EAPOLStart; - break; - - case EAPOLLogoff: - *MsgType = MT2_EAPOLLogoff; - break; - - case EAPOLKey: - *MsgType = MT2_EAPOLKey; - break; - - case EAPOLASFAlert: - *MsgType = MT2_EAPOLASFAlert; - break; - - default: - return FALSE; - } - - return TRUE; -} - -/** - * inc_iv_byte - Increment arbitrary length byte array - * @counter: Pointer to byte array - * @len: Length of the counter in bytes - * - * This function increments the least byte of the counter by one and continues - * rolling over to more significant bytes if the byte was incremented from - * 0xff to 0x00. - */ -void inc_iv_byte(UCHAR *iv, UINT len, UINT cnt) -{ - int pos = 0; - int carry = 0; - UCHAR pre_iv; - - while (pos < len) { - pre_iv = iv[pos]; - - if (carry == 1) - iv[pos]++; - else - iv[pos] += cnt; - - if (iv[pos] > pre_iv) - break; - - carry = 1; - pos++; - } - - if (pos >= len) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("!!! inc_iv_byte overflow !!!\n")); -} - -/* - ========================================================================== - Description: - Report the EAP message type - - Arguments: - msg - EAPOL_PAIR_MSG_1 - EAPOL_PAIR_MSG_2 - EAPOL_PAIR_MSG_3 - EAPOL_PAIR_MSG_4 - EAPOL_GROUP_MSG_1 - EAPOL_GROUP_MSG_2 - - Return: - message type string - - ========================================================================== -*/ -RTMP_STRING *GetEapolMsgType(CHAR msg) -{ - if (msg == EAPOL_PAIR_MSG_1) - return "Pairwise Message 1"; - else if (msg == EAPOL_PAIR_MSG_2) - return "Pairwise Message 2"; - else if (msg == EAPOL_PAIR_MSG_3) - return "Pairwise Message 3"; - else if (msg == EAPOL_PAIR_MSG_4) - return "Pairwise Message 4"; - else if (msg == EAPOL_GROUP_MSG_1) - return "Group Message 1"; - else if (msg == EAPOL_GROUP_MSG_2) - return "Group Message 2"; - else - return "Invalid Message"; -} - -UCHAR RTMPExtractKeyIdxFromIVHdr(UCHAR *pIV, UINT8 CipherAlg) -{ - UCHAR keyIdx = 0xFF; - - /* extract the key index from IV header */ - switch (CipherAlg) { - case Ndis802_11WEPEnabled: - case Ndis802_11TKIPEnable: - case Ndis802_11AESEnable: - case Ndis802_11GroupWEP40Enabled: - case Ndis802_11GroupWEP104Enabled: - keyIdx = (*(pIV + 3) & 0xc0) >> 6; - break; - } - - return keyIdx; -} - -UCHAR IsPeerSupportExtKeyDesc(UCHAR *rsn_ie) -{ - USHORT pair_wise_cipher_cnt = 0; - USHORT akm_suite_cnt = 0; - UCHAR rsn_ie_len = rsn_ie[1] + 2; - UCHAR *akm_suite; - UCHAR offset = 0, i; - UCHAR ext_akm = 0; - /* WPA2 OUI */ -#ifdef DOT11R_FT_SUPPORT - UCHAR OUI_WPA2_AKM_FT_8021X[4] = { 0x00, 0x0F, 0xAC, 0x03 }; - UCHAR OUI_WPA2_AKM_FT_PSK[4] = { 0x00, 0x0F, 0xAC, 0x04 }; -#endif /* DOT11R_FT_SUPPORT */ - UCHAR OUI_WPA2_AKM_8021X_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x05 }; - UCHAR OUI_WPA2_AKM_PSK_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x06 }; - - if (rsn_ie == NULL || rsn_ie[0] != IE_WPA2) - return ext_akm; - - if (rsn_ie[1] < MIN_LEN_OF_RSNIE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : len is too short(len = %d) !!!\n", - __func__, rsn_ie[1])); - return 0; - } - - offset += 4; - if (rsn_ie_len == offset) { - /* None of the optional fields are included in the RSNE */ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] : None of Optional fields are present\n", - __func__)); - return 0; - } - - /* Get the pairwise cipher count */ - offset += LEN_OUI_SUITE; - if (rsn_ie_len <= offset) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] : Group cipher missing)\n", __func__)); - return 0; - } - NdisMoveMemory(&pair_wise_cipher_cnt, &rsn_ie[offset], sizeof(USHORT)); - pair_wise_cipher_cnt = cpu2le16(pair_wise_cipher_cnt); - - /* Get the AKM suite count */ - offset += (pair_wise_cipher_cnt * LEN_OUI_SUITE + 2); - if (rsn_ie_len < offset) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[%s] : AKM suite count missing)\n", __func__)); - return 0; - } - NdisMoveMemory(&akm_suite_cnt, &rsn_ie[offset], sizeof(USHORT)); - akm_suite_cnt = cpu2le16(akm_suite_cnt); - - /* AKM suite location */ - offset += 2; - akm_suite = (rsn_ie + offset); - for (i = 0; i < akm_suite_cnt; i++) { - if (NdisEqualMemory(akm_suite + i * 4, - OUI_WPA2_AKM_8021X_SHA256, LEN_OUI_SUITE) || - NdisEqualMemory(akm_suite + i * 4, OUI_WPA2_AKM_PSK_SHA256, - LEN_OUI_SUITE)) { - ext_akm = 1; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("AKM Support Ext Key Descriptor\n")); - break; - } -#ifdef DOT11R_FT_SUPPORT - else if (NdisEqualMemory(akm_suite + i * 4, - OUI_WPA2_AKM_FT_8021X, - LEN_OUI_SUITE) || - NdisEqualMemory(akm_suite + i * 4, OUI_WPA2_AKM_FT_PSK, - LEN_OUI_SUITE)) { - ext_akm = 1; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("AKM Support Ext Key Descriptor\n")); - break; - } -#endif /* DOT11R_FT_SUPPORT */ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%02x , %02x, %02x, %02x\n", akm_suite[i * 4 + 0], - akm_suite[i * 4 + 1], akm_suite[i * 4 + 2], - akm_suite[i * 4 + 3])); - } - return ext_akm; -} - -#if defined(SOFT_ENCRYPT) || defined(ADHOC_WPA2PSK_SUPPORT) -CIPHER_KEY *RTMPSwCipherKeySelection(IN RTMP_ADAPTER *pAd, IN UCHAR *pIV, - IN RX_BLK *pRxBlk, - IN MAC_TABLE_ENTRY *pEntry) -{ - PCIPHER_KEY pKey = NULL; - UCHAR keyIdx = 0; - UINT8 CipherAlg = Ndis802_11EncryptionDisabled; - - if ((pEntry == NULL) || (RX_BLK_TEST_FLAG(pRxBlk, fRX_STA)) || - (RX_BLK_TEST_FLAG(pRxBlk, fRX_WDS)) || - (RX_BLK_TEST_FLAG(pRxBlk, fRX_MESH))) - return NULL; - - if (pRxBlk->pRxInfo->U2M) - CipherAlg = pEntry->WepStatus; - else { - } - - keyIdx = RTMPExtractKeyIdxFromIVHdr(pIV, CipherAlg); - - if (keyIdx > 3) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Invalid key index(%d) !!!\n", __func__, - keyIdx)); - return NULL; - } - - if ((CipherAlg == Ndis802_11WEPEnabled) || - (CipherAlg == Ndis802_11GroupWEP40Enabled) || - (CipherAlg == Ndis802_11GroupWEP104Enabled)) - pKey = &pAd->SharedKey[pEntry->func_tb_idx][keyIdx]; - else if ((CipherAlg == Ndis802_11TKIPEnable) || - (CipherAlg == Ndis802_11AESEnable)) { - if (pRxBlk->pRxInfo->U2M) - pKey = &pEntry->PairwiseKey; - else { - pKey = &pAd->SharedKey[pEntry->func_tb_idx][keyIdx]; - } - } - - return pKey; -} - -/* - ======================================================================== - - Routine Description: - Some received frames can't decrypt by Asic, so decrypt them by software. - - Arguments: - pAd - pointer to our pAdapter context - PeerWepStatus - indicate the encryption type - - Return Value: - NDIS_STATUS_SUCCESS - decryption successful - NDIS_STATUS_FAILURE - decryption failure - - ======================================================================== -*/ -NDIS_STATUS RTMPSoftDecryptionAction(IN PRTMP_ADAPTER pAd, IN PUCHAR pHdr, - IN UCHAR UserPriority, IN PCIPHER_KEY pKey, - INOUT PUCHAR pData, - INOUT UINT16 *DataByteCnt) -{ - switch (pKey->CipherAlg) { - case CIPHER_WEP64: - case CIPHER_WEP128: - - /* handle WEP decryption */ - if (RTMPSoftDecryptWEP((PSEC_KEY_INFO)pKey, pData, - &(*DataByteCnt)) == FALSE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR : SW decrypt WEP data fails.\n")); - /* give up this frame*/ - return NDIS_STATUS_FAILURE; - } - - break; - - case CIPHER_TKIP: - - /* handle TKIP decryption */ - if (RTMPSoftDecryptTKIP(pAd, pHdr, UserPriority, pKey, pData, - &(*DataByteCnt)) == FALSE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR : SW decrypt TKIP data fails.\n")); - /* give up this frame*/ - return NDIS_STATUS_FAILURE; - } - - break; - - case CIPHER_AES: - - /* handle AES decryption */ - if (RTMPSoftDecryptCCMP(pAd, pHdr, pKey, pData, - &(*DataByteCnt)) == FALSE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR : SW decrypt AES data fails.\n")); - /* give up this frame*/ - return NDIS_STATUS_FAILURE; - } - - break; - - default: - /* give up this frame*/ - return NDIS_STATUS_FAILURE; - break; - } - - return NDIS_STATUS_SUCCESS; -} - -VOID RTMPSoftConstructIVHdr(IN UCHAR CipherAlg, IN UCHAR key_id, - IN PUCHAR pTxIv, OUT PUCHAR pHdrIv, - OUT UINT8 *hdr_iv_len) -{ - *hdr_iv_len = 0; - if ((CipherAlg == CIPHER_WEP64) || (CipherAlg == CIPHER_WEP128)) { - /* Construct and insert 4-bytes WEP IV header to MPDU header */ - RTMPConstructWEPIVHdr(key_id, pTxIv, pHdrIv); - *hdr_iv_len = LEN_WEP_IV_HDR; - } else if (CipherAlg == CIPHER_TKIP) - ; - else if (CipherAlg == CIPHER_AES) { - /* Construct and insert 8-bytes CCMP header to MPDU header */ - RTMPConstructCCMPHdr(key_id, pTxIv, pHdrIv); - *hdr_iv_len = LEN_CCMP_HDR; - } -} - -VOID RTMPSoftEncryptionAction(IN PRTMP_ADAPTER pAd, IN UCHAR CipherAlg, - IN PUCHAR pHdr, IN PUCHAR pSrcBufData, - IN UINT32 SrcBufLen, IN UCHAR KeyIdx, - IN PCIPHER_KEY pKey, OUT UINT8 *ext_len) -{ - *ext_len = 0; - if ((CipherAlg == CIPHER_WEP64) || (CipherAlg == CIPHER_WEP128)) { - /* Encrypt the MPDU data by software*/ - RTMPSoftEncryptWEP(pKey->TxTsc, pKey, pSrcBufData, SrcBufLen); - *ext_len = LEN_ICV; - } else if (CipherAlg == CIPHER_TKIP) - ; - else if (CipherAlg == CIPHER_AES) { - /* Encrypt the MPDU data by software*/ - RTMPSoftEncryptCCMP(pAd, pHdr, pKey->TxTsc, pKey->Key, - pSrcBufData, SrcBufLen); - *ext_len = LEN_CCMP_MIC; - } -} -#endif /* SOFT_ENCRYPT || ADHOC_WPA2PSK_SUPPORT */ - -PUINT8 WPA_ExtractSuiteFromRSNIE(IN PUINT8 rsnie, IN UINT rsnie_len, - IN UINT8 type, OUT UINT8 *count) -{ - PEID_STRUCT pEid; - INT len; - PUINT8 pBuf; - INT offset = 0; - - pEid = (PEID_STRUCT)rsnie; - len = rsnie_len - 2; /* exclude IE and length*/ - pBuf = (PUINT8)&pEid->Octet[0]; - /* set default value*/ - *count = 0; - - /* Check length*/ - if ((len <= 0) || (pEid->Len != len)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The length is invalid\n", __func__)); - goto out; - } - - /* Check WPA or WPA2*/ - if (pEid->Eid == IE_WPA) { - /* Check the length */ - if (len < sizeof(RSNIE)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The length is too short for WPA\n", - __func__)); - goto out; - } else { - PRSNIE pRsnie; - UINT16 u_cnt; - - pRsnie = (PRSNIE)pBuf; - u_cnt = cpu2le16(pRsnie->ucount); - offset = sizeof(RSNIE) + (LEN_OUI_SUITE * (u_cnt - 1)); - - if (len < offset) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : The expected lenght(%d) exceed the remaining length(%d) for WPA-RSN\n", - __func__, offset, len)); - goto out; - } else { - /* Get the group cipher*/ - if (type == GROUP_SUITE) { - *count = 1; - return pRsnie->mcast; - } - /* Get the pairwise cipher suite*/ - else if (type == PAIRWISE_SUITE) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s : The count of pairwise cipher is %d\n", - __func__, u_cnt)); - *count = u_cnt; - return pRsnie->ucast[0].oui; - } - } - } - } else if (pEid->Eid == IE_RSN) { - if (len < sizeof(RSNIE2)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The length is too short for WPA2\n", - __func__)); - goto out; - } else { - PRSNIE2 pRsnie2; - UINT16 u_cnt; - - pRsnie2 = (PRSNIE2)pBuf; - u_cnt = cpu2le16(pRsnie2->ucount); - offset = sizeof(RSNIE2) + (LEN_OUI_SUITE * (u_cnt - 1)); - - if (len < offset) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : The expected lenght(%d) exceed the remaining length(%d) for WPA2-RSN\n", - __func__, offset, len)); - goto out; - } else { - /* Get the group cipher*/ - if (type == GROUP_SUITE) { - *count = 1; - return pRsnie2->mcast; - } - /* Get the pairwise cipher suite*/ - else if (type == PAIRWISE_SUITE) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s : The count of pairwise cipher is %d\n", - __func__, u_cnt)); - *count = u_cnt; - return pRsnie2->ucast[0].oui; - } - } - } - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Unknown IE (%d)\n", __func__, pEid->Eid)); - goto out; - } - - /* skip group cipher and pairwise cipher suite */ - pBuf += offset; - len -= offset; - - /* Ready to extract the AKM information and its count */ - if (len < sizeof(RSNIE_AUTH)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The length of AKM of RSN is too short\n", - __func__)); - goto out; - } else { - PRSNIE_AUTH pAkm; - UINT16 a_cnt; - /* pointer to AKM count */ - pAkm = (PRSNIE_AUTH)pBuf; - a_cnt = cpu2le16(pAkm->acount); - offset = sizeof(RSNIE_AUTH) + (LEN_OUI_SUITE * (a_cnt - 1)); - - if (len < offset) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The expected lenght(%d) exceed the remaining length(%d) for AKM\n", - __func__, offset, len)); - goto out; - } else { - /* Get the AKM suite */ - if (type == AKM_SUITE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s : The count of AKM is %d\n", - __func__, a_cnt)); - *count = a_cnt; - return pAkm->auth[0].oui; - } - } - } - - /* For WPA1, the remaining shall be ignored. */ - if (pEid->Eid == IE_WPA) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : The remaining shall be ignored in WPA mode\n", - __func__)); - goto out; - } - - /* skip the AKM capability */ - pBuf += offset; - len -= offset; - - /* Parse the RSN Capabilities */ - if (len < sizeof(RSN_CAPABILITIES)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : The peer RSNIE doesn't include RSN-Cap\n", - __func__)); - goto out; - } else { - /* Report the content of the RSN capabilities */ - if (type == RSN_CAP_INFO) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : Extract RSN Capabilities\n", __func__)); - *count = 1; - return pBuf; - } - - /* skip RSN capability (2-bytes) */ - offset = sizeof(RSN_CAPABILITIES); - pBuf += offset; - len -= offset; - } - - /* Extract PMKID-list field */ - if (len < sizeof(UINT16)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : The peer RSNIE doesn't include PMKID list Count\n", - __func__)); - goto out; - } else { - UINT16 p_count; - PUINT8 pPmkidList = NULL; - - NdisMoveMemory(&p_count, pBuf, sizeof(UINT16)); - p_count = cpu2le16(p_count); - - /* Get count of the PMKID list */ - if (p_count > 0) { - PRSNIE_PMKID pRsnPmkid; - /* the expected length of PMKID-List field */ - offset = sizeof(RSNIE_PMKID) + - (LEN_PMKID * (p_count - 1)); - - /* sanity check about the length of PMKID-List field */ - if (len < offset) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s : The expected lenght(%d) exceed the remaining length(%d) in PMKID-field\n", - __func__, offset, len)); - goto out; - } - - /* pointer to PMKID field */ - pRsnPmkid = (PRSNIE_PMKID)pBuf; - pPmkidList = pRsnPmkid->pmkid[0].list; - } else { - /* The PMKID field shall be without PMKID-List */ - offset = sizeof(UINT16); - pPmkidList = NULL; - } - - /* Extract PMKID list and its count */ - if (type == PMKID_LIST) { - *count = p_count; - return pPmkidList; - } - - /* skip the PMKID field */ - pBuf += offset; - len -= offset; - } - -#ifdef DOT11W_PMF_SUPPORT - - /* Get group mamagement cipher */ - if (len < LEN_OUI_SUITE) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_TRACE, - ("[PMF]%s : The peer RSNIE doesn't include Group_mgmt_cipher_suite\n", - __func__)); - goto out; - } else { - offset = LEN_OUI_SUITE; - - /* Get Group-Mgmt-Cipher_Suite information */ - if (type == G_MGMT_SUITE) { - *count = 1; - return pBuf; - } else { - /* skip the Group-Mgmt-Cipher_Suite field */ - pBuf += offset; - len -= offset; - } - } - -#endif /* DOT11W_PMF_SUPPORT */ -out: - *count = 0; - return NULL; -} - -VOID WpaShowAllsuite(IN PUINT8 rsnie, IN UINT rsnie_len) -{ - PUINT8 pSuite = NULL; - UINT8 count; - - hex_dump("RSNIE", rsnie, rsnie_len); - /* group cipher*/ - pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, GROUP_SUITE, - &count); - - if (pSuite != NULL) - hex_dump("group cipher", pSuite, 4 * count); - - /* pairwise cipher*/ - pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, PAIRWISE_SUITE, - &count); - - if (pSuite != NULL) - hex_dump("pairwise cipher", pSuite, 4 * count); - - /* AKM*/ - pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, AKM_SUITE, &count); - - if (pSuite != NULL) - hex_dump("AKM suite", pSuite, 4 * count); - - /* PMKID*/ - pSuite = - WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, PMKID_LIST, &count); - - if (pSuite != NULL) - hex_dump("PMKID", pSuite, LEN_PMKID); -} - -#ifdef RT_CFG80211_SUPPORT -BOOLEAN RTMPIsValidIEs(UCHAR *Ies, INT32 Len) -{ - /* Validate if the IE is in correct format. */ - INT32 Pos = 0; - INT32 IeLen = 0; - - while (Pos < Len) { - IeLen = (INT32)(Ies[Pos + 1]) + 2; - - if (IeLen < 0) - return FALSE; - - Pos += IeLen; - } - - if (Pos == Len) - return TRUE; - else - return FALSE; -} - -#endif /* RT_CFG80211_SUPPORT */ - -/* --------------------Eddy---------------- */ -/* - ======================================================================== - - Routine Description: - The pseudo-random function(PRF) that hashes various inputs to - derive a pseudo-random value. To add liveness to the pseudo-random - value, a nonce should be one of the inputs. - - It is used to generate PTK, GTK or some specific random value. - - Arguments: - UCHAR *key, - the key material for HMAC_SHA1 use - INT key_len - the length of key - UCHAR *prefix - a prefix label - INT prefix_len - the length of the label - UCHAR *data - a specific data with variable length - INT data_len - the length of a specific data - INT len - the output lenght - - Return Value: - UCHAR *output - the calculated result - - Note: - 802.11i-2004 Annex H.3 - - ======================================================================== -*/ -VOID PRF(IN UCHAR *key, IN INT key_len, IN UCHAR *prefix, IN INT prefix_len, - IN UCHAR *data, IN INT data_len, OUT UCHAR *output, IN INT len) -{ - INT i; - UCHAR *input; - INT currentindex = 0; - INT total_len; - /* Allocate memory for input*/ - os_alloc_mem(NULL, (PUCHAR *)&input, 1024); - - if (input == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!PRF: no memory!!!\n")); - return; - } - - /* Generate concatenation input*/ - NdisMoveMemory(input, prefix, prefix_len); - /* Concatenate a single octet containing 0*/ - input[prefix_len] = 0; - /* Concatenate specific data*/ - NdisMoveMemory(&input[prefix_len + 1], data, data_len); - total_len = prefix_len + 1 + data_len; - /* Concatenate a single octet containing 0*/ - /* This octet shall be update later*/ - input[total_len] = 0; - total_len++; - - /* Iterate to calculate the result by hmac-sha-1*/ - /* Then concatenate to last result*/ - for (i = 0; i < (len + 19) / 20; i++) { - RT_HMAC_SHA1(key, key_len, input, total_len, - &output[currentindex], SHA1_DIGEST_SIZE); - currentindex += 20; - /* update the last octet */ - input[total_len - 1]++; - } - - os_free_mem(input); -} - -/* - ======================================================================== - - Routine Description: - The key derivation function(KDF) is defined in IEEE 802.11r/D9.0, 8.5.1.5.2 - - Arguments: - - Return Value: - - Note: - Output - KDF-Length (K, label, Context) where - Input: K, a 256-bit key derivation key - label, a string identifying the purpose of the keys derived using this KDF - Context, a bit string that provides context to identify the derived key - Length, the length of the derived key in bits - Output: a Length-bit derived key - - result - "" - iterations - (Length+255)/256 - do i = 1 to iterations - result - result || HMAC-SHA256(K, i || label || Context || Length) - od - return first Length bits of result, and securely delete all unused bits - - In this algorithm, i and Length are encoded as 16-bit unsigned integers. - - ======================================================================== -*/ -VOID KDF(IN PUINT8 key, IN INT key_len, IN PUINT8 label, IN INT label_len, - IN PUINT8 data, IN INT data_len, OUT PUINT8 output, IN USHORT len) -{ - USHORT i; - UCHAR *input; - INT currentindex = 0; - INT total_len; - UINT len_in_bits = (len << 3); - - os_alloc_mem(NULL, (PUCHAR *)&input, 1024); - - if (input == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!KDF: no memory!!!\n")); - return; - } - - NdisZeroMemory(input, 1024); - /* Initial concatenated value (i || label || Context || Length)*/ - /* concatenate 16-bit unsigned integer, its initial value is 1. */ - input[0] = 1; - input[1] = 0; - total_len = 2; - /* concatenate a prefix string*/ - NdisMoveMemory(&input[total_len], label, label_len); - total_len += label_len; - /* concatenate the context*/ - NdisMoveMemory(&input[total_len], data, data_len); - total_len += data_len; - /* concatenate the length in bits (16-bit unsigned integer)*/ - input[total_len] = (len_in_bits & 0xFF); - input[total_len + 1] = (len_in_bits & 0xFF00) >> 8; - total_len += 2; - - for (i = 1; i <= ((len_in_bits + 255) / 256); i++) { - /* HMAC-SHA256 derives output */ - RT_HMAC_SHA256((UCHAR *)key, key_len, input, total_len, - (UCHAR *)&output[currentindex], 32); - currentindex += 32; /* next concatenation location*/ - input[0]++; /* increment octet count*/ - } - - os_free_mem(input); -} - -VOID HKDF_expand_sha384(IN UCHAR *secret, IN INT secret_len, IN UCHAR *info, - IN INT info_len, OUT UCHAR *output, INT output_Len) -{ - UCHAR T[SHA384_DIGEST_SIZE]; - UCHAR iter = 1; - const unsigned char *addr[3]; - UINT len[3]; - UINT pos, clen; - - addr[0] = T; - len[0] = SHA384_DIGEST_SIZE; - addr[1] = info; - len[1] = info_len; - addr[2] = &iter; - len[2] = 1; - - RT_HMAC_SHA384_VECTOR(secret, secret_len, 2, &addr[1], &len[1], T, - SHA384_DIGEST_SIZE); - - pos = 0; - for (;;) { - clen = output_Len - pos; - if (clen > SHA384_DIGEST_SIZE) - clen = SHA384_DIGEST_SIZE; - memcpy(output + pos, T, clen); - pos += clen; - - if (pos == output_Len) - break; - - if (iter == 255) { - os_zero_mem(output, output_Len); - os_zero_mem(T, SHA384_DIGEST_SIZE); - return; - } - iter++; - - RT_HMAC_SHA384_VECTOR(secret, secret_len, 3, addr, len, T, - SHA384_DIGEST_SIZE); - } - - os_zero_mem(T, SHA384_DIGEST_SIZE); -} - -VOID KDF_384(IN PUINT8 key, IN INT key_len, IN PUINT8 label, IN INT label_len, - IN PUINT8 data, IN INT data_len, OUT PUINT8 output, IN USHORT len) -{ - USHORT i; - UCHAR *input; - INT currentindex = 0; - INT total_len; - UINT len_in_bits = (len << 3); - - os_alloc_mem(NULL, (PUCHAR *)&input, 1024); - - if (input == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!KDF: no memory!!!\n")); - return; - } - - NdisZeroMemory(input, 1024); - /* Initial concatenated value (i || label || Context || Length)*/ - /* concatenate 16-bit unsigned integer, its initial value is 1. */ - input[0] = 1; - input[1] = 0; - total_len = 2; - /* concatenate a prefix string*/ - NdisMoveMemory(&input[total_len], label, label_len); - total_len += label_len; - /* concatenate the context*/ - NdisMoveMemory(&input[total_len], data, data_len); - total_len += data_len; - /* concatenate the length in bits (16-bit unsigned integer)*/ - input[total_len] = (len_in_bits & 0xFF); - input[total_len + 1] = (len_in_bits & 0xFF00) >> 8; - total_len += 2; - - for (i = 1; i <= ((len_in_bits + 383) / 384); i++) { - /* HMAC-SHA384 derives output */ - RT_HMAC_SHA384((UCHAR *)key, key_len, input, total_len, - (UCHAR *)&output[currentindex], - SHA384_DIGEST_SIZE); - currentindex += - SHA384_DIGEST_SIZE; /* next concatenation location*/ - input[0]++; /* increment octet count*/ - } - - os_free_mem(input); -} - -VOID HKDF_expand_sha256(IN UCHAR *secret, IN INT secret_len, IN UCHAR *info, - IN INT info_len, OUT UCHAR *output, INT output_Len) -{ - UCHAR T[SHA256_DIGEST_SIZE]; - UCHAR iter = 1; - const unsigned char *addr[3]; - UINT len[3]; - UINT pos, clen; - - addr[0] = T; - len[0] = SHA256_DIGEST_SIZE; - addr[1] = info; - len[1] = info_len; - addr[2] = &iter; - len[2] = 1; - - RT_HMAC_SHA256_VECTOR(secret, secret_len, 2, &addr[1], &len[1], T, - SHA256_DIGEST_SIZE); - - pos = 0; - for (;;) { - clen = output_Len - pos; - if (clen > SHA256_DIGEST_SIZE) - clen = SHA256_DIGEST_SIZE; - memcpy(output + pos, T, clen); - pos += clen; - - if (pos == output_Len) - break; - - if (iter == 255) { - os_zero_mem(output, output_Len); - os_zero_mem(T, SHA256_DIGEST_SIZE); - return; - } - iter++; - - RT_HMAC_SHA256_VECTOR(secret, secret_len, 3, addr, len, T, - SHA256_DIGEST_SIZE); - } - - os_zero_mem(T, SHA256_DIGEST_SIZE); -} - -/* - ======================================================================== - - Routine Description: - Generate random number by software. - - Arguments: - pAd - pointer to our pAdapter context - macAddr - pointer to local MAC address - - Return Value: - - Note: - 802.1ii-2004 Annex H.5 - - ======================================================================== -*/ -VOID GenRandom(IN PRTMP_ADAPTER pAd, IN UCHAR *macAddr, OUT UCHAR *random) -{ - INT i, curr; - UCHAR local[80], KeyCounter[32]; - UCHAR result[80]; - ULONG CurrentTime; - UCHAR prefix[] = { 'I', 'n', 'i', 't', ' ', 'C', - 'o', 'u', 'n', 't', 'e', 'r' }; - /* Zero the related information*/ - NdisZeroMemory(result, 80); - NdisZeroMemory(local, 80); - NdisZeroMemory(KeyCounter, 32); - - for (i = 0; i < 32; i++) { - /* copy the local MAC address*/ - COPY_MAC_ADDR(local, macAddr); - curr = MAC_ADDR_LEN; - /* concatenate the current time*/ - NdisGetSystemUpTime(&CurrentTime); - NdisMoveMemory(&local[curr], &CurrentTime, sizeof(CurrentTime)); - curr += sizeof(CurrentTime); - /* concatenate the last result*/ - NdisMoveMemory(&local[curr], result, 32); - curr += 32; - /* concatenate a variable */ - NdisMoveMemory(&local[curr], &i, 2); - curr += 2; - /* calculate the result*/ - PRF(KeyCounter, 32, prefix, 12, local, curr, result, 32); - } - - NdisMoveMemory(random, result, 32); -} - -/* - ======================================================================== - - Routine Description: - Copy frame from waiting queue into relative ring buffer and set - appropriate ASIC register to kick hardware encryption before really - sent out to air. - - Arguments: - pAd Pointer to our adapter - PNDIS_PACKET Pointer to outgoing Ndis frame - NumberOfFrag Number of fragment required - - Return Value: - None - - Note: - - ======================================================================== -*/ -VOID RTMPToWirelessSta(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PUCHAR pHeader802_3, IN UINT HdrLen, IN PUCHAR pData, - IN UINT DataLen, IN BOOLEAN bClearFrame) -{ - PNDIS_PACKET pPacket; - NDIS_STATUS Status; - struct wifi_dev *wdev; - /* UINT8 debug_level_bkp = DebugLevel; */ - - if ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry) -#ifdef MAC_REPEATER_SUPPORT - && (!IS_ENTRY_REPEATER(pEntry)) -#endif -#if defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) - && (!IS_ENTRY_TDLS(pEntry)) -#endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) */ - )) - return; - - Status = RTMPAllocateNdisPacket(pAd, &pPacket, pHeader802_3, HdrLen, - pData, DataLen); - - if (Status != NDIS_STATUS_SUCCESS) - return; - - RTMP_SET_PACKET_CLEAR_EAP_FRAME(pPacket, (bClearFrame ? 1 : 0)); -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT - - if (IS_ENTRY_APCLI(pEntry)) { - } else -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - { - } - - RTMP_SET_PACKET_WCID(pPacket, (UCHAR)pEntry->wcid); - - /* TODO: shiang-usw, fix this! */ - if (!pEntry->wdev) { - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); - return; - } - RTMP_SET_PACKET_WDEV(pPacket, pEntry->wdev->wdev_idx); - RTMP_SET_PACKET_MOREDATA(pPacket, FALSE); - - wdev = pEntry->wdev; - - if (!wdev) { - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); - return; - } - - send_data_pkt(pAd, wdev, pPacket); -} - -/* Eddy: should be move to auth file */ -VOID MlmeDeAuthAction(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN USHORT Reason, IN BOOLEAN bDataFrameFirst) -{ - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - HEADER_802_11 DeAuthHdr; - NDIS_STATUS NStatus; - - if (pEntry) { - /* Send out a Deauthentication request frame*/ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - /* send wireless event - for send disassication */ - RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pEntry->Addr, - pEntry->wdev->wdev_idx, 0); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Send DEAUTH frame with ReasonCode(%d) to %02x:%02x:%02x:%02x:%02x:%02x\n", - Reason, PRINT_MAC(pEntry->Addr))); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - MgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, - pEntry->Addr, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.if_addr, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.bssid); - } -#endif /* CONFIG_AP_SUPPORT */ - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &DeAuthHdr, 2, &Reason, END_OF_ARGS); -#ifdef DOT11W_PMF_SUPPORT - - if (pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE && - pAd->MacTab.tr_entry[pEntry->wcid].PortSecured == - WPA_802_1X_PORT_SECURED) { - ULONG TmpLen; - enum { RES_LEN = LEN_CCMP_HDR + LEN_CCMP_MIC }; - UCHAR res_buf[RES_LEN]; - /* reserve a buffer for PMF CCMP calculation later */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - RES_LEN, res_buf, END_OF_ARGS); - FrameLen += TmpLen; - /* Indicate this is a unicast Robust management frame */ - DeAuthHdr.FC.Wep = 1; - } - -#endif /* DOT11_PMF_SUPPORT */ - - if (bDataFrameFirst) - MiniportMMRequest(pAd, MGMT_USE_QUEUE_FLAG, pOutBuffer, - FrameLen); - else - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - - MlmeFreeMemory(pOutBuffer); - /*Sta entry is deleted before sending EAP-Failure & Deauth frame - Using OS_WAIT to rescheduling the frame TX before entry delete*/ - OS_WAIT(1); -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_DEAUTH_COM, Reason); -#endif -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && IS_MAP_R2_ENABLE(pAd)) - wapp_handle_sta_disassoc(pAd, pEntry->wcid, Reason); -#endif - - /* ApLogEvent(pAd, pEntry->Addr, EVENT_DISASSOCIATED);*/ -#if defined(CONFIG_HOTSPOT_R2) || defined(CONFIG_DOT11V_WNM) - if (!pEntry->IsKeep) -#endif /* CONFIG_HOTSPOT_R2 */ - /*usd dispatch level due to MlmeDeAuthAction will be called in timer task*/ - mac_entry_delete(pAd, pEntry); - } -} - -/* - ========================================================================== - Description: - Check whether the received frame is EAP frame. - - Arguments: - pAd - pointer to our pAdapter context - pEntry - pointer to active entry - pData - the received frame - DataByteCount - the received frame's length - wdev_idx - indicate the interface index - - Return: - TRUE - This frame is EAP frame - FALSE - otherwise - ========================================================================== -*/ -BOOLEAN RTMPCheckWPAframe(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN UCHAR *pData, IN ULONG DataByteCount, - IN UCHAR wdev_idx, IN BOOLEAN eth_frame) -{ - ULONG Body_len, min_len = (LENGTH_802_1_H + LENGTH_EAPOL_H); - BOOLEAN Cancelled; - struct wifi_dev *wdev; - ASSERT(wdev_idx <= WDEV_NUM_MAX); - - if (wdev_idx >= WDEV_NUM_MAX) - return FALSE; - - wdev = pAd->wdev_list[wdev_idx]; - - do { - if (eth_frame) { - min_len = (LENGTH_802_3 + LENGTH_EAPOL_H); - break; - } - - } while (FALSE); - - if (DataByteCount < min_len) - return FALSE; - - /* Skip LLC or ETH header */ - if (eth_frame == TRUE) - pData += LENGTH_802_3; - else { - /* Cisco 1200 AP may send packet with SNAP_BRIDGE_TUNNEL*/ - if (NdisEqualMemory(SNAP_802_1H, pData, 6) || - NdisEqualMemory(SNAP_BRIDGE_TUNNEL, pData, 6)) - pData += 6; - } - - /* Skip 2-bytes EAPoL type */ - if (NdisEqualMemory(EAPOL, pData, 2)) - pData += 2; - else - return FALSE; - - switch (*(pData + 1)) { - case EAPPacket: - Body_len = (*(pData + 2) << 8) | (*(pData + 3)); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef IDS_SUPPORT - - if ((*(pData + 4)) == EAP_CODE_REQUEST) - pAd->ApCfg.RcvdEapReqCount++; - -#endif /* IDS_SUPPORT */ - } -#endif /* CONFIG_AP_SUPPORT */ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Receive EAP-Packet frame, TYPE = 0, Length = %ld\n", - Body_len)); - break; - - case EAPOLStart: - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Receive EAPOL-Start frame, TYPE = 1\n")); - - if (pEntry->EnqueueEapolStartTimerRunning != - EAPOL_START_DISABLE) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Cancel the EnqueueEapolStartTimerRunning\n")); - RTMPCancelTimer(&pEntry->SecConfig.StartFor4WayTimer, - &Cancelled); - pEntry->EnqueueEapolStartTimerRunning = - EAPOL_START_DISABLE; - } - - break; - - case EAPOLLogoff: - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Receive EAPOLLogoff frame, TYPE = 2\n")); - break; - - case EAPOLKey: - Body_len = (*(pData + 2) << 8) | (*(pData + 3)); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Receive EAPOL-Key frame, TYPE = 3, Length = %ld\n", - Body_len)); - break; - - case EAPOLASFAlert: - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Receive EAPOLASFAlert frame, TYPE = 4\n")); - break; - - default: - return FALSE; - } - - return TRUE; -} - -/* -* F(P, S, c, i) = U1 xor U2 xor ... Uc -* U1 = PRF(P, S || Int(i)) -* U2 = PRF(P, U1) -* Uc = PRF(P, Uc-1) -*/ -static void WPA_F(char *password, unsigned char *ssid, int ssidlength, - int iterations, int count, unsigned char *output) -{ - unsigned char digest[36], digest1[SHA1_DIGEST_SIZE]; - int i, j, len; - - len = strlen(password); - /* U1 = PRF(P, S || int(i)) */ - memcpy(digest, ssid, ssidlength); - digest[ssidlength] = (unsigned char)((count >> 24) & 0xff); - digest[ssidlength + 1] = (unsigned char)((count >> 16) & 0xff); - digest[ssidlength + 2] = (unsigned char)((count >> 8) & 0xff); - digest[ssidlength + 3] = (unsigned char)(count & 0xff); - RT_HMAC_SHA1((unsigned char *)password, len, digest, ssidlength + 4, - digest1, SHA1_DIGEST_SIZE); /* for WPA update*/ - /* output = U1 */ - NdisCopyMemory(output, digest1, SHA1_DIGEST_SIZE); - - for (i = 1; i < iterations; i++) { - /* Un = PRF(P, Un-1) */ - RT_HMAC_SHA1((unsigned char *)password, len, digest1, - SHA1_DIGEST_SIZE, digest, - SHA1_DIGEST_SIZE); /* for WPA update*/ - NdisCopyMemory(digest1, digest, SHA1_DIGEST_SIZE); - - /* output = output xor Un */ - for (j = 0; j < SHA1_DIGEST_SIZE; j++) - output[j] ^= digest[j]; - } -} - -/* -* password - ascii string up to 63 characters in length -* ssid - octet string up to 32 octets -* ssidlength - length of ssid in octets -* output must be 40 octets in length and outputs 256 bits of key -*/ -INT WPAPasswordHash(IN CHAR *password, IN UCHAR *ssid, IN INT ssidlength, - OUT UCHAR *output) -{ - if ((strlen(password) > 63) || (ssidlength > 32)) - return 0; - - WPA_F(password, ssid, ssidlength, 4096, 1, output); - WPA_F(password, ssid, ssidlength, 4096, 2, &output[SHA1_DIGEST_SIZE]); - return 1; -} - -INT SetWPAPSKKey(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *keyString, - IN INT keyStringLen, IN UCHAR *pHashStr, IN INT hashStrLen, - OUT PUCHAR pPMKBuf) -{ - UCHAR keyMaterial[40]; - - if ((keyStringLen < 8) || (keyStringLen > 64)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("WPAPSK Key length(%d) error, required 8 ~ 64 characters!(keyStr=%s)\n", - keyStringLen, keyString)); - return FALSE; - } - - NdisZeroMemory(pPMKBuf, 32); - - if (keyStringLen == 64) - AtoH(keyString, pPMKBuf, 32); - else { - WPAPasswordHash(keyString, pHashStr, hashStrLen, keyMaterial); - NdisMoveMemory(pPMKBuf, keyMaterial, 32); - } - - return TRUE; -} - -/* For TKIP frame, calculate the MIC value */ -BOOLEAN rtmp_chk_tkip_mic(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN RX_BLK *pRxBlk) -{ - FRAME_CONTROL *FC = (FRAME_CONTROL *)pRxBlk->FC; - UCHAR *pData = pRxBlk->pData; - USHORT DataSize = pRxBlk->DataSize; - UCHAR UserPriority = pRxBlk->UserPriority; - UCHAR *pDA, *pSA; - CHAR *pKey = NULL; - - if ((FC->FrDs == 1) && (FC->ToDs == 1)) { - pDA = pRxBlk->Addr3; - pSA = pRxBlk->Addr4; - } else if ((FC->FrDs == 1) && (FC->ToDs == 0)) { - pDA = pRxBlk->Addr1; - pSA = pRxBlk->Addr3; - } else if ((FC->FrDs == 0) && (FC->ToDs == 1)) { - pDA = pRxBlk->Addr3; - pSA = pRxBlk->Addr2; - } else { - /* FrDS = 0; ToDS = 0 => IBSS, Non-AP to Non-AP in BSS */ - pDA = pRxBlk->Addr1; - pSA = pRxBlk->Addr2; - } - -#ifdef HDR_TRANS_RX_SUPPORT - - if (RX_BLK_TEST_FLAG(pRxBlk, fRX_HDR_TRANS)) { - pData = (pData + LENGTH_802_3); - DataSize = (DataSize - LENGTH_802_3); - } - -#endif /* HDR_TRANS_RX_SUPPORT */ - - pKey = &pEntry->SecConfig.PTK[OFFSET_OF_TKIP_RX_MIC]; - - if (RTMPTkipCompareMICValue(pAd, pData, pDA, pSA, pKey, UserPriority, - DataSize) == FALSE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Rx MIC Value error 2\n")); -#ifdef CONFIG_AP_SUPPORT - - if (RX_BLK_TEST_FLAG(pRxBlk, fRX_STA)) - RTMP_HANDLE_COUNTER_MEASURE(pAd, pEntry); - -#endif /* CONFIG_AP_SUPPORT */ - RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, - NDIS_STATUS_FAILURE); - return FALSE; - } - - return TRUE; -} - -VOID ReadWPAParameterFromFile(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer) -{ -#ifdef CONFIG_AP_SUPPORT - INT apidx; - RTMP_STRING tok_str[16]; -#endif /* CONFIG_AP_SUPPORT */ - RTMP_STRING *macptr; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - /* - In WPA-WPA2 mix mode, it provides a more flexible cipher combination. - - WPA-AES and WPA2-TKIP - - WPA-AES and WPA2-TKIPAES - - WPA-TKIP and WPA2-AES - - WPA-TKIP and WPA2-TKIPAES - - WPA-TKIPAES and WPA2-AES - - WPA-TKIPAES and WPA2-TKIP - - WPA-TKIPAES and WPA2-TKIPAES (default) - */ - if (RTMPGetKeyParameter("WpaMixPairCipher", tmpbuf, 128, - pBuffer, TRUE)) { - struct _SECURITY_CONFIG *pSecConfig = NULL; - - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), apidx++) { - pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - SetWdevAuthMode(pSecConfig, macptr); - SetWdevEncrypMode(pSecConfig, macptr); - } - } - - /* GroupKey Rekey Method*/ - if (RTMPGetKeyParameter("RekeyMethod", tmpbuf, 128, pBuffer, - TRUE)) { - struct _SECURITY_CONFIG *pSecConfig = NULL; - - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), apidx++) { - pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - pSecConfig->GroupReKeyMethod = - SEC_GROUP_REKEY_DISABLE; - - if (rtstrcasecmp(macptr, "TIME") == TRUE) - pSecConfig->GroupReKeyMethod = - SEC_GROUP_REKEY_TIME; - else if (rtstrcasecmp(macptr, "PKT") == TRUE) - pSecConfig->GroupReKeyMethod = - SEC_GROUP_REKEY_PACKET; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) GroupKey ReKeyMethod=%x\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->GroupReKeyMethod)); - } - - /* Apply to remaining MBSS*/ - if (apidx == 1) { - for (apidx = 1; apidx < pAd->ApCfg.BssidNum; - apidx++) { - pSecConfig = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig; - pSecConfig->GroupReKeyMethod = - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .GroupReKeyMethod; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) GroupKey ReKeyMethod=%x\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->GroupReKeyMethod)); - } - } - } - - /* GroupKey RekeyInterval */ - if (RTMPGetKeyParameter("RekeyInterval", tmpbuf, 255, pBuffer, - TRUE)) { - struct _SECURITY_CONFIG *pSecConfig = NULL; - - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), apidx++) { - ULONG value_interval; - - pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - value_interval = os_str_tol(macptr, 0, 10); - - if ((value_interval >= 10) && - (value_interval < MAX_GROUP_REKEY_INTERVAL)) - pSecConfig->GroupReKeyInterval = - value_interval; - else /*Default*/ - pSecConfig->GroupReKeyInterval = - DEFAULT_GROUP_REKEY_INTERVAL; - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) GroupKey ReKeyInterval=%ld seconds\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig->GroupReKeyInterval)); - } - - /* Apply to remaining MBSS*/ - if (apidx == 1) { - for (apidx = 1; apidx < pAd->ApCfg.BssidNum; - apidx++) { - pSecConfig = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig; - pSecConfig->GroupReKeyInterval = - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .GroupReKeyInterval; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) ReKeyInterval=%ld\n", - INF_MBSSID_DEV_NAME, apidx, - pSecConfig - ->GroupReKeyInterval)); - } - } - } - - /*PMKCachePeriod*/ - if (RTMPGetKeyParameter("PMKCachePeriod", tmpbuf, 255, pBuffer, - TRUE)) { - struct _SECURITY_CONFIG *pSecConfig = NULL; - - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), apidx++) { - ULONG value_interval; - - pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - value_interval = - os_str_tol(macptr, 0, 10) * 60 * OS_HZ; - pSecConfig->PMKCachePeriod = value_interval; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) PMKCachePeriod=%ld\n", - INF_MBSSID_DEV_NAME, apidx, - pAd->ApCfg.MBSSID[apidx] - .PMKCachePeriod)); - } - - /* Apply to remaining MBSS*/ - if (apidx == 1) { - for (apidx = 1; apidx < pAd->ApCfg.BssidNum; - apidx++) { - pSecConfig = &pAd->ApCfg.MBSSID[apidx] - .wdev.SecConfig; - pSecConfig->PMKCachePeriod = - pAd->ApCfg.MBSSID[0] - .wdev.SecConfig - .PMKCachePeriod; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("I/F(%s%d) PMKCachePeriod=%ld\n", - INF_MBSSID_DEV_NAME, apidx, - pAd->ApCfg.MBSSID[apidx] - .PMKCachePeriod)); - } - } - } - - /*WPAPSK_KEY*/ - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - struct _SECURITY_CONFIG *pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - - snprintf(tok_str, sizeof(tok_str), "WPAPSK%d", - apidx + 1); - - if (RTMPGetKeyParameter(tok_str, tmpbuf, 65, pBuffer, - FALSE)) { - ULONG len = strlen(tmpbuf); - - if (len < 65) { - os_move_mem(pSecConfig->PSK, tmpbuf, - len); - pSecConfig->PSK[len] = '\0'; - } else - pSecConfig->PSK[0] = '\0'; -#ifdef WSC_AP_SUPPORT - NdisZeroMemory(pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPsk, - 64); - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPskLen = 0; - if ((len >= 8) && (len <= 64)) { - NdisMoveMemory( - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPsk, - tmpbuf, len); - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPskLen = - len; - } -#endif /* WSC_AP_SUPPORT */ - } - } - - /* If not match, search WPAPSK */ - if (RTMPGetKeyParameter("WPAPSK", tmpbuf, 512, pBuffer, - FALSE)) { - ULONG len; - - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); macptr; - macptr = rstrtok(NULL, ";"), apidx++) { - struct _SECURITY_CONFIG *pSecConfig = - &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig; - - len = strlen(macptr); - - if (len < 65) { - os_move_mem(pSecConfig->PSK, macptr, - len); - pSecConfig->PSK[len] = '\0'; - } else - pSecConfig->PSK[0] = '\0'; -#ifdef WSC_AP_SUPPORT - NdisZeroMemory(pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPsk, - 64); - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPskLen = 0; - if ((len >= 8) && (len <= 64)) { - NdisMoveMemory( - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPsk, - tmpbuf, len); - pAd->ApCfg.MBSSID[apidx] - .wdev.WscControl.WpaPskLen = - len; - } -#endif /* WSC_AP_SUPPORT */ - } - } - } -#endif /* CONFIG_AP_SUPPORT */ -} - -static BOOLEAN WPAMakeRsnIeCipher(IN struct _SECURITY_CONFIG *pSecConfig, - IN UCHAR ie_idx, OUT UCHAR *rsn_len) -{ - SEC_RSNIE_TYPE ElememtId = pSecConfig->RSNE_Type[ie_idx]; - PUCHAR pRsnIe = &pSecConfig->RSNE_Content[ie_idx][0]; - UCHAR PairwiseCnt = 0; - *rsn_len = 0; - - if (ElememtId == SEC_RSNIE_WPA1_IE) { - RSNIE *pRsnie_cipher = (RSNIE *)pRsnIe; - UCHAR *rsnie_cipher_oui = - (UCHAR *)pRsnie_cipher + offsetof(RSNIE, ucast[0].oui); - /* Assign OUI and version*/ - NdisMoveMemory(pRsnie_cipher->oui, OUI_WPA_VERSION, 4); - pRsnie_cipher->version = 1; - - /* Group cipher */ - if (IS_CIPHER_WEP40(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP40, 4); - else if (IS_CIPHER_WEP104(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP104, 4); - else if (IS_CIPHER_TKIP(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4); - else if (IS_CIPHER_CCMP128(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_CCMP, 4); - else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("==> %s not support group cipher on WPA1 (GroupCipher=0x%x)\n", - __func__, pSecConfig->GroupCipher)); - return FALSE; - } - - /* Pairwise cipher */ - if (IS_CIPHER_TKIP(pSecConfig->PairwiseCipher)) { - NdisMoveMemory(rsnie_cipher_oui + PairwiseCnt * 4, - OUI_WPA_TKIP, 4); - PairwiseCnt++; - } - - if (IS_CIPHER_CCMP128(pSecConfig->PairwiseCipher)) { - NdisMoveMemory(rsnie_cipher_oui + PairwiseCnt * 4, - OUI_WPA_CCMP, 4); - PairwiseCnt++; - } - - pRsnie_cipher->ucount = PairwiseCnt; - *rsn_len = sizeof(RSNIE) + (4 * (PairwiseCnt - 1)); - /* swap for big-endian platform*/ - pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version); - pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount); - } else if (ElememtId == SEC_RSNIE_WPA2_IE) { - RSNIE2 *pRsnie_cipher = (RSNIE2 *)pRsnIe; - UCHAR *rsnie_cipher_oui = - (UCHAR *)pRsnie_cipher + offsetof(RSNIE2, ucast[0].oui); - /* Assign the verson as 1*/ - pRsnie_cipher->version = 1; - - /* Group cipher */ - if (IS_CIPHER_WEP40(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, - OUI_WPA2_CIPHER_WEP40, 4); - else if (IS_CIPHER_WEP104(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, - OUI_WPA2_CIPHER_WEP104, 4); - else if (IS_CIPHER_TKIP(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, - OUI_WPA2_CIPHER_TKIP, 4); - else if (IS_CIPHER_CCMP128(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, - OUI_WPA2_CIPHER_CCMP128, 4); - else if (IS_CIPHER_CCMP256(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, - OUI_WPA2_CIPHER_CCMP256, 4); - else if (IS_CIPHER_GCMP128(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, - OUI_WPA2_CIPHER_GCMP128, 4); - else if (IS_CIPHER_GCMP256(pSecConfig->GroupCipher)) - NdisMoveMemory(pRsnie_cipher->mcast, - OUI_WPA2_CIPHER_GCMP256, 4); - else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("==> %s not support group cipher on WPA2 (GroupCipher=0x%x)\n", - __func__, pSecConfig->GroupCipher)); - return FALSE; - } - - /* Pairwise cipher */ - if (IS_CIPHER_TKIP(pSecConfig->PairwiseCipher)) { - if (IS_AKM_WPA3PSK(pSecConfig->AKMMap)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("==> %s not support group cipher on SAE\n", - __func__)); - return FALSE; - } - NdisMoveMemory(rsnie_cipher_oui + PairwiseCnt * 4, - OUI_WPA2_CIPHER_TKIP, 4); - PairwiseCnt++; - } - - if (IS_CIPHER_CCMP128(pSecConfig->PairwiseCipher)) { - NdisMoveMemory(rsnie_cipher_oui + PairwiseCnt * 4, - OUI_WPA2_CIPHER_CCMP128, 4); - PairwiseCnt++; - } - - if (IS_CIPHER_CCMP256(pSecConfig->PairwiseCipher)) { - NdisMoveMemory(rsnie_cipher_oui + PairwiseCnt * 4, - OUI_WPA2_CIPHER_CCMP256, 4); - PairwiseCnt++; - } - - if (IS_CIPHER_GCMP128(pSecConfig->PairwiseCipher)) { - NdisMoveMemory(rsnie_cipher_oui + PairwiseCnt * 4, - OUI_WPA2_CIPHER_GCMP128, 4); - PairwiseCnt++; - } - - if (IS_CIPHER_GCMP256(pSecConfig->PairwiseCipher)) { - NdisMoveMemory(rsnie_cipher_oui + PairwiseCnt * 4, - OUI_WPA2_CIPHER_GCMP256, 4); - PairwiseCnt++; - } - - pRsnie_cipher->ucount = PairwiseCnt; - *rsn_len = sizeof(RSNIE2) + (4 * (PairwiseCnt - 1)); - /* swap for big-endian platform*/ - pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version); - pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount); - } - - return TRUE; -} - -static BOOLEAN WPAMakeRsnIeAKM(IN struct _SECURITY_CONFIG *pSecConfig, - IN UINT32 wdev_type, IN UCHAR ie_idx, - OUT UCHAR *rsn_len) -{ - SEC_RSNIE_TYPE ElememtId = pSecConfig->RSNE_Type[ie_idx]; - PRSNIE_AUTH pRsnie_auth = - (RSNIE_AUTH *)(&pSecConfig->RSNE_Content[ie_idx][0] + - (*rsn_len)); - UCHAR *rsnie_auth_oui = - (UCHAR *)pRsnie_auth + offsetof(RSNIE_AUTH, auth[0].oui); - UCHAR AkmCnt = 0; - - if (ElememtId == SEC_RSNIE_WPA1_IE) { - if (IS_AKM_WPA1(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui, OUI_WPA_8021X_AKM, 4); - AkmCnt++; - } else if (IS_AKM_WPA1PSK(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui, OUI_WPA_PSK_AKM, 4); - AkmCnt++; - } else if (IS_AKM_WPANONE(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui, OUI_WPA_NONE_AKM, 4); - AkmCnt++; - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("==> %s not support AKM on WPA1\n", - __func__)); - return FALSE; - } - } else if (ElememtId == SEC_RSNIE_WPA2_IE) { - if (IS_AKM_WPA2(pSecConfig->AKMMap)) { -#ifdef DOT11W_PMF_SUPPORT - - if (pSecConfig->PmfCfg.UsePMFConnect && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA256) && - ((wdev_type == WDEV_TYPE_STA) || - (wdev_type == WDEV_TYPE_APCLI))) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_8021X_SHA256, 4); - AkmCnt++; - } else if (pSecConfig->PmfCfg.PMFSHA256 && - (wdev_type == WDEV_TYPE_AP)) { - CHAR offset = 0; - - if (pSecConfig->PmfCfg.MFPR == FALSE) { - NdisMoveMemory(rsnie_auth_oui + - 4 * AkmCnt, - OUI_WPA2_AKM_8021X, 4); - AkmCnt++; - offset += 4; - } - - NdisMoveMemory(rsnie_auth_oui + offset, - OUI_WPA2_AKM_8021X_SHA256, 4); - AkmCnt++; -#ifdef DOT11R_FT_SUPPORT - - if (IS_AKM_FT_WPA2(pSecConfig->AKMMap)) { - offset += 4; - NdisMoveMemory(rsnie_auth_oui + offset, - OUI_WPA2_AKM_FT_8021X, - 4); - AkmCnt++; - } - -#endif /* DOT11R_FT_SUPPORT */ - } else -#endif /* DOT11W_PMF_SUPPORT */ - { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_8021X, 4); - AkmCnt++; -#ifdef DOT11R_FT_SUPPORT - - if (IS_AKM_FT_WPA2(pSecConfig->AKMMap)) { - CHAR offset = 4; - - NdisMoveMemory(rsnie_auth_oui + offset, - OUI_WPA2_AKM_FT_8021X, - 4); - AkmCnt++; - } - -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_SHA256(pSecConfig->AKMMap)) { - CHAR offset = 4; - - NdisMoveMemory(rsnie_auth_oui + offset, - OUI_WPA2_AKM_FILS_SHA256, - 4); - AkmCnt++; - } else if (IS_AKM_FILS_SHA384( - pSecConfig->AKMMap)) { - CHAR offset = 4; - - NdisMoveMemory(rsnie_auth_oui + offset, - OUI_WPA2_AKM_FILS_SHA384, - 4); - AkmCnt++; - } -#endif /* OCE_FILS_SUPPORT */ - } - } - - if (IS_AKM_WPA2PSK(pSecConfig->AKMMap)) { -#ifdef DOT11W_PMF_SUPPORT - - if (pSecConfig->PmfCfg.UsePMFConnect && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA256) && - ((wdev_type == WDEV_TYPE_STA) || - (wdev_type == WDEV_TYPE_APCLI))) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_PSK_SHA256, 4); - AkmCnt++; - } else if (pSecConfig->PmfCfg.PMFSHA256 && - (wdev_type == WDEV_TYPE_AP)) { - CHAR offset = 0; - - if (pSecConfig->PmfCfg.MFPR == FALSE) { - NdisMoveMemory(rsnie_auth_oui + - 4 * AkmCnt, - OUI_WPA2_AKM_PSK, 4); - AkmCnt++; - offset += 4; - } - - NdisMoveMemory(rsnie_auth_oui + offset, - OUI_WPA2_AKM_PSK_SHA256, 4); - AkmCnt++; -#ifdef DOT11R_FT_SUPPORT - - if (IS_AKM_FT_WPA2PSK(pSecConfig->AKMMap)) { - offset += 4; - NdisMoveMemory(rsnie_auth_oui + offset, - OUI_WPA2_AKM_FT_PSK, 4); - AkmCnt++; - } - -#endif /* DOT11R_FT_SUPPORT */ - } else -#endif /* DOT11W_PMF_SUPPORT */ - { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_PSK, 4); - AkmCnt++; -#ifdef DOT11R_FT_SUPPORT - - if (IS_AKM_FT_WPA2PSK(pSecConfig->AKMMap)) { - CHAR offset = 4; - - NdisMoveMemory(rsnie_auth_oui + offset, - OUI_WPA2_AKM_FT_PSK, 4); - AkmCnt++; - } - -#endif /* DOT11R_FT_SUPPORT */ - } - } - - if (IS_AKM_WPA2_SHA256(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_8021X_SHA256, 4); - AkmCnt++; - } -#ifdef DPP_SUPPORT - if (IS_AKM_DPP(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, DPP_OUI, 4); - AkmCnt++; - } -#endif /* DPP_SUPPORT */ - - if (IS_AKM_WPA2PSK_SHA256(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_PSK_SHA256, 4); - AkmCnt++; - } - -#if defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) - - if (IS_AKM_TDLS(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_TDLS, 4); - AkmCnt++; - } - -#endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) */ -#ifdef DOT11_SAE_SUPPORT - - if (IS_AKM_SAE_SHA256(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_SAE_SHA256, 4); - AkmCnt++; - } - -#ifdef DOT11R_FT_SUPPORT - if (IS_AKM_FT_SAE_SHA256(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_FT_SAE_SHA256, 4); - AkmCnt++; - } -#endif /* DOT11R_FT_SUPPORT */ -#endif /* DOT11_SAE_SUPPORT */ -#if defined(DOT11_SUITEB_SUPPORT) || defined(HOSTAPD_SUITEB_SUPPORT) - - if (IS_AKM_SUITEB_SHA256(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_SUITEB_SHA256, 4); - AkmCnt++; - } - - if (IS_AKM_SUITEB_SHA384(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_SUITEB_SHA384, 4); - AkmCnt++; - } - -#endif /* DOT11_SUITEB_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - - if (IS_AKM_FT_WPA2_SHA384(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_FT_8021X_SHA384, 4); - AkmCnt++; - } - -#endif /* DOT11R_FT_SUPPORT */ - if (IS_AKM_OWE(pSecConfig->AKMMap)) { - NdisMoveMemory(rsnie_auth_oui + 4 * AkmCnt, - OUI_WPA2_AKM_OWE, 4); - AkmCnt++; - } - } - - pRsnie_auth->acount = AkmCnt; - pRsnie_auth->acount = cpu2le16(pRsnie_auth->acount); - /* update current RSNIE length*/ - (*rsn_len) += (sizeof(RSNIE_AUTH) + (4 * (AkmCnt - 1))); - return TRUE; -} - -static BOOLEAN WPAMakeRsnIeCap(IN struct _SECURITY_CONFIG *pSecConfig, - IN UCHAR ie_idx, OUT UCHAR *rsn_len) -{ - SEC_RSNIE_TYPE ElememtId = pSecConfig->RSNE_Type[ie_idx]; -#ifndef DISABLE_HOSTAPD_BEACON - RSN_CAPABILITIES *pRSN_Cap = - (RSN_CAPABILITIES *)(&pSecConfig->RSNE_Content[ie_idx][0] + - (*rsn_len)); -#endif - - if (ElememtId == SEC_RSNIE_WPA2_IE) { -#ifdef DISABLE_HOSTAPD_BEACON - memcpy((&pSecConfig->RSNE_Content[ie_idx][0] + (*rsn_len)), - pSecConfig->RsnCap, 2); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[RSN IE CAP] %s RSN CAP %02x %02x \n", __func__, - pSecConfig->RsnCap[0], pSecConfig->RsnCap[1])); -#else - -#ifdef DOT1X_SUPPORT - pRSN_Cap->field.PreAuth = (pSecConfig->PreAuth == TRUE) ? 1 : 0; -#endif /* DOT1X_SUPPORT */ -#ifdef DOT11W_PMF_SUPPORT - pRSN_Cap->field.MFPC = (pSecConfig->PmfCfg.MFPC) ? 1 : 0; - pRSN_Cap->field.MFPR = (pSecConfig->PmfCfg.MFPR) ? 1 : 0; - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_TRACE, - ("[PMF]%s: RSNIE Capability MFPC=%d, MFPR=%d\n", - __func__, pRSN_Cap->field.MFPC, - pRSN_Cap->field.MFPR)); -#endif /* DOT11W_PMF_SUPPORT */ - pRSN_Cap->word = cpu2le16(pRSN_Cap->word); -#endif /*DISABLE_HOSTAPD_BEACON*/ - (*rsn_len) += sizeof( - RSN_CAPABILITIES); /* update current RSNIE length*/ - } - - return TRUE; -} - -static BOOLEAN WPAInsertRsnIePMKID(IN PMAC_TABLE_ENTRY pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN UCHAR ie_idx, OUT UCHAR *rsn_len) -{ - SEC_RSNIE_TYPE ElememtId = pSecConfig->RSNE_Type[ie_idx]; - UINT8 *pBuf = (&pSecConfig->RSNE_Content[ie_idx][0] + (*rsn_len)); - - if (ElememtId == SEC_RSNIE_WPA2_IE) { -#ifdef DOT11R_FT_SUPPORT - if (pEntry && IS_ENTRY_CLIENT(pEntry) && - pEntry->FT_Status != 0) { - PUINT8 pmkid_ptr = NULL; - UINT8 pmkid_len = 0; - UINT8 extra_len = 0; - UINT16 pmk_count = 0; - - if (pEntry->FT_Status == TX_AUTH_RSP) - pmkid_ptr = pEntry->FT_PMK_R0_NAME; - else - pmkid_ptr = pEntry->FT_PMK_R1_NAME; - - pmkid_len = LEN_PMK_NAME; - - if (pmkid_len > 0 && ((pmkid_len & 0x0f) == 0)) { - extra_len = sizeof(UINT16) + pmkid_len; - - pmk_count = (pmkid_len >> 4); - pmk_count = cpu2le16(pmk_count); - } else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s : no FT PMKID-List included(%d).\n", - __func__, pmkid_len)); - } - - /* Insert PMKID-List field */ - if (extra_len > 0) { - hex_dump("FT_PMKID", pmkid_ptr, pmkid_len); - - NdisMoveMemory(pBuf, &pmk_count, 2); - NdisMoveMemory((pBuf + 2), pmkid_ptr, - pmkid_len); - (*rsn_len) += extra_len; - } - } else -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT11_SAE_SUPPORT - if (IS_AKM_SAE(pSecConfig->AKMMap) && pEntry && - (IS_ENTRY_CLIENT(pEntry) -#ifdef APCLI_SAE_SUPPORT - || IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry) -#endif - ) && - is_pmkid_cache_in_sec_config(pSecConfig)) { - - UINT16 pmk_count = 1; - - pmk_count = cpu2le16(pmk_count); - NdisMoveMemory(pBuf, &pmk_count, sizeof(pmk_count)); - NdisMoveMemory(pBuf + sizeof(pmk_count), - pSecConfig->pmkid, LEN_PMKID); - (*rsn_len) += sizeof(pmk_count) + LEN_PMKID; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: (SAE) including the PMKID.\n", - __func__)); - } else -#endif -#ifdef DPP_SUPPORT - if (IS_AKM_DPP(pSecConfig->AKMMap) && pEntry && - (IS_ENTRY_CLIENT(pEntry) || - IS_ENTRY_APCLI(pEntry)) && - is_pmkid_cache_in_sec_config(pSecConfig)) { - - UINT16 pmk_count = 1; - - pmk_count = cpu2le16(pmk_count); - NdisMoveMemory(pBuf, &pmk_count, sizeof(pmk_count)); - NdisMoveMemory(pBuf + sizeof(pmk_count), - pSecConfig->pmkid, LEN_PMKID); - (*rsn_len) += sizeof(pmk_count) + LEN_PMKID; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: (DPP) including the PMKID.\n", - __func__)); - } else -#endif - - if (IS_AKM_OWE(pSecConfig->AKMMap) && pEntry && - (IS_ENTRY_CLIENT(pEntry) -#ifdef APCLI_OWE_SUPPORT - || IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry) -#endif - ) && - is_pmkid_cache_in_sec_config(pSecConfig)) { - UINT16 pmk_count = 1; - - pmk_count = cpu2le16(pmk_count); - NdisMoveMemory(pBuf, &pmk_count, sizeof(pmk_count)); - NdisMoveMemory(pBuf + sizeof(pmk_count), - pSecConfig->pmkid, LEN_PMKID); - (*rsn_len) += sizeof(pmk_count) + LEN_PMKID; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: (OWE) including the PMKID.\n", - __func__)); - } -#ifdef DOT11W_PMF_SUPPORT - else if (pSecConfig->PmfCfg.MFPC) { - UCHAR ZeroPmkID[2] = { 0x00, 0x00 }; - - NdisMoveMemory(pBuf, ZeroPmkID, 2); - (*rsn_len) += 2; - } else -#endif /* DOT11W_PMF_SUPPORT */ - if (0) - ; /* for build pass */ - } - - return TRUE; -} - -VOID WPAMakeRSNIE(IN UINT32 wdev_type, IN struct _SECURITY_CONFIG *pSecConfig, - IN PMAC_TABLE_ENTRY pEntry) -{ - UCHAR ie_idx = 0; - - /* Initiate some related information */ - for (ie_idx = 0; ie_idx < SEC_RSNIE_NUM; ie_idx++) { - pSecConfig->RSNE_Type[ie_idx] = SEC_RSNIE_NONE; - pSecConfig->RSNE_Len[ie_idx] = 0; - NdisZeroMemory(pSecConfig->RSNE_Content[ie_idx], - MAX_LEN_OF_RSNIE); - } - - /* Check AKM support per wdev type */ - switch (wdev_type) { -#ifdef CONFIG_AP_SUPPORT - - case WDEV_TYPE_AP: - if ((pSecConfig->AKMMap & AKM_AP_MASK) == 0) - return; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> %s(AP)\n", __func__)); - break; -#endif /* CONFIG_AP_SUPPORT */ -#ifdef APCLI_SUPPORT - - case WDEV_TYPE_APCLI: - /* Only support WPAPSK or WPA2PSK for AP-Client mode */ - { - if ((pSecConfig->AKMMap & AKM_APCLI_MASK) == 0) - return; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> %s(ApCli)\n", __func__)); - } - - break; -#endif /* APCLI_SUPPORT */ - } - - if (IS_AKM_WPA1(pSecConfig->AKMMap) || - IS_AKM_WPA1PSK(pSecConfig->AKMMap) || - IS_AKM_WPANONE(pSecConfig->AKMMap)) { - pSecConfig->RSNE_Type[0] = SEC_RSNIE_WPA1_IE; - pSecConfig->RSNE_EID[0][0] = IE_WPA; - } - - if (IS_AKM_WPA2(pSecConfig->AKMMap) || - IS_AKM_WPA2PSK(pSecConfig->AKMMap) || - IS_AKM_WPA3PSK(pSecConfig->AKMMap) || -#ifdef DPP_SUPPORT - IS_AKM_DPP(pSecConfig->AKMMap) || -#endif /* DPP_SUPPORT */ - IS_AKM_WPA3_192BIT(pSecConfig->AKMMap) || - IS_AKM_OWE(pSecConfig->AKMMap)) { - pSecConfig->RSNE_Type[1] = SEC_RSNIE_WPA2_IE; - pSecConfig->RSNE_EID[1][0] = IE_WPA2; - } - - for (ie_idx = 0; ie_idx < SEC_RSNIE_NUM; ie_idx++) { - UCHAR p_offset = 0; - - if (pSecConfig->RSNE_Type[ie_idx] == SEC_RSNIE_NONE) - continue; - - else { - /* Build the primary RSNIE*/ - /* 1. insert cipher suite*/ - if (WPAMakeRsnIeCipher(pSecConfig, ie_idx, &p_offset) == - FALSE) - continue; - - ASSERT(p_offset < 255); - - if (p_offset >= 255) - continue; - - /* 2. insert AKM*/ - if (WPAMakeRsnIeAKM(pSecConfig, wdev_type, ie_idx, - &p_offset) == FALSE) - continue; - - ASSERT(p_offset < 255); - - if (p_offset >= 255) - continue; - - /* 3. insert capability*/ - if (WPAMakeRsnIeCap(pSecConfig, ie_idx, &p_offset) == - FALSE) - continue; - - ASSERT(p_offset < 255); - - if (p_offset >= 255) - continue; - - /* 4. Insert PMKID */ - if (WPAInsertRsnIePMKID(pEntry, pSecConfig, ie_idx, - &p_offset) == FALSE) - continue; - - ASSERT(p_offset < 255); - - if (p_offset >= 255) - continue; - -#ifdef DOT11W_PMF_SUPPORT - - /* 5. Insert Group Management Cipher*/ - if (PMF_MakeRsnIeGMgmtCipher(pSecConfig, ie_idx, - &p_offset) == FALSE) - continue; - - ASSERT(p_offset < 255); - - if (p_offset >= 255) - continue; - -#endif /* DOT11W_PMF_SUPPORT */ - pSecConfig->RSNE_Len[ie_idx] = p_offset; - hex_dump("The RSNE", - &pSecConfig->RSNE_Content[ie_idx][0], - pSecConfig->RSNE_Len[ie_idx]); - } - } -} - -BOOLEAN WPACheckGroupCipher(IN struct _SECURITY_CONFIG *pSecConfigSelf, - IN struct _SECURITY_CONFIG *pSecConfigEntry, - IN PEID_STRUCT eid_ptr) -{ - CHAR *pCipher = NULL; - - if (eid_ptr->Len >= 6) { - /* WPA and WPA2 format not the same in RSN_IE */ - if (eid_ptr->Eid == IE_WPA) { - if (IS_CIPHER_TKIP(pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA_TKIP; - SET_CIPHER_TKIP(pSecConfigEntry->GroupCipher); - } else if (IS_CIPHER_CCMP128( - pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA_CCMP; - SET_CIPHER_CCMP128( - pSecConfigEntry->GroupCipher); - } - - if (pCipher && - NdisEqualMemory(&eid_ptr->Octet[6], pCipher, 4)) - return TRUE; - } else if (eid_ptr->Eid == IE_WPA2) { - if (IS_CIPHER_WEP40(pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA2_CIPHER_WEP40; - SET_CIPHER_WEP40(pSecConfigEntry->GroupCipher); - } else if (IS_CIPHER_WEP104( - pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA2_CIPHER_WEP104; - SET_CIPHER_WEP104(pSecConfigEntry->GroupCipher); - } else if (IS_CIPHER_TKIP( - pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA2_CIPHER_TKIP; - SET_CIPHER_TKIP(pSecConfigEntry->GroupCipher); - } else if (IS_CIPHER_CCMP128( - pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA2_CIPHER_CCMP128; - SET_CIPHER_CCMP128( - pSecConfigEntry->GroupCipher); - } else if (IS_CIPHER_CCMP256( - pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA2_CIPHER_CCMP256; - SET_CIPHER_CCMP256( - pSecConfigEntry->GroupCipher); - } else if (IS_CIPHER_GCMP128( - pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA2_CIPHER_GCMP128; - SET_CIPHER_GCMP128( - pSecConfigEntry->GroupCipher); - } else if (IS_CIPHER_GCMP256( - pSecConfigSelf->GroupCipher)) { - pCipher = OUI_WPA2_CIPHER_GCMP256; - SET_CIPHER_GCMP256( - pSecConfigEntry->GroupCipher); - } - - if (pCipher && - NdisEqualMemory(&eid_ptr->Octet[2], pCipher, 4)) - return TRUE; - } - } - - CLEAR_GROUP_CIPHER(pSecConfigEntry); - return FALSE; -} - -BOOLEAN WPACheckUcast(IN struct _SECURITY_CONFIG *pSecConfigSelf, - IN struct _SECURITY_CONFIG *pSecConfigEntry, - IN PEID_STRUCT eid_ptr) -{ - PUCHAR pStaTmp; - USHORT Count, i; - - /* Store STA RSN_IE capability */ - pStaTmp = (PUCHAR)&eid_ptr->Octet[0]; - - if (eid_ptr->Eid == IE_WPA2) { - /* skip Version(2),Multicast cipter(4) 2+4==6 */ - /* point to number of unicast */ - pStaTmp += 6; - } else if (eid_ptr->Eid == IE_WPA) { - /* skip OUI(4),Vesrion(2),Multicast cipher(4) 4+2+4==10 */ - /* point to number of unicast */ - pStaTmp += 10; - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid IE=%d\n", __func__, - eid_ptr->Eid)); - return FALSE; - } - - /* Store unicast cipher count */ - NdisMoveMemory(&Count, pStaTmp, sizeof(USHORT)); - Count = cpu2le16(Count); - /* pointer to unicast cipher */ - pStaTmp += sizeof(USHORT); - - for (i = 0; i < Count; i++) { - if (eid_ptr->Eid == IE_WPA) { - if (NdisEqualMemory(pStaTmp, &OUI_WPA_TKIP, 4)) - SET_CIPHER_TKIP( - pSecConfigEntry->PairwiseCipher); - else if (NdisEqualMemory(pStaTmp, &OUI_WPA_CCMP, 4)) - SET_CIPHER_CCMP128( - pSecConfigEntry->PairwiseCipher); - } else if (eid_ptr->Eid == IE_WPA2) { - if (NdisEqualMemory(pStaTmp, &OUI_WPA2_CIPHER_TKIP, 4)) - SET_CIPHER_TKIP( - pSecConfigEntry->PairwiseCipher); - else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_CIPHER_CCMP128, 4)) - SET_CIPHER_CCMP128( - pSecConfigEntry->PairwiseCipher); - else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_CIPHER_CCMP256, 4)) - SET_CIPHER_CCMP256( - pSecConfigEntry->PairwiseCipher); - else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_CIPHER_GCMP128, 4)) - SET_CIPHER_GCMP128( - pSecConfigEntry->PairwiseCipher); - else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_CIPHER_GCMP256, 4)) - SET_CIPHER_GCMP256( - pSecConfigEntry->PairwiseCipher); - } - - pStaTmp += 4; - Count--; - } - - if ((pSecConfigSelf->PairwiseCipher & pSecConfigEntry->PairwiseCipher) > - 0) - return TRUE; - - CLEAR_PAIRWISE_CIPHER(pSecConfigEntry); - return FALSE; -} - -BOOLEAN WPACheckAKM(IN struct _SECURITY_CONFIG *pSecConfigSelf, - IN struct _SECURITY_CONFIG *pSecConfigEntry, - IN PEID_STRUCT eid_ptr) -{ - PUCHAR pStaTmp; - USHORT Count, i; - - /* Store STA RSN_IE capability */ - pStaTmp = (PUCHAR)&eid_ptr->Octet[0]; - - if (eid_ptr->Eid == IE_WPA2) { - /* skip Version(2),Multicast cipter(4) 2+4==6 */ - /* point to number of unicast */ - pStaTmp += 6; - } else if (eid_ptr->Eid == IE_WPA) { - /* skip OUI(4),Vesrion(2),Multicast cipher(4) 4+2+4==10 */ - /* point to number of unicast */ - pStaTmp += 10; - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s ==> Unknown WPAIE, WPAIE=%d\n", __func__, - eid_ptr->Eid)); - return FALSE; - } - - /* Store unicast cipher count */ - NdisMoveMemory(&Count, pStaTmp, sizeof(USHORT)); - Count = cpu2le16(Count); - /* pointer to unicast cipher */ - pStaTmp += sizeof(USHORT); - /* Skip all unicast cipher suite */ - pStaTmp += 4 * Count; - /* Store AKM count */ - NdisMoveMemory(&Count, pStaTmp, sizeof(USHORT)); - Count = cpu2le16(Count); - /*pointer to AKM cipher */ - pStaTmp += sizeof(USHORT); - - /* Ellis todo: if akm count > 1, key_deri_alg will be overwriten, pmf akm workaround need to be fixed first */ - for (i = 0; i < Count; i++) { - if (eid_ptr->Eid == IE_WPA) { - if (NdisEqualMemory(pStaTmp, &OUI_WPA_8021X_AKM, 4)) - SET_AKM_WPA1(pSecConfigEntry->AKMMap); - else if (NdisEqualMemory(pStaTmp, &OUI_WPA_PSK_AKM, 4)) - SET_AKM_WPA1PSK(pSecConfigEntry->AKMMap); - } else if (eid_ptr->Eid == IE_WPA2) { - if (NdisEqualMemory(pStaTmp, &OUI_WPA2_AKM_8021X, 4)) { - SET_AKM_WPA2(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA1; - } else if (NdisEqualMemory(pStaTmp, &OUI_WPA2_AKM_PSK, - 4)) { - SET_AKM_WPA2PSK(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA1; - } -#ifdef DOT11R_FT_SUPPORT - else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_FT_8021X, 4)) { - SET_AKM_FT_WPA2(pSecConfigEntry->AKMMap); - SET_AKM_WPA2(pSecConfigEntry->AKMMap); - } else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_FT_PSK, 4)) { - SET_AKM_FT_WPA2PSK(pSecConfigEntry->AKMMap); - SET_AKM_WPA2PSK(pSecConfigEntry->AKMMap); - } -#endif /* DOT11R_FT_SUPPORT */ - else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_8021X_SHA256, - 4)) { -#ifdef DOT11W_PMF_SUPPORT - SET_AKM_WPA2(pSecConfigEntry->AKMMap); -#else - SET_AKM_WPA2_SHA256(pSecConfigEntry->AKMMap); -#endif /* DOT11W_PMF_SUPPORT */ - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - } else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_PSK_SHA256, - 4)) { -#ifdef DOT11W_PMF_SUPPORT - SET_AKM_WPA2PSK(pSecConfigEntry->AKMMap); -#else - SET_AKM_WPA2PSK_SHA256(pSecConfigEntry->AKMMap); -#endif /* DOT11W_PMF_SUPPORT */ - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - } else if (NdisEqualMemory(pStaTmp, &OUI_WPA2_AKM_TDLS, - 4)) - SET_AKM_TDLS(pSecConfigEntry->AKMMap); - else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_SAE_SHA256, 4)) { - SET_AKM_SAE_SHA256(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - } else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_FT_SAE_SHA256, - 4)) { - SET_AKM_FT_SAE_SHA256(pSecConfigEntry->AKMMap); - SET_AKM_SAE_SHA256(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - } else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_SUITEB_SHA256, - 4)) { - SET_AKM_SUITEB_SHA256(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - } else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_SUITEB_SHA384, - 4)) { - SET_AKM_SUITEB_SHA384(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA384; - } else if (NdisEqualMemory( - pStaTmp, - &OUI_WPA2_AKM_FT_8021X_SHA384, 4)) { - SET_AKM_FT_WPA2_SHA384(pSecConfigEntry->AKMMap); - SET_AKM_SUITEB_SHA384(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA384; - } else if (NdisEqualMemory(pStaTmp, &OUI_WPA2_AKM_OWE, - 4)) { - SET_AKM_OWE(pSecConfigEntry->AKMMap); - /* OWE cannot derive key_deri_alg by OWE akm. - * it shall parse ECDH parameter to determine it. - * set a temporary alg here. - */ - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - } -#ifdef OCE_FILS_SUPPORT - else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_FILS_SHA256, - 4)) { - SET_AKM_FILS_SHA256(pSecConfigEntry->AKMMap); - SET_AKM_WPA2(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - } else if (NdisEqualMemory(pStaTmp, - &OUI_WPA2_AKM_FILS_SHA384, - 4)) { - SET_AKM_FILS_SHA384(pSecConfigEntry->AKMMap); - SET_AKM_WPA2(pSecConfigEntry->AKMMap); - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA384; - } -#endif /* OCE_FILS_SUPPORT */ -#ifdef DPP_SUPPORT - else if (NdisEqualMemory(pStaTmp, DPP_OUI, 4)) { - SET_AKM_DPP(pSecConfigEntry->AKMMap); - /* TODO, need to check for prime number and select kdf accordingly*/ - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s Setting dpp akm\n", __func__)); - } -#endif /* DPP_SUPPORT */ - } - - pStaTmp += 4; - } - - if ((pSecConfigSelf->AKMMap & pSecConfigEntry->AKMMap) > 0) - return TRUE; - - CLEAR_SEC_AKM(pSecConfigEntry->AKMMap); - return FALSE; -} - -static BOOLEAN wpa_check_pmkid(IN PUINT8 rsnie_ptr, IN UINT rsnie_len, - IN UINT32 akm) -{ - return TRUE; -} - -/* Ellis: not ready for WAPI */ -BOOLEAN wpa_rsne_sanity(IN PUCHAR rsnie_ptr, IN UCHAR rsnie_len, - OUT UCHAR *end_field) -{ - EID_STRUCT *eid_ptr; - PUCHAR pStaTmp; - USHORT ver; - USHORT Count; - UCHAR len = 0; - - eid_ptr = (EID_STRUCT *)rsnie_ptr; - - if ((eid_ptr->Len + 2) != rsnie_len) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : the len is invalid !!!\n", __func__)); - return FALSE; - } - - if (eid_ptr->Len < MIN_LEN_OF_RSNIE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : len is too short(len = %d) !!!\n", - __func__, eid_ptr->Len)); - return FALSE; - } - - /* Store STA RSN_IE capability */ - pStaTmp = (PUCHAR)&eid_ptr->Octet[0]; - - /* check Element ID */ - if (eid_ptr->Eid == IE_WPA2) - ; - else if (eid_ptr->Eid == IE_WPA) { - /* skip OUI(4) */ - pStaTmp += 4; - len += 4; - } else if (eid_ptr->Eid == IE_WAPI) - return TRUE; - else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid IE=%d\n", __func__, - eid_ptr->Eid)); - return FALSE; - } - - /* check version */ - len += 2; - if (eid_ptr->Len < len) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : no version(len = %d)\n", __func__, - eid_ptr->Len)); - return FALSE; - } - NdisMoveMemory(&ver, pStaTmp, sizeof(ver)); - ver = cpu2le16(ver); - - if (ver != 1) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : unknown version(%d)\n", __func__, ver)); - return FALSE; - } - - if (eid_ptr->Len == len) { - /* None of the optional fields are included in the RSNE */ - *end_field = RSN_FIELD_NONE; - return TRUE; - } - - pStaTmp += sizeof(USHORT); - - /* check group cipher suite */ - len += LEN_OUI_SUITE; - if (eid_ptr->Len < len) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : group cipher is truncated(len = %d)\n", - __func__, eid_ptr->Len)); - return FALSE; - } else if (eid_ptr->Len == len) { - /* Group Data Cipher Suite are included in the RSNE */ - *end_field = RSN_FIELD_GROUP_CIPHER; - return TRUE; - } - - pStaTmp += LEN_OUI_SUITE; - - /* check pairwise cipher suite */ - len += 2; - if (eid_ptr->Len < len) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : pairwise cipher suite cnt is truncated(%d)\n", - __func__, eid_ptr->Len)); - return FALSE; - } - - /* Store pairwise cipher count */ - NdisMoveMemory(&Count, pStaTmp, sizeof(USHORT)); - Count = cpu2le16(Count); - - len += Count * LEN_OUI_SUITE; - - if (eid_ptr->Len < len) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : Pairwise Cipher Suite is truncated(len %d)\n", - __func__, eid_ptr->Len)); - return FALSE; - } else if (eid_ptr->Len == len) { - /* Pairwise Cipher Suite are included in the RSNE */ - *end_field = RSN_FIELD_PAIRWISE_CIPHER; - return TRUE; - } - - pStaTmp += sizeof(USHORT) + Count * LEN_OUI_SUITE; - - /* check akm suite */ - len += 2; - if (eid_ptr->Len < len) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : akm suite cnt is truncated(%d)\n", - __func__, eid_ptr->Len)); - return FALSE; - } - - /* Store akm count */ - NdisMoveMemory(&Count, pStaTmp, sizeof(USHORT)); - Count = cpu2le16(Count); - - len += Count * LEN_OUI_SUITE; - if (eid_ptr->Len < len) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : Akm Suite is truncated(len %d)\n", - __func__, eid_ptr->Len)); - return FALSE; - } else if (eid_ptr->Len == len) { - /* akm Suite are included in the RSNE */ - *end_field = RSN_FIELD_AKM; - return TRUE; - } - - pStaTmp += sizeof(USHORT) + Count * LEN_OUI_SUITE; - - /* check rsn capabilities */ - len += 2; - if (eid_ptr->Len < len) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : RSN capabilities is truncated(len %d)\n", - __func__, eid_ptr->Len)); - return FALSE; - } else if (eid_ptr->Len == len) { - /* rsn capabilities are included in the RSNE */ - *end_field = RSN_FIELD_RSN_CAP; - return TRUE; - } - - pStaTmp += 2; - - /* check PMKID */ - len += 2; - if (eid_ptr->Len < len) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : pmkid cnt is truncated(%d)\n", __func__, - eid_ptr->Len)); - return FALSE; - } - - /* Store pmkid count */ - NdisMoveMemory(&Count, pStaTmp, sizeof(USHORT)); - Count = cpu2le16(Count); - - len += Count * 16; - - if (eid_ptr->Len < len) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : PMKID is truncated(len %d)\n", __func__, - eid_ptr->Len)); - return FALSE; - } else if (eid_ptr->Len == len) { - /* PMKID are included in the RSNE */ - *end_field = RSN_FIELD_PMKID; - return TRUE; - } - - pStaTmp += 2 + Count * 16; - -#ifdef DOT11W_PMF_SUPPORT - /* check Group Management Cipher Suite*/ - len += LEN_OUI_SUITE; - if (eid_ptr->Len < len) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : Group Management Cipher Suite is truncated(len %d)\n", - __func__, eid_ptr->Len)); - return FALSE; - } else if (eid_ptr->Len == len) { - /* PMKID are included in the RSNE */ - *end_field = RSN_FIELD_GROUP_MGMT_CIPHER; - return TRUE; - } - - pStaTmp += LEN_OUI_SUITE; -#endif - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : extensible element len %d\n", __func__, - eid_ptr->Len - len)); - *end_field = RSN_FIELD_EXTENSIBLE_ELE; - return TRUE; -} - -UINT WPAValidateRSNIE(IN struct _SECURITY_CONFIG *pSecConfigSelf, - IN struct _SECURITY_CONFIG *pSecConfigEntry, - IN PUCHAR pRsnIe, IN UCHAR rsnie_len) -{ - PEID_STRUCT eid_ptr; - UCHAR end_field = 0; - UINT res = MLME_SUCCESS; -#ifdef DOT1X_SUPPORT - pSecConfigEntry->IEEE8021X = pSecConfigSelf->IEEE8021X; -#endif /* DOT1X_SUPPORT */ - - if (rsnie_len == 0) { - if ((IS_AKM_OPEN(pSecConfigSelf->AKMMap) && - IS_CIPHER_NONE(pSecConfigSelf->PairwiseCipher)) || - IS_AKM_WPA1(pSecConfigEntry->AKMMap) || - IS_AKM_WPA1PSK(pSecConfigEntry->AKMMap) || - IS_CIPHER_WEP(pSecConfigEntry->PairwiseCipher)) - return MLME_SUCCESS; - else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Encryption of the AP can't allow sta with use None Encryptype access\n", - __func__)); - return MLME_CANNOT_SUPPORT_CAP; - } - } - - eid_ptr = (PEID_STRUCT)pRsnIe; - - if (wpa_rsne_sanity(pRsnIe, rsnie_len, &end_field) == FALSE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : wpa_rsne_sanity fail\n", __func__)); - return MLME_UNSPECIFY_FAIL; - } - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : peer RSNE end field is %d\n", __func__, end_field)); - - /* Check group cipher */ - if ((end_field >= RSN_FIELD_GROUP_CIPHER) && - !WPACheckGroupCipher(pSecConfigSelf, pSecConfigEntry, eid_ptr)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid group cipher !!!\n", __func__)); - return MLME_INVALID_GROUP_CIPHER; - } else if (end_field < RSN_FIELD_GROUP_CIPHER && - IS_CIPHER_CCMP128(pSecConfigSelf->GroupCipher)) - pSecConfigEntry->GroupCipher = pSecConfigSelf->GroupCipher; - else if (end_field < RSN_FIELD_GROUP_CIPHER) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid group cipher(peer use default cipher) !!!\n", - __func__)); - return MLME_INVALID_GROUP_CIPHER; - } - - /* Check pairwise cipher */ - if ((end_field >= RSN_FIELD_PAIRWISE_CIPHER) && - !WPACheckUcast(pSecConfigSelf, pSecConfigEntry, eid_ptr)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid pairwise cipher !!!\n", - __func__)); - return MLME_INVALID_PAIRWISE_CIPHER; - } else if (end_field < RSN_FIELD_PAIRWISE_CIPHER && - IS_CIPHER_CCMP128(pSecConfigSelf->PairwiseCipher)) - pSecConfigEntry->PairwiseCipher = - pSecConfigSelf - ->PairwiseCipher; /* Ellis todo mixed mode */ - else if (end_field < RSN_FIELD_PAIRWISE_CIPHER) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid pairwise cipher(peer use default cipher) !!!\n", - __func__)); - return MLME_INVALID_PAIRWISE_CIPHER; - } - - /* Check AKM */ - if ((end_field >= RSN_FIELD_AKM) && - !WPACheckAKM(pSecConfigSelf, pSecConfigEntry, eid_ptr)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid AKM !!!\n", __func__)); - return MLME_INVALID_AKMP; - } else if (end_field < RSN_FIELD_AKM && - IS_AKM_WPA2(pSecConfigSelf->AKMMap)) - pSecConfigEntry->AKMMap = - pSecConfigSelf->AKMMap; /* Ellis todo mixed mode */ - else if (end_field < RSN_FIELD_AKM) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid AKM(peer use default akm) !!!\n", - __func__)); - return MLME_INVALID_AKMP; - } - /* Check PMKID */ - if ((end_field >= RSN_FIELD_PMKID) && - !wpa_check_pmkid(pRsnIe, rsnie_len, pSecConfigEntry->AKMMap)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : invalid PMKID !!!\n", __func__)); - return MLME_UNSPECIFY_FAIL; - } -#ifdef DOT11W_PMF_SUPPORT - else { - res = PMF_RsnCapableValidation( - pRsnIe, rsnie_len, pSecConfigSelf->PmfCfg.MFPC, - pSecConfigSelf->PmfCfg.MFPR, - pSecConfigSelf->PmfCfg.igtk_cipher, end_field, - pSecConfigEntry); - if (res != MLME_SUCCESS) - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Invalid PMF Capability !!!\n", - __func__)); - } - -#endif /* DOT11W_PMF_SUPPORT */ - return res; -} - -VOID WpaDerivePTK(IN UCHAR *PMK, IN UCHAR *ANonce, IN UCHAR *AA, - IN UCHAR *SNonce, IN UCHAR *SA, OUT UCHAR *output, - IN UINT len) -{ - UCHAR concatenation[76]; - UINT CurrPos = 0; - UCHAR temp[32]; - UCHAR Prefix[] = { 'P', 'a', 'i', 'r', 'w', 'i', 's', 'e', - ' ', 'k', 'e', 'y', ' ', 'e', 'x', 'p', - 'a', 'n', 's', 'i', 'o', 'n' }; - /* initiate the concatenation input*/ - NdisZeroMemory(temp, sizeof(temp)); - NdisZeroMemory(concatenation, 76); - - /* Get smaller address*/ - if (RTMPCompareMemory(SA, AA, 6) == 1) - NdisMoveMemory(concatenation, AA, 6); - else - NdisMoveMemory(concatenation, SA, 6); - - CurrPos += 6; - - /* Get larger address*/ - if (RTMPCompareMemory(SA, AA, 6) == 1) - NdisMoveMemory(&concatenation[CurrPos], SA, 6); - else - NdisMoveMemory(&concatenation[CurrPos], AA, 6); - - /* store the larger mac address for backward compatible of */ - /* ralink proprietary STA-key issue */ - NdisMoveMemory(temp, &concatenation[CurrPos], MAC_ADDR_LEN); - CurrPos += 6; - - /* Get smaller Nonce*/ - if (RTMPCompareMemory(ANonce, SNonce, 32) == 0) - NdisMoveMemory( - &concatenation[CurrPos], temp, - 32); /* patch for ralink proprietary STA-key issue*/ - else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1) - NdisMoveMemory(&concatenation[CurrPos], SNonce, 32); - else - NdisMoveMemory(&concatenation[CurrPos], ANonce, 32); - - CurrPos += 32; - - /* Get larger Nonce*/ - if (RTMPCompareMemory(ANonce, SNonce, 32) == 0) - NdisMoveMemory( - &concatenation[CurrPos], temp, - 32); /* patch for ralink proprietary STA-key issue*/ - else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1) - NdisMoveMemory(&concatenation[CurrPos], ANonce, 32); - else - NdisMoveMemory(&concatenation[CurrPos], SNonce, 32); - - CurrPos += 32; - /* Use PRF to generate PTK*/ - PRF(PMK, LEN_PMK, Prefix, 22, concatenation, 76, output, len); -} - -/* - ======================================================================== - - Routine Description: - It utilizes PRF-384 or PRF-512 to derive session-specific keys from a PMK. - It shall be called by 4-way handshake processing. - Note: - Refer to IEEE 802.11i-2004 8.5.1.2 - - ======================================================================== -*/ - -VOID WpaDerivePTK_KDF_256(IN UCHAR *PMK, IN UCHAR *ANonce, IN UCHAR *AA, - IN UCHAR *SNonce, IN UCHAR *SA, OUT UCHAR *output, - IN UINT len) -{ - UCHAR concatenation[76]; - UINT CurrPos = 0; - UCHAR temp[32]; - UCHAR Prefix[] = { 'P', 'a', 'i', 'r', 'w', 'i', 's', 'e', - ' ', 'k', 'e', 'y', ' ', 'e', 'x', 'p', - 'a', 'n', 's', 'i', 'o', 'n' }; - /* initiate the concatenation input */ - NdisZeroMemory(temp, sizeof(temp)); - NdisZeroMemory(concatenation, 76); - - /* Get smaller address */ - if (RTMPCompareMemory(SA, AA, 6) == 1) - NdisMoveMemory(concatenation, AA, 6); - else - NdisMoveMemory(concatenation, SA, 6); - - CurrPos += 6; - - /* Get larger address */ - if (RTMPCompareMemory(SA, AA, 6) == 1) - NdisMoveMemory(&concatenation[CurrPos], SA, 6); - else - NdisMoveMemory(&concatenation[CurrPos], AA, 6); - - /* store the larger mac address for backward compatible of - ralink proprietary STA-key issue */ - NdisMoveMemory(temp, &concatenation[CurrPos], MAC_ADDR_LEN); - CurrPos += 6; - - /* Get smaller Nonce */ - if (RTMPCompareMemory(ANonce, SNonce, 32) == 0) - NdisMoveMemory(&concatenation[CurrPos], temp, 32); - else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1) - NdisMoveMemory(&concatenation[CurrPos], SNonce, 32); - else - NdisMoveMemory(&concatenation[CurrPos], ANonce, 32); - - CurrPos += 32; - - /* Get larger Nonce */ - if (RTMPCompareMemory(ANonce, SNonce, 32) == 0) - NdisMoveMemory(&concatenation[CurrPos], temp, 32); - else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1) - NdisMoveMemory(&concatenation[CurrPos], ANonce, 32); - else - NdisMoveMemory(&concatenation[CurrPos], SNonce, 32); - - CurrPos += 32; - hex_dump("[PMF]PMK", PMK, LEN_PMK); - hex_dump("[PMF]concatenation=", concatenation, 76); - /* Calculate a key material through FT-KDF */ - - /*TODO: temporary mofification here, will move the length of pmk at outside.*/ - if (len > LEN_AES_PTK) - KDF(PMK, LEN_PMK_SHA384, Prefix, 22, concatenation, 76, output, - len); - else - KDF(PMK, LEN_PMK, Prefix, 22, concatenation, 76, output, len); -} - -/* - ======================================================================== - - Routine Description: - It utilizes PRF-384 or PRF-512 to derive session-specific keys from a PMK. - It shall be called by 4-way handshake processing. - Note: - Refer to IEEE 802.11i-2004 8.5.1.2 - - ======================================================================== -*/ - -VOID WpaDerivePTK_KDF_384(IN UCHAR *PMK, IN UCHAR *ANonce, IN UCHAR *AA, - IN UCHAR *SNonce, IN UCHAR *SA, OUT UCHAR *output, - IN UINT len) -{ - UCHAR concatenation[76]; - UINT CurrPos = 0; - UCHAR temp[32]; - UCHAR Prefix[] = { 'P', 'a', 'i', 'r', 'w', 'i', 's', 'e', - ' ', 'k', 'e', 'y', ' ', 'e', 'x', 'p', - 'a', 'n', 's', 'i', 'o', 'n' }; - /* initiate the concatenation input */ - NdisZeroMemory(temp, sizeof(temp)); - NdisZeroMemory(concatenation, 76); - - /* Get smaller address */ - if (RTMPCompareMemory(SA, AA, 6) == 1) - NdisMoveMemory(concatenation, AA, 6); - else - NdisMoveMemory(concatenation, SA, 6); - - CurrPos += 6; - - /* Get larger address */ - if (RTMPCompareMemory(SA, AA, 6) == 1) - NdisMoveMemory(&concatenation[CurrPos], SA, 6); - else - NdisMoveMemory(&concatenation[CurrPos], AA, 6); - - /* store the larger mac address for backward compatible of - ralink proprietary STA-key issue */ - NdisMoveMemory(temp, &concatenation[CurrPos], MAC_ADDR_LEN); - CurrPos += 6; - - /* Get smaller Nonce */ - if (RTMPCompareMemory(ANonce, SNonce, 32) == 0) - NdisMoveMemory(&concatenation[CurrPos], temp, 32); - else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1) - NdisMoveMemory(&concatenation[CurrPos], SNonce, 32); - else - NdisMoveMemory(&concatenation[CurrPos], ANonce, 32); - - CurrPos += 32; - - /* Get larger Nonce */ - if (RTMPCompareMemory(ANonce, SNonce, 32) == 0) - NdisMoveMemory(&concatenation[CurrPos], temp, 32); - else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1) - NdisMoveMemory(&concatenation[CurrPos], ANonce, 32); - else - NdisMoveMemory(&concatenation[CurrPos], SNonce, 32); - - CurrPos += 32; - hex_dump("[PMF]PMK", PMK, LEN_PMK_SHA384); - hex_dump("[PMF]concatenation=", concatenation, 76); - /* Calculate a key material through FT-KDF */ - KDF_384(PMK, LEN_PMK_SHA384, Prefix, 22, concatenation, 76, output, - len); -} - -VOID WpaDeriveGTK(IN UCHAR *GMK, IN UCHAR *GNonce, IN UCHAR *AA, - OUT UCHAR *output, IN UINT len) -{ - UCHAR concatenation[76]; - UINT CurrPos = 0; - UCHAR temp[80]; - UCHAR Prefix[] = { 'G', 'r', 'o', 'u', 'p', ' ', 'k', 'e', 'y', ' ', - 'e', 'x', 'p', 'a', 'n', 's', 'i', 'o', 'n' }; - - NdisMoveMemory(&concatenation[CurrPos], AA, 6); - CurrPos += 6; - NdisMoveMemory(&concatenation[CurrPos], GNonce, 32); - CurrPos += 32; - PRF(GMK, LEN_PMK, Prefix, 19, concatenation, 38, temp, len); - NdisMoveMemory(output, temp, len); -} - -VOID WPA_ConstructKdeHdr(IN UINT8 data_type, IN UINT8 data_len, OUT PUCHAR pBuf) -{ - PKDE_HDR pHdr; - - pHdr = (PKDE_HDR)pBuf; - NdisZeroMemory(pHdr, sizeof(KDE_HDR)); - pHdr->Type = WPA_KDE_TYPE; - /* The Length field specifies the number of octets in the OUI, Data - Type, and Data fields. */ - pHdr->Len = 4 + data_len; - NdisMoveMemory(pHdr->OUI, OUI_WPA2, 3); - pHdr->DataType = data_type; -} - -VOID WPAInstallKey(IN PRTMP_ADAPTER pAd, IN struct _ASIC_SEC_INFO *pInfo, - IN BOOLEAN bAE, IN BOOLEAN is_install) -{ - struct _SEC_KEY_INFO *pKey = &pInfo->Key; - - if (IS_CIPHER_TKIP(pInfo->Cipher)) - pKey->KeyLen = LEN_TKIP_TK; - else if (IS_CIPHER_CCMP128(pInfo->Cipher)) - pKey->KeyLen = LEN_CCMP128_TK; - else if (IS_CIPHER_CCMP256(pInfo->Cipher)) - pKey->KeyLen = LEN_CCMP256_TK; - else if (IS_CIPHER_GCMP128(pInfo->Cipher)) - pKey->KeyLen = LEN_GCMP128_TK; - else if (IS_CIPHER_GCMP256(pInfo->Cipher)) - pKey->KeyLen = LEN_GCMP256_TK; - - if (pInfo->IGTKKeyLen != 0) { - if (IS_CIPHER_BIP_GMAC128(pInfo->Cipher) || - IS_CIPHER_BIP_GMAC256(pInfo->Cipher) || - IS_CIPHER_BIP_CMAC256(pInfo->Cipher)) - ; /* do nothing due to hw not support*/ - else if (pKey->KeyLen + pInfo->IGTKKeyLen > sizeof(pKey->Key)) - ; /* do nothing due to fw not support*/ - else if (IS_CIPHER_CCMP128(pInfo->Cipher) || - IS_CIPHER_CCMP256(pInfo->Cipher) || - IS_CIPHER_GCMP128(pInfo->Cipher) || - IS_CIPHER_GCMP256(pInfo->Cipher)) { - os_move_mem(&pKey->Key[pKey->KeyLen], pInfo->IGTK, - pInfo->IGTKKeyLen); - pKey->KeyLen += pInfo->IGTKKeyLen; - } - } - - if (IS_CIPHER_TKIP(pInfo->Cipher)) { - if (bAE) { - os_move_mem(pKey->TxMic, &pKey->Key[LEN_TK], - LEN_TKIP_MIC); - os_move_mem(pKey->RxMic, &pKey->Key[LEN_TK + 8], - LEN_TKIP_MIC); - } else { - os_move_mem(pKey->TxMic, &pKey->Key[LEN_TK + 8], - LEN_TKIP_MIC); - os_move_mem(pKey->RxMic, &pKey->Key[LEN_TK], - LEN_TKIP_MIC); - } - } - - if (is_install) - HW_ADDREMOVE_KEYTABLE(pAd, pInfo); -} - -VOID WPACalculateMIC(IN UCHAR KeyDescVer, IN UINT32 AKMMap, IN UCHAR *PTK, - IN UINT8 key_deri_alg, OUT PEAPOL_PACKET pMsg) -{ - UCHAR *OutBuffer; - ULONG FrameLen = 0; - UCHAR mic[LEN_KEY_DESC_MIC_MAX]; - UCHAR digest[80]; - UINT8 mic_len = LEN_KEY_DESC_MIC; - /* allocate memory for MIC calculation*/ - os_alloc_mem(NULL, (PUCHAR *)&OutBuffer, 512); - - if (OutBuffer == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!CalculateMIC: no memory!!!\n")); - return; - } - - /* make a frame for calculating MIC.*/ - MakeOutgoingFrame(OutBuffer, &FrameLen, - CONV_ARRARY_TO_UINT16(pMsg->Body_Len) + 4, pMsg, - END_OF_ARGS); - NdisZeroMemory(mic, sizeof(mic)); - - /* Calculate MIC*/ - if (KeyDescVer == KEY_DESC_AES) { - RT_HMAC_SHA1(PTK, LEN_PTK_KCK, OutBuffer, FrameLen, digest, - SHA1_DIGEST_SIZE); - NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC); - } else if (KeyDescVer == KEY_DESC_TKIP) - RT_HMAC_MD5(PTK, LEN_PTK_KCK, OutBuffer, FrameLen, mic, - MD5_DIGEST_SIZE); - else if ((KeyDescVer == KEY_DESC_NOT_DEFINED) && - IS_AKM_SHA384(AKMMap)) { - RT_HMAC_SHA384(PTK, LEN_PTK_KCK_SHA384, OutBuffer, FrameLen, - mic, LEN_KEY_DESC_MIC_SHA384); - mic_len = LEN_KEY_DESC_MIC_SHA384; - } else if ((KeyDescVer == KEY_DESC_NOT_DEFINED) && IS_AKM_OWE(AKMMap) && - (key_deri_alg == SEC_KEY_DERI_SHA256)) { - RT_HMAC_SHA256(PTK, LEN_PTK_KCK, OutBuffer, FrameLen, mic, - LEN_KEY_DESC_MIC); - mic_len = LEN_KEY_DESC_MIC; -#ifdef DPP_SUPPORT - } else if ((KeyDescVer == KEY_DESC_NOT_DEFINED) && IS_AKM_DPP(AKMMap) && - (key_deri_alg == SEC_KEY_DERI_SHA256)) { - RT_HMAC_SHA256(PTK, LEN_PTK_KCK, OutBuffer, FrameLen, mic, - LEN_KEY_DESC_MIC); - mic_len = LEN_KEY_DESC_MIC; -#endif /* DPP_SUPPORT */ - } else if ((KeyDescVer == KEY_DESC_NOT_DEFINED) && IS_AKM_OWE(AKMMap) && - (key_deri_alg == SEC_KEY_DERI_SHA384)) { - /*TODO: OWE SHA521*/ - RT_HMAC_SHA384(PTK, LEN_PTK_KCK_SHA384, OutBuffer, FrameLen, - mic, LEN_KEY_DESC_MIC_SHA384); - mic_len = LEN_KEY_DESC_MIC_SHA384; - } else if ((KeyDescVer == KEY_DESC_EXT) || - (KeyDescVer == KEY_DESC_NOT_DEFINED)) { - UINT mlen = AES_KEY128_LENGTH; - - AES_CMAC(OutBuffer, FrameLen, PTK, LEN_PTK_KCK, mic, &mlen); - } - - /* store the calculated MIC*/ - NdisMoveMemory(pMsg->KeyDesc.KeyMicAndData, mic, mic_len); - os_free_mem(OutBuffer); -} - -VOID WPAInsertRSNIE(IN PUCHAR pFrameBuf, OUT PULONG pFrameLen, - IN PUINT8 rsnie_ptr, IN UINT8 rsnie_len, - IN PUINT8 pmkid_ptr, IN UINT8 pmkid_len) -{ - PUCHAR pTmpBuf; - ULONG TempLen = 0; - UINT8 extra_len = 0; - UINT16 pmk_count = 0; - UCHAR ie_num; - UINT8 total_len = 0; - - pTmpBuf = pFrameBuf; - - /* PMKID-List Must larger than 0 and the multiple of 16. */ - if (pmkid_len > 0 && ((pmkid_len & 0x0f) == 0)) { - extra_len = sizeof(UINT16) + pmkid_len; - pmk_count = (pmkid_len >> 4); - pmk_count = cpu2le16(pmk_count); - } else - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : no PMKID-List included(%d).\n", __func__, - pmkid_len)); - - if (rsnie_len != 0) { - ie_num = IE_WPA; - total_len = rsnie_len; - - if (NdisEqualMemory(rsnie_ptr + 2, OUI_WPA2_CIPHER, - sizeof(OUI_WPA2_CIPHER))) { - ie_num = IE_RSN; - total_len += extra_len; - } - - /* construct RSNIE body */ - MakeOutgoingFrame(pTmpBuf, &TempLen, 1, &ie_num, 1, &total_len, - rsnie_len, rsnie_ptr, END_OF_ARGS); - pTmpBuf += TempLen; - *pFrameLen = *pFrameLen + TempLen; - - if (ie_num == IE_RSN) { - /* Insert PMKID-List field */ - if (extra_len > 0) { - MakeOutgoingFrame(pTmpBuf, &TempLen, 2, - &pmk_count, pmkid_len, - pmkid_ptr, END_OF_ARGS); - pTmpBuf += TempLen; - *pFrameLen = *pFrameLen + TempLen; - } - } - } - - return; -} - -/* - ======================================================================== - Routine Description: - Construct KDE common format - Its format is below, - +--------------------+ - | Type (0xdd) | 1 octet - +--------------------+ - | Length | 1 octet - +--------------------+ - | OUI | 3 octets - +--------------------+ - | Data Type | 1 octet - +--------------------+ - Note: - It's defined in IEEE 802.11-2007 Figure 8-25. - - ======================================================================== -*/ -VOID WPAConstructKdeHdr(IN UINT8 data_type, IN UINT8 data_len, OUT PUCHAR pBuf) -{ - PKDE_HDR pHdr; - - pHdr = (PKDE_HDR)pBuf; - NdisZeroMemory(pHdr, sizeof(KDE_HDR)); - pHdr->Type = WPA_KDE_TYPE; - /* The Length field specifies the number of octets in the OUI, Data - Type, and Data fields. */ - pHdr->Len = 4 + data_len; - NdisMoveMemory(pHdr->OUI, OUI_WPA2, 3); - pHdr->DataType = data_type; -} - -UCHAR wpa3_test_ctrl; - -VOID WPAConstructEapolKeyData(IN PMAC_TABLE_ENTRY pEntry, IN UCHAR MsgType, - IN UCHAR keyDescVer, - IN struct _SECURITY_CONFIG *pSecPairwise, - IN struct _SECURITY_CONFIG *pSecGroup, - OUT PEAPOL_PACKET pMsg) -{ - UCHAR *mpool, *Key_Data, *eGTK; - ULONG data_offset; - BOOLEAN bWPA2 = TRUE; - BOOLEAN GTK_Included = FALSE; - UINT8 mic_len = LEN_KEY_DESC_MIC; - UINT8 *key_data_len_ptr = NULL; - UINT8 *key_data_ptr = NULL; - - if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_4 || - MsgType == EAPOL_GROUP_MSG_2) - return; - - /* Choose WPA2 or not*/ - if (IS_AKM_WPA1(pSecPairwise->AKMMap) || - IS_AKM_WPA1PSK(pSecPairwise->AKMMap)) - bWPA2 = FALSE; - - /* allocate memory pool*/ - os_alloc_mem(NULL, (PUCHAR *)&mpool, 1500); - - if (mpool == NULL) - return; - - if (IS_AKM_SHA384(pSecPairwise->AKMMap) || - (pSecPairwise->key_deri_alg == SEC_KEY_DERI_SHA384)) - mic_len = LEN_KEY_DESC_MIC_SHA384; - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_Entry(pEntry)) - mic_len = 0; -#endif /* OCE_FILS_SUPPORT */ - - key_data_len_ptr = pMsg->KeyDesc.KeyMicAndData + mic_len; - key_data_ptr = key_data_len_ptr + 2; - - /* eGTK Len = 512 */ - eGTK = (UCHAR *)ROUND_UP(mpool, 4); - /* Key_Data Len = 512 */ - Key_Data = (UCHAR *)ROUND_UP(eGTK + 512, 4); - NdisZeroMemory(Key_Data, 512); - SET_UINT16_TO_ARRARY(key_data_len_ptr, 0); - data_offset = 0; - - /* Encapsulate RSNIE & RSNXE in pairwise_msg2 & pairwise_msg3 */ - if ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3)) { - UCHAR *RSNIE = NULL; - UCHAR RSNIE_LEN = 0; - CHAR rsne_idx = 0; - SEC_RSNIE_TYPE RSNType = SEC_RSNIE_WPA1_IE; -#ifdef DOT11R_FT_SUPPORT - if (IS_FT_RSN_STA(pEntry)) { - /* YF_FT */ - pEntry->FT_Status = TX_EAPOL_3; - WPAMakeRSNIE(pEntry->wdev->wdev_type, pSecGroup, - pEntry); - } -#endif /* DOT11R_FT_SUPPORT */ - - if (bWPA2) - RSNType = SEC_RSNIE_WPA2_IE; - - for (rsne_idx = 0; rsne_idx < SEC_RSNIE_NUM; rsne_idx++) { - if (pSecGroup->RSNE_Type[rsne_idx] == RSNType) { - RSNIE = &pSecGroup->RSNE_Content[rsne_idx][0]; - RSNIE_LEN = pSecGroup->RSNE_Len[rsne_idx]; - break; - } - } - - WPAInsertRSNIE(&Key_Data[data_offset], &data_offset, RSNIE, - RSNIE_LEN, NULL, 0); - } - -#ifdef DOT11R_FT_SUPPORT - - /* Encapsulate MDIE if FT is enabled*/ - if (IS_FT_RSN_STA(pEntry) && bWPA2 && - ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3))) { - /* The MDIE shall be the same as those provided in - the AP's (Re)association Response frame. */ -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - NdisMoveMemory(&Key_Data[data_offset], - pEntry->InitialMDIE, 5); - data_offset += 5; - } -#endif /* CONFIG_AP_SUPPORT */ - } - -#endif /* DOT11R_FT_SUPPORT */ - - /* Encapsulate GTK */ - /* Only for pairwise_msg3_WPA2 and group_msg1*/ - if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || - (MsgType == EAPOL_GROUP_MSG_1)) { - UINT8 gtk_len = 0; - - /* Decide the GTK length */ - if (IS_CIPHER_TKIP(pSecGroup->GroupCipher)) - gtk_len = LEN_TKIP_TK; - else if (IS_CIPHER_CCMP128(pSecGroup->GroupCipher)) - gtk_len = LEN_CCMP128_TK; - else if (IS_CIPHER_CCMP256(pSecGroup->GroupCipher)) - gtk_len = LEN_CCMP256_TK; - else if (IS_CIPHER_GCMP128(pSecGroup->GroupCipher)) - gtk_len = LEN_GCMP128_TK; - else if (IS_CIPHER_GCMP256(pSecGroup->GroupCipher)) - gtk_len = LEN_GCMP256_TK; - - /* Insert GTK KDE format in WAP2 mode */ - if (bWPA2) { - /* Construct the common KDE format */ - WPAConstructKdeHdr(KDE_GTK, 2 + gtk_len, - &Key_Data[data_offset]); - data_offset += sizeof(KDE_HDR); - /* GTK KDE format - 802.11i-2004 Figure-43x*/ - Key_Data[data_offset] = (pSecGroup->GroupKeyId & 0x03); - Key_Data[data_offset + 1] = 0x00; /* Reserved Byte*/ - data_offset += 2; - } - - /* Fill in GTK */ -#if defined(CONFIG_HOTSPOT) && defined(CONFIG_AP_SUPPORT) - - if (pEntry->pMbss->HotSpotCtrl.HotSpotEnable && - pEntry->pMbss->HotSpotCtrl.DGAFDisable) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[HOTSPOT]:%s - Unique GTK for each STA\n", - __func__)); - NdisMoveMemory(&Key_Data[data_offset], - pSecPairwise->HsUniGTK, gtk_len); - } else -#endif /* defined(CONFIG_HOTSPOT) && defined(CONFIG_AP_SUPPORT) */ - { - NdisMoveMemory(&Key_Data[data_offset], pSecGroup->GTK, - gtk_len); - } - - data_offset += gtk_len; -#ifdef DOT11W_PMF_SUPPORT - - /* Insert IGTK KDE to Key_Data field */ - if ((bWPA2) && - (pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_WARN, - ("[PMF]:%s - Insert IGTK\n", __func__)); - PMF_InsertIGTKKDE(pEntry->pAd, pEntry->func_tb_idx, - &Key_Data[data_offset], &data_offset); - } - -#endif /* DOT11W_PMF_SUPPORT */ - GTK_Included = TRUE; - } - -#ifdef DOT11R_FT_SUPPORT - - /* Encapsulate the related IE of FT when FT is enabled */ - if (IS_FT_RSN_STA(pEntry) && bWPA2 && - ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3))) { - /* Encapsulate FTIE. The MDIE shall be the same - as those provided in the AP's (Re)association Response frame. */ -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - NdisMoveMemory(&Key_Data[data_offset], - pEntry->InitialFTIE, - pEntry->InitialFTIE_Len); - data_offset += pEntry->InitialFTIE_Len; - - if (MsgType == EAPOL_PAIR_MSG_3) { - /* INSERT TIE with PKT keylifetime, reassoc deadline - And reassoc deadline <= PTK key lifetime - */ - /* YF_TIE */ - FT_InsertTimeoutIntervalIE( - &Key_Data[data_offset], &data_offset, - REASSOC_DEADLINE_INTERVAL, - MAC_TABLE_ASSOC_TIMEOUT); - - FT_InsertTimeoutIntervalIE( - &Key_Data[data_offset], &data_offset, - KEY_LIFETIME_INTERVAL, - 600); /* Sync PMKID Cache Period */ - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - -#endif /* DOT11R_FT_SUPPORT */ - - /* If the Encrypted Key Data subfield (of the Key Information field) - is set, the entire Key Data field shall be encrypted. */ - /* This whole key-data field shall be encrypted if a GTK is included.*/ - /* Encrypt the data material in key data field with KEK*/ - if (GTK_Included) { -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_Entry(pEntry)) { - NdisMoveMemory(key_data_ptr, Key_Data, data_offset); - } else -#endif /* OCE_FILS_SUPPORT */ - { - if ((keyDescVer == KEY_DESC_EXT) || - (keyDescVer == KEY_DESC_NOT_DEFINED) || - (keyDescVer == KEY_DESC_AES)) { - UCHAR remainder = 0; - UCHAR pad_len = 0; - UINT wrap_len = 0; - UINT8 kck_len = LEN_PTK_KCK; - UINT8 kek_len = LEN_PTK_KEK; - - if (IS_AKM_SHA384(pSecPairwise->AKMMap) || - (pSecPairwise->key_deri_alg == - SEC_KEY_DERI_SHA384)) { - kck_len = LEN_PTK_KCK_SHA384; - kek_len = LEN_PTK_KEK_SHA384; - } - - /* Key Descriptor Version 2 or 3: AES key wrap, defined in IETF RFC 3394, */ - /* shall be used to encrypt the Key Data field using the KEK field from */ - /* the derived PTK.*/ - /* If the Key Data field uses the NIST AES key wrap, then the Key Data field */ - /* shall be padded before encrypting if the key data length is less than 16 */ - /* octets or if it is not a multiple of 8. The padding consists of appending*/ - /* a single octet 0xdd followed by zero or more 0x00 octets. */ - remainder = data_offset & 0x07; - - if (remainder != 0) { - INT i; - - pad_len = (8 - remainder); - Key_Data[data_offset] = 0xDD; - - for (i = 1; i < pad_len; i++) - Key_Data[data_offset + i] = 0; - - data_offset += pad_len; - } - - AES_Key_Wrap(Key_Data, (UINT)data_offset, - &pSecPairwise->PTK[kck_len], - kek_len, eGTK, &wrap_len); - data_offset = wrap_len; - } else { - TKIP_GTK_KEY_WRAP( - &pSecPairwise->PTK[LEN_PTK_KCK], - pMsg->KeyDesc.KeyIv, Key_Data, - data_offset, eGTK); - } - - NdisMoveMemory(key_data_ptr, eGTK, data_offset); - } - } else - NdisMoveMemory(key_data_ptr, Key_Data, data_offset); - - /* Update key data length field and total body length*/ - SET_UINT16_TO_ARRARY(key_data_len_ptr, data_offset); - INC_UINT16_TO_ARRARY(pMsg->Body_Len, data_offset); - os_free_mem(mpool); -} - -VOID WPAConstructEapolMsg(IN PMAC_TABLE_ENTRY pEntry, IN UCHAR MsgType, - IN struct _SECURITY_CONFIG *pSecPairwise, - IN struct _SECURITY_CONFIG *pSecGroup, - OUT PEAPOL_PACKET pMsg) -{ - BOOLEAN bWPA2 = TRUE; - UCHAR KeyDescVer = 0; - UINT msg_len = MIN_LEN_OF_EAPOL_KEY_MSG; - - /* Choose WPA2 or not*/ - if (IS_AKM_WPA1(pSecPairwise->AKMMap) || - IS_AKM_WPA1PSK(pSecPairwise->AKMMap)) - bWPA2 = FALSE; - - /* Init Packet and Fill header */ - pMsg->ProVer = EAPOL_VER; - pMsg->ProType = EAPOLKey; - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_Entry(pEntry)) - msg_len -= LEN_KEY_DESC_MIC; -#endif /* OCE_FILS_SUPPORT */ - - /* Default 95 bytes, the EAPoL-Key descriptor exclude Key-data field*/ - SET_UINT16_TO_ARRARY(pMsg->Body_Len, msg_len); - - /* Fill in EAPoL descriptor*/ - if (bWPA2) - pMsg->KeyDesc.Type = WPA2_KEY_DESC; - else - pMsg->KeyDesc.Type = WPA1_KEY_DESC; - - if (IS_AKM_WPA3_192BIT(pSecPairwise->AKMMap) || - IS_AKM_WPA3PSK(pSecPairwise->AKMMap) || -#ifdef DPP_SUPPORT - IS_AKM_DPP(pSecPairwise->AKMMap) || -#endif /* DPP_SUPPORT */ - IS_AKM_OWE(pSecPairwise->AKMMap) || -#ifdef CONFIG_HOTSPOT_R2 - CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_OSEN_CAPABLE) || -#endif /* CONFIG_HOTSPOT_R2 */ -#ifdef OCE_FILS_SUPPORT - IS_AKM_FILS_Entry(pEntry) || -#endif /* OCE_FILS_SUPPORT */ - (pSecPairwise->key_deri_alg == SEC_KEY_DERI_SHA384)) - KeyDescVer = KEY_DESC_NOT_DEFINED; - /* Key Descriptor Version (bits 0-2) specifies the key descriptor version type*/ - /* AKM is 00-0F-AC:3, 00-0F-AC:4, , 00-0F-AC:5, , 00-0F-AC:6 */ - else if (IS_AKM_SHA256(pSecPairwise->AKMMap) -#ifdef DOT11W_PMF_SUPPORT - || (pSecPairwise->key_deri_alg == SEC_KEY_DERI_SHA256) -#endif /* DOT11W_PMF_SUPPORT */ - ) - KeyDescVer = KEY_DESC_EXT; - else if (((MsgType <= EAPOL_PAIR_MSG_4) && - IS_CIPHER_TKIP(pSecPairwise->PairwiseCipher)) || - ((MsgType >= EAPOL_GROUP_MSG_1) && - IS_CIPHER_TKIP( - pSecPairwise - ->PairwiseCipher))) /* Must see pairwise cipher*/ - KeyDescVer = KEY_DESC_TKIP; - else - KeyDescVer = KEY_DESC_AES; - - pMsg->KeyDesc.KeyInfo.KeyDescVer = KeyDescVer; - - /* Specify Key Type as Group(0) or Pairwise(1)*/ - if (MsgType >= EAPOL_GROUP_MSG_1) - pMsg->KeyDesc.KeyInfo.KeyType = GROUPKEY; - else - pMsg->KeyDesc.KeyInfo.KeyType = PAIRWISEKEY; - - /* Specify Key Index, only group_msg1_WPA1*/ - if (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1)) - pMsg->KeyDesc.KeyInfo.KeyIndex = pSecGroup->GroupKeyId; - - if (MsgType == EAPOL_PAIR_MSG_3) - pMsg->KeyDesc.KeyInfo.Install = 1; - - if ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3) || - (MsgType == EAPOL_GROUP_MSG_1)) - pMsg->KeyDesc.KeyInfo.KeyAck = 1; - -#ifdef OCE_FILS_SUPPORT - if (!IS_AKM_FILS_Entry(pEntry)) -#endif /* OCE_FILS_SUPPORT */ - if (MsgType != EAPOL_PAIR_MSG_1) - pMsg->KeyDesc.KeyInfo.KeyMic = 1; - -#ifdef OCE_FILS_SUPPORT - if (!IS_AKM_FILS_Entry(pEntry)) -#endif /* OCE_FILS_SUPPORT */ - if ((IS_AKM_SHA384(pSecPairwise->AKMMap)) || - (pSecPairwise->key_deri_alg == SEC_KEY_DERI_SHA384)) - INC_UINT16_TO_ARRARY(pMsg->Body_Len, - LEN_KEY_DESC_MIC_SHA384 - - LEN_KEY_DESC_MIC); - - if ((bWPA2 && (MsgType >= EAPOL_PAIR_MSG_3)) || - (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1))) - pMsg->KeyDesc.KeyInfo.Secure = 1; - - /* This subfield shall be set, and the Key Data field shall be encrypted, if - any key material (e.g., GTK or SMK) is included in the frame. */ - if (bWPA2 && - ((MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1))) - pMsg->KeyDesc.KeyInfo.EKD_DL = 1; - - /* key Information element has done. */ - *(USHORT *)(&pMsg->KeyDesc.KeyInfo) = - cpu2le16(*(USHORT *)(&pMsg->KeyDesc.KeyInfo)); - - /* Fill in Key Length*/ - if (bWPA2) { - /* In WPA2 mode, the field indicates the length of pairwise key cipher, */ - /* so only pairwise_msg_1 and pairwise_msg_3 need to fill. */ - if ((MsgType == EAPOL_PAIR_MSG_1) || - (MsgType == EAPOL_PAIR_MSG_3)) { - if (IS_CIPHER_TKIP(pSecPairwise->PairwiseCipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_TKIP_TK; - else if (IS_CIPHER_CCMP128( - pSecPairwise->PairwiseCipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_CCMP128_TK; - else if (IS_CIPHER_CCMP256( - pSecPairwise->PairwiseCipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_CCMP256_TK; - else if (IS_CIPHER_GCMP128( - pSecPairwise->PairwiseCipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_GCMP128_TK; - else if (IS_CIPHER_GCMP256( - pSecPairwise->PairwiseCipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_GCMP256_TK; - } - } else { - UINT32 Cipher = 0; - - if (MsgType >= EAPOL_GROUP_MSG_1) - Cipher = pSecGroup->GroupCipher; - else - Cipher = pSecPairwise->PairwiseCipher; - - if (IS_CIPHER_TKIP(Cipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_TKIP_TK; - else if (IS_CIPHER_CCMP128(Cipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_CCMP128_TK; - else if (IS_CIPHER_CCMP256(Cipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_CCMP256_TK; - else if (IS_CIPHER_GCMP128(Cipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_GCMP128_TK; - else if (IS_CIPHER_GCMP256(Cipher)) - pMsg->KeyDesc.KeyLength[1] = LEN_GCMP256_TK; - } - - /* Fill in replay counter */ - NdisMoveMemory(pMsg->KeyDesc.ReplayCounter, - pSecPairwise->Handshake.ReplayCounter, - LEN_KEY_DESC_REPLAY); - - /* Fill Key Nonce field */ - /* ANonce : pairwise_msg1 & pairwise_msg3*/ - /* SNonce : pairwise_msg2*/ - /* GNonce : group_msg1_wpa1 */ - if ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3)) - NdisMoveMemory(pMsg->KeyDesc.KeyNonce, - pSecPairwise->Handshake.ANonce, - LEN_KEY_DESC_NONCE); - else if (MsgType == EAPOL_PAIR_MSG_2) - NdisMoveMemory(pMsg->KeyDesc.KeyNonce, - pSecPairwise->Handshake.SNonce, - LEN_KEY_DESC_NONCE); - else if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1)) { - NdisMoveMemory(pMsg->KeyDesc.KeyNonce, - pSecGroup->Handshake.GNonce, LEN_KEY_DESC_NONCE); - /* Fill key IV - WPA2 as 0, WPA1 as random*/ - /* Suggest IV be random number plus some number,*/ - NdisMoveMemory(pMsg->KeyDesc.KeyIv, - &pSecGroup->Handshake.GNonce[16], - LEN_KEY_DESC_IV); - pMsg->KeyDesc.KeyIv[15] += 2; - } - - /* Fill Key RSC field */ - /* It contains the RSC for the GTK being installed.*/ - if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || - (MsgType == EAPOL_GROUP_MSG_1)) - NdisMoveMemory(pMsg->KeyDesc.KeyRsc, pSecGroup->Handshake.RSC, - 6); - - /* Clear Key MIC field for MIC calculation later */ -#ifdef OCE_FILS_SUPPORT - if (!IS_AKM_FILS_Entry(pEntry)) -#endif /* OCE_FILS_SUPPORT */ - { - if (IS_AKM_SHA384(pSecPairwise->AKMMap) || - (pSecPairwise->key_deri_alg == SEC_KEY_DERI_SHA384)) - NdisZeroMemory(pMsg->KeyDesc.KeyMicAndData, - LEN_KEY_DESC_MIC_SHA384); - else - NdisZeroMemory(pMsg->KeyDesc.KeyMicAndData, - LEN_KEY_DESC_MIC); - } - WPAConstructEapolKeyData(pEntry, MsgType, KeyDescVer, pSecPairwise, - pSecGroup, pMsg); - - /* Calculate MIC and fill in KeyMic Field except Pairwise Msg 1.*/ -#ifdef OCE_FILS_SUPPORT - if (!IS_AKM_FILS_Entry(pEntry)) -#endif /* OCE_FILS_SUPPORT */ - if (MsgType != EAPOL_PAIR_MSG_1) - WPACalculateMIC(KeyDescVer, pSecPairwise->AKMMap, - pSecPairwise->PTK, - pSecPairwise->key_deri_alg, pMsg); - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("===> %s for %s %s\n", ((bWPA2) ? "WPA2" : "WPA"), __func__, - GetEapolMsgType(MsgType))); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_INFO, - (" Body length = %d\n", - CONV_ARRARY_TO_UINT16(pMsg->Body_Len))); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_INFO, - (" Key length = %d\n", - CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyLength))); -} - -BOOLEAN WPAParseEapolKeyData(IN PRTMP_ADAPTER pAd, IN PUCHAR pKeyData, - IN UCHAR KeyDataLen, IN UCHAR GroupKeyIndex, - IN UCHAR MsgType, IN BOOLEAN bWPA2, - IN MAC_TABLE_ENTRY *pEntry) -{ - PUCHAR pMyKeyData = pKeyData; - UCHAR KeyDataLength = KeyDataLen; - UCHAR GTK[MAX_LEN_GTK]; - UCHAR GTKLEN = 0; - UCHAR DefaultIdx = 0; - UCHAR skip_offset = 0; -#ifdef DOT11W_PMF_SUPPORT - UCHAR IGTK[LEN_MAX_IGTK]; - UCHAR IGTKLEN = 0; - UCHAR IPN[LEN_WPA_TSC]; - UINT8 IGTK_KeyIdx; /* It shall be 4 or 5 */ -#endif /*DOT11W_PMF_SUPPORT */ - NdisZeroMemory(GTK, MAX_LEN_GTK); - - /* Verify The RSN IE contained in pairewise_msg_2 && pairewise_msg_3 and skip it*/ - if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_3) { - { - if (bWPA2 && MsgType == EAPOL_PAIR_MSG_3) { - /* skip RSN IE*/ - pMyKeyData += skip_offset; - KeyDataLength -= skip_offset; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("RTMPParseEapolKeyData ==> WPA2/WPA2PSK RSN IE matched in Msg 3, Length(%d)\n", - skip_offset)); - } else - return TRUE; - } - } - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTMPParseEapolKeyData ==> KeyDataLength %d without RSN_IE\n", - KeyDataLength)); -#ifdef DOT11R_FT_SUPPORT - - if (IS_FT_RSN_STA(pEntry)) { - PEID_STRUCT pEid; - - pEid = (PEID_STRUCT)pMyKeyData; - - if (pEid->Eid == IE_FT_MDIE) { - /* Skip MDIE of FT*/ - pMyKeyData += (pEid->Len + 2); - KeyDataLength -= (pEid->Len + 2); - } - } - -#endif /* DOT11R_FT_SUPPORT */ - - /* Parse KDE format in pairwise_msg_3_WPA2 && group_msg_1_WPA2*/ - if (bWPA2 && - (MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1)) { - PEID_STRUCT pEid; - - pEid = (PEID_STRUCT)pMyKeyData; - skip_offset = 0; - - while ((skip_offset + 2 + pEid->Len) <= KeyDataLength) { - switch (pEid->Eid) { - case WPA_KDE_TYPE: { - PKDE_HDR pKDE; - - pKDE = (PKDE_HDR)pEid; - - if (NdisEqualMemory(pKDE->OUI, OUI_WPA2_CIPHER, - 3)) { - if (pKDE->DataType == KDE_GTK) { - PGTK_KDE pKdeGtk; - - pKdeGtk = (PGTK_KDE)&pKDE - ->octet[0]; - DefaultIdx = pKdeGtk->Kid; - /* Get GTK length - refer to IEEE 802.11i-2004 p.82 */ - GTKLEN = pKDE->Len - 6; - - if (GTKLEN < LEN_WEP64) { - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("ERROR: GTK Key length is too short (%d)\n", - GTKLEN)); - return FALSE; - } - - NdisMoveMemory(GTK, - pKdeGtk->GTK, - GTKLEN); - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("GTK in KDE format ,DefaultKeyID=%d, KeyLen=%d\n", - DefaultIdx, GTKLEN)); - } -#ifdef DOT11W_PMF_SUPPORT - else if (pKDE->DataType == KDE_IGTK) { - if (PMF_ExtractIGTKKDE( - &pKDE->octet[0], - pKDE->Len - 4, IGTK, - &IGTKLEN, IPN, - &IGTK_KeyIdx) == - FALSE) { - MTWF_LOG( - DBG_CAT_SEC, - CATSEC_PMF, - DBG_LVL_ERROR, - ("PMF_ExtractIGTKKDE: %s FAIL\n", - __func__)); - return FALSE; - } - } - -#endif /* DOT11W_PMF_SUPPORT */ - } - } break; - } - - skip_offset = skip_offset + 2 + pEid->Len; - pEid = (PEID_STRUCT)((UCHAR *)pEid + 2 + pEid->Len); - } - - /* skip KDE Info*/ - pMyKeyData += skip_offset; - KeyDataLength -= skip_offset; - } else if (!bWPA2 && MsgType == EAPOL_GROUP_MSG_1) { - DefaultIdx = GroupKeyIndex; - GTKLEN = KeyDataLength; - NdisMoveMemory(GTK, pMyKeyData, KeyDataLength); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("GTK without KDE, DefaultKeyID=%d, KeyLen=%d\n", - DefaultIdx, GTKLEN)); - } - - /* Sanity check - shared key index must be 0 ~ 3*/ - if (DefaultIdx > 3) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR: GTK Key index(%d) is invalid in %s %s\n", - DefaultIdx, ((bWPA2) ? "WPA2" : "WPA"), - GetEapolMsgType(MsgType))); - return FALSE; - } - -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - ASIC_SEC_INFO Info = { 0 }; - /* set key material, TxMic and RxMic */ - NdisMoveMemory(pEntry->SecConfig.GTK, GTK, GTKLEN); - pEntry->SecConfig.GroupKeyId = DefaultIdx; - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_GROUP_KEY; - Info.Direction = SEC_ASIC_KEY_RX; - Info.Wcid = pEntry->wdev->bss_info_argument.ucBcMcWlanIdx; - Info.BssIndex = BSS0; - Info.Cipher = pEntry->SecConfig.GroupCipher; - Info.KeyIdx = pEntry->SecConfig.GroupKeyId; - os_move_mem(&Info.PeerAddr[0], pEntry->Addr, MAC_ADDR_LEN); - os_move_mem(Info.Key.Key, pEntry->SecConfig.GTK, LEN_MAX_GTK); -#ifdef DOT11W_PMF_SUPPORT - - if (IGTKLEN != 0) { -#ifdef SOFT_ENCRYPT - UINT8 idx = 0; - PPMF_CFG pPmfCfg = - &pAd->ApCfg.ApCliTab[pEntry->func_tb_idx] - .wdev.SecConfig.PmfCfg; - - pPmfCfg->IGTK_KeyIdx = IGTK_KeyIdx; - - if (pPmfCfg->IGTK_KeyIdx == 5) - idx = 1; - - NdisMoveMemory(&pPmfCfg->IPN[idx][0], IPN, LEN_WPA_TSC); - NdisMoveMemory(&pPmfCfg->IGTK[idx][0], IGTK, IGTKLEN); - /* hex_dump("IGTK===>",IGTK,IGTKLEN); */ -#endif /* SOFT_ENCRYPT */ - Info.Cipher |= pEntry->SecConfig.PmfCfg.igtk_cipher; - os_move_mem(Info.IGTK, IGTK, IGTKLEN); - Info.IGTKKeyLen = IGTKLEN; - } - -#endif /* DOT11W_PMF_SUPPORT */ - - /* Prevent the GTK reinstall key attack */ - if ((pEntry->SecConfig.LastGroupKeyId != - pEntry->SecConfig.GroupKeyId) || - !NdisEqualMemory(pEntry->SecConfig.LastGTK, - pEntry->SecConfig.GTK, LEN_MAX_GTK)) { - WPAInstallKey(pAd, &Info, FALSE, TRUE); - pEntry->SecConfig.LastGroupKeyId = - pEntry->SecConfig.GroupKeyId; - os_move_mem(pEntry->SecConfig.LastGTK, - pEntry->SecConfig.GTK, LEN_MAX_GTK); - pEntry->AllowUpdateRSC = TRUE; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ooo%s : the Group install (%d)\n", __func__, - pEntry->wcid)); - } else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : the Group reinstall attack, skip install key (%d)\n", - __func__, pEntry->wcid)); - } - } - -#endif /* MT_MAC */ -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -BOOLEAN WpaMessageSanity(IN PRTMP_ADAPTER pAd, IN PEAPOL_PACKET pMsg, - IN ULONG MsgLen, IN UCHAR MsgType, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry) -{ - UCHAR mic[LEN_KEY_DESC_MIC_MAX], - digest[80]; /*, KEYDATA[MAX_LEN_OF_RSNIE];*/ - UCHAR *KEYDATA = NULL; - BOOLEAN bWPA2 = TRUE; - KEY_INFO EapolKeyInfo; - BOOLEAN bReplayDiff = FALSE; - PHANDSHAKE_PROFILE pHandshake4Way = &pSecConfig->Handshake; - UINT8 mic_len = LEN_KEY_DESC_MIC; - UINT8 *key_data_len_ptr = NULL; - UINT8 *key_data_ptr = NULL; - - /* 0. Check MsgType*/ - if ((MsgType > EAPOL_GROUP_MSG_2) || (MsgType < EAPOL_PAIR_MSG_1)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("The message type is invalid(%d)!\n", MsgType)); - return FALSE; - } - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&KEYDATA, MAX_LEN_OF_RSNIE); - - if (KEYDATA == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return FALSE; - } - - NdisZeroMemory(mic, sizeof(mic)); - NdisZeroMemory(digest, sizeof(digest)); - NdisZeroMemory(KEYDATA, MAX_LEN_OF_RSNIE); - NdisZeroMemory((PUCHAR)&EapolKeyInfo, sizeof(EapolKeyInfo)); - NdisMoveMemory((PUCHAR)&EapolKeyInfo, (PUCHAR)&pMsg->KeyDesc.KeyInfo, - sizeof(KEY_INFO)); - *((USHORT *)&EapolKeyInfo) = cpu2le16(*((USHORT *)&EapolKeyInfo)); - - /* Choose WPA2 or not*/ - if (IS_AKM_WPA1(pSecConfig->AKMMap) || - IS_AKM_WPA1PSK(pSecConfig->AKMMap)) - bWPA2 = FALSE; - - /* 1. Replay counter check */ - if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_3 || - MsgType == EAPOL_GROUP_MSG_1) { /* For supplicant*/ - /* First validate replay counter, only accept message with larger replay counter.*/ - /* Let equal pass, some AP start with all zero replay counter*/ - UCHAR ZeroReplay[LEN_KEY_DESC_REPLAY]; - - NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY); - - if ((RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, - pHandshake4Way->ReplayCounter, - LEN_KEY_DESC_REPLAY) != 1) && - (RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, ZeroReplay, - LEN_KEY_DESC_REPLAY) != 0)) - bReplayDiff = TRUE; - } else if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || - MsgType == EAPOL_GROUP_MSG_2) { /* For authenticator*/ - /* check Replay Counter coresponds to MSG from authenticator, otherwise discard*/ - if (!NdisEqualMemory(pMsg->KeyDesc.ReplayCounter, - pHandshake4Way->ReplayCounter, - LEN_KEY_DESC_REPLAY)) - bReplayDiff = TRUE; - } - - /* Replay Counter different condition*/ - if (bReplayDiff) { - /* send wireless event - for replay counter different*/ - RTMPSendWirelessEvent(pAd, IW_REPLAY_COUNTER_DIFF_EVENT_FLAG, - pEntry->Addr, pEntry->wdev->wdev_idx, 0); - - if (MsgType < EAPOL_GROUP_MSG_1) - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Replay Counter Different in pairwise msg %d of 4-way handshake!\n", - MsgType)); - else - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Replay Counter Different in group msg %d of 2-way handshake!\n", - (MsgType - EAPOL_PAIR_MSG_4))); - - hex_dump("Receive replay counter ", pMsg->KeyDesc.ReplayCounter, - LEN_KEY_DESC_REPLAY); - hex_dump("Current replay counter ", - pHandshake4Way->ReplayCounter, LEN_KEY_DESC_REPLAY); - goto LabelErr; - } - - if (IS_AKM_SHA384(pSecConfig->AKMMap) || - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) - mic_len = LEN_KEY_DESC_MIC_SHA384; - -#ifdef OCE_FILS_SUPPORT - /* from 802.11AI, when using AEAD cipher, the EAPOL Key MIC is not present */ - if (IS_AKM_FILS_Entry(pEntry)) - mic_len = 0; -#endif /* OCE_FILS_SUPPORT */ - - key_data_len_ptr = pMsg->KeyDesc.KeyMicAndData + mic_len; - key_data_ptr = key_data_len_ptr + 2; - - /* 2. Verify MIC except Pairwise Msg1*/ - if ((MsgType != EAPOL_PAIR_MSG_1) -#ifdef OCE_FILS_SUPPORT - /* from 802.11AI, when using AEAD cipher, the EAPOL Key MIC is not present */ - && (!IS_AKM_FILS_Entry(pEntry)) -#endif /* OCE_FILS_SUPPORT */ - ) { - UCHAR rcvd_mic[LEN_KEY_DESC_MIC_MAX]; - UINT eapol_len = CONV_ARRARY_TO_UINT16(pMsg->Body_Len) + 4; - /* Record the received MIC for check later*/ - NdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMicAndData, mic_len); - NdisZeroMemory(pMsg->KeyDesc.KeyMicAndData, mic_len); - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): peer KeyDescVer = %d\n", __func__, - EapolKeyInfo.KeyDescVer)); - - if (EapolKeyInfo.KeyDescVer == KEY_DESC_TKIP) /* TKIP*/ - RT_HMAC_MD5(pSecConfig->PTK, LEN_PTK_KCK, (PUCHAR)pMsg, - eapol_len, mic, MD5_DIGEST_SIZE); - else if (EapolKeyInfo.KeyDescVer == - KEY_DESC_AES) { /* AES */ - RT_HMAC_SHA1(pSecConfig->PTK, LEN_PTK_KCK, (PUCHAR)pMsg, - eapol_len, digest, SHA1_DIGEST_SIZE); - NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC); - } else if (EapolKeyInfo.KeyDescVer == KEY_DESC_NOT_DEFINED && - IS_AKM_SHA384(pSecConfig->AKMMap)) - RT_HMAC_SHA384(pSecConfig->PTK, LEN_PTK_KCK_SHA384, - (PUCHAR)pMsg, eapol_len, mic, - LEN_KEY_DESC_MIC_SHA384); - else if (IS_AKM_WPA3PSK(pSecConfig->AKMMap)) { - UINT mlen = AES_KEY128_LENGTH; - - AES_CMAC((PUCHAR)pMsg, eapol_len, pSecConfig->PTK, - LEN_PTK_KCK, mic, &mlen); - } else if (IS_AKM_OWE(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA256)) - /*FIXME: OWE SHA521 support*/ - RT_HMAC_SHA256(pSecConfig->PTK, LEN_PTK_KEK, - (PUCHAR)pMsg, eapol_len, mic, - LEN_KEY_DESC_MIC); -#ifdef DPP_SUPPORT - else if (IS_AKM_DPP(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA256)) - RT_HMAC_SHA256(pSecConfig->PTK, LEN_PTK_KEK, - (PUCHAR)pMsg, eapol_len, mic, - LEN_KEY_DESC_MIC); -#endif /* DPP_SUPPORT */ - else if (IS_AKM_OWE(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) - RT_HMAC_SHA384(pSecConfig->PTK, LEN_PTK_KCK_SHA384, - (PUCHAR)pMsg, eapol_len, mic, - LEN_KEY_DESC_MIC_SHA384); - else if ((EapolKeyInfo.KeyDescVer == KEY_DESC_EXT) || - (EapolKeyInfo.KeyDescVer == - KEY_DESC_NOT_DEFINED)) { /* AES-128 */ - UINT mlen = AES_KEY128_LENGTH; - - AES_CMAC((PUCHAR)pMsg, eapol_len, pSecConfig->PTK, - LEN_PTK_KCK, mic, &mlen); - } - - if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC)) { - /* send wireless event - for MIC different*/ - RTMPSendWirelessEvent(pAd, IW_MIC_DIFF_EVENT_FLAG, - pEntry->Addr, - pEntry->wdev->wdev_idx, 0); - - if (MsgType < EAPOL_GROUP_MSG_1) - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("MIC Different in pairwise msg %d of 4-way handshake!\n", - MsgType)); - else - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("MIC Different in group msg %d of 2-way handshake!\n", - (MsgType - EAPOL_PAIR_MSG_4))); - -#ifdef VENDOR_FEATURE7_SUPPORT - { - int k = 0; - UCHAR mic_hex[2]; - UCHAR *event_msg = NULL; - - os_alloc_mem(NULL, (UCHAR **)&event_msg, 768); - if (event_msg) { - NdisZeroMemory(event_msg, 768); - sprintf(event_msg, - "(%02x:%02x:%02x:%02x:%02x:%02x) --> %s%d (%s) failed\n", - PRINT_MAC(pEntry->Addr), - INF_MAIN_DEV_NAME, - pEntry->wdev->wdev_idx, - pEntry->pMbss->Ssid); - strcat(event_msg, "Desired MIC: "); - for (k = 0; k < LEN_KEY_DESC_MIC; k++) { - sprintf(mic_hex, "%02x ", - mic[k]); - strcat(event_msg, mic_hex); - } - strcat(event_msg, "\nReceived MIC: "); - for (k = 0; k < LEN_KEY_DESC_MIC; k++) { - sprintf(mic_hex, "%02x ", - rcvd_mic[k]); - strcat(event_msg, mic_hex); - } - strcat(event_msg, "\n"); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s\n", event_msg)); - os_free_mem(event_msg); - } - } -#endif - hex_dump("Received MIC", rcvd_mic, LEN_KEY_DESC_MIC); - hex_dump("Desired MIC", mic, LEN_KEY_DESC_MIC); - goto LabelErr; - } - } - - /* 1. Decrypt the Key Data field if GTK is included.*/ - /* 2. Extract the context of the Key Data field if it exist. */ - /* The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is clear.*/ - /* The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted.*/ - if (CONV_ARRARY_TO_UINT16(key_data_len_ptr) > 0) { - UCHAR GroupKeyIndex = 0; - - /* Decrypt this field */ - if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || - (MsgType == EAPOL_GROUP_MSG_1) -#ifdef OCE_FILS_SUPPORT - || - (IS_AKM_FILS_Entry(pEntry) && (MsgType == EAPOL_PAIR_MSG_2)) -#endif /* OCE_FILS_SUPPORT */ - ) { -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_Entry(pEntry)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("AEAD Decrypt the message 2\n")); - NdisMoveMemory(KEYDATA, key_data_ptr, - CONV_ARRARY_TO_UINT16( - key_data_len_ptr)); - } else -#endif /* OCE_FILS_SUPPORT */ - if ((EapolKeyInfo.KeyDescVer == KEY_DESC_EXT) || - (EapolKeyInfo.KeyDescVer == KEY_DESC_AES) || - (EapolKeyInfo.KeyDescVer == - KEY_DESC_NOT_DEFINED)) { - UINT aes_unwrap_len = 0; - UINT8 kck_len = LEN_PTK_KCK; - UINT8 kek_len = LEN_PTK_KEK; - - if (IS_AKM_SHA384(pSecConfig->AKMMap) || - (pSecConfig->key_deri_alg == - SEC_KEY_DERI_SHA384)) { - kck_len = LEN_PTK_KCK_SHA384; - kek_len = LEN_PTK_KEK_SHA384; - } - - /* AES */ - AES_Key_Unwrap( - key_data_ptr, - CONV_ARRARY_TO_UINT16( - key_data_len_ptr), - &pSecConfig->PTK[kck_len], - kek_len, KEYDATA, - &aes_unwrap_len); - SET_UINT16_TO_ARRARY(key_data_len_ptr, - aes_unwrap_len); - } else { - TKIP_GTK_KEY_UNWRAP( - &pSecConfig->PTK[LEN_PTK_KCK], - pMsg->KeyDesc.KeyIv, - key_data_ptr, - CONV_ARRARY_TO_UINT16( - key_data_len_ptr), - KEYDATA); - } - - if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1)) - GroupKeyIndex = EapolKeyInfo.KeyIndex; - } else if ((MsgType == EAPOL_PAIR_MSG_2) || - (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2)) - NdisMoveMemory(KEYDATA, key_data_ptr, - CONV_ARRARY_TO_UINT16(key_data_len_ptr)); - else { /* it may have PMKID to check in msg1 */ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("The Key Data Length should be zero !!!\n")); - goto LabelOK; - } - - /* Parse Key Data field to */ - /* 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2)*/ - /* 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA2*/ - /* 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2)*/ - if (!WPAParseEapolKeyData( - pAd, KEYDATA, - CONV_ARRARY_TO_UINT16(key_data_len_ptr), - GroupKeyIndex, MsgType, bWPA2, pEntry)) - goto LabelErr; - } - -LabelOK: - - if (KEYDATA != NULL) - os_free_mem(KEYDATA); - - return TRUE; -LabelErr: - - if (KEYDATA != NULL) - os_free_mem(KEYDATA); - - return FALSE; -} - -VOID WPABuildPairMsg1(IN PRTMP_ADAPTER pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry) -{ - UCHAR Header802_3[14]; - UCHAR *mpool; - PEAPOL_PACKET pEapolFrame; - STA_TR_ENTRY *tr_entry; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : The interface is closed...\n", - __func__)); - return; - } - - if ((!pEntry) || IS_ENTRY_NONE(pEntry)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : The entry doesn't exist.\n", __func__)); - return; - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - BSS_STRUCT *pMbss = (BSS_STRUCT *)pEntry->wdev->func_dev; - - if (pEntry->wdev != &pMbss->wdev) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : cannot get binding wdev(%p).\n", - __func__, pEntry->wdev)); - return; - } - } - -#endif /* CONFIG_AP_SUPPORT */ - pHandshake4Way = &pSecConfig->Handshake; - - /* Check the status*/ - if ((pHandshake4Way->WpaState > AS_PTKSTART) || - (pHandshake4Way->WpaState < AS_INITPMK)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[ERROR]%s : Not expect calling\n", __func__)); - return; - } - -#ifdef WSC_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - BSS_STRUCT *pMbss = (BSS_STRUCT *)pEntry->wdev->func_dev; - - if (MAC_ADDR_EQUAL(pEntry->Addr, - pMbss->wdev.WscControl.EntryAddr) && - pMbss->wdev.WscControl.EapMsgRunning) { - pHandshake4Way->WpaState = AS_NOTUSE; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("This is a WSC-Enrollee. Not expect calling WPAStart4WayHS here\n")); - return; - } - } -#endif /* WSC_AP_SUPPORT */ - /* Increment replay counter by 1*/ - ADD_ONE_To_64BIT_VAR(pHandshake4Way->ReplayCounter); - /* Randomly generate ANonce */ - GenRandom(pAd, (UCHAR *)pHandshake4Way->AAddr, pHandshake4Way->ANonce); - /* Allocate memory for output*/ - os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); - - if (mpool == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : no memory!!!\n", __func__)); - return; - } - - pEapolFrame = (PEAPOL_PACKET)mpool; - NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); - /* Construct EAPoL message - Pairwise Msg 1*/ - /* EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1) */ - pHandshake4Way->MsgType = EAPOL_PAIR_MSG_1; - WPAConstructEapolMsg(pEntry, EAPOL_PAIR_MSG_1, - pSecConfig, /* Pairwise */ - &pEntry->wdev->SecConfig, /* Group */ - pEapolFrame); -#ifdef CONFIG_AP_SUPPORT - - /* If PMKID match in WPA2-enterprise mode, fill PMKID into Key data field and update PMK here */ - if ((IS_AKM_WPA2(pSecConfig->AKMMap) || - IS_AKM_WPA3_192BIT(pSecConfig->AKMMap) || - IS_AKM_OWE(pSecConfig->AKMMap)) && - (is_pmkid_cache_in_sec_config(pSecConfig))) { - UINT8 mic_len = LEN_KEY_DESC_MIC; - UINT8 *key_data_len_ptr = NULL; - UINT8 *key_data_ptr = NULL; - UINT8 pmk_len = LEN_PMK; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s Add PMKID\n", __func__)); - - if (IS_AKM_SHA384(pSecConfig->AKMMap) || - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) { - mic_len = LEN_KEY_DESC_MIC_SHA384; - pmk_len = LEN_PMK_SHA384; - } - - hex_dump("PMKID", pSecConfig->pmkid, LEN_PMKID); - hex_dump("PMK", pSecConfig->pmk_cache, pmk_len); - - key_data_len_ptr = pEapolFrame->KeyDesc.KeyMicAndData + mic_len; - key_data_ptr = key_data_len_ptr + 2; - /* Fill in value for KDE */ - key_data_ptr[0] = 0xDD; - key_data_ptr[2] = 0x00; - key_data_ptr[3] = 0x0F; - key_data_ptr[4] = 0xAC; - key_data_ptr[5] = 0x04; - NdisMoveMemory(key_data_ptr + 6, pSecConfig->pmkid, LEN_PMKID); - NdisMoveMemory(&pSecConfig->PMK, pSecConfig->pmk_cache, - pmk_len); - key_data_ptr[1] = 0x14; /* 4+LEN_PMKID*/ - INC_UINT16_TO_ARRARY(key_data_len_ptr, 6 + LEN_PMKID); - INC_UINT16_TO_ARRARY(pEapolFrame->Body_Len, 6 + LEN_PMKID); - } -#ifdef DOT11W_PMF_SUPPORT - else if ((IS_AKM_WPA3PSK(pSecConfig->AKMMap) || -#ifdef DPP_SUPPORT - IS_AKM_DPP(pSecConfig->AKMMap) || -#endif /* DPP_SUPPORT */ - IS_AKM_OWE(pSecConfig->AKMMap)) && - (pSecConfig->PmfCfg.UsePMFConnect == TRUE)) { - UCHAR digest[80], PMK_key[20]; - UINT8 mic_len = LEN_KEY_DESC_MIC; - UINT8 *key_data_len_ptr = NULL; - UINT8 *key_data_ptr = NULL; - UINT8 pmk_len = LEN_PMK; - - NdisZeroMemory(digest, 80); - - if (IS_AKM_SHA384(pSecConfig->AKMMap) || - pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384) { - mic_len = LEN_KEY_DESC_MIC_SHA384; - pmk_len = LEN_PMK_SHA384; - } - - key_data_len_ptr = pEapolFrame->KeyDesc.KeyMicAndData + mic_len; - key_data_ptr = key_data_len_ptr + 2; - - key_data_ptr[0] = 0xDD; - key_data_ptr[2] = 0x00; - key_data_ptr[3] = 0x0F; - key_data_ptr[4] = 0xAC; - key_data_ptr[5] = 0x04; - - if (is_pmkid_cache_in_sec_config(pSecConfig) == FALSE) { - NdisMoveMemory(&PMK_key[0], "PMK Name", 8); - NdisMoveMemory(&PMK_key[8], pHandshake4Way->AAddr, - MAC_ADDR_LEN); - NdisMoveMemory(&PMK_key[14], pHandshake4Way->SAddr, - MAC_ADDR_LEN); - -#ifdef DOT11_SAE_SUPPORT - if (IS_AKM_SAE(pSecConfig->AKMMap)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s:[SAE]pmkid not found\n", - __func__)); - if (!sae_get_pmk_cache(&pAd->SaeCfg, - pHandshake4Way->AAddr, - pHandshake4Way->SAddr, - digest, NULL)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, - DBG_LVL_ERROR, - ("%s: derive pmkid fail\n", - __func__)); - os_free_mem(mpool); - return; - } - } -#endif -#ifdef CONFIG_OWE_SUPPORT - if (IS_AKM_OWE(pSecConfig->AKMMap)) { - OWE_INFO *owe = &pSecConfig->owe; - - NdisMoveMemory(key_data_ptr + 6, owe->pmkid, - LEN_PMKID); - } else -#endif /*CONFIG_OWE_SUPPORT*/ - NdisMoveMemory(key_data_ptr + 6, digest, - LEN_PMKID); - } else { - NdisMoveMemory(key_data_ptr + 6, pSecConfig->pmkid, - LEN_PMKID); - NdisMoveMemory(&pSecConfig->PMK, pSecConfig->pmk_cache, - LEN_PMK); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PMKID found for WPA2PSK/WPA3PSK\n", - __func__)); - } - - key_data_ptr[1] = 0x14; /* 4+LEN_PMKID */ - INC_UINT16_TO_ARRARY(key_data_len_ptr, 6 + LEN_PMKID); - INC_UINT16_TO_ARRARY(pEapolFrame->Body_Len, 6 + LEN_PMKID); - } - -#endif /* DOT11W_PMF_SUPPORT */ -#endif - /* Make outgoing frame: Authenticator send to Supplicant */ - MAKE_802_3_HEADER(Header802_3, pHandshake4Way->SAddr, - pHandshake4Way->AAddr, EAPOL); - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - RTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3, - (PUCHAR)pEapolFrame, - CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) ? - FALSE : - TRUE); - /* Trigger Retry Timer*/ - RTMPModTimer(&pHandshake4Way->MsgRetryTimer, PEER_MSG1_RETRY_EXEC_INTV); - /* Update State*/ - pHandshake4Way->WpaState = AS_PTKSTART; - pHandshake4Way->GTKState = REKEY_NEGOTIATING; - os_free_mem(mpool); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s: send Msg1 of 4-way\n", __func__)); -} - -VOID WPABuildPairMsg2(IN PRTMP_ADAPTER pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry) -{ - UCHAR Header802_3[14]; - UCHAR *mpool; - PEAPOL_PACKET pEapolFrame; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - BOOLEAN is_unencrypted = TRUE; - STA_TR_ENTRY *tr_entry; - - /* Allocate memory for output*/ - os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); - - if (mpool == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : no memory!!!\n", __func__)); - return; - } - - pHandshake4Way = &pSecConfig->Handshake; - pEapolFrame = (PEAPOL_PACKET)mpool; - NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); - /* Construct EAPoL message - Pairwise Msg 2*/ - /* EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,DataKD_M2)*/ - WPAConstructEapolMsg(pEntry, EAPOL_PAIR_MSG_2, - pSecConfig, /* Pairwise */ - pSecConfig, /* Group */ - pEapolFrame); - /* Make outgoing frame: Supplicant send to Authenticator */ - MAKE_802_3_HEADER(Header802_3, pHandshake4Way->AAddr, - pHandshake4Way->SAddr, EAPOL); - - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - if (pSecConfig->is_eapol_encrypted && - tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) - is_unencrypted = FALSE; - - RTMPToWirelessSta(pAd, pEntry, Header802_3, sizeof(Header802_3), - (PUCHAR)pEapolFrame, - CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, - is_unencrypted); - os_free_mem(mpool); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s: send Msg2 of 4-way\n", __func__)); -} - -VOID WPABuildPairMsg3(IN PRTMP_ADAPTER pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry) -{ - UCHAR Header802_3[14]; - UCHAR *mpool; - PEAPOL_PACKET pEapolFrame; - STA_TR_ENTRY *tr_entry; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - ASIC_SEC_INFO Info = { 0 }; -#if defined(CONFIG_HOTSPOT) && defined(CONFIG_AP_SUPPORT) - UCHAR HSClientGTK[32]; - /* UCHAR *gtk_ptr = NULL; */ -#endif - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_Entry(pEntry)) { - struct fils_info *filsInfo = &pEntry->filsInfo; - if (filsInfo->is_pending_decrypt) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: 1x daemon process the rquest and ongoing ====== %d\n", - __func__, __LINE__)); - return; - } - } -#endif /* OCE_FILS_SUPPORT */ - - /* Allocate memory for input*/ - os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); - - if (mpool == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : no memory!!!\n", __func__)); - return; - } - - pHandshake4Way = &pSecConfig->Handshake; - pEapolFrame = (PEAPOL_PACKET)mpool; - NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); - /* Increment replay counter by 1*/ - ADD_ONE_To_64BIT_VAR(pHandshake4Way->ReplayCounter); - - /* Get Group TxTsc form Asic*/ - if (pEntry->wdev) - AsicGetTxTsc(pAd, pEntry->wdev, pHandshake4Way->RSC); - -#if defined(CONFIG_HOTSPOT) && defined(CONFIG_AP_SUPPORT) - - if (pEntry->wdev && pEntry->wdev->func_idx >= 0 && - pAd->ApCfg.MBSSID[pEntry->wdev->func_idx].HotSpotCtrl.HotSpotEnable && - pAd->ApCfg.MBSSID[pEntry->wdev->func_idx].HotSpotCtrl.DGAFDisable) { - /* Radom GTK for hotspot sation client */ - GenRandom(pAd, pEntry->Addr, HSClientGTK); - /* gtk_ptr = HSClientGTK; */ - os_move_mem(pSecConfig->HsUniGTK, HSClientGTK, LEN_MAX_GTK); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:Random unique GTK for each mobile device when dgaf disable\n", - __func__)); - hex_dump("GTK", pSecConfig->HsUniGTK, 32); - } - -#endif - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pEntry->wcid; - Info.BssIndex = pEntry->func_tb_idx; - Info.Cipher = pSecConfig->PairwiseCipher; - Info.KeyIdx = pSecConfig->PairwiseKeyId; - os_move_mem(&Info.PeerAddr[0], pEntry->Addr, MAC_ADDR_LEN); - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS(pSecConfig->AKMMap)) { - UCHAR kck_len = 0, kek_len = 0, tk_len = 0; - - tk_len = sec_get_cipher_key_len(pSecConfig->PairwiseCipher); - kck_len = sec_get_kck_len(pSecConfig); - kek_len = sec_get_kek_len(pSecConfig); - - os_move_mem(Info.Key.Key, &pSecConfig->PTK[kck_len + kek_len], - tk_len); - } else -#endif /* OCE_FILS_SUPPORT */ - { - if (IS_AKM_OWE(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) - os_move_mem(Info.Key.Key, - &pSecConfig->PTK[LEN_PTK_KCK_SHA384 + - LEN_PTK_KEK_SHA384], - LEN_AES_TK); - - else if (IS_AKM_SHA384(pSecConfig->AKMMap) || - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) - os_move_mem(Info.Key.Key, - &pSecConfig->PTK[LEN_PTK_KCK_SHA384 + - LEN_PTK_KEK_SHA384], - LEN_TK_SHA384); - else - os_move_mem(Info.Key.Key, - &pSecConfig->PTK[LEN_PTK_KCK + LEN_PTK_KEK], - (LEN_TK + LEN_TK2)); - } - WPAInstallKey(pAd, &Info, TRUE, TRUE); - /* Construct EAPoL message - Pairwise Msg 3*/ - pHandshake4Way->MsgType = EAPOL_PAIR_MSG_3; - WPAConstructEapolMsg(pEntry, EAPOL_PAIR_MSG_3, - pSecConfig, /* Pairwise */ - &pEntry->wdev->SecConfig, /* Group */ - pEapolFrame); -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_Entry(pEntry)) { - struct fils_info *filsInfo = &pEntry->filsInfo; - - if (!filsInfo->is_pending_encrypt) { - if (filsInfo->pending_ie) { - os_free_mem(filsInfo->pending_ie); - filsInfo->pending_ie = NULL; - filsInfo->pending_ie_len = 0; - } - - filsInfo->pending_ie_len = - CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + - 4; - os_alloc_mem(NULL, (UCHAR **)&filsInfo->pending_ie, - filsInfo->pending_ie_len); - if (!filsInfo->pending_ie) { - return; - } - - NdisZeroMemory(filsInfo->pending_ie, - filsInfo->pending_ie_len); - NdisCopyMemory(filsInfo->pending_ie, pEapolFrame, - filsInfo->pending_ie_len); - filsInfo->is_pending_encrypt = TRUE; - - DOT1X_InternalCmdAction(pAd, pEntry, - DOT1X_AEAD_ENCR_EVENT); - os_free_mem(mpool); - - return; - } - } -#endif /* OCE_FILS_SUPPORT */ - - /* Make outgoing frame: Authenticator send to Supplicant */ - MAKE_802_3_HEADER(Header802_3, pHandshake4Way->SAddr, - pHandshake4Way->AAddr, EAPOL); - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - RTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3, - (PUCHAR)pEapolFrame, - CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) ? - FALSE : - TRUE); - RTMPSetTimer(&pHandshake4Way->MsgRetryTimer, PEER_MSG3_RETRY_EXEC_INTV); - os_free_mem(mpool); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s: send Msg3 of 4-way\n", __func__)); -} - -VOID WPABuildPairMsg4(IN PRTMP_ADAPTER pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry) -{ - UCHAR Header802_3[14]; - UCHAR *mpool; - STA_TR_ENTRY *tr_entry; - PEAPOL_PACKET pEapolFrame; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - ASIC_SEC_INFO Info = { 0 }; - BOOLEAN is_unencrypted = TRUE; -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - PAPCLI_STRUCT pApCliEntry; -#endif - - /* Allocate memory for output*/ - os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); - - if (mpool == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : no memory!!!\n", __func__)); - return; - } - - pHandshake4Way = &pSecConfig->Handshake; - pEapolFrame = (PEAPOL_PACKET)mpool; - NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); - /* Construct EAPoL message - Pairwise Msg 4*/ - WPAConstructEapolMsg(pEntry, EAPOL_PAIR_MSG_4, - pSecConfig, /* Pairwise */ - pSecConfig, /* Group */ - pEapolFrame); - /* Update WpaState*/ - pSecConfig->Handshake.WpaState = AS_PTKINITDONE; - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pEntry->wcid; - Info.BssIndex = pEntry->func_tb_idx; - Info.Cipher = pSecConfig->PairwiseCipher; - Info.KeyIdx = pSecConfig->PairwiseKeyId; - os_move_mem(&Info.PeerAddr[0], pEntry->Addr, MAC_ADDR_LEN); - - if (IS_AKM_OWE(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) - os_move_mem(Info.Key.Key, - &pSecConfig->PTK[LEN_PTK_KCK_SHA384 + - LEN_PTK_KEK_SHA384], - LEN_AES_TK); - - else if (IS_AKM_SHA384(pSecConfig->AKMMap)) - os_move_mem(Info.Key.Key, - &pSecConfig->PTK[LEN_PTK_KCK_SHA384 + - LEN_PTK_KEK_SHA384], - LEN_TK_SHA384); - else - os_move_mem(Info.Key.Key, - &pSecConfig->PTK[LEN_PTK_KCK + LEN_PTK_KEK], - (LEN_TK + LEN_TK2)); - /* open 802.1x port control and privacy filter*/ - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; - pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; - - /* move port secured before EAPOL msg sent out to prevent drop on LMAC AC reset, related to FAST_EAPOL_WAR */ - WifiSysUpdatePortSecur(pAd, pEntry, &Info); - - /* Make outgoing frame: Supplicant send to Authenticator */ - MAKE_802_3_HEADER(Header802_3, pHandshake4Way->AAddr, - pHandshake4Way->SAddr, EAPOL); - if (pSecConfig->is_eapol_encrypted && - tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) - is_unencrypted = FALSE; - - RTMPToWirelessSta(pAd, pEntry, Header802_3, sizeof(Header802_3), - (PUCHAR)pEapolFrame, - CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, - is_unencrypted); - - if (pHandshake4Way->AllowInsPTK == TRUE) { - WPAInstallKey(pAd, &Info, FALSE, TRUE); - pHandshake4Way->AllowInsPTK = FALSE; - pEntry->AllowUpdateRSC = TRUE; - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : the M3 reinstall attack, skip install key\n", - __func__)); - } - - os_free_mem(mpool); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (IS_ENTRY_APCLI(pEntry)) { -#ifdef APCLI_AUTO_CONNECT_SUPPORT - UCHAR ifIdx = 0; - - if (pEntry->wdev) - ifIdx = pEntry->wdev->func_idx; - - if (pAd->ApCfg.ApCliAutoConnectRunning[ifIdx] == TRUE) { - pAd->ApCfg.ApCliAutoConnectRunning[ifIdx] = - FALSE; - MTWF_LOG( - DBG_CAT_CLIENT, CATCLIENT_APCLI, - DBG_LVL_TRACE, - ("Apcli auto connected:WPABuildPairMsg4(),pAd->ApCfg.ApCliAutoConnectRunning[%d]=%d\n", - ifIdx, - pAd->ApCfg.ApCliAutoConnectRunning - [ifIdx])); - } -#endif /* APCLI_AUTO_CONNECT_SUPPORT*/ - -#ifdef APCLI_SUPPORT -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - pApCliEntry = - &pAd->ApCfg.ApCliTab[tr_entry->func_tb_idx]; - if (IS_CIPHER_AES_Entry(pEntry) && - (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED)) /*For security AES case*/ - wapp_send_apcli_association_change( - WAPP_APCLI_ASSOCIATED, pAd, - pApCliEntry); -#endif /*WAPP_SUPPORT*/ -#if defined(MWDS) || defined(CONFIG_MAP_SUPPORT) - if (pEntry && (pEntry->func_tb_idx < MAX_APCLI_NUM) && - tr_entry) { - if (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED) { -#ifdef CONFIG_MAP_SUPPORT - MTWF_LOG(DBG_CAT_CLIENT, - CATCLIENT_APCLI, DBG_LVL_TRACE, - ("APCLIENT MAP_ENABLE\n")); -#ifdef A4_CONN - map_a4_peer_enable(pAd, pEntry, FALSE); -#endif - map_send_bh_sta_wps_done_event( - pAd, pEntry, FALSE); -#endif - } - } -#endif /* defined(MWDS) || defined(CONFIG_MAP_SUPPORT) */ -#endif /* APCLI_SUPPORT */ - } - } -#endif /* CONFIG_AP_SUPPORT */ - - /* move port secured before EAPOL msg sent out to prevent drop on LMAC AC reset, related to FAST_EAPOL_WAR */ - /* WifiSysUpdatePortSecur(pAd, pEntry, &Info); */ - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> WifiSysUpdatePortSecur called by (%s), wcid=%d, PortSecured=%d\n", - __func__, pEntry->wcid, STATE_PORT_SECURE)); - -#ifdef APCLI_SUPPORT -#ifdef APCLI_OWE_SUPPORT - if ((IS_ENTRY_APCLI(pEntry) || IS_ENTRY_REPEATER(pEntry)) && - (IS_AKM_OWE(pSecConfig->AKMMap))) { - OWE_INFO *owe = &pSecConfig->owe; - UINT pmk_len = LEN_PMK; - UCHAR intf_idx = pEntry->func_tb_idx; - UCHAR CliIdx = 0xff; - - if (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384) - pmk_len = LEN_PMK_SHA384; - -#ifdef MAC_REPEATER_SUPPORT - if (pEntry->bReptCli == TRUE) { - intf_idx = pEntry->MatchReptCliIdx; - CliIdx = pEntry->MatchReptCliIdx; - } -#endif - - if (owe->pmkid) { - apcli_add_pmkid_cache(pAd, pEntry->Addr, owe->pmkid, - pSecConfig->PMK, pmk_len, - intf_idx, CliIdx); - MTWF_LOG( - DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("Store PMKID for MAC=>0x%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pEntry->Addr))); - hex_dump("PMK cache ID", owe->pmkid, LEN_PMKID); - hex_dump("PMK key", pSecConfig->PMK, pmk_len); - } - } -#endif -#endif - -#ifdef DOT11_SAE_SUPPORT - if (IS_AKM_WPA3PSK(pSecConfig->AKMMap)) - set_sae_instance_removable(&pAd->SaeCfg, - pSecConfig->Handshake.SAddr, - pSecConfig->Handshake.AAddr); -#endif - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s: send Msg4 of 4-way\n", __func__)); -} - -VOID WPABuildGroupMsg1(IN PRTMP_ADAPTER pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry) -{ - UCHAR Header802_3[14]; - UCHAR *mpool; - PEAPOL_PACKET pEapolFrame; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); - - if (pEntry->wdev == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : pEntry->wdev is NULL!!!\n", __func__)); - return; - } - - /* Allocate memory for output*/ - os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); - - if (mpool == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : no memory!!!\n", __func__)); - return; - } - - pHandshake4Way = &pSecConfig->Handshake; - pEapolFrame = (PEAPOL_PACKET)mpool; - NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); - /* Increment replay counter by 1*/ - ADD_ONE_To_64BIT_VAR(pSecConfig->Handshake.ReplayCounter); - - /* Get Group TxTsc form Asic*/ - AsicGetTxTsc(pAd, pEntry->wdev, pHandshake4Way->RSC); - - /* Construct EAPoL message - Group Msg 1*/ - pHandshake4Way->MsgType = EAPOL_GROUP_MSG_1; - WPAConstructEapolMsg(pEntry, EAPOL_GROUP_MSG_1, - pSecConfig, /* Pairwise */ - &pEntry->wdev->SecConfig, /* Group */ - pEapolFrame); - /* Make outgoing frame: Authenticator send to Supplicant */ - MAKE_802_3_HEADER(Header802_3, pHandshake4Way->SAddr, - pHandshake4Way->AAddr, EAPOL); - RTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3, - (PUCHAR)pEapolFrame, - CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, - FALSE); - os_free_mem(mpool); - - /* Trigger Retry Timer*/ - /* When group retry counter > limit, extend rekey time interval */ - if (pHandshake4Way->MsgRetryCounter > GROUP_MSG1_RETRY_LIMIT) - RTMPModTimer(&pHandshake4Way->MsgRetryTimer, - GROUP_MSG1_RETRY_EXEC_EXTEND); - else - RTMPModTimer(&pHandshake4Way->MsgRetryTimer, - GROUP_MSG1_RETRY_EXEC_INTV); - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s : send out Group Message 1\n", __func__)); -} - -VOID WPABuildGroupMsg2(IN PRTMP_ADAPTER pAd, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MAC_TABLE_ENTRY *pEntry) -{ - UCHAR Header802_3[14]; - UCHAR *mpool; - PEAPOL_PACKET pEapolFrame; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); - /* Allocate memory for output*/ - os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); - - if (mpool == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!%s : no memory!!!\n", __func__)); - return; - } - - pHandshake4Way = &pSecConfig->Handshake; - pEapolFrame = (PEAPOL_PACKET)mpool; - NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); - /* Construct EAPoL message - Group Msg 2*/ - WPAConstructEapolMsg(pEntry, EAPOL_GROUP_MSG_2, - pSecConfig, /* Pairwise */ - pSecConfig, /* Group */ - pEapolFrame); - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef APCLI_SUPPORT -#ifdef A4_CONN - if (pEntry && IS_ENTRY_APCLI(pEntry) && - (pEntry->func_tb_idx < MAX_APCLI_NUM)) { - STA_TR_ENTRY *tr_entry = NULL; - - if (VALID_TR_WCID(pEntry->wcid)) - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - - if (tr_entry && (tr_entry->PortSecured == - WPA_802_1X_PORT_SECURED)) { -#if defined(CONFIG_MAP_SUPPORT) && defined(WAPP_SUPPORT) - PAPCLI_STRUCT pApCliEntry = - &pAd->ApCfg - .ApCliTab[pEntry->func_tb_idx]; - /*For security TKIP case*/ - wapp_send_apcli_association_change( - WAPP_APCLI_ASSOCIATED, pAd, - pApCliEntry); -#endif /*WAPP_SUPPORT*/ -#ifdef CONFIG_MAP_SUPPORT - map_a4_peer_enable(pAd, pEntry, FALSE); -#endif - } - } -#endif /* A4_CONN */ -#endif /* APCLI_SUPPORT */ - } -#endif /* CONFIG_AP_SUPPORT */ - - /* Make outgoing frame: Supplicant send to Authenticator */ - MAKE_802_3_HEADER(Header802_3, pHandshake4Way->AAddr, - pHandshake4Way->SAddr, EAPOL); - RTMPToWirelessSta(pAd, pEntry, Header802_3, sizeof(Header802_3), - (PUCHAR)pEapolFrame, - CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, - FALSE); - os_free_mem(mpool); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== %s : send out Group Message 2\n", __func__)); -} - -VOID PeerPairMsg1Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem) -{ - UCHAR PTK[120]; - PEAPOL_PACKET pReceiveEapol; - UINT MsgLen; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - unsigned char hdr_len = LENGTH_802_11; - UINT8 len_ptk = LEN_AES_PTK; -#ifdef A4_CONN - PHEADER_802_11 pHeader; - -#endif - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); -#ifdef A4_CONN - pHeader = (PHEADER_802_11)Elem->Msg; - if (pHeader->FC.FrDs == 1 && pHeader->FC.ToDs == 1) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - - if (Elem->MsgLen < (hdr_len + LENGTH_802_1_H + LENGTH_EAPOL_H + - MIN_LEN_OF_EAPOL_KEY_MSG)) - return; - - pHandshake4Way = &pSecConfig->Handshake; - /* skip 802.11_header(24-byte) and LLC_header(8) */ - pReceiveEapol = (PEAPOL_PACKET)&Elem->Msg[hdr_len + LENGTH_802_1_H]; - MsgLen = Elem->MsgLen - hdr_len - LENGTH_802_1_H; - - /* Sanity Check peer Pairwise message 2 - Replay Counter, MIC, RSNIE*/ - if (WpaMessageSanity(pAd, pReceiveEapol, MsgLen, EAPOL_PAIR_MSG_1, - pSecConfig, pEntry) == FALSE) - return; - - /* Store Replay counter, it will use to verify message 3 and construct message 2*/ - NdisMoveMemory(pHandshake4Way->ReplayCounter, - pReceiveEapol->KeyDesc.ReplayCounter, - LEN_KEY_DESC_REPLAY); - /* Store ANonce*/ - NdisMoveMemory(pHandshake4Way->ANonce, pReceiveEapol->KeyDesc.KeyNonce, - LEN_KEY_DESC_NONCE); - /* Generate random SNonce*/ - GenRandom(pAd, (UCHAR *)pHandshake4Way->SAddr, pHandshake4Way->SNonce); - pHandshake4Way->AllowInsPTK = TRUE; - pEntry->AllowUpdateRSC = FALSE; - pEntry->SecConfig.LastGroupKeyId = 0; - NdisZeroMemory(pEntry->SecConfig.LastGTK, LEN_MAX_GTK); - - if (is_pmkid_cache_in_sec_config(pSecConfig)) { -#ifdef CONFIG_OWE_SUPPORT -#ifdef APCLI_OWE_SUPPORT - if (IS_AKM_OWE(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA256)) { - if (pSecConfig->owe.last_try_group == - pSecConfig->owe.curr_group) - NdisMoveMemory(pSecConfig->PMK, - pSecConfig->pmk_cache, LEN_PMK); - else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("===> %s:PMK Cache not valid as owe group changed from %d to %d\n", - __func__, - pSecConfig->owe.last_try_group, - pSecConfig->owe.curr_group)); - return; - } - } else if (IS_AKM_OWE(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) { - if (pSecConfig->owe.last_try_group == - pSecConfig->owe.curr_group) - NdisMoveMemory(pSecConfig->PMK, - pSecConfig->pmk_cache, - LEN_PMK_SHA384); - else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("===> %s:PMK Cache not valid as owe group changed from %d to %d\n", - __func__, - pSecConfig->owe.last_try_group, - pSecConfig->owe.curr_group)); - return; - } - } else -#endif -#endif - { - NdisMoveMemory(pSecConfig->PMK, pSecConfig->pmk_cache, - LEN_PMK); - } - } -#ifdef CONFIG_OWE_SUPPORT -#ifdef APCLI_OWE_SUPPORT - else if (pEntry->need_process_ecdh_ie == TRUE) { - process_ecdh_element(pAd, pEntry, - (EXT_ECDH_PARAMETER_IE *)&pEntry->ecdh_ie, - pEntry->ecdh_ie.length, SUBTYPE_ASSOC_RSP, - FALSE); - } -#endif -#endif - - if (IS_AKM_OWE(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) - len_ptk = LEN_OWE_PTK_SHA384; - else if (IS_AKM_SHA384(pSecConfig->AKMMap)) - len_ptk = LEN_PTK_SHA384; - - if (IS_AKM_OWE(pSecConfig->AKMMap)) { - WpaDerivePTK_KDF_256(pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, len_ptk); - NdisMoveMemory(pSecConfig->PTK, PTK, len_ptk); - hex_dump("PTK", PTK, len_ptk); - } else if (IS_AKM_SHA384(pSecConfig->AKMMap) || - pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384) { - WpaDerivePTK_KDF_384(pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, len_ptk); - NdisMoveMemory(pSecConfig->PTK, PTK, len_ptk); - hex_dump("PTK SHA384", PTK, len_ptk); - } else if (IS_AKM_SAE(pSecConfig->AKMMap)) { - WpaDerivePTK_KDF_256(pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, LEN_AES_PTK); - NdisMoveMemory(pSecConfig->PTK, PTK, LEN_AES_PTK); - } else -#ifdef DOT11W_PMF_SUPPORT - if (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA256) { - WpaDerivePTK_KDF_256(pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, - LEN_AES_PTK); /* Must is 48 bytes */ - NdisMoveMemory(pSecConfig->PTK, PTK, LEN_AES_PTK); - hex_dump("PTK", PTK, LEN_AES_PTK); - } else -#endif /* DOT11W_PMF_SUPPORT */ - { - /* Derive PTK*/ - WpaDerivePTK(pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, LEN_PTK); - NdisMoveMemory(pSecConfig->PTK, PTK, LEN_PTK); - } - - /* Update WpaState*/ - pSecConfig->Handshake.WpaState = AS_PTKINIT_NEGOTIATING; - WPABuildPairMsg2(pAd, pSecConfig, pEntry); -} - -VOID PeerPairMsg2Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem) -{ - UCHAR PTK[120]; - BOOLEAN Cancelled; - PHEADER_802_11 pHeader; - PEAPOL_PACKET pReceiveEapol; - UINT MsgLen; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - unsigned char hdr_len = LENGTH_802_11; - UINT8 len_ptk = LEN_AES_PTK; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); - - pHandshake4Way = &pSecConfig->Handshake; - /* check Entry in valid State*/ - if (pHandshake4Way->WpaState < AS_PTKSTART) - return; - /* Prevent the Replayed Msg2 Attack */ - if (pHandshake4Way->WpaState == AS_PTKINITDONE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: reject the Replayed Msg2\n", __func__)); - return; - } - - /* pointer to 802.11 header*/ - pHeader = (PHEADER_802_11)Elem->Msg; -#ifdef A4_CONN - if (pHeader->FC.FrDs == 1 && pHeader->FC.ToDs == 1) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - - if (Elem->MsgLen < (hdr_len + LENGTH_802_1_H + LENGTH_EAPOL_H + - MIN_LEN_OF_EAPOL_KEY_MSG)) - return; - - /* skip 802.11_header(24-byte) and LLC_header(8) */ - pReceiveEapol = (PEAPOL_PACKET)&Elem->Msg[hdr_len + LENGTH_802_1_H]; - MsgLen = Elem->MsgLen - hdr_len - LENGTH_802_1_H; - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_Entry(pEntry)) { - struct fils_info *filsInfo = &pEntry->filsInfo; - if (filsInfo->is_pending_decrypt) { - if (filsInfo->last_pending_id == pHeader->Sequence) { - goto skip_ptk; - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("1x daemon ongoing %s: %d\n", - __func__, __LINE__)); - return; - } - } - } -#endif /* OCE_FILS_SUPPORT */ - /* Store SNonce*/ - NdisMoveMemory(pHandshake4Way->SNonce, pReceiveEapol->KeyDesc.KeyNonce, - LEN_KEY_DESC_NONCE); - - if (IS_AKM_OWE(pSecConfig->AKMMap) && - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) - len_ptk = LEN_OWE_PTK_SHA384; - else if (IS_AKM_SHA384(pSecConfig->AKMMap)) - len_ptk = LEN_PTK_SHA384; - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS_SHA256(pSecConfig->AKMMap)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("receive the msg2 using FILS-SHA256\n")); - len_ptk = 0 + 32 + LEN_TK; /* FILS-SH256: KCK + KEK + TK */ - WpaDerivePTK_KDF_256(pSecConfig->PMK, pHandshake4Way->ANonce, - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, - pHandshake4Way->SAddr, PTK, len_ptk); - } else if (IS_AKM_FILS_SHA384(pSecConfig->AKMMap)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("receive the msg2 using FILS-SHA384\n")); - len_ptk = 0 + 64 + LEN_TK; /* FILS-SH384: KCK + KEK + TK */ - WpaDerivePTK_KDF_384(pSecConfig->PMK, pHandshake4Way->ANonce, - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, - pHandshake4Way->SAddr, PTK, len_ptk); - } else -#endif /* OCE_FILS_SUPPORT */ - -#ifdef DOT11R_FT_SUPPORT - - if (IS_FT_RSN_STA(pEntry)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - UINT8 ptk_len; - UCHAR apidx = 0; - struct wifi_dev *wdev; - PFT_CFG pFtCfg; - - if (pEntry->func_tb_idx >= pAd->ApCfg.BssidNum) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: func_tb_idx=%d, return here.\n", - __func__, pEntry->func_tb_idx)); - return; - } else - apidx = pEntry->func_tb_idx; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - pFtCfg = &wdev->FtCfg; - FT_DerivePMKR0(pSecConfig->PMK, LEN_PMK, - (PUINT8)pAd->ApCfg.MBSSID[apidx].Ssid, - pAd->ApCfg.MBSSID[apidx].SsidLen, - pFtCfg->FtMdId, pFtCfg->FtR0khId, - pFtCfg->FtR0khIdLen, pEntry->Addr, - pEntry->FT_PMK_R0, - pEntry->FT_PMK_R0_NAME); - FT_DerivePMKR1(pEntry->FT_PMK_R0, - pEntry->FT_PMK_R0_NAME, - wdev->bssid, /* R1KHID*/ - pEntry->Addr, /* S1KHID*/ - pEntry->FT_PMK_R1, - pEntry->FT_PMK_R1_NAME); - - if (IS_CIPHER_TKIP_Entry(pEntry)) - ptk_len = 32 + 32; - else - ptk_len = 32 + 16; - - FT_DerivePTK(pEntry->FT_PMK_R1, pEntry->FT_PMK_R1_NAME, - pHandshake4Way->ANonce, - pHandshake4Way->SNonce, - wdev->bssid, /* Bssid*/ - pEntry->Addr, /* sta mac*/ - ptk_len, pEntry->FT_PTK, pEntry->PTK_NAME); - NdisCopyMemory(pSecConfig->PTK, pEntry->FT_PTK, - LEN_MAX_PTK); - len_ptk = LEN_MAX_PTK; - NdisCopyMemory(PTK, pEntry->FT_PTK, LEN_MAX_PTK); - } -#endif /* CONFIG_AP_SUPPORT */ - } else -#endif /* DOT11R_FT_SUPPORT */ - if (IS_AKM_OWE(pSecConfig->AKMMap)) { - WpaDerivePTK_KDF_256(pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, - len_ptk); - NdisMoveMemory(pSecConfig->PTK, PTK, len_ptk); - hex_dump("OWE PTK", PTK, len_ptk); - } else if (IS_AKM_SHA384(pSecConfig->AKMMap) || - pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384) { - WpaDerivePTK_KDF_384(pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, - len_ptk); - NdisMoveMemory(pSecConfig->PTK, PTK, len_ptk); - hex_dump("PTK SHA384", PTK, len_ptk); - } else if (IS_AKM_SAE(pSecConfig->AKMMap)) { - WpaDerivePTK_KDF_256( - pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, - LEN_AES_PTK); /* Must is 48 bytes */ - NdisMoveMemory(pSecConfig->PTK, PTK, LEN_AES_PTK); - hex_dump("PTK", PTK, LEN_AES_PTK); - } else -#ifdef DOT11W_PMF_SUPPORT - if (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA256) { - WpaDerivePTK_KDF_256( - pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, - LEN_AES_PTK); /* Must is 48 bytes */ - NdisMoveMemory(pSecConfig->PTK, PTK, LEN_AES_PTK); - hex_dump("PTK", PTK, LEN_AES_PTK); - } else -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef CONFIG_HOTSPOT_R2 - if (CLIENT_STATUS_TEST_FLAG( - pEntry, fCLIENT_STATUS_OSEN_CAPABLE)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("got msg2 derivePTK\n")); - WpaDerivePTK_KDF_256( - pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, - LEN_AES_PTK); /* Must is 48 bytes */ - NdisMoveMemory(pSecConfig->PTK, PTK, LEN_AES_PTK); - hex_dump("PTK", PTK, LEN_AES_PTK); - } else -#endif /* CONFIG_HOTSPOT_R2 */ - { - /* Derive PTK*/ - len_ptk = LEN_PTK; - WpaDerivePTK(pSecConfig->PMK, - pHandshake4Way->ANonce, /* ANONCE*/ - pHandshake4Way->AAddr, - pHandshake4Way->SNonce, /* SNONCE*/ - pHandshake4Way->SAddr, PTK, LEN_PTK); - NdisMoveMemory(pSecConfig->PTK, PTK, len_ptk); - } - -#ifdef OCE_FILS_SUPPORT -skip_ptk: - if (IS_AKM_FILS_Entry(pEntry)) { - struct fils_info *filsInfo = &pEntry->filsInfo; - - if (filsInfo->pending_ie) { - os_free_mem(filsInfo->pending_ie); - filsInfo->pending_ie_len = 0; - filsInfo->pending_ie = NULL; - } - - if (!filsInfo->is_pending_decrypt) { - filsInfo->pending_ie_len = Elem->MsgLen; - os_alloc_mem(NULL, (UCHAR **)&filsInfo->pending_ie, - filsInfo->pending_ie_len); - if (!filsInfo->pending_ie) { - return; - } - - NdisMoveMemory(filsInfo->pending_ie, Elem->Msg, - filsInfo->pending_ie_len); - NdisMoveMemory(&filsInfo->rssi_info, &Elem->rssi_info, - sizeof(struct raw_rssi_info)); - filsInfo->pending_decrypt = PeerPairMsg2Action; - - filsInfo->is_pending_decrypt = TRUE; - filsInfo->last_pending_id = pHeader->Sequence; - - NdisMoveMemory(filsInfo->PTK, PTK, len_ptk); - filsInfo->PTK_len = len_ptk; - - DOT1X_InternalCmdAction(pAd, pEntry, - DOT1X_AEAD_DECR_EVENT); - return; - } else { - filsInfo->is_pending_decrypt = FALSE; - filsInfo->pending_decrypt = NULL; - - if (filsInfo->last_pending_id != pHeader->Sequence) { - return; - } - - if (filsInfo->status != MLME_SUCCESS) { - return; - } - - /* restore the PTK from perivous cal. */ - len_ptk = filsInfo->PTK_len; - NdisMoveMemory(PTK, filsInfo->PTK, len_ptk); - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("STA - %02x:%02x:%02x:%02x:%02x:%02x do FILS AEAD with status %d\n", - PRINT_MAC(pEntry->Addr), filsInfo->status)); - } - } -#endif /* OCE_FILS_SUPPORT */ - /* Sanity Check peer Pairwise message 2 - Replay Counter, MIC, RSNIE*/ - if (WpaMessageSanity(pAd, pReceiveEapol, MsgLen, EAPOL_PAIR_MSG_2, - pSecConfig, pEntry) == FALSE) { -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_AUTH_FAIL, - REASON_4WAY_HS_MSG2_FAIL); -#endif - return; - } - - /* refill the information if MIC Pass */ - NdisMoveMemory(pSecConfig->PTK, PTK, len_ptk); - - /* delete retry timer*/ - RTMPCancelTimer(&pHandshake4Way->MsgRetryTimer, &Cancelled); - pHandshake4Way->MsgRetryCounter = 0; - /* Change state*/ - pHandshake4Way->WpaState = AS_PTKINIT_NEGOTIATING; - WPABuildPairMsg3(pAd, pSecConfig, pEntry); -} - -VOID PeerPairMsg3Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem) -{ - PHEADER_802_11 pHeader; - PEAPOL_PACKET pReceiveEapol; - UINT MsgLen; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - unsigned char hdr_len = LENGTH_802_11; - UCHAR idx = 0; - BOOLEAN bWPA2 = TRUE; - - /* Choose WPA2 or not*/ - if (IS_AKM_WPA1(pSecConfig->AKMMap) || - IS_AKM_WPA1PSK(pSecConfig->AKMMap)) - bWPA2 = FALSE; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); - - pHandshake4Way = &pSecConfig->Handshake; - /* Record 802.11 header & the received EAPOL packet Msg3*/ - pHeader = (PHEADER_802_11)Elem->Msg; -#ifdef A4_CONN - if (pHeader->FC.FrDs == 1 && pHeader->FC.ToDs == 1) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - - if (Elem->MsgLen < (hdr_len + LENGTH_802_1_H + LENGTH_EAPOL_H + - MIN_LEN_OF_EAPOL_KEY_MSG)) - return; - - pReceiveEapol = (PEAPOL_PACKET)&Elem->Msg[hdr_len + LENGTH_802_1_H]; - MsgLen = Elem->MsgLen - hdr_len - LENGTH_802_1_H; - - /* Sanity Check peer Pairwise message 3 - Replay Counter, MIC, RSNIE*/ - if (WpaMessageSanity(pAd, pReceiveEapol, MsgLen, EAPOL_PAIR_MSG_3, - pSecConfig, pEntry) == FALSE) - return; - - if ((pHandshake4Way->AllowInsPTK == TRUE) && bWPA2) { - UCHAR kid = pEntry->SecConfig.LastGroupKeyId; - pEntry->CCMP_BC_PN[kid] = 0; - for (idx = 0; idx < (LEN_KEY_DESC_RSC - 2); idx++) - pEntry->CCMP_BC_PN[kid] += - ((UINT64)pReceiveEapol->KeyDesc.KeyRsc[idx] - << (idx * 8)); - pEntry->Init_CCMP_BC_PN_Passed[kid] = FALSE; - pEntry->AllowUpdateRSC = FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): update CCMP_BC_PN to %llu\n", __FUNCTION__, - pEntry->wcid, pEntry->CCMP_BC_PN[kid])); -#ifdef MAC_REPEATER_SUPPORT - /* sync PN of ApCli entry as the time rept rekey */ - if (pAd->ApCfg.bMACRepeaterEn == TRUE) { - MAC_TABLE_ENTRY *pEntry2 = - MacTableLookup(pAd, pHeader->Addr2); - - if (pEntry2 != NULL) { - pEntry2->CCMP_BC_PN[kid] = - pEntry->CCMP_BC_PN[kid]; - pEntry2->Init_CCMP_BC_PN_Passed[kid] = - pEntry->Init_CCMP_BC_PN_Passed[kid]; - pEntry2->AllowUpdateRSC = - pEntry->AllowUpdateRSC; - } - } -#endif - } - - /* Save Replay counter, it will use construct message 4*/ - NdisMoveMemory(pHandshake4Way->ReplayCounter, - pReceiveEapol->KeyDesc.ReplayCounter, - LEN_KEY_DESC_REPLAY); - - /* Double check ANonce*/ - if (!NdisEqualMemory(pHandshake4Way->ANonce, - pReceiveEapol->KeyDesc.KeyNonce, - LEN_KEY_DESC_NONCE)) - return; - - pSecConfig->is_eapol_encrypted = pHeader->FC.Wep; - WPABuildPairMsg4(pAd, pSecConfig, pEntry); -} - -VOID PeerPairMsg4Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem) -{ - PHEADER_802_11 pHeader; - PEAPOL_PACKET pReceiveEapolM4; - UINT EapolLen; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - STA_TR_ENTRY *tr_entry; - BOOLEAN Cancelled; - unsigned char hdr_len = LENGTH_802_11; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); - - pHandshake4Way = &pSecConfig->Handshake; - - if (pHandshake4Way->WpaState < AS_PTKINIT_NEGOTIATING) - return; - - /* Prevent the Replayed Msg4 Attack */ - if (pHandshake4Way->WpaState == AS_PTKINITDONE) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: reject the Replayed Msg4\n", __func__)); - return; - } - - /* pointer to 802.11 header*/ - pHeader = (PHEADER_802_11)Elem->Msg; -#ifdef A4_CONN - if (pHeader->FC.FrDs == 1 && pHeader->FC.ToDs == 1) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - - if (Elem->MsgLen < (hdr_len + LENGTH_802_1_H + LENGTH_EAPOL_H + - MIN_LEN_OF_EAPOL_KEY_MSG)) - return; - - /* skip 802.11_header(24-byte) and LLC_header(8) */ - pReceiveEapolM4 = (PEAPOL_PACKET)&Elem->Msg[hdr_len + LENGTH_802_1_H]; - EapolLen = Elem->MsgLen - hdr_len - LENGTH_802_1_H; - - /* Sanity Check peer Pairwise message 4 - Replay Counter, MIC*/ - if (WpaMessageSanity(pAd, pReceiveEapolM4, EapolLen, EAPOL_PAIR_MSG_4, - pSecConfig, pEntry) == FALSE) { -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_AUTH_FAIL, - REASON_4WAY_HS_MSG4_FAIL); -#endif - return; - } - /* Sanity Check pEntry->func_tb_idx to avoid out of bound with pAd->ApCfg.MBSSID*/ - if (pEntry->func_tb_idx >= HW_BEACON_MAX_NUM) - return; - - /* 4. upgrade state */ - RTMPCancelTimer(&pHandshake4Way->MsgRetryTimer, &Cancelled); - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; - pHandshake4Way->WpaState = AS_PTKINITDONE; - pHandshake4Way->GTKState = REKEY_ESTABLISHED; - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; -#if defined(DOT1X_SUPPORT) && defined(RADIUS_ACCOUNTING_SUPPORT) - - /* Notify 802.1x daemon to add this sta for accounting*/ - if (IS_AKM_WPA1PSK(pSecConfig->AKMMap) || - IS_AKM_WPA2PSK(pSecConfig->AKMMap) || - IS_AKM_WPA3PSK(pSecConfig->AKMMap)) - DOT1X_InternalCmdAction(pAd, pEntry, DOT1X_LOCAL_AUTH_ENTRY); - -#endif /* DOT1X_SUPPORT && RADIUS_ACCOUNTING_SUPPORT */ - WifiSysUpdatePortSecur(pAd, pEntry, NULL); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> WifiSysUpdatePortSecur called by (%s), wcid=%d, PortSecured=%d\n", - __func__, pEntry->wcid, STATE_PORT_SECURE)); -#ifdef WSC_AP_SUPPORT - - if (pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.WscControl.WscConfMode != - WSC_DISABLE) - WscInformFromWPA(pEntry); - -#endif /* WSC_AP_SUPPORT */ - - if (IS_AKM_WPA2(pSecConfig->AKMMap) || - IS_AKM_WPA2PSK(pSecConfig->AKMMap) || - IS_AKM_WPA3_192BIT(pSecConfig->AKMMap) || - IS_AKM_WPA3PSK(pSecConfig->AKMMap) || - IS_AKM_OWE(pSecConfig->AKMMap)) { -#ifdef CONFIG_AP_SUPPORT -#ifdef DOT11R_FT_SUPPORT - - if (IS_FT_RSN_STA(pEntry)) { - PFT_R1HK_ENTRY pR1khEntry; - PUINT8 pUCipher = NULL; - PUINT8 pAkm = NULL; - UINT8 count; - - pUCipher = WPA_ExtractSuiteFromRSNIE(pEntry->RSN_IE, - pEntry->RSNIE_Len, - PAIRWISE_SUITE, - &count); - pAkm = WPA_ExtractSuiteFromRSNIE(pEntry->RSN_IE, - pEntry->RSNIE_Len, - AKM_SUITE, &count); - /* Record the PMK-R0 related information */ - RTMPAddPMKIDCache(&pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, pEntry->Addr, - pEntry->FT_PMK_R0_NAME, - pEntry->FT_PMK_R0, LEN_PMK); - /* Delete previous entry */ - pR1khEntry = FT_R1khEntryTabLookup( - pAd, pEntry->FT_PMK_R1_NAME); - - if (pR1khEntry != NULL) - FT_R1khEntryDelete(pAd, pR1khEntry); - - /* Update R1KH table */ - if (pUCipher != NULL) - NdisMoveMemory(pEntry->FT_UCipher, pUCipher, 4); - - if (pAkm != NULL) - NdisMoveMemory(pEntry->FT_Akm, pAkm, 4); - - FT_R1khEntryInsert( - pAd, pEntry->FT_PMK_R0_NAME, - pEntry->FT_PMK_R1_NAME, pEntry->FT_PMK_R1, - pUCipher, pAkm, - (pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .PMKCachePeriod / - OS_HZ), - FT_REASSOC_DEADLINE, /* YF_TIE */ - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.FtCfg.FtR0khId, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.FtCfg.FtR0khIdLen, - pEntry->Addr); -#ifdef IAPP_SUPPORT - { - FT_KDP_EVT_ASSOC EvtAssoc; - - EvtAssoc.SeqNum = 0; - NdisMoveMemory(EvtAssoc.MacAddr, pEntry->Addr, - MAC_ADDR_LEN); - - { - FT_KDP_EVENT_INFORM( - pAd, pEntry->func_tb_idx, - FT_KDP_SIG_FT_ASSOCIATION, - &EvtAssoc, sizeof(EvtAssoc), - NULL); - } - } -#endif /* IAPP_SUPPORT */ - pR1khEntry = FT_R1khEntryTabLookup( - pAd, pEntry->FT_PMK_R1_NAME); - - if (pR1khEntry != NULL) { - pR1khEntry->AKMMap = pSecConfig->AKMMap; - hex_dump("R1KHTab-R0KHID", pR1khEntry->R0khId, - pR1khEntry->R0khIdLen); - hex_dump("R1KHTab-PairwiseCipher", - pR1khEntry->PairwisChipher, 4); - hex_dump("R1KHTab-AKM", pR1khEntry->AkmSuite, - 4); - hex_dump("R1KHTab-PMKR0Name", - pR1khEntry->PmkR0Name, 16); - hex_dump("R1KHTab-PMKR1Name", - pR1khEntry->PmkR1Name, 16); - } else - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("The entry in R1KH table doesn't exist\n")); - } else -#endif /* DOT11R_FT_SUPPORT */ -#ifdef DOT1X_SUPPORT - if (IS_AKM_WPA2(pSecConfig->AKMMap) || - IS_AKM_WPA3_192BIT(pSecConfig->AKMMap)) { - UCHAR PMK_key[20]; - UCHAR digest[80]; - UINT8 pmk_len = LEN_PMK; - - if (IS_AKM_SHA384(pSecConfig->AKMMap) || - (pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA384)) - pmk_len = LEN_PMK_SHA384; - - if (is_pmkid_cache_in_sec_config(pSecConfig) && - NdisEqualMemory(pSecConfig->PMK, - pSecConfig->pmk_cache, pmk_len)) { - NdisMoveMemory(digest, pSecConfig->pmkid, - LEN_PMKID); - } else { - /* Calculate PMKID, refer to IEEE 802.11i-2004 8.5.1.2*/ - NdisMoveMemory(&PMK_key[0], "PMK Name", 8); - NdisMoveMemory(&PMK_key[8], - pSecConfig->Handshake.AAddr, - MAC_ADDR_LEN); - NdisMoveMemory(&PMK_key[14], - pSecConfig->Handshake.SAddr, - MAC_ADDR_LEN); - if (IS_AKM_SHA384(pSecConfig->AKMMap) || - (pSecConfig->key_deri_alg == - SEC_KEY_DERI_SHA384)) { - RT_HMAC_SHA384(pSecConfig->PTK, - LEN_PTK_KCK_SHA384, - PMK_key, 20, digest, - LEN_PMKID); - } -#ifdef OCE_FILS_SUPPORT - /* Todo: why PMF sha256 didn't use it before ? */ - else if (IS_AKM_FILS_SHA256(pSecConfig->AKMMap)) - RT_HMAC_SHA256(pSecConfig->PMK, pmk_len, - PMK_key, 20, digest, - LEN_PMKID); -#endif /* OCE_FILS_SUPPORT */ - else - RT_HMAC_SHA1(pSecConfig->PMK, pmk_len, - PMK_key, 20, digest, - SHA1_DIGEST_SIZE); - } - RTMPAddPMKIDCache(&pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, - pSecConfig->Handshake.SAddr, digest, - pSecConfig->PMK, pmk_len); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Calc PMKID=%02x:%02x:%02x:%02x:%02x:%02x\n", - digest[0], digest[1], digest[2], digest[3], - digest[4], digest[5])); - } -#endif /* DOT1X_SUPPORT */ -#ifdef DOT11_SAE_SUPPORT - else if (IS_AKM_WPA3PSK(pSecConfig->AKMMap)) - set_sae_instance_removable(&pAd->SaeCfg, - pSecConfig->Handshake.AAddr, - pSecConfig->Handshake.SAddr); -#endif -#ifdef CONFIG_OWE_SUPPORT - else if (IS_AKM_OWE(pSecConfig->AKMMap)) { - INT CacheIdx; /* Key cache */ - - if (pEntry->SecConfig.owe.pmkid) { - UINT8 pmk_len = LEN_PMK; - - if (pSecConfig->key_deri_alg == - SEC_KEY_DERI_SHA384) - pmk_len = LEN_PMK_SHA384; - CacheIdx = RTMPValidatePMKIDCache( - &pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, pEntry->Addr, - pEntry->SecConfig.owe.pmkid); - - hex_dump("store pmkid:", - pEntry->SecConfig.owe.pmkid, - LEN_PMKID); - RTMPAddPMKIDCache(&pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, - pEntry->Addr, - pEntry->SecConfig.owe.pmkid, - pEntry->SecConfig.PMK, - pmk_len); - store_pmkid_cache_in_sec_config(pAd, pEntry, - CacheIdx); - } - } -#endif /*CONFIG_OWE_SUPPORT*/ -#if defined(MWDS) || defined(CONFIG_MAP_SUPPORT) || defined(WAPP_SUPPORT) - if (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) { -#if defined(CONFIG_MAP_SUPPORT) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MAP_ENABLE\n")); -#if defined(A4_CONN) - map_a4_peer_enable(pAd, pEntry, TRUE); -#endif -#endif /* CONFIG_MAP_SUPPORT */ - -#ifdef WAPP_SUPPORT - wapp_send_cli_join_event(pAd, pEntry); -#endif - } -#endif -#endif /* CONFIG_AP_SUPPORT */ - - /* send wireless event - for set key done WPA2*/ - RTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA2_EVENT_FLAG, - pEntry->Addr, pEntry->wdev->wdev_idx, 0); -#ifdef CONFIG_HOTSPOT_R2 - - if (pEntry->IsWNMReqValid == TRUE) { - struct wnm_req_data *req_data = pEntry->ReqData; - - Send_WNM_Notify_Req(pAd, req_data->peer_mac_addr, - req_data->wnm_req, - req_data->wnm_req_len, - req_data->type); - pEntry->IsWNMReqValid = FALSE; - os_free_mem(req_data); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("!!!!msg 4 send wnm req\n")); - } - -#endif -#if defined(CONFIG_HOTSPOT_R2) || defined(CONFIG_DOT11V_WNM) - if (pEntry->IsBTMReqValid == TRUE) { - struct btm_req_data *req_data = pEntry->ReqbtmData; - - Send_BTM_Req(pAd, req_data->peer_mac_addr, - req_data->btm_req, req_data->btm_req_len); - pEntry->IsBTMReqValid = FALSE; - os_free_mem(req_data); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("!!!!msg 4 send btm req\n")); - } - -#endif - -#ifdef MBO_SUPPORT - /* update STA bssid & security info to daemon */ - MboIndicateStaBssidInfo( - pAd, &pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev, - pEntry->Addr); -#endif /* MBO_SUPPORT */ - - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP SETKEYS DONE - AKMMap=%s, PairwiseCipher=%s, GroupCipher=%s, wcid=%d from %02X:%02X:%02X:%02X:%02X:%02X\n\n", - GetAuthModeStr(pSecConfig->AKMMap), - GetEncryModeStr(pSecConfig->PairwiseCipher), - GetEncryModeStr(pSecConfig->GroupCipher), pEntry->wcid, - PRINT_MAC(pEntry->Addr))); - - if ((!IS_AKM_OPEN(GET_SEC_AKM(pSecConfig))) && - tr_entry->PortSecured == 1) { - INT32 i; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PTK:")); - - for (i = 0; i < 64; i++) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%02x", pSecConfig->PTK[i])); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\n")); - } - } else { - /* 5. init Group 2-way handshake if necessary.*/ - RTMPSetTimer(&pEntry->SecConfig.StartFor2WayTimer, - ENQUEUE_EAPOL_2WAY_START_TIMER); - } -} - -VOID PeerGroupMsg1Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem) -{ - PHEADER_802_11 pHeader; - PEAPOL_PACKET pReceiveEapol; - UINT EapolLen; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - unsigned char hdr_len = LENGTH_802_11; - UCHAR idx = 0; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); - pHandshake4Way = &pSecConfig->Handshake; - /* pointer to 802.11 header*/ - pHeader = (PHEADER_802_11)Elem->Msg; -#ifdef A4_CONN - if (pHeader->FC.FrDs == 1 && pHeader->FC.ToDs == 1) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - /* skip 802.11_header(24-byte) and LLC_header(8) */ - pReceiveEapol = (PEAPOL_PACKET)&Elem->Msg[hdr_len + LENGTH_802_1_H]; - EapolLen = Elem->MsgLen - hdr_len - LENGTH_802_1_H; - - /* Sanity Check peer group message 1 - Replay Counter, MIC, RSNIE*/ - if (WpaMessageSanity(pAd, pReceiveEapol, EapolLen, EAPOL_GROUP_MSG_1, - pSecConfig, pEntry) == FALSE) { -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_AUTH_FAIL, - REASON_2WAY_HS_MSG1_FAIL); -#endif - return; - } - - if (pEntry->AllowUpdateRSC == TRUE) { - UCHAR kid = pEntry->SecConfig.LastGroupKeyId; - pEntry->CCMP_BC_PN[kid] = 0; - for (idx = 0; idx < (LEN_KEY_DESC_RSC - 2); idx++) - pEntry->CCMP_BC_PN[kid] += - ((UINT64)pReceiveEapol->KeyDesc.KeyRsc[idx] - << (idx * 8)); - pEntry->Init_CCMP_BC_PN_Passed[kid] = FALSE; - pEntry->AllowUpdateRSC = FALSE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): update CCMP_BC_PN to %llu\n", __FUNCTION__, - pEntry->wcid, pEntry->CCMP_BC_PN[kid])); -#ifdef MAC_REPEATER_SUPPORT - /* Sync PN of ApCli entry as the time rept rekey */ - if (pAd->ApCfg.bMACRepeaterEn == TRUE) { - MAC_TABLE_ENTRY *pEntry2 = - MacTableLookup(pAd, pHeader->Addr2); - - if (pEntry2 != NULL) { - pEntry2->CCMP_BC_PN[kid] = - pEntry->CCMP_BC_PN[kid]; - pEntry2->Init_CCMP_BC_PN_Passed[kid] = - pEntry->Init_CCMP_BC_PN_Passed[kid]; - pEntry2->AllowUpdateRSC = - pEntry->AllowUpdateRSC; - } - } -#endif - } - - /* Save Replay counter, it will use to construct message 2*/ - NdisMoveMemory(pHandshake4Way->ReplayCounter, - pReceiveEapol->KeyDesc.ReplayCounter, - LEN_KEY_DESC_REPLAY); - WPABuildGroupMsg2(pAd, pSecConfig, pEntry); -} - -VOID PeerGroupMsg2Action(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN struct _SECURITY_CONFIG *pSecConfig, - IN MLME_QUEUE_ELEM *Elem) -{ - PHEADER_802_11 pHeader; - PEAPOL_PACKET pReceiveEapolM2; - UINT EapolLen; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - unsigned char hdr_len = LENGTH_802_11; - BOOLEAN Cancelled; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> %s\n", __func__)); - /* pointer to 802.11 header*/ - pHeader = (PHEADER_802_11)Elem->Msg; -#ifdef A4_CONN - if (pHeader->FC.FrDs == 1 && pHeader->FC.ToDs == 1) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - /* skip 802.11_header(24-byte) and LLC_header(8) */ - pReceiveEapolM2 = (PEAPOL_PACKET)&Elem->Msg[hdr_len + LENGTH_802_1_H]; - EapolLen = Elem->MsgLen - hdr_len - LENGTH_802_1_H; - pHandshake4Way = &pSecConfig->Handshake; - - if (pHandshake4Way->WpaState != AS_PTKINITDONE) - return; - - /* Sanity Check peer Group message 2 - Replay Counter, MIC*/ - if (WpaMessageSanity(pAd, pReceiveEapolM2, EapolLen, EAPOL_GROUP_MSG_2, - pSecConfig, pEntry) == FALSE) { -#ifdef WIFI_DIAG - if (pEntry && IS_ENTRY_CLIENT(pEntry)) - DiagConnError(pAd, pEntry->func_tb_idx, pEntry->Addr, - DIAG_CONN_AUTH_FAIL, - REASON_2WAY_HS_MSG2_FAIL); -#endif - return; - } - - RTMPCancelTimer(&pHandshake4Way->MsgRetryTimer, &Cancelled); - pSecConfig->Handshake.GTKState = REKEY_ESTABLISHED; - -#if defined(MWDS) || defined(CONFIG_MAP_SUPPORT) || defined(WAPP_SUPPORT) - { - STA_TR_ENTRY *tr_entry = NULL; - - if (VALID_TR_WCID(pEntry->wcid)) - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - - if (tr_entry && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) { -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - map_a4_peer_enable(pAd, pEntry, TRUE); -#endif /* CONFIG_MAP_SUPPORT */ - -#ifdef WAPP_SUPPORT - wapp_send_cli_join_event(pAd, pEntry); -#endif - } - } -#endif - - if (IS_AKM_WPA2(pSecConfig->AKMMap) || - IS_AKM_WPA2PSK(pSecConfig->AKMMap)) { - /* send wireless event - for set key done WPA2*/ - RTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA2_EVENT_FLAG, - pEntry->Addr, pEntry->wdev->wdev_idx, 0); - } else { - /* send wireless event - for set key done WPA*/ - RTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA1_EVENT_FLAG, - pEntry->Addr, pEntry->wdev->wdev_idx, 0); - } - - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AP SETKEYS DONE - AKMMap=%s, PairwiseCipher=%s, GroupCipher=%s from %02X:%02X:%02X:%02X:%02X:%02X\n\n", - GetAuthModeStr(pSecConfig->AKMMap), - GetEncryModeStr(pSecConfig->PairwiseCipher), - GetEncryModeStr(pSecConfig->GroupCipher), - PRINT_MAC(pEntry->Addr))); -} - -static VOID WpaEAPOLStartAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ - MAC_TABLE_ENTRY *pEntry = NULL; - STA_TR_ENTRY *tr_entry = NULL; - PSECURITY_CONFIG pSecConfig = NULL; - PHEADER_802_11 pHeader; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WpaEAPOLStartAction ===>\n")); - pHeader = (PHEADER_802_11)Elem->Msg; - - /*For normaol PSK, we enqueue an EAPOL-Start command to trigger the process.*/ - if (Elem->MsgLen == MAC_ADDR_LEN) { -#ifdef CONFIG_AP_SUPPORT - pEntry = MacTableLookup(pAd, Elem->Msg); -#endif - } else { -#ifdef CONFIG_AP_SUPPORT - pEntry = MacTableLookup(pAd, pHeader->Addr2); -#endif -#ifdef WSC_AP_SUPPORT - - /* - a WSC enabled AP must ignore EAPOL-Start frames received from clients that associated to - the AP with an RSN IE or SSN IE indicating a WPA2-PSK/WPA-PSK authentication method in - the assication request. <> - */ - if (pEntry && (pEntry->func_tb_idx == MAIN_MBSSID) && - (pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.WscControl.WscConfMode != WSC_DISABLE) && - (IS_AKM_PSK_Entry(pEntry)) && pEntry->bWscCapable) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("WPS enabled AP: Ignore EAPOL-Start frames received from clients.\n")); - return; - } - -#endif /* WSC_AP_SUPPORT */ - } - - /*TODO: find the root cause.*/ - if (pEntry == NULL) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, cannot find entry:%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, PRINT_MAC(Elem->Msg))); - return; - } - - pSecConfig = &pEntry->SecConfig; - - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" PortSecured(%d), WpaState(%d), AKM(0x%x), is_cache(%d)\n", - tr_entry->PortSecured, pSecConfig->Handshake.WpaState, - pSecConfig->AKMMap, - is_pmkid_cache_in_sec_config(pSecConfig))); - - if ((tr_entry->PortSecured == WPA_802_1X_PORT_NOT_SECURED) && - (pSecConfig->Handshake.WpaState < AS_PTKSTART) && - (IS_AKM_PSK(pSecConfig->AKMMap) || - (IS_AKM_WPA2(pSecConfig->AKMMap) && - (is_pmkid_cache_in_sec_config(pSecConfig))) || - (IS_AKM_WPA3_192BIT(pSecConfig->AKMMap) && - (is_pmkid_cache_in_sec_config(pSecConfig))) || - (IS_AKM_OWE(pSecConfig->AKMMap) && - (is_pmkid_cache_in_sec_config(pSecConfig))))) { - pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP; - NdisZeroMemory(pSecConfig->Handshake.ReplayCounter, - LEN_KEY_DESC_REPLAY); - pSecConfig->Handshake.MsgRetryCounter = 0; - WPABuildPairMsg1(pAd, &pEntry->SecConfig, pEntry); - } -} - -/* - ========================================================================== - Description: - This is state machine function. - When receiving EAPOL packets which is for 802.1x key management. - Use both in WPA, and WPAPSK case. - In this function, further dispatch to different functions according to the received packet. 3 categories are : - 1. normal 4-way pairwisekey and 2-way groupkey handshake - 2. MIC error (Countermeasures attack) report packet from STA. - 3. Request for pairwise/group key update from STA - Return: - ========================================================================== -*/ -static VOID WpaEAPOLKeyAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ - MAC_TABLE_ENTRY *pEntry; - STA_TR_ENTRY *tr_entry; - PHEADER_802_11 pHeader; - PEAPOL_PACKET pEapol_packet; - KEY_INFO peerKeyInfo; - UINT eapol_len; - PSECURITY_CONFIG pSecConfig = NULL; - PHANDSHAKE_PROFILE pHandshake4Way = NULL; - unsigned char hdr_len = LENGTH_802_11; -#ifdef MAC_REPEATER_SUPPORT - REPEATER_CLIENT_ENTRY *pReptEntry = NULL; - USHORT ifIndex = (USHORT)(Elem->Priv); - UCHAR CliIdx = 0xFF; -#endif /* MAC_REPEATER_SUPPORT */ - pHeader = (PHEADER_802_11)Elem->Msg; -#ifdef A4_CONN - if (pHeader->FC.FrDs == 1 && pHeader->FC.ToDs == 1) - hdr_len = LENGTH_802_11_WITH_ADDR4; -#endif - - pEapol_packet = (PEAPOL_PACKET)&Elem->Msg[hdr_len + LENGTH_802_1_H]; - eapol_len = - CONV_ARRARY_TO_UINT16(pEapol_packet->Body_Len) + LENGTH_EAPOL_H; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:Receive EAPoL-Key frame from %02X-%02X-%02X-%02X-%02X-%02X\n", - __func__, PRINT_MAC(pHeader->Addr2))); - - if (eapol_len > Elem->MsgLen - hdr_len - LENGTH_802_1_H) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("The length of EAPoL packet is invalid from %02X-%02X-%02X-%02X-%02X-%02X\n", - PRINT_MAC(pHeader->Addr2))); - return; - } - - NdisMoveMemory((PUCHAR)&peerKeyInfo, - (PUCHAR)&pEapol_packet->KeyDesc.KeyInfo, - sizeof(KEY_INFO)); - *((USHORT *)&peerKeyInfo) = cpu2le16(*((USHORT *)&peerKeyInfo)); - - if (((pEapol_packet->ProVer != EAPOL_VER) && - (pEapol_packet->ProVer != EAPOL_VER2)) || - ((pEapol_packet->KeyDesc.Type != WPA1_KEY_DESC) && - (pEapol_packet->KeyDesc.Type != WPA2_KEY_DESC) && - (pEapol_packet->KeyDesc.Type != KEY_DESC_EXT))) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Key descripter does not match with WPA rule from %02X-%02X-%02X-%02X-%02X-%02X\n", - PRINT_MAC(pHeader->Addr2))); - return; - } - -#ifdef MAC_REPEATER_SUPPORT - - if (ifIndex >= REPT_MLME_START_IDX) { - CliIdx = ifIndex - REPT_MLME_START_IDX; - pReptEntry = &pAd->ApCfg.pRepeaterCliPool[CliIdx]; - } - -#endif /* MAC_REPEATER_SUPPORT */ -#ifdef MAC_REPEATER_SUPPORT - - if (CliIdx != 0xFF) { - if (pReptEntry->MacTabWCID >= MAX_LEN_OF_MAC_TABLE) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MacTabWCID = %d >= MAX_LEN_OF_MAC_TABLE(128)", - __func__, pReptEntry->MacTabWCID)); - return; - } - - pEntry = &pAd->MacTab.Content[pReptEntry->MacTabWCID]; - - if (!IS_ENTRY_REPEATER(pEntry)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:pEntry is not repeater ,wcid = %d, A2=%02X-%02X-%02X-%02X-%02X-%02X\n", - __func__, pEntry->wcid, - PRINT_MAC(pHeader->Addr2))); - return; - } - - pEntry->SecConfig.STARec_Bssid = - pReptEntry->wdev->bss_info_argument.ucBssIndex; - } else -#endif /* MAC_REPEATER_SUPPORT */ - { -#ifdef CONFIG_AP_SUPPORT - pEntry = MacTableLookup(pAd, pHeader->Addr2); -#endif - - if (!pEntry) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MacTableLookup FAILE with A2 %02X-%02X-%02X-%02X-%02X-%02X\n", - PRINT_MAC(pHeader->Addr2))); - return; - } - - pEntry->SecConfig.STARec_Bssid = - pEntry->wdev->bss_info_argument.ucBssIndex; - } - - if (IS_ENTRY_NONE(pEntry)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:pEntry is none ,wcid = %d, A2=%02X-%02X-%02X-%02X-%02X-%02X\n", - __func__, pEntry->wcid, PRINT_MAC(pHeader->Addr2))); - return; - } - - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - pSecConfig = &pEntry->SecConfig; - pHandshake4Way = &pSecConfig->Handshake; - - /* The value 1 shall be used for all EAPOL-Key frames to and from a STA when */ - /* neither the group nor pairwise ciphers are CCMP for Key Descriptor 1.*/ - if (IS_CIPHER_TKIP(pSecConfig->PairwiseCipher) && - (peerKeyInfo.KeyDescVer != KEY_DESC_TKIP)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Key descripter version not match(TKIP) from %02X-%02X-%02X-%02X-%02X-%02X\n", - PRINT_MAC(pHeader->Addr2))); - return; - } - - /* The value 3 shall be used for all EAPOL-Key frames to and from a STA when the negotiated */ - /* AKM is 00-0F-AC:3, 00-0F-AC:4, 00-0F-AC:5 or 00-0F-AC:6*/ - else if (pEntry && IS_ENTRY_CLIENT(pEntry) && pEntry->RSNIE_Len && - IsPeerSupportExtKeyDesc(&pEntry->RSN_IE[0]) && - (peerKeyInfo.KeyDescVer != KEY_DESC_EXT)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Key descripter version(%d) not match with Peer Selected AKM\n", - peerKeyInfo.KeyDescVer)); - return; - } -#ifdef DOT11W_PMF_SUPPORT - else if ((pSecConfig->key_deri_alg == SEC_KEY_DERI_SHA256) && - !(peerKeyInfo.KeyDescVer == KEY_DESC_EXT || - peerKeyInfo.KeyDescVer == KEY_DESC_NOT_DEFINED)) - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[PMF] Key descripter version not match(AES-128/NOT_DEFINED)\n")); - -#endif /* DOT11W_PMF_SUPPORT */ - /* The value 2 shall be used for all EAPOL-Key frames to and from a STA when */ - /* either the pairwise or the group cipher is AES-CCMP for Key Descriptor 2 or 3.*/ - else if ((peerKeyInfo.KeyDescVer == KEY_DESC_AES) && - (!(IS_CIPHER_TKIP(pSecConfig->PairwiseCipher) || - IS_CIPHER_CCMP128(pSecConfig->PairwiseCipher) || - IS_CIPHER_CCMP256(pSecConfig->PairwiseCipher) || - IS_CIPHER_GCMP128(pSecConfig->PairwiseCipher) || - IS_CIPHER_GCMP256(pSecConfig->PairwiseCipher)))) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Key descripter version not match peerKeyInfo.KeyDescVer=%d, PairwiseCipher=0x%x from %02X-%02X-%02X-%02X-%02X-%02X\n", - peerKeyInfo.KeyDescVer, pSecConfig->PairwiseCipher, - PRINT_MAC(pHeader->Addr2))); - return; - } - - /* Check if this STA is in class 3 state and the WPA state is started */ - if ((pEntry->Sst == SST_ASSOC) && - (pSecConfig->Handshake.WpaState >= AS_INITPSK)) { - /* Check the Key Ack (bit 7) of the Key Information to determine the Authenticator or not.*/ - /* An EAPOL-Key frame that is sent by the Supplicant in response to an EAPOL-*/ - /* Key frame from the Authenticator must not have the Ack bit set.*/ - if (peerKeyInfo.KeyAck == 1) { - /* The frame is snet by Authenticator. So the Supplicant side shall handle this.*/ - /* - IOT with 3COM 3CRWE454G72, Mode : WL-525 : According to 802.11i spec, actually we don't need to check the peerKeyInfo.Secure == 0 form peer RootAP - We found the AP will set peerKeyInfo.Secure to 1 in EAPOL-MSG1 after we reconnect the AP again, then driver drop the MSG1, DUT can't connect success anymore. - - */ - if ((peerKeyInfo.Request == 0) -#ifndef FAST_EAPOL_WAR - && (peerKeyInfo.Secure == 0) -#endif /* !FAST_EAPOL_WAR */ - && (peerKeyInfo.Error == 0) && - (peerKeyInfo.KeyType == PAIRWISEKEY)) { - - /* Process - 1. the message 1 of 4-way HS in WPA or WPA2 - EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1) - 2. the message 3 of 4-way HS in WPA - EAPOL-Key(0,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3) - */ - if (peerKeyInfo.KeyMic == 0) { - PeerPairMsg1Action(pAd, pEntry, - &pEntry->SecConfig, - Elem); - } else - PeerPairMsg3Action(pAd, pEntry, - &pEntry->SecConfig, - Elem); - } else if ((peerKeyInfo.Secure == 1) && - (peerKeyInfo.KeyMic == 1) && - (peerKeyInfo.Request == 0) && - (peerKeyInfo.Error == 0)) { - /* Process - 1. the message 3 of 4-way HS in WPA2 - EAPOL-Key(1,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3) - 2. the message 1 of group KS in WPA or WPA2 - EAPOL-Key(1,1,1,0,G,0,Key RSC,0, MIC,GTK[N]) - */ - if (peerKeyInfo.KeyType == PAIRWISEKEY) - PeerPairMsg3Action(pAd, pEntry, - &pEntry->SecConfig, - Elem); - else - PeerGroupMsg1Action(pAd, pEntry, - &pEntry->SecConfig, - Elem); - } - } else { - /* The frame is snet by Supplicant.So the Authenticator side shall handle this. */ -#ifdef CONFIG_AP_SUPPORT - if ((peerKeyInfo.KeyMic == 1) && - (peerKeyInfo.Request == 1) && - (peerKeyInfo.Error == 1)) { - /* The Supplicant uses a single Michael MIC Failure Report frame */ - /* to report a MIC failure event to the Authenticator. */ - /* A Michael MIC Failure Report is an EAPOL-Key frame with */ - /* the following Key Information field bits set to 1: */ - /* MIC bit, Error bit, Request bit, Secure bit.*/ - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Received an Michael MIC Failure Report, active countermeasure\n")); - RTMP_HANDLE_COUNTER_MEASURE(pAd, pEntry); - } else -#endif /* CONFIG_AP_SUPPORT */ - { - UCHAR KeyMic = peerKeyInfo.KeyMic; - -#ifdef OCE_FILS_SUPPORT - if (IS_AKM_FILS(pEntry->SecConfig.AKMMap)) - KeyMic = 1; -#endif /* OCE_FILS_SUPPORT */ - if ((peerKeyInfo.Request == 0) && - (peerKeyInfo.Error == 0) && (KeyMic == 1)) { - if (peerKeyInfo.Secure == 0 && - peerKeyInfo.KeyType == - PAIRWISEKEY) { - /* - EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,Data) Process: - 1. message 2 of 4-way HS in WPA or WPA2 - 2. message 4 of 4-way HS in WPA - */ - UINT8 mic_len = - LEN_KEY_DESC_MIC; - UINT8 *key_data_len_ptr = NULL; - - if (IS_AKM_SHA384( - pEntry->SecConfig - .AKMMap)) - mic_len = - LEN_KEY_DESC_MIC_SHA384; - - key_data_len_ptr = - pEapol_packet->KeyDesc - .KeyMicAndData + - mic_len; - - if (CONV_ARRARY_TO_UINT16( - key_data_len_ptr) == - 0) - PeerPairMsg4Action( - pAd, pEntry, - &pEntry->SecConfig, - Elem); - else - PeerPairMsg2Action( - pAd, pEntry, - &pEntry->SecConfig, - Elem); - } else if (peerKeyInfo.Secure == 1 && - peerKeyInfo.KeyType == - PAIRWISEKEY) { - /* EAPOL-Key(1,1,0,0,P,0,0,0,MIC,0) */ - /* Process message 4 of 4-way HS in WPA2*/ - PeerPairMsg4Action( - pAd, pEntry, - &pEntry->SecConfig, - Elem); - } else if (peerKeyInfo.Secure == 1 && - peerKeyInfo.KeyType == - GROUPKEY) { - /* EAPOL-Key(1,1,0,0,G,0,0,0,MIC,0)*/ - /* Process message 2 of Group key HS in WPA or WPA2 */ - PeerGroupMsg2Action( - pAd, pEntry, - &pEntry->SecConfig, - Elem); - } - } - } - } - } -} - -VOID WPAStartFor4WayExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - MAC_TABLE_ENTRY *pEntry = (PMAC_TABLE_ENTRY)FunctionContext; - struct _SECURITY_CONFIG *pSecConfig = NULL; - PRTMP_ADAPTER pAd = NULL; - - if (!pEntry) - return; - - pAd = (PRTMP_ADAPTER)pEntry->pAd; - pSecConfig = &pEntry->SecConfig; - - if (pSecConfig->Handshake.WpaState >= AS_PTKSTART) - return; - - if (IS_AKM_PSK(pSecConfig->AKMMap) || - (pEntry->EnqueueEapolStartTimerRunning == - EAPOL_START_PSK /*For PMKIDCache */)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Enqueue EAPoL-Start-PSK for sta(%02x:%02x:%02x:%02x:%02x:%02x)\n", - PRINT_MAC(pEntry->Addr))); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - MlmeEnqueue(pAd, WPA_STATE_MACHINE, MT2_EAPOLStart, 6, - &pEntry->Addr, 0); - } -#endif - RTMP_MLME_HANDLER(pAd); - } -#ifdef DOT1X_SUPPORT - else if (IS_AKM_1X(pSecConfig->AKMMap)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Enqueue EAPoL-Start-1X for sta(%02x:%02x:%02x:%02x:%02x:%02x)\n", - PRINT_MAC(pEntry->Addr))); - DOT1X_EapTriggerAction(pAd, pEntry); - } - -#endif /* DOT1X_SUPPORT */ - pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE; -} - -VOID WPAStartFor2WayExec(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - MAC_TABLE_ENTRY *pEntry = (PMAC_TABLE_ENTRY)FunctionContext; - struct _SECURITY_CONFIG *pSecConfig = NULL; - PRTMP_ADAPTER pAd = NULL; - STA_TR_ENTRY *tr_entry; - - if (!pEntry) - return; - - pAd = (PRTMP_ADAPTER)pEntry->pAd; - pSecConfig = &pEntry->SecConfig; - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - - if (tr_entry->PortSecured != WPA_802_1X_PORT_SECURED) - return; - - if (pSecConfig->Handshake.GTKState == REKEY_NEGOTIATING) - return; - - pSecConfig->Handshake.MsgRetryCounter = 0; - pSecConfig->Handshake.GTKState = REKEY_NEGOTIATING; - WPABuildGroupMsg1(pAd, pSecConfig, pEntry); -} - -VOID WPAHandshakeMsgRetryExec(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3) -{ - MAC_TABLE_ENTRY *pEntry = (MAC_TABLE_ENTRY *)FunctionContext; - - if ((pEntry) && IS_ENTRY_CLIENT(pEntry)) { - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pEntry->pAd; - struct _SECURITY_CONFIG *pSecConfig = &pEntry->SecConfig; - PHANDSHAKE_PROFILE pHandshake = &pSecConfig->Handshake; - - pHandshake->MsgRetryCounter++; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s---> WpaState=%d, MsgType=%d\n", __func__, - pHandshake->WpaState, pHandshake->MsgType)); - - if (IS_AKM_PSK(pSecConfig->AKMMap) || - IS_AKM_1X(pSecConfig->AKMMap)) { - if (pHandshake->MsgType == EAPOL_PAIR_MSG_1) { -#ifdef CONFIG_MAP_SUPPORT - /* Retry counter limitation */ - /* MAP Certification[MT7621 + 7615D] Data Passing Test TC 4.10.4_ETH_FH24G*/ - /* Broadcom Agent it taking more than 3 seconds in sending Reply for EAP Message 1.*/ - /* Increase the counter to retry EAP message 1 from 2 to 4 times.*/ - if (IS_MAP_ENABLE(pAd)) { - if (pHandshake->MsgRetryCounter > - PEER_MSG1_RETRY_LIMIT + 2) { - pHandshake->WpaState = - AS_INITIALIZE; - pHandshake->GTKState = - REKEY_FAILURE; - /* send wireless event - for pairwise key handshaking timeout */ - RTMPSendWirelessEvent( - pAd, - IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG, - pEntry->Addr, - pEntry->wdev->wdev_idx, - 0); - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s::4Way-MSG1 timeout with %02X:%02X:%02X:%02X:%02X:%02X\n", - __func__, - PRINT_MAC( - pHandshake - ->SAddr))); - MlmeDeAuthAction( - pAd, pEntry, - REASON_4_WAY_TIMEOUT, - FALSE); -#ifdef MAP_R2 - if (IS_MAP_R2_ENABLE(pAd)) - wapp_send_sta_connect_rejected( - pAd, - pEntry->wdev, - pEntry->Addr, - pEntry->bssid, - WAPP_EAPOL, - REASON_4_WAY_TIMEOUT, - 0, - REASON_4_WAY_TIMEOUT); -#endif - } else { - WPABuildPairMsg1( - pAd, &pEntry->SecConfig, - pEntry); - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s::ReTry MSG1 of 4-way Handshake, Counter=%d\n", - __func__, - pHandshake - ->MsgRetryCounter)); - } - } else -#endif - if (pHandshake->MsgRetryCounter > - PEER_MSG1_RETRY_LIMIT) { - pHandshake->WpaState = AS_INITIALIZE; - pHandshake->GTKState = REKEY_FAILURE; - /* send wireless event - for pairwise key handshaking timeout */ - RTMPSendWirelessEvent( - pAd, - IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG, - pEntry->Addr, - pEntry->wdev->wdev_idx, 0); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s::4Way-MSG1 timeout with %02X:%02X:%02X:%02X:%02X:%02X\n", - __func__, - PRINT_MAC(pHandshake->SAddr))); - MlmeDeAuthAction(pAd, pEntry, - REASON_4_WAY_TIMEOUT, - FALSE); -#ifdef MAP_R2 - wapp_send_sta_connect_rejected( - pAd, pEntry->wdev, pEntry->Addr, - pEntry->bssid, WAPP_EAPOL, - REASON_4_WAY_TIMEOUT, 0, - REASON_4_WAY_TIMEOUT); -#endif - } else { - WPABuildPairMsg1(pAd, - &pEntry->SecConfig, - pEntry); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s::ReTry MSG1 of 4-way Handshake, Counter=%d\n", - __func__, - pHandshake->MsgRetryCounter)); - } - } else if (pHandshake->MsgType == EAPOL_PAIR_MSG_3) { - if (pHandshake->MsgRetryCounter > - PEER_MSG3_RETRY_LIMIT) { - pHandshake->WpaState = AS_INITIALIZE; - pHandshake->GTKState = REKEY_FAILURE; - /* send wireless event - for pairwise key handshaking timeout */ - RTMPSendWirelessEvent( - pAd, - IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG, - pEntry->Addr, - pEntry->wdev->wdev_idx, 0); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s::4Way-MSG3 timeout with %02X:%02X:%02X:%02X:%02X:%02X\n", - __func__, - PRINT_MAC(pHandshake->SAddr))); - MlmeDeAuthAction(pAd, pEntry, - REASON_4_WAY_TIMEOUT, - FALSE); -#ifdef MAP_R2 - if (IS_MAP_ENABLE(pAd) && - IS_MAP_R2_ENABLE(pAd)) - wapp_send_sta_connect_rejected( - pAd, pEntry->wdev, - pEntry->Addr, - pEntry->bssid, - WAPP_EAPOL, - REASON_4_WAY_TIMEOUT, 0, - REASON_4_WAY_TIMEOUT); -#endif - } else { - WPABuildPairMsg3(pAd, - &pEntry->SecConfig, - pEntry); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s::ReTry MSG3 of 4-way Handshake, Counter = %d\n", - __func__, - pHandshake->MsgRetryCounter)); - } - } else if (pHandshake->MsgType == EAPOL_GROUP_MSG_1) { - if (pHandshake->MsgRetryCounter > - GROUP_MSG1_RETRY_LIMIT) { - pHandshake->GTKState = REKEY_FAILURE; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s::Group rekey timeout from %02X:%02X:%02X:%02X:%02X:%02X\n", - __func__, - PRINT_MAC(pHandshake->SAddr))); - } else { - WPABuildGroupMsg1(pAd, - &pEntry->SecConfig, - pEntry); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s::ReTry MSG1 of 2-way Handshake, Counter = %d\n", - __func__, - pHandshake->MsgRetryCounter)); - } - } - } - } -} - -INT set_wpa3_test(IN struct _RTMP_ADAPTER *ad, IN RTMP_STRING *arg) -{ - if (arg == NULL) - return FALSE; - - wpa3_test_ctrl = os_str_tol(arg, 0, 10); - - return TRUE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_aes.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_aes.c deleted file mode 100644 index 17a0b4d278..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_aes.c +++ /dev/null @@ -1,1891 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - AES - - Abstract: - RFC 3394: Advanced Encryption Standard (AES) Key Wrap Algorithm - RFC 3601: Counter with CBC-MAC (CCM) - RFC 4493: The AES-CMAC Algorithm - FIPS PUBS 197: ADVANCED ENCRYPTION STANDARD (AES) - NIST 800-38A: Recommendation for Block Cipher Modes of Operation - NIST 800-38C: The CCM Mode for Authentication and Confidentiality - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2009/05/19 Create AES-Key Wrap - Eddy 2009/04/20 Create AES-CMAC, AES-CCM - Eddy 2009/01/19 Create AES-128, AES-192, AES-256, AES-CBC -***************************************************************************/ - -#include "security/crypt_aes.h" -#include "rt_config.h" - -/* The value given by [x^(i-1),{00},{00},{00}], with x^(i-1) being powers of x in the field GF(2^8). */ -static const UINT32 aes_rcon[] = { 0x00000000, 0x01000000, 0x02000000, - 0x04000000, 0x08000000, 0x10000000, - 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000 }; - -static const UINT8 aes_sbox_enc[] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, - 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, /* 0 */ - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, /* 1 */ - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, - 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, /* 2 */ - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, - 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, /* 3 */ - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, /* 4 */ - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, - 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, /* 5 */ - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, - 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, /* 6 */ - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, /* 7 */ - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, - 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, /* 8 */ - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, - 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, /* 9 */ - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, /* a */ - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, - 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, /* b */ - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, - 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, /* c */ - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, /* d */ - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, - 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, /* e */ - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, - 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16, /* f */ -}; - -static const UINT8 aes_sbox_dec[] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, - 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, /* 0 */ - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, /* 1 */ - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, - 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, /* 2 */ - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, - 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, /* 3 */ - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, /* 4 */ - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, - 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, /* 5 */ - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, - 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, /* 6 */ - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, /* 7 */ - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, - 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, /* 8 */ - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, - 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, /* 9 */ - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, /* a */ - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, - 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, /* b */ - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, - 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, /* c */ - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, /* d */ - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, - 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, /* e */ - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, - 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, /* f */ -}; - -/* ArrayIndex*{02} */ -static const UINT8 aes_mul_2[] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, - 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, /* 0 */ - 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, - 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, /* 1 */ - 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, - 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, /* 2 */ - 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, - 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, /* 3 */ - 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, - 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, /* 4 */ - 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, - 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, /* 5 */ - 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, - 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, /* 6 */ - 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, - 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, /* 7 */ - 0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, - 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05, /* 8 */ - 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, - 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25, /* 9 */ - 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, - 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45, /* a */ - 0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, - 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, /* b */ - 0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, - 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, /* c */ - 0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, - 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, /* d */ - 0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, - 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, /* e */ - 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, - 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5, /* f */ -}; - -/* ArrayIndex*{03} */ -static const UINT8 aes_mul_3[] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, - 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, /* 0 */ - 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, - 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, /* 1 */ - 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, - 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, /* 2 */ - 0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, - 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, /* 3 */ - 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, - 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, /* 4 */ - 0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, - 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, /* 5 */ - 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, - 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, /* 6 */ - 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, - 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, /* 7 */ - 0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, - 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a, /* 8 */ - 0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, - 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba, /* 9 */ - 0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, - 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea, /* a */ - 0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, - 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda, /* b */ - 0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, - 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, /* c */ - 0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, - 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, /* d */ - 0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, - 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, /* e */ - 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, - 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a, /* f */ -}; - -/* ArrayIndex*{09} */ -static const UINT8 aes_mul_9[] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, - 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, /* 0 */ - 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, - 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, /* 1 */ - 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, - 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, /* 2 */ - 0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, - 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, /* 3 */ - 0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, - 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, /* 4 */ - 0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, - 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, /* 5 */ - 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, - 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, /* 6 */ - 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, - 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, /* 7 */ - 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, - 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, /* 8 */ - 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, - 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, /* 9 */ - 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, - 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, /* a */ - 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, - 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, /* b */ - 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, - 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, /* c */ - 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, - 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, /* d */ - 0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, - 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, /* e */ - 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, - 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46, /* f */ -}; - -/* ArrayIndex*{0b} */ -static const UINT8 aes_mul_b[] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, - 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, /* 0 */ - 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, - 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, /* 1 */ - 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, - 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, /* 2 */ - 0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, - 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, /* 3 */ - 0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, - 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, /* 4 */ - 0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, - 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, /* 5 */ - 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, - 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, /* 6 */ - 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, - 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, /* 7 */ - 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, - 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, /* 8 */ - 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, - 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, /* 9 */ - 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, - 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, /* a */ - 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, - 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, /* b */ - 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, - 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, /* c */ - 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, - 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, /* d */ - 0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, - 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, /* e */ - 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, - 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3, /* f */ -}; - -/* ArrayIndex*{0d} */ -static const UINT8 aes_mul_d[] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, - 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, /* 0 */ - 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, - 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, /* 1 */ - 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, - 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, /* 2 */ - 0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, - 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, /* 3 */ - 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, - 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, /* 4 */ - 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, - 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, /* 5 */ - 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, - 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, /* 6 */ - 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, - 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, /* 7 */ - 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, - 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, /* 8 */ - 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, - 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, /* 9 */ - 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, - 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, /* a */ - 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, - 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, /* b */ - 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, - 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, /* c */ - 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, - 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, /* d */ - 0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, - 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, /* e */ - 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, - 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97, /* f */ -}; - -/* ArrayIndex*{0e} */ -static const UINT8 aes_mul_e[] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, - 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, /* 0 */ - 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, - 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, /* 1 */ - 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, - 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, /* 2 */ - 0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, - 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, /* 3 */ - 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, - 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, /* 4 */ - 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, - 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, /* 5 */ - 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, - 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, /* 6 */ - 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, - 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, /* 7 */ - 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, - 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, /* 8 */ - 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, - 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, /* 9 */ - 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, - 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, /* a */ - 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, - 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, /* b */ - 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, - 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, /* c */ - 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, - 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, /* d */ - 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, - 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, /* e */ - 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, - 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d, /* f */ -}; - -/* For AES_CMAC */ -#define AES_MAC_LENGTH 16 /* 128-bit string */ -static UINT8 Const_Zero[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static UINT8 Const_Rb[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87 }; - -/* -======================================================================== -Routine Description: - AES key expansion (key schedule) - -Arguments: - Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) - KeyLength The length of cipher key in bytes - paes_ctx Pointer to AES_CTX_STRUC - -Return Value: - paes_ctx Retrun the KeyWordExpansion of AES_CTX_STRUC - -Note: - Pseudo code for key expansion - ------------------------------------------ - Nk = (key length/4); - - while (i < Nk) - KeyWordExpansion[i] = word(key[4*i], key[4*i + 1], key[4*i + 2], key[4*i + 3]); - i++; - end while - - while (i < ((key length/4 + 6 + 1)*4) ) - temp = KeyWordExpansion[i - 1]; - if (i % Nk ==0) - temp = SubWord(RotWord(temp)) ^ Rcon[i/Nk]; - else if ((Nk > 6) && (i % 4 == 4)) - temp = SubWord(temp); - end if - - KeyWordExpansion[i] = KeyWordExpansion[i - Nk]^ temp; - i++; - end while -======================================================================== -*/ -VOID RT_AES_KeyExpansion(IN UINT8 Key[], IN UINT KeyLength, - INOUT AES_CTX_STRUC *paes_ctx) -{ - UINT KeyIndex = 0; - UINT NumberOfWordOfKey, NumberOfWordOfKeyExpansion; - UINT8 TempWord[AES_KEY_ROWS], Temp; - UINT32 Temprcon; - - NumberOfWordOfKey = KeyLength >> 2; - - while (KeyIndex < NumberOfWordOfKey) { - paes_ctx->KeyWordExpansion[0][KeyIndex] = Key[4 * KeyIndex]; - paes_ctx->KeyWordExpansion[1][KeyIndex] = Key[4 * KeyIndex + 1]; - paes_ctx->KeyWordExpansion[2][KeyIndex] = Key[4 * KeyIndex + 2]; - paes_ctx->KeyWordExpansion[3][KeyIndex] = Key[4 * KeyIndex + 3]; - KeyIndex++; - } - - NumberOfWordOfKeyExpansion = - ((UINT)AES_KEY_ROWS) * ((KeyLength >> 2) + 6 + 1); - - while (KeyIndex < NumberOfWordOfKeyExpansion) { - TempWord[0] = paes_ctx->KeyWordExpansion[0][KeyIndex - 1]; - TempWord[1] = paes_ctx->KeyWordExpansion[1][KeyIndex - 1]; - TempWord[2] = paes_ctx->KeyWordExpansion[2][KeyIndex - 1]; - TempWord[3] = paes_ctx->KeyWordExpansion[3][KeyIndex - 1]; - - if ((KeyIndex % NumberOfWordOfKey) == 0) { - Temprcon = aes_rcon[KeyIndex / NumberOfWordOfKey]; - Temp = aes_sbox_enc[TempWord[1]] ^ - ((Temprcon >> 24) & 0xff); - TempWord[1] = aes_sbox_enc[TempWord[2]] ^ - ((Temprcon >> 16) & 0xff); - TempWord[2] = aes_sbox_enc[TempWord[3]] ^ - ((Temprcon >> 8) & 0xff); - TempWord[3] = - aes_sbox_enc[TempWord[0]] ^ ((Temprcon)&0xff); - TempWord[0] = Temp; - } else if ((NumberOfWordOfKey > 6) && - ((KeyIndex % NumberOfWordOfKey) == 4)) { - Temp = aes_sbox_enc[TempWord[0]]; - TempWord[1] = aes_sbox_enc[TempWord[1]]; - TempWord[2] = aes_sbox_enc[TempWord[2]]; - TempWord[3] = aes_sbox_enc[TempWord[3]]; - TempWord[0] = Temp; - } - - paes_ctx->KeyWordExpansion[0][KeyIndex] = - paes_ctx->KeyWordExpansion[0][KeyIndex - - NumberOfWordOfKey] ^ - TempWord[0]; - paes_ctx->KeyWordExpansion[1][KeyIndex] = - paes_ctx->KeyWordExpansion[1][KeyIndex - - NumberOfWordOfKey] ^ - TempWord[1]; - paes_ctx->KeyWordExpansion[2][KeyIndex] = - paes_ctx->KeyWordExpansion[2][KeyIndex - - NumberOfWordOfKey] ^ - TempWord[2]; - paes_ctx->KeyWordExpansion[3][KeyIndex] = - paes_ctx->KeyWordExpansion[3][KeyIndex - - NumberOfWordOfKey] ^ - TempWord[3]; - KeyIndex++; - } -} - -/* -======================================================================== -Routine Description: - AES encryption - -Arguments: - PlainBlock The block of plain text, 16 bytes(128 bits) each block - PlainBlockSize The length of block of plain text in bytes - Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) - KeyLength The length of cipher key in bytes - CipherBlockSize The length of allocated cipher block in bytes - -Return Value: - CipherBlock Return cipher text - CipherBlockSize Return the length of real used cipher block in bytes - -Note: - Reference to FIPS-PUB 197 - 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) - 2. Transfer the plain block to state block - 3. Main encryption rounds - 4. Transfer the state block to cipher block - ------------------------------------------ - NumberOfRound = (key length / 4) + 6; - state block = plain block; - - AddRoundKey(state block, key); - for round = 1 to NumberOfRound - SubBytes(state block) - ShiftRows(state block) - MixColumns(state block) - AddRoundKey(state block, key); - end for - - SubBytes(state block) - ShiftRows(state block) - AddRoundKey(state block, key); - - cipher block = state block; -======================================================================== -*/ -VOID RT_AES_Encrypt(IN UINT8 PlainBlock[], IN UINT PlainBlockSize, - IN UINT8 Key[], IN UINT KeyLength, OUT UINT8 CipherBlock[], - INOUT UINT *CipherBlockSize) -{ - /* AES_CTX_STRUC aes_ctx; - */ - AES_CTX_STRUC *paes_ctx = NULL; - UINT RowIndex, ColumnIndex; - UINT RoundIndex, NumberOfRound = 0; - UINT8 Temp, Row0, Row1, Row2, Row3; - - /* - * 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) - */ - if (PlainBlockSize != AES_BLOCK_SIZES) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_AES_Encrypt: plain block size is %d bytes, it must be %d bytes(128 bits).\n", - PlainBlockSize, AES_BLOCK_SIZES)); - return; - } - - if ((KeyLength != AES_KEY128_LENGTH) && - (KeyLength != AES_KEY192_LENGTH) && - (KeyLength != AES_KEY256_LENGTH)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_AES_Encrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n", - KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, - AES_KEY256_LENGTH)); - return; - } - - if (*CipherBlockSize < AES_BLOCK_SIZES) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_AES_Encrypt: cipher block size is %d bytes, it must be %d bytes(128 bits).\n", - *CipherBlockSize, AES_BLOCK_SIZES)); - return; - } - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&paes_ctx, sizeof(AES_CTX_STRUC)); - - if (paes_ctx == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return; - } - - /* - * 2. Transfer the plain block to state block - */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] = - PlainBlock[RowIndex + 4 * ColumnIndex]; - - /* - * 3. Main encryption rounds - */ - RT_AES_KeyExpansion(Key, KeyLength, paes_ctx); - NumberOfRound = (KeyLength >> 2) + 6; - /* AES_AddRoundKey */ - RoundIndex = 0; - - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] ^= - paes_ctx->KeyWordExpansion - [RowIndex][(RoundIndex * - ((UINT)AES_STATE_COLUMNS)) + - ColumnIndex]; - - for (RoundIndex = 1; RoundIndex < NumberOfRound; RoundIndex++) { - /* AES_SubBytes */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex] - [ColumnIndex] = aes_sbox_enc - [paes_ctx->State[RowIndex][ColumnIndex]]; - - /* AES_ShiftRows */ - Temp = paes_ctx->State[1][0]; - paes_ctx->State[1][0] = paes_ctx->State[1][1]; - paes_ctx->State[1][1] = paes_ctx->State[1][2]; - paes_ctx->State[1][2] = paes_ctx->State[1][3]; - paes_ctx->State[1][3] = Temp; - Temp = paes_ctx->State[2][0]; - paes_ctx->State[2][0] = paes_ctx->State[2][2]; - paes_ctx->State[2][2] = Temp; - Temp = paes_ctx->State[2][1]; - paes_ctx->State[2][1] = paes_ctx->State[2][3]; - paes_ctx->State[2][3] = Temp; - Temp = paes_ctx->State[3][3]; - paes_ctx->State[3][3] = paes_ctx->State[3][2]; - paes_ctx->State[3][2] = paes_ctx->State[3][1]; - paes_ctx->State[3][1] = paes_ctx->State[3][0]; - paes_ctx->State[3][0] = Temp; - - /* AES_MixColumns */ - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) { - Row0 = paes_ctx->State[0][ColumnIndex]; - Row1 = paes_ctx->State[1][ColumnIndex]; - Row2 = paes_ctx->State[2][ColumnIndex]; - Row3 = paes_ctx->State[3][ColumnIndex]; - paes_ctx->State[0][ColumnIndex] = - aes_mul_2[Row0] ^ aes_mul_3[Row1] ^ Row2 ^ Row3; - paes_ctx->State[1][ColumnIndex] = - Row0 ^ aes_mul_2[Row1] ^ aes_mul_3[Row2] ^ Row3; - paes_ctx->State[2][ColumnIndex] = - Row0 ^ Row1 ^ aes_mul_2[Row2] ^ aes_mul_3[Row3]; - paes_ctx->State[3][ColumnIndex] = - aes_mul_3[Row0] ^ Row1 ^ Row2 ^ aes_mul_2[Row3]; - } - - /* AES_AddRoundKey */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] ^= - paes_ctx->KeyWordExpansion - [RowIndex] - [(RoundIndex * - ((UINT)AES_STATE_COLUMNS)) + - ColumnIndex]; - } - - /* AES_SubBytes */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] = - aes_sbox_enc[paes_ctx->State[RowIndex] - [ColumnIndex]]; - - /* AES_ShiftRows */ - Temp = paes_ctx->State[1][0]; - paes_ctx->State[1][0] = paes_ctx->State[1][1]; - paes_ctx->State[1][1] = paes_ctx->State[1][2]; - paes_ctx->State[1][2] = paes_ctx->State[1][3]; - paes_ctx->State[1][3] = Temp; - Temp = paes_ctx->State[2][0]; - paes_ctx->State[2][0] = paes_ctx->State[2][2]; - paes_ctx->State[2][2] = Temp; - Temp = paes_ctx->State[2][1]; - paes_ctx->State[2][1] = paes_ctx->State[2][3]; - paes_ctx->State[2][3] = Temp; - Temp = paes_ctx->State[3][3]; - paes_ctx->State[3][3] = paes_ctx->State[3][2]; - paes_ctx->State[3][2] = paes_ctx->State[3][1]; - paes_ctx->State[3][1] = paes_ctx->State[3][0]; - paes_ctx->State[3][0] = Temp; - - /* AES_AddRoundKey */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] ^= - paes_ctx->KeyWordExpansion - [RowIndex][(RoundIndex * - ((UINT)AES_STATE_COLUMNS)) + - ColumnIndex]; - - /* - * 4. Transfer the state block to cipher block - */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - CipherBlock[RowIndex + 4 * ColumnIndex] = - paes_ctx->State[RowIndex][ColumnIndex]; - - *CipherBlockSize = ((UINT)AES_STATE_ROWS) * ((UINT)AES_STATE_COLUMNS); - - if (paes_ctx != NULL) - os_free_mem(paes_ctx); -} - -/* -======================================================================== -Routine Description: - AES decryption - -Arguments: - CipherBlock The block of cipher text, 16 bytes(128 bits) each block - CipherBlockSize The length of block of cipher text in bytes - Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) - KeyLength The length of cipher key in bytes - PlainBlockSize The length of allocated plain block in bytes - -Return Value: - PlainBlock Return plain text - PlainBlockSize Return the length of real used plain block in bytes - -Note: - Reference to FIPS-PUB 197 - 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) - 2. Transfer the cipher block to state block - 3. Main decryption rounds - 4. Transfer the state block to plain block - ------------------------------------------ - NumberOfRound = (key length / 4) + 6; - state block = cipher block; - - AddRoundKey(state block, key); - for round = NumberOfRound to 1 - InvSubBytes(state block) - InvShiftRows(state block) - InvMixColumns(state block) - AddRoundKey(state block, key); - end for - - InvSubBytes(state block) - InvShiftRows(state block) - AddRoundKey(state block, key); - - plain block = state block; -======================================================================== -*/ -VOID RT_AES_Decrypt(IN UINT8 CipherBlock[], IN UINT CipherBlockSize, - IN UINT8 Key[], IN UINT KeyLength, OUT UINT8 PlainBlock[], - INOUT UINT *PlainBlockSize) -{ - /* AES_CTX_STRUC aes_ctx; - */ - AES_CTX_STRUC *paes_ctx = NULL; - UINT RowIndex, ColumnIndex; - UINT RoundIndex, NumberOfRound = 0; - UINT8 Temp, Row0, Row1, Row2, Row3; - - /* - * 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) - */ - if (*PlainBlockSize < AES_BLOCK_SIZES) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_AES_Decrypt: plain block size is %d bytes, it must be %d bytes(128 bits).\n", - *PlainBlockSize, AES_BLOCK_SIZES)); - return; - } - - if ((KeyLength != AES_KEY128_LENGTH) && - (KeyLength != AES_KEY192_LENGTH) && - (KeyLength != AES_KEY256_LENGTH)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_AES_Decrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n", - KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, - AES_KEY256_LENGTH)); - return; - } - - if (CipherBlockSize != AES_BLOCK_SIZES) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT_AES_Decrypt: cipher block size is %d bytes, it must be %d bytes(128 bits).\n", - CipherBlockSize, AES_BLOCK_SIZES)); - return; - } - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&paes_ctx, sizeof(AES_CTX_STRUC)); - - if (paes_ctx == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - return; - } - - /* - * 2. Transfer the cipher block to state block - */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] = - CipherBlock[RowIndex + 4 * ColumnIndex]; - - /* - * 3. Main decryption rounds - */ - RT_AES_KeyExpansion(Key, KeyLength, paes_ctx); - NumberOfRound = (KeyLength >> 2) + 6; - /* AES_AddRoundKey */ - RoundIndex = NumberOfRound; - - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] ^= - paes_ctx->KeyWordExpansion - [RowIndex][(RoundIndex * - ((UINT)AES_STATE_COLUMNS)) + - ColumnIndex]; - - for (RoundIndex = (NumberOfRound - 1); RoundIndex > 0; RoundIndex--) { - /* AES_InvShiftRows */ - Temp = paes_ctx->State[1][3]; - paes_ctx->State[1][3] = paes_ctx->State[1][2]; - paes_ctx->State[1][2] = paes_ctx->State[1][1]; - paes_ctx->State[1][1] = paes_ctx->State[1][0]; - paes_ctx->State[1][0] = Temp; - Temp = paes_ctx->State[2][0]; - paes_ctx->State[2][0] = paes_ctx->State[2][2]; - paes_ctx->State[2][2] = Temp; - Temp = paes_ctx->State[2][1]; - paes_ctx->State[2][1] = paes_ctx->State[2][3]; - paes_ctx->State[2][3] = Temp; - Temp = paes_ctx->State[3][0]; - paes_ctx->State[3][0] = paes_ctx->State[3][1]; - paes_ctx->State[3][1] = paes_ctx->State[3][2]; - paes_ctx->State[3][2] = paes_ctx->State[3][3]; - paes_ctx->State[3][3] = Temp; - - /* AES_InvSubBytes */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex] - [ColumnIndex] = aes_sbox_dec - [paes_ctx->State[RowIndex][ColumnIndex]]; - - /* AES_AddRoundKey */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] ^= - paes_ctx->KeyWordExpansion - [RowIndex] - [(RoundIndex * - ((UINT)AES_STATE_COLUMNS)) + - ColumnIndex]; - - /* AES_InvMixColumns */ - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) { - Row0 = paes_ctx->State[0][ColumnIndex]; - Row1 = paes_ctx->State[1][ColumnIndex]; - Row2 = paes_ctx->State[2][ColumnIndex]; - Row3 = paes_ctx->State[3][ColumnIndex]; - paes_ctx->State[0][ColumnIndex] = - aes_mul_e[Row0] ^ aes_mul_b[Row1] ^ - aes_mul_d[Row2] ^ aes_mul_9[Row3]; - paes_ctx->State[1][ColumnIndex] = - aes_mul_9[Row0] ^ aes_mul_e[Row1] ^ - aes_mul_b[Row2] ^ aes_mul_d[Row3]; - paes_ctx->State[2][ColumnIndex] = - aes_mul_d[Row0] ^ aes_mul_9[Row1] ^ - aes_mul_e[Row2] ^ aes_mul_b[Row3]; - paes_ctx->State[3][ColumnIndex] = - aes_mul_b[Row0] ^ aes_mul_d[Row1] ^ - aes_mul_9[Row2] ^ aes_mul_e[Row3]; - } - } - - /* AES_InvShiftRows */ - Temp = paes_ctx->State[1][3]; - paes_ctx->State[1][3] = paes_ctx->State[1][2]; - paes_ctx->State[1][2] = paes_ctx->State[1][1]; - paes_ctx->State[1][1] = paes_ctx->State[1][0]; - paes_ctx->State[1][0] = Temp; - Temp = paes_ctx->State[2][0]; - paes_ctx->State[2][0] = paes_ctx->State[2][2]; - paes_ctx->State[2][2] = Temp; - Temp = paes_ctx->State[2][1]; - paes_ctx->State[2][1] = paes_ctx->State[2][3]; - paes_ctx->State[2][3] = Temp; - Temp = paes_ctx->State[3][0]; - paes_ctx->State[3][0] = paes_ctx->State[3][1]; - paes_ctx->State[3][1] = paes_ctx->State[3][2]; - paes_ctx->State[3][2] = paes_ctx->State[3][3]; - paes_ctx->State[3][3] = Temp; - - /* AES_InvSubBytes */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] = - aes_sbox_dec[paes_ctx->State[RowIndex] - [ColumnIndex]]; - - /* AES_AddRoundKey */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - paes_ctx->State[RowIndex][ColumnIndex] ^= - paes_ctx->KeyWordExpansion - [RowIndex][(RoundIndex * - ((UINT)AES_STATE_COLUMNS)) + - ColumnIndex]; - - /* - * 4. Transfer the state block to plain block - */ - for (RowIndex = 0; RowIndex < AES_STATE_ROWS; RowIndex++) - for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS; - ColumnIndex++) - PlainBlock[RowIndex + 4 * ColumnIndex] = - paes_ctx->State[RowIndex][ColumnIndex]; - - *PlainBlockSize = ((UINT)AES_STATE_ROWS) * ((UINT)AES_STATE_COLUMNS); - - if (paes_ctx != NULL) - os_free_mem(paes_ctx); -} - -/* -======================================================================== -Routine Description: - AES-CBCMAC - -Arguments: - Payload Data - PayloadLength The length of data in bytes - Key Cipher key - KeyLength The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes) - Nonce Nonce - NonceLength The length of nonce in bytes - AAD Additional authenticated data - AADLength The length of AAD in bytes - MACLength The length of MAC in bytes - -Return Value: - MACText The mac - -Note: - Reference to RFC 3601, and NIST 800-38C. -======================================================================== -*/ -VOID AES_CCM_MAC(IN UINT8 Payload[], IN UINT PayloadLength, IN UINT8 Key[], - IN UINT KeyLength, IN UINT8 Nonce[], IN UINT NonceLength, - IN UINT8 AAD[], IN UINT AADLength, IN UINT MACLength, - OUT UINT8 MACText[]) -{ - UINT8 Block[AES_BLOCK_SIZES], Block_MAC[AES_BLOCK_SIZES]; - UINT Block_Index = 0, ADD_Index = 0, Payload_Index = 0; - UINT Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0; - /* - * 1. Formatting of the Control Information and the Nonce - */ - NdisZeroMemory(Block, AES_BLOCK_SIZES); - - if (AADLength > 0) - Block[0] |= 0x40; /* Set bit 6 to 1 */ - - Temp_Value = ((MACLength - 2) >> 1) << 3; /* Set bit 3-5 to (t-2)/2 */ - Block[0] |= Temp_Value; - Temp_Value = (15 - NonceLength) - - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */ - Block[0] |= Temp_Value; - - for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++) - Block[Temp_Index + 1] = Nonce[Temp_Index]; - - if (NonceLength < 12) - Block[12] = (PayloadLength >> 24) & 0xff; - - if (NonceLength < 13) - Block[13] = (PayloadLength >> 16) & 0xff; - - Block[14] = (PayloadLength >> 8) & 0xff; - Block[15] = PayloadLength & 0xff; - NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES); - Temp_Length = sizeof(Block_MAC); - RT_AES_Encrypt(Block, AES_BLOCK_SIZES, Key, KeyLength, Block_MAC, - &Temp_Length); - /* - * 2. Formatting of the Associated Data - * If 0 < AADLength < (2^16 - 2^8), AData_Length = 2 - * If (2^16 - 2^8) < AADLength < 2^32, AData_Length = 6 - * If 2^32 < AADLength < 2^64, AData_Length = 10 (not implement) - */ - NdisZeroMemory(Block, AES_BLOCK_SIZES); - - if ((AADLength > 0) && (AADLength < 0xFF00)) { - Block_Index = 2; - Block[0] = (AADLength >> 8) & 0xff; - Block[1] = AADLength & 0xff; - } else { - Block_Index = 6; - Block[2] = (AADLength >> 24) & 0xff; - Block[3] = (AADLength >> 16) & 0xff; - Block[4] = (AADLength >> 8) & 0xff; - Block[5] = AADLength & 0xff; - } - - while (ADD_Index < AADLength) { - Copy_Length = AADLength - ADD_Index; - - if (Copy_Length > AES_BLOCK_SIZES) - Copy_Length = AES_BLOCK_SIZES; - - if ((Copy_Length + Block_Index) > AES_BLOCK_SIZES) - Copy_Length = AES_BLOCK_SIZES - Block_Index; - - for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++) - if ((Temp_Index + Block_Index) < AES_BLOCK_SIZES) - Block[Temp_Index + Block_Index] = - AAD[ADD_Index + Temp_Index]; - - for (Temp_Index = 0; Temp_Index < AES_BLOCK_SIZES; Temp_Index++) - Block[Temp_Index] ^= Block_MAC[Temp_Index]; - - NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES); - Temp_Length = sizeof(Block_MAC); - RT_AES_Encrypt(Block, AES_BLOCK_SIZES, Key, KeyLength, - Block_MAC, &Temp_Length); - ADD_Index += Copy_Length; - Block_Index = 0; - NdisZeroMemory(Block, AES_BLOCK_SIZES); - } - - /* - * 3. Calculate the MAC (MIC) - */ - while (Payload_Index < PayloadLength) { - NdisZeroMemory(Block, AES_BLOCK_SIZES); - Copy_Length = PayloadLength - Payload_Index; - - if (Copy_Length > AES_BLOCK_SIZES) - Copy_Length = AES_BLOCK_SIZES; - - for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++) - Block[Temp_Index] = Payload[Payload_Index + Temp_Index]; - - for (Temp_Index = 0; Temp_Index < AES_BLOCK_SIZES; Temp_Index++) - Block[Temp_Index] ^= Block_MAC[Temp_Index]; - - NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES); - Temp_Length = sizeof(Block_MAC); - RT_AES_Encrypt(Block, AES_BLOCK_SIZES, Key, KeyLength, - Block_MAC, &Temp_Length); - Payload_Index += Copy_Length; - } - - for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++) - MACText[Temp_Index] = Block_MAC[Temp_Index]; -} - -/* -======================================================================== -Routine Description: - AES-CBCMAC Encryption - -Arguments: - PlainText Plain text - PlainTextLength The length of plain text in bytes - Key Cipher key - KeyLength The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes) - Nonce Nonce - NonceLength The length of nonce in bytes - AAD Additional authenticated data - AADLength The length of AAD in bytes - MACLength The length of MAC in bytes - CipherTextLength The length of allocated memory spaces in bytes - -Return Value: - CipherText The ciphertext - CipherTextLength Return the length of the ciphertext in bytes - -Function Value: - 0: Success - -1: The key length must be 16 bytes. - -2: A valid nonce length is 7-13 bytes. - -3: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes. - -4: The CipherTextLength is not enough. - -Note: - Reference to RFC 3601, and NIST 800-38C. - Here, the implement of AES_CCM is suitable for WI_FI. -======================================================================== -*/ -INT AES_CCM_Encrypt(IN UINT8 PlainText[], IN UINT PlainTextLength, - IN UINT8 Key[], IN UINT KeyLength, IN UINT8 Nonce[], - IN UINT NonceLength, IN UINT8 AAD[], IN UINT AADLength, - IN UINT MACLength, OUT UINT8 CipherText[], - INOUT UINT *CipherTextLength) -{ - UINT8 Block_MAC[AES_BLOCK_SIZES]; - UINT8 Block_CTR[AES_BLOCK_SIZES], Block_CTR_Cipher[AES_BLOCK_SIZES]; - UINT Cipher_Index = 0; - UINT Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0; - - /* - * 1. Check Input Values - * - Key length must be 16 bytes - * - Nonce length range is form 7 to 13 bytes - * - MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes - * - CipherTextLength > PlainTextLength + MACLength - */ - if (KeyLength != AES_KEY128_LENGTH) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Encrypt: The key length must be %d bytes\n", - AES_KEY128_LENGTH)); - return -1; - } - - if ((NonceLength < 7) || (NonceLength > 13)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Encrypt: A valid nonce length is 7-13 bytes\n")); - return -2; - } - - if ((MACLength != 4) && (MACLength != 6) && (MACLength != 8) && - (MACLength != 10) && (MACLength != 12) && (MACLength != 14) && - (MACLength != 16)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Encrypt: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes\n")); - return -3; - } - - if (*CipherTextLength < (PlainTextLength + MACLength)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Encrypt: The CipherTextLength is not enough.\n")); - return -4; - } - - /* - * 1. Formatting of the Counter Block - */ - NdisZeroMemory(Block_CTR, AES_BLOCK_SIZES); - Temp_Value = (15 - NonceLength) - - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */ - Block_CTR[0] |= Temp_Value; - - for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++) - Block_CTR[Temp_Index + 1] = Nonce[Temp_Index]; - - /* - * 2. Calculate the MAC (MIC) - */ - AES_CCM_MAC(PlainText, PlainTextLength, Key, KeyLength, Nonce, - NonceLength, AAD, AADLength, MACLength, Block_MAC); - Temp_Length = sizeof(Block_CTR_Cipher); - RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES, Key, KeyLength, - Block_CTR_Cipher, &Temp_Length); - - for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++) - Block_MAC[Temp_Index] ^= Block_CTR_Cipher[Temp_Index]; - - /* - * 3. Cipher Payload - */ - while (Cipher_Index < PlainTextLength) { - Block_CTR[15] += 1; - Temp_Length = sizeof(Block_CTR_Cipher); - RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES, Key, KeyLength, - Block_CTR_Cipher, &Temp_Length); - Copy_Length = PlainTextLength - Cipher_Index; - - if (Copy_Length > AES_BLOCK_SIZES) - Copy_Length = AES_BLOCK_SIZES; - - for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++) - CipherText[Cipher_Index + Temp_Index] = - PlainText[Cipher_Index + Temp_Index] ^ - Block_CTR_Cipher[Temp_Index]; - - Cipher_Index += Copy_Length; - } - - for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++) - CipherText[PlainTextLength + Temp_Index] = - Block_MAC[Temp_Index]; - - *CipherTextLength = PlainTextLength + MACLength; - return 0; -} - -/* -======================================================================== -Routine Description: - AES-CBCMAC Decryption - -Arguments: - CipherText The ciphertext - CipherTextLength The length of cipher text in bytes - Key Cipher key - KeyLength The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes) - Nonce Nonce - NonceLength The length of nonce in bytes - AAD Additional authenticated data - AADLength The length of AAD in bytes - CipherTextLength The length of allocated memory spaces in bytes - -Return Value: - PlainText Plain text - PlainTextLength Return the length of the plain text in bytes - -Function Value: - 0: Success - -1: The key length must be 16 bytes. - -2: A valid nonce length is 7-13 bytes. - -3: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes. - -4: The PlainTextLength is not enough. - -5: The MIC does not match. - -Note: - Reference to RFC 3601, and NIST 800-38C. - Here, the implement of AES_CCM is suitable for WI_FI. -======================================================================== -*/ -INT AES_CCM_Decrypt(IN UINT8 CipherText[], IN UINT CipherTextLength, - IN UINT8 Key[], IN UINT KeyLength, IN UINT8 Nonce[], - IN UINT NonceLength, IN UINT8 AAD[], IN UINT AADLength, - IN UINT MACLength, OUT UINT8 PlainText[], - INOUT UINT *PlainTextLength) -{ - UINT8 Block_MAC[AES_BLOCK_SIZES], - Block_MAC_From_Cipher[AES_BLOCK_SIZES]; - UINT8 Block_CTR[AES_BLOCK_SIZES], Block_CTR_Cipher[AES_BLOCK_SIZES]; - UINT Block_Index = 0, Cipher_Index = 0; - UINT Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0; - - /* - * 1. Check Input Values - * - Key length must be 16 bytes - * - Nonce length range is form 7 to 13 bytes - */ - if (KeyLength != AES_KEY128_LENGTH) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Decrypt: The key length must be %d bytes\n", - AES_KEY128_LENGTH)); - return -1; - } - - if ((NonceLength < 7) || (NonceLength > 13)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Decrypt: A valid nonce length is 7-13 bytes\n")); - return -2; - } - - if ((MACLength != 4) && (MACLength != 6) && (MACLength != 8) && - (MACLength != 10) && (MACLength != 12) && (MACLength != 14) && - (MACLength != 16)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Decrypt: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes\n")); - return -3; - } - - if (*PlainTextLength < (CipherTextLength - MACLength)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Decrypt: The PlainTextLength is not enough.\n")); - return -4; - } - - /* - * 2. Formatting of the Counter Block - */ - NdisZeroMemory(Block_CTR, AES_BLOCK_SIZES); - NdisZeroMemory(Block_CTR_Cipher, AES_BLOCK_SIZES); - Temp_Value = (15 - NonceLength) - - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */ - Block_CTR[0] |= Temp_Value; - - for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++) - Block_CTR[Temp_Index + 1] = Nonce[Temp_Index]; - - Temp_Length = sizeof(Block_CTR_Cipher); - RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES, Key, KeyLength, - Block_CTR_Cipher, &Temp_Length); - /* - * 3. Catch the MAC (MIC) from CipherText - */ - Block_Index = 0; - NdisZeroMemory(Block_MAC_From_Cipher, AES_BLOCK_SIZES); - - for (Temp_Index = (CipherTextLength - MACLength); - Temp_Index < CipherTextLength; Temp_Index++, Block_Index++) - Block_MAC_From_Cipher[Block_Index] = - CipherText[Temp_Index] ^ Block_CTR_Cipher[Block_Index]; - - /* - * 4. Decryption the Payload - */ - while (Cipher_Index < (CipherTextLength - MACLength)) { - Block_CTR[15] += 1; - Temp_Length = sizeof(Block_CTR_Cipher); - RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES, Key, KeyLength, - Block_CTR_Cipher, &Temp_Length); - Copy_Length = (CipherTextLength - MACLength) - Cipher_Index; - - if (Copy_Length > AES_BLOCK_SIZES) - Copy_Length = AES_BLOCK_SIZES; - - for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++) - PlainText[Cipher_Index + Temp_Index] = - CipherText[Cipher_Index + Temp_Index] ^ - Block_CTR_Cipher[Temp_Index]; - - Cipher_Index += Copy_Length; - } - - *PlainTextLength = CipherTextLength - MACLength; - /* - * 5. Calculate the MAC (MIC) from Payload - */ - AES_CCM_MAC(PlainText, *PlainTextLength, Key, KeyLength, Nonce, - NonceLength, AAD, AADLength, MACLength, Block_MAC); - - /* - * 6. Check the MIC - */ - if (NdisCmpMemory(Block_MAC_From_Cipher, Block_MAC, MACLength) != 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CCM_Decrypt: The MIC does not match.\n")); - return -5; - } - - return 0; -} - -/* -======================================================================== -Routine Description: - AES-CMAC generate subkey - -Arguments: - Key Cipher key 128 bits - KeyLength The length of Cipher key in bytes - -Return Value: - SubKey1 SubKey 1 128 bits - SubKey2 SubKey 2 128 bits - -Note: - Reference to RFC 4493 - - Step 1. L := AES-128(K, const_Zero); - Step 2. if MSB(L) is equal to 0 - then K1 := L << 1; - else K1 := (L << 1) XOR const_Rb; - Step 3. if MSB(K1) is equal to 0 - then K2 := K1 << 1; - else K2 := (K1 << 1) XOR const_Rb; - Step 4. return K1, K2; -======================================================================== -*/ -VOID AES_CMAC_GenerateSubKey(IN UINT8 Key[], IN UINT KeyLength, - OUT UINT8 SubKey1[], OUT UINT8 SubKey2[]) -{ - UINT8 MSB_L = 0, MSB_K1 = 0, Top_Bit = 0; - UINT SubKey1_Length = 0; - INT Index = 0; - - if (KeyLength != AES_KEY128_LENGTH) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CMAC_GenerateSubKey: key length is %d bytes, it must be %d bytes(128 bits).\n", - KeyLength, AES_KEY128_LENGTH)); - return; - } - - /* Step 1: L := AES-128(K, const_Zero); */ - SubKey1_Length = 16; - RT_AES_Encrypt(Const_Zero, sizeof(Const_Zero), Key, KeyLength, SubKey1, - &SubKey1_Length); - /* - * Step 2. if MSB(L) is equal to 0 - * then K1 := L << 1; - * else K1 := (L << 1) XOR const_Rb; - */ - MSB_L = SubKey1[0] & 0x80; - - for (Index = 0; Index < 15; Index++) { - Top_Bit = (SubKey1[Index + 1] & 0x80) ? 1 : 0; - SubKey1[Index] <<= 1; - SubKey1[Index] |= Top_Bit; - } - - SubKey1[15] <<= 1; - - if (MSB_L > 0) { - for (Index = 0; Index < 16; Index++) - SubKey1[Index] ^= Const_Rb[Index]; - } - - /* - * Step 3. if MSB(K1) is equal to 0 - * then K2 := K1 << 1; - * else K2 := (K1 << 1) XOR const_Rb; - */ - MSB_K1 = SubKey1[0] & 0x80; - - for (Index = 0; Index < 15; Index++) { - Top_Bit = (SubKey1[Index + 1] & 0x80) ? 1 : 0; - SubKey2[Index] = SubKey1[Index] << 1; - SubKey2[Index] |= Top_Bit; - } - - SubKey2[15] = SubKey1[15] << 1; - - if (MSB_K1 > 0) { - for (Index = 0; Index < 16; Index++) - SubKey2[Index] ^= Const_Rb[Index]; - } -} - -/* -======================================================================== -Routine Description: - AES-CMAC - -Arguments: - PlainText Plain text - PlainTextLength The length of plain text in bytes - Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) - KeyLength The length of cipher key in bytes - MACTextLength The length of allocated memory spaces in bytes - -Return Value: - MACText Message authentication code (128-bit string) - MACTextLength Return the length of Message authentication code in bytes - -Note: - Reference to RFC 4493 -======================================================================== -*/ -VOID AES_CMAC(IN UINT8 PlainText[], IN UINT PlainTextLength, IN UINT8 Key[], - IN UINT KeyLength, OUT UINT8 MACText[], INOUT UINT *MACTextLength) -{ - UINT PlainBlockStart; - UINT8 X[AES_BLOCK_SIZES], Y[AES_BLOCK_SIZES]; - UINT8 SubKey1[16]; - UINT8 SubKey2[16]; - INT Index; - UINT X_Length; - - if (*MACTextLength < AES_MAC_LENGTH) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CMAC: MAC text length is less than %d bytes).\n", - AES_MAC_LENGTH)); - return; - } - - if (KeyLength != AES_KEY128_LENGTH) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CMAC: key length is %d bytes, it must be %d bytes(128 bits).\n", - KeyLength, AES_KEY128_LENGTH)); - return; - } - - /* Step 1. (K1,K2) := Generate_Subkey(K); */ - NdisZeroMemory(SubKey1, 16); - NdisZeroMemory(SubKey2, 16); - AES_CMAC_GenerateSubKey(Key, KeyLength, SubKey1, SubKey2); - /* - * 2. Main algorithm - * - Plain text divide into serveral blocks (16 bytes/block) - * - If plain text is not divided with no remainder by block, padding size = (block - remainder plain text) - * - Execute RT_AES_Encrypt procedure. - */ - PlainBlockStart = 0; - NdisMoveMemory(X, Const_Zero, AES_BLOCK_SIZES); - - while ((PlainTextLength - PlainBlockStart) > AES_BLOCK_SIZES) { - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - Y[Index] = - PlainText[PlainBlockStart + Index] ^ X[Index]; - - X_Length = sizeof(X); - RT_AES_Encrypt(Y, sizeof(Y), Key, KeyLength, X, &X_Length); - PlainBlockStart += ((UINT)AES_BLOCK_SIZES); - } - - if ((PlainTextLength - PlainBlockStart) == AES_BLOCK_SIZES) { - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - Y[Index] = PlainText[PlainBlockStart + Index] ^ - X[Index] ^ SubKey1[Index]; - } else { - NdisZeroMemory(Y, AES_BLOCK_SIZES); - NdisMoveMemory(Y, &PlainText[PlainBlockStart], - (PlainTextLength - PlainBlockStart)); - Y[(PlainTextLength - PlainBlockStart)] = 0x80; - - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - Y[Index] = Y[Index] ^ X[Index] ^ SubKey2[Index]; - } - - RT_AES_Encrypt(Y, sizeof(Y), Key, KeyLength, MACText, MACTextLength); -} - -/* For AES_Key_Wrap */ -#define AES_KEY_WRAP_IV_LENGTH 8 /* 64-bit */ -#define AES_KEY_WRAP_BLOCK_SIZE 8 /* 64-bit */ -static UINT8 Default_IV[8] = { 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6 }; - -/* -======================================================================== -Routine Description: - AES-CBC encryption - -Arguments: - PlainText Plain text - PlainTextLength The length of plain text in bytes - Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) - KeyLength The length of cipher key in bytes - IV Initialization vector, it may be 16 bytes (128 bits) - IVLength The length of initialization vector in bytes - CipherTextLength The length of allocated cipher text in bytes - -Return Value: - CipherText Return cipher text - CipherTextLength Return the length of real used cipher text in bytes - -Note: - Reference to RFC 3602 and NIST 800-38A -======================================================================== -*/ -VOID AES_CBC_Encrypt(IN UINT8 PlainText[], IN UINT PlainTextLength, - IN UINT8 Key[], IN UINT KeyLength, IN UINT8 IV[], - IN UINT IVLength, OUT UINT8 CipherText[], - INOUT UINT *CipherTextLength) -{ - UINT PaddingSize, PlainBlockStart, CipherBlockStart, CipherBlockSize; - UINT Index; - UINT8 Block[AES_BLOCK_SIZES]; - /* - * 1. Check the input parameters - * - CipherTextLength > (PlainTextLength + Padding size), Padding size = block size - (PlainTextLength % block size) - * - Key length must be 16, 24, or 32 bytes(128, 192, or 256 bits) - * - IV length must be 16 bytes(128 bits) - */ - PaddingSize = ((UINT)AES_BLOCK_SIZES) - - (PlainTextLength % ((UINT)AES_BLOCK_SIZES)); - - if (*CipherTextLength < (PlainTextLength + PaddingSize)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CBC_Encrypt: cipher text length is %d bytes < (plain text length %d bytes + padding size %d bytes).\n", - *CipherTextLength, PlainTextLength, PaddingSize)); - return; - } - - if ((KeyLength != AES_KEY128_LENGTH) && - (KeyLength != AES_KEY192_LENGTH) && - (KeyLength != AES_KEY256_LENGTH)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CBC_Encrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n", - KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, - AES_KEY256_LENGTH)); - return; - } - - if (IVLength != AES_CBC_IV_LENGTH) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CBC_Encrypt: IV length is %d bytes, it must be %d bytes(128bits).\n", - IVLength, AES_CBC_IV_LENGTH)); - return; - } - - /* - * 2. Main algorithm - * - Plain text divide into serveral blocks (16 bytes/block) - * - If plain text is divided with no remainder by block, add a new block and padding size = block(16 bytes) - * - If plain text is not divided with no remainder by block, padding size = (block - remainder plain text) - * - Execute RT_AES_Encrypt procedure. - * - * - Padding method: The remainder bytes will be filled with padding size (1 byte) - */ - PlainBlockStart = 0; - CipherBlockStart = 0; - - while ((PlainTextLength - PlainBlockStart) >= AES_BLOCK_SIZES) { - if (CipherBlockStart == 0) { - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - Block[Index] = - PlainText[PlainBlockStart + Index] ^ - IV[Index]; - } else { - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - Block[Index] = - PlainText[PlainBlockStart + Index] ^ - CipherText[CipherBlockStart - - ((UINT)AES_BLOCK_SIZES) + - Index]; - } - - CipherBlockSize = *CipherTextLength - CipherBlockStart; - RT_AES_Encrypt(Block, AES_BLOCK_SIZES, Key, KeyLength, - CipherText + CipherBlockStart, &CipherBlockSize); - PlainBlockStart += ((UINT)AES_BLOCK_SIZES); - CipherBlockStart += CipherBlockSize; - } - - NdisMoveMemory(Block, (&PlainText[0] + PlainBlockStart), - (PlainTextLength - PlainBlockStart)); - NdisFillMemory((Block + (((UINT)AES_BLOCK_SIZES) - PaddingSize)), - PaddingSize, (UINT8)PaddingSize); - - if (CipherBlockStart == 0) { - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - Block[Index] ^= IV[Index]; - } else { - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - Block[Index] ^= - CipherText[CipherBlockStart - - ((UINT)AES_BLOCK_SIZES) + Index]; - } - - CipherBlockSize = *CipherTextLength - CipherBlockStart; - RT_AES_Encrypt(Block, AES_BLOCK_SIZES, Key, KeyLength, - CipherText + CipherBlockStart, &CipherBlockSize); - CipherBlockStart += CipherBlockSize; - *CipherTextLength = CipherBlockStart; -} - -/* -======================================================================== -Routine Description: - AES-CBC decryption - -Arguments: - CipherText Cipher text - CipherTextLength The length of cipher text in bytes - Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) - KeyLength The length of cipher key in bytes - IV Initialization vector, it may be 16 bytes (128 bits) - IVLength The length of initialization vector in bytes - PlainTextLength The length of allocated plain text in bytes - -Return Value: - PlainText Return plain text - PlainTextLength Return the length of real used plain text in bytes - -Note: - Reference to RFC 3602 and NIST 800-38A -======================================================================== -*/ -VOID AES_CBC_Decrypt(IN UINT8 CipherText[], IN UINT CipherTextLength, - IN UINT8 Key[], IN UINT KeyLength, IN UINT8 IV[], - IN UINT IVLength, OUT UINT8 PlainText[], - INOUT UINT *PlainTextLength) -{ - UINT PaddingSize, PlainBlockStart, CipherBlockStart, PlainBlockSize; - UINT Index; - - /* - * 1. Check the input parameters - * - CipherTextLength must be divided with no remainder by block - * - Key length must be 16, 24, or 32 bytes(128, 192, or 256 bits) - * - IV length must be 16 bytes(128 bits) - */ - if ((CipherTextLength % AES_BLOCK_SIZES) != 0) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CBC_Decrypt: cipher text length is %d bytes, it can't be divided with no remainder by block size(%d).\n", - CipherTextLength, AES_BLOCK_SIZES)); - return; - } - - if ((KeyLength != AES_KEY128_LENGTH) && - (KeyLength != AES_KEY192_LENGTH) && - (KeyLength != AES_KEY256_LENGTH)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CBC_Decrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n", - KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, - AES_KEY256_LENGTH)); - return; - } - - if (IVLength != AES_CBC_IV_LENGTH) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_CBC_Decrypt: IV length is %d bytes, it must be %d bytes(128bits).\n", - IVLength, AES_CBC_IV_LENGTH)); - return; - } - - /* - * 2. Main algorithm - * - Cypher text divide into serveral blocks (16 bytes/block) - * - Execute RT_AES_Decrypt procedure. - * - Remove padding bytes, padding size is the last byte of plain text - */ - CipherBlockStart = 0; - PlainBlockStart = 0; - - while ((CipherTextLength - CipherBlockStart) >= AES_BLOCK_SIZES) { - PlainBlockSize = *PlainTextLength - PlainBlockStart; - RT_AES_Decrypt(CipherText + CipherBlockStart, AES_BLOCK_SIZES, - Key, KeyLength, PlainText + PlainBlockStart, - &PlainBlockSize); - - if (PlainBlockStart == 0) { - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - PlainText[PlainBlockStart + Index] ^= IV[Index]; - } else { - for (Index = 0; Index < AES_BLOCK_SIZES; Index++) - PlainText[PlainBlockStart + Index] ^= - CipherText[CipherBlockStart + Index - - ((UINT)AES_BLOCK_SIZES)]; - } - - CipherBlockStart += AES_BLOCK_SIZES; - PlainBlockStart += PlainBlockSize; - } - - PaddingSize = (UINT8)PlainText[PlainBlockStart - 1]; - *PlainTextLength = PlainBlockStart - PaddingSize; -} - -/* -======================================================================== -Routine Description: - AES key wrap algorithm - -Arguments: - PlainText Plain text - PlainTextLength The length of plain text in bytes - Key Cipher key - KeyLength The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes) - -Return Value: - CipherText The ciphertext - CipherTextLength Return the length of the ciphertext in bytes - -Function Value: - 0: Success - -1: The key length must be 16, 24, or 32 bytes - -2: Not enough memory - -Note: - Reference to RFC 3394 -======================================================================== -*/ -INT AES_Key_Wrap(IN UINT8 PlainText[], IN UINT PlainTextLength, IN UINT8 Key[], - IN UINT KeyLength, OUT UINT8 CipherText[], - OUT UINT *CipherTextLength) -{ - UINT8 IV[8], Block_B[16], Block_Input[16]; - UINT8 *pResult; - UINT Temp_Length = 0, Number_Of_Block = 0; - INT Index_i = 0, Index_j = 0; - - /* - * 0. Check input parameter - */ - if ((KeyLength != AES_KEY128_LENGTH) && - (KeyLength != AES_KEY192_LENGTH) && - (KeyLength != AES_KEY256_LENGTH)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_Key_Wrap: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n", - KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, - AES_KEY256_LENGTH)); - return -1; - } - - os_alloc_mem(NULL, (UCHAR **)&pResult, sizeof(UINT8) * PlainTextLength); - - if (pResult == NULL) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_Key_Wrap: allocate %zu bytes memory failure.\n", - sizeof(UINT8) * PlainTextLength)); - return -2; - } - - /* - * 1. Initialize variables - */ - Number_Of_Block = PlainTextLength / - AES_KEY_WRAP_BLOCK_SIZE; /* 64 bits each block */ - NdisMoveMemory(IV, Default_IV, AES_KEY_WRAP_IV_LENGTH); - NdisMoveMemory(pResult, PlainText, PlainTextLength); - - /* - * 2. Calculate intermediate values - */ - for (Index_j = 0; Index_j < 6; Index_j++) { - for (Index_i = 0; Index_i < Number_Of_Block; Index_i++) { - NdisMoveMemory(Block_Input, IV, 8); - NdisMoveMemory(Block_Input + 8, pResult + (Index_i * 8), - 8); - Temp_Length = sizeof(Block_B); - RT_AES_Encrypt(Block_Input, AES_BLOCK_SIZES, Key, - KeyLength, Block_B, &Temp_Length); - NdisMoveMemory(IV, Block_B, 8); - IV[7] = Block_B[7] ^ - ((Number_Of_Block * Index_j) + Index_i + 1); - NdisMoveMemory(pResult + (Index_i * 8), (Block_B + 8), - 8); - } - } - - /* - * 3. Output the results - */ - *CipherTextLength = PlainTextLength + AES_KEY_WRAP_IV_LENGTH; - NdisMoveMemory(CipherText, IV, AES_KEY_WRAP_IV_LENGTH); - NdisMoveMemory(CipherText + AES_KEY_WRAP_IV_LENGTH, pResult, - PlainTextLength); - os_free_mem(pResult); - return 0; -} - -/* -======================================================================== -Routine Description: - AES key unwrap algorithm - -Arguments: - CipherText The ciphertext - CipherTextLength The length of cipher text in bytes - Key Cipher key - KeyLength The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes) - -Return Value: - PlainText Plain text - PlainTextLength Return the length of the plain text in bytes - -Function Value: - 0: Success - -Note: - Reference to RFC 3394 -======================================================================== -*/ -INT AES_Key_Unwrap(IN UINT8 CipherText[], IN UINT CipherTextLength, - IN UINT8 Key[], IN UINT KeyLength, OUT UINT8 PlainText[], - OUT UINT *PlainTextLength) -{ - UINT8 IV[8], Block_B[16], Block_Input[16]; - UINT8 *pResult; - UINT Temp_Length = 0, Number_Of_Block = 0, PlainLength; - INT Index_i = 0, Index_j = 0; - /* - * 0. Check input parameter - */ - PlainLength = CipherTextLength - AES_KEY_WRAP_IV_LENGTH; - - if ((KeyLength != AES_KEY128_LENGTH) && - (KeyLength != AES_KEY192_LENGTH) && - (KeyLength != AES_KEY256_LENGTH)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_Key_Unwrap: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n", - KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, - AES_KEY256_LENGTH)); - return -1; - } - - os_alloc_mem(NULL, (UCHAR **)&pResult, sizeof(UINT8) * PlainLength); - - if (pResult == NULL) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AES_Key_Unwrap: allocate %zu bytes memory failure.\n", - sizeof(UINT8) * PlainLength)); - return -2; - } - - /* - * 1. Initialize variables - */ - Number_Of_Block = - PlainLength / AES_KEY_WRAP_BLOCK_SIZE; /* 64 bits each block */ - NdisMoveMemory(IV, CipherText, AES_KEY_WRAP_IV_LENGTH); - NdisMoveMemory(pResult, CipherText + AES_KEY_WRAP_IV_LENGTH, - PlainLength); - - /* - * 2. Calculate intermediate values - */ - for (Index_j = 5; Index_j >= 0; Index_j--) { - for (Index_i = (Number_Of_Block - 1); Index_i >= 0; Index_i--) { - IV[7] = IV[7] ^ - ((Number_Of_Block * Index_j) + Index_i + 1); - NdisMoveMemory(Block_Input, IV, 8); - NdisMoveMemory(Block_Input + 8, pResult + (Index_i * 8), - 8); - Temp_Length = sizeof(Block_B); - RT_AES_Decrypt(Block_Input, AES_BLOCK_SIZES, Key, - KeyLength, Block_B, &Temp_Length); - NdisMoveMemory(IV, Block_B, 8); - NdisMoveMemory(pResult + (Index_i * 8), (Block_B + 8), - 8); - } - } - - /* - * 3. Output the results - */ - *PlainTextLength = PlainLength; - NdisMoveMemory(PlainText, pResult, PlainLength); - os_free_mem(pResult); - return 0; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_arc4.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_arc4.c deleted file mode 100644 index a0a23900bb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_arc4.c +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - RC4 - - Abstract: - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2009/05/13 ARC4 -***************************************************************************/ - -#include "security/crypt_arc4.h" -#include "rt_config.h" - -/* -======================================================================== -Routine Description: - ARC4 initialize the key block - -Arguments: - pARC4_CTX Pointer to ARC4 CONTEXT - Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) - KeyLength The length of cipher key in bytes - -======================================================================== -*/ -VOID ARC4_INIT(IN ARC4_CTX_STRUC *pARC4_CTX, IN PUCHAR pKey, IN UINT KeyLength) -{ - UINT BlockIndex = 0, SWAPIndex = 0, KeyIndex = 0; - UINT8 TempValue = 0; - /*Initialize the block value*/ - pARC4_CTX->BlockIndex1 = 0; - pARC4_CTX->BlockIndex2 = 0; - - for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++) - pARC4_CTX->KeyBlock[BlockIndex] = (UINT8)BlockIndex; - - /*Key schedule*/ - for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++) { - TempValue = pARC4_CTX->KeyBlock[BlockIndex]; - KeyIndex = BlockIndex % KeyLength; - SWAPIndex = (SWAPIndex + TempValue + pKey[KeyIndex]) & 0xff; - pARC4_CTX->KeyBlock[BlockIndex] = - pARC4_CTX->KeyBlock[SWAPIndex]; - pARC4_CTX->KeyBlock[SWAPIndex] = TempValue; - } /* End of for */ -} /* End of ARC4_INIT */ - -/* -======================================================================== -Routine Description: - ARC4 encryption/decryption - -Arguments: - pARC4_CTX Pointer to ARC4 CONTEXT - InputText Input text - InputTextLength The length of input text in bytes - -Return Value: - OutputBlock Return output text - ======================================================================== -*/ -VOID ARC4_Compute(IN ARC4_CTX_STRUC *pARC4_CTX, IN UINT8 InputBlock[], - IN UINT InputBlockSize, OUT UINT8 OutputBlock[]) -{ - UINT InputIndex = 0; - UINT8 TempValue = 0; - - for (InputIndex = 0; InputIndex < InputBlockSize; InputIndex++) { - pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff; - TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]; - pARC4_CTX->BlockIndex2 = - (pARC4_CTX->BlockIndex2 + TempValue) & 0xff; - pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = - pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2]; - pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue; - TempValue = (TempValue + - pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]) & - 0xff; - OutputBlock[InputIndex] = - InputBlock[InputIndex] ^ pARC4_CTX->KeyBlock[TempValue]; - } /* End of for */ -} /* End of ARC4_Compute */ - -/* -======================================================================== -Routine Description: - Discard the key length - -Arguments: - pARC4_CTX Pointer to ARC4 CONTEXT - Length Discard the key length - -======================================================================== -*/ -VOID ARC4_Discard_KeyLength(IN ARC4_CTX_STRUC *pARC4_CTX, IN UINT Length) -{ - UINT Index = 0; - UINT8 TempValue = 0; - - for (Index = 0; Index < Length; Index++) { - pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff; - TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]; - pARC4_CTX->BlockIndex2 = - (pARC4_CTX->BlockIndex2 + TempValue) & 0xff; - pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = - pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2]; - pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue; - } /* End of for */ -} /* End of ARC4_Discard_KeyLength */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_biginteger.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_biginteger.c deleted file mode 100644 index 3a01f851e8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_biginteger.c +++ /dev/null @@ -1,3496 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ -#include "security/crypt_biginteger.h" -#include "rt_config.h" -#include - -#ifdef __KERNEL__ -#define DEBUGPRINT(fmt, args...) printk(fmt, ##args) -#else -#define DEBUGPRINT(fmt, args...) printf(fmt, ##args) -#endif /* __KERNEL__ */ - -#define UINT32_HBITS(value) (((value) >> 0x10) & 0xffff) -#define UINT32_LBITS(value) ((value)&0xffff) -#define UINT32_GETBYTE(value, index) (((value) >> ((index)*8)) & 0xff) -#define UINT64_HBITS(value) (((value) >> 0x20) & 0xffffffff) -#define UINT64_LBITS(value) ((value)&0xffffffff) -#ifdef WSC_INCLUDED -static UINT8 WPS_DH_R_VALUE[193] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, -}; - -static UINT8 WPS_DH_X_VALUE[184] = { - 0x36, 0xf0, 0x25, 0x5d, 0xde, 0x97, 0x3d, 0xcb, 0x3b, 0x39, 0x9d, 0x74, - 0x7f, 0x23, 0xe3, 0x2e, 0xd6, 0xfd, 0xb1, 0xf7, 0x75, 0x98, 0x33, 0x8b, - 0xfd, 0xf4, 0x41, 0x59, 0xc4, 0xec, 0x64, 0xdd, 0xae, 0xb5, 0xf7, 0x86, - 0x71, 0xcb, 0xfb, 0x22, 0x10, 0x6a, 0xe6, 0x4c, 0x32, 0xc5, 0xbc, 0xe4, - 0xcf, 0xd4, 0xf5, 0x92, 0x0d, 0xa0, 0xeb, 0xc8, 0xb0, 0x1e, 0xca, 0x92, - 0x92, 0xae, 0x3d, 0xba, 0x1b, 0x7a, 0x4a, 0x89, 0x9d, 0xa1, 0x81, 0x39, - 0x0b, 0xb3, 0xbd, 0x16, 0x59, 0xc8, 0x12, 0x94, 0xf4, 0x00, 0xa3, 0x49, - 0x0b, 0xf9, 0x48, 0x12, 0x11, 0xc7, 0x94, 0x04, 0xa5, 0x76, 0x60, 0x5a, - 0x51, 0x60, 0xdb, 0xee, 0x83, 0xb4, 0xe0, 0x19, 0xb6, 0xd7, 0x99, 0xae, - 0x13, 0x1b, 0xa4, 0xc2, 0x3d, 0xff, 0x83, 0x47, 0x5e, 0x9c, 0x40, 0xfa, - 0x67, 0x25, 0xb7, 0xc9, 0xe3, 0xaa, 0x2c, 0x65, 0x96, 0xe9, 0xc0, 0x57, - 0x02, 0xdb, 0x30, 0xa0, 0x7c, 0x9a, 0xa2, 0xdc, 0x23, 0x5c, 0x52, 0x69, - 0xe3, 0x9d, 0x0c, 0xa9, 0xdf, 0x7a, 0xad, 0x44, 0x61, 0x2a, 0xd6, 0xf8, - 0x8f, 0x69, 0x69, 0x92, 0x98, 0xf3, 0xca, 0xb1, 0xb5, 0x43, 0x67, 0xfb, - 0x0e, 0x8b, 0x93, 0xf7, 0x35, 0xdc, 0x8c, 0xd8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, -}; -#endif - -static UINT8 Value_0[1] = { 0x00 }; -static UINT8 Value_1[1] = { 0x01 }; -static PBIG_INTEGER pBI_S = NULL, pBI_O; - -BI_OP_TIME_RECORD bi_op_ti_rec; -UCHAR is_time_rec = FALSE; -ULONG alloc_cnt = 0; -UCHAR is_add_alloc_rec = FALSE; -UCHAR is_sub_alloc_rec = FALSE; -UCHAR is_mul_alloc_rec = FALSE; -UCHAR is_div_alloc_rec = FALSE; -UCHAR is_mod_alloc_rec = FALSE; -ULONG alloc_cnt_add = 0; -ULONG alloc_cnt_sub = 0; -ULONG alloc_cnt_mul = 0; -ULONG alloc_cnt_div = 0; -ULONG alloc_cnt_mod = 0; -#ifdef BI_POOL_DBG -UINT32 expected_cnt[25]; /* 0~21 is used */ -#endif - -#ifdef BI_POOL -#define TEMP_USAGE_POOL_SIZE 500 -BIG_INTEGER *temp_usage_pool[TEMP_USAGE_POOL_SIZE] = { NULL }; -static UINT16 pool_cur_index; -static UCHAR pool_is_small = FALSE; -#endif -NDIS_SPIN_LOCK bi_pool_lock; - -#ifdef BI_POOL -VOID big_integer_pool_init(VOID) -{ - UINT16 i = 0; - NdisAcquireSpinLock(&bi_pool_lock); - - for (i = 0; i < TEMP_USAGE_POOL_SIZE; i++) { - BigInteger_Init(&temp_usage_pool[i]); - BigInteger_AllocSize(&temp_usage_pool[i], 300); - } - - NdisReleaseSpinLock(&bi_pool_lock); -} - -VOID big_integer_pool_deinit(VOID) -{ - UINT16 i = 0; - NdisAcquireSpinLock(&bi_pool_lock); - - for (i = 0; i < TEMP_USAGE_POOL_SIZE; i++) - BigInteger_Free(&temp_usage_pool[i]); - - NdisReleaseSpinLock(&bi_pool_lock); -} - -BIG_INTEGER *get_temporal_usage_big_interger(VOID) -{ - UINT16 i = 0; - NdisAcquireSpinLock(&bi_pool_lock); - - for (i = 0; i < TEMP_USAGE_POOL_SIZE; i++) { - BIG_INTEGER *tmp = temp_usage_pool[(i + pool_cur_index) % - TEMP_USAGE_POOL_SIZE]; - - if (tmp->invalid == FALSE) { - tmp->invalid = TRUE; - tmp->Signed = 1; - pool_cur_index = - (i + pool_cur_index + 1) % TEMP_USAGE_POOL_SIZE; - NdisReleaseSpinLock(&bi_pool_lock); - return tmp; - } - } - - if (pool_is_small == FALSE) - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[35m%s :pool is too small\x1b[m\n", __func__)); - - pool_is_small = TRUE; - NdisReleaseSpinLock(&bi_pool_lock); - return NULL; -} - -UINT32 sae_dump_pool_info_check(INT32 expect_cnt, UCHAR is_check, - UCHAR is_print) -{ - UINT32 cnt = 0; - UINT i = 0; - - for (i = 0; i < TEMP_USAGE_POOL_SIZE; i++) - if (temp_usage_pool[i]->invalid) - cnt++; - - if (is_check && expect_cnt != cnt) - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[31mError: invalid pool cnt = %d, Expected Cnt = %d, caller = %pS\x1b[m\n", - cnt, expect_cnt, OS_TRACE)); - - if (is_print && cnt != 0) - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[31m")); - - if (is_print) - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("invalid pool cnt = %d, pool idx = %d, pool_is_small = %d\x1b[m\n", - cnt, pool_cur_index, pool_is_small)); - - return cnt; -} -#endif - -VOID release_temporal_usage_big_interger(IN BIG_INTEGER **pBI) -{ - if (*pBI && (*pBI)->invalid == TRUE) { - NdisAcquireSpinLock(&bi_pool_lock); - (*pBI)->invalid = FALSE; - *pBI = NULL; - NdisReleaseSpinLock(&bi_pool_lock); - } else { - /*MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s :pool is too small\n", __func__));*/ - BigInteger_Free(pBI); - } -} - -static inline ULONG show_float(ULONG a, ULONG b, INT32 x) -{ - ULONG c = a / b; - UCHAR i = 0; - ULONG d = 1; - ULONG e = 0; - - for (i = 0; i < x; i++) - d *= 10; - - e = d * a / b; - return e - c * d; -} - -VOID BigInteger_record_time_begin(BI_OP_TIME_INTERVAL *time_rec) -{ - NdisGetSystemUpTime(&time_rec->time_interval); -} - -VOID BigInteger_record_time_end(BI_OP_TIME_INTERVAL *time_rec) -{ - ULONG temp; - NdisGetSystemUpTime(&temp); - time_rec->time_interval = temp - time_rec->time_interval; - - if (time_rec->exe_times + 1 == 0) - return; - - time_rec->avg_time_interval = - ((time_rec->avg_time_interval * time_rec->exe_times) + - time_rec->time_interval) / - (time_rec->exe_times + 1); - time_rec->exe_times++; -} - -VOID BigInteger_record_time_ns(BI_OP_TIME_INTERVAL *time_rec, - ULONG time_interval) -{ - time_rec->time_interval += time_interval; - - if (time_rec->exe_times + 1 == 0) - return; - - time_rec->avg_time_interval = - time_rec->time_interval / (time_rec->exe_times + 1); - time_rec->exe_times++; -} - -VOID BigInteger_Print(IN PBIG_INTEGER pBI) -{ - int i = 0, j = 0; - - if ((pBI == NULL) || (pBI->pIntegerArray == NULL)) - return; - - if (strlen(pBI->Name) != 0) - DEBUGPRINT("Name=%s\n", pBI->Name); - - for (i = (pBI->ArrayLength - 1), j = 0; i >= 0; i--, j++) { - DEBUGPRINT("%08x, ", pBI->pIntegerArray[i]); - - if ((j % 8) == 7) - DEBUGPRINT("\n"); - } - - DEBUGPRINT("\n\n"); -} - -static UCHAR randombyte(void) -{ - ULONG i; - UCHAR R = 0, Result; - static ULONG ShiftReg; - - if (ShiftReg == 0) - NdisGetSystemUpTime((ULONG *)&ShiftReg); - - for (i = 0; i < 8; i++) { - if (ShiftReg & 0x00000001) { - ShiftReg = ((ShiftReg ^ LFSR_MASK) >> 1) | 0x80000000; - Result = 1; - } else { - ShiftReg = ShiftReg >> 1; - Result = 0; - } - - R = (R << 1) | Result; - } - - return R; -} - -INT BigInteger_rand_range(IN BIG_INTEGER *range, INOUT BIG_INTEGER *r) -{ - UINT8 *rand = NULL; - UINT32 i; - UINT32 iter = 0; - UINT32 range_len; - BIG_INTEGER *rand_bi = NULL; - - if (!range) - return 0; - - range_len = BigInteger_getlen(range); - os_alloc_mem(NULL, (UCHAR **)&rand, range_len); - if (!rand) { - DEBUGPRINT("==> %s(), fail\n", __func__); - return 0; - } - - for (iter = 0; iter < 100; iter++) { - for (i = 0; i < range_len; i++) - rand[i] = randombyte(); - - hex_dump_with_lvl("rand:", (char *)rand, range_len, - DBG_LVL_INFO); - BigInteger_Bin2BI(rand, range_len, &rand_bi); - if (BigInteger_is_zero(rand_bi) || BigInteger_is_one(rand_bi) || - BigInteger_UnsignedCompare(rand_bi, range) >= 0) { - continue; - } else { - BigInteger_Copy(rand_bi, &r); - BigInteger_Free(&rand_bi); - os_free_mem(rand); - return 1; - } - } - - BigInteger_Free(&rand_bi); - os_free_mem(rand); - return 0; -} - -VOID BigInteger_Init(INOUT PBIG_INTEGER *pBI) -{ - if (*pBI != NULL) { - if ((*pBI)->invalid == FALSE) - BigInteger_Free_AllocSize(pBI); - - return; - } else { - if (is_time_rec) - alloc_cnt++; - - if (is_add_alloc_rec) - alloc_cnt_add++; - - if (is_sub_alloc_rec) - alloc_cnt_sub++; - - if (is_mul_alloc_rec) - alloc_cnt_mul++; - - if (is_div_alloc_rec) - alloc_cnt_div++; - - if (is_mod_alloc_rec) - alloc_cnt_mod++; - - os_alloc_mem(NULL, (UCHAR **)pBI, sizeof(BIG_INTEGER)); - } - - if (*pBI == NULL) { - DEBUGPRINT( - "BigInteger_Init: allocate %zu bytes memory failure.\n", - sizeof(BIG_INTEGER)); - return; - } - - NdisZeroMemory(*pBI, sizeof(BIG_INTEGER)); - (*pBI)->pIntegerArray = NULL; - (*pBI)->Signed = 1; -} - -VOID BigInteger_Free_AllocSize(IN PBIG_INTEGER *pBI) -{ - if ((*pBI != NULL) && ((*pBI)->pIntegerArray != NULL)) { - UCHAR invalid = (*pBI)->invalid; - os_free_mem((*pBI)->pIntegerArray); - NdisZeroMemory(*pBI, sizeof(BIG_INTEGER)); - (*pBI)->pIntegerArray = NULL; - (*pBI)->Signed = 1; - (*pBI)->invalid = invalid; - } -} - -VOID BigInteger_Free(IN PBIG_INTEGER *pBI) -{ - if (*pBI != NULL) { - BigInteger_Free_AllocSize(pBI); - os_free_mem(*pBI); - } - - *pBI = NULL; -} - -VOID BigInteger_AllocSize(IN PBIG_INTEGER *pBI, IN INT Length) -{ - UINT ArrayLength = 0; - - if (Length <= 0) - return; - - if (*pBI == NULL) - BigInteger_Init(pBI); - - /* Caculate array size */ - ArrayLength = Length >> 0x2; - - if ((Length & 0x3) != 0) - ArrayLength++; - - if (((*pBI)->pIntegerArray != NULL) && - ((*pBI)->AllocSize < (sizeof(UINT32) * ArrayLength))) - BigInteger_Free_AllocSize(pBI); - - if ((*pBI)->pIntegerArray == NULL) { - if (is_time_rec) - alloc_cnt++; - - if (is_add_alloc_rec) - alloc_cnt_add++; - - if (is_sub_alloc_rec) - alloc_cnt_sub++; - - if (is_mul_alloc_rec) - alloc_cnt_mul++; - - if (is_div_alloc_rec) - alloc_cnt_div++; - - if (is_mod_alloc_rec) - alloc_cnt_mod++; - - os_alloc_mem(NULL, (UCHAR **)&((*pBI)->pIntegerArray), - sizeof(UINT32) * ArrayLength); - - if ((*pBI)->pIntegerArray == NULL) { - DEBUGPRINT( - "BigInteger_AllocSize: allocate %zu bytes memory failure.\n", - sizeof(UINT32) * ArrayLength); - return; - } - - (*pBI)->AllocSize = sizeof(UINT32) * ArrayLength; - } - - NdisZeroMemory((*pBI)->pIntegerArray, (*pBI)->AllocSize); - (*pBI)->ArrayLength = ArrayLength; - (*pBI)->IntegerLength = Length; -} - -VOID BigInteger_ClearHighBits(IN PBIG_INTEGER pBI) -{ - INT BIArrayIndex, ShiftIndex = 0; - UINT8 value; - - if ((pBI == NULL) || (pBI->pIntegerArray == NULL)) - return; - - BIArrayIndex = pBI->ArrayLength - 1; - - while ((BIArrayIndex >= 0) && (pBI->pIntegerArray[BIArrayIndex] == 0)) - BIArrayIndex--; - - if (BIArrayIndex >= 0) { - value = 0; - ShiftIndex = 4; - - while (value == 0) { - ShiftIndex--; - value = UINT32_GETBYTE(pBI->pIntegerArray[BIArrayIndex], - ShiftIndex); - } /* End of while */ - } /* End of if */ - - if (BIArrayIndex < 0) { - pBI->IntegerLength = 1; - pBI->ArrayLength = 1; - pBI->Signed = 1; - } else { - pBI->IntegerLength = (BIArrayIndex * 4) + ShiftIndex + 1; - pBI->ArrayLength = BIArrayIndex + 1; - } /* End of if */ -} /* End of BigInteger_ClearHighBits */ - -UINT32 BigInteger_getlen(IN BIG_INTEGER *pBI) -{ - return pBI->IntegerLength; -} - -VOID BigInteger_BI2Bin(IN PBIG_INTEGER pBI, OUT UINT8 *pValue, OUT UINT *Length) -{ - INT ValueIndex, BIArrayIndex, ShiftIndex; - UINT32 Number; - - if (pBI == NULL) { - DEBUGPRINT("BigInteger_BI2Bin: pBI is NUll\n"); - *Length = 0; - return; - } /* End of if */ - - /* for OWE. - * It already guarantee the length of its corresponding pointer is big enough. - * And would like to this function help it to transfer bn to binary, - * then return the length of this function transferred. - * - * The length checking here is not necessary, - * the caller of others should guarantee the length of its corresponding pointer is big enough, too. - * if (*Length < (sizeof(UINT8) * pBI->IntegerLength)) { - * DEBUGPRINT("BigInteger_BI2Bin: length(%d) is not enough.\n", *Length); - * *Length = 0; - * return; - * } - */ - - if (pBI->pIntegerArray == NULL) { - *Length = 0; - return; - } /* End of if */ - - BigInteger_ClearHighBits(pBI); - ShiftIndex = pBI->IntegerLength & 0x3; - - if (ShiftIndex == 0) - ShiftIndex = 4; - - BIArrayIndex = pBI->ArrayLength - 1; - ValueIndex = 0; - Number = pBI->pIntegerArray[BIArrayIndex]; - - while (ValueIndex < pBI->IntegerLength) { - pValue[ValueIndex++] = - (UINT8)UINT32_GETBYTE(Number, ShiftIndex - 1); - - if ((--ShiftIndex) == 0) { - ShiftIndex = 4; - BIArrayIndex--; - Number = pBI->pIntegerArray[BIArrayIndex]; - } /* End of if */ - } /* End of while */ - - *Length = pBI->IntegerLength; -} /* End of BigInteger_BI2Bin */ - -VOID BigInteger_BI2Bin_with_pad(IN PBIG_INTEGER pBI, OUT UINT8 *pValue, - OUT UINT *Length, IN UINT32 PadLen) -{ - UINT32 offset; - - if (!pBI) - return; - - offset = - (pBI->IntegerLength > PadLen) ? 0 : PadLen - pBI->IntegerLength; - NdisZeroMemory(pValue, offset); - BigInteger_BI2Bin(pBI, pValue + offset, Length); - *Length += offset; -} - -VOID BigInteger_Bin2BI(IN UINT8 *pValue, IN UINT Length, OUT PBIG_INTEGER *pBI) -{ - INT ValueIndex, BIArrayIndex, ShiftIndex; - UINT32 Number; - BigInteger_AllocSize(pBI, Length); - - if ((*pBI)->pIntegerArray != NULL) { - Number = 0; - ShiftIndex = Length & 0x3; - - if (ShiftIndex == 0) - ShiftIndex = 4; - - BIArrayIndex = (*pBI)->ArrayLength - 1; - ValueIndex = 0; - - while (ValueIndex < Length) { - Number = (Number << 8) | (UINT8)pValue[ValueIndex++]; - - if ((--ShiftIndex) == 0) { - (*pBI)->pIntegerArray[BIArrayIndex] = Number; - ShiftIndex = 4; - BIArrayIndex--; - Number = 0; - } /* End of if */ - } /* End of while */ - } /* End of if */ - - BigInteger_ClearHighBits(*pBI); -} /* End of BigInteger_Bin2BI */ - -/* Calculate the bits of BigInteger, the highest bit is 1 */ -VOID BigInteger_BitsOfBI(IN PBIG_INTEGER pBI, OUT UINT *Bits_Of_P) -{ - UINT32 Number, Index; - Number = pBI->pIntegerArray[pBI->ArrayLength - 1]; - Index = 0; - - while ((!(Number & 0x80000000)) && (Index < 32)) { - Number <<= 1; - Index++; - } /* End of while */ - - *Bits_Of_P = (pBI->ArrayLength * 32) - Index; -} /* End of BigInteger_BitsOfBN */ - -INT BigInteger_GetBitValue(IN PBIG_INTEGER pBI, IN UINT Index) -{ - UINT Array = 0; - UINT Shift = 0; - - if (Index > 0) { - Array = (Index - 1) >> 0x5; - Shift = (Index - 1) & 0x1F; - } - - if (Array > pBI->ArrayLength) - return 0; - - return (pBI->pIntegerArray[Array] >> Shift) & 0x1; -} /* End of BigInteger_GetBitValue */ - -UINT8 BigInteger_GetByteValue(IN PBIG_INTEGER pBI, IN UINT Index) -{ - UINT Array = 0; - UINT Shift = 0; - - if (Index > 0) { - Array = (Index - 1) >> 0x2; - Shift = (Index - 1) & 0x3; - } - - if ((Array > pBI->ArrayLength) || (Index > pBI->IntegerLength)) - return 0; - - return (UINT8)UINT32_GETBYTE(pBI->pIntegerArray[Array], Shift); -} /* End of BigInteger_GetByteValue */ - -VOID BigInteger_Copy(IN PBIG_INTEGER pBI_Copied, OUT PBIG_INTEGER *pBI_Result) -{ - BigInteger_AllocSize(pBI_Result, pBI_Copied->IntegerLength); - NdisCopyMemory((*pBI_Result)->pIntegerArray, pBI_Copied->pIntegerArray, - (sizeof(UINT32) * (*pBI_Result)->ArrayLength)); - (*pBI_Result)->ArrayLength = pBI_Copied->ArrayLength; - (*pBI_Result)->IntegerLength = pBI_Copied->IntegerLength; - (*pBI_Result)->Signed = pBI_Copied->Signed; -} /* End of BigInteger_Copy */ - -INT BigInteger_UnsignedCompare(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand) -{ - INT BIArrayIndex; - BigInteger_ClearHighBits(pFirstOperand); - BigInteger_ClearHighBits(pSecondOperand); - - if (pFirstOperand->IntegerLength == pSecondOperand->IntegerLength) { - for (BIArrayIndex = (pFirstOperand->ArrayLength - 1); - BIArrayIndex >= 0; BIArrayIndex--) { - if (pFirstOperand->pIntegerArray[BIArrayIndex] > - pSecondOperand->pIntegerArray[BIArrayIndex]) - return 1; - else if (pFirstOperand->pIntegerArray[BIArrayIndex] < - pSecondOperand->pIntegerArray[BIArrayIndex]) - return -1; - } /* End of for */ - } /* End of if */ - - if (pFirstOperand->IntegerLength > pSecondOperand->IntegerLength) - return 1; - - if (pFirstOperand->IntegerLength < pSecondOperand->IntegerLength) - return -1; - - return 0; -} /* End of BigInteger_Compare */ - -VOID BigInteger_Add(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result) -{ - INT CompareResult; - UINT32 BIArrayIndex; - UINT64 Sum, Carry; - PBIG_INTEGER pTempBI = NULL; -#ifdef BI_TIME_REC - struct timeval t1; - struct timeval t2; -#endif - - if ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL) || - (pSecondOperand == NULL) || - (pSecondOperand->pIntegerArray == NULL)) { - DEBUGPRINT( - "BigInteger_Add: first or second operand is NULL.\n"); - return; - } /* End of if */ - -#ifdef BI_TIME_REC - - if (is_time_rec) { - do_gettimeofday(&t1); - is_add_alloc_rec = TRUE; - } - -#endif - - if (*pBI_Result == NULL) - BigInteger_Init(pBI_Result); - - CompareResult = - BigInteger_UnsignedCompare(pFirstOperand, pSecondOperand); - - if ((CompareResult == 0) & - ((pFirstOperand->Signed * pSecondOperand->Signed) < 0)) { - BigInteger_AllocSize(pBI_Result, 1); - return; - } /* End of if */ - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[0]); - GET_BI_INS_FROM_POOL(pTempBI); - - /* - * Singed table - * A + B || A > B || A < B - * ------------------------ - * + + || + || + - * + - || + || - - * - + || - || + - * - - || - || - - */ - if ((pFirstOperand->Signed * pSecondOperand->Signed) > 0) { - if (pFirstOperand->IntegerLength > - pSecondOperand->IntegerLength) - BigInteger_AllocSize(pBI_Result, - pFirstOperand->IntegerLength + 1); - else - BigInteger_AllocSize(pBI_Result, - pSecondOperand->IntegerLength + - 1); /* End of if */ - - Carry = 0; - - for (BIArrayIndex = 0; - BIArrayIndex < (*pBI_Result)->ArrayLength; - BIArrayIndex++) { - Sum = 0; - - if (BIArrayIndex < pFirstOperand->ArrayLength) - Sum += (UINT64)pFirstOperand - ->pIntegerArray[BIArrayIndex]; - - if (BIArrayIndex < pSecondOperand->ArrayLength) - Sum += (UINT64)pSecondOperand - ->pIntegerArray[BIArrayIndex]; - - Sum += Carry; - Carry = Sum >> 32; - (*pBI_Result)->pIntegerArray[BIArrayIndex] = - (UINT32)(Sum & 0xffffffffUL); - } /* End of for */ - - (*pBI_Result)->Signed = pFirstOperand->Signed; - BigInteger_ClearHighBits(*pBI_Result); - } else { - if ((pFirstOperand->Signed == 1) & - (pSecondOperand->Signed == -1)) { - BigInteger_Copy(pSecondOperand, &pTempBI); - pTempBI->Signed = 1; - BigInteger_Sub(pFirstOperand, pTempBI, pBI_Result); - } else if ((pFirstOperand->Signed == -1) & - (pSecondOperand->Signed == 1)) { - BigInteger_Copy(pFirstOperand, &pTempBI); - pTempBI->Signed = 1; - BigInteger_Sub(pSecondOperand, pTempBI, pBI_Result); - } /* End of if */ - } /* End of if */ - - release_temporal_usage_big_interger(&pTempBI); - POOL_COUNTER_CHECK_END(expected_cnt[0]); -#ifdef BI_TIME_REC - - if (is_time_rec) { - ULONG time_interval = 0; - do_gettimeofday(&t2); - - if (t1.tv_usec > t2.tv_usec) - time_interval = (t2.tv_sec - t1.tv_sec) * 1000000 - - t1.tv_usec + t2.tv_usec; - else - time_interval = t2.tv_usec - t1.tv_usec; - - BigInteger_record_time_ns(&bi_op_ti_rec.add_op, time_interval); - is_add_alloc_rec = FALSE; - } - -#endif -} /* End of BigInteger_Add */ - -VOID BigInteger_Sub(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result) -{ - INT CompareResult; - UINT32 BIArrayIndex, Carry; - PBIG_INTEGER pTempBI2 = NULL; -#ifdef BI_TIME_REC - struct timeval t1; - struct timeval t2; -#endif - - if ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL) || - (pSecondOperand == NULL) || - (pSecondOperand->pIntegerArray == NULL)) { - DEBUGPRINT( - "BigInteger_Sub: first or second operand is NULL.\n"); - return; - } /* End of if */ - -#ifdef BI_TIME_REC - - if (is_time_rec) { - do_gettimeofday(&t1); - is_sub_alloc_rec = TRUE; - } - -#endif - - if (*pBI_Result == NULL) - BigInteger_Init(pBI_Result); - - CompareResult = - BigInteger_UnsignedCompare(pFirstOperand, pSecondOperand); - - if ((CompareResult == 0) & - ((pFirstOperand->Signed * pSecondOperand->Signed) > 0)) { - BigInteger_AllocSize(pBI_Result, 1); - return; - } /* End of if */ - - /* - * Singed table - * A - B || A > B || A < B - * ------------------------ - * + + || + || - - * + - || + || + - * - + || - || - - * - - || - || + - */ - if ((pFirstOperand->Signed * pSecondOperand->Signed) > 0) { - UINT32 *pResultArray = NULL; - UINT32 *pTempArray = NULL; - - if (CompareResult == 1) { - BigInteger_Copy(pFirstOperand, pBI_Result); - pTempBI2 = pSecondOperand; - } else if (CompareResult == -1) { - BigInteger_Copy(pSecondOperand, pBI_Result); - pTempBI2 = pFirstOperand; - } /* End of if */ - - pResultArray = (*pBI_Result)->pIntegerArray; - pTempArray = pTempBI2->pIntegerArray; - Carry = 0; - - for (BIArrayIndex = 0; - BIArrayIndex < (*pBI_Result)->ArrayLength; - BIArrayIndex++) { - if (BIArrayIndex < pTempBI2->ArrayLength) { - if (((pResultArray[BIArrayIndex] - Carry) < - pTempArray[BIArrayIndex]) || - ((pResultArray[BIArrayIndex] == 0) && - (Carry == 1))) { - pResultArray[BIArrayIndex] = - 0xffffffffUL - - pTempArray[BIArrayIndex] - - Carry + - pResultArray[BIArrayIndex] + 1; - Carry = 1; - } else { - pResultArray[BIArrayIndex] = - pResultArray[BIArrayIndex] - - pTempArray[BIArrayIndex] - - Carry; - Carry = 0; - } /* End of if */ - } else { - if (pResultArray[BIArrayIndex] >= Carry) { - pResultArray[BIArrayIndex] -= Carry; - Carry = 0; - break; - } else { - pResultArray[BIArrayIndex] = - 0xffffffffUL; - Carry = 1; - } /* End of if */ - } /* End of if */ - } /* End of for */ - - if (((pFirstOperand->Signed == 1) & - (pSecondOperand->Signed == 1) & (CompareResult == -1)) || - ((pFirstOperand->Signed == -1) & - (pSecondOperand->Signed == -1) & (CompareResult == 1))) - (*pBI_Result)->Signed = -1; - - BigInteger_ClearHighBits(*pBI_Result); - } else { - PBIG_INTEGER pTempBI = NULL; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[7]); - GET_BI_INS_FROM_POOL(pTempBI); - BigInteger_Init(&pTempBI); - - if ((pFirstOperand->Signed == 1) & - (pSecondOperand->Signed == -1)) { - BigInteger_Copy(pSecondOperand, &pTempBI); - pTempBI->Signed = 1; - BigInteger_Add(pFirstOperand, pTempBI, pBI_Result); - } else if ((pFirstOperand->Signed == -1) & - (pSecondOperand->Signed == 1)) { - BigInteger_Copy(pFirstOperand, &pTempBI); - pTempBI->Signed = 1; - BigInteger_Add(pTempBI, pSecondOperand, pBI_Result); - (*pBI_Result)->Signed = -1; - } /* End of if */ - - release_temporal_usage_big_interger(&pTempBI); - POOL_COUNTER_CHECK_END(expected_cnt[7]); - } /* End of if */ - -#ifdef BI_TIME_REC - - if (is_time_rec) { - ULONG time_interval = 0; - do_gettimeofday(&t2); - - if (t1.tv_usec > t2.tv_usec) - time_interval = (t2.tv_sec - t1.tv_sec) * 1000000 - - t1.tv_usec + t2.tv_usec; - else - time_interval = t2.tv_usec - t1.tv_usec; - - BigInteger_record_time_ns(&bi_op_ti_rec.sub_op, time_interval); - is_sub_alloc_rec = FALSE; - } - -#endif -} /* End of BigInteger_Sub */ - -VOID BigInteger_Mul(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result) -{ - UINT32 BIFirstIndex, BISecondIndex; - UINT64 FirstValue, SecondValue, Sum, Carry; -#ifdef BI_TIME_REC - struct timeval t1; - struct timeval t2; -#endif - - if ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL) || - (pSecondOperand == NULL) || - (pSecondOperand->pIntegerArray == NULL)) { - DEBUGPRINT( - "BigInteger_Mul: first or second operand is NULL.\n"); - return; - } /* End of if */ - -#ifdef BI_TIME_REC - if (is_time_rec) { - do_gettimeofday(&t1); - is_mul_alloc_rec = TRUE; - } -#endif - - /* The first or second operand is zero */ - if (((pFirstOperand->IntegerLength == 1) && - (pFirstOperand->pIntegerArray[0] == 0)) || - ((pSecondOperand->IntegerLength == 1) && - (pSecondOperand->pIntegerArray[0] == 0))) { - BigInteger_AllocSize(pBI_Result, 1); - goto output; - } /* End of if */ - - /* The first or second operand is one */ - if ((pFirstOperand->IntegerLength == 1) && - (pFirstOperand->pIntegerArray[0] == 1)) { - BigInteger_Copy(pSecondOperand, pBI_Result); - goto output; - } /* End of if */ - - if ((pSecondOperand->IntegerLength == 1) && - (pSecondOperand->pIntegerArray[0] == 1)) { - BigInteger_Copy(pFirstOperand, pBI_Result); - goto output; - } /* End of if */ - - BigInteger_AllocSize(pBI_Result, pFirstOperand->IntegerLength + - pSecondOperand->IntegerLength); - - for (BIFirstIndex = 0; BIFirstIndex < pFirstOperand->ArrayLength; - BIFirstIndex++) { - Carry = 0; - FirstValue = (UINT64)pFirstOperand->pIntegerArray[BIFirstIndex]; - - if (FirstValue == 0) - continue; - else { - for (BISecondIndex = 0; - BISecondIndex < pSecondOperand->ArrayLength; - BISecondIndex++) { - SecondValue = - ((UINT64)pSecondOperand - ->pIntegerArray[BISecondIndex]) * - FirstValue; - Sum = (UINT64)((*pBI_Result) - ->pIntegerArray - [BIFirstIndex + - BISecondIndex] + - SecondValue + Carry); - Carry = Sum >> 32; - (*pBI_Result) - ->pIntegerArray[BIFirstIndex + - BISecondIndex] = - (UINT32)(Sum & 0xffffffffUL); - } /* End of for */ - - while (Carry != 0) { - Sum = (UINT64)(*pBI_Result) - ->pIntegerArray[BIFirstIndex + - BISecondIndex]; - Sum += Carry; - Carry = Sum >> 32; - (*pBI_Result) - ->pIntegerArray[BIFirstIndex + - BISecondIndex] = - (UINT32)(Sum & 0xffffffffUL); - BISecondIndex++; - } /* End of while */ - } /* End of if */ - } /* End of for */ - -output: - (*pBI_Result)->Signed = pFirstOperand->Signed * pSecondOperand->Signed; - BigInteger_ClearHighBits(*pBI_Result); -#ifdef BI_TIME_REC - - if (is_time_rec) { - ULONG time_interval = 0; - do_gettimeofday(&t2); - - if (t1.tv_usec > t2.tv_usec) - time_interval = (t2.tv_sec - t1.tv_sec) * 1000000 - - t1.tv_usec + t2.tv_usec; - else - time_interval = t2.tv_usec - t1.tv_usec; - - BigInteger_record_time_ns(&bi_op_ti_rec.mul_op, time_interval); - is_mul_alloc_rec = FALSE; - } - -#endif -} /* End of BigInteger_Mul */ - -VOID BigInteger_Square(IN PBIG_INTEGER pBI, OUT PBIG_INTEGER *pBI_Result) -{ - INT BIFirstIndex, BISecondIndex; - UINT32 HBITS_Value, LBITS_Value, Temp1_Value, Temp2_Value, Carry32; - UINT32 *Point_Of_S, *Point_Of_Result, *Point_Of_BI; - UINT64 Result64_1, Result64_2, Carry64, TempValue64; -#ifdef BI_TIME_REC - struct timeval t1; - struct timeval t2; -#endif - - if ((pBI == NULL) || (pBI->pIntegerArray == NULL)) { - DEBUGPRINT("\tBigInteger_Square: the operand is NULL.\n"); - return; - } /* End of if */ - -#ifdef BI_TIME_REC - - if (is_time_rec) - do_gettimeofday(&t1); - -#endif - - /* The operand is zero */ - if ((pBI->IntegerLength == 1) && (pBI->pIntegerArray[0] == 0)) { - BigInteger_AllocSize(pBI_Result, 1); - goto output; - } /* End of if */ - - BigInteger_AllocSize(pBI_Result, (pBI->IntegerLength * 2) + 20); - BigInteger_AllocSize(&pBI_S, (pBI->IntegerLength * 2) + 20); - BigInteger_AllocSize(&pBI_O, (pBI->IntegerLength * 2) + 20); - /* - * Input: pBI = {a_0, a_1, a_2, a_3, ..., a_n} - * Step1. calculate a_0^2, a_1^2, a_2^2, a_3^2 ... a_n^2 - */ - Point_Of_S = pBI_S->pIntegerArray; - - for (BIFirstIndex = 0; BIFirstIndex < pBI->ArrayLength; - BIFirstIndex++) { - HBITS_Value = UINT32_HBITS(pBI->pIntegerArray[BIFirstIndex]); - LBITS_Value = UINT32_LBITS(pBI->pIntegerArray[BIFirstIndex]); - Temp1_Value = HBITS_Value * LBITS_Value; - Temp2_Value = (Temp1_Value & 0x7fff) << 0x11; - Point_Of_S[0] = (LBITS_Value * LBITS_Value) + Temp2_Value; - Point_Of_S[1] = (HBITS_Value * HBITS_Value) + - ((Temp1_Value >> 0xf) & 0x1ffff); - - if (Point_Of_S[0] < Temp2_Value) - Point_Of_S[1] += 1; - - Point_Of_S += 2; - } /* End of for */ - - /* - * Step2. calculate a_0*{a_1, a_2, a_3, a_4, ..., a_n} - */ - Point_Of_BI = pBI->pIntegerArray; - Point_Of_Result = (*pBI_Result)->pIntegerArray; - Point_Of_Result[0] = 0; - TempValue64 = (UINT64)Point_Of_BI[0]; - Point_Of_Result++; - Carry64 = 0; - - for (BIFirstIndex = 1; BIFirstIndex < pBI->ArrayLength; - BIFirstIndex++) { - Result64_1 = (UINT64)Point_Of_BI[BIFirstIndex] * TempValue64; - Result64_1 += Carry64; - Carry64 = (Result64_1 >> 32); - Point_Of_Result[0] = (UINT32)(Result64_1 & 0xffffffffUL); - Point_Of_Result++; - } /* End of for */ - - if (Carry64 > 0) - Point_Of_Result[0] = (UINT32)(Carry64 & 0xffffffffUL); - - /* - * Step3. calculate - * a_1*{a_2, a_3, a_4, ..., a_n} - * a_2*{a_3, a_4, a_5, ..., a_n} - * a_3*{a_4, a_5, a_6, ..., a_n} - * a_4*{a_5, a_6, a_7, ..., a_n} - * ... - * a_n-1*{a_n} - */ - Point_Of_BI = pBI->pIntegerArray; - - for (BIFirstIndex = 1; BIFirstIndex < (pBI->ArrayLength - 1); - BIFirstIndex++) { - Point_Of_Result = (*pBI_Result)->pIntegerArray; - Point_Of_Result += (BIFirstIndex * 2) + 1; - TempValue64 = (UINT64)Point_Of_BI[BIFirstIndex]; - Carry64 = 0; - - for (BISecondIndex = (BIFirstIndex + 1); - BISecondIndex < pBI->ArrayLength; BISecondIndex++) { - Result64_1 = ((UINT64)Point_Of_Result[0]) + Carry64; - Result64_2 = (UINT64)Point_Of_BI[BISecondIndex] * - TempValue64; - Carry64 = (Result64_1 >> 32); - Result64_1 = (Result64_1 & 0xffffffffUL); - Result64_1 = Result64_1 + Result64_2; - Carry64 += (Result64_1 >> 32); - Point_Of_Result[0] = - (UINT32)(Result64_1 & 0xffffffffUL); - Point_Of_Result++; - } /* End of for */ - - if (Carry64 > 0) - Point_Of_Result[0] += (UINT32)(Carry64 & 0xffffffffUL); - } /* End of for */ - - BigInteger_ClearHighBits(*pBI_Result); - BigInteger_Copy(*pBI_Result, &pBI_O); - Carry32 = 0; - - for (BIFirstIndex = 0; BIFirstIndex < pBI_O->ArrayLength; - BIFirstIndex++) { - pBI_O->pIntegerArray[BIFirstIndex] = - (pBI_O->pIntegerArray[BIFirstIndex] << 1) | Carry32; - - if (pBI_O->pIntegerArray[BIFirstIndex] < - (*pBI_Result)->pIntegerArray[BIFirstIndex]) - Carry32 = 1; - else - Carry32 = 0; - } /* End of for */ - - pBI_O->pIntegerArray[BIFirstIndex] = Carry32; - pBI_O->IntegerLength++; - pBI_O->ArrayLength++; - BigInteger_ClearHighBits(pBI_O); - BigInteger_Add(pBI_O, pBI_S, pBI_Result); -output: - (*pBI_Result)->Signed = 1; - BigInteger_ClearHighBits(*pBI_Result); - BigInteger_Free(&pBI_O); - BigInteger_Free(&pBI_S); -#ifdef BI_TIME_REC - - if (is_time_rec) { - ULONG time_interval = 0; - do_gettimeofday(&t2); - - if (t1.tv_usec > t2.tv_usec) - time_interval = (t2.tv_sec - t1.tv_sec) * 1000000 - - t1.tv_usec + t2.tv_usec; - else - time_interval = t2.tv_usec - t1.tv_usec; - - BigInteger_record_time_ns(&bi_op_ti_rec.square_op, - time_interval); - } - -#endif -} /* End of BigInteger_Square */ - -VOID BigInteger_Div(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Result, - OUT PBIG_INTEGER *pBI_Remainder) -{ - INT CompareResult; - INT Index, MulIndex, ComputeSize; - UINT32 MulLoopStart, MulLoopEnd; - UINT AllocLength, ArrayIndex, ShiftIndex; - UINT8 SecondHighByte; -#ifdef BI_TIME_REC - struct timeval t1; - struct timeval t2; -#endif - PBIG_INTEGER pTempBI = NULL; - PBIG_INTEGER pTempBI2 = NULL; - PBIG_INTEGER pMulBI = NULL; -#ifdef BI_TIME_REC - - if (is_time_rec) { - do_gettimeofday(&t1); - is_div_alloc_rec = TRUE; - } - -#endif - - if ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL) || - (pSecondOperand == NULL) || - (pSecondOperand->pIntegerArray == NULL)) { - DEBUGPRINT( - "BigInteger_Div: first or second operand is NULL.\n"); - return; - } /* End of if */ - - /* The second operand is zero */ - if ((pSecondOperand->IntegerLength == 1) && - (pSecondOperand->pIntegerArray[0] == 0)) { - DEBUGPRINT("BigInteger_Div: second operand is zero.\n"); - return; - } /* End of if */ - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[16]); - GET_BI_INS_FROM_POOL(pTempBI); - GET_BI_INS_FROM_POOL(pTempBI2); - GET_BI_INS_FROM_POOL(pMulBI); - - if (*pBI_Result == NULL) - BigInteger_Init(pBI_Result); - - if (*pBI_Remainder == NULL) - BigInteger_Init(pBI_Remainder); - - /* The second operand is one */ - if ((pSecondOperand->IntegerLength == 1) && - (pSecondOperand->pIntegerArray[0] == 1)) { - BigInteger_Copy(pFirstOperand, pBI_Result); - BigInteger_Bin2BI(Value_0, 1, pBI_Remainder); - goto output; - } /* End of if */ - - CompareResult = - BigInteger_UnsignedCompare(pFirstOperand, pSecondOperand); - - if (CompareResult == 0) { - BigInteger_Bin2BI(Value_1, 1, pBI_Result); - BigInteger_Bin2BI(Value_0, 1, pBI_Remainder); - goto output; - } else if (CompareResult == -1) { - BigInteger_Bin2BI(Value_0, 1, pBI_Result); - BigInteger_Copy(pFirstOperand, pBI_Remainder); - goto output; - } /* End of if */ - - BigInteger_AllocSize(pBI_Result, pFirstOperand->IntegerLength - - pSecondOperand->IntegerLength + - 1); - BigInteger_AllocSize(pBI_Remainder, pSecondOperand->IntegerLength); - AllocLength = (UINT)(pFirstOperand->IntegerLength << 1); - BigInteger_AllocSize(&pTempBI, AllocLength); - BigInteger_AllocSize(&pTempBI2, AllocLength); - BigInteger_Copy(pFirstOperand, pBI_Remainder); - SecondHighByte = - (BigInteger_GetByteValue(pSecondOperand, - pSecondOperand->IntegerLength) & - 0xFF); - ComputeSize = (INT)pFirstOperand->IntegerLength - - pSecondOperand->IntegerLength + 1; - - for (Index = (INT)ComputeSize; Index >= 0; Index--) { - if (BigInteger_UnsignedCompare(*pBI_Remainder, - pSecondOperand) == -1) - break; - - if (((pSecondOperand->IntegerLength + Index) - - (*pBI_Remainder)->IntegerLength) <= 1) { - BigInteger_AllocSize(&pMulBI, Index + 1); - ArrayIndex = 0; - - if (Index > 0) - ArrayIndex = (UINT)(Index - 1) >> 2; - - ShiftIndex = (Index & 0x03); - - if (ShiftIndex == 0) - ShiftIndex = 4; - - ShiftIndex--; - MulLoopStart = - (BigInteger_GetByteValue( - (*pBI_Remainder), - pFirstOperand->IntegerLength + Index - - ComputeSize + 1) & - 0xFF) - << 8; - MulLoopStart = MulLoopStart | - (BigInteger_GetByteValue( - (*pBI_Remainder), - pFirstOperand->IntegerLength + - Index - ComputeSize) & - 0xFF); - - if (MulLoopStart < (UINT32)SecondHighByte) - continue; - - if (SecondHighByte) - MulLoopEnd = (MulLoopStart / - (UINT32)SecondHighByte) + - 1; - else - MulLoopEnd = 1; - MulLoopStart = - MulLoopStart / (UINT32)(SecondHighByte + 1); - - for (MulIndex = (INT)MulLoopStart; - MulIndex <= MulLoopEnd; - MulIndex++) { /* 0xFFFF / 0x01 = 0xFFFF */ - NdisZeroMemory(pMulBI->pIntegerArray, - pMulBI->AllocSize); - - if ((MulIndex > 0xff) && (ShiftIndex == 3)) { - pMulBI->pIntegerArray[ArrayIndex] = - ((UINT)(MulIndex & 0xff) - << (8 * ShiftIndex)); - pMulBI->pIntegerArray[ArrayIndex + 1] = - (UINT)(MulIndex >> 8) & 0xff; - } else - pMulBI->pIntegerArray[ArrayIndex] = - ((UINT)(MulIndex) - << (8 * ShiftIndex)); - - /* BigInteger_ClearHighBits(pMulBI); */ - BigInteger_Mul(pSecondOperand, pMulBI, - &pTempBI); - CompareResult = BigInteger_UnsignedCompare( - *pBI_Remainder, pTempBI); - - if (CompareResult < 1) { - if (CompareResult == -1) { - MulIndex = MulIndex - 1; - BigInteger_AllocSize(&pMulBI, - Index + 1); - NdisZeroMemory( - pMulBI->pIntegerArray, - pMulBI->AllocSize); - - if ((MulIndex > 0xff) && - (ShiftIndex == 3)) { - pMulBI->pIntegerArray - [ArrayIndex] = - ((UINT)(MulIndex & - 0xff) - << (8 * - ShiftIndex)); - pMulBI->pIntegerArray - [ArrayIndex + 1] = - (UINT)(MulIndex >> - 8) & - 0xff; - } else - pMulBI->pIntegerArray - [ArrayIndex] = - ((UINT)(MulIndex) - << (8 * - ShiftIndex)); - - BigInteger_Mul(pSecondOperand, - pMulBI, - &pTempBI); - } - - BigInteger_Sub(*pBI_Remainder, pTempBI, - &pTempBI2); - BigInteger_Copy(pTempBI2, - pBI_Remainder); - BigInteger_Add(*pBI_Result, pMulBI, - &pTempBI2); - BigInteger_Copy(pTempBI2, pBI_Result); - break; - } /* End of if */ - } /* End of for */ - } /* End of if */ - } /* End of for */ - -output: - (*pBI_Result)->Signed = pFirstOperand->Signed * pSecondOperand->Signed; - (*pBI_Remainder)->Signed = - pFirstOperand->Signed * pSecondOperand->Signed; - BigInteger_ClearHighBits(*pBI_Result); - BigInteger_ClearHighBits(*pBI_Remainder); - release_temporal_usage_big_interger(&pTempBI); - release_temporal_usage_big_interger(&pTempBI2); - release_temporal_usage_big_interger(&pMulBI); - POOL_COUNTER_CHECK_END(expected_cnt[16]); -#ifdef BI_TIME_REC - - if (is_time_rec) { - ULONG time_interval = 0; - do_gettimeofday(&t2); - - if (t1.tv_usec > t2.tv_usec) - time_interval = (t2.tv_sec - t1.tv_sec) * 1000000 - - t1.tv_usec + t2.tv_usec; - else - time_interval = t2.tv_usec - t1.tv_usec; - - BigInteger_record_time_ns(&bi_op_ti_rec.div_op, time_interval); - is_div_alloc_rec = FALSE; - } - -#endif -} /* End of BigInteger_Div */ - -#ifdef WSC_INCLUDED -static UINT8 WPS_DH_PInverse_VALUE[192] = { - 0xd9, 0xc7, 0xd8, 0x95, 0xed, 0x5a, 0xa0, 0xac, 0xa4, 0xb4, 0xbc, 0x87, - 0x43, 0x7d, 0x88, 0x13, 0x0f, 0xce, 0xd9, 0xcc, 0x8f, 0x13, 0x84, 0x81, - 0xf5, 0x32, 0x2b, 0x5c, 0xfd, 0x0b, 0x7b, 0xd7, 0x22, 0x57, 0x31, 0xdb, - 0xb9, 0x2e, 0x86, 0x4c, 0xab, 0xa2, 0x74, 0xbb, 0x68, 0x04, 0xd4, 0x4f, - 0x32, 0x46, 0xbb, 0xae, 0x44, 0x6d, 0xfb, 0xdf, 0x7b, 0x2c, 0xaa, 0x2f, - 0x7f, 0xfb, 0xa3, 0x2d, 0xa3, 0x88, 0x05, 0x0d, 0xbc, 0xd5, 0xe5, 0xac, - 0xcb, 0x79, 0xe6, 0xa5, 0xa5, 0x0f, 0x3e, 0xd6, 0x01, 0xe2, 0x38, 0x7b, - 0xfb, 0x98, 0x61, 0x69, 0x01, 0xaa, 0x42, 0xec, 0xcd, 0x35, 0xc5, 0x13, - 0x0d, 0x4d, 0xd6, 0x0b, 0x30, 0x93, 0x4a, 0xd4, 0x7b, 0xb1, 0x12, 0xfa, - 0xe1, 0x78, 0x10, 0xca, 0x67, 0x6e, 0xc3, 0xcc, 0x40, 0xb6, 0xa9, 0x05, - 0x74, 0x5e, 0xf2, 0x05, 0xa8, 0xf0, 0x90, 0x88, 0x5f, 0xee, 0x48, 0xe1, - 0xfb, 0x0a, 0xae, 0x62, 0xcf, 0x9d, 0xe9, 0x4f, 0x4d, 0x2f, 0x59, 0x54, - 0x7f, 0x2e, 0xaf, 0x68, 0xe7, 0xe8, 0x23, 0xa3, 0x21, 0x21, 0x56, 0x15, - 0x96, 0x31, 0x09, 0xb9, 0x1a, 0xf2, 0x5b, 0x38, 0x6a, 0x3c, 0x43, 0x7a, - 0x3e, 0x49, 0x1e, 0x72, 0x1b, 0x79, 0x8e, 0x44, 0xf1, 0x74, 0x6c, 0x08, - 0xca, 0x23, 0x73, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -}; -#endif - -static VOID BigInteger_Inverse(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pFirstInverse, - OUT PBIG_INTEGER *pSecondInverse) -{ - PBIG_INTEGER pBI_A = NULL, pBI_B = NULL; - PBIG_INTEGER pBI_X = NULL, pBI_X1 = NULL, pBI_X2 = NULL; - PBIG_INTEGER pBI_Y = NULL, pBI_Y1 = NULL, pBI_Y2 = NULL; - PBIG_INTEGER pBI_Q = NULL, pBI_R = NULL; - PBIG_INTEGER pBI_Temp = NULL; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[15]); - GET_BI_INS_FROM_POOL(pBI_A); - GET_BI_INS_FROM_POOL(pBI_B); - GET_BI_INS_FROM_POOL(pBI_X); - GET_BI_INS_FROM_POOL(pBI_X1); - GET_BI_INS_FROM_POOL(pBI_X2); - GET_BI_INS_FROM_POOL(pBI_Y); - GET_BI_INS_FROM_POOL(pBI_Y1); - GET_BI_INS_FROM_POOL(pBI_Y2); - GET_BI_INS_FROM_POOL(pBI_Q); - GET_BI_INS_FROM_POOL(pBI_R); - GET_BI_INS_FROM_POOL(pBI_Temp); - BigInteger_Init(&pBI_A); - BigInteger_Init(&pBI_B); - BigInteger_Init(&pBI_X); - BigInteger_Init(&pBI_X1); - BigInteger_Init(&pBI_X2); - BigInteger_Init(&pBI_Y); - BigInteger_Init(&pBI_Y1); - BigInteger_Init(&pBI_Y2); - BigInteger_Init(&pBI_Q); - BigInteger_Init(&pBI_R); - BigInteger_Init(&pBI_Temp); - BigInteger_Copy(pFirstOperand, &pBI_A); - BigInteger_Copy(pSecondOperand, &pBI_B); - BigInteger_AllocSize(&pBI_Q, 1); - BigInteger_AllocSize(&pBI_R, 1); - BigInteger_AllocSize(&pBI_X, 1); - BigInteger_AllocSize(&pBI_Y, 1); - BigInteger_AllocSize(&pBI_X2, 1); - BigInteger_AllocSize(&pBI_X1, 1); - BigInteger_AllocSize(&pBI_Y2, 1); - BigInteger_AllocSize(&pBI_Y1, 1); - pBI_X2->pIntegerArray[0] = 0x1; - pBI_Y1->pIntegerArray[0] = 0x1; - - while (((pBI_B->IntegerLength > 1) || - ((pBI_B->IntegerLength == 1) && - (pBI_B->pIntegerArray[0] > 0))) && - (pBI_B->Signed == 1)) { - BigInteger_Div(pBI_A, pBI_B, &pBI_Q, &pBI_R); - BigInteger_Mul(pBI_Q, pBI_X1, &pBI_Temp); - BigInteger_Sub(pBI_X2, pBI_Temp, &pBI_X); - BigInteger_Mul(pBI_Q, pBI_Y1, &pBI_Temp); - BigInteger_Sub(pBI_Y2, pBI_Temp, &pBI_Y); - BigInteger_Copy(pBI_B, &pBI_A); - BigInteger_Copy(pBI_R, &pBI_B); - BigInteger_Copy(pBI_X1, &pBI_X2); - BigInteger_Copy(pBI_X, &pBI_X1); - BigInteger_Copy(pBI_Y1, &pBI_Y2); - BigInteger_Copy(pBI_Y, &pBI_Y1); - } /* End of while */ - - if (((pBI_X2->IntegerLength > 1) || ((pBI_X2->IntegerLength == 1) && - (pBI_X2->pIntegerArray[0] > 0))) && - (pBI_X2->Signed == -1)) { - BigInteger_Add(pSecondOperand, pBI_X2, &pBI_Temp); - BigInteger_Copy(pBI_Temp, &pBI_X2); - BigInteger_Sub(pFirstOperand, pBI_Y2, &pBI_Temp); - BigInteger_Copy(pBI_Temp, &pBI_Y2); - } /* End of if */ - - if (((pBI_Y2->IntegerLength > 1) || ((pBI_Y2->IntegerLength == 1) && - (pBI_Y2->pIntegerArray[0] > 0))) && - (pBI_Y2->Signed == -1)) - pBI_Y2->Signed = 1; /* End of if */ - - BigInteger_Copy(pBI_X2, pFirstInverse); - BigInteger_Copy(pBI_Y2, pSecondInverse); - release_temporal_usage_big_interger(&pBI_A); - release_temporal_usage_big_interger(&pBI_B); - release_temporal_usage_big_interger(&pBI_X); - release_temporal_usage_big_interger(&pBI_X1); - release_temporal_usage_big_interger(&pBI_X2); - release_temporal_usage_big_interger(&pBI_Y); - release_temporal_usage_big_interger(&pBI_Y1); - release_temporal_usage_big_interger(&pBI_Y2); - release_temporal_usage_big_interger(&pBI_Q); - release_temporal_usage_big_interger(&pBI_R); - release_temporal_usage_big_interger(&pBI_Temp); - POOL_COUNTER_CHECK_END(expected_cnt[15]); -} /* End of BigInteger_Inverse */ - -static VOID BigInteger_Div2Exponent(IN PBIG_INTEGER pBI, IN UINT Exponent, - OUT PBIG_INTEGER *pBI_Result, - OUT PBIG_INTEGER *pBI_Remainder) -{ - UINT Bites_Of_BI, Bits_Of_Result, Bits_Of_Remainder; - UINT ResultLength, ResultArrayIndex, ResultShiftIndex; - UINT RemainderLength, RemainderArrayIndex, RemainderShiftIndex; - UINT BIArrayIndex, ShiftIndex; - UINT ReadShift = 0, WriteShift = 0, ReadBits = 0; - UINT32 Value, TempValue; - - if (pBI == NULL) { - DEBUGPRINT("BigInteger_Div2Exponent: pBI is NUll\n"); - (*pBI_Result) = NULL; - return; - } /* End of if */ - - BigInteger_BitsOfBI(pBI, &Bites_Of_BI); - - if (Bites_Of_BI < Exponent) { - BigInteger_Bin2BI(Value_0, 1, pBI_Result); - BigInteger_Copy(pBI, pBI_Remainder); - return; - } /* End of if */ - - Bits_Of_Result = Bites_Of_BI - Exponent + 1; - ResultLength = Bits_Of_Result >> 0x3L; - - if ((Bits_Of_Result & 0x7) > 0) - ResultLength++; - - BigInteger_AllocSize(pBI_Result, ResultLength); - - ResultShiftIndex = Bits_Of_Result & 0x1FL; - if (ResultShiftIndex == 0) - ResultShiftIndex = 32; - - ResultArrayIndex = (*pBI_Result)->ArrayLength - 1; - Bits_Of_Remainder = Exponent - 1; - RemainderLength = Bits_Of_Remainder >> 0x3L; - - if ((Bits_Of_Remainder & 0x7) > 0) - RemainderLength++; - - BigInteger_AllocSize(pBI_Remainder, RemainderLength); - - RemainderShiftIndex = Bits_Of_Remainder & 0x1FL; - if (RemainderShiftIndex == 0) - RemainderShiftIndex = 32; - - RemainderArrayIndex = (*pBI_Remainder)->ArrayLength - 1; - - ShiftIndex = Bites_Of_BI & 0x1FL; - if (ShiftIndex == 0) - ShiftIndex = 32; - - BIArrayIndex = pBI->ArrayLength - 1; - Value = 0; - - while (Bits_Of_Result > 0) { - if ((ResultShiftIndex >= ShiftIndex) && - (ShiftIndex <= Bits_Of_Result)) { - ReadShift = 0; - WriteShift = ResultShiftIndex - ShiftIndex; - ReadBits = ShiftIndex; - } else if ((ResultShiftIndex < ShiftIndex) && - (ResultShiftIndex <= Bits_Of_Result)) { - ReadShift = ShiftIndex - ResultShiftIndex; - WriteShift = 0; - ReadBits = ResultShiftIndex; - } else if ((ResultShiftIndex > Bits_Of_Result) && - (ShiftIndex > Bits_Of_Result)) { - ReadShift = ShiftIndex - Bits_Of_Result; - WriteShift = ResultShiftIndex - Bits_Of_Result; - ReadBits = Bits_Of_Result; - } /* End of if */ - - TempValue = (UINT32)((pBI->pIntegerArray[BIArrayIndex] & - (0xFFFFFFFFL >> (32 - ShiftIndex))) >> - ReadShift); - Value = Value | (TempValue << WriteShift); - ResultShiftIndex -= ReadBits; - ShiftIndex -= ReadBits; - Bits_Of_Result -= ReadBits; - - if (ResultShiftIndex == 0) { - (*pBI_Result)->pIntegerArray[ResultArrayIndex] = Value; - ResultShiftIndex = 32; - ResultArrayIndex--; - Value = 0; - } /* End of if */ - - if (ShiftIndex == 0) { - ShiftIndex = 32; - BIArrayIndex--; - } /* End of if */ - } /* End of while */ - - if (ResultShiftIndex != 32) - (*pBI_Result)->pIntegerArray[ResultArrayIndex] = Value; - - Value = 0; - - while (Bits_Of_Remainder > 0) { - if ((RemainderShiftIndex >= ShiftIndex) && - (ShiftIndex <= Bits_Of_Remainder)) { - ReadShift = 0; - WriteShift = RemainderShiftIndex - ShiftIndex; - ReadBits = ShiftIndex; - } else if ((RemainderShiftIndex < ShiftIndex) && - (RemainderShiftIndex <= Bits_Of_Remainder)) { - ReadShift = ShiftIndex - RemainderShiftIndex; - WriteShift = 0; - ReadBits = RemainderShiftIndex; - } else if ((RemainderShiftIndex > Bits_Of_Remainder) && - (ShiftIndex > Bits_Of_Remainder)) { - ReadShift = ShiftIndex - Bits_Of_Remainder; - WriteShift = RemainderShiftIndex - Bits_Of_Remainder; - ReadBits = Bits_Of_Remainder; - } /* End of if */ - - TempValue = (UINT32)((pBI->pIntegerArray[BIArrayIndex] & - (0xFFFFFFFFL >> (32 - ShiftIndex))) >> - ReadShift); - Value = Value | (TempValue << WriteShift); - RemainderShiftIndex -= ReadBits; - ShiftIndex -= ReadBits; - Bits_Of_Remainder -= ReadBits; - - if (RemainderShiftIndex == 0) { - (*pBI_Remainder)->pIntegerArray[RemainderArrayIndex] = - Value; - RemainderShiftIndex = 32; - RemainderArrayIndex--; - Value = 0; - } /* End of if */ - - if (ShiftIndex == 0) { - ShiftIndex = 32; - BIArrayIndex--; - } /* End of if */ - } /* End of while */ - - if (RemainderShiftIndex != 32) - (*pBI_Remainder)->pIntegerArray[RemainderArrayIndex] = Value; - - (*pBI_Result)->Signed = pBI->Signed; - (*pBI_Remainder)->Signed = pBI->Signed; - BigInteger_ClearHighBits(*pBI_Result); - BigInteger_ClearHighBits(*pBI_Remainder); -} /* End of BigInteger_Div2Exponent */ - -static VOID BigInteger_Square2(IN PBIG_INTEGER pBI, - OUT PBIG_INTEGER *pBI_Result) -{ - INT BIFirstIndex, BISecondIndex; - UINT32 HBITS_Value, LBITS_Value, Temp1_Value, Temp2_Value, Carry32; - UINT32 *Point_Of_S, *Point_Of_Result, *Point_Of_BI; - UINT64 Result64_1, Result64_2, Carry64, TempValue64; - PBIG_INTEGER pBI_Square_1 = NULL; - PBIG_INTEGER pBI_Square_2 = NULL; - - if ((pBI == NULL) || (pBI->pIntegerArray == NULL)) { - DEBUGPRINT("\tBigInteger_Square: the operand is NULL.\n"); - return; - } /* End of if */ - - /* The operand is zero */ - if ((pBI->IntegerLength == 1) && (pBI->pIntegerArray[0] == 0)) { - BigInteger_AllocSize(pBI_Result, 1); - goto output; - } /* End of if */ - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[19]); - GET_BI_INS_FROM_POOL(pBI_Square_1); - GET_BI_INS_FROM_POOL(pBI_Square_2); - BigInteger_AllocSize(pBI_Result, (pBI->IntegerLength * 2) + 20); - BigInteger_AllocSize(&pBI_Square_1, (pBI->IntegerLength * 2) + 20); - BigInteger_AllocSize(&pBI_Square_2, (pBI->IntegerLength * 2) + 20); - /* - * Input: pBI = {a_0, a_1, a_2, a_3, ..., a_n} - * Step1. calculate a_0^2, a_1^2, a_2^2, a_3^2 ... a_n^2 - */ - Point_Of_S = pBI_Square_2->pIntegerArray; - - for (BIFirstIndex = 0; BIFirstIndex < pBI->ArrayLength; - BIFirstIndex++) { - HBITS_Value = UINT32_HBITS(pBI->pIntegerArray[BIFirstIndex]); - LBITS_Value = UINT32_LBITS(pBI->pIntegerArray[BIFirstIndex]); - Temp1_Value = HBITS_Value * LBITS_Value; - Temp2_Value = (Temp1_Value & 0x7fff) << 0x11; - Point_Of_S[0] = (LBITS_Value * LBITS_Value) + Temp2_Value; - Point_Of_S[1] = (HBITS_Value * HBITS_Value) + - ((Temp1_Value >> 0xf) & 0x1ffff); - - if (Point_Of_S[0] < Temp2_Value) - Point_Of_S[1] += 1; - - Point_Of_S += 2; - } /* End of for */ - - /* - * Step2. calculate a_0*{a_1, a_2, a_3, a_4, ..., a_n} - */ - Point_Of_BI = pBI->pIntegerArray; - Point_Of_Result = (*pBI_Result)->pIntegerArray; - Point_Of_Result[0] = 0; - TempValue64 = (UINT64)Point_Of_BI[0]; - Point_Of_Result++; - Carry64 = 0; - - for (BIFirstIndex = 1; BIFirstIndex < pBI->ArrayLength; - BIFirstIndex++) { - Result64_1 = (UINT64)Point_Of_BI[BIFirstIndex] * TempValue64; - Result64_1 += Carry64; - Carry64 = (Result64_1 >> 32); - Point_Of_Result[0] = (UINT32)(Result64_1 & 0xffffffffUL); - Point_Of_Result++; - } /* End of for */ - - if (Carry64 > 0) - Point_Of_Result[0] = (UINT32)(Carry64 & 0xffffffffUL); - - /* - * Step3. calculate - * a_1*{a_2, a_3, a_4, ..., a_n} - * a_2*{a_3, a_4, a_5, ..., a_n} - * a_3*{a_4, a_5, a_6, ..., a_n} - * a_4*{a_5, a_6, a_7, ..., a_n} - * ... - * a_n-1*{a_n} - */ - Point_Of_BI = pBI->pIntegerArray; - - for (BIFirstIndex = 1; BIFirstIndex < (pBI->ArrayLength - 1); - BIFirstIndex++) { - Point_Of_Result = (*pBI_Result)->pIntegerArray; - Point_Of_Result += (BIFirstIndex * 2) + 1; - TempValue64 = (UINT64)Point_Of_BI[BIFirstIndex]; - Carry64 = 0; - - for (BISecondIndex = (BIFirstIndex + 1); - BISecondIndex < pBI->ArrayLength; BISecondIndex++) { - Result64_1 = ((UINT64)Point_Of_Result[0]) + Carry64; - Result64_2 = (UINT64)Point_Of_BI[BISecondIndex] * - TempValue64; - Carry64 = (Result64_1 >> 32); - Result64_1 = (Result64_1 & 0xffffffffUL); - Result64_1 = Result64_1 + Result64_2; - Carry64 += (Result64_1 >> 32); - Point_Of_Result[0] = - (UINT32)(Result64_1 & 0xffffffffUL); - Point_Of_Result++; - } /* End of for */ - - if (Carry64 > 0) - Point_Of_Result[0] += (UINT32)(Carry64 & 0xffffffffUL); - } /* End of for */ - - BigInteger_ClearHighBits(*pBI_Result); - BigInteger_Copy(*pBI_Result, &pBI_Square_1); - Carry32 = 0; - - for (BIFirstIndex = 0; BIFirstIndex < pBI_Square_1->ArrayLength; - BIFirstIndex++) { - pBI_Square_1->pIntegerArray[BIFirstIndex] = - (pBI_Square_1->pIntegerArray[BIFirstIndex] << 1) | - Carry32; - - if (pBI_Square_1->pIntegerArray[BIFirstIndex] < - (*pBI_Result)->pIntegerArray[BIFirstIndex]) - Carry32 = 1; - else - Carry32 = 0; - } /* End of for */ - - pBI_Square_1->pIntegerArray[BIFirstIndex] = Carry32; - pBI_Square_1->IntegerLength++; - pBI_Square_1->ArrayLength++; - BigInteger_ClearHighBits(pBI_Square_1); - BigInteger_Add(pBI_Square_1, pBI_Square_2, pBI_Result); - release_temporal_usage_big_interger(&pBI_Square_1); - release_temporal_usage_big_interger(&pBI_Square_2); - POOL_COUNTER_CHECK_END(expected_cnt[19]); -output: - (*pBI_Result)->Signed = 1; - BigInteger_ClearHighBits(*pBI_Result); -} /* End of BigInteger_Square */ - -VOID BigInteger_Montgomery_MulMod(IN PBIG_INTEGER pBI_A, IN PBIG_INTEGER pBI_B, - IN PBIG_INTEGER pBI_P, - IN PBIG_INTEGER pBI_PInverse, - IN UINT Bits_Of_R, - OUT PBIG_INTEGER *pBI_Result) -{ - PBIG_INTEGER pBI_MulMod_1 = NULL; - PBIG_INTEGER pBI_MulMod_2 = NULL; - PBIG_INTEGER pBI_MulMod_3 = NULL; - - if (*pBI_Result == NULL) - BigInteger_Init(pBI_Result); - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[1]); - GET_BI_INS_FROM_POOL(pBI_MulMod_1); - GET_BI_INS_FROM_POOL(pBI_MulMod_2); - GET_BI_INS_FROM_POOL(pBI_MulMod_3); - BigInteger_Mul(pBI_A, pBI_B, &pBI_MulMod_1); - BigInteger_Mul(pBI_MulMod_1, pBI_PInverse, &pBI_MulMod_2); - BigInteger_Div2Exponent(pBI_MulMod_2, Bits_Of_R, pBI_Result, - &pBI_MulMod_3); - BigInteger_Mul(pBI_MulMod_3, pBI_P, pBI_Result); - BigInteger_Add(pBI_MulMod_1, *pBI_Result, &pBI_MulMod_3); - BigInteger_Div2Exponent(pBI_MulMod_3, Bits_Of_R, &pBI_MulMod_2, - pBI_Result); - - if (BigInteger_UnsignedCompare(pBI_MulMod_2, pBI_P) >= 0) - BigInteger_Sub(pBI_MulMod_2, pBI_P, pBI_Result); - else - BigInteger_Copy(pBI_MulMod_2, pBI_Result); - - release_temporal_usage_big_interger(&pBI_MulMod_1); - release_temporal_usage_big_interger(&pBI_MulMod_2); - release_temporal_usage_big_interger(&pBI_MulMod_3); - POOL_COUNTER_CHECK_END(expected_cnt[1]); -} /* End of BigInteger_Montgomery_MulMod */ - -VOID BigInteger_Montgomery_ExpMod(IN PBIG_INTEGER pBI_G, IN PBIG_INTEGER pBI_E, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - UINT Bits_Of_P, Bits_Of_E, Bits_Of_R; - UINT32 Index, AllocLength; - PBIG_INTEGER pBI_Temp1 = NULL, pBI_Temp2 = NULL; - PBIG_INTEGER pBI_A = NULL, pBI_X = NULL, pBI_R = NULL, pBI_1 = NULL, - pBI_PInverse = NULL; - /* For workaround */ - /*if (pBI_P->IntegerLength == 32) { - BigInteger_Montgomery_ExpMod32(pBI_G, pBI_E, pBI_P, pBI_Result); - return; - }*/ - BigInteger_record_time_begin(&bi_op_ti_rec.exp_mod_op); - POOL_COUNTER_CHECK_BEGIN(expected_cnt[18]); - GET_BI_INS_FROM_POOL(pBI_Temp1); - GET_BI_INS_FROM_POOL(pBI_Temp2); - AllocLength = (pBI_G->IntegerLength + pBI_E->IntegerLength + - pBI_P->IntegerLength) + - 50; - BigInteger_AllocSize(&pBI_Temp1, AllocLength); - BigInteger_AllocSize(&pBI_Temp2, AllocLength); - - /* -- For spicial case --- */ - if ((pBI_G->IntegerLength == 1) && (pBI_G->pIntegerArray[0] == 0)) { - BigInteger_Bin2BI(Value_0, 1, pBI_Result); - goto memory_free; - } - - if ((pBI_G->IntegerLength == 1) && (pBI_G->pIntegerArray[0] == 1)) { - BigInteger_Div(pBI_G, pBI_P, &pBI_Temp1, pBI_Result); - goto memory_free; - } - - if ((pBI_E->IntegerLength == 1) && (pBI_E->pIntegerArray[0] == 1)) { - BigInteger_Div(pBI_G, pBI_P, &pBI_Temp1, pBI_Result); - goto memory_free; - } - - if ((pBI_E->IntegerLength == 1) && (pBI_E->pIntegerArray[0] == 2)) { - BigInteger_Square2(pBI_G, &pBI_Temp1); - BigInteger_Div(pBI_Temp1, pBI_P, &pBI_Temp2, pBI_Result); - goto memory_free; - } - - GET_BI_INS_FROM_POOL(pBI_A); - GET_BI_INS_FROM_POOL(pBI_X); - GET_BI_INS_FROM_POOL(pBI_R); - GET_BI_INS_FROM_POOL(pBI_PInverse); - GET_BI_INS_FROM_POOL(pBI_1); - /* ---Main algorithm --- */ - BigInteger_Init(&pBI_A); - BigInteger_Init(&pBI_X); - BigInteger_Init(&pBI_R); - BigInteger_Init(&pBI_PInverse); - BigInteger_Bin2BI(Value_1, 1, &pBI_1); - BigInteger_AllocSize(&pBI_X, AllocLength); -#ifdef WSC_INCLUDED - BigInteger_Bin2BI(WPS_DH_P_VALUE, 192, &pBI_Temp1); - - if (NdisCmpMemory(pBI_P->pIntegerArray, pBI_Temp1->pIntegerArray, - pBI_P->IntegerLength) == 0) { - BigInteger_Bin2BI(WPS_DH_X_VALUE, 184, &pBI_X); - BigInteger_Bin2BI(WPS_DH_R_VALUE, 193, &pBI_R); - BigInteger_Bin2BI(WPS_DH_PInverse_VALUE, 192, &pBI_PInverse); - } else -#endif - { - UINT8 *pRValue = NULL; - BigInteger_BitsOfBI(pBI_P, &Bits_Of_P); - - if ((Bits_Of_P % 8) == 0) - AllocLength = pBI_P->IntegerLength + 1; - else - AllocLength = pBI_P->IntegerLength; - - os_alloc_mem(NULL, (UCHAR **)&pRValue, - sizeof(UINT8) * AllocLength); - NdisZeroMemory(pRValue, sizeof(UINT8) * AllocLength); - pRValue[0] = (UINT8)(1 << (Bits_Of_P & 0x7)); - BigInteger_Bin2BI(pRValue, AllocLength, &pBI_R); - os_free_mem(pRValue); - BigInteger_Inverse( - pBI_R, pBI_P, &pBI_Temp1, - &pBI_PInverse); /* Calculate the inverse of P */ - BigInteger_Div(pBI_R, pBI_P, &pBI_Temp2, - &pBI_X); /* X = 1*R (mod P) */ - } /* End of if */ - - /* A = G*R (mod P) */ - BigInteger_Mul(pBI_G, pBI_R, &pBI_Temp1); - BigInteger_Div(pBI_Temp1, pBI_P, &pBI_Temp2, &pBI_A); - /* Calculate (G^E) * R mod P */ - BigInteger_BitsOfBI(pBI_E, &Bits_Of_E); /* Calculate the bits of E */ - BigInteger_BitsOfBI(pBI_R, &Bits_Of_R); /* Calculate the bits of R */ - - for (Index = Bits_Of_E; Index > 0; Index--) { - BigInteger_Montgomery_MulMod(pBI_X, pBI_X, pBI_P, pBI_PInverse, - Bits_Of_R, &pBI_Temp1); - - if (BigInteger_GetBitValue(pBI_E, Index)) - BigInteger_Montgomery_MulMod(pBI_A, pBI_Temp1, pBI_P, - pBI_PInverse, Bits_Of_R, - &pBI_X); - else - BigInteger_Copy(pBI_Temp1, &pBI_X); /* End of if */ - } /* End of for */ - - BigInteger_Montgomery_MulMod(pBI_X, pBI_1, pBI_P, pBI_PInverse, - Bits_Of_R, pBI_Result); - release_temporal_usage_big_interger(&pBI_A); - release_temporal_usage_big_interger(&pBI_X); - release_temporal_usage_big_interger(&pBI_R); - release_temporal_usage_big_interger(&pBI_PInverse); - release_temporal_usage_big_interger(&pBI_1); -memory_free: - release_temporal_usage_big_interger(&pBI_Temp1); - release_temporal_usage_big_interger(&pBI_Temp2); - POOL_COUNTER_CHECK_END(expected_cnt[18]); - BigInteger_record_time_end(&bi_op_ti_rec.exp_mod_op); -} /* End of BigInteger_Montgomery_ExpMod */ - -VOID BigInteger_Montgomery_MulMod_with_mont(IN PBIG_INTEGER pBI_A, - IN PBIG_INTEGER pBI_B, - IN PBIG_INTEGER pBI_P, - IN MONT_STRUC *mont, - OUT PBIG_INTEGER *pBI_Result) -{ - PBIG_INTEGER pBI_MulMod_1 = NULL; - PBIG_INTEGER pBI_MulMod_2 = NULL; - PBIG_INTEGER pBI_MulMod_3 = NULL; - - if (*pBI_Result == NULL) - BigInteger_Init(pBI_Result); - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[20]); - GET_BI_INS_FROM_POOL(pBI_MulMod_1); - GET_BI_INS_FROM_POOL(pBI_MulMod_2); - GET_BI_INS_FROM_POOL(pBI_MulMod_3); - BigInteger_Mul(pBI_A, pBI_B, &pBI_MulMod_1); - BigInteger_Mul(pBI_MulMod_1, mont->pBI_PInverse, &pBI_MulMod_2); - BigInteger_Div2Exponent(pBI_MulMod_2, mont->Bits_Of_R, pBI_Result, - &pBI_MulMod_3); - BigInteger_Mul(pBI_MulMod_3, pBI_P, pBI_Result); - BigInteger_Add(pBI_MulMod_1, *pBI_Result, &pBI_MulMod_3); - BigInteger_Div2Exponent(pBI_MulMod_3, mont->Bits_Of_R, &pBI_MulMod_2, - pBI_Result); - - if (BigInteger_UnsignedCompare(pBI_MulMod_2, pBI_P) >= 0) - BigInteger_Sub(pBI_MulMod_2, pBI_P, pBI_Result); - else - BigInteger_Copy(pBI_MulMod_2, pBI_Result); - - release_temporal_usage_big_interger(&pBI_MulMod_1); - release_temporal_usage_big_interger(&pBI_MulMod_2); - release_temporal_usage_big_interger(&pBI_MulMod_3); - POOL_COUNTER_CHECK_END(expected_cnt[20]); -} /* End of BigInteger_Montgomery_MulMod */ - -VOID BigInteger_Montgomery_ExpMod_with_mont(IN PBIG_INTEGER pBI_G, - IN PBIG_INTEGER pBI_E, - IN PBIG_INTEGER pBI_P, - IN MONT_STRUC *mont, - OUT PBIG_INTEGER *pBI_Result) -{ - UINT Bits_Of_P, Bits_Of_E, Bits_Of_R; - UINT32 Index, AllocLength; - PBIG_INTEGER pBI_Temp1 = NULL, pBI_Temp2 = NULL; - PBIG_INTEGER pBI_A = NULL, pBI_X = NULL, pBI_R = NULL, pBI_1 = NULL, - pBI_PInverse = NULL; - /* For workaround */ - /*if (pBI_P->IntegerLength == 32) { - BigInteger_Montgomery_ExpMod32(pBI_G, pBI_E, pBI_P, pBI_Result); - return; - }*/ - BigInteger_record_time_begin(&bi_op_ti_rec.exp_mod_op); - POOL_COUNTER_CHECK_BEGIN(expected_cnt[21]); - GET_BI_INS_FROM_POOL(pBI_Temp1); - GET_BI_INS_FROM_POOL(pBI_Temp2); - AllocLength = (pBI_G->IntegerLength + pBI_E->IntegerLength + - pBI_P->IntegerLength) + - 50; - BigInteger_AllocSize(&pBI_Temp1, AllocLength); - BigInteger_AllocSize(&pBI_Temp2, AllocLength); - - /* -- For spicial case --- */ - if ((pBI_G->IntegerLength == 1) && (pBI_G->pIntegerArray[0] == 0)) { - BigInteger_Bin2BI(Value_0, 1, pBI_Result); - goto memory_free; - } - - if ((pBI_G->IntegerLength == 1) && (pBI_G->pIntegerArray[0] == 1)) { - BigInteger_Div(pBI_G, pBI_P, &pBI_Temp1, pBI_Result); - goto memory_free; - } - - if ((pBI_E->IntegerLength == 1) && (pBI_E->pIntegerArray[0] == 1)) { - BigInteger_Div(pBI_G, pBI_P, &pBI_Temp1, pBI_Result); - goto memory_free; - } - - if ((pBI_E->IntegerLength == 1) && (pBI_E->pIntegerArray[0] == 2)) { - BigInteger_Square2(pBI_G, &pBI_Temp1); - BigInteger_Div(pBI_Temp1, pBI_P, &pBI_Temp2, pBI_Result); - goto memory_free; - } - - GET_BI_INS_FROM_POOL(pBI_A); - GET_BI_INS_FROM_POOL(pBI_X); - GET_BI_INS_FROM_POOL(pBI_R); - GET_BI_INS_FROM_POOL(pBI_PInverse); - GET_BI_INS_FROM_POOL(pBI_1); - /* ---Main algorithm --- */ - BigInteger_Init(&pBI_A); - BigInteger_Init(&pBI_X); - BigInteger_Init(&pBI_R); - BigInteger_Init(&pBI_PInverse); - BigInteger_Bin2BI(Value_1, 1, &pBI_1); - BigInteger_AllocSize(&pBI_X, AllocLength); -#ifdef WSC_INCLUDED - BigInteger_Bin2BI(WPS_DH_P_VALUE, 192, &pBI_Temp1); -#endif - if (mont != NULL) { - BigInteger_Copy(mont->pBI_X, &pBI_X); - BigInteger_Copy(mont->pBI_R, &pBI_R); - BigInteger_Copy(mont->pBI_PInverse, &pBI_PInverse); - Bits_Of_R = mont->Bits_Of_R; - } - -#ifdef WSC_INCLUDED - if (NdisCmpMemory(pBI_P->pIntegerArray, pBI_Temp1->pIntegerArray, - pBI_P->IntegerLength) == 0) { - BigInteger_Bin2BI(WPS_DH_X_VALUE, 184, &pBI_X); - BigInteger_Bin2BI(WPS_DH_R_VALUE, 193, &pBI_R); - BigInteger_Bin2BI(WPS_DH_PInverse_VALUE, 192, &pBI_PInverse); - BigInteger_BitsOfBI(pBI_R, - &Bits_Of_R); /* Calculate the bits of R */ - } else -#endif - { - UINT8 *pRValue = NULL; - BigInteger_BitsOfBI(pBI_P, &Bits_Of_P); - - if ((Bits_Of_P % 8) == 0) - AllocLength = pBI_P->IntegerLength + 1; - else - AllocLength = pBI_P->IntegerLength; - - os_alloc_mem(NULL, (UCHAR **)&pRValue, - sizeof(UINT8) * AllocLength); - NdisZeroMemory(pRValue, sizeof(UINT8) * AllocLength); - pRValue[0] = (UINT8)(1 << (Bits_Of_P & 0x7)); - BigInteger_Bin2BI(pRValue, AllocLength, &pBI_R); - os_free_mem(pRValue); - BigInteger_Inverse( - pBI_R, pBI_P, &pBI_Temp1, - &pBI_PInverse); /* Calculate the inverse of P */ - BigInteger_Div(pBI_R, pBI_P, &pBI_Temp2, - &pBI_X); /* X = 1*R (mod P) */ - BigInteger_BitsOfBI(pBI_R, - &Bits_Of_R); /* Calculate the bits of R */ - } /* End of if */ - - /* A = G*R (mod P) */ - BigInteger_Mul(pBI_G, pBI_R, &pBI_Temp1); - BigInteger_Div(pBI_Temp1, pBI_P, &pBI_Temp2, &pBI_A); - /* Calculate (G^E) * R mod P */ - BigInteger_BitsOfBI(pBI_E, &Bits_Of_E); /* Calculate the bits of E */ - - for (Index = Bits_Of_E; Index > 0; Index--) { - BigInteger_Montgomery_MulMod_with_mont(pBI_X, pBI_X, pBI_P, - mont, &pBI_Temp1); - - if (BigInteger_GetBitValue(pBI_E, Index)) - BigInteger_Montgomery_MulMod_with_mont( - pBI_A, pBI_Temp1, pBI_P, mont, &pBI_X); - else - BigInteger_Copy(pBI_Temp1, &pBI_X); /* End of if */ - } /* End of for */ - - BigInteger_Montgomery_MulMod_with_mont(pBI_X, pBI_1, pBI_P, mont, - pBI_Result); - release_temporal_usage_big_interger(&pBI_A); - release_temporal_usage_big_interger(&pBI_X); - release_temporal_usage_big_interger(&pBI_R); - release_temporal_usage_big_interger(&pBI_PInverse); - release_temporal_usage_big_interger(&pBI_1); -memory_free: - release_temporal_usage_big_interger(&pBI_Temp1); - release_temporal_usage_big_interger(&pBI_Temp2); - POOL_COUNTER_CHECK_END(expected_cnt[21]); - BigInteger_record_time_end(&bi_op_ti_rec.exp_mod_op); -} /* End of BigInteger_Montgomery_ExpMod */ - -VOID BigInteger_Mod(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - OUT PBIG_INTEGER *pBI_Remainder) -{ - INT CompareResult; - INT Index, MulIndex, ComputeSize; - UINT32 MulLoopStart, MulLoopEnd; - UINT AllocLength, ArrayIndex, ShiftIndex; - UINT8 SecondHighByte; - PBIG_INTEGER pTempBI = NULL; - PBIG_INTEGER pTempBI2 = NULL; - PBIG_INTEGER pMulBI = NULL; -#ifdef BI_TIME_REC - struct timeval t1; - struct timeval t2; - - if (is_time_rec) { - do_gettimeofday(&t1); - is_mod_alloc_rec = TRUE; - } - -#endif - - if ((pFirstOperand == NULL) || (pFirstOperand->pIntegerArray == NULL) || - (pSecondOperand == NULL) || - (pSecondOperand->pIntegerArray == NULL)) { - DEBUGPRINT( - "BigInteger_Div: first or second operand is NULL.\n"); - return; - } /* End of if */ - - /* The second operand is zero */ - if ((pSecondOperand->IntegerLength == 1) && - (pSecondOperand->pIntegerArray[0] == 0)) { - DEBUGPRINT("BigInteger_Div: second operand is zero.\n"); - return; - } /* End of if */ - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[17]); - GET_BI_INS_FROM_POOL(pTempBI); - GET_BI_INS_FROM_POOL(pTempBI2); - GET_BI_INS_FROM_POOL(pMulBI); - - if (*pBI_Remainder == NULL) - BigInteger_Init(pBI_Remainder); - - /* The second operand is one */ - if ((pSecondOperand->IntegerLength == 1) && - (pSecondOperand->pIntegerArray[0] == 1)) { - BigInteger_Bin2BI(Value_0, 1, pBI_Remainder); - goto output; - } /* End of if */ - - CompareResult = - BigInteger_UnsignedCompare(pFirstOperand, pSecondOperand); - - if (CompareResult == 0) { - BigInteger_Bin2BI(Value_0, 1, pBI_Remainder); - goto output; - } else if (CompareResult == -1) { - BigInteger_Copy(pFirstOperand, pBI_Remainder); - goto output; - } /* End of if */ - - BigInteger_AllocSize(pBI_Remainder, pSecondOperand->IntegerLength); - AllocLength = (UINT)(pFirstOperand->IntegerLength << 1); - BigInteger_AllocSize(&pTempBI, AllocLength); - BigInteger_AllocSize(&pTempBI2, AllocLength); - BigInteger_AllocSize(&pMulBI, AllocLength); - BigInteger_Copy(pFirstOperand, pBI_Remainder); - SecondHighByte = - (BigInteger_GetByteValue(pSecondOperand, - pSecondOperand->IntegerLength) & - 0xFF); - ComputeSize = (INT)pFirstOperand->IntegerLength - - pSecondOperand->IntegerLength + 1; - - for (Index = (INT)ComputeSize; Index >= 0; Index--) { - if (BigInteger_UnsignedCompare(*pBI_Remainder, - pSecondOperand) == -1) - break; - - if (((pSecondOperand->IntegerLength + Index) - - (*pBI_Remainder)->IntegerLength) <= 1) { - BigInteger_AllocSize(&pMulBI, Index + 1); - ArrayIndex = 0; - - if (Index > 0) - ArrayIndex = (UINT)(Index - 1) >> 2; - - ShiftIndex = (Index & 0x03); - - if (ShiftIndex == 0) - ShiftIndex = 4; - - ShiftIndex--; - MulLoopStart = - (BigInteger_GetByteValue( - (*pBI_Remainder), - pFirstOperand->IntegerLength + Index - - ComputeSize + 1) & - 0xFF) - << 8; - MulLoopStart = MulLoopStart | - (BigInteger_GetByteValue( - (*pBI_Remainder), - pFirstOperand->IntegerLength + - Index - ComputeSize) & - 0xFF); - - if (MulLoopStart < (UINT32)SecondHighByte) - continue; - - if (SecondHighByte != 0) - MulLoopEnd = (MulLoopStart / - (UINT32)SecondHighByte) + - 1; - else { - MulLoopEnd = MulLoopStart; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("MulLoopStart division by zero!!\n")); - } - MulLoopStart = - MulLoopStart / (UINT32)(SecondHighByte + 1); - - for (MulIndex = (INT)MulLoopStart; - MulIndex <= MulLoopEnd; - MulIndex++) { /* 0xFFFF / 0x01 = 0xFFFF */ - NdisZeroMemory(pMulBI->pIntegerArray, - pMulBI->AllocSize); - - if ((MulIndex > 0xff) && (ShiftIndex == 3)) { - pMulBI->pIntegerArray[ArrayIndex] = - ((UINT)(MulIndex & 0xff) - << (8 * ShiftIndex)); - pMulBI->pIntegerArray[ArrayIndex + 1] = - (UINT)(MulIndex >> 8) & 0xff; - } else - pMulBI->pIntegerArray[ArrayIndex] = - ((UINT)(MulIndex) - << (8 * ShiftIndex)); - - BigInteger_Mul(pSecondOperand, pMulBI, - &pTempBI); - CompareResult = BigInteger_UnsignedCompare( - *pBI_Remainder, pTempBI); - - if (CompareResult < 1) { - if (CompareResult == -1) { - MulIndex = MulIndex - 1; - NdisZeroMemory( - pMulBI->pIntegerArray, - pMulBI->AllocSize); - - if ((MulIndex > 0xff) && - (ShiftIndex == 3)) { - pMulBI->pIntegerArray - [ArrayIndex] = - ((UINT)(MulIndex & - 0xff) - << (8 * - ShiftIndex)); - pMulBI->pIntegerArray - [ArrayIndex + 1] = - (UINT)(MulIndex >> - 8) & - 0xff; - } else - pMulBI->pIntegerArray - [ArrayIndex] = - ((UINT)(MulIndex) - << (8 * - ShiftIndex)); - - BigInteger_Mul(pSecondOperand, - pMulBI, - &pTempBI); - } - - BigInteger_Sub(*pBI_Remainder, pTempBI, - &pTempBI2); - BigInteger_Copy(pTempBI2, - pBI_Remainder); - break; - } /* End of if */ - } /* End of for */ - } /* End of if */ - } /* End of for */ - -output: - (*pBI_Remainder)->Signed = - pFirstOperand->Signed * pSecondOperand->Signed; - BigInteger_ClearHighBits(*pBI_Remainder); - release_temporal_usage_big_interger(&pTempBI); - release_temporal_usage_big_interger(&pTempBI2); - release_temporal_usage_big_interger(&pMulBI); - POOL_COUNTER_CHECK_END(expected_cnt[17]); -#ifdef BI_TIME_REC - - if (is_time_rec) { - ULONG time_interval = 0; - do_gettimeofday(&t2); - - if (t1.tv_usec > t2.tv_usec) - time_interval = (t2.tv_sec - t1.tv_sec) * 1000000 - - t1.tv_usec + t2.tv_usec; - else - time_interval = t2.tv_usec - t1.tv_usec; - - BigInteger_record_time_ns(&bi_op_ti_rec.mod_op, time_interval); - is_mod_alloc_rec = FALSE; - } - -#endif -} - -VOID BigInteger_Mod_Mul(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *tmp = NULL; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[8]); - GET_BI_INS_FROM_POOL(tmp); - BigInteger_Init(&tmp); - BigInteger_Mul(pFirstOperand, pSecondOperand, &tmp); - BigInteger_Mod(tmp, pBI_P, pBI_Result); - release_temporal_usage_big_interger(&tmp); - POOL_COUNTER_CHECK_END(expected_cnt[8]); -} - -UCHAR BigInteger_is_zero(IN PBIG_INTEGER pBI) -{ - BigInteger_ClearHighBits(pBI); - - if (pBI->IntegerLength == 1 && pBI->Signed == 1 && - pBI->pIntegerArray[0] == 0) - return TRUE; - else - return FALSE; -} - -UCHAR BigInteger_is_one(IN PBIG_INTEGER pBI) -{ - BigInteger_ClearHighBits(pBI); - - if (pBI->IntegerLength == 1 && pBI->Signed == 1 && - pBI->pIntegerArray[0] == 1) - return TRUE; - else - return FALSE; -} - -UCHAR BigInteger_is_odd(IN PBIG_INTEGER pBI) -{ - if (!pBI) - return FALSE; - - if (pBI->IntegerLength == 0) - return FALSE; - - if (pBI->pIntegerArray[0] & BIT0) - return TRUE; - else - return FALSE; -} - -VOID BigInteger_Mod_Square(IN PBIG_INTEGER pFirstOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BigInteger_Mod_Mul(pFirstOperand, pFirstOperand, pBI_P, pBI_Result); -} - -VOID BigInteger_Mod_Add(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *tmp = NULL; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[2]); - GET_BI_INS_FROM_POOL(tmp); - BigInteger_Add(pFirstOperand, pSecondOperand, &tmp); - BigInteger_Mod(tmp, pBI_P, pBI_Result); - release_temporal_usage_big_interger(&tmp); - POOL_COUNTER_CHECK_END(expected_cnt[2]); -} - -VOID BigInteger_Mod_Sub(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *tmp = NULL; - BIG_INTEGER *res = NULL; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[3]); - GET_BI_INS_FROM_POOL(tmp); - GET_BI_INS_FROM_POOL(res); - BigInteger_Sub(pFirstOperand, pSecondOperand, &tmp); - - if (tmp->Signed == 1) - BigInteger_Mod(tmp, pBI_P, &res); - else { - BIG_INTEGER *tmp2 = NULL; - GET_BI_INS_FROM_POOL(tmp2); - tmp->Signed = 1; - BigInteger_Mod(tmp, pBI_P, &tmp2); - BigInteger_Sub(pBI_P, tmp2, &res); - release_temporal_usage_big_interger(&tmp2); - } - - BigInteger_Copy(res, pBI_Result); - release_temporal_usage_big_interger(&tmp); - release_temporal_usage_big_interger(&res); - POOL_COUNTER_CHECK_END(expected_cnt[3]); -} - -VOID BigInteger_Mod_Add_quick(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *tmp = NULL; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[4]); - GET_BI_INS_FROM_POOL(tmp); - BigInteger_Add(pFirstOperand, pSecondOperand, &tmp); - - if (BigInteger_UnsignedCompare(tmp, pBI_P) >= 0) - BigInteger_Sub(tmp, pBI_P, pBI_Result); - else - BigInteger_Copy(tmp, pBI_Result); - - release_temporal_usage_big_interger(&tmp); - POOL_COUNTER_CHECK_END(expected_cnt[4]); -} - -VOID BigInteger_Mod_Sub_quick(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *tmp = NULL; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[5]); - GET_BI_INS_FROM_POOL(tmp); - BigInteger_Sub(pFirstOperand, pSecondOperand, &tmp); - - if (tmp->Signed == -1) - BigInteger_Add(tmp, pBI_P, pBI_Result); - else - BigInteger_Copy(tmp, pBI_Result); - - release_temporal_usage_big_interger(&tmp); - POOL_COUNTER_CHECK_END(expected_cnt[5]); -} - -VOID BigInteger_Mod_Div(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *tmp = NULL; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[6]); - GET_BI_INS_FROM_POOL(tmp); - BigInteger_record_time_begin(&bi_op_ti_rec.div_mod_op); - BigInteger_Mod_Mul_Inverse(pSecondOperand, pBI_P, &tmp); - - if (tmp == NULL) { - release_temporal_usage_big_interger(pBI_Result); - DEBUGPRINT("BigInteger_Mod_Mul_Inverse fail!!\n"); - return; - } - - BigInteger_Mod_Mul(pFirstOperand, tmp, pBI_P, &tmp); - BigInteger_Copy(tmp, pBI_Result); - release_temporal_usage_big_interger(&tmp); - POOL_COUNTER_CHECK_END(expected_cnt[6]); - BigInteger_record_time_end(&bi_op_ti_rec.div_mod_op); -} - -/* Tonelli¡VShanks algorithm*/ -/* reference: https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm */ -/* pBI_P must be prime */ -VOID BigInteger_Mod_Sqrt(IN PBIG_INTEGER pFirstOperand, IN PBIG_INTEGER pBI_P, - IN MONT_STRUC *mont, OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *p = NULL; - BIG_INTEGER *Q = NULL; - BIG_INTEGER *R = NULL; - BIG_INTEGER *t = NULL; - BIG_INTEGER *c = NULL; - BIG_INTEGER *z = NULL; - UINT32 S = 0; - UINT32 M = 0; - UINT32 i; - BIG_INTEGER *pone = NULL; - BIG_INTEGER *tmp = NULL; - BIG_INTEGER *b = NULL; - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - BigInteger_record_time_begin(&bi_op_ti_rec.sqrt_mod_op); - - if (BigInteger_is_quadratic_residue(pFirstOperand, pBI_P, mont) == - FALSE) { - /* MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: is_not_quadratic_residue\n", __FUNCTION__)); */ - release_temporal_usage_big_interger(pBI_Result); - return; - } - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[9]); - GET_BI_INS_FROM_POOL(p); - GET_BI_INS_FROM_POOL(Q); - GET_BI_INS_FROM_POOL(R); - GET_BI_INS_FROM_POOL(t); - GET_BI_INS_FROM_POOL(c); - GET_BI_INS_FROM_POOL(z); - GET_BI_INS_FROM_POOL(tmp); - GET_BI_INS_FROM_POOL(b); - /* fix me */ - GET_BI_INS_FROM_POOL(pone); - /* MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\x1b[31m%s: is_quadratic_residue\x1b[m\n", __FUNCTION__)); */ - /*DEBUGPRINT("pFirstOperand\n"); - BigInteger_Print(pFirstOperand);*/ - BigInteger_Copy(pBI_P, &p); - BigInteger_minus_one(p); - - /* p - 1 = Q * 2^S */ - while (BigInteger_is_odd(p) == FALSE) { - S++; - BigInteger_Shift_Right1(p, &p); - } - - BigInteger_Copy(p, &Q); - /* R = n^((Q+1)/2) (mod P) */ - BigInteger_Init(&R); - BigInteger_Copy(Q, &p); - BigInteger_plus_one(p); - BigInteger_Shift_Right1(p, &p); - BigInteger_Montgomery_ExpMod_with_mont(pFirstOperand, p, pBI_P, mont, - &R); - /*BigInteger_Mod_Mul(R, R, pBI_P, &tmp); - DEBUGPRINT("R:\n"); - BigInteger_Print(R); - DEBUGPRINT("R^2:\n"); - BigInteger_Print(tmp);*/ - /* t = n^Q (mod P) */ - BigInteger_Init(&t); - BigInteger_Montgomery_ExpMod_with_mont(pFirstOperand, Q, pBI_P, mont, - &t); /* ellis */ - /*DEBUGPRINT("pFirstOperand:\n"); - BigInteger_Print(pFirstOperand); - DEBUGPRINT("Q:\n"); - BigInteger_Print(Q); - DEBUGPRINT("t:\n"); - BigInteger_Print(t); - BigInteger_Mod_Mul(t, pFirstOperand, pBI_P, &tmp); - DEBUGPRINT("t*n:\n"); - BigInteger_Print(tmp);*/ - /* M = S */ - M = S; - - if (BigInteger_is_one(t)) - goto Find; - - /* Find the first quadratic non-residue z by brute-force search */ - BigInteger_Init(&c); - BigInteger_Init(&z); - BigInteger_DWtoBI(1, &z); - BigInteger_Copy(pBI_P, &p); - BigInteger_minus_one(p); - BigInteger_Shift_Right1(p, &p); - - do { - BigInteger_plus_one(z); - BigInteger_Montgomery_ExpMod_with_mont(z, p, pBI_P, mont, &tmp); - BigInteger_plus_one(tmp); - } while (BigInteger_UnsignedCompare(tmp, pBI_P) != 0); - - BigInteger_Montgomery_ExpMod_with_mont(z, Q, pBI_P, mont, &c); - BigInteger_DWtoBI(1, &pone); - - while (BigInteger_is_one(t) == FALSE) { - BigInteger_Copy(t, &tmp); - - /* find the lowest i, 0 < i < M, such that t^(2^i) = 1 (mod P) */ - for (i = 1; i < M; i++) { - BigInteger_Mod_Mul(tmp, tmp, pBI_P, &tmp); - - if (BigInteger_is_one(tmp)) - break; - } - - if (i == M) { - DEBUGPRINT("\x1b[33msearch fail\x1b[m\n"); - BigInteger_Free(pBI_Result); - goto Free; - } - - /* b = c^2^(M-i-1) (mod P)*/ - BigInteger_Shift_Left(pone, M - i - 1, &tmp); - BigInteger_Montgomery_ExpMod_with_mont(c, tmp, pBI_P, mont, &b); - /* R = R*b (mod P)*/ - BigInteger_Mod_Mul(R, b, pBI_P, &R); - /* t = t*b^2 (mod P), c = b^2 (mod P) */ - BigInteger_Mod_Mul(b, b, pBI_P, &c); - BigInteger_Mod_Mul(t, c, pBI_P, &t); - /* M = i */ - M = i; - } - -Find: - BigInteger_Copy(pFirstOperand, &p); - BigInteger_Copy(R, pBI_Result); -Free: - release_temporal_usage_big_interger(&p); - release_temporal_usage_big_interger(&Q); - release_temporal_usage_big_interger(&R); - release_temporal_usage_big_interger(&t); - release_temporal_usage_big_interger(&pone); - release_temporal_usage_big_interger(&tmp); - release_temporal_usage_big_interger(&b); - release_temporal_usage_big_interger(&c); - release_temporal_usage_big_interger(&z); - POOL_COUNTER_CHECK_END(expected_cnt[9]); - BigInteger_record_time_end(&bi_op_ti_rec.sqrt_mod_op); -} - -VOID BigInteger_Euclidean_Div(IN PBIG_INTEGER pFirstOperand, - IN PBIG_INTEGER pSecondOperand, - IN PBIG_INTEGER prev_u, IN PBIG_INTEGER prev_v, - INOUT PBIG_INTEGER curr_u, - INOUT PBIG_INTEGER curr_v) -{ - PBIG_INTEGER div_result = NULL; - PBIG_INTEGER div_Remainder = NULL; - PBIG_INTEGER tmp2 = NULL; - PBIG_INTEGER tmp = NULL; - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - POOL_COUNTER_CHECK_BEGIN(expected_cnt[13]); - GET_BI_INS_FROM_POOL(div_result); - GET_BI_INS_FROM_POOL(div_Remainder); - GET_BI_INS_FROM_POOL(tmp); - GET_BI_INS_FROM_POOL(tmp2); - - while (!BigInteger_is_one(pSecondOperand) && - !BigInteger_is_zero(pSecondOperand)) { - BigInteger_Div( - pFirstOperand, pSecondOperand, &div_result, - &div_Remainder); /* pFirstOperand = pSecondOperand * div_result + div_Remainder */ - /* new_u = prev_u - curr_u * div_result */ - BigInteger_Mul(curr_u, div_result, &tmp); - BigInteger_Sub(prev_u, tmp, &tmp2); - BigInteger_Copy(curr_u, &prev_u); - BigInteger_Copy(tmp2, &curr_u); - /* new_v = prev_v - curr_v * div_result */ - BigInteger_Mul(curr_v, div_result, &tmp); - BigInteger_Sub(prev_v, tmp, &tmp2); - BigInteger_Copy(curr_v, &prev_v); - BigInteger_Copy(tmp2, &curr_v); - BigInteger_Copy(pSecondOperand, &pFirstOperand); - BigInteger_Copy(div_Remainder, &pSecondOperand); - }; - - release_temporal_usage_big_interger(&div_result); - - release_temporal_usage_big_interger(&div_Remainder); - - release_temporal_usage_big_interger(&tmp2); - - release_temporal_usage_big_interger(&tmp); - - POOL_COUNTER_CHECK_END(expected_cnt[13]); -} - -/* -UCHAR test[7] = { - 0x72, 0xf8, 0x45, 0x05, 0x69, 0xb0, 0x4d -};*/ - -UCHAR test[192] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, - 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, - 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, - 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, - 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, - 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, - 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, - 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, - 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, - 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, - 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, - 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, - 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, - 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, - 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, - 0xCA, 0x23, 0x73, 0x27, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -UCHAR test2[] = { 0x72, 0xf8, 0x45, 0x03, 0x69, 0xb0, - 0x45, 0xff, 0xfa, 0xc3, 0x21 }; - -VOID BigInteger_Mod_Mul_Inverse(IN PBIG_INTEGER pBI, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - PBIG_INTEGER pFirstOperand = NULL; - PBIG_INTEGER pSecondOperand = NULL; - PBIG_INTEGER res = NULL; - PBIG_INTEGER prev_u = NULL; - PBIG_INTEGER prev_v = NULL; - PBIG_INTEGER curr_u = NULL; - PBIG_INTEGER curr_v = NULL; - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - BigInteger_record_time_begin(&bi_op_ti_rec.mod_mul_inv_op); - POOL_COUNTER_CHECK_BEGIN(expected_cnt[14]); - GET_BI_INS_FROM_POOL(pFirstOperand); - GET_BI_INS_FROM_POOL(pSecondOperand); - GET_BI_INS_FROM_POOL(res); - GET_BI_INS_FROM_POOL(prev_u); - GET_BI_INS_FROM_POOL(prev_v); - GET_BI_INS_FROM_POOL(curr_u); - GET_BI_INS_FROM_POOL(curr_v); - BigInteger_Init(&pFirstOperand); - BigInteger_Init(&pSecondOperand); - - if (pBI == NULL) - BigInteger_Bin2BI(test, sizeof(test), &pFirstOperand); - else - BigInteger_Copy(pBI_P, &pFirstOperand); - - if (pBI_P == NULL) - BigInteger_Bin2BI(test2, sizeof(test2), &pSecondOperand); - else - BigInteger_Mod(pBI, pBI_P, &pSecondOperand); - - /*DEBUGPRINT("P:"); - BigInteger_Print(ptest);*/ - /*DEBUGPRINT("INPUT:"); - BigInteger_Print(ptest2);*/ - BigInteger_DWtoBI(1, &prev_u); - BigInteger_DWtoBI(0, &curr_u); - BigInteger_DWtoBI(0, &prev_v); - BigInteger_DWtoBI(1, &curr_v); - BigInteger_Euclidean_Div(pFirstOperand, pSecondOperand, prev_u, prev_v, - curr_u, curr_v); - - if (BigInteger_is_one(pSecondOperand) == FALSE) { - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[31mpSecondOperand is not one!!!!!!\x1b[m\n")); - release_temporal_usage_big_interger(pBI_Result); - goto Free; - } - - if (curr_v->Signed == -1) { - BigInteger_Add(curr_v, pBI_P, &res); - BigInteger_Copy(res, pBI_Result); - } else - BigInteger_Copy(curr_v, pBI_Result); - - /*DEBUGPRINT("BigInteger_Modular_Mul_Inverse result:"); - BigInteger_Print(*pBI_Result);*/ -Free: - release_temporal_usage_big_interger(&pFirstOperand); - release_temporal_usage_big_interger(&pSecondOperand); - release_temporal_usage_big_interger(&res); - release_temporal_usage_big_interger(&prev_u); - release_temporal_usage_big_interger(&prev_v); - release_temporal_usage_big_interger(&curr_u); - release_temporal_usage_big_interger(&curr_v); - POOL_COUNTER_CHECK_END(expected_cnt[14]); - BigInteger_record_time_end(&bi_op_ti_rec.mod_mul_inv_op); -} - -VOID BigInteger_Mod_Mul_Inverse2(IN PBIG_INTEGER pBI, IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *tmp = NULL; - BigInteger_record_time_begin(&bi_op_ti_rec.mod_mul_inv_op); - BigInteger_Inverse(pBI, pBI_P, pBI_Result, &tmp); - release_temporal_usage_big_interger(&tmp); - BigInteger_record_time_end(&bi_op_ti_rec.mod_mul_inv_op); -} - -UCHAR testa[] = { 0x38, 0xa0, 0x39, 0xeb, 0x50, 0x4f, 0x4f, 0x50 }; - -UCHAR BigInteger_Sqrt(IN PBIG_INTEGER pBI, OUT PBIG_INTEGER *pBI_Result) -{ - PBIG_INTEGER x = NULL; - UINT32 x_len; - UCHAR *x_buf = NULL; - PBIG_INTEGER ptest = NULL; - UINT8 first_byte; - UINT8 x_first_byte; - UCHAR res; - UINT32 i = 0; - BigInteger_record_time_begin(&bi_op_ti_rec.sqrt_op); - - /* - * Let S = a * 0x10^2n, where 0x1 <= a <= 0xff - * X ={ 0x2 * 0x10^n, where 0x1 <= a <= 0x10 ,note: sqrt(sqrt(0x1)*sqrt(0x10)) = 0x2 - * { 0x7 * 0x20^n, where 0x10 < a <= 0xff ,note: sqrt(sqrt(0x10)*sqrt(0x100)) ~= 0x7 - */ - if (pBI == NULL) - BigInteger_Bin2BI(testa, sizeof(testa), &ptest); - else - BigInteger_Copy(pBI, &ptest); - - /*DEBUGPRINT("input:"); - BigInteger_Print(ptest);*/ - x_len = (ptest->IntegerLength + 1) / 2; - os_alloc_mem(NULL, &x_buf, x_len); - - if (x_buf == NULL) { - res = FALSE; - goto Free; - } - - NdisZeroMemory(x_buf, x_len); - first_byte = BigInteger_GetByteValue(ptest, ptest->IntegerLength); - - if (first_byte > 0x10) - x_first_byte = 0x7; - else - x_first_byte = 0x2; - - if (ptest->IntegerLength % 2 == 0) - x_first_byte <<= 4; - - x_buf[0] = x_first_byte; - BigInteger_Bin2BI(x_buf, x_len, &x); - BigInteger_is_one(x); - - /* S is input, use Xi+1 = 1/2 * (Xi + S/Xi), if Xn+1 == Xn, sqrt(S) ~= Xn */ - do { - PBIG_INTEGER div_res = NULL; - PBIG_INTEGER div_rem = NULL; - PBIG_INTEGER tmp = NULL; - i++; - /*DEBUGPRINT("x:"); - BigInteger_Print(x);*/ - BigInteger_Div(ptest, x, &div_res, &div_rem); - - /*DEBUGPRINT("div_res:"); - BigInteger_Print(div_res); - DEBUGPRINT("div_rem:"); - BigInteger_Print(div_rem);*/ - if (BigInteger_UnsignedCompare(x, div_res) == 0) { - if (BigInteger_is_zero(div_rem)) { - DEBUGPRINT("\x1b[33m%s: found!!!\x1b[m\n", - __func__); - res = TRUE; - } else - res = FALSE; - - BigInteger_Free(&div_res); - BigInteger_Free(&div_rem); - break; - } - - if (BigInteger_UnsignedCompare(x, div_rem) != - 1) { /* ellis: if BigInteger_Div work, remove it */ - res = FALSE; - BigInteger_Free(&div_res); - BigInteger_Free(&div_rem); - DEBUGPRINT("%s: div fail!!!\n", __func__); - break; - } - - BigInteger_Add(x, div_res, &tmp); - BigInteger_Shift_Right1(tmp, &div_res); - - if (BigInteger_UnsignedCompare(x, div_res) == 0) { - DEBUGPRINT("diff == 1\n"); - res = FALSE; - BigInteger_Free(&div_res); - BigInteger_Free(&div_rem); - BigInteger_Free(&tmp); - break; - } - - BigInteger_Copy(div_res, &x); - /*DEBUGPRINT("new x:"); - BigInteger_Print(x);*/ - BigInteger_Free(&div_res); - BigInteger_Free(&div_rem); - BigInteger_Free(&tmp); - } while (1); - - DEBUGPRINT("%s: total loop %d\n", __func__, i); - - if (res) { - if (*pBI_Result == NULL) - BigInteger_Init(pBI_Result); - - BigInteger_Copy(x, pBI_Result); - } else - BigInteger_Free(pBI_Result); - - os_free_mem(x_buf); -Free: - BigInteger_Free(&ptest); - BigInteger_Free(&x); - BigInteger_record_time_end(&bi_op_ti_rec.sqrt_op); - return res; -} - -VOID BigInteger_Shift_Right1(IN PBIG_INTEGER pBI, OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *res = NULL; - UINT32 len; - UINT32 shift_bit = 1; - INT16 i; - UINT32 shift_tmp; - BIG_INTEGER *ptest = NULL; - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[10]); - GET_BI_INS_FROM_POOL(res); - GET_BI_INS_FROM_POOL(ptest); - - if (pBI == NULL) - BigInteger_Bin2BI(test, sizeof(test), &ptest); /* debug usage */ - else - BigInteger_Copy(pBI, &ptest); - - len = ptest->IntegerLength; - BigInteger_AllocSize(&res, len); - NdisCopyMemory(res->pIntegerArray, ptest->pIntegerArray, len); - res->Signed = ptest->Signed; - - /* i = res->ArrayLength - 1 */ - shift_tmp = res->pIntegerArray[res->ArrayLength - 1] & - ((1 << shift_bit) - 1); - res->pIntegerArray[res->ArrayLength - 1] >>= shift_bit; - - for (i = res->ArrayLength - 2; i >= 0; i--) { - UINT32 shift_tmp2 = - res->pIntegerArray[i] & ((1 << shift_bit) - 1); - res->pIntegerArray[i] = (shift_tmp << (32 - shift_bit)) | - (res->pIntegerArray[i] >> shift_bit); - shift_tmp = shift_tmp2; - } - - BigInteger_ClearHighBits(res); - BigInteger_Copy(res, pBI_Result); - release_temporal_usage_big_interger(&ptest); - release_temporal_usage_big_interger(&res); - POOL_COUNTER_CHECK_END(expected_cnt[10]); -} - -VOID BigInteger_Mod_Shift_Left(IN PBIG_INTEGER pBI, IN UCHAR bit, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *res = NULL; - BIG_INTEGER *tmp = NULL; - UCHAR two[] = { 0x1 }; - - two[0] <<= bit; - - GET_BI_INS_FROM_POOL(res); - GET_BI_INS_FROM_POOL(tmp); - - BigInteger_Bin2BI(two, sizeof(two), &tmp); - BigInteger_Mod_Mul(pBI, tmp, pBI_P, &res); - - BigInteger_Copy(res, pBI_Result); - release_temporal_usage_big_interger(&tmp); - release_temporal_usage_big_interger(&res); -} - -/* do not use this api(unknown bug) */ -VOID BigInteger_Shift_Left(IN PBIG_INTEGER pBI, IN UINT32 bit, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *res = NULL; - UINT32 len; - UINT32 shift_bit = bit % 32; - UINT32 shift_dword = bit / 32; - UINT32 shift_byte = (shift_bit + 7) / 8; - INT16 i; - UINT32 shift_tmp = 0; - BIG_INTEGER *ptest = NULL; - - if (bit == 0) { - BigInteger_Copy(pBI, pBI_Result); - return; - } - - POOL_COUNTER_CHECK_BEGIN(expected_cnt[11]); - GET_BI_INS_FROM_POOL(res); - GET_BI_INS_FROM_POOL(ptest); - - if (pBI == NULL) - BigInteger_Bin2BI(test, sizeof(test), &ptest); /* debug usage */ - else - BigInteger_Copy(pBI, &ptest); - - len = ptest->IntegerLength + shift_dword * 4; - - if (shift_bit) - len += shift_byte; - - BigInteger_AllocSize(&res, len); - res->Signed = ptest->Signed; - - if (shift_bit) { - /* i = 0 */ - shift_tmp = ptest->pIntegerArray[0] >> (32 - shift_bit); - res->pIntegerArray[shift_dword] = ptest->pIntegerArray[0] - << shift_bit; - - for (i = 1; i < ptest->ArrayLength; i++) { - UINT32 shift_tmp2 = - ptest->pIntegerArray[i] >> (32 - shift_bit); - res->pIntegerArray[i + shift_dword] = - shift_tmp | - (ptest->pIntegerArray[i] << shift_bit); - shift_tmp = shift_tmp2; - } - - if (shift_bit) - res->pIntegerArray[ptest->ArrayLength + shift_dword] = - shift_tmp; - } - - BigInteger_Copy(res, pBI_Result); - release_temporal_usage_big_interger(&ptest); - release_temporal_usage_big_interger(&res); - POOL_COUNTER_CHECK_END(expected_cnt[11]); -} - -/* treat pBi is positve and non-zero */ -VOID BigInteger_minus_one(INOUT PBIG_INTEGER pBI) -{ - INT16 i; - - if (pBI == NULL) - return; - - for (i = 0; i < pBI->ArrayLength; i++) { - if (pBI->pIntegerArray[i]) { - pBI->pIntegerArray[i]--; - return; - } else - pBI->pIntegerArray[i] = ~0; - } -} - -/* treat pBi is positve and non-zero */ -VOID BigInteger_plus_one(INOUT PBIG_INTEGER pBI) -{ - INT16 i; - - if (pBI == NULL) - return; - - for (i = 0; i < pBI->ArrayLength; i++) { - if (pBI->pIntegerArray[i] != ~0) { - pBI->pIntegerArray[i]++; - return; - } else - pBI->pIntegerArray[i] = 0; - } - - /* todo: length update */ - panic("BigInteger_plus_one: todo: length update"); -} - -/* an integer q is called a quadratic residue modulo n if it is congruent to a perfect square modulo n */ -UCHAR BigInteger_is_quadratic_residue(IN BIG_INTEGER *q, IN BIG_INTEGER *prime, - IN MONT_STRUC *mont) -{ - BIG_INTEGER *p = NULL; - BIG_INTEGER *res = NULL; - UCHAR ret; - POOL_COUNTER_CHECK_BEGIN(expected_cnt[12]); - GET_BI_INS_FROM_POOL(p); - GET_BI_INS_FROM_POOL(res); - BigInteger_Init(&res); - BigInteger_Copy(prime, &p); - BigInteger_minus_one(p); - BigInteger_Shift_Right1(p, &p); - BigInteger_Montgomery_ExpMod_with_mont(q, p, prime, mont, &res); - ret = BigInteger_is_one(res); - release_temporal_usage_big_interger(&p); - release_temporal_usage_big_interger(&res); - POOL_COUNTER_CHECK_END(expected_cnt[12]); - /* if (ret == TRUE) DEBUGPRINT("\x1b[33mgot it\x1b[m\n"); */ - return ret; -} - -VOID BigInteger_Montgomery_ExpMod32(IN PBIG_INTEGER pBI_G, - IN PBIG_INTEGER pBI_E, - IN PBIG_INTEGER pBI_P, - OUT PBIG_INTEGER *pBI_Result) -{ - BIG_INTEGER *g = NULL; - BIG_INTEGER *e = NULL; - BIG_INTEGER *res = NULL; - UINT i = 0; - UINT j = 0; - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - BigInteger_record_time_begin(&bi_op_ti_rec.simple_exp_mod_op); - BigInteger_Copy(pBI_G, &g); - BigInteger_Copy(pBI_E, &e); - BigInteger_Bin2BI(Value_1, 1, &res); - - while (BigInteger_is_zero(e) == FALSE) { - if (BigInteger_is_odd(e)) { - BigInteger_Mod_Mul(res, g, pBI_P, &res); - BigInteger_minus_one(e); - } else { - BigInteger_Mod_Mul(g, g, pBI_P, &g); - BigInteger_Shift_Right1(e, &e); - j++; - } - - i++; - } - - BigInteger_Copy(res, pBI_Result); - BigInteger_Free(&g); - BigInteger_Free(&e); - BigInteger_Free(&res); - BigInteger_record_time_end(&bi_op_ti_rec.simple_exp_mod_op); -} - -VOID BigInteger_DWtoBI(IN UINT32 value, OUT PBIG_INTEGER *pBI) -{ - BigInteger_AllocSize(pBI, 4); - (*pBI)->pIntegerArray[0] = value; - BigInteger_ClearHighBits(*pBI); -} - -VOID BigInteger_Add_DW(INOUT PBIG_INTEGER pBI, IN UINT32 value) -{ - UINT32 copy = pBI->pIntegerArray[0]; - UINT8 i; - pBI->pIntegerArray[0] += value; - - if (pBI->pIntegerArray[0] < copy) { - for (i = 1; i < pBI->ArrayLength; i++) { - if (pBI->pIntegerArray[i] != ~0) { - pBI->pIntegerArray[i]++; - BigInteger_ClearHighBits(pBI); - return; - } else - pBI->pIntegerArray[i] = 0; - } - } - - /* todo: length update */ - panic("BigInteger_Add_DW: todo: length update"); -} - -VOID BigInteger_Mod_DW(INOUT PBIG_INTEGER pBI, IN UINT32 value, OUT UINT32 *rem) -{ - *rem = pBI->pIntegerArray[0] % value; - pBI->pIntegerArray[0] -= *rem; -} - -VOID BigInteger_DtoH(INOUT PBIG_INTEGER pBI) -{ - BIG_INTEGER *res = NULL; - BIG_INTEGER *tmp = NULL; - BIG_INTEGER *tmp2 = NULL; - BIG_INTEGER *tmp3 = NULL; - BIG_INTEGER *hundred = NULL; - UINT i; - UINT8 byte_value; - BigInteger_DWtoBI(100, &hundred); - BigInteger_DWtoBI((UINT32)1, &tmp2); - BigInteger_DWtoBI((UINT32)0, &res); - - for (i = 1; i <= pBI->IntegerLength; i++) { - byte_value = BigInteger_GetByteValue(pBI, i); - BigInteger_DWtoBI((UINT32)byte_value, &tmp); - BigInteger_Mul(tmp, tmp2, &tmp3); - BigInteger_Copy(tmp3, &tmp); - BigInteger_Add(res, tmp, &tmp3); - BigInteger_Copy(tmp3, &res); - BigInteger_Mul(tmp2, hundred, &tmp); - BigInteger_Copy(tmp, &tmp2); - } - - BigInteger_Copy(res, &pBI); - BigInteger_Free(&res); - BigInteger_Free(&tmp); - BigInteger_Free(&tmp2); - BigInteger_Free(&tmp3); - BigInteger_Free(&hundred); -} - -VOID BigInteger_dump_time(VOID) -{ - if (DebugLevel < DBG_LVL_TRACE) - return; - - DEBUGPRINT("BigInteger time record: (allocated cnt = %lu)\n", - alloc_cnt); - DEBUGPRINT("add allocated cnt = %lu\n", alloc_cnt_add); - DEBUGPRINT("sub allocated cnt = %lu\n", alloc_cnt_sub); - DEBUGPRINT("mul allocated cnt = %lu\n", alloc_cnt_mul); - DEBUGPRINT("div allocated cnt = %lu\n", alloc_cnt_div); - DEBUGPRINT("mod allocated cnt = %lu\n", alloc_cnt_mod); - - if (bi_op_ti_rec.add_op.exe_times) { - DEBUGPRINT("add_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu.%03lu nsec", - (bi_op_ti_rec.add_op.time_interval / - bi_op_ti_rec.add_op.exe_times), - show_float(bi_op_ti_rec.add_op.time_interval, - bi_op_ti_rec.add_op.exe_times, 3)); - DEBUGPRINT(", %lu nsec", bi_op_ti_rec.add_op.time_interval); - DEBUGPRINT("\n\texe_times=%u\n", bi_op_ti_rec.add_op.exe_times); - bi_op_ti_rec.add_op.time_interval = 0; - bi_op_ti_rec.add_op.exe_times = 0; - bi_op_ti_rec.add_op.avg_time_interval = 0; - } - - if (bi_op_ti_rec.sub_op.exe_times) { - DEBUGPRINT("sub_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu.%03lu nsec", - (bi_op_ti_rec.sub_op.time_interval / - bi_op_ti_rec.sub_op.exe_times), - show_float(bi_op_ti_rec.sub_op.time_interval, - bi_op_ti_rec.sub_op.exe_times, 3)); - DEBUGPRINT(", %lu nsec", bi_op_ti_rec.sub_op.time_interval); - DEBUGPRINT(", add:sub = 1:%lu.%02lu", - (bi_op_ti_rec.sub_op.time_interval / - bi_op_ti_rec.add_op.time_interval), - show_float(bi_op_ti_rec.sub_op.time_interval, - bi_op_ti_rec.add_op.time_interval, 2)); - DEBUGPRINT("\n\texe_times=%u\n", bi_op_ti_rec.sub_op.exe_times); - bi_op_ti_rec.sub_op.time_interval = 0; - bi_op_ti_rec.sub_op.exe_times = 0; - bi_op_ti_rec.sub_op.avg_time_interval = 0; - } - - if (bi_op_ti_rec.mul_op.exe_times) { - DEBUGPRINT("mul_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu.%03lu nsec", - (bi_op_ti_rec.mul_op.time_interval / - bi_op_ti_rec.mul_op.exe_times), - show_float(bi_op_ti_rec.mul_op.time_interval, - bi_op_ti_rec.mul_op.exe_times, 3)); - DEBUGPRINT(", %lu nsec", bi_op_ti_rec.mul_op.time_interval); - DEBUGPRINT(", add:mul = 1:%lu.%02lu", - (bi_op_ti_rec.mul_op.time_interval / - bi_op_ti_rec.add_op.time_interval), - show_float(bi_op_ti_rec.mul_op.time_interval, - bi_op_ti_rec.add_op.time_interval, 2)); - DEBUGPRINT("\n\texe_times=%u\n", bi_op_ti_rec.mul_op.exe_times); - bi_op_ti_rec.mul_op.time_interval = 0; - bi_op_ti_rec.mul_op.exe_times = 0; - bi_op_ti_rec.mul_op.avg_time_interval = 0; - } - - if (bi_op_ti_rec.div_op.exe_times) { - DEBUGPRINT("div_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu.%03lu nsec", - (bi_op_ti_rec.div_op.time_interval / - bi_op_ti_rec.div_op.exe_times), - show_float(bi_op_ti_rec.div_op.time_interval, - bi_op_ti_rec.div_op.exe_times, 3)); - DEBUGPRINT(", %lu nsec", bi_op_ti_rec.div_op.time_interval); - DEBUGPRINT(", add:div = 1:%lu.%02lu", - (bi_op_ti_rec.div_op.time_interval / - bi_op_ti_rec.add_op.time_interval), - show_float(bi_op_ti_rec.div_op.time_interval, - bi_op_ti_rec.add_op.time_interval, 2)); - DEBUGPRINT("\n\texe_times=%u\n", bi_op_ti_rec.div_op.exe_times); - bi_op_ti_rec.div_op.avg_time_interval = 0; - bi_op_ti_rec.div_op.time_interval = 0; - bi_op_ti_rec.div_op.exe_times = 0; - } - - if (bi_op_ti_rec.mod_op.exe_times) { - DEBUGPRINT("mod_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu.%03lu nsec", - (bi_op_ti_rec.mod_op.time_interval / - bi_op_ti_rec.mod_op.exe_times), - show_float(bi_op_ti_rec.mod_op.time_interval, - bi_op_ti_rec.mod_op.exe_times, 3)); - DEBUGPRINT(", %lu nsec", bi_op_ti_rec.mod_op.time_interval); - if (bi_op_ti_rec.add_op.time_interval) - DEBUGPRINT(", add:mod = 1:%lu.%02lu", - (bi_op_ti_rec.mod_op.time_interval / - bi_op_ti_rec.add_op.time_interval), - show_float(bi_op_ti_rec.mod_op.time_interval, - bi_op_ti_rec.add_op.time_interval, - 2)); - DEBUGPRINT("\n\texe_times=%u\n", bi_op_ti_rec.mod_op.exe_times); - bi_op_ti_rec.mod_op.avg_time_interval = 0; - bi_op_ti_rec.mod_op.time_interval = 0; - bi_op_ti_rec.mod_op.exe_times = 0; - } - - if (bi_op_ti_rec.square_op.exe_times) { - DEBUGPRINT("square_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu.%03lu nsec", - (bi_op_ti_rec.square_op.time_interval / - bi_op_ti_rec.square_op.exe_times), - show_float(bi_op_ti_rec.square_op.time_interval, - bi_op_ti_rec.square_op.exe_times, 3)); - DEBUGPRINT(", %lu nsec", bi_op_ti_rec.square_op.time_interval); - DEBUGPRINT("\n\texe_times=%u\n", - bi_op_ti_rec.square_op.exe_times); - bi_op_ti_rec.square_op.avg_time_interval = 0; - bi_op_ti_rec.square_op.time_interval = 0; - bi_op_ti_rec.square_op.exe_times = 0; - } - - alloc_cnt = 0; - alloc_cnt_add = 0; - alloc_cnt_sub = 0; - alloc_cnt_mul = 0; - alloc_cnt_div = 0; - alloc_cnt_mod = 0; - - if (bi_op_ti_rec.sqrt_op.exe_times) { - DEBUGPRINT("sqrt_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu jiffies", - bi_op_ti_rec.sqrt_op.avg_time_interval); -#ifdef LINUX - DEBUGPRINT(", %u msec", - jiffies_to_msecs( - bi_op_ti_rec.sqrt_op.avg_time_interval)); -#endif - DEBUGPRINT("\n\texe_times=%u\n", - bi_op_ti_rec.sqrt_op.exe_times); - bi_op_ti_rec.sqrt_op.avg_time_interval = 0; - bi_op_ti_rec.sqrt_op.time_interval = 0; - bi_op_ti_rec.sqrt_op.exe_times = 0; - } - - if (bi_op_ti_rec.exp_mod_op.exe_times) { - DEBUGPRINT("exp_mod_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu jiffies", - bi_op_ti_rec.exp_mod_op.avg_time_interval); -#ifdef LINUX - DEBUGPRINT(", %u msec", - jiffies_to_msecs( - bi_op_ti_rec.exp_mod_op.avg_time_interval)); -#endif - DEBUGPRINT("\n\texe_times=%u\n", - bi_op_ti_rec.exp_mod_op.exe_times); - bi_op_ti_rec.exp_mod_op.avg_time_interval = 0; - bi_op_ti_rec.exp_mod_op.time_interval = 0; - bi_op_ti_rec.exp_mod_op.exe_times = 0; - } - - if (bi_op_ti_rec.div_mod_op.exe_times) { - DEBUGPRINT("div_mod_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu jiffies", - bi_op_ti_rec.div_mod_op.avg_time_interval); -#ifdef LINUX - DEBUGPRINT(", %u msec", - jiffies_to_msecs( - bi_op_ti_rec.div_mod_op.avg_time_interval)); -#endif - DEBUGPRINT("\n\texe_times=%u\n", - bi_op_ti_rec.div_mod_op.exe_times); - bi_op_ti_rec.div_mod_op.avg_time_interval = 0; - bi_op_ti_rec.div_mod_op.time_interval = 0; - bi_op_ti_rec.div_mod_op.exe_times = 0; - } - - if (bi_op_ti_rec.sqrt_mod_op.exe_times) { - DEBUGPRINT("sqrt_mod_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu jiffies", - bi_op_ti_rec.sqrt_mod_op.avg_time_interval); -#ifdef LINUX - DEBUGPRINT(", %u msec", - jiffies_to_msecs( - bi_op_ti_rec.sqrt_mod_op.avg_time_interval)); -#endif - DEBUGPRINT("\n\texe_times=%u\n", - bi_op_ti_rec.sqrt_mod_op.exe_times); - bi_op_ti_rec.sqrt_mod_op.avg_time_interval = 0; - bi_op_ti_rec.sqrt_mod_op.time_interval = 0; - bi_op_ti_rec.sqrt_mod_op.exe_times = 0; - } - - if (bi_op_ti_rec.mod_mul_inv_op.exe_times) { - DEBUGPRINT("mod_mul_inv_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu jiffies", - bi_op_ti_rec.mod_mul_inv_op.avg_time_interval); -#ifdef LINUX - DEBUGPRINT( - ", %u msec", - jiffies_to_msecs( - bi_op_ti_rec.mod_mul_inv_op.avg_time_interval)); -#endif - DEBUGPRINT("\n\texe_times=%u\n", - bi_op_ti_rec.mod_mul_inv_op.exe_times); - bi_op_ti_rec.mod_mul_inv_op.avg_time_interval = 0; - bi_op_ti_rec.mod_mul_inv_op.time_interval = 0; - bi_op_ti_rec.mod_mul_inv_op.exe_times = 0; - } - - if (bi_op_ti_rec.simple_exp_mod_op.exe_times) { - DEBUGPRINT("simple_exp_mod_op time record:\n"); - DEBUGPRINT("\tavg_time=%lu jiffies", - bi_op_ti_rec.simple_exp_mod_op.avg_time_interval); -#ifdef LINUX - DEBUGPRINT(", %u msec", - jiffies_to_msecs(bi_op_ti_rec.simple_exp_mod_op - .avg_time_interval)); -#endif - DEBUGPRINT("\n\texe_times=%u\n", - bi_op_ti_rec.simple_exp_mod_op.exe_times); - bi_op_ti_rec.simple_exp_mod_op.avg_time_interval = 0; - bi_op_ti_rec.simple_exp_mod_op.time_interval = 0; - bi_op_ti_rec.simple_exp_mod_op.exe_times = 0; - } -} -/* End of crypt_biginteger.c */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_bignum.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_bignum.c deleted file mode 100644 index a38d46a961..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_bignum.c +++ /dev/null @@ -1,467 +0,0 @@ - -/* ==================================================================== - * Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgment: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgment: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -/**************************************************************************** -* Mediatek Inc. -* 5F., No.5, Taiyuan 1st St., Zhubei City, -* Hsinchu County 302, Taiwan, R.O.C. -* (c) Copyright 2014, Mediatek, Inc. -* -* All rights reserved. Mediatek's source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of Mediatek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of Mediatek, Inc. is obtained. -**************************************************************************** - - Module Name: - crypt_bignum.c - - Abstract: - BN wrepper for reference OPENSSL funcitons - - Revision History: - Who When What - -------- ---------- --------------------------------------------- - Ellis 2018.3.1 Initial version -*/ - -#ifdef DOT11_SAE_OPENSSL_BN -#include "security/crypt_bignum.h" -#include "rt_config.h" -#include - -#ifdef __KERNEL__ -#define DEBUGPRINT(fmt, args...) printk(fmt, ##args) -#else -#define DEBUGPRINT(fmt, args...) printf(fmt, ##args) -#endif /* __KERNEL__ */ - -VOID Bignum_Print(IN BIGNUM *pBI) -{ - UINT32 i, j = 0; - - DEBUGPRINT("dmax = %d, top = %d\n", pBI->dmax, pBI->top); - - for (i = pBI->dmax - 1; j < pBI->dmax; i--, j++) { - if (j / 4 > 0 && j % 4 == 0) - DEBUGPRINT("\n"); - DEBUGPRINT("%02x %02x %02x %02x ", - (pBI->d[i] & 0xff000000) >> 24, - (pBI->d[i] & 0xff0000) >> 16, - (pBI->d[i] & 0xff00) >> 8, (pBI->d[i] & 0xff)); - } - - DEBUGPRINT("\n"); - return; -} - -VOID Bignum_Init(INOUT BIGNUM **pBI) -{ - if (*pBI == NULL) { - *pBI = BN_new(); - } -} - -VOID Bignum_Free(IN BIGNUM **pBI) -{ - if (*pBI != NULL) - BN_free(*pBI); - *pBI = NULL; -} - -UINT32 Bignum_getlen(IN BIGNUM *pBI) -{ - return pBI->top * 4; -} - -INT Bignum_Get_rand_range(IN BIGNUM *range, INOUT BIGNUM *r) -{ - return BN_rand_range(r, (const BIGNUM *)range); -} - -VOID Bignum_BI2Bin(IN BIGNUM *pBI, OUT UINT8 *pValue, OUT UINT *Length) -{ - *Length = BN_num_bytes(pBI); - BN_bn2bin(pBI, pValue); -} /* End of Bignum_BI2Bin */ - -VOID Bignum_BI2Bin_with_pad(IN BIGNUM *pBI, OUT UINT8 *pValue, IN UINT *Length, - IN UINT32 PadLen) -{ - UINT32 num_bytes, offset; - - num_bytes = BN_num_bytes((const BIGNUM *)pBI); - - if (PadLen > num_bytes) - offset = PadLen - num_bytes; - else - offset = 0; - - NdisZeroMemory(pValue, offset); - Bignum_BI2Bin(pBI, pValue + offset, Length); - *Length += offset; -} - -VOID Bignum_Bin2BI(IN UINT8 *pValue, IN UINT Length, OUT BIGNUM **pBI) -{ - if (*pBI) - BN_free(*pBI); - *pBI = BN_bin2bn(pValue, Length, NULL); -} /* End of Bignum_Bin2BI */ - -VOID Bignum_Copy(IN BIGNUM *pBI_Copied, OUT BIGNUM **pBI_Result) -{ - if (*pBI_Result) - BN_free(*pBI_Result); - *pBI_Result = BN_dup(pBI_Copied); -} /* End of Bignum_Copy */ - -INT Bignum_UnsignedCompare(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand) -{ - return BN_ucmp(pFirstOperand, pSecondOperand); -} /* End of Bignum_Compare */ - -VOID Bignum_Add(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - OUT BIGNUM **pBI_Result) -{ - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - BN_add(*pBI_Result, pFirstOperand, pSecondOperand); -} /* End of Bignum_Add */ - -VOID Bignum_Sub(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - OUT BIGNUM **pBI_Result) -{ - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - BN_sub(*pBI_Result, pFirstOperand, pSecondOperand); -} /* End of Bignum_Sub */ - -VOID Bignum_Mod(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - OUT BIGNUM **pBI_Remainder) -{ - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - if (*pBI_Remainder == NULL) - *pBI_Remainder = BN_new(); - - BN_mod(*pBI_Remainder, pFirstOperand, pSecondOperand, bnctx); - - BN_CTX_free(bnctx); -} - -VOID Bignum_Mod_Mul(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result) -{ - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_mul(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx); - - BN_CTX_free(bnctx); -} - -UCHAR Bignum_is_zero(IN BIGNUM *pBI) -{ - return (UCHAR)BN_is_zero(pBI); -} - -UCHAR Bignum_is_one(IN BIGNUM *pBI) -{ - return (UCHAR)BN_is_one(pBI); -} - -UCHAR Bignum_is_odd(IN BIGNUM *pBI) -{ - return (UCHAR)BN_is_odd(pBI); -} - -VOID Bignum_Mod_Square(IN BIGNUM *pFirstOperand, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result) -{ - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_sqr(*pBI_Result, pFirstOperand, pBI_P, bnctx); - BN_CTX_free(bnctx); -} - -VOID Bignum_Mod_Add(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result) -{ - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_add(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx); - BN_CTX_free(bnctx); -} - -VOID Bignum_Mod_Sub(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result) -{ - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_sub(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx); - BN_CTX_free(bnctx); -} - -VOID Bignum_Mod_Add_quick(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result) -{ - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_add_quick(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P); -} - -VOID Bignum_Mod_Sub_quick(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result) -{ - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_sub_quick(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P); -} - -VOID Bignum_Mod_Div(IN BIGNUM *pFirstOperand, IN BIGNUM *pSecondOperand, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result) -{ - BIGNUM *tmp = NULL; - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - - tmp = BN_CTX_get(bnctx); - - BN_mod_inverse(tmp, pSecondOperand, pBI_P, bnctx); - - Bignum_Mod_Mul(pFirstOperand, tmp, pBI_P, pBI_Result); - - BN_CTX_free(bnctx); -} - -/* Tonelli¡VShanks algorithm*/ -/* reference: https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm */ -/* pBI_P must be prime */ -VOID Bignum_Mod_Sqrt(IN BIGNUM *pFirstOperand, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result) -{ - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_sqrt(*pBI_Result, pFirstOperand, pBI_P, bnctx); - BN_CTX_free(bnctx); -} - -VOID Bignum_Shift_Right1(IN BIGNUM *pBI, OUT BIGNUM **pBI_Result) -{ - BN_copy(*pBI_Result, pBI); - BN_div_word(*pBI_Result, 2); -} - -VOID Bignum_Mod_Shift_Left1(IN BIGNUM *pBI, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result) -{ - BN_mod_lshift1_quick(*pBI_Result, pBI, pBI_P); -} - -VOID Bignum_Mod_Shift_Left(IN BIGNUM *pBI, IN UCHAR bit, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result) -{ - BN_mod_lshift_quick(*pBI_Result, pBI, bit, pBI_P); -} - -/* an integer q is called a quadratic residue modulo n if it is congruent to a perfect square modulo n */ -UCHAR Bignum_is_quadratic_residue(IN BIGNUM *q, IN BIGNUM *prime) -{ - BIGNUM *p = NULL; - BIGNUM *res = NULL; - UCHAR ret; - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - res = BN_CTX_get(bnctx); - - Bignum_Copy(prime, &p); - BN_sub_word(p, 1); - Bignum_Shift_Right1(p, &p); - BN_mod_exp_mont(res, q, p, prime, bnctx, NULL); - ret = Bignum_is_one(res); - - BN_CTX_free(bnctx); - BN_free(p); - return ret; -} - -VOID Bignum_Add_DW(INOUT BIGNUM *pBI, IN UINT32 value) -{ - return; -} - -VOID Bignum_Mod_DW(INOUT BIGNUM *pBI, IN UINT32 value, OUT UINT32 *rem) -{ - *rem = pBI->d[0] & (value - 1); - pBI->d[0] &= ~(value - 1); -} - -VOID Bignum_Montgomery_ExpMod(IN BIGNUM *pBI_G, IN BIGNUM *pBI_E, - IN BIGNUM *pBI_P, OUT BIGNUM **pBI_Result) -{ - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_exp_mont(*pBI_Result, pBI_G, pBI_E, pBI_P, bnctx, NULL); - - BN_CTX_free(bnctx); -} - -VOID Bignum_Mod_Mul_Inverse(IN BIGNUM *pBI, IN BIGNUM *pBI_P, - OUT BIGNUM **pBI_Result) -{ - BN_CTX *bnctx; - - bnctx = BN_CTX_new(); - - if (*pBI_Result == NULL) - *pBI_Result = BN_new(); - - BN_mod_inverse(*pBI_Result, pBI, pBI_P, bnctx); - - BN_CTX_free(bnctx); -} - -/* End of crypt_Bignum.c */ - -#endif /* DOT11_SAE_OPENSSL_BN */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_dh.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_dh.c deleted file mode 100644 index b97b84ac6e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_dh.c +++ /dev/null @@ -1,235 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - DH - - Abstract: - RFC 2631: Diffie-Hellman Key Agreement Method - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2009/01/21 Create Diffie-Hellman -***************************************************************************/ - -#include "security/crypt_dh.h" -#include "security/crypt_biginteger.h" -#include "rt_config.h" - -/* -======================================================================== -Routine Description: - Diffie-Hellman public key generation - -Arguments: - GValue Array in UINT8 - GValueLength The length of G in bytes - PValue Array in UINT8 - PValueLength The length of P in bytes - PrivateKey Private key - PrivateKeyLength The length of Private key in bytes - -Return Value: - PublicKey Public key - PublicKeyLength The length of public key in bytes - -Note: - Reference to RFC2631 - PublicKey = G^PrivateKey (mod P) -======================================================================== -*/ -void DH_PublicKey_Generate(IN UINT8 GValue[], IN UINT GValueLength, - IN UINT8 PValue[], IN UINT PValueLength, - IN UINT8 PrivateKey[], IN UINT PrivateKeyLength, - OUT UINT8 PublicKey[], INOUT UINT *PublicKeyLength) -{ - PBIG_INTEGER pBI_G = NULL; - PBIG_INTEGER pBI_P = NULL; - PBIG_INTEGER pBI_PrivateKey = NULL; - PBIG_INTEGER pBI_PublicKey = NULL; - - /* - * 1. Check the input parameters - * - GValueLength, PValueLength and PrivateLength must be large than zero - * - PublicKeyLength must be large or equal than PValueLength - * - PValue must be odd - * - * - PValue must be prime number (no implement) - * - GValue must be greater than 0 but less than the PValue (no implement) - */ - if (GValueLength == 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_PublicKey_Generate: G length is (%d)\n", - GValueLength)); - return; - } /* End of if */ - - if (PValueLength == 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_PublicKey_Generate: P length is (%d)\n", - PValueLength)); - return; - } /* End of if */ - - if (PrivateKeyLength == 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_PublicKey_Generate: private key length is (%d)\n", - PrivateKeyLength)); - return; - } /* End of if */ - - if (*PublicKeyLength < PValueLength) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_PublicKey_Generate: public key length(%d) must be large or equal than P length(%d)\n", - *PublicKeyLength, PValueLength)); - return; - } /* End of if */ - - if (!(PValue[PValueLength - 1] & 0x1)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_PublicKey_Generate: P value must be odd\n")); - return; - } /* End of if */ - - /* - * 2. Transfer parameters to BigInteger structure - */ - BigInteger_Init(&pBI_G); - BigInteger_Init(&pBI_P); - BigInteger_Init(&pBI_PrivateKey); - BigInteger_Init(&pBI_PublicKey); - BigInteger_Bin2BI(GValue, GValueLength, &pBI_G); - BigInteger_Bin2BI(PValue, PValueLength, &pBI_P); - BigInteger_Bin2BI(PrivateKey, PrivateKeyLength, &pBI_PrivateKey); - /* - * 3. Calculate PublicKey = G^PrivateKey (mod P) - * - BigInteger Operation - * - Montgomery reduction - */ - BigInteger_Montgomery_ExpMod(pBI_G, pBI_PrivateKey, pBI_P, - &pBI_PublicKey); - /* - * 4. Transfer BigInteger structure to char array - */ - BigInteger_BI2Bin(pBI_PublicKey, PublicKey, PublicKeyLength); - BigInteger_Free(&pBI_G); - BigInteger_Free(&pBI_P); - BigInteger_Free(&pBI_PrivateKey); - BigInteger_Free(&pBI_PublicKey); -} /* End of DH_PublicKey_Generate */ - -/* -======================================================================== -Routine Description: - Diffie-Hellman secret key generation - -Arguments: - PublicKey Public key - PublicKeyLength The length of Public key in bytes - PValue Array in UINT8 - PValueLength The length of P in bytes - PrivateKey Private key - PrivateKeyLength The length of Private key in bytes - -Return Value: - SecretKey Secret key - SecretKeyLength The length of secret key in bytes - -Note: - Reference to RFC2631 - SecretKey = PublicKey^PrivateKey (mod P) -======================================================================== -*/ -void DH_SecretKey_Generate(IN UINT8 PublicKey[], IN UINT PublicKeyLength, - IN UINT8 PValue[], IN UINT PValueLength, - IN UINT8 PrivateKey[], IN UINT PrivateKeyLength, - OUT UINT8 SecretKey[], INOUT UINT *SecretKeyLength) -{ - PBIG_INTEGER pBI_P = NULL; - PBIG_INTEGER pBI_SecretKey = NULL; - PBIG_INTEGER pBI_PrivateKey = NULL; - PBIG_INTEGER pBI_PublicKey = NULL; - - /* - * 1. Check the input parameters - * - PublicKeyLength, PValueLength and PrivateLength must be large than zero - * - SecretKeyLength must be large or equal than PValueLength - * - PValue must be odd - * - * - PValue must be prime number (no implement) - */ - if (PublicKeyLength == 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_SecretKey_Generate: public key length is (%d)\n", - PublicKeyLength)); - return; - } /* End of if */ - - if (PValueLength == 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_SecretKey_Generate: P length is (%d)\n", - PValueLength)); - return; - } /* End of if */ - - if (PrivateKeyLength == 0) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_SecretKey_Generate: private key length is (%d)\n", - PrivateKeyLength)); - return; - } /* End of if */ - - if (*SecretKeyLength < PValueLength) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_SecretKey_Generate: secret key length(%d) must be large or equal than P length(%d)\n", - *SecretKeyLength, PValueLength)); - return; - } /* End of if */ - - if (!(PValue[PValueLength - 1] & 0x1)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("DH_SecretKey_Generate: P value must be odd\n")); - return; - } /* End of if */ - - /* - * 2. Transfer parameters to BigInteger structure - */ - BigInteger_Init(&pBI_P); - BigInteger_Init(&pBI_PrivateKey); - BigInteger_Init(&pBI_PublicKey); - BigInteger_Init(&pBI_SecretKey); - BigInteger_Bin2BI(PublicKey, PublicKeyLength, &pBI_PublicKey); - BigInteger_Bin2BI(PValue, PValueLength, &pBI_P); - BigInteger_Bin2BI(PrivateKey, PrivateKeyLength, &pBI_PrivateKey); - /* - * 3. Calculate SecretKey = PublicKey^PrivateKey (mod P) - * - BigInteger Operation - * - Montgomery reduction - */ - BigInteger_Montgomery_ExpMod(pBI_PublicKey, pBI_PrivateKey, pBI_P, - &pBI_SecretKey); - /* - * 4. Transfer BigInteger structure to char array - */ - BigInteger_BI2Bin(pBI_SecretKey, SecretKey, SecretKeyLength); - BigInteger_Free(&pBI_P); - BigInteger_Free(&pBI_PrivateKey); - BigInteger_Free(&pBI_PublicKey); - BigInteger_Free(&pBI_SecretKey); -} /* End of DH_SecretKey_Generate */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_hmac.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_hmac.c deleted file mode 100644 index bf60d1954f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_hmac.c +++ /dev/null @@ -1,520 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - HMAC - - Abstract: - FIPS 198: The Keyed-Hash Message Authentication Code (HMAC) - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2008/11/24 Create HMAC-SHA1, HMAC-SHA256 -***************************************************************************/ - -#include "security/crypt_hmac.h" -#include "rt_config.h" - -#ifdef SHA1_SUPPORT -/* -======================================================================== -Routine Description: - HMAC using SHA1 hash function - -Arguments: - key Secret key - key_len The length of the key in bytes - message Message context - message_len The length of message in bytes - macLen Request the length of message authentication code - -Return Value: - mac Message authentication code - -Note: - None -======================================================================== -*/ -VOID RT_HMAC_SHA1(IN const UINT8 Key[], IN UINT KeyLen, - IN const UINT8 Message[], IN UINT MessageLen, OUT UINT8 MAC[], - IN UINT MACLen) -{ - SHA1_CTX_STRUC sha_ctx1; - SHA1_CTX_STRUC sha_ctx2; - UINT8 K0[SHA1_BLOCK_SIZE]; - UINT8 Digest[SHA1_DIGEST_SIZE]; - UINT index; - - NdisZeroMemory(&sha_ctx1, sizeof(SHA1_CTX_STRUC)); - NdisZeroMemory(&sha_ctx2, sizeof(SHA1_CTX_STRUC)); - /* - * If the length of K = B(Block size): K0 = K. - * If the length of K > B: hash K to obtain an L byte string, - * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00). - * If the length of K < B: append zeros to the end of K to create a B-byte string K0 - */ - NdisZeroMemory(K0, SHA1_BLOCK_SIZE); - - if (KeyLen <= SHA1_BLOCK_SIZE) - NdisMoveMemory(K0, Key, KeyLen); - else - RT_SHA1(Key, KeyLen, K0); - - /* End of if */ - - /* Exclusive-Or K0 with ipad */ - /* ipad: Inner pad; the byte x 36 repeated B times. */ - for (index = 0; index < SHA1_BLOCK_SIZE; index++) - K0[index] ^= 0x36; - - /* End of for */ - RT_SHA1_Init(&sha_ctx1); - /* H(K0^ipad) */ - RT_SHA1_Append(&sha_ctx1, K0, sizeof(K0)); - /* H((K0^ipad)||text) */ - RT_SHA1_Append(&sha_ctx1, Message, MessageLen); - RT_SHA1_End(&sha_ctx1, Digest); - - /* Exclusive-Or K0 with opad and remove ipad */ - /* opad: Outer pad; the byte x 5c repeated B times. */ - for (index = 0; index < SHA1_BLOCK_SIZE; index++) - K0[index] ^= 0x36 ^ 0x5c; - - /* End of for */ - RT_SHA1_Init(&sha_ctx2); - /* H(K0^opad) */ - RT_SHA1_Append(&sha_ctx2, K0, sizeof(K0)); - /* H( (K0^opad) || H((K0^ipad)||text) ) */ - RT_SHA1_Append(&sha_ctx2, Digest, SHA1_DIGEST_SIZE); - RT_SHA1_End(&sha_ctx2, Digest); - - if (MACLen > SHA1_DIGEST_SIZE) - NdisMoveMemory(MAC, Digest, SHA1_DIGEST_SIZE); - else - NdisMoveMemory(MAC, Digest, MACLen); -} /* End of RT_HMAC_SHA1 */ -#endif /* SHA1_SUPPORT */ - -#ifdef SHA256_SUPPORT -/* -======================================================================== -Routine Description: - HMAC using SHA256 hash function - -Arguments: - key Secret key - key_len The length of the key in bytes - message Message context - message_len The length of message in bytes - macLen Request the length of message authentication code - -Return Value: - mac Message authentication code - -Note: - None -======================================================================== -*/ -VOID RT_HMAC_SHA256(IN const UINT8 Key[], IN UINT KeyLen, - IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 MAC[], IN UINT MACLen) -{ - SHA256_CTX_STRUC sha_ctx1; - SHA256_CTX_STRUC sha_ctx2; - UINT8 K0[SHA256_BLOCK_SIZE]; - UINT8 Digest[SHA256_DIGEST_SIZE]; - UINT index; - - NdisZeroMemory(&sha_ctx1, sizeof(SHA256_CTX_STRUC)); - NdisZeroMemory(&sha_ctx2, sizeof(SHA256_CTX_STRUC)); - /* - * If the length of K = B(Block size): K0 = K. - * If the length of K > B: hash K to obtain an L byte string, - * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00). - * If the length of K < B: append zeros to the end of K to create a B-byte string K0 - */ - NdisZeroMemory(K0, SHA256_BLOCK_SIZE); - - if (KeyLen <= SHA256_BLOCK_SIZE) - NdisMoveMemory(K0, Key, KeyLen); - else - RT_SHA256(Key, KeyLen, K0); - - /* Exclusive-Or K0 with ipad */ - /* ipad: Inner pad; the byte x 36 repeated B times. */ - for (index = 0; index < SHA256_BLOCK_SIZE; index++) - K0[index] ^= 0x36; - - /* End of for */ - RT_SHA256_Init(&sha_ctx1); - /* H(K0^ipad) */ - RT_SHA256_Append(&sha_ctx1, K0, sizeof(K0)); - /* H((K0^ipad)||text) */ - RT_SHA256_Append(&sha_ctx1, Message, MessageLen); - RT_SHA256_End(&sha_ctx1, Digest); - - /* Exclusive-Or K0 with opad and remove ipad */ - /* opad: Outer pad; the byte x 5c repeated B times. */ - for (index = 0; index < SHA256_BLOCK_SIZE; index++) - K0[index] ^= 0x36 ^ 0x5c; - - /* End of for */ - RT_SHA256_Init(&sha_ctx2); - /* H(K0^opad) */ - RT_SHA256_Append(&sha_ctx2, K0, sizeof(K0)); - /* H( (K0^opad) || H((K0^ipad)||text) ) */ - RT_SHA256_Append(&sha_ctx2, Digest, SHA256_DIGEST_SIZE); - RT_SHA256_End(&sha_ctx2, Digest); - - if (MACLen > SHA256_DIGEST_SIZE) - NdisMoveMemory(MAC, Digest, SHA256_DIGEST_SIZE); - else - NdisMoveMemory(MAC, Digest, MACLen); -} /* End of RT_HMAC_SHA256 */ - -VOID RT_HMAC_SHA256_VECTOR(const UINT8 key[], IN UINT key_len, - IN UCHAR element_num, IN const UINT8 *message[], - IN UINT *message_len, OUT UINT8 mac[], - IN UINT mac_len) -{ - SHA256_CTX_STRUC sha_ctx1; - SHA256_CTX_STRUC sha_ctx2; - UINT8 K0[SHA256_BLOCK_SIZE]; - UINT8 Digest[SHA256_DIGEST_SIZE]; - UINT index; - const UCHAR *_addr[6]; - INT _len[6], i; - - NdisZeroMemory(&sha_ctx1, sizeof(SHA256_CTX_STRUC)); - NdisZeroMemory(&sha_ctx2, sizeof(SHA256_CTX_STRUC)); - /* - * If the length of K = B(Block size): K0 = K. - * If the length of K > B: hash K to obtain an L byte string, - * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00). - * If the length of K < B: append zeros to the end of K to create a B-byte string K0 - */ - NdisZeroMemory(K0, SHA256_BLOCK_SIZE); - - if (key_len <= SHA256_BLOCK_SIZE) - NdisMoveMemory(K0, key, key_len); - else - RT_SHA256(key, key_len, K0); - - /* Exclusive-Or K0 with ipad */ - /* ipad: Inner pad; the byte x??36?? repeated B times. */ - for (index = 0; index < SHA256_BLOCK_SIZE; index++) - K0[index] ^= 0x36; - - /* End of for */ - RT_SHA256_Init(&sha_ctx1); - /* H(K0^ipad) */ - - _addr[0] = K0; - _len[0] = sizeof(K0); - - for (i = 0; i < element_num; i++) { - _addr[i + 1] = message[i]; - _len[i + 1] = message_len[i]; - } - - rt_sha256_vector(element_num + 1, _addr, _len, Digest); - /* Exclusive-Or K0 with opad and remove ipad */ - /* opad: Outer pad; the byte x??5c?? repeated B times. */ - for (index = 0; index < SHA256_BLOCK_SIZE; index++) - K0[index] ^= 0x36 ^ 0x5c; - - /* End of for */ - RT_SHA256_Init(&sha_ctx2); - /* H(K0^opad) */ - RT_SHA256_Append(&sha_ctx2, K0, sizeof(K0)); - /* H( (K0^opad) || H((K0^ipad)||text) ) */ - RT_SHA256_Append(&sha_ctx2, Digest, SHA256_DIGEST_SIZE); - RT_SHA256_End(&sha_ctx2, Digest); - - if (mac_len > SHA256_DIGEST_SIZE) - NdisMoveMemory(mac, Digest, SHA256_DIGEST_SIZE); - else - NdisMoveMemory(mac, Digest, mac_len); -} - -#endif /* SHA256_SUPPORT */ - -#ifdef SHA384_SUPPORT -/* -======================================================================== -Routine Description: - HMAC using SHA256 hash function - -Arguments: - key Secret key - key_len The length of the key in bytes - message Message context - message_len The length of message in bytes - macLen Request the length of message authentication code - -Return Value: - mac Message authentication code - -Note: - None -======================================================================== -*/ -VOID RT_HMAC_SHA384(IN const UINT8 Key[], IN UINT KeyLen, - IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 MAC[], IN UINT MACLen) -{ - SHA384_CTX_STRUC *sha_ctx1 = NULL; - SHA384_CTX_STRUC *sha_ctx2 = NULL; - UINT8 *K0 = NULL; - UINT8 *Digest = NULL; - UINT index; - - os_alloc_mem(NULL, (UCHAR **)&sha_ctx1, sizeof(SHA384_CTX_STRUC)); - os_alloc_mem(NULL, (UCHAR **)&sha_ctx2, sizeof(SHA384_CTX_STRUC)); - os_alloc_mem(NULL, (UCHAR **)&K0, SHA384_BLOCK_SIZE); - os_alloc_mem(NULL, (UCHAR **)&Digest, SHA384_DIGEST_SIZE); - - if (!sha_ctx1 || !sha_ctx2 || !K0 || !Digest) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:Allocate memory failed!", __func__)); - goto end; - } - - NdisZeroMemory(sha_ctx1, sizeof(SHA384_CTX_STRUC)); - NdisZeroMemory(sha_ctx2, sizeof(SHA384_CTX_STRUC)); - /* - * If the length of K = B(Block size): K0 = K. - * If the length of K > B: hash K to obtain an L byte string, - * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00). - * If the length of K < B: append zeros to the end of K to create a B-byte string K0 - */ - NdisZeroMemory(K0, SHA384_BLOCK_SIZE); - NdisZeroMemory(Digest, SHA384_DIGEST_SIZE); - - if (KeyLen <= SHA384_BLOCK_SIZE) - NdisMoveMemory(K0, Key, KeyLen); - else - RT_SHA384(Key, KeyLen, K0); - - /* Exclusive-Or K0 with ipad */ - /* ipad: Inner pad; the byte x 36 repeated B times. */ - for (index = 0; index < SHA384_BLOCK_SIZE; index++) - K0[index] ^= 0x36; - - /* End of for */ - RT_SHA384_Init(sha_ctx1); - /* H(K0^ipad) */ - RT_SHA384_Append(sha_ctx1, K0, SHA384_BLOCK_SIZE); - /* H((K0^ipad)||text) */ - RT_SHA384_Append(sha_ctx1, Message, MessageLen); - RT_SHA384_End(sha_ctx1, Digest); - - /* Exclusive-Or K0 with opad and remove ipad */ - /* opad: Outer pad; the byte x 5c repeated B times. */ - for (index = 0; index < SHA384_BLOCK_SIZE; index++) - K0[index] ^= 0x36 ^ 0x5c; - - /* End of for */ - RT_SHA384_Init(sha_ctx2); - /* H(K0^opad) */ - RT_SHA384_Append(sha_ctx2, K0, SHA384_BLOCK_SIZE); - /* H( (K0^opad) || H((K0^ipad)||text) ) */ - RT_SHA384_Append(sha_ctx2, Digest, SHA384_DIGEST_SIZE); - RT_SHA384_End(sha_ctx2, Digest); - - if (MACLen > SHA384_DIGEST_SIZE) - NdisMoveMemory(MAC, Digest, SHA384_DIGEST_SIZE); - else - NdisMoveMemory(MAC, Digest, MACLen); - -end: - if (sha_ctx1) - os_free_mem(sha_ctx1); - if (sha_ctx2) - os_free_mem(sha_ctx2); - if (K0) - os_free_mem(K0); - if (Digest) - os_free_mem(Digest); -} /* End of RT_HMAC_SHA384 */ - -VOID RT_HMAC_SHA384_VECTOR(const UINT8 key[], IN UINT key_len, - IN UCHAR element_num, IN const UINT8 *message[], - IN UINT *message_len, OUT UINT8 mac[], - IN UINT mac_len) -{ - SHA384_CTX_STRUC *sha_ctx1 = NULL; - SHA384_CTX_STRUC *sha_ctx2 = NULL; - UINT8 *K0 = NULL; - UINT8 *Digest = NULL; - UINT index; - const UCHAR *_addr[6]; - INT _len[6], i; - - os_alloc_mem(NULL, (UCHAR **)&sha_ctx1, sizeof(SHA384_CTX_STRUC)); - os_alloc_mem(NULL, (UCHAR **)&sha_ctx2, sizeof(SHA384_CTX_STRUC)); - os_alloc_mem(NULL, (UCHAR **)&K0, SHA384_BLOCK_SIZE); - os_alloc_mem(NULL, (UCHAR **)&Digest, SHA384_DIGEST_SIZE); - - if (!sha_ctx1 || !sha_ctx2 || !K0 || !Digest) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:Allocate memory failed!", __func__)); - goto end; - } - - NdisZeroMemory(sha_ctx1, sizeof(SHA384_CTX_STRUC)); - NdisZeroMemory(sha_ctx2, sizeof(SHA384_CTX_STRUC)); - /* - * If the length of K = B(Block size): K0 = K. - * If the length of K > B: hash K to obtain an L byte string, - * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00). - * If the length of K < B: append zeros to the end of K to create a B-byte string K0 - */ - NdisZeroMemory(K0, SHA384_BLOCK_SIZE); - NdisZeroMemory(Digest, SHA384_DIGEST_SIZE); - - if (key_len <= SHA384_BLOCK_SIZE) - NdisMoveMemory(K0, key, key_len); - else - RT_SHA384(key, key_len, K0); - - /* Exclusive-Or K0 with ipad */ - /* ipad: Inner pad; the byte x??36?? repeated B times. */ - for (index = 0; index < SHA384_BLOCK_SIZE; index++) - K0[index] ^= 0x36; - - /* End of for */ - RT_SHA384_Init(sha_ctx1); - /* H(K0^ipad) */ - - _addr[0] = K0; - _len[0] = SHA384_BLOCK_SIZE; - - for (i = 0; i < element_num; i++) { - _addr[i + 1] = message[i]; - _len[i + 1] = message_len[i]; - } - - rt_sha384_vector(element_num + 1, _addr, _len, Digest); - /* Exclusive-Or K0 with opad and remove ipad */ - /* opad: Outer pad; the byte x??5c?? repeated B times. */ - for (index = 0; index < SHA384_BLOCK_SIZE; index++) - K0[index] ^= 0x36 ^ 0x5c; - - /* End of for */ - RT_SHA384_Init(sha_ctx2); - /* H(K0^opad) */ - RT_SHA384_Append(sha_ctx2, K0, SHA384_BLOCK_SIZE); - /* H( (K0^opad) || H((K0^ipad)||text) ) */ - RT_SHA384_Append(sha_ctx2, Digest, SHA384_DIGEST_SIZE); - RT_SHA384_End(sha_ctx2, Digest); - - if (mac_len > SHA384_DIGEST_SIZE) - NdisMoveMemory(mac, Digest, SHA384_DIGEST_SIZE); - else - NdisMoveMemory(mac, Digest, mac_len); - -end: - if (sha_ctx1) - os_free_mem(sha_ctx1); - if (sha_ctx2) - os_free_mem(sha_ctx2); - if (K0) - os_free_mem(K0); - if (Digest) - os_free_mem(Digest); -} - -#endif /* SHA384_SUPPORT */ - -#ifdef MD5_SUPPORT -/* -======================================================================== -Routine Description: - HMAC using MD5 hash function - -Arguments: - key Secret key - key_len The length of the key in bytes - message Message context - message_len The length of message in bytes - macLen Request the length of message authentication code - -Return Value: - mac Message authentication code - -Note: - None -======================================================================== -*/ -VOID RT_HMAC_MD5(IN const UINT8 Key[], IN UINT KeyLen, IN const UINT8 Message[], - IN UINT MessageLen, OUT UINT8 MAC[], IN UINT MACLen) -{ - MD5_CTX_STRUC md5_ctx1; - MD5_CTX_STRUC md5_ctx2; - UINT8 K0[MD5_BLOCK_SIZE]; - UINT8 Digest[MD5_DIGEST_SIZE]; - UINT index; - - NdisZeroMemory(&md5_ctx1, sizeof(MD5_CTX_STRUC)); - NdisZeroMemory(&md5_ctx2, sizeof(MD5_CTX_STRUC)); - /* - * If the length of K = B(Block size): K0 = K. - * If the length of K > B: hash K to obtain an L byte string, - * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00). - * If the length of K < B: append zeros to the end of K to create a B-byte string K0 - */ - NdisZeroMemory(K0, MD5_BLOCK_SIZE); - - if (KeyLen <= MD5_BLOCK_SIZE) - NdisMoveMemory(K0, Key, KeyLen); - else - RT_MD5(Key, KeyLen, K0); - - /* Exclusive-Or K0 with ipad */ - /* ipad: Inner pad; the byte x 36 repeated B times. */ - for (index = 0; index < MD5_BLOCK_SIZE; index++) - K0[index] ^= 0x36; - - /* End of for */ - RT_MD5_Init(&md5_ctx1); - /* H(K0^ipad) */ - RT_MD5_Append(&md5_ctx1, K0, sizeof(K0)); - /* H((K0^ipad)||text) */ - RT_MD5_Append(&md5_ctx1, Message, MessageLen); - RT_MD5_End(&md5_ctx1, Digest); - - /* Exclusive-Or K0 with opad and remove ipad */ - /* opad: Outer pad; the byte x 5c repeated B times. */ - for (index = 0; index < MD5_BLOCK_SIZE; index++) - K0[index] ^= 0x36 ^ 0x5c; - - /* End of for */ - RT_MD5_Init(&md5_ctx2); - /* H(K0^opad) */ - RT_MD5_Append(&md5_ctx2, K0, sizeof(K0)); - /* H( (K0^opad) || H((K0^ipad)||text) ) */ - RT_MD5_Append(&md5_ctx2, Digest, MD5_DIGEST_SIZE); - RT_MD5_End(&md5_ctx2, Digest); - - if (MACLen > MD5_DIGEST_SIZE) - NdisMoveMemory(MAC, Digest, MD5_DIGEST_SIZE); - else - NdisMoveMemory(MAC, Digest, MACLen); -} /* End of RT_HMAC_SHA256 */ -#endif /* MD5_SUPPORT */ - -/* End of crypt_hmac.c */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_md5.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_md5.c deleted file mode 100644 index a6ccb99a40..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_md5.c +++ /dev/null @@ -1,337 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - MD5 - - Abstract: - RFC1321: The MD5 Message-Digest Algorithm - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2008/11/24 Create md5 -***************************************************************************/ - -#include "rt_config.h" - -#ifdef MD5_SUPPORT -/* - * F, G, H and I are basic MD5 functions. - */ -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) -#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define I(x, y, z) ((y) ^ ((x) | (~z))) - -#define ROTL(x, n, w) ((x << n) | (x >> (w - n))) -#define ROTL32(x, n) ROTL(x, n, 32) /* 32 bits word */ - -#define ROUND1(a, b, c, d, x, s, ac) \ - { \ - (a) += F((b), (c), (d)) + (x) + (UINT32)(ac); \ - (a) = ROTL32((a), (s)); \ - (a) += (b); \ - } -#define ROUND2(a, b, c, d, x, s, ac) \ - { \ - (a) += G((b), (c), (d)) + (x) + (UINT32)(ac); \ - (a) = ROTL32((a), (s)); \ - (a) += (b); \ - } -#define ROUND3(a, b, c, d, x, s, ac) \ - { \ - (a) += H((b), (c), (d)) + (x) + (UINT32)(ac); \ - (a) = ROTL32((a), (s)); \ - (a) += (b); \ - } -#define ROUND4(a, b, c, d, x, s, ac) \ - { \ - (a) += I((b), (c), (d)) + (x) + (UINT32)(ac); \ - (a) = ROTL32((a), (s)); \ - (a) += (b); \ - } -static const UINT32 MD5_DefaultHashValue[4] = { 0x67452301UL, 0xefcdab89UL, - 0x98badcfeUL, 0x10325476UL }; -#endif /* MD5_SUPPORT */ - -#ifdef MD5_SUPPORT -/* -======================================================================== -Routine Description: - Initial Md5_CTX_STRUC - -Arguments: - pMD5_CTX Pointer to Md5_CTX_STRUC - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_MD5_Init(IN MD5_CTX_STRUC *pMD5_CTX) -{ - NdisMoveMemory(pMD5_CTX->HashValue, MD5_DefaultHashValue, - sizeof(MD5_DefaultHashValue)); - NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE); - pMD5_CTX->BlockLen = 0; - pMD5_CTX->MessageLen = 0; -} /* End of RT_MD5_Init */ - -/* -======================================================================== -Routine Description: - MD5 computation for one block (512 bits) - -Arguments: - pMD5_CTX Pointer to Md5_CTX_STRUC - -Return Value: - None - -Note: - T[i] := floor(abs(sin(i + 1)) * (2 pow 32)), i is number of round -======================================================================== -*/ -VOID RT_MD5_Hash(IN MD5_CTX_STRUC *pMD5_CTX) -{ - UINT32 X_i; - UINT32 X[16]; - UINT32 a, b, c, d; - /* Prepare the message schedule, {X_i} */ - NdisMoveMemory(X, pMD5_CTX->Block, MD5_BLOCK_SIZE); - - for (X_i = 0; X_i < 16; X_i++) - X[X_i] = cpu2le32(X[X_i]); /* Endian Swap */ - - /* End of for */ - /* MD5 hash computation */ - /* Initialize the working variables */ - a = pMD5_CTX->HashValue[0]; - b = pMD5_CTX->HashValue[1]; - c = pMD5_CTX->HashValue[2]; - d = pMD5_CTX->HashValue[3]; - /* - * Round 1 - * Let [abcd k s i] denote the operation - * a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s) - */ - ROUND1(a, b, c, d, X[0], 7, 0xd76aa478); /* 1 */ - ROUND1(d, a, b, c, X[1], 12, 0xe8c7b756); /* 2 */ - ROUND1(c, d, a, b, X[2], 17, 0x242070db); /* 3 */ - ROUND1(b, c, d, a, X[3], 22, 0xc1bdceee); /* 4 */ - ROUND1(a, b, c, d, X[4], 7, 0xf57c0faf); /* 5 */ - ROUND1(d, a, b, c, X[5], 12, 0x4787c62a); /* 6 */ - ROUND1(c, d, a, b, X[6], 17, 0xa8304613); /* 7 */ - ROUND1(b, c, d, a, X[7], 22, 0xfd469501); /* 8 */ - ROUND1(a, b, c, d, X[8], 7, 0x698098d8); /* 9 */ - ROUND1(d, a, b, c, X[9], 12, 0x8b44f7af); /* 10 */ - ROUND1(c, d, a, b, X[10], 17, 0xffff5bb1); /* 11 */ - ROUND1(b, c, d, a, X[11], 22, 0x895cd7be); /* 12 */ - ROUND1(a, b, c, d, X[12], 7, 0x6b901122); /* 13 */ - ROUND1(d, a, b, c, X[13], 12, 0xfd987193); /* 14 */ - ROUND1(c, d, a, b, X[14], 17, 0xa679438e); /* 15 */ - ROUND1(b, c, d, a, X[15], 22, 0x49b40821); /* 16 */ - /* - * Round 2 - * Let [abcd k s i] denote the operation - * a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s) - */ - ROUND2(a, b, c, d, X[1], 5, 0xf61e2562); /* 17 */ - ROUND2(d, a, b, c, X[6], 9, 0xc040b340); /* 18 */ - ROUND2(c, d, a, b, X[11], 14, 0x265e5a51); /* 19 */ - ROUND2(b, c, d, a, X[0], 20, 0xe9b6c7aa); /* 20 */ - ROUND2(a, b, c, d, X[5], 5, 0xd62f105d); /* 21 */ - ROUND2(d, a, b, c, X[10], 9, 0x2441453); /* 22 */ - ROUND2(c, d, a, b, X[15], 14, 0xd8a1e681); /* 23 */ - ROUND2(b, c, d, a, X[4], 20, 0xe7d3fbc8); /* 24 */ - ROUND2(a, b, c, d, X[9], 5, 0x21e1cde6); /* 25 */ - ROUND2(d, a, b, c, X[14], 9, 0xc33707d6); /* 26 */ - ROUND2(c, d, a, b, X[3], 14, 0xf4d50d87); /* 27 */ - ROUND2(b, c, d, a, X[8], 20, 0x455a14ed); /* 28 */ - ROUND2(a, b, c, d, X[13], 5, 0xa9e3e905); /* 29 */ - ROUND2(d, a, b, c, X[2], 9, 0xfcefa3f8); /* 30 */ - ROUND2(c, d, a, b, X[7], 14, 0x676f02d9); /* 31 */ - ROUND2(b, c, d, a, X[12], 20, 0x8d2a4c8a); /* 32 */ - /* - * Round 3 - * Let [abcd k s t] denote the operation - * a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s) - */ - ROUND3(a, b, c, d, X[5], 4, 0xfffa3942); /* 33 */ - ROUND3(d, a, b, c, X[8], 11, 0x8771f681); /* 34 */ - ROUND3(c, d, a, b, X[11], 16, 0x6d9d6122); /* 35 */ - ROUND3(b, c, d, a, X[14], 23, 0xfde5380c); /* 36 */ - ROUND3(a, b, c, d, X[1], 4, 0xa4beea44); /* 37 */ - ROUND3(d, a, b, c, X[4], 11, 0x4bdecfa9); /* 38 */ - ROUND3(c, d, a, b, X[7], 16, 0xf6bb4b60); /* 39 */ - ROUND3(b, c, d, a, X[10], 23, 0xbebfbc70); /* 40 */ - ROUND3(a, b, c, d, X[13], 4, 0x289b7ec6); /* 41 */ - ROUND3(d, a, b, c, X[0], 11, 0xeaa127fa); /* 42 */ - ROUND3(c, d, a, b, X[3], 16, 0xd4ef3085); /* 43 */ - ROUND3(b, c, d, a, X[6], 23, 0x4881d05); /* 44 */ - ROUND3(a, b, c, d, X[9], 4, 0xd9d4d039); /* 45 */ - ROUND3(d, a, b, c, X[12], 11, 0xe6db99e5); /* 46 */ - ROUND3(c, d, a, b, X[15], 16, 0x1fa27cf8); /* 47 */ - ROUND3(b, c, d, a, X[2], 23, 0xc4ac5665); /* 48 */ - /* - * Round 4 - * Let [abcd k s t] denote the operation - * a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s) - */ - ROUND4(a, b, c, d, X[0], 6, 0xf4292244); /* 49 */ - ROUND4(d, a, b, c, X[7], 10, 0x432aff97); /* 50 */ - ROUND4(c, d, a, b, X[14], 15, 0xab9423a7); /* 51 */ - ROUND4(b, c, d, a, X[5], 21, 0xfc93a039); /* 52 */ - ROUND4(a, b, c, d, X[12], 6, 0x655b59c3); /* 53 */ - ROUND4(d, a, b, c, X[3], 10, 0x8f0ccc92); /* 54 */ - ROUND4(c, d, a, b, X[10], 15, 0xffeff47d); /* 55 */ - ROUND4(b, c, d, a, X[1], 21, 0x85845dd1); /* 56 */ - ROUND4(a, b, c, d, X[8], 6, 0x6fa87e4f); /* 57 */ - ROUND4(d, a, b, c, X[15], 10, 0xfe2ce6e0); /* 58 */ - ROUND4(c, d, a, b, X[6], 15, 0xa3014314); /* 59 */ - ROUND4(b, c, d, a, X[13], 21, 0x4e0811a1); /* 60 */ - ROUND4(a, b, c, d, X[4], 6, 0xf7537e82); /* 61 */ - ROUND4(d, a, b, c, X[11], 10, 0xbd3af235); /* 62 */ - ROUND4(c, d, a, b, X[2], 15, 0x2ad7d2bb); /* 63 */ - ROUND4(b, c, d, a, X[9], 21, 0xeb86d391); /* 64 */ - /* Compute the i^th intermediate hash value H^(i) */ - pMD5_CTX->HashValue[0] += a; - pMD5_CTX->HashValue[1] += b; - pMD5_CTX->HashValue[2] += c; - pMD5_CTX->HashValue[3] += d; - NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE); - pMD5_CTX->BlockLen = 0; -} /* End of RT_MD5_Hash */ - -/* -======================================================================== -Routine Description: - The message is appended to block. If block size > 64 bytes, the MD5_Hash -will be called. - -Arguments: - pMD5_CTX Pointer to MD5_CTX_STRUC - message Message context - messageLen The length of message in bytes - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_MD5_Append(IN MD5_CTX_STRUC *pMD5_CTX, IN const UINT8 Message[], - IN UINT MessageLen) -{ - UINT appendLen = 0; - UINT diffLen = 0; - - while (appendLen != MessageLen) { - diffLen = MessageLen - appendLen; - - if ((pMD5_CTX->BlockLen + diffLen) < MD5_BLOCK_SIZE) { - NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, - Message + appendLen, diffLen); - pMD5_CTX->BlockLen += diffLen; - appendLen += diffLen; - } else { - NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, - Message + appendLen, - MD5_BLOCK_SIZE - pMD5_CTX->BlockLen); - appendLen += (MD5_BLOCK_SIZE - pMD5_CTX->BlockLen); - pMD5_CTX->BlockLen = MD5_BLOCK_SIZE; - RT_MD5_Hash(pMD5_CTX); - } /* End of if */ - } /* End of while */ - - pMD5_CTX->MessageLen += MessageLen; -} /* End of RT_MD5_Append */ - -/* -======================================================================== -Routine Description: - 1. Append bit 1 to end of the message - 2. Append the length of message in rightmost 64 bits - 3. Transform the Hash Value to digest message - -Arguments: - pMD5_CTX Pointer to MD5_CTX_STRUC - -Return Value: - digestMessage Digest message - -Note: - None -======================================================================== -*/ -VOID RT_MD5_End(IN MD5_CTX_STRUC *pMD5_CTX, OUT UINT8 DigestMessage[]) -{ - UINT index; - UINT64 message_length_bits; - /* append 1 bits to end of the message */ - NdisFillMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, 1, 0x80); - - /* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */ - if (pMD5_CTX->BlockLen > 55) - RT_MD5_Hash(pMD5_CTX); - - /* End of if */ - /* Append the length of message in rightmost 64 bits */ - message_length_bits = pMD5_CTX->MessageLen * 8; - message_length_bits = cpu2le64(message_length_bits); - NdisMoveMemory(&pMD5_CTX->Block[56], &message_length_bits, 8); - RT_MD5_Hash(pMD5_CTX); - - /* Return message digest, transform the UINT32 hash value to bytes */ - for (index = 0; index < 4; index++) - pMD5_CTX->HashValue[index] = - cpu2le32(pMD5_CTX->HashValue[index]); - - NdisMoveMemory(DigestMessage, pMD5_CTX->HashValue, MD5_DIGEST_SIZE); -} /* End of RT_MD5_End */ - -/* -======================================================================== -Routine Description: - MD5 algorithm - -Arguments: - message Message context - messageLen The length of message in bytes - -Return Value: - digestMessage Digest message - -Note: - None -======================================================================== -*/ -VOID RT_MD5(IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 DigestMessage[]) -{ - MD5_CTX_STRUC md5_ctx; - - NdisZeroMemory(&md5_ctx, sizeof(MD5_CTX_STRUC)); - RT_MD5_Init(&md5_ctx); - RT_MD5_Append(&md5_ctx, Message, MessageLen); - RT_MD5_End(&md5_ctx, DigestMessage); -} /* End of RT_MD5 */ -#endif /* MD5_SUPPORT */ - -/* End of crypt_md5.c */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_sha2.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_sha2.c deleted file mode 100644 index f9b3587182..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/crypt_sha2.c +++ /dev/null @@ -1,830 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Module Name: - SHA2 - - Abstract: - FIPS 180-2: Secure Hash Standard (SHS) - - Revision History: - Who When What - -------- ---------- ------------------------------------------ - Eddy 2008/11/24 Create SHA1 - Eddy 2008/07/23 Create SHA256 -***************************************************************************/ - -#include "rt_config.h" - -/* Basic operations */ -#define SHR(x, n) \ - (x >> \ - n) /* SHR(x)^n, right shift n bits , x is w-bit word, 0 <= n <= w */ -#define ROTR(x, n, w) \ - ((x >> n) | \ - (x \ - << (w - \ - n))) /* ROTR(x)^n, circular right shift n bits , x is w-bit word, 0 <= n <= w */ -#define ROTL(x, n, w) \ - ((x << n) | \ - (x >> \ - (w - \ - n))) /* ROTL(x)^n, circular left shift n bits , x is w-bit word, 0 <= n <= w */ -#define ROTR32(x, n) ROTR(x, n, 32) /* 32 bits word */ -#define ROTL32(x, n) ROTL(x, n, 32) /* 32 bits word */ -#define ROTR64(x, n) ROTR(x, n, 64) /* 64 bits word */ -#define ROTL64(x, n) ROTL(x, n, 64) /* 64 bits word */ - -/* Basic functions */ -#define Ch(x, y, z) ((x & y) ^ ((~x) & z)) -#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) -#define Parity(x, y, z) (x ^ y ^ z) - -#ifdef SHA1_SUPPORT -/* SHA1 constants */ -#define SHA1_MASK 0x0000000f -static const UINT32 SHA1_K[4] = { 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, - 0xca62c1d6 }; -static const UINT32 SHA1_DefaultHashValue[5] = { 0x67452301, 0xefcdab89, - 0x98badcfe, 0x10325476, - 0xc3d2e1f0 }; -#endif /* SHA1_SUPPORT */ - -#ifdef SHA256_SUPPORT -/* SHA256 functions */ -#define Zsigma_256_0(x) (ROTR32(x, 2) ^ ROTR32(x, 13) ^ ROTR32(x, 22)) -#define Zsigma_256_1(x) (ROTR32(x, 6) ^ ROTR32(x, 11) ^ ROTR32(x, 25)) -#define Sigma_256_0(x) (ROTR32(x, 7) ^ ROTR32(x, 18) ^ SHR(x, 3)) -#define Sigma_256_1(x) (ROTR32(x, 17) ^ ROTR32(x, 19) ^ SHR(x, 10)) -/* SHA256 constants */ -static const UINT32 SHA256_K[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, - 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, - 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, - 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, - 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, - 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -}; -static const UINT32 SHA256_DefaultHashValue[8] = { 0x6a09e667, 0xbb67ae85, - 0x3c6ef372, 0xa54ff53a, - 0x510e527f, 0x9b05688c, - 0x1f83d9ab, 0x5be0cd19 }; -#endif /* SHA256_SUPPORT */ - -#ifdef SHA384_SUPPORT -/* SHA384 functions */ -#define Zsigma_512_0(x) (ROTR64(x, 28) ^ ROTR64(x, 34) ^ ROTR64(x, 39)) -#define Zsigma_512_1(x) (ROTR64(x, 14) ^ ROTR64(x, 18) ^ ROTR64(x, 41)) -#define Sigma_512_0(x) (ROTR64(x, 1) ^ ROTR64(x, 8) ^ SHR(x, 7)) -#define Sigma_512_1(x) (ROTR64(x, 19) ^ ROTR64(x, 61) ^ SHR(x, 6)) -/* SHA384 constants */ -static const UINT64 SHA384_K[80] = { - 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, - 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, - 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, - 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, - 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, - 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, - 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, - 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, - 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, - 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, - 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, - 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, - 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, - 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, - 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, - 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, - 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, - 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, - 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, - 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, - 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, - 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, - 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, - 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, - 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, - 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, - 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 -}; -static const UINT64 SHA384_DefaultHashValue[8] = { - 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, - 0x152fecd8f70e5939, 0x67332667ffc00b31, 0x8eb44a8768581511, - 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4 -}; -#endif /* SHA384_SUPPORT */ - -#ifdef SHA1_SUPPORT -/* -======================================================================== -Routine Description: - Initial SHA1_CTX_STRUC - -Arguments: - pSHA_CTX Pointer to SHA1_CTX_STRUC - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA1_Init(IN SHA1_CTX_STRUC *pSHA_CTX) -{ - NdisMoveMemory(pSHA_CTX->HashValue, SHA1_DefaultHashValue, - sizeof(SHA1_DefaultHashValue)); - NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE); - pSHA_CTX->MessageLen = 0; - pSHA_CTX->BlockLen = 0; -} /* End of RT_SHA1_Init */ - -/* -======================================================================== -Routine Description: - SHA1 computation for one block (512 bits) - -Arguments: - pSHA_CTX Pointer to SHA1_CTX_STRUC - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA1_Hash(IN SHA1_CTX_STRUC *pSHA_CTX) -{ - UINT32 W_i, t; - UINT32 W[80]; - UINT32 a, b, c, d, e, T, f_t = 0; - /* Prepare the message schedule, {W_i}, 0 < t < 15 */ - NdisMoveMemory(W, pSHA_CTX->Block, SHA1_BLOCK_SIZE); - - for (W_i = 0; W_i < 16; W_i++) - W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */ - - for (W_i = 16; W_i < 80; W_i++) - W[W_i] = ROTL32((W[W_i - 3] ^ W[W_i - 8] ^ W[W_i - 14] ^ - W[W_i - 16]), - 1); - - /* SHA256 hash computation */ - /* Initialize the working variables */ - a = pSHA_CTX->HashValue[0]; - b = pSHA_CTX->HashValue[1]; - c = pSHA_CTX->HashValue[2]; - d = pSHA_CTX->HashValue[3]; - e = pSHA_CTX->HashValue[4]; - - /* 80 rounds */ - for (t = 0; t < 20; t++) { - f_t = Ch(b, c, d); - T = ROTL32(a, 5) + f_t + e + SHA1_K[0] + W[t]; - e = d; - d = c; - c = ROTL32(b, 30); - b = a; - a = T; - } /* End of for */ - - for (t = 20; t < 40; t++) { - f_t = Parity(b, c, d); - T = ROTL32(a, 5) + f_t + e + SHA1_K[1] + W[t]; - e = d; - d = c; - c = ROTL32(b, 30); - b = a; - a = T; - } /* End of for */ - - for (t = 40; t < 60; t++) { - f_t = Maj(b, c, d); - T = ROTL32(a, 5) + f_t + e + SHA1_K[2] + W[t]; - e = d; - d = c; - c = ROTL32(b, 30); - b = a; - a = T; - } /* End of for */ - - for (t = 60; t < 80; t++) { - f_t = Parity(b, c, d); - T = ROTL32(a, 5) + f_t + e + SHA1_K[3] + W[t]; - e = d; - d = c; - c = ROTL32(b, 30); - b = a; - a = T; - } /* End of for */ - - /* Compute the i^th intermediate hash value H^(i) */ - pSHA_CTX->HashValue[0] += a; - pSHA_CTX->HashValue[1] += b; - pSHA_CTX->HashValue[2] += c; - pSHA_CTX->HashValue[3] += d; - pSHA_CTX->HashValue[4] += e; - NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE); - pSHA_CTX->BlockLen = 0; -} /* End of RT_SHA1_Hash */ - -/* -======================================================================== -Routine Description: - The message is appended to block. If block size > 64 bytes, the SHA1_Hash -will be called. - -Arguments: - pSHA_CTX Pointer to SHA1_CTX_STRUC - message Message context - messageLen The length of message in bytes - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA1_Append(IN SHA1_CTX_STRUC *pSHA_CTX, IN const UINT8 Message[], - IN UINT MessageLen) -{ - UINT appendLen = 0; - UINT diffLen = 0; - - while (appendLen != MessageLen) { - diffLen = MessageLen - appendLen; - - if ((pSHA_CTX->BlockLen + diffLen) < SHA1_BLOCK_SIZE) { - NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, - Message + appendLen, diffLen); - pSHA_CTX->BlockLen += diffLen; - appendLen += diffLen; - } else { - NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, - Message + appendLen, - SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen); - appendLen += (SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen); - pSHA_CTX->BlockLen = SHA1_BLOCK_SIZE; - RT_SHA1_Hash(pSHA_CTX); - } /* End of if */ - } /* End of while */ - - pSHA_CTX->MessageLen += MessageLen; -} /* End of RT_SHA1_Append */ - -/* -======================================================================== -Routine Description: - 1. Append bit 1 to end of the message - 2. Append the length of message in rightmost 64 bits - 3. Transform the Hash Value to digest message - -Arguments: - pSHA_CTX Pointer to SHA1_CTX_STRUC - -Return Value: - digestMessage Digest message - -Note: - None -======================================================================== -*/ -VOID RT_SHA1_End(IN SHA1_CTX_STRUC *pSHA_CTX, OUT UINT8 DigestMessage[]) -{ - UINT index; - UINT64 message_length_bits; - /* Append bit 1 to end of the message */ - NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80); - - /* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */ - if (pSHA_CTX->BlockLen > 55) - RT_SHA1_Hash(pSHA_CTX); - - /* End of if */ - /* Append the length of message in rightmost 64 bits */ - message_length_bits = pSHA_CTX->MessageLen * 8; - message_length_bits = cpu2be64(message_length_bits); - NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8); - RT_SHA1_Hash(pSHA_CTX); - - /* Return message digest, transform the UINT32 hash value to bytes */ - for (index = 0; index < 5; index++) - pSHA_CTX->HashValue[index] = - cpu2be32(pSHA_CTX->HashValue[index]); - - /* End of for */ - NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA1_DIGEST_SIZE); -} /* End of RT_SHA1_End */ - -/* -======================================================================== -Routine Description: - SHA1 algorithm - -Arguments: - message Message context - messageLen The length of message in bytes - -Return Value: - digestMessage Digest message - -Note: - None -======================================================================== -*/ -VOID RT_SHA1(IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 DigestMessage[]) -{ - SHA1_CTX_STRUC sha_ctx; - - NdisZeroMemory(&sha_ctx, sizeof(SHA1_CTX_STRUC)); - RT_SHA1_Init(&sha_ctx); - RT_SHA1_Append(&sha_ctx, Message, MessageLen); - RT_SHA1_End(&sha_ctx, DigestMessage); -} /* End of RT_SHA1 */ -#endif /* SHA1_SUPPORT */ - -#ifdef SHA256_SUPPORT -/* -======================================================================== -Routine Description: - Initial SHA256_CTX_STRUC - -Arguments: - pSHA_CTX Pointer to SHA256_CTX_STRUC - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA256_Init(IN SHA256_CTX_STRUC *pSHA_CTX) -{ - NdisMoveMemory(pSHA_CTX->HashValue, SHA256_DefaultHashValue, - sizeof(SHA256_DefaultHashValue)); - NdisZeroMemory(pSHA_CTX->Block, SHA256_BLOCK_SIZE); - pSHA_CTX->MessageLen = 0; - pSHA_CTX->BlockLen = 0; -} /* End of RT_SHA256_Init */ - -/* -======================================================================== -Routine Description: - SHA256 computation for one block (512 bits) - -Arguments: - pSHA_CTX Pointer to SHA256_CTX_STRUC - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA256_Hash(IN SHA256_CTX_STRUC *pSHA_CTX) -{ - UINT32 W_i, t; - UINT32 W[64]; - UINT32 a, b, c, d, e, f, g, h, T1, T2; - /* Prepare the message schedule, {W_i}, 0 < t < 15 */ - NdisMoveMemory(W, pSHA_CTX->Block, SHA256_BLOCK_SIZE); - - for (W_i = 0; W_i < 16; W_i++) - W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */ - - /* End of for */ - /* SHA256 hash computation */ - /* Initialize the working variables */ - a = pSHA_CTX->HashValue[0]; - b = pSHA_CTX->HashValue[1]; - c = pSHA_CTX->HashValue[2]; - d = pSHA_CTX->HashValue[3]; - e = pSHA_CTX->HashValue[4]; - f = pSHA_CTX->HashValue[5]; - g = pSHA_CTX->HashValue[6]; - h = pSHA_CTX->HashValue[7]; - - /* 64 rounds */ - for (t = 0; t < 64; t++) { - if (t > - 15) /* Prepare the message schedule, {W_i}, 16 < t < 63 */ - W[t] = Sigma_256_1(W[t - 2]) + W[t - 7] + - Sigma_256_0(W[t - 15]) + W[t - 16]; - - /* End of if */ - T1 = h + Zsigma_256_1(e) + Ch(e, f, g) + SHA256_K[t] + W[t]; - T2 = Zsigma_256_0(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } /* End of for */ - - /* Compute the i^th intermediate hash value H^(i) */ - pSHA_CTX->HashValue[0] += a; - pSHA_CTX->HashValue[1] += b; - pSHA_CTX->HashValue[2] += c; - pSHA_CTX->HashValue[3] += d; - pSHA_CTX->HashValue[4] += e; - pSHA_CTX->HashValue[5] += f; - pSHA_CTX->HashValue[6] += g; - pSHA_CTX->HashValue[7] += h; - NdisZeroMemory(pSHA_CTX->Block, SHA256_BLOCK_SIZE); - pSHA_CTX->BlockLen = 0; -} /* End of RT_SHA256_Hash */ - -/* -======================================================================== -Routine Description: - The message is appended to block. If block size > 64 bytes, the SHA256_Hash -will be called. - -Arguments: - pSHA_CTX Pointer to SHA256_CTX_STRUC - message Message context - messageLen The length of message in bytes - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA256_Append(IN SHA256_CTX_STRUC *pSHA_CTX, IN const UINT8 Message[], - IN UINT MessageLen) -{ - UINT appendLen = 0; - UINT diffLen = 0; - - while (appendLen != MessageLen) { - diffLen = MessageLen - appendLen; - - if ((pSHA_CTX->BlockLen + diffLen) < SHA256_BLOCK_SIZE) { - NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, - Message + appendLen, diffLen); - pSHA_CTX->BlockLen += diffLen; - appendLen += diffLen; - } else { - NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, - Message + appendLen, - SHA256_BLOCK_SIZE - pSHA_CTX->BlockLen); - appendLen += (SHA256_BLOCK_SIZE - pSHA_CTX->BlockLen); - pSHA_CTX->BlockLen = SHA256_BLOCK_SIZE; - RT_SHA256_Hash(pSHA_CTX); - } /* End of if */ - } /* End of while */ - - pSHA_CTX->MessageLen += MessageLen; -} /* End of RT_SHA256_Append */ - -/* -======================================================================== -Routine Description: - 1. Append bit 1 to end of the message - 2. Append the length of message in rightmost 64 bits - 3. Transform the Hash Value to digest message - -Arguments: - pSHA_CTX Pointer to SHA256_CTX_STRUC - -Return Value: - digestMessage Digest message - -Note: - None -======================================================================== -*/ -VOID RT_SHA256_End(IN SHA256_CTX_STRUC *pSHA_CTX, OUT UINT8 DigestMessage[]) -{ - UINT index; - UINT64 message_length_bits; - /* Append bit 1 to end of the message */ - NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80); - - /* 55 = 64(SHA256_BLOCK_SIZE) - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */ - if (pSHA_CTX->BlockLen > 55) - RT_SHA256_Hash(pSHA_CTX); - - /* End of if */ - /* Append the length of message in rightmost 64 bits */ - message_length_bits = pSHA_CTX->MessageLen * 8; - message_length_bits = cpu2be64(message_length_bits); - NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8); - RT_SHA256_Hash(pSHA_CTX); - - /* Return message digest, transform the UINT32 hash value to bytes */ - for (index = 0; index < 8; index++) - pSHA_CTX->HashValue[index] = - cpu2be32(pSHA_CTX->HashValue[index]); - - /* End of for */ - NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA256_DIGEST_SIZE); -} /* End of RT_SHA256_End */ - -/* -======================================================================== -Routine Description: - SHA256 algorithm - -Arguments: - message Message context - messageLen The length of message in bytes - -Return Value: - digestMessage Digest message - -Note: - None -======================================================================== -*/ -VOID RT_SHA256(IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 DigestMessage[]) -{ - SHA256_CTX_STRUC sha_ctx; - - NdisZeroMemory(&sha_ctx, sizeof(SHA256_CTX_STRUC)); - RT_SHA256_Init(&sha_ctx); - RT_SHA256_Append(&sha_ctx, Message, MessageLen); - RT_SHA256_End(&sha_ctx, DigestMessage); -} /* End of RT_SHA256 */ - -VOID rt_sha256_vector(IN UCHAR num, IN const unsigned char **message, - IN UINT *messageLen, OUT UINT8 *digestmessage) -{ - SHA256_CTX_STRUC sha_ctx; - UCHAR i; - - NdisZeroMemory(&sha_ctx, sizeof(SHA256_CTX_STRUC)); - RT_SHA256_Init(&sha_ctx); - for (i = 0; i < num; i++) - RT_SHA256_Append(&sha_ctx, message[i], messageLen[i]); - RT_SHA256_End(&sha_ctx, digestmessage); -} - -#endif /* SHA256_SUPPORT */ - -#ifdef SHA384_SUPPORT -/* -======================================================================== -Routine Description: - Initial SHA384_CTX_STRUC - -Arguments: - pSHA_CTX Pointer to SHA384_CTX_STRUC - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA384_Init(IN SHA384_CTX_STRUC *pSHA_CTX) -{ - NdisMoveMemory(pSHA_CTX->HashValue, SHA384_DefaultHashValue, - sizeof(SHA384_DefaultHashValue)); - NdisZeroMemory(pSHA_CTX->Block, SHA384_BLOCK_SIZE); - pSHA_CTX->MessageLen = 0; - pSHA_CTX->BlockLen = 0; -} /* End of RT_SHA384_Init */ - -/* -======================================================================== -Routine Description: - SHA384 computation for one block (1024 bits) - -Arguments: - pSHA_CTX Pointer to SHA384_CTX_STRUC - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA384_Hash(IN SHA384_CTX_STRUC *pSHA_CTX) -{ - UINT32 W_i, t; - UINT64 *W = NULL; - UINT64 a, b, c, d, e, f, g, h, T1, T2; - /* Prepare the message schedule, {W_i}, 0 < t < 15 */ - os_alloc_mem(NULL, (UCHAR **)&W, 80 * sizeof(UINT64)); - - if (!W) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:Allocate memory failed!", __func__)); - return; - } - NdisZeroMemory(W, 80 * sizeof(UINT64)); - NdisMoveMemory(W, pSHA_CTX->Block, SHA384_BLOCK_SIZE); - - for (W_i = 0; W_i < 16; W_i++) - W[W_i] = cpu2be64(W[W_i]); /* Endian Swap */ - - /* End of for */ - /* SHA384 hash computation */ - /* Initialize the working variables */ - a = pSHA_CTX->HashValue[0]; - b = pSHA_CTX->HashValue[1]; - c = pSHA_CTX->HashValue[2]; - d = pSHA_CTX->HashValue[3]; - e = pSHA_CTX->HashValue[4]; - f = pSHA_CTX->HashValue[5]; - g = pSHA_CTX->HashValue[6]; - h = pSHA_CTX->HashValue[7]; - - /* 64 rounds */ - for (t = 0; t < 80; t++) { - if (t > - 15) /* Prepare the message schedule, {W_i}, 16 < t < 79 */ - W[t] = Sigma_512_1(W[t - 2]) + W[t - 7] + - Sigma_512_0(W[t - 15]) + W[t - 16]; - - T1 = h + Zsigma_512_1(e) + Ch(e, f, g) + SHA384_K[t] + W[t]; - T2 = Zsigma_512_0(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } /* End of for */ - - /* Compute the i^th intermediate hash value H^(i) */ - pSHA_CTX->HashValue[0] += a; - pSHA_CTX->HashValue[1] += b; - pSHA_CTX->HashValue[2] += c; - pSHA_CTX->HashValue[3] += d; - pSHA_CTX->HashValue[4] += e; - pSHA_CTX->HashValue[5] += f; - pSHA_CTX->HashValue[6] += g; - pSHA_CTX->HashValue[7] += h; - NdisZeroMemory(pSHA_CTX->Block, SHA384_BLOCK_SIZE); - pSHA_CTX->BlockLen = 0; - - if (W) - os_free_mem(W); -} /* End of RT_SHA384_Hash */ - -/* -======================================================================== -Routine Description: - The message is appended to block. If block size > 128 bytes, the SHA384_Hash -will be called. - -Arguments: - pSHA_CTX Pointer to SHA384_CTX_STRUC - message Message context - messageLen The length of message in bytes - -Return Value: - None - -Note: - None -======================================================================== -*/ -VOID RT_SHA384_Append(IN SHA384_CTX_STRUC *pSHA_CTX, IN const UINT8 Message[], - IN UINT MessageLen) -{ - UINT appendLen = 0; - UINT diffLen = 0; - - while (appendLen != MessageLen) { - diffLen = MessageLen - appendLen; - - if ((pSHA_CTX->BlockLen + diffLen) < SHA384_BLOCK_SIZE) { - NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, - Message + appendLen, diffLen); - pSHA_CTX->BlockLen += diffLen; - appendLen += diffLen; - } else { - NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, - Message + appendLen, - SHA384_BLOCK_SIZE - pSHA_CTX->BlockLen); - appendLen += (SHA384_BLOCK_SIZE - pSHA_CTX->BlockLen); - pSHA_CTX->BlockLen = SHA384_BLOCK_SIZE; - RT_SHA384_Hash(pSHA_CTX); - } /* End of if */ - } /* End of while */ - - pSHA_CTX->MessageLen += MessageLen; -} /* End of RT_SHA384_Append */ - -/* -======================================================================== -Routine Description: - 1. Append bit 1 to end of the message - 2. Append the length of message in rightmost 128 bits - 3. Transform the Hash Value to digest message - -Arguments: - pSHA_CTX Pointer to SHA384_CTX_STRUC - -Return Value: - digestMessage Digest message - -Note: - None -======================================================================== -*/ -VOID RT_SHA384_End(IN SHA384_CTX_STRUC *pSHA_CTX, OUT UINT8 DigestMessage[]) -{ - UINT index; - UINT64 message_length_bits; - /* Append bit 1 to end of the message */ - NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80); - - /* 112 = 128(SHA256_BLOCK_SIZE) - 16 - 1: append 1 bit(1 byte) and message length (16 bytes) */ - if (pSHA_CTX->BlockLen > 112) - RT_SHA384_Hash(pSHA_CTX); - - /* End of if */ - /* Append the length of message in rightmost 128 bits */ - message_length_bits = pSHA_CTX->MessageLen * 8; - message_length_bits = cpu2be64(message_length_bits); - NdisMoveMemory(&pSHA_CTX->Block[120], &message_length_bits, 8); - RT_SHA384_Hash(pSHA_CTX); - - /* Return message digest, transform the UINT64 hash value to bytes */ - for (index = 0; index < 8; index++) - pSHA_CTX->HashValue[index] = - cpu2be64(pSHA_CTX->HashValue[index]); - - /* End of for */ - NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA384_DIGEST_SIZE); -} /* End of RT_SHA384_End */ - -/* -======================================================================== -Routine Description: - SHA384 algorithm - -Arguments: - message Message context - messageLen The length of message in bytes - -Return Value: - digestMessage Digest message - -Note: - None -======================================================================== -*/ -VOID RT_SHA384(IN const UINT8 Message[], IN UINT MessageLen, - OUT UINT8 DigestMessage[]) -{ - SHA384_CTX_STRUC sha_ctx; - - NdisZeroMemory(&sha_ctx, sizeof(SHA384_CTX_STRUC)); - RT_SHA384_Init(&sha_ctx); - RT_SHA384_Append(&sha_ctx, Message, MessageLen); - RT_SHA384_End(&sha_ctx, DigestMessage); -} /* End of RT_SHA384 */ - -VOID rt_sha384_vector(IN UCHAR num, IN const unsigned char **message, - IN UINT *messageLen, OUT UINT8 *digestmessage) -{ - SHA384_CTX_STRUC sha_ctx; - UCHAR i; - - NdisZeroMemory(&sha_ctx, sizeof(SHA384_CTX_STRUC)); - RT_SHA384_Init(&sha_ctx); - for (i = 0; i < num; i++) - RT_SHA384_Append(&sha_ctx, message[i], messageLen[i]); - RT_SHA384_End(&sha_ctx, digestmessage); -} - -#endif /* SHA384_SUPPORT */ - -/* End of crypt_sha2.c */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/dh_key.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/dh_key.c deleted file mode 100644 index 7b8b81dd61..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/dh_key.c +++ /dev/null @@ -1,5047 +0,0 @@ - -/*dh_key.h START*/ -#define GETPID_IS_MEANINGLESS -#include "rt_config.h" - -#ifdef WSC_INCLUDED - -#ifndef DHPRINT -#define DHPRINT(fmt, args...) \ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, (fmt, ##args)) -#endif - -#define BN_MUL_COMBA -#define BN_SQR_COMBA - -#define BN_ULLONG unsigned long -#define BN_ULONG unsigned int -#define BN_BITS 64 -#define BN_BYTES 4 -#define BN_BITS2 32 -#define BN_BITS4 16 -#define BN_MASK (0xffffffffffffffffLL) -#define BN_MASK2 (0xffffffffL) -#define BN_MASK2l (0xffff) -#define BN_MASK2h1 (0xffff8000L) -#define BN_MASK2h (0xffff0000L) -#define BN_TBIT (0x80000000L) -#define BN_FLG_MALLOCED 0x01 -#define BN_FLG_STATIC_DATA 0x02 -#define BN_FLG_EXP_CONSTTIME \ - 0x04 /* avoid leaking exponent information through timings - * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) */ -#define BN_set_flags(b, n) ((b)->flags |= (n)) -#define BN_get_flags(b, n) ((b)->flags & (n)) -/* get a clone of a struct bignum_st with changed flags, for *temporary* use only - * (the two BIGNUMs cannot not be used in parallel!) */ -#define BN_with_flags(dest, b, n) \ - ((dest)->d = (b)->d, (dest)->top = (b)->top, (dest)->dmax = (b)->dmax, \ - (dest)->flags = \ - (((dest)->flags & BN_FLG_MALLOCED) | \ - ((b)->flags & ~BN_FLG_MALLOCED) | BN_FLG_STATIC_DATA | (n))) - -struct bignum_st { - BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */ - int top; /* Index of last used d +1. */ - /* The next are internal book keeping for bn_expand. */ - int dmax; /* Size of the d array. */ - int flags; -}; - -/* Used for montgomery multiplication */ -struct bn_mont_ctx_st { - int ri; /* number of bits in R */ - struct bignum_st RR; /* used to convert to montgomery form */ - struct bignum_st N; /* The modulus */ - BN_ULONG n0; /* least significant word of Ni */ - int flags; -}; - -#define BN_num_bytes(a) ((BN_num_bits(a) + 7) / 8) -#define BN_is_zero(a) ((a)->top == 0) -#define BN_is_one(a) (((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(1))) -#define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1)) -#define BN_one(a) (BN_set_word((a), 1)) -#define BN_zero(a) (BN_set_word((a), 0)) -#define bn_wexpand(a, words) \ - (((words) <= (a)->dmax) ? (a) : bn_expand2((a), (words))) -#define bn_correct_top(a) \ - { \ - BN_ULONG *ftl; \ - if ((a)->top > 0) { \ - for (ftl = &((a)->d[(a)->top - 1]); (a)->top > 0; \ - (a)->top--) \ - if (*(ftl--)) -break; -} -} - -/* - * BN_window_bits_for_exponent_size -- macro for sliding window mod_exp functions - * - * - * For window size 'w' (w >= 2) and a random 'b' bits exponent, - * the number of multiplications is a constant plus on average - * - * 2^(w-1) + (b-w)/(w+1); - * - * here 2^(w-1) is for precomputing the table (we actually need - * entries only for windows that have the lowest bit set), and - * (b-w)/(w+1) is an approximation for the expected number of - * w-bit windows, not counting the first one. - * - * Thus we should use - * - * w >= 6 if b > 671 - * w = 5 if 671 > b > 239 - * w = 4 if 239 > b > 79 - * w = 3 if 79 > b > 23 - * w <= 2 if 23 > b - * - * (with draws in between). Very small exponents are often selected - * with low Hamming weight, so we use w = 1 for b <= 23. - */ -#define BN_window_bits_for_exponent_size(b) \ - ((b) > 671 ? 6 : (b) > 239 ? 5 : (b) > 79 ? 4 : (b) > 23 ? 3 : 1) -/* BN_mod_exp_mont_conttime is based on the assumption that the - * L1 data cache line width of the target processor is at least - * the following value. - */ -#define MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH (64) -#define MOD_EXP_CTIME_MIN_CACHE_LINE_MASK \ - (MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH - 1) -/* Window sizes optimized for fixed window size modular exponentiation - * algorithm (BN_mod_exp_mont_consttime). - * - * To achieve the security goals of BN_mode_exp_mont_consttime, the - * maximum size of the window must not exceed - * log_2(MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH). - * - * Window size thresholds are defined for cache line sizes of 32 and 64, - * cache line sizes where log_2(32)=5 and log_2(64)=6 respectively. A - * window size of 7 should only be used on processors that have a 128 - * byte or greater cache line size. - */ -#if MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH == 64 -#define BN_window_bits_for_ctime_exponent_size(b) \ - ((b) > 937 ? 6 : (b) > 306 ? 5 : (b) > 89 ? 4 : (b) > 22 ? 3 : 1) -#define BN_MAX_WINDOW_BITS_FOR_CTIME_EXPONENT_SIZE (6) -#elif MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH == 32 -#define BN_window_bits_for_ctime_exponent_size(b) \ - ((b) > 306 ? 5 : (b) > 89 ? 4 : (b) > 22 ? 3 : 1) -#define BN_MAX_WINDOW_BITS_FOR_CTIME_EXPONENT_SIZE (5) -#endif -#define BN_MULL_SIZE_NORMAL (16) /* 32 */ -#define BN_MUL_RECURSIVE_SIZE_NORMAL (16) /* 32 less than */ -#define BN_SQR_RECURSIVE_SIZE_NORMAL (16) /* 32 */ - -/************************************************************* - * Using the long long type - */ -#define Lw(t) (((BN_ULONG)(t)) & BN_MASK2) -#define Hw(t) (((BN_ULONG)((t) >> BN_BITS2)) & BN_MASK2) - -/************************************************************* - * No long long type - */ - -#define LBITS(a) ((a)&BN_MASK2l) -#define HBITS(a) (((a) >> BN_BITS4) & BN_MASK2l) -#define L2HBITS(a) (((a) << BN_BITS4) & BN_MASK2) - -#define LLBITS(a) ((a)&BN_MASKl) -#define LHBITS(a) (((a) >> BN_BITS2) & BN_MASKl) -#define LL2HBITS(a) ((BN_ULLONG)((a)&BN_MASKl) << BN_BITS2) - -#define mul64(l, h, bl, bh) \ - { \ - BN_ULONG m, m1, lt, ht; \ - \ - lt = l; \ - ht = h; \ - m = (bh) * (lt); \ - lt = (bl) * (lt); \ - m1 = (bl) * (ht); \ - ht = (bh) * (ht); \ - m = (m + m1) & BN_MASK2; \ - if (m < m1) \ - ht += L2HBITS((BN_ULONG)1); \ - ht += HBITS(m); \ - m1 = L2HBITS(m); \ - lt = (lt + m1) & BN_MASK2; \ - if (lt < m1) \ - ht++; \ - (l) = lt; \ - (h) = ht; \ - } - -#define sqr64(lo, ho, in) \ - { \ - BN_ULONG l, h, m; \ - \ - h = (in); \ - l = LBITS(h); \ - h = HBITS(h); \ - m = (l) * (h); \ - l *= l; \ - h *= h; \ - h += (m & BN_MASK2h1) >> (BN_BITS4 - 1); \ - m = (m & BN_MASK2l) << (BN_BITS4 + 1); \ - l = (l + m) & BN_MASK2; \ - if (l < m) \ - h++; \ - (lo) = l; \ - (ho) = h; \ - } - -#define mul_add(r, a, bl, bh, c) \ - { \ - BN_ULONG l, h; \ - \ - h = (a); \ - l = LBITS(h); \ - h = HBITS(h); \ - mul64(l, h, (bl), (bh)); \ - \ - /* non-multiply part */ \ - l = (l + (c)) & BN_MASK2; \ - if (l < (c)) \ - h++; \ - (c) = (r); \ - l = (l + (c)) & BN_MASK2; \ - if (l < (c)) \ - h++; \ - (c) = h & BN_MASK2; \ - (r) = l; \ - } - -#define mul(r, a, bl, bh, c) \ - { \ - BN_ULONG l, h; \ - \ - h = (a); \ - l = LBITS(h); \ - h = HBITS(h); \ - mul64(l, h, (bl), (bh)); \ - \ - /* non-multiply part */ \ - l += (c); \ - if ((l & BN_MASK2) < (c)) \ - h++; \ - (c) = h & BN_MASK2; \ - (r) = l & BN_MASK2; \ - } - -#define INIT_DATA_h0 0x67452301UL -#define INIT_DATA_h1 0xefcdab89UL -#define INIT_DATA_h2 0x98badcfeUL -#define INIT_DATA_h3 0x10325476UL -#define INIT_DATA_h4 0xc3d2e1f0UL -#define STATE_SIZE 1023 -#define EXP_TABLE_SIZE 32 -#define BN_mod(rem, m, d, ctx) BN_div(NULL, (rem), (m), (d), (ctx)) -#define BN_CTX_POOL_SIZE 16 -#define MOD_EXP_CTIME_ALIGN(x_) \ - ((unsigned char *)(x_) + \ - (MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH - \ - (((BN_ULONG)(x_)) & (MOD_EXP_CTIME_MIN_CACHE_LINE_MASK)))) -#define ENTROPY_NEEDED 32 /* require 256 bits = 32 bytes of randomness */ -#define DH_FLAG_CACHE_MONT_P 0x01 -#define DH_FLAG_NO_EXP_CONSTTIME \ - 0x02 /* new with 0.9.7h; the built-in struct dh_st - * implementation now uses constant time - * modular exponentiation for secret exponents - * by default. This flag causes the - * faster variable sliding window method to - * be used for all exponents. - */ -#define OPENSSL_DH_MAX_MODULUS_BITS 10000 - -struct dh_st { - struct bignum_st *p; - struct bignum_st *g; - struct bignum_st *pub_key; /* g^x */ - struct bignum_st *priv_key; /* x */ - int flags; -}; - -struct env_md_st { - int type; - int md_size; - unsigned long flags; - int (*init)(struct env_md_ctx_st *ctx); - int (*update)(struct env_md_ctx_st *ctx, const void *data, - size_t count); - int (*final)(struct env_md_ctx_st *ctx, unsigned char *md); - int ctx_size; /* how big does the ctx->md_data need to be */ -} /* struct env_md_st */; - -struct env_md_ctx_st { - const struct env_md_st *digest; - void *md_data; -} /* struct env_md_ctx_st */; - -/* A bundle of bignums that can be linked with other bundles */ -struct bignum_pool_item { - /* The bignum values */ - struct bignum_st vals[BN_CTX_POOL_SIZE]; - /* Linked-list admin */ - struct bignum_pool_item *prev, *next; -}; - -/* A linked-list of bignums grouped in bundles */ -struct bignum_pool { - /* Linked-list admin */ - struct bignum_pool_item *head, *currentvar, *tail; - /* Stack depth and allocation size */ - unsigned used, size; -}; -/*dh_key.h END*/ - -/*sha_locl.h START*/ -#define SHA_LONG unsigned int -#define SHA_LBLOCK 16 -#define SHA_CBLOCK \ - (SHA_LBLOCK * \ - 4) /* SHA treats input data as a contiguous array of 32 bit wide big-endian values. */ -#define SHA_DIGEST_LENGTH 20 -struct SHAstate_st { - SHA_LONG h0, h1, h2, h3, h4; - SHA_LONG Nl, Nh; - SHA_LONG data[SHA_LBLOCK]; - unsigned int num; -}; -#define Xupdate(a, ix, ia, ib, ic, id) \ - ((a) = (ia ^ ib ^ ic ^ id), ix = (a) = ROTATE((a), 1)) - -#ifndef ROTATE -#define ROTATE(a, n) (((a) << (n)) | (((a)&0xffffffff) >> (32 - (n)))) -#endif - -#define HASH_MAKE_STRING(c, s) \ - do { \ - unsigned long ll; \ - ll = (c)->h0; \ - HOST_l2c(ll, (s)); \ - ll = (c)->h1; \ - HOST_l2c(ll, (s)); \ - ll = (c)->h2; \ - HOST_l2c(ll, (s)); \ - ll = (c)->h3; \ - HOST_l2c(ll, (s)); \ - ll = (c)->h4; \ - HOST_l2c(ll, (s)); \ - } while (0) - -#ifndef HOST_c2l -#define HOST_c2l(c, l) \ - (l = (((unsigned long)(*((c)++))) << 24), \ - l |= (((unsigned long)(*((c)++))) << 16), \ - l |= (((unsigned long)(*((c)++))) << 8), \ - l |= (((unsigned long)(*((c)++)))), l) -#endif - -#define HOST_p_c2l(c, l, n) \ - { \ - switch (n) { \ - case 0: \ - l = ((unsigned long)(*((c)++))) << 24; \ - case 1: \ - l |= ((unsigned long)(*((c)++))) << 16; \ - case 2: \ - l |= ((unsigned long)(*((c)++))) << 8; \ - case 3: \ - l |= ((unsigned long)(*((c)++))); \ - } \ - } -#define HOST_p_c2l_p(c, l, sc, len) \ - { \ - switch (sc) { \ - case 0: \ - l = ((unsigned long)(*((c)++))) << 24; \ - if (--len == 0) \ - break; \ - case 1: \ - l |= ((unsigned long)(*((c)++))) << 16; \ - if (--len == 0) \ - break; \ - case 2: \ - l |= ((unsigned long)(*((c)++))) << 8; \ - } \ - } -/* NOTE the pointer is not incremented at the end of this */ -#define HOST_c2l_p(c, l, n) \ - { \ - l = 0; \ - (c) += n; \ - switch (n) { \ - case 3: \ - l = ((unsigned long)(*(--(c)))) << 8; \ - case 2: \ - l |= ((unsigned long)(*(--(c)))) << 16; \ - case 1: \ - l |= ((unsigned long)(*(--(c)))) << 24; \ - } \ - } -#ifndef HOST_l2c -#define HOST_l2c(l, c) \ - (*((c)++) = (unsigned char)(((l) >> 24) & 0xff), \ - *((c)++) = (unsigned char)(((l) >> 16) & 0xff), \ - *((c)++) = (unsigned char)(((l) >> 8) & 0xff), \ - *((c)++) = (unsigned char)(((l)) & 0xff), l) -#endif - -#define K_00_19 0x5a827999UL -#define K_20_39 0x6ed9eba1UL -#define K_40_59 0x8f1bbcdcUL -#define K_60_79 0xca62c1d6UL - -/* As pointed out by Wei Dai , F() below can be - * simplified to the code in F_00_19. Wei attributes these optimisations - * to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel. - * #define F(x,y,z) (((x) & (y)) | ((~(x)) & (z))) - * I've just become aware of another tweak to be made, again from Wei Dai, - * in F_40_59, (x&a)|(y&a) -> (x|y)&a - */ -#define F_00_19(b, c, d) ((((c) ^ (d)) & (b)) ^ (d)) -#define F_20_39(b, c, d) ((b) ^ (c) ^ (d)) -#define F_40_59(b, c, d) (((b) & (c)) | (((b) | (c)) & (d))) -#define F_60_79(b, c, d) F_20_39(b, c, d) - -#define BODY_00_15(xi) \ - do { \ - T = E + K_00_19 + F_00_19(B, C, D); \ - E = D, D = C, C = ROTATE(B, 30), B = A; \ - A = ROTATE(A, 5) + T + xi; \ - } while (0) -#define BODY_16_19(xa, xb, xc, xd) \ - do { \ - Xupdate(T, xa, xa, xb, xc, xd); \ - T += E + K_00_19 + F_00_19(B, C, D); \ - E = D, D = C, C = ROTATE(B, 30), B = A; \ - A = ROTATE(A, 5) + T; \ - } while (0) -#define BODY_20_39(xa, xb, xc, xd) \ - do { \ - Xupdate(T, xa, xa, xb, xc, xd); \ - T += E + K_20_39 + F_20_39(B, C, D); \ - E = D, D = C, C = ROTATE(B, 30), B = A; \ - A = ROTATE(A, 5) + T; \ - } while (0) -#define BODY_40_59(xa, xb, xc, xd) \ - do { \ - Xupdate(T, xa, xa, xb, xc, xd); \ - T += E + K_40_59 + F_40_59(B, C, D); \ - E = D, D = C, C = ROTATE(B, 30), B = A; \ - A = ROTATE(A, 5) + T; \ - } while (0) -#define BODY_60_79(xa, xb, xc, xd) \ - do { \ - Xupdate(T, xa, xa, xb, xc, xd); \ - T = E + K_60_79 + F_60_79(B, C, D); \ - E = D, D = C, C = ROTATE(B, 30), B = A; \ - A = ROTATE(A, 5) + T + xa; \ - } while (0) -static void sha1_block_host_order(struct SHAstate_st *c, const void *d, - size_t num) -{ - const SHA_LONG *W = d; - - register unsigned long A, B, C, D, E, T; - int i; - SHA_LONG X[16]; - - A = c->h0; - B = c->h1; - C = c->h2; - D = c->h3; - E = c->h4; - - for (;;) { - for (i = 0; i < 16; i++) { - X[i] = W[i]; - BODY_00_15(X[i]); - } - - for (i = 0; i < 4; i++) - BODY_16_19(X[i], X[i + 2], X[i + 8], X[(i + 13) & 15]); - - for (; i < 24; i++) - BODY_20_39(X[i & 15], X[(i + 2) & 15], X[(i + 8) & 15], - X[(i + 13) & 15]); - - for (i = 0; i < 20; i++) - BODY_40_59(X[(i + 8) & 15], X[(i + 10) & 15], X[i & 15], - X[(i + 5) & 15]); - - for (i = 4; i < 24; i++) - BODY_60_79(X[(i + 8) & 15], X[(i + 10) & 15], X[i & 15], - X[(i + 5) & 15]); - - c->h0 = (c->h0 + A) & 0xffffffffL; - c->h1 = (c->h1 + B) & 0xffffffffL; - c->h2 = (c->h2 + C) & 0xffffffffL; - c->h3 = (c->h3 + D) & 0xffffffffL; - c->h4 = (c->h4 + E) & 0xffffffffL; - - if (--num == 0) - break; - - A = c->h0; - B = c->h1; - C = c->h2; - D = c->h3; - E = c->h4; - W += SHA_LBLOCK; - } -} - -static void sha1_block_data_order(struct SHAstate_st *c, const void *p, - size_t num) -{ - const unsigned char *data = p; - register unsigned long A, B, C, D, E, T, l; - int i; - SHA_LONG X[16]; - - A = c->h0; - B = c->h1; - C = c->h2; - D = c->h3; - E = c->h4; - - for (;;) { - for (i = 0; i < 16; i++) { - HOST_c2l(data, l); - X[i] = l; - BODY_00_15(X[i]); - } - - for (i = 0; i < 4; i++) - BODY_16_19(X[i], X[i + 2], X[i + 8], X[(i + 13) & 15]); - - for (; i < 24; i++) - BODY_20_39(X[i & 15], X[(i + 2) & 15], X[(i + 8) & 15], - X[(i + 13) & 15]); - - for (i = 0; i < 20; i++) - BODY_40_59(X[(i + 8) & 15], X[(i + 10) & 15], X[i & 15], - X[(i + 5) & 15]); - - for (i = 4; i < 24; i++) - BODY_60_79(X[(i + 8) & 15], X[(i + 10) & 15], X[i & 15], - X[(i + 5) & 15]); - - c->h0 = (c->h0 + A) & 0xffffffffL; - c->h1 = (c->h1 + B) & 0xffffffffL; - c->h2 = (c->h2 + C) & 0xffffffffL; - c->h3 = (c->h3 + D) & 0xffffffffL; - c->h4 = (c->h4 + E) & 0xffffffffL; - - if (--num == 0) - break; - - A = c->h0; - B = c->h1; - C = c->h2; - D = c->h3; - E = c->h4; - } -} -/*sha_locl.h END*/ - -#define NID_sha1 64 - -static int g_state_num = 0, g_state_index; -static unsigned char g_md[SHA_DIGEST_LENGTH]; -static unsigned char g_state[STATE_SIZE + SHA_DIGEST_LENGTH]; -static long g_md_count[2] = { 0, 0 }; -static long g_entropy; -static int RAND_initialized; - -static struct bignum_st *bn_expand2(struct bignum_st *b, int words); -static int HASH_FINAL(unsigned char *md, struct SHAstate_st *c); -static int HASH_UPDATE(struct SHAstate_st *c, const void *data_, size_t len); -static int HASH_INIT(struct SHAstate_st *c); -static int RAND_poll(void); -static int RAND_init(struct env_md_ctx_st *ctx) -{ - return HASH_INIT(ctx->md_data); -} -static int RAND_update(struct env_md_ctx_st *ctx, const void *data, - size_t count) -{ - return HASH_UPDATE(ctx->md_data, data, count); -} -static int RAND_final(struct env_md_ctx_st *ctx, unsigned char *md) -{ - return HASH_FINAL(md, ctx->md_data); -} -static void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, - int nb); -#ifdef BN_RECURSION -static void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2, - int dna, int dnb, BN_ULONG *t); -static void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, - int tna, int tnb, BN_ULONG *t); -static void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b); -#endif /* BN_RECURSION */ -static int BN_mod_exp_mont(struct bignum_st *rr, const struct bignum_st *a, - const struct bignum_st *p, const struct bignum_st *m, - struct bignum_pool *ctx, - struct bn_mont_ctx_st *in_mont); -static int BN_rshift1(struct bignum_st *r, const struct bignum_st *a); -static BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, - BN_ULONG w); -static BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, - BN_ULONG w); -static BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - int n); -static BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - int n); -static void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b); -static void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a); -static void bn_sqr_comba4(BN_ULONG *r, const BN_ULONG *a); - -static int HASH_FINAL(unsigned char *md, struct SHAstate_st *c) -{ - register SHA_LONG *p; - register unsigned long l; - register int i, j; - static const unsigned char end[4] = { 0x80, 0x00, 0x00, 0x00 }; - const unsigned char *cp = end; - /* c->num should definitly have room for at least one more byte. */ - p = c->data; - i = c->num >> 2; - j = c->num & 0x03; - l = (j == 0) ? 0 : p[i]; - HOST_p_c2l(cp, l, j); - p[i++] = l; /* i is the next 'undefined word' */ - - if (i > (SHA_LBLOCK - 2)) { /* save room for Nl and Nh */ - if (i < SHA_LBLOCK) - p[i] = 0; - - sha1_block_host_order(c, p, 1); - i = 0; - } - - for (; i < (SHA_LBLOCK - 2); i++) - p[i] = 0; - - p[SHA_LBLOCK - 2] = c->Nh; - p[SHA_LBLOCK - 1] = c->Nl; - sha1_block_host_order(c, p, 1); -#ifndef HASH_MAKE_STRING -#error "HASH_MAKE_STRING must be defined!" -#else - HASH_MAKE_STRING(c, md); -#endif - c->num = 0; - return 1; -} - -static int HASH_UPDATE(struct SHAstate_st *c, const void *data_, size_t len) -{ - const unsigned char *data = data_; - register SHA_LONG *p; - register SHA_LONG l; - size_t sw, sc, ew, ec; - - if (len == 0) - return 1; - - l = (c->Nl + (((SHA_LONG)len) << 3)) & 0xffffffffUL; - - /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to - * Wei Dai for pointing it out. */ - if (l < c->Nl) /* overflow */ - c->Nh++; - - c->Nh += (len >> 29); /* might cause compiler warning on 16-bit */ - c->Nl = l; - - if (c->num != 0) { - p = c->data; - sw = c->num >> 2; - sc = c->num & 0x03; - - if ((c->num + len) >= SHA_CBLOCK) { - l = p[sw]; - HOST_p_c2l(data, l, sc); - p[sw++] = l; - - for (; sw < SHA_LBLOCK; sw++) { - HOST_c2l(data, l); - p[sw] = l; - } - - sha1_block_host_order(c, p, 1); - len -= (SHA_CBLOCK - c->num); - c->num = 0; - /* drop through and do the rest */ - } else { - c->num += (unsigned int)len; - - if ((sc + len) < 4) { /* ugly, add char's to a word */ - l = p[sw]; - HOST_p_c2l_p(data, l, sc, len); - p[sw] = l; - } else { - ew = (c->num >> 2); - ec = (c->num & 0x03); - - if (sc) - l = p[sw]; - - HOST_p_c2l(data, l, sc); - p[sw++] = l; - - for (; sw < ew; sw++) { - HOST_c2l(data, l); - p[sw] = l; - } - - if (ec) { - HOST_c2l_p(data, l, ec); - p[sw] = l; - } - } - - return 1; - } - } - - sw = len / SHA_CBLOCK; - - if (sw > 0) { - { - sha1_block_data_order(c, data, sw); - sw *= SHA_CBLOCK; - data += sw; - len -= sw; - } - } - - if (len != 0) { - p = c->data; - c->num = len; - ew = len >> 2; /* words to copy */ - ec = len & 0x03; - - for (; ew; ew--, p++) { - HOST_c2l(data, l); - *p = l; - } - - HOST_c2l_p(data, l, ec); - *p = l; - } - - return 1; -} - -static int HASH_INIT(struct SHAstate_st *c) -{ - c->h0 = INIT_DATA_h0; - c->h1 = INIT_DATA_h1; - c->h2 = INIT_DATA_h2; - c->h3 = INIT_DATA_h3; - c->h4 = INIT_DATA_h4; - c->Nl = 0; - c->Nh = 0; - c->num = 0; - return 1; -} - -static struct bignum_pool *BN_CTX_new(void) -{ - struct bignum_pool *ret; - - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(struct bignum_pool)); - - if (!ret) - return NULL; - - /* Initialise the structure */ - ret->head = ret->currentvar = ret->tail = NULL; - ret->used = ret->size = 0; - return ret; -} - -static const struct bignum_st *BN_value_one(void) -{ - static BN_ULONG data_one = 1L; - static struct bignum_st const_one = { &data_one, 1, 1, - BN_FLG_STATIC_DATA }; - - return &const_one; -} - -static int BN_num_bits_word(BN_ULONG l) -{ - static const char bits[256] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - }; - { - if (l & 0xffff0000L) { - if (l & 0xff000000L) - return (bits[(int)(l >> 24L)] + 24); - else - return (bits[(int)(l >> 16L)] + 16); - } else { - if (l & 0xff00L) - return (bits[(int)(l >> 8)] + 8); - else - return bits[(int)(l)]; - } - } -} - -static int BN_num_bits(const struct bignum_st *a) -{ - int i = a->top - 1; - - if (BN_is_zero(a)) - return 0; - - return ((i * BN_BITS2) + BN_num_bits_word(a->d[i])); -} - -static void BN_clear_free(struct bignum_st *a) -{ - int i; - - if (a == NULL) - return; - - if (a->d != NULL) { - if (!(BN_get_flags(a, BN_FLG_STATIC_DATA))) - os_free_mem(a->d); - } - - i = BN_get_flags(a, BN_FLG_MALLOCED); - - if (i) - os_free_mem(a); -} - -static void BN_free(struct bignum_st *a) -{ - if (a == NULL) - return; - - if ((a->d != NULL) && !(BN_get_flags(a, BN_FLG_STATIC_DATA))) - os_free_mem(a->d); - - if (a->flags & BN_FLG_MALLOCED) - os_free_mem(a); - else - a->d = NULL; -} - -static void BN_init(struct bignum_st *a) -{ - memset(a, 0, sizeof(struct bignum_st)); -} - -static struct bignum_st *BN_new(void) -{ - struct bignum_st *ret; - - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(struct bignum_st)); - - if (ret == NULL) - return NULL; - - ret->flags = BN_FLG_MALLOCED; - ret->top = 0; - ret->dmax = 0; - ret->d = NULL; - return ret; -} - -/* This is used both by bn_expand2() and bn_dup_expand() */ -/* The caller MUST check that words > b->dmax before calling this */ -static BN_ULONG *bn_expand_internal(const struct bignum_st *b, int words) -{ - BN_ULONG *A, *a = NULL; - const BN_ULONG *B; - int i; - - if (words > (INT_MAX / (4 * BN_BITS2))) - return NULL; - - if (BN_get_flags(b, BN_FLG_STATIC_DATA)) - return NULL; - - os_alloc_mem(NULL, (UCHAR **)&A, sizeof(BN_ULONG) * words); - a = A; - - if (A == NULL) - return NULL; - - B = b->d; - - /* Check if the previous number needs to be copied */ - if (B != NULL) { - for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) { - /* - * The fact that the loop is unrolled - * 4-wise is a tribute to Intel. It's - * the one that doesn't have enough - * registers to accomodate more data. - * I'd unroll it 8-wise otherwise:-) - * - * - */ - BN_ULONG a0, a1, a2, a3; - - a0 = B[0]; - a1 = B[1]; - a2 = B[2]; - a3 = B[3]; - A[0] = a0; - A[1] = a1; - A[2] = a2; - A[3] = a3; - } - - switch (b->top & 3) { - case 3: - A[2] = B[2]; - - case 2: - A[1] = B[1]; - - case 1: - A[0] = B[0]; - - case 0: /* workaround for ultrix cc: without 'case 0', the optimizer does - * the switch table by doing a=top&3; a--; goto jump_table[a]; - * which fails for top== 0 */ - ; - } - } - - return a; -} - -/* This is an internal function that should not be used in applications. - * It ensures that 'b' has enough room for a 'words' word number - * and initialises any unused part of b->d with leading zeros. - * It is mostly used by the various struct bignum_st routines. If there is an error, - * NULL is returned. If not, 'b' is returned. */ - -static struct bignum_st *bn_expand2(struct bignum_st *b, int words) -{ - if (words > b->dmax) { - BN_ULONG *a = bn_expand_internal(b, words); - - if (!a) - return NULL; - - if (b->d) - os_free_mem(b->d); - - b->d = a; - b->dmax = words; - } - - return b; -} - -static void BN_clear(struct bignum_st *a) -{ - if (a->d != NULL) - memset(a->d, 0, a->dmax * sizeof(a->d[0])); - - a->top = 0; -} - -static int BN_set_word(struct bignum_st *a, BN_ULONG w) -{ - if (NULL == ((1 <= (a)->dmax) ? (a) : bn_expand2((a), 1))) { - DHPRINT("BN_set_word NULL\n"); - return 0; - } - - a->d[0] = w; - a->top = (w ? 1 : 0); - return 1; -} - -static struct bignum_st *BN_bin2bn(const unsigned char *s, int len, - struct bignum_st *ret) -{ - unsigned int i, m; - unsigned int n; - BN_ULONG l; - struct bignum_st *bn = NULL; - - if (ret == NULL) - ret = bn = BN_new(); - - if (ret == NULL) - return NULL; - - l = 0; - n = len; - - if (n == 0) { - ret->top = 0; - return ret; - } - - i = ((n - 1) / BN_BYTES) + 1; - m = ((n - 1) % (BN_BYTES)); - - if (bn_wexpand(ret, (int)i) == NULL) { - BN_free(bn); - return NULL; - } - - ret->top = i; - - while (n--) { - l = (l << 8L) | *(s++); - - if (m-- == 0) { - ret->d[--i] = l; - l = 0; - m = BN_BYTES - 1; - } - } - - /* need to call this due to clear byte at top if avoiding - * having the top bit set (-ve number) */ - bn_correct_top(ret); - return ret; -} - -static int BN_ucmp(const struct bignum_st *a, const struct bignum_st *b) -{ - int i; - BN_ULONG t1, t2, *ap, *bp; - - i = a->top - b->top; - - if (i != 0) - return i; - - ap = a->d; - bp = b->d; - - for (i = a->top - 1; i >= 0; i--) { - t1 = ap[i]; - t2 = bp[i]; - - if (t1 != t2) - return ((t1 > t2) ? 1 : -1); - } - - return 0; -} - -/* ignore negative */ -static int BN_bn2bin(const struct bignum_st *a, unsigned char *to) -{ - int n, i; - BN_ULONG l; - - n = i = BN_num_bytes(a); - - while (i--) { - l = a->d[i / BN_BYTES]; - *(to++) = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff; - } - - return n; -} -#ifdef BN_RECURSION -static int BN_cmp(const struct bignum_st *a, const struct bignum_st *b) -{ - int i; - int gt, lt; - BN_ULONG t1, t2; - - if ((a == NULL) || (b == NULL)) { - if (a != NULL) - return -1; - else if (b != NULL) - return 1; - else - return 0; - } - - { - gt = 1; - lt = -1; - } - - if (a->top > b->top) - return gt; - - if (a->top < b->top) - return lt; - - for (i = a->top - 1; i >= 0; i--) { - t1 = a->d[i]; - t2 = b->d[i]; - - if (t1 > t2) - return gt; - - if (t1 < t2) - return lt; - } - - return 0; -} -#endif /*BN_RECURSION */ -static int BN_set_bit(struct bignum_st *a, int n) -{ - int i, j, k; - - if (n < 0) - return 0; - - i = n / BN_BITS2; - j = n % BN_BITS2; - - if (a->top <= i) { - if (bn_wexpand(a, i + 1) == NULL) - return 0; - - for (k = a->top; k < i + 1; k++) - a->d[k] = 0; - - a->top = i + 1; - } - - a->d[i] |= (((BN_ULONG)1) << j); - return 1; -} - -static int BN_is_bit_set(const struct bignum_st *a, int n) -{ - int i, j; - - if (n < 0) - return 0; - - i = n / BN_BITS2; - j = n % BN_BITS2; - - if (a->top <= i) - return 0; - - return ((a->d[i] & (((BN_ULONG)1) << j)) ? 1 : 0); -} - -#ifdef BN_RECURSION -static int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n) -{ - int i; - BN_ULONG aa, bb; - - aa = a[n - 1]; - bb = b[n - 1]; - - if (aa != bb) - return ((aa > bb) ? 1 : -1); - - for (i = n - 2; i >= 0; i--) { - aa = a[i]; - bb = b[i]; - - if (aa != bb) - return ((aa > bb) ? 1 : -1); - } - - return 0; -} - -/* Here follows a specialised variants of bn_cmp_words(). It has the - property of performing the operation on arrays of different sizes. - The sizes of those arrays is expressed through cl, which is the - common length ( basicall, min(len(a),len(b)) ), and dl, which is the - delta between the two lengths, calculated as len(a)-len(b). - All lengths are the number of BN_ULONGs... */ -static int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, - int dl) -{ - int n, i; - - n = cl - 1; - - if (dl < 0) { - for (i = dl; i < 0; i++) { - if (b[n - i] != 0) - return -1; /* a < b */ - } - } - - if (dl > 0) { - for (i = dl; i > 0; i--) { - if (a[n + i] != 0) - return 1; /* a > b */ - } - } - - return bn_cmp_words(a, b, cl); -} -#endif /*BN_RECURSION */ -static int BN_rshift1(struct bignum_st *r, const struct bignum_st *a) -{ - BN_ULONG *ap, *rp, t, c; - int i; - - if (BN_is_zero(a)) { - BN_zero(r); - return 1; - } - - if (a != r) { - if (bn_wexpand(r, a->top) == NULL) - return 0; - - r->top = a->top; - } - - ap = a->d; - rp = r->d; - c = 0; - - for (i = a->top - 1; i >= 0; i--) { - t = ap[i]; - rp[i] = ((t >> 1) & BN_MASK2) | c; - c = (t & 1) ? BN_TBIT : 0; - } - - bn_correct_top(r); - return 1; -} - -static int BN_lshift(struct bignum_st *r, const struct bignum_st *a, int n) -{ - int i, nw, lb, rb; - BN_ULONG *t, *f; - BN_ULONG l; - - nw = n / BN_BITS2; - - if (bn_wexpand(r, a->top + nw + 1) == NULL) - return 0; - - lb = n % BN_BITS2; - rb = BN_BITS2 - lb; - f = a->d; - t = r->d; - t[a->top + nw] = 0; - - if (lb == 0) - for (i = a->top - 1; i >= 0; i--) - t[nw + i] = f[i]; - else - for (i = a->top - 1; i >= 0; i--) { - l = f[i]; - t[nw + i + 1] |= (l >> rb) & BN_MASK2; - t[nw + i] = (l << lb) & BN_MASK2; - } - - memset(t, 0, nw * sizeof(t[0])); - /* for (i=0; itop = a->top + nw + 1; - bn_correct_top(r); - return 1; -} - -static int BN_rshift(struct bignum_st *r, const struct bignum_st *a, int n) -{ - int i, j, nw, lb, rb; - BN_ULONG *t, *f; - BN_ULONG l, tmp; - - nw = n / BN_BITS2; - rb = n % BN_BITS2; - lb = BN_BITS2 - rb; - - if (nw > a->top || a->top == 0) { - BN_zero(r); - return 1; - } - - if (r != a) { - if (bn_wexpand(r, a->top - nw + 1) == NULL) - return 0; - } else { - if (n == 0) - return 1; /* or the copying loop will go berserk */ - } - - f = &(a->d[nw]); - t = r->d; - j = a->top - nw; - r->top = j; - - if (rb == 0) { - for (i = j; i != 0; i--) - *(t++) = *(f++); - } else { - l = *(f++); - - for (i = j - 1; i != 0; i--) { - tmp = (l >> rb) & BN_MASK2; - l = *(f++); - *(t++) = (tmp | (l << lb)) & BN_MASK2; - } - - *(t++) = (l >> rb) & BN_MASK2; - } - - bn_correct_top(r); - return 1; -} - -static void BN_POOL_release(struct bignum_pool *p, unsigned int num) -{ - unsigned int offset = (p->used - 1) % BN_CTX_POOL_SIZE; - - p->used -= num; - - while (num--) { - if (!offset) { - offset = BN_CTX_POOL_SIZE - 1; - p->currentvar = p->currentvar->prev; - } else - offset--; - } -} - -static void BN_POOL_finish(struct bignum_pool *p) -{ - while (p->head) { - struct bignum_st *bn = p->head->vals; - unsigned int loop = 0; - - while (loop++ < BN_CTX_POOL_SIZE) { - if (bn->d) - BN_clear_free(bn); - - bn++; - } - - p->currentvar = p->head->next; - os_free_mem(p->head); - p->head = p->currentvar; - } -} - -static struct bignum_st *BN_POOL_get(struct bignum_pool *p) -{ - struct bignum_st *ret = NULL; - - if (p->used == p->size) { - struct bignum_st *bn; - unsigned int loop = 0; - struct bignum_pool_item *item; - - os_alloc_mem(NULL, (UCHAR **)&item, - sizeof(struct bignum_pool_item)); - - if (!item) - goto end; - - /* Initialise the structure */ - bn = item->vals; - - while (loop++ < BN_CTX_POOL_SIZE) - BN_init(bn++); - - item->prev = p->tail; - item->next = NULL; - - /* Link it in */ - if (!p->head) - p->head = p->currentvar = p->tail = item; - else { - p->tail->next = item; - p->tail = item; - p->currentvar = item; - } - - p->size += BN_CTX_POOL_SIZE; - p->used++; - /* Return the first bignum from the new pool */ - ret = item->vals; - } - - if (!p->used) - p->currentvar = p->head; - else if ((p->used % BN_CTX_POOL_SIZE) == 0) - p->currentvar = p->currentvar->next; - - ret = p->currentvar->vals + ((p->used) % BN_CTX_POOL_SIZE); - p->used++; -end: - - if (ret == NULL) - DHPRINT("BN_POOL_get ERROR !!!"); - else { - /* OK, make sure the returned bignum is "zero" */ - BN_zero(ret); - } - - return ret; -} - -static struct bignum_st *BN_copy(struct bignum_st *a, const struct bignum_st *b) -{ - int i; - BN_ULONG *A; - const BN_ULONG *B; - - if (BN_ucmp(a, b) == 0) - return a; - - if (bn_wexpand(a, b->top) == NULL) - return NULL; - - A = a->d; - B = b->d; - - for (i = b->top >> 2; i > 0; i--, A += 4, B += 4) { - BN_ULONG a0, a1, a2, a3; - - a0 = B[0]; - a1 = B[1]; - a2 = B[2]; - a3 = B[3]; - A[0] = a0; - A[1] = a1; - A[2] = a2; - A[3] = a3; - } - - switch (b->top & 3) { - case 3: - A[2] = B[2]; - - case 2: - A[1] = B[1]; - - case 1: - A[0] = B[0]; - - case 0:; /* ultrix cc workaround, see comments in bn_expand_internal */ - } - - a->top = b->top; - return a; -} - -/* Divide h,l by d and return the result. */ -/* I need to test this some more :-( */ -BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d) -{ - BN_ULONG dh, dl, q, ret = 0, th, tl, t; - int i, count = 2; - - if (d == 0) - return BN_MASK2; - - i = BN_num_bits_word(d); - i = BN_BITS2 - i; - - if (h >= d) - h -= d; - - if (i) { - d <<= i; - h = (h << i) | (l >> (BN_BITS2 - i)); - l <<= i; - } - - dh = (d & BN_MASK2h) >> BN_BITS4; - dl = (d & BN_MASK2l); - - for (;;) { - if ((h >> BN_BITS4) == dh) - q = BN_MASK2l; - else - q = h / dh; - - th = q * dh; - tl = dl * q; - - for (;;) { - t = h - th; - - if ((t & BN_MASK2h) || - ((tl) <= - ((t << BN_BITS4) | ((l & BN_MASK2h) >> BN_BITS4)))) - break; - - q--; - th -= dh; - tl -= dl; - } - - t = (tl >> BN_BITS4); - tl = (tl << BN_BITS4) & BN_MASK2h; - th += t; - - if (l < tl) - th++; - - l -= tl; - - if (h < th) { - h += d; - q--; - } - - h -= th; - - if (--count == 0) - break; - - ret = q << BN_BITS4; - h = ((h << BN_BITS4) | (l >> BN_BITS4)) & BN_MASK2; - l = (l & BN_MASK2l) << BN_BITS4; - } - - ret |= q; - return ret; -} - -/* BN_div computes dv := num / divisor, rounding towards zero, and sets up - * rm such that dv*divisor + rm = num holds. - * If 'dv' or 'rm' is NULL, the respective value is not returned. - */ -static int BN_div(struct bignum_st *dv, struct bignum_st *rm, - const struct bignum_st *num, const struct bignum_st *divisor, - struct bignum_pool *ctx) -{ - int release = 0; - int norm_shift, i, loop; - struct bignum_st *tmp, wnum, *snum, *sdiv, *res; - BN_ULONG *resp, *wnump; - BN_ULONG d0, d1; - int num_n, div_n; - - if (BN_is_zero(divisor)) - return 0; - - if (BN_ucmp(num, divisor) < 0) { - if (rm != NULL) { - if (BN_copy(rm, num) == NULL) - return 0; - } - - if (dv != NULL) - BN_zero(dv); - - return 1; - } - - tmp = BN_POOL_get(ctx); - snum = BN_POOL_get(ctx); - sdiv = BN_POOL_get(ctx); - release += 3; - - if (dv == NULL) { - res = BN_POOL_get(ctx); - release++; - } else - res = dv; - - if (sdiv == NULL || res == NULL) - goto err; - - /* First we normalise the numbers */ - norm_shift = BN_BITS2 - ((BN_num_bits(divisor)) % BN_BITS2); - - if (!(BN_lshift(sdiv, divisor, norm_shift))) - goto err; - - norm_shift += BN_BITS2; - - if (!(BN_lshift(snum, num, norm_shift))) - goto err; - - div_n = sdiv->top; - num_n = snum->top; - loop = num_n - div_n; - /* Lets setup a 'window' into snum - * This is the part that corresponds to the current - * 'area' being divided */ - wnum.d = &(snum->d[loop]); - wnum.top = div_n; - /* only needed when BN_ucmp messes up the values between top and max */ - wnum.dmax = snum->dmax - loop; /* so we don't step out of bounds */ - /* Get the top 2 words of sdiv */ - /* div_n=sdiv->top; */ - d0 = sdiv->d[div_n - 1]; - d1 = (div_n == 1) ? 0 : sdiv->d[div_n - 2]; - /* pointer to the 'top' of snum */ - wnump = &(snum->d[num_n - 1]); - - /* Setup to 'res' */ - if (!bn_wexpand(res, (loop + 1))) - goto err; - - res->top = loop; - resp = &(res->d[loop - 1]); - - /* space for temp */ - if (!bn_wexpand(tmp, (div_n + 1))) - goto err; - - if (BN_ucmp(&wnum, sdiv) >= 0) { - bn_sub_words(wnum.d, wnum.d, sdiv->d, div_n); - *resp = 1; - } else - res->top--; - - /* if res->top == 0 then clear the neg value otherwise decrease - * the resp pointer */ - if (res->top != 0) - resp--; - - for (i = 0; i < loop - 1; i++, wnump--, resp--) { - BN_ULONG q, l0; - /* the first part of the loop uses the top two words of - * snum and sdiv to calculate a BN_ULONG q such that - * | wnum - sdiv * q | < sdiv */ - BN_ULONG n0, n1, rem = 0; - - n0 = wnump[0]; - n1 = wnump[-1]; - - if (n0 == d0) - q = BN_MASK2; - else { /* n0 < d0 */ - BN_ULONG t2l, t2h, ql, qh; - - q = bn_div_words(n0, n1, d0); - rem = (n1 - q * d0) & BN_MASK2; - t2l = LBITS(d1); - t2h = HBITS(d1); - ql = LBITS(q); - qh = HBITS(q); - mul64(t2l, t2h, ql, qh); /* t2=(BN_ULLONG)d1*q; */ - - for (;;) { - if ((t2h < rem) || - ((t2h == rem) && (t2l <= wnump[-2]))) - break; - - q--; - rem += d0; - - if (rem < d0) - break; /* don't let rem overflow */ - - if (t2l < d1) - t2h--; - - t2l -= d1; - } - } - - l0 = bn_mul_words(tmp->d, sdiv->d, div_n, q); - tmp->d[div_n] = l0; - wnum.d--; - - /* ingore top values of the bignums just sub the two - * BN_ULONG arrays with bn_sub_words */ - if (bn_sub_words(wnum.d, wnum.d, tmp->d, div_n + 1)) { - /* Note: As we have considered only the leading - * two BN_ULONGs in the calculation of q, sdiv * q - * might be greater than wnum (but then (q-1) * sdiv - * is less or equal than wnum) - */ - q--; - - if (bn_add_words(wnum.d, wnum.d, sdiv->d, div_n)) - /* we can't have an overflow here (assuming - * that q != 0, but if q == 0 then tmp is - * zero anyway) */ - (*wnump)++; - } - - /* store part of the result */ - *resp = q; - } - - bn_correct_top(snum); - - if (rm != NULL) { - /* Keep a copy of the neg flag in num because if rm==num - * BN_rshift() will overwrite it. - */ - BN_rshift(rm, snum, norm_shift); - } - - BN_POOL_release(ctx, release); - return 1; -err: - BN_POOL_release(ctx, release); - return 0; -} -/*bn_div END*/ - -/*bn_asm START*/ -static BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, - BN_ULONG w) -{ - BN_ULONG c = 0; - BN_ULONG bl, bh; - - if (num <= 0) - return ((BN_ULONG)0); - - bl = LBITS(w); - bh = HBITS(w); - - for (;;) { - mul_add(rp[0], ap[0], bl, bh, c); - - if (--num == 0) - break; - - mul_add(rp[1], ap[1], bl, bh, c); - - if (--num == 0) - break; - - mul_add(rp[2], ap[2], bl, bh, c); - - if (--num == 0) - break; - - mul_add(rp[3], ap[3], bl, bh, c); - - if (--num == 0) - break; - - ap += 4; - rp += 4; - } - - return c; -} - -static BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, - BN_ULONG w) -{ - BN_ULONG carry = 0; - BN_ULONG bl, bh; - - if (num <= 0) - return ((BN_ULONG)0); - - bl = LBITS(w); - bh = HBITS(w); - - for (;;) { - mul(rp[0], ap[0], bl, bh, carry); - - if (--num == 0) - break; - - mul(rp[1], ap[1], bl, bh, carry); - - if (--num == 0) - break; - - mul(rp[2], ap[2], bl, bh, carry); - - if (--num == 0) - break; - - mul(rp[3], ap[3], bl, bh, carry); - - if (--num == 0) - break; - - ap += 4; - rp += 4; - } - - return carry; -} - -static void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) -{ - if (n <= 0) - return; - - for (;;) { - sqr64(r[0], r[1], a[0]); - - if (--n == 0) - break; - - sqr64(r[2], r[3], a[1]); - - if (--n == 0) - break; - - sqr64(r[4], r[5], a[2]); - - if (--n == 0) - break; - - sqr64(r[6], r[7], a[3]); - - if (--n == 0) - break; - - a += 4; - r += 8; - } -} - -static BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - int n) -{ - BN_ULONG c, l, t; - - if (n <= 0) - return ((BN_ULONG)0); - - c = 0; - - for (;;) { - t = a[0]; - t = (t + c) & BN_MASK2; - c = (t < c); - l = (t + b[0]) & BN_MASK2; - c += (l < t); - r[0] = l; - - if (--n <= 0) - break; - - t = a[1]; - t = (t + c) & BN_MASK2; - c = (t < c); - l = (t + b[1]) & BN_MASK2; - c += (l < t); - r[1] = l; - - if (--n <= 0) - break; - - t = a[2]; - t = (t + c) & BN_MASK2; - c = (t < c); - l = (t + b[2]) & BN_MASK2; - c += (l < t); - r[2] = l; - - if (--n <= 0) - break; - - t = a[3]; - t = (t + c) & BN_MASK2; - c = (t < c); - l = (t + b[3]) & BN_MASK2; - c += (l < t); - r[3] = l; - - if (--n <= 0) - break; - - a += 4; - b += 4; - r += 4; - } - - return ((BN_ULONG)c); -} - -static BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - int n) -{ - BN_ULONG t1, t2; - int c = 0; - - if (n <= 0) - return ((BN_ULONG)0); - - for (;;) { - t1 = a[0]; - t2 = b[0]; - r[0] = (t1 - t2 - c) & BN_MASK2; - - if (t1 != t2) - c = (t1 < t2); - - if (--n <= 0) - break; - - t1 = a[1]; - t2 = b[1]; - r[1] = (t1 - t2 - c) & BN_MASK2; - - if (t1 != t2) - c = (t1 < t2); - - if (--n <= 0) - break; - - t1 = a[2]; - t2 = b[2]; - r[2] = (t1 - t2 - c) & BN_MASK2; - - if (t1 != t2) - c = (t1 < t2); - - if (--n <= 0) - break; - - t1 = a[3]; - t2 = b[3]; - r[3] = (t1 - t2 - c) & BN_MASK2; - - if (t1 != t2) - c = (t1 < t2); - - if (--n <= 0) - break; - - a += 4; - b += 4; - r += 4; - } - - return c; -} - -#ifdef BN_MUL_COMBA - -#undef bn_mul_comba8 -#undef bn_mul_comba4 -#undef bn_sqr_comba8 -#undef bn_sqr_comba4 - -/* mul_add_c(a,b,c0,c1,c2) -- c+=a*b for three word number c=(c2,c1,c0) */ -/* mul_add_c2(a,b,c0,c1,c2) -- c+=2*a*b for three word number c=(c2,c1,c0) */ -/* sqr_add_c(a,i,c0,c1,c2) -- c+=a[i]^2 for three word number c=(c2,c1,c0) */ -/* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */ - -#define mul_add_c(a, b, c0, c1, c2) \ - do { \ - t1 = LBITS(a); \ - t2 = HBITS(a); \ - bl = LBITS(b); \ - bh = HBITS(b); \ - mul64(t1, t2, bl, bh); \ - c0 = (c0 + t1) & BN_MASK2; \ - if ((c0) < t1) \ - t2++; \ - c1 = (c1 + t2) & BN_MASK2; \ - if ((c1) < t2) \ - c2++; \ - } while (0) - -#define mul_add_c2(a, b, c0, c1, c2) \ - do { \ - t1 = LBITS(a); \ - t2 = HBITS(a); \ - bl = LBITS(b); \ - bh = HBITS(b); \ - mul64(t1, t2, bl, bh); \ - if (t2 & BN_TBIT) \ - c2++; \ - t2 = (t2 + t2) & BN_MASK2; \ - if (t1 & BN_TBIT) \ - t2++; \ - t1 = (t1 + t1) & BN_MASK2; \ - c0 = (c0 + t1) & BN_MASK2; \ - if ((c0 < t1) && (((++t2) & BN_MASK2) == 0)) \ - c2++; \ - c1 = (c1 + t2) & BN_MASK2; \ - if ((c1) < t2) \ - c2++; \ - } while (0) - -#define sqr_add_c(a, i, c0, c1, c2) \ - do { \ - sqr64(t1, t2, (a)[i]); \ - c0 = (c0 + t1) & BN_MASK2; \ - if ((c0) < t1) \ - t2++; \ - c1 = (c1 + t2) & BN_MASK2; \ - if ((c1) < t2) \ - c2++; \ - } while (0) - -#define sqr_add_c2(a, i, j, c0, c1, c2) mul_add_c2((a)[i], (a)[j], c0, c1, c2) - -static void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) -{ - BN_ULONG bl, bh; - BN_ULONG t1, t2; - BN_ULONG c1, c2, c3; - - c1 = 0; - c2 = 0; - c3 = 0; - mul_add_c(a[0], b[0], c1, c2, c3); - r[0] = c1; - c1 = 0; - mul_add_c(a[0], b[1], c2, c3, c1); - mul_add_c(a[1], b[0], c2, c3, c1); - r[1] = c2; - c2 = 0; - mul_add_c(a[2], b[0], c3, c1, c2); - mul_add_c(a[1], b[1], c3, c1, c2); - mul_add_c(a[0], b[2], c3, c1, c2); - r[2] = c3; - c3 = 0; - mul_add_c(a[0], b[3], c1, c2, c3); - mul_add_c(a[1], b[2], c1, c2, c3); - mul_add_c(a[2], b[1], c1, c2, c3); - mul_add_c(a[3], b[0], c1, c2, c3); - r[3] = c1; - c1 = 0; - mul_add_c(a[4], b[0], c2, c3, c1); - mul_add_c(a[3], b[1], c2, c3, c1); - mul_add_c(a[2], b[2], c2, c3, c1); - mul_add_c(a[1], b[3], c2, c3, c1); - mul_add_c(a[0], b[4], c2, c3, c1); - r[4] = c2; - c2 = 0; - mul_add_c(a[0], b[5], c3, c1, c2); - mul_add_c(a[1], b[4], c3, c1, c2); - mul_add_c(a[2], b[3], c3, c1, c2); - mul_add_c(a[3], b[2], c3, c1, c2); - mul_add_c(a[4], b[1], c3, c1, c2); - mul_add_c(a[5], b[0], c3, c1, c2); - r[5] = c3; - c3 = 0; - mul_add_c(a[6], b[0], c1, c2, c3); - mul_add_c(a[5], b[1], c1, c2, c3); - mul_add_c(a[4], b[2], c1, c2, c3); - mul_add_c(a[3], b[3], c1, c2, c3); - mul_add_c(a[2], b[4], c1, c2, c3); - mul_add_c(a[1], b[5], c1, c2, c3); - mul_add_c(a[0], b[6], c1, c2, c3); - r[6] = c1; - c1 = 0; - mul_add_c(a[0], b[7], c2, c3, c1); - mul_add_c(a[1], b[6], c2, c3, c1); - mul_add_c(a[2], b[5], c2, c3, c1); - mul_add_c(a[3], b[4], c2, c3, c1); - mul_add_c(a[4], b[3], c2, c3, c1); - mul_add_c(a[5], b[2], c2, c3, c1); - mul_add_c(a[6], b[1], c2, c3, c1); - mul_add_c(a[7], b[0], c2, c3, c1); - r[7] = c2; - c2 = 0; - mul_add_c(a[7], b[1], c3, c1, c2); - mul_add_c(a[6], b[2], c3, c1, c2); - mul_add_c(a[5], b[3], c3, c1, c2); - mul_add_c(a[4], b[4], c3, c1, c2); - mul_add_c(a[3], b[5], c3, c1, c2); - mul_add_c(a[2], b[6], c3, c1, c2); - mul_add_c(a[1], b[7], c3, c1, c2); - r[8] = c3; - c3 = 0; - mul_add_c(a[2], b[7], c1, c2, c3); - mul_add_c(a[3], b[6], c1, c2, c3); - mul_add_c(a[4], b[5], c1, c2, c3); - mul_add_c(a[5], b[4], c1, c2, c3); - mul_add_c(a[6], b[3], c1, c2, c3); - mul_add_c(a[7], b[2], c1, c2, c3); - r[9] = c1; - c1 = 0; - mul_add_c(a[7], b[3], c2, c3, c1); - mul_add_c(a[6], b[4], c2, c3, c1); - mul_add_c(a[5], b[5], c2, c3, c1); - mul_add_c(a[4], b[6], c2, c3, c1); - mul_add_c(a[3], b[7], c2, c3, c1); - r[10] = c2; - c2 = 0; - mul_add_c(a[4], b[7], c3, c1, c2); - mul_add_c(a[5], b[6], c3, c1, c2); - mul_add_c(a[6], b[5], c3, c1, c2); - mul_add_c(a[7], b[4], c3, c1, c2); - r[11] = c3; - c3 = 0; - mul_add_c(a[7], b[5], c1, c2, c3); - mul_add_c(a[6], b[6], c1, c2, c3); - mul_add_c(a[5], b[7], c1, c2, c3); - r[12] = c1; - c1 = 0; - mul_add_c(a[6], b[7], c2, c3, c1); - mul_add_c(a[7], b[6], c2, c3, c1); - r[13] = c2; - c2 = 0; - mul_add_c(a[7], b[7], c3, c1, c2); - r[14] = c3; - r[15] = c1; -} -#ifdef BN_RECURSION -static void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) -{ - BN_ULONG bl, bh; - BN_ULONG t1, t2; - BN_ULONG c1, c2, c3; - - c1 = 0; - c2 = 0; - c3 = 0; - mul_add_c(a[0], b[0], c1, c2, c3); - r[0] = c1; - c1 = 0; - mul_add_c(a[0], b[1], c2, c3, c1); - mul_add_c(a[1], b[0], c2, c3, c1); - r[1] = c2; - c2 = 0; - mul_add_c(a[2], b[0], c3, c1, c2); - mul_add_c(a[1], b[1], c3, c1, c2); - mul_add_c(a[0], b[2], c3, c1, c2); - r[2] = c3; - c3 = 0; - mul_add_c(a[0], b[3], c1, c2, c3); - mul_add_c(a[1], b[2], c1, c2, c3); - mul_add_c(a[2], b[1], c1, c2, c3); - mul_add_c(a[3], b[0], c1, c2, c3); - r[3] = c1; - c1 = 0; - mul_add_c(a[3], b[1], c2, c3, c1); - mul_add_c(a[2], b[2], c2, c3, c1); - mul_add_c(a[1], b[3], c2, c3, c1); - r[4] = c2; - c2 = 0; - mul_add_c(a[2], b[3], c3, c1, c2); - mul_add_c(a[3], b[2], c3, c1, c2); - r[5] = c3; - c3 = 0; - mul_add_c(a[3], b[3], c1, c2, c3); - r[6] = c1; - r[7] = c2; -} -#endif /*BN_RECURSION */ -static void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a) -{ - BN_ULONG bl, bh; - BN_ULONG t1, t2; - BN_ULONG c1, c2, c3; - - c1 = 0; - c2 = 0; - c3 = 0; - sqr_add_c(a, 0, c1, c2, c3); - r[0] = c1; - c1 = 0; - sqr_add_c2(a, 1, 0, c2, c3, c1); - r[1] = c2; - c2 = 0; - sqr_add_c(a, 1, c3, c1, c2); - sqr_add_c2(a, 2, 0, c3, c1, c2); - r[2] = c3; - c3 = 0; - sqr_add_c2(a, 3, 0, c1, c2, c3); - sqr_add_c2(a, 2, 1, c1, c2, c3); - r[3] = c1; - c1 = 0; - sqr_add_c(a, 2, c2, c3, c1); - sqr_add_c2(a, 3, 1, c2, c3, c1); - sqr_add_c2(a, 4, 0, c2, c3, c1); - r[4] = c2; - c2 = 0; - sqr_add_c2(a, 5, 0, c3, c1, c2); - sqr_add_c2(a, 4, 1, c3, c1, c2); - sqr_add_c2(a, 3, 2, c3, c1, c2); - r[5] = c3; - c3 = 0; - sqr_add_c(a, 3, c1, c2, c3); - sqr_add_c2(a, 4, 2, c1, c2, c3); - sqr_add_c2(a, 5, 1, c1, c2, c3); - sqr_add_c2(a, 6, 0, c1, c2, c3); - r[6] = c1; - c1 = 0; - sqr_add_c2(a, 7, 0, c2, c3, c1); - sqr_add_c2(a, 6, 1, c2, c3, c1); - sqr_add_c2(a, 5, 2, c2, c3, c1); - sqr_add_c2(a, 4, 3, c2, c3, c1); - r[7] = c2; - c2 = 0; - sqr_add_c(a, 4, c3, c1, c2); - sqr_add_c2(a, 5, 3, c3, c1, c2); - sqr_add_c2(a, 6, 2, c3, c1, c2); - sqr_add_c2(a, 7, 1, c3, c1, c2); - r[8] = c3; - c3 = 0; - sqr_add_c2(a, 7, 2, c1, c2, c3); - sqr_add_c2(a, 6, 3, c1, c2, c3); - sqr_add_c2(a, 5, 4, c1, c2, c3); - r[9] = c1; - c1 = 0; - sqr_add_c(a, 5, c2, c3, c1); - sqr_add_c2(a, 6, 4, c2, c3, c1); - sqr_add_c2(a, 7, 3, c2, c3, c1); - r[10] = c2; - c2 = 0; - sqr_add_c2(a, 7, 4, c3, c1, c2); - sqr_add_c2(a, 6, 5, c3, c1, c2); - r[11] = c3; - c3 = 0; - sqr_add_c(a, 6, c1, c2, c3); - sqr_add_c2(a, 7, 5, c1, c2, c3); - r[12] = c1; - c1 = 0; - sqr_add_c2(a, 7, 6, c2, c3, c1); - r[13] = c2; - c2 = 0; - sqr_add_c(a, 7, c3, c1, c2); - r[14] = c3; - r[15] = c1; -} - -static void bn_sqr_comba4(BN_ULONG *r, const BN_ULONG *a) -{ - BN_ULONG bl, bh; - BN_ULONG t1, t2; - BN_ULONG c1, c2, c3; - - c1 = 0; - c2 = 0; - c3 = 0; - sqr_add_c(a, 0, c1, c2, c3); - r[0] = c1; - c1 = 0; - sqr_add_c2(a, 1, 0, c2, c3, c1); - r[1] = c2; - c2 = 0; - sqr_add_c(a, 1, c3, c1, c2); - sqr_add_c2(a, 2, 0, c3, c1, c2); - r[2] = c3; - c3 = 0; - sqr_add_c2(a, 3, 0, c1, c2, c3); - sqr_add_c2(a, 2, 1, c1, c2, c3); - r[3] = c1; - c1 = 0; - sqr_add_c(a, 2, c2, c3, c1); - sqr_add_c2(a, 3, 1, c2, c3, c1); - r[4] = c2; - c2 = 0; - sqr_add_c2(a, 3, 2, c3, c1, c2); - r[5] = c3; - c3 = 0; - sqr_add_c(a, 3, c1, c2, c3); - r[6] = c1; - r[7] = c2; -} -#endif /* !BN_MUL_COMBA */ -/*bn_asm END*/ - -/*bn_mul START*/ -/* Here follows specialised variants of bn_add_words() and - bn_sub_words(). They have the property performing operations on - arrays of different sizes. The sizes of those arrays is expressed through - cl, which is the common length ( basicall, min(len(a),len(b)) ), and dl, - which is the delta between the two lengths, calculated as len(a)-len(b). - All lengths are the number of BN_ULONGs... For the operations that require - a result array as parameter, it must have the length cl+abs(dl). - These functions should probably end up in bn_asm.c as soon as there are - assembler counterparts for the systems that use assembler files. */ -#ifdef BN_RECURSION -static BN_ULONG bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, - const BN_ULONG *b, int cl, int dl) -{ - BN_ULONG c, t; - - c = bn_sub_words(r, a, b, cl); - - if (dl == 0) - return c; - - r += cl; - a += cl; - b += cl; - - if (dl < 0) { - for (;;) { - t = b[0]; - r[0] = (0 - t - c) & BN_MASK2; - - if (t != 0) - c = 1; - - if (++dl >= 0) - break; - - t = b[1]; - r[1] = (0 - t - c) & BN_MASK2; - - if (t != 0) - c = 1; - - if (++dl >= 0) - break; - - t = b[2]; - r[2] = (0 - t - c) & BN_MASK2; - - if (t != 0) - c = 1; - - if (++dl >= 0) - break; - - t = b[3]; - r[3] = (0 - t - c) & BN_MASK2; - - if (t != 0) - c = 1; - - if (++dl >= 0) - break; - - b += 4; - r += 4; - } - } else { - int save_dl = dl; - - while (c) { - t = a[0]; - r[0] = (t - c) & BN_MASK2; - - if (t != 0) - c = 0; - - if (--dl <= 0) - break; - - t = a[1]; - r[1] = (t - c) & BN_MASK2; - - if (t != 0) - c = 0; - - if (--dl <= 0) - break; - - t = a[2]; - r[2] = (t - c) & BN_MASK2; - - if (t != 0) - c = 0; - - if (--dl <= 0) - break; - - t = a[3]; - r[3] = (t - c) & BN_MASK2; - - if (t != 0) - c = 0; - - if (--dl <= 0) - break; - - save_dl = dl; - a += 4; - r += 4; - } - - if (dl > 0) { - if (save_dl > dl) { - switch (save_dl - dl) { - case 1: - r[1] = a[1]; - - if (--dl <= 0) - break; - - case 2: - r[2] = a[2]; - - if (--dl <= 0) - break; - - case 3: - r[3] = a[3]; - - if (--dl <= 0) - break; - } - - a += 4; - r += 4; - } - } - - if (dl > 0) { - for (;;) { - r[0] = a[0]; - - if (--dl <= 0) - break; - - r[1] = a[1]; - - if (--dl <= 0) - break; - - r[2] = a[2]; - - if (--dl <= 0) - break; - - r[3] = a[3]; - - if (--dl <= 0) - break; - - a += 4; - r += 4; - } - } - } - - return c; -} - -/* Karatsuba recursive multiplication algorithm - * (cf. Knuth, The Art of Computer Programming, Vol. 2) */ - -/* r is 2*n2 words in size, - * a and b are both n2 words in size. - * n2 must be a power of 2. - * We multiply and return the result. - * t must be 2*n2 words in size - * We calculate - * a[0]*b[0] - * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0]) - * a[1]*b[1] - */ -static void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2, - int dna, int dnb, BN_ULONG *t) -{ - int n = n2 / 2, c1, c2; - int tna = n + dna, tnb = n + dnb; - unsigned int neg, zero; - BN_ULONG ln, lo, *p; -#ifdef BN_MUL_COMBA - - /* Only call bn_mul_comba 8 if n2 == 8 and the - * two arrays are complete [steve] - */ - if (n2 == 8 && dna == 0 && dnb == 0) { - bn_mul_comba8(r, a, b); - return; - } - -#endif /* BN_MUL_COMBA */ - - /* Else do normal multiply */ - if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL) { - bn_mul_normal(r, a, n2 + dna, b, n2 + dnb); - - if ((dna + dnb) < 0) - memset(&r[2 * n2 + dna + dnb], 0, - sizeof(BN_ULONG) * -(dna + dnb)); - - return; - } - - /* r=(a[0]-a[1])*(b[1]-b[0]) */ - c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna); - c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n); - zero = neg = 0; - - switch (c1 * 3 + c2) { - case -4: - bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ - bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ - break; - - case -3: - zero = 1; - break; - - case -2: - bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ - bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */ - neg = 1; - break; - - case -1: - case 0: - case 1: - zero = 1; - break; - - case 2: - bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */ - bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ - neg = 1; - break; - - case 3: - zero = 1; - break; - - case 4: - bn_sub_part_words(t, a, &(a[n]), tna, n - tna); - bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); - break; - } - -#ifdef BN_MUL_COMBA - - if (n == 4 && dna == 0 && dnb == 0) /* XXX: bn_mul_comba4 could take - extra args to do this well */ - { - if (!zero) - bn_mul_comba4(&(t[n2]), t, &(t[n])); - else - memset(&(t[n2]), 0, 8 * sizeof(BN_ULONG)); - - bn_mul_comba4(r, a, b); - bn_mul_comba4(&(r[n2]), &(a[n]), &(b[n])); - } else if (n == 8 && dna == 0 && dnb == 0) /* XXX: bn_mul_comba8 could - take extra args to do this - well */ - { - if (!zero) - bn_mul_comba8(&(t[n2]), t, &(t[n])); - else - memset(&(t[n2]), 0, 16 * sizeof(BN_ULONG)); - - bn_mul_comba8(r, a, b); - bn_mul_comba8(&(r[n2]), &(a[n]), &(b[n])); - } else -#endif /* BN_MUL_COMBA */ - { - p = &(t[n2 * 2]); - - if (!zero) - bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p); - else - memset(&(t[n2]), 0, n2 * sizeof(BN_ULONG)); - - bn_mul_recursive(r, a, b, n, 0, 0, p); - bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), n, dna, dnb, p); - } - - /* t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - */ - c1 = (int)(bn_add_words(t, r, &(r[n2]), n2)); - - if (neg) /* if t[32] is negative */ - c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2)); - else { - /* Might have a carry */ - c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2)); - } - - /* t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1]) - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - * c1 holds the carry bits - */ - c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2)); - - if (c1) { - p = &(r[n + n2]); - lo = *p; - ln = (lo + c1) & BN_MASK2; - *p = ln; - - /* The overflow will stop before we over write - * words we should not overwrite */ - if (ln < (BN_ULONG)c1) { - do { - p++; - lo = *p; - ln = (lo + 1) & BN_MASK2; - *p = ln; - } while (ln == 0); - } - } -} - -/* n+tn is the word length - * t needs to be n*4 is size, as does r */ -static void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, - int tna, int tnb, BN_ULONG *t) -{ - int i, j, n2 = n * 2; - int c1, c2, neg, zero; - BN_ULONG ln, lo, *p; - - if (n < 8) { - bn_mul_normal(r, a, n + tna, b, n + tnb); - return; - } - - /* r=(a[0]-a[1])*(b[1]-b[0]) */ - c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna); - c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n); - zero = neg = 0; - - switch (c1 * 3 + c2) { - case -4: - bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ - bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ - break; - - case -3: - zero = 1; - - /* break; */ - case -2: - bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ - bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */ - neg = 1; - break; - - case -1: - case 0: - case 1: - zero = 1; - - /* break; */ - case 2: - bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */ - bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ - neg = 1; - break; - - case 3: - zero = 1; - - /* break; */ - case 4: - bn_sub_part_words(t, a, &(a[n]), tna, n - tna); - bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); - break; - } - - if (n == 8) { - bn_mul_comba8(&(t[n2]), t, &(t[n])); - bn_mul_comba8(r, a, b); - bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb); - memset(&(r[n2 + tna + tnb]), 0, - sizeof(BN_ULONG) * (n2 - tna - tnb)); - } else { - p = &(t[n2 * 2]); - bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p); - bn_mul_recursive(r, a, b, n, 0, 0, p); - i = n / 2; - - /* If there is only a bottom half to the number, - * just do it */ - if (tna > tnb) - j = tna - i; - else - j = tnb - i; - - if (j == 0) { - bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), i, tna - i, - tnb - i, p); - memset(&(r[n2 + i * 2]), 0, - sizeof(BN_ULONG) * (n2 - i * 2)); - } else if (j > 0) { /* eg, n == 16, i == 8 and tn == 11 */ - bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]), i, - tna - i, tnb - i, p); - memset(&(r[n2 + tna + tnb]), 0, - sizeof(BN_ULONG) * (n2 - tna - tnb)); - } else { /* (j < 0) eg, n == 16, i == 8 and tn == 5 */ - memset(&(r[n2]), 0, sizeof(BN_ULONG) * n2); - - if (tna < BN_MUL_RECURSIVE_SIZE_NORMAL && - tnb < BN_MUL_RECURSIVE_SIZE_NORMAL) - bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), - tnb); - else { - for (;;) { - i /= 2; - - if (i < tna && i < tnb) { - bn_mul_part_recursive( - &(r[n2]), &(a[n]), - &(b[n]), i, tna - i, - tnb - i, p); - break; - } else if (i <= tna && i <= tnb) { - bn_mul_recursive(&(r[n2]), - &(a[n]), - &(b[n]), i, - tna - i, - tnb - i, p); - break; - } - } - } - } - } - - /* t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - */ - c1 = (int)(bn_add_words(t, r, &(r[n2]), n2)); - - if (neg) /* if t[32] is negative */ - c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2)); - else { - /* Might have a carry */ - c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2)); - } - - /* t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1]) - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - * c1 holds the carry bits - */ - c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2)); - - if (c1) { - p = &(r[n + n2]); - lo = *p; - ln = (lo + c1) & BN_MASK2; - *p = ln; - - /* The overflow will stop before we over write - * words we should not overwrite */ - if (ln < (BN_ULONG)c1) { - do { - p++; - lo = *p; - ln = (lo + 1) & BN_MASK2; - *p = ln; - } while (ln == 0); - } - } -} -#endif /* BN_RECURSION */ - -static int BN_mul(struct bignum_st *r, const struct bignum_st *a, - const struct bignum_st *b, struct bignum_pool *ctx) -{ - int release = 0; - int ret = 0; - int top, al, bl; - struct bignum_st *rr; -#if defined(BN_MUL_COMBA) || defined(BN_RECURSION) - int i; -#endif -#ifdef BN_RECURSION - struct bignum_st *t = NULL; - int j = 0, k; -#endif - al = a->top; - bl = b->top; - - if ((al == 0) || (bl == 0)) { - BN_zero(r); - return 1; - } - - top = al + bl; - - if ((r == a) || (r == b)) { - rr = BN_POOL_get(ctx); - - if (rr == NULL) - goto err; - - release++; - } else - rr = r; - -#if defined(BN_MUL_COMBA) || defined(BN_RECURSION) - i = al - bl; -#endif -#ifdef BN_MUL_COMBA - - if (i == 0) { - if (al == 8) { - if (bn_wexpand(rr, 16) == NULL) - goto err; - - rr->top = 16; - bn_mul_comba8(rr->d, a->d, b->d); - goto end; - } - } - -#endif /* BN_MUL_COMBA */ -#ifdef BN_RECURSION - - if ((al >= BN_MULL_SIZE_NORMAL) && (bl >= BN_MULL_SIZE_NORMAL)) { - if (i >= -1 && i <= 1) { - int sav_j = 0; - - /* Find out the power of two lower or equal - to the longest of the two numbers */ - if (i >= 0) - j = BN_num_bits_word((BN_ULONG)al); - - if (i == -1) - j = BN_num_bits_word((BN_ULONG)bl); - - sav_j = j; - j = 1 << (j - 1); - k = j + j; - t = BN_POOL_get(ctx); - release++; - - if (al > j || bl > j) { - bn_wexpand(t, k * 4); - bn_wexpand(rr, k * 4); - bn_mul_part_recursive(rr->d, a->d, b->d, j, - al - j, bl - j, t->d); - } else { /* al <= j || bl <= j */ - bn_wexpand(t, k * 2); - bn_wexpand(rr, k * 2); - bn_mul_recursive(rr->d, a->d, b->d, j, al - j, - bl - j, t->d); - } - - rr->top = top; - goto end; - } - } - -#endif /* BN_RECURSION */ - - if (bn_wexpand(rr, top) == NULL) - goto err; - - rr->top = top; - bn_mul_normal(rr->d, a->d, al, b->d, bl); -#if defined(BN_MUL_COMBA) || defined(BN_RECURSION) -end: -#endif - bn_correct_top(rr); - - if (r != rr) - BN_copy(r, rr); - - ret = 1; -err: - BN_POOL_release(ctx, release); - return ret; -} - -static void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb) -{ - BN_ULONG *rr; - - if (na < nb) { - int itmp; - BN_ULONG *ltmp; - - itmp = na; - na = nb; - nb = itmp; - ltmp = a; - a = b; - b = ltmp; - } - - rr = &(r[na]); - - if (nb <= 0) { - (void)bn_mul_words(r, a, na, 0); - return; - } else - rr[0] = bn_mul_words(r, a, na, b[0]); - - for (;;) { - if (--nb <= 0) - return; - - rr[1] = bn_mul_add_words(&(r[1]), a, na, b[1]); - - if (--nb <= 0) - return; - - rr[2] = bn_mul_add_words(&(r[2]), a, na, b[2]); - - if (--nb <= 0) - return; - - rr[3] = bn_mul_add_words(&(r[3]), a, na, b[3]); - - if (--nb <= 0) - return; - - rr[4] = bn_mul_add_words(&(r[4]), a, na, b[4]); - rr += 4; - r += 4; - b += 4; - } -} -/*bn_mul END*/ - -/* tmp must have 2*n words */ -static void bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, int n, BN_ULONG *tmp) -{ - int i, j, max; - const BN_ULONG *ap; - BN_ULONG *rp; - - max = n * 2; - ap = a; - rp = r; - rp[0] = rp[max - 1] = 0; - rp++; - j = n; - - if (--j > 0) { - ap++; - rp[j] = bn_mul_words(rp, ap, j, ap[-1]); - rp += 2; - } - - for (i = n - 2; i > 0; i--) { - j--; - ap++; - rp[j] = bn_mul_add_words(rp, ap, j, ap[-1]); - rp += 2; - } - - bn_add_words(r, r, r, max); - /* There will not be a carry */ - bn_sqr_words(tmp, a, n); - bn_add_words(r, r, tmp, max); -} - -#ifdef BN_RECURSION -/* r is 2*n words in size, - * a and b are both n words in size. (There's not actually a 'b' here ...) - * n must be a power of 2. - * We multiply and return the result. - * t must be 2*n words in size - * We calculate - * a[0]*b[0] - * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0]) - * a[1]*b[1] - */ -static void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, int n2, - BN_ULONG *t) -{ - int n = n2 / 2; - int zero, c1; - BN_ULONG ln, lo, *p; - - if (n2 == 4) { -#ifndef BN_SQR_COMBA - bn_sqr_normal(r, a, 4, t); -#else - bn_sqr_comba4(r, a); -#endif - return; - } else if (n2 == 8) { -#ifndef BN_SQR_COMBA - bn_sqr_normal(r, a, 8, t); -#else - bn_sqr_comba8(r, a); -#endif - return; - } - - if (n2 < BN_SQR_RECURSIVE_SIZE_NORMAL) { - bn_sqr_normal(r, a, n2, t); - return; - } - - /* r=(a[0]-a[1])*(a[1]-a[0]) */ - c1 = bn_cmp_words(a, &(a[n]), n); - zero = 0; - - if (c1 > 0) - bn_sub_words(t, a, &(a[n]), n); - else if (c1 < 0) - bn_sub_words(t, &(a[n]), a, n); - else - zero = 1; - - /* The result will always be negative unless it is zero */ - p = &(t[n2 * 2]); - - if (!zero) - bn_sqr_recursive(&(t[n2]), t, n, p); - else - memset(&(t[n2]), 0, n2 * sizeof(BN_ULONG)); - - bn_sqr_recursive(r, a, n, p); - bn_sqr_recursive(&(r[n2]), &(a[n]), n, p); - /* t[32] holds (a[0]-a[1])*(a[1]-a[0]), it is negative or zero - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - */ - c1 = (int)(bn_add_words(t, r, &(r[n2]), n2)); - /* t[32] is negative */ - c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2)); - /* t[32] holds (a[0]-a[1])*(a[1]-a[0])+(a[0]*a[0])+(a[1]*a[1]) - * r[10] holds (a[0]*a[0]) - * r[32] holds (a[1]*a[1]) - * c1 holds the carry bits - */ - c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2)); - - if (c1) { - p = &(r[n + n2]); - lo = *p; - ln = (lo + c1) & BN_MASK2; - *p = ln; - - /* The overflow will stop before we over write - * words we should not overwrite */ - if (ln < (BN_ULONG)c1) { - do { - p++; - lo = *p; - ln = (lo + 1) & BN_MASK2; - *p = ln; - } while (ln == 0); - } - } -} -#endif /*BN_RECURSION */ - -/* unsigned subtraction of b from a, a must be larger than b. */ -static int BN_usub(struct bignum_st *r, const struct bignum_st *a, - const struct bignum_st *b) -{ - int max, min, dif; - register BN_ULONG t1, t2, *ap, *bp, *rp; - int i, carry; - - max = a->top; - min = b->top; - dif = max - min; - - if (dif < 0) /* hmm... should not be happening */ - return 0; - - if (bn_wexpand(r, max) == NULL) - return 0; - - ap = a->d; - bp = b->d; - rp = r->d; - carry = 0; - - for (i = min; i != 0; i--) { - t1 = *(ap++); - t2 = *(bp++); - - if (carry) { - carry = (t1 <= t2); - t1 = (t1 - t2 - 1) & BN_MASK2; - } else { - carry = (t1 < t2); - t1 = (t1 - t2) & BN_MASK2; - } - - *(rp++) = t1 & BN_MASK2; - } - - if (carry) { /* subtracted */ - if (!dif) - /* error: a < b */ - return 0; - - while (dif) { - dif--; - t1 = *(ap++); - t2 = (t1 - 1) & BN_MASK2; - *(rp++) = t2; - - if (t1) - break; - } - } - - if (rp != ap) { - for (;;) { - if (!dif--) - break; - - rp[0] = ap[0]; - - if (!dif--) - break; - - rp[1] = ap[1]; - - if (!dif--) - break; - - rp[2] = ap[2]; - - if (!dif--) - break; - - rp[3] = ap[3]; - rp += 4; - ap += 4; - } - } - - r->top = max; - bn_correct_top(r); - return 1; -} - -static int BN_from_montgomery(struct bignum_st *ret, const struct bignum_st *a, - struct bn_mont_ctx_st *mont, - struct bignum_pool *ctx) -{ - int retn = 0; - struct bignum_st *n, *r; - BN_ULONG *ap, *np, *rp, n0, v, *nrp; - int al, nl, max, i, x, ri; - - r = BN_POOL_get(ctx); - - if (r == NULL) - goto err; - - if (!BN_copy(r, a)) - goto err; - - n = &(mont->N); - ap = a->d; - /* mont->ri is the size of mont->N in bits (rounded up - to the word size) */ - al = ri = mont->ri / BN_BITS2; - nl = n->top; - - if ((al == 0) || (nl == 0)) { - r->top = 0; - return 1; - } - - max = (nl + al + 1); /* allow for overflow (no?) XXX */ - - if (bn_wexpand(r, max) == NULL) - goto err; - - if (bn_wexpand(ret, max) == NULL) - goto err; - - np = n->d; - rp = r->d; - nrp = &(r->d[nl]); - - /* clear the top words of T */ - for (i = r->top; i < max; i++) /* memset? XXX */ - r->d[i] = 0; - - r->top = max; - n0 = mont->n0; - - for (i = 0; i < nl; i++) { - v = bn_mul_add_words(rp, np, nl, (rp[0] * n0) & BN_MASK2); - nrp++; - rp++; - nrp[-1] += v; - - if (((nrp[-1]) & BN_MASK2) >= v) - continue; - else { - if (((++nrp[0]) & BN_MASK2) != 0) - continue; - - if (((++nrp[1]) & BN_MASK2) != 0) - continue; - - for (x = 2; (((++nrp[x]) & BN_MASK2) == 0); x++) - ; - } - } - - bn_correct_top(r); - /* mont->ri will be a multiple of the word size */ - x = ri; - rp = ret->d; - ap = &(r->d[x]); - - if (r->top < x) - al = 0; - else - al = r->top - x; - - ret->top = al; - al -= 4; - - for (i = 0; i < al; i += 4) { - BN_ULONG t1, t2, t3, t4; - - t1 = ap[i + 0]; - t2 = ap[i + 1]; - t3 = ap[i + 2]; - t4 = ap[i + 3]; - rp[i + 0] = t1; - rp[i + 1] = t2; - rp[i + 2] = t3; - rp[i + 3] = t4; - } - - al += 4; - - for (; i < al; i++) - rp[i] = ap[i]; - - if (BN_ucmp(ret, &(mont->N)) >= 0) { - if (!BN_usub(ret, ret, &(mont->N))) - goto err; - } - - retn = 1; -err: - BN_POOL_release(ctx, 1); - return retn; -} - -/*SQR*/ -/* r must not be a */ -/* I've just gone over this and it is now %20 faster on x86 - eay - 27 Jun 96 */ -static int BN_sqr(struct bignum_st *r, const struct bignum_st *a, - struct bignum_pool *ctx) -{ - int release = 0; - int max, al; - int ret = 0; - struct bignum_st *tmp, *rr; - - al = a->top; - - if (al <= 0) { - r->top = 0; - return 1; - } - - if (a != r) - rr = r; - else { - rr = BN_POOL_get(ctx); - release++; - } - - tmp = BN_POOL_get(ctx); - release++; - - if (!rr || !tmp) - goto err; - - max = 2 * al; /* Non-zero (from above) */ - - if (bn_wexpand(rr, max) == NULL) - goto err; - - if (al == 4) { -#ifndef BN_SQR_COMBA - BN_ULONG t[8]; - - bn_sqr_normal(rr->d, a->d, 4, t); -#else - bn_sqr_comba4(rr->d, a->d); -#endif - } else if (al == 8) { -#ifndef BN_SQR_COMBA - BN_ULONG t[16]; - - bn_sqr_normal(rr->d, a->d, 8, t); -#else - bn_sqr_comba8(rr->d, a->d); -#endif - } else { -#if defined(BN_RECURSION) - - if (al < BN_SQR_RECURSIVE_SIZE_NORMAL) { - BN_ULONG t[BN_SQR_RECURSIVE_SIZE_NORMAL * 2]; - - bn_sqr_normal(rr->d, a->d, al, t); - } else { - int j, k; - - j = BN_num_bits_word((BN_ULONG)al); - j = 1 << (j - 1); - k = j + j; - - if (al == j) { - if (bn_wexpand(tmp, k * 2) == NULL) - goto err; - - bn_sqr_recursive(rr->d, a->d, al, tmp->d); - } else { - if (bn_wexpand(tmp, max) == NULL) - goto err; - - bn_sqr_normal(rr->d, a->d, al, tmp->d); - } - } - -#else - - if (bn_wexpand(tmp, max) == NULL) - goto err; - - bn_sqr_normal(rr->d, a->d, al, tmp->d); -#endif - } - - /* If the most-significant half of the top word of 'a' is zero, then - * the square of 'a' will max-1 words. */ - if (a->d[al - 1] == (a->d[al - 1] & BN_MASK2l)) - rr->top = max - 1; - else - rr->top = max; - - if (rr != r) - BN_copy(r, rr); - - ret = 1; -err: - BN_POOL_release(ctx, release); - return ret; -} - -static int BN_mod_mul_montgomery(struct bignum_st *r, const struct bignum_st *a, - const struct bignum_st *b, - struct bn_mont_ctx_st *mont, - struct bignum_pool *ctx) -{ - struct bignum_st *tmp; - int ret = 0; - - tmp = BN_POOL_get(ctx); - - if (tmp == NULL) - goto err; - - if (BN_ucmp(a, b) == 0) { - if (!BN_sqr(tmp, a, ctx)) - goto err; - } else { - if (!BN_mul(tmp, a, b, ctx)) - goto err; - } - - /* reduce from aRR to aR */ - if (!BN_from_montgomery(r, tmp, mont, ctx)) - goto err; - - ret = 1; -err: - BN_POOL_release(ctx, 1); - return ret; -} - -/* unsigned add of b to a */ -static int BN_uadd(struct bignum_st *r, const struct bignum_st *a, - const struct bignum_st *b) -{ - int max, min, dif; - BN_ULONG *ap, *bp, *rp, carry, t1, t2; - const struct bignum_st *tmp; - - if (a->top < b->top) { - tmp = a; - a = b; - b = tmp; - } - - max = a->top; - min = b->top; - dif = max - min; - - if (bn_wexpand(r, max + 1) == NULL) - return 0; - - r->top = max; - ap = a->d; - bp = b->d; - rp = r->d; - carry = bn_add_words(rp, ap, bp, min); - rp += min; - ap += min; - bp += min; - - if (carry) { - while (dif) { - dif--; - t1 = *(ap++); - t2 = (t1 + 1) & BN_MASK2; - *(rp++) = t2; - - if (t2) { - carry = 0; - break; - } - } - - if (carry) { - /* carry != 0 => dif == 0 */ - *rp = 1; - r->top++; - } - } - - if (dif && rp != ap) - while (dif--) - /* copy remaining words if ap != rp */ - *(rp++) = *(ap++); - - return 1; -} - -static int BN_sub(struct bignum_st *r, const struct bignum_st *a, - const struct bignum_st *b) -{ - int max; - /* We are actually doing a - b :-) */ - max = (a->top > b->top) ? a->top : b->top; - - if (bn_wexpand(r, max) == NULL) - return 0; - - if (BN_ucmp(a, b) < 0) { - if (!BN_usub(r, b, a)) - return 0; - - DHPRINT("----\n"); - } else { - if (!BN_usub(r, a, b)) - return 0; - } - - return 1; -} - -static int BN_mul_word(struct bignum_st *a, BN_ULONG w) -{ - BN_ULONG ll; - - w &= BN_MASK2; - - if (a->top) { - if (w == 0) - BN_zero(a); - else { - ll = bn_mul_words(a->d, a->d, a->top, w); - - if (ll) { - if (bn_wexpand(a, a->top + 1) == NULL) - return 0; - - a->d[a->top++] = ll; - } - } - } - - return 1; -} - -/* solves ax == 1 (mod n) */ -static struct bignum_st *BN_mod_inverse(struct bignum_st *in, - const struct bignum_st *a, - const struct bignum_st *n, - struct bignum_pool *ctx) -{ - struct bignum_st *A, *B, *X, *Y, *M, *D, *T, *R = NULL; - struct bignum_st *ret = NULL; - int sign; - - A = BN_POOL_get(ctx); - B = BN_POOL_get(ctx); - X = BN_POOL_get(ctx); - D = BN_POOL_get(ctx); - M = BN_POOL_get(ctx); - Y = BN_POOL_get(ctx); - T = BN_POOL_get(ctx); - - if (T == NULL) - goto err; - - if (in == NULL) - R = BN_new(); - else - R = in; - - if (R == NULL) - goto err; - - BN_one(X); - BN_zero(Y); - - if (BN_copy(B, a) == NULL) - goto err; - - if (BN_copy(A, n) == NULL) - goto err; - - if (BN_ucmp(B, A) >= 0) { - if (!(BN_mod(B, B, A, ctx))) - goto err; - } - - sign = -1; - /* From B = a mod |n|, A = |n| it follows that - * - * 0 <= B < A, - * -sign*X*a == B (mod |n|), - * sign*Y*a == A (mod |n|). - */ - - if (BN_is_odd(n) && (BN_num_bits(n) <= (BN_BITS <= 32 ? 450 : 2048))) { - /* Binary inversion algorithm; requires odd modulus. - * This is faster than the general algorithm if the modulus - * is sufficiently small (about 400 .. 500 bits on 32-bit - * sytems, but much more on 64-bit systems) */ - int shift; - - while (!BN_is_zero(B)) { - /* - * 0 < B < |n|, - * 0 < A <= |n|, - * (1) -sign*X*a == B (mod |n|), - * (2) sign*Y*a == A (mod |n|) - */ - /* Now divide B by the maximum possible power of two in the integers, - * and divide X by the same value mod |n|. - * When we're done, (1) still holds. */ - shift = 0; - - while (!BN_is_bit_set(B, shift)) { /* note that 0 < B */ - shift++; - - if (BN_is_odd(X)) { - if (!BN_uadd(X, X, n)) - goto err; - } - - /* now X is even, so we can easily divide it by two */ - if (!BN_rshift1(X, X)) - goto err; - } - - if (shift > 0) { - if (!BN_rshift(B, B, shift)) - goto err; - } - - /* Same for A and Y. Afterwards, (2) still holds. */ - shift = 0; - - while (!BN_is_bit_set(A, shift)) { /* note that 0 < A */ - shift++; - - if (BN_is_odd(Y)) { - if (!BN_uadd(Y, Y, n)) - goto err; - } - - /* now Y is even */ - if (!BN_rshift1(Y, Y)) - goto err; - } - - if (shift > 0) { - if (!BN_rshift(A, A, shift)) - goto err; - } - - /* We still have (1) and (2). - * Both A and B are odd. - * The following computations ensure that - * - * 0 <= B < |n|, - * 0 < A < |n|, - * (1) -sign*X*a == B (mod |n|), - * (2) sign*Y*a == A (mod |n|), - * - * and that either A or B is even in the next iteration. - */ - if (BN_ucmp(B, A) >= 0) { - /* -sign*(X + Y)*a == B - A (mod |n|) */ - if (!BN_uadd(X, X, Y)) - goto err; - - /* NB: we could use BN_mod_add_quick(X, X, Y, n), but that - * actually makes the algorithm slower */ - if (!BN_usub(B, B, A)) - goto err; - } else { - /* sign*(X + Y)*a == A - B (mod |n|) */ - if (!BN_uadd(Y, Y, X)) - goto err; - - /* as above, BN_mod_add_quick(Y, Y, X, n) would slow things down */ - if (!BN_usub(A, A, B)) - goto err; - } - } - } else - goto err; - - /* - * The while loop (Euclid's algorithm) ends when - * A == gcd(a,n); - * we have - * sign*Y*a == A (mod |n|), - * where Y is non-negative. - */ - - if (sign < 0) { - if (!BN_sub(Y, n, Y)) - goto err; - } - - /* Now Y*a == A (mod |n|). */ - - if (BN_is_one(A)) { - /* Y*a == 1 (mod |n|) */ - if (BN_ucmp(Y, n) < 0) { - if (!BN_copy(R, Y)) - goto err; - } else { - if (!(BN_mod(R, Y, n, ctx))) - goto err; - } - } else - goto err; - - ret = R; -err: - - if ((ret == NULL) && (in == NULL)) - BN_free(R); - - BN_POOL_release(ctx, 7); - return ret; -} - -static int BN_sub_word(struct bignum_st *a, BN_ULONG w) -{ - int i; - - w &= BN_MASK2; - - /* degenerate case: w is zero */ - if (!w) - return 1; - - /* degenerate case: a is zero */ - if (BN_is_zero(a)) { - i = BN_set_word(a, w); - - if (i != 0) { - DHPRINT("BN_set_negative\n"); - /*BN_set_negative(a, 1); */ - } - - return i; - } - - if ((a->top == 1) && (a->d[0] < w)) { - a->d[0] = w - a->d[0]; - DHPRINT("--------\n"); - return 1; - } - - i = 0; - - for (;;) { - if (a->d[i] >= w) { - a->d[i] -= w; - break; - } else { - a->d[i] = (a->d[i] - w) & BN_MASK2; - i++; - w = 1; - } - } - - if ((a->d[i] == 0) && (i == (a->top - 1))) - a->top--; - - return 1; -} - -static int BN_MONT_CTX_set(struct bn_mont_ctx_st *mont, - const struct bignum_st *mod, struct bignum_pool *ctx) -{ - int ret = 0; - struct bignum_st *Ri, *R; - struct bignum_st tmod; - BN_ULONG buf[2]; - - Ri = BN_POOL_get(ctx); - - if (Ri == NULL) - goto err; - - R = &(mont->RR); /* grab RR as a temp */ - - if (!BN_copy(&(mont->N), mod)) - goto err; /* Set N */ - - /*start*/ - mont->ri = (BN_num_bits(mod) + (BN_BITS2 - 1)) / BN_BITS2 * BN_BITS2; - BN_zero(R); - - if (!(BN_set_bit(R, BN_BITS2))) - goto err; /* R */ - - buf[0] = mod->d[0]; /* tmod = N mod word size */ - buf[1] = 0; - tmod.d = buf; - tmod.top = buf[0] != 0 ? 1 : 0; - tmod.dmax = 2; - - /* Ri = R^-1 mod N*/ - if ((BN_mod_inverse(Ri, R, &tmod, ctx)) == NULL) - goto err; - - if (!BN_lshift(Ri, Ri, BN_BITS2)) - goto err; /* R*Ri */ - - if (!BN_is_zero(Ri)) { - if (!BN_sub_word(Ri, 1)) - goto err; - } else { /* if N mod word size == 1 */ - if (!BN_set_word(Ri, BN_MASK2)) - goto err; /* Ri-- (mod word size) */ - } - - if (!BN_div(Ri, NULL, Ri, &tmod, ctx)) - goto err; - - /* Ni = (R*Ri-1)/N, - * keep only least significant word: */ - mont->n0 = (Ri->top > 0) ? Ri->d[0] : 0; - /*end*/ - /* setup RR for conversions */ - BN_zero(&(mont->RR)); - - if (!BN_set_bit(&(mont->RR), mont->ri * 2)) - goto err; - - if (!BN_mod(&(mont->RR), &(mont->RR), &(mont->N), ctx)) - goto err; - - ret = 1; -err: - return ret; -} - -static const struct env_md_st sha1_md = { - NID_sha1, - SHA_DIGEST_LENGTH, - 0, - RAND_init, - RAND_update, - RAND_final, - sizeof(struct env_md_st *) + sizeof(struct SHAstate_st), -}; - -/* This call frees resources associated with the context */ -static int EVP_MD_CTX_cleanup(struct env_md_ctx_st *ctx) -{ - /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final, - * because sometimes only copies of the context are ever finalised. - */ - if (ctx->digest && ctx->digest->ctx_size && ctx->md_data) - os_free_mem(ctx->md_data); - - memset(ctx, '\0', sizeof(*ctx)); - return 1; -} - -/* The caller can assume that this removes any secret data from the context */ -static int EVP_DigestFinal_ex(struct env_md_ctx_st *ctx, unsigned char *md, - unsigned int *size) -{ - int ret; - - ret = ctx->digest->final(ctx, md); - - if (size != NULL) - *size = ctx->digest->md_size; - - memset(ctx->md_data, 0, ctx->digest->ctx_size); - return ret; -} - -static void EVP_MD_CTX_init(struct env_md_ctx_st *ctx) -{ - memset(ctx, '\0', sizeof(*ctx)); -} - -static int EVP_DigestInit_ex(struct env_md_ctx_st *ctx, - const struct env_md_st *type) -{ - if (ctx->digest != type) { - if (ctx->digest && ctx->digest->ctx_size) - os_free_mem(ctx->md_data); - - ctx->digest = type; - - if (type->ctx_size) - os_alloc_mem(NULL, (UCHAR **)&(ctx->md_data), - type->ctx_size); - } - - return ctx->digest->init(ctx); -} - -static int EVP_DigestUpdate(struct env_md_ctx_st *ctx, const void *data, - size_t count) -{ - return ctx->digest->update(ctx, data, count); -} - -static void ssleay_rand_add(const void *buf, int num, long add) -{ - int i, j, k, st_idx; - long md_c[2]; - unsigned char local_md[SHA_DIGEST_LENGTH]; - struct env_md_ctx_st m; - /* - * (Based on the rand(3) manpage) - * - * The input is chopped up into units of 20 bytes (or less for - * the last block). Each of these blocks is run through the hash - * function as follows: The data passed to the hash function - * is the current 'md', the same number of bytes from the 'state' - * (the location determined by in incremented looping index) as - * the current 'block', the new key data 'block', and 'count' - * (which is incremented after each use). - * The result of this is kept in 'md' and also xored into the - * 'state' at the same locations that were used as input into the - * hash function. - */ - st_idx = g_state_index; - /* use our own copies of the counters so that even - * if a concurrent thread seeds with exactly the - * same data and uses the same subarray there's _some_ - * difference */ - md_c[0] = g_md_count[0]; - md_c[1] = g_md_count[1]; - memcpy(local_md, g_md, sizeof(g_md)); - /* g_state_index <= g_state_num <= STATE_SIZE */ - g_state_index += num; - - if (g_state_index >= STATE_SIZE) { - g_state_index %= STATE_SIZE; - g_state_num = STATE_SIZE; - } else if (g_state_num < STATE_SIZE) { - if (g_state_index > g_state_num) - g_state_num = g_state_index; - } - - /* g_state_index <= g_state_num <= STATE_SIZE */ - /* g_state[st_idx], ..., g_state[(st_idx + num - 1) % STATE_SIZE] - * are what we will use now, but other threads may use them - * as well */ - g_md_count[1] += - (num / SHA_DIGEST_LENGTH) + (num % SHA_DIGEST_LENGTH > 0); - EVP_MD_CTX_init(&m); - - for (i = 0; i < num; i += SHA_DIGEST_LENGTH) { - j = (num - i); - j = (j > SHA_DIGEST_LENGTH) ? SHA_DIGEST_LENGTH : j; - EVP_DigestInit_ex(&m, &sha1_md); - EVP_DigestUpdate(&m, local_md, SHA_DIGEST_LENGTH); - k = (st_idx + j) - STATE_SIZE; - - if (k > 0) { - EVP_DigestUpdate(&m, &(g_state[st_idx]), j - k); - EVP_DigestUpdate(&m, &(g_state[0]), k); - } else - EVP_DigestUpdate(&m, &(g_state[st_idx]), j); - - EVP_DigestUpdate(&m, buf, j); - EVP_DigestUpdate(&m, (unsigned char *)&(md_c[0]), sizeof(md_c)); - EVP_DigestFinal_ex(&m, local_md, NULL); - md_c[1]++; - buf = (const char *)buf + j; - - for (k = 0; k < j; k++) { - /* Parallel threads may interfere with this, - * but always each byte of the new state is - * the XOR of some previous value of its - * and local_md (itermediate values may be lost). - * Alway using locking could hurt performance more - * than necessary given that conflicts occur only - * when the total seeding is longer than the random - * state. */ - g_state[st_idx++] ^= local_md[k]; - - if (st_idx >= STATE_SIZE) - st_idx = 0; - } - } - - EVP_MD_CTX_cleanup(&m); - - /* Don't just copy back local_md into md -- this could mean that - * other thread's seeding remains without effect (except for - * the incremented counter). By XORing it we keep at least as - * much entropy as fits into md. */ - for (k = 0; k < (int)sizeof(g_md); k++) - g_md[k] ^= local_md[k]; - - if (g_entropy < ENTROPY_NEEDED) /* stop counting when we have enough */ - g_entropy += add; -} - -static int ssleay_rand_bytes(unsigned char *buf, int num) -{ - static volatile int stirred_pool; - int i, j, k, st_num, st_idx; - int num_ceil; - int ok; - long md_c[2]; - unsigned char local_md[SHA_DIGEST_LENGTH]; - struct env_md_ctx_st m; -#ifndef GETPID_IS_MEANINGLESS - pid_t curr_pid = getpid(); -#endif - int do_stir_pool = 0; - - if (num <= 0) - return 1; - - EVP_MD_CTX_init(&m); - /* round upwards to multiple of SHA_DIGEST_LENGTH/2 */ - num_ceil = (1 + (num - 1) / (SHA_DIGEST_LENGTH / 2)) * - (SHA_DIGEST_LENGTH / 2); - - /* - * (Based on the rand(3) manpage:) - * - * For each group of 10 bytes (or less), we do the following: - * - * Input into the hash function the local 'md' (which is RAND_initialized from - * the global 'md' before any bytes are generated), the bytes that are to - * be overwritten by the random bytes, and bytes from the 'state' - * (incrementing looping index). From this digest output (which is kept - * in 'md'), the top (up to) 10 bytes are returned to the caller and the - * bottom 10 bytes are xored into the 'state'. - * - * Finally, after we have finished 'num' random bytes for the - * caller, 'count' (which is incremented) and the local and global 'md' - * are fed into the hash function and the results are kept in the - * global 'md'. - */ - - if (!RAND_initialized) { - RAND_poll(); - RAND_initialized = 1; - } - - if (!stirred_pool) - do_stir_pool = 1; - - ok = (g_entropy >= ENTROPY_NEEDED); - - if (!ok) { - /* If the PRNG state is not yet unpredictable, then seeing - * the PRNG output may help attackers to determine the new - * state; thus we have to decrease the entropy estimate. - * Once we've had enough initial seeding we don't bother to - * adjust the entropy count, though, because we're not ambitious - * to provide *information-theoretic* randomness. - * - * NOTE: This approach fails if the program forks before - * we have enough entropy. Entropy should be collected - * in a separate input pool and be transferred to the - * output pool only when the entropy limit has been reached. - */ - g_entropy -= num; - - if (g_entropy < 0) - g_entropy = 0; - } - - if (do_stir_pool) { - /* In the output function only half of 'md' remains secret, - * so we better make sure that the required entropy gets - * 'evenly distributed' through 'state', our randomness pool. - * The input function (ssleay_rand_add) chains all of 'md', - * which makes it more suitable for this purpose. - */ - int n = STATE_SIZE; /* so that the complete pool gets accessed */ - - while (n > 0) { - /* Note that the seed does not matter, it's just that - * ssleay_rand_add expects to have something to hash. */ - /* at least SHA_DIGEST_LENGTH "...................." */ - ssleay_rand_add("....................", - SHA_DIGEST_LENGTH, 0); - n -= SHA_DIGEST_LENGTH; - } - - if (ok) - stirred_pool = 1; - } - - st_idx = g_state_index; - st_num = g_state_num; - md_c[0] = g_md_count[0]; - md_c[1] = g_md_count[1]; - memcpy(local_md, g_md, sizeof(g_md)); - g_state_index += num_ceil; - - if (g_state_index > g_state_num) - g_state_index %= g_state_num; - - /* g_state[st_idx], ..., g_state[(st_idx + num_ceil - 1) % st_num] - * are now ours (but other threads may use them too) */ - g_md_count[0] += 1; - - while (num > 0) { - /* num_ceil -= SHA_DIGEST_LENGTH/2 */ - j = (num >= SHA_DIGEST_LENGTH / 2) ? SHA_DIGEST_LENGTH / 2 : - num; - num -= j; - EVP_DigestInit_ex(&m, &sha1_md); -#ifndef GETPID_IS_MEANINGLESS - - if (curr_pid) { /* just in the first iteration to save time */ - EVP_DigestUpdate(&m, (unsigned char *)&curr_pid, - sizeof(curr_pid)); - curr_pid = 0; - } - -#endif - EVP_DigestUpdate(&m, local_md, SHA_DIGEST_LENGTH); - EVP_DigestUpdate(&m, (unsigned char *)&(md_c[0]), sizeof(md_c)); -#ifndef PURIFY - EVP_DigestUpdate(&m, buf, j); /* purify complains */ -#endif - k = (st_idx + SHA_DIGEST_LENGTH / 2) - st_num; - - if (k > 0) { - EVP_DigestUpdate(&m, &(g_state[st_idx]), - SHA_DIGEST_LENGTH / 2 - k); - EVP_DigestUpdate(&m, &(g_state[0]), k); - } else - EVP_DigestUpdate(&m, &(g_state[st_idx]), - SHA_DIGEST_LENGTH / 2); - - EVP_DigestFinal_ex(&m, local_md, NULL); - - for (i = 0; i < SHA_DIGEST_LENGTH / 2; i++) { - g_state[st_idx++] ^= - local_md[i]; /* may compete with other threads */ - - if (st_idx >= st_num) - st_idx = 0; - - if (i < j) - *(buf++) = local_md[i + SHA_DIGEST_LENGTH / 2]; - } - } - - EVP_DigestInit_ex(&m, &sha1_md); - EVP_DigestUpdate(&m, (unsigned char *)&(md_c[0]), sizeof(md_c)); - EVP_DigestUpdate(&m, local_md, SHA_DIGEST_LENGTH); - EVP_DigestUpdate(&m, g_md, SHA_DIGEST_LENGTH); - EVP_DigestFinal_ex(&m, g_md, NULL); - EVP_MD_CTX_cleanup(&m); - - if (ok) - return 1; - else - return 0; -} - -static int RAND_poll(void) -{ - unsigned long l = 100; - unsigned char tmpbuf[ENTROPY_NEEDED]; - int n = 0; - - n = ENTROPY_NEEDED; - - if (n > 0) - ssleay_rand_add(tmpbuf, sizeof(tmpbuf), (long)n); - - /* put in some default random data, we need more than just this */ - l = 100; /*curr_pid; */ - ssleay_rand_add(&l, sizeof(l), 0); - l = 200; /*getuid(); */ - ssleay_rand_add(&l, sizeof(l), 0); -#ifdef USERSPACE - l = time(NULL); -#else - NdisGetSystemUpTime(&l); -#endif /*USERSPACE */ - ssleay_rand_add(&l, sizeof(l), 0); - return 0; -} - -static int bnrand(int pseudorand, struct bignum_st *rnd, int bits, int top, - int bottom) -{ - unsigned char *buf = NULL; - int ret = 0, bit, bytes, mask; - time_t tim; - - if (bits == 0) { - BN_zero(rnd); - return 1; - } - - bytes = (bits + 7) / 8; - bit = (bits - 1) % 8; - mask = 0xff << (bit + 1); - os_alloc_mem(NULL, (UCHAR **)&buf, bytes); - - if (buf == NULL) - goto err; - - /* make a random number and set the top and bottom bits */ -#ifdef USERSPACE - time(&tim); -#else - NdisGetSystemUpTime((ULONG *)(&tim)); -#endif /*USERSPACE */ - ssleay_rand_add(&tim, sizeof(tim), 0); - - if (pseudorand) { - if (ssleay_rand_bytes(buf, bytes) == -1) - goto err; - } else { - if (ssleay_rand_bytes(buf, bytes) <= 0) - goto err; - } - - if (pseudorand == 2) { - /* generate patterns that are more likely to trigger BN - library bugs */ - int i; - unsigned char c; - - for (i = 0; i < bytes; i++) { - ssleay_rand_bytes(&c, 1); - - if (c >= 128 && i > 0) - buf[i] = buf[i - 1]; - else if (c < 42) - buf[i] = 0; - else if (c < 84) - buf[i] = 255; - } - } - - if (top != -1) { - if (top) { - if (bit == 0) { - buf[0] = 1; - buf[1] |= 0x80; - } else - buf[0] |= (3 << (bit - 1)); - } else - buf[0] |= (1 << bit); - } - - buf[0] &= ~mask; - - if (bottom) /* set bottom bit if requested */ - buf[bytes - 1] |= 1; - - if (!BN_bin2bn(buf, bytes, rnd)) - goto err; - - ret = 1; -err: - - if (buf != NULL) - os_free_mem(buf); - - return ret; -} - -static struct bn_mont_ctx_st *BN_MONT_CTX_new(void) -{ - struct bn_mont_ctx_st *ret; - - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(struct bn_mont_ctx_st)); - - if (ret == NULL) - return NULL; - - ret->ri = 0; - BN_init(&(ret->RR)); - BN_init(&(ret->N)); - ret->flags = BN_FLG_MALLOCED; - return ret; -} - -static void BN_CTX_free(struct bignum_pool *ctx) -{ - if (ctx == NULL) - return; - - BN_POOL_finish(ctx); - os_free_mem(ctx); -} - -static void BN_MONT_CTX_free(struct bn_mont_ctx_st *mont) -{ - if (mont == NULL) - return; - - BN_free(&(mont->RR)); - BN_free(&(mont->N)); - - if (mont->flags & BN_FLG_MALLOCED) - os_free_mem(mont); -} - -#define BN_MOD_MUL_WORD(r, w, m) \ - (BN_mul_word(r, (w)) && \ - ((BN_mod(t, r, m, ctx) && (swap_tmp = r, r = t, t = swap_tmp, 1)))) -static int BN_mod_exp_mont_word(struct bignum_st *rr, BN_ULONG a, - const struct bignum_st *p, - const struct bignum_st *m, - struct bignum_pool *ctx, - struct bn_mont_ctx_st *in_mont) -{ - struct bn_mont_ctx_st *mont = NULL; - int b, bits, ret = 0; - int r_is_one; - BN_ULONG w, next_w; - struct bignum_st *d, *r, *t; - struct bignum_st *swap_tmp; - - if (BN_get_flags(p, BN_FLG_EXP_CONSTTIME) != 0) { - /* BN_FLG_EXP_CONSTTIME only supported by BN_mod_exp_mont() */ - return -1; - } - - if (!BN_is_odd(m)) - return 0; - - if (m->top == 1) - a %= m->d[0]; /* make sure that 'a' is reduced */ - - bits = BN_num_bits(p); - - if (bits == 0) { - ret = BN_one(rr); - return ret; - } - - if (a == 0) { - BN_zero(rr); - ret = 1; - return ret; - } - - d = BN_POOL_get(ctx); - r = BN_POOL_get(ctx); - t = BN_POOL_get(ctx); - - if (d == NULL || r == NULL || t == NULL) - goto err; - - if (in_mont != NULL) - mont = in_mont; - else { - mont = BN_MONT_CTX_new(); - - if (mont == NULL) - goto err; - - if (!BN_MONT_CTX_set(mont, m, ctx)) - goto err; - } - - r_is_one = 1; /* except for Montgomery factor */ - /* bits-1 >= 0 */ - /* The result is accumulated in the product r*w. */ - w = a; /* bit 'bits-1' of 'p' is always set */ - - for (b = bits - 2; b >= 0; b--) { - /* First, square r*w. */ - next_w = w * w; - - if ((next_w / w) != w) { /* overflow */ - if (r_is_one) { - if (!(BN_set_word(r, (w)) && - BN_mod_mul_montgomery((r), (r), - &((mont)->RR), - (mont), (ctx)))) - goto err; - - r_is_one = 0; - } else { - if (!BN_MOD_MUL_WORD(r, w, m)) - goto err; - } - - next_w = 1; - } - - w = next_w; - - if (!r_is_one) { - if (!BN_mod_mul_montgomery(r, r, r, mont, ctx)) - goto err; - } - - /* Second, multiply r*w by 'a' if exponent bit is set. */ - if (BN_is_bit_set(p, b)) { - next_w = w * a; - - if ((next_w / a) != w) { /* overflow */ - if (r_is_one) { - if (!(BN_set_word(r, (w)) && - BN_mod_mul_montgomery( - (r), (r), &((mont)->RR), - (mont), (ctx)))) - goto err; - - r_is_one = 0; - } else { - if (!BN_MOD_MUL_WORD(r, w, m)) - goto err; - } - - next_w = a; - } - - w = next_w; - } - } - - /* Finally, set r:=r*w. */ - if (w != 1) { - if (r_is_one) { - if (!(BN_set_word(r, (w)) && - BN_mod_mul_montgomery((r), (r), &((mont)->RR), - (mont), (ctx)))) - goto err; - - r_is_one = 0; - } else { - if (!BN_MOD_MUL_WORD(r, w, m)) - goto err; - } - } - - if (r_is_one) { /* can happen only if a == 1*/ - if (!BN_one(rr)) - goto err; - } else { - if (!BN_from_montgomery(rr, r, mont, ctx)) - goto err; - } - - ret = 1; -err: - - if ((in_mont == NULL) && (mont != NULL)) - BN_MONT_CTX_free(mont); - - BN_POOL_release(ctx, 3); - return ret; -} - -/* BN_mod_exp_mont_consttime() stores the precomputed powers in a specific layout - * so that accessing any of these table values shows the same access pattern as far - * as cache lines are concerned. The following functions are used to transfer a struct bignum_st - * from/to that table. */ -static int MOD_EXP_CTIME_COPY_TO_PREBUF(struct bignum_st *b, int top, - unsigned char *buf, int idx, int width) -{ - size_t i, j; - - if (bn_wexpand(b, top) == NULL) - return 0; - - while (b->top < top) - b->d[b->top++] = 0; - - for (i = 0, j = idx; i < top * sizeof(b->d[0]); i++, j += width) - buf[j] = ((unsigned char *)b->d)[i]; - - bn_correct_top(b); - return 1; -} - -static int MOD_EXP_CTIME_COPY_FROM_PREBUF(struct bignum_st *b, int top, - unsigned char *buf, int idx, - int width) -{ - size_t i, j; - - if (bn_wexpand(b, top) == NULL) - return 0; - - for (i = 0, j = idx; i < top * sizeof(b->d[0]); i++, j += width) - ((unsigned char *)b->d)[i] = buf[j]; - - b->top = top; - bn_correct_top(b); - return 1; -} - -/* This variant of BN_mod_exp_mont() uses fixed windows and the special - * precomputation memory layout to limit data-dependency to a minimum - * to protect secret exponents (cf. the hyper-threading timing attacks - * pointed out by Colin Percival, - * http:/*www.daemonology.net/hyperthreading-considered-harmful/) */ -* / static int BN_mod_exp_mont_consttime(struct bignum_st *rr, - const struct bignum_st *a, - const struct bignum_st *p, - const struct bignum_st *m, - struct bignum_pool *ctx, - struct bn_mont_ctx_st *in_mont) -{ - int i, bits, ret = 0, idx, window, wvalue; - int top; - struct bignum_st *r; - const struct bignum_st *aa; - struct bn_mont_ctx_st *mont = NULL; - int numPowers; - unsigned char *powerbufFree = NULL; - int powerbufLen = 0; - unsigned char *powerbuf = NULL; - struct bignum_st *computeTemp = NULL, *am = NULL; - - top = m->top; - - if (!(m->d[0] & 1)) - return 0; - - bits = BN_num_bits(p); - - if (bits == 0) { - ret = BN_one(rr); - return ret; - } - - r = BN_POOL_get(ctx); - - if (r == NULL) - goto err; - - /* Allocate a montgomery context if it was not supplied by the caller. - * If this is not done, things will break in the montgomery part. - */ - if (in_mont != NULL) - mont = in_mont; - else { - mont = BN_MONT_CTX_new(); - - if (mont == NULL) - goto err; - - if (!BN_MONT_CTX_set(mont, m, ctx) - goto err; - } - - /* Get the window size to use with size of p. */ - window = BN_window_bits_for_ctime_exponent_size(bits); - /* Allocate a buffer large enough to hold all of the pre-computed - * powers of a. - */ - numPowers = 1 << window; - powerbufLen = sizeof(m->d[0]) * top * numPowers; - os_alloc_mem(NULL, (UCHAR **)&powerbufFree, - powerbufLen + MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH); - - if (powerbufFree == NULL) - goto err; - - powerbuf = MOD_EXP_CTIME_ALIGN(powerbufFree); - memset(powerbuf, 0, powerbufLen); - - /* Initialize the intermediate result. Do this early to save double conversion, - * once each for a^0 and intermediate result. - */ - if (!BN_mod_mul_montgomery((r), (BN_value_one()), &((mont)->RR), (mont), - (ctx))) - goto err; - - if (!MOD_EXP_CTIME_COPY_TO_PREBUF(r, top, powerbuf, 0, numPowers)) - goto err; - - /* Initialize computeTemp as a^1 with montgomery precalcs */ - computeTemp = BN_POOL_get(ctx); - am = BN_POOL_get(ctx); - - if (computeTemp == NULL || am == NULL) - goto err; - - if (BN_ucmp(a, m) >= 0) { - if (!BN_mod(am, a, m, ctx)) - goto err; - - aa = am; - } else - aa = a; - - if (!BN_mod_mul_montgomery((am), (aa), &((mont)->RR), (mont), (ctx))) - goto err; - - if (!BN_copy(computeTemp, am)) - goto err; - - if (!MOD_EXP_CTIME_COPY_TO_PREBUF(am, top, powerbuf, 1, numPowers)) - goto err; - - /* If the window size is greater than 1, then calculate - * val[i=2..2^winsize-1]. Powers are computed as a*a^(i-1) - * (even powers could instead be computed as (a^(i/2))^2 - * to use the slight performance advantage of sqr over mul). - */ - if (window > 1) { - for (i = 2; i < numPowers; i++) { - /* Calculate a^i = a^(i-1) * a */ - if (!BN_mod_mul_montgomery(computeTemp, am, computeTemp, - mont, ctx)) - goto err; - - if (!MOD_EXP_CTIME_COPY_TO_PREBUF( - computeTemp, top, powerbuf, i, numPowers)) - goto err; - } - } - - /* Adjust the number of bits up to a multiple of the window size. - * If the exponent length is not a multiple of the window size, then - * this pads the most significant bits with zeros to normalize the - * scanning loop to there's no special cases. - * - * * NOTE: Making the window size a power of two less than the native - * * word size ensures that the padded bits won't go past the last - * * word in the internal struct bignum_st structure. Going past the end will - * * still produce the correct result, but causes a different branch - * * to be taken in the BN_is_bit_set function. - */ - bits = ((bits + window - 1) / window) * window; - idx = bits - 1; /* The top bit of the window */ - - /* Scan the exponent one window at a time starting from the most - * significant bits. - */ - while (idx >= 0) { - wvalue = 0; /* The 'value' of the window */ - - /* Scan the window, squaring the result as we go */ - for (i = 0; i < window; i++, idx--) { - if (!BN_mod_mul_montgomery(r, r, r, mont, ctx)) - goto err; - - wvalue = (wvalue << 1) + BN_is_bit_set(p, idx); - } - - /* Fetch the appropriate pre-computed value from the pre-buf */ - if (!MOD_EXP_CTIME_COPY_FROM_PREBUF(computeTemp, top, powerbuf, - wvalue, numPowers)) - goto err; - - /* Multiply the result into the intermediate result */ - if (!BN_mod_mul_montgomery(r, r, computeTemp, mont, ctx)) - goto err; - } - - /* Convert the final result from montgomery to standard format */ - if (!BN_from_montgomery(rr, r, mont, ctx)) - goto err; - - ret = 1; -err: - - if ((in_mont == NULL) && (mont != NULL)) - BN_MONT_CTX_free(mont); - - if (powerbuf != NULL) - os_free_mem(powerbufFree); - - if (am != NULL) - BN_clear(am); - - if (computeTemp != NULL) - BN_clear(computeTemp); - - BN_POOL_release(ctx, 3); - return ret; -} - -static int BN_mod_exp_mont(struct bignum_st *rr, const struct bignum_st *a, - const struct bignum_st *p, const struct bignum_st *m, - struct bignum_pool *ctx, - struct bn_mont_ctx_st *in_mont) -{ - int release = 0; - int i, j, bits, ret = 0, wstart, wend, window, wvalue; - int start = 1; - struct bignum_st *d, *r; - const struct bignum_st *aa; - /* Table of variables obtained from 'ctx' */ - struct bignum_st *val[EXP_TABLE_SIZE]; - struct bn_mont_ctx_st *mont = NULL; - - if (BN_get_flags(p, BN_FLG_EXP_CONSTTIME) != 0) - return BN_mod_exp_mont_consttime(rr, a, p, m, ctx, in_mont); - - if (!BN_is_odd(m)) - return 0; - - bits = BN_num_bits(p); - - if (bits == 0) { - ret = BN_one(rr); - return ret; - } - - d = BN_POOL_get(ctx); - r = BN_POOL_get(ctx); - val[0] = BN_POOL_get(ctx); - release = 3; - - if (!d || !r || !val[0]) - goto err; - - /* If this is not done, things will break in the montgomery - * part */ - - if (in_mont != NULL) - mont = in_mont; - else { - mont = BN_MONT_CTX_new(); - - if (mont == NULL) - goto err; - - if (!BN_MONT_CTX_set(mont, m, ctx)) - goto err; - } - - if (BN_ucmp(a, m) >= 0) { - if (!(BN_mod(val[0], a, m, ctx))) - goto err; - - aa = val[0]; - } else - aa = a; - - if (BN_is_zero(aa)) { - BN_zero(rr); - ret = 1; - goto err; - } - - if (!BN_mod_mul_montgomery((val[0]), (aa), &((mont)->RR), (mont), - (ctx))) - goto err; /* 1 */ - - window = BN_window_bits_for_exponent_size(bits); - - if (window > 1) { - if (!BN_mod_mul_montgomery(d, val[0], val[0], mont, ctx)) - goto err; /* 2 */ - - j = 1 << (window - 1); - - for (i = 1; i < j; i++) { - val[i] = BN_POOL_get(ctx); - - if ((val[i] == NULL) || - !BN_mod_mul_montgomery(val[i], val[i - 1], d, mont, - ctx)) - goto err; - - release++; - } - } - - start = 1; /* This is used to avoid multiplication etc - * when there is only the value '1' in the - * buffer. */ - wvalue = 0; /* The 'value' of the window */ - wstart = bits - 1; /* The top bit of the window */ - wend = 0; /* The bottom bit of the window */ - - if (!BN_mod_mul_montgomery((r), (BN_value_one()), &((mont)->RR), (mont), - (ctx))) - goto err; - - for (;;) { - if (BN_is_bit_set(p, wstart) == 0) { - if (!start) { - if (!BN_mod_mul_montgomery(r, r, r, mont, ctx)) - goto err; - } - - if (wstart == 0) - break; - - wstart--; - continue; - } - - /* We now have wstart on a 'set' bit, we now need to work out - * how bit a window to do. To do this we need to scan - * forward until the last set bit before the end of the - * window */ - j = wstart; - wvalue = 1; - wend = 0; - - for (i = 1; i < window; i++) { - if (wstart - i < 0) - break; - - if (BN_is_bit_set(p, wstart - i)) { - wvalue <<= (i - wend); - wvalue |= 1; - wend = i; - } - } - - /* wend is the size of the current window */ - j = wend + 1; - - /* add the 'bytes above' */ - if (!start) - for (i = 0; i < j; i++) { - if (!BN_mod_mul_montgomery(r, r, r, mont, ctx)) - goto err; - } - - /* wvalue will be an odd number < 2^window */ - if (!BN_mod_mul_montgomery(r, r, val[wvalue >> 1], mont, ctx)) - goto err; - - /* move the 'window' down further */ - wstart -= wend + 1; - wvalue = 0; - start = 0; - - if (wstart < 0) - break; - } - - if (!BN_from_montgomery(rr, r, mont, ctx)) - goto err; - - ret = 1; -err: - - if ((in_mont == NULL) && (mont != NULL)) - BN_MONT_CTX_free(mont); - - BN_POOL_release(ctx, release); - return ret; -} - -/*KERNEL MODULE TRACE*/ -static unsigned char DH_P_VALUE[DH_KEY_LEN] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, - 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, - 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, - 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, - 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, - 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, - 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, - 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, - 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, - 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, - 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, - 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, - 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, - 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, - 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, - 0xCA, 0x23, 0x73, 0x27, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -static struct dh_st *DH_new_method(void) -{ - struct dh_st *ret; - - os_alloc_mem(NULL, (UCHAR **)&ret, sizeof(struct dh_st)); - - if (ret == NULL) - return NULL; - - ret->p = NULL; - ret->g = NULL; - ret->pub_key = NULL; - ret->priv_key = NULL; - ret->flags = 0; - return ret; -} - -static int dh_bn_mod_exp(const struct dh_st *dh, struct bignum_st *r, - const struct bignum_st *a, const struct bignum_st *p, - const struct bignum_st *m, struct bignum_pool *ctx, - struct bn_mont_ctx_st *m_ctx) -{ - /* If a is only one word long and constant time is false, use the faster - * exponenentiation function. - */ - if (a->top == 1 && ((dh->flags & DH_FLAG_NO_EXP_CONSTTIME) != 0)) { - BN_ULONG A = a->d[0]; - - return BN_mod_exp_mont_word(r, A, p, m, ctx, m_ctx); - } else - return BN_mod_exp_mont(r, a, p, m, ctx, m_ctx); -} - -static int generate_key(struct dh_st *dh) -{ - int ok = 0; - int generate_new_key = 0; - unsigned lvar; - struct bignum_pool *ctx; - struct bn_mont_ctx_st *mont = NULL; - struct bignum_st *pub_key = NULL, *priv_key = NULL; - - ctx = BN_CTX_new(); - - if (ctx == NULL) - goto err; - - if (dh->priv_key == NULL) { - priv_key = BN_new(); - - if (priv_key == NULL) - goto err; - - generate_new_key = 1; - } else - priv_key = dh->priv_key; - - if (dh->pub_key == NULL) { - pub_key = BN_new(); - - if (pub_key == NULL) - goto err; - } else - pub_key = dh->pub_key; - - if (generate_new_key) { - lvar = BN_num_bits(dh->p) - 1; /* secret exponent length */ - - if (!bnrand(0, priv_key, lvar, 0, 0)) - goto err; - } - - { - struct bignum_st local_prk; - struct bignum_st *prk; - - if ((dh->flags & DH_FLAG_NO_EXP_CONSTTIME) == 0) { - BN_init(&local_prk); - prk = &local_prk; - BN_with_flags(prk, priv_key, BN_FLG_EXP_CONSTTIME); - } else - prk = priv_key; - - if (!dh_bn_mod_exp(dh, pub_key, dh->g, prk, dh->p, ctx, mont)) - goto err; - } - - dh->pub_key = pub_key; - dh->priv_key = priv_key; - ok = 1; -err: - - if ((pub_key != NULL) && (dh->pub_key == NULL)) - BN_free(pub_key); - - if ((priv_key != NULL) && (dh->priv_key == NULL)) - BN_free(priv_key); - - BN_CTX_free(ctx); - return ok; -} - -static void DH_free(struct dh_st *r) -{ - if (r == NULL) - return; - - if (r->p != NULL) - BN_clear_free(r->p); - - if (r->g != NULL) - BN_clear_free(r->g); - - if (r->pub_key != NULL) - BN_clear_free(r->pub_key); - - if (r->priv_key != NULL) - BN_clear_free(r->priv_key); - - os_free_mem(r); -} - -static int compute_key(unsigned char *key, const struct bignum_st *pub_key, - struct dh_st *dh) -{ - struct bignum_pool *ctx = NULL; - struct bn_mont_ctx_st *mont = NULL; - struct bignum_st *tmp; - int ret = -1; - - if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) - goto err; - - ctx = BN_CTX_new(); - - if (ctx == NULL) - goto err; - - tmp = BN_POOL_get(ctx); - - if (dh->priv_key == NULL) - goto err; - - if (!dh_bn_mod_exp(dh, tmp, pub_key, dh->priv_key, dh->p, ctx, mont)) - goto err; - - ret = BN_bn2bin(tmp, key); -err: - BN_CTX_free(ctx); - return ret; -} - -static struct dh_st *DHSecret; -static struct dh_st *DHSecretR; - -void GenerateDHPublicKey(unsigned char *memPtr, unsigned char *ran_buf, - int ran_len, unsigned char *dhkey, int *dhkey_len) -{ - unsigned int DH_G_VALUE = 2; - unsigned int g = htonl(DH_G_VALUE); - *dhkey_len = 0; - - if (DHSecret == NULL) { - DHSecret = DH_new_method(); - - if (DHSecret == NULL) - goto err; - - DHSecret->p = BN_new(); - DHSecret->g = BN_new(); - } else if ((DHSecret != NULL) && (DHSecretR == NULL)) { - DH_free(DHSecret); - DHSecret = NULL; - DHSecret = DH_new_method(); - - if (DHSecret == NULL) - goto err; - - DHSecret->p = BN_new(); - DHSecret->g = BN_new(); - } else if ((DHSecret != NULL) && (DHSecretR != NULL)) - DHPRINT("reuse DHSecret\n"); - - BN_bin2bn(DH_P_VALUE, DH_KEY_LEN, DHSecret->p); - BN_bin2bn((const unsigned char *)&g, 4, DHSecret->g); - /* - if (!DH_check(DHSecret, &i)) - goto err; - if (i & DH_CHECK_P_NOT_PRIME) - DHPRINT( "p value is not prime\n"); - if (i & DH_CHECK_P_NOT_SAFE_PRIME) - DHPRINT( "p value is not a safe prime\n"); - if (i & DH_UNABLE_TO_CHECK_GENERATOR) - DHPRINT( "unable to check the generator value\n"); - if (i & DH_NOT_SUITABLE_GENERATOR) - DHPRINT( "the g value is not a generator\n"); - */ - /*DHSecret->flags &= ~DH_FLAG_NO_EXP_CONSTTIME; */ - DHSecret->flags |= DH_FLAG_NO_EXP_CONSTTIME; - - if (!generate_key(DHSecret)) - goto err; - - BN_bn2bin(DHSecret->pub_key, dhkey); - *dhkey_len = BN_num_bytes(DHSecret->pub_key); - DHPRINT("GenerateDHPublicKey Success dhkey_len%d\n", *dhkey_len); - /* DHSecret will use and free on GenerateDHSecreteKey. NO free it */ - return; -err: - DH_free(DHSecret); - DHSecret = NULL; - DHPRINT("GenerateDHPublicKey EXIT\n"); - return; -} - -/******* KDK generation ****** */ -/*generate the struct dh_st shared secret */ -void GenerateDHSecreteKey(unsigned char *memPtr, unsigned char *ran_buf, - int ran_len, unsigned char *peer_dhkey, - int peer_dhkey_len, unsigned char *secrete_dhkey, - int *secrete_dhkey_len) -{ - struct bignum_st DH_PubKey_Peer; - *secrete_dhkey_len = 0; - - if (secrete_dhkey == NULL) - goto err; - - if (DHSecret == NULL) - goto err; - - DH_PubKey_Peer.flags = BN_FLG_MALLOCED; - DH_PubKey_Peer.top = 0; - DH_PubKey_Peer.dmax = 0; - DH_PubKey_Peer.d = NULL; - BN_bin2bn(peer_dhkey, peer_dhkey_len, &DH_PubKey_Peer); - *secrete_dhkey_len = - compute_key(secrete_dhkey, &DH_PubKey_Peer, DHSecret); - - if (DH_PubKey_Peer.d != NULL) - os_free_mem(DH_PubKey_Peer.d); - - DHPRINT("GenerateDHSecreteKey Success\n"); -err: - DH_free(DHSecret); - DHSecret = NULL; - DHPRINT("GenerateDHSecreteKey EXIT\n"); - return; -} - -extern void DH_freeall(void) -{ - DH_free(DHSecret); - DHSecret = NULL; - return; -} - -#endif /* WSC_INCLUDED */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/ecc.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/ecc.c deleted file mode 100644 index 1090fafa2c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/ecc.c +++ /dev/null @@ -1,1164 +0,0 @@ -#include "rt_config.h" -#include "security/sae_cmm.h" -#include "security/ecc.h" - -EC_POINT_OP_TIME_RECORD ec_op_ti_rec; - -static EC_GROUP_INFO ec_groups[] = { - EC_GROUP(19, EC_GROUP19_BITS_OF_R), - EC_GROUP(20, EC_GROUP20_BITS_OF_R), - EC_GROUP(21, EC_GROUP21_BITS_OF_R), -}; - -static EC_GROUP_INFO_BI ec_groups_bi[] = { - EC_GROUP_BI(19), - EC_GROUP_BI(20), - EC_GROUP_BI(21), -}; - -int ECC_COST_TIME_DBG_LVL = DBG_LVL_INFO; - -EC_GROUP_INFO *get_ecc_group_info(IN INT32 group) -{ - UINT32 i; - EC_GROUP_INFO *ec_group = NULL; - - for (i = 0; i < EC_GROUP_NUM; i++) - if (ec_groups[i].group_id == group) - ec_group = &ec_groups[i]; - return ec_group; -} - -EC_GROUP_INFO_BI *get_ecc_group_info_bi(IN INT32 group) -{ - UINT32 i; - EC_GROUP_INFO_BI *ec_group_bi = NULL; - EC_GROUP_INFO *ec_group = NULL; - const UCHAR *gx = NULL; - const UCHAR *gy = NULL; - UINT32 gx_len; - UINT32 gy_len; - - for (i = 0; i < EC_GROUP_NUM; i++) - if (ec_groups[i].group_id == group) { - ec_group = &ec_groups[i]; - ec_group_bi = &ec_groups_bi[i]; - } - - if (ec_group == NULL || ec_group_bi == NULL) - return NULL; - - if (ec_group_bi->is_init == FALSE) { - SAE_BN *tmp = NULL; - SAE_BN *pthree = NULL; - UCHAR three[] = { 0x3 }; - - SAE_BN_BIN2BI((UINT8 *)ec_group->prime, ec_group->prime_len, - &ec_group_bi->prime); - SAE_BN_BIN2BI((UINT8 *)ec_group->order, ec_group->order_len, - &ec_group_bi->order); - SAE_BN_BIN2BI((UINT8 *)ec_group->a, ec_group->a_len, - &ec_group_bi->a); - SAE_BN_BIN2BI((UINT8 *)ec_group->b, ec_group->b_len, - &ec_group_bi->b); - SAE_BN_BIN2BI((UINT8 *)ec_group->z, ec_group->z_len, - &ec_group_bi->z); - - if (group == 19) { - gx = ec_group19_gx; - gy = ec_group19_gy; - gx_len = sizeof(ec_group19_gx); - gy_len = sizeof(ec_group19_gy); - } else if (group == 20) { - gx = ec_group20_gx; - gy = ec_group20_gy; - gx_len = sizeof(ec_group20_gx); - gy_len = sizeof(ec_group20_gy); - } else if (group == 21) { - gx = ec_group21_gx; - gy = ec_group21_gy; - gx_len = sizeof(ec_group21_gx); - gy_len = sizeof(ec_group21_gy); - } - - if ((gx != NULL) && (gy != NULL)) { - SAE_BN_BIN2BI((UINT8 *)gx, gx_len, &ec_group_bi->gx); - SAE_BN_BIN2BI((UINT8 *)gy, gy_len, &ec_group_bi->gy); - } - - ec_group_bi->is_init = TRUE; - - SAE_BN_BIN2BI(three, sizeof(three), &pthree); - SAE_BN_INIT(&tmp); - SAE_BN_ADD(ec_group_bi->a, pthree, &tmp); - if (!SAE_BN_UCMP(tmp, ec_group_bi->prime)) - ec_group_bi->is_minus_3 = TRUE; - - SAE_BN_FREE(&tmp); - SAE_BN_FREE(&pthree); - - /* mont structure init */ - os_alloc_mem(NULL, (UCHAR **)&ec_group_bi->mont, - sizeof(MONT_STRUC)); - if (ec_group_bi->mont == NULL) - return NULL; - - ec_group_bi->mont->Bits_Of_R = ec_group->bits_of_R; - ec_group_bi->mont->pBI_X = NULL; - ec_group_bi->mont->pBI_R = NULL; - ec_group_bi->mont->pBI_PInverse = NULL; -#ifndef DOT11_SAE_OPENSSL_BN - SAE_BN_BIN2BI((UINT8 *)ec_group->X, ec_group->X_len, - &ec_group_bi->mont->pBI_X); - SAE_BN_BIN2BI((UINT8 *)ec_group->R, ec_group->R_len, - &ec_group_bi->mont->pBI_R); - SAE_BN_BIN2BI((UINT8 *)ec_group->PInverse, - ec_group->PInverse_len, - &ec_group_bi->mont->pBI_PInverse); -#endif - } - - return ec_group_bi; -} - -VOID group_info_bi_deinit(VOID) -{ - UINT32 i; - EC_GROUP_INFO_BI *ec_group_bi = NULL; - - for (i = 0; i < EC_GROUP_NUM; i++) - if (ec_groups_bi[i].is_init == TRUE) { - ec_group_bi = &ec_groups_bi[i]; - - SAE_BN_FREE(&ec_group_bi->prime); - SAE_BN_FREE(&ec_group_bi->order); - SAE_BN_FREE(&ec_group_bi->a); - SAE_BN_FREE(&ec_group_bi->b); - SAE_BN_FREE(&ec_group_bi->gx); - SAE_BN_FREE(&ec_group_bi->gy); - SAE_BN_FREE(&ec_group_bi->z); - ec_group_bi->cofactor = NULL; - - if (ec_group_bi->mont != NULL) { -#ifndef DOT11_SAE_OPENSSL_BN - SAE_BN_FREE(&ec_group_bi->mont->pBI_X); - SAE_BN_FREE(&ec_group_bi->mont->pBI_R); - SAE_BN_FREE(&ec_group_bi->mont->pBI_PInverse); -#endif - os_free_mem(ec_group_bi->mont); - ec_group_bi->mont = NULL; - } - - ec_group_bi->is_init = FALSE; - } -} - -BIG_INTEGER_EC_POINT *ecc_point_add_cmm(IN BIG_INTEGER_EC_POINT *point, - IN BIG_INTEGER_EC_POINT *point2, - IN SAE_BN *lamda, - IN EC_GROUP_INFO_BI *ec_group_bi) -{ - BIG_INTEGER_EC_POINT *res = NULL; - SAE_BN *tmp = NULL; - SAE_BN *tmp2 = NULL; - SAE_BN *prime = ec_group_bi->prime; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - ecc_point_init(&res); - - if (res == NULL) - return NULL; - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[7]); - GET_BI_INS_FROM_POOL(tmp); - GET_BI_INS_FROM_POOL(tmp2); - - /* - * Xr = lamda ^ 2 - Xp - Xq - * Yr = lamda * (Xp - Xr) - Yp - */ - SAE_BN_MOD_MUL(lamda, lamda, prime, &tmp); - SAE_BN_MOD_ADD_QUICK(point->x, point2->x, prime, &tmp2); - SAE_BN_MOD_SUB(tmp, tmp2, prime, &res->x); - SAE_BN_MOD_SUB_QUICK(point->x, res->x, prime, &tmp); - SAE_BN_MOD_MUL(lamda, tmp, prime, &tmp2); - SAE_BN_MOD_SUB(tmp2, point->y, prime, &res->y); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp2); - POOL_COUNTER_CHECK_END(sae_expected_cnt[7]); - return res; -} - -VOID ecc_point_init(IN BIG_INTEGER_EC_POINT **ec_point_res) -{ - if (*ec_point_res == NULL) { - os_alloc_mem(NULL, (UCHAR **)ec_point_res, - sizeof(BIG_INTEGER_EC_POINT)); - - if (*ec_point_res == NULL) { - panic("ecc_point_init alloc fail\n"); - return; - } - - (*ec_point_res)->x = NULL; - (*ec_point_res)->y = NULL; - (*ec_point_res)->z = NULL; - (*ec_point_res)->z_is_one = 0; - } -} - -VOID ecc_point_free(IN BIG_INTEGER_EC_POINT **ec_point_res) -{ - if (*ec_point_res == NULL) - return; - - SAE_BN_FREE(&(*ec_point_res)->x); - SAE_BN_FREE(&(*ec_point_res)->y); - SAE_BN_FREE(&(*ec_point_res)->z); - os_free_mem(*ec_point_res); - *ec_point_res = NULL; -} - -VOID ecc_point_copy(IN BIG_INTEGER_EC_POINT *point, - OUT BIG_INTEGER_EC_POINT **ec_point_res) -{ - if (point == NULL) - return; - - if (*ec_point_res == NULL) { - ecc_point_init(ec_point_res); - - if (*ec_point_res == NULL) { - panic("ecc_point_init alloc fail\n"); - return; - } - } - - if (point->x) - SAE_BN_COPY(point->x, &(*ec_point_res)->x); - if (point->y) - SAE_BN_COPY(point->y, &(*ec_point_res)->y); - if (point->z) - SAE_BN_COPY(point->z, &(*ec_point_res)->z); - (*ec_point_res)->z_is_one = point->z_is_one; -} - -/* if (x1, y2) != (x2, y2), but x1 = x2 => result is infinity */ -/* if point1 + point2 and point1 is infinity => result is point2 */ -VOID ecc_point_add(IN BIG_INTEGER_EC_POINT *point, - IN BIG_INTEGER_EC_POINT *point2, - IN EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res) -{ - BIG_INTEGER_EC_POINT *res = NULL; - SAE_BN *tmp = NULL; - SAE_BN *tmp2 = NULL; - SAE_BN *lamda = NULL; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_INFO, - ("==> %s()\n", __func__)); - SAE_LOG_TIME_BEGIN(&ec_op_ti_rec.add_op); - - /* if point1 + point2 and point1 is infinity => result is point2 */ - if (point == NULL && point2 != NULL) { - ecc_point_copy(point2, ec_point_res); - return; - } - - /* if point1 + point2 and point2 is infinity => result is point1 */ - if (point != NULL && point2 == NULL) { - ecc_point_copy(point, ec_point_res); - return; - } - - /* if point1 + point2 and point1 & point2 is infinity => result is infinity */ - if (point == NULL && point2 == NULL) { - ecc_point_free(ec_point_res); - return; - } - - if (point->z && point2->z) { - ecc_point_add_3d(point, point2, ec_group_bi, ec_point_res); - return; - } - - if (SAE_BN_UCMP(point->x, point2->x) == 0) { - if (SAE_BN_UCMP(point->y, point2->y) == 0) - ecc_point_double(point, ec_group_bi, ec_point_res); - else - /* if (x1, y2) != (x2, y2), but x1 = x2 => result is infinity */ - ecc_point_free(ec_point_res); - return; - } - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[8]); - GET_BI_INS_FROM_POOL(tmp); - GET_BI_INS_FROM_POOL(tmp2); - GET_BI_INS_FROM_POOL(lamda); - SAE_BN_INIT(&tmp); - SAE_BN_INIT(&tmp2); - SAE_BN_INIT(&lamda); - - /* lamda = (Yp - Yq) / (Xp - Xq) */ - SAE_BN_MOD_SUB_QUICK(point->x, point2->x, ec_group_bi->prime, &tmp); - SAE_BN_MOD_SUB_QUICK(point->y, point2->y, ec_group_bi->prime, &tmp2); - SAE_BN_MOD_DIV(tmp2, tmp, ec_group_bi->prime, &lamda); - res = ecc_point_add_cmm(point, point2, lamda, ec_group_bi); - ecc_point_copy(res, ec_point_res); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp2); - SAE_BN_RELEASE_BACK_TO_POOL(&lamda); - POOL_COUNTER_CHECK_END(sae_expected_cnt[8]); - ecc_point_free(&res); - SAE_LOG_TIME_END(&ec_op_ti_rec.add_op); -} - -/* if point is infinity, result is infinity */ -VOID ecc_point_double(IN BIG_INTEGER_EC_POINT *point, - IN EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res) -{ - BIG_INTEGER_EC_POINT *res = NULL; - SAE_BN *tmp = NULL; - SAE_BN *tmp2 = NULL; - SAE_BN *lamda = NULL; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_INFO, - ("==> %s()\n", __func__)); - SAE_LOG_TIME_BEGIN(&ec_op_ti_rec.dbl_op); - - if (point == NULL) { - /* if point is infinity, result is infinity */ - ecc_point_free(ec_point_res); - return; - } - - if (point->z) { - ecc_point_double_3d(point, ec_group_bi, ec_point_res); - return; - } - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[9]); - GET_BI_INS_FROM_POOL(tmp); - GET_BI_INS_FROM_POOL(tmp2); - GET_BI_INS_FROM_POOL(lamda); - SAE_BN_INIT(&tmp); - SAE_BN_INIT(&tmp2); - SAE_BN_INIT(&lamda); - - /* lamda = (3Xp^2 + a) / 2Yp */ - SAE_BN_MOD_SQR(point->x, ec_group_bi->prime, &tmp); - SAE_BN_MOD_ADD_QUICK(tmp, tmp, ec_group_bi->prime, &tmp2); - SAE_BN_MOD_ADD_QUICK(tmp, tmp2, ec_group_bi->prime, &tmp2); - SAE_BN_MOD_ADD(tmp2, ec_group_bi->a, ec_group_bi->prime, &tmp); - SAE_BN_MOD_ADD_QUICK(point->y, point->y, ec_group_bi->prime, &tmp2); - SAE_BN_MOD_DIV(tmp, tmp2, ec_group_bi->prime, &lamda); - res = ecc_point_add_cmm(point, point, lamda, ec_group_bi); - ecc_point_copy(res, ec_point_res); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp2); - SAE_BN_RELEASE_BACK_TO_POOL(&lamda); - POOL_COUNTER_CHECK_END(sae_expected_cnt[9]); - ecc_point_free(&res); - SAE_LOG_TIME_END(&ec_op_ti_rec.dbl_op); -} - -VOID ecc_point_add_3d(IN BIG_INTEGER_EC_POINT *point, - IN BIG_INTEGER_EC_POINT *point2, - IN EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res) -{ - SAE_BN *n0 = NULL; - SAE_BN *n1 = NULL; - SAE_BN *n2 = NULL; - SAE_BN *n3 = NULL; - SAE_BN *n4 = NULL; - SAE_BN *n5 = NULL; - SAE_BN *n6 = NULL; - BIG_INTEGER_EC_POINT *res = NULL; - - /* if point1 + point2 and point1 is infinity => result is point2 */ - if (point == NULL && point2 != NULL) { - ecc_point_copy(point2, ec_point_res); - return; - } - - /* if point1 + point2 and point2 is infinity => result is point1 */ - if (point != NULL && point2 == NULL) { - ecc_point_copy(point, ec_point_res); - return; - } - - /* if point1 + point2 and point1 & point2 is infinity => result is infinity */ - if (point == NULL && point2 == NULL) { - ecc_point_free(ec_point_res); - return; - } - - SAE_BN_INIT(&n0); - SAE_BN_INIT(&n1); - SAE_BN_INIT(&n2); - SAE_BN_INIT(&n3); - SAE_BN_INIT(&n4); - SAE_BN_INIT(&n5); - SAE_BN_INIT(&n6); - - if (n6 == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s: allocate fail\n", __func__)); - ecc_point_free(ec_point_res); - return; - } - - /* n1, n2 */ - if (point2->z_is_one) { - SAE_BN_COPY(point->x, &n1); - SAE_BN_COPY(point->y, &n2); - /* n1 = X_a */ - /* n2 = Y_a */ - } else { - SAE_BN_MOD_SQR(point2->z, ec_group_bi->prime, &n0); - SAE_BN_MOD_MUL(point->x, n0, ec_group_bi->prime, &n1); - /* n1 = X_a * Z_b^2 */ - SAE_BN_MOD_MUL(n0, point2->z, ec_group_bi->prime, &n0); - SAE_BN_MOD_MUL(point->y, n0, ec_group_bi->prime, &n2); - /* n2 = Y_a * Z_b^3 */ - } - - /* n3, n4 */ - if (point->z_is_one) { - SAE_BN_COPY(point2->x, &n3); - SAE_BN_COPY(point2->y, &n4); - /* n3 = X_b */ - /* n4 = Y_b */ - } else { - SAE_BN_MOD_SQR(point->z, ec_group_bi->prime, &n0); - SAE_BN_MOD_MUL(point2->x, n0, ec_group_bi->prime, &n3); - /* n3 = X_b * Z_a^2 */ - SAE_BN_MOD_MUL(n0, point->z, ec_group_bi->prime, &n0); - SAE_BN_MOD_MUL(point2->y, n0, ec_group_bi->prime, &n4); - /* n4 = Y_b * Z_a^3 */ - } - - /* n5, n6 */ - SAE_BN_MOD_SUB_QUICK(n1, n3, ec_group_bi->prime, &n5); - SAE_BN_MOD_SUB_QUICK(n2, n4, ec_group_bi->prime, &n6); - /* n5 = n1 - n3 */ - /* n6 = n2 - n4 */ - - if (SAE_BN_IS_ZERO(n5)) { - if (SAE_BN_IS_ZERO(n6)) { - /* a is the same point as b */ - ecc_point_double_3d(point, ec_group_bi, ec_point_res); - } else { - /* a is the inverse of b */ - ecc_point_free(ec_point_res); - } - return; - } - /* 'n7', 'n8' */ - SAE_BN_MOD_ADD_QUICK(n1, n3, ec_group_bi->prime, &n1); - SAE_BN_MOD_ADD_QUICK(n2, n4, ec_group_bi->prime, &n2); - /* 'n7' = n1 + n3 */ - /* 'n8' = n2 + n4 */ - - ecc_point_init(&res); - - if (res == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s: ecc allocate fail\n", __func__)); - ecc_point_free(ec_point_res); - return; - } - - SAE_BN_INIT(&res->x); - SAE_BN_INIT(&res->y); - SAE_BN_INIT(&res->z); - - /* Z_r */ - if (point->z_is_one && point2->z_is_one) - SAE_BN_COPY(n5, &res->z); - else { - if (point->z_is_one) - SAE_BN_COPY(point2->z, &n0); - else if (point2->z_is_one) - SAE_BN_COPY(point->z, &n0); - else - SAE_BN_MOD_MUL(point->z, point2->z, ec_group_bi->prime, - &n0); - SAE_BN_MOD_MUL(n0, n5, ec_group_bi->prime, &res->z); - } - res->z_is_one = 0; - /* Z_r = Z_a * Z_b * n5 */ - - /* X_r */ - SAE_BN_MOD_SQR(n6, ec_group_bi->prime, &n0); - SAE_BN_MOD_SQR(n5, ec_group_bi->prime, &n4); - SAE_BN_MOD_MUL(n1, n4, ec_group_bi->prime, &n3); - SAE_BN_MOD_SUB_QUICK(n0, n3, ec_group_bi->prime, &res->x); - /* X_r = n6^2 - n5^2 * 'n7' */ - - /* 'n9' */ - SAE_BN_MOD_LSHIFT1(res->x, ec_group_bi->prime, &n0); - SAE_BN_MOD_SUB_QUICK(n3, n0, ec_group_bi->prime, &n0); - /* n9 = n5^2 * 'n7' - 2 * X_r */ - - /* Y_r */ - SAE_BN_MOD_MUL(n0, n6, ec_group_bi->prime, &n0); - SAE_BN_MOD_MUL(n4, n5, ec_group_bi->prime, &n5); /* now n5 is n5^3 */ - SAE_BN_MOD_MUL(n2, n5, ec_group_bi->prime, &n1); - SAE_BN_MOD_SUB_QUICK(n0, n1, ec_group_bi->prime, &n0); - if (SAE_BN_IS_ODD(n0)) { - SAE_BN_ADD(n0, ec_group_bi->prime, - &n3); /* BI: input can not equal to output */ - SAE_BN_COPY(n3, &n0); - } - /* now 0 <= n0 < 2*p, and n0 is even */ - SAE_BN_RSHIFT1(n0, &res->y); - /* Y_r = (n6 * 'n9' - 'n8' * 'n5^3') / 2 */ - - SAE_BN_FREE(&n0); - SAE_BN_FREE(&n1); - SAE_BN_FREE(&n2); - SAE_BN_FREE(&n3); - SAE_BN_FREE(&n4); - SAE_BN_FREE(&n5); - SAE_BN_FREE(&n6); - - ecc_point_copy(res, ec_point_res); - - ecc_point_free(&res); -} - -VOID ecc_point_double_3d(IN BIG_INTEGER_EC_POINT *point, - IN EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res) -{ - SAE_BN *n0 = NULL; - SAE_BN *n1 = NULL; - SAE_BN *n2 = NULL; - SAE_BN *n3 = NULL; - BIG_INTEGER_EC_POINT *res = NULL; - - if (point == NULL) { - /* if point is infinity, result is infinity */ - ecc_point_free(ec_point_res); - return; - } - - SAE_BN_INIT(&n0); - SAE_BN_INIT(&n1); - SAE_BN_INIT(&n2); - SAE_BN_INIT(&n3); - - if (n3 == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s: allocate fail\n", __func__)); - ecc_point_free(ec_point_res); - return; - } - - ecc_point_init(&res); - - if (res == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s: ecc allocate fail\n", __func__)); - ecc_point_free(ec_point_res); - return; - } - - SAE_BN_INIT(&res->x); - SAE_BN_INIT(&res->y); - SAE_BN_INIT(&res->z); - - /* n1 */ - if (point->z_is_one) { - SAE_BN_MOD_SQR(point->x, ec_group_bi->prime, &n0); - SAE_BN_MOD_LSHIFT1(n0, ec_group_bi->prime, &n1); - SAE_BN_MOD_ADD_QUICK(n0, n1, ec_group_bi->prime, &n0); - SAE_BN_MOD_ADD_QUICK(n0, ec_group_bi->a, ec_group_bi->prime, - &n1); - /* n1 = 3 * X_a^2 + a_curve */ - } else if (ec_group_bi->is_minus_3) { - SAE_BN_MOD_SQR(point->z, ec_group_bi->prime, &n1); - SAE_BN_MOD_ADD_QUICK(point->x, n1, ec_group_bi->prime, &n0); - SAE_BN_MOD_SUB_QUICK(point->x, n1, ec_group_bi->prime, &n2); - SAE_BN_MOD_MUL(n0, n2, ec_group_bi->prime, &n1); - SAE_BN_MOD_LSHIFT1(n1, ec_group_bi->prime, &n0); - SAE_BN_MOD_ADD_QUICK(n0, n1, ec_group_bi->prime, &n1); - /*- - * n1 = 3 * (X_a + Z_a^2) * (X_a - Z_a^2) - * = 3 * X_a^2 - 3 * Z_a^4 - */ - } else { - SAE_BN_MOD_SQR(point->x, ec_group_bi->prime, &n0); - SAE_BN_MOD_LSHIFT1(n0, ec_group_bi->prime, &n1); - SAE_BN_MOD_ADD_QUICK(n0, n1, ec_group_bi->prime, &n0); - SAE_BN_MOD_SQR(point->z, ec_group_bi->prime, &n1); - SAE_BN_MOD_SQR(n1, ec_group_bi->prime, &n1); - SAE_BN_MOD_MUL(n1, ec_group_bi->a, ec_group_bi->prime, &n1); - SAE_BN_MOD_ADD_QUICK(n1, n0, ec_group_bi->prime, &n1); - /* n1 = 3 * X_a^2 + a_curve * Z_a^4 */ - } - - /* Z_r */ - if (point->z_is_one) - SAE_BN_COPY(point->y, &n0); - else - SAE_BN_MOD_MUL(point->y, point->z, ec_group_bi->prime, &n0); - SAE_BN_MOD_LSHIFT1(n0, ec_group_bi->prime, &res->z); - res->z_is_one = 0; - /* Z_r = 2 * Y_a * Z_a */ - - /* n2 */ - SAE_BN_MOD_SQR(point->y, ec_group_bi->prime, &n3); - SAE_BN_MOD_MUL(point->x, n3, ec_group_bi->prime, &n2); - SAE_BN_MOD_LSHIFT(n2, 2, ec_group_bi->prime, &n2); - /* n2 = 4 * X_a * Y_a^2 */ - - /* X_r */ - SAE_BN_MOD_LSHIFT1(n2, ec_group_bi->prime, &n0); - SAE_BN_MOD_SQR(n1, ec_group_bi->prime, &res->x); - SAE_BN_MOD_SUB_QUICK(res->x, n0, ec_group_bi->prime, &res->x); - /* X_r = n1^2 - 2 * n2 */ - - /* n3 */ - SAE_BN_MOD_SQR(n3, ec_group_bi->prime, &n0); - SAE_BN_MOD_LSHIFT(n0, 3, ec_group_bi->prime, &n3); - /* n3 = 8 * Y_a^4 */ - - /* Y_r */ - SAE_BN_MOD_SUB_QUICK(n2, res->x, ec_group_bi->prime, &n0); - SAE_BN_MOD_MUL(n1, n0, ec_group_bi->prime, &n0); - SAE_BN_MOD_SUB_QUICK(n0, n3, ec_group_bi->prime, &res->y); - /* Y_r = n1 * (n2 - X_r) - n3 */ - - SAE_BN_FREE(&n0); - SAE_BN_FREE(&n1); - SAE_BN_FREE(&n2); - SAE_BN_FREE(&n3); - - ecc_point_copy(res, ec_point_res); - - ecc_point_free(&res); -} - -VOID ecc_point_3d_to_2d(IN EC_GROUP_INFO_BI *ec_group_bi, - INOUT BIG_INTEGER_EC_POINT *ec_point_res) -{ - SAE_BN *Z_1 = NULL; - SAE_BN *Z_2 = NULL; - SAE_BN *Z_3 = NULL; - SAE_BN *Z = ec_point_res->z; - SAE_BN *res_x = NULL; - SAE_BN *res_y = NULL; - SAE_BN *res_z = NULL; - UCHAR one[] = { 1 }; - - if (ec_point_res == NULL) - return; - if (ec_point_res->z_is_one) - return; - - if (ec_point_res->z == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s: z is null\n", __func__)); - return; - } - - SAE_BN_INIT(&Z_1); - SAE_BN_INIT(&Z_2); - SAE_BN_INIT(&Z_3); - SAE_BN_INIT(&res_x); - SAE_BN_INIT(&res_y); - SAE_BN_INIT(&res_z); - - /*- - * We have a curve defined by a Weierstrass equation - * y^2 = x^3 + a*x + b. - * The point to consider is given in Jacobian projective coordinates - * where (X, Y, Z) represents (x, y) = (X/Z^2, Y/Z^3). - * Substituting this and multiplying by Z^6 transforms the above equation into - * Y^2 = X^3 + a*X*Z^4 + b*Z^6. - * To test this, we add up the right-hand side in 'rh'. - */ - SAE_BN_MOD_MUL_INV(Z, ec_group_bi->prime, &Z_1); - SAE_BN_MOD_SQR(Z_1, ec_group_bi->prime, &Z_2); - SAE_BN_MOD_MUL(ec_point_res->x, Z_2, ec_group_bi->prime, &res_x); - SAE_BN_MOD_MUL(Z_2, Z_1, ec_group_bi->prime, &Z_3); - SAE_BN_MOD_MUL(ec_point_res->y, Z_3, ec_group_bi->prime, &res_y); - - SAE_BN_BIN2BI(one, sizeof(one), &res_z); - - SAE_BN_COPY(res_x, &ec_point_res->x); - SAE_BN_COPY(res_y, &ec_point_res->y); - SAE_BN_COPY(res_z, &ec_point_res->z); - ec_point_res->z_is_one = 1; - - SAE_BN_FREE(&Z_1); - SAE_BN_FREE(&Z_2); - SAE_BN_FREE(&Z_3); - SAE_BN_FREE(&res_x); - SAE_BN_FREE(&res_y); - SAE_BN_FREE(&res_z); -} - -VOID ecc_point_set_z_to_one(INOUT BIG_INTEGER_EC_POINT *ec_point_res) -{ - UCHAR one[] = { 1 }; - - SAE_BN_BIN2BI(one, sizeof(one), &ec_point_res->z); - ec_point_res->z_is_one = 1; -} - -#define W_POW 16 - -/* https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication */ -/* w-ary non-adjacent form (wNAF) method */ -VOID ecc_point_mul_wNAF(IN BIG_INTEGER_EC_POINT *point, IN SAE_BN *scalar, - IN EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res) -{ - BIG_INTEGER_EC_POINT *p[W_POW / 2] = { NULL }; - BIG_INTEGER_EC_POINT *res = NULL; - SAE_BN *scalar_copy = NULL; - UINT32 i; - UINT32 *d; - UINT32 record = 0; - - SAE_LOG_TIME_BEGIN(&ec_op_ti_rec.mul_op); - - /* pre-compute {1, 3, ..., 2^(w-1) -1}P */ - ecc_point_copy(point, &p[0]); - ecc_point_double(p[0], ec_group_bi, &p[W_POW / 2 - 1]); - for (i = 0; i < W_POW / 4 - 1; i++) - ecc_point_add(p[i], p[W_POW / 2 - 1], ec_group_bi, &p[i + 1]); - for (i = 0; i < W_POW / 4; i++) { - ecc_point_copy(p[i], &p[W_POW / 2 - i - 1]); - ecc_point_inverse(p[W_POW / 2 - i - 1], ec_group_bi->prime, - &p[W_POW / 2 - i - 1]); - } - os_alloc_mem(NULL, (UCHAR **)&d, - sizeof(UINT32) * SAE_BN_GET_LEN(scalar) * 8); - NdisZeroMemory(d, sizeof(UINT32) * SAE_BN_GET_LEN(scalar) * 8); - SAE_BN_COPY(scalar, &scalar_copy); - - i = 0; - while (SAE_BN_IS_ZERO(scalar_copy) == FALSE) { - if (SAE_BN_IS_ODD(scalar_copy)) { - SAE_BN_MOD_DW(scalar_copy, W_POW, &d[i]); - if (d[i] >= W_POW / 2) - SAE_BN_ADD_DW(scalar_copy, W_POW); /* fix me */ - } else - d[i] = 0; - SAE_BN_RSHIFT1(scalar_copy, &scalar_copy); - i++; - } - i = SAE_BN_GET_LEN(scalar) * 8 - 1; - ecc_point_copy(point, &res); - do { - ecc_point_double(res, ec_group_bi, &res); - if (d[i]) { - ecc_point_add(res, p[d[i]], ec_group_bi, &res); - record++; - } - i--; - } while (i != 0); - - ecc_point_copy(res, ec_point_res); - - os_free_mem(d); - - for (i = 0; i < W_POW / 2; i++) - ecc_point_free(&p[i]); - ecc_point_free(&res); - SAE_LOG_TIME_END(&ec_op_ti_rec.mul_op); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("total cnt = %d!!!!!!\n", record + W_POW / 2)); -} - -/* https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication */ -/* windowed method */ -VOID ecc_point_mul_windowed(IN BIG_INTEGER_EC_POINT *point, IN SAE_BN *scalar, - IN EC_GROUP_INFO_BI *ec_group_bi, - OUT BIG_INTEGER_EC_POINT **ec_point_res) -{ - BIG_INTEGER_EC_POINT *p[W_POW / 2] = { NULL }; - BIG_INTEGER_EC_POINT *res = NULL; - SAE_BN *scalar_copy = NULL; - INT16 i; - UINT32 *d; - - SAE_LOG_TIME_BEGIN(&ec_op_ti_rec.mul_op); - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_INFO, - ("==> %s()\n", __func__)); - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[11]); - GET_BI_INS_FROM_POOL(scalar_copy); - - /* pre-compute {1, 3, ..., 2^(w-1) -1}P */ - ecc_point_copy(point, &p[0]); - ecc_point_double(p[0], ec_group_bi, &p[W_POW / 2 - 1]); - - for (i = 0; i < W_POW / 2 - 1; i++) - ecc_point_add(p[i], p[W_POW / 2 - 1], ec_group_bi, &p[i + 1]); - - os_alloc_mem(NULL, (UCHAR **)&d, - sizeof(UINT32) * SAE_BN_GET_LEN(scalar) * 8); - NdisZeroMemory(d, sizeof(UINT32) * SAE_BN_GET_LEN(scalar) * 8); - SAE_BN_COPY(scalar, &scalar_copy); - - i = 0; - while (SAE_BN_IS_ZERO(scalar_copy) == FALSE) { - if (SAE_BN_IS_ODD(scalar_copy)) - SAE_BN_MOD_DW(scalar_copy, W_POW, &d[i]); - else - d[i] = 0; - SAE_BN_RSHIFT1(scalar_copy, &scalar_copy); - i++; - } - - i = SAE_BN_GET_LEN(scalar) * 8 - 1; - - do { - ecc_point_double(res, ec_group_bi, &res); - if (d[i]) - ecc_point_add(res, p[(d[i] - 1) / 2], ec_group_bi, - &res); - i--; - } while (i >= 0); - - ecc_point_copy(res, ec_point_res); - - os_free_mem(d); - - for (i = 0; i < W_POW / 2; i++) - ecc_point_free(&p[i]); - ecc_point_free(&res); - SAE_BN_RELEASE_BACK_TO_POOL(&scalar_copy); - POOL_COUNTER_CHECK_END(sae_expected_cnt[11]); - SAE_LOG_TIME_END(&ec_op_ti_rec.mul_op); -} - -/* (x,y) => (x, p-y) */ -VOID ecc_point_inverse(IN BIG_INTEGER_EC_POINT *point, IN SAE_BN *prime, - OUT BIG_INTEGER_EC_POINT **point_res) -{ - BIG_INTEGER_EC_POINT *res = NULL; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - - if (point == NULL) { - ecc_point_free(point_res); - return; - } - - ecc_point_copy(point, &res); - SAE_BN_SUB(prime, point->y, &res->y); - ecc_point_copy(res, point_res); - ecc_point_free(&res); -} - -/* y^2 = x^3 + ax + b */ -UCHAR ecc_point_is_on_curve(IN EC_GROUP_INFO_BI *ec_group_bi, - IN BIG_INTEGER_EC_POINT *point) -{ - SAE_BN *right = NULL; - SAE_BN *left = NULL; - SAE_BN *left2 = NULL; - UCHAR res; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[12]); - GET_BI_INS_FROM_POOL(right); - GET_BI_INS_FROM_POOL(left); - GET_BI_INS_FROM_POOL(left2); - SAE_BN_INIT(&right); - SAE_BN_INIT(&left); - SAE_BN_INIT(&left2); - - SAE_LOG_TIME_BEGIN(&ec_op_ti_rec.on_curve_check_op); - SAE_BN_MOD_SQR(point->x, ec_group_bi->prime, &right); /* x^2 */ - SAE_BN_MOD_ADD(right, ec_group_bi->a, ec_group_bi->prime, - &right); /* X^2+a */ - SAE_BN_MOD_MUL(point->x, right, ec_group_bi->prime, - &right); /* x^3+ax */ - SAE_BN_MOD_ADD(right, ec_group_bi->b, ec_group_bi->prime, - &right); /* x^3+ax+b */ - SAE_BN_MOD_SQR(point->y, ec_group_bi->prime, &left); /* y^2 */ - SAE_BN_SUB(ec_group_bi->prime, point->y, &left2); - SAE_BN_MOD_SQR(left2, ec_group_bi->prime, &left2); /* (p - y)^2 */ - - if (SAE_BN_UCMP(left, right) == 0 || SAE_BN_UCMP(left2, right) == 0) - res = TRUE; - else - res = FALSE; - - SAE_BN_RELEASE_BACK_TO_POOL(&right); - SAE_BN_RELEASE_BACK_TO_POOL(&left); - SAE_BN_RELEASE_BACK_TO_POOL(&left2); - POOL_COUNTER_CHECK_END(sae_expected_cnt[12]); - SAE_LOG_TIME_END(&ec_op_ti_rec.on_curve_check_op); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): res = %d\n", __func__, res)); - return res; -} - -/* Y^2 = X^3 + a*X*Z^4 + b*Z^6 */ -UCHAR ecc_point_is_on_curve_3d(IN EC_GROUP_INFO_BI *ec_group_bi, - IN BIG_INTEGER_EC_POINT *point) -{ - SAE_BN *right = NULL; - SAE_BN *left = NULL; - SAE_BN *left2 = NULL; - SAE_BN *tmp = NULL; - SAE_BN *Z4 = NULL; - UCHAR res; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - - if (point->z == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("ecc_point_is_on_curve_3d: z is NULL\n")); - return FALSE; - } - - GET_BI_INS_FROM_POOL(right); - GET_BI_INS_FROM_POOL(left); - GET_BI_INS_FROM_POOL(left2); - GET_BI_INS_FROM_POOL(tmp); - GET_BI_INS_FROM_POOL(Z4); - SAE_BN_INIT(&right); - SAE_BN_INIT(&left); - SAE_BN_INIT(&left2); - SAE_BN_INIT(&tmp); - SAE_BN_INIT(&Z4); - - SAE_BN_MOD_SQR(point->x, ec_group_bi->prime, &right); /* x^2 */ - SAE_BN_MOD_SQR(point->z, ec_group_bi->prime, &tmp); /* z^2 */ - SAE_BN_MOD_SQR(tmp, ec_group_bi->prime, &Z4); /* z^4 */ - SAE_BN_MOD_MUL(Z4, tmp, ec_group_bi->prime, &tmp); /* z^6 */ - SAE_BN_MOD_MUL(ec_group_bi->a, Z4, ec_group_bi->prime, &Z4); /* az^4 */ - SAE_BN_MOD_ADD(right, Z4, ec_group_bi->prime, &right); /* X^2+az^4 */ - SAE_BN_MOD_MUL(point->x, right, ec_group_bi->prime, - &right); /* X^3+axz^4 */ - SAE_BN_MOD_MUL(ec_group_bi->b, tmp, ec_group_bi->prime, - &tmp); /* bz^6 */ - SAE_BN_MOD_ADD(right, tmp, ec_group_bi->prime, - &right); /* X^3+axz^4 + bz^6 */ - - SAE_BN_MOD_SQR(point->y, ec_group_bi->prime, &left); /* y^2 */ - SAE_BN_SUB(ec_group_bi->prime, point->y, &left2); - SAE_BN_MOD_SQR(left2, ec_group_bi->prime, &left2); /* (p - y)^2 */ - - if (SAE_BN_UCMP(left, right) == 0 || SAE_BN_UCMP(left2, right) == 0) - res = TRUE; - else - res = FALSE; - - SAE_BN_RELEASE_BACK_TO_POOL(&right); - SAE_BN_RELEASE_BACK_TO_POOL(&left); - SAE_BN_RELEASE_BACK_TO_POOL(&left2); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp); - SAE_BN_RELEASE_BACK_TO_POOL(&Z4); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): res = %d\n", __func__, res)); - return res; -} -#ifdef DOT11_SAE_OPENSSL_BN -#endif - -/* ec_GFp_simple_set_compressed_coordinates */ -/* y^2 = x^3 + ax + b */ -UCHAR ecc_point_find_by_x(IN EC_GROUP_INFO_BI *ec_group_bi, IN SAE_BN *x, - IN SAE_BN **res_y, IN UCHAR need_res_y) -{ - SAE_BN *res = NULL; - UCHAR has_y; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_INFO, - ("==> %s()\n", __func__)); - - SAE_LOG_TIME_BEGIN(&ec_op_ti_rec.find_y_op); - SAE_BN_MOD_SQR(x, ec_group_bi->prime, &res); /* x^2 */ - SAE_BN_MOD_ADD(res, ec_group_bi->a, ec_group_bi->prime, - &res); /* X^2+a */ - SAE_BN_MOD_MUL(x, res, ec_group_bi->prime, &res); /* x^3+ax */ - SAE_BN_MOD_ADD(res, ec_group_bi->b, ec_group_bi->prime, - &res); /* x^3+ax+b */ - - if (SAE_BN_IS_QUADRATIC_RESIDE(res, ec_group_bi->prime, - ec_group_bi->mont)) - has_y = TRUE; - else - has_y = FALSE; - - if (need_res_y && has_y) { - SAE_BN_MOD_SQRT(res, ec_group_bi->prime, ec_group_bi->mont, - &res); - if (res) { - SAE_BN_COPY(res, res_y); - has_y = TRUE; - } else { - SAE_BN_FREE(res_y); - has_y = FALSE; - } - } - - SAE_BN_FREE(&res); - SAE_LOG_TIME_END(&ec_op_ti_rec.find_y_op); - return has_y; -} - -VOID ecc_point_dump_time(VOID) -{ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, ECC_COST_TIME_DBG_LVL, - ("ecc_point time record:\n")); - - if (ec_op_ti_rec.add_op.exe_times) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("add_op time record:\n")); - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\tavg_time=%lu jiffies", - ec_op_ti_rec.add_op.avg_time_interval)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs( - ec_op_ti_rec.add_op.avg_time_interval))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\n\texe_times=%u\n", ec_op_ti_rec.add_op.exe_times)); - ec_op_ti_rec.add_op.avg_time_interval = 0; - ec_op_ti_rec.add_op.time_interval = 0; - ec_op_ti_rec.add_op.exe_times = 0; - } - - if (ec_op_ti_rec.dbl_op.exe_times) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("dbl_op time record:\n")); - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\tavg_time=%lu jiffies", - ec_op_ti_rec.dbl_op.avg_time_interval)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs( - ec_op_ti_rec.dbl_op.avg_time_interval))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\n\texe_times=%u\n", ec_op_ti_rec.dbl_op.exe_times)); - ec_op_ti_rec.dbl_op.avg_time_interval = 0; - ec_op_ti_rec.dbl_op.time_interval = 0; - ec_op_ti_rec.dbl_op.exe_times = 0; - } - - if (ec_op_ti_rec.mul_op.exe_times) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("mul_op time record:\n")); - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\tavg_time=%lu jiffies", - ec_op_ti_rec.mul_op.avg_time_interval)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs( - ec_op_ti_rec.mul_op.avg_time_interval))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\n\texe_times=%u\n", ec_op_ti_rec.mul_op.exe_times)); - ec_op_ti_rec.mul_op.avg_time_interval = 0; - ec_op_ti_rec.mul_op.time_interval = 0; - ec_op_ti_rec.mul_op.exe_times = 0; - } - - if (ec_op_ti_rec.find_y_op.exe_times) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("find_y_op time record:\n")); - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\tavg_time=%lu jiffies", - ec_op_ti_rec.find_y_op.avg_time_interval)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs( - ec_op_ti_rec.find_y_op.avg_time_interval))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\n\texe_times=%u\n", - ec_op_ti_rec.find_y_op.exe_times)); - ec_op_ti_rec.find_y_op.avg_time_interval = 0; - ec_op_ti_rec.find_y_op.time_interval = 0; - ec_op_ti_rec.find_y_op.exe_times = 0; - } - - if (ec_op_ti_rec.on_curve_check_op.exe_times) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("on_curve_check_op time record:\n")); - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - ("\tavg_time=%lu jiffies", - ec_op_ti_rec.on_curve_check_op.avg_time_interval)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, ECC_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs(ec_op_ti_rec.on_curve_check_op - .avg_time_interval))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, ECC_COST_TIME_DBG_LVL, - ("\n\texe_times=%u\n", - ec_op_ti_rec.on_curve_check_op.exe_times)); - ec_op_ti_rec.on_curve_check_op.avg_time_interval = 0; - ec_op_ti_rec.on_curve_check_op.time_interval = 0; - ec_op_ti_rec.on_curve_check_op.exe_times = 0; - } -} - -INT ecc_gen_key(EC_GROUP_INFO *ec_group, EC_GROUP_INFO_BI *ec_group_bi, - INOUT SAE_BN **priv_key, BIG_INTEGER_EC_POINT *generator, - INOUT VOID **pub_key) -{ - SAE_BN *priv = NULL; - BIG_INTEGER_EC_POINT *pub = NULL; - - if (*priv_key == NULL) { - SAE_BN_INIT(&priv); - if (priv == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, DBG_LVL_OFF, - ("%s, cannot alloc BN for priv\n", __func__)); - return 0; - } - *priv_key = priv; - } else - priv = *priv_key; - - do { - if (!SAE_GET_RAND_RANGE(priv, ec_group_bi->order)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, DBG_LVL_OFF, - ("%s, derive priv_key failed\n", __func__)); - return 0; - } - } while (SAE_BN_IS_ZERO(priv)); - - if (*pub_key == NULL) { - ecc_point_init(&pub); - if (pub == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_ECC, DBG_LVL_OFF, - ("%s, cannot alloc POINT for pub\n", - __func__)); - return 0; - } - *pub_key = pub; - } else - pub = *pub_key; - - ECC_POINT_MUL(generator, priv, ec_group_bi, &pub); - SAE_ECC_3D_to_2D(ec_group_bi, pub); - - return 1; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/owe.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/owe.c deleted file mode 100644 index f682230de4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/owe.c +++ /dev/null @@ -1,607 +0,0 @@ -#ifdef CONFIG_OWE_SUPPORT - -#include "rt_config.h" -#include "security/ecc.h" -#include "security/crypt_sha2.h" - -UCHAR OWE_TRANS_OUI[] = { 0x50, 0x6f, 0x9a, 0x1c }; - -#ifdef APCLI_OWE_SUPPORT -UCHAR apcli_owe_supp_groups[APCLI_MAX_SUPPORTED_OWE_GROUPS] = { 19, 20 }; -#endif - -static inline UINT16 GET_LE16(const UCHAR *a) -{ - return (a[1] << 8) | a[0]; -} - -static UINT owe_process_peer_pubkey(OWE_INFO *owe, UCHAR *peer_pub_key, - UCHAR pubkey_len) -{ - SAE_BN *peer_pubkey_bn = NULL; - BIG_INTEGER_EC_POINT *peer_pub_point = NULL; - EC_GROUP_INFO_BI *ec_group_bi = (EC_GROUP_INFO_BI *)owe->group_info_bi; - UINT ret = 0; - - if (owe->peer_pub_key != NULL) - ecc_point_free((BIG_INTEGER_EC_POINT **)&owe->peer_pub_key); - - ecc_point_init(&peer_pub_point); - SAE_BN_BIN2BI((UINT8 *)peer_pub_key, pubkey_len, &peer_pubkey_bn); - - SAE_BN_COPY(peer_pubkey_bn, &peer_pub_point->x); - - while (peer_pub_point->y == NULL) - ecc_point_find_by_x(ec_group_bi, peer_pub_point->x, - &peer_pub_point->y, TRUE); - - if (ecc_point_is_on_curve(ec_group_bi, peer_pub_point) == FALSE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_OFF, - ("%s, point is not on curve\n", __func__)); - goto err; - } - SAE_ECC_SET_Z_TO_1(peer_pub_point); - owe->peer_pub_key = (VOID *)peer_pub_point; - - ret = 1; - -err: - if (peer_pubkey_bn) - SAE_BN_FREE(&peer_pubkey_bn); - - return ret; -} - -INT owe_calculate_secret(OWE_INFO *owe, SAE_BN **secret) -{ - BIG_INTEGER_EC_POINT *peer_pub = - (BIG_INTEGER_EC_POINT *)owe->peer_pub_key; - SAE_BN *priv_key = owe->priv_key; - BIG_INTEGER_EC_POINT *secret_point = NULL; - EC_GROUP_INFO_BI *ec_group_bi = (EC_GROUP_INFO_BI *)owe->group_info_bi; - INT ret = 0; - - ECC_POINT_MUL(peer_pub, priv_key, ec_group_bi, &secret_point); - SAE_ECC_3D_to_2D(ec_group_bi, secret_point); - - if (secret_point == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), can't output the common secret point\n", - __func__)); - return ret; - } - - SAE_BN_COPY(secret_point->x, secret); - - if (secret_point) - ecc_point_free(&secret_point); - ret = 1; - - return ret; -} - -static BIG_INTEGER_EC_POINT *get_owe_pub_key(OWE_INFO *owe) -{ - return (BIG_INTEGER_EC_POINT *)owe->pub_key; -} - -static VOID owe_calculate_pmkid(OWE_INFO *owe, SAE_BN *my_pubkey, - UCHAR *peer_pub, UCHAR type, - UCHAR peer_pub_length, UINT16 group, - UCHAR *pmkid) -{ - EC_GROUP_INFO *ec_group = NULL; - UCHAR *material = NULL; - UINT material_length = 0; - const UCHAR *_addr[2]; - INT _len[2]; - - ec_group = (EC_GROUP_INFO *)owe->group_info; - - if (os_alloc_mem(NULL, (UCHAR **)&material, ec_group->prime_len) == - NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), alloc buf for material failed...\n", - __func__)); - goto err; - } - - /* Truncate-128(hash(C | A)) */ - if (type == SUBTYPE_ASSOC_REQ) { - /*we are processing ecdh from (re)assoc req*/ - _addr[0] = peer_pub; - _len[0] = peer_pub_length; - SAE_BN_BI2BIN_WITH_PAD(my_pubkey, material, &material_length, - ec_group->prime_len); - _addr[1] = material; - _len[1] = material_length; - } else { - SAE_BN_BI2BIN_WITH_PAD(my_pubkey, material, &material_length, - ec_group->prime_len); - _addr[0] = material; - _len[0] = material_length; - _addr[1] = peer_pub; - _len[1] = peer_pub_length; - } - - switch (group) { - case ECDH_GROUP_521: - break; - case ECDH_GROUP_384: - rt_sha384_vector(2, _addr, _len, pmkid); - break; - case ECDH_GROUP_256: - default: - rt_sha256_vector(2, _addr, _len, pmkid); - } - - hex_dump("OWE PMKID:", pmkid, LEN_PMKID); - - if (owe->pmkid) - os_free_mem(owe->pmkid); - - if (os_alloc_mem(NULL, (UCHAR **)&owe->pmkid, LEN_PMKID) == - NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), alloc pmkid failed...\n", __func__)); - goto err; - } - NdisMoveMemory(owe->pmkid, pmkid, LEN_PMKID); - -err: - if (material) - os_free_mem(material); -} - -INT process_ecdh_element(struct _RTMP_ADAPTER *ad, - struct _MAC_TABLE_ENTRY *entry, - EXT_ECDH_PARAMETER_IE *ext_ie_ptr, UCHAR ie_len, - UCHAR type, BOOLEAN update_only_grp_info) -{ - OWE_INFO *owe = &entry->SecConfig.owe; - UINT16 peer_group = 0; - UCHAR remain_len = 0; - UCHAR *pos = NULL; - UCHAR *peer_pub = NULL; - SAE_BN *secret = NULL; - UCHAR *hkey = NULL; - BIG_INTEGER_EC_POINT *my_pubkey = NULL; - EC_GROUP_INFO *ec_group = NULL; - UINT hkey_length = 0; - UCHAR *sec_buf = NULL; - UINT sec_length = 0; - UCHAR prk[SHA512_DIGEST_SIZE], pmkid[SHA512_DIGEST_SIZE]; - UCHAR hash_len = 0; - struct _SECURITY_CONFIG *sec_config = &entry->SecConfig; - BOOLEAN ret = MLME_SUCCESS; - - if ((ext_ie_ptr->ext_ie_id == 0) && (ext_ie_ptr->length == 0)) - return MLME_SUCCESS; - - remain_len = ie_len - - 1; /*the length which starts from group field directly.*/ - pos = (UCHAR *)&ext_ie_ptr->group; /*start from group field directly.*/ - - peer_group = GET_LE16((UCHAR *)&ext_ie_ptr->group); - if ((peer_group != ECDH_GROUP_256) && (peer_group != ECDH_GROUP_384) && - (peer_group != ECDH_GROUP_521)) - owe->last_try_group = 0; - else { - owe->last_try_group = peer_group; - - switch (peer_group) { - case ECDH_GROUP_521: - sec_config->key_deri_alg = SEC_KEY_DERI_SHA512; - return MLME_FINITE_CYCLIC_GROUP_NOT_SUPPORTED; - case ECDH_GROUP_384: - sec_config->key_deri_alg = SEC_KEY_DERI_SHA384; - break; - case ECDH_GROUP_256: - default: - sec_config->key_deri_alg = SEC_KEY_DERI_SHA256; - } - } - - if (update_only_grp_info == TRUE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_TRACE, - ("==> %s(), Update group info :%d\n", __func__, - sec_config->key_deri_alg)); - return MLME_SUCCESS; - } - - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_TRACE, - ("==> %s(), peer_group:%d\n", __func__, peer_group)); - - /*if we cannot support the group, skip the further steps.*/ - if (owe->last_try_group == 0) - return MLME_FINITE_CYCLIC_GROUP_NOT_SUPPORTED; - - pos = pos + sizeof(peer_group); - remain_len = remain_len - sizeof(peer_group); - - if (init_owe_group(owe, peer_group) == 0) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), init_owe_group failed. shall not happen!\n", - __func__)); - return MLME_UNSPECIFY_FAIL; - } - - if (os_alloc_mem(NULL, (UCHAR **)&peer_pub, remain_len) == - NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), alloc buf for peer_pub failed...\n", - __func__)); - return MLME_UNSPECIFY_FAIL; - } - NdisMoveMemory(peer_pub, pos, remain_len); - if (owe_process_peer_pubkey(owe, peer_pub, remain_len) == 0) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), owe_process_peer_pubkey failed...\n", - __func__)); - ret = MLME_UNSPECIFY_FAIL; - goto LabelErr; - } - - SAE_BN_INIT(&secret); - if (owe_calculate_secret(owe, &secret) == 0) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), owe_calculate_secret failed...\n", - __func__)); - ret = MLME_UNSPECIFY_FAIL; - goto LabelErr; - } - - ec_group = (EC_GROUP_INFO *)owe->group_info; - if (os_alloc_mem(NULL, (UCHAR **)&sec_buf, ec_group->prime_len) == - NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), alloc buf for hkey failed...\n", - __func__)); - ret = MLME_UNSPECIFY_FAIL; - goto LabelErr; - } - SAE_BN_BI2BIN_WITH_PAD(secret, sec_buf, &sec_length, - ec_group->prime_len); - - if (os_alloc_mem(NULL, (UCHAR **)&hkey, - ec_group->prime_len + remain_len + 2) == - NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), alloc buf for hkey failed...\n", - __func__)); - ret = MLME_UNSPECIFY_FAIL; - goto LabelErr; - } - - my_pubkey = get_owe_pub_key(owe); - if (my_pubkey == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), get own pub failed, shall not happen...\n", - __func__)); - ret = MLME_UNSPECIFY_FAIL; - goto LabelErr; - } - - owe_calculate_pmkid(owe, my_pubkey->x, peer_pub, type, remain_len, - peer_group, pmkid); - - /* C | A | group */ - if (type == SUBTYPE_ASSOC_REQ) { - /*we are processing ecdh from (re)assoc req*/ - NdisMoveMemory(hkey, peer_pub, remain_len); - SAE_BN_BI2BIN_WITH_PAD(my_pubkey->x, hkey + remain_len, - &hkey_length, ec_group->prime_len); - hkey_length += remain_len; - NdisMoveMemory(hkey + hkey_length, &peer_group, - sizeof(peer_group)); - hkey_length += sizeof(peer_group); - } else if (type == SUBTYPE_ASSOC_RSP) { - SAE_BN_BI2BIN_WITH_PAD(my_pubkey->x, hkey + hkey_length, - &hkey_length, ec_group->prime_len); - NdisMoveMemory(hkey + hkey_length, peer_pub, remain_len); - hkey_length += remain_len; - NdisMoveMemory(hkey + hkey_length, &peer_group, - sizeof(peer_group)); - hkey_length += sizeof(peer_group); - } else { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), parsing wrong type, shall not happen\n", - __func__)); - ret = MLME_UNSPECIFY_FAIL; - goto LabelErr; - } - if (peer_group == ECDH_GROUP_256) { - hash_len = SHA256_DIGEST_SIZE; - RT_HMAC_SHA256(hkey, hkey_length, sec_buf, sec_length, prk, - hash_len); - /*FIXME: is the length of PMK that to use LEN_PMK here is correct?*/ - HKDF_expand_sha256(prk, hash_len, "OWE Key Generation", 18, - sec_config->PMK, LEN_PMK); - } else if (peer_group == ECDH_GROUP_384) { - hash_len = SHA384_DIGEST_SIZE; - RT_HMAC_SHA384(hkey, hkey_length, sec_buf, sec_length, prk, - hash_len); - HKDF_expand_sha384(prk, hash_len, "OWE Key Generation", 18, - sec_config->PMK, LEN_PMK_SHA384); - } - hex_dump("OWE PRK:", prk, hash_len); - hex_dump("OWE PMK:", sec_config->PMK, hash_len); - -LabelErr: - if (sec_buf) - os_free_mem(sec_buf); - if (hkey) - os_free_mem(hkey); - - if (secret) - SAE_BN_FREE(&secret); - if (peer_pub) - os_free_mem(peer_pub); - - return ret; -} - -INT init_owe_group(OWE_INFO *owe, UCHAR group) -{ - BIG_INTEGER_EC_POINT *generator = NULL; - EC_GROUP_INFO *ec_group = get_ecc_group_info(group); - EC_GROUP_INFO_BI *ec_group_bi = get_ecc_group_info_bi(group); - INT ret = 0; - - if (owe->inited == TRUE) - return 1; - - if (ec_group == NULL || ec_group_bi == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), get ec_group failed. shall not happen!\n", - __func__)); - goto err; - } - - if (owe->group_info == NULL) - owe->group_info = (VOID *)ec_group; - if (owe->group_info_bi == NULL) - owe->group_info_bi = (VOID *)ec_group_bi; - - ecc_point_init(&generator); - SAE_BN_COPY(ec_group_bi->gx, &generator->x); - SAE_BN_COPY(ec_group_bi->gy, &generator->y); - SAE_ECC_SET_Z_TO_1(generator); - - owe->generator = (VOID *)generator; - if (ecc_gen_key(ec_group, ec_group_bi, &owe->priv_key, generator, - &owe->pub_key) == 0) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), ecc_gen_key failed...\n", __func__)); - goto err; - } - - owe->inited = TRUE; - - ret = 1; -err: - return ret; -} - -INT build_owe_dh_ie(struct _RTMP_ADAPTER *ad, struct _MAC_TABLE_ENTRY *pentry, - UCHAR *buf, UCHAR group) -{ - OWE_INFO *owe = &pentry->SecConfig.owe; - - EC_GROUP_INFO *ec_group = NULL; - EC_GROUP_INFO_BI *ec_group_bi = NULL; - BIG_INTEGER_EC_POINT *generator = NULL; - BIG_INTEGER_EC_POINT *my_pub_key = NULL; - UCHAR *pub_buf = NULL; - INT extend_length = 0; - UCHAR ie = IE_WLAN_EXTENSION; - UCHAR ie_len = 0; - UCHAR ext_ie = IE_EXTENSION_ID_ECDH; - UINT16 g = group; - UINT pub_buf_length = 0; - - ec_group = (EC_GROUP_INFO *)owe->group_info; - ec_group_bi = (EC_GROUP_INFO_BI *)owe->group_info_bi; - - generator = (BIG_INTEGER_EC_POINT *)owe->generator; - my_pub_key = (BIG_INTEGER_EC_POINT *)owe->pub_key; - - if (os_alloc_mem(NULL, (UCHAR **)&pub_buf, ec_group->prime_len) == - NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_OWE, DBG_LVL_ERROR, - ("==> %s(), ecc_gen_key failed...\n", __func__)); - goto err; - } - SAE_BN_BI2BIN_WITH_PAD(my_pub_key->x, pub_buf, &pub_buf_length, - ec_group->prime_len); - - NdisMoveMemory(buf + extend_length, &ie, sizeof(ie)); - extend_length += 1; - - ie_len = 1 + 2 + ec_group->prime_len; - NdisMoveMemory(buf + extend_length, &ie_len, sizeof(ie_len)); - extend_length += 1; - - NdisMoveMemory(buf + extend_length, &ext_ie, sizeof(ext_ie)); - extend_length += 1; - - NdisMoveMemory(buf + extend_length, &g, sizeof(g)); - extend_length += 2; - - NdisMoveMemory(buf + extend_length, pub_buf, ec_group->prime_len); - extend_length += ec_group->prime_len; - - hex_dump("ECDH parameter:", (UCHAR *)buf, extend_length); - -err: - if (pub_buf) - os_free_mem(pub_buf); - - return extend_length; -} - -INT deinit_owe_group(OWE_INFO *owe) -{ - if (owe->peer_pub_key != NULL) { - ecc_point_free((BIG_INTEGER_EC_POINT **)&owe->peer_pub_key); - owe->peer_pub_key = NULL; - } - if (owe->pub_key != NULL) { - ecc_point_free((BIG_INTEGER_EC_POINT **)&owe->pub_key); - owe->pub_key = NULL; - } - if (owe->generator != NULL) { - ecc_point_free((BIG_INTEGER_EC_POINT **)&owe->generator); - owe->generator = NULL; - } - if (owe->priv_key != NULL) { - SAE_BN_FREE(&owe->priv_key); - owe->priv_key = NULL; - } - - if (owe->pmkid != NULL) { - os_free_mem(owe->pmkid); - owe->pmkid = NULL; - } - - /*TODO: deinit group_info itself. need to discuss with E*/ - owe->group_info = NULL; - owe->group_info_bi = NULL; - - owe->last_try_group = 0; - owe->inited = FALSE; - - return 0; -} - -#ifdef CONFIG_AP_SUPPORT -USHORT owe_pmkid_ecdh_process(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry, - UCHAR *rsn_ie, UCHAR rsn_ie_len, - EXT_ECDH_PARAMETER_IE *ecdh_ie, - UCHAR ecdh_ie_length, PUINT8 pPmkid, - UINT8 *pmkid_count, UCHAR type) -{ - BOOLEAN need_update_grp_info = FALSE; - BOOLEAN need_process_ecdh_ie = FALSE; - INT CacheIdx; /* Key cache */ - USHORT ret = MLME_SUCCESS; - - pPmkid = WPA_ExtractSuiteFromRSNIE(rsn_ie, rsn_ie_len, PMKID_LIST, - pmkid_count); - if (pPmkid != NULL) { - CacheIdx = - RTMPSearchPMKIDCache(&pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, pEntry->Addr); - if ((CacheIdx == -1) || - ((RTMPEqualMemory( - pPmkid, - &pAd->ApCfg.PMKIDCache.BSSIDInfo[CacheIdx].PMKID, - LEN_PMKID)) == 0)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: no OWE PMKID, do normal ECDH procedure\n", - __func__)); - need_process_ecdh_ie = TRUE; - } else { - store_pmkid_cache_in_sec_config(pAd, pEntry, CacheIdx); - need_update_grp_info = TRUE; - } - } else - need_process_ecdh_ie = TRUE; - - if (need_process_ecdh_ie == TRUE || (need_update_grp_info == TRUE)) { - ret = process_ecdh_element(pAd, pEntry, ecdh_ie, ecdh_ie_length, - type, need_update_grp_info); - } - return ret; -} -#endif - -/*parse from bssid field directly*/ -BOOLEAN extract_pair_owe_bss_info(UCHAR *owe_vendor_ie, UCHAR owe_vendor_ie_len, - UCHAR *pair_bssid, UCHAR *pair_ssid, - UCHAR *pair_ssid_len, UCHAR *pair_band, - UCHAR *pair_ch) -{ - BOOLEAN ret = TRUE; - BOOLEAN has_band_ch_info = FALSE; - UCHAR local_ssid_len = *(owe_vendor_ie + MAC_ADDR_LEN); - UCHAR ssid_field_len = sizeof(UCHAR); - UCHAR at_least_length = local_ssid_len + MAC_ADDR_LEN + ssid_field_len; - UCHAR *pos = owe_vendor_ie; - - /*Sanity check length information*/ - if (owe_vendor_ie_len < (local_ssid_len + MAC_ADDR_LEN)) { - ret = FALSE; - goto end; - } else if (owe_vendor_ie_len > at_least_length) - has_band_ch_info = TRUE; /*remain length */ - - NdisMoveMemory(pair_bssid, pos, MAC_ADDR_LEN); - pos = pos + MAC_ADDR_LEN + ssid_field_len; - NdisMoveMemory(pair_ssid, pos, local_ssid_len); - - *pair_ssid_len = local_ssid_len; - - if (has_band_ch_info == TRUE) { - pos = pos + local_ssid_len; /*parse ch info field*/ - *pair_band = *pos; - /*TODO: sanity check of Operating Class and CH???? */ - pos = pos + sizeof(UCHAR); - *pair_ch = *pos; - } - -end: - return ret; -} - -#ifdef APCLI_OWE_SUPPORT -void wext_send_owe_trans_chan_event(PNET_DEV net_dev, UCHAR event_id, - UCHAR *pair_bssid, UCHAR *pair_ssid, - UCHAR *pair_ssid_len, UCHAR *pair_band, - UCHAR *pair_ch) -{ - struct owe_trans_channel_change_info *owe_tran_ch_data = NULL; - struct owe_event *event_data = NULL; - UINT16 buflen = 0; - char *buf = NULL; - - buflen = sizeof(struct owe_event) + - sizeof(struct owe_trans_channel_change_info); - os_alloc_mem(NULL, (UCHAR **)&buf, buflen); - NdisZeroMemory(buf, buflen); - - event_data = (struct owe_event *)buf; - event_data->event_id = event_id; - - event_data->event_len = sizeof(*owe_tran_ch_data); - owe_tran_ch_data = - (struct owe_trans_channel_change_info *)event_data->event_body; - - NdisCopyMemory(owe_tran_ch_data->ifname, RtmpOsGetNetDevName(net_dev), - IFNAMSIZ); - - if (pair_bssid) - memcpy(owe_tran_ch_data->pair_bssid, pair_bssid, 6); - if (pair_ssid) - memcpy(owe_tran_ch_data->pair_ssid, pair_ssid, *pair_ssid_len); - - if (pair_ssid_len) - owe_tran_ch_data->pair_ssid_len = *pair_ssid_len; - - if (pair_band && (*pair_band != 0)) - owe_tran_ch_data->pair_band = *pair_band; - - if (pair_ch && (*pair_ch != 0)) - owe_tran_ch_data->pair_ch = *pair_ch; - - RtmpOSWrielessEventSend(net_dev, RT_WLAN_EVENT_CUSTOM, - OID_802_11_OWE_TRANS_EVENT, NULL, (PUCHAR)buf, - buflen); - os_free_mem(buf); -} - -#endif - -#endif /*CONFIG_OWE_SUPPORT*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/pmf.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/pmf.c deleted file mode 100644 index c3001e5afc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/pmf.c +++ /dev/null @@ -1,1666 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - Abstract: - IEEE P802.11w - -***************************************************************************/ - -#ifdef DOT11W_PMF_SUPPORT - -#include "rt_config.h" - -UCHAR OUI_PMF_BIP_CMAC_128_CIPHER[4] = { 0x00, 0x0F, 0xAC, 0x06 }; -UCHAR OUI_PMF_BIP_CMAC_256_CIPHER[4] = { 0x00, 0x0F, 0xAC, 0x0d }; -UCHAR OUI_PMF_BIP_GMAC_128_CIPHER[4] = { 0x00, 0x0F, 0xAC, 0x0b }; -UCHAR OUI_PMF_BIP_GMAC_256_CIPHER[4] = { 0x00, 0x0F, 0xAC, 0x0c }; - -/* The definition in IEEE 802.11w - Table 7-34 AKM suite selectors */ -UCHAR OUI_PMF_8021X_AKM[4] = { 0x00, 0x0F, 0xAC, 0x05 }; -UCHAR OUI_PMF_PSK_AKM[4] = { 0x00, 0x0F, 0xAC, 0x06 }; - -UCHAR PMF_MMIE_BUFFER[18] = { 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -#define SAQ_IDLE 0 -#define SAQ_RETRY 1 -#define SAQ_SENDING 2 - -VOID PMF_PeerAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ - UCHAR Action = Elem->Msg[LENGTH_802_11 + 1]; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_WARN, - ("[PMF]%s : PMF_PeerAction Action=%d\n", __func__, Action)); - - switch (Action) { - case ACTION_SAQ_REQUEST: - PMF_PeerSAQueryReqAction(pAd, Elem); - break; - - case ACTION_SAQ_RESPONSE: - PMF_PeerSAQueryRspAction(pAd, Elem); - break; - } -} - -VOID PMF_MlmeSAQueryReq(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry) -{ - PUCHAR pOutBuffer = NULL; - HEADER_802_11 SAQReqHdr; - ULONG FrameLen = 0; - UCHAR SACategoryType, SAActionType; - PPMF_CFG pPmfCfg = NULL; - - if (!pEntry) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Entry is NULL\n", __func__)); - return; - } - - pPmfCfg = &pEntry->SecConfig.PmfCfg; - - if (pPmfCfg) { - if ((pPmfCfg->UsePMFConnect == FALSE)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Entry is not PMF capable, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pEntry->Addr))); - return; - } - - if (pPmfCfg->SAQueryStatus == SAQ_SENDING) - return; - - /* Send the SA Query Request */ - os_alloc_mem(NULL, (UCHAR **)&pOutBuffer, - MAX_LEN_OF_MLME_BUFFER); - - if (pOutBuffer == NULL) - return; - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef APCLI_SUPPORT - - if ((pEntry) && IS_ENTRY_APCLI(pEntry)) { - ApCliMgtMacHeaderInit(pAd, &SAQReqHdr, - SUBTYPE_ACTION, 0, - pEntry->Addr, - pEntry->Addr, - pEntry->func_tb_idx); - } else -#endif /* APCLI_SUPPORT */ - { - MgtMacHeaderInit( - pAd, &SAQReqHdr, SUBTYPE_ACTION, 0, - pEntry->Addr, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.bssid, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.bssid); - } - } -#endif /* CONFIG_AP_SUPPORT */ - pPmfCfg->TransactionID++; - SACategoryType = CATEGORY_SA; - SAActionType = ACTION_SAQ_REQUEST; - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &SAQReqHdr, 1, &SACategoryType, 1, - &SAActionType, 2, &pPmfCfg->TransactionID, - END_OF_ARGS); - - if (pPmfCfg->SAQueryStatus == SAQ_IDLE) { - RTMPSetTimer(&pPmfCfg->SAQueryTimer, 1000); /* 1000ms */ - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s -- SAQueryTimer\n", __func__)); - } - - pPmfCfg->SAQueryStatus = SAQ_SENDING; - RTMPSetTimer(&pPmfCfg->SAQueryConfirmTimer, 200); /* 200ms */ - /* transmit the frame */ - MiniportMMRequest(pAd, QID_MGMT, pOutBuffer, FrameLen); - os_free_mem(pOutBuffer); - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s - Send SA Query Request to STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pEntry->Addr))); - } -} - -VOID PMF_PeerSAQueryReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ - UCHAR Action = Elem->Msg[LENGTH_802_11 + 1]; - - if (Action == ACTION_SAQ_REQUEST) { - PMAC_TABLE_ENTRY pEntry; - PFRAME_802_11 pHeader; - USHORT TransactionID; - PUCHAR pOutBuffer = NULL; - HEADER_802_11 SAQRspHdr; - ULONG FrameLen = 0; - UCHAR SACategoryType, SAActionType; - PPMF_CFG pPmfCfg = NULL; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Receive SA Query Request\n", __func__)); - pHeader = (PFRAME_802_11)Elem->Msg; -#ifdef CONFIG_AP_SUPPORT - pEntry = MacTableLookup(pAd, pHeader->Hdr.Addr2); -#endif - - if (!pEntry) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Entry is not found, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pHeader->Hdr.Addr2))); - return; - } - - pPmfCfg = &pEntry->SecConfig.PmfCfg; - - if (pPmfCfg->UsePMFConnect == FALSE) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Entry is not PMF capable, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pHeader->Hdr.Addr2))); - return; - } - - /* Fix PMF 5.3.3.4 un-protect SA Query Req. Need to ignore. */ - if (pHeader->Hdr.FC.Wep == 0) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : un-Protected SA Query Req.!!! Drop it!!, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pHeader->Hdr.Addr2))); - return; - } - - NdisMoveMemory(&TransactionID, &Elem->Msg[LENGTH_802_11 + 2], - sizeof(USHORT)); - /* Response the SA Query */ - os_alloc_mem(NULL, (UCHAR **)&pOutBuffer, - MAX_LEN_OF_MLME_BUFFER); - - if (pOutBuffer == NULL) - return; - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef APCLI_SUPPORT - - if (pEntry && IS_ENTRY_APCLI(pEntry)) { - ApCliMgtMacHeaderInit(pAd, &SAQRspHdr, - SUBTYPE_ACTION, 0, - pHeader->Hdr.Addr2, - pHeader->Hdr.Addr2, - pEntry->func_tb_idx); - } else -#endif /* APCLI_SUPPORT */ - { - MgtMacHeaderInit( - pAd, &SAQRspHdr, SUBTYPE_ACTION, 0, - pHeader->Hdr.Addr2, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.bssid, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.bssid); - } - } -#endif /* CONFIG_AP_SUPPORT */ - SACategoryType = CATEGORY_SA; - SAActionType = ACTION_SAQ_RESPONSE; - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &SAQRspHdr, 1, &SACategoryType, 1, - &SAActionType, 2, &TransactionID, - END_OF_ARGS); - /* transmit the frame */ - MiniportMMRequest(pAd, QID_MGMT, pOutBuffer, FrameLen); - os_free_mem(pOutBuffer); - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s - Send SA Query Response to STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(SAQRspHdr.Addr1))); - } -} - -VOID PMF_PeerSAQueryRspAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) -{ - UCHAR Action = Elem->Msg[LENGTH_802_11 + 1]; - - if (Action == ACTION_SAQ_RESPONSE) { - PMAC_TABLE_ENTRY pEntry; - PFRAME_802_11 pHeader; - USHORT TransactionID; - BOOLEAN Cancelled; - PPMF_CFG pPmfCfg = NULL; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Receive SA Query Response\n", __func__)); - pHeader = (PFRAME_802_11)Elem->Msg; -#ifdef CONFIG_AP_SUPPORT - pEntry = MacTableLookup(pAd, pHeader->Hdr.Addr2); -#endif - - if (!pEntry) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Entry is not found, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pHeader->Hdr.Addr2))); - return; - } - - pPmfCfg = &pEntry->SecConfig.PmfCfg; - - if (pPmfCfg->UsePMFConnect == FALSE) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Entry is not PMF capable, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pHeader->Hdr.Addr2))); - return; - } - - NdisMoveMemory(&TransactionID, &Elem->Msg[LENGTH_802_11 + 2], - sizeof(USHORT)); - - if (pPmfCfg->TransactionID == TransactionID) { - pPmfCfg->SAQueryStatus = SAQ_IDLE; - RTMPCancelTimer(&pPmfCfg->SAQueryTimer, &Cancelled); - RTMPCancelTimer(&pPmfCfg->SAQueryConfirmTimer, - &Cancelled); - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s - Compare TransactionID correctly, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pHeader->Hdr.Addr2))); - } else - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s - Compare TransactionID wrong, STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pHeader->Hdr.Addr2))); - } -} - -VOID PMF_SAQueryTimeOut(IN PVOID SystemSpecific1, IN PVOID FunctionContext, - IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) -{ - MAC_TABLE_ENTRY *pEntry = (MAC_TABLE_ENTRY *)FunctionContext; -#ifdef APCLI_SUPPORT - USHORT ifIndex = 0; -#endif /* APCLI_SUPPORT */ - - if (pEntry) { - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pEntry->pAd; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s - STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pEntry->Addr))); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef APCLI_SUPPORT - - if (IS_ENTRY_APCLI(pEntry)) { - BOOLEAN Cancelled; - MLME_DISASSOC_REQ_STRUCT DisassocReq; - PULONG pCurrState = NULL; - - RTMPCancelTimer( - &pEntry->SecConfig.PmfCfg.SAQueryTimer, - &Cancelled); - RTMPCancelTimer(&pEntry->SecConfig.PmfCfg - .SAQueryConfirmTimer, - &Cancelled); - DisassocParmFill( - pAd, &DisassocReq, - pAd->ApCfg.ApCliTab[pEntry->func_tb_idx] - .MlmeAux.Bssid, - REASON_DISASSOC_STA_LEAVING); - pCurrState = - &pAd->ApCfg - .ApCliTab[pEntry->func_tb_idx] - .CtrlCurrState; - ifIndex = pEntry->func_tb_idx; - *pCurrState = APCLI_CTRL_DEASSOC; - MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, - APCLI_MT2_MLME_DISASSOC_REQ, - sizeof(MLME_DISASSOC_REQ_STRUCT), - &DisassocReq, ifIndex); - RTMP_MLME_HANDLER(pAd); - } else -#endif /* APCLI_SUPPORT */ - mac_entry_delete(pAd, pEntry); - } -#endif /* CONFIG_AP_SUPPORT */ - } -} - -VOID PMF_SAQueryConfirmTimeOut(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3) -{ - MAC_TABLE_ENTRY *pEntry = (MAC_TABLE_ENTRY *)FunctionContext; - - if (pEntry) { - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pEntry->pAd; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s - STA(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, PRINT_MAC(pEntry->Addr))); - pEntry->SecConfig.PmfCfg.SAQueryStatus = SAQ_RETRY; - PMF_MlmeSAQueryReq(pAd, pEntry); - } -} - -VOID PMF_ConstructBIPAad(IN PUCHAR pHdr, OUT UCHAR *aad_hdr) -{ - UINT8 aad_len = 0; - /* Frame control - - Retry bit (bit 11) masked to 0 - PwrMgt bit (bit 12) masked to 0 - MoreData bit (bit 13) masked to 0 */ - aad_hdr[0] = (*pHdr); - aad_hdr[1] = (*(pHdr + 1)) & 0xc7; - aad_len = 2; - /* Append Addr 1, 2 & 3 */ - NdisMoveMemory(&aad_hdr[aad_len], pHdr + 4, 3 * MAC_ADDR_LEN); - aad_len += (3 * MAC_ADDR_LEN); -} - -BOOLEAN PMF_CalculateBIPMIC(IN PRTMP_ADAPTER pAd, IN PUCHAR pAadHdr, - IN PUCHAR pFrameBuf, IN UINT32 FrameLen, - IN PUCHAR pKey, OUT PUCHAR pBipMic) -{ - UCHAR *m_buf; - UINT32 total_len; - UCHAR cmac_output[16]; - UINT mlen = AES_KEY128_LENGTH; - /* Allocate memory for MIC calculation */ - os_alloc_mem(NULL, (PUCHAR *)&m_buf, MAX_MGMT_PKT_LEN); - - if (m_buf == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : out of resource.\n", __func__)); - return FALSE; - } - - /* Initialize the buffer */ - NdisZeroMemory(m_buf, MAX_MGMT_PKT_LEN); - /* Construct the concatenation */ - NdisMoveMemory(m_buf, pAadHdr, LEN_PMF_BIP_AAD_HDR); - total_len = LEN_PMF_BIP_AAD_HDR; - /* Append the Mgmt frame into the concatenation */ - NdisMoveMemory(&m_buf[total_len], pFrameBuf, FrameLen); - total_len += FrameLen; - /* Compute AES-128-CMAC over the concatenation */ - AES_CMAC(m_buf, total_len, pKey, 16, cmac_output, &mlen); - /* Truncate the first 64-bits */ - NdisMoveMemory(pBipMic, cmac_output, LEN_PMF_BIP_MIC); - os_free_mem(m_buf); - return TRUE; -} - -/* - ======================================================================== - - Routine Description: - Derive IGTK randomly - IGTK, a hierarchy consisting of a single key to provide integrity - protection for broadcast and multicast Robust Management frames - - Arguments: - - Return Value: - - Note: - It's defined in IEEE 802.11w 8.5.1.3a - - ======================================================================== -*/ -VOID PMF_DeriveIGTK(IN PRTMP_ADAPTER pAd, OUT UCHAR *output) -{ - INT i; - - for (i = 0; i < LEN_MAX_IGTK; i++) - output[i] = RandomByte(pAd); -} - -/* - ======================================================================== - - Routine Description: - Insert IGTK KDE. The field shall be included in pair-Msg3-WPA2 and - group-Msg1-WPA2. - - Arguments: - - Return Value: - - Note: - - ======================================================================== -*/ -VOID PMF_InsertIGTKKDE(IN PRTMP_ADAPTER pAd, IN INT apidx, IN PUCHAR pFrameBuf, - OUT PULONG pFrameLen) -{ - PPMF_IGTK_KDE igtk_kde_ptr; - UINT8 idx = 0; - PPMF_CFG pPmfCfg = NULL; - UINT8 igtk_len = 0; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - pPmfCfg = &pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PmfCfg; -#endif /* CONFIG_AP_SUPPORT */ - - if (!pPmfCfg) - return; - - /* Decide the IGTK length */ - if (IS_CIPHER_BIP_CMAC128(pPmfCfg->igtk_cipher) || - IS_CIPHER_BIP_GMAC128(pPmfCfg->igtk_cipher)) - igtk_len = LEN_BIP128_IGTK; - else if (IS_CIPHER_BIP_CMAC256(pPmfCfg->igtk_cipher) || - IS_CIPHER_BIP_GMAC256(pPmfCfg->igtk_cipher)) - igtk_len = LEN_BIP256_IGTK; - else { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : unknown igtk cipher %x.\n", __func__, - pPmfCfg->igtk_cipher)); - return; - } - - /* Construct the common KDE format */ - WPA_ConstructKdeHdr(KDE_IGTK, 8 + igtk_len, pFrameBuf); - /* Prepare the IGTK KDE */ - igtk_kde_ptr = (PPMF_IGTK_KDE)(pFrameBuf + LEN_KDE_HDR); - NdisZeroMemory(igtk_kde_ptr, 8 + igtk_len); - /* Bits 0-11 define a value in the range 0-4095. - Bits 12 - 15 are reserved and set to 0 on transmission and ignored on reception. - The IGTK Key ID is either 4 or 5. The remaining Key IDs are reserved. */ - igtk_kde_ptr->KeyID[0] = pPmfCfg->IGTK_KeyIdx; - idx = (pPmfCfg->IGTK_KeyIdx == 5) ? 1 : 0; - /* Fill in the IPN field */ - NdisMoveMemory(igtk_kde_ptr->IPN, &pPmfCfg->IPN[idx][0], LEN_WPA_TSC); - /* Fill uin the IGTK field */ - NdisMoveMemory(igtk_kde_ptr->IGTK, &pPmfCfg->IGTK[idx][0], igtk_len); - /* Update the total output length */ - *pFrameLen = *pFrameLen + LEN_KDE_HDR + 8 + igtk_len; - return; -} - -/* - ======================================================================== - - Routine Description: - Extract IGTK KDE. - - Arguments: - - Return Value: - - Note: - - ======================================================================== -*/ -BOOLEAN PMF_ExtractIGTKKDE(IN PUCHAR pBuf, IN INT buf_len, OUT PUCHAR IGTK, - OUT UCHAR *IGTKLEN, OUT PUCHAR IPN, - OUT UINT8 *IGTK_KeyIdx) -{ - PPMF_IGTK_KDE igtk_kde_ptr; - UINT8 offset = 0; - - igtk_kde_ptr = (PPMF_IGTK_KDE)pBuf; - *IGTK_KeyIdx = igtk_kde_ptr->KeyID[0]; - offset += 2; - NdisMoveMemory(IPN, igtk_kde_ptr->IPN, LEN_WPA_TSC); - offset += LEN_WPA_TSC; - - if ((buf_len - offset) == LEN_BIP128_IGTK) { - NdisMoveMemory(IGTK, igtk_kde_ptr->IGTK, LEN_BIP128_IGTK); - *IGTKLEN = LEN_BIP128_IGTK; - } else if ((buf_len - offset) == LEN_BIP256_IGTK) { - NdisMoveMemory(IGTK, igtk_kde_ptr->IGTK, LEN_BIP256_IGTK); - *IGTKLEN = LEN_BIP256_IGTK; - } else { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : the IGTK length(%d) is invalid\n", __func__, - (buf_len - offset))); - return FALSE; - } - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_TRACE, - ("[PMF]%s : IGTK_Key_ID=%d, IGTK length=%d\n", __func__, - *IGTK_KeyIdx, *IGTKLEN)); - return TRUE; -} - -/* - ======================================================================== - - Routine Description: - Build Group Management Cipher in RSN-IE. - It only shall be called by RTMPMakeRSNIE. - - Arguments: - pAd - pointer to our pAdapter context - ElementID - indicate the WPA1 or WPA2 - apidx - indicate the interface index - - Return Value: - - Note: - - ======================================================================== -*/ -BOOLEAN PMF_MakeRsnIeGMgmtCipher(IN struct _SECURITY_CONFIG *pSecConfig, - IN UCHAR ie_idx, OUT UCHAR *rsn_len) -{ - UINT8 *pBuf = (&pSecConfig->RSNE_Content[ie_idx][0] + (*rsn_len)); - - if (pSecConfig->RSNE_Type[ie_idx] == SEC_RSNIE_WPA2_IE) { - /* default group management cipher suite in an RSNA with - Management Frame Protection enabled. */ - if (pSecConfig->PmfCfg.MFPC == TRUE) { - if (IS_CIPHER_BIP_CMAC128( - pSecConfig->PmfCfg.igtk_cipher)) - NdisMoveMemory(pBuf, - OUI_PMF_BIP_CMAC_128_CIPHER, - LEN_OUI_SUITE); - else if (IS_CIPHER_BIP_CMAC256( - pSecConfig->PmfCfg.igtk_cipher)) - NdisMoveMemory(pBuf, - OUI_PMF_BIP_CMAC_256_CIPHER, - LEN_OUI_SUITE); - else if (IS_CIPHER_BIP_GMAC128( - pSecConfig->PmfCfg.igtk_cipher)) - NdisMoveMemory(pBuf, - OUI_PMF_BIP_GMAC_128_CIPHER, - LEN_OUI_SUITE); - else if (IS_CIPHER_BIP_GMAC256( - pSecConfig->PmfCfg.igtk_cipher)) - NdisMoveMemory(pBuf, - OUI_PMF_BIP_GMAC_256_CIPHER, - LEN_OUI_SUITE); - else { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s: insert fail, IGTK cipher is wrong\n", - __func__)); - return FALSE; - } - (*rsn_len) += sizeof(LEN_OUI_SUITE); - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s: Insert BIP to the group management cipher of RSNIE\n", - __func__)); - } - } - - return TRUE; -} - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -UINT PMF_RsnCapableValidation(IN PUINT8 pRsnie, IN UINT rsnie_len, - IN BOOLEAN self_MFPC, IN BOOLEAN self_MFPR, - IN UINT32 self_igtk_cipher, IN UCHAR end_field, - IN struct _SECURITY_CONFIG *pSecConfigEntry) -{ - UINT8 count; - PUINT8 pBuf = NULL; - BOOLEAN peer_MFPC = FALSE, peer_MFPR = FALSE; - /* Check the peer's MPFC and MPFR - - Refer to Table 8-1a, IEEE 802.11W to check the PMF policy */ - pBuf = WPA_ExtractSuiteFromRSNIE(pRsnie, rsnie_len, RSN_CAP_INFO, - &count); - - if (pBuf == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : Peer's MPFC isn't used.\n", __func__)); - - if (self_MFPR) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : PMF policy violation.\n", - __func__)); - return MLME_ROBUST_MGMT_POLICY_VIOLATION; - } - } else { - RSN_CAPABILITIES RsnCap; - - NdisMoveMemory(&RsnCap, pBuf, sizeof(RSN_CAPABILITIES)); - RsnCap.word = cpu2le16(RsnCap.word); - peer_MFPC = RsnCap.field.MFPC; - peer_MFPR = RsnCap.field.MFPR; - - if ((self_MFPC == TRUE) && (peer_MFPC == FALSE)) { - if ((self_MFPR == TRUE) && (peer_MFPR == FALSE)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : PMF policy violation for case 4\n", - __func__)); - return MLME_ROBUST_MGMT_POLICY_VIOLATION; - } - - if (peer_MFPR == TRUE) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : PMF policy violation for case 7\n", - __func__)); - return MLME_ROBUST_MGMT_POLICY_VIOLATION; - } - } - - if ((self_MFPC == TRUE) && (peer_MFPC == TRUE)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s: PMF Connection\n", __func__)); - pSecConfigEntry->PmfCfg.UsePMFConnect = TRUE; - } - - if (IS_AKM_OWE(pSecConfigEntry->AKMMap)) { - pSecConfigEntry->PmfCfg.MFPC = 1; - pSecConfigEntry->PmfCfg.MFPR = 1; - } - - if (IS_AKM_SAE(pSecConfigEntry->AKMMap) && - (peer_MFPC == FALSE)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s: SAE connection fail due to not PMF connection(peer MFPR = %d, MFPC = %d)\n", - __func__, peer_MFPR, peer_MFPC)); - return MLME_ROBUST_MGMT_POLICY_VIOLATION; - } - } - - /* SHA1 or SHA256 */ - pBuf = WPA_ExtractSuiteFromRSNIE(pRsnie, rsnie_len, AKM_SUITE, &count); - - if ((self_MFPC == TRUE) && (pBuf != NULL)) { - UCHAR OUI_WPA2_1X_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x05 }; - UCHAR OUI_WPA2_PSK_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x06 }; - UCHAR OUI_WPA2_SAE_SHA256[4] = { 0x00, 0x0F, 0xAC, 0x08 }; - - while (count > 0) { - if (RTMPEqualMemory(pBuf, OUI_WPA2_1X_SHA256, 4) || - RTMPEqualMemory(pBuf, OUI_WPA2_PSK_SHA256, 4) || - RTMPEqualMemory(pBuf, OUI_WPA2_SAE_SHA256, 4)) { - pSecConfigEntry->key_deri_alg = - SEC_KEY_DERI_SHA256; - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : SHA256 Support\n", - __func__)); - } - - pBuf += 4; - count--; - } - } - - /* Group Management Cipher Suite */ - if (pSecConfigEntry->PmfCfg.UsePMFConnect == TRUE) { - if (end_field < RSN_FIELD_GROUP_MGMT_CIPHER && - IS_CIPHER_BIP_CMAC128(self_igtk_cipher)) { - pSecConfigEntry->PmfCfg.igtk_cipher = self_igtk_cipher; - return MLME_SUCCESS; - } else if (end_field < RSN_FIELD_GROUP_MGMT_CIPHER) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : The peer Group_mgmt_cipher_suite(default) is mismatch\n", - __func__)); - return MLME_INVALID_SECURITY_POLICY; - } - - pBuf = WPA_ExtractSuiteFromRSNIE(pRsnie, rsnie_len, - G_MGMT_SUITE, &count); - - if (pBuf == NULL) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : The peer RSNIE doesn't include Group_mgmt_cipher_suite\n", - __func__)); - return MLME_INVALID_SECURITY_POLICY; - } - - if (RTMPEqualMemory(pBuf, OUI_PMF_BIP_CMAC_128_CIPHER, - LEN_OUI_SUITE)) - SET_CIPHER_BIP_CMAC128( - pSecConfigEntry->PmfCfg.igtk_cipher); - else if (RTMPEqualMemory(pBuf, OUI_PMF_BIP_CMAC_256_CIPHER, - LEN_OUI_SUITE)) - SET_CIPHER_BIP_CMAC256( - pSecConfigEntry->PmfCfg.igtk_cipher); - else if (RTMPEqualMemory(pBuf, OUI_PMF_BIP_GMAC_128_CIPHER, - LEN_OUI_SUITE)) - SET_CIPHER_BIP_GMAC128( - pSecConfigEntry->PmfCfg.igtk_cipher); - else if (RTMPEqualMemory(pBuf, OUI_PMF_BIP_GMAC_256_CIPHER, - LEN_OUI_SUITE)) - SET_CIPHER_BIP_GMAC256( - pSecConfigEntry->PmfCfg.igtk_cipher); - else { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : unknown peer Group_mgmt_cipher_suite\n", - __func__)); - hex_dump("peer Group_mgmt_cipher_suite", pBuf, - LEN_OUI_SUITE); - return MLME_INVALID_SECURITY_POLICY; - } - - if ((pSecConfigEntry->PmfCfg.igtk_cipher & self_igtk_cipher) == - 0) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : peer Group_mgmt_cipher_suite(%s) is mismatch\n", - __func__, - GetEncryModeStr( - pSecConfigEntry->PmfCfg.igtk_cipher))); - CLEAR_CIPHER(pSecConfigEntry->PmfCfg.igtk_cipher); - return MLME_INVALID_SECURITY_POLICY; - } - } - - return MLME_SUCCESS; -} - -/* -======================================================================== -Routine Description: - Decide if the frame is PMF Robust frame - -Arguments: - pHdr : pointer to the 802.11 header - pFrame : point to frame body. It exclude the 802.11 header - frame_len : the frame length without 802.11 header - -Return Value: - NOT_ROBUST_FRAME - UNICAST_ROBUST_FRAME - GROUP_ROBUST_FRAME - -Note: - -======================================================================== -*/ -INT PMF_RobustFrameClassify(IN PHEADER_802_11 pHdr, IN PUCHAR pFrame, - IN UINT frame_len, IN PUCHAR pData, IN BOOLEAN IsRx) -{ - PMAC_TABLE_ENTRY pEntry = (PMAC_TABLE_ENTRY)pData; - - if ((pHdr->FC.Type != FC_TYPE_MGMT) || (frame_len <= 0)) - return NORMAL_FRAME; - - /* Classify the frame */ - switch (pHdr->FC.SubType) { - case SUBTYPE_DISASSOC: - case SUBTYPE_DEAUTH: - break; - - case SUBTYPE_ACTION: { - if ((IsRx == FALSE) || (IsRx && (pHdr->FC.Wep == 0))) { - UCHAR Category = *pFrame; - - switch (Category) { - /* Refer to IEEE 802.11w Table7-24 */ - case CATEGORY_SPECTRUM: - case CATEGORY_QOS: - case CATEGORY_DLS: - case CATEGORY_BA: - case CATEGORY_RM: - case CATEGORY_FT: - case CATEGORY_SA: - case CATEGORY_PD: - case CATEGORY_VSP: - case CATEGORY_WNM: - break; - - default: - return NORMAL_FRAME; - } - } - - break; - } - - default: - return NORMAL_FRAME; - } - - if (pHdr->Addr1[0] & 0x01) { /* Broadcast frame */ - UINT8 offset_mmie; - - if (frame_len <= (LEN_PMF_MMIE + 2)) - return NOT_ROBUST_GROUP_FRAME; - - /* The offset of MMIE */ - offset_mmie = frame_len - (LEN_PMF_MMIE + 2); - - /* check if this is a group Robust frame */ - if (((*(pFrame + offset_mmie)) == IE_PMF_MMIE) && - ((*(pFrame + offset_mmie + 1)) == LEN_PMF_MMIE)) - return GROUP_ROBUST_FRAME; - else - return NOT_ROBUST_GROUP_FRAME; - } - /* Unicast frame */ - else if (pEntry == NULL) - return NORMAL_FRAME; - else if (pEntry->SecConfig.PmfCfg.UsePMFConnect == FALSE) - return NORMAL_FRAME; - else if ((pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE) && - (pHdr->FC.Wep == 0) && (IsRx == TRUE)) - return NOT_ROBUST_UNICAST_FRAME; - else if (((IsRx == TRUE) && (pHdr->FC.Wep == 1)) || (IsRx == FALSE)) - return UNICAST_ROBUST_FRAME; - - return ERROR_FRAME; -} - -#ifdef SOFT_ENCRYPT -INT PMF_EncryptUniRobustFrameAction(IN PRTMP_ADAPTER pAd, IN PUCHAR pMgmtFrame, - IN UINT mgmt_len) -{ - PMAC_TABLE_ENTRY pEntry = NULL; - PHEADER_802_11 pHdr = (PHEADER_802_11)pMgmtFrame; - INT data_len; - PUCHAR pBuf; - INT Status; - /* Check if the length is valid */ - data_len = mgmt_len - (LENGTH_802_11 + LEN_CCMP_HDR + LEN_CCMP_MIC); - - if (data_len <= 0) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : The payload length(%d) is invalid\n", __func__, - data_len)); - return PMF_UNICAST_ENCRYPT_FAILURE; - } - - /* Look up the entry through Address 1 of 802.11 header */ - pEntry = MacTableLookup(pAd, pHdr->Addr1); - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : The entry doesn't exist\n", __func__)); - return PMF_UNICAST_ENCRYPT_FAILURE; - } - - /* check the PMF capable for this entry */ - if (pEntry->SecConfig.PmfCfg.UsePMFConnect == FALSE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : the entry no PMF capable !\n", __func__)); - return PMF_UNICAST_ENCRYPT_FAILURE; - } - - /* Allocate a buffer for building PMF packet */ - Status = MlmeAllocateMemory(pAd, &pBuf); - - if (Status != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : allocate PMF buffer fail!\n", __func__)); - return PMF_UNICAST_ENCRYPT_FAILURE; - } - - /* Construct and insert 8-bytes CCMP header to MPDU header */ - RTMPConstructCCMPHdr(0, pEntry->PmfTxTsc, pBuf); - NdisMoveMemory(pBuf + LEN_CCMP_HDR, &pHdr->Octet[0], data_len); - /* Encrypt the MPDU data by software */ - RTMPSoftEncryptCCMP(pAd, (PUCHAR)pHdr, pEntry->PmfTxTsc, - pEntry->PairwiseKey.Key, pBuf + LEN_CCMP_HDR, - data_len); - data_len += (LEN_CCMP_HDR + LEN_CCMP_MIC); - NdisMoveMemory(&pHdr->Octet[0], pBuf, data_len); - /* TSC increment for next transmittion */ - INC_TX_TSC(pEntry->PmfTxTsc, LEN_WPA_TSC); - MlmeFreeMemory(pBuf); - return PMF_STATUS_SUCCESS; -} - -INT PMF_DecryptUniRobustFrameAction(IN PRTMP_ADAPTER pAd, - INOUT PUCHAR pMgmtFrame, IN UINT mgmt_len) -{ - PMAC_TABLE_ENTRY pEntry = NULL; - PHEADER_802_11 pHeader = (PHEADER_802_11)pMgmtFrame; - PUCHAR pDate = pMgmtFrame + LENGTH_802_11; - UINT16 data_len = mgmt_len - LENGTH_802_11; - - /* Check if the length is valid */ - if (data_len <= LEN_CCMP_HDR + LEN_CCMP_MIC) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : The payload length(%d) is invalid\n", __func__, - data_len)); - return PMF_UNICAST_DECRYPT_FAILURE; - } - - /* Look up the entry through Address 2 of 802.11 header */ - pEntry = MacTableLookup(pAd, pHeader->Addr2); - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : the entry doesn't exist !\n", __func__)); - return PMF_STATUS_SUCCESS; - } - - /* check the PMF capable for this entry */ - if (pEntry->SecConfig.PmfCfg.UsePMFConnect == FALSE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : the entry no PMF capable !\n", __func__)); - return PMF_UNICAST_DECRYPT_FAILURE; - } - -#ifdef RT_BIG_ENDIAN - - if ((pHeader->FC.SubType == SUBTYPE_DISASSOC) || - (pHeader->FC.SubType == SUBTYPE_DEAUTH)) - *(USHORT *)pDate = - cpu2le16(*(USHORT *)pDate); /* swap reason code */ - -#endif /* RT_BIG_ENDIAN */ - - if (RTMPSoftDecryptCCMP(pAd, pMgmtFrame, &pEntry->PairwiseKey, pDate, - &data_len) == FALSE) - return PMF_UNICAST_DECRYPT_FAILURE; - - return PMF_STATUS_SUCCESS; -} - -INT PMF_EncapBIPAction(IN PRTMP_ADAPTER pAd, IN PUCHAR pMgmtFrame, - IN UINT mgmt_len) -{ - PHEADER_802_11 pHdr = (PHEADER_802_11)pMgmtFrame; - PPMF_CFG pPmfCfg = NULL; - PPMF_MMIE pMMIE; - INT idx = 0; - PUCHAR pKey = NULL; - UCHAR aad_hdr[LEN_PMF_BIP_AAD_HDR]; - UCHAR BIP_MIC[LEN_PMF_BIP_MIC]; - PUCHAR pFrameBody = &pHdr->Octet[0]; - UINT32 body_len = mgmt_len - LENGTH_802_11; -#ifdef RT_BIG_ENDIAN - PUCHAR pMacHdr = NULL; - BOOLEAN bSwaped = FALSE; -#endif - - /* Sanity check the total frame body length */ - if (body_len <= (2 + LEN_PMF_MMIE)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : the total length(%d) is too short\n", - __func__, body_len)); - return PMF_ENCAP_BIP_FAILURE; - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - pPmfCfg = &pAd->ApCfg.MBSSID[MAIN_MBSSID].PmfCfg; - } -#endif /* CONFIG_AP_SUPPORT */ - - /* Sanity check */ - if (pPmfCfg == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : No related PMF configuation\n", __func__)); - return PMF_ENCAP_BIP_FAILURE; - } - - if (pPmfCfg && pPmfCfg->MFPC == FALSE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : PMF is disabled\n", __func__)); - return PMF_ENCAP_BIP_FAILURE; - } - - /* Pointer to the position of MMIE */ - pMMIE = (PPMF_MMIE)(pMgmtFrame + (mgmt_len - LEN_PMF_MMIE)); - - /* Select the IGTK currently active for transmission of frames to - the intended group of recipients and construct the MMIE (see 7.3.2.55) - with the MIC field masked to zero and the KeyID field set to the - corresponding IGTK KeyID value. */ - if (pPmfCfg->IGTK_KeyIdx == 5) - idx = 1; - - pKey = &pPmfCfg->IGTK[idx][0]; - NdisZeroMemory(pMMIE, LEN_PMF_MMIE); - /* Bits 0-11 define a value in the range 0-4095. - Bits 12 - 15 are reserved and set to 0 on transmission and ignored on reception. - The IGTK Key ID is either 4 or 5. The remaining Key IDs are reserved. */ - pMMIE->KeyID[0] = pPmfCfg->IGTK_KeyIdx; - NdisMoveMemory(pMMIE->IPN, &pPmfCfg->IPN[idx][0], LEN_WPA_TSC); - /* The transmitter shall insert a monotonically increasing non-neg- - ative integer into the MMIE IPN field. */ - INC_TX_TSC(pPmfCfg->IPN[idx], LEN_WPA_TSC); - /* Compute AAD */ -#ifdef RT_BIG_ENDIAN - - if (pHdr->FC.SubType == SUBTYPE_DISASSOC || - pHdr->FC.SubType == SUBTYPE_DEAUTH) { - pMacHdr = (PUCHAR)pHdr; - *(USHORT *)pMacHdr = - cpu2le16(*(USHORT *)pMacHdr); /* swap frame-control */ - pMacHdr += sizeof(HEADER_802_11); - *(USHORT *)pMacHdr = - cpu2le16(*(USHORT *)pMacHdr); /* swap reason code */ - bSwaped = TRUE; - } - -#endif - PMF_ConstructBIPAad((PUCHAR)pHdr, aad_hdr); - /* Calculate BIP MIC */ - PMF_CalculateBIPMIC(pAd, aad_hdr, pFrameBody, body_len, pKey, BIP_MIC); - /* Fill into the MMIE MIC field */ - NdisMoveMemory(pMMIE->MIC, BIP_MIC, LEN_PMF_BIP_MIC); -#ifdef RT_BIG_ENDIAN - - if (bSwaped) { - pMacHdr = (PUCHAR)pHdr; - *(USHORT *)pMacHdr = cpu2le16(*(USHORT *)pMacHdr); - pMacHdr += sizeof(HEADER_802_11); - *(USHORT *)pMacHdr = cpu2le16(*(USHORT *)pMacHdr); - bSwaped = TRUE; - } - -#endif - /* BIP doesn't need encrypt frame */ - pHdr->FC.Wep = 0; - return PMF_STATUS_SUCCESS; -} - -INT PMF_ExtractBIPAction(IN PRTMP_ADAPTER pAd, INOUT PUCHAR pMgmtFrame, - IN UINT mgmt_len) -{ - PPMF_CFG pPmfCfg = NULL; - PMAC_TABLE_ENTRY pEntry = NULL; - PHEADER_802_11 pHeader = (PHEADER_802_11)pMgmtFrame; - PPMF_MMIE pMMIE; - INT idx = 0; - PUCHAR pKey = NULL; - UCHAR aad_hdr[LEN_PMF_BIP_AAD_HDR]; - UCHAR rcvd_mic[LEN_PMF_BIP_MIC]; - UCHAR cal_mic[LEN_PMF_BIP_MIC]; - UINT32 body_len = mgmt_len - LENGTH_802_11; - - /* Sanity check the total frame body length */ - if (body_len <= (2 + LEN_PMF_MMIE)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : the total length(%d) is too short\n", __func__, - body_len)); - return PMF_EXTRACT_BIP_FAILURE; - } - - /* Look up the entry through Address 2 of 802.11 header */ - pEntry = MacTableLookup(pAd, pHeader->Addr2); - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : the entry doesn't exist !\n", __func__)); - return PMF_STATUS_SUCCESS; - } - - /* check the PMF capable for this entry */ - if (pEntry->SecConfig.PmfCfg.UsePMFConnect == FALSE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : the entry no PMF capable !\n", __func__)); - return PMF_EXTRACT_BIP_FAILURE; - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - /* MT7615 only need H/W Decrypt, SOFT_ENCRYPT of BIP is not need */ -#ifdef APCLI_SUPPORT - if (IS_ENTRY_APCLI(pEntry)) - pPmfCfg = &pAd->ApCfg.ApCliTab[pEntry->func_tb_idx] - .wdev.SecConfig.PmfCfg; - else -#endif /* APCLI_SUPPORT */ - pPmfCfg = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.SecConfig.PmfCfg; - } -#endif /* CONFIG_AP_SUPPORT // */ - /* Pointer to the position of MMIE */ - pMMIE = (PPMF_MMIE)(pMgmtFrame + (mgmt_len - LEN_PMF_MMIE)); - - /* Select the IGTK currently active for transmission of frames to - the intended group of recipients and construct the MMIE (see 7.3.2.55) - with the MIC field masked to zero and the KeyID field set to the - corresponding IGTK KeyID value. */ - if (pMMIE->KeyID[0] == 5) - idx = 1; - - pKey = &pPmfCfg->IGTK[idx][0]; - /* store the MIC value of the received frame */ - NdisMoveMemory(rcvd_mic, pMMIE->MIC, LEN_PMF_BIP_MIC); - NdisZeroMemory(pMMIE->MIC, LEN_PMF_BIP_MIC); - /* Compute AAD */ - PMF_ConstructBIPAad((PUCHAR)pMgmtFrame, aad_hdr); - /* Calculate BIP MIC */ - PMF_CalculateBIPMIC(pAd, aad_hdr, pMgmtFrame + LENGTH_802_11, body_len, - pKey, cal_mic); - - if (!NdisEqualMemory(rcvd_mic, cal_mic, LEN_PMF_BIP_MIC)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s : MIC Different !\n", __func__)); - return PMF_EXTRACT_BIP_FAILURE; - } - - return PMF_STATUS_SUCCESS; -} -#endif /* SOFT_ENCRYPT */ - -VOID PMF_AddMMIE(IN PMF_CFG *pPmfCfg, IN PUCHAR pMgmtFrame, IN UINT mgmt_len) -{ - PHEADER_802_11 pHdr = (PHEADER_802_11)pMgmtFrame; - PPMF_MMIE pMMIE; - INT idx = 0; - UINT32 body_len = mgmt_len - LENGTH_802_11; - - /* Sanity check the total frame body length */ - if (body_len <= (2 + LEN_PMF_MMIE)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : the total length(%d) is too short\n", - __func__, body_len)); - return; - } - - /* Sanity check */ - if (pPmfCfg == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : No related PMF configuation\n", __func__)); - return; - } - - if (pPmfCfg && pPmfCfg->MFPC == FALSE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s : PMF is disabled\n", __func__)); - return; - } - - /* Pointer to the position of MMIE */ - pMMIE = (PPMF_MMIE)(pMgmtFrame + (mgmt_len - LEN_PMF_MMIE)); - - /* Select the IGTK currently active for transmission of frames to - the intended group of recipients and construct the MMIE (see 7.3.2.55) - with the MIC field masked to zero and the KeyID field set to the - corresponding IGTK KeyID value. */ - if (pPmfCfg->IGTK_KeyIdx == 5) - idx = 1; - - os_zero_mem((char *)pMMIE, LEN_PMF_MMIE); - /* Bits 0-11 define a value in the range 0-4095. - Bits 12 - 15 are reserved and set to 0 on transmission and ignored on reception. - The IGTK Key ID is either 4 or 5. The remaining Key IDs are reserved. */ - pMMIE->KeyID[0] = pPmfCfg->IGTK_KeyIdx; - os_move_mem(pMMIE->IPN, &pPmfCfg->IPN[idx][0], LEN_WPA_TSC); - /* The transmitter shall insert a monotonically increasing non-neg- - ative integer into the MMIE IPN field. */ - INC_TX_TSC(pPmfCfg->IPN[idx], LEN_WPA_TSC); - /* BIP doesn't need encrypt frame */ - pHdr->FC.Wep = 0; - return; -} - -BOOLEAN PMF_PerformTxFrameAction(IN PRTMP_ADAPTER pAd, - IN PHEADER_802_11 pHeader_802_11, - IN UINT SrcBufLen, IN UINT8 tx_hw_hdr_len, - OUT UCHAR *prot) -{ - if (IS_HIF_TYPE(pAd, HIF_MT)) { - UINT32 ret = 0; - MAC_TABLE_ENTRY *pEntry = NULL; -#ifdef CONFIG_AP_SUPPORT - pEntry = MacTableLookup(pAd, pHeader_802_11->Addr1); -#endif - *prot = 0; - - if (pEntry && pAd->MacTab.tr_entry[pEntry->wcid].PortSecured != - WPA_802_1X_PORT_SECURED) - return TRUE; - - ret = PMF_RobustFrameClassify( - (PHEADER_802_11)pHeader_802_11, - (PUCHAR)(((PUCHAR)pHeader_802_11) + LENGTH_802_11), - (SrcBufLen - LENGTH_802_11 - tx_hw_hdr_len), - (PUCHAR)pEntry, FALSE); - - if (ret == UNICAST_ROBUST_FRAME) { - *prot = 1; - pHeader_802_11->FC.Wep = 1; - } else if (ret == GROUP_ROBUST_FRAME) { -#ifdef SOFT_ENCRYPT - ret = PMF_EncapBIPAction(pAd, (UCHAR *)pHeader_802_11, - (SrcBufLen - tx_hw_hdr_len)); - - if (ret == PMF_STATUS_SUCCESS) - *prot = 3; - else - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, PMF GROUP ROBUST Encap fail, ret=%d\n", - __func__, ret)); - -#else - PMF_CFG *pPmfCfg = NULL; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - struct wifi_dev *wdev = NULL; - - if (pHeader_802_11->Addr1[0] & - 0x01) /* Broadcast frame */ - wdev = wdev_search_by_address( - pAd, pHeader_802_11->Addr2); - else if (pEntry != NULL) - wdev = &pAd->ApCfg.MBSSID[pEntry->apidx] - .wdev; - - if (wdev) - pPmfCfg = &wdev->SecConfig.PmfCfg; - else - pPmfCfg = - &pAd->ApCfg.MBSSID[MAIN_MBSSID] - .wdev.SecConfig.PmfCfg; - } -#endif /* CONFIG_AP_SUPPORT */ - PMF_AddMMIE(pPmfCfg, (UCHAR *)pHeader_802_11, - (SrcBufLen - tx_hw_hdr_len)); - if (pPmfCfg == NULL || - IS_CIPHER_BIP_CMAC128(pPmfCfg->igtk_cipher)) - *prot = 2; - else - *prot = 3; -#endif /* SOFT_ENCRYPT */ - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s, PMF GROUP ROBUST\n", __func__)); - } - } - - return TRUE; -} - -/* -======================================================================== -Routine Description: - -Arguments: - -Return Value: - -Note: - -======================================================================== -*/ -BOOLEAN PMF_PerformRxFrameAction(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - INT FrameType = NORMAL_FRAME; - PUCHAR pMgmtFrame; - UINT mgmt_len; - HEADER_802_11 Header; - PMAC_TABLE_ENTRY pEntry = NULL; - FRAME_CONTROL *FC = (FRAME_CONTROL *)pRxBlk->FC; - - pMgmtFrame = (PUCHAR)FC; - mgmt_len = pRxBlk->MPDUtotalByteCnt; - - if (VALID_UCAST_ENTRY_WCID(pAd, pRxBlk->wcid)) - pEntry = &pAd->MacTab.Content[pRxBlk->wcid]; - - if ((pRxBlk->Addr1[0] & 0x01) && (FC->Type == FC_TYPE_MGMT) && - ((FC->SubType == SUBTYPE_DISASSOC) || - (FC->SubType == SUBTYPE_DEAUTH))) { -#ifdef CONFIG_AP_SUPPORT - /* MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, ("[PMF]%s: Bcast FRAME, FC->SubType=%d, pRxBlk->pRxInfo->U2M=%d, pRxBlk->pRxInfo->disasso=%d, pRxBlk->pRxInfo->Decrypted=%d, pRxBlk->wcid=%d\n", */ - /* __FUNCTION__, FC->SubType, pRxBlk->pRxInfo->U2M, pRxBlk->pRxInfo->disasso, pRxBlk->pRxInfo->Decrypted,pRxBlk->wcid)); */ - pEntry = MacTableLookup(pAd, pRxBlk->Addr2); -#endif - - if (!pEntry) - return TRUE; - else { - if (pEntry->SecConfig.PmfCfg.UsePMFConnect == FALSE) - return TRUE; - } - } - -#ifdef MT_MAC - - if ((IS_HIF_TYPE(pAd, HIF_MT)) && (pEntry != NULL) && - (pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE) && - (FC->Type == FC_TYPE_MGMT) && (!(pRxBlk->Addr1[0] & 0x01)) && - ((FC->SubType == SUBTYPE_DISASSOC) || - (FC->SubType == SUBTYPE_DEAUTH) || - (FC->SubType == SUBTYPE_ACTION))) { - if (pRxBlk->CipherMis) { - NdisZeroMemory(&Header, sizeof(HEADER_802_11)); - NdisMoveMemory(&Header.Addr1, &pRxBlk->Addr1[0], 6); - NdisMoveMemory(&Header.FC, pRxBlk->FC, - sizeof(FRAME_CONTROL)); - FrameType = PMF_RobustFrameClassify( - &Header, (PUCHAR)(pMgmtFrame + LENGTH_802_11), - (mgmt_len - LENGTH_802_11), (PUCHAR)pEntry, - TRUE); - } - } else -#endif - { - NdisZeroMemory(&Header, sizeof(HEADER_802_11)); - NdisMoveMemory(&Header.Addr1, &pRxBlk->Addr1[0], 6); - NdisMoveMemory(&Header.FC, pRxBlk->FC, sizeof(FRAME_CONTROL)); - FrameType = PMF_RobustFrameClassify( - &Header, (PUCHAR)(pMgmtFrame + LENGTH_802_11), - (mgmt_len - LENGTH_802_11), (PUCHAR)pEntry, TRUE); - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - switch (FrameType) { - case ERROR_FRAME: - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s: ERROR FRAME, FC->SubType=%d\n", - __func__, FC->SubType)); - return FALSE; - - case NORMAL_FRAME: - break; - - case NOT_ROBUST_GROUP_FRAME: -#ifdef APCLI_SUPPORT - - /* H/W Decrypt case won't fall into below case */ - if ((pEntry) && IS_ENTRY_APCLI(pEntry)) { - if (pEntry->SecConfig.PmfCfg.UsePMFConnect == - TRUE) - return FALSE; - } - -#endif /* APCLI_SUPPORT */ - break; - - case NOT_ROBUST_UNICAST_FRAME: -#ifdef APCLI_SUPPORT - if ((pEntry) && IS_ENTRY_APCLI(pEntry)) { - if (((Header.FC.SubType == SUBTYPE_DISASSOC) || - (Header.FC.SubType == SUBTYPE_DEAUTH)) && - (pEntry->SecConfig.PmfCfg.UsePMFConnect == - TRUE)) { - PMF_MlmeSAQueryReq(pAd, pEntry); - return FALSE; - } - } - -#endif /* APCLI_SUPPORT */ - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("[PMF]%s: ERROR FRAME, FC->SubType=%d\n", - __func__, FC->SubType)); - return FALSE; - - case UNICAST_ROBUST_FRAME: { -#ifdef SOFT_ENCRYPT - - if (PMF_DecryptUniRobustFrameAction(pAd, pMgmtFrame, - mgmt_len) != - PMF_STATUS_SUCCESS) - return FALSE; - - pRxBlk->MPDUtotalByteCnt -= - (LEN_CCMP_HDR + LEN_CCMP_MIC); -#endif /* SOFT_ENCRYPT */ - break; - } - - case GROUP_ROBUST_FRAME: { -#ifdef SOFT_ENCRYPT - - if (PMF_ExtractBIPAction(pAd, pMgmtFrame, mgmt_len) != - PMF_STATUS_SUCCESS) - return FALSE; - -#endif /* SOFT_ENCRYPT */ - /* MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, ("[PMF]%s: GROUP_ROBUST_FRAME, FC->SubType=%d\n", __FUNCTION__, FC->SubType)); */ - pRxBlk->MPDUtotalByteCnt -= (2 + LEN_PMF_MMIE); - break; - } - } - } -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -/* -======================================================================== -Routine Description: - Protection Management Frame Capable - Protection Management Frame Required - -Arguments: - -Return Value: - -Note: -RSNA policy selection in a ESS: IEEE P802.11w Table 8-1a -RSNA policy selection in an IBSS: IEEE P802.11w Table 8-1b -======================================================================== -*/ -void rtmp_read_pmf_parameters_from_file(IN PRTMP_ADAPTER pAd, - IN RTMP_STRING *tmpbuf, - IN RTMP_STRING *pBuffer){ -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd){ INT apidx; -POS_COOKIE pObj; -RTMP_STRING *macptr; - -pObj = (POS_COOKIE)pAd->OS_Cookie; - -for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PmfCfg.Desired_MFPC = FALSE; - pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PmfCfg.Desired_MFPR = FALSE; - pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PmfCfg.Desired_PMFSHA256 = - FALSE; -} - -/* Protection Management Frame Capable */ -if (RTMPGetKeyParameter("PMFMFPC", tmpbuf, 32, pBuffer, TRUE)) { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - pObj->ioctl_if = apidx; - Set_PMFMFPC_Proc(pAd, macptr); - } -} - -/* Protection Management Frame Required */ -if (RTMPGetKeyParameter("PMFMFPR", tmpbuf, 32, pBuffer, TRUE)) { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - pObj->ioctl_if = apidx; - Set_PMFMFPR_Proc(pAd, macptr); - } -} - -if (RTMPGetKeyParameter("PMFSHA256", tmpbuf, 32, pBuffer, TRUE)) { - for (apidx = 0, macptr = rstrtok(tmpbuf, ";"); - (macptr && apidx < pAd->ApCfg.BssidNum); - macptr = rstrtok(NULL, ";"), apidx++) { - pObj->ioctl_if = apidx; - Set_PMFSHA256_Proc(pAd, macptr); - } -} -} -#endif /* CONFIG_AP_SUPPORT */ -} - -/* -======================================================================== -Routine Description: Protection Management Frame Capable - -Arguments: - -Return Value: - -Note: -RSNA policy selection in a ESS: IEEE P802.11w Table 8-1a -RSNA policy selection in an IBSS: IEEE P802.11w Table 8-1b -======================================================================== -*/ -INT Set_PMFMFPC_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - if (strlen(arg) == 0) - return FALSE; - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - POS_COOKIE pObj; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (os_str_tol(arg, 0, 10)) - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_MFPC = TRUE; - else - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_MFPC = FALSE; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_TRACE, - ("[PMF]%s:: apidx=%d, Desired MFPC=%d\n", __func__, - pObj->ioctl_if, - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_MFPC)); - } -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -/* -======================================================================== -Routine Description: Protection Management Frame Required - -Arguments: - -Return Value: - -Note: -RSNA policy selection in a ESS: IEEE P802.11w Table 8-1a -RSNA policy selection in an IBSS: IEEE P802.11w Table 8-1b -======================================================================== -*/ -INT Set_PMFMFPR_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - if (strlen(arg) == 0) - return FALSE; - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - POS_COOKIE pObj; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (os_str_tol(arg, 0, 10)) - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_MFPR = TRUE; - else - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_MFPR = FALSE; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_TRACE, - ("[PMF]%s:: apidx=%d, Desired MFPR=%d\n", __func__, - pObj->ioctl_if, - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_MFPR)); - } -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -INT Set_PMFSHA256_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - if (strlen(arg) == 0) - return FALSE; - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - POS_COOKIE pObj; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if (os_str_tol(arg, 0, 10)) - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_PMFSHA256 = TRUE; - else - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_PMFSHA256 = - FALSE; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_TRACE, - ("[PMF]%s:: apidx=%d, Desired PMFSHA256=%d\n", - __func__, pObj->ioctl_if, - pAd->ApCfg.MBSSID[pObj->ioctl_if] - .wdev.SecConfig.PmfCfg.Desired_PMFSHA256)); - } -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -INT Set_PMFSA_Q_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ -#ifdef CONFIG_AP_SUPPORT - STA_TR_ENTRY *tr_entry = NULL; - MAC_TABLE_ENTRY *pMacEntry = NULL; - CHAR Wcid = os_str_tol(arg, 0, 10); - - if (!VALID_UCAST_ENTRY_WCID(pAd, Wcid)) - return FALSE; - - pMacEntry = &pAd->MacTab.Content[Wcid]; - tr_entry = &pAd->MacTab.tr_entry[Wcid]; - if ((pMacEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE) && - (tr_entry->PortSecured != WPA_802_1X_PORT_SECURED)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s: PMF Connection IGNORE THIS PKT DUE TO NOT IN PORTSECURED\n", - __func__)); - return FALSE; - } - - if (pMacEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_PMF, DBG_LVL_ERROR, - ("%s: PMF CONNECTION BUT RECV WEP=0 ACTION, ACTIVE THE SA QUERY\n", - __func__)); - PMF_MlmeSAQueryReq(pAd, pMacEntry); - return TRUE; - } -#endif /* CONFIG_AP_SUPPORT */ - return FALSE; -} - -#endif /* DOT11W_PMF_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/sae.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/sae.c deleted file mode 100644 index e1a9d646d3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/security/sae.c +++ /dev/null @@ -1,3504 +0,0 @@ -#ifdef DOT11_SAE_SUPPORT - -#include "rt_config.h" -#include "security/ecc.h" - -BUILD_TIMER_FUNCTION(sae_auth_retransmit); - -const SAE_GROUP_OP ecc_group_op = { - .sae_group_init = sae_group_init_ecc, - .sae_group_deinit = sae_group_deinit_ecc, - .sae_cn_confirm = sae_cn_confirm_ecc, - .sae_parse_commit_element = sae_parse_commit_element_ecc, - .sae_derive_commit_element = sae_derive_commit_element_ecc, - .sae_derive_pwe = sae_derive_pwe_ecc, - .sae_derive_pwe_pt = sae_derive_pwe_pt_ecc, - .sae_derive_k = sae_derive_k_ecc, - .sae_reflection_check = sae_reflection_check_ecc, -}; - -const SAE_GROUP_OP ffc_group_op = { - .sae_group_init = sae_group_init_ffc, - .sae_group_deinit = sae_group_deinit_ffc, - .sae_cn_confirm = sae_cn_confirm_ffc, - .sae_parse_commit_element = sae_parse_commit_element_ffc, - .sae_derive_commit_element = sae_derive_commit_element_ffc, - .sae_derive_pwe = sae_derive_pwe_ffc, - .sae_derive_k = sae_derive_k_ffc, - .sae_reflection_check = sae_reflection_check_ffc, -}; - -static DH_GROUP_INFO dh_groups[] = { - DH_GROUP(15, 1), -}; - -static DH_GROUP_INFO_BI dh_groups_bi[] = { - DH_GROUP_BI(15, 1), -}; - -#ifdef BI_POOL_DBG -UINT32 sae_expected_cnt[20]; /* 0~12 is used */ -#endif - -int SAE_DEBUG_LEVEL = DBG_LVL_LOUD; -int SAE_DEBUG_LEVEL2 = DBG_LVL_TRACE; -int SAE_COST_TIME_DBG_LVL = DBG_LVL_INFO; - -UCHAR sae_support_group_list[] = { 19, 20 }; - -static UCHAR delete_all_removable_sae_instance(IN SAE_CFG *pSaeCfg) -{ - UINT32 i; - SAE_INSTANCE *pSaeIns = NULL; - UINT32 del_ins_cnt = 0; - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - pSaeIns = &pSaeCfg->sae_ins[i]; - - if (pSaeCfg->sae_ins[i].valid == FALSE) - continue; - - if (pSaeIns->same_mac_ins) { - if (pSaeIns->same_mac_ins->valid == TRUE) { - delete_sae_instance(pSaeIns->same_mac_ins); - del_ins_cnt++; - } - pSaeIns->same_mac_ins = NULL; - } - - if (pSaeIns->removable == TRUE) { - delete_sae_instance(pSaeIns); - del_ins_cnt++; - } - } - - if (del_ins_cnt != 0) - return TRUE; - else - return FALSE; -} - -INT show_sae_info_proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 i; - SAE_CFG *pSaeCfg = &pAd->SaeCfg; - SAE_INSTANCE *pSaeIns = NULL; - UINT32 input = 0; - - if (arg != NULL) - input = os_str_toul(arg, 0, 10); - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("k iteration varieble: %d, anti clogging th: %d\n", - pSaeCfg->k_iteration_var, - pSaeCfg->sae_anti_clogging_threshold)); - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("total ins: %d\n", pSaeCfg->total_ins)); - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - if (pSaeCfg->sae_ins[i].valid == FALSE && input != 1) - continue; - - pSaeIns = &pSaeCfg->sae_ins[i]; - - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("idx:%d, v/r:%d/%d, OM=%02x:%02x:%02x:%02x:%02x:%02x, PM=%02x:%02x:%02x:%02x:%02x:%02x\n", - i, pSaeIns->valid, pSaeIns->removable, - PRINT_MAC(pSaeIns->own_mac), - PRINT_MAC(pSaeIns->peer_mac))); - - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("\tstate:%d, group:%d, sync:%d, sc:0x%x, last_peer_sc:0x%x, same_mac_ins=%d, timer_state=%d\n", - pSaeIns->state, pSaeIns->group, pSaeIns->sync, - pSaeIns->send_confirm, pSaeIns->last_peer_sc, - (pSaeIns->same_mac_ins != NULL), - pSaeIns->sae_retry_timer.State)); - - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("\th2e_connect=%d, is_pwd_id_only = %d, removable = %d\n", - pSaeIns->h2e_connect, pSaeIns->is_pwd_id_only, - pSaeIns->removable)); - - if (pSaeIns->valid && pSaeIns->pParentSaeCfg == NULL) - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("\t[error]pSaeIns->pParentSaeCfg is NULL\n")); - if (pSaeIns->valid && pSaeIns->psk == NULL) - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("\t[error]pSaeIns->psk is NULL\n")); - } - - return TRUE; -} - -static VOID hkdf_extract(IN const UINT8 key[], IN UINT key_len, - IN const UINT8 msg[], IN UINT msg_len, OUT UINT8 mac[], - IN UINT hash_len) -{ - if (hash_len == SHA256_DIGEST_SIZE) - RT_HMAC_SHA256(key, key_len, msg, msg_len, mac, hash_len); - else if (hash_len == SHA384_DIGEST_SIZE) - RT_HMAC_SHA384(key, key_len, msg, msg_len, mac, hash_len); - else if (hash_len == SHA512_DIGEST_SIZE) - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): not support group 21 now\n", - __func__)); /* todo: group 21 support */ -} - -static VOID hkdf_expand(IN UCHAR *hash, IN INT hash_len, IN UCHAR *info, - IN INT info_len, OUT UCHAR *output, INT output_Len) -{ - if (hash_len == SHA256_DIGEST_SIZE) - HKDF_expand_sha256(hash, hash_len, info, info_len, output, - output_Len); - else if (hash_len == SHA384_DIGEST_SIZE) - HKDF_expand_sha384(hash, hash_len, info, info_len, output, - output_Len); - else if (hash_len == SHA512_DIGEST_SIZE) - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): not support group 21 now\n", - __func__)); /* todo: group 21 support */ -} - -static VOID sae_kdf_hash(IN PUINT8 hash, IN INT hash_len, IN PUINT8 label, - IN INT label_len, IN PUINT8 data, IN INT data_len, - OUT PUINT8 output, IN USHORT len) -{ - if (hash_len == SHA256_DIGEST_SIZE) - KDF(hash, hash_len, label, label_len, data, data_len, output, - len); - else if (hash_len == SHA384_DIGEST_SIZE) - KDF_384(hash, hash_len, label, label_len, data, data_len, - output, len); - else if (hash_len == SHA512_DIGEST_SIZE) - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): not support group 21 now\n", - __func__)); /* todo: group 21 support */ -} - -VOID sae_cfg_init(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg) -{ - UINT32 i = 0; - -#ifdef BI_POOL - big_integer_pool_init(); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - /* 12.4.8.5.1 When the parent SAE process starts up, Open is set to zero (0) */ - pSaeCfg->pAd = pAd; - pSaeCfg->open = 0; - pSaeCfg->dot11RSNASAERetransPeriod = 2; - pSaeCfg->total_ins = 0; - pSaeCfg->sae_anti_clogging_threshold = 10; - pSaeCfg->k_iteration_var = 40; - pSaeCfg->last_token_key_time = 0; - NdisZeroMemory(&pSaeCfg->token_key, SAE_TOKEN_KEY_LEN); - - NdisZeroMemory(&pSaeCfg->support_group, MAX_SIZE_OF_ALLOWED_GROUP); - - for (i = 0; i < sizeof(sae_support_group_list) / sizeof(UCHAR); i++) - pSaeCfg->support_group[i] = sae_support_group_list[i]; -} - -VOID sae_cfg_deinit(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg) -{ - UINT32 i; - -#ifdef BI_POOL - big_integer_pool_deinit(); -#endif - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) - if (pSaeCfg->sae_ins[i].valid == FALSE) - continue; - else - delete_sae_instance(&pSaeCfg->sae_ins[i]); -} - -SAE_INSTANCE *search_sae_instance(IN SAE_CFG *pSaeCfg, IN UCHAR *own_mac, - IN UCHAR *peer_mac) -{ - UINT32 i; - SAE_INSTANCE *pSaeIns = NULL; - UINT32 ins_cnt = 0; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (!pSaeCfg || !own_mac || !peer_mac) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): search fail with null input\n", __func__)); - return NULL; - } - - NdisAcquireSpinLock(&pSaeCfg->sae_cfg_lock); - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - if (pSaeCfg->sae_ins[i].valid == FALSE) - continue; - - if (RTMPEqualMemory(pSaeCfg->sae_ins[i].own_mac, own_mac, - MAC_ADDR_LEN) /* ellis */ - && RTMPEqualMemory(pSaeCfg->sae_ins[i].peer_mac, peer_mac, - MAC_ADDR_LEN)) { - pSaeIns = &pSaeCfg->sae_ins[i]; - break; - } - - ins_cnt++; - - if (ins_cnt == pSaeCfg->total_ins) - break; - } - - NdisReleaseSpinLock(&pSaeCfg->sae_cfg_lock); - - if (pSaeIns && pSaeIns->state == SAE_ACCEPTED && pSaeIns->same_mac_ins) - pSaeIns = pSaeIns->same_mac_ins; - - return pSaeIns; -} - -SAE_INSTANCE *create_sae_instance(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg, - IN UCHAR *own_mac, IN UCHAR *peer_mac, - IN UCHAR *bssid, IN UCHAR *psk, - IN struct pwd_id_list *pwd_id_list_head, - IN UCHAR is_pwd_id_only) -{ - UINT32 i; - SAE_INSTANCE *pSaeIns = NULL; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==> %s()\n", __func__)); - - if (pSaeCfg == NULL || own_mac == NULL || peer_mac == NULL || - bssid == NULL || (!is_pwd_id_only && psk == NULL)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s():input should not be null\n", __func__)); - return NULL; - } - - if (is_pwd_id_only && (pwd_id_list_head == NULL || - DlListEmpty(&pwd_id_list_head->list))) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s():pwd id is null or empty\n", __func__)); - return NULL; - } - - if ((pSaeCfg->total_ins == MAX_LEN_OF_MAC_TABLE) && - (delete_all_removable_sae_instance(pSaeCfg) == FALSE)) { - return NULL; - } - - NdisAcquireSpinLock(&pSaeCfg->sae_cfg_lock); - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - if (pSaeCfg->sae_ins[i].valid == FALSE) { - pSaeIns = &pSaeCfg->sae_ins[i]; - sae_ins_init(pAd, pSaeCfg, pSaeIns, own_mac, peer_mac, - bssid, psk, pwd_id_list_head, - is_pwd_id_only); - pSaeIns->valid = TRUE; - pSaeCfg->total_ins++; - break; - } - } - - NdisReleaseSpinLock(&pSaeCfg->sae_cfg_lock); - return pSaeIns; -} - -VOID delete_sae_instance(IN SAE_INSTANCE *pSaeIns) -{ - SAE_CFG *pSaeCfg = NULL; - BOOLEAN Cancelled; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (pSaeIns == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): pSaeIns is NULL\n", __func__)); - return; - } - - pSaeCfg = pSaeIns->pParentSaeCfg; - if (pSaeCfg == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): pSaeCfg is NULL\n", __func__)); - return; - } - - NdisAcquireSpinLock(&pSaeCfg->sae_cfg_lock); - RTMPReleaseTimer(&pSaeIns->sae_retry_timer, &Cancelled); - pSaeIns->valid = FALSE; - pSaeIns->removable = FALSE; - if (pSaeIns->group_op) - pSaeIns->group_op->sae_group_deinit(pSaeIns); - - if (pSaeIns->anti_clogging_token) { - os_free_mem(pSaeIns->anti_clogging_token); - pSaeIns->anti_clogging_token = NULL; - } - - SAE_BN_FREE(&pSaeIns->sae_rand); - - if (pSaeIns->same_mac_ins) { - pSaeIns->same_mac_ins->same_mac_ins = NULL; - pSaeIns->same_mac_ins = NULL; - } - SAE_BN_FREE(&pSaeIns->own_commit_scalar); - SAE_BN_FREE(&pSaeIns->peer_commit_scalar); - NdisZeroMemory(pSaeIns, sizeof(SAE_INSTANCE)); - pSaeCfg->total_ins--; - NdisReleaseSpinLock(&pSaeCfg->sae_cfg_lock); - return; -} - -UCHAR set_sae_instance_removable(IN SAE_CFG *pSaeCfg, IN UCHAR *own_mac, - IN UCHAR *peer_mac) -{ - SAE_INSTANCE *pSaeIns = search_sae_instance(pSaeCfg, own_mac, peer_mac); - - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("%s:OM=%02x:%02x:%02x:%02x:%02x:%02x, PM=%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, PRINT_MAC(own_mac), PRINT_MAC(peer_mac))); - - if (pSaeIns == NULL) - return FALSE; - - pSaeIns->removable = TRUE; - return TRUE; -} - -VOID sae_ins_init(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg, - IN SAE_INSTANCE *pSaeIns, IN UCHAR *own_mac, - IN UCHAR *peer_mac, IN UCHAR *bssid, IN UCHAR *psk, - IN struct pwd_id_list *pwd_id_list_head, - IN UCHAR is_pwd_id_only) -{ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - NdisZeroMemory(pSaeIns, sizeof(SAE_INSTANCE)); - COPY_MAC_ADDR(pSaeIns->own_mac, own_mac); - COPY_MAC_ADDR(pSaeIns->peer_mac, peer_mac); - COPY_MAC_ADDR(pSaeIns->bssid, bssid); - RTMPInitTimer(pAd, &pSaeIns->sae_retry_timer, - GET_TIMER_FUNCTION(sae_auth_retransmit), pSaeIns, FALSE); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_INFO, - ("%s: timer valid = %d\n", __func__, - pSaeIns->sae_retry_timer.Valid)); - pSaeIns->pParentSaeCfg = pSaeCfg; - pSaeIns->psk = psk; - pSaeIns->pwd_id_list_head = pwd_id_list_head; - pSaeIns->is_pwd_id_only = is_pwd_id_only; - SET_NOTHING_STATE(pSaeIns); - pSaeIns->sync = 0; - /* 12.4.8.5.2 - * The number of Confirm messages that have been sent. - * This is the send-confirm counter used in the construction of Confirm messages - */ - pSaeIns->send_confirm = 0; /* ellis */ - pSaeIns->last_peer_sc = 0; - pSaeIns->support_group_idx = 0; - pSaeIns->same_mac_ins = NULL; - pSaeIns->removable = FALSE; -} - -/* partial */ -VOID sae_clear_data(IN SAE_INSTANCE *pSaeIns) -{ - BOOLEAN Cancelled; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (pSaeIns->group_op) - pSaeIns->group_op->sae_group_deinit(pSaeIns); - - if (pSaeIns->anti_clogging_token) { - os_free_mem(pSaeIns->anti_clogging_token); - pSaeIns->anti_clogging_token = NULL; - } - - SAE_BN_FREE(&pSaeIns->sae_rand); - SAE_BN_FREE(&pSaeIns->peer_commit_scalar); - SAE_BN_FREE(&pSaeIns->own_commit_scalar); - SET_NOTHING_STATE(pSaeIns); - NdisZeroMemory(pSaeIns, offsetof(SAE_INSTANCE, valid)); - RTMPCancelTimer(&pSaeIns->sae_retry_timer, &Cancelled); - /* RTMPReleaseTimer(&pSaeIns->sae_retry_timer, &Cancelled); */ -} - -static VOID sae_record_time_begin(INOUT ULONG *time_interval) -{ - NdisGetSystemUpTime(time_interval); -} - -static VOID sae_record_time_end(IN UCHAR *str, INOUT ULONG *time_interval) -{ - ULONG temp; - NdisGetSystemUpTime(&temp); - *time_interval = temp - *time_interval; -} - -VOID sae_dump_time(IN SAE_TIME_INTERVAL *time_cost) -{ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - ("cost time:")); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - ("\npwe: %lu jiffies", time_cost->derive_pwe_time)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - (", %u msec", jiffies_to_msecs(time_cost->derive_pwe_time))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - ("\nparse scalar: %lu jiffies", - time_cost->parse_commit_scalar_time)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs(time_cost->parse_commit_scalar_time))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - ("\nparse element: %lu jiffies", - time_cost->parse_commit_element_time)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs(time_cost->parse_commit_element_time))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - ("\nderive scalar: %lu jiffies", - time_cost->derive_commit_scalar_time)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs(time_cost->derive_commit_scalar_time))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - ("\nderive element: %lu jiffies", - time_cost->derive_commit_element_time)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - (", %u msec", - jiffies_to_msecs(time_cost->derive_commit_element_time))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - ("\nk: %lu jiffies", time_cost->derive_k_time)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - (", %u msec", jiffies_to_msecs(time_cost->derive_k_time))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - ("\npmk: %lu jiffies", time_cost->derive_pmk_time)); -#ifdef LINUX - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, - (", %u msec", jiffies_to_msecs(time_cost->derive_pmk_time))); -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, SAE_COST_TIME_DBG_LVL, ("\n")); - - time_cost->derive_pwe_time = 0; - time_cost->parse_commit_scalar_time = 0; - time_cost->parse_commit_element_time = 0; - time_cost->derive_commit_scalar_time = 0; - time_cost->derive_commit_element_time = 0; - time_cost->derive_k_time = 0; - time_cost->derive_pmk_time = 0; - -#ifdef BI_POOL - sae_dump_pool_info_check(0, FALSE, TRUE); -#endif -} - -UCHAR sae_using_anti_clogging(IN SAE_CFG *pSaeCfg) -{ - UINT32 i; - UINT32 ins_cnt = 0; - UINT32 open = 0; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (pSaeCfg->total_ins < pSaeCfg->sae_anti_clogging_threshold) - return FALSE; - - NdisAcquireSpinLock(&pSaeCfg->sae_cfg_lock); - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - if (pSaeCfg->sae_ins[i].valid == FALSE) - continue; - - ins_cnt++; - - if ((pSaeCfg->sae_ins[i].state == SAE_COMMITTED) || - (pSaeCfg->sae_ins[i].state == SAE_CONFIRMED)) - open++; - - if (open >= pSaeCfg->sae_anti_clogging_threshold) { - NdisReleaseSpinLock(&pSaeCfg->sae_cfg_lock); - return TRUE; - } - - if (ins_cnt == pSaeCfg->total_ins) - break; - } - - NdisReleaseSpinLock(&pSaeCfg->sae_cfg_lock); - return FALSE; -} - -VOID sae_set_retransmit_timer(IN SAE_INSTANCE *pSaeIns) -{ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - RTMPSetTimer(&pSaeIns->sae_retry_timer, - pSaeIns->pParentSaeCfg->dot11RSNASAERetransPeriod * 1000); -} - -VOID sae_clear_retransmit_timer(IN SAE_INSTANCE *pSaeIns) -{ - BOOLEAN Cancelled; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - RTMPCancelTimer(&pSaeIns->sae_retry_timer, &Cancelled); -} - -VOID sae_auth_retransmit(IN VOID *SystemSpecific1, IN VOID *FunctionContext, - IN VOID *SystemSpecific2, IN VOID *SystemSpecific3) -{ - SAE_INSTANCE *pSaeIns = (SAE_INSTANCE *)FunctionContext; - RALINK_TIMER_STRUCT *pTimer = (RALINK_TIMER_STRUCT *)SystemSpecific3; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pTimer->pAd; - UCHAR ret; -#ifdef APCLI_SUPPORT -#ifdef APCLI_SAE_SUPPORT - UCHAR idx = 0; - PAPCLI_STRUCT apcli_entry = NULL; - APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; - USHORT ifIndex = 0; -#ifdef MAC_REPEATER_SUPPORT - REPEATER_CLIENT_ENTRY *rept_entry = NULL; -#endif -#endif -#endif - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - -#ifdef APCLI_SUPPORT -#ifdef APCLI_SAE_SUPPORT - /*In case of ApCli and mac repeater ,we need to reset state machine if sync exceeds threshold*/ - for (idx = 0; idx < pAd->ApCfg.ApCliNum; idx++) { - apcli_entry = &pAd->ApCfg.ApCliTab[idx]; - - if (MAC_ADDR_EQUAL(pSaeIns->own_mac, - apcli_entry->wdev.if_addr) && - pSaeIns && sae_check_big_sync(pSaeIns)) { - apcli_entry->AuthCurrState = APCLI_AUTH_REQ_IDLE; - ApCliCtrlMsg.Status = MLME_UNSPECIFY_FAIL; -#ifdef MAC_REPEATER_SUPPORT - ApCliCtrlMsg.CliIdx = 0xFF; - ApCliCtrlMsg.BssIdx = apcli_entry->wdev.func_idx; - ifIndex = apcli_entry->wdev.func_idx; -#endif /* MAC_REPEATER_SUPPORT */ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("==> %s():reset apcli state machine\n", - __func__)); - - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, - APCLI_CTRL_AUTH_RSP, - sizeof(APCLI_CTRL_MSG_STRUCT), - &ApCliCtrlMsg, ifIndex); - RTMP_MLME_HANDLER(pAd); - return; - } - } -#ifdef MAC_REPEATER_SUPPORT - - rept_entry = lookup_rept_entry(pAd, pSaeIns->own_mac); - - if ((rept_entry != NULL) && pSaeIns && sae_check_big_sync(pSaeIns)) { - rept_entry->AuthCurrState = APCLI_AUTH_REQ_IDLE; - /*If SAE instance has been deleted*/ - ApCliCtrlMsg.Status = MLME_UNSPECIFY_FAIL; -#ifdef MAC_REPEATER_SUPPORT - ApCliCtrlMsg.CliIdx = rept_entry->MatchLinkIdx; - ApCliCtrlMsg.BssIdx = rept_entry->MatchApCliIdx; -#endif /* MAC_REPEATER_SUPPORT */ - ifIndex = REPT_MLME_START_IDX + rept_entry->MatchLinkIdx; - - MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_AUTH_RSP, - sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, - ifIndex); - RTMP_MLME_HANDLER(pAd); - return; - } -#endif - -#endif -#endif - if (pSaeIns && sae_check_big_sync(pSaeIns)) /* ellis */ - return; - - switch (pSaeIns->state) { - case SAE_COMMITTED: - ret = sae_send_auth_commit(pAd, pSaeIns); - sae_set_retransmit_timer(pSaeIns); - break; - - case SAE_CONFIRMED: - /* If Sync is not greater than dot11RSNASAESync, the Sync counter shall be incremented, - * Sc shall be incremented, and the protocol instance shall create a new Confirm (with the new Sc value) Message, - * transmit it to the peer, and set the t0 (retransmission) timer - */ - ret = sae_send_auth_confirm(pAd, pSaeIns); - sae_set_retransmit_timer(pSaeIns); - break; - - default: - ret = FALSE; - break; - } - - if (ret == FALSE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): retransemit fail (state = %d, sync = %d)\n", - __func__, pSaeIns->state, pSaeIns->sync)); - } -} - -static VOID *sae_search_pt_by_group(IN struct sae_pt *pt_list, IN USHORT group) -{ - struct sae_pt *list = pt_list; - - while (list) { - if (list->group == group) - return list->pt; - list = list->next; - } - - return NULL; -} - -UCHAR sae_auth_init(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg, - IN UCHAR *own_mac, IN UCHAR *peer_mac, IN UCHAR *bssid, - IN UCHAR *psk, IN struct sae_pt *pt_list, IN INT32 group) -{ - SAE_INSTANCE *pSaeIns = search_sae_instance(pSaeCfg, own_mac, peer_mac); - SAE_INSTANCE *pPreSaeIns = pSaeIns; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==>%s(): pSaeIns = %p, pSaeIns->state = %d\n", __func__, - pSaeIns, (pSaeIns) ? pSaeIns->state : -1)); - - /* 12.4.8.6.1 Upon receipt of an Initiate event, the parent process shall check whether there exists a protocol instance for - * the peer MAC address (from the Init event) in either Committed or Confirmed state. If there is, the Initiate - * event shall be ignored. Otherwise, a protocol instance shall be created, and an Init event shall be sent to the - * protocol instance. - */ - if (pSaeIns && ((pSaeIns->state == SAE_COMMITTED) || - (pSaeIns->state == SAE_CONFIRMED))) - return FALSE; - - pSaeIns = create_sae_instance(pAd, pSaeCfg, own_mac, peer_mac, bssid, - psk, NULL, FALSE); - - if (!pSaeIns) - return FALSE; - - pSaeIns->same_mac_ins = pPreSaeIns; - - if (pPreSaeIns) - pPreSaeIns->same_mac_ins = pSaeIns; - - if (sae_group_allowed(pSaeIns, pSaeCfg->support_group, group) != - MLME_SUCCESS) - goto FAIL; - - if (pt_list != NULL) - pSaeIns->pt = sae_search_pt_by_group(pt_list, pSaeIns->group); - - if (pSaeIns->pt != NULL) - pSaeIns->h2e_connect = TRUE; - - if (sae_prepare_commit(pSaeIns) != MLME_SUCCESS) - goto FAIL; - - if (sae_send_auth_commit(pAd, pSaeIns) == FALSE) - goto FAIL; - - SET_COMMITTED_STATE(pSaeIns); - sae_set_retransmit_timer(pSaeIns); - return TRUE; -FAIL: - delete_sae_instance(pSaeIns); - return FALSE; -} - -UCHAR sae_handle_auth(IN RTMP_ADAPTER *pAd, IN SAE_CFG *pSaeCfg, IN VOID *msg, - IN UINT32 msg_len, IN UCHAR *psk, - IN struct sae_pt *pt_list, - IN struct sae_capability *sae_cap, -#ifdef DOT11_SAE_PWD_ID_SUPPORT - IN struct pwd_id_list *pwd_id_list_head, -#endif - IN USHORT auth_seq, IN USHORT auth_status, - OUT UCHAR **pmk, OUT UCHAR *is_h2e_connect) -{ -#define DATA_SIZE 80 - USHORT res = MLME_SUCCESS; - FRAME_802_11 *Fr = (PFRAME_802_11)msg; - SAE_INSTANCE *pSaeIns = - search_sae_instance(pSaeCfg, Fr->Hdr.Addr1, Fr->Hdr.Addr2); - UINT8 is_token_req = FALSE; - UCHAR *token = NULL; - UINT32 token_len = 0; - UCHAR data[DATA_SIZE]; - UINT32 data_len = 0; - struct pwd_id_list *pwdid_list = NULL; - UCHAR is_pwd_id_only = FALSE; - -#ifdef DOT11_SAE_PWD_ID_SUPPORT - pwdid_list = pwd_id_list_head; - is_pwd_id_only = sae_cap->pwd_id_only; -#endif - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==>%s(): receive seq #%d with status code %d, instance %p, own mac addr = %02x:%02x:%02x:%02x:%02x:%02x, peer mac addr = %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, auth_seq, auth_status, pSaeIns, - PRINT_MAC(Fr->Hdr.Addr1), PRINT_MAC(Fr->Hdr.Addr2))); - - /* Upon receipt of a Com event, the t0 (retransmission) timer shall be cancelled in Committed/Confirmed state */ - /* Upon receipt of a Con event, the t0 (retransmission) timer shall be cancelled in Committed/Confirmed state */ - if (pSaeIns) { - if (Fr->Hdr.FC.Retry == 0) - pSaeIns->last_rcv_auth_seq = Fr->Hdr.Sequence; - else { - if (pSaeIns->last_rcv_auth_seq == Fr->Hdr.Sequence) { - goto unfinished; - } - } - } - if (pSaeIns) { - sae_clear_retransmit_timer(pSaeIns); /* ellis */ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): state = %d\n", __func__, pSaeIns->state)); - } - - switch (auth_seq) { - case SAE_COMMIT_SEQ: - if (auth_status != MLME_SUCCESS && - auth_status != MLME_SAE_HASH_TO_ELEMENT) { - if (!pSaeIns) - goto unfinished; - - /* 12.4.8.6.3 Upon receipt of a Com event, the protocol instance shall check the Status of the Authentication frame. If the - * Status code is nonzero, the frame shall be silently discarded and a Del event shall be sent to the parent - * process. - */ - /* comments: it's not expected to receive the rejection commit msg in NOTHING/ACCEPTED state */ - if (pSaeIns->state == SAE_NOTHING || - pSaeIns->state == SAE_ACCEPTED) { - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - goto unfinished; - } else if (pSaeIns->state == SAE_CONFIRMED) { - /* 12.4.8.6.5 Upon receipt of a Com event, if the Status is nonzero, the frame shall be silently discarded, the t0 (retransmission) timer set - * If Sync is greater than dot11RSNASAESync, the protocol instance shall send the parent process a Del event and transitions back to Nothing state - */ - if (sae_check_big_sync(pSaeIns)) - goto unfinished; - sae_set_retransmit_timer(pSaeIns); - goto unfinished; - } - - if (auth_status == MLME_ANTI_CLOGGING_TOKEN_REQ) { - /*Check presence of Anti-Clogging Token*/ - /*If Anti-Clogging Token present store the anti-clogging token content and length*/ - is_token_req = TRUE; - res = sae_parse_commit(pSaeCfg, pSaeIns, msg, - msg_len, &token, - &token_len, - is_token_req); - - if (res != MLME_SUCCESS) - break; - - if (token && (token_len > 0)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, - DBG_LVL_ERROR, - ("%s:AntiClogging Request token found,token_len = %d\n", - __func__, token_len)); - - os_alloc_mem( - pAd, - &pSaeIns->anti_clogging_token, - token_len); - - if (pSaeIns->anti_clogging_token == - NULL) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, - DBG_LVL_ERROR, - ("%s:AntiClogging token allocation fail\n", - __func__)); - - sae_set_retransmit_timer( - pSaeIns); - goto unfinished; - } - NdisZeroMemory( - pSaeIns->anti_clogging_token, - token_len); - pSaeIns->anti_clogging_token_len = - token_len; - - NdisMoveMemory( - pSaeIns->anti_clogging_token, - (UCHAR *)token, - pSaeIns->anti_clogging_token_len); - - sae_send_auth_commit(pAd, pSaeIns); - sae_set_retransmit_timer(pSaeIns); - goto unfinished; - - } else { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, - DBG_LVL_ERROR, - ("%s:AntiClogging Request token empty fail\n", - __func__)); - sae_set_retransmit_timer(pSaeIns); - goto unfinished; - } - - } else if (auth_status == - MLME_FINITE_CYCLIC_GROUP_NOT_SUPPORTED) { - USHORT sae_group; - USHORT new_sae_group = 0; - UCHAR *pos = &Fr->Octet[6]; - /* 12.4.8.6.4 If the Status code is 77, the protocol instance shall check the finite cyclic group field being rejected.*/ - /* Check Finite Cyclic Group */ - NdisMoveMemory(&sae_group, pos, - 2); /* ellis bigendian */ - sae_group = cpu2le16(sae_group); - - /* If the rejected group does not match the last offered group the protocol instance shall silently discard the message and set the t0 (retransmission) timer */ - if (sae_group != pSaeIns->group) { - sae_set_retransmit_timer(pSaeIns); - goto unfinished; - } else { - BOOL discard = FALSE; - /* If the rejected group matches the last offered group, - * the protocol instance shall choose a different group and generate the PWE and the secret - * values according to 12.4.5.2; it then generates and transmits a new Commit Message to the peer, - * zeros Sync, sets the t0 (retransmission) timer, and remains in Committed state. - */ - - /*If there are no other groups to choose, - the protocol instance shall send a Del event to the parent process and transitions back to Nothing state. */ - - pSaeIns->support_group_idx++; - if (pSaeIns->support_group_idx < - MAX_SIZE_OF_ALLOWED_GROUP) - new_sae_group = - pSaeCfg->support_group - [pSaeIns->support_group_idx]; - - if (new_sae_group != 0) { - if (sae_group_allowed( - pSaeIns, - pSaeCfg->support_group, - new_sae_group) != - MLME_SUCCESS) - discard = TRUE; - - if (!discard && - (sae_prepare_commit( - pSaeIns) != - MLME_SUCCESS)) - discard = TRUE; - } - /*If there are no other groups to choose, - the protocol instance shall send a Del event to the parent process and transitions back to Nothing state. */ - if ((new_sae_group == 0) || - (discard == TRUE)) { - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - goto unfinished; - } - - sae_send_auth_commit(pAd, pSaeIns); - sae_set_retransmit_timer(pSaeIns); - goto unfinished; - } - } else if (auth_status == - MLME_UNKNOWN_PASSWORD_IDENTIFIER) { - /* 12.4.8.6.4 If the Status code is UNKNOWN_PASSWORD_IDENTIFIER, - * the protocol instance shall send a Del event to the parent process and transition back to Nothing state - */ - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - goto unfinished; - } else { - /* 12.4.8.6.4 If the Status is some other nonzero value, the frame shall be silently discarded and the t0 (retransmission) timer shall be set. - * 12.4.8.6.5 Upon receipt of a Com event, the t0 (retransmission) timer shall be canceled. If the Status is nonzero, - * the frame shall be silently discarded, the t0 (retransmission) timer set, and the protocol instance shall remain in the Confirmed state - */ - sae_set_retransmit_timer(pSaeIns); - goto unfinished; - } - } - - if ((auth_status == MLME_SAE_HASH_TO_ELEMENT && - sae_cap->gen_pwe_method == PWE_LOOPING_ONLY) || - (auth_status == MLME_SUCCESS && - sae_cap->gen_pwe_method == PWE_HASH_ONLY)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): reject peer due to pwe method is %d\n", - __func__, sae_cap->gen_pwe_method)); - res = MLME_UNSPECIFY_FAIL; - break; - } - - if (!pSaeIns || pSaeIns->state == SAE_ACCEPTED) { - /* 12.4.8.6, the parent process checks the value of Open first. - * If Open is not greater than dot11RSNASAEAntiCloggingThreshold or Anti-Clogging Token exists and is correct, - * the parent process shall create a protocol instance. - * comment: But, parsing anti-clogging token needs group info, so always create instance first - */ - SAE_INSTANCE *pPreSaeIns = pSaeIns; - pSaeIns = create_sae_instance( - pAd, pSaeCfg, Fr->Hdr.Addr1, Fr->Hdr.Addr2, - Fr->Hdr.Addr3, psk, pwdid_list, is_pwd_id_only); - - if (!pSaeIns) { - res = MLME_UNSPECIFY_FAIL; - break; - } - if (pSaeIns) { - pSaeIns->last_rcv_auth_seq = Fr->Hdr.Sequence; - pSaeIns->same_mac_ins = pPreSaeIns; - } - if (pPreSaeIns) - pPreSaeIns->same_mac_ins = pSaeIns; - } - - if (auth_status == MLME_SAE_HASH_TO_ELEMENT && - sae_cap->gen_pwe_method != PWE_LOOPING_ONLY) - pSaeIns->h2e_connect = TRUE; - - res = sae_parse_commit(pSaeCfg, pSaeIns, msg, msg_len, &token, - &token_len, is_token_req); - - if (res == MLME_FINITE_CYCLIC_GROUP_NOT_SUPPORTED) { - /* 12.4.8.6.3(NOTHING) the frame shall be processed by first checking the finite cyclic group field to see if the requested group is supported. - * If not, BadGrp shall be set and the protocol instance shall construct and transmit a an Authentication frame with Status code UNSUPPORTED_FINITE_CYCLIC_GROUP - * indicating rejection with the finite cyclic group field set to the rejected group, and shall send the parent process a Del event - */ - if (pSaeIns->state == SAE_NOTHING) { - NdisMoveMemory(data, &pSaeIns->group, 2); - data_len = 2; - if (!pSaeIns->h2e_connect) { - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - } - break; - } - /* 12.4.8.6.4(COMMITTED) If the Status is zero, the finite cyclic group field is checked. If the group is not supported, BadGrp shall be set and the value of Sync shall be checked. - * -If Sync is greater than dot11RSNASAESync, the protocol instance shall send a Del event to the parent process and transitions back to Nothing state. - * -If Sync is not greater than dot11RSNASAESync, Sync shall be incremented, a Commit Message with Status code equal to 77 indicating rejection, - * and the Algorithm identifier set to the rejected algorithm, shall be sent to the peer, - * the t0 (retransmission) timer shall be set and the protocol instance shall remain in Committed state - */ - if (pSaeIns->state == SAE_COMMITTED && - sae_check_big_sync(pSaeIns)) - goto unfinished; - - if (pSaeIns->state == SAE_COMMITTED) - sae_set_retransmit_timer(pSaeIns); - - /* 12.4.8.6.5(CONFIRMED) the protocol instance shall verify that the finite cyclic group is the same as the previously received Commit frame. - * If not, the frame shall be silently discarded - * If so, the protocol instance shall increment Sync, increment Sc, and transmit its Commit and Confirm (with the new Sc value) messages. - * It then shall set the t0 (retransmission) timer. - */ - if (pSaeIns->state == SAE_CONFIRMED) { - sae_set_retransmit_timer(pSaeIns); - goto unfinished; - } - } else if (res == MLME_UNKNOWN_PASSWORD_IDENTIFIER) { - /* 12.4.8.6.3 Protocol instance behavior - Nothing state - * the frame shall be processed by first checking (M41)whether a password identifier is present. - * If so and there is no password associated with that identifier, BadID shall be set and the protocol instance - * shall construct and transmit an Authentication frame with Status Code set to UNKNOWN_PASSWORD_IDENTIFIER. - */ - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - break; - } else if (res == SAE_SILENTLY_DISCARDED) { - sae_set_retransmit_timer(pSaeIns); - goto unfinished; - } else if (res != MLME_SUCCESS) { - if (pSaeIns->state == SAE_NOTHING) { - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - } - break; - } - - if (auth_status == MLME_SAE_HASH_TO_ELEMENT) { - if (!pt_list) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): pt list should not be null\n", - __func__)); - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - break; - } - /* 12.4.4.2.3 Hash-to-curve generation of the password element with ECC groups - * If an SAE Commit message is received with status code equal to SAE_HASH_TO_ELEMENT - * the peer shall generate the PWE using the following technique and reply - * with its own SAE Commit message with status code equal to SAE_HASH_TO_ELEMENT. - */ - if (pSaeIns->pt == NULL) { - pSaeIns->pt = sae_search_pt_by_group( - pt_list, pSaeIns->group); - if (pSaeIns->pt == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, - DBG_LVL_ERROR, - ("%s(): pt not found\n", - __func__)); - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - break; - } - } - } - - if (is_token_req) { - /* 12.4.8.6.4 The protocol instance shall check the Status code of the Authentication frame. - * If the Status code is 76, a new Commit Message shall be constructed with the Anti-Clogging Token from the received - * Authentication frame, and the commit-scalar and COMMIT-ELEMENT previously sent - */ - /* The new Commit Message shall be transmitted to the peer, - *Sync shall be zeroed, and the t0 (retransmission) timer shall be set - */ - pSaeIns->sync = 0; - } - - res = sae_check_rejected_group(pSaeIns); - - if (res != MLME_SUCCESS) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): check rejected groups fail\n", - __func__)); - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - break; - } - - if (token && - sae_check_token(pSaeIns, token, token_len) == FALSE) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): check token fail with peer mac %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, PRINT_MAC(pSaeIns->peer_mac))); - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - res = MLME_UNSPECIFY_FAIL; - break; - } - - if (!token && sae_using_anti_clogging(pSaeCfg)) { - sae_build_token_req(pAd, pSaeIns, data, &data_len); - res = MLME_ANTI_CLOGGING_TOKEN_REQ; - break; - } - - res = sae_sm_step(pAd, pSaeIns, auth_seq); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_INFO, - ("%s(): SAE_COMMIT_SEQ, res(sae_sm_step) = %d\n", - __func__, res)); - break; - - case SAE_CONFIRM_SEQ: - if (!pSaeIns || pSaeIns->state == SAE_NOTHING) - goto unfinished; - - /* 12.4.8.6.5 Rejection frames received in Confirmed state shall be silently discarded */ - /* Comment: It is not clear in spec about how to handle confirm message with error status. */ - if (auth_status != MLME_SUCCESS) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): receive error status auth confirm msg, so delete the instance\n", - __func__)); - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - goto unfinished; - } - if (pSaeIns->state == SAE_CONFIRMED || - pSaeIns->state == SAE_ACCEPTED) - res = sae_parse_confirm(pSaeIns, msg, msg_len); - - /* Comment: It is not clear in spec about how to handle if the confirm be verified fail. */ - if (res != MLME_SUCCESS) { - if (pSaeIns->state == SAE_ACCEPTED) { - /* 12.4.8.6.6(ACCEPTED) Upon receipt of a Con event, the Sync counter shall be checked */ - /* the value of send-confirm shall be checked. If the value is not greater than Rc or is equal to 2^16 ¡V 1, - * the received frame shall be silently discarded. Otherwise, the Confirm portion of the frame shall be checked according to 12.4.5.6. - * If the verification fails, the received frame shall be silently discarded - */ - sae_check_big_sync(pSaeIns); - goto unfinished; - } - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): verify confirm fail, remove instance\n", - __func__)); - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - break; - } - - res = sae_sm_step(pAd, pSaeIns, auth_seq); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): SAE_CONFIRM_SEQ, res(sae_sm_step) = %d\n", - __func__, res)); - break; - - default: - if (pSaeIns) { - delete_sae_instance(pSaeIns); - pSaeIns = NULL; - } - - res = MLME_SEQ_NR_OUT_OF_SEQUENCE; - break; - } - - if (res != MLME_SUCCESS && res != SAE_SILENTLY_DISCARDED) - sae_send_auth(pAd, Fr->Hdr.Addr1, Fr->Hdr.Addr2, Fr->Hdr.Addr3, - AUTH_MODE_SAE, auth_seq, res, data, data_len); - - if (pSaeIns && pSaeIns->state == SAE_ACCEPTED) { - sae_dump_time(&pSaeIns->sae_cost_time); - SAE_LOG_TIME_DUMP(); - ecc_point_dump_time(); - if (pmk) - *pmk = pSaeIns->pmk; - if (is_h2e_connect) - *is_h2e_connect = pSaeIns->h2e_connect; - hex_dump_with_lvl("sae success, pmk:", (char *)*pmk, LEN_PMK, - DBG_LVL_TRACE); - return TRUE; - } -unfinished: - *pmk = NULL; - if (!pSaeIns) - return FALSE; - else - return TRUE; -} - -extern UCHAR wpa3_test_ctrl; - -USHORT sae_sm_step(IN RTMP_ADAPTER *pAd, IN SAE_INSTANCE *pSaeIns, - IN USHORT auth_seq) -{ -#define F(a, b) (a << 2 | b) - USHORT res = MLME_SUCCESS; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - switch (F(pSaeIns->state, auth_seq)) { - case F(SAE_NOTHING, SAE_COMMIT_SEQ): - /* 12.4.8.6.3 If validation of the received - * Commit Message fails, the protocol instance shall send a Del event to the parent process; otherwise, it shall - * construct and transmit a Commit Message (see 12.4.5.3) followed by a Confirm Message (see 12.4.5.5). The - * Sync counter shall be set to zero and the t0 (retransmission) timer shall be set. The protocol instance - * transitions to Confirmed state. - */ - res = sae_prepare_commit(pSaeIns); - - if (res != MLME_SUCCESS) - return res; - - if (wpa3_test_ctrl == 2) { - res = sae_process_commit(pSaeIns); - - if (res != MLME_SUCCESS) - return res; - - if (sae_send_auth_commit(pAd, pSaeIns) == FALSE) - return SAE_SILENTLY_DISCARDED; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("%s(): let confirm right after commit\n", - __func__)); - } else { - if (sae_send_auth_commit(pAd, pSaeIns) == FALSE) - return SAE_SILENTLY_DISCARDED; - - res = sae_process_commit(pSaeIns); - - if (res != MLME_SUCCESS) - return res; - } - - if (sae_send_auth_confirm(pAd, pSaeIns) == FALSE) - return SAE_SILENTLY_DISCARDED; - SET_CONFIRMED_STATE(pSaeIns); - pSaeIns->sync = 0; - sae_set_retransmit_timer(pSaeIns); - break; - - case F(SAE_COMMITTED, SAE_COMMIT_SEQ): - /* 12.4.8.6.4 If the received element and scalar differ from the element and - * scalar offered, the received Commit Message shall be processed according to 12.4.5.4, the Sc - * counter shall be incremented (thereby setting its value to one), the protocol instance shall then - * construct a Confirm Message, transmit it to the peer, and set the t0 (retransmission) timer. It shall - * then transition to Confirmed state. - */ - res = sae_process_commit(pSaeIns); - if (res != MLME_SUCCESS) - return res; - if (sae_send_auth_confirm(pAd, pSaeIns) == FALSE) - return SAE_SILENTLY_DISCARDED; - SET_CONFIRMED_STATE(pSaeIns); - pSaeIns->sync = 0; - sae_set_retransmit_timer(pSaeIns); - break; - - case F(SAE_COMMITTED, SAE_CONFIRM_SEQ): - /* 12.4.8.6.4 Upon receipt of a Con event, If Sync is not greater than - * dot11RSNASAESync, the protocol instance shall increment Sync, transmit the last Commit Message sent to - * the peer, and set the t0 (retransmission) timer. - * comments: In COMMITTED state, it's still awaiting for peer commit msg - */ - if (sae_send_auth_commit(pAd, pSaeIns) == FALSE) - return SAE_SILENTLY_DISCARDED; - sae_set_retransmit_timer(pSaeIns); - break; - - case F(SAE_CONFIRMED, SAE_COMMIT_SEQ): - /* 12.4.8.6.5 the protocol instance shall verify that the finite cyclic group is the same as the previously received Commit - * frame. If not, the frame shall be silently discarded. If so, the protocol instance shall increment Sync, - * increment Sc, and transmit its Commit and Confirm (with the new Sc value) messages. - * It then shall set the t0 (retransmission) timer. - */ - if (sae_check_big_sync(pSaeIns)) - return MLME_SUCCESS; - if (pSaeIns->need_recalculate_key) { - res = sae_process_commit(pSaeIns); - if (res != MLME_SUCCESS) - return res; - pSaeIns->need_recalculate_key = FALSE; - } - - if (sae_send_auth_commit(pAd, pSaeIns) == FALSE) - return SAE_SILENTLY_DISCARDED; - if (sae_send_auth_confirm(pAd, pSaeIns) == FALSE) - return SAE_SILENTLY_DISCARDED; - sae_set_retransmit_timer(pSaeIns); - break; - - case F(SAE_CONFIRMED, SAE_CONFIRM_SEQ): - /* 12.4.8.6.5 If processing is successful and the Confirm Message has been verified, - * the Rc variable shall be set to the send-confirm portion of the frame, Sc shall be set to the value 2^16 ¡V 1, the - * t1 (key expiry) timer shall be set, and the protocol instance shall transition to Accepted state - */ - pSaeIns->last_peer_sc = pSaeIns->peer_send_confirm; - pSaeIns->send_confirm = SAE_MAX_SEND_CONFIRM; - - /* If another protocol instance exists in the database indexed by the same peer identity as the protocol - * instance that sent the Auth event, the other protocol instance shall be destroyed. - */ - if (pSaeIns->same_mac_ins) { - delete_sae_instance(pSaeIns->same_mac_ins); - pSaeIns->same_mac_ins = NULL; - } - - SET_ACCEPTED_STATE(pSaeIns); - /* ellis todo: t1 (key expiry) timer shall be set, and the protocol instance shall transition to Accepted state */ - /* auth done */ - break; - - case F(SAE_ACCEPTED, SAE_CONFIRM_SEQ): - /* 12.4.8.6.6 Upon receipt of a Con event, the Sync counter shall be checked */ - if (sae_check_big_sync(pSaeIns)) - return MLME_SUCCESS; - - /* 12.4.8.6.6 If the verification succeeds, the Rc variable - * shall be set to the send-confirm portion of the frame, the Sync shall be incremented and a new Confirm - * Message shall be constructed (with Sc set to 216 ¡V 1) and sent to the peer - */ - pSaeIns->sync++; - pSaeIns->last_peer_sc = pSaeIns->peer_send_confirm; - if (sae_send_auth_confirm(pAd, pSaeIns) == FALSE) - return SAE_SILENTLY_DISCARDED; - break; - - default: - break; - } - - return res; -} - -UINT32 sae_ecc_prime_len_2_hash_len(UINT32 prime_len) -{ - if (prime_len <= SHA256_DIGEST_SIZE) - return SHA256_DIGEST_SIZE; - if (prime_len <= SHA384_DIGEST_SIZE) - return SHA384_DIGEST_SIZE; - return SHA512_DIGEST_SIZE; -} - -/* if this api return TRUE, the instance will be removed, the caller should directly return and not access the instance */ -UCHAR sae_check_big_sync(IN SAE_INSTANCE *pSaeIns) -{ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (pSaeIns->sync > DOT11RSNASAESYNC) { - delete_sae_instance(pSaeIns); - return TRUE; - } - - pSaeIns->sync++; - - return FALSE; -} - -UCHAR sae_get_pmk_cache(IN SAE_CFG *pSaeCfg, IN UCHAR *own_mac, - IN UCHAR *peer_mac, OUT UCHAR *pmkid, OUT UCHAR *pmk) -{ - /* PMKID = L((commit-scalar + peer-commit-scalar) mod r, 0, 128) */ - SAE_BN *tmp = NULL; - UINT32 len = LEN_PMKID; - SAE_INSTANCE *pSaeIns = search_sae_instance(pSaeCfg, own_mac, peer_mac); - - if (pSaeIns == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): pSaeIns not found\n", __func__)); - return FALSE; - } - - if (pSaeIns->state != SAE_ACCEPTED || !pSaeIns->own_commit_scalar || - !pSaeIns->peer_commit_scalar) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): get pmkid fail\n", __func__)); - return FALSE; - } - - if (pmkid) { - SAE_BN_INIT(&tmp); - - SAE_BN_MOD_ADD_QUICK(pSaeIns->own_commit_scalar, - pSaeIns->peer_commit_scalar, - pSaeIns->order, &tmp); - SAE_BN_BI2BIN_WITH_PAD(tmp, pmkid, &len, LEN_PMKID); - - SAE_BN_FREE(&tmp); - } - - if (pmk && pSaeIns->pmk) - NdisMoveMemory(pmk, pSaeIns->pmk, LEN_PMK); - else if (!pSaeIns->pmk) - return FALSE; - - return TRUE; -} - -static VOID sae_renew_token_key(IN SAE_CFG *pSaeCfg) -{ -#define TOKEN_REKEY_INTERVAL 100000 /* unit: jiffies*/ - ULONG cur_time; - UINT32 i; - - NdisGetSystemUpTime(&cur_time); - - if (cur_time > (pSaeCfg->last_token_key_time + TOKEN_REKEY_INTERVAL) && - (cur_time - TOKEN_REKEY_INTERVAL) > pSaeCfg->last_token_key_time) { - pSaeCfg->last_token_key_time = cur_time; - for (i = 0; i < SAE_TOKEN_KEY_LEN; i++) - pSaeCfg->token_key[i] = RandomByte(pSaeCfg->pAd); - } -} - -UCHAR sae_build_token_req(IN RTMP_ADAPTER *pAd, IN SAE_INSTANCE *pSaeIns, - OUT UCHAR *token_req, OUT UINT32 *token_req_len) -{ - SAE_CFG *sae_cfg = pSaeIns->pParentSaeCfg; - - NdisMoveMemory(token_req, &pSaeIns->group, 2); - sae_renew_token_key(sae_cfg); - RT_HMAC_SHA256(sae_cfg->token_key, SAE_TOKEN_KEY_LEN, pSaeIns->peer_mac, - MAC_ADDR_LEN, token_req + 2, SHA256_DIGEST_SIZE); - *token_req_len = SHA256_DIGEST_SIZE + 2; - - return TRUE; -} - -UCHAR sae_check_token(IN SAE_INSTANCE *pSaeIns, IN UCHAR *peer_token, - IN UINT32 peer_token_len) -{ - SAE_CFG *sae_cfg = pSaeIns->pParentSaeCfg; - UCHAR token[SHA256_DIGEST_SIZE]; - - if (peer_token_len != SHA256_DIGEST_SIZE) - return FALSE; - - RT_HMAC_SHA256(sae_cfg->token_key, SAE_TOKEN_KEY_LEN, pSaeIns->peer_mac, - MAC_ADDR_LEN, token, SHA256_DIGEST_SIZE); - - if (RTMPEqualMemory(token, peer_token, SHA256_DIGEST_SIZE)) - return TRUE; - - return FALSE; -} - -VOID sae_parse_commit_token_req(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end, IN UCHAR **token, - IN UINT32 *token_len) -{ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - /*George:As per spec in Anticlogging request frame only group and anticlogging token expected in the commit frame*/ - if ((end - *pos) > 0) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s:add anti clogging token\n", __func__)); - - if (token) - *token = *pos; - - if (token_len) - *token_len = (UINT32)(end - *pos); - - *pos += *token_len; - } else { - if (token) - *token = NULL; - - if (token_len) - *token_len = 0; - } -} - -USHORT sae_parse_commit(IN SAE_CFG *pSaeCfg, IN SAE_INSTANCE *pSaeIns, - IN UCHAR *msg, IN UINT32 msg_len, IN UCHAR **token, - IN UINT32 *token_len, IN UCHAR is_token_req) -{ - USHORT sae_group; - USHORT res; - FRAME_802_11 *Fr = (PFRAME_802_11)msg; - UCHAR *pos = &Fr->Octet[6]; - UCHAR *end = msg + msg_len; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - /* Check Finite Cyclic Group */ - NdisMoveMemory(&sae_group, pos, 2); /* ellis bigendian */ - sae_group = cpu2le16(sae_group); - res = sae_group_allowed(pSaeIns, pSaeCfg->support_group, sae_group); - - if (res == MLME_FINITE_CYCLIC_GROUP_NOT_SUPPORTED && - pSaeIns->h2e_connect) { - if (sae_group >= MAX_SAE_GROUP) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): group id is larger than 32\n", - __func__)); - return MLME_UNSPECIFY_FAIL; - } - pSaeIns->rejected_group |= (1 << sae_group); - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s: pSaeIns->rejected_group = %x\n", __func__, - pSaeIns->rejected_group)); - } - - if (res != MLME_SUCCESS) - return res; - - pos = pos + 2; - - if (is_token_req == TRUE) { - /* process the rejection with anti-clogging */ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s:Parsing AntiClogging Request token\n", __func__)); - - sae_parse_commit_token_req(pSaeIns, &pos, end, token, - token_len); - return MLME_SUCCESS; - } - - /* Optional Anti-Clogging Token */ - sae_parse_commit_token(pSaeIns, &pos, end, token, token_len); - sae_record_time_begin(&pSaeIns->sae_cost_time.parse_commit_scalar_time); - /* commit-scalar */ - res = sae_parse_commit_scalar(pSaeIns, &pos, end); - - if (res != MLME_SUCCESS) - return res; - - sae_record_time_end("parse_commit_scalar_time", - &pSaeIns->sae_cost_time.parse_commit_scalar_time); - /* commit-element */ - res = sae_parse_commit_element(pSaeIns, &pos, end); - - if (res != MLME_SUCCESS) - return res; - - /* 12.4.8.6.4 the protocol instance checks the peer-commit-scalar and PEER-COMMIT-ELEMENT - * from the message. If they match those sent as part of the protocol instance¡¦s own Commit Message, - * the frame shall be silently discarded (because it is evidence of a reflection attack) - */ - if (pSaeIns->group_op) - res = pSaeIns->group_op->sae_reflection_check(pSaeIns); - else - return MLME_UNSPECIFY_FAIL; - - if (res != MLME_SUCCESS) - return res; - - /* Optional Password Identifier element */ - res = sae_parse_password_identifier(pSaeIns, &pos, end, - pSaeIns->is_pwd_id_only); - - if (res != MLME_SUCCESS) - return res; - - /* Conditional Rejected Groups element */ - if (pSaeIns->h2e_connect) - res = sae_parse_rejected_groups(pSaeIns, pos, end); - - return res; -} - -VOID sae_parse_commit_token(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end, IN UCHAR **token, - IN UINT32 *token_len) -{ - UINT32 non_token_len = (is_sae_group_ecc(pSaeIns->group) ? 3 : 2) * - pSaeIns->prime_len; /* ellis */ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (*pos + non_token_len < end) { - if (is_sae_pwd_id_element(*pos + non_token_len, end, NULL) || - (pSaeIns->h2e_connect && - is_sae_rejected_group_element(*pos + non_token_len, end, - NULL))) { - if (token) - *token = NULL; - - if (token_len) - *token_len = 0; - - return; - } - - if (token) - *token = *pos; - - if (token_len) - *token_len = (UINT32)(end - *pos) - non_token_len; - - *pos += *token_len; - } else { - if (token) - *token = NULL; - - if (token_len) - *token_len = 0; - } -} - -USHORT sae_parse_commit_scalar(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end) -{ - SAE_BN *peer_scalar = NULL; - SAE_INSTANCE *pPreSaeIns = pSaeIns->same_mac_ins; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (*pos + pSaeIns->prime_len > end) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): not enough data for scalar\n", __func__)); - return MLME_UNSPECIFY_FAIL; - } - - hex_dump_with_lvl("peer scalar:", (char *)*pos, pSaeIns->prime_len, - SAE_DEBUG_LEVEL); - SAE_BN_BIN2BI(*pos, pSaeIns->prime_len, &peer_scalar); - - /* - * IEEE Std 802.11-2016, 12.4.8.6.1: If there is a protocol instance for - * the peer and it is in Authenticated state, the new Commit Message - * shall be dropped if the peer-scalar is identical to the one used in - * the existing protocol instance. - */ - - if (pPreSaeIns && (pPreSaeIns->state == SAE_ACCEPTED) && - (pPreSaeIns->peer_commit_scalar) && - !SAE_BN_UCMP(peer_scalar, pPreSaeIns->peer_commit_scalar)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): do not accept re-use of previous peer-commit-scalar\n", - __func__)); - SAE_BN_FREE(&peer_scalar); - return MLME_UNSPECIFY_FAIL; - } - - if (pSaeIns->state == SAE_CONFIRMED && (pSaeIns->peer_commit_scalar) && - SAE_BN_UCMP(peer_scalar, pSaeIns->peer_commit_scalar)) - pSaeIns->need_recalculate_key = TRUE; - - /* 12.4.5.4 If the scalar value is greater than zero (0) and less than the order, r, of the negotiated group, scalar validation succeeds */ - /* according to test plan 4.2.6, we should reject peer if scalar value is 1*/ - /* 1 < scalar < r */ - if (SAE_BN_IS_ZERO(peer_scalar) || SAE_BN_IS_ONE(peer_scalar) || - (SAE_BN_UCMP(peer_scalar, pSaeIns->order) >= 0)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): Invalid peer scalar\n", __func__)); - SAE_BN_FREE(&peer_scalar); - return MLME_UNSPECIFY_FAIL; - } - - SAE_BN_FREE(&pSaeIns->peer_commit_scalar); - pSaeIns->peer_commit_scalar = peer_scalar; - *pos += pSaeIns->prime_len; - return MLME_SUCCESS; -} - -USHORT sae_parse_commit_element(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end) -{ - USHORT res = MLME_UNSPECIFY_FAIL; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - sae_record_time_begin( - &pSaeIns->sae_cost_time.parse_commit_element_time); - - if (pSaeIns->group_op) - res = pSaeIns->group_op->sae_parse_commit_element(pSaeIns, pos, - end); - - sae_record_time_end("parse_commit_element_time", - &pSaeIns->sae_cost_time.parse_commit_element_time); - return res; -} - -UCHAR is_sae_pwd_id_element(IN UCHAR *pos, IN UCHAR *end, OUT UINT32 *len) -{ - if (!(end - pos < 3) && pos[0] == IE_WLAN_EXTENSION && pos[1] >= 1 && - end - pos - 2 >= pos[1] && pos[2] == EID_EXT_PASSWORD_IDENTIFIER) { - if (len) - *len = pos[1] - 1; - return TRUE; - } else - return FALSE; -} - -UCHAR is_sae_rejected_group_element(IN UCHAR *pos, IN UCHAR *end, - OUT UINT32 *len) -{ - if (!(end - pos < 3) && pos[0] == IE_WLAN_EXTENSION && pos[1] >= 1 && - end - pos - 2 >= pos[1] && pos[2] == EID_EXT_REJECTED_GROUP) { - if (len) - *len = pos[1] - 1; - return TRUE; - } else - return FALSE; -} - -USHORT sae_parse_password_identifier(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end, IN UCHAR is_pwd_id_only) -{ - if (!is_sae_pwd_id_element(*pos, end, &pSaeIns->peer_pwd_id_len)) { - if (is_pwd_id_only) { - pSaeIns->peer_pwd_id_len = 0; - return MLME_UNKNOWN_PASSWORD_IDENTIFIER; - } else - return MLME_SUCCESS; - } - - pSaeIns->peer_pwd_id = *pos + 3; - - /*hex_dump_with_cat_and_lvl("peer pwd id", pSaeIns->peer_pwd_id, - pSaeIns->peer_pwd_id_len, DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE);*/ - - if (pSaeIns->pwd_id_list_head != NULL && - !DlListEmpty(&pSaeIns->pwd_id_list_head->list)) { - struct pwd_id_list *list = NULL; - - DlListForEach(list, &pSaeIns->pwd_id_list_head->list, - struct pwd_id_list, list) - { - if (RTMPEqualMemory(list->pwd_id, pSaeIns->peer_pwd_id, - pSaeIns->peer_pwd_id_len)) { - pSaeIns->psk = list->pwd; - pSaeIns->pwd_id_ptr = list; - return MLME_SUCCESS; - } - } - } - - *pos = *pos + 2 + (*pos)[1]; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): pwd id search fail\n", __func__)); - - return MLME_UNKNOWN_PASSWORD_IDENTIFIER; -} - -USHORT sae_parse_rejected_groups(IN SAE_INSTANCE *pSaeIns, IN UCHAR *pos, - IN UCHAR *end) -{ - UINT32 len; - - if (!is_sae_rejected_group_element(pos, end, &len)) - return MLME_SUCCESS; - - if (len % 2) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): rejected groups len(no include EID_EXT_REJECTED_GROUP) should be 2n bytes\n", - __func__)); - return MLME_UNSPECIFY_FAIL; - } - - if (len > sizeof(pSaeIns->peer_rejected_group)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): peer_rejected_group array is not enough to store rejected group\n", - __func__)); - return MLME_UNSPECIFY_FAIL; - } - - NdisMoveMemory(pSaeIns->peer_rejected_group, pos + 3, len); - pSaeIns->peer_rejected_group_len = len; - hex_dump_with_lvl("peer_rejected_group", pSaeIns->peer_rejected_group, - len, DBG_LVL_OFF); - - return MLME_SUCCESS; -} - -USHORT sae_check_rejected_group(IN SAE_INSTANCE *pSaeIns) -{ - UCHAR i; - USHORT group; - UINT32 peer_rejected_group = 0; - - if (!pSaeIns->h2e_connect) - return MLME_SUCCESS; - else if (pSaeIns->rejected_group == 0 && - pSaeIns->peer_rejected_group_len == 0) - return MLME_SUCCESS; - else if (pSaeIns->rejected_group == 0 || - pSaeIns->peer_rejected_group_len == 0) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("rejected_group = %d, peer_rejected_group_len = %d\n", - pSaeIns->rejected_group, - pSaeIns->peer_rejected_group_len)); - return MLME_UNSPECIFY_FAIL; - } - - for (i = 0; i < pSaeIns->peer_rejected_group_len; i += 2) { - NdisMoveMemory(&group, &pSaeIns->peer_rejected_group[i], 2); - if (group >= MAX_SAE_GROUP) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s: group is larger than 32\n", __func__)); - return MLME_UNSPECIFY_FAIL; - } - peer_rejected_group |= (1 << group); - } - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s: peer_rejected_group = %x, rejected_group = %x\n", - __func__, peer_rejected_group, pSaeIns->rejected_group)); - - if (peer_rejected_group == pSaeIns->rejected_group) - return MLME_SUCCESS; - else - return MLME_UNSPECIFY_FAIL; -} - -USHORT sae_prepare_commit(IN SAE_INSTANCE *pSaeIns) -{ - USHORT res; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - sae_record_time_begin(&pSaeIns->sae_cost_time.derive_pwe_time); - - if (pSaeIns->group_op) { - if (pSaeIns->h2e_connect) - res = pSaeIns->group_op->sae_derive_pwe_pt(pSaeIns); - else - res = pSaeIns->group_op->sae_derive_pwe(pSaeIns); - } else - return MLME_UNSPECIFY_FAIL; - - sae_record_time_end("derive_pwe_time", - &pSaeIns->sae_cost_time.derive_pwe_time); - - if (res != MLME_SUCCESS) - return res; - - return sae_derive_commit(pSaeIns); -} - -USHORT sae_derive_commit(IN SAE_INSTANCE *pSaeIns) -{ - SAE_BN *mask = NULL; - USHORT res = MLME_SUCCESS; - UINT32 counter = 0; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - sae_record_time_begin( - &pSaeIns->sae_cost_time.derive_commit_scalar_time); - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[0]); - - do { - counter++; - - if (counter > 100) { - res = MLME_UNSPECIFY_FAIL; - goto end; - } - - SAE_BN_FREE(&pSaeIns->sae_rand); - pSaeIns->sae_rand = sae_gen_rand(pSaeIns); - SAE_BN_FREE(&mask); - mask = sae_gen_rand(pSaeIns); - - if (pSaeIns->own_commit_scalar == NULL) { - SAE_BN_INIT(&pSaeIns->own_commit_scalar); - - if (pSaeIns->own_commit_scalar == NULL) { - res = MLME_UNSPECIFY_FAIL; - goto end; - } - } - - /* commit-scalar = (rand + mask) modulo r */ - SAE_BN_MOD_ADD(pSaeIns->sae_rand, mask, pSaeIns->order, - &pSaeIns->own_commit_scalar); - } while (SAE_BN_IS_ZERO(pSaeIns->own_commit_scalar) || - SAE_BN_IS_ONE(pSaeIns->own_commit_scalar)); - - sae_record_time_end("derive_commit_scalar_time", - &pSaeIns->sae_cost_time.derive_commit_scalar_time); - sae_record_time_begin( - &pSaeIns->sae_cost_time.derive_commit_element_time); - - if (pSaeIns->group_info == NULL || pSaeIns->group_op == NULL || - pSaeIns->group_op->sae_derive_commit_element(pSaeIns, mask) == - FALSE) - res = MLME_UNSPECIFY_FAIL; - - sae_record_time_end("derive_commit_element_time", - &pSaeIns->sae_cost_time.derive_commit_element_time); -end: - SAE_BN_FREE(&mask); - POOL_COUNTER_CHECK_END(sae_expected_cnt[0]); - return res; -} - -USHORT sae_process_commit(IN SAE_INSTANCE *pSaeIns) -{ - UCHAR *k = NULL; - USHORT res = MLME_SUCCESS; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - sae_record_time_begin(&pSaeIns->sae_cost_time.derive_k_time); - - os_alloc_mem(NULL, (UCHAR **)&k, SAE_MAX_PRIME_LEN); - - if (pSaeIns->group_op && - (pSaeIns->group_op->sae_derive_k(pSaeIns, k) == TRUE)) { - sae_record_time_end("derive_k_time", - &pSaeIns->sae_cost_time.derive_k_time); - sae_record_time_begin(&pSaeIns->sae_cost_time.derive_pmk_time); - - if (sae_derive_key(pSaeIns, k) == TRUE) - res = MLME_SUCCESS; - else - res = MLME_UNSPECIFY_FAIL; - - sae_record_time_end("derive_pmk_time", - &pSaeIns->sae_cost_time.derive_pmk_time); - } else - res = MLME_UNSPECIFY_FAIL; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s() <==, res = %d\n", __func__, res)); - - os_free_mem(k); - return res; -} - -UCHAR sae_derive_key(IN SAE_INSTANCE *pSaeIns, IN UCHAR *k) -{ - UCHAR salt[MAX_SAE_KCK_LEN]; - UINT32 salt_len; - UCHAR keyseed[MAX_SAE_KCK_LEN]; - UCHAR *val = NULL; - UINT32 val_len = SAE_MAX_PRIME_LEN; - UCHAR keys[MAX_SAE_KCK_LEN + LEN_PMK]; - SAE_BN *tmp = NULL; - UCHAR res = TRUE; - UINT32 hash_len; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (!pSaeIns->h2e_connect) - hash_len = SHA256_DIGEST_SIZE; - else - hash_len = sae_ecc_prime_len_2_hash_len(pSaeIns->prime_len); - /* keyseed = H(salt, k) */ - /* salt is either a series of 0 octets or a list of rejected groups */ - if (pSaeIns->h2e_connect && pSaeIns->peer_rejected_group_len != 0) { - NdisCopyMemory(salt, pSaeIns->peer_rejected_group, - pSaeIns->peer_rejected_group_len); - salt_len = pSaeIns->peer_rejected_group_len; - } else { - NdisZeroMemory(salt, hash_len); - salt_len = hash_len; - } - hkdf_extract(salt, salt_len, k, pSaeIns->prime_len, keyseed, hash_len); - - hex_dump_with_lvl("keyseed:", (char *)keyseed, hash_len, - SAE_DEBUG_LEVEL); - - /* KCK || PMK = KDF-512(keyseed, "SAE KCK and PMK", - * (commit-scalar + peer-commit-scalar) modulo r) - */ - - os_alloc_mem(NULL, (UCHAR **)&val, SAE_MAX_PRIME_LEN); - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[1]); - GET_BI_INS_FROM_POOL(tmp); - SAE_BN_INIT(&tmp); - SAE_BN_MOD_ADD(pSaeIns->own_commit_scalar, pSaeIns->peer_commit_scalar, - pSaeIns->order, &tmp); - SAE_BN_BI2BIN_WITH_PAD(tmp, val, &val_len, pSaeIns->prime_len); - hex_dump_with_lvl("(commit-scalar + peer-commit-scalar) modulo r:", - (char *)val, val_len, SAE_DEBUG_LEVEL); - - if (val_len < pSaeIns->prime_len) { - SAE_BN_FREE(&tmp); - res = FALSE; - goto Free; - } - - sae_kdf_hash(keyseed, hash_len, (UINT8 *)"SAE KCK and PMK", 15, val, - val_len, keys, hash_len + LEN_PMK); - NdisCopyMemory(pSaeIns->kck, keys, hash_len); - NdisCopyMemory(pSaeIns->pmk, keys + hash_len, LEN_PMK); - hex_dump_with_lvl("kck:", (char *)pSaeIns->kck, hash_len, - SAE_DEBUG_LEVEL); - hex_dump_with_lvl("pmk:", (char *)pSaeIns->pmk, LEN_PMK, - SAE_DEBUG_LEVEL); - pSaeIns->kck_len = hash_len; -Free: - SAE_BN_RELEASE_BACK_TO_POOL(&tmp); - POOL_COUNTER_CHECK_END(sae_expected_cnt[1]); - os_free_mem(val); - return res; -} - -VOID sae_send_auth(IN RTMP_ADAPTER *pAd, IN UCHAR *own_mac, IN UCHAR *peer_mac, - IN UCHAR *bssid, IN USHORT alg, IN USHORT seq, - IN USHORT status_code, IN UCHAR *buf, IN UINT32 buf_len) -{ - HEADER_802_11 AuthHdr; - ULONG FrameLen = 0; - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==> %s(), seq = %d, statuscode = %d, own mac addr = %02x:%02x:%02x:%02x:%02x:%02x, peer mac addr = %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, seq, status_code, PRINT_MAC(own_mac), - PRINT_MAC(peer_mac))); - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - MgtMacHeaderInitExt(pAd, &AuthHdr, SUBTYPE_AUTH, 0, peer_mac, own_mac, - bssid); - - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &AuthHdr, 2, &alg, 2, &seq, 2, &status_code, buf_len, - buf, END_OF_ARGS); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); -} - -UCHAR sae_send_auth_commit(IN RTMP_ADAPTER *pAd, IN SAE_INSTANCE *pSaeIns) -{ - UCHAR *buf = NULL; - UCHAR *pos; - UCHAR *end; - UINT32 len; - USHORT status_code = MLME_SUCCESS; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("==> %s():\n", __func__)); - os_alloc_mem(pAd, &buf, SAE_COMMIT_MAX_LEN); - - if (buf == NULL) - return FALSE; - - pos = buf; - end = buf + SAE_COMMIT_MAX_LEN; - NdisZeroMemory(pos, SAE_COMMIT_MAX_LEN); - NdisMoveMemory(pos, &pSaeIns->group, 2); - pos += 2; - - if (pSaeIns->anti_clogging_token) { - NdisMoveMemory(pos, pSaeIns->anti_clogging_token, - pSaeIns->anti_clogging_token_len); - pos += pSaeIns->anti_clogging_token_len; - } - - len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(pSaeIns->own_commit_scalar, pos, &len, - pSaeIns->prime_len); - pos += len; - - if (is_sae_group_ecc(pSaeIns->group)) { - BIG_INTEGER_EC_POINT *element = - (BIG_INTEGER_EC_POINT *)pSaeIns->own_commit_element; - len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(element->x, pos, &len, - pSaeIns->prime_len); - pos += len; - len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(element->y, pos, &len, - pSaeIns->prime_len); - pos += len; - } else { - SAE_BN *element = (SAE_BN *)pSaeIns->own_commit_element; - len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(element, pos, &len, pSaeIns->prime_len); - pos += len; - } - - if (pSaeIns->pwd_id_ptr) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): carry pwd id %s, len = %d\n", __func__, - pSaeIns->pwd_id_ptr->pwd_id, - (INT)strlen(pSaeIns->pwd_id_ptr->pwd_id))); - pos[0] = IE_WLAN_EXTENSION; - pos[1] = strlen(pSaeIns->pwd_id_ptr->pwd_id) + 1; - pos[2] = EID_EXT_PASSWORD_IDENTIFIER; - NdisMoveMemory(pos + 3, pSaeIns->pwd_id_ptr->pwd_id, - strlen(pSaeIns->pwd_id_ptr->pwd_id)); - pos += strlen(pSaeIns->pwd_id_ptr->pwd_id) + 3; - } - - if (pSaeIns->h2e_connect) - status_code = MLME_SAE_HASH_TO_ELEMENT; - - sae_send_auth(pAd, pSaeIns->own_mac, pSaeIns->peer_mac, pSaeIns->bssid, - AUTH_MODE_SAE, SAE_COMMIT_SEQ, status_code, buf, - pos - buf); - os_free_mem(buf); - return TRUE; -} - -UCHAR sae_send_auth_confirm(IN RTMP_ADAPTER *pAd, IN SAE_INSTANCE *pSaeIns) -{ - UCHAR *buf = NULL; - UCHAR *pos; - UCHAR *end; - UCHAR confirm[MAX_SAE_KCK_LEN]; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - os_alloc_mem(pAd, &buf, SAE_CONFIRM_MAX_LEN); - pos = buf; - end = buf + SAE_CONFIRM_MAX_LEN; - - /* 12.4.8.6.4 the Sc counter shall be incremented (thereby setting its value to one), the protocol instance shall then - * construct a Confirm Message, transmit it to the peer - * 12.4.8.6.5 the protocol instance shall increment Sync, - * increment Sc, and transmit its Commit and Confirm (with the new Sc value) messages - * => increment send_confirm first and send comfirm msg with new sc value - */ - if (pSaeIns->send_confirm != SAE_MAX_SEND_CONFIRM) - pSaeIns->send_confirm++; - - NdisMoveMemory(pos, &pSaeIns->send_confirm, 2); - pos += 2; - - if (pSaeIns->group_op) - pSaeIns->group_op->sae_cn_confirm(pSaeIns, TRUE, confirm); - - NdisMoveMemory(pos, confirm, pSaeIns->kck_len); - hex_dump_with_lvl("confirm(pos):", (char *)pos, pSaeIns->kck_len, - SAE_DEBUG_LEVEL); - pos += pSaeIns->kck_len; - sae_send_auth(pAd, pSaeIns->own_mac, pSaeIns->peer_mac, pSaeIns->bssid, - AUTH_MODE_SAE, SAE_CONFIRM_SEQ, MLME_SUCCESS, buf, - pos - buf); - os_free_mem(buf); - return TRUE; -} - -USHORT sae_parse_confirm(IN SAE_INSTANCE *pSaeIns, IN UCHAR *msg, - IN UINT32 msg_len) -{ - UCHAR peer_confirm[MAX_SAE_KCK_LEN]; - FRAME_802_11 *Fr = (PFRAME_802_11)msg; - UCHAR *pos = &Fr->Octet[6]; - UCHAR *end = msg + msg_len; - USHORT peer_send_confirm; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - /* peer-send-confirm */ - if (end - pos < 2) - return MLME_UNSPECIFY_FAIL; - - NdisMoveMemory(&peer_send_confirm, pos, 2); - pos = pos + 2; - - /* 12.4.8.6.6 Upon receipt of a Con event, the value of send-confirm shall be checked. - * If the value is not greater than Rc or is equal to 2^16 ¡V 1, the received frame shall be silently discarded - */ - if (pSaeIns->state == SAE_ACCEPTED && - (peer_send_confirm <= pSaeIns->last_peer_sc || - peer_send_confirm == SAE_MAX_SEND_CONFIRM)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_WARN, - ("confirm fail: SAE_SILENTLY_DISCARDED due to peer_send_confirm =%d, ast_peer_sc = %d\n", - peer_send_confirm, pSaeIns->last_peer_sc)); - pSaeIns->peer_send_confirm = peer_send_confirm; - /* return SAE_SILENTLY_DISCARDED; */ - } else - pSaeIns->peer_send_confirm = peer_send_confirm; - - /* send-confirm */ - if (end - pos < pSaeIns->kck_len) - return MLME_UNSPECIFY_FAIL; - - NdisMoveMemory(peer_confirm, pos, pSaeIns->kck_len); - return sae_check_confirm(pSaeIns, peer_confirm); -} - -USHORT sae_check_confirm(IN SAE_INSTANCE *pSaeIns, IN UCHAR *peer_confirm) -{ - UCHAR verifier[MAX_SAE_KCK_LEN]; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (pSaeIns->peer_commit_element == NULL || - pSaeIns->peer_commit_scalar == NULL || - pSaeIns->own_commit_element == NULL || - pSaeIns->own_commit_scalar == NULL) - return MLME_UNSPECIFY_FAIL; - - if (pSaeIns->group_op) - pSaeIns->group_op->sae_cn_confirm(pSaeIns, FALSE, verifier); - else - return MLME_UNSPECIFY_FAIL; - - if (RTMPEqualMemory(peer_confirm, verifier, pSaeIns->kck_len)) - return MLME_SUCCESS; - else { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("peer_send_confirm = %d\n", - pSaeIns->peer_send_confirm)); - hex_dump_with_lvl("peer_confirm:", (char *)peer_confirm, - pSaeIns->kck_len, SAE_DEBUG_LEVEL2); - hex_dump_with_lvl("verifier:", (char *)verifier, - pSaeIns->kck_len, SAE_DEBUG_LEVEL2); - return MLME_UNSPECIFY_FAIL; - } -} - -SAE_BN *sae_gen_rand(IN SAE_INSTANCE *pSaeIns) -{ - UINT8 *rand = NULL; - UINT32 i; - SAE_BN *rand_bi = NULL; - UINT32 iter = 0; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (!pSaeIns->order) - return NULL; - - os_alloc_mem(NULL, (UCHAR **)&rand, SAE_MAX_PRIME_LEN); - - for (iter = 0; iter < 100; iter++) { - for (i = 0; i < pSaeIns->order_len; i++) - rand[i] = RandomByte(pSaeIns->pParentSaeCfg->pAd); - - hex_dump_with_lvl("rand:", (char *)rand, pSaeIns->order_len, - SAE_DEBUG_LEVEL); - SAE_BN_BIN2BI(rand, pSaeIns->order_len, &rand_bi); - - if (SAE_BN_IS_ZERO(rand_bi) || SAE_BN_IS_ONE(rand_bi) || - SAE_BN_UCMP(rand_bi, pSaeIns->order) >= 0) - continue; - else { - os_free_mem(rand); - return rand_bi; - } - } - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): gen rand fail\n", __func__)); - SAE_BN_FREE(&rand_bi); - os_free_mem(rand); - return NULL; -} - -INT sae_set_k_iteration(IN struct _RTMP_ADAPTER *ad, IN RTMP_STRING *arg) -{ - if (arg == NULL) - return FALSE; - ad->SaeCfg.k_iteration_var = os_str_tol(arg, 0, 10); - - return TRUE; -} - -INT sae_set_anti_clogging_th(IN struct _RTMP_ADAPTER *ad, IN RTMP_STRING *arg) -{ - if (arg == NULL) - return FALSE; - - ad->SaeCfg.sae_anti_clogging_threshold = os_str_tol(arg, 0, 10); - - return TRUE; -} - -USHORT sae_group_allowed(IN SAE_INSTANCE *pSaeIns, IN UCHAR *allowed_groups, - IN INT32 group) -{ - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s():\n", __func__)); - - if (allowed_groups) { - UINT32 i; - - for (i = 0; allowed_groups[i] > 0; i++) - if (allowed_groups[i] == group) - break; - - if (allowed_groups[i] != group) - return MLME_FINITE_CYCLIC_GROUP_NOT_SUPPORTED; - } - - if (pSaeIns->group != group) { - /* 12.4.8.6.5 the protocol instance shall verify that the finite cyclic group is the same as the previously received Commit frame. - * If not, the frame shall be silently discarded. - */ - if (pSaeIns->state == SAE_CONFIRMED) { - delete_sae_instance(pSaeIns); - return SAE_SILENTLY_DISCARDED; - } - - sae_clear_data(pSaeIns); - - if (is_sae_group_ecc(group)) - pSaeIns->group_op = &ecc_group_op; - else if (is_sae_group_ffc(group)) - pSaeIns->group_op = &ffc_group_op; - else - return MLME_FINITE_CYCLIC_GROUP_NOT_SUPPORTED; - - pSaeIns->group_op->sae_group_init(pSaeIns, - group); /* ellis exception */ - - if (pSaeIns->group_info == NULL || pSaeIns->group_op == NULL) - return MLME_UNSPECIFY_FAIL; - } - - return MLME_SUCCESS; -} - -static BIG_INTEGER_EC_POINT *sswu(IN EC_GROUP_INFO_BI *ec_group_bi, - IN SAE_BN *u) -{ - SAE_BN *m = NULL; - SAE_BN *u2 = NULL; - SAE_BN *tmp = NULL; - SAE_BN *tmp2 = NULL; - SAE_BN *tmp3 = NULL; - SAE_BN *one_bn = NULL; - SAE_BN *two_bn = NULL; - SAE_BN *t = NULL; - SAE_BN *csel_y = NULL; - SAE_BN *csel_z = NULL; - SAE_BN *x1 = NULL; /* only pointer */ - SAE_BN *x2 = NULL; - SAE_BN *y = NULL; - UCHAR one[] = { 1 }; - UCHAR two[] = { 2 }; - UCHAR has_y, has_y2; - UCHAR lsb_u, lsb_y; - BIG_INTEGER_EC_POINT *res = NULL; - - ecc_point_init(&res); - - /* m = z^2 * u^4 + z * u^2 = (z * u ^ 2) ^ 2 + (z * u ^ 2) */ - SAE_BN_MOD_SQR(u, ec_group_bi->prime, &u2); - SAE_BN_MOD_MUL(u2, ec_group_bi->z, ec_group_bi->prime, &tmp2); - SAE_BN_MOD_SQR(tmp2, ec_group_bi->prime, &tmp); - SAE_BN_MOD_ADD(tmp, tmp2, ec_group_bi->prime, &m); - - /* l = CEQ(m, 0) - * t = inverse(m), where inverse(x) is calculated as x^(p-2) modulo p - * x1 = CSEL(l, (b / (z * a) modulo p), ((-b/a) * (1 + t)) modulo p) - * where CSEL(x,y,z) operates in constant time and returns y if x is true and z otherwise. - */ - /* t = inverse(m) */ - SAE_BN_BIN2BI(two, sizeof(two), &two_bn); - SAE_BN_SUB(ec_group_bi->prime, two_bn, &tmp); - SAE_BN_MOD_EXP_MONT(m, tmp, ec_group_bi->prime, &t); - /* csel_y = b / (z * a) modulo p */ - SAE_BN_MOD_MUL(ec_group_bi->z, ec_group_bi->a, ec_group_bi->prime, - &tmp); - SAE_BN_MOD_MUL_INV(tmp, ec_group_bi->prime, &tmp2); - SAE_BN_MOD_MUL(ec_group_bi->b, tmp2, ec_group_bi->prime, &csel_y); - /* csel_z = (-b/a) * (1 + t) modulo p */ - SAE_BN_BIN2BI(one, sizeof(one), &one_bn); - SAE_BN_SUB(ec_group_bi->prime, ec_group_bi->b, &tmp); - SAE_BN_MOD_MUL_INV(ec_group_bi->a, ec_group_bi->prime, &tmp2); - SAE_BN_MOD_MUL(tmp, tmp2, ec_group_bi->prime, &tmp3); - SAE_BN_MOD_ADD(t, one_bn, ec_group_bi->prime, &tmp); - SAE_BN_MOD_MUL(tmp3, tmp, ec_group_bi->prime, &csel_z); - /* x1 = CSEL(l, (b / (z * a) modulo p), ((-b/a) * (1 + t)) modulo p) */ - if (SAE_BN_IS_ZERO(m)) { - x1 = csel_y; - csel_y = NULL; - } else { - x1 = csel_z; - csel_z = NULL; - } - - /* x2 = (z * u^2 * x1) modulo p */ - SAE_BN_MOD_MUL(ec_group_bi->z, u2, ec_group_bi->prime, &tmp); - SAE_BN_MOD_MUL(tmp, x1, ec_group_bi->prime, &x2); - - /* l = gx1 is a quadratic residue modulo p - * gx1 = (x1^3 + a * x1 + b) modulo p - * gx2 = (x2^3 + a * x2 + b) modulo p - * v = CSEL(l, gx1, gx2) - * x = CSEL(l, x1, x2) - */ - has_y = ecc_point_find_by_x(ec_group_bi, x1, &y, TRUE); - has_y2 = ecc_point_find_by_x(ec_group_bi, x2, &y, !has_y); - - if (!has_y && !has_y2) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): can not find y\n", __func__)); - ecc_point_free(&res); - goto free; - } else if (has_y) - res->x = x1; /* x1 is pointer only */ - else { - res->x = x2; - x2 = NULL; - } - - /* l = CEQ(LSB(u), LSB(y)) - * P = CSEL(l, (x,y), (x, p-y)) - * output P - */ - lsb_u = SAE_BN_IS_ODD(u); - lsb_y = SAE_BN_IS_ODD(y); - SAE_BN_SUB(ec_group_bi->prime, y, &tmp); - if (lsb_u == lsb_y) { - res->y = y; - y = NULL; - } else { - res->y = tmp; - tmp = NULL; - } - SAE_ECC_SET_Z_TO_1(res); -free: - SAE_BN_FREE(&m); - SAE_BN_FREE(&u2); - SAE_BN_FREE(&tmp); - SAE_BN_FREE(&tmp2); - SAE_BN_FREE(&tmp3); - SAE_BN_FREE(&one_bn); - SAE_BN_FREE(&two_bn); - SAE_BN_FREE(&t); - SAE_BN_FREE(&csel_y); - SAE_BN_FREE(&csel_z); - SAE_BN_FREE(&x2); - SAE_BN_FREE(&y); - - return res; -} - -/* todo: identifier case and HKDF-Extract/HKDF-Expand for group 20 */ -static BIG_INTEGER_EC_POINT *sae_derive_pt_ecc(IN USHORT group, IN UCHAR *psk, - IN CHAR *ssid, IN UCHAR ssid_len) -{ - EC_GROUP_INFO *ec_group = NULL; - EC_GROUP_INFO_BI *ec_group_bi = NULL; - UINT32 pwd_value_len, hash_len; - UCHAR pwd_seed[64]; - UCHAR pwd_value[SAE_MAX_ECC_PRIME_LEN * 2]; - SAE_BN *pwd_v = NULL; - SAE_BN *u = NULL; - BIG_INTEGER_EC_POINT *p1 = NULL; - BIG_INTEGER_EC_POINT *p2 = NULL; - BIG_INTEGER_EC_POINT *res = NULL; - - ec_group = get_ecc_group_info(group); - ec_group_bi = get_ecc_group_info_bi(group); - - /* len = olen(p) + ceil(olen(p)/2) */ - pwd_value_len = ec_group->prime_len + (ec_group->prime_len + 1) / 2; - - hash_len = sae_ecc_prime_len_2_hash_len(ec_group->prime_len); - - /* pwd-seed = HKDF-Extract(ssid, password [ || identifier ]) */ - hkdf_extract(ssid, ssid_len, psk, strlen(psk), pwd_seed, hash_len); - - /* pwd-value = HKDF-Expand(pwd-seed, "SAE Hash to Element u1 P1", len) */ - hkdf_expand(pwd_seed, hash_len, "SAE Hash to Element u1 P1", 25, - pwd_value, pwd_value_len); - - /* u1 = pwd-value modulo p */ - SAE_BN_BIN2BI(pwd_value, pwd_value_len, &pwd_v); - SAE_BN_MOD(pwd_v, ec_group_bi->prime, &u); - - /* P1 = SSWU(u1) */ - p1 = sswu(ec_group_bi, u); - if (p1 == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): gen p1 fail\n", __func__)); - goto free; - } - - /* pwd-value = HKDF-Expand(pwd-seed, "SAE Hash to Element u2 P2", len) */ - hkdf_expand(pwd_seed, hash_len, "SAE Hash to Element u2 P2", 25, - pwd_value, pwd_value_len); - - /* u2 = pwd-value modulo p */ - SAE_BN_BIN2BI(pwd_value, pwd_value_len, &pwd_v); - SAE_BN_MOD(pwd_v, ec_group_bi->prime, &u); - - /* P2 = SSWU(u2) */ - p2 = sswu(ec_group_bi, u); - if (p2 == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): gen p2 fail\n", __func__)); - goto free; - } - - /* PT = elem-op(P1, P2) */ - ecc_point_add(p1, p2, ec_group_bi, &res); -free: - SAE_BN_FREE(&pwd_v); - SAE_BN_FREE(&u); - ecc_point_free(&p1); - ecc_point_free(&p2); - - return res; -} - -static VOID *sae_derive_pt_group(IN USHORT group, IN UCHAR *psk, IN CHAR *ssid, - IN UCHAR ssid_len) -{ - if (is_sae_group_ecc(group)) - return (VOID *)sae_derive_pt_ecc(group, psk, ssid, ssid_len); - else /* ffc not support */ - return NULL; -} - -VOID sae_derive_pt(IN SAE_CFG *pSaeCfg, IN UCHAR *psk, IN CHAR *ssid, - IN UCHAR ssid_len, OUT struct sae_pt **pt_list) -{ - struct sae_pt *tmp, *tmp2; - UCHAR i; - UCHAR *allowed_groups = pSaeCfg->support_group; - - if (*pt_list != NULL) { - sae_pt_list_deinit(pt_list); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): pt_list should be null\n", __func__)); - } - os_alloc_mem(NULL, (UCHAR **)pt_list, sizeof(struct sae_pt)); - (*pt_list)->next = NULL; - - tmp = *pt_list; - tmp2 = *pt_list; - - for (i = 0; allowed_groups[i] > 0; i++) { - if (tmp2 == NULL) { - os_alloc_mem(NULL, (UCHAR **)&tmp2, - sizeof(struct sae_pt)); - tmp2->next = NULL; - tmp->next = tmp2; - tmp = tmp2; - } - tmp->group = allowed_groups[i]; - tmp->pt = (VOID *)sae_derive_pt_group(allowed_groups[i], psk, - ssid, ssid_len); - tmp2 = tmp->next; - } -} - -VOID sae_pt_list_deinit(INOUT struct sae_pt **pt_list) -{ - struct sae_pt *tmp; - struct sae_pt *tmp2 = *pt_list; - - if (*pt_list == NULL) - return; - - do { - tmp = tmp2; - tmp2 = tmp->next; - os_free_mem(tmp); - } while (tmp2); - *pt_list = NULL; -} - -UCHAR is_sae_group_ecc(IN INT32 group) -{ - switch (group) { - case 19: - case 20: - case 21: - case 25: - case 26: - case 27: - case 28: - case 29: - case 30: - return TRUE; - - default: - return FALSE; - } -} - -UCHAR is_sae_group_ffc(IN INT32 group) -{ - switch (group) { - case 1: - case 2: - case 5: - case 14: - case 15: - case 16: - case 17: - case 18: - case 22: - case 23: - case 24: - return TRUE; - - default: - return FALSE; - } -} - -VOID sae_group_init_ecc(IN SAE_INSTANCE *pSaeIns, IN INT32 group) -{ - EC_GROUP_INFO *ec_group = NULL; - EC_GROUP_INFO_BI *ec_group_bi = NULL; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - ec_group = get_ecc_group_info(group); - ec_group_bi = get_ecc_group_info_bi(group); - - if (ec_group == NULL || ec_group_bi == NULL) - return; - pSaeIns->group_info = (VOID *)ec_group; - pSaeIns->group_info_bi = (VOID *)ec_group_bi; - pSaeIns->prime = ec_group_bi->prime; - pSaeIns->prime_len = ec_group->prime_len; - pSaeIns->order = ec_group_bi->order; - pSaeIns->order_len = ec_group->order_len; - pSaeIns->group = group; -} - -VOID sae_group_init_ffc(IN SAE_INSTANCE *pSaeIns, IN INT32 group) -{ - UINT32 i; - DH_GROUP_INFO *dh_group = NULL; - DH_GROUP_INFO_BI *dh_group_bi = NULL; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - for (i = 0; i < DH_GROUP_NUM; i++) { - if (dh_groups[i].group_id == group) { - dh_group = &dh_groups[i]; - dh_group_bi = &dh_groups_bi[i]; - } - } - - if (dh_group == NULL || dh_group_bi == NULL) - return; - - if (dh_group_bi->is_init == FALSE) { - dh_group_bi->prime = NULL; - dh_group_bi->order = NULL; - dh_group_bi->generator = NULL; - SAE_BN_BIN2BI((UINT8 *)dh_group->prime, dh_group->prime_len, - &dh_group_bi->prime); - SAE_BN_BIN2BI((UINT8 *)dh_group->order, dh_group->order_len, - &dh_group_bi->order); - SAE_BN_BIN2BI((UINT8 *)dh_group->generator, - dh_group->generator_len, &dh_group_bi->generator); - } - - pSaeIns->group_info = (VOID *)dh_group; - pSaeIns->group_info_bi = (VOID *)dh_group_bi; - pSaeIns->prime = dh_group_bi->prime; - pSaeIns->prime_len = dh_group->prime_len; - pSaeIns->order = dh_group_bi->order; - pSaeIns->order_len = dh_group->order_len; - pSaeIns->group = group; -} - -VOID sae_group_deinit_ecc(IN SAE_INSTANCE *pSaeIns) -{ - BIG_INTEGER_EC_POINT *own_element = NULL; - BIG_INTEGER_EC_POINT *peer_element = NULL; - BIG_INTEGER_EC_POINT *pwe = NULL; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - own_element = (BIG_INTEGER_EC_POINT *)pSaeIns->own_commit_element; - peer_element = (BIG_INTEGER_EC_POINT *)pSaeIns->peer_commit_element; - pwe = (BIG_INTEGER_EC_POINT *)pSaeIns->pwe; - - if (own_element) - ecc_point_free(&own_element); - - if (peer_element) - ecc_point_free(&peer_element); - - if (pwe) - ecc_point_free(&pwe); -} - -VOID sae_group_deinit_ffc(IN SAE_INSTANCE *pSaeIns) -{ - SAE_BN *own_element = NULL; - SAE_BN *peer_element = NULL; - SAE_BN *pwe = NULL; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - own_element = (SAE_BN *)pSaeIns->own_commit_element; - peer_element = (SAE_BN *)pSaeIns->peer_commit_element; - pwe = (SAE_BN *)pSaeIns->pwe; - - if (own_element) - SAE_BN_FREE(&own_element); - - pSaeIns->own_commit_element = NULL; - - if (peer_element) - SAE_BN_FREE(&peer_element); - - pSaeIns->peer_commit_element = NULL; - - if (pwe) - SAE_BN_FREE(&pwe); - - pSaeIns->pwe = NULL; -} - -VOID sae_cn_confirm_ecc(IN SAE_INSTANCE *pSaeIns, - IN UCHAR is_send, /* otherwise, is verfication */ - OUT UCHAR *confirm) -{ - UCHAR own_element_bin[2 * SAE_MAX_ECC_PRIME_LEN]; - UCHAR peer_element_bin[2 * SAE_MAX_ECC_PRIME_LEN]; - UINT32 prime_len; - BIG_INTEGER_EC_POINT *own_element = - (BIG_INTEGER_EC_POINT *)pSaeIns->own_commit_element; /* ellis */ - BIG_INTEGER_EC_POINT *peer_element = - (BIG_INTEGER_EC_POINT *)pSaeIns->peer_commit_element; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - prime_len = pSaeIns->prime_len; /* ellis */ - SAE_BN_BI2BIN_WITH_PAD(own_element->x, own_element_bin, &prime_len, - pSaeIns->prime_len); - prime_len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(own_element->y, - own_element_bin + pSaeIns->prime_len, &prime_len, - pSaeIns->prime_len); - prime_len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(peer_element->x, peer_element_bin, &prime_len, - pSaeIns->prime_len); - prime_len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(peer_element->y, - peer_element_bin + pSaeIns->prime_len, - &prime_len, pSaeIns->prime_len); - - if (is_send) - sae_cn_confirm_cmm(pSaeIns, pSaeIns->own_commit_scalar, - pSaeIns->peer_commit_scalar, own_element_bin, - peer_element_bin, 2 * pSaeIns->prime_len, - pSaeIns->send_confirm, confirm); - else - sae_cn_confirm_cmm(pSaeIns, pSaeIns->peer_commit_scalar, - pSaeIns->own_commit_scalar, peer_element_bin, - own_element_bin, 2 * pSaeIns->prime_len, - pSaeIns->peer_send_confirm, confirm); -} - -VOID sae_cn_confirm_ffc(IN SAE_INSTANCE *pSaeIns, - IN UCHAR is_send, /* otherwise, is verfication */ - OUT UCHAR *confirm) -{ - UCHAR *own_element_bin = NULL; - UCHAR *peer_element_bin = NULL; - UINT32 prime_len; - SAE_BN *own_element = (SAE_BN *)pSaeIns->own_commit_element; - SAE_BN *peer_element = (SAE_BN *)pSaeIns->peer_commit_element; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()is_send = %d\n", __func__, is_send)); - os_alloc_mem(NULL, (UCHAR **)&own_element_bin, SAE_MAX_PRIME_LEN); - - if (own_element_bin == NULL) - return; - - os_alloc_mem(NULL, (UCHAR **)&peer_element_bin, SAE_MAX_PRIME_LEN); - - if (peer_element_bin == NULL) { - os_free_mem(own_element_bin); - return; - } - - prime_len = pSaeIns->prime_len; /* ellis */ - SAE_BN_BI2BIN_WITH_PAD(own_element, own_element_bin, &prime_len, - pSaeIns->prime_len); - prime_len = pSaeIns->prime_len; /* ellis */ - SAE_BN_BI2BIN_WITH_PAD(peer_element, peer_element_bin, &prime_len, - pSaeIns->prime_len); - - if (is_send) - sae_cn_confirm_cmm(pSaeIns, pSaeIns->own_commit_scalar, - pSaeIns->peer_commit_scalar, own_element_bin, - peer_element_bin, pSaeIns->prime_len, - pSaeIns->send_confirm, confirm); - else - sae_cn_confirm_cmm(pSaeIns, pSaeIns->peer_commit_scalar, - pSaeIns->own_commit_scalar, peer_element_bin, - own_element_bin, pSaeIns->prime_len, - pSaeIns->peer_send_confirm, confirm); - - os_free_mem(own_element_bin); - os_free_mem(peer_element_bin); -} - -VOID sae_cn_confirm_cmm(IN SAE_INSTANCE *pSaeIns, IN SAE_BN *scalar1, - IN SAE_BN *scalar2, IN UCHAR *element_bin1, - IN UCHAR *element_bin2, IN UINT32 element_len, - IN USHORT send_confirm, OUT UCHAR *confirm) -{ - UCHAR *msg; - UINT32 msg_len = - sizeof(send_confirm) + 2 * element_len + 2 * pSaeIns->prime_len; - UINT32 offset = 0; - UINT32 prime_len; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s(), send_confirm = %d\n", __func__, send_confirm)); - os_alloc_mem(NULL, &msg, msg_len); - - if (msg == NULL) - return; - - /* - * CN(key, X, Y, Z, ¡K) = HMAC-SHA256(key, D2OS(X) || D2OS(Y) || D2OS(Z) || ¡K) - * where D2OS() represents the data to octet string conversion functions in 12.4.7.2. - * confirm = CN(KCK, send-confirm, commit-scalar, COMMIT-ELEMENT, - * peer-commit-scalar, PEER-COMMIT-ELEMENT) - * verifier = CN(KCK, peer-send-confirm, peer-commit-scalar, - * PEER-COMMIT-ELEMENT, commit-scalar, COMMIT-ELEMENT) - */ - NdisMoveMemory(msg, &send_confirm, sizeof(send_confirm)); - offset += sizeof(send_confirm); - prime_len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(scalar1, msg + offset, &prime_len, - pSaeIns->prime_len); - offset += pSaeIns->prime_len; - NdisMoveMemory(msg + offset, element_bin1, element_len); - offset += element_len; - prime_len = pSaeIns->prime_len; - SAE_BN_BI2BIN_WITH_PAD(scalar2, msg + offset, &prime_len, - pSaeIns->prime_len); - offset += pSaeIns->prime_len; - NdisMoveMemory(msg + offset, element_bin2, element_len); - offset += element_len; - - hex_dump_with_lvl("element_bin1:", (char *)element_bin1, element_len, - SAE_DEBUG_LEVEL); - hex_dump_with_lvl("element_bin2:", (char *)element_bin2, element_len, - SAE_DEBUG_LEVEL); - hkdf_extract(pSaeIns->kck, pSaeIns->kck_len, msg, msg_len, confirm, - pSaeIns->kck_len); - hex_dump_with_lvl("confirm:", (char *)confirm, pSaeIns->kck_len, - SAE_DEBUG_LEVEL); - - os_free_mem(msg); -} - -USHORT sae_parse_commit_element_ecc(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end) -{ - SAE_BN *peer_element_x = NULL; - SAE_BN *peer_element_y = NULL; - BIG_INTEGER_EC_POINT *peer_element = NULL; - EC_GROUP_INFO_BI *ec_group_bi = - (EC_GROUP_INFO_BI *)pSaeIns->group_info_bi; - USHORT res = MLME_SUCCESS; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (*pos + 2 * pSaeIns->prime_len > end) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): not enough data in commit element\n", - __func__)); - - res = MLME_UNSPECIFY_FAIL; - goto fail; - } - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[2]); - GET_BI_INS_FROM_POOL(peer_element_x); - GET_BI_INS_FROM_POOL(peer_element_y); - - SAE_BN_BIN2BI(*pos, pSaeIns->prime_len, &peer_element_x); - SAE_BN_BIN2BI(*pos + pSaeIns->prime_len, pSaeIns->prime_len, - &peer_element_y); - hex_dump_with_lvl("peer element x:", (char *)pos, pSaeIns->prime_len, - SAE_DEBUG_LEVEL2); - hex_dump_with_lvl("peer element y:", (char *)pos + pSaeIns->prime_len, - pSaeIns->prime_len, SAE_DEBUG_LEVEL2); - /* - * For ECC groups, both the x- and ycoordinates - * of the element shall be non-negative integers less than the prime number p, and the two - * coordinates shall produce a valid point on the curve satisfying the group¡¦s curve definition, not being equal - * to the ¡§point at the infinity.¡¨ If either of those conditions does not hold, element validation fails; otherwise, - * element validation succeeds. - */ - ecc_point_init(&peer_element); - SAE_BN_COPY(peer_element_x, &peer_element->x); - SAE_BN_COPY(peer_element_y, &peer_element->y); - SAE_ECC_SET_Z_TO_1(peer_element); - - if (ecc_point_is_on_curve(ec_group_bi, peer_element) == FALSE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): is not on curve\n", __func__)); - ecc_point_free(&peer_element); - res = MLME_UNSPECIFY_FAIL; - goto fail; - } - - *pos += pSaeIns->prime_len * 2; - - pSaeIns->peer_commit_element = peer_element; -fail: - SAE_BN_RELEASE_BACK_TO_POOL(&peer_element_x); - SAE_BN_RELEASE_BACK_TO_POOL(&peer_element_y); - POOL_COUNTER_CHECK_END(sae_expected_cnt[2]); - return res; -} - -USHORT sae_parse_commit_element_ffc(IN SAE_INSTANCE *pSaeIns, IN UCHAR **pos, - IN UCHAR *end) -{ - SAE_BN *scalar_op_res = NULL; - SAE_BN *peer_commit_element = NULL; - USHORT res = MLME_UNSPECIFY_FAIL; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - if (*pos + pSaeIns->prime_len > end) - goto fail; - - SAE_BN_BIN2BI(*pos, pSaeIns->prime_len, &peer_commit_element); - hex_dump_with_lvl("peer element:", (char *)*pos, pSaeIns->prime_len, - SAE_DEBUG_LEVEL2); - - if (peer_commit_element == NULL) - goto fail; - - /* - * For FFC groups, the element shall be an integer greater than zero (0) and less than the prime number p, - * and the scalar operation of the element and the order of the group, r, shall equal one (1) modulo the prime number p - */ - /* 0 < element < p */ - if (SAE_BN_IS_ZERO(peer_commit_element) || - SAE_BN_UCMP(peer_commit_element, pSaeIns->prime) >= 0) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): invalid peer element\n", __func__)); - goto fail; - } - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[3]); - /* GET_BI_INS_FROM_POOL(scalar_op_res); */ - - /* scalar-op(r, ELEMENT) = 1 modulo p */ - SAE_BN_MOD_EXP_MONT(peer_commit_element, pSaeIns->order, pSaeIns->prime, - &scalar_op_res); - - if (!SAE_BN_IS_ONE(scalar_op_res)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): invalid peer element (scalar-op)\n", - __func__)); - goto fail; - } - - pSaeIns->peer_commit_element = peer_commit_element; - res = MLME_SUCCESS; - *pos += pSaeIns->prime_len; -fail: - if (res != MLME_SUCCESS) - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): fail\n", __func__)); - - SAE_BN_RELEASE_BACK_TO_POOL(&scalar_op_res); - POOL_COUNTER_CHECK_END(sae_expected_cnt[3]); - - if (res == MLME_UNSPECIFY_FAIL) - SAE_BN_FREE(&peer_commit_element); - - return res; -} - -UCHAR sae_derive_commit_element_ecc(IN SAE_INSTANCE *pSaeIns, IN SAE_BN *mask) -{ - BIG_INTEGER_EC_POINT *pwe = (BIG_INTEGER_EC_POINT *)pSaeIns->pwe; - BIG_INTEGER_EC_POINT *commit_element = NULL; - EC_GROUP_INFO_BI *ec_group_bi = - (EC_GROUP_INFO_BI *)pSaeIns->group_info_bi; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - /* COMMIT-ELEMENT = inverse(scalar-op(mask, PWE)) */ - if (pwe == NULL || mask == NULL) - return FALSE; - - ECC_POINT_MUL(pwe, mask, ec_group_bi, &commit_element); - - SAE_ECC_3D_to_2D(ec_group_bi, commit_element); - - if (commit_element == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): ECC_POINT_MUL fail\n", __func__)); - return FALSE; - } - - if (!ecc_point_is_on_curve(ec_group_bi, commit_element)) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("ecc_point_mul_dblandadd fail!!!!!!\n")); - return FALSE; - } - - ecc_point_inverse(commit_element, ec_group_bi->prime, &commit_element); - - if (commit_element == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): inverse fail\n", __func__)); - return FALSE; - } - - pSaeIns->own_commit_element = (VOID *)commit_element; - return TRUE; -} - -UCHAR sae_derive_commit_element_ffc(IN SAE_INSTANCE *pSaeIns, IN SAE_BN *mask) -{ - SAE_BN *commit_element = NULL; - SAE_BN *tmp = NULL; - SAE_BN *pwe = (SAE_BN *)pSaeIns->pwe; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - /* COMMIT-ELEMENT = inverse(scalar-op(mask, PWE)) */ - if (pwe == NULL || mask == NULL) - return FALSE; - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[4]); - /* GET_BI_INS_FROM_POOL(tmp); */ - - SAE_BN_INIT(&tmp); - SAE_BN_MOD_EXP_MONT(pwe, mask, pSaeIns->prime, &tmp); - /* SAE_BN_MOD_EXP_MONT(pwe, mask, pSaeIns->prime, &commit_element); */ - SAE_BN_MOD_MUL_INV(tmp, pSaeIns->prime, &commit_element); - /* SAE_BN_MOD_MUL_INV(commit_element, pSaeIns->prime, &tmp); */ - SAE_BN_FREE(&tmp); - - if (commit_element == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): inverse fail\n", __func__)); - return FALSE; - } - - pSaeIns->own_commit_element = (VOID *)commit_element; - SAE_BN_RELEASE_BACK_TO_POOL(&tmp); - POOL_COUNTER_CHECK_END(sae_expected_cnt[4]); - return TRUE; -} - -USHORT sae_derive_pwe_ecc(IN SAE_INSTANCE *pSaeIns) -{ - UCHAR counter = 0; - UCHAR k = pSaeIns->pParentSaeCfg->k_iteration_var; - UCHAR addrs[2 * MAC_ADDR_LEN]; - BIG_INTEGER_EC_POINT *res = NULL; - UCHAR base[LEN_PSK + SAE_MAX_PWD_ID + 1]; - UCHAR msg[LEN_PSK + SAE_MAX_PWD_ID + - 2]; /* sizeof(base)+sizeof(counter) */ - UINT32 base_len = strlen(pSaeIns->psk); - UINT32 msg_len; - UCHAR pwd_seed[SHA256_DIGEST_SIZE]; - UCHAR pwd_value[SAE_MAX_ECC_PRIME_LEN]; - EC_GROUP_INFO *ec_group; - EC_GROUP_INFO_BI *ec_group_bi; - SAE_BN *x = NULL; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - /* Get larger address first */ - if (RTMPCompareMemory(pSaeIns->own_mac, pSaeIns->peer_mac, - MAC_ADDR_LEN) == 1) { - COPY_MAC_ADDR(addrs, pSaeIns->own_mac); - COPY_MAC_ADDR(addrs + MAC_ADDR_LEN, pSaeIns->peer_mac); - } else { - COPY_MAC_ADDR(addrs, pSaeIns->peer_mac); - COPY_MAC_ADDR(addrs + MAC_ADDR_LEN, pSaeIns->own_mac); - } - - NdisMoveMemory(base, pSaeIns->psk, base_len); - - if (pSaeIns->pwd_id_ptr) { - NdisMoveMemory(base + base_len, pSaeIns->pwd_id_ptr->pwd_id, - strlen(pSaeIns->pwd_id_ptr->pwd_id)); - base_len += strlen(pSaeIns->pwd_id_ptr->pwd_id); - } - - hex_dump_with_lvl("base:", (char *)base, base_len, SAE_DEBUG_LEVEL2); - ec_group = (EC_GROUP_INFO *)pSaeIns->group_info; - ec_group_bi = (EC_GROUP_INFO_BI *)pSaeIns->group_info_bi; - - for (counter = 1; counter <= k || !res; counter++) { - UCHAR shift_idx; - SAE_BN *y = NULL; - UINT32 i; - UINT8 lsb_pwd_seed; - UINT8 lsb_y; - UCHAR has_y; - - if (counter == 0) { - SAE_BN_FREE(&x); - return MLME_UNSPECIFY_FAIL; - } - - /* pwd-seed = H(MAX(STA-A-MAC, STA-B-MAC) || MIN(STA-A-MAC, STA-B-MAC), - base || counter) */ - NdisMoveMemory(msg, base, base_len); - NdisMoveMemory(msg + base_len, &counter, sizeof(counter)); - msg_len = base_len + sizeof(counter); - - hkdf_extract(addrs, sizeof(addrs), msg, msg_len, pwd_seed, - sizeof(pwd_seed)); - lsb_pwd_seed = pwd_seed[SHA256_DIGEST_SIZE - 1] & BIT0; - - hex_dump_with_lvl("pwd_seed:", (char *)pwd_seed, - sizeof(pwd_seed), SAE_DEBUG_LEVEL); - /* z = len(p) - pwd-value = KDF-z(pwd-seed, ¡§SAE Hunting and Pecking¡¨, p) */ - KDF(pwd_seed, sizeof(pwd_seed), - (UINT8 *)"SAE Hunting and Pecking", 23, - (UINT8 *)ec_group->prime, ec_group->prime_len, pwd_value, - pSaeIns->prime_len); - - hex_dump_with_lvl("pwd_value:", (char *)pwd_value, - pSaeIns->prime_len, SAE_DEBUG_LEVEL); - /* pwd-value should be less than prime */ - shift_idx = ec_group->prime_len - (pSaeIns->prime_len); - - if (NdisCmpMemory(pwd_value, ec_group->prime + shift_idx, - pSaeIns->prime_len) == 1) - continue; - - /* x = pwd-value - y^2 = x^3 + ax + b */ - SAE_BN_BIN2BI(pwd_value, pSaeIns->prime_len, &x); - has_y = ecc_point_find_by_x(ec_group_bi, x, &y, (res == NULL)); - - if (has_y == FALSE) - continue; - - if (!res) { - ecc_point_init(&res); - - if (res == NULL) { - SAE_BN_FREE(&x); - SAE_BN_FREE(&y); - return MLME_UNSPECIFY_FAIL; - } - - /* if LSB(pwd-seed) = LSB(y) - * then PWE = (x, y) - * else PWE = (x, p - y) - */ - lsb_y = SAE_BN_IS_ODD(y); - res->x = x; - - if (lsb_pwd_seed == lsb_y) - res->y = y; - else { - res->y = NULL; - SAE_BN_SUB(ec_group_bi->prime, y, &res->y); - SAE_BN_FREE(&y); - } - - SAE_ECC_SET_Z_TO_1(res); - - if (DebugLevel >= DBG_LVL_TRACE) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("pwe->x\n")); - SAE_BN_PRINT(res->x); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_OFF, - ("pwe->y\n")); - SAE_BN_PRINT(res->y); - } - x = NULL; - } else { - SAE_BN_FREE(&y); - - /* base = new-random-number */ - for (i = 0; i < base_len; i++) - base[i] = - RandomByte(pSaeIns->pParentSaeCfg->pAd); - } - } - - SAE_BN_FREE(&x); - pSaeIns->pwe = (VOID *)res; - return MLME_SUCCESS; -} - -USHORT sae_derive_pwe_pt_ecc(IN SAE_INSTANCE *pSaeIns) -{ - UINT32 hash_len; - UCHAR hash[64], salt[64]; - UCHAR addrs[2 * MAC_ADDR_LEN]; - SAE_BN *val = NULL; - SAE_BN *q = NULL; - SAE_BN *one_bn = NULL; - SAE_BN *tmp = NULL; - EC_GROUP_INFO_BI *ec_group_bi; - UCHAR one[] = { 1 }; - BIG_INTEGER_EC_POINT *res = NULL; - - /* val = H(0^n, - * MAX(STA-A-MAC, STA-B-MAC) || MIN(STA-A-MAC, STA-B-MAC)) - */ - if (RTMPCompareMemory(pSaeIns->own_mac, pSaeIns->peer_mac, - MAC_ADDR_LEN) == 1) { - COPY_MAC_ADDR(addrs, pSaeIns->own_mac); - COPY_MAC_ADDR(addrs + MAC_ADDR_LEN, pSaeIns->peer_mac); - } else { - COPY_MAC_ADDR(addrs, pSaeIns->peer_mac); - COPY_MAC_ADDR(addrs + MAC_ADDR_LEN, pSaeIns->own_mac); - } - NdisZeroMemory(salt, sizeof(salt)); - hash_len = sae_ecc_prime_len_2_hash_len(pSaeIns->prime_len); - hkdf_extract(salt, hash_len, addrs, sizeof(addrs), hash, hash_len); - - SAE_BN_BIN2BI(hash, hash_len, &val); - - /* val = val modulo (q - 1) + 1 */ - ec_group_bi = (EC_GROUP_INFO_BI *)pSaeIns->group_info_bi; - SAE_BN_BIN2BI(one, sizeof(one), &one_bn); - SAE_BN_SUB(pSaeIns->order, one_bn, &q); - SAE_BN_MOD(val, q, &tmp); - SAE_BN_ADD(tmp, one_bn, &val); - - /* PWE = scalar-op(val, PT) */ - ECC_POINT_MUL((BIG_INTEGER_EC_POINT *)pSaeIns->pt, val, ec_group_bi, - &res); - - pSaeIns->pwe = (VOID *)res; - - SAE_BN_FREE(&val); - SAE_BN_FREE(&q); - SAE_BN_FREE(&one_bn); - SAE_BN_FREE(&tmp); - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): derive pt done\n", __func__)); - - return MLME_SUCCESS; -} - -USHORT sae_derive_pwe_ffc(IN SAE_INSTANCE *pSaeIns) -{ - UCHAR counter = 0; - UCHAR found = FALSE; - UCHAR addrs[2 * MAC_ADDR_LEN]; - SAE_BN *pwe = NULL; - SAE_BN *exp = NULL; - UCHAR msg[LEN_PSK + SAE_MAX_PWD_ID + - 2]; /* sizeof(base)+sizeof(counter) */ - UINT32 msg_len; - UCHAR pwd_seed[SHA256_DIGEST_SIZE]; - UCHAR *pwd_value = NULL; - SAE_BN *pwd_value_bi = NULL; - SAE_BN *tmp_bi = NULL; - DH_GROUP_INFO *dh_group; - DH_GROUP_INFO_BI *dh_group_bi; - UCHAR tmp[1]; - USHORT res; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[5]); - /* GET_BI_INS_FROM_POOL(exp); */ - /* GET_BI_INS_FROM_POOL(pwd_value_bi); */ - - /* Get larger address first */ - if (RTMPCompareMemory(pSaeIns->own_mac, pSaeIns->peer_mac, - MAC_ADDR_LEN) == 1) { - COPY_MAC_ADDR(addrs, pSaeIns->own_mac); - COPY_MAC_ADDR(addrs + MAC_ADDR_LEN, pSaeIns->peer_mac); - } else { - COPY_MAC_ADDR(addrs, pSaeIns->peer_mac); - COPY_MAC_ADDR(addrs + MAC_ADDR_LEN, pSaeIns->own_mac); - } - - hex_dump_with_lvl("psk:", (char *)pSaeIns->psk, strlen(pSaeIns->psk), - SAE_DEBUG_LEVEL); - dh_group = (DH_GROUP_INFO *)pSaeIns->group_info; - /* dh_group_bi->prime == pSaeIns->prime, dh_group_bi->order == pSaeIns->order */ - dh_group_bi = (DH_GROUP_INFO_BI *)pSaeIns->group_info_bi; - SAE_BN_INIT(&exp); - SAE_BN_INIT(&pwd_value_bi); - SAE_BN_INIT(&pwe); - SAE_BN_INIT(&tmp_bi); - - os_alloc_mem(NULL, (UCHAR **)&pwd_value, SAE_MAX_PRIME_LEN); - - for (counter = 1; counter <= 200; counter++) { - UCHAR shift_idx; - UINT32 len = 0; - /* pwd-seed = H(MAX(STA-A-MAC, STA-B-MAC) || MIN(STA-A-MAC, STA-B-MAC), - password || counter) */ - NdisMoveMemory(msg, pSaeIns->psk, strlen(pSaeIns->psk)); - len += strlen(pSaeIns->psk); - hex_dump_with_lvl("msg:", (char *)msg, strlen(pSaeIns->psk), - SAE_DEBUG_LEVEL); - if (pSaeIns->pwd_id_ptr) { - NdisMoveMemory(msg + len, pSaeIns->pwd_id_ptr->pwd_id, - strlen(pSaeIns->pwd_id_ptr->pwd_id)); - len += strlen(pSaeIns->pwd_id_ptr->pwd_id); - } - NdisMoveMemory(msg + len, &counter, sizeof(counter)); - msg_len = len + sizeof(counter); - hex_dump_with_lvl("addr:", (char *)addrs, 2 * MAC_ADDR_LEN, - SAE_DEBUG_LEVEL); - hex_dump_with_lvl("msg:", (char *)msg, msg_len, - SAE_DEBUG_LEVEL); - RT_HMAC_SHA256(addrs, sizeof(addrs), msg, msg_len, pwd_seed, - sizeof(pwd_seed)); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_TRACE, - ("%s(): z = len(p) = %d\n", __func__, - SAE_BN_GET_LEN(pSaeIns->prime))); - - hex_dump_with_lvl("pwd_seed:", (char *)pwd_seed, - SHA256_DIGEST_SIZE, SAE_DEBUG_LEVEL); - hex_dump_with_lvl("prime:", (char *)dh_group->prime, - dh_group->prime_len, SAE_DEBUG_LEVEL); - /* z = len(p) - pwd-value = KDF-z(pwd-seed, ¡§SAE Hunting and Pecking¡¨, p) */ - KDF(pwd_seed, sizeof(pwd_seed), - (UINT8 *)"SAE Hunting and Pecking", 23, - (UINT8 *)dh_group->prime, dh_group->prime_len, pwd_value, - pSaeIns->prime_len); - hex_dump_with_lvl("pwd_value:", (char *)pwd_value, - pSaeIns->prime_len, SAE_DEBUG_LEVEL); - /* pwd-value should be less than prime */ - shift_idx = dh_group->prime_len - pSaeIns->prime_len; - - if (NdisCmpMemory(pwd_value, dh_group->prime + shift_idx, - dh_group->prime_len) == 1) - continue; - - /* PWE = pwd-value^(p-1)/r modulo p */ - if (dh_group->safe_prime) { - /* - * r = (p-1)/2 => (p-1)/r = 2 - */ - tmp[0] = 2; - SAE_BN_BIN2BI(tmp, sizeof(tmp), &exp); - } else { - /* GET_BI_INS_FROM_POOL(tmp_bi); */ - tmp[0] = 1; - SAE_BN_BIN2BI(tmp, sizeof(tmp), &exp); - SAE_BN_SUB( - dh_group_bi->prime, exp, - &tmp_bi); /* ellis: SAE_BN_SUB(A, B, A) need to be fix */ - SAE_BN_MOD(tmp_bi, dh_group_bi->order, &exp); - } - - SAE_BN_BIN2BI(pwd_value, dh_group->prime_len, &pwd_value_bi); - SAE_BN_MOD_EXP_MONT(pwd_value_bi, exp, dh_group_bi->prime, - &pwe); - - /* if (PWE > 1) => found */ - if (!SAE_BN_IS_ZERO(pwe) && !SAE_BN_IS_ONE(pwe)) { - found = TRUE; - break; - } - } - - if (found) { - pSaeIns->pwe = (VOID *)pwe; - res = MLME_SUCCESS; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_INFO, - ("%s(): Success to derive PWE\n", __func__)); - } else { - SAE_BN_FREE(&pwe); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): Failed to derive PWE\n", __func__)); - res = MLME_UNSPECIFY_FAIL; - } - os_free_mem(pwd_value); - SAE_BN_RELEASE_BACK_TO_POOL(&exp); - SAE_BN_RELEASE_BACK_TO_POOL(&pwd_value_bi); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp_bi); - POOL_COUNTER_CHECK_END(sae_expected_cnt[5]); - return res; -} - -UCHAR sae_derive_k_ecc(IN SAE_INSTANCE *pSaeIns, OUT UCHAR *k) -{ - BIG_INTEGER_EC_POINT *K = NULL; - BIG_INTEGER_EC_POINT *pwe = (BIG_INTEGER_EC_POINT *)pSaeIns->pwe; - BIG_INTEGER_EC_POINT *peer_commit_element = - (BIG_INTEGER_EC_POINT *)pSaeIns->peer_commit_element; - EC_GROUP_INFO_BI *ec_group_bi = - (EC_GROUP_INFO_BI *)pSaeIns->group_info_bi; - UINT32 len = SAE_MAX_ECC_PRIME_LEN; - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - /* - * K = scalar-op(rand, (elem-op(scalar-op(peer-commit-scalar, PWE), - * PEER-COMMIT-ELEMENT))) - */ - ECC_POINT_MUL(pwe, pSaeIns->peer_commit_scalar, ec_group_bi, &K); - ecc_point_add(K, peer_commit_element, ec_group_bi, &K); - ECC_POINT_MUL(K, pSaeIns->sae_rand, ec_group_bi, &K); - - SAE_ECC_3D_to_2D(ec_group_bi, K); - - /* If K is point-at-infinity, reject. */ - if (K == NULL) { - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): K should not be point-at-infinity\n", - __func__)); - return FALSE; - } - - /* k = F(K) (= x coordinate) */ - SAE_BN_BI2BIN_WITH_PAD(K->x, k, &len, pSaeIns->prime_len); - hex_dump_with_lvl("k:", (char *)k, len, SAE_DEBUG_LEVEL2); - ecc_point_free(&K); - return TRUE; -} - -UCHAR sae_derive_k_ffc(IN SAE_INSTANCE *pSaeIns, OUT UCHAR *k) -{ - SAE_BN *K = NULL; - SAE_BN *tmp = NULL; - SAE_BN *tmp2 = NULL; - SAE_BN *pwe = NULL; - UINT32 len = SAE_MAX_PRIME_LEN; - UCHAR res = TRUE; - - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_LOUD, - ("==> %s()\n", __func__)); - - POOL_COUNTER_CHECK_BEGIN(sae_expected_cnt[6]); - /* GET_BI_INS_FROM_POOL(tmp); */ - /* GET_BI_INS_FROM_POOL(tmp2); */ - /* GET_BI_INS_FROM_POOL(K); */ - - /* - * K = scalar-op(rand, (elem-op(scalar-op(peer-commit-scalar, PWE), - * PEER-COMMIT-ELEMENT))) - * the K should be scalar-op((rand + peer-rand) modulo r, pwe) - */ - pwe = (SAE_BN *)pSaeIns->pwe; - SAE_BN_INIT(&K); - SAE_BN_INIT(&tmp); - SAE_BN_INIT(&tmp2); - SAE_BN_MOD_EXP_MONT(pwe, pSaeIns->peer_commit_scalar, pSaeIns->prime, - &tmp); - SAE_BN_MOD_MUL(tmp, (SAE_BN *)pSaeIns->peer_commit_element, - pSaeIns->prime, &tmp2); - SAE_BN_MOD_EXP_MONT(tmp2, pSaeIns->sae_rand, pSaeIns->prime, &K); - - /* If K is identity element (one), reject. */ - if (SAE_BN_IS_ONE(K)) { - SAE_BN_FREE(&K); - MTWF_LOG(DBG_CAT_SEC, CATSEC_SAE, DBG_LVL_ERROR, - ("%s(): K should not be one\n", __func__)); - res = FALSE; - goto Free; - } - - /* k = F(K) (= x coordinate) */ - SAE_BN_BI2BIN_WITH_PAD(K, k, &len, pSaeIns->prime_len); - hex_dump_with_lvl("k:", (char *)k, len, SAE_DEBUG_LEVEL); -Free: - SAE_BN_RELEASE_BACK_TO_POOL(&K); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp); - SAE_BN_RELEASE_BACK_TO_POOL(&tmp2); - POOL_COUNTER_CHECK_END(sae_expected_cnt[6]); - return TRUE; -} - -USHORT sae_reflection_check_ecc(IN SAE_INSTANCE *pSaeIns) -{ - BIG_INTEGER_EC_POINT *own_commit_element = - (BIG_INTEGER_EC_POINT *)pSaeIns->own_commit_element; - BIG_INTEGER_EC_POINT *peer_commit_element = - (BIG_INTEGER_EC_POINT *)pSaeIns->peer_commit_element; - - if (!pSaeIns->own_commit_scalar || - (SAE_BN_UCMP(pSaeIns->own_commit_scalar, - pSaeIns->peer_commit_scalar) != 0) || - !own_commit_element || - (SAE_BN_UCMP(own_commit_element->x, peer_commit_element->x) != 0) || - (SAE_BN_UCMP(own_commit_element->y, peer_commit_element->y) != 0)) - return MLME_SUCCESS; - else - return SAE_SILENTLY_DISCARDED; -} - -USHORT sae_reflection_check_ffc(IN SAE_INSTANCE *pSaeIns) -{ - if (!pSaeIns->own_commit_scalar || - (SAE_BN_UCMP(pSaeIns->own_commit_scalar, - pSaeIns->peer_commit_scalar) != 0) || - !pSaeIns->own_commit_element || - (SAE_BN_UCMP(pSaeIns->own_commit_element, - pSaeIns->peer_commit_element) != 0)) - return MLME_SUCCESS; - else - return SAE_SILENTLY_DISCARDED; -} -#endif /* DOT11_SAE_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/Makefile b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/Makefile deleted file mode 100644 index 5534c46a58..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -all: - gcc bin2h.c -o bin2h -clean: - rm -f *.o bin2h diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/auto_build_kernel_4_4.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/auto_build_kernel_4_4.sh deleted file mode 100644 index f8d508ef2a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/auto_build_kernel_4_4.sh +++ /dev/null @@ -1,153 +0,0 @@ -if [ "${1}" == "AP" ]; then - echo "Wifi-Prebuild: wifi mode is AP" - wifi_mode=AP -elif [ "${1}" == "STA" ]; then - echo "Wifi-Prebuild: wifi mode is STA" - wifi_mode=STA -else - echo "Wifi-Prebuild: wifi mode is not specified, default wifi mode is AP" - wifi_mode=AP -fi - -if [ -d wifi_driver ]; then - echo "Wifi-Prebuild: kernel-4.4.x wifi driver pre-build" - mkdir -p mt_wifi_ap - mkdir -p mt_wifi_sta - cp -a wifi_driver/os/linux/Kconfig.mt_wifi_ap ./mt_wifi_ap/Kconfig - cp -a wifi_driver/os/linux/Makefile.mt_wifi_ap ./mt_wifi_ap/Makefile - cp -a wifi_driver/os/linux/Kconfig.mt_wifi_sta ./mt_wifi_sta/Kconfig - cp -a wifi_driver/os/linux/Makefile.mt_wifi_sta ./mt_wifi_sta/Makefile - cp -a wifi_driver/os/linux/Kconfig.mt_wifi_4_4 wifi_driver/embedded/Kconfig -# ln -sf ../../../../../proprietary_driver/drivers/wifi_utility wifi_utility - if [ -d mt_wifi ]; then - rm -rf mt_wifi - fi - mv wifi_driver mt_wifi - echo "Wifi-Prebuild: build 7622 binary" - RT28xx_DIR=./mt_wifi - CHIPSET=mt7622 - RT28xx_MODE=${wifi_mode} - HAS_WOW_SUPPORT=n - HAS_FPGA_MODE=n - HAS_RX_CUT_THROUGH=n - RT28xx_BIN_DIR=. - export RT28xx_DIR CHIPSET RT28xx_MODE HAS_WOW_SUPPORT HAS_FPGA_MODE HAS_RX_CUT_THROUGH RT28xx_BIN_DIR - make -C mt_wifi/embedded build_tools - ./mt_wifi/embedded/tools/bin2h - make -C mt_wifi/embedded build_sku_tables - ./mt_wifi/txpwr/dat2h - echo "Wifi-Prebuild: build 7615 binary" - RT28xx_DIR=./mt_wifi - CHIPSET=mt7615 - RT28xx_MODE=${wifi_mode} - HAS_WOW_SUPPORT=n - HAS_FPGA_MODE=n - HAS_RX_CUT_THROUGH=n - RT28xx_BIN_DIR=. - export RT28xx_DIR CHIPSET RT28xx_MODE HAS_WOW_SUPPORT HAS_FPGA_MODE HAS_RX_CUT_THROUGH RT28xx_BIN_DIR - ./mt_wifi/embedded/tools/bin2h -#Makefile modify for drivers/net/wireless/mediatek/Makefile -if grep -q CONFIG_MT_AP_SUPPORT Makefile; then - echo "Wifi-Prebuild: Makefile already modified. Skip." -else -# echo "obj-y += wifi_utility/" >> Makefile - echo "obj-\$(CONFIG_MT_AP_SUPPORT) += mt_wifi_ap/" >> Makefile - echo "obj-\$(CONFIG_MT_STA_SUPPORT) += mt_wifi_sta/" >> Makefile -fi -#Kconfig modify for drivers/net/wireless/mediatek/Kconfig -if grep -q WIFI_DRIVER Kconfig; then - echo "Wifi-Prebuild: Kconfig already modified. Skip." -else -sed -i 's/endif # WL_MEDIATEK/\ -menuconfig WIFI_DRIVER\ - bool "WiFi Driver Support"\ -\ -if WIFI_DRIVER\ -\ -choice\ - prompt "Choose First WiFi Interface"\ - config FIRST_IF_NONE\ - bool "None"\ -\ - config FIRST_IF_MT7615E\ - bool "MT7615E"\ - select WIFI_MT_MAC\ - select MT_MAC\ - select CHIP_MT7615E\ -\ - config FIRST_IF_MT7622\ - bool "MT7622"\ - select WIFI_MT_MAC\ - select MT_MAC\ - select CHIP_MT7622\ -\ -endchoice\ -\ -choice\ - prompt "Choose Second WiFi Interface"\ - config SECOND_IF_NONE\ - bool "None"\ -\ - config SECOND_IF_MT7615E\ - bool "MT7615E"\ - select WIFI_MT_MAC\ - select CHIP_MT7615E\ - select MULTI_INF_SUPPORT\ -\ -endchoice\ -\ -choice\ - prompt "Choose Third WiFi Interface"\ - config THIRD_IF_NONE\ - bool "None"\ -\ - config THIRD_IF_MT7615E\ - bool "MT7615E"\ - select WIFI_MT_MAC\ - select CHIP_MT7615E\ - select MULTI_INF_SUPPORT\ -\ -endchoice\ -\ -config RT_FIRST_CARD\ - int\ - depends on ! FIRST_IF_NONE\ - default 7615 if FIRST_IF_MT7615E\ - default 7622 if FIRST_IF_MT7622\ -\ -config RT_SECOND_CARD\ - int\ - depends on ! SECOND_IF_NONE\ - default 7615 if SECOND_IF_MT7615E\ -\ -config RT_THIRD_CARD\ - int\ - depends on ! THIRD_IF_NONE\ - default 7615 if THIRD_IF_MT7615E\ -\ -config RT_FIRST_IF_RF_OFFSET\ - hex\ - depends on ! FIRST_IF_NONE\ - default 0xc0000\ -\ -config RT_SECOND_IF_RF_OFFSET\ - hex\ - depends on ! SECOND_IF_NONE\ - default 0xc8000\ -\ -config RT_THIRD_IF_RF_OFFSET\ - hex\ - depends on ! THIRD_IF_NONE\ - default 0xd0000\ -\ -source \"drivers\/net\/wireless\/mediatek\/mt_wifi\/embedded\/Kconfig\"\ -endif # WIFI_DRIVER\ -endif # WL_MEDIATEK\ -\ -/g' Kconfig -fi - -#source "drivers/net/wireless/mediatek/mt_wifi/embedded/Kconfig"\ -else - exit 1 -fi diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/bin2h.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/bin2h.c deleted file mode 100644 index 2de12ed23d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/bin2h.c +++ /dev/null @@ -1,493 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#include -#include -#include - -#define PATH_OF_MCU_BIN_IN "/bin/" -#define PATH_OF_MCU_BIN_OUT "/embedded/include/mcu/" -#define PATH_OF_EEPROM_IN "/bin/" -#define PATH_OF_EEPROM_OUT "/embedded/include/eeprom/" -#define PATH_OF_ROM_PATCH_IN "/bin/" -#define PATH_OF_ROM_PATCH_OUT "/embedded/include/mcu/" - -int bin2h(char *infname, char *outfname, char *fw_name, const char *mode) -{ - FILE *infile, *outfile; - unsigned char c; - int i = 0; - - infile = fopen(infname, "r"); - - if (infile == (FILE *)NULL) { - printf("Can't read file %s\n", infname); - return -1; - } - - outfile = fopen(outfname, mode); - - if (outfile == (FILE *)NULL) { - printf("Can't open write file %s\n", outfname); - fclose(infile); - return -1; - } - - fputs("/* AUTO GEN PLEASE DO NOT MODIFY IT */\n", outfile); - fputs("/* AUTO GEN PLEASE DO NOT MODIFY IT */\n", outfile); - fputs("\n", outfile); - fputs("\n", outfile); - fprintf(outfile, "UCHAR %s[] = {\n", fw_name); - - while (1) { - char cc[3]; - - c = getc(infile); - - if (feof(infile)) - break; - - memset(cc, 0, 2); - - if (i >= 16) { - fputs("\n", outfile); - i = 0; - } - - if (i == 0) - fputs("\t", outfile); - else if (i < 16) - fputs(" ", outfile); - - fputs("0x", outfile); - sprintf(cc, "%02x", c); - fputs(cc, outfile); - fputs(",", outfile); - i++; - } - - fputs("\n};\n", outfile); - fclose(infile); - fclose(outfile); - - return 1; -} - -int main(int argc, char *argv[]) -{ - char infname[512], ine2pname[512], in_rom_patch[512], - in_rom_patch_e2[512], in_rom_patch_e3[512]; - char infname1[512]; - char infname_e2[512], infname_e3[512]; - char outfname[512], oute2pname[512], out_rom_patch[512], - out_rom_patch_e2[512], out_rom_patch_e3[512]; - char outfname1[512]; - char outfname_e2[512], outfname_e3[512]; - char chipsets[1024]; - char fpga_mode[20], rx_cut_through_mode[20]; - char fw_name[128], e2p_name[128], rom_patch_name[128], - rom_patch_name_e2[128], rom_patch_name_e3[128]; - char fw_name_e2[128], fw_name_e3[128]; - char fw_name1[128]; - char *rt28xxdir, *rt28xxbin_dir; - char *chipset; - char *rt28xx_mode; - char *fpga, *rx_cut_through; - int is_bin2h_fw = 0, is_bin2h_rom_patch = 0, is_bin2h_e2p = 0, - is_bin2h_rom_patch_e2 = 0, is_bin2h_rom_patch_e3 = 0; - char ine2pname2[512], ine2pname3[512], e2p_name2[128], e2p_name3[128]; - - rt28xxdir = (char *)getenv("RT28xx_DIR"); - rt28xxbin_dir = (char *)getenv("RT28xx_BIN_DIR"); - chipset = (char *)getenv("CHIPSET"); - fpga = (char *)getenv("HAS_FPGA_MODE"); - rx_cut_through = (char *)getenv("HAS_RX_CUT_THROUGH"); - rt28xx_mode = (char *)getenv("RT28xx_MODE"); - - if (!rt28xxdir) { - printf("Environment value \"RT28xx_DIR\" not export\n"); - return -1; - } - - if (!rt28xxbin_dir) { - printf("Environment value \"RT28xx_BIN_DIR\" not export\n"); - return -1; - } - - if (!chipset) { - printf("Environment value \"CHIPSET\" not export\n"); - return -1; - } - - if (rt28xx_mode) - printf("Build %s %s\n", chipset, rt28xx_mode); - - memset(chipsets, 0, sizeof(chipsets)); - memcpy(chipsets, chipset, strlen(chipset)); - chipsets[strlen(chipset)] = '\0'; - - if (!fpga) { - printf("Environment value \"HAS_FPGA_MODE\" not export\n"); - return -1; - } - - if (strlen(fpga) > (sizeof(fpga_mode) - 1)) { - printf("Environment value \"HAS_FPGA_MODE\" is too long, need less than 20\n"); - return -1; - } - - memset(fpga_mode, 0, sizeof(fpga_mode)); - memcpy(fpga_mode, fpga, strlen(fpga)); - fpga_mode[strlen(fpga)] = '\0'; - - if (!rx_cut_through) { - printf("Environment value \"HAS_RX_CUT_THROUGH\" not export\n"); - return -1; - } - - if (strlen(rx_cut_through) > (sizeof(rx_cut_through_mode) - 1)) { - printf("Environment value \"HAS_RX_CUT_THROUGH\" is too long, need less than 20\n"); - return -1; - } - - memcpy(rx_cut_through_mode, rx_cut_through, strlen(rx_cut_through)); - rx_cut_through_mode[strlen(rx_cut_through)] = '\0'; - - if (strlen(rt28xxdir) > (sizeof(infname) - 100)) { - printf("Environment value \"RT28xx_DIR\" is too long!\n"); - return -1; - } - - if (strlen(rt28xxbin_dir) > (sizeof(infname) - 100)) { - printf("Environment value \"RT28xx_BIN_DIR\" is too long!\n"); - return -1; - } - - chipsets[strlen(chipset)] = '\0'; - chipset = strtok(chipsets, " "); - - while (chipset != NULL) { - printf("chipset = %s\n", chipset); - memset(infname, 0, 512); - memset(infname_e2, 0, 512); - memset(infname_e3, 0, 512); - memset(infname1, 0, 512); - memset(ine2pname, 0, 512); - memset(ine2pname2, 0, 512); - memset(ine2pname3, 0, 512); - memset(outfname, 0, 512); - memset(outfname_e2, 0, 512); - memset(outfname_e3, 0, 512); - memset(outfname1, 0, 512); - memset(oute2pname, 0, 512); - memset(fw_name, 0, 128); - memset(fw_name_e2, 0, 128); - memset(fw_name_e3, 0, 128); - memset(fw_name1, 0, 128); - memset(e2p_name, 0, 128); - memset(e2p_name2, 0, 128); - memset(e2p_name3, 0, 128); - memset(in_rom_patch, 0, 512); - memset(in_rom_patch_e2, 0, 512); - memset(in_rom_patch_e3, 0, 512); - memset(out_rom_patch, 0, 512); - memset(out_rom_patch_e2, 0, 512); - memset(out_rom_patch_e3, 0, 512); - memset(rom_patch_name, 0, 128); - memset(rom_patch_name_e2, 0, 128); - memset(rom_patch_name_e3, 0, 128); - strcat(infname, rt28xxbin_dir); - strcat(infname_e2, rt28xxbin_dir); - strcat(infname_e3, rt28xxbin_dir); - strcat(infname1, rt28xxbin_dir); - strcat(ine2pname, rt28xxbin_dir); - strcat(in_rom_patch, rt28xxbin_dir); - strcat(in_rom_patch_e2, rt28xxbin_dir); - strcat(in_rom_patch_e3, rt28xxbin_dir); - strcat(outfname, rt28xxdir); - strcat(outfname_e2, rt28xxdir); - strcat(outfname_e3, rt28xxdir); - strcat(outfname1, rt28xxdir); - strcat(oute2pname, rt28xxdir); - strcat(out_rom_patch, rt28xxdir); - strcat(out_rom_patch_e2, rt28xxdir); - strcat(out_rom_patch_e3, rt28xxdir); - is_bin2h_fw = 0; - is_bin2h_rom_patch = 0; - is_bin2h_e2p = 0; - strcat(infname, PATH_OF_MCU_BIN_IN); - strcat(infname_e2, PATH_OF_MCU_BIN_IN); - strcat(infname_e3, PATH_OF_MCU_BIN_IN); - strcat(outfname, PATH_OF_MCU_BIN_OUT); - strcat(outfname_e2, PATH_OF_MCU_BIN_OUT); - strcat(outfname_e3, PATH_OF_MCU_BIN_OUT); - strcat(ine2pname, PATH_OF_EEPROM_IN); - strcat(oute2pname, PATH_OF_EEPROM_OUT); - strcat(in_rom_patch, PATH_OF_ROM_PATCH_IN); - strcat(in_rom_patch_e2, PATH_OF_ROM_PATCH_IN); - strcat(in_rom_patch_e3, PATH_OF_ROM_PATCH_IN); - strcat(out_rom_patch, PATH_OF_ROM_PATCH_OUT); - strcat(out_rom_patch_e2, PATH_OF_ROM_PATCH_OUT); - strcat(out_rom_patch_e3, PATH_OF_ROM_PATCH_OUT); - strcat(infname1, PATH_OF_MCU_BIN_IN); - strcat(outfname1, PATH_OF_MCU_BIN_OUT); - - /* For bin input, select chipset folder inside /bin */ - strcat(infname, chipset); - strcat(infname_e2, chipset); - strcat(infname_e3, chipset); - strcat(infname1, chipset); - strcat(ine2pname, chipset); - strcat(in_rom_patch, chipset); - strcat(in_rom_patch_e2, chipset); - strcat(in_rom_patch_e3, chipset); - strcat(infname, "/"); - strcat(infname_e2, "/"); - strcat(infname_e3, "/"); - strcat(infname1, "/"); - strcat(ine2pname, "/"); - strcat(in_rom_patch, "/"); - strcat(in_rom_patch_e2, "/"); - strcat(in_rom_patch_e3, "/"); - - if (strncmp(chipset, "mt7615", 7) == 0) { - strcat(in_rom_patch, "mt7615_patch_e1_hdr.bin"); - strcat(out_rom_patch, "mt7615_rom_patch_e1.h"); - strcat(rom_patch_name, "mt7615_rom_patch_e1"); - strcat(in_rom_patch_e3, - "mt7615_patch_e3_hdr.bin"); /* mt7615_patch_e3_hdr.bin */ - strcat(out_rom_patch_e3, "mt7615_rom_patch.h"); - strcat(rom_patch_name_e3, "mt7615_rom_patch"); - - if ((strncmp(fpga, "y", 1) == 0)) - strcat(infname, - "WIFI_RAM_CODE_MT7615_FPGA.bin"); - else { - strcat(infname, "WIFI_RAM_CODE_MT7615_E1.bin"); - strcat(infname_e3, "WIFI_RAM_CODE_MT7615.bin"); - } - - strcat(outfname_e3, "mt7615_firmware.h"); - strcat(fw_name_e3, "MT7615_FirmwareImage"); - strcat(outfname, "mt7615_firmware_e1.h"); - strcat(fw_name, "MT7615_FirmwareImage_E1"); - - if ((strncmp(rx_cut_through, "y", 1) == 0)) - strcat(infname1, "MT7615_cr4.bin"); - else - strcat(infname1, "MT7615_cr4_noReOrdering.bin"); - - strcat(outfname1, "mt7615_cr4_firmware.h"); - strcat(fw_name1, "MT7615_CR4_FirmwareImage"); - is_bin2h_rom_patch = 1; - is_bin2h_rom_patch_e3 = 1; - is_bin2h_fw = 1; - /* iPAiLNA */ - strncpy(ine2pname2, ine2pname, 512); - strncpy(ine2pname3, ine2pname, 512); - strcat(e2p_name, "MT7615_E2PImage1_iPAiLNA"); - strcat(e2p_name2, "MT7615_E2PImage2_iPAiLNA"); - strcat(e2p_name3, "MT7615_E2PImage3_iPAiLNA"); - strcat(ine2pname, "iPAiLNA/MT7615_EEPROM.bin"); - strcat(ine2pname2, "iPAiLNA/MT7615_EEPROM2.bin"); - strcat(ine2pname3, "iPAiLNA/MT7615_EEPROM3.bin"); - strcat(oute2pname, "mt7615_e2p_iPAiLNA.h"); - bin2h(ine2pname, oute2pname, e2p_name, "w"); - bin2h(ine2pname2, oute2pname, e2p_name2, "a"); - bin2h(ine2pname3, oute2pname, e2p_name3, "a"); - /* iPAeLNA */ - memset(ine2pname, 0, 512); - memset(ine2pname2, 0, 512); - memset(ine2pname3, 0, 512); - memset(oute2pname, 0, 512); - memset(e2p_name, 0, 128); - memset(e2p_name2, 0, 128); - memset(e2p_name3, 0, 128); - strcat(ine2pname, rt28xxbin_dir); - strcat(ine2pname, PATH_OF_EEPROM_IN); - strcat(ine2pname, chipset); - strcat(ine2pname, "/"); - strncpy(ine2pname2, ine2pname, 512); - strncpy(ine2pname3, ine2pname, 512); - strcat(e2p_name, "MT7615_E2PImage1_iPAeLNA"); - strcat(e2p_name2, "MT7615_E2PImage2_iPAeLNA"); - strcat(e2p_name3, "MT7615_E2PImage3_iPAeLNA"); - strcat(ine2pname, "iPAeLNA/MT7615_EEPROM.bin"); - strcat(ine2pname2, "iPAeLNA/MT7615_EEPROM2.bin"); - strcat(ine2pname3, "iPAeLNA/MT7615_EEPROM3.bin"); - strcat(oute2pname, rt28xxdir); - strcat(oute2pname, PATH_OF_EEPROM_OUT); - strcat(oute2pname, "mt7615_e2p_iPAeLNA.h"); - bin2h(ine2pname, oute2pname, e2p_name, "w"); - bin2h(ine2pname2, oute2pname, e2p_name2, "a"); - bin2h(ine2pname3, oute2pname, e2p_name3, "a"); - /* ePAeLNA */ - memset(ine2pname, 0, 512); - memset(ine2pname2, 0, 512); - memset(ine2pname3, 0, 512); - memset(oute2pname, 0, 512); - memset(e2p_name, 0, 128); - memset(e2p_name2, 0, 128); - memset(e2p_name3, 0, 128); - strcat(ine2pname, rt28xxbin_dir); - strcat(ine2pname, PATH_OF_EEPROM_IN); - strcat(ine2pname, chipset); - strcat(ine2pname, "/"); - strncpy(ine2pname2, ine2pname, 512); - strncpy(ine2pname3, ine2pname, 512); - strcat(e2p_name, "MT7615_E2PImage1_ePAeLNA"); - strcat(e2p_name2, "MT7615_E2PImage2_ePAeLNA"); - strcat(e2p_name3, "MT7615_E2PImage3_ePAeLNA"); - strcat(ine2pname, "ePAeLNA/MT7615_EEPROM.bin"); - strcat(ine2pname2, "ePAeLNA/MT7615_EEPROM2.bin"); - strcat(ine2pname3, "ePAeLNA/MT7615_EEPROM3.bin"); - strcat(oute2pname, rt28xxdir); - strcat(oute2pname, PATH_OF_EEPROM_OUT); - strcat(oute2pname, "mt7615_e2p_ePAeLNA.h"); - bin2h(ine2pname, oute2pname, e2p_name, "w"); - bin2h(ine2pname2, oute2pname, e2p_name2, "a"); - bin2h(ine2pname3, oute2pname, e2p_name3, "a"); - /* ePAiLNA */ - memset(ine2pname, 0, 512); - memset(ine2pname2, 0, 512); - memset(ine2pname3, 0, 512); - memset(oute2pname, 0, 512); - memset(e2p_name, 0, 128); - memset(e2p_name2, 0, 128); - memset(e2p_name3, 0, 128); - strcat(ine2pname, rt28xxbin_dir); - strcat(ine2pname, PATH_OF_EEPROM_IN); - strcat(ine2pname, chipset); - strcat(ine2pname, "/"); - strncpy(ine2pname2, ine2pname, 512); - strncpy(ine2pname3, ine2pname, 512); - strcat(e2p_name, "MT7615_E2PImage1_ePAiLNA"); - strcat(e2p_name2, "MT7615_E2PImage2_ePAiLNA"); - strcat(e2p_name3, "MT7615_E2PImage3_ePAiLNA"); - strcat(ine2pname, "ePAiLNA/MT7615_EEPROM.bin"); - strcat(ine2pname2, "ePAiLNA/MT7615_EEPROM2.bin"); - strcat(ine2pname3, "ePAiLNA/MT7615_EEPROM3.bin"); - strcat(oute2pname, rt28xxdir); - strcat(oute2pname, PATH_OF_EEPROM_OUT); - strcat(oute2pname, "mt7615_e2p_ePAiLNA.h"); - bin2h(ine2pname, oute2pname, e2p_name, "w"); - bin2h(ine2pname2, oute2pname, e2p_name2, "a"); - bin2h(ine2pname3, oute2pname, e2p_name3, "a"); - /* is_bin2h_e2p = 1; //b2h is already done */ - } else if (strncmp(chipset, "mt7622", 7) == 0) { - strcat(in_rom_patch, "mt7622_patch_e1_hdr.bin"); - strcat(out_rom_patch, "mt7622_rom_patch_e1.h"); - strcat(rom_patch_name, "mt7622_rom_patch_e1"); - strcat(in_rom_patch_e2, "mt7622_patch_e2_hdr.bin"); - strcat(out_rom_patch_e2, "mt7622_rom_patch_e2.h"); - strcat(rom_patch_name_e2, "mt7622_rom_patch_e2"); - - if ((strncmp(fpga, "y", 1) == 0)) - strcat(infname, - "WIFI_RAM_CODE_MT7622_FPGA.bin"); - else { - strcat(infname, "WIFI_RAM_CODE_MT7622.bin"); - } - strcat(infname_e2, "WIFI_RAM_CODE_MT7622_E2.bin"); - - strcat(outfname, "mt7622_firmware.h"); - strcat(outfname_e2, "mt7622_firmware_e2.h"); - strcat(fw_name, "MT7622_FirmwareImage_E1"); - strcat(fw_name_e2, "MT7622_FirmwareImage_E2"); - is_bin2h_fw = 1; - is_bin2h_rom_patch = 1; - is_bin2h_rom_patch_e2 = 1; - - /* iPAiLNA */ - strcat(e2p_name, "MT7622_E2PImage_iPAiLNA"); - strcat(ine2pname, "iPAiLNA/MT7622_EEPROM.bin"); - strcat(oute2pname, "mt7622_e2p_iPAiLNA.h"); - bin2h(ine2pname, oute2pname, e2p_name, "w"); - /* iPAeLNA */ - memset(ine2pname, 0, 512); - memset(oute2pname, 0, 512); - memset(e2p_name, 0, 128); - strcat(ine2pname, rt28xxbin_dir); - strcat(ine2pname, PATH_OF_EEPROM_IN); - strcat(ine2pname, chipset); - strcat(ine2pname, "/"); - strcat(e2p_name, "MT7622_E2PImage_iPAeLNA"); - strcat(ine2pname, "iPAeLNA/MT7622_EEPROM.bin"); - strcat(oute2pname, rt28xxdir); - strcat(oute2pname, PATH_OF_EEPROM_OUT); - strcat(oute2pname, "mt7622_e2p_iPAeLNA.h"); - bin2h(ine2pname, oute2pname, e2p_name, "w"); - /* ePAeLNA */ - memset(ine2pname, 0, 512); - memset(oute2pname, 0, 512); - memset(e2p_name, 0, 128); - strcat(ine2pname, rt28xxbin_dir); - strcat(ine2pname, PATH_OF_EEPROM_IN); - strcat(ine2pname, chipset); - strcat(ine2pname, "/"); - strcat(e2p_name, "MT7622_E2PImage_ePAeLNA"); - strcat(ine2pname, "ePAeLNA/MT7622_EEPROM.bin"); - strcat(oute2pname, rt28xxdir); - strcat(oute2pname, PATH_OF_EEPROM_OUT); - strcat(oute2pname, "mt7622_e2p_ePAeLNA.h"); - bin2h(ine2pname, oute2pname, e2p_name, "w"); - } else - printf("unknown chipset = %s\n", chipset); - - if (is_bin2h_fw) { - if (strlen(fw_name) != 0) - bin2h(infname, outfname, fw_name, - "w"); /* N9 E1 */ - if (strlen(fw_name_e2) != 0) - bin2h(infname_e2, outfname_e2, fw_name_e2, - "w"); /* N9 E2 */ - if (strlen(fw_name_e3) != 0) - bin2h(infname_e3, outfname_e3, fw_name_e3, - "w"); /* N9 E3 */ - if (strlen(fw_name1) != 0) - bin2h(infname1, outfname1, fw_name1, - "w"); /* CR4 */ - } - - if (is_bin2h_rom_patch) - bin2h(in_rom_patch, out_rom_patch, rom_patch_name, "w"); - - if (is_bin2h_rom_patch_e2) - bin2h(in_rom_patch_e2, out_rom_patch_e2, - rom_patch_name_e2, "w"); - - if (is_bin2h_rom_patch_e3) - bin2h(in_rom_patch_e3, out_rom_patch_e3, - rom_patch_name_e3, "w"); - - if (is_bin2h_e2p) { - bin2h(ine2pname, oute2pname, e2p_name, "w"); - - if (e2p_name2[0]) - bin2h(ine2pname2, oute2pname, e2p_name2, "a"); - - if (e2p_name3[0]) - bin2h(ine2pname3, oute2pname, e2p_name3, "a"); - } - - chipset = strtok(NULL, " "); - } - - exit(0); -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/build-check-jedi.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/build-check-jedi.sh deleted file mode 100644 index 0a6f1ec423..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/build-check-jedi.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -TIME=`date +\%F-\%T` -echo -echo "######## ${TIME} ########" -echo - -# COMBINATION: specify wifi driver build parameter -# CHIP PLATFORM WIFI_MODE -declare -a COMBINATION=("mt7615 PC AP " - "mt7615 PC STA" - "mt7615 MT7621 AP " - "mt7615 MT7621 STA" - "mt7622 MT7622 AP " - ) - -# PATH: for checking build result .ko file -RESULT_PATH="../os/linux/" - -# MAIN -for combination in "${COMBINATION[@]}" -do - # parse build combination - comb_arr=($combination) - chip=${comb_arr[0]} - platform=${comb_arr[1]} - wifi_mode=${comb_arr[2]} - - # compose .ko file name - driver_name=$chip\_$wifi_mode - driver_name=${driver_name,,} # cast the string to lower-case - - echo "build $chip $wifi_mode mode on platform $platform" - - # clean - make -f Makefile clean - - # make - make -f Makefile CHIPSET=$chip PLATFORM=$platform WIFI_MODE=$wifi_mode -j8 - - # check - # make return code - # check ${driver_name}.ko exist - if [ -f "${RESULT_PATH}${driver_name}.ko" ]; then - echo "${driver_name} built successfully." - else - echo "${driver_name} built FAILED (ko not found)!" - exit 1 - fi -done - -TIME=`date +\%F-\%T` -echo -echo "######## ${TIME} ########" -echo diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/check_build_script.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/check_build_script.sh deleted file mode 100644 index 15b6b29c86..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/check_build_script.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -function showUsage(){ - echo "##########################################################" - echo "./check_build_script [ argument1 argument2 ]" - echo "argument 1:" - echo " shall be chip model, such as mt7615, mt7603e...." - echo "" - echo "argument 2:" - echo " could be empty, it will auto build AP & STA mode." - echo "otherwise, you could assign the mode you would like to build." - echo "##########################################################" -} - -function build(){ - for modes in AP STA - do - if [ "$1" != "" ]; then - if [ $1 = ${modes} ]; then - echo "###### BUILD assign chip: ${chips}.... " - echo "###### BUILD assign mode: ${modes} " - sleep 2 - make WIFI_MODE=${modes} CHIPSET=${chips} clean - make WIFI_MODE=${modes} CHIPSET=${chips} || { echo "######### WIFI_MODE=${modes}, CHIPSET=${chips} fail!!"; exit 1; } - make WIFI_MODE=${modes} CHIPSET=${chips} clean - else - continue; - fi - else - echo "###### BUILD chip: ${chips}.... " - echo "###### Auto Build AP/STA mode to check.... " - echo "###### BUILD mode now: ${modes} " - sleep 2 - make WIFI_MODE=${modes} CHIPSET=${chips} clean - make WIFI_MODE=${modes} CHIPSET=${chips} || { echo "######### WIFI_MODE=${modes}, CHIPSET=${chips} fail!!"; exit 1; } - make WIFI_MODE=${modes} CHIPSET=${chips} clean - echo "" - fi - done -} - -for chips in mt7636s mt7636u mt7603e mt7603u mt7615 mt7637e mt7637u -do - if [ "$1" != "" ]; then - if [ $1 = ${chips} ]; then - build $2; - else - continue; - fi - else - build; - fi -done diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/i.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/i.sh deleted file mode 100644 index 8707ec3cae..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/i.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -SELF_PATH=$0 -SELF_DIR=${SELF_PATH%\/*} -cd $SELF_DIR -TEST_DIR=$PWD -cd - - -OS_DIR=$TEST_DIR/../os - -#echo $OS_DIR -#ls $OS_DIR - -insmod $OS_DIR/linux/mt7603e_ap.ko mac=00:11:22:33:44:55 -ifconfig ra0 10.10.10.30 up -iwpriv ra0 set txcnt=65535 - -echo success \ No newline at end of file diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662_freq_plan.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662_freq_plan.c deleted file mode 100644 index a66799245b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662_freq_plan.c +++ /dev/null @@ -1,134 +0,0 @@ -#include -#include -#include - -struct CH_FREQ_MAP_ { - unsigned short channel; - unsigned short freqKHz; -}; - -#define FREQ_REF 40 -#define FREQ_REF_CYCLES 89 -#define DOUBLER 1 - -struct CH_FREQ_MAP CH_HZ_ID_MAP[] = { - { 1, 2412 }, - { 2, 2417 }, - { 3, 2422 }, - { 4, 2427 }, - { 5, 2432 }, - { 6, 2437 }, - { 7, 2442 }, - { 8, 2447 }, - { 9, 2452 }, - { 10, 2457 }, - { 11, 2462 }, - { 12, 2467 }, - { 13, 2472 }, - { 14, 2484 }, - - /* UNII */ - { 36, 5180 }, - { 40, 5200 }, - { 44, 5220 }, - { 48, 5240 }, - { 52, 5260 }, - { 56, 5280 }, - { 60, 5300 }, - { 64, 5320 }, - { 149, 5745 }, - { 153, 5765 }, - { 157, 5785 }, - { 161, 5805 }, - { 165, 5825 }, - { 167, 5835 }, - { 169, 5845 }, - { 171, 5855 }, - { 173, 5865 }, - - /* HiperLAN2 */ - { 100, 5500 }, - { 104, 5520 }, - { 108, 5540 }, - { 112, 5560 }, - { 116, 5580 }, - { 120, 5600 }, - { 124, 5620 }, - { 128, 5640 }, - { 132, 5660 }, - { 136, 5680 }, - { 140, 5700 }, - - /* Japan MMAC */ - { 34, 5170 }, - { 38, 5190 }, - { 42, 5210 }, - { 46, 5230 }, - - /* Japan */ - { 183, 4915 }, - { 184, 4920 }, - { 185, 4925 }, - { 187, 4935 }, - { 188, 4940 }, - { 189, 4945 }, - { 192, 4960 }, - { 196, 4980 }, - { 200, 5000 }, - { 204, 5020 }, - { 208, 5040 }, /* Japan, means J08 */ - { 212, 5060 }, /* Japan, means J12 */ - { 216, 5080 }, /* Japan, means J16 */ -}; - -int CH_HZ_ID_MAP_NUM = (sizeof(CH_HZ_ID_MAP) / sizeof(struct CH_FREQ_MAP)); - -void MapChannelID2KHZ(unsigned char Ch, double *pFreq) -{ - int chIdx; - - for (chIdx = 0; chIdx < CH_HZ_ID_MAP_NUM; chIdx++) { - if ((Ch) == CH_HZ_ID_MAP[chIdx].channel) { - (*pFreq) = CH_HZ_ID_MAP[chIdx].freqKHz * 1000; - break; - } - } - - if (chIdx == CH_HZ_ID_MAP_NUM) - (*pFreq) = 2412000; -} - -int main(int argc, char *argv[]) -{ - unsigned long fcal_target, integer, fraction; - double fvco, n, freq_ref_cycles, freq_ref, fch = 0; - int i; - - freq_ref_cycles = FREQ_REF_CYCLES; - freq_ref = FREQ_REF; - - for (i = 0; i < CH_HZ_ID_MAP_NUM; i++) { - /* FCAL target */ - MapChannelID2KHZ(CH_HZ_ID_MAP[i].channel, &fch); - - if (CH_HZ_ID_MAP[i].channel <= 14) - fvco = (fch / 1000) * 4 / 3; - else - fvco = (fch / 1000) * 2 / 3; - - /* printf("%f\n", fvco); */ - fcal_target = - (unsigned long)(((freq_ref_cycles / freq_ref * fvco) + - 1) + - 0.5); - /* SDM integer & fraction */ - n = fvco / freq_ref; - /* printf("%f\n", n); */ - integer = (unsigned long)(n); - fraction = (unsigned long)((n - integer) * (1 << 20)); - printf("\t{%d, %ld, %ld, %ld},\n", CH_HZ_ID_MAP[i].channel, - fcal_target, integer, fraction); - } - - return 0; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662e_ap.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662e_ap.sh deleted file mode 100644 index 3fc98ed02a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662e_ap.sh +++ /dev/null @@ -1,4 +0,0 @@ -ifconfig ra0 down -rmmod mt7662e_ap.ko -insmod ../os/linux/mt7662e_ap.ko mac=00:0c:43:11:22:22 -ifconfig ra0 up diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662e_sta.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662e_sta.sh deleted file mode 100644 index 7d7141b9d6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/mt7662e_sta.sh +++ /dev/null @@ -1,4 +0,0 @@ -ifconfig ra0 down -rmmod mt7662e_sta.ko -insmod ../os/linux/mt7662e_sta.ko mac=00:0c:43:11:22:22 -ifconfig ra0 up diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/r.sh b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/r.sh deleted file mode 100644 index 3fb863d96b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/tools/r.sh +++ /dev/null @@ -1,2 +0,0 @@ -ifconfig ra0 down -rmmod mt7603e_ap diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/unload b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/unload deleted file mode 100644 index 76a1c9f4fb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/unload +++ /dev/null @@ -1,3 +0,0 @@ -ifconfig ra0 down -rmmod mt7603_ap - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wapp/wapp.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wapp/wapp.c deleted file mode 100644 index f02a3b69b2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wapp/wapp.c +++ /dev/null @@ -1,2869 +0,0 @@ -/**************************************************************************** -* Mediatek Inc. -* 5F., No.5, Taiyuan 1st St., Zhubei City, -* Hsinchu County 302, Taiwan, R.O.C. -* (c) Copyright 2014, Mediatek, Inc. -* -* All rights reserved. Mediatek's source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of Mediatek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of Mediatek, Inc. is obtained. -**************************************************************************** - - Module Name: - wapp.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifdef WAPP_SUPPORT -#include "rt_config.h" -#include "wapp/wapp_cmm_type.h" - -UCHAR ESPI_AC_BE_DEFAULT[3] = { 0xF8, 0xFF, 0x00 }; -UCHAR ESPI_AC_BK_DEFAULT[3] = { 0xF9, 0xFF, 0x00 }; -UCHAR ESPI_AC_VO_DEFAULT[3] = { 0xFA, 0xFF, 0x00 }; -UCHAR ESPI_AC_VI_DEFAULT[3] = { 0xFB, 0xFF, 0x00 }; - -#define CLI_REQ_MIN_INTERVAL 5 /* sec */ - -#ifdef CONFIG_MAP_SUPPORT -VOID wapp_send_cac_stop(IN PRTMP_ADAPTER pAd, IN UINT32 ifindex, - IN UCHAR channel, IN UCHAR ret) -{ - struct wapp_event event; - wapp_cac_info *cac_info; - - event.event_id = WAPP_CAC_STOP; - event.ifindex = ifindex; - cac_info = &event.data.cac_info; - cac_info->channel = channel; - cac_info->ret = ret; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); -} - -#endif -UINT8 get_channel_utilization(PRTMP_ADAPTER pAd, u32 ifindex) -{ - UCHAR i, Channel; - UINT16 l; - UINT32 ObssAirTime[DBDC_BAND_NUM] = { 0 }; - UINT32 MyTxAirTime[DBDC_BAND_NUM] = { 0 }; - UINT32 MyRxAirTime[DBDC_BAND_NUM] = { 0 }; - UCHAR ObssAirOccupyPercentage[DBDC_BAND_NUM] = { 0 }; - UCHAR MyAirOccupyPercentage[DBDC_BAND_NUM] = { 0 }; - UINT32 res; - struct wifi_dev *wdev = NULL; - - for (l = 0; l < WDEV_NUM_MAX; l++) { - if (pAd->wdev_list[l] != NULL) { - wdev = pAd->wdev_list[l]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == ifindex)) { - break; - } - } - } - - if (wdev == NULL) { - return 0; - } - - Channel = wdev->channel; - i = HcGetBandByChannel(pAd, Channel); - ObssAirTime[i] = Get_OBSS_AirTime(pAd, i); - MyTxAirTime[i] = Get_My_Tx_AirTime(pAd, i); - MyRxAirTime[i] = Get_My_Rx_AirTime(pAd, i); - - if (ObssAirTime[i] != 0) - ObssAirOccupyPercentage[i] = - (ObssAirTime[i] * 100) / ONE_SEC_2_US; - - if (MyTxAirTime[i] != 0 || MyRxAirTime[i] != 0) - MyAirOccupyPercentage[i] = - ((MyTxAirTime[i] + MyRxAirTime[i]) * 100) / - ONE_SEC_2_US; - - res = (MyAirOccupyPercentage[i] + ObssAirOccupyPercentage[i]); - /* convert to a scale of 255 */ - res *= 255; - res = (res / 100); - - return res; -} - -VOID wext_send_wapp_qry_rsp(PNET_DEV pNetDev, struct wapp_event *event) -{ - UINT buflen = sizeof(struct wapp_event); - - event->len = buflen - sizeof(event->len) - sizeof(event->event_id); - - RtmpOSWrielessEventSend(pNetDev, RT_WLAN_EVENT_CUSTOM, OID_WAPP_EVENT, - NULL, (PUCHAR)event, sizeof(struct wapp_event)); -} - -INT wapp_send_wdev_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wapp_dev_info *dev_info; - - event.event_id = WAPP_DEV_QUERY_RSP; - event.ifindex = req->data.ifindex; - dev_info = &event.data.dev_info; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { - dev_info->ifindex = event.ifindex; - dev_info->dev_type = wdev->wdev_type; - COPY_MAC_ADDR(dev_info->mac_addr, - wdev->if_addr); - NdisCopyMemory( - dev_info->ifname, - RtmpOsGetNetDevName(wdev->if_dev), - IFNAMSIZ); - dev_info->radio_id = HcGetBandByWdev(wdev); - dev_info->adpt_id = (uintptr_t)pAd; - dev_info->wireless_mode = wdev->PhyMode; - dev_info->dev_active = HcIsRadioAcq(wdev); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - return 0; -} - -INT wapp_send_wdev_ht_cap_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_ht_cap *ht_cap; - - event.event_id = WAPP_HT_CAP_QUERY_RSP; - event.ifindex = req->data.ifindex; - - ht_cap = &event.data.ht_cap; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { - ht_cap->tx_stream = - wlan_config_get_tx_stream(wdev); - ht_cap->rx_stream = - wlan_config_get_rx_stream(wdev); - ht_cap->sgi_20 = (wlan_config_get_ht_gi(wdev) == - GI_400) ? - 1 : - 0; - ht_cap->sgi_40 = (wlan_config_get_ht_gi(wdev) == - GI_400) ? - 1 : - 0; - ht_cap->ht_40 = (wlan_operate_get_ht_bw(wdev) == - BW_40) ? - 1 : - 0; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - return 0; -} - -INT wapp_send_wdev_vht_cap_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_vht_cap *vht_cap; - VHT_CAP_INFO drv_vht_cap; - VHT_OP_IE drv_vht_op; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - NdisZeroMemory(&drv_vht_op, sizeof(VHT_OP_IE)); - NdisCopyMemory(&drv_vht_cap, &pAd->CommonCfg.vht_cap_ie.vht_cap, - sizeof(VHT_CAP_INFO)); - - event.event_id = WAPP_VHT_CAP_QUERY_RSP; - event.ifindex = req->data.ifindex; - - vht_cap = &event.data.vht_cap; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { - mt_WrapSetVHTETxBFCap(pAd, wdev, &drv_vht_cap); - /* printk("\033[1;33m wdev_list[%d] type = %u\033[0m\n", i, wdev->wdev_type);*/ /* Haipin Debug Print (Y)*/ - - drv_vht_op.basic_mcs_set.mcs_ss1 = - VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss2 = - VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss3 = - VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss4 = - VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss5 = - VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss6 = - VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss7 = - VHT_MCS_CAP_NA; - drv_vht_op.basic_mcs_set.mcs_ss8 = - VHT_MCS_CAP_NA; - - /* BW 80M or 40M is the default setting*/ - switch (wlan_operate_get_rx_stream(wdev)) { - case 4: - drv_vht_op.basic_mcs_set.mcs_ss4 = - cap->max_vht_mcs; - /* FALLTHRU */ - case 3: - drv_vht_op.basic_mcs_set.mcs_ss3 = - cap->max_vht_mcs; - /* FALLTHRU */ - case 2: - drv_vht_op.basic_mcs_set.mcs_ss2 = - cap->max_vht_mcs; - /* FALLTHRU */ - case 1: - drv_vht_op.basic_mcs_set.mcs_ss1 = - cap->max_vht_mcs; - break; - } - - /* BW 20M only */ - if (wlan_config_get_vht_bw(wdev) == - VHT_BW_2040 && - wlan_config_get_ht_bw(wdev) == HT_BW_20 && - cap->max_vht_mcs == VHT_MCS_CAP_9) { - switch (wlan_operate_get_rx_stream( - wdev)) { - case 4: - drv_vht_op.basic_mcs_set - .mcs_ss4 = - VHT_MCS_CAP_8; - /* FALLTHRU */ - case 3: - drv_vht_op.basic_mcs_set - .mcs_ss3 = - VHT_MCS_CAP_9; - /* FALLTHRU */ - case 2: - drv_vht_op.basic_mcs_set - .mcs_ss2 = - VHT_MCS_CAP_8; - /* FALLTHRU */ - case 1: - drv_vht_op.basic_mcs_set - .mcs_ss1 = - VHT_MCS_CAP_8; - break; - } - } - - /* BW 160M or 80M+80M */ - if ((wlan_config_get_vht_bw(wdev) == - VHT_BW_160 || - wlan_config_get_vht_bw(wdev) == - VHT_BW_8080) && - wlan_config_get_ht_bw(wdev) == HT_BW_40 && - cap->max_vht_mcs == VHT_MCS_CAP_9) { - switch (wlan_operate_get_rx_stream( - wdev)) { - case 4: - drv_vht_op.basic_mcs_set - .mcs_ss4 = - VHT_MCS_CAP_9; - /* FALLTHRU */ - case 3: - drv_vht_op.basic_mcs_set - .mcs_ss3 = - VHT_MCS_CAP_8; - /* FALLTHRU */ - case 2: - drv_vht_op.basic_mcs_set - .mcs_ss2 = - VHT_MCS_CAP_9; - /* FALLTHRU */ - case 1: - drv_vht_op.basic_mcs_set - .mcs_ss1 = - VHT_MCS_CAP_9; - break; - } - } - - NdisMoveMemory(vht_cap->sup_tx_mcs, - &drv_vht_op.basic_mcs_set, - sizeof(vht_cap->sup_tx_mcs)); - NdisMoveMemory(vht_cap->sup_rx_mcs, - &drv_vht_op.basic_mcs_set, - sizeof(vht_cap->sup_rx_mcs)); - vht_cap->tx_stream = - wlan_config_get_tx_stream(wdev); - vht_cap->rx_stream = - wlan_config_get_tx_stream(wdev); - vht_cap->sgi_80 = (wlan_config_get_ht_gi( - wdev) == GI_400) ? - 1 : - 0; - vht_cap->sgi_160 = (wlan_config_get_ht_gi( - wdev) == GI_400) ? - 1 : - 0; - vht_cap->vht_160 = (wlan_operate_get_vht_bw( - wdev) == BW_160) ? - 1 : - 0; - vht_cap->vht_8080 = (wlan_operate_get_vht_bw( - wdev) == BW_8080) ? - 1 : - 0; - vht_cap->su_bf = - (drv_vht_cap.bfer_cap_su) ? 1 : 0; - vht_cap->mu_bf = - (drv_vht_cap.bfer_cap_mu) ? 1 : 0; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - return 0; -} - -INT wapp_send_wdev_misc_cap_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_misc_cap *misc_cap; - - event.event_id = WAPP_MISC_CAP_QUERY_RSP; - event.ifindex = 0; - misc_cap = &event.data.misc_cap; - NdisZeroMemory(misc_cap, sizeof(wdev_misc_cap)); - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - req->data.ifindex)) { - event.ifindex = req->data.ifindex; - misc_cap->max_num_of_cli = 64; - misc_cap->max_num_of_bss = HW_BEACON_MAX_NUM; - misc_cap->num_of_bss = pAd->ApCfg.BssidNum; -#ifdef CONFIG_MAP_SUPPORT - misc_cap->max_num_of_block_cli = BLOCK_LIST_NUM; -#endif - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - return 0; -} -#ifdef CONFIG_MAP_SUPPORT -INT wapp_fill_client_info_new(PRTMP_ADAPTER pAd, wapp_client_info *cli_info, - MAC_TABLE_ENTRY *mac_entry) -{ - STA_TR_ENTRY *tr_entry; - ULONG DataRate = 0, DataRate_r = 0; - HTTRANSMIT_SETTING HTPhyMode; - tr_entry = &pAd->MacTab.tr_entry[mac_entry->wcid]; - - COPY_MAC_ADDR(cli_info->mac_addr, mac_entry->Addr); - COPY_MAC_ADDR(cli_info->bssid, mac_entry->wdev->bssid); - cli_info->sta_status = - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) ? - WAPP_STA_CONNECTED : - WAPP_STA_DISCONNECTED; - cli_info->assoc_time = mac_entry->StaConnectTime; -#ifdef CONFIG_MAP_SUPPORT - cli_info->assoc_req_len = mac_entry->assoc_req_len; -#endif /* MAP_SUPPORT */ - HTPhyMode.word = (USHORT)mac_entry->LastTxRate; - getRate(HTPhyMode, &DataRate); - cli_info->downlink = (u16)DataRate; - - /* Though NSS1VHT20MCS9 and NSS2VHT20MCS9 rates are not specified in - * IEEE802.11, we do use them */ - if ((HTPhyMode.field.MODE == MODE_VHT) && - (HTPhyMode.field.BW == BW_20) && - ((HTPhyMode.field.MCS & 0xf) == 9)) { - u8 vht_nss = ((HTPhyMode.field.MCS & (0x3 << 4)) >> 4) + 1; - if (vht_nss == 1) - cli_info->downlink = HTPhyMode.field.ShortGI ? 96 : 86; - else if (vht_nss == 2) - cli_info->downlink = - HTPhyMode.field.ShortGI ? 192 : 173; - } - - HTPhyMode.word = (USHORT)mac_entry->LastRxRate; - getRate(HTPhyMode, &DataRate_r); - cli_info->uplink = (u16)DataRate_r; - - /* Though NSS1VHT20MCS9 and NSS2VHT20MCS9 rates are not specified in - * IEEE802.11, we do use them */ - if ((HTPhyMode.field.MODE == MODE_VHT) && - (HTPhyMode.field.BW == BW_20) && - ((HTPhyMode.field.MCS & 0xf) == 9)) { - u8 vht_nss = ((HTPhyMode.field.MCS & (0x3 << 4)) >> 4) + 1; - if (vht_nss == 1) - cli_info->uplink = HTPhyMode.field.ShortGI ? 96 : 86; - else if (vht_nss == 2) - cli_info->uplink = HTPhyMode.field.ShortGI ? 192 : 173; - } - cli_info->uplink_rssi = RTMPAvgRssi(pAd, &mac_entry->RssiSample); -#ifdef CONFIG_DOT11V_WNM - cli_info->cli_caps.btm_capable = - mac_entry->bBSSMantSTASupport == TRUE ? 1 : 0; -#endif - cli_info->bLocalSteerDisallow = false; -#ifdef DOT11K_RRM_SUPPORT - if ((mac_entry->RrmEnCap.field.BeaconPassiveMeasureCap || - mac_entry->RrmEnCap.field.BeaconActiveMeasureCap)) { - cli_info->cli_caps.rrm_capable = 1; - } else { - cli_info->cli_caps.rrm_capable = 0; - } -#endif -#ifdef MBO_SUPPORT - cli_info->cli_caps.mbo_capable = - (mac_entry->bIndicateCDC || mac_entry->bIndicateNPC) ? 1 : 0; -#endif - /* Phy Caps */ - cli_info->cli_caps.phy_mode = mac_entry->MaxHTPhyMode.field.MODE; - cli_info->cli_caps.bw = mac_entry->MaxHTPhyMode.field.BW; - cli_info->cli_caps.nss = - ((mac_entry->MaxHTPhyMode.field.MCS & (0x3 << 4)) >> 4) + 1; - - cli_info->bBTMSteerDisallow = false; - /*traffic stats*/ - cli_info->bytes_sent = mac_entry->TxBytesMAP; - cli_info->bytes_received = mac_entry->RxBytesMAP; - cli_info->packets_sent = mac_entry->TxPackets.u.LowPart; - cli_info->packets_received = mac_entry->RxPackets.u.LowPart; - cli_info->tx_packets_errors = 0; /* to do */ - cli_info->rx_packets_errors = 0; /* to do */ - cli_info->retransmission_count = 0; /* to do */ - cli_info->link_availability = 50; /* to do */ - cli_info->tx_tp = (u32)(mac_entry->AvgTxBytes); - cli_info->rx_tp = (u32)(mac_entry->AvgRxBytes); -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd) && IS_ENTRY_A4(mac_entry)) { - cli_info->is_APCLI = 1; - } else -#endif - cli_info->is_APCLI = 0; - return 0; -} -#endif -INT wapp_fill_client_info(PRTMP_ADAPTER pAd, wapp_client_info *cli_info, - MAC_TABLE_ENTRY *mac_entry) -{ - STA_TR_ENTRY *tr_entry; - - ULONG DataRate = 0, DataRate_r = 0; - HTTRANSMIT_SETTING HTPhyMode; - EXT_EVENT_TX_STATISTIC_RESULT_T rTxStatResult; - HTTRANSMIT_SETTING LastTxRate; - - MtCmdGetTxStatistic(pAd, GET_TX_STAT_ENTRY_TX_RATE, 0 /*Don't Care*/, - mac_entry->wcid, &rTxStatResult); - LastTxRate.field.MODE = rTxStatResult.rEntryTxRate.MODE; - LastTxRate.field.BW = rTxStatResult.rEntryTxRate.BW; - LastTxRate.field.ldpc = rTxStatResult.rEntryTxRate.ldpc ? 1 : 0; - LastTxRate.field.ShortGI = rTxStatResult.rEntryTxRate.ShortGI ? 1 : 0; - LastTxRate.field.STBC = rTxStatResult.rEntryTxRate.STBC; - - if (LastTxRate.field.MODE == MODE_VHT) - LastTxRate.field.MCS = - (((rTxStatResult.rEntryTxRate.VhtNss - 1) & 0x3) << 4) + - rTxStatResult.rEntryTxRate.MCS; - else if (LastTxRate.field.MODE == MODE_OFDM) - LastTxRate.field.MCS = - getLegacyOFDMMCSIndex(rTxStatResult.rEntryTxRate.MCS) & - 0x0000003F; - else - LastTxRate.field.MCS = rTxStatResult.rEntryTxRate.MCS; - - mac_entry->LastTxRate = (UINT32)LastTxRate.word; - - tr_entry = &pAd->MacTab.tr_entry[mac_entry->wcid]; - - COPY_MAC_ADDR(cli_info->mac_addr, mac_entry->Addr); - COPY_MAC_ADDR(cli_info->bssid, mac_entry->wdev->bssid); - cli_info->sta_status = - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) ? - WAPP_STA_CONNECTED : - WAPP_STA_DISCONNECTED; - cli_info->assoc_time = mac_entry->StaConnectTime; -#ifdef CONFIG_MAP_SUPPORT - cli_info->assoc_req_len = mac_entry->assoc_req_len; -#ifdef MAP_R2 - cli_info->IsReassoc = mac_entry->IsReassocSta; -#endif -#endif /* MAP_SUPPORT */ - HTPhyMode.word = (USHORT)mac_entry->LastTxRate; - getRate(HTPhyMode, &DataRate); - cli_info->downlink = (u16)DataRate; - - /* Though NSS1VHT20MCS9 and NSS2VHT20MCS9 rates are not specified in - * IEEE802.11, we do use them */ - if ((HTPhyMode.field.MODE == MODE_VHT) && - (HTPhyMode.field.BW == BW_20) && - ((HTPhyMode.field.MCS & 0xf) == 9)) { - u8 vht_nss = ((HTPhyMode.field.MCS & (0x3 << 4)) >> 4) + 1; - if (vht_nss == 1) - cli_info->downlink = HTPhyMode.field.ShortGI ? 96 : 86; - else if (vht_nss == 2) - cli_info->downlink = - HTPhyMode.field.ShortGI ? 192 : 173; - } - - HTPhyMode.word = (USHORT)mac_entry->LastRxRate; - getRate(HTPhyMode, &DataRate_r); - cli_info->uplink = (u16)DataRate_r; - - cli_info->uplink_rssi = RTMPAvgRssi(pAd, &mac_entry->RssiSample); -#ifdef CONFIG_DOT11V_WNM - cli_info->cli_caps.btm_capable = - mac_entry->bBSSMantSTASupport == TRUE ? 1 : 0; -#endif - cli_info->bLocalSteerDisallow = false; -#ifdef DOT11K_RRM_SUPPORT - if ((mac_entry->RrmEnCap.field.BeaconPassiveMeasureCap || - mac_entry->RrmEnCap.field.BeaconActiveMeasureCap)) { - cli_info->cli_caps.rrm_capable = 1; - } else { - cli_info->cli_caps.rrm_capable = 0; - } -#endif -#ifdef MBO_SUPPORT - cli_info->cli_caps.mbo_capable = - (mac_entry->bIndicateCDC || mac_entry->bIndicateNPC) ? 1 : 0; -#endif - /* Phy Caps */ - cli_info->cli_caps.phy_mode = mac_entry->MaxHTPhyMode.field.MODE; - cli_info->cli_caps.bw = mac_entry->MaxHTPhyMode.field.BW; - cli_info->cli_caps.nss = - ((mac_entry->MaxHTPhyMode.field.MCS & (0x3 << 4)) >> 4) + 1; - - cli_info->bBTMSteerDisallow = false; - /*traffic stats*/ -#ifdef CONFIG_MAP_SUPPORT - cli_info->bytes_sent = mac_entry->TxBytesMAP; - cli_info->bytes_received = mac_entry->RxBytesMAP; -#else - cli_info->bytes_sent = mac_entry->TxBytes; - cli_info->bytes_received = mac_entry->RxBytes; -#endif - cli_info->packets_sent = mac_entry->TxPackets.u.LowPart; - cli_info->packets_received = mac_entry->RxPackets.u.LowPart; - cli_info->tx_packets_errors = 0; /* to do */ - cli_info->rx_packets_errors = 0; /* to do */ - cli_info->retransmission_count = 0; /* to do */ - cli_info->link_availability = 50; /* to do */ - cli_info->tx_tp = (u32)(mac_entry->AvgTxBytes); - cli_info->rx_tp = (u32)(mac_entry->AvgRxBytes); -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd) && IS_ENTRY_A4(mac_entry)) { - cli_info->is_APCLI = 1; - } else -#endif - cli_info->is_APCLI = 0; - - return 0; -} - -INT wapp_send_cli_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wapp_event event; - wapp_client_info *cli_info; - MAC_TABLE_ENTRY *mac_entry; - - event.event_id = WAPP_CLI_QUERY_RSP; - cli_info = &event.data.cli_info; - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - mac_entry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_CLIENT(mac_entry) && - NdisCmpMemory(mac_entry->Addr, &req->data.mac_addr, - MAC_ADDR_LEN) == 0 && - mac_entry->wdev->if_dev && - req->data.ifindex == - RtmpOsGetNetIfIndex(mac_entry->wdev->if_dev)) { - wapp_fill_client_info(pAd, cli_info, mac_entry); -#ifdef MAP_R2 - /*printk("build sta ext params\n");*/ - cli_info->ext_metric_info.sta_info.last_data_dl_rate = - mac_entry->LastTxRate; - cli_info->ext_metric_info.sta_info.last_data_ul_rate = - mac_entry->LastRxRate; - cli_info->ext_metric_info.sta_info.utilization_rx = - mac_entry->TxRxTime[0][0] + - mac_entry->TxRxTime[1][0] + - mac_entry->TxRxTime[2][0] + - mac_entry->TxRxTime[3][0]; - cli_info->ext_metric_info.sta_info.utilization_tx = - mac_entry->TxRxTime[0][1] + - mac_entry->TxRxTime[1][1] + - mac_entry->TxRxTime[2][1] + - mac_entry->TxRxTime[3][1]; -#endif - event.ifindex = req->data.ifindex; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - return 0; - } - } - - COPY_MAC_ADDR(cli_info->mac_addr, req->data.mac_addr); - cli_info->sta_status = WAPP_STA_DISCONNECTED; - event.ifindex = req->data.ifindex; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - return 0; -} - -INT wapp_send_cli_list_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - struct wapp_event event; - - event.event_id = WAPP_CLI_LIST_QUERY_RSP; - event.ifindex = req->data.ifindex; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - return 0; -} - -INT wapp_handle_cli_list_query(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wapp_client_info *cli_info; - MAC_TABLE_ENTRY *mac_entry; - - event.event_id = WAPP_CLI_QUERY_RSP; - cli_info = &event.data.cli_info; - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - mac_entry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_CLIENT( - mac_entry)) { /* report all entry no matter which wdev it is belonged */ - wdev = mac_entry->wdev; - if (wdev->if_dev == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("!!!! (%s) wdev->ifdev = NULL\n", - __func__)); - continue; - } -#ifdef CONFIG_MAP_SUPPORT - if (IS_MT7622(pAd) || IS_MT7615(pAd)) { - wapp_fill_client_info_new(pAd, cli_info, - mac_entry); - } else { - wapp_fill_client_info(pAd, cli_info, mac_entry); - } -#else - wapp_fill_client_info(pAd, cli_info, mac_entry); -#endif -#ifdef MAP_R2 - /*printk("MAP R2 wapp_handle_cli_list_query\n");*/ - cli_info->ext_metric_info.sta_info.last_data_dl_rate = - cli_info->downlink; - cli_info->ext_metric_info.sta_info.last_data_ul_rate = - cli_info->uplink; - cli_info->ext_metric_info.sta_info.utilization_rx = - (mac_entry->TxRxTime[0][0] + - mac_entry->TxRxTime[1][0] + - mac_entry->TxRxTime[2][0] + - mac_entry->TxRxTime[3][0]) / - 1000; - cli_info->ext_metric_info.sta_info.utilization_tx = - (mac_entry->TxRxTime[0][1] + - mac_entry->TxRxTime[1][1] + - mac_entry->TxRxTime[2][1] + - mac_entry->TxRxTime[3][1]) / - 1000; -#endif - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); -#ifdef MBO_SUPPORT - if (IS_MBO_ENABLE(wdev)) { - if (mac_entry->bIndicateNPC && - mac_entry->bindicate_NPC_event) { - MboIndicateStaInfoToDaemon( - pAd, &mac_entry->MboStaInfoNPC, - MBO_MSG_STA_PREF_UPDATE); - mac_entry->bindicate_NPC_event = FALSE; - } - if (mac_entry->bIndicateCDC && - mac_entry->bindicate_CDC_event) { - MboIndicateStaInfoToDaemon( - pAd, &mac_entry->MboStaInfoCDC, - MBO_MSG_CDC_UPDATE); - mac_entry->bindicate_CDC_event = FALSE; - } - } -#endif /* MBO_SUPPORT */ - } - } - - wapp_send_cli_list_query_rsp(pAd, req); - return 0; -} - -/* client assoc */ -INT wapp_send_cli_join_event(PRTMP_ADAPTER pAd, MAC_TABLE_ENTRY *mac_entry) -{ - struct wifi_dev *wdev; - struct wapp_event event; - wapp_client_info *cli_info; - - if (mac_entry) { - wdev = mac_entry->wdev; - if (wdev->if_dev) { - event.event_id = WAPP_CLI_JOIN_EVENT; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - cli_info = &event.data.cli_info; - wapp_fill_client_info(pAd, cli_info, mac_entry); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); -#ifdef MBO_SUPPORT - if (IS_MBO_ENABLE(wdev)) { - if (mac_entry->bIndicateNPC && - mac_entry->bindicate_NPC_event) { - MboIndicateStaInfoToDaemon( - pAd, &mac_entry->MboStaInfoNPC, - MBO_MSG_STA_PREF_UPDATE); - mac_entry->bindicate_NPC_event = FALSE; - } - if (mac_entry->bIndicateCDC && - mac_entry->bindicate_CDC_event) { - MboIndicateStaInfoToDaemon( - pAd, &mac_entry->MboStaInfoCDC, - MBO_MSG_CDC_UPDATE); - mac_entry->bindicate_CDC_event = FALSE; - } - } -#endif /* MBO_SUPPORT */ - } - } - - return 0; -} - -/* client disaccos */ -INT wapp_send_cli_leave_event(PRTMP_ADAPTER pAd, UINT32 ifindex, - UCHAR *mac_addr, MAC_TABLE_ENTRY *mac_entry) -{ - struct wapp_event event; - wapp_client_info *cli_info; - - event.event_id = WAPP_CLI_LEAVE_EVENT; - event.ifindex = ifindex; - cli_info = &event.data.cli_info; -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd) && IS_ENTRY_A4(mac_entry)) { - cli_info->is_APCLI = 1; - } else -#endif - cli_info->is_APCLI = 0; - - COPY_MAC_ADDR(cli_info->mac_addr, mac_addr); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - - return 0; -} -#ifdef MAP_R2 - -INT wapp_send_sta_disassoc_stats_event(PRTMP_ADAPTER pAd, - MAC_TABLE_ENTRY *pEntry, USHORT reason) -{ - struct wapp_event event; - wapp_client_info *cli_info; - - if (pEntry->wdev->if_dev) { - event.event_id = WAPP_STA_DISASSOC_EVENT; - cli_info = &event.data.cli_info; - - wapp_fill_client_info(pAd, cli_info, pEntry); - cli_info->disassoc_reason = reason; - /*printk("disassoc stats evt: reason code: %d\n", cli_info->disassoc_reason);*/ - event.ifindex = pEntry->wdev->if_dev->ifindex; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - return 0; -} - -void wapp_handle_sta_disassoc(PRTMP_ADAPTER pAd, UINT16 wcid, UINT16 Reason) -{ - STA_TR_ENTRY *tr_entry = &pAd->MacTab.tr_entry[wcid]; - MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[wcid]; - - /*printk(" MAP_R2 %s: %d\n",__func__, Reason);*/ - if (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) - wapp_send_sta_disassoc_stats_event(pAd, pEntry, Reason); - else - wapp_send_sta_connect_rejected(pAd, pEntry->wdev, pEntry->Addr, - pEntry->bssid, WAPP_ASSOC, - Reason, 0, Reason); -} - -#endif - -INT wapp_send_apcli_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ -#ifdef APCLI_SUPPORT - u8 i; - struct wifi_dev *wdev; - struct wapp_event event; - wapp_client_info *cli_info; - MAC_TABLE_ENTRY *mac_entry; - PAPCLI_STRUCT apcli_entry; - - event.event_id = WAPP_APCLI_QUERY_RSP; - event.ifindex = req->data.ifindex; - cli_info = &event.data.cli_info; - - for (i = 0; i < MAX_APCLI_NUM; i++) { - apcli_entry = &pAd->ApCfg.ApCliTab[i]; - wdev = &apcli_entry->wdev; - if ((pAd->ApCfg.ApCliTab[i].Valid == TRUE) && wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == req->data.ifindex)) { - mac_entry = - &pAd->MacTab.Content[apcli_entry->MacTabWCID]; - if (IS_ENTRY_APCLI(mac_entry)) { - wapp_fill_client_info(pAd, cli_info, mac_entry); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - break; - } - } - } -#endif - - return 0; -} - -INT wapp_send_cli_probe_event(PRTMP_ADAPTER pAd, UINT32 ifindex, - UCHAR *mac_addr, MLME_QUEUE_ELEM *elem) -{ - struct wapp_event event; - wapp_probe_info *probe_info; - struct raw_rssi_info *raw_rssi; - RSSI_SAMPLE rssi; - - raw_rssi = &elem->rssi_info; - rssi.AvgRssi[0] = raw_rssi->raw_rssi[0] ? - ConvertToRssi(pAd, raw_rssi, RSSI_IDX_0) : - 0; - rssi.AvgRssi[1] = raw_rssi->raw_rssi[1] ? - ConvertToRssi(pAd, raw_rssi, RSSI_IDX_1) : - 0; - rssi.AvgRssi[2] = raw_rssi->raw_rssi[2] ? - ConvertToRssi(pAd, raw_rssi, RSSI_IDX_2) : - 0; - rssi.AvgRssi[3] = raw_rssi->raw_rssi[3] ? - ConvertToRssi(pAd, raw_rssi, RSSI_IDX_3) : - 0; - - event.event_id = WAPP_CLI_PROBE_EVENT; - event.ifindex = ifindex; - probe_info = &event.data.probe_info; - COPY_MAC_ADDR(probe_info->mac_addr, mac_addr); - probe_info->channel = elem->Channel; - probe_info->rssi = RTMPAvgRssi(pAd, &rssi); - if (elem->MsgLen <= PREQ_IE_LEN) { - NdisCopyMemory(probe_info->preq, elem->Msg, elem->MsgLen); - probe_info->preq_len = elem->MsgLen; - } else { - NdisCopyMemory(probe_info->preq, elem->Msg, PREQ_IE_LEN); - probe_info->preq_len = PREQ_IE_LEN; - } - - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - return 0; -} - -VOID wapp_send_bcn_report(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PUCHAR report, IN ULONG report_len) -{ - struct wifi_dev *wdev; - struct wapp_event *event = NULL; - UCHAR count = 0, i = 0; - PEID_STRUCT eid_ptr = NULL; - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - os_alloc_mem(pAd, (UCHAR **)&event, sizeof(*event)); - if (!event) - return; - NdisZeroMemory(event, sizeof(*event)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("(%s) Sta Addr = %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, PRINT_MAC(pEntry->Addr))); - wdev = pEntry->wdev; - if (wdev->if_dev == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("!!!! (%s) wdev->ifdev = NULL\n", __func__)); - os_free_mem(event); - return; - } - event->event_id = WAPP_RCEV_BCN_REPORT; - event->ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - - if ((LONG)report_len < 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("!!!! (%s) report_len < 0: drop this pkt\n", - __func__)); - os_free_mem(event); - return; - } - eid_ptr = (PEID_STRUCT)report; - if ((LONG)(eid_ptr->Len - 3) < 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("!!!! (%s) report_len < 0: drop this pkt\n", - __func__)); - os_free_mem(event); - return; - } - COPY_MAC_ADDR(event->data.bcn_rpt_info.sta_addr, pEntry->Addr); - - if (report_len % BCN_RPT_LEN) - count = report_len / BCN_RPT_LEN + 1; - else - count = report_len / BCN_RPT_LEN; - - for (i = 0; i < count; i++) { - if (i == (count - 1)) { - event->data.bcn_rpt_info.bcn_rpt_len = - report_len; - event->data.bcn_rpt_info.last_fragment = 1; - NdisCopyMemory(event->data.bcn_rpt_info.bcn_rpt, - &report[i * BCN_RPT_LEN], - report_len); - } else { - event->data.bcn_rpt_info.bcn_rpt_len = - BCN_RPT_LEN; - event->data.bcn_rpt_info.last_fragment = 0; - NdisCopyMemory(event->data.bcn_rpt_info.bcn_rpt, - &report[i * BCN_RPT_LEN], - BCN_RPT_LEN); - report_len -= BCN_RPT_LEN; - } - wext_send_wapp_qry_rsp(pAd->net_dev, event); - } - os_free_mem(event); - } -} - -VOID wapp_send_bcn_report_complete(IN PRTMP_ADAPTER pAd, - IN PMAC_TABLE_ENTRY pEntry) -{ - struct wifi_dev *wdev; - struct wapp_event event; - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("(%s) Sta Addr = %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, PRINT_MAC(pEntry->Addr))); - wdev = pEntry->wdev; - if (wdev->if_dev) { - event.event_id = WAPP_RCEV_BCN_REPORT_COMPLETE; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - COPY_MAC_ADDR(event.data.bcn_rpt_info.sta_addr, - pEntry->Addr); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } -} - -#ifdef AIR_MONITOR -VOID wapp_send_air_mnt_rssi(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN PMNT_STA_ENTRY pMntEntry) -{ - struct wifi_dev *wdev; - struct wapp_event event; - - if (pEntry && IS_ENTRY_MONITOR(pEntry)) { - wdev = pEntry->wdev; - if (wdev->if_dev) { - event.event_id = WAPP_RCEV_MONITOR_INFO; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - COPY_MAC_ADDR(event.data.mnt_info.sta_addr, - pMntEntry->addr); - event.data.mnt_info.rssi = RTMPMaxRssi( - pAd, pMntEntry->RssiSample.AvgRssi[0], - pMntEntry->RssiSample.AvgRssi[1], - pMntEntry->RssiSample.AvgRssi[2] -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - pMntEntry->RssiSample.AvgRssi[3] -#endif - ); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } -} -#endif - -#ifdef CONFIG_MAP_SUPPORT -VOID wapp_send_cac_period_event(IN PRTMP_ADAPTER pAd, IN UINT32 ifindex, - IN UCHAR channel, IN UCHAR cac_enable, - IN USHORT cac_time) -{ - struct wapp_event event; - wapp_cac_info *cac_info = NULL; - event.event_id = WAPP_CAC_PERIOD_EVENT; - event.ifindex = ifindex; - cac_info = &event.data.cac_info; - cac_info->channel = channel; - cac_info->ret = cac_enable; - cac_info->cac_timer = cac_time; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); -} -#endif -VOID wapp_send_csa_event(IN PRTMP_ADAPTER pAd, IN UINT32 ifindex, - IN UCHAR new_channel) -{ - struct wapp_event event; - wapp_csa_info *csa_info; - - event.event_id = WAPP_CSA_EVENT; - event.ifindex = ifindex; - csa_info = &event.data.csa_info; - csa_info->new_channel = new_channel; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); -} - -VOID wapp_send_cli_active_change(IN PRTMP_ADAPTER pAd, - IN PMAC_TABLE_ENTRY pEntry, IN STA_STATUS stat) -{ - struct wifi_dev *wdev; - struct wapp_event event; - - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - wdev = pEntry->wdev; - if (wdev->if_dev) { - event.event_id = WAPP_CLI_ACTIVE_CHANGE; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - event.data.cli_info.status = stat; - COPY_MAC_ADDR(event.data.cli_info.mac_addr, - pEntry->Addr); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } -} - -VOID setChannelList(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - wdev_chn_info *chn_list) -{ - int i = 0; -#ifdef CONFIG_MAP_SUPPORT - UCHAR band_idx; -#endif -#ifdef MT_DFS_SUPPORT - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; -#endif - -#ifdef CONFIG_MAP_SUPPORT - band_idx = HcGetBandByWdev(wdev); -#endif - for (i = 0; i < pAd->ChannelListNum; i++) { - chn_list->ch_list[i].channel = pAd->ChannelList[i].Channel; - - /* Set Preference & reason */ - if (pAd->ChannelList[i].DfsReq) { -#ifdef CONFIG_MAP_SUPPORT /* TODO: move to MAP */ - chn_list->ch_list[i].pref |= - (OP_DISALLOWED_DUE_TO_DFS | NON_PREF); -#ifdef MT_DFS_SUPPORT - if ((pAd->CommonCfg.RDDurRegion == CE) && - DfsCacRestrictBand(pAd, pDfsParam->Bw, - pAd->ChannelList[i].Channel, - 0)) { - chn_list->ch_list[i].cac_timer = 605; - } else { - chn_list->ch_list[i].cac_timer = 65; - } -#endif -#endif /* CONFIG_MAP_SUPPORT */ - } - if (pAd->ChannelList[i].Channel == - wlan_operate_get_cen_ch_1(wdev)) { -#ifdef CONFIG_MAP_SUPPORT /* TODO: move to MAP */ - chn_list->ch_list[i].pref |= PREF_SCORE_14; -#endif /* CONFIG_MAP_SUPPORT */ - } - } -} - -INT wapp_send_chn_list_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_chn_info *chn_list; - - event.event_id = WAPP_CHN_LIST_RSP; - event.ifindex = req->data.ifindex; - chn_list = &event.data.chn_list; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { - chn_list->band = wdev->PhyMode; - chn_list->op_ch = - wlan_operate_get_prim_ch(wdev); - chn_list->op_class = - get_regulatory_class(pAd, wdev->channel, - wdev->PhyMode, - wdev); - chn_list->ch_list_num = pAd->ChannelListNum; - chn_list->dl_mcs = wdev->HTPhyMode.field.MCS; - setChannelList(pAd, wdev, chn_list); -#ifdef CONFIG_MAP_SUPPORT /* TODO: move to MAP */ - chn_list->non_op_chn_num = getNonOpChnNum( - pAd, wdev, chn_list->op_class); - setNonOpChnList(pAd, wdev, - chn_list->non_op_ch_list, - chn_list->non_op_chn_num, - chn_list->op_class); -#endif /* CONFIG_MAP_SUPPORT */ - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - return 0; -} - -#ifdef CONFIG_MAP_SUPPORT -UCHAR map_set_op_class_info(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - wdev_op_class_info *op_class); -#endif /* CONFIG_MAP_SUPPORT */ - -INT wapp_send_op_class_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_op_class_info *op_class; - - NdisZeroMemory((void *)&event, sizeof(struct wapp_event)); - event.event_id = WAPP_OP_CLASS_RSP; - event.ifindex = req->data.ifindex; - op_class = &event.data.op_class; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { -#ifdef CONFIG_MAP_SUPPORT - op_class->num_of_op_class = - map_set_op_class_info(pAd, wdev, - op_class); -#endif /* CONFIG_MAP_SUPPORT */ - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - return 0; -} -#ifdef DPP_SUPPORT -void wext_send_dpp_frame_tx_status(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - BOOLEAN tx_error, UINT16 seq_no) -{ - struct wapp_event event; - struct wapp_dpp_frm_tx_status *req_data; - - if (!wdev) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: wdev is null\n", __func__)); - return; - } - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: sending tx status to wapp status=%d\n", __func__, - tx_error)); - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - req_data = (struct wapp_dpp_frm_tx_status *)&event.data; - req_data->tx_success = tx_error; - req_data->seq_no = seq_no; - event.event_id = WAPP_DPP_ACTION_FRAME_STATUS; - - RtmpOSWrielessEventSend(wdev->if_dev, RT_WLAN_EVENT_CUSTOM, - OID_WAPP_EVENT, NULL, (PUCHAR)&event, - sizeof(struct wapp_event)); -} - -void cache_dpp_frame_rx_event(struct wifi_dev *wdev, const char *peer_mac_addr, - UINT channel, const char *frm, UINT16 frm_len, - BOOL is_gas, UINT32 frm_count) -{ - char *buf; - struct wapp_event *event; - struct wapp_dpp_action_frame *req_data; - UINT16 buflen = 0; - struct dpp_frame_list *dpp_frame; - - buflen = sizeof(*event) + frm_len; - os_alloc_mem(NULL, (UCHAR **)&buf, buflen); - NdisZeroMemory(buf, buflen); - - event = (struct wapp_event *)buf; - event->ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - event->event_id = WAPP_DPP_ACTION_FRAME_RECEIVED; - - req_data = (struct wapp_dpp_action_frame *)&(event->data.frame); - NdisCopyMemory(req_data->src, peer_mac_addr, 6); - req_data->frm_len = frm_len; - req_data->chan = channel; - req_data->is_gas = is_gas; - req_data->wapp_dpp_frame_id_no = frm_count; - NdisCopyMemory(req_data->frm, frm, frm_len); - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, storing event with frame id %d\n", __func__, - req_data->wapp_dpp_frame_id_no)); - MTWF_LOG( - DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, source mac address for dpp frame :%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, PRINT_MAC(req_data->src))); - os_alloc_mem(NULL, (UCHAR **)&dpp_frame, sizeof(struct dpp_frame_list)); - NdisZeroMemory(dpp_frame, sizeof(struct dpp_frame_list)); - - dpp_frame->dpp_frame_event = event; - DlListAddTail(&wdev->dpp_frame_event_list, &dpp_frame->List); -} - -void wext_send_dpp_frame_rx_event(struct wifi_dev *wdev, UINT32 frm_count) -{ - struct wapp_event *event; - UINT16 buflen = 0; - char *buf = NULL; - - buflen = sizeof(*event); - os_alloc_mem(NULL, (UCHAR **)&buf, buflen); - NdisZeroMemory(buf, buflen); - event = (struct wapp_event *)buf; - - event->ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - event->event_id = WAPP_DPP_ACTION_FRAME_RECEIVED; - event->data.wapp_dpp_frame_id_no = frm_count; - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, sending event to wapp with frame id %d\n", __func__, - event->data.wapp_dpp_frame_id_no)); - - RtmpOSWrielessEventSend(wdev->if_dev, RT_WLAN_EVENT_CUSTOM, - OID_WAPP_EVENT, NULL, (PUCHAR)buf, 100); - os_free_mem(buf); -} - -void wext_send_dpp_action_frame(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - const char *peer_mac_addr, UINT channel, - const char *frm, UINT16 frm_len, BOOL is_gas) -{ - /* MAKING EVENT TO BE STORED IN LIST WITH FRAME*/ - cache_dpp_frame_rx_event(wdev, peer_mac_addr, channel, frm, frm_len, - is_gas, pAd->dpp_rx_frm_counter); - /*MAKING EVENT TO BE SENT TO WAPP */ - wext_send_dpp_frame_rx_event(wdev, pAd->dpp_rx_frm_counter); - pAd->dpp_rx_frm_counter++; -} -#endif /* DPP_SUPPORT */ - -INT wapp_send_bss_info_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_bss_info *bss_info; - - NdisZeroMemory(&event, sizeof(event)); - event.event_id = WAPP_BSS_INFO_RSP; - event.ifindex = req->data.ifindex; - bss_info = &event.data.bss_info; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { - if (i >= HW_BEACON_MAX_NUM || - wdev->wdev_type != WDEV_TYPE_AP) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s():wdev %d is not an AP\n", - __func__, i)); - break; - } - bss_info->SsidLen = - pAd->ApCfg.MBSSID[i].SsidLen; - NdisMoveMemory(bss_info->ssid, - pAd->ApCfg.MBSSID[i].Ssid, - (MAX_LEN_OF_SSID + 1)); - NdisMoveMemory(bss_info->bssid, wdev->bssid, - MAC_ADDR_LEN); - NdisMoveMemory(bss_info->if_addr, wdev->if_addr, - MAC_ADDR_LEN); -#ifdef CONFIG_MAP_SUPPORT - bss_info->map_role = wdev->MAPCfg.DevOwnRole; - bss_info->auth_mode = - pAd->ApCfg.MBSSID[i] - .wdev.SecConfig.AKMMap; - bss_info->enc_type = - pAd->ApCfg.MBSSID[i] - .wdev.SecConfig.PairwiseCipher; -#ifdef WSC_AP_SUPPORT - bss_info->key_len = - strlen(pAd->ApCfg.MBSSID[i] - .wdev.WscControl.WpaPsk); - NdisMoveMemory(bss_info->key, - pAd->ApCfg.MBSSID[i] - .wdev.WscControl.WpaPsk, - bss_info->key_len); -#else - bss_info->key_len = - strlen(pAd->ApCfg.MBSSID[i].PSK); - NdisMoveMemory(bss_info->key, - pAd->ApCfg.MBSSID[i].PSK, - bss_info->key_len); -#endif - bss_info->hidden_ssid = - pAd->ApCfg.MBSSID[i].bHideSsid; -#endif - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - - return 0; -} - -INT wapp_send_ap_metric_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_ap_metric *ap_metric; - BSS_STRUCT *mbss; - - event.event_id = WAPP_AP_METRIC_RSP; - event.ifindex = req->data.ifindex; - ap_metric = &event.data.ap_metrics; - NdisZeroMemory(ap_metric, sizeof(wdev_ap_metric)); - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { - mbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - NdisMoveMemory(ap_metric->bssid, wdev->bssid, - MAC_ADDR_LEN); - ap_metric->cu = get_channel_utilization( - pAd, event.ifindex); - NdisCopyMemory(ap_metric->ESPI_AC[0], - mbss->ESPI_AC_BE, - sizeof(mbss->ESPI_AC_BE)); - NdisCopyMemory(ap_metric->ESPI_AC[1], - mbss->ESPI_AC_BK, - sizeof(mbss->ESPI_AC_BK)); - NdisCopyMemory(ap_metric->ESPI_AC[2], - mbss->ESPI_AC_VO, - sizeof(mbss->ESPI_AC_VO)); - NdisCopyMemory(ap_metric->ESPI_AC[3], - mbss->ESPI_AC_VI, - sizeof(mbss->ESPI_AC_VI)); -#ifdef MAP_R2 - /*TODO: take care of WHNAT*/ - ap_metric->ext_ap_metric.bc_rx = - mbss->bcBytesRx == 0 ? - 0 : - ((mbss->bcBytesRx / 1024) == 0 ? - 1 : - mbss->bcBytesRx / - 1024); - ap_metric->ext_ap_metric.bc_tx = - mbss->bcBytesTx == 0 ? - 0 : - ((mbss->bcBytesTx / 1024) == 0 ? - 1 : - mbss->bcBytesTx / - 1024); - ap_metric->ext_ap_metric.mc_rx = - mbss->mcBytesRx == 0 ? - 0 : - ((mbss->mcBytesRx / 1024) == 0 ? - 1 : - mbss->mcBytesRx / - 1024); - ap_metric->ext_ap_metric.mc_tx = - mbss->mcBytesTx == 0 ? - 0 : - ((mbss->mcBytesTx / 1024) == 0 ? - 1 : - mbss->mcBytesTx / - 1024); - ap_metric->ext_ap_metric.uc_rx = - mbss->ucBytesRx == 0 ? - 0 : - ((mbss->ucBytesRx / 1024) == 0 ? - 1 : - mbss->ucBytesRx / - 1024); - ap_metric->ext_ap_metric.uc_tx = - mbss->ucBytesTx == 0 ? - 0 : - ((mbss->ucBytesTx / 1024) == 0 ? - 1 : - mbss->ucBytesTx / - 1024); -#endif - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - - return 0; -} -#ifdef MAP_R2 -INT wapp_send_radio_metric_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_radio_metric *radio_metric; - int band_idx = 0; - - event.event_id = WAPP_RADIO_METRIC_RSP; - event.ifindex = req->data.ifindex; - radio_metric = &event.data.radio_metrics; - NdisZeroMemory(radio_metric, sizeof(wdev_radio_metric)); - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { - band_idx = HcGetBandByWdev(wdev); - radio_metric->cu_noise = pAd->Avg_NF[band_idx]; - radio_metric->cu_tx = - (Get_My_Tx_AirTime(pAd, band_idx) * - 255) / - ONE_SEC_2_US; - radio_metric->cu_rx = - (Get_My_Rx_AirTime(pAd, band_idx) * - 255) / - ONE_SEC_2_US; - radio_metric->cu_other = - (Get_OBSS_AirTime(pAd, band_idx) * - 255) / - ONE_SEC_2_US; - - radio_metric->edcca = - (Get_EDCCA_Time(pAd, band_idx) * 255) / - ONE_SEC_2_US; - ; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - - return 0; -} -VOID Update_Mib_Bucket_for_map(RTMP_ADAPTER *pAd) -{ - UCHAR i = 0, j = 0; - UCHAR concurrent_bands = HcGetAmountOfBand(pAd); - - for (i = 0; i < concurrent_bands; i++) { - if (pAd->OneSecMibBucket.Enabled[i] == TRUE) { - pAd->OneSecMibBucket.ChannelBusyTimeCcaNavTx[i] = 0; - pAd->OneSecMibBucket.ChannelBusyTime[i] = 0; - pAd->OneSecMibBucket.OBSSAirtime[i] = 0; - pAd->OneSecMibBucket.MyTxAirtime[i] = 0; - pAd->OneSecMibBucket.MyRxAirtime[i] = 0; - pAd->OneSecMibBucket.EDCCAtime[i] = 0; - pAd->OneSecMibBucket.MdrdyCount[i] = 0; - pAd->OneSecMibBucket.PdCount[i] = 0; - for (j = 0; j < 2; j++) { - pAd->OneSecMibBucket - .ChannelBusyTimeCcaNavTx[i] += - pAd->MsMibBucket - .ChannelBusyTimeCcaNavTx[i][j]; - pAd->OneSecMibBucket.ChannelBusyTime[i] += - pAd->MsMibBucket.ChannelBusyTime[i][j]; - pAd->OneSecMibBucket.OBSSAirtime[i] += - pAd->MsMibBucket.OBSSAirtime[i][j]; - pAd->OneSecMibBucket.MyTxAirtime[i] += - pAd->MsMibBucket.MyTxAirtime[i][j]; - pAd->OneSecMibBucket.MyRxAirtime[i] += - pAd->MsMibBucket.MyRxAirtime[i][j]; - pAd->OneSecMibBucket.EDCCAtime[i] += - pAd->MsMibBucket.EDCCAtime[i][j]; - pAd->OneSecMibBucket.MdrdyCount[i] += - pAd->MsMibBucket.MdrdyCount[i][j]; - pAd->OneSecMibBucket.PdCount[i] += - pAd->MsMibBucket.PdCount[i][j]; - } - } - } -} - -#endif - -INT wapp_send_ch_util_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - struct wapp_event event; - event.event_id = WAPP_CH_UTIL_QUERY_RSP; - event.ifindex = req->data.ifindex; - event.data.ch_util = get_channel_utilization(pAd, event.ifindex); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - return 0; -} - -INT wapp_send_ap_config_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - wdev_ap_config *ap_conf; - - event.event_id = WAPP_AP_CONFIG_RSP; - event.ifindex = req->data.ifindex; - ap_conf = &event.data.ap_conf; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { -#ifdef CONFIG_MAP_SUPPORT /* TODO: move to MAP */ - ap_conf->sta_report_on_cop = - wdev->MAPCfg - .bUnAssocStaLinkMetricRptOpBss; - ap_conf->sta_report_not_cop = - wdev->MAPCfg - .bUnAssocStaLinkMetricRptNonOpBss; - ap_conf->rssi_steer = - wdev->MAPCfg.bAgentInitRssiSteering; -#endif /* CONFIG_MAP_SUPPORT */ - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - return 0; -} - -INT wapp_send_bss_state_change(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - UINT8 bss_state) -{ - struct wapp_event event; - - if (wdev->if_dev) { - event.event_id = WAPP_BSS_STATE_CHANGE; - event.ifindex = wdev->if_dev->ifindex; - event.data.bss_state_info.interface_index = event.ifindex; - event.data.bss_state_info.bss_state = bss_state; - wext_send_wapp_qry_rsp(ad->net_dev, &event); - } - return 0; -} - -INT wapp_send_ch_change_rsp(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - UINT8 ControlChannel) -{ - struct wapp_event event; - - event.event_id = WAPP_CH_CHANGE; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - event.data.ch_change_info.interface_index = event.ifindex; - event.data.ch_change_info.new_ch = (u_int8_t)ControlChannel; - event.data.ch_change_info.op_class = - get_regulatory_class(pAd, ControlChannel, wdev->PhyMode, wdev); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - return 0; -} - -/* -* INT wapp_send_txpower_change_rsp( -* PRTMP_ADAPTER pAd, -* ) -* { -* struct wapp_event event; -* event.event_id = WAPP_TX_POWER_CHANGE; -* event.ifindex = ; -* event.data.txpwr_change_info.interface_index =event.ifindex; -* event.data.txpwr_change_info.new_tx_pwr =; -* wext_send_wapp_qry_rsp(pAd->net_dev, &event); -* return 0; -* } -*/ - -INT wapp_send_apcli_association_change(UINT8 apcli_assoc_state, - struct _RTMP_ADAPTER *ad, - struct _APCLI_STRUCT *ApCliEntry) -{ - struct wapp_event event; - - if (ApCliEntry->wdev.if_dev) { - event.event_id = WAPP_APCLI_ASSOC_STATE_CHANGE; - event.ifindex = ApCliEntry->wdev.if_dev->ifindex; - event.data.apcli_association_info.interface_index = - event.ifindex; - event.data.apcli_association_info.apcli_assoc_state = - apcli_assoc_state; -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(ad)) - event.data.apcli_association_info.PeerMAPEnable = - ApCliEntry->PeerMAPEnable; -#endif - wext_send_wapp_qry_rsp(ad->net_dev, &event); - } - return 0; -} - -#ifdef CONVERTER_MODE_SWITCH_SUPPORT - -INT wapp_send_apcli_association_change_vendor10(UINT8 apcli_assoc_state, - struct _RTMP_ADAPTER *ad, - struct _APCLI_STRUCT *ApCliEntry) -{ - struct wapp_event event; - - event.event_id = WAPP_APCLI_ASSOC_STATE_CHANGE_VENDOR10; - event.ifindex = ApCliEntry->wdev.if_dev->ifindex; - event.data.apcli_association_info.interface_index = event.ifindex; - event.data.apcli_association_info.apcli_assoc_state = apcli_assoc_state; - wext_send_wapp_qry_rsp(ad->net_dev, &event); - return 0; -} -#endif /* CONVERTER_MODE_SWITCH_SUPPORT */ - -INT wapp_send_bssload_crossing(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - UCHAR bssload_high_thrd, UCHAR bssload_low_thrd, - UCHAR bssload) -{ - struct wapp_event event; - - if (wdev->if_dev) { - event.event_id = WAPP_BSSLOAD_CROSSING; - event.ifindex = wdev->if_dev->ifindex; - event.data.bssload_crossing_info.interface_index = - event.ifindex; - event.data.bssload_crossing_info.bssload = bssload; - event.data.bssload_crossing_info.bssload_high_thrd = - bssload_high_thrd; - event.data.bssload_crossing_info.bssload_low_thrd = - bssload_low_thrd; - wext_send_wapp_qry_rsp(ad->net_dev, &event); - } - return 0; -} - -INT wapp_send_sta_connect_rejected(struct _RTMP_ADAPTER *ad, - struct wifi_dev *wdev, UCHAR *sta_mac_addr, - UCHAR *bssid, UINT8 connect_stage, - UINT16 reason, USHORT status_code, - USHORT reason_code) -{ - struct wapp_event event; - - if (wdev->if_dev) { - event.event_id = WAPP_STA_CNNCT_REJ; - event.ifindex = wdev->if_dev->ifindex; - event.data.sta_cnnct_rej_info.interface_index = event.ifindex; - os_move_mem(event.data.sta_cnnct_rej_info.bssid, bssid, - MAC_ADDR_LEN); - os_move_mem(event.data.sta_cnnct_rej_info.sta_mac, sta_mac_addr, - MAC_ADDR_LEN); - event.data.sta_cnnct_rej_info.cnnct_fail.connect_stage = - connect_stage; - event.data.sta_cnnct_rej_info.cnnct_fail.reason = reason; -#ifdef MAP_R2 - event.data.sta_cnnct_rej_info.assoc_status_code = status_code; - event.data.sta_cnnct_rej_info.assoc_reason_code = reason_code; - /*printk("### %d %s status_code = %d\n", __LINE__, __func__, status_code);*/ -#endif - wext_send_wapp_qry_rsp(ad->net_dev, &event); - } - return TRUE; -} - -INT wapp_bss_start(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i, j; - struct wifi_dev *wdev, *wdev_active; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - req->data.ifindex)) { - for (j = 0; j < WDEV_NUM_MAX; j++) { - wdev_active = pAd->wdev_list[j]; - if (wdev_active && - HcIsRadioAcq(wdev_active) && - (HcGetBandByWdev(wdev) == - HcGetBandByWdev(wdev_active))) { - wdev->channel = - wdev_active->channel; - break; - } - } - APStartUpByBss( - pAd, - &pAd->ApCfg.MBSSID[wdev->func_idx]); - break; - } - } - } - return 0; -} - -INT wapp_bss_stop(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - BSS_STRUCT *pMbss; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - req->data.ifindex)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s():req->data.ifindex = %d\n", - __func__, req->data.ifindex)); - pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - pMbss->wdev.avoid_apcli_linkdown = TRUE; - APStop(pAd, pMbss, AP_BSS_OPER_SINGLE); - pMbss->wdev.avoid_apcli_linkdown = FALSE; - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SYSEM_READY); - } - } - } - return 0; -} - -INT wapp_bss_load_thrd_set(struct _RTMP_ADAPTER *ad, struct wapp_req *req) -{ - int i = 0; - UINT8 band_id; - UINT8 high_thrd; - UINT8 low_thrd; - struct wifi_dev *wdev; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (ad->wdev_list[i] != NULL) { - wdev = ad->wdev_list[i]; - if (wdev->if_dev && - wdev->if_dev->ifindex == req->data.ifindex) { - band_id = HcGetBandByWdev(wdev); - high_thrd = - req->data.bssload_thrd.high_bssload_thrd; - low_thrd = - req->data.bssload_thrd.low_bssload_thrd; - ad->bss_load_info.high_thrd[band_id] = - high_thrd; - ad->bss_load_info.low_thrd[band_id] = low_thrd; - return 0; - } - } - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wdev not found\n")); - return 1; -} - -/* - *========================================================================== - * Description: - * Periodically check the BSS load. Once the load status changes into an abnormal situation (above the - * high threshold/below the low threshold), the WAPP event will be sent. Notice that the event won't - * be sent if the load status stays in the same abnormal situation. - *========================================================================== - */ -VOID wapp_bss_load_check(struct _RTMP_ADAPTER *ad) -{ - int i; - UINT8 band_id; - UINT8 new_load; - UINT8 new_status; - UINT8 current_status; - UINT8 high_thrd; - UINT8 low_thrd; - ULONG up_time; - struct wifi_dev *wdev; - - NdisGetSystemUpTime(&up_time); -#ifdef AP_QLOAD_SUPPORT - QBSS_LoadUpdate(ad, up_time); -#endif /* AP_QLOAD_SUPPORT */ - for (i = 0; i < WDEV_NUM_MAX; i++) { - wdev = ad->wdev_list[i]; - - if ((wdev != NULL) && (wdev->wdev_type == WDEV_TYPE_AP)) { - if (wdev->if_dev == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("!!!! (%s) wdev->ifdev = NULL\n", - __func__)); - continue; - } - band_id = HcGetBandByWdev(wdev); - high_thrd = ad->bss_load_info.high_thrd[band_id]; - low_thrd = ad->bss_load_info.low_thrd[band_id]; - current_status = - ad->bss_load_info.current_status[band_id]; - new_load = get_channel_utilization( - ad, wdev->if_dev->ifindex); - - if (new_load >= high_thrd) - new_status = WAPP_BSSLOAD_HIGH; - else if (new_load <= low_thrd) - new_status = WAPP_BSSLOAD_LOW; - else - new_status = WAPP_BSSLOAD_NORMAL; - - /*The status changes & the new status is an abnormal situation*/ - if (new_status != current_status && - new_status != WAPP_BSSLOAD_NORMAL) - wapp_send_bssload_crossing(ad, wdev, high_thrd, - low_thrd, new_load); - - ad->bss_load_info.current_load[band_id] = new_load; - ad->bss_load_info.current_status[band_id] = new_status; - } - } -} - -INT wapp_config_ap_setting(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - req->data.ifindex)) { -#ifdef CONFIG_MAP_SUPPORT - wdev->MAPCfg.bUnAssocStaLinkMetricRptOpBss = - req->data.ap_conf.sta_report_on_cop; - wdev->MAPCfg.bUnAssocStaLinkMetricRptNonOpBss = - req->data.ap_conf.sta_report_not_cop; - wdev->MAPCfg.bAgentInitRssiSteering = - req->data.ap_conf.rssi_steer; -#endif - } - } - } - return 0; -} - -/* set Tx Power Perventage */ -INT wapp_set_tx_power_prctg(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - UINT8 prctg = (UINT8)req->data.value; - UCHAR Band_Idx = 0; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - req->data.ifindex)) { - Band_Idx = HcGetBandByWdev(wdev); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("(%s) ifindex = %u, prctg = %u\n", - __func__, req->data.ifindex, prctg)); - if (prctg > 0) { - TxPowerPercentCtrl(pAd, TRUE, Band_Idx); - TxPowerDropCtrl(pAd, prctg, Band_Idx); - } else { - TxPowerPercentCtrl(pAd, FALSE, - Band_Idx); - } - } - } - } - return 0; -} - -INT wapp_set_steer_policy(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - req->data.ifindex)) { -#ifdef CONFIG_MAP_SUPPORT - pAd->ApCfg.SteerPolicy.steer_policy = - req->data.str_policy.steer_policy; - pAd->ApCfg.SteerPolicy.cu_thr = - req->data.str_policy.cu_thr; - pAd->ApCfg.SteerPolicy.rcpi_thr = - req->data.str_policy.rcpi_thr; -#endif - } - } - } - return 0; -} - -INT wapp_send_bssload_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - INT i; - struct wifi_dev *wdev; - struct wapp_event event; - - event.event_id = WAPP_BSSLOAD_RSP; - event.ifindex = req->data.ifindex; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - if (pAd->wdev_list[i] != NULL) { - wdev = pAd->wdev_list[i]; - if (wdev->if_dev && - (RtmpOsGetNetIfIndex(wdev->if_dev) == - event.ifindex)) { - event.data.bssload_info.sta_cnt = - MacTableAssocStaNumGet(pAd); - event.data.bssload_info.ch_util = - get_channel_utilization(pAd, - event.ifindex); - event.data.bssload_info.AvalAdmCap = - (0x7a12); /* 0x7a12 * 32us = 1 second */ - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - } - - return 0; -} - -INT wapp_send_he_cap_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - return 0; -} - -INT wapp_send_apcli_rssi_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - struct wapp_event event; - PMAC_TABLE_ENTRY mac_entry; - wapp_apcli_association_info *apcli_info; - - event.event_id = WAPP_APCLI_RSSI_RSP; - event.ifindex = req->data.ifindex; - apcli_info = &event.data.apcli_association_info; - - mac_entry = MacTableLookup(pAd, req->data.mac_addr); - if (mac_entry && mac_entry->wdev->if_dev && IS_ENTRY_APCLI(mac_entry)) { - if (req->data.ifindex == - RtmpOsGetNetIfIndex(mac_entry->wdev->if_dev)) { - apcli_info->rssi = RTMPMaxRssi( - pAd, mac_entry->RssiSample.AvgRssi[0], - mac_entry->RssiSample.AvgRssi[1], - mac_entry->RssiSample.AvgRssi[2] -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - mac_entry->RssiSample.AvgRssi[3] -#endif - ); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - - return 0; -} - -INT wapp_send_sta_rssi_query_rsp(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - struct wapp_event event; - PMAC_TABLE_ENTRY mac_entry; - wapp_client_info *cli_info; - - event.event_id = WAPP_STA_RSSI_RSP; - event.ifindex = req->data.ifindex; - cli_info = &event.data.cli_info; - - mac_entry = MacTableLookup(pAd, req->data.mac_addr); - if (mac_entry && mac_entry->wdev->if_dev && - IS_ENTRY_CLIENT(mac_entry)) { - if (req->data.ifindex == - RtmpOsGetNetIfIndex(mac_entry->wdev->if_dev)) { - COPY_MAC_ADDR(cli_info->mac_addr, mac_entry->Addr); - cli_info->uplink_rssi = RTMPMaxRssi( - pAd, mac_entry->RssiSample.AvgRssi[0], - mac_entry->RssiSample.AvgRssi[1], - mac_entry->RssiSample.AvgRssi[2] -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - mac_entry->RssiSample.AvgRssi[3] -#endif - ); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - } - - return 0; -} - -#ifdef WSC_INCLUDED -INT wapp_send_wsc_scan_complete_notification(PRTMP_ADAPTER pAd, - struct wifi_dev *wdev) -{ - struct wapp_event event; - WSC_CTRL *pWscControl = &wdev->WscControl; - - if (wdev->if_dev) { - event.len = 0; - event.event_id = WAPP_WSC_SCAN_COMP_NOTIF; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - event.data.wsc_scan_info.bss_count = - pWscControl->WscPBCBssCount; - if (pWscControl->WscPBCBssCount == 1) { - NdisCopyMemory(event.data.wsc_scan_info.Uuid, - pWscControl->WscPeerUuid, - sizeof(pWscControl->WscPeerUuid)); - } - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - return 0; -} - -INT wapp_send_wsc_eapol_start_notification(PRTMP_ADAPTER pAd, - struct wifi_dev *wdev) -{ - struct wapp_event event; - - if (wdev->if_dev) { - event.len = 0; - event.event_id = WAPP_WSC_EAPOL_START_NOTIF; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - return 0; -} - -INT wapp_send_wsc_eapol_complete_notif(PRTMP_ADAPTER pAd, struct wifi_dev *wdev) -{ - struct wapp_event event; - - if (wdev->if_dev) { - event.len = 0; - event.event_id = WAPP_WSC_EAPOL_COMPLETE_NOTIF; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - return 0; -} -#endif /* WSC_INCLUDED */ - -#ifdef CONFIG_MAP_SUPPORT -INT wapp_send_scan_complete_notification(PRTMP_ADAPTER pAd, - struct wifi_dev *wdev) -{ - struct wapp_event event; - - if (wdev->if_dev) { - event.len = 0; - event.event_id = WAPP_SCAN_COMPLETE_NOTIF; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - return 0; -} -#endif -#ifdef A4_CONN -/* client disaccos */ -INT wapp_send_a4_entry_missing(PRTMP_ADAPTER pAd, UINT32 ifindex, UCHAR *ip) -{ - struct wapp_event event; - UCHAR *a4_missing_entry_ip; - - event.event_id = WAPP_A4_ENTRY_MISSING_NOTIF; - event.ifindex = ifindex; - a4_missing_entry_ip = (UCHAR *)&event.data.a4_missing_entry_ip; - - NdisCopyMemory(a4_missing_entry_ip, ip, 4); - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - - return 0; -} -#endif -/* client disaccos */ -INT wapp_send_radar_detect_notif(PRTMP_ADAPTER pAd, struct wifi_dev *wdev, - unsigned char channel, unsigned char ch_status) -{ - struct wapp_event event; - - if (wdev->if_dev) { - event.event_id = WAPP_RADAR_DETECT_NOTIF; - event.ifindex = RtmpOsGetNetIfIndex(wdev->if_dev); - event.data.radar_notif.channel = channel; - event.data.radar_notif.status = ch_status; - wext_send_wapp_qry_rsp(pAd->net_dev, &event); - } - return 0; -} - -VOID RTMPIoctlGetScanResults(IN PRTMP_ADAPTER pAdapter, struct wapp_req *req) -{ - struct wapp_event *event; - INT last_bss_cnt = 0; - RTMP_STRING *msg; - INT i = 0; - INT WaitCnt = 0; - UINT32 bss_start_idx; - BSS_ENTRY *bss; - struct scan_bss_info *pBss; - wdev_ht_cap *ht_cap; - wdev_vht_cap *vht_cap; -#ifndef IWEVCUSTOM_PAYLOD_MAX_LEN -#define IWEVCUSTOM_PAYLOD_MAX_LEN 220 -#endif - INT custom_event_length = IWEVCUSTOM_PAYLOD_MAX_LEN; - UINT32 TotalLen = custom_event_length; - INT count = 0, max_bss = 0; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("RTMPIoctlGetSiteSurvey - enter\n")); - /* - * At the moment there is a single scan tab across the pAd - * that means if scan id or if_index has changed, it doesn't - * make sense of continuing the last get scan command. - */ - if ((pAdapter->last_scan_req.scan_id != req->data.value) || - (pAdapter->last_scan_req.if_index != req->data.ifindex)) { - pAdapter->last_scan_req.scan_id = req->data.value; - pAdapter->last_scan_req.if_index = req->data.ifindex; - } else - last_bss_cnt = pAdapter->last_scan_req.last_bss_cnt; - - if (pAdapter->ScanTab.BssNr == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: no bss present in scan tab\n", __func__)); - /*return;*/ - } - max_bss = custom_event_length / sizeof(struct scan_bss_info); - - bss_start_idx = last_bss_cnt; - - TotalLen = (sizeof(CHAR) * 4) + - ((sizeof(struct scan_bss_info)) * max_bss) + - (sizeof(UINT32) * 2); - if ((max_bss > 0) && (TotalLen > custom_event_length)) - max_bss--; - - if (max_bss == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("bss size is too big for wireless send event\n")); - return; - } - TotalLen = (sizeof(CHAR) * 4) + - ((sizeof(struct scan_bss_info)) * max_bss) + - (sizeof(UINT32) * 2); - os_alloc_mem(NULL, (PUCHAR *)&msg, TotalLen); - - if (msg == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RTMPIoctlGetSiteSurvey - msg memory alloc fail.\n")); - return; - } - - NdisZeroMemory(msg, TotalLen); - - event = (struct wapp_event *)msg; - event->event_id = WAPP_SCAN_RESULT_RSP; - event->ifindex = req->data.ifindex; - - if (bss_start_idx > (pAdapter->ScanTab.BssNr - 1)) { - event->data.scan_info.bss_count = 0; - goto send_event; - } - - while ((ScanRunning(pAdapter) == TRUE) && (WaitCnt++ < 200)) - OS_WAIT(500); - - for (i = bss_start_idx; i < pAdapter->ScanTab.BssNr && count < max_bss; - i++) { - bss = &pAdapter->ScanTab.BssEntry[i]; - pBss = &event->data.scan_info.bss[count]; - - ht_cap = &pBss->ht_cap; - vht_cap = &pBss->vht_cap; - if (bss->Channel == 0) - break; - pBss->Channel = bss->Channel; - pBss->CentralChannel = bss->CentralChannel; -#ifdef CONFIG_MAP_SUPPORT - if (pAdapter->ApEnableBeaconTable == TRUE) { - ULONG Idx; - - RemoveOldBssEntry(pAdapter); - Idx = BssTableSearch(&pAdapter->AvailableBSS, - bss->Bssid, bss->Channel); - if (Idx != BSS_NOT_FOUND && - (pAdapter->AvailableBSS.BssEntry[Idx].Channel == - bss->Channel)) - pBss->Rssi = - pAdapter->AvailableBSS.BssEntry[Idx] - .Rssi; - else - pBss->Rssi = bss->Rssi; - } else -#endif - pBss->Rssi = bss->Rssi; - ht_cap->tx_stream = 0; /* TODO */ - ht_cap->rx_stream = 0; /* TODO */ - ht_cap->sgi_20 = bss->HtCapability.HtCapInfo.ShortGIfor20; - ht_cap->sgi_40 = bss->HtCapability.HtCapInfo.ShortGIfor40; - ht_cap->ht_40 = bss->HtCapability.HtCapInfo.ChannelWidth; - - NdisMoveMemory(vht_cap->sup_tx_mcs, - &bss->vht_cap_ie.mcs_set.tx_mcs_map, - sizeof(vht_cap->sup_tx_mcs)); - NdisMoveMemory(vht_cap->sup_rx_mcs, - &bss->vht_cap_ie.mcs_set.rx_mcs_map, - sizeof(vht_cap->sup_rx_mcs)); - if (bss->vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss4 != - VHT_MCS_CAP_NA) - vht_cap->rx_stream = 4; - else if (bss->vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss3 != - VHT_MCS_CAP_NA) - vht_cap->rx_stream = 3; - else if (bss->vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss2 != - VHT_MCS_CAP_NA) - vht_cap->rx_stream = 2; - else - vht_cap->rx_stream = 1; - - if (bss->vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss4 != - VHT_MCS_CAP_NA) - vht_cap->tx_stream = 4; - else if (bss->vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss3 != - VHT_MCS_CAP_NA) - vht_cap->tx_stream = 3; - else if (bss->vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss2 != - VHT_MCS_CAP_NA) - vht_cap->tx_stream = 2; - else - vht_cap->tx_stream = 1; - vht_cap->sgi_80 = bss->vht_cap_ie.vht_cap.sgi_80M; - vht_cap->sgi_160 = bss->vht_cap_ie.vht_cap.sgi_160M; - vht_cap->vht_160 = bss->vht_op_ie.vht_op_info.ch_width; - vht_cap->vht_8080 = 0; /* TODO */ - vht_cap->su_bf = bss->vht_cap_ie.vht_cap.bfee_cap_su; - vht_cap->mu_bf = bss->vht_cap_ie.vht_cap.bfee_cap_mu; - pBss->MinSNR = bss->MinSNR; - pBss->Privacy = bss->Privacy; - pBss->SsidLen = bss->SsidLen; - NdisCopyMemory(pBss->Ssid, bss->Ssid, pBss->SsidLen); - COPY_MAC_ADDR(pBss->Bssid, bss->Bssid); - pBss->AuthMode = bss->AuthMode; -#ifdef CONFIG_MAP_SUPPORT - NdisCopyMemory(&pBss->map_info, &bss->map_info, - sizeof(struct map_vendor_ie)); - pBss->map_vendor_ie_found = bss->map_vendor_ie_found; - pBss->AuthMode = WscGetAuthType(bss->AKMMap); - pBss->EncrypType = WscGetEncryType(bss->PairwiseCipher); -#ifdef MAP_R2 - pBss->QbssLoad.bValid = bss->QbssLoad.bValid; - pBss->QbssLoad.StaNum = bss->QbssLoad.StaNum; - pBss->QbssLoad.ChannelUtilization = - bss->QbssLoad.ChannelUtilization; -#endif - -#endif - count++; - if (pBss->SsidLen) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RTMPIoctlGetSiteSurvey - ssid %s\n", - pBss->Ssid)); - } - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("RTMPIoctlGetSiteSurvey - max_bss%d\n len=%u count=%d", - max_bss, TotalLen, count)); - event->data.scan_info.bss_count = count; - pAdapter->last_scan_req.last_bss_cnt = i; - if (i < pAdapter->ScanTab.BssNr) - event->data.scan_info.more_bss = 1; -send_event: - RtmpOSWrielessEventSend(pAdapter->net_dev, RT_WLAN_EVENT_CUSTOM, - OID_WAPP_EVENT, NULL, (PUCHAR)event, TotalLen); - - os_free_mem((PUCHAR)msg); -} - -VOID RTMPIoctlSendNullDataFrame(IN PRTMP_ADAPTER pAdapter, struct wapp_req *req) -{ - INT count, pkt_count; - MAC_TABLE_ENTRY *pEntry = MacTableLookup(pAdapter, req->data.mac_addr); - - if (!pEntry) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("given station not found\n")); - return; - } - - pkt_count = req->data.value; - - if (pEntry->PsMode == PWR_SAVE) { - /* use TIM bit to detect the PS station */ - WLAN_MR_TIM_BIT_SET(pAdapter, pEntry->func_tb_idx, pEntry->Aid); - OS_WAIT(200); - } else { - /* use Null or QoS Null to detect the ACTIVE station */ - BOOLEAN bQosNull = FALSE; - - if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)) - bQosNull = TRUE; - - for (count = 0; count < pkt_count; count++) { - /* TODO status */ - RtmpEnqueueNullFrame(pAdapter, pEntry->Addr, - pEntry->CurrTxRate, pEntry->Aid, - pEntry->func_tb_idx, bQosNull, - TRUE, 0); - } - } -} - -void wapp_prepare_nop_channel_list(PRTMP_ADAPTER pAd, - struct nop_channel_list_s *nop_list) -{ -#ifdef MT_DFS_SUPPORT - UINT_8 i; - PDFS_PARAM pDfsParam = &pAd->CommonCfg.DfsParameter; - - for (i = 0; i < pDfsParam->ChannelListNum; i++) { - if (pDfsParam->DfsChannelList[i].NonOccupancy > 0 && - (nop_list->channel_count < MAX_NUM_OF_WAPP_CHANNELS)) { - nop_list->channel_list[nop_list->channel_count] = - pDfsParam->DfsChannelList[i].Channel; - nop_list->channel_count++; - } - } -#endif /* MT_DFS_SUPPORT */ -} -INT wapp_event_handle(PRTMP_ADAPTER pAd, struct wapp_req *req) -{ - switch (req->req_id) { - case WAPP_DEV_QUERY_REQ: - wapp_send_wdev_query_rsp(pAd, req); - break; - case WAPP_HT_CAP_QUERY_REQ: - wapp_send_wdev_ht_cap_rsp(pAd, req); - break; - case WAPP_VHT_CAP_QUERY_REQ: - wapp_send_wdev_vht_cap_rsp(pAd, req); - break; - case WAPP_MISC_CAP_QUERY_REQ: - wapp_send_wdev_misc_cap_rsp(pAd, req); - break; - case WAPP_CLI_QUERY_REQ: - wapp_send_cli_query_rsp(pAd, req); - break; - case WAPP_CLI_LIST_QUERY_REQ: - wapp_handle_cli_list_query(pAd, req); - break; - case WAPP_CHN_LIST_QUERY_REQ: - wapp_send_chn_list_query_rsp(pAd, req); - break; - case WAPP_OP_CLASS_QUERY_REQ: - wapp_send_op_class_query_rsp(pAd, req); - break; - case WAPP_BSS_INFO_QUERY_REQ: - wapp_send_bss_info_query_rsp(pAd, req); - break; - case WAPP_AP_METRIC_QUERY_REQ: - wapp_send_ap_metric_query_rsp(pAd, req); - break; -#ifdef MAP_R2 - case WAPP_RADIO_METRICS_REQ: - wapp_send_radio_metric_query_rsp(pAd, req); - break; -#endif - case WAPP_CH_UTIL_QUERY_REQ: - wapp_send_ch_util_query_rsp(pAd, req); - break; - case WAPP_APCLI_QUERY_REQ: - wapp_send_apcli_query_rsp(pAd, req); - break; - case WAPP_BSS_START_REQ: - wapp_bss_start(pAd, req); - break; - case WAPP_BSS_STOP_REQ: - wapp_bss_stop(pAd, req); - break; - case WAPP_BSS_LOAD_THRD_SET_REQ: - wapp_bss_load_thrd_set(pAd, req); - break; - case WAPP_TXPWR_PRCTG_REQ: - wapp_set_tx_power_prctg(pAd, req); - break; - case WAPP_STEERING_POLICY_SET_REQ: - wapp_set_steer_policy(pAd, req); - break; - case WAPP_AP_CONFIG_SET_REQ: - wapp_config_ap_setting(pAd, req); - break; - case WAPP_BSSLOAD_QUERY_REQ: - wapp_send_bssload_query_rsp(pAd, req); - break; - case WAPP_HECAP_QUERY_REQ: - wapp_send_he_cap_query_rsp(pAd, req); - break; - case WAPP_STA_RSSI_QUERY_REQ: - wapp_send_sta_rssi_query_rsp(pAd, req); - break; - case WAPP_APCLI_RSSI_QUERY_REQ: - wapp_send_apcli_rssi_query_rsp(pAd, req); - break; - case WAPP_GET_SCAN_RESULTS: - RTMPIoctlGetScanResults(pAd, req); - break; -#ifdef WSC_INCLUDED - case WAPP_WSC_PBC_EXEC: { - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex = pObj->ioctl_if; - PWSC_CTRL pWscControl = NULL; - - if (ifIndex >= MAX_APCLI_NUM) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_RRM, DBG_LVL_OFF, - ("Unknown If index (%d)", ifIndex)); - return NDIS_STATUS_FAILURE; - } - pWscControl = &pAd->ApCfg.ApCliTab[ifIndex].wdev.WscControl; - WscPBCExec(pAd, FALSE, pWscControl); - break; - } -#endif /* WSC_INCLUDED */ - case WAPP_SEND_NULL_FRAMES: - RTMPIoctlSendNullDataFrame(pAd, req); - break; -#ifdef WSC_INCLUDED - case WAPP_WSC_SET_BH_PROFILE: { - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex = pObj->ioctl_if; - PWSC_CTRL pWscControl = NULL; - int i = 0; - - pWscControl = &pAd->ApCfg.MBSSID[ifIndex].wdev.WscControl; - for (i = 0; i < pWscControl->WscBhProfiles.ProfileCnt; i++) { - if (MAC_ADDR_EQUAL(pWscControl->WscBhProfiles.Profile[i] - .MacAddr, - req->data.bh_wsc_profile.MacAddr)) { - NdisCopyMemory( - &pWscControl->WscBhProfiles.Profile[i], - &req->data.bh_wsc_profile, - sizeof(WSC_CREDENTIAL)); - break; - } - } - if (i == pWscControl->WscBhProfiles.ProfileCnt) { - NdisCopyMemory(&pWscControl->WscBhProfiles.Profile[i], - &req->data.bh_wsc_profile, - sizeof(WSC_CREDENTIAL)); - pWscControl->WscBhProfiles.ProfileCnt++; - } - break; - } -#endif /* WSC_INCLUDED */ -#ifdef CONFIG_MAP_SUPPORT - case WAPP_SET_SCAN_BH_SSIDS: { - struct wifi_dev *wdev; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR ifIndex = pObj->ioctl_if; -#ifdef APCLI_SUPPORT - if (pObj->ioctl_if_type == INT_APCLI) { - if (ifIndex > MAX_APCLI_NUM) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("break if index is wrong\n")); - break; - } - wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev; - } else -#endif - { - if (pObj->ioctl_if_type == INT_MBSSID) - wdev = &pAd->ApCfg.MBSSID[ifIndex].wdev; - else - wdev = &pAd->ApCfg.MBSSID[0].wdev; - } - - NdisZeroMemory(&wdev->MAPCfg.scan_bh_ssids, - sizeof(wdev->MAPCfg.scan_bh_ssids)); - NdisCopyMemory(&wdev->MAPCfg.scan_bh_ssids, - &req->data.scan_bh_ssids, - sizeof(wdev->MAPCfg.scan_bh_ssids)); - break; - } - case WAPP_SET_AVOID_SCAN_CAC: - pAd->bMAPAvoidScanDuringCac = (UINT8)req->data.value; - break; -#endif - default: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("invalid wapp req id=%d\n", req->req_id)); - break; - } - return 0; -} - -INT set_wapp_param(IN PRTMP_ADAPTER pAd, UINT32 Param, UINT32 Value) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR APIndex = pObj->ioctl_if; - PWNM_CTRL pWNMCtrl; - PGAS_CTRL pGASCtrl; - -#ifdef CONFIG_HOTSPOT_R2 - PHOTSPOT_CTRL pHSCtrl; - pHSCtrl = &pAd->ApCfg.MBSSID[APIndex].HotSpotCtrl; -#endif /* CONFIG_HOTSPOT_R2 */ - - pWNMCtrl = &pAd->ApCfg.MBSSID[APIndex].WNMCtrl; - pGASCtrl = &pAd->ApCfg.MBSSID[APIndex].GASCtrl; - - switch (Param) { - case PARAM_WNM_BSS_TRANSITION_MANAGEMENT: - pWNMCtrl->WNMBTMEnable = Value; - break; - - case PARAM_EXTERNAL_ANQP_SERVER_TEST: - pGASCtrl->ExternalANQPServerTest = Value; - break; - - case PARAM_GAS_COME_BACK_DELAY: - pGASCtrl->cb_delay = Value; - break; - - case PARAM_MMPDU_SIZE: - pGASCtrl->MMPDUSize = Value; - break; - - case PARAM_WNM_NOTIFICATION: - pWNMCtrl->WNMNotifyEnable = Value; - break; -#ifdef CONFIG_HOTSPOT_R2 - - case PARAM_QOSMAP: - pHSCtrl->QosMapEnable = Value; - hotspot_update_bssflag(pAd, fgQosMapEnable, Value, pHSCtrl); - break; - case PARAM_DGAF_DISABLED: - pHSCtrl->DGAFDisable = Value; - hotspot_update_bssflag(pAd, fgDGAFDisable, Value, pHSCtrl); - break; - - case PARAM_PROXY_ARP: - pWNMCtrl->ProxyARPEnable = Value; - hotspot_update_bssflag(pAd, fgProxyArpEnable, Value, pHSCtrl); - break; - - case PARAM_L2_FILTER: - pHSCtrl->L2Filter = Value; - break; - - case PARAM_ICMPV4_DENY: - pHSCtrl->ICMPv4Deny = Value; - break; - -#endif /* CONFIG_HOTSPOT_R2 */ - default: - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Unknow Parameter:%d\n", Param)); - break; - } -#ifdef CONFIG_HOTSPOT_R2 - /* for 7615 offload to CR4 */ - hotspot_update_bss_info_to_cr4(pAd, APIndex); -#endif /* CONFIG_HOTSPOT_R2 */ - - return 0; -} - -static INT set_wapp_cmm_ie(IN PRTMP_ADAPTER pAd, IN UINT8 EID, - IN RTMP_STRING *IE, IN UINT32 IELen) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[apidx].WNMCtrl; - PGAS_CTRL pGasCtrl = &pAd->ApCfg.MBSSID[apidx].GASCtrl; -#ifdef CONFIG_HOTSPOT_R2 - PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[apidx].HotSpotCtrl; -#endif /* CONFIG_HOTSPOT_R2 */ - - switch (EID) { - case IE_INTERWORKING: - if (pGasCtrl->InterWorkingIE != NULL) { - os_free_mem(pGasCtrl->InterWorkingIE); - pGasCtrl->InterWorkingIE = NULL; - pGasCtrl->InterWorkingIELen = 0; - } - os_alloc_mem(NULL, &pGasCtrl->InterWorkingIE, IELen); - NdisMoveMemory(pGasCtrl->InterWorkingIE, IE, IELen); - pGasCtrl->InterWorkingIELen = IELen; -#ifdef CONFIG_HOTSPOT_R2 - pHSCtrl->AccessNetWorkType = (*(IE + 2)) & 0x0F; - if (IELen > 3) { - pHSCtrl->IsHessid = TRUE; - - if (IELen == 7) - NdisMoveMemory(pHSCtrl->Hessid, IE + 3, - MAC_ADDR_LEN); - else - NdisMoveMemory(pHSCtrl->Hessid, IE + 5, - MAC_ADDR_LEN); - } -#endif /* CONFIG_HOTSPOT_R2 */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set Interworking IE\n")); - break; - case IE_ADVERTISEMENT_PROTO: - if (pGasCtrl->AdvertisementProtoIE != NULL) { - os_free_mem(pGasCtrl->AdvertisementProtoIE); - pGasCtrl->AdvertisementProtoIE = NULL; - pGasCtrl->AdvertisementProtoIELen = 0; - } - os_alloc_mem(NULL, &pGasCtrl->AdvertisementProtoIE, IELen); - NdisMoveMemory(pGasCtrl->AdvertisementProtoIE, IE, IELen); - pGasCtrl->AdvertisementProtoIELen = IELen; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set Advertisement Protocol IE\n")); - break; - - case IE_TIME_ADVERTISEMENT: - if (pWNMCtrl->TimeadvertisementIE != NULL) { - os_free_mem(pWNMCtrl->TimeadvertisementIE); - pWNMCtrl->TimeadvertisementIE = NULL; - pWNMCtrl->TimeadvertisementIELen = 0; - } - os_alloc_mem(NULL, &pWNMCtrl->TimeadvertisementIE, IELen); - NdisMoveMemory(pWNMCtrl->TimeadvertisementIE, IE, IELen); - pWNMCtrl->TimeadvertisementIELen = IELen; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set Time Advertisement IE\n")); - break; - - case IE_TIME_ZONE: - if (pWNMCtrl->TimezoneIE != NULL) { - os_free_mem(pWNMCtrl->TimezoneIE); - pWNMCtrl->TimezoneIE = NULL; - pWNMCtrl->TimezoneIELen = 0; - } - os_alloc_mem(NULL, &pWNMCtrl->TimezoneIE, IELen); - NdisMoveMemory(pWNMCtrl->TimezoneIE, IE, IELen); - pWNMCtrl->TimezoneIELen = IELen; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set Time Zone IE\n")); - break; -#ifdef CONFIG_HOTSPOT_R2 - case IE_QOS_MAP_SET: { - int tmp = 0; - char *pos = (char *)(IE + 2); - if (pHSCtrl->QosMapSetIE != NULL) { - os_free_mem(pHSCtrl->QosMapSetIE); - pHSCtrl->QosMapSetIE = NULL; - pHSCtrl->QosMapSetIELen = 0; - } - os_alloc_mem(NULL, &pHSCtrl->QosMapSetIE, IELen); - NdisMoveMemory(pHSCtrl->QosMapSetIE, IE, IELen); - pHSCtrl->QosMapSetIELen = IELen; - - for (tmp = 0; tmp < (IELen - 16 - 2) / 2; tmp++) { - pHSCtrl->DscpException[tmp] = *pos & 0xff; - pHSCtrl->DscpException[tmp] |= (*(pos + 1) & 0xff) << 8; - pos += 2; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DscpException[%d]:0x%x\n", tmp, - pHSCtrl->DscpException[tmp])); - } - - for (tmp = 0; tmp < 8; tmp++) { - pHSCtrl->DscpRange[tmp] = *pos & 0xff; - pHSCtrl->DscpRange[tmp] |= (*(pos + 1) & 0xff) << 8; - pos += 2; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DscpRange[%d]:0x%x\n", tmp, - pHSCtrl->DscpRange[tmp])); - } - - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("=========================================== Set Qos MAP Set IE\n")); - break; - } - - case IE_ROAMING_CONSORTIUM: - if (pHSCtrl->RoamingConsortiumIE != NULL) { - os_free_mem(pHSCtrl->RoamingConsortiumIE); - pHSCtrl->RoamingConsortiumIE = NULL; - pHSCtrl->RoamingConsortiumIELen = 0; - } - os_alloc_mem(NULL, &pHSCtrl->RoamingConsortiumIE, IELen); - NdisMoveMemory(pHSCtrl->RoamingConsortiumIE, IE, IELen); - pHSCtrl->RoamingConsortiumIELen = IELen; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set Roaming Consortium IE\n")); - break; -#endif /* CONFIG_HOTSPOT_R2 */ - - default: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown IE(EID = %d)\n", __func__, EID)); - break; - } - - return TRUE; -} - -static void Set_MTK_VENDOR_SPECIFIC_IE(IN PRTMP_ADAPTER pAd, IN UINT8 OUIType, - IN RTMP_STRING *IE, IN UINT32 IELen, - IN UCHAR apidx) -{ -#ifdef CONFIG_MAP_SUPPORT - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - if (!IS_MAP_TURNKEY_ENABLE(pAd)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("MAP turnkey is not enabled, skipping vendor ie settings\n")); - return; - } - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Set MTK IE\n")); - os_zero_mem(wdev->MAPCfg.vendor_ie_buf, VENDOR_SPECIFIC_LEN); - wdev->MAPCfg.vendor_ie_len = IELen; - NdisMoveMemory(wdev->MAPCfg.vendor_ie_buf, IE, - wdev->MAPCfg.vendor_ie_len); - if (wdev->bAllowBeaconing) - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); -#endif -} - -static INT Set_AP_VENDOR_SPECIFIC_IE(IN PRTMP_ADAPTER pAd, IN UINT8 OUIType, - IN RTMP_STRING *IE, IN UINT32 IELen) -{ -#ifdef CONFIG_HOTSPOT - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[apidx].HotSpotCtrl; -#endif - - switch (OUIType) { -#ifdef CONFIG_HOTSPOT - - case OUI_P2P: - os_alloc_mem(NULL, &pHSCtrl->P2PIE, IELen); - NdisMoveMemory(pHSCtrl->P2PIE, IE, IELen); - pHSCtrl->P2PIELen = IELen; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set P2P IE\n")); - break; - - case OUI_HS2_INDICATION: - os_alloc_mem(NULL, &pHSCtrl->HSIndicationIE, IELen); - NdisMoveMemory(pHSCtrl->HSIndicationIE, IE, IELen); - pHSCtrl->HSIndicationIELen = IELen; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Set HS2.0 Indication IE\n")); - break; -#endif - - default: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown OUIType = %d\n", __func__, OUIType)); - break; - } - - return TRUE; -} - -INT wapp_set_ap_ie(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *IE, IN UINT32 IELen, - IN UCHAR ApIdx) -{ - UINT8 EID; - UINT8 OUIType; - - EID = *IE; - - switch (EID) { - case IE_INTERWORKING: - case IE_ADVERTISEMENT_PROTO: - case IE_TIME_ADVERTISEMENT: - case IE_TIME_ZONE: - case IE_QOS_MAP_SET: - case IE_ROAMING_CONSORTIUM: - set_wapp_cmm_ie(pAd, EID, IE, IELen); - break; - - case IE_VENDOR_SPECIFIC: - OUIType = *(IE + 5); - if (NdisEqualMemory(&IE[2], &MTK_OUI[0], 3)) - Set_MTK_VENDOR_SPECIFIC_IE(pAd, OUIType, IE, IELen, - ApIdx); - else - Set_AP_VENDOR_SPECIFIC_IE(pAd, OUIType, IE, IELen); - break; - - default: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown IE(EID = %d)\n", __func__, EID)); - break; - } - - return TRUE; -} - -BOOLEAN wapp_init(PRTMP_ADAPTER pAd, BSS_STRUCT *pMbss) -{ - NdisCopyMemory(pMbss->ESPI_AC_BE, ESPI_AC_BE_DEFAULT, - sizeof(pMbss->ESPI_AC_BE)); - NdisCopyMemory(pMbss->ESPI_AC_BK, ESPI_AC_BK_DEFAULT, - sizeof(pMbss->ESPI_AC_BK)); - NdisCopyMemory(pMbss->ESPI_AC_VO, ESPI_AC_VO_DEFAULT, - sizeof(pMbss->ESPI_AC_VO)); - NdisCopyMemory(pMbss->ESPI_AC_VI, ESPI_AC_VI_DEFAULT, - sizeof(pMbss->ESPI_AC_VI)); - return 0; -} - -#endif /* WAPP_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_basic.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_basic.c deleted file mode 100644 index edba9d7415..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_basic.c +++ /dev/null @@ -1,274 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#include "rt_config.h" -#include "wlan_config/config_internal.h" - -/* -* private structure definition to prevent direct access -*/ -static VOID wlan_config_init(struct wlan_config *obj) -{ - phy_cfg_init(&obj->phy_conf); - ht_cfg_init(&obj->ht_conf); -#ifdef DOT11_VHT_AC - vht_cfg_init(&obj->vht_conf); -#endif /* DOT11_VHT_AC */ -} - -static VOID wlan_config_exit(struct wlan_config *obj) -{ - phy_cfg_exit(&obj->phy_conf); - ht_cfg_exit(&obj->ht_conf); -#ifdef DOT11_VHT_AC - vht_cfg_exit(&obj->vht_conf); -#endif /* DOT11_VHT_AC */ -} - -static INT32 wpf_config_acquire(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev) -{ - int i; - struct wpf_ctrl *ctrl = &ad->wpf; - struct wpf_data *pf; - - if (wdev->wpf_cfg || wdev->wpf_op) - return 0; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - pf = &ctrl->pf[i]; - - if (pf->dev == NULL) { - wdev->wpf_cfg = pf->conf; - wdev->wpf_op = pf->oper; - pf->dev = wdev; - return 0; - } - } - - return -1; -} - -static INT32 wpf_config_release(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev) -{ - int i; - struct wpf_ctrl *ctrl = &ad->wpf; - struct wpf_data *pf; - - if ((wdev->wpf_cfg == NULL) && (wdev->wpf_op == NULL)) - return 0; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - pf = &ctrl->pf[i]; - - if (pf->dev == wdev) { - pf->dev = NULL; - break; - } - } - - wdev->wpf_cfg = NULL; - wdev->wpf_op = NULL; - return 0; -} - -VOID wpf_config_init(struct _RTMP_ADAPTER *ad) -{ - int i; - struct wpf_ctrl *ctrl = &ad->wpf; - struct wpf_data *pf; - - os_zero_mem(ctrl->pf, sizeof(ctrl->pf)); - - for (i = 0; i < WDEV_NUM_MAX; i++) { - pf = &ctrl->pf[i]; - pf->idx = i; - os_alloc_mem(NULL, (UCHAR **)&pf->conf, - sizeof(struct wlan_config)); - - if (pf->conf) { - os_zero_mem(pf->conf, sizeof(struct wlan_config)); - wlan_config_init(pf->conf); - } - - os_alloc_mem(NULL, (UCHAR **)&pf->oper, - sizeof(struct wlan_operate)); - - if (pf->oper) - os_zero_mem(pf->oper, sizeof(struct wlan_operate)); - } -} - -VOID wpf_config_exit(struct _RTMP_ADAPTER *ad) -{ - int i; - struct wpf_ctrl *ctrl = &ad->wpf; - struct wpf_data *pf; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - pf = &ctrl->pf[i]; - pf->idx = i; - - if (pf->conf) { - wlan_config_exit(pf->conf); - os_free_mem(pf->conf); - } - - pf->conf = NULL; - - if (pf->oper) - os_free_mem(pf->oper); - - pf->oper = NULL; - } - - os_zero_mem(ctrl->pf, sizeof(ctrl->pf)); -} - -/* -* assign order: ( MBSS | STA ) > WDS > APCLI > P2P > MESH -*/ -VOID wpf_init(struct _RTMP_ADAPTER *ad) -{ - struct wifi_dev *wdev; - int i; - /*do not change order*/ -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(ad) - { - for (i = 0; i < MAX_MBSSID_NUM(ad); i++) { - wdev = &ad->ApCfg.MBSSID[i].wdev; - - if (wpf_config_acquire(ad, wdev) < 0) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:[ERROR] wdev_cfg is full!\n", - __func__)); - return; - } - } - -#ifdef WDS_SUPPORT - - for (i = 0; i < MAX_WDS_ENTRY; i++) { - wdev = &ad->WdsTab.WdsEntry[i].wdev; - - if (wpf_config_acquire(ad, wdev) < 0) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:[ERROR] wdev_cfg is full!\n", - __func__)); - return; - } - } - -#endif /*WDS_SUPPORT*/ -#ifdef APCLI_SUPPORT - - for (i = 0; i < MAX_APCLI_NUM; i++) { - wdev = &ad->ApCfg.ApCliTab[i].wdev; - - if (wpf_config_acquire(ad, wdev) < 0) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:[ERROR] wdev_cfg is full!\n", - __func__)); - return; - } - } - -#endif /*APCLI_SUPPORT*/ -#ifdef SNIFFER_SUPPORT - for (i = 0; i < MONITOR_MAX_DEV_NUM; i++) { - wdev = &ad->monitor_ctrl[i].wdev; - if (wpf_config_acquire(ad, wdev) < 0) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:[ERROR] wdev_cfg is full!\n", - __func__)); - return; - } - } -#endif - } -#endif /*CONFIG_AP_SUPPORT*/ -} - -VOID wpf_exit(struct _RTMP_ADAPTER *ad) -{ - struct wifi_dev *wdev; - int i; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(ad) - { - for (i = 0; i < MAX_MBSSID_NUM(ad); i++) { - wdev = &ad->ApCfg.MBSSID[i].wdev; - - if (wpf_config_release(ad, wdev) < 0) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:[ERROR] wdev_cfg is full!\n", - __func__)); - return; - } - } - -#ifdef WDS_SUPPORT - - for (i = 0; i < MAX_WDS_ENTRY; i++) { - wdev = &ad->WdsTab.WdsEntry[i].wdev; - - if (wpf_config_release(ad, wdev) < 0) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:[ERROR] wdev_cfg is full!\n", - __func__)); - return; - } - } - -#endif /*WDS_SUPPORT*/ -#ifdef APCLI_SUPPORT - - for (i = 0; i < MAX_APCLI_NUM; i++) { - wdev = &ad->ApCfg.ApCliTab[i].wdev; - - if (wpf_config_release(ad, wdev) < 0) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:[ERROR] wdev_cfg is full!\n", - __func__)); - return; - } - } - -#endif /*APCLI_SUPPORT*/ -#ifdef SNIFFER_SUPPORT - for (i = 0; i < MONITOR_MAX_DEV_NUM; i++) { - wdev = &ad->monitor_ctrl[i].wdev; - if (wpf_config_release(ad, wdev) < 0) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s:[ERROR] wdev_cfg is full!\n", - __func__)); - return; - } - } -#endif - } -#endif /*CONFIG_AP_SUPPORT*/ -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_ht.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_ht.c deleted file mode 100644 index dd39d443f2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_ht.c +++ /dev/null @@ -1,367 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#include "rt_config.h" -#include "wlan_config/config_internal.h" - -/* -*ht phy info related -*/ -VOID ht_cfg_init(struct ht_cfg *obj) -{ - /*initial ht_phy_info value*/ - obj->ht_bw = HT_BW_20; - obj->ext_cha = EXTCHA_NOASSIGN; - obj->ht_ldpc = TRUE; - obj->ht_stbc = STBC_USE; - obj->ht_gi = GI_400; - obj->ht_protect_en = TRUE; - obj->min_mpdu_start_space = MPDU_DENSITY_NO_RESTRICT; - obj->amsdu_en = TRUE; - obj->ht40_intolerant = FALSE; - obj->mmps = MMPS_DISABLE; - obj->frag_thld = DEFAULT_FRAG_THLD; - obj->len_thld = DEFAULT_RTS_LEN_THLD; - obj->pkt_thld = DEFAULT_RTS_PKT_THLD; -} - -VOID ht_cfg_exit(struct ht_cfg *obj) -{ - os_zero_mem(obj, sizeof(struct ht_cfg)); -} - -/* - * export configure function - */ -/* - *Set - */ -VOID wlan_config_set_ht_bw(struct wifi_dev *wdev, UCHAR ht_bw) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - cfg->ht_conf.ht_bw = ht_bw; - - wlan_operate_set_support_ch_width_set(wdev, ht_bw); -} - -VOID wlan_config_set_ht_bw_all(struct wpf_ctrl *ctrl, UCHAR ht_bw) -{ - struct wlan_config *cfg; - unsigned int i; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - cfg = (struct wlan_config *)ctrl->pf[i].conf; - cfg->ht_conf.ht_bw = ht_bw; - } -} - -VOID wlan_config_set_ext_cha(struct wifi_dev *wdev, UCHAR ext_cha) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->ht_conf.ext_cha = ext_cha; -} - -VOID wlan_config_set_ht_stbc(struct wifi_dev *wdev, UCHAR ht_stbc) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.ht_stbc = ht_stbc; -} - -VOID wlan_config_set_ht_ldpc(struct wifi_dev *wdev, UCHAR ht_ldpc) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.ht_ldpc = ht_ldpc; -} - -VOID wlan_config_set_ht_mode(struct wifi_dev *wdev, UCHAR ht_mode) -{ - struct wlan_config *cfg = NULL; - UCHAR gf_support; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) { - cfg->ht_conf.ht_mode = ht_mode; - gf_support = (ht_mode == HTMODE_GF) ? 1 : 0; - cfg->ht_conf.gf_support = gf_support; - } -} - -VOID wlan_config_set_40M_intolerant(struct wifi_dev *wdev, UCHAR val) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.ht40_intolerant = val; -} - -VOID wlan_config_set_mmps(struct wifi_dev *wdev, UCHAR mmps) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.mmps = mmps; -} - -VOID wlan_config_set_edca_valid(struct wifi_dev *wdev, BOOLEAN bValid) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.EdcaParm.bValid = bValid; -} - -VOID wlan_config_set_edca_valid_all(struct wpf_ctrl *ctrl, BOOLEAN bValid) -{ - struct wlan_config *cfg; - unsigned int i; - for (i = 0; i < WDEV_NUM_MAX; i++) { - cfg = (struct wlan_config *)ctrl->pf[i].conf; - if (cfg) - cfg->ht_conf.EdcaParm.bValid = bValid; - } -} - -VOID wlan_config_set_ht_gi(struct wifi_dev *wdev, UCHAR ht_gi) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.ht_gi = ht_gi; -} - -VOID wlan_config_set_ht_protect_en(struct wifi_dev *wdev, UCHAR ht_protect_en) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.ht_protect_en = ht_protect_en; -} - -VOID wlan_config_set_amsdu_en(struct wifi_dev *wdev, UCHAR enable) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.amsdu_en = enable; -} - -VOID wlan_config_set_frag_thld(struct wifi_dev *wdev, UINT32 frag_thld) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.frag_thld = frag_thld; -} - -VOID wlan_config_set_rts_len_thld(struct wifi_dev *wdev, UINT32 len_thld) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.len_thld = len_thld; -} - -VOID wlan_config_set_rts_pkt_thld(struct wifi_dev *wdev, UCHAR pkt_num) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.pkt_thld = pkt_num; -} - -VOID wlan_config_set_min_mpdu_start_space(struct wifi_dev *wdev, - UCHAR mpdu_density) -{ - struct wlan_config *cfg = NULL; - - cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - cfg->ht_conf.min_mpdu_start_space = mpdu_density; -} - -/* -*Get -*/ -UCHAR wlan_config_get_ht_bw(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->ht_conf.ht_bw; -} - -UCHAR wlan_config_get_ext_cha(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->ht_conf.ext_cha; -} - -UCHAR wlan_config_get_ht_stbc(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->ht_conf.ht_stbc; -} - -UCHAR wlan_config_get_ht_ldpc(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->ht_conf.ht_ldpc; -} - -BOOLEAN wlan_config_get_edca_valid(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - return cfg->ht_conf.EdcaParm.bValid; - else - return FALSE; -} - -struct _EDCA_PARM *wlan_config_get_ht_edca(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - if (cfg) - return &cfg->ht_conf.EdcaParm; - else - return NULL; -} - -UCHAR wlan_config_get_ht_gi(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.ht_gi; - else - return 1; -} - -UCHAR wlan_config_get_ht_protect_en(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.ht_protect_en; - else - return 1; -} - -UCHAR wlan_config_get_ht_mode(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.ht_mode; - return HTMODE_MM; -} - -UCHAR wlan_config_get_greenfield(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.gf_support; - return 0; -} - -UCHAR wlan_config_get_40M_intolerant(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.ht40_intolerant; - return 0; -} - -UCHAR wlan_config_get_amsdu_en(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.amsdu_en; - return 0; -} - -UINT32 wlan_config_get_frag_thld(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.frag_thld; - else - return DEFAULT_FRAG_THLD; -} -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(wlan_config_get_frag_thld); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ - -UINT32 wlan_config_get_rts_len_thld(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.len_thld; - else - return DEFAULT_RTS_LEN_THLD; -} - -UCHAR wlan_config_get_rts_pkt_thld(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.pkt_thld; - else - return DEFAULT_RTS_PKT_THLD; -} - -UCHAR wlan_config_get_min_mpdu_start_space(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.min_mpdu_start_space; - return 0; -} - -UCHAR wlan_config_get_mmps(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - if (cfg) - return cfg->ht_conf.mmps; - return MMPS_DISABLE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_phy.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_phy.c deleted file mode 100644 index d710710876..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_phy.c +++ /dev/null @@ -1,165 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#include "rt_config.h" -#include "wlan_config/config_internal.h" - -/* -* define constructor & deconstructor & method -*/ -/* -*basic phy related -*/ -VOID phy_cfg_init(struct phy_cfg *obj) -{ -#ifdef TXBF_SUPPORT - obj->ETxBfEnCond = SUBF_OFF; - obj->ITxBfEn = SUBF_OFF; -#endif /* TXBF_SUPPORT */ -} - -VOID phy_cfg_exit(struct phy_cfg *obj) -{ - os_zero_mem(obj, sizeof(struct phy_cfg)); -} - -/* -* Operater loader -*/ - -/* -* export function -*/ -/* -* configure functio -*/ -VOID wlan_config_set_cen_ch_2(struct wifi_dev *wdev, UCHAR cen_ch_2) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->phy_conf.cen_ch_2 = cen_ch_2; -} - -VOID wlan_config_set_cen_ch_2_all(struct wpf_ctrl *ctrl, UCHAR cen_ch_2) -{ - struct wlan_config *cfg; - unsigned int i; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - cfg = (struct wlan_config *)ctrl->pf[i].conf; - cfg->phy_conf.cen_ch_2 = cen_ch_2; - } -} - -/* -*Set -*/ -VOID wlan_config_set_ack_policy(struct wifi_dev *wdev, UCHAR *policy) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - UCHAR i = 0; - for (i = 0; i < WMM_NUM_OF_AC; i++) { - cfg->phy_conf.ack_policy[i] = policy[i]; - } -} - -VOID wlan_config_set_ack_policy_all(struct wpf_ctrl *ctrl, UCHAR *policy) -{ - struct wlan_config *cfg; - UCHAR i; - UCHAR j; - for (i = 0; i < WDEV_NUM_MAX; i++) { - cfg = (struct wlan_config *)ctrl->pf[i].conf; - for (j = 0; j < WMM_NUM_OF_AC; j++) { - cfg->phy_conf.ack_policy[j] = policy[j]; - } - } -} - -VOID wlan_config_set_tx_stream(struct wifi_dev *wdev, UINT8 tx_stream) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->phy_conf.tx_stream = tx_stream; -} - -VOID wlan_config_set_rx_stream(struct wifi_dev *wdev, UINT8 rx_stream) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->phy_conf.rx_stream = rx_stream; -} - -#ifdef TXBF_SUPPORT -VOID wlan_config_set_etxbf(struct wifi_dev *wdev, UCHAR ETxBfEnCond) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->phy_conf.ETxBfEnCond = ETxBfEnCond; -} - -VOID wlan_config_set_itxbf(struct wifi_dev *wdev, UCHAR ITxBfEn) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->phy_conf.ITxBfEn = ITxBfEn; -} -#endif /* TXBF_SUPPORT */ - -/* -*Get -*/ -UCHAR wlan_config_get_cen_ch_2(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - return cfg->phy_conf.cen_ch_2; -} - -UCHAR wlan_config_get_ack_policy(struct wifi_dev *wdev, UCHAR ac_id) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - return cfg->phy_conf.ack_policy[ac_id]; -} - -UINT8 wlan_config_get_tx_stream(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->phy_conf.tx_stream; -} - -UINT8 wlan_config_get_rx_stream(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->phy_conf.rx_stream; -} - -#ifdef TXBF_SUPPORT -UCHAR wlan_config_get_etxbf(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - return cfg->phy_conf.ETxBfEnCond; -} - -UCHAR wlan_config_get_itxbf(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - return cfg->phy_conf.ITxBfEn; -} -#endif /* TXBF_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_vht.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_vht.c deleted file mode 100644 index e28c8f33fd..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/embedded/wlan_config/config_vht.c +++ /dev/null @@ -1,147 +0,0 @@ -/*************************************************************************** -* MediaTek Inc. -* 4F, No. 2 Technology 5th Rd. -* Science-based Industrial Park -* Hsin-chu, Taiwan, R.O.C. -* -* (c) Copyright 1997-2012, MediaTek, Inc. -* -* All rights reserved. MediaTek source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek Technology, Inc. is obtained. -*************************************************************************** - -*/ - -#include "rt_config.h" -#include "wlan_config/config_internal.h" - -/* -*vht phy related -*/ -#ifdef DOT11_VHT_AC -VOID vht_cfg_init(struct vht_cfg *obj) -{ - obj->vht_bw = VHT_BW_80; - obj->vht_ldpc = TRUE; - obj->vht_stbc = STBC_USE; - obj->vht_sgi = GI_400; - obj->vht_bw_sig = BW_SIGNALING_DISABLE; -} - -VOID vht_cfg_exit(struct vht_cfg *obj) -{ - os_zero_mem(obj, sizeof(struct vht_cfg)); -} - -/* -*vht phy op related -*/ -VOID vht_op_status_init(struct wifi_dev *wdev, struct vht_op_status *obj) -{ -} - -VOID vht_op_status_exit(struct vht_op_status *obj) -{ - os_zero_mem(obj, sizeof(struct vht_op_status)); -} - -/* -* exported operation function. -*/ - -/* -* exported configure function. -*/ - -/* -* Set -*/ -VOID wlan_config_set_vht_bw(struct wifi_dev *wdev, UCHAR vht_bw) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->vht_conf.vht_bw = vht_bw; -} - -VOID wlan_config_set_vht_bw_all(struct wpf_ctrl *ctrl, UCHAR vht_bw) -{ - struct wlan_config *cfg; - unsigned int i; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - cfg = (struct wlan_config *)ctrl->pf[i].conf; - cfg->vht_conf.vht_bw = vht_bw; - } -} - -VOID wlan_config_set_vht_stbc(struct wifi_dev *wdev, UCHAR vht_stbc) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->vht_conf.vht_stbc = vht_stbc; -} - -VOID wlan_config_set_vht_ldpc(struct wifi_dev *wdev, UCHAR vht_ldpc) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->vht_conf.vht_ldpc = vht_ldpc; -} - -VOID wlan_config_set_vht_sgi(struct wifi_dev *wdev, UCHAR vht_sgi) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->vht_conf.vht_sgi = vht_sgi; -} - -VOID wlan_config_set_vht_bw_sig(struct wifi_dev *wdev, UCHAR vht_bw_sig) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - cfg->vht_conf.vht_bw_sig = vht_bw_sig; -} - -/* -* Get -*/ -UCHAR wlan_config_get_vht_bw(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->vht_conf.vht_bw; -} - -UCHAR wlan_config_get_vht_stbc(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->vht_conf.vht_stbc; -} - -UCHAR wlan_config_get_vht_ldpc(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->vht_conf.vht_ldpc; -} - -UCHAR wlan_config_get_vht_sgi(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->vht_conf.vht_sgi; -} - -UCHAR wlan_config_get_vht_bw_sig(struct wifi_dev *wdev) -{ - struct wlan_config *cfg = (struct wlan_config *)wdev->wpf_cfg; - - return cfg->vht_conf.vht_bw_sig; -} - -#endif /*DOT11_VHT_AC*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic.c deleted file mode 100644 index ddd237ddce..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic.c +++ /dev/null @@ -1,2945 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_asic.c - - Abstract: - Functions used to communicate with ASIC - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Cmm_asic.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#include "mcu/mt_cmd.h" -#endif -#include "hdev/hdev.h" -#define MCAST_WCID_TO_REMOVE 0 /* Pat: TODO */ - -static char *hif_2_str[] = { "HIF_RTMP", "HIF_RLT", "HIF_MT", "Unknown" }; -VOID AsicNotSupportFunc(RTMP_ADAPTER *pAd, const RTMP_STRING *caller) -{ - RTMP_STRING *str; - INT32 hif_type = GET_HIF_TYPE(pAd); - - if (hif_type <= HIF_MAX) - str = hif_2_str[hif_type]; - else - str = hif_2_str[HIF_MAX]; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): NotSupportedFunc for this arch(%s)!\n", caller, str)); -} - -#ifndef COMPOS_TESTMODE_WIN -UINT32 AsicGetCrcErrCnt(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicGetCrcErrCnt(pAd); - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -UINT32 AsicGetCCACnt(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicGetCCACnt(pAd); - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -UINT32 AsicGetChBusyCnt(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicGetChBusyCnt(pAd, BandIdx); - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -INT AsicSetAutoFallBack(RTMP_ADAPTER *pAd, BOOLEAN enable) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetAutoFallBack(pAd, enable); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicAutoFallbackInit(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicAutoFallbackInit(pAd); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -VOID AsicUpdateRtsThld(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT32 pkt_num, UINT32 length, UINT32 retry_limit) -{ - if (IS_HIF_TYPE(pAd, HIF_MT)) { -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - return; - -#endif /* CONFIG_ATE */ - - if (pAd->archOps.archUpdateRtsThld) - return pAd->archOps.archUpdateRtsThld( - pAd, wdev, pkt_num, length, retry_limit); - } - - AsicNotSupportFunc(pAd, __func__); -} - -/* - * ======================================================================== - * - * Routine Description: - * Set MAC register value according operation mode. - * OperationMode AND bNonGFExist are for MM and GF Proteciton. - * If MM or GF mask is not set, those passing argument doesn't not take effect. - * - * Operation mode meaning: - * = 0 : Pure HT, no preotection. - * = 0x01; there may be non-HT devices in both the control and extension channel, protection is optional in BSS. - * = 0x10: No Transmission in 40M is protected. - * = 0x11: Transmission in both 40M and 20M shall be protected - * if (bNonGFExist) - * we should choose not to use GF. But still set correct ASIC registers. - * ======================================================================== - */ -VOID AsicUpdateProtect(IN PRTMP_ADAPTER pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - return; - -#endif /* CONFIG_ATE */ - HwCtrlSetFlag(pAd, HWFLAG_ID_UPDATE_PROTECT); - return; - } - -#endif -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID AsicSwitchChannel(RTMP_ADAPTER *pAd, UCHAR band_idx, - struct freq_oper *oper, BOOLEAN bScan) -{ -#ifdef CUSTOMER_DCC_FEATURE - if (!(ApScanRunning(pAd, NULL)) && pAd->ApEnableBeaconTable) - BssTableInit(&pAd->AvailableBSS); -#endif -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_SWITCH_CHANNEL_CFG SwChCfg; - os_zero_mem(&SwChCfg, sizeof(MT_SWITCH_CHANNEL_CFG)); - SwChCfg.bScan = bScan; - SwChCfg.CentralChannel = oper->cen_ch_1; - SwChCfg.BandIdx = band_idx; - - SwChCfg.RxStream = pAd->Antenna.field.RxPath; - SwChCfg.TxStream = pAd->Antenna.field.TxPath; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - if (SwChCfg.BandIdx == DBDC_BAND0) { - SwChCfg.RxStream = pAd->dbdc_band0_rx_path; - SwChCfg.TxStream = pAd->dbdc_band0_tx_path; - } else { - SwChCfg.RxStream = pAd->dbdc_band1_rx_path; - SwChCfg.TxStream = pAd->dbdc_band1_tx_path; - } - } -#ifdef ANTENNA_CONTROL_SUPPORT - if (pAd->bAntennaSetAPEnable[band_idx] == 1) { - pAd->bAntennaSetAPEnable[band_idx] = 0; - } - if (pAd->RxStream[band_idx] && pAd->TxStream[band_idx]) { - SwChCfg.RxStream = pAd->RxStream[band_idx]; - SwChCfg.TxStream = pAd->TxStream[band_idx]; - } -#endif /* ANTENNA_CONTROL_SUPPORT */ -#endif - - SwChCfg.Bw = oper->bw; - SwChCfg.ControlChannel = oper->prim_ch; - SwChCfg.OutBandFreq = 0; -#ifdef DOT11_VHT_AC - SwChCfg.ControlChannel2 = oper->cen_ch_2; -#endif /* DOT11_VHT_AC */ -#ifdef MT_DFS_SUPPORT - SwChCfg.bDfsCheck = - DfsSwitchCheck(pAd, SwChCfg.ControlChannel, band_idx); -#endif - - /*update radio info to band*/ - if (!bScan) { - } - - MtAsicSwitchChannel(pAd, SwChCfg); - } - -#endif -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ - -VOID AsicResetBBPAgent(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MtAsicResetBBPAgent(pAd); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -#endif /*COMPOS_TESTMODE_WIN*/ - -/* Replaced by AsicDevInfoUpdate() */ -INT AsicSetDevMac(RTMP_ADAPTER *pAd, UCHAR *addr, UCHAR omac_idx) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Set OwnMac=%02x:%02x:%02x:%02x:%02x:%02x\n", __func__, - PRINT_MAC(addr))); -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetDevMac(pAd, omac_idx, addr, 0, TRUE, - DEVINFO_ACTIVE_FEATURE); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -#ifndef COMPOS_TESTMODE_WIN -#ifdef CONFIG_AP_SUPPORT -VOID AsicSetMbssMode(RTMP_ADAPTER *pAd, UCHAR NumOfBcns) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MtAsicSetMbssMode(pAd, NumOfBcns); - return; - } - -#endif -} -#endif /* CONFIG_AP_SUPPORT */ - -BOOLEAN AsicDisableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev) -{ - if (pAd->archOps.archDisableBeacon) - return pAd->archOps.archDisableBeacon(pAd, wdev); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN AsicEnableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev) -{ - if (pAd->archOps.archEnableBeacon) - return pAd->archOps.archEnableBeacon(pAd, wdev); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN AsicUpdateBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev, UINT16 FrameLen, - UCHAR UpdatePktType) -{ - if (pAd->archOps.archUpdateBeacon) - return pAd->archOps.archUpdateBeacon(pAd, wdev, FrameLen, - UpdatePktType); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT -INT AsicSetReptFuncEnable(RTMP_ADAPTER *pAd, BOOLEAN enable) -{ - if (pAd->archOps.archSetReptFuncEnable) { - if (enable) - RepeaterCtrlInit(pAd); - else - RepeaterCtrlExit(pAd); - - return pAd->archOps.archSetReptFuncEnable(pAd, enable); - } - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -VOID AsicInsertRepeaterEntry(RTMP_ADAPTER *pAd, UCHAR CliIdx, UCHAR *pAddr) -{ - if (pAd->archOps.archInsertRepeaterEntry) - pAd->archOps.archInsertRepeaterEntry(pAd, CliIdx, pAddr); - else - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicRemoveRepeaterEntry(RTMP_ADAPTER *pAd, UCHAR CliIdx) -{ - if (pAd->archOps.archRemoveRepeaterEntry) - pAd->archOps.archRemoveRepeaterEntry(pAd, CliIdx); - else - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicInsertRepeaterRootEntry(IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, - IN UCHAR *pAddr, IN UCHAR ReptCliIdx) -{ - if (pAd->archOps.archInsertRepeaterRootEntry) - pAd->archOps.archInsertRepeaterRootEntry(pAd, Wcid, pAddr, - ReptCliIdx); - else - AsicNotSupportFunc(pAd, __func__); -} - -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ - -INT AsicSetRxFilter(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_RX_FILTER_CTRL_T RxFilter; - os_zero_mem(&RxFilter, sizeof(MT_RX_FILTER_CTRL_T)); - if (FALSE) { - RxFilter.bPromiscuous = TRUE; - } else { - RxFilter.bPromiscuous = FALSE; - RxFilter.bFrameReport = FALSE; - RxFilter.filterMask = - RX_NDPA | RX_NOT_OWN_BTIM | RX_NOT_OWN_UCAST | - RX_RTS | RX_CTS | RX_CTRL_RSV | - RX_BC_MC_DIFF_BSSID_A2 | - RX_BC_MC_DIFF_BSSID_A3 | RX_BC_MC_OWN_MAC_A3 | - RX_PROTOCOL_VERSION | RX_FCS_ERROR; - } /*Endof Monitor ON*/ - - if (pAd->archOps.archSetRxFilter) { - INT ret = 0; - ret = pAd->archOps.archSetRxFilter(pAd, RxFilter); - return ret; - } - - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -#ifdef DOT11_N_SUPPORT -INT AsicSetRDG(RTMP_ADAPTER *pAd, UCHAR wlan_idx, UCHAR band_idx, UCHAR init, - UCHAR resp) -{ - INT ret = FALSE; - INT bSupport = FALSE; - BOOLEAN is_en; - is_en = (init && resp) ? TRUE : FALSE; -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_RDG_CTRL_T rdg; - RTMP_ARCH_OP *arch_op = &pAd->archOps; - - if (arch_op->archSetRDG) { - bSupport = TRUE; - rdg.WlanIdx = wlan_idx; - rdg.BandIdx = band_idx; - rdg.Init = init; - rdg.Resp = resp; - rdg.Txop = (is_en) ? (0x80) : (0x60); - rdg.LongNav = (is_en) ? (1) : (0); - ret = arch_op->archSetRDG(pAd, &rdg); - } - } - -#endif - - if (ret == TRUE) { - if (is_en) - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE); - else - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE); - } - - if (!bSupport) - AsicNotSupportFunc(pAd, __func__); - - return ret; -} -#endif /* DOT11_N_SUPPORT */ - -/* - * ======================================================================== - * Routine Description: - * Set/reset MAC registers according to bPiggyBack parameter - * - * Arguments: - * pAd - Adapter pointer - * bPiggyBack - Enable / Disable Piggy-Back - * - * Return Value: - * None - * - * ======================================================================== - */ -VOID AsicSetPiggyBack(RTMP_ADAPTER *pAd, BOOLEAN bPiggyBack) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetPiggyBack(pAd, bPiggyBack); - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -INT AsicSetPreTbtt(RTMP_ADAPTER *pAd, BOOLEAN enable, UCHAR HwBssidIdx) -{ - if (pAd->archOps.archSetPreTbtt) { - pAd->archOps.archSetPreTbtt(pAd, enable, HwBssidIdx); - return TRUE; - } - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetGPTimer(RTMP_ADAPTER *pAd, BOOLEAN enable, UINT32 timeout) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetGPTimer(pAd, enable, timeout); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetChBusyStat(RTMP_ADAPTER *pAd, BOOLEAN enable) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetChBusyStat(pAd, enable); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -#ifdef LINUX -#ifdef RTMP_WLAN_HOOK_SUPPORT -EXPORT_SYMBOL(AsicGetTsfTime); -#endif /* RTMP_WLAN_HOOK_SUPPORT */ -#endif /* LINUX */ -INT AsicGetTsfTime(RTMP_ADAPTER *pAd, UINT32 *high_part, UINT32 *low_part, - UCHAR HwBssidIdx) -{ - if (pAd->archOps.archGetTsfTime) - return pAd->archOps.archGetTsfTime(pAd, high_part, low_part, - HwBssidIdx); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID AsicDisableSync(struct _RTMP_ADAPTER *pAd, UCHAR HWBssidIdx) -{ - if (pAd->archOps.archDisableSync) - pAd->archOps.archDisableSync(pAd, HWBssidIdx); - else - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicSetSyncModeAndEnable(struct _RTMP_ADAPTER *pAd, USHORT BeaconPeriod, - UCHAR HWBssidIdx, UCHAR OPMode) -{ - if (pAd->archOps.archSetSyncModeAndEnable) - pAd->archOps.archSetSyncModeAndEnable(pAd, BeaconPeriod, - HWBssidIdx, OPMode); - else - AsicNotSupportFunc(pAd, __func__); -} - -INT AsicSetWmmParam(RTMP_ADAPTER *pAd, UCHAR idx, UINT32 ac, UINT32 type, - UINT32 val) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetWmmParam(pAd, idx, ac, type, val); - -#endif - AsicNotSupportFunc(pAd, __func__); - return NDIS_STATUS_FAILURE; -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID AsicSetEdcaParm(RTMP_ADAPTER *pAd, PEDCA_PARM pEdcaParm, - struct wifi_dev *wdev) -{ - INT i; - UCHAR EdcaIdx = wdev->EdcaIdx; - EDCA_PARM *pEdca = NULL; - - if (EdcaIdx >= WMM_NUM_OF_AC) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): EdcaIdx >= 4\n", __func__)); - return; - } - - pEdca = &pAd->CommonCfg.APEdcaParm[EdcaIdx]; - - if ((pEdcaParm == NULL) || (pEdcaParm->bValid == FALSE)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): NoEDCAParam\n", __func__)); - OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WMM_INUSED); - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) || - IS_ENTRY_APCLI(&pAd->MacTab.Content[i]) || - IS_ENTRY_REPEATER(&pAd->MacTab.Content[i])) - CLIENT_STATUS_CLEAR_FLAG( - &pAd->MacTab.Content[i], - fCLIENT_STATUS_WMM_CAPABLE); - } - - os_zero_mem(pEdca, sizeof(EDCA_PARM)); - } else { - OPSTATUS_SET_FLAG(pAd, fOP_STATUS_WMM_INUSED); - os_move_mem(pEdca, pEdcaParm, sizeof(EDCA_PARM)); - - if (!ADHOC_ON(pAd)) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("EDCA [#%d]: AIFSN CWmin CWmax TXOP(us) ACM, WMM Set: %d, BandIdx: %d\n", - pEdcaParm->EdcaUpdateCount, pEdcaParm->WmmSet, - pEdcaParm->BandIdx)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" AC_BE %2d %2d %2d %4d %d\n", - pEdcaParm->Aifsn[0], pEdcaParm->Cwmin[0], - pEdcaParm->Cwmax[0], pEdcaParm->Txop[0] << 5, - pEdcaParm->bACM[0])); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" AC_BK %2d %2d %2d %4d %d\n", - pEdcaParm->Aifsn[1], pEdcaParm->Cwmin[1], - pEdcaParm->Cwmax[1], pEdcaParm->Txop[1] << 5, - pEdcaParm->bACM[1])); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" AC_VI %2d %2d %2d %4d %d\n", - pEdcaParm->Aifsn[2], pEdcaParm->Cwmin[2], - pEdcaParm->Cwmax[2], pEdcaParm->Txop[2] << 5, - pEdcaParm->bACM[2])); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" AC_VO %2d %2d %2d %4d %d\n", - pEdcaParm->Aifsn[3], pEdcaParm->Cwmin[3], - pEdcaParm->Cwmax[3], pEdcaParm->Txop[3] << 5, - pEdcaParm->bACM[3])); - } -#ifdef APCLI_CERT_SUPPORT - ApCliCertEDCAAdjust(pAd, wdev, pEdcaParm); -#endif - } - -#ifdef VOW_SUPPORT - vow_update_om_wmm(pAd, wdev, pEdcaParm); -#endif /* VOW_SUPPORT */ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MtAsicSetEdcaParm(pAd, pEdcaParm); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicTxCntUpdate(RTMP_ADAPTER *pAd, UCHAR Wcid, MT_TX_COUNTER *pTxInfo) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - UINT32 TxSuccess = 0; - MtAsicTxCntUpdate(pAd, Wcid, pTxInfo); - TxSuccess = pTxInfo->TxCount - pTxInfo->TxFailCount; - - if (pTxInfo->TxFailCount == 0) - pAd->RalinkCounters.OneSecTxNoRetryOkCount += - pTxInfo->TxCount; - else - pAd->RalinkCounters.OneSecTxRetryOkCount += - pTxInfo->TxCount; - - pAd->RalinkCounters.OneSecTxFailCount += pTxInfo->TxFailCount; -#ifdef STATS_COUNT_SUPPORT - pAd->WlanCounters[0].TransmittedFragmentCount.u.LowPart += - TxSuccess; - pAd->WlanCounters[0].FailedCount.u.LowPart += - pTxInfo->TxFailCount; -#endif /* STATS_COUNT_SUPPORT */ - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicRssiUpdate(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - MAC_TABLE_ENTRY *pEntry; - CHAR RssiSet[3]; - INT i = 0; - NdisZeroMemory(RssiSet, sizeof(RssiSet)); - - if (IS_HIF_TYPE(pAd, HIF_MT)) { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (pAd->MacTab.Size == 0) { - pEntry = - &pAd->MacTab - .Content[MCAST_WCID_TO_REMOVE]; - MtAsicRssiGet(pAd, pEntry->wcid, &RssiSet[0]); - - for (i = 0; i < 3; i++) { - pEntry->RssiSample.AvgRssi[i] = - RssiSet[i]; - pEntry->RssiSample.LastRssi[i] = - RssiSet[i]; - pAd->ApCfg.RssiSample.AvgRssi[i] = - RssiSet[i]; - pAd->ApCfg.RssiSample.LastRssi[i] = - RssiSet[i]; - } - } else { - INT32 TotalRssi[3]; - INT j; - NdisZeroMemory(TotalRssi, sizeof(TotalRssi)); - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); - i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (IS_VALID_ENTRY(pEntry)) { - MtAsicRssiGet(pAd, pEntry->wcid, - &RssiSet[0]); - - for (j = 0; j < 3; j++) { - pEntry->RssiSample - .AvgRssi[j] = - RssiSet[j]; - pEntry->RssiSample - .LastRssi[j] = - RssiSet[j]; - TotalRssi[j] += - RssiSet[j]; - } - } - } - - for (i = 0; i < 3; i++) - pAd->ApCfg.RssiSample.AvgRssi[i] = - pAd->ApCfg.RssiSample - .LastRssi[i] = - TotalRssi[i] / - pAd->MacTab.Size; - } - } -#endif /* CONFIG_AP_SUPPORT */ - } - - return; -#endif -} - -INT AsicSetRetryLimit(RTMP_ADAPTER *pAd, UINT32 type, UINT32 limit) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetRetryLimit(pAd, type, limit); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -UINT32 AsicGetRetryLimit(RTMP_ADAPTER *pAd, UINT32 type) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicGetRetryLimit(pAd, type); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID AsicSetSlotTime(IN PRTMP_ADAPTER pAd, IN BOOLEAN bUseShortSlotTime, - IN UCHAR channel, IN struct wifi_dev *wdev) -{ - UINT32 SlotTime = 0; - UINT32 SifsTime = SIFS_TIME_24G; - UCHAR BandIdx; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (bUseShortSlotTime) { - OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED); - SlotTime = 9; - } else { - OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED); - SlotTime = (wdev != NULL) ? wdev->SlotTimeValue : 20; - } - } -#endif - BandIdx = HcGetBandByChannel(pAd, channel); -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MtAsicSetSlotTime(pAd, SlotTime, SifsTime, BandIdx); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -INT AsicSetMacMaxLen(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archSetMacMaxLen) { - INT ret = 0; - ret = pAd->archOps.archSetMacMaxLen(pAd); - return ret; - } - - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -VOID AsicGetTxTsc(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *pTxTsc) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archGetTxTsc) - pAd->archOps.archGetTxTsc(pAd, wdev, pTxTsc); - - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicSetSMPS(RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR smps) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archSetSMPS) - pAd->archOps.archSetSMPS(pAd, Wcid, smps); - else - AsicNotSupportFunc(pAd, __func__); - - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -/* - * ======================================================================== - * Description: - * Add Shared key information into ASIC. - * Update shared key, TxMic and RxMic to Asic Shared key table - * Update its cipherAlg to Asic Shared key Mode. - * - * Return: - * ======================================================================== - */ -VOID AsicAddSharedKeyEntry(IN PRTMP_ADAPTER pAd, IN UCHAR BssIndex, - IN UCHAR KeyIdx, IN PCIPHER_KEY pCipherKey) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MtAsicAddSharedKeyEntry(pAd, BssIndex, KeyIdx, pCipherKey); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -/* IRQL = DISPATCH_LEVEL*/ -VOID AsicRemoveSharedKeyEntry(IN PRTMP_ADAPTER pAd, IN UCHAR BssIndex, - IN UCHAR KeyIdx) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MtAsicRemoveSharedKeyEntry(pAd, BssIndex, KeyIdx); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -#ifdef MCS_LUT_SUPPORT -VOID AsicMcsLutUpdate(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry) -{ - AsicNotSupportFunc(pAd, __func__); -} -#endif /* MCS_LUT_SUPPORT */ - -UINT16 AsicGetTidSn(RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archGetTidSn) - return pAd->archOps.archGetTidSn(pAd, wcid, tid); - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0xffff; -} - -VOID AsicUpdateBASession(RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid, UINT16 sn, - UCHAR basize, BOOLEAN isAdd, INT ses_type) -{ -#ifdef MT_MAC - RETURN_IF_PAD_NULL(pAd); - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MAC_TABLE_ENTRY *mac_entry; - MT_BA_CTRL_T BaCtrl; - STA_REC_BA_CFG_T StaRecBaCfg; - VOID *pBaEntry; - UINT32 i; - os_zero_mem(&BaCtrl, sizeof(MT_BA_CTRL_T)); - mac_entry = &pAd->MacTab.Content[wcid]; - BaCtrl.BaSessionType = ses_type; - BaCtrl.BaWinSize = basize; - BaCtrl.isAdd = isAdd; - BaCtrl.Sn = sn; - BaCtrl.Wcid = wcid; - BaCtrl.Tid = tid; - - if (mac_entry && mac_entry->wdev) { - BaCtrl.band_idx = HcGetBandByWdev(mac_entry->wdev); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): mac_entry=%p!mac_entry->wdev=%p, Set BaCtrl.band_idx=%d\n", - __func__, mac_entry, mac_entry->wdev, - BaCtrl.band_idx)); - } else { - BaCtrl.band_idx = 0; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): mac_entry=%p!Set BaCtrl.band_idx=%d\n", - __func__, mac_entry, BaCtrl.band_idx)); - } - - if (ses_type == BA_SESSION_RECP) { - /* Reset BA SSN & Score Board Bitmap, for BA Receiptor */ - if (isAdd) - os_move_mem(&BaCtrl.PeerAddr[0], - &mac_entry->Addr[0], MAC_ADDR_LEN); - } - - if (pAd->archOps.archUpdateBASession) { - pAd->archOps.archUpdateBASession(pAd, BaCtrl); - - if (pAd->archOps.archUpdateStaRecBa) { - if (!mac_entry || !mac_entry->wdev) - return; - - StaRecBaCfg.baDirection = ses_type; - - if (ses_type == ORI_BA) { - i = mac_entry->BAOriWcidArray[tid]; - - if (pAd->CommonCfg.dbdc_mode && - !WMODE_CAP_AC( - mac_entry->wdev->PhyMode)) - pAd->BATable.BAOriEntry[i] - .amsdu_cap = FALSE; - - pBaEntry = &pAd->BATable.BAOriEntry[i]; - } else { - i = mac_entry->BARecWcidArray[tid]; - - if (pAd->CommonCfg.dbdc_mode && - !WMODE_CAP_AC( - mac_entry->wdev->PhyMode)) - pAd->BATable.BAOriEntry[i] - .amsdu_cap = FALSE; - - pBaEntry = &pAd->BATable.BARecEntry[i]; - } - - StaRecBaCfg.BaEntry = pBaEntry; - StaRecBaCfg.BssIdx = - mac_entry->wdev->bss_info_argument - .ucBssIndex; - - if (IS_ENTRY_REPEATER(mac_entry)) - StaRecBaCfg.MuarIdx = - pAd->MacTab - .tr_entry[mac_entry->wcid] - .OmacIdx; - else - StaRecBaCfg.MuarIdx = - mac_entry->wdev->OmacIdx; - - StaRecBaCfg.tid = tid; - StaRecBaCfg.BaEnable = (isAdd << tid); - StaRecBaCfg.WlanIdx = wcid; - pAd->archOps.archUpdateStaRecBa(pAd, - StaRecBaCfg); - } - - return; - } - - AsicNotSupportFunc(pAd, __func__); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicUpdateRxWCIDTable(RTMP_ADAPTER *pAd, USHORT WCID, UCHAR *pAddr, - BOOLEAN IsBCMCWCID, BOOLEAN IsReset) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_WCID_TABLE_INFO_T WtblInfo; - MAC_TABLE_ENTRY *mac_entry = NULL; - struct _STA_TR_ENTRY *tr_entry = NULL; - os_zero_mem(&WtblInfo, sizeof(MT_WCID_TABLE_INFO_T)); - WtblInfo.Wcid = WCID; - WtblInfo.IsReset = IsReset; - os_move_mem(&WtblInfo.Addr[0], &pAddr[0], 6); - - if (VALID_UCAST_ENTRY_WCID(pAd, WCID)) - mac_entry = &pAd->MacTab.Content[WCID]; - - if ((IsBCMCWCID == TRUE) || WCID == MAX_LEN_OF_MAC_TABLE) { - /* BC Mgmt or BC/MC data */ - WtblInfo.MacAddrIdx = 0xe; - WtblInfo.WcidType = MT_WCID_TYPE_BMCAST; - WtblInfo.CipherSuit = WTBL_CIPHER_NONE; - - if (HcGetWcidLinkType(pAd, WCID) == WDEV_TYPE_APCLI) - WtblInfo.WcidType = MT_WCID_TYPE_APCLI_MCAST; - } else if (mac_entry) { - if (IS_ENTRY_CLIENT(mac_entry)) { - /* FIXME: will fix this when set entry fix for sta mode */ - if (mac_entry->wdev->wdev_type == WDEV_TYPE_AP) - WtblInfo.WcidType = MT_WCID_TYPE_CLI; - else if (mac_entry->wdev->wdev_type == - WDEV_TYPE_STA) - WtblInfo.WcidType = MT_WCID_TYPE_AP; - } else if (IS_ENTRY_APCLI(mac_entry)) - WtblInfo.WcidType = MT_WCID_TYPE_APCLI; - else if (IS_ENTRY_REPEATER(mac_entry)) - WtblInfo.WcidType = MT_WCID_TYPE_REPEATER; - else if (IS_ENTRY_WDS(mac_entry)) - WtblInfo.WcidType = MT_WCID_TYPE_WDS; - else - WtblInfo.WcidType = MT_WCID_TYPE_CLI; - - if (IS_ENTRY_REPEATER(mac_entry)) { - tr_entry = - &pAd->MacTab.tr_entry[mac_entry->wcid]; - WtblInfo.MacAddrIdx = tr_entry->OmacIdx; - } else - WtblInfo.MacAddrIdx = mac_entry->wdev->OmacIdx; - - WtblInfo.Aid = mac_entry->Aid; -#ifdef TXBF_SUPPORT - WtblInfo.PfmuId = pAd->rStaRecBf.u2PfmuId; - - if (IS_HT_STA(mac_entry)) { - WtblInfo.fgTiBf = - (mac_entry->rStaRecBf.fgETxBfCap > 0) ? - FALSE : - TRUE; - WtblInfo.fgTiBf = - (pAd->CommonCfg.RegTransmitSetting.field - .ITxBfEn == TRUE) ? - WtblInfo.fgTiBf : - FALSE; - WtblInfo.fgTeBf = - mac_entry->rStaRecBf.fgETxBfCap; - WtblInfo.fgTeBf = - (pAd->CommonCfg.ETxBfEnCond == TRUE) ? - WtblInfo.fgTeBf : - FALSE; - } - - if (IS_VHT_STA(mac_entry)) { - WtblInfo.fgTibfVht = - (mac_entry->rStaRecBf.fgETxBfCap > 0) ? - FALSE : - TRUE; - WtblInfo.fgTibfVht = - (pAd->CommonCfg.RegTransmitSetting.field - .ITxBfEn == TRUE) ? - WtblInfo.fgTibfVht : - FALSE; - WtblInfo.fgTebfVht = - mac_entry->rStaRecBf.fgETxBfCap; - WtblInfo.fgTebfVht = - (pAd->CommonCfg.ETxBfEnCond == TRUE) ? - WtblInfo.fgTebfVht : - FALSE; - } - -#endif - - if (CLIENT_STATUS_TEST_FLAG( - mac_entry, fCLIENT_STATUS_RDG_CAPABLE) && - CLIENT_STATUS_TEST_FLAG( - mac_entry, fCLIENT_STATUS_RALINK_CHIPSET)) - WtblInfo.aad_om = 1; - - if (CLIENT_STATUS_TEST_FLAG(mac_entry, - fCLIENT_STATUS_WMM_CAPABLE)) - WtblInfo.SupportQoS = TRUE; - - if (IS_HT_STA(mac_entry)) { - WtblInfo.SupportHT = TRUE; - - if (CLIENT_STATUS_TEST_FLAG( - mac_entry, - fCLIENT_STATUS_RDG_CAPABLE)) - WtblInfo.SupportRDG = TRUE; - - WtblInfo.SmpsMode = mac_entry->MmpsMode; - WtblInfo.MpduDensity = mac_entry->MpduDensity; - WtblInfo.MaxRAmpduFactor = - mac_entry->MaxRAmpduFactor; - - if (IS_VHT_STA(mac_entry)) { - WtblInfo.SupportVHT = TRUE; - WtblInfo.dyn_bw = - wlan_config_get_vht_bw_sig( - mac_entry->wdev); -#ifdef TXBF_SUPPORT - WtblInfo.gid = 63; -#endif - } - } - - if (IS_CIPHER_TKIP_Entry(mac_entry)) { - WtblInfo.DisRHTR = 1; -#ifdef A4_CONN - if (IS_ENTRY_A4(mac_entry)) - WtblInfo.DisRHTR = 0; -#endif - } - -#ifdef A4_CONN - WtblInfo.a4_enable = IS_ENTRY_A4(mac_entry); - - if (IS_ENTRY_A4(mac_entry)) - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("AsicUpdateRxWCIDTable: Enable A4 in WTBLinfo\n")); - -#endif -#ifdef DOT11R_FT_SUPPORT - if (IS_FT_STA(mac_entry)) { - WtblInfo.SkipClearPrevSecKey = TRUE; - } -#endif /* DOT11R_FT_SUPPORT */ - -#ifdef MBSS_AS_WDS_AP_SUPPORT - if (mac_entry->wdev->wds_enable) - WtblInfo.fg4AddrEnable = - mac_entry->bEnable4Addr; -#endif - - } else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():mac_entry is NULL!\n", __func__)); - - if (pAd->archOps.archUpdateRxWCIDTable) - return pAd->archOps.archUpdateRxWCIDTable(pAd, - WtblInfo); - - AsicNotSupportFunc(pAd, __func__); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -#ifdef TXBF_SUPPORT -VOID AsicUpdateClientBfCap(RTMP_ADAPTER *pAd, PMAC_TABLE_ENTRY pMacEntry) -{ -#ifdef MT_MAC - if (pAd->archOps.archUpdateClientBfCap) - return pAd->archOps.archUpdateClientBfCap(pAd, pMacEntry); -#endif - AsicNotSupportFunc(pAd, __func__); -} -#endif /* TXBF_SUPPORT */ - -/* - * ========================================================================== - * Description: - * - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID AsicDelWcidTab(RTMP_ADAPTER *pAd, UCHAR wcid_idx) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archDelWcidTab) - return pAd->archOps.archDelWcidTab(pAd, wcid_idx); - - AsicNotSupportFunc(pAd, __func__); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -#ifdef HTC_DECRYPT_IOT -VOID AsicSetWcidAAD_OM(RTMP_ADAPTER *pAd, UCHAR wcid_idx, CHAR value) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archSetWcidAAD_OM) - return pAd->archOps.archSetWcidAAD_OM(pAd, wcid_idx, - value); - - AsicNotSupportFunc(pAd, __func__); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} -#endif /* HTC_DECRYPT_IOT */ - -#ifdef MBSS_AS_WDS_AP_SUPPORT -VOID AsicSetWcid4Addr_HdrTrans(RTMP_ADAPTER *pAd, UCHAR wcid_idx, - UCHAR IsEnable) -{ - MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[wcid_idx]; - UCHAR IsApcliEntry = 0; - if (IS_ENTRY_APCLI(pEntry)) - IsApcliEntry = 1; -#ifdef MT_MAC - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archSetWcid4Addr_HdrTrans) { - return pAd->archOps.archSetWcid4Addr_HdrTrans( - pAd, wcid_idx, IsEnable, IsApcliEntry); - } else { - AsicNotSupportFunc(pAd, __FUNCTION__); - return; - } - } -#endif - - AsicNotSupportFunc(pAd, __FUNCTION__); - return; -} -#endif - -VOID AsicAddRemoveKeyTab(IN PRTMP_ADAPTER pAd, IN ASIC_SEC_INFO *pInfo) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT) && (pAd->archOps.archAddRemoveKeyTab)) - return pAd->archOps.archAddRemoveKeyTab(pAd, pInfo); - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -INT AsicSendCommandToMcu(IN RTMP_ADAPTER *pAd, IN UCHAR Command, IN UCHAR Token, - IN UCHAR Arg0, IN UCHAR Arg1, IN BOOLEAN in_atomic) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSendCommandToMcu(pAd, Command, Token, Arg0, Arg1, - in_atomic); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN AsicSendCmdToMcuAndWait(IN RTMP_ADAPTER *pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSendCmdToMcuAndWait(pAd, Command, Token, Arg0, - Arg1, in_atomic); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN AsicSendCommandToMcuBBP(IN PRTMP_ADAPTER pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN FlgIsNeedLocked) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSendCommandToMcuBBP(pAd, Command, Token, Arg0, - Arg1, FlgIsNeedLocked); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -/* - * ======================================================================== - * Description: - * For 1x1 chipset : 2070 / 3070 / 3090 / 3370 / 3390 / 5370 / 5390 - * Usage : 1. Set Default Antenna as initialize - * 2. Antenna Diversity switching used - * 3. iwpriv command switch Antenna - * - * Return: - * ======================================================================== - */ - -#ifdef STREAM_MODE_SUPPORT -/* StreamModeRegVal - return MAC reg value for StreamMode setting */ -UINT32 StreamModeRegVal(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtStreamModeRegVal(pAd); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -/* - * ======================================================================== - * Description: - * configure the stream mode of specific MAC or all MAC and set to ASIC. - * - * Prameters: - * pAd --- - * pMacAddr --- - * bClear --- disable the stream mode for specific macAddr when - * (pMacAddr!=NULL) - * - * Return: - * ======================================================================== - */ -VOID AsicSetStreamMode(IN RTMP_ADAPTER *pAd, IN PUCHAR pMacAddr, - IN INT chainIdx, IN BOOLEAN bEnabled) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MtAsicSetStreamMode(pAd, pMacAddr, chainIdx, bEnabled); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicStreamModeInit(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MtAsicStreamModeInit(pAd); - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} -#endif /* STREAM_MODE_SUPPORT // */ - -#ifdef DOT11_N_SUPPORT -INT AsicReadAggCnt(RTMP_ADAPTER *pAd, ULONG *aggCnt, int cnt_len) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicReadAggCnt(pAd, aggCnt, cnt_len); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetRalinkBurstMode(RTMP_ADAPTER *pAd, BOOLEAN enable) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetRalinkBurstMode(pAd, enable); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicUpdateTxOP(RTMP_ADAPTER *pAd, UINT32 AcNum, UINT32 TxOpVal) -{ - UINT32 last_txop_val; -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->CommonCfg.ManualTxop) - return TRUE; - - last_txop_val = MtAsicGetWmmParam(pAd, AcNum, WMM_PARAM_TXOP); - - if (last_txop_val == TxOpVal) { - /* No need to Update TxOP CR */ - return TRUE; - } else if (last_txop_val == 0xdeadbeef) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Error CR value for TxOP = 0x%08x\n", - __func__, last_txop_val)); - return FALSE; - } - - MtAsicSetWmmParam(pAd, 0, AcNum, WMM_PARAM_TXOP, TxOpVal); - return TRUE; - } - -#endif /* MT_MAC */ - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -#endif /* DOT11_N_SUPPORT */ - -INT AsicSetRxPath(RTMP_ADAPTER *pAd, UINT32 RxPathSel) -{ - /* TODO: Shiang-MT7615, remove this from here?? Do we still need it?? */ - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicWaitMacTxRxIdle(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicWaitMacTxRxIdle(pAd); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetMacTxRx(RTMP_ADAPTER *pAd, INT txrx, BOOLEAN enable) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - INT ret = 0; - - if (pAd->archOps.archSetMacTxRx) { - ret = pAd->archOps.archSetMacTxRx(pAd, txrx, enable, - BAND0); - - if (ret != 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): SetMacTxRx failed!\n", - __func__)); - return ret; - } - -#ifdef DBDC_MODE - - if (pAd->CommonCfg.dbdc_mode) { - ret = pAd->archOps.archSetMacTxRx( - pAd, txrx, enable, BAND1); - - if (ret != 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): SetMacTxRx failed!\n", - __func__)); - return ret; - } - } - -#endif /*DBDC_MODE*/ - return ret; - } - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetRxvFilter(RTMP_ADAPTER *pAd, BOOLEAN enable, UCHAR ucBandIdx) -{ -#ifdef MT_MAC - if (IS_HIF_TYPE(pAd, HIF_MT)) { - INT ret = 0; - - if (pAd->archOps.archSetRxvFilter) { - ret = pAd->archOps.archSetRxvFilter(pAd, enable, - ucBandIdx); - - if (ret != 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): SetRxvTxRx failed!\n", - __func__)); - return ret; - } - - return ret; - } - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetWPDMA(RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN enable) -{ -#ifdef MT_MAC - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetWPDMA(pAd, TxRx, enable, cap->WPDMABurstSIZE); -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN AsicWaitPDMAIdle(struct _RTMP_ADAPTER *pAd, INT round, INT wait_us) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicWaitPDMAIdle(pAd, round, wait_us); -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN AsicResetWPDMA(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - MtAsicResetWPDMA(pAd); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetMacWD(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetMacWD(pAd); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicHIFInit(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT AsicTOPInit(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicTOPInit(pAd); - -#endif - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetTxStream(RTMP_ADAPTER *pAd, UINT32 StreamNum, UCHAR opmode, - BOOLEAN up, UCHAR BandIdx) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archSetTxStream) { - INT Ret; - Ret = pAd->archOps.archSetTxStream( - pAd, pAd->Antenna.field.TxPath, 0); - return Ret; - } - - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } - -#endif /* MT_MAC */ - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetRxStream(RTMP_ADAPTER *pAd, UINT32 rx_path, UCHAR BandIdx) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archSetRxStream) { - INT Ret; - Ret = pAd->archOps.archSetRxStream(pAd, rx_path, - BandIdx); - return Ret; - } - - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } - -#endif /* MT_MAC */ - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetBW(RTMP_ADAPTER *pAd, INT bw, UCHAR BandIdx) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetBW(pAd, bw, BandIdx); - -#endif /* MT_MAC */ - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT AsicSetCtrlCh(RTMP_ADAPTER *pAd, UINT8 extch) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return mt_mac_set_ctrlch(pAd, extch); - -#endif /* MT_MAC */ - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -VOID AsicSetTmrCR(RTMP_ADAPTER *pAd, UCHAR enable, UCHAR BandIdx) -{ - if (pAd->archOps.archSetTmrCR) - pAd->archOps.archSetTmrCR(pAd, enable, BandIdx); - else - AsicNotSupportFunc(pAd, __func__); -} - -#ifdef MAC_APCLI_SUPPORT -/* - * ========================================================================== - * Description: - * Set BSSID of Root AP - * - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID AsicSetApCliBssid(RTMP_ADAPTER *pAd, UCHAR *pBssid, UCHAR index) -{ - if (pAd->archOps.archSetApCliBssid) - pAd->archOps.archSetApCliBssid(pAd, pBssid, index); - else - AsicNotSupportFunc(pAd, __func__); -} -#endif /* MAC_APCLI_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -/* set Wdev Mac Address, some chip arch need to set CR .*/ -VOID AsicSetMbssWdevIfAddr(struct _RTMP_ADAPTER *pAd, INT idx, UCHAR *if_addr, - INT opmode) -{ - if (pAd->archOps.archSetMbssWdevIfAddr) - pAd->archOps.archSetMbssWdevIfAddr(pAd, idx, if_addr, opmode); - else - AsicNotSupportFunc(pAd, __func__); -} - -/* set Wdev Mac Address, some chip arch need to set CR .*/ -VOID AsicSetMbssHwCRSetting(RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable) -{ - if (pAd->archOps.archSetMbssHwCRSetting) - pAd->archOps.archSetMbssHwCRSetting(pAd, mbss_idx, enable); - else - AsicNotSupportFunc(pAd, __func__); -} - -/* set Wdev Mac Address, some chip arch need to set CR .*/ -VOID AsicSetExtMbssEnableCR(RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable) -{ - if (pAd->archOps.archSetExtMbssEnableCR) - pAd->archOps.archSetExtMbssEnableCR(pAd, mbss_idx, enable); - else - AsicNotSupportFunc(pAd, __func__); -} - -VOID AsicSetExtTTTTHwCRSetting(RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable) -{ - if (pAd->archOps.archSetExtTTTTHwCRSetting) - pAd->archOps.archSetExtTTTTHwCRSetting(pAd, mbss_idx, enable); - else - AsicNotSupportFunc(pAd, __func__); -} -#endif /* CONFIG_AP_SUPPORT */ - -VOID AsicDMASchedulerInit(RTMP_ADAPTER *pAd, INT mode) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_DMASCH_CTRL_T DmaSchCtrl; - - if (MTK_REV_GTE(pAd, MT7603, MT7603E1) && - MTK_REV_LT(pAd, MT7603, MT7603E2)) - DmaSchCtrl.bBeaconSpecificGroup = FALSE; - else - DmaSchCtrl.bBeaconSpecificGroup = TRUE; - - DmaSchCtrl.mode = mode; -#ifdef DMA_SCH_SUPPORT - MtAsicDMASchedulerInit(pAd, DmaSchCtrl); -#endif - return; - } - -#endif - AsicNotSupportFunc(pAd, __func__); -} - -INT32 AsicDevInfoUpdate(RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, UINT8 *OwnMacAddr, - UINT8 BandIdx, UINT8 Active, UINT32 EnableFeature) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Set OwnMac=%02x:%02x:%02x:%02x:%02x:%02x\n", __func__, - PRINT_MAC(OwnMacAddr))); -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (pAd->archOps.archSetDevMac) - return pAd->archOps.archSetDevMac(pAd, OwnMacIdx, - OwnMacAddr, BandIdx, - Active, - EnableFeature); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } - -#endif /* MT_MAC */ - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT32 AsicBssInfoUpdate(RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info_argument) -{ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Set Bssid=%02x:%02x:%02x:%02x:%02x:%02x, BssIndex(%d)\n", - __func__, PRINT_MAC(bss_info_argument.Bssid), - bss_info_argument.ucBssIndex)); - - if (pAd->archOps.archSetBssid) - return pAd->archOps.archSetBssid(pAd, bss_info_argument); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -INT32 AsicExtPwrMgtBitWifi(RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, - UINT8 ucPwrMgtBit) -{ - MT_PWR_MGT_BIT_WIFI_T rPwtMgtBitWiFi = { 0 }; - rPwtMgtBitWiFi.ucWlanIdx = ucWlanIdx; - rPwtMgtBitWiFi.ucPwrMgtBit = ucPwrMgtBit; - return MtCmdExtPwrMgtBitWifi(pAd, rPwtMgtBitWiFi); -} - -INT32 AsicStaRecUpdate(RTMP_ADAPTER *pAd, STA_REC_CTRL_T *sta_rec_ctrl) -{ - UINT8 WlanIdx = sta_rec_ctrl->WlanIdx; - - if (pAd->archOps.archSetStaRec) { - STA_REC_CFG_T StaCfg; - PMAC_TABLE_ENTRY pEntry = NULL; - INT32 ret = 0; - os_zero_mem(&StaCfg, sizeof(STA_REC_CFG_T)); - - /* Need to provide H/W BC/MC WLAN index to CR4 */ - if (!VALID_UCAST_ENTRY_WCID(pAd, WlanIdx)) - pEntry = NULL; - else - pEntry = &pAd->MacTab.Content[WlanIdx]; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::Wcid(%d), u4EnableFeature(%d)\n", __func__, - sta_rec_ctrl->WlanIdx, sta_rec_ctrl->EnableFeature)); - - if (pEntry && !IS_ENTRY_NONE(pEntry)) { - if (!pEntry->wdev) { - ASSERT(pEntry->wdev); - return -1; - } - - if (IS_ENTRY_REPEATER(pEntry)) - StaCfg.MuarIdx = - pAd->MacTab.tr_entry[pEntry->wcid] - .OmacIdx; - else - StaCfg.MuarIdx = pEntry->wdev->OmacIdx; - } else { - StaCfg.MuarIdx = - 0xe; /* TODO: Carter, check this on TX_HDR_TRANS */ - } - -#ifdef TXBF_SUPPORT - if (pEntry && !IS_ENTRY_NONE(pEntry) && - (IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry) || IS_ENTRY_AP(pEntry))) { - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - UINT8 band_idx = HcGetBandByWdev(pEntry->wdev); - - if (band_idx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif - - if (HcIsBfCapSupport(pEntry->wdev) == TRUE) { - if (sta_rec_ctrl->EnableFeature & - STA_REC_BF_FEATURE) - if (ucTxPath > 1) - AsicBfStaRecUpdate( - pAd, - pEntry->wdev->PhyMode, - sta_rec_ctrl->BssIndex, - WlanIdx); - } - } -#endif /* TXBF_SUPPORT */ - StaCfg.ConnectionState = sta_rec_ctrl->ConnectionState; - StaCfg.ConnectionType = sta_rec_ctrl->ConnectionType; - StaCfg.u4EnableFeature = sta_rec_ctrl->EnableFeature; - StaCfg.ucBssIndex = sta_rec_ctrl->BssIndex; - StaCfg.ucWlanIdx = WlanIdx; - StaCfg.pEntry = pEntry; - StaCfg.IsNewSTARec = sta_rec_ctrl->IsNewSTARec; - os_move_mem(&StaCfg.asic_sec_info, &sta_rec_ctrl->asic_sec_info, - sizeof(ASIC_SEC_INFO)); - ret = pAd->archOps.archSetStaRec(pAd, StaCfg); - return ret; - } - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -#ifdef MT_MAC -INT32 AsicRaParamStaRecUpdate(RTMP_ADAPTER *pAd, UINT8 WlanIdx, - P_CMD_STAREC_AUTO_RATE_UPDATE_T prParam, - UINT32 EnableFeature) -{ - if (pAd->archOps.archSetStaRec) { - STA_REC_CFG_T StaCfg; - PMAC_TABLE_ENTRY pEntry = NULL; - os_zero_mem(&StaCfg, sizeof(STA_REC_CFG_T)); - - /* Need to provide H/W BC/MC WLAN index to CR4 */ - if (!VALID_UCAST_ENTRY_WCID(pAd, WlanIdx)) - pEntry = NULL; - else - pEntry = &pAd->MacTab.Content[WlanIdx]; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::Wcid(%d), u4EnableFeature(%d)\n", __func__, - WlanIdx, EnableFeature)); - - if (pEntry && !IS_ENTRY_NONE(pEntry)) { - if (!pEntry->wdev) { - ASSERT(pEntry->wdev); - return -1; - } - - if (IS_ENTRY_REPEATER(pEntry)) - StaCfg.MuarIdx = - pAd->MacTab.tr_entry[pEntry->wcid] - .OmacIdx; - else - StaCfg.MuarIdx = pEntry->wdev->OmacIdx; - - StaCfg.ucBssIndex = - pEntry->wdev->bss_info_argument.ucBssIndex; - } else { - StaCfg.MuarIdx = - 0xe; /* TODO: Carter, check this on TX_HDR_TRANS */ - } - - StaCfg.ConnectionState = STATE_CONNECTED; - StaCfg.u4EnableFeature = EnableFeature; - StaCfg.ucWlanIdx = WlanIdx; - StaCfg.pEntry = pEntry; - StaCfg.pRaParam = prParam; - /*tracking the starec input history*/ - return pAd->archOps.archSetStaRec(pAd, StaCfg); - } - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} -#endif /* MT_MAC */ - -INT32 AsicRadioOnOffCtrl(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, UINT8 ucRadio) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_PMSTAT_CTRL_T PmStatCtrl = { 0 }; - PmStatCtrl.PmNumber = PM5; - PmStatCtrl.DbdcIdx = ucDbdcIdx; - - if (ucRadio == WIFI_RADIO_ON) { - PmStatCtrl.PmState = EXIT_PM_STATE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): DbdcIdx=%d RadioOn\n", __func__, - ucDbdcIdx)); - } else { - PmStatCtrl.PmState = ENTER_PM_STATE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): DbdcIdx=%d RadioOff\n", __func__, - ucDbdcIdx)); - } - - return MtCmdExtPmStateCtrl(pAd, PmStatCtrl); - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -#ifdef GREENAP_SUPPORT -INT32 AsicGreenAPOnOffCtrl(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN ucGreenAPOn) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_GREENAP_CTRL_T GreenAPCtrl = { 0 }; - GreenAPCtrl.ucDbdcIdx = ucDbdcIdx; - GreenAPCtrl.ucGreenAPOn = ucGreenAPOn; - return MtCmdExtGreenAPOnOffCtrl(pAd, GreenAPCtrl); - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} -#endif /* GREENAP_SUPPORT */ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -INT32 asic_pcie_aspm_dym_ctrl(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN fgL1Enable, BOOLEAN fgL0sEnable) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_PCIE_ASPM_DYM_CTRL_T mt_pcie_aspm_dym_ctrl = { 0 }; - - mt_pcie_aspm_dym_ctrl.ucDbdcIdx = ucDbdcIdx; - mt_pcie_aspm_dym_ctrl.fgL1Enable = fgL1Enable; - mt_pcie_aspm_dym_ctrl.fgL0sEnable = fgL0sEnable; - return mt_cmd_ext_pcie_aspm_dym_ctrl(pAd, - mt_pcie_aspm_dym_ctrl); - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -INT32 AsicExtPmStateCtrl(RTMP_ADAPTER *pAd, PSTA_ADMIN_CONFIG pStaCfg, - UINT8 ucPmNumber, UINT8 ucPmState) -{ - struct wifi_dev *wdev = NULL; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - wdev = &pAd->ApCfg.MBSSID[0].wdev; - } -#endif -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_PMSTAT_CTRL_T PmStatCtrl = { 0 }; - PmStatCtrl.PmNumber = ucPmNumber; - PmStatCtrl.PmState = ucPmState; - - if (ucPmNumber == PM4) { - } - - return MtCmdExtPmStateCtrl(pAd, PmStatCtrl); - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -INT32 AsicExtWifiHifCtrl(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, UINT8 PmStatCtrl, - VOID *pReslt) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtCmdWifiHifCtrl(pAd, ucDbdcIdx, PmStatCtrl, pReslt); - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -#ifdef CONFIG_MULTI_CHANNEL - -INT32 AsicMccStart(struct _RTMP_ADAPTER *ad, UCHAR channel_1st, - UCHAR channel_2nd, UINT32 bw_1st, UINT32 bw_2nd, - UCHAR central_1st_seg0, UCHAR central_1st_seg1, - UCHAR central_2nd_seg0, UCHAR central_2nd_seg1, - UCHAR role_1st, UCHAR role_2nd, USHORT stay_time_1st, - USHORT stay_time_2nd, USHORT idle_time, - USHORT null_repeat_cnt, UINT32 start_tsf) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - MT_MCC_ENTRT_T entries[2]; - entries[0].BssIdx = 0; - entries[0].WlanIdx = 1; - entries[0].WmmIdx = 0; - entries[0].OwnMACAddressIdx = 0; - entries[0].Bw = bw_1st; - entries[0].CentralSeg0 = central_1st_seg0; - entries[0].CentralSeg1 = central_1st_seg1; - entries[0].Channel = channel_1st; - entries[0].Role = role_1st; - entries[0].StayTime = stay_time_1st; - entries[1].BssIdx = 1; - entries[1].WlanIdx = 2; - entries[1].WmmIdx = 1; - entries[1].OwnMACAddressIdx = 1; - entries[1].Bw = bw_2nd; - entries[1].CentralSeg0 = central_2nd_seg0; - entries[1].CentralSeg1 = central_2nd_seg1; - entries[1].Channel = channel_2nd; - entries[1].Role = role_2nd; - entries[1].StayTime = stay_time_2nd; - return MtCmdMccStart(ad, 2, entries, idle_time, null_repeat_cnt, - start_tsf); - } - -#endif - AsicNotSupportFunc(ad, __func__); - return 0; -} - -#endif - -#ifdef THERMAL_PROTECT_SUPPORT -INT32 -AsicThermalProtect(RTMP_ADAPTER *pAd, UINT8 HighEn, CHAR HighTempTh, - UINT8 LowEn, CHAR LowTempTh, UINT32 RechkTimer, - UINT8 RFOffEn, CHAR RFOffTh, UINT8 ucType) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - INT32 ret = 0; - ret = MtCmdThermalProtect(pAd, HighEn, HighTempTh, LowEn, - LowTempTh, RechkTimer, RFOffEn, - RFOffTh, ucType); - - if (ret == NDIS_STATUS_SUCCESS) { - pAd->thermal_pro_high_criteria = HighTempTh; - pAd->thermal_pro_high_en = HighEn; - pAd->thermal_pro_low_criteria = LowTempTh; - pAd->thermal_pro_low_en = LowEn; - pAd->recheck_timer = RechkTimer; - pAd->thermal_pro_RFOff_criteria = RFOffTh; - pAd->thermal_pro_RFOff_en = RFOffEn; - } - - return ret; - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -INT32 -AsicThermalProtectAdmitDuty(RTMP_ADAPTER *pAd, UINT32 u4Lv0Duty, - UINT32 u4Lv1Duty, UINT32 u4Lv2Duty, - UINT32 u4Lv3Duty) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - INT32 ret = 0; - ret = MtCmdThermalProtectAdmitDuty(pAd, u4Lv0Duty, u4Lv1Duty, - u4Lv2Duty, u4Lv3Duty); - return ret; - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} -#endif /* THERMAL_PROTECT_SUPPORT */ - -INT32 AsicGetMacInfo(RTMP_ADAPTER *pAd, UINT32 *ChipId, UINT32 *HwVer, - UINT32 *FwVer) -{ - INT32 ret; -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - ret = MtAsicGetMacInfo(pAd, ChipId, HwVer, FwVer); - return ret; - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} -#endif /*COMPOS_TESTMODE_WIN*/ -INT32 AsicGetAntMode(RTMP_ADAPTER *pAd, UCHAR *AntMode) -{ - INT32 ret; -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - ret = MtAsicGetAntMode(pAd, AntMode); - return ret; - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -INT32 AsicSetDmaByPassMode(RTMP_ADAPTER *pAd, BOOLEAN isByPass) -{ - INT32 ret; -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - ret = MtAsicSetDmaByPassMode(pAd, isByPass); - return ret; - } - -#endif - AsicNotSupportFunc(pAd, __func__); - return 0; -} - -#ifdef DBDC_MODE -INT32 AsicGetDbdcCtrl(RTMP_ADAPTER *pAd, BCTRL_INFO_T *pBctrlInfo) -{ - INT32 ret = 0; - - if (pAd->archOps.archGetDbdcCtrl) - ret = pAd->archOps.archGetDbdcCtrl(pAd, pBctrlInfo); - else - AsicNotSupportFunc(pAd, __func__); - - return ret; -} - -INT32 AsicSetDbdcCtrl(RTMP_ADAPTER *pAd, BCTRL_INFO_T *pBctrlInfo) -{ - INT32 ret = 0; - - if (pAd->archOps.archSetDbdcCtrl) - ret = pAd->archOps.archSetDbdcCtrl(pAd, pBctrlInfo); - else - AsicNotSupportFunc(pAd, __func__); - - return ret; -} - -#endif /*DBDC_MODE*/ - -INT32 AsicRxHeaderTransCtl(RTMP_ADAPTER *pAd, BOOLEAN En, BOOLEAN ChkBssid, - BOOLEAN InSVlan, BOOLEAN RmVlan, BOOLEAN SwPcP) -{ - INT32 ret = 0; - - if (pAd->archOps.archRxHeaderTransCtl) - ret = pAd->archOps.archRxHeaderTransCtl(pAd, En, ChkBssid, - InSVlan, RmVlan, SwPcP); - - return ret; -} - -INT32 AsicRxHeaderTaranBLCtl(RTMP_ADAPTER *pAd, UINT32 Index, BOOLEAN En, - UINT32 EthType) -{ - INT32 ret = 0; - - if (pAd->archOps.archRxHeaderTaranBLCtl) - ret = pAd->archOps.archRxHeaderTaranBLCtl(pAd, Index, En, - EthType); - - return ret; -} - -#ifdef IGMP_SNOOP_SUPPORT -BOOLEAN AsicMcastEntryInsert(RTMP_ADAPTER *pAd, PUCHAR GrpAddr, UINT8 BssIdx, - UINT8 Type, PUCHAR MemberAddr, PNET_DEV dev, - UINT8 WlanIndex) -{ - INT32 Ret = 0; - - if (pAd->archOps.archMcastEntryInsert) - Ret = pAd->archOps.archMcastEntryInsert( - pAd, GrpAddr, BssIdx, Type, MemberAddr, dev, WlanIndex); - - return Ret; -} - -BOOLEAN AsicMcastEntryDelete(RTMP_ADAPTER *pAd, PUCHAR GrpAddr, UINT8 BssIdx, - PUCHAR MemberAddr, PNET_DEV dev, UINT8 WlanIndex) -{ - INT32 Ret = 0; - - if (pAd->archOps.archMcastEntryDelete) - Ret = pAd->archOps.archMcastEntryDelete( - pAd, GrpAddr, BssIdx, MemberAddr, dev, WlanIndex); - - return Ret; -} - -#ifdef IGMP_TVM_SUPPORT -BOOLEAN AsicMcastConfigAgeOut(RTMP_ADAPTER *pAd, UINT8 AgeOutTime, - UINT8 omac_idx) -{ - INT32 Ret = 0; - - if (pAd->archOps.archMcastConfigAgeout) - Ret = pAd->archOps.archMcastConfigAgeout(pAd, AgeOutTime, - omac_idx); - - return Ret; -} - -BOOLEAN AsicMcastGetMcastTable(RTMP_ADAPTER *pAd, UINT8 ucOwnMacIdx, - struct wifi_dev *wdev) -{ - INT32 Ret = 0; - - if (pAd->archOps.archMcastGetMcastTable) - Ret = pAd->archOps.archMcastGetMcastTable(pAd, ucOwnMacIdx, - wdev); - - return Ret; -} - -#endif /* IGMP_TVM_SUPPORT*/ - -#endif - -#ifdef DOT11_VHT_AC -INT AsicSetRtsSignalTA(RTMP_ADAPTER *pAd, UCHAR bw_sig) -{ -#ifdef MT_MAC - if (IS_HIF_TYPE(pAd, HIF_MT)) { -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) - pAd->archOps.archSetRtsSignalTA(pAd, 1, bw_sig); -#endif /* DBDC_MODE */ - pAd->archOps.archSetRtsSignalTA(pAd, 0, bw_sig); - return TRUE; - } -#endif /* MT_MAC */ - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} -#endif /*DOT11_VHT_AC*/ - -VOID RssiUpdate(RTMP_ADAPTER *pAd) -{ - CHAR RSSI[4]; - MAC_TABLE_ENTRY *pEntry; - INT i = 0; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (pAd->MacTab.Size == 0) { - pEntry = &pAd->MacTab.Content[MCAST_WCID_TO_REMOVE]; - MtRssiGet(pAd, pEntry->wcid, &RSSI[0]); - - for (i = 0; i < TX_STREAM_PATH; i++) { - pEntry->RssiSample.AvgRssi[i] = - MINIMUM_POWER_VALUE; - pEntry->RssiSample.LastRssi[i] = - MINIMUM_POWER_VALUE; - pAd->ApCfg.RssiSample.AvgRssi[i] = - MINIMUM_POWER_VALUE; - pAd->ApCfg.RssiSample.LastRssi[i] = - MINIMUM_POWER_VALUE; - } - } else { - INT32 TotalRssi[4]; - INT j; - NdisZeroMemory(TotalRssi, sizeof(TotalRssi)); - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (IS_VALID_ENTRY(pEntry)) { - MtRssiGet(pAd, pEntry->wcid, &RSSI[0]); - - for (j = 0; j < TX_STREAM_PATH; j++) { - pEntry->RssiSample.AvgRssi[j] = - RSSI[j]; - pEntry->RssiSample.LastRssi[j] = - RSSI[j]; - TotalRssi[j] += RSSI[j]; - } - } - } - - for (i = 0; i < 4; i++) { - if (pAd->MacTab.Size != 0) - pAd->ApCfg.RssiSample.AvgRssi[i] = - pAd->ApCfg.RssiSample - .LastRssi[i] = - TotalRssi[i] / - pAd->MacTab.Size; - else - break; - } - } - } -#endif /* CONFIG_AP_SUPPORT */ -} - -/* end Trace for every 100 ms */ -#ifdef ETSI_RX_BLOCKER_SUPPORT -VOID CheckRssi(RTMP_ADAPTER *pAd) -{ - UINT8 u1MaxWRssiIdx; - UINT8 u1WFBitMap = BITMAP_WF_ALL; - CHAR c1MaxWbRssi = MINIMUM_POWER_VALUE; - UINT32 u4WbRssi = 0; - UINT8 u1CheckIdx; - UINT32 u4DcrfCr = 0; - UCHAR u1BandIdx = 0; - - switch (pAd->u1RxBlockerState) { - case ETSI_RXBLOCKER4R: - - /* Enable DCRF tracking */ - PHY_IO_READ32(pAd, DCRF_TRACK, &u4DcrfCr); - u4DcrfCr &= ~(BITS(28, 29)); - u4DcrfCr |= ((0x3 << 28) & BITS(28, 29)); /*Enable DCRF*/ - PHY_IO_WRITE32(pAd, DCRF_TRACK, u4DcrfCr); - - /* confidence count check for 1R transition */ - for (u1CheckIdx = 0; u1CheckIdx < pAd->u1To1RCheckCnt; - u1CheckIdx++) { - /* update Max WBRSSI index */ - u1MaxWRssiIdx = ETSIWbRssiCheck(pAd); - - /* log check Max Rssi Index or not found */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" i1MaxWRssiIdxPrev: %x \n", - pAd->i1MaxWRssiIdxPrev)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" u1MaxWRssiIdx: %x \n", u1MaxWRssiIdx)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - /* ---------------- */ - - /* not found Max WBRSSI Index */ - if (0xFF == u1MaxWRssiIdx) { - pAd->u1ValidCnt = 0; - pAd->i1MaxWRssiIdxPrev = 0xFF; - } - /* confidence count increment to 1R state */ - else if (pAd->i1MaxWRssiIdxPrev == u1MaxWRssiIdx) { - pAd->u1ValidCnt++; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" Same index: u1ValidCnt: %d \n", - pAd->u1ValidCnt)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - } - /* Max WBRSSI index changed */ - else { - pAd->u1ValidCnt = 1; - pAd->i1MaxWRssiIdxPrev = u1MaxWRssiIdx; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" Different index: u1ValidCnt: %d \n", - pAd->u1ValidCnt)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - } - - /* confidence count check */ - if (pAd->u1ValidCnt >= pAd->u2To1RvaildCntTH) { - /* config Rx index according to bitmap */ - switch (u1MaxWRssiIdx) { - case 0: - u1WFBitMap = BITMAP_WF0; - break; - case 1: - u1WFBitMap = BITMAP_WF1; - break; - case 2: - u1WFBitMap = BITMAP_WF2; - break; - case 3: - u1WFBitMap = BITMAP_WF3; - break; - default: - break; - } - - /* config Rx */ - MtCmdLinkTestRxCtrl(pAd, u1WFBitMap, u1BandIdx); - - /* reset confidence count */ - pAd->u1ValidCnt = 0; - /* update state */ - pAd->u1RxBlockerState = ETSI_RXBLOCKER1R; - /* break out for loop */ - break; - } - } - break; - - case ETSI_RXBLOCKER1R: - - /* Disable DCRF tracking */ - PHY_IO_READ32(pAd, DCRF_TRACK, &u4DcrfCr); - u4DcrfCr &= ~(BITS(28, 29)); - u4DcrfCr |= ((0x0 << 28) & BITS(28, 29)); /*disable DCRF*/ - PHY_IO_WRITE32(pAd, DCRF_TRACK, u4DcrfCr); - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - if (IS_MT7622(pAd)) { /* for 7622 */ - if (pAd->i1MaxWRssiIdxPrev == WF0 || - pAd->i1MaxWRssiIdxPrev == WF1) { - /* Read WBRSSI (WF0) */ - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, - &u4WbRssi); - c1MaxWbRssi = (u4WbRssi & - BITS(0, 7)); /* [7:0] */ - } else { - /* Read WBRSSI (WF2) */ - PHY_IO_READ32(pAd, RO_BAND1_AGC_DEBUG_2, - &u4WbRssi); - c1MaxWbRssi = (u4WbRssi & - BITS(0, 7)); /* [7:0] */ - } - } - if (IS_MT7615(pAd)) { /* for 7615 */ - if (pAd->i1MaxWRssiIdxPrev == WF0 || - pAd->i1MaxWRssiIdxPrev == WF1) { - /* Read WBRSSI (WF0) */ - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, - &u4WbRssi); - c1MaxWbRssi = - ((u4WbRssi >> 16) & - BITS(0, 7)); /* [23:16] */ - } else { - /* Read WBRSSI (WF2) */ - PHY_IO_READ32(pAd, RO_BAND1_AGC_DEBUG_2, - &u4WbRssi); - c1MaxWbRssi = - ((u4WbRssi >> 16) & - BITS(0, 7)); /* [23:16] */ - } - } - } else { - if (IS_MT7622(pAd)) { /* for 7622 */ - /* Read WBRSSI (WF0) */ - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, - &u4WbRssi); - c1MaxWbRssi = - (u4WbRssi & BITS(0, 7)); /* [7:0] */ - } - if (IS_MT7615(pAd)) { /* for 7615 */ - /* Read WBRSSI (WF0) */ - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, - &u4WbRssi); - c1MaxWbRssi = ((u4WbRssi >> 16) & - BITS(0, 7)); /* [23:16] */ - } - } -#else - if (IS_MT7622(pAd)) { /* for 7622 */ - /* Read WBRSSI (WF0) */ - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, &u4WbRssi); - c1MaxWbRssi = (u4WbRssi & BITS(0, 7)); /* [7:0] */ - } - if (IS_MT7615(pAd)) { /* for 7615 */ - /* Read WBRSSI (WF0) */ - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, &u4WbRssi); - c1MaxWbRssi = - ((u4WbRssi >> 16) & BITS(0, 7)); /* [23:16] */ - } -#endif /* DBDC_MODE */ - - /* log for check Rssi Read (WBRSSI/IBRSSI) */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------(1R State)----------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" c1MaxWbRssi: %x \n", c1MaxWbRssi & 0xFF)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - /* ---------------- */ - - /* CR risk - no expected 0x80 value on WF0/WF1 ; WF2/WF3 */ - if ((c1MaxWbRssi & 0xFF) == 0x80) { - pAd->u1RxBlockerState = ETSI_RXBLOCKER1R; - - } - /* No CR risk */ - else { - /* check whether back to 4R mode */ - if (c1MaxWbRssi < pAd->c1WBRssiTh4R) { - /* CR risk - Protect unexpected value */ - if (pAd->u14RValidCnt >= - pAd->u2To4RvaildCntTH) { - MtCmdLinkTestRxCtrl(pAd, BITMAP_WF_ALL, - u1BandIdx); - /* update state */ - pAd->u1RxBlockerState = - ETSI_RXBLOCKER4R; - pAd->u14RValidCnt = 1; - - /* log for check Rssi Read (WBRSSI/IBRSSI) */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("----------------------------------(TO 4R State)------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" u14RValidCnt: %d \n", - pAd->u14RValidCnt)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - /* ---------------- */ - } else { - pAd->u1RxBlockerState = - ETSI_RXBLOCKER1R; - pAd->u14RValidCnt++; - /* log for check Rssi Read (WBRSSI/IBRSSI) */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("----------------------------------(Keep 1R State)------------------------------- \n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" c1MaxWbRssi: %d, c1WBRssiTh4R: %d \n", - c1MaxWbRssi, - pAd->c1WBRssiTh4R)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - (" CR risk!! u14RValidCnt: %d \n", - pAd->u14RValidCnt)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - /* ---------------- */ - } - - } else - pAd->u1RxBlockerState = ETSI_RXBLOCKER1R; - } - - break; - default: - break; - } -} -#endif /* end of ETSI_RX_BLOCKER_SUPPORT */ - -#define RTS_NUM_DIS_VALUE 0xff -#define RTS_LEN_DIS_VALUE 0xffffff -INT asic_rts_on_off(struct wifi_dev *wdev, BOOLEAN rts_en) -{ - struct _RTMP_ADAPTER *ad; - UCHAR band_idx; - UINT32 rts_num; - UINT32 rts_len; - - if (!wdev) - return 0; - - ad = wdev->sys_handle; - band_idx = HcGetBandByWdev(wdev); - -#ifdef MT_MAC - if (ad->archOps.asic_rts_on_off) { - if (rts_en) { - rts_num = wlan_operate_get_rts_pkt_thld(wdev); - rts_len = wlan_operate_get_rts_len_thld(wdev); - } else { - rts_num = RTS_NUM_DIS_VALUE; - rts_len = RTS_LEN_DIS_VALUE; - } - return ad->archOps.asic_rts_on_off(ad, band_idx, rts_num, - rts_len, rts_en); - } -#endif - - AsicNotSupportFunc(ad, __func__); - return 0; -} - -INT AsicAmpduEfficiencyAdjust(struct wifi_dev *wdev, UCHAR aifs_adjust) -{ - struct _RTMP_ADAPTER *ad; - UINT32 wmm_idx; - - if (!wdev) - return 0; - - ad = wdev->sys_handle; - wmm_idx = HcGetWmmIdx(ad, wdev); -#ifdef MT_MAC - - if (ad->archOps.asic_ampdu_efficiency_on_off) - return ad->archOps.asic_ampdu_efficiency_on_off(ad, wmm_idx, - aifs_adjust); - -#endif - AsicNotSupportFunc(ad, __func__); - return 0; -} - -BOOLEAN asic_bss_beacon_exit(struct _RTMP_ADAPTER *pAd) -{ - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - - /* beacon init for USB/SDIO */ - if (arch_ops->arch_bss_beacon_exit) - arch_ops->arch_bss_beacon_exit(pAd); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN asic_bss_beacon_stop(struct _RTMP_ADAPTER *pAd) -{ - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - - /* beacon stop for USB/SDIO */ - if (arch_ops->arch_bss_beacon_stop) - arch_ops->arch_bss_beacon_stop(pAd); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN asic_bss_beacon_start(struct _RTMP_ADAPTER *pAd) -{ - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - - /* beacon start for USB/SDIO */ - if (arch_ops->arch_bss_beacon_start) - arch_ops->arch_bss_beacon_start(pAd); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -BOOLEAN asic_bss_beacon_init(struct _RTMP_ADAPTER *pAd) -{ - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - - /* beacon init for USB/SDIO */ - if (arch_ops->arch_bss_beacon_init) - arch_ops->arch_bss_beacon_init(pAd); - - AsicNotSupportFunc(pAd, __func__); - return FALSE; -} - -/*----------------------------------------------------------------------------*/ -/*! Key word: "RXBLOCKER", "WBRSSI", "IBRSSI" -* \Concept: Switch 4RX to 1RX by detect WBRSSI -*1 -* \Input: None -* -* \return: WBRSSI[MAX] or -1 -*/ -/*----------------------------------------------------------------------------*/ -#ifdef ETSI_RX_BLOCKER_SUPPORT -UINT8 ETSIWbRssiCheck(RTMP_ADAPTER *pAd) -{ - BOOLEAN fg1RVaild = TRUE; - UINT8 u1WfIdx; - UINT8 u1MaxWbRssiIdx = 0; - CHAR c1MaxWbRssi = MINIMUM_POWER_VALUE; - CHAR c1WbRssi[WF_NUM] = { MINIMUM_POWER_VALUE, MINIMUM_POWER_VALUE, - MINIMUM_POWER_VALUE, MINIMUM_POWER_VALUE }; - CHAR c1IbRssi[WF_NUM] = { MINIMUM_POWER_VALUE, MINIMUM_POWER_VALUE, - MINIMUM_POWER_VALUE, MINIMUM_POWER_VALUE }; - - /* buffer to read CR */ - UINT32 u4WbRssi = 0; - - /* Read CR (manual command) */ - if (pAd->fgFixWbIBRssiEn) { - /* WBRSSI */ - c1WbRssi[WF0] = pAd->c1WbRssiWF0; - c1WbRssi[WF1] = pAd->c1WbRssiWF1; - c1WbRssi[WF2] = pAd->c1WbRssiWF2; - c1WbRssi[WF3] = pAd->c1WbRssiWF3; - /* IBRSSI */ - c1IbRssi[WF0] = pAd->c1IbRssiWF0; - c1IbRssi[WF1] = pAd->c1IbRssiWF1; - c1IbRssi[WF2] = pAd->c1IbRssiWF2; - c1IbRssi[WF3] = pAd->c1IbRssiWF3; - } - /* Read CR (HW CR) */ - else { - if (IS_MT7622(pAd)) { /* for 7622 */ - /* Read WBRSSI/IBRSSI (WF0, WF1) */ - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, &u4WbRssi); - c1WbRssi[WF1] = - ((u4WbRssi >> 16) & BITS(0, 7)); /* [23:16] */ - c1WbRssi[WF0] = (u4WbRssi & BITS(0, 7)); /* [7:0] */ - c1IbRssi[WF1] = - ((u4WbRssi >> 24) & BITS(0, 7)); /* [31:24] */ - c1IbRssi[WF0] = - ((u4WbRssi >> 8) & BITS(0, 7)); /* [15:8] */ - - /* Read WBRSSI/IBRSSI (WF2, WF3) */ - PHY_IO_READ32(pAd, RO_BAND1_AGC_DEBUG_2, &u4WbRssi); - c1WbRssi[WF3] = - ((u4WbRssi >> 16) & BITS(0, 7)); /* [23:16] */ - c1WbRssi[WF2] = (u4WbRssi & BITS(0, 7)); /* [7:0] */ - c1IbRssi[WF3] = - ((u4WbRssi >> 24) & BITS(0, 7)); /* [31:24] */ - c1IbRssi[WF2] = - ((u4WbRssi >> 8) & BITS(0, 7)); /* [15:8] */ - } - if (IS_MT7615(pAd)) { /* for 7615 */ - /* Read WBRSSI/IBRSSI (WF0, WF1) */ - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, &u4WbRssi); - c1WbRssi[WF0] = - ((u4WbRssi >> 16) & BITS(0, 7)); /* [23:16] */ - c1WbRssi[WF1] = (u4WbRssi & BITS(0, 7)); /* [7:0] */ - c1IbRssi[WF0] = - ((u4WbRssi >> 24) & BITS(0, 7)); /* [31:24] */ - c1IbRssi[WF1] = - ((u4WbRssi >> 8) & BITS(0, 7)); /* [15:8] */ - - /* Read WBRSSI/IBRSSI (WF2, WF3) */ - PHY_IO_READ32(pAd, RO_BAND1_AGC_DEBUG_2, &u4WbRssi); - c1WbRssi[WF2] = - ((u4WbRssi >> 16) & BITS(0, 7)); /* [23:16] */ - c1WbRssi[WF3] = (u4WbRssi & BITS(0, 7)); /* [7:0] */ - c1IbRssi[WF2] = - ((u4WbRssi >> 24) & BITS(0, 7)); /* [31:24] */ - c1IbRssi[WF3] = - ((u4WbRssi >> 8) & BITS(0, 7)); /* [15:8] */ - } - } - - /* log for check Rssi Read (WBRSSI/IBRSSI) */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" c1WbRssi: WF0: %x, WF1: %x, WF2: %x, WF3: %x \n", - c1WbRssi[WF0] & 0xFF, c1WbRssi[WF1] & 0xFF, - c1WbRssi[WF2] & 0xFF, c1WbRssi[WF3] & 0xFF)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" c1IbRssi: WF0: %x, WF1: %x, WF2: %x, WF3: %x \n", - c1IbRssi[WF0] & 0xFF, c1IbRssi[WF1] & 0xFF, - c1IbRssi[WF2] & 0xFF, c1IbRssi[WF3] & 0xFF)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - /* ---------------- */ - - /* CR risk - no expected 0x80 value on WF0/WF1 ; WF2/WF3 */ - if (((c1WbRssi[WF0] & 0xFF) == 0x80) || - ((c1WbRssi[WF2] & 0xFF) == 0x80)) { - fg1RVaild = TRUE; - /* log for check Rssi Read (WBRSSI/IBRSSI) */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" CR risk !! \n")); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - /* ---------------- */ - } - /* No CR risk */ - else { - /* Find Max Rssi */ - for (u1WfIdx = WF0; u1WfIdx < WF_NUM; u1WfIdx++) { - if (c1WbRssi[u1WfIdx] > c1MaxWbRssi) { - /* update Max WBRSSI value */ - c1MaxWbRssi = c1WbRssi[u1WfIdx]; - /* update Max WBRSSI index */ - u1MaxWbRssiIdx = u1WfIdx; - } - } - - /* log Max Rssi Value and Max Rssi Index */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-----------------------------------(4R State)------------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" u1WfIdx: %x \n", u1WfIdx)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" c1MaxWbRssi: %x \n", c1MaxWbRssi)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - /* ---------------- */ - - /* check state transition status (4R->1R) */ - if (c1MaxWbRssi >= pAd->c1RWbRssiHTh) { - for (u1WfIdx = WF0; u1WfIdx < WF_NUM; u1WfIdx++) { - if ((u1WfIdx != u1MaxWbRssiIdx) && - ((c1WbRssi[u1WfIdx] > pAd->c1RWbRssiLTh) || - (c1IbRssi[u1WfIdx] > pAd->c1RIbRssiLTh))) { - fg1RVaild = FALSE; - } else - fg1RVaild = TRUE; - } - } else - fg1RVaild = FALSE; - } - - /* log check flag to 1R */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" fg1RVaild: %x \n", fg1RVaild)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("----------------------------------------------------------------------------- \n")); - /* ---------------- */ - - /* check 1R transition flag */ - if (fg1RVaild) - return u1MaxWbRssiIdx; - else - return 0xFF; -} -#endif /* end ETSI_RX_BLOCKER_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt.c deleted file mode 100644 index c7d1c74592..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt.c +++ /dev/null @@ -1,6178 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_asic_mt.c - - Abstract: - Functions used to communicate with ASIC - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Cmm_asic_mt.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -extern const UCHAR wmm_aci_2_hw_ac_queue[18]; - -#ifdef CONFIG_AP_SUPPORT -/* because of the CR arrangement in HW are not in sequence, wrape the table to search fast.*/ -static UINT32 LPON_TT0SBOR_CR_MAPPING_TABLE[] = { - LPON_TT0TPCR, LPON_TT0SBOR1, LPON_TT0SBOR2, LPON_TT0SBOR3, - LPON_TT0SBOR4, LPON_TT0SBOR5, LPON_TT0SBOR6, LPON_TT0SBOR7, - LPON_TT0SBOR8, LPON_TT0SBOR9, LPON_TT0SBOR10, LPON_TT0SBOR11, - LPON_TT0SBOR12, LPON_TT0SBOR13, LPON_TT0SBOR14, LPON_TT0SBOR15, -}; -#endif - -/** - * @addtogroup pse - * @{ - * @name pse HW HAL - * @{ - */ - -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else -INT set_get_fid(RTMP_ADAPTER *pAd, char *arg) -{ - /* TODO: Carter, at present, only can read pkt in Port2(LMAC port) */ - UCHAR q_idx = 0, loop = 0, dw_idx = 0; - UINT32 head_fid_addr = 0, next_fid_addr = 0, value = 0x00000000L, - dw_content; - /* TODO: Star */ - q_idx = simple_strtol(arg, 0, 10); - value = 0x00400000 | (q_idx << 16); /* port2. queue by input value. */ - MAC_IO_WRITE32(pAd, 0x8024, value); - MAC_IO_READ32(pAd, 0x8024, - (UINT32 *)&head_fid_addr); /* get head FID. */ - head_fid_addr = head_fid_addr & 0xfff; - - if (head_fid_addr == 0xfff) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, q_idx:%d empty!!\n", __func__, q_idx)); - return TRUE; - } - - value = (0 | (head_fid_addr << 16)); - - while (1) { - for (dw_idx = 0; dw_idx < 8; dw_idx++) { - MAC_IO_READ32( - pAd, - ((MT_PCI_REMAP_ADDR_1 + - (((value & 0x0fff0000) >> 16) * 128)) + - (dw_idx * 4)), - (UINT32 *)&dw_content); /* get head FID. */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pkt:%d, fid:%x, dw_idx = %d, dw_content = 0x%x\n", - loop, ((value & 0x0fff0000) >> 16), dw_idx, - dw_content)); - } - - MAC_IO_WRITE32(pAd, 0x8028, value); - MAC_IO_READ32(pAd, 0x8028, - (UINT32 *)&next_fid_addr); /* get next FID. */ - - if ((next_fid_addr & 0xfff) == 0xfff) - return TRUE; - - value = (0 | ((next_fid_addr & 0xffff) << 16)); - loop++; - - if (loop > 5) - return TRUE; - } - - return TRUE; -} -#endif - -/** @} */ -/** @} */ - -/* Static API for local usage */ -static VOID Wtbl2TxRateCounterGet(struct _RTMP_ADAPTER *pAd, UCHAR ucWcid, - TX_CNT_INFO *tx_cnt_info); - -static BOOLEAN WtblWaitIdle(RTMP_ADAPTER *pAd, UINT32 WaitCnt, UINT32 WaitDelay) -{ - UINT32 Value, CurCnt = 0; - - do { - MAC_IO_READ32(pAd, WTBL_OFF_WIUCR, &Value); - - if ((Value & IU_BUSY) == 0) - break; - - CurCnt++; - RtmpusecDelay(WaitDelay); - } while (CurCnt < WaitCnt); - - if (CurCnt == WaitCnt) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Previous update not applied by HW yet!(reg_val=0x%x)\n", - __func__, Value)); - return FALSE; - } - - return TRUE; -} - -UINT32 MtAsicGetCrcErrCnt(RTMP_ADAPTER *pAd) -{ - return 0; -} - -UINT32 MtAsicGetPhyErrCnt(RTMP_ADAPTER *pAd) -{ - return 0; -} - -UINT32 MtAsicGetCCACnt(RTMP_ADAPTER *pAd) -{ - return 0; -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ - -VOID MtAsicResetBBPAgent(RTMP_ADAPTER *pAd) -{ - /* Still need to find why BBP agent keeps busy, but in fact, hardware still function ok. Now clear busy first. */ - /* IF ops->AsicResetBbpAgent == NULL, run "else" part */ - /* TODO: shiang-usw, unify the ops */ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - if (ops->AsicResetBbpAgent != NULL) - ops->AsicResetBbpAgent(pAd); -} - -/** - * @addtogroup bss_dev_sta_info - * @{ - * @name BSS Info/Device Info/STA Record HW HAL - * @{ - */ -/* - * ========================================================================== - * Description: - * Set My BSSID - * - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -/* CFG_TODO */ -VOID MtAsicSetBssid(RTMP_ADAPTER *pAd, UCHAR *pBssid, UCHAR BssidIndex) -{ - UINT32 val; - /* TODO: shiang-7603, now only configure Current BSSID Address 0 */ - ULONG curr_bssid_reg_base = - RMAC_CB0R0; /* register for Current_Bssid from 0x60140004 */ - - val = (UINT32)((pBssid[0]) | (UINT32)(pBssid[1] << 8) | - (UINT32)(pBssid[2] << 16) | (UINT32)(pBssid[3] << 24)); - MAC_IO_WRITE32(pAd, curr_bssid_reg_base + (BssidIndex * 8), val); - val = (UINT32)(pBssid[4]) | (UINT32)(pBssid[5] << 8) | (1 << 16); - MAC_IO_WRITE32(pAd, (curr_bssid_reg_base + 4) + (BssidIndex * 8), val); - /* If we enable BSSID0, we should not enable MBSS0, or the BSSID index will wrong */ - /* MAC_IO_READ32(pAd, RMAC_ACBEN, &val); */ - /* val |= 0x1; */ - /* MAC_IO_WRITE32(pAd, RMAC_ACBEN, val); */ -} - -INT32 MtAsicSetDevMac(RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, UINT8 *OwnMacAddr, - UINT8 BandIdx, UINT8 Active, UINT32 EnableFeature) -{ - UINT32 val; - ULONG own_mac_reg_base = - RMAC_OMA0R0; /* register for Own_Mac from 0x60140024 */ - - if (Active) { - val = (OwnMacAddr[0]) | (OwnMacAddr[1] << 8) | - (OwnMacAddr[2] << 16) | (OwnMacAddr[3] << 24); - MAC_IO_WRITE32(pAd, own_mac_reg_base + (OwnMacIdx * 8), val); - val = OwnMacAddr[4] | (OwnMacAddr[5] << 8) | (1 << 16); - MAC_IO_WRITE32(pAd, (own_mac_reg_base + 4) + (OwnMacIdx * 8), - val); - } - -#if !defined(COMPOS_TESTMODE_WIN) && !defined(COMPOS_WIN) - AsicDevInfoUpdate(pAd, OwnMacIdx, OwnMacAddr, BandIdx, Active, - DEVINFO_ACTIVE_FEATURE); -#endif - return TRUE; -} - -/** @} */ -/** @} */ - -/** - * @addtogroup tx_rx_path - * @{ - * @name TX/RX HW HAL - * @{ - */ - -#ifdef CONFIG_WTBL_TLV_MODE -INT MtAsicSetRDGByTLV(RTMP_ADAPTER *pAd, BOOLEAN bEnable, UINT8 Wcid) -{ - CMD_WTBL_RDG_T CmdWtblRdg = { 0 }; - - CmdWtblRdg.u2Tag = WTBL_RDG; - CmdWtblRdg.u2Length = sizeof(CMD_WTBL_RDG_T); - - if (bEnable) { - CmdWtblRdg.ucRdgBa = 1; - CmdWtblRdg.ucR = 1; - } - - return CmdExtWtblUpdate(pAd, Wcid, SET_WTBL, (PUCHAR)&CmdWtblRdg, - sizeof(CMD_WTBL_RDG_T)); -} - -#else - -#ifdef DOT11_N_SUPPORT -INT MtAsicWtblSetRDG(RTMP_ADAPTER *pAd, BOOLEAN bEnable, UINT8 Wcid) -{ - struct wtbl_entry tb_entry; - union WTBL_1_DW2 *dw2 = - (union WTBL_1_DW2 *)&tb_entry.wtbl_1.wtbl_1_d2.word; - - os_zero_mem(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, Wcid, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, Wcid)); - return FALSE; - } - - HW_IO_READ32(pAd, tb_entry.wtbl_addr[0] + (2 * 4), &dw2->word); - - if (bEnable) { - dw2->field.r = 1; - dw2->field.rdg_ba = 1; - } else { - dw2->field.r = 0; - dw2->field.rdg_ba = 0; - } - - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + (2 * 4), dw2->word); - return TRUE; -} - -INT MtAsicSetRDG(RTMP_ADAPTER *pAd, BOOLEAN bEnable, UCHAR BandIdx) -{ - UINT32 tmac_tcr, agg_pcr, tmac_trcr; - - MAC_IO_READ32(pAd, TMAC_TCR, &tmac_tcr); - MAC_IO_READ32(pAd, AGG_PCR, &agg_pcr); - MAC_IO_READ32(pAd, TMAC_TRCR, &tmac_trcr); - - if (bEnable) { - /* enable RDG Rsp. also w/ Ralink Mode is necessary */ - tmac_tcr |= (RDG_RA_MODE | RDG_RESP_EN); - /* LongNAV protect */ - agg_pcr &= ~(PROTECTION_MODE); - tmac_trcr = tmac_trcr & ~I2T_CHK_EN; - } else { - /* disable RDG Rsp. also w/ Ralink Mode is necessary */ - tmac_tcr &= ~(RDG_RA_MODE | RDG_RESP_EN); - /* single frame protect */ - agg_pcr |= PROTECTION_MODE; - tmac_trcr = tmac_trcr | I2T_CHK_EN; - } - - MAC_IO_WRITE32(pAd, TMAC_TCR, tmac_tcr); - MAC_IO_WRITE32(pAd, AGG_PCR, agg_pcr); - MAC_IO_WRITE32(pAd, TMAC_TRCR, tmac_trcr); - return TRUE; -} -#endif /* DOT11_N_SUPPORT */ -#endif - -INT32 MtAsicSetMacTxRx(RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN Enable, - UCHAR BandIdx) -{ - UINT32 Value, Value1, Value2; - - MAC_IO_READ32(pAd, ARB_SCR, &Value); - MAC_IO_READ32(pAd, ARB_TQCR0, &Value1); - MAC_IO_READ32(pAd, ARB_RQCR, &Value2); - - switch (TxRx) { - case ASIC_MAC_TX: - if (Enable) { - Value &= ~MT_ARB_SCR_TXDIS; - Value1 = 0xffffffff; - } else { - Value |= MT_ARB_SCR_TXDIS; - Value1 = 0; - } - - break; - - case ASIC_MAC_RX: - if (Enable) { - Value &= ~MT_ARB_SCR_RXDIS; - Value2 |= ARB_RQCR_RX_START; - } else { - Value |= MT_ARB_SCR_RXDIS; - Value2 &= ~ARB_RQCR_RX_START; - } - - break; - - case ASIC_MAC_TXRX: - if (Enable) { - Value &= ~(MT_ARB_SCR_TXDIS | MT_ARB_SCR_RXDIS); - Value1 = 0xffffffff; - Value2 |= ARB_RQCR_RX_START; - } else { - Value |= (MT_ARB_SCR_TXDIS | MT_ARB_SCR_RXDIS); - Value1 = 0; - Value2 &= ~ARB_RQCR_RX_START; - } - - break; - - case ASIC_MAC_TXRX_RXV: - if (Enable) { - Value &= ~(MT_ARB_SCR_TXDIS | MT_ARB_SCR_RXDIS); - Value1 = 0xffffffff; - Value2 |= (ARB_RQCR_RX_START | ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | ARB_RQCR_RXV_T_EN); - } else { - Value |= (MT_ARB_SCR_TXDIS | MT_ARB_SCR_RXDIS); - Value1 = 0; - Value2 &= ~(ARB_RQCR_RX_START | ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | ARB_RQCR_RXV_T_EN); - } - - break; - - case ASIC_MAC_RXV: - if (Enable) { - Value &= ~MT_ARB_SCR_RXDIS; - Value2 |= (ARB_RQCR_RXV_START | ARB_RQCR_RXV_R_EN | - ARB_RQCR_RXV_T_EN); - } else { - Value2 &= ~(ARB_RQCR_RXV_START | ARB_RQCR_RXV_R_EN | - ARB_RQCR_RXV_T_EN); - } - - break; - - case ASIC_MAC_RX_RXV: - if (Enable) { - Value &= ~MT_ARB_SCR_RXDIS; - Value2 |= (ARB_RQCR_RX_START | ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | ARB_RQCR_RXV_T_EN); - } else { - Value |= MT_ARB_SCR_RXDIS; - Value2 &= ~(ARB_RQCR_RX_START | ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | ARB_RQCR_RXV_T_EN); - } - - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown path (%d\n", __func__, TxRx)); - break; - } - - MAC_IO_WRITE32(pAd, ARB_SCR, Value); - MAC_IO_WRITE32(pAd, ARB_TQCR0, Value1); - MAC_IO_WRITE32(pAd, ARB_RQCR, Value2); - return TRUE; -} - -VOID MtAsicSetTxSClassifyFilter(RTMP_ADAPTER *pAd, UINT32 Port, UINT8 DestQ, - UINT32 AggNums, UINT32 Filter, UCHAR BandIdx) -{ - UINT32 Value; - - if (Port == TXS2HOST) { - MAC_IO_READ32(pAd, DMA_TCFR1, &Value); - Value &= ~TXS2H_BIT_MAP_MASK; - Value |= TXS2H_BIT_MAP(Filter); - Value &= ~TXS2H_AGG_CNT_MASK; - Value |= TXS2H_AGG_CNT(AggNums); - - if (DestQ == 0) - Value &= ~TXS2H_QID; - else - Value |= TXS2H_QID; - - MAC_IO_WRITE32(pAd, DMA_TCFR1, Value); - } else if (Port == TXS2MCU) { - MAC_IO_READ32(pAd, DMA_TCFR0, &Value); - Value &= ~TXS2M_BIT_MAP_MASK; - Value |= TXS2M_BIT_MAP(Filter); - Value &= ~TXS2M_AGG_CNT_MASK; - Value |= TXS2M_AGG_CNT(AggNums); - Value &= ~TXS2M_QID_MASK; - Value |= TXS2M_QID(DestQ); - MAC_IO_WRITE32(pAd, DMA_TCFR0, Value); - } else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknow Port(%d)\n", __func__, Port)); -} - -#define RX_PKT_MAX_LENGTH 0x400 /* WORD(4 Bytes) unit */ -INT MtAsicSetMacMaxLen(RTMP_ADAPTER *pAd) -{ - /* TODO: shiang-7603 */ - UINT32 val; - /* Rx max packet length */ - MAC_IO_READ32(pAd, DMA_DCR0, &val); - val &= (~0xfffc); - val |= (RX_PKT_MAX_LENGTH << 2); - MAC_IO_WRITE32(pAd, DMA_DCR0, val); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Set the Max RxPktLen=%d!\n", __func__, __LINE__, - RX_PKT_MAX_LENGTH)); - return TRUE; -} - -INT MtAsicSetTxStream(RTMP_ADAPTER *pAd, UINT32 StreamNums, UCHAR BandIdx) -{ - UINT32 Value; - - MAC_IO_READ32(pAd, TMAC_TCR, &Value); - Value &= ~TMAC_TCR_TX_STREAM_NUM_MASK; - Value |= TMAC_TCR_TX_STREAM_NUM(StreamNums - 1); - MAC_IO_WRITE32(pAd, TMAC_TCR, Value); - return TRUE; -} - -INT MtAsicSetRxStream(RTMP_ADAPTER *pAd, UINT32 StreamNums, UCHAR BandIdx) -{ - UINT32 Value, Mask = 0; - INT Ret = TRUE; - - MAC_IO_READ32(pAd, RMAC_RMCR, &Value); - Value &= ~(RMAC_RMCR_RX_STREAM_0 | RMAC_RMCR_RX_STREAM_1 | - RMAC_RMCR_RX_STREAM_2); - - switch (StreamNums) { - case 3: - Mask |= RMAC_RMCR_RX_STREAM_2; - - case 2: - Mask |= RMAC_RMCR_RX_STREAM_1; - - case 1: - Mask |= RMAC_RMCR_RX_STREAM_0; - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal StreamNums(%d\n", StreamNums)); - Ret = FALSE; - break; - } - - if (Ret) { - Value |= Mask; - Value &= ~RMAC_RMCR_SMPS_MODE_MASK; - Value |= RMAC_RMCR_SMPS_MODE(DISABLE_SMPS_RX_BYSETTING); - MAC_IO_WRITE32(pAd, RMAC_RMCR, Value); - } - - return Ret; -} - -INT MtAsicSetRxPath(RTMP_ADAPTER *pAd, UINT32 RxPathSel, UCHAR BandIdx) -{ - UINT32 Value = 0, Mask = 0; - INT Ret = TRUE; - - MAC_IO_READ32(pAd, RMAC_RMCR, &Value); - Value &= ~(RMAC_RMCR_RX_STREAM_0 | RMAC_RMCR_RX_STREAM_1 | - RMAC_RMCR_RX_STREAM_2); - - switch (RxPathSel) { - case 0: /* ALL */ - Mask = (RMAC_RMCR_RX_STREAM_0 | RMAC_RMCR_RX_STREAM_1 | - RMAC_RMCR_RX_STREAM_2); - break; - - case 1: /* RX0 */ - Mask = RMAC_RMCR_RX_STREAM_0; - break; - - case 2: /* RX1 */ - Mask = RMAC_RMCR_RX_STREAM_1; - break; - - case 3: /* RX2 */ - Mask = RMAC_RMCR_RX_STREAM_2; - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("illegal RxPath(%d\n", RxPathSel)); - Ret = FALSE; - break; - } - - if (Ret) { - Value |= Mask; - Value &= ~RMAC_RMCR_SMPS_MODE_MASK; - Value |= RMAC_RMCR_SMPS_MODE(DISABLE_SMPS_RX_BYSETTING); - MAC_IO_WRITE32(pAd, RMAC_RMCR, Value); - } - - return Ret; -} - -static VOID RxFilterCfg2Row(UINT32 FilterMask, UINT32 *RowFilterMask) -{ - *RowFilterMask = FilterMask & RX_STBC_BCN_BC_MC ? - (*RowFilterMask | DROP_STBC_BCN_BC_MC) : - (*RowFilterMask & ~(DROP_STBC_BCN_BC_MC)); - *RowFilterMask = FilterMask & RX_FCS_ERROR ? - (*RowFilterMask | DROP_FCS_ERROR_FRAME) : - (*RowFilterMask & ~(DROP_FCS_ERROR_FRAME)); - *RowFilterMask = FilterMask & RX_PROTOCOL_VERSION ? - (*RowFilterMask | DROP_VERSION_NO_0) : - (*RowFilterMask & ~(DROP_VERSION_NO_0)); - *RowFilterMask = FilterMask & RX_PROB_REQ ? - (*RowFilterMask | DROP_PROBE_REQ) : - (*RowFilterMask & ~(DROP_PROBE_REQ)); - *RowFilterMask = FilterMask & RX_MC_ALL ? - (*RowFilterMask | DROP_MC_FRAME) : - (*RowFilterMask & ~(DROP_MC_FRAME)); - *RowFilterMask = FilterMask & RX_BC_ALL ? - (*RowFilterMask | DROP_BC_FRAME) : - (*RowFilterMask & ~(DROP_BC_FRAME)); - *RowFilterMask = FilterMask & RX_MC_TABLE ? - (*RowFilterMask | DROP_NOT_IN_MC_TABLE) : - (*RowFilterMask & ~(DROP_NOT_IN_MC_TABLE)); - *RowFilterMask = FilterMask & RX_BC_MC_OWN_MAC_A3 ? - (*RowFilterMask | DROP_ADDR3_OWN_MAC) : - (*RowFilterMask & ~(DROP_ADDR3_OWN_MAC)); - *RowFilterMask = FilterMask & RX_BC_MC_DIFF_BSSID_A3 ? - (*RowFilterMask | DROP_DIFF_BSSID_A3) : - (*RowFilterMask & ~(DROP_DIFF_BSSID_A3)); - *RowFilterMask = FilterMask & RX_BC_MC_DIFF_BSSID_A2 ? - (*RowFilterMask | DROP_DIFF_BSSID_A2) : - (*RowFilterMask & ~(DROP_DIFF_BSSID_A2)); - *RowFilterMask = FilterMask & RX_BCN_DIFF_BSSID ? - (*RowFilterMask | DROP_DIFF_BSSID_BCN) : - (*RowFilterMask & ~(DROP_DIFF_BSSID_BCN)); - *RowFilterMask = FilterMask & RX_CTRL_RSV ? - (*RowFilterMask | DROP_CTRL_RSV) : - (*RowFilterMask & ~(DROP_CTRL_RSV)); - *RowFilterMask = FilterMask & RX_CTS ? (*RowFilterMask | DROP_CTS) : - (*RowFilterMask & ~(DROP_CTS)); - *RowFilterMask = FilterMask & RX_RTS ? (*RowFilterMask | DROP_RTS) : - (*RowFilterMask & ~(DROP_RTS)); - *RowFilterMask = FilterMask & RX_DUPLICATE ? - (*RowFilterMask | DROP_DUPLICATE) : - (*RowFilterMask & ~(DROP_DUPLICATE)); - *RowFilterMask = FilterMask & RX_NOT_OWN_BSSID ? - (*RowFilterMask | DROP_NOT_MY_BSSID) : - (*RowFilterMask & ~(DROP_NOT_MY_BSSID)); - *RowFilterMask = FilterMask & RX_NOT_OWN_UCAST ? - (*RowFilterMask | DROP_NOT_UC2ME) : - (*RowFilterMask & ~(DROP_NOT_UC2ME)); - *RowFilterMask = FilterMask & RX_NOT_OWN_BTIM ? - (*RowFilterMask | DROP_DIFF_BSSID_BTIM) : - (*RowFilterMask & ~(DROP_DIFF_BSSID_BTIM)); - *RowFilterMask = FilterMask & RX_NDPA ? (*RowFilterMask | DROP_NDPA) : - (*RowFilterMask & ~(DROP_NDPA)); -} - -INT MtAsicSetRxFilter(RTMP_ADAPTER *pAd, MT_RX_FILTER_CTRL_T RxFilter) -{ - UINT32 Value = 0; - - if (RxFilter.bPromiscuous) { -#ifdef SNIFFER_MT7615 - - if (IS_MT7615(pAd)) - Value = DROP_FCS_ERROR_FRAME | RM_FRAME_REPORT_EN | - RX_UNWANTED_CTL_FRM; - else -#endif - Value = 0; /* RX_PROMISCUOUS_MODE; */ - } else { - /*disable frame report & monitor mode*/ - Value &= ~RX_PROMISCUOUS_MODE; - - if (RxFilter.bFrameReport) - Value |= RM_FRAME_REPORT_EN; - else - Value &= ~(RM_FRAME_REPORT_EN); - - /*enable drop filter by RxfilterMask*/ - RxFilterCfg2Row(RxFilter.filterMask, &Value); - } - - MAC_IO_WRITE32(pAd, RMAC_RFCR, Value); - MAC_IO_WRITE32(pAd, RMAC_RFCR1, 0); - return TRUE; -} - -INT32 MtAsicRxHeaderTransCtl(RTMP_ADAPTER *pAd, BOOLEAN En, BOOLEAN ChkBssid, - BOOLEAN InSVlan, BOOLEAN RmVlan, BOOLEAN SwPcP) -{ - UINT32 Value; - - MAC_IO_READ32(pAd, DMA_DCR0, &Value); - - if (En) { - Value |= RX_HD_TRANS_EN; - - if (ChkBssid) - Value |= RX_HDR_TRANS_CHK_BSSID; - else - Value &= ~RX_HDR_TRANS_CHK_BSSID; - - if (InSVlan) - Value |= RX_INS_VLAN; - else - Value &= ~RX_INS_VLAN; - - if (RmVlan) - Value |= RX_RM_VLAN; - else - Value &= ~RX_RM_VLAN; - - if (!SwPcP) - Value |= PCP_EQ_TID; - else - Value &= ~PCP_EQ_TID; - } else - Value &= ~RX_HD_TRANS_EN; - - MAC_IO_WRITE32(pAd, DMA_DCR0, Value); - return TRUE; -} - -INT32 MtAsicRxHeaderTaranBLCtl(RTMP_ADAPTER *pAd, UINT32 Index, BOOLEAN En, - UINT32 EthType) -{ - UINT32 Value, Value1; - - MAC_IO_READ32(pAd, DMA_DCR0, &Value); - - switch (Index) { - case ETBL_INDEX0: - if (En) { - Value |= ETBL0_EN; - MAC_IO_READ32(pAd, ETBLR0, &Value1); - Value1 &= ~ETBL0_MASK; - Value1 |= ETBL0(EthType); - MAC_IO_WRITE32(pAd, ETBLR0, Value1); - } else - Value &= ~ETBL0_EN; - - break; - - case ETBL_INDEX1: - if (En) { - Value |= ETBL1_EN; - MAC_IO_READ32(pAd, ETBLR0, &Value1); - Value1 &= ~ETBL1_MASK; - Value1 |= ETBL1(EthType); - MAC_IO_WRITE32(pAd, ETBLR0, Value1); - } else - Value &= ~ETBL1_EN; - - break; - - case ETBL_INDEX2: - if (En) { - Value |= ETBL2_EN; - MAC_IO_READ32(pAd, ETBLR1, &Value1); - Value1 &= ~ETBL2_MASK; - Value1 |= ETBL2(EthType); - MAC_IO_WRITE32(pAd, ETBLR1, Value1); - } else - Value &= ~ETBL2_EN; - - break; - - case ETBL_INDEX3: - if (En) { - Value |= ETBL3_EN; - MAC_IO_READ32(pAd, ETBLR1, &Value1); - Value1 &= ~ETBL3_MASK; - Value1 |= ETBL3(EthType); - MAC_IO_WRITE32(pAd, ETBLR1, Value1); - } else - Value &= ~ETBL3_EN; - - break; - - case ETBL_INDEX4: - if (En) { - Value |= ETBL4_EN; - MAC_IO_READ32(pAd, ETBLR2, &Value1); - Value1 &= ~ETBL4_MASK; - Value1 |= ETBL4(EthType); - MAC_IO_WRITE32(pAd, ETBLR2, Value1); - } else - Value &= ~ETBL4_EN; - - break; - - case ETBL_INDEX5: - if (En) { - Value |= ETBL5_EN; - MAC_IO_READ32(pAd, ETBLR2, &Value1); - Value1 &= ~ETBL5_MASK; - Value1 |= ETBL5(EthType); - MAC_IO_WRITE32(pAd, ETBLR2, Value1); - } else - Value &= ~ETBL5_EN; - - break; - - case ETBL_INDEX6: - if (En) { - Value |= ETBL6_EN; - MAC_IO_READ32(pAd, ETBLR3, &Value1); - Value1 &= ~ETBL6_MASK; - Value1 |= ETBL6(EthType); - MAC_IO_WRITE32(pAd, ETBLR3, Value1); - } else - Value &= ~ETBL6_EN; - - break; - - case ETBL_INDEX7: - if (En) { - Value |= ETBL7_EN; - MAC_IO_READ32(pAd, ETBLR3, &Value1); - Value1 &= ~ETBL7_MASK; - Value1 |= ETBL7(EthType); - MAC_IO_WRITE32(pAd, ETBLR3, Value1); - } else - Value &= ~ETBL7_EN; - - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown Index(%d)\n", __func__, Index)); - break; - } - - MAC_IO_WRITE32(pAd, DMA_DCR0, Value); - return TRUE; -} - -INT32 MtAsicUpdateBASessionByDriver(RTMP_ADAPTER *pAd, MT_BA_CTRL_T BaCtrl) -{ - struct wtbl_entry ent; - struct wtbl_2_struc *wtbl_2; - UINT32 range_mask = 0x7 << (BaCtrl.Tid * 3); - UINT32 reg, value; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR *ba_range = cap->ba_range; - - if (BaCtrl.BaSessionType == BA_SESSION_RECP) { - /* Reset BA SSN & Score Board Bitmap, for BA Receiptor */ - if (BaCtrl.isAdd) { - value = (BaCtrl.PeerAddr[0] | - (BaCtrl.PeerAddr[1] << 8) | - (BaCtrl.PeerAddr[2] << 16) | - (BaCtrl.PeerAddr[3] << 24)); - MAC_IO_WRITE32(pAd, BSCR0, value); - MAC_IO_READ32(pAd, BSCR1, &value); - value &= ~(BA_MAC_ADDR_47_32_MASK | RST_BA_TID_MASK | - RST_BA_SEL_MASK); - value |= BA_MAC_ADDR_47_32((BaCtrl.PeerAddr[4] | - (BaCtrl.PeerAddr[5] << 8))); - value |= (RST_BA_SEL(RST_BA_MAC_TID_MATCH) | - RST_BA_TID(BaCtrl.Tid) | START_RST_BA_SB); - MAC_IO_WRITE32(pAd, BSCR1, value); - } - } else { - os_zero_mem((UCHAR *)(&ent), sizeof(struct wtbl_entry)); - mt_wtbl_get_entry234(pAd, BaCtrl.Wcid, &ent); - wtbl_2 = &ent.wtbl_2; - - if (BaCtrl.isAdd) { - INT idx = 0; - - MtAsicSetMacTxRx(pAd, ASIC_MAC_TX, FALSE, 0); - - /* Clear WTBL2. SN: Direct Updating */ - switch (BaCtrl.Tid) { - case 0: - reg = ent.wtbl_addr[1] + - (4 * 2); /* WTBL2.DW2 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d2.word); - wtbl_2->wtbl_2_d2.field.tid_ac_0_sn = BaCtrl.Sn; - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d2.word); - break; - - case 1: - reg = ent.wtbl_addr[1] + - (4 * 2); /* WTBL2.DW2 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d2.word); - wtbl_2->wtbl_2_d2.field.tid_ac_1_sn = BaCtrl.Sn; - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d2.word); - break; - - case 2: - reg = ent.wtbl_addr[1] + - (4 * 2); /* WTBL2.DW2 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d2.word); - wtbl_2->wtbl_2_d2.field.tid_ac_2_sn_0 = - (BaCtrl.Sn & 0xff); - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d2.word); - reg = ent.wtbl_addr[1] + - (4 * 3); /* WTBL2.DW3 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d3.word); - wtbl_2->wtbl_2_d3.field.tid_ac_2_sn_9 = - ((BaCtrl.Sn & (0xf << 8)) >> 8); - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d3.word); - break; - - case 3: - reg = ent.wtbl_addr[1] + - (4 * 3); /* WTBL2.DW3 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d3.word); - wtbl_2->wtbl_2_d3.field.tid_ac_3_sn = BaCtrl.Sn; - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d3.word); - break; - - case 4: - reg = ent.wtbl_addr[1] + - (4 * 3); /* WTBL2.DW3 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d3.word); - wtbl_2->wtbl_2_d3.field.tid_4_sn = BaCtrl.Sn; - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d3.word); - break; - - case 5: - reg = ent.wtbl_addr[1] + - (4 * 3); /* WTBL2.DW3 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d3.word); - wtbl_2->wtbl_2_d3.field.tid_5_sn_0 = - (BaCtrl.Sn & 0xf); - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d3.word); - reg = ent.wtbl_addr[1] + - (4 * 4); /* WTBL2.DW4 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d4.word); - wtbl_2->wtbl_2_d4.field.tid_5_sn_5 = - ((BaCtrl.Sn & (0xff << 4)) >> 4); - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d4.word); - break; - - case 6: - reg = ent.wtbl_addr[1] + - (4 * 4); /* WTBL2.DW4 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d4.word); - wtbl_2->wtbl_2_d4.field.tid_6_sn = BaCtrl.Sn; - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d4.word); - break; - - case 7: - reg = ent.wtbl_addr[1] + - (4 * 4); /* WTBL2.DW4 */ - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d4.word); - wtbl_2->wtbl_2_d4.field.tid_7_sn = BaCtrl.Sn; - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d4.word); - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: unknown tid(%d)\n", __func__, - BaCtrl.Tid)); - break; - } - - MAC_IO_READ32(pAd, WTBL_OFF_WIUCR, &value); - value &= ~WLAN_IDX_MASK; - value |= WLAN_IDX(BaCtrl.Wcid); - value |= WTBL2_UPDATE_FLAG; - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, value); - MtAsicSetMacTxRx(pAd, ASIC_MAC_TX, TRUE, 0); - - /*get ba win size from range */ - while (ba_range[idx] < BaCtrl.BaWinSize) { - if (idx == 7) - break; - - idx++; - }; - - if (ba_range[idx] > BaCtrl.BaWinSize) - idx--; - - reg = ent.wtbl_addr[1] + (15 * 4); - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d15.word); - wtbl_2->wtbl_2_d15.field.ba_en |= 1 << BaCtrl.Tid; - wtbl_2->wtbl_2_d15.field.ba_win_size_tid &= - (~range_mask); - wtbl_2->wtbl_2_d15.field.ba_win_size_tid |= - (idx << (BaCtrl.Tid * 3)); - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d15.word); - } else { - reg = ent.wtbl_addr[1] + (15 * 4); - HW_IO_READ32(pAd, reg, &wtbl_2->wtbl_2_d15.word); - wtbl_2->wtbl_2_d15.field.ba_en &= (~(1 << BaCtrl.Tid)); - wtbl_2->wtbl_2_d15.field.ba_win_size_tid &= - (~range_mask); - HW_IO_WRITE32(pAd, reg, wtbl_2->wtbl_2_d15.word); - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): ent->wtbl_addr[1]=0x%x, val=0x%08x\n", - __func__, reg, wtbl_2->wtbl_2_d15.word)); - } - - return 0; -} - -INT32 MtAsicUpdateBASession(RTMP_ADAPTER *pAd, MT_BA_CTRL_T BaCtrl) -{ - return MtAsicUpdateBASessionByDriver(pAd, BaCtrl); -} - -VOID MtAsicSetRxGroup(RTMP_ADAPTER *pAd, UINT32 Port, UINT32 Group, - BOOLEAN Enable) -{ - UINT32 Value; - - if (Port == HIF_PORT) { - MCU_IO_READ32(pAd, RXINF, &Value); - - if (Enable) { - if (Group & RXS_GROUP1) - Value |= RXSH_GROUP1_EN; - - if (Group & RXS_GROUP2) - Value |= RXSH_GROUP2_EN; - - if (Group & RXS_GROUP3) - Value |= RXSH_GROUP3_EN; - } else { - if (Group & RXS_GROUP1) - Value &= ~RXSH_GROUP1_EN; - - if (Group & RXS_GROUP2) - Value &= ~RXSH_GROUP2_EN; - - if (Group & RXS_GROUP3) - Value &= ~RXSH_GROUP3_EN; - } - - MCU_IO_WRITE32(pAd, RXINF, Value); - } else if (Port == MCU_PORT) { - MAC_IO_READ32(pAd, DMA_DCR1, &Value); - - if (Enable) { - if (Group & RXS_GROUP1) - Value |= RXSM_GROUP1_EN; - - if (Group & RXS_GROUP2) - Value |= RXSM_GROUP2_EN; - - if (Group & RXS_GROUP3) - Value |= RXSM_GROUP3_EN; - } else { - if (Group & RXS_GROUP1) - Value &= ~RXSM_GROUP1_EN; - - if (Group & RXS_GROUP2) - Value &= ~RXSM_GROUP2_EN; - - if (Group & RXS_GROUP3) - Value &= ~RXSM_GROUP3_EN; - } - - MAC_IO_WRITE32(pAd, DMA_DCR1, Value); - } else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("illegal port (%d\n", Port)); -} - -INT MtAsicSetBAWinSizeRange(RTMP_ADAPTER *pAd) -{ - UINT32 mac_val; - UINT32 TxAggLimit; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR *ba_range = cap->ba_range; - /* A-MPDU BA WinSize control */ - MAC_IO_READ32(pAd, AGG_AWSCR, &mac_val); - mac_val &= ~WINSIZE0_MASK; - mac_val |= WINSIZE0(ba_range[0]); - mac_val &= ~WINSIZE1_MASK; - mac_val |= WINSIZE1(ba_range[1]); - mac_val &= ~WINSIZE2_MASK; - mac_val |= WINSIZE2(ba_range[2]); - mac_val &= ~WINSIZE3_MASK; - mac_val |= WINSIZE3(ba_range[3]); - MAC_IO_WRITE32(pAd, AGG_AWSCR, mac_val); - MAC_IO_READ32(pAd, AGG_AWSCR1, &mac_val); - mac_val &= ~WINSIZE4_MASK; - mac_val |= WINSIZE4(ba_range[4]); - mac_val &= ~WINSIZE5_MASK; - mac_val |= WINSIZE5(ba_range[5]); - mac_val &= ~WINSIZE6_MASK; - mac_val |= WINSIZE6(ba_range[6]); - mac_val &= ~WINSIZE7_MASK; - mac_val |= WINSIZE7(ba_range[7]); - MAC_IO_WRITE32(pAd, AGG_AWSCR1, mac_val); - /* A-MPDU Agg limit control */ - TxAggLimit = cap->TxAggLimit; - MAC_IO_READ32(pAd, AGG_AALCR, &mac_val); - mac_val &= ~AC0_AGG_LIMIT_MASK; - mac_val |= AC0_AGG_LIMIT(TxAggLimit); - mac_val &= ~AC1_AGG_LIMIT_MASK; - mac_val |= AC1_AGG_LIMIT(TxAggLimit); - mac_val &= ~AC2_AGG_LIMIT_MASK; - mac_val |= AC2_AGG_LIMIT(TxAggLimit); - mac_val &= ~AC3_AGG_LIMIT_MASK; - mac_val |= AC3_AGG_LIMIT(TxAggLimit); - MAC_IO_WRITE32(pAd, AGG_AALCR, mac_val); - MAC_IO_READ32(pAd, AGG_AALCR1, &mac_val); - mac_val &= ~AC10_AGG_LIMIT_MASK; - mac_val |= AC10_AGG_LIMIT(TxAggLimit); - mac_val &= ~AC11_AGG_LIMIT_MASK; - mac_val |= AC11_AGG_LIMIT(TxAggLimit); - mac_val &= ~AC12_AGG_LIMIT_MASK; - mac_val |= AC12_AGG_LIMIT(TxAggLimit); - mac_val &= ~AC13_AGG_LIMIT_MASK; - mac_val |= AC13_AGG_LIMIT(TxAggLimit); - MAC_IO_WRITE32(pAd, AGG_AALCR1, mac_val); - return TRUE; -} -VOID MtAsicSetBARTxCntLimit(RTMP_ADAPTER *pAd, BOOLEAN Enable, UINT32 Count) -{ - UINT32 Value; - - MAC_IO_READ32(pAd, AGG_MRCR, &Value); - - if (Enable) { - Value &= ~BAR_TX_CNT_LIMIT_MASK; - Value |= BAR_TX_CNT_LIMIT(Count); - } else { - Value &= ~BAR_TX_CNT_LIMIT_MASK; - Value |= BAR_TX_CNT_LIMIT(0); - } - -#ifdef VENDOR_FEATURE7_SUPPORT -#ifdef CONFIG_AP_SUPPORT - static VOID MtAsicSetRTSRetryCnt(RTMP_ADAPTER * pAd) - { - UINT32 Value; - UINT32 Count = pAd->ApCfg.rts_retry_cnt; - - if (Count != 0) { - /* TODO: RTY_MODE0/1 ?? */ - MAC_IO_READ32(pAd, AGG_MRCR, &Value); - Value &= ~RTS_RTY_CNT_LIMIT_MASK; - Value |= RTS_RTY_CNT_LIMIT(Count); - MAC_IO_WRITE32(pAd, AGG_MRCR, Value); - } - } -#endif /* CONFIG_AP_SUPPORT */ -#endif -#ifndef MAC_INIT_OFFLOAD - /* - * Init TxD short format template which will copy by PSE-Client to LMAC - */ - static INT MtAsicSetTmacInfoTemplate(RTMP_ADAPTER * pAd) - { - UINT32 dw[5]; - TMAC_TXD_2 *dw2 = (TMAC_TXD_2 *)(&dw[0]); - TMAC_TXD_3 *dw3 = (TMAC_TXD_3 *)(&dw[1]); - TMAC_TXD_5 *dw5 = (TMAC_TXD_5 *)(&dw[3]); - - os_zero_mem((UCHAR *)(&dw[0]), sizeof(dw)); - dw2->HtcExist = 0; - dw2->Frag = 0; - dw2->MaxTxTime = 0; - dw2->FixRate = 0; - dw3->RemainTxCnt = MT_TX_SHORT_RETRY; - dw3->SnVld = 0; - dw3->PnVld = 0; - dw5->PktId = PID_DATA_AMPDU; - dw5->TxSFmt = 0; - dw5->TxS2Host = 0; - dw5->BarSsnCtrl = 0; /* HW */ -#if defined(CONFIG_STA_SUPPORT) && defined(CONFIG_PM_BIT_HW_MODE) - dw5->PwrMgmt = TMI_PM_BIT_CFG_BY_HW; -#else - dw5->PwrMgmt = TMI_PM_BIT_CFG_BY_SW; -#endif /* CONFIG_STA_SUPPORT && CONFIG_PM_BIT_HW_MODE */ -#ifdef RTMP_MAC_PCI - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, 0x80080000); -#endif /* RTMP_PCI_SUPPORT */ - /* For short format */ - /* TODO: shiang-usw, for windows, need to change the CR mapping table for 0xc0000 to 0x800c0000 */ - HW_IO_WRITE32(pAd, 0xc0040, dw[0]); - HW_IO_WRITE32(pAd, 0xc0044, dw[1]); - HW_IO_WRITE32(pAd, 0xc0048, dw[2]); - HW_IO_WRITE32(pAd, 0xc004c, dw[3]); - HW_IO_WRITE32(pAd, 0xc0050, dw[4]); -#ifdef RTMP_MAC_PCI - /* After change the Tx Padding CR of PCI-E Client, we need to re-map for PSE region */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, MT_PSE_BASE_ADDR); -#endif /* RTMP_PCI_SUPPORT */ - return TRUE; - } -#endif - - INT MtAsicWaitMacTxRxIdle(RTMP_ADAPTER * pAd) - { - return TRUE; - } - - VOID MtAsicUpdateRtsThld(PRTMP_ADAPTER pAd, - MT_RTS_THRESHOLD_T * rts_thrld) - { - UINT32 Value = 0; - /* Config ASIC RTS threshold register*/ - MAC_IO_READ32(pAd, AGG_PCR1, &Value); - Value &= ~RTS_THRESHOLD_MASK; - Value &= ~RTS_PKT_NUM_THRESHOLD_MASK; - Value |= RTS_THRESHOLD(rts_thrld->pkt_len_thld); - Value |= RTS_PKT_NUM_THRESHOLD(rts_thrld->pkt_num_thld); - MAC_IO_WRITE32(pAd, AGG_PCR1, Value); - } - - /* - * ======================================================================== - * - * Routine Description: - * Set MAC register value according operation mode. - * OperationMode AND bNonGFExist are for MM and GF Proteciton. - * If MM or GF mask is not set, those passing argument doesn't not take effect. - * - * Operation mode meaning: - * = 0 : Pure HT, no preotection. - * = 0x01; there may be non-HT devices in both the control and extension channel, protection is optional in BSS. - * = 0x10: No Transmission in 40M is protected. - * = 0x11: Transmission in both 40M and 20M shall be protected - * if (bNonGFExist) - * we should choose not to use GF. But still set correct ASIC registers. - * ======================================================================== - */ - VOID MtAsicUpdateProtect(IN PRTMP_ADAPTER pAd, - IN MT_PROTECT_CTRL_T * Protect) - { - UINT32 val = 0; - - MAC_IO_READ32(pAd, AGG_PCR, &val); - /* B/G Protection */ - val &= ~ERP_PROTECTION_MASK; - val |= ERP_PROTECTION(Protect->erp_mask); - /* RIFS Protection */ - val &= ~RIFS_PROTECTION; - - if (Protect->rifs) { - /* TX_RIFS_EN of RCR is enable, - * HW will switch to Long NAV protection, - * ignoring PROTECTION_MODE bit - */ - val |= RIFS_PROTECTION; - } - - /* NAV Protection */ - if (Protect->long_nav) - val &= ~PROTECTION_MODE; - else - val |= PROTECTION_MODE; - - /* Green Field Protectio */ - val &= ~GF_PROTECTION; - - if (Protect->gf) - val |= GF_PROTECTION; - - /* Other HT Protection */ - val &= ~(MM_PROTECTION | BW40_PROTECTION | BW80_PROTECTION | - BW160_PROTECTION); - - if (Protect->mix_mode) - val |= MM_PROTECTION; - - if (Protect->bw40) - val |= BW40_PROTECTION; - - if (Protect->bw80) - val |= BW80_PROTECTION; - - if (Protect->bw160) - val |= BW160_PROTECTION; - - MAC_IO_WRITE32(pAd, AGG_PCR, val); - } - - /** @} */ - /** @} */ - - /* - * ======================================================================== - * Routine Description: - * Set/reset MAC registers according to bPiggyBack parameter - * - * Arguments: - * pAd - Adapter pointer - * bPiggyBack - Enable / Disable Piggy-Back - * - * Return Value: - * None - * - * ======================================================================== - */ - VOID MtAsicSetPiggyBack(RTMP_ADAPTER * pAd, BOOLEAN bPiggyBack) - { - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, - __LINE__)); - } - -#define INT_TIMER_EN_PRE_TBTT 0x1 -#define INT_TIMER_EN_GP_TIMER 0x2 - static INT SetIntTimerEn(RTMP_ADAPTER * pAd, BOOLEAN enable, - UINT32 type, UINT32 timeout) - { - /* UINT32 mask, time_mask; */ - /* UINT32 Value; */ - return 0; - } - - /** - * @addtogroup ap - * @{ - * @name AP feature HW HAL - * @{ - */ - INT MtAsicSetPreTbtt(struct _RTMP_ADAPTER * pAd, BOOLEAN bEnable, - UCHAR HwBssidIdx) - { - UINT32 timeout = 0, bitmask = 0; - - ASSERT(HwBssidIdx <= 3); - bitmask = 0xff << (HwBssidIdx * 8); - - if (bEnable == TRUE) { - /* - * each HW BSSID has its own PreTBTT interval, - * unit is 64us, 0x00~0xff is configurable. - * Base on RTMP chip experience, - * Pre-TBTT is 6ms before TBTT interrupt. 1~10 ms is reasonable. - */ - MAC_IO_READ32(pAd, LPON_PISR, &timeout); - timeout &= (~bitmask); - timeout |= (0x50 << (HwBssidIdx * 8)); - MAC_IO_WRITE32(pAd, LPON_PISR, timeout); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): HwBssidIdx=%d, PreTBTT timeout = 0x%x\n", - __func__, HwBssidIdx, timeout)); - } else { - MAC_IO_READ32(pAd, LPON_PISR, &timeout); - timeout &= (~bitmask); - MAC_IO_WRITE32(pAd, LPON_PISR, timeout); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): HwBssidIdx=%d, PreTBTT timeout = 0x%x\n", - __func__, HwBssidIdx, timeout)); - } - - return TRUE; - } - -#ifdef MAC_APCLI_SUPPORT - /* - * ========================================================================== - * Description: - * Set BSSID of Root AP - * - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ - VOID MtAsicSetApCliBssid(IN PRTMP_ADAPTER pAd, IN PUCHAR pBssid, - IN UCHAR index) - { - UINT32 val; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Set BSSID=%02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, pBssid[0], pBssid[1], pBssid[2], pBssid[3], - pBssid[4], pBssid[5])); - val = (UINT32)((pBssid[0]) | (UINT32)(pBssid[1] << 8) | - (UINT32)(pBssid[2] << 16) | - (UINT32)(pBssid[3] << 24)); - MAC_IO_WRITE32(pAd, RMAC_CB1R0, val); - val = (UINT32)(pBssid[4]) | (UINT32)(pBssid[5] << 8) | - (1 << 16); - MAC_IO_WRITE32(pAd, RMAC_CB1R1, val); - -#endif /* MAC_APCLI_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT - VOID MtAsicSetMbssMode(RTMP_ADAPTER * pAd, UCHAR NumOfMacs) - { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): No Function for HIF_MT!\n", __func__, - __LINE__)); - } -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - INT MtAsicSetReptFuncEnableByDriver(RTMP_ADAPTER * pAd, - BOOLEAN bEnable) - { - RMAC_MORE_STRUC rmac_more; - - MAC_IO_READ32(pAd, RMAC_MORE, &rmac_more.word); - - if (bEnable == 0) - rmac_more.field.muar_mode_sel = 0; - else - rmac_more.field.muar_mode_sel = 1; - - MAC_IO_WRITE32(pAd, RMAC_MORE, rmac_more.word); - return TRUE; - } - - VOID MtAsicInsertRepeaterEntry(IN PRTMP_ADAPTER pAd, - IN UCHAR CliIdx, IN PUCHAR pAddr) - { - UCHAR tempMAC[MAC_ADDR_LEN]; - RMAC_MAR0_STRUC rmac_mcbcs0; - RMAC_MAR1_STRUC rmac_mcbcs1; - - COPY_MAC_ADDR(tempMAC, pAddr); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n%s %02x:%02x:%02x:%02x:%02x:%02x-%02x\n", - __func__, tempMAC[0], tempMAC[1], tempMAC[2], - tempMAC[3], tempMAC[4], tempMAC[5], CliIdx)); - os_zero_mem(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - rmac_mcbcs0.addr_31_0 = tempMAC[0] + (tempMAC[1] << 8) + - (tempMAC[2] << 16) + - (tempMAC[3] << 24); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - os_zero_mem(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.addr_39_32 = tempMAC[4]; - rmac_mcbcs1.field.addr_47_40 = tempMAC[5]; - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - rmac_mcbcs1.field.multicast_addr_index = CliIdx; - MAC_IO_WRITE32(pAd, RMAC_MAR1, rmac_mcbcs1.word); - } - - VOID MtAsicRemoveRepeaterEntry(RTMP_ADAPTER * pAd, UCHAR CliIdx) - { - RMAC_MAR0_STRUC rmac_mcbcs0; - RMAC_MAR1_STRUC rmac_mcbcs1; - /* TODO: Carter, not finish yet! */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_WARN, - (" %s.\n", __func__)); - os_zero_mem(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - os_zero_mem(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - - if (CliIdx <= 15) - rmac_mcbcs1.field.multicast_addr_index = - CliIdx; /* start from idx 0 */ - - MAC_IO_WRITE32( - pAd, RMAC_MAR1, - rmac_mcbcs1.word); /* clear client entry first. */ - os_zero_mem(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - os_zero_mem(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - - if (CliIdx <= 15) - rmac_mcbcs1.field.multicast_addr_index = - 0x10 + CliIdx; /* start from idx 16 */ - - MAC_IO_WRITE32( - pAd, RMAC_MAR1, - rmac_mcbcs1.word); /* clear rootap entry. */ - } - -#ifdef CONFIG_WTBL_TLV_MODE - VOID MtAsicInsertRepeaterRootEntryByWtblTlv( - IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, IN UCHAR * pAddr, - IN UCHAR ReptCliIdx) - { - NDIS_STATUS Status = NDIS_STATUS_SUCCESS; - UCHAR *pTlvBuffer = NULL; - UCHAR *pTempBuffer = NULL; - UINT32 u4TotalTlvLen = 0; - UCHAR ucTotalTlvNumber = 0; - CMD_WTBL_GENERIC_T rWtblGeneric = { 0 }; - CMD_WTBL_RX_T rWtblRx = { 0 }; - P_CMD_WTBL_GENERIC_T prWtblGeneric = NULL; - P_CMD_WTBL_RX_T prWtblRx = NULL; - RMAC_MAR0_STRUC rmac_mcbcs0; - RMAC_MAR1_STRUC rmac_mcbcs1; - /* Allocate TLV msg */ - Status = os_alloc_mem(pAd, (UCHAR **)&pTlvBuffer, - MAX_BUF_SIZE_OF_WTBL_INFO); - - if ((Status != NDIS_STATUS_SUCCESS) || - (pTlvBuffer == NULL)) - goto error; - - pTempBuffer = pTlvBuffer; - u4TotalTlvLen = 0; - ucTotalTlvNumber = 0; - /* Query Generic and Rx structure data */ - pTempBuffer = pTlvAppend(pTempBuffer, WTBL_GENERIC, - sizeof(CMD_WTBL_GENERIC_T), - &rWtblGeneric, &u4TotalTlvLen, - &ucTotalTlvNumber); - pTempBuffer = - pTlvAppend(pTempBuffer, WTBL_RX, - sizeof(CMD_WTBL_RX_T), &rWtblRx, - &u4TotalTlvLen, &ucTotalTlvNumber); - CmdExtWtblUpdate(pAd, Wcid, QUERY_WTBL, pTlvBuffer, - u4TotalTlvLen); - pTempBuffer = pTlvBuffer; - prWtblGeneric = (P_CMD_WTBL_GENERIC_T)pTempBuffer; - pTempBuffer += sizeof(CMD_WTBL_GENERIC_T); - prWtblRx = (P_CMD_WTBL_RX_T)pTempBuffer; - /* Set MuarIndex and Rca1 */ - prWtblGeneric->ucMUARIndex = 0x20 + ReptCliIdx; - prWtblRx->ucRca1 = 1; - CmdExtWtblUpdate(pAd, Wcid, SET_WTBL, pTlvBuffer, - u4TotalTlvLen); - - /* Free TLV msg */ - if (pTlvBuffer) - os_free_mem(pTlvBuffer); - - /* Query debug information */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d):Write WTBL 1 DW0 Value:0x%x\n", - __func__, ReptCliIdx, - WtblDwQuery(pAd, Wcid, 1, 0))); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d):Write WTBL 1 DW1 Value:0x%x\n", - __func__, ReptCliIdx, - WtblDwQuery(pAd, Wcid, 1, 1))); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d):Write WTBL 1 DW2 Value:0x%x\n", - __func__, ReptCliIdx, - WtblDwQuery(pAd, Wcid, 1, 2))); - /* Set RMAC_MAR0/1 */ - NdisZeroMemory(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - rmac_mcbcs0.addr_31_0 = pAddr[0] + (pAddr[1] << 8) + - (pAddr[2] << 16) + - (pAddr[3] << 24); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - NdisZeroMemory(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.addr_39_32 = pAddr[4]; - rmac_mcbcs1.field.addr_47_40 = pAddr[5]; - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - - if (ReptCliIdx <= 15) - rmac_mcbcs1.field.multicast_addr_index = - 0x10 + - ReptCliIdx; /* start from idx 16 */ - - MAC_IO_WRITE32(pAd, RMAC_MAR1, rmac_mcbcs1.word); - error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(Ret = %d)\n", __func__, Status)); - } -#else - VOID MtAsicInsertRepeaterRootEntryByDriver(IN PRTMP_ADAPTER pAd, - IN UCHAR Wcid, - IN UCHAR * pAddr, - IN UCHAR ReptCliIdx) - { - struct rtmp_mac_ctrl *wtbl_ctrl = &pAd->mac_ctrl; - struct wtbl_entry tb_entry; - union WTBL_1_DW0 *dw0 = (union WTBL_1_DW0 *)&tb_entry - .wtbl_1.wtbl_1_d0.word; - union WTBL_1_DW1 *dw1 = (union WTBL_1_DW1 *)&tb_entry - .wtbl_1.wtbl_1_d1.word; - union WTBL_1_DW2 *dw2 = (union WTBL_1_DW2 *)&tb_entry - .wtbl_1.wtbl_1_d2.word; - RMAC_MAR0_STRUC rmac_mcbcs0; - RMAC_MAR1_STRUC rmac_mcbcs1; - STA_TR_ENTRY *tr_entry; - - tr_entry = &pAd->MacTab.tr_entry[Wcid]; - tb_entry.wtbl_addr[0] = - wtbl_ctrl->wtbl_base_addr[0] + - Wcid * wtbl_ctrl->wtbl_entry_size[0]; - HW_IO_READ32(pAd, tb_entry.wtbl_addr[0], - &tb_entry.wtbl_1.wtbl_1_d0.word); - HW_IO_READ32(pAd, tb_entry.wtbl_addr[0] + 4, - &tb_entry.wtbl_1.wtbl_1_d1.word); - HW_IO_READ32(pAd, tb_entry.wtbl_addr[0] + 8, - &tb_entry.wtbl_1.wtbl_1_d2.word); - dw0->field.wm = 0; - dw0->field.muar_idx = 0x20 + ReptCliIdx; - dw0->field.rc_a1 = 1; - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0], dw0->word); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d):Write WTBL 1 Addr:0x%x, Value:0x%x\n", - __func__, ReptCliIdx, tb_entry.wtbl_addr[0], - dw0->word)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d):Write WTBL 1 Addr:0x%x, Value:0x%x\n", - __func__, ReptCliIdx, - tb_entry.wtbl_addr[0] + 4, dw1->word)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d):Write WTBL 1 Addr:0x%x, Value:0x%x\n", - __func__, ReptCliIdx, - tb_entry.wtbl_addr[0] + 8, dw2->word)); - os_zero_mem(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - rmac_mcbcs0.addr_31_0 = pAddr[0] + (pAddr[1] << 8) + - (pAddr[2] << 16) + - (pAddr[3] << 24); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - os_zero_mem(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.addr_39_32 = pAddr[4]; - rmac_mcbcs1.field.addr_47_40 = pAddr[5]; - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - - if (ReptCliIdx <= 15) - rmac_mcbcs1.field.multicast_addr_index = - 0x10 + - ReptCliIdx; /* start from idx 16 */ - - MAC_IO_WRITE32(pAd, RMAC_MAR1, rmac_mcbcs1.word); - } -#endif /* CONFIG_WTBL_TLV_MODE */ - - VOID MtAsicInsertRepeaterRootEntry(IN PRTMP_ADAPTER pAd, - IN UCHAR Wcid, - IN UCHAR * pAddr, - IN UCHAR ReptCliIdx) - { -#ifdef CONFIG_WTBL_TLV_MODE - MtAsicInsertRepeaterRootEntryByWtblTlv(pAd, Wcid, pAddr, ReptCliIdx)); -#else - MtAsicInsertRepeaterRootEntryByDriver(pAd, Wcid, pAddr, - ReptCliIdx); -#endif /* CONFIG_WTBL_TLV_MODE */ - } - -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ - - BOOLEAN MtAsicSetBmcQCR(IN struct _RTMP_ADAPTER * pAd, - IN UCHAR Operation, - IN UCHAR CrReadWrite, - IN UCHAR HwBssidIdx, IN UINT32 apidx, - IN OUT UINT32 * pcr_val) - { - UINT32 cr_base = 0; - UINT32 cr_val = 0; - UCHAR fcnt = 0; - BOOLEAN result = FALSE; - - switch (Operation) { - case BMC_FLUSH: { - cr_base = ARB_BMCQCR1; - - if (HwBssidIdx > 0) - cr_val = 1 << HwBssidIdx; - else - cr_val = *pcr_val; - - MAC_IO_WRITE32(pAd, cr_base, cr_val); - - /* check flush result */ - for (fcnt = 0; fcnt < 100; fcnt++) { - MAC_IO_READ32(pAd, cr_base, &cr_val); - - if (cr_val == 0) - break; - } - - *pcr_val = cr_val; - - if (fcnt == 100) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: flush take too long, flush cnt=%d\n", - __func__, fcnt)); - return result; - } - } break; - - case BMC_ENABLE: { - cr_base = ARB_BMCQCR0; - - if (HwBssidIdx > 0) - cr_val = 1 << HwBssidIdx; - else - cr_val = *pcr_val; - - MAC_IO_WRITE32(pAd, cr_base, cr_val); - } break; - - case BMC_CNT_UPDATE: { - if (HwBssidIdx > 0) - cr_base = ARB_BMCQCR2; - else { - if (apidx <= 4) - cr_base = ARB_BMCQCR2; - else if ((apidx >= 5) && (apidx <= 12)) - cr_base = ARB_BMCQCR3; - else if ((apidx >= 13) && (apidx <= 15)) - cr_base = ARB_BMCQCR4; - else { - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: apidx(%d) not support\n", - __func__, apidx)); - return result; - } - } - - if (CrReadWrite == CR_READ) { - MAC_IO_READ32(pAd, cr_base, &cr_val); - *pcr_val = cr_val; - } else if (CrReadWrite == CR_WRITE) { - cr_val = 0x01; /* add 1 to cnt. */ - - if (HwBssidIdx > 0) - MAC_IO_WRITE32( - pAd, cr_base, - (cr_val - << ((HwBssidIdx)*4))); - else { - if (apidx == 0) - MAC_IO_WRITE32(pAd, - cr_base, - cr_val); - else if (apidx >= 1 && - apidx <= 4) - MAC_IO_WRITE32( - pAd, cr_base, - (cr_val - << (16 + - ((apidx - - 1) * - 4)))); - else if (apidx >= 5 && - apidx <= 12) - MAC_IO_WRITE32( - pAd, cr_base, - (cr_val - << ((apidx - - 5) * - 4))); - else if (apidx >= 13 && - apidx <= 15) - MAC_IO_WRITE32( - pAd, cr_base, - (cr_val - << ((apidx - - 13) * - 4))); - } - } - } break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s(): Operation Error (%d)\n", - __func__, Operation)); - return result; - } - - result = TRUE; - return result; - } - - BOOLEAN MtAsicSetBcnQCR(IN struct _RTMP_ADAPTER * pAd, - IN UCHAR Operation, IN UCHAR HwBssidIdx, - IN UINT32 apidx) - { - UINT32 cr_base = 0; - UINT32 cr_val = 0, temp = 0; - UINT16 fcnt = 0; - BOOLEAN result = FALSE; - - switch (Operation) { - case BCN_FLUSH: { - cr_base = ARB_BCNQCR1; - - if (HwBssidIdx == 0) { - if (apidx > 0) - cr_val = cr_val | - (1 << (apidx + 15)); - else - cr_val = 1; - } else if (HwBssidIdx > 0) - cr_val = 1 << HwBssidIdx; - - MAC_IO_WRITE32(pAd, cr_base, cr_val); - - while (1) { - /* check bcn_flush cr status */ - MAC_IO_READ32(pAd, cr_base, &temp); - - if (temp & cr_val) { - fcnt++; - os_msec_delay(1); - - if (fcnt > 1000) { - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("==> Apidx = %x, flush bcnQ too long!!\n", - apidx)); - return result; - } - } else - break; - } - } break; - - case BCN_ENABLE: { - cr_base = ARB_BCNQCR0; - - if (HwBssidIdx == 0) { - if (apidx > 0) - cr_val = cr_val | - (1 << (apidx + 15)); - else - cr_val = 1; - } else if (HwBssidIdx > 0) - cr_val = 1 << HwBssidIdx; - - MAC_IO_WRITE32(pAd, cr_base, cr_val); - } break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s(): Operation Error (%d)\n", - __func__, Operation)); - return result; - } - - result = TRUE; - return result; - } - - typedef struct _SYNC_MODE_CR_TABLE_T { - UINT32 u4ArbOpModeCR; - UINT32 u4ArbAifsCR; - UINT32 u4ArbCwminCR; - UINT32 u4LponMacTimerCr; - UINT32 u4LponTbttCtrlCR; - UINT32 u4LponPreTbttTime; /* set pretbtt time */ - UINT32 u4LponSyncModeCR; /* sync mode CR*/ - UINT32 u4IntEnableCR; - } SYNC_MODE_CR_TABLE_T, *PSYNC_MODE_CR_TABLE_T; - - static SYNC_MODE_CR_TABLE_T - g_arDisableSyncModeMapTable[HW_BSSID_MAX] = { - /*WMM cr set band0 first, change it when is checked it link to Band1. */ - { ARB_SCR, ARB_AIFSR0, ARB_ACCWIR1, LPON_MPTCR1, - LPON_T0TPCR, LPON_PISR, LPON_T0CR, HWIER3 }, - { ARB_SCR, ARB_AIFSR0, ARB_ACCWIR1, LPON_MPTCR1, - LPON_T1TPCR, LPON_PISR, LPON_T1CR, HWIER0 }, - { ARB_SCR, ARB_AIFSR0, ARB_ACCWIR1, LPON_MPTCR3, - LPON_T2TPCR, LPON_PISR, LPON_T2CR, HWIER0 }, - { ARB_SCR, ARB_AIFSR0, ARB_ACCWIR1, LPON_MPTCR3, - LPON_T3TPCR, LPON_PISR, LPON_T3CR, HWIER0 }, - }; - - /* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ - VOID MtAsicDisableSyncByDriver(RTMP_ADAPTER * pAd, - UCHAR HWBssidIdx) - { - SYNC_MODE_CR_TABLE_T cr_set = { 0 }; - UINT32 value = 0; - - if (HWBssidIdx > HW_BSSID_MAX) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("--->%s(): HW OmacIdx:%x passed in is not correct\n", - __func__, HWBssidIdx)); - return; - } - - cr_set = g_arDisableSyncModeMapTable[HWBssidIdx]; - - /*1. disable hif interrupt pin*/ - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - MAC_IO_READ32(pAd, cr_set.u4IntEnableCR, - &value); - - switch (HWBssidIdx) { - case HW_BSSID_0: - value &= ~HWIER3_TBTT0; - value &= ~HWIER3_PRETBTT0; - break; - - case HW_BSSID_1: - value &= ~HWIER0_TBTT1; - value &= ~HWIER0_PRETBTT1; - break; - - case HW_BSSID_2: - value &= ~HWIER0_TBTT2; - value &= ~HWIER0_PRETBTT2; - break; - - case HW_BSSID_3: - value &= ~HWIER0_TBTT3; - value &= ~HWIER0_PRETBTT3; - break; - - default: - ASSERT(HWBssidIdx < HW_BSSID_MAX); - break; - } - - MAC_IO_WRITE32(pAd, cr_set.u4IntEnableCR, - value); - } - - /*2. disable BeaconPeriodEn */ - MAC_IO_READ32(pAd, cr_set.u4LponTbttCtrlCR, &value); - value &= ~TBTTn_CAL_EN; - MAC_IO_WRITE32(pAd, cr_set.u4LponTbttCtrlCR, value); - /*3. disable MPTCR pin*/ - /*NOTE: disable is write another CR at the same bit to disable. */ - value = 0; - value |= (TBTT_TIMEUP_EN | TBTT_PERIOD_TIMER_EN | - PRETBTT_TIMEUP_EN | PRETBTT_INT_EN); - - if ((HWBssidIdx == HW_BSSID_1) || - (HWBssidIdx == HW_BSSID_3)) - value = (value << 8); - - MAC_IO_WRITE32(pAd, cr_set.u4LponMacTimerCr, value); - /*4. recover BCN AIFS, CWmin, and HW TSF sync mode.*/ - MAC_IO_READ32(pAd, cr_set.u4LponSyncModeCR, &value); - value = value & TSF_TIMER_HW_MODE_FULL; - MAC_IO_WRITE32(pAd, cr_set.u4LponSyncModeCR, value); - MAC_IO_READ32(pAd, cr_set.u4ArbAifsCR, &value); - value &= ~ARB_AIFSR1_BCN_AIFS_MASK; - value |= ARB_AIFSR1_BCN_AIFS_HW_DEFAULT; - MAC_IO_WRITE32(pAd, cr_set.u4ArbAifsCR, value); - MAC_IO_READ32(pAd, cr_set.u4ArbCwminCR, &value); - value &= ~ARB_ACCWIR1_BCN_CWMIN_MASK; - value |= ARB_ACCWIR1_BCN_CWMIN_HW_DEFAULT; - MAC_IO_WRITE32(pAd, cr_set.u4ArbCwminCR, value); - /*5. set ARB OPMODE */ - MAC_IO_READ32(pAd, cr_set.u4ArbOpModeCR, &value); - value &= ~(MT_ARB_SCR_OPMODE_MASK - << (HWBssidIdx * 2)); /* clean opmode */ - MAC_IO_WRITE32(pAd, cr_set.u4ArbOpModeCR, value); - } - - static SYNC_MODE_CR_TABLE_T - g_arEnableSyncModeMapTable[HW_BSSID_MAX] = { - /*WMM cr set band0 first, change it when is checked it link to Band1. */ - { ARB_SCR, ARB_AIFSR0, ARB_ACCWIR1, LPON_MPTCR0, - LPON_T0TPCR, LPON_PISR, LPON_T0CR, HWIER3 }, - { ARB_SCR, ARB_AIFSR0, ARB_ACCWIR1, LPON_MPTCR0, - LPON_T1TPCR, LPON_PISR, LPON_T1CR, HWIER0 }, - { ARB_SCR, ARB_AIFSR0, ARB_ACCWIR1, LPON_MPTCR2, - LPON_T2TPCR, LPON_PISR, LPON_T2CR, HWIER0 }, - { ARB_SCR, ARB_AIFSR0, ARB_ACCWIR1, LPON_MPTCR2, - LPON_T3TPCR, LPON_PISR, LPON_T3CR, HWIER0 }, - }; - - VOID MtAsicEnableBssSyncByDriver(RTMP_ADAPTER * pAd, - USHORT BeaconPeriod, - UCHAR HWBssidIdx, UCHAR OPMode) - { - SYNC_MODE_CR_TABLE_T cr_set = { 0 }; - UINT32 value = 0; - - if (HWBssidIdx > HW_BSSID_MAX) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("--->%s(): HW OmacIdx:%x passed in is not correct\n", - __func__, HWBssidIdx)); - return; - } - - cr_set = g_arEnableSyncModeMapTable[HWBssidIdx]; - /*1. set ARB OPMODE */ - MAC_IO_READ32(pAd, cr_set.u4ArbOpModeCR, &value); - - if (OPMode == OPMODE_AP) { - value |= (MT_ARB_SCR_BM_CTRL | - MT_ARB_SCR_BCN_CTRL | - MT_ARB_SCR_BCN_EMPTY); - } - - value |= (OPMode << (HWBssidIdx * 2)); - MAC_IO_WRITE32(pAd, cr_set.u4ArbOpModeCR, value); - if (OPMode == OPMODE_AP) { - MAC_IO_READ32(pAd, cr_set.u4LponSyncModeCR, - &value); - value = value | TSF_TIMER_HW_MODE_TICK_ONLY; - MAC_IO_WRITE32(pAd, cr_set.u4LponSyncModeCR, - value); - } - - /*3. set Pretbtt time. */ - MAC_IO_READ32(pAd, cr_set.u4LponPreTbttTime, &value); - value |= DEFAULT_PRETBTT_INTERVAL_IN_MS - << (HWBssidIdx * 8); - MAC_IO_WRITE32(pAd, cr_set.u4LponPreTbttTime, value); - /*4. set MPTCR */ - value = 0; - value |= (TBTT_TIMEUP_EN | TBTT_PERIOD_TIMER_EN | - PRETBTT_TIMEUP_EN | PRETBTT_INT_EN); - - if ((HWBssidIdx == HW_BSSID_1) || - (HWBssidIdx == HW_BSSID_3)) - value = (value << 8); - - MAC_IO_WRITE32(pAd, cr_set.u4LponMacTimerCr, value); - /*5. set BeaconPeriod */ - value = 0; - { - value |= BEACONPERIODn(BeaconPeriod); - } - - value |= TBTTn_CAL_EN; - MAC_IO_WRITE32(pAd, cr_set.u4LponTbttCtrlCR, value); -#ifndef BCN_OFFLOAD_SUPPORT - - /*6. enable HOST interrupt pin.*/ - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - MAC_IO_READ32(pAd, cr_set.u4IntEnableCR, - &value); - - switch (HWBssidIdx) { - case HW_BSSID_0: - value |= HWIER3_TBTT0; - value |= HWIER3_PRETBTT0; - break; - - case HW_BSSID_1: - value |= HWIER0_TBTT1; - value |= HWIER0_PRETBTT1; - break; - - case HW_BSSID_2: - value |= HWIER0_TBTT2; - value |= HWIER0_PRETBTT2; - break; - - case HW_BSSID_3: - value |= HWIER0_TBTT3; - value |= HWIER0_PRETBTT3; - break; - - default: - ASSERT(HWBssidIdx < HW_BSSID_MAX); - break; - } - - MAC_IO_WRITE32(pAd, cr_set.u4IntEnableCR, - value); - } - -#endif /* BCN_OFFLOAD_SUPPORT */ - } - - INT MtAsicSetGPTimer(RTMP_ADAPTER * pAd, BOOLEAN enable, - UINT32 timeout) - { - return SetIntTimerEn(pAd, enable, INT_TIMER_EN_GP_TIMER, - timeout); - } - - INT MtAsicSetChBusyStat(RTMP_ADAPTER * pAd, BOOLEAN enable) - { - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - return TRUE; - } - - typedef struct _RTMP_WMM_PAIR { - UINT32 Address; - UINT32 Mask; - UINT32 Shift; - } RTMP_WMM_PAIR, *PRTMP_WMM_PAIR; - - static RTMP_WMM_PAIR wmm_txop_mask[] = { - { TMAC_ACTXOPLR1, 0x0000ffff, 0 }, /* AC0 - BK */ - { TMAC_ACTXOPLR1, 0xffff0000, 16 }, /* AC1 - BE */ - { TMAC_ACTXOPLR0, 0x0000ffff, 0 }, /* AC2 - VI */ - { TMAC_ACTXOPLR0, 0xffff0000, 16 }, /* AC3 - VO */ - }; - - static RTMP_WMM_PAIR wmm_aifsn_mask[] = { - { ARB_AIFSR0, 0x0000000f, 0 }, /* AC0 - BK */ - { ARB_AIFSR0, 0x000000f0, 4 }, /* AC1 - BE */ - { ARB_AIFSR0, 0x00000f00, 8 }, /* AC2 - VI */ - { ARB_AIFSR0, 0x0000f000, 12 }, /* AC3 - VO */ - }; - - static RTMP_WMM_PAIR wmm_cwmin_mask[] = { - { ARB_ACCWIR0, 0x000000ff, 0 }, /* AC0 - BK */ - { ARB_ACCWIR0, 0x0000ff00, 8 }, /* AC1 - BE */ - { ARB_ACCWIR0, 0x00ff0000, 16 }, /* AC2 - VI */ - { ARB_ACCWIR0, 0xff000000, 24 }, /* AC3 - VO */ - }; - - static RTMP_WMM_PAIR wmm_cwmax_mask[] = { - { ARB_ACCWXR0, 0x0000ffff, 0 }, /* AC0 - BK */ - { ARB_ACCWXR0, 0xffff0000, 16 }, /* AC1 - BE */ - { ARB_ACCWXR1, 0x0000ffff, 0 }, /* AC2 - VI */ - { ARB_ACCWXR1, 0xffff0000, 16 }, /* AC3 - VO */ - }; - - /** - * @addtogroup wmm - * @{ - * @name WMM HW HAL - * @{ - */ - UINT32 MtAsicGetWmmParam(RTMP_ADAPTER * pAd, UINT32 AcNum, - UINT32 EdcaType) - { - UINT32 addr = 0, cr_val, mask = 0, shift = 0; - - if (AcNum <= WMM_PARAM_AC_3) { - switch (EdcaType) { - case WMM_PARAM_TXOP: - addr = wmm_txop_mask[AcNum].Address; - mask = wmm_txop_mask[AcNum].Mask; - shift = wmm_txop_mask[AcNum].Shift; - break; - - case WMM_PARAM_AIFSN: - addr = wmm_aifsn_mask[AcNum].Address; - mask = wmm_aifsn_mask[AcNum].Mask; - shift = wmm_aifsn_mask[AcNum].Shift; - break; - - case WMM_PARAM_CWMIN: - addr = wmm_cwmin_mask[AcNum].Address; - mask = wmm_cwmin_mask[AcNum].Mask; - shift = wmm_cwmin_mask[AcNum].Shift; - break; - - case WMM_PARAM_CWMAX: - addr = wmm_cwmax_mask[AcNum].Address; - mask = wmm_cwmax_mask[AcNum].Mask; - shift = wmm_cwmax_mask[AcNum].Shift; - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s(%d): Error type=%d\n", - __func__, __LINE__, - EdcaType)); - break; - } - } - - if (addr && mask) { - MAC_IO_READ32(pAd, addr, &cr_val); - cr_val = (cr_val & mask) >> shift; - return cr_val; - } - - return 0xdeadbeef; - } - - INT MtAsicSetWmmParam(RTMP_ADAPTER * pAd, UCHAR idx, - UINT32 AcNum, UINT32 EdcaType, - UINT32 EdcaValue) - { - CMD_EDCA_SET_T EdcaParam; - P_TX_AC_PARAM_T pAcParam; - - os_zero_mem(&EdcaParam, sizeof(CMD_EDCA_SET_T)); - EdcaParam.ucTotalNum = 1; - pAcParam = &EdcaParam.rAcParam[0]; - pAcParam->ucAcNum = (UINT8)AcNum; - - switch (EdcaType) { - case WMM_PARAM_TXOP: - pAcParam->ucVaildBit = CMD_EDCA_TXOP_BIT; - pAcParam->u2Txop = (UINT16)EdcaValue; - break; - - case WMM_PARAM_AIFSN: - pAcParam->ucVaildBit = CMD_EDCA_AIFS_BIT; - pAcParam->ucAifs = (UINT8)EdcaValue; - break; - - case WMM_PARAM_CWMIN: - pAcParam->ucVaildBit = CMD_EDCA_WIN_MIN_BIT; - pAcParam->ucWinMin = (UINT8)EdcaValue; - break; - - case WMM_PARAM_CWMAX: - pAcParam->ucVaildBit = CMD_EDCA_WIN_MAX_BIT; - pAcParam->u2WinMax = (UINT16)EdcaValue; - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s(%d): Error type=%d\n", __func__, - __LINE__, EdcaType)); - break; - } - -#if defined(COMPOS_TESTMODE_WIN) - ; /* no function */ -#else - MtCmdEdcaParameterSet(pAd, EdcaParam); -#endif - return TRUE; - } - - VOID MtAsicSetEdcaParm(RTMP_ADAPTER * pAd, PEDCA_PARM pEdcaParm) - { - CMD_EDCA_SET_T EdcaParam; - P_TX_AC_PARAM_T pAcParam; - UINT32 ac = 0, index = 0; - - os_zero_mem(&EdcaParam, sizeof(CMD_EDCA_SET_T)); - - if ((pEdcaParm != NULL) && - (pEdcaParm->bValid != FALSE)) { - EdcaParam.ucTotalNum = CMD_EDCA_AC_MAX; - - for (ac = 0; ac < CMD_EDCA_AC_MAX; ac++) { - index = wmm_aci_2_hw_ac_queue[ac]; - pAcParam = &EdcaParam.rAcParam[index]; - pAcParam->ucVaildBit = - CMD_EDCA_ALL_BITS; - pAcParam->ucAcNum = (UINT8)ac; - pAcParam->ucAifs = - pEdcaParm->Aifsn[index]; - pAcParam->ucWinMin = - pEdcaParm->Cwmin[index]; - pAcParam->u2WinMax = - pEdcaParm->Cwmax[index]; - pAcParam->u2Txop = - pEdcaParm->Txop[index]; - } - } - -#if defined(COMPOS_TESTMODE_WIN) - ; /* no function */ -#else - MtCmdEdcaParameterSet(pAd, EdcaParam); -#endif - } - - /** @} */ - /** @} */ - - INT MtAsicSetRetryLimit(RTMP_ADAPTER * pAd, UINT32 type, - UINT32 limit) - { - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - return FALSE; - } - - UINT32 MtAsicGetRetryLimit(RTMP_ADAPTER * pAd, UINT32 type) - { - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - return 0; - } - - static UCHAR *phy_bw_str[] = { "20M", "40M", "80M", "10M" }; - char *get_bw_str(int bandwidth) - { - if (bandwidth >= BW_20 && bandwidth <= BW_80) - return phy_bw_str[bandwidth]; - else if (bandwidth == BW_10) - return phy_bw_str[3]; - else - return "N/A"; - } - - /** - * @addtogroup auto_rate - * @{ - * @name Auto Rate HW HAL - * @{ - */ - - INT MtAsicSetAutoFallBack(RTMP_ADAPTER * pAd, BOOLEAN enable) - { - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - return FALSE; - } - - INT32 MtAsicAutoFallbackInit(RTMP_ADAPTER * pAd) - { - UINT32 Value; - - MAC_IO_READ32(pAd, AGG_ARUCR, &Value); - Value &= ~RATE1_UP_MPDU_LIMIT_MASK; - Value |= RATE1_UP_MPDU_LINIT(2); - Value &= ~RATE2_UP_MPDU_LIMIT_MASK; - Value |= RATE2_UP_MPDU_LIMIT(2); - Value &= ~RATE3_UP_MPDU_LIMIT_MASK; - Value |= RATE3_UP_MPDU_LIMIT(2); - Value &= ~RATE4_UP_MPDU_LIMIT_MASK; - Value |= RATE4_UP_MPDU_LIMIT(2); - Value &= ~RATE5_UP_MPDU_LIMIT_MASK; - Value |= RATE5_UP_MPDU_LIMIT(1); - Value &= ~RATE6_UP_MPDU_LIMIT_MASK; - Value |= RATE6_UP_MPDU_LIMIT(1); - Value &= ~RATE7_UP_MPDU_LIMIT_MASK; - Value |= RATE7_UP_MPDU_LIMIT(1); - Value &= ~RATE8_UP_MPDU_LIMIT_MASK; - Value |= RATE8_UP_MPDU_LIMIT(1); - MAC_IO_WRITE32(pAd, AGG_ARUCR, Value); - MAC_IO_READ32(pAd, AGG_ARDCR, &Value); - Value &= ~RATE1_DOWN_MPDU_LIMIT_MASK; - Value |= RATE1_DOWN_MPDU_LIMIT(2); - Value &= ~RATE2_DOWN_MPDU_LIMIT_MASK; - Value |= RATE2_DOWN_MPDU_LIMIT(2); - Value &= ~RATE3_DOWN_MPDU_LIMIT_MASK; - Value |= RATE3_DOWN_MPDU_LIMIT(0); - Value &= ~RATE4_DOWN_MPDU_LIMIT_MASK; - Value |= RATE4_DOWN_MPDU_LIMIT(0); - Value &= ~RATE5_DOWN_MPDU_LIMIT_MASK; - Value |= RATE5_DOWN_MPDU_LIMIT(0); - Value &= ~RATE6_DOWN_MPDU_LIMIT_MASK; - Value |= RATE6_DOWN_MPDU_LIMIT(0); - Value &= ~RATE7_DOWN_MPDU_LIMIT_MASK; - Value |= RATE7_DOWN_MPDU_LIMIT(0); - Value &= ~RATE8_DOWN_MPDU_LIMIT_MASK; - Value |= RATE8_DOWN_MPDU_LIMIT(0); - MAC_IO_WRITE32(pAd, AGG_ARDCR, Value); - MAC_IO_READ32(pAd, AGG_ARCR, &Value); - Value |= INI_RATE1; - Value &= ~RTS_RATE_DOWN_TH_MASK; - Value &= ~RATE_DOWN_EXTRA_RATIO_MASK; - Value |= RATE_DOWN_EXTRA_RATIO(1); - Value |= RATE_DOWN_EXTRA_RATIO_EN; - Value &= ~RATE_UP_EXTRA_TH_MASK; - Value |= RATE_UP_EXTRA_TH(4); - MAC_IO_WRITE32(pAd, AGG_ARCR, Value); - return TRUE; - } - - /** - * Wtbl2RateTableUpdate - * - * - * - */ - /* #ifdef CONFIG_WTBL_TLV_MODE */ - VOID MtAsicTxCapAndRateTableUpdateByDriver( - RTMP_ADAPTER * pAd, UCHAR ucWcid, - RA_PHY_CFG_T * prTxPhyCfg, UINT32 * Rate, BOOL fgSpeEn) - { - union WTBL_2_DW9 wtbl_2_d9; - UINT32 u4RegVal; - UCHAR bw; - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) - return; - - wtbl_2_d9.word = 0; - - switch (prTxPhyCfg->BW) { - case BW_80: - bw = 2; - break; - - case BW_40: - bw = 1; - break; - - case BW_20: - - /* case BW_10: */ - default: - bw = 0; - break; - } - - wtbl_2_d9.field.fcap = bw; - wtbl_2_d9.field.ccbw_sel = bw; - wtbl_2_d9.field.cbrn = - 7; /* change bw as (fcap/2) if rate_idx > 7, temporary code */ - - if (prTxPhyCfg->ShortGI) { - wtbl_2_d9.field.g2 = 1; - wtbl_2_d9.field.g4 = 1; - wtbl_2_d9.field.g8 = 1; - wtbl_2_d9.field.g16 = 1; - } else { - wtbl_2_d9.field.g2 = 0; - wtbl_2_d9.field.g4 = 0; - wtbl_2_d9.field.g8 = 0; - wtbl_2_d9.field.g16 = 0; - } - - wtbl_2_d9.field.rate_idx = 0; - - if (fgSpeEn == TRUE) - wtbl_2_d9.field.spe_en = 1; - - MAC_IO_WRITE32(pAd, WTBL_ON_RIUCR0, wtbl_2_d9.word); - u4RegVal = - (Rate[0] | (Rate[1] << 12) | (Rate[2] << 24)); - MAC_IO_WRITE32(pAd, WTBL_ON_RIUCR1, u4RegVal); - u4RegVal = ((Rate[2] >> 8) | (Rate[3] << 4) | - (Rate[4] << 16) | (Rate[5] << 28)); - MAC_IO_WRITE32(pAd, WTBL_ON_RIUCR2, u4RegVal); - u4RegVal = ((Rate[5] >> 4) | (Rate[6] << 8) | - (Rate[7] << 20)); - MAC_IO_WRITE32(pAd, WTBL_ON_RIUCR3, u4RegVal); - /* TODO: shiang-MT7603, shall we also clear TxCnt/RxCnt/AdmCnt here?? */ - u4RegVal = (ucWcid | (1 << 13) | (1 << 14)); - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, u4RegVal); - } - - VOID MtAsicTxCapAndRateTableUpdate(RTMP_ADAPTER * pAd, - UCHAR ucWcid, - RA_PHY_CFG_T * prTxPhyCfg, - UINT32 * Rate, BOOL fgSpeEn) - { - /* #ifdef CONFIG_WTBL_TLV_MODE */ - MtAsicTxCapAndRateTableUpdateByDriver( - pAd, ucWcid, prTxPhyCfg, Rate, fgSpeEn); - } - - /** - * Wtbl2TxRateCounterGet - * - * - * - */ - - static VOID Wtbl2TxRateCounterGetByDriver( - RTMP_ADAPTER * pAd, UCHAR ucWcid, - TX_CNT_INFO * tx_cnt_info) - { - UINT32 u4RegVal; - struct rtmp_mac_ctrl *wtbl_ctrl; - UCHAR wtbl_idx; - UINT32 addr; - - wtbl_ctrl = &pAd->mac_ctrl; - - if (wtbl_ctrl->wtbl_entry_cnt[0] > 0) - wtbl_idx = - (ucWcid < wtbl_ctrl->wtbl_entry_cnt[0] ? - ucWcid : - wtbl_ctrl->wtbl_entry_cnt[0] - - 1); - else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s():PSE not init yet!\n", - __func__)); - return; - } - - addr = pAd->mac_ctrl.wtbl_base_addr[1] + - wtbl_idx * pAd->mac_ctrl.wtbl_entry_size[1]; - HW_IO_READ32(pAd, addr + 5 * 4, - &(tx_cnt_info->wtbl_2_d5.word)); - HW_IO_READ32(pAd, addr + 6 * 4, - &(tx_cnt_info->wtbl_2_d6.word)); - HW_IO_READ32(pAd, addr + 7 * 4, - &(tx_cnt_info->wtbl_2_d7.word)); - HW_IO_READ32(pAd, addr + 8 * 4, - &(tx_cnt_info->wtbl_2_d8.word)); - HW_IO_READ32(pAd, addr + 9 * 4, - &(tx_cnt_info->wtbl_2_d9.word)); - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) - return; - - u4RegVal = (ucWcid | (1 << 14)); - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, u4RegVal); - } - - static VOID Wtbl2TxRateCounterGet(RTMP_ADAPTER * pAd, - UCHAR ucWcid, - TX_CNT_INFO * tx_cnt_info) - { - /* #ifdef CONFIG_WTBL_TLV_MODE */ - Wtbl2TxRateCounterGetByDriver(pAd, ucWcid, tx_cnt_info); - } - - /* - * Wtbl2RcpiGet - * - * - * - */ - - VOID MtAsicTxCntUpdate(RTMP_ADAPTER * pAd, UCHAR Wcid, - MT_TX_COUNTER * pTxInfo) - { - TX_CNT_INFO tx_cnt_info; - - Wtbl2TxRateCounterGet(pAd, (UINT8)Wcid, &tx_cnt_info); - pTxInfo->TxCount = - tx_cnt_info.wtbl_2_d7.field.current_bw_tx_cnt; - pTxInfo->TxCount += - tx_cnt_info.wtbl_2_d8.field.other_bw_tx_cnt; - pTxInfo->TxFailCount = - tx_cnt_info.wtbl_2_d7.field.current_bw_fail_cnt; - pTxInfo->TxFailCount += - tx_cnt_info.wtbl_2_d8.field.other_bw_fail_cnt; - pTxInfo->Rate1TxCnt = (UINT16)tx_cnt_info.wtbl_2_d5 - .field.rate_1_tx_cnt; - pTxInfo->Rate1FailCnt = (UINT16)tx_cnt_info.wtbl_2_d5 - .field.rate_1_fail_cnt; - pTxInfo->Rate2TxCnt = - (CHAR)tx_cnt_info.wtbl_2_d6.field.rate_2_tx_cnt; - pTxInfo->Rate3TxCnt = - (CHAR)tx_cnt_info.wtbl_2_d6.field.rate_3_tx_cnt; - pTxInfo->Rate4TxCnt = - (CHAR)tx_cnt_info.wtbl_2_d6.field.rate_4_tx_cnt; - pTxInfo->Rate5TxCnt = - (CHAR)tx_cnt_info.wtbl_2_d6.field.rate_5_tx_cnt; - pTxInfo->RateIndex = - (CHAR)tx_cnt_info.wtbl_2_d9.field.rate_idx; - } - - VOID MtAsicRssiGet(RTMP_ADAPTER * pAd, UCHAR Wcid, - CHAR * RssiSet) - { - /*union WTBL_2_DW13 wtbl_2_d13;*/ - return; - } - - VOID MtAsicRcpiReset(RTMP_ADAPTER * pAd, UCHAR ucWcid) - { - UINT32 u4RegVal; - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) - return; - - u4RegVal = (ucWcid | (1 << 15)); - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, u4RegVal); - } - - /** @} */ - /** @} */ - -#define MT_MCAST_WCID 0x0 - -#ifndef CONFIG_WTBL_TLV_MODE - static BOOLEAN WtblClearCounter(RTMP_ADAPTER * pAd, UINT8 Wcid) - { - UINT32 Value; - /* RX Counter Clear */ - MAC_IO_READ32(pAd, WTBL_OFF_WIUCR, &Value); - Value &= ~WLAN_IDX_MASK; - Value |= WLAN_IDX(Wcid); - Value |= RX_CNT_CLEAR; - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, Value); - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) - return FALSE; - - /* TX Counter Clear */ - MAC_IO_READ32(pAd, WTBL_OFF_WIUCR, &Value); - Value &= ~WLAN_IDX_MASK; - Value |= WLAN_IDX(Wcid); - Value |= TX_CNT_CLEAR; - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, Value); - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) - return FALSE; - - /* Admission Control Counter Clear */ - MAC_IO_READ32(pAd, WTBL_OFF_WIUCR, &Value); - Value &= ~WLAN_IDX_MASK; - Value |= WLAN_IDX(Wcid); - Value |= ADM_CNT_CLEAR; - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, Value); - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) - return FALSE; - - return TRUE; - } -#endif - - /** - * @addtogroup wtbl - * @{ - * @name Wtbl HW HAL - * @{ - */ - VOID MtAsicUpdateRxWCIDTableByDriver( - RTMP_ADAPTER * pAd, MT_WCID_TABLE_INFO_T WtblInfo) - { - struct wtbl_entry tb_entry; - union WTBL_1_DW0 *dw0 = (union WTBL_1_DW0 *)&tb_entry - .wtbl_1.wtbl_1_d0.word; - union WTBL_1_DW1 *dw1 = (union WTBL_1_DW1 *)&tb_entry - .wtbl_1.wtbl_1_d1.word; - union WTBL_1_DW2 *dw2 = (union WTBL_1_DW2 *)&tb_entry - .wtbl_1.wtbl_1_d2.word; - union WTBL_1_DW3 *dw3 = (union WTBL_1_DW3 *)&tb_entry - .wtbl_1.wtbl_1_d3.word; - union WTBL_1_DW4 *dw4 = (union WTBL_1_DW4 *)&tb_entry - .wtbl_1.wtbl_1_d4.word; - UINT32 Value, Index; - - os_zero_mem(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, (UCHAR)WtblInfo.Wcid, - &tb_entry) == FALSE) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, WtblInfo.Wcid)); - return; - } - - dw0->field.wm = 0; - - if (WtblInfo.WcidType == MT_WCID_TYPE_BMCAST) { - dw0->field.muar_idx = 0xe; - dw2->field.adm = 0; - dw2->field.cipher_suit = WTBL_CIPHER_NONE; - } else if (WtblInfo.WcidType == - MT_WCID_TYPE_APCLI_MCAST) { - dw0->field.muar_idx = 0xe; - dw0->field.rv = 1; - dw2->field.adm = 0; - dw2->field.cipher_suit = WTBL_CIPHER_NONE; - dw0->field.rc_a2 = 1; - } else { - dw0->field.muar_idx = WtblInfo.MacAddrIdx; - - if ((WtblInfo.WcidType == MT_WCID_TYPE_APCLI) || - (WtblInfo.WcidType == - MT_WCID_TYPE_REPEATER)) - dw0->field.rc_a1 = 1; - - /*Windows not enable RV bit, why?*/ - dw0->field.rv = 1; - dw0->field.rc_a2 = 1; - /* TODO: shiang-MT7603, in which case we need to check A1??? */ - /* dw0->field.rc_a1 = 1; */ - dw2->field.adm = 1; - dw2->field.qos = (WtblInfo.SupportQoS) ? 1 : 0; - dw2->field.cipher_suit = WtblInfo.CipherSuit; - dw0->field.rkv = (WtblInfo.CipherSuit != - WTBL_CIPHER_NONE) ? - 1 : - 0; - dw4->field.partial_aid = WtblInfo.Aid; -#ifdef HDR_TRANS_TX_SUPPORT - - switch (WtblInfo.WcidType) { - case MT_WCID_TYPE_AP: - dw2->field.td = 1; - dw2->field.fd = 0; - break; - - case MT_WCID_TYPE_CLI: - dw2->field.td = 1; - dw2->field.fd = 0; - break; - - case MT_WCID_TYPE_APCLI: - case MT_WCID_TYPE_REPEATER: - dw2->field.td = 1; - dw2->field.fd = 0; - break; - - default: - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: Unknown entry type(%d) do not support header translation\n", - __func__, WtblInfo.WcidType)); - break; - } - -#endif - - if (WtblInfo.SupportHT) { - dw2->field.ht = 1; - - if (WtblInfo.SupportRDG) { - dw2->field.r = 1; - dw2->field.rdg_ba = 1; - } - - if (WtblInfo.SmpsMode == MMPS_DYNAMIC) - dw2->field.smps = 1; - else - dw2->field.smps = 0; - - if (WtblInfo.SupportVHT) - dw2->field.vht = 1; - } - } - - dw0->field.addr_4 = WtblInfo.Addr[4]; - dw0->field.addr_5 = WtblInfo.Addr[5]; - dw1->word = WtblInfo.Addr[0] | (WtblInfo.Addr[1] << 8) | - (WtblInfo.Addr[2] << 16) | - (WtblInfo.Addr[3] << 24); - dw3->field.wtbl2_fid = tb_entry.wtbl_fid[1]; - dw3->field.wtbl2_eid = tb_entry.wtbl_eid[1]; - dw3->field.wtbl4_fid = tb_entry.wtbl_fid[3]; - dw3->field.psm = 0; - dw3->field.i_psm = 1; - dw3->field.du_i_psm = 1; - dw4->field.wtbl3_fid = tb_entry.wtbl_fid[2]; - dw4->field.wtbl3_eid = tb_entry.wtbl_eid[2]; - dw4->field.wtbl4_eid = tb_entry.wtbl_eid[3]; - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 8, - dw2->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 4, - dw1->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0], dw0->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 8, - dw2->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 4, - dw1->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0], dw0->word); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d):Write WTBL 1 Addr:0x%x, Value:0x%x\n", - __func__, WtblInfo.Wcid, - tb_entry.wtbl_addr[0], dw0->word)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d):Write WTBL 1 Addr:0x%x, Value:0x%x\n", - __func__, WtblInfo.Wcid, - tb_entry.wtbl_addr[0] + 4, dw1->word)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d):Write WTBL 1 Addr:0x%x, Value:0x%x\n", - __func__, WtblInfo.Wcid, - tb_entry.wtbl_addr[0] + 8, dw2->word)); - MAC_IO_READ32(pAd, WTBL1OR, &Value); - Value |= PSM_W_FLAG; - MAC_IO_WRITE32(pAd, WTBL1OR, Value); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 12, - dw3->word); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d):Write WTBL 1 Addr:0x%x, Value:0x%x\n", - __func__, WtblInfo.Wcid, - tb_entry.wtbl_addr[0] + 12, dw3->word)); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 16, - dw4->word); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d):Write WTBL 1 Addr:0x%x, Value:0x%x\n", - __func__, WtblInfo.Wcid, - tb_entry.wtbl_addr[0] + 16, dw4->word)); - MAC_IO_READ32(pAd, WTBL1OR, &Value); - Value &= ~PSM_W_FLAG; - MAC_IO_WRITE32(pAd, WTBL1OR, Value); - /* Clear BA Information */ - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[1] + (15 * 4), - tb_entry.wtbl_2.wtbl_2_d15.word); - /* Clear BA Information */ - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[1] + (15 * 4), - tb_entry.wtbl_2.wtbl_2_d15.word); - - /*Clear Wtbl Counter*/ - if (WtblClearCounter(pAd, (UCHAR)WtblInfo.Wcid) != TRUE) - return; - - /*Must after RX counter clear*/ - - if (WtblInfo.WcidType != MT_WCID_TYPE_BMCAST && - WtblInfo.WcidType != MT_WCID_TYPE_APCLI_MCAST && - WtblInfo.SupportHT) { - { - dw2->field.mm = WtblInfo.MpduDensity; - dw2->field.af = - WtblInfo.MaxRAmpduFactor; - HW_IO_WRITE32(pAd, - tb_entry.wtbl_addr[0] + 8, - dw2->word); - } - } - - /* Clear Cipher Key */ - for (Index = 0; Index < 8; Index++) - HW_IO_WRITE32(pAd, - tb_entry.wtbl_addr[2] + - (4 * Index), - 0x0); - } - - VOID MtAsicUpdateRxWCIDTable(RTMP_ADAPTER * pAd, - MT_WCID_TABLE_INFO_T WtblInfo) - { - MtAsicUpdateRxWCIDTableByDriver(pAd, WtblInfo); - } - - /* - * ========================================================================== - * Description: - * - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ - VOID MtAsicDelWcidTabByDriver(RTMP_ADAPTER * pAd, - UCHAR wcid_idx) - { - UCHAR cnt, cnt_s, cnt_e; - struct wtbl_entry tb_entry; - UINT32 Index = 0, Value; - union WTBL_1_DW0 *dw0 = (union WTBL_1_DW0 *)&tb_entry - .wtbl_1.wtbl_1_d0.word; - union WTBL_1_DW3 *dw3 = (union WTBL_1_DW3 *)&tb_entry - .wtbl_1.wtbl_1_d3.word; - union WTBL_1_DW4 *dw4 = (union WTBL_1_DW4 *)&tb_entry - .wtbl_1.wtbl_1_d4.word; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():wcid_idx=0x%x\n", __func__, wcid_idx)); - - if (wcid_idx == WCID_ALL) { - cnt_s = 0; - cnt_e = (WCID_ALL - 1); - } else - cnt_s = cnt_e = wcid_idx; - - for (cnt = cnt_s; cnt_s <= cnt_e; cnt_s++) { - cnt = cnt_s; - os_zero_mem(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, cnt, &tb_entry) == - FALSE) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, cnt)); - return; - } - - dw0->field.wm = 0; - dw0->field.rc_a2 = 1; - dw0->field.rv = 1; - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0], - tb_entry.wtbl_1.wtbl_1_d0.word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 4, - tb_entry.wtbl_1.wtbl_1_d1.word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 8, - tb_entry.wtbl_1.wtbl_1_d2.word); - MAC_IO_READ32(pAd, WTBL1OR, &Value); - Value |= PSM_W_FLAG; - MAC_IO_WRITE32(pAd, WTBL1OR, Value); - dw3->field.wtbl2_fid = tb_entry.wtbl_fid[1]; - dw3->field.wtbl2_eid = tb_entry.wtbl_eid[1]; - dw3->field.wtbl4_fid = tb_entry.wtbl_fid[3]; - dw4->field.wtbl3_fid = tb_entry.wtbl_fid[2]; - dw4->field.wtbl3_eid = tb_entry.wtbl_eid[2]; - dw4->field.wtbl4_eid = tb_entry.wtbl_eid[3]; - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 12, - dw3->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 16, - dw4->word); - MAC_IO_READ32(pAd, WTBL1OR, &Value); - Value &= ~PSM_W_FLAG; - MAC_IO_WRITE32(pAd, WTBL1OR, Value); - /* Clear BA Information */ - HW_IO_WRITE32(pAd, - tb_entry.wtbl_addr[1] + (15 * 4), - tb_entry.wtbl_2.wtbl_2_d15.word); - - /* Clear Cipher Key */ - for (Index = 0; Index < 16; Index++) - HW_IO_WRITE32(pAd, - tb_entry.wtbl_addr[2] + - (4 * Index), - 0x0); - - WtblClearCounter(pAd, wcid_idx); - } - } - -/** @} */ -/** @} */ -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else - VOID MtAsicAddRemoveKeyByDriver(PRTMP_ADAPTER pAd, - ASIC_SEC_INFO * pInfo) - { - struct wtbl_entry tb_entry; - union WTBL_1_DW0 *dw0 = - (union WTBL_1_DW0 *)&tb_entry.wtbl_1.wtbl_1_d0.word; - union WTBL_1_DW1 *dw1 = - (union WTBL_1_DW1 *)&tb_entry.wtbl_1.wtbl_1_d1.word; - union WTBL_1_DW2 *dw2 = - (union WTBL_1_DW2 *)&tb_entry.wtbl_1.wtbl_1_d2.word; - UINT32 addr = 0, index = 0; - UCHAR KeyLen = 0; - UCHAR Key[64]; - UINT32 *pKeyData = (UINT32 *)Key; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s Wcid[%d]. Operation=%d, Direction=%d\n", __func__, - pInfo->Wcid, pInfo->Operation, pInfo->Direction)); - os_zero_mem(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, pInfo->Wcid, &tb_entry) == - FALSE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, pInfo->Wcid)); - return; - } - - addr = pAd->mac_ctrl.wtbl_base_addr[2] + - pInfo->Wcid * pAd->mac_ctrl.wtbl_entry_size[2]; - HW_IO_READ32(pAd, tb_entry.wtbl_addr[0], &dw0->word); - HW_IO_READ32(pAd, tb_entry.wtbl_addr[0] + 4, &dw1->word); - HW_IO_READ32(pAd, tb_entry.wtbl_addr[0] + 8, &dw2->word); - dw0->field.wm = 0; - dw0->field.addr_4 = pInfo->PeerAddr[4]; - dw0->field.addr_5 = pInfo->PeerAddr[5]; - dw1->word = pInfo->PeerAddr[0] + (pInfo->PeerAddr[1] << 8) + - (pInfo->PeerAddr[2] << 16) + - (pInfo->PeerAddr[3] << 24); - os_zero_mem(Key, sizeof(Key)); - - if (IS_REMOVEKEY_OPERATION(pInfo)) { - dw0->field.rv = 0; - dw0->field.rkv = 0; - dw2->field.cipher_suit = 0; - dw0->field.kid = 0; - dw2->field.wpi_even = 0; - KeyLen = 64; /* Clear cipher: 16 DWs */ - } else { - /* Add Key */ - UCHAR KeyId = pInfo->KeyIdx; - SEC_KEY_INFO *pSecKey = &pInfo->Key; - - KeyLen = pSecKey->KeyLen; - os_move_mem(Key, pSecKey->Key, pSecKey->KeyLen); - - if (IS_CIPHER_WEP(pInfo->Cipher)) { - addr = KeyId * 16 + addr; - - if (KeyLen == 5) - dw2->field.cipher_suit = - CIPHER_SUIT_WEP_40; - else if (KeyLen == 13) - dw2->field.cipher_suit = - CIPHER_SUIT_WEP_104; - else if (KeyLen == 16) - dw2->field.cipher_suit = - CIPHER_SUIT_WEP_128; - } else if (IS_CIPHER_TKIP(pInfo->Cipher)) { - dw2->field.cipher_suit = CIPHER_SUIT_TKIP_W_MIC; - os_move_mem(&Key[16], pSecKey->RxMic, - LEN_TKIP_MIC); - os_move_mem(&Key[24], pSecKey->TxMic, - LEN_TKIP_MIC); - } else if (IS_CIPHER_CCMP128(pInfo->Cipher)) - dw2->field.cipher_suit = CIPHER_SUIT_CCMP_W_MIC; - else if (IS_CIPHER_CCMP256(pInfo->Cipher)) - dw2->field.cipher_suit = CIPHER_SUIT_CCMP_256; - else if (IS_CIPHER_GCMP128(pInfo->Cipher)) - dw2->field.cipher_suit = CIPHER_SUIT_GCMP_128; - else if (IS_CIPHER_GCMP256(pInfo->Cipher)) - dw2->field.cipher_suit = CIPHER_SUIT_GCMP_256; - else if (IS_CIPHER_BIP_CMAC128(pInfo->Cipher)) { - addr = addr + 16; - dw2->field.cipher_suit = CIPHER_SUIT_BIP; - } - - else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s(%d): Not support Cipher[0x%x]\n", - __func__, __LINE__, pInfo->Cipher)); - return; - } - - if ((pInfo->Direction == SEC_ASIC_KEY_TX) || - (pInfo->Direction == SEC_ASIC_KEY_BOTH)) { - dw0->field.rv = 0; - dw0->field.rkv = 0; - dw0->field.rc_a1 = 0; - dw0->field.rc_a2 = 0; - dw0->field.rc_id = 0; - } - - if ((pInfo->Direction == SEC_ASIC_KEY_RX) || - (pInfo->Direction == SEC_ASIC_KEY_BOTH)) { - dw0->field.rv = 1; - dw0->field.rkv = 1; - dw0->field.rc_a1 = 1; - dw0->field.rc_a2 = 1; - dw0->field.rc_id = 1; - - if (IS_CIPHER_BIP_CMAC128(pInfo->Cipher)) - dw0->field.ikv = 1; - } - - dw0->field.kid = KeyId; - } - - hex_dump("key", Key, KeyLen); - - for (index = 0; index < KeyLen; index += 4) { - pKeyData = (UINT32 *)&Key[index]; -#ifdef RT_BIG_ENDIAN - *pKeyData = SWAP32(*pKeyData); -#endif /* RT_BIG_ENDIAN */ - HW_IO_WRITE32(pAd, addr + index, *pKeyData); - } - - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0], dw0->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 4, dw1->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 8, dw2->word); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(wcid =%d)\n", __func__, pInfo->Wcid)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tWrite WTBL 1 Addr:0x%x, Value:0x%x\n", - tb_entry.wtbl_addr[0], dw0->word)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tWrite WTBL 1 Addr:0x%x, Value:0x%x\n", - tb_entry.wtbl_addr[0] + 4, dw1->word)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tWrite WTBL 1 Addr:0x%x, Value:0x%x\n", - tb_entry.wtbl_addr[0] + 8, dw2->word)); - } -#endif - - /* - * ======================================================================== - * Description: - * Add Pair-wise key material into ASIC. - * Update pairwise key, TxMic and RxMic to Asic Pair-wise key table - * - * Return: - * ======================================================================== - */ - VOID MtAsicAddPairwiseKeyEntry(RTMP_ADAPTER * pAd, UCHAR WCID, - CIPHER_KEY * pKey) - { - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - - /* - * ======================================================================== - * Description: - * Add Shared key information into ASIC. - * Update shared key, TxMic and RxMic to Asic Shared key table - * Update its cipherAlg to Asic Shared key Mode. - * - * Return: - * ======================================================================== - */ - VOID MtAsicAddSharedKeyEntry(IN PRTMP_ADAPTER pAd, - IN UCHAR BssIndex, - IN UCHAR KeyIdx, - IN PCIPHER_KEY pCipherKey) - { - /* TODO: shiang-7603 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - } - - /* IRQL = DISPATCH_LEVEL*/ - VOID MtAsicRemoveSharedKeyEntry(IN PRTMP_ADAPTER pAd, - IN UCHAR BssIndex, - IN UCHAR KeyIdx) - { - /* TODO: shiang-7603 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - } - - /** @} */ - /** @} */ - - INT MtAsicSendCommandToMcu(IN RTMP_ADAPTER * pAd, - IN UCHAR Command, - IN UCHAR Token, - IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic) - { - /* TODO: shiang-7603 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - return FALSE; - } - - BOOLEAN MtAsicSendCmdToMcuAndWait( - IN RTMP_ADAPTER * pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic) - { - BOOLEAN cmd_done = TRUE; - - MtAsicSendCommandToMcu(pAd, Command, Token, - Arg0, Arg1, in_atomic); - return cmd_done; - } - - BOOLEAN MtAsicSendCommandToMcuBBP( - IN PRTMP_ADAPTER pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN FlgIsNeedLocked) - { - /* TODO: shiang-7603 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - return FALSE; - } - - VOID MtAsicTurnOffRFClk(RTMP_ADAPTER * pAd, - UCHAR Channel) - { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - } - -#ifdef STREAM_MODE_SUPPORT - UINT32 MtStreamModeRegVal(RTMP_ADAPTER * pAd) - { - return 0x0; - } - - /* - * ======================================================================== - * Description: - * configure the stream mode of specific MAC or all MAC and set to ASIC. - * - * Prameters: - * pAd --- - * pMacAddr --- - * bClear --- disable the stream mode for specific macAddr when - * (pMacAddr!=NULL) - * - * Return: - * ======================================================================== - */ - VOID MtAsicSetStreamMode(IN RTMP_ADAPTER * pAd, - IN PUCHAR pMacAddr, - IN INT chainIdx, - IN BOOLEAN bEnabled) - { - /* TODO: shiang-7603 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - } - - VOID MtAsicStreamModeInit(RTMP_ADAPTER * pAd) - { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - } -#endif /* STREAM_MODE_SUPPORT // */ - - VOID MtAsicSetTxPreamble(RTMP_ADAPTER * pAd, - USHORT TxPreamble) - { - /* AUTO_RSP_CFG_STRUC csr4; */ - /* TODO: shiang-7603 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - } - -#ifdef DOT11_N_SUPPORT - INT MtAsicReadAggCnt(RTMP_ADAPTER * pAd, ULONG * aggCnt, - int cnt_len) - { - os_zero_mem(aggCnt, cnt_len * sizeof(ULONG)); - /* TODO: shiang-7603 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - return FALSE; - } - - INT MtAsicSetRalinkBurstMode(RTMP_ADAPTER * pAd, - BOOLEAN enable) - { - /* TODO: shiang-7603 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", - __func__, __LINE__)); - return FALSE; - } - -#endif /* DOT11_N_SUPPORT // */ - - /** - * @addtogroup hif - * @{ - * @name hif operation HW HAL - * @{ - */ - - INT MtAsicSetWPDMA(RTMP_ADAPTER * pAd, INT32 TxRx, - BOOLEAN enable, UINT8 WPDMABurstSIZE) - { - struct _RTMP_CHIP_CAP *cap = - hc_get_chip_cap(pAd->hdev_ctrl); - struct _RTMP_CHIP_OP *ops = - hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->hif_set_dma) - return ops->hif_set_dma( - pAd, TxRx, enable, - cap->WPDMABurstSIZE); - - return FALSE; - } - - BOOLEAN MtAsicWaitPDMAIdle(struct _RTMP_ADAPTER * pAd, - INT round, INT wait_us) - { - struct _RTMP_CHIP_OP *ops = - hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->hif_wait_dma_idle) - return ops->hif_wait_dma_idle( - pAd, round, wait_us); - - return FALSE; - } - - /** @} */ - /** @} */ - - INT MtAsicSetMacWD(RTMP_ADAPTER * pAd) - { - return TRUE; - } - - /** - * @addtogroup radio_mgt - * @{ - * @name radio management HW HAL - * @{ - */ - - VOID MtAsicSwitchChannel(RTMP_ADAPTER * pAd, - MT_SWITCH_CHANNEL_CFG SwChCfg) - { - UINT32 val; - struct _RTMP_CHIP_OP *ops = - hc_get_chip_ops(pAd->hdev_ctrl); - - /* TODO: shiang-usw, unify the ops */ - if (ops->ChipSwitchChannel) - ops->ChipSwitchChannel(pAd, SwChCfg); - else - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("For this chip, no specified channel switch function!\n")); - - /* TODO: shiang-7603 */ - MAC_IO_READ32(pAd, RMAC_CHFREQ, &val); - val = 1; - MAC_IO_WRITE32(pAd, RMAC_CHFREQ, val); - } - - INT MtAsicSetBW(RTMP_ADAPTER * pAd, INT bw, - UCHAR BandIdx) - { - UINT32 val; - - MAC_IO_READ32(pAd, AGG_BWCR, &val); - val &= (~0x0c); - - switch (bw) { - case BW_20: - val |= (0); - break; - - case BW_40: - val |= (0x1 << 2); - break; - - case BW_80: - val |= (0x2 << 2); - break; - } - - MAC_IO_WRITE32(pAd, AGG_BWCR, val); -#ifndef COMPOS_WIN - /* TODO: shiang-usw, some CR setting in bbp_set_bw() need to take care!! */ - bbp_set_bw(pAd, bw, BandIdx); -#endif /* COMPOS_WIN */ - return TRUE; - } - -#ifdef COMPOS_WIN - BOOLEAN BBPSetBW(RTMP_ADAPTER * pAd, ULONG bw) - { - /* TODO: shiang-7603, revise following code */ - ULONG MACValue; - - HW_IO_READ32(pAd, AGG_BWCR, &MACValue); - MACValue &= (~0x0c); - - switch (bw) { - case BW_20: - MACValue |= (0); - break; - - case BW_40: - MACValue |= (0x1 << 2); - break; - - case BW_80: - MACValue |= (0x2 << 2); - break; - } - - HW_IO_WRITE32(pAd, AGG_BWCR, MACValue); - return TRUE; - } - - static VOID MT7603BBPInit(RTMP_ADAPTER * pAd) - { - UINT32 Value; - - HW_IO_READ32(pAd, 0x106c8, &Value); - Value &= ~(1 << 30); - HW_IO_WRITE32(pAd, 0x106c8, Value); - HW_IO_READ32(pAd, 0x106cc, &Value); - Value &= ~(1 << 0); - HW_IO_WRITE32(pAd, 0x106cc, Value); - } - -#endif /* COMPOS_WIN */ - - /** @} */ - /** @} */ - - /** - * @addtogroup qa_ate - * @{ - * @name QA/ATE HW HAL - * @{ - */ - -#ifdef CONFIG_ATE - UINT32 MtAsicGetRxStat(RTMP_ADAPTER * pAd, UINT type) - { - UINT32 value = 0; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, Type:%d\n", __func__, type)); - - switch (type) { - case HQA_RX_STAT_MACFCSERRCNT: - MAC_IO_READ32(pAd, MIB_MSDR4, &value); - value = (value >> 16) & - 0xFFFF; /* [31:16] FCS ERR */ - break; - - case HQA_RX_STAT_MAC_MDRDYCNT: - MAC_IO_READ32(pAd, MIB_MSDR10, &value); - break; - - case HQA_RX_STAT_PHY_MDRDYCNT: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_PHYCTRL_STS5, - &value); - break; - - case HQA_RX_STAT_PHY_FCSERRCNT: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_PHYCTRL_STS4, - &value); - break; - - case HQA_RX_STAT_PD: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_PHYCTRL_STS0, - &value); - break; - - case HQA_RX_STAT_CCK_SIG_SFD: - /* [31:16] SIG [15:0] SFD */ - PHY_IO_READ32(pAd, RO_PHYCTRL_STS1, - &value); - break; - - case HQA_RX_STAT_OFDM_SIG_TAG: - /* [31:16] SIG [15:0] TAG */ - PHY_IO_READ32(pAd, RO_PHYCTRL_STS2, - &value); - break; - - case HQA_RX_STAT_RSSI: - if (IS_MT7637(pAd)) { - /*Inst RSSI WB R0[29:20] Inst RSSI IB R0[19:10]*/ - PHY_IO_READ32( - pAd, - MT7367_RO_AGC_DEBUG_2, - &value); - } else { - /*[31:24]IBRSSI0 [23:16]WBRSSI0 [15:8]IBRSSI1 [7:0]WBRSSI1*/ - PHY_IO_READ32(pAd, - RO_AGC_DEBUG_2, - &value); - } - - break; - - case HQA_RX_RESET_PHY_COUNT: - if (IS_MT76x6(pAd) || IS_MT7637(pAd)) { - PHY_IO_READ32(pAd, CR_PHYMUX_5, - &value); - value &= 0xFF0FFFFF; - PHY_IO_WRITE32(pAd, CR_PHYMUX_5, - value); - MTWF_LOG(DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, -->\n", - __func__)); - PHY_IO_READ32(pAd, CR_PHYMUX_5, - &value); - value |= 0x00500000; - PHY_IO_WRITE32(pAd, CR_PHYMUX_5, - value); - MTWF_LOG(DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, <--\n", - __func__)); - } else { - PHY_IO_READ32(pAd, CR_PHYCTRL_2, - &value); - value |= - (1 - << 6); /* BIT6: CR_STSCNT_RST */ - PHY_IO_WRITE32(pAd, - CR_PHYCTRL_2, - value); - value &= (~(1 << 6)); - PHY_IO_WRITE32(pAd, - CR_PHYCTRL_2, - value); - value |= - (1 - << 7); /* BIT7: CR_STSCNT_EN */ - PHY_IO_WRITE32(pAd, - CR_PHYCTRL_2, - value); - } - - break; - - case HQA_RX_RESET_MAC_COUNT: - MAC_IO_READ32(pAd, MIB_MSDR4, &value); - MAC_IO_READ32(pAd, MIB_MSDR10, &value); - PHY_IO_READ32(pAd, RO_PHYCTRL_STS5, - &value); - PHY_IO_READ32(pAd, RO_PHYCTRL_STS4, - &value); - break; - - case HQA_RX_ACI_HIT: - /* [27] ACI_hit */ - PHY_IO_READ32(pAd, CR_ACI_HIT, &value); - break; - - default: - break; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, Type(%d):%x\n", __func__, type, - value)); - return value; - } - - INT MtAsicSetTxTonePower(RTMP_ADAPTER * pAd, INT dec0, - INT dec1) - { - INT Ret = TRUE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s-v2 dec0 = %d, dec1 = %d\n", - __func__, dec0, dec1)); - - if (dec0 < 0 || dec0 > 0xF || dec1 > 31 || - dec1 < -32) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s dec value invalid\n", - __func__)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s dec0 0~F, dec1 -32~31\n", - __func__)); - - if (dec0 > 0xf) - dec0 = 0xf; - - if (dec1 > 31) - dec1 = 31; - } - - /* if((MTK_REV_GTE(pAd, MT7603, MT7603E1))|| */ - if (MTK_REV_GTE(pAd, MT7603, MT7603E2)) { - UCHAR PowerDec0 = dec0 & 0x0F; - UINT32 SetValue = 0x04000000; - ULONG Tempdec1 = 0; - - SetValue |= PowerDec0 << 20; - /* RF Gain 1 db */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s RF 1db SetValue = 0x%x\n", - __func__, SetValue)); -#if !defined(COMPOS_WIN) && \ - !defined(COMPOS_TESTMODE_WIN) /* 1 todo fw Cmd */ - MtCmdRFRegAccessWrite( - pAd, 0, 0x70, - SetValue); /* bit 26(0x04000000) is enable */ - MtCmdRFRegAccessWrite(pAd, 1, 0x70, - SetValue); -#endif - - /* DC Gain */ - if (dec1 < 0) - Tempdec1 = (0x40 + dec1); - else - Tempdec1 = dec1; - - SetValue = - 0x40000000 | (Tempdec1 << 20); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s DC 0.25db SetValue = 0x%x\n", - __func__, SetValue)); - HW_IO_WRITE32( - pAd, CR_TSSI_9, - SetValue); /* 0x10D24, bit 30(0x40000000) isenable */ - HW_IO_WRITE32( - pAd, CR_WF1_TSSI_9, - SetValue); /* 0x11D24, bit 30(0x40000000) isenable */ - } else { - } - - return Ret; - } - - INT MtAsicSetRfFreqOffset(RTMP_ADAPTER * pAd, - UINT32 FreqOffset) - { - UINT32 Value = 0; - INT Ret = TRUE; - - if (FreqOffset > 127) - FreqOffset = 127; - - HW_IO_READ32(pAd, XTAL_CTL13, &Value); - Value &= ~DA_XO_C2_MASK; /* [14:8] (DA_XO_C2) */ - Value |= DA_XO_C2(0x3C); /* set 60(DEC) */ - HW_IO_WRITE32(pAd, XTAL_CTL13, Value); - HW_IO_READ32(pAd, XTAL_CTL14, &Value); - Value &= ~DA_XO_C2_MASK; - Value |= DA_XO_C2(0x7F); - HW_IO_WRITE32(pAd, XTAL_CTL14, Value); - HW_IO_READ32(pAd, XTAL_CTL13, &Value); - Value &= ~DA_XO_C2_MASK; /* [14:8] (DA_XO_C2) */ - Value |= DA_XO_C2(FreqOffset); /* set 60(DEC) */ - HW_IO_WRITE32(pAd, XTAL_CTL13, Value); - return Ret; - } - - INT MtAsicSetTSSI(RTMP_ADAPTER * pAd, UINT32 bOnOff, - UCHAR WFSelect) - { - UINT32 CRValue = 0x0; - UINT32 WF0Offset = - 0x10D04; /* WF_PHY_CR_FRONT CR_WF0_TSSI_1 */ - UINT32 WF1Offset = - 0x11D04; /* WF_PHY_CR_FRONT CR_WF1_TSSI_1 */ - INT Ret = TRUE; - /* !!TEST MODE ONLY!! Normal Mode control by FW and Never disable */ - /* WF0 = 0, WF1 = 1, WF ALL = 2 */ - - if (bOnOff == FALSE) - CRValue = 0xE3F3F800; - else - CRValue = 0xE1010800; - - if ((WFSelect == 0) || (WFSelect == 2)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, Set WF#%d TSSI off\n", - __func__, WFSelect)); - PHY_IO_WRITE32(pAd, WF0Offset, CRValue); - - if (bOnOff == FALSE) { - /* off */ - PHY_IO_WRITE32(pAd, 0x10D18, - 0x0); - } - } - - if ((WFSelect == 1) || (WFSelect == 2)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, Set WF#%d TSSI on\n", - __func__, WFSelect)); - PHY_IO_WRITE32(pAd, WF1Offset, CRValue); - - if (bOnOff == FALSE) { - /* off */ - PHY_IO_WRITE32(pAd, 0x11D18, - 0x0); - } - } - - return Ret; - } - - INT MtAsicSetDPD(RTMP_ADAPTER * pAd, UINT32 bOnOff, - UCHAR WFSelect) - { - UINT32 CRValue = 0x0; - UINT32 WF0Offset = 0x10A08; - UINT32 WF1Offset = 0x11A08; - INT Ret = TRUE; - /* !!TEST MODE ONLY!! Normal Mode control by FW and Never disable */ - /* WF0 = 0, WF1 = 1, WF ALL = 2 */ - - if (bOnOff == FALSE) { - /* WF0 */ - if ((WFSelect == 0) || - (WFSelect == 2)) { - PHY_IO_READ32(pAd, WF0Offset, - &CRValue); - CRValue |= 0xF0000000; - PHY_IO_WRITE32(pAd, WF0Offset, - CRValue); - } - - /* WF1 */ - if ((WFSelect == 1) || - (WFSelect == 2)) { - PHY_IO_READ32(pAd, WF1Offset, - &CRValue); - CRValue |= 0xF0000000; - PHY_IO_WRITE32(pAd, WF1Offset, - CRValue); - } - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, Set WFSelect: %d DPD off\n", - __func__, WFSelect)); - } else { - if ((WFSelect == 0) || - (WFSelect == 2)) { - PHY_IO_READ32(pAd, WF0Offset, - &CRValue); - CRValue &= (~0xF0000000); - PHY_IO_WRITE32(pAd, WF0Offset, - CRValue); - } - - if ((WFSelect == 1) || - (WFSelect == 2)) { - PHY_IO_READ32(pAd, WF1Offset, - &CRValue); - CRValue &= (~0xF0000000); - PHY_IO_WRITE32(pAd, WF1Offset, - CRValue); - } - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, Set WFSelect: %d DPD on\n", - __func__, WFSelect)); - } - - return Ret; - } - - INT MtAsicSetTxToneTest(RTMP_ADAPTER * pAd, - UINT32 bOnOff, UCHAR Type) - { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, bOnOff:%d Type:%d\n", __func__, - bOnOff, Type)); - - if (bOnOff == 0) { /* 0 = off 1 = on */ - /* WF0 */ - PHY_IO_WRITE32( - pAd, CR_PHYCK_CTRL, - 0x00000000); /* 0x10000 */ - PHY_IO_WRITE32( - pAd, CR_FR_CKG_CTRL, - 0x00000000); /* 0x10004 */ - PHY_IO_WRITE32( - pAd, CR_TSSI_0, - 0x80274027); /* 0x10D00 */ - PHY_IO_WRITE32( - pAd, CR_TSSI_1, - 0xC0000800); /* 0x10D04 */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_3, - 0x00000008); /* 0x1420C */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_5, - 0x00000580); /* 0x14214 */ - PHY_IO_WRITE32( - pAd, CR_TXFD_1, - 0x00000000); /* 0x14704 */ - PHY_IO_WRITE32( - pAd, CR_TSSI_9, - 0x00000000); /* 0x10D24 */ - PHY_IO_WRITE32( - pAd, CR_TXFE_3, - 0x00000000); /* 0x10A08 */ - PHY_IO_WRITE32( - pAd, CR_TXPTN_00, - 0x00000000); /* 0x101A0 */ - PHY_IO_WRITE32( - pAd, CR_TXPTN_01, - 0x00000000); /* 0x101A4 */ - PHY_IO_WRITE32( - pAd, CR_RFINTF_03, - 0x00000000); /* 0x1020C */ - PHY_IO_WRITE32( - pAd, CR_TXFE_4, - 0x00000000); /* 0x10A0C */ - PHY_IO_WRITE32( - pAd, CR_DPD_CAL_03, - 0x20300604); /* 0x1090C */ - /* WF1 */ - PHY_IO_WRITE32( - pAd, CR_PHYCK_CTRL, - 0x00000000); /* 0x10000 */ - PHY_IO_WRITE32( - pAd, CR_FR_CKG_CTRL, - 0x00000000); /* 0x10004 */ - PHY_IO_WRITE32( - pAd, CR_WF1_TSSI_0, - 0x80274027); /* 0x11D00 */ - PHY_IO_WRITE32( - pAd, CR_WF1_TSSI_1, - 0xC0000800); /* 0x11D04 */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_WF1_3, - 0x00000008); /* 0x1520C */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_WF1_5, - 0x00000580); /* 0x15214 */ - PHY_IO_WRITE32( - pAd, CR_TXFD_1, - 0x00000000); /* 0x14704 */ - PHY_IO_WRITE32( - pAd, CR_WF1_TSSI_9, - 0x00000000); /* 0x11D24 */ - PHY_IO_WRITE32( - pAd, CR_TXFE1_3, - 0x00000000); /* 0x11A08 */ - PHY_IO_WRITE32( - pAd, CR_TXPTN_00, - 0x00000000); /* 0x101A0 */ - PHY_IO_WRITE32( - pAd, CR_TXPTN_01, - 0x00000000); /* 0x101A4 */ - PHY_IO_WRITE32( - pAd, CR_RFINTF_03, - 0x00000000); /* 0x1020C */ - PHY_IO_WRITE32( - pAd, CR_TXFE1_4, - 0x00000000); /* 0x11A0C */ - PHY_IO_WRITE32( - pAd, CR_DPD_CAL_03, - 0x20300604); /* 0x1090C */ - } else if (bOnOff == 1) { - /* WF0 */ - if (Type == WF0_TX_ONE_TONE_5M || - Type == WF0_TX_TWO_TONE_5M || - Type == WF0_TX_ONE_TONE_10M || - Type == WF0_TX_ONE_TONE_DC) { - /* 1. clock setup */ - PHY_IO_WRITE32(pAd, - CR_PHYCK_CTRL, - 0x00000021); - PHY_IO_WRITE32(pAd, - CR_FR_CKG_CTRL, - 0x00000021); - /* 2. TX setup */ - PHY_IO_WRITE32(pAd, CR_TSSI_0, - 0x00274027); - PHY_IO_WRITE32(pAd, CR_TSSI_1, - 0xC0000400); - PHY_IO_WRITE32(pAd, CR_PHYMUX_3, - 0x80000008); - PHY_IO_WRITE32(pAd, CR_PHYMUX_5, - 0x00000597); - PHY_IO_WRITE32(pAd, CR_TXFD_1, - 0x10000000); - PHY_IO_WRITE32(pAd, CR_TSSI_9, - 0x60000000); - PHY_IO_WRITE32(pAd, CR_TXFE_3, - 0xF0000000); - - /* 3. Gen Tone */ - if (Type == - WF0_TX_ONE_TONE_5M) { - PHY_IO_WRITE32( - pAd, - CR_TXPTN_00, - 0x000C100C); - PHY_IO_WRITE32( - pAd, - CR_TXPTN_01, - 0x00000000); - PHY_IO_WRITE32( - pAd, - CR_RFINTF_03, - 0x00010122); - PHY_IO_WRITE32( - pAd, CR_TXFE_4, - 0x000000C0); - } else if (Type == - WF0_TX_TWO_TONE_5M) { - PHY_IO_WRITE32( - pAd, - CR_TXPTN_00, - 0x000C104C); - PHY_IO_WRITE32( - pAd, - CR_TXPTN_01, - 0x00000000); - PHY_IO_WRITE32( - pAd, - CR_RFINTF_03, - 0x00010122); - PHY_IO_WRITE32( - pAd, CR_TXFE_4, - 0x000000C0); - } else if (Type == - WF0_TX_ONE_TONE_10M) { - PHY_IO_WRITE32( - pAd, - CR_TXPTN_00, - 0x000C101C); - PHY_IO_WRITE32( - pAd, - CR_TXPTN_01, - 0x00000000); - PHY_IO_WRITE32( - pAd, - CR_RFINTF_03, - 0x00011122); - PHY_IO_WRITE32( - pAd, CR_TXFE_4, - 0x000000C0); - } else if (Type == - WF0_TX_ONE_TONE_DC) { - PHY_IO_WRITE32( - pAd, - CR_TXPTN_00, - 0x000C1048); - PHY_IO_WRITE32( - pAd, - CR_TXPTN_01, - 0x07000700); - PHY_IO_WRITE32( - pAd, - CR_RFINTF_03, - 0x00010122); - PHY_IO_WRITE32( - pAd, CR_TXFE_4, - 0x000000C0); - } else - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s Type = %d error!!!\n", - __func__, - Type)); - } else if (Type == WF1_TX_ONE_TONE_5M || - Type == WF1_TX_TWO_TONE_5M || - Type == WF1_TX_ONE_TONE_10M || - Type == WF1_TX_ONE_TONE_DC) { - /* 1. clock setup */ - PHY_IO_WRITE32(pAd, - CR_PHYCK_CTRL, - 0x00000021); - PHY_IO_WRITE32(pAd, - CR_FR_CKG_CTRL, - 0x00000021); - /* 2. TX setup */ - PHY_IO_WRITE32(pAd, - CR_WF1_TSSI_0, - 0x00274027); - PHY_IO_WRITE32(pAd, - CR_WF1_TSSI_1, - 0xC0000400); - PHY_IO_WRITE32(pAd, - CR_PHYMUX_WF1_3, - 0x80000008); - PHY_IO_WRITE32(pAd, - CR_PHYMUX_WF1_5, - 0x00000597); - PHY_IO_WRITE32(pAd, CR_TXFD_1, - 0x10000000); - PHY_IO_WRITE32(pAd, - CR_WF1_TSSI_9, - 0x60000000); - PHY_IO_WRITE32(pAd, CR_TXFE1_3, - 0xF0000000); - - /* 3. Gen Tone */ - if (Type == - WF1_TX_ONE_TONE_5M) { - PHY_IO_WRITE32( - pAd, - CR_TXPTN_00, - 0x000C100C); - PHY_IO_WRITE32( - pAd, - CR_TXPTN_01, - 0x00000000); - PHY_IO_WRITE32( - pAd, - CR_RFINTF_03, - 0x00010122); - PHY_IO_WRITE32( - pAd, CR_TXFE1_4, - 0x000000C0); - } else if (Type == - WF1_TX_TWO_TONE_5M) { - PHY_IO_WRITE32( - pAd, - CR_TXPTN_00, - 0x000C104C); - PHY_IO_WRITE32( - pAd, - CR_TXPTN_01, - 0x00000000); - PHY_IO_WRITE32( - pAd, - CR_RFINTF_03, - 0x00010122); - PHY_IO_WRITE32( - pAd, CR_TXFE1_4, - 0x000000C0); - } else if (Type == - WF1_TX_ONE_TONE_10M) { - PHY_IO_WRITE32( - pAd, - CR_TXPTN_00, - 0x000C101C); - PHY_IO_WRITE32( - pAd, - CR_TXPTN_01, - 0x00000000); - PHY_IO_WRITE32( - pAd, - CR_RFINTF_03, - 0x00011122); - PHY_IO_WRITE32( - pAd, CR_TXFE1_4, - 0x000000C0); - } else if (Type == - WF1_TX_ONE_TONE_DC) { - PHY_IO_WRITE32( - pAd, - CR_TXPTN_00, - 0x000C1048); - PHY_IO_WRITE32( - pAd, - CR_TXPTN_01, - 0x07000700); - PHY_IO_WRITE32( - pAd, - CR_RFINTF_03, - 0x00010122); - PHY_IO_WRITE32( - pAd, CR_TXFE1_4, - 0x000000C0); - } else - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s Type = %d error!!!\n", - __func__, - Type)); - } else - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s Type = %d error!!!\n", - __func__, Type)); - } else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s bOnOff = %d error!!!\n", - __func__, bOnOff)); - - return 0; - } - - INT MtAsicStopContinousTx(RTMP_ADAPTER * pAd) - { - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 val = 0; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("%s\n", __func__)); - PHY_IO_WRITE32(pAd, CR_TXFD_1, - 0x00000005); /* 0x14704 */ - PHY_IO_WRITE32(pAd, CR_TXFD_1, - 0x00000000); /* 0x14704 */ - PHY_IO_WRITE32(pAd, CR_PHYCK_CTRL, - 0x00000045); /* 0x10000 */ - PHY_IO_WRITE32(pAd, CR_FR_CKG_CTRL, - 0x00000045); /* 0x10004 */ - PHY_IO_WRITE32(pAd, CR_FFT_MANU_CTRL, - 0x00000000); /* 0x10704 */ - PHY_IO_WRITE32(pAd, CR_PHYCTRL_0, - 0x00000000); /* 0x14100 */ - PHY_IO_WRITE32(pAd, CR_PHYCTRL_DBGCTRL, - 0x00000000); /* 0x14140 */ - PHY_IO_WRITE32(pAd, CR_PHYMUX_3, - 0x7C900408); /* 0x1420C */ - PHY_IO_WRITE32(pAd, CR_PHYMUX_5, - 0x00000580); /* 0x14214 */ - PHY_IO_WRITE32(pAd, CR_PHYMUX_WF1_5, - 0x00000000); /* 0x15214 */ - PHY_IO_WRITE32(pAd, CR_PHYMUX_10, - 0x00000000); /* 0x14228 */ - PHY_IO_WRITE32(pAd, CR_PHYMUX_11, - 0x00000000); /* 0x1422C */ - PHY_IO_WRITE32(pAd, CR_TXFE_4, - 0x00000000); /* 0x10A0C */ - PHY_IO_WRITE32(pAd, CR_TXFE1_4, - 0x00000000); /* 0x11A0C */ - PHY_IO_WRITE32(pAd, CR_TXFD_0, - 0x00000000); /* 0x14700 */ - PHY_IO_WRITE32(pAd, CR_TXFD_3, - 0x00000000); /* 0x1470C */ - MAC_IO_WRITE32(pAd, TMAC_PCTSR, - 0x00000000); /* 0x21708 */ - PHY_IO_WRITE32(pAd, CR_FR_RST_CTRL, - 0xFFFFFFFF); /* 0x10008 */ - PHY_IO_WRITE32(pAd, CR_BK_RST_CTRL, - 0xFFFFFFFF); /* 0x14004 */ - ATEOp->RfRegRead(pAd, ATECtrl->TxAntennaSel, - 0x0D4, &val); - val &= 0x7fffffff; - ATEOp->RfRegWrite(pAd, ATECtrl->TxAntennaSel, - 0x0D4, val); - ATEOp->RfRegRead(pAd, ATECtrl->TxAntennaSel, - 0x0D4, &val); - val &= 0x00000fff; - ATEOp->RfRegWrite(pAd, ATECtrl->TxAntennaSel, - 0x0D8, val); - /* Restore TSSI CR */ - MtTestModeRestoreCr(pAd, - CR_TSSI_0); /* 0x0D00 */ - MtTestModeRestoreCr(pAd, - CR_WF1_TSSI_0); /* 0x1D00 */ - MtTestModeRestoreCr(pAd, - CR_TSSI_1); /* 0x0D04 */ - MtTestModeRestoreCr(pAd, - CR_WF1_TSSI_1); /* 0x1D04 */ - MtTestModeRestoreCr(pAd, - CR_PHYMUX_27); /* 0x1426C */ - /* PHY_IO_WRITE32(pAd, CR_TSSI_0, ATECtrl->tssi0_wf0_cr); //0x0D00 */ - /* PHY_IO_WRITE32(pAd, CR_WF1_TSSI_0, ATECtrl->tssi0_wf1_cr); //0x1D00 */ - /* PHY_IO_WRITE32(pAd, CR_TSSI_1, ATECtrl->tssi1_wf0_cr); //0x0D04 */ - /* PHY_IO_WRITE32(pAd, CR_WF1_TSSI_1, ATECtrl->tssi1_wf1_cr); //0x1D04 */ - /* Restore Band Edge Patch CR */ - PHY_IO_WRITE32(pAd, CR_RFINTF_01, - 0x00000000); /* 0x0204 */ - PHY_IO_WRITE32(pAd, CR_WF1_RFINTF_01, - 0x00000000); /* 0x1204 */ - /* PHY_IO_WRITE32(pAd, CR_PHYMUX_27, ATECtrl->phy_mux_27); //0x1426C */ - return 0; - } - - INT MtAsicStartContinousTx(RTMP_ADAPTER * pAd, - UINT32 PhyMode, UINT32 BW, - UINT32 PriCh, UINT32 Mcs, - UINT32 WFSel) - { - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - struct _ATE_OPERATION *ATEOp = ATECtrl->ATEOp; - UINT32 value = 0; - UINT32 wf_txgc = 0; - UINT32 tx_pwr = 0; - UINT32 rf_pa = 0; - UINT32 pa_bias = 0; - UINT32 pa_gc = 0; - /* Band Edge */ - INT32 gc_thresh = 0; - INT32 pa_mode = 0; - INT32 pwr_dbm = 0; - INT32 gc = 0; /* for 0x0204, 0x1204 [24:20] */ - UINT32 cr_hilo = 0; - UINT32 bit = 0; - UINT32 i = 0; - UINT32 reg = 0; - UINT32 reg1 = 0; - UINT32 reg2 = 0; -#if !defined(COMPOS_TESTMODE_WIN) && !defined(COMPOS_WIN) - /* TSSI Patch */ - ATECtrl->Sgi = 0; - /* Change TSSI Training Time */ - /* Get Target Power*/ - PHY_IO_READ32(pAd, CR_TSSI_6, - ®); /* 0x0D18 */ - PHY_IO_READ32(pAd, CR_TSSI_13, - ®1); /* 0x1D18 */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(): 0x0D18: 0x%x, tx_pwr(0x0D34):0x%x\n", - __func__, reg, reg1)); - - for (i = 0; i < 2; i++) { - mdelay(500); - ATECtrl->TxCount = 8; - ATEOp->StartTx(pAd); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(): finish Start Tx\n", - __func__)); - mdelay(500); - ATEOp->StopTx(pAd); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(): finish StOP Tx\n", - __func__)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(): finish Tx TSSI Train\n", - __func__)); - ATEOp->RfRegRead( - pAd, WFSel, 0x410, - &rf_pa); /* wf?_pa_gc = 0x410[18:16], wf?_pa_bias = 0x410[15:0];*/ - - switch (WFSel) { - case 0: - case 1: - PHY_IO_READ32(pAd, CR_TSSI_13, &tx_pwr); - break; - - case 2: - PHY_IO_READ32(pAd, CR_WF1_TSSI_13, - &tx_pwr); - break; - - default: - break; - } - - /* Band Edge */ - pwr_dbm = (((INT32)tx_pwr) >> 24) & 0x0000007f; - PHY_IO_READ32(pAd, CR_PHYMUX_24, - ®); /* 0x4260 */ - gc_thresh = (INT32)reg; - pa_mode = (gc_thresh >> 24) & - 0x0000007f; /* Half PA[30:24] */ - pa_mode = (pa_mode & 0x40) ? (pa_mode - 128) : - pa_mode; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("pwr_dbm:%d, pa_mode:%d\n", pwr_dbm, - pa_mode)); - - if (pwr_dbm >= pa_mode) - gc = 0x1; - else - gc = 0x0; - - pa_mode = (gc_thresh >> 16) & - 0x7f; /* Full PA[22:16] */ - pa_mode = (pa_mode & 0x40) ? (pa_mode - 128) : - pa_mode; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("pwr_dbm:%d, pa_mode:%d\n", pwr_dbm, - pa_mode)); - - if (pwr_dbm >= pa_mode) - gc = 0x2; - - pa_mode = (gc_thresh >> 8) & - 0x7f; /* Super PA[14:8] */ - pa_mode = (pa_mode & 0x40) ? (pa_mode - 128) : - pa_mode; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("pwr_dbm:%d, pa_mode:%d\n", pwr_dbm, - pa_mode)); - - if (pwr_dbm >= pa_mode) - gc = 0x3; - - pa_mode = (gc_thresh >> 1) & - 0x1; /* TX_PA_DYNA[1] */ - - if (pa_mode != 1) - gc = (gc_thresh >> 2) & 0x3; - - /* gc write back to [24:20] */ - gc = ((gc << 2) | 0x00000010) << 20; - PHY_IO_WRITE32(pAd, CR_RFINTF_01, - gc); /* 0x0204 */ - PHY_IO_WRITE32(pAd, CR_WF1_RFINTF_01, - gc); /* 0x1204 */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(): gc[0x0204]: 0x%x,gc_thresh:%x\n", - __func__, gc, gc_thresh)); -#endif - /* Original Flow */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(): Modulation = %d, BW=%d, pri_ch = %d, rate = %d, WFSelect = %d-->\n", - __func__, PhyMode, BW, PriCh, Mcs, - WFSel)); - PHY_IO_READ32(pAd, CR_TSSI_6, ®); - reg1 = reg; - PHY_IO_READ32(pAd, CR_WF1_TSSI_6, ®2); - PHY_IO_WRITE32(pAd, CR_FR_RST_CTRL, - 0xFFFFFFFF); /* 0x10008 */ - PHY_IO_WRITE32(pAd, CR_BK_RST_CTRL, - 0xFFFFFFFF); /* 0x14004 */ - PHY_IO_WRITE32(pAd, CR_PHYCK_CTRL, - 0x00000078); /* 0x10000 */ - PHY_IO_WRITE32(pAd, CR_FR_CKG_CTRL, - 0x00000078); /* 0x10004 */ - MtTestModeBkCr(pAd, CR_TSSI_0, TEST_PHY_BKCR); - MtTestModeBkCr(pAd, CR_WF1_TSSI_0, - TEST_PHY_BKCR); - MtTestModeBkCr(pAd, CR_TSSI_1, TEST_PHY_BKCR); - MtTestModeBkCr(pAd, CR_WF1_TSSI_1, - TEST_PHY_BKCR); - /* Contiuous Tx power patch */ - PHY_IO_WRITE32(pAd, CR_TSSI_0, - 0x024041C0); /* 0x0D00 */ - PHY_IO_WRITE32(pAd, CR_WF1_TSSI_0, - 0x024041C0); /* 0x1D00 */ - PHY_IO_WRITE32(pAd, CR_TSSI_1, - 0x23F3F800); /* 0x0D04 */ - PHY_IO_WRITE32(pAd, CR_WF1_TSSI_1, - 0x23F3F800); /* 0x1D04 */ - PHY_IO_WRITE32(pAd, CR_TSSI_6, - reg1); /* 0x0D18 */ - PHY_IO_WRITE32(pAd, CR_WF1_TSSI_6, - reg2); /* 0x1D18 */ - PHY_IO_WRITE32(pAd, CR_FFT_MANU_CTRL, - 0x0AA00000); /* 0x10704 */ - - if (BW_20 == BW) - value = 0x00000000; - else if (BW_40 == BW) - value = 0x01000000; - else if (BW_80 == BW) - value = 0x02000000; - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s BW = %d error!!!\n", - __func__, BW)); - - if (PriCh == 0) - value |= 0x00000000; - else if (PriCh == 1) - value |= 0x00100000; - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s pri_ch = %d error!!!\n", - __func__, PriCh)); - - PHY_IO_WRITE32(pAd, CR_PHYCTRL_0, - value); /* 0x14100 */ - PHY_IO_WRITE32(pAd, CR_PHYCTRL_DBGCTRL, - 0x80000030); /* 0x14140 */ - PHY_IO_WRITE32(pAd, CR_PHYMUX_3, - 0x80680008); /* 0x1420C */ - - switch (WFSel) { - case 0: - PHY_IO_WRITE32( - pAd, CR_PHYMUX_5, - 0x00000597); /* 0x14214 */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_WF1_5, - 0x00000010); /* 0x15214 */ - break; - - case 1: - PHY_IO_WRITE32( - pAd, CR_PHYMUX_WF1_3, - 0x80680008); /* 0x1520C */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_5, - 0x00000590); /* 0x14214 */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_WF1_5, - 0x00000017); /* 0x15214 */ - break; - - case 2: - PHY_IO_WRITE32( - pAd, CR_PHYMUX_WF1_3, - 0x80680008); /* 0x1520C */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_5, - 0x00000597); /* 0x14214 */ - PHY_IO_WRITE32( - pAd, CR_PHYMUX_WF1_5, - 0x00000017); /* 0x15214 */ - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s WFSelect = %d error!!!\n", - __func__, - WFSel)); /* No ALL?*/ - break; - } - - if (BW_20 == BW) - PHY_IO_WRITE32( - pAd, CR_TXFD_0, - 0x00030000); /* 0x14700 */ - else if (BW_40 == BW) - PHY_IO_WRITE32( - pAd, CR_TXFD_0, - 0x14030000); /* 0x14700 */ - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s BW = %d error!!!\n", - __func__, BW)); - - if (PhyMode == 0) { /* MODULATION_SYSTEM_CCK */ - value = 0; - - switch (Mcs) { - case MCS_0: - case MCS_8: - value = 0x00000000; - break; - - case MCS_1: - case MCS_9: - value = 0x00200000; - break; - - case MCS_2: - case MCS_10: - value = 0x00400000; - break; - - case MCS_3: - case MCS_11: - value = 0x00600000; - break; - - default: - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s CCK rate = %d error!!!\n", - __func__, Mcs)); - break; - } - - PHY_IO_WRITE32(pAd, CR_TXFD_3, value); - } else if (PhyMode == - 1) { /* MODULATION_SYSTEM_OFDM */ - PHY_IO_READ32(pAd, CR_PHYMUX_26, - &cr_hilo); /* 0x4268 */ - value = 0; - - switch (Mcs) { - case MCS_0: - value = 0x01600000; - cr_hilo &= BIT(0); - break; - - case MCS_1: - value = 0x01E00000; - cr_hilo &= BIT(1); - break; - - case MCS_2: - value = 0x01400000; - cr_hilo &= BIT(2); - break; - - case MCS_3: - value = 0x01C00000; - cr_hilo &= BIT(3); - break; - - case MCS_4: - value = 0x01200000; - cr_hilo &= BIT(4); - break; - - case MCS_5: - value = 0x01900000; - cr_hilo &= BIT(5); - break; - - case MCS_6: - value = 0x01000000; - cr_hilo &= BIT(6); - break; - - case MCS_7: - value = 0x01800000; - cr_hilo &= BIT(7); - break; - - default: - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s OFDM rate = %d error!!!\n", - __func__, Mcs)); - break; - } - - PHY_IO_WRITE32(pAd, CR_TXFD_3, - value); /* 0x1470C */ - MtTestModeBkCr(pAd, CR_PHYMUX_27, - TEST_PHY_BKCR); - PHY_IO_READ32(pAd, CR_PHYMUX_27, - &value); /* 0x1426C */ - - if (cr_hilo == 0) { /* Low Rate */ - bit = value & BIT(12); - value |= bit << 2; - } else { /* High Rate */ - bit = value & BIT(13); - value |= bit << 1; - } - - PHY_IO_WRITE32(pAd, CR_PHYMUX_27, - value); /* 0x1426C */ - } else if (2 == PhyMode || 3 == PhyMode) { - /* MODULATION_SYSTEM_HT20 || MODULATION_SYSTEM_HT40 */ - PHY_IO_READ32(pAd, CR_PHYMUX_25, - &cr_hilo); /* 0x4264 */ - value = 0; - - switch (Mcs) { - case MCS_0: - value = 0x00000000; - cr_hilo &= BIT(0); - break; - - case MCS_1: - value = 0x00200000; - cr_hilo &= BIT(1); - break; - - case MCS_2: - value = 0x00400000; - cr_hilo &= BIT(2); - break; - - case MCS_3: - value = 0x00600000; - cr_hilo &= BIT(3); - break; - - case MCS_4: - value = 0x00800000; - cr_hilo &= BIT(4); - break; - - case MCS_5: - value = 0x00A00000; - cr_hilo &= BIT(5); - break; - - case MCS_6: - value = 0x00C00000; - cr_hilo &= BIT(6); - break; - - case MCS_7: - value = 0x00E00000; - cr_hilo &= BIT(7); - break; - - case MCS_32: - value = 0x04000000; - cr_hilo &= BIT(0); - break; - - default: - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s OFDM HT MCS = %d error!!!\n", - __func__, Mcs)); - break; - } - - PHY_IO_WRITE32(pAd, CR_TXFD_3, - value); /* 0x1470C */ - MtTestModeBkCr(pAd, CR_PHYMUX_27, - TEST_PHY_BKCR); - PHY_IO_READ32(pAd, CR_PHYMUX_27, - &value); /* 0x1426C */ - - if (cr_hilo == 0) { /* Low Rate */ - bit = value & BIT(12); - value |= bit << 2; - } else { /* High Rate */ - bit = value & BIT(13); - value |= bit << 1; - } - - PHY_IO_WRITE32(pAd, CR_PHYMUX_27, - value); /* 0x1426C */ - } else - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s Modulation = %d error!!!\n", - __func__, PhyMode)); - -#ifdef COMPOS_TESTMODE_WIN - PHY_IO_WRITE32(pAd, CR_PHYMUX_10, 0x09400000); -#else - /* load the tag_pwr */ - wf_txgc |= 0x08000000; /* TXGC_MANUAL_ENABLE */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("tx_pwr:0x%x\n", tx_pwr)); - tx_pwr = (tx_pwr >> 4) & 0x0FF00000; - wf_txgc |= tx_pwr; - PHY_IO_WRITE32(pAd, CR_PHYMUX_10, wf_txgc); - PHY_IO_READ32(pAd, CR_PHYMUX_10, ®); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("tx_pwr:0x%x, wf_txgc:0x%08x, CR_PHYMUX_10:0x%08x\n", - tx_pwr, wf_txgc, reg)); - /* Pre-Load Setting to Continuous Tx */ - ATEOp->RfRegRead(pAd, WFSel, 0x0D4, &pa_bias); - pa_bias |= - 0x80000000; /* pa_bias manual enablei */ - ATEOp->RfRegWrite(pAd, WFSel, 0x0D4, pa_bias); - /* load pa_gc & pa_bias */ - pa_gc |= 0x00008000; /* bit[15] = 1*/ - pa_gc |= (rf_pa & 0x0000ffff) - << 16; /* bit[31:16] = wf0_pa_gc */ - pa_gc |= (rf_pa >> 4) & - 0x00007000; /* bit[14:12] */ - ATEOp->RfRegWrite(pAd, WFSel, 0x0D8, pa_gc); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("pa_gc:0x%x,<-- rf_pa:0x%x\n", pa_gc, - rf_pa)); -#endif - - if (WFSel == 0) - PHY_IO_WRITE32( - pAd, CR_PHYMUX_11, - 0xA0000000); /* 0x1422C */ - else if (WFSel == 1) - PHY_IO_WRITE32( - pAd, CR_PHYMUX_11, - 0x90000000); /* 0x1422C */ - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s WFSelect = %d error!!!\n", - __func__, - WFSel)); /* No ALL?*/ - - if (PhyMode == 0) /* PREAMBLE_CCK */ - PHY_IO_WRITE32( - pAd, CR_TXFD_1, - 0x300000F8); /* 0x14704 */ - else if (PhyMode == 1) /* PREAMBLE_OFDM */ - PHY_IO_WRITE32( - pAd, CR_TXFD_1, - 0x310000F2); /* 0x14704 */ - else if (2 == PhyMode || - 3 == PhyMode) /* PREAMBLE_GREEN_FIELD */ - PHY_IO_WRITE32( - pAd, CR_TXFD_1, - 0x320000F2); /* 0x14704 */ - else - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s Modulation = %d error!!!\n", - __func__, PhyMode)); - - PHY_IO_WRITE32(pAd, CR_TXFE_4, - 0x000000C0); /* 0x10A0C */ - PHY_IO_WRITE32(pAd, CR_TXFE1_4, - 0x000000C0); /* 0x11A0C */ - return 0; - } - -#ifdef COMPOS_TESTMODE_WIN - /** - * Tx Set Frequency Offset - * - * @param pDeviceObject pointer PDEVICE_OBJECT - * @param iOffset value - * - * @return void - * Otherwise, an error code is returned. - */ - INT MTAsicTxSetFrequencyOffset(RTMP_ADAPTER * pAd, - UINT32 iOffset, - BOOLEAN HasBeenSet) - { - UINT32 Value = 0; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s iOffset=0x%x-->\n", __func__, - iOffset)); - - if (HasBeenSet == FALSE) { - if (IS_MT7603(pAd)) { - /* RG_XO_C2[8:14] Set 60 (0x3C )at first */ - MAC_IO_READ32(pAd, RG_XO_C2, - &Value); - Value = (Value & 0xFFFF80FF) | - (0x3C << 8); - MAC_IO_WRITE32(pAd, RG_XO_C2, - Value); - /* RG_XO_C2_MANUAL [8:14] Set 0x7F at first */ - MAC_IO_READ32(pAd, - RG_XO_C2_MANUAL, - &Value); - Value = (Value & 0xFFFF80FF) | - (0x7F << 8); - MAC_IO_WRITE32(pAd, - RG_XO_C2_MANUAL, - Value); - /* only set at first time */ - } else if (IS_MT76x6(pAd) || - IS_MT7637(pAd)) { - MAC_IO_READ32( - pAd, - FREQ_OFFSET_MANUAL_ENABLE, - &Value); - Value = (Value & 0xFFFF80FF) | - (0x7F << 8); - MAC_IO_WRITE32( - pAd, - FREQ_OFFSET_MANUAL_ENABLE, - Value); - } - } - - if (IS_MT7603(pAd)) { - HW_IO_READ32(pAd, RG_XO_C2, &Value); - Value = (Value & 0xFFFF80FF) | - (iOffset << 8); - HW_IO_WRITE32(pAd, RG_XO_C2, Value); - } - - return 0; - } - /** - * Set Tx Power Range - * - * @param pDeviceObject pointer PDEVICE_OBJECT - * @param ucMaxPowerDbm, Max Power Dbm - * @param ucMinPowerDbm, Min Power Dbm - * - * @return void - * Otherwise, an error code is returned. - */ - INT MTAsicTxConfigPowerRange(RTMP_ADAPTER * pAd, - IN UCHAR ucMaxPowerDbm, - IN UCHAR ucMinPowerDbm) - { - UINT32 u4RegValue; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("%s-->\n", __func__)); - MAC_IO_READ32(pAd, TMAC_FPCR, &u4RegValue); - u4RegValue &= ~(FPCR_FRAME_POWER_MAX_DBM | - FPCR_FRAME_POWER_MIN_DBM); - u4RegValue |= - ((ucMaxPowerDbm - << FPCR_FRAME_POWER_MAX_DBM_OFFSET) & - FPCR_FRAME_POWER_MAX_DBM); - u4RegValue |= - ((ucMinPowerDbm - << FPCR_FRAME_POWER_MIN_DBM_OFFSET) & - FPCR_FRAME_POWER_MIN_DBM); - MAC_IO_WRITE32(pAd, TMAC_FPCR, u4RegValue); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("%s<--\n", __func__)); - return 0; - } - - INT MTAsicSetTMR(RTMP_ADAPTER * pAd, UCHAR enable) - { - UINT32 value = 0; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, -->\n", __func__)); - - switch (enable) { - case 1: { /* initialiter */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: enable TMR report, as Initialiter\n", - __func__)); - MAC_IO_READ32(pAd, RMAC_TMR_PA, &value); - value = value | BIT31; - value = value & ~BIT30; - value = value | - 0x34; /* Action frame register */ - MAC_IO_WRITE32(pAd, RMAC_TMR_PA, value); - } break; - - case 2: { /* responder */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: enable TMR report, as Responser\n", - __func__)); - MAC_IO_READ32(pAd, RMAC_TMR_PA, &value); - value = value | BIT31; - value = value | BIT30; - value = value | - 0x34; /* Action frame register */ - MAC_IO_WRITE32(pAd, RMAC_TMR_PA, value); - } break; - - case 0: /* disable */ - default: { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: disable TMR report\n", - __func__)); - MAC_IO_READ32(pAd, RMAC_TMR_PA, &value); - value = value & ~BIT31; - MAC_IO_WRITE32(pAd, RMAC_TMR_PA, value); - } - } - - return 0; - } -#endif -#endif /* CONFIG_ATE */ - - /** @} */ - /** @} */ - - /** - * @addtogroup dma_sch - * @{ - * @name DMA scheduler HW HAL - * @{ - */ - -#ifdef DMA_SCH_SUPPORT - -/* - * DMA scheduer reservation page assignment - * Q0~Q3: WMM1 - * Q4: Management queue - * Q5: MCU CMD - * Q7: Beacon - * Q8: MC/BC - * Q9~Q12: WMM2 - * Q13: Management queue - */ -#define MAX_BEACON_SIZE 512 -#define MAX_BMCAST_SIZE 1536 -#define MAX_BMCAST_COUNT 3 -#define MAX_MCUCMD_SIZE 4096 /*must >= MAX_DATA_SIZE */ -#define MAX_DATA_SIZE 1792 /* 0xe*128=1792 */ -#define MAX_AMSDU_DATA_SIZE 4096 - /* - * HYBRID Mode: DMA scheduler would ignore the tx op time information from LMAC, and also use FFA and RSV for enqueue cal. - * BYPASS Mode: Only for Firmware download - */ - - INT32 MtAsicDMASchedulerInit( - RTMP_ADAPTER * pAd, MT_DMASCH_CTRL_T DmaSchCtrl) - { - UINT32 mac_val; - UINT32 page_size = 128; - UINT32 page_cnt = 0x1ae; - INT dma_mode = DmaSchCtrl.mode; -#ifdef RTMP_PCI_SUPPORT - UINT32 mac_restore_val; -#if defined(MT7636_FPGA) || defined(MT7637_FPGA) - UINT32 RemapBase, RemapOffset; -#endif -#endif /* RTMP_MAC_PCI */ -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) - page_size = 256; -#endif /* MT7603_FPGA */ -#if defined(MT7636_FPGA) || defined(MT7637_FPGA) - page_size = 128; -#endif /* MT7636_FPGA || MT7637_FPGA */ - /* Got PSE P0 MAX Quota */ -#ifdef RTMP_MAC_PCI - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &mac_restore_val); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - MT_PSE_BASE_ADDR); - HW_IO_READ32(pAd, 0x80120, &mac_val); - page_cnt = (mac_val & 0x0fff0000) >> 16; - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - mac_restore_val); -#endif /* RTMP_MAC_PCI */ - /* Setting PSE page free priority,P0(HIF) > P1(MCU) > P2Q2(TXS) > P2Q1(RXV) = P2Q0(Rxdata)*/ - mac_val = 0x00004037; - MAC_IO_WRITE32(pAd, FC_FRP, mac_val); - - if (dma_mode == DMA_SCH_BYPASS) { - MAC_IO_WRITE32(pAd, MT_SCH_REG_4, - 1 << 5); - /* Disable DMA scheduler */ - MAC_IO_READ32(pAd, AGG_DSCR1, &mac_val); - mac_val |= 0x80000000; - MAC_IO_WRITE32(pAd, AGG_DSCR1, mac_val); -#ifdef RTMP_MAC_PCI - /* - * Wei-Guo's comment: - * 2DW/7DW => 0x800C_006C[14:12] = 3'b0 - * 3DW/8DW =>0x800C_006C[14:12] = 3'b1 - */ - /* In FPGA mode, we need to change tx pad by different DMA scheduler setting! */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - 0x80080000); - HW_IO_READ32(pAd, 0xc006c, &mac_val); - mac_val &= (~(7 << 12)); - mac_val |= (1 << 12); - HW_IO_WRITE32(pAd, 0xc006c, mac_val); - /* After change the Tx Padding CR of PCI-E Client, we need to re-map for PSE region */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - MT_PSE_BASE_ADDR); -#endif /* RTMP_MAC_PCI */ - /* work around for un-sync of TxD between HIF and LMAC */ - MAC_IO_READ32(pAd, DMA_DCR1, &mac_val); - mac_val &= (~(0x7 << 8)); - mac_val |= (0x1 << 8); - MAC_IO_WRITE32(pAd, DMA_DCR1, mac_val); - } - - if ((dma_mode == DMA_SCH_LMAC) || - (dma_mode == DMA_SCH_HYBRID)) { -#ifdef CONFIG_AP_SUPPORT - UINT32 max_beacon_page_count = - MAX_BEACON_SIZE / page_size; -#endif - UINT32 max_bmcast_page_count = - MAX_BMCAST_SIZE / page_size; - UINT32 max_mcucmd_page_count = - MAX_MCUCMD_SIZE / page_size; - UINT32 max_data_page_count = - MAX_DATA_SIZE / page_size; - UINT32 total_restore_val; - UINT32 mcu_restore_val; - UINT32 bcn_restore_val = 0; - UINT32 mbc_restore_val; - /* Highest Priority:Q7: Beacon > Q8: MC/BC > Q5: MCU CMD */ - mac_val = 0x55555555; - MAC_IO_WRITE32(pAd, MT_HIGH_PRIORITY_1, - mac_val); - mac_val = 0x78555555; - MAC_IO_WRITE32(pAd, MT_HIGH_PRIORITY_2, - mac_val); - /* Queue Priority */ - mac_val = 0x2b1a096e; - MAC_IO_WRITE32(pAd, MT_QUEUE_PRIORITY_1, - mac_val); - mac_val = 0x785f4d3c; - MAC_IO_WRITE32(pAd, MT_QUEUE_PRIORITY_2, - mac_val); - MAC_IO_WRITE32(pAd, MT_PRIORITY_MASK, - 0xffffffff); - /* Schedule Priority, page size/FFA, FFA = (page_cnt * page_size) */ - mac_val = (2 << 28) | (page_cnt); - MAC_IO_WRITE32(pAd, MT_SCH_REG_1, - mac_val); - mac_val = MAX_DATA_SIZE / page_size; - MAC_IO_WRITE32(pAd, MT_SCH_REG_2, - mac_val); - /* Resvervation page */ -#ifdef DOT11_N_SUPPORT - - if (pAd->CommonCfg.BACapability.field - .AmsduEnable == TRUE) - max_data_page_count = - MAX_AMSDU_DATA_SIZE / - page_size; - -#endif - MAC_IO_WRITE32(pAd, MT_PAGE_CNT_0, - max_data_page_count); - MAC_IO_WRITE32(pAd, MT_PAGE_CNT_1, - max_data_page_count); - MAC_IO_WRITE32(pAd, MT_PAGE_CNT_2, - max_data_page_count); - MAC_IO_WRITE32(pAd, MT_PAGE_CNT_3, - max_data_page_count); - MAC_IO_WRITE32(pAd, MT_PAGE_CNT_4, - max_data_page_count); - total_restore_val = - max_data_page_count * 5; - mcu_restore_val = max_mcucmd_page_count; - MAC_IO_WRITE32(pAd, MT_PAGE_CNT_5, - mcu_restore_val); - total_restore_val += mcu_restore_val; -#ifdef CONFIG_AP_SUPPORT - - if (pAd->ApCfg.BssidNum > 1) - bcn_restore_val = - max_beacon_page_count * - (pAd->ApCfg - .BssidNum - - 1) + - max_data_page_count; - else - bcn_restore_val = - max_data_page_count; - - MAC_IO_WRITE32(pAd, MT_PAGE_CNT_7, - bcn_restore_val); -#endif /* CONFIG_AP_SUPPORT */ - total_restore_val += bcn_restore_val; - mbc_restore_val = - max_bmcast_page_count * - MAX_BMCAST_COUNT + - max_data_page_count; - MAC_IO_WRITE32(pAd, MT_PAGE_CNT_8, - mbc_restore_val); - total_restore_val += mbc_restore_val; - /* FFA1 max threshold */ - MAC_IO_WRITE32( - pAd, MT_RSV_MAX_THD, - (page_cnt - total_restore_val)); - /* Group Threshold */ - MAC_IO_WRITE32(pAd, MT_GROUP_THD_0, - page_cnt); - MAC_IO_WRITE32(pAd, MT_BMAP_0, 0xffff); - - if (dma_mode == DMA_SCH_LMAC) { - /* config as LMAC prediction mode */ - MAC_IO_WRITE32( - pAd, MT_SCH_REG_4, 0x0); - } - - if (dma_mode == DMA_SCH_HYBRID) { - /* config as hybrid mode */ - MAC_IO_WRITE32(pAd, - MT_SCH_REG_4, - 1 << 6); -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) -#ifdef RTMP_PCI_SUPPORT - /* Wei-Guo's comment: - * 2DW/7DW => 0x800C_006C[14:12] = 3'b0 - * 3DW/8DW =>0x800C_006C[14:12] = 3'b1 - */ - /* In FPGA mode, we need to change tx pad by different DMA scheduler setting */ - HW_IO_WRITE32(pAd, - MCU_PCIE_REMAP_2, - 0x80080000); - HW_IO_READ32(pAd, 0xc006c, - &mac_val); - mac_val &= (~(7 << 12)); - HW_IO_WRITE32(pAd, 0xc006c, - mac_val); - /* After change the Tx Padding CR of PCI-E Client, we need to re-map for PSE region */ - HW_IO_WRITE32(pAd, - MCU_PCIE_REMAP_2, - MT_PSE_BASE_ADDR); -#endif /* RTMP_PCI_SUPPORT */ -#endif /* MT7603_FPGA */ - /* Disable TxD padding */ - MAC_IO_READ32(pAd, DMA_DCR1, - &mac_val); - mac_val &= (~(0x7 << 8)); - MAC_IO_WRITE32(pAd, DMA_DCR1, - mac_val); - } - } - - /* if (MTK_REV_GTE(pAd, MT7603,MT7603E1)) { */ - mac_val = 0xfffff; - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_0, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_1, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_2, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_3, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_4, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_5, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_6, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_7, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_8, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_9, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_10, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_11, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_12, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_13, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_14, mac_val); - MAC_IO_WRITE32(pAd, MT_TXTIME_THD_15, mac_val); - MAC_IO_READ32(pAd, MT_SCH_REG_4, &mac_val); - mac_val |= 0x40; - MAC_IO_WRITE32(pAd, MT_SCH_REG_4, mac_val); - /* } */ -#if defined(MT7636_FPGA) || defined(MT7637_FPGA) -#ifdef RTMP_PCI_SUPPORT - /* MAC_IO_READ32(pAd, MT_FPGA_PSE_CLIENT_CNT, &mac_val); */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &mac_restore_val); - RemapBase = - GET_REMAP_2_BASE(MT_FPGA_PSE_CLIENT_CNT) - << 19; - RemapOffset = GET_REMAP_2_OFFSET( - MT_FPGA_PSE_CLIENT_CNT); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_READ32(pAd, 0x80000 + RemapOffset, - &mac_val); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - mac_restore_val); -#ifdef MT7636_FPGA - /* MAC_IO_WRITE32(pAd, MT_FPGA_PSE_SET_0, 0xffffffff); */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &mac_restore_val); - RemapBase = GET_REMAP_2_BASE(MT_FPGA_PSE_SET_0) - << 19; - RemapOffset = - GET_REMAP_2_OFFSET(MT_FPGA_PSE_SET_0); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_WRITE32(pAd, 0x80000 + RemapOffset, - 0xffffffff); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - mac_restore_val); - /* MAC_IO_WRITE32(pAd, MT_FPGA_PSE_SET_1, 0xffffffff); */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &mac_restore_val); - RemapBase = GET_REMAP_2_BASE(MT_FPGA_PSE_SET_1) - << 19; - RemapOffset = - GET_REMAP_2_OFFSET(MT_FPGA_PSE_SET_1); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_WRITE32(pAd, 0x80000 + RemapOffset, - 0xffffffff); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - mac_restore_val); - mac_val |= (1 << 1); -#endif /* MT7636_FPGA */ - /* FPGA PSE client will hornor this CR seeting and copy type/subtype from packet to TxD*/ -#ifdef MT7637_FPGA - mac_val &= ~((1 << 12) | (1 << 13) | (1 << 14)); -#endif /*MT7637_FPGA */ - /* MAC_IO_WRITE32(pAd, MT_FPGA_PSE_CLIENT_CNT, mac_val); */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &mac_restore_val); - RemapBase = - GET_REMAP_2_BASE(MT_FPGA_PSE_CLIENT_CNT) - << 19; - RemapOffset = GET_REMAP_2_OFFSET( - MT_FPGA_PSE_CLIENT_CNT); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_WRITE32(pAd, 0x80000 + RemapOffset, - mac_val); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - mac_restore_val); -#endif /* RTMP_PCI_SUPPORT */ -#endif /* MT7636_FPGA || MT7637_FPGA */ - /* Allen Wu WEP BB under run test */ -#if defined(MT7637_FPGA) -#ifdef RTMP_PCI_SUPPORT - /* MAC_IO_READ32(pAd, 0x60140d04, &mac_val); */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &mac_restore_val); - RemapBase = GET_REMAP_2_BASE(0x60140d04) << 19; - RemapOffset = GET_REMAP_2_OFFSET(0x60140d04); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_READ32(pAd, 0x80000 + RemapOffset, - &mac_val); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - mac_restore_val); - mac_val |= ((0x1ff << 7) | (0xff << 16) | - (0xf << 28)); - /* MAC_IO_WRITE32(pAd, 0x60140d04, mac_val); */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &mac_restore_val); - RemapBase = GET_REMAP_2_BASE(0x60140d04) << 19; - RemapOffset = GET_REMAP_2_OFFSET(0x60140d04); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - HW_IO_WRITE32(pAd, 0x80000 + RemapOffset, - mac_val); - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - mac_restore_val); -#endif /* RTMP_PCI_SUPPORT */ -#endif /* MT7637_FPGA */ - return TRUE; - } - -#endif /* DMA_SCH_SUPPORT */ - - INT32 MtAsicSetDmaByPassMode(RTMP_ADAPTER * pAd, - BOOLEAN isByPass) - { -#ifdef DMA_SCH_SUPPORT - UINT32 value; - - if (isByPass) { - /* switch to bypass mode */ - MAC_IO_READ32(pAd, SCH_REG4, &value); - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s(): SCH_REG4: 0x%x\n", - __func__, value)); - value &= ~SCH_REG4_BYPASS_MODE_MASK; - value |= SCH_REG4_BYPASS_MODE(1); -#ifdef RTMP_PCI_SUPPORT - value &= ~SCH_REG4_FORCE_QID_MASK; - value |= SCH_REG4_FORCE_QID(5); -#endif - MAC_IO_WRITE32(pAd, SCH_REG4, value); - } else { - /* Switch to normal mode */ - MAC_IO_READ32(pAd, SCH_REG4, &value); - value &= ~SCH_REG4_BYPASS_MODE_MASK; - value |= SCH_REG4_BYPASS_MODE(0); - value &= ~SCH_REG4_FORCE_QID_MASK; - value |= SCH_REG4_FORCE_QID(0); - MAC_IO_WRITE32(pAd, SCH_REG4, value); - MAC_IO_READ32(pAd, SCH_REG4, &value); - value |= (1 << 8); - MAC_IO_WRITE32(pAd, SCH_REG4, value); - MAC_IO_READ32(pAd, SCH_REG4, &value); - value &= ~(1 << 8); - MAC_IO_WRITE32(pAd, SCH_REG4, value); - } - -#endif /*DMA_SCH_SUPPORT*/ - return TRUE; - } - - /** @} */ - /** @} */ - - /** - * @addtogroup others - * @{ - * @name Other HW HAL - * @{ - */ - VOID MtAsicInitMac(RTMP_ADAPTER * pAd) - { -#ifndef MAC_INIT_OFFLOAD - UINT32 mac_val; -#endif - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("%s()-->\n", __func__)); -#ifndef MAC_INIT_OFFLOAD - /* Preparation of TxD DW2~DW6 when we need run 3DW format */ - MtAsicSetTmacInfoTemplate(pAd); - MtAsicSetBAWinSizeRange(pAd); - /* Vector report queue setting */ - MAC_IO_READ32(pAd, DMA_VCFR0, &mac_val); - mac_val |= BIT13; - MAC_IO_WRITE32(pAd, DMA_VCFR0, mac_val); - /* TMR report queue setting */ - MAC_IO_READ32(pAd, DMA_TMCFR0, &mac_val); - mac_val |= - BIT13; /* TMR report send to HIF q1. */ - mac_val = mac_val & ~(BIT0); - mac_val = mac_val & ~(BIT1); - MAC_IO_WRITE32(pAd, DMA_TMCFR0, mac_val); -#ifdef COMPOS_TESTMODE_WIN /* set default tx status from RX1 */ - MAC_IO_READ32(pAd, DMA_TCFR1, &mac_val); - mac_val |= BIT(14); - MAC_IO_WRITE32(pAd, DMA_TCFR1, mac_val); -#endif - MAC_IO_READ32(pAd, RMAC_TMR_PA, &mac_val); - mac_val = mac_val & ~BIT31; - MAC_IO_WRITE32(pAd, RMAC_TMR_PA, mac_val); - /* In MT7636, this CR will be set by FW, mgmt frame will be forward to MCU (LP, MCC) then HOST if necessary*/ - /* Configure all rx packets to HIF, except WOL2M packet */ - MAC_IO_READ32(pAd, DMA_RCFR0, &mac_val); - mac_val = 0x00010000; /* drop duplicate */ - mac_val |= - 0xc0200000; /* receive BA/CF_End/Ack/RTS/CTS/CTRL_RSVED */ - - if (pAd->rx_pspoll_filter) - mac_val |= - 0x00000008; /* Non-BAR Control frame to MCU */ - - MAC_IO_WRITE32(pAd, DMA_RCFR0, mac_val); - /* Configure Rx Vectors report to HIF */ - MAC_IO_READ32(pAd, DMA_VCFR0, &mac_val); - mac_val &= (~0x1); /* To HIF */ - mac_val |= 0x2000; /* RxRing 1 */ - MAC_IO_WRITE32(pAd, DMA_VCFR0, mac_val); - /* RMAC dropping criteria for max/min recv. packet length */ - MAC_IO_READ32(pAd, RMAC_RMACDR, &mac_val); - mac_val |= SELECT_RXMAXLEN_20BIT; - MAC_IO_WRITE32(pAd, RMAC_RMACDR, mac_val); - MAC_IO_READ32(pAd, RMAC_MAXMINLEN, &mac_val); - mac_val &= ~RMAC_DROP_MAX_LEN_MASK; - mac_val |= RMAC_DROP_MAX_LEN; - mac_val |= RMAC_DROP_MIN_LEN << 24; - MAC_IO_WRITE32(pAd, RMAC_MAXMINLEN, mac_val); -#ifndef COMPOS_WIN - /* Enable RX Group to HIF */ - MtAsicSetRxGroup(pAd, HIF_PORT, - RXS_GROUP1 | RXS_GROUP2 | - RXS_GROUP3, - TRUE); - MtAsicSetRxGroup(pAd, MCU_PORT, - RXS_GROUP1 | RXS_GROUP2 | - RXS_GROUP3, - TRUE); -#else - MtAsicSetRxGroup(pAd, HIF_PORT, RXS_GROUP3, - TRUE); - MtAsicSetRxGroup(pAd, MCU_PORT, RXS_GROUP3, - TRUE); -#endif /* !COMPOS_WIN */ - /* AMPDU BAR setting */ - /* Enable HW BAR feature */ - MtAsicSetBARTxCntLimit(pAd, TRUE, 1); - /* Configure the BAR rate setting */ - MAC_IO_READ32(pAd, AGG_ACR, &mac_val); - mac_val &= (~0xfff00000); - mac_val &= ~(AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK | - AMPDU_NO_BA_RULE); - mac_val |= AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK; - MAC_IO_WRITE32(pAd, AGG_ACR, mac_val); - /* AMPDU Statistics Range Control setting - * 0 < agg_cnt - 1 <= range_cr(0), => 1 - * range_cr(0) < agg_cnt - 1 <= range_cr(4), => 2~5 - * range_cr(4) < agg_cnt - 1 <= range_cr(14), => 6~15 - * range_cr(14) < agg_cnt - 1, => 16~ - */ - MAC_IO_READ32(pAd, AGG_ASRCR, &mac_val); - mac_val = (0 << 0) | (4 << 8) | (14 << 16); - MAC_IO_WRITE32(pAd, AGG_ASRCR, mac_val); - /* Enable MIB counters */ - MAC_IO_WRITE32(pAd, MIB_MSCR, 0x7fffffff); - MAC_IO_WRITE32(pAd, MIB_MPBSCR, 0xffffffff); - /* CCA Setting */ - MAC_IO_READ32(pAd, TMAC_TRCR, &mac_val); - mac_val &= ~CCA_SRC_SEL_MASK; - mac_val |= CCA_SRC_SEL(0x2); - mac_val &= ~CCA_SEC_SRC_SEL_MASK; - mac_val |= CCA_SEC_SRC_SEL(0x0); - MAC_IO_WRITE32(pAd, TMAC_TRCR, mac_val); - /* RCPI include ACK and Data */ - MAC_IO_READ32(pAd, WTBL_OFF_RMVTCR, &mac_val); - mac_val |= RX_MV_MODE; - MAC_IO_WRITE32(pAd, WTBL_OFF_RMVTCR, mac_val); - /* Turn on RX RIFS Mode */ - MAC_IO_READ32(pAd, TMAC_TCR, &mac_val); - mac_val |= RX_RIFS_MODE; - MAC_IO_WRITE32(pAd, TMAC_TCR, mac_val); - /* IOT issue with Realtek at CCK mode */ - mac_val = 0x003000E7; - MAC_IO_WRITE32(pAd, TMAC_CDTR, mac_val); - /* IOT issue with Linksys WUSB6300. Cannot receive BA after TX finish */ - mac_val = 0x4; - MAC_IO_WRITE32(pAd, TMAC_RRCR, mac_val); - /* send RTS/CTS if agg size >= 2 */ - MAC_IO_READ32(pAd, AGG_PCR1, &mac_val); - mac_val &= ~RTS_PKT_NUM_THRESHOLD_MASK; - mac_val |= RTS_PKT_NUM_THRESHOLD(3); - MAC_IO_WRITE32(pAd, AGG_PCR1, mac_val); -#ifdef VENDOR_FEATURE7_SUPPORT -/* Set RTS Retry from profile */ -#ifdef CONFIG_AP_SUPPORT - MtAsicSetRTSRetryCnt(pAd); -#endif -#endif - /* When WAPI + RDG, don't mask ORDER bit */ - MAC_IO_READ32(pAd, SEC_SCR, &mac_val); - mac_val &= 0xfffffffc; - MAC_IO_WRITE32(pAd, SEC_SCR, mac_val); - /* Enable Spatial Extension for RTS/CTS */ - MAC_IO_READ32(pAd, TMAC_PCR, &mac_val); - mac_val |= PTEC_SPE_EN; - MAC_IO_WRITE32(pAd, TMAC_PCR, mac_val); - /* Enable Spatial Extension for ACK/BA/CTS */ - MAC_IO_READ32(pAd, TMAC_B0BRR0, &mac_val); - mac_val |= BSSID00_RESP_SPE_EN; - MAC_IO_WRITE32(pAd, TMAC_B0BRR0, mac_val); -#ifndef BCN_OFFLOAD_SUPPORT - /*Make bcnQ move pkt to FreeQ after sent out.*/ - MAC_IO_WRITE32(pAd, AGG_BQCR, 0x23); -#endif -#if !defined(COMPOS_WIN) && !defined(COMPOS_TESTMODE_WIN) - RTMP_UPDATE_RTS_THRESHOLD( - pAd, pAd->CommonCfg.RtsPktThreshold, - pAd->CommonCfg.RtsThreshold); -#endif -#endif /* MAC_INIT_OFFLOAD */ - } - - INT32 MtAsicGetMacInfo(RTMP_ADAPTER * pAd, - UINT32 * ChipId, UINT32 * HwVer, - UINT32 * FwVer) - { - UINT32 Value; - - HW_IO_READ32(pAd, TOP_HVR, &Value); - *HwVer = Value; - HW_IO_READ32(pAd, TOP_FVR, &Value); - *FwVer = Value; - HW_IO_READ32(pAd, TOP_HCR, &Value); - *ChipId = Value; - return TRUE; - } - - INT32 MtAsicGetAntMode(RTMP_ADAPTER * pAd, - UCHAR * AntMode) - { - UINT32 Value; - - HW_IO_READ32(pAd, STRAP_STA, &Value); - *AntMode = (UCHAR)((Value >> 24) & 0x1); - return TRUE; - } - - BOOLEAN MtAsicGetMcuStatus(RTMP_ADAPTER * pAd, - MCU_STAT State) - { - UINT32 value; - - HW_IO_READ32(pAd, TOP_MISC2, &value); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("TOP_MSIC = %x\n", value)); - - /* check ram code if running, if it is, need to do optional cmd procedure */ - switch (State) { - case METH1_RAM_CODE: { - if ((value & 0x02) == 0x02) - return TRUE; - } break; - - case METH1_ROM_CODE: { - if ((value & 0x01) == 0x01 && - !(value & 0x02)) - return TRUE; - } break; - - case METH3_FW_RELOAD: { - if ((value & (BIT0 | BIT1 | BIT2)) == - (BIT0 | BIT1 | BIT2)) - return TRUE; - } break; - - case METH3_INIT_STAT: { - if ((value & BIT0) == 0x0) - return TRUE; - } break; - - case METH3_FW_PREPARE_LOAD: { - if ((value & BIT0) == BIT0) - return TRUE; - } break; - - case METH3_FW_RUN: { - if ((value & (BIT1 | BIT2)) == - (BIT1 | BIT2)) - return TRUE; - } break; - - default: - return FALSE; - } - - return FALSE; - } - - INT32 MtAsicGetFwSyncValue(RTMP_ADAPTER * pAd) - { - UINT32 value; -#define SW_SYN0 0x81021250 -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) { - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, - &RestoreValue); - RemapBase = GET_REMAP_2_BASE(SW_SYN0) - << 19; - RemapOffset = - GET_REMAP_2_OFFSET(SW_SYN0); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - RemapBase); - RTMP_IO_READ32(pAd, - 0x80000 + RemapOffset, - &value); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, - RestoreValue); - } - -#endif -#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_USB_SUPPORT) || \ - defined(RTMP_SDIO_SUPPORT) - - if (IS_RBUS_INF(pAd) || IS_USB_INF(pAd) || - IS_SDIO_INF(pAd)) { - MAC_IO_READ32(pAd, SW_SYN0, &value); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: Current SW_SYN0(%d)\n", - __func__, value)); - } - -#endif - return value; - } - - VOID MtAsicSetSMPSByDriver(RTMP_ADAPTER * pAd, - UCHAR Wcid, UCHAR Smps) - { - struct wtbl_entry tb_entry; - struct wtbl_1_struc wtbl_1; - - os_zero_mem((UCHAR *)&wtbl_1, - sizeof(struct wtbl_1_struc)); - os_zero_mem(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, Wcid, - &tb_entry) == FALSE) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, Wcid)); - return; - } - - /* WTBL1.dw2 bit19, support Dynamic SMPS */ - HW_IO_READ32(pAd, tb_entry.wtbl_addr[0] + 8, - &wtbl_1.wtbl_1_d2.word); - wtbl_1.wtbl_1_d2.field.smps = Smps; - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 8, - wtbl_1.wtbl_1_d2.word); - } - - VOID MtAsicSetSMPS(RTMP_ADAPTER * pAd, UCHAR Wcid, - UCHAR Smps) - { - MtAsicSetSMPSByDriver(pAd, Wcid, Smps); - } - - INT32 MtAsicSetDevMacByDriver( - RTMP_ADAPTER * pAd, UINT8 OwnMacIdx, - UINT8 * OwnMacAddr, UINT8 BandIdx, UINT8 Active, - UINT32 EnableFeature) - { - UINT32 val; - ULONG own_mac_reg_base = RMAC_OMA0R0; - - /* We only need to consider BandIdx in FW offload case */ - if (Active) { - val = (OwnMacAddr[0]) | - (OwnMacAddr[1] << 8) | - (OwnMacAddr[2] << 16) | - (OwnMacAddr[3] << 24); - MAC_IO_WRITE32(pAd, - own_mac_reg_base + - (OwnMacIdx * 8), - val); - val = OwnMacAddr[4] | - (OwnMacAddr[5] << 8) | (1 << 16); - MAC_IO_WRITE32(pAd, - (own_mac_reg_base + 4) + - (OwnMacIdx * 8), - val); - } - - return NDIS_STATUS_SUCCESS; - } - - INT32 MtAsicSetBssidByDriver( - RTMP_ADAPTER * pAd, - BSS_INFO_ARGUMENT_T bss_info_argument) - { - UINT32 val; - ULONG curr_bssid_reg_base = RMAC_CB0R0; -#ifdef CONFIG_AP_SUPPORT - UINT8 BssIdx = 0; -#endif - UCHAR OwnMacIdx = bss_info_argument.OwnMacIdx; - UINT8 Active = FALSE; - UCHAR *Bssid = bss_info_argument.Bssid; - - if (bss_info_argument.bss_state >= BSS_ACTIVE) - Active = TRUE; - - if (OwnMacIdx < HW_BSSID_MAX) { - if (Active) { - val = (UINT32)((Bssid[0]) | - (UINT32)(Bssid[1] - << 8) | - (UINT32)(Bssid[2] - << 16) | - (UINT32)(Bssid[3] - << 24)); - MAC_IO_WRITE32( - pAd, - curr_bssid_reg_base + - (OwnMacIdx * 8), - val); - val = (UINT32)(Bssid[4]) | - (UINT32)(Bssid[5] << 8) | - (1 << 16); - MAC_IO_WRITE32( - pAd, - (curr_bssid_reg_base + - 4) + (OwnMacIdx * 8), - val); - } - } -#ifdef CONFIG_AP_SUPPORT - else { - struct _RTMP_CHIP_CAP *cap = - hc_get_chip_cap(pAd->hdev_ctrl); - - BssIdx = (OwnMacIdx & - ~cap->ExtMbssOmacStartIdx); - MtSmacSetExtMbssEnableCR( - pAd, BssIdx, - Active); /* enable rmac 0_1~0_15 bit */ - MtSmacSetMbssHwCRSetting( - pAd, BssIdx, - Active); /* enable lp timing setting for 0_1~0_15 */ - } - -#endif - return NDIS_STATUS_SUCCESS; - } - - INT32 MtAsicSetStaRecByDriver(RTMP_ADAPTER * pAd, - STA_REC_CFG_T StaRecCfg) - { - /* Not supported this fucntion in driver */ - return NDIS_STATUS_SUCCESS; - } - -#ifdef LINUX - BOOLEAN MtSmacAsicSetDmaFqcr( - RTMP_ADAPTER * pAd, UINT8 OmacIdx, - UINT32 filter_mode, /* 0: use widx, 1: use OMAC */ - UCHAR dest_port, UCHAR dest_queue, - UCHAR target_queue, - UCHAR widx /* only work if filter mode is by widx. */ - ) - { - BOOLEAN flushResult = TRUE; - UINT32 val = 0, temp = 0, own_mac = 0; - UCHAR j = 0; - - val = (DMA_FQCR0_FQ_EN | filter_mode | - DMA_FQCR0_FQ_DEST_QID(dest_queue) | - DMA_FQCR0_FQ_DEST_PID(dest_port) | - DMA_FQCR0_FQ_TARG_QID(target_queue)); - - if (filter_mode == DMA_FQCR0_FQ_MODE_OMAC) { - own_mac = OmacIdx; - val = val | - DMA_FQCR0_FQ_TARG_OM(own_mac); - } else if (filter_mode == - DMA_FQCR0_FQ_MODE_WIDX) - val = val | - DMA_FQCR0_FQ_TARG_WIDX(widx); - - MAC_IO_WRITE32(pAd, DMA_FQCR0, val); - - while (1) { - MAC_IO_READ32( - pAd, DMA_FQCR0, - &temp); /* check flush status */ - - if (temp & DMA_FQCR0_FQ_EN) { - j++; - os_msec_delay(1); - - if (j > 200) { - MTWF_LOG( - DBG_CAT_ALL, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s, flush take too long!\n", - __func__)); - flushResult = FALSE; - return flushResult; - } - } else - break; - } - - /* check filter resilt */ - MAC_IO_READ32(pAd, DMA_FQCR1, &temp); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("flush result = %x\n", temp)); - - if (temp == 0xffffff) { - flushResult = FALSE; - return flushResult; - } - - return flushResult; - } - - BOOLEAN MtSmacAsicSetArbBcnQCR(RTMP_ADAPTER * pAd, - UINT8 OmacIdx, - BOOLEAN enable) - { - UINT32 val = 0, temp = 0, own_mac = 0, - operBit = 0; - UCHAR j = 0; - BOOLEAN flushResult = TRUE; - - own_mac = OmacIdx; - - if (own_mac > HW_BSSID_MAX) { - /*ext start from bit16. ownMac is start from 0x11 */ - operBit = own_mac - 1; - } else - operBit = own_mac; - - val = val | (1 << operBit); - - if (enable == FALSE) { - /* Flush Beacon Queue */ - MAC_IO_WRITE32(pAd, ARB_BCNQCR1, val); - - while (1) { - /* check bcn_flush cr status */ - MAC_IO_READ32(pAd, ARB_BCNQCR1, - &temp); - - if (temp & val) { - j++; - os_msec_delay(1); - - if (j > 200) { - MTWF_LOG( - DBG_CAT_ALL, - DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s, bcn_flush too long!\n", - __func__)); - flushResult = - FALSE; - return flushResult; - } - } else - break; - } - } else if (enable == TRUE) { - MAC_IO_READ32( - pAd, ARB_BCNQCR0, - &temp); /* re-enable bcn_start */ - temp = temp | val; - MAC_IO_WRITE32(pAd, ARB_BCNQCR0, temp); - } - - return flushResult; - } - - BOOLEAN MtSmacAsicEnableBeacon(RTMP_ADAPTER * pAd, - VOID * wdev_void) - { - struct wifi_dev *wdev = - (struct wifi_dev *)wdev_void; - BOOLEAN OperationResult = TRUE; - BCN_BUF_STRUC *bcn_info = &wdev->bcn_buf; - - if (bcn_info->BcnUpdateMethod == - BCN_GEN_BY_FW) { - /* FW help to disable beacon. */ - } else if (bcn_info->BcnUpdateMethod == - BCN_GEN_BY_HOST_IN_PRETBTT) { - OperationResult = - MtSmacAsicSetArbBcnQCR( - pAd, wdev->OmacIdx, - TRUE); - - if (OperationResult == FALSE) - return FALSE; - - /* beacon start for USB/SDIO */ - asic_bss_beacon_start(pAd); - } - - return TRUE; - } - - BOOLEAN MtSmacAsicDisableBeacon(RTMP_ADAPTER * pAd, - VOID * wdev_void) - { - struct wifi_dev *wdev = - (struct wifi_dev *)wdev_void; - BCN_BUF_STRUC *bcn_info = &wdev->bcn_buf; - BOOLEAN OperationResult = TRUE; - - if (bcn_info->BcnUpdateMethod == - BCN_GEN_BY_FW) { - /* FW help to disable beacon. */ - } else if (bcn_info->BcnUpdateMethod == - BCN_GEN_BY_HOST_IN_PRETBTT) { - /* beacon stopfor USB/SDIO */ - asic_bss_beacon_stop(pAd); - - OperationResult = - MtSmacAsicSetArbBcnQCR( - pAd, wdev->OmacIdx, - FALSE); - - if (OperationResult == FALSE) - return FALSE; - - OperationResult = MtSmacAsicSetDmaFqcr( - pAd, wdev->OmacIdx, - DMA_FQCR0_FQ_MODE_OMAC, - ENUM_SWITCH_PORT_3, - ENUM_SWITCH_FREE_Q_8, - ENUM_LMAC_TX_BEACON_Q_7, 0); - - if (OperationResult == FALSE) - return FALSE; - - RTMP_SEM_LOCK(&pAd->BcnRingLock); - bcn_info->bcn_state = BCN_TX_IDLE; - RTMP_SEM_UNLOCK(&pAd->BcnRingLock); - } - - return TRUE; - } - -#endif /*LINUX*/ - - UINT32 MtAsicGetChBusyCnt(RTMP_ADAPTER * pAd, - UCHAR ch_idx) - { - UINT32 msdr16; - - MAC_IO_READ32(pAd, MIB_MSDR16, &msdr16); - msdr16 &= 0x00ffffff; - return msdr16; - } - - INT MtAsicGetTsfTimeByDriver(struct _RTMP_ADAPTER * pAd, - UINT32 * high_part, - UINT32 * low_part, - UCHAR HwBssidIdx) - { - UINT32 Value = 0; - - MAC_IO_READ32(pAd, LPON_T0CR, &Value); - Value = (Value & TSF_TIMER_HW_MODE_MASK) | - TSF_TIMER_VALUE_READ; /* keep HW mode value. */ - /* Value = Value | TSF_TIMER_VALUE_READ; */ - MAC_IO_WRITE32(pAd, LPON_T0CR, Value); - MAC_IO_READ32(pAd, LPON_UTTR0, low_part); - MAC_IO_READ32(pAd, LPON_UTTR1, high_part); - return TRUE; - } - - /* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ - VOID MtAsicSetSlotTime(RTMP_ADAPTER * pAd, - UINT32 SlotTime, UINT32 SifsTime, - UCHAR BandIdx) - { - UINT32 RifsTime = RIFS_TIME; - UINT32 EifsTime = EIFS_TIME; - - MtCmdSlotTimeSet(pAd, (UINT8)SlotTime, - (UINT8)SifsTime, - (UINT8)RifsTime, - (UINT16)EifsTime, BandIdx); - } - -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) - VOID MtAsicGetTxTscByDriver(RTMP_ADAPTER * pAd, - struct wifi_dev * wdev, - UCHAR * pTxTsc) - { - /* Do nothing for testmode */ - } -#else - VOID MtAsicGetTxTscByDriver(RTMP_ADAPTER * pAd, - struct wifi_dev * wdev, - UCHAR * pTxTsc) - { - USHORT Wcid; - struct wtbl_entry tb_entry; - UINT32 addr = 0, val = 0; - - GET_GroupKey_WCID(wdev, Wcid); - os_zero_mem(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, Wcid, &tb_entry) == - FALSE) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, Wcid)); - return; - } - - addr = pAd->mac_ctrl.wtbl_base_addr[1] + - Wcid * pAd->mac_ctrl.wtbl_entry_size[1]; - HW_IO_READ32(pAd, addr, &val); - *pTxTsc = val & 0xff; - *(pTxTsc + 1) = (val >> 8) & 0xff; - *(pTxTsc + 2) = (val >> 16) & 0xff; - *(pTxTsc + 3) = (val >> 24) & 0xff; - HW_IO_READ32(pAd, addr + 4, &val); - *(pTxTsc + 4) = val & 0xff; - *(pTxTsc + 5) = (val >> 8) & 0xff; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): WCID(%d) TxTsc 0x%02x-0x%02x-0x%02x-0x%02x-0x%02x-0x%02x\n", - __func__, Wcid, *pTxTsc, *(pTxTsc + 1), - *(pTxTsc + 2), *(pTxTsc + 3), *(pTxTsc + 4), - *(pTxTsc + 5))); - } -#endif - - INT MtAsicTOPInit(RTMP_ADAPTER * pAd) - { -#if defined(MT7615_FPGA) || defined(MT7622_FPGA) || defined(P18_FPGA) - struct _RTMP_CHIP_OP *ops = - hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->chk_top_default_cr_setting) - ops->chk_top_default_cr_setting(pAd); - if (ops->chk_hif_default_cr_setting) - ops->chk_hif_default_cr_setting(pAd); -#endif -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || \ - defined(MT7637_FPGA) - /* TODO: shiang-7603 */ -#ifdef MT7628_FPGA - UINT32 mac_val; - /* enable MAC circuit */ - HW_IO_READ32(pAd, 0x2108, &mac_val); - mac_val &= (~0x7ff0); - HW_IO_WRITE32(pAd, 0x2108, mac_val); - mac_val = 0x3e013; - MAC_IO_WRITE32(pAd, 0x2d004, mac_val); -#endif /* MT7628_FPGA */ - MAC_IO_WRITE32(pAd, 0x24088, - 0x900); /* Set 40MHz Clock */ - MAC_IO_WRITE32( - pAd, 0x2d034, - 0x64180003); /* Set 32k clock, this clock is used for lower power. */ -#endif /* defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || defined(MT7637_FPGA)*/ - return TRUE; - } - -#ifdef CONFIG_AP_SUPPORT - VOID MtAsicSetMbssLPOffset(struct _RTMP_ADAPTER * pAd, - UCHAR mbss_idx, - BOOLEAN enable) - { - UINT32 Value = 0; - /* where the register for sub Bssid start from */ - UINT32 bssid_reg_base = LPON_SBTOR1; - BOOLEAN any_other_mbss_enable = FALSE; - - ASSERT(mbss_idx >= 1); - - if (enable == TRUE) { - /* if there is any sub bssid is enable. this bit in LPON_SBTOR1 shall be 1 always. */ - MAC_IO_READ32(pAd, bssid_reg_base, - &Value); - Value |= SBSS_TBTT0_TSF0_EN; - MAC_IO_WRITE32(pAd, bssid_reg_base, - Value); - MAC_IO_READ32(pAd, - (bssid_reg_base + - (mbss_idx - 1) * (0x4)), - &Value); - Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK; - Value |= SUB_BSSID0_TIME_OFFSET_n( - mbss_idx * - BCN_TRANSMIT_ESTIMATE_TIME); - Value |= TBTT0_n_INT_EN; - Value |= PRE_TBTT0_n_INT_EN; - MAC_IO_WRITE32(pAd, - (bssid_reg_base + - (mbss_idx - 1) * (0x4)), - Value); - pAd->ApCfg.ext_mbss_enable_bitmap |= - (enable << mbss_idx); - } else { - pAd->ApCfg.ext_mbss_enable_bitmap &= - ~(enable << mbss_idx); - - if (pAd->ApCfg.ext_mbss_enable_bitmap) - any_other_mbss_enable = TRUE; - - /* if there is any ext bssid is enable. this bit in LPON_SBTOR1 shall be 1 always. */ - MAC_IO_READ32(pAd, bssid_reg_base, - &Value); - - if (any_other_mbss_enable == TRUE) - Value |= SBSS_TBTT0_TSF0_EN; - else - Value &= ~SBSS_TBTT0_TSF0_EN; - - MAC_IO_WRITE32(pAd, bssid_reg_base, - Value); - MAC_IO_READ32(pAd, - (bssid_reg_base + - (mbss_idx - 1) * (0x4)), - &Value); - Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK; - Value &= ~TBTT0_n_INT_EN; - Value &= ~PRE_TBTT0_n_INT_EN; - MAC_IO_WRITE32(pAd, - (bssid_reg_base + - (mbss_idx - 1) * (0x4)), - Value); - } - } - - VOID MtSmacSetMbssHwCRSetting(RTMP_ADAPTER * pAd, - UCHAR mbss_idx, - BOOLEAN enable) - { - MtAsicSetMbssLPOffset(pAd, mbss_idx, enable); - } - - VOID MtSmacSetExtMbssEnableCR(RTMP_ADAPTER * pAd, - UCHAR mbss_idx, - BOOLEAN enable) - { - UINT32 regValue; - - if (enable) { - MAC_IO_READ32(pAd, RMAC_ACBEN, - ®Value); - regValue |= (1 << mbss_idx); - MAC_IO_WRITE32(pAd, RMAC_ACBEN, - regValue); - } else { - MAC_IO_READ32(pAd, RMAC_ACBEN, - ®Value); - regValue &= ~(1 << mbss_idx); - MAC_IO_WRITE32(pAd, RMAC_ACBEN, - regValue); - } - } - - VOID MtAsicSetExtTTTTLPOffset( - struct _RTMP_ADAPTER * pAd, UCHAR mbss_idx, - BOOLEAN enable) - { - UINT32 Value = 0; - /* where the register for sub Bssid start from */ - UINT32 bssid_reg_base = - LPON_TT0SBOR_CR_MAPPING_TABLE[mbss_idx]; - UINT32 first_reg_base = - LPON_TT0SBOR_CR_MAPPING_TABLE[1]; - BOOLEAN any_other_mbss_tttt_enable = FALSE; - - if (mbss_idx == 0) - return; - - if (enable == TRUE) { - /* if there is any sub bssid is enable. this bit in LPON_SBTOR1 shall be 1 always. */ - MAC_IO_READ32(pAd, first_reg_base, - &Value); - Value |= SBSS_TTTT0_TSF0_EN; - MAC_IO_WRITE32(pAd, first_reg_base, - Value); - MAC_IO_READ32(pAd, bssid_reg_base, - &Value); - Value &= ~SUB_BSSID0_TTTT_OFFSET_n_MASK; - Value |= DEFAULT_TTTT_OFFSET_IN_MS; - Value |= TTTT0_n_INT_EN; - Value |= PRE_TTTT0_n_INT_EN; - MAC_IO_WRITE32(pAd, bssid_reg_base, - Value); - pAd->ApCfg.ext_mbss_tttt_enable_bitmap |= - (enable << mbss_idx); - } else { - pAd->ApCfg.ext_mbss_tttt_enable_bitmap &= - ~(enable << mbss_idx); - - if (pAd->ApCfg - .ext_mbss_tttt_enable_bitmap) - any_other_mbss_tttt_enable = - TRUE; - - /* if there is any ext bssid is enable. this bit shall be 1 always. */ - MAC_IO_READ32(pAd, first_reg_base, - &Value); - - if (any_other_mbss_tttt_enable == TRUE) - Value |= SBSS_TTTT0_TSF0_EN; - else - Value &= ~SBSS_TTTT0_TSF0_EN; - - MAC_IO_WRITE32(pAd, first_reg_base, - Value); - MAC_IO_READ32(pAd, bssid_reg_base, - &Value); - Value &= ~TTTT0_n_INT_EN; - Value &= ~PRE_TTTT0_n_INT_EN; - MAC_IO_WRITE32(pAd, bssid_reg_base, - Value); - } - } - - VOID MtSmacSetExtTTTTHwCRSetting(RTMP_ADAPTER * pAd, - UCHAR mbss_idx, - BOOLEAN enable) - { - MtAsicSetExtTTTTLPOffset(pAd, mbss_idx, enable); - } -#endif /* CONFIG_AP_SUPPORT */ - -#ifndef COMPOS_TESTMODE_WIN - VOID MtSetTmrCal(IN PRTMP_ADAPTER pAd, IN UCHAR TmrType, - IN UCHAR Channel, IN UCHAR Bw) - { - UINT32 value = 0; - - MAC_IO_READ32(pAd, TMAC_B0BRR0, &value); - - if (TmrType == TMR_DISABLE) - /* Enanle Spatial Extension for ACK/BA/CTS after TMR Disable*/ - value |= BSSID00_RESP_SPE_EN; - else - /* Disable Spatial Extension for ACK/BA/CTS when TMR Enable*/ - value &= ~BSSID00_RESP_SPE_EN; - - MAC_IO_WRITE32(pAd, TMAC_B0BRR0, value); - MtCmdTmrCal(pAd, TmrType, - (Channel > 14 ? _A_BAND : _G_BAND), - Bw, 0, /* Ant 0 at present */ - TmrType); - } - - VOID MtSetTmrCR(IN PRTMP_ADAPTER pAd, IN UCHAR TmrType) - { - UINT32 value = 0; - - MAC_IO_READ32(pAd, RMAC_TMR_PA, &value); - /* Clear role bit */ - value &= ~RMAC_TMR_ROLE; - - if (TmrType == TMR_DISABLE) - value &= ~RMAC_TMR_ENABLE; - else { - value |= RMAC_TMR_ENABLE; - - if (TmrType == TMR_RESPONDER) { - value |= RMAC_TMR_ROLE; - /* Set type/sub_type to Action frame */ - value &= - 0xffffffc0; /* clear type/sub_type field */ - value |= (SUBTYPE_ACTION << 2) | - FC_TYPE_MGMT; - } - } - - MAC_IO_WRITE32(pAd, RMAC_TMR_PA, value); - } -#endif - -#ifdef LINUX - INT MtSmacAsicArchOpsInit(RTMP_ADAPTER * pAd) - { - RTMP_ARCH_OP *arch_ops = &pAd->archOps; - - arch_ops->archDisableBeacon = - MtSmacAsicDisableBeacon; - arch_ops->archEnableBeacon = - MtSmacAsicEnableBeacon; -#ifdef CONFIG_AP_SUPPORT - arch_ops->archSetMbssWdevIfAddr = - MtAsicSetMbssWdevIfAddrGen1; - arch_ops->archSetMbssHwCRSetting = - MtSmacSetMbssHwCRSetting; - arch_ops->archSetExtTTTTHwCRSetting = - MtSmacSetExtTTTTHwCRSetting; - arch_ops->archSetExtMbssEnableCR = - MtSmacSetExtMbssEnableCR; -#endif /* CONFIG_AP_SUPPORT */ - arch_ops->archGetTsfTime = - MtAsicGetTsfTimeByDriver; - arch_ops->archSetPreTbtt = MtAsicSetPreTbtt; -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - arch_ops->archSetReptFuncEnable = - MtAsicSetReptFuncEnableByDriver; - arch_ops->archInsertRepeaterEntry = - MtAsicInsertRepeaterEntry; - arch_ops->archRemoveRepeaterEntry = - MtAsicRemoveRepeaterEntry; - arch_ops->archInsertRepeaterRootEntry = - MtAsicInsertRepeaterRootEntry; -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ - arch_ops->archDisableSync = - MtAsicDisableSyncByDriver; - arch_ops->archSetSyncModeAndEnable = - MtAsicEnableBssSyncByDriver; - arch_ops->archRxHeaderTransCtl = NULL; - arch_ops->archRxHeaderTaranBLCtl = NULL; - return TRUE; - } -#endif /*LINUX*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt_dmac.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt_dmac.c deleted file mode 100644 index 8887c687e1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt_dmac.c +++ /dev/null @@ -1,3901 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_asic_mt.c - - Abstract: - Functions used to communicate with ASIC - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifdef COMPOS_WIN -#include "MtConfig.h" -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -#include "hdev/hdev.h" - -extern const UCHAR wmm_aci_2_hw_ac_queue[18]; - -#if defined(MT7615) -VOID EnhancedPDMAInit(RTMP_ADAPTER *pAd) -{ - UINT32 value = 0; - /* PDMA related features for MT7615 E3 */ - value = TXP_ACTIVE_MODE(0x1); - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG_1, value); - value = TX_RING0_DMAD_PRE_HI_PRI_NUM(0x3) | - TX_RING1_DMAD_PRE_HI_PRI_NUM(0x3); - HIF_IO_WRITE32(pAd, MT_WPDMA_TX_PRE_CFG, value); - value = RX_RING0_DMAD_PRE_HI_PRI_NUM(0x7f) | - RX_RING1_DMAD_PRE_HI_PRI_NUM(0xf); - HIF_IO_WRITE32(pAd, MT_WPDMA_RX_PRE_CFG, value); - value = TRX_DFET_ABT_TYPE(0x2) | TRX_PFET_ABT_TYPE(0x1) | - PDMA_DFET_PFET_ABT_TYPE(0x2) | WRR_TIME_SLOT_DURATION(0x400); - HIF_IO_WRITE32(pAd, MT_WPDMA_ABT_CFG, value); - value = WRR_TIME_SLOT_PRIORITY_0(0x1) | WRR_TIME_SLOT_PRIORITY_1(0x0) | - WRR_TIME_SLOT_PRIORITY_2(0x0) | WRR_TIME_SLOT_PRIORITY_3(0x2) | - WRR_TIME_SLOT_PRIORITY_4(0x0) | WRR_TIME_SLOT_PRIORITY_5(0x2) | - WRR_TIME_SLOT_PRIORITY_6(0x1) | WRR_TIME_SLOT_PRIORITY_7(0x0) | - WRR_TIME_SLOT_PRIORITY_8(0x1) | WRR_TIME_SLOT_PRIORITY_9(0x0) | - WRR_TIME_SLOT_PRIORITY_10(0x0) | - WRR_TIME_SLOT_PRIORITY_11(0x2) | - WRR_TIME_SLOT_PRIORITY_12(0x0) | - WRR_TIME_SLOT_PRIORITY_13(0x2) | - WRR_TIME_SLOT_PRIORITY_14(0x1) | WRR_TIME_SLOT_PRIORITY_15(0x0); - HIF_IO_WRITE32(pAd, MT_WPDMA_ABT_CFG1, value); -} - -#endif - -#ifdef CONFIG_AP_SUPPORT -/* because of the CR arrangement in HW are not in sequence, wrape the table to search fast.*/ -static UINT32 LPON_TT0SBOR_CR_MAPPING_TABLE[] = { - LPON_TT0TPCR, LPON_TT0SBOR1, LPON_TT0SBOR2, LPON_TT0SBOR3, - LPON_TT0SBOR4, LPON_TT0SBOR5, LPON_TT0SBOR6, LPON_TT0SBOR7, - LPON_TT0SBOR8, LPON_TT0SBOR9, LPON_TT0SBOR10, LPON_TT0SBOR11, - LPON_TT0SBOR12, LPON_TT0SBOR13, LPON_TT0SBOR14, LPON_TT0SBOR15, -}; -#endif /*CONFIG_AP_SUPPORT*/ - -static BOOLEAN WtblWaitIdle(RTMP_ADAPTER *pAd, UINT32 WaitCnt, UINT32 WaitDelay) -{ - UINT32 Value, CurCnt = 0; - - do { - MAC_IO_READ32(pAd, WTBL_OFF_WIUCR, &Value); - - if ((Value & WTBL_IU_BUSY) == 0) - break; - - CurCnt++; - RtmpusecDelay(WaitDelay); - } while (CurCnt < WaitCnt); - - if (CurCnt == WaitCnt) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Previous update not applied by HW yet!(reg_val=0x%x)\n", - __func__, Value)); - return FALSE; - } - - return TRUE; -} - -UINT32 MtAsicGetCrcErrCnt(RTMP_ADAPTER *pAd) -{ - return 0; -} - -UINT32 MtAsicGetPhyErrCnt(RTMP_ADAPTER *pAd) -{ - return 0; -} - -UINT32 MtAsicGetCCACnt(RTMP_ADAPTER *pAd) -{ -#ifdef CUSTOMER_DCC_FEATURE - UINT32 PD_CNT, MDRDY_CNT, CCKFalseCCACount, OFDMFalseCCACount; - UINT32 False_cca_count, CrValue; - - /* FALSE CCA Count */ - HW_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS0, &CrValue); /* PD count */ - PD_CNT = CrValue; - HW_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS5, &CrValue); /* MDRDY count */ - MDRDY_CNT = CrValue; - - CCKFalseCCACount = (PD_CNT & 0xffff) - (MDRDY_CNT & 0xffff); - OFDMFalseCCACount = ((PD_CNT & 0xffff0000) >> 16) - - ((MDRDY_CNT & 0xffff0000) >> 16); - False_cca_count = CCKFalseCCACount + OFDMFalseCCACount; - - /* reset PD and MDRDY count */ - HW_IO_READ32(pAd, PHY_BAND0_PHYMUX_5, &CrValue); - CrValue &= 0xff8fffff; - HW_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, CrValue); /* Reset */ - CrValue |= 0x500000; - HW_IO_WRITE32(pAd, PHY_BAND0_PHYMUX_5, CrValue); /* Enable */ - - return False_cca_count; -#endif - - return 0; -} - -UINT32 MtAsicGetChBusyCnt(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - UINT32 msdr16 = 0; -#ifdef CONFIG_AP_SUPPORT -#ifdef OFFCHANNEL_SCAN_FEATURE - - if (pAd->ScanCtrl.ScanTime[pAd->ScanCtrl.CurrentGivenChan_Index] != 0) { - UINT32 OBSSAirtime, MyTxAirtime, MyRxAirtime; - UINT32 CrValue; - UINT32 ChBusytime; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s]: Scan time : %u \n", __LINE__, __func__, - pAd->ScanCtrl.ScanTime - [pAd->ScanCtrl.CurrentGivenChan_Index])); - if ((pAd->CommonCfg.dbdc_mode) && - (pAd->ChannelInfo.bandidx == DBDC_BAND1)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s]: Band 1\n", __LINE__, __func__)); - HW_IO_READ32(pAd, RMAC_MIBTIME6, &CrValue); - OBSSAirtime = CrValue; - - /*My Tx Air time*/ - HW_IO_READ32(pAd, MIB_M1SDR36, &CrValue); - MyTxAirtime = (CrValue & 0xffffff); - - /*My Rx Air time*/ - HW_IO_READ32(pAd, MIB_M1SDR37, &CrValue); - MyRxAirtime = (CrValue & 0xffffff); - } else { /*band 0*/ - /*OBSS Air time*/ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s]: Band 0\n", __LINE__, __func__)); - HW_IO_READ32(pAd, RMAC_MIBTIME5, &CrValue); - OBSSAirtime = CrValue; - - /*My Tx Air time*/ - HW_IO_READ32(pAd, MIB_M0SDR36, &CrValue); - MyTxAirtime = (CrValue & 0xffffff); - - /*My Rx Air time*/ - HW_IO_READ32(pAd, MIB_M0SDR37, &CrValue); - MyRxAirtime = (CrValue & 0xffffff); - } - pAd->ChannelInfo.ChStats.Tx_Time = MyTxAirtime; - pAd->ChannelInfo.ChStats.Rx_Time = MyRxAirtime; - pAd->ChannelInfo.ChStats.Obss_Time = OBSSAirtime; - /*Ch Busy time*/ - ChBusytime = OBSSAirtime + MyTxAirtime + MyRxAirtime; - - /*Reset OBSS Air time*/ - HW_IO_READ32(pAd, RMAC_MIBTIME0, &CrValue); - CrValue |= 1 << RX_MIBTIME_CLR_OFFSET; - CrValue |= 1 << RX_MIBTIME_EN_OFFSET; - HW_IO_WRITE32(pAd, RMAC_MIBTIME0, CrValue); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d][%s]: ChannelBusyTime : %u\n", __LINE__, - __func__, ChBusytime)); - - return ChBusytime; - } -#endif - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - if (pAd->CommonCfg.dbdc_mode == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: SB Band0\n", __func__)); - MAC_IO_READ32(pAd, MIB_M0SDR16, &msdr16); - } else { - switch (BandIdx) { - case BAND0: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: DBDC Band0\n", __func__)); - MAC_IO_READ32(pAd, MIB_M0SDR16, &msdr16); - break; - case BAND1: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: DBDC Band1\n", __func__)); - MAC_IO_READ32(pAd, MIB_M1SDR16, &msdr16); - break; - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: DBDC BandIdx ERROR:%d\n", __func__, - BandIdx)); - break; - } - } - msdr16 &= 0x00ffffff; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -#endif /* CONFIG_AP_SUPPORT */ - return msdr16; -} - -INT MtAsicSetAutoFallBack(RTMP_ADAPTER *pAd, BOOLEAN enable) -{ - /* Not support for HIF_MT */ - return FALSE; -} - -INT32 MtAsicAutoFallbackInit(RTMP_ADAPTER *pAd) -{ - UINT32 Value; - - MAC_IO_READ32(pAd, AGG_ARUCR, &Value); - Value &= ~RATE1_UP_MPDU_LIMIT_MASK; - Value |= RATE1_UP_MPDU_LINIT(2); - Value &= ~RATE2_UP_MPDU_LIMIT_MASK; - Value |= RATE2_UP_MPDU_LIMIT(2); - Value &= ~RATE3_UP_MPDU_LIMIT_MASK; - Value |= RATE3_UP_MPDU_LIMIT(2); - Value &= ~RATE4_UP_MPDU_LIMIT_MASK; - Value |= RATE4_UP_MPDU_LIMIT(2); - Value &= ~RATE5_UP_MPDU_LIMIT_MASK; - Value |= RATE5_UP_MPDU_LIMIT(1); - Value &= ~RATE6_UP_MPDU_LIMIT_MASK; - Value |= RATE6_UP_MPDU_LIMIT(1); - Value &= ~RATE7_UP_MPDU_LIMIT_MASK; - Value |= RATE7_UP_MPDU_LIMIT(1); - Value &= ~RATE8_UP_MPDU_LIMIT_MASK; - Value |= RATE8_UP_MPDU_LIMIT(1); - MAC_IO_WRITE32(pAd, AGG_ARUCR, Value); - MAC_IO_READ32(pAd, AGG_ARDCR, &Value); - Value &= ~RATE1_DOWN_MPDU_LIMIT_MASK; - Value |= RATE1_DOWN_MPDU_LIMIT(0); - Value &= ~RATE2_DOWN_MPDU_LIMIT_MASK; - Value |= RATE2_DOWN_MPDU_LIMIT(0); - Value &= ~RATE3_DOWN_MPDU_LIMIT_MASK; - Value |= RATE3_DOWN_MPDU_LIMIT(0); - Value &= ~RATE4_DOWN_MPDU_LIMIT_MASK; - Value |= RATE4_DOWN_MPDU_LIMIT(0); - Value &= ~RATE5_DOWN_MPDU_LIMIT_MASK; - Value |= RATE5_DOWN_MPDU_LIMIT(0); - Value &= ~RATE6_DOWN_MPDU_LIMIT_MASK; - Value |= RATE6_DOWN_MPDU_LIMIT(0); - Value &= ~RATE7_DOWN_MPDU_LIMIT_MASK; - Value |= RATE7_DOWN_MPDU_LIMIT(0); - Value &= ~RATE8_DOWN_MPDU_LIMIT_MASK; - Value |= RATE8_DOWN_MPDU_LIMIT(0); - MAC_IO_WRITE32(pAd, AGG_ARDCR, Value); - MAC_IO_READ32(pAd, AGG_ARCR, &Value); - Value |= INI_RATE1; - Value |= FB_SGI_DIS; - Value &= ~RTS_RATE_DOWN_TH_MASK; - Value &= ~RATE_DOWN_EXTRA_RATIO_MASK; - Value |= RATE_DOWN_EXTRA_RATIO(2); - Value |= RATE_DOWN_EXTRA_RATIO_EN; - Value &= ~RATE_UP_EXTRA_TH_MASK; - Value |= RATE_UP_EXTRA_TH(4); - MAC_IO_WRITE32(pAd, AGG_ARCR, Value); - Value = tx_rate_to_tmi_rate(MODE_HTMIX, MCS_1, 1, FALSE, 0); - MAC_IO_WRITE32(pAd, AGG_ARCR1, Value); - return TRUE; -} - -/* - * ======================================================================== - * - * Routine Description: - * Set MAC register value according operation mode. - * OperationMode AND bNonGFExist are for MM and GF Proteciton. - * If MM or GF mask is not set, those passing argument doesn't not take effect. - * - * Operation mode meaning: - * = 0 : Pure HT, no preotection. - * = 0x01; there may be non-HT devices in both the control and extension channel, protection is optional in BSS. - * = 0x10: No Transmission in 40M is protected. - * = 0x11: Transmission in both 40M and 20M shall be protected - * if (bNonGFExist) - * we should choose not to use GF. But still set correct ASIC registers. - * ======================================================================== - */ -VOID MtAsicUpdateProtect(IN PRTMP_ADAPTER pAd, IN MT_PROTECT_CTRL_T *Protect) -{ - UINT32 val = 0; - - MAC_IO_READ32(pAd, AGG_PCR, &val); - /* B/G Protection */ - val &= ~ERP_PROTECTION_MASK; - val |= ERP_PROTECTION(Protect->erp_mask); - /* RIFS Protection */ - val &= ~RIFS_PROTECTION; - - if (Protect->rifs) { - /* TX_RIFS_EN of RCR is enable, - * HW will switch to Long NAV protection, - * ignoring PROTECTION_MODE bit - */ - val |= RIFS_PROTECTION; - } - - /* NAV Protection */ - if (Protect->long_nav) - val &= ~PROTECTION_MODE; - else - val |= PROTECTION_MODE; - - /* Green Field Protectio */ - val &= ~GF_PROTECTION; - - if (Protect->gf) - val |= GF_PROTECTION; - - /* Other HT Protection */ - val &= ~(MM_PROTECTION | BW40_PROTECTION | BW80_PROTECTION | - BW160_PROTECTION); - - if (Protect->mix_mode) - val |= MM_PROTECTION; - - if (Protect->bw40) - val |= BW40_PROTECTION; - - if (Protect->bw80) - val |= BW80_PROTECTION; - - if (Protect->bw160) - val |= BW160_PROTECTION; - - MAC_IO_WRITE32(pAd, AGG_PCR, val); -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID MtAsicSwitchChannel(RTMP_ADAPTER *pAd, MT_SWITCH_CHANNEL_CFG SwChCfg) -{ - UINT32 val, reg; - - /* TODO: Need to fix */ - /* TODO: shiang-usw, unify the ops */ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->ChipSwitchChannel) - ops->ChipSwitchChannel(pAd, SwChCfg); - else - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("For this chip, no specified channel switch function!\n")); - - /* TODO: shiang-7615 */ - if (SwChCfg.BandIdx) - reg = RMAC_CHFREQ1; - else - reg = RMAC_CHFREQ0; - - MAC_IO_READ32(pAd, reg, &val); - val &= (~0xff); - val |= SwChCfg.ControlChannel; - MAC_IO_WRITE32(pAd, reg, val); -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ - -VOID MtAsicResetBBPAgent(RTMP_ADAPTER *pAd) -{ - /* Still need to find why BBP agent keeps busy, but in fact, hardware still function ok. Now clear busy first. */ - /* IF ops->AsicResetBbpAgent == NULL, run "else" part */ - /* TODO: shiang-usw, unify the ops */ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->AsicResetBbpAgent != NULL) - ops->AsicResetBbpAgent(pAd); -} - -/* - * ========================================================================== - * Description: - * Set My BSSID - * - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -/* CFG_TODO */ -#ifdef CONFIG_AP_SUPPORT -VOID MtAsicSetMbssMode(RTMP_ADAPTER *pAd, UCHAR NumOfMacs) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): No Function for HIF_MT!\n", __func__, __LINE__)); -} -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT -/* TODO: Carter/Star for Repeater can support DBDC, after define STA/APCLI/Repeater */ -INT MtAsicSetReptFuncEnableByDriver(RTMP_ADAPTER *pAd, BOOLEAN bEnable) -{ - RMAC_MORE_STRUC rmac_more; - - MAC_IO_READ32(pAd, RMAC_MORE, &rmac_more.word); - - if (bEnable == 0) - rmac_more.field.muar_mode_sel = 0; - else - rmac_more.field.muar_mode_sel = 1; - - /* configure band 0/band 1 into repeater mode concurrently. */ - MAC_IO_WRITE32(pAd, RMAC_MORE, rmac_more.word); - MAC_IO_WRITE32(pAd, RMAC_MORE_BAND_1, rmac_more.word); - return TRUE; -} - -VOID MtAsicInsertRepeaterEntryByDriver(IN PRTMP_ADAPTER pAd, IN UCHAR CliIdx, - IN PUCHAR pAddr) -{ - UCHAR tempMAC[MAC_ADDR_LEN]; - RMAC_MAR0_STRUC rmac_mcbcs0; - RMAC_MAR1_STRUC rmac_mcbcs1; - - COPY_MAC_ADDR(tempMAC, pAddr); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n%s %02x:%02x:%02x:%02x:%02x:%02x-%02x\n", __func__, - tempMAC[0], tempMAC[1], tempMAC[2], tempMAC[3], tempMAC[4], - tempMAC[5], CliIdx)); - NdisZeroMemory(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - rmac_mcbcs0.addr_31_0 = tempMAC[0] + (tempMAC[1] << 8) + - (tempMAC[2] << 16) + (tempMAC[3] << 24); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - NdisZeroMemory(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.addr_39_32 = tempMAC[4]; - rmac_mcbcs1.field.addr_47_40 = tempMAC[5]; - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - rmac_mcbcs1.field.multicast_addr_index = (CliIdx * 2); - MAC_IO_WRITE32(pAd, RMAC_MAR1, rmac_mcbcs1.word); -} - -VOID MtAsicRemoveRepeaterEntryByDriver(RTMP_ADAPTER *pAd, UCHAR CliIdx) -{ - RMAC_MAR0_STRUC rmac_mcbcs0; - RMAC_MAR1_STRUC rmac_mcbcs1; - - NdisZeroMemory(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - NdisZeroMemory(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - rmac_mcbcs1.field.multicast_addr_index = - (CliIdx * 2); /* start from idx 0 */ - MAC_IO_WRITE32(pAd, RMAC_MAR1, - rmac_mcbcs1.word); /* clear client entry first. */ - NdisZeroMemory(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - NdisZeroMemory(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - rmac_mcbcs1.field.multicast_addr_index = ((CliIdx * 2) + 1); - MAC_IO_WRITE32(pAd, RMAC_MAR1, - rmac_mcbcs1.word); /* clear rootap entry. */ -} - -VOID MtAsicInsertRepeaterRootEntryByDriver(IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, - IN UCHAR *pAddr, IN UCHAR ReptCliIdx) -{ - RMAC_MAR0_STRUC rmac_mcbcs0; - RMAC_MAR1_STRUC rmac_mcbcs1; - - NdisZeroMemory(&rmac_mcbcs0, sizeof(RMAC_MAR0_STRUC)); - rmac_mcbcs0.addr_31_0 = pAddr[0] + (pAddr[1] << 8) + (pAddr[2] << 16) + - (pAddr[3] << 24); - MAC_IO_WRITE32(pAd, RMAC_MAR0, rmac_mcbcs0.addr_31_0); - NdisZeroMemory(&rmac_mcbcs1, sizeof(RMAC_MAR1_STRUC)); - rmac_mcbcs1.field.addr_39_32 = pAddr[4]; - rmac_mcbcs1.field.addr_47_40 = pAddr[5]; - rmac_mcbcs1.field.access_start = 1; - rmac_mcbcs1.field.readwrite = 1; - rmac_mcbcs1.field.multicast_addr_index = (ReptCliIdx * 2) + 1; - MAC_IO_WRITE32(pAd, RMAC_MAR1, rmac_mcbcs1.word); -} - -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ - -static VOID RxFilterCfg2Row(UINT32 FilterMask, UINT32 *RowFilterMask) -{ - *RowFilterMask = FilterMask & RX_STBC_BCN_BC_MC ? - (*RowFilterMask | DROP_STBC_BCN_BC_MC) : - (*RowFilterMask & ~(DROP_STBC_BCN_BC_MC)); - *RowFilterMask = FilterMask & RX_FCS_ERROR ? - (*RowFilterMask | DROP_FCS_ERROR_FRAME) : - (*RowFilterMask & ~(DROP_FCS_ERROR_FRAME)); - *RowFilterMask = FilterMask & RX_PROTOCOL_VERSION ? - (*RowFilterMask | DROP_VERSION_NO_0) : - (*RowFilterMask & ~(DROP_VERSION_NO_0)); - *RowFilterMask = FilterMask & RX_PROB_REQ ? - (*RowFilterMask | DROP_PROBE_REQ) : - (*RowFilterMask & ~(DROP_PROBE_REQ)); - *RowFilterMask = FilterMask & RX_MC_ALL ? - (*RowFilterMask | DROP_MC_FRAME) : - (*RowFilterMask & ~(DROP_MC_FRAME)); - *RowFilterMask = FilterMask & RX_BC_ALL ? - (*RowFilterMask | DROP_BC_FRAME) : - (*RowFilterMask & ~(DROP_BC_FRAME)); - *RowFilterMask = FilterMask & RX_MC_TABLE ? - (*RowFilterMask | DROP_NOT_IN_MC_TABLE) : - (*RowFilterMask & ~(DROP_NOT_IN_MC_TABLE)); - *RowFilterMask = FilterMask & RX_BC_MC_OWN_MAC_A3 ? - (*RowFilterMask | DROP_ADDR3_OWN_MAC) : - (*RowFilterMask & ~(DROP_ADDR3_OWN_MAC)); - *RowFilterMask = FilterMask & RX_BC_MC_DIFF_BSSID_A3 ? - (*RowFilterMask | DROP_DIFF_BSSID_A3) : - (*RowFilterMask & ~(DROP_DIFF_BSSID_A3)); - *RowFilterMask = FilterMask & RX_BC_MC_DIFF_BSSID_A2 ? - (*RowFilterMask | DROP_DIFF_BSSID_A2) : - (*RowFilterMask & ~(DROP_DIFF_BSSID_A2)); - *RowFilterMask = FilterMask & RX_BCN_DIFF_BSSID ? - (*RowFilterMask | DROP_DIFF_BSSID_BCN) : - (*RowFilterMask & ~(DROP_DIFF_BSSID_BCN)); - *RowFilterMask = FilterMask & RX_CTRL_RSV ? - (*RowFilterMask | DROP_CTRL_RSV) : - (*RowFilterMask & ~(DROP_CTRL_RSV)); - *RowFilterMask = FilterMask & RX_CTS ? (*RowFilterMask | DROP_CTS) : - (*RowFilterMask & ~(DROP_CTS)); - *RowFilterMask = FilterMask & RX_RTS ? (*RowFilterMask | DROP_RTS) : - (*RowFilterMask & ~(DROP_RTS)); - *RowFilterMask = FilterMask & RX_DUPLICATE ? - (*RowFilterMask | DROP_DUPLICATE) : - (*RowFilterMask & ~(DROP_DUPLICATE)); - *RowFilterMask = FilterMask & RX_NOT_OWN_BSSID ? - (*RowFilterMask | DROP_NOT_MY_BSSID) : - (*RowFilterMask & ~(DROP_NOT_MY_BSSID)); - *RowFilterMask = FilterMask & RX_NOT_OWN_UCAST ? - (*RowFilterMask | DROP_NOT_UC2ME) : - (*RowFilterMask & ~(DROP_NOT_UC2ME)); - *RowFilterMask = FilterMask & RX_NOT_OWN_BTIM ? - (*RowFilterMask | DROP_DIFF_BSSID_BTIM) : - (*RowFilterMask & ~(DROP_DIFF_BSSID_BTIM)); - *RowFilterMask = FilterMask & RX_NDPA ? (*RowFilterMask | DROP_NDPA) : - (*RowFilterMask & ~(DROP_NDPA)); -} - -INT MtAsicSetRxFilter(RTMP_ADAPTER *pAd, MT_RX_FILTER_CTRL_T RxFilter) -{ - UINT32 Value = 0; - - if (RxFilter.bPromiscuous) { -#ifdef SNIFFER_MT7615 - - if (IS_MT7615(pAd)) - Value = DROP_FCS_ERROR_FRAME | RM_FRAME_REPORT_EN | - RX_UNWANTED_CTL_FRM; - else -#endif - Value = RX_PROMISCUOUS_MODE; - } else { - /*disable frame report & monitor mode*/ - Value &= ~RX_PROMISCUOUS_MODE; - - if (RxFilter.bFrameReport) - Value |= RM_FRAME_REPORT_EN; - else - Value &= ~(RM_FRAME_REPORT_EN); - - /*enable drop filter by RxfilterMask*/ - RxFilterCfg2Row(RxFilter.filterMask, &Value); - } - - if (RxFilter.u1BandIdx) - MAC_IO_WRITE32(pAd, RMAC_RFCR_BAND_1, Value); - else - MAC_IO_WRITE32(pAd, RMAC_RFCR_BAND_0, Value); - - return TRUE; -} - -#ifdef DOT11_N_SUPPORT -INT MtAsicWtblSetRDG(RTMP_ADAPTER *pAd, BOOLEAN bEnable, UINT8 Wcid) -{ - /* Not support for HIF_MT */ - return 0; -} - -INT MtAsicSetRDG(RTMP_ADAPTER *pAd, BOOLEAN bEnable, UCHAR BandIdx) -{ - /* Not support for HIF_MT */ - return TRUE; -} -#endif /* DOT11_N_SUPPORT */ - -/* - * ======================================================================== - * Routine Description: - * Set/reset MAC registers according to bPiggyBack parameter - * - * Arguments: - * pAd - Adapter pointer - * bPiggyBack - Enable / Disable Piggy-Back - * - * Return Value: - * None - * - * ======================================================================== - */ -VOID MtAsicSetPiggyBack(RTMP_ADAPTER *pAd, BOOLEAN bPiggyBack) -{ - /* Not support for HIF_MT */ - return; -} - -#define INT_TIMER_EN_PRE_TBTT 0x1 -#define INT_TIMER_EN_GP_TIMER 0x2 -static INT SetIntTimerEn(RTMP_ADAPTER *pAd, BOOLEAN enable, UINT32 type, - UINT32 timeout) -{ - /* UINT32 mask, time_mask; */ - /* UINT32 Value; */ - return 0; -} - -INT MtAsicSetPreTbtt(RTMP_ADAPTER *pAd, BOOLEAN bEnable, UCHAR HwBssidIdx) -{ - UINT32 timeout = 0, bitmask = 0; - - ASSERT(HwBssidIdx <= 3); - bitmask = 0xff << (HwBssidIdx * 8); - - if (bEnable == TRUE) { - /* - * each HW BSSID has its own PreTBTT interval, - * unit is 64us, 0x00~0xff is configurable. - * Base on RTMP chip experience, - * Pre-TBTT is 6ms before TBTT interrupt. 1~10 ms is reasonable. - */ - MAC_IO_READ32(pAd, LPON_PISR, &timeout); - timeout &= (~bitmask); - timeout |= (0x50 << (HwBssidIdx * 8)); - MAC_IO_WRITE32(pAd, LPON_PISR, timeout); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): HwBssidIdx=%d, PreTBTT timeout = 0x%x\n", - __func__, HwBssidIdx, timeout)); - } else { - MAC_IO_READ32(pAd, LPON_PISR, &timeout); - timeout &= (~bitmask); - MAC_IO_WRITE32(pAd, LPON_PISR, timeout); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): HwBssidIdx=%d, PreTBTT timeout = 0x%x\n", - __func__, HwBssidIdx, timeout)); - } - - return TRUE; -} - -INT MtAsicSetGPTimer(RTMP_ADAPTER *pAd, BOOLEAN enable, UINT32 timeout) -{ - return SetIntTimerEn(pAd, enable, INT_TIMER_EN_GP_TIMER, timeout); -} - -INT MtAsicSetChBusyStat(RTMP_ADAPTER *pAd, BOOLEAN enable) -{ - /* Not support for HIF_MT */ - return TRUE; -} - -INT MtAsicGetTsfTimeByDriver(RTMP_ADAPTER *pAd, UINT32 *high_part, - UINT32 *low_part, UCHAR HwBssidIdx) -{ - UINT32 Value = 0; - - MAC_IO_READ32(pAd, LPON_T0CR, &Value); - Value = (Value & TSF_TIMER_HW_MODE_MASK) | - TSF_TIMER_VALUE_READ; /* keep HW mode value. */ - MAC_IO_WRITE32(pAd, LPON_T0CR, Value); - MAC_IO_READ32(pAd, LPON_UTTR0, low_part); - MAC_IO_READ32(pAd, LPON_UTTR1, high_part); - return TRUE; -} - -typedef struct _SYNC_MODE_CR_TABLE_T { - UINT32 u4ArbOpModeCR; - UINT32 u4ArbBcnWmmCR; - UINT32 u4LponMacTimerCr; - UINT32 u4LponTbttCtrlCR; - UINT32 u4LponPreTbttTime; /* set pretbtt time */ - UINT32 u4LponSyncModeCR; /* sync mode CR*/ - UINT32 u4IntEnableCR; -} SYNC_MODE_CR_TABLE_T, *PSYNC_MODE_CR_TABLE_T; - -static SYNC_MODE_CR_TABLE_T g_arDisableSyncModeMapTable[HW_BSSID_MAX] = { - /*WMM cr set band0 first, change it when is checked it link to Band1. */ - { ARB_SCR, ARB_WMMBCN0, LPON_MPTCR1, LPON_T0TPCR, LPON_PISR, LPON_T0CR, - HWIER3 }, - { ARB_SCR, ARB_WMMBCN0, LPON_MPTCR1, LPON_T1TPCR, LPON_PISR, LPON_T1CR, - HWIER0 }, - { ARB_SCR, ARB_WMMBCN0, LPON_MPTCR3, LPON_T2TPCR, LPON_PISR, LPON_T2CR, - HWIER0 }, - { ARB_SCR, ARB_WMMBCN0, LPON_MPTCR3, LPON_T3TPCR, LPON_PISR, LPON_T3CR, - HWIER0 }, -}; - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID MtAsicDisableSyncByDriver(RTMP_ADAPTER *pAd, UCHAR HWBssidIdx) -{ - SYNC_MODE_CR_TABLE_T cr_set = { 0 }; - UINT32 value = 0; - - if (HWBssidIdx >= HW_BSSID_MAX) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--->%s(): HW OmacIdx:%x passed in is not correct\n", - __func__, HWBssidIdx)); - return; - } - - cr_set = g_arDisableSyncModeMapTable[HWBssidIdx]; - - /*1. disable hif interrupt pin*/ - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - MAC_IO_READ32(pAd, cr_set.u4IntEnableCR, &value); - - switch (HWBssidIdx) { - case HW_BSSID_0: - value &= ~HWIER3_TBTT0; - value &= ~HWIER3_PRETBTT0; - break; - - case HW_BSSID_1: - value &= ~HWIER0_TBTT1; - value &= ~HWIER0_PRETBTT1; - break; - - case HW_BSSID_2: - value &= ~HWIER0_TBTT2; - value &= ~HWIER0_PRETBTT2; - break; - - case HW_BSSID_3: - value &= ~HWIER0_TBTT3; - value &= ~HWIER0_PRETBTT3; - break; - - default: - ASSERT(HWBssidIdx < HW_BSSID_MAX); - break; - } - - MAC_IO_WRITE32(pAd, cr_set.u4IntEnableCR, value); - } - - /*2. disable BeaconPeriodEn */ - MAC_IO_READ32(pAd, cr_set.u4LponTbttCtrlCR, &value); - value &= ~TBTTn_CAL_EN; - MAC_IO_WRITE32(pAd, cr_set.u4LponTbttCtrlCR, value); - /*3. disable MPTCR pin*/ - /*NOTE: disable is write another CR at the same bit to disable. */ - value = 0; - value |= (TBTT_TIMEUP_EN | TBTT_PERIOD_TIMER_EN | PRETBTT_TIMEUP_EN | - PRETBTT_INT_EN); - - if ((HWBssidIdx == HW_BSSID_1) || (HWBssidIdx == HW_BSSID_3)) - value = (value << 8); - - MAC_IO_WRITE32(pAd, cr_set.u4LponMacTimerCr, value); - /*4. recover BCN AIFS, CWmin, and HW TSF sync mode.*/ - MAC_IO_READ32(pAd, cr_set.u4LponSyncModeCR, &value); - value = value & TSF_TIMER_HW_MODE_FULL; - MAC_IO_WRITE32(pAd, cr_set.u4LponSyncModeCR, value); - value = 0; - value |= ARB_WMMBCN_AIFS_DEFAULT_VALUE; - value |= ARB_WMMBCN_CWMIN_DEFAULT_VALUE; - MAC_IO_WRITE32(pAd, cr_set.u4ArbBcnWmmCR, value); - /*5. set ARB OPMODE */ - MAC_IO_READ32(pAd, cr_set.u4ArbOpModeCR, &value); - value &= ~(MT_ARB_SCR_OPMODE_MASK - << (HWBssidIdx * 2)); /* clean opmode */ - MAC_IO_WRITE32(pAd, cr_set.u4ArbOpModeCR, value); -} - -static SYNC_MODE_CR_TABLE_T g_arEnableSyncModeMapTable[HW_BSSID_MAX] = { - /*WMM cr set band0 first, change it when is checked it link to Band1. */ - { ARB_SCR, ARB_WMMBCN0, LPON_MPTCR0, LPON_T0TPCR, LPON_PISR, LPON_T0CR, - HWIER3 }, - { ARB_SCR, ARB_WMMBCN0, LPON_MPTCR0, LPON_T1TPCR, LPON_PISR, LPON_T1CR, - HWIER0 }, - { ARB_SCR, ARB_WMMBCN0, LPON_MPTCR2, LPON_T2TPCR, LPON_PISR, LPON_T2CR, - HWIER0 }, - { ARB_SCR, ARB_WMMBCN0, LPON_MPTCR2, LPON_T3TPCR, LPON_PISR, LPON_T3CR, - HWIER0 }, -}; - -VOID MtAsicEnableBssSyncByDriver(RTMP_ADAPTER *pAd, USHORT BeaconPeriod, - UCHAR HWBssidIdx, UCHAR OPMode) -{ - SYNC_MODE_CR_TABLE_T cr_set = { 0 }; - UINT32 value = 0; - - if (HWBssidIdx >= HW_BSSID_MAX) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--->%s(): HW OmacIdx:%x passed in is not correct\n", - __func__, HWBssidIdx)); - return; - } - - cr_set = g_arEnableSyncModeMapTable[HWBssidIdx]; - /*1. set ARB OPMODE */ - MAC_IO_READ32(pAd, cr_set.u4ArbOpModeCR, &value); - - if (OPMode == OPMODE_AP) { - value |= (MT_ARB_SCR_BM_CTRL | MT_ARB_SCR_BCN_CTRL | - MT_ARB_SCR_BCN_EMPTY); - } - - value |= (OPMode << (HWBssidIdx * 2)); - MAC_IO_WRITE32(pAd, cr_set.u4ArbOpModeCR, value); - if (OPMode == OPMODE_AP) { - MAC_IO_READ32(pAd, cr_set.u4LponSyncModeCR, &value); - value = value | TSF_TIMER_HW_MODE_TICK_ONLY; - MAC_IO_WRITE32(pAd, cr_set.u4LponSyncModeCR, value); - } - - /*3. set Pretbtt time. */ - MAC_IO_READ32(pAd, cr_set.u4LponPreTbttTime, &value); - value |= DEFAULT_PRETBTT_INTERVAL_IN_MS << (HWBssidIdx * 8); - MAC_IO_WRITE32(pAd, cr_set.u4LponPreTbttTime, value); - /*4. set MPTCR */ - value = 0; - value |= (TBTT_TIMEUP_EN | TBTT_PERIOD_TIMER_EN | PRETBTT_TIMEUP_EN | - PRETBTT_INT_EN); - - if ((HWBssidIdx == HW_BSSID_1) || (HWBssidIdx == HW_BSSID_3)) - value = (value << 8); - - MAC_IO_WRITE32(pAd, cr_set.u4LponMacTimerCr, value); - /*5. set BeaconPeriod */ - value = 0; - { - value |= BEACONPERIODn(BeaconPeriod); - } - - value |= TBTTn_CAL_EN; - MAC_IO_WRITE32(pAd, cr_set.u4LponTbttCtrlCR, value); -#ifndef BCN_OFFLOAD_SUPPORT - - /*6. enable HOST interrupt pin.*/ - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - MAC_IO_READ32(pAd, cr_set.u4IntEnableCR, &value); - - switch (HWBssidIdx) { - case HW_BSSID_0: - value |= HWIER3_TBTT0; - value |= HWIER3_PRETBTT0; - break; - - case HW_BSSID_1: - value |= HWIER0_TBTT1; - value |= HWIER0_PRETBTT1; - break; - - case HW_BSSID_2: - value |= HWIER0_TBTT2; - value |= HWIER0_PRETBTT2; - break; - - case HW_BSSID_3: - value |= HWIER0_TBTT3; - value |= HWIER0_PRETBTT3; - break; - - default: - ASSERT(HWBssidIdx < HW_BSSID_MAX); - break; - } - - MAC_IO_WRITE32(pAd, cr_set.u4IntEnableCR, value); - } - -#endif -} - -typedef struct _RTMP_WMM_PAIR { - UINT32 Address; - UINT32 Mask; - UINT32 Shift; -} RTMP_WMM_PAIR, *PRTMP_WMM_PAIR; - -static RTMP_WMM_PAIR wmm_txop_mask[] = { - { TMAC_ACTXOPLR1, 0x0000ffff, 0 }, /* AC0 - BK */ - { TMAC_ACTXOPLR1, 0xffff0000, 16 }, /* AC1 - BE */ - { TMAC_ACTXOPLR0, 0x0000ffff, 0 }, /* AC2 - VI */ - { TMAC_ACTXOPLR0, 0xffff0000, 16 }, /* AC3 - VO */ -}; - -static RTMP_WMM_PAIR wmm_aifsn_mask[] = { - { ARB_WMMAC00, 0x0000000f, 0 }, /* AC0 - BK */ - { ARB_WMMAC01, 0x0000000f, 4 }, /* AC1 - BE */ - { ARB_WMMAC02, 0x0000000f, 8 }, /* AC2 - VI */ - { ARB_WMMAC03, 0x0000000f, 12 }, /* AC3 - VO */ -}; - -static RTMP_WMM_PAIR wmm_cwmin_mask[] = { - { ARB_WMMAC00, 0x00001f00, 0 }, /* AC0 - BK */ - { ARB_WMMAC01, 0x00001f00, 8 }, /* AC1 - BE */ - { ARB_WMMAC02, 0x00001f00, 16 }, /* AC2 - VI */ - { ARB_WMMAC03, 0x00001f00, 24 }, /* AC3 - VO */ -}; - -static RTMP_WMM_PAIR wmm_cwmax_mask[] = { - { ARB_WMMAC00, 0x001f0000, 0 }, /* AC0 - BK */ - { ARB_WMMAC01, 0x001f0000, 16 }, /* AC1 - BE */ - { ARB_WMMAC02, 0x001f0000, 0 }, /* AC2 - VI */ - { ARB_WMMAC03, 0x001f0000, 16 }, /* AC3 - VO */ -}; - -UINT32 MtAsicGetWmmParam(RTMP_ADAPTER *pAd, UINT32 AcNum, UINT32 EdcaType) -{ - UINT32 addr = 0, cr_val, mask = 0, shift = 0; - - if (AcNum <= WMM_PARAM_AC_3) { - switch (EdcaType) { - case WMM_PARAM_TXOP: - addr = wmm_txop_mask[AcNum].Address; - mask = wmm_txop_mask[AcNum].Mask; - shift = wmm_txop_mask[AcNum].Shift; - break; - - case WMM_PARAM_AIFSN: - addr = wmm_aifsn_mask[AcNum].Address; - mask = wmm_aifsn_mask[AcNum].Mask; - shift = wmm_aifsn_mask[AcNum].Shift; - break; - - case WMM_PARAM_CWMIN: - addr = wmm_cwmin_mask[AcNum].Address; - mask = wmm_cwmin_mask[AcNum].Mask; - shift = wmm_cwmin_mask[AcNum].Shift; - break; - - case WMM_PARAM_CWMAX: - addr = wmm_cwmax_mask[AcNum].Address; - mask = wmm_cwmax_mask[AcNum].Mask; - shift = wmm_cwmax_mask[AcNum].Shift; - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Error type=%d\n", __func__, __LINE__, - EdcaType)); - break; - } - } - - if (addr && mask) { - MAC_IO_READ32(pAd, addr, &cr_val); - cr_val = (cr_val & mask) >> shift; - return cr_val; - } - - return 0xdeadbeef; -} - -INT MtAsicSetWmmParam(RTMP_ADAPTER *pAd, UCHAR idx, UINT32 AcNum, - UINT32 EdcaType, UINT32 EdcaValue) -{ - MT_EDCA_CTRL_T EdcaParam; - P_TX_AC_PARAM_T pAcParam; - UCHAR index = 0; - - /* Could write any queue by FW */ - if ((AcNum < 4) && (idx < 4)) - index = (idx * 4) + AcNum; - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Non-WMM Queue, WmmIdx/QueIdx=%d/%d!\n", - __func__, idx, AcNum)); - index = AcNum; - } - - os_zero_mem(&EdcaParam, sizeof(MT_EDCA_CTRL_T)); - EdcaParam.ucTotalNum = 1; - EdcaParam.ucAction = EDCA_ACT_SET; - pAcParam = &EdcaParam.rAcParam[0]; - pAcParam->ucAcNum = (UINT8)index; - - switch (EdcaType) { - case WMM_PARAM_TXOP: - pAcParam->ucVaildBit = CMD_EDCA_TXOP_BIT; - pAcParam->u2Txop = (UINT16)EdcaValue; - break; - - case WMM_PARAM_AIFSN: - pAcParam->ucVaildBit = CMD_EDCA_AIFS_BIT; - pAcParam->ucAifs = (UINT8)EdcaValue; - break; - - case WMM_PARAM_CWMIN: - pAcParam->ucVaildBit = CMD_EDCA_WIN_MIN_BIT; - pAcParam->ucWinMin = (UINT8)EdcaValue; - break; - - case WMM_PARAM_CWMAX: - pAcParam->ucVaildBit = CMD_EDCA_WIN_MAX_BIT; - pAcParam->u2WinMax = (UINT16)EdcaValue; - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Error type=%d\n", __func__, __LINE__, - EdcaType)); - break; - } - -#if defined(COMPOS_TESTMODE_WIN) - ; /* no function */ -#else - MtCmdEdcaParameterSet(pAd, EdcaParam); -#endif - return NDIS_STATUS_SUCCESS; -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID MtAsicSetEdcaParm(RTMP_ADAPTER *pAd, PEDCA_PARM pEdcaParm) -{ - MT_EDCA_CTRL_T EdcaParam; - P_TX_AC_PARAM_T pAcParam; - UINT32 ac = 0, index = 0; - - os_zero_mem(&EdcaParam, sizeof(MT_EDCA_CTRL_T)); - - if ((pEdcaParm != NULL) && (pEdcaParm->bValid != FALSE)) { - EdcaParam.ucTotalNum = CMD_EDCA_AC_MAX; - - for (ac = 0; ac < CMD_EDCA_AC_MAX; ac++) { - index = (pEdcaParm->WmmSet) * 4 + ac; - pAcParam = &EdcaParam.rAcParam[ac]; - pAcParam->ucVaildBit = CMD_EDCA_ALL_BITS; - pAcParam->ucAcNum = wmm_aci_2_hw_ac_queue[index]; - pAcParam->ucAifs = pEdcaParm->Aifsn[ac]; - pAcParam->ucWinMin = pEdcaParm->Cwmin[ac]; - pAcParam->u2WinMax = pEdcaParm->Cwmax[ac]; - pAcParam->u2Txop = pEdcaParm->Txop[ac]; - } - } - -#if defined(COMPOS_TESTMODE_WIN) - ; /* no function */ -#else - MtCmdEdcaParameterSet(pAd, EdcaParam); -#endif -} - -INT MtAsicSetRetryLimit(RTMP_ADAPTER *pAd, UINT32 type, UINT32 limit) -{ - /* Not support for HIF_MT */ - return FALSE; -} - -UINT32 MtAsicGetRetryLimit(RTMP_ADAPTER *pAd, UINT32 type) -{ - /* Not support for HIF_MT */ - return 0; -} - -/* - * ========================================================================== - * Description: - * - * IRQL = PASSIVE_LEVEL - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID MtAsicSetSlotTime(RTMP_ADAPTER *pAd, UINT32 SlotTime, UINT32 SifsTime, - UCHAR BandIdx) -{ - UINT32 ret; - UINT32 RifsTime = RIFS_TIME; - UINT32 EifsTime = EIFS_TIME; - - ret = MtCmdSlotTimeSet(pAd, (UINT8)SlotTime, (UINT8)SifsTime, - (UINT8)RifsTime, (UINT16)EifsTime, BandIdx); -} - -#define RX_PKT_MAX_LENGTH 0x400 /* WORD(4 Bytes) unit */ -INT MtAsicSetMacMaxLen(RTMP_ADAPTER *pAd) -{ - /* Not support for HIF_MT */ - return 0; -} - -/* - * ======================================================================== - * Description: - * Add Shared key information into ASIC. - * Update shared key, TxMic and RxMic to Asic Shared key table - * Update its cipherAlg to Asic Shared key Mode. - * - * Return: - * ======================================================================== - */ -VOID MtAsicAddSharedKeyEntry(IN PRTMP_ADAPTER pAd, IN UCHAR BssIndex, - IN UCHAR KeyIdx, IN PCIPHER_KEY pCipherKey) -{ - /* Do nothing, replace by MtAsicAddRemoveKeyTabByFw */ -} - -/* IRQL = DISPATCH_LEVEL*/ -VOID MtAsicRemoveSharedKeyEntry(IN PRTMP_ADAPTER pAd, IN UCHAR BssIndex, - IN UCHAR KeyIdx) -{ - /* Do nothing, replace by MtAsicAddRemoveKeyTabByFw */ -} - -static UCHAR *phy_bw_str[] = { - "20M", "40M", "80M", "160M", "10M", "5M", "80+80" -}; -char *get_bw_str(int bandwidth) -{ - if (bandwidth >= BW_20 && bandwidth <= BW_8080) - return phy_bw_str[bandwidth]; - else - return "N/A"; -} - -/** - * Wtbl2RateTableUpdate - * - * - * - */ -VOID MtAsicTxCapAndRateTableUpdate(RTMP_ADAPTER *pAd, UCHAR ucWcid, - RA_PHY_CFG_T *prTxPhyCfg, UINT32 *Rate, - BOOL fgSpeEn) -{ - struct wtbl_entry tb_entry; - union WTBL_DW3 wtbl_wd3; - union WTBL_DW5 wtbl_wd5; - UINT32 u4RegVal; - UCHAR bw; - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): WaitIdle failed\n", __func__)); - return; - } - - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, ucWcid, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, ucWcid)); - return; - } - - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 12, &(wtbl_wd3.word)); - - if (fgSpeEn) - wtbl_wd3.field.spe_idx = 24; - else - wtbl_wd3.field.spe_idx = 0; - - MAC_IO_WRITE32(pAd, tb_entry.wtbl_addr + 12, wtbl_wd3.word); - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 20, &(wtbl_wd5.word)); - - if (prTxPhyCfg->ldpc & HT_LDPC) - wtbl_wd5.field.ldpc = 1; - else - wtbl_wd5.field.ldpc = 0; - - if (prTxPhyCfg->ldpc & VHT_LDPC) - wtbl_wd5.field.ldpc_vht = 1; - else - wtbl_wd5.field.ldpc_vht = 0; - - switch (prTxPhyCfg->BW) { - case 4: - case 3: - bw = 3; - break; - - case BW_80: - bw = 2; - break; - - case BW_40: - bw = 1; - break; - - case BW_20: - - /* case BW_10: */ - default: - bw = 0; - break; - } - - wtbl_wd5.field.fcap = bw; - wtbl_wd5.field.cbrn = - 7; /* change bw as (fcap/2) if rate_idx > 7, temporary code */ - - if (prTxPhyCfg->ShortGI) { - wtbl_wd5.field.g2 = 1; - wtbl_wd5.field.g4 = 1; - wtbl_wd5.field.g8 = 1; - wtbl_wd5.field.g16 = 1; - } else { - wtbl_wd5.field.g2 = 0; - wtbl_wd5.field.g4 = 0; - wtbl_wd5.field.g8 = 0; - wtbl_wd5.field.g16 = 0; - } - - wtbl_wd5.field.rate_idx = 0; - wtbl_wd5.field.txpwr_offset = 0; - MAC_IO_WRITE32(pAd, WTBL_ON_RIUCR0, wtbl_wd5.word); - u4RegVal = (Rate[0] | (Rate[1] << 12) | (Rate[2] << 24)); - MAC_IO_WRITE32(pAd, WTBL_ON_RIUCR1, u4RegVal); - u4RegVal = ((Rate[2] >> 8) | (Rate[3] << 4) | (Rate[4] << 16) | - (Rate[5] << 28)); - MAC_IO_WRITE32(pAd, WTBL_ON_RIUCR2, u4RegVal); - u4RegVal = ((Rate[5] >> 4) | (Rate[6] << 8) | (Rate[7] << 20)); - MAC_IO_WRITE32(pAd, WTBL_ON_RIUCR3, u4RegVal); - /* TODO: shiang-MT7615, shall we also clear TxCnt/RxCnt/AdmCnt here?? */ - u4RegVal = (ucWcid | (1 << 13) | (1 << 14)); - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, u4RegVal); -} - -/** - * Wtbl2TxRateCounterGet - * - * - * - */ -static VOID WtblTxRateCounterGet(RTMP_ADAPTER *pAd, UCHAR ucWcid, - DMAC_TX_CNT_INFO *tx_cnt_info) -{ - struct wtbl_entry tb_entry; - UINT32 u4RegVal; - - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, ucWcid, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, ucWcid)); - return; - } - - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 56, - &(tx_cnt_info->wtbl_wd14.word)); - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 60, - &(tx_cnt_info->wtbl_wd15.word)); - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 64, - &(tx_cnt_info->wtbl_wd16.word)); - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 68, - &(tx_cnt_info->wtbl_wd17.word)); - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) - return; - - u4RegVal = (ucWcid | (1 << 14)); - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, u4RegVal); -} - -/* - * Wtbl2RcpiGet - * - * - * - */ - -VOID MtAsicTxCntUpdate(RTMP_ADAPTER *pAd, UCHAR Wcid, MT_TX_COUNTER *pTxInfo) -{ - DMAC_TX_CNT_INFO tx_cnt_info; - - WtblTxRateCounterGet(pAd, (UINT8)Wcid, &tx_cnt_info); - pTxInfo->TxCount = tx_cnt_info.wtbl_wd16.field.current_bw_tx_cnt; - pTxInfo->TxCount += tx_cnt_info.wtbl_wd17.field.other_bw_tx_cnt; - pTxInfo->TxFailCount = tx_cnt_info.wtbl_wd16.field.current_bw_fail_cnt; - pTxInfo->TxFailCount += tx_cnt_info.wtbl_wd17.field.other_bw_fail_cnt; - pTxInfo->Rate1TxCnt = (UINT16)tx_cnt_info.wtbl_wd14.field.rate_1_tx_cnt; - pTxInfo->Rate1FailCnt = - (UINT16)tx_cnt_info.wtbl_wd14.field.rate_1_fail_cnt; - pTxInfo->Rate2OkCnt = (UINT16)tx_cnt_info.wtbl_wd15.field.rate_2_ok_cnt; - pTxInfo->Rate3OkCnt = (UINT16)tx_cnt_info.wtbl_wd15.field.rate_3_ok_cnt; -} - -VOID MtAsicRssiGet(RTMP_ADAPTER *pAd, UCHAR Wcid, CHAR *RssiSet) -{ - struct wtbl_entry tb_entry; - union WTBL_DW28 wtbl_wd28; - /* UINT32 u4RegVal; */ - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, Wcid, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, Wcid)); - return; - } - - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 112, - &wtbl_wd28.word); /* WTBL DW28 */ - RssiSet[0] = (wtbl_wd28.field.resp_rcpi_0 - 220) / 2; - RssiSet[1] = (wtbl_wd28.field.resp_rcpi_1 - 220) / 2; - RssiSet[2] = (wtbl_wd28.field.resp_rcpi_2 - 220) / 2; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RssiSet[0] = %d\n", RssiSet[0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RssiSet[1] = %d\n", RssiSet[1])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RssiSet[2] = %d\n", RssiSet[2])); -} - -VOID MtRssiGet(RTMP_ADAPTER *pAd, UCHAR Wcid, CHAR *RssiSet) -{ - struct wtbl_entry tb_entry; - union WTBL_DW28 wtbl_wd28; - UINT i; - /* UINT32 u4RegVal; */ - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, Wcid, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, Wcid)); - return; - } - - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 112, - &wtbl_wd28.word); /* WTBL DW28 */ - RssiSet[0] = (wtbl_wd28.field.resp_rcpi_0 - 220) / 2; - RssiSet[1] = (wtbl_wd28.field.resp_rcpi_1 - 220) / 2; - RssiSet[2] = (wtbl_wd28.field.resp_rcpi_2 - 220) / 2; - RssiSet[3] = (wtbl_wd28.field.resp_rcpi_3 - 220) / 2; - - /* printk("RssiSet[0] = %d\n", RssiSet[0]); */ - /* printk("RssiSet[1] = %d\n", RssiSet[1]); */ - /* printk("RssiSet[2] = %d\n", RssiSet[2]); */ - /* printk("RssiSet[3] = %d\n", RssiSet[3]); */ - - /* santiy check rssi value */ - for (i = 0; i < 4; i++) { - if (RssiSet[i] > 0) - RssiSet[i] = -127; - } -} - -VOID MtAsicRcpiReset(RTMP_ADAPTER *pAd, UCHAR ucWcid) -{ - UINT32 u4RegVal; - - if (WtblWaitIdle(pAd, 100, 50) != TRUE) - return; - - u4RegVal = (ucWcid | (1 << 15)); - MAC_IO_WRITE32(pAd, WTBL_OFF_WIUCR, u4RegVal); -} - -static UINT16 get_tid_ssn(UCHAR tid, UINT32 *content) -{ - UINT16 ssn = 0; - - switch (tid) { - case TID0_SN: - ssn = *content & BA_SN_MSK; - break; - - case TID1_SN: - ssn = (*content >> 12) & BA_SN_MSK; - break; - - case TID2_SN: - ssn = (((*(content + 1) & 0xf) << 8) | (*content >> 24)) & - BA_SN_MSK; - break; - - case TID3_SN: - ssn = (*(content + 1) >> 4) & BA_SN_MSK; - break; - - case TID4_SN: - ssn = (*(content + 1) >> 16) & BA_SN_MSK; - break; - - case TID5_SN: - ssn = (((*(content + 2) & 0xff) << 4) | - (*(content + 1) >> 28)) & - BA_SN_MSK; - break; - - case TID6_SN: - ssn = (*(content + 2) >> 8) & BA_SN_MSK; - break; - - case TID7_SN: - ssn = (*(content + 2) >> 20) & BA_SN_MSK; - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown TID=%x\n", __func__, tid)); - break; - } - - return ssn; -} - -UINT16 MtAsicGetTidSnByDriver(RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid) -{ - struct wtbl_entry tb_entry; - UINT16 ssn = 0xffff; /* invalid number */ - UINT32 serial_no[3] = { 0x0, 0x0, 0x0 }; - - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, wcid, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Cannot found WTBL2/3/4 for WCID(%d)\n", __func__, - wcid)); - goto end; - } - - HW_IO_READ32(pAd, tb_entry.wtbl_addr + (4 * 11), &serial_no[0]); - HW_IO_READ32(pAd, tb_entry.wtbl_addr + (4 * 12), &serial_no[1]); - HW_IO_READ32(pAd, tb_entry.wtbl_addr + (4 * 13), &serial_no[2]); - ssn = get_tid_ssn(tid, serial_no); -end: - return ssn; -} - -/* TODO: shiang-MT7615, use MMPS_DYNAMIC instead for "smps" */ -VOID MtAsicSetSMPSByDriver(RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR Smps) -{ - struct wtbl_entry tb_entry; - UINT32 dw; - - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, Wcid, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Cannot found WTBL2/3/4 for WCID(%d)\n", __func__, - Wcid)); - return; - } - - /* WTBL.dw3 bit 23, support Dynamic SMPS */ - HW_IO_READ32(pAd, tb_entry.wtbl_addr + 12, &dw); - - if (Smps) - dw |= (0x1 << 23); - else - dw &= (~(0x1 << 23)); - - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr + 12, dw); -} - -VOID MtAsicSetSMPS(RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR Smps) -{ - MtAsicSetSMPSByDriver(pAd, Wcid, Smps); -} - -static BOOLEAN IsMtAsicWtblIndirectAccessIdle(RTMP_ADAPTER *pAd) -{ - UINT32 wiucr_val, cnt; - BOOLEAN is_idle = FALSE; - - wiucr_val = (1 << 31); - cnt = 0; - - do { - HW_IO_READ32(pAd, WTBL_OFF_WIUCR, &wiucr_val); - - if ((wiucr_val & (1 << 31)) == 0) - break; - cnt++; - } while (cnt < 100); - - if ((wiucr_val & (1 << 31)) == 0) { - is_idle = TRUE; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): WIUCR is idle!wiucr_val=0x%x\n", __func__, - wiucr_val)); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): WIUCR is busy!wiucr_val=0x%x\n", __func__, - wiucr_val)); - } - - return is_idle; -} - -/* WTBL Access for DW0~DW1, Perr unique key */ -static INT MtAsicWtblWriteRxInfo(RTMP_ADAPTER *pAd, UINT8 wlan_idx, UINT32 *val) -{ - UINT32 wiucr_val; - - if (IsMtAsicWtblIndirectAccessIdle(pAd) == TRUE) { - HW_IO_WRITE32(pAd, WTBL_ON_RICR0, val[0]); /* DW 0 */ - HW_IO_WRITE32(pAd, WTBL_ON_RICR1, val[1]); /* DW 1 */ - wiucr_val = (WTBL_RXINFO_UPDATE | WLAN_IDX(wlan_idx)); - HW_IO_WRITE32(pAd, WTBL_OFF_WIUCR, wiucr_val); - return TRUE; - } else - return FALSE; -}; - -static INT MtAsicWtblWriteRateInfo(RTMP_ADAPTER *pAd, UINT8 wlan_idx, - UINT32 *val) -{ - UINT32 wiucr_val; - - if (IsMtAsicWtblIndirectAccessIdle(pAd) == TRUE) { - HW_IO_WRITE32(pAd, WTBL_ON_RIUCR0, val[0]); /* DW 5 */ - HW_IO_WRITE32(pAd, WTBL_ON_RIUCR1, val[1]); /* DW 6 */ - HW_IO_WRITE32(pAd, WTBL_ON_RIUCR2, val[2]); /* DW 7 */ - HW_IO_WRITE32(pAd, WTBL_ON_RIUCR3, val[3]); /* DW 8 */ - wiucr_val = (WTBL_RATE_UPDATE | WLAN_IDX(wlan_idx)); - HW_IO_WRITE32(pAd, WTBL_OFF_WIUCR, wiucr_val); - return TRUE; - } else - return FALSE; -}; - -static INT MtAsicWtblWritePsm(RTMP_ADAPTER *pAd, UINT8 wcid, UINT32 addr, - UINT8 psm) -{ - UINT32 val; - - MAC_IO_WRITE32(pAd, WTBL_ON_WTBLOR, WTBL_OR_PSM_W_FLAG); - HW_IO_READ32(pAd, addr, &val); - val &= (~((1 << 30))); - val |= ((psm << 30)); - HW_IO_WRITE32(pAd, addr, val); - MAC_IO_WRITE32(pAd, WTBL_ON_WTBLOR, 0); - return TRUE; -}; - -static INT MtAsicWtblDwWrite(RTMP_ADAPTER *pAd, UINT8 wlan_idx, UINT32 base, - UINT8 dw, UINT32 val) -{ - switch (dw) { - case 0: - case 1: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Err!Please call MtAsicWtblWriteRxInfo() for this!\n", - __func__)); - break; - - case 2: - case 3: - case 4: - HW_IO_WRITE32(pAd, base + dw * 4, val); - break; - - case 5: - case 6: - case 7: - case 8: - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Err!Please call MtAsicWtblWriteRateInfo() for this!\n", - __func__)); - break; - - default: - HW_IO_WRITE32(pAd, base + dw * 4, val); - break; - } - - return TRUE; -} - -/* WTBL Access for Rx Counter clear */ -static INT MtAsicWtblRxCounterClear(RTMP_ADAPTER *pAd, UINT8 wlan_idx) -{ - UINT32 wiucr_val; - - if (IsMtAsicWtblIndirectAccessIdle(pAd) == TRUE) { - wiucr_val = (WTBL_RX_CNT_CLEAR | WLAN_IDX(wlan_idx)); - HW_IO_WRITE32(pAd, WTBL_OFF_WIUCR, wiucr_val); - return TRUE; - } else - return FALSE; -}; - -static INT MtAsicWtblTxCounterClear(RTMP_ADAPTER *pAd, UINT8 wlan_idx) -{ - UINT32 wiucr_val; - - if (IsMtAsicWtblIndirectAccessIdle(pAd) == TRUE) { - wiucr_val = (WTBL_TX_CNT_CLEAR | WLAN_IDX(wlan_idx)); - HW_IO_WRITE32(pAd, WTBL_OFF_WIUCR, wiucr_val); - return TRUE; - } else - return FALSE; -}; - -static INT MtAsicWtblAdmCounterClear(RTMP_ADAPTER *pAd, UINT8 wlan_idx) -{ - UINT32 wiucr_val; - - if (IsMtAsicWtblIndirectAccessIdle(pAd) == TRUE) { - wiucr_val = (WTBL_ADM_CNT_CLEAR | WLAN_IDX(wlan_idx)); - HW_IO_WRITE32(pAd, WTBL_OFF_WIUCR, wiucr_val); - return TRUE; - } else - return FALSE; -}; - -static INT MtAsicWtblFieldsReset(RTMP_ADAPTER *pAd, UINT8 wlan_idx, UINT32 base) -{ - UINT32 Index; - /* Clear BA Information */ - MtAsicWtblDwWrite(pAd, wlan_idx, base, 4, 0); - /* RX Counter Clear */ - MtAsicWtblRxCounterClear(pAd, wlan_idx); - /* TX Counter Clear */ - MtAsicWtblTxCounterClear(pAd, wlan_idx); - - /* Clear Cipher Key */ - for (Index = 0; Index < 16; Index++) - HW_IO_WRITE32(pAd, base + (4 * (Index + 30)), 0x0); - - /* Admission Control Counter Clear */ - MtAsicWtblAdmCounterClear(pAd, wlan_idx); - return TRUE; -} - -#define SN_MASK 0xfff - -#ifndef MAC_INIT_OFFLOAD -static UCHAR ba_mib_range[MT_DMAC_BA_STAT_RANGE] = { 0, 4, 14, 21, - 32, 48, 56, 64 }; -#endif - -INT32 MtAsicSetDevMacByDriver(RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, - UINT8 *OwnMacAddr, UINT8 BandIdx, UINT8 Active, - UINT32 EnableFeature) -{ - UINT32 val; - UINT32 own_mac_reg_base = RMAC_OMA0R0; - - /* We only need to consider BandIdx in FW offload case */ - if (Active) { - val = (OwnMacAddr[0]) | (OwnMacAddr[1] << 8) | - (OwnMacAddr[2] << 16) | (OwnMacAddr[3] << 24); - MAC_IO_WRITE32(pAd, own_mac_reg_base + (OwnMacIdx * 8), val); - val = OwnMacAddr[4] | (OwnMacAddr[5] << 8) | (1 << 16); - MAC_IO_WRITE32(pAd, (own_mac_reg_base + 4) + (OwnMacIdx * 8), - val); - } - - return 0; -} - -INT32 MtAsicSetBssidByDriver(RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info_argument) -{ - UINT32 val; - ULONG curr_bssid_reg_base = RMAC_CB0R0; -#ifdef CONFIG_AP_SUPPORT - UINT8 BssIdx = 0; -#endif - UCHAR OwnMacIdx = bss_info_argument.OwnMacIdx; - UINT8 Active = FALSE; - UCHAR *Bssid = bss_info_argument.Bssid; - - if (bss_info_argument.bss_state >= BSS_ACTIVE) - Active = TRUE; - - if (OwnMacIdx < HW_BSSID_MAX) { - if (Active) { - val = (UINT32)((Bssid[0]) | (UINT32)(Bssid[1] << 8) | - (UINT32)(Bssid[2] << 16) | - (UINT32)(Bssid[3] << 24)); - MAC_IO_WRITE32(pAd, - curr_bssid_reg_base + (OwnMacIdx * 8), - val); - val = (UINT32)(Bssid[4]) | (UINT32)(Bssid[5] << 8) | - (1 << 16); - MAC_IO_WRITE32(pAd, - (curr_bssid_reg_base + 4) + - (OwnMacIdx * 8), - val); - } - } -#ifdef CONFIG_AP_SUPPORT - else { - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - BssIdx = (OwnMacIdx & ~cap->ExtMbssOmacStartIdx); - MtDmacSetExtMbssEnableCR(pAd, BssIdx, - Active); /* enable rmac 0_1~0_15 bit */ - MtDmacSetMbssHwCRSetting( - pAd, BssIdx, - Active); /* enable lp timing setting for 0_1~0_15 */ - } - -#endif - return NDIS_STATUS_SUCCESS; -} - -INT32 MtAsicSetStaRecByDriver(RTMP_ADAPTER *pAd, STA_REC_CFG_T StaRecCfg) -{ - /* Not supported this fucntion in driver */ - return 0; -} - -INT32 MtAsicUpdateBASessionByDriver(RTMP_ADAPTER *pAd, MT_BA_CTRL_T BaCtrl) -{ - INT32 Status = 0; - struct wtbl_entry ent; - UINT32 range_mask = 0x7 << (BaCtrl.Tid * 3); - UINT32 reg, reg_mask, reg_bit, reg2, reg2_bit, value; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR *ba_range = cap->ba_range; - - if (BaCtrl.BaSessionType == BA_SESSION_RECP) { - /* Reset BA SSN & Score Board Bitmap, for BA Receiptor */ - if (BaCtrl.isAdd) { - UINT32 band_offset, band = BaCtrl.band_idx; - - /* TODO: shiang-MT7615, check band!! */ - if (band == 0) - band_offset = 0; - else - band_offset = 0x100; - - value = (BaCtrl.PeerAddr[0] | - (BaCtrl.PeerAddr[1] << 8) | - (BaCtrl.PeerAddr[2] << 16) | - (BaCtrl.PeerAddr[3] << 24)); - MAC_IO_WRITE32(pAd, (BSCR0_BAND_0 + band_offset), - value); - MAC_IO_READ32(pAd, (BSCR1_BAND_0 + band_offset), - &value); - value &= ~(BA_MAC_ADDR_47_32_MASK | RST_BA_TID_MASK | - RST_BA_SEL_MASK); - value |= BA_MAC_ADDR_47_32((BaCtrl.PeerAddr[4] | - (BaCtrl.PeerAddr[5] << 8))); - value |= (RST_BA_SEL(RST_BA_MAC_TID_MATCH) | - RST_BA_TID(BaCtrl.Tid) | START_RST_BA_SB); - MAC_IO_WRITE32(pAd, (BSCR1_BAND_0 + band_offset), - value); - } - } else { - NdisZeroMemory((UCHAR *)(&ent), sizeof(struct wtbl_entry)); - if (mt_wtbl_get_entry234(pAd, BaCtrl.Wcid, &ent) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, BaCtrl.Wcid)); - return FALSE; - } - - if (BaCtrl.isAdd) { - INT idx = 0; - /* TODO: shiang-MT7615, shall we stop tx for this? */ - MtAsicSetMacTxRx(pAd, ASIC_MAC_TX, FALSE, - BaCtrl.band_idx); - reg = reg2 = reg_mask = reg_bit = 0; - - /* Clear WTBL2. SN: Direct Updating */ - switch (BaCtrl.Tid) { - case 0: - reg = ent.wtbl_addr + (4 * 11); /* DW11 */ - reg_bit = 0; - break; - - case 1: - reg = ent.wtbl_addr + (4 * 11); /* DW11 */ - reg_bit = 12; - break; - - case 2: - reg = ent.wtbl_addr + (4 * 11); /* DW11 */ - reg_bit = 24; - reg2 = ent.wtbl_addr + (4 * 12); /* DW12 */ - reg2_bit = 0; - break; - - case 3: - reg = ent.wtbl_addr + (4 * 12); /* DW12 */ - reg_bit = 4; - break; - - case 4: - reg = ent.wtbl_addr + (4 * 12); /* DW12 */ - reg_bit = 16; - break; - - case 5: - reg = ent.wtbl_addr + (4 * 12); /* DW12 */ - reg_bit = 28; - reg2 = ent.wtbl_addr + (4 * 13); /* DW13 */ - reg2_bit = 0; - break; - - case 6: - reg = ent.wtbl_addr + (4 * 13); /* DW13 */ - reg_bit = 8; - break; - - case 7: - reg = ent.wtbl_addr + (4 * 13); /* DW13 */ - reg_bit = 20; - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: unknown tid(%d)\n", __func__, - BaCtrl.Tid)); - goto skip_update_sn; - } - - if (32 - reg_bit >= 12) { - HW_IO_READ32(pAd, reg, &value); - value &= (~(SN_MASK << reg_bit)); - value |= ((BaCtrl.Sn & SN_MASK) << reg_bit); - HW_IO_WRITE32(pAd, reg, value); - } else { - ASSERT(reg2 != 0); - /* low bits */ - HW_IO_READ32(pAd, reg, &value); - value &= (~(SN_MASK << reg_bit)); - value |= ((BaCtrl.Sn & SN_MASK) << reg_bit); - HW_IO_WRITE32(pAd, reg, value); - /* high bits */ - HW_IO_READ32(pAd, reg2, &value); - reg_mask = ((SN_MASK >> (32 - reg_bit)) - << reg2_bit); - value &= (~reg_mask); - value |= (((BaCtrl.Sn & SN_MASK) >> - (32 - reg_bit)) - << reg2_bit); - HW_IO_WRITE32(pAd, reg2, value); - } - - skip_update_sn: - MtAsicSetMacTxRx(pAd, ASIC_MAC_TX, TRUE, - BaCtrl.band_idx); - - while (BaCtrl.BaWinSize > ba_range[idx]) { - if (idx == (MT_DMAC_BA_AGG_RANGE - 1)) - break; - - idx++; - }; - - if ((idx > 0) && (ba_range[idx] > BaCtrl.BaWinSize)) - idx--; - - reg = ent.wtbl_addr + (4 * 4); - HW_IO_READ32(pAd, reg, &value); - value &= (~range_mask); - value |= ((1 << (BaCtrl.Tid + 24)) | - (idx << (BaCtrl.Tid * 3))); - HW_IO_WRITE32(pAd, reg, value); - } else { - reg = ent.wtbl_addr + (4 * 4); - HW_IO_READ32(pAd, reg, &value); - value &= (~(1 << (BaCtrl.Tid + 24))); - value &= (~range_mask); - HW_IO_WRITE32(pAd, reg, value); - } - } - - return Status; -} - -INT32 MtAsicUpdateBASession(RTMP_ADAPTER *pAd, MT_BA_CTRL_T BaCtrl) -{ - return MtAsicUpdateBASessionByDriver(pAd, BaCtrl); -} - -VOID MtAsicUpdateRxWCIDTableByDriver(RTMP_ADAPTER *pAd, - MT_WCID_TABLE_INFO_T WtblInfo) -{ - struct wtbl_entry tb_entry; - /* UINT32 Value, Index; */ - UINT32 dw[5] = { 0 }; - UINT32 rate_info[4] = { 0 }; - - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, (UCHAR)WtblInfo.Wcid, &tb_entry) == - FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, WtblInfo.Wcid)); - return; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): tb_entry->wtbl_idx/wtbl_addr=%d/0x%x\n", __func__, - tb_entry.wtbl_idx, tb_entry.wtbl_addr)); - - if (WtblInfo.WcidType == MT_WCID_TYPE_BMCAST) { - WTBL_SET_MUARIDX(dw[0], 0xe); - WTBL_SET_CIPHER_SUIT(dw[2], WTBL_CIPHER_NONE); -#ifdef HDR_TRANS_TX_SUPPORT - - if (pAd->OpMode == OPMODE_AP) { - WTBL_SET_FD(rate_info[0], 1); - WTBL_SET_TD(rate_info[0], 0); - } - -#endif /* HDR_TRANS_TX_SUPPORT */ - } else if (WtblInfo.WcidType == MT_WCID_TYPE_APCLI_MCAST) { - WTBL_SET_MUARIDX(dw[0], 0xe); - WTBL_SET_RV(dw[0], 1); - WTBL_SET_CIPHER_SUIT(dw[2], WTBL_CIPHER_NONE); - WTBL_SET_RC_A2(dw[0], 1); - } else { - WTBL_SET_MUARIDX(dw[0], WtblInfo.MacAddrIdx); - - if ((WtblInfo.WcidType == MT_WCID_TYPE_APCLI) || - (WtblInfo.WcidType == MT_WCID_TYPE_REPEATER)) - WTBL_SET_RC_A1(dw[0], 1); - - WTBL_SET_RV(dw[0], 1); - WTBL_SET_RC_A2(dw[0], 1); - /* TODO: shiang-MT7603, in which case we need to check A1??? */ - /* WTBL_SET_RC_A1(dw[0], 1); */ - WTBL_SET_CIPHER_SUIT(dw[2], WtblInfo.CipherSuit); - WTBL_SET_RKV(dw[0], - ((WtblInfo.CipherSuit != WTBL_CIPHER_NONE) ? 1 : - 0)); - WTBL_SET_QOS(rate_info[0], WtblInfo.SupportQoS); -#ifdef HDR_TRANS_TX_SUPPORT - - switch (WtblInfo.WcidType) { - case MT_WCID_TYPE_AP: - WTBL_SET_FD(rate_info[0], 0); - WTBL_SET_TD(rate_info[0], 1); - break; - - case MT_WCID_TYPE_CLI: - WTBL_SET_FD(rate_info[0], 1); - WTBL_SET_TD(rate_info[0], 0); - break; - - case MT_WCID_TYPE_APCLI: - case MT_WCID_TYPE_REPEATER: - WTBL_SET_FD(rate_info[0], 0); - WTBL_SET_TD(rate_info[0], 1); - break; - - case MT_WCID_TYPE_WDS: - WTBL_SET_FD(rate_info[0], 1); - WTBL_SET_TD(rate_info[0], 1); - break; - - default: - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Unknown entry type(%d) do not support header translation\n", - __func__, WtblInfo.WcidType)); - break; - } - -#endif /* HDR_TRANS_TX_SUPPORT */ -#ifdef HDR_TRANS_RX_SUPPORT - - if (!IS_ASIC_CAP(pAd, fASIC_CAP_RX_HDR_TRANS)) - WTBL_SET_DIS_RHTR(dw[2], 1); - else - WTBL_SET_DIS_RHTR(dw[2], 0); - -#endif /* HDR_TRANS_RX_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - if (WtblInfo.SupportHT) { - WTBL_SET_HT(dw[2], 1); - WTBL_SET_MM(rate_info[0], WtblInfo.MpduDensity); - WTBL_SET_QOS(rate_info[0], 1); - DMAC_WTBL_DW3_SET_AF(dw[3], WtblInfo.MaxRAmpduFactor); - DMAC_WTBL_DW3_SET_BAF(dw[3], 1); - - if (WtblInfo.SupportRDG) { - DMAC_WTBL_DW3_SET_R(dw[3], 1); - DMAC_WTBL_DW3_SET_RDGBA(dw[3], 1); - } - - if (WtblInfo.SmpsMode == MMPS_DYNAMIC) - DMAC_WTBL_DW3_SET_SMPS(dw[3], 1); - else - DMAC_WTBL_DW3_SET_SMPS(dw[3], 0); - -#ifdef DOT11_VHT_AC - - if (WtblInfo.SupportVHT) - WTBL_SET_VHT(dw[2], 1); - -#endif /* DOT11_VHT_AC */ - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef TXBF_SUPPORT - WTBL_SET_PFMU_IDX(dw[2], (UCHAR)WtblInfo.PfmuId); -#endif - WTBL_SET_PARTIAL_AID(dw[2], (UCHAR)WtblInfo.Aid); - } - - WTBL_SET_PEER_ADDR4(dw[0], WtblInfo.Addr[4]); - WTBL_SET_PEER_ADDR5(dw[0], WtblInfo.Addr[5]); - WTBL_SET_PEER_ADDR0_3(dw[1], WtblInfo.Addr[0] + - (WtblInfo.Addr[1] << 8) + - (WtblInfo.Addr[2] << 16) + - (WtblInfo.Addr[3] << 24)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d):Before Write to WTBL, dump raw data:0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", - __func__, WtblInfo.Wcid, dw[0], dw[1], dw[2], dw[3], dw[4], - rate_info[0])); - MtAsicWtblWritePsm(pAd, WtblInfo.Wcid, tb_entry.wtbl_addr + 12, - 0); /* set psm as 0 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d):Write WTBL Addr:0x%x\n", __func__, WtblInfo.Wcid, - tb_entry.wtbl_addr)); - /* DW 0~1 */ - MtAsicWtblWriteRxInfo(pAd, WtblInfo.Wcid, &dw[0]); /* dw 0~1 */ - MtAsicWtblDwWrite(pAd, WtblInfo.Wcid, tb_entry.wtbl_addr, 2, dw[2]); - MtAsicWtblDwWrite(pAd, WtblInfo.Wcid, tb_entry.wtbl_addr, 3, dw[3]); - /* DW 5~8 */ - MtAsicWtblWriteRateInfo(pAd, WtblInfo.Wcid, &rate_info[0]); - MtAsicWtblFieldsReset(pAd, WtblInfo.Wcid, tb_entry.wtbl_addr); - - if (1) { - /* dump WTBL when in-direct access */ - INT i; - UINT32 wtbl_addr, wtbl_val[29] = { 0 }; - - for (i = 0; i < 29; i++) { - wtbl_addr = WTBL_BASE_ADDR + - WtblInfo.Wcid * WTBL_PER_ENTRY_SIZE + - (i * 4); - HW_IO_READ32(pAd, wtbl_addr, &wtbl_val[i]); - } - - hex_dump("After write, dump Raw WTBL Entry", (UCHAR *)wtbl_val, - 29 * 4); - } -} - -VOID MtAsicUpdateRxWCIDTable(RTMP_ADAPTER *pAd, MT_WCID_TABLE_INFO_T WtblInfo) -{ - MtAsicUpdateRxWCIDTableByDriver(pAd, WtblInfo); -} - -/* - * ========================================================================== - * Description: - * - * IRQL = DISPATCH_LEVEL - * - * ========================================================================== - */ -VOID MtAsicDelWcidTabByDriver(RTMP_ADAPTER *pAd, UCHAR wcid_idx) -{ - UCHAR cnt, cnt_s, cnt_e; - struct wtbl_entry tb_entry; - UINT32 dw[5] = { 0 }; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():wcid_idx=0x%x\n", __func__, wcid_idx)); - - if (wcid_idx == WCID_ALL) { - cnt_s = 0; - cnt_e = (WCID_ALL - 1); - } else - cnt_s = cnt_e = wcid_idx; - - for (cnt = cnt_s; cnt_s <= cnt_e; cnt_s++) { - cnt = cnt_s; - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, cnt, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, cnt)); - return; - } - - /* TODO: shiang-MT7615, why we need to set rc_a2/rv as 1 even for delTab case?? */ - /* dw0->field.rc_a2 = 1; */ - /* dw0->field.rv = 1; */ - MtAsicWtblWriteRxInfo(pAd, wcid_idx, &dw[0]); /* DW0~1 */ - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr + 4 * 2, - dw[2]); /* DW 2 */ - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr + 4 * 3, - dw[3]); /* DW 3 */ - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr + 4 * 4, - dw[4]); /* DW 4 */ - MtAsicWtblWritePsm(pAd, wcid_idx, tb_entry.wtbl_addr + 4 * 3, - 0); - MtAsicWtblFieldsReset(pAd, wcid_idx, tb_entry.wtbl_addr); - } -} - -VOID MtAsicAddRemoveKey(RTMP_ADAPTER *pAd, MT_SECURITY_CTRL SecurityCtrl) -{ -#ifdef CONFIG_WTBL_TLV_MODE - MtAsicAddRemoveKeyByFw(pAd, SecurityCtrl); -#endif -} - -/* - * ======================================================================== - * Description: - * Add Pair-wise key material into ASIC. - * Update pairwise key, TxMic and RxMic to Asic Pair-wise key table - * - * Return: - * ======================================================================== - */ -VOID MtAsicAddPairwiseKeyEntry(RTMP_ADAPTER *pAd, UCHAR WCID, CIPHER_KEY *pKey) -{ - /* Not support for HIF_MT */ - return; -} - -INT MtAsicSendCommandToMcu(IN RTMP_ADAPTER *pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic) -{ - /* Not support for HIF_MT */ - return FALSE; -} - -BOOLEAN MtAsicSendCmdToMcuAndWait(IN RTMP_ADAPTER *pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic) -{ - BOOLEAN cmd_done = TRUE; - - MtAsicSendCommandToMcu(pAd, Command, Token, Arg0, Arg1, in_atomic); - return cmd_done; -} - -BOOLEAN MtAsicSendCommandToMcuBBP(IN PRTMP_ADAPTER pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN FlgIsNeedLocked) -{ - /* Not support for HIF_MT */ - return FALSE; -} - -VOID MtAsicTurnOffRFClk(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - /* Not support for HIF_MT */ - return; -} - -#ifdef STREAM_MODE_SUPPORT -UINT32 MtStreamModeRegVal(RTMP_ADAPTER *pAd) -{ - return 0x0; -} - -/* - * ======================================================================== - * Description: - * configure the stream mode of specific MAC or all MAC and set to ASIC. - * - * Prameters: - * pAd --- - * pMacAddr --- - * bClear --- disable the stream mode for specific macAddr when - * (pMacAddr!=NULL) - * - * Return: - * ======================================================================== - */ -VOID MtAsicSetStreamMode(IN RTMP_ADAPTER *pAd, IN PUCHAR pMacAddr, - IN INT chainIdx, IN BOOLEAN bEnabled) -{ - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); -} - -VOID MtAsicStreamModeInit(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); -} -#endif /* STREAM_MODE_SUPPORT // */ - -#ifdef DOT11_N_SUPPORT -INT MtAsicReadAggCnt(RTMP_ADAPTER *pAd, ULONG *aggCnt, int cnt_len) -{ - NdisZeroMemory(aggCnt, cnt_len * sizeof(ULONG)); - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); - return FALSE; -} - -INT MtAsicSetRalinkBurstMode(RTMP_ADAPTER *pAd, BOOLEAN enable) -{ - /* Not support for HIF_MT */ - return FALSE; -} - -#endif /* DOT11_N_SUPPORT // */ - -INT MtAsicWaitMacTxRxIdle(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -static UINT32 reg_wmm_cr[4] = { ARB_TQSW0, ARB_TQSW1, ARB_TQSW2, ARB_TQSW3 }; -static UINT32 reg_mgmt_cr[2] = { ARB_TQSM0, ARB_TQSM1 }; - -INT32 MtAsicSetTxQ(RTMP_ADAPTER *pAd, INT WmmSet, INT BandIdx, BOOLEAN Enable) -{ - UINT32 reg_w = 0, mask_w = 0, val_w; - UINT32 reg_mgmt = 0, mask_m = 0, val_m; - - if ((BandIdx < 2) && (WmmSet < 4)) { - reg_mgmt = reg_mgmt_cr[BandIdx]; - mask_w = 0x0f0f0f0f; - reg_w = reg_wmm_cr[WmmSet]; - mask_m = 0x0f000f0f; - MAC_IO_READ32(pAd, reg_w, &val_w); - val_w = ((Enable) ? (val_w | mask_w) : (val_w & (~mask_w))); - MAC_IO_WRITE32(pAd, reg_w, val_w); - MAC_IO_READ32(pAd, reg_mgmt, &val_m); - val_m = ((Enable) ? (val_m | mask_m) : (val_m & (~mask_m))); - MAC_IO_WRITE32(pAd, reg_mgmt, val_m); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Set WmmSet=%d, band=%d, Enable=%d with CR[0x%x = 0x%08x, 0x%x=0x%08x]\n", - __func__, WmmSet, BandIdx, Enable, reg_w, val_w, - reg_mgmt, val_m)); - return TRUE; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Invalid Input paramter!WmmSet=%d, BssIdx=%d, band=%d, Enable=%d\n", - __func__, WmmSet, BandIdx, BandIdx, Enable)); - return FALSE; -} - -INT32 MtAsicSetMacTxRx(RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN Enable, - UCHAR BandIdx) -{ - UINT32 Value, Value2; - UINT32 i; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - MAC_IO_READ32(pAd, ARB_SCR, &Value); - MAC_IO_READ32(pAd, ARB_RQCR, &Value2); - - switch (TxRx) { - case ASIC_MAC_TX: - if (Enable) - Value &= (BandIdx) ? (~MT_ARB_SCR_TX1DIS) : - (~MT_ARB_SCR_TXDIS); - else - Value |= (BandIdx) ? MT_ARB_SCR_TX1DIS : - MT_ARB_SCR_TXDIS; - - break; - - case ASIC_MAC_RX: - if (Enable) { - Value &= (BandIdx) ? (~MT_ARB_SCR_RX1DIS) : - (~MT_ARB_SCR_RXDIS); - Value2 |= (BandIdx) ? ARB_RQCR_RX1_START : - ARB_RQCR_RX_START; - } else { - Value |= (BandIdx) ? MT_ARB_SCR_RX1DIS : - MT_ARB_SCR_RXDIS; - Value2 &= (BandIdx) ? (~ARB_RQCR_RX1_START) : - (~ARB_RQCR_RX_START); - } - - break; - - case ASIC_MAC_TXRX: - if (Enable) { - Value &= (BandIdx) ? (~(MT_ARB_SCR_TX1DIS | - MT_ARB_SCR_RX1DIS)) : - (~(MT_ARB_SCR_TXDIS | - MT_ARB_SCR_RXDIS)); - Value2 |= (BandIdx) ? ARB_RQCR_RX1_START : - ARB_RQCR_RX_START; - } else { - Value |= (BandIdx) ? - (MT_ARB_SCR_TX1DIS | - MT_ARB_SCR_RX1DIS) : - (MT_ARB_SCR_TXDIS | MT_ARB_SCR_RXDIS); - Value2 &= (BandIdx) ? (~ARB_RQCR_RX1_START) : - (~ARB_RQCR_RX_START); - } - - break; - - case ASIC_MAC_TXRX_RXV: - if (Enable) { - Value &= (BandIdx) ? (~(MT_ARB_SCR_TX1DIS | - MT_ARB_SCR_RX1DIS)) : - (~(MT_ARB_SCR_TXDIS | - MT_ARB_SCR_RXDIS)); - Value2 |= (BandIdx) ? ((ARB_RQCR_RX1_START | - ARB_RQCR_RXV1_START | - ARB_RQCR_RXV1_R_EN | - ARB_RQCR_RXV1_T_EN)) : - ((ARB_RQCR_RX_START | - ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | - ARB_RQCR_RXV_T_EN)); - } else { - Value |= (BandIdx) ? - (MT_ARB_SCR_TX1DIS | - MT_ARB_SCR_RX1DIS) : - (MT_ARB_SCR_TXDIS | MT_ARB_SCR_RXDIS); - Value2 &= (BandIdx) ? ~(ARB_RQCR_RX1_START | - ARB_RQCR_RXV1_START | - ARB_RQCR_RXV1_R_EN | - ARB_RQCR_RXV1_T_EN) : - ~(ARB_RQCR_RX_START | - ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | - ARB_RQCR_RXV_T_EN); - } - - break; - - case ASIC_MAC_RXV: - if (Enable) { - Value &= (BandIdx) ? ~MT_ARB_SCR_RX1DIS : - ~MT_ARB_SCR_RXDIS; - Value2 |= (BandIdx) ? (ARB_RQCR_RXV1_START | - ARB_RQCR_RXV1_R_EN | - ARB_RQCR_RXV1_T_EN) : - (ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | - ARB_RQCR_RXV_T_EN); - } else { - Value2 &= (BandIdx) ? ~(ARB_RQCR_RXV1_START | - ARB_RQCR_RXV1_R_EN | - ARB_RQCR_RXV1_T_EN) : - ~(ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | - ARB_RQCR_RXV1_T_EN); - } - - break; - - case ASIC_MAC_RX_RXV: - if (Enable) { - Value &= (BandIdx) ? ~MT_ARB_SCR_RX1DIS : - ~MT_ARB_SCR_RXDIS; - Value2 |= (BandIdx) ? (ARB_RQCR_RX1_START | - ARB_RQCR_RXV1_START | - ARB_RQCR_RXV1_R_EN | - ARB_RQCR_RXV1_T_EN) : - (ARB_RQCR_RX_START | - ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | - ARB_RQCR_RXV_T_EN); - } else { - Value |= (BandIdx) ? MT_ARB_SCR_RX1DIS : - MT_ARB_SCR_RXDIS; - Value2 &= (BandIdx) ? ~(ARB_RQCR_RX1_START | - ARB_RQCR_RXV1_START | - ARB_RQCR_RXV1_R_EN | - ARB_RQCR_RXV1_T_EN) : - ~(ARB_RQCR_RX_START | - ARB_RQCR_RXV_START | - ARB_RQCR_RXV_R_EN | - ARB_RQCR_RXV_T_EN); - } - - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown path (%d)\n", __func__, TxRx)); - break; - } - - MAC_IO_WRITE32(pAd, ARB_SCR, Value); - MAC_IO_WRITE32(pAd, ARB_RQCR, Value2); - - /*Set TX Queue*/ - for (i = 0; i < cap->WmmHwNum; i++) - MtAsicSetTxQ(pAd, i, BandIdx, Enable); - - return TRUE; -} - -INT MtAsicSetWPDMA(RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN enable, - UINT8 WPDMABurstSIZE) -{ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->hif_set_dma) - return ops->hif_set_dma(pAd, TxRx, enable, cap->WPDMABurstSIZE); - - return FALSE; -} - -BOOLEAN MtAsicWaitPDMAIdle(struct _RTMP_ADAPTER *pAd, INT round, INT wait_us) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->hif_wait_dma_idle) - return ops->hif_wait_dma_idle(pAd, round, wait_us); - - return FALSE; -} - -BOOLEAN MtAsicResetWPDMA(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->hif_reset_dma) - return ops->hif_reset_dma(pAd); - - return FALSE; -} - -INT MtAsicSetMacWD(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT MtAsicSetTxStream(RTMP_ADAPTER *pAd, UINT32 StreamNums, UCHAR BandIdx) -{ - UINT32 Value; - UINT32 Reg; - - Reg = (BandIdx) ? TMAC_TCR1 : TMAC_TCR; - MAC_IO_READ32(pAd, Reg, &Value); - Value &= ~TMAC_TCR_TX_STREAM_NUM_MASK; - Value |= TMAC_TCR_TX_STREAM_NUM(StreamNums - 1); - MAC_IO_WRITE32(pAd, Reg, Value); - return TRUE; -} - -#ifdef NEW_SET_RX_STREAM - -INT MtAsicSetRxStream(RTMP_ADAPTER *pAd, UINT32 StreamNums, UCHAR BandIdx) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): StreamNums(%d) BandIdx(%d)\n", __func__, StreamNums, - BandIdx)); - - if (ops->ChipSetRxStream) - return ops->ChipSetRxStream(pAd, StreamNums, BandIdx); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("For this chip, no specified set RxStream function!\n")); - - return TRUE; -} - -#else - -INT MtAsicSetRxStream(RTMP_ADAPTER *pAd, UINT32 StreamNums, UCHAR BandIdx) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not finish Yet!\n", __func__, __LINE__)); - return 0; -} - -#endif - -INT MtAsicSetBW(RTMP_ADAPTER *pAd, INT bw, UCHAR BandIdx) -{ - UINT32 val, offset; -#ifndef COMPOS_WIN - /* TODO: shiang-usw, some CR setting in bbp_set_bw() need to take care!! */ - bbp_set_bw(pAd, bw, BandIdx); -#endif /* COMPOS_WIN */ - offset = (BandIdx == 0) ? 2 : 18; - MAC_IO_READ32(pAd, AGG_BWCR, &val); - val &= ~(3 << offset); - - switch (bw) { - case BW_20: - val |= (0 << offset); - break; - - case BW_40: - val |= (0x1 << offset); - break; - - case BW_80: - val |= (0x2 << offset); - break; - - case BW_160: - case BW_8080: - val |= (0x3 << offset); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():Invalid BW(%d)!\n", __func__, bw)); - } - - MAC_IO_WRITE32(pAd, AGG_BWCR, val); - return TRUE; -} - -INT MtAsicSetRxPath(RTMP_ADAPTER *pAd, UINT32 RxPathSel, UCHAR BandIdx) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not finish Yet!\n", __func__, __LINE__)); - return 0; -} - -UINT32 MtAsicGetRxStat(RTMP_ADAPTER *pAd, UINT type) -{ - UINT32 value = 0; - - switch (type) { - case HQA_RX_STAT_MACFCSERRCNT: - MAC_IO_READ32(pAd, MIB_M0SDR3, &value); - value = value & 0xFFFF; /* [15:0] FCS ERR */ - break; - - case HQA_RX_STAT_MAC_MDRDYCNT: - MAC_IO_READ32(pAd, MIB_M0SDR10, &value); - value = value & 0x3FFFFFF; /* [15:0] Mac Mdrdy*/ - break; - - case HQA_RX_STAT_MAC_RXLENMISMATCH: - MAC_IO_READ32(pAd, MIB_M0SDR11, &value); - value = value & 0xFFFF; - break; - -#ifdef MT7622 - case HQA_RX_STAT_MAC_FCS_OK_COUNT: - MAC_IO_READ32(pAd, MIB_M0SDR51, &value); - value = value & 0xFFFF; - break; -#endif /* MT7622 */ - - case HQA_RX_STAT_PHY_MDRDYCNT: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS5, &value); - break; - - case HQA_RX_STAT_PHY_FCSERRCNT: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS4, &value); - break; - - case HQA_RX_STAT_PD: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS0, &value); - break; - - case HQA_RX_STAT_CCK_SIG_SFD: - /* [31:16] SIG [15:0] SFD */ - PHY_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS1, &value); - break; - - case HQA_RX_STAT_OFDM_SIG_TAG: - /* [31:16] SIG [15:0] TAG */ - PHY_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS2, &value); - break; - - case HQA_RX_STAT_RSSI: - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_2, &value); - break; - - case HQA_RX_STAT_RSSI_RX23: - PHY_IO_READ32(pAd, RO_BAND1_AGC_DEBUG_2, &value); - break; - - case HQA_RX_STAT_ACI_HITL: - PHY_IO_READ32(pAd, RO_BAND0_AGC_DEBUG_4, &value); - break; - - case HQA_RX_STAT_ACI_HITH: - PHY_IO_READ32(pAd, RO_BAND1_AGC_DEBUG_4, &value); - break; - - case HQA_RX_FIFO_FULL_COUNT: - MAC_IO_READ32(pAd, MIB_M0SDR4, &value); - value = (value >> 16) & 0xffff; - break; - - case HQA_RX_FIFO_FULL_COUNT_BAND1: - MAC_IO_READ32(pAd, MIB_M1SDR4, &value); - value = (value >> 16) & 0xffff; - break; - - case HQA_RX_RESET_PHY_COUNT: - PHY_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS5, &value); - PHY_IO_READ32(pAd, RO_BAND0_PHYCTRL_STS4, &value); - break; - - case HQA_RX_STAT_MACFCSERRCNT_BAND1: - MAC_IO_READ32(pAd, MIB_M1SDR3, &value); - break; - - case HQA_RX_STAT_MAC_MDRDYCNT_BAND1: - MAC_IO_READ32(pAd, MIB_M1SDR10, &value); - break; - - case HQA_RX_STAT_MAC_RXLENMISMATCH_BAND1: - MAC_IO_READ32(pAd, MIB_M1SDR11, &value); - break; - - case HQA_RX_RESET_MAC_COUNT: - MAC_IO_READ32(pAd, MIB_M0SDR3, &value); - MAC_IO_READ32(pAd, MIB_M0SDR10, &value); - MAC_IO_READ32(pAd, MIB_M1SDR3, &value); - MAC_IO_READ32(pAd, MIB_M1SDR10, &value); - break; - - case HQA_RX_STAT_PHY_MDRDYCNT_BAND1: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_BAND1_PHYCTRL_STS5, &value); - break; - - case HQA_RX_STAT_PHY_FCSERRCNT_BAND1: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_BAND1_PHYCTRL_STS4, &value); - break; - - case HQA_RX_STAT_PD_BAND1: - /* [31:16] OFDM [15:0] CCK */ - PHY_IO_READ32(pAd, RO_BAND1_PHYCTRL_STS0, &value); - break; - - case HQA_RX_STAT_CCK_SIG_SFD_BAND1: - /* [31:16] SIG [15:0] SFD */ - PHY_IO_READ32(pAd, RO_BAND1_PHYCTRL_STS1, &value); - break; - - case HQA_RX_STAT_OFDM_SIG_TAG_BAND1: - /* [31:16] SIG [15:0] TAG */ - PHY_IO_READ32(pAd, RO_BAND1_PHYCTRL_STS2, &value); - break; - - default: - break; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Type(%d):%x\n", __func__, type, value)); - return value; -} - -#ifdef CONFIG_ATE -INT MtAsicSetRfFreqOffset(RTMP_ADAPTER *pAd, UINT32 FreqOffset) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not finish Yet!\n", __func__, __LINE__)); - return 0; -} - -INT MtAsicSetTSSI(RTMP_ADAPTER *pAd, UINT32 bOnOff, UCHAR WFSelect) -{ - UINT32 CRValue = 0x0; - UINT32 WF0Offset = 0x10D04; /* WF_PHY_CR_FRONT CR_WF0_TSSI_1 */ - UINT32 WF1Offset = 0x11D04; /* WF_PHY_CR_FRONT CR_WF1_TSSI_1 */ - INT Ret = TRUE; - /* !!TEST MODE ONLY!! Normal Mode control by FW and Never disable */ - /* WF0 = 0, WF1 = 1, WF ALL = 2 */ - - if (bOnOff == FALSE) - CRValue = 0xE3F3F800; - else - CRValue = 0xE1010800; - - if ((WFSelect == 0) || (WFSelect == 2)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Set WF#%d TSSI off\n", __func__, WFSelect)); - PHY_IO_WRITE32(pAd, WF0Offset, CRValue); - - if (bOnOff == FALSE) { - /* off */ - PHY_IO_WRITE32(pAd, 0x10D18, 0x0); - } - } - - if ((WFSelect == 1) || (WFSelect == 2)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Set WF#%d TSSI on\n", __func__, WFSelect)); - PHY_IO_WRITE32(pAd, WF1Offset, CRValue); - - if (bOnOff == FALSE) { - /* off */ - PHY_IO_WRITE32(pAd, 0x11D18, 0x0); - } - } - - return Ret; -} - -INT MtAsicSetDPD(RTMP_ADAPTER *pAd, UINT32 bOnOff, UCHAR WFSelect) -{ - UINT32 CRValue = 0x0; - ULONG WF0Offset = 0x10A08; - ULONG WF1Offset = 0x11A08; - INT Ret = TRUE; - /* !!TEST MODE ONLY!! Normal Mode control by FW and Never disable */ - /* WF0 = 0, WF1 = 1, WF ALL = 2 */ - - if (bOnOff == FALSE) { - /* WF0 */ - if ((WFSelect == 0) || (WFSelect == 2)) { - PHY_IO_READ32(pAd, WF0Offset, &CRValue); - CRValue |= 0xF0000000; - PHY_IO_WRITE32(pAd, WF0Offset, CRValue); - } - - /* WF1 */ - if ((WFSelect == 1) || (WFSelect == 2)) { - PHY_IO_READ32(pAd, WF1Offset, &CRValue); - CRValue |= 0xF0000000; - PHY_IO_WRITE32(pAd, WF1Offset, CRValue); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Set WFSelect: %d DPD off\n", __func__, - WFSelect)); - } else { - if ((WFSelect == 0) || (WFSelect == 2)) { - PHY_IO_READ32(pAd, WF0Offset, &CRValue); - CRValue &= (~0xF0000000); - PHY_IO_WRITE32(pAd, WF0Offset, CRValue); - } - - if ((WFSelect == 1) || (WFSelect == 2)) { - PHY_IO_READ32(pAd, WF1Offset, &CRValue); - CRValue &= (~0xF0000000); - PHY_IO_WRITE32(pAd, WF1Offset, CRValue); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Set WFSelect: %d DPD on\n", __func__, WFSelect)); - } - - return Ret; -} - -#ifdef COMPOS_TESTMODE_WIN -/** - * Tx Set Frequency Offset - * - * @param pDeviceObject pointer PDEVICE_OBJECT - * @param iOffset value - * - * @return void - * Otherwise, an error code is returned. - */ -INT MTAsicTxSetFrequencyOffset(RTMP_ADAPTER *pAd, UINT32 iOffset, - BOOLEAN HasBeenSet) -{ - UINT32 Value = 0; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s iOffset=0x%x-->\n", __func__, iOffset)); - - if (HasBeenSet == FALSE) { - if (IS_MT7603(pAd)) { - /* RG_XO_C2[8:14] Set 60 (0x3C )at first */ - MAC_IO_READ32(pAd, RG_XO_C2, &Value); - Value = (Value & 0xFFFF80FF) | (0x3C << 8); - MAC_IO_WRITE32(pAd, RG_XO_C2, Value); - /* RG_XO_C2_MANUAL [8:14] Set 0x7F at first */ - MAC_IO_READ32(pAd, RG_XO_C2_MANUAL, &Value); - Value = (Value & 0xFFFF80FF) | (0x7F << 8); - MAC_IO_WRITE32(pAd, RG_XO_C2_MANUAL, Value); - /* only set at first time */ - } else if (IS_MT76x6(pAd)) { - MAC_IO_READ32(pAd, FREQ_OFFSET_MANUAL_ENABLE, &Value); - Value = (Value & 0xFFFF80FF) | (0x7F << 8); - MAC_IO_WRITE32(pAd, FREQ_OFFSET_MANUAL_ENABLE, Value); - } - } - - if (IS_MT7603(pAd)) { - HW_IO_READ32(pAd, RG_XO_C2, &Value); - Value = (Value & 0xFFFF80FF) | (iOffset << 8); - HW_IO_WRITE32(pAd, RG_XO_C2, Value); - } - - return 0; -} -/** - * Set Tx Power Range - * - * @param pDeviceObject pointer PDEVICE_OBJECT - * @param ucMaxPowerDbm, Max Power Dbm - * @param ucMinPowerDbm, Min Power Dbm - * - * @return void - * Otherwise, an error code is returned. - */ -INT MTAsicTxConfigPowerRange(RTMP_ADAPTER *pAd, IN UCHAR ucMaxPowerDbm, - IN UCHAR ucMinPowerDbm) -{ - UINT32 u4RegValue; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s-->\n", __func__)); - MAC_IO_READ32(pAd, TMAC_FPCR, &u4RegValue); - u4RegValue &= ~(FPCR_FRAME_POWER_MAX_DBM | FPCR_FRAME_POWER_MIN_DBM); - u4RegValue |= ((ucMaxPowerDbm << FPCR_FRAME_POWER_MAX_DBM_OFFSET) & - FPCR_FRAME_POWER_MAX_DBM); - u4RegValue |= ((ucMinPowerDbm << FPCR_FRAME_POWER_MIN_DBM_OFFSET) & - FPCR_FRAME_POWER_MIN_DBM); - MAC_IO_WRITE32(pAd, TMAC_FPCR, u4RegValue); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<--\n", __func__)); - return 0; -} - -INT MTAsicSetTMR(RTMP_ADAPTER *pAd, UCHAR enable, UCHAR BandIdx) -{ - UINT32 value = 0; - UINT32 Reg = (BandIdx) ? RMAC_TMR_PA_BAND_1 : RMAC_TMR_PA; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, -->\n", __func__)); - - switch (enable) { - case 1: { /* initialiter */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: enable TMR report, as Initialiter\n", __func__)); - MAC_IO_READ32(pAd, Reg, &value); - value = value | BIT31; - value = value & ~BIT30; - value = value | 0x34; /* Action frame register */ - MAC_IO_WRITE32(pAd, Reg, value); - } break; - - case 2: { /* responder */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: enable TMR report, as Responser\n", __func__)); - MAC_IO_READ32(pAd, Reg, &value); - value = value | BIT31; - value = value | BIT30; - value = value | 0x34; /* Action frame register */ - MAC_IO_WRITE32(pAd, Reg, value); - } break; - - case 0: /* disable */ - default: { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: disable TMR report\n", __func__)); - MAC_IO_READ32(pAd, Reg, &value); - value = value & ~BIT31; - MAC_IO_WRITE32(pAd, Reg, value); - } - } - - return 0; -} -#endif -#endif /* CONFIG_ATE */ - -#ifndef MAC_INIT_OFFLOAD -VOID MtAsicSetRxGroup(RTMP_ADAPTER *pAd, UINT32 Port, UINT32 Group, - BOOLEAN Enable) -{ - UINT32 Value; - - MCU_IO_READ32(pAd, RXINF, &Value); - - if (Enable) { - if (Group & RXS_GROUP1) - Value |= RXSH_GROUP1_EN; - - if (Group & RXS_GROUP2) - Value |= RXSH_GROUP2_EN; - - if (Group & RXS_GROUP3) - Value |= RXSH_GROUP3_EN; - } else { - if (Group & RXS_GROUP1) - Value &= ~RXSH_GROUP1_EN; - - if (Group & RXS_GROUP2) - Value &= ~RXSH_GROUP2_EN; - - if (Group & RXS_GROUP3) - Value &= ~RXSH_GROUP3_EN; - } - - MCU_IO_WRITE32(pAd, RXINF, Value); - MAC_IO_READ32(pAd, DMA_DCR1, &Value); - - if (Enable) { - if (Group & RXS_GROUP1) - Value |= RXSM_GROUP1_EN; - - if (Group & RXS_GROUP2) - Value |= RXSM_GROUP2_EN; - - if (Group & RXS_GROUP3) - Value |= RXSM_GROUP3_EN; - } else { - if (Group & RXS_GROUP1) - Value &= ~RXSM_GROUP1_EN; - - if (Group & RXS_GROUP2) - Value &= ~RXSM_GROUP2_EN; - - if (Group & RXS_GROUP3) - Value &= ~RXSM_GROUP3_EN; - } - - MAC_IO_WRITE32(pAd, DMA_DCR1, Value); -} - -INT MtAsicSetBAWinSizeRange(RTMP_ADAPTER *pAd) -{ - UINT32 mac_val; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR *ba_range = cap->ba_range; - - /* A-MPDU BA WinSize control */ - MAC_IO_READ32(pAd, AGG_AWSCR0, &mac_val); - mac_val &= ~WINSIZE0_MASK; - mac_val |= WINSIZE0(ba_range[0]); - mac_val &= ~WINSIZE1_MASK; - mac_val |= WINSIZE1(ba_range[1]); - mac_val &= ~WINSIZE2_MASK; - mac_val |= WINSIZE2(ba_range[2]); - mac_val &= ~WINSIZE3_MASK; - mac_val |= WINSIZE3(ba_range[3]); - MAC_IO_WRITE32(pAd, AGG_AWSCR0, mac_val); - MAC_IO_READ32(pAd, AGG_AWSCR1, &mac_val); - mac_val &= ~WINSIZE4_MASK; - mac_val |= WINSIZE4(ba_range[4]); - mac_val &= ~WINSIZE5_MASK; - mac_val |= WINSIZE5(ba_range[5]); - mac_val &= ~WINSIZE6_MASK; - mac_val |= WINSIZE6(ba_range[6]); - mac_val &= ~WINSIZE7_MASK; - mac_val |= WINSIZE7(ba_range[7]); - MAC_IO_WRITE32(pAd, AGG_AWSCR1, mac_val); - /* A-MPDU Agg limit control */ - /* We can delivery 64! */ - MAC_IO_WRITE32(pAd, AGG_AALCR0, 0); - MAC_IO_WRITE32(pAd, AGG_AALCR1, 0); - MAC_IO_WRITE32(pAd, AGG_AALCR2, 0); - MAC_IO_WRITE32(pAd, AGG_AALCR3, 0); - /* TODO: shiang-MT7615, document mismatch, where should we set range 7?? */ - /* AMPDU Statistics Range Control setting - * 0 < agg_cnt - 1 <= range_cr(0), => 1 - * range_cr(0) < agg_cnt - 1 <= range_cr(4), => 2~5 - * range_cr(4) < agg_cnt - 1 <= range_cr(14), => 6~15 - * range_cr(14) < agg_cnt - 1, => 16~ - */ - MAC_IO_READ32(pAd, AGG_ASRCR0, &mac_val); - mac_val = (ba_mib_range[0] << 0) | (ba_mib_range[1] << 8) | - (ba_mib_range[2] << 16) | (ba_mib_range[3] << 24); - MAC_IO_WRITE32(pAd, AGG_ASRCR0, mac_val); - MAC_IO_READ32(pAd, AGG_ASRCR1, &mac_val); - mac_val = (ba_mib_range[4] << 0) | (ba_mib_range[5] << 8) | - (ba_mib_range[6] << 16) | (ba_mib_range[7] << 24); - MAC_IO_WRITE32(pAd, AGG_ASRCR1, mac_val); - return TRUE; -} - -INT MtAsicSetBARTxRate(RTMP_ADAPTER *pAd) -{ - UINT32 mac_val; - /* TODO: shiang-MT7615, document mismatch!! */ - /* Configure the BAR rate setting */ - MAC_IO_READ32(pAd, AGG_ACR0, &mac_val); - mac_val &= (~0xfff00000); - mac_val &= ~(AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK | AMPDU_NO_BA_RULE); - mac_val |= AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK; - MAC_IO_WRITE32(pAd, AGG_ACR0, mac_val); - return TRUE; -} - -VOID MtAsicSetBARTxCntLimit(RTMP_ADAPTER *pAd, BOOLEAN Enable, UINT32 Count) -{ - UINT32 Value; - /* TODO: check for RTY_MODE!! */ - MAC_IO_READ32(pAd, AGG_MRCR, &Value); - - if (Enable) { - Value &= ~BAR_TX_CNT_LIMIT_MASK; - Value |= BAR_TX_CNT_LIMIT(Count); - } else { - Value &= ~BAR_TX_CNT_LIMIT_MASK; - Value |= BAR_TX_CNT_LIMIT(0); - } - - MAC_IO_WRITE32(pAd, AGG_MRCR, Value); -} - -VOID MtAsicSetTxSClassifyFilter(RTMP_ADAPTER *pAd, UINT32 Port, UINT8 DestQ, - UINT32 AggNums, UINT32 Filter, UCHAR BandIdx) -{ - UINT32 Value; - UINT32 Reg; - - if (Port == TXS2HOST) { - Reg = (BandIdx) ? DMA_BN1TCFR1 : DMA_BN0TCFR1; - MAC_IO_READ32(pAd, Reg, &Value); - Value &= ~TXS2H_BIT_MAP_MASK; - Value |= TXS2H_BIT_MAP(Filter); - Value &= ~TXS2H_AGG_CNT_MASK; - Value |= TXS2H_AGG_CNT(AggNums); - - if (DestQ == 0) - Value &= ~TXS2H_QID; - else - Value |= TXS2H_QID; - - MAC_IO_WRITE32(pAd, Reg, Value); - } else if (Port == TXS2MCU) { - Reg = (BandIdx) ? DMA_BN1TCFR0 : DMA_BN0TCFR0; - MAC_IO_READ32(pAd, Reg, &Value); - Value &= ~TXS2M_BIT_MAP_MASK; - Value |= TXS2M_BIT_MAP(Filter); - Value &= ~TXS2M_AGG_CNT_MASK; - Value |= TXS2M_AGG_CNT(AggNums); - Value &= ~TXS2M_QID_MASK; - Value |= TXS2M_QID(DestQ); - MAC_IO_WRITE32(pAd, Reg, Value); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknow Port(%d)\n", __func__, Port)); -} -#endif /* MAC_INIT_OFFLOAD */ - -INT32 MtAsicGetMacInfo(RTMP_ADAPTER *pAd, UINT32 *ChipId, UINT32 *HwVer, - UINT32 *FwVer) -{ - UINT32 Value; - - HW_IO_READ32(pAd, TOP_HVR, &Value); - *HwVer = Value; - HW_IO_READ32(pAd, TOP_FVR, &Value); - *FwVer = Value; - HW_IO_READ32(pAd, TOP_HCR, &Value); - *ChipId = Value; - return TRUE; -} - -INT32 MtAsicGetFwSyncValue(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->get_fw_sync_value) - return ops->get_fw_sync_value(pAd); - - return FALSE; -} - -VOID MtAsicInitMac(RTMP_ADAPTER *pAd) -{ -#ifndef BCN_OFFLOAD_SUPPORT - UINT32 mac_val; - - MAC_IO_READ32(pAd, PLE_RELEASE_CTRL, &mac_val); - mac_val = mac_val | SET_BCN0_RLS_QID(UMAC_PLE_CTRL_P3_Q_0X1F) | - SET_BCN0_RLS_PID(P_IDX_PLE_CTRL_PSE_PORT_3) | - SET_BCN1_RLS_QID(UMAC_PLE_CTRL_P3_Q_0X1F) | - SET_BCN1_RLS_PID(P_IDX_PLE_CTRL_PSE_PORT_3); - MAC_IO_WRITE32(pAd, PLE_RELEASE_CTRL, mac_val); -#endif -#ifndef MAC_INIT_OFFLOAD - UINT32 mac_val, mac_val_bnd[2]; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s()-->\n", __func__)); - MtAsicSetBAWinSizeRange(pAd); - /* TMR report queue setting */ - MAC_IO_READ32(pAd, DMA_BN0TMCFR0, &mac_val_bnd[0]); - mac_val_bnd[0] |= BIT13; /* TMR report send to HIF q1. */ - mac_val_bnd[0] &= (~(BIT0)); - mac_val_bnd[0] &= (~(BIT1)); - MAC_IO_WRITE32(pAd, DMA_BN0TMCFR0, mac_val_bnd[0]); - MAC_IO_READ32(pAd, RMAC_TMR_PA, &mac_val); - mac_val = mac_val & ~BIT31; - MAC_IO_WRITE32(pAd, RMAC_TMR_PA, mac_val); -#ifdef DBDC_MODE - MAC_IO_READ32(pAd, DMA_BN1TMCFR0, &mac_val_bnd[1]); - mac_val_bnd[1] = mac_val_bnd[0]; - MAC_IO_WRITE32(pAd, DMA_BN1TMCFR0, mac_val_bnd[1]); - MAC_IO_READ32(pAd, RMAC_TMR_PA_BAND_1, &mac_val); - mac_val = mac_val & ~BIT31; - MAC_IO_WRITE32(pAd, RMAC_TMR_PA_BAND_1, mac_val); -#endif /*DBDC_MODE*/ - /* Configure all rx packets to HIF, except WOL2M packet */ - MAC_IO_READ32(pAd, DMA_BN0RCFR0, &mac_val_bnd[0]); - mac_val_bnd[0] = 0x00010000; /* drop duplicate */ - /* TODO: shiang-MT7615, make sure the bit31~30 setting for BN0_RX2M_QID */ - mac_val_bnd[0] |= - 0xc0108000; /* receive BA/CF_End/Ack/RTS/CTS/CTRL_RSVED */ - MAC_IO_WRITE32(pAd, DMA_BN0RCFR0, mac_val_bnd[0]); - /* Configure Rx Vectors report to HIF */ - MAC_IO_READ32(pAd, DMA_BN0VCFR0, &mac_val); - mac_val &= (~(BIT0)); /* To HIF */ - mac_val |= BIT13; /* RxRing 1 */ - MAC_IO_WRITE32(pAd, DMA_BN0VCFR0, mac_val); -#ifdef DBDC_MODE - MAC_IO_READ32(pAd, DMA_BN1RCFR0, &mac_val_bnd[1]); - mac_val_bnd[1] = mac_val_bnd[0]; - MAC_IO_WRITE32(pAd, DMA_BN1RCFR0, mac_val_bnd[1]); - /* Configure Rx Vectors report to HIF */ - MAC_IO_READ32(pAd, DMA_BN1VCFR0, &mac_val); - mac_val &= (~(BIT0)); /* To HIF */ - mac_val |= BIT13; /* RxRing 1 */ - MAC_IO_WRITE32(pAd, DMA_BN1VCFR0, mac_val); -#endif /*DBDC_MODE*/ - /*RCR for Ctrl Fram can match*/ - MAC_IO_READ32(pAd, WTBL_OFF_RCR, &mac_val); - mac_val |= CHECK_CTRL(1); - MAC_IO_WRITE32(pAd, WTBL_OFF_RCR, mac_val); - /* TODO: shiang-MT7615, need further check!! */ - /* AMPDU BAR setting */ - /* Enable HW BAR feature */ - MtAsicSetBARTxCntLimit(pAd, TRUE, 1); - MtAsicSetBARTxRate(pAd); - /* TODO: shiang-MT7615, document mismatch!! */ - /* Configure the BAR rate setting */ - MAC_IO_READ32(pAd, AGG_ACR0, &mac_val); - mac_val &= (~0xfff00000); - mac_val &= ~(AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK | AMPDU_NO_BA_RULE); - mac_val |= AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK; - MAC_IO_WRITE32(pAd, AGG_ACR0, mac_val); - /* Enable MIB counters for band 0 and band 1 */ - MAC_IO_WRITE32(pAd, MIB_M0SCR0, 0x7effffff); - MAC_IO_WRITE32(pAd, MIB_M0SCR1, 0x400fffe); - MAC_IO_WRITE32(pAd, MIB_M0PBSCR, 0x7f7f7f7f); -#ifdef DBDC_MODE - MAC_IO_WRITE32(pAd, MIB_M1SCR, 0x7ef3ffff); - MAC_IO_WRITE32(pAd, MIB_M1SCR1, 0xfffe); - MAC_IO_WRITE32(pAd, MIB_M1PBSCR, 0x7f7f7f7f); -#endif /*DBDC_MODE*/ - /* Enable RxV to HIF/MCU */ - MtAsicSetRxGroup(pAd, HIF_PORT, RXS_GROUP1 | RXS_GROUP2 | RXS_GROUP3, - TRUE); - /* CCA Setting */ - MAC_IO_READ32(pAd, TMAC_TRCR0, &mac_val); - mac_val &= ~CCA_SRC_SEL_MASK; - mac_val |= CCA_SRC_SEL(0x2); - mac_val &= ~CCA_SEC_SRC_SEL_MASK; - mac_val |= CCA_SEC_SRC_SEL(0x0); - MAC_IO_WRITE32(pAd, TMAC_TRCR0, mac_val); - /* TODO: shiang-MT7615, need further check!! */ -#endif /* MAC_INIT_OFFLOAD */ -} - -VOID MtAsicSetExtMbssMacByDriver(RTMP_ADAPTER *pAd, INT idx, VOID *wdev_void) -{ - struct wifi_dev *wdev = (struct wifi_dev *)wdev_void; - UCHAR *pmac_addr = (UCHAR *)wdev->if_addr; - UINT32 cr_base_0 = 0, cr_base_1 = 0, cr_val = 0; - - cr_base_0 = RMAC_MBSSIDEXT1_0 + (8 * (idx - 1)); - cr_base_1 = cr_base_0 + 4; - cr_val = pmac_addr[0] | (pmac_addr[1] << 8) | (pmac_addr[2] << 16) | - (pmac_addr[3] << 24); - MAC_IO_WRITE32(pAd, cr_base_0, cr_val); - cr_val = 0; - cr_val = pmac_addr[4] | (pmac_addr[5] << 8); - MAC_IO_WRITE32(pAd, cr_base_1, cr_val); -} - -#ifdef CONFIG_AP_SUPPORT -VOID MtAsicSetMbssLPOffset(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable) -{ - UINT32 Value = 0; - /* where the register for sub Bssid start from */ - UINT32 bssid_reg_base = LPON_SBTOR1; - BOOLEAN any_other_mbss_enable = FALSE; - - ASSERT(mbss_idx >= 1); - - if (enable == TRUE) { - /* if there is any sub bssid is enable. this bit in LPON_SBTOR1 shall be 1 always. */ - MAC_IO_READ32(pAd, bssid_reg_base, &Value); - Value |= SBSS_TBTT0_TSF0_EN; - MAC_IO_WRITE32(pAd, bssid_reg_base, Value); - MAC_IO_READ32(pAd, (bssid_reg_base + (mbss_idx - 1) * (0x4)), - &Value); - Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK; - Value |= SUB_BSSID0_TIME_OFFSET_n(mbss_idx * - BCN_TRANSMIT_ESTIMATE_TIME); - Value |= TBTT0_n_INT_EN; - Value |= PRE_TBTT0_n_INT_EN; - MAC_IO_WRITE32(pAd, (bssid_reg_base + (mbss_idx - 1) * (0x4)), - Value); - pAd->ApCfg.ext_mbss_enable_bitmap |= (enable << mbss_idx); - } else { - pAd->ApCfg.ext_mbss_enable_bitmap &= ~(enable << mbss_idx); - - if (pAd->ApCfg.ext_mbss_enable_bitmap) - any_other_mbss_enable = TRUE; - - /* if there is any ext bssid is enable. this bit in LPON_SBTOR1 shall be 1 always. */ - MAC_IO_READ32(pAd, bssid_reg_base, &Value); - - if (any_other_mbss_enable == TRUE) - Value |= SBSS_TBTT0_TSF0_EN; - else - Value &= ~SBSS_TBTT0_TSF0_EN; - - MAC_IO_WRITE32(pAd, bssid_reg_base, Value); - MAC_IO_READ32(pAd, (bssid_reg_base + (mbss_idx - 1) * (0x4)), - &Value); - Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK; - Value &= ~TBTT0_n_INT_EN; - Value &= ~PRE_TBTT0_n_INT_EN; - MAC_IO_WRITE32(pAd, (bssid_reg_base + (mbss_idx - 1) * (0x4)), - Value); - } -} - -VOID MtDmacSetExtMbssEnableCR(RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable) -{ - UINT32 regValue; - - if (enable) { - MAC_IO_READ32(pAd, RMAC_ACBEN, ®Value); - regValue |= (1 << mbss_idx); - MAC_IO_WRITE32(pAd, RMAC_ACBEN, regValue); - } else { - MAC_IO_READ32(pAd, RMAC_ACBEN, ®Value); - regValue &= ~(1 << mbss_idx); - MAC_IO_WRITE32(pAd, RMAC_ACBEN, regValue); - } -} - -VOID MtDmacSetMbssHwCRSetting(RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable) -{ - MtAsicSetMbssLPOffset(pAd, mbss_idx, enable); -} - -VOID MtAsicSetExtTTTTLPOffset(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable) -{ - UINT32 Value = 0; - /* where the register for sub Bssid start from */ - UINT32 bssid_reg_base = LPON_TT0SBOR_CR_MAPPING_TABLE[mbss_idx]; - UINT32 first_reg_base = LPON_TT0SBOR_CR_MAPPING_TABLE[1]; - BOOLEAN any_other_mbss_tttt_enable = FALSE; - - if (mbss_idx == 0) - return; - - if (enable == TRUE) { - /* if there is any sub bssid is enable. this bit in LPON_SBTOR1 shall be 1 always. */ - MAC_IO_READ32(pAd, first_reg_base, &Value); - Value |= SBSS_TTTT0_TSF0_EN; - MAC_IO_WRITE32(pAd, first_reg_base, Value); - MAC_IO_READ32(pAd, bssid_reg_base, &Value); - Value &= ~SUB_BSSID0_TTTT_OFFSET_n_MASK; - Value |= DEFAULT_TTTT_OFFSET_IN_MS; - Value |= TTTT0_n_INT_EN; - Value |= PRE_TTTT0_n_INT_EN; - MAC_IO_WRITE32(pAd, bssid_reg_base, Value); - pAd->ApCfg.ext_mbss_tttt_enable_bitmap |= (enable << mbss_idx); - } else { - pAd->ApCfg.ext_mbss_tttt_enable_bitmap &= ~(enable << mbss_idx); - - if (pAd->ApCfg.ext_mbss_tttt_enable_bitmap) - any_other_mbss_tttt_enable = TRUE; - - /* if there is any ext bssid is enable. this bit shall be 1 always. */ - MAC_IO_READ32(pAd, first_reg_base, &Value); - - if (any_other_mbss_tttt_enable == TRUE) - Value |= SBSS_TTTT0_TSF0_EN; - else - Value &= ~SBSS_TTTT0_TSF0_EN; - - MAC_IO_WRITE32(pAd, first_reg_base, Value); - MAC_IO_READ32(pAd, bssid_reg_base, &Value); - Value &= ~TTTT0_n_INT_EN; - Value &= ~PRE_TTTT0_n_INT_EN; - MAC_IO_WRITE32(pAd, bssid_reg_base, Value); - } -} - -VOID MtDmacSetExtTTTTHwCRSetting(RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable) -{ - MtAsicSetExtTTTTLPOffset(pAd, mbss_idx, enable); -} -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef DBDC_MODE -static INT32 GetBctrlBitBaseByType(UCHAR Type, UINT8 Index) -{ - INT32 Bit = 0; - - switch (Type) { - case DBDC_TYPE_REPEATER: { - Bit = REPEATER_BAND_SEL_BIT_BASE; - } break; - - case DBDC_TYPE_PTA: { - Bit = PTA_BAND_SELPTA_BIT_BASE; - } break; - - case DBDC_TYPE_BF: { - Bit = BF_BAND_SEL_BIT_BASE; - } break; - - case DBDC_TYPE_MU: { - Bit = MU_BAND_SEL_BIT_BASE; - } break; - - case DBDC_TYPE_BSS: { - Bit = BSS_BAND_SEL_BIT_BASE; - } break; - - case DBDC_TYPE_MBSS: { - Bit = MBSS_BAND_SEL_BIT_BASE; - } break; - - case DBDC_TYPE_MGMT: { - Bit = MNG_BAND_SEL_BIT_BASE; - } break; - - case DBDC_TYPE_WMM: { - Bit = WMM_BAND_SEL_BIT_BASE; - } break; - - default: - Bit = -1; - break; - } - - if (Bit >= 0) - Bit += Index; - - return Bit; -} - -INT32 MtAsicGetDbdcCtrl(RTMP_ADAPTER *pAd, BCTRL_INFO_T *pbInfo) -{ - UINT32 Value = 0, i = 0, j = 0; - - HW_IO_READ32(pAd, CFG_DBDC_CTRL0, &Value); - /*DBDC enable will not need BctrlEntries so minus 1*/ - pbInfo->TotalNum = MAX_BCTRL_ENTRY - 1; - /*DBDC Enable*/ - pbInfo->DBDCEnable = (Value >> DBDC_EN_BIT_BASE) & 0x1; - /*PTA*/ - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_PTA; - pbInfo->BctrlEntries[i].Index = 0; - pbInfo->BctrlEntries[i].BandIdx = - (Value >> PTA_BAND_SELPTA_BIT_BASE) & 0x1; - i++; - /*MU*/ - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_MU; - pbInfo->BctrlEntries[i].Index = 0; - pbInfo->BctrlEntries[i].BandIdx = (Value >> MU_BAND_SEL_BIT_BASE) & 0x1; - i++; - - /*BF*/ - for (j = 0; j < 3; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_BF; - pbInfo->BctrlEntries[i].Index = j; - pbInfo->BctrlEntries[i].BandIdx = - (Value >> (j + BF_BAND_SEL_BIT_BASE)) & 0x1; - i++; - } - - /*WMM*/ - for (j = 0; j < 4; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_WMM; - pbInfo->BctrlEntries[i].Index = j; - pbInfo->BctrlEntries[i].BandIdx = - (Value >> (j + WMM_BAND_SEL_BIT_BASE)) & 0x1; - i++; - } - - /*MGMT*/ - for (j = 0; j < 2; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_MGMT; - pbInfo->BctrlEntries[i].Index = j; - pbInfo->BctrlEntries[i].BandIdx = - (Value >> (j + MNG_BAND_SEL_BIT_BASE)) & 0x1; - i++; - } - - /*MBSS*/ - for (j = 0; j < 15; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_MBSS; - pbInfo->BctrlEntries[i].Index = j; - pbInfo->BctrlEntries[i].BandIdx = - (Value >> (j + MBSS_BAND_SEL_BIT_BASE)) & 0x1; - i++; - } - - /*BSS*/ - for (j = 0; j < 5; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_BSS; - pbInfo->BctrlEntries[i].Index = j; - pbInfo->BctrlEntries[i].BandIdx = - (Value >> (j + BSS_BAND_SEL_BIT_BASE)) & 0x1; - i++; - } - - HW_IO_READ32(pAd, CFG_DBDC_CTRL1, &Value); - - /*Repeater*/ - for (j = 0; j < 32; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_REPEATER; - pbInfo->BctrlEntries[i].Index = j; - pbInfo->BctrlEntries[i].BandIdx = - (Value >> (j + REPEATER_BAND_SEL_BIT_BASE)) & 0x1; - i++; - } - - return 0; -} - -INT32 MtAsicSetDbdcCtrl(RTMP_ADAPTER *pAd, BCTRL_INFO_T *pbInfo) -{ - UINT32 Value1 = 0, Value2 = 0; - UINT32 i = 0; - INT32 shift = - 0; /* GetBctrlBitBaseByType may return -1 , declare signed variable:shift */ - BCTRL_ENTRY_T *pEntry = NULL; - - /*Clock Control for Band1, Band0 is enabled by MacInit*/ - if (pbInfo->DBDCEnable) { - MAC_IO_READ32(pAd, CFG_CCR, &Value1); - Value1 |= (BIT30 | BIT24); - MAC_IO_WRITE32(pAd, CFG_CCR, Value1); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: MAC D1 2x 1x initial(val=%x)\n", __func__, - Value1)); - } - - /*BandCtrl*/ - MAC_IO_READ32(pAd, CFG_DBDC_CTRL0, &Value1); - MAC_IO_READ32(pAd, CFG_DBDC_CTRL1, &Value2); - Value1 |= DBDC_EN(pbInfo->DBDCEnable); - - for (i = 0; i < pbInfo->TotalNum; i++) { - pEntry = &pbInfo->BctrlEntries[i]; - shift = GetBctrlBitBaseByType(pEntry->Type, pEntry->Index); - - if (shift < 0) - continue; - - if (pEntry->Type != DBDC_TYPE_REPEATER) { - Value1 &= ~(0x1 << shift); - Value1 |= (pEntry->BandIdx & 0x1) << shift; - } else { - Value2 &= ~(0x1 << shift); - Value2 |= (pEntry->BandIdx & 0x1) << shift; - } - } - - MAC_IO_WRITE32(pAd, CFG_DBDC_CTRL0, Value1); - MAC_IO_WRITE32(pAd, CFG_DBDC_CTRL1, Value2); - return 0; -} -#endif /*DBDC_MODE*/ - -#ifndef COMPOS_TESTMODE_WIN -VOID MtSetTmrCal(IN PRTMP_ADAPTER pAd, IN UCHAR TmrType, IN UCHAR Channel, - IN UCHAR Bw) -{ - UINT32 value = 0; - - MAC_IO_READ32(pAd, TMAC_B0BRR0, &value); - - if (TmrType == TMR_DISABLE) - /* Enanle Spatial Extension for ACK/BA/CTS after TMR Disable*/ - value |= BSSID00_RESP_SPE_EN; - else - /* Disable Spatial Extension for ACK/BA/CTS when TMR Enable*/ - value &= ~BSSID00_RESP_SPE_EN; - - MAC_IO_WRITE32(pAd, TMAC_B0BRR0, value); -} - -VOID MtSetTmrCR(IN PRTMP_ADAPTER pAd, IN UCHAR TmrType) -{ - UINT32 value = 0; - - MAC_IO_READ32(pAd, RMAC_TMR_PA, &value); - /* Clear role bit */ - value &= ~RMAC_TMR_ROLE; - - if (TmrType == TMR_DISABLE) - value &= ~RMAC_TMR_ENABLE; - else { - value |= RMAC_TMR_ENABLE; - - if (TmrType == TMR_RESPONDER) { - value |= RMAC_TMR_ROLE; - /* Set type/sub_type to Action frame */ - value &= 0xffffffc0; /* clear type/sub_type field */ - value |= (SUBTYPE_ACTION << 2) | FC_TYPE_MGMT; - } - } - - MAC_IO_WRITE32(pAd, RMAC_TMR_PA, value); -} -#endif - -/* - * enable/disable beaconQ, - * return status for disable beaconQ. - */ -static BOOLEAN MtDmacAsicSetBeaconQ(struct _RTMP_ADAPTER *pAd, UINT8 OmacIdx, - UCHAR BandIdx, BOOLEAN enable) -{ - UINT32 cr_collection[2][4] = { - { ARB_TQSM0, ARB_TQSE0, ARB_TQFM0, ARB_TQFE0 }, /*band 0*/ - { ARB_TQSM1, ARB_TQSE1, ARB_TQFM1, ARB_TQFE1 } - }; - UINT32 Value = 0; - UINT32 cr_base = 0; - - if (BandIdx >= DBDC_BAND_NUM) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: BandIdx >= 2\n", __func__)); - return FALSE; - } - - if (enable) { - if (OmacIdx > HW_BSSID_MAX) - cr_base = cr_collection[BandIdx][1]; - else - cr_base = cr_collection[BandIdx][0]; - } else { - if (OmacIdx > HW_BSSID_MAX) - cr_base = cr_collection[BandIdx][3]; - else - cr_base = cr_collection[BandIdx][2]; - } - - MAC_IO_READ32(pAd, cr_base, &Value); - - if (OmacIdx > HW_BSSID_MAX) - Value |= (1 << OmacIdx); - else - Value |= (1 << (0x10 + OmacIdx)); - - MAC_IO_WRITE32(pAd, cr_base, Value); - return TRUE; -} - -BOOLEAN MtDmacAsicEnableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev_void) -{ - struct wifi_dev *wdev = (struct wifi_dev *)wdev_void; - BCN_BUF_STRUC *bcn_info = &wdev->bcn_buf; - UINT8 OmacIdx = wdev->OmacIdx; - UCHAR BandIdx = HcGetBandByWdev(wdev); - - if (bcn_info->BcnUpdateMethod == BCN_GEN_BY_FW) { - /* FW help to disable beacon. */ - return TRUE; - } else if (bcn_info->BcnUpdateMethod == BCN_GEN_BY_HOST_IN_PRETBTT) - return MtDmacAsicSetBeaconQ(pAd, OmacIdx, BandIdx, TRUE); - - return TRUE; -} - -BOOLEAN MtDmacAsicDisableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev_void) -{ - struct wifi_dev *wdev = (struct wifi_dev *)wdev_void; - BCN_BUF_STRUC *bcn_info = &wdev->bcn_buf; - UINT8 OmacIdx = wdev->OmacIdx; - UCHAR BandIdx = HcGetBandByWdev(wdev); - - if (bcn_info->BcnUpdateMethod == BCN_GEN_BY_FW) { - /* FW help to disable beacon. */ - return TRUE; - } else if (bcn_info->BcnUpdateMethod == BCN_GEN_BY_HOST_IN_PRETBTT) - return MtDmacAsicSetBeaconQ(pAd, OmacIdx, BandIdx, FALSE); - - return TRUE; -} - -INT32 MtAsicRxHeaderTransCtl(RTMP_ADAPTER *pAd, BOOLEAN En, BOOLEAN ChkBssid, - BOOLEAN InSVlan, BOOLEAN RmVlan, BOOLEAN SwPcP) -{ - if (IS_MT7636(pAd) || IS_MT7615(pAd) || IS_MT7637(pAd) || - IS_MT7622(pAd) || IS_P18(pAd) || IS_MT7663(pAd)) - return CmdRxHdrTransUpdate(pAd, En, ChkBssid, InSVlan, RmVlan, - SwPcP); - else - return 0; -} - -INT32 MtAsicRxHeaderTaranBLCtl(RTMP_ADAPTER *pAd, UINT32 Index, BOOLEAN En, - UINT32 EthType) -{ - if (IS_MT7636(pAd) || IS_MT7615(pAd) || IS_MT7637(pAd) || - IS_MT7622(pAd) || IS_P18(pAd) || IS_MT7663(pAd)) - return CmdRxHdrTransBLUpdate(pAd, Index, En, EthType); - else - return 0; -} - -INT MtAsicTOPInit(RTMP_ADAPTER *pAd) -{ -#if defined(MT7615_FPGA) || defined(MT7622_FPGA) || defined(P18_FPGA) || \ - defined(MT7663_FPGA) - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->chk_top_default_cr_setting) - ops->chk_top_default_cr_setting(pAd); - if (ops->chk_hif_default_cr_setting) - ops->chk_hif_default_cr_setting(pAd); -#endif - return TRUE; -} - -INT set_get_fid(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - /* TODO: Carter, at present, only can read pkt in Port2(LMAC port) */ - volatile UCHAR q_idx = 0, loop = 0, dw_idx = 0; - volatile UINT32 head_fid_addr = 0, next_fid_addr = 0, - value = 0x00000000L, dw_content; - - q_idx = simple_strtol(arg, 0, 10); - value = 0x00400000 | (q_idx << 16); /* port2. queue by input value. */ - RTMP_IO_WRITE32(pAd, 0x8024, value); - RTMP_IO_READ32(pAd, 0x8024, - (UINT32 *)&head_fid_addr); /* get head FID. */ - head_fid_addr = head_fid_addr & 0xfff; - - if (head_fid_addr == 0xfff) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, q_idx:%d empty!!\n", __func__, q_idx)); - return TRUE; - } - - value = (0 | (head_fid_addr << 16)); - - while (1) { - for (dw_idx = 0; dw_idx < 8; dw_idx++) { - RTMP_IO_READ32( - pAd, - ((MT_PCI_REMAP_ADDR_1 + - (((value & 0x0fff0000) >> 16) * 128)) + - (dw_idx * 4)), - (UINT32 *)&dw_content); /* get head FID. */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("pkt:%d, fid:%x, dw_idx = %d, dw_content = 0x%x\n", - loop, ((value & 0x0fff0000) >> 16), dw_idx, - dw_content)); - } - - RTMP_IO_WRITE32(pAd, 0x8028, value); - RTMP_IO_READ32(pAd, 0x8028, - (UINT32 *)&next_fid_addr); /* get next FID. */ - - if ((next_fid_addr & 0xfff) == 0xfff) - return TRUE; - - value = (0 | ((next_fid_addr & 0xffff) << 16)); - loop++; - - if (loop > 5) - return TRUE; - } - - return TRUE; -} - -VOID MtAsicUpdateRtsThld(struct _RTMP_ADAPTER *pAd, - MT_RTS_THRESHOLD_T *rts_thrld) -{ - UINT32 val; - /* Config ASIC RTS threshold register*/ - MAC_IO_READ32(pAd, AGG_PCR1, &val); - val &= ~RTS_THRESHOLD_MASK; - val &= ~RTS_PKT_NUM_THRESHOLD_MASK; - val |= RTS_THRESHOLD(rts_thrld->pkt_len_thld); - val |= RTS_PKT_NUM_THRESHOLD(rts_thrld->pkt_num_thld); - MAC_IO_WRITE32(pAd, AGG_PCR1, val); -} - -INT32 MtAsicGetAntMode(RTMP_ADAPTER *pAd, UCHAR *AntMode) -{ - return TRUE; -} - -INT32 MtAsicSetDmaByPassMode(RTMP_ADAPTER *pAd, BOOLEAN isByPass) -{ - return TRUE; -} - -BOOLEAN MtAsicGetMcuStatus(RTMP_ADAPTER *pAd, MCU_STAT State) -{ - return TRUE; -} - -VOID MtAsicGetTxTscByDriver(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *pTxTsc) -{ - USHORT Wcid = 0; - struct wtbl_entry tb_entry; - UINT32 val = 0; - - GET_GroupKey_WCID(wdev, Wcid); - NdisZeroMemory(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, Wcid, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Cannot found WTBL2/3/4 for WCID(%d)\n", __func__, - Wcid)); - return; - } - - HW_IO_READ32(pAd, tb_entry.wtbl_addr + (4 * 9), &val); - *pTxTsc = val & 0xff; - *(pTxTsc + 1) = (val >> 8) & 0xff; - *(pTxTsc + 2) = (val >> 16) & 0xff; - *(pTxTsc + 3) = (val >> 24) & 0xff; - HW_IO_READ32(pAd, tb_entry.wtbl_addr + (4 * 10), &val); - *(pTxTsc + 4) = val & 0xff; - *(pTxTsc + 5) = (val >> 8) & 0xff; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): WCID(%d) TxTsc 0x%02x-0x%02x-0x%02x-0x%02x-0x%02x-0x%02x\n", - __func__, Wcid, *pTxTsc, *(pTxTsc + 1), *(pTxTsc + 2), - *(pTxTsc + 3), *(pTxTsc + 4), *(pTxTsc + 5))); -} - -INT32 MtAsicSetDevMac(RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, UINT8 *OwnMacAddr, - UINT8 BandIdx, UINT8 Active, UINT32 EnableFeature) - -{ - UINT32 val; - UINT32 own_mac_reg_base = - RMAC_OMA0R0; /* register for Own_Mac from 0x60140024 */ - - if (Active) { - val = (OwnMacAddr[0]) | (OwnMacAddr[1] << 8) | - (OwnMacAddr[2] << 16) | (OwnMacAddr[3] << 24); - MAC_IO_WRITE32(pAd, own_mac_reg_base + (OwnMacIdx * 8), val); - val = OwnMacAddr[4] | (OwnMacAddr[5] << 8) | (1 << 16); - MAC_IO_WRITE32(pAd, (own_mac_reg_base + 4) + (OwnMacIdx * 8), - val); - } - -#if !defined(COMPOS_TESTMODE_WIN) && !defined(COMPOS_WIN) - AsicDevInfoUpdate(pAd, OwnMacIdx, OwnMacAddr, BandIdx, Active, - DEVINFO_ACTIVE_FEATURE); -#endif - return TRUE; -} - -BOOLEAN MtAsicSetBcnQCR(IN struct _RTMP_ADAPTER *pAd, IN UCHAR Operation, - IN UCHAR HwBssidIdx, IN UINT32 apidx) -{ - return TRUE; -} - -VOID MtAsicSetBssid(struct _RTMP_ADAPTER *pAd, UCHAR *pBssid, - UCHAR curr_bssid_idx) -{ -} - -INT mt_asic_rts_on_off(struct _RTMP_ADAPTER *ad, UCHAR band_idx, UINT32 rts_num, - UINT32 rts_len, BOOLEAN rts_en) -{ - UINT32 cr; - UINT32 value; - /*adjust cts/rts rate*/ - cr = (band_idx == BAND1) ? TMAC_PCR1 : TMAC_PCR; - value = (rts_en == TRUE) ? TMAC_PCR_AUTO_RATE : - TMAC_PCR_FIX_OFDM_6M_RATE; - MAC_IO_WRITE32(ad, cr, value); - /*adjust rts rts threshold*/ - cr = (band_idx == BAND1) ? AGG_PCR2 : AGG_PCR1; - value = RTS_THRESHOLD(rts_len) | RTS_PKT_NUM_THRESHOLD(rts_num); - MAC_IO_WRITE32(ad, cr, value); - return 0; -} - -#ifdef DOT11_VHT_AC -INT MtAsicSetRtsSignalTA(RTMP_ADAPTER *pAd, UINT8 BandIdx, BOOLEAN Enable) -{ - UINT32 Value = 0; - - if (BandIdx) - MAC_IO_READ32(pAd, TMAC_TCR1, &Value); - else - MAC_IO_READ32(pAd, TMAC_TCR, &Value); - - if (Enable) - Value |= RTS_SIGTA_EN; - else - Value &= ~(RTS_SIGTA_EN); - - if (BandIdx) - MAC_IO_WRITE32(pAd, TMAC_TCR1, Value); - else - MAC_IO_WRITE32(pAd, TMAC_TCR, Value); - - return TRUE; -} -INT MtAsicAMPDUEfficiencyAdjust(struct _RTMP_ADAPTER *ad, UCHAR wmm_idx, - UCHAR aifs_adjust) -{ - UINT32 cr; - UINT32 value; - - cr = ARB_WMMAC01 + (wmm_idx * 16); - - MAC_IO_READ32(ad, cr, &value); - - value = ((value & 0xffffff00) | aifs_adjust); - - MAC_IO_WRITE32(ad, cr, value); - - return 0; -} -#endif /* DOT11_VHT_AC */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt_fw.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt_fw.c deleted file mode 100644 index d769ae6d75..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_asic_mt_fw.c +++ /dev/null @@ -1,1459 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_asic_mt.c - - Abstract: - Functions used to communicate with ASIC - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Cmm_asic_mt.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -#include "hdev/hdev.h" - -/* DEV Info */ -INT32 MtAsicSetDevMacByFw(RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, UINT8 *OwnMacAddr, - UINT8 BandIdx, UINT8 Active, UINT32 EnableFeature) -{ - return CmdExtDevInfoUpdate(pAd, OwnMacIdx, OwnMacAddr, BandIdx, Active, - EnableFeature); -} - -/* BSS Info */ -INT32 MtAsicSetBssidByFw(RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info_argument) -{ - return CmdExtBssInfoUpdate(pAd, bss_info_argument); -} - -/* STARec Info */ -INT32 MtAsicSetStaRecByFw(RTMP_ADAPTER *pAd, STA_REC_CFG_T StaCfg) -{ - return CmdExtStaRecUpdate(pAd, StaCfg); -} - -INT32 MtAsicUpdateStaRecBaByFw(struct _RTMP_ADAPTER *pAd, - STA_REC_BA_CFG_T StaRecBaCfg) -{ - return CmdExtStaRecBaUpdate(pAd, StaRecBaCfg); -} - -VOID MtSetTmrCRByFw(struct _RTMP_ADAPTER *pAd, UCHAR enable, UCHAR BandIdx) -{ - CmdExtSetTmrCR(pAd, enable, BandIdx); -} - -VOID MtAsicAutoBATrigger(struct _RTMP_ADAPTER *pAd, BOOLEAN Enable, - UINT32 Timeout) -{ - CmdAutoBATrigger(pAd, Enable, Timeout); -} - -VOID MtAsicDelWcidTabByFw(IN PRTMP_ADAPTER pAd, IN UCHAR wcid_idx) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, --->\n", __func__)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, wcid_idx(%d)\n", __func__, wcid_idx)); - - if (wcid_idx == WCID_ALL) - CmdExtWtblUpdate(pAd, 0, RESET_ALL_WTBL, NULL, 0); - else - CmdExtWtblUpdate(pAd, wcid_idx, RESET_WTBL_AND_SET, NULL, 0); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, <---\n", __func__)); -} - -#ifdef HTC_DECRYPT_IOT -VOID MtAsicSetWcidAAD_OMByFw(IN PRTMP_ADAPTER pAd, IN UCHAR wcid_idx, - IN UCHAR value) -{ - UINT32 mask = 0xfffffff7; - UINT32 val; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, wcid_idx(%d), value(%d)\n", __func__, wcid_idx, value)); - - if (value) { - val = 0x8; - WtblDwSet(pAd, wcid_idx, 1, 2, mask, val); - } else { - val = 0x0; - WtblDwSet(pAd, wcid_idx, 1, 2, mask, val); - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, <---\n", __func__)); -} -#endif /* HTC_DECRYPT_IOT */ - -#ifdef MBSS_AS_WDS_AP_SUPPORT -VOID MtAsicSetWcid4Addr_HdrTransByFw(IN PRTMP_ADAPTER pAd, IN UCHAR wcid_idx, - IN UCHAR IsEnable, IN UCHAR IsApcliEntry) -{ - CMD_WTBL_HDR_TRANS_T rWtblHdrTrans = { 0 }; - - rWtblHdrTrans.u2Tag = WTBL_HDR_TRANS; - rWtblHdrTrans.u2Length = sizeof(CMD_WTBL_HDR_TRANS_T); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: WCID %u ISenable %u\n", __FUNCTION__, wcid_idx, - IsEnable)); - /*Set to 1 */ - if (IsEnable) { - rWtblHdrTrans.ucTd = 1; - rWtblHdrTrans.ucFd = 1; - } else if (IsApcliEntry) { - rWtblHdrTrans.ucTd = 1; - rWtblHdrTrans.ucFd = 0; - } else { - rWtblHdrTrans.ucTd = 0; - rWtblHdrTrans.ucFd = 1; - } - rWtblHdrTrans.ucDisRhtr = 0; - CmdExtWtblUpdate(pAd, wcid_idx, SET_WTBL, &rWtblHdrTrans, - sizeof(CMD_WTBL_HDR_TRANS_T)); -} -#endif - -/* MT7615 */ -/* need to ready first, Carter, wilsonl */ -VOID MtAsicUpdateRxWCIDTableByFw(IN PRTMP_ADAPTER pAd, - IN MT_WCID_TABLE_INFO_T WtblInfo) -{ - NDIS_STATUS Status = NDIS_STATUS_SUCCESS; - UCHAR *pTlvBuffer = NULL; - UCHAR *pTempBuffer = NULL; - UINT32 u4TotalTlvLen = 0; - UCHAR ucTotalTlvNumber = 0; - /* Tag = 0, Generic */ - CMD_WTBL_GENERIC_T rWtblGeneric = { 0 }; - /* Tage = 1, Rx */ - CMD_WTBL_RX_T rWtblRx = { 0 }; -#ifdef DOT11_N_SUPPORT - /* Tag = 2, HT */ - CMD_WTBL_HT_T rWtblHt = { 0 }; -#ifdef DOT11_VHT_AC - /* Tag = 3, VHT */ - CMD_WTBL_VHT_T rWtblVht = { 0 }; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - /* Tag = 5, TxPs */ - CMD_WTBL_TX_PS_T rWtblTxPs = { 0 }; -#if defined(HDR_TRANS_TX_SUPPORT) || defined(HDR_TRANS_RX_SUPPORT) - /* Tag = 6, Hdr Trans */ - CMD_WTBL_HDR_TRANS_T rWtblHdrTrans = { 0 }; -#endif /* HDR_TRANS_TX_SUPPORT */ - /* Tag = 7, Security Key */ - CMD_WTBL_SECURITY_KEY_T rWtblSecurityKey = { 0 }; - /* Tag = 9, Rdg */ - CMD_WTBL_RDG_T rWtblRdg = { 0 }; -#ifdef TXBF_SUPPORT - /* Tag = 12, BF */ - CMD_WTBL_BF_T rWtblBf = { 0 }; -#endif /* TXBF_SUPPORT */ - /* Tag = 13, SMPS */ - CMD_WTBL_SMPS_T rWtblSmPs = { 0 }; - /* Tag = 16, SPE */ - CMD_WTBL_SPE_T rWtblSpe = { 0 }; - /* Allocate TLV msg */ - Status = os_alloc_mem(pAd, (UCHAR **)&pTlvBuffer, - MAX_BUF_SIZE_OF_WTBL_INFO); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): %d,%d,%d,%d,%d,%d,%d,%d,%d,(%x:%x:%x:%x:%x:%x),%d,%d,%d,%d,%d,%d)\n", - __func__, WtblInfo.Wcid, WtblInfo.Aid, WtblInfo.BssidIdx, - WtblInfo.MacAddrIdx, WtblInfo.SmpsMode, - WtblInfo.MaxRAmpduFactor, WtblInfo.MpduDensity, - WtblInfo.WcidType, WtblInfo.aad_om, PRINT_MAC(WtblInfo.Addr), - WtblInfo.CipherSuit, WtblInfo.PfmuId, WtblInfo.SupportHT, - WtblInfo.SupportVHT, WtblInfo.SupportRDG, - WtblInfo.SupportQoS)); - - if ((Status != NDIS_STATUS_SUCCESS) || (pTlvBuffer == NULL)) - goto error; - - pTempBuffer = pTlvBuffer; - rWtblRx.ucRv = WtblInfo.rv; - rWtblRx.ucRca2 = WtblInfo.rca2; - - if (WtblInfo.WcidType == MT_WCID_TYPE_APCLI_MCAST) { - /* prevent BMC ICV message dumped during GTK rekey */ - if (HcGetWcidLinkType(pAd, WtblInfo.Wcid) == WDEV_TYPE_APCLI) - rWtblRx.ucRcid = 1; - } - - /* Manipulate TLV msg */ - if (WtblInfo.WcidType == MT_WCID_TYPE_BMCAST) { - /* Tag = 0 */ - rWtblGeneric.ucMUARIndex = 0x0e; - /* Tag = 1 */ - rWtblRx.ucRv = 1; - rWtblRx.ucRca1 = 1; - /* if (pAd->OpMode == OPMODE_AP) */ - { - rWtblRx.ucRca2 = 1; - } - /* Tag = 7 */ - rWtblSecurityKey.ucAlgorithmId = WTBL_CIPHER_NONE; - /* Tag = 6 */ -#ifdef HDR_TRANS_TX_SUPPORT - - if (pAd->OpMode == OPMODE_AP) { - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 0; - } - -#endif - } else { - /* Tag = 0 */ - rWtblGeneric.ucMUARIndex = WtblInfo.MacAddrIdx; - rWtblGeneric.ucQos = (WtblInfo.SupportQoS) ? 1 : 0; - rWtblGeneric.u2PartialAID = WtblInfo.Aid; - rWtblGeneric.ucAadOm = WtblInfo.aad_om; - - /* Tag = 1 */ - if ((WtblInfo.WcidType == MT_WCID_TYPE_APCLI) || - (WtblInfo.WcidType == MT_WCID_TYPE_REPEATER) || - (WtblInfo.WcidType == MT_WCID_TYPE_AP) || - (WtblInfo.WcidType == MT_WCID_TYPE_APCLI_MCAST)) - rWtblRx.ucRca1 = 1; - - rWtblRx.ucRv = 1; - rWtblRx.ucRca2 = 1; - /* Tag = 7 */ - rWtblSecurityKey.ucAlgorithmId = WtblInfo.CipherSuit; - rWtblSecurityKey.ucRkv = - (WtblInfo.CipherSuit != WTBL_CIPHER_NONE) ? 1 : 0; - /* Tag = 6 */ -#ifdef HDR_TRANS_TX_SUPPORT - - switch (WtblInfo.WcidType) { - case MT_WCID_TYPE_AP: - rWtblHdrTrans.ucFd = 0; - rWtblHdrTrans.ucTd = 1; - break; - - case MT_WCID_TYPE_CLI: - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 0; -#ifdef MBSS_AS_WDS_AP_SUPPORT - if (WtblInfo.fg4AddrEnable) - rWtblHdrTrans.ucTd = 1; -#endif -#ifdef A4_CONN - if (WtblInfo.a4_enable) { - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 1; - //MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("MtAsicUpdateRxWCIDTableByFw MT_WCID_TYPE_CLI: do FdTd settings in rWtblHdrTrans\n")); - } -#endif /* A4_CONN */ - break; - - case MT_WCID_TYPE_APCLI: - case MT_WCID_TYPE_REPEATER: - rWtblHdrTrans.ucFd = 0; - rWtblHdrTrans.ucTd = 1; -#ifdef APCLI_AS_WDS_STA_SUPPORT - if (WtblInfo.fg4AddrEnable) - rWtblHdrTrans.ucFd = 1; -#endif /* APCLI_AS_WDS_STA_SUPPORT */ -#ifdef A4_CONN - if (WtblInfo.a4_enable) { - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 1; - //MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("MtAsicUpdateRxWCIDTableByFw MT_WCID_TYPE_APCLI/MT_WCID_TYPE_REPEATER do FdTd settings in rWtblHdrTrans\n")); - } -#endif /* A4_CONN */ - break; - - case MT_WCID_TYPE_WDS: - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 1; - break; - - default: - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Unknown entry type(%d) do not support header translation\n", - __func__, WtblInfo.WcidType)); - break; - } - -#endif /* HDR_TRANS_TX_SUPPORT */ -#ifdef HDR_TRANS_RX_SUPPORT - - if (WtblInfo.DisRHTR) - rWtblHdrTrans.ucDisRhtr = 1; - else - rWtblHdrTrans.ucDisRhtr = 0; - -#endif /* HDR_TRANS_RX_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - if (WtblInfo.SupportHT) { - /* Tag = 0 */ - rWtblGeneric.ucQos = 1; - rWtblGeneric.ucBafEn = 0; - /* Tag = 2 */ - rWtblHt.ucHt = 1; - rWtblHt.ucMm = WtblInfo.MpduDensity; - rWtblHt.ucAf = WtblInfo.MaxRAmpduFactor; - - /* Tga = 9 */ - if (WtblInfo.SupportRDG) { - rWtblRdg.ucR = 1; - rWtblRdg.ucRdgBa = 1; - } - - /* Tag = 13*/ - if (WtblInfo.SmpsMode == MMPS_DYNAMIC) - rWtblSmPs.ucSmPs = 1; - else - rWtblSmPs.ucSmPs = 0; - -#ifdef DOT11_VHT_AC - - /* Tag = 3 */ - if (WtblInfo.SupportVHT) { - rWtblVht.ucVht = 1; - - if (WtblInfo.dyn_bw == BW_SIGNALING_DYNAMIC) { - rWtblVht.ucDynBw = 1; - } - } - -#endif /* DOT11_VHT_AC */ - } - -#endif /* DOT11_N_SUPPORT */ - } - - /* Tag = 0 */ - os_move_mem(rWtblGeneric.aucPeerAddress, WtblInfo.Addr, MAC_ADDR_LEN); - /* Tag = 5 */ - rWtblTxPs.ucTxPs = 0; -#ifdef TXBF_SUPPORT - /* Tag = 0xc */ - rWtblBf.ucGid = WtblInfo.gid; - rWtblBf.ucPFMUIdx = WtblInfo.PfmuId; - rWtblBf.ucTiBf = WtblInfo.fgTiBf; - rWtblBf.ucTeBf = WtblInfo.fgTeBf; - rWtblBf.ucTibfVht = WtblInfo.fgTibfVht; - rWtblBf.ucTebfVht = WtblInfo.fgTebfVht; -#endif /* TXBF_SUPPORT */ - /* Tag = 0x10 */ - rWtblSpe.ucSpeIdx = WtblInfo.spe_idx; - /* Append TLV msg */ - pTempBuffer = pTlvAppend(pTlvBuffer, (WTBL_GENERIC), - (sizeof(CMD_WTBL_GENERIC_T)), &rWtblGeneric, - &u4TotalTlvLen, &ucTotalTlvNumber); - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_RX), (sizeof(CMD_WTBL_RX_T)), - &rWtblRx, &u4TotalTlvLen, &ucTotalTlvNumber); -#ifdef DOT11_N_SUPPORT - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_HT), (sizeof(CMD_WTBL_HT_T)), - &rWtblHt, &u4TotalTlvLen, &ucTotalTlvNumber); - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_RDG), (sizeof(CMD_WTBL_RDG_T)), - &rWtblRdg, &u4TotalTlvLen, &ucTotalTlvNumber); - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_SMPS), (sizeof(CMD_WTBL_SMPS_T)), - &rWtblSmPs, &u4TotalTlvLen, &ucTotalTlvNumber); -#ifdef DOT11_VHT_AC - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_VHT), (sizeof(CMD_WTBL_VHT_T)), - &rWtblVht, &u4TotalTlvLen, &ucTotalTlvNumber); -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - pTempBuffer = pTlvAppend(pTempBuffer, (WTBL_TX_PS), - (sizeof(CMD_WTBL_TX_PS_T)), &rWtblTxPs, - &u4TotalTlvLen, &ucTotalTlvNumber); -#if defined(HDR_TRANS_RX_SUPPORT) || defined(HDR_TRANS_TX_SUPPORT) - pTempBuffer = pTlvAppend(pTempBuffer, (WTBL_HDR_TRANS), - (sizeof(CMD_WTBL_HDR_TRANS_T)), &rWtblHdrTrans, - &u4TotalTlvLen, &ucTotalTlvNumber); -#endif /* HDR_TRANS_RX_SUPPORT || HDR_TRANS_TX_SUPPORT */ - if (WtblInfo.SkipClearPrevSecKey == FALSE) - pTempBuffer = pTlvAppend(pTempBuffer, (WTBL_SECURITY_KEY), - (sizeof(CMD_WTBL_SECURITY_KEY_T)), - &rWtblSecurityKey, &u4TotalTlvLen, - &ucTotalTlvNumber); -#ifdef TXBF_SUPPORT - - if (pAd->rStaRecBf.u2PfmuId != 0xFFFF) { - pTempBuffer = pTlvAppend(pTempBuffer, (WTBL_BF), - (sizeof(CMD_WTBL_BF_T)), &rWtblBf, - &u4TotalTlvLen, &ucTotalTlvNumber); - } - -#endif /* TXBF_SUPPORT */ - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_SPE), (sizeof(CMD_WTBL_SPE_T)), - &rWtblSpe, &u4TotalTlvLen, &ucTotalTlvNumber); - /* Send TLV msg*/ - if (WtblInfo.IsReset == TRUE) { - if (WtblInfo.SkipClearPrevSecKey == TRUE) - CmdExtWtblUpdate(pAd, (UINT8)WtblInfo.Wcid, SET_WTBL, - pTlvBuffer, u4TotalTlvLen); - else - CmdExtWtblUpdate(pAd, (UINT8)WtblInfo.Wcid, - RESET_WTBL_AND_SET, pTlvBuffer, - u4TotalTlvLen); - } else - CmdExtWtblUpdate(pAd, (UINT8)WtblInfo.Wcid, SET_WTBL, - pTlvBuffer, u4TotalTlvLen); - - /* Free TLV msg */ - if (pTlvBuffer) - os_free_mem(pTlvBuffer); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(Ret = %d)\n", __func__, Status)); -} - -VOID MtAsicUpdateBASessionByWtblTlv(RTMP_ADAPTER *pAd, MT_BA_CTRL_T BaCtrl) -{ - CMD_WTBL_BA_T rWtblBa = { 0 }; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR *ba_range = cap->ba_range; - - if (BaCtrl.Tid > 7) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: unknown tid(%d)\n", __func__, BaCtrl.Tid)); - return; - } - - rWtblBa.u2Tag = WTBL_BA; - rWtblBa.u2Length = sizeof(CMD_WTBL_BA_T); - rWtblBa.ucTid = BaCtrl.Tid; - rWtblBa.ucBaSessionType = BaCtrl.BaSessionType; - - if (BaCtrl.BaSessionType == BA_SESSION_RECP) { - /* Reset BA SSN & Score Board Bitmap, for BA Receiptor */ - if (BaCtrl.isAdd) { - os_move_mem(rWtblBa.aucPeerAddress, BaCtrl.PeerAddr, - MAC_ADDR_LEN); - rWtblBa.ucRstBaTid = BaCtrl.Tid; - rWtblBa.ucRstBaSel = RST_BA_MAC_TID_MATCH; - rWtblBa.ucStartRstBaSb = 1; - CmdExtWtblUpdate(pAd, (UINT8)BaCtrl.Wcid, SET_WTBL, - &rWtblBa, sizeof(rWtblBa)); - } - } else { - if (BaCtrl.isAdd) { - INT idx = 0; - /* Clear WTBL2. SN: Direct Updating */ - rWtblBa.u2Sn = BaCtrl.Sn; - - /*get ba win size from range */ - while (ba_range[idx] < BaCtrl.BaWinSize) { - if (idx == 7) - break; - - idx++; - }; - - if (ba_range[idx] > BaCtrl.BaWinSize) - idx--; - - /* Clear BA_WIN_SIZE and set new value to it */ - rWtblBa.ucBaSize = idx; - /* Enable BA_EN */ - rWtblBa.ucBaEn = 1; - } else { - /* Clear BA_WIN_SIZE and set new value to it */ - rWtblBa.ucBaSize = 0; - /* Enable BA_EN */ - rWtblBa.ucBaEn = 0; - } - - CmdExtWtblUpdate(pAd, (UINT8)BaCtrl.Wcid, SET_WTBL, &rWtblBa, - sizeof(rWtblBa)); - } -} - -INT32 MtAsicUpdateBASessionByFw(IN PRTMP_ADAPTER pAd, IN MT_BA_CTRL_T BaCtrl) -{ - INT32 Status = NDIS_STATUS_FAILURE; - CMD_WTBL_BA_T rWtblBa = { 0 }; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR *ba_range = cap->ba_range; - - if (BaCtrl.Tid > 7) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: unknown tid(%d)\n", __func__, BaCtrl.Tid)); - return Status; - } - - rWtblBa.u2Tag = WTBL_BA; - rWtblBa.u2Length = sizeof(CMD_WTBL_BA_T); - rWtblBa.ucTid = BaCtrl.Tid; - rWtblBa.ucBaSessionType = BaCtrl.BaSessionType; - - if (BaCtrl.BaSessionType == BA_SESSION_RECP) { - /* Reset BA SSN & Score Board Bitmap, for BA Receiptor */ - if (BaCtrl.isAdd) { - rWtblBa.ucBandIdx = BaCtrl.band_idx; - os_move_mem(rWtblBa.aucPeerAddress, BaCtrl.PeerAddr, - MAC_ADDR_LEN); - rWtblBa.ucRstBaTid = BaCtrl.Tid; - rWtblBa.ucRstBaSel = RST_BA_MAC_TID_MATCH; - rWtblBa.ucStartRstBaSb = 1; - Status = CmdExtWtblUpdate(pAd, (UINT8)BaCtrl.Wcid, - SET_WTBL, &rWtblBa, - sizeof(rWtblBa)); - } - - /* TODO: Hanmin 7615, need rWtblBa.ucBaEn=0 for delete? */ - } else { - if (BaCtrl.isAdd) { - INT idx = 0; - /* Clear WTBL2. SN: Direct Updating */ - rWtblBa.u2Sn = BaCtrl.Sn; - - /* Get ba win size from range */ - while (BaCtrl.BaWinSize > ba_range[idx]) { - if (idx == (MT_DMAC_BA_AGG_RANGE - 1)) - break; - - idx++; - }; - - if ((idx > 0) && (ba_range[idx] > BaCtrl.BaWinSize)) - idx--; - - /* Clear BA_WIN_SIZE and set new value to it */ - rWtblBa.ucBaSize = idx; - /* Enable BA_EN */ - rWtblBa.ucBaEn = 1; - } else { - /* Clear BA_WIN_SIZE and set new value to it */ - rWtblBa.ucBaSize = 0; - /* Enable BA_EN */ - rWtblBa.ucBaEn = 0; - } - - Status = CmdExtWtblUpdate(pAd, (UINT8)BaCtrl.Wcid, SET_WTBL, - &rWtblBa, sizeof(rWtblBa)); - } - - return Status; -} - -UINT16 MtAsicGetTidSnByFw(IN PRTMP_ADAPTER pAd, UCHAR wcid, UCHAR tid) -{ - INT32 Status = NDIS_STATUS_FAILURE; - CMD_WTBL_BA_T rWtblBa = { 0 }; - UINT16 ssn = 0xffff; - - rWtblBa.u2Tag = WTBL_BA; - rWtblBa.u2Length = sizeof(CMD_WTBL_BA_T); - rWtblBa.ucTid = tid; - Status = CmdExtWtblUpdate(pAd, (UINT8)wcid, QUERY_WTBL, &rWtblBa, - sizeof(CMD_WTBL_BA_T)); - - if (Status == NDIS_STATUS_SUCCESS) - ssn = rWtblBa.u2Sn; - - return ssn; -} - -VOID MtAsicAddRemoveKeyTabByFw(IN struct _RTMP_ADAPTER *pAd, - IN struct _ASIC_SEC_INFO *pInfo) -{ - CMD_WTBL_SECURITY_KEY_T rWtblSecurityKey = { 0 }; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:, wcid=%d, Operation=%d, Direction=%d\n", __func__, - pInfo->Wcid, pInfo->Operation, pInfo->Direction)); - rWtblSecurityKey.u2Tag = WTBL_SECURITY_KEY; - rWtblSecurityKey.u2Length = sizeof(CMD_WTBL_SECURITY_KEY_T); - fill_wtbl_key_info_struc(pInfo, &rWtblSecurityKey); - - /* Workaround code */ - if ((IS_CIPHER_CCMP128(pInfo->Cipher)) && - (rWtblSecurityKey.ucKeyLen == 32)) { - UINT16 u2LengthTemp, u2TagTemp; - /* store u2Length and uTag for the second time Wtbl setting, */ - /* because CmdExtWtblUpdate will do endian change.*/ - u2LengthTemp = rWtblSecurityKey.u2Length; - u2TagTemp = rWtblSecurityKey.u2Tag; - rWtblSecurityKey.ucAlgorithmId = CIPHER_SUIT_CCMP_256; - CmdExtWtblUpdate(pAd, (UINT8)pInfo->Wcid, SET_WTBL, - (PUCHAR)&rWtblSecurityKey, - sizeof(CMD_WTBL_SECURITY_KEY_T)); - rWtblSecurityKey.ucAlgorithmId = CIPHER_SUIT_CCMP_W_MIC; - rWtblSecurityKey.u2Length = u2LengthTemp; - rWtblSecurityKey.u2Tag = u2TagTemp; - } - - CmdExtWtblUpdate(pAd, (UINT8)pInfo->Wcid, SET_WTBL, - (PUCHAR)&rWtblSecurityKey, - sizeof(CMD_WTBL_SECURITY_KEY_T)); -} - -VOID MtAsicSetSMPSByFw(IN struct _RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN UCHAR Smps) -{ - CMD_WTBL_SMPS_T CmdWtblSmPs = { 0 }; - - CmdWtblSmPs.u2Tag = WTBL_SMPS; - CmdWtblSmPs.u2Length = sizeof(CMD_WTBL_SMPS_T); - CmdWtblSmPs.ucSmPs = Smps; - CmdExtWtblUpdate(pAd, Wcid, SET_WTBL, (PUCHAR)&CmdWtblSmPs, - sizeof(CMD_WTBL_SMPS_T)); -} - -VOID mt_wtbltlv_debug(RTMP_ADAPTER *pAd, UCHAR ucWcid, UCHAR ucCmdId, - UCHAR ucAtion) -{ - /* tag 0 */ - if (ucCmdId == WTBL_GENERIC) { - CMD_WTBL_GENERIC_T rWtblGeneric = { 0 }; - - rWtblGeneric.u2Tag = WTBL_GENERIC; - rWtblGeneric.u2Length = sizeof(CMD_WTBL_GENERIC_T); - - if (ucAtion == 0) { - /* Set to 0 */ - UCHAR TestMac[MAC_ADDR_LEN] = { 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00 }; - - os_move_mem(rWtblGeneric.aucPeerAddress, TestMac, - MAC_ADDR_LEN); - rWtblGeneric.ucMUARIndex = 0x0; - rWtblGeneric.ucSkipTx = 0; - rWtblGeneric.ucCfAck = 0; - rWtblGeneric.ucQos = 0; - rWtblGeneric.ucMesh = 0; - rWtblGeneric.ucAdm = 0; - rWtblGeneric.u2PartialAID = 0; - rWtblGeneric.ucBafEn = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblGeneric, - sizeof(CMD_WTBL_GENERIC_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - UCHAR TestMac[MAC_ADDR_LEN] = { 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff }; - - os_move_mem(rWtblGeneric.aucPeerAddress, TestMac, - MAC_ADDR_LEN); - rWtblGeneric.ucMUARIndex = 0x0e; - rWtblGeneric.ucSkipTx = 1; - rWtblGeneric.ucCfAck = 1; - rWtblGeneric.ucQos = 1; - rWtblGeneric.ucMesh = 1; - rWtblGeneric.ucAdm = 1; - rWtblGeneric.u2PartialAID = 32; - rWtblGeneric.ucBafEn = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblGeneric, - sizeof(CMD_WTBL_GENERIC_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblGeneric, - sizeof(CMD_WTBL_GENERIC_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 1 */ - if (ucCmdId == WTBL_RX) { - CMD_WTBL_RX_T rWtblRx = { 0 }; - - rWtblRx.u2Tag = WTBL_RX; - rWtblRx.u2Length = sizeof(CMD_WTBL_RX_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblRx.ucRcid = 0; - rWtblRx.ucRca1 = 0; - rWtblRx.ucRca2 = 0; - rWtblRx.ucRv = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblRx, - sizeof(CMD_WTBL_RX_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblRx.ucRcid = 1; - rWtblRx.ucRca1 = 1; - rWtblRx.ucRca2 = 1; - rWtblRx.ucRv = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblRx, - sizeof(CMD_WTBL_RX_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblRx, - sizeof(CMD_WTBL_RX_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 2 */ - if (ucCmdId == WTBL_HT) { - CMD_WTBL_HT_T rWtblHt = { 0 }; - - rWtblHt.u2Tag = WTBL_HT; - rWtblHt.u2Length = sizeof(CMD_WTBL_HT_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblHt.ucHt = 0; - rWtblHt.ucLdpc = 0; - rWtblHt.ucAf = 0; - rWtblHt.ucMm = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblHt, - sizeof(CMD_WTBL_HT_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblHt.ucHt = 1; - rWtblHt.ucLdpc = 1; - rWtblHt.ucAf = 1; - rWtblHt.ucMm = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblHt, - sizeof(CMD_WTBL_HT_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblHt, - sizeof(CMD_WTBL_HT_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 3 */ - if (ucCmdId == WTBL_VHT) { - CMD_WTBL_VHT_T rWtblVht = { 0 }; - - rWtblVht.u2Tag = WTBL_VHT; - rWtblVht.u2Length = sizeof(CMD_WTBL_VHT_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblVht.ucLdpcVht = 0; - rWtblVht.ucDynBw = 0; - rWtblVht.ucVht = 0; - rWtblVht.ucTxopPsCap = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblVht, - sizeof(CMD_WTBL_VHT_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblVht.ucLdpcVht = 1; - rWtblVht.ucDynBw = 1; - rWtblVht.ucVht = 1; - rWtblVht.ucTxopPsCap = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblVht, - sizeof(CMD_WTBL_VHT_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblVht, - sizeof(CMD_WTBL_VHT_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 4 */ - if (ucCmdId == WTBL_PEER_PS) { - CMD_WTBL_PEER_PS_T rWtblPeerPs = { 0 }; - - rWtblPeerPs.u2Tag = WTBL_PEER_PS; - rWtblPeerPs.u2Length = sizeof(CMD_WTBL_PEER_PS_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblPeerPs.ucDuIPsm = 0; - rWtblPeerPs.ucIPsm = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblPeerPs, - sizeof(CMD_WTBL_PEER_PS_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblPeerPs.ucDuIPsm = 1; - rWtblPeerPs.ucIPsm = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblPeerPs, - sizeof(CMD_WTBL_PEER_PS_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblPeerPs, - sizeof(CMD_WTBL_PEER_PS_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 5 */ - if (ucCmdId == WTBL_TX_PS) { - CMD_WTBL_TX_PS_T rWtblTxPs = { 0 }; - - rWtblTxPs.u2Tag = WTBL_TX_PS; - rWtblTxPs.u2Length = sizeof(CMD_WTBL_TX_PS_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblTxPs.ucTxPs = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblTxPs, - sizeof(CMD_WTBL_TX_PS_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblTxPs.ucTxPs = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblTxPs, - sizeof(CMD_WTBL_TX_PS_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblTxPs, - sizeof(CMD_WTBL_TX_PS_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 6 */ - if (ucCmdId == WTBL_HDR_TRANS) { - CMD_WTBL_HDR_TRANS_T rWtblHdrTrans = { 0 }; - - rWtblHdrTrans.u2Tag = WTBL_HDR_TRANS; - rWtblHdrTrans.u2Length = sizeof(CMD_WTBL_HDR_TRANS_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblHdrTrans.ucTd = 0; - rWtblHdrTrans.ucFd = 0; - rWtblHdrTrans.ucDisRhtr = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblHdrTrans, - sizeof(CMD_WTBL_HDR_TRANS_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblHdrTrans.ucTd = 1; - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucDisRhtr = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblHdrTrans, - sizeof(CMD_WTBL_HDR_TRANS_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, - &rWtblHdrTrans, - sizeof(CMD_WTBL_HDR_TRANS_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 7 security */ - /* tag 8 BA */ - - /* tag 9 */ - if (ucCmdId == WTBL_RDG) { - CMD_WTBL_RDG_T rWtblRdg = { 0 }; - - rWtblRdg.u2Tag = WTBL_RDG; - rWtblRdg.u2Length = sizeof(CMD_WTBL_RDG_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblRdg.ucRdgBa = 0; - rWtblRdg.ucR = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblRdg, - sizeof(CMD_WTBL_RDG_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblRdg.ucRdgBa = 1; - rWtblRdg.ucR = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblRdg, - sizeof(CMD_WTBL_RDG_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblRdg, - sizeof(CMD_WTBL_RDG_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 10 */ - if (ucCmdId == WTBL_PROTECTION) { - CMD_WTBL_PROTECTION_T rWtblProtection = { 0 }; - - rWtblProtection.u2Tag = WTBL_PROTECTION; - rWtblProtection.u2Length = sizeof(CMD_WTBL_PROTECTION_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblProtection.ucRts = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, - &rWtblProtection, - sizeof(CMD_WTBL_PROTECTION_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblProtection.ucRts = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, - &rWtblProtection, - sizeof(CMD_WTBL_PROTECTION_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, - &rWtblProtection, - sizeof(CMD_WTBL_PROTECTION_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 11 */ - if (ucCmdId == WTBL_CLEAR) { - CMD_WTBL_CLEAR_T rWtblClear = { 0 }; - - rWtblClear.u2Tag = WTBL_CLEAR; - rWtblClear.u2Length = sizeof(CMD_WTBL_CLEAR_T); - - if (ucAtion == 0) { - /* Set to 0 */ - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblClear.ucClear = ((0 << 1) | (1 << 1) | (1 << 2) | - (1 << 3) | (1 << 4) | (1 << 5)); - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblClear, - sizeof(CMD_WTBL_CLEAR_T)); - } else if (ucAtion == 2) { - /* query */ - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 12 */ - if (ucCmdId == WTBL_BF) { - CMD_WTBL_BF_T rWtblBf = { 0 }; - - rWtblBf.u2Tag = WTBL_BF; - rWtblBf.u2Length = sizeof(CMD_WTBL_BF_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblBf.ucTiBf = 0; - rWtblBf.ucTeBf = 0; - rWtblBf.ucTibfVht = 0; - rWtblBf.ucTebfVht = 0; - rWtblBf.ucGid = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblBf, - sizeof(CMD_WTBL_BF_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblBf.ucTiBf = 1; - rWtblBf.ucTeBf = 1; - rWtblBf.ucTibfVht = 1; - rWtblBf.ucTebfVht = 1; - rWtblBf.ucGid = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblBf, - sizeof(CMD_WTBL_BF_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblBf, - sizeof(CMD_WTBL_BF_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 13 */ - if (ucCmdId == WTBL_SMPS) { - CMD_WTBL_SMPS_T rWtblSmps = { 0 }; - - rWtblSmps.u2Tag = WTBL_SMPS; - rWtblSmps.u2Length = sizeof(CMD_WTBL_SMPS_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblSmps.ucSmPs = 0; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblSmps, - sizeof(CMD_WTBL_SMPS_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblSmps.ucSmPs = 1; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblSmps, - sizeof(CMD_WTBL_SMPS_T)); - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblSmps, - sizeof(CMD_WTBL_SMPS_T)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 14 */ - if (ucCmdId == WTBL_RAW_DATA_RW) { - CMD_WTBL_RAW_DATA_RW_T rWtblRawDataRw = { 0 }; - - rWtblRawDataRw.u2Tag = WTBL_RAW_DATA_RW; - rWtblRawDataRw.u2Length = sizeof(CMD_WTBL_RAW_DATA_RW_T); - - if (ucAtion == 0) { - /* Set to 0 */ - rWtblRawDataRw.ucWtblIdx = 1; - rWtblRawDataRw.ucWhichDW = 0; - rWtblRawDataRw.u4DwMask = 0xffff00ff; - rWtblRawDataRw.u4DwValue = 0x12340078; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblRawDataRw, - sizeof(CMD_WTBL_RAW_DATA_RW_T)); - } else if (ucAtion == 1) { - /* Set to 1 */ - rWtblRawDataRw.ucWtblIdx = 1; - rWtblRawDataRw.ucWhichDW = 0; - rWtblRawDataRw.u4DwMask = 0xffff00ff; - rWtblRawDataRw.u4DwValue = 0x12345678; - CmdExtWtblUpdate(pAd, ucWcid, SET_WTBL, &rWtblRawDataRw, - sizeof(CMD_WTBL_RAW_DATA_RW_T)); - } else if (ucAtion == 2) { - /* query */ - rWtblRawDataRw.ucWtblIdx = 1; - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, - &rWtblRawDataRw, - sizeof(CMD_WTBL_RAW_DATA_RW_T)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::rWtblRawDataRw.u4DwValue(%x)\n", - __func__, rWtblRawDataRw.u4DwValue)); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } - - /* tag 15 */ - if (ucCmdId == WTBL_DUMP) { - CMD_WTBL_DUMP_T rWtblDump = { 0 }; - - rWtblDump.u2Tag = WTBL_DUMP; - rWtblDump.u2Length = sizeof(CMD_WTBL_DUMP_T); - - if (ucAtion == 0) { - /* Set to 0 */ - } else if (ucAtion == 1) { - /* Set to 1 */ - } else if (ucAtion == 2) { - /* query */ - CmdExtWtblUpdate(pAd, ucWcid, QUERY_WTBL, &rWtblDump, - sizeof(CMD_WTBL_DUMP_T)); - hex_dump("WTBL_DUMP", rWtblDump.aucWtblBuffer, - WTBL_BUFFER_SIZE); - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Cmd Error\n", __func__)); - } -} - -VOID MtAsicUpdateProtectByFw(struct _RTMP_ADAPTER *pAd, - MT_PROTECT_CTRL_T *protect) -{ - struct _EXT_CMD_UPDATE_PROTECT_T fw_protect; - os_zero_mem(&fw_protect, sizeof(fw_protect)); - fw_protect.ucProtectIdx = UPDATE_PROTECTION_CTRL; - fw_protect.ucDbdcIdx = protect->band_idx; - fw_protect.Data.rUpdateProtect.ucLongNav = protect->long_nav; - fw_protect.Data.rUpdateProtect.ucMMProtect = protect->mix_mode; - fw_protect.Data.rUpdateProtect.ucGFProtect = protect->gf; - fw_protect.Data.rUpdateProtect.ucBW40Protect = protect->bw40; - fw_protect.Data.rUpdateProtect.ucRifsProtect = protect->rifs; - fw_protect.Data.rUpdateProtect.ucBW80Protect = protect->bw80; - fw_protect.Data.rUpdateProtect.ucBW160Protect = protect->bw160; - fw_protect.Data.rUpdateProtect.ucERProtectMask = protect->erp_mask; - MtCmdUpdateProtect(pAd, &fw_protect); -} - -VOID MtAsicUpdateRtsThldByFw(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR pkt_num, UINT32 length, UCHAR retry_limit) -{ - MT_RTS_THRESHOLD_T rts_thld = { 0 }; - - rts_thld.band_idx = HcGetBandByWdev(wdev); - rts_thld.pkt_num_thld = pkt_num; - rts_thld.pkt_len_thld = length; - rts_thld.retry_limit = retry_limit; - - if (MTK_REV_GTE(pAd, MT7615, MT7615E1) && - MTK_REV_LT(pAd, MT7615, MT7615E3) && pAd->CommonCfg.dbdc_mode) { - ; /* DBDC does not support RTS setting */ - } else { - struct _EXT_CMD_UPDATE_PROTECT_T fw_rts; - os_zero_mem(&fw_rts, sizeof(fw_rts)); - fw_rts.ucProtectIdx = UPDATE_RTS_THRESHOLD; - fw_rts.ucDbdcIdx = rts_thld.band_idx; - fw_rts.Data.rUpdateRtsThld.u4RtsPktLenThreshold = - cpu2le32(rts_thld.pkt_len_thld); - fw_rts.Data.rUpdateRtsThld.u2RtsPktNumThreshold = - cpu2le16(rts_thld.pkt_num_thld); - fw_rts.Data.rUpdateRtsThld.u2RtsRetryLimit = - cpu2le16(rts_thld.retry_limit); - MtCmdUpdateProtect(pAd, &fw_rts); - } -} - -INT MtAsicSetRDGByFw(RTMP_ADAPTER *pAd, MT_RDG_CTRL_T *Rdg) -{ - struct _EXT_CMD_RDG_CTRL_T fw_rdg; - - fw_rdg.u4TxOP = Rdg->Txop; - fw_rdg.ucLongNav = Rdg->LongNav; - fw_rdg.ucInit = Rdg->Init; - fw_rdg.ucResp = Rdg->Resp; - fw_rdg.ucWlanIdx = Rdg->WlanIdx; - fw_rdg.ucBand = Rdg->BandIdx; - MtCmdSetRdg(pAd, &fw_rdg); - return TRUE; -} - -#ifdef DBDC_MODE -INT32 MtAsicGetDbdcCtrlByFw(RTMP_ADAPTER *pAd, BCTRL_INFO_T *pbInfo) -{ - UINT32 ret; - UINT32 i = 0, j = 0; - /*DBDC enable will not need BctrlEntries so minus 1*/ - pbInfo->TotalNum = 0; - /*PTA*/ - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_PTA; - pbInfo->BctrlEntries[i].Index = 0; - i++; - /*MU*/ - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_MU; - pbInfo->BctrlEntries[i].Index = 0; - i++; - - /*BF*/ - for (j = 0; j < 3; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_BF; - pbInfo->BctrlEntries[i].Index = j; - i++; - } - - /*WMM*/ - for (j = 0; j < 4; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_WMM; - pbInfo->BctrlEntries[i].Index = j; - i++; - } - - /*MGMT*/ - for (j = 0; j < 2; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_MGMT; - pbInfo->BctrlEntries[i].Index = j; - i++; - } - - /*MBSS*/ - for (j = 0; j < 15; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_MBSS; - pbInfo->BctrlEntries[i].Index = j; - i++; - } - - /*BSS*/ - for (j = 0; j < 5; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_BSS; - pbInfo->BctrlEntries[i].Index = j; - i++; - } - - /*Repeater*/ - for (j = 0; j < 32; j++) { - pbInfo->BctrlEntries[i].Type = DBDC_TYPE_REPEATER; - pbInfo->BctrlEntries[i].Index = j; - i++; - } - - pbInfo->TotalNum = i; - ret = MtCmdGetDbdcCtrl(pAd, pbInfo); - return ret; -} - -INT32 MtAsicSetDbdcCtrlByFw(RTMP_ADAPTER *pAd, BCTRL_INFO_T *pbInfo) -{ - UINT32 ret = 0; - - ret = MtCmdSetDbdcCtrl(pAd, pbInfo); - return ret; -} - -#endif /*DBDC_MODE*/ - -UINT32 MtAsicGetWmmParamByFw(RTMP_ADAPTER *pAd, UINT32 AcNum, UINT32 EdcaType) -{ - UINT32 ret, Value = 0; - MT_EDCA_CTRL_T EdcaCtrl; - - os_zero_mem(&EdcaCtrl, sizeof(MT_EDCA_CTRL_T)); - EdcaCtrl.ucTotalNum = 1; - EdcaCtrl.ucAction = EDCA_ACT_GET; - EdcaCtrl.rAcParam[0].ucAcNum = AcNum; - ret = MtCmdGetEdca(pAd, &EdcaCtrl); - - switch (EdcaType) { - case WMM_PARAM_TXOP: - Value = EdcaCtrl.rAcParam[0].u2Txop; - break; - - case WMM_PARAM_AIFSN: - Value = EdcaCtrl.rAcParam[0].ucAifs; - break; - - case WMM_PARAM_CWMIN: - Value = EdcaCtrl.rAcParam[0].ucWinMin; - break; - - case WMM_PARAM_CWMAX: - Value = EdcaCtrl.rAcParam[0].u2WinMax; - break; - - default: - Value = 0xdeadbeef; - break; - } - - return Value; -} - -INT MtAsicGetTsfTimeByFirmware(RTMP_ADAPTER *pAd, UINT32 *high_part, - UINT32 *low_part, UCHAR HwBssidIdx) -{ - TSF_RESULT_T TsfResult; - - MtCmdGetTsfTime(pAd, HwBssidIdx, &TsfResult); - *high_part = TsfResult.u4TsfBit63_32; - *low_part = TsfResult.u4TsfBit0_31; - return TRUE; -} - -UINT32 MtAsicGetChBusyCntByFw(RTMP_ADAPTER *pAd, UCHAR ch_idx) -{ - UINT32 msdr16, ret; - - ret = MtCmdGetChBusyCnt(pAd, ch_idx, &msdr16); - return msdr16; -} - -INT32 MtAsicSetMacTxRxByFw(RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN Enable, - UCHAR BandIdx) -{ - UINT32 ret; - - ret = MtCmdSetMacTxRx(pAd, BandIdx, Enable); - return ret; -} - -INT32 MtAsicSetRxvFilter(RTMP_ADAPTER *pAd, BOOLEAN Enable, UCHAR BandIdx) -{ - UINT32 ret; - - ret = MtCmdSetRxvFilter(pAd, BandIdx, Enable); - return ret; -} - -VOID MtAsicDisableSyncByFw(struct _RTMP_ADAPTER *pAd, UCHAR HWBssidIdx) -{ - struct wifi_dev *wdev = NULL; - UCHAR i; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - wdev = pAd->wdev_list[i]; - - if (wdev != NULL) { - if (wdev->OmacIdx == HWBssidIdx) - break; - } else - continue; - } - - /* ASSERT(wdev != NULL); */ - - if (wdev == NULL) - return; - - if (WDEV_BSS_STATE(wdev) == BSS_INIT) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: BssInfo idx (%d) is INIT currently!!!\n", - __func__, wdev->bss_info_argument.ucBssIndex)); - return; - } - - WDEV_BSS_STATE(wdev) = BSS_INITED; - CmdSetSyncModeByBssInfoUpdate(pAd, wdev->bss_info_argument); -} - -VOID MtAsicEnableBssSyncByFw(struct _RTMP_ADAPTER *pAd, USHORT BeaconPeriod, - UCHAR HWBssidIdx, UCHAR OPMode) -{ - struct wifi_dev *wdev = NULL; - UCHAR i; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - wdev = pAd->wdev_list[i]; - - if (wdev != NULL) { - if (wdev->OmacIdx == HWBssidIdx) - break; - } else - continue; - } - - /* ASSERT(wdev != NULL); */ - - if (wdev == NULL) - return; - - if (WDEV_BSS_STATE(wdev) == BSS_INIT) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s: BssInfo idx (%d) is INIT currently!!!\n", - __func__, wdev->bss_info_argument.ucBssIndex)); - return; - } - - WDEV_BSS_STATE(wdev) = BSS_ACTIVE; - CmdSetSyncModeByBssInfoUpdate(pAd, wdev->bss_info_argument); -} - -#if defined(MT_MAC) && defined(TXBF_SUPPORT) -/* STARec Info */ -INT32 MtAsicSetAid(RTMP_ADAPTER *pAd, UINT16 Aid) -{ - return CmdETxBfAidSetting(pAd, Aid); -} -#endif - -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT -/* TODO: Carter/Star for Repeater can support DBDC, after define STA/APCLI/Repeater */ -INT MtAsicSetReptFuncEnableByFw(RTMP_ADAPTER *pAd, BOOLEAN bEnable) -{ - EXT_CMD_MUAR_T config_muar; - - NdisZeroMemory(&config_muar, sizeof(EXT_CMD_MUAR_T)); - - if (bEnable == TRUE) - config_muar.ucMuarModeSel = MUAR_REPEATER; - else - config_muar.ucMuarModeSel = MUAR_NORMAL; - - MtCmdMuarConfigSet(pAd, (UCHAR *)&config_muar); - return TRUE; -} - -VOID MtAsicInsertRepeaterEntryByFw(IN PRTMP_ADAPTER pAd, IN UCHAR CliIdx, - IN PUCHAR pAddr) -{ - UCHAR *pdata = NULL; - EXT_CMD_MUAR_T config_muar; - EXT_CMD_MUAR_MULTI_ENTRY_T muar_entry; - - NdisZeroMemory(&config_muar, sizeof(EXT_CMD_MUAR_T)); - NdisZeroMemory(&muar_entry, sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - os_alloc_mem(pAd, (UCHAR **)&pdata, - sizeof(EXT_CMD_MUAR_T) + - sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n%s %02x:%02x:%02x:%02x:%02x:%02x-%02x\n", __func__, - pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], - CliIdx)); - config_muar.ucMuarModeSel = MUAR_REPEATER; - config_muar.ucEntryCnt = 1; - config_muar.ucAccessMode = MUAR_WRITE; - muar_entry.ucMuarIdx = (CliIdx * 2); - COPY_MAC_ADDR(muar_entry.aucMacAddr, pAddr); - NdisMoveMemory(pdata, &config_muar, sizeof(EXT_CMD_MUAR_T)); - NdisMoveMemory(pdata + sizeof(EXT_CMD_MUAR_T), &muar_entry, - sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - MtCmdMuarConfigSet(pAd, (UCHAR *)pdata); - os_free_mem(pdata); -} - -VOID MtAsicRemoveRepeaterEntryByFw(RTMP_ADAPTER *pAd, UCHAR CliIdx) -{ - UCHAR *pdata = NULL; - UCHAR *ptr = NULL; - UCHAR i = 0; - UCHAR zeroMac[MAC_ADDR_LEN] = { 0 }; - EXT_CMD_MUAR_T config_muar; - EXT_CMD_MUAR_MULTI_ENTRY_T muar_entry; - - NdisZeroMemory(&config_muar, sizeof(EXT_CMD_MUAR_T)); - NdisZeroMemory(&muar_entry, sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - config_muar.ucMuarModeSel = MUAR_REPEATER; - config_muar.ucEntryCnt = 2; - config_muar.ucAccessMode = MUAR_WRITE; - os_alloc_mem(pAd, (UCHAR **)&pdata, - sizeof(EXT_CMD_MUAR_T) + - (config_muar.ucEntryCnt * - sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T))); - ptr = pdata; - NdisMoveMemory(pdata, &config_muar, sizeof(EXT_CMD_MUAR_T)); - ptr = pdata + sizeof(EXT_CMD_MUAR_T); - - for (i = 0; i < config_muar.ucEntryCnt; i++) { - muar_entry.ucMuarIdx = (CliIdx * 2) + i; - COPY_MAC_ADDR(muar_entry.aucMacAddr, zeroMac); - NdisMoveMemory(ptr, &muar_entry, - sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - ptr = ptr + sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T); - } - - MtCmdMuarConfigSet(pAd, (UCHAR *)pdata); - os_free_mem(pdata); -} - -VOID MtAsicInsertRepeaterRootEntryByFw(IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, - IN UCHAR *pAddr, IN UCHAR ReptCliIdx) -{ - UCHAR *pdata = NULL; - EXT_CMD_MUAR_T config_muar; - EXT_CMD_MUAR_MULTI_ENTRY_T muar_entry; - - NdisZeroMemory(&config_muar, sizeof(EXT_CMD_MUAR_T)); - NdisZeroMemory(&muar_entry, sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - os_alloc_mem(pAd, (UCHAR **)&pdata, - sizeof(EXT_CMD_MUAR_T) + - sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n%s %02x:%02x:%02x:%02x:%02x:%02x-%02x\n", __func__, - pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], - ReptCliIdx)); - config_muar.ucMuarModeSel = MUAR_REPEATER; - config_muar.ucEntryCnt = 1; - config_muar.ucAccessMode = MUAR_WRITE; - muar_entry.ucMuarIdx = (ReptCliIdx * 2) + 1; - COPY_MAC_ADDR(muar_entry.aucMacAddr, pAddr); - NdisMoveMemory(pdata, &config_muar, sizeof(EXT_CMD_MUAR_T)); - NdisMoveMemory(pdata + sizeof(EXT_CMD_MUAR_T), &muar_entry, - sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - MtCmdMuarConfigSet(pAd, (UCHAR *)pdata); - os_free_mem(pdata); -} - -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_chip.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_chip.c deleted file mode 100644 index 72de913152..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_chip.c +++ /dev/null @@ -1,329 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_chip.c -*/ - -#include "rt_config.h" -#include "hdev/hdev.h" - -#ifdef TXBF_SUPPORT -VOID chip_tx_bf_init(struct _RTMP_ADAPTER *ad, struct _MAC_TABLE_ENTRY *pEntry, - struct _IE_lists *ie_list, BOOLEAN supportsETxBF) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->TxBFInit) - ops->TxBFInit(ad, pEntry, ie_list, supportsETxBF); -} -#endif /*TXBF_SUPPORT*/ - -#ifdef RF_LOCKDOWN -BOOLEAN chip_check_rf_lock_down(RTMP_ADAPTER *ad) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->check_RF_lock_down) - return ops->check_RF_lock_down(ad); - return FALSE; -} -#endif /*RF_LOCKDOWN*/ - -INT32 chip_cmd_tx(struct _RTMP_ADAPTER *ad, struct cmd_msg *msg) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->MtCmdTx) - return ops->MtCmdTx(ad, msg); - return 0; -} - -#ifdef WIFI_SPECTRUM_SUPPORT -VOID chip_spectrum_start(struct _RTMP_ADAPTER *ad, UINT8 *info) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->SpectrumStart != NULL) - ops->SpectrumStart(ad, info); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The function is not hooked !!\n", __func__)); - } -} -#endif /*WIFI_SPECTRUM_SUPPORT*/ - -BOOLEAN chip_eeprom_read16(struct _RTMP_ADAPTER *ad, USHORT offset, - USHORT *value) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->eeread) - return ops->eeread(ad, offset, value); - else - return FALSE; -} - -BOOLEAN chip_eeprom_read_with_range(struct _RTMP_ADAPTER *ad, USHORT start, - USHORT length, UCHAR *pbuf) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->eeread_range) - return ops->eeread_range(ad, start, length, pbuf); - else - return FALSE; -} - -VOID chip_fw_init(struct _RTMP_ADAPTER *ad) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->FwInit && (IS_HIF_TYPE(ad, HIF_MT))) - ops->FwInit(ad); -} - -VOID chip_parse_rxv_packet(struct _RTMP_ADAPTER *ad, UINT32 Type, - struct _RX_BLK *RxBlk, UCHAR *Data) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->parse_RXV_packet) - ops->parse_RXV_packet(ad, Type, RxBlk, Data); -} - -INT32 chip_txs_handler(RTMP_ADAPTER *ad, RX_BLK *rx_blk, VOID *rx_packet) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->txs_handler) - ops->txs_handler(ad, rx_blk, rx_packet); - - return FALSE; -} - -VOID chip_rx_event_handler(struct _RTMP_ADAPTER *ad, VOID *rx_packet) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->rx_event_handler != NULL) { -#ifdef UNIFY_FW_CMD - ops->rx_event_handler(ad, rx_packet + sizeof(RXD_BASE_STRUCT)); -#else - ops->rx_event_handler(ad, rx_packet); -#endif /* UNIFY_FW_CMD */ - } -} - -INT chip_show_pwr_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->show_pwr_info) - ops->show_pwr_info(pAd); - - return 0; -} - -VOID chip_arch_set_aid(struct _RTMP_ADAPTER *ad, USHORT aid) -{ -#if defined(MT_MAC) && defined(TXBF_SUPPORT) - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - if (ops->archSetAid) - ops->archSetAid(ad, aid); -#endif -} - -VOID AsicSetRxAnt(RTMP_ADAPTER *ad, UCHAR Ant) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->SetRxAnt) - ops->SetRxAnt(ad, Ant); -} - -#ifdef MICROWAVE_OVEN_SUPPORT -VOID AsicMeasureFalseCCA(RTMP_ADAPTER *ad) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->AsicMeasureFalseCCA) - ops->AsicMeasureFalseCCAad; -} - -VOID AsicMitigateMicrowave(RTMP_ADAPTER *ad) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->AsicMitigateMicrowave) - ops->AsicMitigateMicrowave(ad); -} -#endif /* MICROWAVE_OVEN_SUPPORT */ - -VOID AsicBbpInitFromEEPROM(RTMP_ADAPTER *ad) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BbpInitFromEEPROM) - ops->BbpInitFromEEPROM(ad); -} - -#if defined(MT_MAC) && defined(TXBF_SUPPORT) -INT32 AsicBfStaRecUpdate(RTMP_ADAPTER *ad, UCHAR ucPhyMode, UCHAR ucBssIdx, - UCHAR ucWlanIdx) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BfStaRecUpdate) { - return ops->BfStaRecUpdate(ad, ucPhyMode, ucBssIdx, ucWlanIdx); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicBfStaRecRelease(RTMP_ADAPTER *ad, UCHAR ucBssIdx, UCHAR ucWlanIdx) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BfStaRecRelease) { - return ops->BfStaRecRelease(ad, ucBssIdx, ucWlanIdx); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicBfPfmuMemAlloc(RTMP_ADAPTER *ad, UCHAR ucSu_Mu, UCHAR ucWlanId) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BfPfmuMemAlloc) { - return ops->BfPfmuMemAlloc(ad, ucSu_Mu, ucWlanId); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicBfPfmuMemRelease(RTMP_ADAPTER *ad, UCHAR ucWlanId) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BfPfmuMemRelease) { - return ops->BfPfmuMemRelease(ad, ucWlanId); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicTxBfTxApplyCtrl(RTMP_ADAPTER *ad, UCHAR ucWlanId, BOOLEAN fgETxBf, - BOOLEAN fgITxBf, BOOLEAN fgMuTxBf, - BOOLEAN fgPhaseCali) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->TxBfTxApplyCtrl) { - return ops->TxBfTxApplyCtrl(ad, ucWlanId, fgETxBf, fgITxBf, - fgMuTxBf, fgPhaseCali); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicTxBfeeHwCtrl(RTMP_ADAPTER *ad, BOOLEAN fgBfeeHwCtrl) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BfeeHwCtrl) { - return ops->BfeeHwCtrl(ad, fgBfeeHwCtrl); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicTxBfApClientCluster(RTMP_ADAPTER *ad, UCHAR ucWlanId, - UCHAR ucCmmWlanId) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BfApClientCluster) { - return ops->BfApClientCluster(ad, ucWlanId, ucCmmWlanId); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicTxBfReptClonedStaToNormalSta(RTMP_ADAPTER *ad, UCHAR ucWlanId, - UCHAR ucCliIdx) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BfReptClonedStaToNormalSta) { - return ops->BfReptClonedStaToNormalSta(ad, ucWlanId, ucCliIdx); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicTxBfHwEnStatusUpdate(RTMP_ADAPTER *ad, BOOLEAN fgETxBf, - BOOLEAN fgITxBf) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->BfHwEnStatusUpdate) { - return ops->BfHwEnStatusUpdate(ad, fgETxBf, fgITxBf); - } else { - AsicNotSupportFunc(ad, __func__); - return FALSE; - } -} - -INT32 AsicTxBfModuleEnCtrl(struct _RTMP_ADAPTER *pAd, UINT8 u1BfNum, - UINT8 u1BfBitmap, UINT8 u1BfSelBand[]) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->BfModuleEnCtrl) { - return ops->BfModuleEnCtrl(pAd, u1BfNum, u1BfBitmap, - u1BfSelBand); - } else { - AsicNotSupportFunc(pAd, __func__); - return FALSE; - } -} - -#endif /* MT_MAC && TXBF_SUPPORT */ - -INT32 chip_tssi_set(struct _RTMP_ADAPTER *ad, char *efuse) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->tssi_set) - return ops->tssi_set(ad, efuse); - return 0; -} - -INT32 chip_pa_lna_set(struct _RTMP_ADAPTER *ad, char *efuse) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(ad->hdev_ctrl); - - if (ops->pa_lna_set) - return ops->pa_lna_set(ad, efuse); - - return 0; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_chip_mt.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_chip_mt.c deleted file mode 100644 index bdaa566fae..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/cmm_chip_mt.c +++ /dev/null @@ -1,823 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_asic.c - - Abstract: - Functions used to communicate with ASIC - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" - -#define BSSID_WCID_TO_REMOVE 1 /* Pat:TODO */ - -#ifdef CONFIG_AP_SUPPORT -VOID APCheckBcnQHandler(RTMP_ADAPTER *pAd, INT apidx, BOOLEAN *is_pretbtt_int) -{ - /* no implementation after mt7615 */ - return; -} -#endif /* CONFIG_AP_SUPPORT */ - -VOID MTPollTxRxEmpty(RTMP_ADAPTER *pAd) -{ -#ifdef RTMP_MAC_PCI - MTPciPollTxRxEmpty(pAd); -#endif /* RTMP_MAC_PCI */ -} - -VOID MTHifPolling(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx) -{ -#ifdef RTMP_MAC_PCI - UINT32 Loop, RxPending = 0; - PNDIS_PACKET pRxPacket = NULL; - RX_BLK RxBlk, *pRxBlk; - BOOLEAN bReschedule = FALSE; - EVENT_EXT_CMD_RESULT_T rResult = { 0 }; - - for (Loop = 0; Loop < 10; Loop++) { - while (1) { - pRxBlk = &RxBlk; - pRxPacket = pAd->archOps.get_pkt_from_rx_resource( - pAd, &bReschedule, &RxPending, 0); - - if ((RxPending == 0) && (bReschedule == FALSE)) - break; - RELEASE_NDIS_PACKET(pAd, pRxPacket, - NDIS_STATUS_SUCCESS); - - msleep(20); - } - } - - for (Loop = 0; Loop < 10; Loop++) { - AsicExtWifiHifCtrl(pAd, ucDbdcIdx, - HIF_CTRL_ID_HIF_USB_TX_RX_IDLE, &rResult); - - if (rResult.u4Status == 0) - break; - - while (1) { - pRxBlk = &RxBlk; - pRxPacket = pAd->archOps.get_pkt_from_rx_resource( - pAd, &bReschedule, &RxPending, 0); - - if ((RxPending == 0) && (bReschedule == FALSE)) - break; - RELEASE_NDIS_PACKET(pAd, pRxPacket, - NDIS_STATUS_SUCCESS); - } - - if (Loop == 1) { - /* Above scenario should pass at 1st time or assert */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Failed to poll RX path empry.\n", - __func__)); - ASSERT(0); - } - } - -#endif /* RTMP_MAC_PCI */ -} - -VOID MTRadioOn(PRTMP_ADAPTER pAd, struct wifi_dev *wdev) -{ - /* Driver Own */ - if (IS_MT7622(pAd)) - DriverOwn(pAd); - - /* Send radio on command and wait for ack */ - if (IS_MT7603(pAd)) - MtCmdRadioOnOffCtrl(pAd, WIFI_RADIO_ON); - else - RTMP_RADIO_ON_OFF_CTRL(pAd, - HcGetBandByChannel(pAd, wdev->channel), - WIFI_RADIO_ON); - - /* Send Led on command */ - - /* Enable RX */ - if (IS_MT7603(pAd)) - AsicSetMacTxRx(pAd, ASIC_MAC_RX, TRUE); - - HcSetRadioCurStatByChannel(pAd, wdev->channel, PHY_INUSE); -} - -VOID MTRadioOff(PRTMP_ADAPTER pAd, struct wifi_dev *wdev) -{ - /* Disable RX */ - if (IS_MT7603(pAd)) - AsicSetMacTxRx(pAd, ASIC_MAC_RX, FALSE); - - /* Polling TX/RX path until packets empty */ - if (IS_MT7603(pAd)) - MTPollTxRxEmpty(pAd); - - /* Set Radio off flag*/ - HcSetRadioCurStatByChannel(pAd, wdev->channel, PHY_RADIOOFF); - - /* Delay for CR access, review it again. Pat: */ - /* msleep(1000); */ - - /* Send radio off command and wait for ack */ - if (IS_MT7603(pAd)) - MtCmdRadioOnOffCtrl(pAd, WIFI_RADIO_OFF); - else - RTMP_RADIO_ON_OFF_CTRL(pAd, - HcGetBandByChannel(pAd, wdev->channel), - WIFI_RADIO_OFF); - - msleep(1000); - - if (IS_MT7622(pAd)) { - /* Polling RX path until packets empty when all bands are in radio off */ - if (IsHcAllSupportedBandsRadioOff(pAd)) { - MTHifPolling(pAd, HcGetBandByWdev(wdev)); - - /* FW own */ - FwOwn(pAd); - } - } -} - -#ifdef RTMP_MAC_PCI -VOID MTMlmeLpExit(PRTMP_ADAPTER pAd, struct wifi_dev *wdev) -{ -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; -#endif -#ifdef CONFIG_FWOWN_SUPPORT - DriverOwn(pAd); -#endif /* CONFIG_FWOWN_SUPPORT */ -#ifdef RTMP_MAC_PCI - /* Enable PDMA */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d)::PDMA\n", __func__, __LINE__)); - AsicSetWPDMA(pAd, PDMA_TX_RX, 1); - /* Make sure get clear FW own interrupt */ - RtmpOsMsDelay(100); -#endif /* RTMP_MAC_PCI */ -#ifdef CONFIG_FWOWN_SUPPORT - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d)::bDrvOwn(%d)\n", __func__, __LINE__, pAd->bDrvOwn)); -#endif /* CONFIG_FWOWN_SUPPORT */ - MCU_CTRL_INIT(pAd); - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD); - /* Send radio on command and wait for ack */ - RTMP_RADIO_ON_OFF_CTRL(pAd, DBDC_BAND_NUM, WIFI_RADIO_ON); - /* Send Led on command */ - /* Enable RX */ - /* Offlaod below task to AsicExtPmStateCtrl() */ - /* AsicSetMacTxRx(pAd, ASIC_MAC_RX, TRUE); */ - HcSetAllSupportedBandsRadioOn(pAd); - /* Resume sending TX packet */ - RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev) - RTMP_OS_NETDEV_START_QUEUE( - pAd->ApCfg.MBSSID[IdBss].wdev.if_dev); - } - } -#endif -} - -VOID MTMlmeLpEnter(PRTMP_ADAPTER pAd, struct wifi_dev *wdev) -{ -#ifdef CONFIG_AP_SUPPORT - INT32 IdBss, MaxNumBss = pAd->ApCfg.BssidNum; - BSS_STRUCT *pMbss = NULL; -#endif /* CONFIG_AP_SUPPORT */ - /* Stop send TX packets */ - RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - if (MaxNumBss > MAX_MBSSID_NUM(pAd)) - MaxNumBss = MAX_MBSSID_NUM(pAd); - - /* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */ - for (IdBss = FIRST_MBSSID; IdBss < MAX_MBSSID_NUM(pAd); - IdBss++) { - pMbss = &pAd->ApCfg.MBSSID[IdBss]; - if (pMbss->wdev.if_dev) - RTMP_OS_NETDEV_STOP_QUEUE(pMbss->wdev.if_dev); - } - APStop(pAd, pMbss, AP_BSS_OPER_BY_RF); - } -#endif /* CONFIG_AP_SUPPORT */ - /* Disable RX */ - /* Below function is offloaded to AsicExtPmStateCtrl() */ - /* AsicSetMacTxRx(pAd, ASIC_MAC_RX, FALSE); */ - /* Set Radio off flag*/ - HcSetAllSupportedBandsRadioOff(pAd); - /* Delay for CR access */ - msleep(1000); - /* Send Led off command */ - /* Send radio off command and wait for ack */ - RTMP_RADIO_ON_OFF_CTRL(pAd, DBDC_BAND_NUM, WIFI_RADIO_OFF); - /* Polling TX/RX path until packets empty */ - MTHifPolling(pAd, HcGetBandByWdev(wdev)); -#ifdef RTMP_MAC_PCI - /* Disable PDMA */ - AsicSetWPDMA(pAd, PDMA_TX_RX, 0); -#endif /* RTMP_MAC_PCI */ -#ifdef CONFIG_FWOWN_SUPPORT - FwOwn(pAd); -#endif /* CONFIG_FWOWN_SUPPORT */ -} - -VOID MTPciPollTxRxEmpty(RTMP_ADAPTER *pAd) -{ - UINT32 Loop, Value; - UINT32 IdleTimes = 0; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - RtmpOsMsDelay(100); - /* Fix Rx Ring FULL lead DMA Busy, when DUT is in reset stage */ - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE); - - /* Poll Tx until empty */ - for (Loop = 0; Loop < 20000; Loop++) { - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) - return; - - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &Value); - - if ((Value & TX_DMA_BUSY) == 0x00) { - IdleTimes++; - RtmpusecDelay(50); - } - - if (IdleTimes > 5000) - break; - } - - if (Loop >= 20000) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TX DMA Busy!! WPDMA_GLO_CFG_STRUC = %d\n", - __func__, Value)); - } - - IdleTimes = 0; - - /* Poll Rx to empty */ - for (Loop = 0; Loop < 20000; Loop++) { - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) - return; - - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &Value); - - if ((Value & RX_DMA_BUSY) == 0x00) { - IdleTimes++; - RtmpusecDelay(50); - } - - if (IdleTimes > 5000) - break; - } - - if (Loop >= 20000) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RX DMA Busy!! WPDMA_GLO_CFG_STRUC = %d\n", - __func__, Value)); - } - - /* Fix Rx Ring FULL lead DMA Busy, when DUT is in reset stage */ - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_POLL_IDLE); -} -#endif /* RTMP_MAC_PCI */ - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -VOID PDMAResetAndRecovery(RTMP_ADAPTER *pAd) -{ - UINT32 RemapBase, RemapOffset; - UINT32 Value; - UINT32 RestoreValue; - UINT32 Loop = 0; - ULONG IrqFlags; - struct _PCI_HIF_T *hif = hc_get_hif_ctrl(pAd->hdev_ctrl); - - /* Stop SW Dequeue */ - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); - RTMP_ASIC_INTERRUPT_DISABLE(pAd); - /* Disable PDMA */ - RT28XXDMADisable(pAd); - RtmpOsMsDelay(1); - pAd->RxRest = 1; - /* Assert csr_force_tx_eof */ - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &Value); - Value |= FORCE_TX_EOF; - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, Value); - /* Infor PSE client of TX abort */ - MAC_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(RST) << 19; - RemapOffset = GET_REMAP_2_OFFSET(RST); - MAC_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - MAC_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value |= TX_R_E_1; - MAC_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - - do { - MAC_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - - if ((Value & TX_R_E_1_S) == TX_R_E_1_S) - break; - - RtmpOsMsDelay(1); - Loop++; - } while (Loop <= 500); - - if (Loop > 500) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s: Tx state is not idle(CLIET RST = %x)\n", - __func__, Value)); - pAd->PDMAResetFailCount++; - } - - MAC_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value |= TX_R_E_2; - MAC_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - /* Reset PDMA */ - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &Value); - Value |= SW_RST; - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, Value); - Loop = 0; - - /* Polling for PSE client to clear TX FIFO */ - do { - MAC_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - - if ((Value & TX_R_E_2_S) == TX_R_E_2_S) - break; - - RtmpOsMsDelay(1); - Loop++; - } while (Loop <= 500); - - if (Loop > 500) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s: Tx FIFO is not empty(CLIET RST = %x)\n", - __func__, Value)); - pAd->PDMAResetFailCount++; - } - - /* De-assert PSE client TX abort */ - MAC_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~TX_R_E_1; - Value &= ~TX_R_E_2; - MAC_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - MAC_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - /*TODO: Carter, HWBssid idx might not 0 case, check this.*/ - AsicDisableSync(pAd, HW_BSSID_0); - RTMP_IRQ_LOCK(&hif->BcnRingLock, IrqFlags); -#ifdef CONFIG_AP_SUPPORT - - if (pAd->OpMode == OPMODE_AP) { - BSS_STRUCT *pMbss; - - pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; - ASSERT(pMbss); - - if (pMbss) - pMbss->wdev.bcn_buf.bcn_state = BCN_TX_IDLE; - else { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s():func_dev is NULL!\n", __func__)); - RTMP_IRQ_UNLOCK(&hif->BcnRingLock, IrqFlags); - return; - } - } - -#endif - RTMP_IRQ_UNLOCK(&hif->BcnRingLock, IrqFlags); - RTMPRingCleanUp(pAd, QID_AC_BE); - RTMPRingCleanUp(pAd, QID_AC_BK); - RTMPRingCleanUp(pAd, QID_AC_VI); - RTMPRingCleanUp(pAd, QID_AC_VO); - RTMPRingCleanUp(pAd, QID_MGMT); - RTMPRingCleanUp(pAd, QID_CTRL); - RTMPRingCleanUp(pAd, QID_BCN); - RTMPRingCleanUp(pAd, QID_BMC); - RTMPRingCleanUp(pAd, QID_RX); -#ifdef VENDOR_FEATURE7_SUPPORT - /* Start - Triggered from PDMAWatchDog. Log and try to recover. */ - if (pAd->TxDMAResetCount >= 3) { - UCHAR event_msg[100] = { 0 }; - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, WLAN_EVENT, - ASIC_RELOAD_EVENT, "MT7615", strlen("MT7615")); - snprintf( - event_msg, sizeof(event_msg), - "MT7615 - Hardware error detected - recovery was attempted.\n"); - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_LOG_SAVE_CONSOLE, 0, event_msg, - strlen(event_msg)); - return; - } -#endif - /* AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);//Carter check this. */ - /* Enable PDMA */ - RT28XXDMAEnable(pAd); - RTMP_ASIC_INTERRUPT_ENABLE(pAd); - /* Enable SW Dequeue */ - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); -} - -VOID PDMAWatchDog(RTMP_ADAPTER *pAd) -{ - BOOLEAN NoDataOut = FALSE, NoDataIn = FALSE; - /* Tx DMA unchaged detect */ - NoDataOut = MonitorTxRing(pAd); - - if (NoDataOut) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("TXDMA Reset\n")); - pAd->TxDMAResetCount++; - goto reset; - } - - /* Rx DMA unchanged detect */ - NoDataIn = MonitorRxRing(pAd); - - if (NoDataIn) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("RXDMA Reset\n")); - pAd->RxDMAResetCount++; - goto reset; - } - - return; -reset: - PDMAResetAndRecovery(pAd); -} -#endif - -VOID PSEResetAndRecovery(RTMP_ADAPTER *pAd) -{ - UINT32 Loop = 0; - UINT32 Value; -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) - NdisAcquireSpinLock(&pAd->IndirectUpdateLock); - -#endif - RTMP_IO_READ32(pAd, 0x816c, &Value); - Value |= (1 << 0); - RTMP_IO_WRITE32(pAd, 0x816c, Value); - - do { - RTMP_IO_READ32(pAd, 0x816c, &Value); - - if ((Value & (1 << 1)) == (1 << 1)) { - Value &= ~(1 << 1); - RTMP_IO_WRITE32(pAd, 0x816c, Value); - break; - } - - RtmpOsMsDelay(1); - Loop++; - } while (Loop <= 500); - - if (Loop > 500) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s: PSE Reset Fail(%x)\n", __func__, Value)); - pAd->PSEResetFailCount++; - } - -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) - NdisReleaseSpinLock(&pAd->IndirectUpdateLock); - -#endif -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) - PDMAResetAndRecovery(pAd); - -#endif -} - -#ifdef RTMP_PCI_SUPPORT -BOOLEAN PciMonitorRxPse(RTMP_ADAPTER *pAd) -{ - UINT32 RemapBase, RemapOffset; - UINT32 Value; - UINT32 RestoreValue; - - if (pAd->RxPseCheckTimes < 10) { - /* Check RX FIFO if not ready */ - MAC_IO_WRITE32(pAd, 0x4244, 0x98000000); - MAC_IO_READ32(pAd, 0x4244, &Value); - - if ((Value & (1 << 9)) != 0) { - pAd->RxPseCheckTimes = 0; - return FALSE; - } - - MAC_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(0x800c006c) << 19; - RemapOffset = GET_REMAP_2_OFFSET(0x800c006c); - MAC_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - MAC_IO_WRITE32(pAd, 0x80000 + RemapOffset, 3); - MAC_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - - if (((Value & (0x8001 << 16)) == (0x8001 << 16)) || - ((Value & (0xe001 << 16)) == (0xe001 << 16)) || - ((Value & (0x4001 << 16)) == (0x4001 << 16)) || - ((Value & (0x8002 << 16)) == (0x8002 << 16)) || - ((Value & (0xe002 << 16)) == (0xe002 << 16)) || - ((Value & (0x4002 << 16)) == (0x4002 << 16))) { - if (((Value & (0x8001 << 16)) == (0x8001 << 16)) || - ((Value & (0xe001 << 16)) == (0xe001 << 16)) || - ((Value & (0x8002 << 16)) == (0x8002 << 16)) || - ((Value & (0xe002 << 16)) == (0xe002 << 16))) - pAd->PSETriggerType1Count++; - - if (((Value & (0x4001 << 16)) == (0x4001 << 16)) || - ((Value & (0x4002 << 16)) == (0x4002 << 16))) - pAd->PSETriggerType2Count++; - - pAd->RxPseCheckTimes++; - MAC_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - return FALSE; - } - - pAd->RxPseCheckTimes = 0; - MAC_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - return FALSE; - } - - pAd->RxPseCheckTimes = 0; - return TRUE; -} -#endif - -#ifdef RTMP_PCI_SUPPORT -#endif /* RTMP_PCI_SUPPORT */ - -VOID PSEWatchDog(RTMP_ADAPTER *pAd) -{ - BOOLEAN NoDataIn = FALSE; -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) - NoDataIn = PciMonitorRxPse(pAd); - -#endif - - if (NoDataIn) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PSE Reset:MonitorRxPse\n")); - pAd->PSEResetCount++; - goto reset; - } - -#ifdef RTMP_PCI_SUPPORT -#endif /* RTMP_PCI_SUPPORT */ - return; -reset:; - PSEResetAndRecovery(pAd); -} - -VOID mt_bcn_buf_init(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - pChipCap->FlgIsSupSpecBcnBuf = FALSE; - pChipCap->BcnMaxHwNum = 16; - pChipCap->BcnMaxNum = 16; -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || \ - defined(MT7637_FPGA) - pChipCap->WcidHwRsvNum = 20; -#else - pChipCap->WcidHwRsvNum = 127; -#endif /* MT7603_FPGA */ - pChipCap->BcnMaxHwSize = 0x2000; /* useless!! */ - pChipCap->BcnBase[0] = 0; - pChipCap->BcnBase[1] = 0; - pChipCap->BcnBase[2] = 0; - pChipCap->BcnBase[3] = 0; - pChipCap->BcnBase[4] = 0; - pChipCap->BcnBase[5] = 0; - pChipCap->BcnBase[6] = 0; - pChipCap->BcnBase[7] = 0; - pChipCap->BcnBase[8] = 0; - pChipCap->BcnBase[9] = 0; - pChipCap->BcnBase[10] = 0; - pChipCap->BcnBase[11] = 0; - pChipCap->BcnBase[12] = 0; - pChipCap->BcnBase[13] = 0; - pChipCap->BcnBase[14] = 0; - pChipCap->BcnBase[15] = 0; - ops->BeaconUpdate = NULL; - - /* TODO: shiang-7603 */ - if (pChipCap->hif_type == HIF_MT) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, - __LINE__)); - } -} - -VOID mt_chip_bcn_parameter_init(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - pChipCap->FlgIsSupSpecBcnBuf = FALSE; - pChipCap->BcnMaxHwNum = 16; - pChipCap->BcnMaxNum = 16; -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) - pChipCap->WcidHwRsvNum = 20; -#else - pChipCap->WcidHwRsvNum = 127; -#endif /* MT7603_FPGA */ - ops->BeaconUpdate = NULL; -} - -#ifdef CONFIG_AP_SUPPORT -/* - * NOTE: - * this function is for MT7628/MT7603/MT7636 only. - * - * MT7636 has no MBSS function. - * but below to MT MBSS gen1 mac address assignment rule - */ -VOID MtAsicSetMbssWdevIfAddrGen1(struct _RTMP_ADAPTER *pAd, INT idx, - UCHAR *if_addr, INT opmode) -{ - UINT32 Value = 0; - UCHAR MacByte = 0, MacMask = 0; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s-%s\n", __FILE__, __func__)); - - if (opmode == OPMODE_AP) { - COPY_MAC_ADDR(if_addr, pAd->CurrentAddress); - /* read BTEIR bit[31:29] for determine to choose which byte to extend BSSID mac address.*/ - MAC_IO_READ32(pAd, LPON_BTEIR, &Value); - /* Note: Carter, make default will use byte4 bit[31:28] to extend Mac Address */ - Value = Value | (0x2 << 29); - MAC_IO_WRITE32(pAd, LPON_BTEIR, Value); - MacByte = Value >> 29; - MAC_IO_READ32(pAd, RMAC_RMACDR, &Value); - Value = Value & ~RMACDR_MBSSID_MASK; - - if (pAd->ApCfg.BssidNum <= 2) { - Value |= RMACDR_MBSSID(0x0); - MacMask = 0xef; - } else if (pAd->ApCfg.BssidNum <= 4) { - Value |= RMACDR_MBSSID(0x1); - MacMask = 0xcf; - } else if (pAd->ApCfg.BssidNum <= 8) { - Value |= RMACDR_MBSSID(0x2); - MacMask = 0x8f; - } else if (pAd->ApCfg.BssidNum <= 16) { - Value |= RMACDR_MBSSID(0x3); - MacMask = 0x0f; - } else { - Value |= RMACDR_MBSSID(0x3); - MacMask = 0x0f; - } - - MAC_IO_WRITE32(pAd, RMAC_RMACDR, Value); - - if (idx > 0) { - /* MT7603, bit1 in byte0 shall always be b'1 for Multiple BSSID */ - if_addr[0] |= 0x2; - - switch (MacByte) { - case 0x1: /* choose bit[23:20]*/ - if_addr[2] = if_addr[2] & - MacMask; /* clear high 4 bits, */ - if_addr[2] = (if_addr[2] | (idx << 4)); - break; - - case 0x2: /* choose bit[31:28]*/ - if_addr[3] = if_addr[3] & - MacMask; /* clear high 4 bits, */ - if_addr[3] = (if_addr[3] | (idx << 4)); - break; - - case 0x3: /* choose bit[39:36]*/ - if_addr[4] = if_addr[4] & - MacMask; /* clear high 4 bits, */ - if_addr[4] = (if_addr[4] | (idx << 4)); - break; - - case 0x4: /* choose bit [47:44]*/ - if_addr[5] = if_addr[5] & - MacMask; /* clear high 4 bits, */ - if_addr[5] = (if_addr[5] | (idx << 4)); - break; - - default: /* choose bit[15:12]*/ - if_addr[1] = if_addr[1] & - MacMask; /* clear high 4 bits, */ - if_addr[1] = (if_addr[1] | (idx << 4)); - break; - } - } - } -} - -/* - * NOTE: 2015-April-2. - * this function is for MT7637/MT7615 and afterward chips - */ -VOID MtAsicSetMbssWdevIfAddrGen2(struct _RTMP_ADAPTER *pAd, INT idx, - UCHAR *if_addr, INT opmode) -{ - UCHAR zeroMac[6] = { 0 }; - UCHAR MacMask = 0; - - if (pAd->ApCfg.BssidNum <= 2) - MacMask = 0xef; - else if (pAd->ApCfg.BssidNum <= 4) - MacMask = 0xcf; - else if (pAd->ApCfg.BssidNum <= 8) - MacMask = 0x8f; - else if (pAd->ApCfg.BssidNum <= 16) - MacMask = 0x0f; - else - MacMask = 0x0f; - - if (idx > 0) { - if (NdisEqualMemory(zeroMac, pAd->ExtendMBssAddr[idx - 1], - MAC_ADDR_LEN)) { - COPY_MAC_ADDR(if_addr, pAd->CurrentAddress); - if_addr[0] |= 0x2; - /* default choose bit[31:28], if there is no assigned mac from profile. */ - if_addr[3] = - if_addr[3] & MacMask; /* clear high 4 bits, */ - if_addr[3] = (if_addr[3] | (idx << 4)); - COPY_MAC_ADDR(pAd->ExtendMBssAddr[idx - 1], if_addr); - } else - COPY_MAC_ADDR(if_addr, pAd->ExtendMBssAddr[idx - 1]); - - /* - * MT7615 and the chip afterward, - * the mac addr write to CR shall offload to BssInfoUpdate by EXT_MBSS tag - */ - /* MtAsicSetExtMbssMacByDriver(pAd, idx, wdev); */ - } else - COPY_MAC_ADDR(if_addr, pAd->CurrentAddress); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s-%s mbss_idx = %d, if_addr = %x %x %x %x %x %x\n", - __FILE__, __func__, idx, if_addr[0], if_addr[1], if_addr[2], - if_addr[3], if_addr[4], if_addr[5])); -} -#endif /*CONFIG_AP_SUPPORT*/ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -VOID mt_asic_pcie_aspm_dym_ctrl(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN fgL1Enable, BOOLEAN fgL0sEnable) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (!get_pcie_aspm_dym_ctrl_cap(pAd)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::retun since cap=0\n", __func__)); - return; - } - - if (ops->pcie_aspm_dym_ctrl) - ops->pcie_aspm_dym_ctrl(pAd, ucDbdcIdx, fgL1Enable, - fgL0sEnable); - else - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("For this chip, no specified dynamic aspm ctrl function!\n")); -} -#endif /* #ifdef PCIE_ASPM_DYM_CTRL_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/coex.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/coex.c deleted file mode 100644 index da0173fc16..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/coex.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/greenap.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/greenap.c deleted file mode 100644 index 39be5af555..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/greenap.c +++ /dev/null @@ -1,708 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - greenap.c - - Abstract: - Ralink Wireless driver green ap related functions - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" - -#ifdef GREENAP_SUPPORT -/* -* -*/ -VOID greenap_init(struct greenap_ctrl *greenap) -{ - greenap->cap = FALSE; - greenap->allow = FALSE; - RTMP_SPIN_LOCK(&greenap->lock); - greenap->suspend = 0; - RTMP_SPIN_UNLOCK(&greenap->lock); -} - -/* -* update greenap on/off immediately -*/ -static VOID greenap_update(RTMP_ADAPTER *pAd, BOOLEAN previous_greenap_active, - BOOLEAN greenap_enter, UINT8 band_idx) -{ - struct greenap_on_off_ctrl greenap_on_off = { 0 }; - - greenap_on_off.band_idx = band_idx; - - if (previous_greenap_active) { - if (greenap_enter) { - /* Do nothing */ - } else { - /* Exit GreenAP */ - RTMP_CHIP_DISABLE_GREENAP(pAd, &greenap_on_off); - } - } else { - if (greenap_enter) { - /* Enter GreenAP */ - RTMP_CHIP_ENABLE_GREENAP(pAd, &greenap_on_off); - } else { - /* Do nothing */ - } - } -} - -/* -* -*/ -VOID greenap_exit(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - struct greenap_ctrl *greenap) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__)); - RTMP_SPIN_LOCK(&greenap->lock); - greenap_update(pAd, IsHcGreenAPActiveByWdev(wdev), FALSE, - HcGetBandByWdev(wdev)); - RTMP_SPIN_UNLOCK(&greenap->lock); -} - -/* -* -*/ -VOID greenap_show(RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap) -{ - UINT32 value = 0; - UCHAR i = 0; - struct wifi_dev *wdev = NULL; - UCHAR band_idx = 0; - UCHAR amount_of_band = HcGetAmountOfBand(pAd); - - for (i = 0; i < WDEV_NUM_MAX; i++) { - wdev = pAd->wdev_list[i]; - - if (wdev == NULL) - continue; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tband(%d), wdev[%d], type(0x%x), up(%d)\n", - HcGetBandByWdev(wdev), i, wdev->wdev_type, - wdev->if_up_down_state)); - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tGREENAP::greenap_cap(%d), greenap_allow(%d), dbdc_mode(%d)\n", - greenap_get_capability(greenap), - greenap_get_allow_status(greenap), pAd->CommonCfg.dbdc_mode)); - - for (band_idx = 0; band_idx < amount_of_band; band_idx++) { - MAC_IO_READ32(pAd, - ((band_idx == 0) ? RMAC_RMCR : RMAC_RMCR_BAND_1), - &value); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tGREENAP::band_idx(%d), greenap_active(%d), rx_stream(0x%x), mode(0x%x)\n", - band_idx, IsHcGreenAPActiveByBand(pAd, band_idx), - ((band_idx == 0) ? (value >> 22) & 0xf : - (value >> 22) & 0xf), - ((value >> 20) & 0x3))); - } -} - -/* -* B/G mode -*/ -static inline BOOLEAN greenap_rule_1(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry) -{ - BOOLEAN enetr_greenap = TRUE; - - if ((pEntry->MaxHTPhyMode.field.MODE == MODE_CCK) || - (pEntry->MaxHTPhyMode.field.MODE == MODE_OFDM)) - enetr_greenap = TRUE; - else - enetr_greenap = FALSE; - -#ifdef TXBF_SUPPORT - - if (pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn == TRUE) - enetr_greenap = FALSE; - -#endif /* TXBF_SUPPORT */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, enetr_greenap(%d), B(%d), G(%d)\n", __func__, - enetr_greenap, - (pEntry->MaxHTPhyMode.field.MODE == MODE_CCK) ? TRUE : FALSE, - (pEntry->MaxHTPhyMode.field.MODE == MODE_OFDM) ? TRUE : - FALSE)); - return enetr_greenap; -} - -/* -* 1*1 HT & !eBF -*/ -static inline BOOLEAN greenap_rule_2(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry) -{ - BOOLEAN enetr_greenap = TRUE; - - if ((pEntry->MaxHTPhyMode.field.MODE == MODE_HTMIX) || - (pEntry->MaxHTPhyMode.field.MODE == MODE_HTGREENFIELD)) { - if (pEntry->SupportHTMCS <= ((1 << MCS_8) - 1)) { -#ifdef TXBF_SUPPORT - - if (pAd->CommonCfg.RegTransmitSetting.field.TxBF == - TRUE) { - if (pEntry->eTxBfEnCond == 0) - enetr_greenap = TRUE; - else - enetr_greenap = FALSE; - } else -#endif /* TXBF_SUPPORT */ - enetr_greenap = TRUE; - } else - enetr_greenap = FALSE; - -#ifdef TXBF_SUPPORT - - if (pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn == TRUE) - enetr_greenap = FALSE; - -#endif /* TXBF_SUPPORT */ - } else - enetr_greenap = FALSE; - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, enetr_greenap(%d), AP_e_i_BF(%d,%d), STA_eBF(%d)HT(%d)MSC(0x%x)\n", - __func__, enetr_greenap, -#ifdef TXBF_SUPPORT - pAd->CommonCfg.RegTransmitSetting.field.TxBF, - pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn, - pEntry->eTxBfEnCond, -#else - 0, 0, 0, -#endif /* TXBF_SUPPORT */ - ((pEntry->MaxHTPhyMode.field.MODE == MODE_HTMIX) || - (pEntry->MaxHTPhyMode.field.MODE == MODE_HTGREENFIELD)) ? - TRUE : - FALSE, - ((pEntry->MaxHTPhyMode.field.MODE == MODE_HTMIX) || - (pEntry->MaxHTPhyMode.field.MODE == MODE_HTGREENFIELD)) ? - pEntry->SupportHTMCS : - 0)); - return enetr_greenap; -} - -/* -* 1*1 VHT & !eBF -*/ -static inline BOOLEAN greenap_rule_3(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry) -{ - BOOLEAN enetr_greenap = TRUE; -#ifdef DOT11_VHT_AC - - if (pEntry->MaxHTPhyMode.field.MODE == MODE_VHT) { - if ((pEntry->SupportVHTMCS1SS != 0) && - (pEntry->SupportVHTMCS2SS == 0) && - (pEntry->SupportVHTMCS3SS == 0) && - (pEntry->SupportVHTMCS4SS == 0)) { -#ifdef TXBF_SUPPORT - - if (pAd->CommonCfg.RegTransmitSetting.field.TxBF == - TRUE) { - if (pEntry->eTxBfEnCond == 0) - enetr_greenap = TRUE; - else - enetr_greenap = FALSE; - } else -#endif /* TXBF_SUPPORT */ - enetr_greenap = TRUE; - - if ((pEntry->vht_cap_ie.vht_cap.ch_width == 1) || - (pEntry->vht_cap_ie.vht_cap.ch_width == 2)) - enetr_greenap = FALSE; - - } else - enetr_greenap = FALSE; - -#ifdef TXBF_SUPPORT - - if (pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn == TRUE) - enetr_greenap = FALSE; - -#endif /* TXBF_SUPPORT */ - } else - enetr_greenap = FALSE; - -#else - enetr_greenap = FALSE; -#endif /* DOT11_VHT_AC */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, enetr_greenap(%d), AP_e_i_BF(%d,%d), STA_eBF(%d)VHT(%d)MCS(0x%x,0x%x,0x%x,0x%x)\n", - __func__, enetr_greenap, -#ifdef TXBF_SUPPORT - pAd->CommonCfg.RegTransmitSetting.field.TxBF, - pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn, - pEntry->eTxBfEnCond, -#else - 0, 0, 0, -#endif /* TXBF_SUPPORT */ - (pEntry->MaxHTPhyMode.field.MODE == MODE_VHT) ? TRUE : FALSE, -#ifdef DOT11_VHT_AC - pEntry->SupportVHTMCS1SS, pEntry->SupportVHTMCS2SS, - pEntry->SupportVHTMCS3SS, pEntry->SupportVHTMCS4SS -#else - 0, 0, 0, 0 -#endif /* DOT11_VHT_AC */ - )); - return enetr_greenap; -} - -/* -* -*/ -static BOOLEAN greenap_rule_check(RTMP_ADAPTER *pAd, MAC_TABLE_ENTRY *pEntry) -{ - BOOLEAN enetr_greenap = FALSE; - - if (pEntry == NULL) - return FALSE; - - enetr_greenap |= greenap_rule_1(pAd, pEntry); - enetr_greenap |= greenap_rule_2(pAd, pEntry); - enetr_greenap |= greenap_rule_3(pAd, pEntry); - return enetr_greenap; -} - -/* -* -*/ -BOOLEAN greenap_check_when_if_down_up(RTMP_ADAPTER *pAd) -{ - BOOLEAN allow = FALSE; - UCHAR band_idx = 0; - UCHAR amount_of_band = HcGetAmountOfBand(pAd); - struct greenap_ctrl *greenap = NULL; - - greenap = &pAd->ApCfg.greenap; - - if (greenap == NULL) - return FALSE; - - if (greenap_get_capability(greenap)) { - RTMP_SPIN_LOCK(&greenap->lock); - - if (greenap_get_suspend_status(greenap)) { - RTMP_SPIN_UNLOCK(&greenap->lock); - return TRUE; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s\n", __func__)); - greenap_check_allow_status(pAd, greenap); - allow = greenap_get_allow_status(greenap); - - for (band_idx = 0; band_idx < amount_of_band; band_idx++) { - greenap_check_peer_connection_status( - pAd, band_idx, - IsHcGreenAPActiveByBand(pAd, band_idx), allow); - } - - RTMP_SPIN_UNLOCK(&greenap->lock); - } - - return TRUE; -} - -/* -* For existed connection and update GreenAP state -*/ -VOID greenap_check_peer_connection_status(RTMP_ADAPTER *pAd, UINT8 band_idx, - BOOLEAN previous_greenap_active, - BOOLEAN greenap_allow) -{ - BOOLEAN greenap_enter = TRUE; - UCHAR i = 0; - MAC_TABLE_ENTRY *pEntry = NULL; - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - pEntry = &pAd->MacTab.Content[i]; - - if ((IS_ENTRY_CLIENT(pEntry)) && - (pEntry->ConnectionType == CONNECTION_INFRA_STA) && - (HcGetBandByWdev(pEntry->wdev) == band_idx)) { - if (greenap_rule_check(pAd, pEntry)) - greenap_enter = TRUE; - else { - greenap_enter = FALSE; - break; - } - } else { - /* Do nothing and continue next pEntry */ - } - } - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::band_idx(%d), previous_greenap_active(%d), greenap_allow(%d), greenap_enter(%d)\n", - __func__, band_idx, previous_greenap_active, greenap_allow, - greenap_enter)); - greenap_update(pAd, previous_greenap_active, - (greenap_allow & greenap_enter), band_idx); -} - -/* -* -*/ -VOID greenap_check_peer_connection_at_link_up_down(RTMP_ADAPTER *pAd, - struct wifi_dev *wdev, - struct greenap_ctrl *greenap) -{ - UCHAR band_idx = HcGetBandByWdev(wdev); - BOOLEAN previous_greenap_active = IsHcGreenAPActiveByWdev(wdev); - BOOLEAN greenap_allow = greenap_get_allow_status(greenap); - - RTMP_SPIN_LOCK(&greenap->lock); - - if (greenap_get_suspend_status(greenap)) { - RTMP_SPIN_UNLOCK(&greenap->lock); - return; - } - - greenap_check_peer_connection_status( - pAd, band_idx, previous_greenap_active, greenap_allow); - RTMP_SPIN_UNLOCK(&greenap->lock); -} - -/* -* -*/ -BOOLEAN greenap_get_suspend_status(struct greenap_ctrl *greenap) -{ - return (greenap->suspend != 0) ? TRUE : FALSE; -} - -/* -* -*/ -VOID greenap_suspend(RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap, - UINT32 reason) -{ - UCHAR band_idx = 0; - UCHAR amount_of_band = HcGetAmountOfBand(pAd); - - if (!greenap_get_capability(greenap)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, green ap not enabled\n", __func__)); - return; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, reason(0x%x)\n", __func__, reason)); - RTMP_SPIN_LOCK(&greenap->lock); - greenap->suspend |= reason; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, greenap->suspend(0x%x)\n", __func__, greenap->suspend)); - - for (band_idx = 0; band_idx < amount_of_band; band_idx++) - greenap_update(pAd, IsHcGreenAPActiveByBand(pAd, band_idx), - FALSE, band_idx); - - RTMP_SPIN_UNLOCK(&greenap->lock); -} - -/* -* -*/ -VOID greenap_resume(RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap, - UINT32 reason) -{ - BOOLEAN allow = FALSE; - UCHAR band_idx = 0; - UCHAR amount_of_band = HcGetAmountOfBand(pAd); - - if (!greenap_get_capability(greenap)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, green ap not enabled\n", __func__)); - return; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, reason(0x%x)\n", __func__, reason)); - RTMP_SPIN_LOCK(&greenap->lock); - /* During scan, ifreface might be add or delete, check allow here again */ - greenap_check_allow_status(pAd, greenap); - allow = greenap_get_allow_status(greenap); - - /* Check all pEntry if meet GreenAP mode */ - for (band_idx = 0; band_idx < amount_of_band; band_idx++) { - greenap_check_peer_connection_status( - pAd, band_idx, IsHcGreenAPActiveByBand(pAd, band_idx), - allow); - } - - greenap->suspend &= ~reason; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, greenap->suspend(0x%x)\n", __func__, greenap->suspend)); - RTMP_SPIN_UNLOCK(&greenap->lock); -} - -/* -* -*/ -VOID greenap_check_allow_status(RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap) -{ - BOOLEAN ap_mode_if_up = FALSE; - BOOLEAN non_ap_mode_if_up = FALSE; - UCHAR i = 0; - struct wifi_dev *wdev = NULL; - - for (i = 0; i < WDEV_NUM_MAX; i++) { - wdev = pAd->wdev_list[i]; - - if (wdev == NULL) - continue; - - if ((wdev->wdev_type == WDEV_TYPE_AP) && - wdev->if_up_down_state) { - ap_mode_if_up = TRUE; - break; - } - } - - for (i = 0; i < WDEV_NUM_MAX; i++) { - wdev = pAd->wdev_list[i]; - - if (wdev == NULL) - continue; - - if ((wdev->wdev_type != WDEV_TYPE_AP) && - wdev->if_up_down_state) { - non_ap_mode_if_up = TRUE; - break; - } - } - - greenap->allow = (ap_mode_if_up & (!non_ap_mode_if_up)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ap_mode_if_up(%d), non_ap_mode_if_up(%d) --> greenap_allow(%d)\n", - ap_mode_if_up, non_ap_mode_if_up, - greenap_get_allow_status(greenap))); -} - -/* -* -*/ -BOOLEAN greenap_get_allow_status(struct greenap_ctrl *greenap) -{ - return greenap->allow; -} - -/* -* -*/ -VOID greenap_set_capability(struct greenap_ctrl *greenap, BOOLEAN greenap_cap) -{ - greenap->cap = greenap_cap; -} - -/* -* -*/ -BOOLEAN greenap_get_capability(struct greenap_ctrl *greenap) -{ - return greenap->cap; -} - -/* -* -*/ -VOID greenap_proc(RTMP_ADAPTER *pAd, struct greenap_ctrl *greenap, - BOOLEAN greenap_cap_on) -{ - BOOLEAN allow = FALSE; - UCHAR band_idx = 0; - UCHAR amount_of_band = HcGetAmountOfBand(pAd); - - RTMP_SPIN_LOCK(&greenap->lock); - - if (greenap_get_suspend_status(greenap)) { - RTMP_SPIN_UNLOCK(&greenap->lock); - return; - } - - if (!greenap_cap_on) { - greenap_set_capability(greenap, FALSE); - - for (band_idx = 0; band_idx < amount_of_band; band_idx++) - greenap_update(pAd, - IsHcGreenAPActiveByBand(pAd, band_idx), - FALSE, band_idx); - } else if (greenap_cap_on) { - greenap_set_capability(greenap, TRUE); - greenap_check_allow_status(pAd, greenap); - allow = greenap_get_allow_status(greenap); - - /* use case: No GreeAP on --> sta connected --> GreenAP on */ - for (band_idx = 0; band_idx < amount_of_band; band_idx++) { - greenap_check_peer_connection_status( - pAd, band_idx, - IsHcGreenAPActiveByBand(pAd, band_idx), allow); - } - } - - RTMP_SPIN_UNLOCK(&greenap->lock); -} - -/* -* -*/ -VOID enable_greenap(RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off) -{ - struct greenap_on_off_ctrl *greenap = - (struct greenap_on_off_ctrl *)greenap_on_off; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("band_idx(%d), enable_greenap\n", greenap->band_idx)); - HcSetGreenAPActiveByBand(pAd, greenap->band_idx, TRUE); - RTMP_GREENAP_ON_OFF_CTRL(pAd, greenap->band_idx, TRUE); -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - mt_asic_pcie_aspm_dym_ctrl(pAd, greenap->band_idx, TRUE, FALSE); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ -} - -/* -* -*/ -VOID disable_greenap(RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off) -{ - struct greenap_on_off_ctrl *greenap = - (struct greenap_on_off_ctrl *)greenap_on_off; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("band_idx(%d), disable_greenap\n", greenap->band_idx)); - HcSetGreenAPActiveByBand(pAd, greenap->band_idx, FALSE); -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - mt_asic_pcie_aspm_dym_ctrl(pAd, greenap->band_idx, FALSE, FALSE); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - RTMP_GREENAP_ON_OFF_CTRL(pAd, greenap->band_idx, FALSE); -} - -VOID EnableAPMIMOPSv2(RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off) -{ - struct greenap_on_off_ctrl *greenap = - (struct greenap_on_off_ctrl *)greenap_on_off; - - bbp_set_mmps(pAd, greenap->reduce_core_power); - rtmp_mac_set_mmps(pAd, greenap->reduce_core_power); - HcSetGreenAPActiveByBand(pAd, 0, TRUE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("EnableAPMIMOPSNew, 30xx changes the # of antenna to 1\n")); -} - -VOID DisableAPMIMOPSv2(RTMP_ADAPTER *pAd, - struct greenap_on_off_ctrl *greenap_on_off) -{ - bbp_set_mmps(pAd, FALSE); - rtmp_mac_set_mmps(pAd, FALSE); - HcSetGreenAPActiveByBand(pAd, 0, FALSE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("DisableAPMIMOPSNew, 30xx reserve only one antenna\n")); -} - -VOID EnableAPMIMOPSv1(IN RTMP_ADAPTER *pAd, - IN struct greenap_on_off_ctrl *greenap_on_off) -{ - ULONG TxPinCfg = 0x00050F0A; /*Gary 2007/08/09 0x050A0A*/ - struct wifi_dev *wdev = get_default_wdev(pAd); - - if (wdev->channel > 14) - TxPinCfg = 0x00050F05; - - TxPinCfg &= 0xFFFFFFF3; - TxPinCfg &= 0xFFFFF3FF; - HcSetGreenAPActiveByBand(pAd, 0, TRUE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Run with BW_20\n")); - /* Set BBP registers to BW20 */ - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - - /* RF Bandwidth related registers would be set in AsicSwitchChannel() */ - if (pAd->Antenna.field.RxPath > 1 || pAd->Antenna.field.TxPath > 1) { - /*Tx/Rx Stream*/ - bbp_set_txdac(pAd, 0); - bbp_set_rxpath(pAd, 1); - /* Need to check in RT chip */ - /*RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);*/ - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("EnableAPMIMOPS, 305x/28xx changes the # of antenna to 1\n")); -} - -VOID DisableAPMIMOPSv1(IN PRTMP_ADAPTER pAd, - IN struct greenap_on_off_ctrl *greenap_on_off) -{ - ULONG TxPinCfg = 0x00050F0A; /* Gary 2007/08/09 0x050A0A */ - struct wifi_dev *wdev = get_default_wdev(pAd); - UCHAR ext_cha = wlan_operate_get_ext_cha(wdev); - UCHAR ht_bw = wlan_config_get_ht_bw(wdev); - - if (wdev->channel > 14) - TxPinCfg = 0x00050F05; - - /* Turn off unused PA or LNA when only 1T or 1R*/ - if (pAd->Antenna.field.TxPath == 1) - TxPinCfg &= 0xFFFFFFF3; - - if (pAd->Antenna.field.RxPath == 1) - TxPinCfg &= 0xFFFFF3FF; - - HcSetGreenAPActiveByBand(pAd, 0, FALSE); - - if ((ht_bw == BW_40) && (wdev->channel != 14)) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Run with BW_40\n")); - - /* Set CentralChannel to work for BW40 */ - if (ext_cha == EXTCHA_ABOVE) { - ext_cha = EXTCHA_ABOVE; - } else if ((wdev->channel > 2) && (ext_cha == EXTCHA_BELOW)) { - ext_cha = EXTCHA_BELOW; - } - - wlan_operate_set_prim_ch(wdev, wdev->channel); - wlan_operate_set_ht_bw(wdev, ht_bw, ext_cha); - } - - /*Tx Stream*/ - if (WMODE_CAP_N(wdev->PhyMode) && (pAd->Antenna.field.TxPath == 2)) - bbp_set_txdac(pAd, 2); - else - bbp_set_txdac(pAd, 0); - - /*Rx Stream*/ - bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("DisableAPMIMOPS, 305x/28xx reserve only one antenna\n")); -} -#endif /* GREENAP_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/hw_init.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/hw_init.c deleted file mode 100644 index 207b08ace7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/hw_init.c +++ /dev/null @@ -1,429 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - hw_init.c -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "hw_init.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -/*Local function*/ - -#ifdef RTMP_MAC_PCI -static INT mt_hif_sys_pci_init(RTMP_ADAPTER *pAd) -{ - UINT32 mac_val; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - -#ifdef MT_MAC - if (IS_HIF_TYPE(pAd, HIF_MT)) { - mt_asic_init_txrx_ring(pAd); - if (ops->hif_set_pcie_read_params -#ifdef ERR_RECOVERY - && (IsErrRecoveryInIdleStat(pAd) == FALSE) -#endif /* ERR_RECOVERY*/ - ) - ops->hif_set_pcie_read_params(pAd); - } -#endif /* MT_MAC */ - HIF_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &mac_val); - - /* mac_val |= 0xb0; // bit 7/5~4 => 1 */ - if (IS_MT7637(pAd)) - mac_val = - 0x52001055; /* workaround PDMA issue for WHQA_00022606 */ - else if (IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd) || - IS_MT7663(pAd)) - mac_val = 0x10001870; - else - mac_val = 0x52000850; - - HIF_IO_WRITE32(pAd, MT_WPDMA_GLO_CFG, mac_val); - if (ops->dma_shdl_init) - ops->dma_shdl_init(pAd); - return NDIS_STATUS_SUCCESS; -} -#endif - -static INT mt_hif_sys_init(RTMP_ADAPTER *pAd, HIF_INFO_T *pHifInfo) -{ -#ifdef RTMP_MAC_PCI -#ifndef COMPOS_TESTMODE_WIN - - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - mt_hif_sys_pci_init(pAd); - } - -#endif -#endif /* RTMP_MAC_PCI */ - return NDIS_STATUS_SUCCESS; -} - -/*HW related init*/ - -INT32 WfHifHwInit(RTMP_ADAPTER *pAd, HIF_INFO_T *pHifInfo) -{ - INT32 ret = NDIS_STATUS_SUCCESS; -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - ret = mt_hif_sys_init(pAd, pHifInfo); - -#endif /* MT_MAC */ - return ret; -} - -static INT32 WfTopHwInit(RTMP_ADAPTER *pAd) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicTOPInit(pAd); - -#endif - return FALSE; -} - -static INT32 WfMcuHwInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; -#ifdef COMPOS_WIN - /* #elif defined (COMPOS_TESTMODE_WIN) */ -#else - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->prepare_fwdl_img) - ops->prepare_fwdl_img(pAd); - - ret = NICLoadRomPatch(pAd); - - if (ret != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: NICLoadRomPatch failed, Status[=0x%08x]\n", - __func__, ret)); - return NDIS_STATUS_FAILURE; - } - -#endif - { - UINT32 Value; -#ifdef WIFI_SPECTRUM_SUPPORT - /* Refer to profile setting to decide the sysram partition format */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Before NICLoadFirmware, check ICapMode = %d\n", - __func__, pAd->ICapMode)); - - if (pAd->ICapMode == 2) { /* Wifi-spectrum */ - if (IS_MT7615(pAd)) { - HW_IO_READ32(pAd, CONFG_COM1_REG3, &Value); - Value = Value | CONFG_COM1_REG3_FWOPMODE; - HW_IO_WRITE32(pAd, CONFG_COM1_REG3, Value); - } else if (IS_MT7622(pAd)) { - HW_IO_READ32(pAd, CONFG_COM2_REG3, &Value); - Value = Value | CONFG_COM2_REG3_FWOPMODE; - HW_IO_WRITE32(pAd, CONFG_COM2_REG3, Value); - } - } else -#endif /* WIFI_SPECTRUM_SUPPORT */ - { - if (IS_MT7615(pAd)) { - HW_IO_READ32(pAd, CONFG_COM1_REG3, &Value); - Value = Value & (~CONFG_COM1_REG3_FWOPMODE); - HW_IO_WRITE32(pAd, CONFG_COM1_REG3, Value); - } else if (IS_MT7622(pAd)) { - HW_IO_READ32(pAd, CONFG_COM2_REG3, &Value); - Value = Value & (~CONFG_COM2_REG3_FWOPMODE); - HW_IO_WRITE32(pAd, CONFG_COM2_REG3, Value); - } - } - } - ret = NICLoadFirmware(pAd); - - if (ret != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: NICLoadFirmware failed, Status[=0x%08x]\n", - __func__, ret)); - return NDIS_STATUS_FAILURE; - } - - /*After fw download should disalbe dma schedule bypass mode*/ -#ifdef DMA_SCH_SUPPORT -#if defined(COMPOS_TESTMODE_WIN) - /* fix build error for testmode, need to check where testmode disable dma bypass mode */ -#else - - if (AsicWaitPDMAIdle(pAd, 100, 1000) != TRUE) { - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - ret = NDIS_STATUS_FAILURE; - return ret; - } - } - - AsicDMASchedulerInit(pAd, DMA_SCH_LMAC); -#endif /* defined (COMPOS_TESTMODE_WIN) */ -#endif - return ret; -} - -static INT32 WfEPROMHwInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else - NICInitAsicFromEEPROM(pAd); -#endif - return ret; -} - -/*Common Part for externl*/ - -INT32 WfTopInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; - - if (WfTopHwInit(pAd) != TRUE) - ret = NDIS_STATUS_FAILURE; - - return ret; -} - -INT32 WfHifInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; - HIF_INFO_T hifInfo; - - os_zero_mem(&hifInfo, sizeof(HIF_INFO_T)); - ret = WfHifSysInit(pAd, &hifInfo); - - if (ret != NDIS_STATUS_SUCCESS) - goto err; - - WfHifHwInit(pAd, &hifInfo); - WLAN_HOOK_CALL(WLAN_HOOK_HIF_INIT, pAd, NULL); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--%s(), Success!\n", __func__)); - return 0; -err: - WfHifSysExit(pAd); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--%s(), Err! status=%d\n", __func__, ret)); - return ret; -} - -INT32 WfMcuInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; - - ret = WfMcuSysInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err; - - ret = WfMcuHwInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err; - - HWCtrlOpsReg(pAd); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--%s(), Success!\n", __func__)); - return ret; -err: - WfMcuSysExit(pAd); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--%s(), Err! status=%d\n", __func__, ret)); - return ret; -} - -INT32 WfMacInit(RTMP_ADAPTER *pAd) -{ - UINT32 ret = NDIS_STATUS_SUCCESS; -#if defined(COMPOS_TESTMODE_WIN) && defined(RTMP_SDIO_SUPPORT) - /* todo: This function cause 7637 FPGA SDIO load FW failed, need to check. */ - return ret; -#endif -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - ret = mt_nic_asic_init(pAd); - -#endif /* MT_MAC */ - /* Clear raw counters*/ -#if !defined(COMPOS_WIN) && !defined(COMPOS_TESTMODE_WIN) - NicResetRawCounters(pAd); -#endif - return ret; -} - -INT32 WfEPROMInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; - /* #if defined(COMPOS_WIN) || defined (COMPOS_TESTMODE_WIN) */ -#if defined(COMPOS_TESTMODE_WIN) -#else - ret = WfEPROMSysInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err; - - WfEPROMHwInit(pAd); - return ret; -err: - WfEPROMSysExit(pAd); -#endif - return ret; -} - -INT32 WfPhyInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else - NICInitBBP(pAd); -#endif - return ret; -} - -INT32 WfInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; - - ret = WfTopInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err0; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Top Init Done!\n")); - ret = WfHifInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err0; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Hif Init Done!\n")); - ret = WfMcuInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err1; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MCU Init Done!\n")); -#ifdef RLM_CAL_CACHE_SUPPORT - rlmCalCacheApply(pAd, pAd->rlmCalCache); -#endif /* RLM_CAL_CACHE_SUPPORT */ - /*Adjust eeprom + config => apply to HW*/ - ret = WfEPROMInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err2; - -#ifdef SINGLE_SKU_V2 - /* Load SKU table to Host Driver */ - RTMPSetSkuParam(pAd); -#if defined(MT_MAC) && defined(TXBF_SUPPORT) - /* Load BF Backoff table to Host Driver */ - RTMPSetBackOffParam(pAd); -#endif /* defined(MT_MAC) && defined(TXBF_SUPPORT) */ -#endif /* SINGLE_SKU_V2 */ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("EEPROM Init Done!\n")); - ret = WfMacInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err3; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MAC Init Done!\n")); - ret = WfPhyInit(pAd); - - if (ret != NDIS_STATUS_SUCCESS) - goto err3; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PHY Init Done!\n")); - return ret; -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -err3: -err2: -err1: -err0: -#else -err3: - WfEPROMSysExit(pAd); -err2: - WfMcuSysExit(pAd); -err1: - WfHifSysExit(pAd); -err0: - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): initial faild!! ret=%d\n", __func__, ret)); -#endif - return ret; -} - -/*SW related init*/ - -INT32 WfSysPreInit(RTMP_ADAPTER *pAd) -{ -#ifdef MT7615 - - if (IS_MT7615(pAd)) - mt7615_init(pAd); - -#endif /* MT7615 */ -#ifdef MT7622 - - if (IS_MT7622(pAd)) - mt7622_init(pAd); - -#endif /* MT7622 */ - - wifi_sup_list_register(pAd, WIFI_CAP_CHIP); - wifi_sup_list_register(pAd, WIFI_CAP_SEC); - wifi_sup_list_register(pAd, WIFI_CAP_FEATURE); - - return 0; -} - -INT32 WfSysPosExit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else - WfEPROMSysExit(pAd); - WfMcuSysExit(pAd); - WfHifSysExit(pAd); -#endif - return ret; -} - -INT32 WfSysCfgInit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; - return ret; -} - -INT32 WfSysCfgExit(RTMP_ADAPTER *pAd) -{ - INT32 ret = NDIS_STATUS_SUCCESS; - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/mt_gpio.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/mt_gpio.c deleted file mode 100644 index 9c881c987c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/hw_ctrl/mt_gpio.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_gpio.c -*/ - -#include "rt_config.h" - -static VOID GPIOMuxSelect(RTMP_ADAPTER *pAd, UINT32 GPIO) -{ - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - UINT32 Value; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - - switch (GPIO) { - case GPIO0: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO0_SEL_MASK; - Value |= GPIO0_SEL(GPIO0_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO1: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO1_SEL_MASK; - Value |= GPIO1_SEL(GPIO1_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO2: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO2_SEL_MASK; - Value |= GPIO2_SEL(GPIO2_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO3: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO3_SEL_MASK; - Value |= GPIO3_SEL(GPIO3_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO4: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO4_SEL_MASK; - Value |= GPIO4_SEL(GPIO4_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO5: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO5_SEL_MASK; - Value |= GPIO5_SEL(GPIO5_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO6: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO6_SEL_MASK; - Value |= GPIO6_SEL(GPIO6_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO7: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO7_SEL_MASK; - Value |= GPIO7_SEL(GPIO7_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO8: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL2) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL2); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO8_SEL_MASK; - Value |= GPIO8_SEL(GPIO8_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO9: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL2) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL2); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO9_SEL_MASK; - Value |= GPIO9_SEL(GPIO9_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO10: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL2) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL2); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO10_SEL_MASK; - Value |= GPIO10_SEL(GPIO10_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO11: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL2) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL2); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO11_SEL_MASK; - Value |= GPIO11_SEL(GPIO11_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO12: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL2) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL2); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO12_SEL_MASK; - Value |= GPIO12_SEL(GPIO12_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO13: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL2) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL2); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO13_SEL_MASK; - Value |= GPIO13_SEL(GPIO13_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO14: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL2) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL2); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO14_SEL_MASK; - Value |= GPIO14_SEL(GPIO14_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO15: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL2) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL2); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO15_SEL_MASK; - Value |= GPIO15_SEL(GPIO15_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - case GPIO16: - RemapBase = GET_REMAP_2_BASE(PINMUX_SEL3) << 19; - RemapOffset = GET_REMAP_2_OFFSET(PINMUX_SEL3); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - Value &= ~GPIO16_SEL_MASK; - Value |= GPIO16_SEL(GPIO16_SEL_VALUE); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, Value); - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("GPIO (%d) not support\n", GPIO)); - break; - } - - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); -} - -INT32 GPIODirectionInput(RTMP_ADAPTER *pAd, UINT32 GPIO) -{ - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - GPIOMuxSelect(pAd, GPIO); - RemapBase = GET_REMAP_2_BASE(GPIO_OE1_RESET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_OE1_RESET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - return 0; -} - -INT32 GPIODirectionOuput(RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value) -{ - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - GPIOMuxSelect(pAd, GPIO); - RemapBase = GET_REMAP_2_BASE(GPIO_OE1_SET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_OE1_SET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - - if (Value == OUTPUT_HIGH) { - RemapBase = GET_REMAP_2_BASE(GPIO_DOUT1_SET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_DOUT1_SET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - } else { - RemapBase = GET_REMAP_2_BASE(GPIO_DOUT1_RESET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_DOUT1_RESET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - } - - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - return 0; -} - -UINT32 GPIOGetValue(RTMP_ADAPTER *pAd, UINT32 GPIO) -{ - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - UINT32 Value; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(GPIO_DIN1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_DIN1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - - if (((Value & (1 << GPIO)) >> GPIO)) - return INPUT_HIGH; - else - return INPUT_LOW; -} - -VOID GPIOSetValue(RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value) -{ - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - - if (Value == OUTPUT_HIGH) { - RemapBase = GET_REMAP_2_BASE(GPIO_DOUT1_SET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_DOUT1_SET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - } else { - RemapBase = GET_REMAP_2_BASE(GPIO_DOUT1_RESET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_DOUT1_RESET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - } - - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); -} - -UINT32 GPIOGetMode(RTMP_ADAPTER *pAd, UINT32 GPIO) -{ - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - UINT32 Value; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - RemapBase = GET_REMAP_2_BASE(GPIO_OE1) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_OE1); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_READ32(pAd, 0x80000 + RemapOffset, &Value); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - - if (((Value & (1 << GPIO)) >> GPIO)) - return GPIO_OUTPUT; - else - return GPIO_INPUT; -} - -INT32 GPIOPullUp(RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value) -{ - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - - if (Value == PULL_UP) { - RemapBase = GET_REMAP_2_BASE(GPIO_PU1_SET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_PU1_SET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - } else { - RemapBase = GET_REMAP_2_BASE(GPIO_PU1_RESET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_PU1_RESET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - } - - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - return 0; -} - -INT32 GPIOPullDown(RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value) -{ - UINT32 RemapBase, RemapOffset; - UINT32 RestoreValue; - - RTMP_IO_READ32(pAd, MCU_PCIE_REMAP_2, &RestoreValue); - - if (Value == PULL_DOWN) { - RemapBase = GET_REMAP_2_BASE(GPIO_PD1_SET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_PD1_SET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - } else { - RemapBase = GET_REMAP_2_BASE(GPIO_PD1_RESET) << 19; - RemapOffset = GET_REMAP_2_OFFSET(GPIO_PD1_RESET); - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RemapBase); - RTMP_IO_WRITE32(pAd, 0x80000 + RemapOffset, (1 << GPIO)); - } - - RTMP_IO_WRITE32(pAd, MCU_PCIE_REMAP_2, RestoreValue); - return 0; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/chip_id.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/chip_id.h deleted file mode 100644 index 1aacfd8e78..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/chip_id.h +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - chip_id.h - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __CHIP_ID_H__ -#define __CHIP_ID_H__ - -#define NIC_PCI_VENDOR_ID 0x1814 -#define MTK_PCI_VENDOR_ID 0x14C3 -#define P18_PCI_VENDOR_ID 0x0E8D /* CONNAC S4 PCIe daughter board */ -#define MT7663_PCI_VENDOR_ID 0x14C3 /* CONNAC S4 PCIe daughter board */ - -#define NIC2860_PCI_DEVICE_ID 0x0601 -#define NIC2860_PCIe_DEVICE_ID 0x0681 -#define NIC2760_PCI_DEVICE_ID 0x0701 /* 1T/2R Cardbus ??? */ -#define NIC2790_PCIe_DEVICE_ID 0x0781 /* 1T/2R miniCard */ - -#define VEN_AWT_PCIe_DEVICE_ID 0x1059 -#define DLINK_PCI_VENDOR_ID 0x1186 -#define VEN_AWT_PCI_VENDOR_ID 0x1A3B - -#define EDIMAX_PCI_VENDOR_ID 0x1432 - -#define NIC3090_PCIe_DEVICE_ID 0x3090 /* 1T/1R miniCard */ -#define NIC3091_PCIe_DEVICE_ID 0x3091 /* 1T/2R miniCard */ -#define NIC3092_PCIe_DEVICE_ID 0x3092 /* 2T/2R miniCard */ -#define NIC3390_PCIe_DEVICE_ID 0x3390 /* 1T/1R miniCard */ - -#define NIC3062_PCI_DEVICE_ID 0x3062 /* 2T/2R miniCard */ -#define NIC3562_PCI_DEVICE_ID 0x3562 /* 2T/2R miniCard */ -#define NIC3060_PCI_DEVICE_ID 0x3060 /* 1T/1R miniCard */ - -#define NIC3592_PCIe_DEVICE_ID 0x3592 /* 2T/2R miniCard */ - -#define NIC3593_PCI_OR_PCIe_DEVICE_ID 0x3593 - -#define NIC5390_PCIe_DEVICE_ID 0x5390 -#define NIC539F_PCIe_DEVICE_ID 0x539F -#define NIC5392_PCIe_DEVICE_ID 0x5392 -#define NIC5360_PCI_DEVICE_ID 0x5360 -#define NIC5362_PCI_DEVICE_ID 0x5362 - -#define NIC5592_PCIe_DEVICE_ID 0x5592 - -#define NIC3290_PCIe_DEVICE_ID 0x3290 - -#define NIC6590_PCIe_DEVICE_ID 0x6590 -#define NIC7610_PCIe_DEVICE_ID 0x7610 -#define NIC7630_PCIe_DEVICE_ID 0x7630 -#define NIC7650_PCIe_DEVICE_ID 0x7650 -#define NIC7612_PCIe_DEVICE_ID 0x7612 -#define NIC7632_PCIe_DEVICE_ID 0x7632 -#define NIC7662_PCIe_DEVICE_ID 0x7662 - -#define NIC7601_PCIe_DEVICE_ID 0x7601 - -#define NIC8592_PCIe_DEVICE_ID 0x8592 - -#define NIC7603_PCIe_DEVICE_ID 0x7603 -#define NIC7615_PCIe_DEVICE_ID 0x7615 -#define NIC7611_PCIe_DEVICE_ID 0x7611 -#define NIC7616_PCIe_DEVICE_ID 0x7616 -#define NIC761A_PCIe_DEVICE_ID 0x761A - -#define NIC7637_PCIe_DEVICE_ID 0x7637 - -#define NICP18_PCIe_DEVICE_ID 0x3280 /* CONNAC S4 PCIe daughter board */ -#define NIC7663_PCIe_DEVICE_ID 0x7663 /* CONNAC S4 PCIe daughter board */ -#endif /* __CHIP_ID_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7615.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7615.h deleted file mode 100644 index 79d04214fe..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7615.h +++ /dev/null @@ -1,134 +0,0 @@ -#ifndef __MT7615_H__ -#define __MT7615_H__ - -#include "mcu/andes_core.h" -#include "phy/mt_rf.h" - -struct _RTMP_ADAPTER; -struct _RTMP_CHIP_DBG; - -#define MAX_RF_ID 127 -#define MAC_RF_BANK 7 - -#define MT7615_MT_WTBL_SIZE 128 -#define MT7615_MT_WMM_SIZE 4 -#define MT7615_PDA_PORT 0xf800 - -#define MT7615_CT_PARSE_LEN 72 - -#define MT7615_BIN_FILE_NAME "WIFI_RAM_CODE_MT7615.bin" -#define MT7615_ROM_PATCH_BIN_FILE_NAME "mt7615_patch_e3_hdr.bin" - -#define MT7615_ROM_PATCH_START_ADDRESS 0x80000 - -#ifdef RF_LOCKDOWN -#define COUNTRY_CODE_BYTE0_EEPROME_OFFSET 0x11C -#define COUNTRY_CODE_BYTE1_EEPROME_OFFSET 0x11D - -#define COUNTRY_REGION_2G_EEPROME_OFFSET 0x11E -#define COUNTRY_REGION_5G_EEPROME_OFFSET 0x11F -#define COUNTRY_REGION_VALIDATION_MASK BIT(7) -#define COUNTRY_REGION_VALIDATION_OFFSET 7 -#define COUNTRY_REGION_CONTENT_MASK BITS(0, 6) - -#define RF_LOCKDOWN_EEPROME_BLOCK_OFFSET 0x120 -#define RF_LOCKDOWN_EEPROME_COLUMN_OFFSET 0xC -#define RF_LOCKDOWN_EEPROME_BIT BIT(7) -#define RF_LOCKDOWN_EEPROME_BIT_OFFSET 7 -#define RF_VALIDATION_NUMBER 10 -#endif /* RF_LOCKDOWN */ - -#define EEPROM_DBDC_ANTENNA_CFG_OFFSET 0x12F -#define DBDC_BAND0_RX_MASK BITS(0, 1) -#define DBDC_BAND0_RX_OFFSET 0 -#define DBDC_BAND0_TX_MASK BITS(2, 3) -#define DBDC_BAND0_TX_OFFSET 2 -#define DBDC_BAND1_RX_MASK BITS(4, 5) -#define DBDC_BAND1_RX_OFFSET 4 -#define DBDC_BAND1_TX_MASK BITS(6, 7) -#define DBDC_BAND1_TX_OFFSET 6 - -void mt7615_init(struct _RTMP_ADAPTER *pAd); -void mt7615_get_tx_pwr_per_rate(struct _RTMP_ADAPTER *pAd); -void mt7615_get_tx_pwr_info(struct _RTMP_ADAPTER *pAd); -void mt7615_antenna_sel_ctl(struct _RTMP_ADAPTER *pAd); -void mt7615_pwrOn(struct _RTMP_ADAPTER *pAd); -void mt7615_calibration(struct _RTMP_ADAPTER *pAd, UCHAR channel); -void mt7615_tssi_compensation(struct _RTMP_ADAPTER *pAd, UCHAR channel); -VOID mt7615_chip_dbg_init(struct _RTMP_CHIP_DBG *dbg_ops); - -enum ENUM_MUBF_CAP_T { MUBF_OFF, MUBF_BFER, MUBF_BFEE, MUBF_ALL }; - -enum ENUM_BF_BACKOFF_TYPE_T { - BF_BACKOFF_4T = 4, - BF_BACKOFF_3T = 3, - BF_BACKOFF_2T = 2 -}; - -INT Mt7615AsicArchOpsInit(struct _RTMP_ADAPTER *pAd); - -#ifdef PRE_CAL_TRX_SET1_SUPPORT -enum { - GBAND = 0, - ABAND = 1, -}; - -void ShowDCOCData(struct _RTMP_ADAPTER *pAd, RXDCOC_RESULT_T RxDcocResult); -void ShowDPDData(struct _RTMP_ADAPTER *pAd, TXDPD_RESULT_T TxDPDResult); -void mt7615_apply_cal_data(struct _RTMP_ADAPTER *pAd, - struct _MT_SWITCH_CHANNEL_CFG SwChCfg); -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#if defined(PRE_CAL_TRX_SET1_SUPPORT) || defined(RLM_CAL_CACHE_SUPPORT) || \ - defined(PRE_CAL_TRX_SET2_SUPPORT) -/* RXDCOC */ -#ifdef RTMP_FLASH_SUPPORT -#define DCOC_FLASH_OFFSET 1024 -#else -#define DCOC_FLASH_OFFSET 0 -#endif - -extern UINT16 K_A20Freq[]; -extern UINT16 K_A40Freq[]; -extern UINT16 K_A80Freq[]; -extern UINT16 K_G20Freq[]; -extern UINT16 K_AllFreq[]; -extern UINT16 K_A20_SIZE; -extern UINT16 K_A40_SIZE; -extern UINT16 K_A80_SIZE; -extern UINT16 K_G20_SIZE; -extern UINT16 K_ALL_SIZE; - -extern UINT16 DPD_A20Freq[]; -extern UINT16 DPD_G20Freq[]; -extern UINT16 DPD_AllFreq[]; -extern UINT16 DPD_A20_SIZE; -extern UINT16 DPD_G20_SIZE; -extern UINT16 DPD_ALL_SIZE; - -/* TXDPD */ -#define DCOC_IMAGE_SIZE (K_ALL_SIZE * RXDCOC_SIZE) -#define TXDPD_IMAGE1_SIZE (DPD_A20_SIZE * TXDPD_SIZE) -#define TXDPD_IMAGE2_SIZE (DPD_G20_SIZE * TXDPD_SIZE) - -#define DCOC_OFFSET (DCOC_FLASH_OFFSET) -#define DPDPART1_OFFSET (DCOC_OFFSET + DCOC_IMAGE_SIZE) -#define DPDPART2_OFFSET (DCOC_OFFSET + DCOC_IMAGE_SIZE + TXDPD_IMAGE1_SIZE) -#define TXDPD_PART1_LIMIT DPD_A20_SIZE - -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) -/* Pre-Cal */ -#define PRECALPART_OFFSET (DPDPART1_OFFSET + DPD_ALL_SIZE * TXDPD_SIZE) -#define PRE_CAL_SIZE_ONE_CARD (16 * 1024) -#define PRE_CAL_SIZE_DUAL_CARD (12 * 1024) -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -#define PA_TRIM_OFFSET 0 -#define PA_TRIM_SIZE 16 - -#endif /* CAL_BIN_FILE_SUPPORT */ - -#endif /* __MT7615_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7615_cr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7615_cr.h deleted file mode 100644 index 4553f87e88..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7615_cr.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef __MT7615_CR_H__ -#define __MT7615_CR_H__ -/* - Please don't include this header outside of per chip scope -*/ - -#ifdef RT_BIG_ENDIAN -typedef union _WPDMA_GLO_CFG_STRUC { - struct { - UINT32 rx_2b_offset : 1; - UINT32 clk_gate_dis : 1; - UINT32 byte_swap : 1; - UINT32 omit_tx_info : 1; - UINT32 omit_rx_info : 1; - UINT32 rsv_26 : 1; - UINT32 force_tx_eof : 1; - UINT32 sw_rst : 1; - UINT32 err_det_th : 8; - UINT32 mi_depth : 3; - UINT32 fifo_little_endian : 1; - UINT32 multi_dma_en : 2; - UINT32 share_fifo_en : 1; - UINT32 Desc32BEn : 1; - UINT32 BigEndian : 1; - UINT32 EnTXWriteBackDDONE : 1; - UINT32 WPDMABurstSIZE : 2; - UINT32 RxDMABusy : 1; - UINT32 EnableRxDMA : 1; - UINT32 TxDMABusy : 1; - UINT32 EnableTxDMA : 1; - } MT7615_field; - struct { - UINT32 rx_2b_offset : 1; - UINT32 rsv_30 : 1; - UINT32 byte_swap : 1; - UINT32 omit_tx_info : 1; - UINT32 omit_rx_info : 1; - UINT32 first_token_only : 1; - UINT32 force_tx_eof : 1; - UINT32 sw_rst : 1; - UINT32 tx_bt_size_bit21 : 2; - UINT32 mi_depth_8_6 : 3; - UINT32 mi_depth_5_3 : 3; - UINT32 mi_depth_2_0 : 3; - UINT32 fifo_little_endian : 1; - UINT32 multi_dma_en : 2; - UINT32 tx_bt_size_bit0 : 1; - UINT32 dis_bt_size_align : 1; - UINT32 big_endian : 1; - UINT32 en_tx_wb_ddone : 1; - UINT32 rx_bt_size : 2; - UINT32 en_rx_dma_buzy : 1; - UINT32 en_rx_dma : 1; - UINT32 en_tx_dma_buzy : 1; - UINT32 en_tx_dma : 1; - } MT7615_E3_field; - UINT32 word; -} WPDMA_GLO_CFG_STRUC; -#else -typedef union _WPDMA_GLO_CFG_STRUC { - struct { - UINT32 EnableTxDMA : 1; - UINT32 TxDMABusy : 1; - UINT32 EnableRxDMA : 1; - UINT32 RxDMABusy : 1; - UINT32 WPDMABurstSIZE : 2; - UINT32 EnTXWriteBackDDONE : 1; - UINT32 BigEndian : 1; - UINT32 Desc32BEn : 1; - UINT32 share_fifo_en : 1; - UINT32 multi_dma_en : 2; - UINT32 fifo_little_endian : 1; - UINT32 mi_depth : 3; - UINT32 err_det_th : 8; - UINT32 sw_rst : 1; - UINT32 force_tx_eof : 1; - UINT32 rsv_26 : 1; - UINT32 omit_rx_info : 1; - UINT32 omit_tx_info : 1; - UINT32 byte_swap : 1; - UINT32 clk_gate_dis : 1; - UINT32 rx_2b_offset : 1; - } MT7615_field; - struct { - UINT32 en_tx_dma : 1; - UINT32 en_tx_dma_buzy : 1; - UINT32 en_rx_dma : 1; - UINT32 en_rx_dma_buzy : 1; - UINT32 rx_bt_size : 2; - UINT32 en_tx_wb_ddone : 1; - UINT32 big_endian : 1; - UINT32 dis_bt_size_align : 1; - UINT32 tx_bt_size_bit0 : 1; - UINT32 multi_dma_en : 2; - UINT32 fifo_little_endian : 1; - UINT32 mi_depth_2_0 : 3; - UINT32 mi_depth_5_3 : 3; - UINT32 mi_depth_8_6 : 3; - UINT32 tx_bt_size_bit21 : 2; - UINT32 sw_rst : 1; - UINT32 force_tx_eof : 1; - UINT32 first_token_only : 1; - UINT32 omit_rx_info : 1; - UINT32 omit_tx_info : 1; - UINT32 byte_swap : 1; - UINT32 rsv_30 : 1; - UINT32 rx_2b_offset : 1; - } MT7615_E3_field; - UINT32 word; -} WPDMA_GLO_CFG_STRUC; -#endif /* RT_BIG_ENDIAN */ - -/* - CR WPDMA_GLO_CFG[11:10] MULTI_DMA_EN definition -*/ -#define MULTI_DMA_EN_DISABLE 0 -#define MULTI_DMA_EN_FEATURE_1 1 -#define MULTI_DMA_EN_FEATURE_2 2 -#define MULTI_DMA_EN_FEATURE_2_PREFETCH 3 - -#endif /* __MT7615_CR_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7622.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7622.h deleted file mode 100644 index 9ccaff7ec4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7622.h +++ /dev/null @@ -1,356 +0,0 @@ -#ifndef __MT7622_H__ -#define __MT7622_H__ - -#include "mcu/andes_core.h" -#include "phy/mt_rf.h" - -struct _RTMP_ADAPTER; -struct _RTMP_CHIP_DBG; - -#define MAX_RF_ID 127 -#define MAC_RF_BANK 7 - -#define MT7622_MT_WTBL_SIZE 128 -#define MT7622_MT_WMM_SIZE 4 -#define MT7622_PDA_PORT 0xf800 - -#define MT7622_CT_PARSE_LEN 0 - -#define MT7622_RAM_BIN_FILE_NAME_E2 "WIFI_RAM_CODE_MT7622_E2.bin" - -#define MT7622_ROM_PATCH_BIN_FILE_NAME_E2 "mt7622_patch_e2_hdr.bin" - -#define MT7622_ROM_PATCH_START_ADDRESS 0x9C000 - -#ifdef RF_LOCKDOWN -#define COUNTRY_CODE_BYTE0_EEPROME_OFFSET 0x11 -#define COUNTRY_CODE_BYTE1_EEPROME_OFFSET 0x12 - -#define MT7622_COUNTRY_REGION_2G_EEPROME_OFFSET 0x13 -#define MT7622_COUNTRY_REGION_5G_EEPROME_OFFSET 0x14 -#define COUNTRY_REGION_VALIDATION_MASK BIT(7) -#define COUNTRY_REGION_VALIDATION_OFFSET 7 -#define COUNTRY_REGION_CONTENT_MASK BITS(0, 6) - -#define MT7622_RF_LOCKDOWN_EEPROME_BLOCK_OFFSET 0x10 -#define MT7622_RF_LOCKDOWN_EEPROME_COLUMN_OFFSET 0x00 -#define RF_LOCKDOWN_EEPROME_BIT BIT(7) -#define RF_LOCKDOWN_EEPROME_BIT_OFFSET 7 -#define RF_VALIDATION_NUMBER 10 -#endif /* RF_LOCKDOWN */ - -/* wilsonl */ -/* */ -/* Device ID & Vendor ID, these values should match EEPROM value */ -/* */ - -#define OF_WBSYS_NAME "mediatek,wbsys" -#define RTMP_MAC_CSR_ADDR 0x18000000 -#define RTMP_IRQ_NUM 244 -#define RTMP_MAC_CSR_LEN 0x100000 -#define RTMP_FLASH_BASE_ADDR 0xbc000000 /* wilsonl */ - -#define HIF_INTR_BASE 0x10000700 -#define HIF_INTR_VALUE 0x2 -#define HIF_REMAP_SIZE 0x10 - -#define EFUSE_ANTENNA_POLARITY_POS1 0x3C -#define EFUSE_ANTENNA_POLARITY_POS2 0x3D -#define EFUSE_ANTENNA_CONFIG_POS1 0x3E -#define EFUSE_ANTENNA_CONFIG_POS2 0x49 -#define EFUSE_ANTENNA_COEX_TYPE_POS 0x48 -#define EFUSE_ANTENNA_STREAMS_POS 0x42 -#define ANT_STREAM_OFFSET 0 -#define FEM_PWR_SAV_OFFSET 1 -#define PA_LNA_CFG_OFFSET 2 -#define COEX_TYPE_OFFSET 4 -#define SMART_ANT_OFFSET 6 -#define BT_PIP_OFFSET 7 -#define POLARITY_TRSW_N_OFFSET 0 -#define POLARITY_TRSW_P_OFFSET 1 -#define POLARITY_LNA_OFFSET 2 -#define POLARITY_PA_OFFSET 3 -#define SMART_ANT_POLARITY_OFFSET 4 -#define BT_PIP_POLARITY_OFFSET 5 -#define VLIN_LINEARITY_OFFSET 6 -#define SHARED_PIN_OFFSET 7 -#define GetTddMode(mode) ((mode & BITS(4, 5)) >> 4) -#define GetRxConcur(mode) ((mode & BITS(4, 5)) >> 4) -#define GetSharePinSupport(mode) ((mode & BIT(7)) >> 7) -#define GetPIPMode(mode) ((mode & BIT(7)) >> 7) -#define GetSmartAntMode(mode) ((mode & BIT(6)) >> 6) -#define GetGbandPaLna(mode) ((mode & BITS(2, 3)) >> 2) -#define GetFEMPowerSave(mode) ((mode & BIT(1)) >> 1) -#define GetStreams(mode) ((mode & BIT(0)) >> 0) -#define GetCoexMode(mode) ((mode & BITS(4, 5)) >> 4) -#define GetPIP(mode) ((mode & BIT(4)) >> 4) -#define GetCoex(mode) ((mode & BITS(0, 1)) >> 0) -#define GetType(mode) ((mode & BITS(2, 3)) >> 2) -#define GetSharedPin(mode) ((mode & BIT(3)) >> 3) -#define GetVLINPol(mode) ((mode & BIT(2)) >> 2) -#define GetPIPPol(mode) ((mode & BIT(1)) >> 1) -#define GetSAntpol(mode) ((mode & BIT(0)) >> 0) -#define GetPolPA(mode) ((mode & BIT(5)) >> 5) -#define GetPolLNA(mode) ((mode & BIT(4)) >> 4) -#define GetPolTRSWP(mode) ((mode & BIT(1)) >> 1) -#define GetPolTRSWN(mode) ((mode & BIT(0)) >> 0) - -#ifdef COEX_SUPPORT -#define COEX_TYPE_FDD 0 -#define COEX_TYPE_TDD_WITH_SWITCH 1 -#define COEX_TYPE_TDD_WITHOUT_SWITCH 2 -#define COEX_TYPE_RX_CONCURRENT 3 -#define CONFIG_IPA_ILNA 0 -#define CONFIG_IPA_ELNA 1 -#define CONFIG_EPA_ELNA 2 -#define CONFIG_EPA_ILNA 3 -#define CONFIG_4x4 0x44 -#define CONFIG_3x3 0x33 -#define CONFIG_2x2 0x22 -#define CONFIG_1x1 0x11 -#define USED_PIN_WF0_PAPE BIT(5) -#define USED_PIN_WF0_LNA_EN BIT(8) -#define USED_PIN_WF0_TRSW_P BIT(7) -#define USED_PIN_WF0_TRSW_N BIT(4) -#define USED_PIN_WF1_PAPE BIT(9) -#define USED_PIN_WF1_LNA_EN BIT(6) -#define USED_PIN_WF1_TRSW_P BIT(15) -#define USED_PIN_WF1_TRSW_N BIT(17) -#define USED_PIN_WF2_PAPE BIT(3) -#define USED_PIN_WF2_LNA_EN BIT(2) -#define USED_PIN_WF2_TRSW_P BIT(13) -#define USED_PIN_WF2_TRSW_N BIT(12) -#define USED_PIN_WF3_PAPE BIT(1) -#define USED_PIN_WF3_LNA_EN BIT(0) -#define USED_PIN_WF3_TRSW_P BIT(16) -#define USED_PIN_WF3_TRSW_N BIT(14) -#define USED_PIN_BTWIFI_SW_P BIT(18) -#define USED_PIN_BTWIFI_SW_N BIT(19) -#define USED_PIN_SANT0 BIT(20) -#define USED_PIN_SANT1 BIT(21) -#define USED_PIN_SANT2 BIT(22) -#define USED_PIN_SANT3 BIT(23) -#define USED_PIN_SANT4 BIT(24) -#define USED_PIN_SANT5 BIT(25) -#define USED_PIN_SANT6 BIT(26) -#define USED_PIN_SANT7 BIT(27) -#define USED_PIN_SANT8 BIT(28) -#define USED_PIN_SANT9 BIT(29) -#define USED_PIN_SANT10 BIT(30) -#define USED_PIN_SANT11 BIT(31) -#define USED_PIN_SANT \ - (USED_PIN_SANT0 | USED_PIN_SANT1 | USED_PIN_SANT2 | USED_PIN_SANT3 | \ - USED_PIN_SANT4 | USED_PIN_SANT5 | USED_PIN_SANT6 | USED_PIN_SANT7 | \ - USED_PIN_SANT8 | USED_PIN_SANT9 | USED_PIN_SANT10 | USED_PIN_SANT11) -#define USED_PIN_BTPIP0 BIT(18) -#define USED_PIN_BTPIP1 BIT(19) -#define USED_PIN_BTPIP2 BIT(20) -#define USED_PIN_BTPIP3 BIT(21) -#define USED_PIN_BTPIP4 BIT(22) -#define USED_PIN_BTPIP5 BIT(23) -#define USED_PIN_BTPIP6 BIT(24) -#define USED_PIN_BTPIP7 BIT(25) -#define USED_PIN_BT_PIP \ - (USED_PIN_BTPIP0 | USED_PIN_BTPIP1 | USED_PIN_BTPIP2 | \ - USED_PIN_BTPIP3 | USED_PIN_BTPIP4 | USED_PIN_BTPIP5 | \ - USED_PIN_BTPIP6 | USED_PIN_BTPIP7) -#define USED_PIN_TRSW_N (BIT(4) | BIT(17) | BIT(12) | BIT(14)) -#define USED_PIN_TRSW_P (BIT(7) | BIT(15) | BIT(13) | BIT(16)) -#define USED_PIN_LNA (BIT(8) | BIT(6) | BIT(2) | BIT(0)) -#define USED_PIN_EPA (BIT(5) | BIT(9) | BIT(3) | BIT(1)) -#define USED_PIN_BTWIFI_SW (USED_PIN_BTWIFI_SW_P | USED_PIN_BTWIFI_SW_N) -#define USED_PIN_EPA_ELNA_4x4 (USED_PIN_WF3_PAPE | USED_PIN_WF3_LNA_EN) -#define USED_PIN_EPA_ILNA_4x4 (USED_PIN_WF3_PAPE) -#define USED_PIN_IPA_ELNA_4x4 (USED_PIN_WF3_LNA_EN) -#define USED_PIN_EPA_ELNA_3x3 (USED_PIN_WF2_PAPE | USED_PIN_WF2_LNA_EN) -#define USED_PIN_EPA_ILNA_3x3 (USED_PIN_WF2_PAPE) -#define USED_PIN_IPA_ELNA_3x3 (USED_PIN_WF2_LNA_EN) -#define USED_PIN_EPA_ELNA_2x2 (USED_PIN_WF1_PAPE | USED_PIN_WF1_LNA_EN) -#define USED_PIN_EPA_ILNA_2x2 (USED_PIN_WF1_PAPE) -#define USED_PIN_IPA_ELNA_2x2 (USED_PIN_WF1_LNA_EN) -#define USED_PIN_EPA_ELNA_1x1 (USED_PIN_WF0_PAPE | USED_PIN_WF0_LNA_EN) -#define USED_PIN_EPA_ILNA_1x1 (USED_PIN_WF0_PAPE) -#define USED_PIN_IPA_ELNA_1x1 (USED_PIN_WF0_LNA_EN) -#define WF0_PAPE 0x5 -#define WF0_LNA_EN 0x4 -#define WF0_TRSW_P 0x2 -#define WF0_TRSW_N 0x3 -#define WF1_PAPE 0x9 -#define WF1_LNA_EN 0x8 -#define WF1_TRSW_P 0x6 -#define WF1_TRSW_N 0x7 -#define WF2_PAPE 0xD -#define WF2_LNA_EN 0xC -#define WF2_TRSW_P 0xA -#define WF2_TRSW_N 0xB -#define WF3_PAPE 0x11 -#define WF3_LNA_EN 0x10 -#define WF3_TRSW_P 0xE -#define WF3_TRSW_N 0xF -#define WF3_LNA_EN_POL 0x25 -#define WF2_LNA_EN_POL 0x24 -#define WF1_LNA_EN_POL 0x23 -#define WF0_LNA_EN_POL 0x22 -#define GPIO_BASE_ADDR 0x10211000 -#define PINMUX_FUCTION_ANTSEL 5 -typedef enum _ENUM_ANT_SEL_PIN_T { - ANT_SEL_0 = 0, - ANT_SEL_1, - ANT_SEL_2, - ANT_SEL_3, - ANT_SEL_4, - ANT_SEL_5, - ANT_SEL_6, - ANT_SEL_7, - ANT_SEL_8, - ANT_SEL_9, - ANT_SEL_10, - ANT_SEL_11, - ANT_SEL_12, - ANT_SEL_13, - ANT_SEL_14, - ANT_SEL_15, - ANT_SEL_16, - ANT_SEL_17, - ANT_SEL_18, - ANT_SEL_19, - ANT_SEL_20, - ANT_SEL_21, - ANT_SEL_22, - ANT_SEL_23, - ANT_SEL_24, - ANT_SEL_25, - ANT_SEL_26, - ANT_SEL_27, - ANT_SEL_28, - ANT_SEL_29, - ANT_SEL_PIN_NUM -} ENUM_ANT_SEL_PIN_T; -#define GPIO_GPIO_MODE1 (0x00000310) -#define GPIO21_MODE BITS(28, 31) /* ANTSEL29 */ -#define GPIO21_MODE_OFFSET 28 -#define GPIO20_MODE BITS(24, 27) /* ANTSEL28 */ -#define GPIO20_MODE_OFFSET 24 -#define GPIO19_MODE BITS(20, 23) /* ANTSEL27 */ -#define GPIO19_MODE_OFFSET 20 -#define GPIO18_MODE BITS(16, 19) /* ANTSEL26 */ -#define GPIO18_MODE_OFFSET 16 -#define GPIO76_MODE BITS(12, 15) /* ANTSEL15 */ -#define GPIO76_MODE_OFFSET 12 -#define GPIO75_MODE BITS(8, 11) /* ANTSEL14 */ -#define GPIO75_MODE_OFFSET 8 -#define GPIO74_MODE BITS(4, 7) /* ANTSEL13 */ -#define GPIO74_MODE_OFFSET 4 -#define GPIO73_MODE BITS(0, 3) /* ANTSEL12 */ -#define GPIO73_MODE_OFFSET 0 -#define GPIO_GPIO_MODE2 (0x00000320) -#define GPIO77_MODE BITS(28, 31) /* ANTSEL16 */ -#define GPIO77_MODE_OFFSET 28 -#define GPIO37_MODE BITS(24, 27) /* ANTSEL25 */ -#define GPIO37_MODE_OFFSET 24 -#define GPIO36_MODE BITS(20, 23) /* ANTSEL24 */ -#define GPIO36_MODE_OFFSET 20 -#define GPIO0_MODE BITS(16, 19) -#define GPIO0_MODE_OFFSET 16 -#define GPIO78_MODE BITS(12, 15) /* ANTSEL17 */ -#define GPIO78_MODE_OFFSET 12 -#define GPIO35_MODE BITS(8, 11) /* ANTSEL23 */ -#define GPIO35_MODE_OFFSET 8 -#define GPIO34_MODE BITS(4, 7) /* ANTSEL22 */ -#define GPIO34_MODE_OFFSET 4 -#define GPIO5_MODE BITS(0, 3) -#define GPIO5_MODE_OFFSET 0 -#define GPIO_GPIO_MODE8 (0x00000380) -#define GPIO97_MODE BITS(28, 31) /* ANTSEL6 */ -#define GPIO97_MODE_OFFSET 28 -#define GPIO96_MODE BITS(24, 27) /* ANTSEL5 */ -#define GPIO96_MODE_OFFSET 24 -#define GPIO95_MODE BITS(20, 23) /* ANTSEL4 */ -#define GPIO95_MODE_OFFSET 20 -#define GPIO42_MODE BITS(16, 19) -#define GPIO42_MODE_OFFSET 16 -#define GPIO_GPIO_MODE9 (0x00000390) -#define GPIO94_MODE BITS(28, 31) /* ANTSEL3 */ -#define GPIO94_MODE_OFFSET 28 -#define GPIO93_MODE BITS(24, 27) /* ANTSEL2 */ -#define GPIO93_MODE_OFFSET 24 -#define GPIO92_MODE BITS(20, 23) /* ANTSEL1 */ -#define GPIO92_MODE_OFFSET 20 -#define GPIO91_MODE BITS(16, 19) /* ANTSEL0 */ -#define GPIO91_MODE_OFFSET 16 -#define GPIO101_MODE BITS(12, 15) /* ANTSEL10 */ -#define GPIO101_MODE_OFFSET 12 -#define GPIO100_MODE BITS(8, 11) /* ANTSEL9 */ -#define GPIO100_MODE_OFFSET 8 -#define GPIO99_MODE BITS(4, 7) /* ANTSEL8 */ -#define GPIO99_MODE_OFFSET 4 -#define GPIO98_MODE BITS(0, 3) /* ANTSEL7 */ -#define GPIO98_MODE_OFFSET 0 -#define GPIO_GPIO_MODE10 (0x00000394) -#define GPIO82_MODE BITS(12, 15) /* ANTSEL21 */ -#define GPIO82_MODE_OFFSET 12 -#define GPIO81_MODE BITS(8, 11) /* ANTSEL20 */ -#define GPIO81_MODE_OFFSET 8 -#define GPIO80_MODE BITS(4, 7) /* ANTSEL19 */ -#define GPIO80_MODE_OFFSET 4 -#define GPIO79_MODE BITS(0, 3) /* ANTSEL18 */ -#define GPIO79_MODE_OFFSET 0 -void mt7622_antenna_sel_ctl(struct _RTMP_ADAPTER *pAd); -void mt7622_antenna_sel_cfg(struct _RTMP_ADAPTER *pAd); -UINT32 mt7622_antsel_get_used_pin(struct _RTMP_ADAPTER *pAd, UCHAR polCtrl, - UCHAR antCtrl, UCHAR wifiStreams); -UINT32 mt7622_gpio_get(UINT32 offset); -void mt7622_gpio_set(UINT32 offset, UINT32 gpioVal); -void mt7622_pin_mux_control_setup(struct _RTMP_ADAPTER *pAd, UCHAR polCtrl, - UCHAR antCtrl, UCHAR wifiStreams); -#endif - -void mt7622_init(struct _RTMP_ADAPTER *pAd); -void mt7622_get_tx_pwr_per_rate(struct _RTMP_ADAPTER *pAd); -void mt7622_get_tx_pwr_info(struct _RTMP_ADAPTER *pAd); -void mt7622_antenna_sel_ctl(struct _RTMP_ADAPTER *pAd); -void mt7622_pwrOn(struct _RTMP_ADAPTER *pAd); -void mt7622_calibration(struct _RTMP_ADAPTER *pAd, UCHAR channel); -void mt7622_tssi_compensation(struct _RTMP_ADAPTER *pAd, UCHAR channel); -VOID mt7622_chip_dbg_init(struct _RTMP_CHIP_DBG *dbg_ops); - -#ifdef MT7622_FPGA -INT mt7622_chk_top_default_cr_setting(struct _RTMP_ADAPTER *pAd); -INT mt7622_chk_hif_default_cr_setting(struct _RTMP_ADAPTER *pAd); -#endif /* MT7622_FPGA */ - -VOID mt7622_trigger_intr_to_mcu(BOOLEAN enable); - -INT Mt7622AsicArchOpsInit(struct _RTMP_ADAPTER *pAd); - -#ifdef ERR_RECOVERY -#define DUMMY_N9_HEART_BEAT \ - (MCU_CFG_BASE + 0x0300) /* N9 Heart beat, SW accumulate */ -#endif - -#ifdef CONFIG_PROPRIETARY_DRIVER -int rbus_tssi_set(struct _RTMP_ADAPTER *ad, UCHAR mode); -int rbus_pa_lna_set(struct _RTMP_ADAPTER *ad, UINT32 mode); -#endif /*CONFIG_PROPRIETARY_DRIVER*/ - -#ifdef PRE_CAL_MT7622_SUPPORT -#ifdef RTMP_FLASH_SUPPORT -#define CAL_FLASH_OFFSET 1024 -#else -#define CAL_FLASH_OFFSET 0 -#endif - -#define TXLPFG_FLASH_OFFSET (CAL_FLASH_OFFSET) -#define TXDCIQ_FLASH_OFFSET (CAL_FLASH_OFFSET + TXLPFG_CAL_SIZE) -#define TXDPD_FLASH_OFFSET (TXDCIQ_FLASH_OFFSET + TXDCIQ_CAL_SIZE) - -#define TXLPFG_CAL_SIZE (4 * sizeof(UINT32)) -#define TXDCIQ_CAL_SIZE (48 * sizeof(UINT32)) -#endif /*PRE_CAL_MT7622_SUPPORT*/ - -#ifdef CAL_BIN_FILE_SUPPORT -#define PA_TRIM_OFFSET 0 -#define PA_TRIM_SIZE 16 -#endif /* CAL_BIN_FILE_SUPPORT */ - -#endif /* __MT7622_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7622_cr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7622_cr.h deleted file mode 100644 index 3f0db3a45d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7622_cr.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef __MT7622_CR_H__ -#define __MT7622_CR_H__ -/* - Please don't include this header outside of per chip scope -*/ - -/* - CR HIF_SYS_SW_RST - this CR can't be accessd directly, needs remap. -*/ -#define HIF_REG_BASE 0x50000000 -#define MT_HIF_SYS_SW_RST (HIF_REG_BASE + 0x4034) -#define HIF_DATA_PATH_RESET_N (1 << 1) - -#define HIF_PDMA_IO_READ32(_A, _R, _pV) \ - do { \ - UINT32 restore_remap_addr; \ - HW_IO_READ32(_A, 0x2504, &restore_remap_addr); \ - \ - HW_IO_WRITE32(_A, 0x2504, HIF_REG_BASE); \ - HW_IO_READ32(_A, (0x80000 + ((UINT32)_R & 0xffff)), _pV); \ - \ - HW_IO_WRITE32(_A, 0x2504, restore_remap_addr); \ - } while (0) - -#define HIF_PDMA_IO_WRITE32(_A, _R, _pV) \ - do { \ - UINT32 restore_remap_addr; \ - \ - HW_IO_READ32(_A, 0x2504, &restore_remap_addr); \ - \ - HW_IO_WRITE32(_A, 0x2504, HIF_REG_BASE); \ - HW_IO_WRITE32(_A, (0x80000 + ((UINT32)_R & 0xffff)), _pV); \ - \ - HW_IO_WRITE32(_A, 0x2504, restore_remap_addr); \ - } while (0) - -#ifdef RT_BIG_ENDIAN -typedef union _WPDMA_GLO_CFG_STRUC { - struct { - UINT32 rx_2b_offset : 1; - UINT32 clk_gate_dis : 1; - UINT32 byte_swap : 1; - UINT32 omit_tx_info : 1; - UINT32 omit_rx_info : 1; - UINT32 first_token_only : 1; - UINT32 force_tx_eof : 1; - UINT32 sw_rst : 1; - UINT32 rsv0 : 2; - UINT32 mi_depth_rd_8_6 : 3; - UINT32 mi_depth_rd_5_3 : 3; - UINT32 mi_depth_rd_2_0 : 3; - UINT32 fifo_little_endian : 1; - UINT32 multi_dma_en : 2; - UINT32 fw_ring_bp_tx_sch : 1; - UINT32 Desc32BEn : 1; - UINT32 BigEndian : 1; - UINT32 EnTXWriteBackDDONE : 1; - UINT32 WPDMABurstSIZE : 2; - UINT32 RxDMABusy : 1; - UINT32 EnableRxDMA : 1; - UINT32 TxDMABusy : 1; - UINT32 EnableTxDMA : 1; - } MT7622_field; - UINT32 word; -} WPDMA_GLO_CFG_STRUC; -#else -typedef union _WPDMA_GLO_CFG_STRUC { - struct { - UINT32 EnableTxDMA : 1; - UINT32 TxDMABusy : 1; - UINT32 EnableRxDMA : 1; - UINT32 RxDMABusy : 1; - UINT32 WPDMABurstSIZE : 2; - UINT32 EnTXWriteBackDDONE : 1; - UINT32 BigEndian : 1; - UINT32 Desc32BEn : 1; - UINT32 fw_ring_bp_tx_sch : 1; - UINT32 multi_dma_en : 2; - UINT32 fifo_little_endian : 1; - UINT32 mi_depth_rd_2_0 : 3; - UINT32 mi_depth_rd_5_3 : 3; - UINT32 mi_depth_rd_8_6 : 3; - UINT32 rsv0 : 2; - UINT32 sw_rst : 1; - UINT32 force_tx_eof : 1; - UINT32 first_token_only : 1; - UINT32 omit_rx_info : 1; - UINT32 omit_tx_info : 1; - UINT32 byte_swap : 1; - UINT32 clk_gate_dis : 1; - UINT32 rx_2b_offset : 1; - } MT7622_field; - UINT32 word; -} WPDMA_GLO_CFG_STRUC; -#endif /* RT_BIG_ENDIAN */ - -/* - CR WPDMA_GLO_CFG[11:10] MULTI_DMA_EN definition -*/ -#define MULTI_DMA_EN_DISABLE 0 -#define MULTI_DMA_EN_FEATURE_1 1 -#define MULTI_DMA_EN_FEATURE_2 2 -#define MULTI_DMA_EN_FEATURE_2_PREFETCH 3 - -#endif /* __MT7622_CR_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7663_cr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7663_cr.h deleted file mode 100644 index edac239e7b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/mt7663_cr.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef __MT7663_CR_H__ -#define __MT7663_CR_H__ -/* - Please don't include this header outside of per chip scope -*/ - -/* - CR CONN_HIF_RST -*/ -#define MT_CONN_HIF_RST (MT_HIF_BASE + 0x0100) -#define CONN_HIF_LOGIC_RST_N (1 << 4) -#define DMASHDL_ALL_RST_N (1 << 5) -/* - CR CONN_HIF_BUSY_STATUS -*/ -#define MT_CONN_HIF_BUSY_STATUS (MT_HIF_BASE + 0x0138) -#define CONN_HIF_BUSY (1 << 31) - -#ifdef RT_BIG_ENDIAN -typedef union _WPDMA_GLO_CFG_STRUC { - struct { - UINT32 rx_2b_offset : 1; - UINT32 clk_gate_dis : 1; - UINT32 byte_swap : 1; - UINT32 omit_tx_info : 1; - UINT32 omit_rx_info : 1; - UINT32 pdma_addr_ext_en : 1; - UINT32 force_tx_eof : 1; - UINT32 rsv0 : 3; - UINT32 trx_pfet_arb_mi_depth : 3; - UINT32 trx_dfet_arb_mi_depth : 3; - UINT32 trx_pfet_dfet_mi_depth : 3; - UINT32 fifo_little_endian : 1; - UINT32 multi_dma_en : 2; - UINT32 fw_ring_bp_tx_sch : 1; - UINT32 Desc32BEn : 1; - UINT32 BigEndian : 1; - UINT32 EnTXWriteBackDDONE : 1; - UINT32 WPDMABurstSIZE : 2; - UINT32 RxDMABusy : 1; - UINT32 EnableRxDMA : 1; - UINT32 TxDMABusy : 1; - UINT32 EnableTxDMA : 1; - } MT7663_field; - UINT32 word; -} WPDMA_GLO_CFG_STRUC; -#else -typedef union _WPDMA_GLO_CFG_STRUC { - struct { - UINT32 EnableTxDMA : 1; - UINT32 TxDMABusy : 1; - UINT32 EnableRxDMA : 1; - UINT32 RxDMABusy : 1; - UINT32 WPDMABurstSIZE : 2; - UINT32 EnTXWriteBackDDONE : 1; - UINT32 BigEndian : 1; - UINT32 Desc32BEn : 1; - UINT32 fw_ring_bp_tx_sch : 1; - UINT32 multi_dma_en : 2; - UINT32 fifo_little_endian : 1; - UINT32 trx_pfet_dfet_mi_depth : 3; - UINT32 trx_dfet_arb_mi_depth : 3; - UINT32 trx_pfet_arb_mi_depth : 3; - UINT32 rsv0 : 3; - UINT32 force_tx_eof : 1; - UINT32 pdma_addr_ext_en : 1; - UINT32 omit_rx_info : 1; - UINT32 omit_tx_info : 1; - UINT32 byte_swap : 1; - UINT32 clk_gate_dis : 1; - UINT32 rx_2b_offset : 1; - } MT7663_field; - UINT32 word; -} WPDMA_GLO_CFG_STRUC; -#endif /* RT_BIG_ENDIAN */ - -/* - CR WPDMA_GLO_CFG[11:10] MULTI_DMA_EN definition -*/ -#define MULTI_DMA_EN_DISABLE 0 -#define MULTI_DMA_EN_FEATURE_1 1 -#define MULTI_DMA_EN_FEATURE_2 2 -#define MULTI_DMA_EN_FEATURE_2_PREFETCH 3 - -#endif /* __MT7663_CR_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/p18_cr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/p18_cr.h deleted file mode 100644 index 9bd41a974a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/chip/p18_cr.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef __P18_CR_H__ -#define __P18_CR_H__ -/* - Please don't include this header outside of per chip scope -*/ - -/* - CR CONN_HIF_RST -*/ -#define MT_CONN_HIF_RST (MT_HIF_BASE + 0x0100) -#define CONN_HIF_LOGIC_RST_N (1 << 4) -#define DMASHDL_ALL_RST_N (1 << 5) -/* - CR CONN_HIF_BUSY_STATUS -*/ -#define MT_CONN_HIF_BUSY_STATUS (MT_HIF_BASE + 0x0138) -#define CONN_HIF_BUSY (1 << 31) - -#ifdef RT_BIG_ENDIAN -typedef union _WPDMA_GLO_CFG_STRUC { - struct { - UINT32 rx_2b_offset : 1; - UINT32 clk_gate_dis : 1; - UINT32 byte_swap : 1; - UINT32 omit_tx_info : 1; - UINT32 omit_rx_info : 1; - UINT32 pdma_addr_ext_en : 1; - UINT32 force_tx_eof : 1; - UINT32 rsv0 : 3; - UINT32 trx_pfet_arb_mi_depth : 3; - UINT32 trx_dfet_arb_mi_depth : 3; - UINT32 trx_pfet_dfet_mi_depth : 3; - UINT32 fifo_little_endian : 1; - UINT32 multi_dma_en : 2; - UINT32 fw_ring_bp_tx_sch : 1; - UINT32 Desc32BEn : 1; - UINT32 BigEndian : 1; - UINT32 EnTXWriteBackDDONE : 1; - UINT32 WPDMABurstSIZE : 2; - UINT32 RxDMABusy : 1; - UINT32 EnableRxDMA : 1; - UINT32 TxDMABusy : 1; - UINT32 EnableTxDMA : 1; - } P18_field; - UINT32 word; -} WPDMA_GLO_CFG_STRUC; -#else -typedef union _WPDMA_GLO_CFG_STRUC { - struct { - UINT32 EnableTxDMA : 1; - UINT32 TxDMABusy : 1; - UINT32 EnableRxDMA : 1; - UINT32 RxDMABusy : 1; - UINT32 WPDMABurstSIZE : 2; - UINT32 EnTXWriteBackDDONE : 1; - UINT32 BigEndian : 1; - UINT32 Desc32BEn : 1; - UINT32 fw_ring_bp_tx_sch : 1; - UINT32 multi_dma_en : 2; - UINT32 fifo_little_endian : 1; - UINT32 trx_pfet_dfet_mi_depth : 3; - UINT32 trx_dfet_arb_mi_depth : 3; - UINT32 trx_pfet_arb_mi_depth : 3; - UINT32 rsv0 : 3; - UINT32 force_tx_eof : 1; - UINT32 pdma_addr_ext_en : 1; - UINT32 omit_rx_info : 1; - UINT32 omit_tx_info : 1; - UINT32 byte_swap : 1; - UINT32 clk_gate_dis : 1; - UINT32 rx_2b_offset : 1; - } P18_field; - UINT32 word; -} WPDMA_GLO_CFG_STRUC; -#endif /* RT_BIG_ENDIAN */ - -/* - CR WPDMA_GLO_CFG[11:10] MULTI_DMA_EN definition -*/ -#define MULTI_DMA_EN_DISABLE 0 -#define MULTI_DMA_EN_FEATURE_1 1 -#define MULTI_DMA_EN_FEATURE_2 2 -#define MULTI_DMA_EN_FEATURE_2_PREFETCH 3 - -#endif /* __P18_CR_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/debug.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/debug.h deleted file mode 100644 index 36a6b6ec54..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/debug.h +++ /dev/null @@ -1,165 +0,0 @@ -/**************************************************************************** - * Mediatek Inc. - * 5F., No.5, Taiyuan 1st St., Zhubei City, - * Hsinchu County 302, Taiwan, R.O.C. - * (c) Copyright 2014, Mediatek, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - debug.h - - Abstract: - All function prototypes and macro are provided from debug message. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - Name Date Modification logs - UnifyLOGTF 2014.07.11 Initial version - -***************************************************************************/ - -#ifndef __DEBUG_H__ -#define __DEBUG_H__ - -/* */ -/* Debug information verbosity: lower values indicate higher urgency */ -/* */ - -/* Debug Level */ -#define DBG_LVL_OFF 0 -#define DBG_LVL_ERROR 1 -#define DBG_LVL_WARN 2 -#define DBG_LVL_TRACE 3 -#define DBG_LVL_INFO 4 -#define DBG_LVL_LOUD 5 -#define DBG_LVL_NOISY 6 -#define DBG_LVL_MAX DBG_LVL_NOISY -#if !defined(EVENT_TRACING) -/* Debug Category */ -/* if change the definition of below category or update new category, please update cat_str and sub_cat_str in cmm_info.c */ -#define DBG_CAT_MISC 0 /* misc */ -#define DBG_CAT_INIT 1 /* initialization/shutdown */ -#define DBG_CAT_HW 2 /* MAC/BBP/RF/Chip */ -#define DBG_CAT_FW 3 /* FW related command, response, CR that FW care about */ -#define DBG_CAT_HIF 4 /* Host interface: usb/sdio/pcie/rbus */ -#define DBG_CAT_FPGA 5 /* FPGA Chip verify, DVT */ -#define DBG_CAT_TEST 6 /* ATE, QA, UT, FPGA?, TDT, SLT, WHQL, and other TEST */ -#define DBG_CAT_RA 7 /* Rate Adaption/Throughput related */ -#define DBG_CAT_AP 8 /* AP, MBSS, WDS */ -#define DBG_CAT_CLIENT 9 /* STA, ApClient, AdHoc, Mesh */ -#define DBG_CAT_TX 10 /* Tx data path */ -#define DBG_CAT_RX 11 /* Rx data path */ -#define DBG_CAT_CFG 12 /* ioctl/oid/profile/cfg80211/Registry */ -#define DBG_CAT_MLME \ - 13 /* 802.11 fundamental connection flow, auth, assoc, disconnect, etc */ -#define DBG_CAT_PROTO 14 /* protocol, ex. TDLS */ -#define DBG_CAT_SEC 15 /* security/key/WPS/WAPI/PMF/11i related*/ -#define DBG_CAT_PS 16 /* power saving/UAPSD */ -#define DBG_CAT_POWER 17 /* power Setting, Single Sku, Temperature comp, etc */ -#define DBG_CAT_COEX 18 /* BT, BT WiFi Coex, LTE, TVWS*/ -#define DBG_CAT_P2P 19 /* P2P, Miracast */ -#define DBG_CAT_TOKEN 20 -#define DBG_CAT_CMW 21 /* CMW Link Test related */ -#define DBG_CAT_IGMP 22 /* IGMP */ -#define DBG_CAT_RSV1 30 /* reserved index for code development */ -#define DBG_CAT_RSV2 31 /* reserved index for code development */ -#define DBG_CAT_MAX 31 -#define DBG_CAT_ALL DBG_CAT_MISC -#define DBG_CAT_EN_ALL_MASK 0xFFFFFFFFu -#endif - -/* Debug SubCategory */ -/* if change the definition of below subcategory or update new subcategory, please update cat_str and sub_cat_str in cmm_info.c */ - -#define DBG_SUBCAT_ALL DBG_SUBCAT_MISC - -#define DBG_SUBCAT_EN_ALL_MASK 0xFFFFFFFFu - -#define DBG_SUBCAT_MISC 0x00000001u /* misc for all category */ - -/* Sub-Category of DBG_CAT_HW */ -#define CATHW_SA 0x00000002u /* debug flag for smart antenna */ - -/* Sub-Category of DBG_CAT_HIF */ -#define CATHIF_PCI 0x00000002u -#define CATHIF_USB 0x00000004u -#define CATHIF_SDIO 0x00000008u - -/* Sub-Category of DBG_CAT_AP */ -#define CATAP_MBSS 0x00000002u -#define CATAP_WDS 0x00000004u - -/* Sub-Category of DBG_CAT_CLIENT */ -#define CATCLIENT_ADHOC 0x00000002u -#define CATCLIENT_APCLI 0x00000004u -#define CATCLIENT_MESH 0x00000008u - -/* Sub-Category of DBG_CAT_TX */ -#define CATTX_TMAC 0x00000002u /* debug flag for tmac info dump */ - -/* Sub-Category of DBG_CAT_TOKEN */ -#define TOKEN_INFO 0x00000002u -#define TOKEN_PROFILE 0x00000004u -#define TOKEN_TRACE 0x00000008u - -/* Sub-Category of DBG_CAT_PROTO */ -#define CATPROTO_ACM 0x00000002u -#define CATPROTO_BA 0x00000004u -#define CATPROTO_TDLS 0x00000008u -#define CATPROTO_WNM 0x00000010u -#define CATPROTO_IGMP 0x00000020u -#define CATPROTO_MAT 0x00000040u -#define CATPROTO_RRM 0x00000080u -#define CATPROTO_DFS 0x00000100u -#define CATPROTO_FT 0x00000200u -#define CATPROTO_SCAN 0x00000400u -#define CATPROTO_FTM 0x00000800u -#define CATPROTO_OCE 0x00001000u - -/* Sub-Category of DBG_CAT_SEC */ -#define CATSEC_KEY 0x00000002u -#define CATSEC_WPS 0x00000004u -#define CATSEC_WAPI 0x00000008u -#define CATSEC_PMF 0x00000010u -#define CATSEC_SAE 0x00000020u -#define CATSEC_SUITEB 0x00000040u -#define CATSEC_OWE 0x00000080u -#define CATSEC_ECC 0x00000100u - -/* Sub-Category of DBG_CAT_PS */ -#define CATPS_UAPSD 0x00000002u - -/*********************************************************************************** - * Debugging and printing related definitions and prototypes - ***********************************************************************************/ -#define PRINT_MAC(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] - -#ifdef DBG -extern int DebugLevel; -extern UINT32 DebugCategory; -extern UINT32 DebugSubCategory[DBG_LVL_MAX + 1][32]; - -#define MTWF_LOG(Category, SubCategory, Level, Fmt) \ - do { \ - if ((0x1 << Category) & (DebugCategory)) \ - if ((SubCategory) & \ - (DebugSubCategory[Level][Category])) \ - MTWF_PRINT Fmt; \ - } while (0) - -#else -#define MTWF_LOG(Category, SubCategory, Level, Fmt) -#endif - -void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen); -void hex_dump_with_lvl(char *str, unsigned char *pSrcBufVA, - unsigned int SrcBufLen, int dbglvl); -#endif /* __DEBUG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/link_list.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/link_list.h deleted file mode 100644 index 58e9aac7d4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/link_list.h +++ /dev/null @@ -1,177 +0,0 @@ - -#ifndef __LINK_LIST_H__ -#define __LINK_LIST_H__ - -typedef struct _RT_LIST_ENTRY { - struct _RT_LIST_ENTRY *pNext; -} RT_LIST_ENTRY; - -typedef struct _LIST_HEADER { - RT_LIST_ENTRY *pHead; - RT_LIST_ENTRY *pTail; - UCHAR size; -} LIST_HEADER, *PLIST_HEADER; - -static inline void initList(LIST_HEADER *pList) -{ - pList->pHead = pList->pTail = NULL; - pList->size = 0; - return; -} - -static inline void insertTailList(LIST_HEADER *pList, RT_LIST_ENTRY *pEntry) -{ - pEntry->pNext = NULL; - - if (pList->pTail) - pList->pTail->pNext = pEntry; - else - pList->pHead = pEntry; - - pList->pTail = pEntry; - pList->size++; - return; -} - -static inline RT_LIST_ENTRY *removeHeadList(LIST_HEADER *pList) -{ - RT_LIST_ENTRY *pNext; - RT_LIST_ENTRY *pEntry; - pEntry = pList->pHead; - - if (pList->pHead != NULL) { - pNext = pList->pHead->pNext; - pList->pHead = pNext; - - if (pNext == NULL) - pList->pTail = NULL; - - pList->size--; - } - - return pEntry; -} - -static inline int getListSize(LIST_HEADER *pList) -{ - return pList->size; -} - -static inline RT_LIST_ENTRY *delEntryList(LIST_HEADER *pList, - RT_LIST_ENTRY *pEntry) -{ - RT_LIST_ENTRY *pCurEntry; - RT_LIST_ENTRY *pPrvEntry; - - if (pList->pHead == NULL) - return NULL; - - if (pEntry == pList->pHead) { - pCurEntry = pList->pHead; - pList->pHead = pCurEntry->pNext; - - if (pList->pHead == NULL) - pList->pTail = NULL; - - pList->size--; - return pCurEntry; - } - - pPrvEntry = pList->pHead; - pCurEntry = pPrvEntry->pNext; - - while (pCurEntry != NULL) { - if (pEntry == pCurEntry) { - pPrvEntry->pNext = pCurEntry->pNext; - - if (pEntry == pList->pTail) - pList->pTail = pPrvEntry; - - pList->size--; - break; - } - - pPrvEntry = pCurEntry; - pCurEntry = pPrvEntry->pNext; - } - - return pCurEntry; -} - -typedef struct _DL_LIST { - struct _DL_LIST *Next; - struct _DL_LIST *Prev; -} DL_LIST, *PDL_LIST; - -static inline void DlListInit(struct _DL_LIST *List) -{ - List->Next = List; - List->Prev = List; -} - -static inline void DlListAdd(struct _DL_LIST *List, struct _DL_LIST *Item) -{ - Item->Next = List->Next; - Item->Prev = List; - List->Next->Prev = Item; - List->Next = Item; -} - -static inline void DlListAddTail(struct _DL_LIST *List, struct _DL_LIST *Item) -{ - DlListAdd(List->Prev, Item); -} - -static inline void DlListDel(struct _DL_LIST *Item) -{ - Item->Next->Prev = Item->Prev; - Item->Prev->Next = Item->Next; - Item->Next = NULL; - Item->Prev = NULL; -} - -static inline int DlListEmpty(struct _DL_LIST *List) -{ - return List->Next == List; -} - -static inline unsigned int DlListLen(struct _DL_LIST *List) -{ - struct _DL_LIST *Item; - unsigned int Count = 0; - - for (Item = List->Next; Item != List; Item = Item->Next) - Count++; - - return Count; -} - -#ifdef COMPOS_WIN - -#define DlListEntry(item, type, member) \ - ((type *)((char *)item - FIELD_OFFSET(type, member))) - -#else -#ifndef Offsetof -#define Offsetof(type, member) ((long)&((type *)0)->member) -#endif - -#define DlListEntry(item, type, member) \ - ((type *)((char *)item - offsetof(type, member))) -#endif - -#define DlListFirst(list, type, member) \ - (DlListEmpty((list)) ? NULL : DlListEntry((list)->Next, type, member)) - -#define DlListForEach(item, list, type, member) \ - for (item = DlListEntry((list)->Next, type, member); \ - &item->member != (list); \ - item = DlListEntry(item->member.Next, type, member)) - -#define DlListForEachSafe(item, n, list, type, member) \ - for (item = DlListEntry((list)->Next, type, member), \ - n = DlListEntry(item->member.Next, type, member); \ - &item->member != (list); \ - item = n, n = DlListEntry(n->member.Next, type, member)) - -#endif /* ___LINK_LIST_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/module.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/module.h deleted file mode 100644 index 712f299cb2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/module.h +++ /dev/null @@ -1,140 +0,0 @@ -#ifndef __GROUP_H__ -#define __GROUP_H__ - -/** - * @defgroup wifi_dev_system Wi-Fi Core Device System - * @authors shiang.tu jay.hung - */ - -/** - * @defgroup tx_rx_path Wi-Fi TX/RX - * @authors shiang.tu jay.hung hugo.lee leonardo.wu - */ - -/** - * @defgroup lp Low Power/AP Power Saving - * @authors eddy.tsai patrick.hsiao hanmin.hsu - */ - -/** - * @defgroup security Security - * @authors eddy.tsai - */ - -/** - * @defgroup mcc MCC - * @authors hanmin.hsu - */ - -/** - * @defgroup qa_ate QA/ATE - * @authors yuchi.wang - */ - -/** - * @defgroup tmr TMR - * @authors carter.chen - */ - -/** - * @defgroup ap AP feature - * @authors carter.chen - */ - -/** - * @defgroup led LED - * @authors woody.hung - */ - -/** - * @defgroup thermal_protect Thermal Protect - * @authors star.chang - */ - -/** - * @defgroup efuse - * @authors star.chang - */ - -/** - * @defgroup buffer_mode Buffer Mode - * @authors star.chang - */ - -/** - * @defgroup wmm WMM - * @authors eddy.tsai star.chang - */ - -/** - * @defgroup radio_mgt Radio Management - * @authors star.chang - */ - -/** - * @defgroup sku SKU - * @authors star.chang - */ - -/** - * @defgroup cr_io CR_IO - * @authors star.chang - */ - -/** - * @defgroup auto_rate Auto Rate - * @authors chungting.wu - */ - -/** - * @defgroup wtbl WTBL - * @authors hanmin.hsu - */ - -/** - * @defgroup bss_dev_sta_info BSS Info/Device Info/STA Record - * @authors jay.hung hanmin.hsu - */ - -/** - * @defgroup mcu_control MCU Control - * @authors jay.hung hugo.lee leonardo.wu - */ - -/** - * @defgroup hif HIF - * @authors jay.hung hugo.lee leonardo.wu - */ - -/** - * @defgroup dma_sch DMA scheduler - * @authors eddy.tsai - */ - -/** - * @defgroup phy Phy operation - * @authors - */ - -/** - * @defgroup pse PSE operation - * @authors - */ - -/** - * @defgroup others Others - * @authors - */ - -/** - * @defgroup embedded_ioctl Embedded IO Command - * @authors - * - */ - -/** - * @defgroup others Others - * @authors - */ - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/mt_os_util.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/mt_os_util.h deleted file mode 100644 index 2e3049c750..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/mt_os_util.h +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** - - Module Name: - mt_os_util.h - - Abstract: - All function prototypes are provided from UTIL modules. - - Note: - But can not use any OS key word and compile option here. - All functions are provided from UTIL modules. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - -***************************************************************************/ - -#ifndef __MT_OS_UTIL_H__ -#define __MT_OS_UTIL_H__ - -INT os_alloc_mem(VOID *pAd, UCHAR **mem, ULONG size); - -VOID os_free_mem(PVOID mem); - -VOID os_zero_mem(PVOID ptr, ULONG length); - -VOID os_move_mem(PVOID pDest, PVOID pSrc, ULONG length); - -VOID os_fill_mem(PVOID pBuf, ULONG Length, UCHAR Fill); - -INT os_cmp_mem(PVOID Destination, PVOID Source, ULONG Length); - -INT os_equal_mem(PVOID pBuf1, PVOID pBuf2, ULONG length); - -RTMP_OS_FD_EXT os_file_open(CHAR *pPath, INT32 flag, /* CreateDisposition */ - INT32 file_mode); - -INT os_file_close(RTMP_OS_FD_EXT osfd); - -VOID os_file_seek(RTMP_OS_FD_EXT osfd, INT32 offset); - -INT os_file_write(RTMP_OS_FD_EXT osfd, CHAR *pDataPtr, INT32 writeLen); - -INT os_file_read(RTMP_OS_FD_EXT osfd, CHAR *pDataPtr, INT32 readLen); - -VOID os_msec_delay(UINT msec); -VOID os_usec_delay(UINT usec); -VOID os_load_code_from_bin(void *pAd, unsigned char **image, char *bin_name, - UINT32 *code_len); -CHAR *os_str_chr(CHAR *str, INT32 character); -UINT32 os_str_spn(CHAR *str1, CHAR *str2); -CHAR *os_str_pbrk(CHAR *str1, CHAR *str2); -LONG os_str_tol(const CHAR *str, CHAR **endptr, INT32 base); -LONG os_str_toul(const CHAR *str, CHAR **endptr, INT32 base); -CHAR *os_str_str(const CHAR *str1, const CHAR *str2); - -INT os_usb_vendor_req(struct _RTMP_ADAPTER *pAd, UINT32 TransferFlags, - UCHAR RequestType, UCHAR Request, USHORT Value, - USHORT Index, PVOID TransferBuffer, - UINT32 TransferBufferLength); - -#if !defined(COMPOS_WIN) && !defined(COMPOS_TESTMODE_WIN) -VOID os_alloc_dma_buf(IN VOID *pHandler, IN ULONG Length, IN BOOLEAN Cached, - OUT VOID **VirtualAddress, - OUT OS_PHYSICAL_ADDRESS *phy_addr); - -VOID os_free_dma_buf(IN VOID *pHandler, IN ULONG Length, - IN PVOID VirtualAddress, - IN OS_PHYSICAL_ADDRESS PhysicalAddress); - -OS_PACKET -os_alloc_packet(IN VOID *pHandler, IN ULONG Length); - -VOID os_free_packet(IN VOID *pHandler, IN OS_PACKET *pPacket); - -VOID os_spin_lock_init(OS_LOCK *pLock); -VOID os_spin_lock_free(OS_LOCK *pLock); - -/*Lock for Passive Level*/ -VOID os_spin_lock(OS_LOCK *pLock); -VOID os_spin_unlock(OS_LOCK *pLock); -/*Lock for IRQ Level*/ -VOID os_spin_lock_irqsave(OS_LOCK *pLock); -VOID os_spin_unlock_irqrestore(OS_LOCK *pLock); - -VOID os_event_init(OS_EVENT *pEvent); -VOID os_event_wait(OS_EVENT *pEvent, UINT32 TimeOut); -VOID os_event_set(OS_EVENT *pEvent); -#endif /*#if !defined(COMPOS_WIN) && !defined(COMPOS_TESTMODE_WIN)*/ -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/wifi_sys_info.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/wifi_sys_info.h deleted file mode 100644 index 4b8bba7ac6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/common/wifi_sys_info.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wifi_sys_info.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __WIFI_SYS_INFO_H__ -#define __WIFI_SYS_INFO_H__ - -#include "common/link_list.h" -#include "wifi_sys_notify.h" -#include "mgmt/be_export.h" - -struct _RTMP_ADAPTER; -struct _MAC_TABLE_ENTRY; -struct _IE_lists; -struct _STA_TR_ENTRY; -struct _IE_lists; - -#ifdef APCLI_SUPPORT -struct _APCLI_STRUCT; -#endif - -#define WIFI_SYS_POLL_MAX 10 -#define WIFI_SYS_PILL_PERIOD 100 - -enum { - WSYS_NOTIFY_OPEN, - WSYS_NOTIFY_CLOSE, - WSYS_NOTIFY_CONNT_ACT, - WSYS_NOTIFY_DISCONNT_ACT, - WSYS_NOTIFY_LINKUP, - WSYS_NOTIFY_LINKDOWN, - WSYS_NOTIFY_STA_UPDATE, -}; - -enum { - WSYS_NOTIFY_PRIORITY_DEFAULT = 0, - WSYS_NOTIFY_PRIORITY_QM, - WSYS_NOTIFY_PRIORITY_MLME, -}; - -typedef struct _DEV_INFO_CTRL_T { - UINT8 OwnMacIdx; - UINT8 OwnMacAddr[MAC_ADDR_LEN]; - UINT8 BandIdx; - UINT8 Active; - UINT32 EnableFeature; - VOID *priv; - DL_LIST list; -} DEV_INFO_CTRL_T; - -typedef struct _STA_REC_CTRL_T { - UINT8 BssIndex; - UINT8 WlanIdx; - UINT32 ConnectionType; - UINT8 ConnectionState; - UINT32 EnableFeature; - UINT8 IsNewSTARec; - ASIC_SEC_INFO asic_sec_info; - VOID *priv; - DL_LIST list; -} STA_REC_CTRL_T; - -struct _tx_burst_cfg { - struct wifi_dev *wdev; - UINT8 prio; - UINT8 ac_type; - UINT16 txop_level; - UINT8 enable; -}; - -/*use for update bssinfo*/ -struct uapsd_config { - BOOLEAN uapsd_en; - UCHAR uapsd_trigger_ac; -}; - -extern UINT16 txop0; -extern UINT16 txop60; -extern UINT16 txop80; -extern UINT16 txopfe; - -#define TXOP_0 (txop0) -#define TXOP_30 (0x30) -#define TXOP_60 (txop60) -#define TXOP_80 (txop80) -#define TXOP_A0 (0xA0) -#define TXOP_C0 (0xC0) -#define TXOP_FE (txopfe) -#define TXOP_138 (0x138) -#define TXOP_177 (0x177) - -enum _tx_burst_prio { - PRIO_DEFAULT = 0, - PRIO_RDG, - PRIO_MULTI_CLIENT, - PRIO_2G_INFRA, - PRIO_MU_MIMO, - PRIO_PEAK_TP, - PRIO_APCLI_REPEATER, - PRIO_CCI, - PRIO_WMM, - MAX_PRIO_NUM -}; - -#define WDEV_BSS_STATE(__wdev) (__wdev->bss_info_argument.bss_state) - -typedef enum _BSSINFO_LINK_TO_OMAC_T { - HW_BSSID = 0, - EXTEND_MBSS, - WDS, - REPT -} BSSINFO_TYPE_T; - -typedef enum _BSSINFO_STATE_T { - BSS_INIT = 0, /* INIT state */ - BSS_INITED = 1, /* BSS Argument Link done */ - BSS_ACTIVE = 2, /* The original flag - Active */ - BSS_READY = 3 /* BssInfo updated to FW done and ready for beaconing */ -} BSSINFO_STATE_T; - -typedef struct _BSS_INFO_ARGUMENT_T { - BSSINFO_TYPE_T bssinfo_type; - BSSINFO_STATE_T bss_state; - UCHAR OwnMacIdx; - UINT8 ucBssIndex; - UINT8 Bssid[MAC_ADDR_LEN]; - UINT8 ucBcMcWlanIdx; - UINT8 ucPeerWlanIdx; - UINT32 NetworkType; - UINT32 u4ConnectionType; - UINT8 CipherSuit; - UINT8 WmmIdx; - UINT8 ucPhyMode; - UINT32 prio_bitmap; - UINT16 txop_level[MAX_PRIO_NUM]; - UINT32 u4BssInfoFeature; - CMD_BSSINFO_PM_T rBssInfoPm; - HTTRANSMIT_SETTING BcTransmit; - HTTRANSMIT_SETTING McTransmit; - UINT16 bcn_period; - UINT8 dtim_period; - struct freq_oper chan_oper; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - RA_COMMON_INFO_T ra_cfg; -#endif /*RACTRL_FW_OFFLOAD_SUPPORT*/ - VOID *priv; - DL_LIST list; -} BSS_INFO_ARGUMENT_T, *PBSS_INFO_ARGUMENT_T; - -struct WIFI_SYS_CTRL { - struct wifi_dev *wdev; - DEV_INFO_CTRL_T DevInfoCtrl; - STA_REC_CTRL_T StaRecCtrl; - BSS_INFO_ARGUMENT_T BssInfoCtrl; - VOID *priv; - BOOLEAN skip_set_txop; -}; - -typedef struct _WIFI_INFO_CLASS { - UINT32 Num; - DL_LIST Head; -} WIFI_INFO_CLASS_T; - -struct wsys_notify_info { - struct wifi_dev *wdev; - void *v; -}; - -/*for FW related information sync.*/ -typedef struct _WIFI_SYS_INFO { - WIFI_INFO_CLASS_T DevInfo; - WIFI_INFO_CLASS_T BssInfo; - WIFI_INFO_CLASS_T StaRec; - struct notify_head wsys_notify_head; - NDIS_SPIN_LOCK lock; -} WIFI_SYS_INFO_T; - -typedef struct _PEER_LINKUP_HWCTRL { -#ifdef TXBF_SUPPORT - struct _IE_lists ie_list; - BOOLEAN bMu; - BOOLEAN bETxBf; - BOOLEAN bITxBf; - BOOLEAN bMuTxBf; -#endif /*TXBF_SUPPORT*/ - BOOLEAN bRdgCap; -} PEER_LINKUP_HWCTRL; - -typedef struct _LINKUP_HWCTRL { -#ifdef TXBF_SUPPORT - BOOLEAN bMu; - BOOLEAN bETxBf; - BOOLEAN bITxBf; - BOOLEAN bMuTxBf; -#endif /*TXBF_SUPPORT*/ - BOOLEAN bRdgCap; -} LINKUP_HWCTRL; - -/*Export function*/ -VOID wifi_sys_reset(struct _WIFI_SYS_INFO *wsys); -VOID wifi_sys_init(struct _RTMP_ADAPTER *ad); -VOID wifi_sys_dump(struct _RTMP_ADAPTER *ad); -INT wifi_sys_update_devinfo(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - struct _DEV_INFO_CTRL_T *devinfo); -INT wifi_sys_update_bssinfo(struct _RTMP_ADAPTER *ad, struct wifi_dev *wdev, - BSS_INFO_ARGUMENT_T *bss); -INT wifi_sys_update_starec(struct _RTMP_ADAPTER *ad, - struct _STA_REC_CTRL_T *new); -INT wifi_sys_update_starec_info(struct _RTMP_ADAPTER *ad, - struct _STA_REC_CTRL_T *new); -INT register_wsys_notifier(struct _WIFI_SYS_INFO *wsys, - struct notify_entry *ne); -INT unregister_wsys_notifier(struct _WIFI_SYS_INFO *wsys, - struct notify_entry *ne); -struct _STA_REC_CTRL_T *get_starec_by_wcid(struct _RTMP_ADAPTER *ad, INT wcid); - -#ifdef CONFIG_AP_SUPPORT -#endif /*CONFIG_AP_SUPPORT*/ - -#ifdef APCLI_SUPPORT -#endif /*APCLI*/ - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT -VOID WifiSysRaInit(struct _RTMP_ADAPTER *pAd, struct _MAC_TABLE_ENTRY *pEntry); -VOID WifiSysUpdateRa(struct _RTMP_ADAPTER *pAd, struct _MAC_TABLE_ENTRY *pEntry, - struct _STAREC_AUTO_RATE_UPDATE_T *prParam); -#endif /*RACTRL_FW_OFFLOAD_SUPPORT*/ - -VOID WifiSysUpdatePortSecur(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry, - ASIC_SEC_INFO *asic_sec_info); -/*wifi system architecture layer api*/ -INT wifi_sys_open(struct wifi_dev *wdev); -INT wifi_sys_close(struct wifi_dev *wdev); -INT wifi_sys_conn_act(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT wifi_sys_disconn_act(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT wifi_sys_linkup(struct wifi_dev *wdev, struct _MAC_TABLE_ENTRY *entry); -INT wifi_sys_linkdown(struct wifi_dev *wdev); -VOID wifi_sys_ops_register(struct wifi_dev *wdev); -VOID wifi_sys_update_wds(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/eeprom/mt_tx_pwr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/eeprom/mt_tx_pwr.h deleted file mode 100644 index 159e51e625..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/eeprom/mt_tx_pwr.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_tx_pwr.h -*/ -#ifndef __MT_TX_PWR_H__ -#define __MT_TX_PWR_H__ - -#define BF_BACKOFF_CONTROL_REGISTER_SIZE 10 -#define POWER_UP_CATEGORY_RATE_NUM 7 - -struct MT_TX_PWR_CAP { -#define INTERNAL_PA 0 -#define EXTERNAL_PA 1 - UINT8 pa_type; -#define TSSI_TRIGGER_STAGE 0 -#define TSSI_COMP_STAGE 1 -#define TSSI_CAL_STAGE 2 - UINT8 tssi_stage; -#define TSSI_0_SLOPE_G_BAND_DEFAULT_VALUE 0x84 -#define TSSI_1_SLOPE_G_BAND_DEFAULT_VALUE 0x83 - UINT8 tssi_0_slope_g_band; - UINT8 tssi_1_slope_g_band; -#define TSSI_0_OFFSET_G_BAND_DEFAULT_VALUE 0x0A -#define TSSI_1_OFFSET_G_BAND_DEFAULT_VALUE 0x0B - UINT8 tssi_0_offset_g_band; - UINT8 tssi_1_offset_g_band; -#define TX_TARGET_PWR_DEFAULT_VALUE 0x26 - CHAR tx_0_target_pwr_g_band; - CHAR tx_1_target_pwr_g_band; - CHAR tx_0_chl_pwr_delta_g_band[3]; - CHAR tx_1_chl_pwr_delta_g_band[3]; - CHAR delta_tx_pwr_bw40_g_band; - - CHAR tx_pwr_cck_1_2; - CHAR tx_pwr_cck_5_11; - CHAR tx_pwr_g_band_ofdm_6_9; - CHAR tx_pwr_g_band_ofdm_12_18; - CHAR tx_pwr_g_band_ofdm_24_36; - CHAR tx_pwr_g_band_ofdm_48; - CHAR tx_pwr_g_band_ofdm_54; - CHAR tx_pwr_ht_bpsk_mcs_0_8; - CHAR tx_pwr_ht_bpsk_mcs_32; - CHAR tx_pwr_ht_qpsk_mcs_1_2_9_10; - CHAR tx_pwr_ht_16qam_mcs_3_4_11_12; - CHAR tx_pwr_ht_64qam_mcs_5_13; - CHAR tx_pwr_ht_64qam_mcs_6_14; - CHAR tx_pwr_ht_64qam_mcs_7_15; -}; - -typedef enum _POWER_ACTION_CATEGORY { - SKU_FEATURE_CTRL = 0x0, - PERCENTAGE_FEATURE_CTRL = 0x1, - PERCENTAGE_DROP_CTRL = 0x2, - BF_POWER_BACKOFF_FEATURE_CTRL = 0x3, - BF_TX_POWER_BACK_OFF = 0x4, - RF_TXANT_CTRL = 0x5, - ATEMODE_CTRL = 0x6, - TX_POWER_SHOW_INFO = 0x7, - TPC_FEATURE_CTRL = 0x8, - MU_TX_POWER_CTRL = 0x9, - BF_NDPA_TXD_CTRL = 0xa, - TSSI_WORKAROUND = 0xb, - THERMAL_MANUAL_CTRL = 0xc, - THERMAL_COMPENSATION_CTRL = 0xd, - TX_RATE_POWER_CTRL = 0xe, - TXPOWER_UP_TABLE_CTRL = 0xf, - TX_POWER_SET_TARGET_POWER = 0x10, - TX_POWER_GET_TARGET_POWER = 0x11, - ALLTXPOWER_MANUAL_CTRL = 0x12, - POWER_ACTION_NUM -} POWER_ACTION_CATEGORY, - *P_POWER_ACTION_CATEGORY; - -enum TSSI_ACTION_CATEGORY { - EPA_STATUS = 0, - TSSI_TRACKING_ENABLE = 1, - FCBW_ENABLE = 2, - TSSI_COMP_BACKUP = 3, - TSSI_COMP_CONFIG = 4 -}; - -typedef enum _POWER_INFO_CATEGORY { - TXPOWER_BASIC_INFO = 0, - THERMAL_SENSOR_BASIC_INFO, - TXPOWER_BACKUP_TABLE_INFO, - TXPOWER_THERMAL_COMP_TABLE_INFO, - TXPOWER_TXV_BBP_PER_PACKET_INFO, - POWER_INFO_NUM -} POWER_INFO_CATEGORY, - *P_POWER_INFO_CATEGORY; - -typedef enum _POWER_EVENT_CATEGORY { - TXPOWER_EVENT_SHOW_INFO = 0x0, - TXPOWER_EVENT_UPDATE_COMPENSATE_TABLE = 0x1, - TXPOWER_EVENT_UPDATE_EPA_STATUS = 0x2, - TXPOWER_EVENT_THERMAL_SENSOR_SHOW_INFO = 0x3, - TXPOWER_EVENT_POWER_BACKUP_TABLE_SHOW_INFO = 0x4, - TXPOWER_EVENT_THERMAL_COMPENSATE_TABLE_SHOW_INFO = 0x6, - TXPOWER_EVENT_TXV_BBP_POWER_SHOW_INFO = 0x7, - POWER_EVENT_NUM -} POWER_EVENT_CATEGORY, - *P_POWER_EVENT_CATEGORY; - -typedef enum _BF_BACKOFF_MODE { - BF_BACKOFF_1T_MODE = 1, - BF_BACKOFF_2T_MODE = 2, - BF_BACKOFF_3T_MODE = 3, - BF_BACKOFF_4T_MODE = 4, -} BF_BACKOFF_MODE, - *P_BF_BACKOFF_MODE; - -typedef enum _POWER_BOOST_TABLE_CATEGORY { - POWER_UP_CATE_CCK_OFDM = 0, - POWER_UP_CATE_HT20, - POWER_UP_CATE_HT40, - POWER_UP_CATE_VHT20, - POWER_UP_CATE_VHT40, - POWER_UP_CATE_VHT80, - POWER_UP_CATE_VHT160, - POWER_UP_CATE_NUM -} POWER_BOOST_TABLE_CATEGORY, - *P_POWER_BOOST_TABLE_CATEGORY; - -typedef enum _POWER_RATE_POWER_CCK_CATEGORY { - RATE_POWER_CCK_1M2M = 0, - RATE_POWER_CCK_5M11M, - RATE_POWER_CCK_NUM -} POWER_RATE_POWER_CCK_CATEGORY, - *P_POWER_RATE_POWER_CCK_CATEGORY; - -typedef enum _POWER_RATE_POWER_OFDM_CATEGORY { - RATE_POWER_OFDM_6M9M = 0, - RATE_POWER_OFDM_12M18M, - RATE_POWER_OFDM_24M36M, - RATE_POWER_OFDM_48M, - RATE_POWER_OFDM_54M, - RATE_POWER_OFDM_NUM -} POWER_RATE_POWER_OFDM_CATEGORY, - *P_POWER_RATE_POWER_OFDM_CATEGORY; - -typedef enum _POWER_RATE_POWER_HT20_CATEGORY { - RATE_POWER_HT20_MCS0 = 0, - RATE_POWER_HT20_MCS32, - RATE_POWER_HT20_MCS12, - RATE_POWER_HT20_MCS34, - RATE_POWER_HT20_MCS5, - RATE_POWER_HT20_MCS6, - RATE_POWER_HT20_MCS7, - RATE_POWER_HT20_NUM -} POWER_RATE_POWER_HT20_CATEGORY, - *P_POWER_RATE_POWER_HT20_CATEGORY; - -typedef enum _POWER_RATE_POWER_HT40_CATEGORY { - RATE_POWER_HT40_MCS0 = 0, - RATE_POWER_HT40_MCS32, - RATE_POWER_HT40_MCS12, - RATE_POWER_HT40_MCS34, - RATE_POWER_HT40_MCS5, - RATE_POWER_HT40_MCS6, - RATE_POWER_HT40_MCS7, - RATE_POWER_HT40_NUM -} POWER_RATE_POWER_HT40_CATEGORY, - *P_POWER_RATE_POWER_HT40_CATEGORY; - -typedef enum _POWER_RATE_POWER_VHT20_CATEGORY { - RATE_POWER_VHT20_MCS0 = 0, - RATE_POWER_VHT20_MCS12, - RATE_POWER_VHT20_MCS34, - RATE_POWER_VHT20_MCS56, - RATE_POWER_VHT20_MCS7, - RATE_POWER_VHT20_MCS8, - RATE_POWER_VHT20_MCS9, - RATE_POWER_VHT20_NUM -} POWER_RATE_POWER_VHT20_CATEGORY, - *P_POWER_RATE_POWER_VHT20_CATEGORY; - -typedef enum _POWER_RATE_POWER_VHT40_CATEGORY { - RATE_POWER_VHT40_MCS0 = 0, - RATE_POWER_VHT40_MCS12, - RATE_POWER_VHT40_MCS34, - RATE_POWER_VHT40_MCS56, - RATE_POWER_VHT40_MCS7, - RATE_POWER_VHT40_MCS8, - RATE_POWER_VHT40_MCS9, - RATE_POWER_VHT40_NUM -} POWER_RATE_POWER_VHT40_CATEGORY, - *P_POWER_RATE_POWER_VHT40_CATEGORY; - -typedef enum _POWER_RATE_POWER_VHT80_CATEGORY { - RATE_POWER_VHT80_MCS0 = 0, - RATE_POWER_VHT80_MCS12, - RATE_POWER_VHT80_MCS34, - RATE_POWER_VHT80_MCS56, - RATE_POWER_VHT80_MCS7, - RATE_POWER_VHT80_MCS8, - RATE_POWER_VHT80_MCS9, - RATE_POWER_VHT80_NUM -} POWER_RATE_POWER_VHT80_CATEGORY, - *P_POWER_RATE_POWER_VHT80_CATEGORY; - -typedef enum _POWER_RATE_POWER_VHT160_CATEGORY { - RATE_POWER_VHT160_MCS0 = 0, - RATE_POWER_VHT160_MCS12, - RATE_POWER_VHT160_MCS34, - RATE_POWER_VHT160_MCS56, - RATE_POWER_VHT160_MCS7, - RATE_POWER_VHT160_MCS8, - RATE_POWER_VHT160_MCS9, - RATE_POWER_VHT160_NUM -} POWER_RATE_POWER_VHT160_CATEGORY, - *P_POWER_RATE_POWER_VHT160_CATEGORY; - -typedef enum _POWER_RATE_POWER_BW_CATEGORY { - RATE_POWER_BW20 = 0, - RATE_POWER_BW40, - RATE_POWER_BW80, - RATE_POWER_BW160, - RATE_POWER_BW_NUM -} POWER_RATE_POWER_BW_CATEGORY, - *P_POWER_RATE_POWER_BW_CATEGORY; - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hif/hif.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hif/hif.h deleted file mode 100644 index 06e6b850e3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hif/hif.h +++ /dev/null @@ -1,56 +0,0 @@ - -#ifndef __HIF_H__ -#define __HIF_H__ - -#ifdef MT_MAC -#ifdef RTMP_MAC_PCI -#include "hif/mt_hif_pci.h" -#include "mac/mac_mt/mt_mac_pci.h" -#endif /* RTMP_MAC_PCI */ - -#endif /* MT_MAC */ - -enum { - HIF_TX_IDX0, - HIF_TX_IDX1, - HIF_TX_IDX2, - HIF_TX_IDX3, - HIF_TX_IDX4, - HIF_TX_IDX5, - HIF_TX_IDX6, - HIF_TX_IDX7, - HIF_TX_IDX8, - HIF_TX_IDX9, - HIF_TX_IDX10, - HIF_TX_IDX11, - HIF_TX_IDX12, - HIF_TX_IDX13, - HIF_TX_IDX14, - HIF_TX_IDX15, -}; - -enum { - HIF_RX_IDX0, - HIF_RX_IDX1, -}; - -typedef enum _RTMP_INF_TYPE_ { - RTMP_DEV_INF_UNKNOWN = 0, - RTMP_DEV_INF_PCI = 1, - RTMP_DEV_INF_USB = 2, - RTMP_DEV_INF_RBUS = 4, - RTMP_DEV_INF_PCIE = 5, - RTMP_DEV_INF_SDIO = 6, -} RTMP_INF_TYPE; - -#define IS_SDIO_INF(_pAd) ((_pAd)->infType == RTMP_DEV_INF_SDIO) -#define IS_USB_INF(_pAd) ((_pAd)->infType == RTMP_DEV_INF_USB) -#define IS_USB3_INF(_pAd) \ - ((IS_USB_INF(_pAd)) && ((_pAd)->BulkOutMaxPacketSize == 1024)) -#define IS_PCIE_INF(_pAd) ((_pAd)->infType == RTMP_DEV_INF_PCIE) -#define IS_PCI_INF(_pAd) \ - (((_pAd)->infType == RTMP_DEV_INF_PCI) || IS_PCIE_INF(_pAd)) -#define IS_PCI_ONLY_INF(_pAd) ((_pAd)->infType == RTMP_DEV_INF_PCI) -#define IS_RBUS_INF(_pAd) ((_pAd)->infType == RTMP_DEV_INF_RBUS) - -#endif /* __HIF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hif/mt_hif_pci.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hif/mt_hif_pci.h deleted file mode 100644 index 939e2112a7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hif/mt_hif_pci.h +++ /dev/null @@ -1,1023 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_hif_pci.h -*/ - -#ifndef __MT_HIF_PCI_H__ -#define __MT_HIF_PCI_H__ - -#include "mac/mac.h" -#include "rtmp_dmacb.h" - -#define HIF_BASE 0x4000 -#define MT_HIF_BASE 0x4000 - -/* - CR definitions -*/ -#define HIF_SYS_REV (MT_HIF_BASE + 0x0000) -#define HIF_FUN_CAP (MT_HIF_BASE + 0x0004) - -#define MT_CFG_PCIE_MISC (MT_HIF_BASE + 0x0014) - -#define MT_CFG_LPCR_HOST (MT_HIF_BASE + 0x01f0) - -#define MT_HOST_SET_OWN (1 << 0) -#define MT_HOST_CLR_OWN (1 << 1) - -#define MT_CFG_LPCR_FW (MT_HIF_BASE + 0x01f4) -#define MT_FW_CLR_OWN (1 << 0) - -#ifdef ERR_RECOVERY -#define MT_MCU_INT_EVENT (MT_HIF_BASE + 0x01f8) -#define MT7663_MCU_INT_EVENT (MT_HIF_BASE + 0x0108) -#define MCU_INT_PDMA0_STOP_DONE BIT(0) -#define MCU_INT_PDMA0_INIT_DONE BIT(1) -#define MCU_INT_SER_TRIGGER_FROM_HOST BIT(2) -#define MCU_INT_PDMA0_RECOVERY_DONE BIT(3) -#endif /* ERR_RECOVERY .*/ - -#define MT_INT_SOURCE_CSR (MT_HIF_BASE + 0x0200) -#define MT_INT_MASK_CSR (MT_HIF_BASE + 0x0204) - -#ifdef ERR_RECOVERY -#define ERROR_DETECT_STOP_PDMA_WITH_FW_RELOAD BIT(1) -#define ERROR_DETECT_STOP_PDMA BIT(2) -#define ERROR_DETECT_RESET_DONE BIT(3) -#define ERROR_DETECT_RECOVERY_DONE BIT(4) -#define ERROR_DETECT_N9_NORMAL_STATE BIT(5) -#define CP_LMAC_HANG_WORKAROUND_STEP1 BIT(8) -#define CP_LMAC_HANG_WORKAROUND_STEP2 BIT(9) -#define ERROR_DETECT_LMAC_ERROR BIT(24) -#define ERROR_DETECT_PSE_ERROR BIT(25) -#define ERROR_DETECT_PLE_ERROR BIT(26) -#define ERROR_DETECT_PDMA_ERROR BIT(27) -#define ERROR_DETECT_PCIE_ERROR BIT(28) -#endif - -#if defined(MT7615) || defined(MT7622) || defined(P18) -#define MT_MCU_CMD_CSR (MT_HIF_BASE + 0x0234) -#endif - -#define MT_MCU_CMD_CLEAR_FW_OWN BIT(0) -#ifdef ERR_RECOVERY -#define ERROR_DETECT_STOP_PDMA_WITH_FW_RELOAD BIT(1) -#define ERROR_DETECT_STOP_PDMA BIT(2) -#define ERROR_DETECT_RESET_DONE BIT(3) -#define ERROR_DETECT_RECOVERY_DONE BIT(4) -#define ERROR_DETECT_N9_NORMAL_STATE BIT(5) -#define CP_LMAC_HANG_WORKAROUND_STEP1 BIT(8) -#define CP_LMAC_HANG_WORKAROUND_STEP2 BIT(9) -#define ERROR_DETECT_LMAC_ERROR BIT(24) -#define ERROR_DETECT_PSE_ERROR BIT(25) -#define ERROR_DETECT_PLE_ERROR BIT(26) -#define ERROR_DETECT_PDMA_ERROR BIT(27) -#define ERROR_DETECT_PCIE_ERROR BIT(28) - -#if defined(MT7615) || defined(MT7622) || defined(P18) -#define ERROR_DETECT_MASK \ - (ERROR_DETECT_STOP_PDMA_WITH_FW_RELOAD | ERROR_DETECT_STOP_PDMA | \ - ERROR_DETECT_RESET_DONE | ERROR_DETECT_RECOVERY_DONE | \ - ERROR_DETECT_N9_NORMAL_STATE | ERROR_DETECT_LMAC_ERROR | \ - ERROR_DETECT_PSE_ERROR | ERROR_DETECT_PLE_ERROR | \ - ERROR_DETECT_PDMA_ERROR | ERROR_DETECT_PCIE_ERROR) -#endif - -#define ERROR_RECOVERY_PDMA0_STOP_NOTIFY BIT(0) -#define ERROR_RECOVERY_PDMA0_INIT_DONE_NOTIFY BIT(1) -#endif /* ERR_RECOVERY */ - -/* - INT_SOURCE_CSR: Interrupt source register. Write one to clear corresponding bit - Refer to MT_INT_SOURCE_CSR(0x4000) -*/ -#ifdef RT_BIG_ENDIAN -typedef union _MT_INT_SOURCE_CSR_STRUC { - struct { - UINT32 rsv_31 : 1; - UINT32 mcu_cmd_int : 1; - UINT32 wf_mac_int_5 : 1; - UINT32 wf_mac_int_4 : 1; - UINT32 wf_mac_int_3 : 1; - UINT32 wf_mac_int_2 : 1; - UINT32 wf_mac_int_1 : 1; - UINT32 wf_mac_int_0 : 1; - UINT32 tx_dly_int : 1; - UINT32 rx_dly_int : 1; - UINT32 tx_coherent : 1; - UINT32 rx_coherent : 1; - UINT32 tx_done_15 : 1; - UINT32 rsv_18 : 1; - UINT32 tx_done_13 : 1; - UINT32 tx_done_12 : 1; - UINT32 tx_done_11 : 1; - UINT32 tx_done_10 : 1; - UINT32 tx_done_9 : 1; - UINT32 tx_done_8 : 1; - UINT32 tx_done_7 : 1; - UINT32 tx_done_6 : 1; - UINT32 tx_done_5 : 1; - UINT32 tx_done_4 : 1; - UINT32 tx_done_3 : 1; - UINT32 tx_done_2 : 1; - UINT32 tx_done_1 : 1; - UINT32 tx_done_0 : 1; - UINT32 err_det_int_1 : 1; - UINT32 err_det_int_0 : 1; - UINT32 rx_done_1 : 1; - UINT32 rx_done_0 : 1; - } field; - UINT32 word; -} MT_INT_SOURCE_CSR_STRUC; -#else -typedef union _MT_INT_SOURCE_CSR_STRUC { - struct { - UINT32 rx_done_0 : 1; - UINT32 rx_done_1 : 1; - UINT32 err_det_int_0 : 1; - UINT32 err_det_int_1 : 1; - UINT32 tx_done_0 : 1; - UINT32 tx_done_1 : 1; - UINT32 tx_done_2 : 1; - UINT32 tx_done_3 : 1; - UINT32 tx_done_4 : 1; - UINT32 tx_done_5 : 1; - UINT32 tx_done_6 : 1; - UINT32 tx_done_7 : 1; - UINT32 tx_done_8 : 1; - UINT32 tx_done_9 : 1; - UINT32 tx_done_10 : 1; - UINT32 tx_done_11 : 1; - UINT32 tx_done_12 : 1; - UINT32 tx_done_13 : 1; - UINT32 rsv_18 : 1; - UINT32 tx_done_15 : 1; - UINT32 rx_coherent : 1; - UINT32 tx_coherent : 1; - UINT32 rx_dly_int : 1; - UINT32 tx_dly_int : 1; - UINT32 wf_mac_int_0 : 1; - UINT32 wf_mac_int_1 : 1; - UINT32 wf_mac_int_2 : 1; - UINT32 wf_mac_int_3 : 1; - UINT32 wf_mac_int_4 : 1; - UINT32 wf_mac_int_5 : 1; - UINT32 mcu_cmd_int : 1; - UINT32 rsv_31 : 1; - } field; - UINT32 word; -} MT_INT_SOURCE_CSR_STRUC; -#endif /* RT_BIG_ENDIAN */ - -/* INT_MASK_CSR: Interrupt MASK register. 1: the interrupt is mask OFF */ -#define WPDMA_INT_MSK (HIF_BASE + 0x204) -#ifdef RT_BIG_ENDIAN -typedef union _MT_WPDMA_INT_MASK { - struct { - UINT32 rsv_31 : 1; - UINT32 mcu_cmd_int : 1; - UINT32 wf_mac_int_5 : 1; - UINT32 wf_mac_int_4 : 1; - UINT32 wf_mac_int_3 : 1; - UINT32 wf_mac_int_2 : 1; - UINT32 wf_mac_int_1 : 1; - UINT32 wf_mac_int_0 : 1; - UINT32 tx_dly_int : 1; - UINT32 rx_dly_int : 1; - UINT32 tx_coherent : 1; - UINT32 rx_coherent : 1; - UINT32 tx_done_15 : 1; - UINT32 rsv_18 : 1; - UINT32 tx_done_13 : 1; - UINT32 tx_done_12 : 1; - UINT32 tx_done_11 : 1; - UINT32 tx_done_10 : 1; - UINT32 tx_done_9 : 1; - UINT32 tx_done_8 : 1; - UINT32 tx_done_7 : 1; - UINT32 tx_done_6 : 1; - UINT32 tx_done_5 : 1; - UINT32 tx_done_4 : 1; - UINT32 tx_done_3 : 1; - UINT32 tx_done_2 : 1; - UINT32 tx_done_1 : 1; - UINT32 tx_done_0 : 1; - UINT32 err_det_int_1 : 1; - UINT32 err_det_int_0 : 1; - UINT32 rx_done_1 : 1; - UINT32 rx_done_0 : 1; - } field; - UINT32 word; -} MT_WPMDA_INT_MASK; -#else -typedef union _MT_WPDMA_INT_MASK { - struct { - UINT32 rx_done_0 : 1; - UINT32 rx_done_1 : 1; - UINT32 err_det_int_0 : 1; - UINT32 err_det_int_1 : 1; - UINT32 tx_done_0 : 1; - UINT32 tx_done_1 : 1; - UINT32 tx_done_2 : 1; - UINT32 tx_done_3 : 1; - UINT32 tx_done_4 : 1; - UINT32 tx_done_5 : 1; - UINT32 tx_done_6 : 1; - UINT32 tx_done_7 : 1; - UINT32 tx_done_8 : 1; - UINT32 tx_done_9 : 1; - UINT32 tx_done_10 : 1; - UINT32 tx_done_11 : 1; - UINT32 tx_done_12 : 1; - UINT32 tx_done_13 : 1; - UINT32 rsv_18 : 1; - UINT32 tx_done_15 : 1; - UINT32 rx_coherent : 1; - UINT32 tx_coherent : 1; - UINT32 rx_dly_int : 1; - UINT32 tx_dly_int : 1; - UINT32 wf_mac_int_0 : 1; - UINT32 wf_mac_int_1 : 1; - UINT32 wf_mac_int_2 : 1; - UINT32 wf_mac_int_3 : 1; - UINT32 wf_mac_int_4 : 1; - UINT32 wf_mac_int_5 : 1; - UINT32 mcu_cmd_int : 1; - UINT32 rsv_31 : 1; - } field; - UINT32 word; -} MT_WPMDA_INT_MASK; -#endif /* RT_BIG_ENDIAN */ - -#define MT_INT_R0_DONE (1 << 0) -#define MT_INT_R1_DONE (1 << 1) - -#define MT_INT_ERR_DET0 (1 << 2) -#define MT_INT_ERR_DET1 (1 << 3) - -#define MT_INT_T0_DONE (1 << 4) -#define MT_INT_T1_DONE (1 << 5) -#define MT_INT_T2_DONE (1 << 6) -#define MT_INT_T3_DONE (1 << 7) -#define MT_INT_T4_DONE (1 << 8) -#define MT_INT_T5_DONE (1 << 9) -#define MT_INT_T6_DONE (1 << 10) -#define MT_INT_T7_DONE (1 << 11) -#define MT_INT_T8_DONE (1 << 12) -#define MT_INT_T9_DONE (1 << 13) -#define MT_INT_T10_DONE (1 << 14) -#define MT_INT_T11_DONE (1 << 15) -#define MT_INT_T12_DONE (1 << 16) -#define MT_INT_T13_DONE (1 << 17) -#define MT_INT_T14_DONE (1 << 18) /* mt7615 don't have this INT*/ -#define MT_INT_T15_DONE (1 << 19) - -#define MT_INT_TX_DONE \ - (MT_INT_T0_DONE | MT_INT_T1_DONE | MT_INT_T2_DONE | MT_INT_T3_DONE | \ - MT_INT_T4_DONE | MT_INT_T5_DONE | MT_INT_T6_DONE | MT_INT_T7_DONE | \ - MT_INT_T8_DONE | MT_INT_T9_DONE | MT_INT_T10_DONE | MT_INT_T11_DONE | \ - MT_INT_T12_DONE | MT_INT_T13_DONE | MT_INT_T14_DONE | \ - MT_INT_T15_DONE) - -#define MT_INT_RX_COHE (1 << 20) -#define MT_INT_TX_COHE (1 << 21) - -#define MT_INT_RX_DLY (1 << 22) -#define MT_INT_TX_DLY (1 << 23) - -#define WF_MAC_INT_0 (1 << 24) -#define WF_MAC_INT_1 (1 << 25) -#define WF_MAC_INT_2 (1 << 26) -#define WF_MAC_INT_3 (1 << 27) -#define WF_MAC_INT_4 (1 << 28) -#define WF_MAC_INT_5 (1 << 29) - -#define MT_INT_MCU_CMD (1 << 30) - -#define MT_FW_CLEAR_OWN_BIT (1 << 31) - -#ifdef MULTI_LAYER_INTERRUPT -#define MT_INT_WPDMA2HOST_ERR_INT_STS (1 << 24) -#define MT_INT_SUBSYS_INT_STS (1 << 28) -#define MT_INT_MCU2HOST_SW_INT_STS (1 << 29) -#endif - -#define MT_RxINT \ - (MT_INT_R0_DONE | \ - MT_INT_R1_DONE /* | MT_INT_RX_DLY */) /* Delayed Rx or indivi rx */ - -#define MT_TxMgmtInt (MT_INT_T4_DONE /*| INT_TX_DLY*/) - -#define MT_TxCoherent MT_INT_TX_COHE -#define MT_RxCoherent MT_INT_RX_COHE -#define MT_TxRxCoherent (MT_INT_TX_COHE | MT_INT_RX_COHE) -#define MT_MacInt \ - (WF_MAC_INT_0 | WF_MAC_INT_1 | WF_MAC_INT_2 | WF_MAC_INT_3 | \ - WF_MAC_INT_4 | WF_MAC_INT_5) - -#define MT_CoherentInt (MT_INT_RX_COHE | MT_INT_TX_COHE) -#define MT_DelayInt (MT_INT_RX_DLY | MT_INT_TX_DLY) - -#define MT_McuCommand MT_INT_MCU_CMD /* mcu */ -#define MT_FW_CLR_OWN_INT MT_FW_CLEAR_OWN_BIT - -#define MT_INT_RX (MT_INT_R0_DONE | MT_INT_R1_DONE) -#define MT_INT_RX_DATA (MT_INT_R0_DONE) -#define MT_INT_RX_CMD (MT_INT_R1_DONE) - -#define MT_INT_AC0_DLY (MT_INT_T0_DONE) -#define MT_INT_AC1_DLY (MT_INT_T1_DONE) -#define MT_INT_AC2_DLY (MT_INT_T2_DONE) -#define MT_INT_AC3_DLY (MT_INT_T3_DONE) -#define MT_INT_AC4_DLY (MT_INT_T4_DONE) -#define MT_INT_AC5_DLY (MT_INT_T5_DONE) -#define MT_INT_AC6_DLY (MT_INT_T6_DONE) -#define MT_INT_AC7_DLY (MT_INT_T7_DONE) -#define MT_INT_AC8_DLY (MT_INT_T8_DONE) -#define MT_INT_AC9_DLY (MT_INT_T9_DONE) -#define MT_INT_AC10_DLY (MT_INT_T10_DONE) -#define MT_INT_AC11_DLY (MT_INT_T11_DONE) -#define MT_INT_AC12_DLY (MT_INT_T12_DONE) -#define MT_INT_AC13_DLY (MT_INT_T13_DONE) -#if defined(MT7622) || defined(P18) || defined(MT7663) -#define MT_INT_AC14_DLY (MT_INT_T14_DONE) -#endif -#define MT_INT_AC15_DLY (MT_INT_T15_DONE) - -#define MT_INT_CMD (MT_INT_T5_DONE) - -#define MT_INT_MGMT_DLY (MT_INT_T4_DONE) -#define MT_INT_BMC_DLY (MT_INT_T8_DONE) /* (MT_INT_T6_DONE) */ -#define MT_INT_BCN_DLY (MT_INT_T7_DONE) /* (MT_INT_T15_DONE) */ - -#define MT_DELAYINTMASK 0x3FFBFFFF -#define MT_INTMASK 0x3FFBFFFF - -/* - CR WPDMA GLO CFG -*/ -#define MT_WPDMA_GLO_CFG (MT_HIF_BASE + 0x0208) -#define TX_DMA_EN (1 << 0) -#define TX_DMA_BUSY (1 << 1) -#define RX_DMA_EN (1 << 2) -#define RX_DMA_BUSY (1 << 3) -#define TX_WB_DDONE (1 << 6) -#define BIG_ENDIAN (1 << 7) -/* #define 32B_DESP_EN (1 << 8) */ -#define SHARE_FIFO_EN (1 << 9) - -#define FIFO_LITTLE_ENDIAN (1 << 12) - -#define SW_RST (1 << 24) -#define FORCE_TX_EOF (1 << 25) -#define OMIT_RX_INFO (1 << 27) -#define OMIT_TX_INFO (1 << 28) -#define BYTE_SWAP (1 << 29) -#define CLK_GATE_DIS (1 << 30) -#define RX_2B_OFFSET (1 << 31) - -#define WPDMA_RST_PTR (MT_HIF_BASE + 0x020c) -#ifdef RT_BIG_ENDIAN -typedef union _WPDMA_RST_IDX_STRUC { - struct { - UINT32 rsv_18_31 : 14; - UINT32 RST_DRX_IDX1 : 1; - UINT32 RST_DRX_IDX0 : 1; - UINT32 rsv_2_15 : 14; - UINT32 RST_DTX_IDX1 : 1; - UINT32 RST_DTX_IDX0 : 1; - } field; - UINT32 word; -} WPDMA_RST_IDX_STRUC; -#else -typedef union _WPDMA_RST_IDX_STRUC { - struct { - UINT32 RST_DTX_IDX0 : 1; - UINT32 RST_DTX_IDX1 : 1; - UINT32 rsv_2_15 : 14; - UINT32 RST_DRX_IDX0 : 1; - UINT32 RST_DRX_IDX1 : 1; - UINT32 rsv_18_31 : 14; - } field; - UINT32 word; -} WPDMA_RST_IDX_STRUC; -#endif /* RT_BIG_ENDIAN */ - -#define MT_DELAY_INT_CFG (MT_HIF_BASE + 0x0210) -#ifdef RT_BIG_ENDIAN -typedef union _DELAY_INT_CFG_STRUC { - struct { - UINT32 TXDLY_INT_EN : 1; - UINT32 TXMAX_PINT : 7; - UINT32 TXMAX_PTIME : 8; - UINT32 RXDLY_INT_EN : 1; - UINT32 RXMAX_PINT : 7; - UINT32 RXMAX_PTIME : 8; - } field; - UINT32 word; -} DELAY_INT_CFG_STRUC; -#else -typedef union _DELAY_INT_CFG_STRUC { - struct { - UINT32 RXMAX_PTIME : 8; - UINT32 RXMAX_PINT : 7; - UINT32 RXDLY_INT_EN : 1; - UINT32 TXMAX_PTIME : 8; - UINT32 TXMAX_PINT : 7; - UINT32 TXDLY_INT_EN : 1; - } field; - UINT32 word; -} DELAY_INT_CFG_STRUC; -#endif /* RT_BIG_ENDIAN */ - -#define MT_WPDMA_TX_DMAD_RNG (MT_HIF_BASE + 0x0214) -#define MT_WPDMA_RX_DMAD_RNG (MT_HIF_BASE + 0x0218) -#define MT_WPDMA_TX_PLD_RNG (MT_HIF_BASE + 0x021C) -#define MT_WPDMA_RX_PLD_RNG (MT_HIF_BASE + 0x0220) -#define MT_WPDMA_MEM_RNG_ERR (MT_HIF_BASE + 0x0224) - -#define MT_WPDMA_PAUSE_RX_Q_TH10 (MT_HIF_BASE + 0x0260) -#define TX_PRE_ADDR_ALIGN_MODE_128 BITS(28, 30) -#define TX_PRE_ADDR_ALIGN_MODE_UMASK ~(BITS(28, 30)) - -#define MT_WPDMA_TX_RING0_CTRL0 (MT_HIF_BASE + 0x0300) -#define MT_WPDMA_TX_RING0_CTRL1 (MT_HIF_BASE + 0x0304) -#define MT_WPDMA_TX_RING0_CTRL2 (MT_HIF_BASE + 0x0308) -#define MT_WPDMA_TX_RING0_CTRL3 (MT_HIF_BASE + 0x030C) - -#define MT_WPDMA_TX_RING1_CTRL0 (MT_HIF_BASE + 0x0310) -#define MT_WPDMA_TX_RING1_CTRL1 (MT_HIF_BASE + 0x0314) -#define MT_WPDMA_TX_RING1_CTRL2 (MT_HIF_BASE + 0x0318) -#define MT_WPDMA_TX_RING1_CTRL3 (MT_HIF_BASE + 0x031C) - -#define MT_WPDMA_TX_RING2_CTRL0 (MT_HIF_BASE + 0x0320) -#define MT_WPDMA_TX_RING2_CTRL1 (MT_HIF_BASE + 0x0324) -#define MT_WPDMA_TX_RING2_CTRL2 (MT_HIF_BASE + 0x0328) -#define MT_WPDMA_TX_RING2_CTRL3 (MT_HIF_BASE + 0x032C) - -#define MT_WPDMA_TX_RING3_CTRL0 (MT_HIF_BASE + 0x0330) -#define MT_WPDMA_TX_RING3_CTRL1 (MT_HIF_BASE + 0x0334) -#define MT_WPDMA_TX_RING3_CTRL2 (MT_HIF_BASE + 0x0338) -#define MT_WPDMA_TX_RING3_CTRL3 (MT_HIF_BASE + 0x033C) - -#define MT_WPDMA_RX_RING0_CTRL0 (MT_HIF_BASE + 0x0400) -#define MT_WPDMA_RX_RING0_CTRL1 (MT_HIF_BASE + 0x0404) -#define MT_WPDMA_RX_RING0_CTRL2 (MT_HIF_BASE + 0x0408) -#define MT_WPDMA_RX_RING0_CTRL3 (MT_HIF_BASE + 0x040C) - -#define MT_WPDMA_RX_RING1_CTRL0 (MT_HIF_BASE + 0x0410) -#define MT_WPDMA_RX_RING1_CTRL1 (MT_HIF_BASE + 0x0414) -#define MT_WPDMA_RX_RING1_CTRL2 (MT_HIF_BASE + 0x0418) -#define MT_WPDMA_RX_RING1_CTRL3 (MT_HIF_BASE + 0x041C) - -enum { - TX_RING_LOW, - TX_RING_HIGH, -}; - -enum { - TX_RING_HIGH_TO_HIGH, - TX_RING_HIGH_TO_LOW, - TX_RING_LOW_TO_LOW, - TX_RING_LOW_TO_HIGH, - TX_RING_UNKNOW_CHANGE, -}; - -/*@!Release - Tx Ring Layout and assignments - - Totally we have 10 Tx Rings and assigned as following usage: - 1. RT85592 - TxRing 0~3: for TxQ Channel 1 with AC_BK/BE/VI/VO - TxRing 4 : for TxQ CTRL - TxRing 5 : for TxQ MGMT - TxRing 6~9: for TxQ Channel 2 with AC_BK/BE/VI/VO - - 2. MT7650 - TxRing 0~3: for TxQ Channel 1 with AC_BK/BE/VI/VO - TxRing 4~7: for TxQ Channel 2 with AC_BK/BE/VI/VO - TxRing 8 : for TxQ CTRL - TxRing 9 : for TxQ MGMT - - For each TxRing, we have four register to control it - TX_RINGn_CTRL0 (0x0): base address of this ring(4-DWORD aligned address) - TX_RINGn_CTRL1 (0x4): maximum number of TxD count in this ring - TX_RINGn_CTRL2 (0x8): Point to the next TxD CPU wants to use - TX_RINGn_CTRL3 (0xc): Point to the next TxD DMA wants to use -*/ -#define MT_RINGREG_DIFF 0x10 - -#define MT_TX_RING_BASE (MT_HIF_BASE + 0x0300) -#define MT_TX_RING_PTR (MT_TX_RING_BASE + 0x0) -#define MT_TX_RING_CNT (MT_TX_RING_BASE + 0x4) -#define MT_TX_RING_CIDX (MT_TX_RING_BASE + 0x8) -#define MT_TX_RING_DIDX (MT_TX_RING_BASE + 0xc) - -/* following address is base on TX_CHAN_BASE_X */ -#define MT_TX_RING_BK_BASE 0x0 -#define MT_TX_RING_BK_CNT (MT_TX_RING_BK_BASE + 0x04) -#define MT_TX_RING_BK_CIDX (MT_TX_RING_BK_BASE + 0x08) -#define MT_TX_RING_BK_DIDX (MT_TX_RING_BK_BASE + 0x0c) - -#define MT_TX_RING_BE_BASE (MT_TX_RING_BK_BASE + MT_RINGREG_DIFF) -#define MT_TX_RING_BE_CNT (MT_TX_RING_BE_BASE + 0x04) -#define MT_TX_RING_BE_CIDX (MT_TX_RING_BE_BASE + 0x08) -#define MT_TX_RING_BE_DIDX (MT_TX_RING_BE_BASE + 0x0c) - -#define MT_TX_RING_VI_BASE (MT_TX_RING_BE_BASE + MT_RINGREG_DIFF) -#define MT_TX_RING_VI_CNT (MT_TX_RING_VI_BASE + 0x04) -#define MT_TX_RING_VI_CIDX (MT_TX_RING_VI_BASE + 0x08) -#define MT_TX_RING_VI_DIDX (MT_TX_RING_VI_BASE + 0x0c) - -#define MT_TX_RING_VO_BASE (MT_TX_RING_VI_BASE + MT_RINGREG_DIFF) -#define MT_TX_RING_VO_CNT (MT_TX_RING_VO_BASE + 0x04) -#define MT_TX_RING_VO_CIDX (MT_TX_RING_VO_BASE + 0x08) -#define MT_TX_RING_VO_DIDX (MT_TX_RING_VO_BASE + 0x0c) - -#define MT_TX_RING_BCN_IDX 7 - -/* - Rx Ring Layput and assignments - - Totally we have 2 Rx Rings and assigned as following usage: - RxRing 0: for all received data packets - RxRing 1: for internal ctrl/info packets generated by on-chip CPU. - - For each TxRing, we have four register to control it - RX_RING_CTRL0 (0x0): base address of this ring(4-DWORD aligned address) - RX_RING_CTRL1 (0x4): maximum number of RxD count in this ring - RX_RING_CTRL2 (0x8): Point to the next RxD CPU wants to use - RX_RING_CTRL3 (0xc): Point to the next RxD DMA wants to use -*/ -#define MT_RX_RING_BASE (HIF_BASE + 0x0400) -#define MT_RX_RING1_BASE (HIF_BASE + 0x0410) -#define MT_RX_RING_NUM 2 -#define MT_RX_RING_PTR (MT_RX_RING_BASE + 0x00) -#define MT_RX_RING_CNT (MT_RX_RING_BASE + 0x04) -#define MT_RX_RING_CIDX (MT_RX_RING_BASE + 0x08) -#define MT_RX_RING_DIDX (MT_RX_RING_BASE + 0x0c) - -#define MT_RX_RING1_PTR (MT_RX_RING_BASE + MT_RINGREG_DIFF * 1) -#define MT_RX_RING1_CNT (MT_RX_RING_BASE + MT_RINGREG_DIFF * 1 + 0x04) -#define MT_RX_RING1_CIDX (MT_RX_RING_BASE + MT_RINGREG_DIFF * 1 + 0x08) -#define MT_RX_RING1_DIDX (MT_RX_RING_BASE + MT_RINGREG_DIFF * 1 + 0x0c) - -#define PCI_CFG_DEVICE_CONTROL (MT_HIF_BASE + 0x2088) -#define PCI_CFG_MAX_PAYLOAD_SIZE_4K (BIT(5) | BIT(7)) -#define PCI_CFG_MAX_READ_REQ_4K (BIT(12) | BIT(14)) -#define PCI_CFG_MAX_PAYLOAD_SIZE_UMASK ~(BITS(5, 7)) -#define PCI_CFG_MAX_READ_REQ_UMASK ~(BITS(12, 14)) - -#define PCI_K_CNT2 (MT_HIF_BASE + 0x3014) -#define K_CNT_MAX_PAYLOAD_SIZE_4K (BIT(0) | BIT(2)) -#define K_CNT_MAX_PAYLOAD_SIZE_UMASK ~(BITS(0, 2)) - -#define PCI_K_CONF_FUNC0_4 (MT_HIF_BASE + 0x3110) -#define K_CONF_MAX_PAYLOAD_SIZE_4K (BIT(0) | BIT(2)) -#define K_CONF_MAX_PAYLOAD_SIZE_UMASK ~(BITS(0, 2)) - -/* ================================================================================= - PCI/RBUS TX / RX Frame Descriptors format - - Memory Layout - - 1. Tx Descriptor - TxD (12 bytes) + TXINFO (4 bytes) - 2. Packet Buffer - TXWI + 802.11 - 31 0 - +--------------------------------------------------------------------------+ - | SDP0[31:0] | - +-+--+---------------------+-+--+-----------------------------------------+ - |D |L0| SDL0[13:0] |B|L1| SDL1[13:0] | - +-+--+---------------------+-+--+-----------------------------------------+ - | SDP1[31:0] | - +--------------------------------------------------------------------------+ - | TXINFO | - +--------------------------------------------------------------------------+ -================================================================================= */ -/* - TX descriptor format for Tx Data/Mgmt Rings -*/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXD_STRUC { - /* Word 0 */ - UINT32 SDPtr0; - - /* Word 1 */ - UINT32 DMADONE : 1; - UINT32 LastSec0 : 1; - UINT32 SDLen0 : 14; - UINT32 Burst : 1; - UINT32 LastSec1 : 1; - UINT32 SDLen1 : 14; - /* Word 2 */ - UINT32 SDPtr1; -} TXD_STRUC; -#else -typedef struct GNU_PACKED _TXD_STRUC { - /* Word 0 */ - UINT32 SDPtr0; - - /* Word 1 */ - UINT32 SDLen1 : 14; - UINT32 LastSec1 : 1; - UINT32 Burst : 1; - UINT32 SDLen0 : 14; - UINT32 LastSec0 : 1; - UINT32 DMADONE : 1; - /*Word2 */ - UINT32 SDPtr1; -} TXD_STRUC; -#endif /* RT_BIG_ENDIAN */ - -/* - Rx descriptor format for Rx Rings -*/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RXD_STRUC { - /* Word 0 */ - UINT32 SDP0; - - /* Word 1 */ - UINT32 DDONE : 1; - UINT32 LS0 : 1; - UINT32 SDL0 : 14; - UINT32 BURST : 1; - UINT32 LS1 : 1; - UINT32 SDL1 : 14; - - /* Word 2 */ - UINT32 SDP1; -} RXD_STRUC; -#else -typedef struct GNU_PACKED _RXD_STRUC { - /* Word 0 */ - UINT32 SDP0; - - /* Word 1 */ - UINT32 SDL1 : 14; - UINT32 LS1 : 1; - UINT32 BURST : 1; - UINT32 SDL0 : 14; - UINT32 LS0 : 1; - UINT32 DDONE : 1; - - /* Word 2 */ - UINT32 SDP1; -} RXD_STRUC; -#endif /* RT_BIG_ENDIAN */ - -typedef struct _RTMP_MGMT_RING { - RTMP_DMACB Cell[MGMT_RING_SIZE]; - UINT32 TxCpuIdx; - UINT32 TxDmaIdx; - UINT32 TxSwFreeIdx; /* software next free tx index */ - UINT32 hw_desc_base; - UINT32 hw_cidx_addr; - UINT32 hw_didx_addr; - UINT32 hw_cnt_addr; -} RTMP_MGMT_RING; - -typedef struct _RTMP_CTRL_RING { - RTMP_DMACB Cell[CTL_RING_SIZE]; - UINT32 TxCpuIdx; - UINT32 TxDmaIdx; - UINT32 TxSwFreeIdx; /* software next free tx index */ - UINT32 hw_desc_base; - UINT32 hw_cidx_addr; - UINT32 hw_didx_addr; - UINT32 hw_cnt_addr; -} RTMP_CTRL_RING; - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -typedef struct _RTMP_FWDWLO_RING { - UINT32 TxCpuIdx; - UINT32 TxDmaIdx; - UINT32 TxSwFreeIdx; /* software next free tx index */ - UINT32 hw_desc_base; - UINT32 hw_cidx_addr; - UINT32 hw_didx_addr; - UINT32 hw_cnt_addr; - UINT32 ring_size; - NDIS_SPIN_LOCK RingLock; /* Ring spinlock */ - RTMP_DMABUF DescRing; /* Shared memory for CTRL descriptors */ - RTMP_DMACB Cell[MGMT_RING_SIZE]; -} RTMP_FWDWLO_RING; - -typedef struct _RTMP_RING { - UINT32 TxCpuIdx; - UINT32 TxDmaIdx; - UINT32 TxSwFreeIdx; /* software next free tx index */ - UINT32 hw_desc_base; - UINT32 hw_cidx_addr; - UINT32 hw_didx_addr; - UINT32 hw_cnt_addr; - UINT32 ring_size; - NDIS_SPIN_LOCK RingLock; /* Ring spinlock */ - RTMP_DMABUF DescRing; /* Shared memory for Ring descriptors */ - RTMP_DMACB Cell[0]; -} RTMP_RING; -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - -#ifdef MT_MAC -typedef struct _RTMP_BCN_RING { - RTMP_DMACB Cell[BCN_RING_SIZE]; - UINT32 TxCpuIdx; - UINT32 TxDmaIdx; - UINT32 TxSwFreeIdx; /* software next free tx index */ - UINT32 hw_desc_base; - UINT32 hw_cidx_addr; - UINT32 hw_didx_addr; - UINT32 hw_cnt_addr; -} RTMP_BCN_RING; -#endif /* MT_MAC */ - -#define INC_INDEX(_idx, _RingSize) \ - { \ - (_idx) = (_idx + 1) % (_RingSize); \ - } - -typedef struct _RTMP_TX_RING { - UINT32 hw_didx_addr; - UINT32 TxDmaIdx; - RTMP_DMACB *Cell; - UINT32 TxSwFreeIdx; - BOOLEAN tx_ring_state; - UINT32 tx_ring_low_water_mark; - UINT32 tx_ring_high_water_mark; - UINT32 tx_ring_full_cnt; - UINT32 hw_cidx_addr; - UINT32 TxCpuIdx; - UINT32 hw_desc_base; - UINT32 hw_cnt_addr; -} RTMP_TX_RING ____cacheline_aligned; - -enum { - FREE_BUF_1k, - FREE_BUF_64k, -}; - -typedef struct _RTMP_RX_RING { - UINT16 max_rx_process_cnt; - UINT32 hw_didx_addr; - UINT32 RxDmaIdx; - UINT32 RxSwReadIdx; - UINT16 RxRingSize; - RTMP_DMACB *Cell; - UINT16 free_buf_head; - UINT16 free_buf_tail; - UINT16 free_buf_size; - RTMP_DMABUF *free_buf; - UINT8 cur_free_buf_len; - UINT16 RxBufferSize; - UINT16 sw_read_idx_inc; - UINT32 RxCpuIdx; - UINT32 hw_cidx_addr; - UINT16 free_buf_64k_head; - UINT16 free_buf_64k_tail; - UINT16 free_buf_64k_size; - RTMP_DMABUF *free_buf_64k; - UINT32 hw_desc_base; - UINT32 hw_cnt_addr; -} RTMP_RX_RING ____cacheline_aligned; - -enum PACKET_TYPE { - TX_DATA, - TX_DATA_HIGH_PRIO, - TX_MGMT, - TX_ALTX, - TX_CMD, - TX_FW_DL, - TX_DATA_PS, - PACKET_TYPE_NUM, -}; - -typedef struct _PCI_HIF_T { - UINT32 IntEnableReg ____cacheline_aligned; - UINT32 intDisableMask; - UINT32 IntPending; - RTMP_DMABUF *RxDescRing; - NDIS_SPIN_LOCK *RxRingLock; - RTMP_RX_RING *RxRing; - RTMP_DMABUF *TxBufSpace; - RTMP_DMABUF *TxDescRing; - NDIS_SPIN_LOCK *TxRingLock; - RTMP_TX_RING *TxRing; - BOOLEAN(*dma_done_handle[PACKET_TYPE_NUM]) - (struct _RTMP_ADAPTER *pAd, UINT8 hif_idx); - - PUINT8 CSRBaseAddress; /* PCI MMIO Base Address, all access will use */ - - /* System Information */ - UINT16 VendorID; /* Read from PCI config */ - UINT16 DeviceID; /* Read from PCI config */ - UINT16 SubVendorID; /* Read from PCI config */ - UINT16 SubSystemID; /* Read from PCI config */ - - UINT16 SpecificVendorID; /* Read form Registry */ - UINT16 SpecificDeviceID; /* Read form Registry */ - UINT16 RevsionID; /* Read from PCI config */ - RTMP_DMABUF MgmtDescRing; /* Shared memory for MGMT descriptors */ - RTMP_MGMT_RING MgmtRing; - NDIS_SPIN_LOCK MgmtRingLock; /* Prio Ring spinlock */ - -#ifdef MT_MAC - RTMP_DMABUF BcnDescRing; /* Shared memory for Beacon descriptors */ - RTMP_BCN_RING BcnRing; - NDIS_SPIN_LOCK BcnRingLock; /* Beacon Ring spinlock */ -#endif - -#ifdef CONFIG_ANDES_SUPPORT - RTMP_DMABUF CtrlDescRing; /* Shared memory for CTRL descriptors */ - RTMP_CTRL_RING CtrlRing; - NDIS_SPIN_LOCK CtrlRingLock; /* Ctrl Ring spinlock */ - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - RTMP_FWDWLO_RING FwDwloRing; -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ -#endif /* CONFIG_ANDES_SUPPORT */ - -#ifdef MT_MAC - RTMP_DMABUF - TxBmcBufSpace; /* Shared memory of all 1st pre-allocated TxBuf associated with each TXD */ - RTMP_DMABUF TxBmcDescRing; /* Shared memory for Tx descriptors */ - NDIS_SPIN_LOCK TxBmcRingLock; /* Beacon Ring spinlock */ - RTMP_TX_RING TxBmcRing; /* BMC */ -#endif /* MT_MAC */ -#ifdef CONFIG_WIFI_MSI_SUPPORT - BOOLEAN is_msi; -#endif /* CONFIG_WIFI_MSI_SUPPORT */ -} PCI_HIF_T, *PPCI_HIF_T; - -#define MT_WPDMA_GLO_CFG_1 (MT_HIF_BASE + 0x0500) -#define TXP_ACTIVE_MODE_MASK (0x3 << 0) -#define TXP_ACTIVE_MODE(p) (((p)&0x3) << 0) -#define GET_TXP_ACTIVE_MODE(p) (((p)&TXP_ACTIVE_MODE_MASK) >> 0) -#define MI_DEPTH_WR_2_0_MASK (0x7 << 13) -#define MI_DEPTH_WR_2_0(p) (((p)&0x3) << 13) -#define GET_MI_DEPTH_WR_2_0(p) (((p)&MI_DEPTH_WR_2_0_MASK) >> 13) -#define MI_DEPTH_WR_5_3_MASK (0x7 << 16) -#define MI_DEPTH_WR_5_3(p) (((p)&0x3) << 16) -#define GET_MI_DEPTH_WR_5_3(p) (((p)&MI_DEPTH_WR_5_3_MASK) >> 16) -#define MI_DEPTH_WR_8_6_MASK (0x7 << 19) -#define MI_DEPTH_WR_8_6(p) (((p)&0x3) << 19) -#define GET_MI_DEPTH_WR_8_6(p) (((p)&MI_DEPTH_WR_8_6_MASK) >> 19) - -#define MT_WPDMA_TX_PRE_CFG (MT_HIF_BASE + 0x0510) -#define TX_RING0_DMAD_PRE_NUM_MASK (0x3 << 0) -#define TX_RING0_DMAD_PRE_NUM(p) (((p)&0x3) << 0) -#define GET_TX_RING0_DMAD_PRE_NUM(p) (((p)&TX_RING0_DMAD_PRE_NUM_MASK) >> 0) -#define TX_RING1_DMAD_PRE_NUM_MASK (0x3 << 2) -#define TX_RING1_DMAD_PRE_NUM(p) (((p)&0x3) << 2) -#define GET_TX_RING1_DMAD_PRE_NUM(p) (((p)&TX_RING1_DMAD_PRE_NUM_MASK) >> 2) -#define TX_RING0_DMAD_PRE_HI_PRI_NUM_MASK (0x3 << 16) -#define TX_RING0_DMAD_PRE_HI_PRI_NUM(p) (((p)&0x3) << 16) -#define GET_TX_RING0_DMAD_PRE_HI_PRI_NUM(p) \ - (((p)&TX_RING0_DMAD_PRE_HI_PRI_NUM_MASK) >> 16) -#define TX_RING1_DMAD_PRE_HI_PRI_NUM_MASK (0x3 << 18) -#define TX_RING1_DMAD_PRE_HI_PRI_NUM(p) (((p)&0x3) << 18) -#define GET_TX_RING1_DMAD_PRE_HI_PRI_NUM(p) \ - (((p)&TX_RING1_DMAD_PRE_HI_PRI_NUM_MASK) >> 18) - -#define MT_WPDMA_RX_PRE_CFG (MT_HIF_BASE + 0x0520) -#define RX_RING0_DMAD_PRE_NUM_MASK (0x7f << 0) -#define RX_RING0_DMAD_PRE_NUM(p) (((p)&0x7f) << 0) -#define GET_RX_RING0_DMAD_PRE_NUM(p) (((p)&RX_RING0_DMAD_PRE_NUM_MASK) >> 0) -#define RX_RING1_DMAD_PRE_NUM_MASK (0xf << 8) -#define RX_RING1_DMAD_PRE_NUM(p) (((p)&0xf) << 8) -#define GET_RX_RING1_DMAD_PRE_NUM(p) (((p)&RX_RING1_DMAD_PRE_NUM_MASK) >> 8) -#define RX_RING0_DMAD_PRE_HI_PRI_NUM_MASK (0x7f << 16) -#define RX_RING0_DMAD_PRE_HI_PRI_NUM(p) (((p)&0x7f) << 16) -#define GET_RX_RING0_DMAD_PRE_HI_PRI_NUM(p) \ - (((p)&RX_RING0_DMAD_PRE_HI_PRI_NUM_MASK) >> 16) -#define RX_RING1_DMAD_PRE_HI_PRI_NUM_MASK (0xf << 24) -#define RX_RING1_DMAD_PRE_HI_PRI_NUM(p) (((p)&0xf) << 24) -#define GET_RX_RING1_DMAD_PRE_HI_PRI_NUM(p) \ - (((p)&RX_RING1_DMAD_PRE_HI_PRI_NUM_MASK) >> 24) - -#define MT_WPDMA_ABT_CFG (MT_HIF_BASE + 0x0530) -#define TRX_DFET_ABT_TYPE_MASK (0x3 << 0) -#define TRX_DFET_ABT_TYPE(p) (((p)&0x3) << 0) -#define GET_TRX_DFET_ABT_TYPE(p) (((p)&TRX_DFET_ABT_TYPE_MASK) >> 0) -#define TRX_PFET_ABT_TYPE_MASK (0x3 << 2) -#define TRX_PFET_ABT_TYPE(p) (((p)&0x3) << 2) -#define GET_TRX_PFET_ABT_TYPE(p) (((p)&TRX_PFET_ABT_TYPE_MASK) >> 2) -#define PDMA_DFET_PFET_ABT_TYPE_MASK (0x3 << 4) -#define PDMA_DFET_PFET_ABT_TYPE(p) (((p)&0x3) << 4) -#define GET_PDMA_DFET_PFET_ABT_TYPE(p) (((p)&PDMA_DFET_PFET_ABT_TYPE_MASK) >> 4) -#define PDMA_DFET_PFET_ABT_W_FULL_IN_DIS_MASK (0x1 << 6) -#define PDMA_DFET_PFET_ABT_W_FULL_IN_DIS(p) (((p)&0x1) << 6) -#define GET_PDMA_DFET_PFET_ABT_W_FULL_IN_DIS(p) \ - (((p)&PDMA_DFET_PFET_ABT_W_FULL_IN_DIS_MASK) >> 6) -#define REQ_MASK_DIS_MASK (0x1 << 7) -#define REQ_MASK_DIS(p) (((p)&0x1) << 7) -#define GET_REQ_MASK_DIS(p) (((p)&REQ_MASK_DIS_MASK) >> 7) -#define TXDMAD_PRI_WIN_DIS_MASK (0x1 << 8) -#define TXDMAD_PRI_WIN_DIS(p) (((p)&0x1) << 8) -#define GET_TXDMAD_PRI_WIN_DIS(p) (((p)&TXDMAD_PRI_WIN_DIS_MASK) >> 8) -#define RXDMAD_PRI_WIN_DIS_MASK (0x1 << 9) -#define RXDMAD_PRI_WIN_DIS(p) (((p)&0x1) << 9) -#define GET_RXDMAD_PRI_WIN_DIS(p) (((p)&RXDMAD_PRI_WIN_DIS_MASK) >> 9) -#define TXP_PRI_WIN_DIS_MASK (0x1 << 10) -#define TXP_PRI_WIN_DIS(p) (((p)&0x1) << 10) -#define GET_TXP_PRI_WIN_DIS(p) (((p)&TXP_PRI_WIN_DIS_MASK) >> 10) -#define TXD_PRI_WIN_DIS_MASK (0x1 << 11) -#define TXD_PRI_WIN_DIS(p) (((p)&0x1) << 11) -#define GET_TXD_PRI_WIN_DIS(p) (((p)&TXD_PRI_WIN_DIS_MASK) >> 11) -#define WRR_DIS_MASK (0x1 << 12) -#define WRR_DIS(p) (((p)&0x1) << 12) -#define GET_WRR_DIS(p) (((p)&WRR_DIS_MASK) >> 12) -#define D_SP_FIXED_PRI_MASK (0x7 << 13) -#define D_SP_FIXED_PRI(p) (((p)&0x7) << 13) -#define GET_D_SP_FIXED_PRI(p) (((p)&D_SP_FIXED_PRI_MASK) >> 13) -#define WRR_TIME_SLOT_DURATION_MASK (0xffff << 16) -#define WRR_TIME_SLOT_DURATION(p) (((p)&0xffff) << 16) -#define GET_WRR_TIME_SLOT_DURATION(p) (((p)&WRR_TIME_SLOT_DURATION_MASK) >> 16) - -#define MT_WPDMA_ABT_CFG1 (MT_HIF_BASE + 0x0534) -#define WRR_TIME_SLOT_PRIORITY_0_MASK (0x3 << 0) -#define WRR_TIME_SLOT_PRIORITY_0(p) (((p)&0x3) << 0) -#define GET_WRR_TIME_SLOT_PRIORITY_0(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_0_MASK) >> 0) -#define WRR_TIME_SLOT_PRIORITY_1_MASK (0x3 << 2) -#define WRR_TIME_SLOT_PRIORITY_1(p) (((p)&0x3) << 2) -#define GET_WRR_TIME_SLOT_PRIORITY_1(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_1_MASK) >> 2) -#define WRR_TIME_SLOT_PRIORITY_2_MASK (0x3 << 4) -#define WRR_TIME_SLOT_PRIORITY_2(p) (((p)&0x3) << 4) -#define GET_WRR_TIME_SLOT_PRIORITY_2(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_2_MASK) >> 4) -#define WRR_TIME_SLOT_PRIORITY_3_MASK (0x3 << 6) -#define WRR_TIME_SLOT_PRIORITY_3(p) (((p)&0x3) << 6) -#define GET_WRR_TIME_SLOT_PRIORITY_3(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_3_MASK) >> 6) -#define WRR_TIME_SLOT_PRIORITY_4_MASK (0x3 << 8) -#define WRR_TIME_SLOT_PRIORITY_4(p) (((p)&0x3) << 8) -#define GET_WRR_TIME_SLOT_PRIORITY_4(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_4_MASK) >> 8) -#define WRR_TIME_SLOT_PRIORITY_5_MASK (0x3 << 10) -#define WRR_TIME_SLOT_PRIORITY_5(p) (((p)&0x3) << 10) -#define GET_WRR_TIME_SLOT_PRIORITY_5(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_5_MASK) >> 10) -#define WRR_TIME_SLOT_PRIORITY_6_MASK (0x3 << 12) -#define WRR_TIME_SLOT_PRIORITY_6(p) (((p)&0x3) << 12) -#define GET_WRR_TIME_SLOT_PRIORITY_6(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_6_MASK) >> 12) -#define WRR_TIME_SLOT_PRIORITY_7_MASK (0x3 << 14) -#define WRR_TIME_SLOT_PRIORITY_7(p) (((p)&0x3) << 14) -#define GET_WRR_TIME_SLOT_PRIORITY_7(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_7_MASK) >> 14) -#define WRR_TIME_SLOT_PRIORITY_8_MASK (0x3 << 16) -#define WRR_TIME_SLOT_PRIORITY_8(p) (((p)&0x3) << 16) -#define GET_WRR_TIME_SLOT_PRIORITY_8(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_8_MASK) >> 16) -#define WRR_TIME_SLOT_PRIORITY_9_MASK (0x3 << 18) -#define WRR_TIME_SLOT_PRIORITY_9(p) (((p)&0x3) << 18) -#define GET_WRR_TIME_SLOT_PRIORITY_9(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_9_MASK) >> 18) -#define WRR_TIME_SLOT_PRIORITY_10_MASK (0x3 << 20) -#define WRR_TIME_SLOT_PRIORITY_10(p) (((p)&0x3) << 20) -#define GET_WRR_TIME_SLOT_PRIORITY_10(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_10_MASK) >> 20) -#define WRR_TIME_SLOT_PRIORITY_11_MASK (0x3 << 22) -#define WRR_TIME_SLOT_PRIORITY_11(p) (((p)&0x3) << 22) -#define GET_WRR_TIME_SLOT_PRIORITY_11(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_11_MASK) >> 22) -#define WRR_TIME_SLOT_PRIORITY_12_MASK (0x3 << 24) -#define WRR_TIME_SLOT_PRIORITY_12(p) (((p)&0x3) << 24) -#define GET_WRR_TIME_SLOT_PRIORITY_12(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_12_MASK) >> 24) -#define WRR_TIME_SLOT_PRIORITY_13_MASK (0x3 << 26) -#define WRR_TIME_SLOT_PRIORITY_13(p) (((p)&0x3) << 26) -#define GET_WRR_TIME_SLOT_PRIORITY_13(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_13_MASK) >> 26) -#define WRR_TIME_SLOT_PRIORITY_14_MASK (0x3 << 28) -#define WRR_TIME_SLOT_PRIORITY_14(p) (((p)&0x3) << 28) -#define GET_WRR_TIME_SLOT_PRIORITY_14(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_14_MASK) >> 28) -#define WRR_TIME_SLOT_PRIORITY_15_MASK (0x3 << 30) -#define WRR_TIME_SLOT_PRIORITY_15(p) (((p)&0x3) << 30) -#define GET_WRR_TIME_SLOT_PRIORITY_15(p) \ - (((p)&WRR_TIME_SLOT_PRIORITY_15_MASK) >> 30) - -#define K_GBL_1 (HIF_BASE + 0x3000) -#define HIF_K_GBL_CDC_IMP_MASK (1 << 23) -#define GET_HIF_K_GBL_CDC_IMP(p) (((p)&HIF_K_GBL_CDC_IMP_MASK) >> 23) - -#define K_CPL_RESOURCE (HIF_BASE + 0x3158) -#define HIF_K_RX_SPLIT_EN_MASK (1 << 16) -#define GET_HIF_K_RX_SPLIT_EN(p) (((p)&HIF_K_RX_SPLIT_EN_MASK) >> 16) - -#endif /* __MT_HIF_PCI_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic.h deleted file mode 100644 index 801f484159..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic.h +++ /dev/null @@ -1,689 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_asic.h - - Abstract: - Ralink Wireless Chip HW related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __ASIC_CTRL_H__ -#define __ASIC_CTRL_H__ - -#ifdef MT_MAC -#include "hw_ctrl/cmm_asic_mt.h" -#include "hw_ctrl/cmm_asic_mt_fw.h" -#endif /* MT_MAC */ - -#include "common/wifi_sys_info.h" - -struct _TX_BLK; -struct _RX_BLK; -struct freq_oper; -enum PACKET_TYPE; - -#define TX_RTY_CFG_RTY_LIMIT_SHORT 0x1 -#define TX_RTY_CFG_RTY_LIMIT_LONG 0x2 - -#define MINIMUM_POWER_VALUE -127 -#define TX_STREAM_PATH 4 -#define RX_STREAM_PATH_SINGLE_MODE 4 -#define RX_STREAM_PATH_DBDC_MODE 2 - -#define CHANNEL_BAND_2G 0 -#define CHANNEL_BAND_5G 1 - -#define CMW_RSSI_SOURCE_BBP 0 -#define CMW_RSSI_SOURCE_WTBL 1 - -#define CMW_RCPI_MA_1_1 1 -#define CMW_RCPI_MA_1_2 2 -#define CMW_RCPI_MA_1_4 4 -#define CMW_RCPI_MA_1_8 8 - -#define TX_DEFAULT_CSD_STATE 0 -#define TX_ZERO_CSD_STATE 1 -#define TX_UNDEFINED_CSD_STATE 0xFF - -#define TX_DEFAULT_POWER_STATE 0 -#define TX_BOOST_POWER_STATE 1 -#define TX_UNDEFINED_POWER_STATE 0xFF - -#define TX_DEFAULT_BW_STATE 0 -#define TX_SWITCHING_BW_STATE 1 -#define TX_UNDEFINED_BW_STATE 0xFF - -#define TX_DEFAULT_SPEIDX_STATE 0 -#define TX_SWITCHING_SPEIDX_STATE 1 -#define TX_UNDEFINED_SPEIDX_STATE 0xFF - -#define TX_DEFAULT_MAXIN_STATE 0 -#define TX_SPECIFIC_ACR_STATE 1 -#define TX_UNDEFINED_RXFILTER_STATE 0xFF - -#define TX_DEFAULT_TXSTREAM_STATE 0 -#define TX_SWITCHING_TXSTREAM_STATE 1 -#define TX_UNDEFINED_TXSTREAM_STATE 0xFF - -#define RX_DEFAULT_RCPI_STATE 0 -#define RX_SPECIFIC_RCPI_STATE 1 -#define RX_UNDEFINED_RCPI_STATE 0xFF - -#define RX_DEFAULT_RXSTREAM_STATE 15 -#define RX_RXSTREAM_WF0_STATE 1 -#define RX_RXSTREAM_WF1_STATE 2 -#define RX_RXSTREAM_WF2_STATE 4 -#define RX_RXSTREAM_WF3_STATE 8 -#define RX_RXSTREAM_WF01_STATE 3 -#define RX_RXSTREAM_WF02_STATE 5 -#define RX_RXSTREAM_WF03_STATE 9 -#define RX_RXSTREAM_WF12_STATE 6 -#define RX_RXSTREAM_WF13_STATE 10 -#define RX_RXSTREAM_WF23_STATE 12 -#define RX_RXSTREAM_WF012_STATE 7 -#define RX_RXSTREAM_WF013_STATE 11 -#define RX_RXSTREAM_WF023_STATE 13 -#define RX_RXSTREAM_WF123_STATE 14 -#define RX_UNDEFINED_RXSTREAM_STATE 0xFF - -#define CMW_POWER_UP_RATE_NUM 13 -#define CMW_POWER_UP_CATEGORY_NUM 4 - -#define LINK_TEST_AUTO_RSSI_THRESHOLD 0xFF - -VOID AsicNotSupportFunc(struct _RTMP_ADAPTER *pAd, const RTMP_STRING *caller); - -VOID AsicUpdateRtsThld(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UINT32 PktNumThrd, UINT32 PpduLengthThrd, - UINT32 retry_limit); -VOID AsicUpdateProtect(struct _RTMP_ADAPTER *pAd); - -INT AsicSetTxStream(struct _RTMP_ADAPTER *pAd, UINT32 StreamNum, UCHAR opmode, - BOOLEAN up, UCHAR BandIdx); -INT AsicSetRxStream(struct _RTMP_ADAPTER *pAd, UINT32 StreamNums, - UCHAR BandIdx); -INT AsicSetBW(struct _RTMP_ADAPTER *pAd, INT bw, UCHAR BandIdx); -INT AsicSetCtrlCh(struct _RTMP_ADAPTER *pAd, UINT8 extch); -#ifdef DOT11_VHT_AC -INT AsicSetRtsSignalTA(struct _RTMP_ADAPTER *pAd, UCHAR bw_sig); -#endif /* DOT11_VHT_AC */ -VOID AsicAntennaSelect(struct _RTMP_ADAPTER *pAd, UCHAR Channel); -VOID AsicResetBBPAgent(struct _RTMP_ADAPTER *pAd); -VOID AsicBBPAdjust(struct _RTMP_ADAPTER *pAd, UCHAR Channel); -VOID AsicSwitchChannel(struct _RTMP_ADAPTER *pAd, UCHAR band_idx, - struct freq_oper *oper, BOOLEAN bScan); - -INT AsicSetDevMac(struct _RTMP_ADAPTER *pAd, UCHAR *addr, UCHAR omac_idx); -VOID AsicSetBssid(struct _RTMP_ADAPTER *pAd, UCHAR *pBssid, - UCHAR curr_bssid_idx); -VOID AsicDelWcidTab(struct _RTMP_ADAPTER *pAd, UCHAR Wcid); - -#ifdef HTC_DECRYPT_IOT -VOID AsicSetWcidAAD_OM(struct _RTMP_ADAPTER *pAd, UCHAR Wcid, CHAR value); -#endif /* HTC_DECRYPT_IOT */ -#ifdef MBSS_AS_WDS_AP_SUPPORT -VOID AsicSetWcid4Addr_HdrTrans(struct _RTMP_ADAPTER *pAd, UCHAR Wcid, - UCHAR IsEnable); -#endif -#ifdef MAC_APCLI_SUPPORT -VOID AsicSetApCliBssid(struct _RTMP_ADAPTER *pAd, UCHAR *pBssid, UCHAR index); -#endif /* MAC_APCLI_SUPPORT */ - -INT AsicSetRxFilter(struct _RTMP_ADAPTER *pAd); - -VOID AsicSetTmrCR(struct _RTMP_ADAPTER *pAd, UCHAR enable, UCHAR BandIdx); - -#ifdef DOT11_N_SUPPORT -INT AsicSetRDG(struct _RTMP_ADAPTER *pAd, UCHAR wlan_idx, UCHAR band_idx, - UCHAR init, UCHAR resp); -#ifdef MT_MAC -INT AsicWtblSetRDG(struct _RTMP_ADAPTER *pAd, BOOLEAN bEnable); -INT AsicUpdateTxOP(struct _RTMP_ADAPTER *pAd, UINT32 ac_num, UINT32 txop_val); -#endif /* MT_MAC */ -#endif /* DOT11_N_SUPPORT */ - -INT AsicSetPreTbtt(struct _RTMP_ADAPTER *pAd, BOOLEAN enable, UCHAR HwBssidIdx); -INT AsicSetGPTimer(struct _RTMP_ADAPTER *pAd, BOOLEAN enable, UINT32 timeout); -INT AsicSetChBusyStat(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); -INT AsicGetTsfTime(struct _RTMP_ADAPTER *pAd, UINT32 *high_part, - UINT32 *low_part, UCHAR HwBssidIdx); - -VOID AsicSetSyncModeAndEnable(struct _RTMP_ADAPTER *pAd, USHORT BeaconPeriod, - UCHAR HWBssidIdx, UCHAR OPMode); - -VOID AsicDisableSync(struct _RTMP_ADAPTER *pAd, UCHAR HWBssidIdx); - -UINT32 AsicGetWmmParam(struct _RTMP_ADAPTER *pAd, UINT32 ac, UINT32 type); -INT AsicSetWmmParam(struct _RTMP_ADAPTER *pAd, UCHAR idx, UINT ac, UINT type, - UINT val); -VOID AsicSetEdcaParm(struct _RTMP_ADAPTER *pAd, PEDCA_PARM pEdcaParm, - struct wifi_dev *wdev); -INT AsicSetRetryLimit(struct _RTMP_ADAPTER *pAd, UINT32 type, UINT32 limit); -UINT32 AsicGetRetryLimit(struct _RTMP_ADAPTER *pAd, UINT32 type); -VOID AsicSetSlotTime(struct _RTMP_ADAPTER *pAd, BOOLEAN bUseShortSlotTime, - UCHAR channel, struct wifi_dev *wdev); -INT AsicSetMacMaxLen(struct _RTMP_ADAPTER *pAd); - -VOID AsicAddSharedKeyEntry(struct _RTMP_ADAPTER *pAd, IN UCHAR BssIdx, - IN UCHAR KeyIdx, IN PCIPHER_KEY pCipherKey); - -VOID AsicRemoveSharedKeyEntry(struct _RTMP_ADAPTER *pAd, UCHAR BssIdx, - UCHAR KeyIdx); - -VOID AsicUpdateRxWCIDTable(struct _RTMP_ADAPTER *pAd, USHORT WCID, UCHAR *pAddr, - BOOLEAN IsBCMCWCID, BOOLEAN IsReset); -VOID AsicUpdateBASession(struct _RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid, - UINT16 sn, UCHAR basize, BOOLEAN isAdd, INT ses_type); -UINT16 AsicGetTidSn(struct _RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid); - -#ifdef TXBF_SUPPORT -VOID AsicUpdateClientBfCap(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); -#endif /* TXBF_SUPPORT */ - -#ifdef MT_MAC -VOID AsicAddRemoveKeyTab(struct _RTMP_ADAPTER *pAd, - struct _ASIC_SEC_INFO *pInfo); -#endif - -#ifdef MCS_LUT_SUPPORT -VOID AsicMcsLutUpdate(struct _RTMP_ADAPTER *pAd, - struct _MAC_TABLE_ENTRY *pEntry); -#endif /* MCS_LUT_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -VOID AsicSetMbssMode(struct _RTMP_ADAPTER *pAd, UCHAR NumOfBcns); -VOID AsicSetMbssWdevIfAddr(struct _RTMP_ADAPTER *pAd, INT idx, UCHAR *if_addr, - INT opmode); -VOID AsicSetMbssWdevIfAddrGen2(struct _RTMP_ADAPTER *pAd, VOID *wdev_void, - INT opmode); -#endif /* CONFIG_AP_SUPPORT */ - -BOOLEAN AsicDisableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev); -BOOLEAN AsicEnableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev); -BOOLEAN AsicUpdateBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev, UINT16 FrameLen, - UCHAR UpdatePktType); - -INT32 AsicDevInfoUpdate(struct _RTMP_ADAPTER *pAd, UINT8 ucOwnMacIdx, - UINT8 *OwnMacAddr, UINT8 BandIdx, UINT8 Active, - UINT32 u4EnableFeature); - -INT32 AsicStaRecUpdate(RTMP_ADAPTER *pAd, STA_REC_CTRL_T *sta_rec_ctrl); - -INT32 AsicRaParamStaRecUpdate(struct _RTMP_ADAPTER *pAd, UINT8 WlanIdx, - struct _STAREC_AUTO_RATE_UPDATE_T *prParam, - UINT32 EnableFeature); - -INT32 AsicBssInfoUpdate(struct _RTMP_ADAPTER *pAd, - struct _BSS_INFO_ARGUMENT_T bss_info_argument); - -#define AsicBssInfoReNew(pAd, bss_info_argument) \ - AsicBssInfoUpdate(pAd, bss_info_argument) - -INT32 AsicExtPwrMgtBitWifi(struct _RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, - UINT8 ucPwrMgtBit); -INT32 AsicRadioOnOffCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - UINT8 ucRadio); -#ifdef GREENAP_SUPPORT -INT32 AsicGreenAPOnOffCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN ucGreenAPOn); -#endif /* GREENAP_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -INT32 asic_pcie_aspm_dym_ctrl(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN fgL1Enable, BOOLEAN fgL0sEnable); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ -INT32 AsicExtPmStateCtrl(struct _RTMP_ADAPTER *pAd, - struct _STA_ADMIN_CONFIG *pStaCfg, UINT8 ucPmNumber, - UINT8 ucPmState); -INT32 AsicExtWifiHifCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - UINT8 PmStatCtrl, VOID *pResult); - -INT32 AsicMccStart(struct _RTMP_ADAPTER *ad, UCHAR channel_1st, - UCHAR channel_2nd, UINT32 bw_1st, UINT32 bw_2nd, - UCHAR central_1st_seg0, UCHAR central_1st_seg1, - UCHAR central_2nd_seg0, UCHAR central_2nd_seg1, - UCHAR role_1st, UCHAR role_2nd, USHORT stay_time_1st, - USHORT stay_time_2nd, USHORT idle_time, - USHORT null_repeat_cnt, UINT32 start_tsf); - -INT32 AsicBfSoundingPeriodicTriggerCtrl(struct _RTMP_ADAPTER *pAd, - UINT32 WlanIdx, UINT8 On); -#ifdef THERMAL_PROTECT_SUPPORT -INT32 AsicThermalProtect(RTMP_ADAPTER *pAd, UINT8 HighEn, CHAR HighTempTh, - UINT8 LowEn, CHAR LowTempTh, UINT32 RechkTimer, - UINT8 RFOffEn, CHAR RFOffTh, UINT8 ucType); - -INT32 AsicThermalProtectAdmitDuty(RTMP_ADAPTER *pAd, UINT32 u4Lv0Duty, - UINT32 u4Lv1Duty, UINT32 u4Lv2Duty, - UINT32 u4Lv3Duty); -#endif /* THERMAL_PROTECT_SUPPORT */ - -INT AsicSendCommandToMcu(struct _RTMP_ADAPTER *pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic); - -BOOLEAN AsicSendCmdToMcuAndWait(struct _RTMP_ADAPTER *pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic); - -BOOLEAN AsicSendCommandToMcuBBP(struct _RTMP_ADAPTER *pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN FlgIsNeedLocked); - -#ifdef STREAM_MODE_SUPPORT -VOID AsicSetStreamMode(struct _RTMP_ADAPTER *pAd, IN PUCHAR pMacAddr, - IN INT chainIdx, IN BOOLEAN bEnabled); - -VOID AsicStreamModeInit(struct _RTMP_ADAPTER *pAd); -#endif /*STREAM_MODE_SUPPORT*/ - -VOID AsicUpdateAutoFallBackTable(struct _RTMP_ADAPTER *pAd, UCHAR *pTxRate); -INT AsicSetAutoFallBack(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); -INT AsicAutoFallbackInit(struct _RTMP_ADAPTER *pAd); - -VOID AsicSetPiggyBack(struct _RTMP_ADAPTER *pAd, BOOLEAN bPiggyBack); -VOID AsicGetTxTsc(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *pTxTsc); -VOID AsicSetSMPS(struct _RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR smps); -VOID AsicTurnOffRFClk(struct _RTMP_ADAPTER *pAd, UCHAR Channel); - -#ifdef MAC_REPEATER_SUPPORT -VOID AsicInsertRepeaterEntry(struct _RTMP_ADAPTER *pAd, IN UCHAR CliIdx, - IN PUCHAR pAddr); - -VOID AsicRemoveRepeaterEntry(struct _RTMP_ADAPTER *pAd, IN UCHAR CliIdx); - -#ifdef MT_MAC -VOID AsicInsertRepeaterRootEntry(struct _RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN UCHAR *pAddr, IN UCHAR ReptCliIdx); -#endif /* MT_MAC */ -#endif /* MAC_REPEATER_SUPPORT*/ - -INT32 AsicRxHeaderTransCtl(struct _RTMP_ADAPTER *pAd, BOOLEAN En, - BOOLEAN ChkBssid, BOOLEAN InSVlan, BOOLEAN RmVlan, - BOOLEAN SwPcP); -INT32 AsicRxHeaderTaranBLCtl(struct _RTMP_ADAPTER *pAd, UINT32 Index, - BOOLEAN En, UINT32 EthType); -INT AsicSetRxvFilter(RTMP_ADAPTER *pAd, BOOLEAN enable, UCHAR ucBandIdx); - -#ifdef CONFIG_AP_SUPPORT -VOID AsicSetMbssHwCRSetting(RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable); -VOID AsicSetExtMbssEnableCR(RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable); -VOID AsicSetExtTTTTHwCRSetting(RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable); -#endif /* CONFIG_AP_SUPPORT */ -INT32 AsicGetMacInfo(struct _RTMP_ADAPTER *pAd, UINT32 *ChipId, UINT32 *HwVer, - UINT32 *FwVer); -INT32 AsicGetAntMode(struct _RTMP_ADAPTER *pAd, UCHAR *AntMode); -INT32 AsicSetDmaByPassMode(struct _RTMP_ADAPTER *pAd, BOOLEAN isByPass); - -#ifdef DBDC_MODE -INT32 AsicSetDbdcCtrl(struct _RTMP_ADAPTER *pAd, - struct _BCTRL_INFO_T *pBctrlInfo); -INT32 AsicGetDbdcCtrl(struct _RTMP_ADAPTER *pAd, - struct _BCTRL_INFO_T *pBctrlInfo); -#endif /*DBDC_MODE*/ - -VOID AsicNotSupportFunc(struct _RTMP_ADAPTER *pAd, const RTMP_STRING *caller); - -#ifdef IGMP_SNOOP_SUPPORT -BOOLEAN AsicMcastEntryInsert(struct _RTMP_ADAPTER *pAd, PUCHAR GrpAddr, - UINT8 BssIdx, UINT8 Type, PUCHAR MemberAddr, - PNET_DEV dev, UINT8 WlanIndex); -BOOLEAN AsicMcastEntryDelete(struct _RTMP_ADAPTER *pAd, PUCHAR GrpAddr, - UINT8 BssIdx, PUCHAR MemberAddr, PNET_DEV dev, - UINT8 WlanIndex); -#ifdef IGMP_TVM_SUPPORT -BOOLEAN AsicMcastConfigAgeOut(RTMP_ADAPTER *pAd, UINT8 AgeOutTime, - UINT8 omac_idx); -BOOLEAN AsicMcastGetMcastTable(RTMP_ADAPTER *pAd, UINT8 ucOwnMacIdx, - struct wifi_dev *wdev); -#endif /* IGMP_TVM_SUPPORT */ -#endif - -VOID RssiUpdate(struct _RTMP_ADAPTER *pAd); - -#ifdef ETSI_RX_BLOCKER_SUPPORT -VOID CheckRssi(struct _RTMP_ADAPTER *pAd); -#endif /* end of ETSI_RX_BLOCKER_SUPPORT */ - -INT asic_rts_on_off(struct wifi_dev *wdev, BOOLEAN rts_en); -INT AsicAmpduEfficiencyAdjust(struct wifi_dev *wdev, UCHAR aifs_adjust); -/** - * arch operation HAL - * @check_hw_resource: check hw resource if enough or not for TX. - * @indicate_tx_resource_state: indicate hw resource in safe region or not - * @hw_tx: fill hw descriptor and kick out to hw resource for data frame - * @mlme_hw_tx: fill hw descriptor and kick out to hw resource for mlme frame - * @ate_hw_tx: fill hw descriptor and kick out to hw resource for ate frame - * @write_tx_resource:HIF resource arrangement for MSDU TX packet transfer. - * @write_multi_tx_resource:HIF resource arrangement for A-MSDU TX packet transfer. - * @write_final_tx_resource:HIF resource arrangement for A-MSDU TX packet transfer - * for total bytes update in tx hw header. - * @write_frag_tx_resource:HIF resource arrangement for fragment TX packet transfer - * @kickout_data_tx: TX data packet kick-out to HW to start transfer. - * @write_tmac_info_fixed_rate: per 802.11/802.3 frame TMAC descriptor handle that use fixed rate. - * @write_tmac_info: per 802.11/802.3 frame TMAC descriptor handle. - * @write txp_info: per 802.11/802.3 data frame TMAC data information (address and length) handle. - * @rx_pkt_process: per rx packet handle (build RX_BLK and packet processing). - * @get_pkt_from_rx_resource: get RX packet from HIF resource. - * @get_tx_resource_free_num: get tx data HIF resource available numbers - * @inc_resource_full_cnt: increase HIF resource full count - * @get_resource_state: get HIF resource number state - * @set_resource_state: set HIF resource number state - * @check_resource_state: check HIF resource number state change - * @get_mgmt_resource_free_num: get management HIF resource available numbers - * @get_bcn_resource_free_num: get beacon HIF resource available numbers - * @get_cmd_resource_free_num: get command HIF resource available numbers - * @get_fw_loading_resource_free_num: get fw loading HIF resource available numbers - * @get_hif_buf: get one available HIF pre-allocated dma region for hw header - * @is_tx_resource_empty: check if tx data HIF resource is empty or not - * @is_rx_resource_full: check if rx HIF resource is full or not - * @get_rx_resource_pending_num: get rx HIF resource pending numbers - * @hw_isr: process interrupt service routine - */ -typedef struct _RTMP_ARCH_OP { - UINT32 (*archGetCrcErrCnt)(struct _RTMP_ADAPTER *pAd); - UINT32 (*archGetCCACnt)(struct _RTMP_ADAPTER *pAd); - UINT32 (*archGetChBusyCnt)(struct _RTMP_ADAPTER *pAd, UCHAR ch_idx); - INT (*archSetAutoFallBack)(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); - INT (*archAutoFallbackInit)(struct _RTMP_ADAPTER *pAd); - VOID(*archUpdateProtect) - (struct _RTMP_ADAPTER *pAd, MT_PROTECT_CTRL_T *Protect); - VOID(*archUpdateRtsThld) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR pkt_thld, - UINT32 len_thld, UCHAR retry_limit); -#ifdef DOT11_N_SUPPORT - INT (*archSetRDG)(struct _RTMP_ADAPTER *pAd, MT_RDG_CTRL_T *Rdg); -#endif /* DOT11_N_SUPPORT */ - VOID(*archSwitchChannel) - (struct _RTMP_ADAPTER *pAd, MT_SWITCH_CHANNEL_CFG SwChCfg); - VOID (*archResetBBPAgent)(struct _RTMP_ADAPTER *pAd); - - INT32(*archSetDevMac) - (struct _RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, UINT8 *OwnMacAddr, - UINT8 BandIdx, UINT8 Active, UINT32 EnableFeature); - - INT32(*archSetBssid) - (struct _RTMP_ADAPTER *pAd, - struct _BSS_INFO_ARGUMENT_T bss_info_argument); - - INT32 (*archSetStaRec)(struct _RTMP_ADAPTER *pAd, STA_REC_CFG_T StaCfg); - VOID (*archDelWcidTab)(struct _RTMP_ADAPTER *pAd, UCHAR wcid_idx); -#ifdef HTC_DECRYPT_IOT - VOID(*archSetWcidAAD_OM) - (struct _RTMP_ADAPTER *pAd, UCHAR wcid_idx, UCHAR value); -#endif /* HTC_DECRYPT_IOT */ - -#ifdef MBSS_AS_WDS_AP_SUPPORT - VOID(*archSetWcid4Addr_HdrTrans) - (struct _RTMP_ADAPTER *pAd, UCHAR wcid_idx, UCHAR IsEnable, - UCHAR IsApcliEntry); -#endif - VOID(*archAddRemoveKeyTab) - (struct _RTMP_ADAPTER *pAd, struct _ASIC_SEC_INFO *pInfo); - - BOOLEAN (*archEnableBeacon)(struct _RTMP_ADAPTER *pAd, VOID *wdev_void); - BOOLEAN(*archDisableBeacon) - (struct _RTMP_ADAPTER *pAd, VOID *wdev_void); - BOOLEAN(*archUpdateBeacon) - (struct _RTMP_ADAPTER *pAd, VOID *wdev_void, UINT16 FrameLen, - UCHAR UpdatePktType); - -#ifdef CONFIG_AP_SUPPORT - VOID (*archSetMbssMode)(struct _RTMP_ADAPTER *pAd, UCHAR NumOfBcns); -#endif /* CONFIG_AP_SUPPORT */ -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - INT (*archSetReptFuncEnable)(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); - VOID(*archInsertRepeaterEntry) - (struct _RTMP_ADAPTER *pAd, UCHAR CliIdx, PUCHAR pAddr); - VOID(*archRemoveRepeaterEntry) - (struct _RTMP_ADAPTER *pAd, UCHAR CliIdx); - VOID(*archInsertRepeaterRootEntry) - (struct _RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR *pAddr, UCHAR ReptCliIdx); -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ - - INT(*archSetRxFilter) - (struct _RTMP_ADAPTER *pAd, MT_RX_FILTER_CTRL_T RxFilter); - VOID (*archSetPiggyBack)(struct _RTMP_ADAPTER *pAd, BOOLEAN bPiggyBack); - INT(*archSetPreTbtt) - (struct _RTMP_ADAPTER *pAd, BOOLEAN bEnable, UCHAR HwBssidIdx); - INT(*archSetGPTimer) - (struct _RTMP_ADAPTER *pAd, BOOLEAN enable, UINT32 timeout); - INT (*archSetChBusyStat)(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); - INT(*archGetTsfTime) - (struct _RTMP_ADAPTER *pAd, UINT32 *high_part, UINT32 *low_part, - UCHAR HwBssidIdx); - - VOID (*archDisableSync)(struct _RTMP_ADAPTER *pAd, UCHAR HWBssidIdx); - - VOID(*archSetSyncModeAndEnable) - (struct _RTMP_ADAPTER *pAd, USHORT BeaconPeriod, UCHAR HWBssidIdx, - UCHAR OPMode); - - INT(*archSetWmmParam) - (struct _RTMP_ADAPTER *pAd, UCHAR idx, UINT ac, UINT type, UINT val); - VOID(*archSetEdcaParm) - (struct _RTMP_ADAPTER *pAd, struct _EDCA_PARM *pEdcaParm); - UINT32(*archGetWmmParam) - (struct _RTMP_ADAPTER *pAd, UINT32 AcNum, UINT32 EdcaType); - INT(*archSetRetryLimit) - (struct _RTMP_ADAPTER *pAd, UINT32 type, UINT32 limit); - UINT32 (*archGetRetryLimit)(struct _RTMP_ADAPTER *pAd, UINT32 type); - VOID(*archSetSlotTime) - (struct _RTMP_ADAPTER *pAd, UINT32 SlotTime, UINT32 SifsTime, - UCHAR BandIdx); - INT (*archSetMacMaxLen)(struct _RTMP_ADAPTER *pAd); - VOID(*archGetTxTsc) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR *pTxTsc); - VOID(*archAddSharedKeyEntry) - (struct _RTMP_ADAPTER *pAd, UCHAR BssIndex, UCHAR KeyIdx, - struct _CIPHER_KEY *pCipherKey); - VOID(*archRemoveSharedKeyEntry) - (struct _RTMP_ADAPTER *pAd, UCHAR BssIndex, UCHAR KeyIdx); - VOID(*archAddPairwiseKeyEntry) - (struct _RTMP_ADAPTER *pAd, UCHAR WCID, PCIPHER_KEY pCipherKey); - -#ifdef MCS_LUT_SUPPORT - VOID(*archMcsLutUpdate) - (struct _RTMP_ADAPTER *pAd, struct _MAC_TABLE_ENTRY *pEntry); -#endif /* MCS_LUT_SUPPORT */ - - INT(*archSetRtsSignalTA) - (struct _RTMP_ADAPTER *pAd, UINT8 BandIdx, BOOLEAN Enable); - INT(*archSetRxStream) - (struct _RTMP_ADAPTER *pAd, UINT32 rx_path, UCHAR BandIdx); - INT(*archSetTxStream) - (struct _RTMP_ADAPTER *pAd, UINT32 rx_path, UCHAR BandIdx); - INT (*archSetBW)(struct _RTMP_ADAPTER *pAd, INT bw, UCHAR BandIdx); - INT (*archSetCtrlCh)(struct _RTMP_ADAPTER *pAd, UINT8 extch); - VOID(*archSetApCliBssid) - (struct _RTMP_ADAPTER *pAd, UCHAR *pBssid, UCHAR index); - INT (*archWaitMacTxRxIdle)(struct _RTMP_ADAPTER *pAd); - INT(*archSetMacTxRx) - (struct _RTMP_ADAPTER *pAd, INT txrx, BOOLEAN enable, UCHAR BandIdx); - INT(*archSetRxvFilter) - (struct _RTMP_ADAPTER *pAd, BOOLEAN enable, UCHAR BandIdx); - INT(*archSetMacTxQ) - (struct _RTMP_ADAPTER *pAd, INT WmmSet, INT band, BOOLEAN Enable); - INT (*archSetMacWD)(struct _RTMP_ADAPTER *pAd); - INT (*archTOPInit)(struct _RTMP_ADAPTER *pAd); - VOID(*archSetTmrCR) - (struct _RTMP_ADAPTER *pAd, UCHAR enable, UCHAR BandIdx); - -#ifdef CONFIG_AP_SUPPORT - VOID(*archSetMbssWdevIfAddr) - (struct _RTMP_ADAPTER *pAd, INT idx, UCHAR *if_addr, INT opmode); - VOID(*archSetMbssHwCRSetting) - (struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable); - VOID(*archSetExtTTTTHwCRSetting) - (struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable); - VOID(*archSetExtMbssEnableCR) - (struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, BOOLEAN enable); -#endif - -#ifdef DBDC_MODE - INT(*archSetDbdcCtrl) - (struct _RTMP_ADAPTER *pAd, struct _BCTRL_INFO_T *pBctrInfo); - INT(*archGetDbdcCtrl) - (struct _RTMP_ADAPTER *pAd, struct _BCTRL_INFO_T *pBctrInfo); -#endif - - VOID(*archUpdateRxWCIDTable) - (struct _RTMP_ADAPTER *pAd, MT_WCID_TABLE_INFO_T WtblInfo); - -#ifdef TXBF_SUPPORT - VOID(*archUpdateClientBfCap) - (struct _RTMP_ADAPTER *pAd, struct _MAC_TABLE_ENTRY *pEntry); -#endif - -#ifdef MT_MAC - INT32(*archUpdateBASession) - (struct _RTMP_ADAPTER *pAd, MT_BA_CTRL_T BaCtrl); - UINT16(*archGetTidSn) - (struct _RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid); -#endif /*MT_MAC */ - INT32(*archUpdateStaRecBa) - (struct _RTMP_ADAPTER *pAd, STA_REC_BA_CFG_T StaRecCfg); - VOID (*archSetSMPS)(struct _RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR smps); - INT32(*archRxHeaderTransCtl) - (struct _RTMP_ADAPTER *pAd, BOOLEAN En, BOOLEAN ChkBssid, - BOOLEAN InSVlan, BOOLEAN RmVlan, BOOLEAN SwPcP); - INT32(*archRxHeaderTaranBLCtl) - (struct _RTMP_ADAPTER *pAd, UINT32 Index, BOOLEAN En, UINT32 EthType); - - /* ISR */ - VOID (*hw_isr)(struct _RTMP_ADAPTER *pAd) ____cacheline_aligned; - BOOLEAN (*tx_dma_done_handle)(struct _RTMP_ADAPTER *pAd, UINT8 hif_idx); - BOOLEAN(*cmd_dma_done_handle) - (struct _RTMP_ADAPTER *pAd, UINT8 hif_idx); - BOOLEAN(*fwdl_dma_done_handle) - (struct _RTMP_ADAPTER *pAd, UINT8 hif_idx); - - /* TX */ - UINT32(*get_resource_idx) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - enum PACKET_TYPE pkt_type, UINT8 que_idx) ____cacheline_aligned; - - INT(*check_hw_resource) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, UCHAR resource_idx); - - VOID(*inc_resource_full_cnt) - (struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); - BOOLEAN(*get_resource_state) - (struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); - INT(*set_resource_state) - (struct _RTMP_ADAPTER *pAd, UINT8 resource_idx, BOOLEAN state); - UINT32(*check_resource_state) - (struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); - UINT32(*get_tx_resource_free_num) - (struct _RTMP_ADAPTER *pAd, UINT8 que_idx); - - UCHAR *(*get_hif_buf)(struct _RTMP_ADAPTER *pAd, struct _TX_BLK *tx_blk, - UINT8 hif_idx, UCHAR frame_type); - INT (*hw_tx)(struct _RTMP_ADAPTER *ad, struct _TX_BLK *tx_blk); - VOID(*write_tmac_info) - (struct _RTMP_ADAPTER *pAd, UCHAR *buf, struct _TX_BLK *pTxBlk); - INT32(*write_txp_info) - (struct _RTMP_ADAPTER *pAd, UCHAR *buf, struct _TX_BLK *pTxBlk); - USHORT(*write_tx_resource) - (struct _RTMP_ADAPTER *pAd, struct _TX_BLK *pTxBlk, BOOLEAN bIsLast, - USHORT *FreeNumber); - VOID(*kickout_data_tx) - (struct _RTMP_ADAPTER *pAd, struct _TX_BLK *tx_blk, UCHAR que_idx); - USHORT(*write_multi_tx_resource) - (struct _RTMP_ADAPTER *pAd, struct _TX_BLK *pTxBlk, UCHAR frameNum, - USHORT *FreeNumber); - VOID(*write_final_tx_resource) - (struct _RTMP_ADAPTER *pAd, struct _TX_BLK *pTxBlk, - USHORT totalMPDUSize, USHORT FirstTxIdx); - USHORT(*write_frag_tx_resource) - (struct _RTMP_ADAPTER *pAd, struct _TX_BLK *pTxBlk, UCHAR fragNum, - USHORT *FreeNumber); - INT(*mlme_hw_tx) - (struct _RTMP_ADAPTER *pAd, UCHAR *tmac_info, MAC_TX_INFO *info, - HTTRANSMIT_SETTING *pTransmit, struct _TX_BLK *tx_blk); -#ifdef CONFIG_ATE - INT32(*ate_hw_tx) - (struct _RTMP_ADAPTER *pAd, struct _TMAC_INFO *info, - struct _TX_BLK *tx_blk); -#endif - VOID(*write_tmac_info_fixed_rate) - (struct _RTMP_ADAPTER *pAd, UCHAR *tmac_info, MAC_TX_INFO *info, - HTTRANSMIT_SETTING *pTransmit); - - /* RX */ - BOOLEAN(*rx_done_handle) - (struct _RTMP_ADAPTER *pAd) ____cacheline_aligned; - VOID *(*get_pkt_from_rx_resource)(struct _RTMP_ADAPTER *pAd, - BOOLEAN *re_schedule, - UINT32 *rx_pending, UCHAR ring_no); - VOID *(*get_pkt_from_rx1_resource)(struct _RTMP_ADAPTER *pAd, - BOOLEAN *re_schedule, - UINT32 *rx_pending, UCHAR ring_no); - UINT32(*rx_pkt_process) - (struct _RTMP_ADAPTER *pAd, UINT8 hif_idx, struct _RX_BLK *pRxBlk, - VOID *pRxPacket); -#ifdef IGMP_SNOOP_SUPPORT - BOOLEAN(*archMcastEntryInsert) - (RTMP_ADAPTER *pAd, PUCHAR GrpAddr, UINT8 BssIdx, UINT8 Type, - PUCHAR MemberAddr, PNET_DEV dev, UINT8 WlanIndex); - BOOLEAN(*archMcastEntryDelete) - (RTMP_ADAPTER *pAd, PUCHAR GrpAddr, UINT8 BssIdx, PUCHAR MemberAddr, - PNET_DEV dev, UINT8 WlanIndex); -#ifdef IGMP_TVM_SUPPORT - BOOLEAN(*archMcastConfigAgeout) - (RTMP_ADAPTER *pAd, UINT8 AgeOutTime, UINT8 ucOwnMacIdx); - BOOLEAN(*archMcastGetMcastTable) - (RTMP_ADAPTER *pAd, UINT8 ucOwnMacIdx, struct wifi_dev *wdev); -#endif /* IGMP_TVM_SUPPORT */ -#endif - INT(*asic_rts_on_off) - (struct _RTMP_ADAPTER *ad, UCHAR band_idx, UINT32 rts_num, - UINT32 rts_len, BOOLEAN rts_en); - INT(*asic_ampdu_efficiency_on_off) - (struct _RTMP_ADAPTER *ad, UCHAR wmm_idx, UCHAR aifs_adjust); - /* red related handlers */ - bool (*archRedMarkPktDrop)(UINT8 ucWlanIdx, UINT8 ucQidx, - struct _RTMP_ADAPTER *pAd); - VOID (*archRedRecordCP)(UINT8 ucWlanIdx, struct _RTMP_ADAPTER *pAd); - VOID(*archRedEnqueueFail) - (UINT8 ucWlanIdx, UINT8 ucQidx, struct _RTMP_ADAPTER *pAd); - - VOID (*arch_bss_beacon_exit)(struct _RTMP_ADAPTER *pAd); - VOID (*arch_bss_beacon_stop)(struct _RTMP_ADAPTER *pAd); - VOID (*arch_bss_beacon_start)(struct _RTMP_ADAPTER *pAd); - VOID (*arch_bss_beacon_init)(struct _RTMP_ADAPTER *pAd); -} RTMP_ARCH_OP; - -BOOLEAN asic_bss_beacon_exit(struct _RTMP_ADAPTER *pAd); -BOOLEAN asic_bss_beacon_stop(struct _RTMP_ADAPTER *pAd); -BOOLEAN asic_bss_beacon_start(struct _RTMP_ADAPTER *pAd); -BOOLEAN asic_bss_beacon_init(struct _RTMP_ADAPTER *pAd); - -#ifdef ETSI_RX_BLOCKER_SUPPORT -UINT8 ETSIWbRssiCheck(RTMP_ADAPTER *pAd); -#endif /* ETSI_RX_BLOCKER_SUPPORT */ - -#endif /* __ASIC_CTRL_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic_mt.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic_mt.h deleted file mode 100644 index 6d3a4ca74f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic_mt.h +++ /dev/null @@ -1,691 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_asic_mt.h - - Abstract: - Ralink Wireless Chip HW related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __CMM_ASIC_MT_H__ -#define __CMM_ASIC_MT_H__ - -struct _RTMP_ADAPTER; -struct _MAC_TABLE_ENTRY; -struct _CIPHER_KEY; -struct _MT_TX_COUNTER; -struct _EDCA_PARM; -struct _EXT_CMD_CHAN_SWITCH_T; -struct _BCTRL_INFO_T; -struct _RX_BLK; -struct _BSS_INFO_ARGUMENT_T; - -/* SIFS time, 20us, and assume bcn len is 512 byte, tx by 1Mbps.*/ -#define BCN_TRANSMIT_ESTIMATE_TIME (4096 + 20) - -typedef enum { - MT_BSS_MODE_AP = 0, - MT_BSS_MODE_ADHOC, - MT_BSS_MODE_STA, -} MT_BSS_OP_MODE_T; - -typedef struct { - UINT8 BssSet; /*HW Bssid Set: 0~3*/ - UINT8 MbssidIdx; /*Virtual Multi BSSID index: 0~15*/ - UINT8 PreTbttInterval; - USHORT BeaconPeriod; - USHORT DtimPeriod; - MT_BSS_OP_MODE_T BssOpMode; - UCHAR BandIdx; -} MT_BSS_SYNC_CTRL_T; - -typedef enum { - NO_PROTECT = 0, - PROTECT_MIX_MODE = 1, - PROTECT_HT40_ONLY = 2, - PROTECT_HT40_HT20 = 3, - PROTECT_MODE_END = 8 -} PROTECT_OP_MODE_T; - -#define ERP_DISABLE 0 -#define ERP_OMAC0 (1 << 0) -#define ERP_OMAC1 (1 << 1) -#define ERP_OMAC2 (1 << 2) -#define ERP_OMAC3 (1 << 3) -#define ERP_OMAC4 (1 << 4) -#define ERP_OMAC_ALL \ - ((ERP_OMAC0) | (ERP_OMAC1) | (ERP_OMAC2) | (ERP_OMAC3) | (ERP_OMAC4)) -typedef struct { - /* for hdev */ - UINT8 band_idx; - UINT8 long_nav; - UINT8 mix_mode; - UINT8 gf; - UINT8 rifs; - UINT8 bw40; - UINT8 bw80; - UINT8 bw160; - UINT16 erp_mask; -} MT_PROTECT_CTRL_T; - -#define PKT_NUM_THLD(x) (((x) >> 25) - 1) -#define PKT_LEN_THLD(x) ((x)&0xfffff) -typedef struct { - UINT8 band_idx; - UINT32 pkt_len_thld; - UINT16 pkt_num_thld; - UINT16 retry_limit; -} MT_RTS_THRESHOLD_T; - -#define RDG_DISABLE 0x0 -#define RDG_INITIATOR (1 << 0) -#define RDG_RESPONDER (1 << 1) -#define RDG_BOTH (RDG_INITIATOR | RDG_RESPONDER) -typedef struct _MT_RDG_CTRL_T { - UINT8 WlanIdx; - UINT8 BandIdx; - UINT8 Init; - UINT8 Resp; - UINT8 LongNav; - UINT32 Txop; -} MT_RDG_CTRL_T, *P_MT_RDG_CTRL_T; - -typedef struct _MT_SWITCH_CHANNEL_CFG { - UCHAR ControlChannel; - /*Only used for 80+80 case*/ - UCHAR ControlChannel2; - UCHAR CentralChannel; - UCHAR Bw; - UCHAR TxStream; - UCHAR RxStream; - BOOLEAN bScan; -#ifdef COMPOS_TESTMODE_WIN - BOOLEAN isMCC; -#endif -#ifdef MT_DFS_SUPPORT - BOOLEAN bDfsCheck; -#endif - UCHAR BandIdx; - UCHAR Channel_Band; - UINT32 OutBandFreq; -} MT_SWITCH_CHANNEL_CFG; - -typedef enum { - RX_STBC_BCN_BC_MC = 1 << 0, - RX_FCS_ERROR = 1 << 1, - RX_PROTOCOL_VERSION = 1 << 2, /*drop 802.11 protocol version not is 0*/ - RX_PROB_REQ = 1 << 3, - RX_MC_ALL = 1 << 4, /*drop all mcast frame*/ - RX_BC_ALL = 1 << 5, - RX_MC_TABLE = 1 - << 6, /*drop mcast frame that is not in the mcast table*/ - RX_BC_MC_OWN_MAC_A3 = - 1 - << 7, /*drop bc/mc packet matches the following condition: ToDS=0,FromDS=1,A3=OwnMAC0 or OwnMAC1*/ - RX_BC_MC_DIFF_BSSID_A3 = - 1 - << 8, /*drop bc/mc packet matches the following condition: ToDS=0,FromDS=0,A3!=BSSID0 or BSSID1*/ - RX_BC_MC_DIFF_BSSID_A2 = - 1 - << 9, /*drop bc/mc packet matches the following condition: ToDS=0,FromDS=1,A2!=BSSID0 or BSSID1*/ - RX_BCN_DIFF_BSSID = 1 - << 10, /*drop bcn packet and A3!=BSSID0 or BSSID1*/ - RX_CTRL_RSV = 1 << 11, /*drop control packets with reserve type*/ - RX_CTS = 1 << 12, - RX_RTS = 1 << 13, - RX_DUPLICATE = - 1 - << 14, /*drop duplicate frame, BA session not includign in this filter*/ - RX_NOT_OWN_BSSID = 1 << 15, /*drop not my BSSID0/1/2/3 if enabled*/ - RX_NOT_OWN_UCAST = - 1 << 16, /*drop uncast packet not to OWN MAC 0/1/2/3/4*/ - RX_NOT_OWN_BTIM = 1 << 17, /*drop diff bassid TIM broadcast*/ - RX_NDPA = 1 << 18, /*drop NDPA control frame*/ -} MT_RX_FILTER_T; - -typedef struct { - UINT32 filterMask; - BOOLEAN bPromiscuous; - BOOLEAN bFrameReport; - UCHAR u1BandIdx; -} MT_RX_FILTER_CTRL_T; - -typedef enum _BA_SESSION_TYPE { - BA_SESSION_INV = 0, - BA_SESSION_ORI = 1, - BA_SESSION_RECP = 2, -} BA_SESSION_TYPE; - -typedef struct _MT_BA_CTRL_T { - UCHAR Wcid; - UCHAR Tid; - UCHAR BaWinSize; - BOOLEAN isAdd; - UINT8 band_idx; - BA_SESSION_TYPE BaSessionType; - UCHAR PeerAddr[MAC_ADDR_LEN]; - UINT16 Sn; /*Sequence number for a specific TID*/ -} MT_BA_CTRL_T, *P_MT_BA_CTRL_T; - -typedef enum { - MT_WCID_TYPE_AP, - MT_WCID_TYPE_CLI, - MT_WCID_TYPE_APCLI, - MT_WCID_TYPE_BMCAST, - MT_WCID_TYPE_APCLI_MCAST, - MT_WCID_TYPE_REPEATER, - MT_WCID_TYPE_WDS, -} MT_WCID_TYPE_T; - -typedef struct { - USHORT Wcid; - USHORT Aid; - UINT8 BssidIdx; - UINT8 MacAddrIdx; - UINT8 SmpsMode; - UINT8 MaxRAmpduFactor; - UINT8 MpduDensity; - UINT8 aad_om; - UINT8 dyn_bw; - MT_WCID_TYPE_T WcidType; - UCHAR Addr[MAC_ADDR_LEN]; - UINT32 CipherSuit; - UCHAR PfmuId; - UCHAR spe_idx; - UCHAR gid; - UCHAR rca2; - UCHAR rv; - BOOLEAN fgTiBf; - BOOLEAN fgTeBf; - BOOLEAN fgTibfVht; - BOOLEAN fgTebfVht; - BOOLEAN SupportHT; - BOOLEAN SupportVHT; - BOOLEAN SupportRDG; - BOOLEAN SupportQoS; - BOOLEAN DisRHTR; - BOOLEAN IsReset; -#ifdef A4_CONN - BOOLEAN a4_enable; -#endif - BOOLEAN SkipClearPrevSecKey; -#ifdef MBSS_AS_WDS_AP_SUPPORT - BOOLEAN fg4AddrEnable; -#endif -} MT_WCID_TABLE_INFO_T; - -typedef enum _ENUM_CIPHER_SUIT_T { - CIPHER_SUIT_NONE = 0, - CIPHER_SUIT_WEP_40, - CIPHER_SUIT_TKIP_W_MIC, - CIPHER_SUIT_TKIP_WO_MIC, - CIPHER_SUIT_CCMP_W_MIC, /* for DFP or 802.11w MFP */ - CIPHER_SUIT_WEP_104, - CIPHER_SUIT_BIP, - CIPHER_SUIT_WEP_128 = 7, - CIPHER_SUIT_WPI, - CIPHER_SUIT_CCMP_W_MIC_FOR_CCX = 9, /* for DFP or CCX MFP */ - CIPHER_SUIT_CCMP_256, - CIPHER_SUIT_GCMP_128, - CIPHER_SUIT_GCMP_256 -} ENUM_CIPHER_SUIT_T256, - *P_ENUM_CIPHER_SUIT_T; - -typedef struct _SW_CIPHER_ID_MAP_HW_ID_T { - NDIS_802_11_WEP_STATUS sw_id; - ENUM_CIPHER_SUIT_T256 hw_id; -} SW_CIPHER_ID_MAP_HW_ID_T, *PSW_CIPHER_ID_MAP_HW_ID_T; - -/* The security mode definition in MAC register */ -typedef enum { - CIPHER_NONE = 0, - CIPHER_WEP64 = 1, - CIPHER_WEP128 = 2, - CIPHER_TKIP = 3, - CIPHER_AES = 4, - CIPHER_CKIP64 = 5, - CIPHER_CKIP128 = 6, - CIPHER_CKIP152 = 7, - CIPHER_SMS4 = 8, - CIPHER_WEP152 = 9, - CIPHER_BIP = 10, - CIPHER_WAPI = 11, - CIPHER_TKIP_NO_MIC = 12, -} MT_SEC_CIPHER_SUITS_T; - -typedef struct { - BOOLEAN isAdd; - UCHAR BssIdx; - UCHAR Wcid; - MT_SEC_CIPHER_SUITS_T KeyType; - UCHAR KeyIdx; - MT_BSS_OP_MODE_T OpMode; - struct _CIPHER_KEY *pCipherKey; - UCHAR PeerAddr[MAC_ADDR_LEN]; -} MT_SECURITY_CTRL; - -typedef struct _MT_TX_COUNTER { - UINT32 TxCount; - UINT32 TxFailCount; - UINT16 Rate1TxCnt; - UINT16 Rate1FailCnt; - UINT16 Rate2OkCnt; - UINT16 Rate3OkCnt; - UCHAR Rate2TxCnt; - UCHAR Rate3TxCnt; - UCHAR Rate4TxCnt; - UCHAR Rate5TxCnt; - UCHAR RateIndex; -} MT_TX_COUNTER; - -typedef enum _MCU_STAT { - METH1_RAM_CODE, - METH1_ROM_CODE, - METH3_FW_RELOAD, - METH3_INIT_STAT, - METH3_FW_PREPARE_LOAD, - METH3_FW_RUN, - MCU_STAT_END -} MCU_STAT; - -typedef struct { - INT mode; /*0: LMAC,1: BYPASS, 2: HyBrid",*/ - BOOLEAN bBeaconSpecificGroup; /*is want to allocate a specific group for beacon frame*/ -} MT_DMASCH_CTRL_T; - -/* mapping table entry for tttt cr and HW_bssid_idx*/ -typedef struct _TTTT_CR_BSSID_IDX_MAP_T { - UINT32 u4HwBssidIdx; - UINT32 u4TTTTEnableCr; - UINT32 u4TTTTIntervalCr; -} TTTT_CR_BSSID_IDX_MAP_T, *PTTTT_CR_BSSID_IDX_MAP_T; - -typedef enum _HWBSSID_TABLE { - HW_BSSID_0 = 0, - HW_BSSID_1, - HW_BSSID_2, - HW_BSSID_3, - HW_BSSID_MAX -} HWBSSID_TABLE; - -#define BA_SN_MSK 0xfff -enum _TID_SN { - TID0_SN = 0, - AC0_SN = TID0_SN, - TID1_SN, - AC1_SN = TID1_SN, - TID2_SN, - AC2_SN = TID2_SN, - TID3_SN, - AC3_SN = TID3_SN, - TID4_SN, - TID5_SN, - TID6_SN, - TID7_SN -}; - -char *get_bw_str(int bandwidth); -VOID MTMlmeLpEnter(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID MTMlmeLpExit(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID MTPollTxRxEmpty(struct _RTMP_ADAPTER *pAd); -VOID MTHifPolling(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx); -VOID MTRadioOn(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -VOID MTRadioOff(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -#ifdef RTMP_MAC_PCI -VOID MTPciPollTxRxEmpty(struct _RTMP_ADAPTER *pAd); -#endif /* RTMP_MAC_PCI */ - -UINT32 MtAsicGetCrcErrCnt(struct _RTMP_ADAPTER *pAd); -UINT32 MtAsicGetPhyErrCnt(struct _RTMP_ADAPTER *pAd); -UINT32 MtAsicGetCCACnt(struct _RTMP_ADAPTER *pAd); -UINT32 MtAsicGetChBusyCnt(struct _RTMP_ADAPTER *pAd, UCHAR BandIdx); -INT MtAsicSetAutoFallBack(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); -INT32 MtAsicAutoFallbackInit(struct _RTMP_ADAPTER *pAd); - -#ifdef COMPOS_WIN -VOID MtAsicSwitchChannel(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_CHAN_SWITCH_T CmdChSwitch); -#else -VOID MtAsicSwitchChannel(struct _RTMP_ADAPTER *pAd, - struct _MT_SWITCH_CHANNEL_CFG SwChCfg); -#endif /*COMPOS_WIN*/ - -VOID MtAsicUpdateProtect(struct _RTMP_ADAPTER *pAd, - MT_PROTECT_CTRL_T *ProtectCtrl); -VOID MtAsicUpdateRtsThld(struct _RTMP_ADAPTER *pAd, - MT_RTS_THRESHOLD_T *RtsThld); - -#ifdef SINGLE_SKU_V2 -VOID MtAsicUpdateSkuTable(RTMP_ADAPTER *pAd, UINT8 *data); -#endif - -VOID MtAsicResetBBPAgent(struct _RTMP_ADAPTER *pAd); -VOID MtAsicSetBssid(struct _RTMP_ADAPTER *pAd, UCHAR *pBssid, - UCHAR curr_bssid_idx); -INT32 MtAsicSetDevMac(struct _RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, - UINT8 *OwnMacAddr, UINT8 BandIdx, UINT8 Active, - UINT32 EnableFeature); - -#ifdef CONFIG_AP_SUPPORT -VOID MtAsicSetMbssMode(struct _RTMP_ADAPTER *pAd, UCHAR NumOfBcns); -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT -INT MtAsicSetReptFuncEnableByDriver(struct _RTMP_ADAPTER *pAd, BOOLEAN bEnable); -VOID MtAsicInsertRepeaterEntry(struct _RTMP_ADAPTER *pAd, UCHAR CliIdx, - UCHAR *pAddr); -VOID MtAsicRemoveRepeaterEntry(struct _RTMP_ADAPTER *pAd, UCHAR CliIdx); -VOID MtAsicInsertRepeaterRootEntry(IN struct _RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN UCHAR *pAddr, IN UCHAR ReptCliIdx); -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ - -#ifndef COMPOS_TESTMODE_WIN -VOID MtSetTmrCal(struct _RTMP_ADAPTER *pAd, UCHAR TmrType, UCHAR Channel, - UCHAR Bw); -VOID MtSetTmrCR(struct _RTMP_ADAPTER *pAd, UCHAR TmrType); -#endif -INT MtAsicSetRxFilter(struct _RTMP_ADAPTER *pAd, MT_RX_FILTER_CTRL_T RxFilte); - -#ifdef CONFIG_WTBL_TLV_MODE -INT MtAsicSetRDGByTLV(struct _RTMP_ADAPTER *pAd, BOOLEAN bEnable, UINT8 Wcid); -#else -#ifdef DOT11_N_SUPPORT -INT MtAsicSetRDG(struct _RTMP_ADAPTER *pAd, BOOLEAN bEnable, UCHAR BandIdx); -INT MtAsicWtblSetRDG(struct _RTMP_ADAPTER *pAd, BOOLEAN bEnable, UINT8 Wcid); -#endif /* DOT11_N_SUPPORT */ -#endif - -VOID MtAsicSetPiggyBack(struct _RTMP_ADAPTER *pAd, BOOLEAN bPiggyBack); -INT MtAsicSetPreTbtt(struct _RTMP_ADAPTER *pAd, BOOLEAN enable, - UCHAR HwBssidIdx); -INT MtAsicSetGPTimer(struct _RTMP_ADAPTER *pAd, BOOLEAN enable, UINT32 timeout); -INT MtAsicSetChBusyStat(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); -INT MtAsicGetTsfTimeByDriver(struct _RTMP_ADAPTER *pAd, UINT32 *high_part, - UINT32 *low_part, UCHAR HwBssidIdx); -VOID MtAsicRssiGet(struct _RTMP_ADAPTER *pAd, UCHAR Wcid, CHAR *RssiSet); -VOID MtRssiGet(struct _RTMP_ADAPTER *pAd, UCHAR Wcid, CHAR *RssiSet); - -#ifdef CONFIG_AP_SUPPORT -VOID APCheckBcnQHandler(struct _RTMP_ADAPTER *pAd, INT apidx, - BOOLEAN *is_pretbtt_int); -#endif /* CONFIG_AP_SUPPORT */ - -VOID MtAsicDisableSyncByDriver(struct _RTMP_ADAPTER *pAd, UCHAR HWBssidIdx); -VOID MtAsicEnableBssSyncByDriver(struct _RTMP_ADAPTER *pAd, USHORT BeaconPeriod, - UCHAR HWBssidIdx, UCHAR OPMode); - -INT MtAsicSetWmmParam(struct _RTMP_ADAPTER *pAd, UCHAR idx, UINT ac, UINT type, - UINT val); -VOID MtAsicSetEdcaParm(struct _RTMP_ADAPTER *pAd, struct _EDCA_PARM *pEdcaParm); -INT MtAsicSetRetryLimit(struct _RTMP_ADAPTER *pAd, UINT32 type, UINT32 limit); -UINT32 MtAsicGetRetryLimit(struct _RTMP_ADAPTER *pAd, UINT32 type); -VOID MtAsicSetSlotTime(struct _RTMP_ADAPTER *pAd, UINT32 SlotTime, - UINT32 SifsTime, UCHAR BandIdx); - -INT MtAsicSetMacMaxLen(struct _RTMP_ADAPTER *pAd); - -/* Function by Driver */ -INT32 MtAsicSetDevMacByDriver(struct _RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, - UINT8 *OwnMacAddr, UINT8 BandIdx, UINT8 Active, - UINT32 EnableFeature); - -INT32 MtAsicSetBssidByDriver(struct _RTMP_ADAPTER *pAd, - struct _BSS_INFO_ARGUMENT_T bss_info_argument); - -INT32 MtAsicSetStaRecByDriver(struct _RTMP_ADAPTER *pAd, - STA_REC_CFG_T StaRecCfg); - -VOID MtAsicDelWcidTabByDriver(IN struct _RTMP_ADAPTER *pAd, IN UCHAR wcid_idx); -VOID MtAsicUpdateRxWCIDTableByDriver(IN struct _RTMP_ADAPTER *pAd, - IN MT_WCID_TABLE_INFO_T WtblInfo); -INT32 MtAsicUpdateBASessionByDriver(IN struct _RTMP_ADAPTER *pAd, - IN MT_BA_CTRL_T BaCtrl); - -/* Generic fucntion */ -VOID MtAsicUpdateRxWCIDTable(IN struct _RTMP_ADAPTER *pAd, - IN MT_WCID_TABLE_INFO_T WtblInfo); - -VOID MtAsicGetTxTscByDriver(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *pTxTsc); -VOID MtAsicAddSharedKeyEntry(struct _RTMP_ADAPTER *pAd, UCHAR BssIdx, - UCHAR KeyIdx, struct _CIPHER_KEY *pKey); -VOID MtAsicRemoveSharedKeyEntry(struct _RTMP_ADAPTER *pAd, UCHAR BssIndex, - UCHAR KeyIdx); -VOID MtAsicTxCntUpdate(struct _RTMP_ADAPTER *pAd, UCHAR wcid, - struct _MT_TX_COUNTER *pTxInfo); -VOID MtAsicRssiUpdate(struct _RTMP_ADAPTER *pAd); -VOID MtAsicRcpiReset(struct _RTMP_ADAPTER *pAd, UCHAR ucWcid); -VOID MtAsicSetSMPSByDriver(struct _RTMP_ADAPTER *pAd, UCHAR Wcid, UCHAR Smps); -VOID MtAsicSetSMPS(struct _RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR smps); -UINT16 MtAsicGetTidSnByDriver(struct _RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid); -INT32 MtAsicUpdateBASession(struct _RTMP_ADAPTER *pAd, MT_BA_CTRL_T BaCtrl); -VOID MtAsicTxCapAndRateTableUpdate(struct _RTMP_ADAPTER *pAd, UCHAR ucWcid, - struct _RA_PHY_CFG_T *prTxPhyCfg, - UINT32 *Rate, BOOLEAN fgSpeEn); - -VOID MtAsicAddPairwiseKeyEntry(struct _RTMP_ADAPTER *pAd, UCHAR WCID, - struct _CIPHER_KEY *pKey); - -INT MtAsicSendCommandToMcu(IN struct _RTMP_ADAPTER *pAd, IN UCHAR Command, - IN UCHAR Token, IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic); -BOOLEAN MtAsicSendCmdToMcuAndWait(IN struct _RTMP_ADAPTER *pAd, - IN UCHAR Command, IN UCHAR Token, - IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN in_atomic); -BOOLEAN MtAsicSendCommandToMcuBBP(IN struct _RTMP_ADAPTER *pAd, - IN UCHAR Command, IN UCHAR Token, - IN UCHAR Arg0, IN UCHAR Arg1, - IN BOOLEAN FlgIsNeedLocked); - -VOID MtAsicTurnOffRFClk(struct _RTMP_ADAPTER *pAd, UCHAR Channel); - -#ifdef STREAM_MODE_SUPPORT -UINT32 MtStreamModeRegVal(struct _RTMP_ADAPTER *pAd); -VOID MtAsicSetStreamMode(struct _RTMP_ADAPTER *pAd, UCHAR *mac, INT chainIdx, - BOOLEAN enable); -VOID MtAsicStreamModeInit(struct _RTMP_ADAPTER *pAd); -#endif /* STREAM_MODE_SUPPORT */ - -#ifdef DOT11_N_SUPPORT -INT MtAsicReadAggCnt(struct _RTMP_ADAPTER *pAd, ULONG *aggCnt, int cnt_len); -INT MtAsicSetRalinkBurstMode(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); -#endif /* DOT11_N_SUPPORT */ - -INT MtAsicWaitMacTxRxIdle(struct _RTMP_ADAPTER *pAd); -INT32 MtAsicSetMacTxRx(struct _RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN Enable, - UCHAR BandIdx); -INT MtAsicSetWPDMA(struct _RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN enable, - UINT8 WPDMABurstSize); -BOOLEAN MtAsicWaitPDMAIdle(struct _RTMP_ADAPTER *pAd, INT round, INT wait_us); -BOOLEAN MtAsicResetWPDMA(struct _RTMP_ADAPTER *pAd); -INT MtAsicSetMacWD(struct _RTMP_ADAPTER *pAd); -INT MtAsicSetTxStream(struct _RTMP_ADAPTER *pAd, UINT32 StreamNum, - UCHAR BandIdx); -INT MtAsicSetRxStream(struct _RTMP_ADAPTER *pAd, UINT32 StreamNums, - UCHAR BandIdx); -INT MtAsicSetBW(struct _RTMP_ADAPTER *pAd, INT bw, UCHAR BandIdx); -INT MtAsicSetRxPath(struct _RTMP_ADAPTER *pAd, UINT32 RxPathSel, UCHAR BandIdx); -INT MtAsicStopContinousTx(struct _RTMP_ADAPTER *pAd); - -BOOLEAN MtAsicSetBmcQCR(IN struct _RTMP_ADAPTER *pAd, IN UCHAR Operation, - IN UCHAR CrReadWrite, IN UCHAR HwBssidIdx, - IN UINT32 apidx, IN OUT UINT32 *pcr_val); - -#define CR_READ 1 -#define CR_WRITE 2 - -#define BMC_FLUSH 1 -#define BMC_ENABLE 2 -#define BMC_CNT_UPDATE 3 - -BOOLEAN MtAsicSetBcnQCR(IN struct _RTMP_ADAPTER *pAd, IN UCHAR Operation, - IN UCHAR HwBssidIdx, IN UINT32 apidx); - -#define BCN_FLUSH 1 -#define BCN_ENABLE 2 - -VOID MtAsicSetDmaFQCR(IN struct _RTMP_ADAPTER *pAd, IN BOOLEAN FQ_MODE, - IN UCHAR DEST_QID, IN UCHAR DEST_PID, IN UCHAR TARG_QID, - IN UCHAR apidx, IN UCHAR widx); - -#define HQA_RX_STAT_MACFCSERRCNT 0x1 -#define HQA_RX_STAT_MAC_MDRDYCNT 0x2 -#define HQA_RX_STAT_PHY_MDRDYCNT 0x3 -#define HQA_RX_STAT_PHY_FCSERRCNT 0x4 -#define HQA_RX_STAT_PD 0x5 -#define HQA_RX_STAT_CCK_SIG_SFD 0x6 -#define HQA_RX_STAT_OFDM_SIG_TAG 0x7 -#define HQA_RX_STAT_RSSI 0x8 -#define HQA_RX_RESET_PHY_COUNT 0x9 -#define HQA_RX_RESET_MAC_COUNT 0xa -#define HQA_RX_STAT_RSSI_RX23 0xB -#define HQA_RX_STAT_ACI_HITL 0xC -#define HQA_RX_STAT_ACI_HITH 0xD -#define HQA_RX_STAT_MACFCSERRCNT_BAND1 0xE -#define HQA_RX_STAT_MAC_MDRDYCNT_BAND1 0xF -#define HQA_RX_STAT_MAC_RXLENMISMATCH 0x10 -#define HQA_RX_STAT_MAC_RXLENMISMATCH_BAND1 0x11 -#define HQA_RX_FIFO_FULL_COUNT 0x12 -#define HQA_RX_FIFO_FULL_COUNT_BAND1 0x13 -#define HQA_RX_STAT_PHY_MDRDYCNT_BAND1 0x14 -#define HQA_RX_STAT_PHY_FCSERRCNT_BAND1 0x15 -#define HQA_RX_STAT_PD_BAND1 0x16 -#define HQA_RX_STAT_CCK_SIG_SFD_BAND1 0x17 -#define HQA_RX_STAT_OFDM_SIG_TAG_BAND1 0x18 -#define HQA_RX_ACI_HIT 0x19 -#define HQA_RX_STAT_MAC_FCS_OK_COUNT 0x1A - -UINT32 MtAsicGetRxStat(struct _RTMP_ADAPTER *pAd, UINT type); -#ifdef CONFIG_ATE -INT MtAsicSetTxTonePower(struct _RTMP_ADAPTER *pAd, INT dec0, INT dec1); -INT MtAsicSetRfFreqOffset(struct _RTMP_ADAPTER *pAd, UINT32 FreqOffset); -INT MtAsicSetTSSI(struct _RTMP_ADAPTER *pAd, UINT32 bOnOff, UCHAR WFSelect); -INT MtAsicSetDPD(struct _RTMP_ADAPTER *pAd, UINT32 bOnOff, UCHAR WFSelect); - -INT MtAsicSetTxToneTest(struct _RTMP_ADAPTER *pAd, UINT32 bOnOff, UCHAR Type); -INT MtAsicStartContinousTx(struct _RTMP_ADAPTER *pAd, UINT32 PhyMode, UINT32 BW, - UINT32 PriCh, UINT32 Mcs, UINT32 WFSel); -#ifdef COMPOS_TESTMODE_WIN -INT MTAsicTxSetFrequencyOffset(struct _RTMP_ADAPTER *pAd, UINT32 iOffset, - BOOLEAN HasBeenSet); -INT MTAsicTxConfigPowerRange(struct _RTMP_ADAPTER *pAd, UCHAR ucMaxPowerDbm, - UCHAR ucMinPowerDbm); -INT MTAsicSetTMR(struct _RTMP_ADAPTER *pAd, UCHAR enable); -#endif -#endif /* CONFIG_ATE */ - -VOID MtAsicSetRxGroup(struct _RTMP_ADAPTER *pAd, UINT32 Port, UINT32 Group, - BOOLEAN Enable); - -#ifdef DMA_SCH_SUPPORT -INT32 MtAsicDMASchedulerInit(struct _RTMP_ADAPTER *pAd, - MT_DMASCH_CTRL_T DmaSchCtrl); -#endif /* DMA_SCH_SUPPORT */ - -INT MtAsicSetBAWinSizeRange(struct _RTMP_ADAPTER *pAd); -INT MtAsicSetBARTxRate(struct _RTMP_ADAPTER *pAd); -VOID MtAsicSetBARTxCntLimit(struct _RTMP_ADAPTER *pAd, BOOLEAN Enable, - UINT32 Count); -VOID MtAsicSetTxSClassifyFilter(struct _RTMP_ADAPTER *pAd, UINT32 Port, - UINT8 DestQ, UINT32 AggNums, UINT32 Filter, - UCHAR BandIdx); -VOID MtAsicInitMac(struct _RTMP_ADAPTER *pAd); -UINT32 MtAsicGetWmmParam(struct _RTMP_ADAPTER *pAd, UINT32 AcNum, - UINT32 EdcaType); -VOID MtAsicAddRemoveKey(struct _RTMP_ADAPTER *pAd, - MT_SECURITY_CTRL SecurityCtrl); -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#else -VOID MtAsicAddRemoveKeyByDriver(struct _RTMP_ADAPTER *pAd, - struct _ASIC_SEC_INFO *pInfo); -#endif -INT32 MtAsicGetMacInfo(struct _RTMP_ADAPTER *pAd, UINT32 *ChipId, UINT32 *HwVer, - UINT32 *FwVer); -INT32 MtAsicGetAntMode(struct _RTMP_ADAPTER *pAd, UCHAR *AntMode); -INT32 MtAsicSetDmaByPassMode(struct _RTMP_ADAPTER *pAd, BOOLEAN isByPass); -BOOLEAN MtAsicGetMcuStatus(struct _RTMP_ADAPTER *pAd, MCU_STAT State); -INT32 MtAsicGetFwSyncValue(struct _RTMP_ADAPTER *pAd); -INT MtAsicTOPInit(struct _RTMP_ADAPTER *pAd); - -BOOLEAN MtDmacAsicEnableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev_void); -BOOLEAN MtDmacAsicDisableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev_void); -#ifdef CONFIG_AP_SUPPORT -VOID MtDmacSetMbssHwCRSetting(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable); -VOID MtDmacSetExtTTTTHwCRSetting(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable); -VOID MtDmacSetExtMbssEnableCR(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable); -#endif - -#if defined(MT7615) -VOID EnhancedPDMAInit(struct _RTMP_ADAPTER *pAd); -#endif - -INT32 MtAsicSetTxQ(struct _RTMP_ADAPTER *pAd, INT WmmSet, INT BandIdx, - BOOLEAN Enable); - -VOID MtAsicSetMbssLPOffset(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable); -VOID MTRestartFW(struct _RTMP_ADAPTER *pAd); -INT32 MtAsicRxHeaderTransCtl(struct _RTMP_ADAPTER *pAd, BOOLEAN En, - BOOLEAN ChkBssid, BOOLEAN InSVlan, BOOLEAN RmVlan, - BOOLEAN SwPcP); -INT32 MtAsicRxHeaderTaranBLCtl(struct _RTMP_ADAPTER *pAd, UINT32 Index, - BOOLEAN En, UINT32 EthType); - -#ifdef DBDC_MODE -INT32 MtAsicGetDbdcCtrl(struct _RTMP_ADAPTER *pAd, - struct _BCTRL_INFO_T *pbInfo); -INT32 MtAsicSetDbdcCtrl(struct _RTMP_ADAPTER *pAd, - struct _BCTRL_INFO_T *pbInfo); -#endif /*DBDC_MODE*/ - -INT32 MtAsicRxHeaderTransCtl(struct _RTMP_ADAPTER *pAd, BOOLEAN En, - BOOLEAN ChkBssid, BOOLEAN InSVlan, BOOLEAN RmVlan, - BOOLEAN SwPcP); -INT32 MtAsicRxHeaderTaranBLCtl(struct _RTMP_ADAPTER *pAd, UINT32 Index, - BOOLEAN En, UINT32 EthType); -/* SMAC Start */ -BOOLEAN MtSmacAsicDisableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev_void); -BOOLEAN MtSmacAsicEnableBeacon(struct _RTMP_ADAPTER *pAd, VOID *wdev_void); -VOID MtSmacSetMbssHwCRSetting(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable); -VOID MtSmacSetExtTTTTHwCRSetting(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable); -VOID MtSmacSetExtMbssEnableCR(struct _RTMP_ADAPTER *pAd, UCHAR mbss_idx, - BOOLEAN enable); -/* SMAC End */ - -#ifdef DOT11_VHT_AC -INT MtAsicSetRtsSignalTA(struct _RTMP_ADAPTER *pAd, UINT8 BandIdx, - BOOLEAN Enable); -#endif /*DOT11_VHT_AC*/ - -INT MtAsicAMPDUEfficiencyAdjust(struct _RTMP_ADAPTER *ad, UCHAR wmm_idx, - UCHAR aifs_adjust); -#endif /* __CMM_ASIC_MT_H__ */ -INT mt_asic_rts_on_off(struct _RTMP_ADAPTER *ad, UCHAR band_idx, UINT32 rts_num, - UINT32 rts_len, BOOLEAN rts_en); diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic_mt_fw.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic_mt_fw.h deleted file mode 100644 index 7b5b2a842e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_asic_mt_fw.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifndef __CMM_ASIC_MT_FW_H__ -#define __CMM_ASIC_MT_FW_H__ - -struct _RTMP_ADAPTER; -struct _MAC_TABLE_ENTRY; -struct _CIPHER_KEY; -struct _MT_TX_COUNTER; -struct _EDCA_PARM; -struct _EXT_CMD_CHAN_SWITCH_T; -struct _BCTRL_INFO_T; -struct _BSS_INFO_ARGUMENT_T; - -/* Function by FW */ -INT32 MtAsicSetDevMacByFw(struct _RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, - UINT8 *OwnMacAddr, UINT8 BandIdx, UINT8 Active, - UINT32 EnableFeature); - -INT32 MtAsicSetBssidByFw(struct _RTMP_ADAPTER *pAd, - struct _BSS_INFO_ARGUMENT_T bss_info_argument); - -INT32 MtAsicSetStaRecByFw(struct _RTMP_ADAPTER *pAd, STA_REC_CFG_T StaRecCfg); - -INT32 MtAsicUpdateStaRecBaByFw(struct _RTMP_ADAPTER *pAd, - STA_REC_BA_CFG_T StaRecBaCfg); - -VOID MtAsicDelWcidTabByFw(IN struct _RTMP_ADAPTER *pAd, IN UCHAR wcid_idx); - -#ifdef HTC_DECRYPT_IOT -VOID MtAsicSetWcidAAD_OMByFw(IN struct _RTMP_ADAPTER *pAd, IN UCHAR wcid_idx, - IN UCHAR value); -#endif /* HTC_DECRYPT_IOT */ -#ifdef MBSS_AS_WDS_AP_SUPPORT -VOID MtAsicSetWcid4Addr_HdrTransByFw(IN struct _RTMP_ADAPTER *pAd, - IN UCHAR wcid_idx, IN UCHAR IsEnable, - IN UCHAR IsApcliEntry); -#endif - -VOID MtAsicUpdateRxWCIDTableByFw(IN struct _RTMP_ADAPTER *pAd, - IN MT_WCID_TABLE_INFO_T WtblInfo); - -INT32 MtAsicUpdateBASessionByFw(IN struct _RTMP_ADAPTER *pAd, - IN MT_BA_CTRL_T BaCtrl); - -UINT16 MtAsicGetTidSnByFw(IN struct _RTMP_ADAPTER *pAd, UCHAR wcid, UCHAR tid); - -VOID MtAsicAddRemoveKeyTabByFw(IN struct _RTMP_ADAPTER *pAd, - IN struct _ASIC_SEC_INFO *pInfo); - -VOID MtAsicSetSMPSByFw(IN struct _RTMP_ADAPTER *pAd, IN UCHAR Wcid, - IN UCHAR Smps); - -VOID mt_wtbltlv_debug(struct _RTMP_ADAPTER *pAd, UCHAR ucWcid, UCHAR ucCmdId, - UCHAR ucAtion); - -VOID MtAsicUpdateProtectByFw(struct _RTMP_ADAPTER *pAd, - MT_PROTECT_CTRL_T *ProtectCtrl); - -VOID MtAsicUpdateRtsThldByFw(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR pkt_num, UINT32 length, UCHAR retry_limit); - -VOID MtSetTmrCRByFw(struct _RTMP_ADAPTER *pAd, UCHAR enable, UCHAR BandIdx); -#define BA_TRIGGER_OFFLOAD_TIMEOUT 1000 -VOID MtAsicAutoBATrigger(struct _RTMP_ADAPTER *pAd, BOOLEAN Enable, - UINT32 Timeout); - -INT MtAsicSetRDGByFw(struct _RTMP_ADAPTER *pAd, MT_RDG_CTRL_T *Rdg); - -INT MtAsicGetTsfTimeByFirmware(struct _RTMP_ADAPTER *pAd, UINT32 *high_part, - UINT32 *low_part, UCHAR HwBssidIdx); - -INT32 MtAsicSetAid(struct _RTMP_ADAPTER *pAd, UINT16 Aid); - -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT -INT MtAsicSetReptFuncEnableByFw(struct _RTMP_ADAPTER *pAd, BOOLEAN bEnable); -VOID MtAsicInsertRepeaterEntryByFw(struct _RTMP_ADAPTER *pAd, UCHAR CliIdx, - UCHAR *pAddr); -VOID MtAsicRemoveRepeaterEntryByFw(struct _RTMP_ADAPTER *pAd, UCHAR CliIdx); - -VOID MtAsicInsertRepeaterRootEntryByFw(IN struct _RTMP_ADAPTER *pAd, - IN UCHAR Wcid, IN UCHAR *pAddr, - IN UCHAR ReptCliIdx); -#endif /* MAC_REPEATER_SUPPORT */ -#endif /* APCLI_SUPPORT */ - -#ifdef DBDC_MODE -INT32 MtAsicGetDbdcCtrlByFw(struct _RTMP_ADAPTER *pAd, - struct _BCTRL_INFO_T *pbInfo); -INT32 MtAsicSetDbdcCtrlByFw(struct _RTMP_ADAPTER *pAd, - struct _BCTRL_INFO_T *pbInfo); -#endif /*DBDC_MODE*/ - -UINT32 MtAsicGetChBusyCntByFw(struct _RTMP_ADAPTER *pAd, UCHAR ch_idx); -UINT32 MtAsicGetWmmParamByFw(struct _RTMP_ADAPTER *pAd, UINT32 AcNum, - UINT32 EdcaType); - -INT32 MtAsicSetMacTxRxByFw(struct _RTMP_ADAPTER *pAd, INT32 TxRx, - BOOLEAN Enable, UCHAR BandIdx); -INT32 MtAsicSetRxvFilter(RTMP_ADAPTER *pAd, BOOLEAN Enable, UCHAR BandIdx); - -VOID MtAsicDisableSyncByFw(struct _RTMP_ADAPTER *pAd, UCHAR HWBssidIdx); -VOID MtAsicEnableBssSyncByFw(struct _RTMP_ADAPTER *pAd, USHORT BeaconPeriod, - UCHAR HWBssidIdx, UCHAR OPMode); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_chip.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_chip.h deleted file mode 100644 index 4db9c6a3ba..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/cmm_chip.h +++ /dev/null @@ -1,1140 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_chip.h - - Abstract: - Ralink Wireless Chip HW related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __CMM_CHIP_H__ -#define __CMM_CHIP_H__ - -struct _EXT_CMD_EFUSE_BUFFER_MODE_T; -struct _RTMP_ADAPTER; -struct _MAC_TABLE_ENTRY; -struct _CIPHER_KEY; -struct _MT_TX_COUNTER; -struct _EDCA_PARM; -struct _RTMP_REG_PAIR; -struct _BANK_RF_REG_PAIR; -struct _R_M_W_REG; -struct _RF_R_M_W_REG; -struct _CR_REG; -struct _REG_PAIR; -struct MT_TX_PWR_CAP; -struct _EXT_CMD_CHAN_SWITCH_T; -struct wifi_dev; -struct hdev_ctrl; -struct _RX_BLK; - -#ifdef COMPOS_WIN -/* TODO: Star-usw, fix it */ -typedef char RTMP_STRING; -#endif /* COMPOS_WIN */ - -enum ASIC_CAP { - fASIC_CAP_RX_SC = (1 << 0), - fASIC_CAP_CSO = (1 << 1), - fASIC_CAP_TSO = (1 << 2), - fASIC_CAP_MCS_LUT = (1 << 3), - fASIC_CAP_PMF_ENC = (1 << 4), - fASIC_CAP_DBDC = (1 << 5), - fASIC_CAP_TX_HDR_TRANS = (1 << 6), - fASIC_CAP_RX_HDR_TRANS = (1 << 7), - fASIC_CAP_HW_DAMSDU = (1 << 8), - fASIC_CAP_RX_DMA_SCATTER = (1 << 9), - fASIC_CAP_MCU_OFFLOAD = (1 << 10), - fASIC_CAP_CT = (1 << 11), - fASIC_CAP_HW_TX_AMSDU = (1 << 12), - fASIC_CAP_WHNAT = (1 << 13), - fASIC_CAP_RDG = (1 << 14), - fASIC_CAP_RX_DLY = (1 << 15), - fASIC_CAP_WMM_PKTDETECT_OFFLOAD = (1 << 16), - fASIC_CAP_PCIE_ASPM_DYM_CTRL = (1 << 17), - fASIC_CAP_ADV_SECURITY = (1 << 18), -}; - -enum PHY_CAP { - fPHY_CAP_24G = 0x1, - fPHY_CAP_5G = 0x2, - fPHY_CAP_HT = 0x10, - fPHY_CAP_VHT = 0x20, - fPHY_CAP_HE = - 0x40, /* it might be different from the definition in trunk. - * need to follow trunk's definition once merge back. - */ - fPHY_CAP_TXBF = 0x100, - fPHY_CAP_LDPC = 0x200, - fPHY_CAP_MUMIMO = 0x400, - fPHY_CAP_BW40 = 0x1000, - fPHY_CAP_BW80 = 0x2000, - fPHY_CAP_BW160NC = 0x4000, - fPHY_CAP_BW160C = 0x8000, -}; - -enum HIF_TYPE { - HIF_RTMP = 0x0, - HIF_RLT = 0x1, - HIF_MT = 0x2, - HIF_MAX = HIF_MT, -}; - -enum MAC_TYPE { - MAC_RTMP = 0x0, - MAC_MT = 0x1, -}; - -enum RF_TYPE { - RF_RT, - RF_RLT, - RF_MT76x2, - RF_MT, -}; - -enum BBP_TYPE { - BBP_RTMP = 0x0, - BBP_RLT = 0x1, - BBP_MT = 0x2, -}; - -#define PHY_CAP_2G(_x) (((_x)&fPHY_CAP_24G) == fPHY_CAP_24G) -#define PHY_CAP_5G(_x) (((_x)&fPHY_CAP_5G) == fPHY_CAP_5G) -#define PHY_CAP_N(_x) (((_x)&fPHY_CAP_HT) == fPHY_CAP_HT) -#define PHY_CAP_AC(_x) (((_x)&fPHY_CAP_VHT) == fPHY_CAP_VHT) -#define GET_NUM_OF_TX_RING(_chipCap) ((_chipCap)->num_of_tx_ring) -#define GET_NUM_OF_RX_RING(_chipCap) ((_chipCap)->num_of_rx_ring) -#define GET_TX_RING_SIZE(_chipCap) ((_chipCap)->tx_ring_size) -#define GET_RX0_RING_SIZE(_chipCap) ((_chipCap)->rx0_ring_size) -#define GET_RX1_RING_SIZE(_chipCap) ((_chipCap)->rx1_ring_size) - -enum EFUSE_TYPE { - EFUSE_MT, - EFUSE_MAX, -}; - -enum TXD_TYPE { - TXD_V1, - TXD_V2, -}; - -#define MBSSID_MODE0 0 -#define MBSSID_MODE1 1 /* Enhance NEW MBSSID MODE mapping to mode 0 */ -#ifdef ENHANCE_NEW_MBSSID_MODE -#define MBSSID_MODE2 2 /* Enhance NEW MBSSID MODE mapping to mode 1 */ -#define MBSSID_MODE3 3 /* Enhance NEW MBSSID MODE mapping to mode 2 */ -#define MBSSID_MODE4 4 /* Enhance NEW MBSSID MODE mapping to mode 3 */ -#define MBSSID_MODE5 5 /* Enhance NEW MBSSID MODE mapping to mode 4 */ -#define MBSSID_MODE6 6 /* Enhance NEW MBSSID MODE mapping to mode 5 */ -#endif /* ENHANCE_NEW_MBSSID_MODE */ - -enum APPS_MODE { - APPS_MODE0 = 0x0, /* MT7603, host handle APPS */ - APPS_MODE1 = 0x1, /* MT7637 */ - APPS_MODE2 = 0x2, /* MT7615, FW handle APPS */ - APPS_MODEMAX = 0x3, -}; - -#ifdef MT_MAC -/* - these functions is common setting and could be used by sMAC or dMAC. - move to here to common use. -*/ -#ifdef CONFIG_AP_SUPPORT -VOID MtAsicSetMbssWdevIfAddrGen1(struct _RTMP_ADAPTER *pAd, INT idx, - UCHAR *if_addr, INT opmode); -VOID MtAsicSetMbssWdevIfAddrGen2(struct _RTMP_ADAPTER *pAd, INT idx, - UCHAR *if_addr, INT opmode); -#endif /*CONFIG_AP_SUPPROT */ -#endif /*MT_MAC*/ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -VOID mt_asic_pcie_aspm_dym_ctrl(RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - BOOLEAN fgL1Enable, BOOLEAN fgL0sEnable); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -typedef struct _RTMP_CHIP_OP { - int (*sys_onoff)(struct _RTMP_ADAPTER *pAd, BOOLEAN on, BOOLEAN reser); - - /* Calibration access related callback functions */ - int (*eeinit)(struct _RTMP_ADAPTER *pAd); - BOOLEAN(*eeread) - (struct _RTMP_ADAPTER *pAd, UINT16 offset, UINT16 *pValue); - int (*eewrite)(struct _RTMP_ADAPTER *pAd, USHORT offset, USHORT value); - BOOLEAN(*eeread_range) - (struct _RTMP_ADAPTER *pAd, UINT16 start, UINT16 length, UCHAR *pbuf); - int (*eewrite_range)(struct _RTMP_ADAPTER *pAd, USHORT start, - USHORT length, UCHAR *pbuf); - - /* ITxBf calibration */ - int (*fITxBfDividerCalibration)(struct _RTMP_ADAPTER *pAd, - int calFunction, int calMethod, - UCHAR *divPhase); - void (*fITxBfLNAPhaseCompensate)(struct _RTMP_ADAPTER *pAd); - int (*fITxBfCal)(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - int (*fITxBfLNACalibration)(struct _RTMP_ADAPTER *pAd, int calFunction, - int calMethod, BOOLEAN gBand); - - void (*AsicRfInit)(struct _RTMP_ADAPTER *pAd); - void (*AsicBbpInit)(struct _RTMP_ADAPTER *pAd); - void (*AsicMacInit)(struct _RTMP_ADAPTER *pAd); - void (*AsicReverseRfFromSleepMode)(struct _RTMP_ADAPTER *pAd, - BOOLEAN FlgIsInitState); - void (*AsicHaltAction)(struct _RTMP_ADAPTER *pAd); - - /* Power save */ -#ifdef GREENAP_SUPPORT - VOID(*EnableAPMIMOPS) - (struct _RTMP_ADAPTER *pAd, struct greenap_on_off_ctrl *greenap_on_off); - VOID(*DisableAPMIMOPS) - (struct _RTMP_ADAPTER *pAd, struct greenap_on_off_ctrl *greenap_on_off); -#endif /* GREENAP_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - VOID(*pcie_aspm_dym_ctrl) - (struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, BOOLEAN fgL1Enable, - BOOLEAN fgL0sEnable); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - /* MAC */ - VOID(*BeaconUpdate) - (struct _RTMP_ADAPTER *pAd, USHORT Offset, UINT32 Value, UINT8 Unit); - - /* BBP adjust */ - VOID (*ChipBBPAdjust)(IN struct _RTMP_ADAPTER *pAd, UCHAR Channel); - - /* AGC */ - VOID (*BbpInitFromEEPROM)(struct _RTMP_ADAPTER *pAd); - VOID(*ChipSwitchChannel) - (struct _RTMP_ADAPTER *pAd, struct _MT_SWITCH_CHANNEL_CFG SwChCfg); - -#ifdef NEW_SET_RX_STREAM - INT(*ChipSetRxStream) - (struct _RTMP_ADAPTER *pAd, UINT32 StreamNums, UCHAR BandIdx); -#endif - - VOID(*AsicTxAlcGetAutoAgcOffset) - (IN struct _RTMP_ADAPTER *pAd, IN PCHAR pDeltaPwr, - IN PCHAR pTotalDeltaPwr, IN PCHAR pAgcCompensate, - IN PCHAR pDeltaPowerByBbpR1, IN UCHAR Channel); - - VOID (*AsicGetTxPowerOffset)(struct _RTMP_ADAPTER *pAd, ULONG *TxPwr); - VOID (*AsicExtraPowerOverMAC)(struct _RTMP_ADAPTER *pAd); - - VOID (*AsicAdjustTxPower)(struct _RTMP_ADAPTER *pAd); - - /* Antenna */ - VOID(*AsicAntennaDefaultReset) - (struct _RTMP_ADAPTER *pAd, union _EEPROM_ANTENNA_STRUC *pAntenna); - VOID (*SetRxAnt)(struct _RTMP_ADAPTER *pAd, UCHAR Ant); - - /* EEPROM */ - VOID (*NICInitAsicFromEEPROM)(IN struct _RTMP_ADAPTER *pAd); - - /* Temperature Compensation */ - VOID (*InitTemperCompensation)(IN struct _RTMP_ADAPTER *pAd); - VOID (*TemperCompensation)(IN struct _RTMP_ADAPTER *pAd); - - /* high power tuning */ - VOID(*HighPowerTuning) - (struct _RTMP_ADAPTER *pAd, struct _RSSI_SAMPLE *pRssi); - - /* Others */ - VOID (*NetDevNickNameInit)(IN struct _RTMP_ADAPTER *pAd); -#ifdef CAL_FREE_IC_SUPPORT - BOOLEAN (*is_cal_free_ic)(IN struct _RTMP_ADAPTER *pAd); - VOID (*cal_free_data_get)(IN struct _RTMP_ADAPTER *pAd); - BOOLEAN (*check_is_cal_free_merge)(IN struct _RTMP_ADAPTER *pAd); -#endif /* CAL_FREE_IC_SUPPORT */ - -#ifdef RF_LOCKDOWN - BOOLEAN (*check_RF_lock_down)(IN struct _RTMP_ADAPTER *pAd); - BOOLEAN(*write_RF_lock_parameter) - (IN struct _RTMP_ADAPTER *pAd, IN USHORT offset); - BOOLEAN (*merge_RF_lock_parameter)(IN struct _RTMP_ADAPTER *pAd); - UCHAR(*Read_Effuse_parameter) - (IN struct _RTMP_ADAPTER *pAd, IN USHORT offset); - BOOLEAN (*Config_Effuse_Country)(IN struct _RTMP_ADAPTER *pAd); -#endif /* RF_LOCKDOWN */ - - /* The chip specific function list */ - VOID (*AsicResetBbpAgent)(IN struct _RTMP_ADAPTER *pAd); - -#ifdef CARRIER_DETECTION_SUPPORT - VOID (*ToneRadarProgram)(struct _RTMP_ADAPTER *pAd, ULONG threshold); -#endif /* CARRIER_DETECTION_SUPPORT */ - VOID (*CckMrcStatusCtrl)(struct _RTMP_ADAPTER *pAd); - VOID (*RadarGLRTCompensate)(struct _RTMP_ADAPTER *pAd); - VOID (*SecondCCADetection)(struct _RTMP_ADAPTER *pAd); - - /* MCU */ - void (*MCUCtrlInit)(struct _RTMP_ADAPTER *ad); - void (*MCUCtrlExit)(struct _RTMP_ADAPTER *ad); - VOID (*FwInit)(struct _RTMP_ADAPTER *pAd); - VOID (*FwExit)(struct _RTMP_ADAPTER *pAd); - VOID (*fwdl_datapath_setup)(struct _RTMP_ADAPTER *pAd, BOOLEAN init); - int (*DisableTxRx)(struct _RTMP_ADAPTER *ad, UCHAR Level); - void (*AsicRadioOn)(struct _RTMP_ADAPTER *ad, UCHAR Stage); - void (*AsicRadioOff)(struct _RTMP_ADAPTER *ad, UINT8 Stage); -#ifdef CONFIG_ANDES_SUPPORT -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - int (*pci_kick_out_cmd_msg)(struct _RTMP_ADAPTER *ad, - struct cmd_msg *msg); -#endif - - void (*andes_fill_cmd_header)(struct cmd_msg *msg, VOID *net_pkt); -#endif /* CONFIG_ANDES_SUPPORT */ - void (*rx_event_handler)(struct _RTMP_ADAPTER *ad, UCHAR *data); - -#ifdef MICROWAVE_OVEN_SUPPORT - VOID (*AsicMeasureFalseCCA)(IN struct _RTMP_ADAPTER *pAd); - - VOID (*AsicMitigateMicrowave)(IN struct _RTMP_ADAPTER *pAd); -#endif /* MICROWAVE_OVEN_SUPPORT */ - -#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || \ - defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) - VOID(*AsicWOWEnable) - (struct _RTMP_ADAPTER *ad, struct _STA_ADMIN_CONFIG *pStaCfg); - VOID(*AsicWOWDisable) - (struct _RTMP_ADAPTER *ad, struct _STA_ADMIN_CONFIG *pStaCfg); - VOID (*AsicWOWInit)(struct _RTMP_ADAPTER *ad); -#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */ - - void (*usb_cfg_read)(struct _RTMP_ADAPTER *ad, UINT32 *value); - void (*usb_cfg_write)(struct _RTMP_ADAPTER *ad, UINT32 value); - void (*show_pwr_info)(struct _RTMP_ADAPTER *ad); - void (*cal_test)(struct _RTMP_ADAPTER *ad, UINT32 type); - void (*bufferModeEfuseFill)(struct _RTMP_ADAPTER *ad, - struct _EXT_CMD_EFUSE_BUFFER_MODE_T *pCmd); - void (*keep_efuse_field_only)(struct _RTMP_ADAPTER *ad, UCHAR *buffer); - INT32 (*MtCmdTx)(struct _RTMP_ADAPTER *pAd, struct cmd_msg *msg); - void (*prepare_fwdl_img)(struct _RTMP_ADAPTER *pAd); -#ifdef DBDC_MODE - UCHAR (*BandGetByIdx)(struct _RTMP_ADAPTER *pAd, UCHAR BandIdx); -#endif - -#ifdef TXBF_SUPPORT - VOID(*TxBFInit) - (struct _RTMP_ADAPTER *ad, struct _MAC_TABLE_ENTRY *pEntry, - struct _IE_lists *ie_list, BOOLEAN supportsETxBF); - BOOLEAN(*ClientSupportsVhtETxBF) - (struct _RTMP_ADAPTER *ad, struct _VHT_CAP_INFO *pTxBFCap); - BOOLEAN(*ClientSupportsETxBF) - (struct _RTMP_ADAPTER *ad, struct _HT_BF_CAP *pTxBFCap); - VOID(*setETxBFCap) - (struct _RTMP_ADAPTER *ad, struct _TXBF_STATUS_INFO *pTxBfInfo); - VOID(*setVHTETxBFCap) - (struct _RTMP_ADAPTER *ad, struct _TXBF_STATUS_INFO *pTxBfInfo); -#ifdef MT_MAC - INT32(*BfStaRecUpdate) - (struct _RTMP_ADAPTER *ad, UCHAR ucPhyMode, UCHAR ucBssIdx, - UINT8 ucWlanIdx); - INT32(*BfStaRecRelease) - (struct _RTMP_ADAPTER *ad, UCHAR ucBssIdx, UINT8 ucWlanIdx); - INT32(*BfPfmuMemAlloc) - (struct _RTMP_ADAPTER *ad, UCHAR ucSu_Mu, UCHAR ucWlanId); - INT32 (*BfPfmuMemRelease)(struct _RTMP_ADAPTER *ad, UCHAR ucWlanId); - INT32(*BfHwEnStatusUpdate) - (struct _RTMP_ADAPTER *ad, BOOLEAN fgETxBf, BOOLEAN fgITxBf); - INT32(*TxBfTxApplyCtrl) - (struct _RTMP_ADAPTER *ad, UCHAR ucWlanId, BOOLEAN fgETxBf, - BOOLEAN fgITxBf, BOOLEAN fgMuTxBf, BOOLEAN fgPhaseCali); - INT32 (*archSetAid)(struct _RTMP_ADAPTER *ad, UINT16 Aid); - INT32(*BfApClientCluster) - (struct _RTMP_ADAPTER *ad, UCHAR ucWlanId, UCHAR ucCmmWlanId); - INT32(*BfReptClonedStaToNormalSta) - (struct _RTMP_ADAPTER *ad, UCHAR ucWlanId, UCHAR ucCliIdx); - INT32 (*BfeeHwCtrl)(struct _RTMP_ADAPTER *pAd, BOOLEAN fgBfeeEn); - INT32(*BfModuleEnCtrl) - (struct _RTMP_ADAPTER *ad, UINT8 u1BfNum, UINT8 u1BfBitmap, - UINT8 u1BfSelBand[]); - VOID (*iBFPhaseCalInit)(struct _RTMP_ADAPTER *ad); - VOID (*iBFPhaseFreeMem)(struct _RTMP_ADAPTER *ad); - VOID(*iBFPhaseCalE2PUpdate) - (struct _RTMP_ADAPTER *ad, UCHAR ucGroup, BOOLEAN fgSX2, - UCHAR ucUpdateAllTye); - VOID(*iBFPhaseCalReport) - (struct _RTMP_ADAPTER *ad, UCHAR ucGroupL_M_H, UCHAR ucGroup, - BOOLEAN fgSX2, UCHAR ucStatus, UCHAR ucPhaseCalType, PUCHAR pBuf); - VOID(*iBFPhaseComp) - (struct _RTMP_ADAPTER *ad, UCHAR ucGroup, PCHAR pCmdBuf); -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ -#ifdef SMART_CARRIER_SENSE_SUPPORT - VOID (*SmartCarrierSense)(struct _RTMP_ADAPTER *pAd); - VOID(*ChipSetSCS) - (struct _RTMP_ADAPTER *pAd, UCHAR BandIdx, UINT32 value); -#endif /* SMART_CARRIER_SENSE_SUPPORT */ - -#ifdef INTERNAL_CAPTURE_SUPPORT - INT32 (*ICapStart)(struct _RTMP_ADAPTER *pAd, UINT8 *pData); - INT32 (*ICapStatus)(struct _RTMP_ADAPTER *pAd); - INT32 (*ICapCmdRawDataProc)(struct _RTMP_ADAPTER *pAd); - INT32(*ICapGetIQData) - (struct _RTMP_ADAPTER *pAd, PINT32 pData, PINT32 pDataLen, - UINT32 IQ_Type, UINT32 WF_Num); - VOID(*ICapEventRawDataHandler) - (struct _RTMP_ADAPTER *pAd, UINT8 *pData, UINT32 Length); -#endif /* INTERNAL_CAPTURE_SUPPORT */ - -#ifdef WIFI_SPECTRUM_SUPPORT - INT32 (*SpectrumStart)(struct _RTMP_ADAPTER *pAd, UINT8 *pData); - INT32 (*SpectrumStatus)(struct _RTMP_ADAPTER *pAd); - INT32 (*SpectrumCmdRawDataProc)(struct _RTMP_ADAPTER *pAd); - VOID(*SpectrumEventRawDataHandler) - (struct _RTMP_ADAPTER *pAd, UINT8 *pData, UINT32 Length); -#endif /* WIFI_SPECTRUM_SUPPORT */ - - INT32 (*hif_io_read32)(void *cookie, UINT32 addr, UINT32 *value); - INT32 (*hif_io_write32)(void *cookie, UINT32 addr, UINT32 value); - VOID (*heart_beat_check)(struct _RTMP_ADAPTER *ad); - INT32 (*dma_shdl_init)(struct _RTMP_ADAPTER *pAd); - VOID (*irq_init)(struct _RTMP_ADAPTER *ad); - INT (*chk_hif_default_cr_setting)(struct _RTMP_ADAPTER *pAd); - INT (*chk_top_default_cr_setting)(struct _RTMP_ADAPTER *pAd); -#ifdef HOST_RESUME_DONE_ACK_SUPPORT - void (*HostResumeDoneAck)(struct _RTMP_ADAPTER *pAd); -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ - VOID (*hif_set_pcie_read_params)(struct _RTMP_ADAPTER *pAd); - INT(*hif_set_dma) - (struct _RTMP_ADAPTER *pAd, INT32 TxRx, BOOLEAN enable, - UINT8 WPDMABurstSIZE); - BOOLEAN(*hif_wait_dma_idle) - (struct _RTMP_ADAPTER *pAd, INT round, INT wait_us); - BOOLEAN (*hif_reset_dma)(struct _RTMP_ADAPTER *pAd); - INT32 (*get_fw_sync_value)(struct _RTMP_ADAPTER *pAd); - INT32 (*read_chl_pwr)(struct _RTMP_ADAPTER *pAd); - VOID(*parse_RXV_packet) - (struct _RTMP_ADAPTER *pAd, UINT32 Type, struct _RX_BLK *RxBlk, - UCHAR *Data); - INT32(*txs_handler) - (struct _RTMP_ADAPTER *pAd, struct _RX_BLK *rx_blk, VOID *rx_packet); - INT32 (*driver_own)(struct _RTMP_ADAPTER *pAd); - VOID (*fw_own)(struct _RTMP_ADAPTER *pAd); - INT32 (*tssi_set)(struct _RTMP_ADAPTER *ad, UCHAR *efuse); - INT32 (*pa_lna_set)(struct _RTMP_ADAPTER *ad, UCHAR *efuse); -} RTMP_CHIP_OP; - -typedef struct _RTMP_CHIP_DBG { - INT32(*dump_ps_table) - (struct hdev_ctrl *ctrl, UINT32 ent_type, BOOLEAN bReptCli); - INT32 (*dump_mib_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32 (*show_tmac_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32 (*show_agg_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32 (*show_dmasch_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32 (*show_pse_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32(*show_pse_data) - (struct hdev_ctrl *ctrl, UINT32 StartFID, UINT32 FrameNums); - INT32 (*show_ple_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32 (*show_protect_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32 (*show_cca_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32 (*set_cca_en)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - INT32 (*show_txv_info)(struct hdev_ctrl *ctrl, RTMP_STRING *arg); - VOID (*show_bcn_info)(struct hdev_ctrl *ctrl, UCHAR bandidx); -} RTMP_CHIP_DBG; - -typedef struct _RTMP_CHIP_CAP { - /* ------------------------ packet --------------------- */ - UINT8 TXWISize; /* TxWI or LMAC TxD max size */ - UINT8 RXWISize; /* RxWI or LMAC RxD max size */ - UINT8 tx_hw_hdr_len; /* Tx Hw meta info size which including all hw info fields */ - UINT8 rx_hw_hdr_len; /* Rx Hw meta info size */ - UINT8 num_of_tx_ring; - UINT8 num_of_rx_ring; -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ - UINT8 max_v2_bcn_num; -#endif - UINT16 tx_ring_size; - UINT16 rx0_ring_size; - UINT16 rx1_ring_size; - enum ASIC_CAP asic_caps; - enum PHY_CAP phy_caps; - enum HIF_TYPE hif_type; - enum MAC_TYPE mac_type; - enum BBP_TYPE bbp_type; - enum MCU_TYPE MCUType; - enum RF_TYPE rf_type; - enum EFUSE_TYPE efuse_type; - enum TXD_TYPE txd_type; - - /* register */ - struct _REG_PAIR *pRFRegTable; - struct _REG_PAIR *pBBPRegTable; - UCHAR bbpRegTbSize; - - UINT32 MaxNumOfRfId; - UINT32 MaxNumOfBbpId; - -#define RF_REG_WT_METHOD_NONE 0 -#define RF_REG_WT_METHOD_STEP_ON 1 - UCHAR RfReg17WtMethod; - - /* beacon */ - BOOLEAN FlgIsSupSpecBcnBuf; /* SPECIFIC_BCN_BUF_SUPPORT */ - UINT8 BcnMaxNum; /* software use */ - UINT8 BcnMaxHwNum; /* hardware limitation */ - UINT8 WcidHwRsvNum; /* hardware available WCID number */ - UINT32 WtblHwNum; /* hardware WTBL number */ - UINT32 WtblPseAddr; /* */ - UINT16 BcnMaxHwSize; /* hardware maximum beacon size */ - UINT16 BcnBase[HW_BEACON_MAX_NUM]; /* hardware beacon base address */ - - /* function */ - /* use UINT8, not bit-or to speed up driver */ - BOOLEAN FlgIsHwWapiSup; - - /* VCO calibration mode */ - UINT8 VcoPeriod; /* default 10s */ -#define VCO_CAL_DISABLE 0 /* not support */ -#define VCO_CAL_MODE_1 1 /* toggle RF7[0] */ -#define VCO_CAL_MODE_2 2 /* toggle RF3[7] */ -#define VCO_CAL_MODE_3 3 /* toggle RF4[7] or RF5[7] */ - UINT8 FlgIsVcoReCalMode; - - BOOLEAN FlgIsHwAntennaDiversitySup; - BOOLEAN Flg7662ChipCap; -#ifdef STREAM_MODE_SUPPORT - BOOLEAN FlgHwStreamMode; -#endif /* STREAM_MODE_SUPPORT */ -#ifdef TXBF_SUPPORT - BOOLEAN FlgHwTxBfCap; - BOOLEAN FlgITxBfBinWrite; -#endif /* TXBF_SUPPORT */ - - UCHAR ba_max_cnt; - -#ifdef RTMP_MAC_PCI -#endif /* RTMP_MAC_PCI */ - - BOOLEAN temp_tx_alc_enable; - INT32 temp_25_ref; /* a quantification value of temperature, but not J */ - INT32 current_temp; /* unit J */ -#ifdef RTMP_TEMPERATURE_TX_ALC - UINT32 high_temp_slope_a_band; /* slope with unit (J /dB) */ - UINT32 low_temp_slope_a_band; /* slope with unit (J /dB) */ - UINT32 high_temp_slope_g_band; /* slope with unit (J /dB) */ - UINT32 low_temp_slope_g_band; /* slope with unit (J /dB) */ - INT32 tc_upper_bound_a_band; /* unit dB */ - INT32 tc_lower_bound_a_band; /* unit dB */ - INT32 tc_upper_bound_g_band; /* unit dB */ - INT32 tc_lower_bound_g_band; /* unit dB */ -#endif /* RTMP_TEMPERATURE_TX_ALC */ - -#ifdef DYNAMIC_VGA_SUPPORT - BOOLEAN dynamic_vga_support; - INT32 compensate_level; - INT32 avg_rssi_0; - INT32 avg_rssi_1; - INT32 avg_rssi_all; - UCHAR dynamic_chE_mode; - BOOLEAN dynamic_chE_trigger; -#endif /* DYNAMIC_VGA_SUPPORT */ - - /* ---------------------------- signal ---------------------------------- */ -#define SNR_FORMULA1 \ - 0 /* ((0xeb - pAd->StaCfg[0].wdev.LastSNR0) * 3) / 16; */ -#define SNR_FORMULA2 1 /* (pAd->StaCfg[0].wdev.LastSNR0 * 3 + 8) >> 4; */ -#define SNR_FORMULA3 2 /* (pAd->StaCfg[0].wdev.LastSNR0) * 3) / 16; */ -#define SNR_FORMULA4 3 /* for MT7603 */ - UINT8 SnrFormula; - - UINT8 max_nss; /* maximum Nss, 3 for 3883 or 3593 */ - UINT8 max_vht_mcs; /* Maximum Vht MCS */ - -#ifdef DOT11_VHT_AC - UINT8 ac_off_mode; /* 11AC off mode */ -#endif /* DOT11_VHT_AC */ - - BOOLEAN bTempCompTxALC; - BOOLEAN rx_temp_comp; - BOOLEAN bLimitPowerRange; /* TSSI compensation range limit */ - -#if defined(RTMP_INTERNAL_TX_ALC) || defined(SINGLE_SKU_V2) - INT16 PAModeCCK[4]; - INT16 PAModeOFDM[8]; - INT16 PAModeHT[16]; -#ifdef DOT11_VHT_AC - INT16 PAModeVHT[10]; -#endif /* DOT11_VHT_AC */ -#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(SINGLE_SKU_V2) */ - - /* ---------------------------- others ---------------------------------- */ -#ifdef RTMP_EFUSE_SUPPORT - UINT16 EFUSE_USAGE_MAP_START; - UINT16 EFUSE_USAGE_MAP_END; - UINT8 EFUSE_USAGE_MAP_SIZE; - UINT8 EFUSE_RESERVED_SIZE; -#endif /* RTMP_EFUSE_SUPPORT */ - - UCHAR *EEPROM_DEFAULT_BIN; - UCHAR *EEPROM_DEFAULT_BIN_FILE; - UINT16 EEPROM_DEFAULT_BIN_SIZE; - UINT16 EFUSE_BUFFER_CONTENT_SIZE; - -#ifdef RTMP_FLASH_SUPPORT - BOOLEAN ee_inited; -#endif /* RTMP_FLASH_SUPPORT */ -#ifdef CARRIER_DETECTION_SUPPORT - UCHAR carrier_func; -#endif /* CARRIER_DETECTION_SUPPORT */ - - /* - Define the burst size of WPDMA of PCI - 0 : 4 DWORD (16bytes) - 1 : 8 DWORD (32 bytes) - 2 : 16 DWORD (64 bytes) - 3 : 32 DWORD (128 bytes) - */ - UINT8 WPDMABurstSIZE; - /* - * Define the Probe Response Times - * 1: Multi-Sta Suopport better - * 2: Default - */ - UINT8 ProbeRspTimes; - - /* - * 0: MBSSID_MODE0 - * (The multiple MAC_ADDR/BSSID are distinguished by [bit2:bit0] of byte5) - * 1: MBSSID_MODE1 - * (The multiple MAC_ADDR/BSSID are distinguished by [bit4:bit2] of byte0) - */ - UINT8 MBSSIDMode; - -#ifdef DOT11W_PMF_SUPPORT -#define PMF_ENCRYPT_MODE_0 0 /* All packets must software encryption. */ -#define PMF_ENCRYPT_MODE_1 \ - 1 /* Data packets do hardware encryption, management packet do software encryption. */ -#define PMF_ENCRYPT_MODE_2 \ - 2 /* Data and management packets do hardware encryption. */ - UINT8 FlgPMFEncrtptMode; -#endif /* DOT11W_PMF_SUPPORT */ - -#ifdef RT5592EP_SUPPORT - UINT32 Priv; /* Flag for RT5592 EP */ -#endif /* RT5592EP_SUPPORT */ - -#ifdef CONFIG_ANDES_SUPPORT - UINT32 need_load_patch; - UINT32 need_load_fw; - enum load_patch_flow load_patch_flow; - enum load_fw_flow load_fw_flow; - UINT32 patch_format; - UINT32 fw_format; - UINT32 load_patch_method; - UINT32 load_fw_method; - UINT32 rom_patch_offset; - UINT32 decompress_tmp_addr; -#endif - - UINT8 cmd_header_len; - UINT8 cmd_padding_len; - -#ifdef SINGLE_SKU_V2 - CHAR Apwrdelta; - CHAR Gpwrdelta; -#endif /* SINGLE_SKU_V2 */ - -#ifdef CONFIG_SWITCH_CHANNEL_OFFLOAD - UINT16 ChannelParamsSize; - UCHAR *ChannelParam; - INT XtalType; -#endif - - UCHAR *MACRegisterVer; - UCHAR *BBPRegisterVer; - UCHAR *RFRegisterVer; - -#ifdef CONFIG_WIFI_TEST - UINT32 MemMapStart; - UINT32 MemMapEnd; - UINT32 BBPMemMapOffset; - UINT16 BBPStart; - UINT16 BBPEnd; - UINT16 RFStart; - UINT16 RFEnd; -#ifdef MT_RF - UINT8 RFIndexNum; - struct RF_INDEX_OFFSET *RFIndexOffset; -#endif - UINT32 MacMemMapOffset; - UINT32 MacStart; - UINT32 MacEnd; - UINT16 E2PStart; - UINT16 E2PEnd; - BOOLEAN pbf_loopback; - BOOLEAN pbf_rx_drop; -#endif /* CONFIG_WIFI_TEST */ - - BOOLEAN tssi_enable; - BOOLEAN ed_cca_enable; - -#ifdef MT_MAC - struct MT_TX_PWR_CAP MTTxPwrCap; - UCHAR TmrEnable; - UINT8 OmacNums; - UINT8 MBSSStartIdx; - UINT8 MaxRepeaterNum; - UINT8 ExtMbssOmacStartIdx; - UINT8 RepeaterStartIdx; -#endif - BOOLEAN fgBcnOffloadSupport; - BOOLEAN fgIsNeedPretbttIntEvent; - UCHAR TmrHwVer; - UINT8 TxAggLimit; - UINT8 TxBAWinSize; - UINT8 RxBAWinSize; -#define MPDU_3895_OCTETS 0x0 -#define MPDU_7991_OCTETS 0x1 - UINT8 max_amsdu_len; - UINT8 ht_max_ampdu_len_exp; -#ifdef DOT11_VHT_AC -#define MPDU_11454_OCTETS 0x2 - UINT8 max_mpdu_len; - UINT8 vht_max_ampdu_len_exp; /* 2^(13+Exp) - 1 */ -#endif /* DOT11_VHT_AC*/ - - BOOLEAN g_band_256_qam; - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - BOOLEAN fgRateAdaptFWOffload; -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - - UINT32 TxOPScenario; - - UINT32 CurrentTxOP; - UINT32 default_txop; - /*Multi-WMM Control*/ - UCHAR WmmHwNum; - /* specific PDA Port HW Address */ - UINT16 PDA_PORT; - BOOLEAN SupportAMSDU; - - UINT8 APPSMode; - -#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || \ - defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) - UINT8 nWakeupInterface; -#endif /* MT_WOW_SUPPORT */ - - /* the length of partial payload delivered to MCU for further processing */ - UINT16 CtParseLen; - UCHAR qm; -#define TASKLET_METHOD 1 -#define CMWQ_METHOD 2 -#define KTHREAD_METHOD 3 - UCHAR qm_tm; - UCHAR hif_tm; -#define WMM_DETECT_METHOD1 1 -#define WMM_DETECT_METHOD2 2 - UCHAR wmm_detect_method; - UCHAR hw_ops_ver; - UINT32 int_enable_mask; - UINT8 hif_pkt_type[20]; - -#ifdef INTERNAL_CAPTURE_SUPPORT - RBIST_DESC_T *pICapDesc; - UINT8 ICapBankNum; - UINT32 ICapADCIQCnt; - UINT32 ICapIQCIQCnt; - UINT32 ICapBankSmplCnt; - UINT32 ICapFourWayADC; - UINT32 ICapFourWayFIIQ; - UINT32 ICapFourWayFDIQ; -#endif /* INTERNAL_CAPTURE_SUPPORT */ -#ifdef WIFI_SPECTRUM_SUPPORT - RBIST_DESC_T *pSpectrumDesc; - UINT8 SpectrumBankNum; - UINT32 SpectrumWF0ADC; - UINT32 SpectrumWF1ADC; - UINT32 SpectrumWF2ADC; - UINT32 SpectrumWF3ADC; - UINT32 SpectrumWF0FIIQ; - UINT32 SpectrumWF1FIIQ; - UINT32 SpectrumWF2FIIQ; - UINT32 SpectrumWF3FIIQ; - UINT32 SpectrumWF0FDIQ; - UINT32 SpectrumWF1FDIQ; - UINT32 SpectrumWF2FDIQ; - UINT32 SpectrumWF3FDIQ; -#endif /* WIFI_SPECTRUM_SUPPORT */ - UCHAR band_cnt; - UCHAR *ba_range; - BOOLEAN tx_delay_support; -#ifdef OCE_SUPPORT - BOOLEAN FdFrameFwOffloadEnabled; -#endif /* OCE_SUPPORT */ -} RTMP_CHIP_CAP; - -#ifdef OCE_SUPPORT -#define IS_FD_FRAME_FW_MODE(_CAP) ((_CAP)->FdFrameFwOffloadEnabled) -#endif /* OCE_SUPPORT */ - -/* - * EEPROM operation related marcos - */ -BOOLEAN chip_eeprom_read16(struct _RTMP_ADAPTER *pAd, USHORT offset, - USHORT *value); -BOOLEAN chip_eeprom_read_with_range(struct _RTMP_ADAPTER *pAd, USHORT start, - USHORT length, UCHAR *pbuf); - -#define RT28xx_EEPROM_READ16(_pAd, _offset, _val) \ - chip_eeprom_read16(_pAd, _offset, &(_val)) - -#define RT28xx_EEPROM_WRITE16(_pAd, _offset, _val) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->eewrite) \ - ops->eewrite(_pAd, (_offset), (USHORT)(_val)); \ - } while (0) - -#define RT28xx_EEPROM_READ_WITH_RANGE(_pAd, _start, _length, _pbuf) \ - chip_eeprom_read_with_range(_pAd, _start, _length, _pbuf) - -#define RT28xx_EEPROM_WRITE_WITH_RANGE(_pAd, _start, _length, _pbuf) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->eewrite_range) \ - ops->eewrite_range(_pAd, _start, _length, _pbuf); \ - } while (0) - -#define RTMP_CHIP_ENABLE_GREENAP(__pAd, __greenap_on_off) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->EnableAPMIMOPS != NULL) \ - ops->EnableAPMIMOPS(__pAd, __greenap_on_off); \ - } while (0) - -#define RTMP_CHIP_DISABLE_GREENAP(__pAd, __greenap_on_off) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->DisableAPMIMOPS != NULL) \ - ops->DisableAPMIMOPS(__pAd, __greenap_on_off); \ - } while (0) - -#define RTMP_CHIP_ASIC_TX_POWER_OFFSET_GET(__pAd, __pCfgOfTxPwrCtrlOverMAC) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->AsicGetTxPowerOffset != NULL) \ - ops->AsicGetTxPowerOffset(__pAd, \ - __pCfgOfTxPwrCtrlOverMAC); \ - } while (0) - -#define RTMP_CHIP_ASIC_AUTO_AGC_OFFSET_GET(__pAd, __pDeltaPwr, \ - __pTotalDeltaPwr, __pAgcCompensate, \ - __pDeltaPowerByBbpR1, __Channel) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->AsicTxAlcGetAutoAgcOffset != NULL) \ - ops->AsicTxAlcGetAutoAgcOffset(__pAd, __pDeltaPwr, \ - __pTotalDeltaPwr, \ - __pAgcCompensate, \ - __pDeltaPowerByBbpR1, \ - __Channel); \ - } while (0) - -#define RTMP_CHIP_ASIC_EXTRA_POWER_OVER_MAC(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->AsicExtraPowerOverMAC != NULL) \ - ops->AsicExtraPowerOverMAC(__pAd); \ - } while (0) - -#define RTMP_CHIP_ASIC_ADJUST_TX_POWER(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->AsicAdjustTxPower != NULL) \ - ops->AsicAdjustTxPower(__pAd); \ - } while (0) - -#define RTMP_CHIP_HIGH_POWER_TUNING(__pAd, __pRssi) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->HighPowerTuning != NULL) \ - ops->HighPowerTuning(__pAd, __pRssi); \ - } while (0) - -#define RTMP_CHIP_ANTENNA_INFO_DEFAULT_RESET(__pAd, __pAntenna) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->AsicAntennaDefaultReset != NULL) \ - ops->AsicAntennaDefaultReset(__pAd, __pAntenna); \ - } while (0) - -#define RTMP_NET_DEV_NICKNAME_INIT(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->NetDevNickNameInit != NULL) \ - ops->NetDevNickNameInit(__pAd); \ - } while (0) - -#ifdef CAL_FREE_IC_SUPPORT -#define RTMP_CAL_FREE_IC_CHECK(__pAd, __is_cal_free) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->is_cal_free_ic != NULL) \ - __is_cal_free = ops->is_cal_free_ic(__pAd); \ - else \ - __is_cal_free = FALSE; \ - } while (0) - -#define RTMP_CAL_FREE_DATA_GET(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->cal_free_data_get != NULL) { \ - ops->cal_free_data_get(__pAd); \ - __pAd->E2pCtrl.e2pSource |= E2P_SRC_FROM_EFUSE; \ - } \ - } while (0) -#endif /* CAL_FREE_IC_SUPPORT */ - -#define RTMP_EEPROM_ASIC_INIT(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->NICInitAsicFromEEPROM != NULL) \ - ops->NICInitAsicFromEEPROM(__pAd); \ - } while (0) - -#define RTMP_CHIP_ASIC_INIT_TEMPERATURE_COMPENSATION(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->InitTemperCompensation != NULL) \ - ops->InitTemperCompensation(__pAd); \ - } while (0) - -#define RTMP_CHIP_ASIC_TEMPERATURE_COMPENSATION(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->TemperCompensation != NULL) \ - ops->TemperCompensation(__pAd); \ - } while (0) - -#define RTMP_CHIP_UPDATE_BEACON(__pAd, Offset, Value, Unit) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->BeaconUpdate != NULL) \ - ops->BeaconUpdate(__pAd, Offset, Value, Unit); \ - } while (0) - -#ifdef CARRIER_DETECTION_SUPPORT -#define RTMP_CHIP_CARRIER_PROGRAM(__pAd, threshold) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->ToneRadarProgram != NULL) \ - ops->ToneRadarProgram(__pAd, threshold); \ - } while (0) -#endif /* CARRIER_DETECTION_SUPPORT */ - -#define RTMP_CHIP_CCK_MRC_STATUS_CTRL(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->CckMrcStatusCtrl != NULL) \ - ops->CckMrcStatusCtrl(__pAd); \ - } while (0) - -#define RTMP_CHIP_RADAR_GLRT_COMPENSATE(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->RadarGLRTCompensate != NULL) \ - ops->RadarGLRTCompensate(__pAd); \ - } while (0) - -/*check here before*/ -#define RTMP_SECOND_CCA_DETECTION(__pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->SecondCCADetection != NULL) \ - ops->SecondCCADetection(__pAd); \ - } while (0) - -#define DISABLE_TX_RX(_pAd, _Level) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->DisableTxRx != NULL) \ - ops->DisableTxRx(_pAd, _Level); \ - } while (0) - -#define ASIC_RADIO_ON(_pAd, _Stage) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->AsicRadioOn != NULL) \ - ops->AsicRadioOn(_pAd, _Stage); \ - } while (0) - -#define ASIC_RADIO_OFF(_pAd, _Stage) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->AsicRadioOff != NULL) \ - ops->AsicRadioOff(_pAd, _Stage); \ - } while (0) - -#ifdef MICROWAVE_OVEN_SUPPORT -#define ASIC_MEASURE_FALSE_CCA(_pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->AsicMeasureFalseCCA != NULL) \ - ops->AsicMeasureFalseCCA(_pAd); \ - } while (0) - -#define ASIC_MITIGATE_MICROWAVE(_pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->AsicMitigateMicrowave != NULL) \ - ops->AsicMitigateMicrowave(_pAd); \ - } while (0) -#endif /* MICROWAVE_OVEN_SUPPORT */ - -#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || \ - defined(NEW_WOW_SUPPORT) || defined(MT_WOW_SUPPORT) -#define ASIC_WOW_ENABLE(_pAd, _pStaCfg) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->AsicWOWEnable != NULL) \ - ops->AsicWOWEnable(_pAd, _pStaCfg); \ - } while (0) - -#define ASIC_WOW_DISABLE(_pAd, _pStaCfg) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->AsicWOWDisable != NULL) \ - ops->AsicWOWDisable(_pAd, _pStaCfg); \ - } while (0) - -#define ASIC_WOW_INIT(_pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->AsicWOWInit != NULL) \ - ops->AsicWOWInit(_pAd); \ - } while (0) - -#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */ - -#define MCU_CTRL_INIT(_pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->MCUCtrlInit != NULL) \ - ops->MCUCtrlInit(_pAd); \ - } while (0) - -#define MCU_CTRL_EXIT(_pAd) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_pAd->hdev_ctrl); \ - if (ops->MCUCtrlExit != NULL) \ - ops->MCUCtrlExit(_pAd); \ - } while (0) - -#define USB_CFG_READ(_ad, _pvalue) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_ad->hdev_ctrl); \ - if (ops->usb_cfg_read != NULL) \ - ops->usb_cfg_read(_ad, _pvalue); \ - else { \ - MTWF_LOG(DBG_CAT_HIF, CATHIF_USB, DBG_LVL_ERROR, \ - ("%s(): usb_cfg_read not inited!\n", \ - __func__)); \ - } \ - } while (0) - -#define USB_CFG_WRITE(_ad, _value) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(_ad->hdev_ctrl); \ - if (ops->usb_cfg_write != NULL) \ - ops->usb_cfg_write(_ad, _value); \ - else { \ - MTWF_LOG(DBG_CAT_HIF, CATHIF_USB, DBG_LVL_ERROR, \ - ("%s(): usb_cfg_write not inited!\n", \ - __func__)); \ - } \ - } while (0) - -#ifdef SMART_CARRIER_SENSE_SUPPORT -#define RTMP_CHIP_ASIC_SET_SCS(__pAd, __BandIdx, __value) \ - do { \ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(__pAd->hdev_ctrl); \ - if (ops->ChipSetSCS != NULL) \ - ops->ChipSetSCS(__pAd, __BandIdx, __value); \ - } while (0) -#endif /* SMART_CARRIER_SENSE_SUPPORT */ - -#if defined(MT_MAC) && defined(TXBF_SUPPORT) -INT32 AsicBfStaRecUpdate(struct _RTMP_ADAPTER *pAd, UCHAR ucPhyMode, - UCHAR ucBssIdx, UCHAR ucWlanIdx); - -INT32 AsicBfStaRecRelease(struct _RTMP_ADAPTER *pAd, UCHAR ucBssIdx, - UCHAR ucWlanIdx); - -INT32 AsicBfPfmuMemAlloc(struct _RTMP_ADAPTER *pAd, UCHAR ucSu_Mu, - UCHAR ucWlanId); - -INT32 AsicBfPfmuMemRelease(struct _RTMP_ADAPTER *pAd, UCHAR ucWlanId); - -INT32 AsicTxBfTxApplyCtrl(struct _RTMP_ADAPTER *pAd, UCHAR ucWlanId, - BOOLEAN fgETxBf, BOOLEAN fgITxBf, BOOLEAN fgMuTxBf, - BOOLEAN fgPhaseCali); - -INT32 AsicTxBfeeHwCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgBfeeHwCtrl); - -INT32 AsicTxBfApClientCluster(struct _RTMP_ADAPTER *pAd, UCHAR ucWlanId, - UCHAR ucCmmWlanId); - -INT32 AsicTxBfReptClonedStaToNormalSta(RTMP_ADAPTER *pAd, UCHAR ucWlanId, - UCHAR ucCliIdx); - -INT32 AsicTxBfHwEnStatusUpdate(struct _RTMP_ADAPTER *pAd, BOOLEAN fgETxBf, - BOOLEAN fgITxBf); - -INT32 AsicTxBfModuleEnCtrl(struct _RTMP_ADAPTER *pAd, UINT8 u1BfNum, - UINT8 u1BfBitmap, UINT8 u1BfSelBand[]); - -#endif /* MT_MAC && TXBF_SUPPORT */ - -VOID AsicSetRxAnt(struct _RTMP_ADAPTER *pAd, UCHAR Ant); - -#ifdef MICROWAVE_OVEN_SUPPORT -VOID AsicMeasureFalseCCA(struct _RTMP_ADAPTER *pAd); - -VOID AsicMitigateMicrowave(struct _RTMP_ADAPTER *pAd); -#endif /* MICROWAVE_OVEN_SUPPORT */ -VOID AsicBbpInitFromEEPROM(struct _RTMP_ADAPTER *pAd); - -#ifdef TXBF_SUPPORT -VOID chip_tx_bf_init(struct _RTMP_ADAPTER *ad, struct _MAC_TABLE_ENTRY *pEntry, - struct _IE_lists *ie_list, BOOLEAN supportsETxBF); -#endif /*TXBF_SUPPORT*/ - -#ifdef RF_LOCKDOWN -BOOLEAN chip_check_rf_lock_down(struct _RTMP_ADAPTER *pAd); -#endif /*RF_LOCKDOWN*/ - -INT32 chip_cmd_tx(struct _RTMP_ADAPTER *pAd, struct cmd_msg *msg); -VOID chip_spectrum_start(struct _RTMP_ADAPTER *ad, UINT8 *info); -VOID chip_fw_init(struct _RTMP_ADAPTER *ad); -VOID chip_parse_rxv_packet(struct _RTMP_ADAPTER *ad, UINT32 Type, - struct _RX_BLK *RxBlk, UCHAR *Data); -INT32 chip_txs_handler(struct _RTMP_ADAPTER *ad, struct _RX_BLK *rx_blk, - VOID *rx_packet); -VOID chip_rx_event_handler(struct _RTMP_ADAPTER *ad, VOID *rx_packet); -INT chip_show_pwr_info(struct _RTMP_ADAPTER *ad, RTMP_STRING *arg); -VOID chip_arch_set_aid(struct _RTMP_ADAPTER *ad, USHORT aid); -INT32 chip_tssi_set(struct _RTMP_ADAPTER *ad, char *efuse); -INT32 chip_pa_lna_set(struct _RTMP_ADAPTER *ad, char *efuse); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/hw_init.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/hw_init.h deleted file mode 100644 index c6e62e0173..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hw_ctrl/hw_init.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - hw_init.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef __HW_INIT_H__ -#define __HW_INIT_H__ - -struct _RTMP_ADAPTER; - -typedef struct { - USHORT Dummy; /* empty struct will cause build error in testmode win */ -} HIF_INFO_T; - -/*HW related init*/ -INT32 WfTopInit(struct _RTMP_ADAPTER *pAd); -INT32 WfHifInit(struct _RTMP_ADAPTER *pAd); -INT32 WfMcuInit(struct _RTMP_ADAPTER *pAd); -INT32 WfMacInit(struct _RTMP_ADAPTER *pAd); -INT32 WfEPROMInit(struct _RTMP_ADAPTER *pAd); -INT32 WfPhyInit(struct _RTMP_ADAPTER *pAd); - -/*SW related init*/ -INT32 WfSysPreInit(struct _RTMP_ADAPTER *pAd); -INT32 WfSysPosExit(struct _RTMP_ADAPTER *pAd); -INT32 WfSysCfgInit(struct _RTMP_ADAPTER *pAd); -INT32 WfSysCfgExit(struct _RTMP_ADAPTER *pAd); - -/*OS dependence function*/ -INT32 WfHifSysInit(struct _RTMP_ADAPTER *pAd, HIF_INFO_T *pHifInfo); -INT32 WfHifSysExit(struct _RTMP_ADAPTER *pAd); -INT32 WfMcuSysInit(struct _RTMP_ADAPTER *pAd); -INT32 WfMcuSysExit(struct _RTMP_ADAPTER *pAd); -INT32 WfEPROMSysInit(struct _RTMP_ADAPTER *pAd); -INT32 WfEPROMSysExit(struct _RTMP_ADAPTER *pAd); - -/*Global*/ -INT32 WfInit(struct _RTMP_ADAPTER *pAd); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hwnat/ra_nat.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hwnat/ra_nat.h deleted file mode 100644 index d984344482..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/hwnat/ra_nat.h +++ /dev/null @@ -1,586 +0,0 @@ -/****************************************************************************** - * - * This file is provided under a dual license. When you use or - * distribute this software, you may choose to be licensed under - * version 2 of the GNU General Public License ("GPLv2 License") - * or BSD License. - * - * GPLv2 License - * - * Copyright(C) 2017 MediaTek Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See http://www.gnu.org/licenses/gpl-2.0.html for more details. - * - * BSD LICENSE - * - * Copyright(C) 2017 MediaTek Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - *****************************************************************************/ -#ifndef _RA_NAT_WANTED -#define _RA_NAT_WANTED - -#include -#include - -#define hwnat_vlan_tx_tag_present(__skb) ((__skb)->vlan_tci & VLAN_TAG_PRESENT) -#define hwnat_vlan_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) - -#if defined(CONFIG_RA_NAT_HW) -extern void hwnat_magic_tag_set_zero(struct sk_buff *skb); -extern void hwnat_check_magic_tag(struct sk_buff *skb); -extern void hwnat_set_headroom_zero(struct sk_buff *skb); -extern void hwnat_set_tailroom_zero(struct sk_buff *skb); -extern void hwnat_copy_headroom(u8 *data, struct sk_buff *skb); -extern void hwnat_copy_tailroom(u8 *data, int size, struct sk_buff *skb); -extern void hwnat_setup_dma_ops(struct device *dev, bool coherent); -#else - -static inline void hwnat_magic_tag_set_zero(struct sk_buff *skb) -{ -} - -static inline void hwnat_check_magic_tag(struct sk_buff *skb) -{ -} - -static inline void hwnat_set_headroom_zero(struct sk_buff *skb) -{ -} - -static inline void hwnat_set_tailroom_zero(struct sk_buff *skb) -{ -} - -static inline void hwnat_copy_headroom(u8 *data, struct sk_buff *skb) -{ -} - -static inline void hwnat_copy_tailroom(u8 *data, int size, struct sk_buff *skb) -{ -} - -#endif -enum foe_cpu_reason { - TTL_0 = 0x02, /* IPv4(IPv6) TTL(hop limit) = 0 */ - /* IPv4(IPv6) has option(extension) header */ - HAS_OPTION_HEADER = 0x03, - NO_FLOW_IS_ASSIGNED = 0x07, /* No flow is assigned */ - /* IPv4 HNAT doesn't support IPv4 /w fragment */ - IPV4_WITH_FRAGMENT = 0x08, - /* IPv4 HNAPT/DS-Lite doesn't support IPv4 /w fragment */ - IPV4_HNAPT_DSLITE_WITH_FRAGMENT = 0x09, - /* IPv4 HNAPT/DS-Lite can't find TCP/UDP sport/dport */ - IPV4_HNAPT_DSLITE_WITHOUT_TCP_UDP = 0x0A, - /* IPv6 5T-route/6RD can't find TCP/UDP sport/dport */ - IPV6_5T_6RD_WITHOUT_TCP_UDP = 0x0B, - /* Ingress packet is TCP fin/syn/rst */ - /*(for IPv4 NAPT/DS-Lite or IPv6 5T-route/6RD) */ - TCP_FIN_SYN_RST = 0x0C, - UN_HIT = 0x0D, /* FOE Un-hit */ - HIT_UNBIND = 0x0E, /* FOE Hit unbind */ - /* FOE Hit unbind & rate reach */ - HIT_UNBIND_RATE_REACH = 0x0F, - HIT_BIND_TCP_FIN = 0x10, /* Hit bind PPE TCP FIN entry */ - /* Hit bind PPE entry and TTL(hop limit) = 1 */ - /* and TTL(hot limit) - 1 */ - HIT_BIND_TTL_1 = 0x11, - /* Hit bind and VLAN replacement violation */ - /*(Ingress 1(0) VLAN layers and egress 4(3 or 4) VLAN layers) */ - HIT_BIND_WITH_VLAN_VIOLATION = 0x12, - /* Hit bind and keep alive with unicast old-header packet */ - HIT_BIND_KEEPALIVE_UC_OLD_HDR = 0x13, - /* Hit bind and keep alive with multicast new-header packet */ - HIT_BIND_KEEPALIVE_MC_NEW_HDR = 0x14, - /* Hit bind and keep alive with duplicate old-header packet */ - HIT_BIND_KEEPALIVE_DUP_OLD_HDR = 0x15, - /* FOE Hit bind & force to CPU */ - HIT_BIND_FORCE_TO_CPU = 0x16, - /* Hit bind and remove tunnel IP header, */ - /* but inner IP has option/next header */ - HIT_BIND_WITH_OPTION_HEADER = 0x17, - /* Hit bind and exceed MTU */ - HIT_BIND_EXCEED_MTU = 0x1C, - HIT_BIND_PACKET_SAMPLING = 0x1B, /* PS packet */ - /* Switch clone multicast packet to CPU */ - HIT_BIND_MULTICAST_TO_CPU = 0x18, - /* Switch clone multicast packet to GMAC1 & CPU */ - HIT_BIND_MULTICAST_TO_GMAC_CPU = 0x19, - HIT_PRE_BIND = 0x1A /* Pre-bind */ -}; - -#define MAX_IF_NUM 64 -struct pdma_rx_desc_info4 { - u16 MAGIC_TAG_PROTECT; - uint32_t foe_entry_num : 14; - uint32_t CRSN : 5; - uint32_t SPORT : 3; -#if defined(CONFIG_MACH_LEOPARD) - uint32_t foe_entry_num_32 : 1; -#else - uint32_t rsv : 1; -#endif - uint32_t ALG : 1; - uint16_t IF : 8; - u8 WDMAID; - uint16_t RXID : 2; - uint16_t WCID : 8; - uint16_t BSSID : 6; -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) - u16 SOURCE; - u16 DEST; -#endif -} __packed; - -struct head_rx_descinfo4 { - uint32_t foe_entry_num : 14; - uint32_t CRSN : 5; - uint32_t SPORT : 3; -#if defined(CONFIG_MACH_LEOPARD) - uint32_t foe_entry_num_32 : 1; -#else - uint32_t rsv : 1; -#endif - uint32_t ALG : 1; - uint32_t IF : 8; - u16 MAGIC_TAG_PROTECT; - u8 WDMAID; - uint16_t RXID : 2; - uint16_t WCID : 8; - uint16_t BSSID : 6; - -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) - u16 SOURCE; - u16 DEST; -#endif -} __packed; - -struct cb_rx_desc_info4 { - u16 MAGIC_TAG_PROTECT0; - uint32_t foe_entry_num : 14; - uint32_t CRSN : 5; - uint32_t SPORT : 3; -#if defined(CONFIG_MACH_LEOPARD) - uint32_t foe_entry_num_32 : 1; -#else - uint32_t rsv : 1; -#endif - uint32_t ALG : 1; - uint32_t IF : 8; - u16 MAGIC_TAG_PROTECT1; - u8 WDMAID; - uint16_t RXID : 2; - uint16_t WCID : 8; - uint16_t BSSID : 6; -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) - u16 SOURCE; - u16 DEST; -#endif -} __packed; -#ifndef NEXTHDR_IPIP -#define NEXTHDR_IPIP 4 -#endif -/*!MT7622*/ -/* 2bytes 4bytes */ -/* +-----------+-------------------+*/ -/* | Magic Tag | RX/TX Desc info4 |*/ -/* +-----------+-------------------+*/ -/* |<------FOE Flow Info---------->|*/ - -/*MT7622*/ -/* 2bytes 4bytes 3bytes */ -/* +-----------+--------------------+---------+ */ -/* | Magic Tag | RX/TX Desc info4 |wifi info |*/ -/* +-----------|--------------------+---------+ */ -/* |<-----------FOE Flow Info----------------->|*/ - -#if defined(CONFIG_ARCH_MT7622_WIFI_HW_NAT) -#define WIFI_INFO_LEN 3 -#else -#define WIFI_INFO_LEN 0 -#endif -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) -#define FOE_INFO_LEN (10 + WIFI_INFO_LEN) -#define FOE_MAGIC_FASTPATH 0x77 -#define FOE_MAGIC_L2TPPATH 0x78 -#else -#define FOE_INFO_LEN (6 + WIFI_INFO_LEN) -#endif - -#define FOE_MAGIC_PCI 0x73 -#define FOE_MAGIC_WLAN 0x74 -#define FOE_MAGIC_GE 0x75 -#define FOE_MAGIC_PPE 0x76 -#define TAG_PROTECT 0x6789 -#define USE_HEAD_ROOM 0 -#define USE_TAIL_ROOM 1 -#define USE_CB 2 -#define ALL_INFO_ERROR 3 - -#define FOE_TAG_PROTECT(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->MAGIC_TAG_PROTECT) - -#define FOE_ENTRY_NUM_LSB(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num) - -#if defined(CONFIG_MACH_LEOPARD) -#define FOE_ENTRY_NUM_MSB(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num_32) -#define FOE_ENTRY_NUM(skb) \ - (((FOE_ENTRY_NUM_MSB(skb) & 0x1) << 14) | FOE_ENTRY_NUM_LSB(skb)) -#else -#define FOE_ENTRY_NUM_MSB(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->rsv) -#define FOE_ENTRY_NUM(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num) -#endif -#define FOE_ALG(skb) (((struct head_rx_descinfo4 *)((skb)->head))->ALG) -#define FOE_AI(skb) (((struct head_rx_descinfo4 *)((skb)->head))->CRSN) -#define FOE_SP(skb) (((struct head_rx_descinfo4 *)((skb)->head))->SPORT) -#define FOE_MAGIC_TAG(skb) (((struct head_rx_descinfo4 *)((skb)->head))->IF) - -#define FOE_WDMA_ID(skb) (((struct head_rx_descinfo4 *)((skb)->head))->WDMAID) -#define FOE_RX_ID(skb) (((struct head_rx_descinfo4 *)((skb)->head))->RXID) -#define FOE_WC_ID(skb) (((struct head_rx_descinfo4 *)((skb)->head))->WCID) -#define FOE_BSS_ID(skb) (((struct head_rx_descinfo4 *)((skb)->head))->BSSID) - -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) -#define FOE_SOURCE(skb) (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE) -#define FOE_DEST(skb) (((struct head_rx_descinfo4 *)((skb)->head))->DEST) -#endif - -#define IS_SPACE_AVAILABLE_HEAD(skb) \ - ((((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0))) -#define IS_SPACE_AVAILABLE_HEAD(skb) \ - ((((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0))) -#define FOE_INFO_START_ADDR_HEAD(skb) (skb->head) - -#define FOE_TAG_PROTECT_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->MAGIC_TAG_PROTECT) -#define FOE_ENTRY_NUM_LSB_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num) -#if defined(CONFIG_MACH_LEOPARD) -#define FOE_ENTRY_NUM_MSB_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num_32) -#define FOE_ENTRY_NUM_HEAD(skb) \ - (((FOE_ENTRY_NUM_MSB_HEAD(skb) & 0x1) << 14) | \ - FOE_ENTRY_NUM_LSB_HEAD(skb)) -#else -#define FOE_ENTRY_NUM_MSB_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->rsv) -#define FOE_ENTRY_NUM_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num) -#endif - -#define FOE_ALG_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->ALG) -#define FOE_AI_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->CRSN) -#define FOE_SP_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->SPORT) -#define FOE_MAGIC_TAG_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->IF) - -#define FOE_WDMA_ID_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->WDMAID) -#define FOE_RX_ID_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->RXID) -#define FOE_WC_ID_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->WCID) -#define FOE_BSS_ID_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->BSSID) - -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) -#define FOE_SOURCE_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE) -#define FOE_DEST_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->DEST) -#endif - -#define FOE_WDMA_ID_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->WDMAID) -#define FOE_RX_ID_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->RXID) -#define FOE_WC_ID_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->WCID) -#define FOE_BSS_ID_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->BSSID) - -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) -#define FOE_SOURCE_HEAD(skb) \ - (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE) -#define FOE_DEST_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->DEST) -#endif -#define IS_SPACE_AVAILABLE_TAIL(skb) \ - (((skb_tailroom(skb) >= FOE_INFO_LEN) ? 1 : 0)) -#define IS_SPACE_AVAILABLE_TAIL(skb) \ - (((skb_tailroom(skb) >= FOE_INFO_LEN) ? 1 : 0)) -#define FOE_INFO_START_ADDR_TAIL(skb) \ - ((unsigned char *)(long)(skb_end_pointer(skb) - FOE_INFO_LEN)) - -#define FOE_TAG_PROTECT_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->MAGIC_TAG_PROTECT) -#define FOE_ENTRY_NUM_LSB_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->foe_entry_num) - -#if defined(CONFIG_MACH_LEOPARD) -#define FOE_ENTRY_NUM_MSB_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->foe_entry_num_32) -#define FOE_ENTRY_NUM_TAIL(skb) \ - (((FOE_ENTRY_NUM_MSB_TAIL(skb) & 0x1) << 14) | \ - FOE_ENTRY_NUM_LSB_TAIL(skb)) -#else -#define FOE_ENTRY_NUM_MSB_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->rsv) -#define FOE_ENTRY_NUM_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->foe_entry_num) -#endif - -#define FOE_ALG_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->ALG) -#define FOE_AI_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->CRSN) -#define FOE_SP_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->SPORT) -#define FOE_MAGIC_TAG_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->IF) - -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) -#define FOE_SOURCE_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->SOURCE) -#define FOE_DEST_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->DEST) -#endif - -#define FOE_WDMA_ID_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->WDMAID) -#define FOE_RX_ID_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->RXID) -#define FOE_WC_ID_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->WCID) -#define FOE_BSS_ID_TAIL(skb) \ - (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - \ - FOE_INFO_LEN))) \ - ->BSSID) - -/* change the position of skb_CB if necessary */ -#define CB_OFFSET 40 -#define IS_SPACE_AVAILABLE_CB(skb) 1 -#define FOE_INFO_START_ADDR_CB(skb) (skb->cb + CB_OFFSET) -#define FOE_TAG_PROTECT_CB0(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET)) \ - ->MAGIC_TAG_PROTECT0) -#define FOE_TAG_PROTECT_CB1(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET)) \ - ->MAGIC_TAG_PROTECT1) -#define FOE_ENTRY_NUM_CB(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->foe_entry_num) -#define FOE_ALG_CB(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->ALG) -#define FOE_AI_CB(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->CRSN) -#define FOE_SP_CB(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->SPORT) -#define FOE_MAGIC_TAG_CB(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->IF) - -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) -#define FOE_SOURCE_CB(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->SOURCE) -#define FOE_DEST_CB(skb) \ - (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->DEST) -#endif - -#define FOE_WDMA_ID_CB(skb) (((struct cb_rx_desc_info4 *)((skb)->head))->WDMAID) -#define FOE_RX_ID_CB(skb) (((struct cb_rx_desc_info4 *)((skb)->head))->RXID) -#define FOE_WC_ID_CB(skb) (((struct cb_rx_desc_info4 *)((skb)->head))->WCID) -#define FOE_BSS_ID_CB(skb) (((struct cb_rx_desc_info4 *)((skb)->head))->BSSID) - -#define IS_MAGIC_TAG_PROTECT_VALID_HEAD(skb) \ - (FOE_TAG_PROTECT_HEAD(skb) == TAG_PROTECT) -#define IS_MAGIC_TAG_PROTECT_VALID_TAIL(skb) \ - (FOE_TAG_PROTECT_TAIL(skb) == TAG_PROTECT) -#define IS_MAGIC_TAG_PROTECT_VALID_CB(skb) \ - ((FOE_TAG_PROTECT_CB0(skb) == TAG_PROTECT) && \ - (FOE_TAG_PROTECT_CB0(skb) == FOE_TAG_PROTECT_CB1(skb))) - -#define IS_IF_PCIE_WLAN_HEAD(skb) \ - ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) || \ - (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) || \ - (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE)) - -#define IS_IF_PCIE_WLAN_TAIL(skb) \ - ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) || \ - (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN)) - -#define IS_IF_PCIE_WLAN_CB(skb) \ - ((FOE_MAGIC_TAG_CB(skb) == FOE_MAGIC_PCI) || \ - (FOE_MAGIC_TAG_CB(skb) == FOE_MAGIC_WLAN)) - -/* macros */ -#define magic_tag_set_zero(skb) \ - { \ - if ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) || \ - (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) || \ - (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE)) { \ - if (IS_SPACE_AVAILABLE_HEAD(skb)) \ - FOE_MAGIC_TAG_HEAD(skb) = 0; \ - } \ - if ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) || \ - (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN) || \ - (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_GE)) { \ - if (IS_SPACE_AVAILABLE_TAIL(skb)) \ - FOE_MAGIC_TAG_TAIL(skb) = 0; \ - } \ - } - -static inline void hwnat_set_l2tp_unhit(struct iphdr *iph, struct sk_buff *skb) -{ -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) - /* only clear headeroom for TCP OR not L2TP packets */ - if ((iph->protocol == 0x6) || (ntohs(udp_hdr(skb)->dest) != 1701)) { - if (IS_SPACE_AVAILABLE_HEAD(skb)) { - FOE_MAGIC_TAG(skb) = 0; - FOE_AI(skb) = UN_HIT; - } - } -#endif -} - -static inline void hwnat_set_l2tp_fast_path(u32 l2tp_fast_path, - u32 pptp_fast_path) -{ -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) - l2tp_fast_path = 1; - pptp_fast_path = 0; -#endif -} - -static inline void hwnat_clear_l2tp_fast_path(u32 l2tp_fast_path) -{ -#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP) - l2tp_fast_path = 0; -#endif -} - -/* #define CONFIG_HW_NAT_IPI */ -#if defined(CONFIG_HW_NAT_IPI) -extern int debug_level; -int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, - struct rps_dev_flow **rflowp); -uint32_t ppe_extif_rx_handler(struct sk_buff *skb); -int hitbind_force_to_cpu_handler(struct sk_buff *skb, struct foe_entry *entry); -extern unsigned int ipidbg[num_possible_cpus()][10]; -extern unsigned int ipidbg2[num_possible_cpus()][10]; -/* #define HNAT_IPI_RXQUEUE 1 */ -#define HNAT_IPI_DQ 1 -#define HNAT_IPI_HASH_NORMAL 0 -#define HNAT_IPI_HASH_VTAG 1 -#define HNAT_IPI_HASH_FROM_EXTIF 2 -#define HNAT_IPI_HASH_FROM_GMAC 4 - -struct hnat_ipi_s { -#if defined(HNAT_IPI_DQ) - struct sk_buff_head skb_input_queue; - struct sk_buff_head skb_process_queue; -#elif defined(HNAT_IPI_RXQUEUE) - atomic_t rx_queue_num; - unsigned int rx_queue_ridx; - unsigned int rx_queue_widx; - struct sk_buff **rx_queue; -#else - /* unsigned int dummy0[0]; */ - struct sk_buff_head skb_ipi_queue; - /* unsigned int dummy1[8]; */ -#endif - unsigned long time_rec, recv_time; - unsigned int ipi_accum; - /*hwnat ipi use*/ - spinlock_t ipilock; - struct tasklet_struct smp_func_call_tsk; -} ____cacheline_aligned_in_smp; - -struct hnat_ipi_stat { - unsigned long drop_pkt_num_from_extif; - unsigned long drop_pkt_num_from_ppehit; - unsigned int smp_call_cnt_from_extif; - unsigned int smp_call_cnt_from_ppehit; - atomic_t cpu_status; - /* atomic_t cpu_status_from_extif; */ - /* atomic_t cpu_status_from_ppehit; */ - - /* atomic_t hook_status_from_extif; */ - /* atomic_t hook_status_from_ppehit; */ -} ____cacheline_aligned_in_smp; - -#define cpu_status_from_extif cpu_status -#define cpu_status_from_ppehit cpu_status - -struct hnat_ipi_cfg { - unsigned int enable_from_extif; - unsigned int enable_from_ppehit; - unsigned int queue_thresh_from_extif; - unsigned int queue_thresh_from_ppehit; - unsigned int drop_pkt_from_extif; - unsigned int drop_pkt_from_ppehit; - unsigned int ipi_cnt_mod_from_extif; - unsigned int ipi_cnt_mod_from_ppehit; -} ____cacheline_aligned_in_smp; - -int hnat_ipi_init(void); -int hnat_ipi_de_init(void); -#endif - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac.h deleted file mode 100644 index ff434ac680..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __MAC_H__ -#define __MAC_H__ - -#ifdef MT_MAC -#include "mac/mac_mt/mt_mac.h" -#include "mac/mac_mt/mt_mac_ctrl.h" -#endif /* MT_MAC */ - -/*! Copy memory block with specific size */ -#define kalMemCopy(pvDst, pvSrc, u4Size) memcpy(pvDst, pvSrc, u4Size) - -#define WMM_QUE_NUM 4 - -#define PRINT_MASK(mask) (mask[0], mask[1], mask[2], mask[3]) - -#define COPY_MASK_ADDR(_pucDestAddr, _pucSrcAddr) \ - kalMemCopy(_pucDestAddr, _pucSrcAddr, \ - 16) /* 16: UINT32*sizeof(UINT32) */ - -enum { - QID_AC_BK, - QID_AC_BE, - QID_AC_VI, - QID_AC_VO, - QID_HCCA, - QID_BMC = 8, - QID_MGMT = 13, - QID_RX = 14, - QID_CTRL = 16, - QID_BCN = 17, -}; - -#define ETH_TYPE_VLAN 0x8100 -#define ETH_TYPE_IPv4 0x0800 -#define ETH_TYPE_IPv6 0x86dd -#define ETH_TYPE_ARP 0x0806 -#define ETH_TYPE_EAPOL 0x888e -#define ETH_TYPE_WAI 0x88b4 -#define ETHER_TYPE_TDLS_MMPDU 0x890d -#define ETH_TYPE_FASTROAMING 0x890d -#define ETH_TYPE_1905 0x893A - -#define IP_VER_CODE_V4 0x40 -#define IP_VER_CODE_V6 0x60 -#define IP_PROTOCOL_ICMP 0x01 -#define IP_PROTOCOL_TCP 0x06 -#define IP_PROTO_UDP 0x11 -#define IP_HDR_LEN 20 -#define ETH_HDR_LEN 14 - -#define ICMP_TYPE_ECHO_RSP 0 -#define ICMP_TYPE_ECHO_REQ 8 - -#define DMA_SCH_LMAC 0 -#define DMA_SCH_BYPASS 1 -#define DMA_SCH_HYBRID 2 - -#define TXINFO_SIZE 4 -typedef union GNU_PACKED _TXINFO_STRUC { - UINT32 word; -} TXINFO_STRUC; - -#define SHORT_PREAMBLE 0 -#define LONG_PREAMBLE 1 - -/* - bit31 =>802.3 if set 1, implay you hav did header translation - bit30 => put VLAN field - -*/ -#define RAL_RXINFO_SIZE 4 -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RXINFO_STRUC { - UINT32 hdr_trans_ip_sum_err : 1; /* IP checksum error */ - UINT32 vlan_taged_tcp_sum_err : 1; /* TCP checksum error */ - UINT32 rsv : 1; - UINT32 action_wanted : 1; - UINT32 deauth : 1; - UINT32 disasso : 1; - UINT32 beacon : 1; - UINT32 probe_rsp : 1; - UINT32 sw_fc_type1 : 1; - UINT32 sw_fc_type0 : 1; - UINT32 pn_len : 3; - UINT32 wapi_kidx : 1; - UINT32 BssIdx3 : 1; - UINT32 Decrypted : 1; - UINT32 AMPDU : 1; - UINT32 L2PAD : 1; - UINT32 RSSI : 1; - UINT32 HTC : 1; - UINT32 AMSDU : 1; /* rx with 802.3 header, not 802.11 header. obsolete. */ - UINT32 CipherErr : 2; /* 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid */ - UINT32 Crc : 1; /* 1: CRC error */ - UINT32 MyBss : 1; /* 1: this frame belongs to the same BSSID */ - UINT32 Bcast : 1; /* 1: this is a broadcast frame */ - UINT32 Mcast : 1; /* 1: this is a multicast frame */ - UINT32 U2M : 1; /* 1: this RX frame is unicast to me */ - UINT32 FRAG : 1; - UINT32 NULLDATA : 1; - UINT32 DATA : 1; - UINT32 BA : 1; -} RXINFO_STRUC; -#else -typedef struct GNU_PACKED _RXINFO_STRUC { - UINT32 BA : 1; - UINT32 DATA : 1; - UINT32 NULLDATA : 1; - UINT32 FRAG : 1; - UINT32 U2M : 1; - UINT32 Mcast : 1; - UINT32 Bcast : 1; - UINT32 MyBss : 1; - UINT32 Crc : 1; - UINT32 CipherErr : 2; - UINT32 AMSDU : 1; - UINT32 HTC : 1; - UINT32 RSSI : 1; - UINT32 L2PAD : 1; - UINT32 AMPDU : 1; - UINT32 Decrypted : 1; - UINT32 BssIdx3 : 1; - UINT32 wapi_kidx : 1; - UINT32 pn_len : 3; - UINT32 sw_fc_type0 : 1; - UINT32 sw_fc_type1 : 1; - UINT32 probe_rsp : 1; - UINT32 beacon : 1; - UINT32 disasso : 1; - UINT32 deauth : 1; - UINT32 action_wanted : 1; - UINT32 rsv : 1; - UINT32 vlan_taged_tcp_sum_err : 1; - UINT32 hdr_trans_ip_sum_err : 1; -} RXINFO_STRUC; -#endif - -typedef struct _MAC_TX_INFO { - UCHAR WCID; - BOOLEAN FRAG; - BOOLEAN InsTimestamp; - BOOLEAN NSeq; - BOOLEAN Ack; - BOOLEAN BM; - BOOLEAN CFACK; - BOOLEAN AMPDU; - UCHAR BASize; - UCHAR PID; - UCHAR TID; - UCHAR TxRate; - UCHAR Txopmode; - ULONG Length; - UCHAR hdr_len; - UCHAR hdr_pad; - UCHAR eth_type_offset; - UCHAR bss_idx; - UCHAR q_idx; - UCHAR prot; - UCHAR AntPri; - UCHAR SpeEn; - UCHAR Preamble; -#ifdef MT_MAC - UCHAR Type; - UCHAR SubType; - UINT32 TxSPriv; - UCHAR PsmBySw; /* PSM bit controlled by SW */ - UINT8 OmacIdx; - UINT8 wmm_set; /* TODO: shiang-MT7615, replace band by bss_idx? */ - BOOLEAN IsTmr; - BOOLEAN IsOffloadPkt; /* host gen pkt template, make pkt enqued by fw. */ -#ifdef FTM_SUPPORT - BOOLEAN ftm_bw; -#endif /* FTM_SUPPORT */ -#endif /* MT_MAC */ - BOOLEAN IsAutoRate; -#ifdef DPP_SUPPORT - UINT16 seq_no; -#endif /* DPP_SUPPORT */ -} MAC_TX_INFO; - -enum { - PID_DATA_NORMALUCAST = 0, - PID_DATA_NOT_NORM_ACK, - PID_DATA_AMPDU, - PID_MGMT, - PID_DATA_NO_ACK, - PID_CTL_BAR, - PID_PS_DATA, - PID_TDLS, - PID_P2P_ACTION, - PID_NULL_FRAME_PWR_ACTIVE, - PID_NULL_FRAME_PWR_SAVE, -#ifdef DPP_SUPPORT - PID_MGMT_DPP_FRAME, -#endif /* DPP_SUPPORT */ - PID_NULL_FRAME = 0x19, - PID_BEACON = 0x20, -#ifdef FTM_SUPPORT - PID_FTM_MIN = 0x21, - PID_FTM_MAX = 0x40, -#endif /* FTM_SUPPORT */ - PID_MAX = 0x40, -}; - -struct _RTMP_ADAPTER; -struct _TXD_STRUC; -struct _RXD_STRUC; - -VOID dump_txinfo(struct _RTMP_ADAPTER *pAd, TXINFO_STRUC *pTxInfo); -VOID dump_rxinfo(struct _RTMP_ADAPTER *pAd, RXINFO_STRUC *pRxInfo); - -VOID dump_tmac_info(struct _RTMP_ADAPTER *pAd, UCHAR *tmac_info); -VOID dump_rmac_info(struct _RTMP_ADAPTER *pAd, UCHAR *rmac_info); -VOID dump_rmac_info_rxv(struct _RTMP_ADAPTER *pAd, UCHAR *Data); -VOID dump_rmac_info_for_ICVERR(struct _RTMP_ADAPTER *pAd, UCHAR *rmac_info); - -#ifdef MT_MAC -VOID DumpTxSFormat(struct _RTMP_ADAPTER *pAd, UINT8 Format, CHAR *Data); -#endif /* MT_MAC */ - -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) -VOID dump_txd(struct _RTMP_ADAPTER *pAd, struct _TXD_STRUC *pTxD); -VOID dump_rxd(struct _RTMP_ADAPTER *pAd, struct _RXD_STRUC *pRxD); -#endif -#endif /* __MAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/client.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/client.h deleted file mode 100644 index 22eb193b97..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/client.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - client.h -*/ - -#ifndef __CLIENT_H__ -#define __CLIENT_H__ - -#define CLIENT_BASE 0xe000 -#define RXINF (CLIENT_BASE + 0x0030) -#define RXSH_GROUP1_EN (1 << 0) -#define RXSH_GROUP2_EN (1 << 1) -#define RXSH_GROUP3_EN (1 << 2) - -#define RST (CLIENT_BASE + 0x0070) -#define TX_R_E_1 (1 << 16) -#define TX_R_E_2 (1 << 17) -#define TX_R_E_1_S (1 << 20) -#define TX_R_E_2_S (1 << 21) - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/dma_sch.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/dma_sch.h deleted file mode 100644 index c33e65d2f8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/dma_sch.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - dma_sch.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __DMA_SCH_H__ -#define __DMA_SCH_H__ - -#define DMASHDL_BASE 0x5000a000 - -#define MT_HIF_DMASHDL_PKT_MAX_SIZE (DMASHDL_BASE + 0x1c) - -#define PLE_PKT_MAX_SIZE_MASK (0xfff << 0) -#define PLE_PKT_MAX_SIZE_NUM(p) (((p)&0xfff) << 0) -#define GET_PLE_PKT_MAX_SIZE_NUM(p) (((p)&PLE_PKT_MAX_SIZE_MASK) >> 0) - -#define PSE_PKT_MAX_SIZE_MASK (0xfff << 16) -#define PSE_PKT_MAX_SIZE_NUM(p) (((p)&0xfff) << 16) -#define GET_PSE_PKT_MAX_SIZE_NUM(p) (((p)&PSE_PKT_MAX_SIZE_MASK) >> 16) -#define MT_HIF_DMASHDL_OPTION_CTRL (DMASHDL_BASE + 0x08) -#define MT_HIF_DMASHDL_REFILL_CTRL (DMASHDL_BASE + 0x10) -#define MT_HIF_DMASHDL_GROUP0_CTRL (DMASHDL_BASE + 0x20) -#define MT_HIF_DMASHDL_GROUP1_CTRL (DMASHDL_BASE + 0x24) -#define MT_HIF_DMASHDL_GROUP2_CTRL (DMASHDL_BASE + 0x28) -#define MT_HIF_DMASHDL_GROUP3_CTRL (DMASHDL_BASE + 0x2c) -#define MT_HIF_DMASHDL_GROUP4_CTRL (DMASHDL_BASE + 0x30) -#define MT_HIF_DMASHDL_GROUP5_CTRL (DMASHDL_BASE + 0x34) -#define MT_HIF_DMASHDL_GROUP6_CTRL (DMASHDL_BASE + 0x38) -#define MT_HIF_DMASHDL_GROUP7_CTRL (DMASHDL_BASE + 0x3c) -#define MT_HIF_DMASHDL_GROUP8_CTRL (DMASHDL_BASE + 0x40) -#define MT_HIF_DMASHDL_GROUP9_CTRL (DMASHDL_BASE + 0x44) -#define MT_HIF_DMASHDL_GROUP10_CTRL (DMASHDL_BASE + 0x48) -#define MT_HIF_DMASHDL_GROUP11_CTRL (DMASHDL_BASE + 0x4c) -#define MT_HIF_DMASHDL_GROUP12_CTRL (DMASHDL_BASE + 0x50) -#define MT_HIF_DMASHDL_GROUP13_CTRL (DMASHDL_BASE + 0x54) -#define MT_HIF_DMASHDL_GROUP14_CTRL (DMASHDL_BASE + 0x58) -#define MT_HIF_DMASHDL_GROUP15_CTRL (DMASHDL_BASE + 0x5c) - -#define MT_HIF_DMASHDL_SHDL_SET0 (DMASHDL_BASE + 0xb0) -#define MT_HIF_DMASHDL_SHDL_SET1 (DMASHDL_BASE + 0xb4) - -#define MT_HIF_DMASHDL_SLOT_SET0 (DMASHDL_BASE + 0xc4) -#define MT_HIF_DMASHDL_SLOT_SET1 (DMASHDL_BASE + 0xc8) - -#define MT_HIF_DMASHDL_Q_MAP0 (DMASHDL_BASE + 0xd0) -#define MT_HIF_DMASHDL_Q_MAP1 (DMASHDL_BASE + 0xd4) -#define MT_HIF_DMASHDL_Q_MAP2 (DMASHDL_BASE + 0xd8) -#define MT_HIF_DMASHDL_Q_MAP3 (DMASHDL_BASE + 0xdc) - -#define MT_HIF_DMASHDL_PAGE_SET (DMASHDL_BASE + 0x0c) - -/* User program group sequence type control */ -/* 0: user program group sequence order type, 1: pre define each slot group strict order */ -#define DMASHDL_GROUP_SEQ_ORDER_TYPE BIT(16) - -#define MT_HIF_DMASHDL_CTRL_SIGNAL (DMASHDL_BASE + 0x18) -#define DMASHDL_PLE_TXD_GT_MAX_SIZE_FLAG_CLR \ - BIT(0) /* enable to clear the flag of PLE TXD size greater than ple max. size */ -#define DMASHDL_HIF_ASK_SUB_ENA \ - BIT(16) /* enable packet in substration action from HIF ask period */ -#define DMASHDL_PLE_SUB_ENA \ - BIT(17) /* enable packet in substration action from PLE */ -#define DMASHDL_PLE_ADD_INT_REFILL_ENA \ - BIT(29) /* enable terminate refill period when PLE release packet to do addition */ -#define DMASHDL_PDMA_ADD_INT_REFILL_ENA \ - BIT(30) /* enable terminate refill period when packet in to do addition */ -#define DMASHDL_PKTIN_INT_REFILL_ENA \ - BIT(31) /* enable terminate refill period when packet in to do substration */ - -#define MT_HIF_DMASHDL_ERROR_FLAG_CTRL (DMASHDL_BASE + 0x9c) - -#define MT_HIF_DMASHDL_STATUS_RD (DMASHDL_BASE + 0x100) -#define MT_HIF_DMASHDL_STATUS_RD_GP0 (DMASHDL_BASE + 0x140) -#define MT_HIF_DMASHDL_STATUS_RD_GP1 (DMASHDL_BASE + 0x144) -#define MT_HIF_DMASHDL_STATUS_RD_GP2 (DMASHDL_BASE + 0x148) -#define MT_HIF_DMASHDL_STATUS_RD_GP3 (DMASHDL_BASE + 0x14c) -#define MT_HIF_DMASHDL_STATUS_RD_GP4 (DMASHDL_BASE + 0x150) -#define MT_HIF_DMASHDL_STATUS_RD_GP5 (DMASHDL_BASE + 0x154) -#define MT_HIF_DMASHDL_STATUS_RD_GP6 (DMASHDL_BASE + 0x158) -#define MT_HIF_DMASHDL_STATUS_RD_GP7 (DMASHDL_BASE + 0x15c) -#define MT_HIF_DMASHDL_STATUS_RD_GP8 (DMASHDL_BASE + 0x160) -#define MT_HIF_DMASHDL_STATUS_RD_GP9 (DMASHDL_BASE + 0x164) -#define MT_HIF_DMASHDL_STATUS_RD_GP10 (DMASHDL_BASE + 0x168) -#define MT_HIF_DMASHDL_STATUS_RD_GP11 (DMASHDL_BASE + 0x16c) -#define MT_HIF_DMASHDL_STATUS_RD_GP12 (DMASHDL_BASE + 0x170) -#define MT_HIF_DMASHDL_STATUS_RD_GP13 (DMASHDL_BASE + 0x174) -#define MT_HIF_DMASHDL_STATUS_RD_GP14 (DMASHDL_BASE + 0x178) -#define MT_HIF_DMASHDL_STATUS_RD_GP15 (DMASHDL_BASE + 0x17c) -#define MT_HIF_DMASHDLRD_GP_PKT_CNT_0 (DMASHDL_BASE + 0x180) -#define MT_HIF_DMASHDLRD_GP_PKT_CNT_1 (DMASHDL_BASE + 0x184) -#define MT_HIF_DMASHDLRD_GP_PKT_CNT_2 (DMASHDL_BASE + 0x188) -#define MT_HIF_DMASHDLRD_GP_PKT_CNT_3 (DMASHDL_BASE + 0x18c) -#define MT_HIF_DMASHDLRD_GP_PKT_CNT_4 (DMASHDL_BASE + 0x190) -#define MT_HIF_DMASHDLRD_GP_PKT_CNT_5 (DMASHDL_BASE + 0x194) -#define MT_HIF_DMASHDLRD_GP_PKT_CNT_6 (DMASHDL_BASE + 0x198) -#define MT_HIF_DMASHDLRD_GP_PKT_CNT_7 (DMASHDL_BASE + 0x19c) - -#define DMASHDL_RSV_CNT_MASK (0xfff << 16) -#define DMASHDL_SRC_CNT_MASK (0xfff << 0) -#define DMASHDL_RSV_CNT_OFFSET 16 -#define DMASHDL_SRC_CNT_OFFSET 0 -#define DMASHDL_FREE_PG_CNT_MASK (0xfff << 16) -#define DMASHDL_FFA_CNT_MASK (0xfff << 0) -#define DMASHDL_FREE_PG_CNT_OFFSET 16 -#define DMASHDL_FFA_CNT_OFFSET 0 -#define DMASHDL_MAX_QUOTA_MASK (0xfff << 16) -#define DMASHDL_MIN_QUOTA_MASK (0xfff << 0) -#define DMASHDL_MAX_QUOTA_OFFSET 16 -#define DMASHDL_MIN_QUOTA_OFFSET 0 - -#define DMASHDL_MIN_QUOTA_NUM(p) (((p)&0xfff) << DMASHDL_MIN_QUOTA_OFFSET) -#define GET_DMASHDL_MIN_QUOTA_NUM(p) \ - (((p)&DMASHDL_MIN_QUOTA_MASK) >> DMASHDL_MIN_QUOTA_OFFSET) - -#define DMASHDL_MAX_QUOTA_NUM(p) (((p)&0xfff) << DMASHDL_MAX_QUOTA_OFFSET) -#define GET_DMASHDL_MAX_QUOTA_NUM(p) \ - (((p)&DMASHDL_MAX_QUOTA_MASK) >> DMASHDL_MAX_QUOTA_OFFSET) - -#define ODD_GROUP_ASK_CN_MASK (0xff << 16) -#define ODD_GROUP_ASK_CN_OFFSET 16 -#define GET_ODD_GROUP_ASK_CNT(p) \ - (((p)&ODD_GROUP_ASK_CN_MASK) >> ODD_GROUP_ASK_CN_OFFSET) -#define ODD_GROUP_PKT_IN_CN_MASK (0xff << 24) -#define ODD_GROUP_PKT_IN_CN_OFFSET 24 -#define GET_ODD_GROUP_PKT_IN_CNT(p) \ - (((p)&ODD_GROUP_PKT_IN_CN_MASK) >> ODD_GROUP_PKT_IN_CN_OFFSET) -#define EVEN_GROUP_ASK_CN_MASK (0xff << 0) -#define EVEN_GROUP_ASK_CN_OFFSET 0 -#define GET_EVEN_GROUP_ASK_CNT(p) \ - (((p)&EVEN_GROUP_ASK_CN_MASK) >> EVEN_GROUP_ASK_CN_OFFSET) -#define EVEN_GROUP_PKT_IN_CN_MASK (0xff << 8) -#define EVEN_GROUP_PKT_IN_CN_OFFSET 8 -#define GET_EVEN_GROUP_PKT_IN_CNT(p) \ - (((p)&EVEN_GROUP_PKT_IN_CN_MASK) >> EVEN_GROUP_PKT_IN_CN_OFFSET) -#define HIF_DMASHDL_IO_READ32(_A, _R, _pV) \ - do { \ - UINT32 restore_remap_addr; \ - HW_IO_READ32(_A, 0x2504, &restore_remap_addr); \ - \ - HW_IO_WRITE32(_A, 0x2504, DMASHDL_BASE); \ - HW_IO_READ32(_A, (0x80000 + ((UINT32)_R & 0xffff)), _pV); \ - \ - HW_IO_WRITE32(_A, 0x2504, restore_remap_addr); \ - } while (0) - -#define HIF_DMASHDL_IO_WRITE32(_A, _R, _pV) \ - do { \ - UINT32 restore_remap_addr; \ - \ - HW_IO_READ32(_A, 0x2504, &restore_remap_addr); \ - \ - HW_IO_WRITE32(_A, 0x2504, DMASHDL_BASE); \ - HW_IO_WRITE32(_A, (0x80000 + ((UINT32)_R & 0xffff)), _pV); \ - \ - HW_IO_WRITE32(_A, 0x2504, restore_remap_addr); \ - } while (0) - -#endif /* __DMA_SCH_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/gpio.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/gpio.h deleted file mode 100644 index 9527671d3c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/gpio.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - gpio.h -*/ - -#ifndef __GPIO_H__ -#define __GPIO_H__ - -#define GPIO_BASE 0x80023000 -#define GPIO_PU1 (GPIO_BASE + 0x00) -#define GPIO_PU1_SET (GPIO_BASE + 0x04) -#define GPIO_PU1_RESET (GPIO_BASE + 0x8) -#define GPIO_PD1 (GPIO_BASE + 0x10) -#define GPIO_PD1_SET (GPIO_BASE + 0x14) -#define GPIO_PD1_RESET (GPIO_BASE + 0x18) -#define GPIO_DOUT1 (GPIO_BASE + 0x20) -#define GPIO_DOUT1_SET (GPIO_BASE + 0x24) -#define GPIO_DOUT1_RESET (GPIO_BASE + 0x28) -#define GPIO_OE1 (GPIO_BASE + 0x30) -#define GPIO_OE1_SET (GPIO_BASE + 0x34) -#define GPIO_OE1_RESET (GPIO_BASE + 0x38) -#define GPIO_DIN1 (GPIO_BASE + 0x40) -#define PINMUX_SEL1 (GPIO_BASE + 0x80) -#define PINMUX_SEL2 (GPIO_BASE + 0x84) -#define PINMUX_SEL3 (GPIO_BASE + 0X88) - -#define GPIO0_SEL_MASK (0x7) -#define GPIO0_SEL(p) (((p)&0x7)) -#define GPIO0_SEL_VALUE 0x0 -#define GPIO1_SEL_MASK (0x7 << 4) -#define GPIO1_SEL(p) (((p)&0x7) << 4) -#define GPIO1_SEL_VALUE 0x2 -#define GPIO2_SEL_MASK (0x7 << 8) -#define GPIO2_SEL(p) (((p)&0x7) << 8) -#define GPIO2_SEL_VALUE 0x2 -#define GPIO3_SEL_MASK (0x7 << 12) -#define GPIO3_SEL(p) (((p)&0x7) << 12) -#define GPIO3_SEL_VALUE 0x2 -#define GPIO4_SEL_MASK (0x7 << 16) -#define GPIO4_SEL(p) (((p)&0x7) << 16) -#define GPIO4_SEL_VALUE 0x2 -#define GPIO5_SEL_MASK (0x7 << 20) -#define GPIO5_SEL(p) (((p)&0x7) << 20) -#define GPIO5_SEL_VALUE 0x2 -#define GPIO6_SEL_MASK (0x7 << 24) -#define GPIO6_SEL(p) (((p)&0x7) << 24) -#define GPIO6_SEL_VALUE 0x0 -#define GPIO7_SEL_MASK (0x7 << 28) -#define GPIO7_SEL(p) (((p)&0x7) << 28) -#define GPIO7_SEL_VALUE 0x0 -#define GPIO8_SEL_MASK (0x7) -#define GPIO8_SEL(p) (((p)&0x7)) -#define GPIO8_SEL_VALUE 0x0 -#define GPIO9_SEL_MASK (0x7 << 4) -#define GPIO9_SEL(p) (((p)&0x7) << 4) -#define GPIO9_SEL_VALUE 0x0 -#define GPIO10_SEL_MASK (0x7 << 8) -#define GPIO10_SEL(p) (((p)&0x7) << 8) -#define GPIO10_SEL_VALUE 0x0 -#define GPIO11_SEL_MASK (0x7 << 12) -#define GPIO11_SEL(p) (((p)&0x7) << 12) -#define GPIO11_SEL_VALUE 0x2 -#define GPIO12_SEL_MASK (0x7 << 16) -#define GPIO12_SEL(p) (((p)&0x7) << 16) -#define GPIO12_SEL_VALUE 0x2 -#define GPIO13_SEL_MASK (0x7 << 20) -#define GPIO13_SEL(p) (((p)&0x7) << 20) -#define GPIO13_SEL_VALUE 0x2 -#define GPIO14_SEL_MASK (0x7 << 24) -#define GPIO14_SEL(p) (((p)&0x7) << 24) -#define GPIO14_SEL_VALUE 0x2 -#define GPIO15_SEL_MASK (0x7 << 28) -#define GPIO15_SEL(p) (((p)&0x7) << 28) -#define GPIO15_SEL_VALUE 0x2 -#define GPIO16_SEL_MASK (0x7) -#define GPIO16_SEL(p) (((p)&0x7)) -#define GPIO16_SEL_VALUE 0x2 - -#define OUTPUT_HIGH 1 -#define OUTPUT_LOW 0 -#define INPUT_HIGH 1 -#define INPUT_LOW 0 -#define GPIO_OUTPUT 1 -#define GPIO_INPUT 0 -#define PULL_UP 1 -#define NO_PULL_UP 0 -#define PULL_DOWN 1 -#define NO_PULL_DOWN 0 - -#define GPIO0 0 -#define GPIO1 1 -#define GPIO2 2 -#define GPIO3 3 -#define GPIO4 4 -#define GPIO5 5 -#define GPIO6 6 -#define GPIO7 7 -#define GPIO8 8 -#define GPIO9 9 -#define GPIO10 10 -#define GPIO11 11 -#define GPIO12 12 -#define GPIO13 13 -#define GPIO14 14 -#define GPIO15 15 -#define GPIO16 16 - -INT32 GPIODirectionInput(struct _RTMP_ADAPTER *pAd, UINT32 GPIO); -INT32 GPIODirectionOuput(struct _RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value); -UINT32 GPIOGetValue(struct _RTMP_ADAPTER *pAd, UINT32 GPIO); -VOID GPIOSetValue(struct _RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value); -UINT32 GPIOGetMode(struct _RTMP_ADAPTER *pAd, UINT32 GPIO); -INT32 GPIOPullUp(struct _RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value); -INT32 GPIOPullDown(struct _RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/hw_amsdu.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/hw_amsdu.h deleted file mode 100644 index 9cbc0aa6d7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/hw_amsdu.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - hw_amsdu.h - Abstract: - HW AMSDU from 7663 CHIP - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __HW_AMSDU_H__ -#define __HW_AMSDU_H__ - -#define AMSDU_BASE 0x9000 - -#define AMSDU_GC (AMSDU_BASE + 0x00) -#define AMSDU_TXD_COMP_MAP_0 (AMSDU_BASE + 0x04) -#define AMSDU_TXD_COMP_MAP_1 (AMSDU_BASE + 0x08) -#define AMSDU_CFG_CTRL (AMSDU_BASE + 0x0C) -#define AMSDU_PEEK_CR_00 (AMSDU_BASE + 0xD0) -#define AMSDU_PEEK_CR_01 (AMSDU_BASE + 0xD4) -#define AMSDU_PACK_1_MSDU_CNT (AMSDU_BASE + 0xE0) -#define AMSDU_PACK_2_MSDU_CNT (AMSDU_BASE + 0xE4) -#define AMSDU_PACK_3_MSDU_CNT (AMSDU_BASE + 0xE8) -#define AMSDU_PACK_4_MSDU_CNT (AMSDU_BASE + 0xEC) -#define AMSDU_PACK_5_MSDU_CNT (AMSDU_BASE + 0xF0) -#define AMSDU_PACK_6_MSDU_CNT (AMSDU_BASE + 0xF4) -#define AMSDU_PACK_7_MSDU_CNT (AMSDU_BASE + 0xF8) -#define AMSDU_PACK_8_MSDU_CNT (AMSDU_BASE + 0xFC) - -#define AMSDU_AC0_QUEUE_EMPTY0 (AMSDU_BASE + 0x100) -#define AMSDU_AC0_QUEUE_EMPTY1 (AMSDU_BASE + 0x104) -#define AMSDU_AC0_QUEUE_EMPTY2 (AMSDU_BASE + 0x108) -#define AMSDU_AC0_QUEUE_EMPTY3 (AMSDU_BASE + 0x10C) - -#define AMSDU_AC1_QUEUE_EMPTY0 (AMSDU_BASE + 0x110) -#define AMSDU_AC1_QUEUE_EMPTY1 (AMSDU_BASE + 0x114) -#define AMSDU_AC1_QUEUE_EMPTY2 (AMSDU_BASE + 0x118) -#define AMSDU_AC1_QUEUE_EMPTY3 (AMSDU_BASE + 0x11C) - -#define AMSDU_AC2_QUEUE_EMPTY0 (AMSDU_BASE + 0x120) -#define AMSDU_AC2_QUEUE_EMPTY1 (AMSDU_BASE + 0x124) -#define AMSDU_AC2_QUEUE_EMPTY2 (AMSDU_BASE + 0x128) -#define AMSDU_AC2_QUEUE_EMPTY3 (AMSDU_BASE + 0x12C) - -#define AMSDU_AC3_QUEUE_EMPTY0 (AMSDU_BASE + 0x130) -#define AMSDU_AC3_QUEUE_EMPTY1 (AMSDU_BASE + 0x134) -#define AMSDU_AC3_QUEUE_EMPTY2 (AMSDU_BASE + 0x138) -#define AMSDU_AC3_QUEUE_EMPTY3 (AMSDU_BASE + 0x13C) - -#define AMSDU_AC0_QUEUE_EMPTY4 (AMSDU_BASE + 0x140) -#define AMSDU_AC1_QUEUE_EMPTY4 (AMSDU_BASE + 0x150) -#define AMSDU_AC2_QUEUE_EMPTY4 (AMSDU_BASE + 0x160) -#define AMSDU_AC3_QUEUE_EMPTY4 (AMSDU_BASE + 0x170) - -#endif /*__HW_AMSDU_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/mt_dmac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/mt_dmac.h deleted file mode 100644 index e85048a450..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/mt_dmac.h +++ /dev/null @@ -1,2146 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_dmac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __MT_DMAC_H__ -#define __MT_DMAC_H__ - -#include "mac/mac_mt/top.h" -#include "mac/mac_mt/dmac/gpio.h" -#include "mac/mac_mt/dmac/wf_agg.h" -#include "mac/mac_mt/dmac/wf_aon.h" -#include "mac/mac_mt/dmac/wf_arb.h" -#include "mac/mac_mt/dmac/wf_cfg.h" -#include "mac/mac_mt/dmac/wf_cfgoff.h" -#include "mac/mac_mt/dmac/wf_dma.h" -#include "mac/mac_mt/dmac/wf_lpon_top.h" -#include "mac/mac_mt/dmac/wf_mib.h" -#include "mac/mac_mt/dmac/wf_pf.h" -#include "mac/mac_mt/dmac/wf_rmac.h" -#include "mac/mac_mt/dmac/wf_sec.h" -#include "mac/mac_mt/dmac/wf_tmac.h" -#include "mac/mac_mt/dmac/wf_trb.h" -#include "mac/mac_mt/dmac/wf_wtbloff.h" -#include "mac/mac_mt/dmac/wf_wtblon.h" -#include "mac/mac_mt/dmac/wf_int_wakeup_top.h" -#include "mac/mac_mt/dmac/client.h" -#include "mac/mac_mt/dmac/wf_wtbl.h" -#include "mac/mac_mt/dmac/wf_phy.h" -#include "mac/mac_mt/dmac/wf_ple.h" -#include "mac/mac_mt/dmac/pse.h" -#include "mac/mac_mt/dmac/wf_pp.h" -#include "mac/mac_mt/dmac/wf_etbf.h" -#include "mac/mac_mt/dmac/hw_amsdu.h" -#ifdef CFG_SUPPORT_MU_MIMO -#ifdef MANUAL_MU -#include "mac/mac_mt/dmac/wf_mu.h" -#endif /* MANUAL_MU */ -#endif /* CFG_SUPPORT_MU_MIMO */ - -#ifdef MT7622 -#include "mac/mac_mt/dmac/dma_sch.h" -#endif /* MT7622 */ - -/* - TX / RX descriptor format - - TX: - PCI/RBUS_DMA_Descriptor + TXD + 802.11 - - Rx: - PCI/RBUS/USB_DMA_Descripotr + RXD + 802.11 + RX_CSO_INFO -*/ - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_0 { - /* DWORD 0 */ - UINT32 p_idx : 1; - UINT32 q_idx : 5; - UINT32 rsv_25 : 1; - UINT32 UdpTcpChkSumOffload : 1; - UINT32 IpChkSumOffload : 1; - UINT32 EthTypeOffset : 7; - UINT32 TxByteCount : 16; -} TMAC_TXD_0; -#else -typedef struct GNU_PACKED _TMAC_TXD_0 { - /* DWORD 0 */ - UINT32 TxByteCount : 16; - UINT32 EthTypeOffset : 7; - UINT32 IpChkSumOffload : 1; - UINT32 UdpTcpChkSumOffload : 1; - UINT32 rsv_25 : 1; - UINT32 q_idx : 5; - UINT32 p_idx : 1; -} TMAC_TXD_0; -#endif - -/* TMAC_TXD_0.PIdx */ -#define P_IDX_LMAC 0 -#define P_IDX_MCU 1 -#define P_IDX_PLE_CTRL_PSE_PORT_3 3 - -#define UMAC_PLE_CTRL_P3_Q_0X1E 0x1e -#define UMAC_PLE_CTRL_P3_Q_0X1F 0x1f - -/* TMAC_TXD_0.QIdx */ -#define TxQ_IDX_AC0 0x00 -#define TxQ_IDX_AC1 0x01 -#define TxQ_IDX_AC2 0x02 -#define TxQ_IDX_AC3 0x03 -#define TxQ_IDX_AC10 0x04 -#define TxQ_IDX_AC11 0x05 -#define TxQ_IDX_AC12 0x06 -#define TxQ_IDX_AC13 0x07 -#define TxQ_IDX_AC20 0x08 -#define TxQ_IDX_AC21 0x09 -#define TxQ_IDX_AC22 0x0a -#define TxQ_IDX_AC23 0x0b -#define TxQ_IDX_AC30 0x0c -#define TxQ_IDX_AC31 0x0d -#define TxQ_IDX_AC32 0x0e -#define TxQ_IDX_AC33 0x0f - -#define TxQ_IDX_ALTX0 0x10 -#define TxQ_IDX_BMC0 0x11 -#define TxQ_IDX_BCN0 0x12 -#define TxQ_IDX_PSMP0 0x13 - -#define TxQ_IDX_ALTX1 0x14 -#define TxQ_IDX_BMC1 0x15 -#define TxQ_IDX_BCN1 0x16 -#define TxQ_IDX_PSMP1 0x17 - -#define TxQ_IDX_MCU0 0x00 -#define TxQ_IDX_MCU1 0x01 -#define TxQ_IDX_MCU2 0x02 -#define TxQ_IDX_MCU3 0x03 -#define TxQ_IDX_MCU_PDA 0x1e - -/* TMAC_TXD_0.p_idx + TMAC_TXD_0.q_idx */ -#define PQ_IDX_WMM0_AC0 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC0)) -#define PQ_IDX_WMM0_AC1 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC1)) -#define PQ_IDX_WMM0_AC2 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC2)) -#define PQ_IDX_WMM0_AC3 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC3)) -#define PQ_IDX_WMM1_AC0 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC10)) -#define PQ_IDX_WMM1_AC1 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC11)) -#define PQ_IDX_WMM1_AC2 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC12)) -#define PQ_IDX_WMM1_AC3 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC13)) -#define PQ_IDX_WMM2_AC0 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC20)) -#define PQ_IDX_WMM2_AC1 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC21)) -#define PQ_IDX_WMM2_AC2 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC22)) -#define PQ_IDX_WMM2_AC3 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC23)) -#define PQ_IDX_WMM3_AC0 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC30)) -#define PQ_IDX_WMM3_AC1 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC31)) -#define PQ_IDX_WMM3_AC2 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC32)) -#define PQ_IDX_WMM3_AC3 ((P_IDX_LMAC << 5) | (TxQ_IDX_AC33)) - -#define PQ_IDX_ALTX0 ((P_IDX_LMAC << 5) | (TxQ_IDX_ALTX0)) -#define PQ_IDX_BMC0 ((P_IDX_LMAC << 5) | (TxQ_IDX_ALTX0)) -#define PQ_IDX_BCN0 ((P_IDX_LMAC << 5) | (TxQ_IDX_ALTX0)) -#define PQ_IDX_PSMP0 ((P_IDX_LMAC << 5) | (TxQ_IDX_ALTX0)) - -#define PQ_IDX_MCU_RQ0 ((P_IDX_MCU << 5) | (TxQ_IDX_MCU0)) -#define PQ_IDX_MCU_RQ1 ((P_IDX_MCU << 5) | (TxQ_IDX_MCU1)) -#define PQ_IDX_MCU_RQ2 ((P_IDX_MCU << 5) | (TxQ_IDX_MCU2)) -#define PQ_IDX_MCU_RQ3 ((P_IDX_MCU << 5) | (TxQ_IDX_MCU3)) - -/****************************************************************************** - TMAC_TXD_1 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_1 { - /* DWORD 1 */ - UINT32 OwnMacAddr : 6; - UINT32 pkt_ft : 2; - UINT32 tid : 3; - UINT32 amsdu : 1; - UINT32 UNxV : 1; - UINT32 hdr_pad : 2; - UINT32 txd_len : 1; - UINT32 ft : 1; /* TMI_FT_XXXX */ - UINT32 hdr_format : 2; /* TMI_HDR_FT_XXX */ - UINT32 hdr_info : 5; /* in unit of WORD(2 bytes) */ - UINT32 wlan_idx : 8; -} TMAC_TXD_1, *PTMAC_TXD_1; -#else -typedef struct GNU_PACKED _TMAC_TXD_1 { - /* DWORD 1 */ - UINT32 wlan_idx : 8; - UINT32 hdr_info : 5; /* in unit of WORD(2 bytes) */ - UINT32 hdr_format : 2; /* TMI_HDR_FT_XXX */ - UINT32 ft : 1; /* TMI_HDR_FT_XXX */ - UINT32 txd_len : 1; /* TMI_FT_XXXX */ - UINT32 hdr_pad : 2; - UINT32 UNxV : 1; - UINT32 amsdu : 1; - UINT32 tid : 3; - UINT32 pkt_ft : 2; - UINT32 OwnMacAddr : 6; -} TMAC_TXD_1, *PTMAC_TXD_1; -#endif - -/* TMAC_TXD_1.pkt_ft */ -#define TMI_PKT_FT_HIF_CT 0 /* Cut-through */ -#define TMI_PKT_FT_HIF_SF 1 /* Store & forward */ -#define TMI_PKT_FT_HIF_CMD 2 /* Command frame to N9/CR4 */ -#define TMI_PKT_FT_HIF_FW 3 /* Firmware frame to PDA */ - -#define TMI_PKT_FT_MCU_CT 0 /* N9 Cut-through */ -#define TMI_PKT_FT_MCU_FW 3 /* N9 to UMAC/LMAC */ - -/* TMAC_TXD_1.hdr_format */ -#define TMI_HDR_FT_NON_80211 0x0 -#define TMI_HDR_FT_CMD 0x1 -#define TMI_HDR_FT_NOR_80211 0x2 -#define TMI_HDR_FT_ENH_80211 0x3 - -/* - TMAC_TXD_1.hdr_info -*/ -/* if TMAC_TXD_1.hdr_format == HDR_FORMAT_NON_80211 */ -#define TMI_HDR_INFO_0_BIT_MRD 0 -#define TMI_HDR_INFO_0_BIT_EOSP 1 -#define TMI_HDR_INFO_0_BIT_RMVL 2 -#define TMI_HDR_INFO_0_BIT_VLAN 3 -#define TMI_HDR_INFO_0_BIT_ETYP 4 -#define TMI_HDR_INFO_0_VAL(_mrd, _eosp, _rmvl, _vlan, _etyp) \ - ((((_mrd) ? 1 : 0) << TMI_HDR_INFO_0_BIT_MRD) | \ - (((_eosp) ? 1 : 0) << TMI_HDR_INFO_0_BIT_EOSP) | \ - (((_rmvl) ? 1 : 0) << TMI_HDR_INFO_0_BIT_RMVL) | \ - (((_vlan) ? 1 : 0) << TMI_HDR_INFO_0_BIT_VLAN) | \ - (((_etyp) ? 1 : 0) << TMI_HDR_INFO_0_BIT_ETYP)) - -/* if TMAC_TXD_1.hdr_format == HDR_FORMAT_CMD */ -#define TMI_HDR_INFO_1_MASK_RSV (0x1f) -#define TMI_HDR_INFO_1_VAL 0 - -/* if TMAC_TXD_1.hdr_format == HDR_FORMAT_NOR_80211 */ -#define TMI_HDR_INFO_2_MASK_LEN (0x1f) -#define TMI_HDR_INFO_2_VAL(_len) (_len >> 1) - -/* if TMAC_TXD_1.hdr_format == HDR_FORMAT_ENH_80211 */ -#define TMI_HDR_INFO_3_BIT_EOSP 1 -#define TMI_HDR_INFO_3_BIT_AMS 2 -#define TMI_HDR_INFO_3_VAL(_eosp, _ams) \ - ((((_eosp) ? 1 : 0) << TMI_HDR_INFO_3_BIT_EOSP) | \ - (((_ams) ? 1 : 0) << TMI_HDR_INFO_3_BIT_AMS)) - -#define TMI_HDR_INFO_VAL(_fmt, _mrd, _eosp, _rmvl, _vlan, _etype, _len, _ams, \ - _val) \ - do { \ - switch (_fmt) { \ - case TMI_HDR_FT_NON_80211: \ - (_val) = TMI_HDR_INFO_0_VAL((_mrd), (_eosp), (_rmvl), \ - (_vlan), (_etype)); \ - break; \ - case TMI_HDR_FT_CMD: \ - (_val) = TMI_HDR_INFO_1_VAL; \ - break; \ - case TMI_HDR_FT_NOR_80211: \ - ASSERT((((_len)&1) == 0)); \ - (_val) = TMI_HDR_INFO_2_VAL((_len)); \ - break; \ - case TMI_HDR_FT_ENH_80211: \ - (_val) = TMI_HDR_INFO_3_VAL((_eosp), (_ams)); \ - break; \ - default: \ - (_val) = 0; \ - } \ - } while (0) - -/* TMAC_TXD_1.TxDFmt */ -#define TMI_FT_SHORT 0 -#define TMI_FT_LONG 1 - -/* TMAC_TXD_1.HdrPad */ -#define TMI_HDR_PAD_BIT_MODE 1 -#define TMI_HDR_PAD_MODE_TAIL 0 -#define TMI_HDR_PAD_MODE_HEAD 1 -#define TMI_HDR_PAD_BIT_LEN 0 -#define TMI_HDR_PAD_MASK_LEN 0x3 - -/****************************************************************************** - TMAC_TXD_2 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_2 { - /* DWORD 2 */ - UINT32 fix_rate : 1; - UINT32 timing_measure : 1; - UINT32 ba_disable : 1; - UINT32 pwr_offset : 5; - UINT32 max_tx_time : 8; - UINT32 frag : 2; - UINT32 htc_vld : 1; - UINT32 duration : 1; - UINT32 bip : 1; - UINT32 bc_mc_pkt : 1; - UINT32 rts : 1; - UINT32 sounding : 1; - UINT32 ndpa : 1; - UINT32 ndp : 1; - UINT32 frm_type : 2; - UINT32 sub_type : 4; -} TMAC_TXD_2, *PTMAC_TXD_2; -#else -typedef struct GNU_PACKED _TMAC_TXD_2 { - /* DWORD 2 */ - UINT32 sub_type : 4; - UINT32 frm_type : 2; - UINT32 ndp : 1; - UINT32 ndpa : 1; - UINT32 sounding : 1; - UINT32 rts : 1; - UINT32 bc_mc_pkt : 1; - UINT32 bip : 1; - UINT32 duration : 1; - UINT32 htc_vld : 1; - UINT32 frag : 2; - UINT32 max_tx_time : 8; - UINT32 pwr_offset : 5; - UINT32 ba_disable : 1; - UINT32 timing_measure : 1; - UINT32 fix_rate : 1; -} TMAC_TXD_2, *PTMAC_TXD_2; -#endif - -/****************************************************************************** - TMAC_TXD_3 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_3 { - /* DWORD 3 */ - UINT32 sn_vld : 1; - UINT32 pn_vld : 1; - UINT32 rsv_28_29 : 2; - UINT32 sn : 12; - UINT32 remain_tx_cnt : 5; - UINT32 tx_cnt : 5; - UINT32 rsv_2_5 : 4; - UINT32 protect_frm : 1; - UINT32 no_ack : 1; -} TMAC_TXD_3, *PTMAC_TXD_3; -#else -typedef struct GNU_PACKED _TMAC_TXD_3 { - /* DWORD 3 */ - UINT32 no_ack : 1; - UINT32 protect_frm : 1; - UINT32 rsv_2_5 : 4; - UINT32 tx_cnt : 5; - UINT32 remain_tx_cnt : 5; - UINT32 sn : 12; - UINT32 rsv_28_29 : 2; - UINT32 pn_vld : 1; - UINT32 sn_vld : 1; -} TMAC_TXD_3, *PTMAC_TXD_3; -#endif - -/****************************************************************************** - TMAC_TXD_4 -******************************************************************************/ -typedef struct GNU_PACKED _TMAC_TXD_4 { - UINT32 pn_low; -} TMAC_TXD_4, *PTMAC_TXD_4; - -/****************************************************************************** - TMAC_TXD_5 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_5 { - UINT32 pn_high : 16; - UINT32 rsv_14_15 : 2; - UINT32 pwr_mgmt : 1; - UINT32 rsv_12 : 1; - UINT32 da_select : 1; - UINT32 tx_status_2_host : 1; - UINT32 tx_status_2_mcu : 1; - UINT32 tx_status_fmt : 1; - UINT32 pid : 8; -} TMAC_TXD_5; -#else -typedef struct GNU_PACKED _TMAC_TXD_5 { - UINT32 pid : 8; - UINT32 tx_status_fmt : 1; - UINT32 tx_status_2_mcu : 1; - UINT32 tx_status_2_host : 1; - UINT32 da_select : 1; - UINT32 rsv_12 : 1; - UINT32 pwr_mgmt : 1; - UINT32 rsv_14_15 : 2; - UINT32 pn_high : 16; -} TMAC_TXD_5, *PTMAC_TXD_5; -#endif - -/* TMAC_TXD_5.da_select */ -#define TMI_DAS_FROM_MPDU 0 -#define TMI_DAS_FROM_WTBL 1 - -/* TMAC_TXD_5.bar_sn_ctrl */ -#define TMI_BSN_CFG_BY_HW 0 -#define TMI_BSN_CFG_BY_SW 1 - -/* TMAC_TXD_5.pwr_mgmt */ -#define TMI_PM_BIT_CFG_BY_HW 0 -#define TMI_PM_BIT_CFG_BY_SW 1 - -/****************************************************************************** - TMAC_TXD_6 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_6 { - UINT32 fix_rate_mode : 1; - UINT32 gi : 1; - UINT32 ldpc : 1; - UINT32 TxBF : 1; - UINT32 tx_rate : 12; - UINT32 ant_id : 12; - UINT32 dyn_bw : 1; - UINT32 bw : 3; -} TMAC_TXD_6, *PTMAC_TXD_6; -#else -typedef struct GNU_PACKED _TMAC_TXD_6 { - UINT32 bw : 3; - UINT32 dyn_bw : 1; - UINT32 ant_id : 12; - UINT32 tx_rate : 12; - UINT32 TxBF : 1; - UINT32 ldpc : 1; - UINT32 gi : 1; - UINT32 fix_rate_mode : 1; -} TMAC_TXD_6, *PTMAC_TXD_6; -#endif - -/* TMAC_TXD_6.fix_rate_mode */ -#define TMI_FIX_RATE_BY_TXD 0 -#define TMI_FIX_RATE_BY_CR 1 - -#define TMI_TX_RATE_BIT_STBC 11 -#define TMI_TX_RATE_BIT_NSS 9 -#define TMI_TX_RATE_MASK_NSS 0x3 - -#define TMI_TX_RATE_BIT_MODE 6 -#define TMI_TX_RATE_MASK_MODE 0x7 -#define TMI_TX_RATE_MODE_CCK 0 -#define TMI_TX_RATE_MODE_OFDM 1 -#define TMI_TX_RATE_MODE_HTMIX 2 -#define TMI_TX_RATE_MODE_HTGF 3 -#define TMI_TX_RATE_MODE_VHT 4 - -#define SHORT_PREAMBLE 0 -#define LONG_PREAMBLE 1 - -#define TMI_TX_RATE_BIT_MCS 0 -#define TMI_TX_RATE_MASK_MCS 0x3f -#define TMI_TX_RATE_CCK_1M_LP 0 -#define TMI_TX_RATE_CCK_2M_LP 1 -#define TMI_TX_RATE_CCK_5M_LP 2 -#define TMI_TX_RATE_CCK_11M_LP 3 - -#define TMI_TX_RATE_CCK_2M_SP 5 -#define TMI_TX_RATE_CCK_5M_SP 6 -#define TMI_TX_RATE_CCK_11M_SP 7 - -#define TMI_TX_RATE_OFDM_6M 11 -#define TMI_TX_RATE_OFDM_9M 15 -#define TMI_TX_RATE_OFDM_12M 10 -#define TMI_TX_RATE_OFDM_18M 14 -#define TMI_TX_RATE_OFDM_24M 9 -#define TMI_TX_RATE_OFDM_36M 13 -#define TMI_TX_RATE_OFDM_48M 8 -#define TMI_TX_RATE_OFDM_54M 12 - -#define TMI_TX_RATE_HT_MCS0 0 -#define TMI_TX_RATE_HT_MCS1 1 -#define TMI_TX_RATE_HT_MCS2 2 -#define TMI_TX_RATE_HT_MCS3 3 -#define TMI_TX_RATE_HT_MCS4 4 -#define TMI_TX_RATE_HT_MCS5 5 -#define TMI_TX_RATE_HT_MCS6 6 -#define TMI_TX_RATE_HT_MCS7 7 -#define TMI_TX_RATE_HT_MCS8 8 -#define TMI_TX_RATE_HT_MCS9 9 -#define TMI_TX_RATE_HT_MCS10 10 -#define TMI_TX_RATE_HT_MCS11 11 -#define TMI_TX_RATE_HT_MCS12 12 -#define TMI_TX_RATE_HT_MCS13 13 -#define TMI_TX_RATE_HT_MCS14 14 -#define TMI_TX_RATE_HT_MCS15 15 -#define TMI_TX_RATE_HT_MCS16 16 -#define TMI_TX_RATE_HT_MCS17 17 -#define TMI_TX_RATE_HT_MCS18 18 -#define TMI_TX_RATE_HT_MCS19 19 -#define TMI_TX_RATE_HT_MCS20 20 -#define TMI_TX_RATE_HT_MCS21 21 -#define TMI_TX_RATE_HT_MCS22 22 -#define TMI_TX_RATE_HT_MCS23 23 - -#define TMI_TX_RATE_HT_MCS32 32 - -#define TMI_TX_RATE_VHT_MCS0 0 -#define TMI_TX_RATE_VHT_MCS1 1 -#define TMI_TX_RATE_VHT_MCS2 2 -#define TMI_TX_RATE_VHT_MCS3 3 -#define TMI_TX_RATE_VHT_MCS4 4 -#define TMI_TX_RATE_VHT_MCS5 5 -#define TMI_TX_RATE_VHT_MCS6 6 -#define TMI_TX_RATE_VHT_MCS7 7 -#define TMI_TX_RATE_VHT_MCS8 8 -#define TMI_TX_RATE_VHT_MCS9 9 - -/****************************************************************************** - TMAC_TXD_7 -******************************************************************************/ -#define CON_SW_TX_TIME_MASK (0x3ff) -#define CON_SW_TX_TIME(p) ((p)&0x3ff) -#define CON_RSV_10_MASK ((0x1) << 10) -#define CON_RSV_10(p) (((p)&0x1) << 10) -#define CON_SPE_IDX_MASK ((0x1f) << 11) -#define CON_SPE_IDX(p) (((p)&0x1f) << 11) -#define CON_PSE_FID_MASK ((0x3fff) << 16) -#define CON_PSE_FID(p) (((p)&0x3fff) << 16) -#define CON_HW_AMSDU_CAP_MASK ((0x1) << 30) -#define CON_HW_AMSDU_CAP(p) (((p)&0x1) << 30) -#define CON_HIF_ERR_MASK ((0x1) << 31) -#define CON_HIF_ERR(p) (((p)&0x1) << 31) - -#define SW_TX_TIME_MASK (0xff) -#define SW_TX_TIME(p) (((p)&0xff)) -#define HW_RSV_TX_TIME_MASK ((0x3) << 8) -#define HW_RSV_TX_TIME(p) (((p)&0x3) << 8) -#define RSV_10_MASK ((0x1) << 10) -#define RSV_10(p) (((p)&0x1) << 10) -#define SPE_IDX_MASK ((0x1f) << 11) -#define SPE_IDX(p) (((p)&0x1f) << 11) -#define PP_REF_SUBTYPE_MASK ((0xf) << 16) -#define PP_REF_SUBTYPE(p) (((p)&0xf) << 16) -#define PP_REF_TYPE_MASK ((0x3) << 20) -#define PP_REF_TYPE(p) (((p)&0x3) << 20) -#define PSE_FID_MASK ((0x3ff) << 22) -#define PSE_FID(p) (((p)&0x3ff) << 22) - -/****************************************************************************** - TX Descriptor in Long Format (TMAC_TXD_1.FT = 1) - which including TMAC_TXD_0~ TMAC_TXD_7 -******************************************************************************/ -typedef struct GNU_PACKED _TMAC_TXD_L { - TMAC_TXD_0 TxD0; - TMAC_TXD_1 TxD1; - TMAC_TXD_2 TxD2; - TMAC_TXD_3 TxD3; - TMAC_TXD_4 TxD4; - TMAC_TXD_5 TxD5; - TMAC_TXD_6 TxD6; - UINT32 TxD7; -} TMAC_TXD_L, *PTMAC_TXD_L; - -/****************************************************************************** - TX Descriptor in Short Format (TMAC_TXD_1.FT = 0) - which including TMAC_TXD_0, TMAC_TXD_1, and TMAC_TXD_7 -******************************************************************************/ -/* - TX Descriptor in Short Format (TMAC_TXD_1.FT = 0) -*/ -typedef struct GNU_PACKED _TMAC_TXD_S { - TMAC_TXD_0 TxD0; - TMAC_TXD_1 TxD1; - UINT32 TxD7; -} TMAC_TXD_S, *PTMAC_TXD_S; - -#define NUM_OF_MSDU_ID_IN_TXD 4 -#define TXD_MAX_BUF_NUM 4 -#define TXD_MSDU_ID_VLD BIT(15) /* MSDU valid */ - -#define TXD_LEN_ML_V2 BIT(15) /* MSDU last */ -#define TXD_LEN_MASK_V2 BITS(0, 11) -#define TXD_LEN_AL BIT(15) /* A-MSDU last */ -#define TXD_LEN_ML BIT(14) /* MSDU last */ - -typedef struct _TXD_PTR_LEN_T { - UINT32 u4Ptr0; - UINT16 u2Len0; /* Bit15: AL, Bit14: ML */ - UINT16 u2Len1; /* Bit15: AL, Bit14: ML */ - UINT32 u4Ptr1; -} TXD_PTR_LEN_T, *P_TXD_PTR_LEN_T; - -typedef struct _MAC_TX_PKT_T { - /* DW0 and DW1 */ - UINT16 au2MsduId[NUM_OF_MSDU_ID_IN_TXD]; /* Bit15 indicate valid */ - - /* DW2 ~ DW22 */ - TXD_PTR_LEN_T arPtrLen[TXD_MAX_BUF_NUM / 2]; - - /* DW31 */ - /* UINT32 u4ReservedTail; */ -} MAC_TX_PKT_T, *P_MAC_TX_PKT_T; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXP_MSDU_INFO { - UINT32 msdu_vld_3 : 1; - UINT32 msdu_id_3 : 15; - UINT32 msdu_vld_2 : 1; - UINT32 msdu_id_2 : 15; - UINT32 msdu_vld_1 : 1; - UINT32 msdu_id_1 : 15; - UINT32 msdu_vld_0 : 1; - UINT32 msdu_id_0 : 15; -} TXP_MSDU_INFO; -#else -typedef struct GNU_PACKED _TXP_MSDU_INFO { - UINT32 msdu_id_0 : 15; - UINT32 msdu_vld_0 : 1; - - UINT32 msdu_id_1 : 15; - UINT32 msdu_vld_1 : 1; - - UINT32 msdu_id_2 : 15; - UINT32 msdu_vld_2 : 1; - - UINT32 msdu_id_3 : 15; - UINT32 msdu_vld_3 : 1; -} TXP_MSDU_INFO; -#endif /* RT_BIG_ENDIAN */ - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXP_MSDU_PTR { - UINT32 txp_addr_1; - UINT32 amsdu_last_1 : 1; - UINT32 msdu_last_1 : 1; - UINT32 src_1 : 1; - UINT32 tx_len_1 : 13; - UINT32 amsdu_last_0 : 1; - UINT32 msdu_last_0 : 1; - UINT32 src_0 : 1; - UINT32 tx_len_0 : 13; - UINT32 txp_addr_0; -} TXP_MSDU_PTR; -#else -typedef struct GNU_PACKED _TXP_MSDU_PTR { - UINT32 txp_addr_0; - - UINT32 tx_len_0 : 13; - UINT32 src_0 : 1; - UINT32 msdu_last_0 : 1; - UINT32 amsdu_last_0 : 1; - UINT32 tx_len_1 : 13; - UINT32 src_1 : 1; - UINT32 msdu_last_1 : 1; - UINT32 amsdu_last_1 : 1; - - UINT32 txp_addr_1; -} TXP_MSDU_PTR; -#endif /* RT_BIG_ENDIAN */ - -/* TxP Structure */ -typedef struct GNU_PACKED _TMAC_TXP_S { - struct _TXP_MSDU_INFO msdu_info; - struct _TXP_MSDU_PTR txp_list_01; - struct _TXP_MSDU_PTR txp_list_23; -} TMAC_TXP_S; - -typedef struct GNU_PACKED _TMAC_TXP_L { - struct _TXP_MSDU_INFO msdu_info; - struct _TXP_MSDU_PTR txp_list_01; - struct _TXP_MSDU_PTR txp_list_23; - struct _TXP_MSDU_PTR txp_list_45; - struct _TXP_MSDU_PTR txp_list_67; - struct _TXP_MSDU_PTR txp_list_89; - struct _TXP_MSDU_PTR txp_list_1011; - struct _TXP_MSDU_PTR txp_list_1213; -} TMAC_TXP_L; - -#define MAX_BUF_NUM_PER_PKT 6 -#define CUT_THROUGH_PAYLOAD_LEN 72 -/* Cut thorugh long format */ -typedef struct _CUT_TH_TXINFO_S { - /* DW0 ~ DW3 */ - TMAC_TXD_S txd_s; - - UINT16 u2TypeAndFlags; /* Bit0: cr4 refer to TXD of host*/ - UINT16 u2MsduToken; - UINT8 ucBssIndex; - UINT8 aucReserved[2]; - UINT8 ucBufNum; - - UINT32 au4BufPtr[MAX_BUF_NUM_PER_PKT]; - UINT16 au2BufLen[MAX_BUF_NUM_PER_PKT]; -} CUT_TH_TXINFO_S; - -/* Cut thorugh long format */ -typedef struct _CUT_TH_TXINFO_L { - /* DW0 ~ DW7 */ - TMAC_TXD_L txd_l; - - UINT16 u2TypeAndFlags; /* Bit0: cr4 refer to TXD of host */ - UINT16 u2MsduToken; - UINT8 ucBssIndex; - UINT8 aucReserved[2]; - UINT8 ucBufNum; - - UINT32 au4BufPtr[MAX_BUF_NUM_PER_PKT]; - UINT16 au2BufLen[MAX_BUF_NUM_PER_PKT]; -} CUT_TH_TXINFO_L; - -#define RMAC_RXD_0_PKT_TYPE_MASK 0xe0000000 -#define RMAC_RX_PKT_TYPE_RX_TXS 0x00 -#define RMAC_RX_PKT_TYPE_RX_TXRXV 0x01 -#define RMAC_RX_PKT_TYPE_RX_NORMAL 0x02 -#define RMAC_RX_PKT_TYPE_RX_DUP_RFB 0x03 -#define RMAC_RX_PKT_TYPE_RX_TMR 0x04 -#define RMAC_RX_PKT_TYPE_RETRIEVE 0x05 -#ifdef CUT_THROUGH -#define RMAC_RX_PKT_TYPE_TXRX_NOTIFY 0x06 -#endif /* CUT_THROUGH */ -#define RMAC_RX_PKT_TYPE_RX_EVENT 0x07 -#define RMAC_RX_PKT_TYPE(_x) (((_x)&RMAC_RXD_0_PKT_TYPE_MASK) >> 29) -#define RMAC_RXD_0_PKT_RX_BYTE_COUNT_MASK 0x0000ffff -#define RMAC_RX_PKT_RX_BYTE_COUNT(_x) (((_x)&RMAC_RXD_0_PKT_RX_BYTE_COUNT_MASK)) - -#ifdef RT_BIG_ENDIAN - -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TXS { - UINT32 TxSPktType : 3; - UINT32 TxSRsv : 8; - UINT32 TxSCnt : 5; - UINT32 TxSRxByteCnt : 16; -} RMAC_RXD_0_TXS, *PRMAC_RXD_0_TXS; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TXS { - UINT32 TxSRxByteCnt : 16; - UINT32 TxSCnt : 5; - UINT32 TxSRsv : 8; - UINT32 TxSPktType : 3; -} RMAC_RXD_0_TXS, *PRMAC_RXD_0_TXS; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TXRXV { - UINT32 PktType : 3; - UINT32 Rsv : 8; - UINT32 RxvCnt : 5; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0_TXRXV, *PRMAC_RXD_0_TXRXV; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TXRXV { - UINT32 RxByteCnt : 16; - UINT32 RxvCnt : 5; - UINT32 Rsv : 8; - UINT32 PktType : 3; -} RMAC_RXD_0_TXRXV, *PRMAC_RXD_0_TXRXV; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0 { - UINT32 PktType : 3; - UINT32 RfbGroupVld : 4; - UINT32 UdpTcpChkSumOffload : 1; - UINT32 IpChkSumOffload : 1; - UINT32 EthTypeOffset : 7; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0, *PRMAC_RXD_0; -#else -typedef struct GNU_PACKED _RMAC_RXD_0 { - UINT32 RxByteCnt : 16; - UINT32 EthTypeOffset : 7; - UINT32 IpChkSumOffload : 1; - UINT32 UdpTcpChkSumOffload : 1; - UINT32 RfbGroupVld : 4; - UINT32 PktType : 3; -} RMAC_RXD_0, *PRMAC_RXD_0; -#endif -/* ---UNIFIED_TXD_RXD */ - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_1 { - UINT32 RxDBssidIdx : 6; - UINT32 PayloadFmt : 2; - UINT32 HdrTranslation : 1; - UINT32 HdrOffset : 1; - UINT32 MacHdrLen : 6; - UINT32 ChFreq : 8; - UINT32 KeyId : 2; - UINT32 BcnWithUCast : 1; - UINT32 BcnWithBMcst : 1; - UINT32 BF_RPT : 1; - UINT32 a1_type : 2; - UINT32 HTC : 1; -} RMAC_RXD_1, *PRMAC_RXD_1; -#else -typedef struct GNU_PACKED _RMAC_RXD_1 { - UINT32 HTC : 1; - UINT32 a1_type : 2; - UINT32 BF_RPT : 1; - UINT32 BcnWithBMcst : 1; - UINT32 BcnWithUCast : 1; - UINT32 KeyId : 2; - UINT32 ChFreq : 8; - UINT32 MacHdrLen : 6; - UINT32 HdrOffset : 1; - UINT32 HdrTranslation : 1; - UINT32 PayloadFmt : 2; - UINT32 RxDBssidIdx : 6; -} RMAC_RXD_1, *PRMAC_RXD_1; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_2 { - UINT32 NonAmpduFrm : 1; - UINT32 NonAmpduSfrm : 1; - UINT32 NonDataFrm : 1; - UINT32 NullFrm : 1; - UINT32 FragFrm : 1; - UINT32 InterestedFrm : 1; - UINT32 HdrTransFail : 1; - UINT32 ExMaxRxLen : 1; - UINT32 DeAmsduFail : 1; - UINT32 LenMis : 1; - UINT32 TkipMicErr : 1; - UINT32 IcvErr : 1; - UINT32 CipherLenMis : 1; - UINT32 CipherMis : 1; - UINT32 FcsErr : 1; - UINT32 SwBit : 1; - UINT32 SecMode : 4; - UINT32 RxDTid : 4; - UINT32 RxDWlanIdx : 8; -} RMAC_RXD_2, *PRMAC_RXD_2; -#else -typedef struct GNU_PACKED _RMAC_RXD_2 { - UINT32 RxDWlanIdx : 8; - UINT32 RxDTid : 4; - UINT32 SecMode : 4; - UINT32 SwBit : 1; - UINT32 FcsErr : 1; - UINT32 CipherMis : 1; - UINT32 CipherLenMis : 1; - UINT32 IcvErr : 1; - UINT32 TkipMicErr : 1; - UINT32 LenMis : 1; - UINT32 DeAmsduFail : 1; - UINT32 ExMaxRxLen : 1; - UINT32 HdrTransFail : 1; - UINT32 InterestedFrm : 1; - UINT32 FragFrm : 1; - UINT32 NullFrm : 1; - UINT32 NonDataFrm : 1; - UINT32 NonAmpduSfrm : 1; - UINT32 NonAmpduFrm : 1; -} RMAC_RXD_2, *PRMAC_RXD_2; -#endif -/* ---UNIFIED_TXD_RXD */ - -/*//do unify -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED rmac_rxd_3_normal { - UINT32 pf_sts:2; - UINT32 pf_mode:1; - UINT32 cls_bitmap:10; - UINT32 wol:5; - UINT32 magic_pkt:1; - UINT32 OFLD:2; - UINT32 cls:1; - UINT32 pattern_drop_bit:1; - UINT32 tsf_compare_loss:1; - UINT32 rx_vector_seq:8; -} RMAC_RXD_3_NORMAL; -#else -typedef struct GNU_PACKED rmac_rxd_3_normal { - UINT32 rx_vector_seq:8; - UINT32 tsf_compare_loss:1; - UINT32 pattern_drop_bit:1; - UINT32 cls:1; - UINT32 OFLD:2; - UINT32 magic_pkt:1; - UINT32 wol:5; - UINT32 cls_bitmap:10; - UINT32 pf_mode:1; - UINT32 pf_sts:2; -} RMAC_RXD_3_NORMAL; -#endif -*/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TMR { - UINT32 PktType : 3; - UINT32 IR : 1; - UINT32 TodVld : 1; - UINT32 ToaVld : 1; - UINT32 SubType : 4; - UINT32 Type : 2; - UINT32 Tmf : 1; - UINT32 Nc : 1; - UINT32 TxVFrmMode : 2; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0_TMR, *PRMAC_RXD_0_TMR; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TMR { - UINT32 RxByteCnt : 16; - UINT32 TxVFrmMode : 2; - UINT32 Nc : 1; - UINT32 Tmf : 1; - UINT32 Type : 2; - UINT32 SubType : 4; - UINT32 ToaVld : 1; - UINT32 TodVld : 1; - UINT32 IR : 1; - UINT32 PktType : 3; -} RMAC_RXD_0_TMR, *PRMAC_RXD_0_TMR; -#endif -/* ---UNIFIED_TXD_RXD */ - -typedef union GNU_PACKED _RMAC_RXD_0_UNION { - struct _RMAC_RXD_0_TXS TxSD0; - struct _RMAC_RXD_0 RxD0; - struct _RMAC_RXD_0_TXRXV RxvD0; - struct _RMAC_RXD_0_TMR TmrD0; - UINT32 word; -} RMAC_RXD_0_UNION, *PRMAC_RXD_0_UNION; - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_3 { - UINT32 PfStatus : 2; - UINT32 PfMode : 1; - UINT32 ClsBitMap : 10; - UINT32 WoWlan : 5; - UINT32 MgcPkt : 1; - UINT32 OfldPf : 2; - UINT32 ClsPkt : 1; - UINT32 Drop : 1; - UINT32 Tcl : 1; - UINT32 RxVSeq : 8; -} RMAC_RXD_3, *PRMAC_RXD_3; -#else -typedef struct GNU_PACKED _RMAC_RXD_3 { - UINT32 RxVSeq : 8; - UINT32 Tcl : 1; - UINT32 Drop : 1; - UINT32 ClsPkt : 1; - UINT32 OfldPf : 2; - UINT32 MgcPkt : 1; - UINT32 WoWlan : 5; - UINT32 ClsBitMap : 10; - UINT32 PfMode : 1; - UINT32 PfStatus : 2; -} RMAC_RXD_3, *PRMAC_RXD_3; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -/* - Rx Normal Data frame Format -*/ -typedef struct GNU_PACKED _RXD_BASE_STRUCT { - /* DWORD 0 */ - struct _RMAC_RXD_0 RxD0; - /* DWORD 1 */ - struct _RMAC_RXD_1 RxD1; - /* DWORD 2 */ - struct _RMAC_RXD_2 RxD2; - /* DWORD 3 */ - /* struct rmac_rxd_3_normal RxD3;//do unify */ - struct _RMAC_RXD_3 RxD3; -} RXD_BASE_STRUCT, *PRXD_BASE_STRUCT; -/* ---UNIFIED_TXD_RXD */ - -#define RXS_GROUP1 (1 << 0) -#define RXS_GROUP2 (1 << 1) -#define RXS_GROUP3 (1 << 2) -#define RXS_GROUP4 (1 << 3) - -#define RMAC_INFO_BASE_SIZE 16 -#define RMAC_INFO_GRP_1_SIZE 16 -#define RMAC_INFO_GRP_2_SIZE 8 -#define RMAC_INFO_GRP_3_SIZE 24 -#define RMAC_INFO_GRP_4_SIZE 16 - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_4 { - /* DW4 */ - UINT32 TA0 : 16; - UINT32 FrmCtrl : 16; -} RMAC_RXD_4, *PRMAC_RXD_4; -#else -typedef struct GNU_PACKED _RMAC_RXD_4 { - /* DW4 */ - UINT32 FrmCtrl : 16; - UINT32 TA0 : 16; -} RMAC_RXD_4, *PRMAC_RXD_4; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_5 { - UINT32 TA1; -} RMAC_RXD_5, *PRMAC_RXD_5; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_6 { - UINT32 QoS : 16; - UINT32 Seq : 12; - UINT32 Frag : 4; -} RMAC_RXD_6, *PRMAC_RXD_6; -#else -typedef struct GNU_PACKED _RMAC_RXD_6 { - UINT32 Frag : 4; - UINT32 Seq : 12; - UINT32 QoS : 16; -} RMAC_RXD_6, *PRMAC_RXD_6; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_7 { - UINT32 HTCtrl; -} RMAC_RXD_7, *PRMAC_RXD_7; - -typedef struct GNU_PACKED _RXD_GRP4_STRUCT { - /* DWORD 4 */ - struct _RMAC_RXD_4 rxd_4; - - /* DWORD 5 */ - struct _RMAC_RXD_5 rxd_5; - - /* DWORD 6 */ - struct _RMAC_RXD_6 rxd_6; - - /* DWORD 7 */ - struct _RMAC_RXD_7 rxd_7; -} RXD_GRP4_STRUCT; - -typedef union GNU_PACKED _RMAC_RXD_8 { - UINT32 RscPn0; - UINT32 WPIPn0; - UINT32 Word; -} RMAC_RXD_8, *PRMAC_RXD_8; - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _RMAC_RXD_9 { - struct { - UINT32 Rsv : 16; - UINT32 PN : 16; - } RscPn1; - UINT32 WPIPn1; - UINT32 Word; -} RMAC_RXD_9, *PRMAC_RXD_9; -#else -typedef union GNU_PACKED _RMAC_RXD_9 { - struct { - UINT32 PN : 16; - UINT32 Rsv : 16; - } RscPn1; - UINT32 WPIPn1; - UINT32 Word; -} RMAC_RXD_9, *PRMAC_RXD_9; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_10 { - UINT32 WpiPn2; -} RMAC_RXD_10, *PRMAC_RXD_10; - -typedef struct GNU_PACKED _RMAC_RXD_11 { - UINT32 WpiPn3; -} RMAC_RXD_11, *PRMAC_RXD_11; - -typedef struct GNU_PACKED _RXD_GRP1_STRUCT { - /* DWORD 8 */ - union _RMAC_RXD_8 rxd_8; - - /* DWORD 9 */ - union _RMAC_RXD_9 rxd_9; - - /* DWORD 10 */ - struct _RMAC_RXD_10 rxd_10; - - /* DWORD 11 */ - struct _RMAC_RXD_11 rxd_11; -} RXD_GRP1_STRUCT; - -typedef struct GNU_PACKED _RMAC_RXD_12 { - UINT32 Timestamp; -} RMAC_RXD_12, *PRMAC_RXD_12; - -typedef struct GNU_PACKED _RMAC_RXD_13 { - UINT32 Crc; -} RMAC_RXD_13, *PRMAC_RXD_13; - -typedef struct GNU_PACKED _RXD_GRP2_STRUCT { - /* DWORD 12 */ - struct _RMAC_RXD_12 rxd_12; - - /* DWORD 13 */ - struct _RMAC_RXD_13 rxd_13; -} RXD_GRP2_STRUCT; - -typedef struct GNU_PACKED _RMAC_RXD_14 { - UINT32 RxVCycle1; -} RMAC_RXD_14, *PRMAC_RXD_14; - -typedef struct GNU_PACKED _RMAC_RXD_15 { - UINT32 RxVCycle2; -} RMAC_RXD_15, *PRMAC_RXD_15; - -typedef struct GNU_PACKED _RMAC_RXD_16 { - UINT32 RxVCycle3; -} RMAC_RXD_16, *PRMAC_RXD_16; - -typedef struct GNU_PACKED _RMAC_RXD_17 { - UINT32 RxVCycle4; -} RMAC_RXD_17, *PRMAC_RXD_17; - -typedef struct GNU_PACKED _RMAC_RXD_18 { - UINT32 RxVCycle5; -} RMAC_RXD_18, *PRMAC_RXD_18; - -typedef struct GNU_PACKED _RMAC_RXD_19 { - UINT32 RxVCycle6; -} RMAC_RXD_19, *PRMAC_RXD_19; - -typedef struct GNU_PACKED _RXD_GRP3_STRUCT { - /* DWORD 13 */ - struct _RMAC_RXD_13 rxd_13; - - /* DWORD 14 */ - struct _RMAC_RXD_14 rxd_14; - - /* DWORD 15 */ - struct _RMAC_RXD_15 rxd_15; - - /* DWORD 16 */ - struct _RMAC_RXD_16 rxd_16; - - /* DWORD 17 */ - struct _RMAC_RXD_17 rxd_17; - - /* DWORD 18 */ - struct _RMAC_RXD_18 rxd_18; - - /* DWORD 19 */ - struct _RMAC_RXD_19 rxd_19; - -} RXD_GRP3_STRUCT; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_CSO_STRUCT { - UINT32 Rsv11to31 : 21; - UINT32 UnknownNextHdr : 1; - UINT32 IpFrag : 1; - UINT32 IpLenMismatch : 1; - UINT32 ChksumType : 4; - UINT32 ChksumStatus : 4; -} RX_CSO_STRUCT; -#else -typedef struct GNU_PACKED _RX_CSO_STRUCT { - UINT32 ChksumStatus : 4; - UINT32 ChksumType : 4; - UINT32 IpLenMismatch : 1; - UINT32 IpFrag : 1; - UINT32 UnknownNextHdr : 1; - UINT32 Rsv11to31 : 21; -} RX_CSO_STRUCT; -#endif - -/****************************************************************************** - LMAC TxS Structure - - TXS_D_0 - TXS_D_1 - TXS_D_2 - TXS_D_3 - TXS_D_4 - TXS_D_5 - TXS_D_6 -******************************************************************************/ - -/****************************************************************************** - TXS_D_0 -******************************************************************************/ -/* TX Status Report Format */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_0 { - UINT32 TxS_PId : 8; - UINT32 Rsv23 : 1; - UINT32 BAFail : 1; - UINT32 PSBit : 1; - UINT32 TxOp : 1; - UINT32 BE : 1; - UINT32 LE : 1; - UINT32 RE : 1; - UINT32 ME : 1; - UINT32 TxS2H : 1; - UINT32 TxS2M : 1; - UINT32 TxSFmt : 1; - UINT32 TxS_FR : 1; - UINT32 TxRate : 12; -} TXS_D_0, *PTXS_D_0; -#else -typedef struct GNU_PACKED _TXS_D_0 { - UINT32 TxRate : 12; - UINT32 TxS_FR : 1; - UINT32 TxSFmt : 1; - UINT32 TxS2M : 1; - UINT32 TxS2H : 1; - UINT32 ME : 1; - UINT32 RE : 1; - UINT32 LE : 1; - UINT32 BE : 1; - UINT32 TxOp : 1; - UINT32 PSBit : 1; - UINT32 BAFail : 1; - UINT32 Rsv23 : 1; - UINT32 TxS_PId : 8; -} TXS_D_0, *PTXS_D_0; -#endif - -/****************************************************************************** - TXS_D_1 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_1 { - UINT32 TxS_AntId : 12; - UINT32 TxS_RespRate : 4; - UINT32 TxS_TxBW : 2; - UINT32 TxS_ITxBF : 1; - UINT32 TxS_ETxBF : 1; - UINT32 TxS_Tid : 3; - UINT32 TxS_AMPDU : 1; - UINT32 TxS_FianlMPDU : 1; - UINT32 TxPwrdBm : 7; -} TXS_D_1, *PTXS_D_1; -#else -typedef struct GNU_PACKED _TXS_D_1 { - UINT32 TxPwrdBm : 7; - UINT32 TxS_FianlMPDU : 1; - UINT32 TxS_AMPDU : 1; - UINT32 TxS_Tid : 3; - UINT32 TxS_ETxBF : 1; - UINT32 TxS_ITxBF : 1; - UINT32 TxS_TxBW : 2; - UINT32 TxS_RespRate : 4; - UINT32 TxS_AntId : 12; -} TXS_D_1, *PTXS_D_1; -#endif - -/****************************************************************************** - TXS_D_2 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_2 { - UINT32 TxS_WlanIdx : 8; - UINT32 TxS_RxVSN : 8; - UINT32 TxS_TxDelay : 16; -} TXS_D_2, *PTXS_D_2; -#else -typedef struct GNU_PACKED _TXS_D_2 { - UINT32 TxS_TxDelay : 16; - UINT32 TxS_RxVSN : 8; - UINT32 TxS_WlanIdx : 8; -} TXS_D_2, *PTXS_D_2; -#endif - -/****************************************************************************** - TXS_D_3 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TXS_D_3 { - struct { - UINT32 TxS_LastTxRateIdx : 3; - UINT32 TxS_MpduTxCnt : 5; - UINT32 TxS_Rsv : 12; - UINT32 TxS_SN : 12; - } type_0; - - struct { - UINT32 TxS_LastTxRateIdx : 3; - UINT32 TxS_MpduTxCnt : 5; - UINT32 TxS_TSSI1 : 12; - UINT32 TxS_TSSI0 : 12; - } type_1; - - UINT32 word; -} TXS_D_3, *PTXS_D_3; -#else -typedef union GNU_PACKED _TXS_D_3 { - struct { - UINT32 TxS_SN : 12; - UINT32 TxS_Rsv : 12; - UINT32 TxS_MpduTxCnt : 5; - UINT32 TxS_LastTxRateIdx : 3; - } type_0; - - struct { - UINT32 TxS_TSSI0 : 12; - UINT32 TxS_TSSI1 : 12; - UINT32 TxS_MpduTxCnt : 5; - UINT32 TxS_LastTxRateIdx : 3; - } type_1; - - UINT32 word; -} TXS_D_3, *PTXS_D_3; -#endif - -/****************************************************************************** - TXS_D_4 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TXS_D_4 { - struct { - UINT32 TimeStamp; - } type_0; - - struct { - UINT32 TxS_Rsv : 8; - UINT32 TxS_TSSI3 : 12; - UINT32 TxS_TSSI2 : 12; - } type_1; - - UINT32 word; -} TXS_D_4, *PTXS_D_4; -#else -typedef union GNU_PACKED _TXS_D_4 { - struct { - UINT32 TimeStamp; - } type_0; - - struct { - UINT32 TxS_TSSI2 : 12; - UINT32 TxS_TSSI3 : 12; - UINT32 TxS_Rsv : 8; - } type_1; - - UINT32 word; -} TXS_D_4, *PTXS_D_4; -#endif - -/****************************************************************************** - TXS_D_5 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TXS_D_5 { - struct { - UINT32 TxS_Rsv : 7; - UINT32 TxS_FrontTime : 25; - } type_0; - - struct { - UINT32 TxS_Noise3 : 8; - UINT32 TxS_Noise2 : 8; - UINT32 TxS_Noise1 : 8; - UINT32 TxS_Noise0 : 8; - } type_1; - - UINT32 word; -} TXS_D_5, *PTXS_D_5; -#else -typedef union GNU_PACKED _TXS_D_5 { - struct { - UINT32 TxS_FrontTime : 25; - UINT32 TxS_Rsv : 7; - } type_0; - - struct { - UINT32 TxS_Noise0 : 8; - UINT32 TxS_Noise1 : 8; - UINT32 TxS_Noise2 : 8; - UINT32 TxS_Noise3 : 8; - } type_1; - - UINT32 word; -} TXS_D_5, *PTXS_D_5; -#endif - -/* TODO: shiang-MT7615, not mofiy yet for DW6~DW6 !! */ -/****************************************************************************** - TXS_D_6 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TXS_D_6 { - struct { - UINT32 TxS_Rsv; - } type_0; - - struct { - UINT32 RCPI3 : 8; - UINT32 RCPI2 : 8; - UINT32 RCPI1 : 8; - UINT32 RCPI0 : 8; - } type_1; - - UINT32 Word; -} TXS_D_6, *PTXS_D_6; -#else -typedef union GNU_PACKED _TXS_D_6 { - struct { - UINT32 TxS_Rsv; - } type_0; - - struct { - UINT32 RCPI0 : 8; - UINT32 RCPI1 : 8; - UINT32 RCPI2 : 8; - UINT32 RCPI3 : 8; - } type_1; - - UINT32 Word; -} TXS_D_6, *PTXS_D_6; -#endif /* RT_BIG_ENDIAN */ - -/****************************************************************************** - TXS_STRUC -******************************************************************************/ -typedef struct GNU_PACKED _TXS_STRUC { - TXS_D_0 TxSD0; - TXS_D_1 TxSD1; - TXS_D_2 TxSD2; - TXS_D_3 TxSD3; - TXS_D_4 TxSD4; - TXS_D_5 TxSD5; - TXS_D_6 TxSD6; -} TXS_STRUC; - -/****************************************************************************** - TXS Frame Format -******************************************************************************/ -typedef struct GNU_PACKED _TXS_FRM_STRUC { - struct _RMAC_RXD_0_TXS TxSD0; - TXS_STRUC txs_info[0]; -} TXS_FRM_STRUC; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_1ST_CYCLE { - UINT32 ACID_DET_UPPER : 1; - UINT32 ACID_DET_LOWER : 1; - UINT32 VHTA2_B8_B3 : 6; - UINT32 NumRx : 2; - UINT32 HtNoSound : 1; - UINT32 HtSmooth : 1; - UINT32 HtShortGi : 1; - UINT32 HtAggregation : 1; - UINT32 VHTA1_B22 : 1; - UINT32 FrMode : 2; - UINT32 TxMode : 3; - UINT32 HtExtltf : 2; - UINT32 HtAdCode : 1; - UINT32 HtStbc : 2; - UINT32 TxRate : 7; -} RX_VECTOR1_1ST_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_1ST_CYCLE { - UINT32 TxRate : 7; - UINT32 HtStbc : 2; - UINT32 HtAdCode : 1; /*0: BCC, 1:LDPC */ - UINT32 HtExtltf : 2; - UINT32 TxMode : 3; - UINT32 FrMode : 2; - UINT32 VHTA1_B22 : 1; - UINT32 HtAggregation : 1; - UINT32 HtShortGi : 1; - UINT32 HtSmooth : 1; - UINT32 HtNoSound : 1; - UINT32 NumRx : 2; - UINT32 VHTA2_B8_B3 : 6; - UINT32 ACID_DET_LOWER : 1; - UINT32 ACID_DET_UPPER : 1; -} RX_VECTOR1_1ST_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_2ND_CYCLE { - UINT32 SelAnt : 1; - UINT32 RxValidIndicator : 1; - UINT32 NstsField : 3; - UINT32 GroupId : 6; - UINT32 Length : 21; -} RX_VECTOR1_2ND_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_2ND_CYCLE { - UINT32 Length : 21; - UINT32 GroupId : 6; - UINT32 NstsField : 3; - UINT32 RxValidIndicator : 1; - UINT32 SelAnt : 1; -} RX_VECTOR1_2ND_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_3TH_CYCLE { - UINT32 WBRssiRx : 8; - UINT32 IBRssiRx : 8; - UINT32 FgacCalLnaRx : 2; - UINT32 POPEverTrig : 1; - UINT32 BFAgcApply : 1; - UINT32 VHTA1_B21_B10 : 12; -} RX_VECTOR1_3TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_3TH_CYCLE { - UINT32 VHTA1_B21_B10 : 12; - UINT32 BFAgcApply : 1; - UINT32 POPEverTrig : 1; - UINT32 FgacCalLnaRx : 2; - UINT32 IBRssiRx : 8; - UINT32 WBRssiRx : 8; -} RX_VECTOR1_3TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_4TH_CYCLE { - UINT32 RCPI3 : 8; - UINT32 RCPI2 : 8; - UINT32 RCPI1 : 8; - UINT32 RCPI0 : 8; -} RX_VECTOR1_4TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_4TH_CYCLE { - UINT32 RCPI0 : 8; - UINT32 RCPI1 : 8; - UINT32 RCPI2 : 8; - UINT32 RCPI3 : 8; -} RX_VECTOR1_4TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_5TH_CYCLE { - UINT32 MISC1 : 25; - UINT32 NoiseBalanceEnable : 1; - UINT32 FagcLpfGainx : 4; - UINT32 FagcLnaGainx : 2; -} RX_VECTOR1_5TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_5TH_CYCLE_MISC_OFDM { - UINT32 OfdmFoe : 12; - UINT32 LtfProcTime : 7; - UINT32 rx_ce_ltf_snr : 6; -} RX_VECTOR1_5TH_CYCLE_MISC_OFDM; - -typedef struct GNU_PACKED _RX_VECTOR1_5TH_CYCLE_MISC_CCK { - UINT32 CckFoe : 11; - UINT32 InitDfeLmsErr : 10; - UINT32 MRC : 2; - UINT32 AntSelectR0_R1 : 2; -} RX_VECTOR1_5TH_CYCLE_MISC_CCK; - -typedef struct GNU_PACKED _RX_VECTOR1_5TH_CYCLE { - UINT32 FagcLnaGainx : 2; - UINT32 FagcLpfGainx : 4; - UINT32 NoiseBalanceEnable : 1; - UINT32 MISC1 : 25; -} RX_VECTOR1_5TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_6TH_CYCLE { - UINT32 Nf3 : 8; - UINT32 Nf2 : 8; - UINT32 Nf1 : 8; - UINT32 Nf0 : 8; -} RX_VECTOR1_6TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_6TH_CYCLE { - UINT32 Nf0 : 8; - UINT32 Nf1 : 8; - UINT32 Nf2 : 8; - UINT32 Nf3 : 8; -} RX_VECTOR1_6TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_1ST_CYCLE { - UINT32 FCSErr : 1; - UINT32 RxCERmsd : 3; - UINT32 VHT_A2 : 2; - UINT32 ScrambleSeed : 3; - UINT32 BtEnv : 1; - UINT32 RxLQ : 14; - UINT32 Sec80ItfrEnv : 1; - UINT32 Sec40ItfrEnv : 1; - UINT32 SecItfrEnv : 1; - UINT32 PrimItfrEnv : 1; -} RX_VECTOR2_1ST_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_1ST_CYCLE { - UINT32 PrimItfrEnv : 1; - UINT32 SecItfrEnv : 1; - UINT32 Sec40ItfrEnv : 1; - UINT32 Sec80ItfrEnv : 1; - UINT32 RxLQ : 14; - UINT32 BtEnv : 1; - UINT32 ScrambleSeed : 3; - UINT32 VHT_A2 : 2; - UINT32 RxCERmsd : 3; - UINT32 FCSErr : 1; -} RX_VECTOR2_1ST_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_2ND_CYCLE { - UINT32 WBRssi0 : 8; - UINT32 IBRssi0 : 8; - UINT32 CagcSTFDet : 3; - UINT32 HtSTFDet : 1; - UINT32 PostDewSecCh : 1; - UINT32 PostBWDSecCh : 2; - UINT32 RxBW : 2; - UINT32 PostTMD : 7; -} RX_VECTOR2_2ND_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_2ND_CYCLE { - UINT32 PostTMD : 7; - UINT32 RxBW : 2; - UINT32 PostBWDSecCh : 2; - UINT32 PostDewSecCh : 1; - UINT32 HtSTFDet : 1; - UINT32 CagcSTFDet : 3; - UINT32 IBRssi0 : 8; - UINT32 WBRssi0 : 8; -} RX_VECTOR2_2ND_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_3TH_CYCLE { - UINT32 FcsErr : 1; - UINT32 OfdmDewModeDet : 1; - UINT32 OfdmCeLtfComb : 1; - UINT32 OfdmCeGicEnb : 1; - UINT32 OfdmCeRmsdId : 3; - UINT32 Reserved1 : 1; - UINT32 BgAgcWbRssix : 8; - UINT32 BfAgcIbRssix : 8; - UINT32 BfAgcLpfGain : 4; - UINT32 Reserved0 : 1; - UINT32 BfAgcLnaGainx : 2; - UINT32 HtStfDet : 1; -} RX_VECTOR2_3TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_3TH_CYCLE { - UINT32 HtStfDet : 1; - UINT32 BfAgcLnaGainx : 2; - UINT32 Reserved0 : 1; - UINT32 BfAgcLpfGain : 4; - UINT32 BfAgcIbRssix : 8; - UINT32 BgAgcWbRssix : 8; - UINT32 Reserved1 : 1; - UINT32 OfdmCeRmsdId : 3; - UINT32 OfdmCeGicEnb : 1; - UINT32 OfdmCeLtfComb : 1; - UINT32 OfdmDewModeDet : 1; - UINT32 FcsErr : 1; -} RX_VECTOR2_3TH_CYCLE; -#endif - -typedef struct _RXV_INFO { - INT32 Rssi0; - INT32 Rssi1; -} RXV_INFO; - -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _RXV_DWORD0 { - UINT32 TA_0_31; -} RXV_DWORD0; -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RXV_DWORD1 { - UINT32 Reserved : 7; - UINT32 TR : 1; - UINT32 RxvSn : 8; - UINT32 TA_32_47 : 16; -} RXV_DWORD1; -#else -typedef struct GNU_PACKED _RXV_DWORD1 { - UINT32 TA_32_47 : 16; - UINT32 RxvSn : 8; - UINT32 TR : 1; - UINT32 Reserved : 7; -} RXV_DWORD1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -/* RX/TX-Status Vector Format */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RXV_STRUC { - UINT32 Ta0; - UINT32 Rsv25To31 : 7; - UINT32 Tr : 1; - UINT32 RxVSn : 8; - UINT32 Ta32 : 16; - UINT32 Vector1[6]; - UINT32 Vector2[3]; -} RXV_STRUC, *PRXV_STRUC; -#else -typedef struct GNU_PACKED _RXV_STRUC { - UINT32 Ta0; - UINT32 Ta32 : 16; - UINT32 RxVSn : 8; - UINT32 Tr : 1; - UINT32 Rsv25To31 : 7; - UINT32 Vector1[6]; - UINT32 Vector2[3]; -} RXV_STRUC, *PRXV_STRUC; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _RXV_FRM_STRUC { - struct _RMAC_RXD_0_TXRXV RxVD0; - RXV_STRUC RxVInfo[0]; -} RXV_FRM_STRUC, *PRXV_FRM_STRUC; -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - LMAC TMR Structure - - TMR_D_1 - TMR_D_2 - TMR_D_6 -******************************************************************************/ - -/****************************************************************************** - TMR_D_1 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -/* - Timing Measurement Report Format -*/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_1 { - struct { - UINT32 TxvTxMode : 3; - UINT32 RxvDw1Bit29 : 1; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvTxMode : 3; - UINT32 RxvFrMode : 2; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvDw3Bit6 : 1; - UINT32 ToAeReport : 6; - UINT32 TodFine : 6; - UINT32 Pid : 8; - } field_init; - - struct { - UINT32 TxvTxMode : 3; - UINT32 RxvDw1Bit29 : 1; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvTxMode : 3; - UINT32 RxvFrMode : 2; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvDw3Bit6 : 1; - UINT32 ToAeReport : 6; - UINT32 TodFine : 6; - UINT32 RxvSn : 8; - } field_resp; - - UINT32 word; -} TMR_D_1, *PTMR_D_1; -#else -typedef union GNU_PACKED _TMR_D_1 { - struct { - UINT32 Pid : 8; - UINT32 TodFine : 6; - UINT32 ToAeReport : 6; - UINT32 RxvDw3Bit6 : 1; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvFrMode : 2; - UINT32 RxvTxMode : 3; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvDw1Bit29 : 1; - UINT32 TxvTxMode : 3; - } field_init; - - struct { - UINT32 RxvSn : 8; - UINT32 TodFine : 6; - UINT32 ToAeReport : 6; - UINT32 RxvDw3Bit6 : 1; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvFrMode : 2; - UINT32 RxvTxMode : 3; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvDw1Bit29 : 1; - UINT32 TxvTxMode : 3; - } field_resp; - - UINT32 word; -} TMR_D_1, *PTMR_D_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMR_D_2 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_2 { - struct { - UINT32 SnField : 16; - UINT32 Ta0 : 16; - } field; - - UINT32 word; -} TMR_D_2, *PTMR_D_2; -#else -typedef union GNU_PACKED _TMR_D_2 { - struct { - UINT32 Ta0 : 16; - UINT32 SnField : 16; - } field; - - UINT32 word; -} TMR_D_2, *PTMR_D_2; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMR_D_6 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_6 { - struct { - UINT32 ToA32 : 16; - UINT32 ToD32 : 16; - } field; - - UINT32 word; -} TMR_D_6, *PTMR_D_6; -#else -typedef union GNU_PACKED _TMR_D_6 { - struct { - UINT32 ToD32 : 16; - UINT32 ToA32 : 16; - } field; - - UINT32 word; -} TMR_D_6, *PTMR_D_6; -#endif -/* ---UNIFIED_TXD_RXD */ - -#ifdef TMR_GEN2 -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_7 { - struct { - UINT32 Rsv : 31; - UINT32 DacOutput : 1; - } field; - - UINT32 word; -} TMR_D_7, *PTMR_D_7; -#else -typedef union GNU_PACKED _TMR_D_7 { - struct { - UINT32 DacOutput : 1; - UINT32 Rsv : 31; - } field; - - UINT32 word; -} TMR_D_7, *PTMR_D_7; -#endif /* RT_BIG_ENDIAN */ - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_8 { - struct { - UINT32 DBDC : 1; - UINT32 UnknownBit : 1; - UINT32 Rsv2 : 7; - UINT32 RmsId : 3; - UINT32 FailReason : 4; - UINT32 Rsv1 : 5; - UINT32 LtfSyncStartAddr : 11; - } field_ofdm; - - struct { - UINT32 Rsv : 29; - UINT32 FailReason : 3; - } field_cck; - - UINT32 word; -} TMR_D_8, *PTMR_D_8; -#else -typedef union GNU_PACKED _TMR_D_8 { - struct { - UINT32 FailReason : 3; - UINT32 Rsv : 29; - } field_cck; - - struct { - UINT32 LtfSyncStartAddr : 11; - UINT32 Rsv1 : 5; - UINT32 FailReason : 4; - UINT32 RmsId : 3; - UINT32 Rsv2 : 7; - UINT32 UnknownBit : 1; - UINT32 DBDC : 1; - } field_ofdm; - - UINT32 word; -} TMR_D_8, *PTMR_D_8; -#endif /* RT_BIG_ENDIAN */ -#endif /* TMR_GEN2 */ - -/****************************************************************************** - TMR_FRM_STRUC -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMR_FRM_STRUC { - struct _RMAC_RXD_0_TMR TmrD0; - TMR_D_1 TmrD1; - TMR_D_2 TmrD2; - UINT32 Ta16; - UINT32 ToD0; - UINT32 ToA0; - TMR_D_6 TmrD6; -#ifdef TMR_GEN2 - TMR_D_7 TmrD7; - TMR_D_8 TmrD8; -#endif -} TMR_FRM_STRUC, *PTMR_FRM_STRUC; -/* ---UNIFIED_TXD_RXD */ - -typedef struct wtbl_entry { - UINT8 wtbl_idx; - struct wtbl_struc wtbl; - UINT32 wtbl_addr; -} WTBL_ENTRY; - -/* TODO: shiang-MT7615 */ -#define MT7615_MT_WTBL_SIZE 128 -#define MT7622_MT_WTBL_SIZE 128 -#define MT_DMAC_BA_AGG_RANGE 8 -#define MT_DMAC_BA_STAT_RANGE 8 - -#define MT_PSE_BASE_ADDR 0xa0000000 -#define MT_PSE_PAGE_SIZE 128 - -#define MT_PCI_REMAP_ADDR_1 0x40000 -#define MT_PCI_REMAP_ADDR_2 0x80000 - -#ifdef MAC_REPEATER_SUPPORT -#define MAX_EXT_MAC_ADDR_SIZE 32 -/* TODO: Carter, single driver case? */ -#endif /* MAC_REPEATER_SUPPORT */ - -/* TODO: shiang-MT7615, move to top.h! */ -#define MCU_CFG_BASE 0x2000 -#define MCU_COM_REG1 (MCU_CFG_BASE + 0x204) -#ifdef ERR_RECOVERY -#define MCU_COM_REG1_SER_PSE BIT(0) -#define MCU_COM_REG1_SER_PLE BIT(1) -#define MCU_COM_REG1_SER_PCIE BIT(2) -#define MCU_COM_REG1_SER_PDMA BIT(3) -#define MCU_COM_REG1_SER_LMAC_TX BIT(4) -#define MCU_COM_REG1_SER_SEC_RF_RX BIT(5) -#endif /* ERR_RECOVERY */ - -#define MCU_PCIE_REMAP_1 (MCU_CFG_BASE + 0x500) -#define REMAP_1_OFFSET_MASK (0x3ffff) -#define GET_REMAP_1_OFFSET(p) (((p)&REMAP_1_OFFSET_MASK)) -#define REMAP_1_BASE_MASK (0x3fff << 18) -#define GET_REMAP_1_BASE(p) (((p)&REMAP_1_BASE_MASK) >> 18) -#define MCU_PCIE_REMAP_2 (MCU_CFG_BASE + 0x504) -#define REMAP_2_OFFSET_MASK (0x7ffff) -#define GET_REMAP_2_OFFSET(p) (((p)&REMAP_2_OFFSET_MASK)) -#define REMAP_2_BASE_MASK (0x1fff << 19) -#define GET_REMAP_2_BASE(p) (((p)&REMAP_2_BASE_MASK) >> 19) - -/* leo: defined in top.h #define TOP_CFG_BASE 0x0000 */ - -#define XTAL_CTL4 (TOP_CFG_BASE + 0x1210) -#define XTAL_CTL13 (TOP_CFG_BASE + 0x1234) -#define XTAL_CTL14 (TOP_CFG_BASE + 0x1238) -#define DA_XO_C2_MASK (0x7f << 8) -#define DA_XO_C2(p) (((p)&0x7f) << 8) - -/* Indicate the txs report to Host or MCU */ -typedef enum { - TXS2MCU = 0, - TXS2HOST = 1, -} TXS_TARGET_PORT; - -#define TXS2MCU_AGGNUMS 31 -#define TXS2HOST_AGGNUMS 31 - -enum { - TXS2M_QID0, - TXS2M_QID1, - TXS2M_QID2, - TXS2M_QID3, -}; - -enum { - TXS2H_QID0, - TXS2H_QID1, -}; - -enum { - TXS_FORMAT0, - TXS_FORMAT1, -}; - -#define SHAREDKEYTABLE 0 -#define PAIRWISEKEYTABLE 1 - -#define TSO_SIZE 0 - -#define EXP_ACK_TIME 0x1380 - -/* [0:7]=RX_MAX_PTIME (unit=20us), [8:14]=RX_MAX_PINT, [15]=RX_DLY_INT_EN */ -#define RX_DLY_INT_CFG (0x811c) - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TX_STA_CNT0_STRUC { - struct { - UINT16 TxBeaconCount; - UINT16 TxFailCount; - } field; - UINT32 word; -} TX_STA_CNT0_STRUC; -#else -typedef union GNU_PACKED _TX_STA_CNT0_STRUC { - struct { - UINT16 TxFailCount; - UINT16 TxBeaconCount; - } field; - UINT32 word; -} TX_STA_CNT0_STRUC; -#endif - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TX_STA_CNT1_STRUC { - struct { - UINT16 TxRetransmit; - UINT16 TxSuccess; - } field; - UINT32 word; -} TX_STA_CNT1_STRUC; -#else -typedef union GNU_PACKED _TX_STA_CNT1_STRUC { - struct { - UINT16 TxSuccess; - UINT16 TxRetransmit; - } field; - UINT32 word; -} TX_STA_CNT1_STRUC; -#endif - -typedef struct __DMAC_TX_CNT_INFO { - union WTBL_DW14 wtbl_wd14; - union WTBL_DW15 wtbl_wd15; - union WTBL_DW16 wtbl_wd16; - union WTBL_DW17 wtbl_wd17; -} DMAC_TX_CNT_INFO; - -#define E2PROM_CSR 0x0004 -#define GPIO_CTRL_CFG 0x0228 -#define WSC_HDR_BTN_GPIO_0 ((UINT32)0x00000001) /* bit 0 for RT2860/RT2870 */ -#define WSC_HDR_BTN_GPIO_3 ((UINT32)0x00000008) /* bit 3 for RT2860/RT2870 */ - -#ifdef DBDC_MODE -#define DBDC_BAND_NUM 2 -#else -#define DBDC_BAND_NUM 1 -#endif /* DBDC_MODE */ - -#define DBDC_BAND0 0 -#define DBDC_BAND1 1 - -struct _RTMP_ADAPTER; - -VOID dump_mt_mac_cr(struct _RTMP_ADAPTER *pAd); -INT dump_dmac_amsdu_info(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); -VOID Update_Mib_Bucket_One_Sec(struct _RTMP_ADAPTER *pAd); -VOID Update_Mib_Bucket_500Ms(struct _RTMP_ADAPTER *pAd); - -#ifdef CUSTOMER_RSG_FEATURE -VOID Read_Mib_TxRx_Counters(struct _RTMP_ADAPTER *pAd); -#endif - -INT mt_wtbl_init_ByFw(struct _RTMP_ADAPTER *pAd); -INT mt_wtbl_init_ByDriver(struct _RTMP_ADAPTER *pAd); -INT mt_mac_init(struct _RTMP_ADAPTER *pAd); -INT mt_hw_tb_init(struct _RTMP_ADAPTER *pAd, BOOLEAN bHardReset); - -INT mt_wtbl_get_entry234(struct _RTMP_ADAPTER *pAd, UCHAR idx, - struct wtbl_entry *ent); -VOID dump_wtbl_entry(struct _RTMP_ADAPTER *pAd, struct wtbl_entry *ent); -VOID dump_wtbl_info(struct _RTMP_ADAPTER *pAd, UINT wtbl_idx); -VOID dump_wtbl_base_info(struct _RTMP_ADAPTER *pAd); - -INT mt_mac_set_ctrlch(struct _RTMP_ADAPTER *pAd, UINT8 extch); -#ifdef GREENAP_SUPPORT -INT rtmp_mac_set_mmps(struct _RTMP_ADAPTER *pAd, INT ReduceCorePower); -#endif /* GREENAP_SUPPORT */ - -UINT16 tx_rate_to_tmi_rate(UINT8 mode, UINT8 mcs, UINT8 nss, BOOLEAN stbc, - UINT8 preamble); -UCHAR get_nsts_by_mcs(UCHAR phy_mode, UCHAR mcs, BOOLEAN stbc, UCHAR vht_nss); -VOID mt_chip_info_show(struct _RTMP_ADAPTER *pAd); - -#define HIF_PORT 1 -#define MCU_PORT 2 -#define MT_TX_RETRY_UNLIMIT 0x1f -#define MT_TX_SHORT_RETRY 0x07 -#define MT_TX_LONG_RETRY 0x0f - -INT mt_nic_asic_init(struct _RTMP_ADAPTER *pAd); - -struct _CR4_TXP_MSDU_INFO; -struct _TX_BLK; -struct _MAC_TX_INFO; -union _HTTRANSMIT_SETTING; -struct _TMAC_INFO; -INT32 dump_txp_info(struct _RTMP_ADAPTER *pAd, - struct _CR4_TXP_MSDU_INFO *txp_info); -INT32 mtd_write_txp_info_by_cr4(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TX_BLK *pTxBlk); -INT32 mtd_write_txp_info_by_host(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TX_BLK *pTxBlk); -INT32 mtd_write_txp_info_by_host_v2(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TX_BLK *pTxBlk); -VOID mtd_write_tmac_info(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TX_BLK *pTxBlk); -VOID mtd_write_tmac_info_by_cr4(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TX_BLK *pTxBlk); -VOID mtd_write_tmac_info_by_host(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TX_BLK *pTxBlk); -INT mtd_check_hw_resource(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR resource_idx); -INT mtd_hw_tx(struct _RTMP_ADAPTER *pAd, struct _TX_BLK *tx_blk); -INT mtd_mlme_hw_tx(struct _RTMP_ADAPTER *pAd, UCHAR *tmac_info, - struct _MAC_TX_INFO *info, - union _HTTRANSMIT_SETTING *transmit, struct _TX_BLK *tx_blk); -INT32 mtd_ate_hw_tx(struct _RTMP_ADAPTER *pAd, struct _TMAC_INFO *info, - struct _TX_BLK *tx_blk); -BOOLEAN in_altx_filter_list(UCHAR sub_type); - -extern UCHAR dmac_wmm_swq_2_hw_ac_que[4][4]; -extern const UCHAR altx_filter_list[]; - -#ifdef MGMT_TXPWR_CTRL -INT wtbl_update_pwr_offset(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -#endif -#endif /* __MT_DMAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/pse.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/pse.h deleted file mode 100644 index 7b65bce23a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/pse.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - pse.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __PSE_H__ -#define __PSE_H__ - -#define PSE_BASE 0xc000 - -/* PSE Reset Control Register */ -#define PSE_RESET (PSE_BASE + 0x00) -#define PSE_ALL_RST (1 << 0) -#define PSE_LOGICAL_RST (1 << 1) -#define PSE_INIT_DONE (1 << 2) -#define GET_PSE_INIT_DONE(p) (((p)&PSE_INIT_DONE) >> 2) - -/* PSE Buffer Control Register */ -#define PSE_PBUF_CTRL (PSE_BASE + 0x14) -#define PSE_TOTAL_PAGE_NUM_MASK (0xfff) -#define PSE_GET_TOTAL_PAGE_NUM(p) (((p)&0xfff)) -#define PSE_TOTAL_PAGE_CFG_MASK (0xf << 16) -#define PSE_GET_TOTAL_PAGE_CFG(p) (((p)&PSE_TOTAL_PAGE_CFG_MASK) >> 16) - -#define PSE_PBUF_OFFSET_MASK (0xf << 20) -#define GET_PSE_PBUF_OFFSET(p) (((p)&PSE_PBUF_OFFSET_MASK) >> 20) - -/* Queue Empty */ -#define PSE_QUEUE_EMPTY (PSE_BASE + 0xb0) - -/* Page Flow Control */ -#define PSE_FREEPG_CNT (PSE_BASE + 0x100) - -#define PSE_FREEPG_HEAD_TAIL (PSE_BASE + 0x104) - -#define PSE_PG_HIF0_GROUP (PSE_BASE + 0x110) -#define PSE_HIF0_PG_INFO (PSE_BASE + 0x114) -#define PSE_PG_HIF1_GROUP (PSE_BASE + 0x118) -#define PSE_HIF1_PG_INFO (PSE_BASE + 0x11c) - -#define PSE_PG_CPU_GROUP (PSE_BASE + 0x150) -#define PSE_CPU_PG_INFO (PSE_BASE + 0x154) - -#define PSE_PG_LMAC0_GROUP (PSE_BASE + 0x170) -#define PSE_LMAC0_PG_INFO (PSE_BASE + 0x174) -#define PSE_PG_LMAC1_GROUP (PSE_BASE + 0x178) -#define PSE_LMAC1_PG_INFO (PSE_BASE + 0x17c) -#define PSE_PG_LMAC2_GROUP (PSE_BASE + 0x180) -#define PSE_LMAC2_PG_INFO (PSE_BASE + 0x184) -#define PSE_PG_PLE_GROUP (PSE_BASE + 0x190) -#define PSE_PLE_PG_INFO (PSE_BASE + 0x194) - -/* Indirect path for read/write */ -#define PSE_FL_QUE_CTRL_0 (PSE_BASE + 0x1b0) -#define PSE_FL_QUE_CTRL_1 (PSE_BASE + 0x1b4) -#define PSE_FL_QUE_CTRL_2 (PSE_BASE + 0x1b8) -#define PSE_FL_QUE_CTRL_3 (PSE_BASE + 0x1bc) -#define PSE_PL_QUE_CTRL_0 (PSE_BASE + 0x1c0) - -/* PSE spare dummy CR */ -#define PSE_SPARE_DUMMY_CR1 (PSE_BASE + 0x1e4) -#define PSE_SPARE_DUMMY_CR2 (PSE_BASE + 0x1e8) -#define PSE_SPARE_DUMMY_CR3 (PSE_BASE + 0x2e8) -#define PSE_SPARE_DUMMY_CR4 (PSE_BASE + 0x2ec) - -/* CPU Interface Get First Frame ID Control Regitser */ -#define C_GFF (PSE_BASE + 0x24) -#define GET_FIRST_FID_MASK (0xfff) -#define GET_FIRST_FID(p) (((p)&GET_FIRST_FID_MASK)) -#define GET_QID_MASK (0x1f << 16) -#define SET_GET_QID(p) (((p)&0x1f) << 16) -#define GET_QID(p) (((p)&GET_QID_MASK) >> 16) -#define GET_PID_MASK (0x3 << 21) -#define SET_GET_PID(p) (((p)&0x3) << 21) -#define GET_PID(p) (((p)&GET_PID_MASK) >> 21) -#define GET_RVSE_MASK (1 << 23) -#define SET_GET_RVSE(p) (((p)&0x1) << 23) -#define GET_RVSE(p) (((p)&GET_RVSE_MASK) >> 23) - -/* CPU Interface Get Frame ID Control Register */ -#define C_GF (PSE_BASE + 0x28) -#define GET_RETURN_FID_MASK (0xfff) -#define GET_RETURN_FID(p) (((p)&GET_RETURN_FID_MASK)) -#define CURR_FID_MASK (0xfff << 16) -#define SET_CURR_FID(p) (((p)&0xfff) << 16) -#define GET_CURR_FID(p) (((p)&CURR_FID_MASK) >> 16) -#define GET_PREV_MASK (1 << 28) -#define SET_GET_PREV(p) (((p)&0x1) << 28) -#define GET_PREV(p) (((p)&GET_PREV_MASK) >> 28) -#define GET_AUTO_MASK (1 << 29) -#define SET_GET_AUTO(p) (((p)&0x1) >> 29) -#define GET_AUTO(p) (((p)&GET_AUTO_MASK) >> 29) - -/* Get Queue Length Control Register */ -#define GQC (PSE_BASE + 0x118) -#define QLEN_RETURN_VALUE_MASK (0xfff) -#define GET_QLEN_RETURN_VALUE(p) (((p)&QLEN_RETURN_VALUE_MASK)) -#define GET_QLEN_QID_MASK (0x1f << 16) -#define SET_GET_QLEN_QID(p) (((p)&0x1f) << 16) -#define GET_QLEN_QID(p) (((p)&GET_QLEN_QID_MASK) >> 16) -#define GET_QLEN_PID_MASK (0x3 << 21) -#define SET_GET_QLEN_PID(p) (((p)&0x3) << 21) -#define GET_QLEN_PID(p) (((p)&GET_QLEN_PID_MASK) >> 21) -#define QLEN_IN_PAGE (1 << 23) -#define GET_QLEN_IN_PAGE(p) (((p)&QLEN_IN_PAGE) >> 23) - -/* Flow Control P0 Control Register */ -#define FC_P0 (PSE_BASE + 0x120) -#define MIN_RSRV_P0_MASK (0xfff) -#define MIN_RSRV_P0(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P0(p) (((p)&MIN_RSRV_P0_MASK)) -#define MAX_QUOTA_P0_MASK (0xfff << 16) -#define MAX_QUOTA_P0(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P0(p) (((p)&MAX_QUOTA_P0_MASK) >> 16) - -/* Flow Control P1 Control Register */ -#define FC_P1 (PSE_BASE + 0x124) -#define MIN_RSRV_P1_MASK (0xfff) -#define MIN_RSRV_P1(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P1(p) (((p)&MIN_RSRV_P1_MASK)) -#define MAX_QUOTA_P1_MASK (0xfff << 16) -#define MAX_QUOTA_P1(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P1(p) (((p)&MAX_QUOTA_P1_MASK) >> 16) - -/* Flow Control P2_RQ0 Control Register */ -#define FC_P2Q0 (PSE_BASE + 0x128) -#define MIN_RSRV_P2_RQ0_MASK (0xfff) -#define MIN_RSRV_P2_RQ0(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P2_RQ0(p) (((p)&MIN_RSRV_P2_RQ0_MASK)) -#define MAX_QUOTA_P2_RQ0_MASK (0xfff << 16) -#define MAX_QUOTA_P2_RQ0(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P2_RQ0(p) (((p)&MAX_QUOTA_P2_RQ0_MASK) >> 16) - -/* Flow Control P2_RQ1 Control Register */ -#define FC_P2Q1 (PSE_BASE + 0x12c) -#define MIN_RSRV_P2_RQ1_MASK (0xfff) -#define MIN_RSRV_P2_RQ1(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P2_RQ1(p) (((p)&MIN_RSRV_P2_RQ1_MASK)) -#define MAX_QUOTA_P2_RQ1_MASK (0xfff << 16) -#define MAX_QUOTA_P2_RQ1(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P2_RQ1(p) (((p)&MAX_QUOTA_P2_RQ1_MASK) >> 16) - -/* Flow Control P2_RQ2 Control Register */ -#define FC_P2Q2 (PSE_BASE + 0x130) -#define MIN_RSRV_P2_RQ2_MASK (0xfff) -#define MIN_RSRV_P2_RQ2(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P2_RQ2(p) (((p)&MIN_RSRV_P2_RQ2_MASK)) -#define MAX_QUOTA_P2_RQ2_MASK (0xfff << 16) -#define MAX_QUOTA_P2_RQ2(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P2_RQ2(p) (((p)&MAX_QUOTA_P2_RQ2_MASK) >> 16) - -/* Flow Control Free for All and Free Page Counter Register */ -#define FC_FFC (PSE_BASE + 0x134) -#define FREE_PAGE_CNT_MASK (0xfff) -#define GET_FREE_PAGE_CNT(p) (((p)&FREE_PAGE_CNT_MASK)) -#define FFA_CNT_MASK (0xfff << 16) -#define GET_FFA_CNT(p) (((p)&FFA_CNT_MASK) >> 16) - -/* Flow Control Reserve from FFA priority Control Register */ -#define FC_FRP (PSE_BASE + 0x138) -#define RSRV_PRI_P0_MASK (0x7) -#define RSRV_PRI_P0(p) (((p)&0x7)) -#define GET_RSRV_PRI_P0(p) (((p)&RSRV_PRI_P0_MASK)) -#define RSRV_PRI_P1_MASK (0x7 << 3) -#define RSRV_PRI_P1(p) (((p)&0x7) << 3) -#define GET_RSRV_PRI_P1(p) (((p)&RSRV_PRI_P1_MASK) >> 3) -#define RSRV_PRI_P2_RQ0_MASK (0x7 << 6) -#define RSRV_PRI_P2_RQ0(p) (((p)&0x7) << 6) -#define GET_RSRV_PRI_P2_RQ0(p) (((p)&RSRV_PRI_P2_RQ0_MASK) >> 6) -#define RSRV_PRI_P2_RQ1_MASK (0x7 << 9) -#define RSRV_PRI_P2_RQ1(p) (((p)&0x7) << 9) -#define GET_RSRV_PRI_P2_RQ1(p) (((p)&RSRV_PRI_P2_RQ1_MASK) >> 9) -#define RSRV_PRI_P2_RQ2_MASK (0x7 << 12) -#define RSRV_PRI_P2_RQ2(p) (((p)&0x7) << 12) -#define GET_RSRV_PRI_P2_RQ2(p) (((p)&RSRV_PRI_P2_RQ2_MASK) >> 12) - -/* Flow Control P0 and P1 Reserve Counter Register */ -#define FC_RP0P1 (PSE_BASE + 0x13c) -#define RSRV_CNT_P0_MASK (0xfff) -#define RSRV_CNT_P0(p) (((p)&0xfff)) -#define GET_RSRV_CNT_P0(p) (((p)&RSRV_CNT_P0_MASK)) -#define RSRV_CNT_P1_MASK (0xfff << 16) -#define RSRV_CNT_P1(p) (((p)&0xfff) << 16) -#define GET_RSRV_CNT_P1(p) (((p)&RSRV_CNT_P1_MASK) >> 16) - -/* Flow Control P2_RQ0 and P2_RQ1 Reserve Counter Register */ -#define FC_RP2Q0Q1 (PSE_BASE + 0x140) -#define RSRV_CNT_P2_RQ0_MASK (0xfff) -#define RSRV_CNT_P2_RQ0(p) (((p)&0xfff)) -#define GET_RSRV_CNT_P2_RQ0(p) (((p)&RSRV_CNT_P2_RQ0_MASK)) -#define RSRV_CNT_P2_RQ1_MASK (0xfff << 16) -#define RSRV_CNT_P2_RQ1(p) (((p)&0xfff) << 16) -#define GET_RSRV_CNT_P2_RQ1(p) (((p)&RSRV_CNT_P2_RQ1_MASK) >> 16) - -/* Flow Control P2_RQ2 Reserve Counter Register */ -#define FC_RP2Q2 (PSE_BASE + 0x144) -#define RSRV_CNT_P2_RQ2_MASK (0xfff) -#define RSRV_CNT_P2_RQ2(p) (((p)&0xfff)) -#define GET_RSRV_CNT_P2_RQ2(p) (((p)&RSRV_CNT_P2_RQ2_MASK)) - -/* Flow Control P0 and P1 Source Counter Register */ -#define FC_SP0P1 (PSE_BASE + 0x148) -#define SRC_CNT_P0_MASK (0xfff) -#define GET_SRC_CNT_P0(p) (((p)&SRC_CNT_P0_MASK)) -#define SRC_CNT_P1_MASK (0xfff << 16) -#define GET_SRC_CNT_P1(p) (((p)&SRC_CNT_P1_MASK) >> 16) - -/* FLow Control P2_RQ0 and P2_RQ1 Source Counter Register */ -#define FC_SP2Q0Q1 (PSE_BASE + 0x14c) -#define SRC_CNT_P2_RQ0_MASK (0xfff) -#define GET_SRC_CNT_P2_RQ0(p) (((p)&SRC_CNT_P2_RQ0_MASK)) -#define SRC_CNT_P2_RQ1_MASK (0xfff << 16) -#define GET_SRC_CNT_P2_RQ1(p) (((p)&SRC_CNT_P2_RQ1_MASK) >> 16) - -/* Flow Control P2_RQ2 Source Counter Register */ -#define FC_SP2Q2 (PSE_BASE + 0x150) -#define SRC_CNT_P2_RQ2_MASK (0xfff) -#define GET_SRC_CNT_P2_RQ2(p) (((p)&0xfff)) - -#define PSE_RTA (PSE_BASE + 0x194) -#define PSE_RTA_RD_RULE_QID_MASK (0x1f) -#define PSE_RTA_RD_RULE_QID(p) (((p)&0x1f)) -#define GET_PSE_RTA_RD_RULE_QID(p) (((p)&PSE_RTA_RD_RULE_QID_MASK)) -#define PSE_RTA_RD_RULE_PID_MASK (0x3 << 5) -#define PSE_RTA_RD_RULE_PID(p) (((p)&0x3) << 5) -#define GET_PSE_RTA_RD_RULE_PID(p) (((p)&PSE_RTA_RD_RULE_PID_MASK) >> 5) -#define PSE_RTA_RD_RULE_F (1 << 7) -#define GET_PSE_RTA_RD_RULE_F(p) (((p)&PSE_RTA_RD_RULE_F) >> 7) -#define PSE_RTA_TAG_MASK (0xff << 8) -#define PSE_RTA_TAG(p) (((p)&0xff) << 8) -#define GET_PSE_RTA_TAG(p) (((p)&PSE_RTA_TAG_MASK) >> 8) -#define PSE_RTA_RD_RW (1 << 16) -#define PSE_RTA_RD_KICK_BUSY (1 << 31) -#define GET_PSE_RTA_RD_KICK_BUSY(p) (((p)&PSE_RTA_RD_KICK_BUSY) >> 31) - -#endif /* _PSE */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_agg.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_agg.h deleted file mode 100644 index 5d41845724..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_agg.h +++ /dev/null @@ -1,339 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_agg.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_AGG_H__ -#define __WF_AGG_H__ - -#define WF_AGG_BASE 0x20a00 - -#define AGG_TPCR (WF_AGG_BASE + 0x000) /* 0x20a00 */ - -#define AGG_ARCR (WF_AGG_BASE + 0x010) /* 0x20a10 */ -#define INI_RATE1 (0x1 << 0) -#define FB_SGI_DIS (0x1 << 1) -#define RTS_RATE_DOWN_TH_MASK (0x1F << 8) -#define RTS_RATE_DOWN_TH(p) (((p)&0x1F) << 8) -#define RATE_DOWN_EXTRA_RATIO_MASK (0x3 << 16) -#define RATE_DOWN_EXTRA_RATIO(p) (((p)&0x3) << 16) -#define RATE_DOWN_EXTRA_RATIO_EN (0x1 << 19) -#define RATE_UP_EXTRA_TH_MASK (0x07 << 20) -#define RATE_UP_EXTRA_TH(p) (((p)&0x7) << 20) -#define SPE_DIS_TH_MASK (0x0F << 24) -#define SPE_DIS_TH(p) (((p)&0xF) << 24) -#define DUAL_BTIM_EN (0x1 << 31) - -#define AGG_ARCR1 (WF_AGG_BASE + 0x014) /* 0x20a14 */ - -#define AGG_ARUCR (WF_AGG_BASE + 0x018) /* 0x20a18 */ -#define RATE1_UP_MPDU_LIMIT_MASK (0x7) -#define RATE1_UP_MPDU_LINIT(p) (((p)&0x7)) -#define RATE2_UP_MPDU_LIMIT_MASK (0x7 << 4) -#define RATE2_UP_MPDU_LIMIT(p) (((p)&0x7) << 4) -#define RATE3_UP_MPDU_LIMIT_MASK (0x7 << 8) -#define RATE3_UP_MPDU_LIMIT(p) (((p)&0x7) << 8) -#define RATE4_UP_MPDU_LIMIT_MASK (0x7 << 12) -#define RATE4_UP_MPDU_LIMIT(p) (((p)&0x7) << 12) -#define RATE5_UP_MPDU_LIMIT_MASK (0x7 << 16) -#define RATE5_UP_MPDU_LIMIT(p) (((p)&0x7) << 16) -#define RATE6_UP_MPDU_LIMIT_MASK (0x7 << 20) -#define RATE6_UP_MPDU_LIMIT(p) (((p)&0x7) << 20) -#define RATE7_UP_MPDU_LIMIT_MASK (0x7 << 24) -#define RATE7_UP_MPDU_LIMIT(p) (((p)&0x7) << 24) -#define RATE8_UP_MPDU_LIMIT_MASK (0X7 << 28) -#define RATE8_UP_MPDU_LIMIT(p) (((p)&0x7) << 28) - -#define AGG_ARDCR (WF_AGG_BASE + 0x01c) /* 0x20a1c */ -#define RATE1_DOWN_MPDU_LIMIT_MASK (0x7) -#define RATE1_DOWN_MPDU_LIMIT(p) (((p)&0x7)) -#define RATE2_DOWN_MPDU_LIMIT_MASK (0x7 << 4) -#define RATE2_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 4) -#define RATE3_DOWN_MPDU_LIMIT_MASK (0x7 << 8) -#define RATE3_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 8) -#define RATE4_DOWN_MPDU_LIMIT_MASK (0x7 << 12) -#define RATE4_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 12) -#define RATE5_DOWN_MPDU_LIMIT_MASK (0x7 << 16) -#define RATE5_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 16) -#define RATE6_DOWN_MPDU_LIMIT_MASK (0x7 << 20) -#define RATE6_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 20) -#define RATE7_DOWN_MPDU_LIMIT_MASK (0x7 << 24) -#define RATE7_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 24) -#define RATE8_DOWN_MPDU_LIMIT_MASK (0x7 << 28) -#define RATE8_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 28) - -#define AGG_FRM1RR0 (WF_AGG_BASE + 0x020) -#define FRM1_RATE0(_p) ((_p)&0x0fff) -#define FRM1_RATE1(_p) (((_p)&0x0fff) << 16) - -#define AGG_FRM1RR1 (WF_AGG_BASE + 0x024) -#define FRM1_RATE2(_p) ((_p)&0x0fff) -#define FRM1_RATE3(_p) (((_p)&0x0fff) << 16) - -#define AGG_FRM1RR2 (WF_AGG_BASE + 0x028) -#define FRM1_RATE4(_p) ((_p)&0x0fff) -#define FRM1_RATE5(_p) (((_p)&0x0fff) << 16) - -#define AGG_FRM1RR3 (WF_AGG_BASE + 0x02c) -#define FRM1_RATE6(_p) ((_p)&0x0fff) -#define FRM1_RATE7(_p) (((_p)&0x0fff) << 16) - -#define AGG_FRM1RR4 (WF_AGG_BASE + 0x030) -#define FRM1_RATE8(_p) ((_p)&0x0fff) -#define FRM1_RATE9(_p) (((_p)&0x0fff) << 16) - -#define AGG_FRM1RR5 (WF_AGG_BASE + 0x034) -#define FRM1_RATE10(_p) ((_p)&0x0fff) -#define FRM1_RATE11(_p) (((_p)&0x0fff) << 16) - -#define AGG_FRM1RR6 (WF_AGG_BASE + 0x038) -#define FRM1_RATE12(_p) ((_p)&0x0fff) -#define FRM1_RATE13(_p) (((_p)&0x0fff) << 16) - -#define AGG_FRM1RR7 (WF_AGG_BASE + 0x03c) -#define FRM1_RATE14(_p) ((_p)&0x0fff) -#define FRM1_RATE15(_p) (((_p)&0x0fff) << 16) - -#define AGG_AALCR0 (WF_AGG_BASE + 0x040) /* 0x20a40 */ -#define AC0_AGG_LIMIT_MASK (0x3f) -#define AC0_AGG_LIMIT(p) (((p)&0x3f)) -#define GET_AC0_AGG_LIMIT(p) (((p)&AC0_AGG_LIMIT_MASK)) -#define AC1_AGG_LIMIT_MASK (0x3f << 8) -#define AC1_AGG_LIMIT(p) (((p)&0x3f) << 8) -#define GET_AC1_AGG_LIMIT(p) (((p)&AC1_AGG_LIMIT_MASK) >> 8) -#define AC2_AGG_LIMIT_MASK (0x3f << 16) -#define AC2_AGG_LIMIT(p) (((p)&0x3f) << 16) -#define GET_AC2_AGG_LIMIT(p) (((p)&AC2_AGG_LIMIT_MASK) >> 16) -#define AC3_AGG_LIMIT_MASK (0x3f << 24) -#define AC3_AGG_LIMIT(p) (((p)&0x3f) << 24) -#define GET_AC3_AGG_LIMIT(p) (((p)&AC3_AGG_LIMIT_MASK) >> 24) - -#define AGG_AALCR1 (WF_AGG_BASE + 0x044) /* 0x21244 */ -#define AC10_AGG_LIMIT_MASK (0x3f) -#define AC10_AGG_LIMIT(p) (((p)&0x3f)) -#define GET_AC10_AGG_LIMIT(p) (((p)&AC10_AGG_LIMIT_MASK)) -#define AC11_AGG_LIMIT_MASK (0x3f << 8) -#define AC11_AGG_LIMIT(p) (((p)&0x3f) << 8) -#define GET_AC11_AGG_LIMIT(p) (((p)&AC11_AGG_LIMIT_MASK) >> 8) -#define AC12_AGG_LIMIT_MASK (0x3f << 16) -#define AC12_AGG_LIMIT(p) (((p)&0x3f) << 16) -#define GET_AC12_AGG_LIMIT(p) (((p)&AC12_AGG_LIMIT_MASK) >> 16) -#define AC13_AGG_LIMIT_MASK (0x3f << 24) -#define AC13_AGG_LIMIT(p) (((p)&0x3f) << 24) -#define GET_AC13_AGG_LIMIT(p) (((p)&AC13_AGG_LIMIT_MASK) >> 24) - -#define AGG_AALCR2 (WF_AGG_BASE + 0x048) /* 0x21248 */ -#define AC20_AGG_LIMIT_MASK (0x3f) -#define AC20_AGG_LIMIT(p) (((p)&0x3f)) -#define GET_AC20_AGG_LIMIT(p) (((p)&AC10_AGG_LIMIT_MASK)) -#define AC21_AGG_LIMIT_MASK (0x3f << 8) -#define AC21_AGG_LIMIT(p) (((p)&0x3f) << 8) -#define GET_AC21_AGG_LIMIT(p) (((p)&AC11_AGG_LIMIT_MASK) >> 8) -#define AC22_AGG_LIMIT_MASK (0x3f << 16) -#define AC22_AGG_LIMIT(p) (((p)&0x3f) << 16) -#define GET_AC22_AGG_LIMIT(p) (((p)&AC12_AGG_LIMIT_MASK) >> 16) -#define AC23_AGG_LIMIT_MASK (0x3f << 24) -#define AC23_AGG_LIMIT(p) (((p)&0x3f) << 24) -#define GET_AC23_AGG_LIMIT(p) (((p)&AC13_AGG_LIMIT_MASK) >> 24) - -#define AGG_AALCR3 (WF_AGG_BASE + 0x04c) /* 0x20a4c */ -#define AC30_AGG_LIMIT_MASK (0x3f) -#define AC30_AGG_LIMIT(p) (((p)&0x3f)) -#define GET_AC30_AGG_LIMIT(p) (((p)&AC10_AGG_LIMIT_MASK)) -#define AC31_AGG_LIMIT_MASK (0x3f << 8) -#define AC31_AGG_LIMIT(p) (((p)&0x3f) << 8) -#define GET_AC31_AGG_LIMIT(p) (((p)&AC11_AGG_LIMIT_MASK) >> 8) -#define AC32_AGG_LIMIT_MASK (0x3f << 16) -#define AC32_AGG_LIMIT(p) (((p)&0x3f) << 16) -#define GET_AC32_AGG_LIMIT(p) (((p)&AC12_AGG_LIMIT_MASK) >> 16) -#define AC33_AGG_LIMIT_MASK (0x3f << 24) -#define AC33_AGG_LIMIT(p) (((p)&0x3f) << 24) -#define GET_AC33_AGG_LIMIT(p) (((p)&AC13_AGG_LIMIT_MASK) >> 24) - -#define AGG_AWSCR0 (WF_AGG_BASE + 0x050) /* 0x20a50 */ -#define WINSIZE0_MASK (0x3f) -#define WINSIZE0(p) (((p)&0x3f)) -#define GET_WINSIZE0(p) (((p)&WINSIZE0_MASK)) -#define WINSIZE1_MASK (0x3f << 8) -#define WINSIZE1(p) (((p)&0x3f) << 8) -#define GET_WINSIZE1(p) (((p)&WINSIZE1_MASK) >> 8) -#define WINSIZE2_MASK (0x3f << 16) -#define WINSIZE2(p) (((p)&0x3f) << 16) -#define GET_WINSIZE2(p) (((p)&WINSIZE2_MASK) >> 16) -#define WINSIZE3_MASK (0x3f << 24) -#define WINSIZE3(p) (((p)&0x3f) << 24) -#define GET_WINSIZE3(p) (((p)&WINSIZE3_MASK) >> 24) - -#define AGG_AWSCR1 (WF_AGG_BASE + 0x054) /* 0x20a54 */ -#define WINSIZE4_MASK (0x3f) -#define WINSIZE4(p) (((p)&0x3f)) -#define GET_WINSIZE4(p) (((p)&WINSIZE4_MASK)) -#define WINSIZE5_MASK (0x3f << 8) -#define WINSIZE5(p) (((p)&0x3f) << 8) -#define GET_WINSIZE5(p) (((p)&WINSIZE5_MASK) >> 8) -#define WINSIZE6_MASK (0x3f << 16) -#define WINSIZE6(p) (((p)&0x3f) << 16) -#define GET_WINSIZE6(p) (((p)&WINSIZE6_MASK) >> 16) -#define WINSIZE7_MASK (0x3f << 24) -#define WINSIZE7(p) (((p)&0x3f) << 24) -#define GET_WINSIZE7(p) (((p)&WINSIZE7_MASK) >> 24) - -#define AGG_PCR (WF_AGG_BASE + 0x058) /* 0x20a50 */ -#define MM_PROTECTION (1 << 16) -#define GET_MM_PROTECTION(p) (((p)&MM_PROTECTION) >> 16) -#define GF_PROTECTION (1 << 17) -#define GET_GF_PROTECTION(p) (((p)&GF_PROTECTION) >> 17) -#define PROTECTION_MODE (1 << 19) -#define GET_PROTECTION_MODE(p) (((p)&PROTECTION_MODE) >> 19) -#define BW40_PROTECTION (1 << 20) -#define GET_BW40_PROTECTION(p) (((p)&BW40_PROTECTION) >> 20) -#define RIFS_PROTECTION (1 << 21) -#define GET_RIFS_PROTECTION(p) (((p)&RIFS_PROTECTION) >> 21) -#define BW80_PROTECTION (1 << 22) -#define GET_BW80_PROTECTION(p) (((p)&BW80_PROTECTION) >> 22) -#define BW160_PROTECTION (1 << 23) -#define GET_BW160_PROTECTION(p) (((p)&BW160_PROTECTION) >> 23) -#define ERP_PROTECTION_MASK (0x1f << 24) -#define ERP_PROTECTION(p) (((p)&0x1f) << 24) -#define GET_ERP_PROTECTION(p) (((p)&ERP_PROTECTION_MASK) >> 24) - -#define AGG_PCR1 (WF_AGG_BASE + 0x05c) -#define RTS_THRESHOLD_MASK (0xfffff) -#define RTS_THRESHOLD(p) (((p)&0xfffff)) -#define GET_RTS_THRESHOLD(p) (((p)&RTS_THRESHOLD_MASK)) -#define RTS_PKT_NUM_THRESHOLD_MASK (0x7f << 25) -#define RTS_PKT_NUM_THRESHOLD(p) (((p)&0x7f) << 25) -#define GET_RTS_PKT_NUM_THRESHOLD(p) (((p)&RTS_PKT_NUM_THRESHOLD_MASK) >> 25) - -#define AGG_PCR2 (WF_AGG_BASE + 0x15c) - -#define AGG_ASRCR0 (WF_AGG_BASE + 0x060) /* 0x20a60 */ -#define AGG_ASRCR1 (WF_AGG_BASE + 0x064) /* 0x20a60 */ -#define AGG_BCR (WF_AGG_BASE + 0x068) /* 0x20a68 */ - -/* TODO: shiang-MT7615, document mismatch!! */ -#define AGG_ACR0 (WF_AGG_BASE + 0x070) /* 0x20a70 */ -#define AMPDU_NO_BA_RULE (1 << 0) -#define GET_AMPDU_NO_BA_RULE(p) (((p)&DU_NO_BA_RULE)) -#define AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK (1 << 1) -#define AGG_ACR_AMPDU_NO_BA_AR_RULE(p) (((p)&0x1) << 1) -#define GET_AGG_ACR_AMPDU_NO_BA_AR_RULE(p) \ - (((p)&AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK) >> 1) - -#define BAR_RATE_TX_RATE_MASK (0x3f << 20) -#define BAR_RATE_TX_RATE(p) (((p)&0x3f) << 20) -#define GET_BAR_RATE_TX_RATE(p) (((p)&BAR_RATE_TX_RATE_MASK) >> 20) -#define BAR_RATE_TX_MODE_MASK (0x7 << 26) -#define BAR_RATE_TX_MODE(p) (((p)&0x7) << 26) -#define GET_BAR_RATE_TX_MODE(p) (((p)&BAR_RATE_TX_MODE_MASK) >> 26) -#define BAR_RATE_NSTS_MASK (0x3 << 29) -#define BAR_RATE_NSTS(p) (((p)&0x3) << 29) -#define GET_BAR_RATE_NSTS(p) (((p)&BAR_RATE_NSTS_MASK) >> 29) -#define BAR_RATE_STBC (1 << 31) -#define GET_BAR_RATE_STBC(p) (((p)&BAR_RATE_STBC) >> 31) - -#define AGG_ACR1 (WF_AGG_BASE + 0x170) /* 0x20b70 */ -#define AGG_BWCR (WF_AGG_BASE + 0x078) /* 0x20a78 */ - -#define AGG_MRCR (WF_AGG_BASE + 0x07c) /* 0x20a7c */ -#define RTY_MODE0_MASK (0x3) -#define RTY_MODE0(_p) ((_p)&0x3) -#define RTY_MODE1_MASK ((0x3) << 16) -#define RTY_MODE1(_p) (((_p)&0x3) << 16) -#define RTS_RTY_CNT_LIMIT_MASK (0x1f << 7) -#define RTS_RTY_CNT_LIMIT(p) (((p)&0x1f) << 7) -#define GET_RTS_RTY_CNT_LIMIT(p) (((p)&RTS_RTY_CNT_LIMIT_MASK) >> 7) -#define BAR_TX_CNT_LIMIT_MASK (0x0f << 12) -#define BAR_TX_CNT_LIMIT(p) (((p)&0x0f) << 12) -#define GET_BAR_TX_CNT_LIMIT(p) (((p)&BAR_TX_CNT_LIMIT_MASK) >> 12) - -/* the rate is used to indicate the second Tim frame rate, that is auto-gened by HW. - per spec, it's shall be low rate one. - low rate is same mcs or modulation as Beacon frame. -*/ -#define AGG_BTIMRR0 (WF_AGG_BASE + 0x080) -#define AGG_BTIMRR1 (WF_AGG_BASE + 0x084) -#define AGG_BTIMRR2 (WF_AGG_BASE + 0x088) -#define AGG_BTIMRR3 (WF_AGG_BASE + 0x08c) -#define AGG_BTIMRR4 (WF_AGG_BASE + 0x090) -#define AGG_BTIMRR5 (WF_AGG_BASE + 0x094) -#define AGG_BTIMRR6 (WF_AGG_BASE + 0x098) -#define AGG_BTIMRR7 (WF_AGG_BASE + 0x09c) -#define AGG_BTIMRR8 (WF_AGG_BASE + 0x0a0) -#define AGG_BTIMRR9 (WF_AGG_BASE + 0x0a4) - -typedef enum _AGG_TX_MODE_T { - Legacy_CCK = 0x0, - Legacy_OFDM, - HT_MIXED, - HT_GF, - VHT -} AGG_TX_MODE_T; - -typedef enum _AGG_CCK_RATE_T { - LONG_PREAMBLE_1M = 0x0, - LONG_PREAMBLE_2M = 0x1, - LONG_PREAMBLE_5M = 0x2, - LONG_PREAMBLE_11M = 0x3, - SHORT_PREAMBLE_2M = 0x5, - SHORT_PREAMBLE_5M = 0x6, - SHORT_PREAMBLE_11M = 0x7 -} AGG_CCK_RATE_T; - -typedef enum _AGG_OFDM_RATE_T { - TIM_OFDM_6M = 0xB, - TIM_OFDM_9M = 0xF, - TIM_OFDM_12M = 0xA, - TIM_OFDM_18M = 0xE, - TIM_OFDM_24M = 0x9, - TIM_OFDM_36M = 0xD, - TIM_OFDM_48M = 0x8, - TIM_OFDM_54M = 0xC -} AGG_OFDM_RATE_T; - -/* it's for the second that auto-gen by HW. */ -#define AGG_BTIMRR_TX_MODE_MASK (0x7) -#define AGG_BTIMRR_TX_MODE(p) (((p)&AGG_BTIMRR_TX_MODE_MASK) << 6) -#define AGG_BTIMRR_TX_RATE_MASK (0x3f) -#define AGG_BTIMRR_TX_RATE(p) (((p)&AGG_BTIMRR_TX_RATE_MASK)) - -#define AGG_BTIMRR_ODD_OMAC_IDX_RATE(p) (((p) << 16)) - -#define AGG_DSCR1 (WF_AGG_BASE + 0xb4) /* 0x20ab4 */ - -#define AGG_MUCR (WF_AGG_BASE + 0xe0) /* 0x20ae0 */ -#define MUCR_PRIM_BAR_BIT (15) -#define MUCR_PRIM_BAR_MASK (1 << 15) - -#define AGG_SCR (WF_AGG_BASE + 0xfc) /* 0x20afc */ -#define NLNAV_MID_PTEC_DIS (1 << 3) -#define RTS_FAIL_CHARGE_DIS (1 << 27) - -#define AGG_ATCR0 (WF_AGG_BASE + 0xf4) /* 0x212f4 */ -#define MAX_BFF_TIME_EN (1 << 30) -#define AIR_TIME_RESP_MODE (1 << 31) -#define MAX_BFF_TIME 10000 -#endif /* __WF_AGG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_aon.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_aon.h deleted file mode 100644 index c0cb173052..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_aon.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_aon.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_AON_H__ -#define __WF_AON_H__ - -#define WF_AON_BASE 0x20000 - -#endif /* __WF_AON_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_arb.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_arb.h deleted file mode 100644 index 8f87c7a3d9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_arb.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_arb.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_ARB_H__ -#define __WF_ARB_H__ - -#define WF_ARB_BASE 0x20c00 - -/********************************************************* - Tx Control Registers -**********************************************************/ - -#define ARB_DCR (WF_ARB_BASE + 0x60) /* 0x20c60 */ - -#define ARB_TQSW0 (WF_ARB_BASE + 0x100) /* 0x20d00 */ -#define ARB_TQSW1 (WF_ARB_BASE + 0x104) /* 0x20d04 */ -#define ARB_TQSW2 (WF_ARB_BASE + 0x108) /* 0x20d08 */ -#define ARB_TQSW3 (WF_ARB_BASE + 0x10c) /* 0x20d0c */ -#define ARB_TQSM0 (WF_ARB_BASE + 0x110) /* 0x20d10 */ -#define ARB_TQSM1 (WF_ARB_BASE + 0x114) /* 0x20d14 */ -#define ARB_TQSE0 (WF_ARB_BASE + 0x118) /* 0x20d18 */ -#define ARB_TQSE1 (WF_ARB_BASE + 0x11c) /* 0x20d1c */ -#define ARB_TQFW0 (WF_ARB_BASE + 0x120) /* 0x20d20 */ -#define ARB_TQFW1 (WF_ARB_BASE + 0x124) /* 0x20d24 */ -#define ARB_TQFW2 (WF_ARB_BASE + 0x128) /* 0x20d28 */ -#define ARB_TQFW3 (WF_ARB_BASE + 0x12c) /* 0x20d2c */ -#define ARB_TQFM0 (WF_ARB_BASE + 0x130) /* 0x20d30 */ -#define ARB_TQFM1 (WF_ARB_BASE + 0x134) /* 0x20d34 */ -#define ARB_TQFE0 (WF_ARB_BASE + 0x138) /* 0x20d38 */ -#define ARB_TQFE1 (WF_ARB_BASE + 0x13c) /* 0x20d3c */ -#define ARB_TQPW0 (WF_ARB_BASE + 0x140) /* 0x20d40 */ -#define ARB_TQPW1 (WF_ARB_BASE + 0x144) /* 0x20d44 */ -#define ARB_TQPW2 (WF_ARB_BASE + 0x148) /* 0x20d48 */ -#define ARB_TQPW3 (WF_ARB_BASE + 0x14c) /* 0x20d4c */ -#define ARB_TQPM0 (WF_ARB_BASE + 0x150) /* 0x20d50 */ -#define ARB_TQPM1 (WF_ARB_BASE + 0x154) /* 0x20d54 */ -#define ARB_BTIMCR0 (WF_ARB_BASE + 0x158) /* 0x20d58 */ -#define ARB_BTIMCR1 (WF_ARB_BASE + 0x15c) /* 0x20d5c */ -#define ARB_BMCCR0 (WF_ARB_BASE + 0x160) /* 0x20d60 */ -#define ARB_BMCCR1 (WF_ARB_BASE + 0x164) /* 0x20d64 */ -#define ARB_BMCCR2 (WF_ARB_BASE + 0x168) /* 0x20d68 */ -#define ARB_BMCCR3 (WF_ARB_BASE + 0x16C) /* 0x20d6C */ -#define ARB_BMCCR4 (WF_ARB_BASE + 0x170) /* 0x20d70 */ -#define ARB_BFCR (WF_ARB_BASE + 0x190) /* 0x20d90 */ -#define ARB_DRNGR0 (WF_ARB_BASE + 0x194) /* 0x20d94 */ -#define ARB_DRNGR1 (WF_ARB_BASE + 0x198) /* 0x20d98 */ - -#define ARB_WMMAC00 (WF_ARB_BASE + 0x1a0) /* 0x20da0 */ -#define ARB_WMMAC01 (WF_ARB_BASE + 0x1a4) /* 0x20da4 */ -#define ARB_WMMAC02 (WF_ARB_BASE + 0x1a8) /* 0x20da8 */ -#define ARB_WMMAC03 (WF_ARB_BASE + 0x1ac) /* 0x20dac */ -#define ARB_WMMAC10 (WF_ARB_BASE + 0x1b0) /* 0x20db0 */ -#define ARB_WMMAC11 (WF_ARB_BASE + 0x1b4) /* 0x20db4 */ -#define ARB_WMMAC12 (WF_ARB_BASE + 0x1b8) /* 0x20db8 */ -#define ARB_WMMAC13 (WF_ARB_BASE + 0x1bc) /* 0x20dbc */ -#define ARB_WMMAC20 (WF_ARB_BASE + 0x1c0) /* 0x20dc0 */ -#define ARB_WMMAC21 (WF_ARB_BASE + 0x1c4) /* 0x20dc4 */ -#define ARB_WMMAC22 (WF_ARB_BASE + 0x1c8) /* 0x20dc8 */ -#define ARB_WMMAC23 (WF_ARB_BASE + 0x1cc) /* 0x20dcc */ -#define ARB_WMMAC30 (WF_ARB_BASE + 0x1d0) /* 0x20dd0 */ -#define ARB_WMMAC31 (WF_ARB_BASE + 0x1d4) /* 0x20dd4 */ -#define ARB_WMMAC32 (WF_ARB_BASE + 0x1d8) /* 0x20dd8 */ -#define ARB_WMMAC33 (WF_ARB_BASE + 0x1dc) /* 0x20ddc */ - -#define ARB_WMMALTX0 (WF_ARB_BASE + 0x1e0) /* 0x20de0 */ -#define ARB_WMMBMC0 (WF_ARB_BASE + 0x1e4) /* 0x20de4 */ -#define ARB_WMMBCN0 (WF_ARB_BASE + 0x1e8) /* 0x20de8 */ -#define ARB_WMMALTX1 (WF_ARB_BASE + 0x1f0) /* 0x20df0 */ -#define ARB_WMMBMC1 (WF_ARB_BASE + 0x1f4) /* 0x20df4 */ -#define ARB_WMMBCN1 (WF_ARB_BASE + 0x1f8) /* 0x20df8 */ - -#define ARB_WMMBCN_AIFS_DEFAULT_VALUE (BIT0) -#define ARB_WMMBCN_CWMIN_DEFAULT_VALUE (0x2 << 8) - -/********************************************************* - Rx Cotnrol Registers -**********************************************************/ -#define ARB_RQCR (WF_ARB_BASE + 0x070) /* 0x20c70 */ -#define ARB_RQCR_RX_START 0x01 -#define ARB_RQCR_RXV_START 0x10 -#define ARB_RQCR_RXV_R_EN 0x80 -#define ARB_RQCR_RXV_T_EN 0x100 -#define ARB_RQCR_RX1_START 0x010000 -#define ARB_RQCR_RXV1_START 0x100000 -#define ARB_RQCR_RXV1_R_EN 0x800000 -#define ARB_RQCR_RXV1_T_EN 0x1000000 - -/********************************************************* - System Cotnrol Registers -**********************************************************/ -#define ARB_SCR (WF_ARB_BASE + 0x080) /* 0x20c80 */ -#define MT_ARB_SCR_BM_CTRL BIT31 -#define MT_ARB_SCR_BCN_CTRL BIT30 -#define MT_ARB_SCR_BTIM_CTRL BIT30 -#define MT_ARB_SCR_BCN_EMPTY BIT28 -#define MT_ARB_SCR_TXDIS BIT8 -#define MT_ARB_SCR_RXDIS BIT9 -#define MT_ARB_SCR_TX1DIS BIT10 -#define MT_ARB_SCR_RX1DIS BIT11 -#define MT_ARB_SCR_OPMODE_MASK 0x3 - -/* ARB_SCR_BCNQ_OP_MODE */ -#define BCNQ_OP_MODE_STA 0x0 -#define BCNQ_OP_MODE_AP 0x1 -#define BCNQ_OP_MODE_ADHOC 0x2 -#define ARB_SXCR0 (WF_ARB_BASE + 0x084) /* 0x20c84 */ -#define ARB_SXCR1 (WF_ARB_BASE + 0x088) /* 0x20c88 */ -#define ARB_SXCR2 (WF_ARB_BASE + 0x08c) /* 0x20c8c */ - -/********************************************************* - PTA Control Registers -**********************************************************/ - -/********************************************************* - PTA Test Registers -**********************************************************/ - -#endif /* __WF_ARB_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_cfg.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_cfg.h deleted file mode 100644 index ee0a24802d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_cfg.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_cfg.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_CFG_H__ -#define __WF_CFG_H__ - -#define WF_CFG_BASE 0x20200 - -#define CFG_CCR (WF_CFG_BASE) - -#define CFG_DBG_EN (WF_CFG_BASE + 0x14) -#define CFG_DBG_L1_MOD_SEL (WF_CFG_BASE + 0x18) -#define CFG_DBG0 (WF_CFG_BASE + 0x24) -#define CFG_DBG_L1_SEL (WF_CFG_BASE + 0x4c) - -#define CFG_DBDC_CTRL0 (WF_CFG_BASE + 0x50) -#define CFG_DBDC_CTRL1 (WF_CFG_BASE + 0x54) - -/*DBDC_CTRL0*/ -#define DBDC_EN_MASK (0x1) -#define DBDC_EN(p) (((p)&0x1) << 31) -#define DBDC_EN_BIT_BASE 31 - -#define PTA_BAND_SELPTA_MASK (0x1) -#define PTA_BAND_SELPTA(p) (((p)&0x1) << 30) -#define PTA_BAND_SELPTA_BIT_BASE 30 - -#define MU_BAND_SEL_MASK (0x1) -#define MU_BAND_SEL(p) (((p)&0x1) << 29) - -#define MU_BAND_SEL_BIT_BASE 29 - -#define BEFEE_BAND_SEL_MASK (0x1) -#define BEFEE_BAND_SEL(p) (((p)&0x1) << 28) - -#define BEFER_BAND_SEL_MASK (0x1) -#define BEFER_BAND_SEL(p) (((p)&0x1) << 27) - -#define RXBF_BAND_SEL_MASK (0x1) -#define RXBF_BAND_SEL(p) (((p)&0x1) << 26) - -#define BF_BAND_SEL_BIT_BASE 26 - -#define WMM_0TO3_BAND_SEL_MASK (0xf) -#define WMM_0TO3_BAND_SEL(p) (((p)&0xf) << 22) - -#define WMM_BAND_SEL_BIT_BASE 22 - -#define MNG_BAND_SEL_MASK (0x3) -#define MNG_BAND_SEL(p) (((p)&0x3) << 20) - -#define MNG_BAND_SEL_BIT_BASE 20 - -#define OM_11TO1F_BAND_SEL_MASK (0xefff) -#define OM_11TO1F_BAND_SEL(p) (((p)&0xefff) << 5) - -#define MBSS_BAND_SEL_BIT_BASE 5 - -#define OM_00TO04_BAND_SEL_MASK (0x1f) -#define OM_00TO04_BAND_SEL(p) (((p)&0x1f)) - -#define BSS_BAND_SEL_BIT_BASE 0 - -/*DBDC_CTRL1*/ -#define OM_20TO3F_BAND_SEL_MASK (0xffffffff) -#define OM_20TO3F_BAND_SEL(p) (((p)&0xffffffff)) - -#define REPEATER_BAND_SEL_BIT_BASE 0 - -#endif /* __WF_CFG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_cfgoff.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_cfgoff.h deleted file mode 100644 index f49f408c50..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_cfgoff.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_cfgoff.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_CFG_OFF_H__ -#define __WF_CFG_OFF_H__ - -#define WF_CFG_OFF_BASE 0x20600 - -#endif /* __WF_CFG_OFF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_dma.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_dma.h deleted file mode 100644 index bb09804da1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_dma.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_dma.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_DMA_H__ -#define __WF_DMA_H__ - -#define WF_DMA_BASE 0x21800 -#define DMA_DCR0 (WF_DMA_BASE + 0x000) -#define DMA_DCR0_RX_HDR_TRANS_CHK_BSSID (1 << 18) -#define DMA_DCR0_RX_HDR_TRANS_EN_BIT (1 << 19) -#define DMA_DCR0_RX_HDR_TRANS_MODE_BIT (1 << 23) -#define DMA_DCR0_RX_RM_VLAN_BIT (1 << 22) -#define DMA_DCR0_RX_INS_VLAN_BIT (1 << 21) - -#define DMA_DCR1 (WF_DMA_BASE + 0x004) /* 0x21804 */ -#define RXSM_GROUP1_EN (1 << 11) -#define RXSM_GROUP2_EN (1 << 12) -#define RXSM_GROUP3_EN (1 << 13) -#define RHTR_AMS_VLAN_EN (1 << 15) - -#define DMA_FQCR0 (WF_DMA_BASE + 0x008) /* 0x21c08 */ -#define DMA_FQCR0_FQ_EN BIT31 -#define DMA_FQCR0_FQ_STS BIT30 -#define DMA_FQCR0_FQ_MODE_OMAC BIT29 -#define DMA_FQCR0_FQ_MODE_WIDX ~BIT29 -#define DMA_FQCR0_FQ_DEST_QID_MASK (0x1f) -#define DMA_FQCR0_FQ_DEST_QID(p) (((p)&DMA_FQCR0_FQ_DEST_QID_MASK) << 24) -#define DMA_FQCR0_FQ_DEST_PID_MASK (0x3) -#define DMA_FQCR0_FQ_DEST_PID(p) (((p)&DMA_FQCR0_FQ_DEST_PID_MASK) << 22) -#define DMA_FQCR0_FQ_TARG_QID_MASK (0x1f) -#define DMA_FQCR0_FQ_TARG_QID(p) (((p)&DMA_FQCR0_FQ_TARG_QID_MASK) << 16) -#define DMA_FQCR0_FQ_TARG_OM_MASK (0x3f) -#define DMA_FQCR0_FQ_TARG_OM(p) (((p)&DMA_FQCR0_FQ_TARG_OM_MASK) << 8) -#define DMA_FQCR0_FQ_TARG_WIDX_MASK (0xff) -#define DMA_FQCR0_FQ_TARG_WIDX(p) (((p)&DMA_FQCR0_FQ_TARG_WIDX_MASK)) - -#define DMA_FQCR1 (WF_DMA_BASE + 0x00c) /* 0x21c0c */ - -#ifdef VLAN_SUPPORT -#define DMA_VTR0 (WF_DMA_BASE + 0x010) -#define DMA_VTR2 (WF_DMA_BASE + 0x018) -#define DMA_VTR20 (WF_DMA_BASE + 0x0A0) -#define DMA_VTR24 (WF_DMA_BASE + 0x0F0) -#define DMA_VTR_GET_ADDR(_omac) \ - ((_omac < 0x10) ? (DMA_VTR0 + ((_omac >> 1) << 2)) : \ - (_omac < 0x34) ? (DMA_VTR2 + (((_omac - 0x11) >> 1) << 2)) : \ - (_omac < 0x3c) ? (DMA_VTR20 + (((_omac - 0x34) >> 1) << 2)) : \ - (DMA_VTR24 + (((_omac - 0x3c) >> 1) << 2))) -#define DMA_VTR_SET_VID(_omac, _tci, _vid) \ - ((_omac % 2) ? ((_tci & 0xF000FFFF) | (_vid << 16)) : \ - ((_tci & 0xFFFFF000) | _vid)) -#define DMA_VTR_SET_PCP(_omac, _tci, _pcp) \ - ((_omac % 2) ? ((_tci & 0x1FFFFFFF) | (_pcp << 29)) : \ - ((_tci & 0xFFFF1FFF) | (_pcp << 13))) -#endif /*VLAN_SUPPORT*/ - -#define DMA_BN0RCFR0 (WF_DMA_BASE + 0x070) /* 0x21870 */ -#define DMA_BN0RCFR1 (WF_DMA_BASE + 0x074) /* 0x21874 */ -#define DMA_BN0VCFR0 (WF_DMA_BASE + 0x07c) /* 0x2187c */ -#define DMA_BN1RCFR0 (WF_DMA_BASE + 0x0B0) /* 0x218b0 */ -#define DMA_BN1RCFR1 (WF_DMA_BASE + 0x0B4) /* 0x218b4 */ -#define DMA_BN1VCFR0 (WF_DMA_BASE + 0x0Bc) /* 0x218bc */ - -#define DMA_BN0TCFR0 (WF_DMA_BASE + 0x080) /* 0x21880 */ -#define DMA_BN1TCFR0 (WF_DMA_BASE + 0x0c0) /* 0x218c0 */ -#define TXS_ME (1 << 0) -#define TXS_RE (1 << 1) -#define TXS_LE (1 << 2) -#define TXS_BE (1 << 3) -#define TXS_TXOP (1 << 4) -#define TXS_PS (1 << 5) -#define TXS_BAF (1 << 6) -#define TXS2M_BIT_MAP_MASK (0x7f) -#define TXS2M_BIT_MAP(p) (((p)&0x7f)) -#define GET_TXS2M_BIT_MAP(p) (((p)&TXS2M_BIT_MAP_MASK)) -#define TXS2M_AGG_CNT_MASK (0x1f << 8) -#define TXS2M_AGG_CNT(p) (((p)&0x1f) << 8) -#define GET_TXS2M_AGG_CNT(p) (((p)&TXS2M_AGG_CNT_MASK) >> 8) -#define TXS2M_QID_MASK (0x3 << 14) -#define TXS2M_QID(p) (((p)&0x3) << 14) -#define GET_TXS2M_QID(p) (((p)&TXS2M_QID_MASK) >> 14) -#define TXS2M_TOUT_MASK (0xfff << 16) -#define TXS2M_TOUT(p) (((p)&0xfff) << 16) -#define GET_TXS2M_TOUT(p) (((p)&TXS2M_TOUT_MASK) >> 16) - -#define DMA_BN0TCFR1 (WF_DMA_BASE + 0x084) /* 0x21884 */ -#define DMA_BN1TCFR1 (WF_DMA_BASE + 0x0c4) /* 0x218c4 */ -#define TXS2H_BIT_MAP_MASK (0x7f) -#define TXS2H_BIT_MAP(p) (((p)&0x7f)) -#define GET_TXS2H_BIT_MAP(p) (((p)&TXS2H_BIT_MAP_MASK)) -#define TXS2H_AGG_CNT_MASK (0x1f << 8) -#define TXS2H_AGG_CNT(p) (((p)&0x1f) << 8) -#define GET_TXS2H_AGG_CNT(p) (((p)&TXS2H_AGG_CNT_MASK) >> 8) -#define TXS2H_QID (1 << 14) -#define TXS2H_TOUT_MASK (0xfff << 16) -#define TXS2H_TOUT(p) (((p)&0xfff) << 16) -#define GET_TXS2H_TOUT(p) (((p)&TXS2H_TOUT_MASK) >> 16) - -#define DMA_BN0TMCFR0 (WF_DMA_BASE + 0x088) /* 0x21888 */ -#define DMA_BN1TMCFR0 (WF_DMA_BASE + 0x0c8) /* 0x218c8 */ - -#define DMA_DBG_00 (WF_DMA_BASE + 0x0d0) /* 0x218d0 */ -#define DMA_DBG_01 (WF_DMA_BASE + 0x0d4) /* 0x218d4 */ - -#endif /* __WF_DMA_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_etbf.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_etbf.h deleted file mode 100644 index 492f67a427..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_etbf.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*************************************************************************** -* MediaTek Inc. -* -* All rights reserved. source code is an unpublished work and the -* use of a copyright notice does not imply otherwise. This source code -* contains confidential trade secret material of MediaTek. Any attemp -* or participation in deciphering, decoding, reverse engineering or in any -* way altering the source code is stricitly prohibited, unless the prior -* written consent of MediaTek, Inc. is obtained. -*************************************************************************** - - Module Name: - wf_etbf.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - CT Lin 2017/04/11 For RvR debug command - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_ETBF_H__ -#define __WF_ETBF_H__ - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#define WF_ETBF_BASE 0x24000 -#else -#define WF_ETBF_BASE 0x24000 -#endif /* defined(MT7615) || defined(MT7622) */ - -#endif /* __WF_ETBF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_int_wakeup_top.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_int_wakeup_top.h deleted file mode 100644 index e98b20d89a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_int_wakeup_top.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_int_wakeup_top.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ----------------------------------------------- -*/ -#ifndef __WF_INT_WAKEUP_TOP_H__ -#define __WF_INT_WAKEUP_TOP_H__ - -/* In range of 0x24000 ~ 0x24400 */ -#define WF_INT_WAKEUP_TOP_BASE 0x24600 - -#define WISR0 (WF_INT_WAKEUP_TOP_BASE + 0x00) /* 0x24600 */ -#define WISR1 (WF_INT_WAKEUP_TOP_BASE + 0x04) -#define WISR2 (WF_INT_WAKEUP_TOP_BASE + 0x24) -#define WISR3 (WF_INT_WAKEUP_TOP_BASE + 0x2c) -#define WISR4 (WF_INT_WAKEUP_TOP_BASE + 0x34) - -#define WIER0 (WF_INT_WAKEUP_TOP_BASE + 0x08) /* 0x24608 */ -#define WIER1 (WF_INT_WAKEUP_TOP_BASE + 0x0c) -#define WIER2 (WF_INT_WAKEUP_TOP_BASE + 0x28) -#define WIER3 (WF_INT_WAKEUP_TOP_BASE + 0x30) /* 0x24630 */ -#define WIER4 (WF_INT_WAKEUP_TOP_BASE + 0x38) - -#define AHB_CLK_CTL (WF_INT_WAKEUP_TOP_BASE + 0x20) /* 0x24620 */ - -#define HWISR0 (WF_INT_WAKEUP_TOP_BASE + 0x3c) /* 0x2463c */ -#define HWISR1 (WF_INT_WAKEUP_TOP_BASE + 0x44) /* 0x24644 */ -#define HWISR2 (WF_INT_WAKEUP_TOP_BASE + 0x4c) /* 0x2464c */ -#define HWISR3 (WF_INT_WAKEUP_TOP_BASE + 0x54) /* 0x24654 */ -#define HWISR4 (WF_INT_WAKEUP_TOP_BASE + 0x5c) /* 0x2465C */ - -#define HWIER0_TBTT1 BIT20 -#define HWIER0_PRETBTT1 BIT23 -#define HWIER0_TBTT2 BIT21 -#define HWIER0_PRETBTT2 BIT24 -#define HWIER0_TBTT3 BIT22 -#define HWIER0_PRETBTT3 BIT25 - -#define HWIER0_TTTT1 BIT26 -#define HWIER0_PRETTTT1 BIT29 -#define HWIER0_TTTT2 BIT27 -#define HWIER0_PRETTTT2 BIT30 -#define HWIER0_TTTT3 BIT28 -#define HWIER0_PRETTTT3 BIT31 - -#define HWIER0 (WF_INT_WAKEUP_TOP_BASE + 0x40) /* 0x24640 */ -#define HWIER1 (WF_INT_WAKEUP_TOP_BASE + 0x48) /* 0x24648 */ -#define HWIER2 (WF_INT_WAKEUP_TOP_BASE + 0x50) /* 0x24650 */ - -#define HWIER3_TBTT0 BIT15 -#define HWIER3_PRETBTT0 BIT31 -#define HWIER3 (WF_INT_WAKEUP_TOP_BASE + 0x58) /* 0x24658 */ - -#define HWIER4_TTTT0 BIT15 -#define HWIER4_PRETTTT0 BIT31 -#define HWIER4 (WF_INT_WAKEUP_TOP_BASE + 0x60) /* 0x24660 */ - -#endif /* __WF_INT_WAKEUP_TOP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_lpon_top.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_lpon_top.h deleted file mode 100644 index ec02cac61e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_lpon_top.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_lpon_top.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_LPON_TOP_H__ -#define __WF_LPON_TOP_H__ - -/* In range of 0x24000 ~ 0x24400 */ -#define WF_LPON_TOP_BASE 0x24200 - -#define LPON_TT0SBOR1 (WF_LPON_TOP_BASE + 0x00) -#define LPON_TT0SBOR2 (WF_LPON_TOP_BASE + 0x04) -#define LPON_TT0SBOR3 (WF_LPON_TOP_BASE + 0x08) -#define LPON_TT0SBOR4 (WF_LPON_TOP_BASE + 0x0c) -#define LPON_TT0SBOR5 (WF_LPON_TOP_BASE + 0x54) -#define LPON_TT0SBOR6 (WF_LPON_TOP_BASE + 0x58) -#define LPON_TT0SBOR7 (WF_LPON_TOP_BASE + 0x64) -#define LPON_TT0SBOR8 (WF_LPON_TOP_BASE + 0x68) -#define LPON_TT0SBOR9 (WF_LPON_TOP_BASE + 0x6c) -#define LPON_TT0SBOR10 (WF_LPON_TOP_BASE + 0x70) -#define LPON_TT0SBOR11 (WF_LPON_TOP_BASE + 0x74) -#define LPON_TT0SBOR12 (WF_LPON_TOP_BASE + 0x78) -#define LPON_TT0SBOR13 (WF_LPON_TOP_BASE + 0x80) -#define LPON_TT0SBOR14 (WF_LPON_TOP_BASE + 0x84) -#define LPON_TT0SBOR15 (WF_LPON_TOP_BASE + 0x8c) -#define SUB_BSSID0_TTTT_OFFSET_n_MASK (0x3ffff) -#define SBSS_TTTT0_TSF0_EN BIT29 -#define TTTT0_n_INT_EN BIT30 -#define PRE_TTTT0_n_INT_EN BIT31 - -#define TSF_TIMER_HW_MODE_FULL_ADHOC (3 << 2) -#define TSF_TIMER_HW_MODE_RX_ONLY (2 << 2) -#define TSF_TIMER_HW_MODE_TICK_ONLY (1 << 2) -#define TSF_TIMER_HW_MODE_FULL (0 << 2) - -#define TSF_TIMER_SW_MODE_TSFTIMERVALUEREAD 3 -#define TSF_TIMER_SW_MODE_TSFTIMERVALUEADJUST 2 -#define TSF_TIMER_SW_MODE_TSFTIMERVALUECHANGE 1 - -#define LPON_T0CR (WF_LPON_TOP_BASE + 0x10) /* 0x24210 */ -#define LPON_T1CR (WF_LPON_TOP_BASE + 0x14) /* 0x24214 */ -#define LPON_UTTR0 (WF_LPON_TOP_BASE + 0x18) /* 0x24218 */ -#define LPON_UTTR1 (WF_LPON_TOP_BASE + 0x1c) /* 0x2421c */ -#define LPON_BTEIR (WF_LPON_TOP_BASE + 0x20) /* 0x24220 */ -#define LPON_TIMTR (WF_LPON_TOP_BASE + 0x24) /* 0x24224 */ -#define LPON_T0STR (WF_LPON_TOP_BASE + 0x28) /* 0x24228 */ -#define LPON_T1STR (WF_LPON_TOP_BASE + 0x2c) /* 0x2422c */ -#define LPON_PISR (WF_LPON_TOP_BASE + 0x30) /* 0x24230 */ -#define DEFAULT_PRETBTT_INTERVAL_IN_MS 0x50 /* 5ms */ - -#define LPON_T0TPCR (WF_LPON_TOP_BASE + 0x34) /* 0x24234 */ -#define LPON_T1TPCR (WF_LPON_TOP_BASE + 0x38) /* 0x24238 */ -#define LPON_T2TPCR (WF_LPON_TOP_BASE + 0x108) /* 0x24308 */ -#define LPON_T3TPCR (WF_LPON_TOP_BASE + 0x10c) /* 0x2430c */ -#define BEACONPERIODn_MASK (0xffff) -#define BEACONPERIODn(p) (((p)&0xffff)) -#define DTIMPERIODn_MASK (0xff << 16) -#define DTIMPERIODn(p) (((p)&0xff) << 16) -#define TBTTWAKEPERIODn_MASK (0xf << 24) -#define TBTTWAKEPERIODn(p) (((p)&0xf) << 24) -#define DTIMWAKEPERIODn_MASK (0x7 << 28) -#define DTIMWAKEPERIODn(p) (((p)&0x7) << 28) -#define TBTTn_CAL_EN BIT31 - -#define PRETBTT_INT_EN BIT7 -#define BMC_TIMEOUT_EN BIT6 -#define BCN_TIMEOUT_EN BIT5 -#define PRETBTT_TIMEUP_EN BIT4 -#define TBTT_TIMEUP_EN BIT3 -#define PREDTIM_TRIG_EN BIT2 -#define PRETBTT_TRIG_EN BIT1 -#define TBTT_PERIOD_TIMER_EN BIT0 - -#define LPON_TTSR (WF_LPON_TOP_BASE + 0x3c) /* 0x2423c */ -#define LPON_TFRSR (WF_LPON_TOP_BASE + 0x40) /* 0x24240 */ -#define LPON_TSELR (WF_LPON_TOP_BASE + 0x44) /* 0x24244 */ -#define LPON_SPCR (WF_LPON_TOP_BASE + 0x48) /* 0x24248 */ -#define LPON_BCNTR (WF_LPON_TOP_BASE + 0x4c) /* 0x2424c */ -#define LPON_TCLCR (WF_LPON_TOP_BASE + 0x50) /* 0x24250 */ -#define LPON_MPTCR0 (WF_LPON_TOP_BASE + 0x5c) /* 0x2425c */ -#define LPON_MPTCR1 (WF_LPON_TOP_BASE + 0x60) /* 0x24260 */ -#define LPON_FRCR (WF_LPON_TOP_BASE + 0x7c) /* 0x2427c */ -#define LPON_WLANCKCR (WF_LPON_TOP_BASE + 0x88) /* 0x24288 */ - -#define LPON_SBTOR1 (WF_LPON_TOP_BASE + 0xa0) /* 0x242a0 */ -#define LPON_SBTOR2 (WF_LPON_TOP_BASE + 0xa4) /* 0x242a4 */ -#define LPON_SBTOR3 (WF_LPON_TOP_BASE + 0xa8) /* 0x242a8 */ -#define LPON_SBTOR4 (WF_LPON_TOP_BASE + 0xac) /* 0x242ac */ -#define LPON_SBTOR5 (WF_LPON_TOP_BASE + 0xb0) /* 0x242b0 */ -#define LPON_SBTOR6 (WF_LPON_TOP_BASE + 0xb4) /* 0x242b4 */ -#define LPON_SBTOR7 (WF_LPON_TOP_BASE + 0xb8) /* 0x242b8 */ -#define LPON_SBTOR8 (WF_LPON_TOP_BASE + 0xbc) /* 0x242bc */ -#define LPON_SBTOR9 (WF_LPON_TOP_BASE + 0xc0) /* 0x242c0 */ -#define LPON_SBTOR10 (WF_LPON_TOP_BASE + 0xc4) /* 0x242c4 */ -#define LPON_SBTOR11 (WF_LPON_TOP_BASE + 0xc8) /* 0x242c8 */ -#define LPON_SBTOR12 (WF_LPON_TOP_BASE + 0xcc) /* 0x242cc */ -#define LPON_SBTOR13 (WF_LPON_TOP_BASE + 0xd0) /* 0x242d0 */ -#define LPON_SBTOR14 (WF_LPON_TOP_BASE + 0xd4) /* 0x242d4 */ -#define LPON_SBTOR15 (WF_LPON_TOP_BASE + 0xd8) /* 0x242d8 */ -#define SUB_BSSID0_TIME_OFFSET_n_MASK (0xfffff) -#define SUB_BSSID0_TIME_OFFSET_n(p) (((p)&0xfffff)) -#define SBSS_TBTT0_TSF0_EN (1 << 29) -#define TBTT0_n_INT_EN (1 << 30) -#define PRE_TBTT0_n_INT_EN (1 << 31) - -#define LPON_T2CR (WF_LPON_TOP_BASE + 0xF8) -#define LPON_T3CR (WF_LPON_TOP_BASE + 0xFC) - -#define LPON_MPTCR2 (WF_LPON_TOP_BASE + 0x110) /* 0x24310 */ -#define LPON_MPTCR3 (WF_LPON_TOP_BASE + 0x114) /* 0x24310 */ -#define LPON_MPTCR4 (WF_LPON_TOP_BASE + 0x128) /* 0x24328 */ -#define TTTT0_PERIODTIMER_EN (1 << 0) -#define PRETTTT0_TRIG_EN (1 << 1) -#define TTTT0_TIMEUP_EN (1 << 3) -#define PRETTTT0TIMEUP_EN (1 << 4) -#define TIM_TIMEOUT0_EN (1 << 5) -#define TIM_BMC_TIMEOUT0_EN (1 << 6) -#define PRETTTT0INT_EN (1 << 7) -#define TTTT1PERIODTIMER_EN (1 << 8) -#define PRETTTT1_TRIG_EN (1 << 9) -#define TTTT1_TIMEUP_EN (1 << 11) -#define PRETTTT1TIMEUP_EN (1 << 12) -#define TIM_TIMEOUT1_EN (1 << 13) -#define TIM_BMC_TIMEOUT1_EN (1 << 14) -#define PRETTTT1INT_EN (1 << 15) -#define TIM_PARSE_TIM0_EN (1 << 27) -#define TIM_BMC0_EN (1 << 28) -#define TIM_PARSE_TIM1_EN (1 << 29) -#define TIM_BMC1_EN (1 << 30) - -#define LPON_MPTCR5 (WF_LPON_TOP_BASE + 0x12c) /* 0x2432c */ -#define LPON_PTTISR (WF_LPON_TOP_BASE + 0xdc) /* 0x242dc */ -#define DEFAULT_PRETTTT_INTERVAL_IN_MS 0x50 /* 5ms, unit is 64usec */ -#define IDX_DEFAULT_PRETTTT_INTERVAL(_p) \ - (DEFAULT_PRETTTT_INTERVAL_IN_MS << (8 * _p)) - -#define LPON_TT0TPCR (WF_LPON_TOP_BASE + 0xe8) /* 0x242e8 */ -#define DEFAULT_TTTT_OFFSET_IN_MS 0x2800 /* make default +10ms, unit is usec*/ -#define LPON_TT1TPCR (WF_LPON_TOP_BASE + 0xec) /* 0x242ec */ -#define LPON_TT2TPCR (WF_LPON_TOP_BASE + 0xf0) /* 0x242f0 */ -#define LPON_TT3TPCR (WF_LPON_TOP_BASE + 0xf4) /* 0x242f4 */ -#define TTTTn_OFFSET_OF_TBTTn_MASK (0x3ffff) -#define TTTTn_OFFSET_OF_TBTTn(p) (((p)&0x3ffff)) -#define TTTTn_CAL_EN (1 << 31) - -#define LPON_TT4TPCR (WF_LPON_TOP_BASE + 0x1b8) /* 0x243b8 */ -#define LPON_TT5TPCR (WF_LPON_TOP_BASE + 0x1bc) /* 0x243bc */ -#define LPON_TT6TPCR (WF_LPON_TOP_BASE + 0x1c0) /* 0x243c0 */ -#define LPON_TT7TPCR (WF_LPON_TOP_BASE + 0x1c4) /* 0x243c4 */ -#define TIM_PERIODn_MASK (0xffffff) -#define TIM_PERIODn(p) (((p)&0xffffff)) - -#define SET_TTTT_PERIOD(_pAd, _interval) \ - (_interval * _pAd->CommonCfg.BeaconPeriod) - -/* TSF_TIMER_SW_MODE */ -#define TSF_TIMER_VALUE_CHANGE 0x1 -#define TSF_TIMER_VALUE_ADJUST 0x2 -#define TSF_TIMER_VALUE_READ 0x3 -#define TSF_TIMER_HW_MODE_MASK (0x3 << 2) -#define TSF_TIMER_SW_MODE_MASK (0x3 << 0) - -#endif /* __WF_LPON_TOP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_mib.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_mib.h deleted file mode 100644 index 0b4dd295f8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_mib.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_mib.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_MIB_H__ -#define __WF_MIB_H__ - -#define WF_MIB_BASE 0x24800 - -#define MIB_M0SCR0 (WF_MIB_BASE + 0x00) -#define MIB_M0PBSCR (WF_MIB_BASE + 0x04) -#define MIB_M0SCR1 (WF_MIB_BASE + 0x08) -#define M0_MISC_CR (WF_MIB_BASE + 0x0c) - -#define MIB_M0SDR0 (WF_MIB_BASE + 0x10) -#define MIB_M0SDR3 (WF_MIB_BASE + 0x14) -#define MIB_M0SDR4 (WF_MIB_BASE + 0x18) -#define MIB_M0SDR5 (WF_MIB_BASE + 0x1c) -#define MIB_M0SDR6 (WF_MIB_BASE + 0x20) -#define MIB_M0SDR7 (WF_MIB_BASE + 0x24) -#define MIB_M0SDR8 (WF_MIB_BASE + 0x28) -#define MIB_M0SDR9 (WF_MIB_BASE + 0x2c) -#define MIB_M0SDR10 (WF_MIB_BASE + 0x30) -#define MIB_M0SDR11 (WF_MIB_BASE + 0x34) -#define MIB_M0SDR12 (WF_MIB_BASE + 0x38) -#define MIB_M0SDR14 (WF_MIB_BASE + 0x40) -#define MIB_M0SDR15 (WF_MIB_BASE + 0x44) -#define MIB_M0SDR16 (WF_MIB_BASE + 0x48) -#define MIB_M0SDR17 (WF_MIB_BASE + 0x4c) -#define MIB_M0SDR18 (WF_MIB_BASE + 0x50) -#define MIB_M0SDR19 (WF_MIB_BASE + 0x54) -#define MIB_M0SDR20 (WF_MIB_BASE + 0x58) -#define MIB_M0SDR21 (WF_MIB_BASE + 0x5c) -#define MIB_M0SDR22 (WF_MIB_BASE + 0x60) -#define MIB_M0SDR23 (WF_MIB_BASE + 0x64) -#define MIB_M0SDR29 (WF_MIB_BASE + 0x7c) - -#define MIB_M0SDR34 (WF_MIB_BASE + 0x90) -#define MIB_M0SDR35 (WF_MIB_BASE + 0x94) - -#define MIB_M0SDR36 (WF_MIB_BASE + 0x98) /* 820FD098 */ -#define MIB_M0SDR37 (WF_MIB_BASE + 0x9c) /* 820FD09c */ -#ifdef CUSTOMER_RSG_FEATURE -#define MIB_M0SDR38 (WF_MIB_BASE + 0xd0) /* 820FD0d0 */ -#define MIB_M0SDR39 (WF_MIB_BASE + 0xd4) /* 820FD0d4 */ -#define MIB_M0SDR40 (WF_MIB_BASE + 0xd8) /* 820FD0d8 */ -#endif - -#define MIB_M0SDR51 (WF_MIB_BASE + 0x1E0) /* 820FD1E0 */ - -#define MIB_M0DR0 (WF_MIB_BASE + 0xa0) -#define MIB_M0DR1 (WF_MIB_BASE + 0xa4) -#define MIB_M0DR2 (WF_MIB_BASE + 0xa8) -#define MIB_M0DR3 (WF_MIB_BASE + 0xac) -#define MIB_M0DR4 (WF_MIB_BASE + 0xb0) -#define MIB_M0DR5 (WF_MIB_BASE + 0xb4) - -#define MIB_M0DR6 (WF_MIB_BASE + 0xb8) -#define TX_DDLMT_RNG1_CNT_MASK (0xff) -#define GET_TX_DDLMT_RNG1_CNT(p) (((p)&TX_DDLMT_RNG1_CNT_MASK)) -#define TX_DDLMT_RNG2_CNT_MASK (0xff << 16) -#define GET_TX_DDLMT_RNG2_CNT(p) (((p)&TX_DDLMT_RNG2_CNT_MASK) >> 16) - -#define MIB_M0DR7 (WF_MIB_BASE + 0xbc) -#define TX_DDLMT_RNG3_CNT_MASK (0xff) -#define GET_TX_DDLMT_RNG3_CNT(p) (((p)&TX_DDLMT_RNG3_CNT_MASK)) -#define TX_DDLMT_RNG4_CNT_MASK (0xff << 16) -#define GET_TX_DDLMT_RNG4_CNT(p) (((p)&TX_DDLMT_RNG4_CNT_MASK) >> 16) - -#define MIB_M0DR8 (WF_MIB_BASE + 0xc0) -#define MIB_M0DR9 (WF_MIB_BASE + 0xc4) -#define MIB_M0DR10 (WF_MIB_BASE + 0xc8) -#define MIB_M0DR11 (WF_MIB_BASE + 0xcc) - -#define MIB_MB0SDR0 (WF_MIB_BASE + 0x100) -#define MIB_MB1SDR0 (WF_MIB_BASE + 0x110) -#define MIB_MB2SDR0 (WF_MIB_BASE + 0x120) -#define MIB_MB3SDR0 (WF_MIB_BASE + 0x130) - -#define MIB_MB0SDR1 (WF_MIB_BASE + 0x104) -#define MIB_MB1SDR1 (WF_MIB_BASE + 0x114) -#define MIB_MB2SDR1 (WF_MIB_BASE + 0x124) -#define MIB_MB3SDR1 (WF_MIB_BASE + 0x134) - -#define MIB_MB0SDR2 (WF_MIB_BASE + 0x108) -#define MIB_MB1SDR2 (WF_MIB_BASE + 0x118) -#define MIB_MB2SDR2 (WF_MIB_BASE + 0x128) -#define MIB_MB3SDR2 (WF_MIB_BASE + 0x138) - -#define MIB_MB0SDR3 (WF_MIB_BASE + 0x10c) -#define MIB_MB1SDR3 (WF_MIB_BASE + 0x11c) -#define MIB_MB2SDR3 (WF_MIB_BASE + 0x12c) -#define MIB_MB3SDR3 (WF_MIB_BASE + 0x13c) - -#define MIB_MPDU_SR0 (WF_MIB_BASE + 0x190) -#define MIB_MPDU_SR1 (WF_MIB_BASE + 0x194) - -#define MIB_M1SCR (WF_MIB_BASE + 0x200) -#define MIB_M1PBSCR (WF_MIB_BASE + 0x204) -#define MIB_M1SCR1 (WF_MIB_BASE + 0x208) -#ifdef TXRX_STAT_SUPPORT -#define MIB_M1SDR0 (WF_MIB_BASE + 0x210) -#endif -#define MIB_M1SDR3 (WF_MIB_BASE + 0x214) -#define MIB_M1SDR4 (WF_MIB_BASE + 0x218) -#define MIB_M1SDR10 (WF_MIB_BASE + 0x230) -#define MIB_M1SDR11 (WF_MIB_BASE + 0x234) -#define MIB_M1SDR16 (WF_MIB_BASE + 0x248) -#define MIB_M1SDR17 (WF_MIB_BASE + 0x24c) -#define MIB_M1SDR18 (WF_MIB_BASE + 0x250) -#define MIB_M1SDR20 (WF_MIB_BASE + 0x258) -#define MIB_M1SDR36 (WF_MIB_BASE + 0x298) /* 820FD298 */ -#define MIB_M1SDR37 (WF_MIB_BASE + 0x29c) /* 820FD29c */ -#endif /* __WF_SEC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_mu.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_mu.h deleted file mode 100644 index 1787053fb2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_mu.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_mu.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_MU_H__ -#define __WF_MU_H__ - -#define WF_MU_BASE 0x25000 - -#define MU_MUCR0 (WF_MU_BASE + 0x0000) /* 0x25000 */ -#define MUCR0_MU_ENA_BIT (0) -#define MUCR0_MU_ENA_MASK (0x1 << 0) -#define MUCR0_MU_DBDC_OFFSET_BIT (28) -#define MUCR0_MU_DBDC_OFFSET_MASK (0x3 << 28) - -#define MU_MUCR1 (WF_MU_BASE + 0x0004) /* 0x25004 */ -#define MUCR1_MU_MAX_GROUP_SEARCH_BIT 0 -#define MUCR1_MU_MAX_GROUP_SEARCH_MASK (0x7ff << 0) -#define MUCR1_PFID_PE_VALID_TH_BIT 12 -#define MUCR1_PFID_PE_VALID_TH_MASK (0xf << 12) -#define MUCR1_PFID_PE_VALID_ENA_BIT 16 -#define MUCR1_PFID_PE_VALID_ENA_MASK (0x1 << 16) -#define MUCR1_PFID_TX_COUNT_REMAP_CTRL_BIT 20 -#define MUCR1_PFID_TX_COUNT_REMAP_CTRL_MASK (0x1 << 20) -#define MUCR1_CLUSTER_TAB_REMAP_CTRL_BIT 21 -#define MUCR1_CLUSTER_TAB_REMAP_CTRL_MASK (0x1 << 21) -#define MUCR1_GPID_RATE_PER_TAB_CTRL_BIT 22 -#define MUCR1_GPID_RATE_PER_TAB_CTRL_MASK (0x1 << 21) -#define MUCR1_GRP_TAB_DMCS_WMASK_BIT 24 -#define MUCR1_GRP_TAB_DMCS_WMASK_MASK (0x1 << 24) -#define MUCR1_GRP_TAB_REMAP_CTRL_BIT 28 -#define MUCR1_GRP_TAB_REMAP_CTRL_MASK (0x7 << 28) - -#define MU_MUCR2 (WF_MU_BASE + 0x0008) /* 0x25008 */ -#define MU_MUCR3 (WF_MU_BASE + 0x000c) /* 0x2500c */ -#define MU_MUCR4 (WF_MU_BASE + 0x0010) /* 0x25010 */ -#define MUCR4_AC_LEN_TAB_CLR_BIT (0) -#define MUCR4_AC_LEN_TAB_CLR_MASK (1 << 0) - -#define MU_PFID_COUNT_TABLE (WF_MU_BASE + 0x0100) /* 0x25100 ~ 0x253FF */ -#define MU_PFID_COUNT_TABLE_LEN 0x300 - -#define MU_CLUSTER_TABLE_BASE (WF_MU_BASE + 0x0400) /* 0x25400 ~ 0x255FF */ -#define MU_CLUSTER_TABLE_LEN 0x200 - -typedef struct _MU_CLID_ENTRY { - UINT8 GidMembership[8]; - UINT8 GidUserPosition[16]; -} MU_CLID_ENTRY; - -#define MU_GPID_RATE_PER_TABLE_BASE \ - (WF_MU_BASE + 0x0680) /* 0x25680 ~ 0x256FF */ -#define MU_GPID_RATE_PER_TABLE_LEN 0x80 - -#define MU_PROFILE_TABLE_BASE (WF_MU_BASE + 0x0780) /* 0x25780 ~ 0x257FF */ -#define MU_PROFILE_TABLE_LEN 0x80 -typedef struct _MU_PROFILE_ID_ENTRY { -#ifdef RT_BIG_ENDIAN - UINT32 Rsv_17_31 : 15; - UINT32 BA_Status_AC3 : 1; - UINT32 BA_Status_AC2 : 1; - UINT32 BA_Status_AC1 : 1; - UINT32 BA_Status_AC0 : 1; - UINT32 MuCluster : 5; - UINT32 WlanId : 7; - UINT32 Vld : 1; -#else - UINT32 Vld : 1; - UINT32 WlanId : 7; - UINT32 MuCluster : 5; - UINT32 BA_Status_AC0 : 1; - UINT32 BA_Status_AC1 : 1; - UINT32 BA_Status_AC2 : 1; - UINT32 BA_Status_AC3 : 1; - UINT32 Rsv_17_31 : 15; -#endif /* RT_BIG_ENDIAN */ -} MU_PROFILE_ID_ENTRY; - -#define MU_GRP_TABLE_RATE_MAP (WF_MU_BASE + 0x1000) /* 0x26000 ~ 0x26FFF */ -#define MU_GRP_TABLE_RATE_MAP_LEN - -#define MU_GRP_TABLE_STAT_MAP (WF_MU_BASE + 0x1000) /* 0x26000 */ -#endif /* __WF_MU_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_pf.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_pf.h deleted file mode 100644 index 7d49844b3c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_pf.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_pf.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_PF_H__ -#define __WF_PF_H__ -#define WF_PF_BASE 0x22000 - -#endif /* __WF_PF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_phy.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_phy.h deleted file mode 100644 index 7861e52c35..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_phy.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_phy.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_PHY_H__ -#define __WF_PHY_H__ - -#define WF_PHY_BASE 0x10000 - -#define PHY_PHYSYS_CTRL (WF_PHY_BASE + 0x0000) /* 0x82070000 */ -#define PHY_PHYCK_CTRL (WF_PHY_BASE + 0x0004) /* 0x82070004 */ - -#define PHY_BAND0_PHY_CTRL_0 (WF_PHY_BASE + 0x0200) /* 0x82070200 */ - -#ifdef SPECIAL_11B_OBW_FEATURE -#define PHY_BAND0_PHY_CTRL_1 (WF_PHY_BASE + 0x0204) /* 0x82070204 */ -#define PHY_BAND0_PHY_CTRL_8 (WF_PHY_BASE + 0x0304) /* 0x82070304 */ -#endif - -#define RO_BAND0_PHYCTRL_STS0 (WF_PHY_BASE + 0x020C) /* 0x8207020C */ -#define RO_BAND0_PHYCTRL_STS1 (WF_PHY_BASE + 0x0210) /* 0x82070210 */ -#define RO_BAND0_PHYCTRL_STS2 (WF_PHY_BASE + 0x0214) /* 0x82070214 */ -#define RO_BAND0_PHYCTRL_STS4 (WF_PHY_BASE + 0x021C) /* 0x8207021C */ -#define RO_BAND0_PHYCTRL_STS5 (WF_PHY_BASE + 0x0220) /* 0x82070220 */ -#define RO_BAND0_PHYCTRL_STS (WF_PHY_BASE + 0x0230) /* 0x82070230 */ - -#define PHY_BAND1_PHY_CTRL_0 (WF_PHY_BASE + 0x0400) /* 0x82070400 */ -#define RO_BAND1_PHYCTRL_STS0 (WF_PHY_BASE + 0x040C) /* 0x8207040C */ -#define RO_BAND1_PHYCTRL_STS1 (WF_PHY_BASE + 0x0410) /* 0x82070410 */ -#define RO_BAND1_PHYCTRL_STS2 (WF_PHY_BASE + 0x0414) /* 0x82070414 */ -#define RO_BAND1_PHYCTRL_STS4 (WF_PHY_BASE + 0x041C) /* 0x8207041C */ -#define RO_BAND1_PHYCTRL_STS5 (WF_PHY_BASE + 0x0420) /* 0x82070420 */ -#define RO_BAND1_PHYCTRL_STS (WF_PHY_BASE + 0x0430) /* 0x82070430 */ - -#define PHY_BAND0_PHYMUX_5 (WF_PHY_BASE + 0x0614) /* 0x82070614 */ -#define PHY_BAND0_PHYMUX_6 (WF_PHY_BASE + 0x0618) /* 0x82070618 */ -#define PHY_BAND0_PHYMUX_23 (WF_PHY_BASE + 0x065c) /* 0x8207065c */ -#define PHY_BAND1_PHYMUX_5 (WF_PHY_BASE + 0x0814) /* 0x82070814 */ -#define PHY_BAND1_PHYMUX_6 (WF_PHY_BASE + 0x0818) /* 0x82070818 */ -#define PHY_BAND1_PHYMUX_23 (WF_PHY_BASE + 0x085c) /* 0x8207085c */ -#define PHY_BAND0_PHY_CCA (WF_PHY_BASE + 0x0618) /* 0x82070618 */ -#define PHY_BAND1_PHY_CCA (WF_PHY_BASE + 0x0818) /* 0x82070818 */ - -#define CR_DBGSGD_MODE (WF_PHY_BASE + 0x0C04) /* 0x82070C04 */ - -#define PHY_TXFD_1 (WF_PHY_BASE + 0x8004) /* 0x82078004 */ - -#define PHY_RXTD_RXFE_01_B0 (WF_PHY_BASE + 0x2004) /* 0x82072004 */ -#define PHY_RXTD_RXFE_01_B1 (WF_PHY_BASE + 0x2804) /* 0x82072804 */ - -#define PHY_DCRF_TRACK (WF_PHY_BASE + 0x200C) /* 0x8207200C */ - -#define PHY_RXTD_0 (WF_PHY_BASE + 0x2200) /* 0x82072200 */ -#define PHY_RXTD_12 (WF_PHY_BASE + 0x2230) /* 0x82072230 */ -#define PHY_MIN_PRI_PWR (WF_PHY_BASE + 0x229C) /* 0x8207229C */ -#define BAND1_PHY_MIN_PRI_PWR (WF_PHY_BASE + 0x0084) /* 0x82070084 */ -#define PHY_RXTD2_10 (WF_PHY_BASE + 0x2a28) /* 0x82072a28 */ -#define PHY_RXTD2_0 (WF_PHY_BASE + 0x2a00) /* 0x82072a00 */ - -#define PHY_LTFSYNC_6 (WF_PHY_BASE + 0x22f4) /* 0x820722f4 */ - -#define PHY_RXTD_CCKPD_3 (WF_PHY_BASE + 0x2300) /* 0x82072300 */ -#define PHY_RXTD_CCKPD_4 (WF_PHY_BASE + 0x2304) /* 0x82072304 */ -#define PHY_RXTD_CCKPD_6 (WF_PHY_BASE + 0x230c) /* 0x8207230c */ -#define PHY_RXTD_CCKPD_7 (WF_PHY_BASE + 0x2310) /* 0x82072310 */ -#define PHY_RXTD_CCKPD_8 (WF_PHY_BASE + 0x2314) /* 0x82072314 */ - -#define RO_BAND0_RXTD_DEBUG0 (WF_PHY_BASE + 0x227c) /* 0x8207227c */ -#define RO_BAND0_RXTD_DEBUG4 (WF_PHY_BASE + 0x228c) /* 0x8207228c */ -#define RO_BAND0_RXTD_DEBUG6 (WF_PHY_BASE + 0x2294) /* 0x82072294 */ - -#define PHY_RXTD1_0 (WF_PHY_BASE + 0x2600) /* 0x82072600 */ -#define PHY_RXTD1_1 (WF_PHY_BASE + 0x2604) /* 0x82072604 */ -#define PHY_RXTD1_4 (WF_PHY_BASE + 0x2610) /* 0x82072610 */ - -#define PHY_RXTD_43 (WF_PHY_BASE + 0x22ac) /* 0x820722ac */ -#define PHY_RXTD_44 (WF_PHY_BASE + 0x22b0) /* 0x820722b0 */ -#define PHY_RXTD_56 (WF_PHY_BASE + 0x2728) /* 0x82072728 */ -#define PHY_RXTD_58 (WF_PHY_BASE + 0x2730) /* 0x82072730 */ - -#define PHY_RXTD_BAND0_AGC_23_RX0 (WF_PHY_BASE + 0x215c) /* 0x8207215c */ -#define PHY_RXTD_BAND0_AGC_23_RX1 (WF_PHY_BASE + 0x255c) /* 0x8207255c */ -#define RO_BAND0_AGC_DEBUG_0 (WF_PHY_BASE + 0x21a0) /* 0x820721a0 */ -#define RO_BAND0_AGC_DEBUG_2 (WF_PHY_BASE + 0x21A8) /* 0x820721A8 */ -#define RO_BAND0_AGC_DEBUG_4 (WF_PHY_BASE + 0x21B0) /* 0x820721B0 */ -#define RO_BAND0_AGC_DEBUG_6 (WF_PHY_BASE + 0x21b8) /* 0x820721b8 */ -#define RO_BAND1_AGC_DEBUG_2 (WF_PHY_BASE + 0x29A8) /* 0x820729A8 */ -#define RO_BAND1_AGC_DEBUG_4 (WF_PHY_BASE + 0x29B0) /* 0x820729B0 */ - -#define DCRF_TRACK (WF_PHY_BASE + 0x200C) /* 0x8207200C */ - -#define PHY_FSD_CTRL_1 (WF_PHY_BASE + 0x50d8) /* 0x820750d8 */ -#ifdef SPECIAL_11B_OBW_FEATURE -#define CR_TXTD_CCK_0 (WF_PHY_BASE + 0x8200) /* 0x82078200 */ -#endif -#define PHY_TX_BAND0_WF0_CR_TXFE_3 (WF_PHY_BASE + 0x8408) /* 0x82078408 */ -#define PHY_TX_BAND0_WF1_CR_TXFE_3 (WF_PHY_BASE + 0x8420) /* 0x82078420 */ -#define PHY_TX_BAND1_WF0_CR_TXFE_3 (WF_PHY_BASE + 0x8438) /* 0x82078438 */ -#define PHY_TX_BAND1_WF1_CR_TXFE_3 (WF_PHY_BASE + 0x8450) /* 0x82078450 */ - -#define PHY_CTRL_TSSI_9 (WF_PHY_BASE + 0x9c24) /* 0x82079c24 */ -#define PHY_CTRL_WF1_TSSI_9 (WF_PHY_BASE + 0x9d24) /* 0x82079d24 */ -#define PHY_CTRL_WF2_TSSI_9 (WF_PHY_BASE + 0x9e24) /* 0x82079e24 */ -#define PHY_CTRL_WF3_TSSI_9 (WF_PHY_BASE + 0x9f24) /* 0x82079f24 */ - -#endif /* __WF_PHY_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_ple.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_ple.h deleted file mode 100644 index 9784a16f84..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_ple.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_ple.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_PLE_H__ -#define __WF_PLE_H__ - -#define PLE_BASE 0x8000 - -/* PLE Buffer Control Register */ -#define PLE_PBUF_CTRL (PLE_BASE + 0x14) -#define PLE_TOTAL_PAGE_NUM_MASK (0xfff) -#define PLE_GET_TOTAL_PAGE_NUM(p) (((p)&0xfff)) -#define PLE_TOTAL_PAGE_CFG_MASK (0xf << 16) -#define PLE_GET_TOTAL_PAGE_CFG(p) (((p)&PSE_TOTAL_PAGE_CFG_MASK) >> 16) -#define PLE_PBUF_OFFSET_MASK (0xf << 20) -#define GET_PLE_PBUF_OFFSET(p) (((p)&PSE_PBUF_OFFSET_MASK) >> 20) - -/* Release Control */ -#define PLE_RELEASE_CTRL (PLE_BASE + 0x30) -#define PLE_NORMAL_TX_RLS_QID_MASK (0x1f) -#define GET_PLE_NORMAL_TX_RLS_QID(p) (((p)&GET_FIRST_FID_MASK)) -#define PLE_NORMAL_TX_RLS_PID_MASK (0x3 << 6) -#define GET_PLE_NORMAL_TX_RLS_PID(p) (((p)&PLE_NORMAL_TX_RLS_PID_MASK) >> 6) - -#define BCNx_RLS_QID_MASK (0x1f) -#define BCNx_RLS_PID_MASK (0x3) -#define SET_BCN0_RLS_QID(p) (((p)&BCNx_RLS_QID_MASK) << 16) -#define SET_BCN0_RLS_PID(p) (((p)&BCNx_RLS_PID_MASK) << 22) -#define SET_BCN1_RLS_QID(p) (((p)&BCNx_RLS_QID_MASK) << 24) -#define SET_BCN1_RLS_PID(p) (((p)&BCNx_RLS_PID_MASK) << 30) - -/* HIF Report Control */ -#define PLE_HIF_REPORT (PLE_BASE + 0x34) - -/* CPU Interface get frame ID Control */ -#define PLE_C_GET_FID_0 (PLE_BASE + 0x40) - -/* CPU Interface get frame ID Control */ -#define PLE_C_GET_FID_1 (PLE_BASE + 0x44) - -#define PLE_C_EN_QUEUE_0 (PLE_BASE + 0x60) -#define PLE_C_EN_QUEUE_1 (PLE_BASE + 0x64) -#define PLE_C_EN_QUEUE_2 (PLE_BASE + 0x68) - -#define PLE_C_DE_QUEUE_0 (PLE_BASE + 0x80) -#define PLE_C_DE_QUEUE_1 (PLE_BASE + 0x84) -#define PLE_C_DE_QUEUE_2 (PLE_BASE + 0x88) -#define PLE_C_DE_QUEUE_3 (PLE_BASE + 0x8c) - -#define PLE_TO_N9_INT (PLE_BASE + 0xf0) -#define PLE_TO_N9_INT_TOGGLE_MASK 0x80000000 - -/* Queue Empty */ -#define PLE_QUEUE_EMPTY (PLE_BASE + 0xb0) -#define PLE_AC0_QUEUE_EMPTY_0 (PLE_BASE + 0x300) -#define PLE_AC0_QUEUE_EMPTY_1 (PLE_BASE + 0x304) -#define PLE_AC0_QUEUE_EMPTY_2 (PLE_BASE + 0x308) -#define PLE_AC0_QUEUE_EMPTY_3 (PLE_BASE + 0x30c) - -#define PLE_AC1_QUEUE_EMPTY_0 (PLE_BASE + 0x310) -#define PLE_AC1_QUEUE_EMPTY_1 (PLE_BASE + 0x314) -#define PLE_AC1_QUEUE_EMPTY_2 (PLE_BASE + 0x318) -#define PLE_AC1_QUEUE_EMPTY_3 (PLE_BASE + 0x31c) - -#define PLE_AC2_QUEUE_EMPTY_0 (PLE_BASE + 0x320) -#define PLE_AC2_QUEUE_EMPTY_1 (PLE_BASE + 0x324) -#define PLE_AC2_QUEUE_EMPTY_2 (PLE_BASE + 0x328) -#define PLE_AC2_QUEUE_EMPTY_3 (PLE_BASE + 0x32c) - -#define PLE_AC3_QUEUE_EMPTY_0 (PLE_BASE + 0x330) -#define PLE_AC3_QUEUE_EMPTY_1 (PLE_BASE + 0x334) -#define PLE_AC3_QUEUE_EMPTY_2 (PLE_BASE + 0x338) -#define PLE_AC3_QUEUE_EMPTY_3 (PLE_BASE + 0x33c) - -#define PLE_STATION_PAUSE0 (PLE_BASE + 0x360) -#define PLE_STATION_PAUSE1 (PLE_BASE + 0x364) -#define PLE_STATION_PAUSE2 (PLE_BASE + 0x368) -#define PLE_STATION_PAUSE3 (PLE_BASE + 0x36C) - -/* Page Flow Control */ -#define PLE_FREEPG_CNT (PLE_BASE + 0x100) - -#define PLE_FREEPG_HEAD_TAIL (PLE_BASE + 0x104) - -#define PLE_PG_HIF_GROUP (PLE_BASE + 0x110) -#define PLE_HIF_PG_INFO (PLE_BASE + 0x114) - -#define PLE_PG_CPU_GROUP (PLE_BASE + 0x150) -#define PLE_CPU_PG_INFO (PLE_BASE + 0x154) - -/* Indirect path for read/write */ -#define PLE_FL_QUE_CTRL_0 (PLE_BASE + 0x1b0) -#define PLE_FL_QUE_CTRL_1 (PLE_BASE + 0x1b4) -#define PLE_FL_QUE_CTRL_2 (PLE_BASE + 0x1b8) -#define PLE_FL_QUE_CTRL_3 (PLE_BASE + 0x1bc) -#define PLE_PL_QUE_CTRL_0 (PLE_BASE + 0x1c0) - -/* Disable Station control */ -#define DIS_STA_MAP0 (PLE_BASE + 0x260) -#define DIS_STA_MAP1 (PLE_BASE + 0x264) -#define DIS_STA_MAP2 (PLE_BASE + 0x268) -#define DIS_STA_MAP3 (PLE_BASE + 0x26c) - -/* Station Pause control register */ -#define STATION_PAUSE0 (PLE_BASE + 0x360) -#define STATION_PAUSE1 (PLE_BASE + 0x364) -#define STATION_PAUSE2 (PLE_BASE + 0x368) -#define STATION_PAUSE3 (PLE_BASE + 0x36c) - -/* VOW Ctrl */ -#define VOW_RESET_DISABLE (1 << 26) -#define STA_MAX_DEFICIT_MASK (0x0000FFFF) -#define VOW_DBDC_BW_GROUP_CTRL (PLE_BASE + 0x2ec) -#define VOW_CONTROL (PLE_BASE + 0x370) -#define AIRTIME_DRR_SIZE (PLE_BASE + 0x374) - -typedef enum _ENUM_UMAC_PORT_T { - ENUM_UMAC_HIF_PORT_0 = 0, - ENUM_UMAC_CPU_PORT_1 = 1, - ENUM_UMAC_LMAC_PORT_2 = 2, - ENUM_PLE_CTRL_PSE_PORT_3 = 3, - ENUM_UMAC_PSE_PLE_PORT_TOTAL_NUM = 4 -} ENUM_UMAC_PORT_T, - *P_ENUM_UMAC_PORT_T; - -/* N9 MCU QUEUE LIST */ -typedef enum _ENUM_UMAC_CPU_P_QUEUE_T { - ENUM_UMAC_CTX_Q_0 = 0, - ENUM_UMAC_CTX_Q_1 = 1, - ENUM_UMAC_CTX_Q_2 = 2, - ENUM_UMAC_CTX_Q_3 = 3, - ENUM_UMAC_CRX = 0, - ENUM_UMAC_CIF_QUEUE_TOTAL_NUM = 4 -} ENUM_UMAC_CPU_P_QUEUE_T, - *P_ENUM_UMAC_CPU_P_QUEUE_T; - -/* LMAC PLE TX QUEUE LIST */ -typedef enum _ENUM_UMAC_LMAC_PLE_TX_P_QUEUE_T { - ENUM_UMAC_LMAC_PLE_TX_Q_00 = 0x00, - ENUM_UMAC_LMAC_PLE_TX_Q_01 = 0x01, - ENUM_UMAC_LMAC_PLE_TX_Q_02 = 0x02, - ENUM_UMAC_LMAC_PLE_TX_Q_03 = 0x03, - - ENUM_UMAC_LMAC_PLE_TX_Q_10 = 0x04, - ENUM_UMAC_LMAC_PLE_TX_Q_11 = 0x05, - ENUM_UMAC_LMAC_PLE_TX_Q_12 = 0x06, - ENUM_UMAC_LMAC_PLE_TX_Q_13 = 0x07, - - ENUM_UMAC_LMAC_PLE_TX_Q_20 = 0x08, - ENUM_UMAC_LMAC_PLE_TX_Q_21 = 0x09, - ENUM_UMAC_LMAC_PLE_TX_Q_22 = 0x0a, - ENUM_UMAC_LMAC_PLE_TX_Q_23 = 0x0b, - - ENUM_UMAC_LMAC_PLE_TX_Q_30 = 0x0c, - ENUM_UMAC_LMAC_PLE_TX_Q_31 = 0x0d, - ENUM_UMAC_LMAC_PLE_TX_Q_32 = 0x0e, - ENUM_UMAC_LMAC_PLE_TX_Q_33 = 0x0f, - - ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_0 = 0x10, - ENUM_UMAC_LMAC_PLE_TX_Q_BMC_0 = 0x11, - ENUM_UMAC_LMAC_PLE_TX_Q_BNC_0 = 0x12, - ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_0 = 0x13, - - ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_1 = 0x14, - ENUM_UMAC_LMAC_PLE_TX_Q_BMC_1 = 0x15, - ENUM_UMAC_LMAC_PLE_TX_Q_BNC_1 = 0x16, - ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_1 = 0x17, - ENUM_UMAC_LMAC_PLE_TX_Q_NAF = 0x18, - ENUM_UMAC_LMAC_PLE_TX_Q_NBCN = 0x19, - ENUM_UMAC_LMAC_PLE_TX_Q_RELEASE = - 0x1f, /* DE suggests not to use 0x1f, it's only for hw free queue */ - ENUM_UMAC_LMAC_QUEUE_TOTAL_NUM = 24, - -} ENUM_UMAC_LMAC_TX_P_QUEUE_T, - *P_ENUM_UMAC_LMAC_TX_P_QUEUE_T; - -/* LMAC PLE For PSE Control P3 */ -typedef enum _ENUM_UMAC_PLE_CTRL_P3_QUEUE_T { - ENUM_UMAC_PLE_CTRL_P3_Q_0X1E = 0x1e, - ENUM_UMAC_PLE_CTRL_P3_Q_0X1F = 0x1f, - ENUM_UMAC_PLE_CTRL_P3_TOTAL_NUM = 2 -} ENUM_UMAC_PLE_CTRL_P3_QUEUE_T, - *P_ENUM_UMAC_PLE_CTRL_P3_QUEUE_T; - -typedef struct _EMPTY_QUEUE_INFO_T { - PCHAR QueueName; - UINT32 Portid; - UINT32 Queueid; -} EMPTY_QUEUE_INFO_T, *P_EMPTY_QUEUE_INFO_T; - -#endif /* __WF_PLE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_pp.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_pp.h deleted file mode 100644 index 601c1f4090..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_pp.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_pp.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_PP_H__ -#define __WF_PP_H__ - -#define PP_BASE 0xe000 - -/* CT path control register */ -#define PP_RXCUTDISP (PP_BASE + 0x54) -#define PP_RXCUTDISP_CT_EN_MASK (1 << 0) -#define PP_RXCUTDISP_CR4_EN_MASK (1 << 1) - -/* */ -#define PP_PAGECTL_0 (PP_BASE + 0x58) -#define PAGECTL_0_PSE_PG_CNT_MASK (0xfff) - -/* */ -#define PP_PAGECTL_1 (PP_BASE + 0x5c) -#define PAGECTL_1_PLE_PG_CNT_MASK (0xfff) - -/* */ -#define PP_PAGECTL_2 (PP_BASE + 0x60) -#define PAGECTL_2_CUT_PG_CNT_MASK (0xfff) - -/* PP spare dummy CR */ -#define PP_SPARE_DUMMY_CR5 (PP_BASE + 0x64) -#define PP_SPARE_DUMMY_CR6 (PP_BASE + 0x68) -#define PP_SPARE_DUMMY_CR7 (PP_BASE + 0x6c) -#define PP_SPARE_DUMMY_CR8 (PP_BASE + 0x70) - -#endif /* __WF_PP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_rmac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_rmac.h deleted file mode 100644 index 4e50761eaf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_rmac.h +++ /dev/null @@ -1,289 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_rmac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_RMAC_H__ -#define __WF_RMAC_H__ - -#define WF_RMAC_BASE 0x21200 -/* TODO: shiang-7603, un-finished yet! */ - -/* - Current BSSID 0 Register 0/1 -*/ -#define RMAC_RFCR_BAND_0 (WF_RMAC_BASE + 0x000) -#define RMAC_RFCR_BAND_1 (WF_RMAC_BASE + 0x100) -#define DROP_STBC_BCN_BC_MC (1 << 0) -#define DROP_FCS_ERROR_FRAME (1 << 1) -#define RX_PROMISCUOUS_MODE (1 << 2) -#define DROP_VERSION_NO_0 (1 << 3) -#define DROP_PROBE_REQ (1 << 4) -#define DROP_MC_FRAME (1 << 5) -#define DROP_BC_FRAME (1 << 6) -#define DROP_NOT_IN_MC_TABLE (1 << 7) -#define DROP_ADDR3_OWN_MAC (1 << 8) -#define DROP_DIFF_BSSID_A3 (1 << 9) -#define DROP_DIFF_BSSID_A2 (1 << 10) -#define DROP_DIFF_BSSID_BCN (1 << 11) -#define RM_FRAME_REPORT_EN (1 << 12) -#define DROP_CTRL_RSV (1 << 13) -#define DROP_CTS (1 << 14) -#define DROP_RTS (1 << 15) -#define DROP_DUPLICATE (1 << 16) -#define DROP_NOT_MY_BSSID (1 << 17) -#define DROP_NOT_UC2ME (1 << 18) -#define DROP_DIFF_BSSID_BTIM (1 << 19) -#define DROP_NDPA (1 << 20) -#define RX_UNWANTED_CTL_FRM (1 << 21) - -#define RMAC_RFCR1 (WF_RMAC_BASE + 0x004) -#define RMAC_RFCR1_BAND_1 (WF_RMAC_BASE + 0x104) - -#define RMAC_BCNF0 (WF_RMAC_BASE + 0x008) -#define RMAC_BCNF0_BAND_1 (WF_RMAC_BASE + 0x108) - -#define RMAC_NAVOPT (WF_RMAC_BASE + 0x40) - -#define RMAC_BCNF1 (WF_RMAC_BASE + 0x00c) -#define RMAC_BCNF1_BAND_1 (WF_RMAC_BASE + 0x10c) - -#define BSCR0_BAND_0 (WF_RMAC_BASE + 0x010) -#define BSCR1_BAND_0 (WF_RMAC_BASE + 0x014) -#define BSCR0_BAND_1 (WF_RMAC_BASE + 0x110) -#define BSCR1_BAND_1 (WF_RMAC_BASE + 0x114) -#define BA_MAC_ADDR_47_32_MASK (0xffff) -#define BA_MAC_ADDR_47_32(p) (((p)&0xffff)) -#define RST_BA_TID_MASK (0xf << 16) -#define RST_BA_TID(p) (((p)&0xf) << 16) -#define RST_BA_SEL_MASK (0x3 << 20) -#define RST_BA_MAC_TID_MATCH 0 -#define RST_BA_MAC_MATCH 1 -#define RST_BA_WITHOUT_MATCH 2 -#define RST_BA_SEL(p) (((p)&0x3) << 20) -#define START_RST_BA_SB (1 << 22) - -#define RMAC_RMACDR (WF_RMAC_BASE + 0x018) /* 0x21218 */ -#define RMAC_RMACDR_BAND_1 (WF_RMAC_BASE + 0x118) /* 0x21318 */ -#define DISABLE_TSF_PROBE_RSP (1 << 0) -#define ENABLE_TSF_TIM (1 << 4) -#define RMACDR_MBSSID_MASK (0x3 << 24) -#define RMACDR_MBSSID(p) (((p)&0x3) << 24) -#define CHK_HTC_BY_RATE (1 << 26) -#define SELECT_RXMAXLEN_20BIT (1 << 30) - -/* TODO:shiang-MT7615, confirm this! */ -#define RMAC_NSUR (WF_RMAC_BASE + 0x01c) -#define RMAC_NSUR_BAND_1 (WF_RMAC_BASE + 0x11c) - -#define RMAC_RMCR (WF_RMAC_BASE + 0x020) -#define RMAC_RMCR_BAND_1 (WF_RMAC_BASE + 0x120) -#define RMAC_RMCR_SMPS_MODE_MASK (0x3 << 20) -#define RMAC_RMCR_SMPS_MODE(p) (((p)&0x3) << 20) -#define DISABLE_SMPS_RX_BYPASS_SETTING 0 -#define STATIC_SMPS 1 -#define DYNAMIC_SMPS 2 -#define DISABLE_SMPS_RX_BYSETTING 3 -#define RMAC_RMCR_RX_STREAM_0 (1 << 22) -#define RMAC_RMCR_RX_STREAM_1 (1 << 23) -#define RMAC_RMCR_RX_STREAM_2 (1 << 24) -#define RMAC_RMCR_RX_STREAM_3 (1 << 25) -#define RMAC_RMCR_SMPS_BY_RTS (1 << 26) - -#define RMAC_MORE (WF_RMAC_BASE + 0x024) -#define RMAC_MORE_BAND_1 (WF_RMAC_BASE + 0x124) -typedef union _RMAC_MORE_STRUC { - struct { - UINT32 mpdu_len_compare : 14; - UINT32 rsv_14_15 : 2; - UINT32 rmac_cr_smps_slot_idle : 2; - UINT32 rsv_18_25 : 8; - UINT32 drop_ndp : 1; - UINT32 drop_uc2me_bssid_unmatch : 1; - UINT32 rsv_28_29 : 2; - UINT32 muar_mode_sel : 2; - } field; - - UINT32 word; -} RMAC_MORE_STRUC; - -#define RMAC_CHFREQ0 (WF_RMAC_BASE + 0x030) -#define RMAC_CHFREQ1 (WF_RMAC_BASE + 0x130) - -#define RMAC_MISC (WF_RMAC_BASE + 0x034) -#define RMAC_MISC_BAND_1 (WF_RMAC_BASE + 0x134) - -#define RMAC_MAXMINLEN (WF_RMAC_BASE + 0x038) -#define RMAC_MAXMINLEN_BAND_1 (WF_RMAC_BASE + 0x138) -#define RMAC_DROP_MIN_LEN 0xe -#define RMAC_DROP_MIN_LEN_MASK (0xff << 24) -#define RMAC_DROP_MAX_LEN 0x40000 -#define RMAC_DROP_MAX_LEN_MASK (0xfffff) - -/*information from 2015-July-9 task group mm.*/ -enum ENUM_HW_TMR_VER { - TMR_VER_1_0 = 0, /*6630E3/7628/Gen3/7637/7622/7615E1*/ - TMR_VER_1_5 = 1, /* MT7615 e3 only.*/ - TMR_VER_2_0 = 2 /* for 6632 */ -}; - -#define RMAC_TMR_PA (WF_RMAC_BASE + 0x03c) -#define RMAC_TMR_PA_BAND_1 (WF_RMAC_BASE + 0x013c) - -#define RMAC_TMR_ENABLE BIT31 -#define RMAC_TMR_ROLE BIT30 - -/*below CRs are available in MT7615E3 and MT6632 E1 */ -#define RMAC_TMR_LOCK_EN BIT29 -#define RMAC_TMR_UNLOCK_CTRL BIT28 -#define RMAC_TMR_CATEGORY3_EN BIT27 -#define RMAC_TMR_CATEGORY2_EN BIT26 -#define RMAC_TMR_CATEGORY1_EN BIT25 -#define RMAC_TMR_CATEGORY0_EN BIT24 -/*above CRs are available in MT7615E3 and MT6632 E1 */ - -#define TMR_PA_TYPE_SUBTYPE3_MASK BITS(18, 23) -#define TMR_PA_TYPE_SUBTYPE3_OFST 18 -#define TMR_PA_TYPE_SUBTYPE2_MASK BITS(12, 17) -#define TMR_PA_TYPE_SUBTYPE2_OFST 12 -#define TMR_PA_TYPE_SUBTYPE1_MASK BITS(6, 11) -#define TMR_PA_TYPE_SUBTYPE1_OFST 6 -#define TMR_PA_TYPE_SUBTYPE0_MASK BITS(0, 5) -#define TMR_PA_TYPE_SUBTYPE0_OFST 0 - -#define TMR_PA_SUBTYPE_OFST 2 - -#define RMAC_PHY_DELAY (WF_RMAC_BASE + 0x06c) -#define RMAC_PHY_DELAY_BAND_1 (WF_RMAC_BASE + 0x016c) - -#ifdef AIR_MONITOR -#define RMAC_SMESH (WF_RMAC_BASE + 0x048) -#define RMAC_SMESH_B1 (WF_RMAC_BASE + 0x148) -#endif - -/* - Current BSSID 0 Register 0/1 -*/ -#define RMAC_CB0R0 (WF_RMAC_BASE + 0x200) /* 0x21400 */ -#define RMAC_CB0R1 (WF_RMAC_BASE + 0x204) -#define RMAC_CB1R0 (WF_RMAC_BASE + 0x208) -#define RMAC_CB1R1 (WF_RMAC_BASE + 0x20c) -#define RMAC_CB2R0 (WF_RMAC_BASE + 0x210) -#define RMAC_CB2R1 (WF_RMAC_BASE + 0x214) -#define RMAC_CB3R0 (WF_RMAC_BASE + 0x218) -#define RMAC_CB3R1 (WF_RMAC_BASE + 0x21c) - -typedef struct _RMAC_CBxR0_STRUC { - UINT32 addr_31_0; -} RMAC_CBxR0_STRUC; - -typedef union _RMAC_CBxR1_STRUC { - struct { - UINT32 addr_47_32 : 16; - UINT32 bssid_en : 1; - UINT32 rsv_17 : 15; - } field; - UINT32 word; -} RMAC_CBxR1_STRUC; - -/* - OWN MAC Address 0 Register 0/1 -*/ -#define RMAC_OMA0R0 (WF_RMAC_BASE + 0x220) /* 0x21420 */ -#define RMAC_OMA0R1 (WF_RMAC_BASE + 0x224) /* 0x21424 */ -#define RMAC_OMA1R0 (WF_RMAC_BASE + 0x228) /* 0x21428 */ -#define RMAC_OMA1R1 (WF_RMAC_BASE + 0x22c) /* 0x2142c */ -#define RMAC_OMA2R0 (WF_RMAC_BASE + 0x230) /* 0x21430 */ -#define RMAC_OMA2R1 (WF_RMAC_BASE + 0x234) /* 0x21434 */ -#define RMAC_OMA3R0 (WF_RMAC_BASE + 0x238) /* 0x21438 */ -#define RMAC_OMA3R1 (WF_RMAC_BASE + 0x23c) /* 0x2143c */ -#define RMAC_OMA4R0 (WF_RMAC_BASE + 0x240) /* 0x21440 */ -#define RMAC_OMA4R1 (WF_RMAC_BASE + 0x244) /* 0x21444 */ -#define RMAC_B01AR_B1AR (WF_RMAC_BASE + 0x250) /* 0x21450 */ -#define RMAC_B23AR_B1AR (WF_RMAC_BASE + 0x24c) /* 0x2144c */ -#define RMAC_ACBEN (WF_RMAC_BASE + 0x258) /* 0x21458 */ - -#define RMAC_MAR0 (WF_RMAC_BASE + 0x25c) /* 0x2145c */ -#define RMAC_MAR1 (WF_RMAC_BASE + 0x260) /* 0x21460 */ -#define RMAC_RSVD0 (WF_RMAC_BASE + 0x2e0) /* 0x214e0 */ -#define RMAC_DEBUG_CR (WF_RMAC_BASE + 0x2e4) -typedef struct _RMAC_MAR0_STRUC { - UINT32 addr_31_0; -} RMAC_MAR0_STRUC; - -typedef union _RMAC_MAR1_STRUC { - struct { - UINT32 addr_39_32 : 8; - UINT32 addr_47_40 : 8; - UINT32 access_start : 1; - UINT32 readwrite : 1; - UINT32 rsv18_23 : 6; - UINT32 multicast_addr_index : 6; - UINT32 multicast_addr_group : 2; - } field; - UINT32 word; -} RMAC_MAR1_STRUC; - -#define RX_EIFS_TIME_ZERO (1 << 21) - -#define RMAC_MBSSIDEXT1_0 (WF_RMAC_BASE + 0x300) -#define RMAC_MBSSIDEXT1_1 (WF_RMAC_BASE + 0x304) -#define RMAC_MBSSIDEXT2_0 (WF_RMAC_BASE + 0x308) -#define RMAC_MBSSIDEXT2_1 (WF_RMAC_BASE + 0x30c) -#define RMAC_MBSSIDEXT3_0 (WF_RMAC_BASE + 0x310) -#define RMAC_MBSSIDEXT3_1 (WF_RMAC_BASE + 0x314) -#define RMAC_MBSSIDEXT4_0 (WF_RMAC_BASE + 0x318) -#define RMAC_MBSSIDEXT4_1 (WF_RMAC_BASE + 0x31c) -#define RMAC_MBSSIDEXT5_0 (WF_RMAC_BASE + 0x320) -#define RMAC_MBSSIDEXT5_1 (WF_RMAC_BASE + 0x324) -#define RMAC_MBSSIDEXT6_0 (WF_RMAC_BASE + 0x328) -#define RMAC_MBSSIDEXT6_1 (WF_RMAC_BASE + 0x32c) -#define RMAC_MBSSIDEXT7_0 (WF_RMAC_BASE + 0x330) -#define RMAC_MBSSIDEXT7_1 (WF_RMAC_BASE + 0x334) -#define RMAC_MBSSIDEXT8_0 (WF_RMAC_BASE + 0x338) -#define RMAC_MBSSIDEXT8_1 (WF_RMAC_BASE + 0x33c) -#define RMAC_MBSSIDEXT9_0 (WF_RMAC_BASE + 0x340) -#define RMAC_MBSSIDEXT9_1 (WF_RMAC_BASE + 0x344) -#define RMAC_MBSSIDEXT10_0 (WF_RMAC_BASE + 0x348) -#define RMAC_MBSSIDEXT10_1 (WF_RMAC_BASE + 0x34c) -#define RMAC_MBSSIDEXT11_0 (WF_RMAC_BASE + 0x350) -#define RMAC_MBSSIDEXT11_1 (WF_RMAC_BASE + 0x354) -#define RMAC_MBSSIDEXT12_0 (WF_RMAC_BASE + 0x358) -#define RMAC_MBSSIDEXT12_1 (WF_RMAC_BASE + 0x35c) -#define RMAC_MBSSIDEXT13_0 (WF_RMAC_BASE + 0x360) -#define RMAC_MBSSIDEXT13_1 (WF_RMAC_BASE + 0x364) -#define RMAC_MBSSIDEXT14_0 (WF_RMAC_BASE + 0x368) -#define RMAC_MBSSIDEXT14_1 (WF_RMAC_BASE + 0x36c) -#define RMAC_MBSSIDEXT15_0 (WF_RMAC_BASE + 0x370) -#define RMAC_MBSSIDEXT15_1 (WF_RMAC_BASE + 0x374) - -#define RMAC_MIBTIME0 (WF_RMAC_BASE + 0x3C4) -#define RMAC_MIBTIME5 (WF_RMAC_BASE + 0x3D8) -#define RMAC_MIBTIME6 (WF_RMAC_BASE + 0x3DC) -#define RMAC_AIRTIME0 (WF_RMAC_BASE + 0x380) -#define RX_AIRTIME_EN BIT(30) - -#endif /* __WF_RMAC_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_sec.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_sec.h deleted file mode 100644 index 77cbb53eb9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_sec.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_sec.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_SEC_H__ -#define __WF_SEC_H__ - -#define WF_SEC_BASE 0x21600 -#define SEC_SCR (WF_SEC_BASE + 0x004) - -#endif /* __WF_SEC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_tmac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_tmac.h deleted file mode 100644 index 311497b0ed..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_tmac.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_tmac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_TMAC_H__ -#define __WF_TMAC_H__ - -#define WF_TMAC_BASE 0x21000 - -#define TMAC_TCR (WF_TMAC_BASE + 0x00) -#define TMAC_TCR1 (WF_TMAC_BASE + 0x08) -#define PRE_RTS_IDLE_DET_DIS (1 << 4) -#define TX_BLINK_SEL_MASK (0x3 << 6) -#define TX_BLINK_SEL(p) (((p)&0x3) << 6) -#define PRE_RTS_DET_GUARD_TIME_MASK (0xf << 8) -#define PRE_RTS_DET_GUARD_TIME(p) (((p)&0xf) << 8) -#define PRE_RTS_SEC_IDLE_SEL_MASK (0x3 << 12) -#define PRE_RTS_SEC_IDLE_SEL(p) (((p)&0x3) << 12) -#define RTS_SIGTA_EN (1 << 14) -#define LDPC_OFST_EN (1 << 15) -#define TMAC_TCR_TX_STREAM_NUM_MASK (0x3 << 16) -#define TMAC_TCR_TX_STREAM_NUM(p) (((p)&0x3) << 16) -#define GET_TMAC_TCR_TX_STREAM_NUM(p) (((p)&TMAC_TCR_TX_STREAM_NUM_MASK) >> 16) -#define SCH_IDLE_SEL_MASK (0x3 << 18) -#define SCH_IDLE_SEL(p) (((p)&0x3) << 18) -#define SCH_DET_PER_IOD (1 << 20) -#define DCH_DET_DIS (1 << 21) -#define TX_RIFS_EN (1 << 22) -#define GET_TX_RIFS_EN(p) (((p)&TX_RIFS_EN) >> 22) -#define RX_RIFS_MODE (1 << 23) -#define GET_RX_RIFS_MODE(p) (((p)&RX_RIFS_MODE) >> 23) -#define TXOP_TBTT_CONTROL (1 << 24) -#define GET_TXOP_TBTT_CONTROL(p) (((p)&TXOP_TBTT_CONTROL) >> 24) -#define TBTT_TX_STOP_CONTROL (1 << 25) -#define GET_TBTT_TX_STOP_CONTROL(p) (((p)&TBTT_TX_STOP_CONTROL) >> 25) -#define TXOP_BURST_STOP (1 << 26) -#define GET_TXOP_BURST_STOP(p) (((p)&TXOP_BURST_STOP) >> 26) -#define RDG_RA_MODE (1 << 27) -#define GET_RDG_RA_MODE(p) (((p)&RDG_RA_MODE) >> 27) -#define RDG_RESP_EN (1 << 29) -#define GET_RDG_RESP_EN(p) (((p)&RDG_RESP_EN) >> 29) -#define GRANT_REVERSE_WHEN_NO_PENDING_FRM (1 << 30) -#define SMOOTHING (1 << 31) -#define GET_SMOOTHING(p) (((p)&SMOOTHING) >> 31) - -#define TMAC_PSCR (WF_TMAC_BASE + 0x04) -#define TMAC_PSCR1 (WF_TMAC_BASE + 0x0c) -#define APS_OFF_TIME_MASK (0xff << 1) -#define APS_OFF_TIME(p) (((p)&0xff) << 1) -#define GET_APS_OFF_TIME(p) (((p)&APS_OFF_TIME_MASK) >> 1) -#define APS_ON_TIME_MASK (0x3f << 10) -#define APS_ON_TIME(p) (((p)&0x3f) << 10) -#define GET_APS_ON_TIME(p) (((p)&APS_ON_TIME_MASK) >> 10) -#define APS_HALT_TIME_MASK (0x3ff << 16) -#define APS_HALT_TIME(p) (((p)&0x3ff) << 16) -#define GET_APS_HALT_TIME(p) (((p)&APS_HALT_TIME_MASK) >> 16) -#define APS_EN (1 << 28) -#define GET_APS_EN(p) (((p)&APS_EN) >> 28) - -#define TMAC_ACTXOPLR0 (WF_TMAC_BASE + 0x10) -#define AC2LIMIT_MASK (0xffff) -#define AC2LIMIT(p) (((p)&0xffff)) -#define GET_AC2LIMIT(p) (((p)&AC2LIMIT_MASK)) -#define AC3LIMIT_MASK (0xffff << 16) -#define AC3LIMIT(p) (((p)&0xffff) << 16) -#define GET_AC3LIMIT(p) (((p)&AC3LIMIT_MASK) >> 16) - -#define TMAC_ACTXOPLR1 (WF_TMAC_BASE + 0x14) -#define AC0LIMIT_MASK (0xffff) -#define AC0LIMIT(p) (((p)&0xffff)) -#define GET_AC0LIMIT(p) (((p)&AC0LIMIT_MASK)) -#define AC1LIMIT_MASK (0xffff << 16) -#define AC1LIMIT(p) (((p)&0xffff) << 16) -#define GET_AC1LIMIT(p) (((p)&AC1LIMIT_MASK) >> 16) - -#define TMAC_ACTXOPLR2 (WF_TMAC_BASE + 0x18) -#define AC12LIMIT_MASK (0xffff) -#define AC12LIMIT(p) (((p)&0xffff)) -#define GET_AC12LIMIT(p) (((p)&AC12LIMIT_MASK)) -#define AC13LIMIT_MASK (0xffff << 16) -#define AC13LIMIT(p) (((p)&0xffff) << 16) -#define GET_AC13LIMIT(p) (((p)&AC13LIMIT_MASK) >> 16) - -#define TMAC_ACTXOPLR3 (WF_TMAC_BASE + 0x1c) -#define AC10LIMIT_MASK (0xffff) -#define AC10LIMIT(p) (((p)&0xffff)) -#define GET_AC10LIMIT(p) (((p)&AC10LIMIT_MASK)) -#define AC11LIMIT_MASK (0xffff << 16) -#define AC11LIMIT(p) (((p)&0xffff) << 16) -#define GET_AC11LIMIT(p) (((p)&AC11LIMIT_MASK) >> 16) - -#define TMAC_ACTXOPLR4 (WF_TMAC_BASE + 0x60) -#define TMAC_ACTXOPLR5 (WF_TMAC_BASE + 0x64) -#define TMAC_ACTXOPLR6 (WF_TMAC_BASE + 0x68) -#define TMAC_ACTXOPLR7 (WF_TMAC_BASE + 0x6c) - -#define TMAC_FP0R0 (WF_TMAC_BASE + 0x20) -#define TMAC_FP1R0 (WF_TMAC_BASE + 0x40) -#define LG_OFDM0_FRAME_POWER0_DBM_MASK (0x7f) -#define LG_OFDM0_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define LG_OFDM1_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define LG_OFDM1_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define LG_OFDM2_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define LG_OFDM2_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define LG_OFDM3_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define LG_OFDM3_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R1 (WF_TMAC_BASE + 0x24) -#define TMAC_FP1R1 (WF_TMAC_BASE + 0x44) -#define HT20_0_FRAME_POWER0_DBM_MASK (0x7f) -#define HT20_0_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define HT20_1_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define HT20_1_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define HT20_2_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define HT20_2_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define HT20_3_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define HT20_3_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R2 (WF_TMAC_BASE + 0x28) -#define TMAC_FP1R2 (WF_TMAC_BASE + 0x48) -#define HT40_0_FRAME_POWER0_DBM_MASK (0x7f) -#define HT40_0_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define HT40_1_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define HT40_1_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define HT40_2_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define HT40_2_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define HT40_3_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define HT40_3_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R3 (WF_TMAC_BASE + 0x2C) -#define TMAC_FP1R3 (WF_TMAC_BASE + 0x4C) -#define CCK0_FRAME_POWER0_DBM_MASK (0x7f) -#define CCK0_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define LG_OFDM4_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define LG_OFDM4_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define CCK1_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define CCK1_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define HT40_6_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define HT40_6_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R4 (WF_TMAC_BASE + 0x30) -#define TMAC_FP1R4 (WF_TMAC_BASE + 0x50) -#define HT20_4_FRAME_POWER0_DBM_MASK (0x7f) -#define HT20_4_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define HT20_5_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define HT20_5_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define HT40_4_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define HT40_4_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define HT40_5_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define HT40_5_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R5 (WF_TMAC_BASE + 0x34) -#define TMAC_FP1R5 (WF_TMAC_BASE + 0x54) - -#define TMAC_FP0R6 (WF_TMAC_BASE + 0x38) -#define TMAC_FP1R6 (WF_TMAC_BASE + 0x58) - -#define TMAC_FP0R7 (WF_TMAC_BASE + 0x3c) -#define TMAC_FP1R7 (WF_TMAC_BASE + 0x5c) - -#define TMAC_CDTR (WF_TMAC_BASE + 0x90) -#define TMAC_ODTR (WF_TMAC_BASE + 0x94) - -#define TMAC_ATCR (WF_TMAC_BASE + 0x98) -#define ATCR_TXV_TOUT_BIT 0 -#define ATCR_TXV_TOUT_MASK (0xff) -#define ATCR_TXV_TOUT(p) (((p)&0xff)) -#define ATCR_GET_TXV_TOUT(p) (((p)&TXV_TOUT_MASK)) -#define RIFS_TXV_TOUT_MASK (0xff << 8) -#define RIFS_TXV_TOUT(p) (((p)&0xff) << 8) -#define GET_RIFS_TXV_TOUT(p) (((p)&RIFS_TXV_TOUT_MASK) >> 8) -#define AGG_TOUT_MASK (0xff << 16) -#define AGG_TOUT(p) (((p)&0xff) << 16) -#define GET_AGG_TOUT(p) (((p)&AGG_TOUT_MASK) >> 16) - -#define TMAC_TRCR0 (WF_TMAC_BASE + 0x9c) /* 0x2109c */ -#define TMAC_TRCR1 (WF_TMAC_BASE + 0x70) /* 0x21070 */ -#define TMAC_TR2T_CHK_BIT 0 -#define TMAC_TR2T_CHK_MASK (0x1ff) -#define CCA_SRC_SEL_MASK (0x3 << 30) -#define CCA_SRC_SEL(p) (((p)&0x3) << 30) -#define CCA_SEC_SRC_SEL_MASK (0x3 << 28) -#define CCA_SEC_SRC_SEL(p) (((p)&0x3) << 28) -#define I2T_CHK_EN BIT25 - -#define TMAC_RRCR (WF_TMAC_BASE + 0xA0) /* 0x210a0 */ - -#define TMAC_ICR_BAND_0 (WF_TMAC_BASE + 0xa4) /* 0x210a4 */ -#define TMAC_ICR_BAND_1 (WF_TMAC_BASE + 0x74) /* 0x21074 */ - -#define ICR_EIFS_TIME_MASK (0x1ff) -#define ICR_EIFS_TIME(p) (((p)&0x1ff)) -#define GET_ICR_EIFS_TIME(p) (((p)&ICR_EIFS_TIME_MASK)) -#define ICR_RIFS_TIME_MASK (0x1f << 10) -#define ICR_RIFS_TIME(p) (((p)&0x1f) << 10) -#define GET_ICR_RIFS_TIME(p) (((p)&ICR_RIFS_TIME_MASK) >> 10) -#define ICR_SIFS_TIME_MASK (0x7f << 16) -#define ICR_SIFS_TIME(p) (((p)&0x7f) << 16) -#define GET_ICR_SIFS_TIME(p) (((p)&ICR_SIFS_TIME_MASK) >> 16) -#define ICR_SLOT_TIME_MASK (0x7f << 24) -#define ICR_SLOT_TIME(p) (((p)&0x7f) << 24) -#define GET_ICR_SLOT_TIME(p) (((p)&ICR_SLOT_TIME_MASK) >> 24) - -#define TMAC_PCR (WF_TMAC_BASE + 0xb4) /* 0x210b4 */ -#define TMAC_PCR1 (WF_TMAC_BASE + 0xbc) /* 0x210bc */ -#define TMAC_PCR_FIX_OFDM_6M_RATE 0x4b -#define TMAC_PCR_AUTO_RATE 0x400 -#define PTEC_FIX_RATE_MASK (0x1ff) -#define PTEC_FIX_RATE(p) (((p)&0x1ff)) -#define GET_PTEC_FIX_RATE(p) (((p)&PTEC_FIX_RATE_MASK)) -#define PTEC_RATE_SEL (1 << 15) -#define GET_PTEC_RATE_SEL(p) (((p)&PTEC_RATE_SEL) >> 15) -#define PTEC_ANT_ID_MASK (0x3f << 16) -#define PTEC_ANT_ID(p) (((p)&0x3f) << 16) -#define GET_PTEC_ANT_ID(p) (((p)&PTEC_ANT_ID_MASK) >> 16) -#define PTEC_ANT_ID_SEL (1 << 22) -#define GET_PTEC_ANT_ID_SEL(p) (((p)&PTEC_ANT_ID_SEL) >> 22) -#define PTEC_SPE_EN (1 << 23) -#define GET_PTEC_SPE_EN(p) (((p)&PTEC_SPE_EN) >> 23) -#define PTEC_ANT_PRI_MASK (0x7 << 24) -#define PTEC_ANT_PRI(p) (((p)&0x7) << 24) -#define GET_PTEC_ANT_PRI(p) (((p)&PTEC_ANT_PRI_MASK) >> 24) -#define PTEC_ANT_PRI_SEL (1 << 27) -#define GET_PTEC_ANT_PRI_SEL(p) (((p)&PTEC_ANT_PRI_SEL) >> 27) - -#define TMAC_B0BRR0 (WF_TMAC_BASE + 0xc0) /* 0x210c0 */ -#define TMAC_B1BRR0 (WF_TMAC_BASE + 0xc8) /* 0x210c8 */ -#define TMAC_B2BRR0 (WF_TMAC_BASE + 0xd0) /* 0x210d0 */ -#define TMAC_B3BRR0 (WF_TMAC_BASE + 0xd8) /* 0x210d8 */ -#define BSSID00_RESP_SPE_EN (1 << 16) - -#define TMAC_B0BRR1 (WF_TMAC_BASE + 0xc4) /* 0x210c4 */ -#define TMAC_B1BRR1 (WF_TMAC_BASE + 0xcc) /* 0x210cc */ -#define TMAC_B2BRR1 (WF_TMAC_BASE + 0xd4) /* 0x210d4 */ -#define TMAC_B3BRR1 (WF_TMAC_BASE + 0xdc) /* 0x210dc */ -#define TMAC_QNCR0 (WF_TMAC_BASE + 0xe0) /* 0x210e0 */ -#define TMAC_QNCR1 (WF_TMAC_BASE + 0xe4) /* 0x210e4 */ -#define TMAC_QNCR2 (WF_TMAC_BASE + 0xe8) /* 0x210e8 */ -#define TMAC_QNCR3 (WF_TMAC_BASE + 0xec) /* 0x210ec */ -#define TMAC_QNCR4 (WF_TMAC_BASE + 0xf0) /* 0x210f0 */ -#define TMAC_CTCR0 (WF_TMAC_BASE + 0xf4) /* 0x210f4 */ - -#define INS_DDLMT_REFTIME_MASK (0x3f) -#define INS_DDLMT_REFTIME(p) (((p)&0x3f)) -#define INS_DDLMT_EN (1 << 17) -#define INS_DDLMT_VHT_SMPDU_EN (1 << 18) -#define INS_DDLMT_DENSITY(p) ((p & 0xf) << 12) -#define DUMMY_DELIMIT_INSERTION (INS_DDLMT_EN | INS_DDLMT_VHT_SMPDU_EN) - -#define TMAC_PCTSR (WF_TMAC_BASE + 0x108) /* 0x21108 */ - -#endif /* __WF_TMAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_trb.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_trb.h deleted file mode 100644 index 2a5cccdc6a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_trb.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_trb.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_TRB_H__ -#define __WF_TRB_H__ - -#define WF_TRB_BASE 0x20800 - -#define TRB_GCR (WF_TRB_BASE + 0x000) - -#define TRB_TRBTHR (WF_TRB_BASE + 0x014) -#define TRB_RXBTHR (WF_TRB_BASE + 0x01C) - -#ifdef DBG -#define TRB_TXBSR (WF_TRB_BASE + 0x020) -#define TRB_TXPSR (WF_TRB_BASE + 0x024) - -#define TRB_RXBSR (WF_TRB_BASE + 0x040) -#define TRB_RXPSR0 (WF_TRB_BASE + 0x044) -#define TRB_RXPSR1 (WF_TRB_BASE + 0x048) -#define TRB_RXPSR2 (WF_TRB_BASE + 0x04c) -#endif /* DBG */ -#endif /* __WF_TRB_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtbl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtbl.h deleted file mode 100644 index 57a5cbf162..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtbl.h +++ /dev/null @@ -1,618 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_wtbl.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_WTBL_H__ -#define __WF_WTBL_H__ - -#define WTBL_BASE_ADDR 0x30000 -#define WTBL_PER_ENTRY_SIZE (0x100) - -#define WTBL_DW0_MUARIDX_MASK 0x3f0000 -#define WTBL_DW0_MUARIDX_BIT 16 -#define WTBL_SET_MUARIDX(_x, _y) \ - (_x = (_x & (~(0x3f << 16))) | (((_y)&0x3f) << 16)) -#define WTBL_SET_RC_A1(_x, _y) (_x = (_x & (~(0x1 << 22))) | (((_y)&0x1) << 22)) -#define WTBL_SET_KID(_x, _y) (_x = (_x & (~(0x3 << 23))) | (((_y)&0x3) << 23)) -#define WTBL_SET_RCID(_x, _y) (_x = (_x & (~(0x1 << 25))) | (((_y)&0x1) << 25)) -#define WTBL_SET_RKV(_x, _y) (_x = (_x & (~(0x1 << 26))) | (((_y)&0x1) << 26)) -#define WTBL_SET_IKV(_x, _y) (_x = (_x & (~(0x1 << 27))) | (((_y)&0x1) << 27)) -#define WTBL_SET_RV(_x, _y) (_x = (_x & (~(0x1 << 28))) | (((_y)&0x1) << 28)) -#define WTBL_SET_RC_A2(_x, _y) (_x = (_x & (~(0x1 << 29))) | (((_y)&0x1) << 29)) - -#define WTBL_SET_PEER_ADDR4(_x, _y) (_x = (_x & (~(0xff))) | (((_y)&0xff) << 0)) -#define WTBL_SET_PEER_ADDR5(_x, _y) \ - (_x = (_x & (~(0xff << 8))) | (((_y)&0xff) << 8)) -#define WTBL_SET_PEER_ADDR0_3(_x, _y) ((_x) = ((_y)&0xffffffff)) - -union WTBL_DW0 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 gid_su : 1; - UINT32 wpi_flg : 1; - UINT32 rc_a2 : 1; - UINT32 rv : 1; - UINT32 ikv : 1; - UINT32 rkv : 1; - UINT32 rc_id : 1; - UINT32 kid : 2; - UINT32 rc_a1 : 1; - UINT32 muar_idx : 6; - UINT32 addr_5 : 8; - UINT32 addr_4 : 8; - } field; -#else - struct { - UINT32 addr_4 : 8; - UINT32 addr_5 : 8; - UINT32 muar_idx : 6; - UINT32 rc_a1 : 1; - UINT32 kid : 2; - UINT32 rc_id : 1; - UINT32 rkv : 1; - UINT32 ikv : 1; - UINT32 rv : 1; - UINT32 rc_a2 : 1; - UINT32 wpi_flg : 1; - UINT32 gid_su : 1; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW1 { - struct { - UINT32 addr_0; - } field; - UINT32 word; -}; - -enum WTBL_CIPHER_SUIT { - WTBL_CIPHER_NONE = 0, - WTBL_CIPHER_WEP_40 = 1, - WTBL_CIPHER_TKIP_MIC = 2, - WTBL_CIPHER_TKIP_NO_MIC = 3, - WTBL_CIPHER_CCMP_128_PMF = 4, - WTBL_CIPHER_WEP_104 = 5, - WTBL_CIPHER_BIP_CMAC_128 = 6, - WTBL_CIPHER_WEP_128 = 7, - WTBL_CIPHER_WPI_128 = 8, - WTBL_CIPHER_CCMP_128_CCX = 9, - WTBL_CIPHER_CCMP_256 = 10, - WTBL_CIPHER_GCMP_128 = 11, - WTBL_CIPHER_GCMP_256 = 12, - WTBL_CIPHER_GCMP_WPI_128 = 13, -}; - -#define WTBL_SET_DIS_RHTR(_x, _y) \ - (_x = (_x & (~(0x1 << 1))) | (((_y)&0x1) << 1)) -#define WTBL_SET_WPI_EVEN(_x, _y) \ - (_x = (_x & (~(0x1 << 2))) | (((_y)&0x1) << 2)) -#define WTBL_SET_AAD_OM(_x, _y) (_x = (_x & (~(0x1 << 3))) | (((_y)&0x1) << 3)) -#define WTBL_SET_CIPHER_SUIT(_x, _y) \ - (_x = (_x & (~(0xf << 4))) | (((_y)&0xf) << 4)) -#define WTBL_SET_PFMU_IDX(_x, _y) \ - (_x = (_x & (~(0xff << 8))) | (((_y)&0xff) << 8)) -#define WTBL_SET_PARTIAL_AID(_x, _y) \ - (_x = (_x & (~(0x1ff << 16))) | (((_y)&0x1ff) << 16)) -#define WTBL_SET_TIBF_HT(_x, _y) \ - (_x = (_x & (~(0x1 << 25))) | (((_y)&0x1) << 25)) -#define WTBL_SET_TEBF_HT(_x, _y) \ - (_x = (_x & (~(0x1 << 26))) | (((_y)&0x1) << 26)) -#define WTBL_SET_TIBF_VHT(_x, _y) \ - (_x = (_x & (~(0x1 << 27))) | (((_y)&0x1) << 27)) -#define WTBL_SET_TEBF_VHT(_x, _y) \ - (_x = (_x & (~(0x1 << 28))) | (((_y)&0x1) << 28)) -#define WTBL_SET_HT(_x, _y) (_x = (_x & (~(0x1 << 29))) | (((_y)&0x1) << 29)) -#define WTBL_SET_VHT(_x, _y) (_x = (_x & (~(0x1 << 30))) | (((_y)&0x1) << 30)) -#define WTBL_SET_MESH(_x, _y) (_x = (_x & (~(0x1 << 31))) | (((_y)&0x1) << 31)) - -union WTBL_DW2 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 mesh : 1; - UINT32 vht : 1; - UINT32 ht : 1; - UINT32 tebf_vht : 1; - UINT32 tibf_vht : 1; - UINT32 tebf : 1; - UINT32 tibf : 1; - UINT32 partial_aid : 9; - UINT32 pfmu_idx : 8; - UINT32 cipher_suit : 4; - UINT32 AAD_OM : 1; - UINT32 wpi_even : 1; - UINT32 dis_rhtr : 1; - UINT32 SW : 1; - } field; -#else - struct { - UINT32 SW : 1; - UINT32 dis_rhtr : 1; - UINT32 wpi_even : 1; - UINT32 AAD_OM : 1; - UINT32 cipher_suit : 4; - UINT32 pfmu_idx : 8; - UINT32 partial_aid : 9; - UINT32 tibf : 1; - UINT32 tebf : 1; - UINT32 tibf_vht : 1; - UINT32 tebf_vht : 1; - UINT32 ht : 1; - UINT32 vht : 1; - UINT32 mesh : 1; - } field; -#endif - UINT32 word; -}; - -#define DMAC_WTBL_DW3_SET_BAF(_x, _y) \ - (_x = ((_x) & (~0x00001000)) | (((_y)&0x1) << 12)) -#define DMAC_WTBL_DW3_SET_RDGBA(_x, _y) \ - (_x = ((_x) & (~0x00004000)) | (((_y)&0x1) << 14)) -#define DMAC_WTBL_DW3_SET_R(_x, _y) \ - (_x = ((_x) & (~0x00008000)) | (((_y)&0x1) << 15)) -#define DMAC_WTBL_DW3_SET_SMPS(_x, _y) \ - (_x = ((_x) & (~0x00800000)) | (((_y)&0x1) << 23)) -#define DMAC_WTBL_DW3_SET_RTS(_x, _y) \ - (_x = ((_x) & (~0x00400000)) | (((_y)&0x1) << 22)) -#define DMAC_WTBL_DW3_SET_TXPS(_x, _y) \ - (_x = ((_x) & (~0x00200000)) | (((_y)&0x1) << 21)) -#define DMAC_WTBL_DW3_SET_AF(_x, _y) \ - (_x = ((_x) & (~0x07000000)) | (((_y)&0x7) << 24)) -#define DMAC_WTBL_DW3_SET_DU_IPSM(_x, _y) \ - (_x = ((_x) & (~0x10000000)) | (((_y)&0x1) << 28)) -#define DMAC_WTBL_DW3_SET_IPSM(_x, _y) \ - (_x = ((_x) & (~0x20000000)) | (((_y)&0x1) << 29)) -#ifdef RT_BIG_ENDIAN -union WTBL_DW3 { - struct { - UINT32 skip_tx : 1; - UINT32 psm : 1; - UINT32 i_psm : 1; - UINT32 du_i_psm : 1; - UINT32 txop_ps_cap : 1; - UINT32 af : 3; - UINT32 smps : 1; - UINT32 rts : 1; - UINT32 tx_ps : 1; - UINT32 spe_idx : 5; - UINT32 r : 1; - UINT32 rdg_ba : 1; - UINT32 cf_ack : 1; - UINT32 baf_en : 1; - UINT32 ant_id_sts_3 : 3; - UINT32 ant_id_sts_2 : 3; - UINT32 ant_id_sts_1 : 3; - UINT32 ant_id_sts_0 : 3; - } field; - UINT32 word; -}; -#else -union WTBL_DW3 { - struct { - UINT32 ant_id_sts_0 : 3; - UINT32 ant_id_sts_1 : 3; - UINT32 ant_id_sts_2 : 3; - UINT32 ant_id_sts_3 : 3; - UINT32 baf_en : 1; - UINT32 cf_ack : 1; - UINT32 rdg_ba : 1; - UINT32 r : 1; - UINT32 spe_idx : 5; - UINT32 tx_ps : 1; - UINT32 rts : 1; - UINT32 smps : 1; - UINT32 af : 3; - UINT32 txop_ps_cap : 1; - UINT32 du_i_psm : 1; - UINT32 i_psm : 1; - UINT32 psm : 1; - UINT32 skip_tx : 1; - } field; - UINT32 word; -}; -#endif - -union WTBL_DW4 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 ba_en : 8; - UINT32 ba_win_size_tid_7 : 3; - UINT32 ba_win_size_tid_6 : 3; - UINT32 ba_win_size_tid_5 : 3; - UINT32 ba_win_size_tid_4 : 3; - UINT32 ba_win_size_tid_3 : 3; - UINT32 ba_win_size_tid_2 : 3; - UINT32 ba_win_size_tid_1 : 3; - UINT32 ba_win_size_tid_0 : 3; - } field; -#else - struct { - UINT32 ba_win_size_tid_0 : 3; - UINT32 ba_win_size_tid_1 : 3; - UINT32 ba_win_size_tid_2 : 3; - UINT32 ba_win_size_tid_3 : 3; - UINT32 ba_win_size_tid_4 : 3; - UINT32 ba_win_size_tid_5 : 3; - UINT32 ba_win_size_tid_6 : 3; - UINT32 ba_win_size_tid_7 : 3; - UINT32 ba_en : 8; - } field; -#endif - UINT32 word; -}; - -#define WTBL_SET_TXPWR_OFFSET(_x, _y) \ - (_x = ((_x) & (~0x0000001f)) | (((_y)&0x1f) << 0)) -#define WTBL_SET_FCAP(_x, _y) (_x = ((_x) & (~0x00003000)) | (((_y)&0x3) << 12)) -#define WTBL_SET_LDPC(_x, _y) (_x = ((_x) & (~0x00004000)) | (((_y)&0x1) << 14)) -#define WTBL_SET_LDPC_VHT(_x, _y) \ - (_x = ((_x) & (~0x00008000)) | (((_y)&0x1) << 12)) -#define WTBL_SET_MM(_x, _y) (_x = ((_x) & (~0x00070000)) | (((_y)&0x7) << 16)) -#define WTBL_SET_QOS(_x, _y) (_x = ((_x) & (~0x00080000)) | (((_y)&0x1) << 19)) -#define WTBL_SET_FD(_x, _y) (_x = ((_x) & (~0x00100000)) | (((_y)&0x1) << 20)) -#define WTBL_SET_TD(_x, _y) (_x = ((_x) & (~0x00200000)) | (((_y)&0x1) << 21)) -#define WTBL_SET_DYN_BW(_x, _y) \ - (_x = ((_x) & (~0x00400000)) | (((_y)&0x1) << 22)) - -union WTBL_DW5 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 rate_idx : 3; - UINT32 mpdu_ok_cnt : 3; - UINT32 mpdu_fail_cnt : 3; - UINT32 dyn_bw : 1; - UINT32 td : 1; - UINT32 fd : 1; - UINT32 qos : 1; - UINT32 mm : 3; - UINT32 ldpc_vht : 1; - UINT32 ldpc : 1; - UINT32 fcap : 2; - UINT32 g16 : 1; - UINT32 g8 : 1; - UINT32 g4 : 1; - UINT32 g2 : 1; - UINT32 cbrn : 3; - UINT32 txpwr_offset : 5; - } field; -#else - struct { - UINT32 txpwr_offset : 5; - UINT32 cbrn : 3; - UINT32 g2 : 1; - UINT32 g4 : 1; - UINT32 g8 : 1; - UINT32 g16 : 1; - UINT32 fcap : 2; - UINT32 ldpc : 1; - UINT32 ldpc_vht : 1; - UINT32 mm : 3; - UINT32 qos : 1; - UINT32 fd : 1; - UINT32 td : 1; - UINT32 dyn_bw : 1; - UINT32 mpdu_fail_cnt : 3; - UINT32 mpdu_ok_cnt : 3; - UINT32 rate_idx : 3; - } field; -#endif - UINT32 word; -}; - -#define WTBL_SET_RATE1(_x, _y) \ - (_x = ((_x) & (~0x00000fff)) | (((_y)&0xfff) << 0)) -#define WTBL_SET_RATE2(_x, _y) \ - (_x = ((_x) & (~0x00fff000)) | (((_y)&0xfff) << 12)) -#define WTBL_SET_RATE3_LOW(_x, _y) \ - (_x = ((_x) & (~0xff000000)) | (((_y)&0xfff) << 24)) -#define WTBL_SET_RATE3_HIGH(_x, _y) \ - (_x = ((_x) & (~0x0000000f)) | ((((_y)&0xfff) >> 8) << 0)) -#define WTBL_SET_RATE4(_x, _y) \ - (_x = ((_x) & (~0x0000fff0)) | (((_y)&0xfff) << 4)) -#define WTBL_SET_RATE5(_x, _y) \ - (_x = ((_x) & (~0x0fff0000)) | (((_y)&0xfff) << 16)) -#define WTBL_SET_RATE6_LOW(_x, _y) \ - (_x = ((_x) & (~0xf0000000)) | (((_y)&0xfff) << 28)) -#define WTBL_SET_RATE6_HIGH(_x, _y) \ - (_x = ((_x) & (~0x000000ff)) | ((((_y)&0xfff) >> 4) << 0)) -#define WTBL_SET_RATE7(_x, _y) \ - (_x = ((_x) & (~0x000fff00)) | (((_y)&0xfff) << 8)) -#define WTBL_SET_RATE8(_x, _y) \ - (_x = ((_x) & (~0xfff00000)) | (((_y)&0xfff) << 20)) - -union WTBL_DW6 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 rate_3_low : 8; - UINT32 rate_2 : 12; - UINT32 rate_1 : 12; - } field; -#else - struct { - UINT32 rate_1 : 12; - UINT32 rate_2 : 12; - UINT32 rate_3_low : 8; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW7 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 rate_6_low : 4; - UINT32 rate_5 : 12; - UINT32 rate_4 : 12; - UINT32 rate_3_high : 4; - } field; -#else - struct { - UINT32 rate_3_high : 4; - UINT32 rate_4 : 12; - UINT32 rate_5 : 12; - UINT32 rate_6_low : 4; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW8 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 rate_8 : 12; - UINT32 rate_7 : 12; - UINT32 rate_6_high : 8; - } field; -#else - struct { - UINT32 rate_6_high : 8; - UINT32 rate_7 : 12; - UINT32 rate_8 : 12; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW9 { - UINT32 word; -}; - -union WTBL_DW10 { - UINT32 word; -}; - -union WTBL_DW11 { - UINT32 word; -}; - -union WTBL_DW12 { - UINT32 word; -}; - -union WTBL_DW13 { - UINT32 word; -}; - -union WTBL_DW14 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 rate_1_fail_cnt : 16; - UINT32 rate_1_tx_cnt : 16; - } field; -#else - struct { - UINT32 rate_1_tx_cnt : 16; - UINT32 rate_1_fail_cnt : 16; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW15 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 rate_3_ok_cnt : 16; - UINT32 rate_2_ok_cnt : 16; - } field; -#else - struct { - UINT32 rate_2_ok_cnt : 16; - UINT32 rate_3_ok_cnt : 16; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW16 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 current_bw_fail_cnt : 16; - UINT32 current_bw_tx_cnt : 16; - } field; -#else - struct { - UINT32 current_bw_tx_cnt : 16; - UINT32 current_bw_fail_cnt : 16; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW17 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 other_bw_fail_cnt : 16; - UINT32 other_bw_tx_cnt : 16; - } field; -#else - struct { - UINT32 other_bw_tx_cnt : 16; - UINT32 other_bw_fail_cnt : 16; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW18 { - UINT32 word; -}; - -union WTBL_DW19 { - UINT32 word; -}; - -union WTBL_DW20 { - UINT32 word; -}; - -union WTBL_DW21 { - UINT32 word; -}; - -union WTBL_DW22 { - UINT32 word; -}; - -union WTBL_DW23 { - UINT32 word; -}; - -union WTBL_DW24 { - UINT32 word; -}; - -union WTBL_DW25 { - UINT32 word; -}; - -union WTBL_DW26 { - UINT32 word; -}; - -union WTBL_DW27 { - UINT32 word; -}; - -union WTBL_DW28 { -#ifdef RT_BIG_ENDIAN - struct { - UINT32 resp_rcpi_3 : 8; - UINT32 resp_rcpi_2 : 8; - UINT32 resp_rcpi_1 : 8; - UINT32 resp_rcpi_0 : 8; - } field; -#else - struct { - UINT32 resp_rcpi_0 : 8; - UINT32 resp_rcpi_1 : 8; - UINT32 resp_rcpi_2 : 8; - UINT32 resp_rcpi_3 : 8; - } field; -#endif - UINT32 word; -}; - -union WTBL_DW29 { - UINT32 word; -}; - -struct wtbl_key_tb { - UINT32 key[16]; /* wtbl_d30 ~ wtbl_d45 */ -}; - -struct wtbl_rx_stat { - union WTBL_DW27 wtbl_d27; - union WTBL_DW28 wtbl_d28; - union WTBL_DW29 wtbl_d29; -}; - -struct wtbl_adm_ctrl { - union WTBL_DW19 wtbl_d19; - union WTBL_DW20 wtbl_d20; - union WTBL_DW21 wtbl_d21; - union WTBL_DW22 wtbl_d22; - union WTBL_DW23 wtbl_d23; - union WTBL_DW24 wtbl_d24; - union WTBL_DW25 wtbl_d25; - union WTBL_DW26 wtbl_d26; -}; - -struct wtbl_retry_cnt { - union WTBL_DW18 wtbl_d18; -}; - -struct wtbl_rate_counter { - union WTBL_DW14 wtbl_d14; - union WTBL_DW15 wtbl_d15; - union WTBL_DW16 wtbl_d16; - union WTBL_DW17 wtbl_d17; -}; - -struct wtbl_serial_num { - union WTBL_DW9 wtbl_d9; - union WTBL_DW10 wtbl_d10; - union WTBL_DW11 wtbl_d11; - union WTBL_DW12 wtbl_d12; - union WTBL_DW13 wtbl_d13; -}; - -struct wtbl_rate_tb { - union WTBL_DW6 wtbl_d6; - union WTBL_DW7 wtbl_d7; - union WTBL_DW8 wtbl_d8; -}; - -struct wtbl_tx_rx_cap { - union WTBL_DW2 wtbl_d2; - union WTBL_DW3 wtbl_d3; - union WTBL_DW4 wtbl_d4; - union WTBL_DW5 wtbl_d5; -}; - -struct wtbl_basic_info { - union WTBL_DW0 wtbl_d0; - union WTBL_DW1 wtbl_d1; -}; - -/* - WTBL segment 1 definitions -*/ -typedef struct GNU_PACKED wtbl_struc { - struct wtbl_basic_info peer_basic_info; - struct wtbl_tx_rx_cap trx_cap; - struct wtbl_rate_tb auto_rate_tb; - struct wtbl_serial_num serial_no; - struct wtbl_rate_counter rate_counters; - struct wtbl_retry_cnt retry_cnt; - struct wtbl_adm_ctrl adm_ctrl; - struct wtbl_rx_stat rx_stat; - struct wtbl_key_tb key_tb; -} WTBL_STRUC; - -#endif /* __WF_WTBL_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtbloff.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtbloff.h deleted file mode 100644 index cf411fd49e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtbloff.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_wtbloff.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_WTBL_OFF_H__ -#define __WF_WTBL_OFF_H__ - -#define WF_WTBL_OFF_BASE 0x23400 - -#define WTBL_OFF_WIUCR (WF_WTBL_OFF_BASE + 0x30) /* 0x23430 */ -#define WLAN_IDX_MASK (0xff) -#define WLAN_IDX(p) (((p)&0xff)) -#define WTBL_RXINFO_UPDATE (1 << 11) -#define WTBL_ADM_CNT_CLEAR (1 << 12) -#define WTBL_RATE_UPDATE (1 << 13) -#define WTBL_TX_CNT_CLEAR (1 << 14) -#define WTBL_RX_CNT_CLEAR (1 << 15) -#define WTBL_IU_BUSY (1 << 31) - -#define WTBL_OFF_BCR (WF_WTBL_OFF_BASE + 0x4) /* 0x23404 */ -#define BIP_EN (1 << 0) - -#define WTBL_OFF_RMVTCR (WF_WTBL_OFF_BASE + 0x8) /* 0x23408 */ -#define RX_MV_MODE (1 << 23) -#define RCPI_AVG_PARAM_MASK (0x3 << 20) -#define RCPI_AVG_PARAM(p) (((p)&0x3) << 20) - -#define WTBL_OFF_RCR (WF_WTBL_OFF_BASE + 0x0) /* 0x23400 */ -#define CHECK_CTRL(p) ((p & 0x1)) -#define CHECK_CTRL_MASK (0x1) - -#define WTBL_OFF_ACR (WF_WTBL_OFF_BASE + 0xC) /* 0x2340C */ -#define WTBL_ADM_RX_EN (1 << 31) - -#endif /* __WF_WTBL_OFF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtblon.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtblon.h deleted file mode 100644 index 6c34a03230..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/dmac/wf_wtblon.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_wtblon.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_WTBL_ON_H__ -#define __WF_WTBL_ON_H__ - -#define WF_WTBL_ON_BASE 0x23000 - -#define WTBL_ON_WTBLOR (WF_WTBL_ON_BASE + 0x0) -#define WTBL_OR_PSM_W_FLAG (1 << 31) - -#define WTBL_ON_RICR0 (WF_WTBL_ON_BASE + 0x10) /* DW0 */ -#define WTBL_ON_RICR1 (WF_WTBL_ON_BASE + 0x14) /* DW1 */ -#define WTBL_ON_RIUCR0 (WF_WTBL_ON_BASE + 0x20) /* DW5 */ -#define WTBL_ON_RIUCR1 (WF_WTBL_ON_BASE + 0x24) /* DW6 */ -#define WTBL_ON_RIUCR2 (WF_WTBL_ON_BASE + 0x28) /* DW7 */ -#define WTBL_ON_RIUCR3 (WF_WTBL_ON_BASE + 0x2C) /* DW8 */ - -#define WTBL_ON_TCGSBR (WF_WTBL_ON_BASE + 0x40) -#define WTBL_ON_ACGSBR (WF_WTBL_ON_BASE + 0x44) -#define WTBL_ON_RVCDARx (WF_WTBL_ON_BASE + 0x80) /* RV bit for wtbl */ - -#define WTBL_BTCRn (WF_WTBL_ON_BASE + 0x100) -#define WTBL_BTBCRn (WF_WTBL_ON_BASE + 0x110) -#define WTBL_BRCRn (WF_WTBL_ON_BASE + 0x120) -#define WTBL_BRBCRn (WF_WTBL_ON_BASE + 0x130) -#define WTBL_BTDCRn (WF_WTBL_ON_BASE + 0x140) -#define WTBL_BRDCRn (WF_WTBL_ON_BASE + 0x150) - -#define WTBL_MBTCRn (WF_WTBL_ON_BASE + 0x200) -#define WTBL_MBTBCRn (WF_WTBL_ON_BASE + 0x240) -#define WTBL_MBRCRn (WF_WTBL_ON_BASE + 0x280) -#define WTBL_MBRBCRn (WF_WTBL_ON_BASE + 0x2C0) - -#define PSM_W_FLAG (1 << 31) -#endif /* __WF_WTBL_ON_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac.h deleted file mode 100644 index 942fcf1039..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_smac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __MT_MAC_H__ -#define __MT_MAC_H__ - -#include "mac/mac_mt/top.h" - -#ifndef COMPOS_WIN -#endif /* COMPOS_WIN */ - -struct _RTMP_ADAPTER; - -typedef struct _TX_RADIO_SET { - BOOLEAN ItxBFEnable; /* IBF */ - BOOLEAN EtxBFEnable; /* EBF */ - BOOLEAN ShortGI; - BOOLEAN Ldpc; - BOOLEAN Stbc; - UINT8 CurrentPerPktBW; /* BW_20, BW_40 for Fixed Rate */ - UINT8 Premable; - UINT8 RateCode; - UINT8 PhyMode; -} TX_RADIO_SET_T; - -typedef struct _TMAC_INFO { - UINT16 PktLen; - UINT8 WifiHdrLen; /*This80211HdrLen, wifi_hdr_len*/ - UINT8 QueIdx; - UINT8 PortIdx; - UINT8 WmmSet; - BOOLEAN UsbNextValid; /*Check with Lens*/ - UINT8 Wcid; - BOOLEAN bAckRequired; - UINT8 UserPriority; - UINT8 OwnMacIdx; - UINT32 CipherAlg; /*Q: bProtectFrame*/ - UINT8 HdrPad; /*W:LengthQosPAD*/ - UINT8 FragIdx; /*W:FragmentByteForTxD*/ - UINT8 BarSsnCtrl; - UINT8 Pid; /*W: PacketID*/ - UINT8 AntPri; - UINT8 SpeEn; - CHAR PowerOffset; - BOOLEAN TimingMeasure; - TX_RADIO_SET_T TxRadioSet; - BOOLEAN LongFmt; - BOOLEAN NeedTrans; - BOOLEAN MoreData; - BOOLEAN Eosp; - BOOLEAN EtherFrame; - BOOLEAN VlanFrame; - BOOLEAN BmcPkt; - BOOLEAN FixRate; - BOOLEAN BaDisable; - BOOLEAN TxS2Host; - BOOLEAN TxS2Mcu; - UINT8 TxSFmt; - UINT8 MaxTxTime; - UINT8 RemainTxCnt; - UINT8 MpduHdrLen; - UINT16 FrmType; - UINT16 SubType; - UINT16 Sn; - UINT8 VhtNss; - UCHAR band_idx; -} TMAC_INFO; - -VOID MtWriteTMacInfo(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TMAC_INFO *TxInfo); - -#include "mac/mac_mt/dmac/mt_dmac.h" - -#endif /* __MT_MAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac_ctrl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac_ctrl.h deleted file mode 100644 index 77c1eb2ad9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac_ctrl.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_mac_ctrl.h -*/ - -#ifndef __MT_MAC_CTRL_H__ -#define __MT_MAC_CTRL_H__ - -/* TODO: shiang-usw,remove this */ -#define HW_BEACON_OFFSET 0x0200 -/* TODO: ---End */ - -/* TODO: shiang-usw, mark by shiang, need to remove it */ -typedef union GNU_PACKED _TXWI_STRUC { - UINT32 word; -} TXWI_STRUC; - -typedef union GNU_PACKED _RXWI_STRUC { - UINT32 word; -} RXWI_STRUC; -/* TODO: --End */ - -struct _RTMP_ADAPTER; - -#define TXS2MCU_AGGNUMS 31 -#define TXS2HOST_AGGNUMS 31 - -enum { - TXS_UNUSED, - TXS_USED, -}; - -typedef struct _TXS_STATUS { - UINT8 TxSPid; - UINT8 State; - UINT8 Type; - UINT8 PktPid; - UINT8 PktType; - UINT8 PktSubType; - UINT16 TxRate; - UINT32 Priv; -} TXS_STATUS, *PTXS_STATYS; - -#define TOTAL_PID_HASH_NUMS 0x10 -#define TOTAL_PID_HASH_NUMS_PER_PKT_TYPE 0x8 -#define TXS_WLAN_IDX_ALL 128 -/*discuss with FW team, Host driver use PID from 0~127, FW use PID from 128 to 255 */ -#define TXS_STATUS_NUM 128 -typedef struct _TXS_CTL { - /* TXS type hash table per pkt */ - DL_LIST TxSTypePerPkt[TOTAL_PID_HASH_NUMS]; - NDIS_SPIN_LOCK TxSTypePerPktLock[TOTAL_PID_HASH_NUMS]; - /* TXS type hash table per pkt type and subtype */ - DL_LIST TxSTypePerPktType[3][TOTAL_PID_HASH_NUMS_PER_PKT_TYPE]; - NDIS_SPIN_LOCK TxSTypePerPktTypeLock[3] - [TOTAL_PID_HASH_NUMS_PER_PKT_TYPE]; - ULONG TxS2McUStatusPerPkt; - ULONG TxS2HostStatusPerPkt; - ULONG TxS2McUStatusPerPktType[3]; - ULONG TxS2HostStatusPerPktType[3]; - ULONG TxSFormatPerPkt; - ULONG TxSFormatPerPktType[3]; - UINT64 TxSStatusPerWlanIdx[2]; - ULONG TxSFailCount; - UINT8 TxSPid; - TXS_STATUS TxSStatus[TXS_STATUS_NUM]; - UINT32 TxSPidBitMap0_31; - UINT32 TxSPidBitMap32_63; - UINT32 TxSPidBitMap64_95; - UINT32 TxSPidBitMap96_127; -} TXS_CTL, *PTXS_CTL; - -#define TXS_TYPE0 0 /* Per Pkt */ -#define TXS_TYPE1 1 /* Per Pkt Type */ -#define TXS_DUMP_REPEAT 0xffffffff -typedef struct _TXS_TYPE { - DL_LIST List; - UINT8 Type; - UINT8 PktPid; - UINT8 PktType; - UINT8 PktSubType; - UINT8 Format; - INT32 (*TxSHandler)(struct _RTMP_ADAPTER *pAd, CHAR *Data, UINT32 Priv); - BOOLEAN DumpTxSReport; - ULONG DumpTxSReportTimes; -} TXS_TYPE, *PTXS_TYPE; - -typedef INT32 (*TXS_HANDLER)(struct _RTMP_ADAPTER *pAd, CHAR *Data, - UINT32 Priv); - -INT32 InitTxSTypeTable(struct _RTMP_ADAPTER *pAd); -INT32 InitTxSCommonCallBack(struct _RTMP_ADAPTER *pAd); -INT32 ExitTxSTypeTable(struct _RTMP_ADAPTER *pAd); -INT32 AddTxSTypePerPkt(struct _RTMP_ADAPTER *pAd, UINT32 Pid, UINT8 Format, - TXS_HANDLER TxSHandler); -INT32 RemoveTxSTypePerPkt(struct _RTMP_ADAPTER *pAd, UINT32 Pid, UINT8 Format); -INT32 TxSTypeCtlPerPkt(struct _RTMP_ADAPTER *pAd, UINT32 Pid, UINT8 Format, - BOOLEAN TxS2Mcu, BOOLEAN TxS2Host, BOOLEAN DumpTxSReport, - ULONG DumpTxSReportTimes); -INT32 ParseTxSPacket_v1(struct _RTMP_ADAPTER *pAd, UINT32 Pid, UINT8 Format, - CHAR *Data); -INT32 ParseTxSPacket_v2(struct _RTMP_ADAPTER *pAd, UINT32 Pid, UINT8 Format, - CHAR *Data); -INT32 BcnTxSHandler(struct _RTMP_ADAPTER *pAd, CHAR *Data, UINT32 Priv); - -#ifdef STA_LP_PHASE_1_SUPPORT -INT32 NullFramePM1TxSHandler(struct _RTMP_ADAPTER *pAd, CHAR *Data, - UINT32 Priv); -INT32 NullFramePM0TxSHandler(struct _RTMP_ADAPTER *pAd, CHAR *Data, - UINT32 Priv); -#endif /* STA_LP_PHASE_1_SUPPORT */ - -INT32 AddTxSTypePerPktType(struct _RTMP_ADAPTER *pAd, UINT8 Type, UINT8 Subtype, - UINT8 Format, TXS_HANDLER TxSHandler); -INT32 RemoveTxSTypePerPktType(struct _RTMP_ADAPTER *pAd, UINT8 Type, - UINT8 Subtype, UINT8 Format); -INT32 TxSTypeCtlPerPktType(struct _RTMP_ADAPTER *pAd, UINT8 Type, UINT8 Subtype, - UINT16 WlanIdx, UINT8 Format, BOOLEAN TxS2Mcu, - BOOLEAN TxS2Host, BOOLEAN DumpTxSReport, - ULONG DumpTxSReportTimes); -UINT8 AddTxSStatus(struct _RTMP_ADAPTER *pAd, UINT8 Type, UINT8 PktPid, - UINT8 PktType, UINT8 PktSubType, UINT16 TxRate, UINT32 Priv); -INT32 RemoveTxSStatus(struct _RTMP_ADAPTER *pAd, UINT8 TxSPid, UINT8 *Type, - UINT8 *PktPid, UINT8 *PktType, UINT8 *PktSubType, - UINT16 *TxRate, UINT32 *Priv); - -#ifdef CFG_TDLS_SUPPORT -INT32 TdlsTxSHandler(struct _RTMP_ADAPTER *pAd, CHAR *Data, UINT32 Priv); -#endif /* CFG_TDLS_SUPPORT */ -INT32 ActionTxSHandler(struct _RTMP_ADAPTER *pAd, CHAR *Data, UINT32 Priv); - -typedef struct _TMR_CTRL_STRUCT { - UCHAR HwTmrVersion; - UCHAR TmrEnable; /* disable, initiator, responder */ - UCHAR TmrState; /* used to control CR enable/disable@initiator role. */ - UINT32 TmrCalResult; -} TMR_CTRL_STRUCT, *PTMR_CTRL_STRUCT; - -#endif /* __MT_MAC_CTRL_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac_pci.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac_pci.h deleted file mode 100644 index c1ce317605..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/mt_mac_pci.h +++ /dev/null @@ -1,103 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - mt_mac_pci.h - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __MAC_PCI_H__ -#define __MAC_PCI_H__ - -#include "rtmp_type.h" -#include "phy/phy.h" -#include "rtmp_iface.h" -#include "rtmp_dot11.h" - -/* ----------------- Interface Related MACRO ----------------- */ - -typedef enum _RTMP_TX_DONE_MASK { - TX_AC0_DONE = 0, - TX_AC1_DONE = 1, - TX_AC2_DONE = 2, - TX_AC3_DONE = 3, - TX_HCCA_DONE = 4, - TX_MGMT_DONE = 5, - TX_BMC_DONE = 6, -} RTMP_TX_DONE_MASK; - -/* - Enable & Disable NIC interrupt via writing interrupt mask register - Since it use ADAPTER structure, it have to be put after structure definition. -*/ -#define RTMP_ASIC_INTERRUPT_DISABLE(_pAd) \ - do { \ - HIF_IO_WRITE32((_pAd), MT_INT_MASK_CSR, 0); /*0: disable*/ \ - RTMP_CLEAR_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \ - } while (0) - -#define RTMP_ASIC_INTERRUPT_ENABLE(_pAd) \ - do { \ - HIF_IO_WRITE32((_pAd), MT_INT_MASK_CSR, \ - (_pAd)->PciHif.IntEnableReg); /* 1:enable */ \ - RTMP_SET_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \ - } while (0) - -#define RTMP_IRQ_ENABLE(_pAd) \ - do { \ - unsigned long _irqFlags; \ - RTMP_INT_LOCK(&(_pAd)->irq_lock, _irqFlags); \ - /* clear garbage ints */ \ - HIF_IO_WRITE32((_pAd), MT_INT_SOURCE_CSR, 0xffffffff); \ - RTMP_ASIC_INTERRUPT_ENABLE(_pAd); \ - RTMP_INT_UNLOCK(&(_pAd)->irq_lock, _irqFlags); \ - } while (0) - -/* For RTMPPCIePowerLinkCtrlRestore () function */ -#define RESTORE_HALT 1 -#define RESTORE_WAKEUP 2 -#define RESTORE_CLOSE 3 - -#define PowerSafeCID 1 -#define PowerRadioOffCID 2 -#define PowerWakeCID 3 -#define CID0MASK 0x000000ff -#define CID1MASK 0x0000ff00 -#define CID2MASK 0x00ff0000 -#define CID3MASK 0xff000000 - -struct _RTMP_ADAPTER; -enum _RTMP_TX_DONE_MASK; - -BOOLEAN mtd_free_txd(struct _RTMP_ADAPTER *pAd, UINT8 resource_idx); -BOOLEAN mtd_tx_dma_done_handle(struct _RTMP_ADAPTER *pAd, UINT8 hif_idx); -BOOLEAN mt_cmd_dma_done_handle(struct _RTMP_ADAPTER *pAd, UINT8 hif_idx); -BOOLEAN mt_fwdl_dma_done_handle(struct _RTMP_ADAPTER *pAd, UINT8 hif_idx); -VOID RTMPHandleMgmtRingDmaDoneInterrupt(struct _RTMP_ADAPTER *pAd); -VOID RTMPHandleTBTTInterrupt(struct _RTMP_ADAPTER *pAd); -VOID RTMPHandlePreTBTTInterrupt(struct _RTMP_ADAPTER *pAd); -VOID RTMPHandleRxCoherentInterrupt(struct _RTMP_ADAPTER *pAd); - -VOID RTMPHandleMcuInterrupt(struct _RTMP_ADAPTER *pAd); -void RTMPHandleTwakeupInterrupt(struct _RTMP_ADAPTER *pAd); - -VOID mt_asic_init_txrx_ring(struct _RTMP_ADAPTER *pAd); - -#endif /*__MAC_PCI_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/client.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/client.h deleted file mode 100644 index e7f5a7f64f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/client.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - client.h -*/ - -#ifndef __CLIENT_H__ -#define __CLIENT_H__ - -#define CLIENT_BASE 0x800C0000 -#define RXINF (CLIENT_BASE + 0x0068) -#define RXSH_GROUP1_EN (1 << 0) -#define RXSH_GROUP2_EN (1 << 1) -#define RXSH_GROUP3_EN (1 << 2) - -#define RST (CLIENT_BASE + 0x0070) -#define TX_R_E_1 (1 << 16) -#define TX_R_E_2 (1 << 17) -#define TX_R_E_1_S (1 << 20) -#define TX_R_E_2_S (1 << 21) - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/dma_sch.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/dma_sch.h deleted file mode 100644 index 6ec4320ad3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/dma_sch.h +++ /dev/null @@ -1,447 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - dma_sch.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __DMA_SCH_H__ -#define __DMA_SCH_H__ - -#define DMA_SCH_BASE 0x4000 /* equal to HIF_BASE */ - -#define MT_TXTIME_THD_0 (DMA_SCH_BASE + 0x500) -#define MT_TXTIME_THD_1 (DMA_SCH_BASE + 0x504) -#define MT_TXTIME_THD_2 (DMA_SCH_BASE + 0x508) -#define MT_TXTIME_THD_3 (DMA_SCH_BASE + 0x50c) -#define MT_TXTIME_THD_4 (DMA_SCH_BASE + 0x510) -#define MT_TXTIME_THD_5 (DMA_SCH_BASE + 0x514) -#define MT_TXTIME_THD_6 (DMA_SCH_BASE + 0x518) -#define MT_TXTIME_THD_7 (DMA_SCH_BASE + 0x51c) -#define MT_TXTIME_THD_8 (DMA_SCH_BASE + 0x520) -#define MT_TXTIME_THD_9 (DMA_SCH_BASE + 0x524) -#define MT_TXTIME_THD_10 (DMA_SCH_BASE + 0x528) -#define MT_TXTIME_THD_11 (DMA_SCH_BASE + 0x52c) -#define MT_TXTIME_THD_12 (DMA_SCH_BASE + 0x530) -#define MT_TXTIME_THD_13 (DMA_SCH_BASE + 0x534) -#define MT_TXTIME_THD_14 (DMA_SCH_BASE + 0x538) -#define MT_TXTIME_THD_15 (DMA_SCH_BASE + 0x53c) - -#define MT_PAGE_CNT_0 (DMA_SCH_BASE + 0x540) -#define PAGE_CNT_0_MASK (0xfffff) -#define GET_PAGE_CNT_0(p) (((p)&PAGE_CNT_0_MASK)) -#define MT_PAGE_CNT_1 (DMA_SCH_BASE + 0x544) -#define PAGE_CNT_1_MASK (0xfffff) -#define GET_PAGE_CNT_1(p) (((p)&PAGE_CNT_1_MASK)) -#define MT_PAGE_CNT_2 (DMA_SCH_BASE + 0x548) -#define PAGE_CNT_2_MASK (0xfffff) -#define GET_PAGE_CNT_2(p) (((p)&PAGE_CNT_2_MASK)) -#define MT_PAGE_CNT_3 (DMA_SCH_BASE + 0x54c) -#define PAGE_CNT_3_MASK (0xfffff) -#define GET_PAGE_CNT_3(p) (((p)&PAGE_CNT_3_MASK)) -#define MT_PAGE_CNT_4 (DMA_SCH_BASE + 0x550) -#define PAGE_CNT_4_MASK (0xfffff) -#define GET_PAGE_CNT_4(p) (((p)&PAGE_CNT_4_MASK)) -#define MT_PAGE_CNT_5 (DMA_SCH_BASE + 0x554) -#define PAGE_CNT_5_MASK (0xfffff) -#define GET_PAGE_CNT_5(p) (((p)&PAGE_CNT_5_MASK)) -#define MT_PAGE_CNT_6 (DMA_SCH_BASE + 0x558) -#define PAGE_CNT_6_MASK (0xfffff) -#define GET_PAGE_CNT_6(p) (((p)&PAGE_CNT_6_MASK)) -#define MT_PAGE_CNT_7 (DMA_SCH_BASE + 0x55c) -#define PAGE_CNT_7_MASK (0xfffff) -#define GET_PAGE_CNT_7(p) (((p)&PAGE_CNT_7_MASK)) -#define MT_PAGE_CNT_8 (DMA_SCH_BASE + 0x560) -#define PAGE_CNT_8_MASK (0xfffff) -#define GET_PAGE_CNT_8(p) (((p)&PAGE_CNT_8_MASK)) -#define MT_PAGE_CNT_9 (DMA_SCH_BASE + 0x564) -#define PAGE_CNT_9_MASK (0xfffff) -#define GET_PAGE_CNT_9(p) (((p)&PAGE_CNT_9_MASK)) -#define MT_PAGE_CNT_10 (DMA_SCH_BASE + 0x568) -#define PAGE_CNT_10_MASK (0xfffff) -#define GET_PAGE_CNT_10(p) (((p)&PAGE_CNT_10_MASK)) -#define MT_PAGE_CNT_11 (DMA_SCH_BASE + 0x56c) -#define PAGE_CNT_11_MASK (0xfffff) -#define GET_PAGE_CNT_11(p) (((p)&PAGE_CNT_11_MASK)) -#define MT_PAGE_CNT_12 (DMA_SCH_BASE + 0x570) -#define PAGE_CNT_12_MASK (0xfffff) -#define GET_PAGE_CNT_12(p) (((p)&PAGE_CNT_12_MASK)) -#define MT_PAGE_CNT_13 (DMA_SCH_BASE + 0x574) -#define PAGE_CNT_13_MASK (0xfffff) -#define GET_PAGE_CNT_13(p) (((p)&PAGE_CNT_13_MASK)) -#define MT_PAGE_CNT_14 (DMA_SCH_BASE + 0x578) -#define PAGE_CNT_14_MASK (0xfffff) -#define GET_PAGE_CNT_14(p) (((p)&PAGE_CNT_14_MASK)) -#define MT_PAGE_CNT_15 (DMA_SCH_BASE + 0x57c) -#define PAGE_CNT_15_MASK (0xfffff) -#define GET_PAGE_CNT_15(p) (((p)&PAGE_CNT_15_MASK)) - -#define MT_QUEUE_PRIORITY_1 (DMA_SCH_BASE + 0x580) -#define RG_QUEUE_PRIORITY_0_MASK (0xf) -#define RG_QUEUE_PRIORITY_0(p) (((p)&0xf)) -#define GET_RG_QUEUE_PRIORITY_0(p) (((p)&RG_QUEUE_PRIORITY_0_MASK)) -#define RG_QUEUE_PRIORITY_1_MASK (0xf << 4) -#define RG_QUEUE_PRIORITY_1(p) (((p)&0xf) << 4) -#define GET_RG_QUEUE_PRIORITY_1(p) (((p)&RG_QUEUE_PRIORITY_1_MASK) >> 4) -#define RG_QUEUE_PRIORITY_2_MASK (0xf << 8) -#define RG_QUEUE_PRIORITY_2(p) (((p)&0xf) << 8) -#define GET_RG_QUEUE_PRIORITY_2(p) (((p)&RG_QUEUE_PRIORITY_2_MASK) >> 8) -#define RG_QUEUE_PRIORITY_3_MASK (0xf << 12) -#define RG_QUEUE_PRIORITY_3(p) (((p)&0xf) << 12) -#define GET_RG_QUEUE_PRIORITY_3(p) (((p)&RG_QUEUE_PRIORITY_3_MASK) >> 12) -#define RG_QUEUE_PRIORITY_4_MASK (0xf << 16) -#define RG_QUEUE_PRIORITY_4(p) (((p)&0xf) << 16) -#define GET_RG_QUEUE_PRIORITY_4(p) (((p)&RG_QUEUE_PRIORITY_4_MASK) >> 16) -#define RG_QUEUE_PRIORITY_5_MASK (0xf << 20) -#define RG_QUEUE_PRIORITY_5(p) (((p)&0xf) << 20) -#define GET_RG_QUEUE_PRIORITY_5(p) (((p)&RG_QUEUE_PRIORITY_5_MASK) >> 20) -#define RG_QUEUE_PRIORITY_6_MASK (0xf << 24) -#define RG_QUEUE_PRIORITY_6(p) (((p)&0xf) << 24) -#define GET_RG_QUEUE_PRIORITY_6(p) (((p)&RG_QUEUE_PRIORITY_6_MASK) >> 24) -#define RG_QUEUE_PRIORITY_7_MASK (0xf << 28) -#define RG_QUEUE_PRIORITY_7(p) (((p)&0xf) << 28) -#define GET_RG_QUEUE_PRIORITY_7(p) (((p)&RG_QUEUE_PRIORITY_7_MASK) >> 28) - -#define MT_QUEUE_PRIORITY_2 (DMA_SCH_BASE + 0x584) -#define RG_QUEUE_PRIORITY_8_MASK (0xf) -#define RG_QUEUE_PRIORITY_8(p) (((p)&0xf)) -#define GET_RG_QUEUE_PRIORITY_8(p) (((p)&RG_QUEUE_PRIORITY_8_MASK)) -#define RG_QUEUE_PRIORITY_9_MASK (0xf << 4) -#define RG_QUEUE_PRIORITY_9(p) (((p)&0xf) << 4) -#define GET_RG_QUEUE_PRIORITY_9(p) (((p)&RG_QUEUE_PRIORITY_9_MASK) >> 4) -#define RG_QUEUE_PRIORITY_10_MASK (0xf << 8) -#define RG_QUEUE_PRIORITY_10(p) (((p)&0xf) << 8) -#define GET_RG_QUEUE_PRIORITY_10(p) (((p)&RG_QUEUE_PRIORITY_10_MASK) >> 8) -#define RG_QUEUE_PRIORITY_11_MASK (0xf << 12) -#define RG_QUEUE_PRIORITY_11(p) (((p)&0xf) << 12) -#define GET_RG_QUEUE_PRIORITY_11(p) (((p)&RG_QUEUE_PRIORITY_11_MASK) >> 12) -#define RG_QUEUE_PRIORITY_12_MASK (0xf << 16) -#define RG_QUEUE_PRIORITY_12(p) (((p)&0xf) << 16) -#define GET_RG_QUEUE_PRIORITY_12(p) (((p)&RG_QUEUE_PRIORITY_12_MASK) >> 16) -#define RG_QUEUE_PRIORITY_13_MASK (0xf << 20) -#define RG_QUEUE_PRIORITY_13(p) (((p)&0xf) << 20) -#define GET_RG_QUEUE_PRIORITY_13(p) (((p)&RG_QUEUE_PRIORITY_13_MASK) >> 20) -#define RG_QUEUE_PRIORITY_14_MASK (0xf << 24) -#define RG_QUEUE_PRIORITY_14(p) (((p)&0xf) << 24) -#define GET_RG_QUEUE_PRIORITY_14(p) (((p)&RG_QUEUE_PRIORITY_14_MASK) >> 24) -#define RG_QUEUE_PRIORITY_15_MASK (0xf << 28) -#define RG_QUEUE_PRIORITY_15(p) (((p)&0xf) << 28) -#define GET_RG_QUEUE_PRIORITY_15(p) (((p)&RG_QUEUE_PRIORITY_15_MASK) >> 28) - -#define MT_SCH_REG_1 (DMA_SCH_BASE + 0x588) -#define RG_FFA_THD_MASK (0xfffff) -#define RG_FFA_THD(p) (((p)&0xfffff)) -#define GET_RG_FFA_THD(p) (((p)&RG_FFA_THD_MASK)) -#define RG_PAGE_SIZE_MASK (0xf << 28) -#define RG_PAGE_SIZE(p) (((p)&0xf) << 28) -#define GET_RG_PAGE_SIZE(p) (((p)&RG_PAGE_SIZE_MASK) >> 28) - -#define MT_SCH_REG_2 (DMA_SCH_BASE + 0x58c) -#define RG_MAX_PKT_SIZE_MASK (0xfffff) -#define RG_MAX_PKT_SIZE(p) (((p)&0xfffff)) -#define GET_RG_MAX_PKT_SIZE(p) (((p)&RG_MAX_PKT_SIZE_MASK)) - -/* TODO: shiang-usw, these two CR definition is the same for "SCH_REG4" and "MT_SCH_REG_4", need to revise */ -#define SCH_REG4 (DMA_SCH_BASE + 0x0594) -#define SCH_REG4_FORCE_QID_MASK (0x0f) -#define SCH_REG4_FORCE_QID(p) (((p)&0x0f)) -#define SCH_REG4_BYPASS_MODE_MASK (0x1 << 5) -#define SCH_REG4_BYPASS_MODE(p) (((p)&0x1) << 5) - -#define MT_SCH_REG_3 (DMA_SCH_BASE + 0x590) -#define MT_SCH_REG_4 (DMA_SCH_BASE + 0x594) - -#define MT_SCH_REG_4 (DMA_SCH_BASE + 0x594) -#define FORCE_QID_MASK (0Xf) -#define FORCE_QID(p) (((p)&0xf)) -#define GET_FORCE_QID(p) (((p)&FORCE_QID_MASK)) -#define FORCE_MODE (1 << 4) -#define GET_FORCE_MODE(p) (((p)&FORCE_MODE) >> 4) -#define BYPASS_MODE (1 << 5) -#define GET_BYPASS_MODE(p) (((p)&BYPASS_MODE) >> 5) -#define HYBIRD_MODE (1 << 6) -#define GET_HYBIRD_MODE(p) (((p)&HYBIRD_MODE) >> 6) -#define RG_PREDICT_NO_MASK (1 << 7) -#define GET_RG_PREDICT_NO_MASK(p) (((p)&RG_PREDICT_NO_MASK) >> 7) -#define SW_MODE (1 << 10) -#define GET_SW_MODE(p) (((p)&SW_MODE) >> 10) -#define RG_RATE_MAP_MASK (0x3fff << 16) -#define RG_RATE_MAP(p) (((p)&0x3fff) << 16) -#define GET_RG_RATE_MAP(p) (((p)&RG_RATE_MAP_MASK) >> 16) - -#define MT_GROUP_THD_0 (DMA_SCH_BASE + 0x598) -#define GROUP_THD_0_MASK (0xfffff) -#define GROUP_THD_0(p) (((p)&0xfffff)) -#define GET_GROUP_THD_0(p) (((p)&GROUP_THD_0_MASK)) - -#define MT_GROUP_THD_1 (DMA_SCH_BASE + 0x59c) - -#define GROUP_THD_1_MASK (0xfffff) -#define GROUP_THD_1(p) (((p)&0xfffff)) -#define GET_GROUP_THD_1(p) (((p)&GROUP_THD_1_MASK)) - -#define MT_GROUP_THD_2 (DMA_SCH_BASE + 0x5a0) -#define GROUP_THD_2_MASK (0xfffff) -#define GROUP_THD_2(p) (((p)&0xfffff)) -#define GET_GROUP_THD_2(p) (((p)&GROUP_THD_2_MASK)) - -#define MT_GROUP_THD_3 (DMA_SCH_BASE + 0x5a4) -#define GROUP_THD_3_MASK (0xfffff) -#define GROUP_THD_3(p) (((p)&0xfffff)) -#define GET_GROUP_THD_3(p) (((p)&GROUP_THD_3_MASK)) - -#define MT_GROUP_THD_4 (DMA_SCH_BASE + 0x5a8) -#define GROUP_THD_4_MASK (0xfffff) -#define GROUP_THD_4(p) (((p)&0xfffff)) -#define GET_GROUP_THD_4(p) (((p)&GROUP_THD_4_MASK)) - -#define MT_GROUP_THD_5 (DMA_SCH_BASE + 0x5ac) -#define GROUP_THD_5_MASK (0xfffff) -#define GROUP_THD_5(p) (((p)&0xfffff)) -#define GET_GROUP_THD_5(p) (((p)&GROUP_THD_5_MASK)) - -#define MT_BMAP_0 (DMA_SCH_BASE + 0x5b0) -#define RG_BMAP_0_MASK (0xffff) -#define RG_BMAP_0(p) (((p)&0xffff)) -#define GET_RG_BMAP_0(p) (((p)&RG_BMAP_0_MASK)) -#define RG_BMAP_1_MASK (0xffff << 16) -#define RG_BMAP_1(p) (((p)&0xffff) << 16) -#define GET_RG_BMAP_1(p) (((p)&RG_BMAP_1_MASK) >> 16) - -#define MT_BMAP_1 (DMA_SCH_BASE + 0x5b4) -#define RG_BMAP_2_MASK (0xffff) -#define RG_BMAP_2(p) (((p)&0xffff)) -#define GET_RG_BMAP_2(p) (((p)&RG_BMAP_2_MASK)) -#define RG_BMAP_3_MASK (0xffff << 16) -#define RG_BMAP_3(p) (((p)&0xffff) << 16) -#define GET_RG_BMAP_3(p) (((p)&RG_BMAP_3_MASK) >> 16) - -#define MT_BMAP_2 (DMA_SCH_BASE + 0x5b8) -#define RG_BMAP_4_MASK (0xffff) -#define RG_BMAP_4(p) (((p)&0xffff)) -#define GET_RG_BMAP_4(p) (((p)&RG_BMAP_4_MASK)) -#define RG_BMAP_5_MASK (0xffff << 16) -#define RG_BMAP_5(p) (((p)&0xffff) << 16) -#define GET_RG_BMAP_5(p) (((p)&RG_BMAP_5_MASK) >> 16) - -#define MT_HIGH_PRIORITY_1 (DMA_SCH_BASE + 0x5bc) -#define RG_HIGH_PRIORITY_0_MASK (0xf) -#define RG_HIGH_PRIORITY_0(p) (((p)&0xf)) -#define GET_RG_HIGH_PRIORITY_0(p) (((p)&RG_HIGH_PRIORITY_0_MASK)) -#define RG_HIGH_PRIORITY_1_MASK (0xf << 4) -#define RG_HIGH_PRIORITY_1(p) (((p)&0xf) << 4) -#define GET_RG_HIGH_PRIORITY_1(p) (((p)&RG_HIGH_PRIORITY_1_MASK) >> 4) -#define RG_HIGH_PRIORITY_2_MASK (0xf << 8) -#define RG_HIGH_PRIORITY_2(p) (((p)&0xf) << 8) -#define GET_RG_HIGH_PRIORITY_2(p) (((p)&RG_HIGH_PRIORITY_2_MASK) >> 8) -#define RG_HIGH_PRIORITY_3_MASK (0xf << 12) -#define RG_HIGH_PRIORITY_3(p) (((p)&0xf) << 12) -#define GET_RG_HIGH_PRIORITY_3(p) (((p)&RG_HIGH_PRIORITY_3_MASK) >> 12) -#define RG_HIGH_PRIORITY_4_MASK (0xf << 16) -#define RG_HIGH_PRIORITY_4(p) (((p)&0xf) << 16) -#define GET_RG_HIGH_PRIORITY_4(p) (((p)&RG_HIGH_PRIORITY_4_MASK) >> 16) -#define RG_HIGH_PRIORITY_5_MASK (0xf << 20) -#define RG_HIGH_PRIORITY_5(p) (((p)&0xf) << 20) -#define GET_RG_HIGH_PRIORITY_5(p) (((p)&RG_HIGH_PRIORITY_5_MASK) >> 20) -#define RG_HIGH_PRIORITY_6_MASK (0xf << 24) -#define RG_HIGH_PRIORITY_6(p) (((p)&0xf) << 24) -#define GET_RG_HIGH_PRIORITY_6(p) (((p)&RG_HIGH_PRIORITY_6_MASK) >> 24) -#define RG_HIGH_PRIORITY_7_MASK (0xf << 28) -#define RG_HIGH_PRIORITY_7(p) (((p)&0xf) << 28) -#define GET_RG_HIGH_PRIORITY_7(p) (((p)&RG_HIGH_PRIORITY_7_MASK) >> 28) - -#define MT_HIGH_PRIORITY_2 (DMA_SCH_BASE + 0x5c0) -#define RG_HIGH_PRIORITY_8_MASK (0xf) -#define RG_HIGH_PRIORITY_8(p) (((p)&0xf)) -#define GET_RG_HIGH_PRIORITY_8(p) (((p)&RG_HIGH_PRIORITY_8_MASK)) -#define RG_HIGH_PRIORITY_9_MASK (0xf << 4) -#define RG_HIGH_PRIORITY_9(p) (((p)&0xf) << 4) -#define GET_RG_HIGH_PRIORITY_9(p) (((p)&RG_HIGH_PRIORITY_9_MASK) >> 4) -#define RG_HIGH_PRIORITY_10_MASK (0xf << 8) -#define RG_HIGH_PRIORITY_10(p) (((p)&0xf) << 8) -#define GET_RG_HIGH_PRIORITY_10(p) (((p)&RG_HIGH_PRIORITY_10_MASK) >> 8) -#define RG_HIGH_PRIORITY_11_MASK (0xf << 12) -#define RG_HIGH_PRIORITY_11(p) (((p)&0xf) << 12) -#define GET_RG_HIGH_PRIORITY_11(p) (((p)&RG_HIGH_PRIORITY_11_MASK) >> 12) -#define RG_HIGH_PRIORITY_12_MASK (0xf << 16) -#define RG_HIGH_PRIORITY_12(p) (((p)&0xf) << 16) -#define GET_RG_HIGH_PRIORITY_12(p) (((p)&RG_HIGH_PRIORITY_12_MASK) >> 16) -#define RG_HIGH_PRIORITY_13_MASK (0xf << 20) -#define RG_HIGH_PRIORITY_13(p) (((p)&0xf) << 20) -#define GET_RG_HIGH_PRIORITY_13(p) (((p)&RG_HIGH_PRIORITY_13_MASK) >> 20) -#define RG_HIGH_PRIORITY_14_MASK (0xf << 24) -#define RG_HIGH_PRIORITY_14(p) (((p)&0xf) << 24) -#define GET_RG_HIGH_PRIORITY_14(p) (((p)&RG_HIGH_PRIORITY_14_MASK) >> 24) -#define RG_HIGH_PRIORITY_15_MASK (0xf << 28) -#define RG_HIGH_PRIORITY_15(p) (((p)&0xf) << 28) -#define GET_RG_HIGH_PRIORITY_15(p) (((p)&RG_HIGH_PRIORITY_15_MASK) >> 28) - -#define MT_PRIORITY_MASK (DMA_SCH_BASE + 0x5c4) -#define RG_QUEUE_PRIORITY_MASK (0xffff) -#define RG_QUEUE_PRIORITY(p) (((p)&0xffff)) -#define GET_RG_QUEUE_PRIORITY(p) (((p)&RG_QUEUE_PRIORITY_MASK)) -#define RG_HIGH_PRIORITY_MASK (0xffff << 16) -#define RG_HIGH_PRIORITY(p) (((p)&0xffff) << 16) -#define GET_RG_HIGH_PRIORITY(p) (((p)&RG_HIGH_PRIORITY_MASK) >> 16) - -#define MT_RSV_MAX_THD (DMA_SCH_BASE + 0x5c8) -#define RG_RSV_MAX_THD_MASK (0xfffff) -#define RG_RSV_MAX_THD(p) (((p)&0xfffff)) -#define GET_RG_RSV_MAX_THD(p) (((p)&RG_RSV_MAX_THD_MASK)) - -#define RSV_AC_CNT_0 (DMA_SCH_BASE + 0x5d0) -#define RSV_AC_CNT_0_MASK (0xfffff) -#define GET_RSV_AC_CNT_0(p) (((p)&RSV_AC_CNT_0_MASK)) - -#define RSV_AC_CNT_1 (DMA_SCH_BASE + 0x5d4) -#define RSV_AC_CNT_1_MASK (0xfffff) -#define GET_RSV_AC_CNT_1(p) (((p)&RSV_AC_CNT_1_MASK)) - -#define RSV_AC_CNT_2 (DMA_SCH_BASE + 0x5d8) -#define RSV_AC_CNT_2_MASK (0xfffff) -#define GET_RSV_AC_CNT_2(p) (((p)&RSV_AC_CNT_2_MASK)) - -#define RSV_AC_CNT_3 (DMA_SCH_BASE + 0x5dc) -#define RSV_AC_CNT_3_MASK (0xfffff) -#define GET_RSV_AC_CNT_3(p) (((p)&RSV_AC_CNT_3_MASK)) - -#define RSV_AC_CNT_4 (DMA_SCH_BASE + 0x5e0) -#define RSV_AC_CNT_4_MASK (0xfffff) -#define GET_RSV_AC_CNT_4(p) (((p)&RSV_AC_CNT_4_MASK)) - -#define RSV_AC_CNT_5 (DMA_SCH_BASE + 0x5e4) -#define RSV_AC_CNT_5_MASK (0xfffff) -#define GET_RSV_AC_CNT_5(p) (((p)&RSV_AC_CNT_5_MASK)) - -#define RSV_AC_CNT_6 (DMA_SCH_BASE + 0x5e8) -#define RSV_AC_CNT_6_MASK (0xfffff) -#define GET_RSV_AC_CNT_6(p) (((p)&RSV_AC_CNT_6_MASK)) - -#define RSV_AC_CNT_7 (DMA_SCH_BASE + 0x5ec) -#define RSV_AC_CNT_7_MASK (0xfffff) -#define GET_RSV_AC_CNT_7(p) (((p)&RSV_AC_CNT_7_MASK)) - -#define RSV_AC_CNT_8 (DMA_SCH_BASE + 0x5f0) -#define RSV_AC_CNT_8_MASK (0xfffff) -#define GET_RSV_AC_CNT_8(p) (((p)&RSV_AC_CNT_8_MASK)) - -#define RSV_AC_CNT_9 (DMA_SCH_BASE + 0x5f4) -#define RSV_AC_CNT_9_MASK (0xfffff) -#define GET_RSV_AC_CNT_9(p) (((p)&RSV_AC_CNT_9_MASK)) - -#define RSV_AC_CNT_10 (DMA_SCH_BASE + 0x5f8) -#define RSV_AC_CNT_10_MASK (0xfffff) -#define GET_RSV_AC_CNT_10(p) (((p)&RSV_AC_CNT_10_MASK)) - -#define RSV_AC_CNT_11 (DMA_SCH_BASE + 0x5fc) -#define RSV_AC_CNT_11_MASK (0xfffff) -#define GET_RSV_AC_CNT_11(p) (((p)&RSV_AC_CNT_11_MASK)) - -#define RSV_AC_CNT_12 (DMA_SCH_BASE + 0x600) -#define RSV_AC_CNT_12_MASK (0xfffff) -#define GET_RSV_AC_CNT_12(p) (((p)&RSV_AC_CNT_12_MASK)) - -#define RSV_AC_CNT_13 (DMA_SCH_BASE + 0x604) -#define RSV_AC_CNT_13_MASK (0xfffff) -#define GET_RSV_AC_CNT_13(p) (((p)&RSV_AC_CNT_13_MASK)) - -#define RSV_AC_CNT_14 (DMA_SCH_BASE + 0x608) -#define RSV_AC_CNT_14_MASK (0xfffff) -#define GET_RSV_AC_CNT_14(p) (((p)&RSV_AC_CNT_14_MASK)) - -#define RSV_AC_CNT_15 (DMA_SCH_BASE + 0x60c) -#define RSV_AC_CNT_15_MASK (0xfffff) -#define GET_RSV_AC_CNT_15(p) (((p)&RSV_AC_CNT_15_MASK)) - -#define SCH_DBG0_0 (DMA_SCH_BASE + 0x650) -#define RSV_ENOUGH_MASK (0xffff) -#define GET_RSV_ENOUGH(p) (((p)&0xffff)) -#define GROUP_ENOUGH (1 << 20) -#define GET_GROUP_ENOUGH(p) (((p)&GROUP_ENOUGH) >> 20) -#define QUEUE_ENOUGH (1 << 21) -#define GET_QUEUE_ENOUGH(p) (((p)&QUEUE_ENOUGH) >> 21) -#define PREDICT_MODE (1 << 22) -#define GET_PREDICT_MODE(p) (((p)&PREDICT_MODE) >> 22) -#define REST_QUEUE_EN (1 << 28) -#define GET_REST_QUEUE_EN(p) (((p)&REST_QUEUE_EN) >> 28) -#define ENOUGH_TXTIME (1 << 30) -#define GET_ENOUGH_TXTIME(p) (((p)&ENOUGH_TXTIME) >> 30) -#define ENOUGH_BUF (1 << 31) -#define GET_ENOUGH_BUF(p) (((p)&ENOUGH_BUF) >> 31) - -#define SCH_DBG_1 (DMA_SCH_BASE + 0x654) -#define FFA_PAGE_CNT_MASK (0xfffff) -#define GET_FFA_PAGE_CNT(p) (((p)&FFA_PAGE_CNT_MASK)) - -#define SCH_DBG_2 (DMA_SCH_BASE + 0x658) -#define PKT_TX_TIME_MASK (0xffffffff) -#define GET_PKT_TX_TIME(p) (((p)&PKT_TX_TIME_MASK)) - -#define SCH_DBG_3 (DMA_SCH_BASE + 0x65c) -#define TX_TIME_PER_BYTE_MASK (0x1fff) -#define GET_TX_TIME_PER_BYTE(p) (((p)&TX_TIME_PER_BYTE_MASK)) - -#define SCH_DBG_4 (DMA_SCH_BASE + 0x660) -#define PSE_RSV_SPACE_MASK (0xfff) -#define GET_PSE_RSV_SPACE(p) (((p)&PSE_RSV_SPACE_MASK)) -#define HIF_RSV_PCNT_MASK (0xfff << 16) -#define GET_HIF_RSV_PCNT(p) (((p)&HIF_RSV_PCNT_MASK) >> 16) -#define HIF_RSV_PCNT_UPDT_MASK (1 << 31) -#define GET_HIF_RSV_PCNT_UPDT(p) (((p)&HIF_RSV_PCNT_UPDT_MASK) >> 31) - -#define SCH_DBG_5 (DMA_SCH_BASE + 0x664) -#define GROUP_EN_MASK (0xffff) -#define GET_GROUP_EN(p) (((p)&GROUP_EN_MASK)) - -#define SCH_DBG_6 (DMA_SCH_BASE + 0x668) -#define USED_GROUP_0_MASK (0xfffff) -#define GET_USED_GROUP_0(p) (((p)&USED_GROUP_0_MASK)) - -#define SCH_DBG_7 (DMA_SCH_BASE + 0x66c) -#define USED_GROUP_1_MASK (0xfffff) -#define GET_USED_GROUP_1(p) (((p)&USED_GROUP_1_MASK)) - -#define SCH_DBG_8 (DMA_SCH_BASE + 0x670) -#define USED_GROUP_2_MASK (0xfffff) -#define GET_USED_GROUP_2(p) (((p)&USED_GROUP_2_MASK)) - -#define SCH_DBG_9 (DMA_SCH_BASE + 0x674) -#define USED_GROUP_3_MASK (0xfffff) -#define GET_USED_GROUP_3(p) (((p)&USED_GROUP_3_MASK)) - -#define SCH_DBG_10 (DMA_SCH_BASE + 0x678) -#define USED_GROUP_4_MASK (0xfffff) -#define GET_USED_GROUP_4(p) (((p)&USED_GROUP_4_MASK)) - -#define SCH_DBG_11 (DMA_SCH_BASE + 0x67c) -#define USED_GROUP_5_MASK (0xfffff) -#define GET_USED_GROUP_5(p) (((p)&USED_GROUP_5_MASK)) - -#if defined(MT7636_FPGA) || defined(MT7637_FPGA) -#define MT_FPGA_PSE_SET_0 (0x8102008C) -#define MT_FPGA_PSE_SET_1 (0x8102009C) -#define MT_FPGA_PSE_CLIENT_CNT (0x800c006c) -#endif /* MT7636_FPGA || MT7637_FPGA */ - -#endif /* __DMA_SCH_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/gpio.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/gpio.h deleted file mode 100644 index 9527671d3c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/gpio.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - gpio.h -*/ - -#ifndef __GPIO_H__ -#define __GPIO_H__ - -#define GPIO_BASE 0x80023000 -#define GPIO_PU1 (GPIO_BASE + 0x00) -#define GPIO_PU1_SET (GPIO_BASE + 0x04) -#define GPIO_PU1_RESET (GPIO_BASE + 0x8) -#define GPIO_PD1 (GPIO_BASE + 0x10) -#define GPIO_PD1_SET (GPIO_BASE + 0x14) -#define GPIO_PD1_RESET (GPIO_BASE + 0x18) -#define GPIO_DOUT1 (GPIO_BASE + 0x20) -#define GPIO_DOUT1_SET (GPIO_BASE + 0x24) -#define GPIO_DOUT1_RESET (GPIO_BASE + 0x28) -#define GPIO_OE1 (GPIO_BASE + 0x30) -#define GPIO_OE1_SET (GPIO_BASE + 0x34) -#define GPIO_OE1_RESET (GPIO_BASE + 0x38) -#define GPIO_DIN1 (GPIO_BASE + 0x40) -#define PINMUX_SEL1 (GPIO_BASE + 0x80) -#define PINMUX_SEL2 (GPIO_BASE + 0x84) -#define PINMUX_SEL3 (GPIO_BASE + 0X88) - -#define GPIO0_SEL_MASK (0x7) -#define GPIO0_SEL(p) (((p)&0x7)) -#define GPIO0_SEL_VALUE 0x0 -#define GPIO1_SEL_MASK (0x7 << 4) -#define GPIO1_SEL(p) (((p)&0x7) << 4) -#define GPIO1_SEL_VALUE 0x2 -#define GPIO2_SEL_MASK (0x7 << 8) -#define GPIO2_SEL(p) (((p)&0x7) << 8) -#define GPIO2_SEL_VALUE 0x2 -#define GPIO3_SEL_MASK (0x7 << 12) -#define GPIO3_SEL(p) (((p)&0x7) << 12) -#define GPIO3_SEL_VALUE 0x2 -#define GPIO4_SEL_MASK (0x7 << 16) -#define GPIO4_SEL(p) (((p)&0x7) << 16) -#define GPIO4_SEL_VALUE 0x2 -#define GPIO5_SEL_MASK (0x7 << 20) -#define GPIO5_SEL(p) (((p)&0x7) << 20) -#define GPIO5_SEL_VALUE 0x2 -#define GPIO6_SEL_MASK (0x7 << 24) -#define GPIO6_SEL(p) (((p)&0x7) << 24) -#define GPIO6_SEL_VALUE 0x0 -#define GPIO7_SEL_MASK (0x7 << 28) -#define GPIO7_SEL(p) (((p)&0x7) << 28) -#define GPIO7_SEL_VALUE 0x0 -#define GPIO8_SEL_MASK (0x7) -#define GPIO8_SEL(p) (((p)&0x7)) -#define GPIO8_SEL_VALUE 0x0 -#define GPIO9_SEL_MASK (0x7 << 4) -#define GPIO9_SEL(p) (((p)&0x7) << 4) -#define GPIO9_SEL_VALUE 0x0 -#define GPIO10_SEL_MASK (0x7 << 8) -#define GPIO10_SEL(p) (((p)&0x7) << 8) -#define GPIO10_SEL_VALUE 0x0 -#define GPIO11_SEL_MASK (0x7 << 12) -#define GPIO11_SEL(p) (((p)&0x7) << 12) -#define GPIO11_SEL_VALUE 0x2 -#define GPIO12_SEL_MASK (0x7 << 16) -#define GPIO12_SEL(p) (((p)&0x7) << 16) -#define GPIO12_SEL_VALUE 0x2 -#define GPIO13_SEL_MASK (0x7 << 20) -#define GPIO13_SEL(p) (((p)&0x7) << 20) -#define GPIO13_SEL_VALUE 0x2 -#define GPIO14_SEL_MASK (0x7 << 24) -#define GPIO14_SEL(p) (((p)&0x7) << 24) -#define GPIO14_SEL_VALUE 0x2 -#define GPIO15_SEL_MASK (0x7 << 28) -#define GPIO15_SEL(p) (((p)&0x7) << 28) -#define GPIO15_SEL_VALUE 0x2 -#define GPIO16_SEL_MASK (0x7) -#define GPIO16_SEL(p) (((p)&0x7)) -#define GPIO16_SEL_VALUE 0x2 - -#define OUTPUT_HIGH 1 -#define OUTPUT_LOW 0 -#define INPUT_HIGH 1 -#define INPUT_LOW 0 -#define GPIO_OUTPUT 1 -#define GPIO_INPUT 0 -#define PULL_UP 1 -#define NO_PULL_UP 0 -#define PULL_DOWN 1 -#define NO_PULL_DOWN 0 - -#define GPIO0 0 -#define GPIO1 1 -#define GPIO2 2 -#define GPIO3 3 -#define GPIO4 4 -#define GPIO5 5 -#define GPIO6 6 -#define GPIO7 7 -#define GPIO8 8 -#define GPIO9 9 -#define GPIO10 10 -#define GPIO11 11 -#define GPIO12 12 -#define GPIO13 13 -#define GPIO14 14 -#define GPIO15 15 -#define GPIO16 16 - -INT32 GPIODirectionInput(struct _RTMP_ADAPTER *pAd, UINT32 GPIO); -INT32 GPIODirectionOuput(struct _RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value); -UINT32 GPIOGetValue(struct _RTMP_ADAPTER *pAd, UINT32 GPIO); -VOID GPIOSetValue(struct _RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value); -UINT32 GPIOGetMode(struct _RTMP_ADAPTER *pAd, UINT32 GPIO); -INT32 GPIOPullUp(struct _RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value); -INT32 GPIOPullDown(struct _RTMP_ADAPTER *pAd, UINT32 GPIO, UINT8 Value); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/mt_mac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/mt_mac.h deleted file mode 100644 index 7a955a663a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/mt_mac.h +++ /dev/null @@ -1,2017 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_mac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __MT_MAC_H__ -#define __MT_MAC_H__ - -#include "mac/mac_mt/top.h" -#include "mac/mac_mt/smac/gpio.h" -#include "mac/mac_mt/smac/wf_agg.h" -#include "mac/mac_mt/smac/wf_aon.h" -#include "mac/mac_mt/smac/wf_arb.h" -#include "mac/mac_mt/smac/wf_cfgoff.h" -#include "mac/mac_mt/smac/wf_dma.h" -#include "mac/mac_mt/smac/wf_lpon_top.h" -#include "mac/mac_mt/smac/wf_mib.h" -#include "mac/mac_mt/smac/wf_pf.h" -#include "mac/mac_mt/smac/wf_rmac.h" -#include "mac/mac_mt/smac/wf_sec.h" -#include "mac/mac_mt/smac/wf_tmac.h" -#include "mac/mac_mt/smac/wf_trb.h" -#include "mac/mac_mt/smac/wf_wtbloff.h" -#include "mac/mac_mt/smac/wf_wtblon.h" -#include "mac/mac_mt/smac/wf_int_wakeup_top.h" -#include "mac/mac_mt/smac/client.h" -#include "mac/mac_mt/smac/wf_wtbl.h" -#include "mac/mac_mt/smac/wf_phy.h" -#include "mac/mac_mt/smac/pse.h" - -#ifdef DMA_SCH_SUPPORT -#include "mac/mac_mt/smac/dma_sch.h" -#endif /* DMA_SCH_SUPPORT */ - -#ifndef COMPOS_WIN -#endif /* COMPOS_WIN */ - -/* - TX / RX descriptor format - - TX: - PCI/RBUS_DMA_Descriptor + TXD + 802.11 - - Rx: - PCI/RBUS/USB_DMA_Descripotr + RXD + 802.11 + RX_CSO_INFO -*/ - -#define FIFO_MGMT 0 -#define FIFO_HCCA 1 -#define FIFO_EDCA 2 - -#define DMA_SCH_LMAC 0 -#define DMA_SCH_BYPASS 1 -#define DMA_SCH_HYBRID 2 - -#ifdef MAC_REPEATER_SUPPORT -#define MAX_EXT_MAC_ADDR_SIZE 16 -/* TODO: Carter, single driver case? */ -#endif /* MAC_REPEATER_SUPPORT */ - -/****************************************************************************** - LMAC TxD - - TMAC_TXD_0 - TMAC_TXD_1 - TMAC_TXD_2 - TMAC_TXD_3 - -******************************************************************************/ - -/****************************************************************************** - TMAC_TXD_0 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_0 { - /* DWORD 0 */ - UINT32 PIdx : 1; - UINT32 QIdx : 4; - UINT32 UTxB : 1; - UINT32 UNxV : 1; - UINT32 UTChkSum : 1; - UINT32 IpChkSum : 1; - UINT32 EthTypeOffset : 7; - UINT32 TxByteCount : 16; -} TMAC_TXD_0, *PTMAC_TXD_0; -#else -typedef struct GNU_PACKED _TMAC_TXD_0 { - /* DWORD 0 */ - UINT32 TxByteCount : 16; - UINT32 EthTypeOffset : 7; - UINT32 IpChkSum : 1; - UINT32 UTChkSum : 1; - UINT32 UNxV : 1; - UINT32 UTxB : 1; - UINT32 QIdx : 4; - UINT32 PIdx : 1; -} TMAC_TXD_0, *PTMAC_TXD_0; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* TMAC_TXD_0.PIdx */ -#define P_IDX_LMAC 0 -#define P_IDX_MCU 1 - -/* TMAC_TXD_0.QIdx */ -#define Q_IDX_AC0 0x00 -#define Q_IDX_AC1 0x01 -#define Q_IDX_AC2 0x02 -#define Q_IDX_AC3 0x03 -#define Q_IDX_AC4 0x04 -#define Q_IDX_AC5 0x05 -#define Q_IDX_AC6 0x06 -#define Q_IDX_BCN 0x07 -#define TxQ_IDX_BCN0 Q_IDX_BCN -#define Q_IDX_BMC 0x08 -#define Q_IDX_AC10 0x09 -#define Q_IDX_AC11 0x0a -#define Q_IDX_AC12 0x0b -#define Q_IDX_AC13 0x0c -#define Q_IDX_AC14 0x0d - -#define Q_IDX_RQ0 0x00 -#define Q_IDX_RQ1 0x01 -#define Q_IDX_RQ2 0x02 -#define Q_IDX_RQ3 0x03 - -/* TMAC_TXD_0.PIdx + TMAC_TXD_0.QIdx */ -#define PQ_IDX_LMAC_AC0 ((P_IDX_LMAC << 4) | (Q_IDX_AC0)) -#define PQ_IDX_LMAC_AC1 ((P_IDX_LMAC << 4) | (Q_IDX_AC1)) -#define PQ_IDX_LMAC_AC2 ((P_IDX_LMAC << 4) | (Q_IDX_AC2)) -#define PQ_IDX_LMAC_AC3 ((P_IDX_LMAC << 4) | (Q_IDX_AC3)) -#define PQ_IDX_LMAC_AC4 ((P_IDX_LMAC << 4) | (Q_IDX_AC4)) -#define PQ_IDX_LMAC_AC5 ((P_IDX_LMAC << 4) | (Q_IDX_AC5)) -#define PQ_IDX_LMAC_AC6 ((P_IDX_LMAC << 4) | (Q_IDX_AC6)) -#define PQ_IDX_LMAC_BCN ((P_IDX_LMAC << 4) | (Q_IDX_BCN)) -#define PQ_IDX_LMAC_BMC ((P_IDX_LMAC << 4) | (Q_IDX_BMC)) -#define PQ_IDX_LMAC_AC10 ((P_IDX_LMAC << 4) | (Q_IDX_AC10)) -#define PQ_IDX_LMAC_AC11 ((P_IDX_LMAC << 4) | (Q_IDX_AC11)) -#define PQ_IDX_LMAC_AC12 ((P_IDX_LMAC << 4) | (Q_IDX_AC12)) -#define PQ_IDX_LMAC_AC13 ((P_IDX_LMAC << 4) | (Q_IDX_AC13)) -#define PQ_IDX_LMAC_AC14 ((P_IDX_LMAC << 4) | (Q_IDX_AC14)) - -#define PQ_IDX_MCU_RQ0 ((P_IDX_MCU << 4) | (Q_IDX_RQ0)) -#define PQ_IDX_MCU_RQ1 ((P_IDX_MCU << 4) | (Q_IDX_RQ1)) -#define PQ_IDX_MCU_RQ2 ((P_IDX_MCU << 4) | (Q_IDX_RQ2)) -#define PQ_IDX_MCU_RQ3 ((P_IDX_MCU << 4) | (Q_IDX_RQ3)) - -/****************************************************************************** - TMAC_TXD_1 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_1 { - /* DWORD 1 */ - UINT32 OwnMacAddr : 6; - UINT32 Rsv24to25 : 2; - UINT32 ProtectFrame : 1; - UINT32 Tid : 3; - UINT32 NoAck : 1; - UINT32 HdrPad : 3; - UINT32 TxDFmt : 1; - UINT32 HdrFmt : 2; - UINT32 HdrInfo : 5; - UINT32 WlanIdx : 8; -} TMAC_TXD_1, *PTMAC_TXD_1; -#else -typedef struct GNU_PACKED _TMAC_TXD_1 { - /* DWORD 1 */ - UINT32 WlanIdx : 8; - UINT32 HdrInfo : 5; - UINT32 HdrFmt : 2; - UINT32 TxDFmt : 1; - UINT32 HdrPad : 3; - UINT32 NoAck : 1; - UINT32 Tid : 3; - UINT32 ProtectFrame : 1; - UINT32 Rsv24to25 : 2; - UINT32 OwnMacAddr : 6; -} TMAC_TXD_1, *PTMAC_TXD_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* TMAC_TXD_1.HdrFmt */ -#define TMI_HDR_FT_NON_80211 0x0 -#define TMI_HDR_FT_CMD 0x1 -#define TMI_HDR_FT_NOR_80211 0x2 -#define TMI_HDR_FT_ENH_80211 0x3 - -/* - TMAC_TXD_1.HdrInfo -*/ -/* if TMAC_TXD_1.HdrFmt == HDR_FORMAT_NON_80211 */ -#define TMI_HDR_INFO_0_BIT_MRD 0 -#define TMI_HDR_INFO_0_BIT_EOSP 1 -#define TMI_HDR_INFO_0_BIT_RMVL 2 -#define TMI_HDR_INFO_0_BIT_VLAN 3 -#define TMI_HDR_INFO_0_BIT_ETYP 4 -#define TMI_HDR_INFO_0_VAL(_mrd, _eosp, _rmvl, _vlan, _etyp) \ - ((((_mrd) ? 1 : 0) << TMI_HDR_INFO_0_BIT_MRD) | \ - (((_eosp) ? 1 : 0) << TMI_HDR_INFO_0_BIT_EOSP) | \ - (((_rmvl) ? 1 : 0) << TMI_HDR_INFO_0_BIT_RMVL) | \ - (((_vlan) ? 1 : 0) << TMI_HDR_INFO_0_BIT_VLAN) | \ - (((_etyp) ? 1 : 0) << TMI_HDR_INFO_0_BIT_ETYP)) - -/* if TMAC_TXD_1.HdrFmt == HDR_FORMAT_CMD */ -#define TMI_HDR_INFO_1_MASK_RSV (0x1f) -#define TMI_HDR_INFO_1_VAL 0 - -/* if TMAC_TXD_1.HdrFmt == HDR_FORMAT_NOR_80211 */ -#define TMI_HDR_INFO_2_MASK_LEN (0x1f) -#define TMI_HDR_INFO_2_VAL(_len) (_len >> 1) - -/* if TMAC_TXD_1.HdrFmt == HDR_FORMAT_ENH_80211 */ -#define TMI_HDR_INFO_3_BIT_EOSP 1 -#define TMI_HDR_INFO_3_BIT_AMS 2 -#define TMI_HDR_INFO_3_VAL(_eosp, _ams) \ - ((((_eosp) ? 1 : 0) << TMI_HDR_INFO_3_BIT_EOSP) | \ - (((_ams) ? 1 : 0) << TMI_HDR_INFO_3_BIT_AMS)) - -#define TMI_HDR_INFO_VAL(_fmt, _mrd, _eosp, _rmvl, _vlan, _etype, _len, _ams, \ - _val) \ - do { \ - switch (_fmt) { \ - case TMI_HDR_FT_NON_80211: \ - (_val) = TMI_HDR_INFO_0_VAL((_mrd), (_eosp), (_rmvl), \ - (_vlan), (_etype)); \ - break; \ - case TMI_HDR_FT_CMD: \ - (_val) = TMI_HDR_INFO_1_VAL; \ - break; \ - case TMI_HDR_FT_NOR_80211: \ - ASSERT((((_len)&1) == 0)); \ - (_val) = TMI_HDR_INFO_2_VAL((_len)); \ - break; \ - case TMI_HDR_FT_ENH_80211: \ - (_val) = TMI_HDR_INFO_3_VAL((_eosp), (_ams)); \ - default: \ - (_val) = 0; \ - } \ - } while (0) - -/* TMAC_TXD_1.TxDFmt */ -#define TMI_FT_SHORT 0 -#define TMI_FT_LONG 1 - -/* TMAC_TXD_1.HdrPad */ -#define TMI_HDR_PAD_BIT_MODE 2 -#define TMI_HDR_PAD_MODE_TAIL 0 -#define TMI_HDR_PAD_MODE_HEAD 1 -#define TMI_HDR_PAD_BIT_LEN 0 -#define TMI_HDR_PAD_MASK_LEN 0x3 - -/****************************************************************************** - TMAC_TXD_2 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_2 { - /* DWORD 2 */ - UINT32 FixRate : 1; - UINT32 TimingMeasure : 1; - UINT32 BaDisable : 1; - UINT32 PwrOffset : 5; - UINT32 MaxTxTime : 8; - UINT32 Frag : 2; - UINT32 HtcExist : 1; - UINT32 Duration : 1; - UINT32 Bip : 1; - UINT32 BmcPkt : 1; - UINT32 Rts : 1; - UINT32 Sounding : 1; - UINT32 Ndpa : 1; - UINT32 Ndp : 1; - UINT32 FrmType : 2; - UINT32 SubType : 4; -} TMAC_TXD_2, *PTMAC_TXD_2; -#else -typedef struct GNU_PACKED _TMAC_TXD_2 { - /* DWORD 2 */ - UINT32 SubType : 4; - UINT32 FrmType : 2; - UINT32 Ndp : 1; - UINT32 Ndpa : 1; - UINT32 Sounding : 1; - UINT32 Rts : 1; - UINT32 BmcPkt : 1; - UINT32 Bip : 1; - UINT32 Duration : 1; - UINT32 HtcExist : 1; - UINT32 Frag : 2; - UINT32 MaxTxTime : 8; - UINT32 PwrOffset : 5; - UINT32 BaDisable : 1; - UINT32 TimingMeasure : 1; - UINT32 FixRate : 1; -} TMAC_TXD_2, *PTMAC_TXD_2; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMAC_TXD_3 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_3 { - /* DWORD 3 */ - UINT32 SnVld : 1; - UINT32 PnVld : 1; - UINT32 Rsv28to29 : 2; - UINT32 Sn : 12; - UINT32 RemainTxCnt : 5; - UINT32 TxCnt : 5; - UINT32 Rsv0to5 : 6; -} TMAC_TXD_3, *PTMAC_TXD_3; -#else -typedef struct GNU_PACKED _TMAC_TXD_3 { - /* DWORD 3 */ - UINT32 Rsv0to5 : 6; - UINT32 TxCnt : 5; - UINT32 RemainTxCnt : 5; - UINT32 Sn : 12; - UINT32 Rsv28to29 : 2; - UINT32 PnVld : 1; - UINT32 SnVld : 1; -} TMAC_TXD_3, *PTMAC_TXD_3; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMAC_TXD_4 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMAC_TXD_4 { - UINT32 PktNumLow; -} TMAC_TXD_4, *PTMAC_TXD_4; -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMAC_TXD_5 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_5 { - UINT32 PktNumHigh : 16; - UINT32 Rsv : 2; - UINT32 PwrMgmt : 1; - UINT32 BarSsnCtrl : 1; - UINT32 DataSrcSelect : 1; - UINT32 TxS2Host : 1; - UINT32 TxS2Mcu : 1; - UINT32 TxSFmt : 1; - UINT32 PktId : 8; -} TMAC_TXD_5, *PTMAC_TXD_5; -#else -typedef struct GNU_PACKED _TMAC_TXD_5 { - UINT32 PktId : 8; - UINT32 TxSFmt : 1; - UINT32 TxS2Mcu : 1; - UINT32 TxS2Host : 1; - UINT32 DataSrcSelect : 1; - UINT32 BarSsnCtrl : 1; - UINT32 PwrMgmt : 1; - UINT32 Rsv : 2; - UINT32 PktNumHigh : 16; -} TMAC_TXD_5, *PTMAC_TXD_5; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* TMAC_TXD_5.DataSrcSelect */ -#define TMI_DAS_FROM_MPDU 0 -#define TMI_DAS_FROM_WTBL 1 - -/* TMAC_TXD_5.BarSsnCtrl */ -#define TMI_BSN_CFG_BY_HW 0 -#define TMI_BSN_CFG_BY_SW 1 - -/* TMAC_TXD_5.PwrMgmt */ -#define TMI_PM_BIT_CFG_BY_HW 0 -#define TMI_PM_BIT_CFG_BY_SW 1 - -/****************************************************************************** - TMAC_TXD_6 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_6 { - UINT32 GI : 1; - UINT32 LDPC : 1; - UINT32 RateToBeFixed : 12; - UINT32 ImplicitBf : 1; - UINT32 ExplicitBf : 1; - UINT32 DynamicBw : 1; - UINT32 AntPri : 3; - UINT32 SpeExtEnable : 1; - UINT32 FixedBwMode : 3; - UINT32 AntIdx : 6; - UINT32 Rsv : 1; - UINT32 FixedRateMode : 1; -} TMAC_TXD_6, *PTMAC_TXD_6; -#else -typedef struct GNU_PACKED _TMAC_TXD_6 { - UINT32 FixedRateMode : 1; - UINT32 Rsv : 1; - UINT32 AntIdx : 6; - UINT32 FixedBwMode : 3; - UINT32 SpeExtEnable : 1; - UINT32 AntPri : 3; - UINT32 DynamicBw : 1; - UINT32 ExplicitBf : 1; - UINT32 ImplicitBf : 1; - UINT32 RateToBeFixed : 12; - UINT32 LDPC : 1; - UINT32 GI : 1; -} TMAC_TXD_6, *PTMAC_TXD_6; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* TMAC_TXD_6.fix_rate_mode */ -#define TMI_FIX_RATE_BY_TXD 0 -#define TMI_FIX_RATE_BY_CR 1 - -#define TMI_TX_RATE_BIT_STBC 11 -#define TMI_TX_RATE_BIT_NSS 9 -#define TMI_TX_RATE_MASK_NSS 0x3 - -#define TMI_TX_RATE_BIT_MODE 6 -#define TMI_TX_RATE_MASK_MODE 0x7 -#define TMI_TX_RATE_MODE_CCK 0 -#define TMI_TX_RATE_MODE_OFDM 1 -#define TMI_TX_RATE_MODE_HTMIX 2 -#define TMI_TX_RATE_MODE_HTGF 3 -#define TMI_TX_RATE_MODE_VHT 4 - -#define SHORT_PREAMBLE 0 -#define LONG_PREAMBLE 1 - -#define TMI_TX_RATE_BIT_MCS 0 -#define TMI_TX_RATE_MASK_MCS 0x3f -#define TMI_TX_RATE_CCK_1M_LP 0 -#define TMI_TX_RATE_CCK_2M_LP 1 -#define TMI_TX_RATE_CCK_5M_LP 2 -#define TMI_TX_RATE_CCK_11M_LP 3 - -#define TMI_TX_RATE_CCK_2M_SP 5 -#define TMI_TX_RATE_CCK_5M_SP 6 -#define TMI_TX_RATE_CCK_11M_SP 7 - -#define TMI_TX_RATE_OFDM_6M 11 -#define TMI_TX_RATE_OFDM_9M 15 -#define TMI_TX_RATE_OFDM_12M 10 -#define TMI_TX_RATE_OFDM_18M 14 -#define TMI_TX_RATE_OFDM_24M 9 -#define TMI_TX_RATE_OFDM_36M 13 -#define TMI_TX_RATE_OFDM_48M 8 -#define TMI_TX_RATE_OFDM_54M 12 - -#define TMI_TX_RATE_HT_MCS0 0 -#define TMI_TX_RATE_HT_MCS1 1 -#define TMI_TX_RATE_HT_MCS2 2 -#define TMI_TX_RATE_HT_MCS3 3 -#define TMI_TX_RATE_HT_MCS4 4 -#define TMI_TX_RATE_HT_MCS5 5 -#define TMI_TX_RATE_HT_MCS6 6 -#define TMI_TX_RATE_HT_MCS7 7 -#define TMI_TX_RATE_HT_MCS8 8 -#define TMI_TX_RATE_HT_MCS9 9 -#define TMI_TX_RATE_HT_MCS10 10 -#define TMI_TX_RATE_HT_MCS11 11 -#define TMI_TX_RATE_HT_MCS12 12 -#define TMI_TX_RATE_HT_MCS13 13 -#define TMI_TX_RATE_HT_MCS14 14 -#define TMI_TX_RATE_HT_MCS15 15 -#define TMI_TX_RATE_HT_MCS16 16 -#define TMI_TX_RATE_HT_MCS17 17 -#define TMI_TX_RATE_HT_MCS18 18 -#define TMI_TX_RATE_HT_MCS19 19 -#define TMI_TX_RATE_HT_MCS20 20 -#define TMI_TX_RATE_HT_MCS21 21 -#define TMI_TX_RATE_HT_MCS22 22 -#define TMI_TX_RATE_HT_MCS23 23 - -#define TMI_TX_RATE_HT_MCS32 32 - -#define TMI_TX_RATE_VHT_MCS0 0 -#define TMI_TX_RATE_VHT_MCS1 1 -#define TMI_TX_RATE_VHT_MCS2 2 -#define TMI_TX_RATE_VHT_MCS3 3 -#define TMI_TX_RATE_VHT_MCS4 4 -#define TMI_TX_RATE_VHT_MCS5 5 -#define TMI_TX_RATE_VHT_MCS6 6 -#define TMI_TX_RATE_VHT_MCS7 7 -#define TMI_TX_RATE_VHT_MCS8 8 -#define TMI_TX_RATE_VHT_MCS9 9 - -/****************************************************************************** - TMAC_TXD_7 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -/* TODO: Lens, need to make more specific and clear definition for those fields! */ -typedef struct _TMAC_TXD_7 { - UINT32 SwUseNonQoS : 1; /* remove */ - UINT32 SwUseSegmentEnd : 1; - UINT32 SwUseAMSDU : 1; /* remove */ - UINT32 SwUseUSB4ByteAlign : 2; /* remove */ - UINT32 SwUseSegIdx : 6; - UINT32 SwFieldReserve : 5; - UINT32 SchdTxTime : 16; -} TMAC_TXD_7, *PTMAC_TXD_7; -#else -typedef struct _TMAC_TXD_7 { - UINT32 SchdTxTime : 16; - UINT32 SwFieldReserve : 5; - UINT32 SwUseSegIdx : 6; - UINT32 SwUseUSB4ByteAlign : 2; - UINT32 SwUseAMSDU : 1; - UINT32 SwUseSegmentEnd : 1; - UINT32 SwUseNonQoS : 1; -} TMAC_TXD_7, *PTMAC_TXD_7; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TX Descriptor in Long Format (TMAC_TXD_1.FT = 1) - which including TMAC_TXD_0~ TMAC_TXD_7 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMAC_TXD_L { - TMAC_TXD_0 TxD0; - TMAC_TXD_1 TxD1; - TMAC_TXD_2 TxD2; - TMAC_TXD_3 TxD3; - TMAC_TXD_4 TxD4; - TMAC_TXD_5 TxD5; - TMAC_TXD_6 TxD6; - TMAC_TXD_7 TxD7; -} TMAC_TXD_L, *PTMAC_TXD_L; -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TX Descriptor in Short Format (TMAC_TXD_1.FT = 0) - which including TMAC_TXD_0, TMAC_TXD_1, and TMAC_TXD_7 -******************************************************************************/ -/* - TX Descriptor in Short Format (TMAC_TXD_1.FT = 0) -*/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMAC_TXD_S { - TMAC_TXD_0 TxD0; - TMAC_TXD_1 TxD1; - TMAC_TXD_7 TxD7; -} TMAC_TXD_S, *PTMAC_TXD_S; -/* ---UNIFIED_TXD_RXD */ - -typedef struct _TXV1_MAC2PHY { - UCHAR txrate; - UCHAR STBC; - UCHAR Ldpc_Bcc; - UCHAR Ness; - UCHAR txmode; - UCHAR bw; - UCHAR txpower; -} TXV1_MAC2PHY; - -typedef struct _TXV2_MAC2PHY { - UCHAR agg; - UCHAR gi; - UCHAR smooth; - UCHAR sounding; - UCHAR txbf; -} TXV2_MAC2PHY; - -typedef struct _TXV3_MAC2PHY { - UCHAR bw_status; - UCHAR mac[6]; -} TXV3_MAC2PHY; - -#define RMAC_RXD_0_PKT_TYPE_MASK 0xe0000000 -#define RMAC_RX_PKT_TYPE_RX_TXS 0x00 -#define RMAC_RX_PKT_TYPE_RX_TXRXV 0x01 -#define RMAC_RX_PKT_TYPE_RX_NORMAL 0x02 -#define RMAC_RX_PKT_TYPE_RX_DUP_RFB 0x03 -#define RMAC_RX_PKT_TYPE_RX_TMR 0x04 -#define RMAC_RX_PKT_TYPE_RETRIEVE 0x05 -#define RMAC_RX_PKT_TYPE_RX_EVENT 0x07 -#define RMAC_RX_PKT_TYPE(_x) (((_x)&RMAC_RXD_0_PKT_TYPE_MASK) >> 29) -#define RMAC_RXD_0_PKT_RX_BYTE_COUNT_MASK 0x0000ffff -#define RMAC_RX_PKT_RX_BYTE_COUNT(_x) (((_x)&RMAC_RXD_0_PKT_RX_BYTE_COUNT_MASK)) - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TXS { - UINT32 TxSPktType : 3; - UINT32 TxSRsv : 8; - UINT32 TxSCnt : 5; - UINT32 TxSRxByteCnt : 16; -} RMAC_RXD_0_TXS, *PRMAC_RXD_0_TXS; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TXS { - UINT32 TxSRxByteCnt : 16; - UINT32 TxSCnt : 5; - UINT32 TxSRsv : 8; - UINT32 TxSPktType : 3; -} RMAC_RXD_0_TXS, *PRMAC_RXD_0_TXS; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TXRXV { - UINT32 PktType : 3; - UINT32 Rsv : 8; - UINT32 RxvCnt : 5; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0_TXRXV, *PRMAC_RXD_0_TXRXV; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TXRXV { - UINT32 RxByteCnt : 16; - UINT32 RxvCnt : 5; - UINT32 Rsv : 8; - UINT32 PktType : 3; -} RMAC_RXD_0_TXRXV, *PRMAC_RXD_0_TXRXV; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - LMAC RxD - - RMAC_RXD_0 - RMAC_RXD_1 - RMAC_RXD_2 - RMAC_RXD_3 - -******************************************************************************/ - -/****************************************************************************** - RMAC_RXD_0 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0 { - UINT32 PktType : 3; - UINT32 RfbGroupVld : 4; - UINT32 UdpTcpChkSumOffload : 1; - UINT32 IpChkSumOffload : 1; - UINT32 EthTypeOffset : 7; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0, *PRMAC_RXD_0; -#else -typedef struct GNU_PACKED _RMAC_RXD_0 { - UINT32 RxByteCnt : 16; - UINT32 EthTypeOffset : 7; - UINT32 IpChkSumOffload : 1; - UINT32 UdpTcpChkSumOffload : 1; - UINT32 RfbGroupVld : 4; - UINT32 PktType : 3; -} RMAC_RXD_0, *PRMAC_RXD_0; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - RMAC_RXD_1 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_1 { - UINT32 RxDBssidIdx : 6; - UINT32 PayloadFmt : 2; - UINT32 HdrTranslation : 1; - UINT32 HdrOffset : 1; - UINT32 MacHdrLen : 6; - UINT32 ChFreq : 8; - UINT32 KeyId : 2; - UINT32 BcnWithUCast : 1; - UINT32 BcnWithBMcst : 1; - UINT32 Bcast : 1; - UINT32 Mcast : 1; - UINT32 UcastToMe : 1; - UINT32 HTC : 1; -} RMAC_RXD_1, *PRMAC_RXD_1; -#else -typedef struct GNU_PACKED _RMAC_RXD_1 { - UINT32 HTC : 1; - UINT32 UcastToMe : 1; - UINT32 Mcast : 1; - UINT32 Bcast : 1; - UINT32 BcnWithBMcst : 1; - UINT32 BcnWithUCast : 1; - UINT32 KeyId : 2; - UINT32 ChFreq : 8; - UINT32 MacHdrLen : 6; - UINT32 HdrOffset : 1; - UINT32 HdrTranslation : 1; - UINT32 PayloadFmt : 2; - UINT32 RxDBssidIdx : 6; -} RMAC_RXD_1, *PRMAC_RXD_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - RMAC_RXD_2 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_2 { - UINT32 NonAmpduFrm : 1; - UINT32 NonAmpduSfrm : 1; - UINT32 NonDataFrm : 1; - UINT32 NullFrm : 1; - UINT32 FragFrm : 1; - UINT32 UdfVlanType : 1; - UINT32 LlcMis : 1; - UINT32 ExMaxRxLen : 1; - UINT32 DeAmsduFail : 1; - UINT32 LenMis : 1; - UINT32 TkipMicErr : 1; - UINT32 IcvErr : 1; - UINT32 CipherLenMis : 1; - UINT32 CipherMis : 1; - UINT32 FcsErr : 1; - UINT32 SwBit : 1; - UINT32 SecMode : 4; - UINT32 RxDTid : 4; - UINT32 RxDWlanIdx : 8; -} RMAC_RXD_2, *PRMAC_RXD_2; -#else -typedef struct GNU_PACKED _RMAC_RXD_2 { - UINT32 RxDWlanIdx : 8; - UINT32 RxDTid : 4; - UINT32 SecMode : 4; - UINT32 SwBit : 1; - UINT32 FcsErr : 1; - UINT32 CipherMis : 1; - UINT32 CipherLenMis : 1; - UINT32 IcvErr : 1; - UINT32 TkipMicErr : 1; - UINT32 LenMis : 1; - UINT32 DeAmsduFail : 1; - UINT32 ExMaxRxLen : 1; - UINT32 LlcMis : 1; - UINT32 UdfVlanType : 1; - UINT32 FragFrm : 1; - UINT32 NullFrm : 1; - UINT32 NonDataFrm : 1; - UINT32 NonAmpduSfrm : 1; - UINT32 NonAmpduFrm : 1; -} RMAC_RXD_2, *PRMAC_RXD_2; -#endif -/* ---UNIFIED_TXD_RXD */ - -/*//do unify -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED rmac_rxd_3_normal { - UINT32 pf_sts:2; - UINT32 pf_mode:1; - UINT32 cls_bitmap:10; - UINT32 wol:5; - UINT32 magic_pkt:1; - UINT32 OFLD:2; - UINT32 cls:1; - UINT32 pattern_drop_bit:1; - UINT32 tsf_compare_loss:1; - UINT32 rx_vector_seq:8; -} RMAC_RXD_3_NORMAL; -#else -typedef struct GNU_PACKED rmac_rxd_3_normal { - UINT32 rx_vector_seq:8; - UINT32 tsf_compare_loss:1; - UINT32 pattern_drop_bit:1; - UINT32 cls:1; - UINT32 OFLD:2; - UINT32 magic_pkt:1; - UINT32 wol:5; - UINT32 cls_bitmap:10; - UINT32 pf_mode:1; - UINT32 pf_sts:2; -} RMAC_RXD_3_NORMAL; -#endif -*/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TMR { - UINT32 PktType : 3; - UINT32 IR : 1; - UINT32 TodVld : 1; - UINT32 ToaVld : 1; - UINT32 Type : 2; - UINT32 SubType : 4; - UINT32 Tmf : 1; - UINT32 Nc : 1; - UINT32 TxVFrmMode : 2; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0_TMR, *PRMAC_RXD_0_TMR; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TMR { - UINT32 RxByteCnt : 16; - UINT32 TxVFrmMode : 2; - UINT32 Nc : 1; - UINT32 Tmf : 1; - UINT32 SubType : 4; - UINT32 Type : 2; - UINT32 ToaVld : 1; - UINT32 TodVld : 1; - UINT32 IR : 1; - UINT32 PktType : 3; -} RMAC_RXD_0_TMR, *PRMAC_RXD_0_TMR; -#endif -/* ---UNIFIED_TXD_RXD */ - -typedef union GNU_PACKED _RMAC_RXD_0_UNION { - struct _RMAC_RXD_0_TXS TxSD0; - struct _RMAC_RXD_0 RxD0; - struct _RMAC_RXD_0_TXRXV RxvD0; - struct _RMAC_RXD_0_TMR TmrD0; - UINT32 word; -} RMAC_RXD_0_UNION, *PRMAC_RXD_0_UNION; - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_3 { - UINT32 PfStatus : 2; - UINT32 PfMode : 1; - UINT32 ClsBitMap : 10; - UINT32 WoWlan : 5; - UINT32 MgcPkt : 1; - UINT32 OfldPf : 2; - UINT32 ClsPkt : 1; - UINT32 Drop : 1; - UINT32 Tcl : 1; - UINT32 RxVSeq : 8; -} RMAC_RXD_3, *PRMAC_RXD_3; -#else -typedef struct GNU_PACKED _RMAC_RXD_3 { - UINT32 RxVSeq : 8; - UINT32 Tcl : 1; - UINT32 Drop : 1; - UINT32 ClsPkt : 1; - UINT32 OfldPf : 2; - UINT32 MgcPkt : 1; - UINT32 WoWlan : 5; - UINT32 ClsBitMap : 10; - UINT32 PfMode : 1; - UINT32 PfStatus : 2; -} RMAC_RXD_3, *PRMAC_RXD_3; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -/* - Rx Normal Data frame Format -*/ -typedef struct GNU_PACKED _RXD_BASE_STRUCT { - /* DWORD 0 */ - struct _RMAC_RXD_0 RxD0; - /* DWORD 1 */ - struct _RMAC_RXD_1 RxD1; - /* DWORD 2 */ - struct _RMAC_RXD_2 RxD2; - /* DWORD 3 */ - /* struct rmac_rxd_3_normal RxD3;//do unify */ - struct _RMAC_RXD_3 RxD3; -} RXD_BASE_STRUCT, *PRXD_BASE_STRUCT; -/* ---UNIFIED_TXD_RXD */ - -#define RXS_GROUP1 (1 << 0) -#define RXS_GROUP2 (1 << 1) -#define RXS_GROUP3 (1 << 2) -#define RXS_GROUP4 (1 << 3) - -#define RMAC_INFO_BASE_SIZE 16 -#define RMAC_INFO_GRP_1_SIZE 16 -#define RMAC_INFO_GRP_2_SIZE 8 -#define RMAC_INFO_GRP_3_SIZE 24 -#define RMAC_INFO_GRP_4_SIZE 16 - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_4 { - /* DW4 */ - UINT32 TA0 : 16; - UINT32 FrmCtrl : 16; -} RMAC_RXD_4, *PRMAC_RXD_4; -#else -typedef struct GNU_PACKED _RMAC_RXD_4 { - /* DW4 */ - UINT32 FrmCtrl : 16; - UINT32 TA0 : 16; -} RMAC_RXD_4, *PRMAC_RXD_4; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_5 { - UINT32 TA1; -} RMAC_RXD_5, *PRMAC_RXD_5; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_6 { - UINT32 QoS : 16; - UINT32 Seq : 12; - UINT32 Frag : 4; -} RMAC_RXD_6, *PRMAC_RXD_6; -#else -typedef struct GNU_PACKED _RMAC_RXD_6 { - UINT32 Frag : 4; - UINT32 Seq : 12; - UINT32 QoS : 16; -} RMAC_RXD_6, *PRMAC_RXD_6; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_7 { - UINT32 HTCtrl; -} RMAC_RXD_7, *PRMAC_RXD_7; - -typedef struct GNU_PACKED _RXD_GRP4_STRUCT { - /* DWORD 4 */ - struct _RMAC_RXD_4 rxd_4; - - /* DWORD 5 */ - struct _RMAC_RXD_5 rxd_5; - - /* DWORD 6 */ - struct _RMAC_RXD_6 rxd_6; - - /* DWORD 7 */ - struct _RMAC_RXD_7 rxd_7; -} RXD_GRP4_STRUCT; - -typedef union GNU_PACKED _RMAC_RXD_8 { - UINT32 RscPn0; - UINT32 WPIPn0; - UINT32 Word; -} RMAC_RXD_8, *PRMAC_RXD_8; - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _RMAC_RXD_9 { - struct { - UINT32 Rsv : 16; - UINT32 PN : 16; - } RscPn1; - UINT32 WPIPn1; - UINT32 Word; -} RMAC_RXD_9, *PRMAC_RXD_9; -#else -typedef union GNU_PACKED _RMAC_RXD_9 { - struct { - UINT32 PN : 16; - UINT32 Rsv : 16; - } RscPn1; - UINT32 WPIPn1; - UINT32 Word; -} RMAC_RXD_9, *PRMAC_RXD_9; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_10 { - UINT32 WpiPn2; -} RMAC_RXD_10, *PRMAC_RXD_10; - -typedef struct GNU_PACKED _RMAC_RXD_11 { - UINT32 WpiPn3; -} RMAC_RXD_11, *PRMAC_RXD_11; - -typedef struct GNU_PACKED _RXD_GRP1_STRUCT { - /* DWORD 8 */ - union _RMAC_RXD_8 rxd_8; - - /* DWORD 9 */ - union _RMAC_RXD_9 rxd_9; - - /* DWORD 10 */ - struct _RMAC_RXD_10 rxd_10; - - /* DWORD 11 */ - struct _RMAC_RXD_11 rxd_11; -} RXD_GRP1_STRUCT; - -typedef struct GNU_PACKED _RMAC_RXD_12 { - UINT32 Timestamp; -} RMAC_RXD_12, *PRMAC_RXD_12; - -typedef struct GNU_PACKED _RMAC_RXD_13 { - UINT32 Crc; -} RMAC_RXD_13, *PRMAC_RXD_13; - -typedef struct GNU_PACKED _RXD_GRP2_STRUCT { - /* DWORD 12 */ - struct _RMAC_RXD_12 rxd_12; - - /* DWORD 13 */ - struct _RMAC_RXD_13 rxd_13; -} RXD_GRP2_STRUCT; - -typedef struct GNU_PACKED _RMAC_RXD_14 { - UINT32 RxVCycle1; -} RMAC_RXD_14, *PRMAC_RXD_14; - -typedef struct GNU_PACKED _RMAC_RXD_15 { - UINT32 RxVCycle2; -} RMAC_RXD_15, *PRMAC_RXD_15; - -typedef struct GNU_PACKED _RMAC_RXD_16 { - UINT32 RxVCycle3; -} RMAC_RXD_16, *PRMAC_RXD_16; - -typedef struct GNU_PACKED _RMAC_RXD_17 { - UINT32 RxVCycle4; -} RMAC_RXD_17, *PRMAC_RXD_17; - -typedef struct GNU_PACKED _RMAC_RXD_18 { - UINT32 RxVCycle5; -} RMAC_RXD_18, *PRMAC_RXD_18; - -typedef struct GNU_PACKED _RMAC_RXD_19 { - UINT32 RxVCycle6; -} RMAC_RXD_19, *PRMAC_RXD_19; - -typedef struct GNU_PACKED _RXD_GRP3_STRUCT { - /* DWORD 13 */ - struct _RMAC_RXD_13 rxd_13; - - /* DWORD 14 */ - struct _RMAC_RXD_14 rxd_14; - - /* DWORD 15 */ - struct _RMAC_RXD_15 rxd_15; - - /* DWORD 16 */ - struct _RMAC_RXD_16 rxd_16; - - /* DWORD 17 */ - struct _RMAC_RXD_17 rxd_17; - - /* DWORD 18 */ - struct _RMAC_RXD_18 rxd_18; - - /* DWORD 19 */ - struct _RMAC_RXD_19 rxd_19; - -} RXD_GRP3_STRUCT; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_CSO_STRUCT { - UINT32 Rsv11to31 : 21; - UINT32 UnknownNextHdr : 1; - UINT32 IpFrag : 1; - UINT32 IpLenMismatch : 1; - UINT32 ChksumType : 4; - UINT32 ChksumStatus : 4; -} RX_CSO_STRUCT; -#else -typedef struct GNU_PACKED _RX_CSO_STRUCT { - UINT32 ChksumStatus : 4; - UINT32 ChksumType : 4; - UINT32 IpLenMismatch : 1; - UINT32 IpFrag : 1; - UINT32 UnknownNextHdr : 1; - UINT32 Rsv11to31 : 21; -} RX_CSO_STRUCT; -#endif - -/****************************************************************************** - LMAC TxS Structure - - TXS_D_0 - TXS_D_1 - TXS_D_2 - TXS_D_3 - TXS_D_4 -******************************************************************************/ - -/****************************************************************************** - TXS_D_0 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -/* TX Status Report Format */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_0 { - UINT32 AntId : 6; - UINT32 Tid : 3; - UINT32 BAFail : 1; - UINT32 PSBit : 1; - UINT32 TxOp : 1; - UINT32 BE : 1; - UINT32 LE : 1; - UINT32 RE : 1; - UINT32 ME : 1; - UINT32 TxS2H : 1; - UINT32 TxS2M : 1; - UINT32 TxSFmt : 1; - UINT32 TxS_FR : 1; - UINT32 TxRate : 12; -} TXS_D_0, *PTXS_D_0; -#else -typedef struct GNU_PACKED _TXS_D_0 { - UINT32 TxRate : 12; - UINT32 TxS_FR : 1; - UINT32 TxSFmt : 1; - UINT32 TxS2M : 1; - UINT32 TxS2H : 1; - UINT32 ME : 1; - UINT32 RE : 1; - UINT32 LE : 1; - UINT32 BE : 1; - UINT32 TxOp : 1; - UINT32 PSBit : 1; - UINT32 BAFail : 1; - UINT32 Tid : 3; - UINT32 AntId : 6; -} TXS_D_0, *PTXS_D_0; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TXS_D_1 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TXS_D_1 { - struct { - UINT32 Rsv : 8; - UINT32 Noise2 : 8; - UINT32 Noise1 : 8; - UINT32 Noise0 : 8; - } FieldNoise; - - UINT32 TimeStamp; - - UINT32 Word; -} TXS_D_1, *PTXS_D_1; -#else -typedef union GNU_PACKED _TXS_D_1 { - struct { - UINT32 Noise0 : 8; - UINT32 Noise1 : 8; - UINT32 Noise2 : 8; - UINT32 Rsv : 8; - } FieldNoise; - - UINT32 TimeStamp; - - UINT32 Word; -} TXS_D_1, *PTXS_D_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TXS_D_2 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TXS_D_2 { - struct { - UINT32 TxPwrdBm : 7; - UINT32 FrontTime : 25; - } field_ft; - - struct { - UINT32 TxPwrdBm : 7; - UINT32 Rsv : 1; - UINT32 RCPI2 : 8; - UINT32 RCPI1 : 8; - UINT32 RCPI0 : 8; - } field_rcpi; - - UINT32 Word; -} TXS_D_2, *PTXS_D_2; -#else -typedef union GNU_PACKED _TXS_D_2 { - struct { - UINT32 FrontTime : 25; - UINT32 TxPwrdBm : 7; - } field_ft; - - struct { - UINT32 RCPI0 : 8; - UINT32 RCPI1 : 8; - UINT32 RCPI2 : 8; - UINT32 Rsv : 1; - UINT32 TxPwrdBm : 7; - } field_rcpi; - - UINT32 Word; -} TXS_D_2, *PTXS_D_2; -#endif - -/****************************************************************************** - TXS_D_3 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_3 { - UINT32 TxS_WlanIdx : 8; - UINT32 RXV_SN : 8; - UINT32 TxDelay : 16; -} TXS_D_3, *PTXS_D_3; -#else -typedef struct GNU_PACKED _TXS_D_3 { - UINT32 TxDelay : 16; - UINT32 RXV_SN : 8; - UINT32 TxS_WlanIdx : 8; -} TXS_D_3, *PTXS_D_3; -#endif - -/****************************************************************************** - TXS_D_4 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_4 { - UINT32 TxS_LastTxMcsIdx : 3; - UINT32 TxS_MpduTxCnt : 5; - UINT32 TxS_AMPDU : 1; - UINT32 TxS_FianlMPDU : 1; - UINT32 TxS_Pid : 8; - UINT32 TxS_TxBW : 2; - UINT32 TxS_SN_TSSI : 12; -} TXS_D_4, *PTXS_D_4; -#else -typedef struct GNU_PACKED _TXS_D_4 { - UINT32 TxS_SN_TSSI : 12; - UINT32 TxS_TxBW : 2; - UINT32 TxS_Pid : 8; - UINT32 TxS_FianlMPDU : 1; - UINT32 TxS_AMPDU : 1; - UINT32 TxS_MpduTxCnt : 5; - UINT32 TxS_LastTxMcsIdx : 3; -} TXS_D_4, *PTXS_D_4; -#endif - -/****************************************************************************** - TXS_STRUC -******************************************************************************/ -typedef struct GNU_PACKED _TXS_STRUC { - TXS_D_0 TxSD0; - TXS_D_1 TxSD1; - TXS_D_2 TxSD2; - TXS_D_3 TxSD3; - TXS_D_4 TxSD4; -} TXS_STRUC; - -/****************************************************************************** - TXS Frame Format -******************************************************************************/ -typedef struct GNU_PACKED _TXS_FRM_STRUC { - struct _RMAC_RXD_0_TXS TxSD0; - TXS_STRUC txs_info[0]; -} TXS_FRM_STRUC; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_1ST_CYCLE { - UINT32 VHTA1_B5_B4 : 2; - UINT32 VHTA2_B8_B1 : 8; - UINT32 HtNoSound : 1; - UINT32 HtSmooth : 1; - UINT32 HtShortGi : 1; - UINT32 HtAggregation : 1; - UINT32 VHTA1_B22 : 1; - UINT32 FrMode : 2; - UINT32 TxMode : 3; - UINT32 HtExtltf : 2; - UINT32 HtAdCode : 1; - UINT32 HtStbc : 2; - UINT32 TxRate : 7; -} RX_VECTOR1_1ST_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_1ST_CYCLE { - UINT32 TxRate : 7; - UINT32 HtStbc : 2; - UINT32 HtAdCode : 1; - UINT32 HtExtltf : 2; - UINT32 TxMode : 3; - UINT32 FrMode : 2; - UINT32 VHTA1_B22 : 1; - UINT32 HtAggregation : 1; - UINT32 HtShortGi : 1; - UINT32 HtSmooth : 1; - UINT32 HtNoSound : 1; - UINT32 VHTA2_B8_B1 : 8; - UINT32 VHTA1_B5_B4 : 2; -} RX_VECTOR1_1ST_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_2ND_CYCLE { - UINT32 VHTA1_B16_B6 : 11; - UINT32 Length : 21; -} RX_VECTOR1_2ND_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_2ND_CYCLE { - UINT32 Length : 21; - UINT32 VHTA1_B16_B6 : 11; -} RX_VECTOR1_2ND_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_3TH_CYCLE { - UINT32 Fagc1CalGain : 3; - UINT32 Fgac1EqCal : 1; - UINT32 Rcpi1 : 8; - UINT32 Fagc0CalGain : 3; - UINT32 Fagc0EqCal : 1; - UINT32 Rcpi0 : 8; - UINT32 SelAnt : 1; - UINT32 ACI_DETx : 1; - UINT32 OFDMFreqTransDet : 1; - UINT32 VHTA1_B21_B17 : 5; -} RX_VECTOR1_3TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_3TH_CYCLE { - UINT32 VHTA1_B21_B17 : 5; - UINT32 OFDMFreqTransDet : 1; - UINT32 ACI_DETx : 1; - UINT32 SelAnt : 1; - UINT32 Rcpi0 : 8; - UINT32 Fagc0EqCal : 1; - UINT32 Fgac0CalGain : 3; - UINT32 Rcpi1 : 8; - UINT32 Fagc1EqCal : 1; - UINT32 Fgac1CalGain : 3; -} RX_VECTOR1_3TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_4TH_CYCLE { - UINT32 FgacCalGain : 3; - UINT32 Fagc2EqCal : 1; - UINT32 IBRssi1 : 8; - UINT32 FagcLpfGainx : 4; - UINT32 WBRssix : 8; - UINT32 IBRssi0 : 8; -} RX_VECTOR1_4TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_4TH_CYCLE { - UINT32 IBRssi0 : 8; - UINT32 WBRssix : 8; - UINT32 FagcLpfGainx : 4; - UINT32 IBRssi1 : 8; - UINT32 Fagc2EqCal : 1; - UINT32 FgacCalGain : 3; -} RX_VECTOR1_4TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_5TH_CYCLE { - UINT32 LTF_SNR0 : 6; - UINT32 LTF_ProcTime : 7; - UINT32 FoE : 12; /* FreqOffSer from Rx */ - UINT32 CagcState : 3; - UINT32 FagcLnaGain1 : 2; - UINT32 FagcLnaGain0 : 2; -} RX_VECTOR1_5TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_5TH_CYCLE { - UINT32 FagcLnaGain0 : 2; - UINT32 FagcLnaGain1 : 2; - UINT32 CagcState : 3; - UINT32 FoE : 12; /* FreqOffSer from Rx */ - UINT32 LTF_ProcTime : 7; - UINT32 LTF_SNR0 : 6; -} RX_VECTOR1_5TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_6TH_CYCLE { - UINT32 Reserved : 1; - UINT32 CagcState : 3; - UINT32 NsTsField : 3; - UINT32 RxValidIndicator : 1; - UINT32 Nf2 : 8; - UINT32 Nf1 : 8; - UINT32 Nf0 : 8; -} RX_VECTOR1_6TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_6TH_CYCLE { - UINT32 Nf0 : 8; - UINT32 Nf1 : 8; - UINT32 Nf2 : 8; - UINT32 RxValidIndicator : 1; - UINT32 NsTsField : 3; - UINT32 CagcState : 3; - UINT32 Reserved : 1; -} RX_VECTOR1_6TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_1ST_CYCLE { - UINT32 Ofdm : 28; - UINT32 BtEnv : 1; - UINT32 Sec40ItfrEnv : 1; - UINT32 SecItfrEnv : 1; - UINT32 PrimItfrEnv : 1; -} RX_VECTOR2_1ST_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_1ST_CYCLE { - UINT32 PrimItfrEnv : 1; - UINT32 SecItfrEnv : 1; - UINT32 Sec40ItfrEnv : 1; - UINT32 BtEnv : 1; - UINT32 Ofdm : 28; -} RX_VECTOR2_1ST_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_2ND_CYCLE { - UINT32 RxScramblingSeed : 3; - /* UINT32 DumpSelect:8; */ - UINT32 Reserved2 : 2; - UINT32 OfdmLtfSNR1 : 6; - UINT32 BtdNoTchLoc : 7; - UINT32 Ofdm : 14; -} RX_VECTOR2_2ND_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_2ND_CYCLE { - UINT32 Ofdm : 14; - UINT32 BtdNoTchLoc : 7; - /* UINT32 DumpSelect:8; */ - UINT32 OfdmLtfSNR1 : 6; - UINT32 Reserved2 : 2; - UINT32 RxScramblingSeed : 3; -} RX_VECTOR2_2ND_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_3TH_CYCLE { - UINT32 FcsErr : 1; - UINT32 OfdmDewModeDet : 1; - UINT32 OfdmCeLtfComb : 1; - UINT32 OfdmCeGicEnb : 1; - UINT32 OfdmCeRmsdId : 3; - UINT32 Reserved1 : 1; - UINT32 BgAgcWbRssix : 8; - UINT32 BfAgcIbRssix : 8; - UINT32 BfAgcLpfGain : 4; - UINT32 Reserved0 : 1; - UINT32 BfAgcLnaGainx : 2; - UINT32 HtStfDet : 1; -} RX_VECTOR2_3TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_3TH_CYCLE { - UINT32 HtStfDet : 1; - UINT32 BfAgcLnaGainx : 2; - UINT32 Reserved0 : 1; - UINT32 BfAgcLpfGain : 4; - UINT32 BfAgcIbRssix : 8; - UINT32 BgAgcWbRssix : 8; - UINT32 Reserved1 : 1; - UINT32 OfdmCeRmsdId : 3; - UINT32 OfdmCeGicEnb : 1; - UINT32 OfdmCeLtfComb : 1; - UINT32 OfdmDewModeDet : 1; - UINT32 FcsErr : 1; -} RX_VECTOR2_3TH_CYCLE; -#endif - -typedef struct _RXV_INFO { - INT32 Rssi0; - INT32 Rssi1; -} RXV_INFO; - -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _RXV_DWORD0 { - UINT32 TA_0_31; -} RXV_DWORD0; -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RXV_DWORD1 { - UINT32 Reserved : 7; - UINT32 TR : 1; - UINT32 RxvSn : 8; - UINT32 TA_32_47 : 16; -} RXV_DWORD1; -#else -typedef struct GNU_PACKED _RXV_DWORD1 { - UINT32 TA_32_47 : 16; - UINT32 RxvSn : 8; - UINT32 TR : 1; - UINT32 Reserved : 7; -} RXV_DWORD1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -/* RX/TX-Status Vector Format */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RXV_STRUC { - UINT32 Ta0; - UINT32 Rsv25To31 : 7; - UINT32 Tr : 1; - UINT32 RxVSn : 8; - UINT32 Ta32 : 16; - UINT32 Vector1[6]; - UINT32 Vector2[3]; -} RXV_STRUC, *PRXV_STRUC; -#else -typedef struct GNU_PACKED _RXV_STRUC { - UINT32 Ta0; - UINT32 Ta32 : 16; - UINT32 RxVSn : 8; - UINT32 Tr : 1; - UINT32 Rsv25To31 : 7; - UINT32 Vector1[6]; - UINT32 Vector2[3]; -} RXV_STRUC, *PRXV_STRUC; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _RXV_FRM_STRUC { - struct _RMAC_RXD_0_TXRXV RxVD0; - RXV_STRUC RxVInfo[0]; -} RXV_FRM_STRUC, *PRXV_FRM_STRUC; -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - LMAC TMR Structure - - TMR_D_1 - TMR_D_2 - TMR_D_6 -******************************************************************************/ - -/****************************************************************************** - TMR_D_1 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -/* - Timing Measurement Report Format -*/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_1 { - struct { - UINT32 TxvTxMode : 3; - UINT32 RxvDw1Bit29 : 1; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvTxMode : 3; - UINT32 RxvFrMode : 2; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvDw3Bit6 : 1; - UINT32 ToAeReport : 6; - UINT32 TodFine : 6; - UINT32 Pid : 8; - } field_init; - - struct { - UINT32 TxvTxMode : 3; - UINT32 RxvDw1Bit29 : 1; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvTxMode : 3; - UINT32 RxvFrMode : 2; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvDw3Bit6 : 1; - UINT32 ToAeReport : 6; - UINT32 TodFine : 6; - UINT32 RxvSn : 8; - } field_resp; - - UINT32 word; -} TMR_D_1, *PTMR_D_1; -#else -typedef union GNU_PACKED _TMR_D_1 { - struct { - UINT32 Pid : 8; - UINT32 TodFine : 6; - UINT32 ToAeReport : 6; - UINT32 RxvDw3Bit6 : 1; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvFrMode : 2; - UINT32 RxvTxMode : 3; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvDw1Bit29 : 1; - UINT32 TxvTxMode : 3; - } field_init; - - struct { - UINT32 RxvSn : 8; - UINT32 TodFine : 6; - UINT32 ToAeReport : 6; - UINT32 RxvDw3Bit6 : 1; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvFrMode : 2; - UINT32 RxvTxMode : 3; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvDw1Bit29 : 1; - UINT32 TxvTxMode : 3; - } field_resp; - - UINT32 word; -} TMR_D_1, *PTMR_D_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMR_D_2 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_2 { - struct { - UINT32 SnField : 16; - UINT32 Ta0 : 16; - } field; - - UINT32 word; -} TMR_D_2, *PTMR_D_2; -#else -typedef union GNU_PACKED _TMR_D_2 { - struct { - UINT32 Ta0 : 16; - UINT32 SnField : 16; - } field; - - UINT32 word; -} TMR_D_2, *PTMR_D_2; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMR_D_6 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_6 { - struct { - UINT32 ToA32 : 16; - UINT32 ToD32 : 16; - } field; - - UINT32 word; -} TMR_D_6, *PTMR_D_6; -#else -typedef union GNU_PACKED _TMR_D_6 { - struct { - UINT32 ToD32 : 16; - UINT32 ToA32 : 16; - } field; - - UINT32 word; -} TMR_D_6, *PTMR_D_6; -#endif -/* ---UNIFIED_TXD_RXD */ - -#ifdef TMR_GEN2 -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_7 { - struct { - UINT32 Rsv : 31; - UINT32 DacOutput : 1; - } field; - - UINT32 word; -} TMR_D_7, *PTMR_D_7; -#else -typedef union GNU_PACKED _TMR_D_7 { - struct { - UINT32 DacOutput : 1; - UINT32 Rsv : 31; - } field; - - UINT32 word; -} TMR_D_7, *PTMR_D_7; -#endif /* RT_BIG_ENDIAN */ - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_8 { - struct { - UINT32 DBDC : 1; - UINT32 UnknownBit : 1; /* TODO: Carter, check with WK for detail. */ - UINT32 Rsv2 : 7; - UINT32 RmsId : 3; - UINT32 FailReason : 4; - UINT32 Rsv1 : 5; - UINT32 LtfSyncStartAddr : 11; - } field_ofdm; - - struct { - UINT32 Rsv : 29; - UINT32 FailReason : 3; - } field_cck; - - UINT32 word; -} TMR_D_8, *PTMR_D_8; -#else -typedef union GNU_PACKED _TMR_D_8 { - struct { - UINT32 FailReason : 3; - UINT32 Rsv : 29; - } field_cck; - - struct { - UINT32 LtfSyncStartAddr : 11; - UINT32 Rsv1 : 5; - UINT32 FailReason : 4; - UINT32 RmsId : 3; - UINT32 Rsv2 : 7; - UINT32 UnknownBit : 1; /* TODO: Carter, check with WK for detail. */ - UINT32 DBDC : 1; - } field_ofdm; - - UINT32 word; -} TMR_D_8, *PTMR_D_8; -#endif /* RT_BIG_ENDIAN */ -#endif /* TMR_GEN2 */ - -/****************************************************************************** - TMR_FRM_STRUC -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMR_FRM_STRUC { - struct _RMAC_RXD_0_TMR TmrD0; - TMR_D_1 TmrD1; - TMR_D_2 TmrD2; - UINT32 Ta16; - UINT32 ToD0; - UINT32 ToA0; - TMR_D_6 TmrD6; -#ifdef TMR_GEN2 - TMR_D_7 TmrD7; - TMR_D_8 TmrD8; -#endif -} TMR_FRM_STRUC, *PTMR_FRM_STRUC; -/* ---UNIFIED_TXD_RXD */ - -typedef struct wtbl_entry { - UINT8 wtbl_idx; - - struct wtbl_1_struc wtbl_1; - struct wtbl_2_struc wtbl_2; - union wtbl_3_struc wtbl_3; - struct wtbl_4_struc wtbl_4; - - UINT32 wtbl_addr[4]; - UINT16 wtbl_fid[4]; - UINT16 wtbl_eid[4]; -} WTBL_ENTRY; - -#define MT_SMAC_BA_AGG_RANGE 8 -#define MT_DMAC_BA_AGG_RANGE 8 - -#define MT_PSE_BASE_ADDR 0xa0000000 - -#define MT_TOP_REMAP_ADDR \ - 0x80000000 /* TOP start address 8002-0000, but only can remap to 8000-0000 */ -#define MT_TOP_REMAP_ADDR_THEMAL \ - 0xa2000 /* Get Thermal sensor adc cal value: 0x80022000 bits(8,14), Offset 0x80000 + 0x22000 = 0xa2000 */ -#define MT_TOP_THEMAL_ADC \ - 0x80022000 /* Get Thermal sensor adc cal value: 0x80022000 bits(8,14) */ - -#define MCU_CFG_BASE 0x2000 -#define MCU_PCIE_REMAP_1 (MCU_CFG_BASE + 0x500) -#define REMAP_1_OFFSET_MASK (0x3ffff) -#define GET_REMAP_1_OFFSET(p) (((p)&REMAP_1_OFFSET_MASK)) -#define REMAP_1_BASE_MASK (0x3fff << 18) -#define GET_REMAP_1_BASE(p) (((p)&REMAP_1_BASE_MASK) >> 18) -#define MCU_PCIE_REMAP_2 (MCU_CFG_BASE + 0x504) -#define REMAP_2_OFFSET_MASK (0x7ffff) -#define GET_REMAP_2_OFFSET(p) (((p)&REMAP_2_OFFSET_MASK)) -#define REMAP_2_BASE_MASK (0x1fff << 19) -#define GET_REMAP_2_BASE(p) (((p)&REMAP_2_BASE_MASK) >> 19) - -#define TOP_CFG_BASE 0x0000 - -#define XTAL_CTL4 (TOP_CFG_BASE + 0x1210) -#define XTAL_CTL13 (TOP_CFG_BASE + 0x1234) -#define XTAL_CTL14 (TOP_CFG_BASE + 0x1238) -#define DA_XO_C2_MASK (0x7f << 8) -#define DA_XO_C2(p) (((p)&0x7f) << 8) - -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) -#define MT_PSE_PAGE_SIZE 256 -#elif defined(MT7637_FPGA) -#define MT_PSE_PAGE_SIZE 128 -#else -#define MT_PSE_PAGE_SIZE 128 -#endif /* MT7603_FPGA */ - -#define MT_PCI_REMAP_ADDR_1 0x40000 -#define MT_PCI_REMAP_ADDR_2 0x80000 - -#define DBDC_BAND_NUM 1 -/* TODO: shiang-7603, this is a dummy data structure and need to revise to adapative for MT7603 series */ - -#define WMM_QUE_NUM 4 /* each sta has 4 Queues to mapping to each WMM AC */ - -#ifndef COMPOS_WIN -/* value domain of pTxD->HostQId (4-bit: 0~15) */ -#define QID_AC_BK 0 -#define QID_AC_BE 1 -#define QID_AC_VI 2 -#define QID_AC_VO 3 -#endif - -#define QID_HCCA 4 -#define NUM_OF_TX_RING 4 -#define NUM_OF_WMM1_TX_RING 1 - -#define QID_BMC 8 - -#define NUM_OF_RX_RING 1 -#ifdef CONFIG_ANDES_SUPPORT -#undef NUM_OF_RX_RING -#define NUM_OF_RX_RING 2 -#endif /* CONFIG_ANDES_SUPPORT */ - -#define QID_MGMT 13 -#define QID_RX 14 -#define QID_OTHER 15 -#ifdef CONFIG_ANDES_SUPPORT -#define QID_CTRL 16 -#endif /* CONFIG_ANDES_SUPPORT */ - -#define QID_BCN 17 - -#define SHAREDKEYTABLE 0 -#define PAIRWISEKEYTABLE 1 - -/* Indicate the txs report to Host or MCU */ -typedef enum { - TXS2MCU = 0, - TXS2HOST = 1, -} TXS_TARGET_PORT; - -#define TXS2MCU_AGGNUMS 31 -#define TXS2HOST_AGGNUMS 31 - -enum { - TXS2M_QID0, - TXS2M_QID1, - TXS2M_QID2, - TXS2M_QID3, -}; - -enum { - TXS2H_QID0, - TXS2H_QID1, -}; - -enum { - TXS_FORMAT0, - TXS_FORMAT1, -}; - -#define TSO_SIZE 0 - -#define EXP_ACK_TIME 0x1380 - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TX_STA_CNT0_STRUC { - struct { - UINT16 TxBeaconCount; - UINT16 TxFailCount; - } field; - UINT32 word; -} TX_STA_CNT0_STRUC; -#else -typedef union GNU_PACKED _TX_STA_CNT0_STRUC { - struct { - UINT16 TxFailCount; - UINT16 TxBeaconCount; - } field; - UINT32 word; -} TX_STA_CNT0_STRUC; -#endif - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TX_STA_CNT1_STRUC { - struct { - UINT16 TxRetransmit; - UINT16 TxSuccess; - } field; - UINT32 word; -} TX_STA_CNT1_STRUC; -#else -typedef union GNU_PACKED _TX_STA_CNT1_STRUC { - struct { - UINT16 TxSuccess; - UINT16 TxRetransmit; - } field; - UINT32 word; -} TX_STA_CNT1_STRUC; -#endif - -typedef struct __TX_CNT_INFO { - union WTBL_2_DW5 wtbl_2_d5; - union WTBL_2_DW6 wtbl_2_d6; - union WTBL_2_DW7 wtbl_2_d7; - union WTBL_2_DW8 wtbl_2_d8; - union WTBL_2_DW9 wtbl_2_d9; -} TX_CNT_INFO; - -#define E2PROM_CSR 0x0004 -#define GPIO_CTRL_CFG 0x0228 -#define WSC_HDR_BTN_GPIO_0 ((UINT32)0x00000001) /* bit 0 for RT2860/RT2870 */ -#define WSC_HDR_BTN_GPIO_3 ((UINT32)0x00000008) /* bit 3 for RT2860/RT2870 */ - -#define LEGACY_BASIC_RATE 0x1408 - -struct _RTMP_ADAPTER; - -VOID dump_mt_mac_cr(struct _RTMP_ADAPTER *pAd); - -INT mt_wtbl_init_ByFw(struct _RTMP_ADAPTER *pAd); -INT mt_wtbl_init_ByDriver(struct _RTMP_ADAPTER *pAd); -INT mt_mac_init(struct _RTMP_ADAPTER *pAd); -INT mt_hw_tb_init(struct _RTMP_ADAPTER *pAd, BOOLEAN bHardReset); - -INT mt_wtbl_get_entry234(struct _RTMP_ADAPTER *pAd, UCHAR idx, - struct wtbl_entry *ent); -VOID dump_wtbl_entry(struct _RTMP_ADAPTER *pAd, struct wtbl_entry *ent); -VOID dump_wtbl_info(struct _RTMP_ADAPTER *pAd, UINT wtbl_idx); -#ifdef CONFIG_WTBL_TLV_MODE -VOID dump_wtbl_info_ByTlv(struct _RTMP_ADAPTER *pAd, UINT wtbl_idx); -#endif -VOID dump_wtbl_base_info(struct _RTMP_ADAPTER *pAd); - -INT mt_mac_set_ctrlch(struct _RTMP_ADAPTER *pAd, UINT8 extch); -#ifdef GREENAP_SUPPORT -INT rtmp_mac_set_mmps(struct _RTMP_ADAPTER *pAd, INT ReduceCorePower); -#endif /* GREENAP_SUPPORT */ - -UINT16 tx_rate_to_tmi_rate(UINT8 mode, UINT8 mcs, UINT8 nss, BOOLEAN stbc, - UINT8 preamble); -UCHAR get_nsts_by_mcs(UCHAR phy_mode, UCHAR mcs, BOOLEAN stbc, UCHAR vht_nss); - -#define HIF_PORT 1 -#define MCU_PORT 2 -#define MT_TX_RETRY_UNLIMIT 0x1f -#define MT_TX_SHORT_RETRY 0x0f -#define MT_TX_LONG_RETRY 0x0f - -typedef struct _TX_RADIO_SET { - BOOLEAN ItxBFEnable; /* IBF */ - BOOLEAN EtxBFEnable; /* EBF */ - BOOLEAN ShortGI; - BOOLEAN Ldpc; - BOOLEAN Stbc; - UINT8 CurrentPerPktBW; /* BW_20, BW_40 for Fixed Rate */ - UINT8 Premable; - UINT8 RateCode; - UINT8 PhyMode; -} TX_RADIO_SET_T; - -typedef struct _TMAC_INFO { - UINT16 PktLen; - UINT8 WifiHdrLen; /*This80211HdrLen, wifi_hdr_len*/ - UINT8 QueIdx; - UINT8 PortIdx; - BOOLEAN UsbNextValid; /*Check with Lens*/ - UINT8 Wcid; - BOOLEAN bAckRequired; - UINT8 UserPriority; - UINT8 OwnMacIdx; - UINT32 CipherAlg; /*Q: bProtectFrame*/ - UINT8 HdrPad; /*W:LengthQosPAD*/ - UINT8 FragIdx; /*W:FragmentByteForTxD*/ - UINT8 BarSsnCtrl; - UINT8 Pid; /*W: PacketID*/ - UINT8 AntPri; - UINT8 SpeEn; - INT8 PowerOffset; - BOOLEAN TimingMeasure; - TX_RADIO_SET_T TxRadioSet; - BOOLEAN LongFmt; - BOOLEAN NeedTrans; - BOOLEAN MoreData; - BOOLEAN Eosp; - BOOLEAN EtherFrame; - BOOLEAN VlanFrame; - BOOLEAN BmcPkt; - BOOLEAN FixRate; - BOOLEAN BaDisable; - BOOLEAN TxS2Host; - BOOLEAN TxS2Mcu; - UINT8 TxSFmt; - UINT8 MaxTxTime; - UINT8 RemainTxCnt; - UINT8 MpduHdrLen; - UINT16 FrmType; - UINT16 SubType; - UINT16 Sn; - UINT8 VhtNss; - UCHAR band_idx; -} TMAC_INFO; - -VOID MtWriteTMacInfo(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TMAC_INFO *TxInfo); - -VOID mt_chip_info_show(struct _RTMP_ADAPTER *pAd); -INT mt_nic_asic_init(struct _RTMP_ADAPTER *pAd); - -#endif /* __MT_MAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/mt_smac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/mt_smac.h deleted file mode 100644 index fcd28ba200..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/mt_smac.h +++ /dev/null @@ -1,1966 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_smac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __MT_SMAC_H__ -#define __MT_SMAC_H__ - -#include "mac/mac_mt/top.h" -#include "mac/mac_mt/smac/gpio.h" -#include "mac/mac_mt/smac/wf_agg.h" -#include "mac/mac_mt/smac/wf_aon.h" -#include "mac/mac_mt/smac/wf_arb.h" -#include "mac/mac_mt/smac/wf_cfgoff.h" -#include "mac/mac_mt/smac/wf_dma.h" -#include "mac/mac_mt/smac/wf_lpon_top.h" -#include "mac/mac_mt/smac/wf_mib.h" -#include "mac/mac_mt/smac/wf_pf.h" -#include "mac/mac_mt/smac/wf_rmac.h" -#include "mac/mac_mt/smac/wf_sec.h" -#include "mac/mac_mt/smac/wf_tmac.h" -#include "mac/mac_mt/smac/wf_trb.h" -#include "mac/mac_mt/smac/wf_wtbloff.h" -#include "mac/mac_mt/smac/wf_wtblon.h" -#include "mac/mac_mt/smac/wf_int_wakeup_top.h" -#include "mac/mac_mt/smac/client.h" -#include "mac/mac_mt/smac/wf_wtbl.h" -#include "mac/mac_mt/smac/wf_phy.h" -#include "mac/mac_mt/smac/pse.h" - -#ifdef DMA_SCH_SUPPORT -#include "mac/mac_mt/smac/dma_sch.h" -#endif /* DMA_SCH_SUPPORT */ - -#ifndef COMPOS_WIN -#endif /* COMPOS_WIN */ - -/* - TX / RX descriptor format - - TX: - PCI/RBUS_DMA_Descriptor + TXD + 802.11 - - Rx: - PCI/RBUS/USB_DMA_Descripotr + RXD + 802.11 + RX_CSO_INFO -*/ - -#define FIFO_MGMT 0 -#define FIFO_HCCA 1 -#define FIFO_EDCA 2 - -#ifdef MAC_REPEATER_SUPPORT -#define MAX_EXT_MAC_ADDR_SIZE 16 -/* TODO: Carter, single driver case? */ -#endif /* MAC_REPEATER_SUPPORT */ - -/****************************************************************************** - LMAC TxD - - TMAC_TXD_0 - TMAC_TXD_1 - TMAC_TXD_2 - TMAC_TXD_3 - -******************************************************************************/ - -/****************************************************************************** - TMAC_TXD_0 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_0 { - /* DWORD 0 */ - UINT32 PIdx : 1; - UINT32 QIdx : 4; - UINT32 UTxB : 1; - UINT32 UNxV : 1; - UINT32 UTChkSum : 1; - UINT32 IpChkSum : 1; - UINT32 EthTypeOffset : 7; - UINT32 TxByteCount : 16; -} TMAC_TXD_0, *PTMAC_TXD_0; -#else -typedef struct GNU_PACKED _TMAC_TXD_0 { - /* DWORD 0 */ - UINT32 TxByteCount : 16; - UINT32 EthTypeOffset : 7; - UINT32 IpChkSum : 1; - UINT32 UTChkSum : 1; - UINT32 UNxV : 1; - UINT32 UTxB : 1; - UINT32 QIdx : 4; - UINT32 PIdx : 1; -} TMAC_TXD_0, *PTMAC_TXD_0; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* TMAC_TXD_0.PIdx */ -#define P_IDX_LMAC 0 -#define P_IDX_MCU 1 - -/* TMAC_TXD_0.QIdx */ -#define Q_IDX_AC0 0x00 -#define Q_IDX_AC1 0x01 -#define Q_IDX_AC2 0x02 -#define Q_IDX_AC3 0x03 -#define Q_IDX_AC4 0x04 -#define Q_IDX_AC5 0x05 -#define Q_IDX_AC6 0x06 -#define Q_IDX_BCN 0x07 -#define TxQ_IDX_BCN0 Q_IDX_BCN -#define Q_IDX_BMC 0x08 -#define Q_IDX_AC10 0x09 -#define Q_IDX_AC11 0x0a -#define Q_IDX_AC12 0x0b -#define Q_IDX_AC13 0x0c -#define Q_IDX_AC14 0x0d - -#define Q_IDX_RQ0 0x00 -#define Q_IDX_RQ1 0x01 -#define Q_IDX_RQ2 0x02 -#define Q_IDX_RQ3 0x03 - -/* TMAC_TXD_0.PIdx + TMAC_TXD_0.QIdx */ -#define PQ_IDX_LMAC_AC0 ((P_IDX_LMAC << 4) | (Q_IDX_AC0)) -#define PQ_IDX_LMAC_AC1 ((P_IDX_LMAC << 4) | (Q_IDX_AC1)) -#define PQ_IDX_LMAC_AC2 ((P_IDX_LMAC << 4) | (Q_IDX_AC2)) -#define PQ_IDX_LMAC_AC3 ((P_IDX_LMAC << 4) | (Q_IDX_AC3)) -#define PQ_IDX_LMAC_AC4 ((P_IDX_LMAC << 4) | (Q_IDX_AC4)) -#define PQ_IDX_LMAC_AC5 ((P_IDX_LMAC << 4) | (Q_IDX_AC5)) -#define PQ_IDX_LMAC_AC6 ((P_IDX_LMAC << 4) | (Q_IDX_AC6)) -#define PQ_IDX_LMAC_BCN ((P_IDX_LMAC << 4) | (Q_IDX_BCN)) -#define PQ_IDX_LMAC_BMC ((P_IDX_LMAC << 4) | (Q_IDX_BMC)) -#define PQ_IDX_LMAC_AC10 ((P_IDX_LMAC << 4) | (Q_IDX_AC10)) -#define PQ_IDX_LMAC_AC11 ((P_IDX_LMAC << 4) | (Q_IDX_AC11)) -#define PQ_IDX_LMAC_AC12 ((P_IDX_LMAC << 4) | (Q_IDX_AC12)) -#define PQ_IDX_LMAC_AC13 ((P_IDX_LMAC << 4) | (Q_IDX_AC13)) -#define PQ_IDX_LMAC_AC14 ((P_IDX_LMAC << 4) | (Q_IDX_AC14)) - -#define PQ_IDX_MCU_RQ0 ((P_IDX_MCU << 4) | (Q_IDX_RQ0)) -#define PQ_IDX_MCU_RQ1 ((P_IDX_MCU << 4) | (Q_IDX_RQ1)) -#define PQ_IDX_MCU_RQ2 ((P_IDX_MCU << 4) | (Q_IDX_RQ2)) -#define PQ_IDX_MCU_RQ3 ((P_IDX_MCU << 4) | (Q_IDX_RQ3)) - -/****************************************************************************** - TMAC_TXD_1 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_1 { - /* DWORD 1 */ - UINT32 OwnMacAddr : 6; - UINT32 Rsv24to25 : 2; - UINT32 ProtectFrame : 1; - UINT32 Tid : 3; - UINT32 NoAck : 1; - UINT32 HdrPad : 3; - UINT32 TxDFmt : 1; - UINT32 HdrFmt : 2; - UINT32 HdrInfo : 5; - UINT32 WlanIdx : 8; -} TMAC_TXD_1, *PTMAC_TXD_1; -#else -typedef struct GNU_PACKED _TMAC_TXD_1 { - /* DWORD 1 */ - UINT32 WlanIdx : 8; - UINT32 HdrInfo : 5; - UINT32 HdrFmt : 2; - UINT32 TxDFmt : 1; - UINT32 HdrPad : 3; - UINT32 NoAck : 1; - UINT32 Tid : 3; - UINT32 ProtectFrame : 1; - UINT32 Rsv24to25 : 2; - UINT32 OwnMacAddr : 6; -} TMAC_TXD_1, *PTMAC_TXD_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* TMAC_TXD_1.HdrFmt */ -#define TMI_HDR_FT_NON_80211 0x0 -#define TMI_HDR_FT_CMD 0x1 -#define TMI_HDR_FT_NOR_80211 0x2 -#define TMI_HDR_FT_ENH_80211 0x3 - -/* - TMAC_TXD_1.HdrInfo -*/ -/* if TMAC_TXD_1.HdrFmt == HDR_FORMAT_NON_80211 */ -#define TMI_HDR_INFO_0_BIT_MRD 0 -#define TMI_HDR_INFO_0_BIT_EOSP 1 -#define TMI_HDR_INFO_0_BIT_RMVL 2 -#define TMI_HDR_INFO_0_BIT_VLAN 3 -#define TMI_HDR_INFO_0_BIT_ETYP 4 -#define TMI_HDR_INFO_0_VAL(_mrd, _eosp, _rmvl, _vlan, _etyp) \ - ((((_mrd) ? 1 : 0) << TMI_HDR_INFO_0_BIT_MRD) | \ - (((_eosp) ? 1 : 0) << TMI_HDR_INFO_0_BIT_EOSP) | \ - (((_rmvl) ? 1 : 0) << TMI_HDR_INFO_0_BIT_RMVL) | \ - (((_vlan) ? 1 : 0) << TMI_HDR_INFO_0_BIT_VLAN) | \ - (((_etyp) ? 1 : 0) << TMI_HDR_INFO_0_BIT_ETYP)) - -/* if TMAC_TXD_1.HdrFmt == HDR_FORMAT_CMD */ -#define TMI_HDR_INFO_1_MASK_RSV (0x1f) -#define TMI_HDR_INFO_1_VAL 0 - -/* if TMAC_TXD_1.HdrFmt == HDR_FORMAT_NOR_80211 */ -#define TMI_HDR_INFO_2_MASK_LEN (0x1f) -#define TMI_HDR_INFO_2_VAL(_len) (_len >> 1) - -/* if TMAC_TXD_1.HdrFmt == HDR_FORMAT_ENH_80211 */ -#define TMI_HDR_INFO_3_BIT_EOSP 1 -#define TMI_HDR_INFO_3_BIT_AMS 2 -#define TMI_HDR_INFO_3_VAL(_eosp, _ams) \ - ((((_eosp) ? 1 : 0) << TMI_HDR_INFO_3_BIT_EOSP) | \ - (((_ams) ? 1 : 0) << TMI_HDR_INFO_3_BIT_AMS)) - -#define TMI_HDR_INFO_VAL(_fmt, _mrd, _eosp, _rmvl, _vlan, _etype, _len, _ams, \ - _val) \ - do { \ - switch (_fmt) { \ - case TMI_HDR_FT_NON_80211: \ - (_val) = TMI_HDR_INFO_0_VAL((_mrd), (_eosp), (_rmvl), \ - (_vlan), (_etype)); \ - break; \ - case TMI_HDR_FT_CMD: \ - (_val) = TMI_HDR_INFO_1_VAL; \ - break; \ - case TMI_HDR_FT_NOR_80211: \ - ASSERT((((_len)&1) == 0)); \ - (_val) = TMI_HDR_INFO_2_VAL((_len)); \ - break; \ - case TMI_HDR_FT_ENH_80211: \ - (_val) = TMI_HDR_INFO_3_VAL((_eosp), (_ams)); \ - default: \ - (_val) = 0; \ - } \ - } while (0) - -/* TMAC_TXD_1.TxDFmt */ -#define TMI_FT_SHORT 0 -#define TMI_FT_LONG 1 - -/* TMAC_TXD_1.HdrPad */ -#define TMI_HDR_PAD_BIT_MODE 2 -#define TMI_HDR_PAD_MODE_TAIL 0 -#define TMI_HDR_PAD_MODE_HEAD 1 -#define TMI_HDR_PAD_BIT_LEN 0 -#define TMI_HDR_PAD_MASK_LEN 0x3 - -/****************************************************************************** - TMAC_TXD_2 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_2 { - /* DWORD 2 */ - UINT32 FixRate : 1; - UINT32 TimingMeasure : 1; - UINT32 BaDisable : 1; - UINT32 PwrOffset : 5; - UINT32 MaxTxTime : 8; - UINT32 Frag : 2; - UINT32 HtcExist : 1; - UINT32 Duration : 1; - UINT32 Bip : 1; - UINT32 BmcPkt : 1; - UINT32 Rts : 1; - UINT32 Sounding : 1; - UINT32 Ndpa : 1; - UINT32 Ndp : 1; - UINT32 FrmType : 2; - UINT32 SubType : 4; -} TMAC_TXD_2, *PTMAC_TXD_2; -#else -typedef struct GNU_PACKED _TMAC_TXD_2 { - /* DWORD 2 */ - UINT32 SubType : 4; - UINT32 FrmType : 2; - UINT32 Ndp : 1; - UINT32 Ndpa : 1; - UINT32 Sounding : 1; - UINT32 Rts : 1; - UINT32 BmcPkt : 1; - UINT32 Bip : 1; - UINT32 Duration : 1; - UINT32 HtcExist : 1; - UINT32 Frag : 2; - UINT32 MaxTxTime : 8; - UINT32 PwrOffset : 5; - UINT32 BaDisable : 1; - UINT32 TimingMeasure : 1; - UINT32 FixRate : 1; -} TMAC_TXD_2, *PTMAC_TXD_2; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMAC_TXD_3 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_3 { - /* DWORD 3 */ - UINT32 SnVld : 1; - UINT32 PnVld : 1; - UINT32 Rsv28to29 : 2; - UINT32 Sn : 12; - UINT32 RemainTxCnt : 5; - UINT32 TxCnt : 5; - UINT32 Rsv0to5 : 6; -} TMAC_TXD_3, *PTMAC_TXD_3; -#else -typedef struct GNU_PACKED _TMAC_TXD_3 { - /* DWORD 3 */ - UINT32 Rsv0to5 : 6; - UINT32 TxCnt : 5; - UINT32 RemainTxCnt : 5; - UINT32 Sn : 12; - UINT32 Rsv28to29 : 2; - UINT32 PnVld : 1; - UINT32 SnVld : 1; -} TMAC_TXD_3, *PTMAC_TXD_3; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMAC_TXD_4 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMAC_TXD_4 { - UINT32 PktNumLow; -} TMAC_TXD_4, *PTMAC_TXD_4; -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMAC_TXD_5 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_5 { - UINT32 PktNumHigh : 16; - UINT32 Rsv : 2; - UINT32 PwrMgmt : 1; - UINT32 BarSsnCtrl : 1; - UINT32 DataSrcSelect : 1; - UINT32 TxS2Host : 1; - UINT32 TxS2Mcu : 1; - UINT32 TxSFmt : 1; - UINT32 PktId : 8; -} TMAC_TXD_5, *PTMAC_TXD_5; -#else -typedef struct GNU_PACKED _TMAC_TXD_5 { - UINT32 PktId : 8; - UINT32 TxSFmt : 1; - UINT32 TxS2Mcu : 1; - UINT32 TxS2Host : 1; - UINT32 DataSrcSelect : 1; - UINT32 BarSsnCtrl : 1; - UINT32 PwrMgmt : 1; - UINT32 Rsv : 2; - UINT32 PktNumHigh : 16; -} TMAC_TXD_5, *PTMAC_TXD_5; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* TMAC_TXD_5.DataSrcSelect */ -#define TMI_DAS_FROM_MPDU 0 -#define TMI_DAS_FROM_WTBL 1 - -/* TMAC_TXD_5.BarSsnCtrl */ -#define TMI_BSN_CFG_BY_HW 0 -#define TMI_BSN_CFG_BY_SW 1 - -/* TMAC_TXD_5.PwrMgmt */ -#define TMI_PM_BIT_CFG_BY_HW 0 -#define TMI_PM_BIT_CFG_BY_SW 1 - -/****************************************************************************** - TMAC_TXD_6 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TMAC_TXD_6 { - UINT32 GI : 1; - UINT32 LDPC : 1; - UINT32 RateToBeFixed : 12; - UINT32 ImplicitBf : 1; - UINT32 ExplicitBf : 1; - UINT32 DynamicBw : 1; - UINT32 AntPri : 3; - UINT32 SpeExtEnable : 1; - UINT32 FixedBwMode : 3; - UINT32 AntIdx : 6; - UINT32 Rsv : 1; - UINT32 FixedRateMode : 1; -} TMAC_TXD_6, *PTMAC_TXD_6; -#else -typedef struct GNU_PACKED _TMAC_TXD_6 { - UINT32 FixedRateMode : 1; - UINT32 Rsv : 1; - UINT32 AntIdx : 6; - UINT32 FixedBwMode : 3; - UINT32 SpeExtEnable : 1; - UINT32 AntPri : 3; - UINT32 DynamicBw : 1; - UINT32 ExplicitBf : 1; - UINT32 ImplicitBf : 1; - UINT32 RateToBeFixed : 12; - UINT32 LDPC : 1; - UINT32 GI : 1; -} TMAC_TXD_6, *PTMAC_TXD_6; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* TMAC_TXD_6.fix_rate_mode */ -#define TMI_FIX_RATE_BY_TXD 0 -#define TMI_FIX_RATE_BY_CR 1 - -#define TMI_TX_RATE_BIT_STBC 11 -#define TMI_TX_RATE_BIT_NSS 9 -#define TMI_TX_RATE_MASK_NSS 0x3 - -#define TMI_TX_RATE_BIT_MODE 6 -#define TMI_TX_RATE_MASK_MODE 0x7 -#define TMI_TX_RATE_MODE_CCK 0 -#define TMI_TX_RATE_MODE_OFDM 1 -#define TMI_TX_RATE_MODE_HTMIX 2 -#define TMI_TX_RATE_MODE_HTGF 3 -#define TMI_TX_RATE_MODE_VHT 4 - -#define SHORT_PREAMBLE 0 -#define LONG_PREAMBLE 1 - -#define TMI_TX_RATE_BIT_MCS 0 -#define TMI_TX_RATE_MASK_MCS 0x3f -#define TMI_TX_RATE_CCK_1M_LP 0 -#define TMI_TX_RATE_CCK_2M_LP 1 -#define TMI_TX_RATE_CCK_5M_LP 2 -#define TMI_TX_RATE_CCK_11M_LP 3 - -#define TMI_TX_RATE_CCK_2M_SP 5 -#define TMI_TX_RATE_CCK_5M_SP 6 -#define TMI_TX_RATE_CCK_11M_SP 7 - -#define TMI_TX_RATE_OFDM_6M 11 -#define TMI_TX_RATE_OFDM_9M 15 -#define TMI_TX_RATE_OFDM_12M 10 -#define TMI_TX_RATE_OFDM_18M 14 -#define TMI_TX_RATE_OFDM_24M 9 -#define TMI_TX_RATE_OFDM_36M 13 -#define TMI_TX_RATE_OFDM_48M 8 -#define TMI_TX_RATE_OFDM_54M 12 - -#define TMI_TX_RATE_HT_MCS0 0 -#define TMI_TX_RATE_HT_MCS1 1 -#define TMI_TX_RATE_HT_MCS2 2 -#define TMI_TX_RATE_HT_MCS3 3 -#define TMI_TX_RATE_HT_MCS4 4 -#define TMI_TX_RATE_HT_MCS5 5 -#define TMI_TX_RATE_HT_MCS6 6 -#define TMI_TX_RATE_HT_MCS7 7 -#define TMI_TX_RATE_HT_MCS8 8 -#define TMI_TX_RATE_HT_MCS9 9 -#define TMI_TX_RATE_HT_MCS10 10 -#define TMI_TX_RATE_HT_MCS11 11 -#define TMI_TX_RATE_HT_MCS12 12 -#define TMI_TX_RATE_HT_MCS13 13 -#define TMI_TX_RATE_HT_MCS14 14 -#define TMI_TX_RATE_HT_MCS15 15 -#define TMI_TX_RATE_HT_MCS16 16 -#define TMI_TX_RATE_HT_MCS17 17 -#define TMI_TX_RATE_HT_MCS18 18 -#define TMI_TX_RATE_HT_MCS19 19 -#define TMI_TX_RATE_HT_MCS20 20 -#define TMI_TX_RATE_HT_MCS21 21 -#define TMI_TX_RATE_HT_MCS22 22 -#define TMI_TX_RATE_HT_MCS23 23 - -#define TMI_TX_RATE_HT_MCS32 32 - -#define TMI_TX_RATE_VHT_MCS0 0 -#define TMI_TX_RATE_VHT_MCS1 1 -#define TMI_TX_RATE_VHT_MCS2 2 -#define TMI_TX_RATE_VHT_MCS3 3 -#define TMI_TX_RATE_VHT_MCS4 4 -#define TMI_TX_RATE_VHT_MCS5 5 -#define TMI_TX_RATE_VHT_MCS6 6 -#define TMI_TX_RATE_VHT_MCS7 7 -#define TMI_TX_RATE_VHT_MCS8 8 -#define TMI_TX_RATE_VHT_MCS9 9 - -/****************************************************************************** - TMAC_TXD_7 -******************************************************************************/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -/* TODO: Lens, need to make more specific and clear definition for those fields! */ -typedef struct _TMAC_TXD_7 { - UINT32 SwUseNonQoS : 1; /* remove */ - UINT32 SwUseSegmentEnd : 1; - UINT32 SwUseAMSDU : 1; /* remove */ - UINT32 SwUseUSB4ByteAlign : 2; /* remove */ - UINT32 SwUseSegIdx : 6; - UINT32 SwFieldReserve : 5; - UINT32 SchdTxTime : 16; -} TMAC_TXD_7, *PTMAC_TXD_7; -#else -typedef struct _TMAC_TXD_7 { - UINT32 SchdTxTime : 16; - UINT32 SwFieldReserve : 5; - UINT32 SwUseSegIdx : 6; - UINT32 SwUseUSB4ByteAlign : 2; - UINT32 SwUseAMSDU : 1; - UINT32 SwUseSegmentEnd : 1; - UINT32 SwUseNonQoS : 1; -} TMAC_TXD_7, *PTMAC_TXD_7; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TX Descriptor in Long Format (TMAC_TXD_1.FT = 1) - which including TMAC_TXD_0~ TMAC_TXD_7 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMAC_TXD_L { - TMAC_TXD_0 TxD0; - TMAC_TXD_1 TxD1; - TMAC_TXD_2 TxD2; - TMAC_TXD_3 TxD3; - TMAC_TXD_4 TxD4; - TMAC_TXD_5 TxD5; - TMAC_TXD_6 TxD6; - TMAC_TXD_7 TxD7; -} TMAC_TXD_L, *PTMAC_TXD_L; -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TX Descriptor in Short Format (TMAC_TXD_1.FT = 0) - which including TMAC_TXD_0, TMAC_TXD_1, and TMAC_TXD_7 -******************************************************************************/ -/* - TX Descriptor in Short Format (TMAC_TXD_1.FT = 0) -*/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMAC_TXD_S { - TMAC_TXD_0 TxD0; - TMAC_TXD_1 TxD1; - TMAC_TXD_7 TxD7; -} TMAC_TXD_S, *PTMAC_TXD_S; -/* ---UNIFIED_TXD_RXD */ - -typedef struct _TXV1_MAC2PHY { - UCHAR txrate; - UCHAR STBC; - UCHAR Ldpc_Bcc; - UCHAR Ness; - UCHAR txmode; - UCHAR bw; - UCHAR txpower; -} TXV1_MAC2PHY; - -typedef struct _TXV2_MAC2PHY { - UCHAR agg; - UCHAR gi; - UCHAR smooth; - UCHAR sounding; - UCHAR txbf; -} TXV2_MAC2PHY; - -typedef struct _TXV3_MAC2PHY { - UCHAR bw_status; - UCHAR mac[6]; -} TXV3_MAC2PHY; - -#define RMAC_RXD_0_PKT_TYPE_MASK 0xe0000000 -#define RMAC_RX_PKT_TYPE_RX_TXS 0x00 -#define RMAC_RX_PKT_TYPE_RX_TXRXV 0x01 -#define RMAC_RX_PKT_TYPE_RX_NORMAL 0x02 -#define RMAC_RX_PKT_TYPE_RX_DUP_RFB 0x03 -#define RMAC_RX_PKT_TYPE_RX_TMR 0x04 -#define RMAC_RX_PKT_TYPE_RETRIEVE 0x05 -#define RMAC_RX_PKT_TYPE_RX_EVENT 0x07 -#define RMAC_RX_PKT_TYPE(_x) (((_x)&RMAC_RXD_0_PKT_TYPE_MASK) >> 29) -#define RMAC_RXD_0_PKT_RX_BYTE_COUNT_MASK 0x0000ffff -#define RMAC_RX_PKT_RX_BYTE_COUNT(_x) (((_x)&RMAC_RXD_0_PKT_RX_BYTE_COUNT_MASK)) - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TXS { - UINT32 TxSPktType : 3; - UINT32 TxSRsv : 8; - UINT32 TxSCnt : 5; - UINT32 TxSRxByteCnt : 16; -} RMAC_RXD_0_TXS, *PRMAC_RXD_0_TXS; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TXS { - UINT32 TxSRxByteCnt : 16; - UINT32 TxSCnt : 5; - UINT32 TxSRsv : 8; - UINT32 TxSPktType : 3; -} RMAC_RXD_0_TXS, *PRMAC_RXD_0_TXS; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TXRXV { - UINT32 PktType : 3; - UINT32 Rsv : 8; - UINT32 RxvCnt : 5; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0_TXRXV, *PRMAC_RXD_0_TXRXV; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TXRXV { - UINT32 RxByteCnt : 16; - UINT32 RxvCnt : 5; - UINT32 Rsv : 8; - UINT32 PktType : 3; -} RMAC_RXD_0_TXRXV, *PRMAC_RXD_0_TXRXV; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - LMAC RxD - - RMAC_RXD_0 - RMAC_RXD_1 - RMAC_RXD_2 - RMAC_RXD_3 - -******************************************************************************/ - -/****************************************************************************** - RMAC_RXD_0 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0 { - UINT32 PktType : 3; - UINT32 RfbGroupVld : 4; - UINT32 UdpTcpChkSumOffload : 1; - UINT32 IpChkSumOffload : 1; - UINT32 EthTypeOffset : 7; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0, *PRMAC_RXD_0; -#else -typedef struct GNU_PACKED _RMAC_RXD_0 { - UINT32 RxByteCnt : 16; - UINT32 EthTypeOffset : 7; - UINT32 IpChkSumOffload : 1; - UINT32 UdpTcpChkSumOffload : 1; - UINT32 RfbGroupVld : 4; - UINT32 PktType : 3; -} RMAC_RXD_0, *PRMAC_RXD_0; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - RMAC_RXD_1 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_1 { - UINT32 RxDBssidIdx : 6; - UINT32 PayloadFmt : 2; - UINT32 HdrTranslation : 1; - UINT32 HdrOffset : 1; - UINT32 MacHdrLen : 6; - UINT32 ChFreq : 8; - UINT32 KeyId : 2; - UINT32 BcnWithUCast : 1; - UINT32 BcnWithBMcst : 1; - UINT32 Bcast : 1; - UINT32 Mcast : 1; - UINT32 UcastToMe : 1; - UINT32 HTC : 1; -} RMAC_RXD_1, *PRMAC_RXD_1; -#else -typedef struct GNU_PACKED _RMAC_RXD_1 { - UINT32 HTC : 1; - UINT32 UcastToMe : 1; - UINT32 Mcast : 1; - UINT32 Bcast : 1; - UINT32 BcnWithBMcst : 1; - UINT32 BcnWithUCast : 1; - UINT32 KeyId : 2; - UINT32 ChFreq : 8; - UINT32 MacHdrLen : 6; - UINT32 HdrOffset : 1; - UINT32 HdrTranslation : 1; - UINT32 PayloadFmt : 2; - UINT32 RxDBssidIdx : 6; -} RMAC_RXD_1, *PRMAC_RXD_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - RMAC_RXD_2 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_2 { - UINT32 NonAmpduFrm : 1; - UINT32 NonAmpduSfrm : 1; - UINT32 NonDataFrm : 1; - UINT32 NullFrm : 1; - UINT32 FragFrm : 1; - UINT32 UdfVlanType : 1; - UINT32 LlcMis : 1; - UINT32 ExMaxRxLen : 1; - UINT32 DeAmsduFail : 1; - UINT32 LenMis : 1; - UINT32 TkipMicErr : 1; - UINT32 IcvErr : 1; - UINT32 CipherLenMis : 1; - UINT32 CipherMis : 1; - UINT32 FcsErr : 1; - UINT32 SwBit : 1; - UINT32 SecMode : 4; - UINT32 RxDTid : 4; - UINT32 RxDWlanIdx : 8; -} RMAC_RXD_2, *PRMAC_RXD_2; -#else -typedef struct GNU_PACKED _RMAC_RXD_2 { - UINT32 RxDWlanIdx : 8; - UINT32 RxDTid : 4; - UINT32 SecMode : 4; - UINT32 SwBit : 1; - UINT32 FcsErr : 1; - UINT32 CipherMis : 1; - UINT32 CipherLenMis : 1; - UINT32 IcvErr : 1; - UINT32 TkipMicErr : 1; - UINT32 LenMis : 1; - UINT32 DeAmsduFail : 1; - UINT32 ExMaxRxLen : 1; - UINT32 LlcMis : 1; - UINT32 UdfVlanType : 1; - UINT32 FragFrm : 1; - UINT32 NullFrm : 1; - UINT32 NonDataFrm : 1; - UINT32 NonAmpduSfrm : 1; - UINT32 NonAmpduFrm : 1; -} RMAC_RXD_2, *PRMAC_RXD_2; -#endif -/* ---UNIFIED_TXD_RXD */ - -/*//do unify -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED rmac_rxd_3_normal { - UINT32 pf_sts:2; - UINT32 pf_mode:1; - UINT32 cls_bitmap:10; - UINT32 wol:5; - UINT32 magic_pkt:1; - UINT32 OFLD:2; - UINT32 cls:1; - UINT32 pattern_drop_bit:1; - UINT32 tsf_compare_loss:1; - UINT32 rx_vector_seq:8; -} RMAC_RXD_3_NORMAL; -#else -typedef struct GNU_PACKED rmac_rxd_3_normal { - UINT32 rx_vector_seq:8; - UINT32 tsf_compare_loss:1; - UINT32 pattern_drop_bit:1; - UINT32 cls:1; - UINT32 OFLD:2; - UINT32 magic_pkt:1; - UINT32 wol:5; - UINT32 cls_bitmap:10; - UINT32 pf_mode:1; - UINT32 pf_sts:2; -} RMAC_RXD_3_NORMAL; -#endif -*/ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_0_TMR { - UINT32 PktType : 3; - UINT32 IR : 1; - UINT32 TodVld : 1; - UINT32 ToaVld : 1; - UINT32 Type : 2; - UINT32 SubType : 4; - UINT32 Tmf : 1; - UINT32 Nc : 1; - UINT32 TxVFrmMode : 2; - UINT32 RxByteCnt : 16; -} RMAC_RXD_0_TMR, *PRMAC_RXD_0_TMR; -#else -typedef struct GNU_PACKED _RMAC_RXD_0_TMR { - UINT32 RxByteCnt : 16; - UINT32 TxVFrmMode : 2; - UINT32 Nc : 1; - UINT32 Tmf : 1; - UINT32 SubType : 4; - UINT32 Type : 2; - UINT32 ToaVld : 1; - UINT32 TodVld : 1; - UINT32 IR : 1; - UINT32 PktType : 3; -} RMAC_RXD_0_TMR, *PRMAC_RXD_0_TMR; -#endif -/* ---UNIFIED_TXD_RXD */ - -typedef union GNU_PACKED _RMAC_RXD_0_UNION { - struct _RMAC_RXD_0_TXS TxSD0; - struct _RMAC_RXD_0 RxD0; - struct _RMAC_RXD_0_TXRXV RxvD0; - struct _RMAC_RXD_0_TMR TmrD0; - UINT32 word; -} RMAC_RXD_0_UNION, *PRMAC_RXD_0_UNION; - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_3 { - UINT32 PfStatus : 2; - UINT32 PfMode : 1; - UINT32 ClsBitMap : 10; - UINT32 WoWlan : 5; - UINT32 MgcPkt : 1; - UINT32 OfldPf : 2; - UINT32 ClsPkt : 1; - UINT32 Drop : 1; - UINT32 Tcl : 1; - UINT32 RxVSeq : 8; -} RMAC_RXD_3, *PRMAC_RXD_3; -#else -typedef struct GNU_PACKED _RMAC_RXD_3 { - UINT32 RxVSeq : 8; - UINT32 Tcl : 1; - UINT32 Drop : 1; - UINT32 ClsPkt : 1; - UINT32 OfldPf : 2; - UINT32 MgcPkt : 1; - UINT32 WoWlan : 5; - UINT32 ClsBitMap : 10; - UINT32 PfMode : 1; - UINT32 PfStatus : 2; -} RMAC_RXD_3, *PRMAC_RXD_3; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -/* - Rx Normal Data frame Format -*/ -typedef struct GNU_PACKED _RXD_BASE_STRUCT { - /* DWORD 0 */ - struct _RMAC_RXD_0 RxD0; - /* DWORD 1 */ - struct _RMAC_RXD_1 RxD1; - /* DWORD 2 */ - struct _RMAC_RXD_2 RxD2; - /* DWORD 3 */ - /* struct rmac_rxd_3_normal RxD3;//do unify */ - struct _RMAC_RXD_3 RxD3; -} RXD_BASE_STRUCT, *PRXD_BASE_STRUCT; -/* ---UNIFIED_TXD_RXD */ - -#define RXS_GROUP1 (1 << 0) -#define RXS_GROUP2 (1 << 1) -#define RXS_GROUP3 (1 << 2) -#define RXS_GROUP4 (1 << 3) - -#define RMAC_INFO_BASE_SIZE 16 -#define RMAC_INFO_GRP_1_SIZE 16 -#define RMAC_INFO_GRP_2_SIZE 8 -#define RMAC_INFO_GRP_3_SIZE 24 -#define RMAC_INFO_GRP_4_SIZE 16 - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_4 { - /* DW4 */ - UINT32 TA0 : 16; - UINT32 FrmCtrl : 16; -} RMAC_RXD_4, *PRMAC_RXD_4; -#else -typedef struct GNU_PACKED _RMAC_RXD_4 { - /* DW4 */ - UINT32 FrmCtrl : 16; - UINT32 TA0 : 16; -} RMAC_RXD_4, *PRMAC_RXD_4; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_5 { - UINT32 TA1; -} RMAC_RXD_5, *PRMAC_RXD_5; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RMAC_RXD_6 { - UINT32 QoS : 16; - UINT32 Seq : 12; - UINT32 Frag : 4; -} RMAC_RXD_6, *PRMAC_RXD_6; -#else -typedef struct GNU_PACKED _RMAC_RXD_6 { - UINT32 Frag : 4; - UINT32 Seq : 12; - UINT32 QoS : 16; -} RMAC_RXD_6, *PRMAC_RXD_6; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_7 { - UINT32 HTCtrl; -} RMAC_RXD_7, *PRMAC_RXD_7; - -typedef struct GNU_PACKED _RXD_GRP4_STRUCT { - /* DWORD 4 */ - struct _RMAC_RXD_4 rxd_4; - - /* DWORD 5 */ - struct _RMAC_RXD_5 rxd_5; - - /* DWORD 6 */ - struct _RMAC_RXD_6 rxd_6; - - /* DWORD 7 */ - struct _RMAC_RXD_7 rxd_7; -} RXD_GRP4_STRUCT; - -typedef union GNU_PACKED _RMAC_RXD_8 { - UINT32 RscPn0; - UINT32 WPIPn0; - UINT32 Word; -} RMAC_RXD_8, *PRMAC_RXD_8; - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _RMAC_RXD_9 { - struct { - UINT32 Rsv : 16; - UINT32 PN : 16; - } RscPn1; - UINT32 WPIPn1; - UINT32 Word; -} RMAC_RXD_9, *PRMAC_RXD_9; -#else -typedef union GNU_PACKED _RMAC_RXD_9 { - struct { - UINT32 PN : 16; - UINT32 Rsv : 16; - } RscPn1; - UINT32 WPIPn1; - UINT32 Word; -} RMAC_RXD_9, *PRMAC_RXD_9; -#endif - -typedef struct GNU_PACKED _RMAC_RXD_10 { - UINT32 WpiPn2; -} RMAC_RXD_10, *PRMAC_RXD_10; - -typedef struct GNU_PACKED _RMAC_RXD_11 { - UINT32 WpiPn3; -} RMAC_RXD_11, *PRMAC_RXD_11; - -typedef struct GNU_PACKED _RXD_GRP1_STRUCT { - /* DWORD 8 */ - union _RMAC_RXD_8 rxd_8; - - /* DWORD 9 */ - union _RMAC_RXD_9 rxd_9; - - /* DWORD 10 */ - struct _RMAC_RXD_10 rxd_10; - - /* DWORD 11 */ - struct _RMAC_RXD_11 rxd_11; -} RXD_GRP1_STRUCT; - -typedef struct GNU_PACKED _RMAC_RXD_12 { - UINT32 Timestamp; -} RMAC_RXD_12, *PRMAC_RXD_12; - -typedef struct GNU_PACKED _RMAC_RXD_13 { - UINT32 Crc; -} RMAC_RXD_13, *PRMAC_RXD_13; - -typedef struct GNU_PACKED _RXD_GRP2_STRUCT { - /* DWORD 12 */ - struct _RMAC_RXD_12 rxd_12; - - /* DWORD 13 */ - struct _RMAC_RXD_13 rxd_13; -} RXD_GRP2_STRUCT; - -typedef struct GNU_PACKED _RMAC_RXD_14 { - UINT32 RxVCycle1; -} RMAC_RXD_14, *PRMAC_RXD_14; - -typedef struct GNU_PACKED _RMAC_RXD_15 { - UINT32 RxVCycle2; -} RMAC_RXD_15, *PRMAC_RXD_15; - -typedef struct GNU_PACKED _RMAC_RXD_16 { - UINT32 RxVCycle3; -} RMAC_RXD_16, *PRMAC_RXD_16; - -typedef struct GNU_PACKED _RMAC_RXD_17 { - UINT32 RxVCycle4; -} RMAC_RXD_17, *PRMAC_RXD_17; - -typedef struct GNU_PACKED _RMAC_RXD_18 { - UINT32 RxVCycle5; -} RMAC_RXD_18, *PRMAC_RXD_18; - -typedef struct GNU_PACKED _RMAC_RXD_19 { - UINT32 RxVCycle6; -} RMAC_RXD_19, *PRMAC_RXD_19; - -typedef struct GNU_PACKED _RXD_GRP3_STRUCT { - /* DWORD 13 */ - struct _RMAC_RXD_13 rxd_13; - - /* DWORD 14 */ - struct _RMAC_RXD_14 rxd_14; - - /* DWORD 15 */ - struct _RMAC_RXD_15 rxd_15; - - /* DWORD 16 */ - struct _RMAC_RXD_16 rxd_16; - - /* DWORD 17 */ - struct _RMAC_RXD_17 rxd_17; - - /* DWORD 18 */ - struct _RMAC_RXD_18 rxd_18; - - /* DWORD 19 */ - struct _RMAC_RXD_19 rxd_19; - -} RXD_GRP3_STRUCT; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_CSO_STRUCT { - UINT32 Rsv11to31 : 21; - UINT32 UnknownNextHdr : 1; - UINT32 IpFrag : 1; - UINT32 IpLenMismatch : 1; - UINT32 ChksumType : 4; - UINT32 ChksumStatus : 4; -} RX_CSO_STRUCT; -#else -typedef struct GNU_PACKED _RX_CSO_STRUCT { - UINT32 ChksumStatus : 4; - UINT32 ChksumType : 4; - UINT32 IpLenMismatch : 1; - UINT32 IpFrag : 1; - UINT32 UnknownNextHdr : 1; - UINT32 Rsv11to31 : 21; -} RX_CSO_STRUCT; -#endif - -/****************************************************************************** - LMAC TxS Structure - - TXS_D_0 - TXS_D_1 - TXS_D_2 - TXS_D_3 - TXS_D_4 -******************************************************************************/ - -/****************************************************************************** - TXS_D_0 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -/* TX Status Report Format */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_0 { - UINT32 AntId : 6; - UINT32 Tid : 3; - UINT32 BAFail : 1; - UINT32 PSBit : 1; - UINT32 TxOp : 1; - UINT32 BE : 1; - UINT32 LE : 1; - UINT32 RE : 1; - UINT32 ME : 1; - UINT32 TxS2H : 1; - UINT32 TxS2M : 1; - UINT32 TxSFmt : 1; - UINT32 TxS_FR : 1; - UINT32 TxRate : 12; -} TXS_D_0, *PTXS_D_0; -#else -typedef struct GNU_PACKED _TXS_D_0 { - UINT32 TxRate : 12; - UINT32 TxS_FR : 1; - UINT32 TxSFmt : 1; - UINT32 TxS2M : 1; - UINT32 TxS2H : 1; - UINT32 ME : 1; - UINT32 RE : 1; - UINT32 LE : 1; - UINT32 BE : 1; - UINT32 TxOp : 1; - UINT32 PSBit : 1; - UINT32 BAFail : 1; - UINT32 Tid : 3; - UINT32 AntId : 6; -} TXS_D_0, *PTXS_D_0; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TXS_D_1 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TXS_D_1 { - struct { - UINT32 Rsv : 8; - UINT32 Noise2 : 8; - UINT32 Noise1 : 8; - UINT32 Noise0 : 8; - } FieldNoise; - - UINT32 TimeStamp; - - UINT32 Word; -} TXS_D_1, *PTXS_D_1; -#else -typedef union GNU_PACKED _TXS_D_1 { - struct { - UINT32 Noise0 : 8; - UINT32 Noise1 : 8; - UINT32 Noise2 : 8; - UINT32 Rsv : 8; - } FieldNoise; - - UINT32 TimeStamp; - - UINT32 Word; -} TXS_D_1, *PTXS_D_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TXS_D_2 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TXS_D_2 { - struct { - UINT32 TxPwrdBm : 7; - UINT32 FrontTime : 25; - } field_ft; - - struct { - UINT32 TxPwrdBm : 7; - UINT32 Rsv : 1; - UINT32 RCPI2 : 8; - UINT32 RCPI1 : 8; - UINT32 RCPI0 : 8; - } field_rcpi; - - UINT32 Word; -} TXS_D_2, *PTXS_D_2; -#else -typedef union GNU_PACKED _TXS_D_2 { - struct { - UINT32 FrontTime : 25; - UINT32 TxPwrdBm : 7; - } field_ft; - - struct { - UINT32 RCPI0 : 8; - UINT32 RCPI1 : 8; - UINT32 RCPI2 : 8; - UINT32 Rsv : 1; - UINT32 TxPwrdBm : 7; - } field_rcpi; - - UINT32 Word; -} TXS_D_2, *PTXS_D_2; -#endif - -/****************************************************************************** - TXS_D_3 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_3 { - UINT32 TxS_WlanIdx : 8; - UINT32 RXV_SN : 8; - UINT32 TxDelay : 16; -} TXS_D_3, *PTXS_D_3; -#else -typedef struct GNU_PACKED _TXS_D_3 { - UINT32 TxDelay : 16; - UINT32 RXV_SN : 8; - UINT32 TxS_WlanIdx : 8; -} TXS_D_3, *PTXS_D_3; -#endif - -/****************************************************************************** - TXS_D_4 -******************************************************************************/ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _TXS_D_4 { - UINT32 TxS_LastTxMcsIdx : 3; - UINT32 TxS_MpduTxCnt : 5; - UINT32 TxS_AMPDU : 1; - UINT32 TxS_FianlMPDU : 1; - UINT32 TxS_Pid : 8; - UINT32 TxS_TxBW : 2; - UINT32 TxS_SN_TSSI : 12; -} TXS_D_4, *PTXS_D_4; -#else -typedef struct GNU_PACKED _TXS_D_4 { - UINT32 TxS_SN_TSSI : 12; - UINT32 TxS_TxBW : 2; - UINT32 TxS_Pid : 8; - UINT32 TxS_FianlMPDU : 1; - UINT32 TxS_AMPDU : 1; - UINT32 TxS_MpduTxCnt : 5; - UINT32 TxS_LastTxMcsIdx : 3; -} TXS_D_4, *PTXS_D_4; -#endif - -/****************************************************************************** - TXS_STRUC -******************************************************************************/ -typedef struct GNU_PACKED _TXS_STRUC { - TXS_D_0 TxSD0; - TXS_D_1 TxSD1; - TXS_D_2 TxSD2; - TXS_D_3 TxSD3; - TXS_D_4 TxSD4; -} TXS_STRUC; - -/****************************************************************************** - TXS Frame Format -******************************************************************************/ -typedef struct GNU_PACKED _TXS_FRM_STRUC { - struct _RMAC_RXD_0_TXS TxSD0; - TXS_STRUC txs_info[0]; -} TXS_FRM_STRUC; - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_1ST_CYCLE { - UINT32 VHTA1_B5_B4 : 2; - UINT32 VHTA2_B8_B1 : 8; - UINT32 HtNoSound : 1; - UINT32 HtSmooth : 1; - UINT32 HtShortGi : 1; - UINT32 HtAggregation : 1; - UINT32 VHTA1_B22 : 1; - UINT32 FrMode : 2; - UINT32 TxMode : 3; - UINT32 HtExtltf : 2; - UINT32 HtAdCode : 1; - UINT32 HtStbc : 2; - UINT32 TxRate : 7; -} RX_VECTOR1_1ST_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_1ST_CYCLE { - UINT32 TxRate : 7; - UINT32 HtStbc : 2; - UINT32 HtAdCode : 1; - UINT32 HtExtltf : 2; - UINT32 TxMode : 3; - UINT32 FrMode : 2; - UINT32 VHTA1_B22 : 1; - UINT32 HtAggregation : 1; - UINT32 HtShortGi : 1; - UINT32 HtSmooth : 1; - UINT32 HtNoSound : 1; - UINT32 VHTA2_B8_B1 : 8; - UINT32 VHTA1_B5_B4 : 2; -} RX_VECTOR1_1ST_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_2ND_CYCLE { - UINT32 VHTA1_B16_B6 : 11; - UINT32 Length : 21; -} RX_VECTOR1_2ND_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_2ND_CYCLE { - UINT32 Length : 21; - UINT32 VHTA1_B16_B6 : 11; -} RX_VECTOR1_2ND_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_3TH_CYCLE { - UINT32 Fagc1CalGain : 3; - UINT32 Fgac1EqCal : 1; - UINT32 Rcpi1 : 8; - UINT32 Fagc0CalGain : 3; - UINT32 Fagc0EqCal : 1; - UINT32 Rcpi0 : 8; - UINT32 SelAnt : 1; - UINT32 ACI_DETx : 1; - UINT32 OFDMFreqTransDet : 1; - UINT32 VHTA1_B21_B17 : 5; -} RX_VECTOR1_3TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_3TH_CYCLE { - UINT32 VHTA1_B21_B17 : 5; - UINT32 OFDMFreqTransDet : 1; - UINT32 ACI_DETx : 1; - UINT32 SelAnt : 1; - UINT32 Rcpi0 : 8; - UINT32 Fagc0EqCal : 1; - UINT32 Fgac0CalGain : 3; - UINT32 Rcpi1 : 8; - UINT32 Fagc1EqCal : 1; - UINT32 Fgac1CalGain : 3; -} RX_VECTOR1_3TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_4TH_CYCLE { - UINT32 FgacCalGain : 3; - UINT32 Fagc2EqCal : 1; - UINT32 IBRssi1 : 8; - UINT32 FagcLpfGainx : 4; - UINT32 WBRssix : 8; - UINT32 IBRssi0 : 8; -} RX_VECTOR1_4TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_4TH_CYCLE { - UINT32 IBRssi0 : 8; - UINT32 WBRssix : 8; - UINT32 FagcLpfGainx : 4; - UINT32 IBRssi1 : 8; - UINT32 Fagc2EqCal : 1; - UINT32 FgacCalGain : 3; -} RX_VECTOR1_4TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_5TH_CYCLE { - UINT32 LTF_SNR0 : 6; - UINT32 LTF_ProcTime : 7; - UINT32 FoE : 12; /* FreqOffSer from Rx */ - UINT32 CagcState : 3; - UINT32 FagcLnaGain1 : 2; - UINT32 FagcLnaGain0 : 2; -} RX_VECTOR1_5TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_5TH_CYCLE { - UINT32 FagcLnaGain0 : 2; - UINT32 FagcLnaGain1 : 2; - UINT32 CagcState : 3; - UINT32 FoE : 12; /* FreqOffSer from Rx */ - UINT32 LTF_ProcTime : 7; - UINT32 LTF_SNR0 : 6; -} RX_VECTOR1_5TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR1_6TH_CYCLE { - UINT32 Reserved : 1; - UINT32 CagcState : 3; - UINT32 NsTsField : 3; - UINT32 RxValidIndicator : 1; - UINT32 Nf2 : 8; - UINT32 Nf1 : 8; - UINT32 Nf0 : 8; -} RX_VECTOR1_6TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR1_6TH_CYCLE { - UINT32 Nf0 : 8; - UINT32 Nf1 : 8; - UINT32 Nf2 : 8; - UINT32 RxValidIndicator : 1; - UINT32 NsTsField : 3; - UINT32 CagcState : 3; - UINT32 Reserved : 1; -} RX_VECTOR1_6TH_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_1ST_CYCLE { - UINT32 Ofdm : 28; - UINT32 BtEnv : 1; - UINT32 Sec40ItfrEnv : 1; - UINT32 SecItfrEnv : 1; - UINT32 PrimItfrEnv : 1; -} RX_VECTOR2_1ST_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_1ST_CYCLE { - UINT32 PrimItfrEnv : 1; - UINT32 SecItfrEnv : 1; - UINT32 Sec40ItfrEnv : 1; - UINT32 BtEnv : 1; - UINT32 Ofdm : 28; -} RX_VECTOR2_1ST_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_2ND_CYCLE { - UINT32 RxScramblingSeed : 3; - /* UINT32 DumpSelect:8; */ - UINT32 Reserved2 : 2; - UINT32 OfdmLtfSNR1 : 6; - UINT32 BtdNoTchLoc : 7; - UINT32 Ofdm : 14; -} RX_VECTOR2_2ND_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_2ND_CYCLE { - UINT32 Ofdm : 14; - UINT32 BtdNoTchLoc : 7; - /* UINT32 DumpSelect:8; */ - UINT32 OfdmLtfSNR1 : 6; - UINT32 Reserved2 : 2; - UINT32 RxScramblingSeed : 3; -} RX_VECTOR2_2ND_CYCLE; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RX_VECTOR2_3TH_CYCLE { - UINT32 FcsErr : 1; - UINT32 OfdmDewModeDet : 1; - UINT32 OfdmCeLtfComb : 1; - UINT32 OfdmCeGicEnb : 1; - UINT32 OfdmCeRmsdId : 3; - UINT32 Reserved1 : 1; - UINT32 BgAgcWbRssix : 8; - UINT32 BfAgcIbRssix : 8; - UINT32 BfAgcLpfGain : 4; - UINT32 Reserved0 : 1; - UINT32 BfAgcLnaGainx : 2; - UINT32 HtStfDet : 1; -} RX_VECTOR2_3TH_CYCLE; -#else -typedef struct GNU_PACKED _RX_VECTOR2_3TH_CYCLE { - UINT32 HtStfDet : 1; - UINT32 BfAgcLnaGainx : 2; - UINT32 Reserved0 : 1; - UINT32 BfAgcLpfGain : 4; - UINT32 BfAgcIbRssix : 8; - UINT32 BgAgcWbRssix : 8; - UINT32 Reserved1 : 1; - UINT32 OfdmCeRmsdId : 3; - UINT32 OfdmCeGicEnb : 1; - UINT32 OfdmCeLtfComb : 1; - UINT32 OfdmDewModeDet : 1; - UINT32 FcsErr : 1; -} RX_VECTOR2_3TH_CYCLE; -#endif - -typedef struct _RXV_INFO { - INT32 Rssi0; - INT32 Rssi1; -} RXV_INFO; - -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _RXV_DWORD0 { - UINT32 TA_0_31; -} RXV_DWORD0; -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RXV_DWORD1 { - UINT32 Reserved : 7; - UINT32 TR : 1; - UINT32 RxvSn : 8; - UINT32 TA_32_47 : 16; -} RXV_DWORD1; -#else -typedef struct GNU_PACKED _RXV_DWORD1 { - UINT32 TA_32_47 : 16; - UINT32 RxvSn : 8; - UINT32 TR : 1; - UINT32 Reserved : 7; -} RXV_DWORD1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -/* RX/TX-Status Vector Format */ -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED _RXV_STRUC { - UINT32 Ta0; - UINT32 Rsv25To31 : 7; - UINT32 Tr : 1; - UINT32 RxVSn : 8; - UINT32 Ta32 : 16; - UINT32 Vector1[6]; - UINT32 Vector2[3]; -} RXV_STRUC, *PRXV_STRUC; -#else -typedef struct GNU_PACKED _RXV_STRUC { - UINT32 Ta0; - UINT32 Ta32 : 16; - UINT32 RxVSn : 8; - UINT32 Tr : 1; - UINT32 Rsv25To31 : 7; - UINT32 Vector1[6]; - UINT32 Vector2[3]; -} RXV_STRUC, *PRXV_STRUC; -#endif -/* ---UNIFIED_TXD_RXD */ - -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _RXV_FRM_STRUC { - struct _RMAC_RXD_0_TXRXV RxVD0; - RXV_STRUC RxVInfo[0]; -} RXV_FRM_STRUC, *PRXV_FRM_STRUC; -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - LMAC TMR Structure - - TMR_D_1 - TMR_D_2 - TMR_D_6 -******************************************************************************/ - -/****************************************************************************** - TMR_D_1 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -/* - Timing Measurement Report Format -*/ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_1 { - struct { - UINT32 TxvTxMode : 3; - UINT32 RxvDw1Bit29 : 1; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvTxMode : 3; - UINT32 RxvFrMode : 2; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvDw3Bit6 : 1; - UINT32 ToAeReport : 6; - UINT32 TodFine : 6; - UINT32 Pid : 8; - } field_init; - - struct { - UINT32 TxvTxMode : 3; - UINT32 RxvDw1Bit29 : 1; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvTxMode : 3; - UINT32 RxvFrMode : 2; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvDw3Bit6 : 1; - UINT32 ToAeReport : 6; - UINT32 TodFine : 6; - UINT32 RxvSn : 8; - } field_resp; - - UINT32 word; -} TMR_D_1, *PTMR_D_1; -#else -typedef union GNU_PACKED _TMR_D_1 { - struct { - UINT32 Pid : 8; - UINT32 TodFine : 6; - UINT32 ToAeReport : 6; - UINT32 RxvDw3Bit6 : 1; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvFrMode : 2; - UINT32 RxvTxMode : 3; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvDw1Bit29 : 1; - UINT32 TxvTxMode : 3; - } field_init; - - struct { - UINT32 RxvSn : 8; - UINT32 TodFine : 6; - UINT32 ToAeReport : 6; - UINT32 RxvDw3Bit6 : 1; - UINT32 RxvDw1Bit12 : 1; - UINT32 RxvFrMode : 2; - UINT32 RxvTxMode : 3; - UINT32 RxvDw1Bit23 : 1; - UINT32 RxvDw1Bit29 : 1; - UINT32 TxvTxMode : 3; - } field_resp; - - UINT32 word; -} TMR_D_1, *PTMR_D_1; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMR_D_2 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_2 { - struct { - UINT32 SnField : 16; - UINT32 Ta0 : 16; - } field; - - UINT32 word; -} TMR_D_2, *PTMR_D_2; -#else -typedef union GNU_PACKED _TMR_D_2 { - struct { - UINT32 Ta0 : 16; - UINT32 SnField : 16; - } field; - - UINT32 word; -} TMR_D_2, *PTMR_D_2; -#endif -/* ---UNIFIED_TXD_RXD */ - -/****************************************************************************** - TMR_D_6 -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_6 { - struct { - UINT32 ToA32 : 16; - UINT32 ToD32 : 16; - } field; - - UINT32 word; -} TMR_D_6, *PTMR_D_6; -#else -typedef union GNU_PACKED _TMR_D_6 { - struct { - UINT32 ToD32 : 16; - UINT32 ToA32 : 16; - } field; - - UINT32 word; -} TMR_D_6, *PTMR_D_6; -#endif -/* ---UNIFIED_TXD_RXD */ - -#ifdef TMR_GEN2 -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_7 { - struct { - UINT32 Rsv : 31; - UINT32 DacOutput : 1; - } field; - - UINT32 word; -} TMR_D_7, *PTMR_D_7; -#else -typedef union GNU_PACKED _TMR_D_7 { - struct { - UINT32 DacOutput : 1; - UINT32 Rsv : 31; - } field; - - UINT32 word; -} TMR_D_7, *PTMR_D_7; -#endif /* RT_BIG_ENDIAN */ - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TMR_D_8 { - struct { - UINT32 DBDC : 1; - UINT32 UnknownBit : 1; /* TODO: Carter, check with WK for detail. */ - UINT32 Rsv2 : 7; - UINT32 RmsId : 3; - UINT32 FailReason : 4; - UINT32 Rsv1 : 5; - UINT32 LtfSyncStartAddr : 11; - } field_ofdm; - - struct { - UINT32 Rsv : 29; - UINT32 FailReason : 3; - } field_cck; - - UINT32 word; -} TMR_D_8, *PTMR_D_8; -#else -typedef union GNU_PACKED _TMR_D_8 { - struct { - UINT32 FailReason : 3; - UINT32 Rsv : 29; - } field_cck; - - struct { - UINT32 LtfSyncStartAddr : 11; - UINT32 Rsv1 : 5; - UINT32 FailReason : 4; - UINT32 RmsId : 3; - UINT32 Rsv2 : 7; - UINT32 UnknownBit : 1; /* TODO: Carter, check with WK for detail. */ - UINT32 DBDC : 1; - } field_ofdm; - - UINT32 word; -} TMR_D_8, *PTMR_D_8; -#endif /* RT_BIG_ENDIAN */ -#endif /* TMR_GEN2 */ - -/****************************************************************************** - TMR_FRM_STRUC -******************************************************************************/ -/* +++UNIFIED_TXD_RXD */ -typedef struct GNU_PACKED _TMR_FRM_STRUC { - struct _RMAC_RXD_0_TMR TmrD0; - TMR_D_1 TmrD1; - TMR_D_2 TmrD2; - UINT32 Ta16; - UINT32 ToD0; - UINT32 ToA0; - TMR_D_6 TmrD6; -#ifdef TMR_GEN2 - TMR_D_7 TmrD7; - TMR_D_8 TmrD8; -#endif -} TMR_FRM_STRUC, *PTMR_FRM_STRUC; -/* ---UNIFIED_TXD_RXD */ - -typedef struct wtbl_entry { - UINT8 wtbl_idx; - - struct wtbl_1_struc wtbl_1; - struct wtbl_2_struc wtbl_2; - union wtbl_3_struc wtbl_3; - struct wtbl_4_struc wtbl_4; - - UINT32 wtbl_addr[4]; - UINT16 wtbl_fid[4]; - UINT16 wtbl_eid[4]; -} WTBL_ENTRY; - -#define MT_SMAC_BA_AGG_RANGE 8 -#define MT_DMAC_BA_AGG_RANGE 8 - -#define MT_PSE_BASE_ADDR 0xa0000000 - -#define MT_TOP_REMAP_ADDR \ - 0x80000000 /* TOP start address 8002-0000, but only can remap to 8000-0000 */ -#define MT_TOP_REMAP_ADDR_THEMAL \ - 0xa2000 /* Get Thermal sensor adc cal value: 0x80022000 bits(8,14), Offset 0x80000 + 0x22000 = 0xa2000 */ -#define MT_TOP_THEMAL_ADC \ - 0x80022000 /* Get Thermal sensor adc cal value: 0x80022000 bits(8,14) */ - -#define MCU_CFG_BASE 0x2000 -#define MCU_PCIE_REMAP_1 (MCU_CFG_BASE + 0x500) -#define REMAP_1_OFFSET_MASK (0x3ffff) -#define GET_REMAP_1_OFFSET(p) (((p)&REMAP_1_OFFSET_MASK)) -#define REMAP_1_BASE_MASK (0x3fff << 18) -#define GET_REMAP_1_BASE(p) (((p)&REMAP_1_BASE_MASK) >> 18) -#define MCU_PCIE_REMAP_2 (MCU_CFG_BASE + 0x504) -#define REMAP_2_OFFSET_MASK (0x7ffff) -#define GET_REMAP_2_OFFSET(p) (((p)&REMAP_2_OFFSET_MASK)) -#define REMAP_2_BASE_MASK (0x1fff << 19) -#define GET_REMAP_2_BASE(p) (((p)&REMAP_2_BASE_MASK) >> 19) - -#define TOP_CFG_BASE 0x0000 - -#define XTAL_CTL4 (TOP_CFG_BASE + 0x1210) -#define XTAL_CTL13 (TOP_CFG_BASE + 0x1234) -#define XTAL_CTL14 (TOP_CFG_BASE + 0x1238) -#define DA_XO_C2_MASK (0x7f << 8) -#define DA_XO_C2(p) (((p)&0x7f) << 8) - -#define DBDC_BAND_NUM 1 - -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) -#define MT_PSE_PAGE_SIZE 256 -#elif defined(MT7637_FPGA) -#define MT_PSE_PAGE_SIZE 128 -#else -#define MT_PSE_PAGE_SIZE 128 -#endif /* MT7603_FPGA */ - -#define MT_PCI_REMAP_ADDR_1 0x40000 -#define MT_PCI_REMAP_ADDR_2 0x80000 - -/* TODO: shiang-7603, this is a dummy data structure and need to revise to adapative for MT7603 series */ -#define WMM_QUE_NUM 4 /* each sta has 4 Queues to mapping to each WMM AC */ - -#ifndef COMPOS_WIN -/* value domain of pTxD->HostQId (4-bit: 0~15) */ -#define QID_AC_BK 0 -#define QID_AC_BE 1 -#define QID_AC_VI 2 -#define QID_AC_VO 3 -#endif - -#define QID_HCCA 4 -#define NUM_OF_TX_RING 4 -#define NUM_OF_WMM1_TX_RING 1 - -#define QID_BMC 8 - -#define NUM_OF_RX_RING 1 -#ifdef CONFIG_ANDES_SUPPORT -#undef NUM_OF_RX_RING -#define NUM_OF_RX_RING 2 -#endif /* CONFIG_ANDES_SUPPORT */ - -#define QID_MGMT 13 -#define QID_RX 14 -#define QID_OTHER 15 -#ifdef CONFIG_ANDES_SUPPORT -#define QID_CTRL 16 -#endif /* CONFIG_ANDES_SUPPORT */ - -#define QID_BCN 17 - -#define SHAREDKEYTABLE 0 -#define PAIRWISEKEYTABLE 1 - -/* Indicate the txs report to Host or MCU */ -typedef enum { - TXS2MCU = 0, - TXS2HOST = 1, -} TXS_TARGET_PORT; - -#define TXS2MCU_AGGNUMS 31 -#define TXS2HOST_AGGNUMS 31 - -enum { - TXS2M_QID0, - TXS2M_QID1, - TXS2M_QID2, - TXS2M_QID3, -}; - -enum { - TXS2H_QID0, - TXS2H_QID1, -}; - -enum { - TXS_FORMAT0, - TXS_FORMAT1, -}; - -#define TSO_SIZE 0 - -#define EXP_ACK_TIME 0x1380 - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TX_STA_CNT0_STRUC { - struct { - UINT16 TxBeaconCount; - UINT16 TxFailCount; - } field; - UINT32 word; -} TX_STA_CNT0_STRUC; -#else -typedef union GNU_PACKED _TX_STA_CNT0_STRUC { - struct { - UINT16 TxFailCount; - UINT16 TxBeaconCount; - } field; - UINT32 word; -} TX_STA_CNT0_STRUC; -#endif - -#ifdef RT_BIG_ENDIAN -typedef union GNU_PACKED _TX_STA_CNT1_STRUC { - struct { - UINT16 TxRetransmit; - UINT16 TxSuccess; - } field; - UINT32 word; -} TX_STA_CNT1_STRUC; -#else -typedef union GNU_PACKED _TX_STA_CNT1_STRUC { - struct { - UINT16 TxSuccess; - UINT16 TxRetransmit; - } field; - UINT32 word; -} TX_STA_CNT1_STRUC; -#endif - -typedef struct __TX_CNT_INFO { - union WTBL_2_DW5 wtbl_2_d5; - union WTBL_2_DW6 wtbl_2_d6; - union WTBL_2_DW7 wtbl_2_d7; - union WTBL_2_DW8 wtbl_2_d8; - union WTBL_2_DW9 wtbl_2_d9; -} TX_CNT_INFO; - -#define E2PROM_CSR 0x0004 -#define GPIO_CTRL_CFG 0x0228 -#define WSC_HDR_BTN_GPIO_0 ((UINT32)0x00000001) /* bit 0 for RT2860/RT2870 */ -#define WSC_HDR_BTN_GPIO_3 ((UINT32)0x00000008) /* bit 3 for RT2860/RT2870 */ - -#define LEGACY_BASIC_RATE 0x1408 - -struct _RTMP_ADAPTER; - -VOID dump_mt_mac_cr(struct _RTMP_ADAPTER *pAd); - -INT mt_wtbl_init_ByFw(struct _RTMP_ADAPTER *pAd); -INT mt_wtbl_init_ByDriver(struct _RTMP_ADAPTER *pAd); -INT mt_mac_init(struct _RTMP_ADAPTER *pAd); -INT mt_hw_tb_init(struct _RTMP_ADAPTER *pAd, BOOLEAN bHardReset); - -INT mt_wtbl_get_entry234(struct _RTMP_ADAPTER *pAd, UCHAR idx, - struct wtbl_entry *ent); -VOID dump_wtbl_entry(struct _RTMP_ADAPTER *pAd, struct wtbl_entry *ent); -VOID dump_wtbl_info(struct _RTMP_ADAPTER *pAd, UINT wtbl_idx); -#ifdef CONFIG_WTBL_TLV_MODE -VOID dump_wtbl_info_ByTlv(struct _RTMP_ADAPTER *pAd, UINT wtbl_idx); -#endif -VOID dump_wtbl_base_info(struct _RTMP_ADAPTER *pAd); - -INT mt_mac_set_ctrlch(struct _RTMP_ADAPTER *pAd, UINT8 extch); -#ifdef GREENAP_SUPPORT -INT rtmp_mac_set_mmps(struct _RTMP_ADAPTER *pAd, INT ReduceCorePower); -#endif /* GREENAP_SUPPORT */ - -UINT16 tx_rate_to_tmi_rate(UINT8 mode, UINT8 mcs, UINT8 nss, BOOLEAN stbc, - UINT8 preamble); -UCHAR get_nsts_by_mcs(UCHAR phy_mode, UCHAR mcs, BOOLEAN stbc, UCHAR vht_nss); - -#define HIF_PORT 1 -#define MCU_PORT 2 -#define MT_TX_RETRY_UNLIMIT 0x1f -#define MT_TX_SHORT_RETRY 0x0f -#define MT_TX_LONG_RETRY 0x0f - -VOID mt_chip_info_show(struct _RTMP_ADAPTER *pAd); -INT mt_nic_asic_init(struct _RTMP_ADAPTER *pAd); -VOID mt_rxv_set(struct _RTMP_ADAPTER *pAd, int DbgLvl); - -struct _TX_BLK; -struct _MAC_TX_INFO; -union _HTTRANSMIT_SETTING; -VOID mt_write_tmac_info(struct _RTMP_ADAPTER *pAd, UCHAR *buf, - struct _TX_BLK *pTxBlk); -INT mt_hw_tx(struct _RTMP_ADAPTER *pAd, struct _TX_BLK *tx_blk); -INT mt_mlme_hw_tx(struct _RTMP_ADAPTER *pAd, UCHAR *tmac_info, - struct _MAC_TX_INFO *info, HTTRANSMIT_SETTING *transmit, - struct _TX_BLK *tx_blk); -#endif /* __MT_SMAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/pse.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/pse.h deleted file mode 100644 index 7a304a94fc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/pse.h +++ /dev/null @@ -1,237 +0,0 @@ -#ifndef __PSE_H__ -#define __PSE_H__ - -#define PSE_BASE 0x8000 - -/* PSE Global Control Register */ -#define GC (PSE_BASE + 0x00) -#define PSE_ALL_RST (1 << 0) -#define PSE_LOGICAL_RST (1 << 1) -#define PSE_INIT_DONE (1 << 2) -#define GET_PSE_INIT_DONE(p) (((p)&PSE_INIT_DONE) >> 2) - -/* PSE Buffer Control Register */ -#define PSE_BC (PSE_BASE + 0x14) -#define TOTAL_PAGE_NUM_MASK (0xfff) -#define GET_TOTAL_PAGE_NUM(p) (((p)&0xfff)) -#define PAGE_NUM_LMT_EN (1 << 12) -#define GET_PAGE_NUM_LMT_EN(p) (((p)&PAGE_NUM_LMT_EN) >> 12) -#define PAGE_SIZE_CFG_MASK (0x3 << 14) -#define GET_PAGE_SIZE_CFG(p) (((p)&PAGE_SIZE_CFG_MASK) >> 14) - -/* CPU Interface Get First Frame ID Control Regitser */ -#define C_GFF (PSE_BASE + 0x24) -#define GET_FIRST_FID_MASK (0xfff) -#define GET_FIRST_FID(p) (((p)&GET_FIRST_FID_MASK)) -#define GET_QID_MASK (0x1f << 16) -#define SET_GET_QID(p) (((p)&0x1f) << 16) -#define GET_QID(p) (((p)&GET_QID_MASK) >> 16) -#define GET_PID_MASK (0x3 << 21) -#define SET_GET_PID(p) (((p)&0x3) << 21) -#define GET_PID(p) (((p)&GET_PID_MASK) >> 21) -#define GET_RVSE_MASK (1 << 23) -#define SET_GET_RVSE(p) (((p)&0x1) << 23) -#define GET_RVSE(p) (((p)&GET_RVSE_MASK) >> 23) - -/* CPU Interface Get Frame ID Control Register */ -#define C_GF (PSE_BASE + 0x28) -#define GET_RETURN_FID_MASK (0xfff) -#define GET_RETURN_FID(p) (((p)&GET_RETURN_FID_MASK)) -#define CURR_FID_MASK (0xfff << 16) -#define SET_CURR_FID(p) (((p)&0xfff) << 16) -#define GET_CURR_FID(p) (((p)&CURR_FID_MASK) >> 16) -#define GET_PREV_MASK (1 << 28) -#define SET_GET_PREV(p) (((p)&0x1) << 28) -#define GET_PREV(p) (((p)&GET_PREV_MASK) >> 28) -#define GET_AUTO_MASK (1 << 29) -#define SET_GET_AUTO(p) (((p)&0x1) >> 29) -#define GET_AUTO(p) (((p)&GET_AUTO_MASK) >> 29) - -/* Get Queue Length Control Register */ -#define GQC (PSE_BASE + 0x118) -#define QLEN_RETURN_VALUE_MASK (0xfff) -#define GET_QLEN_RETURN_VALUE(p) (((p)&QLEN_RETURN_VALUE_MASK)) -#define GET_QLEN_QID_MASK (0x1f << 16) -#define SET_GET_QLEN_QID(p) (((p)&0x1f) << 16) -#define GET_QLEN_QID(p) (((p)&GET_QLEN_QID_MASK) >> 16) -#define GET_QLEN_PID_MASK (0x3 << 21) -#define SET_GET_QLEN_PID(p) (((p)&0x3) << 21) -#define GET_QLEN_PID(p) (((p)&GET_QLEN_PID_MASK) >> 21) -#define QLEN_IN_PAGE (1 << 23) -#define GET_QLEN_IN_PAGE(p) (((p)&QLEN_IN_PAGE) >> 23) - -/* Flow Control P0 Control Register */ -#define FC_P0 (PSE_BASE + 0x120) -#define MIN_RSRV_P0_MASK (0xfff) -#define MIN_RSRV_P0(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P0(p) (((p)&MIN_RSRV_P0_MASK)) -#define MAX_QUOTA_P0_MASK (0xfff << 16) -#define MAX_QUOTA_P0(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P0(p) (((p)&MAX_QUOTA_P0_MASK) >> 16) - -/* Flow Control P1 Control Register */ -#define FC_P1 (PSE_BASE + 0x124) -#define MIN_RSRV_P1_MASK (0xfff) -#define MIN_RSRV_P1(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P1(p) (((p)&MIN_RSRV_P1_MASK)) -#define MAX_QUOTA_P1_MASK (0xfff << 16) -#define MAX_QUOTA_P1(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P1(p) (((p)&MAX_QUOTA_P1_MASK) >> 16) - -/* Flow Control P2_RQ0 Control Register */ -#define FC_P2Q0 (PSE_BASE + 0x128) -#define MIN_RSRV_P2_RQ0_MASK (0xfff) -#define MIN_RSRV_P2_RQ0(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P2_RQ0(p) (((p)&MIN_RSRV_P2_RQ0_MASK)) -#define MAX_QUOTA_P2_RQ0_MASK (0xfff << 16) -#define MAX_QUOTA_P2_RQ0(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P2_RQ0(p) (((p)&MAX_QUOTA_P2_RQ0_MASK) >> 16) - -/* Flow Control P2_RQ1 Control Register */ -#define FC_P2Q1 (PSE_BASE + 0x12c) -#define MIN_RSRV_P2_RQ1_MASK (0xfff) -#define MIN_RSRV_P2_RQ1(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P2_RQ1(p) (((p)&MIN_RSRV_P2_RQ1_MASK)) -#define MAX_QUOTA_P2_RQ1_MASK (0xfff << 16) -#define MAX_QUOTA_P2_RQ1(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P2_RQ1(p) (((p)&MAX_QUOTA_P2_RQ1_MASK) >> 16) - -/* Flow Control P2_RQ2 Control Register */ -#define FC_P2Q2 (PSE_BASE + 0x130) -#define MIN_RSRV_P2_RQ2_MASK (0xfff) -#define MIN_RSRV_P2_RQ2(p) (((p)&0xfff)) -#define GET_MIN_RSRV_P2_RQ2(p) (((p)&MIN_RSRV_P2_RQ2_MASK)) -#define MAX_QUOTA_P2_RQ2_MASK (0xfff << 16) -#define MAX_QUOTA_P2_RQ2(p) (((p)&0xfff) << 16) -#define GET_MAX_QUOTA_P2_RQ2(p) (((p)&MAX_QUOTA_P2_RQ2_MASK) >> 16) - -/* Flow Control Free for All and Free Page Counter Register */ -#define FC_FFC (PSE_BASE + 0x134) -#define FREE_PAGE_CNT_MASK (0xfff) -#define GET_FREE_PAGE_CNT(p) (((p)&FREE_PAGE_CNT_MASK)) -#define FFA_CNT_MASK (0xfff << 16) -#define GET_FFA_CNT(p) (((p)&FFA_CNT_MASK) >> 16) - -/* Flow Control Reserve from FFA priority Control Register */ -#define FC_FRP (PSE_BASE + 0x138) -#define RSRV_PRI_P0_MASK (0x7) -#define RSRV_PRI_P0(p) (((p)&0x7)) -#define GET_RSRV_PRI_P0(p) (((p)&RSRV_PRI_P0_MASK)) -#define RSRV_PRI_P1_MASK (0x7 << 3) -#define RSRV_PRI_P1(p) (((p)&0x7) << 3) -#define GET_RSRV_PRI_P1(p) (((p)&RSRV_PRI_P1_MASK) >> 3) -#define RSRV_PRI_P2_RQ0_MASK (0x7 << 6) -#define RSRV_PRI_P2_RQ0(p) (((p)&0x7) << 6) -#define GET_RSRV_PRI_P2_RQ0(p) (((p)&RSRV_PRI_P2_RQ0_MASK) >> 6) -#define RSRV_PRI_P2_RQ1_MASK (0x7 << 9) -#define RSRV_PRI_P2_RQ1(p) (((p)&0x7) << 9) -#define GET_RSRV_PRI_P2_RQ1(p) (((p)&RSRV_PRI_P2_RQ1_MASK) >> 9) -#define RSRV_PRI_P2_RQ2_MASK (0x7 << 12) -#define RSRV_PRI_P2_RQ2(p) (((p)&0x7) << 12) -#define GET_RSRV_PRI_P2_RQ2(p) (((p)&RSRV_PRI_P2_RQ2_MASK) >> 12) - -/* Flow Control P0 and P1 Reserve Counter Register */ -#define FC_RP0P1 (PSE_BASE + 0x13c) -#define RSRV_CNT_P0_MASK (0xfff) -#define RSRV_CNT_P0(p) (((p)&0xfff)) -#define GET_RSRV_CNT_P0(p) (((p)&RSRV_CNT_P0_MASK)) -#define RSRV_CNT_P1_MASK (0xfff << 16) -#define RSRV_CNT_P1(p) (((p)&0xfff) << 16) -#define GET_RSRV_CNT_P1(p) (((p)&RSRV_CNT_P1_MASK) >> 16) - -/* Flow Control P2_RQ0 and P2_RQ1 Reserve Counter Register */ -#define FC_RP2Q0Q1 (PSE_BASE + 0x140) -#define RSRV_CNT_P2_RQ0_MASK (0xfff) -#define RSRV_CNT_P2_RQ0(p) (((p)&0xfff)) -#define GET_RSRV_CNT_P2_RQ0(p) (((p)&RSRV_CNT_P2_RQ0_MASK)) -#define RSRV_CNT_P2_RQ1_MASK (0xfff << 16) -#define RSRV_CNT_P2_RQ1(p) (((p)&0xfff) << 16) -#define GET_RSRV_CNT_P2_RQ1(p) (((p)&RSRV_CNT_P2_RQ1_MASK) >> 16) - -/* Flow Control P2_RQ2 Reserve Counter Register */ -#define FC_RP2Q2 (PSE_BASE + 0x144) -#define RSRV_CNT_P2_RQ2_MASK (0xfff) -#define RSRV_CNT_P2_RQ2(p) (((p)&0xfff)) -#define GET_RSRV_CNT_P2_RQ2(p) (((p)&RSRV_CNT_P2_RQ2_MASK)) - -/* Flow Control P0 and P1 Source Counter Register */ -#define FC_SP0P1 (PSE_BASE + 0x148) -#define SRC_CNT_P0_MASK (0xfff) -#define GET_SRC_CNT_P0(p) (((p)&SRC_CNT_P0_MASK)) -#define SRC_CNT_P1_MASK (0xfff << 16) -#define GET_SRC_CNT_P1(p) (((p)&SRC_CNT_P1_MASK) >> 16) - -/* FLow Control P2_RQ0 and P2_RQ1 Source Counter Register */ -#define FC_SP2Q0Q1 (PSE_BASE + 0x14c) -#define SRC_CNT_P2_RQ0_MASK (0xfff) -#define GET_SRC_CNT_P2_RQ0(p) (((p)&SRC_CNT_P2_RQ0_MASK)) -#define SRC_CNT_P2_RQ1_MASK (0xfff << 16) -#define GET_SRC_CNT_P2_RQ1(p) (((p)&SRC_CNT_P2_RQ1_MASK) >> 16) - -/* Flow Control P2_RQ2 Source Counter Register */ -#define FC_SP2Q2 (PSE_BASE + 0x150) -#define SRC_CNT_P2_RQ2_MASK (0xfff) -#define GET_SRC_CNT_P2_RQ2(p) (((p)&0xfff)) - -#define PSE_RTA (PSE_BASE + 0x194) -#define PSE_RTA_RD_RULE_QID_MASK (0x1f) -#define PSE_RTA_RD_RULE_QID(p) (((p)&0x1f)) -#define GET_PSE_RTA_RD_RULE_QID(p) (((p)&PSE_RTA_RD_RULE_QID_MASK)) -#define PSE_RTA_RD_RULE_PID_MASK (0x3 << 5) -#define PSE_RTA_RD_RULE_PID(p) (((p)&0x3) << 5) -#define GET_PSE_RTA_RD_RULE_PID(p) (((p)&PSE_RTA_RD_RULE_PID_MASK) >> 5) -#define PSE_RTA_RD_RULE_F (1 << 7) -#define GET_PSE_RTA_RD_RULE_F(p) (((p)&PSE_RTA_RD_RULE_F) >> 7) -#define PSE_RTA_TAG_MASK (0xff << 8) -#define PSE_RTA_TAG(p) (((p)&0xff) << 8) -#define GET_PSE_RTA_TAG(p) (((p)&PSE_RTA_TAG_MASK) >> 8) -#define PSE_RTA_RD_RW (1 << 16) -#define PSE_RTA_RD_KICK_BUSY (1 << 31) -#define GET_PSE_RTA_RD_KICK_BUSY(p) (((p)&PSE_RTA_RD_KICK_BUSY) >> 31) - -/* PSE PORT LIST */ -typedef enum _ENUM_PSE_PORT_T { - ENUM_HIF_PORT_0 = 0, - ENUM_CPU_PORT_1 = 1, - ENUM_LMAC_PORT_2 = 2, - ENUM_SWITCH_PORT_3 = 3, - ENUM_PSE_PORT_TOTAL_NUM = 4 -} ENUM_PSE_PORT_T, - *P_ENUM_PSE_PORT_T; - -/* PSE SWITCH QUEUE LIST, INCLUDING FREE QUEUE */ -typedef enum _ENUM_PSE_SWITCH_P_QUEUE_T { - ENUM_SWITCH_SW_Q_0 = 0, - ENUM_SWITCH_SW_Q_1 = 1, - ENUM_SWITCH_SW_Q_2 = 2, - ENUM_SWITCH_SW_Q_3 = 3, - ENUM_SWITCH_SW_Q_4 = 4, - ENUM_SWITCH_SW_Q_5 = 5, - ENUM_SWITCH_SW_Q_6 = 6, - ENUM_SWITCH_SW_Q_7 = 7, - ENUM_SWITCH_FREE_Q_8 = 8, - ENUM_SWITCH_TOTAL_NUM = 9 -} ENUM_PSE_SWITCH_P_QUEUE_T, - *P_ENUM_PSE_SWITCH_P_QUEUE_T; - -/* LMAC TX QUEUE LIST */ -typedef enum _ENUM_PSE_LMAC_TX_P_QUEUE_T { - ENUM_LMAC_TX_AC0_Q_0 = 0, - ENUM_LMAC_TX_AC1_Q_1 = 1, - ENUM_LMAC_TX_AC2_Q_2 = 2, - ENUM_LMAC_TX_AC3_Q_3 = 3, - ENUM_LMAC_TX_AC4_Q_4 = 4, - ENUM_LMAC_TX_AC5_Q_5 = 5, - ENUM_LMAC_TX_AC6_Q_6 = 6, - ENUM_LMAC_TX_BEACON_Q_7 = 7, - ENUM_LMAC_TX_BCMC_Q_8 = 8, - ENUM_LMAC_TX_AC10_Q_9 = 9, - ENUM_LMAC_TX_AC11_Q_10 = 10, - ENUM_LMAC_TX_AC12_Q_11 = 11, - ENUM_LMAC_TX_AC13_Q_12 = 12, - ENUM_LMAC_TX_AC14_Q_13 = 13, - ENUM_LMAC_TX_TOTAL_NUM = 14 -} ENUM_PSE_LMAC_TX_P_QUEUE_T, - *P_ENUM_PSE_LMAC_TX_P_QUEUE_T; - -#endif /* _PSE */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_agg.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_agg.h deleted file mode 100644 index 8ca409a480..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_agg.h +++ /dev/null @@ -1,258 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_agg.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_AGG_H__ -#define __WF_AGG_H__ - -#define WF_AGG_BASE 0x21200 - -#define AGG_ARCR (WF_AGG_BASE + 0x010) /* 0x21210 */ -#define INI_RATE1 (0x1 << 0) -#define RTS_RATE_DOWN_TH_MASK (0x1F << 8) -#define RTS_RATE_DOWN_TH(p) (((p)&0x1F) << 8) -#define RATE_DOWN_EXTRA_RATIO_MASK (0x3 << 16) -#define RATE_DOWN_EXTRA_RATIO(p) (((p)&0x3) << 16) -#define RATE_DOWN_EXTRA_RATIO_EN (0x1 << 19) -#define RATE_UP_EXTRA_TH_MASK (0x07 << 20) -#define RATE_UP_EXTRA_TH(p) (((p)&0x7) << 20) -#define SPE_DIS_TH_MASK (0x0F << 24) -#define SPE_DIS_TH(p) (((p)&0xF) << 24) -#define DUAL_BTIM_EN BIT31 - -#define AGG_ARUCR (WF_AGG_BASE + 0x014) /* 0x21214 */ -#define RATE1_UP_MPDU_LIMIT_MASK (0x7) -#define RATE1_UP_MPDU_LINIT(p) (((p)&0x7)) -#define RATE2_UP_MPDU_LIMIT_MASK (0x7 << 4) -#define RATE2_UP_MPDU_LIMIT(p) (((p)&0x7) << 4) -#define RATE3_UP_MPDU_LIMIT_MASK (0x7 << 8) -#define RATE3_UP_MPDU_LIMIT(p) (((p)&0x7) << 8) -#define RATE4_UP_MPDU_LIMIT_MASK (0x7 << 12) -#define RATE4_UP_MPDU_LIMIT(p) (((p)&0x7) << 12) -#define RATE5_UP_MPDU_LIMIT_MASK (0x7 << 16) -#define RATE5_UP_MPDU_LIMIT(p) (((p)&0x7) << 16) -#define RATE6_UP_MPDU_LIMIT_MASK (0x7 << 20) -#define RATE6_UP_MPDU_LIMIT(p) (((p)&0x7) << 20) -#define RATE7_UP_MPDU_LIMIT_MASK (0x7 << 24) -#define RATE7_UP_MPDU_LIMIT(p) (((p)&0x7) << 24) -#define RATE8_UP_MPDU_LIMIT_MASK (0X7 << 28) -#define RATE8_UP_MPDU_LIMIT(p) (((p)&0x7) << 28) - -#define AGG_ARDCR (WF_AGG_BASE + 0x018) /* 0x21218 */ -#define RATE1_DOWN_MPDU_LIMIT_MASK (0x7) -#define RATE1_DOWN_MPDU_LIMIT(p) (((p)&0x7)) -#define RATE2_DOWN_MPDU_LIMIT_MASK (0x7 << 4) -#define RATE2_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 4) -#define RATE3_DOWN_MPDU_LIMIT_MASK (0x7 << 8) -#define RATE3_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 8) -#define RATE4_DOWN_MPDU_LIMIT_MASK (0x7 << 12) -#define RATE4_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 12) -#define RATE5_DOWN_MPDU_LIMIT_MASK (0x7 << 16) -#define RATE5_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 16) -#define RATE6_DOWN_MPDU_LIMIT_MASK (0x7 << 20) -#define RATE6_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 20) -#define RATE7_DOWN_MPDU_LIMIT_MASK (0x7 << 24) -#define RATE7_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 24) -#define RATE8_DOWN_MPDU_LIMIT_MASK (0x7 << 28) -#define RATE8_DOWN_MPDU_LIMIT(p) (((p)&0x7) << 28) - -#define AGG_AALCR (WF_AGG_BASE + 0x040) /* 0x21240 */ -#define AC0_AGG_LIMIT_MASK (0x3f) -#define AC0_AGG_LIMIT(p) (((p)&0x3f)) -#define GET_AC0_AGG_LIMIT(p) (((p)&AC0_AGG_LIMIT_MASK)) -#define AC1_AGG_LIMIT_MASK (0x3f << 8) -#define AC1_AGG_LIMIT(p) (((p)&0x3f) << 8) -#define GET_AC1_AGG_LIMIT(p) (((p)&AC1_AGG_LIMIT_MASK) >> 8) -#define AC2_AGG_LIMIT_MASK (0x3f << 16) -#define AC2_AGG_LIMIT(p) (((p)&0x3f) << 16) -#define GET_AC2_AGG_LIMIT(p) (((p)&AC2_AGG_LIMIT_MASK) >> 16) -#define AC3_AGG_LIMIT_MASK (0x3f << 24) -#define AC3_AGG_LIMIT(p) (((p)&0x3f) << 24) -#define GET_AC3_AGG_LIMIT(p) (((p)&AC3_AGG_LIMIT_MASK) >> 24) - -#define AGG_AALCR1 (WF_AGG_BASE + 0x044) /* 0x21244 */ -#define AC10_AGG_LIMIT_MASK (0x3f) -#define AC10_AGG_LIMIT(p) (((p)&0x3f)) -#define GET_AC10_AGG_LIMIT(p) (((p)&AC10_AGG_LIMIT_MASK)) -#define AC11_AGG_LIMIT_MASK (0x3f << 8) -#define AC11_AGG_LIMIT(p) (((p)&0x3f) << 8) -#define GET_AC11_AGG_LIMIT(p) (((p)&AC11_AGG_LIMIT_MASK) >> 8) -#define AC12_AGG_LIMIT_MASK (0x3f << 16) -#define AC12_AGG_LIMIT(p) (((p)&0x3f) << 16) -#define GET_AC12_AGG_LIMIT(p) (((p)&AC12_AGG_LIMIT_MASK) >> 16) -#define AC13_AGG_LIMIT_MASK (0x3f << 24) -#define AC13_AGG_LIMIT(p) (((p)&0x3f) << 24) -#define GET_AC13_AGG_LIMIT(p) (((p)&AC13_AGG_LIMIT_MASK) >> 24) - -#define AGG_AWSCR (WF_AGG_BASE + 0x048) /* 0x21248 */ -#define WINSIZE0_MASK (0x3f) -#define WINSIZE0(p) (((p)&0x3f)) -#define GET_WINSIZE0(p) (((p)&WINSIZE0_MASK)) -#define WINSIZE1_MASK (0x3f << 8) -#define WINSIZE1(p) (((p)&0x3f) << 8) -#define GET_WINSIZE1(p) (((p)&WINSIZE1_MASK) >> 8) -#define WINSIZE2_MASK (0x3f << 16) -#define WINSIZE2(p) (((p)&0x3f) << 16) -#define GET_WINSIZE2(p) (((p)&WINSIZE2_MASK) >> 16) -#define WINSIZE3_MASK (0x3f << 24) -#define WINSIZE3(p) (((p)&0x3f) << 24) -#define GET_WINSIZE3(p) (((p)&WINSIZE3_MASK) >> 24) - -#define AGG_AWSCR1 (WF_AGG_BASE + 0x04c) /* 0x2124c */ -#define WINSIZE4_MASK (0x3f) -#define WINSIZE4(p) (((p)&0x3f)) -#define GET_WINSIZE4(p) (((p)&WINSIZE4_MASK)) -#define WINSIZE5_MASK (0x3f << 8) -#define WINSIZE5(p) (((p)&0x3f) << 8) -#define GET_WINSIZE5(p) (((p)&WINSIZE5_MASK) >> 8) -#define WINSIZE6_MASK (0x3f << 16) -#define WINSIZE6(p) (((p)&0x3f) << 16) -#define GET_WINSIZE6(p) (((p)&WINSIZE6_MASK) >> 16) -#define WINSIZE7_MASK (0x3f << 24) -#define WINSIZE7(p) (((p)&0x3f) << 24) -#define GET_WINSIZE7(p) (((p)&WINSIZE7_MASK) >> 24) - -#define AGG_PCR (WF_AGG_BASE + 0x050) /* 0x21250 */ -#define MM_PROTECTION (1 << 16) -#define GET_MM_PROTECTION(p) (((p)&MM_PROTECTION) >> 16) -#define GF_PROTECTION (1 << 17) -#define GET_GF_PROTECTION(p) (((p)&GF_PROTECTION) >> 17) -#define PROTECTION_MODE (1 << 19) -#define GET_PROTECTION_MODE(p) (((p)&PROTECTION_MODE) >> 19) -#define BW40_PROTECTION (1 << 20) -#define GET_BW40_PROTECTION(p) (((p)&BW40_PROTECTION) >> 20) -#define RIFS_PROTECTION (1 << 21) -#define GET_RIFS_PROTECTION(p) (((p)&RIFS_PROTECTION) >> 21) -#define BW80_PROTECTION (1 << 22) -#define GET_BW80_PROTECTION(p) (((p)&BW80_PROTECTION) >> 22) -#define BW160_PROTECTION (1 << 23) -#define GET_BW160_PROTECTION(p) (((p)&BW160_PROTECTION) >> 23) -#define ERP_PROTECTION_MASK (0x1f << 24) -#define ERP_PROTECTION(p) (((p)&0x1f) << 24) -#define GET_ERP_PROTECTION(p) (((p)&ERP_PROTECTION_MASK) >> 24) - -#define AGG_PCR1 (WF_AGG_BASE + 0x054) /* 0x21254 */ -#define RTS_THRESHOLD_MASK (0xfffff) -#define RTS_THRESHOLD(p) (((p)&0xfffff)) -#define GET_RTS_THRESHOLD(p) (((p)&RTS_THRESHOLD_MASK)) -#define RTS_PKT_NUM_THRESHOLD_MASK (0x7f << 25) -#define RTS_PKT_NUM_THRESHOLD(p) (((p)&0x7f) << 25) -#define GET_RTS_PKT_NUM_THRESHOLD(p) (((p)&RTS_PKT_NUM_THRESHOLD_MASK) >> 25) - -#define AGG_ASRCR (WF_AGG_BASE + 0x060) /* 0x21260 */ -#define TX_AGG_CNT_RANGE0_MASK (0x3f) -#define TX_AGG_CNT_RANGE1_MASK (0x3f << 8) -#define TX_AGG_CNT_RANGE2_MASK (0x3f << 16) -#define GET_AGG_CNT_RANGE0(p) (((p)&TX_AGG_CNT_RANGE0_MASK)) -#define GET_AGG_CNT_RANGE1(p) (((p)&TX_AGG_CNT_RANGE1_MASK) >> 8) -#define GET_AGG_CNT_RANGE2(p) (((p)&TX_AGG_CNT_RANGE2_MASK) >> 16) - -#define AGG_BQCR (WF_AGG_BASE + 0x064) /* 0x21264 */ -#define AGG_BCR (WF_AGG_BASE + 0x068) /* 0x21268 */ - -#define AGG_ACR (WF_AGG_BASE + 0x070) /* 0x21270 */ -#define AMPDU_NO_BA_RULE (1 << 0) -#define GET_AMPDU_NO_BA_RULE(p) (((p)&DU_NO_BA_RULE)) -#define AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK (1 << 1) -#define AGG_ACR_AMPDU_NO_BA_AR_RULE(p) (((p)&0x1) << 1) -#define GET_AGG_ACR_AMPDU_NO_BA_AR_RULE(p) \ - (((p)&AGG_ACR_AMPDU_NO_BA_AR_RULE_MASK) >> 1) - -#define BAR_RATE_TX_RATE_MASK (0x3f << 20) -#define BAR_RATE_TX_RATE(p) (((p)&0x3f) << 20) -#define GET_BAR_RATE_TX_RATE(p) (((p)&BAR_RATE_TX_RATE_MASK) >> 20) -#define BAR_RATE_TX_MODE_MASK (0x7 << 26) -#define BAR_RATE_TX_MODE(p) (((p)&0x7) << 26) -#define GET_BAR_RATE_TX_MODE(p) (((p)&BAR_RATE_TX_MODE_MASK) >> 26) -#define BAR_RATE_NSTS_MASK (0x3 << 29) -#define BAR_RATE_NSTS(p) (((p)&0x3) << 29) -#define GET_BAR_RATE_NSTS(p) (((p)&BAR_RATE_NSTS_MASK) >> 29) -#define BAR_RATE_STBC (1 << 31) -#define GET_BAR_RATE_STBC(p) (((p)&BAR_RATE_STBC) >> 31) - -#define AGG_ACR1 (WF_AGG_BASE + 0x074) /* 0x21274 */ - -#define AGG_BTIMRR0 (WF_AGG_BASE + 0x080) -#define AGG_BTIMRR1 (WF_AGG_BASE + 0x084) -#define AGG_BTIMRR2 (WF_AGG_BASE + 0x088) -#define AGG_BTIMRR3 (WF_AGG_BASE + 0x08c) -#define AGG_BTIMRR4 (WF_AGG_BASE + 0x090) -#define AGG_BTIMRR5 (WF_AGG_BASE + 0x094) -#define AGG_BTIMRR6 (WF_AGG_BASE + 0x098) -#define AGG_BTIMRR7 (WF_AGG_BASE + 0x09c) -#define AGG_BTIMRR8 (WF_AGG_BASE + 0x0a0) -#define AGG_BTIMRR9 (WF_AGG_BASE + 0x0a4) - -typedef enum _AGG_TX_MODE_T { - Legacy_CCK = 0x0, - Legacy_OFDM, - HT_MIXED, - HT_GF, - VHT -} AGG_TX_MODE_T; - -typedef enum _AGG_CCK_RATE_T { - LONG_PREAMBLE_1M = 0x0, - LONG_PREAMBLE_2M = 0x1, - LONG_PREAMBLE_5M = 0x2, - LONG_PREAMBLE_11M = 0x3, - SHORT_PREAMBLE_2M = 0x5, - SHORT_PREAMBLE_5M = 0x6, - SHORT_PREAMBLE_11M = 0x7 -} AGG_CCK_RATE_T; - -typedef enum _AGG_OFDM_RATE_T { - TIM_OFDM_6M = 0xB, - TIM_OFDM_9M = 0xF, - TIM_OFDM_12M = 0xA, - TIM_OFDM_18M = 0xE, - TIM_OFDM_24M = 0x9, - TIM_OFDM_36M = 0xD, - TIM_OFDM_48M = 0x8, - TIM_OFDM_54M = 0xC -} AGG_OFDM_RATE_T; - -/* it's for the second that auto-gen by HW. */ -#define AGG_BTIMRR_TX_MODE_MASK (0x7) -#define AGG_BTIMRR_TX_MODE(p) (((p)&AGG_BTIMRR_TX_MODE_MASK) << 6) -#define AGG_BTIMRR_TX_RATE_MASK (0x3f) -#define AGG_BTIMRR_TX_RATE(p) (((p)&AGG_BTIMRR_TX_RATE_MASK)) - -#define AGG_BTIMRR_ODD_OMAC_IDX_RATE(p) (((p) << 16)) - -#define AGG_BWCR (WF_AGG_BASE + 0x0ec) /* 0x212ec */ -#define AGG_MRCR (WF_AGG_BASE + 0x0f4) /* 0x212f4 */ -#define RTS_RTY_CNT_LIMIT_MASK (0x1f << 7) -#define RTS_RTY_CNT_LIMIT(p) (((p)&0x1f) << 7) -#define GET_RTS_RTY_CNT_LIMIT(p) (((p)&RTS_RTY_CNT_LIMIT_MASK) >> 7) -#define BAR_TX_CNT_LIMIT_MASK (0x0f << 12) -#define BAR_TX_CNT_LIMIT(p) (((p)&0x0f) << 12) -#define GET_BAR_TX_CNT_LIMIT(p) (((p)&BAR_TX_CNT_LIMIT_MASK) >> 12) -#define AGG_DSCR1 (WF_AGG_BASE + 0xb4) /* 0x212b4 */ -#define AGG_SCR (WF_AGG_BASE + 0xd8) /* 0x212d8 */ - -#endif /* __WF_AGG_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_aon.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_aon.h deleted file mode 100644 index b0a7c9d341..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_aon.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_aon.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_AON_H__ -#define __WF_AON_H__ - -#define WF_AON_BASE 0x2D000 - -#endif /* __WF_AON_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_arb.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_arb.h deleted file mode 100644 index a567263846..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_arb.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_arb.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_ARB_H__ -#define __WF_ARB_H__ - -#define WF_ARB_BASE 0x21400 - -/********************************************************* - Tx Control Registers -**********************************************************/ - -#define ARB_TQCR0 (WF_ARB_BASE + 0x100) /* 0x21500 */ -#define ARB_TQCR1 (WF_ARB_BASE + 0x104) /* 0x21504 */ -#define ARB_TQCR2 (WF_ARB_BASE + 0x108) /* 0x21508 */ -#define ARB_TQCR3 (WF_ARB_BASE + 0x10c) /* 0x2150c */ -#define ARB_TQCR4 (WF_ARB_BASE + 0x110) /* 0x21510 */ -#define ARB_TQCR5 (WF_ARB_BASE + 0x114) /* 0x21514 */ -#define ARB_BCNQCR0 (WF_ARB_BASE + 0x118) /* 0x21518 */ -#define ARB_BCNQCR1 (WF_ARB_BASE + 0x11c) /* 0x2151c */ -#define ARB_BMCQCR0 (WF_ARB_BASE + 0x120) /* 0x21520 */ -#define ARB_BMCQCR1 (WF_ARB_BASE + 0x124) /* 0x21524 */ -#define ARB_BMCQCR2 (WF_ARB_BASE + 0x128) /* 0x21528 */ -#define ARB_BMCQCR3 (WF_ARB_BASE + 0x12c) /* 0x2152c */ -#define ARB_BMCQCR4 (WF_ARB_BASE + 0x130) /* 0x21530 */ -#define ARB_TXENTRYR (WF_ARB_BASE + 0x134) /* 0x21534 */ -#define ARB_BTIMCR0 (WF_ARB_BASE + 0x138) /* 0x21538 */ -#define ARB_BTIMCR1 (WF_ARB_BASE + 0x13c) /* 0x2153c */ -#define ARB_GTQR0 (WF_ARB_BASE + 0x010) /* 0x21410 */ -#define ARB_GTQR1 (WF_ARB_BASE + 0x014) /* 0x21414 */ -#define ARB_GTQR2 (WF_ARB_BASE + 0x018) /* 0x21418 */ -#define ARB_GTQR3 (WF_ARB_BASE + 0x01c) /* 0x2141c */ -#define ARB_AIFSR0 (WF_ARB_BASE + 0x020) /* 0x21420 */ - -#define ARB_AIFSR1_BCN_AIFS_MASK (0xf << 24) -#define ARB_AIFSR1_BCN_AIFS_HW_DEFAULT (0x3 << 24) - -#define ARB_AIFSR1 (WF_ARB_BASE + 0x024) /* 0x21424 */ -#define ARB_ACCWXR0 (WF_ARB_BASE + 0x028) /* 0x21428 */ -#define ARB_ACCWXR1 (WF_ARB_BASE + 0x02c) /* 0x2142c */ -#define ARB_ACCWXR2 (WF_ARB_BASE + 0x030) /* 0x21430 */ -#define ARB_ACCWXR3 (WF_ARB_BASE + 0x034) /* 0x21434 */ -#define ARB_ACCWXR4 (WF_ARB_BASE + 0x038) /* 0x21438 */ -#define ARB_ACCWXR5 (WF_ARB_BASE + 0x03c) /* 0x2143c */ -#define ARB_ACCWIR0 (WF_ARB_BASE + 0x040) /* 0x21440 */ - -#define ARB_ACCWIR1_BCN_CWMIN_MASK (0xff << 16) -#define ARB_ACCWIR1_BCN_CWMIN_HW_DEFAULT (0x3 << 16) -#define ARB_ACCWIR1 (WF_ARB_BASE + 0x044) /* 0x21444 */ -#define ARB_ACCWIR2 (WF_ARB_BASE + 0x048) /* 0x21448 */ -#define ARB_ACCWIR3 (WF_ARB_BASE + 0x04c) /* 0x2144c */ -#define ARB_ACCCWR0 (WF_ARB_BASE + 0x050) /* 0x21450 */ -#define ARB_ACCCWR1 (WF_ARB_BASE + 0x054) /* 0x21454 */ -#define ARB_ACCCWR2 (WF_ARB_BASE + 0x058) /* 0x21458 */ -#define ARB_ACCCWR3 (WF_ARB_BASE + 0x05c) /* 0x2145c */ -#define ARB_ACCCWR4 (WF_ARB_BASE + 0x060) /* 0x21460 */ -#define ARB_ACCCWR5 (WF_ARB_BASE + 0x064) /* 0x21464 */ - -/********************************************************* - Rx Cotnrol Registers -**********************************************************/ -#define ARB_RQCR (WF_ARB_BASE + 0x070) /* 0x21470 */ -#define ARB_RQCR_RX_START 0x01 -#define ARB_RQCR_RXV_START 0x10 -#define ARB_RQCR_RXV_R_EN 0x80 -#define ARB_RQCR_RXV_T_EN 0x100 - -/********************************************************* - System Cotnrol Registers -**********************************************************/ -#define ARB_SCR (WF_ARB_BASE + 0x080) /* 0x21480 */ -#define MT_ARB_SCR_BM_CTRL BIT31 -#define MT_ARB_SCR_BCN_CTRL BIT30 -#define MT_ARB_SCR_BTIM_CTRL BIT30 -#define MT_ARB_SCR_BCN_EMPTY BIT28 -#define MT_ARB_SCR_TXDIS BIT8 -#define MT_ARB_SCR_RXDIS BIT9 -#define MT_ARB_SCR_OPMODE_MASK 0x3 - -/* ARB_SCR_BCNQ_OP_MODE */ -#define BCNQ_OP_MODE_STA 0x0 -#define BCNQ_OP_MODE_AP 0x1 -#define BCNQ_OP_MODE_ADHOC 0x2 -#define ARB_SXCR0 (WF_ARB_BASE + 0x084) /* 0x21484 */ -#define ARB_SXCR1 (WF_ARB_BASE + 0x088) /* 0x21488 */ -#define ARB_SXCR2 (WF_ARB_BASE + 0x08c) /* 0x2148c */ - -/********************************************************* - PTA Control Registers -**********************************************************/ - -/********************************************************* - PTA Test Registers -**********************************************************/ - -#endif /* __WF_ARB_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_cfgoff.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_cfgoff.h deleted file mode 100644 index b42b2f82f3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_cfgoff.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_cfgoff.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_CFG_OFF_H__ -#define __WF_CFG_OFF_H__ - -#define WF_CFG_OFF_BASE 0x21E00 - -#endif /* __WF_CFG_OFF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_dma.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_dma.h deleted file mode 100644 index e7383071fd..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_dma.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_dma.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_DMA_H__ -#define __WF_DMA_H__ - -#define WF_DMA_BASE 0x21C00 -#define DMA_DCR0 (WF_DMA_BASE + 0x000) -#define MAX_RX_PKT_LENGTH_MASK (0x3fff << 2) -#define MAX_RX_PKT_LENGTH(p) (((p)&0x3fff) << 2) -#define GET_MAX_PKT_LENGTH(p) (((p)&MAX_RX_PKT_LENGTH_MASK) >> 2) -#define DAMSDU_EN (1 << 16) -#define VEC_DROP_EN (1 << 17) -#define RX_HDR_TRANS_CHK_BSSID (1 << 18) -#define RX_HD_TRANS_EN (1 << 19) -#define PCP_EQ_TID (1 << 20) -#define RX_INS_VLAN (1 << 21) -#define RX_RM_VLAN (1 << 22) -#define RX_HDR_TRANS_MODE (1 << 23) -#define ETBL0_EN (1 << 24) -#define ETBL1_EN (1 << 25) -#define ETBL2_EN (1 << 26) -#define ETBL3_EN (1 << 27) -#define ETBL4_EN (1 << 28) -#define ETBL5_EN (1 << 29) -#define ETBL6_EN (1 << 30) -#define ETBL7_EN (1 << 31) - -#define DMA_DCR1 (WF_DMA_BASE + 0x004) /* 0x21c04 */ -#define RXSM_GROUP1_EN (1 << 11) -#define RXSM_GROUP2_EN (1 << 12) -#define RXSM_GROUP3_EN (1 << 13) - -#define DMA_FQCR0 (WF_DMA_BASE + 0x008) /* 0x21c08 */ -#define DMA_FQCR0_FQ_EN BIT31 -#define DMA_FQCR0_FQ_STS BIT30 -#define DMA_FQCR0_FQ_MODE_OMAC BIT29 -#define DMA_FQCR0_FQ_MODE_WIDX ~BIT29 -#define DMA_FQCR0_FQ_DEST_QID_MASK (0x1f) -#define DMA_FQCR0_FQ_DEST_QID(p) (((p)&DMA_FQCR0_FQ_DEST_QID_MASK) << 24) -#define DMA_FQCR0_FQ_DEST_PID_MASK (0x3) -#define DMA_FQCR0_FQ_DEST_PID(p) (((p)&DMA_FQCR0_FQ_DEST_PID_MASK) << 22) -#define DMA_FQCR0_FQ_TARG_QID_MASK (0x1f) -#define DMA_FQCR0_FQ_TARG_QID(p) (((p)&DMA_FQCR0_FQ_TARG_QID_MASK) << 16) -#define DMA_FQCR0_FQ_TARG_OM_MASK (0x3f) -#define DMA_FQCR0_FQ_TARG_OM(p) (((p)&DMA_FQCR0_FQ_TARG_OM_MASK) << 8) -#define DMA_FQCR0_FQ_TARG_WIDX_MASK (0xff) -#define DMA_FQCR0_FQ_TARG_WIDX(p) (((p)&DMA_FQCR0_FQ_TARG_WIDX_MASK)) - -#define FQ_MODE_WIDX 0 -#define FQ_MODE_OMIDX 1 - -#define DMA_FQCR1 (WF_DMA_BASE + 0x00c) /* 0x21c0c */ - -#define DMA_RCFR0 (WF_DMA_BASE + 0x070) /* 0x21c70 */ -#define DMA_VCFR0 (WF_DMA_BASE + 0x07c) /* 0x21c7c */ - -#define TXS_ME (1 << 0) -#define TXS_RE (1 << 1) -#define TXS_LE (1 << 2) -#define TXS_BE (1 << 3) -#define TXS_TXOP (1 << 4) -#define TXS_PS (1 << 5) -#define TXS_BAF (1 << 6) - -#define VTR0 (WF_DMA_BASE + 0x010) -#define VTR1 (WF_DMA_BASE + 0x014) -#define VTR2 (WF_DMA_BASE + 0x018) -#define VTR3 (WF_DMA_BASE + 0x01c) -#define VTR4 (WF_DMA_BASE + 0x020) -#define VTR5 (WF_DMA_BASE + 0x024) -#define VTR6 (WF_DMA_BASE + 0x028) -#define VTR7 (WF_DMA_BASE + 0x02c) -#define VTR8 (WF_DMA_BASE + 0x030) -#define VTR9 (WF_DMA_BASE + 0x034) -#define VTR10 (WF_DMA_BASE + 0x038) -#define VTR11 (WF_DMA_BASE + 0x03c) -#define VTR12 (WF_DMA_BASE + 0x040) -#define VTR13 (WF_DMA_BASE + 0x044) -#define VTR14 (WF_DMA_BASE + 0x048) -#define VTR15 (WF_DMA_BASE + 0x04c) -#define VTR16 (WF_DMA_BASE + 0x050) -#define VTR17 (WF_DMA_BASE + 0x054) -#define BSSIDxx0_TCL_VID_MASK (0xfff) -#define BSSIDxx0_TCL_VID(p) (((p)&0xfff)) -#define GET_BSSIDxx0_TCL_VID(p) (((p)&BSSIDxx0_TCL_VID_MASK)) -#define BSSIDxx0_TCL_CFI (1 << 12) -#define BSSIDxx0_TCL_PCP_MASK (0x7 << 13) -#define BSSIDxx0_TCL_PCP(p) (((p)&0x7) << 13) -#define GET_BSSIDxx0_TCP_PCP(p) (((p)&BSSIDxx0_TCL_PCP_MASK) >> 13) -#define BSSIDxx1_TCL_VID_MASK (0xfff << 16) -#define BSSIDxx1_TCL_VID(p) (((p)&0xfff) << 16) -#define GET_BSSIDxx1_TCL_VID(p) (((p)&BSSIDxx1_TCL_VID_MASK) >> 16) -#define BSSIDxx1_TCL_CFI (1 << 28) -#define BSSIDxx1_TCL_PCP_MASK (0x7 << 29) -#define BSSIDxx1_TCL_PCP(p) (((p)&0x7) << 29) -#define GET_BSSIDxx1_TCP_PCP(p) (((p)&BSSIDxx1_TCL_PCP_MASK) >> 29) - -enum { - ETBL_INDEX0, - ETBL_INDEX1, - ETBL_INDEX2, - ETBL_INDEX3, - ETBL_INDEX4, - ETBL_INDEX5, - ETBL_INDEX6, - ETBL_INDEX7, -}; - -#define ETBLR0 (WF_DMA_BASE + 0x060) -#define ETBL0_MASK (0xffff) -#define ETBL0(p) (((p)&0xffff)) -#define GET_ETBL0(p) (((p)&ETBL0_MASK)) -#define ETBL1_MASK (0xffff << 16) -#define ETBL1(p) (((p)&0xffff) << 16) -#define GET_ETBL1(p) (((p)&ETBL1_MASK) >> 16) - -#define ETBLR1 (WF_DMA_BASE + 0x064) -#define ETBL2_MASK (0xffff) -#define ETBL2(p) (((p)&0xffff)) -#define GET_ETBL2(p) (((p)&ETBL2_MASK)) -#define ETBL3_MASK (0xffff << 16) -#define ETBL3(p) (((p)&0xffff) << 16) -#define GET_ETBL3(p) (((p)&ETBL3_MASK) >> 16) - -#define ETBLR2 (WF_DMA_BASE + 0x068) -#define ETBL4_MASK (0xffff) -#define ETBL4(p) (((p)&0xffff)) -#define GET_ETBL4(p) (((p)&ETBL4_MASK)) -#define ETBL5_MASK (0xffff << 16) -#define ETBL5(p) (((p)&0xffff) << 16) -#define GET_ETBL5(p) (((p)&ETBL5_MASK) >> 16) - -#define ETBLR3 (WF_DMA_BASE + 0x06C) -#define ETBL6_MASK (0xffff) -#define ETBL6(p) (((p)&0xffff)) -#define GET_ETBL6(p) (((p)&ETBL6_MASK)) -#define ETBL7_MASK (0xffff << 16) -#define ETBL7(p) (((p)&0xffff) << 16) -#define GET_ETBL7(p) (((p)&ETBL7_MASK) >> 16) - -#define DMA_TCFR0 (WF_DMA_BASE + 0x080) /* 0x21c80 */ -#define TXS2M_BIT_MAP_MASK (0x7f) -#define TXS2M_BIT_MAP(p) (((p)&0x7f)) -#define GET_TXS2M_BIT_MAP(p) (((p)&TXS2M_BIT_MAP_MASK)) -#define TXS2M_AGG_CNT_MASK (0x1f << 8) -#define TXS2M_AGG_CNT(p) (((p)&0x1f) << 8) -#define GET_TXS2M_AGG_CNT(p) (((p)&TXS2M_AGG_CNT_MASK) >> 8) -#define TXS2M_QID_MASK (0x3 << 14) -#define TXS2M_QID(p) (((p)&0x3) << 14) -#define GET_TXS2M_QID(p) (((p)&TXS2M_QID_MASK) >> 14) -#define TXS2M_TOUT_MASK (0xfff << 16) -#define TXS2M_TOUT(p) (((p)&0xfff) << 16) -#define GET_TXS2M_TOUT(p) (((p)&TXS2M_TOUT_MASK) >> 16) -#define DMA_TCFR1 (WF_DMA_BASE + 0x084) /* 0x21c84 */ -#define TXS2H_BIT_MAP_MASK (0x7f) -#define TXS2H_BIT_MAP(p) (((p)&0x7f)) -#define GET_TXS2H_BIT_MAP(p) (((p)&TXS2H_BIT_MAP_MASK)) -#define TXS2H_AGG_CNT_MASK (0x1f << 8) -#define TXS2H_AGG_CNT(p) (((p)&0x1f) << 8) -#define GET_TXS2H_AGG_CNT(p) (((p)&TXS2H_AGG_CNT_MASK) >> 8) -#define TXS2H_QID (1 << 14) -#define TXS2H_TOUT_MASK (0xfff << 16) -#define TXS2H_TOUT(p) (((p)&0xfff) << 16) -#define GET_TXS2H_TOUT(p) (((p)&TXS2H_TOUT_MASK) >> 16) -#define DMA_TMCFR0 (WF_DMA_BASE + 0x088) /* 0x21c88 */ - -#endif /* __WF_DMA_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_int_wakeup_top.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_int_wakeup_top.h deleted file mode 100644 index fef3c3ed3d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_int_wakeup_top.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_int_wakeup_top.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ----------------------------------------------- -*/ -#ifndef __WF_INT_WAKEUP_TOP_H__ -#define __WF_INT_WAKEUP_TOP_H__ - -/* In range of 0x24000 ~ 0x24400 */ -#define WF_INT_WAKEUP_TOP_BASE 0x24400 -#define WISR0 (WF_INT_WAKEUP_TOP_BASE + 0x00) -#define WISR1 (WF_INT_WAKEUP_TOP_BASE + 0x04) -#define WIER0 (WF_INT_WAKEUP_TOP_BASE + 0x08) -#define WIER1 (WF_INT_WAKEUP_TOP_BASE + 0x0c) -#define AHB_CLK_CTL (WF_INT_WAKEUP_TOP_BASE + 0x20) /* 0x24420 */ -#define WISR2 (WF_INT_WAKEUP_TOP_BASE + 0x24) -#define WIER2 (WF_INT_WAKEUP_TOP_BASE + 0x28) -#define WISR3 (WF_INT_WAKEUP_TOP_BASE + 0x2c) -#define WIER3 (WF_INT_WAKEUP_TOP_BASE + 0x30) /* 0x24430 */ -#define WISR4 (WF_INT_WAKEUP_TOP_BASE + 0x34) -#define WIER4 (WF_INT_WAKEUP_TOP_BASE + 0x38) -#define HWISR0 (WF_INT_WAKEUP_TOP_BASE + 0x3c) - -#define HWIER0_TBTT1 BIT20 -#define HWIER0_PRETBTT1 BIT23 -#define HWIER0_TBTT2 BIT21 -#define HWIER0_PRETBTT2 BIT24 -#define HWIER0_TBTT3 BIT22 -#define HWIER0_PRETBTT3 BIT25 - -#define HWIER0_TTTT1 BIT26 -#define HWIER0_PRETTTT1 BIT29 -#define HWIER0_TTTT2 BIT27 -#define HWIER0_PRETTTT2 BIT30 -#define HWIER0_TTTT3 BIT28 -#define HWIER0_PRETTTT3 BIT31 - -#define HWIER0 (WF_INT_WAKEUP_TOP_BASE + 0x40) -#define HWISR1 (WF_INT_WAKEUP_TOP_BASE + 0x44) -#define HWIER1 (WF_INT_WAKEUP_TOP_BASE + 0x48) -#define HWISR2 (WF_INT_WAKEUP_TOP_BASE + 0x4c) /* 0x2444c */ -#define HWIER2 (WF_INT_WAKEUP_TOP_BASE + 0x50) /* 0x24450 */ -#define HWISR3 (WF_INT_WAKEUP_TOP_BASE + 0x54) /* 0x24454 */ - -#define HWIER3_TBTT0 BIT15 -#define HWIER3_PRETBTT0 BIT31 - -#define HWIER3 (WF_INT_WAKEUP_TOP_BASE + 0x58) -#define HWISR4 (WF_INT_WAKEUP_TOP_BASE + 0x5c) - -#define HWIER4_TTTT0 BIT15 -#define HWIER4_PRETTTT0 BIT31 - -#define HWIER4 (WF_INT_WAKEUP_TOP_BASE + 0x60) /* 0x24460 */ - -#endif /* __WF_INT_WAKEUP_TOP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_lpon_top.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_lpon_top.h deleted file mode 100644 index 9214046abb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_lpon_top.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_lpon_top.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_LPON_TOP_H__ -#define __WF_LPON_TOP_H__ - -/* In range of 0x24000 ~ 0x24400 */ -#define WF_LPON_TOP_BASE 0x24000 -#define LPON_TT0SBOR1 (WF_LPON_TOP_BASE + 0x00) -#define LPON_TT0SBOR2 (WF_LPON_TOP_BASE + 0x04) -#define LPON_TT0SBOR3 (WF_LPON_TOP_BASE + 0x08) -#define LPON_TT0SBOR4 (WF_LPON_TOP_BASE + 0x0c) -#define LPON_TT0SBOR5 (WF_LPON_TOP_BASE + 0x54) -#define LPON_TT0SBOR6 (WF_LPON_TOP_BASE + 0x58) -#define LPON_TT0SBOR7 (WF_LPON_TOP_BASE + 0x64) -#define LPON_TT0SBOR8 (WF_LPON_TOP_BASE + 0x68) -#define LPON_TT0SBOR9 (WF_LPON_TOP_BASE + 0x6c) -#define LPON_TT0SBOR10 (WF_LPON_TOP_BASE + 0x70) -#define LPON_TT0SBOR11 (WF_LPON_TOP_BASE + 0x74) -#define LPON_TT0SBOR12 (WF_LPON_TOP_BASE + 0x78) -#define LPON_TT0SBOR13 (WF_LPON_TOP_BASE + 0x80) -#define LPON_TT0SBOR14 (WF_LPON_TOP_BASE + 0x84) -#define LPON_TT0SBOR15 (WF_LPON_TOP_BASE + 0x8c) -#define SUB_BSSID0_TTTT_OFFSET_n_MASK (0x3ffff) -#define SBSS_TTTT0_TSF0_EN BIT29 -#define TTTT0_n_INT_EN BIT30 -#define PRE_TTTT0_n_INT_EN BIT31 - -#define TSF_TIMER_HW_MODE_FULL_ADHOC (3 << 2) -#define TSF_TIMER_HW_MODE_RX_ONLY (2 << 2) -#define TSF_TIMER_HW_MODE_TICK_ONLY (1 << 2) -#define TSF_TIMER_HW_MODE_FULL (0 << 2) - -#define TSF_TIMER_SW_MODE_TSFTIMERVALUEREAD 3 -#define TSF_TIMER_SW_MODE_TSFTIMERVALUEADJUST 2 -#define TSF_TIMER_SW_MODE_TSFTIMERVALUECHANGE 1 - -#define LPON_T0CR (WF_LPON_TOP_BASE + 0x10) /* 0x24010 */ -#define LPON_T1CR (WF_LPON_TOP_BASE + 0x14) /* 0x24014 */ -#define LPON_UTTR0 (WF_LPON_TOP_BASE + 0x18) /* 0x24018 */ -#define LPON_UTTR1 (WF_LPON_TOP_BASE + 0x1c) /* 0x2401c */ -#define LPON_BTEIR (WF_LPON_TOP_BASE + 0x20) /* 0x24020 */ -#define LPON_TIMTR (WF_LPON_TOP_BASE + 0x24) /* 0x24024 */ -#define LPON_T0STR (WF_LPON_TOP_BASE + 0x28) /* 0x24028 */ -#define LPON_T1STR (WF_LPON_TOP_BASE + 0x2c) /* 0x2402c */ -#define LPON_PISR (WF_LPON_TOP_BASE + 0x30) /* 0x24030 */ -#define DEFAULT_PRETBTT_INTERVAL_IN_MS 0x50 /* 5ms */ - -#define LPON_T0TPCR (WF_LPON_TOP_BASE + 0x34) /* 0x24034 */ -#define LPON_T1TPCR (WF_LPON_TOP_BASE + 0x38) /* 0x24038 */ -#define LPON_T2TPCR (WF_LPON_TOP_BASE + 0x108) /* 0x24108 */ -#define LPON_T3TPCR (WF_LPON_TOP_BASE + 0x10c) /* 0x2410c */ - -#define BEACONPERIODn_MASK (0xffff) -#define BEACONPERIODn(p) (((p)&0xffff)) -#define DTIMPERIODn_MASK (0xff << 16) -#define DTIMPERIODn(p) (((p)&0xff) << 16) -#define TBTTWAKEPERIODn_MASK (0xf << 24) -#define TBTTWAKEPERIODn(p) (((p)&0xf) << 24) -#define DTIMWAKEPERIODn_MASK (0x7 << 28) -#define DTIMWAKEPERIODn(p) (((p)&0x7) << 28) -#define TBTTn_CAL_EN (1 << 31) - -#define LPON_TTSR (WF_LPON_TOP_BASE + 0x3c) /* 0x2403c */ -#define LPON_TFRSR (WF_LPON_TOP_BASE + 0x40) /* 0x24040 */ -#define LPON_TSELR (WF_LPON_TOP_BASE + 0x44) /* 0x24044 */ -#define LPON_SPCR (WF_LPON_TOP_BASE + 0x48) /* 0x24048 */ -#define LPON_BCNTR (WF_LPON_TOP_BASE + 0x4c) /* 0x2404c */ -#define LPON_TCLCR (WF_LPON_TOP_BASE + 0x50) /* 0x24050 */ - -#define PRETBTT_INT_EN (1 << 7) -#define BMC_TIMEOUT_EN (1 << 6) -#define BCN_TIMEOUT_EN (1 << 5) -#define PRETBTT_TIMEUP_EN (1 << 4) -#define TBTT_TIMEUP_EN (1 << 3) -#define PREDTIM_TRIG_EN (1 << 2) -#define PRETBTT_TRIG_EN (1 << 1) -#define TBTT_PERIOD_TIMER_EN (1 << 0) - -#define LPON_MPTCR0 (WF_LPON_TOP_BASE + 0x5c) /* 0x2405c */ -#define LPON_MPTCR1 (WF_LPON_TOP_BASE + 0x60) /* 0x24060 */ -#define LPON_MPTCR2 (WF_LPON_TOP_BASE + 0x110) /* 0x24110 */ -#define LPON_MPTCR3 (WF_LPON_TOP_BASE + 0x114) /* 0x24114 */ - -#define LPON_FRCR (WF_LPON_TOP_BASE + 0x7c) /* 0x2407c */ -#define LPON_WLANCKCR (WF_LPON_TOP_BASE + 0x88) /* 0x24088 */ - -#define LPON_SBTOR1 (WF_LPON_TOP_BASE + 0xa0) -#define LPON_SBTOR2 (WF_LPON_TOP_BASE + 0xa4) -#define LPON_SBTOR3 (WF_LPON_TOP_BASE + 0xa8) -#define LPON_SBTOR4 (WF_LPON_TOP_BASE + 0xac) -#define LPON_SBTOR5 (WF_LPON_TOP_BASE + 0xb0) -#define LPON_SBTOR6 (WF_LPON_TOP_BASE + 0xb4) -#define LPON_SBTOR7 (WF_LPON_TOP_BASE + 0xb8) -#define LPON_SBTOR8 (WF_LPON_TOP_BASE + 0xbc) -#define LPON_SBTOR9 (WF_LPON_TOP_BASE + 0xc0) -#define LPON_SBTOR10 (WF_LPON_TOP_BASE + 0xc4) -#define LPON_SBTOR11 (WF_LPON_TOP_BASE + 0xc8) -#define LPON_SBTOR12 (WF_LPON_TOP_BASE + 0xcc) -#define LPON_SBTOR13 (WF_LPON_TOP_BASE + 0xd0) -#define LPON_SBTOR14 (WF_LPON_TOP_BASE + 0xd4) -#define LPON_SBTOR15 (WF_LPON_TOP_BASE + 0xd8) -#define SUB_BSSID0_TIME_OFFSET_n_MASK (0xfffff) -#define SUB_BSSID0_TIME_OFFSET_n(p) (((p)&0xfffff)) -#define SBSS_TBTT0_TSF0_EN BIT29 -#define TBTT0_n_INT_EN BIT30 -#define PRE_TBTT0_n_INT_EN BIT31 - -#define LPON_T2CR (WF_LPON_TOP_BASE + 0xF8) -#define LPON_T3CR (WF_LPON_TOP_BASE + 0xFC) - -#define LPON_MPTCR4 (WF_LPON_TOP_BASE + 0x128) /* 0x24128 */ -#define TTTT0_PERIODTIMER_EN (1 << 0) -#define PRETTTT0_TRIG_EN (1 << 1) -#define TTTT0_TIMEUP_EN (1 << 3) -#define PRETTTT0TIMEUP_EN (1 << 4) -#define TIM_TIMEOUT0_EN (1 << 5) -#define TIM_BMC_TIMEOUT0_EN (1 << 6) -#define PRETTTT0INT_EN (1 << 7) -#define TTTT1PERIODTIMER_EN (1 << 8) -#define PRETTTT1_TRIG_EN (1 << 9) -#define TTTT1_TIMEUP_EN (1 << 11) -#define PRETTTT1TIMEUP_EN (1 << 12) -#define TIM_TIMEOUT1_EN (1 << 13) -#define TIM_BMC_TIMEOUT1_EN (1 << 14) -#define PRETTTT1INT_EN (1 << 15) -#define TIM_PARSE_TIM0_EN (1 << 27) -#define TIM_BMC0_EN (1 << 28) -#define TIM_PARSE_TIM1_EN (1 << 29) -#define TIM_BMC1_EN (1 << 30) - -#define LPON_MPTCR5 (WF_LPON_TOP_BASE + 0x12c) /* 0x2412c */ -#define LPON_PTTISR (WF_LPON_TOP_BASE + 0xdc) /* 0x240dc */ -#define DEFAULT_PRETTTT_INTERVAL_IN_MS 0x50 /* 5ms, unit is 64usec */ -#define IDX_DEFAULT_PRETTTT_INTERVAL(_p) \ - (DEFAULT_PRETTTT_INTERVAL_IN_MS << (8 * _p)) - -#define LPON_TT0TPCR (WF_LPON_TOP_BASE + 0xe8) /* 0x240e8 */ -#define DEFAULT_TTTT_OFFSET_IN_MS 0x2800 /* make default +10ms, unit is usec*/ -#define LPON_TT1TPCR (WF_LPON_TOP_BASE + 0xec) /* 0x240ec */ -#define LPON_TT2TPCR (WF_LPON_TOP_BASE + 0xf0) /* 0x240f0 */ -#define LPON_TT3TPCR (WF_LPON_TOP_BASE + 0xf4) /* 0x240f4 */ -#define TTTTn_OFFSET_OF_TBTTn_MASK (0x3ffff) -#define TTTTn_OFFSET_OF_TBTTn(p) (((p)&0x3ffff)) -#define TTTTn_CAL_EN BIT31 - -#define LPON_TT4TPCR (WF_LPON_TOP_BASE + 0x1b8) /* 0x241b8 */ -#define LPON_TT5TPCR (WF_LPON_TOP_BASE + 0x1bc) /* 0x241bc */ -#define LPON_TT6TPCR (WF_LPON_TOP_BASE + 0x1c0) /* 0x241c0 */ -#define LPON_TT7TPCR (WF_LPON_TOP_BASE + 0x1c4) /* 0x241c4 */ -#define TIM_PERIODn_MASK (0xffffff) -#define TIM_PERIODn(p) (((p)&0xffffff)) - -#define SET_TTTT_PERIOD(_pAd, _interval) \ - (_interval * _pAd->CommonCfg.BeaconPeriod) - -/* TSF_TIMER_SW_MODE */ -#define TSF_TIMER_VALUE_CHANGE 0x1 -#define TSF_TIMER_VALUE_ADJUST 0x2 -#define TSF_TIMER_VALUE_READ 0x3 - -#define TSF_TIMER_HW_MODE_MASK (0x3 << 2) -#define TSF_TIMER_SW_MODE_MASK (0x3 << 0) - -#endif /* __WF_LPON_TOP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_mib.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_mib.h deleted file mode 100644 index d62d6809da..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_mib.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_mib.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_MIB_H__ -#define __WF_MIB_H__ - -#define WF_MIB_BASE 0x2C000 - -#define MIB_MSCR (WF_MIB_BASE + 0x00) -#define MIB_MPBSCR (WF_MIB_BASE + 0x04) -#define MIB_MSDR0 (WF_MIB_BASE + 0x08) -#define MIB_MSDR4 (WF_MIB_BASE + 0x18) -#define MIB_MSDR5 (WF_MIB_BASE + 0x1c) -#define MIB_MSDR6 (WF_MIB_BASE + 0x20) -#define MIB_MSDR7 (WF_MIB_BASE + 0x24) -#define MIB_MSDR8 (WF_MIB_BASE + 0x28) -#define MIB_MSDR9 (WF_MIB_BASE + 0x2c) -#define MIB_MSDR10 (WF_MIB_BASE + 0x30) -#define MIB_MSDR11 (WF_MIB_BASE + 0x34) -#define MIB_MSDR12 (WF_MIB_BASE + 0x38) -#define MIB_MSDR14 (WF_MIB_BASE + 0x40) -#define MIB_MSDR15 (WF_MIB_BASE + 0x44) -#define MIB_MSDR16 (WF_MIB_BASE + 0x48) -#define MIB_MSDR17 (WF_MIB_BASE + 0x4c) -#define MIB_MSDR18 (WF_MIB_BASE + 0x50) -#define MIB_MSDR22 (WF_MIB_BASE + 0x60) -#define MIB_MSDR23 (WF_MIB_BASE + 0x64) -#define MIB_MDR0 (WF_MIB_BASE + 0xa0) -#define MIB_MDR1 (WF_MIB_BASE + 0xa4) -#define MIB_MDR2 (WF_MIB_BASE + 0xa8) -#define MIB_MDR3 (WF_MIB_BASE + 0xac) -#define MIB_MB0SDR0 (WF_MIB_BASE + 0x100) -#define MIB_MB1SDR0 (WF_MIB_BASE + 0x110) -#define MIB_MB2SDR0 (WF_MIB_BASE + 0x120) -#define MIB_MB3SDR0 (WF_MIB_BASE + 0x130) -#define MIB_MB0SDR1 (WF_MIB_BASE + 0x104) -#define MIB_MB1SDR1 (WF_MIB_BASE + 0x114) -#define MIB_MB2SDR1 (WF_MIB_BASE + 0x124) -#define MIB_MB3SDR1 (WF_MIB_BASE + 0x134) -#define MIB_MB0SDR2 (WF_MIB_BASE + 0x108) -#define MIB_MB1SDR2 (WF_MIB_BASE + 0x118) -#define MIB_MB2SDR2 (WF_MIB_BASE + 0x128) -#define MIB_MB3SDR2 (WF_MIB_BASE + 0x138) - -#endif /* __WF_SEC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_pf.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_pf.h deleted file mode 100644 index f5aed43efb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_pf.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_pf.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_PF_H__ -#define __WF_PF_H__ - -#define WF_PF_BASE 0x22000 - -#endif /* __WF_PF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_phy.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_phy.h deleted file mode 100644 index 534a66d073..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_phy.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_phy.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_PHY_H__ -#define __WF_PHY_H__ - -#define WF_PHY_BASE 0x10000 - -/* WF_PHY_FRONT */ -#define CR_PHYCK_CTRL (WF_PHY_BASE + 0x0000) -#define CR_FR_CKG_CTRL (WF_PHY_BASE + 0x0004) -#define CR_FR_RST_CTRL (WF_PHY_BASE + 0x0008) - -#define CR_TXPTN_00 (WF_PHY_BASE + 0x01A0) -#define CR_TXPTN_01 (WF_PHY_BASE + 0x01A4) - -#define CR_RFINTF_00 (WF_PHY_BASE + 0x0200) -#define CR_RFINTF_CAL_NSS_MASK (0x3 << 28) -#define CR_RFINTF_CAL_NSS(p) (((p)&0x3) << 28) -#define CR_RFINTF_01 (WF_PHY_BASE + 0x0204) - -#define CR_RFINTF_02 (WF_PHY_BASE + 0x0208) -#define CR_RFINTF_03 (WF_PHY_BASE + 0x020C) - -#define RO_AGC_DEBUG_2 (WF_PHY_BASE + 0x05A4) - -#define CR_RXTD_39 (WF_PHY_BASE + 0x06F8) -#define CR_FFT_MANU_CTRL (WF_PHY_BASE + 0x0704) - -#define CR_DPD_CAL_03 (WF_PHY_BASE + 0x090C) - -#define CR_TXFE_3 (WF_PHY_BASE + 0x0A08) -#define CR_TXFE_4 (WF_PHY_BASE + 0x0A0C) -#define CR_TSSI_0 (WF_PHY_BASE + 0x0D00) -#define CR_TSSI_1 (WF_PHY_BASE + 0x0D04) -#define CR_TSSI_3 (WF_PHY_BASE + 0x0D14) -#define CR_TSSI_6 (WF_PHY_BASE + 0x0D18) -#define CR_TSSI_9 (WF_PHY_BASE + 0x0D24) -#define CR_TSSI_13 (WF_PHY_BASE + 0x0D34) - -#define CR_WF1_RFINTF_01 (WF_PHY_BASE + 0x1204) -#define CR_WF1_RFINTF_02 (WF_PHY_BASE + 0x1208) - -#define CR_TXFE1_3 (WF_PHY_BASE + 0x1A08) -#define CR_TXFE1_4 (WF_PHY_BASE + 0x1A0C) - -#define CR_WF1_TSSI_0 (WF_PHY_BASE + 0x1D00) -#define CR_WF1_TSSI_1 (WF_PHY_BASE + 0x1D04) -#define CR_WF1_TSSI_3 (WF_PHY_BASE + 0x1D14) -#define CR_WF1_TSSI_6 (WF_PHY_BASE + 0x1D18) -#define CR_WF1_TSSI_9 (WF_PHY_BASE + 0x1D24) -#define CR_WF1_TSSI_13 (WF_PHY_BASE + 0x1D34) - -/* WF_PHY_BACK */ -#define CR_BK_RST_CTRL (WF_PHY_BASE + 0x4004) - -#define CR_PHYCTRL_0 (WF_PHY_BASE + 0x4100) -#define CR_PHYCTRL_2 (WF_PHY_BASE + 0x4108) -#define RO_PHYCTRL_STS0 (WF_PHY_BASE + 0x410C) -#define RO_PHYCTRL_STS1 (WF_PHY_BASE + 0x4110) -#define RO_PHYCTRL_STS2 (WF_PHY_BASE + 0x4114) -#define RO_PHYCTRL_STS4 (WF_PHY_BASE + 0x411C) -#define RO_PHYCTRL_STS5 (WF_PHY_BASE + 0x4120) - -#define CR_PHYCTRL_DBGCTRL (WF_PHY_BASE + 0x4140) - -#define CR_PHYMUX_3 (WF_PHY_BASE + 0x420C) -#define CR_PHYMUX_5 (WF_PHY_BASE + 0x4214) -#define CR_PHYMUX_10 (WF_PHY_BASE + 0x4228) -#define CR_PHYMUX_11 (WF_PHY_BASE + 0x422C) -#define CR_PHYMUX_24 (WF_PHY_BASE + 0x4260) -#define CR_PHYMUX_25 (WF_PHY_BASE + 0x4264) -#define CR_PHYMUX_26 (WF_PHY_BASE + 0x4268) -#define CR_PHYMUX_27 (WF_PHY_BASE + 0x426C) -/* Tx Vector */ -#define CR_PHYMUX_12 (WF_PHY_BASE + 0x4230) -#define CR_PHYMUX_13 (WF_PHY_BASE + 0x4234) -#define CR_PHYMUX_14 (WF_PHY_BASE + 0x4238) -#define CR_PHYMUX_15 (WF_PHY_BASE + 0x423c) -#define CR_PHYMUX_16 (WF_PHY_BASE + 0x4240) -#define CR_PHYMUX_17 (WF_PHY_BASE + 0x4244) - -#define TXV1 CR_PHYMUX_12 -#define TXV2 CR_PHYMUX_13 -#define TXV3 CR_PHYMUX_14 -#define TXV4 CR_PHYMUX_15 -#define TXV5 CR_PHYMUX_16 -#define TXV6 CR_PHYMUX_17 - -/* Rx Vector */ -#define CR_PHYMUX_18 (WF_PHY_BASE + 0x4248) -#define CR_PHYMUX_19 (WF_PHY_BASE + 0x425c) -#define CR_PHYMUX_20 (WF_PHY_BASE + 0x4250) -#define CR_PHYMUX_21 (WF_PHY_BASE + 0x4254) -#define CR_PHYMUX_22 (WF_PHY_BASE + 0x4258) -#define CR_PHYMUX_23 (WF_PHY_BASE + 0x425c) - -#define RXV1 CR_PHYMUX_18 -#define RXV2 CR_PHYMUX_19 -#define RXV3 CR_PHYMUX_20 -#define RXV4 CR_PHYMUX_21 -#define RXV5 CR_PHYMUX_22 -#define RXV6 CR_PHYMUX_23 - -#define CR_TXFD_0 (WF_PHY_BASE + 0x4700) -#define CR_TXFD_1 (WF_PHY_BASE + 0x4704) -#define CR_TXFD_3 (WF_PHY_BASE + 0x470C) -#define CR_BF_CTRL0 (WF_PHY_BASE + 0x4800) -#define CR_BF_TIMEOUT (WF_PHY_BASE + 0x4804) -#define CR_BF_CTRL1 (WF_PHY_BASE + 0x4808) -#define CR_BF_PFILE_ACCESS (WF_PHY_BASE + 0x480C) -#define CR_BF_PFILE_WDATA0 (WF_PHY_BASE + 0x4810) -#define CR_BF_PFILE_WDATA1 (WF_PHY_BASE + 0x4814) -#define CR_BF_PFILE_WDATA2 (WF_PHY_BASE + 0x4818) -#define CR_BF_PFILE_WDATA3 (WF_PHY_BASE + 0x481C) -#define CR_BF_PFILE_WDATA4 (WF_PHY_BASE + 0x4820) -#define CR_BF_PFILE_WDATA5 (WF_PHY_BASE + 0x4824) -#define CR_BF_PFILE_RDATA0 (WF_PHY_BASE + 0x4828) -#define CR_BF_PFILE_RDATA1 (WF_PHY_BASE + 0x482C) -#define CR_BF_PFILE_RDATA2 (WF_PHY_BASE + 0x4830) -#define CR_BF_PFILE_RDATA3 (WF_PHY_BASE + 0x4834) -#define CR_BF_PFILE_RDATA4 (WF_PHY_BASE + 0x4838) -#define CR_BF_PFILE_RDATA5 (WF_PHY_BASE + 0x483C) -#define CR_BF_FIL_MSB0 (WF_PHY_BASE + 0x4844) -#define CR_BF_FIL_LSB0 (WF_PHY_BASE + 0x4848) - -#define CR_PHYMUX_WF1_3 (WF_PHY_BASE + 0x520C) -#define CR_PHYMUX_WF1_5 (WF_PHY_BASE + 0x5214) - -#define PHYBACK_CR_PHYMUX_27 (WF_PHY_BASE + 0x426C) -#define PHYBACK_CR_PHYMUX_27_MSK (0xf << 4) -#define SET_CR_PHYMUX_RXV_SEL_G2(mode) (((mode)&0xf) << 4) - -#endif /* __WF_PHY_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_rmac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_rmac.h deleted file mode 100644 index 0c757a6007..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_rmac.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_rmac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_RMAC_H__ -#define __WF_RMAC_H__ - -#define WF_RMAC_BASE 0x21800 - -/* TODO: shiang-7603, un-finished yet! */ - -/* - Current BSSID 0 Register 0/1 -*/ -#define RMAC_RFCR (WF_RMAC_BASE + 0x00) -#define DROP_STBC_BCN_BC_MC (1 << 0) -#define DROP_FCS_ERROR_FRAME (1 << 1) -#define RX_PROMISCUOUS_MODE (1 << 2) -#define DROP_VERSION_NO_0 (1 << 3) -#define DROP_PROBE_REQ (1 << 4) -#define DROP_MC_FRAME (1 << 5) -#define DROP_BC_FRAME (1 << 6) -#define DROP_NOT_IN_MC_TABLE (1 << 7) -#define DROP_ADDR3_OWN_MAC (1 << 8) -#define DROP_DIFF_BSSID_A3 (1 << 9) -#define DROP_DIFF_BSSID_A2 (1 << 10) -#define DROP_DIFF_BSSID_BCN (1 << 11) -#define RM_FRAME_REPORT_EN (1 << 12) -#define DROP_CTRL_RSV (1 << 13) -#define DROP_CTS (1 << 14) -#define DROP_RTS (1 << 15) -#define DROP_DUPLICATE (1 << 16) -#define DROP_NOT_MY_BSSID (1 << 17) -#define DROP_NOT_UC2ME (1 << 18) -#define DROP_DIFF_BSSID_BTIM (1 << 19) -#define DROP_NDPA (1 << 20) -#define RX_UNWANTED_CTL_FRM (1 << 21) - -/* - Current BSSID 0 Register 0/1 -*/ -#define RMAC_CB0R0 (WF_RMAC_BASE + 0x04) -#define RMAC_CB0R1 (WF_RMAC_BASE + 0x08) -#define RMAC_CB1R0 (WF_RMAC_BASE + 0x0c) -#define RMAC_CB1R1 (WF_RMAC_BASE + 0x10) -#define RMAC_CB2R0 (WF_RMAC_BASE + 0x14) -#define RMAC_CB2R1 (WF_RMAC_BASE + 0x18) -#define RMAC_CB3R0 (WF_RMAC_BASE + 0x1c) -#define RMAC_CB3R1 (WF_RMAC_BASE + 0x20) - -typedef struct _RMAC_CBxR0_STRUC { - UINT32 addr_31_0; -} RMAC_CBxR0_STRUC; - -typedef union _RMAC_CBxR1_STRUC { - struct { - UINT32 addr_47_32 : 16; - UINT32 bssid_en : 1; - UINT32 rsv_17 : 15; - } field; - UINT32 word; -} RMAC_CBxR1_STRUC; - -/* - OWN MAC Address 0 Register 0/1 -*/ -#define RMAC_OMA0R0 (WF_RMAC_BASE + 0x024) -#define RMAC_OMA0R1 (WF_RMAC_BASE + 0x028) -#define RMAC_OMA1R0 (WF_RMAC_BASE + 0x02c) -#define RMAC_OMA1R1 (WF_RMAC_BASE + 0x030) -#define RMAC_OMA2R0 (WF_RMAC_BASE + 0x034) -#define RMAC_OMA2R1 (WF_RMAC_BASE + 0x038) -#define RMAC_OMA3R0 (WF_RMAC_BASE + 0x03c) -#define RMAC_OMA3R1 (WF_RMAC_BASE + 0x040) -#define RMAC_OMA4R0 (WF_RMAC_BASE + 0x044) -#define RMAC_OMA4R1 (WF_RMAC_BASE + 0x048) -#define RMAC_B01AR_B1AR (WF_RMAC_BASE + 0x04c) -#define RMAC_B23AR_B1AR (WF_RMAC_BASE + 0x050) -#define RMAC_ACBEN (WF_RMAC_BASE + 0x054) - -#define RMAC_MAR0 (WF_RMAC_BASE + 0x060) -#define RMAC_MAR1 (WF_RMAC_BASE + 0x064) -typedef struct _RMAC_MAR0_STRUC { - UINT32 addr_31_0; -} RMAC_MAR0_STRUC; - -typedef union _RMAC_MAR1_STRUC { - struct { - UINT32 addr_39_32 : 8; - UINT32 addr_47_40 : 8; - UINT32 access_start : 1; - UINT32 readwrite : 1; - UINT32 rsv18_23 : 6; - UINT32 multicast_addr_index : 5; - UINT32 rsv29 : 1; - UINT32 multicast_addr_group : 2; - } field; - UINT32 word; -} RMAC_MAR1_STRUC; - -#define BSCR0 (WF_RMAC_BASE + 0x068) - -#define BSCR1 (WF_RMAC_BASE + 0x06c) -#define BA_MAC_ADDR_47_32_MASK (0xffff) -#define BA_MAC_ADDR_47_32(p) (((p)&0xffff)) -#define RST_BA_TID_MASK (0xf << 16) -#define RST_BA_TID(p) (((p)&0xf) << 16) -#define RST_BA_SEL_MASK (0x3 << 20) -#define RST_BA_MAC_TID_MATCH 0 -#define RST_BA_MAC_MATCH 1 -#define RST_BA_WITHOUT_MATCH 2 -#define RST_BA_SEL(p) (((p)&0x3) << 20) -#define START_RST_BA_SB (1 << 22) - -#define RMAC_RMACDR (WF_RMAC_BASE + 0x078) -#define DISABLE_TSF_PROBE_RSP (1 << 0) -#define ENABLE_TSF_TIM (1 << 4) -#define RMACDR_MBSSID_MASK (0x3 << 24) -#define RMACDR_MBSSID(p) (((p)&0x3) << 24) -#define CHK_HTC_BY_RATE (1 << 26) -#define SELECT_RXMAXLEN_20BIT (1 << 30) - -#define RMAC_RMCR (WF_RMAC_BASE + 0x080) -#define RMAC_RMCR_SMPS_MODE_MASK (0x3 << 20) -#define RMAC_RMCR_SMPS_MODE(p) (((p)&0x3) << 20) -#define DISABLE_SMPS_RX_BYPASS_SETTING 0 -#define STATIC_SMPS 1 -#define DYNAMIC_SMPS 2 -#define DISABLE_SMPS_RX_BYSETTING 3 -#define RMAC_RMCR_RX_STREAM_0 (1 << 22) -#define RMAC_RMCR_RX_STREAM_1 (1 << 23) -#define RMAC_RMCR_RX_STREAM_2 (1 << 24) -#define RMAC_RMCR_SMPS_BY_RTS (1 << 25) - -#define RMAC_MORE (WF_RMAC_BASE + 0x084) -typedef union _RMAC_MORE_STRUC { - struct { - UINT32 mpdu_len_compare : 14; - UINT32 rsv1415 : 2; - UINT32 rmac_cr_smps_slot_idle : 2; - UINT32 rsv1823 : 8; - UINT32 drop_ndp : 1; - UINT32 drop_uc2me_bssid_unmatch : 1; - UINT32 rsv2829 : 2; - UINT32 muar_mode_sel : 2; - } field; - - UINT32 word; -} RMAC_MORE_STRUC; - -#define RMAC_CHFREQ (WF_RMAC_BASE + 0x090) -#define RMAC_MISC (WF_RMAC_BASE + 0x094) -#define RMAC_MAXMINLEN (WF_RMAC_BASE + 0x098) -#define RMAC_DROP_MIN_LEN 0xe -#define RMAC_DROP_MIN_LEN_MASK (0xff << 24) -#define RMAC_DROP_MAX_LEN 0x19000 -#define RMAC_DROP_MAX_LEN_MASK (0xfffff) -#define RMAC_RFCR1 (WF_RMAC_BASE + 0xa4) -#define RMAC_PHY_DELAY (WF_RMAC_BASE + 0x0a8) - -/*information from 2015-July-9 task group mm.*/ -enum ENUM_HW_TMR_VER { - TMR_VER_1_0 = 0, /*6630E3/7628/Gen3/7637/7622/7615E1*/ - TMR_VER_1_5 = 1, /* MT7615 e3 only.*/ - TMR_VER_2_0 = 2 /* for 6632 */ -}; - -#define RMAC_TMR_PA (WF_RMAC_BASE + 0x0e0) -#define RMAC_TMR_ENABLE BIT31 -#define RMAC_TMR_ROLE BIT30 - -/*below CRs are available in MT7615E3 and MT6632 E1 */ -#define RMAC_TMR_LOCK_EN BIT29 -#define RMAC_TMR_UNLOCK_CTRL BIT28 -#define RMAC_TMR_CATEGORY3_EN BIT27 -#define RMAC_TMR_CATEGORY2_EN BIT26 -#define RMAC_TMR_CATEGORY1_EN BIT25 -#define RMAC_TMR_CATEGORY0_EN BIT24 -/*above CRs are available in MT7615E3 and MT6632 E1 */ - -#define TMR_PA_TYPE_SUBTYPE3_MASK BITS(18, 23) -#define TMR_PA_TYPE_SUBTYPE3_OFST 18 -#define TMR_PA_TYPE_SUBTYPE2_MASK BITS(12, 17) -#define TMR_PA_TYPE_SUBTYPE2_OFST 12 -#define TMR_PA_TYPE_SUBTYPE1_MASK BITS(6, 11) -#define TMR_PA_TYPE_SUBTYPE1_OFST 6 -#define TMR_PA_TYPE_SUBTYPE0_MASK BITS(0, 5) -#define TMR_PA_TYPE_SUBTYPE0_OFST 0 - -#define TMR_PA_SUBTYPE_OFST 2 - -#endif /* __WF_RMAC_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_sec.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_sec.h deleted file mode 100644 index eb48e897aa..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_sec.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_sec.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_SEC_H__ -#define __WF_SEC_H__ - -#define WF_SEC_BASE 0x21A00 -#define SEC_SCR (WF_SEC_BASE + 0x004) - -#endif /* __WF_SEC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_tmac.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_tmac.h deleted file mode 100644 index 0025099005..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_tmac.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_tmac.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_TMAC_H__ -#define __WF_TMAC_H__ - -#define WF_TMAC_BASE 0x21600 - -#define TMAC_TCR (WF_TMAC_BASE + 0x00) -#define TX_BLINK_SEL_MASK (0x3 << 6) -#define TX_BLINK_SEL(p) (((p)&0x3) << 6) -#define PRE_RTS_DET_GUARD_TIME_MASK (0xf << 8) -#define PRE_RTS_DET_GUARD_TIME(p) (((p)&0xf) << 8) -#define PRE_RTS_SEC_IDLE_SEL_MASK (0x3 << 12) -#define PRE_RTS_SEC_IDLE_SEL(p) (((p)&0x3) << 12) -#define RTS_SIGTA_EN (1 << 14) -#define LDPC_OFST_EN (1 << 15) -#define TMAC_TCR_TX_STREAM_NUM_MASK (0x3 << 16) -#define TMAC_TCR_TX_STREAM_NUM(p) (((p)&0x3) << 16) -#define GET_TMAC_TCR_TX_STREAM_NUM(p) (((p)&TMAC_TCR_TX_STREAM_NUM_MASK) >> 16) -#define SCH_IDLE_SEL_MASK (0x3 << 18) -#define SCH_IDLE_SEL(p) (((p)&0x3) << 18) -#define SCH_DET_PER_IOD (1 << 20) -#define DCH_DET_DIS (1 << 21) -#define TX_RIFS_EN (1 << 22) -#define GET_TX_RIFS_EN(p) (((p)&TX_RIFS_EN) >> 22) -#define RX_RIFS_MODE (1 << 23) -#define GET_RX_RIFS_MODE(p) (((p)&RX_RIFS_MODE) >> 23) -#define TXOP_TBTT_CONTROL (1 << 24) -#define GET_TXOP_TBTT_CONTROL(p) (((p)&TXOP_TBTT_CONTROL) >> 24) -#define TBTT_TX_STOP_CONTROL (1 << 25) -#define GET_TBTT_TX_STOP_CONTROL(p) (((p)&TBTT_TX_STOP_CONTROL) >> 25) -#define TXOP_BURST_STOP (1 << 26) -#define GET_TXOP_BURST_STOP(p) (((p)&TXOP_BURST_STOP) >> 26) -#define RDG_RA_MODE (1 << 27) -#define GET_RDG_RA_MODE(p) (((p)&RDG_RA_MODE) >> 27) -#define RDG_RESP_EN (1 << 29) -#define GET_RDG_RESP_EN(p) (((p)&RDG_RESP_EN) >> 29) -#define GRANT_REVERSE_WHEN_NO_PENDING_FRM (1 << 30) -#define SMOOTHING (1 << 31) -#define GET_SMOOTHING(p) (((p)&SMOOTHING) >> 31) - -#define TMAC_PSCR (WF_TMAC_BASE + 0x04) -#define APS_OFF_TIME_MASK (0xff << 1) -#define APS_OFF_TIME(p) (((p)&0xff) << 1) -#define GET_APS_OFF_TIME(p) (((p)&APS_OFF_TIME_MASK) >> 1) -#define APS_ON_TIME_MASK (0x3f << 10) -#define APS_ON_TIME(p) (((p)&0x3f) << 10) -#define GET_APS_ON_TIME(p) (((p)&APS_ON_TIME_MASK) >> 10) -#define APS_HALT_TIME_MASK (0x3ff << 16) -#define APS_HALT_TIME(p) (((p)&0x3ff) << 16) -#define GET_APS_HALT_TIME(p) (((p)&APS_HALT_TIME_MASK) >> 16) -#define APS_EN (1 << 28) -#define GET_APS_EN(p) (((p)&APS_EN) >> 28) - -#define TMAC_ACTXOPLR0 (WF_TMAC_BASE + 0x10) -#define AC2LIMIT_MASK (0xffff) -#define AC2LIMIT(p) (((p)&0xffff)) -#define GET_AC2LIMIT(p) (((p)&AC2LIMIT_MASK)) -#define AC3LIMIT_MASK (0xffff << 16) -#define AC3LIMIT(p) (((p)&0xffff) << 16) -#define GET_AC3LIMIT(p) (((p)&AC3LIMIT_MASK) >> 16) - -#define TMAC_ACTXOPLR1 (WF_TMAC_BASE + 0x14) -#define AC0LIMIT_MASK (0xffff) -#define AC0LIMIT(p) (((p)&0xffff)) -#define GET_AC0LIMIT(p) (((p)&AC0LIMIT_MASK)) -#define AC1LIMIT_MASK (0xffff << 16) -#define AC1LIMIT(p) (((p)&0xffff) << 16) -#define GET_AC1LIMIT(p) (((p)&AC1LIMIT_MASK) >> 16) - -#define TMAC_ACTXOPLR2 (WF_TMAC_BASE + 0x18) -#define AC12LIMIT_MASK (0xffff) -#define AC12LIMIT(p) (((p)&0xffff)) -#define GET_AC12LIMIT(p) (((p)&AC12LIMIT_MASK)) -#define AC13LIMIT_MASK (0xffff << 16) -#define AC13LIMIT(p) (((p)&0xffff) << 16) -#define GET_AC13LIMIT(p) (((p)&AC13LIMIT_MASK) >> 16) - -#define TMAC_ACTXOPLR3 (WF_TMAC_BASE + 0x1c) -#define AC10LIMIT_MASK (0xffff) -#define AC10LIMIT(p) (((p)&0xffff)) -#define GET_AC10LIMIT(p) (((p)&AC10LIMIT_MASK)) -#define AC11LIMIT_MASK (0xffff << 16) -#define AC11LIMIT(p) (((p)&0xffff) << 16) -#define GET_AC11LIMIT(p) (((p)&AC11LIMIT_MASK) >> 16) - -#define TMAC_FP0R0 (WF_TMAC_BASE + 0x20) -#define LG_OFDM0_FRAME_POWER0_DBM_MASK (0x7f) -#define LG_OFDM0_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define LG_OFDM1_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define LG_OFDM1_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define LG_OFDM2_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define LG_OFDM2_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define LG_OFDM3_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define LG_OFDM3_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R1 (WF_TMAC_BASE + 0x24) -#define HT20_0_FRAME_POWER0_DBM_MASK (0x7f) -#define HT20_0_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define HT20_1_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define HT20_1_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define HT20_2_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define HT20_2_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define HT20_3_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define HT20_3_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R2 (WF_TMAC_BASE + 0x28) -#define HT40_0_FRAME_POWER0_DBM_MASK (0x7f) -#define HT40_0_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define HT40_1_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define HT40_1_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define HT40_2_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define HT40_2_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define HT40_3_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define HT40_3_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R3 (WF_TMAC_BASE + 0x2C) -#define CCK0_FRAME_POWER0_DBM_MASK (0x7f) -#define CCK0_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define LG_OFDM4_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define LG_OFDM4_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define CCK1_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define CCK1_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define HT40_6_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define HT40_6_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_FP0R4 (WF_TMAC_BASE + 0x30) -#define HT20_4_FRAME_POWER0_DBM_MASK (0x7f) -#define HT20_4_FRAME_POWER0_DBM(p) (((p)&0x7f)) -#define HT20_5_FRAME_POWER0_DBM_MASK (0x7f << 8) -#define HT20_5_FRAME_POWER0_DBM(p) (((p)&0x7f) << 8) -#define HT40_4_FRAME_POWER0_DBM_MASK (0x7f << 16) -#define HT40_4_FRAME_POWER0_DBM(p) (((p)&0x7f) << 16) -#define HT40_5_FRAME_POWER0_DBM_MASK (0x7f << 24) -#define HT40_5_FRAME_POWER0_DBM(p) (((p)&0x7f) << 24) - -#define TMAC_CDTR (WF_TMAC_BASE + 0x90) -#define TMAC_ODTR (WF_TMAC_BASE + 0x94) - -#define ATCR (WF_TMAC_BASE + 0x98) -#define TXV_TOUT_MASK (0xff) -#define TXV_TOUT(p) (((p)&0xff)) -#define GET_TXV_TOUT(p) (((p)&TXV_TOUT_MASK)) -#define RIFS_TXV_TOUT_MASK (0xff << 8) -#define RIFS_TXV_TOUT(p) (((p)&0xff) << 8) -#define GET_RIFS_TXV_TOUT(p) (((p)&RIFS_TXV_TOUT_MASK) >> 8) -#define AGG_TOUT_MASK (0xff << 16) -#define AGG_TOUT(p) (((p)&0xff) << 16) -#define GET_AGG_TOUT(p) (((p)&AGG_TOUT_MASK) >> 16) - -#define TMAC_TRCR (WF_TMAC_BASE + 0x9C) -#define CCA_SRC_SEL_MASK (0x3 << 30) -#define CCA_SRC_SEL(p) (((p)&0x3) << 30) -#define CCA_SEC_SRC_SEL_MASK (0x3 << 28) -#define CCA_SEC_SRC_SEL(p) (((p)&0x3) << 28) -#define I2T_CHK_EN BIT25 - -#define TMAC_RRCR (WF_TMAC_BASE + 0xA0) - -#define TMAC_ICR (WF_TMAC_BASE + 0xa4) -#define ICR_EIFS_TIME_MASK (0x1ff) -#define ICR_EIFS_TIME(p) (((p)&0x1ff)) -#define GET_ICR_EIFS_TIME(p) (((p)&ICR_EIFS_TIME_MASK)) -#define ICR_RIFS_TIME_MASK (0x1f << 10) -#define ICR_RIFS_TIME(p) (((p)&0x1f) << 10) -#define GET_ICR_RIFS_TIME(p) (((p)&ICR_RIFS_TIME_MASK) >> 10) -#define ICR_SIFS_TIME_MASK (0x7f << 16) -#define ICR_SIFS_TIME(p) (((p)&0x7f) << 16) -#define GET_ICR_SIFS_TIME(p) (((p)&ICR_SIFS_TIME_MASK) >> 16) -#define ICR_SLOT_TIME_MASK (0x7f << 24) -#define ICR_SLOT_TIME(p) (((p)&0x7f) << 24) -#define GET_ICR_SLOT_TIME(p) (((p)&ICR_SLOT_TIME_MASK) >> 24) - -#define TMAC_PCR (WF_TMAC_BASE + 0xb4) -#define PTEC_FIX_RATE_MASK (0x1ff) -#define PTEC_FIX_RATE(p) (((p)&0x1ff)) -#define GET_PTEC_FIX_RATE(p) (((p)&PTEC_FIX_RATE_MASK)) -#define PTEC_RATE_SEL (1 << 15) -#define GET_PTEC_RATE_SEL(p) (((p)&PTEC_RATE_SEL) >> 15) -#define PTEC_ANT_ID_MASK (0x3f << 16) -#define PTEC_ANT_ID(p) (((p)&0x3f) << 16) -#define GET_PTEC_ANT_ID(p) (((p)&PTEC_ANT_ID_MASK) >> 16) -#define PTEC_ANT_ID_SEL (1 << 22) -#define GET_PTEC_ANT_ID_SEL(p) (((p)&PTEC_ANT_ID_SEL) >> 22) -#define PTEC_SPE_EN (1 << 23) -#define GET_PTEC_SPE_EN(p) (((p)&PTEC_SPE_EN) >> 23) -#define PTEC_ANT_PRI_MASK (0x7 << 24) -#define PTEC_ANT_PRI(p) (((p)&0x7) << 24) -#define GET_PTEC_ANT_PRI(p) (((p)&PTEC_ANT_PRI_MASK) >> 24) -#define PTEC_ANT_PRI_SEL (1 << 27) -#define GET_PTEC_ANT_PRI_SEL(p) (((p)&PTEC_ANT_PRI_SEL) >> 27) - -#define TMAC_B0BRR0 (WF_TMAC_BASE + 0xc0) -#define TMAC_B1BRR0 (WF_TMAC_BASE + 0xc8) -#define TMAC_B2BRR0 (WF_TMAC_BASE + 0xd0) -#define TMAC_B3BRR0 (WF_TMAC_BASE + 0xd8) -#define BSSID00_RESP_SPE_EN (1 << 16) - -#define TMAC_B0BRR1 (WF_TMAC_BASE + 0xc4) -#define TMAC_B1BRR1 (WF_TMAC_BASE + 0xcc) -#define TMAC_B2BRR1 (WF_TMAC_BASE + 0xd4) -#define TMAC_B3BRR1 (WF_TMAC_BASE + 0xdc) -#define TMAC_QNCR0 (WF_TMAC_BASE + 0xe0) -#define TMAC_QNCR1 (WF_TMAC_BASE + 0xe4) -#define TMAC_QNCR2 (WF_TMAC_BASE + 0xe8) -#define TMAC_QNCR3 (WF_TMAC_BASE + 0xec) -#define TMAC_QNCR4 (WF_TMAC_BASE + 0xf0) - -#define TMAC_PCTSR (WF_TMAC_BASE + 0x108) - -#endif /* __WF_TMAC_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_trb.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_trb.h deleted file mode 100644 index e6e5098374..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_trb.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_trb.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_TRB_H__ -#define __WF_TRB_H__ - -#define WF_TRB_BASE 0x21000 -#define TRB_GCR (WF_TRB_BASE + 0x000) -#define TRB_TXBSR (WF_TRB_BASE + 0x020) -#define TRB_RXBSR (WF_TRB_BASE + 0x040) - -#endif /* __WF_TRB_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtbl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtbl.h deleted file mode 100644 index a177db217a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtbl.h +++ /dev/null @@ -1,556 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_wtbl.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_WTBL_H__ -#define __WF_WTBL_H__ - -/* - WTBL segment 1 definitions -*/ -typedef struct GNU_PACKED wtbl_1_struc { - union WTBL_1_DW0 wtbl_1_d0; - union WTBL_1_DW1 wtbl_1_d1; - union WTBL_1_DW2 wtbl_1_d2; - union WTBL_1_DW3 wtbl_1_d3; - union WTBL_1_DW4 wtbl_1_d4; - UINT32 dummy[3]; -} WTBL_1_STRUC; - -/* - WTBL segment 2 definitions -*/ -union WTBL_2_DW0 { - UINT32 pn_0; - UINT32 word; -}; - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW1 { - struct { - UINT32 rsv_1_28 : 4; - UINT32 com_sn : 12; - UINT32 pn_32 : 16; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW1 { - struct { - UINT32 pn_32 : 16; - UINT32 com_sn : 12; - UINT32 rsv_1_28 : 4; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW2 { - struct { - UINT32 tid_ac_2_sn_0 : 8; - UINT32 tid_ac_1_sn : 12; - UINT32 tid_ac_0_sn : 12; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW2 { - struct { - UINT32 tid_ac_0_sn : 12; - UINT32 tid_ac_1_sn : 12; - UINT32 tid_ac_2_sn_0 : 8; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW3 { - struct { - UINT32 tid_5_sn_0 : 4; - UINT32 tid_4_sn : 12; - UINT32 tid_ac_3_sn : 12; - UINT32 tid_ac_2_sn_9 : 4; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW3 { - struct { - UINT32 tid_ac_2_sn_9 : 4; - UINT32 tid_ac_3_sn : 12; - UINT32 tid_4_sn : 12; - UINT32 tid_5_sn_0 : 4; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW4 { - struct { - UINT32 tid_7_sn : 12; - UINT32 tid_6_sn : 12; - UINT32 tid_5_sn_5 : 8; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW4 { - struct { - UINT32 tid_5_sn_5 : 8; - UINT32 tid_6_sn : 12; - UINT32 tid_7_sn : 12; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW5 { - struct { - UINT32 rate_1_fail_cnt : 16; - UINT32 rate_1_tx_cnt : 16; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW5 { - struct { - UINT32 rate_1_tx_cnt : 16; - UINT32 rate_1_fail_cnt : 16; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW6 { - struct { - UINT32 rate_5_tx_cnt : 8; - UINT32 rate_4_tx_cnt : 8; - UINT32 rate_3_tx_cnt : 8; - UINT32 rate_2_tx_cnt : 8; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW6 { - struct { - UINT32 rate_2_tx_cnt : 8; - UINT32 rate_3_tx_cnt : 8; - UINT32 rate_4_tx_cnt : 8; - UINT32 rate_5_tx_cnt : 8; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW7 { - struct { - UINT32 current_bw_fail_cnt : 16; - UINT32 current_bw_tx_cnt : 16; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW7 { - struct { - UINT32 current_bw_tx_cnt : 16; - UINT32 current_bw_fail_cnt : 16; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW8 { - struct { - UINT32 other_bw_fail_cnt : 16; - UINT32 other_bw_tx_cnt : 16; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW8 { - struct { - UINT32 other_bw_tx_cnt : 16; - UINT32 other_bw_fail_cnt : 16; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW9 { - struct { - UINT32 rate_idx : 3; - UINT32 mpdu_ok_cnt : 3; - UINT32 mpdu_fail_cnt : 3; - UINT32 rsv_9_20 : 3; - UINT32 g16 : 1; - UINT32 g8 : 1; - UINT32 g4 : 1; - UINT32 g2 : 1; - UINT32 fcap : 2; - UINT32 cbrn : 3; - UINT32 ccbw_sel : 2; - UINT32 ant_pri : 3; - UINT32 spe_en : 1; - UINT32 tx_pwr_offset : 5; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW9 { - struct { - UINT32 tx_pwr_offset : 5; - UINT32 spe_en : 1; - UINT32 ant_pri : 3; - UINT32 ccbw_sel : 2; - UINT32 cbrn : 3; - UINT32 fcap : 2; - UINT32 g2 : 1; - UINT32 g4 : 1; - UINT32 g8 : 1; - UINT32 g16 : 1; - UINT32 rsv_9_20 : 3; - UINT32 mpdu_fail_cnt : 3; - UINT32 mpdu_ok_cnt : 3; - UINT32 rate_idx : 3; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -typedef struct GNU_PACKED wtbl_tx_rate { - UINT16 rsv_12 : 4; - UINT16 stbc : 1; - UINT16 n_sts : 2; - UINT16 tx_mode : 3; - UINT16 tx_rate : 6; -} WTBL_TX_RATE; -#else -typedef struct GNU_PACKED wtbl_tx_rate { - UINT16 tx_rate : 6; - UINT16 tx_mode : 3; - UINT16 n_sts : 2; - UINT16 stbc : 1; - UINT16 rsv_12 : 4; -} WTBL_TX_RATE; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW10 { - struct { - UINT32 rate_3_0 : 8; - UINT32 rate_2 : 12; - UINT32 rate_1 : 12; /* format refer to WTBL_TX_RATE */ - } field; - UINT32 word; -}; -#else -union WTBL_2_DW10 { - struct { - UINT32 rate_1 : 12; /* format refer to WTBL_TX_RATE */ - UINT32 rate_2 : 12; - UINT32 rate_3_0 : 8; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW11 { - struct { - UINT32 rate_6_0 : 4; - UINT32 rate_5 : 12; - UINT32 rate_4 : 12; - UINT32 rate_3_8 : 4; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW11 { - struct { - UINT32 rate_3_8 : 4; - UINT32 rate_4 : 12; - UINT32 rate_5 : 12; - UINT32 rate_6_0 : 4; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW12 { - struct { - UINT32 rate_8 : 12; - UINT32 rate_7 : 12; - UINT32 rate_6_4 : 8; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW12 { - struct { - UINT32 rate_6_4 : 8; - UINT32 rate_7 : 12; - UINT32 rate_8 : 12; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW13 { - struct { - UINT32 rsv_13_24 : 8; - UINT32 resp_rcpi_2 : 8; - UINT32 resp_rcpi_1 : 8; - UINT32 resp_rcpi_0 : 8; - } field; - - struct { - UINT32 af : 3; - UINT32 mm : 3; - UINT32 rsv_13_24 : 2; - UINT32 resp_rcpi_2 : 8; - UINT32 resp_rcpi_1 : 8; - UINT32 resp_rcpi_0 : 8; - } field_mt7636; - - UINT32 word; -}; -#else -union WTBL_2_DW13 { - struct { - UINT32 resp_rcpi_0 : 8; - UINT32 resp_rcpi_1 : 8; - UINT32 resp_rcpi_2 : 8; - UINT32 rsv_13_24 : 8; - } field; - - struct { - UINT32 resp_rcpi_0 : 8; - UINT32 resp_rcpi_1 : 8; - UINT32 resp_rcpi_2 : 8; - UINT32 rsv_13_24 : 2; - UINT32 mm : 3; - UINT32 af : 3; - } field_mt7636; - - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW14 { - struct { - UINT32 ant_sel : 6; - UINT32 cc_noise_sel : 1; - UINT32 ce_rmsd : 4; - UINT32 sts_3_ch_cap_noise : 7; - UINT32 sts_2_ch_cap_noise : 7; - UINT32 sts_1_ch_cap_noise : 7; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW14 { - struct { - UINT32 sts_1_ch_cap_noise : 7; - UINT32 sts_2_ch_cap_noise : 7; - UINT32 sts_3_ch_cap_noise : 7; - UINT32 ce_rmsd : 4; - UINT32 cc_noise_sel : 1; - UINT32 ant_sel : 6; - } field; - UINT32 word; -}; -#endif - -#ifdef RT_BIG_ENDIAN -union WTBL_2_DW15 { - struct { - UINT32 ba_en : 8; - UINT32 ba_win_size_tid : 24; - } field; - UINT32 word; -}; -#else -union WTBL_2_DW15 { - struct { - UINT32 ba_win_size_tid : 24; - UINT32 ba_en : 8; - } field; - UINT32 word; -}; -#endif - -typedef struct GNU_PACKED wtbl_2_struc { - union WTBL_2_DW0 wtbl_2_d0; - union WTBL_2_DW1 wtbl_2_d1; - union WTBL_2_DW2 wtbl_2_d2; - union WTBL_2_DW3 wtbl_2_d3; - union WTBL_2_DW4 wtbl_2_d4; - union WTBL_2_DW5 wtbl_2_d5; - union WTBL_2_DW6 wtbl_2_d6; - union WTBL_2_DW7 wtbl_2_d7; - union WTBL_2_DW8 wtbl_2_d8; - union WTBL_2_DW9 wtbl_2_d9; - union WTBL_2_DW10 wtbl_2_d10; - union WTBL_2_DW11 wtbl_2_d11; - union WTBL_2_DW12 wtbl_2_d12; - union WTBL_2_DW13 wtbl_2_d13; - union WTBL_2_DW14 wtbl_2_d14; - union WTBL_2_DW15 wtbl_2_d15; -} WTBL_2_STRUC; - -/* - WTBL segment 3 definitions -*/ - -/* Used for Cipher Suit != (WEP_xx | WPI) */ -struct GNU_PACKED wtbl_cipher_128 { - UINT32 cipher_key_0; - UINT32 cipher_key_32; - UINT32 cipher_key_64; - UINT32 cipher_key_96; - - UINT32 rx_mic_bip_key_0; - UINT32 rx_mic_bip_key_32; - - UINT32 tx_mic_bip_key_0; - UINT32 tx_mic_bip_key_32; -}; - -/* Used for CCMP-256 /GCMP-256, store cipher or MIC key only */ -struct GNU_PACKED wtbl_cipher_256 { - UINT32 key_0; - UINT32 key_1; - UINT32 key_2; - UINT32 key_3; - UINT32 key_4; - UINT32 key_5; - UINT32 key_6; - UINT32 key_7; -}; - -/* Used for Cipher Suit == WPI */ -struct GNU_PACKED wtbl_cipher_wpi { - UINT32 cipher_key0_0; - UINT32 cipher_key0_1; - UINT32 cipher_key0_2; - UINT32 cipher_key0_3; - - UINT32 mic_key0_0; - UINT32 mic_key0_1; - UINT32 mic_key0_2; - UINT32 mic_key0_3; - - UINT32 cipher_key1_0; - UINT32 cipher_key1_1; - UINT32 cipher_key1_2; - UINT32 cipher_key1_3; - - UINT32 mic_key1_0; - UINT32 mic_key1_1; - UINT32 mic_key1_2; - UINT32 mic_key1_3; -}; - -/* Used for Cipher Suit == WEP */ -struct GNU_PACKED wtbl_cipher_wep { - UINT32 cipher_key0_0; - UINT32 cipher_key0_1; - UINT32 cipher_key0_2; - UINT32 cipher_key0_3; - - UINT32 cipher_key1_0; - UINT32 cipher_key1_1; - UINT32 cipher_key1_2; - UINT32 cipher_key1_3; - - UINT32 cipher_key2_0; - UINT32 cipher_key2_1; - UINT32 cipher_key2_2; - UINT32 cipher_key2_3; - - UINT32 cipher_key3_0; - UINT32 cipher_key3_1; - UINT32 cipher_key3_2; - UINT32 cipher_key3_3; -}; - -typedef union GNU_PACKED wtbl_3_struc { - struct wtbl_cipher_wep cipher_wep; - struct wtbl_cipher_wpi cipher_wpi; - struct wtbl_cipher_128 cipher_128; - struct wtbl_cipher_256 cipher_256; -} WTBL_3_STRUC; - -/* - WTBL segment 4 definitions -*/ -#ifdef RT_BIG_ENDIAN -union wtbl_4_ac { - struct { - /* DWORD 0 */ - UINT32 rsv_0_24 : 8; - UINT32 ac_ctt : 24; - - /* DWORD 1 */ - UINT32 ac_ctb; - } field; - UINT32 word[2]; -}; -#else -union wtbl_4_ac { - struct { - /* DWORD 0 */ - UINT32 ac_ctt : 24; - UINT32 rsv_0_24 : 8; - - /* DWORD 1 */ - UINT32 ac_ctb; - } field; - UINT32 word[2]; -}; -#endif - -typedef struct GNU_PACKED wtbl_4_struc { - union wtbl_4_ac ac0; - union wtbl_4_ac ac1; - union wtbl_4_ac ac2; - union wtbl_4_ac ac3; -} WTBL_4_STRUC; - -#endif /* __WF_WTBL_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtbloff.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtbloff.h deleted file mode 100644 index aec6c9e3d7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtbloff.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_wtbloff.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_WTBL_OFF_H__ -#define __WF_WTBL_OFF_H__ - -#define WF_WTBL_OFF_BASE 0x23000 -#define WTBL_OFF_WIUCR (WF_WTBL_OFF_BASE + 0x0) /* 0x23000 */ -#define WLAN_IDX_MASK (0xff) -#define WLAN_IDX(p) (((p)&0xff)) -#define WTBL2_UPDATE_FLAG (1 << 11) -#define ADM_CNT_CLEAR (1 << 12) -#define RATE_UPDATE (1 << 13) -#define TX_CNT_CLEAR (1 << 14) -#define RX_CNT_CLEAR (1 << 15) -#define IU_BUSY (1 << 16) - -#define WTBL_OFF_BCR (WF_WTBL_OFF_BASE + 0x4) /* 0x23204 */ -#define BIP_EN (1 << 0) - -#define WTBL_OFF_RMVTCR (WF_WTBL_OFF_BASE + 0x8) /* 0x23008 */ -#define RX_MV_MODE (BIT23) -#define RCPI_AVG_PARAM_MASK (0x3 << 20) -#define RCPI_AVG_PARAM(p) (((p)&0x3) << 20) - -#endif /* __WF_WTBL_OFF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtblon.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtblon.h deleted file mode 100644 index 2841729144..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/smac/wf_wtblon.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_wtblon.h - - Abstract: - Ralink Wireless Chip MAC related definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __WF_WTBL_ON_H__ -#define __WF_WTBL_ON_H__ - -#define WF_WTBL_ON_BASE 0x28000 - -#define WTBL_WTBL1DW0 (WF_WTBL_ON_BASE + 0x00) -#define WTBL_ON_RIUCR0 (WF_WTBL_ON_BASE + 0x2200) /* 0x2A200 */ -#define WTBL_ON_RIUCR1 (WF_WTBL_ON_BASE + 0x2204) /* 0x2A204 */ -#define WTBL_ON_RIUCR2 (WF_WTBL_ON_BASE + 0x2208) /* 0x2A208 */ -#define WTBL_ON_RIUCR3 (WF_WTBL_ON_BASE + 0x220C) /* 0x2A20C */ - -#ifdef RT_BIG_ENDIAN -union WTBL_1_DW0 { - struct { - UINT32 wm : 1; - UINT32 sw : 1; - UINT32 rc_a2 : 1; - UINT32 rv : 1; - UINT32 ikv : 1; - UINT32 rkv : 1; - UINT32 rc_id : 1; - UINT32 kid : 2; - UINT32 rc_a1 : 1; - UINT32 muar_idx : 6; - UINT32 addr_5 : 8; - UINT32 addr_4 : 8; - } field; - UINT32 word; -}; -#else -union WTBL_1_DW0 { - struct { - UINT32 addr_4 : 8; - UINT32 addr_5 : 8; - UINT32 muar_idx : 6; - UINT32 rc_a1 : 1; - UINT32 kid : 2; - UINT32 rc_id : 1; - UINT32 rkv : 1; - UINT32 ikv : 1; - UINT32 rv : 1; - UINT32 rc_a2 : 1; - UINT32 sw : 1; - UINT32 wm : 1; - } field; - UINT32 word; -}; -#endif - -#define WTBL_WTBL1DW1 (WF_WTBL_ON_BASE + 0x04) /* 0x28004 */ -union WTBL_1_DW1 { - struct { - UINT32 addr_0; - } field; - UINT32 word; -}; - -enum WTBL_CIPHER_SUIT { - WTBL_CIPHER_NONE = 0, - WTBL_CIPHER_WEP_40 = 1, - WTBL_CIPHER_TKIP_MIC = 2, - WTBL_CIPHER_TKIP_NO_MIC = 3, - WTBL_CIPHER_CCMP_128_PMF = 4, - WTBL_CIPHER_WEP_104 = 5, - WTBL_CIPHER_BIP_CMAC_128 = 6, - WTBL_CIPHER_WEP_128 = 7, - WTBL_CIPHER_WPI_128 = 8, - WTBL_CIPHER_CCMP_128_CCX = 9, - WTBL_CIPHER_CCMP_256 = 10, - WTBL_CIPHER_GCMP_128 = 11, - WTBL_CIPHER_GCMP_256 = 12, -}; - -#define WTBL_WTBL1DW2 (WF_WTBL_ON_BASE + 0x08) /* 0x28008 */ -#ifdef RT_BIG_ENDIAN -union WTBL_1_DW2 { - struct { - UINT32 gid : 1; - UINT32 adm : 1; - UINT32 vht : 1; - UINT32 ht : 1; - UINT32 qos : 1; - UINT32 mesh : 1; - UINT32 txop_ps_cap : 1; - UINT32 tebf : 1; - UINT32 tibf : 1; - UINT32 ldpc : 1; - UINT32 dyn_bw : 1; - UINT32 baf_en : 1; - UINT32 smps : 1; - UINT32 rdg_ba : 1; - UINT32 cf_ack : 1; - UINT32 rts : 1; - UINT32 r : 1; - UINT32 rx_ps : 1; - UINT32 af : 3; - UINT32 dis_rhtr : 1; - UINT32 fd : 1; - UINT32 td : 1; - UINT32 wpi_even : 1; - UINT32 cipher_suit : 4; - UINT32 mm : 3; - } field; - - struct { - UINT32 gid : 1; - UINT32 adm : 1; - UINT32 vht : 1; - UINT32 ht : 1; - UINT32 qos : 1; - UINT32 mesh : 1; - UINT32 txop_ps_cap : 1; - UINT32 tebf : 1; - UINT32 tibf : 1; - UINT32 ldpc : 1; - UINT32 dyn_bw : 1; - UINT32 baf_en : 1; - UINT32 smps : 1; - UINT32 rdg_ba : 1; - UINT32 cf_ack : 1; - UINT32 rts : 1; - UINT32 r : 1; - UINT32 tx_ps : 1; - UINT32 tebf_vht : 1; - UINT32 tibf_vht : 1; - UINT32 ldpc_vht : 1; - UINT32 dis_rhtr : 1; - UINT32 fd : 1; - UINT32 td : 1; - UINT32 wpi_even : 1; - UINT32 cipher_suit : 4; - UINT32 rsv1 : 3; - } field_mt7636; - UINT32 word; -}; -#else -union WTBL_1_DW2 { - struct { - UINT32 mm : 3; - UINT32 cipher_suit : 4; - UINT32 wpi_even : 1; - UINT32 td : 1; - UINT32 fd : 1; - UINT32 dis_rhtr : 1; - UINT32 af : 3; - UINT32 rx_ps : 1; - UINT32 r : 1; - UINT32 rts : 1; - UINT32 cf_ack : 1; - UINT32 rdg_ba : 1; - UINT32 smps : 1; - UINT32 baf_en : 1; - UINT32 dyn_bw : 1; - UINT32 ldpc : 1; - UINT32 tibf : 1; - UINT32 tebf : 1; - UINT32 txop_ps_cap : 1; - UINT32 mesh : 1; - UINT32 qos : 1; - UINT32 ht : 1; - UINT32 vht : 1; - UINT32 adm : 1; - UINT32 gid : 1; - } field; - - struct { - UINT32 rsv1 : 3; - UINT32 cipher_suit : 4; - UINT32 wpi_even : 1; - UINT32 td : 1; - UINT32 fd : 1; - UINT32 dis_rhtr : 1; - UINT32 ldpc_vht : 1; - UINT32 tibf_vht : 1; - UINT32 tebf_vht : 1; - UINT32 tx_ps : 1; - UINT32 r : 1; - UINT32 rts : 1; - UINT32 cf_ack : 1; - UINT32 rdg_ba : 1; - UINT32 smps : 1; - UINT32 baf_en : 1; - UINT32 dyn_bw : 1; - UINT32 ldpc : 1; - UINT32 tibf : 1; - UINT32 tebf : 1; - UINT32 txop_ps_cap : 1; - UINT32 mesh : 1; - UINT32 qos : 1; - UINT32 ht : 1; - UINT32 vht : 1; - UINT32 adm : 1; - UINT32 gid : 1; - } field_mt7636; - UINT32 word; -}; -#endif - -#define WTBL_WTBL1DW3 (WF_WTBL_ON_BASE + 0x0c) /* 0x2800c */ -#ifdef RT_BIG_ENDIAN -union WTBL_1_DW3 { - struct { - UINT32 skip_tx : 1; - UINT32 psm : 1; - UINT32 i_psm : 1; - UINT32 du_i_psm : 1; - UINT32 chk_per : 1; - UINT32 wtbl4_fid : 11; - UINT32 wtbl2_eid : 5; - UINT32 wtbl2_fid : 11; - } field; - UINT32 word; -}; -#else -union WTBL_1_DW3 { - struct { - UINT32 wtbl2_fid : 11; - UINT32 wtbl2_eid : 5; - UINT32 wtbl4_fid : 11; - UINT32 chk_per : 1; - UINT32 du_i_psm : 1; - UINT32 i_psm : 1; - UINT32 psm : 1; - UINT32 skip_tx : 1; - } field; - UINT32 word; -}; -#endif - -#define WTBL_WTBL1DW4 (WF_WTBL_ON_BASE + 0x10) /* 0x28010 */ -#ifdef RT_BIG_ENDIAN -union WTBL_1_DW4 { - struct { - UINT32 partial_aid : 9; - UINT32 wtbl4_eid : 6; - UINT32 wtbl3_eid : 6; - UINT32 wtbl3_fid : 11; - } field; - UINT32 word; -}; -#else -union WTBL_1_DW4 { - struct { - UINT32 wtbl3_fid : 11; - UINT32 wtbl3_eid : 6; - UINT32 wtbl4_eid : 6; - UINT32 partial_aid : 9; - } field; - UINT32 word; -}; -#endif - -#define WTBL_BTCRn (WF_WTBL_ON_BASE + 0x2000) -#define WTBL_MBTCRn (WF_WTBL_ON_BASE + 0x2010) -#define WTBL_BTBCRn (WF_WTBL_ON_BASE + 0x2030) -#define WTBL_MBTBCRn (WF_WTBL_ON_BASE + 0x2040) -#define WTBL_BRCRn (WF_WTBL_ON_BASE + 0x2100) -#define WTBL_MBRCRn (WF_WTBL_ON_BASE + 0x2110) -#define WTBL_BRBCRn (WF_WTBL_ON_BASE + 0x2130) -#define WTBL_MBRBCRn (WF_WTBL_ON_BASE + 0x2140) - -#define WTBL1OR (WF_WTBL_ON_BASE + 0x2300) -#define PSM_W_FLAG (1 << 31) -#endif /* __WF_WTBL_ON_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/top.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/top.h deleted file mode 100644 index d144a19df5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mac/mac_mt/top.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - top.h -*/ - -#ifndef __TOP_H__ -#define __TOP_H__ - -#define TOP_CFG_BASE 0x0000 - -#define TOP_HVR (TOP_CFG_BASE + 0x1000) -#define HW_VER_MASK (0xffff) -#define GET_HW_VER(p) (((p)&HW_VER_MASK)) -#define RESC_CID_MASK (0xf << 28) -#define GET_RESC_CID(p) (((p)&RESC_CID_MASK) >> 28) - -#define TOP_FVR (TOP_CFG_BASE + 0x1004) -#define FW_VER_MASK (0xffff) -#define GET_FW_VER(p) (((p)&FW_VER_MASK)) - -#define TOP_HCR (TOP_CFG_BASE + 0x1008) -#define HW_CODE_MASK (0xffff) -#define GET_HW_CODE(p) (((p)&HW_CODE_MASK)) - -#define STRAP_STA (TOP_CFG_BASE + 0x1010) -#define PCIE_MODE_OFFSET 2 -#define PCIE_MODE_MASK (1 << 2) -#define USB_MODE_OFFSET 3 -#define USB_MODE_MASK (1 << 3) -#define SIP_MODE_OFFSET 9 -#define SIP_MODE_MASK (1 << 9) - -#define XTAL_SEL_MASK (0x3) -#define GET_XTAL_SEL(p) (((p)&XTAL_SEL_MASK)) -#define EEPROM_SEL (1 << 2) -#define GET_EEPROM_SEL(p) (((p)&EEPROM_SEL) >> 2) -#define CO_CLOCK_SEL (1 << 8) -#define GET_CO_CLOCK_SEL(p) (((p)&CO_CLOCK_SEL) >> 8) -#define THREE_ANT (1 << 24) -#define GET_THREE_ANT(p) (((p)&THREE_ANT) >> 24) -#define N_ONLY (1 << 25) -#define GET_11N_ONLY(p) (((p)&N_ONLY) >> 25) - -#define TOP_CKGEN0 (TOP_CFG_BASE + 0x1100) -#define TOP_CKGEN1 (TOP_CFG_BASE + 0x1104) - -#define TOP_OFF_RSV (TOP_CFG_BASE + 0x1128) -#define CONN_ON_MISC (TOP_MISC_ON_BASE + 0x1140) -#define TOP_MISC (TOP_CFG_BASE + 0x1130) -#define TOP_MISC2 (TOP_CFG_BASE + 0x1134) - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/fwdl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/fwdl.h deleted file mode 100644 index c93492d90f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/fwdl.h +++ /dev/null @@ -1,205 +0,0 @@ - -#ifndef _FWDL_H -#define _FWDL_H - -/* - * FW feature set - * bit(0) : encrypt or not. - * bit(1,2): encrypt key index. - * bit(3) : compressed image or not. (added in CONNAC) - * bit(5) : replace RAM code starting address with image destination address or not. (added in CONNAC) - * bit(7) : download to EMI or not. (added in CONNAC) - */ -#define FW_FEATURE_SET_ENCRY (1 << 0) -#define FW_FEATURE_SET_KEY_MASK (0x3 << 1) -#define GET_FW_FEATURE_SET_KEY(p) (((p)&FW_FEATURE_SET_KEY_MASK) >> 1) -#define FW_FEATURE_COMPRESS_IMG (1 << 3) -#define FW_FEATURE_OVERRIDE_RAM_ADDR (1 << 5) -#define FW_FEATURE_DL_TO_EMI (1 << 7) - -#define WAIT_LOOP 1500 - -#define PATCH_V1_INFO_SIZE 30 -#define FW_V2_INFO_SIZE 36 -/* CONNAC */ -#define FW_V3_COMMON_TAILER_SIZE 36 -#define FW_V3_REGION_TAILER_SIZE 40 - -#define FWDL_PRINT_CHAR(src, cnt, info) \ - do { \ - UINT32 loop; \ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, info); \ - for (loop = 0; loop < cnt; loop++) \ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, \ - ("%c", *(src + loop))); \ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); \ - } while (0) - -#define FWDL_PRINT_HEX(src, cnt, info) \ - do { \ - UINT32 loop; \ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, info); \ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("0x")); \ - for (loop = 0; loop < cnt; loop++) \ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, \ - ("%02x", *(src + loop))); \ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); \ - } while (0) - -enum fwdl_stage { - FWDL_STAGE_FW_NOT_DL, - FWDL_STAGE_CMD_EVENT, - FWDL_STAGE_SCATTER, - FWDL_STAGE_FW_RUNNING -}; - -/* define FW SYNC CR, same as FW's definition */ -enum wifi_task_state { - WIFI_TASK_STATE_INITIAL = 0, - WIFI_TASK_STATE_FW_DOWNLOAD = 1, - WIFI_TASK_STATE_NORMAL_OPERATION = 2, - WIFI_TASK_STATE_NORMAL_TRX = 3, - WIFI_TASK_STATE_WACPU_RDY = 7 -}; - -/* use BIT(n) macro to convert to bitmap */ -enum target_cpu { WM_CPU, WA_CPU, MAX_CPU }; - -/* use BIT(n) macro to convert to bitmap */ -enum load_code_method { HEADER_METHOD, BIN_METHOD }; - -/* - * fw download cmd/event: - * FW_FLOW_V1 support 7603, 7628, 7636, 7637, 7615, 7622, CONNAC (p18, 7663) - */ -enum load_fw_flow { FW_FLOW_V1, FW_FLOW_V2_COMPRESS_IMG }; - -/* - * patch download cmd/event: - * PATCH_FLOW_V1 support 7636, 7637, 7615, 7622, CONNAC (p18, 7663) - */ -enum load_patch_flow { PATCH_FLOW_V1 }; - -/* - * fw format: - * FW_FORMAT_V1 support 7603, 7628 (all von-neumann architecture) - * FW_FORMAT_V2 support 7636, 7637, 7615, 7622 (all harvard architecture) - * FW_FORMAT_V3 support CONNAC architecture (p18, mt7663 and so on.) - */ -enum fw_format { FW_FORMAT_V1, FW_FORMAT_V2, FW_FORMAT_V3 }; - -/* - * patch format: - * PATCH_FORMAT_V1 support 7636, 7637, 7615, 7622, CONNAC (p18, 7663) - */ -enum patch_format { PATCH_FORMAT_V1 }; - -enum sem_status { - PATCH_NOT_DL_SEM_FAIL = 0, - PATCH_IS_DL = 1, - PATCH_NOT_DL_SEM_SUCCESS = 2, - SEM_RELEASE = 3 -}; - -struct img_source { - enum load_code_method applied_method; - UCHAR *header_ptr; - UINT32 header_len; - UCHAR *bin_name; - UCHAR *img_ptr; - UINT32 img_len; -}; - -struct fw_info { - UINT8 chip_id; - UINT8 eco_ver; - UINT8 num_of_region; - UINT8 format_ver; - UINT8 ram_ver[10]; - UINT8 ram_built_date[15]; - UINT32 crc; -}; - -struct patch_info { - UINT8 built_date[16]; - UINT8 platform[4]; - UINT8 hw_sw_version[4]; - UINT8 patch_version[4]; - UINT16 checksum; -}; - -struct img_profile_fw { - struct img_source source; - struct fw_info fw_info; -}; - -struct img_profile_patch { - struct img_source source; - struct patch_info patch_info; -}; - -struct fw_dl_buf { - UINT8 *img_ptr; - UINT32 img_dest_addr; - UINT32 img_size; - UINT8 feature_set; - /* decompress features are supported in CONNAC */ - UINT32 decomp_crc; - UINT32 decomp_img_size; - UINT32 decomp_block_size; -}; - -struct fw_dl_target { - struct fw_dl_buf *fw_region; - UINT8 num_of_region; -}; - -struct patch_dl_buf { - UINT8 *img_ptr; - UINT32 img_dest_addr; - UINT32 img_size; - BOOLEAN check_crc; -}; - -struct patch_dl_target { - struct patch_dl_buf *patch_region; - UINT8 num_of_region; -}; - -struct fwdl_op { - NDIS_STATUS(*load_fw) - (struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct fw_dl_target *target); - NDIS_STATUS(*load_patch) - (struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct patch_dl_target *target); - NDIS_STATUS(*parse_fw) - (struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct fw_dl_target *target); - NDIS_STATUS(*parse_patch) - (struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct patch_dl_target *target); - NDIS_STATUS(*ctrl_fw_state) - (struct _RTMP_ADAPTER *pAd, enum fwdl_stage target_stage); -}; - -struct fwdl_ctrl { - struct fwdl_op fwdl_op; - struct img_profile_fw fw_profile[MAX_CPU]; - struct img_profile_patch patch_profile[MAX_CPU]; - enum sem_status sem_status; - enum fwdl_stage stage; -}; - -INT NICLoadRomPatch(struct _RTMP_ADAPTER *ad); -INT NICLoadFirmware(struct _RTMP_ADAPTER *pAd); -INT FwdlHookInit(struct _RTMP_ADAPTER *pAd); -VOID NICRestartFirmware(struct _RTMP_ADAPTER *pAd); -NDIS_STATUS mt_load_patch(struct _RTMP_ADAPTER *pAd); -NDIS_STATUS mt_load_fw(struct _RTMP_ADAPTER *pAd); -NDIS_STATUS mt_fwdl_hook_init(struct _RTMP_ADAPTER *pAd); -NDIS_STATUS mt_restart_fw(struct _RTMP_ADAPTER *pAd); -VOID show_patch_info(struct _RTMP_ADAPTER *pAd); -VOID show_fw_info(struct _RTMP_ADAPTER *pAd); - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/mt_cmd.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/mt_cmd.h deleted file mode 100644 index a6e37570d2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/mt_cmd.h +++ /dev/null @@ -1,6618 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_cmd.h - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifndef __MT_CMD_H__ -#define __MT_CMD_H__ - -#include "rtmp_def.h" - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) -#include "icap.h" -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - -typedef UINT32 WLAN_STATUS, *P_WLAN_STATUS; - -struct cmd_msg; -struct _MT_SWITCH_CHANNEL_CFG; -struct _MT_RTS_THRESHOLD_T; -struct _MT_RDG_CTRL_T; -struct _BSS_INFO_ARGUMENT_T; -struct _STA_ADMIN_CONFIG; - -#ifdef BACKGROUND_SCAN_SUPPORT -struct _MT_BGND_SCAN_CFG; -struct _MT_BGND_SCAN_NOTIFY; -#endif /* BACKGROUND_SCAN_SUPPORT */ - -typedef VOID (*MSG_RSP_HANDLER)(struct cmd_msg *msg, char *payload, - UINT16 payload_len); - -#define CMD_QUERY 0 -#define CMD_SET 1 -#define CMD_NA 3 - -#define EXT_CMD_NA 0 -#define P1_Q0 0x8000 -#define CPU_TX_PORT 2 -#define EFUSE_BLOCK_SIZE 16 - -#define NEW_MCU_INIT_CMD_API 1 - -#define MT_IGNORE_PAYLOAD_LEN_CHECK 0xffff - -#define ROM_CODE_CMD_HEADER_LEN 12 - -#define BAND0 0 -#define BAND1 1 -#define BAND_NUM 2 -#define SKU_TABLE_SIZE 49 -#define SKU_TOTAL_SIZE 53 -#define SKU_TX_SPATIAL_STREAM_NUM 4 -#define SKU_TX_SPATIAL_STREAM_1SS 0 -#define SKU_TX_SPATIAL_STREAM_2SS 1 -#define SKU_TX_SPATIAL_STREAM_3SS 2 -#define SKU_TX_SPATIAL_STREAM_4SS 3 -#define SKU_TX_SPATIAL_STREAM_NUM 4 - -#define THERMAL_TABLE_SIZE 15 - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -#define PPB_SIZE 32 -#define LPB_SIZE 32 -#define PB_SIZE 32 -#define RT_NUM 16 -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -enum EEPROM_STORAGE_TYPE { - EEPROM_PROM = 0, - EEPROM_EFUSE = 1, - EEPROM_FLASH = 2, -}; - -enum MCU_SRC_TO_DEST_INDEX_TYPE { - HOST2N9 = 0, - CR42N9 = 1, - HOST2CR4 = 2, - HOST2CR4N9 = 3 -}; - -#define N92HOST HOST2N9 -#define CR42HOST HOST2CR4 - -enum cmd_msg_state { - illegal, /* 0 */ - tx_start, /* 1 */ - tx_kickout_fail, /* 2 */ - tx_timeout_fail, /* 3 */ - tx_retransmit, /* 4 */ - tx_done, /* 5 */ - wait_cmd_out, /* 6 */ - wait_cmd_out_and_ack, /* 7 */ - wait_ack, /* 8 */ - rx_start, /* 9 */ - rx_receive_fail, /* a */ - rx_done, /* b */ -}; - -#define TX_DELAY_MODE_ARG1_TX_BATCH_CNT 1 -#define TX_DELAY_MODE_ARG1_TX_DELAY_TIMEOUT_US 2 -#define TX_DELAY_MODE_ARG1_PKT_LENGTHS 3 - -typedef enum _ENUM_EXT_CMD_CR4_SET_ID_T { - CR4_SET_ID_HELP = 0, - CR4_SET_ID_MAX_AMSDU_QUEUE_NUM = 1, - CR4_SET_ID_READ_ONE_RX_TOKEN_WRITE_BACK_FIFO = 2, - CR4_SET_ID_READ_ALL_RX_TOKEN_WRITE_BACK_FIFO = 3, - CR4_SET_ID_TRIGGER_PDMA_RECEIVE = 4, - CR4_SET_ID_TRIGGER_ASSERT = 5, - CR4_SET_ID_TX_FRAGMENT_THRESHOLD = 6, - CR4_SET_ID_MEM_QUERY = 7, - CR4_SET_ID_MEM_SET = 8, - CR4_SET_ID_STOP_RX_PDMA_RING_DEQUEUE = 9, - CR4_SET_ID_START_RX_PDMA_RING_DEQUEUE = 0xa, - CR4_SET_ID_CONFIG_POWER_SAVING_MODE = 0xb, - CR4_SET_ID_CONFIG_TX_DELAY_MODE = 0xc, - CR4_SET_ID_CONFIG_STA_AMSDU_MAX_NUM = 0xd, - CR4_SET_ID_NUM -} ENUM_EXT_CMD_CR4_SET_ID_T, - *P_ENUM_EXT_CMD_CR4_SET_ID_T; - -/** - * The CONTROL_FLAG_INIT_COMBINATION enum parameters used by Host to init - * the flags of one msg. - * - * @BIT0 NEED RSP specific the cmd need event response. - * @BIT1 NEED RETRY specific if the cmd fail, it can retry. - * @BIT2 NEED WAIT specific the cmd will sync with FW. - * @BIT3 CMD_SET_QUERY specific cmd type is belong to set or query. - * - * @BIT4 CMD_NA specific cmd type is Neither set nor query. - * Note: - * bit 3 & 4 always mutual - * exclusive to each other. - * - * @BIT5 LEN_VAR specific cmd type is expected event len variable. - * The RX handler will only check the minimum event - * size which specific in msg. - * - * @BIT7 NEED FRAG expected cmd len exceed default block size - * the cmd will be sent in Frag way. - * - * @Others Reserved - * - */ -enum CONTROL_FLAG_INIT_COMBINATION { - INIT_CMD_QUERY = 0x00, - INIT_CMD_QUERY_AND_RSP = 0x01, - INIT_CMD_QUERY_AND_WAIT_RSP = 0x05, - INIT_CMD_QUERY_AND_WAIT_RETRY_RSP = 0x07, - - INIT_CMD_SET = 0x08, - INIT_CMD_SET_AND_RSP = 0x09, - INIT_CMD_SET_AND_RETRY = 0x0A, - INIT_CMD_SET_AND_WAIT_RSP = 0x0D, - INIT_CMD_SET_AND_WAIT_RETRY = 0x0E, - INIT_CMD_SET_AND_WAIT_RETRY_RSP = 0x0F, - - INIT_CMD_NA = 0x10, - INIT_CMD_NA_AND_WAIT_RETRY_RSP = 0x17, - - INIT_LEN_VAR_CMD_SET_AND_WAIT_RETRY_RSP = 0x27, -}; - -#define CMD_FLAGS_MASK (0x3F) - -#define CMD_FLAG_CMD_LEN_VAR_MASK (0x20) -#define CMD_FLAG_CMD_LEN_VAR_OFFSET (5) - -#define CMD_FLAG_CMD_NA_MASK (0x10) -#define CMD_FLAG_CMD_NA_OFFSET (4) - -#define CMD_FLAG_SET_QUERY_MASK (0x08) -#define CMD_FLAG_SET_QUERY_OFFSET (3) - -#define CMD_FLAG_NEED_SYNC_WITH_FW_MASK (0x04) -#define CMD_FLAG_NEED_SYNC_WITH_FW_OFFSET (2) - -#define CMD_FLAG_NEED_RETRY_MASK (0x02) -#define CMD_FLAG_NEED_RETRY_OFFSET (1) - -#define CMD_FLAG_NEED_FW_RSP_MASK (0x01) -#define CMD_FLAG_NEED_FW_RSP_OFFSET (0) - -/* CMD ATTRIBUTE initlized related Marco */ -#define SET_CMD_ATTR_MCU_DEST(attr, cmd_dest) ((attr).mcu_dest = cmd_dest) -#define SET_CMD_ATTR_TYPE(attr, cmd_type) ((attr).type = cmd_type) -#define SET_CMD_ATTR_EXT_TYPE(attr, ext_cmd_type) \ - ((attr).ext_type = ext_cmd_type) -#define SET_CMD_ATTR_CTRL_FLAGS(attr, cmd_flags) ((attr).ctrl.flags = cmd_flags) -#define SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, size) \ - ((attr).ctrl.expect_size = (UINT16)size) -#define SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, wait_time) \ - ((attr).ctrl.wait_ms_time = (UINT16)wait_time) -#define SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, write_back_buffer_in_callback) \ - ((attr).rsp.wb_buf_in_calbk = (UINT32 *)write_back_buffer_in_callback) -#define SET_CMD_ATTR_RSP_HANDLER(attr, callback) ((attr).rsp.handler = callback) - -/* CMD ATTRIBUTE ctrl flags related Macro */ -#define GET_CMD_ATTR_CTRL_FLAGS(attr) (attr.ctrl.flags & CMD_FLAGS_MASK) - -#define IS_CMD_ATTR_LEN_VAR_FLAG_SET(attr) \ - (((attr).ctrl.flags & CMD_FLAG_CMD_LEN_VAR_MASK) ? TRUE : FALSE) -#define IS_CMD_ATTR_NA_FLAG_SET(attr) \ - (((attr).ctrl.flags & CMD_FLAG_CMD_NA_MASK) ? TRUE : FALSE) -#define IS_CMD_ATTR_SET_QUERY_FLAG_SET(attr) \ - (((attr).ctrl.flags & CMD_FLAG_SET_QUERY_MASK) ? TRUE : FALSE) -#define IS_CMD_ATTR_NEED_SYNC_WITH_FW_FLAG_SET(attr) \ - (((attr).ctrl.flags & CMD_FLAG_NEED_SYNC_WITH_FW_MASK) ? TRUE : FALSE) -#define IS_CMD_ATTR_NEED_RETRY_FLAG_SET(attr) \ - (((attr).ctrl.flags & CMD_FLAG_NEED_RETRY_MASK) ? TRUE : FALSE) -#define IS_CMD_ATTR_NEED_FW_RSP_FLAG_SET(attr) \ - (((attr).ctrl.flags & CMD_FLAG_NEED_FW_RSP_MASK) ? TRUE : FALSE) - -/* CMD MSG initlize related Marco */ -#define SET_CMD_MSG_PORT_QUEUE_ID(msg, hardware_port) \ - ((msg)->pq_id = hardware_port) -#define SET_CMD_MSG_SEQUENCE(msg, msg_sequence) ((msg)->seq = msg_sequence) -#define SET_CMD_MSG_RETRY_TIMES(msg, cmd_retry_times) \ - ((msg)->retry_times = cmd_retry_times) - -#define SET_CMD_MSG_MCU_DEST(msg, cmd_dest) \ - SET_CMD_ATTR_MCU_DEST((msg)->attr, cmd_dest) -/* (msg)->attr.mcu_dest = msg_dest; */ -#define SET_CMD_MSG_TYPE(msg, cmd_type) SET_CMD_ATTR_TYPE((msg)->attr, cmd_type) -/* (msg)->attr.type = cmd_type; */ -#define SET_CMD_MSG_EXT_TYPE(msg, ext_cmd_type) \ - SET_CMD_ATTR_EXT_TYPE((msg)->attr, ext_cmd_type) -/* (msg)->attr.ext_type = ext_cmd_type; */ -#define SET_CMD_MSG_CTRL_FLAGS(msg, cmd_flags) \ - SET_CMD_ATTR_CTRL_FLAGS((msg)->attr, cmd_flags) -/* (msg)->attr.ctrl.flags = cmd_flags; */ -#define SET_CMD_MSG_CTRL_RSP_EXPECT_SIZE(msg, size) \ - SET_CMD_ATTR_RSP_EXPECT_SIZE((msg)->attr, size) -/* (msg)->attr.ctrl.expect_size = size; */ -#define SET_CMD_MSG_CTRL_RSP_WAIT_MS_TIME(msg, wait_time) \ - SET_CMD_ATTR_RSP_WAIT_MS_TIME((msg)->attr, wait_time) -/* (msg)->attr.ctrl.wait_ms_time = wait_time; */ -#define SET_CMD_MSG_RSP_WB_BUF_IN_CALBK(msg, write_back_buffer_in_callback) \ - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK((msg)->attr, \ - write_back_buffer_in_callback) -/* (msg)->attr.rsp.wb_buf_in_calbk = (UINT32 *)write_back_buffer_in_callback; */ -#define SET_CMD_MSG_RSP_HANDLER(msg, callback) \ - SET_CMD_ATTR_RSP_HANDLER((msg)->attr, callback) -/* (msg)->attr.rsp.handler = callback; */ - -/* CMD MSG flags related Macro, part I */ -#define SET_MSG_FLAGS_VALUE(msg, val) \ - (msg)->attr.ctrl.flags = (((msg)->attr.ctrl.flags & CMD_FLAGS_MASK) | \ - ((val)&CMD_FLAGS_MASK)) -#define GET_MSG_FLAGS_VALUE(msg) \ - ((((msg)->attr.ctrl.flags & CMD_FLAGS_MASK)) ? TRUE : FALSE) - -#define SET_MSG_CMD_NA_FLAG(msg) \ - (msg)->attr.ctrl.flags = (((msg)->attr.ctrl.flags & CMD_FLAGS_MASK) | \ - (1 << CMD_FLAG_CMD_NA_OFFSET)) -#define GET_MSG_CMD_NA_FLAG(msg) \ - ((((msg)->attr.ctrl.flags & CMD_FLAG_CMD_NA_MASK)) ? TRUE : FALSE) - -#define SET_MSG_SET_QUERY_FLAG(msg) \ - (msg)->attr.ctrl.flags = (((msg)->attr.ctrl.flags & CMD_FLAGS_MASK) | \ - (1 << CMD_FLAG_SET_QUERY_OFFSET)) - -#define GET_MSG_SET_QUERY_FLAG(msg) \ - ((((msg)->attr.ctrl.flags & CMD_FLAG_SET_QUERY_MASK)) ? TRUE : FALSE) - -#define SET_MSG_NEED_SYNC_WITH_FW_FLAG(msg) \ - (msg)->attr.ctrl.flags = (((msg)->attr.ctrl.flags & CMD_FLAGS_MASK) | \ - (1 << CMD_FLAG_NEED_SYNC_WITH_FW_OFFSET)) - -#define GET_MSG_NEED_SYNC_WITH_FW_FLAG(msg) \ - ((((msg)->attr.ctrl.flags & CMD_FLAG_NEED_SYNC_WITH_FW_MASK)) ? TRUE : \ - FALSE) - -#define SET_MSG_NEED_RETRY_FLAG(msg) \ - (msg)->attr.ctrl.flags = (((msg)->attr.ctrl.flags & CMD_FLAGS_MASK) | \ - (1 << CMD_FLAG_NEED_RETRY_OFFSET)) - -#define GET_MSG_NEED_RETRY_FLAG(msg) \ - ((((msg)->attr.ctrl.flags & CMD_FLAG_NEED_RETRY_MASK)) ? TRUE : FALSE) - -#define SET_MSG_NEED_FW_RSP_FLAG(msg) \ - (msg)->attr.ctrl.flags = (((msg)->attr.ctrl.flags & CMD_FLAGS_MASK) | \ - (1 << CMD_FLAG_NEED_FW_RSP_OFFSET)) -#define GET_MSG_NEED_FW_RSP_FLAG(msg) \ - ((((msg)->attr.ctrl.flags & CMD_FLAG_NEED_FW_RSP_MASK)) ? TRUE : FALSE) - -/* CMD MSG flags related Macro, part II */ -#define GET_CMD_MSG_CTRL_FLAGS(msg) GET_CMD_ATTR_CTRL_FLAGS((msg)->attr) - -#define IS_CMD_MSG_LEN_VAR_FLAG_SET(msg) \ - IS_CMD_ATTR_LEN_VAR_FLAG_SET((msg)->attr) -#define IS_CMD_MSG_NA_FLAG_SET(msg) IS_CMD_ATTR_NA_FLAG_SET((msg)->attr) -#define IS_CMD_MSG_SET_QUERY_FLAG_SET(msg) \ - IS_CMD_ATTR_SET_QUERY_FLAG_SET((msg)->attr) -#define IS_CMD_MSG_NEED_SYNC_WITH_FW_FLAG_SET(msg) \ - IS_CMD_ATTR_NEED_SYNC_WITH_FW_FLAG_SET((msg)->attr) -#define IS_CMD_MSG_NEED_RETRY_FLAG_SET(msg) \ - IS_CMD_ATTR_NEED_RETRY_FLAG_SET((msg)->attr) -#define IS_CMD_MSG_NEED_FW_RSP_FLAG_SET(msg) \ - IS_CMD_ATTR_NEED_FW_RSP_FLAG_SET((msg)->attr) - -#define IS_EXT_CMD_AND_SET_NEED_RSP(m) \ - ((((((struct cmd_msg *)(m))->attr.type) == EXT_CID) && \ - (IS_CMD_MSG_NEED_FW_RSP_FLAG_SET(m))) ? \ - TRUE : \ - FALSE) - -typedef struct _CTRL_PARAM { - UINT8 flags; - UINT16 expect_size; - UINT16 wait_ms_time; -} CTRL_PARAM, *P_CTRL_PARAM; - -typedef struct _RSP_PARAM { - UINT32 *wb_buf_in_calbk; - MSG_RSP_HANDLER handler; -} RSP_PARAM, *P_RSP_PARAM; - -typedef struct _CMD_ATTRIBUTE { - UINT16 mcu_dest; - UINT8 type; - UINT8 ext_type; - CTRL_PARAM ctrl; - RSP_PARAM rsp; -} CMD_ATTRIBUTE, *P_CMD_ATTRIBUTE; - -/** - * The cmd_msg is used by Host to communicate with FW.(i.e issue request) - * The FW may response event or not depend on cmd flags setting. - * - * ----------------------------- Common Part ----------------------------- - * @Field attr cmd attribute descriptation - * @Filed pq_id specific cmd physical target - * @Field seq cmd sequence - * @Filed retransmit_times specific cmd retransmit_times - * @Field priv - * @Filed net_pkt - * @Field cmd_tx_len - - * ------------------------------ OS Part ------------------------------ - * - * - */ -struct cmd_msg { - CMD_ATTRIBUTE attr; - UINT16 pq_id; - UINT8 seq; - UINT8 retry_times; - enum cmd_msg_state state; - - VOID *priv; - VOID *net_pkt; - VOID *retry_pkt; - UINT32 wcid; /* Index of MacTableEntry */ - UINT32 cmd_tx_len; - - UINT8 need_sent_in_frag; - UINT8 frag_cmd_sent_count; - UINT16 orig_cmd_whole_len; - - UINT8 *back_orig_frag_fw_txd_and_cmd_struct_content; - /* UINT8 *back_orig_frag_cmd_struct_content; */ - UINT32 back_orig_frag_cmd_struct_content_offset; - UINT8 receive_frag_event_count; - - ULONG sending_time_in_jiffies; /* record the time in jiffies for send-the-command */ - ULONG receive_time_in_jiffies; /* record the time in jiffies for N9-firmware-response */ - -#if !defined(COMPOS_TESTMODE_WIN) && !defined(COMPOS_WIN) - DL_LIST list; - RTMP_OS_COMPLETION ack_done; -#else /* (COMPOS_TESTMODE_WIN) || defined(COMPOS_WIN) */ - UINT32 current_pos; /* current append length */ -#endif - - UINT32 cmd_return_status; -#ifdef DBG_STARVATION - struct starv_dbg starv; -#endif /*DBG_STARVATION*/ -}; - -#ifdef RT_BIG_ENDIAN -typedef union _FW_TXD_0 { - struct { - UINT32 pq_id : 16; - UINT32 length : 16; - } field; - UINT32 word; -} FW_TXD_0; -#else -typedef union _FW_TXD_0 { - struct { - UINT32 length : 16; - UINT32 pq_id : 16; - } field; - UINT32 word; -} FW_TXD_0; -#endif - -#define PKT_ID_CMD 0xA0 -#define PKT_ID_EVENT 0xE000 - -#define WF_NUM 4 - -#ifdef RT_BIG_ENDIAN -typedef union _FW_TXD_1 { - struct { - UINT32 seq_num : 8; - UINT32 set_query : 8; - UINT32 pkt_type_id : 8; - UINT32 cid : 8; - } field; -#if defined(MT7615) - struct { - UINT32 seq_num : 6; - UINT32 pkt_ft : 2; - UINT32 set_query : 8; - UINT32 pkt_type_id : 8; - UINT32 cid : 8; - } field1; -#endif - UINT32 word; -} FW_TXD_1; -#else -typedef union _FW_TXD_1 { - struct { - UINT32 cid : 8; - UINT32 pkt_type_id : 8; - UINT32 set_query : 8; - UINT32 seq_num : 8; - } field; -#if defined(MT7615) - struct { - UINT32 cid : 8; - UINT32 pkt_type_id : 8; - UINT32 set_query : 8; - UINT32 pkt_ft : 2; - UINT32 seq_num : 6; - } field1; -#endif - UINT32 word; -} FW_TXD_1; -#endif - -#define EXT_CID_OPTION_NEED_ACK 1 -#define EXT_CID_OPTION_NO_NEED_ACK 0 - -#ifdef RT_BIG_ENDIAN -typedef union _FW_TXD_2 { - struct { - UINT32 ext_cid_option : 8; - UINT32 ucS2DIndex : 8; - UINT32 ext_cid : 8; - UINT32 ucD2B0Rev : 8; - } field; - UINT32 word; -} FW_TXD_2; -#else -typedef union _FW_TXD_2 { - struct { - UINT32 ucD2B0Rev : 8; - UINT32 ext_cid : 8; - UINT32 ucS2DIndex : 8; - UINT32 ext_cid_option : 8; - } field; - UINT32 word; -} FW_TXD_2; -#endif /* RT_BIG_ENDIAN */ - -/* - * FW TX descriptor - */ -typedef struct GNU_PACKED _FW_TXD_ { - FW_TXD_0 fw_txd_0; - FW_TXD_1 fw_txd_1; - FW_TXD_2 fw_txd_2; - UINT32 au4D3toD7rev[5]; -} FW_TXD; - -/* - * Command type table layer 0 - */ -enum MT_CMD_TYPE { - MT_TARGET_ADDRESS_LEN_REQ = 0x01, - MT_FW_START_REQ = 0x02, - INIT_CMD_ACCESS_REG = 0x3, - MT_PATCH_START_REQ = 0x05, - MT_PATCH_FINISH_REQ = 0x07, - MT_PATCH_SEM_CONTROL = 0x10, - MT_HIF_LOOPBACK = 0x20, - CMD_CH_PRIVILEGE = 0x20, - INIT_CMD_WIFI_DECOMPRESSION_START = 0x30, - CMD_ACCESS_REG = 0xC2, - INIT_CMD_ID_CR4 = 0xC4, /* for CR4test */ - EXT_CID = 0xED, - MT_FW_SCATTER = 0xEE, - MT_RESTART_DL_REQ = 0xEF, -}; - -#define CMD_START_LOAD 0x01 -#define CMD_RAM_START_RUN 0x02 -#define CMD_ROM_ACCESS_REG 0x03 -#define CMD_PATCH_SEMAPHORE_CONTROL 0x10 -#define CMD_PATCH_START 0x05 -#define CMD_PATCH_FINISH 0x07 -#define CMD_LOOPBACK_TEST 0x20 - -/* - * Extension Command - */ -enum EXT_CMD_TYPE { - EXT_CMD_ID_EFUSE_ACCESS = 0x01, - EXT_CMD_RF_REG_ACCESS = 0x02, - EXT_CMD_RF_TEST = 0x04, - EXT_CMD_RADIO_ON_OFF_CTRL = 0x05, - EXT_CMD_WIFI_RX_DISABLE = 0x06, - EXT_CMD_PM_STATE_CTRL = 0x07, - EXT_CMD_CHANNEL_SWITCH = 0x08, - EXT_CMD_NIC_CAPABILITY = 0x09, - EXT_CMD_PWR_SAVING = 0x0A, - EXT_CMD_MULTIPLE_REG_ACCESS = 0x0E, - EXT_CMD_AP_PWR_SAVING_CAPABILITY = 0xF, - EXT_CMD_SEC_ADDREMOVE_KEY = 0x10, - EXT_CMD_SET_TX_POWER_CTRL = 0x11, - EXT_CMD_THERMO_CAL = 0x12, - EXT_CMD_FW_LOG_2_HOST = 0x13, - EXT_CMD_PS_RETRIEVE_START = 0x14, -#ifdef CONFIG_MULTI_CHANNEL - EXT_CMD_ID_MCC_OFFLOAD_START = 0x15, - EXT_CMD_ID_MCC_OFFLOAD_STOP = 0x16, -#endif /* CONFIG_MULTI_CHANNEL */ - EXT_CMD_ID_LED = 0x17, - EXT_CMD_ID_PACKET_FILTER = 0x18, - EXT_CMD_BT_COEX = 0x19, - EXT_CMD_ID_PWR_MGT_BIT_WIFI = 0x1B, - EXT_CMD_ID_GET_TX_POWER = 0x1C, -#if defined(MT_MAC) && (!defined(MT7636)) - EXT_CMD_ID_BF_ACTION = 0x1E, -#endif /* MT_MAC && !MT7636 */ - - EXT_CMD_EFUSE_BUFFER_MODE = 0x21, - EXT_CMD_THERMAL_PROTECT = 0x23, - EXT_CMD_ID_CLOCK_SWITCH_DISABLE = 0x24, - EXT_CMD_STAREC_UPDATE = 0x25, - EXT_CMD_ID_BSSINFO_UPDATE = 0x26, - EXT_CMD_ID_EDCA_SET = 0x27, - EXT_CMD_ID_SLOT_TIME_SET = 0x28, - EXT_CMD_GET_THEMAL_SENSOR = 0x2C, - EXT_CMD_TMR_CAL = 0x2D, - EXT_CMD_ID_DEVINFO_UPDATE = 0x2a, - EXT_CMD_ID_NOA_OFFLOAD_CTRL = 0x2B, - EXT_CMD_ID_WAKEUP_OPTION = 0x2E, - EXT_CMD_ID_GET_TX_STATISTICS = 0x30, - EXT_CMD_ID_WTBL_UPDATE = 0x32, - EXT_CMD_ID_TRGR_PRETBTT_INT_EVENT = 0x33, - EXT_CMD_TDLS_CHSW = 0x34, -#ifdef VOW_SUPPORT - EXT_CMD_ID_DRR_CTRL = 0x36, - EXT_CMD_ID_BSSGROUP_CTRL = 0x37, - EXT_CMD_ID_VOW_FEATURE_CTRL = 0x38, -#endif /* VOW_SUPPORT */ -#ifdef MT_DFS_SUPPORT /* Jelly20141229 */ - EXT_CMD_ID_RDD_ON_OFF_CTRL = 0x3A, -#endif - EXT_CMD_ID_GET_MAC_INFO = 0x3C, -#ifdef CONFIG_HW_HAL_OFFLOAD - EXT_CMD_ID_ATE_TEST_MODE = 0x3D, -#endif - EXT_CMD_ID_PROTECT_CTRL = 0x3e, - EXT_CMD_ID_RDG_CTRL = 0x3f, -#ifdef CFG_SUPPORT_MU_MIMO - EXT_CMD_ID_MU_MIMO = 0x40, -#endif - EXT_CMD_ID_SNIFFER_MODE = 0x42, - EXT_CMD_ID_GENERAL_TEST = 0x41, - EXT_CMD_ID_WIFI_HIF_CTRL = 0x43, - EXT_CMD_ID_TMR_CTRL = 0x44, - EXT_CMD_ID_DBDC_CTRL = 0x45, - EXT_CMD_MAC_ENABLE_CTRL = 0x46, - EXT_CMD_ID_RX_HDR_TRANS = 0x47, - EXT_CMD_ID_CONFIG_MUAR = 0x48, - EXT_CMD_ID_BCN_OFFLOAD = 0x49, -#if defined(VOW_SUPPORT) || defined(MAP_R2) - EXT_CMD_ID_RX_AIRTIME_CTRL = 0x4a, - EXT_CMD_ID_AT_PROC_MODULE = 0x4b, -#endif /* VOW_SUPPORT */ -#ifdef BACKGROUND_SCAN_SUPPORT - EXT_CMD_ID_BGND_SCAN_NOTIFY = 0x4D, -#endif /* BACKGROUND_SCAN_SUPPORT */ - EXT_CMD_ID_SET_RX_PATH = 0x4e, - EXT_CMD_ID_EFUSE_FREE_BLOCK = 0x4f, - EXT_CMD_ID_AUTO_BA = 0x51, - EXT_CMD_ID_MCAST_CLONE = 0x52, - EXT_CMD_ID_MULTICAST_ENTRY_INSERT = 0x53, - EXT_CMD_ID_MULTICAST_ENTRY_DELETE = 0x54, -#ifdef CFG_SUPPORT_MU_MIMO_RA - EXT_CMD_ID_MU_MIMO_RA = 0x55, -#endif -#ifdef WIFI_SPECTRUM_SUPPORT - EXT_CMD_ID_WIFI_SPECTRUM = 0x56, -#endif /* WIFI_SPECTRUM_SUPPORT */ - EXT_CMD_ID_DUMP_MEM = 0x57, - EXT_CMD_ID_TX_POWER_FEATURE_CTRL = 0x58, -#ifdef PRE_CAL_TRX_SET1_SUPPORT - EXT_CMD_ID_RXDCOC_CAL_RESULT = 0x59, - EXT_CMD_ID_TXDPD_CAL_RESULT = 0x60, - EXT_CMD_ID_RDCE_VERIFY = 0x61, -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) || \ - defined(PRE_CAL_MT7622_SUPPORT) - EXT_CMD_ID_TXLPF_CAL_INFO = 0x62, - EXT_CMD_ID_TXIQ_CAL_INFO = 0x63, - EXT_CMD_ID_TXDC_CAL_INFO = 0x64, - EXT_CMD_ID_RXFI_CAL_INFO = 0x65, - EXT_CMD_ID_RXFD_CAL_INFO = 0x66, - EXT_CMD_ID_POR_CAL_INFO = 0x67, -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) || defined(PRE_CAL_MT7622_SUPPORT) */ -#ifdef RED_SUPPORT - EXT_CMD_ID_RED_ENABLE = 0x68, - EXT_CMD_ID_RED_SHOW_STA = 0x69, - EXT_CMD_ID_RED_TARGET_DELAY = 0x6A, -#endif /* RED_SUPPORT */ - EXT_CMD_ID_PKT_BUDGET_CTRL_CFG = 0x6C, - EXT_CMD_ID_TOAE_ENABLE = 0x6D, - EXT_CMD_ID_BWF_LWC_ENABLE = 0x6E, - EXT_CMD_ID_EDCCA_CTRL = 0x70, -#if defined(CONFIG_HOTSPOT_R2) || defined(DSCP_QOS_MAP_SUPPORT) - EXT_CMD_ID_HOTSPOT_INFO_UPDATE = 0x71, -#endif /* CONFIG_HOTSPOT_R2 */ - EXT_CMD_ID_EFUSE_ACCESS_CHECK = 0x72, -#ifdef GREENAP_SUPPORT - EXT_CMD_ID_GREENAP_CTRL = 0x73, -#endif /* GREENAP_SUPPORT */ - EXT_CMD_ID_SET_MAX_PHY_RATE = 0x74, - EXT_CMD_ID_CP_SUPPORT = 0x75, -#ifdef PRE_CAL_TRX_SET2_SUPPORT - EXT_CMD_ID_PRE_CAL_RESULT = 0x76, -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) - EXT_CMD_ID_CAL_RESTORE_FROM_FILE = 0x77, -#endif /* CAL_BIN_FILE_SUPPORT */ - - EXT_CMD_ID_LINK_TEST_FEATURE_CTRL = 0x78, - EXT_CMD_ID_THERMAL_RECAL_MODE = 0x79, -#ifdef MIN_PHY_RATE_SUPPORT - EXT_CMD_ID_SET_MIN_PHY_RATE = 0x7A, -#endif /* MIN_PHY_RATE_SUPPORT */ -#ifdef FAST_UP_RATE_SUPPORT - EXT_CMD_ID_SET_FAST_UP_RATE = 0x7B, -#endif /* FAST_UP_RATE_SUPPORT */ -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT - EXT_CMD_ID_SET_RDM_RADAR_THRES = 0x7C, -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT - EXT_CMD_ID_SET_RDM_TEST_PATTERN = 0x7D, -#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */ - -#ifdef A4_CONN - EXT_CMD_ID_MWDS_SUPPORT = 0x80, -#endif - EXT_CMD_ID_SER = 0x81, -#ifdef HOST_RESUME_DONE_ACK_SUPPORT - EXT_CMD_ID_HOST_RESUME_DONE_ACK = 0x83, -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT - EXT_CMD_ID_PCIE_ASPM_DYM_CTRL = 0x84, -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ -#ifdef PRE_CAL_MT7622_SUPPORT - EXT_CMD_ID_RFTEST_RECAL = 0x85, - EXT_CMD_ID_TXDPD_CAL_INFO = 0x86, -#endif /* PRE_CAL_MT7622_SUPPORT */ -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) - EXT_CMD_ID_GET_WTBL_TX_COUNTER = 0x91, -#endif - EXT_CMD_RXV_ENABLE_CTRL = 0x93, - EXT_CMD_ID_FW_DBG_CTRL = 0x95, - EXT_CMD_ID_TX_CCK_STREAM_CTRL = 0x96, - EXT_CMD_ID_SHAPING_FILTER_DISABLE = 0x97, -#ifdef PS_QUEUE_INC_SUPPORT - EXT_CMD_ID_PS_QUEUE_INC = 0x98, -#endif -#ifdef TXSTAT_2040BW_24G_SUPPORT - EXT_CMD_ID_BW_STATS_FEATURE = 0x99, -#endif -#ifdef WIFI_EAP_FEATURE - EXT_CMD_ID_EAP_CTRL = 0xA0, -#endif -#ifdef IGMP_TVM_SUPPORT - EXT_CMD_ID_IGMP_MULTICAST_SET_GET = 0xA1, -#endif /* IGMP_TVM_SUPPORT */ -#if defined(TXRX_STAT_SUPPORT) || defined(EAP_STATS_SUPPORT) - EXT_CMD_ID_GET_STA_TX_STAT = 0xA2, -#endif -#ifdef AMPDU_CONF_SUPPORT - EXT_CMD_ID_MPDU_RETRY_COUNT = 0xA3, -#endif /* AMPDU_CONF_SUPPORT*/ -#ifdef CONFIG_MAP_SUPPORT - EXT_CMD_ID_GET_ALL_STA_TX_RATE = 0xA4, -#endif -#ifdef OCE_SUPPORT - EXT_CMD_ID_FD_FRAME_OFFLOAD = 0xA6, -#endif /* OCE_SUPPORT */ - EXT_CMD_ID_SEND_NULL_FRAME_SUPPORT = 0xA7, - EXT_CMD_ID_SET_VHT_RATE_IN_2G = 0xA8, - EXT_CMD_ID_RA_OPTION_FREQ_DUP = 0xA9, - EXT_CMD_ID_IGMP_FLOODING_CMD = 0xBD, -}; - -typedef enum _LINK_TEST_ACTION_CATEGORY { - LINK_TEST_TX_CSD = 0, - LINK_TEST_RX, - LINK_TEST_TXPWR, - LINK_TEST_TXPWR_UP_TABLE, - LINK_TEST_ACR, - LINK_TEST_RCPI, - LINK_TEST_SEIDX, - LINK_TEST_RCPI_MA, - LINK_TEST_TX, - LINK_TEST_ACTION_NUM -} LINK_TEST_ACTION_CATEGORY, - *P_LINK_TEST_ACTION_CATEGORY; - -/* CR4 test */ -typedef enum _EXT_CMD_ID_CR4_T { - EXT_CMD_ID_CR4_QUERY = 0, - EXT_CMD_ID_CR4_SET, - EXT_CMD_ID_CR4_CAPABILITY, - EXT_CMD_ID_CR4_DEBUG, - EXT_CMD_ID_CR4_MAX_NUM, -} EXT_CMD_ID_CR4_T; - -typedef enum _EXT_CMD_CR4_QUERY_OPTION_T { - CR4_QUERY_OPTION_HELP = 0, - CR4_QUERY_OPTION_SYSTEM = 1, - CR4_QUERY_OPTION_STACK_BOUNDARY = 2, - CR4_QUERY_OPTION_OS_TASK = 3, - CR4_QUERY_OPTION_PDMA_INFO = 4, - CR4_QUERY_OPTION_PDMA_DEBUG_PROBE = 5, - CR4_QUERY_OPTION_CPU_UTILIZATION = 6, - CR4_QUERY_OPTION_PACKET_STATISTICS = 7, - CR4_QUERY_OPTION_WIFI_INFO = 8, - CR4_QUERY_OPTION_RESET_WIFI_INFO = 9, - CR4_QUERY_OPTION_BSS_TLB_STA_RECORD = 0xa, - CR4_QUERY_OPTION_CR4_STATUS_CR = 0xb, - CR4_QUERY_OPTION_SHOW_CR4_INTERNAL_BUFFER_STATUS = 0xc, - CR4_QUERY_OPTION_DUMP_RX_REORDER_QUEUE_INFO = 0xd, - CR4_QUERY_OPTION_SHOW_RX_REORDER_QUEUE_LEN = 0xe, - CR4_QUERY_OPTION_SHOW_RXCUTDISP_REG_CONTENT = 0xf, - CR4_QUERY_OPTION_SHOW_CR4_CAPABILITY_DEBUG_SETTING = 0x10, - CR4_QUERY_OPTION_SHOW_CR4_POWER_SAVING_MODE = 0x11, - CR4_QUERY_OPTION_GET_BSS_ACQ_PKT_NUM = 0x12, - CR4_QUERY_OPTION_GET_BSS_HOTSPOT_CAPABILITY = 0x13, - CR4_QUERY_OPTION_SHOW_TASK_INFO = 0x14, - CR4_QUERY_OPTION_GET_TX_STATISTICS = 0x15, - CR4_QUERY_OPTION_MAX_NUM, -} EXT_CMD_CR4_QUERY_OPTION_T; - -enum EXT_CMD_TAG_ID { - EXT_CMD_TAG_RDG = 0x01, - EXT_CMD_TAG_RXMAXLEN = 0x02, - EXT_CMD_TAG_TR_STREAM = 0x03, - EXT_CMD_TAG_UPDATE_BA = 0x04, - EXT_CMD_TAG_SET_MacTXRX = 0x05, - EXT_CMD_TAG_SET_TXSCF = 0x06, - EXT_CMD_TAG_SET_RXPATH = 0x07, - EXT_CMD_TAG_RX_HDR_TRNS = 0x08, - EXT_CMD_TAG_RX_HDR_TRNSBL = 0x09, - EXT_CMD_TAG_RX_GROUP = 0x0a, -}; - -enum { - CH_SWITCH_BY_NORMAL_TX_RX = 0, - CH_SWITCH_INTERNAL_USED_BY_FW_0 = 1, - CH_SWITCH_INTERNAL_USED_BY_FW_1 = 1, - CH_SWITCH_SCAN = 3, - CH_SWITCH_INTERNAL_USED_BY_FW_3 = 4, - CH_SWITCH_DFS = 5, /* Jelly20150123 */ - CH_SWITCH_BACKGROUND_SCAN_START = 6, - CH_SWITCH_BACKGROUND_SCAN_RUNNING = 7, - CH_SWITCH_BACKGROUND_SCAN_STOP = 8, - CH_SWITCH_SCAN_BYPASS_DPD = 9 -}; - -#ifdef CONFIG_MULTI_CHANNEL -typedef struct GNU_PACKED _EXT_CMD_MCC_START_T { - /* Common setting from DW0~3 */ - /* DW0 */ - UINT16 u2IdleInterval; - UINT8 ucRepeatCnt; - UINT8 ucStartIdx; - - /* DW1 */ - UINT32 u4StartInstant; - - /* DW2,3 */ - UINT16 u2FreePSEPageTh; - UINT8 ucPreSwitchInterval; - UINT8 aucReserved0[0x5]; - - /* BSS0 setting from DW4~7 */ - /* DW4 */ - UINT8 ucWlanIdx0; - UINT8 ucPrimaryChannel0; - UINT8 ucCenterChannel0Seg0; - UINT8 ucCenterChannel0Seg1; - - /* DW5 */ - UINT8 ucBandwidth0; - UINT8 ucTrxStream0; - UINT16 u2StayInterval0; - - /* DW6 */ - UINT8 ucRole0; - UINT8 ucOmIdx0; - UINT8 ucBssIdx0; - UINT8 ucWmmIdx0; - - /* DW7 */ - UINT8 aucReserved1[0x4]; - - /* BSS1 setting from DW8~11 */ - /* DW8 */ - UINT8 ucWlanIdx1; - UINT8 ucPrimaryChannel1; - UINT8 ucCenterChannel1Seg0; - UINT8 ucCenterChannel1Seg1; - - /* DW9 */ - UINT8 ucBandwidth1; - UINT8 ucTrxStream1; - UINT16 u2StayInterval1; - - /* DW10 */ - UINT8 ucRole1; - UINT8 ucOmIdx1; - UINT8 ucBssIdx1; - UINT8 ucWmmIdx1; - - /* DW11 */ - UINT8 aucReserved2[0x4]; -} EXT_CMD_MCC_START_T, *P_EXT_CMD_MCC_START_T; - -typedef struct GNU_PACKED _EXT_CMD_MCC_STOP_T { - /* DW0 */ - UINT8 ucParkIdx; - UINT8 ucAutoResumeMode; - UINT16 u2AutoResumeInterval; - - /* DW1 */ - UINT32 u4AutoResumeInstant; - - /* DW2 */ - UINT16 u2IdleInterval; - UINT8 aucReserved[2]; - - /* DW3 */ - UINT16 u2StayInterval0; - UINT16 u2StayInterval1; -} EXT_CMD_MCC_STOP_T, *P_EXT_CMD_MCC_STOP_T; -#endif /* CONFIG_MULTI_CHANNEL */ - -#ifdef MT_MAC_BTCOEX -/* - * Coex Sub - */ -enum EXT_BTCOEX_SUB { - COEX_SET_PROTECTION_FRAME = 0x1, - COEX_WIFI_STATUS_UPDATE = 0x2, - COEX_UPDATE_BSS_INFO = 0x03, -}; - -/* - * Coex status bit - */ -enum EXT_BTCOEX_STATUS_bit { - COEX_STATUS_RADIO_ON = 0x01, - COEX_STATUS_SCAN_G_BAND = 0x02, - COEX_STATUS_SCAN_A_BAND = 0x04, - COEX_STATUS_LINK_UP = 0x08, - COEX_STATUS_BT_OVER_WIFI = 0x10, -}; - -enum EXT_BTCOEX_PROTECTION_MODE { - COEX_Legacy_CCK = 0x00, - COEX_Legacy_OFDM = 0x01, - COEX_HT_MIX = 0x02, - COEX_HT_Green = 0x03, - COEX_VHT = 0x04, -}; - -enum EXT_BTCOEX_OFDM_PROTECTION_RATE { - PROTECTION_OFDM_6M = 0x00, - PROTECTION_OFDM_9M = 0x01, - PROTECTION_OFDM_12M = 0x02, - PROTECTION_OFDM_18M = 0x03, - PROTECTION_OFDM_24M = 0x04, - PROTECTION_OFDM_36M = 0x05, - PROTECTION_OFDM_48M = 0x06, - PROTECTION_OFDM_54M = 0x07, -}; -/* - * Coex status bit - */ - -typedef enum _WIFI_STATUS { - STATUS_RADIO_ON = 0, - STATUS_RADIO_OFF = 1, - STATUS_SCAN_G_BAND = 2, - STATUS_SCAN_G_BAND_END = 3, - STATUS_SCAN_A_BAND = 4, - STATUS_SCAN_A_BAND_END = 5, - STATUS_LINK_UP = 6, - STATUS_LINK_DOWN = 7, - STATUS_BT_OVER_WIFI = 8, - STATUS_BT_MAX, -} WIFI_STATUS; -#endif -/* - * Extension Event - */ -enum EXT_EVENT_TYPE { - EXT_EVENT_CMD_RESULT = 0x0, - EXT_EVENT_CMD_ID_EFUSE_ACCESS = 0x1, - EXT_EVENT_RF_REG_ACCESS = 0x2, - EXT_EVENT_ID_RF_TEST = 0x4, - EXT_EVENT_ID_PS_SYNC = 0x5, - EXT_EVENT_MULTI_CR_ACCESS = 0x0E, - EXT_EVENT_FW_LOG_2_HOST = 0x13, - EXT_EVENT_BT_COEX = 0x19, - EXT_EVENT_BEACON_LOSS = 0x1A, - EXT_EVENT_ID_GET_TX_POWER = 0x1C, - EXT_EVENT_THERMAL_PROTECT = 0x22, - EXT_EVENT_ID_ASSERT_DUMP = 0x23, - EXT_EVENT_SENSOR_RESULT = 0x2C, - EXT_EVENT_ID_ROAMING_DETECTION_NOTIFICATION = 0x2d, -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - EXT_EVENT_RA_THROUGHPUT_BURST = 0x2F, - EXT_EVENT_GET_TX_STATISTIC = 0x30, -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - EXT_EVENT_PRETBTT_INT = 0x31, - EXT_EVENT_ID_BF_STATUS_READ = 0x35, -#ifdef VOW_SUPPORT - EXT_EVENT_ID_DRR_CTRL = 0x36, - EXT_EVENT_ID_BSSGROUP_CTRL = 0x37, - EXT_EVENT_ID_VOW_FEATURE_CTRL = 0x38, -#endif /* VOW_SUPPORT */ -#ifdef MT_DFS_SUPPORT /* Jelly20141229 */ - EXT_EVENT_ID_RDD_REPORT = 0x3A, - EXT_EVENT_ID_CAC_END = 0x3E, -#endif - EXT_EVENT_ID_MAC_INFO = 0x3C, - EXT_EVENT_ID_ATE_TEST_MODE = 0x3D, -#ifdef VOW_SUPPORT - EXT_EVENT_ID_RX_AIRTIME_CTRL = 0x4a, - EXT_EVENT_ID_AT_PROC_MODULE = 0x4b, -#endif /* VOW_SUPPORT */ - EXT_EVENT_ID_MAX_AMSDU_LENGTH_UPDATE = 0x4c, - EXT_EVENT_ID_EFUSE_FREE_BLOCK = 0x4D, - EXT_EVENT_ID_BA_TRIGGER = 0x4E, - EXT_EVENT_CSA_NOTIFY = 0x4F, -#ifdef WIFI_SPECTRUM_SUPPORT - EXT_EVENT_ID_WIFI_SPECTRUM = 0x50, -#endif /* WIFI_SPECTRUM_SUPPORT */ - EXT_EVENT_TMR_CALCU_INFO = 0x51, - EXT_EVENT_ID_BSS_ACQ_PKT_NUM = 0x52, - EXT_EVENT_ID_TX_POWER_FEATURE_CTRL = 0x58, -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) - EXT_EVENT_ID_TXLPF_CAL_INFO = 0x62, - EXT_EVENT_ID_TXIQ_CAL_INFO = 0x63, - EXT_EVENT_ID_TXDC_CAL_INFO = 0x64, - EXT_EVENT_ID_RXFI_CAL_INFO = 0x65, - EXT_EVENT_ID_RXFD_CAL_INFO = 0x66, -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - EXT_EVENT_G_BAND_256QAM_PROBE_RESULT = 0x6B, -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ -#if defined(RED_SUPPORT) && (defined(MT7622) || defined(P18) || \ - defined(MT7663) || defined(MT7615)) - EXT_EVENT_ID_MPDU_TIME_UPDATE = 0x6F, -#endif -#ifdef CONFIG_HOTSPOT_R2 - EXT_EVENT_ID_INFORM_HOST_REPROCESS_PKT = 0x71, - EXT_EVENT_ID_GET_CR4_HOTSPOT_CAPABILITY = 0x72, -#endif /* CONFIG_HOTSPOT_R2 */ - EXT_EVENT_ID_ACCESS_EFUSE_CHECK = 0x73, - EXT_EVENT_GET_CR4_TX_STATISTICS = 0x74, -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) - EXT_EVENT_ID_GET_WTBL_TX_COUNTER = 0x91, -#endif - -#ifdef IGMP_TVM_SUPPORT - EXT_EVENT_ID_IGMP_MULTICAST_RESP = 0x92, -#endif -#if defined(TXRX_STAT_SUPPORT) || defined(EAP_STATS_SUPPORT) - EXT_EVENT_ID_GET_STA_TX_STAT = 0xA2, -#endif -#ifdef CONFIG_MAP_SUPPORT - EXT_EVENT_ID_GET_TX_RATE = 0xA4, -#endif -}; - -/* - * DownLoad Type - */ -enum { - DownLoadTypeA, - DownLoadTypeB, - DownLoadTypeCONNAC, -#ifdef MT7615 - DownLoadTypeC -#endif /* MT7615 */ -}; - -#ifdef RT_BIG_ENDIAN -typedef union _FW_RXD_0 { - struct { - UINT32 pkt_type_id : 16; - UINT32 length : 16; - } field; - UINT32 word; -} FW_RXD_0; -#else -typedef union _FW_RXD_0 { - struct { - UINT32 length : 16; - UINT32 pkt_type_id : 16; - } field; - UINT32 word; -} FW_RXD_0; -#endif /* RT_BIG_ENDIAN */ - -#ifdef RT_BIG_ENDIAN -typedef union _FW_RXD_1 { - struct { - UINT32 rsv : 16; - UINT32 seq_num : 8; - UINT32 eid : 8; - } field; - UINT32 word; -} FW_RXD_1; -#else -typedef union _FW_RXD_1 { - struct { - UINT32 eid : 8; - UINT32 seq_num : 8; - UINT32 rsv : 16; - } field; - UINT32 word; -} FW_RXD_1; -#endif /* RT_BIG_ENDIAN */ - -#ifdef RT_BIG_ENDIAN -typedef union _FW_RXD_2 { - struct { - UINT32 s2d_index : 8; - UINT32 rsv : 16; - UINT32 ext_eid : 8; - } field; - UINT32 word; -} FW_RXD_2; -#else -typedef union _FW_RXD_2 { - struct { - UINT32 ext_eid : 8; - UINT32 rsv : 16; - UINT32 s2d_index : 8; - } field; - UINT32 word; -} FW_RXD_2; -#endif /* RT_BIG_ENDIAN */ - -/* - * Event structure - */ -typedef struct GNU_PACKED _EVENT_RXD_ { - FW_RXD_0 fw_rxd_0; - FW_RXD_1 fw_rxd_1; - FW_RXD_2 fw_rxd_2; -} EVENT_RXD; - -/* - * Event type table - */ -enum MT_EVENT_TYPE { - MT_TARGET_ADDRESS_LEN_RSP = 0x01, - MT_FW_START_RSP = 0x01, - GENERIC_EVENT = 0x01, - EVENT_ACCESS_REG = 0x02, - MT_PATCH_SEM_RSP = 0x04, - EVENT_CH_PRIVILEGE = 0x18, - EXT_EVENT = 0xED, - MT_RESTART_DL_RSP = 0xEF, -}; - -#define REL_PATCH_SEM 0 -#define GET_PATCH_SEM 1 - -/* - * target address/length request cmd: data mode - * bit(0) : encrypt or not. - * bit(1,2): encrypt key index. - * bit(3) : reset security engine's IV. - * bit(4) : working PDA. 0 for WMCPU, 1 for WACPU. - * bit(31) : need command response - */ -#define MODE_ENABLE_ENCRY (1 << 0) -#define MODE_SET_KEY(p) (((p)&0x03) << 1) -#define MODE_RESET_SEC_IV (1 << 3) -#define MODE_WORKING_PDA_OPTION (1 << 4) -#define MODE_TARGET_ADDR_LEN_NEED_RSP (1 << 31) - -/* - * fw start cmd: override - * bit(0) : override RAM code starting address or not. - * bit(2) : working PDA. 0 for WMCPU, 1 for WACPU. - */ -#define FW_START_OVERRIDE_START_ADDRESS (1 << 0) -#define FW_START_DELAY_CALIBRATION (1 << 1) -#define FW_START_WORKING_PDA_OPTION (1 << 2) -#define FW_START_CRC_CHECK_OFFSET (1 << 3) -#define FW_CHANGE_DECOMPRESSION_TMP_ADDRESS (1 << 4) -/* - * Erro code for target address/length response - */ -enum { - TARGET_ADDRESS_LEN_SUCCESS, -}; - -/* - * Error code for cmd(event) firmware start response - */ -enum { - WIFI_FW_DOWNLOAD_SUCCESS, - WIFI_FW_DOWNLOAD_INVALID_PARAM, - WIFI_FW_DOWNLOAD_INVALID_CRC, - WIFI_FW_DOWNLOAD_DECRYPTION_FAIL, - WIFI_FW_DOWNLOAD_UNKNOWN_CMD, - WIFI_FW_DOWNLOAD_TIMEOUT, -}; - -struct _INIT_CMD_ACCESS_REG { - UINT8 ucSetQuery; - UINT8 aucReserved[3]; - UINT32 u4Address; - UINT32 u4Data; -}; - -#define CMD_CH_PRIV_ACTION_REQ 0 -#define CMD_CH_PRIV_ACTION_ABORT 1 -#define CMD_CH_PRIV_ACTION_BW_REQ 2 - -#define CMD_CH_PRIV_SCO_SCN 0 -#define CMD_CH_PRIV_SCO_SCA 1 -#define CMD_CH_PRIV_SCO_SCB 3 - -#define CMD_CH_PRIV_BAND_G 1 -#define CMD_CH_PRIV_BAND_A 2 - -#define CMD_CH_PRIV_CH_WIDTH_20_40 0 -#define CMD_CH_PRIV_CH_WIDTH_80 1 -#define CMD_CH_PRIV_CH_WIDTH_160 2 -#define CMD_CH_PRIV_CH_WIDTH_80_80 3 - -#define CMD_CH_PRIV_REQ_JOIN 0 -#define CMD_CH_PRIV_REQ_P2P_LISTEN 1 - -typedef struct GNU_PACKED _CMD_SEC_ADDREMOVE_KEY_STRUC_T { - UINT8 ucAddRemove; - UINT8 ucTxKey; - UINT8 ucKeyType; - UINT8 ucIsAuthenticator; - UINT8 aucPeerAddr[6]; - UINT8 ucBssIndex; - UINT8 ucAlgorithmId; - UINT8 ucKeyId; - UINT8 ucKeyLen; - UINT8 ucWlanIndex; - UINT8 ucReverved; - UINT8 aucKeyRsc[16]; - UINT8 aucKeyMaterial[32]; -} CMD_SEC_ADDREMOVE_KEY_STRUC_T, *P_CMD_ADDREMOVE_KEY_STRUC_T; - -typedef struct GNU_PACKED _EVENT_SEC_ADDREMOVE_STRUC_T { - UINT32 u4WlanIdx; - UINT32 u4Status; - UINT32 u4Resv; -} EVENT_SEC_ADDREMOVE_STRUC_T, *P_EVENT_SEC_ADDREMOVE_STRUC_T; - -typedef struct GNU_PACKED _EXT_CMD_AP_PWS_START_T { - UINT32 u4WlanIdx; - UINT32 u4Resv; - UINT32 u4Resv2; -} EXT_CMD_AP_PWS_START_T, *P_EXT_CMD_AP_PWS_START_T; - -typedef struct GNU_PACKED _CMD_AP_PS_CLEAR_STRUC_T { - UINT32 u4WlanIdx; - UINT32 u4Status; - UINT32 u4Resv; -} CMD_AP_PS_CLEAR_STRUC_T, *P_CMD_AP_PS_CLEAR_STRUC_T; - -typedef struct GNU_PACKED _CMD_CH_PRIVILEGE_T { - UINT8 ucBssIndex; - UINT8 ucTokenID; - UINT8 ucAction; - UINT8 ucPrimaryChannel; - UINT8 ucRfSco; - UINT8 ucRfBand; - UINT8 ucRfChannelWidth; /* To support 80/160MHz bandwidth */ - UINT8 ucRfCenterFreqSeg1; /* To support 80/160MHz bandwidth */ - UINT8 ucRfCenterFreqSeg2; /* To support 80/160MHz bandwidth */ - UINT8 ucReqType; - UINT8 aucReserved[2]; - UINT32 u4MaxInterval; /* In unit of ms */ -} CMD_CH_PRIVILEGE_T, *P_CMD_CH_PRIVILEGE_T; - -typedef struct GNU_PACKED _CMD_RF_REG_ACCESS_T { - UINT32 WiFiStream; - UINT32 Address; - UINT32 Data; -} CMD_RF_REG_ACCESS_T; - -typedef struct GNU_PACKED _CMD_ACCESS_REG_T { - UINT32 u4Address; - UINT32 u4Data; -} CMD_ACCESS_REG_T; - -/* test CR4 */ -typedef struct GNU_PACKED _EXT_CMD_CR4_QUERY_T { - UINT32 u4Cr4QueryOptionArg0; - UINT32 u4Cr4QueryOptionArg1; - UINT32 u4Cr4QueryOptionArg2; -} EXT_CMD_CR4_QUERY_T, *P_EXT_CMD_CR4_QUERY_T; - -typedef struct GNU_PACKED _EXT_CMD_CR4_SET_T { - UINT32 u4Cr4SetArg0; - UINT32 u4Cr4SetArg1; - UINT32 u4Cr4SetArg2; -} EXT_CMD_CR4_SET_T, *P_EXT_CMD_CR4_SET_T; - -typedef struct GNU_PACKED _EXT_CMD_CR4_CAPABILITY_T { - UINT32 u4Cr4Capability; -} EXT_CMD_CR4_CAPABILITY_T, *P_EXT_CMD_CR4_CAPABILITY_T; - -typedef struct GNU_PACKED _EXT_CMD_CR4_DEBUG_T { - UINT32 u4Cr4Debug; -} EXT_CMD_CR4_DEBUG_T, *P_EXT_CMD_CR4_DEBUG_T; - -typedef struct GNU_PACKED _EXT_CMD_ID_LED { - UINT32 u4LedNo; - UINT32 u4LedCtrl; -} EXT_CMD_ID_LED_T, *PEXT_CMD_ID_LED_T; - -typedef struct GNU_PACKED _EVENT_WIFI_RDD_TEST_T { - UINT32 u4FuncIndex; - UINT32 u4FuncLength; - UINT32 u4Prefix; - UINT32 u4Count; - UINT8 ucRddIdx; - UINT8 aucReserve[3]; - UINT8 aucBuffer[0]; -} EVENT_WIFI_RDD_TEST_T, *PEVENT_WIFI_RDD_TEST_T; - -#define WIFI_RADIO_ON 1 -#define WIFI_RADIO_OFF 2 -typedef struct GNU_PACKED _EXT_CMD_RADIO_ON_OFF_CTRL_T { - UINT8 ucWiFiRadioCtrl; - UINT8 aucReserve[3]; -} EXT_CMD_RADIO_ON_OFF_CTRL_T; - -#if defined(MT_MAC) && (!defined(MT7636)) -typedef struct GNU_PACKED _EXT_CMD_TXBf_APCLIENT_CLUSTER_T { - UINT8 ucPfmuProfileFormatId; - UINT8 ucReserved; - UINT8 ucWlanIdx; - UINT8 ucCmmWlanId; -} EXT_CMD_TXBf_APCLIENT_CLUSTER_T, *P_EXT_CMD_TXBf_APCLIENT_CLUSTER_T; - -typedef struct GNU_PACKED _EXT_CMD_REPT_CLONED_STA_BF_T { - UINT8 ucCmdCategoryID; - UINT8 ucReserved; - UINT8 ucWlanIdx; - UINT8 ucCliIdx; -} EXT_CMD_REPT_CLONED_STA_BF_T, *P_EXT_CMD_REPT_CLONED_STA_BF_T; - -typedef struct GNU_PACKED _EXT_CMD_TXBf_BFEE_CTRL_T { - UINT8 ucCmdCategoryID; - BOOLEAN fgBFeeNullPktFeedbackEn; - UINT8 ucReserved[2]; -} EXT_CMD_TXBf_BFEE_CTRL_T, *P_EXT_CMD_TXBf_BFEE_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_ITXBf_PHASE_CAL_CTRL_T { - UINT8 ucCmdCategoryID; - UINT8 ucGroup_L_M_H; - UINT8 ucGroup; - BOOLEAN fgSX2; - UINT8 ucPhaseCalType; - UINT8 ucPhaseVerifyLnaGainLevel; - UINT8 ucReserved[2]; -} EXT_CMD_ITXBf_PHASE_CAL_CTRL_T, *P_EXT_CMD_ITXBf_PHASE_CAL_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_ITXBf_PHASE_COMP_CTRL_T { - UINT8 ucCmdCategoryID; - UINT8 ucWlanIdx; - UINT8 ucBW; - UINT8 ucBand; - UINT8 ucDbdcBandIdx; - BOOLEAN fgRdFromE2p; - BOOLEAN fgDisComp; - UINT8 ucReserved; - UINT8 aucBuf[32]; -} EXT_CMD_ITXBf_PHASE_COMP_CTRL_T, *P_EXT_CMD_ITXBf_PHASE_COMP_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_TXBf_TX_APPLY_CTRL_T { - UINT8 ucCmdCategoryID; - UINT8 ucWlanIdx; - BOOLEAN fgETxBf; - BOOLEAN fgITxBf; - BOOLEAN fgMuTxBf; - BOOLEAN fgPhaseCali; - UINT8 ucReserved[2]; -} EXT_CMD_TXBf_TX_APPLY_CTRL_T, *P_EXT_CMD_TXBf_TX_APPLY_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_SND_PERIODIC_TRIGGER_CTRL_T { - UINT8 ucCmdCategoryID; - UINT8 ucSuMuSndMode; - UINT8 ucStaNum; - UINT8 ucReserved; - UINT8 ucWlanIdx[4]; - UINT32 u4SoundingInterval; /* By ms */ -} EXT_CMD_ETXBf_SND_PERIODIC_TRIGGER_CTRL_T, - *P_EXT_CMD_ETXBf_SND_PERIODIC_TRIGGER_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_MU_SND_PERIODIC_TRIGGER_CTRL_T { - UINT8 ucCmdCategoryID; - UINT8 ucSuMuSndMode; - UINT8 ucStaNum; - UINT8 ucReserved; - UINT8 ucWlanIdx[4]; - UINT32 u4SoundingInterval; /* By ms */ -} EXT_CMD_ETXBf_MU_SND_PERIODIC_TRIGGER_CTRL_T, - *P_EXT_CMD_ETXBf_MU_SND_PERIODIC_TRIGGER_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_BF_TX_PWR_BACK_OFF_T { - UINT8 ucCmdCategoryID; - UINT8 ucBandIdx; - UINT8 aucReserved1[2]; - INT8 acTxPwrFccBfOnCase[10]; - UINT8 aucReserved2[2]; - INT8 acTxPwrFccBfOffCase[10]; - UINT8 aucReserved3[2]; -} EXT_CMD_BF_TX_PWR_BACK_OFF_T, *P_EXT_CMD_BF_TX_PWR_BACK_OFF_T; - -typedef struct GNU_PACKED _EXT_CMD_BF_AWARE_CTRL_T { - UINT8 ucCmdCategoryID; - BOOLEAN fgBfAwareCtrl; - UINT8 aucReserved[2]; -} EXT_CMD_BF_AWARE_CTRL_T, *P_EXT_CMD_BF_AWARE_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_BFEE_HW_CTRL_T { - UINT8 ucCmdCategoryID; - BOOLEAN fgBfeeHwCtrl; - UINT8 aucReserved[2]; -} EXT_CMD_BFEE_HW_CTRL_T, *P_EXT_CMD_BFEE_HW_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_BF_HW_ENABLE_STATUS_UPDATE_T { - UINT8 ucCmdCategoryID; - BOOLEAN fgEBfHwEnStatus; - BOOLEAN fgIBfHwEnStatus; - UINT8 ucReserved; -} EXT_CMD_BF_HW_ENABLE_STATUS_UPDATE_T, *P_EXT_CMD_BF_HW_ENABLE_STATUS_UPDATE_T; - -typedef struct GNU_PACKED _EXT_CMD_BF_MOD_EN_CTRL_T { - UINT8 u1CmdCategoryID; - UINT8 u1BfNum; - UINT8 u1BfBitmap; - UINT8 au1BFSel[8]; - UINT8 au1Reserved[5]; -} EXT_CMD_BF_MOD_EN_CTRL_T, *P_EXT_CMD_BF_MOD_EN_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_PFMU_PROFILE_TAG_R_T { - UINT8 ucPfmuProfileFormatId; - UINT8 ucPfmuIdx; - UINT8 fgBFer; - UINT8 ucReserved[1]; -} EXT_CMD_ETXBf_PFMU_PROFILE_TAG_R_T, *P_EXT_CMD_ETXBf_PFMU_PROFILE_TAG_R_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_PFMU_PROFILE_TAG_W_T { - UINT8 ucPfmuProfileFormatId; - UINT8 ucPfmuIdx; - UINT8 ucReserved[2]; - UINT8 ucBuf[64]; -} EXT_CMD_ETXBf_PFMU_PROFILE_TAG_W_T, *P_EXT_CMD_ETXBf_PFMU_PROFILE_TAG_W_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_PFMU_PROFILE_DATA_R_T { - UINT8 ucPfmuProfileFormatId; - UINT8 ucPfmuIdx; - BOOLEAN fgBFer; - UINT8 ucReserved[3]; - UINT16 u2SubCarrIdx; -} EXT_CMD_ETXBf_PFMU_PROFILE_DATA_R_T, *P_EXT_CMD_ETXBf_PFMU_PROFILE_DATA_R_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_T { - UINT8 ucPfmuProfileFormatId; - UINT8 ucPfmuIdx; - UINT16 u2SubCarr; - UINT8 ucBuf[20]; -} EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_T, *P_EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_20M_ALL_T { - UINT8 ucPfmuProfileFormatId; - UINT8 ucPfmuIdx; - UINT8 aucReserved[2]; - UINT8 ucBuf[512]; -} EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_20M_ALL_T, - *P_EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_20M_ALL_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_PFMU_PROFILE_PN_R_T { - UINT8 ucPfmuProfileFormatId; - UINT8 ucPfmuIdx; - UINT8 ucReserved[2]; -} EXT_CMD_ETXBf_PFMU_PROFILE_PN_R_T, *P_EXT_CMD_ETXBf_PFMU_PROFILE_PN_R_T; - -typedef struct GNU_PACKED _EXT_CMD_ETXBf_PFMU_PROFILE_PN_W_T { - UINT8 ucPfmuProfileFormatId; - UINT8 ucPfmuIdx; - UINT8 ucBW; - UINT8 ucReserved; - UINT8 ucBuf[32]; -} EXT_CMD_ETXBf_PFMU_PROFILE_PN_W_T, *P_EXT_CMD_ETXBf_PFMU_PROFILE_PN_W_T; - -typedef struct GNU_PACKED _EXT_CMD_TXBf_QD_R_T { - UINT8 ucCmdCategoryID; - INT8 cSubCarr; - UINT8 ucReserved[2]; -} EXT_CMD_TXBf_QD_R_T, *P_EXT_CMD_TXBf_QD_R_T; - -typedef struct GNU_PACKED _EXT_EVENT_BF_STATUS_T { - UINT8 ucBfDataFormatID; - UINT8 ucBw; - UINT16 u2subCarrIdx; - BOOLEAN fgBFer; - UINT8 aucReserved[3]; - UINT8 aucBuffer[1000]; /* temparary size */ -} EXT_EVENT_BF_STATUS_T, *P_EXT_EVENT_BF_STATUS_T; - -typedef struct GNU_PACKED _EXT_EVENT_IBF_STATUS_T { - UINT8 ucBfDataFormatID; - UINT8 ucGroup_L_M_H; - UINT8 ucGroup; - BOOLEAN fgSX2; - UINT8 ucStatus; - UINT8 ucPhaseCalType; - UINT8 aucReserved[2]; - UINT8 aucBuffer[1000]; /* temparary size */ -} EXT_EVENT_IBF_STATUS_T, *P_EXT_EVENT_IBF_STATUS_T; - -typedef enum _BF_EVENT_CATEGORY { - BF_PFMU_TAG = 0x10, - BF_PFMU_DATA, - BF_PFMU_PN, - BF_PFMU_MEM_ALLOC_MAP, - BF_STAREC, - BF_CAL_PHASE, - BF_QD_DATA -} BF_EVENT_CATEGORY; - -#endif /* MT_MAC */ - -/* EXT_CMD_RF_TEST */ -/* ACTION */ -#define ACTION_SWITCH_TO_RFTEST \ - 0 /* to switch firmware mode between normal mode or rf test mode */ -#define ACTION_IN_RFTEST 1 -/* OPMODE */ -#define OPERATION_NORMAL_MODE 0 -#define OPERATION_RFTEST_MODE 1 -#define OPERATION_ICAP_MODE 2 -#define OPERATION_ICAP_OVERLAP 3 -#define OPERATION_WIFI_SPECTRUM 4 - -/* FuncIndex */ -typedef enum { - RE_CALIBRATION = 0x01, - CALIBRATION_BYPASS = 0x02, - TX_TONE_START = 0x03, - TX_TONE_STOP = 0x04, - CONTINUOUS_TX_START = 0x05, - CONTINUOUS_TX_STOP = 0x06, - RF_AT_EXT_FUNCID_TX_TONE_RF_GAIN = 0x07, - RF_AT_EXT_FUNCID_TX_TONE_DIGITAL_GAIN = 0x08, - CAL_RESULT_DUMP_FLAG = 0x09, - RDD_TEST_MODE = 0x0A, - SET_ICAP_CAPTURE_START = 0x0B, - GET_ICAP_CAPTURE_STATUS = 0x0C, - SET_ADC = 0x0D, - SET_RX_GAIN = 0x0E, - SET_TTG = 0x0F, - TTG_ON_OFF = 0x10, - GET_ICAP_RAW_DATA = 0x11 -} FUNC_IDX; - -#define RF_TEST_DEFAULT_RESP_LEN 8 /* sizeof(struct _EVENT_EXT_CMD_RESULT_T) */ -#define RC_CAL_RESP_LEN 112 -#define RX_RSSI_DCOC_CAL_RESP_LEN 304 -#define RX_DCOC_CAL_RESP_LEN 816 /* Total 4 event 808 *4 */ -#define TX_DPD_RX_FI_FD_MPM_RESP_LEN 8 /* MT7615 not support */ -#define TX_DPD_SCAN_HPM_RESP_LEN 8 /* MT7615 not support */ -#define RX_FIIQ_CAL_RESP_LEN 208 -#define RX_FDIQ_CAL_RESP_LEN 416 /* Total 408*6 */ -#define TX_DPD_LINK_RESP_LEN 272 /* Total 264*6 */ -#define TX_LPFG_RESP_LEN 64 -#define TX_DCIQ_RESP_LEN 592 -#define TX_IQM_RESP_LEN 112 -#define TX_PGA_RESP_LEN 112 -#define CAL_ALL_LEN 8712 -#define RF_TEST_ICAP_LEN 120 -/* Cal Items */ -typedef enum { - RC_CAL = 0x1, - RX_RSSI_DCOC_CAL = 0x2, - RX_DCOC_CAL = 0x4, - TX_DPD_RX_FI_FD_MPM = 0x8, - TX_DPD_SCAN_HPM = 0x10, - RX_FIIQ_CAL = 0x20, - RX_FDIQ_CAL = 0x40, - TX_DPD_LINK = 0x80, - TX_LPFG = 0x100, - TX_DCIQC = 0x200, - TX_IQM = 0x400, - TX_PGA = 0x800, - CAL_ALL = 0x80000000, -} CAL_ITEM_IDX; - -/*u4CalDump*/ -typedef enum { DISABLE_DUMP = 0x0, ENABLE_DUMP = 0x1 } TEST_CAL_DUMP; - -typedef struct _TX_TONE_PARAM_T { - UINT8 ucAntIndex; - UINT8 ucToneType; - UINT8 ucToneFreq; - UINT8 ucDbdcIdx; - INT32 i4DcOffsetI; - INT32 i4DcOffsetQ; - UINT32 u4Band; -} TX_TONE_PARAM_T, *PTX_TONE_PARAM_T; - -typedef struct GNU_PACKED _EXT_CMD_RDD_ON_OFF_CTRL_T { /* Jelly20150211 */ - UINT8 ucDfsCtrl; - UINT8 ucRddIdx; - UINT8 ucRddRxSel; - UINT8 ucSetVal; - UINT8 aucReserved[4]; -} EXT_CMD_RDD_ON_OFF_CTRL_T, *P_EXT_CMD_RDD_ON_OFF_CTRL_T; - -typedef struct _SET_ADC_T { - UINT32 u4ChannelFreq; - UINT8 ucAntIndex; - UINT8 ucBW; - UINT8 ucSX; - UINT8 ucDbdcIdx; - UINT8 ucRunType; - UINT8 ucFType; - UINT8 aucReserved[2]; /* Reserving For future */ -} SET_ADC_T, *P_SET_ADC_T; - -typedef struct _SET_RX_GAIN_T { - UINT8 ucLPFG; - UINT8 ucLNA; - UINT8 ucDbdcIdx; - UINT8 ucAntIndex; -} SET_RX_GAIN_T, *P_EXT_SET_RX_GAIN_T; - -typedef struct _SET_TTG_T { - UINT32 u4ChannelFreq; - UINT32 u4ToneFreq; - UINT8 ucTTGPwrIdx; - UINT8 ucDbdcIdx; - UINT8 ucXtalFreq; - UINT8 aucReserved[1]; -} SET_TTG_T, *P_SET_TTG_T; - -typedef struct _TTG_ON_OFF_T { - UINT8 ucTTGEnable; - UINT8 ucDbdcIdx; - UINT8 ucAntIndex; - UINT8 aucReserved[1]; -} TTG_ON_OFF_T, *P_TTG_ON_OFF_T; - -typedef struct _CONTINUOUS_TX_PARAM_T { - UINT8 ucCtrlCh; - UINT8 ucCentralCh; - UINT8 ucBW; - UINT8 ucAntIndex; - UINT16 u2RateCode; - UINT8 ucBand; - UINT8 ucTxfdMode; -} CONTINUOUS_TX_PARAM_T, *P_CONTINUOUS_TX_PARAM_T; - -typedef struct _TX_TONE_POWER_GAIN_T { - UINT8 ucAntIndex; - UINT8 ucTonePowerGain; - UINT8 ucBand; - UINT8 aucReserved[1]; -} TX_TONE_POWER_GAIN_T, *P_TX_TONE_POWER_GAIN_T; - -/* -u4FuncIndex 0x01: RE_CALIBRATION - 0x02: CALIBRATION_BYPASS - 0x03: TX_TONE_START - 0x04: TX_TONE_STOP - 0x05: CONTINUOUS_TX_START - 0x06: CONTINUOUS_TX_STOP - 0x07. RF_AT_EXT_FUNCID_TX_TONE_RF_GAIN - 0x08. RF_AT_EXT_FUNCID_TX_TONE_DIGITAL_GAIN - 0x09: CAL_RESULT_DUMP_FLAG - 0x0A: RDD_TEST_MODE -u4FuncData: - works when u4FuncIndex = 1 or 2 or 0xA -u4CalDump: - works when u4FuncIndex = 9 -TX_TONE_PARAM_T: - works when u4FuncIndex = 3 -CONTINUOUS_TX_PARAM_T: - works when u4FuncIndex = 5 -TX_TONE_POWER_GAIN_T: - works when u4FuncIndex = 7 or 8 - -*/ -typedef struct _RF_TEST_CALIBRATION_T { - UINT32 u4FuncData; - UINT8 ucDbdcIdx; - UINT8 aucReserved[3]; -} RF_TEST_CALIBRATION_T, *P_RF_TEST_CALIBRATION_T; - -typedef struct _PARAM_MTK_WIFI_TEST_STRUC_T { - UINT32 u4FuncIndex; - union { - UINT32 u4FuncData; - UINT32 u4CalDump; - RF_TEST_CALIBRATION_T rCalParam; - TX_TONE_PARAM_T rTxToneParam; - CONTINUOUS_TX_PARAM_T rConTxParam; - TX_TONE_POWER_GAIN_T rTxToneGainParam; -#ifdef INTERNAL_CAPTURE_SUPPORT - RBIST_CAP_START_T rICapInfo; - RBIST_DUMP_RAW_DATA_T rICapDump; -#endif /*INTERNAL_CAPTURE_SUPPORT*/ - EXT_CMD_RDD_ON_OFF_CTRL_T rRDDParam; - SET_ADC_T rSetADC; - SET_RX_GAIN_T rSetRxGain; - SET_TTG_T rSetTTG; - TTG_ON_OFF_T rTTGOnOff; - } Data; -} PARAM_MTK_WIFI_TEST_STRUC_T, *P_PARAM_MTK_WIFI_TEST_STRUC_T; - -typedef struct _CMD_TEST_CTRL_T { - UINT8 ucAction; - UINT8 ucIcapLen; - UINT8 aucReserved[2]; - union { - UINT32 u4OpMode; - UINT32 u4ChannelFreq; - PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo; - } u; -} CMD_TEST_CTRL_T, *P_CMD_TEST_CTRL_T; - -typedef struct _EXT_EVENT_RF_TEST_RESULT_T { - UINT32 u4FuncIndex; - UINT32 u4PayloadLength; - UINT8 aucEvent[0]; -} EXT_EVENT_RF_TEST_RESULT_T, *PEXT_EVENT_RF_TEST_RESULT_T; - -typedef struct _EXT_EVENT_RF_TEST_DATA_T { - UINT32 u4CalIndex; - UINT32 u4CalType; - UINT8 aucData[0]; -} EXT_EVENT_RF_TEST_DATA_T, *PEXT_EVENT_RF_TEST_DATA_T; - -#define WIFI_RX_DISABLE 1 -typedef struct GNU_PACKED _EXT_CMD_WIFI_RX_DISABLE_T { - UINT8 ucWiFiRxDisableCtrl; - UINT8 aucReserve[3]; -} EXT_CMD_WIFI_RX_DISABLE_T; - -#define PHY_SHAPING_FILTER_DISABLE 1 -typedef struct GNU_PACKED _EXT_CMD_PHY_SHAPING_FILTER_DISABLE_T { - UINT8 ucPhyShapingFilterDisable; - UINT8 aucReserve[3]; -} EXT_CMD_PHY_SHAPING_FILTER_DISABLE_T; - -/* Power Management Level */ -#define PM2 2 -#define PM4 4 -#define PM5 5 -#define PM6 6 -#define PM7 7 -#define ENTER_PM_STATE 1 -#define EXIT_PM_STATE 2 - -#define KEEP_ALIVE_INTERVAL_IN_SEC 10 /* uint: sec */ -/* Beacon lost timing */ -#define BEACON_OFFLOAD_LOST_TIME 30 /* unit: beacon --> 30 beacons about 3sec */ - -typedef struct GNU_PACKED _EXT_CMD_PM_STATE_CTRL_T { - UINT8 ucPmNumber; - UINT8 ucPmState; - UINT8 aucBssid[6]; - UINT8 ucDtimPeriod; - UINT8 ucWlanIdx; - UINT16 u2BcnInterval; - UINT32 u4Aid; - UINT32 u4RxFilter; - UINT8 ucDbdcIdx; - UINT8 aucReserve0[3]; - UINT32 u4Feature; - UINT8 ucOwnMacIdx; - UINT8 ucWmmIdx; - UINT8 ucBcnLossCount; - UINT8 ucBcnSpDuration; -} EXT_CMD_PM_STATE_CTRL_T, *P_EXT_CMD_PM_STATE_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_GREENAP_CTRL_T { - UINT8 ucDbdcIdx; - BOOLEAN ucGreenAPOn; - UINT8 aucReserve[2]; -} EXT_CMD_GREENAP_CTRL_T, *P_EXT_GREENAP_CTRL_T; - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -typedef struct GNU_PACKED _EXT_CMD_PCIE_ASPM_DYM_CTRL_T { - UINT8 ucDbdcIdx; - BOOLEAN fgL1Enable; - BOOLEAN fgL0sEnable; - UINT8 ucReserve; -} EXT_CMD_PCIE_ASPM_DYM_CTRL_T, *P_EXT_PCIE_ASPM_DYM_CTRL_T; -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -#define BITS2(m, n) (BIT(m) | BIT(n)) -#define BITS3(m, n, o) (BIT(m) | BIT(n) | BIT(o)) -#define BITS4(m, n, o, p) (BIT(m) | BIT(n) | BIT(o) | BIT(p)) -#define BITS(m, n) (~(BIT(m) - 1) & ((BIT(n) - 1) | BIT(n))) - -/* Station role */ -#define STA_TYPE_STA BIT(0) -#define STA_TYPE_AP BIT(1) -#define STA_TYPE_ADHOC BIT(2) -#define STA_TYPE_TDLS BIT(3) -#define STA_TYPE_WDS BIT(4) -#define STA_TYPE_BC BIT(5) - -/* Network type */ -#define NETWORK_INFRA BIT(16) -#define NETWORK_P2P BIT(17) -#define NETWORK_IBSS BIT(18) -#define NETWORK_MESH BIT(19) -#define NETWORK_BOW BIT(20) -#define NETWORK_WDS BIT(21) - -/* Connection type */ -#define CONNECTION_INFRA_STA (STA_TYPE_STA | NETWORK_INFRA) -#define CONNECTION_INFRA_AP (STA_TYPE_AP | NETWORK_INFRA) -#define CONNECTION_P2P_GC (STA_TYPE_STA | NETWORK_P2P) -#define CONNECTION_P2P_GO (STA_TYPE_AP | NETWORK_P2P) -#define CONNECTION_MESH_STA (STA_TYPE_STA | NETWORK_MESH) -#define CONNECTION_MESH_AP (STA_TYPE_AP | NETWORK_MESH) -#define CONNECTION_IBSS_ADHOC (STA_TYPE_ADHOC | NETWORK_IBSS) -#define CONNECTION_TDLS (STA_TYPE_STA | NETWORK_INFRA | STA_TYPE_TDLS) -#define CONNECTION_WDS (STA_TYPE_WDS | NETWORK_WDS) -#define CONNECTION_INFRA_BC (STA_TYPE_BC | NETWORK_INFRA) - -#define MAX_BUF_SIZE_OF_DEVICEINFO \ - (sizeof(CMD_DEVINFO_UPDATE_T) + sizeof(CMD_DEVINFO_ACTIVE_T)) - -enum { - DEVINFO_ACTIVE = 0, - DEVINFO_MAX_NUM = 1, -}; - -typedef struct _CMD_HIF_LOOPBACK { - UINT32 Loopback_Enable : 16; - UINT32 DestinationQid : 16; -} CMD_HIF_LOOPBACK, *PCMD_HIF_LOOPBACK; - -enum { - DEVINFO_ACTIVE_FEATURE = (1 << DEVINFO_ACTIVE), - DEVINFO_MAX_NUM_FEATURE = (1 << DEVINFO_MAX_NUM) -}; - -enum { - HIF_CTRL_ID_RESERVED = 0, - HIF_CTRL_ID_HIF_USB_TX_RX_IDLE = 1, -}; - -typedef struct GNU_PACKED _EXT_CMD_WIFI_HIF_CTRL_T { - UINT8 ucHifCtrlId; - UINT8 ucDbdcIdx; - UINT8 aucReserved[6]; -} EXT_CMD_WIFI_HIF_CTRL_T, *P_EXT_CMD_WIFI_HIF_CTRL_T; - -typedef struct GNU_PACKED _CMD_DEVINFO_UPDATE_T { - UINT8 ucOwnMacIdx; - UINT8 ucReserve; - UINT16 u2TotalElementNum; - UINT8 ucAppendCmdTLV; - UINT8 aucReserve[3]; - UINT8 aucBuffer[]; -} CMD_DEVINFO_UPDATE_T, *P_CMD_DEVINFO_UPDATE_T; - -typedef struct GNU_PACKED _CMD_DEVINFO_ACTIVE_T { - /* Device information (Tag0) */ - UINT16 u2Tag; /* Tag = 0x00 */ - UINT16 u2Length; - UINT8 ucActive; - UINT8 ucDbdcIdx; - UINT8 aucOwnMAC[6]; -} CMD_DEVINFO_ACTIVE_T, *P_CMD_DEVINFO_ACTIVE_T; - -typedef struct GNU_PACKED _CMD_DEVINFO_BSSIDX_T { - /* Dev information (Tag1) */ - UINT16 u2Tag; /* Tag = 0x01 */ - UINT16 u2Length; - UINT8 ucBSSIndex; - UINT8 aucReserve[3]; - UINT32 ucDevConnectionType; -} CMD_DEVINFO_BSSIDX_T, *P_CMD_BSSINFO_BSSIDX_T; - -#define ORI_BA 1 -#define RCV_BA 2 - -enum { - STA_REC_BASIC_STA_RECORD = 0, - STA_REC_RA = 1, - STA_REC_RA_COMMON_INFO = 2, - STA_REC_RA_UPDATE = 3, - STA_REC_BF = 4, - STA_REC_AMSDU = 5, - STA_REC_BA = 6, - STA_REC_RED = 7, - STA_REC_TX_PROC = 8, - STA_REC_BASIC_HT_INFO = 9, - STA_REC_BASIC_VHT_INFO = 10, - STA_REC_AP_PS = 11, - STA_REC_INSTALL_KEY = 12, - STA_REC_WTBL = 13, -#ifdef HW_TX_AMSDU_SUPPORT - STA_REC_HW_AMSDU = 0xf, -#endif - STA_REC_MAX_NUM -}; - -enum { - STA_REC_BASIC_STA_RECORD_FEATURE = (1 << STA_REC_BASIC_STA_RECORD), - STA_REC_RA_FEATURE = (1 << STA_REC_RA), - STA_REC_RA_COMMON_INFO_FEATURE = (1 << STA_REC_RA_COMMON_INFO), - STA_REC_RA_UPDATE_FEATURE = (1 << STA_REC_RA_UPDATE), - STA_REC_BF_FEATURE = (1 << STA_REC_BF), - STA_REC_AMSDU_FEATURE = (1 << STA_REC_AMSDU), - STA_REC_BA_FEATURE = (1 << STA_REC_BA), - STA_REC_RED_FEATURE = (1 << STA_REC_RED), - STA_REC_TX_PROC_FEATURE = (1 << STA_REC_TX_PROC), - STA_REC_BASIC_HT_INFO_FEATURE = (1 << STA_REC_BASIC_HT_INFO), - STA_REC_BASIC_VHT_INFO_FEATURE = (1 << STA_REC_BASIC_VHT_INFO), - STA_REC_AP_PS_FEATURE = (1 << STA_REC_AP_PS), - STA_REC_INSTALL_KEY_FEATURE = (1 << STA_REC_INSTALL_KEY), - STA_REC_WTBL_FEATURE = (1 << STA_REC_WTBL), -#ifdef HW_TX_AMSDU_SUPPORT - STA_REC_HW_AMSDU_FEATURE = (1 << STA_REC_HW_AMSDU), -#endif - STA_REC_MAX_NUM_FEATURE = (1 << STA_REC_MAX_NUM) -}; - -typedef struct _STAREC_HANDLE_T { - UINT32 StaRecTag; - UINT32 StaRecTagLen; - INT32(*StaRecTagHandler) - (struct _RTMP_ADAPTER *pAd, struct cmd_msg *msg, VOID *args); -} STAREC_HANDLE_T, *P_STAREC_HANDLE_T; - -typedef struct GNU_PACKED _CMD_STAREC_UPDATE_T { - UINT8 ucBssIndex; - UINT8 ucWlanIdx; - UINT16 u2TotalElementNum; - UINT8 ucAppendCmdTLV; - UINT8 ucMuarIdx; - UINT8 aucReserve[2]; - UINT8 aucBuffer[]; -} CMD_STAREC_UPDATE_T, *P_CMD_STAREC_UPDATE_T; - -typedef struct GNU_PACKED _CMD_STAREC_HT_INFO_T { - UINT16 u2Tag; - UINT16 u2Length; - UINT16 u2HtCap; - UINT16 u2Reserved; -} CMD_STAREC_HT_INFO_T, *P_CMD_STAREC_HT_INFO_T; - -typedef struct GNU_PACKED _CMD_STAREC_VHT_INFO_T { - UINT16 u2Tag; - UINT16 u2Length; - UINT32 u4VhtCap; - UINT16 u2VhtRxMcsMap; - UINT16 u2VhtTxMcsMap; -} CMD_STAREC_VHT_INFO_T, *P_CMD_STAREC_VHT_INFO_T; - -#define STAREC_COMMON_EXTRAINFO_V2 BIT(0) -#define STAREC_COMMON_EXTRAINFO_NEWSTAREC BIT(1) - -typedef struct GNU_PACKED _STAREC_COMMON_T { - /* Basic STA record (Group0) */ - UINT16 u2Tag; /* Tag = 0x00 */ - UINT16 u2Length; - UINT32 u4ConnectionType; - UINT8 ucConnectionState; - UINT8 ucIsQBSS; - UINT16 u2AID; - UINT8 aucPeerMacAddr[6]; - /*This is used especially for 7615 to indicate this STAREC is to create new one or simply update - In some case host may send new STAREC without delete old STAREC in advance. (ex: lost de-auth or get assoc twice) - We need extra info to know if this is a brand new STAREC or not - Consider backward compatibility, we check bit 0 in this reserve. - Only the bit 0 is on, N9 go new way to update STAREC if bit 1 is on too. - If neither bit match, N9 go orinal way to update STAREC. */ - UINT16 u2ExtraInfo; - -} CMD_STAREC_COMMON_T, *P_CMD_STAREC_COMMON_T; - -#define STATE_DISCONNECT 0 -#define STATE_CONNECTED 1 -#define STATE_PORT_SECURE 2 - -typedef struct GNU_PACKED _STAREC_AMSDU_T { - UINT16 u2Tag; /* Tag = 0x05 */ - UINT16 u2Length; - UINT8 ucMaxAmsduNum; - UINT8 ucMaxMpduSize; - UINT8 ucAmsduEnable; - UINT8 acuReserve[1]; -} CMD_STAREC_AMSDU_T, *P_CMD_STAREC_AMSDU_T; - -typedef struct GNU_PACKED _STAREC_BA_T { - UINT16 u2Tag; /* Tag = 0x06 */ - UINT16 u2Length; - UINT8 ucTid; - UINT8 ucBaDirection; - UINT8 ucAmsduCap; - UINT8 ucBaEenable; - UINT16 u2BaStartSeq; - UINT16 u2BaWinSize; -} CMD_STAREC_BA_T, *P_CMD_STAREC_BA_T; - -typedef struct GNU_PACKED _STAREC_RED_T { - UINT16 u2Tag; /* Tag = 0x07 */ - UINT16 u2Length; - UINT32 u4RED[8]; -} CMD_STAREC_RED_T, *P_CMD_STAREC_RED_T; - -typedef struct GNU_PACKED _STAREC_TX_PROC_T { - UINT16 u2Tag; /* Tag = 0x08 */ - UINT16 u2Length; - UINT32 u4TxProcFlag; -} CMD_STAREC_TX_PROC_T, *P_CMD_STAREC_TX_PROC_T; - -typedef struct GNU_PACKED _STAREC_PS_T { - UINT16 u2Tag; /* Tag = 11 */ - UINT16 u2Length; - UINT8 ucStaBmpDeliveryAC; - UINT8 ucStaBmpTriggerAC; - UINT8 ucStaMaxSPLength; - UINT8 ucReserve1[1]; - UINT16 u2StaListenInterval; - UINT8 ucReserve2[2]; -} CMD_STAREC_PS_T, *P_CMD_STAREC_PS_T; - -#define RVLAN BIT(0); -#define IPCSO BIT(1); -#define TCPUDPCSO BIT(2); -#define TX_PROC_ACM_CFG_EN BIT(3); -#define TX_PROC_ACM_CFG_BK BIT(4); -#define TX_PROC_ACM_CFG_BE BIT(5); -#define TX_PROC_ACM_CFG_VI BIT(6); -#define TX_PROC_ACM_CFG_VO BIT(7); - -#define MAX_BUF_SIZE_OF_BSS_INFO \ - (sizeof(CMD_BSSINFO_UPDATE_T) + \ - sizeof(CMD_BSSINFO_CONNECT_OWN_DEV_T) + sizeof(CMD_BSSINFO_BASIC_T) + \ - sizeof(CMD_BSSINFO_RF_CH_T) + sizeof(CMD_BSSINFO_PM_T) + \ - sizeof(CMD_BSSINFO_UAPSD_T) + sizeof(CMD_BSSINFO_RSSI_RM_DET_T) + \ - sizeof(CMD_BSSINFO_EXT_BSS_INFO_T) + \ - sizeof(CMD_BSSINFO_AUTO_RATE_CFG_T)) -/* Carter, not finish yet. + \ -sizeof(CMD_BSSINFO_SYNC_MODE_CTRL_T))*/ - -enum { - BSS_INFO_OWN_MAC = 0, - BSS_INFO_BASIC = 1, - BSS_INFO_RF_CH = 2, - BSS_INFO_PM = 3, - BSS_INFO_UAPSD = 4, - BSS_INFO_ROAM_DETECTION = 5, - BSS_INFO_LQ_RM = 6, - BSS_INFO_EXT_BSS = 7, - BSS_INFO_BROADCAST_INFO = 8, - BSS_INFO_SYNC_MODE = 9, - BSS_INFO_RA = 10, -#ifdef HW_TX_AMSDU_SUPPORT - BSS_INFO_HW_AMSDU = 11, -#endif - BSS_INFO_MAX_NUM -}; - -enum { - BSS_INFO_OWN_MAC_FEATURE = (1 << BSS_INFO_OWN_MAC), - BSS_INFO_BASIC_FEATURE = (1 << BSS_INFO_BASIC), - BSS_INFO_RF_CH_FEATURE = (1 << BSS_INFO_RF_CH), - BSS_INFO_PM_FEATURE = (1 << BSS_INFO_PM), - BSS_INFO_UAPSD_FEATURE = (1 << BSS_INFO_UAPSD), - BSS_INFO_ROAM_DETECTION_FEATURE = (1 << BSS_INFO_ROAM_DETECTION), - BSS_INFO_LQ_RM_FEATURE = (1 << BSS_INFO_LQ_RM), - BSS_INFO_EXT_BSS_FEATURE = (1 << BSS_INFO_EXT_BSS), - BSS_INFO_BROADCAST_INFO_FEATURE = (1 << BSS_INFO_BROADCAST_INFO), - BSS_INFO_SYNC_MODE_FEATURE = (1 << BSS_INFO_SYNC_MODE), - BSS_INFO_RA_FEATURE = (1 << BSS_INFO_RA), -#ifdef HW_TX_AMSDU_SUPPORT - BSS_INFO_HW_AMSDU_FEATURE = (1 << BSS_INFO_HW_AMSDU), -#endif - BSS_INFO_MAX_NUM_FEATURE = (1 << BSS_INFO_MAX_NUM) -}; - -#define UNDEFINED_VALUE_TBD 0 - -typedef struct GNU_PACKED _CMD_BSSINFO_UPDATE_T { - UINT8 ucBssIndex; - UINT8 ucReserve; - UINT16 u2TotalElementNum; - UINT8 ucAppendCmdTLV; - UINT8 aucReserve[3]; - UINT8 aucBuffer[]; -} CMD_BSSINFO_UPDATE_T, *P_CMD_BSSINFO_UPDATE_T; - -typedef struct GNU_PACKED _BSSINFO_CONNECT_OWN_DEV_T { - /* BSS connect to own dev (Tag0) */ - UINT16 u2Tag; /* Tag = 0x00 */ - UINT16 u2Length; - UINT8 ucHwBSSIndex; - UINT8 ucOwnMacIdx; - UINT8 aucReserve[2]; - UINT32 u4ConnectionType; - UINT32 u4Reserved; -} CMD_BSSINFO_CONNECT_OWN_DEV_T, *P_CMD_BSSINFO_CONNECT_OWN_DEV_T; - -typedef struct GNU_PACKED _BSSINFO_BASIC_T { - /* Basic BSS information (Tag1) */ - UINT16 u2Tag; /* Tag = 0x01 */ - UINT16 u2Length; - UINT32 u4NetworkType; - UINT8 ucActive; - UINT8 ucReserve0; - UINT16 u2BcnInterval; - UINT8 aucBSSID[6]; - UINT8 ucWmmIdx; - UINT8 ucDtimPeriod; - UINT8 ucBcMcWlanidx; /* indicate which wlan-idx used for MC/BC transmission. */ - UINT8 ucCipherSuit; - UINT8 ucPhyMode; - UINT8 acuReserve[5]; -} CMD_BSSINFO_BASIC_T, *P_CMD_BSSINFO_BASIC_T; - -typedef struct GNU_PACKED _BSSINFO_RF_CH_T { - /* RF channel (Tag2) */ - UINT16 u2Tag; /* Tag = 0x02 */ - UINT16 u2Length; - UINT8 ucPrimaryChannel; - UINT8 ucCenterChannelSeg0; - UINT8 ucCenterChannelSeg1; - UINT8 ucBandwidth; -} CMD_BSSINFO_RF_CH_T, *P_CMD_BSSINFO_RF_CH_T; - -typedef struct GNU_PACKED _BSSINFO_PM_T { - /* Power management (Tag3) */ - UINT16 u2Tag; /* Tag = 0x03 */ - UINT16 u2Length; - UINT8 ucKeepAliveEn; - UINT8 ucKeepAlivePeriod; /* unit is second */ - UINT8 ucBeaconLossReportEn; - UINT8 ucBeaconLossCount; - UINT8 ucBcnSpState0Min; - UINT8 ucBcnSpState0Max; - UINT8 ucBcnSpState1Min; - UINT8 ucBcnSpState1Max; - UINT8 ucBcnSpState2Min; - UINT8 ucBcnSpState2Max; - UINT8 ucBcnSpState3Min; - UINT8 ucBcnSpState3Max; - UINT8 ucBcnSpState4Min; - UINT8 ucBcnSpState4Max; - UINT16 u2Reserve; -} CMD_BSSINFO_PM_T, *P_CMD_BSSINFO_PM_T; - -typedef struct GNU_PACKED _BSSINFO_UAPSD_T { - /* UAPSD offload (Tag4) */ - UINT16 u2Tag; /* Tag = 0x04 */ - UINT16 u2Length; - UINT8 ucIsUapsdSupported; - UINT8 ucUapsdTriggerAC; - UINT8 ucUapsdDeliveryAC; - UINT8 ucReportSpToEvent; - UINT16 u2UapsdServicePeriodTO; /* unit is second */ - UINT16 u2Reserve; -} CMD_BSSINFO_UAPSD_T, *P_CMD_BSSINFO_UAPSD_T; - -typedef struct GNU_PACKED _BSSINFO_RSSI_RM_DET_T { - /* RSSI Roaming Detection (Tag5) */ - UINT16 u2Tag; /* Tag = 0x05 */ - UINT16 u2Length; - UINT8 fgEnable; /* Enable the Packet RSSI Detection( and moving average) */ - UINT8 ucPktSource; /* Packet Seletction */ - UINT8 ucPktMAPara; /* Moving Average Parameter for Received Packets */ - INT8 cRssiCCKLowThr; /* input in RSSI, required by driver */ - INT8 cRssiCCKHighThr; /* input in RSSI, required by driver */ - INT8 cRssiOFDMLowThr; /* input in RSSI, required by driver */ - INT8 cRssiOFDMHighThr; /* input in RSSI, required by driver */ - UINT8 ucReserved0; -} CMD_BSSINFO_RSSI_RM_DET_T, *P_CMD_BSSINFO_RSSI_RM_DET_T; - -/* Extension BSS information (Tag7) */ -typedef struct GNU_PACKED _BSSINFO_EXT_BSS_INFO_T { - UINT16 u2Tag; /* Tag = 0x07 */ - UINT16 u2Length; - UINT32 ucMbssTsfOffset; - UINT8 aucReserved[8]; -} CMD_BSSINFO_EXT_BSS_INFO_T, *P_BSSINFO_EXT_BSS_INFO_T; - -/* Extension BSS information (Tag8) */ -typedef struct GNU_PACKED _BSSINFO_BMC_RATE_T { - /* Broad Mcast Frame Rate (Tag8) */ - UINT16 u2Tag; /* Tag = 0x08 */ - UINT16 u2Length; - UINT16 u2BcTransmit; - UINT16 u2McTransmit; - UINT8 ucPreambleMode; - UINT8 aucReserved[7]; -} CMD_BSSINFO_BMC_RATE_T, *P_BSSINFO_BMC_RATE_T; - -/* Sync Mode control (Tag9) */ -typedef struct GNU_PACKED _BSSINFO_SYNC_MODE_CTRL_T { - UINT16 u2Tag; /* Tag = 0x09 */ - UINT16 u2Length; - UINT16 u2BcnInterval; - UINT8 fgIsEnableSync; - UINT8 ucDtimPeriod; - UINT8 aucReserved[8]; -} CMD_BSSINFO_SYNC_MODE_CTRL_T, *P_BSSINFO_SYNC_MODE_CTRL_T; - -#ifdef HW_TX_AMSDU_SUPPORT -/* Hw AMSDU global information (Tag11) */ -typedef struct GNU_PACKED _CMD_BSSINFO_HW_AMSDU_INFO_T { - UINT16 u2Tag; /* Tag = 0xb */ - UINT16 u2Length; - UINT32 u4TxdCmpBitmap_0; - UINT32 u4TxdCmpBitmap_1; - UINT16 u2TxdTriggerThres; - UINT8 fgHwAmsduEn; - UINT8 aucReserved[1]; -} CMD_BSSINFO_HW_AMSDU_INFO_T, *P_CMD_BSSINFO_HW_AMSDU_INFO_T; -#endif - -typedef struct _BSS_INFO_HANDLE_T { - UINT32 BssInfoTag; - VOID(*BssInfoTagHandler) - (struct _RTMP_ADAPTER *pAd, - struct _BSS_INFO_ARGUMENT_T bss_info_argument, struct cmd_msg *msg); -} BSS_INFO_HANDLE_T, *P_BSS_INFO_HANDLE_T; - -/* WTBL */ - -/** - * @addtogroup wtbl - * @{ - * @name wtbl TLV - * @{ - */ -enum WTBL_TLV { - WTBL_GENERIC = 0, - WTBL_RX = 1, - WTBL_HT = 2, - WTBL_VHT = 3, - WTBL_PEER_PS = 4, - WTBL_TX_PS = 5, - WTBL_HDR_TRANS = 6, - WTBL_SECURITY_KEY = 7, - WTBL_BA = 8, - WTBL_RDG = 9, - WTBL_PROTECTION = 10, - WTBL_CLEAR = 11, - WTBL_BF = 12, - WTBL_SMPS = 13, - WTBL_RAW_DATA_RW = 14, - WTBL_DUMP = 15, - WTBL_SPE = 16, - WTBL_MAX_NUM = 17, -}; -/** @} */ -/** @} */ - -typedef struct _CMD_WTBL_UPDATE_T { - UINT8 ucWlanIdx; - UINT8 ucOperation; - UINT16 u2TotalElementNum; - UINT32 u4Reserve; - UINT8 aucBuffer[]; -} CMD_WTBL_UPDATE_T, *P_CMD_WTBL_UPDATE_T; - -enum { - RESET_WTBL_AND_SET = 1, - SET_WTBL = 2, - QUERY_WTBL = 3, - RESET_ALL_WTBL = 4, -}; - -typedef struct GNU_PACKED _WTBL_GENERIC_TLV_T { - UINT16 u2Tag; - UINT16 u2Length; - UINT8 aucBuffer[]; -} CMD_WTBL_GENERIC_TLV_T, *P_CMD_WTBL_GENERIC_TLV_T; - -typedef struct GNU_PACKED _WTBL_GENERIC_T { - UINT16 u2Tag; /* Tag = 0x00 */ - UINT16 u2Length; - UINT8 aucPeerAddress[6]; - UINT8 ucMUARIndex; - UINT8 ucSkipTx; - UINT8 ucCfAck; - UINT8 ucQos; - UINT8 ucMesh; - UINT8 ucAdm; - UINT16 u2PartialAID; - UINT8 ucBafEn; - UINT8 ucAadOm; -} CMD_WTBL_GENERIC_T, *P_CMD_WTBL_GENERIC_T; - -typedef struct GNU_PACKED _WTBL_RX_T { - UINT16 u2Tag; /* Tag = 0x01 */ - UINT16 u2Length; - UINT8 ucRcid; - UINT8 ucRca1; - UINT8 ucRca2; - UINT8 ucRv; - UINT8 aucReserved[4]; -} CMD_WTBL_RX_T, *P_CMD_WTBL_RX_T; - -typedef struct GNU_PACKED _WTBL_HT_T { - UINT16 u2Tag; /* Tag = 0x02 */ - UINT16 u2Length; - UINT8 ucHt; - UINT8 ucLdpc; - UINT8 ucAf; - UINT8 ucMm; -} CMD_WTBL_HT_T, *P_CMD_WTBL_HT_T; - -typedef struct GNU_PACKED _WTBL_VHT_T { - UINT16 u2Tag; /* Tag = 0x03 */ - UINT16 u2Length; - UINT8 ucLdpcVht; - UINT8 ucDynBw; - UINT8 ucVht; - UINT8 ucTxopPsCap; -} CMD_WTBL_VHT_T, *P_CMD_WTBL_VHT_T; - -typedef struct GNU_PACKED _WTBL_PEER_PS_T { - UINT16 u2Tag; /* Tag = 0x04 */ - UINT16 u2Length; - UINT8 ucDuIPsm; - UINT8 ucIPsm; - UINT8 ucRsvd0; - UINT8 ucRsvd1; -} CMD_WTBL_PEER_PS_T, *P_CMD_WTBL_PEER_PS_T; - -typedef struct GNU_PACKED _WTBL_TX_PS_T { - UINT16 u2Tag; /* Tag = 0x05 */ - UINT16 u2Length; - UINT8 ucTxPs; - UINT8 ucRsvd0; - UINT8 ucRsvd1; - UINT8 ucRsvd2; -} CMD_WTBL_TX_PS_T, *P_CMD_WTBL_TX_PS_T; - -typedef struct GNU_PACKED _WTBL_HDR_TRANS_T { - UINT16 u2Tag; /* Tag = 0x06 */ - UINT16 u2Length; - UINT8 ucTd; - UINT8 ucFd; - UINT8 ucDisRhtr; - UINT8 ucRsvd0; -} CMD_WTBL_HDR_TRANS_T, *P_CMD_WTBL_HDR_TRANS_T; - -typedef struct GNU_PACKED _WTBL_SECURITY_KEY_T { - UINT16 u2Tag; /* Tag = 0x07 */ - UINT16 u2Length; - UINT8 ucAddRemove; /* 0: add, 1: remove */ - /* UINT8 ucKeyType; */ /* 0: SHAREDKEYTABLE, 1: PAIRWISEKEYTABLE */ - UINT8 ucRkv; - UINT8 ucIkv; - UINT8 ucAlgorithmId; /* refer to ENUM_CIPHER_SUIT_T256 */ - UINT8 ucKeyId; - UINT8 ucKeyLen; - UINT8 ucrRsvd0; - UINT8 ucrRsvd1; - UINT8 aucKeyMaterial[32]; -} CMD_WTBL_SECURITY_KEY_T, *P_CMD_WTBL_SECURITY_KEY_T; - -typedef struct GNU_PACKED _WTBL_BA_T { - UINT16 u2Tag; /* Tag = 0x08 */ - UINT16 u2Length; - /* Recipient + Originator */ - UINT8 ucTid; - UINT8 ucBaSessionType; - UINT8 aucReserved[2]; - /* Originator */ - UINT16 u2Sn; - UINT8 ucBaEn; - UINT8 ucBaSize; - UINT8 aucReserved1[2]; - /* Recipient */ - UINT8 aucPeerAddress[MAC_ADDR_LEN]; - UINT8 ucRstBaTid; - UINT8 ucRstBaSel; - UINT8 ucStartRstBaSb; - UINT8 ucBandIdx; - UINT8 aucReserved2[4]; -} CMD_WTBL_BA_T, *P_CMD_WTBL_BA_T; - -typedef struct GNU_PACKED _WTBL_RDG_T { - UINT16 u2Tag; /* Tag = 0x09 */ - UINT16 u2Length; - UINT8 ucRdgBa; - UINT8 ucR; - UINT8 ucrRsvd0; - UINT8 ucrRsvd1; -} CMD_WTBL_RDG_T, *P_CMD_WTBL_RDG_T; - -typedef struct GNU_PACKED _WTBL_PROTECTION_T { - UINT16 u2Tag; /* Tag = 0x0a */ - UINT16 u2Length; - UINT8 ucRts; - UINT8 ucrRsvd0; - UINT8 ucrRsvd1; - UINT8 ucrRsvd2; -} CMD_WTBL_PROTECTION_T, *P_CMD_WTBL_PROTECTION_T; - -/* bit 0: Clear PSM (WF_WTBLON: 0x60322300, Bit 31 set 1 then set 0) */ -/* bit 1: Clear BA (WTBL2.DW15) */ -/* bit 2: Clear Rx Counter (6019_00002, bit 14) */ -/* bit 3: Clear Tx Counter (6019_0000, bit 15) */ -/* bit 4: Clear ADM Counter (6019_0000, bit 12) */ -/* bit 5: Clear Cipher key (WTBL3)*/ - -typedef struct GNU_PACKED _WTBL_CLEAR_T { - UINT16 u2Tag; /* Tag = 0x0b */ - UINT16 u2Length; - UINT8 ucClear; - UINT8 ucrRsvd0; - UINT8 ucrRsvd1; - UINT8 ucrRsvd2; -} CMD_WTBL_CLEAR_T, *P_CMD_WTBL_CLEAR_T; - -typedef struct GNU_PACKED _WTBL_BF_T { - UINT16 u2Tag; /* Tag = 0x0c */ - UINT16 u2Length; - UINT8 ucTiBf; - UINT8 ucTeBf; - UINT8 ucTibfVht; - UINT8 ucTebfVht; - UINT8 ucGid; - UINT8 ucPFMUIdx; - UINT8 ucrRsvd1; - UINT8 ucrRsvd2; -} CMD_WTBL_BF_T, *P_CMD_WTBL_BF_T; - -typedef struct GNU_PACKED _WTBL_SMPS_T { - UINT16 u2Tag; /* Tag = 0x0d */ - UINT16 u2Length; - UINT8 ucSmPs; - UINT8 ucrRsvd0; - UINT8 ucrRsvd1; - UINT8 ucrRsvd2; -} CMD_WTBL_SMPS_T, *P_CMD_WTBL_SMPS_T; - -typedef struct GNU_PACKED _WTBL_RAW_DATA_RW_T { - UINT16 u2Tag; /* Tag = 0x0e */ - UINT16 u2Length; - UINT8 ucWtblIdx; /* WTBL 1/2/3/4 in MT7636, the field don't care in MT7615 */ - UINT8 ucWhichDW; - UINT8 aucReserve[2]; - UINT32 u4DwMask; /* Show these bits don't be writen */ - UINT32 u4DwValue; -} CMD_WTBL_RAW_DATA_RW_T, *P_CMD_WTBL_RAW_DATA_RW_T; - -typedef struct GNU_PACKED _WTBL_SPE_T { - UINT16 u2Tag; /* Tag = 0x10 */ - UINT16 u2Length; - UINT8 ucSpeIdx; - UINT8 ucrRsvd0; - UINT8 ucrRsvd1; - UINT8 ucrRsvd2; -} CMD_WTBL_SPE_T, *P_CMD_WTBL_SPE_T; - -#define MAX_BUF_SIZE_OF_WTBL_INFO \ - (sizeof(CMD_WTBL_UPDATE_T) + sizeof(CMD_WTBL_GENERIC_T) + \ - sizeof(CMD_WTBL_RX_T) + sizeof(CMD_WTBL_HT_T) + \ - sizeof(CMD_WTBL_VHT_T) + sizeof(CMD_WTBL_PEER_PS_T) + \ - sizeof(CMD_WTBL_TX_PS_T) + sizeof(CMD_WTBL_HDR_TRANS_T) + \ - sizeof(CMD_WTBL_SECURITY_KEY_T) + sizeof(CMD_WTBL_BA_T) + \ - sizeof(CMD_WTBL_RDG_T) + sizeof(CMD_WTBL_PROTECTION_T) + \ - sizeof(CMD_WTBL_CLEAR_T) + sizeof(CMD_WTBL_BF_T) + \ - sizeof(CMD_WTBL_SMPS_T) + sizeof(CMD_WTBL_RAW_DATA_RW_T)) - -typedef struct GNU_PACKED _STAREC_WTBL_T { - /* WTBL with STAREC update (Tag 0x0b) */ - /* STAREC format, content is WTBL format. */ - UINT16 u2Tag; - UINT16 u2Length; - UINT8 aucBuffer[MAX_BUF_SIZE_OF_WTBL_INFO]; -} CMD_STAREC_WTBL_T, *P_CMD_STAREC_WTBL_T; - -#ifdef MT7615 -#define WTBL_BUFFER_SIZE 0x100 -#endif /* MT7615 */ - -#ifdef MT7622 -#define WTBL_BUFFER_SIZE 0x100 -#endif /* MT7622 */ - -typedef struct GNU_PACKED _WTBL_DUMP_T { - UINT16 u2Tag; /* Tag = 0x0f */ - UINT16 u2Length; - UINT8 aucWtblBuffer[WTBL_BUFFER_SIZE]; /* need 4 byte alignment */ -} CMD_WTBL_DUMP_T, *P_CMD_WTBL_DUMP_T; - -#define SKU_SIZE 49 - -enum { - SKU_CCK_1_2 = 0, - SKU_CCK_55_11, - SKU_OFDM_6_9, - SKU_OFDM_12_18, - SKU_OFDM_24_36, - SKU_OFDM_48, - SKU_OFDM_54, - SKU_HT20_0_8, - SKU_HT20_32, - SKU_HT20_1_2_9_10, - SKU_HT20_3_4_11_12, - SKU_HT20_5_13, - SKU_HT20_6_14, - SKU_HT20_7_15, - SKU_HT40_0_8, - SKU_HT40_32, - SKU_HT40_1_2_9_10, - SKU_HT40_3_4_11_12, - SKU_HT40_5_13, - SKU_HT40_6_14, - SKU_HT40_7_15, - SKU_VHT20_0, - SKU_VHT20_1_2, - SKU_VHT20_3_4, - SKU_VHT20_5_6, - SKU_VHT20_7, - SKU_VHT20_8, - SKU_VHT20_9, - SKU_VHT40_0, - SKU_VHT40_1_2, - SKU_VHT40_3_4, - SKU_VHT40_5_6, - SKU_VHT40_7, - SKU_VHT40_8, - SKU_VHT40_9, - SKU_VHT80_0, - SKU_VHT80_1_2, - SKU_VHT80_3_4, - SKU_VHT80_5_6, - SKU_VHT80_7, - SKU_VHT80_8, - SKU_VHT80_9, - SKU_VHT160_0, - SKU_VHT160_1_2, - SKU_VHT160_3_4, - SKU_VHT160_5_6, - SKU_VHT160_7, - SKU_VHT160_8, - SKU_VHT160_9, - SKU_1SS_Delta, - SKU_2SS_Delta, - SKU_3SS_Delta, - SKU_4SS_Delta, -}; - -enum { - ENTRY_1 = 0, /* 1T 1Nss */ - ENTRY_2, /* 2T 1Nss */ - ENTRY_3, /* 2T 2Nss */ - ENTRY_4, /* 3T 1Nss */ - ENTRY_5, /* 3T 2Nss */ - ENTRY_6, /* 3T 3Nss */ - ENTRY_7, /* 4T 1Nss */ - ENTRY_8, /* 4T 2Nss */ - ENTRY_9, /* 4T 3Nss */ - ENTRY_10, /* 4T 4Nss */ -}; - -enum { - CMD_BW_20, - CMD_BW_40, - CMD_BW_80, - CMD_BW_160, - CMD_BW_10, - CMD_BW_5, - CMD_BW_8080 -}; - -typedef struct GNU_PACKED _EXT_CMD_CHAN_SWITCH_T { - UINT8 ucPrimCh; - UINT8 ucCentralCh; - UINT8 ucBW; - UINT8 ucTxStreamNum; - - UINT8 ucRxStreamNum; - UINT8 ucSwitchReason; - UINT8 ucDbdcIdx; - UINT8 ucCentralCh2; - - UINT16 u2CacCase; - UINT8 ucBand; - UINT8 aucReserve0[1]; - - UINT32 u4OutBandFreq; - - INT8 cTxPowerDrop; - UINT8 aucReserve1[3]; - - INT8 acTxPowerSKU[SKU_TOTAL_SIZE]; - UINT8 aucReserve2[3]; -} EXT_CMD_CHAN_SWITCH_T, *P_EXT_CMD_CHAN_SWITCH_T; - -#if defined(MT7615) || defined(P18) || defined(MT7663) -#define EFUSE_CONTENT_START 0x34 -#define EFUSE_CONTENT_END 0x3BF -#elif defined(MT7622) -/*7622 require more space for efuse content*/ -#define EFUSE_CONTENT_START 0x34 -#define EFUSE_CONTENT_END 0x3DB - -#elif defined(MT7637) -/* todo: efuse structure need unify */ -#define EFUSE_CONTENT_START 0x2E -#define EFUSE_CONTENT_END 0x19D -#else -#define EFUSE_CONTENT_START 0x20 -#define EFUSE_CONTENT_END 0xFF -#endif -#define EFUSE_CONTENT_SIZE (EFUSE_CONTENT_END - EFUSE_CONTENT_START + 1) - -#if defined(MT7615) || defined(MT7622) -typedef struct GNU_PACKED _EXT_EVENT_ID_GET_TX_POWER_T { - UINT8 ucTxPwrType; - UINT8 ucEfuseAddr; - UINT8 ucEfuseContent; - UINT8 ucBand; -} EXT_EVENT_ID_GET_TX_POWER_T, *P_EXT_EVENT_ID_GET_TX_POWER_T; -#else -typedef struct _EXT_EVENT_ID_GET_TX_POWER_T { - UINT8 u1EventCategoryID; - UINT8 i1TargetPower; - UINT8 u1BandIdx; - UINT8 u1Reserved; -} EXT_EVENT_ID_GET_TX_POWER_T, *P_EXT_EVENT_ID_GET_TX_POWER_T; -#endif /* defined(MT7615) || defined(MT7622) */ - -#if defined(MT7615) || defined(MT7622) -typedef struct GNU_PACKED _EXT_CMD_GET_TX_POWER_T { - UINT8 ucTxPwrType; - UINT8 ucCenterChannel; - UINT8 ucDbdcIdx; - UINT8 ucBand; - UINT8 aucReserved[4]; -} EXT_CMD_GET_TX_POWER_T, *P_EXT_CMD_GET_TX_POWER_T; -#else -typedef struct _EXT_CMD_GET_TX_POWER_T { - UINT8 u1PowerCtrlFormatId; - UINT8 u1DbdcIdx; - UINT8 u1Reserved[2]; -} EXT_CMD_GET_TX_POWER_T, *P_EXT_CMD_GET_TX_POWER_T; -#endif /* defined(MT7615) || defined(MT7622) */ - -#if defined(MT7615) || defined(MT7622) -typedef struct GNU_PACKED _EXT_CMD_TX_POWER_CTRL_T { - UINT8 ucCenterChannel; - UINT8 ucDbdcIdx; - UINT8 ucBand; - UINT8 ucReserved[1]; - UINT8 aucBinContent[EFUSE_CONTENT_SIZE]; -} EXT_CMD_TX_POWER_CTRL_T, *P_EXT_CMD_TX_POWER_CTRL_T; -#else -typedef struct GNU_PACKED _EXT_CMD_TX_POWER_CTRL_T { - UINT8 u1PowerCtrlFormatId; - UINT8 u1DbdcIdx; - INT8 i1TargetPower; - UINT8 u1Reserved; -} EXT_CMD_TX_POWER_CTRL_T, *P_EXT_CMD_TX_POWER_CTRL_T; -#endif /* defined(MT7615) || defined(MT7622) */ - -typedef struct _CMD_POWER_RATE_TXPOWER_CTRL_T { - UINT8 ucPowerCtrlFormatId; - UINT8 ucPhyMode; - UINT8 ucTxRate; - UINT8 ucBW; - UINT8 ucBandIdx; - INT8 cTxPower; - UINT8 ucReserved[2]; -} CMD_POWER_RATE_TXPOWER_CTRL_T, *P_CMD_POWER_RATE_TXPOWER_CTRL_T; - -#ifdef BACKGROUND_SCAN_SUPPORT -typedef struct GNU_PACKED _EXT_CMD_BGND_SCAN_NOTIFY_T { - UINT8 ucNotifyFunc; - UINT8 ucBgndScanStatus; - UINT8 resv[2]; -} EXT_CMD_BGND_SCAN_NOTIFY_T, *P_EXT_CMD_BGND_SCAN_NOTIFY_T; -#endif /* BACKGROUND_SCAN_SUPPORT */ - -typedef struct _INIT_EVENT_ACCESS_REG { - UINT32 u4Address; - UINT32 u4Data; -} INIT_EVENT_ACCESS_REG, *P_INIT_EVENT_ACCESS_REG; - -#define CMD_RESULT_SUCCESS 0 -#define CMD_RESULT_NONSUPPORT 254 - -typedef struct _INIT_EVENT_CMD_RESULT { - UINT8 ucStatus; - UINT8 ucCID; - UINT8 aucReserved[2]; -} INIT_EVENT_CMD_RESULT; - -typedef struct GNU_PACKED _EVENT_EXT_CMD_RESULT_T { - UINT8 ucExTenCID; - UINT8 aucReserve[3]; - UINT32 u4Status; -} EVENT_EXT_CMD_RESULT_T, *PEVENT_EXT_CMD_RESULT_T; - -typedef struct GNU_PACKED _EVENT_STAREC_UPDATE_T { - UINT8 ucExtenCID; /* Fix at 0x25 */ - UINT8 aucReserve[3]; - UINT32 u4Status; - UINT8 ucBssInfoIdx; - UINT8 ucWlanIdx; - UINT16 u2TotalElementNum; - UINT8 ucMuarIdx; - UINT8 aucReserved[3]; - UINT8 aucBuffer[]; -} EVENT_STAREC_UPDATE_T, *P_EVENT_STAREC_UPDATE_T; - -typedef struct GNU_PACKED _EVENT_BSSINFO_UPDATE_T { - UINT8 ucExtenCID; /* Fix at 0x26 */ - UINT8 aucReserve[3]; - UINT32 u4Status; - UINT8 ucBssInfoIdx; - UINT8 ucReserve; - UINT16 u2TotalElementNum; - UINT8 aucReserved[4]; - UINT8 aucBuffer[]; -} EVENT_BSSINFO_UPDATE_T, *P_EVENT_BSSINFO_UPDATE_T; - -typedef struct GNU_PACKED _EVENT_DEVINFO_UPDATE_T { - UINT8 ucExtenCID; /* Fix at 0x2A */ - UINT8 aucReserve[3]; - UINT32 u4Status; - UINT8 ucOwnMacIdx; - UINT8 ucReserve; - UINT16 u2TotalElementNum; - UINT8 aucReserved[4]; - UINT8 aucBuffer[]; -} EVENT_DEVINFO_UPDATE_T, *P_EVENT_DEVINFO_UPDATE_T; - -typedef struct GNU_PACKED _EXT_EVENT_NIC_CAPABILITY_T { - UINT8 aucDateCode[16]; - UINT8 aucVersionCode[12]; -} EXT_EVENT_NIC_CAPABILITY; - -#ifdef MT_MAC -/* TODO: Star, fix me, the "RF_CR" is dupicated with andes_rlt.h */ -enum { - MAC_CR, - RF_CR, -}; -#endif /* MT_MAC */ - -typedef struct GNU_PACKED _CMD_MULTI_CR_ACCESS_T { - UINT32 u4Type; - UINT32 u4Addr; - UINT32 u4Data; -} CMD_MULTI_CR_ACCESS_T; - -typedef struct GNU_PACKED _EXT_EVENT_MULTI_CR_ACCESS_WR_T { - UINT32 u4Status; - UINT32 u4Resv; - UINT32 u4Resv2; -} EXT_EVENT_MULTI_CR_ACCESS_WR_T; - -typedef struct GNU_PACKED _EXT_EVENT_MULTI_CR_ACCESS_RD_T { - UINT32 u4Type; - UINT32 u4Addr; - UINT32 u4Data; -} EXT_EVENT_MULTI_CR_ACCESS_RD_T; - -enum { - ANDES_LOG_DISABLE, - ANDES_LOG_TO_UART, - ANDES_LOG_TO_EVENT, -}; - -typedef struct GNU_PACKED _EXT_CMD_FW_LOG_2_HOST_CTRL_T { - UINT8 ucFwLog2HostCtrl; - UINT8 ucReserve[3]; -} EXT_CMD_FW_LOG_2_HOST_CTRL_T; - -#ifdef CONFIG_MAP_SUPPORT - -#define EXT_CMD_GET_ALL_STA_STATS_NUM_PER_EVENT 75 -#define TXRX_MAX_STA_NUM_PER_EVENT 30 -#define MAX_TX_RX_ADM_NUM 4 - -typedef enum _STA_STAT_EVENT_TYPE { - EVENT_PHY_ALL_TX_RX_RATE = 0x1, - EVENT_PHY_TX_STAT_PER_WCID = 0x2, - EVENT_PHY_RX_STAT = 0x03, - EVENT_PHY_ALL_TX_RX_ADM_STAT = 0x04, - EVENT_PHY_TXRX_AIR_TIME = 0x05 -} STA_STAT_EVENT_TYPE, - *P_STA_STAT_EVENT_TYPE; - -typedef struct _EXT_CMD_GET_ALL_STA_STAT_T { - UINT8 ucEventType /*Sub-event to FW*/; - UINT8 aucReserved[3]; -} EXT_CMD_GET_ALL_STA_STAT_T, *P_EXT_CMD_GET_ALL_STA_STAT_T; - -typedef struct _TX_RX_PHY_CFG_T { - UINT8 MODE; - UINT8 FLAGS; - UINT8 STBC; - UINT8 ShortGI; - UINT8 BW; - UINT8 ldpc; - UINT8 MCS; - UINT8 VhtNss; - UINT8 u1RxRate; - UINT8 u1RxMode; - UINT8 u1RxNsts; - UINT8 u1RxGi; - UINT8 u1RxCoding; - UINT8 u1RxStbc; - UINT8 u1RxBW; - UINT8 u1Reserved; -} TX_RX_PHY_CFG_T, *P_TX_RX_PHY_CFG_T; - -typedef struct _EXT_EVENT_TXRX_AIRTIME_T { - UINT16 u2WlanId; - UINT32 u4WtblTxTime[MAX_TX_RX_ADM_NUM]; - UINT32 u4WtblRxTime[MAX_TX_RX_ADM_NUM]; -} EXT_EVENT_TXRX_AIRTIME_T, *P_EXT_EVENT_TXRX_AIRTIME_T; - -typedef struct _EXT_EVENT_TXRX_AIRTIME_INFO_T { - UINT8 u1PhyEventId; - UINT8 u1FlagMoreEvent; - UINT16 u2StaNum; - EXT_EVENT_TXRX_AIRTIME_T rTxRxAirTimeStat[TXRX_MAX_STA_NUM_PER_EVENT]; -} EXT_EVENT_TXRX_AIRTIME_INFO_T, *P_EXT_EVENT_TXRX_AIRTIME_INFO_T; - -#endif - -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) -/* u4Field and ucWlanIdx is included for DCC to get per bss packet count */ -typedef struct _EXT_EVENT_WTBL_TX_COUNTER_RESULT_T { - UINT32 u4Field; - UINT32 CurrentBWTxCount; - UINT32 OtherBWTxCount; - UINT32 DataFrameRetryCnt; - UINT32 MgmtRetryCnt; - UINT32 PerStaRetriedPktCnt[MAX_LEN_OF_MAC_TABLE]; - UINT8 ucWlanIdx; - UINT8 aucReserved[3]; -} EXT_EVENT_WTBL_TX_COUNTER_RESULT_T; -typedef struct _EXT_CMD_GET_WTBL_TX_COUNT_T { - UINT32 u4Field; - UINT8 ucWlanIdx; - UINT8 aucReserved[3]; -} EXT_CMD_GET_WTBL_TX_COUNT_T, *P_EXT_CMD_GET_WTBL_TX_COUNT_T; - -#endif - -#if defined(TXRX_STAT_SUPPORT) || defined(EAP_STATS_SUPPORT) -typedef struct _EXT_EVENT_STA_TX_STAT_RESULT_T { - UINT32 PerStaTxPktCnt[MAX_LEN_OF_MAC_TABLE]; - UINT32 PerStaTxFailPktCnt[MAX_LEN_OF_MAC_TABLE]; - UINT8 ucEntryBitmap[16]; - UINT8 ucEntryCount; - UINT8 aucReserved[3]; -} EXT_EVENT_STA_TX_STAT_RESULT_T; - -typedef struct _EXT_CMD_GET_STA_TX_STAT_T { - UINT8 ucEntryBitmap[16]; - UINT8 ucEntryCount; - UINT8 aucReserved[3]; -} EXT_CMD_GET_STA_TX_STAT_T, *P_EXT_CMD_GET_STA_TX_STAT_T; -#endif - -typedef struct GNU_PACKED _CMD_AP_PS_RETRIEVE_T { - UINT32 u4Option; /* 0: AP_PWS enable, 1: redirect disable */ - UINT32 u4Param1; /* for 0: enable/disable. for 1: wlan idx */ - UINT32 u4Resv; -} CMD_AP_PS_RETRIEVE_STRUC_T, *P_CMD_AP_PS_RETRIEVE_STRUC_T; - -typedef struct GNU_PACKED _EXT_EVENT_AP_PS_RETRIEVE_T { - UINT32 u4Param1; /* for 0: enable/disable. for 1: wlan idx */ - UINT32 u4Resv; - UINT32 u4Resv2; -} EXT_EVENT_AP_PS_RETRIEVE_T, *P_EXT_EVENT_AP_PS_RETRIEVE_T; - -typedef struct GNU_PACKED _BIN_CONTENT_T { - UINT16 u2Addr; - UINT8 ucValue; - UINT8 ucReserved; -} BIN_CONTENT_T, *P_BIN_CONTENT_T; - -typedef struct GNU_PACKED _EXT_CMD_GET_SENSOR_RESULT_T { - UINT8 ucActionIdx; - UINT8 aucReserved[3]; -} EXT_CMD_GET_SENSOR_RESULT_T, *P_EXT_CMD_GET_SENSOR_RESULT_T; - -typedef struct GNU_PACKED _EXT_EVENT_GET_SENSOR_RESULT_T { - UINT32 u4SensorResult; - UINT32 u4Reserved; -} EXT_EVENT_GET_SENSOR_RESULT_T, *P_EXT_EVENT_GET_SENSOR_RESULT_T; -typedef struct GNU_PACKED _EXT_EVENT_TDLS_SETUP_T { - UINT8 ucResultId; - UINT8 aucReserved[3]; - - UINT32 u4StartTime; - UINT32 u4EndTime; - UINT32 u4TbttTime; - UINT32 u4StayTime; - UINT32 u4RestTime; -} EXT_EVENT_TDLS_SETUP_T, *P_EXT_EVENT_TDLS_SETUP_T; - -typedef struct GNU_PACKED _EXT_EVENT_TDLS_STATUS_T { - UINT8 ucResultId; - UINT8 aucReserved[3]; -} EXT_EVENT_TDLS_STATUS_T, *P_EXT_EVENT_TDLS_STATUS_T; - -typedef struct GNU_PACKED _EXT_CMD_EFUSE_BUFFER_MODE_T { - UINT8 ucSourceMode; - UINT8 ucReserved; /* Keep next UINT16 16-bit aligned, this needs correct N9 FW. */ - UINT16 ucCount; - UINT8 BinContent[]; -} EXT_CMD_EFUSE_BUFFER_MODE_T, *P_EXT_CMD_EFUSE_BUFFER_MODE_T; - -typedef struct GNU_PACKED _EXT_CMD_EVENT_DUMP_MEM_T { - UINT32 u4MemAddr; - UINT8 ucData[64]; -} EXT_CMD_EVENT_DUMP_MEM_T, *P_EXT_CMD_EVENT_DUMP_MEM_T; - -typedef struct _MEM_DUMP_DATA_T { - PUINT8 pValue; -} MEM_DUMP_DATA_T; - -typedef enum _EXT_ENUM_PM_FEATURE_T { - PM_CMD_FEATURE_PSPOLL_OFFLOAD = 0x00000001, - PM_CMD_FEATURE_PS_TX_REDIRECT = 0x00000002, - PM_CMD_FEATURE_SMART_BCN_SP = 0x00000004, - PM_CMD_FEATURE_SEND_NULL_FRAME = 0x00000008, -} EXT_ENUM_PM_FEATURE_T; - -enum _ENUM_BCN_LOSS_REASON_T { - /* For STA/ApCli mode (Beacon stop receiving) */ - ENUM_BCN_LOSS_STA = 0x00, - - /* For AP mode (Beacon stop sending) */ - ENUM_BCN_LOSS_AP_DISABLE = 0x10, - ENUM_BCN_LOSS_AP_SER_TRIGGER = 0x11, - ENUM_BCN_LOSS_AP_ERROR = 0x12 -}; - -typedef struct GNU_PACKED _EXT_EVENT_BEACON_LOSS_T { - UINT8 aucBssid[6]; - UINT8 ucReason; - UINT8 ucReserve; -} EXT_EVENT_BEACON_LOSS_T, *P_EXT_EVENT_BEACON_LOSS_T; - -#ifdef MT_DFS_SUPPORT /* Jelly20150123 */ -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -typedef struct _PERIODIC_PULSE_BUFFER_T { - UINT32 u4PeriodicStartTime; - UINT16 u2PeriodicPulseWidth; - INT16 i2PeriodicPulsePower; -} PERIODIC_PULSE_BUFFER_T, *PPERIODIC_PULSE_BUFFER_T; - -typedef struct _LONG_PULSE_BUFFER_T { - UINT32 u4LongStartTime; - UINT16 u2LongPulseWidth; - INT16 i2LongPulsePower; -} LONG_PULSE_BUFFER_T, *PLONG_PULSE_BUFFER_T; - -typedef struct _HW_PULSE_CONTENT_T { - UINT32 u4HwStartTime; - UINT16 u2HwPulseWidth; - INT16 i2HwPulsePower; - UINT8 ucScPass; - UINT8 ucSwReset; -} HW_PULSE_CONTENT_T, *PHW_PULSE_CONTENT_T; - -typedef struct _SW_RADAR_TYPE_T { - UINT8 ucRT_DET; - UINT8 ucRT_ENB; - UINT8 ucRT_STGR; - UINT8 ucRT_CRPN_MIN; - UINT8 ucRT_CRPN_MAX; - UINT8 ucRT_CRPR_MIN; - UINT8 ucRT_PW_MIN; - UINT8 ucRT_PW_MAX; - UINT32 u4RT_PRI_MIN; - UINT32 u4RT_PRI_MAX; - UINT8 ucRT_CRBN_MIN; - UINT8 ucRT_CRBN_MAX; - UINT8 ucRT_STGPN_MIN; - UINT8 ucRT_STGPN_MAX; - UINT8 ucRT_STGPR_MIN; -} SW_RADAR_TYPE_T, *PSW_RADAR_TYPE_T; - -typedef struct _EXT_EVENT_RDD_REPORT_T { - UINT8 ucRddIdx; - UINT8 ucLongDetected; - UINT8 ucConstantPRFDetected; - UINT8 ucStaggeredPRFDetected; - UINT8 ucRadarTypeIdx; - UINT8 ucPeriodicPulseNum; - UINT8 ucLongPulseNum; - UINT8 ucHwPulseNum; - UINT8 ucOutLPN; - UINT8 ucOutSPN; - UINT8 ucOutCRPN; - UINT8 ucOutCRPW; - UINT8 ucOutCRBN; - UINT8 ucOutSTGPN; - UINT8 ucOutSTGPW; - UINT16 u2Reserve; - UINT32 u4OutPRI_CONST; - UINT32 u4OutPRI_STG1; - UINT32 u4OutPRI_STG2; - UINT32 u4OutPRI_STG3; - LONG_PULSE_BUFFER_T arLongPulse[LPB_SIZE]; - PERIODIC_PULSE_BUFFER_T arPeriodicPulse[PPB_SIZE]; - HW_PULSE_CONTENT_T arContent[PB_SIZE]; -} EXT_EVENT_RDD_REPORT_T, *P_EXT_EVENT_RDD_REPORT_T; -#else -typedef struct GNU_PACKED _EXT_EVENT_RDD_REPORT_T { - UINT8 ucRddIdx; - UINT8 aucReserve[3]; -} EXT_EVENT_RDD_REPORT_T, *P_EXT_EVENT_RDD_REPORT_T; -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT -typedef struct _EXT_CMD_RDM_TEST_RADAR_PATTERN_T { - UINT8 ucPulseNum; - UINT8 aucReserved[3]; - PERIODIC_PULSE_BUFFER_T arPulseBuffer[PB_SIZE]; -} CMD_RDM_TEST_RADAR_PATTERN_T, *P_CMD_RDM_TEST_RADAR_PATTERN_T; -#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */ - -typedef struct GNU_PACKED _EXT_EVENT_CAC_END_T { - UINT8 ucRddIdx; - UINT8 aucReserve[3]; -} EXT_EVENT_CAC_END_T, *P_EXT_EVENT_CAC_END_T; -#endif - -typedef struct GNU_PACKED _EXT_EVENT_ROAMING_DETECT_RESULT_T { - UINT8 ucBssidIdx; - UINT8 aucReserved[3]; - UINT32 u4RoamReason; -} EXT_EVENT_ROAMING_DETECT_RESULT_T, *P_EXT_EVENT_ROAMING_DETECT_RESULT_T; - -enum { - ROAMING_STATUS_NOT_DETERMINED = 0x00, - ROAMING_RCPI_CCK_EXCEED_MAX = 0x01, - ROAMING_RCPI_CCK_LOWER_MIN = 0x02, - ROAMING_RCPI_OFDM_EXCEED_MAX = 0x04, - ROAMING_RCPI_OFDM_LOWER_MIN = 0x08, - ROAMING_LQ_CCK_EXCEED_MAX = 0x10, - ROAMING_LQ_CCK_LOWER_MIN = 0x20, - ROAMING_LQ_OFDM_EXCEED_MAX = 0x40, - ROAMING_LQ_OFDM_LOWER_MIN = 0x80, -}; - -typedef struct GNU_PACKED _EXT_EVENT_ASSERT_DUMP_T { - UINT8 aucBuffer[1000]; /* temparary size */ -} EXT_EVENT_ASSERT_DUMP_T, *P_EXT_EVENT_ASSERT_DUMP_T; - -typedef struct GNU_PACKED _EXT_CMD_PWR_MGT_BIT_T { - UINT8 ucWlanIdx; - UINT8 ucPwrMgtBit; - UINT8 aucReserve[2]; -} EXT_CMD_PWR_MGT_BIT_T, *P_EXT_CMD_PWR_MGT_BIT_T; - -typedef struct GNU_PACKED _EXT_CMD_HOST_RESUME_DONE_ACK_T { - UINT8 ucReserved0; - UINT8 ucReserved1; - UINT8 ucReserved2; - UINT8 ucReserved3; -} EXT_CMD_HOST_RESUME_DONE_ACK_T, *P_EXT_CMD_HOST_RESUME_DONE_ACK_T; - -typedef struct GNU_PACKED _EXT_EVENT_PS_SYNC_T { - UINT8 ucWtblIndex; - UINT8 ucPsBit; - UINT8 aucReserves[2]; -} EXT_EVENT_PS_SYNC_T, *P_EXT_EVENT_PS_SYNC_T; - -enum { - EEPROM_MODE_EFUSE = 0, - EEPROM_MODE_BUFFER = 1, -}; - -typedef struct GNU_PACKED _CMD_ACCESS_EFUSE_T { - UINT32 u4Address; - UINT32 u4Valid; - UINT8 aucData[16]; -} CMD_ACCESS_EFUSE_T, *P_CMD_ACCESS_EFUSE_T, _EXT_EVENT_ACCESS_EFUSE_T; - -typedef struct _EFUSE_ACCESS_DATA_T { - PUINT pIsValid; - PUSHORT pValue; -} EFUSE_ACCESS_DATA_T; - -typedef struct GNU_PACKED _EXT_CMD_EFUSE_FREE_BLOCK_T { - UINT8 ucGetFreeBlock; - UINT8 aucReserve[3]; -} EXT_CMD_EFUSE_FREE_BLOCK_T, *P_EXT__CMD_EFUSE_FREE_BLOCK_T; - -typedef struct GNU_PACKED _EXT_EVENT_EFUSE_FREE_BLOCK_T { - UINT32 ucFreeBlockNum; - UINT8 aucReserve[4]; -} EXT_EVENT_EFUSE_FREE_BLOCK_T, *P_EXT_EVENT_EFUSE_FREE_BLOCK_T; - -typedef struct _EXT_CMD_ACCESS_EFUSE_CHECK_T { - UINT32 u4Address; - UINT8 aucData[16]; -} EXT_CMD_ACCESS_EFUSE_CHECK_T, *P_EXT_CMD_ACCESS_EFUSE_CHECK_T; - -typedef struct _EXT_EVENT_ACCESS_EFUSE_CHECK_T { - UINT32 u4Address; - UINT8 ucStatus; - UINT8 aucReserve[3]; -} EXT_EVENT_ACCESS_EFUSE_CHECK_T, *P_EXT_EVENT_ACCESS_EFUSE_CHECK_T; - -enum { - HIGH_TEMP_THD = 0, - LOW_TEMP_THD = 1, -}; - -enum _ENUM_THERMAL_PROTECTION_EXTRA_TAG { - THERAML_PROTECTION_TAG_SET_ADMIT_DUTY = 1 -}; - -typedef enum _ENUM_THERMAL_PROTECTION_REASON_T { - THERAML_PROTECTION_REASON_NTX, - THERAML_PROTECTION_REASON_ADM, - THERAML_PROTECTION_REASON_RADIO -} ENUM_THERMAL_PROTECTION_REASON_T, - *P_ENUM_THERMAL_PROTECTION_REASON_T; - -typedef struct GNU_PACKED _EXT_CMD_THERMAL_PROTECT_T { - UINT8 ucHighEnable; - CHAR cHighTempThreshold; - UINT8 ucLowEnable; - CHAR cLowTempThreshold; - UINT32 RecheckTimer; - UINT8 ucRFOffEnable; - CHAR cRFOffThreshold; - UINT8 ucType; - UINT8 ucExtraTag; - UINT8 ucLv0Duty; - UINT8 ucLv1Duty; - UINT8 ucLv2Duty; - UINT8 ucLv3Duty; -} EXT_CMD_THERMAL_PROTECT_T, *P_EXT_CMD_THERMAL_PROTECT_T; - -typedef struct GNU_PACKED _EXT_EVENT_THERMAL_PROTECT_T { - UINT8 ucHLType; - CHAR cCurrentTemp; - UINT8 ucReason; - UINT8 aucReserve; -} EXT_EVENT_THERMAL_PROTECT_T, *P_EXT_EVENT_THERMAL_PROTECT_T; - -typedef struct GNU_PACKED _EXT_CMD_TMR_CAL_T { - UINT8 ucEnable; - UINT8 ucBand; /* 0: 2G, 1: 5G */ - UINT8 ucBW; /* 0: 20MHz, 1: 40MHz, 2: 80MHz, 3: 160MHz, 4: 10MHz, 5: 5MHz */ - UINT8 ucAnt; /* 0: Atn0, 1: Ant1 */ - - UINT8 ucRole; /* 0: initiator, 1: responder */ - UINT8 aucReserve[3]; -} EXT_CMD_TMR_CAL_T, *P_EXT_CMD_TMR_CAL_T; - -typedef struct GNU_PACKED _UPDATE_RTS_THRESHOLD_T { - UINT32 u4RtsPktLenThreshold; - UINT16 u2RtsPktNumThreshold; - UINT16 u2RtsRetryLimit; -} UPDATE_RTS_THRESHOLD_T, *P_UPDATE_RTS_THRESHOLD_T; - -typedef struct GNU_PACKED _UPDATE_PROTECTION_T { - UINT8 ucLongNav; - UINT8 ucMMProtect; - UINT8 ucGFProtect; - UINT8 ucBW40Protect; - UINT8 ucRifsProtect; - UINT8 ucBW80Protect; - UINT8 ucBW160Protect; - UINT8 ucERProtectMask; -} UPDATE_PROTECTION_T, *P_UPDATE_PROTECTION_T; - -#define UPDATE_RTS_THRESHOLD 0x1 -#define UPDATE_PROTECTION_CTRL 0x2 -typedef struct GNU_PACKED _EXT_CMD_UPDATE_PROTECT_T { - UINT8 ucProtectIdx; /* 0: Rsv. 1: Rts Threshold 2: Protect Threshold */ - UINT8 ucDbdcIdx; - UINT8 aucRsv[2]; - - union { - UPDATE_RTS_THRESHOLD_T rUpdateRtsThld; - UPDATE_PROTECTION_T rUpdateProtect; - } Data; -} EXT_CMD_UPDATE_PROTECT_T, *P_EXT_CMD_UPDATE_PROTECT_T; - -typedef struct GNU_PACKED _EXT_CMD_RDG_CTRL_T { - UINT32 u4TxOP; - UINT8 ucLongNav; - UINT8 ucInit; - UINT8 ucResp; - UINT8 ucWlanIdx; - UINT8 ucBand; - UINT8 aucReserved[3]; -} EXT_CMD_RDG_T, *P_EXT_CMD_RDG_T; - -#ifdef VOW_SUPPORT -/*************************************************/ -/* EXT_CMD_ID_DRR_CTRL = 0x36 */ -/*************************************************/ -typedef struct GNU_PACKED _AIRTIME_QUA_ALL_FIELD_T { - UINT8 ucAirTimeQuantum[8]; -} AIRTIME_QUA_ALL_FIELD_T, *P_AIRTIME_QUA_ALL_FIELD_T; - -typedef union GNU_PACKED _VOW_DRR_CTRL_VALUE_T { - UINT32 u4ComValue; - AIRTIME_QUA_ALL_FIELD_T - rAirTimeQuantumAllField; /* used for ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_ALL ctrl only */ -} VOW_DRR_CTRL_VALUE_T, *P_VOW_DRR_CTRL_VALUE_T; - -typedef struct GNU_PACKED _EXT_CMD_VOW_DRR_CTRL_T { - UINT32 u4CtrlFieldID; - UINT8 ucStaID; - UINT8 ucCtrlStatus; - UINT8 ucReserve[2]; - UINT32 u4ReserveDW; - VOW_DRR_CTRL_VALUE_T rAirTimeCtrlValue; -} EXT_CMD_VOW_DRR_CTRL_T, *P_EXT_CMD_VOW_DRR_CTRL_T; - -typedef enum _ENUM_EXT_CMD_VOW_DRR_CTRL_ID_T { - /* Type 1 */ - ENUM_VOW_DRR_CTRL_FIELD_STA_ALL = 0x00000000, - ENUM_VOW_DRR_CTRL_FIELD_STA_BSS_GROUP = 0x00000001, - ENUM_VOW_DRR_CTRL_FIELD_STA_PRIORITY = 0x00000002, - ENUM_VOW_DRR_CTRL_FIELD_STA_AC0_QUA_ID = 0x00000003, - ENUM_VOW_DRR_CTRL_FIELD_STA_AC1_QUA_ID = 0x00000004, - ENUM_VOW_DRR_CTRL_FIELD_STA_AC2_QUA_ID = 0x00000005, - ENUM_VOW_DRR_CTRL_FIELD_STA_AC3_QUA_ID = 0x00000006, - ENUM_VOW_DRR_CTRL_FIELD_STA_WMM_ID = 0x00000007, - - ENUM_VOW_DRR_CTRL_FIELD_TYPE_1_BOUNDARY = 0x0000000f, - - /* Type 2 */ - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_DEFICIT_BOUND = 0x00000010, - ENUM_VOW_DRR_CTRL_FIELD_BW_DEFICIT_BOUND = 0x00000011, - - ENUM_VOW_DRR_CTRL_FIELD_TYPE_2_BOUNDARY = 0x0000001f, - - /* Type 3 */ - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L0 = 0x00000020, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L1 = 0x00000021, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L2 = 0x00000022, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L3 = 0x00000023, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L4 = 0x00000024, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L5 = 0x00000025, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L6 = 0x00000026, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_L7 = 0x00000027, - ENUM_VOW_DRR_CTRL_FIELD_AIRTIME_QUANTUM_ALL = 0x00000028, - - ENUM_VOW_DRR_CTRL_FIELD_TYPE_3_BOUNDARY = 0x0000002f, - - /* Type 4 */ - ENUM_VOW_DRR_CTRL_FIELD_STA_PAUSE_SETTING = 0x00000030, - ENUM_VOW_DRR_CTRL_FIELD_TYPE_4_BOUNDARY = 0x0000003f, - -} ENUM_EXT_CMD_VOW_DRR_CTRL_ID_T, - P_ENUM__EXT_CMD_VOW_DRR_CTRL_ID_T; -/* end of EXT_CMD_ID_DRR_CTRL = 0x36 */ - -/*************************************************/ -/* EXT_CMD_ID_BSSGROUP_CTRL = 0x37 */ -/*************************************************/ -typedef struct GNU_PACKED _BW_BSS_TOKEN_SETTING_T { - /* DW#0 */ - UINT16 u2MinRateToken; /* unit: 1 bit */ - UINT16 u2MaxRateToken; /* unit: 1 bit */ - - /* DW#1 */ -#ifdef RT_BIG_ENDIAN - UINT32 u4MinTokenBucketLengSize : 12; /* unit: 1024 bit */ - UINT32 u4D1B19Rev : 1; /* reserve */ - UINT32 u4MinAirTimeToken : 11; /* unit: 1/8 us */ - UINT32 u4MinTokenBucketTimeSize : 8; /* unit: 1024 us */ -#else - UINT32 u4MinTokenBucketTimeSize : 8; /* unit: 1024 us */ - UINT32 u4MinAirTimeToken : 11; /* unit: 1/8 us */ - UINT32 u4D1B19Rev : 1; /* reserve */ - UINT32 u4MinTokenBucketLengSize : 12; /* unit: 1024 bit */ -#endif - /* DW#2 */ -#ifdef RT_BIG_ENDIAN - UINT32 u4MaxTokenBucketLengSize : 12; /* unit: 1024 bit */ - UINT32 u4D2B19Rev : 1; /* reserve */ - UINT32 u4MaxAirTimeToken : 11; /* unit: 1/8 us */ - UINT32 u4MaxTokenBucketTimeSize : 8; /* unit: 1024 us */ -#else - UINT32 u4MaxTokenBucketTimeSize : 8; /* unit: 1024 us */ - UINT32 u4MaxAirTimeToken : 11; /* unit: 1/8 us */ - UINT32 u4D2B19Rev : 1; /* reserve */ - UINT32 u4MaxTokenBucketLengSize : 12; /* unit: 1024 bit */ -#endif - /* DW#3 */ -#ifdef RT_BIG_ENDIAN - UINT32 u4D3B28toB31Rev : 4; /* reserve */ - UINT32 u4MaxBacklogSize : 12; /* unit: 1024 bit */ - UINT32 u4D3B8toB15Rev : 8; /* reserve */ - UINT32 u4MaxWaitTime : 8; /* unit: 1024 us */ -#else - UINT32 u4MaxWaitTime : 8; /* unit: 1024 us */ - UINT32 u4D3B8toB15Rev : 8; /* reserve */ - UINT32 u4MaxBacklogSize : 12; /* unit: 1024 bit */ - UINT32 u4D3B28toB31Rev : 4; /* reserve */ -#endif - -} BW_BSS_TOKEN_SETTING_T, *P_BW_BSS_TOKEN_SETTING_T; - -typedef struct GNU_PACKED _EXT_CMD_BSS_CTRL_T { - UINT32 u4CtrlFieldID; - UINT8 ucBssGroupID; - UINT8 ucCtrlStatus; - UINT8 ucReserve[2]; - UINT32 u4ReserveDW; - UINT32 u4SingleFieldIDValue; - BW_BSS_TOKEN_SETTING_T arAllBssGroupMultiField[16]; - UINT8 ucBssGroupQuantumTime[16]; -} EXT_CMD_BSS_CTRL_T, *P_EXT_CMD_BSS_CTRL_T; - -typedef enum _ENUM_EXT_CMD_BSSGROUP_CTRL_ID_T { - ENUM_BSSGROUP_CTRL_ALL_ITEM_FOR_1_GROUP = 0x00, - ENUM_BSSGROUP_CTRL_MIN_RATE_TOKEN_CFG_ITEM = 0x01, - ENUM_BSSGROUP_CTRL_MAX_RATE_TOKEN_CFG_ITEM = 0x02, - ENUM_BSSGROUP_CTRL_MIN_TOKEN_BUCKET_TIME_SIZE_CFG_ITEM = 0x03, - ENUM_BSSGROUP_CTRL_MIN_AIRTIME_TOKEN_CFG_ITEM = 0x04, - ENUM_BSSGROUP_CTRL_MIN_TOKEN_BUCKET_LENG_SIZE_CFG_ITEM = 0x05, - ENUM_BSSGROUP_CTRL_MAX_TOKEN_BUCKET_TIME_SIZE_CFG_ITEM = 0x06, - ENUM_BSSGROUP_CTRL_MAX_AIRTIME_TOKEN_CFG_ITEM = 0x07, - ENUM_BSSGROUP_CTRL_MAX_TOKEN_BUCKET_LENG_SIZE_CFG_ITEM = 0x08, - ENUM_BSSGROUP_CTRL_MAX_WAIT_TIME_CFG_ITEM = 0x09, - ENUM_BSSGROUP_CTRL_MAX_BACKLOG_SIZE_CFG_ITEM = 0x0a, - ENUM_BSSGROUP_CTRL_ALL_ITEM_FOR_ALL_GROUP = 0x10, - - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_BASE = 0x20, - - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_00 = 0x20, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_01 = 0x21, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_02 = 0x22, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_03 = 0x23, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_04 = 0x24, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_05 = 0x25, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_06 = 0x26, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_07 = 0x27, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_08 = 0x28, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_09 = 0x29, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0A = 0x2A, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0B = 0x2B, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0C = 0x2C, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0D = 0x2D, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0E = 0x2E, - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_L_0F = 0x2F, - - ENUM_BSSGROUP_CTRL_BW_GROUP_QUANTUM_ALL = 0x30, - -} ENUM_EXT_CMD_BSSGROUP_CTRL_ID_T, - P_ENUM_EXT_CMD_BSSGROUP_CTRL_ID_T; -/* end of EXT_CMD_ID_BSSGROUP_CTRL = 0x37 */ - -/*************************************************/ -/* EXT_CMD_ID_VOW_FEATURE_CTRL = 0x38 */ -/*************************************************/ -typedef struct GNU_PACKED _EXT_CMD_VOW_FEATURE_CTRL_T { - /* DW#0 */ - UINT16 u2IfApplyBss_0_to_16_CtrlFlag; /* BITWISE */ -#ifdef RT_BIG_ENDIAN - UINT16 u2IfApplyEnbwCtrlFlag : 1; - UINT16 u2IfApplyEnbwrefillFlag : 1; - UINT16 u2IfApplyAirTimeFairnessFlag : 1; - UINT16 u2IfApplyEnTxopNoChangeBssFlag : 1; - UINT16 u2Reserve_b26_to_b27Flag : 2; - UINT16 u2IfApplyWeightedAirTimeFairnessFlag : 1; - UINT16 u2Reserve_b22_to_b24Flag : 3; - UINT16 u2IfApplyDbdc0SearchRuleFlag : 1; - UINT16 u2IfApplyDbdc1SearchRuleFlag : 1; - UINT16 u2Reserve_b19Flag : 1; - UINT16 u2Reserve_b17_to_b18Flag : 2; - UINT16 u2IfApplyRefillPerildFlag : 1; -#else - UINT16 u2IfApplyRefillPerildFlag : 1; - UINT16 u2Reserve_b17_to_b18Flag : 2; - UINT16 u2Reserve_b19Flag : 1; - UINT16 u2IfApplyDbdc1SearchRuleFlag : 1; - UINT16 u2IfApplyDbdc0SearchRuleFlag : 1; - UINT16 u2Reserve_b22_to_b24Flag : 3; - UINT16 u2IfApplyWeightedAirTimeFairnessFlag : 1; - UINT16 u2Reserve_b26_to_b27Flag : 2; - UINT16 u2IfApplyEnTxopNoChangeBssFlag : 1; - UINT16 u2IfApplyAirTimeFairnessFlag : 1; - UINT16 u2IfApplyEnbwrefillFlag : 1; - UINT16 u2IfApplyEnbwCtrlFlag : 1; -#endif - /* DW#1 */ - UINT16 u2IfApplyBssCheckTimeToken_0_to_16_CtrlFlag; /* BITWISE */ - UINT16 u2Resreve1Flag; - - /* DW#2 */ - UINT16 u2IfApplyBssCheckLengthToken_0_to_16_CtrlFlag; /* BITWISE */ - UINT16 u2Resreve2Flag; - - /* DW#3, 4 */ - UINT32 u2ResreveBackupFlag[2]; - - /* DW#5 */ - UINT16 u2Bss_0_to_16_CtrlValue; /* BITWISE */ -#ifdef RT_BIG_ENDIAN - UINT16 u2EnbwCtrlValue : 1; - UINT16 u2EnbwrefillValue : 1; - UINT16 u2AirTimeFairnessValue : 1; - UINT16 u2EnTxopNoChangeBssValue : 1; - UINT16 u2Reserve_b26_to_b27Value : 2; - UINT16 u2WeightedAirTimeFairnessValue : 1; - UINT16 u2Reserve_b22_to_b24Value : 3; - UINT16 u2Dbdc0SearchRuleValue : 1; - UINT16 u2Dbdc1SearchRuleValue : 1; - UINT16 u2Reserve_b19Value : 1; - UINT16 u2RefillPerildValue : 3; -#else - - UINT16 u2RefillPerildValue : 3; - UINT16 u2Reserve_b19Value : 1; - UINT16 u2Dbdc1SearchRuleValue : 1; - UINT16 u2Dbdc0SearchRuleValue : 1; - UINT16 u2Reserve_b22_to_b24Value : 3; - UINT16 u2WeightedAirTimeFairnessValue : 1; - UINT16 u2Reserve_b26_to_b27Value : 2; - UINT16 u2EnTxopNoChangeBssValue : 1; - UINT16 u2AirTimeFairnessValue : 1; - UINT16 u2EnbwrefillValue : 1; - UINT16 u2EnbwCtrlValue : 1; -#endif - /* DW#6 */ - UINT16 u2BssCheckTimeToken_0_to_16_CtrlValue; /* BITWISE */ - UINT16 u2Resreve1Value; - - /* DW#7 */ - UINT16 u2BssCheckLengthToken_0_to_16_CtrlValue; /* BITWISE */ - UINT16 u2Resreve2Value; - - /* DW#8 */ -#ifdef RT_BIG_ENDIAN - UINT32 u4Resreve1Value : 1; - UINT32 u4VowKeepSettingBit : 5; - UINT32 u4VowKeepSettingValue : 1; - UINT32 u4IfApplyKeepVoWSettingForSerFlag : 1; - UINT32 u4RxRifsModeforCckCtsValue : 1; - UINT32 u4IfApplyRxRifsModeforCckCtsFlag : 1; - UINT32 u4ApplyRxEifsToZeroValue : 1; - UINT32 u4IfApplyRxEifsToZeroFlag : 1; - UINT32 u4RtsFailedChargeDisValue : 1; - UINT32 u4IfApplyRtsFailedChargeDisFlag : 1; - UINT32 u4TxBackOffBoundValue : 5; - UINT32 u4TxBackOffBoundEnable : 1; - UINT32 u4IfApplyTxBackOffBoundFlag : 1; - UINT32 u4TxMeasurementModeValue : 1; - UINT32 u4IfApplyTxMeasurementModeFlag : 1; - UINT32 u4TxCountValue : 4; - UINT32 u4IfApplyTxCountModeFlag : 1; - UINT32 u4KeepQuantumValue : 1; - UINT32 u4IfApplyKeepQuantumFlag : 1; - UINT32 u4RtsStaLockValue : 1; - UINT32 u4IfApplyStaLockForRtsFlag : 1; -#else - UINT32 u4IfApplyStaLockForRtsFlag : 1; - UINT32 u4RtsStaLockValue : 1; - UINT32 u4IfApplyKeepQuantumFlag : 1; - UINT32 u4KeepQuantumValue : 1; - UINT32 u4IfApplyTxCountModeFlag : 1; - UINT32 u4TxCountValue : 4; - UINT32 u4IfApplyTxMeasurementModeFlag : 1; - UINT32 u4TxMeasurementModeValue : 1; - UINT32 u4IfApplyTxBackOffBoundFlag : 1; - UINT32 u4TxBackOffBoundEnable : 1; - UINT32 u4TxBackOffBoundValue : 5; /* ms */ - UINT32 u4IfApplyRtsFailedChargeDisFlag : 1; /* don't charge airtime when RTS failed */ - UINT32 u4RtsFailedChargeDisValue : 1; - UINT32 u4IfApplyRxEifsToZeroFlag : 1; - UINT32 u4ApplyRxEifsToZeroValue : 1; - UINT32 u4IfApplyRxRifsModeforCckCtsFlag : 1; - UINT32 u4RxRifsModeforCckCtsValue : 1; - UINT32 u4IfApplyKeepVoWSettingForSerFlag : 1; - UINT32 u4VowKeepSettingValue : 1; - UINT32 u4VowKeepSettingBit : 5; - UINT32 u4Resreve1Value : 1; -#endif - /* DW#9 */ - UINT32 u4ResreveBackupValue; - -} EXT_CMD_VOW_FEATURE_CTRL_T, *P_EXT_CMD_VOW_FEATURE_CTRL_T; - -typedef enum _ENUM_UMAC_VOW_REFILL_PERIOD_T { - ENUM_UMAC_VOW_REFILL_IDX_0_1_US = 0, - ENUM_UMAC_VOW_REFILL_IDX_1_2_US = 1, - ENUM_UMAC_VOW_REFILL_IDX_2_4_US = 2, - ENUM_UMAC_VOW_REFILL_IDX_3_8_US = 3, - ENUM_UMAC_VOW_REFILL_IDX_4_16_US = 4, - ENUM_UMAC_VOW_REFILL_IDX_5_32_US = 5, - ENUM_UMAC_VOW_REFILL_IDX_6_64_US = 6, - ENUM_UMAC_VOW_REFILL_IDX_7_128_US = 7, - ENUM_UMAC_VOW_REFILL_IDX_TOTAL_NUM = 8, -} ENUM_UMAC_VOW_REFILL_PERIOD_T, - *P_ENUM_UMAC_VOW_REFILL_PERIOD_T; -/* end of EXT_CMD_ID_VOW_FEATURE_CTRL = 0x38 */ - -/*************************************************/ -/* EXT_CMD_ID_RX_AIRTIME_CTRL = 0x4a */ -/*************************************************/ -/* MIB IFS related data type */ -typedef struct GNU_PACKED _RX_AT_IFS_CFG_T { - UINT8 ucAC0Ifs; - UINT8 ucAC1Ifs; - UINT8 ucAC2Ifs; - UINT8 ucAC3Ifs; -} RX_AT_IFS_CFG_T, *P_RX_AT_IFS_CFG_T; - -typedef enum _ENUM_RX_AT_AC_Q_MASK_T { - ENUM_RX_AT_AC_Q0_MASK_T = BIT(0), - ENUM_RX_AT_AC_Q1_MASK_T = BIT(1), - ENUM_RX_AT_AC_Q2_MASK_T = BIT(2), - ENUM_RX_AT_AC_Q3_MASK_T = BIT(3), - ENUM_RX_AT_AC_ALL_MASK_T = (BIT(3) | BIT(2) | BIT(1) | BIT(0)), -} ENUM_RX_AT_AC_Q_MASK_T, - *P_ENUM_RX_AT_AC_Q_MASK_T; - -typedef enum _ENUM_RX_AT_WMM_GROUP_IDX_T { - - ENUM_RX_AT_WMM_GROUP_0 = 0, /* MIBTIME1 */ - ENUM_RX_AT_WMM_GROUP_1 = 1, /* MIBTIME2 */ - ENUM_RX_AT_WMM_GROUP_2 = 2, /* MIBTIME3 */ - ENUM_RX_AT_WMM_GROUP_3 = 3, /* MIBTIME4 */ - ENUM_RX_AT_WMM_GROUP_PEPEATER = 4, /* MIBTIME7 */ - ENUM_RX_AT_WMM_GROUP_STA = 5, /* MIBTIME8 */ - ENUM_RX_AT_NON_QOS = 6, /* MIBTIME0 */ - ENUM_RX_AT_OBSS = 7, /* MIBTIME0 */ - -} ENUM_RX_AT_WMM_GROUP_IDX_T, - *P_ENUM_RX_AT_WMM_GROUP_IDX_T; - -/* RX AT Backoff related data type */ - -typedef struct GNU_PACKED _RX_AT_BACKOFF_CFG_T { - UINT16 u2AC0Backoff; - UINT16 u2AC1Backoff; - UINT16 u2AC2Backoff; - UINT16 u2AC3Backoff; -} RX_AT_BACKOFF_CFG_T, *P_RX_AT_BACKOFF_CFG_T; - -/* Compensate mode enum definition */ -typedef enum _ENUM_RX_AT_SW_COMPENSATE_MODE_T { - ENUM_RX_AT_SW_COMPENSATE_OBSS = 1, - ENUM_RX_AT_SW_COMPENSATE_NON_WIFI = 2, -} ENUM_RX_AT_SW_COMPENSATE_MODE_T, - *P_ENUM_RX_AT_SW_COMPENSATE_MODE_T; - -/* ENUM list for u4CtrlFieldID */ -typedef enum _ENUM_RX_AT_CTRL_FIELD_T { - ENUM_RX_AT_FEATURE_CTRL = 1, - ENUM_RX_AT_BITWISE_CTRL = 2, - ENUM_RX_AT_TIMER_VALUE_CTRL = 3, - EMUM_RX_AT_REPORT_CTRL = 4, -} ENUM_RX_AT_CTRL_FIELD_T, - *P_ENUM_RX_AT_CTRL_FIELD_T; - -/* ENUM list for (u4CtrlSubFieldID == ENUM_RX_AT_FEATURE_CTRL) */ -typedef enum _ENUM_RX_AT_FEATURE_SUB_FIELD_T { - ENUM_RX_AT_FEATURE_SUB_TYPE_AIRTIME_EN = 1, - ENUM_RX_AT_FEATURE_SUB_TYPE_MIBTIME_EN = 2, -} ENUM_RX_AT_FEATURE_SUB_FIELD_T, - *P_ENUM_RX_AT_FEATURE_SUB_FIELD_T; - -/* ENUM list for (u4CtrlSubFieldID == ENUM_RX_AT_FEATURE_CTRL) */ -typedef enum _ENUM_RX_AT_BITWISE_SUB_FIELD_T { - ENUM_RX_AT_BITWISE_SUB_TYPE_AIRTIME_CLR = 1, - ENUM_RX_AT_BITWISE_SUB_TYPE_MIBTIME_CLR = 2, - ENUM_RX_AT_BITWISE_SUB_TYPE_STA_WMM_CTRL = 3, - ENUM_RX_AT_BITWISE_SUB_TYPE_MBSS_WMM_CTRL = 4, -} ENUM_RX_AT_BITWISE_SUB_FIELD_T, - *_ENUM_RX_AT_BITWISE_SUB_FIELD_T; - -/* ENUM list for (u4CtrlSubFieldID == ENUM_RX_AT_TIMER_VALUE_CTRL) */ -typedef enum _ENUM_RX_AT_TIME_VALUE_SUB_FIELD_T { - ENUM_RX_AT_TIME_VALUE_SUB_TYPE_ED_OFFSET_CTRL = 1, - ENUM_RX_AT_TIME_VALUE_SUB_TYPE_SW_TIMER = 2, - ENUM_RX_AT_TIME_VALUE_SUB_TYPE_BACKOFF_TIMER = 3, - ENUM_RX_AT_TIME_VALUE_SUB_TYPE_IFS_TIMER = 4, -} ENUM_RX_AT_TIME_VALUE_SUB_FIELD_T, - *P_ENUM_RX_AT_TIME_VALUE_SUB_FIELD_T; - -/* ENUM list for (u4CtrlSubFieldID == EMUM_RX_AT_REPORT_CTRL) */ -typedef enum _ENUM_RX_AT_TIME_REPORT_SUB_FIELD_T { - ENUM_RX_AT_REPORT_SUB_TYPE_RX_NONWIFI_TIME = 1, - ENUM_RX_AT_REPORT_SUB_TYPE_RX_OBSS_TIME = 2, - ENUM_RX_AT_REPORT_SUB_TYPE_MIB_OBSS_TIME = 3, - ENUM_RX_AT_REPORT_SUB_TYPE_PER_STA_RX_TIME = 4, -} ENUM_RX_AT_TIME_REPORT_SUB_FIELD_T, - *P_ENUM_RX_AT_TIME_REPORT_SUB_FIELD_T; - -typedef struct GNU_PACKED _RX_AT_FEATURE_SUB_FIELD_CTRL_T { - BOOLEAN fgRxAirTimeEn; - BOOLEAN fgRxMibTimeEn; - UINT8 ucReserve[2]; - UINT32 u4ReserveDW[2]; -} RX_AT_FEATURE_SUB_FIELD_CTRL_T, *P_RX_AT_FEATURE_SUB_FIELD_CTRL_T; - -typedef struct GNU_PACKED _RX_AT_BITWISE_SUB_FIELD_CTRL_T { - /* DW#0 */ - BOOLEAN fgRxAirTimeClrEn; - BOOLEAN fgRxMibTimeClrEn; - UINT8 ucReserve[2]; - - /* DW#1 */ - UINT8 ucOwnMacID; - BOOLEAN fgtoApplyWm00to03MibCfg; - UINT8 ucReserve1[2]; - - /* DW#2 */ - UINT8 ucMbssGroup; - UINT8 ucWmmGroup; - UINT8 ucReserve2[2]; - - /* DW#3,4 */ - UINT32 u4ReserveDW[2]; -} RX_AT_BITWISE_SUB_FIELD_CTRL_T, *P_RX_AT_BITWISE_SUB_FIELD_CTRL_T; - -typedef enum _ENUM_DBDC_BN_T { - ENUM_BAND_0, - ENUM_BAND_1, - ENUM_BAND_NUM, - ENUM_BAND_ALL -} ENUM_DBDC_BN_T, - *P_ENUM_DBDC_BN_T; - -typedef struct GNU_PACKED _RX_AT_TIMER_VALUE_SUB_FIELD_CTRL_T { - /* DW#0 */ - UINT8 ucEdOffsetValue; - UINT8 ucReserve0[3]; - - /* DW#1 */ - UINT8 rCompensateMode; - UINT8 rRxBand; - UINT8 ucSwCompensateTimeValue; - UINT8 ucReserve1; - - /* D2#2/3/4 */ - RX_AT_BACKOFF_CFG_T rRxATBackOffCfg; - UINT8 rRxATBackoffWmmGroupIdx; - UINT8 rRxAtBackoffAcQMask; - UINT8 ucReserve2[2]; - - /* DW#5/6 */ - RX_AT_IFS_CFG_T rRxATIfsCfg; - UINT8 rRxATIfsWmmGroupIdx; - UINT8 rRxAtIfsAcQMask; - UINT8 ucReserve3[2]; - - UINT32 u4ReserveDW[2]; -} RX_AT_TIMER_VALUE_SUB_FIELD_CTRL_T, *P_RX_AT_TIMER_VALUE_SUB_FIELD_CTRL_T; - -typedef struct GNU_PACKED _RX_AT_REPORT_SUB_FIELD_CTRL_T { - /* DW# 0/1 */ - UINT32 u4RxNonWiFiBandTimer; - UINT8 ucRxNonWiFiBandIdx; - UINT8 ucReserve0[3]; - - /* DW# 2/3 */ - UINT32 u4RxObssBandTimer; - UINT8 ucRxObssBandIdx; - UINT8 ucReserve1[3]; - - /* DW# 4/5 */ - UINT32 u4RxMibObssBandTimer; - UINT8 ucRxMibObssBandIdx; - UINT8 ucReserve2[3]; - - /* DW# 6/7/8/9/10 */ - UINT32 u4StaAcRxTimer[4]; - UINT8 ucStaID; - UINT8 ucReserve3[3]; - -} RX_AT_REPORT_SUB_FIELD_CTRL_T, *P_RX_AT_REPORT_SUB_FIELD_CTRL_T; - -typedef union GNU_PACKED _RX_AT_GENERAL_CTRL_FIELD_T { - RX_AT_FEATURE_SUB_FIELD_CTRL_T rRxAtFeatureSubCtrl; - RX_AT_BITWISE_SUB_FIELD_CTRL_T rRxAtBitWiseSubCtrl; - RX_AT_TIMER_VALUE_SUB_FIELD_CTRL_T rRxAtTimeValueSubCtrl; - RX_AT_REPORT_SUB_FIELD_CTRL_T rRxAtReportSubCtrl; -} RX_AT_GENERAL_CTRL_FIELD_T, *P_RX_AT_GENERAL_CTRL_FIELD_T; - -typedef struct GNU_PACKED _EXT_CMD_RX_AT_CTRL_T { - UINT16 u4CtrlFieldID; - UINT16 u4CtrlSubFieldID; - UINT32 u4CtrlSetStatus; - UINT32 u4CtrlGetStatus; - UINT8 ucReserve[4]; - UINT32 u4ReserveDW[2]; - - RX_AT_GENERAL_CTRL_FIELD_T rRxAtGeneralCtrl; - -} EXT_CMD_RX_AT_CTRL_T, *P_EXT_CMD_RX_AT_CTRL_T; - -/* end of EXT_CMD_ID_RX_AIRTIME_CTRL = 0x4a */ - -/*************************************************/ -/* EXT_CMD_ID_AT_PROC_MODULE = 0x4b */ -/*************************************************/ -typedef struct GNU_PACKED _AT_ESTIMATE_SUB_FIELD_CTRL_T { - /* DW#0 */ - BOOLEAN fgAtEstimateOnOff; - UINT8 ucReserve; - UINT16 u2AtEstMonitorPeriod; - - /* DW#1, 2~9 */ - UINT32 u4GroupRatioBitMask; - UINT16 u2GroupMaxRatioValue[16]; - UINT16 u2GroupMinRatioValue[16]; - - /* DW#10 */ - UINT8 ucGrouptoSelectBand; - UINT8 ucBandSelectedfromGroup; - UINT8 ucReserve1[2]; - -} AT_ESTIMATE_SUB_FIELD_CTRL_T, *P_AT_ESTIMATE_SUB_FIELD_CTRL_T; - -typedef struct GNU_PACKED _AT_BAD_NODE_SUB_FIELD_CTRL_T { - /* DW#0 */ - BOOLEAN fgAtBadNodeOnOff; - UINT8 ucReserve; - UINT16 u2AtBadNodeMonitorPeriod; - - /* DW#1 */ - UINT8 ucFallbackThreshold; - UINT8 ucTxPERThreshold; - UINT8 ucReserve1[2]; - -} AT_BAD_NODE_SUB_FIELD_CTRL_T, *P_AT_BAD_NODE_SUB_FIELD_CTRL_T; - -typedef union _AT_PROC_GENERAL_CTRL_FIELD_T { - AT_ESTIMATE_SUB_FIELD_CTRL_T rAtEstimateSubCtrl; - AT_BAD_NODE_SUB_FIELD_CTRL_T rAtBadNodeSubCtrl; -} AT_PROC_GENERAL_CTRL_FIELD_T, *P_AT_PROC_GENERAL_CTRL_FIELD_T; - -typedef struct GNU_PACKED _EXT_CMD_AT_PROC_MODULE_CTRL_T { - UINT16 u4CtrlFieldID; - UINT16 u4CtrlSubFieldID; - UINT32 u4CtrlSetStatus; - UINT32 u4CtrlGetStatus; - UINT8 ucReserve[4]; - UINT32 u4ReserveDW[2]; - - AT_PROC_GENERAL_CTRL_FIELD_T rAtProcGeneralCtrl; -} EXT_CMD_AT_PROC_MODULE_CTRL_T, *P_EXT_CMD_AT_PROC_MODULE_CTRL_T; - -typedef enum _ENUM_AT_ESTIMATE_SUB_FIELD_T { - ENUM_AT_PROC_EST_FEATURE_CTRL = 1, - ENUM_AT_PROC_EST_MONITOR_PERIOD_CTRL = 2, - ENUM_AT_PROC_EST_GROUP_RATIO_CTRL = 3, - ENUM_AT_PROC_EST_GROUP_TO_BAND_MAPPING = 4, -} ENUM_AT_ESTIMATE_SUB_FIELD_T, - *P_ENUM_AT_ESTIMATE_SUB_FIELD_T; - -typedef enum _ENUM_AT_BAD_NODE_SUB_FIELD_T { - ENUM_AT_PROC_BAD_NODE_FEATURE_CTRL = 1, - ENUM_AT_PROC_BAD_NODE_MONITOR_PERIOD_CTRL = 2, - ENUM_AT_PROC_BAD_NODE_FALLBACK_THRESHOLD = 3, - ENUM_AT_PROC_BAD_NODE_PER_THRESHOLD = 4, -} ENUM_AT_BAD_NODE_SUB_FIELD_T, - *P_ENUM_AT_BAD_NODE_SUB_FIELD_T; - -/* ENUM list for u4CtrlFieldID in AT PROCESS control field */ -typedef enum _ENUM_AT_RPOCESS_FIELD_T { - ENUM_AT_RPOCESS_ESTIMATE_MODULE_CTRL = 1, - ENUM_AT_RPOCESS_BAD_NODE_MODULE_CTRL = 2, -} ENUM_AT_RPOCESS_FIELD_T, - *P_ENUM_AT_RPOCESS_FIELD_T; - -/* end of EXT_CMD_ID_AT_PROC_MODULE = 0x4b */ - -#endif /* VOW_SUPPORT */ - -#define SET_RX_MAX_PKT_LEN(x) ((x) << 2) -typedef struct _EXT_CMD_RX_MAX_PKT_LEN_T { - UINT16 u2Tag; /* EXT_CMD_TAG_RXMAXLEN */ - UINT16 u2RxMaxPktLength; /* CR unit is DWORD(4B) */ -} EXT_CMD_RX_MAX_PKT_LEN_T, *P_EXT_CMD_RX_MAX_PKT_LEN_T; - -typedef struct GNU_PACKED _CMD_SLOT_TIME_SET_T { - UINT8 ucSlotTime; - UINT8 ucSifs; - UINT8 ucRifs; - UINT8 ucOldEifs; /* occupied for backward compatible */ - UINT16 u2Eifs; - UINT8 ucBandNum; - UINT8 aucReserved[5]; -} CMD_SLOT_TIME_SET_T, *P_CMD_SLOT_TIME_SET_T; - -typedef struct GNU_PACKED _CMD_POWER_PWERCENTAGE_LEVEL_SET_T { - INT8 cPowerDropLevel; - UINT8 ucBand; - UINT8 aucReserved[10]; -} CMD_POWER_PWERCENTAGE_LEVEL_SET_T, *P_CMD_POWER_PWERCENTAGE_LEVEL_SET_T; - -#define TX_STREAM 0x0 -#define RX_STREAM 0x1 -#define SET_TR_STREAM_NUM(x, y) (((x) << 16) | (y)) - -enum EXT_CMD_ATE_CFG_ONOFF_TYPE { - EXT_CFG_ONOFF_TSSI = 0x0, - EXT_CFG_ONOFF_DPD = 0x1, - EXT_CFG_ONOFF_RATE_POWER_OFFSET = 0x2, - EXT_CFG_ONOFF_TEMP_COMP = 0x3, - EXT_CFG_ONOFF_THERMAL_SENSOR = 0x4, - EXT_CFG_ONOFF_TXPOWER_CTRL = 0x5, - EXT_CFG_ONOFF_SINGLE_SKU = 0x6, - EXT_CFG_ONOFF_POWER_PERCENTAGE = 0x7, - EXT_CFG_ONOFF_BF_BACKOFF = 0x8, -}; - -#ifdef CONFIG_HW_HAL_OFFLOAD -enum EXT_CMD_ATE_TRX_SET_IDX { - EXT_ATE_SET_RESERV = 0x0, - EXT_ATE_SET_TRX = 0x1, - EXT_ATE_SET_RX_PATH = 0x2, - EXT_ATE_SET_RX_FILTER = 0x3, - EXT_ATE_SET_TX_STREAM = 0x4, - EXT_ATE_SET_TSSI = 0x5, - EXT_ATE_SET_DPD = 0x6, - EXT_ATE_SET_RATE_POWER_OFFSET = 0X7, - EXT_ATE_SET_THERNAL_COMPENSATION = 0X8, - EXT_ATE_SET_RX_FILTER_PKT_LEN = 0x09, - EXT_ATE_SET_FREQ_OFFSET = 0x0A, - EXT_ATE_GET_FREQ_OFFSET = 0x0B, - EXT_ATE_GET_TSSI = 0xC, - EXT_ATE_GET_DPD = 0xD, - EXT_ATE_GET_THERNAL_COMPENSATION = 0XE, - EXT_ATE_SET_RXV_INDEX = 0x0F, - EXT_ATE_SET_FAGC_PATH = 0x10, - EXT_ATE_SET_PHY_COUNT = 0x11, - EXT_ATE_SET_ANTENNA_PORT = 0x12, - EXT_ATE_SET_SLOT_TIME = 0x13, - EXT_ATE_CFG_THERMAL_ONOFF = 0x14, - EXT_ATE_SET_TX_POWER_CONTROL_ALL_RF = 0x15, - EXT_ATE_GET_RATE_POWER_OFFSET = 0x16, - EXT_ATE_SET_SINGLE_SKU = 0x18, - EXT_ATE_SET_POWER_PERCENTAGE = 0x19, - EXT_ATE_SET_BF_BACKOFF = 0x1a, - EXT_ATE_SET_POWER_PERCENTAGE_LEVEL = 0x1b, - EXT_ATE_SET_CLEAN_PERSTA_TXQUEUE = 0x1c, -}; - -typedef struct GNU_PACKED _EXT_EVENT_ATE_TEST_MODE_T { - UINT8 ucAteIdx; - UINT8 aucReserved[3]; - UINT8 aucAteResult[0]; -} EXT_EVENT_ATE_TEST_MODE_T, *P_EXT_EVENT_ATE_TEST_MODE_T; - -typedef struct _GET_FREQ_OFFSET_T { - UINT32 u4FreqOffset; -} GET_FREQ_OFFSET_T, *P_GET_FREQ_OFFSET_T; - -typedef struct _GET_TSSI_STATUS_T { - UINT8 ucEnable; - UINT8 ucBand; - UINT8 aucReserved[2]; -} GET_TSSI_STATUS_T, *P_GET_TSSI_STATUS_T; - -typedef struct _GET_DPD_STATUS_T { - UINT8 ucEnable; - UINT8 ucBand; - UINT8 aucReserved[2]; -} GET_DPD_STATUS_T, *P_GET_DPD_STATUS_T; - -typedef struct _GET_THERMO_COMP_STATUS_T { - UINT8 ucEnable; - UINT8 aucReserved[3]; -} GET_THERMO_COMP_STATUS_T, *P_GET_THERMO_COMP_STATUS_T; - -typedef struct GNU_PACKED _EVENT_EXT_GET_FREQOFFSET_T { - UINT8 ucAteTestModeEn; - UINT8 ucAteIdx; - UINT8 aucReserved[2]; - UINT32 u4FreqOffset; -} EVENT_EXT_GET_FREQOFFSET_T; - -typedef struct _ATE_TEST_SET_TX_STREAM_T { - UINT8 ucStreamNum; - UINT8 ucBand; - UINT8 aucReserved[2]; -} ATE_TEST_SET_TX_STREAM_T, *P_ATE_TEST_SET_TX_STREAM_T; - -typedef struct _ATE_TEST_SET_RX_FILTER_T { - UINT8 ucPromiscuousMode; - UINT8 ucReportEn; - UINT8 ucBand; - UINT8 ucReserved; - UINT32 u4FilterMask; - UINT8 aucReserved[4]; -} ATE_TEST_SET_RX_FILTER_T, *P_ATE_TEST_SET_RX_FILTER_T; - -typedef struct _ATE_TEST_SET_RX_PATH_T { - UINT8 ucType; - UINT8 ucBand; - UINT8 aucReserved[2]; -} ATE_TEST_SET_RX_PATH_T, *P_ATE_TEST_SET_RX_PATH_T; - -typedef struct _ATE_TEST_SET_TRX_T { - UINT8 ucType; - UINT8 ucEnable; - UINT8 ucBand; - UINT8 ucReserved; -} ATE_TEST_SET_TRX_T, *P_ATE_TEST_SET_TRX_T; - -typedef struct _RF_TEST_ON_OFF_SETTING_T { - UINT8 ucEnable; - UINT8 ucBand; - UINT8 aucReserved[2]; -} RF_TEST_ON_OFF_SETTING_T, *P_RF_TEST_ON_OFF_SETTING_T; - -typedef struct _CFG_RX_FILTER_PKT_LEN_T { - UINT8 ucEnable; - UINT8 ucBand; - UINT8 aucReserved[2]; - UINT32 u4RxPktLen; -} RX_FILTER_PKT_LEN_T, *P_RX_FILTER_PKT_LEN_T; - -typedef struct _CFG_PHY_SETTING_RXV_IDX_T { - UINT8 ucValue1; - UINT8 ucValue2; - UINT8 ucDbdcIdx; - UINT8 ucReserved; -} CFG_PHY_SETTING_RXV_IDX_T, *P_CFG_PHY_SETTING_RXV_IDX_T; - -typedef struct _CFG_PHY_SETTING_RSSI_PATH_T { - UINT8 ucValue; - UINT8 ucDbdcIdx; - UINT8 aucReserved[2]; -} CFG_PHY_SETTING_RSSI_PATH_T, *P_CFG_PHY_SETTING_RSSI_PATH_T; - -typedef struct _CFG_RF_ANT_PORT_SETTING_T { - UINT8 ucRfModeMask; - UINT8 ucRfPortMask; - UINT8 ucAntPortMask; - UINT8 aucReserved[1]; -} CFG_RF_ANT_PORT_SETTING_T, *P_CFG_RF_ANT_PORT_SETTING_T; - -typedef struct _ATE_TEST_SET_CLEAN_PERSTA_TXQUEUE_T { - BOOLEAN fgStaPauseEnable; - UINT8 ucStaID; - UINT8 ucBand; - UINT8 aucReserved[1]; -} ATE_TEST_SET_CLEAN_PERSTA_TXQUEUE_T, *P_ATE_TEST_SET_CLEAN_PERSTA_TXQUEUE_T; - -typedef struct GNU_PACKED _EXT_CMD_ATE_TEST_MODE_T { - UINT8 ucAteTestModeEn; - UINT8 ucAteIdx; - UINT8 aucReserved[2]; - union { - UINT32 u4Data; - ATE_TEST_SET_TRX_T rAteSetTrx; - ATE_TEST_SET_RX_PATH_T rAteSetRxPath; - ATE_TEST_SET_RX_FILTER_T rAteSetRxFilter; - ATE_TEST_SET_TX_STREAM_T rAteSetTxStream; - RF_TEST_ON_OFF_SETTING_T rCfgOnOff; - RX_FILTER_PKT_LEN_T rRxFilterPktLen; - CFG_PHY_SETTING_RXV_IDX_T rSetRxvIdx; - CFG_PHY_SETTING_RSSI_PATH_T rSetFagcRssiPath; - RF_TEST_ON_OFF_SETTING_T rPhyStatusCnt; - CFG_RF_ANT_PORT_SETTING_T rCfgRfAntPortSetting; - CMD_SLOT_TIME_SET_T rSlotTimeSet; - CMD_POWER_PWERCENTAGE_LEVEL_SET_T rPowerLevelSet; - ATE_TEST_SET_CLEAN_PERSTA_TXQUEUE_T rAteSetCleanPerStaTxQueue; - } Data; -} EXT_CMD_ATE_TEST_MODE_T, *P_EXT_CMD_ATE_TEST_MODE_T; -#endif /* CONFIG_HW_HAL_OFFLOAD */ - -typedef struct GNU_PACKED _CMD_MCU_CLK_SWITCH_DISABLE_T { - UINT8 disable; - UINT8 aucReserved[3]; -} CMD_MCU_CLK_SWITCH_DISABLE_T, *P_CMD_MCU_CLK_SWITCH_DISABLE_T; - -typedef struct GNU_PACKED _EXT_CMD_SNIFFER_MODE_T { - UINT8 ucSnifferEn; - UINT8 ucDbdcIdx; - UINT8 aucReserved[6]; -} EXT_CMD_SNIFFER_MODE_T, *P_EXT_CMD_SNIFFER_MODE_T; - -typedef struct GNU_PACKED _EXT_CMD_TR_STREAM_T { - UINT16 u2Tag; /* EXT_CMD_TAG_TR_STREAM */ - UINT16 u2TRStreamNum; /* [31..16] Tx:1/Rx:0, [15..0] s1:0/s2:1/s3:2 */ -} EXT_CMD_TR_STREAM_T, *P_EXT_CMD_TR_STREAM_T; - -typedef struct GNU_PACKED _EXT_CMD_BA_CONTROL_T { - UINT16 u2Tag; /* EXT_CMD_TAG_UPDATE_BA */ - BOOLEAN bIsAdd; /* BOOLEAN in host is 1Byte */ - UINT8 ucWcid; - UINT8 ucTid; - UINT8 ucBaWinSize; - UINT8 ucBaSessionType; - UINT8 aucPeerAddr[MAC_ADDR_LEN]; - UINT16 u8Sn; - UINT8 aucRsv[1]; -} EXT_CMD_CONTROL_BA_T, *P_EXT_CMD_CONTROL_BA_T; - -#define MT_UPLOAD_FW_UNIT (1024 * 4) - -#define CMD_EDCA_AIFS_BIT (1 << 0) -#define CMD_EDCA_WIN_MIN_BIT (1 << 1) -#define CMD_EDCA_WIN_MAX_BIT (1 << 2) -#define CMD_EDCA_TXOP_BIT (1 << 3) -#define CMD_EDCA_ALL_BITS \ - (CMD_EDCA_AIFS_BIT | CMD_EDCA_WIN_MIN_BIT | CMD_EDCA_WIN_MAX_BIT | \ - CMD_EDCA_TXOP_BIT) - -#define CMD_EDCA_AC_MAX 4 - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -typedef enum _ENUM_HW_TX_QUE_T { - TX_Q_AC0 = 0, - TX_Q_AC1, - TX_Q_AC2, - TX_Q_AC3, - TX_Q_AC10, - TX_Q_AC11, - TX_Q_AC12, - TX_Q_AC13, - TX_Q_AC20, - TX_Q_AC21, - TX_Q_AC22, - TX_Q_AC23, - TX_Q_AC30, - TX_Q_AC31, - TX_Q_AC32, - TX_Q_AC33, - TX_Q_ALTX0, - TX_Q_BMC, - TX_Q_BCN, - TX_Q_PSMP, - TX_Q_ALTX1, - TX_Q_BMC1, - TX_Q_BCN1, - TX_Q_PSMP1, - HW_TX_QUE_NUM -} ENUM_HW_TX_QUE_T; -#else -typedef enum _ENUM_HW_TX_QUE_T { - TX_Q_AC0 = 0, - TX_Q_AC1, - TX_Q_AC2, - TX_Q_AC3, - TX_Q_AC4, - TX_Q_AC5, - TX_Q_AC6, - TX_Q_BCN, - TX_Q_BMC, - TX_Q_AC10, - TX_Q_AC11, - TX_Q_AC12, - TX_Q_AC13, - TX_Q_AC14, - HW_TX_QUE_NUM -} ENUM_HW_TX_QUE_T; -#endif /* defined(MT7615) || defined(MT7622) */ - -typedef struct _TX_AC_PARAM_T { - UINT8 ucAcNum; - UINT8 ucVaildBit; - UINT8 ucAifs; - UINT8 ucWinMin; - UINT16 u2WinMax; - UINT16 u2Txop; - -} TX_AC_PARAM_T, *P_TX_AC_PARAM_T; - -enum { EDCA_ACT_SET, EDCA_ACT_GET, EDCA_ACT_MAX }; - -typedef struct GNU_PACKED _CMD_EDCA_SET_T { - UINT8 ucTotalNum; - UINT8 ucAction; - UINT8 aucReserve[2]; - TX_AC_PARAM_T rAcParam[HW_TX_QUE_NUM]; - -} CMD_EDCA_SET_T, CMD_EDCA_CTRL_T, *P_CMD_EDCA_CTRL_T, MT_EDCA_CTRL_T; - -typedef struct GNU_PACKED _WIFI_EVENT_MUAR_T { - UINT8 ucEntryCnt; - UINT8 ucAccessMode; - UINT8 aucReserved[2]; - UINT32 u4Status; -} WIFI_EVENT_MUAR_T, *P_WIFI_EVENT_MUAR_T; - -typedef struct GNU_PACKED _WIFI_EVENT_MUAR_MULTI_RW_T { - UINT8 ucEntryIdx; - UINT8 ucReserved; - UINT8 aucMacAddr[6]; - -} WIFI_EVENT_MUAR_MULTI_RW_T, *P_WIFI_EVENT_MUAR_MULTI_RW_T; - -typedef struct GNU_PACKED _EXT_CMD_MUAR_MULTI_ENTRY_T { - UINT8 ucMuarIdx; - UINT8 ucBssid; - UINT8 aucMacAddr[6]; -} EXT_CMD_MUAR_MULTI_ENTRY_T, *P_EXT_CMD_MUAR_MULTI_ENTRY_T; - -typedef enum _MUAR_MODE { - MUAR_NORMAL = 0, - MUAR_REPEATER, - MUAR_HASH, - MUAR_MAX -} MUAR_MODE; - -typedef enum _MUAR_ACCESS_MODE { - MUAR_READ = 0, - MUAR_WRITE, -} _MUAR_ACCESS_MODE; - -typedef struct GNU_PACKED _EXT_CMD_MUAR_T { - UINT8 ucMuarModeSel; - UINT8 ucForceClear; - UINT8 ausClearBitmap[8]; - UINT8 ucEntryCnt; - UINT8 ucAccessMode; /* 0:read, 1:write */ -} EXT_CMD_MUAR_T, *P_EXT_CMD_MUAR_T; - -typedef struct GNU_PACKED _EXT_CMD_TRGR_PRETBTT_INT_EVENT_T { - UINT8 ucHwBssidIdx; - UINT8 ucExtBssidIdx; - UINT8 ucEnable; - UINT8 aucReserved1[1]; - - UINT16 u2BcnPeriod; - UINT8 aucReserved2[2]; - -} CMD_TRGR_PRETBTT_INT_EVENT_T, *P_CMD_TRGR_PRETBTT_INT_EVENT_T; - -typedef struct GNU_PACKED _EXT_CMD_FD_FRAME_OFFLOAD_T { - UINT8 ucOwnMacIdx; - UINT8 ucEnable; - UINT8 ucWlanIdx; - UINT8 ucBandIdx; - - UINT16 u2PktLength; - UINT16 u2TimestampFieldPos; - - UINT8 acPktContent[1520]; -} CMD_FD_FRAME_OFFLOAD_T, *P_CMD_FD_FRAME_OFFLOAD_T; - -typedef struct GNU_PACKED _EXT_CMD_BCN_OFFLOAD_T { - UINT8 ucOwnMacIdx; - UINT8 ucEnable; - UINT8 ucWlanIdx; - UINT8 ucBandIdx; /* 0: band 0, 1: band 1 */ - - UINT8 ucPktType; /* 0: Bcn, 1: Tim Frame. */ - BOOLEAN fgNeedPretbttIntEvent; - UINT16 u2CsaIePos; /* CSA IE position */ - - UINT16 u2PktLength; - UINT16 u2TimIePos; /* Tim IE position in pkt. */ - - /* add bcn v2 support , 1.5k beacon support */ -#ifdef BCN_V2_SUPPORT - UINT8 acPktContent - [1520]; /* whole pkt template length which include TXD, max shall not exceed 1520 bytes. */ -#else - UINT8 acPktContent - [512]; /* whole pkt template length which include TXD, max shall not exceed 512 bytes. */ -#endif - UINT8 ucCsaCount; /* count down value of CSA IE */ - UINT8 aucReserved[3]; -} CMD_BCN_OFFLOAD_T, *P_CMD_BCN_OFFLOAD_T; - -typedef struct _EXT_EVENT_PRETBTT_INT_T { - UINT8 ucHwBssidIdx; - UINT8 aucReserved[3]; -} EXT_EVENT_PRETBTT_INT_T, *P_EXT_EVENT_PRETBTT_INT_T; - -enum _TMR_CTRL_TYPE_T { SET_TMR_ENABLE = 0x00, TMR_CALIBRATION = 0x01 }; - -typedef struct GNU_PACKED _CMD_TMR_CTRL_T { - UINT8 ucTmrCtrlType; - UINT8 ucTmrVer; - UINT8 aucReserved[2]; - UINT8 pTmrCtrlPayload[]; -} CMD_TMR_CTRL_T, *P_CMD_TMR_CTRL_T; - -typedef struct GNU_PACKED _TMR_CTRL_SET_TMR_EN_T { - UINT8 ucEnable; - UINT8 ucRole; - UINT8 ucReserved; - UINT8 ucDbdcIdx; - UINT8 aucType_Subtype[4]; -} TMR_CTRL_SET_TMR_EN_T, *P_TMR_CTRL_SET_TMR_EN_T; - -typedef struct GNU_PACKED _CMD_SET_THERMO_CAL_T { - UINT8 ucEnable; - UINT8 ucSourceMode; - UINT8 ucRFDiffTemp; - UINT8 ucHiBBPHT; - UINT8 ucHiBBPNT; - INT8 cLoBBPLT; - INT8 cLoBBPNT; - UINT8 ucReserve; - BIN_CONTENT_T ucThermoSetting[3]; -} CMD_SET_THERMO_CAL_T, *P_CMD_SET_THERMO_CAL_T; - -#ifdef MT_WOW_SUPPORT -enum ENUM_PACKETFILTER_TYPE { - _ENUM_TYPE_MAGIC = 0, - _ENUM_TYPE_BITMAP = 1, - _ENUM_TYPE_ARPNS = 2, - _ENUM_TYPE_GTK_REKEY = 3, - _ENUM_TYPE_CF = 4, - _ENUM_TYPE_GLOBAL_EN = 5, - _ENUM_TYPE_TCP_SYN = 6, - _ENUM_TYPE_DETECTION_MASK = 7, -}; - -enum ENUM_FUNCTION_SELECT { - _ENUM_PF = 0, - _ENUM_GLOBAL_MAGIC = 1, - _ENUM_GLOBAL_BITMAP = 2, - _ENUM_GLOBAL_EAPOL = 3, - _ENUM_GLOBAL_TDLS = 4, - _ENUM_GLOBAL_ARPNS = 5, - _ENUM_GLOBAL_CF = 6, - _ENUM_GLOBAL_MODE = 7, - _ENUM_GLOBAL_BSSID = 8, - _ENUM_GLOBAL_MGMT = 9, - _ENUM_GLOBAL_BMC_DROP = 10, - _ENUM_GLOBAL_UC_DROP = 11, - _ENUM_GLOBAL_ALL_TOMCU = 12, - _ENUM_GLOBAL_WOW_EN = 16, -}; - -enum ENUM_PF_MODE_T { - PF_MODE_WHITE_LIST = 0, - PF_MODE_BLACK_LIST = 1, - PF_MODE_NUM -}; - -enum ENUM_PF_BSSID_IDX_T { - PF_BSSID_DISABLE = 0, - PF_BSSID_0 = (1 << 0), - PF_BSSID_1 = (1 << 1), - PF_BSSID_2 = (1 << 2), - PF_BSSID_3 = (1 << 3), -}; - -enum ENUM_PF_BAND_IDX_T { - PF_BAND_0 = 0, - PF_BAND_1 = 1, -}; - -enum ENUM_PF_WAP_VER_T { - PF_WPA = 0, - PF_WPA2 = 1, -}; - -enum ENUM_PF_WMM_IDX_T { - PF_WMM_0 = 0, - PF_WMM_1 = 1, - PF_WMM_2 = 2, - PF_WMM_3 = 3, -}; - -enum ENUM_PF_ARPNS_SET_T { - PF_ARP_NS_SET_0 = 0, - PF_ARP_NS_SET_1 = 1, -}; - -enum ENUM_PF_ARPNS_ENSABLE_T { - PF_ARP_NS_DISABLE = 0, - PF_ARP_NS_ENABLE = 1, -}; - -enum ENUM_PF_ARPNS_OFFLOAD_TYPE_T { - PF_ARP_OFFLOAD = 0, - PF_NS_OFFLOAD = 1, -}; - -enum ENUM_PF_ARPNS_PKT_TYPE_T { - PF_ARP_NS_UC_PKT = (1 << 0), - PF_ARP_NS_BC_PKT = (1 << 1), - PF_ARP_NS_MC_PKT = (1 << 2), - PF_ARP_NS_ALL_PKT = ((1 << 0) | (1 << 1) | (1 << 2)), -}; - -typedef struct GNU_PACKED _CMD_PACKET_FILTER_WAKEUP_OPTION_T { - UINT32 WakeupInterface; - UINT32 GPIONumber; - UINT32 GPIOTimer; - UINT32 GpioParameter; -} CMD_PACKET_FILTER_WAKEUP_OPTION_T, *P_CMD_PACKET_FILTER_WAKEUP_OPTION_T; - -typedef struct GNU_PACKED _CMD_PACKET_FILTER_GLOBAL_T { - UINT32 PFType; - UINT32 FunctionSelect; - UINT32 Enable; - UINT32 Band; -} CMD_PACKET_FILTER_GLOBAL_T, *P_CMD_PACKET_FILTER_GLOBAL_T; - -typedef struct GNU_PACKED _CMD_PACKET_FILTER_MAGIC_PACKET_T { - UINT32 PFType; - UINT32 BssidEnable; -} CMD_PACKET_FILTER_MAGIC_PACKET_T, *P_CMD_PACKET_FILTER_MAGIC_PACKET_T; - -typedef struct GNU_PACKED _CMD_PACKET_FILTER_BITMAP_PATTERN_T { - UINT32 PFType; - UINT32 Index; - UINT32 Enable; - UINT32 BssidEnable; - UINT32 Offset; - UINT32 FeatureBits; - UINT32 Resv; - UINT32 PatternLength; - UINT32 Mask[4]; - UINT32 Pattern[32]; -} CMD_PACKET_FILTER_BITMAP_PATTERN_T, *P_CMD_PACKET_FILTER_BITMAP_PATTERN_T; - -typedef struct GNU_PACKED _CMD_PACKET_FILTER_ARPNS_T { - UINT32 PFType; - UINT32 IPIndex; - UINT32 Enable; - UINT32 BssidEnable; - UINT32 Offload; - UINT32 Type; - UINT32 FeatureBits; - UINT32 Resv; - UINT8 IPAddress[16]; -} CMD_PACKET_FILTER_ARPNS_T, *P_CMD_PACKET_FILTER_ARPNS_T; - -typedef struct GNU_PACKED _CMD_PACKET_FILTER_GTK_T { - UINT32 PFType; - UINT32 WPAVersion; - UINT32 PTK[16]; - UINT32 ReplayCounter[2]; - UINT32 PairKeyIndex; - UINT32 GroupKeyIndex; - UINT32 BssidIndex; - UINT32 OwnMacIndex; - UINT32 WmmIndex; - UINT32 Resv1; -} CMD_PACKET_FILTER_GTK_T, *P_CMD_PACKET_FILTER_GTK_T; - -typedef struct GNU_PACKED _CMD_PACKET_FILTER_COALESCE_T { - UINT32 PFType; - UINT32 FilterID; - UINT32 Enable; - UINT32 BssidEnable; - UINT32 PacketType; - UINT32 CoalesceOP; - UINT32 FeatureBits; - UINT8 Resv; - UINT8 FieldLength; - UINT8 CompareOP; - UINT8 FieldID; - UINT32 Mask[2]; - UINT32 Pattern[4]; -} CMD_PACKET_FILTER_COALESCE_T, *P_CMD_PACKET_FILTER_COALESCE_T; - -typedef struct GNU_PACKED _CMD_PACKET_TCPSYN_T { - UINT32 PFType; - UINT32 AddressType; - UINT32 Enable; - UINT32 BssidEnable; - UINT32 PacketType; - UINT32 FeatureBits; - UINT32 TCPSrcPort; - UINT32 TCPDstPort; - UINT32 SourceIP[4]; - UINT32 DstIP[4]; -} CMD_PACKET_FILTER_TCPSYN_T, *P_CMD_PACKET_FILTER_TCPSYN_T; - -typedef struct GNU_PACKED _EXT_EVENT_PF_GENERAL_T { - UINT32 u4PfCmdType; - UINT32 u4Status; - UINT32 u4Resv; -} EXT_EVENT_PF_GENERAL_T, *P_EXT_EVENT_PF_GENERAL_T; - -typedef struct GNU_PACKED _EXT_EVENT_WAKEUP_OPTION_T { - UINT32 u4PfCmdType; - UINT32 u4Status; -} EXT_EVENT_WAKEUP_OPTION_T, *P_EXT_EVENT_WAKEUP_OPTION_T; -#endif - -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) -typedef struct GNU_PACKED _EXT_CMD_NOA_CTRL_T { - UINT8 ucMode0; - UINT8 acuReserved0[3]; - - UINT8 ucMode1; - UINT8 acuReserved1[3]; - - UINT8 ucMode2; - UINT8 acuReserved2[3]; - - UINT8 ucMode3; - UINT8 acuReserved3[3]; -} EXT_CMD_NOA_CTRL_T, *P_EXT_CMD_NOA_CTRL_T; - -#endif /* defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) */ -#ifdef CFG_TDLS_SUPPORT -typedef struct GNU_PACKED _EXT_CMD_CFG_TDLS_CHSW_T { - /* UINT8 ucCmd; */ - UINT8 ucOffPrimaryChannel; - UINT8 ucOffCenterChannelSeg0; - UINT8 ucOffCenterChannelSeg1; - UINT8 ucOffBandwidth; - UINT32 u4StartTimeTsf; - UINT32 u4SwitchTime; /* us */ - UINT32 u4SwitchTimeout; /* us */ - UINT8 ucRole; - UINT8 ucBssIndex; - UINT8 Reserved[4]; - -} EXT_CMD_CFG_TDLS_CHSW_T, *P_EXT_CMD_CFG_TDLS_CHSW_T; -#endif /*CFG_TDLS_SUPPORT*/ - -/* -CMD prototype structure -*/ -typedef struct _MT_RF_REG_PAIR { - UINT8 WiFiStream; - UINT32 Register; - UINT32 Value; -} MT_RF_REG_PAIR; - -typedef struct _MT_PWR_MGT_BIT_WIFI_T { - UINT8 ucWlanIdx; - UINT8 ucPwrMgtBit; -} MT_PWR_MGT_BIT_WIFI_T, *PMT_PWR_MGT_BIT_WIFI_T; - -typedef struct _MT_STA_CFG_PTR_T { - struct _STA_ADMIN_CONFIG *pStaCfg; -} MT_STA_CFG_PTR_T, *PMT_STA_CFG_PTR_T; - -typedef struct _PSM_BIT_CTRL_T { - struct _STA_ADMIN_CONFIG *pStaCfg; - USHORT psm_val; -} PSM_BIT_CTRL_T, *PPSM_BIT_CTRL_T; - -typedef struct _RADIO_ON_OFF_T { - UINT8 ucDbdcIdx; - UINT8 ucRadio; -} RADIO_ON_OFF_T, *PRADIO_ON_OFF_T; - -typedef struct _GREENAP_ON_OFF_T { - UINT8 ucDbdcIdx; - BOOLEAN ucGreenAPOn; -} GREENAP_ON_OFF_T, *PGREENAP_ON_OFF_T; - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -typedef struct _PCIE_ASPM_DYM_CTRL_T { - UINT8 ucDbdcIdx; - BOOLEAN fgL1Enable; - BOOLEAN fgL0sEnable; -} PCIE_ASPM_DYM_CTRL_T, *P_PCIE_ASPM_DYM_CTRL_T; -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -typedef struct { - UINT8 PmNumber; - UINT8 PmState; - UINT8 Bssid[6]; - UINT8 DtimPeriod; - UINT8 WlanIdx; - UINT16 BcnInterval; - UINT32 Aid; - UINT8 OwnMacIdx; - UINT8 BcnLossCount; - UINT8 DbdcIdx; - UINT8 WmmIdx; -} MT_PMSTAT_CTRL_T; - -typedef struct { - UINT8 ucDbdcIdx; - BOOLEAN ucGreenAPOn; -} MT_GREENAP_CTRL_T; - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -typedef struct { - UINT8 ucDbdcIdx; - BOOLEAN fgL1Enable; - BOOLEAN fgL0sEnable; -} MT_PCIE_ASPM_DYM_CTRL_T; -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -typedef struct { - UCHAR Channel; - UCHAR Bw; - UCHAR CentralSeg0; - UCHAR CentralSeg1; - UCHAR Role; - USHORT StayTime; - UCHAR OwnMACAddressIdx; - UCHAR WlanIdx; - UCHAR BssIdx; - UCHAR WmmIdx; -} MT_MCC_ENTRT_T; - -/* #ifdef ERR_RECOVERY */ -typedef struct _GENERAL_TEST_SIM_ERR_SWITCH_ON_OFF_T { - BOOLEAN ucSwitchMode; - UINT8 ucReserved[3]; -} GENERAL_TEST_SIM_ERR_SWITCH_ON_OFF_T, *P_GENERAL_TEST_SIM_ERR_SWITCH_ON_OFF_T; - -typedef struct _GENERAL_TEST_SIM_ERR_DET_RECOVERY_T { - UINT8 ucModule; - UINT8 ucSubModule; - UINT8 ucReserved[2]; -} GENERAL_TEST_SIM_ERR_DET_RECOVERY_T, *P_GENERAL_TEST_SIM_ERR_DET_RECOVERY_T; - -typedef struct GNU_PACKED _EXT_CMD_GENERAL_TEST_T { - UINT8 ucCategory; - UINT8 ucAction; - UINT8 ucDiaglogToken; - UINT8 ucReserved; - - union { - /* for category = GENERAL_TEST_CATEGORY_SIM_ERROR_DETECTION - * and ucAction = GENERAL_TEST_ACTION_SWITCH_ON_OFF - */ - GENERAL_TEST_SIM_ERR_SWITCH_ON_OFF_T - rGeneralTestSimErrorSwitchOnOff; - - /* for category = GENERAL_TEST_CATEGORY_SIM_ERROR_DETECTION - * and ucAction = GENERAL_TEST_ACTION_RECOVERY - */ - GENERAL_TEST_SIM_ERR_DET_RECOVERY_T - rGeneralTestSimErrDetRecovery; - } Data; -} EXT_CMD_GENERAL_TEST_T, *P_EXT_CMD_GENERAL_TEST_T; - -#define GENERAL_TEST_CATEGORY_NON (0x0) -#define GENERAL_TEST_CATEGORY_SIM_ERROR_DETECTION (0x1) -#define GENERAL_TEST_CATEGORY_APPWS (0x2) - -#define GENERAL_TEST_ACTION_NON (0x0) -#define GENERAL_TEST_ACTION_SWITCH_ON_OFF (0x1) -#define GENERAL_TEST_ACTION_RECOVERY (0x2) - -#define GENERAL_TEST_MODULE_NON (0x0) -#define GENERAL_TEST_MODULE_LMAC (0x1) -#define GENERAL_TEST_MODULE_UMAC (0x2) -#define GENERAL_TEST_MODULE_HIF (0x3) -#define GENERAL_TEST_MODULE_MCU (0x4) - -#define GENERAL_TEST_SUBMOD_LMAC_NON (0x0) -#define GENERAL_TEST_SUBMOD_LMAC_TXRXR (0x1) -#define GENERAL_TEST_SUBMOD_LMAC_TX (0x2) -#define GENERAL_TEST_SUBMOD_LMAC_RX (0x3) -#define GENERAL_TEST_SUBMOD_UMAC_NON (0x0) -#define GENERAL_TEST_SUBMOD_UMAC_RESET (0x1) -#define GENERAL_TEST_SUBMOD_HIF_NON (0x0) -#define GENERAL_TEST_SUBMOD_HIF_PDMA0 (0x1) -#define GENERAL_TEST_SUBMOD_HIF_PDMA1 (0x2) -#define GENERAL_TEST_SUBMOD_HIF_PDMA2 (0x3) -/*#endif */ /* ERR_RECOVERY */ - -/* Action ID of Category GENERAL_TEST_CATEGORY_APPWS */ -#define APPWS_ACTION_DUMP_INFO 0 - -#define SER_ACTION_QUERY 0 -#define SER_ACTION_SET 1 -#define SER_ACTION_SET_ENABLE_MASK 2 -#define SER_ACTION_RECOVER 3 - -/* SER_ACTION_SET sub action */ -#define SER_SET_DISABLE 0 -#define SER_SET_ENABLE 1 - -/* SER_ACTION_SET_ENABLE_MASK mask define */ -#define SER_ENABLE_TRACKING BIT(0) -#define SER_ENABLE_RECOVER_L1 BIT(1) -#define SER_ENABLE_RECOVER_L2 BIT(2) -#define SER_ENABLE_RECOVER_L3 BIT(3) -#define SER_ENABLE_RECOVER_L4 BIT(4) -#define SER_ENABLE_RECOVER_BF BIT(5) - -/* SER_ACTION_RECOVER recover method */ -#define SER_SET_LEVEL_0_RECOVER 0 -#define SER_SET_LEVEL_1_RECOVER 1 -#define SER_SET_LEVEL_2_RECOVER 2 -#define SER_SET_LEVEL_3_RECOVER 3 -#define SER_SET_LEVEL_4_RECOVER 4 -#define SER_SET_BF_RECOVER 5 - -typedef struct GNU_PACKED _EXT_CMD_SER_T { - UINT8 action; - UINT8 ser_set; - UINT8 ucReserve[2]; -} EXT_CMD_SER_T, *P_EXT_CMD_SER_T; - -#ifdef DBDC_MODE - -typedef enum { - DBDC_TYPE_WMM = 0, - DBDC_TYPE_MGMT, - DBDC_TYPE_BSS, - DBDC_TYPE_MBSS, - DBDC_TYPE_REPEATER, - DBDC_TYPE_MU, - DBDC_TYPE_BF, - DBDC_TYPE_PTA, -} DBDC_TYPE; - -typedef struct _BAND_CTRL_ENTRY_T { - UINT8 ucType; - UINT8 ucIndex; - UINT8 ucBandIdx; - UINT8 ucReserve; -} BAND_CTRL_ENTRY_T, *P_BAND_CTRL_ENTRY_T; - -typedef struct GNU_PACKED _EXT_CMD_DBDC_CTRL_T { - UINT8 ucDbdcEnable; - UINT8 ucTotalNum; - UINT8 aucReserved[2]; - BAND_CTRL_ENTRY_T aBCtrlEntry[64]; -} EXT_CMD_DBDC_CTRL_T, *P_EXT_CMD_DBDC_CTRL_T, EXT_EVENT_DBDC_CTRL_T, - *P_EXT_EVENT_DBDC_CTRL_T; - -#endif /*DBDC_MODE*/ - -enum { - MAC_INFO_TYPE_RESERVE = 0, - MAC_INFO_TYPE_CHANNEL_BUSY_CNT = 0x1, - MAC_INFO_TYPE_TSF = 0x2, - MAC_INFO_TYPE_MIB = 0x3, - MAC_INFO_TYPE_EDCA = 0x4, - MAC_INFO_TYPE_WIFI_INT_CNT = 0x5, -}; - -/*MAC INFO ID: Get Channel Busy Cnt (0x01)*/ -typedef struct _EXTRA_ARG_CH_BUSY_CNT_T { - UINT8 ucBand; - UINT8 aucReserved[3]; -} EXTRA_ARG_CH_BUSY_CNT_T, *P_EXTRA_ARG_CH_BUSY_CNT_T; - -/*MAC INFO ID: Get TSF (0x02)*/ -typedef struct _EXTRA_ARG_TSF_T { - UINT8 ucHwBssidIndex; - UINT8 aucReserved[3]; -} EXTRA_ARG_TSF_T, *P_EXTRA_ARG_TSF_T; - -/*MAC INFO ID: EDCA (0x04)*/ -typedef struct _EXTRA_ARG_EDCA_T { - UINT8 ucTotalAcNum; - UINT8 aucReserved[3]; - UINT32 au4AcIndex[HW_TX_QUE_NUM]; -} EXTRA_ARG_EDCA_T, *P_EXTRA_ARG_EDCA_T; - -/* MAC INFO ID: Get wifi interrupt counter (0x05)*/ -typedef struct _EXTRA_ARG_WF_INTERRUPT_CNT_T { - UINT8 ucBand; - UINT8 ucWifiInterruptNum; - UINT8 aucReserved[2]; - UINT32 u4WifiInterruptMask; -} EXTRA_ARG_WF_INTERRUPT_CNT_T, *P_EXTRA_ARG_WF_INTERRUPT_CNT_T; - -typedef union { - EXTRA_ARG_CH_BUSY_CNT_T ChBusyCntArg; - EXTRA_ARG_TSF_T TsfArg; - EXTRA_ARG_EDCA_T EdcaArg; - EXTRA_ARG_WF_INTERRUPT_CNT_T WifiInterruptCntArg; -} EXTRA_ARG_MAC_INFO_T; - -typedef struct GNU_PACKED _EXT_CMD_GET_MAC_INFO_T { - UINT16 u2MacInfoId; - UINT8 aucReserved[2]; - EXTRA_ARG_MAC_INFO_T aucExtraArgument; -} EXT_CMD_GET_MAC_INFO_T, *P_EXT_CMD_GET_MAC_INFO_T; - -/*MacInfo ID: Get Channel Busy Cnt(0x01) */ -typedef struct _GET_CH_BUSY_CNT_T { - UINT32 u4ChBusyCnt; -} GET_CH_BUSY_CNT_T, *P_GET_CH_BUSY_CNT_T; - -/*MacInfo ID: 0x02 TSF*/ -typedef struct _TSF_RESULT_T { - UINT32 u4TsfBit0_31; - UINT32 u4TsfBit63_32; -} TSF_RESULT_T, *P_TSFRESULT_T; - -/* MacInfo ID: 0x05 Get wifi interrupt counter */ -typedef struct _GET_WF_INTERRUPT_CNT_T { - UINT8 ucWifiInterruptNum; - UINT8 aucReserved[3]; - UINT32 u4WifiInterruptCounter[0]; -} GET_WF_INTERRUPT_CNT_T, *P_WF_INTERRUPT_CNT_T; - -/*MacInfo ID: 0x04 EDCA*/ -typedef union { - GET_CH_BUSY_CNT_T ChBusyCntResult; - TSF_RESULT_T TsfResult; - MT_EDCA_CTRL_T EdcaResult; - GET_WF_INTERRUPT_CNT_T WifiIntCntResult; -} MAC_INFO_RESULT_T; - -typedef struct GNU_PACKED _EXT_EVENT_MAC_INFO_T { - UINT16 u2MacInfoId; - UINT8 aucReserved[2]; - MAC_INFO_RESULT_T aucMacInfoResult; -} EXT_EVENT_MAC_INFO_T, *P_EXT_EVENT_MAC_INFO_T; - -typedef enum _ENUM_MAC_ENABLE_CTRL_T { - ENUM_MAC_DISABLE = 0, - ENUM_MAC_ENABLE = 1, - ENUM_MAC_DFS_TXSTART = 2, - MAX_MAC_ENABLE_CTRL_NUM -} ENUM_MAC_ENABLE_CTRL_T, - *P_ENUM_MAC_ENABLE_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_MAC_ENABLE_CTRL_T { - UINT8 ucMacEnable; - UINT8 ucBand; - UINT8 aucReserve[2]; - -} EXT_CMD_MAC_ENABLE_CTRL_T, *P_EXT_CMD_MAC_ENABLE_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_RXV_ENABLE_CTRL_T { - UINT8 ucRxvEnable; - UINT8 ucBandIdx; - UINT8 aucReserve[2]; -} EXT_CMD_RXV_ENABLE_CTRL_T, *P_EXT_CMD_RXV_ENABLE_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_ID_BWF_LWC_ENABLE { - UINT8 ucBwfLwcEnable; /* 0: Disable, 1: Enable */ - UINT8 aucReserve[3]; -} EXT_CMD_ID_BWF_LWC_ENABLE_T, *P_EXT_CMD_ID_BWF_LWC_ENABLE_T; - -#if defined(CONFIG_HOTSPOT_R2) || defined(DSCP_QOS_MAP_SUPPORT) -typedef struct GNU_PACKED _EXT_CMD_ID_HOTSPOT_INFO_UPDATE { - /* hs bss flag */ - UINT8 ucUpdateType; - UINT8 ucHotspotBssFlags; - UINT8 ucHotspotBssId; - /* sta DSCP */ - UINT8 ucStaWcid; - UINT8 ucStaQosMapFlagAndIdx; - /* DSCP pool */ - UINT8 ucPoolID; - UINT8 ucTableValid; - UINT8 ucPoolDscpExceptionCount; - UINT32 u4Ac; - UINT16 au2PoolDscpRange[8]; - UINT16 au2PoolDscpException[21]; -} EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T, *P_EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T; - -#endif /* CONFIG_HOTSPOT_R2 */ - -#if defined(PRE_CAL_TRX_SET1_SUPPORT) || defined(RLM_CAL_CACHE_SUPPORT) || \ - defined(PRE_CAL_TRX_SET2_SUPPORT) -#define RXDCOC_SIZE 256 -#define TXDPD_SIZE 216 -#endif - -#ifdef PRE_CAL_TRX_SET1_SUPPORT -typedef struct _RXDCOC_RESULT_T { - UINT16 u2ChFreq; /* Primary Channel Number */ - UINT8 ucBW; /* 0: BW20, 1: BW40, 2: BW80, 3:BW160 */ - UINT8 ucBand; /* 0: 2.4G, 1: 5G */ - BOOLEAN bSecBW80; /* 0: primary BW80, 1: secondary BW80 - used only in BW160*/ - BOOLEAN ResultSuccess; - UINT8 DBDCEnable; /* 1: DBDC enable, 0: not in DBDC mode */ - UINT8 ucReserved; - - /* WF0 SX0 */ - UINT32 ucDCOCTBL_I_WF0_SX0_LNA[4]; - UINT32 ucDCOCTBL_Q_WF0_SX0_LNA[4]; - /* WF0 SX2 */ - UINT32 ucDCOCTBL_I_WF0_SX2_LNA[4]; - UINT32 ucDCOCTBL_Q_WF0_SX2_LNA[4]; - /* WF1 SX0 */ - UINT32 ucDCOCTBL_I_WF1_SX0_LNA[4]; - UINT32 ucDCOCTBL_Q_WF1_SX0_LNA[4]; - /* WF1 SX2 */ - UINT32 ucDCOCTBL_I_WF1_SX2_LNA[4]; - UINT32 ucDCOCTBL_Q_WF1_SX2_LNA[4]; - /* WF2 SX0 */ - UINT32 ucDCOCTBL_I_WF2_SX0_LNA[4]; - UINT32 ucDCOCTBL_Q_WF2_SX0_LNA[4]; - /* WF2 SX2 */ - UINT32 ucDCOCTBL_I_WF2_SX2_LNA[4]; - UINT32 ucDCOCTBL_Q_WF2_SX2_LNA[4]; - /* WF3 SX0 */ - UINT32 ucDCOCTBL_I_WF3_SX0_LNA[4]; - UINT32 ucDCOCTBL_Q_WF3_SX0_LNA[4]; - /* WF3 SX2 */ - UINT32 ucDCOCTBL_I_WF3_SX2_LNA[4]; - UINT32 ucDCOCTBL_Q_WF3_SX2_LNA[4]; -} RXDCOC_RESULT_T, *P_RXDCOC_RESULT_T; - -typedef struct GNU_PACKED _EXT_CMD_GET_RXDCOC_RESULT_T { - BOOLEAN DirectionToCR; - UINT8 ucDoRuntimeCalibration; - UINT8 aucReserved[2]; - RXDCOC_RESULT_T RxDCOCResult; -} EXT_CMD_GET_RXDCOC_RESULT_T, *P_EXT_CMD_GET_RXDCOC_RESULT_T; - -typedef struct _TXDPD_RESULT_T { - UINT16 u2ChFreq; /* Primary Channel Number */ - UINT8 ucBW; /* 0: BW20, 1: BW40, 2: BW80, 3:BW160 */ - UINT8 ucBand; /* 0: 2.4G, 1: 5G */ - BOOLEAN bSecBW80; /* 0: primary BW80, 1: secondary BW80 - used only in BW160*/ - BOOLEAN ResultSuccess; - UINT8 DBDCEnable; /* 1: DBDC enable, 0: not in DBDC mode */ - UINT8 ucReserved; - /* WF0 */ - UINT32 u4DPDG0_WF0_Prim; - UINT8 ucDPDLUTEntry_WF0_B0_6[16]; /* WF0 entry prim part I */ - UINT8 ucDPDLUTEntry_WF0_B16_23[16]; /* WF0 entry prim part II */ - /* WF1 */ - UINT32 u4DPDG0_WF1_Prim; - UINT8 ucDPDLUTEntry_WF1_B0_6[16]; /* WF1 entry prim part I */ - UINT8 ucDPDLUTEntry_WF1_B16_23[16]; /* WF1 entry prim part II */ - /* WF2 */ - UINT32 u4DPDG0_WF2_Prim; - UINT32 u4DPDG0_WF2_Sec; - UINT8 ucDPDLUTEntry_WF2_B0_6[16]; /* WF2 entry prim part I */ - UINT8 ucDPDLUTEntry_WF2_B16_23[16]; /* WF2 entry prim part II */ - UINT8 ucDPDLUTEntry_WF2_B8_14[16]; /* WF2 entry secondary part I */ - UINT8 ucDPDLUTEntry_WF2_B24_31[16]; /* WF2 entry secondary part II */ - /* WF3 */ - UINT32 u4DPDG0_WF3_Prim; - UINT32 u4DPDG0_WF3_Sec; - UINT8 ucDPDLUTEntry_WF3_B0_6[16]; /* WF3 entry prim part I */ - UINT8 ucDPDLUTEntry_WF3_B16_23[16]; /* WF3 entry prim part II */ - UINT8 ucDPDLUTEntry_WF3_B8_14[16]; /* WF3 entry secondary part I */ - UINT8 ucDPDLUTEntry_WF3_B24_31[16]; /* WF3 entry secondary part II */ -} TXDPD_RESULT_T, *P_TXDPD_RESULT_T; - -typedef struct GNU_PACKED _EXT_CMD_GET_TXDPD_RESULT_T { - BOOLEAN DirectionToCR; - UINT8 ucDoRuntimeCalibration; - UINT8 aucReserved[2]; - TXDPD_RESULT_T TxDpdResult; - -} EXT_CMD_GET_TXDPD_RESULT_T, *P_EXT_CMD_GET_TXDPD_RESULT_T; - -typedef struct GNU_PACKED _EXT_CMD_RDCE_VERIFY_T { - BOOLEAN Result; /* 1 -success ,0 - fail */ - UINT8 ucType; /* 0 - RDCE without compensation , 1 - RDCE with compensation */ - UINT8 ucBW; /* 0: BW20, 1: BW40, 2: BW80, 3:BW160 */ - UINT8 ucBand; /* 0: 2.4G, 1: 5G */ -} EXT_CMD_RDCE_VERIFY_T, *P_EXT_CMD_RDCE_VERIFY_T; - -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) -typedef struct GNU_PACKED _EXT_CMD_GET_PRECAL_RESULT_T { - UINT16 u2PreCalBitMap; - UINT8 ucCalId; - UINT8 aucReserved; -} EXT_CMD_GET_PRECAL_RESULT_T, *P_EXT_CMD_GET_PRECAL_RESULT_T; - -typedef enum _PRE_CAL_TYPE { - PRECAL_TXLPF, - PRECAL_TXIQ, - PRECAL_TXDC, - PRECAL_RXFI, - PRECAL_RXFD -} PRE_CAL_TYPE; -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -typedef struct GNU_PACKED _EXT_CMD_FW_SEND_NULL_FRAME_T { - UINT8 PID; - UINT8 WlanIdx; - UINT8 No_Of_Null_Frames; - UINT8 ucReserve; -} EXT_CMD_FW_SEND_NULL_FRAME_T; - -typedef struct GNU_PACKED _EXT_CMD_THERMAL_RECAL_MODE_CTRL_T { - UINT8 ucMode; - UINT8 aucReserved[3]; -} EXT_CMD_THERMAL_RECAL_MODE_CTRL_T, *P_EXT_CMD_THERMAL_RECAL_MODE_CTRL_T; - -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -typedef struct GNU_PACKED _EXT_CMD_CAL_CTRL_T { - UINT8 ucFuncIndex; - UINT8 aucReserved[3]; - UINT32 u4DataLen; -} EXT_CMD_CAL_CTRL_T, *P_EXT_CMD_CAL_CTRL_T; - -typedef struct GNU_PACKED _EXT_CMD_PA_TRIM_T { - EXT_CMD_CAL_CTRL_T Header; - UINT32 u4Data[4]; -} EXT_CMD_PA_TRIM_T, *P_EXT_CMD_PA_TRIM_T; - -typedef enum { CAL_RESTORE_PA_TRIM = 0x00 } CAL_RESTORE_FUNC_IDX; -#endif /* CAL_BIN_FILE_SUPPORT */ - -enum { - RXHDR_TRANS = 0, - RXHDR_BL = 1, -}; - -typedef struct _EXT_RX_HEADER_TRANSLATE_T { - UINT8 ucOperation; - UINT8 ucEnable; - UINT8 ucCheckBssid; - UINT8 ucInsertVlan; - UINT8 ucRemoveVlan; - UINT8 ucUserQosTid; - UINT8 ucTranslationMode; - UINT8 ucReserve; -} EXT_RX_HEADER_TRANSLATE_T, *P_EXT_RX_HEADER_TRANSLATE_T; - -typedef struct _EXT_RX_HEADER_TRANSLATE_BL_T { - UINT8 ucOperation; - UINT8 ucCount; - UINT8 ucReserv[2]; - UINT8 ucBlackListIndex; - UINT8 ucEnable; - UINT16 usEtherType; -} EXT_RX_HEADER_TRANSLATE_BL_T, *P_EXT_RX_HEADER_TRANSLATE_BL_T; - -#define MAX_BCTRL_ENTRY 64 - -#ifdef DBDC_MODE - -typedef struct _BCTRL_ENTRY { - UINT8 Type; - UINT8 Index; - UINT8 BandIdx; -} BCTRL_ENTRY_T; - -typedef struct _BCTRL_INFO_T { - BOOLEAN DBDCEnable; - UINT32 TotalNum; - BCTRL_ENTRY_T BctrlEntries[MAX_BCTRL_ENTRY]; -} BCTRL_INFO_T; - -#endif /*DBDC_MODE*/ - -typedef struct _STA_REC_BA_CFG { - UCHAR MuarIdx; - UCHAR BssIdx; - UCHAR WlanIdx; - UCHAR tid; - UCHAR baDirection; - BOOLEAN BaEnable; - VOID *BaEntry; -} STA_REC_BA_CFG_T; - -typedef struct _STA_REC_CFG { - UINT8 ucBssIndex; - UINT8 ucWlanIdx; - UINT8 ConnectionState; - UINT8 MuarIdx; - UINT32 ConnectionType; - UINT32 u4EnableFeature; - UINT8 IsNewSTARec; - ASIC_SEC_INFO asic_sec_info; - struct _MAC_TABLE_ENTRY *pEntry; - struct _STAREC_AUTO_RATE_UPDATE_T *pRaParam; -} STA_REC_CFG_T; - -UINT16 GetRealPortQueueID(struct cmd_msg *msg, UINT8 cmd_type); - -#ifdef CONFIG_ATE -typedef struct _ATE_TXPOWER { - UINT32 Ant_idx; - UINT32 Power; - UINT32 Channel; - UINT32 Dbdc_idx; - UINT32 Band_idx; -} ATE_TXPOWER; -#endif /* CONFIG_ATE */ - -typedef struct _EXT_CMD_ID_AUTO_BA { - UINT8 ucAutoBaEnable; /* 0: No reload, 1: do reload */ - UINT8 ucTarget; - UINT8 aucReserve[2]; - UINT32 u4Timeout; /* timeout value, unit ms. */ -} EXT_CMD_ID_AUTO_BA_T, *P_EXT_CMD_ID_AUTO_BA_T; - -typedef struct GNU_PACKED _CMD_BA_TRIGGER_EVENT_T { - UINT8 ucWlanIdx; - UINT8 ucTid; - UINT8 aucReserved[2]; -} CMD_BA_TRIGGER_EVENT_T, *P_CMD_BA_TRIGGER_EVENT_T; - -#define CR4_GET_BSS_ACQ_PKT_NUM_READ_CLEAR_EN BIT(31) -#define CR4_GET_BSS_ACQ_PKT_NUM_BSS_GROUP_DEFAULT 0x00FFFFFF -#define CR4_GET_BSS_ACQ_PKT_NUM_CMD_DEFAULT \ - (CR4_GET_BSS_ACQ_PKT_NUM_READ_CLEAR_EN | \ - CR4_GET_BSS_ACQ_PKT_NUM_BSS_GROUP_DEFAULT) - -#define CR4_CFG_BSS_NUM 24 -#define CR4_NUM_OF_WMM_AC 4 -typedef struct _EVENT_PER_BSS_ACQ_PKT_NUM_T { - UINT32 au4AcqPktCnt[CR4_NUM_OF_WMM_AC]; -} EVENT_PER_BSS_ACQ_PKT_NUM_T, *P_EVENT_PER_BSS_ACQ_PKT_NUM_T; - -typedef struct _EVENT_BSS_ACQ_PKT_NUM_T { - UINT32 u4BssMap; - EVENT_PER_BSS_ACQ_PKT_NUM_T bssPktInfo[CR4_CFG_BSS_NUM]; -} EVENT_BSS_ACQ_PKT_NUM_T, *P_EVENT_BSS_ACQ_PKT_NUM_T; - -typedef struct _CMD_PKT_REPROCESS_EVENT_T { - /* MSDU token ID */ - UINT16 u2MsduToken; -} CMD_PKT_REPROCESS_EVENT_T, *P_CMD_PKT_REPROCESS_EVENT_T; - -typedef struct _CMD_GET_CR4_HOTSPOT_CAPABILITY_T { - UINT8 ucHotspotBssFlags[CR4_CFG_BSS_NUM]; -} CMD_GET_CR4_HOTSPOT_CAPABILITY_T, *P_CMD_GET_CR4_HOTSPOT_CAPABILITY_T; - -typedef struct _EXT_EVENT_GET_CR4_TX_STATISTICS_T { - UINT8 wlan_index; - UINT8 reserved[3]; - UINT32 one_sec_tx_bytes; - UINT32 one_sec_tx_cnts; -} EXT_EVENT_GET_CR4_TX_STATISTICS_T, *P_EXT_EVENT_GET_CR4_TX_STATISTICS_T; - -typedef struct GNU_PACKED _EXT_EVENT_CSA_NOTIFY_T { - UINT8 ucOwnMacIdx; - UINT8 ucChannelSwitchCount; - UINT8 aucReserved[2]; -} EXT_EVENT_CSA_NOTIFY_T, *P_EXT_EVENT_CSA_NOTIFY_T; - -typedef struct GNU_PACKED _EXT_EVENT_TMR_CALCU_INFO_T { - UINT8 aucTmrFrm[36]; - INT16 i2LtfStartAddr; - UINT16 u2OfdmCoarseTimeMSB; - UINT32 u4OfdmCoarseTimeLSB; - INT16 i2MinTFineTime; - UINT8 ucChBw; - UINT8 aucResv[1]; - UINT32 u4TOAECalibrationResult; -} EXT_EVENT_TMR_CALCU_INFO_T, *P_EXT_EVENT_TMR_CALCU_INFO_T; - -#ifdef AMPDU_CONF_SUPPORT -typedef struct GNU_PACKED _EVENT_RETRY_COUNT_UPDATE_T { - UINT8 ucBssInfoIdx; - UINT8 ucretrycount; -} EVENT_RETRY_COUNT_UPDATE_T, *P_EVENT_RETRY_COUNT_UPDATE_T; -#endif /* AMPDU_CONF_SUPPORT*/ - -typedef struct GNU_PACKED _EXT_CMD_ID_MCAST_CLONE { - UINT8 ucMcastCloneEnable; /* 0: Disable, 1: Enable, 2:Auto */ - UINT8 uc_omac_idx; - UINT8 aucReserve[2]; -} EXT_CMD_ID_MCAST_CLONE_T, *P_EXT_CMD_ID_MCAST_CLONE_T; - -typedef struct GNU_PACKED _EXT_CMD_ID_MULTICAST_ENTRY_INSERT { - UINT8 aucGroupId[6]; - UINT8 ucBssInfoIdx; - UINT8 ucMcastEntryType; /* 0: STATIC, 1: DYNAMIC */ - UINT8 ucMemberNum; /* 0: no member. 1: one member, 2: */ - UINT8 aucReserve[3]; - UINT8 aucMemberAddr[6]; - UINT8 ucIndex; - UINT8 ucReserve; -} EXT_CMD_ID_MULTICAST_ENTRY_INSERT_T, *P_EXT_CMD_ID_MULTICAST_ENTRY_INSERT_T; - -typedef struct GNU_PACKED _EXT_CMD_ID_MULTICAST_ENTRY_DELETE { - UINT8 aucGroupId[6]; - UINT8 ucBssInfoIdx; - UINT8 ucMemberNum; /* 0: no member. 1: one member, 2: */ - UINT8 aucMemberAddr[6]; - UINT8 ucIndex; - UINT8 ucReserve; -} EXT_CMD_ID_MULTICAST_ENTRY_DELETE_T, *P_EXT_CMD_ID_MULTICAST_ENTRY_DELETE_T; - -INT BitCount(IN UINT32 vMask); -BOOLEAN isIgmpMldFloodingPkt(IN struct _RTMP_ADAPTER *pAd, - IN PUCHAR pGroupIpAddr, IN UINT16 ProtoType); - -#ifdef IGMP_TVM_SUPPORT -typedef enum { - IGMP_MCAST_SET_AGEOUT_TIME = 0x01, - IGMP_MCAST_GET_ENTRY_TABLE = 0x02, - IGMP_MCAST_MAX_ID_INVALID = 0xFF, -} IGMP_MCAST_SET_GET_CMD_TYPE; - -typedef struct GNU_PACKED _EXT_CMD_ID_MULTICAST_SET_GET { - UINT8 ucCmdType; - UINT8 ucOwnMacIdx; - UINT8 Rsvd[2]; - union { - UINT32 u4AgeOutTime; - } SetData; -} EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T, *P_EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T; -#endif /* IGMP_TVM_SUPPORT */ - -typedef struct GNU_PACKED _EXT_CMD_ID_IGMP_FLOODING_CMD { - UINT8 bInsert; - UINT8 uEntryIPType; - UINT8 auMacData[6]; - UINT32 auPrefixMask[4]; -} EXT_CMD_ID_IGMP_FLOODING_CMD_T, *P_EXT_CMD_ID_IGMP_FLOODING_CMD_T; - -/* Manually setting Tx power */ -typedef struct _CMD_All_POWER_MANUAL_CTRL_T { - UINT8 ucPowerManualCtrlFormatId; - BOOLEAN fgPwrManCtrl; - UINT8 u1TxPwrModeManual; - UINT8 u1TxPwrBwManual; - UINT8 u1TxPwrRateManual; - INT8 i1TxPwrValueManual; - UCHAR ucBandIdx; -} CMD_All_POWER_MANUAL_CTRL_T, *P_CMD_All_POWER_MANUAL_CTRL_T; - -typedef struct _CMD_POWER_SKU_CTRL_T { - UINT8 ucPowerCtrlFormatId; - UCHAR ucSKUEnable; - UCHAR ucBandIdx; - UINT8 ucReserved; -} CMD_POWER_SKU_CTRL_T, *P_CMD_POWER_SKU_CTRL_T; - -typedef struct _CMD_POWER_PERCENTAGE_CTRL_T { - UINT8 ucPowerCtrlFormatId; - UCHAR ucPercentageEnable; - UCHAR ucBandIdx; - UINT8 ucReserved; -} CMD_POWER_PERCENTAGE_CTRL_T, *P_CMD_POWER_PERCENTAGE_CTRL_T; - -typedef struct _CMD_POWER_PERCENTAGE_DROP_CTRL_T { - UINT8 ucPowerCtrlFormatId; - INT8 cPowerDropLevel; - UINT8 ucBandIdx; - UINT8 ucReserved; -} CMD_POWER_PERCENTAGE_DROP_CTRL_T, *P_CMD_POWER_PERCENTAGE_DROP_CTRL_T; - -typedef struct _CMD_TX_CCK_STREAM_CTRL_T { - UINT8 u1CCKTxStream; - UINT8 ucBandIdx; - UINT8 ucReserved[2]; -} CMD_TX_CCK_STREAM_CTRL_T, *P_CMD_TX_CCK_STREAM_CTRL_T; - -typedef struct _CMD_POWER_BF_BACKOFF_CTRL_T { - UINT8 ucPowerCtrlFormatId; - UCHAR ucBFBackoffEnable; - UCHAR ucBandIdx; - UINT8 ucReserved; -} CMD_POWER_BF_BACKOFF_CTRL_T, *P_CMD_POWER_BF_BACKOFF_CTRL_T; - -typedef struct _CMD_POWER_THERMAL_COMP_CTRL_T { - UINT8 ucPowerCtrlFormatId; - BOOLEAN fgThermalCompEn; - UINT8 ucBandIdx; - UINT8 ucReserved; -} CMD_POWER_THERMAL_COMP_CTRL_T, *P_CMD_POWER_THERMAL_COMP_CTRL_T; - -typedef struct _CMD_POWER_RF_TXANT_CTRL_T { - UINT8 ucPowerCtrlFormatId; - UINT8 ucTxAntIdx; /* bitwise representation. 0x5 means only TX0, TX2 enabled */ - UINT8 ucReserved[2]; -} CMD_POWER_RF_TXANT_CTRL_T, *P_CMD_POWER_RF_TXANT_CTRL_T; - -typedef struct _CMD_TX_POWER_SHOW_INFO_T { - UINT8 ucPowerCtrlFormatId; - BOOLEAN ucTxPowerInfoCatg; - UINT8 ucBandIdx; - UINT8 ucReserved; -} CMD_TX_POWER_SHOW_INFO_T, *P_CMD_TX_POWER_SHOW_INFO_T; - -typedef struct _CMD_TOAE_ON_OFF_CTRL { - BOOLEAN fgTOAEEnable; - UINT8 aucReserve[3]; -} CMD_TOAE_ON_OFF_CTRL, *P_CMD_TOAE_ON_OFF_CTRL; - -typedef struct _CMD_EDCCA_ON_OFF_CTRL { - BOOLEAN fgEDCCAEnable; - UINT8 ucDbdcBandIdx; - UINT8 aucReserve[2]; -} CMD_EDCCA_ON_OFF_CTRL, *P_CMD_EDCCA_ON_OFF_CTRL; - -#ifdef WIFI_EAP_FEATURE -typedef enum _EAP_FEATURE_CATEGORY { - EDCCA_CTRL = 0x0, - SET_EDCCA_THRESHOLD = 0x1, - INIT_IPI_CTRL = 0x2, - GET_IPI_VALUE = 0x3, - SET_DATA_TXPWR_OFFSET = 0x4, - SET_RA_TABLE_DATA = 0x5, - GET_RATE_INFO = 0x6, - EAP_FEATURE_NUM -} EAP_FEATURE_CATEGORY, - *P_EAP_FEATURE_CATEGORY; - -enum { - EAP_EVENT_IPI_VALUE, - EAP_EVENT_SHOW_RATE_TABLE, - EAP_EVENT_NUM, -}; - -#define EAP_FW_RA_SWITCH_TBL_PATH "/etc/FwRASwitchTbl.dat" -#define EAP_FW_RA_HW_FB_TBL_PATH "/etc/FwRAHwFbTbl.dat" - -#define EAP_FW_RA_SWITCH_TBL_UPD_PATH_7615 "/etc/FwRASwitchTblUpd7615.dat" -#define EAP_FW_RA_HW_FB_TBL_UPD_PATH_7615 "/etc/FwRAHwFbTblUpd7615.dat" -#define EAP_FW_RA_SWITCH_TBL_UPD_PATH_7622 "/etc/FwRASwitchTblUpd7622.dat" -#define EAP_FW_RA_HW_FB_TBL_UPD_PATH_7622 "/etc/FwRAHwFbTblUpd7622.dat" -#define EAP_FW_RA_SWITCH_TBL_UPD_PATH_7663 "/etc/FwRASwitchTblUpd7663.dat" -#define EAP_FW_RA_HW_FB_TBL_UPD_PATH_7663 "/etc/FwRAHwFbTblUpd7663.dat" - -#define NUM_OF_COL_RATE_SWITCH_TABLE 15 -#define NUM_OF_COL_RATE_HWFB_TABLE 8 -#define RA_TBL_INDEX_INVALID 0xFF - -typedef enum _ENUM_RA_TABLE { - eRateSwitchTable = 0, - eRateHwFbTable, - eRateTableMax -} ENUM_RA_TABLE, - *P_ENUM_RA_TABLE; - -typedef enum _ENUM_RA_SWITCH_TABLE { - eRateSwTbl11b = 0, - eRateSwTbl11g, - eRateSwTbl11bg, - eRateSwTbl11n1ss = 0x10, - eRateSwTbl11n2ss, - eRateSwTbl11n3ss, - eRateSwTbl11n4ss, - eRateSwTblvht1ss = 0x20, - eRateSwTblvht2ss, - eRateSwTblvht3ss, - eRateSwTblvht4ss, - eRateSwTblvht2ssbccbw80, - eRateSwTblhe1ss = 0x30, - eRateSwTblhe2ss, - eRateSwTblMax = 0xff -} ENUM_RA_SWITCH_TABLE, - *P_ENUM_RA_SWITCH_TABLE; - -typedef enum _ENUM_RA_HWFB_TABLE { - eRateHwFbTbl11b = 0, - eRateHwFbTbl11g, - eRateHwFbTbl11bg, - eRateHwFbTbl11n1ss = 0x10, - eRateHwFbTbl11n2ss, - eRateHwFbTbl11n3ss, - eRateHwFbTbl11n4ss, - eRateHwFbTblbgn1ss, - eRateHwFbTblbgn2ss, - eRateHwFbTblbgn3ss, - eRateHwFbTblbgn4ss, - eRateHwFbTblvht1ss = 0x20, - eRateHwFbTblvht2ss, - eRateHwFbTblvht3ss, - eRateHwFbTblvht4ss, - eRateHwFbTblvht2ssbccbw80, - eRateHwFbTblhe1ss = 0x30, - eRateHwFbTblhe2ss, - eRateHwFbTblMax = 0xff -} ENUM_RA_HWFB_TABLE, - *P_ENUM_RA_HWFB_TABLE; - -typedef struct _RATE_TABLE_UPDATE { - UINT8 u1RaTblType; - UINT8 u1RaTblIdx; - CHAR acTableName[40]; -} RATE_TABLE_UPDATE, *P_RATE_TABLE_UPDATE; - -typedef struct _CMD_SET_EDCCA_THRESHOLD { - UINT32 u4EapCtrlCmdId; - UINT32 u4EdccaThreshold; -} CMD_SET_EDCCA_THRESHOLD, *P_CMD_SET_EDCCA_THRESHOLD; - -typedef struct _CMD_INIT_IPI_CTRL_T { - UINT32 u4EapCtrlCmdId; - UINT8 u1BandIdx; - UINT8 au1Reserved[3]; -} CMD_INIT_IPI_CTRL_T, *P_CMD_INIT_IPI_CTRL_T; - -typedef struct _CMD_GET_IPI_VALUE { - UINT32 u4EapCtrlCmdId; - UINT8 u1BandIdx; - UINT8 au1Reserved[3]; -} CMD_GET_IPI_VALUE, *P_CMD_GET_IPI_VALUE; - -typedef struct _EVENT_GET_IPI_VALUE { - UINT32 u4EapCtrlEventId; - UINT32 au4IPIValue[11]; -} EVENT_GET_IPI_VALUE, *P_EVENT_GET_IPI_VALUE; - -typedef struct _CMD_SET_DATA_TXPWR_OFFSET { - UINT32 u4EapCtrlCmdId; - UINT8 u1WlanIdx; - INT8 i1TxPwrOffset; - UINT8 u1BandIdx; - UINT8 u1Reserved; -} CMD_SET_DATA_TXPWR_OFFSET, *P_CMD_SET_DATA_TXPWR_OFFSET; - -typedef struct _CMD_SET_RA_TABLE { - UINT32 u4EapCtrlCmdId; - UINT8 u1RaTblTypeIdx; - UINT8 u1RaTblIdx; - UINT8 u1BandIdx; - UINT8 u1Reserved1; - UINT16 u2RaTblLength; - UINT16 u2Reserved2; - UCHAR ucBuf[512]; -} CMD_SET_RA_TABLE, *P_CMD_SET_RA_TABLE; - -typedef struct _EVENT_SHOW_RATE_TABLE { - UINT32 u4EapCtrlEventId; - UINT16 u2RaTblLength; - UINT8 u1RaTblTypeIdx; - UINT8 u1RaTblIdx; - UINT8 u1RW; - UINT8 u1Reserved[3]; - UCHAR ucBuf[512]; -} EVENT_SHOW_RATE_TABLE, *P_EVENT_SHOW_RATE_TABLE; - -typedef struct _CMD_SHOW_RATE_TABLE { - UINT32 u4EapCtrlCmdId; - UINT8 u1RaTblTypeIdx; - UINT8 u1RaTblIdx; - UINT8 u1BandIdx; - UINT8 u1RW; -} CMD_SHOW_RATE_TABLE, *P_CMD_SHOW_RATE_TABLE; - -PCHAR getRaTableName(UINT8 TblType, UINT8 TblIdx); -UINT8 getRaTableIndex(UINT8 TblType, CHAR *TblName); -#endif /* WIFI_EAP_FEATURE */ - -typedef struct _CMD_POWER_MU_CTRL_T { - UINT8 ucPowerCtrlFormatId; - BOOLEAN fgMUPowerForceMode; - INT8 cMUPower; - UINT8 ucReserved; -} CMD_POWER_MU_CTRL_T, *P_CMD_POWER_MU_CTRL_T; - -typedef struct _CMD_BF_NDPA_TXD_CTRL_T { - UINT8 ucPowerCtrlFormatId; - BOOLEAN fgNDPA_ManualMode; - UINT8 ucNDPA_TxMode; - UINT8 ucNDPA_Rate; - UINT8 ucNDPA_BW; - UINT8 ucNDPA_PowerOffset; - UINT8 ucReserved[2]; -} CMD_BF_NDPA_TXD_CTRL_T, *P_CMD_BF_NDPA_TXD_CTRL_T; - -typedef struct _CMD_SET_TSSI_TRAINING_T { - UINT8 ucPowerCtrlFormatId; - UINT8 ucSubFuncId; - BOOLEAN fgEnable; - UINT8 ucReserved; -} CMD_SET_TSSI_TRAINING_T, *P_CMD_SET_TSSI_TRAINING_T; - -typedef struct _CMD_POWER_TEMPERATURE_CTRL_T { - UINT8 ucPowerCtrlFormatId; - BOOLEAN fgManualMode; /* 1: Enable Temperature Manual Ctrl, 0: Disable Temperature Manual Ctrl */ - CHAR cTemperature; /* Temperature (Celsius Degree) */ - UINT8 ucReserved; -} CMD_POWER_TEMPERATURE_CTRL_T, *P_CMD_POWER_TEMPERATURE_CTRL_T; - -typedef struct _CMD_POWER_BOOST_TABLE_CTRL_T { - UINT8 ucPowerCtrlFormatId; - UINT8 ucBandIdx; - INT8 cPwrUpCat; - INT8 cPwrUpValue[7]; - UINT8 ucReserved[2]; -} CMD_POWER_BOOST_TABLE_CTRL_T, *P_CMD_POWER_BOOST_TABLE_CTRL_T; - -#define SKU_TABLE_SIZE_ALL 53 -#define BF_BACKOFF_ON_MODE 0 -#define BF_BACKOFF_OFF_MODE 1 -#define BF_BACKOFF_MODE 2 -#define BF_BACKOFF_CASE 10 - -typedef enum _ENUM_THERMO_ITEM_T { - THERMO_ITEM_DPD_CAL = 0, - THERMO_ITEM_OVERHEAT = 1, - THERMO_ITEM_BB_HI = 2, - THERMO_ITEM_BB_LO = 3, - NTX_THERMAL_PROTECT_HI = 4, - NTX_THERMAL_PROTECT_LO = 5, - ADM_THERMAL_PROTECT_HI = 6, - ADM_THERMAL_PROTECT_LO = 7, - RF_THERMAL_PROTECT_HI = 8, - THERMO_ITEM_TSSI_COMP = 9, - TX_POWER_TEMP_COMP_N7_2G4 = 10, - TX_POWER_TEMP_COMP_N6_2G4 = 11, - TX_POWER_TEMP_COMP_N5_2G4 = 12, - TX_POWER_TEMP_COMP_N4_2G4 = 13, - TX_POWER_TEMP_COMP_N3_2G4 = 14, - TX_POWER_TEMP_COMP_N2_2G4 = 15, - TX_POWER_TEMP_COMP_N1_2G4 = 16, - TX_POWER_TEMP_COMP_N0_2G4 = 17, - TX_POWER_TEMP_COMP_P1_2G4 = 18, - TX_POWER_TEMP_COMP_P2_2G4 = 19, - TX_POWER_TEMP_COMP_P3_2G4 = 20, - TX_POWER_TEMP_COMP_P4_2G4 = 21, - TX_POWER_TEMP_COMP_P5_2G4 = 22, - TX_POWER_TEMP_COMP_P6_2G4 = 23, - TX_POWER_TEMP_COMP_P7_2G4 = 24, - TX_POWER_TEMP_COMP_N7_5G = 25, - TX_POWER_TEMP_COMP_N6_5G = 26, - TX_POWER_TEMP_COMP_N5_5G = 27, - TX_POWER_TEMP_COMP_N4_5G = 28, - TX_POWER_TEMP_COMP_N3_5G = 29, - TX_POWER_TEMP_COMP_N2_5G = 30, - TX_POWER_TEMP_COMP_N1_5G = 31, - TX_POWER_TEMP_COMP_N0_5G = 32, - TX_POWER_TEMP_COMP_P1_5G = 33, - TX_POWER_TEMP_COMP_P2_5G = 34, - TX_POWER_TEMP_COMP_P3_5G = 35, - TX_POWER_TEMP_COMP_P4_5G = 36, - TX_POWER_TEMP_COMP_P5_5G = 37, - TX_POWER_TEMP_COMP_P6_5G = 38, - TX_POWER_TEMP_COMP_P7_5G = 39, - THERMO_ITEM_DYNAMIC_G0 = 40, - THERMO_ITEM_NUM = 41 -} ENUM_THERMO_ITEM_T, - *P_ENUM_THERMO_ITEM_T; - -typedef struct _THERMO_ITEM_INFO_T { - UINT8 ucThermoItem; - UINT8 ucThermoType; /* 0: diff (relative to init temperature), 1: high, 2: low, 3: from external input */ - BOOLEAN fgLowerEn; - BOOLEAN fgUpperEn; - CHAR cLowerBound; /* Absolute temperature */ - CHAR cUpperBound; /* Absolute temperature */ - UINT8 ucReserved[2]; -} THERMO_ITEM_INFO_T, *P_THERMO_ITEM_INFO_T; - -typedef struct _EXT_EVENT_TXPOWER_INFO_T { - UINT8 ucEventCategoryID; - UINT8 ucBandIdx; - BOOLEAN fg2GEPA; - BOOLEAN fg5GEPA; - - BOOLEAN fgSKUEnable; - BOOLEAN fgPERCENTAGEEnable; - BOOLEAN fgBFBACKOFFEnable; - BOOLEAN fgThermalCompEnable; - - INT8 cSKUTable[SKU_TABLE_SIZE_ALL]; - INT8 cThermalCompValue; - INT8 cPowerDrop; - UINT8 ucChannelBandIdx; - - UINT32 u4RatePowerCRValue - [8]; /* (TMAC) Band0: 0x820F4020~0x820F403C, Band1: 0x820F4040~0x820F405C */ - INT8 cTxPwrBFBackoffValue[BF_BACKOFF_MODE][BF_BACKOFF_CASE]; - UINT32 u4BackoffCRValue - [6]; /* (BBP) Band0: 0x8207067C~82070690, Band1: 0x8207087C~82070890 */ - UINT32 u4PowerBoundCRValue; /* (TMAC) 0x820F4080 */ - INT8 cEpaGain[2]; -} EXT_EVENT_TXPOWER_INFO_T, *P_EXT_EVENT_TXPOWER_INFO_T; - -typedef struct _EXT_EVENT_TXPOWER_BACKUP_T { - UINT8 ucEventCategoryID; - UINT8 ucBandIdx; - UINT8 aucReserve1[2]; - INT8 cTxPowerCompBackup[SKU_TABLE_SIZE][SKU_TX_SPATIAL_STREAM_NUM]; -} EXT_EVENT_TXPOWER_BACKUP_T, *P_EXT_EVENT_TXPOWER_BACKUP_T; - -typedef struct _EXT_EVENT_EPA_STATUS_T { - UINT8 ucEventCategoryID; - BOOLEAN fgEPA; - UINT8 aucReserve1[2]; -} EXT_EVENT_EPA_STATUS_T, *P_EXT_EVENT_EPA_STATUS_T; - -typedef struct _EXT_EVENT_THERMAL_STATE_INFO_T { - UINT8 ucEventCategoryID; - UINT8 ucThermoItemsNum; - UINT8 aucReserve[2]; - - THERMO_ITEM_INFO_T arThermoItems[THERMO_ITEM_NUM]; -} EXT_EVENT_THERMAL_STATE_INFO_T, *P_EXT_EVENT_THERMAL_STATE_INFO_T; - -typedef struct _EXT_EVENT_TXV_BBP_POWER_INFO_T { - UINT8 ucEventCategoryID; - UINT8 ucBandIdx; - CHAR cTxvPower; - CHAR cTxvPowerDac; - - CHAR cBbpPower[WF_NUM]; - - CHAR cBbpPowerDac[WF_NUM]; - - UINT32 u2BbpPowerCR[WF_NUM]; - - UINT32 u2TxvPowerCR; - - UINT8 ucTxvPowerMaskBegin; - UINT8 ucTxvPowerMaskEnd; - UINT8 ucBbpPowerMaskBegin; - UINT8 ucBbpPowerMaskEnd; - - UINT8 ucWfNum; - UINT8 aucReserve1[3]; -} EXT_EVENT_TXV_BBP_POWER_INFO_T, *P_EXT_EVENT_TXV_BBP_POWER_INFO_T; - -typedef struct _EXT_EVENT_TX_POWER_BACKUP_TABLE_INFO_T { - UINT8 ucEventCategoryID; - UINT8 ucBandIdx; - UINT8 aucReserve[2]; - - INT8 cTxPowerBackup[SKU_TABLE_SIZE][SKU_TX_SPATIAL_STREAM_NUM]; -} EXT_EVENT_TX_POWER_BACKUP_TABLE_INFO_T, - *P_EXT_EVENT_TX_POWER_BACKUP_TABLE_INFO_T; - -typedef struct _CMD_ATE_MODE_CTRL_T { - UINT8 ucPowerCtrlFormatId; - BOOLEAN fgATEModeEn; /* 1: Enable ATE mode 0: disable ATE mode */ - UINT8 ucReserved[2]; -} CMD_ATE_MODE_CTRL_T, *P_CMD_ATE_MODE_CTRL_T; - -typedef struct _EXT_EVENT_THERMAL_COMPENSATION_TABLE_INFO_T { - UINT8 ucEventCategoryID; - UINT8 ucBand; - UINT8 ucBandIdx; - UINT8 aucReserve; - - INT8 cThermalComp[THERMAL_TABLE_SIZE]; - UINT8 aucReserve2; -} EXT_EVENT_THERMAL_COMPENSATION_TABLE_INFO_T, - *P_EXT_EVENT_THERMAL_COMPENSATION_TABLE_INFO_T; - -typedef struct _CMD_POWER_TPC_CTRL_T { - UINT8 ucPowerCtrlFormatId; - INT8 cTPCPowerValue; - UINT8 ucBand; - UINT8 ucChannelBand; - UINT8 ucCentralChannel; - UINT8 ucReserved[3]; -} CMD_POWER_TPC_CTRL_T, *P_CMD_POWER_TPC_CTRL_T; -#if defined(RED_SUPPORT) && (defined(MT7622) || defined(P18) || \ - defined(MT7663) || defined(MT7615)) -typedef struct _MPDU_SHORT_TIME_UPDATE_T { - UINT8 arPhymodeBW; - UINT8 arAirtimeRatio; - UINT8 wcid; - UINT8 Reserve; - UINT16 arN9TxARCnt; - UINT16 arN9TxFRCnt; - INT32 arMpduTime; -} MPDU_SHORT_TIME_UPDATE_T, *P_MPDU_SHORT_TIME_UPDATE_T; - -typedef struct _MPDU_SHORT_AVG_TIME_UPDATE_T { - UINT8 arPhymodeBW; - UINT8 arAirtimeRatio; - UINT8 wcid; - UINT8 Reserve; - UINT16 arN9TxARCnt; - UINT16 arN9TxFRCnt; - INT32 arMpduTime; - INT32 arMpduTime_avg; -} MPDU_SHORT_AVG_TIME_UPDATE_T, *P_MPDU_SHORT_AVG_TIME_UPDATE_T; - -typedef struct _EXT_EVENT_MPDU_SHORT_TIME_UPDATE_T { - UINT8 ucfgValid; - UINT8 Reserve[3]; - UINT32 staInUseBitmap[MAX_LEN_OF_MAC_TABLE / (sizeof(UINT32) * 8)]; -} EXT_EVENT_MPDU_TIME_UPDATE_T, *P_EXT_EVENT_MPDU_TIME_UPDATE_T; -#endif /* defined(RED_SUPPORT) && (defined(MT7622) || defined(P18) || defined(MT7663)) */ - -#if defined(RED_SUPPORT) && defined(FQ_SCH_SUPPORT) -typedef struct _EXT_EVENT_MPDU_TIME_FQ_UPDATE_T { - UINT8 ucfgValid; - UINT8 Reserve[3]; - UINT8 arAirtimeRatio[MAX_LEN_OF_MAC_TABLE]; - INT32 arMpduTime[MAX_LEN_OF_MAC_TABLE]; -} EXT_EVENT_MPDU_TIME_FQ_UPDATE_T, *P_EXT_EVENT_MPDU_TIME_FQ_UPDATE_T; -#endif /* defined(RED_SUPPORT) && defined(FQ_SCH_SUPPORT) */ - -typedef struct _CMD_LINK_TEST_TX_CSD_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - BOOLEAN fgTxCsdConfigEn; - UINT8 ucDbdcBandIdx; - UINT8 ucBandIdx; - UINT8 ucReserved; -} CMD_LINK_TEST_TX_CSD_CTRL_T, *P_CMD_LINK_TEST_TX_CSD_CTRL_T; - -typedef struct _CMD_LINK_TEST_TX_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - BOOLEAN fgTxConfigEn; - UINT8 ucBandIdx; - UINT8 ucReserved; -} CMD_LINK_TEST_TX_CTRL_T, *P_CMD_LINK_TEST_TX_CTRL_T; - -typedef struct _CMD_LINK_TEST_RX_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - UINT8 ucRxAntIdx; - UINT8 ucBandIdx; - UINT8 ucReserved; -} CMD_LINK_TEST_RX_CTRL_T, *P_CMD_LINK_TEST_RX_CTRL_T; - -typedef struct _CMD_LINK_TEST_TXPWR_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - BOOLEAN fgTxPwrConfigEn; - UINT8 ucDbdcBandIdx; - UINT8 ucBandIdx; -} CMD_LINK_TEST_TXPWR_CTRL_T, *P_CMD_LINK_TEST_TXPWR_CTRL_T; - -typedef struct _CMD_LINK_TEST_TXPWR_UP_TABLE_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - UINT8 ucTxPwrUpCat; - UINT8 ucTxPwrUpValue[13]; - UINT8 ucReserved; -} CMD_LINK_TEST_TXPWR_UP_TABLE_CTRL_T, *P_CMD_LINK_TEST_TXPWR_UP_TABLE_CTRL_T; - -typedef struct _CMD_LINK_TEST_ACR_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - BOOLEAN fgACRConfigEn; - UINT8 ucDbdcBandIdx; - UINT8 ucReserved; -} CMD_LINK_TEST_ACR_CTRL_T, *P_CMD_LINK_TEST_ACR_CTRL_T; - -typedef struct _CMD_LINK_TEST_RCPI_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - BOOLEAN fgRCPIConfigEn; - UINT8 ucReserved[2]; -} CMD_LINK_TEST_RCPI_CTRL_T, *P_CMD_LINK_TEST_RCPI_CTRL_T; - -typedef struct _CMD_LINK_TEST_SEIDX_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - BOOLEAN fgSeIdxConfigEn; - UINT8 ucReserved[2]; -} CMD_LINK_TEST_SEIDX_CTRL_T, *P_CMD_LINK_TEST_SEIDX_CTRL_T; - -typedef struct _CMD_LINK_TEST_RCPI_MA_CTRL_T { - UINT8 ucLinkTestCtrlFormatId; - UINT8 ucMAParameter; - UINT8 ucReserved[2]; -} CMD_LINK_TEST_RCPI_MA_CTRL_T, *P_CMD_LINK_TEST_RCPI_MA_CTRL_T; - -typedef struct _DECOMPRESS_REGION_INFO { - UINT32 u4RegionAddress; - UINT32 u4Regionlength; - UINT32 u4RegionCRC; -} DECOMPRESS_REGION_INFO, *P_DECOMPRESS_REGION_INFO; - -typedef struct _INIT_CMD_WIFI_START_WITH_DECOMPRESSION { - UINT32 u4Override; - UINT32 u4Address; - UINT32 u4DecompressTmpAddress; - UINT32 u4BlockSize; - UINT32 u4RegionNumber; - DECOMPRESS_REGION_INFO aucDecompRegion[3]; /* ilm, dlm, cmdbt*/ -} INIT_CMD_WIFI_START_WITH_DECOMPRESSION, - *P_INIT_CMD_WIFI_START_WITH_DECOMPRESSION; - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -typedef struct _RDM_FCC5_LPN_UPDATE_T { - UINT16 u2Tag; /* Tag = 0x01 */ - UINT16 u2FCC_LPN_MIN; -} CMD_RDM_FCC5_LPN_UPDATE_T, *P_CMD_RDM_FCC5_LPN_UPDATE_T; - -typedef struct _RDM_RADAR_THRESHOLD_UPDATE_T { - UINT16 u2Tag; /* Tag = 0x02 */ - UINT16 u2RadarType; /* Valid Range 0~15*/ - UINT8 ucRT_ENB; - UINT8 ucRT_STGR; - UINT8 ucRT_CRPN_MIN; - UINT8 ucRT_CRPN_MAX; - UINT8 ucRT_CRPR_MIN; - UINT8 ucRT_PW_MIN; - UINT8 ucRT_PW_MAX; - UINT32 u4RT_PRI_MIN; - UINT32 u4RT_PRI_MAX; - UINT8 ucRT_CRBN_MIN; - UINT8 ucRT_CRBN_MAX; - UINT8 ucRT_STGPN_MIN; - UINT8 ucRT_STGPN_MAX; - UINT8 ucRT_STGPR_MIN; -} CMD_RDM_RADAR_THRESHOLD_UPDATE_T, *P_CMD_RDM_RADAR_THRESHOLD_UPDATE_T; - -typedef struct _RDM_PULSE_THRESHOLD_UPDATE_T { - UINT16 u2Tag; /* Tag = 0x03 */ - UINT32 u4PP_PulseWidthMAX; /* unit us */ - INT32 i4PulsePowerMAX; /* unit dbm */ - INT32 i4PulsePowerMIN; /* unit dbm */ - UINT32 u4PRI_MIN_STGR; /* unit us */ - UINT32 u4PRI_MAX_STGR; /* unit us */ - UINT32 u4PRI_MIN_CR; /* unit us */ - UINT32 u4PRI_MAX_CR; /* unit us */ -} CMD_RDM_PULSE_THRESHOLD_UPDATE_T, *P_CMD_RDM_PULSE_THRESHOLD_UPDATE_T; - -typedef struct _RDM_RDD_LOG_CONFIG_UPDATE_T { - UINT16 u2Tag; /* Tag = 0x04 */ - UINT8 ucHwRDDLogEnable; /* 0: no dump, 1: dump log */ - UINT8 ucSwRDDLogEnable; /* 0: no dump, 1: dump log */ - UINT8 ucSwRDDLogCond; /*0: send log for every interrupt, 1: send log only when a radar is detected. */ -} CMD_RDM_RDD_LOG_CONFIG_UPDATE_T, *P_CMD_RDM_RDD_LOG_CONFIG_UPDATE_T; -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -INT32 MtCmdFwDecompressStart( - struct _RTMP_ADAPTER *ad, - P_INIT_CMD_WIFI_START_WITH_DECOMPRESSION decompress_info); - -#ifdef BCN_OFFLOAD_SUPPORT -BOOLEAN MtUpdateBcnAndTimToMcu(IN struct _RTMP_ADAPTER *pAd, VOID *wdev_void, - IN UINT16 FrameLen, IN UCHAR UpdatePktType); - -INT32 MtCmdBcnOffloadSet(struct _RTMP_ADAPTER *pAd, - CMD_BCN_OFFLOAD_T *bcn_offload); -#endif - -INT32 MtCmdFdFrameOffloadSet(struct _RTMP_ADAPTER *pAd, - P_CMD_FD_FRAME_OFFLOAD_T fdFrame_offload); -INT32 MtCmdMuarConfigSet(struct _RTMP_ADAPTER *pAd, UCHAR *pdata); - -INT32 MtCmdExtPwrMgtBitWifi(struct _RTMP_ADAPTER *pAd, - MT_PWR_MGT_BIT_WIFI_T rPwrMgtBitWifi); - -#ifdef HOST_RESUME_DONE_ACK_SUPPORT -INT32 mt_cmd_host_resume_done_ack(struct _RTMP_ADAPTER *pAd); -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ - -#ifdef GREENAP_SUPPORT -INT32 MtCmdExtGreenAPOnOffCtrl(struct _RTMP_ADAPTER *pAd, - MT_GREENAP_CTRL_T GreenAPCtrl); -#endif /* GREENAP_SUPPORT */ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -INT32 mt_cmd_ext_pcie_aspm_dym_ctrl(struct _RTMP_ADAPTER *pAd, - MT_PCIE_ASPM_DYM_CTRL_T PcieAspmDymCtrl); -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -INT32 MtCmdExtPmStateCtrl(struct _RTMP_ADAPTER *pAd, - MT_PMSTAT_CTRL_T PmStatCtrl); - -UCHAR GetCfgBw2RawBw(UCHAR CfgBw); - -INT32 CmdExtPwrMgtBitWifi(struct _RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, - UINT8 ucPwrMgtBit); - -INT32 MtCmdRestartDLReq(struct _RTMP_ADAPTER *pAd); - -INT32 MtCmdHIFLoopBackTest(struct _RTMP_ADAPTER *pAdapter, BOOLEAN IsEnable, - UINT8 RxQ); - -INT32 MtCmdPatchSemGet(struct _RTMP_ADAPTER *pAd, UINT32 Semaphore); - -INT32 CmdHIFLoopbackReq(struct _RTMP_ADAPTER *pAd, UINT32 enable, UINT32 qidx); - -INT32 MtCmdAddressLenReq(struct _RTMP_ADAPTER *pAd, UINT32 address, UINT32 len, - UINT32 data_mode); - -INT32 MtCmdFwScatter(struct _RTMP_ADAPTER *pAd, UINT8 *dl_payload, - UINT32 dl_len, UINT32 count); - -INT32 MtCmdPatchFinishReq(struct _RTMP_ADAPTER *pAd); - -INT32 MtCmdFwStartReq(struct _RTMP_ADAPTER *pAd, UINT32 override, - UINT32 address); - -INT32 MtCmdWifiHifCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucDbdcIdx, - UINT8 ucHifCtrlId, VOID *pRsult); - -INT32 CmdInitAccessRegWrite(struct _RTMP_ADAPTER *pAd, UINT32 address, - UINT32 data); - -INT32 CmdInitAccessRegRead(struct _RTMP_ADAPTER *pAd, UINT32 address, - UINT32 *data); - -INT32 CmdChPrivilege(struct _RTMP_ADAPTER *pAd, UINT8 Action, UINT8 control_chl, - UINT8 central_chl, UINT8 BW, UINT8 TXStream, - UINT8 RXStream); - -INT32 CmdAccessRegWrite(struct _RTMP_ADAPTER *pAd, UINT32 address, UINT32 data); - -INT32 CmdAccessRegRead(struct _RTMP_ADAPTER *pAd, UINT32 address, UINT32 *data); - -INT32 MtCmdRFRegAccessWrite(struct _RTMP_ADAPTER *pAd, UINT32 RFIdx, - UINT32 Offset, UINT32 Value); - -INT32 MtCmdRFRegAccessRead(struct _RTMP_ADAPTER *pAd, UINT32 RFIdx, - UINT32 Offset, UINT32 *Value); -INT32 MtCmdRadioOnOffCtrl(struct _RTMP_ADAPTER *pAd, UINT8 On); - -INT32 MtCmdWiFiRxDisable(struct _RTMP_ADAPTER *pAd); - -INT32 MtCmdChannelSwitch(struct _RTMP_ADAPTER *pAd, - struct _MT_SWITCH_CHANNEL_CFG SwChCfg); - -#ifdef NEW_SET_RX_STREAM -INT MtCmdSetRxPath(struct _RTMP_ADAPTER *pAd, UINT32 Path, UCHAR BandIdx); -#endif - -INT32 CmdNicCapability(struct _RTMP_ADAPTER *pAd); - -INT32 MtCmdSecKeyReq(struct _RTMP_ADAPTER *pAd, UINT8 AddRemove, UINT8 Keytype, - UINT8 *pAddr, UINT8 Alg, UINT8 KeyID, UINT8 KeyLen, - UINT8 WlanIdx, UINT8 *KeyMaterial); - -INT32 MtCmdRfTestSwitchMode(struct _RTMP_ADAPTER *pAd, UINT32 OpMode, - UINT8 IcapLen, UINT16 rsp_len); - -#ifdef WIFI_SPECTRUM_SUPPORT -INT32 MtCmdWifiSpectrumStart(IN struct _RTMP_ADAPTER *pAd, IN UINT8 *pData); - -INT32 MtCmdWifiSpectrumGen1Status(IN struct _RTMP_ADAPTER *pAd); - -INT32 MtCmdWifiSpectrumGen2Status(IN struct _RTMP_ADAPTER *pAd); - -VOID MtCmdWifiSpectrumStatusCb(IN struct cmd_msg *msg, IN INT8 *pData, - IN UINT16 Length); - -INT32 MtCmdWifiSpectrumRawDataProc(IN struct _RTMP_ADAPTER *pAd); -#endif /* WIFI_SPECTRUM_SUPPORT */ - -#ifdef INTERNAL_CAPTURE_SUPPORT -INT32 MtCmdRfTestICapStart(IN struct _RTMP_ADAPTER *pAd, IN UINT8 *pData); - -INT32 MtCmdRfTestGen1ICapStatus(IN struct _RTMP_ADAPTER *pAd); - -INT32 MtCmdRfTestGen2ICapStatus(IN struct _RTMP_ADAPTER *pAd); - -VOID MtCmdRfTestICapStatusCb(IN struct cmd_msg *msg, IN INT8 *pData, - IN UINT16 Length); - -INT32 MtCmdRfTestICapRawDataProc(IN struct _RTMP_ADAPTER *pAd); -#endif /* INTERNAL_CAPTURE_SUPPORT */ - -INT32 MtCmdRfTestSetADC(struct _RTMP_ADAPTER *pAd, UINT32 ChannelFreq, - UINT8 AntIndex, UINT8 BW, UINT8 SX, UINT8 DbdcIdx, - UINT8 RunType, UINT8 FType); - -INT32 MtCmdRfTestSetRxGain(struct _RTMP_ADAPTER *pAd, UINT8 LPFG, UINT8 LNA, - UINT8 DbdcIdx, UINT8 AntIndex); - -INT32 MtCmdRfTestSetTTG(struct _RTMP_ADAPTER *pAd, UINT32 ChannelFreq, - UINT32 ToneFreq, UINT8 TTGPwrIdx, UINT8 XtalFreq, - UINT8 DbdcIdx); - -INT32 MtCmdRfTestSetTTGOnOff(struct _RTMP_ADAPTER *pAd, UINT8 TTGEnable, - UINT8 DbdcIdx, UINT8 AntIndex); - -INT32 MtCmdDoCalibration(struct _RTMP_ADAPTER *pAd, UINT32 func_idx, - UINT32 CalItem, UINT32 band_idx); - -INT32 MtCmdTxContinous(struct _RTMP_ADAPTER *pAd, UINT32 PhyMode, UINT32 BW, - UINT32 PriCh, UINT32 Central_Ch, UINT32 Mcs, - UINT32 WFSel, UINT32 Txfd, UINT8 Band, UINT8 onoff); - -INT32 MtCmdTxTone(struct _RTMP_ADAPTER *pAd, UINT8 BandIdx, UINT8 Control, - UINT8 AntIndex, UINT8 ToneType, UINT8 ToneFreq, - INT32 DcOffset_I, INT32 DcOffset_Q, UINT32 Band); - -INT32 MtCmdTxTonePower(struct _RTMP_ADAPTER *pAd, INT32 type, INT32 dec, - UINT8 TxAntennaSel, UINT8 Band); - -INT32 MtCmdSetRDDTestExt(struct _RTMP_ADAPTER *pAd, UINT32 rdd_idx, - UINT32 rdd_in_sel, UINT32 IsStart); - -INT32 MtCmdSetRDDTest(struct _RTMP_ADAPTER *pAd, UINT32 IsStart); - -INT32 MtCmdSetCalDump(struct _RTMP_ADAPTER *pAd, UINT32 IsEnable); - -INT32 MtCmdMultipleMacRegAccessWrite(struct _RTMP_ADAPTER *pAd, - struct _RTMP_REG_PAIR *RegPair, - UINT32 Num); - -INT32 MtCmdMultipleMacRegAccessRead(struct _RTMP_ADAPTER *pAd, - struct _RTMP_REG_PAIR *RegPair, UINT32 Num); - -INT32 MtCmdMultipleRfRegAccessWrite(struct _RTMP_ADAPTER *pAd, - struct _MT_RF_REG_PAIR *RegPair, - UINT32 Num); - -INT32 MtCmdMultipleRfRegAccessRead(struct _RTMP_ADAPTER *pAd, - struct _MT_RF_REG_PAIR *RegPair, UINT32 Num); - -INT32 MtCmdThermoCal(struct _RTMP_ADAPTER *pAd, UINT8 IsEnable, - UINT8 SourceMode, UINT8 RFDiffTemp, UINT8 HiBBPHT, - UINT8 HiBBPNT, INT8 LoBBPLT, INT8 LoBBPNT); - -INT32 MtCmdFwLog2Host(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, - UINT8 FWLog2HostCtrl); - -VOID CmdIOWrite32(struct _RTMP_ADAPTER *pAd, UINT32 Offset, UINT32 Value); - -VOID CmdIORead32(struct _RTMP_ADAPTER *pAd, UINT32 Offset, UINT32 *Value); - -VOID MtCmdEfusBufferModeSet(struct _RTMP_ADAPTER *pAd, UINT8 EepromType); -INT32 MtCmdSetRxvFilter(struct _RTMP_ADAPTER *pAd, UCHAR BandIdx, - BOOLEAN bEnable); - -NTSTATUS MtCmdPowerOnWiFiSys(struct _RTMP_ADAPTER *pAd); - -VOID CmdExtEventRsp(struct cmd_msg *msg, char *Data, UINT16 Len); - -INT32 MtCmdSendRaw(struct _RTMP_ADAPTER *pAd, UCHAR ExtendID, UCHAR *Input, - INT len, UCHAR SetQuery); - -#if defined(TXRX_STAT_SUPPORT) || defined(EAP_STATS_SUPPORT) -INT32 MtCmdGetPerStaTxStat(struct _RTMP_ADAPTER *pAd, UINT8 *ucEntryBitmap, - UINT8 ucEntryCount); -#endif - -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) -INT32 MtCmdGetWtblTxStat(struct _RTMP_ADAPTER *pAd, UINT32 u4Field, - UINT8 ucWcid); -#endif - -#ifdef CONFIG_ATE -INT32 MtCmdGetTxPower(struct _RTMP_ADAPTER *pAd, UINT8 pwrType, UINT8 centerCh, - UINT8 dbdc_idx, UINT8 Ch_Band, - P_EXT_EVENT_ID_GET_TX_POWER_T prTxPwrResult); - -INT32 MtCmdSetTxPowerCtrl(struct _RTMP_ADAPTER *pAd, - struct _ATE_TXPOWER TxPower); -INT32 MtCmdSetForceTxPowerCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucBandIdx, - INT8 cTxPower, UINT8 ucPhyMode, UINT8 ucTxRate, - UINT8 ucBW); -#endif /* CONFIG_ATE */ - -#ifdef MT_MAC -INT32 CmdETxBfAidSetting(struct _RTMP_ADAPTER *pAd, UINT16 Aid); - -INT32 CmdTxBfApClientCluster(struct _RTMP_ADAPTER *pAd, UCHAR ucWlanIdx, - UCHAR ucCmmWlanId); - -INT32 CmdTxBfReptClonedStaToNormalSta(struct _RTMP_ADAPTER *pAd, - UCHAR ucWlanIdx, UCHAR ucCliIdx); - -INT32 CmdTxBfTxApplyCtrl(struct _RTMP_ADAPTER *pAd, UCHAR ucWlanId, - BOOLEAN fgETxBf, BOOLEAN fgITxBf, BOOLEAN fgMuTxBf, - BOOLEAN fgPhaseCali); - -INT32 CmdITxBfPhaseCal(struct _RTMP_ADAPTER *pAd, UCHAR ucGroup, - UCHAR ucGroupL_M_H, BOOLEAN fgSX2, BOOLEAN ucPhaseCal, - UCHAR ucPhaseVerifyLnaGainLevel); - -INT32 CmdITxBfPhaseComp(struct _RTMP_ADAPTER *pAd, UCHAR ucBW, UCHAR ucBand, - UCHAR ucDbdcBandIdx, UCHAR ucGroup, BOOLEAN fgRdFromE2p, - BOOLEAN fgDisComp); - -INT32 CmdTxBfLnaGain(struct _RTMP_ADAPTER *pAd, UCHAR ucLnaGain); - -INT32 CmdETxBfSoundingPeriodicTriggerCtrl(struct _RTMP_ADAPTER *pAd, - UCHAR SndgEn, UINT32 u4SNDPeriod, - UCHAR ucSu_Mu, UCHAR ucMuNum, - PUCHAR pwlanidx); - -INT32 CmdPfmuMemAlloc(struct _RTMP_ADAPTER *pAd, UCHAR ucSu_Mu, - UCHAR ucWlanIdx); - -INT32 CmdPfmuMemRelease(struct _RTMP_ADAPTER *pAd, UCHAR ucWlanIdx); - -INT32 CmdPfmuMemAllocMapRead(struct _RTMP_ADAPTER *pAd); - -INT32 CmdETxBfPfmuProfileTagRead(struct _RTMP_ADAPTER *pAd, UCHAR PfmuIdx, - BOOLEAN fgBFer); - -INT32 CmdETxBfPfmuProfileTagWrite(struct _RTMP_ADAPTER *pAd, PUCHAR prPfmuTag1, - PUCHAR prPfmuTag2, UCHAR PfmuIdx); - -INT32 CmdETxBfPfmuProfileDataRead(struct _RTMP_ADAPTER *pAd, UCHAR PfmuIdx, - BOOLEAN fgBFer, USHORT SubCarrIdx); - -INT32 CmdETxBfPfmuProfileDataWrite(struct _RTMP_ADAPTER *pAd, UCHAR PfmuIdx, - USHORT SubCarrIdx, PUCHAR pProfileData); - -INT32 CmdETxBfPfmuProfileDataWrite20MAll(struct _RTMP_ADAPTER *pAd, - UCHAR PfmuIdx, PUCHAR pProfileData); - -INT32 CmdETxBfPfmuProfilePnRead(struct _RTMP_ADAPTER *pAd, UCHAR PfmuIdx); - -INT32 CmdETxBfPfmuProfilePnWrite(struct _RTMP_ADAPTER *pAd, UCHAR PfmuIdx, - UCHAR ucBw, PUCHAR pProfileData); - -INT32 CmdETxBfQdRead(struct _RTMP_ADAPTER *pAd, INT8 subCarrIdx); -#endif /* MT_MAC */ - -#ifdef COEX_SUPPORT -/* - * Coex Sub - */ -enum EXT_BTCOEX_SUB { - COEX_SET_PROTECTION_FRAME = 0x1, - COEX_WIFI_STATUS_UPDATE = 0x2, - COEX_UPDATE_BSS_INFO = 0x03, -}; - -/* - * Coex status bit - */ -enum EXT_BTCOEX_STATUS_bit { - COEX_STATUS_RADIO_ON = 0x01, - COEX_STATUS_SCAN_G_BAND = 0x02, - COEX_STATUS_SCAN_A_BAND = 0x04, - COEX_STATUS_LINK_UP = 0x08, - COEX_STATUS_BT_OVER_WIFI = 0x10, -}; - -enum EXT_BTCOEX_PROTECTION_MODE { - COEX_Legacy_CCK = 0x00, - COEX_Legacy_OFDM = 0x01, - COEX_HT_MIX = 0x02, - COEX_HT_Green = 0x03, - COEX_VHT = 0x04, -}; - -enum EXT_BTCOEX_OFDM_PROTECTION_RATE { - PROTECTION_OFDM_6M = 0x00, - PROTECTION_OFDM_9M = 0x01, - PROTECTION_OFDM_12M = 0x02, - PROTECTION_OFDM_18M = 0x03, - PROTECTION_OFDM_24M = 0x04, - PROTECTION_OFDM_36M = 0x05, - PROTECTION_OFDM_48M = 0x06, - PROTECTION_OFDM_54M = 0x07, -}; -/* - * Coex status bit - */ - -typedef enum _WIFI_STATUS { - STATUS_RADIO_ON = 0, - STATUS_RADIO_OFF = 1, - STATUS_SCAN_G_BAND = 2, - STATUS_SCAN_G_BAND_END = 3, - STATUS_SCAN_A_BAND = 4, - STATUS_SCAN_A_BAND_END = 5, - STATUS_LINK_UP = 6, - STATUS_LINK_DOWN = 7, - STATUS_BT_OVER_WIFI = 8, - STATUS_BT_MAX, -} WIFI_STATUS; - -typedef struct GNU_PACKED _CMD_COEXISTENCE_T { - UINT8 ucSubOpCode; - UINT8 aucReserve[3]; - UINT8 aucData[48]; -} EXT_CMD_COEXISTENCE_T, *P_EXT_CMD_COEXISTENCE_T; - -typedef struct GNU_PACKED _EVENT_EXT_COEXISTENCE_T { - UINT8 ucSubOpCode; - UINT8 aucReserve[3]; - UINT8 aucBuffer[64]; -} EVENT_EXT_COEXISTENCE_T, *P_EVENT_EXT_COEXISTENCE_T; - -typedef struct GNU_PACKED _COEX_WIFI_STATUS_UPDATE_T { - UINT32 u4WIFIStatus; -} COEX_WIFI_STATUS_UPDATE_T, *P_COEX_WIFI_STATUS_UPDATE_T; - -typedef struct GNU_PACKED _COEX_SET_PROTECTION_FRAME_T { - UINT8 ucProFrameMode; - UINT8 ucProFrameRate; - UINT8 aucReserve[2]; -} COEX_SET_PROTECTION_FRAME_T, *P_COEX_SET_PROTECTION_FRAME_T; - -typedef struct GNU_PACKED _COEX_UPDATE_BSS_INFO_T { - UINT8 u4BSSPresence[4]; - UINT8 u4BSSAPMode[4]; - UINT8 u4IsQBSS[4]; -} COEX_UPDATE_BSS_INFO_T, *P_COEX_UPDATE_BSS_INFO_T; - -typedef struct GNU_PACKED _EVENT_COEX_CMD_RESPONSE_T { - UINT32 u4Status; -} EVENT_COEX_CMD_RESPONSE_T, *P_EVENT_COEX_CMD_RESPONSE_T; - -typedef struct GNU_PACKED _EVENT_COEX_REPORT_COEX_MODE_T { - UINT32 u4SupportCoexMode; - UINT32 u4CurrentCoexMode; -} EVENT_COEX_REPORT_COEX_MODE_T, *P_EVENT_COEX_REPORT_COEX_MODE_T; - -typedef struct GNU_PACKED _EVENT_COEX_MASK_OFF_TX_RATE_T { - UINT8 ucOn; - UINT8 aucReserve[3]; -} EVENT_COEX_MASK_OFF_TX_RATE_T, *P_EVENT_COEX_MASK_OFF_TX_RATE_T; - -typedef struct GNU_PACKED _EVENT_COEX_CHANGE_RX_BA_SIZE_T { - UINT8 ucOn; - UINT8 ucRXBASize; - UINT8 aucReserve[2]; -} EVENT_COEX_CHANGE_RX_BA_SIZE_T, *P_EVENT_COEX_CHANGE_RX_BA_SIZE_T; - -typedef struct GNU_PACKED _EVENT_COEX_LIMIT_BEACON_SIZE_T { - UINT8 ucOn; - UINT8 aucReserve[3]; -} EVENT_COEX_LIMIT_BEACON_SIZE_T, *P_EVENT_COEX_LIMIT_BEACON_SIZE_T; - -typedef struct GNU_PACKED _EVENT_COEX_EXTEND_BTO_ROAMING_T { - UINT8 ucOn; - UINT8 aucReserve[3]; -} EVENT_COEX_EXTEND_BTO_ROAMING_T, *P_EVENT_COEX_EXTEND_BTO_ROAMING_T; - -typedef struct GNU_PACKED _COEX_TMP_FRAME_T { - UINT8 ucProFrame1; - UINT8 ucProFrame2; - UINT8 ucProFrame3; - UINT8 ucProFrame4; -} COEX_TMP_FRAME_T, *P_COEX_TMP_FRAME_T; - -INT AndesCoexOP(struct _RTMP_ADAPTER *pAd, UCHAR Status); - -INT AndesCoexProtectionFrameOP(struct _RTMP_ADAPTER *pAd, UCHAR Mode, - UCHAR Rate); - -INT AndesCoexBSSInfo(struct _RTMP_ADAPTER *pAd, BOOLEAN Enable, UCHAR bQoS); - -#endif /* COEX_SUPPORT */ - -#ifdef IGMP_TVM_SUPPORT -#define MCAST_RSP_ENTRY_TABLE 0x01 - -typedef struct _IGMP_MULTICAST_TABLE_MEMBER { - UINT8 Addr[MAC_ADDR_LEN]; - UINT8 TVMode; - UINT8 Rsvd; -} IGMP_MULTICAST_TABLE_MEMBER, *P_IGMP_MULTICAST_TABLE_MEMBER; - -typedef struct _IGMP_MULTICAST_TABLE_ENTRY { - UINT8 NumOfMember; - UINT8 Rsvd1; - UINT16 ThisGroupSize; - UINT32 lastTime; - UINT32 AgeOut; - UINT32 type; /* 0: static, 1: dynamic. */ - UINT8 GroupAddr[MAC_ADDR_LEN]; - UINT8 Rsvd2[2]; - IGMP_MULTICAST_TABLE_MEMBER IgmpMcastMember - [1]; /* This member will be multiple of NumOfMember, shows variable structure */ -} IGMP_MULTICAST_TABLE_ENTRY, *P_IGMP_MULTICAST_TABLE_ENTRY; - -typedef struct _IGMP_MULTICAST_TABLE { - UINT8 EvtSeqNum; /* Since there will be multiple events, this will store the sequence, starting from 1 */ - UINT8 NumOfGroup; - UINT8 TotalGroup; - UINT8 Rsvd; - UINT16 ThisTableSize; /* Total size in current event. Only valid for event */ - UINT16 TotalSize; - IGMP_MULTICAST_TABLE_ENTRY - *pNxtFreeGroupLocation; /* Used only in driver */ - IGMP_MULTICAST_TABLE_ENTRY IgmpMcastTableEntry - [1]; /* This member will be multiple of NumOfGroup, shows variable structure */ -} IGMP_MULTICAST_TABLE, *P_IGMP_MULTICAST_TABLE; - -typedef struct GNU_PACKED _EXT_EVENT_ID_IGMP_MULTICAST_SET_GET { - UINT8 ucRspType; - UINT8 ucOwnMacIdx; - UINT8 Rsvd[2]; - union { - IGMP_MULTICAST_TABLE McastTable; - } RspData; -} EXT_EVENT_ID_IGMP_MULTICAST_SET_GET, *P_EXT_EVENT_ID_IGMP_MULTICAST_SET_GET_T; -#endif /* IGMP_TVM_SUPPORT */ - -#ifdef RTMP_EFUSE_SUPPORT - -INT32 MtCmdEfuseAccessRead(struct _RTMP_ADAPTER *pAd, USHORT offset, - PUCHAR pData, PUINT isVaild); - -VOID MtCmdEfuseAccessWrite(struct _RTMP_ADAPTER *pAd, USHORT offset, - PUCHAR pData); - -INT32 MtCmdEfuseFreeBlockCount(struct _RTMP_ADAPTER *pAd, UINT32 GetFreeBlock, - UINT32 *Value); -INT32 MtCmdEfuseAccessCheck(struct _RTMP_ADAPTER *pAd, UINT32 offset, - PUCHAR pData); - -#endif /* RTMP_EFUSE_SUPPORT */ - -INT32 MtCmdThermalProtect(struct _RTMP_ADAPTER *pAd, UINT8 HighEn, - CHAR HighTempTh, UINT8 LowEn, CHAR LowTempTh, - UINT32 RechkTimer, UINT8 RFOffEn, CHAR RFOffTh, - UINT8 ucType); - -INT32 -MtCmdThermalProtectAdmitDuty(struct _RTMP_ADAPTER *pAd, UINT32 u4Lv0Duty, - UINT32 u4Lv1Duty, UINT32 u4Lv2Duty, - UINT32 u4Lv3Duty); - -#ifdef PRETBTT_INT_EVENT_SUPPORT -VOID MtSetTriggerPretbttIntEvent(struct _RTMP_ADAPTER *ad, INT apidx, - UCHAR HWBssidIdx, BOOLEAN Enable, - UINT16 BeaconPeriod); -INT32 MtCmdTrgrPretbttIntEventSet( - struct _RTMP_ADAPTER *ad, - CMD_TRGR_PRETBTT_INT_EVENT_T trgr_pretbtt_int_event); -#endif /*PRETBTT_INT_EVENT_SUPPORT*/ - -INT32 CmdCrUpdate(struct _RTMP_ADAPTER *pAd, VOID *Context, UINT16 Length); - -/* PNDIS_PACKET WtblTlvBufferAlloc(struct _RTMP_ADAPTER *pAd, UINT32 u4AllocateSize); */ -/* VOID* WtblNextTlvBuffer(PNDIS_PACKET pWtblTlvBuffer, UINT16 u2Length); */ -/* VOID WtblTlvBufferAppend(PNDIS_PACKET pWtblTlvBuffer, UINT16 u2Type, UINT16 u2Length, PUCHAR pNextWtblTlvBuffer); */ -/* VOID WtblTlvBufferFree(struct _RTMP_ADAPTER *pAd, PNDIS_PACKET pWtblTlvBuffer); */ -VOID *pTlvAppend(VOID *pTlvBuffer, UINT16 u2Type, UINT16 u2Length, - VOID *pNextTlvBuffer, UINT32 *pu4TotalTlvLen, - UCHAR *pucTotalTlvNumber); -INT32 CmdExtTlvBufferSend(struct _RTMP_ADAPTER *pAd, UINT8 ExtCmdType, - VOID *pTlvBuffer, UINT32 u4TlvLength); -INT32 CmdExtWtblUpdate(struct _RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, - UINT8 ucOperation, VOID *pBuffer, UINT32 u4BufferLen); -UINT32 WtblDwQuery(struct _RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, UINT8 ucWtbl1234, - UINT8 ucWhichDW); -INT32 WtblDwSet(struct _RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, UINT8 ucWtbl1234, - UINT8 ucWhichDW, UINT32 u4DwMask, UINT32 u4DwValue); - -struct cmd_wtbl_dw_mask_set { - UINT8 ucWhichDW; - UINT32 u4DwMask; - UINT32 u4DwValue; -}; -INT32 WtblResetAndDWsSet(struct _RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, - UINT8 ucWtbl1234, INT dw_cnt, - struct cmd_wtbl_dw_mask_set *dw_set); - -INT32 CmdExtDevInfoUpdate(struct _RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, - UINT8 *OwnMacAddr, UINT8 BandIdx, UINT8 Active, - UINT32 EnableFeature); - -INT32 CmdExtSetTmrCR(struct _RTMP_ADAPTER *pAd, UCHAR enable, UCHAR BandIdx); - -INT32 CmdExtStaRecUpdate(struct _RTMP_ADAPTER *pAd, STA_REC_CFG_T StaRecCfg); - -INT32 CmdETxBfStaRecRead(struct _RTMP_ADAPTER *pAd, UCHAR ucWlanID); - -INT32 CmdTxBfTxPwrBackOff(struct _RTMP_ADAPTER *pAd, UCHAR ucBandIdx, - PCHAR pacTxPwrFccBfOnCase, - PCHAR pacTxPwrFccBfOffCase); - -INT32 CmdTxBfAwareCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgBfAwareCtrl); - -INT32 CmdTxBfeeHwCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgBfeeHwEn); - -INT32 CmdTxBfHwEnableStatusUpdate(struct _RTMP_ADAPTER *pAd, BOOLEAN fgEBf, - BOOLEAN fgIBf); - -INT32 CmdTxBfModuleEnCtrl(struct _RTMP_ADAPTER *pAd, UINT8 u1BfNum, - UINT8 u1BfBitmap, UINT8 u1BfSelBand[]); - -INT32 CmdExtStaRecBaUpdate(struct _RTMP_ADAPTER *pAd, - STA_REC_BA_CFG_T StaRecBaCfg); - -INT32 CmdSetSyncModeByBssInfoUpdate( - struct _RTMP_ADAPTER *pAd, - struct _BSS_INFO_ARGUMENT_T bss_info_argument); - -INT32 CmdExtBssInfoUpdate(struct _RTMP_ADAPTER *pAd, - struct _BSS_INFO_ARGUMENT_T bss_info_argument); - -#ifdef CONFIG_HW_HAL_OFFLOAD -INT32 MtCmdATETest(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_ATE_TEST_MODE_T *param); -INT32 MtCmdCfgOnOff(struct _RTMP_ADAPTER *pAd, UINT8 Type, UINT8 Enable, - UINT8 Band); -INT32 MtCmdSetAntennaPort(struct _RTMP_ADAPTER *pAd, UINT8 RfModeMask, - UINT8 RfPortMask, UINT8 AntPortMask); -INT32 MtCmdATESetSlotTime(struct _RTMP_ADAPTER *pAd, UINT8 SlotTime, - UINT8 SifsTime, UINT8 RifsTime, UINT16 EifsTime, - UCHAR BandIdx); -INT32 MtCmdATESetPowerDropLevel(struct _RTMP_ADAPTER *pAd, UINT8 PowerDropLevel, - UCHAR BandIdx); -INT32 MtCmdRxFilterPktLen(struct _RTMP_ADAPTER *pAd, UINT8 Enable, UINT8 Band, - UINT32 RxPktLen); -INT32 MtCmdSetFreqOffset(struct _RTMP_ADAPTER *pAd, UINT32 FreqOffset); -INT32 MtCmdGetFreqOffset(struct _RTMP_ADAPTER *pAd, UINT32 *FreqOffsetResult); -INT32 MtCmdGetCfgOnOff(struct _RTMP_ADAPTER *pAd, UINT32 Type, UINT8 Band, - UINT32 *Status); -INT32 MtCmdSetPhyCounter(struct _RTMP_ADAPTER *pAd, UINT32 Control, - UINT8 band_idx); -INT32 MtCmdSetRxvIndex(struct _RTMP_ADAPTER *pAd, UINT8 Group_1, UINT8 Group_2, - UINT8 band_idx); -INT32 MtCmdSetFAGCPath(struct _RTMP_ADAPTER *pAd, UINT8 Path, UINT8 band_idx); -#endif -INT32 MtCmdClockSwitchDisable(struct _RTMP_ADAPTER *pAd, UINT8 isDisable); -INT32 MtCmdUpdateProtect(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_UPDATE_PROTECT_T *param); -INT32 MtCmdSetRdg(struct _RTMP_ADAPTER *pAd, struct _EXT_CMD_RDG_CTRL_T *param); -INT32 MtCmdSetSnifferMode(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_SNIFFER_MODE_T *param); - -VOID MtCmdMemDump(struct _RTMP_ADAPTER *pAd, UINT32 Addr, PUINT8 pData); -INT SetRaOptionFrequecyDup_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#ifdef CONFIG_ATE -INT32 CmdTxContinous(struct _RTMP_ADAPTER *pAd, UINT32 PhyMode, UINT32 BW, - UINT32 PriCh, UINT32 Mcs, UINT32 WFSel, UCHAR onoff); -INT32 CmdTxTonePower(struct _RTMP_ADAPTER *pAd, INT32 type, INT32 dec); -#endif -INT32 MtCmdGetThermalSensorResult(struct _RTMP_ADAPTER *pAd, UINT8 ActionIdx, - UINT32 *SensorResult); - -#ifdef TXSTAT_2040BW_24G_SUPPORT -extern BOOLEAN Is2040StatFeatureEnbl; - -#define SET_2040_FEATURE_ENABLE TRUE -#define SET_2040_FEATURE_DISABLE FALSE - -#define SET_STAREC_BW_STATS_SUPPORT(enable) ((Is2040StatFeatureEnbl) = enable) -#define IF_STAREC_BW_STATS_SUPPORT() ((Is2040StatFeatureEnbl) == TRUE) - -INT32 MtCmdSetBWStatFeature(struct _RTMP_ADAPTER *pAd, UCHAR isEnable); -INT32 MtCmdGetBWStatFeature(struct _RTMP_ADAPTER *pAd, UCHAR isEnable); -#endif - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT -struct _EXT_EVENT_TX_STATISTIC_RESULT_T; -INT32 MtCmdGetTxStatistic( - struct _RTMP_ADAPTER *pAd, UINT32 u4Field, UINT8 ucBand, UINT8 ucWcid, - struct _EXT_EVENT_TX_STATISTIC_RESULT_T *prTxStatResult); -INT32 mt_cmd_get_sta_tx_statistic(struct _RTMP_ADAPTER *ad, UINT8 wcid, - UINT8 dbdc_idx, UINT32 field); -#ifdef RACTRL_LIMIT_MAX_PHY_RATE -INT32 MtCmdSetMaxPhyRate(struct _RTMP_ADAPTER *pAd, UINT16 u2MaxPhyRate); -#endif /* RACTRL_LIMIT_MAX_PHY_RATE */ -INT32 MtCmdSetVhtRateIn2G(struct _RTMP_ADAPTER *pAd, BOOLEAN fgEnVhtForHtIn2G); -#ifdef MIN_PHY_RATE_SUPPORT -INT32 MtCmdSetMinPhyRate(struct _RTMP_ADAPTER *pAd, struct wifi_dev *wdev); -#endif /* MIN_PHY_RATE_SUPPORT */ -#ifdef FAST_UP_RATE_SUPPORT -INT32 MtCmdSetFastUpRate(struct _RTMP_ADAPTER *pAd, UCHAR isEnable); -#endif /* MIN_PHY_RATE_SUPPORT */ - -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - -INT32 MtCmdTmrCal(struct _RTMP_ADAPTER *pAd, UINT8 enable, UINT8 band, UINT8 bw, - UINT8 ant, UINT8 role); - -INT32 MtCmdEdcaParameterSet(struct _RTMP_ADAPTER *pAd, - MT_EDCA_CTRL_T EdcaParam); - -INT32 MtCmdSlotTimeSet(struct _RTMP_ADAPTER *pAd, UINT8 SlotTime, - UINT8 SifsTime, UINT8 RifsTime, UINT16 EifsTime, - UCHAR BandIdx); - -#ifdef CONFIG_MULTI_CHANNEL -INT MtCmdMccStart(struct _RTMP_ADAPTER *pAd, UINT32 Num, - MT_MCC_ENTRT_T *MccEntries, USHORT IdleTime, - USHORT NullRepeatCnt, ULONG StartTsf); - -INT32 MtCmdMccStop(struct _RTMP_ADAPTER *pAd, UCHAR ParkingIndex, - UCHAR AutoResumeMode, UINT16 AutoResumeInterval, - ULONG AutoResumeTsf); -#endif /* CONFIG_MULTI_CHANNEL */ - -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) -INT32 CmdP2pNoaOffloadCtrl(struct _RTMP_ADAPTER *ad, UINT8 enable); -#endif /* defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) */ - -INT32 MtCmdSendMsg(struct _RTMP_ADAPTER *pAd, struct cmd_msg *msg); -INT32 MtCmdLEDCtrl(struct _RTMP_ADAPTER *pAd, UINT32 LEDNumber, - UINT32 LEDBehavior); - -#ifdef ERR_RECOVERY -INT32 CmdExtGeneralTestOn(struct _RTMP_ADAPTER *pAd, BOOLEAN enable); -INT32 CmdExtGeneralTestMode(struct _RTMP_ADAPTER *pAd, UINT8 mode, - UINT8 submode); -#endif /* ERR_RECOVERY */ - -#ifdef DBDC_MODE -INT32 MtCmdGetDbdcCtrl(struct _RTMP_ADAPTER *pAd, - struct _BCTRL_INFO_T *pBandInfo); -INT32 MtCmdSetDbdcCtrl(struct _RTMP_ADAPTER *pAd, - struct _BCTRL_INFO_T *pBandInfo); -#endif - -#ifdef MT_DFS_SUPPORT /* Jelly20150123 */ -INT32 MtCmdRddCtrl(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucRddCtrl, - IN UCHAR ucRddIdex, IN UCHAR ucRddInSel, IN UCHAR ucSetVal); -#endif /*MT_DFS_SUPPORT*/ - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -INT32 MtCmdSetFcc5MinLPN(struct _RTMP_ADAPTER *pAd, UINT16 u2MinLpnUpdate); -INT32 MtCmdSetRadarThresholdParam( - struct _RTMP_ADAPTER *pAd, - P_CMD_RDM_RADAR_THRESHOLD_UPDATE_T pRadarThreshold); -INT32 MtCmdSetPulseThresholdParam( - struct _RTMP_ADAPTER *pAd, - P_CMD_RDM_PULSE_THRESHOLD_UPDATE_T pPulseThreshold); -INT32 MtCmdSetRddLogConfigUpdate(struct _RTMP_ADAPTER *pAd, - UINT8 ucHwRDDLogEnable, UINT8 ucSwRDDLogEnable, - UINT8 ucSwRDDLogCond); -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT -INT32 MtCmdSetTestRadarPattern(struct _RTMP_ADAPTER *pAd, - P_CMD_RDM_TEST_RADAR_PATTERN_T pTestPulsePattern); -#endif - -INT32 MtCmdGetEdca(struct _RTMP_ADAPTER *pAd, MT_EDCA_CTRL_T *pEdcaCtrl); -INT32 MtCmdGetTsfTime(struct _RTMP_ADAPTER *pAd, UCHAR HwBssidIdx, - TSF_RESULT_T *pTsfResult); -INT32 MtCmdGetChBusyCnt(struct _RTMP_ADAPTER *pAd, UCHAR ChIdx, - UINT32 *pChBusyCnt); -INT32 MtCmdGetWifiInterruptCnt(struct _RTMP_ADAPTER *pAd, UCHAR ChIdx, - UCHAR WifiIntNum, UINT32 WifiIntMask, - UINT32 *pWifiInterruptCnt); -INT32 MtCmdSetMacTxRx(struct _RTMP_ADAPTER *pAd, UCHAR BandIdx, - BOOLEAN bEnable); -#ifdef MT_DFS_SUPPORT -INT32 MtCmdSetDfsTxStart(struct _RTMP_ADAPTER *pAd, UCHAR BandIdx); -#endif -#ifdef PRE_CAL_TRX_SET1_SUPPORT -INT32 MtCmdGetRXDCOCCalResult(struct _RTMP_ADAPTER *pAd, BOOLEAN DirectionToCR, - UINT16 CentralFreq, UINT8 BW, UINT8 Band, - BOOLEAN IsSecondary80, - BOOLEAN DoRuntimeCalibration, - RXDCOC_RESULT_T *pRxDcocResult); -INT32 MtCmdGetTXDPDCalResult(struct _RTMP_ADAPTER *pAd, BOOLEAN DirectionToCR, - UINT16 CentralFreq, UINT8 BW, UINT8 Band, - BOOLEAN IsSecondary80, - BOOLEAN DoRuntimeCalibration, - TXDPD_RESULT_T *pTxDPDResult); -INT32 MtCmdRDCE(struct _RTMP_ADAPTER *pAd, UINT8 type, UINT8 BW, UINT8 Band); -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ -#ifdef PRE_CAL_MT7622_SUPPORT -INT32 MtCmdRfTestRecal(struct _RTMP_ADAPTER *pAd, UINT32 u4CalId, - UINT16 rsp_len); -#endif /*PRE_CAL_MT7622_SUPPORT*/ -#ifdef RLM_CAL_CACHE_SUPPORT -VOID rlmCalCacheApply(struct _RTMP_ADAPTER *pAd, VOID *rlmCache); -#endif /* RLM_CAL_CACHE_SUPPORT */ - -#ifdef PRE_CAL_TRX_SET2_SUPPORT -INT32 MtCmdGetPreCalResult(struct _RTMP_ADAPTER *pAd, UINT8 CalId, - UINT16 PreCalBitMap); -INT32 MtCmdPreCalReStoreProc(struct _RTMP_ADAPTER *pAd, INT32 *pPreCalBuffer); -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ -INT32 MtCmdThermalReCalMode(struct _RTMP_ADAPTER *pAd, UINT8 Mode); - -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -INT32 MtCmdCalReStoreFromFileProc(struct _RTMP_ADAPTER *pAd, - CAL_RESTORE_FUNC_IDX FuncIdx); -INT32 MtCmdPATrimReStoreProc(struct _RTMP_ADAPTER *pAd); -#endif /* CAL_BIN_FILE_SUPPORT */ - -INT32 CmdRxHdrTransUpdate(struct _RTMP_ADAPTER *pAd, BOOLEAN En, - BOOLEAN ChkBssid, BOOLEAN InSVlan, BOOLEAN RmVlan, - BOOLEAN SwPcP); -INT32 CmdRxHdrTransBLUpdate(struct _RTMP_ADAPTER *pAd, UINT8 Index, UINT8 En, - UINT16 EthType); -#ifdef VOW_SUPPORT -INT32 MtCmdSetVoWDRRCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_VOW_DRR_CTRL_T *param); -INT32 MtCmdSetVoWGroupCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_BSS_CTRL_T *param); -INT32 MtCmdSetVoWFeatureCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_VOW_FEATURE_CTRL_T *param); -INT32 MtCmdSetVoWRxAirtimeCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_RX_AT_CTRL_T *param); -INT32 MtCmdGetVoWRxAirtimeCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_RX_AT_CTRL_T *param); -INT32 MtCmdSetVoWModuleCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_AT_PROC_MODULE_CTRL_T *param); -INT32 MtCmdSetVoWCounterCtrl(struct _RTMP_ADAPTER *pAd, UCHAR cmd, UCHAR val); -#if defined(MT7615_FPGA) || defined(MT7622_FPGA) -INT32 MtCmdSetStaQLen(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 qLen); -INT32 MtCmdSetSta2QLen(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 qLen); -INT32 MtCmdSetEmptyThreshold(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, - UINT32 threshold); -INT32 MtCmdSetStaCnt(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 cnt); -#endif /* defined(MT7615_FPGA) || defined(MT7622_FPGA) */ -#endif /* VOW_SUPPORT */ -#ifdef RED_SUPPORT -INT32 MtCmdSetRedShowSta(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 Num); -INT32 MtCmdSetRedEnable(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 en); -INT32 MtCmdSetRedTargetDelay(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, - UINT32 Num); -#endif /* RED_SUPPORT */ -INT32 MtCmdSetCPSEnable(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 en); -INT32 CmdAutoBATrigger(struct _RTMP_ADAPTER *pAd, BOOLEAN Enable, - UINT32 Timeout); - -INT32 MtCmdCr4Query(struct _RTMP_ADAPTER *pAd, UINT32 arg0, UINT32 arg1, - UINT32 arg2); -INT32 MtCmdCr4Set(struct _RTMP_ADAPTER *pAd, UINT32 arg0, UINT32 arg1, - UINT32 arg2); -INT32 MtCmdCr4Capability(struct _RTMP_ADAPTER *pAd, UINT32 option); -INT32 MtCmdCr4Debug(struct _RTMP_ADAPTER *pAd, UINT32 option); -INT MtCmdSetTxRxPath(struct _RTMP_ADAPTER *pAd, - struct _MT_SWITCH_CHANNEL_CFG SwChCfg); -INT32 MtCmdCr4QueryBssAcQPktNum(struct _RTMP_ADAPTER *pAd, UINT32 u4bssbitmap); - -#ifdef TXPWRMANUAL -INT32 MtCmdTxPowerManualCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgPwrManCtrl, - UINT8 u1TxPwrModeManual, UINT8 u1TxPwrBwManual, - UINT8 u1TxPwrRateManual, INT8 i1TxPwrValueManual, - UCHAR BandIdx); -#endif /* TXPWRMANUAL */ - -#ifdef BACKGROUND_SCAN_SUPPORT -INT32 MtCmdBgndScan(struct _RTMP_ADAPTER *pAd, - struct _MT_BGND_SCAN_CFG BgScCfg); -INT32 MtCmdBgndScanNotify(struct _RTMP_ADAPTER *pAd, - struct _MT_BGND_SCAN_NOTIFY BgScNotify); -#endif /* BACKGROUND_SCAN_SUPPORT */ - -INT32 CmdExtGeneralTestAPPWS(struct _RTMP_ADAPTER *pAd, UINT action); -#ifdef IGMP_SNOOP_SUPPORT -INT32 CmdMcastCloneEnable(struct _RTMP_ADAPTER *pAd, UINT Enable, - UINT8 omac_idx); -BOOLEAN CmdMcastEntryInsert(struct _RTMP_ADAPTER *pAd, PUCHAR GrpAddr, - UINT8 BssIdx, UINT8 Type, PUCHAR MemberAddr, - PNET_DEV dev, UINT8 WlanIndex); -BOOLEAN CmdMcastEntryDelete(struct _RTMP_ADAPTER *pAd, PUCHAR GrpAddr, - UINT8 BssIdx, PUCHAR MemberAddr, PNET_DEV dev, - UINT8 WlanIndex); -#ifdef IGMP_TVM_SUPPORT -BOOLEAN CmdSetMcastEntryAgeOut(struct _RTMP_ADAPTER *pAd, UINT8 AgeOutTime, - UINT8 omac_idx); -BOOLEAN CmdGetMcastEntryTable(struct _RTMP_ADAPTER *pAd, UINT8 omac_idx, - struct wifi_dev *wdev); -VOID CmdExtEventIgmpMcastTableRsp(struct cmd_msg *msg, char *Data, UINT16 Len); -#endif /* IGMP_TVM_SUPPORT */ -#endif - -INT32 MtCmdTxPowerSKUCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgTxPowerSKUEn, - UCHAR BandIdx); -INT32 MtCmdTxCCKStream(struct _RTMP_ADAPTER *pAd, UINT8 u1CCKTxStream, - UCHAR BandIdx); -INT32 MtCmdTxPowerPercentCtrl(struct _RTMP_ADAPTER *pAd, - BOOLEAN fgTxPowerPercentEn, UCHAR BandIdx); -INT32 MtCmdTxPowerDropCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucPowerDrop, - UCHAR BandIdx); -INT32 MtCmdTxBfBackoffCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgTxBFBackoffEn, - UCHAR BandIdx); -INT32 MtCmdThermoCompCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgThermoCompEn, - UCHAR BandIdx); -INT32 MtCmdTxPwrRfTxAntCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucTxAntIdx); -INT32 MtCmdTxPwrShowInfo(struct _RTMP_ADAPTER *pAd, UCHAR ucTxPowerInfoCatg, - UINT8 ucBandIdx); -#ifdef WIFI_EAP_FEATURE -INT32 MtCmdSetEdccaThreshold(struct _RTMP_ADAPTER *pAd, UINT32 edcca_threshold); -INT32 MtCmdInitIPICtrl(struct _RTMP_ADAPTER *pAd, UINT8 BandIdx); -INT32 MtCmdGetIPIValue(struct _RTMP_ADAPTER *pAd, UINT8 BandIdx); -INT32 MtCmdSetDataTxPwrOffset(struct _RTMP_ADAPTER *pAd, UINT8 WlanIdx, - INT8 TxPwr_Offset, UINT8 BandIdx); -INT32 MtCmdSetRaTable(struct _RTMP_ADAPTER *pAd, UINT8 BandIdx, UINT8 TblType, - UINT8 TblIndex, UINT16 TblLength, PUCHAR Buffer); -INT32 MtCmdGetRaTblInfo(struct _RTMP_ADAPTER *pAd, UINT8 BandIdx, UINT8 TblType, - UINT8 TblIndex, UINT8 ReadnWrite); -#endif /* WIFI_EAP_FEATURE */ -INT32 MtCmdTOAECalCtrl(struct _RTMP_ADAPTER *pAd, UCHAR TOAECtrl); -INT32 MtCmdEDCCACtrl(struct _RTMP_ADAPTER *pAd, UCHAR BandIdx, UCHAR EDCCACtrl); -INT32 MtCmdMUPowerCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN MUPowerForce, - UCHAR MUPowerCtrl); -INT32 MtCmdBFNDPATxDCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgNDPA_ManualMode, - UINT8 ucNDPA_TxMode, UINT8 ucNDPA_Rate, - UINT8 ucNDPA_BW, UINT8 ucNDPA_PowerOffset); -INT32 MtEPAcheck(struct _RTMP_ADAPTER *pAd); -INT32 MtATETSSITracking(struct _RTMP_ADAPTER *pAd, BOOLEAN fgEnable); -INT32 MtATEFCBWCfg(struct _RTMP_ADAPTER *pAd, BOOLEAN fgEnable); -INT32 MtTSSICompBackup(struct _RTMP_ADAPTER *pAd, BOOLEAN fgEnable); -INT32 MtTSSICompCfg(struct _RTMP_ADAPTER *pAd); -INT32 MtCmdTemperatureCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgManualMode, - CHAR cTemperature); - -#ifdef TX_POWER_CONTROL_SUPPORT -INT32 MtCmdTxPwrUpCtrl(struct _RTMP_ADAPTER *pAd, INT8 ucBandIdx, - CHAR cPwrUpCat, - CHAR cPwrUpValue[POWER_UP_CATEGORY_RATE_NUM]); -#endif /* TX_POWER_CONTROL_SUPPORT */ - -INT32 MtCmdLinkTestTxCsdCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgTxCsdConfigEn, - UINT8 ucDbdcBandIdx, UINT8 ucBandIdx); -INT32 MtCmdLinkTestTxCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgTxConfigEn, - UINT8 ucBandIdx); -INT32 MtCmdLinkTestRxCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucRxAntIdx, - UINT8 ucBandIdx); -INT32 MtCmdLinkTestTxPwrCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgTxPwrConfigEn, - UINT8 ucDbdcBandIdx, UINT8 ucBandIdx); -INT32 MtCmdLinkTestTxPwrUpTblCtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucTxPwrUpCat, - PUINT8 pucTxPwrUpValue); -INT32 MtCmdLinkTestACRCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgACRConfigEn, - UINT8 ucDbdcBandIdx, UINT8 ucReserved); -INT32 MtCmdLinkTestRcpiCtrl(struct _RTMP_ADAPTER *pAd, BOOLEAN fgRCPIConfigEn); -INT32 MtCmdLinkTestSeIdxCtrl(struct _RTMP_ADAPTER *pAd, - BOOLEAN fgSeIdxConfigEn); -INT32 MtCmdLinkTestRcpiMACtrl(struct _RTMP_ADAPTER *pAd, UINT8 ucMAParameter); - -#ifdef TPC_SUPPORT -INT32 MtCmdTpcFeatureCtrl(struct _RTMP_ADAPTER *pAd, INT8 TpcPowerValue, - UINT8 BandIdx, UINT8 CentralChannel); -#endif /* TPC_SUPPORT */ -INT32 MtCmdATEModeCtrl(struct _RTMP_ADAPTER *pAd, UCHAR ATEMode); - -INT32 CmdExtSER(struct _RTMP_ADAPTER *pAd, UINT8 action, UINT8 ser_set); - -/*CR4 commond for budget control*/ - -#ifdef PKT_BUDGET_CTRL_SUPPORT -#define PBC_NUM_OF_PKT_BUDGET_CTRL_QUE (5) -#define PBC_BSS_IDX_FOR_ALL (0xFF) -#define PBC_WLAN_IDX_FOR_ALL (0xFFFF) -#define PBC_BOUNDARY_RESET_TO_DEFAULT (0xFFFF) - -#define PBC_WMM_UP_DEFAULT_BK (900) -#define PBC_WMM_UP_DEFAULT_BE (1500) -#define PBC_WMM_UP_DEFAULT_VI (1900) -#define PBC_WMM_UP_DEFAULT_VO (1900) -#define PBC_WMM_UP_DEFAULT_MGMT (32) - -typedef struct GNU_PACKED _CMD_PKT_BUDGET_CTRL_ENTRY_T { - UINT16 lower_bound; - UINT16 upper_bound; -} CMD_PKT_BUDGET_CTRL_ENTRY_T, *P_CMD_PKT_BUDGET_CTRL_ENTRY_T; - -typedef struct GNU_PACKED _CMD_PKT_BUDGET_CTRL_T { - UINT8 bss_id; - UINT8 queue_num; - UINT16 wlan_idx; - UINT8 aucReserved[4]; - CMD_PKT_BUDGET_CTRL_ENTRY_T aacQue[PBC_NUM_OF_PKT_BUDGET_CTRL_QUE]; -} CMD_PKT_BUDGET_CTRL_T, *P_CMD_PKT_BUDGET_CTRL_T; - -enum { - PBC_TYPE_FIRST = 0, - PBC_TYPE_NORMAL = PBC_TYPE_FIRST, - PBC_TYPE_WMM, - PBC_TYPE_END -}; - -enum { - PBC_AC_BK = 0, - PBC_AC_BE = 1, - PBC_AC_VI = 2, - PBC_AC_VO = 3, - PBC_AC_MGMT = 4, - PBC_AC_NUM = PBC_NUM_OF_PKT_BUDGET_CTRL_QUE, -}; - -INT32 MtCmdPktBudgetCtrl(struct _RTMP_ADAPTER *pAd, UINT8 bss_idx, UINT16 wcid, - UCHAR type); - -#endif /*PKT_BUDGET_CTRL_SUPPORT*/ - -INT32 MtCmdSetBWFEnable(struct _RTMP_ADAPTER *pAd, UINT8 Enable); -#if defined(CONFIG_HOTSPOT_R2) || defined(DSCP_QOS_MAP_SUPPORT) -INT32 MtCmdHotspotInfoUpdate(struct _RTMP_ADAPTER *pAd, - EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T InfoUpdateT); -#endif /* CONFIG_HOTSPOT_R2 */ -#ifdef A4_CONN -INT32 MtCmdSetA4Enable(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, UINT8 Enable); -#endif /* A4_CONN */ - -#ifdef PRE_CAL_MT7622_SUPPORT -INT32 MtCmdSetTxLpfCal_7622(struct _RTMP_ADAPTER *pAd); -INT32 MtCmdSetTxDcIqCal_7622(struct _RTMP_ADAPTER *pAd); -INT32 MtCmdSetTxDpdCal_7622(struct _RTMP_ADAPTER *pAd, UINT32 chan); -#endif /* PRE_CAL_MT7622_SUPPORT */ -#ifdef AMPDU_CONF_SUPPORT -INT32 Set_CR4_retry_counter(struct _RTMP_ADAPTER *pAd, UINT8 band_idx, - UINT8 count); -#endif /* AMPDU_CONF_SUPPORT*/ -INT32 MtCmdPhyShapingFilterDisable(struct _RTMP_ADAPTER *pAd); -#ifdef CONFIG_MAP_SUPPORT -INT32 MtCmdGetAllStaTxRate(struct _RTMP_ADAPTER *pAd); -#ifdef MAP_R2 -INT32 MtCmdSetRxTxAirtimeEn(struct _RTMP_ADAPTER *pAd, UINT32 subcmd, - BOOLEAN flag); -#endif -#endif -INT32 MtCmdSendNullFrame(struct _RTMP_ADAPTER *pAd, UINT8 PID, - UINT8 No_Of_Null_Frames, UINT8 WlanIdx); -#endif /* __MT_CMD_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/mt_fdb.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/mt_fdb.h deleted file mode 100644 index df942f7e52..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/mcu/mt_fdb.h +++ /dev/null @@ -1,349 +0,0 @@ -#ifdef MTK_LICENSE -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_fdb.h -*/ -#endif /* MTK_LICENSE */ -#ifdef MT_FDB - -#ifndef __MT_FDB_H__ -#define __MT_FDB_H__ - -#include -#include "rt_config.h" - -/************************* access FW CR API ***********************/ -#define CR_OP_READ (0) -#define CR_OP_WRITE (1) -#define FW_EINT_SW_TRIGGER_CR 0x81040118 -#define FW_EINT_PAD_NO BIT(0) - -/************************* nds32_intrinsic.h ***********************/ -enum nds32_sr { - NDS32_SR_CPU_VER, - NDS32_SR_ICM_CFG, - NDS32_SR_DCM_CFG, - NDS32_SR_MMU_CFG, - NDS32_SR_MSC_CFG, - NDS32_SR_CORE_ID, - NDS32_SR_FUCOP_EXIST, - NDS32_SR_PSW, - NDS32_SR_IPSW, - NDS32_SR_P_IPSW, - NDS32_SR_IVB, - NDS32_SR_EVA, - NDS32_SR_P_EVA, - NDS32_SR_ITYPE, - NDS32_SR_P_ITYPE, - NDS32_SR_MERR, - NDS32_SR_IPC, - NDS32_SR_P_IPC, - NDS32_SR_OIPC, - NDS32_SR_P_P0, - NDS32_SR_P_P1, - NDS32_SR_INT_MASK, - NDS32_SR_INT_PEND, - NDS32_SR_SP_USR, - NDS32_SR_SP_PRIV, - NDS32_SR_INT_PRI, - NDS32_SR_INT_CTRL, - NDS32_SR_MMU_CTL, - NDS32_SR_L1_PPTB, - NDS32_SR_TLB_VPN, - NDS32_SR_TLB_DATA, - NDS32_SR_TLB_MISC, - NDS32_SR_VLPT_IDX, - NDS32_SR_ILMB, - NDS32_SR_DLMB, - NDS32_SR_CACHE_CTL, - NDS32_SR_HSMP_SADDR, - NDS32_SR_HSMP_EADDR, - NDS32_SR_SDZ_CTL, - NDS32_SR_N12MISC_CTL, - NDS32_SR_MISC_CTL, - NDS32_SR_BPC0, - NDS32_SR_BPC1, - NDS32_SR_BPC2, - NDS32_SR_BPC3, - NDS32_SR_BPC4, - NDS32_SR_BPC5, - NDS32_SR_BPC6, - NDS32_SR_BPC7, - NDS32_SR_BPA0, - NDS32_SR_BPA1, - NDS32_SR_BPA2, - NDS32_SR_BPA3, - NDS32_SR_BPA4, - NDS32_SR_BPA5, - NDS32_SR_BPA6, - NDS32_SR_BPA7, - NDS32_SR_BPAM0, - NDS32_SR_BPAM1, - NDS32_SR_BPAM2, - NDS32_SR_BPAM3, - NDS32_SR_BPAM4, - NDS32_SR_BPAM5, - NDS32_SR_BPAM6, - NDS32_SR_BPAM7, - NDS32_SR_BPV0, - NDS32_SR_BPV1, - NDS32_SR_BPV2, - NDS32_SR_BPV3, - NDS32_SR_BPV4, - NDS32_SR_BPV5, - NDS32_SR_BPV6, - NDS32_SR_BPV7, - NDS32_SR_BPCID0, - NDS32_SR_BPCID1, - NDS32_SR_BPCID2, - NDS32_SR_BPCID3, - NDS32_SR_BPCID4, - NDS32_SR_BPCID5, - NDS32_SR_BPCID6, - NDS32_SR_BPCID7, - NDS32_SR_EDM_CFG, - NDS32_SR_EDMSW, - NDS32_SR_EDM_CTL, - NDS32_SR_EDM_DTR, - NDS32_SR_BPMTC, - NDS32_SR_DIMBR, - NDS32_SR_TECR0, - NDS32_SR_TECR1, - NDS32_SR_EDM_PROBE, - NDS32_SR_PFMC0, - NDS32_SR_PFMC1, - NDS32_SR_PFMC2, - NDS32_SR_PFM_CTL, - NDS32_SR_FUCOP_CTL, - NDS32_SR_PRUSR_ACC_CTL, - NDS32_SR_DMA_CFG, - NDS32_SR_DMA_GCSW, - NDS32_SR_DMA_CHNSEL, - NDS32_SR_DMA_ACT, - NDS32_SR_DMA_SETUP, - NDS32_SR_DMA_ISADDR, - NDS32_SR_DMA_ESADDR, - NDS32_SR_DMA_TCNT, - NDS32_SR_DMA_STATUS, - NDS32_SR_DMA_2DSET, - NDS32_SR_DMA_2DSCTL -}; - -/************************* nds32_v2_fdb.h ***********************/ -enum target_debug_reason { - DBG_REASON_DBGRQ = 0, - DBG_REASON_BREAKPOINT = 1, - DBG_REASON_WATCHPOINT = 2, - DBG_REASON_SINGLESTEP = 3, - DBG_REASON_UNDEFINED = 4 -}; - -enum nds32_debug_reason { - NDS32_DEBUG_BREAK = 0, - NDS32_DEBUG_BREAK_16, - NDS32_DEBUG_INST_BREAK, - NDS32_DEBUG_DATA_ADDR_WATCHPOINT_PRECISE, - NDS32_DEBUG_DATA_VALUE_WATCHPOINT_PRECISE, - NDS32_DEBUG_DATA_VALUE_WATCHPOINT_IMPRECISE, - NDS32_DEBUG_DEBUG_INTERRUPT, - NDS32_DEBUG_HARDWARE_SINGLE_STEP, - NDS32_DEBUG_DATA_ADDR_WATCHPOINT_NEXT_PRECISE, - NDS32_DEBUG_DATA_VALUE_WATCHPOINT_NEXT_PRECISE, - NDS32_DEBUG_LOAD_STORE_GLOBAL_STOP, -}; - -enum target_state { - TARGET_RUNNING = 0, - TARGET_HALTED = 1, -}; - -enum nds32_v2_context { - PCX, - PSW, - R28, - R29, - R30, - R15, - R3, - R4, - R5, - R6, - R7, - R8, - R9, - R10, - R0, - R1, - R2, - R31, - CONTEXT_NUM -}; - -/************************* debug_probe.h ***********************/ -/* MCU Debug Prob */ -#define DI_CMD_REG 0x8206c068 -#define DI_ARG0_REG 0x8206c06c -#define DI_ARG1_REG 0x8206c070 -#define DI_RET0_REG DI_ARG0_REG -#define DI_RET1_REG DI_ARG1_REG -#define DI_STATUS_REG 0x8206c064 - -#define DI_STATUS_CMD_DONE_CNT_ADDR DI_STATUS_REG -#define DI_STATUS_CMD_DONE_CNT_SHFT 0 -#define DI_STATUS_CMD_DONE_CNT_MASK (0xF << DI_STATUS_CMD_DONE_CNT_SHFT) - -#define DI_STATUS_CMD_ERR_CODE_ADDR DI_STATUS_REG -#define DI_STATUS_CMD_ERR_CODE_SHFT 4 -#define DI_STATUS_CMD_ERR_CODE_MASK (0xF << DI_STATUS_CMD_ERR_CODE_SHFT) - -#define DI_STATUS_N9_EXCEPTION_ADDR DI_STATUS_REG -#define DI_STATUS_N9_EXCEPTION_SHFT 8 -#define DI_STATUS_N9_EXCEPTION_MASK (0x1 << DI_STATUS_N9_EXCEPTION_SHFT) - -#define DI_STATUS_N9_SER_ADDR DI_STATUS_REG -#define DI_STATUS_N9_SER_SHFT 9 -#define DI_STATUS_N9_SER_MASK (0x1 << DI_STATUS_N9_SER_SHFT) - -#define DI_STATUS_N9_ASSERT_ADDR DI_STATUS_REG -#define DI_STATUS_N9_ASSERT_SHFT 10 -#define DI_STATUS_N9_ASSERT_MASK (0x1 << DI_STATUS_N9_ASSERT_SHFT) - -#define DI_STATUS_TARGET_STATE_ADDR DI_STATUS_REG -#define DI_STATUS_TARGET_STATE_SHFT 31 -#define DI_STATUS_TARGET_STATE_MASK (0x1 << DI_STATUS_TARGET_STATE_SHFT) - -#define DI_STATUS_TARGET_DEBUG_REASON_ADDR DI_STATUS_REG -#define DI_STATUS_TARGET_DEBUG_REASON_SHFT 28 -#define DI_STATUS_TARGET_DEBUG_REASON_MASK \ - (0x7 << DI_STATUS_TARGET_DEBUG_REASON_SHFT) - -enum DI_CMD { - - /* common debug interface command */ - DIC_READ1 = 0x1001, - DIC_READ2, - DIC_READ4, - DIC_WRITE1, - DIC_WRITE2, - DIC_WRITE4, - DIC_GET_BUF, - - /* FDB debug interface command */ - DIC_FDB_ENABLE = 0x1101, - DIC_FDB_DISABLE, - DIC_FDB_HW_BKPT_SET, - DIC_FDB_HW_BKPT_DELETE, - DIC_FDB_HW_BKPT_ENABLE, - DIC_FDB_HW_BKPT_DISABLE, - DIC_FDB_CONTINUE, - DIC_FDB_STEP, - DIC_FDB_STOP, - DIC_FDB_GET_CPU_REG, - DIC_FDB_SET_CPU_REG, - DIC_FDB_GET_TASK, - DIC_FDB_GET_STACK, - DIC_FDB_WATCH, - DIC_FDB_RWATCH, - DIC_FDB_AWATCH, - DIC_FDB_WATCH_RANGE, - DIC_FDB_WATCH_SYMBOL, - DIC_FDB_WATCH_EXPR_CONST, - DIC_FDB_WATCH_EXPR_VARIABLE, - DIC_FDB_WATCH_EXPR_DONE, - DIC_FDB_WATCH_ENABLE, - DIC_FDB_WATCH_DISABLE, - DIC_FDB_WATCH_DELETE, - DIC_FDB_FUNC_CALL, - - /* System debug interface commnad */ - DIC_SYSTEM_STACK_INFO = 0x1201, - DIC_SYSTEM_QUEUE_INFO, - - /* For test */ - DIC_FDB_WMT_TEST = 0x1f01, - DIC_FDB_BKPT_INFO, -}; - -enum DI_CMD_ERR_CODE { - ERR_OK, - ERR_FAIL, - ERR_TARGET_ACCESS_REG_FAIL, - ERR_TARGET_NOT_HALTED, - ERR_TARGET_NOT_RUNNING, - ERR_TARGET_UNALIGNED_ACCESS, - ERR_TARGET_RESOURCE_NOT_AVAILABLE -}; - -/************************* fdb.c *********************************/ -#define DI_IRQ_REG 0x81040118 - -#define CMD_STR_LEN 100 -#define WAIT_RET_US 10000 - -#define CMD argv[1] -#define ARG0 argv[2] -#define ARG1 argv[3] - -#define STACK_DEPTH 100 - -#define PRINT_T32_MSG 1 -#define PRINT_IWPRIV_MSG 0 -#define PRINT_INFO_MSG 0 -#define PRINT_DBG_MSG 0 - -#define NON_PREFIX_PRINTF(prefix, fmt, arg...) \ - { \ - if (PRINT_##prefix##_MSG) \ - printk(fmt, ##arg); \ - } - -#define PREFIX_PRINTF(prefix, fmt, arg...) \ - { \ - if (PRINT_##prefix##_MSG) \ - printk("[" #prefix "] " fmt, ##arg); \ - } - -#define PRINT_CONTEXT_CR_T32(_pAd, srname) \ - { \ - intern_debug_probe_cmd_call(_pAd, DIC_FDB_GET_CPU_REG, \ - #srname, NULL); \ - PREFIX_PRINTF(T32, "R.S " #srname " 0x%x\n", ret0); \ - } - -uint32_t mcu_cr_mapping(char *mcu_cr_str); -void set_cpu_reg_pre(RTMP_ADAPTER *pAd); -void get_cpu_reg_pre(RTMP_ADAPTER *pAd); -void get_cpu_reg_post(RTMP_ADAPTER *pAd); -void single_step_post(RTMP_ADAPTER *pAd); -void memory_read_post(RTMP_ADAPTER *pAd); -void dump_call_trace(RTMP_ADAPTER *pAd); -void print_help_msg(RTMP_ADAPTER *pAd); -int intern_debug_probe_cmd_call(RTMP_ADAPTER *pAd, uint32_t cmd_id, - char *_arg0_str, char *_arg1_str); - -struct di_cmd { - uint32_t id; - char *name; - uint8_t arg_num; - uint8_t res_num; - bool interrupt; - void (*pre_handle)(RTMP_ADAPTER *pAd); - void (*post_handle)(RTMP_ADAPTER *pAd); - char *help_msg; -}; - -enum intern_cmds_id { IC_CALL_TRACE, IC_CALL_HELP, IC_NUM }; - -#endif /* __MT_FDB_H__ */ -#endif /* MT_FDB */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/bb_soc.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/bb_soc.h deleted file mode 100644 index 85dbabd050..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/bb_soc.h +++ /dev/null @@ -1,50 +0,0 @@ - -#ifndef __BBU_SOC_H__ -#define __BBU_SOC_H__ - -/* #include "rt_config.h" */ - -#define POLLING_MODE_DETECT_INTV 300 -extern void os_TCIfQuery(unsigned short query_id, void *result, void *result2); - -typedef struct _BBUPollingMode { - RALINK_TIMER_STRUCT PollingModeDetect; - BOOLEAN PollingModeDetectRunning; - struct work_struct PollingDataBH; - UINT32 pAd_va; - NDIS_SPIN_LOCK PollingModeLock; -} BBUPollingMode, *PBBUPollingMode; - -extern void tc3162_enable_irq(unsigned int irq); -extern void tc3162_disable_irq(unsigned int irq); -extern VOID PeriodicPollingModeDetect(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); -DECLARE_TIMER_FUNCTION(PeriodicPollingModeDetect); - -extern VOID PollingModeIsr(struct work_struct *work); -/* - ======================================================================== - - Routine Description: - Trendchip DMT Trainning status detect - - Arguments: - data Point to RTMP_ADAPTER - - Return Value: - NONE - - Note: - - ======================================================================== -*/ -extern void pcieReset(void); -extern int pcieRegInitConfig(void); -extern void BBU_PCIE_Init(void); -extern VOID BBUPollingModeClose(IN RTMP_ADAPTER *pAd); -extern VOID BBUPollingModeInit(IN RTMP_ADAPTER *pAd); -extern VOID BBUPollingModeStart(IN RTMP_ADAPTER *pAd); -extern VOID BBUPrepareMAC(IN RTMP_ADAPTER *pAd, PUCHAR macaddr); -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/diag.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/diag.h deleted file mode 100644 index c227d7f39d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/diag.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2016 MediaTek Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef _DIAG_H_ -#define _DIAG_H_ - -#ifdef WIFI_DIAG - -#include "rtmp_comm.h" -#include "rtmp_type.h" -#include "rtmp_os.h" -#include "rtmp.h" - -typedef enum _ENUM_DIAG_CONN_ERROR_CODE { - DIAG_CONN_FRAME_LOST = 0, - DIAG_CONN_CAP_ERROR, - DIAG_CONN_AUTH_FAIL, - DIAG_CONN_ACL_BLK, - DIAG_CONN_STA_LIM, - DIAG_CONN_DEAUTH, - DIAG_CONN_BAND_STE, - DIAG_CONN_ERROR_MAX, - DIAG_CONN_DEAUTH_COM -} ENUM_DIAG_CONN_ERROR_CODE; - -void DiagConnError(PRTMP_ADAPTER pAd, UCHAR apidx, UCHAR *addr, - ENUM_DIAG_CONN_ERROR_CODE Code, UINT32 Reason); -void DiagConnErrorWrite(PRTMP_ADAPTER pAd); -void DiagAddPid(OS_TASK *pTask); -void DiagDelPid(OS_TASK *pTask); -void DiagGetProcessInfo(PRTMP_ADAPTER pAdapter, RTMP_IOCTL_INPUT_STRUCT *wrq); -void DiagMiniportMMRequest(PRTMP_ADAPTER pAd, UCHAR *pData, UINT Length); -void DiagBcnTx(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, UCHAR *pBeaconFrame, - ULONG FrameLen); -void DiagLogFileWrite(PRTMP_ADAPTER pAd); -void DiagDevRxMgmtFrm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk); -void DiagApMlmeOneSecProc(PRTMP_ADAPTER pAd); -void DiagCtrlAlloc(PRTMP_ADAPTER pAd); -void DiagCtrlFree(PRTMP_ADAPTER pAd); -BOOLEAN DiagProcInit(PRTMP_ADAPTER pAd); -BOOLEAN DiagProcExit(PRTMP_ADAPTER pAd); - -#endif -#endif /* #ifndef _DIAG_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/pkt_meta.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/pkt_meta.h deleted file mode 100644 index 252a7015a5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/pkt_meta.h +++ /dev/null @@ -1,417 +0,0 @@ -/* - -*/ - -#define MIN_NET_DEVICE_FOR_MBSSID 0x00 /*0x00,0x10,0x20,0x30 */ -#define MIN_NET_DEVICE_FOR_WDS 0x10 /*0x40,0x50,0x60,0x70 */ -#define MIN_NET_DEVICE_FOR_APCLI 0x20 -#define MIN_NET_DEVICE_FOR_MESH 0x30 - -#define NET_DEVICE_REAL_IDX_MASK \ - 0x0f /* for each operation mode, we maximum support 15 entities. */ - -/****************************************************************************** - Packet Meta info fields - NOTE: the meta info may stored in some os-dependent packet buffer and may - have extra limitations. - 1. Linux: - a).re-use sk_budd->cb[] - b).Max space of skb->cb = 48B = [CB_OFF+38] - 2. VxWorks: - a). - b).Max space: 32!! -******************************************************************************/ -/* [CB_OFF + 0] */ -/* User Priority */ -#define RTMP_SET_PACKET_UP(_p, _prio) (PACKET_CB(_p, 0) = _prio) -#define RTMP_GET_PACKET_UP(_p) (PACKET_CB(_p, 0)) - -/* [CB_OFF + 1] */ -/* Fragment # */ -#define RTMP_SET_PACKET_FRAGMENTS(_p, _num) (PACKET_CB(_p, 1) = _num) -#define RTMP_GET_PACKET_FRAGMENTS(_p) (PACKET_CB(_p, 1)) - -/* [CB_OFF + 2] */ -/* - 0x0 ~ 0xff: index mapping to MAC_TABLE_ENTRY - for Tx, search by eth_hdr.addr1 - for Rx, get from ASIC(RxWI)/search by wlan_hdr.addr2 -*/ -#define RTMP_SET_PACKET_WCID(_p, _wdsidx) (PACKET_CB(_p, 2) = _wdsidx) -#define RTMP_GET_PACKET_WCID(_p) ((UCHAR)PACKET_CB(_p, 2)) - -/* [CB_OFF + 3] */ -/* From which Interface, wdev index */ -#define RTMP_SET_PACKET_WDEV(_p, _wdev_idx) (PACKET_CB(_p, 3) = _wdev_idx) -#define RTMP_GET_PACKET_WDEV(_p) (PACKET_CB(_p, 3)) - -/* [CB_OFF + 4] */ -/* If this flag is set, it indicates that this EAPoL frame MUST be clear. */ -#define RTMP_SET_PACKET_CLEAR_EAP_FRAME(_p, _flg) (PACKET_CB(_p, 4) = _flg) -#define RTMP_GET_PACKET_CLEAR_EAP_FRAME(_p) (PACKET_CB(_p, 4)) - -/* [CB_OFF + 5] */ -#define RTMP_SET_PACKET_MOREDATA(_p, _morebit) (PACKET_CB(_p, 5) = _morebit) -#define RTMP_GET_PACKET_MOREDATA(_p) (PACKET_CB(_p, 5)) - -/* [CB_OFF + 6] */ -/* - Sepcific Pakcet Type definition -*/ -#define RTMP_PACKET_SPECIFIC_CB_OFFSET 6 - -#define RTMP_PACKET_SPECIFIC_DHCP 0x01 -#define RTMP_PACKET_SPECIFIC_EAPOL 0x02 -#define RTMP_PACKET_SPECIFIC_IPV4 0x04 -#define RTMP_PACKET_SPECIFIC_WAI 0x08 -#define RTMP_PACKET_SPECIFIC_VLAN 0x10 -#define RTMP_PACKET_SPECIFIC_LLCSNAP 0x20 -#define RTMP_PACKET_SPECIFIC_TDLS 0x40 -#define RTMP_PACKET_SPECIFIC_DISASSOC 0x80 - -/* Specific */ -#define RTMP_SET_PACKET_SPECIFIC(_p, _flg) (PACKET_CB(_p, 6) = _flg) - -/* DHCP */ -#define RTMP_SET_PACKET_DHCP(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 6) |= (RTMP_PACKET_SPECIFIC_DHCP); \ - else \ - PACKET_CB(_p, 6) &= (~RTMP_PACKET_SPECIFIC_DHCP); \ - } while (0) -#define RTMP_GET_PACKET_DHCP(_p) (PACKET_CB(_p, 6) & RTMP_PACKET_SPECIFIC_DHCP) - -/* EAPOL */ -#define RTMP_SET_PACKET_EAPOL(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 6) |= (RTMP_PACKET_SPECIFIC_EAPOL); \ - else \ - PACKET_CB(_p, 6) &= (~RTMP_PACKET_SPECIFIC_EAPOL); \ - } while (0) -#define RTMP_GET_PACKET_EAPOL(_p) \ - (PACKET_CB(_p, 6) & RTMP_PACKET_SPECIFIC_EAPOL) - -/* WAI */ -#define RTMP_SET_PACKET_WAI(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 6) |= (RTMP_PACKET_SPECIFIC_WAI); \ - else \ - PACKET_CB(_p, 6) &= (~RTMP_PACKET_SPECIFIC_WAI); \ - } while (0) -#define RTMP_GET_PACKET_WAI(_p) (PACKET_CB(_p, 6) & RTMP_PACKET_SPECIFIC_WAI) - -#define RTMP_GET_PACKET_FORCE_TX(_p) \ - (PACKET_CB(_p, 6) & \ - (RTMP_PACKET_SPECIFIC_EAPOL | RTMP_PACKET_SPECIFIC_WAI)) - -#define RTMP_GET_PACKET_LOWRATE(_p) \ - ((PACKET_CB(_p, 6) & \ - (RTMP_PACKET_SPECIFIC_EAPOL | RTMP_PACKET_SPECIFIC_DHCP | \ - RTMP_PACKET_SPECIFIC_WAI | RTMP_PACKET_SPECIFIC_TDLS)) || \ - (PACKET_CB(_p, 33) & (RTMP_PACKET_SPECIFIC_ARP))) - -/* VLAN */ -#define RTMP_SET_PACKET_VLAN(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 6) |= (RTMP_PACKET_SPECIFIC_VLAN); \ - else \ - PACKET_CB(_p, 6) &= (~RTMP_PACKET_SPECIFIC_VLAN); \ - } while (0) -#define RTMP_GET_PACKET_VLAN(_p) (PACKET_CB(_p, 6) & RTMP_PACKET_SPECIFIC_VLAN) - -/* LLC/SNAP */ -#define RTMP_SET_PACKET_LLCSNAP(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 6) |= (RTMP_PACKET_SPECIFIC_LLCSNAP); \ - else \ - PACKET_CB(_p, 6) &= (~RTMP_PACKET_SPECIFIC_LLCSNAP); \ - } while (0) - -#define RTMP_GET_PACKET_LLCSNAP(_p) \ - (PACKET_CB(_p, 6) & RTMP_PACKET_SPECIFIC_LLCSNAP) - -/* IP */ -#define RTMP_SET_PACKET_IPV4(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 6) |= (RTMP_PACKET_SPECIFIC_IPV4); \ - else \ - PACKET_CB(_p, 6) &= (~RTMP_PACKET_SPECIFIC_IPV4); \ - } while (0) - -#define RTMP_GET_PACKET_IPV4(_p) (PACKET_CB(_p, 6) & RTMP_PACKET_SPECIFIC_IPV4) - -/* TDLS */ -#define RTMP_SET_PACKET_TDLS_MMPDU(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 6) |= (RTMP_PACKET_SPECIFIC_TDLS); \ - else \ - PACKET_CB(_p, 6) &= (~RTMP_PACKET_SPECIFIC_TDLS); \ - } while (0) - -#define RTMP_GET_PACKET_TDLS_MMPDU(_p) \ - (PACKET_CB(_p, 6) & RTMP_PACKET_SPECIFIC_TDLS) - -/* DISASSOC */ -#define RTMP_SET_PACKET_DISASSOC(_p, _flg) \ - do { \ - if (_flg) \ - (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 11]) |= \ - (RTMP_PACKET_SPECIFIC_DISASSOC); \ - else \ - (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 11]) &= \ - (~RTMP_PACKET_SPECIFIC_DISASSOC); \ - } while (0) -#define RTMP_GET_PACKET_DISASSOC(_p) \ - (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 11] & RTMP_PACKET_SPECIFIC_DISASSOC) - -/* [CB_OFF + 7] */ -#if defined(P2P_SUPPORT) || defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || \ - defined(CFG80211_MULTI_STA) -#define RTMP_SET_PACKET_OPMODE(_p, _flg) (PACKET_CB(_p, 7) = _flg) -#define RTMP_GET_PACKET_OPMODE(_p) (PACKET_CB(_p, 7)) -#endif /* P2P_SUPPORT || RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ - -/* [CB_OFF + 8 ~ 9] */ -#ifdef UAPSD_SUPPORT -/* if we queue a U-APSD packet to any software queue, we will set the U-APSD - flag and its physical queue ID for it */ -#define RTMP_SET_PACKET_UAPSD(_p, _flg_uapsd, _que_id) \ - (PACKET_CB(_p, 8) = ((_flg_uapsd << 7) | _que_id)) - -#define RTMP_SET_PACKET_QOS_NULL(_p) (PACKET_CB(_p, 8) = 0xff) -#define RTMP_GET_PACKET_QOS_NULL(_p) (PACKET_CB(_p, 8)) -#define RTMP_SET_PACKET_NON_QOS_NULL(_p) (PACKET_CB(_p, 8) = 0x00) -#define RTMP_GET_PACKET_UAPSD_Flag(_p) ((PACKET_CB(_p, 8) & 0x80) >> 7) -#define RTMP_GET_PACKET_UAPSD_QUE_ID(_p) (PACKET_CB(_p, 8) & 0x7f) - -#define RTMP_SET_PACKET_EOSP(_p, _flg) (PACKET_CB(_p, 9) = _flg) -#define RTMP_GET_PACKET_EOSP(_p) (PACKET_CB(_p, 9)) -#endif /* UAPSD_SUPPORT */ - -/* [CB_OFF + 10 ~ 11] */ -#define RTMP_SET_PACKET_PROTOCOL(_p, _protocol) \ - { \ - (PACKET_CB(_p, 10) = (UINT8)((_protocol)&0x00ff)); \ - (PACKET_CB(_p, 11) = (UINT8)(((_protocol)&0xff00) >> 8)); \ - } - -#define RTMP_GET_PACKET_PROTOCOL(_p) \ - ((((UINT16)PACKET_CB(_p, 11)) << 8) | ((UINT16)PACKET_CB(_p, 10))) - -/* [CB_OFF + 12] */ -#define RTMP_SET_PACKET_TXTYPE(_p, _mode) (PACKET_CB(_p, 12) = _mode) -#define RTMP_GET_PACKET_TXTYPE(_p) (PACKET_CB(_p, 12)) - -/* [CB_OFF + 13] */ -/* TX rate index */ -#define RTMP_SET_PACKET_TXRATE(_p, _rate) (PACKET_CB(_p, 13) = _rate) -#define RTMP_GET_PACKET_TXRATE(_p) (PACKET_CB(_p, 13)) - -/* [CB_OFF + 14] */ -#ifdef MAC_REPEATER_SUPPORT -#define RTMP_SET_PKT_MAT_FREE(_p, _flg) (PACKET_CB(_p, 14) = (_flg)) -#define RTMP_GET_PKT_MAT_FREE(_p) (PACKET_CB(_p, 14)) -#endif /* MAC_REPEATER_SUPPORT */ - -/* [CB_OFF + 15 ~ 19] */ - -/* use bit3 of cb[CB_OFF+16] */ -#define RTMP_SET_PACKET_MGMT_PKT(_p, _flg) \ - (PACKET_CB(_p, 16) = (PACKET_CB(_p, 16) & 0xF7) | ((_flg & 0x01) << 3)) -#define RTMP_GET_PACKET_MGMT_PKT(_p) ((PACKET_CB(_p, 16) & 0x08) >> 3) - -/* use bit0 of cb[CB_OFF+20] */ -#define RTMP_SET_PACKET_MGMT_PKT_DATA_QUE(_p, _flg) \ - (PACKET_CB(_p, 20) = (PACKET_CB(_p, 20) & 0xFE) | (_flg & 0x01)) -#define RTMP_GET_PACKET_MGMT_PKT_DATA_QUE(_p) (PACKET_CB(_p, 20) & 0x01) - -/* [CB_OFF+21 ~ 22] */ - -/* [CB_OFF + 23] */ -/* - * TDLS Sepcific Pakcet Type definition -*/ -#define RTMP_TDLS_SPECIFIC_WAIT_ACK 0x01 -#define RTMP_TDLS_SPECIFIC_NOACK 0x02 -#define RTMP_TDLS_SPECIFIC_PKTQ_HCCA 0x04 -#define RTMP_TDLS_SPECIFIC_PKTQ_EDCA 0x08 - -#define RTMP_SET_PACKET_TDLS_WAIT_ACK(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 23) |= (RTMP_TDLS_SPECIFIC_WAIT_ACK); \ - else \ - PACKET_CB(_p, 23) &= (~RTMP_TDLS_SPECIFIC_WAIT_ACK); \ - } while (0) - -#define RTMP_GET_PACKET_TDLS_WAIT_ACK(_p) \ - (PACKET_CB(_p, 23) & RTMP_TDLS_SPECIFIC_WAIT_ACK) - -#define RTMP_SET_PACKET_TDLS_NO_ACK(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 23) |= (RTMP_TDLS_SPECIFIC_NOACK); \ - else \ - PACKET_CB(_p, 23) &= (~RTMP_TDLS_SPECIFIC_NOACK); \ - } while (0) - -#define RTMP_GET_PACKET_TDLS_NO_ACK(_p) \ - (PACKET_CB(_p, 23) & RTMP_TDLS_SPECIFIC_NOACK) - -#define RTMP_SET_TDLS_SPECIFIC_PACKET(_p, _flg) (PACKET_CB(_p, 23) = _flg) -#define RTMP_GET_TDLS_SPECIFIC_PACKET(_p) (PACKET_CB(_p, 23)) - -/* [CB_OFF + 25] */ -#ifdef A4_CONN -#define RTMP_SET_PACKET_A4_FWDDATA(_p, _flg) (PACKET_CB(_p, 25) = _flg) -#define RTMP_GET_PACKET_A4_FWDDATA(_p) (PACKET_CB(_p, 25)) -#endif - -/* [CB_OFF + 26] */ -#ifdef CONFIG_CSO_SUPPORT -#define RTMP_SET_TCP_CHKSUM_FAIL(_p, _flg) (PACKET_CB(_p, 26) = _flg); -#define RTMP_GET_TCP_CHKSUM_FAIL(_p) (PACKET_CB(_p, 26)) -#endif /* CONFIG_CSO_SUPPORT */ - -/* [CB_OFF + 27 ~ 31] */ -#ifdef VLAN_SUPPORT -#define RTMP_SET_VLAN_PCP(_p, _flg) (PACKET_CB(_p, 27) = (UINT8)((_flg)&0x00ff)) -#define RTMP_GET_VLAN_PCP(_p) (PACKET_CB(_p, 27)) -#endif /* VLAN_SUPPORT */ - -/* [CB_OFF + 32] */ -/* RTS/CTS-to-self protection method */ -#define RTMP_SET_PACKET_RTS(_p, _num) (PACKET_CB(_p, 32) = _num) -#define RTMP_GET_PACKET_RTS(_p) (PACKET_CB(_p, 32)) -/* see RTMP_S(G)ET_PACKET_EMACTAB */ - -/* Release not used CB */ -/* Move WF_FWD related CB to last two byte */ -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -/* set link cover packet send by 5G or 2G */ -#define PACKET_BAND_CB 36 -#define RTMP_PACKET_SPECIFIC_2G 0x1 -#define RTMP_PACKET_SPECIFIC_5G 0x2 -#define RTMP_PACKET_SPECIFIC_ETHER 0x4 -#define RTMP_PACKET_SPECIFIC_5G_H 0x10 - -#define RTMP_CLEAN_PACKET_BAND(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 36] = 0) - -#define RTMP_SET_PACKET_BAND(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 36) |= (_flg); \ - else \ - PACKET_CB(_p, 36) &= (~_flg); \ - } while (0) - -#define RTMP_GET_PACKET_BAND(_p) (PACKET_CB(_p, 36)) - -/* [CB_OFF + 34]: tag the packet received from which net device */ -#define RECV_FROM_CB 37 -#define H_CHANNEL_BIGGER_THAN 100 -#define RTMP_PACKET_RECV_FROM_2G_CLIENT 0x1 -#define RTMP_PACKET_RECV_FROM_5G_CLIENT 0x2 -#define RTMP_PACKET_RECV_FROM_2G_AP 0x4 -#define RTMP_PACKET_RECV_FROM_5G_AP 0x8 -#define RTMP_PACKET_RECV_FROM_5G_H_CLIENT 0x10 -#define RTMP_PACKET_RECV_FROM_5G_H_AP 0x20 - -#define RTMP_CLEAN_PACKET_RECV_FROM(_p) \ - (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 37] = 0) -#define RTMP_SET_PACKET_RECV_FROM(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 37) |= (_flg); \ - else \ - PACKET_CB(_p, 37) &= (~_flg); \ - } while (0) - -#define RTMP_GET_PACKET_RECV_FROM(_p) (PACKET_CB(_p, 37)) -#define RTMP_IS_PACKET_APCLI(_p) \ - ((RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 37]) & \ - (RTMP_PACKET_RECV_FROM_2G_CLIENT | RTMP_PACKET_RECV_FROM_5G_CLIENT | \ - RTMP_PACKET_RECV_FROM_5G_H_CLIENT)) -#define RTMP_IS_PACKET_AP_APCLI(_p) ((RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 37]) != 0) - -#endif /* CONFIG_WIFI_PKT_FWD */ -#ifdef CONFIG_HOTSPOT_R2 -#define RTMP_PACKET_DIRECT_TX 0x40 -#define RTMP_SET_PACKET_DIRECT_TX(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 37) |= (RTMP_PACKET_DIRECT_TX); \ - else \ - PACKET_CB(_p, 37) &= (~RTMP_PACKET_DIRECT_TX); \ - } while (0) - -#define RTMP_IS_PACKET_DIRECT_TX(_p) \ - ((RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 37]) & (RTMP_PACKET_DIRECT_TX)) - -#endif /* CONFIG_HOTSPOT_R2 */ - -#define RTMP_SET_PACKET_QUEIDX(_p, _idx) \ - (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 35] = (_idx)) -#define RTMP_GET_PACKET_QUEIDX(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 35]) - -#define RTMP_PACKET_SPECIFIC_PING 0x01 -#define RTMP_PACKET_SPECIFIC_ARP 0x02 -#define RTMP_PACKET_SPECIFIC_MCAST_CLONE 0x04 -#define RTMP_PACKET_SPECIFIC_HIGH_PRIO 0x08 - -/* PING */ -#define RTMP_SET_PACKET_PING(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 33) |= (RTMP_PACKET_SPECIFIC_PING); \ - else \ - PACKET_CB(_p, 33) &= (~RTMP_PACKET_SPECIFIC_PING); \ - } while (0) -#define RTMP_GET_PACKET_PING(_p) (PACKET_CB(_p, 33) & RTMP_PACKET_SPECIFIC_PING) - -/* ARP */ -#define RTMP_SET_PACKET_ARP(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 33) |= (RTMP_PACKET_SPECIFIC_ARP); \ - else \ - PACKET_CB(_p, 33) &= (~RTMP_PACKET_SPECIFIC_ARP); \ - } while (0) -#define RTMP_GET_PACKET_ARP(_p) (PACKET_CB(_p, 33) & RTMP_PACKET_SPECIFIC_ARP) - -/* MCAST CLONE for IGMP */ -#define RTMP_SET_PACKET_MCAST_CLONE(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 33) |= \ - (RTMP_PACKET_SPECIFIC_MCAST_CLONE); \ - else \ - PACKET_CB(_p, 33) &= \ - (~RTMP_PACKET_SPECIFIC_MCAST_CLONE); \ - } while (0) -#define RTMP_GET_PACKET_MCAST_CLONE(_p) \ - (PACKET_CB(_p, 33) & RTMP_PACKET_SPECIFIC_MCAST_CLONE) - -/* High Priority packet */ -#define RTMP_SET_PACKET_HIGH_PRIO(_p, _flg) \ - do { \ - if (_flg) \ - PACKET_CB(_p, 33) |= (RTMP_PACKET_SPECIFIC_HIGH_PRIO); \ - else \ - PACKET_CB(_p, 33) &= \ - (~RTMP_PACKET_SPECIFIC_HIGH_PRIO); \ - } while (0) -#define RTMP_GET_PACKET_HIGH_PRIO(_p) \ - (PACKET_CB(_p, 33) & RTMP_PACKET_SPECIFIC_HIGH_PRIO) - -/* Packet type */ -#define RTMP_SET_PACKET_TYPE(_p, _idx) \ - (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 34] = (_idx)) -#define RTMP_GET_PACKET_TYPE(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF + 34]) diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_drv.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_drv.h deleted file mode 100644 index aaed704874..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_drv.h +++ /dev/null @@ -1,770 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rt_drv.h - - Abstract: - Put all virtual OS related definition/structure/MACRO here except - standard ANSI C function. - - Note: - No any OS related definition/MACRO is defined here. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- -*/ - -/* same as rt_linux.h to warn users the two files can not be used simultaneously */ -#ifndef __RT_LINUX_H__ -#define __RT_LINUX_H__ - -#include "os/rt_linux_cmm.h" -#include -#include - -#undef AP_WSC_INCLUDED -#undef STA_WSC_INCLUDED -#undef WSC_INCLUDED - -#ifdef CONFIG_AP_SUPPORT -#ifdef WSC_AP_SUPPORT -#define AP_WSC_INCLUDED -#endif /* WSC_AP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#if defined(WSC_AP_SUPPORT) || defined(WSC_STA_SUPPORT) -#define WSC_INCLUDED -#endif - -/*#ifdef RTMP_USB_SUPPORT */ -typedef VOID *PUSB_DEV; -typedef VOID *purbb_t; -typedef VOID pregs; -/*typedef struct usb_ctrlrequest devctrlrequest; */ -/*#endif */ - -/*********************************************************************************** - * Profile related sections - ***********************************************************************************/ -#ifdef CONFIG_AP_SUPPORT -#ifdef RTMP_MAC_PCI -#define AP_PROFILE_PATH "/etc/Wireless/RT2860AP/RT2860AP.dat" -#define AP_RTMP_FIRMWARE_FILE_NAME "/etc/Wireless/RT2860AP/RT2860AP.bin" -#define AP_DRIVER_VERSION "3.0.0.0" -#ifdef MULTIPLE_CARD_SUPPORT -#define CARD_INFO_PATH "/etc/Wireless/RT2860AP/RT2860APCard.dat" -#endif /* MULTIPLE_CARD_SUPPORT */ -#endif /* RTMP_MAC_PCI */ - -#ifdef RTMP_RBUS_SUPPORT -/* This used for rbus-based chip, maybe we can integrate it together. */ -#define RTMP_FIRMWARE_FILE_NAME "/etc_ro/Wireless/RT2860AP/RT2860AP.bin" -#define PROFILE_PATH "/etc/Wireless/RT2860i.dat" -#define AP_PROFILE_PATH_RBUS "/etc/Wireless/RT2860/RT2860.dat" -#define RT2880_AP_DRIVER_VERSION "1.0.0.0" -#endif /* RTMP_RBUS_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef SINGLE_SKU_V2 -#define SINGLE_SKU_TABLE_FILE_NAME "/etc/Wireless/RT2870STA/SingleSKU.dat" -#endif /* SINGLE_SKU_V2 */ - -/*********************************************************************************** - * Compiler related definitions - ***********************************************************************************/ -#define IN -#define OUT -#define INOUT -#define NDIS_STATUS INT - -/*********************************************************************************** - * OS Specific definitions and data structures - ***********************************************************************************/ -typedef void *PPCI_DEV; -typedef void *PNET_DEV; -typedef void *PNDIS_PACKET; -typedef char NDIS_PACKET; -typedef PNDIS_PACKET *PPNDIS_PACKET; -typedef ra_dma_addr_t NDIS_PHYSICAL_ADDRESS; -typedef ra_dma_addr_t *PNDIS_PHYSICAL_ADDRESS; -typedef void *NDIS_HANDLE; -typedef char *PNDIS_BUFFER; - -/*********************************************************************************** - * Network related constant definitions - ***********************************************************************************/ -#ifndef IFNAMSIZ -#define IFNAMSIZ 16 -#endif - -#define MAC_ADDR_LEN 6 - -#define NDIS_STATUS_SUCCESS 0x00 -#define NDIS_STATUS_FAILURE 0x01 -#define NDIS_STATUS_INVALID_DATA 0x02 -#define NDIS_STATUS_RESOURCES 0x03 -#define NDIS_STATUS_PKT_REQUEUE 0x04 - -#define NDIS_SET_PACKET_STATUS(_p, _status) \ - do { \ - } while (0) -#define NdisWriteErrorLogEntry(_a, _b, _c, _d) \ - do { \ - } while (0) - -/* statistics counter */ -#define STATS_INC_RX_PACKETS(_pAd, _dev) -#define STATS_INC_TX_PACKETS(_pAd, _dev) - -#define STATS_INC_RX_BYTESS(_pAd, _dev, len) -#define STATS_INC_TX_BYTESS(_pAd, _dev, len) - -#define STATS_INC_RX_ERRORS(_pAd, _dev) -#define STATS_INC_TX_ERRORS(_pAd, _dev) - -#define STATS_INC_RX_DROPPED(_pAd, _dev) -#define STATS_INC_TX_DROPPED(_pAd, _dev) - -/*********************************************************************************** - * Ralink Specific network related constant definitions - ***********************************************************************************/ - -#ifdef DOT11_VHT_AC -#define MAX_PACKETS_IN_QUEUE 1024 /*(512)*/ -#else -#define MAX_PACKETS_IN_QUEUE (512) -#endif /* DOT11_VHT_AC */ - -/*********************************************************************************** - * OS signaling related constant definitions - ***********************************************************************************/ - -/*********************************************************************************** - * OS file operation related data structure definitions - ***********************************************************************************/ -typedef VOID *RTMP_OS_FD; - -#define IS_FILE_OPEN_ERR(_fd) RtmpOsFileIsErr((_fd)) - -#ifndef O_RDONLY -#define O_RDONLY RTMP_FILE_RDONLY -#endif /* O_RDONLY */ - -#ifndef O_WRONLY -#define O_WRONLY RTMP_FILE_WRONLY -#endif /* O_WRONLY */ - -#ifndef O_CREAT -#define O_CREAT RTMP_FILE_CREAT -#endif /* O_CREAT */ - -#ifndef O_TRUNC -#define O_TRUNC RTMP_FILE_TRUNC -#endif /* O_TRUNC */ - -/*********************************************************************************** - * OS semaphore related data structure and definitions - ***********************************************************************************/ -#define RTCMDUp RtmpOsCmdUp -#define RTCMDRunning RtmpOsIsCmdThreadRunning - -/*********************************************************************************** - * OS Memory Access related data structure and definitions - ***********************************************************************************/ -#define NdisMoveMemory(Destination, Source, Length) \ - memmove(Destination, Source, Length) -#define NdisCopyMemory(Destination, Source, Length) \ - memcpy(Destination, Source, Length) -#define NdisZeroMemory(Destination, Length) memset(Destination, 0, Length) -#define NdisFillMemory(Destination, Length, Fill) \ - memset(Destination, Fill, Length) -#define NdisCmpMemory(Destination, Source, Length) \ - memcmp(Destination, Source, Length) -#define NdisEqualMemory(Source1, Source2, Length) \ - (!memcmp(Source1, Source2, Length)) -#define RTMPEqualMemory(Source1, Source2, Length) \ - (!memcmp(Source1, Source2, Length)) - -#define MlmeAllocateMemory(_pAd, _ppVA) \ - os_alloc_mem(_pAd, _ppVA, MAX_MGMT_PKT_LEN) -#define MlmeFreeMemory(_pVA) os_free_mem(_pVA) - -#define COPY_MAC_ADDR(Addr1, Addr2) memcpy((Addr1), (Addr2), MAC_ADDR_LEN) - -/*********************************************************************************** - * OS task related data structure and definitions - ***********************************************************************************/ -#define RTMP_OS_PID ULONG /* value or pointer */ - -#define RTMP_GET_OS_PID(_a, _b) RtmpOsGetPid(&_a, _b); -#define CHECK_TASK_LEGALITY(_task) RtmpOsCheckTaskLegality(_task) -#define ATE_KILL_THREAD_PID RtmpThreadPidKill - -typedef INT (*RTMP_OS_TASK_CALLBACK)(ULONG); - -/*********************************************************************************** - * IOCTL related definitions and data structures. - **********************************************************************************/ -#define NET_IOCTL VOID -#define PNET_IOCTL (VOID *) - -/* undef them to avoid compile errors in rt_symb.c */ -#undef EINVAL -#undef EOPNOTSUPP -#undef EFAULT -#undef ENETDOWN -#undef E2BIG -#undef ENOMEM -#undef EAGAIN -#undef ENOTCONN - -#define EINVAL (-RTMP_IO_EINVAL) -#define EOPNOTSUPP (-RTMP_IO_EOPNOTSUPP) -#define EFAULT (-RTMP_IO_EFAULT) -#define ENETDOWN (-RTMP_IO_ENETDOWN) -#define E2BIG (-RTMP_IO_E2BIG) -#define ENOMEM (-RTMP_IO_ENOMEM) -#define EAGAIN (-RTMP_IO_EAGAIN) -#define ENOTCONN (-RTMP_IO_ENOTCONN) - -/*********************************************************************************** - * Timer related definitions and data structures. - **********************************************************************************/ -#define OS_HZ RtmpOsTickUnitGet() - -typedef void (*TIMER_FUNCTION)(ULONG); - -#define OS_WAIT RtmpOsWait - -#define RTMP_TIME_AFTER RtmpOsTimerAfter -#define RTMP_TIME_BEFORE RtmpOsTimerBefore - -#define ONE_TICK 1 - -#define NdisGetSystemUpTime RtmpOsGetSystemUpTime - -/*********************************************************************************** - * OS specific cookie data structure binding to RTMP_ADAPTER - ***********************************************************************************/ - -/* do not have compile option in the structure for UTIL module */ -struct os_cookie { -#ifdef RTMP_MAC_PCI - VOID *pci_dev; - VOID *parent_pci_dev; - USHORT DeviceID; -#endif /* RTMP_MAC_PCI */ - - VOID *pDev; - - UINT32 pAd_va; - - RTMP_NET_TASK_STRUCT rx_done_task; - RTMP_NET_TASK_STRUCT cmd_rsp_event_task; - RTMP_NET_TASK_STRUCT mgmt_dma_done_task; - RTMP_NET_TASK_STRUCT ac0_dma_done_task; - RTMP_NET_TASK_STRUCT ac1_dma_done_task; - RTMP_NET_TASK_STRUCT ac2_dma_done_task; - RTMP_NET_TASK_STRUCT ac3_dma_done_task; -#if defined(MT7622) || defined(P18) || defined(MT7663) - RTMP_NET_TASK_STRUCT ac15_dma_done_task; -#endif - RTMP_NET_TASK_STRUCT hcca_dma_done_task; - RTMP_NET_TASK_STRUCT wmm1_ac0_dma_done_task; - RTMP_NET_TASK_STRUCT tbtt_task; - -#ifdef MT_MAC - RTMP_NET_TASK_STRUCT mt_mac_int_0_task; - RTMP_NET_TASK_STRUCT mt_mac_int_1_task; - RTMP_NET_TASK_STRUCT mt_mac_int_2_task; - RTMP_NET_TASK_STRUCT mt_mac_int_3_task; - RTMP_NET_TASK_STRUCT mt_mac_int_4_task; - RTMP_NET_TASK_STRUCT bcn_dma_done_task; -#endif /*MT_MAC */ - -#ifdef RTMP_MAC_PCI -#ifdef CONFIG_ANDES_SUPPORT - RTMP_NET_TASK_STRUCT rx1_done_task; -#endif /* CONFIG_ANDES_SUPPORT */ -#endif /* RTMP_MAC_PCI */ - -#ifdef UAPSD_SUPPORT - RTMP_NET_TASK_STRUCT uapsd_eosp_sent_task; -#endif /* UAPSD_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT - -#ifdef CARRIER_DETECTION_SUPPORT - RTMP_NET_TASK_STRUCT carrier_sense_task; -#endif /* CARRIER_DETECTION_SUPPORT */ - -#endif /* CONFIG_AP_SUPPORT */ - - RTMP_OS_PID apd_pid; /*802.1x daemon pid */ - unsigned long apd_pid_nr; -#ifdef CONFIG_AP_SUPPORT -#ifdef IAPP_SUPPORT - /* RT_SIGNAL_STRUC RTSignal; */ - RTMP_OS_PID IappPid; /*IAPP daemon pid */ - unsigned long IappPid_nr; -#endif /* IAPP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - INT ioctl_if_type; - INT ioctl_if; -}; - -typedef struct os_cookie *POS_COOKIE; - -/*********************************************************************************** - * OS debugging and printing related definitions and data structure - ***********************************************************************************/ -#define MTWF_PRINT printk - -#undef ASSERT -#ifdef DBG -#define ASSERT(x) \ - { \ - if (!(x)) { \ - printk(__FILE__ ":%d assert " #x "failed\n", \ - __LINE__); \ - dump_stack(); /*panic("Unexpected error occurs!\n"); */ \ - } \ - } -#else -#define ASSERT(x) -#endif /* DBG */ - -/********************************************************************************************************* - The following code are not revised, temporary put it here. - *********************************************************************************************************/ - -/*********************************************************************************** - * Device DMA Access related definitions and data structures. - **********************************************************************************/ -/*#ifdef RTMP_MAC_PCI*/ -#define size_t ULONG - -ra_dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, - int sd_idx, int direction); -void linux_pci_unmap_single(void *handle, ra_dma_addr_t dma_addr, size_t size, - int direction); - -#define pci_enable_msi RtmpOsPciMsiEnable -#define pci_disable_msi RtmpOsPciMsiDisable - -#define PCI_MAP_SINGLE_DEV(_handle, _ptr, _size, _sd_idx, _dir) \ - linux_pci_map_single(_handle, _ptr, _size, _sd_idx, _dir) - -#define DMA_MAPPING_ERROR(_handle, _ptr) \ - dma_mapping_error(&((struct pci_dev *)(_handle))->dev, _ptr) - -#define PCI_UNMAP_SINGLE(_pAd, _ptr, _size, _dir) \ - linux_pci_unmap_single(((POS_COOKIE)(_pAd->OS_Cookie))->pci_dev, _ptr, \ - _size, _dir) - -#define PCI_ALLOC_CONSISTENT(_pci_dev, _size, _ptr) \ - pci_alloc_consistent(_pci_dev, _size, _ptr) - -#define PCI_FREE_CONSISTENT(_pci_dev, _size, _virtual_addr, _physical_addr) \ - pci_free_consistent(_pci_dev, _size, _virtual_addr, _physical_addr) -/*#endif RTMP_MAC_PCI*/ - -#define DEV_ALLOC_SKB(_pAd, _Pkt, _length) \ - (_Pkt = RtmpOSNetPktAlloc(_pAd, _length)) - -/*#ifdef RTMP_MAC_USB */ -/*#define PCI_MAP_SINGLE(_handle, _ptr, _size, _dir) (ULONG)0 */ -/*#define PCI_UNMAP_SINGLE(_handle, _ptr, _size, _dir) */ -/*#endif RTMP_MAC_USB */ - -/* - * ULONG - * RTMP_GetPhysicalAddressLow( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - */ -#define RTMP_GetPhysicalAddressLow(phy_addr) (phy_addr) - -/* - * ULONG - * RTMP_GetPhysicalAddressHigh( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - */ -#define RTMP_GetPhysicalAddressHigh(phy_addr) (0) - -/* - * VOID - * RTMP_SetPhysicalAddressLow( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, - * IN ULONG Value); - */ -#define RTMP_SetPhysicalAddressLow(phy_addr, Value) (phy_addr = Value) - -/* - * VOID - * RTMP_SetPhysicalAddressHigh( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, - * IN ULONG Value); - */ -#define RTMP_SetPhysicalAddressHigh(phy_addr, Value) - -#define NdisMIndicateStatus(_w, _x, _y, _z) - -/*********************************************************************************** - * Device Register I/O Access related definitions and data structures. - **********************************************************************************/ -#define readl RTMP_PCI_Readl -#define readw RTMP_PCI_Readw -#define readb RTMP_PCI_Readb -#define writel RTMP_PCI_Writel -#define writew RTMP_PCI_Writew -#define writeb RTMP_PCI_Writeb - -/* TODO: We can merge two readl to a function to speed up or one real/writel */ - -#ifdef RTMP_MAC_PCI -#if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(INF_AR9) || \ - defined(IKANOS_VX_1X0) -#define RTMP_IO_FORCE_READ32(_A, _R, _pV) \ - do { \ - (*_pV = readl((void *)((_A)->PciHif.CSRBaseAddress + (_R)))); \ - (*_pV = SWAP32(*((UINT32 *)(_pV)))); \ - } while (0) - -#define RTMP_IO_READ32(_A, _R, _pV) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) { \ - (*_pV = readl((void *)((_A)->PciHif.CSRBaseAddress + \ - (_R)))); \ - (*_pV = SWAP32(*((UINT32 *)(_pV)))); \ - } \ - } while (0) - -#define RTMP_IO_READ8(_A, _R, _pV) \ - (*_pV = readb((void *)((_A)->PciHif.CSRBaseAddress + (_R)))) - -#define RTMP_IO_WRITE32(_A, _R, _V) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) { \ - UINT32 _Val = SWAP32(_V); \ - writel(_Val, \ - (void *)((_A)->PciHif.CSRBaseAddress + (_R))); \ - } \ - } while (0) - -#ifdef INF_VR9 -#define RTMP_IO_WRITE8(_A, _R, _V) \ - { \ - ULONG Val; \ - UCHAR _i; \ - UINT32 _Val; \ - _i = ((_R)&0x3); \ - Val = readl( \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - Val = SWAP32(Val); \ - Val = Val & (~(0x000000ff << ((_i)*8))); \ - Val = Val | ((ULONG)(_V) << ((_i)*8)); \ - Val = SWAP32(Val); \ - writel((Val), \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - } -#else -#define RTMP_IO_WRITE8(_A, _R, _V) \ - writeb((_V), (PUCHAR)((_A)->PciHif.CSRBaseAddress + (_R))) -#endif - -#define RTMP_IO_WRITE16(_A, _R, _V) \ - writew(SWAP16((_V)), (PUSHORT)((_A)->PciHif.CSRBaseAddress + (_R))) -#else -#define RTMP_IO_FORCE_READ32(_A, _R, _pV) \ - (*_pV = readl((void *)((_A)->PciHif.CSRBaseAddress + (_R)))) - -#define RTMP_IO_READ32(_A, _R, _pV) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) \ - (*_pV = readl((void *)((_A)->PciHif.CSRBaseAddress + \ - (_R)))); \ - else \ - *_pV = 0; \ - } while (0) - -#define RTMP_IO_FORCE_READ32(_A, _R, _pV) \ - (*_pV = readl((void *)((_A)->PciHif.CSRBaseAddress + (_R)))) - -#define RTMP_IO_READ8(_A, _R, _pV) \ - (*_pV = readb((void *)((_A)->PciHif.CSRBaseAddress + (_R)))) - -#define RTMP_IO_WRITE32(_A, _R, _V) \ - { \ - if ((_A)->bPCIclkOff == FALSE) \ - writel((_V), \ - (void *)((_A)->PciHif.CSRBaseAddress + (_R))); \ - } - -#define RTMP_IO_FORCE_WRITE32(_A, _R, _V) \ - writel(_V, (void *)((_A)->PciHif.CSRBaseAddress + (_R))) - -#ifdef RTMP_RBUS_SUPPORT -/* This is actually system IO */ -#define RTMP_SYS_IO_READ32(_R, _pV) (*_pV = readl((void *)(_R))) - -#define RTMP_SYS_IO_WRITE32(_R, _V) writel(_V, (void *)(_R)) -#endif /* RTMP_RBUS_SUPPORT */ - -#if defined(BRCM_6358) || defined(RALINK_2880) || defined(RALINK_3052) || \ - defined(RALINK_2883) || defined(RTMP_RBUS_SUPPORT) || defined(MT76x2) -#define RTMP_IO_WRITE8(_A, _R, _V) \ - { \ - ULONG Val; \ - UCHAR _i; \ - _i = ((_R)&0x3); \ - Val = readl( \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - Val = Val & (~(0x000000ff << ((_i)*8))); \ - Val = Val | ((ULONG)(_V) << ((_i)*8)); \ - writel((Val), \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - } -#else -#define RTMP_IO_WRITE8(_A, _R, _V) \ - { \ - writeb((_V), (PUCHAR)((_A)->PciHif.CSRBaseAddress + (_R))); \ - } -#endif /* #if defined(BRCM_6358) || defined(RALINK_2880) */ - -#define RTMP_IO_WRITE16(_A, _R, _V) \ - { \ - writew((_V), (PUSHORT)((_A)->PciHif.CSRBaseAddress + (_R))); \ - } -#endif /* #if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(IKANOS_VX_1X0) */ -#endif /* RTMP_MAC_PCI */ - -#define MAC_IO_READ32(_A, _R, _pV) RTMP_IO_READ32(_A, _R, _pV) -#define MAC_IO_WRITE32(_A, _R, _V) RTMP_IO_WRITE32(_A, _R, _V) - -#define HIF_IO_READ32(_A, _R, _pV) RTMP_IO_READ32(_A, _R, _pV) -#define HIF_IO_WRITE32(_A, _R, _V) RTMP_IO_WRITE32(_A, _R, _V) - -#define PHY_IO_READ32(_A, _R, _pV) RTMP_IO_READ32(_A, _R, _pV) -#define PHY_IO_WRITE32(_A, _R, _V) RTMP_IO_WRITE32(_A, _R, _V) - -#define HW_IO_READ32(_A, _R, _pV) RTMP_IO_READ32(_A, _R, _pV) -#define HW_IO_WRITE32(_A, _R, _V) RTMP_IO_WRITE32(_A, _R, _V) - -#define pci_read_config_word RtmpOsPciConfigReadWord -#define pci_write_config_word RtmpOsPciConfigWriteWord -#define pci_read_config_dword RtmpOsPciConfigReadDWord -#define pci_write_config_dword RtmpOsPciConfigWriteDWord -#define pci_find_capability RtmpOsPciFindCapability - -#define RTMP_USB_URB_DATA_GET RtmpOsUsbUrbDataGet -#define RTMP_USB_URB_STATUS_GET RtmpOsUsbUrbStatusGet -#define RTMP_USB_URB_LEN_GET RtmpOsUsbUrbLenGet - -#define IW_SCAN_MAX_DATA RTMP_OS_MAX_SCAN_DATA_GET() - -/*********************************************************************************** - * Network Related data structure and marco definitions - ***********************************************************************************/ -#define PKTSRC_NDIS 0x7f -#define PKTSRC_DRIVER 0x0f - -#define RTMP_OS_NETDEV_GET_PHYADDR RtmpOsNetDevGetPhyAddr -#define SET_OS_PKT_NETDEV RtmpOsSetPktNetDev -#define RTMP_OS_NETDEV_GET_DEVNAME RtmpOsGetNetDevName -#define RTMP_OS_NETDEV_SET_TYPE RtmpOsSetNetDevType -#define RTMP_OS_NETDEV_SET_TYPE_MONITOR RtmpOsSetNetDevTypeMonitor - -#define QUEUE_ENTRY_TO_PACKET(pEntry) (PNDIS_PACKET)(pEntry) - -#define PACKET_TO_QUEUE_ENTRY(pPacket) (PQUEUE_ENTRY)(pPacket) - -#define RTMP_OS_NETDEV_STATE_RUNNING(_pNetDev) \ - (RtmpOSNetDevIsUp(_pNetDev) == TRUE) - -#define RELEASE_NDIS_PACKET(_pReserved, _pPacket, _Status) \ - { \ - RTMPFreeNdisPacket(_pReserved, _pPacket); \ - } - -#define RELEASE_NDIS_PACKET_IRQ(_pReserved, _pPacket, _Status) \ - { \ - RTMPFreeNdisPacketIRQ(_pReserved, _pPacket); \ - } - -/* - * packet helper - * - convert internal rt packet to os packet or - * os packet to rt packet - */ -extern ULONG RTPktOffsetData, RTPktOffsetLen, RTPktOffsetCB; - -#define RTPKT_TO_OSPKT(_p) (_p) -#define OSPKT_TO_RTPKT(_p) (_p) - -#define GET_OS_PKT_DATAPTR(_pkt) \ - ((UCHAR *)(*(ULONG *)((UCHAR *)_pkt + RTPktOffsetData))) - -#define SET_OS_PKT_DATAPTR RtmpOsPktDataPtrAssign - -#define GET_OS_PKT_LEN(_pkt) (*(UINT32 *)((UCHAR *)_pkt + RTPktOffsetLen)) - -#define SET_OS_PKT_LEN RtmpOsPktLenAssign - -#define GET_OS_PKT_CB(_pkt) ((UCHAR *)((UCHAR *)_pkt + RTPktOffsetCB)) - -#define GET_OS_PKT_NETDEV(_pkt) RtmpOsPktNetDevGet - -#define OS_PKT_CLONED RtmpOsIsPktCloned - -#define OS_PKT_COPY RtmpOsPktCopy - -#define OS_PKT_TAIL_ADJUST RtmpOsPktTailAdjust - -#define OS_PKT_HEAD_BUF_EXTEND RtmpOsPktHeadBufExtend - -#define OS_PKT_TAIL_BUF_EXTEND RtmpOsPktTailBufExtend - -#define OS_PKT_RESERVE RtmpOsPktReserve - -#define OS_PKT_CLONE(_pAd, _pkt, _src, _flag) (_src = RtmpOsPktClone((_pkt))) - -#define RTMP_OS_PKT_INIT RtmpOsPktInit - -extern UINT32 RtmpOsGetUnaligned32(IN UINT32 *pWord); - -extern ULONG RtmpOsGetUnalignedlong(IN ULONG *pWord); - -#define get_unaligned RtmpOsGetUnaligned -#define get_unaligned32 RtmpOsGetUnaligned32 -#define get_unalignedlong RtmpOsGetUnalignedlong - -#define OS_NTOHS RtmpOsNtohs -#define OS_HTONS RtmpOsHtons -#define OS_NTOHL RtmpOsNtohl -#define OS_HTONL RtmpOsHtonl - -#ifndef ntohs -#define ntohs OS_NTOHS -#endif /* ntohs */ -#ifndef htons -#define htons OS_HTONS -#endif /* htons */ -#ifndef ntohl -#define ntohl OS_NTOHL -#endif /* ntohl */ -#ifndef htonl -#define htonl OS_HTONL -#endif /* htonl */ - -#define RTMP_OS_NETDEV_START_QUEUE RtmpOsNetQueueStart -#define RTMP_OS_NETDEV_STOP_QUEUE RtmpOsNetQueueStop -#define RTMP_OS_NETDEV_WAKE_QUEUE RtmpOsNetQueueWake - -#define CB_OFF 10 -#define CB_LEN 36 - -#define PACKET_CB_ASSIGN(_p, _offset) (*((UINT8 *)_p + RTPktOffsetCB + _offset)) - -#define PACKET_CB(_p, _offset) \ - (*((UINT8 *)_p + RTPktOffsetCB + CB_OFF + _offset)) - -/*********************************************************************************** - * Other function prototypes definitions - ***********************************************************************************/ -void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time); - -#ifdef RTMP_RBUS_SUPPORT -#ifndef CONFIG_RALINK_FLASH_API -void FlashWrite(UCHAR *p, ULONG a, ULONG b); -void FlashRead(UCHAR *p, ULONG a, ULONG b); -#endif /* CONFIG_RALINK_FLASH_API */ - -int wl_proc_init(void); -int wl_proc_exit(void); - -#ifdef LINUX -#if defined(CONFIG_RA_CLASSIFIER) || defined(CONFIG_RA_CLASSIFIER_MODULE) -extern volatile unsigned long classifier_cur_cycle; -extern int (*ra_classifier_hook_rx)(struct sk_buff *skb, unsigned long cycle); -#endif /* defined(CONFIG_RA_CLASSIFIER)||defined(CONFIG_RA_CLASSIFIER_MODULE) */ -#endif /* LINUX */ -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef CONFIG_ATE -/****************************************************************************** - - ATE related definitions - -******************************************************************************/ -#define ate_print printk -#ifdef RTMP_MAC_PCI -#ifdef CONFIG_AP_SUPPORT -#define EEPROM_BIN_FILE_NAME "/etc/Wireless/RT2860AP/e2p.bin" -#endif /* CONFIG_AP_SUPPORT */ -#endif /* RTMP_MAC_PCI */ - -#endif /* CONFIG_ATE */ - -/* OS definition re-declaration */ -#ifndef NULL -#define NULL 0 -#endif - -#ifndef ETH_P_IPV6 -#define ETH_P_IPV6 0x86DD -#endif - -#ifndef ETH_P_IP -#define ETH_P_IP 0x0800 /* Internet Protocol packet */ -#endif - -#ifndef ETH_ALEN -#define ETH_ALEN 6 -#endif - -#undef KERN_EMERG -#define KERN_EMERG -#undef KERN_WARNING -#define KERN_WARNING - -#undef copy_from_user -#undef copy_to_user - -#define RTMP_OS_MAX_SCAN_DATA_GET RtmpOsMaxScanDataGet -#define vmalloc RtmpOsVmalloc -#define vfree RtmpOsVfree -#define copy_from_user RtmpOsCopyFromUser -#define copy_to_user RtmpOsCopyToUser -#define simple_strtol RtmpOsSimpleStrtol - -#undef atomic_read -#undef atomic_dec -#undef InterlockedExchange -#define atomic_read RtmpOsAtomicRead -#define atomic_dec RtmpOsAtomicDec -#define InterlockedExchange RtmpOsAtomicInterlockedExchange - -extern int sprintf(char *buf, const char *fmt, ...); -extern int sscanf(const char *, const char *, ...); - -#define printk pRaOsOps->ra_printk -#define snprintf pRaOsOps->ra_snprintf - -#define RA_WEXT 0 -#define RA_NETLINK 1 - -#endif /* __RT_LINUX_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_ecos_type.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_ecos_type.h deleted file mode 100644 index 5bd0b0657d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_ecos_type.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - - Abstract: - - -***************************************************************************/ - -#ifndef __RTMP_ECOS_TYPE_H_ -#define __RTMP_ECOS_TYPE_H_ - -/* Put platform dependent declaration here */ -/* For example, linux type definition */ -typedef unsigned char UINT8; -typedef unsigned short UINT16; -typedef unsigned int UINT32; -typedef unsigned long long UINT64; -typedef int INT32; -typedef short INT16; -typedef long long INT64; -typedef unsigned int u32; - -typedef unsigned char UCHAR; -typedef unsigned short USHORT; -typedef unsigned int UINT; -typedef unsigned long ULONG; - -typedef unsigned char *PUINT8; -typedef unsigned short *PUINT16; -typedef unsigned int *PUINT32; -typedef unsigned long long *PUINT64; -typedef int *PINT32; -typedef long long *PINT64; - -/* modified for fixing compile warning on Sigma 8634 platform */ -/* typedef char STRING; */ -typedef char RTMP_STRING; -typedef signed char CHAR; - -typedef signed short SHORT; -typedef signed int INT; -typedef signed int *PINT; -typedef signed long LONG; -typedef signed long long LONGLONG; - -typedef unsigned long long ULONGLONG; - -typedef unsigned char BOOLEAN; -typedef void VOID; - -typedef VOID *PVOID; -typedef CHAR *PCHAR; -typedef UCHAR *PUCHAR; -typedef USHORT *PUSHORT; -typedef LONG *PLONG; -typedef ULONG *PULONG; -typedef UINT *PUINT; - -#endif /* __RTMP_ECOS_TYPE_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux.h deleted file mode 100644 index 50431f41e5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux.h +++ /dev/null @@ -1,1883 +0,0 @@ -/**************************************************************************** - - Module Name: - rt_linux.h - - Abstract: - Any OS related definition/MACRO is defined here. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - -***************************************************************************/ - -#ifndef __RT_LINUX_H__ -#define __RT_LINUX_H__ - -#ifdef VENDOR_FEATURE7_SUPPORT -/* ADD - Start - Add our headers so that our #defines and arris_event can be used throughout the driver */ -#ifdef ARRIS_MODULE_PRESENT -#include -ARRISMOD_EXTERN(void, arris_event_send_hook, int, int, int, char *, int); -#else -/* ARRIS_MODULE_PRESENT is set in arris-patched config.mk, and causes us to include the proper kernel's - * arris_mod_api.h. If it's not defined, use MTK's patched version so MTK can compile the driver with Arris - * changes but without other Arris code. - */ -#include "arris_mod_api.h" -#endif -#include "event_common.h" -/* ADD - End */ -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#if defined(CONFIG_TSO_SUPPORT) || defined(CONFIG_CSO_SUPPORT) -#include -#endif /* defined(CONFIG_TSO_SUPPORT) || defined(CONFIG_CSO_SUPPORT) */ - -#ifdef INF_PPA_SUPPORT -#include -#include -#endif /* INF_PPA_SUPPORT */ - -/* load firmware */ -#define __KERNEL_SYSCALLS__ -#include -#include -#include -#include /* for get_unaligned() */ - -#include - -#include "common/link_list.h" - -#ifdef RT_CFG80211_SUPPORT -#include -#endif /* RT_CFG80211_SUPPORT */ - -#ifdef MAT_SUPPORT -#include -#include -#include -#endif /* MAT_SUPPORT */ - -#include -#include - -#include "os/rt_linux_cmm.h" - -#ifdef RT_CFG80211_SUPPORT -#include "cfg80211.h" -#endif /* RT_CFG80211_SUPPORT */ - -#include - -#undef AP_WSC_INCLUDED -#undef STA_WSC_INCLUDED -#undef WSC_INCLUDED - -#ifdef CONFIG_AP_SUPPORT -#ifdef WSC_AP_SUPPORT -#define AP_WSC_INCLUDED -#endif /* WSC_AP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -#if defined(WSC_AP_SUPPORT) || defined(WSC_STA_SUPPORT) -#define WSC_INCLUDED -#endif - -/*#ifdef RTMP_USB_SUPPORT // os abl move */ -typedef struct usb_device *PUSB_DEV; -typedef struct urb *purbb_t; -typedef struct usb_ctrlrequest devctrlrequest; -/*#endif */ - -/*********************************************************************************** - * Profile related sections - ***********************************************************************************/ -#ifdef INTELP6_SUPPORT -#define L1_PROFILE_PATH "/tmp/l1profile.dat" -#else -#define L1_PROFILE_PATH "/etc/wireless/l1profile.dat" -#endif -#define L1PROFILE_INDEX_LEN 10 -#define L1PROFILE_ATTRNAME_LEN 30 -#define L2PROFILE_PATH_LEN 50 - -#ifdef CONFIG_AP_SUPPORT -#ifdef RTMP_MAC_PCI -#if CONFIG_RTPCI_AP_RF_OFFSET == 0x48000 -#define AP_PROFILE_PATH "/etc/Wireless/iNIC/iNIC_ap.dat" -#define AP_RTMP_FIRMWARE_FILE_NAME "/etc_ro/Wireless/iNIC/RT2860AP.bin" -#else -#ifdef BB_SOC -#define AP_PROFILE_PATH "/etc/Wireless/RT2860AP_AC/RT2860AP.dat" -#else -#define AP_PROFILE_PATH "/etc/Wireless/RT2860AP/RT2860AP.dat" -#endif -#define AP_RTMP_FIRMWARE_FILE_NAME "/etc/Wireless/RT2860AP/RT2860AP.bin" -#endif - -#define AP_DRIVER_VERSION "5.1.0.0" -#ifdef MULTIPLE_CARD_SUPPORT -#define CARD_INFO_PATH "/etc/Wireless/RT2860AP/RT2860APCard.dat" -#endif /* MULTIPLE_CARD_SUPPORT */ -#ifdef WAPP_SUPPORT -#define WAPP_SUPPORT_VERSION "v2.0.2" -#endif /* WAPP_SUPPORT */ -#endif /* RTMP_MAC_PCI */ - -#ifdef RTMP_RBUS_SUPPORT -/* This used for rbus-based chip, maybe we can integrate it together. */ -#define RTMP_FIRMWARE_FILE_NAME "/etc_ro/Wireless/RT2860AP/RT2860AP.bin" -#define PROFILE_PATH "/etc/Wireless/RT2860i.dat" -#define AP_PROFILE_PATH_RBUS "/etc/Wireless/RT2860/RT2860.dat" -#define RT2880_AP_DRIVER_VERSION "1.0.0.0" -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef SINGLE_SKU_V2 -#ifdef VENDOR_FEATURE7_SUPPORT -#define SINGLE_SKU_TABLE_FILE_NAME "/tmp/.mt7615_SingleSKU.dat" -#define BF_GAIN_TABLE_FILE_NAME "/tmp/.mt7615_SingleSKU_BF_Gain.dat" -#define BF_SKU_TABLE_FILE_NAME "/tmp/.mt7615_SingleSKU_BF.dat" -#else -#define SINGLE_SKU_TABLE_FILE_NAME "/etc_ro/Wireless/RT2860AP/SingleSKU.dat" -#define BF_SKU_TABLE_FILE_NAME "/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat" -#endif -#endif /* SINGLE_SKU_V2 */ - -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef CONFIG_APSTA_MIXED_SUPPORT -extern const struct iw_handler_def rt28xx_ap_iw_handler_def; -#endif /* CONFIG_APSTA_MIXED_SUPPORT */ - -/*********************************************************************************** - * Compiler related definitions - ***********************************************************************************/ -#define IN -#define OUT -#define INOUT -#define NDIS_STATUS INT - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) -#define DEVEXIT -#define DEVEXIT_P -#define DEVINIT -#define DEVINITDATA -#else -#define DEVEXIT __devexit -#define DEVEXIT_P __devexit_p -#define DEVINIT __devinit -#define DEVINITDATA __devinitdata -#endif - -/*********************************************************************************** - * OS Specific definitions and data structures - ***********************************************************************************/ -typedef struct net_device_stats NET_DEV_STATS; -/* #ifdef RTMP_RBUS_SUPPORT */ -/* typedef struct platform_device * PPCI_DEV; */ -/* #else */ -typedef struct pci_dev *PPCI_DEV; -/* #endif */ /*RTMP_RBUS_SUPPORT*/ -typedef struct net_device *PNET_DEV; -typedef struct wireless_dev *PWIRELESS_DEV; -typedef void *PNDIS_PACKET; -typedef char NDIS_PACKET; -typedef PNDIS_PACKET *PPNDIS_PACKET; -typedef ra_dma_addr_t NDIS_PHYSICAL_ADDRESS; -typedef ra_dma_addr_t *PNDIS_PHYSICAL_ADDRESS; -typedef void *NDIS_HANDLE; -typedef char *PNDIS_BUFFER; -typedef struct ifreq NET_IOCTL; -typedef struct ifreq *PNET_IOCTL; - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) -typedef struct pid *RTMP_OS_PID; -#else -typedef pid_t RTMP_OS_PID; -#endif - -typedef struct semaphore OS_SEM; - -typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, - struct net_device *net_dev); - -#ifdef RTMP_MAC_PCI -#ifndef PCI_DEVICE -#define PCI_DEVICE(vend, dev) \ - .vendor = (vend), .device = (dev), .subvendor = PCI_ANY_ID, \ - .subdevice = PCI_ANY_ID -#endif /* PCI_DEVICE */ -#endif /* RTMP_MAC_PCI */ - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) -#define RT_MOD_INC_USE_COUNT() \ - do { \ - if (!try_module_get(THIS_MODULE)) { \ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("%s: cannot reserve module\n", __func__)); \ - return -1; \ - } \ - } while (0) - -#define RT_MOD_DEC_USE_COUNT() module_put(THIS_MODULE); -#else -#define RT_MOD_INC_USE_COUNT() MOD_INC_USE_COUNT; -#define RT_MOD_DEC_USE_COUNT() MOD_DEC_USE_COUNT; -#endif - -#define RTMP_INC_REF(_A) 0 -#define RTMP_DEC_REF(_A) 0 -#define RTMP_GET_REF(_A) 0 - -#if defined(CONFIG_FAST_NAT_SUPPORT) -#define RT_MOD_HNAT_DEREG(_net_dev) \ - do { \ - if (ppe_dev_unregister_hook != NULL) \ - ppe_dev_unregister_hook(_net_dev); \ - } while (0) -#define RT_MOD_HNAT_REG(_net_dev) \ - do { \ - if (ppe_dev_register_hook != NULL) \ - ppe_dev_register_hook(_net_dev); \ - } while (0) -#else -#define RT_MOD_HNAT_DEREG(_net_dev) \ - do { \ - } while (0) -#define RT_MOD_HNAT_REG(_net_dev) \ - do { \ - } while (0) -#endif /*CONFIG_FAST_NAT_SUPPORT*/ - -#if WIRELESS_EXT >= 12 -/* This function will be called when query /proc */ -struct iw_statistics *rt28xx_get_wireless_stats(IN struct net_device *net_dev); -#endif - -/*********************************************************************************** - * Network related constant definitions - ***********************************************************************************/ -#ifndef IFNAMSIZ -#define IFNAMSIZ 16 -#endif - -#define MAC_ADDR_LEN 6 - -#define NDIS_STATUS_SUCCESS 0x00 -#define NDIS_STATUS_FAILURE 0x01 -#define NDIS_STATUS_INVALID_DATA 0x02 -#define NDIS_STATUS_RESOURCES 0x03 -#define NDIS_STATUS_PKT_REQUEUE 0x04 -#define NDIS_STATUS_MORE_PROCESSING_REQUIRED 0x05 - -#define NDIS_SET_PACKET_STATUS(_p, _status) \ - do { \ - } while (0) -#define NdisWriteErrorLogEntry(_a, _b, _c, _d) \ - do { \ - } while (0) - -/* statistics counter */ -#define STATS_INC_RX_PACKETS(_pAd, _dev) -#define STATS_INC_TX_PACKETS(_pAd, _dev) - -#define STATS_INC_RX_BYTESS(_pAd, _dev, len) -#define STATS_INC_TX_BYTESS(_pAd, _dev, len) - -#define STATS_INC_RX_ERRORS(_pAd, _dev) -#define STATS_INC_TX_ERRORS(_pAd, _dev) - -#define STATS_INC_RX_DROPPED(_pAd, _dev) -#define STATS_INC_TX_DROPPED(_pAd, _dev) - -/*********************************************************************************** - * Ralink Specific network related constant definitions - ***********************************************************************************/ - -#ifdef DOT11_VHT_AC -#define MAX_PACKETS_IN_QUEUE 1024 /*(512)*/ -#else -#define MAX_PACKETS_IN_QUEUE (512) -#endif /* DOT11_VHT_AC */ - -/*********************************************************************************** - * OS signaling related constant definitions - ***********************************************************************************/ - -/*********************************************************************************** - * OS file operation related data structure definitions - ***********************************************************************************/ -typedef struct file *RTMP_OS_FD; - -typedef struct _OS_FS_INFO_ { - int fsuid; - int fsgid; - mm_segment_t fs; -} OS_FS_INFO; - -typedef struct _RTMP_OS_FD { - RTMP_OS_FD fsFd; - OS_FS_INFO fsInfo; - INT Status; - UINT32 fsize; -} RTMP_OS_FD_EXT; - -#define IS_FILE_OPEN_ERR(_fd) ((_fd == NULL) || IS_ERR((_fd))) - -/*********************************************************************************** - * OS semaphore related data structure and definitions - ***********************************************************************************/ -typedef struct os_lock { - spinlock_t lock; - unsigned long flags; -} OS_LOCK; - -typedef struct completion OS_EVENT; -typedef NDIS_PACKET OS_PACKET; -typedef NDIS_PHYSICAL_ADDRESS OS_PHYSICAL_ADDRESS; - -typedef spinlock_t OS_NDIS_SPIN_LOCK; - -/* */ -/* spin_lock enhanced for Nested spin lock */ -/* */ -#define OS_NdisAllocateSpinLock(__lock) spin_lock_init((spinlock_t *)(__lock)) - -#define OS_NdisFreeSpinLock(lock) \ - do { \ - } while (0) - -#define OS_SEM_LOCK(__lock) spin_lock_bh((spinlock_t *)(__lock)) - -#define OS_SEM_UNLOCK(__lock) spin_unlock_bh((spinlock_t *)(__lock)) - -/* sample, use semaphore lock to replace IRQ lock, 2007/11/15 */ -#ifdef MULTI_CORE_SUPPORT -#define OS_IRQ_LOCK(__lock, __irqflags) \ - { \ - __irqflags = 0; \ - spin_lock_irqsave((spinlock_t *)(__lock), __irqflags); \ - } - -#define OS_IRQ_UNLOCK(__lock, __irqflag) \ - spin_unlock_irqrestore((spinlock_t *)(__lock), __irqflag) -#else -#define OS_IRQ_LOCK(__lock, __irqflags) \ - { \ - __irqflags = 0; \ - spin_lock_bh((spinlock_t *)(__lock)); \ - } - -#define OS_IRQ_UNLOCK(__lock, __irqflag) spin_unlock_bh((spinlock_t *)(__lock)) - -#endif /* MULTI_CORE_SUPPORT // */ -#define OS_INT_LOCK(__lock, __irqflags) \ - spin_lock_irqsave((spinlock_t *)__lock, __irqflags) - -#define OS_INT_UNLOCK(__lock, __irqflag) \ - spin_unlock_irqrestore((spinlock_t *)(__lock), \ - ((unsigned long)__irqflag)) - -#define OS_NdisAcquireSpinLock OS_SEM_LOCK -#define OS_NdisReleaseSpinLock OS_SEM_UNLOCK - -/* - Following lock/unlock definition used for BBP/RF register read/write. - Currently we don't use it to protect MAC register access. - - For USB: - we use binary semaphore to do the protection because all register - access done in kernel thread and should allow task go sleep when - in protected status. - - For PCI/PCI-E/RBUS: - We use interrupt to do the protection because the register may accessed - in thread/tasklet/timer/inteerupt, so we use interrupt_disable to protect - the access. -*/ -#define RTMP_MCU_RW_LOCK(_pAd, _irqflags) \ - do { \ - if (_pAd->infType == RTMP_DEV_INF_USB) \ - RTMP_SEM_EVENT_WAIT(&_pAd->McuCmdSem, _irqflags); \ - else \ - RTMP_SEM_LOCK(&_pAd->McuCmdLock, _irqflags); \ - } while (0) - -#define RTMP_MCU_RW_UNLOCK(_pAd, _irqflags) \ - do { \ - if (_pAd->infType == RTMP_DEV_INF_USB) \ - RTMP_SEM_EVENT_UP(&_pAd->McuCmdSem); \ - else \ - RTMP_SEM_UNLOCK(&_pAd->McuCmdLock, _irqflags); \ - } while (0) - -#ifndef wait_event_interruptible_timeout -#define __wait_event_interruptible_timeout(wq, condition, ret) \ - do { \ - wait_queue_t __wait; \ - init_waitqueue_entry(&__wait, current); \ - add_wait_queue(&wq, &__wait); \ - for (;;) { \ - set_current_state(TASK_INTERRUPTIBLE); \ - if (condition) \ - break; \ - if (!signal_pending(current)) { \ - ret = schedule_timeout(ret); \ - if (!ret) \ - break; \ - continue; \ - } \ - ret = -ERESTARTSYS; \ - break; \ - } \ - current->state = TASK_RUNNING; \ - remove_wait_queue(&wq, &__wait); \ - } while (0) - -#define wait_event_interruptible_timeout(wq, condition, timeout) \ - ({ \ - long __ret = timeout; \ - if (!(condition)) \ - __wait_event_interruptible_timeout(wq, condition, \ - __ret); \ - __ret; \ - }) -#endif - -#define OS_SEM_EVENT_INIT_LOCKED(_pSema) sema_init((_pSema), 0) -#define OS_SEM_EVENT_INIT(_pSema) sema_init((_pSema), 1) -#define OS_SEM_EVENT_DESTORY(_pSema) \ - do { \ - } while (0) -#define OS_SEM_EVENT_WAIT(_pSema, _status) \ - ((_status) = down_interruptible((_pSema))) -#define OS_SEM_EVENT_UP(_pSema) up(_pSema) - -#define RTCMDUp OS_RTCMDUp -#define RTCMDRunning OS_RTCMDRunning - -#define RTMP_WAIT_EVENT_INTERRUPTIBLE(_Status, _pTask) \ - do { \ - wait_event_interruptible(_pTask->kthread_q, \ - _pTask->kthread_running || \ - kthread_should_stop()); \ - _pTask->kthread_running = FALSE; \ - if (kthread_should_stop()) { \ - (_Status) = -1; \ - break; \ - } else \ - (_Status) = 0; \ - } while (0) - -#define RTMP_WAIT_EVENT_INTERRUPTIBLE_COND(_Status, _pTask, _Cond) \ - do { \ - wait_event_interruptible(_pTask->kthread_q, \ - _pTask->kthread_running || \ - kthread_should_stop() || \ - (_Cond)); \ - _pTask->kthread_running = FALSE; \ - if (kthread_should_stop()) { \ - (_Status) = -1; \ - break; \ - } else \ - (_Status) = 0; \ - } while (0) - -#define WAKE_UP(_pTask) \ - do { \ - if ((_pTask)->kthread_task) { \ - (_pTask)->kthread_running = TRUE; \ - wake_up_interruptible(&(_pTask)->kthread_q); \ - } \ - } while (0) - -#ifdef LINUX -#define OS_SCHEDULE() \ - { \ - schedule(); \ - } -#else -#define OS_SCHEDULE() -#endif - -/*********************************************************************************** - * OS Memory Access related data structure and definitions - ***********************************************************************************/ -#define MEM_ALLOC_FLAG (GFP_ATOMIC) /*(GFP_DMA | GFP_ATOMIC) */ - -#define NdisMoveMemory(Destination, Source, Length) \ - memmove(Destination, Source, Length) -#define NdisCopyMemory(Destination, Source, Length) \ - memcpy(Destination, Source, Length) -#define NdisZeroMemory(Destination, Length) memset(Destination, 0, Length) -#define NdisFillMemory(Destination, Length, Fill) \ - memset(Destination, Fill, Length) -#define NdisCmpMemory(Destination, Source, Length) \ - memcmp(Destination, Source, Length) -#define NdisEqualMemory(Source1, Source2, Length) \ - (!memcmp(Source1, Source2, Length)) -#define RTMPEqualMemory(Source1, Source2, Length) \ - (!memcmp(Source1, Source2, Length)) - -#define MlmeAllocateMemory(_pAd, _ppVA) \ - os_alloc_mem(_pAd, _ppVA, MAX_MGMT_PKT_LEN) -#define MlmeFreeMemory(_pVA) os_free_mem(_pVA) - -#define COPY_MAC_ADDR(Addr1, Addr2) memcpy((Addr1), (Addr2), MAC_ADDR_LEN) - -#define CONTAINER_OF(ptr, type, member) container_of(ptr, type, member) - -/*********************************************************************************** - * OS task related data structure and definitions - ***********************************************************************************/ -#define RTMP_OS_MGMT_TASK_FLAGS CLONE_VM - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) -/*typedef struct pid * THREAD_PID; // no use */ -#define THREAD_PID_INIT_VALUE NULL -/* TODO: Use this IOCTL carefully when linux kernel version larger than 2.6.27, because the PID only correct when the user space task do this ioctl itself. */ -/*#define RTMP_GET_OS_PID(_x, _y) _x = get_task_pid(current, PIDTYPE_PID); */ -#ifdef OS_ABL_FUNC_SUPPORT -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -#define RT_GET_OS_PID(_x, _y) \ - do { \ - rcu_read_lock(); \ - _x = (ULONG)current->thread_pid; \ - rcu_read_unlock(); \ - } while (0) -#else -#define RT_GET_OS_PID(_x, _y) \ - do { \ - rcu_read_lock(); \ - _x = (ULONG)current->pids[PIDTYPE_PID].pid; \ - rcu_read_unlock(); \ - } while (0) -#endif -#define RTMP_GET_OS_PID(_a, _b) RtmpOsGetPid(&_a, _b) -#else -#ifdef CONFIG_PREEMPT_RCU -#define RT_GET_OS_PID(_x, _y) -#else /* else CONFIG_PREEMPT_RCU */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -#define RT_GET_OS_PID(_x, _y) \ - do { \ - rcu_read_lock(); \ - _x = current->thread_pid; \ - rcu_read_unlock(); \ - } while (0) -#else -#define RT_GET_OS_PID(_x, _y) \ - do { \ - rcu_read_lock(); \ - _x = current->pids[PIDTYPE_PID].pid; \ - rcu_read_unlock(); \ - } while (0) -#endif -#endif /* CONFIG_PREEMPT_RCU */ -#define RTMP_GET_OS_PID(_a, _b) RT_GET_OS_PID(_a, _b) -#endif /* OS_ABL_FUNC_SUPPORT */ -#define GET_PID_NUMBER(_v) pid_nr((_v)) -#define CHECK_PID_LEGALITY(_pid) (pid_nr((_pid)) > 0) -#define KILL_THREAD_PID(_A, _B, _C) kill_pid((_A), (_B), (_C)) -#else -/*typedef pid_t THREAD_PID; // no use */ -#define THREAD_PID_INIT_VALUE -1 -#define RT_GET_OS_PID(_x, _pid) (_x = _pid) -#define RTMP_GET_OS_PID(_x, _pid) (_x = _pid) -#define GET_PID_NUMBER(_v) (_v) -#define CHECK_PID_LEGALITY(_pid) ((_pid) >= 0) -#define KILL_THREAD_PID(_A, _B, _C) kill_proc((_A), (_B), (_C)) -#endif - -#define ATE_KILL_THREAD_PID(PID) KILL_THREAD_PID(PID, SIGTERM, 1) - -typedef int (*cast_fn)(void *); -typedef INT (*RTMP_OS_TASK_CALLBACK)(ULONG); - -#ifdef WORKQUEUE_BH -typedef struct work_struct OS_NET_TASK_STRUCT; -typedef struct work_struct *POS_NET_TASK_STRUCT; -#else -typedef struct tasklet_struct OS_NET_TASK_STRUCT; -typedef struct tasklet_struct *POS_NET_TASK_STRUCT; -#endif /* WORKQUEUE_BH */ - -/*********************************************************************************** - * Timer related definitions and data structures. - **********************************************************************************/ -#define OS_HZ HZ - -typedef struct timer_list OS_NDIS_MINIPORT_TIMER; -typedef struct timer_list OS_TIMER; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -typedef void (*TIMER_FUNCTION)(struct timer_list *); -#else -typedef void (*TIMER_FUNCTION)(unsigned long); -#endif - -#define OS_WAIT(_time) \ - { \ - if (in_interrupt()) \ - RtmpusecDelay(_time * 1000); \ - else { \ - int _i; \ - long _loop = ((_time) / (1000 / OS_HZ)) > 0 ? \ - ((_time) / (1000 / OS_HZ)) : \ - 1; \ - wait_queue_head_t _wait; \ - init_waitqueue_head(&_wait); \ - for (_i = 0; _i < (_loop); _i++) \ - wait_event_interruptible_timeout(_wait, 0, \ - ONE_TICK); \ - } \ - } - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) -#define RTMP_TIME_AFTER(a, b) \ - (typecheck(unsigned long, (unsigned long)a) && \ - typecheck(unsigned long, (unsigned long)b) && \ - ((long)(b) - (long)(a) < 0)) - -#define RTMP_TIME_AFTER_EQ(a, b) \ - (typecheck(unsigned long, (unsigned long)a) && \ - typecheck(unsigned long, (unsigned long)b) && \ - ((long)(a) - (long)(b) >= 0)) -#define RTMP_TIME_BEFORE(a, b) RTMP_TIME_AFTER_EQ(b, a) -#else -#define typecheck(type, x) \ - ({ \ - type __dummy; \ - typeof(x) __dummy2; \ - (void)(&__dummy == &__dummy2); \ - 1; \ - }) -#define RTMP_TIME_AFTER_EQ(a, b) \ - (typecheck(unsigned long, (unsigned long)a) && \ - typecheck(unsigned long, (unsigned long)b) && \ - ((long)(a) - (long)(b) >= 0)) -#define RTMP_TIME_BEFORE(a, b) RTMP_TIME_AFTER_EQ(b, a) -#define RTMP_TIME_AFTER(a, b) time_after(a, b) -#endif - -#define ONE_TICK 1 - -static inline void NdisGetSystemUpTime(ULONG *time) -{ - *time = jiffies; -} - -/*********************************************************************************** - * OS specific cookie data structure binding to RTMP_ADAPTER - ***********************************************************************************/ - -struct os_cookie { -#ifdef RTMP_MAC_PCI - PPCI_DEV pci_dev; - PPCI_DEV parent_pci_dev; - USHORT DeviceID; -#endif /* RTMP_MAC_PCI */ - - struct device *pDev; - UINT32 pAd_va; - -#if defined(RTMP_MAC_PCI) || defined(RTMP_MAC_USB) - RTMP_NET_TASK_STRUCT rx_done_task[2]; - RTMP_NET_TASK_STRUCT cmd_rsp_event_task; - RTMP_NET_TASK_STRUCT tx_dma_done_task; - RTMP_NET_TASK_STRUCT tr_done_task; - -#ifdef ERR_RECOVERY - RTMP_NET_TASK_STRUCT mac_error_recovey_task; -#endif /* ERR_RECOVERY */ - -#ifdef CONFIG_FWOWN_SUPPORT - RTMP_NET_TASK_STRUCT mt_mac_fw_own_task; -#endif /* CONFIG_FWOWN_SUPPORT */ - -#ifdef MULTI_LAYER_INTERRUPT - RTMP_NET_TASK_STRUCT subsys_int_task; -#endif - -#ifdef UAPSD_SUPPORT - RTMP_NET_TASK_STRUCT uapsd_eosp_sent_task; -#endif /* UAPSD_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT - -#ifdef CARRIER_DETECTION_SUPPORT - RTMP_NET_TASK_STRUCT carrier_sense_task; -#endif /* CARRIER_DETECTION_SUPPORT */ - -#endif /* CONFIG_AP_SUPPORT */ - -#endif - - RTMP_OS_PID apd_pid; /*802.1x daemon pid */ - unsigned long apd_pid_nr; -#ifdef CONFIG_AP_SUPPORT -#ifdef IAPP_SUPPORT - /* RT_SIGNAL_STRUC RTSignal; */ - RTMP_OS_PID IappPid; /*IAPP daemon pid */ - unsigned long IappPid_nr; -#endif /* IAPP_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - INT ioctl_if_type; - INT ioctl_if; - struct _SECURITY_CONFIG *pSecConfig; -#ifdef FW_DUMP_SUPPORT - struct proc_dir_entry *proc_fwdump_dir; - struct proc_dir_entry *proc_fwdump_file; - CHAR fwdump_dir_name[11]; -#endif - - struct workqueue_struct *hif_wq; - struct work_struct tx_dma_done_work; - struct work_struct rx_done_work[2]; - struct work_struct mac_recovery_work; - struct work_struct mac_fw_own_work; -#ifdef MULTI_LAYER_INTERRUPT - struct work_struct subsys_int_work; -#endif -}; - -typedef struct os_cookie *POS_COOKIE; - -/*********************************************************************************** - * OS debugging and printing related definitions and data structure - ***********************************************************************************/ -#define MTWF_PRINT printk - -#undef ASSERT -#ifdef DBG -#define ASSERT(x) \ - { \ - if (!(x)) { \ - printk(KERN_WARNING __FILE__ ":%d assert " #x \ - "failed\n", \ - __LINE__); \ - dump_stack(); \ - /* panic("Unexpected error occurs!\n"); */ \ - } \ - } -#else -#define ASSERT(x) -#endif /* DBG */ - -/********************************************************************************************************* - The following code are not revised, temporary put it here. - *********************************************************************************************************/ - -/*********************************************************************************** - * Device DMA Access related definitions and data structures. - **********************************************************************************/ -ra_dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, - int sd_idx, int direction); -void linux_pci_unmap_single(void *handle, ra_dma_addr_t dma_addr, size_t size, - int direction); - -#define PCI_MAP_SINGLE_DEV(_pAd, _ptr, _size, _sd_idx, _dir) \ - linux_pci_map_single(((POS_COOKIE)(_pAd->OS_Cookie))->pDev, _ptr, \ - _size, _sd_idx, _dir) - -#define DMA_MAPPING_ERROR_HANDLE(_handle, _ptr) \ - dma_mapping_error(&((struct pci_dev *)(_handle))->dev, _ptr) - -#define PCI_UNMAP_SINGLE(_pAd, _ptr, _size, _dir) \ - linux_pci_unmap_single(((POS_COOKIE)(_pAd->OS_Cookie))->pDev, _ptr, \ - _size, _dir) - -#define PCI_ALLOC_CONSISTENT(_pci_dev, _size, _ptr) \ - pci_alloc_consistent(_pci_dev, _size, _ptr) - -#define PCI_FREE_CONSISTENT(_pci_dev, _size, _virtual_addr, _physical_addr) \ - pci_free_consistent(_pci_dev, _size, _virtual_addr, _physical_addr) - -#if !defined(CONFIG_WIFI_PAGE_ALLOC_SKB) && !defined(CONFIG_WIFI_SLAB_ALLOC_SKB) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) && \ - defined(CONFIG_MT7621_ASIC) -#define CONFIG_WIFI_SLAB_ALLOC_SKB -#else -#define CONFIG_WIFI_PAGE_ALLOC_SKB -#endif -#else -#define CONFIG_WIFI_PAGE_ALLOC_SKB -#endif - -#ifdef CONFIG_WIFI_PAGE_ALLOC_SKB -#define DEV_ALLOC_SKB(_Pkt, _length) \ - do { \ - _Pkt = dev_alloc_skb(_length); \ - if (_Pkt != NULL) { \ - MEM_DBG_PKT_ALLOC_INC(_Pkt); \ - }; \ - } while (0) -#else /* CONFIG_WIFI_PAGE_ALLOC_SKB */ -#ifndef NET_SKB_PAD -#define NET_SKB_PAD 32 -#endif -#define DEV_ALLOC_SKB(_Pkt, _length) \ - do { \ - _Pkt = alloc_skb(_length + NET_SKB_PAD, GFP_ATOMIC); \ - if (_Pkt != NULL) { \ - skb_reserve(_Pkt, NET_SKB_PAD); \ - MEM_DBG_PKT_ALLOC_INC(_Pkt); \ - }; \ - } while (0) -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) -#define CONFIG_WIFI_BUILD_SKB -#define CONFIG_WIFI_PREFETCH_RXDATA -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)) && \ - defined(CONFIG_ARCH_MT7622) -#define CONFIG_DBG_QDISC -#endif - -#define SKB_BUF_HEADROOM_RSV (NET_SKB_PAD) -#define SKB_BUF_TAILROOM_RSV (sizeof(struct skb_shared_info)) - -#define SKB_BUF_HEADTAIL_RSV (SKB_BUF_HEADROOM_RSV + SKB_BUF_TAILROOM_RSV) -/* Need to do below miniume size protect for build_skb method, to avoid DATAABORT issue. */ -#define SKB_BUF_MINIMUN_SIZE (1984) - -#ifdef CONFIG_WIFI_BUILD_SKB -#define DEV_ALLOC_FRAG(_Pkt, _length) \ - do { \ - _Pkt = netdev_alloc_frag(_length); \ - if (_Pkt != NULL) { \ - MEM_DBG_PKT_ALLOC_INC(_Pkt); \ - }; \ - } while (0) - -#define DEV_FREE_FRAG_BUF(_Pkt) \ - do { \ - if (_Pkt != NULL) { \ - MEM_DBG_PKT_FREE_INC(_Pkt); \ - put_page(virt_to_head_page(_Pkt)); \ - }; \ - } while (0) - -#define DEV_BUILD_SKB(_Pkt, data_ptr, _length) \ - do { \ - if ((_length) == 0) { \ - _Pkt = build_skb(data_ptr, 0); \ - } else { \ - _Pkt = build_skb(data_ptr, (_length)); \ - }; \ - } while (0) - -#define DEV_SKB_PTR_ADJUST(_Pkt, _length, _buf_ptr) \ - do { \ - if (_Pkt != NULL) { \ - MEM_DBG_PKT_FREE_INC(_buf_ptr); \ - skb_reserve((_Pkt), (SKB_BUF_HEADROOM_RSV)); \ - skb_put((_Pkt), (_length)); \ - MEM_DBG_PKT_ALLOC_INC(_Pkt); \ - }; \ - } while (0) - -#endif /* CONFIG_WIFI_BUILD_SKB */ - -/*#define PCI_MAP_SINGLE(_handle, _ptr, _size, _dir) (ULONG)0 */ -/*#define PCI_UNMAP_SINGLE(_handle, _ptr, _size, _dir) */ - -/* - * ULONG - * RTMP_GetPhysicalAddressLow( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - */ -#define RTMP_GetPhysicalAddressLow(PhysicalAddress) (PhysicalAddress) - -/* - * ULONG - * RTMP_GetPhysicalAddressHigh( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - */ -#define RTMP_GetPhysicalAddressHigh(PhysicalAddress) (0) - -/* - * VOID - * RTMP_SetPhysicalAddressLow( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, - * IN ULONG Value); - */ -#define RTMP_SetPhysicalAddressLow(PhysicalAddress, Value) \ - (PhysicalAddress = Value) - -/* - * VOID - * RTMP_SetPhysicalAddressHigh( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, - * IN ULONG Value); - */ -#define RTMP_SetPhysicalAddressHigh(PhysicalAddress, Value) - -#define NdisMIndicateStatus(_w, _x, _y, _z) - -/*********************************************************************************** - * Device Register I/O Access related definitions and data structures. - **********************************************************************************/ -#ifdef RTMP_MAC_PCI -#if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(INF_AR9) || \ - defined(IKANOS_VX_1X0) -#define RTMP_IO_FORCE_READ32(_A, _R, _pV) \ - do { \ - (*(_pV) = \ - readl((void *)((_A)->PciHif.CSRBaseAddress + (_R)))); \ - (*(_pV) = SWAP32(*((UINT32 *)(_pV)))); \ - } while (0) - -#define RTMP_IO_READ32(_A, _R, _pV) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) { \ - (*(_pV) = readl((void *)((_A)->PciHif.CSRBaseAddress + \ - (_R)))); \ - (*(_pV) = SWAP32(*((UINT32 *)(_pV)))); \ - } \ - } while (0) - -#define RTMP_IO_READ8(_A, _R, _pV) \ - (*(_pV) = readb((void *)((_A)->PciHif.CSRBaseAddress + (_R)))) - -#define _RTMP_IO_WRITE32(_A, _R, _V) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) { \ - UINT32 _Val; \ - _Val = SWAP32(_V); \ - writel(_Val, \ - (void *)((_A)->PciHif.CSRBaseAddress + (_R))); \ - } \ - } while (0) - -#ifdef INF_VR9 -#define RTMP_IO_WRITE8(_A, _R, _V) \ - do { \ - ULONG Val; \ - UCHAR _i; \ - UINT32 _Val; \ - _i = ((_R)&0x3); \ - Val = readl( \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - Val = SWAP32(Val); \ - Val = Val & (~(0x000000ff << ((_i)*8))); \ - Val = Val | ((ULONG)(_V) << ((_i)*8)); \ - Val = SWAP32(Val); \ - writel((Val), \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - } while (0) -#else -#define RTMP_IO_WRITE8(_A, _R, _V) \ - writeb((_V), (PUCHAR)((_A)->PciHif.CSRBaseAddress + (_R))) -#endif - -#define RTMP_IO_WRITE16(_A, _R, _V) \ - writew(SWAP16((_V)), (PUSHORT)((_A)->PciHif.CSRBaseAddress + (_R))) - -#elif defined(PLATFORM_M_STB) -#define RTMP_IO_READ32(_A, _R, _pV) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) { \ - (pci_read_config_dword( \ - ((POS_COOKIE)(_A->OS_Cookie))->pci_dev, \ - _R + 0x80000000, _pV)); \ - } else \ - *(_pV) = 0; \ - } while (0) - -#define _RTMP_IO_WRITE32(_A, _R, _V) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) \ - (pci_write_config_dword( \ - ((POS_COOKIE)(_A->OS_Cookie))->pci_dev, \ - _R + 0x80000000, _V)); \ - } while (0) - -#define RTMP_IO_READ16(_A, _R, _pV) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) { \ - (pci_read_config_word( \ - ((POS_COOKIE)(_A->OS_Cookie))->pci_dev, \ - _R + 0x80000000, _pV)); \ - } else \ - *(_pV) = 0; \ - } while (0) - -#define RTMP_IO_WRITE16(_A, _R, _V) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) \ - (pci_write_config_word( \ - ((POS_COOKIE)(_A->OS_Cookie))->pci_dev, \ - _R + 0x80000000, _V)); \ - } while (0) - -#define RTMP_IO_READ8(_A, _R, _pV) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) { \ - (pci_read_config_byte( \ - ((POS_COOKIE)(_A->OS_Cookie))->pci_dev, \ - _R + 0x80000000, _pV)); \ - } else \ - *(_pV) = 0; \ - } while (0) - -#define RTMP_IO_WRITE8(_A, _R, _V) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) \ - (pci_write_config_byte( \ - ((POS_COOKIE)(_A->OS_Cookie))->pci_dev, \ - _R + 0x80000000, _V)); \ - } while (0) - -#else -#define RTMP_IO_READ32(_A, _R, _pV) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) \ - (*(_pV) = readl((void *)((_A)->PciHif.CSRBaseAddress + \ - (_R)))); \ - else \ - *(_pV) = 0; \ - } while (0) - -#define RTMP_IO_FORCE_READ32(_A, _R, _pV) \ - (*(_pV) = readl((void *)((_A)->PciHif.CSRBaseAddress + (_R)))) - -#if defined(BRCM_6358) || defined(RALINK_2880) || defined(RALINK_3052) || \ - defined(RALINK_2883) || defined(RTMP_RBUS_SUPPORT) || defined(BB_SOC) -#define RTMP_IO_READ8(_A, _R, _V) \ - do { \ - ULONG Val; \ - UCHAR _i; \ - _i = ((_R)&0x3); \ - Val = readl( \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - Val = (Val >> ((_i)*8)) & (0x000000ff); \ - *((PUCHAR)_V) = (UCHAR)Val; \ - } while (0) -#else -#define RTMP_IO_READ8(_A, _R, _pV) \ - (*(_pV) = readb((void *)((_A)->PciHif.CSRBaseAddress + (_R)))) -#endif /* #if defined(BRCM_6358) || defined(RALINK_2880) */ - -#define _RTMP_IO_WRITE32(_A, _R, _V) \ - do { \ - if ((_A)->bPCIclkOff == FALSE) \ - writel((_V), \ - (void *)((_A)->PciHif.CSRBaseAddress + (_R))); \ - } while (0) - -#define RTMP_IO_FORCE_WRITE32(_A, _R, _V) \ - writel(_V, (void *)((_A)->PciHif.CSRBaseAddress + (_R))) - -/* This is actually system IO */ -#define RTMP_SYS_IO_READ32(_R, _pV) (*_pV = readl((void *)(_R))) - -#define RTMP_SYS_IO_WRITE32(_R, _V) writel(_V, (void *)(_R)) - -#if defined(BRCM_6358) || defined(RALINK_2880) || defined(RALINK_3052) || \ - defined(RALINK_2883) || defined(RTMP_RBUS_SUPPORT) || \ - defined(MT76x2) || defined(BB_SOC) -#define RTMP_IO_WRITE8(_A, _R, _V) \ - do { \ - ULONG Val; \ - UCHAR _i; \ - _i = ((_R)&0x3); \ - Val = readl( \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - Val = Val & (~(0x000000ff << ((_i)*8))); \ - Val = Val | ((ULONG)(_V) << ((_i)*8)); \ - writel((Val), \ - (void *)((_A)->PciHif.CSRBaseAddress + ((_R)-_i))); \ - } while (0) -#else -#define RTMP_IO_WRITE8(_A, _R, _V) \ - writeb((_V), (PUCHAR)((_A)->PciHif.CSRBaseAddress + (_R))) -#endif /* #if defined(BRCM_6358) || defined(RALINK_2880) */ - -#define RTMP_IO_WRITE16(_A, _R, _V) \ - writew((_V), (PUSHORT)((_A)->PciHif.CSRBaseAddress + (_R))) -#endif /* #if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(IKANOS_VX_1X0) */ - -#ifndef VENDOR_FEATURE3_SUPPORT -#define RTMP_IO_WRITE32 _RTMP_IO_WRITE32 -#endif /* VENDOR_FEATURE3_SUPPORT */ -#endif /* RTMP_MAC_PCI */ - -#ifdef MT_MAC -#define RTMP_MCU_IO_READ32(_A, _R, _pV) CmdIORead32((_A), (_R), (_pV)) -#define RTMP_MCU_IO_WRITE32(_A, _R, _V) CmdIOWrite32((_A), (_R), (_V)) - -#endif /* MT_MAC */ - -#define MAC_IO_READ32(_A, _R, _pV) RTMP_IO_READ32(_A, _R, _pV) -#define MAC_IO_WRITE32(_A, _R, _V) RTMP_IO_WRITE32(_A, _R, _V) - -#if defined(RTMP_MAC_PCI) && defined(WHNAT_SUPPORT) -#define HIF_IO_READ32(_A, _R, _pV) pci_io_read32(_A, _R, _pV) -#define HIF_IO_WRITE32(_A, _R, _V) pci_io_write32(_A, _R, _V) -#else -#define HIF_IO_READ32(_A, _R, _pV) RTMP_IO_READ32(_A, _R, _pV) -#define HIF_IO_WRITE32(_A, _R, _V) RTMP_IO_WRITE32(_A, _R, _V) -#endif - -#define PHY_IO_READ32(_A, _R, _pV) RTMP_IO_READ32(_A, _R, _pV) -#define PHY_IO_WRITE32(_A, _R, _V) RTMP_IO_WRITE32(_A, _R, _V) - -#define HW_IO_READ32(_A, _R, _pV) RTMP_IO_READ32(_A, _R, _pV) -#define HW_IO_WRITE32(_A, _R, _V) RTMP_IO_WRITE32(_A, _R, _V) - -#define MCU_IO_READ32(_A, _R, _pV) RTMP_MCU_IO_READ32(_A, _R, _pV) -#define MCU_IO_WRITE32(_A, _R, _V) RTMP_MCU_IO_WRITE32(_A, _R, _V) - -#define RTMP_USB_URB_DATA_GET(__pUrb) (((purbb_t)__pUrb)->context) -#define RTMP_USB_URB_STATUS_GET(__pUrb) (((purbb_t)__pUrb)->status) -#define RTMP_USB_URB_LEN_GET(__pUrb) (((purbb_t)__pUrb)->actual_length) - -/*********************************************************************************** - * Network Related data structure and marco definitions - ***********************************************************************************/ -#define PKTSRC_NDIS 0x7f -#define PKTSRC_DRIVER 0x0f - -#define RTMP_OS_NETDEV_STATE_RUNNING(_pNetDev) ((_pNetDev)->flags & IFF_UP) - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) -#define _RTMP_OS_NETDEV_GET_PRIV(_pNetDev) (NULL /*(_pNetDev)->ml_priv*/) -#else -#define _RTMP_OS_NETDEV_GET_PRIV(_pNetDev) ((_pNetDev)->priv) -#endif - -#define RTMP_OS_NETDEV_GET_DEVNAME(_pNetDev) ((_pNetDev)->name) -#define RTMP_OS_NETDEV_GET_PHYADDR(_pNetDev) ((_pNetDev)->dev_addr) - -/* Get & Set NETDEV interface hardware type */ -#define RTMP_OS_NETDEV_GET_TYPE(_pNetDev) ((_pNetDev)->type) -#define RTMP_OS_NETDEV_SET_TYPE(_pNetDev, _type) ((_pNetDev)->type = (_type)) -#ifdef SNIFFER_MT7615 -#define RTMP_OS_NETDEV_SET_TYPE_MONITOR(_pNetDev) \ - RTMP_OS_NETDEV_SET_TYPE(_pNetDev, ARPHRD_IEEE80211_RADIOTAP) -#else -#define RTMP_OS_NETDEV_SET_TYPE_MONITOR(_pNetDev) \ - RTMP_OS_NETDEV_SET_TYPE(_pNetDev, ARPHRD_IEEE80211_PRISM) -#endif -#define RTMP_OS_NETDEV_START_QUEUE(_pNetDev) netif_start_queue((_pNetDev)) -#define RTMP_OS_NETDEV_STOP_QUEUE(_pNetDev) netif_stop_queue((_pNetDev)) -#define RTMP_OS_NETDEV_WAKE_QUEUE(_pNetDev) netif_wake_queue((_pNetDev)) -#define RTMP_OS_NETDEV_CARRIER_OFF(_pNetDev) netif_carrier_off((_pNetDev)) -#define RTMP_OS_NETDEV_CARRIER_ON(_pNetDev) netif_carrier_on((_pNetDev)) - -#define QUEUE_ENTRY_TO_PACKET(pEntry) (PNDIS_PACKET)(pEntry) - -#define PACKET_TO_QUEUE_ENTRY(pPacket) (PQUEUE_ENTRY)(pPacket) - -#ifdef CONFIG_5VT_ENHANCE -#define BRIDGE_TAG 0x35564252 /* depends on 5VT define in br_input.c */ -#endif - -#define GET_SG_LIST_FROM_PACKET(_p, _sc) rt_get_sg_list_from_packet(_p, _sc) - -#define RELEASE_NDIS_PACKET(_pAd, _pPacket, _Status) \ - RTMPFreeNdisPacket(_pAd, _pPacket) - -#define RELEASE_NDIS_PACKET_IRQ(_pAd, _pPacket, _Status) \ - RTMPFreeNdisPacketIRQ(_pAd, _pPacket) - -/* - * packet helper - * - convert internal rt packet to os packet or - * os packet to rt packet - */ -#define RTPKT_TO_OSPKT(_p) ((struct sk_buff *)(_p)) -#define OSPKT_TO_RTPKT(_p) ((PNDIS_PACKET)(_p)) - -#define GET_OS_PKT_DATAPTR(_pkt) (RTPKT_TO_OSPKT(_pkt)->data) -#define SET_OS_PKT_DATAPTR(_pkt, _dataPtr) \ - ((RTPKT_TO_OSPKT(_pkt)->data) = (_dataPtr)) - -#define GET_OS_PKT_LEN(_pkt) (RTPKT_TO_OSPKT(_pkt)->len) -#define SET_OS_PKT_LEN(_pkt, _len) ((RTPKT_TO_OSPKT(_pkt)->len) = (_len)) - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)) -#define GET_OS_PKT_DATATAIL(_pkt) skb_tail_pointer(RTPKT_TO_OSPKT(_pkt)) -#define SET_OS_PKT_DATATAIL(_pkt, _len) \ - skb_set_tail_pointer(RTPKT_TO_OSPKT(_pkt), _len) -#else -#define GET_OS_PKT_DATATAIL(_pkt) (RTPKT_TO_OSPKT(_pkt)->tail) -#define SET_OS_PKT_DATATAIL(_pkt, _len) \ - ((RTPKT_TO_OSPKT(_pkt))->tail) = \ - (PUCHAR)(((RTPKT_TO_OSPKT(_pkt))->data) + (_len)) -#endif - -#define GET_OS_PKT_HEAD(_pkt) (RTPKT_TO_OSPKT(_pkt)->head) - -#define GET_OS_PKT_END(_pkt) (RTPKT_TO_OSPKT(_pkt)->end) - -#define GET_OS_PKT_NETDEV(_pkt) (RTPKT_TO_OSPKT(_pkt)->dev) -#define SET_OS_PKT_NETDEV(_pkt, _pNetDev) \ - ((RTPKT_TO_OSPKT(_pkt)->dev) = (_pNetDev)) - -#define GET_OS_PKT_TYPE(_pkt) (RTPKT_TO_OSPKT(_pkt)) - -#define GET_OS_PKT_NEXT(_pkt) (RTPKT_TO_OSPKT(_pkt)->next) - -#define OS_PKT_CLONED(_pkt) skb_cloned(RTPKT_TO_OSPKT(_pkt)) -#define OS_PKT_COPY(_pkt, _newSkb) \ - do { \ - _newSkb = skb_copy(RTPKT_TO_OSPKT(_pkt), GFP_ATOMIC); \ - if (_newSkb != NULL) \ - MEM_DBG_PKT_ALLOC_INC(_newSkb); \ - } while (0) - -#define OS_PKT_TAIL_ADJUST(_pkt, _removedTagLen) \ - skb_trim(RTPKT_TO_OSPKT(_pkt), GET_OS_PKT_LEN(_pkt) - _removedTagLen) - -#define OS_PKT_HEAD_BUF_EXTEND(_pkt, _offset) \ - skb_push(RTPKT_TO_OSPKT(_pkt), _offset) - -#define OS_PKT_TAIL_BUF_EXTEND(_pkt, _Len) skb_put(RTPKT_TO_OSPKT(_pkt), _Len) - -#define OS_PKT_RESERVE(_pkt, _Len) skb_reserve(RTPKT_TO_OSPKT(_pkt), _Len) - -#define RTMP_OS_PKT_INIT(__pRxPacket, __pNetDev, __pData, __DataSize) \ - { \ - PNDIS_PACKET __pRxPkt; \ - __pRxPkt = RTPKT_TO_OSPKT(__pRxPacket); \ - SET_OS_PKT_NETDEV(__pRxPkt, __pNetDev); \ - SET_OS_PKT_DATAPTR(__pRxPkt, __pData); \ - SET_OS_PKT_LEN(__pRxPkt, __DataSize); \ - SET_OS_PKT_DATATAIL(__pRxPkt, __DataSize); \ - } - -#define OS_PKT_CLONE(_pAd, _pkt, _src, _flag) \ - do { \ - _src = skb_clone(RTPKT_TO_OSPKT(_pkt), _flag); \ - if (_src != NULL) \ - MEM_DBG_PKT_ALLOC_INC(_src); \ - } while (0) - -#define get_unaligned32 get_unaligned -#define get_unalignedlong get_unaligned - -#define OS_NTOHS(_Val) (ntohs((_Val))) -#define OS_HTONS(_Val) (htons((_Val))) -#define OS_NTOHL(_Val) (ntohl((_Val))) -#define OS_HTONL(_Val) (htonl((_Val))) - -#define CB_OFF 10 -#define CB_LEN 36 -#define GET_OS_PKT_CB(_p) (RTPKT_TO_OSPKT(_p)->cb) -#define PACKET_CB(_p, _offset) ((RTPKT_TO_OSPKT(_p)->cb[CB_OFF + (_offset)])) - -/*********************************************************************************** - * Other function prototypes definitions - ***********************************************************************************/ - -#ifdef CONFIG_FAST_NAT_SUPPORT -extern int (*ra_sw_nat_hook_tx)(struct sk_buff *skb, int gmac_no); -extern int (*ra_sw_nat_hook_rx)(struct sk_buff *skb); -extern void (*ppe_dev_register_hook)(VOID *dev); -extern void (*ppe_dev_unregister_hook)(VOID *dev); - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -extern int (*wf_ra_sw_nat_hook_tx_bkup)(struct sk_buff *skb, int gmac_no); -extern int (*wf_ra_sw_nat_hook_rx_bkup)(struct sk_buff *skb); -#endif -#endif /*CONFIG_FAST_NAT_SUPPORT*/ - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -struct APCLI_BRIDGE_LEARNING_MAPPING_STRUCT { - struct net_device *rcvd_net_dev; - unsigned char src_addr[ETH_ALEN]; - unsigned char entry_from; - struct APCLI_BRIDGE_LEARNING_MAPPING_STRUCT *pBefore; - struct APCLI_BRIDGE_LEARNING_MAPPING_STRUCT *pNext; -}; - -struct APCLI_BRIDGE_LEARNING_MAPPING_MAP { - struct APCLI_BRIDGE_LEARNING_MAPPING_STRUCT *pHead; - struct APCLI_BRIDGE_LEARNING_MAPPING_STRUCT *pTail; - unsigned int entry_num; -}; - -extern int (*wf_fwd_tx_hook)(struct sk_buff *skb); -extern int (*wf_fwd_rx_hook)(struct sk_buff *skb); -extern unsigned char (*wf_fwd_entry_insert_hook)(struct net_device *src, - struct net_device *dest, - void *adapter); -extern unsigned char (*wf_fwd_entry_delete_hook)(struct net_device *src, - struct net_device *dest, - unsigned char link_down); - -extern void (*wf_fwd_check_device_hook)(struct net_device *net_dev, - signed int type, signed int mbss_idx, - unsigned char channel, - unsigned char link); - -extern void (*wf_fwd_set_cb_num)(unsigned int band_cb_num, - unsigned int receive_cb_num); -extern bool (*wf_fwd_check_active_hook)(void); - -extern void (*wf_fwd_get_rep_hook)(unsigned char idx); -extern void (*wf_fwd_pro_active_hook)(void); -extern void (*wf_fwd_pro_halt_hook)(void); -extern void (*wf_fwd_pro_enabled_hook)(void); -extern void (*wf_fwd_pro_disabled_hook)(void); -extern void (*wf_fwd_access_schedule_active_hook)(void); -extern void (*wf_fwd_access_schedule_halt_hook)(void); -extern void (*wf_fwd_hijack_active_hook)(void); -extern void (*wf_fwd_hijack_halt_hook)(void); -extern void (*wf_fwd_bpdu_active_hook)(void); -extern void (*wf_fwd_bpdu_halt_hook)(void); -extern void (*wf_fwd_show_entry_hook)(void); -extern void (*wf_fwd_delete_entry_hook)(unsigned char idx); -extern void (*packet_source_show_entry_hook)(void); -extern void (*packet_source_delete_entry_hook)(unsigned char idx); -extern void (*wf_fwd_feedback_map_table)(void *adapter, void *peer, - void *opp_peer, void *oth_peer); -extern void (*wf_fwd_probe_adapter)(void *adapter); -extern void (*wf_fwd_probe_apcli_device_hook)(void *device); -extern void (*wf_fwd_insert_bridge_mapping_hook)(struct sk_buff *skb); -extern void (*wf_fwd_insert_repeater_mapping_hook)(void *apcli_device, - void *lock, - void *cli_mapping, - void *map_mapping, - void *ifAddr_mapping); -extern int (*wf_fwd_search_mapping_table_hook)( - struct sk_buff *skb, - struct APCLI_BRIDGE_LEARNING_MAPPING_STRUCT **tbl_entry); -extern void (*wf_fwd_delete_entry_inform_hook)(unsigned char *addr); -extern bool (*wf_fwd_needed_hook)(void); -extern void (*wf_fwd_add_entry_inform_hook)(unsigned char *addr); -extern void (*wf_fwd_set_bridge_hook)(unsigned char *bridge_intf_name, - unsigned int len); - -extern void (*wf_fwd_probe_dev_hook)(struct net_device *net_dev_p); -#endif /* CONFIG_WIFI_PKT_FWD */ - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -struct wifi_fwd_func_table { - int (*wf_fwd_rx_hook)(struct sk_buff *skb); - int (*wf_fwd_tx_hook)(struct sk_buff *skb); - unsigned char (*wf_fwd_entry_insert_hook)(struct net_device *src, - struct net_device *dest, - void *adapter); - unsigned char (*wf_fwd_entry_delete_hook)(struct net_device *src, - struct net_device *dest, - unsigned char link_down); - void (*wf_fwd_set_cb_num)(unsigned int band_cb_num, - unsigned int receive_cb_num); - void (*wf_fwd_set_debug_level_hook)(unsigned char level); - bool (*wf_fwd_check_active_hook)(void); - void (*wf_fwd_get_rep_hook)(unsigned char idx); - void (*wf_fwd_pro_active_hook)(void); - void (*wf_fwd_pro_halt_hook)(void); - void (*wf_fwd_pro_enabled_hook)(void); - void (*wf_fwd_pro_disabled_hook)(void); - void (*wf_fwd_access_schedule_active_hook)(void); - void (*wf_fwd_access_schedule_halt_hook)(void); - void (*wf_fwd_hijack_active_hook)(void); - void (*wf_fwd_hijack_halt_hook)(void); - void (*wf_fwd_bpdu_active_hook)(void); - void (*wf_fwd_bpdu_halt_hook)(void); - void (*wf_fwd_show_entry_hook)(void); - bool (*wf_fwd_needed_hook)(void); - void (*wf_fwd_delete_entry_hook)(unsigned char idx); - void (*packet_source_show_entry_hook)(void); - void (*packet_source_delete_entry_hook)(unsigned char idx); - void (*wf_fwd_feedback_map_table)(void *adapter, void **peer, - void **opp_peer, void **oth_peer); - void (*wf_fwd_probe_adapter)(void *adapter); - void (*wf_fwd_remove_adapter)(void *adapter); - void (*wf_fwd_insert_repeater_mapping_hook)(void *adapter, void *lock, - void *cli_mapping, - void *map_mapping, - void *ifAddr_mapping); - void (*wf_fwd_delete_repeater_mapping)(void *apcli_device); - void (*wf_fwd_insert_bridge_mapping_hook)(struct sk_buff *skb); - int (*wf_fwd_search_mapping_table_hook)( - struct sk_buff *skb, - struct APCLI_BRIDGE_LEARNING_MAPPING_STRUCT **tbl_entry); - void (*wf_fwd_delete_entry_inform_hook)(unsigned char *addr); - void (*wf_fwd_check_device_hook)(struct net_device *net_dev, - signed int type, signed int mbss_idx, - unsigned char channel, - unsigned char link); - void (*wf_fwd_add_entry_inform_hook)(unsigned char *addr); - void (*wf_fwd_debug_level_hook)(unsigned char level); - void (*wf_fwd_set_easy_setup_mode)(unsigned int easy_setup_mode); - void (*wf_fwd_set_bridge_hook)(unsigned char *bridge_intf_name, - unsigned int len); -}; - -#endif - -void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time); -int rt28xx_packet_xmit(VOID *skb); - -#ifdef RTMP_RBUS_SUPPORT -#ifndef CONFIG_RALINK_FLASH_API -void FlashWrite(UCHAR *p, ULONG a, ULONG b); -void FlashRead(UCHAR *p, ULONG a, ULONG b); -#endif /* CONFIG_RALINK_FLASH_API */ - -int wl_proc_init(void); -int wl_proc_exit(void); - -#if defined(CONFIG_RA_CLASSIFIER) || defined(CONFIG_RA_CLASSIFIER_MODULE) -extern volatile unsigned long classifier_cur_cycle; -extern int (*ra_classifier_hook_rx)(struct sk_buff *skb, unsigned long cycle); -#endif /* defined(CONFIG_RA_CLASSIFIER)||defined(CONFIG_RA_CLASSIFIER_MODULE) */ -#endif /* RTMP_RBUS_SUPPORT */ - -#if LINUX_VERSION_CODE <= 0x20402 /* Red Hat 7.1 */ -struct net_device *alloc_netdev(int sizeof_priv, const char *mask, - void (*setup)(struct net_device *)); -#endif /* LINUX_VERSION_CODE */ - -#ifdef RTMP_MAC_PCI -/* function declarations */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) -#define IRQ_HANDLE_TYPE irqreturn_t -#else -#define IRQ_HANDLE_TYPE void -#endif - -IRQ_HANDLE_TYPE -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) -rt2860_interrupt(int irq, void *dev_instance); -#else -rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs); -#endif - -#endif /* RTMP_MAC_PCI */ - -INT rt28xx_ioctl(PNET_DEV net_dev, struct ifreq *rq, INT cmd); -int rt28xx_send_packets(struct sk_buff *skb, struct net_device *ndev); - -extern int ra_mtd_write(int num, loff_t to, size_t len, const u_char *buf); -extern int ra_mtd_read(int num, loff_t from, size_t len, u_char *buf); - -#define GET_PAD_FROM_NET_DEV(_pAd, _net_dev) \ - (_pAd = RTMP_OS_NETDEV_GET_PRIV(_net_dev)) -#define GET_WDEV_FROM_NET_DEV(_wdev, _net_dev) \ - (_wdev = RTMP_OS_NETDEV_GET_WDEV(_net_dev)) - -/*#ifdef RTMP_USB_SUPPORT */ -/****************************************************************************** - - USB related definitions - -******************************************************************************/ - -#define RTMP_USB_PKT_COPY(__pNetDev, __pNetPkt, __Len, __pData) \ - do { \ - memcpy(skb_put(__pNetPkt, __Len), __pData, __Len); \ - GET_OS_PKT_NETDEV(__pNetPkt) = __pNetDev; \ - } while (0) - -typedef struct usb_device_id USB_DEVICE_ID; - -#define BULKAGGRE_SIZE 100 - -#ifndef OS_ABL_SUPPORT -#define RTUSB_ALLOC_URB(iso) usb_alloc_urb(iso, GFP_ATOMIC) -#ifdef USB_IOT_WORKAROUND2 -void usb_iot_add_padding(struct urb *urb, UINT8 *buf, ra_dma_addr_t dma); -#endif -#define RTUSB_SUBMIT_URB(pUrb) usb_submit_urb(pUrb, GFP_ATOMIC) -#define RTUSB_URB_ALLOC_BUFFER(_dev, _size, _dma) \ - usb_alloc_coherent(_dev, _size, GFP_ATOMIC, _dma) -#define RTUSB_URB_FREE_BUFFER(_dev, _size, _addr, _dma) \ - usb_free_coherent(_dev, _size, _addr, _dma) - -#define RTUSB_FILL_BULK_URB(_urb, _dev, _pipe, _buffer, _buffer_len, \ - _complete_fn, _context) \ - usb_fill_bulk_urb(_urb, _dev, _pipe, _buffer, _buffer_len, \ - _complete_fn, _context) -#else - -#define RTUSB_ALLOC_URB(iso) rausb_alloc_urb(iso) -#define RTUSB_SUBMIT_URB(pUrb) rausb_submit_urb(pUrb) -#define RTUSB_URB_ALLOC_BUFFER rausb_buffer_alloc -#define RTUSB_URB_FREE_BUFFER rausb_buffer_free -#endif /* OS_ABL_SUPPORT */ - -#ifndef OS_ABL_SUPPORT -#define RTUSB_FREE_URB(pUrb) usb_free_urb(pUrb) -#else -#define RTUSB_FREE_URB(pUrb) rausb_free_urb(pUrb) -#endif /* OS_ABL_SUPPORT */ - -/* unlink urb */ -#ifndef OS_ABL_SUPPORT -#define RTUSB_UNLINK_URB(pUrb) usb_kill_urb(pUrb) -#else -#define RTUSB_UNLINK_URB(pUrb) rausb_kill_urb(pUrb) -#endif /* OS_ABL_SUPPORT */ - -/* Prototypes of completion funuc. */ -#define RtmpUsbBulkOutDataPacketComplete RTUSBBulkOutDataPacketComplete -#define RtmpUsbBulkOutMLMEPacketComplete RTUSBBulkOutMLMEPacketComplete -#define RtmpUsbBulkOutNullFrameComplete RTUSBBulkOutNullFrameComplete -#define RtmpUsbBulkOutRTSFrameComplete RTUSBBulkOutRTSFrameComplete -#define RtmpUsbBulkOutPsPollComplete RTUSBBulkOutPsPollComplete -#define RtmpUsbBulkRxComplete RTUSBBulkRxComplete -#define RtmpUsbBulkCmdRspEventComplete RTUSBBulkCmdRspEventComplete -#ifdef MT_MAC -#define RtmpUsbBulkOutBCNPacketComplete RTUSBBulkOutBCNPacketComplete -#endif - -#define RTUSBBulkOutDataPacketComplete(Status, pURB, pt_regs) \ - RTUSBBulkOutDataPacketComplete(pURB) -#define RTUSBBulkOutMLMEPacketComplete(Status, pURB, pt_regs) \ - RTUSBBulkOutMLMEPacketComplete(pURB) -#define RTUSBBulkOutNullFrameComplete(Status, pURB, pt_regs) \ - RTUSBBulkOutNullFrameComplete(pURB) -#define RTUSBBulkOutRTSFrameComplete(Status, pURB, pt_regs) \ - RTUSBBulkOutRTSFrameComplete(pURB) -#define RTUSBBulkOutPsPollComplete(Status, pURB, pt_regs) \ - RTUSBBulkOutPsPollComplete(pURB) -#define RTUSBBulkRxComplete(Status, pURB, pt_regs) RTUSBBulkRxComplete(pURB) -#define RTUSBBulkCmdRspEventComplete(Status, pURB, pt_regs) \ - RTUSBBulkCmdRspEventComplete(pURB) -#ifdef MT_MAC -#define RTUSBBulkOutBCNPacketComplete(Status, pURB, pt_regs) \ - RTUSBBulkOutBCNPacketComplete(pURB) -#endif - -/*extern void dump_urb(struct urb *purb); */ - -#define InterlockedIncrement atomic_inc -#define NdisInterlockedIncrement atomic_inc -#define InterlockedDecrement atomic_dec -#define NdisInterlockedDecrement atomic_dec -#define InterlockedExchange atomic_set - -typedef void USBHST_STATUS; -typedef INT32 URBCompleteStatus; -typedef struct pt_regs pregs; - -USBHST_STATUS RTUSBBulkOutDataPacketComplete(URBCompleteStatus Status, - purbb_t pURB, pregs *pt_regs); -USBHST_STATUS RTUSBBulkOutMLMEPacketComplete(URBCompleteStatus Status, - purbb_t pURB, pregs *pt_regs); -USBHST_STATUS RTUSBBulkOutNullFrameComplete(URBCompleteStatus Status, - purbb_t pURB, pregs *pt_regs); -USBHST_STATUS RTUSBBulkOutRTSFrameComplete(URBCompleteStatus Status, - purbb_t pURB, pregs *pt_regs); -USBHST_STATUS RTUSBBulkOutPsPollComplete(URBCompleteStatus Status, purbb_t pURB, - pregs *pt_regs); -USBHST_STATUS RTUSBBulkRxComplete(URBCompleteStatus Status, purbb_t pURB, - pregs *pt_regs); -USBHST_STATUS RTUSBBulkCmdRspEventComplete(URBCompleteStatus Status, - purbb_t pURB, pregs *pt_regs); -#ifdef MT_MAC -USBHST_STATUS RTUSBBulkOutBCNPacketComplete(URBCompleteStatus Status, - purbb_t pURB, pregs *pt_regs); -#endif - -/* Fill Bulk URB Macro */ - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) -#define RTUSB_FILL_TX_BULK_URB(pUrb, pUsb_Dev, uEndpointAddress, pTransferBuf, \ - BufSize, Complete, pContext, TransferDma) \ - do { \ - usb_fill_bulk_urb(pUrb, pUsb_Dev, \ - usb_sndbulkpipe(pUsb_Dev, uEndpointAddress), \ - pTransferBuf, BufSize, Complete, pContext); \ - pUrb->transfer_dma = TransferDma; \ - pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; \ - } while (0) - -#define RTUSB_FILL_HTTX_BULK_URB(pUrb, pUsb_Dev, uEndpointAddress, \ - pTransferBuf, BufSize, Complete, pContext, \ - TransferDma) \ - do { \ - usb_fill_bulk_urb(pUrb, pUsb_Dev, \ - usb_sndbulkpipe(pUsb_Dev, uEndpointAddress), \ - pTransferBuf, BufSize, Complete, pContext); \ - pUrb->transfer_dma = TransferDma; \ - pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; \ - } while (0) - -#define RTUSB_FILL_RX_BULK_URB(pUrb, pUsb_Dev, uEndpointAddress, pTransferBuf, \ - BufSize, Complete, pContext, TransferDma) \ - do { \ - usb_fill_bulk_urb(pUrb, pUsb_Dev, \ - usb_rcvbulkpipe(pUsb_Dev, uEndpointAddress), \ - pTransferBuf, BufSize, Complete, pContext); \ - pUrb->transfer_dma = TransferDma; \ - pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; \ - } while (0) -/* pRxContext->data_dma + pAd->NextRxBulkInPosition; */ - -#define RTUSB_URB_DMA_MAPPING(pUrb) \ - { \ - pUrb->transfer_dma = 0; \ - pUrb->transfer_flags &= (~URB_NO_TRANSFER_DMA_MAP); \ - } - -#else -#define RTUSB_FILL_TX_BULK_URB(pUrb, pUsb_Dev, uEndpointAddress, pTransferBuf, \ - BufSize, Complete, pContext, TransferDma) \ - FILL_BULK_URB(pUrb, pUsb_Dev, \ - usb_sndbulkpipe(pUsb_Dev, uEndpointAddress), \ - pTransferBuf, BufSize, Complete, pContext) - -#define RTUSB_FILL_HTTX_BULK_URB(pUrb, pUsb_Dev, uEndpointAddress, \ - pTransferBuf, BufSize, Complete, pContext, \ - TransferDma) \ - FILL_BULK_URB(pUrb, pUsb_Dev, \ - usb_sndbulkpipe(pUsb_Dev, uEndpointAddress), \ - pTransferBuf, BufSize, Complete, pContext) - -#define RTUSB_FILL_RX_BULK_URB(pUrb, pUsb_Dev, uEndpointAddress, pTransferBuf, \ - BufSize, Complete, pContext, TransferDma) \ - FILL_BULK_URB(pUrb, pUsb_Dev, \ - usb_rcvbulkpipe(pUsb_Dev, uEndpointAddress), \ - pTransferBuf, BufSize, Complete, pContext) - -#define RTUSB_URB_DMA_MAPPING(pUrb) -#endif - -#define RTUSB_CONTROL_MSG(pUsb_Dev, uEndpointAddress, Request, RequestType, \ - Value, Index, tmpBuf, TransferBufferLength, timeout, \ - ret) \ - do { \ - if ((RequestType == DEVICE_VENDOR_REQUEST_OUT) || \ - (RequestType == DEVICE_CLASS_REQUEST_OUT)) \ - ret = USB_CONTROL_MSG( \ - pUsb_Dev, \ - usb_sndctrlpipe(pUsb_Dev, uEndpointAddress), \ - Request, RequestType, Value, Index, tmpBuf, \ - TransferBufferLength, timeout); \ - else if (RequestType == DEVICE_VENDOR_REQUEST_IN) \ - ret = USB_CONTROL_MSG( \ - pUsb_Dev, \ - usb_rcvctrlpipe(pUsb_Dev, uEndpointAddress), \ - Request, RequestType, Value, Index, tmpBuf, \ - TransferBufferLength, timeout); \ - else { \ - MTWF_LOG(DBG_CAT_HIF, CATHIF_USB, DBG_LVL_ERROR, \ - ("vendor request direction is failed\n")); \ - ret = -1; \ - } \ - } while (0) - -#define rtusb_urb_context context -#define rtusb_urb_status status -#define rtusb_urb_transfer_len transfer_buffer_length -#define rtusb_urb_actual_len actual_length - -#define RTMP_OS_USB_CONTEXT_GET(__pURB) ((__pURB)->rtusb_urb_context) -#define RTMP_OS_USB_STATUS_GET(__pURB) ((__pURB)->rtusb_urb_status) -#define RTMP_OS_USB_TRANSFER_LEN_GET(__pURB) ((__pURB)->rtusb_urb_transfer_len) -#define RTMP_OS_USB_ACTUAL_LEN_GET(__pURB) ((__pURB)->rtusb_urb_actual_len) - -#ifndef OS_ABL_SUPPORT -#define USB_CONTROL_MSG usb_control_msg - -#else - -#define USB_CONTROL_MSG rausb_control_msg - -/*extern int rausb_register(struct usb_driver * new_driver); */ -/*extern void rausb_deregister(struct usb_driver * driver); */ - -extern struct urb *rausb_alloc_urb(int iso_packets); -extern void rausb_free_urb(VOID *urb); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) -extern void rausb_put_dev(VOID *dev); -extern struct usb_device *rausb_get_dev(VOID *dev); -#endif /* LINUX_VERSION_CODE */ - -extern int rausb_submit_urb(VOID *urb); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) -#ifndef gfp_t -#define gfp_t INT32 -#endif /* gfp_t */ - -extern void *rausb_buffer_alloc(VOID *dev, size_t size, ra_dma_addr_t *dma); -extern void rausb_buffer_free(VOID *dev, size_t size, void *addr, - ra_dma_addr_t dma); -#endif /* LINUX_VERSION_CODE */ - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 7) -extern void rausb_kill_urb(VOID *urb); -#endif /* LINUX_VERSION_CODE */ - -extern int rausb_control_msg(VOID *dev, unsigned int pipe, __u8 request, - __u8 requesttype, __u16 value, __u16 index, - void *data, __u16 size, int timeout); - -#endif /* OS_ABL_SUPPORT */ - -/*#endif // RTMP_USB_SUPPORT */ - -#ifdef CONFIG_ATE -/****************************************************************************** - - ATE related definitions - -******************************************************************************/ -#define ate_print printk -#ifdef RTMP_MAC_PCI -#ifdef CONFIG_AP_SUPPORT -#define EEPROM_BIN_FILE_NAME "/etc/Wireless/RT2860AP/e2p.bin" -#endif /* CONFIG_AP_SUPPORT */ -#endif /* RTMP_MAC_PCI */ - -#endif /* CONFIG_ATE */ - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31) -INT RtmpOSNetDevOpsAlloc(IN PVOID *pNetDevOps); -#endif - -#define RTMP_OS_MAX_SCAN_DATA_GET() IW_SCAN_MAX_DATA - -#include "os/rt_os.h" - -#ifdef MULTI_INF_SUPPORT -#ifdef RTMP_PCI_SUPPORT -int __init rt_pci_init_module(void); -void __exit rt_pci_cleanup_module(void); -#endif /* RTMP_PCI_SUPPORT */ - -#ifdef RTMP_RBUS_SUPPORT -int __init wbsys_module_init(void); -VOID __exit wbsys_module_exit(void); -#endif /* RTMP_RBUS_SUPPORT */ - -int multi_inf_adapt_reg(VOID *pAd); - -int multi_inf_adapt_unreg(VOID *pAd); - -int multi_inf_get_count(void); - -int multi_inf_get_idx(VOID *pAd); -#ifdef INTELP6_SUPPORT -struct pci_dev *rtmp_get_pci_dev(void *pAd); -#endif -#endif /* MULTI_INF_SUPPORT */ - -struct device *rtmp_get_dev(void *ad); - -#define RA_WEXT 0 -#define RA_NETLINK 1 - -#ifdef FW_DUMP_SUPPORT -BOOLEAN FWDumpProcInit(VOID *pAd); -BOOLEAN FWDumpProcCreate(VOID *pAd, PCHAR suffix); -VOID FWDumpProcRemove(VOID *pAd); -INT os_set_fwdump_path(VOID *pAd, VOID *arg); -#define RTMP_OS_FWDUMP_PROCINIT(ad) FWDumpProcInit(ad) -#define RTMP_OS_FWDUMP_PROCCREATE(ad, _suffix) FWDumpProcCreate(ad, _suffix) -#define RTMP_OS_FWDUMP_PROCREMOVE(ad) FWDumpProcRemove(ad) -#define RTMP_OS_FWDUMP_SETPATH(ad, ar) os_set_fwdump_path(ad, ar) -#endif - -#define OS_TRACE __builtin_return_address(0) - -typedef struct kref os_kref; - -#ifdef DBG_STARVATION -#define STARV_ENTRY_SIZE 2000 - -struct starv_log_entry; -struct starv_dbg; -struct starv_dbg_block; - -struct starv_dbg { - unsigned int msec; - unsigned long start_jiffies; - unsigned long end_jiffies; - struct starv_dbg_block *block; -}; - -struct starv_dbg_block { - char name[32]; - unsigned int timeout; - struct starv_log *ctrl; - void (*timeout_fn)(struct starv_dbg *starv, - struct starv_log_entry *entry); - void (*leave_fn)(struct starv_dbg *starv); - void (*entry_fn)(struct starv_dbg *starv); - void (*log_fn)(struct starv_log_entry *entry); - void *priv; - /*statistic*/ - unsigned int avg_dur; - unsigned int max_dur; - unsigned int min_dur; - unsigned int timeout_cnt; - unsigned int count; - DL_LIST log_head; - DL_LIST list; -}; - -struct starv_log_basic { - unsigned int id; - unsigned int qsize; -}; - -struct starv_log_entry { - void *log; - unsigned int duration; - struct starv_dbg_block *block; - DL_LIST list; -}; - -struct starv_log { - struct starv_log_entry pool[STARV_ENTRY_SIZE]; - DL_LIST free; - DL_LIST block_head; - NDIS_SPIN_LOCK lock; -}; - -VOID starv_dbg_init(struct starv_dbg_block *block, struct starv_dbg *starv); -VOID starv_dbg_get(struct starv_dbg *starv); -VOID starv_dbg_put(struct starv_dbg *starv); -VOID starv_log_dump(struct starv_log *ctrl); -INT starv_log_init(struct starv_log *ctrl); -VOID starv_log_exit(struct starv_log *ctrl); -INT register_starv_block(struct starv_dbg_block *bk); -VOID unregister_starv_block(struct starv_dbg_block *bk); -VOID starv_timeout_log_basic(struct starv_log_entry *entry); - -#endif /*DBG_STARVATION*/ - -#ifdef CONFIG_DBG_QDISC -void os_system_tx_queue_dump(PNET_DEV dev); -#endif /*CONFIG_DBG_QDISC*/ - -#endif /* __RT_LINUX_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux_cmm.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux_cmm.h deleted file mode 100644 index d8116bee62..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux_cmm.h +++ /dev/null @@ -1,430 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rt_linux_cmm.h - - Abstract: - Common OS structure/definition in LINUX whatever OS ABL. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#ifndef __RT_LINUX_CMM_H__ -#define __RT_LINUX_CMM_H__ - -typedef struct _OS_RSTRUC { - UCHAR *pContent; /* pointer to real structure content */ -} OS_RSTRUC; - -/* declare new chipset function here */ -#ifdef OS_ABL_FUNC_SUPPORT - -#define RTMP_DECLARE_DRV_OPS_FUNCTION(_func) \ - void Rtmp_Drv_Ops_##_func(VOID *__pDrvOps, VOID *__pNetOps, \ - VOID *__pPciConfig, VOID *__pUsbConfig) - -#define RTMP_BUILD_DRV_OPS_FUNCTION(_func) \ - void Rtmp_Drv_Ops_##_func(VOID *__pDrvOps, VOID *__pNetOps, \ - VOID *__pPciConfig, VOID *__pUsbConfig) \ - { \ - RtmpDrvOpsInit(__pDrvOps, __pNetOps, __pPciConfig, \ - __pUsbConfig); \ - } - -/* #define RTMP_GET_DRV_OPS_FUNCTION(_func) (PVOID)Rtmp_Drv_Ops_##_func */ - -#define RTMP_DRV_OPS_FUNCTION_BODY(_func) Rtmp_Drv_Ops_##_func - -#define xdef_to_str(s) def_to_str(s) -#define def_to_str(s) #s - -#ifdef RTMP_MAC_PCI -#ifdef MT_MAC -#define RTMP_DRV_NAME "mtpci" xdef_to_str(RT28xx_MODE) -#else -#define RTMP_DRV_NAME "rtpci" xdef_to_str(RT28xx_MODE) -#endif -RTMP_DECLARE_DRV_OPS_FUNCTION(pci); -#define RTMP_DRV_OPS_FUNCTION RTMP_DRV_OPS_FUNCTION_BODY(pci) -#define RTMP_BUILD_DRV_OPS_FUNCTION_BODY RTMP_BUILD_DRV_OPS_FUNCTION(pci) -#endif /* RTMP_MAC_PCI */ - -#else - -#ifdef MT_MAC -#if defined(CONFIG_SECOND_IF_MT7663E) || defined(CONFIG_FIRST_IF_MT7663E) -#define RTMP_DRV_NAME "mt76xx_drv" -#else -#define RTMP_DRV_NAME "mt_drv" -#endif -#else -#define RTMP_DRV_NAME "rt2860" -#endif /* MT_MAC */ - -#endif /* OS_ABL_FUNC_SUPPORT */ - -/***************************************************************************** - * OS task related data structure and definitions - ******************************************************************************/ -#define RTMP_OS_TASK_INIT(__pTask, __pTaskName, __pAd) \ - RtmpOSTaskInit(__pTask, __pTaskName, __pAd, &(__pAd)->RscTaskMemList, \ - &(__pAd)->RscSemMemList); - -#ifndef OS_ABL_FUNC_SUPPORT - -/* rt_linux.h */ -#define RTMP_OS_TASK OS_TASK - -#define RTMP_OS_TASK_GET(__pTask) (__pTask) - -#define RTMP_OS_TASK_DATA_GET(__pTask) ((__pTask)->priv) - -#define RTMP_OS_TASK_IS_KILLED(__pTask) ((__pTask)->task_killed) - -#define RTMP_OS_TASK_WAKE_UP(__pTask) WAKE_UP(pTask); - -#define RTMP_OS_TASK_LEGALITY(__pTask) ((__pTask)->kthread_task != NULL) - -#else - -/* rt_linux_cmm.h */ -#define RTMP_OS_TASK OS_RSTRUC - -#define RTMP_OS_TASK_GET(__pTask) ((OS_TASK *)((__pTask)->pContent)) - -#define RTMP_OS_TASK_DATA_GET(__pTask) RtmpOsTaskDataGet(__pTask) - -#define RTMP_OS_TASK_IS_KILLED(__pTask) RtmpOsTaskIsKilled(__pTask) - -#define RTMP_OS_TASK_WAKE_UP(__pTask) RtmpOsTaskWakeUp(pTask) - -#define RTMP_OS_TASK_LEGALITY(__pTask) RtmpOsCheckTaskLegality(__pTask) - -#endif /* OS_ABL_FUNC_SUPPORT */ - -/***************************************************************************** - * Timer related definitions and data structures. - ******************************************************************************/ -#ifndef OS_ABL_FUNC_SUPPORT - -/* rt_linux.h */ -#define NDIS_MINIPORT_TIMER OS_NDIS_MINIPORT_TIMER -#define RTMP_OS_TIMER OS_TIMER - -#define RTMP_OS_FREE_TIMER(__pAd) -#define RTMP_OS_FREE_LOCK(__pAd) -#define RTMP_OS_FREE_TASKLET(__pAd) -#define RTMP_OS_FREE_TASK(__pAd) -#define RTMP_OS_FREE_SEM(__pAd) -#define RTMP_OS_FREE_ATOMIC(__pAd) - -#else - -/* rt_linux_cmm.h */ -#define NDIS_MINIPORT_TIMER OS_RSTRUC -#define RTMP_OS_TIMER OS_RSTRUC - -#define RTMP_OS_FREE_TIMER(__pAd) -#define RTMP_OS_FREE_LOCK(__pAd) -#define RTMP_OS_FREE_TASKLET(__pAd) -#define RTMP_OS_FREE_TASK(__pAd) -#define RTMP_OS_FREE_SEM(__pAd) -#define RTMP_OS_FREE_ATOMIC(__pAd) - -#endif /* OS_ABL_FUNC_SUPPORT */ - -/***************************************************************************** - * OS file operation related data structure definitions - ******************************************************************************/ -/* if you add any new type, please also modify RtmpOSFileOpen() */ -#define RTMP_FILE_RDONLY 0x0F01 -#define RTMP_FILE_WRONLY 0x0F02 -#define RTMP_FILE_CREAT 0x0F03 -#define RTMP_FILE_TRUNC 0x0F04 - -#ifndef OS_ABL_FUNC_SUPPORT - -/* rt_linux.h */ -#define RTMP_OS_FS_INFO OS_FS_INFO - -#else - -/* rt_linux_cmm.h */ -#define RTMP_OS_FS_INFO OS_RSTRUC - -#endif /* OS_ABL_FUNC_SUPPORT */ - -/***************************************************************************** - * OS semaphore related data structure and definitions - ******************************************************************************/ - -#ifndef OS_ABL_FUNC_SUPPORT - -#define NDIS_SPIN_LOCK OS_NDIS_SPIN_LOCK -#define NdisAllocateSpinLock(__pReserved, __pLock) \ - OS_NdisAllocateSpinLock(__pLock) -#define NdisFreeSpinLock OS_NdisFreeSpinLock -#define RTMP_SEM_LOCK OS_SEM_LOCK -#define RTMP_SEM_UNLOCK OS_SEM_UNLOCK -#define RTMP_SPIN_LOCK OS_SPIN_LOCK -#define RTMP_SPIN_UNLOCK OS_SPIN_UNLOCK -#define RTMP_SPIN_LOCK_IRQ OS_SPIN_LOCK_IRQ -#define RTMP_SPIN_UNLOCK_IRQ OS_SPIN_UNLOCK_IRQ -#define RTMP_SPIN_LOCK_IRQSAVE OS_SPIN_LOCK_IRQSAVE -#define RTMP_SPIN_UNLOCK_IRQRESTORE OS_SPIN_UNLOCK_IRQRESTORE -#define RTMP_IRQ_LOCK OS_IRQ_LOCK -#define RTMP_IRQ_UNLOCK OS_IRQ_UNLOCK -#define RTMP_INT_LOCK OS_INT_LOCK -#define RTMP_INT_UNLOCK OS_INT_UNLOCK -#define RTMP_OS_SEM OS_SEM -#define RTMP_OS_ATOMIC atomic_t - -#define NdisAcquireSpinLock RTMP_SEM_LOCK -#define NdisReleaseSpinLock RTMP_SEM_UNLOCK - -#define RTMP_SEM_EVENT_INIT_LOCKED(__pSema, __pSemaList) \ - OS_SEM_EVENT_INIT_LOCKED(__pSema) -#define RTMP_SEM_EVENT_INIT(__pSema, __pSemaList) OS_SEM_EVENT_INIT(__pSema) -#define RTMP_SEM_EVENT_DESTORY OS_SEM_EVENT_DESTORY -#define RTMP_SEM_EVENT_WAIT OS_SEM_EVENT_WAIT -#define RTMP_SEM_EVENT_UP OS_SEM_EVENT_UP - -#define RtmpMLMEUp OS_RTMP_MlmeUp - -#define RTMP_OS_ATMOIC_INIT(__pAtomic, __pAtomicList) -#define RTMP_OS_ATMOIC_DESTROY(__pAtomic) -#define RTMP_THREAD_PID_KILL(__PID) KILL_THREAD_PID(__PID, SIGTERM, 1) - -#else - -#define NDIS_SPIN_LOCK OS_RSTRUC -#define RTMP_OS_SEM OS_RSTRUC -#define RTMP_OS_ATOMIC OS_RSTRUC - -#define RTMP_SEM_EVENT_INIT_LOCKED RtmpOsSemaInitLocked -#define RTMP_SEM_EVENT_INIT RtmpOsSemaInit -#define RTMP_SEM_EVENT_DESTORY RtmpOsSemaDestory -#define RTMP_SEM_EVENT_WAIT(_pSema, _status) \ - ((_status) = RtmpOsSemaWaitInterruptible((_pSema))) -#define RTMP_SEM_EVENT_UP RtmpOsSemaWakeUp - -#define RtmpMLMEUp RtmpOsMlmeUp - -#define RTMP_OS_ATMOIC_INIT RtmpOsAtomicInit -#define RTMP_OS_ATMOIC_DESTROY RtmpOsAtomicDestroy -#define RTMP_THREAD_PID_KILL RtmpThreadPidKill - -/* */ -/* spin_lock enhanced for Nested spin lock */ -/* */ -#define NdisAllocateSpinLock(__pAd, __pLock) \ - RtmpOsAllocateLock(__pLock, &(__pAd)->RscLockMemList) -#define NdisFreeSpinLock RtmpOsFreeSpinLock - -#define RTMP_SEM_LOCK(__lock) RtmpOsSpinLockBh(__lock); - -#define RTMP_SEM_UNLOCK(__lock) RtmpOsSpinUnLockBh(__lock); - -#define RTMP_SPIN_LOCK_IRQ RtmpOsSpinLockIrq -#define RTMP_SPIN_UNLOCK_IRQ RtmpOsSpinUnlockIrq -#define RTMP_SPIN_LOCK_IRQSAVE RtmpOsSpinLockIrqSave -#define RTMP_SPIN_UNLOCK_IRQRESTORE RtmpOsSpinUnlockIrqRestore - -/* sample, use semaphore lock to replace IRQ lock, 2007/11/15 */ -#ifdef MULTI_CORE_SUPPORT - -#define RTMP_IRQ_LOCK(__lock, __irqflags) \ - { \ - __irqflags = 0; \ - spin_lock_irqsave((spinlock_t *)(__lock), __irqflags); \ - } - -#define RTMP_IRQ_UNLOCK(__lock, __irqflag) \ - { \ - spin_unlock_irqrestore((spinlock_t *)(__lock), __irqflag); \ - } -#else -#define RTMP_IRQ_LOCK(__lock, __irqflags) \ - { \ - __irqflags = 0; \ - RtmpOsSpinLockBh(__lock); \ - } - -#define RTMP_IRQ_UNLOCK(__lock, __irqflag) \ - { \ - RtmpOsSpinUnLockBh(__lock); \ - } -#endif /* MULTI_CORE_SUPPORT // */ -#define RTMP_INT_LOCK(__Lock, __Flag) RtmpOsIntLock(__Lock, &__Flag) -#define RTMP_INT_UNLOCK RtmpOsIntUnLock - -#define NdisAcquireSpinLock RTMP_SEM_LOCK -#define NdisReleaseSpinLock RTMP_SEM_UNLOCK - -#endif /* OS_ABL_FUNC_SUPPORT */ - -/***************************************************************************** - * OS task related data structure and definitions - ******************************************************************************/ - -#ifndef OS_ABL_FUNC_SUPPORT - -/* rt_linux.h */ -#define RTMP_NET_TASK_STRUCT OS_NET_TASK_STRUCT -#define PRTMP_NET_TASK_STRUCT POS_NET_TASK_STRUCT - -typedef struct completion RTMP_OS_COMPLETION; - -#define RTMP_OS_INIT_COMPLETION(__pCompletion) init_completion(__pCompletion) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 74)) -#define RTMP_OS_REINIT_COMPLETION(__pCompletion) \ - reinit_completion(__pCompletion) -#else -#define RTMP_OS_REINIT_COMPLETION(__pCompletion) INIT_COMPLETION(*__pCompletion) -#endif -#define RTMP_OS_EXIT_COMPLETION(__pCompletion) complete(__pCompletion) - -#define RTMP_OS_COMPLETE(__pCompletion) complete(__pCompletion) - -#define RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(__pCompletion, __Timeout) \ - wait_for_completion_timeout(__pCompletion, __Timeout) - -#ifdef WORKQUEUE_BH -#define RTMP_OS_TASKLET_SCHE(__pTasklet) schedule_work(__pTasklet) -#define RTMP_OS_TASKLET_INIT(__pAd, __pTasklet, __pFunc, __Data) \ - INIT_WORK((struct work_struct *)__pTasklet, (work_func_t)__pFunc) -#define RTMP_OS_TASKLET_KILL(__pTasklet) cancel_work_sync(__pTasklet) -#else -#define RTMP_OS_TASKLET_SCHE(__pTasklet) tasklet_hi_schedule(__pTasklet) -#define RTMP_OS_TASKLET_INIT(__pAd, __pTasklet, __pFunc, __Data) \ - tasklet_init(__pTasklet, __pFunc, __Data) -#define RTMP_OS_TASKLET_KILL(__pTasklet) tasklet_kill(__pTasklet) -#endif /* WORKQUEUE_BH */ - -#define RTMP_NET_TASK_DATA_ASSIGN(__Tasklet, __Data) \ - ((__Tasklet)->data = (unsigned long)__Data) - -#else - -/* rt_linux_cmm.h */ -typedef OS_RSTRUC RTMP_NET_TASK_STRUCT; -typedef OS_RSTRUC *PRTMP_NET_TASK_STRUCT; -typedef OS_RSTRUC RTMP_OS_COMPLETION; -typedef OS_RSTRUC *PRTMP_OS_COMPLETION; - -#define RTMP_OS_INIT_COMPLETION(__pCompletion) \ - RtmpOsInitCompletion(__pCompletion) - -#define RTMP_OS_EXIT_COMPLETION(__pCompletion) \ - RtmpOsExitCompletion(__pCompletion) - -#define RTMP_OS_COMPLETE(__pCompletion) RtmpOsComplete(__pCompletion) - -#define RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(__pCompletion, __Timeout) \ - RtmpOsWaitForCompletionTimeout(__pCompletion, __Timeout) - -#define RTMP_OS_TASKLET_SCHE(__pTasklet) RtmpOsTaskletSche(__pTasklet) - -#define RTMP_OS_TASKLET_INIT(__pAd, __pTasklet, __pFunc, __Data) \ - RtmpOsTaskletInit(__pTasklet, __pFunc, __Data, \ - &(__pAd)->RscTaskletMemList) - -#define RTMP_OS_TASKLET_KILL(__pTasklet) RtmpOsTaskletKill(__pTasklet) - -#define RTMP_NET_TASK_DATA_ASSIGN(__pTasklet, __Data) \ - RtmpOsTaskletDataAssign(__pTasklet, __Data) - -#endif /* OS_ABL_FUNC_SUPPORT */ - -/***************************************************************************** - * OS definition related data structure and definitions - ******************************************************************************/ - -#ifdef OS_ABL_SUPPORT - -#define RTMP_USB_CONTROL_MSG_ENODEV -1 -#define RTMP_USB_CONTROL_MSG_FAIL -2 - -typedef struct __RTMP_PCI_CONFIG { - UINT32 ConfigVendorID; -} RTMP_PCI_CONFIG; - -typedef struct __RTMP_USB_CONFIG { - UINT32 Reserved; -} RTMP_USB_CONFIG; - -extern RTMP_PCI_CONFIG *pRtmpPciConfig; -extern RTMP_USB_CONFIG *pRtmpUsbConfig; - -#define RTMP_OS_PCI_VENDOR_ID pRtmpPciConfig->ConfigVendorID - -/* - Declare dma_addr_t here, can not define it in rt_drv.h - - If you define it in include/os/rt_drv.h, then the size in DRIVER module - will be 64-bit, but in UTIL/NET modules, it maybe 32-bit. - This will cause size mismatch problem when OS_ABL = yes. -*/ -/* - In big-endian & 32-bit DMA address platform, if you use long long to - record DMA address, when you call kernel function to set DMA address, - the address will be 0 because you need to do swap I think. - So if you sure your DMA address is 32-bit, do not use RTMP_DMA_ADDR_64. -*/ -#define ra_dma_addr_t unsigned long long - -#else - -#define RTMP_OS_PCI_VENDOR_ID PCI_VENDOR_ID -#define RTMP_OS_PCI_DEVICE_ID PCI_DEVICE_ID - -#define ra_dma_addr_t dma_addr_t - -#endif /* OS_ABL_SUPPORT */ - -#define PCI_MAP_SINGLE RtmpDrvPciMapSingle - -/*********************************************************************************** - * Others - ***********************************************************************************/ -#define APCLI_IF_UP_CHECK(pAd, ifidx) \ - (RtmpOSNetDevIsUp((pAd)->ApCfg.ApCliTab[(ifidx)].wdev.if_dev) == TRUE) - -#ifdef MEMORY_OPTIMIZATION -#define MGMT_RING_SIZE 32 -#else -#define MGMT_RING_SIZE 128 -#endif - -#ifdef MT_MAC -#define BCN_RING_SIZE 20 -#endif /* MT_MAC */ - -#define MAX_TX_PROCESS 512 -#define LOCAL_TXBUF_SIZE 2 - -#define CTL_RING_SIZE 128 - -#define RTMP_OS_NETDEV_SET_PRIV RtmpOsSetNetDevPriv -#define RTMP_OS_NETDEV_GET_PRIV RtmpOsGetNetDevPriv -#define RTMP_OS_NETDEV_SET_WDEV RtmpOsSetNetDevWdev -#define RTMP_OS_NETDEV_GET_WDEV RtmpOsGetNetDevWdev -#define RT_DEV_PRIV_FLAGS_GET RtmpDevPrivFlagsGet -#define RT_DEV_PRIV_FLAGS_SET RtmpDevPrivFlagsSet - -#endif /* __RT_LINUX_CMM_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux_txrx_hook.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux_txrx_hook.h deleted file mode 100644 index bfee29e310..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_linux_txrx_hook.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef _MT_WLAN_HOOK_H_ -#define _MT_WLAN_HOOK_H_ - -#include "rt_config.h" - -#define MT_WLAN_NAME_MAX 128 - -/*define hook point, if you want to add a new point, please define it in here*/ -typedef enum { - WLAN_HOOK_FIRST = 0, - WLAN_HOOK_HIF_INIT = WLAN_HOOK_FIRST, - WLAN_HOOK_HIF_EXIT, - WLAN_HOOK_PEER_LINKUP, - WLAN_HOOK_PEER_LINKDOWN, - WLAN_HOOK_TX, - WLAN_HOOK_SYS_UP, - WLAN_HOOK_SYS_DOWN, - WLAN_HOOK_ISR, - WLAN_HOOK_DMA_SET, - WLAN_HOOK_SER, - WLAN_HOOK_END -} WLAN_HOOK_PT; - -/*hook link list will handle the order depend on below priority in the same hook point. - 0: priority low ~ 100: priority high -*/ -typedef enum { - WLAN_HOOK_PRI_LOWEST = 0, - WLAN_HOOK_PRI_WOE = WLAN_HOOK_PRI_LOWEST, - WLAN_HOOK_PRI_HIGHEST = 100, -} WLAN_HOOK_PRI; - -struct mt_wlan_hook_ops { - struct _DL_LIST list; - const char name[MT_WLAN_NAME_MAX]; - unsigned int (*fun)(unsigned short hook, void *ad, void *priv); - unsigned short priority; - unsigned short hooks; -}; - -struct mt_wlan_hook_ctrl { - struct _DL_LIST hook_head; -}; - -void mt_wlan_hook_init(void); -int mt_wlan_hook_call(unsigned short hook, void *ad, void *priv); -int mt_wlan_hook_register(struct mt_wlan_hook_ops *ops); -int mt_wlan_hook_unregister(struct mt_wlan_hook_ops *ops); - -#endif /*_MT_WLAN_HOOK_H_*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_os.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_os.h deleted file mode 100644 index 6f1acfc7c0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_os.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rt_os.h - - Abstract: - Put all OS related definition/structure/MACRO here. - - Note: - Used in UTIL/NETIF module. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Name Date Modification logs -*/ - -#ifndef _RT_OS_H_ -#define _RT_OS_H_ - -#ifdef LINUX -#if WIRELESS_EXT <= 11 -#ifndef SIOCDEVPRIVATE -#define SIOCDEVPRIVATE 0x8BE0 -#endif -#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE -#endif -#endif /* LINUX */ - -#ifdef CONFIG_AP_SUPPORT -/* Ralink defined OIDs */ -#define RT_PRIV_IOCTL (SIOCIWFIRSTPRIV + 0x01) -#define RTPRIV_IOCTL_SET (SIOCIWFIRSTPRIV + 0x02) -#define RT_PRIV_IOCTL_EXT \ - (SIOCIWFIRSTPRIV + 0x0E) /* Sync. with RT61 (for wpa_supplicant) */ -#if defined(DBG) || (defined(BB_SOC) && defined(CONFIG_ATE)) -#define RTPRIV_IOCTL_BBP (SIOCIWFIRSTPRIV + 0x03) -#define RTPRIV_IOCTL_MAC (SIOCIWFIRSTPRIV + 0x05) - -#ifdef RTMP_RF_RW_SUPPORT -#define RTPRIV_IOCTL_RF (SIOCIWFIRSTPRIV + 0x13) -#endif /* RTMP_RF_RW_SUPPORT */ - -#endif /* defined(DBG) ||(defined(BB_SOC) && defined(CONFIG_ATE)) */ -#define RTPRIV_IOCTL_E2P (SIOCIWFIRSTPRIV + 0x07) - -#ifdef WCX_SUPPORT -#define MTPRIV_IOCTL_META_SET (SIOCIWFIRSTPRIV + 0x08) -#define MTPRIV_IOCTL_META_QUERY (SIOCIWFIRSTPRIV + 0x09) -#define MTPRIV_IOCTL_META_SET_EM (SIOCIWFIRSTPRIV + 0x0B) -#define RTPRIV_IOCTL_STATISTICS (SIOCIWFIRSTPRIV + 0x15) -#else -#define RTPRIV_IOCTL_ATE (SIOCIWFIRSTPRIV + 0x08) -#define RTPRIV_IOCTL_STATISTICS (SIOCIWFIRSTPRIV + 0x09) -#endif /* WCX_SUPPORT */ - -#define RTPRIV_IOCTL_ADD_PMKID_CACHE (SIOCIWFIRSTPRIV + 0x0A) -#define RTPRIV_IOCTL_RADIUS_DATA (SIOCIWFIRSTPRIV + 0x0C) -#define RTPRIV_IOCTL_GSITESURVEY (SIOCIWFIRSTPRIV + 0x0D) -#define RTPRIV_IOCTL_ADD_WPA_KEY (SIOCIWFIRSTPRIV + 0x0E) -#define RTPRIV_IOCTL_GET_MAC_TABLE (SIOCIWFIRSTPRIV + 0x0F) -#define RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT \ - (SIOCIWFIRSTPRIV + 0x1F) /* modified by Red@Ralink, 2009/09/30 */ -#define RTPRIV_IOCTL_STATIC_WEP_COPY (SIOCIWFIRSTPRIV + 0x10) - -#define RTPRIV_IOCTL_SHOW (SIOCIWFIRSTPRIV + 0x11) -#define RTPRIV_IOCTL_WSC_PROFILE (SIOCIWFIRSTPRIV + 0x12) -#define RTPRIV_IOCTL_QUERY_BATABLE (SIOCIWFIRSTPRIV + 0x16) -#define RTPRIV_IOCTL_SET_WSCOOB (SIOCIWFIRSTPRIV + 0x19) -#define RTPRIV_IOCTL_WSC_CALLBACK (SIOCIWFIRSTPRIV + 0x1A) -#define RTPRIV_IOCTL_RX_STATISTICS \ - (SIOCIWFIRSTPRIV + 0x1B) /* Get CMD ID is odd; Set CMD ID is even */ -#define MTPRIV_IOCTL_RD \ - (SIOCIWFIRSTPRIV + 0x17) /* modified by CT@MediaTek, 2017/04/11 */ -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef WIFI_DIAG -#define RTPRIV_IOCTL_GET_PROCESS_INFO (SIOCIWFIRSTPRIV + 0x1E) -#endif - -#define RTPRIV_IOCTL_GET_DRIVER_INFO (SIOCIWFIRSTPRIV + 0x1D) - -#ifdef DYNAMIC_VLAN_SUPPORT -#define RTPRIV_IOCTL_STA_VLAN (SIOCIWFIRSTPRIV + 0x1E) -#endif - -#ifdef HOSTAPD_11R_SUPPORT -#define RTPRIV_IOCTL_SET_FT_PARAM (SIOCIWFIRSTPRIV + 0x18) -#endif /* HOSTAPD_11R_SUPPORT */ - -#endif /* _RT_OS_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_win.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_win.h deleted file mode 100644 index 014d67358d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_win.h +++ /dev/null @@ -1,320 +0,0 @@ -/* - - -*/ - -#ifdef WIN_NDIS - -#define NIC_TAG ((ULONG)'0682') -#define NIC_DBG_STRING ("**RT28xx**") - -#define MlmeAllocateMemory(_pAd, _ppVA) \ - NdisAllocateMemoryWithTag(_ppVA, MGMT_DMA_BUFFER_SIZE, NIC_TAG) -#define MlmeFreeMemory(_pVA) NdisFreeMemory(_pVA, MGMT_DMA_BUFFER_SIZE, 0) - -#define RTMP_INC_REF(_A) NdisInterlockedIncrement(&(_A)->RefCount) -#define RTMP_DEC_REF(_A) \ - NdisInterlockedDecrement(&(_A)->RefCount); \ - ASSERT(_A->RefCount >= 0) -#define RTMP_GET_REF(_A) ((_A)->RefCount) - -#define RTMP_INC_RCV_REF(_A) ((_A)->RcvRefCount++) -#define RTMP_DEC_RCV_REF(_A) ((_A)->RcvRefCount--) -#define RTMP_GET_RCV_REF(_A) ((_A)->RcvRefCount) - -/*#define RTMP_INC_SEND_REF(_A) ((_A)->SendRefCount++) */ -/*#define RTMP_DEC_SEND_REF(_A) ((_A)->SendRefCount--) */ -/*#define RTMP_GET_SEND_REF(_A) ((_A)->SendRefCount) */ - -#define RTMP_OFFSET(field) ((UINT)FIELD_OFFSET(RTMP_ADAPTER, field)) -#define RTMP_SIZE(field) sizeof(((PRTMP_ADAPTER)0)->field) - -#define COMMON_CFG_OFFSET(field) \ - ((UINT)FIELD_OFFSET(RTMP_ADAPTER, CommonCfg) + \ - (UINT)FIELD_OFFSET(COMMON_CONFIG, field)) -#define STA_CFG_OFFSET(field) \ - ((UINT)FIELD_OFFSET(RTMP_ADAPTER, StaCfg) + \ - (UINT)FIELD_OFFSET(STA_ADMIN_CONFIG, field)) -#define AP_CFG_OFFSET(field) \ - ((UINT)FIELD_OFFSET(RTMP_ADAPTER, ApCfg) + \ - (UINT)FIELD_OFFSET(AP_ADMIN_CONFIG, field)) -#define COMMON_CFG_SIZE(field) sizeof(((PCOMMON_CONFIG)0)->field) -#define STA_CFG_SIZE(field) sizeof(((struct _STA_ADMIN_CONFIG *)0)->field) -#define AP_CFG_SIZE(field) sizeof(((struct _AP_ADMIN_CONFIG *)0)->field) - -#define INC_RING_INDEX(_idx, _RingSize) \ - { \ - (_idx)++; \ - if ((_idx) >= (_RingSize)) \ - _idx = 0; \ - } - -#if ME_98 -/* */ -/* Re-define NdisInitializeString. */ -/* Since the DDK NdisInitializeString is not support on Win9X */ -/* */ -#define NdisInitializeString(Destination, Source) \ - { \ - NDIS_PHYSICAL_ADDRESS phyaddr = { -1, -1 }; \ - PNDIS_STRING _D = (Destination); \ - UCHAR *_S = (Source); \ - WCHAR *_P; \ - _D->Length = (strlen(_S)) * sizeof(WCHAR); \ - _D->MaximumLength = _D->Length + sizeof(WCHAR); \ - NdisAllocateMemory((PVOID *)&(_D->Buffer), _D->MaximumLength, \ - 0, phyaddr); \ - _P = _D->Buffer; \ - while (*_S != '\0') { \ - *_P = (WCHAR)(*_S); \ - _S++; \ - _P++; \ - } \ - *_P = UNICODE_NULL; \ - } -#endif - -/* */ -/* NDIS Version definitions */ -/* */ -#ifdef NDIS51_MINIPORT -#define RTMP_NDIS_MAJOR_VERSION 5 -#define RTMP_NDIS_MINOR_VERSION 1 - -#define BEACON_LOST_TIME 4000 /* 2048 msec = 2 sec */ - -#endif - -/* */ -/* NDIS version in use by the NIC driver. */ -/* The high byte is the major version. The low byte is the minor version. */ -/* */ -#ifdef NDIS51_MINIPORT -#define NIC_DRIVER_VERSION 0x0501 -#else -#define NIC_DRIVER_VERSION 0x0500 -#endif - -/* */ -/* NDIS media type, current is ethernet, change if native wireless supported */ -/* */ -#define NIC_MEDIA_TYPE NdisMedium802_3 -#define NIC_PCI_HDR_LENGTH 0xe2 -#define NIC_MAX_PACKET_SIZE 2304 -#define NIC_HEADER_SIZE 14 -#define MAX_MAP_REGISTERS_NEEDED 32 -#define MIN_MAP_REGISTERS_NEEDED 2 /*Todo: should consider fragment issue. */ - -/* */ -/* interface type, we use PCI */ -/* */ -#define NIC_INTERFACE_TYPE NdisInterfacePci -#define NIC_INTERRUPT_MODE NdisInterruptLevelSensitive - -/* */ -/* buffer size passed in NdisMQueryAdapterResources */ -/* We should only need three adapter resources (IO, interrupt and memory), */ -/* Some devices get extra resources, so have room for 10 resources */ -/* UF_SIZE (sizeof(NDIS_RESOURCE_LIST) + (10*sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR))) */ - -#define NIC_RESOURCE_B /* */ -/* IO space length */ -/* */ -#define NIC_MAP_IOSPACE_LENGTH sizeof(CSR_STRUC) - -/* */ -/* MACRO for 32-bit PCI register read / write */ -/* */ -/* Usage : RTMP_IO_READ32( */ -/* PRTMP_ADAPTER pAd, */ -/* ULONG Register_Offset, */ -/* PULONG pValue) */ -/* */ -/* RTMP_IO_WRITE32( */ -/* PRTMP_ADAPTER pAd, */ -/* ULONG Register_Offset, */ -/* ULONG Value) */ -/* */ -#define RTMP_IO_READ32(_A, _R, _pV) \ - { \ - NdisReadRegisterUlong((PULONG)((_A)->CSRBaseAddress + (_R)), \ - (_pV)); \ - } -#define RTMP_IO_WRITE32(_A, _R, _V) \ - { \ - NdisWriteRegisterUlong((PULONG)((_A)->CSRBaseAddress + (_R)), \ - (_V)); \ - } -#define RTMP_IO_WRITE8(_A, _R, _V) \ - { \ - NdisWriteRegisterUchar((PUCHAR)((_A)->CSRBaseAddress + (_R)), \ - (_V)); \ - } -#define RTMP_IO_WRITE16(_A, _R, _V) \ - { \ - ULONG Val; \ - NdisWriteRegisterUshort((PSHORT)((_A)->CSRBaseAddress + (_R)), \ - (_V)); \ - } - -/* NOTE: 2004-12-1 John */ -/* check DDK NDIS_PACKET data structure and find out only MiniportReservedEx[0..7] can be used by our driver without */ -/* ambiguity. Fields after pPacket->MiniportReservedEx[8] may be used by other wrapper layer thus crashes the driver */ -/* */ -#define RTMP_GET_PACKET_MR(_p) (&(_p)->MiniportReservedEx[0]) - -/* b0-b3 as User Priority */ -#define RTMP_SET_PACKET_UP(_p, _prio) \ - ((_p)->MiniportReservedEx[sizeof(PVOID)] = \ - ((_p)->MiniportReservedEx[sizeof(PVOID)] & 0xf0) | (_prio)) -#define RTMP_GET_PACKET_UP(_p) ((_p)->MiniportReservedEx[sizeof(PVOID)] & 0x0f) - -/* b4-b7 as fragment # */ -#define RTMP_SET_PACKET_FRAGMENTS(_p, _num) \ - ((_p)->MiniportReservedEx[sizeof(PVOID)] = \ - ((_p)->MiniportReservedEx[sizeof(PVOID)] & 0x0f) | \ - (_num << 4)) -#define RTMP_GET_PACKET_FRAGMENTS(_p) \ - (((_p)->MiniportReservedEx[sizeof(PVOID)] & 0xf0) >> 4) - -/* 0x0 ~0x7f: TX to AP's own BSS which has the specified AID. if AID>127, set bit 7 in RTMP_SET_PACKET_EMACTAB too. */ -/*(this value also as MAC(on-chip WCID) table index) */ -/* 0x80~0xff: TX to a WDS link. b0~6: WDS index */ -#define RTMP_SET_PACKET_WCID(_p, _wcid) \ - ((_p)->MiniportReservedEx[sizeof(PVOID) + 1] = _wcid) -#define RTMP_GET_PACKET_WCID(_p) ((_p)->MiniportReservedEx[sizeof(PVOID) + 1]) - -/* 0xff: PKTSRC_NDIS, others: local TX buffer index. This value affects how to a packet */ -#define RTMP_SET_PACKET_SOURCE(_p, _pktsrc) \ - ((_p)->MiniportReservedEx[sizeof(PVOID) + 2] = _pktsrc) -#define RTMP_GET_PACKET_SOURCE(_p) ((_p)->MiniportReservedEx[sizeof(PVOID) + 2]) - -/* b0~2: RTS/CTS-to-self protection method */ -#define RTMP_SET_PACKET_RTS(_p, _num) \ - ((_p)->MiniportReservedEx[sizeof(PVOID) + 3] = \ - ((_p)->MiniportReservedEx[sizeof(PVOID) + 3] & 0xf8) | \ - (_num)) -#define RTMP_GET_PACKET_RTS(_p) \ - ((_p)->MiniportReservedEx[sizeof(PVOID) + 3] & 0x07) -/* b7: see RTMP_S(G)ET_PACKET_EMACTAB */ - -/* b3~7: TX rate index */ -#define RTMP_SET_PACKET_TXRATE(_p, _rate) \ - ((_p)->MiniportReservedEx[sizeof(PVOID) + 3] = \ - ((_p)->MiniportReservedEx[sizeof(PVOID) + 3] & 0x07) | \ - (_rate << 3)) -#define RTMP_GET_PACKET_TXRATE(_p) \ - (((_p)->MiniportReservedEx[sizeof(PVOID) + 3] & 0xf8) >> 3) - -/* value recorded inside pNdisPacket->MiniportReservedEx[x] via RTMP_SET_PACKET_SOURCE()/RTMP_GET_PACKET_SOURCE() */ -/* this value is used to decide how to release this NDIS packet - either release to NDIS layer or release */ -/* to driver's pre-allocated packet pool */ -/* 0xff: NDIS PACKET is pass from Windows NDIS layer */ -/* 0 ~ NUM_OF_PREALLOCATEDP_SHARED_MEMORY: NDIS PACKET is created internally */ -#define PKTSRC_NDIS 0xff - -#define SWITCH_PhyAB(_pAA, _pBB) \ - { \ - ULONG AABasePaHigh; \ - ULONG AABasePaLow; \ - ULONG BBBasePaHigh; \ - ULONG BBBasePaLow; \ - BBBasePaHigh = NdisGetPhysicalAddressHigh(_pBB); \ - BBBasePaLow = NdisGetPhysicalAddressLow(_pBB); \ - AABasePaHigh = NdisGetPhysicalAddressHigh(_pAA); \ - AABasePaLow = NdisGetPhysicalAddressLow(_pAA); \ - NdisSetPhysicalAddressHigh(_pAA, BBBasePaHigh); \ - NdisSetPhysicalAddressLow(_pAA, BBBasePaLow); \ - NdisSetPhysicalAddressHigh(_pBB, AABasePaHigh); \ - NdisSetPhysicalAddressLow(_pBB, AABasePaLow); \ - } - -/* NOTE: Has to copy 802.3 header to head of pData for compatibility */ -/* with older OS eariler than W2K */ -#define REPORT_ETHERNET_FRAME_TO_LLC(_pAd, _p8023hdr, _pData, _DataSize) \ - { \ - os_move_mem(_pData - LENGTH_802_3, _p8023hdr, LENGTH_802_3); \ - _pAd->pRxData = _pData; \ - NdisMEthIndicateReceive(_pAd->AdapterHandle, \ - (NDIS_HANDLE)_pAd, \ - (PVOID)(_pData - LENGTH_802_3), \ - LENGTH_802_3, (PVOID)_pData, \ - _DataSize, _DataSize); \ - NdisMEthIndicateReceiveComplete(_pAd->AdapterHandle); \ - _pAd->Counters8023.GoodReceives++; \ - } - -#define COPY_MAC_ADDR(Addr1, Addr2) ETH_COPY_NETWORK_ADDRESS((Addr1), (Addr2)) -#define RELEASE_NDIS_PACKET(_pAd, _pPacket, _Status) \ - { \ - if (RTMP_GET_PACKET_SOURCE(_pPacket) == PKTSRC_NDIS) { \ - NdisMSendComplete(_pAd->AdapterHandle, _pPacket, \ - _Status); \ - _pAd->RalinkCounters.PendingNdisPacketCount--; \ - } else \ - RTMPFreeNdisPacket(_pAd, _pPacket); \ - } - -/* */ -/* Registery definition */ -/* */ -typedef struct _RTMP_REG_ENTRY { - NDIS_STRING RegName; /* variable name text */ - BOOLEAN bRequired; /* 1 -> required, 0 -> optional */ - UCHAR Type; /* Field Type */ - UINT FieldOffset; /* offset to MP_ADAPTER field */ - UINT FieldSize; /* size (in bytes) of the field */ - UINT Default; /* default value to use */ - UINT Min; /* minimum value allowed */ - UINT Max; /* maximum value allowed */ -} RTMP_REG_ENTRY, *PRTMP_REG_ENTRY; - -/* Unify all delay routine by using NdisStallExecution */ -_inline VOID RtmpusecDelay(IN ULONG usec) -{ - ULONG i; - - for (i = 0; i < (usec / 50); i++) - NdisStallExecution(50); - - if (usec % 50) - NdisStallExecution(usec % 50); -} - -/* Modified by Wu Xi-Kun 4/21/2006 */ -typedef void (*TIMER_FUNCTION)(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); - -#define RTMP_GREKEYPeriodicExec GREKEYPeriodicExec -#define RTMP_CMTimerExec CMTimerExec -#define RTMP_APQuickResponeForRateUpExec APQuickResponeForRateUpExec - -typedef NDIS_MINIPORT_TIMER RTMP_OS_TIMER; - -/* */ -/* Miniport routines in rtmp_main.c */ -/* */ -NDIS_STATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, - IN PUNICODE_STRING pRegistryPath); - -extern char NIC_VENDOR_DESC[]; -extern int NIC_VENDOR_DESC_LEN; - -/* Increase TxTsc value for next transmission */ -/* When i==6, means TSC has done one full cycle, do re-keying stuff follow specs */ -/* Should send a special event microsoft defined to request re-key */ -#define INC_TX_TSC(_tsc) \ - { \ - int i = 0; \ - while (++_tsc[i] == 0x0) { \ - i++; \ - if (i == 6) \ - break; \ - } \ - } - -#define TRACE_MCU_CMD_INFO - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_wince.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_wince.h deleted file mode 100644 index 0818fd7cca..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/rt_wince.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2005, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wince.h - - Abstract: - WinCE generic portion header file - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Rory Chen 04-14-2005 created - -*/ -#ifndef __WINCE_H__ -#define __WINCE_H__ - -#ifdef UNDER_CE - -#include "giisr.h" -#include -#include - -#if DBG - -#define ZONE_ERROR_BIT 0 -#define ZONE_WARN_BIT 1 -#define ZONE_FUNCTION_BIT 2 -#define ZONE_INIT_BIT 3 -#define ZONE_INTR_BIT 4 -#define ZONE_RCV_BIT 5 -#define ZONE_XMIT_BIT 6 -#define ZONE_LINK_BIT 7 - -#define ZONE_ERROR_MASK (1 << ZONE_ERROR_BIT) -#define ZONE_WARN_MASK (1 << ZONE_WARN_BIT) -#define ZONE_FUNCTION_MASK (1 << ZONE_FUNCTION_BIT) -#define ZONE_INIT_MASK (1 << ZONE_INIT_BIT) -#define ZONE_INTR_MASK (1 << ZONE_INTR_BIT) -#define ZONE_RCV_MASK (1 << ZONE_RCV_BIT) -#define ZONE_XMIT_MASK (1 << ZONE_XMIT_BIT) -#define ZONE_LINK_MASK (1 << ZONE_LINK_BIT) - -#define ZONE_ERROR DEBUGZONE(ZONE_ERROR_BIT) -#define ZONE_WARN DEBUGZONE(ZONE_WARN_BIT) -#define ZONE_FUNCTION DEBUGZONE(ZONE_FUNCTION_BIT) -#define ZONE_INIT DEBUGZONE(ZONE_INIT_BIT) -#define ZONE_INTR DEBUGZONE(ZONE_INTR_BIT) -#define ZONE_RCV DEBUGZONE(ZONE_RCV_BIT) -#define ZONE_XMIT DEBUGZONE(ZONE_XMIT_BIT) -#define ZONE_LINK DEBUGZONE(ZONE_LINK_BIT) - -#endif /* DBG */ - -NDIS_STATUS LoadISR(IN PRTMP_ADAPTER pAd, - IN NDIS_HANDLE WrapperConfigurationContext); - -NDIS_STATUS UnloadISR(IN PRTMP_ADAPTER pAd); - -VOID RTMPCopyUnicodeString(IN OUT PUNICODE_STRING DestinationString, - IN PUNICODE_STRING SourceString); - -#endif /*UNDER_CE */ - -#endif /*__WINCE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/trace.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/trace.h deleted file mode 100644 index b758453f4a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/trace.h +++ /dev/null @@ -1,1108 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - trace.h -*/ - -#undef TRACE_SYSTEM -#define TRACE_SYSTEM mtk_wifi - -#if !defined(__TRACE_H__) || defined(TRACE_HEADER_MULTI_READ) -#define __TRACE_H__ - -#include -#include -#include - -#define TRACE_MCU_CMD_INFO trace_mcu_cmd_info -TRACE_EVENT( - mcu_cmd_info, - TP_PROTO(u32 Length, u32 PQID, u32 CID, u32 PktTypeID, u32 SetQuery, - u32 SeqNum, u32 ExtCID, u32 ExtCIDOption, void *PayLoad, - u32 PayLoadLen), - - TP_ARGS(Length, PQID, CID, PktTypeID, SetQuery, SeqNum, ExtCID, - ExtCIDOption, PayLoad, PayLoadLen), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) __field( - u32, hour) __field(u32, min) __field(u32, sec) - __field(u32, Length) __field(u32, PQID) __field(u32, - CID) - __field(u32, PktTypeID) __field(u32, SetQuery) - __field(u32, SeqNum) __field(u32, - ExtCID) - __field(u32, ExtCIDOption)), - - TP_fast_assign(struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; - __entry->mon = tm.tm_mon + 1; __entry->day = tm.tm_mday; - __entry->hour = tm.tm_hour; __entry->min = tm.tm_min; - __entry->sec = tm.tm_sec; __entry->Length = Length; - __entry->PQID = PQID; __entry->CID = CID; - __entry->PktTypeID = PktTypeID; - __entry->SetQuery = SetQuery; __entry->SeqNum = SeqNum; - __entry->ExtCID = ExtCID; - __entry->ExtCIDOption = ExtCIDOption;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - length = 0x%x, pq_id = 0x%x, cid = 0x%x, pkt_type_id = 0x%x, set_query = 0x%x\ - seq_num = 0x%x, ext_cid = 0x%x, ext_cid_option = 0x%x", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->Length, __entry->PQID, - __entry->CID, __entry->PktTypeID, __entry->SetQuery, - __entry->SeqNum, __entry->ExtCID, __entry->ExtCIDOption)); - -#define TRACE_MCU_EVENT_INFO trace_mcu_event_info -TRACE_EVENT( - mcu_event_info, - TP_PROTO(u32 Length, u32 PktTypeID, u32 EID, u32 SeqNum, u32 ExtEID, - void *PayLoad, u32 PayLoadLen), - - TP_ARGS(Length, PktTypeID, EID, SeqNum, ExtEID, PayLoad, PayLoadLen), - - TP_STRUCT__entry(__field(u32, year) __field(u32, mon) __field( - u32, day) __field(u32, hour) __field(u32, min) __field(u32, sec) - __field(u32, Length) __field(u32, PktTypeID) - __field(u32, EID) __field(u32, SeqNum) - __field(u32, ExtEID) - __array(u8, PayLoad, - 128)), - - TP_fast_assign( - u8 *ptr; u32 ofs, pos = 0; struct timeval time; - unsigned long local_time; struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; __entry->mon = tm.tm_mon + 1; - __entry->day = tm.tm_mday; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - __entry->Length = Length; __entry->PktTypeID = PktTypeID; - __entry->EID = EID; __entry->SeqNum = SeqNum; - __entry->ExtEID = ExtEID; ptr = (u8 *)PayLoad; - - for (ofs = 0; ofs < PayLoadLen; ofs += 16) { - hex_dump_to_buffer(ptr + ofs, 16, 16, 1, - __entry->PayLoad + pos, 128 - pos, - 0); - pos += strlen(__entry->PayLoad + pos); - if (128 - pos > 0) - __entry->PayLoad[pos++] = '\n'; - }), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - length = 0x%x, pkt_type_id = 0x%x, eid = 0x%x\ - seq_num = 0x%x, ext_eid = 0x%x\ - , event payload = %s", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->Length, - __entry->PktTypeID, __entry->EID, __entry->SeqNum, - __entry->ExtEID, __entry->PayLoad)); - -#define TRACE_TR_ENTRY trace_tr_entry -TRACE_EVENT( - tr_entry, TP_PROTO(struct _STA_TR_ENTRY *tr_entry), - - TP_ARGS(tr_entry), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) __field( - u32, - hour) __field(u32, - min) __field(u32, - sec) __field(u32, - entry_type) __field(u8, - wdev_idx) - __field(u8, wcid) __field(u8, func_tb_idx) __array( - u8, add, - MAC_ADDR_LEN) __field(u16, - non_qos_seq) __field(u16, - qos_seq_tid_0) - __field(u16, qos_seq_tid_1) __field(u16, qos_seq_tid_2) __field( - u16, - qos_seq_tid_3) __field(u16, - qos_seq_tid_4) __field(u16, - qos_seq_tid_5) - __field(u16, qos_seq_tid_6) __field(u16, qos_seq_tid_7) __array( - u8, bssid, - MAC_ADDR_LEN) __field(u8, - port_secured) - __field(u8, ps_mode) __field(u8, cur_txrate) __field( - u8, - mpdu_density) __field(u8, - max_rampdufactor) __field(u8, amsdu_size) - __field(u8, mmps_mode) __field( - u8, - enq_cap) __field(u8, - deq_cap) - __field(u8, omac_idx) __field( - u16, - rx_ba_bitmap) - __field(u16, tx_ba_bitmap) __field( - u16, - tx_auto_ba_bitmap) - __field(u16, - ba_decline_bitmap)), - - TP_fast_assign(struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; - __entry->mon = tm.tm_mon + 1; __entry->day = tm.tm_mday; - __entry->hour = tm.tm_hour; __entry->min = tm.tm_min; - __entry->sec = tm.tm_sec; - __entry->entry_type = tr_entry->EntryType; - __entry->wdev_idx = tr_entry->wdev->wdev_idx; - __entry->wcid = tr_entry->wcid; - __entry->func_tb_idx = tr_entry->func_tb_idx; - memcpy(__entry->add, tr_entry->Addr, MAC_ADDR_LEN); - __entry->non_qos_seq = tr_entry->NonQosDataSeq; - __entry->qos_seq_tid_0 = tr_entry->TxSeq[0]; - __entry->qos_seq_tid_1 = tr_entry->TxSeq[1]; - __entry->qos_seq_tid_2 = tr_entry->TxSeq[2]; - __entry->qos_seq_tid_3 = tr_entry->TxSeq[3]; - __entry->qos_seq_tid_4 = tr_entry->TxSeq[4]; - __entry->qos_seq_tid_5 = tr_entry->TxSeq[5]; - __entry->qos_seq_tid_6 = tr_entry->TxSeq[6]; - __entry->qos_seq_tid_7 = tr_entry->TxSeq[7]; - memcpy(__entry->bssid, tr_entry->bssid, MAC_ADDR_LEN); - __entry->port_secured = tr_entry->PortSecured; - __entry->ps_mode = tr_entry->PsMode; - __entry->cur_txrate = tr_entry->CurrTxRate; - __entry->mpdu_density = tr_entry->MpduDensity; - __entry->max_rampdufactor = tr_entry->MaxRAmpduFactor; - __entry->amsdu_size = tr_entry->AMsduSize; - __entry->mmps_mode = tr_entry->MmpsMode; - __entry->enq_cap = tr_entry->enq_cap; - __entry->deq_cap = tr_entry->deq_cap; - __entry->omac_idx = tr_entry->OmacIdx; - __entry->rx_ba_bitmap = tr_entry->RXBAbitmap; - __entry->tx_ba_bitmap = tr_entry->TXBAbitmap; - __entry->tx_auto_ba_bitmap = tr_entry->TXAutoBAbitmap; - __entry->ba_decline_bitmap = tr_entry->BADeclineBitmap;), - - TP_printk("tr_entry: system Time = %04d-%02d-%02d %02d:%02d:%02d)\n", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec)); - -#define TRACE_CR_TR_INFO trace_cr_tr_info -TRACE_EVENT( - cr_tr_info, - TP_PROTO(CHAR *function, UINT32 ring_reg, UINT32 base, UINT32 cnt, - UINT32 cidx, UINT32 didx, UINT32 swidx), - - TP_ARGS(function, ring_reg, base, cnt, cidx, didx, swidx), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) - __field(u32, hour) __field(u32, min) __field(u32, sec) - __string(func, function) __field(u32, ring_reg) - __field(u32, base) __field(u32, cnt) - __field(u32, cidx) __field(u32, - didx) - __field(u32, swidx)), - - TP_fast_assign(struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; - __entry->mon = tm.tm_mon + 1; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - __assign_str(func, function); - __entry->ring_reg = ring_reg; __entry->base = base; - __entry->cnt = cnt; __entry->cidx = cidx; - __entry->didx = didx; __entry->swidx = swidx;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - Ring Name = %s\n\ - Ring Reg = 0x%04x\n\ - Base = 0x%08x\n\ - Cnt = 0x%x\n\ - CIDX = 0x%x\n\ - DIDX = 0x%x\n\ - SWIdx = 0x%x", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __get_str(func), - __entry->ring_reg, __entry->base, __entry->cnt, __entry->cidx, - __entry->didx, __entry->swidx)); - -#define TRACE_CR_INTERRUPT_INFO trace_cr_interrupt_info -TRACE_EVENT( - cr_interrupt_info, - TP_PROTO(UINT32 int_csr, UINT32 int_mask, UINT32 delay_int, - UINT32 dma_conf, UINT32 tx_dma_en, UINT32 rx_dma_en, - UINT32 tx_dma_busy, UINT32 rx_dma_busy), - - TP_ARGS(int_csr, int_mask, delay_int, dma_conf, tx_dma_en, rx_dma_en, - tx_dma_busy, rx_dma_busy), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) __field( - u32, hour) __field(u32, min) __field(u32, sec) - __field(u32, int_csr) __field(u32, int_mask) __field( - u32, delay_int) __field(u32, dma_conf) - __field(u32, tx_dma_en) __field(u32, rx_dma_en) - __field(u32, tx_dma_busy) - __field(u32, rx_dma_busy)), - - TP_fast_assign( - struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; __entry->mon = tm.tm_mon + 1; - __entry->day = tm.tm_mday; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - - __entry->int_csr = int_csr; __entry->int_mask = int_mask; - __entry->delay_int = delay_int; __entry->dma_conf = dma_conf; - __entry->tx_dma_en = tx_dma_en; __entry->rx_dma_en = rx_dma_en; - __entry->tx_dma_busy = tx_dma_busy; - __entry->rx_dma_busy = rx_dma_busy;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - IntCSR = 0x%x\n\ - IntMask = 0x%x\n\ - DelayINT = 0x%x\n\ - DMA Configuration = 0x%x\n\ - Tx/RxDMAEn = %d %d\n\ - Tx/RxDMABusy = %d %d", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->int_csr, - __entry->int_mask, __entry->delay_int, __entry->dma_conf, - __entry->tx_dma_en, __entry->rx_dma_en, __entry->tx_dma_busy, - __entry->rx_dma_busy)); - -#ifdef RTMP_PCI_SUPPORT -#define TRACE_PCI_TX_RING_IDX trace_pci_tx_ring_idx -TRACE_EVENT( - pci_tx_ring_idx, - TP_PROTO(CHAR *function, UINT32 queue_idx, UINT32 reg, UINT32 cpu_idx, - UINT32 dma_idx, UINT32 sw_free_idx), - - TP_ARGS(function, queue_idx, reg, cpu_idx, dma_idx, sw_free_idx), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) - __field(u32, hour) __field(u32, min) __field(u32, sec) - __string(func, function) __field(u32, queue_idx) - __field(u32, reg) __field(u32, cpu_idx) - __field(u32, dma_idx) - __field(u32, - sw_free_idx)), - - TP_fast_assign( - struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; __entry->mon = tm.tm_mon + 1; - __entry->day = tm.tm_mday; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - - __entry->PID = PID; __entry->QID = QID; __entry->FID = FID;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - PID = %d\n\ - QID = %d\n\ - FID = %d", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->PID, __entry->QID, - __entry->FID)); - -#define TRACE_CR_WTBL1_INFO trace_cr_wtbl1_info -TRACE_EVENT( - cr_wtbl1_info, TP_PROTO(RTMP_ADAPTER *pAd, struct wtbl_1_struc *tb), - - TP_ARGS(pAd, tb), - - TP_STRUCT__entry( - __field(u32, addr0) __field(u32, addr1) __field(u32, addr2) __field( - u32, - addr3) __field(u32, - addr4) __field(u32, - addr5) __field(u32, - year) __field(u32, - mon) - __field(u32, day) __field(u32, hour) __field(u32, min) __field( - u32, - sec) __field(u32, - muar_idx) __field(u32, - rc_a1) __field(u32, - rc_a2) - __field(u32, kid) __field(u32, rkv) __field(u32, rv) __field( - u8, - sw) __field(u8, - wm) __field(u8, - mm) __field(u8, - cipher_suit) - __field(u8, td) __field(u8, fd) __field( - u8, - dis_rhtr) __field(u8, - af) __field(u8, - rx_ps) __field(u8, r) - __field(u8, rts) __field(u8, cf_ack) __field(u8, rdg_ba) __field( - u8, - smps) __field(u8, - baf_en) __field(u8, - ht) __field(u8, - vht) - __field(u8, ldpc) __field(u8, dyn_bw) __field( - u8, - tibf) __field(u8, - tebf) __field(u8, txop_ps_cap) - __field(u8, mesh) __field( - u8, - qos) __field(u8, - adm) - __field(u32, gid) __field( - u32, - wtbl2_fid) __field(u32, - wtbl2_eid) - __field(u32, wtbl3_fid) __field( - u32, - wtbl3_eid) __field(u32, - wtbl4_fid) - __field(u32, wtbl4_eid) __field( - u8, - chk_per) __field(u8, - du_i_psm) - __field(u8, i_psm) __field( - u8, - psm) __field(u8, - skip_tx) - __field(u8, - partial_aid)), - - TP_fast_assign( - union WTBL_1_DW0 *wtbl_1_d0 = - (union WTBL_1_DW0 *)&tb->wtbl_1_d0.word; - union WTBL_1_DW1 *wtbl_1_d1 = - (union WTBL_1_DW1 *)&tb->wtbl_1_d1.word; - union WTBL_1_DW2 *wtbl_1_d2 = - (union WTBL_1_DW2 *)&tb->wtbl_1_d2.word; - union WTBL_1_DW3 *wtbl_1_d3 = - (union WTBL_1_DW3 *)&tb->wtbl_1_d3.word; - union WTBL_1_DW4 *wtbl_1_d4 = - (union WTBL_1_DW4 *)&tb->wtbl_1_d4.word; - UINT32 Value; struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; __entry->mon = tm.tm_mon + 1; - __entry->day = tm.tm_mday; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - - __entry->addr0 = wtbl_1_d1->field.addr_0 & 0xff; - __entry->addr1 = ((wtbl_1_d1->field.addr_0 & 0xff00) >> 8); - __entry->addr2 = ((wtbl_1_d1->field.addr_0 & 0xff0000) >> 16); - __entry->addr3 = ((wtbl_1_d1->field.addr_0 & 0xff000000) >> 24); - __entry->addr4 = wtbl_1_d0->field.addr_4 & 0xff; - __entry->addr5 = wtbl_1_d0->field.addr_5 & 0xff; - - __entry->muar_idx = wtbl_1_d0->field.muar_idx; - __entry->rc_a1 = wtbl_1_d0->field.rc_a1; - __entry->rc_a2 = wtbl_1_d0->field.rc_a2; - __entry->kid = wtbl_1_d0->field.kid; - __entry->rkv = wtbl_1_d0->field.rkv; - __entry->rv = wtbl_1_d0->field.rv; - __entry->sw = wtbl_1_d0->field.sw; - __entry->wm = wtbl_1_d0->field.wm; - __entry->mm = wtbl_1_d2->field.mm; - __entry->cipher_suit = wtbl_1_d2->field.cipher_suit; - __entry->td = wtbl_1_d2->field.td; - __entry->fd = wtbl_1_d2->field.fd; - __entry->dis_rhtr = wtbl_1_d2->field.dis_rhtr; - __entry->af = wtbl_1_d2->field.af; - __entry->rx_ps = wtbl_1_d2->field.rx_ps; - __entry->r = wtbl_1_d2->field.r; - __entry->rts = wtbl_1_d2->field.rts; - __entry->cf_ack = wtbl_1_d2->field.cf_ack; - __entry->rdg_ba = wtbl_1_d2->field.rdg_ba; - __entry->smps = wtbl_1_d2->field.smps; - __entry->baf_en = wtbl_1_d2->field.baf_en; - __entry->ht = wtbl_1_d2->field.ht; - __entry->vht = wtbl_1_d2->field.vht; - __entry->ldpc = wtbl_1_d2->field.ldpc; - __entry->dyn_bw = wtbl_1_d2->field.dyn_bw; - __entry->tibf = wtbl_1_d2->field.tibf; - __entry->tebf = wtbl_1_d2->field.tebf; - __entry->txop_ps_cap = wtbl_1_d2->field.txop_ps_cap; - __entry->mesh = wtbl_1_d2->field.mesh; - __entry->qos = wtbl_1_d2->field.qos; - __entry->adm = wtbl_1_d2->field.adm; - __entry->gid = wtbl_1_d2->field.gid; - __entry->wtbl2_fid = wtbl_1_d3->field.wtbl2_fid; - __entry->wtbl2_eid = wtbl_1_d3->field.wtbl2_eid; - __entry->wtbl3_fid = wtbl_1_d4->field.wtbl3_fid; - __entry->wtbl3_eid = wtbl_1_d4->field.wtbl3_eid; - __entry->wtbl4_fid = wtbl_1_d3->field.wtbl4_fid; - __entry->wtbl4_eid = wtbl_1_d4->field.wtbl4_eid; - __entry->chk_per = wtbl_1_d3->field.chk_per; - __entry->du_i_psm = wtbl_1_d3->field.du_i_psm; - __entry->i_psm = wtbl_1_d3->field.i_psm; - __entry->psm = wtbl_1_d3->field.psm; - __entry->skip_tx = wtbl_1_d3->field.skip_tx; - __entry->partial_aid = wtbl_1_d4->field.partial_aid;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - WTBL Segment 1 Fields:\n\ - mac addr: %02X:%02X:%02X:%02X:%02X:%02X\n\ - MUAR_Idx:%d\n\ - rc_a1/rc_a2:%d/%d\n\ - kid:%d\n\ - rkv/rv:%d/%d\n\ - sw:%d\n\ - wm/mm:%d/%d\n\ - cipher_suit:%d\n\ - td/fd:%d/%d\n\ - dis_rhtr:%d\n\ - af:%d\n\ - rx_ps:%d\n\ - r:%d\n\ - rts:%d\n\ - cf_ack:%d\n\ - rdg_ba:%d\n\ - smps:%d\n\ - baf_en:%d\n\ - ht/vht/ldpc/dyn_bw:%d/%d/%d/%d\n\ - TxBF(tibf/tebf):%d / %d\n\ - txop_ps_cap:%d\n\ - mesh:%d\n\ - qos:%d\n\ - adm:%d\n\ - gid:%d\n\ - wtbl2_fid:%d\n\ - wtbl2_eid:%d\n\ - wtbl3_fid:%d\n\ - wtbl3_eid:%d\n\ - wtbl4_fid:%d\n\ - wtbl4_eid:%d\n\ - chk_per:%d\n\ - du_i_psm:%d\n\ - i_psm:%d\n\ - psm:%d\n\ - skip_tx:%d\n\ - partial_aid:%d\n", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->addr0, __entry->addr1, - __entry->addr2, __entry->addr3, __entry->addr4, - __entry->addr5, __entry->muar_idx, __entry->rc_a1, - __entry->rc_a2, __entry->kid, __entry->rkv, __entry->rv, - __entry->sw, __entry->wm, __entry->mm, __entry->cipher_suit, - __entry->td, __entry->fd, __entry->dis_rhtr, __entry->af, - __entry->rx_ps, __entry->r, __entry->rts, __entry->cf_ack, - __entry->rdg_ba, __entry->smps, __entry->baf_en, __entry->ht, - __entry->vht, __entry->ldpc, __entry->dyn_bw, __entry->tibf, - __entry->tebf, __entry->txop_ps_cap, __entry->mesh, - __entry->qos, __entry->adm, __entry->gid, __entry->wtbl2_fid, - __entry->wtbl2_eid, __entry->wtbl3_fid, __entry->wtbl3_eid, - __entry->wtbl4_fid, __entry->wtbl4_eid, __entry->chk_per, - __entry->du_i_psm, __entry->i_psm, __entry->psm, - __entry->skip_tx, __entry->partial_aid)); - -#define TRACE_CR_WTBL2_INFO trace_cr_wtbl2_info -TRACE_EVENT( - cr_wtbl2_info, TP_PROTO(RTMP_ADAPTER *pAd, struct wtbl_2_struc *tb), - - TP_ARGS(pAd, tb), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) __field(u32, hour) __field( - u32, - min) __field(u32, - sec) __field(u32, - pn_0) __field(u32, - pn_32) __field(u32, - com_sn) - __field(u32, tid_ac_0_sn) __field(u32, tid_ac_1_sn) __field( - u32, - tid_ac_2_sn) __field(u32, - tid_ac_3_sn) __field(u32, - tid_ac_4_sn) - __field(u32, tid_ac_5_sn) __field(u32, tid_ac_6_sn) __field( - u32, - tid_ac_7_sn) __field(u32, - rate_1_tx_cnt) __field(u32, - rate_1_fail_cnt) - __field(u32, rate_2_tx_cnt) __field(u32, rate_3_tx_cnt) __field( - u32, - rate_4_tx_cnt) __field(u32, - rate_5_tx_cnt) __field(u32, current_bw_tx_cnt) - __field(u32, current_bw_fail_cnt) __field(u32, other_bw_tx_cnt) __field( - u32, - other_bw_fail_cnt) __field(u32, - fcap) __field(u32, rate_idx) - __field(u32, cbrn) __field(u32, ccbw_sel) __field(u32, spe_en) __field( - u32, - mpdu_fail_cnt) __field(u32, - mpdu_ok_cnt) - __field(u32, g2) __field(u32, g4) __field( - u32, - g8) __field(u32, - g16) __field(u32, - rate_info_0) - __field(u32, rate_info_1) __field(u32, rate_info_2) __field( - u32, - resp_rcpi_0) __field(u32, resp_rcpi_1) - __field(u32, resp_rcpi_2) __field( - u32, - sts_1_ch_cap_noise) __field(u32, - sts_2_ch_cap_noise) - __field(u32, sts_3_ch_cap_noise) __field( - u32, - ce_rmsd) __field(u32, - cc_noise_sel) - __field(u32, ant_sel) __field( - u32, - ba_en) - __field(u32, - ba_size)), - - TP_fast_assign( - union WTBL_2_DW0 *dw_0 = &tb->wtbl_2_d0; - union WTBL_2_DW1 *dw_1 = &tb->wtbl_2_d1; - union WTBL_2_DW2 *dw_2 = &tb->wtbl_2_d2; - union WTBL_2_DW3 *dw_3 = &tb->wtbl_2_d3; - union WTBL_2_DW4 *dw_4 = &tb->wtbl_2_d4; - union WTBL_2_DW5 *dw_5 = &tb->wtbl_2_d5; - union WTBL_2_DW6 *dw_6 = &tb->wtbl_2_d6; - union WTBL_2_DW7 *dw_7 = &tb->wtbl_2_d7; - union WTBL_2_DW8 *dw_8 = &tb->wtbl_2_d8; - union WTBL_2_DW9 *dw_9 = &tb->wtbl_2_d9; - union WTBL_2_DW10 *dw_10 = &tb->wtbl_2_d10; - union WTBL_2_DW11 *dw_11 = &tb->wtbl_2_d11; - union WTBL_2_DW12 *dw_12 = &tb->wtbl_2_d12; - union WTBL_2_DW13 *dw_13 = &tb->wtbl_2_d13; - union WTBL_2_DW14 *dw_14 = &tb->wtbl_2_d14; - union WTBL_2_DW15 *dw_15 = &tb->wtbl_2_d15; struct timeval time; - unsigned long local_time; struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; __entry->mon = tm.tm_mon + 1; - __entry->day = tm.tm_mday; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - __entry->pn_0 = dw_0->pn_0; __entry->pn_32 = dw_1->field.pn_32; - __entry->com_sn = dw_1->field.com_sn; - __entry->tid_ac_0_sn = dw_2->field.tid_ac_0_sn; - __entry->tid_ac_1_sn = dw_2->field.tid_ac_1_sn; - __entry->tid_ac_2_sn = dw_2->field.tid_ac_2_sn_0 | - (dw_3->field.tid_ac_2_sn_9 << 9); - __entry->tid_ac_3_sn = dw_3->field.tid_ac_3_sn; - __entry->tid_ac_4_sn = dw_3->field.tid_4_sn; - __entry->tid_ac_5_sn = dw_3->field.tid_5_sn_0 | - (dw_4->field.tid_5_sn_5 << 5); - __entry->tid_ac_6_sn = dw_4->field.tid_6_sn; - __entry->tid_ac_7_sn = dw_4->field.tid_7_sn; - __entry->rate_1_tx_cnt = dw_5->field.rate_1_tx_cnt; - __entry->rate_1_fail_cnt = dw_5->field.rate_1_fail_cnt; - __entry->rate_2_tx_cnt = dw_6->field.rate_2_tx_cnt; - __entry->rate_3_tx_cnt = dw_6->field.rate_3_tx_cnt; - __entry->rate_4_tx_cnt = dw_6->field.rate_4_tx_cnt; - __entry->rate_5_tx_cnt = dw_6->field.rate_5_tx_cnt; - __entry->current_bw_tx_cnt = dw_7->field.current_bw_tx_cnt; - __entry->current_bw_fail_cnt = dw_7->field.current_bw_fail_cnt; - __entry->other_bw_tx_cnt = dw_8->field.other_bw_tx_cnt; - __entry->other_bw_fail_cnt = dw_8->field.other_bw_fail_cnt; - __entry->fcap = dw_9->field.fcap; - __entry->rate_idx = dw_9->field.rate_idx; - __entry->cbrn = dw_9->field.cbrn; - __entry->ccbw_sel = dw_9->field.ccbw_sel; - __entry->spe_en = dw_9->field.spe_en; - __entry->mpdu_fail_cnt = dw_9->field.mpdu_fail_cnt; - __entry->mpdu_ok_cnt = dw_9->field.mpdu_ok_cnt; - __entry->g2 = dw_9->field.g2; __entry->g4 = dw_9->field.g4; - __entry->g8 = dw_9->field.g8; __entry->g16 = dw_9->field.g16; - __entry->rate_info_0 = dw_10->word; - __entry->rate_info_1 = dw_11->word; - __entry->rate_info_2 = dw_12->word; - __entry->resp_rcpi_0 = dw_13->field.resp_rcpi_0; - __entry->resp_rcpi_1 = dw_13->field.resp_rcpi_1; - __entry->resp_rcpi_2 = dw_13->field.resp_rcpi_2; - __entry->sts_1_ch_cap_noise = dw_14->field.sts_1_ch_cap_noise; - __entry->sts_2_ch_cap_noise = dw_14->field.sts_2_ch_cap_noise; - __entry->sts_3_ch_cap_noise = dw_14->field.sts_3_ch_cap_noise; - __entry->ce_rmsd = dw_14->field.ce_rmsd; - __entry->cc_noise_sel = dw_14->field.cc_noise_sel; - __entry->ant_sel = dw_14->field.ant_sel; - __entry->ba_en = dw_15->field.ba_en; - __entry->ba_size = dw_15->field.ba_win_size_tid;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - WTBL Segment 2 Fields:\n\ - PN_0-31:0x%x\n\ - PN_32-48:0x%x\n\ - SN(NonQos/Mgmt Frame):%d\n\ - SN(TID0~7 QoS Frame):%d - %d - %d - %d - %d - %d - %d - %d\n\ - TxRateCnt(1-5):%d(%d) - %d - %d - %d - %d\n\ - TxBwCnt(Current-Other):%d(%d) - %d(%d)\n\ - FreqCap:%d\n\ - RateIdx/CBRN/CCBW_SEL/SPE_EN: %d/%d/%d/%d\n\ - MpduCnt(Fail/OK):%d-%d\n\ - TxRate Info: G2/G4/G8/G16=%d/%d/%d/%d\n\ - TxRate Info: %d/%d/%d\n\ - Resp_RCPI0/Resp_RCPI1/Resp_RCPI2=0x%x/0x%x/0x%x\n\ - 1CC(Noise)/2CC(Noise)/3CC(Noise)/CE_RMSD/CC_Sel/Ant_Sel=0x%x/0x%x/0x%x/0x%x/%d/%d\n\ - BA Info: BA_En/BAWinSizeIdx(Range)\n\ - %d/%d\n", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->pn_0, __entry->pn_32, - __entry->com_sn, __entry->tid_ac_0_sn, __entry->tid_ac_1_sn, - __entry->tid_ac_2_sn, __entry->tid_ac_3_sn, - __entry->tid_ac_4_sn, __entry->tid_ac_5_sn, - __entry->tid_ac_6_sn, __entry->tid_ac_7_sn, - __entry->rate_1_tx_cnt, __entry->rate_1_fail_cnt, - __entry->rate_2_tx_cnt, __entry->rate_3_tx_cnt, - __entry->rate_4_tx_cnt, __entry->rate_5_tx_cnt, - __entry->current_bw_tx_cnt, __entry->current_bw_fail_cnt, - __entry->other_bw_tx_cnt, __entry->other_bw_fail_cnt, - __entry->fcap, __entry->rate_idx, __entry->cbrn, - __entry->ccbw_sel, __entry->spe_en, __entry->mpdu_fail_cnt, - __entry->mpdu_ok_cnt, __entry->g2, __entry->g4, __entry->g8, - __entry->g16, __entry->rate_info_0, __entry->rate_info_1, - __entry->rate_info_2, __entry->resp_rcpi_0, - __entry->resp_rcpi_1, __entry->resp_rcpi_2, - __entry->sts_1_ch_cap_noise, __entry->sts_2_ch_cap_noise, - __entry->sts_3_ch_cap_noise, __entry->ce_rmsd, - __entry->cc_noise_sel, __entry->ant_sel, __entry->ba_en, - __entry->ba_size)); - -#define TRACE_CR_TR_INFO trace_cr_tr_info -TRACE_EVENT( - cr_tr_info, - TP_PROTO(CHAR *function, UINT32 ring_reg, UINT32 base, UINT32 cnt, - UINT32 cidx, UINT32 didx, UINT32 swidx), - - TP_ARGS(function, ring_reg, base, cnt, cidx, didx, swidx), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) - __field(u32, hour) __field(u32, min) __field(u32, sec) - __string(func, function) __field(u32, ring_reg) - __field(u32, base) __field(u32, cnt) - __field(u32, cidx) __field(u32, - didx) - __field(u32, swidx)), - - TP_fast_assign(struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; - __entry->mon = tm.tm_mon + 1; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - __assign_str(func, function); - __entry->ring_reg = ring_reg; __entry->base = base; - __entry->cnt = cnt; __entry->cidx = cidx; - __entry->didx = didx; __entry->swidx = swidx;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - Ring Name = %s\n\ - Ring Reg = 0x%04x\n\ - Base = 0x%08x\n\ - Cnt = 0x%x\n\ - CIDX = 0x%x\n\ - DIDX = 0x%x\n\ - SWIdx = 0x%x", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __get_str(func), - __entry->ring_reg, __entry->base, __entry->cnt, __entry->cidx, - __entry->didx, __entry->swidx)); - -#define TRACE_CR_INTERRUPT_INFO trace_cr_interrupt_info -TRACE_EVENT( - cr_interrupt_info, - TP_PROTO(UINT32 int_csr, UINT32 int_mask, UINT32 delay_int, - UINT32 dma_conf, UINT32 tx_dma_en, UINT32 rx_dma_en, - UINT32 tx_dma_busy, UINT32 rx_dma_busy), - - TP_ARGS(int_csr, int_mask, delay_int, dma_conf, tx_dma_en, rx_dma_en, - tx_dma_busy, rx_dma_busy), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) __field( - u32, hour) __field(u32, min) __field(u32, sec) - __field(u32, int_csr) __field(u32, int_mask) __field( - u32, delay_int) __field(u32, dma_conf) - __field(u32, tx_dma_en) __field(u32, rx_dma_en) - __field(u32, tx_dma_busy) - __field(u32, rx_dma_busy)), - - TP_fast_assign( - struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; __entry->mon = tm.tm_mon + 1; - __entry->day = tm.tm_mday; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - - __entry->int_csr = int_csr; __entry->int_mask = int_mask; - __entry->delay_int = delay_int; __entry->dma_conf = dma_conf; - __entry->tx_dma_en = tx_dma_en; __entry->rx_dma_en = rx_dma_en; - __entry->tx_dma_busy = tx_dma_busy; - __entry->rx_dma_busy = rx_dma_busy;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - IntCSR = 0x%x\n\ - IntMask = 0x%x\n\ - DelayINT = 0x%x\n\ - DMA Configuration = 0x%x\n\ - Tx/RxDMAEn = %d %d\n\ - Tx/RxDMABusy = %d %d", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->int_csr, - __entry->int_mask, __entry->delay_int, __entry->dma_conf, - __entry->tx_dma_en, __entry->rx_dma_en, __entry->tx_dma_busy, - __entry->rx_dma_busy)); - -#ifdef RTMP_PCI_SUPPORT -#define TRACE_PCI_TX_RING_IDX trace_pci_tx_ring_idx -TRACE_EVENT( - pci_tx_ring_idx, - TP_PROTO(CHAR *function, UINT32 queue_idx, UINT32 reg, UINT32 cpu_idx, - UINT32 dma_idx, UINT32 sw_free_idx), - - TP_ARGS(function, queue_idx, reg, cpu_idx, dma_idx, sw_free_idx), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) - __field(u32, hour) __field(u32, min) __field(u32, sec) - __string(func, function) __field(u32, queue_idx) - __field(u32, reg) __field(u32, cpu_idx) - __field(u32, dma_idx) - __field(u32, - sw_free_idx)), - - TP_fast_assign(struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; - __entry->mon = tm.tm_mon + 1; __entry->day = tm.tm_mday; - __entry->hour = tm.tm_hour; __entry->min = tm.tm_min; - __entry->sec = tm.tm_sec; - - __assign_str(func, function); - __entry->queue_idx = queue_idx; __entry->reg = reg; - __entry->cpu_idx = cpu_idx; __entry->dma_idx = dma_idx; - __entry->sw_free_idx = sw_free_idx;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - function = %s\n\ - queue_idx = 0x%x\n\ - reg = 0x%x\n\ - cpu_idx = 0x%x\n\ - dma_idx = 0x%x\n\ - sw_free_idx = 0x%x", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __get_str(func), - __entry->queue_idx, __entry->reg, __entry->cpu_idx, - __entry->dma_idx, __entry->sw_free_idx)); -#endif - -#define TRACE_PS_RETRIEVE_PACKET trace_ps_retrieve_packet -TRACE_EVENT( - ps_retrieve_packet, - TP_PROTO(UINT8 stage, UINT32 wlan_idx, UINT32 hdr_info, UINT16 padding, - UINT32 entry_type, UINT16 ps_state, UINT8 qos_0, UINT8 qos_1, - INT32 ps_qbitmap, UINT32 ps_queue_number, UINT16 token_count), - - TP_ARGS(stage, wlan_idx, hdr_info, padding, entry_type, ps_state, qos_0, - qos_1, ps_qbitmap, ps_queue_number, token_count), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) __field( - u32, hour) __field(u32, min) __field(u32, - sec) __field(u8, - stage) - __field(u32, wlan_idx) __field(u32, hdr_info) __field( - u16, padding) __field(u32, entry_type) - __field(u16, ps_state) __field(u8, qos_0) - __field(u8, qos_1) __field(s32, - ps_qbitmap) - __field(u32, ps_queue_number) - __field(u32, - token_count)), - - TP_fast_assign(struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; - __entry->mon = tm.tm_mon + 1; __entry->day = tm.tm_mday; - __entry->hour = tm.tm_hour; __entry->min = tm.tm_min; - __entry->sec = tm.tm_sec; - - __entry->stage = stage; __entry->wlan_idx = wlan_idx; - __entry->hdr_info = hdr_info; __entry->padding = padding; - __entry->entry_type = entry_type; - __entry->ps_state = ps_state; __entry->qos_0 = qos_0; - __entry->qos_1 = qos_1; __entry->ps_qbitmap = ps_qbitmap; - __entry->ps_queue_number = ps_queue_number; - __entry->token_count = token_count;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - stage = %d\n\ - wlan_idx = %d\n\ - hdr_info = %d\n\ - padding = %d\n\ - entry_type = %d\n\ - ps_state = %d\n\ - qos_0 = %d\n\ - qos_1 = %d\n\ - ps_qbitmap = %d\n\ - ps_queue_number = %d\n\ - token_count = %d", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->stage, __entry->wlan_idx, - __entry->hdr_info, __entry->padding, __entry->entry_type, - __entry->ps_state, __entry->qos_0, __entry->qos_1, - __entry->ps_qbitmap, __entry->ps_queue_number, - __entry->token_count)); - -#define TRACE_PS_INDICATE trace_ps_indicate -TRACE_EVENT( - ps_indicate, - TP_PROTO(UINT8 Stage, UINT32 wcid, UINT8 old_psm, UINT8 new_psm, - UINT8 tr_entry_ps_state), - - TP_ARGS(Stage, wcid, old_psm, new_psm, tr_entry_ps_state), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) - __field(u32, hour) __field(u32, min) __field(u32, sec) - __field(u8, Stage) __field(u32, wcid) - __field(u8, old_psm) __field(u8, - new_psm) - __field(u8, tr_entry_ps_state)), - - TP_fast_assign(struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; - __entry->mon = tm.tm_mon + 1; __entry->day = tm.tm_mday; - __entry->hour = tm.tm_hour; __entry->min = tm.tm_min; - __entry->sec = tm.tm_sec; - - __entry->Stage = Stage; __entry->wcid = wcid; - __entry->old_psm = old_psm; __entry->new_psm = new_psm; - __entry->tr_entry_ps_state = tr_entry_ps_state;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - Stage = %d\n\ - wcid = %d\n\ - old_psm = %d\n\ - new_state = %d\n\ - tr_entry_ps_state = %d", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->Stage, __entry->wcid, - __entry->old_psm, __entry->new_psm, - __entry->tr_entry_ps_state)) - -#define TRACE_PS_HANDLE_RX_PS_POLL trace_ps_handle_rx_ps_poll -TRACE_EVENT( - ps_handle_rx_ps_poll, - TP_PROTO(UINT8 Stage, UINT32 wcid, UINT8 is_active, UINT8 ps_state), - - TP_ARGS(Stage, wcid, is_active, ps_state - - ), - - TP_STRUCT__entry(__field(u32, year) __field(u32, mon) __field( - u32, day) __field(u32, hour) __field(u32, min) __field(u32, sec) - __field(u8, Stage) __field(u32, wcid) - __field(u8, is_active) - __field(u8, ps_state)), - - TP_fast_assign(struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; - __entry->mon = tm.tm_mon + 1; __entry->day = tm.tm_mday; - __entry->hour = tm.tm_hour; __entry->min = tm.tm_min; - __entry->sec = tm.tm_sec; - - __entry->Stage = Stage; __entry->wcid = wcid; - __entry->is_active; __entry->ps_state = ps_state;), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - Stage = %d\n\ - wcid = %d\n\ - is_active = %d\n\ - ps_state = %d", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->Stage, __entry->wcid, - __entry->is_active, __entry->ps_state)) - -#define TRACE_PS_INFO trace_ps_info -TRACE_EVENT( - ps_info, - TP_PROTO(UINT32 addr0, UINT32 addr1, UINT32 addr2, UINT32 addr3, - UINT32 addr4, UINT32 addr5, UINT32 entry_type, UINT32 aid, - UINT32 func_tb_idx, UINT32 ps_mode, UINT32 ps_state, - UINT32 i_psm, UINT32 du_i_psm, UINT32 skip_tx, - UINT32 pfg_force, UINT32 pucport, UINT32 pucqueue, - UINT32 total_pkt_number, UINT32 ps_queue_number), - - TP_ARGS(addr0, addr1, addr2, addr3, addr4, addr5, entry_type, aid, - func_tb_idx, ps_mode, ps_state, i_psm, du_i_psm, skip_tx, - pfg_force, pucport, pucqueue, total_pkt_number, - ps_queue_number), - - TP_STRUCT__entry( - __field(u32, year) __field(u32, mon) __field(u32, day) __field( - u32, - hour) __field(u32, - min) __field(u32, - sec) __field(u32, - addr0) __field(u32, - addr1) - __field(u32, addr2) __field(u32, addr3) __field( - u32, addr4) __field(u32, - addr5) __field(u32, - entry_type) - __field(u32, aid) __field(u32, func_tb_idx) __field( - u32, - ps_mode) __field(u32, - ps_state) __field(u32, - i_psm) - __field(u32, du_i_psm) __field( - u32, skip_tx) __field(u32, - pfg_force) - __field(u32, pucport) __field( - u32, - pucqueue) __field(u32, - total_pkt_number) - __field(u32, - ps_queue_number)), - - TP_fast_assign( - struct timeval time; unsigned long local_time; - struct rtc_time tm; - - do_gettimeofday(&time); - local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - - __entry->year = tm.tm_year + 1900; __entry->mon = tm.tm_mon + 1; - __entry->day = tm.tm_mday; __entry->hour = tm.tm_hour; - __entry->min = tm.tm_min; __entry->sec = tm.tm_sec; - - __entry->addr0 = addr0; __entry->addr1 = addr1; - __entry->addr2 = addr2; __entry->addr3 = addr3; - __entry->addr4 = addr4; __entry->addr5 = addr5; - __entry->entry_type = entry_type; __entry->aid = aid; - __entry->func_tb_idx = func_tb_idx; __entry->ps_mode = ps_mode; - __entry->ps_state = ps_state; __entry->i_psm = i_psm; - __entry->du_i_psm = du_i_psm; __entry->skip_tx = skip_tx; - __entry->pfg_force = pfg_force; __entry->pucport = pucport; - __entry->pucqueue = pucqueue; - __entry->total_pkt_number = total_pkt_number; - __entry->ps_queue_number = ps_queue_number), - - TP_printk("System Time = %04d-%02d-%02d %02d:%02d:%02d)\n\ - %02X:%02X:%02X:%02X:%02X:%02X\n\ - EntryType = %10x\n\ - Aid = %5d\n\ - func_tb_idx = %5d\n\ - PsMode = %5d\n\ - ps_state = %5d\n\ - i_psm = %5d\n\ - du_i_psm = %5d\n\ - skip_tx = %5d\n\ - pfgForce = %5d\n\ - pucPort = %5d\n\ - pucQueue = %5d\n\ - Total_Packet_Number = %6d\n\ - ps_queue.Number = %6d", - __entry->year, __entry->mon, __entry->day, __entry->hour, - __entry->min, __entry->sec, __entry->addr0, __entry->addr1, - __entry->addr2, __entry->addr3, __entry->addr4, - __entry->addr5, __entry->entry_type, __entry->aid, - __entry->func_tb_idx, __entry->ps_mode, __entry->ps_state, - __entry->i_psm, __entry->du_i_psm, __entry->skip_tx, - __entry->pfg_force, __entry->pucport, __entry->pucqueue, - __entry->total_pkt_number, __entry->ps_queue_number)); - -INT32 TraceTRInfo(RTMP_ADAPTER *pAd); -VOID TraceCrPseInfo(RTMP_ADAPTER *pAd); -VOID TraceWtblInfo(RTMP_ADAPTER *pAd, UINT32 wtbl_idx); -INT32 TracePSTable(RTMP_ADAPTER *pAd, UINT32 ent_type, BOOLEAN bReptCli); - -#endif - -#undef TRACE_INCLUDE_PATH -#define TRACE_INCLUDE_PATH . -#undef TRACE_INCLUDE_FILE -#define TRACE_INCLUDE_FILE trace -#include - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/wbsys_res.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/wbsys_res.h deleted file mode 100644 index b54b37765f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/os/wbsys_res.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: mt_wifi - wbsys_of.h -*/ - -#ifndef _WBSYS_RES_H -#define _WBSYS_RES_H - -#include "rtmp_chip.h" - -/*platform device & platform driver match name*/ -static char wbsys_string[] = "wb_sys"; - -#if defined(CONFIG_OF) -#include -#include - -static const struct of_device_id wbsys_of_ids[] = { - { - .compatible = OF_WBSYS_NAME, - }, - {}, -}; - -#define wbsys_dev_alloc(res) -#define wbsys_dev_release(res) - -#else -static struct resource wbsys_res[] = { - [0] = { - .start = (RTMP_MAC_CSR_ADDR), - .end = (RTMP_MAC_CSR_ADDR + RTMP_MAC_CSR_LEN-1), - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = RTMP_IRQ_NUM, - .end = RTMP_IRQ_NUM, - .flags = IORESOURCE_IRQ, - } -}; - -static void platform_wbsys_release(struct device *dev) -{ - return; -} - -struct platform_device wbsys_dev = { .name = wbsys_string, - .id = -1, - .num_resources = ARRAY_SIZE(wbsys_res), - .resource = wbsys_res, - .dev = { - .release = platform_wbsys_release, - } }; -#define wbsys_dev_alloc(dev) \ - { \ - platform_device_register(dev); \ - } - -#define wbsys_dev_release(dev) \ - { \ - platform_device_unregister(dev); \ - } -#endif /*CONFIG_OF*/ - -#endif /*_WBSYS_RES_H*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_bbp.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_bbp.h deleted file mode 100644 index 99565e496e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_bbp.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_bbp.h -*/ - -#ifndef __MT_BBP_H__ -#define __MT_BBP_H__ - -INT32 MTShowAllBBP(struct _RTMP_ADAPTER *pAd); -INT32 MTShowPartialBBP(struct _RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End); -INT mt_phy_probe(struct _RTMP_ADAPTER *pAd); - -#endif /* __MT_BBP_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_phy.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_phy.h deleted file mode 100644 index 8b13789179..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_phy.h +++ /dev/null @@ -1 +0,0 @@ - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_rf.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_rf.h deleted file mode 100644 index e8d4c1675b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/mt_rf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_rf.h -*/ - -#ifndef __MT_RF_H__ -#define __MT_RF_H__ - -INT32 MTShowAllRF(struct _RTMP_ADAPTER *pAd); -INT32 MTShowPartialRF(struct _RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End); - -#endif /* __MT_RF_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/phy.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/phy.h deleted file mode 100644 index 241c4ffe61..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/phy.h +++ /dev/null @@ -1,268 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - phy.h -*/ - -#ifndef __PHY_H__ -#define __PHY_H__ - -#ifdef MT_BBP -#include "phy/mt_bbp.h" -#endif /* MT_BBP */ - -#ifdef MT_RF -#include "phy/mt_rf.h" -#endif - -/* value domain of pAd->RfIcType */ -#define RFIC_2820 1 /* 2.4G 2T3R */ -#define RFIC_2850 2 /* 2.4G/5G 2T3R */ -#define RFIC_2720 3 /* 2.4G 1T2R */ -#define RFIC_2750 4 /* 2.4G/5G 1T2R */ -#define RFIC_3020 5 /* 2.4G 1T1R */ -#define RFIC_2020 6 /* 2.4G B/G */ -#define RFIC_3021 7 /* 2.4G 1T2R */ -#define RFIC_3022 8 /* 2.4G 2T2R */ -#define RFIC_3052 9 /* 2.4G/5G 2T2R */ -#define RFIC_2853 10 /* 2.4G.5G 3T3R */ -#define RFIC_3320 11 /* 2.4G 1T1R with PA (RT3350/RT3370/RT3390) */ -#define RFIC_3322 \ - 12 /* 2.4G 2T2R with PA (RT3352/RT3371/RT3372/RT3391/RT3392) */ -#define RFIC_3053 13 /* 2.4G/5G 3T3R (RT3883/RT3563/RT3573/RT3593/RT3662) */ -#define RFIC_3853 13 /* 2.4G/5G 3T3R (RT3883/RT3563/RT3573/RT3593/RT3662) */ -#define RFIC_5592 14 /* 2.4G/5G */ -#define RFIC_6352 15 /* 2.4G 2T2R */ -#define RFIC_7650 15 /* 2.4G/5G 1x1 VHT with BT*/ -#define RFIC_7610E 16 /* 5G 1x1 VHT */ -#define RFIC_7610U 17 -#define RFIC_7630 18 /* 2.4G 1x1 HT with BT */ -#define RFIC_7662 19 /* 2.4G/5G 2T2R VHT with BT */ -#define RFIC_7612 20 /* 2.4G/5G 2T2R VHT */ -#define RFIC_7602 21 /* 2.4G 2T2R VHT */ -#define RFIC_7603 22 /* 2.4G 2T2R HT */ -#define RFIC_7628 23 /* 2.4G 2T2R HT */ -#define RFIC_7636 24 /* ?? */ -#define RFIC_7615 25 -#define RFIC_7637 26 -#define RFIC_7622 27 /* ?? */ /*wilsonl */ -#define RFIC_P18 28 -#define RFIC_7663 29 -#define RFIC_7611 30 -#define RFIC_7616 31 -#define RFIC_7615A 32 -#define RFIC_UNKNOWN 0xff - -/* TODO: shiang-MT7615 */ -#define RFIC_IS_5G_BAND(__pAd) \ - ((__pAd->RfIcType == RFIC_2850) || (__pAd->RfIcType == RFIC_2750) || \ - (__pAd->RfIcType == RFIC_3052) || (__pAd->RfIcType == RFIC_2853) || \ - (__pAd->RfIcType == RFIC_3053) || (__pAd->RfIcType == RFIC_3853) || \ - (__pAd->RfIcType == RFIC_5592) || (__pAd->RfIcType == RFIC_7650) || \ - (__pAd->RfIcType == RFIC_7610E) || (__pAd->RfIcType == RFIC_7610U) || \ - (__pAd->RfIcType == RFIC_7662) || (__pAd->RfIcType == RFIC_7612) || \ - (__pAd->RfIcType == RFIC_7636) || (__pAd->RfIcType == RFIC_7615) || \ - (__pAd->RfIcType == RFIC_7636) || (__pAd->RfIcType == RFIC_7637) || \ - (__pAd->RfIcType == RFIC_P18) || (__pAd->RfIcType == RFIC_7663) || \ - (__pAd->RfIcType == RFIC_UNKNOWN)) - -#define BOARD_IS_2G_ONLY(__pAd) 0 -#define BOARD_IS_5G_ONLY(__pAd) \ - ((__pAd->RfIcType == RFIC_7611) || (__pAd->RfIcType == RFIC_7615A)) -#define BOARD_IS_NO_256QAM(__pAd) (__pAd->RfIcType == RFIC_7616) - -typedef enum { - RX_CHAIN_0 = 1 << 0, - RX_CHAIN_1 = 1 << 1, - RX_CHAIN_2 = 1 << 2, - RX_CHAIN_ALL = 0xf -} RX_CHAIN_IDX; - -/* */ -/* BBP R49 TSSI (Transmit Signal Strength Indicator) */ -/* */ -#ifdef RT_BIG_ENDIAN -typedef union _BBP_R49_STRUC { - struct { - UCHAR adc5_in_sel : 1; /* 0: TSSI (from the external components, old version), 1: PSI (internal components, new version - RT3390) */ - UCHAR bypassTSSIAverage : 1; /* 0: the average TSSI (the average of the 16 samples), 1: the current TSSI */ - UCHAR Reserved : 1; /* Reserved field */ - UCHAR TSSI : 5; /* TSSI value */ - } field; - - UCHAR byte; -} BBP_R49_STRUC, *PBBP_R49_STRUC; -#else -typedef union _BBP_R49_STRUC { - struct { - UCHAR TSSI : 5; /* TSSI value */ - UCHAR Reserved : 1; /* Reserved field */ - UCHAR bypassTSSIAverage : 1; /* 0: the average TSSI (the average of the 16 samples), 1: the current TSSI */ - UCHAR adc5_in_sel : 1; /* 0: TSSI (from the external components, old version), 1: PSI (internal components, new version - RT3390) */ - } field; - - UCHAR byte; -} BBP_R49_STRUC, *PBBP_R49_STRUC; -#endif - -#define MAX_BBP_MSG_SIZE 4096 - -/* */ -/* BBP & RF are using indirect access. Before write any value into it. */ -/* We have to make sure there is no outstanding command pending via checking busy bit. */ -/* */ -#ifdef COMPOS_WIN -#define MAX_BUSY_COUNT \ - 20 /* Number of retry before failing access BBP & RF indirect register */ -#else -#define MAX_BUSY_COUNT \ - 100 /* Number of retry before failing access BBP & RF indirect register */ -#define MAX_BUSY_COUNT_US \ - 2000 /* Number of retry before failing access BBP & RF indirect register */ -#endif - -/*#define PHY_TR_SWITCH_TIME 5 // usec */ - -#define RSSI_FOR_VERY_LOW_SENSIBILITY -35 -#define RSSI_FOR_LOW_SENSIBILITY -58 -#define RSSI_FOR_MID_LOW_SENSIBILITY -65 /*-80*/ -#define RSSI_FOR_MID_SENSIBILITY -90 - -struct _RTMP_ADAPTER; - -struct rx_signal_info { - CHAR raw_rssi[4]; - UCHAR raw_snr[4]; - CHAR freq_offset; -}; - -typedef struct _RSSI_SAMPLE { - CHAR LastRssi[4]; /* last received RSSI for ant 0~2 */ - CHAR AvgRssi[4]; - SHORT AvgRssiX8[4]; - CHAR LastSnr[4]; - CHAR AvgSnr[4]; - SHORT AvgSnrX8[4]; - /*CHAR LastNoiseLevel[3]; */ -} RSSI_SAMPLE; - -typedef enum ChannelSelAlg { - ChannelAlgRandom, /*use by Dfs */ - ChannelAlgApCnt, - ChannelAlgCCA, - ChannelAlgBusyTime -} ChannelSel_Alg; - -/***************************************************************************** - RF register Read/Write marco definition - *****************************************************************************/ - -/***************************************************************************** - BBP register Read/Write marco definitions. - we read/write the bbp value by register's ID. - Generate PER to test BA - *****************************************************************************/ - -#define _G_BAND 0x0 -#define _A_BAND 0x1 -#define _BAND 0x3 - -#define _BW_20 (0x0 << 2) -#define _BW_40 (0x1 << 2) -#define _BW_80 (0x2 << 2) -#define _BW_160 (0x3 << 2) -#define _BW (0x3 << 2) - -#define RF_Path0 0 -#define RF_Path1 1 - -#define _1T1R (0x0 << 4) -#define _2T1R (0x1 << 4) -#define _1T2R (0x2 << 4) -#define _2T2R (0x3 << 4) -#define _TX_RX_SETTING (0x3 << 4) - -#define _LT (0x0 << 6) -#define _HT (0x1 << 6) -#define _TEM_SETTING (0x1 << 6) - -INT bbp_set_bw(struct _RTMP_ADAPTER *pAd, UINT8 bw, UCHAR BandIdx); -INT bbp_set_ctrlch(struct _RTMP_ADAPTER *pAd, UINT8 ext_ch); -INT bbp_set_rxpath(struct _RTMP_ADAPTER *pAd, INT rxpath); -INT bbp_get_temp(struct _RTMP_ADAPTER *pAd, CHAR *temp_val); -INT bbp_tx_comp_init(struct _RTMP_ADAPTER *pAd, INT adc_insel, INT tssi_mode); -INT bbp_set_txdac(struct _RTMP_ADAPTER *pAd, INT tx_dac); -INT bbp_set_mmps(struct _RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower); -INT bbp_is_ready(struct _RTMP_ADAPTER *pAd); -INT bbp_set_agc(struct _RTMP_ADAPTER *pAd, UCHAR agc, RX_CHAIN_IDX idx); -INT bbp_get_agc(struct _RTMP_ADAPTER *pAd, CHAR *agc, RX_CHAIN_IDX idx); -INT filter_coefficient_ctrl(struct _RTMP_ADAPTER *pAd, UCHAR Channel); -UCHAR get_random_seed_by_phy(struct _RTMP_ADAPTER *pAd); -#ifdef DYNAMIC_VGA_SUPPORT -INT dynamic_vga_enable(struct _RTMP_ADAPTER *pAd); -INT dynamic_vga_disable(struct _RTMP_ADAPTER *pAd); -INT dynamic_vga_adjust(struct _RTMP_ADAPTER *pAd); -#endif /* DYNAMIC_VGA_SUPPORT */ -#ifdef SMART_CARRIER_SENSE_SUPPORT -INT Smart_Carrier_Sense(struct _RTMP_ADAPTER *pAd); -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -NDIS_STATUS NICInitBBP(struct _RTMP_ADAPTER *pAd); -VOID InitRFRegisters(struct _RTMP_ADAPTER *pAd); -INT32 ShowAllBBP(struct _RTMP_ADAPTER *pAd); -INT32 ShowPartialBBP(struct _RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End); -INT32 ShowAllRF(struct _RTMP_ADAPTER *pAd); -INT32 ShowPartialRF(struct _RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End); -#ifdef CONFIG_AP_SUPPORT -UCHAR AutoCh(struct _RTMP_ADAPTER *pAd, ChannelSel_Alg Alg, BOOLEAN IsABand); -#endif /*CONFIG_AP_SUPPORT*/ - -typedef struct phy_ops { - INT (*bbp_is_ready)(struct _RTMP_ADAPTER *pAd); - UCHAR (*get_random_seed_by_phy)(struct _RTMP_ADAPTER *pAd); - INT(*filter_coefficient_ctrl) - (struct _RTMP_ADAPTER *pAd, UCHAR Channel); - INT(*bbp_set_agc) - (struct _RTMP_ADAPTER *pAd, UCHAR agc, RX_CHAIN_IDX chain); - INT(*bbp_get_agc) - (struct _RTMP_ADAPTER *pAd, CHAR *agc, RX_CHAIN_IDX chain); - INT (*bbp_set_mmps)(struct _RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower); - INT (*bbp_set_bw)(struct _RTMP_ADAPTER *pAd, UINT8 bw); - INT (*bbp_set_ctrlch)(struct _RTMP_ADAPTER *pAd, UINT8 ext_ch); - INT (*bbp_set_rxpath)(struct _RTMP_ADAPTER *pAd, INT rxpath); - INT (*bbp_set_txdac)(struct _RTMP_ADAPTER *pAd, INT tx_dac); - INT(*bbp_tx_comp_init) - (struct _RTMP_ADAPTER *pAd, INT adc_insel, INT tssi_mode); - INT (*bbp_get_temp)(struct _RTMP_ADAPTER *pAd, CHAR *temp_val); - INT (*bbp_init)(struct _RTMP_ADAPTER *pAd); -#ifdef DYNAMIC_VGA_SUPPORT - INT (*dynamic_vga_enable)(struct _RTMP_ADAPTER *pAd); - INT (*dynamic_vga_disable)(struct _RTMP_ADAPTER *pAd); - INT (*dynamic_vga_adjust)(struct _RTMP_ADAPTER *pAd); -#endif /* DYNAMIC_VGA_SUPPORT */ - INT32(*ShowPartialBBP) - (struct _RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End); - INT32 (*ShowAllBBP)(struct _RTMP_ADAPTER *pAd); - INT32(*ShowPartialRF) - (struct _RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End); - INT32 (*ShowAllRF)(struct _RTMP_ADAPTER *pAd); -#ifdef CONFIG_AP_SUPPORT - UCHAR(*AutoCh) - (struct _RTMP_ADAPTER *pAd, struct wifi_dev *pwdev, ChannelSel_Alg Alg, - BOOLEAN IsABand); -#endif /*CONFIG_AP_SUPPORT*/ -#ifdef SMART_CARRIER_SENSE_SUPPORT - INT (*Smart_Carrier_Sense)(struct _RTMP_ADAPTER *pAd); -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -} PHY_OPS; - -#endif /* __PHY_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/rlm_cal_cache.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/rlm_cal_cache.h deleted file mode 100644 index 4e8fd3bc6d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/rlm_cal_cache.h +++ /dev/null @@ -1,222 +0,0 @@ - -#ifndef __RLM_CAL_CACHE_H__ -#define __RLM_CAL_CACHE_H__ - -#include "rtmp_type.h" - -#ifdef PRE_CAL_MT7622_SUPPORT -#define SCN_NUM_MT7622 4 -#define TXLPFG_ADDR_NUM 1 -#define TXDCIQ_ADDR_NUM 12 -#define TXDPD_ADDR_NUM 76 -#endif /* PRE_CAL_MT7622_SUPPORT */ -#define SCN_NUM 6 - -#define RX_SWAGC_LNA_NUM 2 -#define RX_FDIQ_LPF_GAIN_NUM 3 -#define RX_FDIQ_TABLE_SIZE 6 - -#define CHANNEL2G4_GROUP 0 -#define CHANNEL5G_GROUP_1 1 -#define CHANNEL5G_GROUP_2 2 -#define CHANNEL5G_GROUP_3 3 -#define CHANNEL5G_GROUP_4 4 -#define CHANNEL5G_GROUP_5 5 -#define CHANNEL5G_GROUP_6 6 -#define CHANNEL5G_GROUP_7 7 -#define CHANNEL5G_GROUP_8 8 - -#ifdef PRE_CAL_MT7622_SUPPORT -#define CHANNEL_GROUP_NUM_MT7622 1 -#endif /*PRE_CAL_MT7622_SUPPORT*/ - -#define CHANNEL_GROUP_NUM 9 - -#define TXLPF_PER_GROUP_DATA_SIZE (SCN_NUM * sizeof(UINT32)) -#define TXIQ_PER_GROUP_DATA_SIZE (SCN_NUM * 6 * sizeof(UINT32)) -#define TXDC_PER_GROUP_DATA_SIZE (SCN_NUM * 6 * sizeof(UINT32)) -#define RXFI_PER_GROUP_DATA_SIZE (SCN_NUM * 4 * sizeof(UINT32)) -#define RXFD_PER_GROUP_DATA_SIZE \ - (((SCN_NUM * RX_SWAGC_LNA_NUM) + \ - (SCN_NUM * RX_FDIQ_LPF_GAIN_NUM * RX_FDIQ_TABLE_SIZE * 3)) * \ - sizeof(UINT32)) - -#define PRECAL_FLASH_MODE 1 - -#define RLM_CAL_CACHE_TXLPF_CAL_INFO(_C) (((P_RLM_CAL_CACHE)(_C))->txLpfCalInfo) -#define RLM_CAL_CACHE_TXIQ_CAL_INFO(_C) (((P_RLM_CAL_CACHE)(_C))->txIqCalInfo) -#define RLM_CAL_CACHE_TXDC_CAL_INFO(_C) (((P_RLM_CAL_CACHE)(_C))->txDcCalInfo) -#define RLM_CAL_CACHE_RXFI_CAL_INFO(_C) (((P_RLM_CAL_CACHE)(_C))->rxFiCalInfo) -#define RLM_CAL_CACHE_RXFD_CAL_INFO(_C, _I) \ - (((P_RLM_CAL_CACHE)(_C))->rxFdCalInfo[(_I)]) - -//#define BIT(n) ((UINT32) 1 << (n)) -#define TXPLF_READY BIT(0) -#define TXIQ_READY BIT(1) -#define TXPDC_READY BIT(2) -#define RXFI_READY BIT(3) -#define RXFD_GROUP_READY(_I) BIT((_I) + 4) - -#define RLM_CAL_CACHE_TXLPF_CAL_DONE(_C) \ - ((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) |= TXPLF_READY) -#define RLM_CAL_CACHE_TXIQ_CAL_DONE(_C) \ - ((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) |= TXIQ_READY) -#define RLM_CAL_CACHE_TXDC_CAL_DONE(_C) \ - ((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) |= TXPDC_READY) -#define RLM_CAL_CACHE_RXFI_CAL_DONE(_C) \ - ((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) |= RXFI_READY) -#define RLM_CAL_CACHE_RXFD_CAL_DONE(_C, _I) \ - ((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) |= RXFD_GROUP_READY(_I)) - -#define RLM_CAL_CACHE_IS_TXLPF_CAL_DONE(_C) \ - (((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) & TXPLF_READY) == TXPLF_READY) -#define RLM_CAL_CACHE_IS_TXIQ_CAL_DONE(_C) \ - (((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) & TXIQ_READY) == TXIQ_READY) -#define RLM_CAL_CACHE_IS_TXDC_CAL_DONE(_C) \ - (((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) & TXPDC_READY) == TXPDC_READY) -#define RLM_CAL_CACHE_IS_RXFI_CAL_DONE(_C) \ - (((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) & RXFI_READY) == RXFI_READY) -#define RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, _I) \ - (((((P_RLM_CAL_CACHE)(_C))->rlmCalStatus) & RXFD_GROUP_READY(_I)) == \ - RXFD_GROUP_READY(_I)) - -#define RLM_CAL_CACHE_IS_DONE(_C) \ - RLM_CAL_CACHE_IS_RXFI_CAL_DONE(_C) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 0) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 1) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 2) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 3) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 4) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 5) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 6) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 7) & \ - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(_C, 8) - -#define RLM_PRECAL_TXLPF_TO_FLASH_CHECK(_C) \ - ((((P_TXLPF_CAL_INFO_T)(_C))->ucDataToFromFlash) == PRECAL_FLASH_MODE) -#define RLM_PRECAL_TXIQ_TO_FLASH_CHECK(_C) \ - ((((P_TXIQ_CAL_INFO_T)(_C))->ucDataToFromFlash) == PRECAL_FLASH_MODE) -#define RLM_PRECAL_TXDC_TO_FLASH_CHECK(_C) \ - ((((P_TXDC_CAL_INFO_T)(_C))->ucDataToFromFlash) == PRECAL_FLASH_MODE) -#define RLM_PRECAL_RXFI_TO_FLASH_CHECK(_C) \ - ((((P_RXFI_CAL_INFO_T)(_C))->ucDataToFromFlash) == PRECAL_FLASH_MODE) -#define RLM_PRECAL_RXFD_TO_FLASH_CHECK(_C) \ - ((((P_RXFD_CAL_INFO_T)(_C))->ucDataToFromFlash) == PRECAL_FLASH_MODE) - -typedef struct _TXLPF_CAL_INFO_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - INT8 cPreCalTemp; - UINT8 ucReserved[3]; - UINT32 au4Data[CHANNEL_GROUP_NUM * SCN_NUM]; -} TXLPF_CAL_INFO_T, *P_TXLPF_CAL_INFO_T; - -#ifdef PRE_CAL_MT7622_SUPPORT -typedef struct _TXLPF_CAL_INFO_MT7622_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - INT8 cPreCalTemp; - UINT8 ucReserved[3]; - UINT32 au4Data[CHANNEL_GROUP_NUM_MT7622 * SCN_NUM_MT7622]; -} TXLPF_CAL_INFO_MT7622_T, *P_TXLPF_CAL_INFO_MT7622_T; - -typedef struct _TXDCIQ_CAL_INFO_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - INT8 cPreCalTemp; - UINT8 ucReserved[3]; - UINT32 au4Data[CHANNEL_GROUP_NUM_MT7622 * SCN_NUM_MT7622 * - TXDCIQ_ADDR_NUM]; -} TXDCIQ_CAL_INFO_T, *P_TXDCIQ_CAL_INFO_T; - -typedef struct _TXDPD_CAL_INFO_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - UINT32 u4Chan; - UINT32 au4Data[SCN_NUM_MT7622 * TXDPD_ADDR_NUM]; -} TXDPD_CAL_INFO_T, *P_TXDPD_CAL_INFO_T; -#endif /*PRE_CAL_MT7622_SUPPORT*/ -typedef struct _TXIQ_CAL_INFO_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - UINT32 au4Data[CHANNEL_GROUP_NUM * SCN_NUM * 6]; -} TXIQ_CAL_INFO_T, *P_TXIQ_CAL_INFO_T; - -typedef struct _TXDC_CAL_INFO_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - UINT32 au4Data[CHANNEL_GROUP_NUM * SCN_NUM * 6]; -} TXDC_CAL_INFO_T, *P_TXDC_CAL_INFO_T; - -typedef struct _RXFI_CAL_INFO_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - UINT32 au4Data[CHANNEL_GROUP_NUM * SCN_NUM * 4]; -} RXFI_CAL_INFO_T, *P_RXFI_CAL_INFO_T; - -typedef struct _RXFD_CAL_INFO_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - UINT32 u4ChGroupId; - UINT32 au4Data[(SCN_NUM * RX_SWAGC_LNA_NUM) + - (SCN_NUM * RX_FDIQ_LPF_GAIN_NUM * RX_FDIQ_TABLE_SIZE * - 3)]; -} RXFD_CAL_INFO_T, *P_RXFD_CAL_INFO_T; - -typedef struct _RXFD_CAL_CACHE_T { - UINT8 ucDataToFromFlash; - UINT8 ucDataValid; - UINT16 u2BitMap; - UINT32 u4ChGroupId; - UINT32 au4Data[(SCN_NUM * RX_SWAGC_LNA_NUM) + - (SCN_NUM * RX_FDIQ_LPF_GAIN_NUM * RX_FDIQ_TABLE_SIZE * - 3)]; -} RXFD_CAL_CACHE_T, *P_RXFD_CAL_CACHE_T; - -typedef struct _RLM_POR_CAL_INFO_T { - UINT8 ucRlmPorCal; - UINT8 aucReserved[3]; -} RLM_POR_CAL_INFO_T, *P_RLM_POR_CAL_INFO_T; - -typedef struct _RLM_CAL_CACHE { - UINT32 rlmCalStatus; - TXLPF_CAL_INFO_T txLpfCalInfo; - TXIQ_CAL_INFO_T txIqCalInfo; - TXDC_CAL_INFO_T txDcCalInfo; - RXFI_CAL_INFO_T rxFiCalInfo; - RXFD_CAL_CACHE_T rxFdCalInfo[CHANNEL_GROUP_NUM]; -} RLM_CAL_CACHE, *P_RLM_CAL_CACHE; - -INT rlmCalCacheDone(VOID *rlmCalCache); -INT rlmCalCacheInit(VOID *pAd, VOID **ppRlmCalCache); -INT rlmCalCacheDeinit(VOID **ppRlmCalCache); -INT RlmCalCacheTxLpfInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length); -INT RlmCalCacheTxIqInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length); -INT RlmCalCacheTxDcInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length); -INT RlmCalCacheRxFiInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length); -INT RlmCalCacheRxFdInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length); -VOID rlmCalCacheStatus(VOID *rlmCalCache); -VOID rlmCalCacheDump(VOID *rlmCalCache); - -INT TxLpfCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr); -INT TxIqCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr); -INT TxDcCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr); -INT RxFiCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr); -INT RxFdCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr, UINT32 chGroup); -INT RlmPorCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr); - -#ifdef PRE_CAL_MT7622_SUPPORT -INT TxLpfCalInfoAlloc_7622(struct _RTMP_ADAPTER *pAd, VOID **pptr); -INT TxDcIqCalInfoAlloc_7622(struct _RTMP_ADAPTER *pAd, VOID **pptr); -INT TxDpdCalInfoAlloc_7622(RTMP_ADAPTER *pAd, VOID **pptr, UINT32 chan); -#endif /* PRE_CAL_MT7622_SUPPORT */ - -#endif /* __RLM_CAL_CACHE_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/wf_phy_back.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/wf_phy_back.h deleted file mode 100644 index 785ec581dd..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/phy/wf_phy_back.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * (c) Copyright 2013, MediaTek, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - wf_phy_back.h - - Abstract: - Unify MAC Wireless Chip related PHY CRs definition & structures - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - mtk05208 20131102 Start coding for TxV, RxV, CR_PHYMUX_11 -*/ - -/* Ref. wf_phycr_back.doc */ -#ifndef __WF_PHY_BACK_H__ -#define __WF_PHY_BACK_H__ - -/*#define WF_PHY_BASE 0x00010000 */ - -/* ??? */ -/*#define CR_PHYMUX_11 (WF_PHY_BASE + 0x422c) */ -typedef union _CR_PHYMUX_11_STRUCT { - struct { - UINT32 rsv_0 : 16; - UINT32 cr_phymux_num_rx : 2; - UINT32 rsv_1 : 2; - UINT32 cr_phymux_rx1_on : 1; - UINT32 cr_phymux_rx0_on : 1; - UINT32 rsv_2 : 4; - UINT32 cr_phymux_tx1_on : 1; - UINT32 cr_phymux_tx0_on : 1; - UINT32 rsv_3 : 1; - UINT32 cr_phymux_tx_ant_man : 1; - } field; - UINT32 word; -} CR_PHYMUX_11_STRUCT; - -/* Tx Vector */ -#define CR_PHYMUX_12 (WF_PHY_BASE + 0x4230) -#define CR_PHYMUX_13 (WF_PHY_BASE + 0x4234) -#define CR_PHYMUX_14 (WF_PHY_BASE + 0x4238) -#define CR_PHYMUX_15 (WF_PHY_BASE + 0x423c) -#define CR_PHYMUX_16 (WF_PHY_BASE + 0x4240) -#define CR_PHYMUX_17 (WF_PHY_BASE + 0x4244) - -#define TXV1 CR_PHYMUX_12 -#define TXV2 CR_PHYMUX_13 -#define TXV3 CR_PHYMUX_14 -#define TXV4 CR_PHYMUX_15 -#define TXV5 CR_PHYMUX_16 -#define TXV6 CR_PHYMUX_17 - -/* Rx Vector */ -#define CR_PHYMUX_18 (WF_PHY_BASE + 0x4248) -#define CR_PHYMUX_19 (WF_PHY_BASE + 0x425c) -#define CR_PHYMUX_20 (WF_PHY_BASE + 0x4250) -#define CR_PHYMUX_21 (WF_PHY_BASE + 0x4254) -#define CR_PHYMUX_22 (WF_PHY_BASE + 0x4258) -#define CR_PHYMUX_23 (WF_PHY_BASE + 0x425c) - -#define RXV1 CR_PHYMUX_18 -typedef union _RO_RXV1_STRUCT { - struct { -#define LEGACY_CCK_MSK 0x7 -#define LEGACY_OFDM_MSK 0xf - UINT32 tx_rate : 7; /*[0..6] */ - UINT32 ht_stbc : 2; /*[7..8] */ -#define BCC 0x0 -#define LDPC 0x1 - UINT32 ht_adcode : 1; /*[9] */ - UINT32 ht_ext_ltf : 2; /*[10..11] */ -#define LEGACY_CCK_MODE 0x0 -#define LEGACY_OFDM_MODE 0x1 -#define MIXED_MODE 0x2 -#define GREEN_MODE 0x3 -#define VHT_MODE 0x4 - UINT32 tx_mode : 3; /*[12..14] */ -#define FEQ_20M_MODE 0x0 -#define FEQ_40M_MODE 0x1 -#define FEQ_80M_MODE 0x2 -#define FEQ_160M_MODE 0x3 - UINT32 fr_mode : 2; /*[15..16] */ - UINT32 vht_a1_b2 : 1; /*[17] */ - UINT32 ht_aggregation : 1; /*[18] */ - UINT32 ht_short_gi : 1; /*[19]*/ - UINT32 ht_smooth : 1; /*[20]*/ - UINT32 ht_no_sound : 1; /*[21]*/ - UINT32 vhta2_b8_b1 : 8; /*[22..29]*/ - UINT32 vhta1_b5_b4 : 2; /*[30..31]*/ - } field; - UINT32 word; -} RO_RXV1_STRUCT; - -#define RXV2 CR_PHYMUX_19 -typedef union _RO_RXV2_STRUCT { - struct { -#define LEGACY_RX_LEN_MSK 0x00000fff -#define HT_RX_LEN_MSK 0x0000ffff -#define VHT_RX_LEN_MSK 0x001fffff - UINT32 length : 21; - UINT32 vhta1_b16_b6 : 11; - } field; - UINT32 word; -} RO_RXV2_STRUCT; - -#define RXV3 CR_PHYMUX_20 -typedef union _RO_RXV3_STRUCT { - struct { - UINT32 vhta1_b21_b17 : 5; - UINT32 ofdm_freq_trans_detect : 1; - UINT32 aci_detect : 1; - UINT32 sel_antenna : 1; - UINT32 rcpi0 : 8; - UINT32 fagc0_eq_cal : 1; - UINT32 fagc0_cal_gain : 3; - UINT32 rcpi1 : 8; - UINT32 fagc1_eq_cal : 1; - UINT32 fagc1_cal_gain : 3; - } field; - UINT32 word; -} RO_RXV3_STRUCT; - -#define RXV4 CR_PHYMUX_21 -typedef union _RO_RXV4_STRUCT { - struct { - UINT32 ib_rssi : 8; - UINT32 wb_rssi : 8; - UINT32 fagc_lpf_gain : 4; - UINT32 rcpi2 : 8; - UINT32 fagc2_eq_cal : 1; - UINT32 fagc2_cal_gain : 3; - } field; - UINT32 word; -} RO_RXV4_STRUCT; - -#define RXV5 CR_PHYMUX_22 -typedef union _RO_RXV5_STRUCT { - struct { - UINT32 fagc_lna_gain : 2; - UINT32 rsv_0 : 5; -#define RXV5_MISC_OFDM_FOE 0x0fff -#define RXV5_MISC_OFDM_LTF_PROC_TIME (0x7f << 12) -#define RXV5_MISC_OFDM_LTF_SNR (0x3f << 19) -#define RXV5_MISC_CCK_FOE 0x07ff -#define RXV5_MISC_CCK_INIT_DFE_LMS_ERR (0x3ff << 11) - UINT32 misc : 25; - } field; - UINT32 word; -} RO_RXV5_STRUCT; - -#define RXV6 CR_PHYMUX_23 -typedef union _RO_RXV6_STRUCT { - struct { - UINT32 nf0 : 8; - UINT32 nf1 : 8; - UINT32 nf2 : 8; - UINT32 rx_valid_indicator : 1; - UINT32 nsts : 3; - UINT32 cags_state : 3; - UINT32 rsv_0 : 1; - } field; - UINT32 word; -} RO_RXV6_STRUCT; - -#endif /* __WF_PHY_BACK_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/protocol/protection.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/protocol/protection.h deleted file mode 100644 index 5a245b56e6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/protocol/protection.h +++ /dev/null @@ -1,75 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2016, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - - - Module Name: - protection.h - - Abstract: - Generic 802.11 Legacy/HT/nonHT Protection Mechanism - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Hugo 2016-0505 create - -*/ - -#ifndef __PROTECTION_H__ -#define __PROTECTION_H__ - -struct _MAC_TABLE_ENTRY; -struct _BSS_STRUCT; - -enum ht_protection { - NON_PROTECT = 0, - NONMEMBER_PROTECT = 1, - BW20_PROTECT = 2, - NONHT_MM_PROTECT = 3 -}; - -enum peer_state { PEER_JOIN = 0, PEER_LEAVE }; - -enum protection { - /* 11n */ - NO_PROTECTION, - NON_MEMBER_PROTECT, - HT20_PROTECT, - NON_HT_MIXMODE_PROTECT, - _NOT_DEFINE_HT_PROTECT, - /* b/g */ - ERP, - /* vendor */ - LONG_NAV_PROTECT, - RDG_PROTECT = LONG_NAV_PROTECT, - GREEN_FIELD_PROTECT, - RIFS_PROTECT, - RDG, - FORCE_RTS_PROTECT, - _NOT_DEFINE_VENDOR_PROTECT, - _END_PROTECT -}; - -#define SET_PROTECT(x) (1 << (x)) - -#ifdef CONFIG_AP_SUPPORT - -UINT16 nonerp_sta_num(struct _MAC_TABLE_ENTRY *peer, UCHAR peer_state); -UCHAR nonerp_protection(struct _BSS_STRUCT *bss_struct); - -#endif - -#endif /* __PROTECTION_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/protocol/tmr.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/protocol/tmr.h deleted file mode 100644 index 0bdb2642fc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/protocol/tmr.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - tmr.h - - Abstract: - 802.11v-Timing Measurement, - 802.11mc-Fine Timing Measurement related function and state machine - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Carter 2014-1120 create - -*/ - -#ifndef _TMR_H_ -#define _TMR_H_ - -#ifdef MT_MAC -#ifndef COMPOS_TESTMODE_WIN -#include "rtmp.h" -#endif - -enum TMR_TYPE { TMR_DISABLE = 0, TMR_INITIATOR, TMR_RESPONDER }; - -enum TMR_IDENRIRY { TMR_IR0_TX = 0, TMR_IR1_RX = 1 }; - -enum TMR_INITIATOR_SEND_PKT_STATE { SEND_IDLE = 0, SEND_OUT }; - -VOID TmrReportParser(struct _RTMP_ADAPTER *pAd, TMR_FRM_STRUC *tmr, - BOOLEAN fgFinalResult, UINT32 TOAECalibrationResult); - -VOID MtSetTmrEnable(struct _RTMP_ADAPTER *pAd, UCHAR enable); -INT TmrCtrlInit(struct _RTMP_ADAPTER *pAd, UCHAR TmrType, UCHAR Ver); - -VOID TmrCtrl(struct _RTMP_ADAPTER *pAd, UCHAR enable, UCHAR Ver); - -#endif /* MT_MAC */ -#endif /* _TMR_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/rate_ctrl/ra_ctrl.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/rate_ctrl/ra_ctrl.h deleted file mode 100644 index e82a5d3a4d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/rate_ctrl/ra_ctrl.h +++ /dev/null @@ -1,1387 +0,0 @@ -/** $Id: $ -*/ - -/*! \file "ra_ctrl.h" - \brief All Dynamic Rate Switch Related Structure & Definition -*/ - -/******************************************************************************* -* Copyright (c) 2014 MediaTek Inc. -* -* All rights reserved. Copying, compilation, modification, distribution -* or any other use whatsoever of this material is strictly prohibited -* except in accordance with a Software License Agreement with -* MediaTek Inc. -******************************************************************************** -*/ - -/******************************************************************************* -* LEGAL DISCLAIMER -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND -* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK -* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE -* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY -* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE -* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY -* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK -* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY -* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE -* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO -* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL -* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT -* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY -* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT -* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING -* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN -* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE -* (ICC). -******************************************************************************** -*/ - -/* -** $Log: ra_ctrl.h $ -** -** -** -*/ - -#ifndef __RA_CTRL_H__ -#define __RA_CTRL_H__ - -#ifdef WIFI_BUILD_RAM -#if (CFG_WIFI_DRIVER_OFFLOAD_RATE_CTRL == 1) -#define MT_MAC -#define DOT11_N_SUPPORT -#define MCS_LUT_SUPPORT - -#if (PRODUCT_VERSION == 7636) -#define NEW_RATE_ADAPT_SUPPORT -#endif - -#if (PRODUCT_VERSION == 7615 || PRODUCT_VERSION == 7637 || \ - PRODUCT_VERSION == 7622) -#define RATE_ADAPT_AGBS_SUPPORT -#define DOT11_VHT_AC -#endif - -#endif -#endif /* WIFI_BUILD_RAM */ -/******************************************************************************* -* C O N S T A N T S -******************************************************************************** -*/ - -/* Values of LastSecTxRateChangeAction */ -#define RATE_NO_CHANGE 0 /* No change in rate */ -#define RATE_UP 1 /* Trying higher rate or same rate with different BF */ -#define RATE_DOWN 2 /* Trying lower rate */ -#define RATE_BW_DOWN 3 -#define RATE_BW_UP 4 -#define RATE_BW_STATE 5 - -#define PER_THRD_ADJ 1 - -#define RA_MAX_INIT_RATE_ENTRY 10 - -#define RA_WAPI_PHY_RATE_UPPER_BOUND 1000 - -#define RA_INIT_RATE_BY_RSSI 1 -#define RA_INIT_RATE_BY_LAST_RATE 2 -#define RA_INIT_RATE_TRACKING 3 - -#define RA_DYNAMIC_BW_DISABLE 0 -#define RA_DYNAMIC_BW_DOWN 1 -#define RA_DYNAMIC_BW_UP 2 - -#define RA_LOW_TRAFFIC_TRACKING_THRD 3 - -#define RA_TRAIN_UP_HIGH_NSSOFFSET 5 - -#define AGBS_NSS_CHANGE_FLAG 0x80 -#define AGBS_UPRATE_SGI_FLAG 0x40 -#define AGBS_UPRATE_DOWNRATE_INVALID 0xFF - -#define DRS_TX_QUALITY_WORST_BOUND 8 /* 3 */ - -/* Rate Adaptation timing */ -#define DEF_QUICK_RA_TIME_INTERVAL 100 -#define DEF_RA_TIME_INTRVAL 500 -#define RA_RATE 5 /* RA every fifth 100msec period */ -#define RA_INTERVAL (RA_RATE * 100) /* RA Interval in msec */ - -/* #define RA_RMDS_THRD 12 */ -#define RA_RMDS_THRD 16 /* MT7615 disable dynamic SGI by RMSD */ - -#define RA_MAX_SUPPORT_MCS 26 - -#define GET_TX_STAT_TOTAL_TX_CNT 0x00000001 -#define GET_TX_STAT_LAST_TX_RATE 0x00000002 -#define GET_TX_STAT_ENTRY_TX_RATE 0x00000004 -#define GET_TX_STAT_ENTRY_TX_CNT 0x00000008 - -#define HT_LDPC 0x01 -#define VHT_LDPC 0x02 - -#define G_BAND_256QAM_AMPDU_FACTOR 7 - -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) -#define GET_WTBL_TX_COUNT 0x00000001 -#define GET_WTBL_PER_BSS_TX_COUNT 0x00000002 -#define GET_WTBL_PER_STA_TX_COUNT 0x00000004 -#endif - -#define LIMIT_MAX_PHY_RATE_THRESHOLD 50 -#define MAX_PHY_RATE_3SS 1300 -#define MAX_PHY_RATE_2SS 866 - -/* Maximum Tx Rate Table Index value */ -#ifdef RATE_ADAPT_AGBS_SUPPORT -#define MAX_TX_QUALITY_INDEX 4 -#else -#define MAX_TX_QUALITY_INDEX 34 -#endif - -#define TX_QUALITY_NSS_KEEP 0 -#define TX_QUALITY_NSS_UP 1 -#define TX_QUALITY_NSS_DN 2 -#define TX_QUALITY_BW_UP 3 - -#define SGI_20 1 -#define SGI_40 2 -#define SGI_80 4 -#define SGI_160 8 - -#ifdef WIFI_BUILD_RAM -#define OPMODE_STA 0 -#define OPMODE_AP 1 - -#define RATE_1 0 -#define RATE_2 1 -#define RATE_5_5 2 -#define RATE_11 3 - -#define MCS_0 0 /* 1S */ -#define MCS_1 1 -#define MCS_2 2 -#define MCS_3 3 -#define MCS_4 4 -#define MCS_5 5 -#define MCS_6 6 -#define MCS_7 7 -#define MCS_8 8 /* 2S */ -#define MCS_9 9 -#define MCS_10 10 -#define MCS_11 11 -#define MCS_12 12 -#define MCS_13 13 -#define MCS_14 14 -#define MCS_15 15 -#define MCS_16 16 /* 3S */ -#define MCS_17 17 -#define MCS_18 18 -#define MCS_19 19 -#define MCS_20 20 -#define MCS_21 21 -#define MCS_22 22 -#define MCS_23 23 -#define MCS_24 24 /* 4S */ -#define MCS_25 25 -#define MCS_26 26 -#define MCS_27 27 -#define MCS_28 28 -#define MCS_29 29 -#define MCS_30 30 -#define MCS_31 31 -#define MCS_32 32 -#define MCS_AUTO 33 - -#define TMI_TX_RATE_BIT_STBC 11 -#define TMI_TX_RATE_BIT_NSS 9 -#define TMI_TX_RATE_MASK_NSS 0x3 -#define TMI_TX_RATE_MASK_MCS 0x3f - -#define SHORT_PREAMBLE 0 -#define LONG_PREAMBLE 1 - -#define TMI_TX_RATE_BIT_MODE 6 -#define TMI_TX_RATE_MASK_MODE 0x7 -#define TMI_TX_RATE_MODE_CCK 0 -#define TMI_TX_RATE_MODE_OFDM 1 -#define TMI_TX_RATE_MODE_HTMIX 2 -#define TMI_TX_RATE_MODE_HTGF 3 -#define TMI_TX_RATE_MODE_VHT 4 - -#define TMI_TX_RATE_CCK_1M_LP 0 -#define TMI_TX_RATE_CCK_2M_LP 1 -#define TMI_TX_RATE_CCK_5M_LP 2 -#define TMI_TX_RATE_CCK_11M_LP 3 - -#define TMI_TX_RATE_CCK_2M_SP 5 -#define TMI_TX_RATE_CCK_5M_SP 6 -#define TMI_TX_RATE_CCK_11M_SP 7 - -#define TMI_TX_RATE_OFDM_6M 11 -#define TMI_TX_RATE_OFDM_9M 15 -#define TMI_TX_RATE_OFDM_12M 10 -#define TMI_TX_RATE_OFDM_18M 14 -#define TMI_TX_RATE_OFDM_24M 9 -#define TMI_TX_RATE_OFDM_36M 13 -#define TMI_TX_RATE_OFDM_48M 8 -#define TMI_TX_RATE_OFDM_54M 12 - -#define MAX_LEN_OF_CCK_RATES 4 -#define MAX_LEN_OF_OFDM_RATES 8 -#define MAX_LEN_OF_HT_RATES 24 -#ifdef DOT11_VHT_AC -#define MAX_LEN_OF_VHT_RATES 20 -#endif /* DOT11_VHT_AC */ - -/* BW */ -#define BW_20 0 -#define BW_40 1 -#define BW_80 2 -#define BW_160 3 -#define BW_10 4 -#define BW_5 5 -#define BW_8080 6 - -#define MODE_CCK 0 -#define MODE_OFDM 1 -#ifdef DOT11_N_SUPPORT -#define MODE_HTMIX 2 -#define MODE_HTGREENFIELD 3 -#endif /* DOT11_N_SUPPORT */ -#define MODE_VHT 4 - -#define GI_400 1 /* only support in HT/VHT mode */ -#define GI_800 0 -#define GI_BOTH 2 - -#define SUPPORT_CCK_MODE 1 -#define SUPPORT_OFDM_MODE 2 -#define SUPPORT_HT_MODE 4 -#define SUPPORT_VHT_MODE 8 - -#ifdef DOT11_N_SUPPORT -#define HTMODE_MM 0 -#define HTMODE_GF 1 - -#define STBC_NONE 0 -#define STBC_USE 1 - -#define MMPS_STATIC 0 -#define MMPS_DYNAMIC 1 -#endif /* DOT11_N_SUPPORT */ - -#define fCLIENT_STATUS_SGI20_CAPABLE 0x00000010 -#define fCLIENT_STATUS_SGI40_CAPABLE 0x00000020 -#define fCLIENT_STATUS_VHT_RX_LDPC_CAPABLE 0x00800000 -#define fCLIENT_STATUS_HT_RX_LDPC_CAPABLE 0x01000000 - -#ifdef DOT11_VHT_AC -#define fCLIENT_STATUS_SGI80_CAPABLE 0x00010000 -#define fCLIENT_STATUS_SGI160_CAPABLE 0x00020000 -#define fCLIENT_STATUS_VHT_TXSTBC_CAPABLE 0x00040000 -#define fCLIENT_STATUS_VHT_RXSTBC_CAPABLE 0x00080000 -#endif /* DOT11_VHT_AC */ - -#endif /* WIFI_BUILD_RAM */ - -/******************************************************************************* -* D A T A T Y P E S -******************************************************************************** -*/ -struct _RTMP_ADAPTER; -struct _MAC_TABLE_ENTRY; - -#ifndef WIFI_BUILD_RAM -typedef BOOLEAN BOOL; -typedef UINT8 UINT_8; -typedef UINT16 UINT_16; -typedef UINT32 UINT_32; -typedef CHAR INT_8; -typedef INT16 INT_16; -typedef INT32 INT_32; -#endif /* !WIFI_BUILD_RAM */ - -typedef struct _RTMP_TX_RATE { - UCHAR mode; - UCHAR bw; - UCHAR mcs; - UCHAR nss; - UCHAR sgi; - UCHAR stbc; -} RTMP_TX_RATE; - -typedef struct _RTMP_RA_LEGACY_TB { - UCHAR ItemNo; -#ifdef RT_BIG_ENDIAN - UCHAR Rsv2 : 1; - UCHAR Mode : 3; - UCHAR BW : 2; - UCHAR ShortGI : 1; - UCHAR STBC : 1; -#else - UCHAR STBC : 1; - UCHAR ShortGI : 1; - UCHAR BW : 2; - UCHAR Mode : 3; - UCHAR Rsv2 : 1; -#endif - UCHAR CurrMCS; - UCHAR TrainUp; - UCHAR TrainDown; -} RTMP_RA_LEGACY_TB; - -#if defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) -typedef struct _RA_PHY_CFG_T { - UINT_8 MODE; - UINT_8 Flags; - UINT_8 STBC; - UINT_8 ShortGI; - UINT_8 BW; - UINT_8 ldpc; - UINT_8 MCS; - UINT_8 VhtNss; -} RA_PHY_CFG_T; - -typedef struct _RA_ENTRY_INFO_T { - BOOL fgRaValid; - UINT_8 ucWcid; - BOOL fgAutoTxRateSwitch; - - UINT_8 ucPhyMode; /* wdev->PhyMode WMODE_CAP_AC */ - UINT_8 ucChannel; - UINT_8 ucBBPCurrentBW; /* BW_10, BW_20, BW_40, BW_80 */ - - BOOL fgDisableCCK; - - BOOL fgHtCapMcs32; - BOOL fgHtCapInfoGF; - UCHAR aucHtCapMCSSet[4]; - UCHAR ucMmpsMode; - - INT_8 AvgRssiSample[4]; - UINT_8 ucCERMSD; - - UINT_8 ucGband256QAMSupport; - UINT_8 ucMaxAmpduFactor; - - UCHAR RateLen; - UCHAR ucSupportRateMode; - UINT_8 ucSupportCCKMCS; - UINT_8 ucSupportOFDMMCS; -#ifdef DOT11_N_SUPPORT - UINT_32 u4SupportHTMCS; -#ifdef DOT11_VHT_AC - UINT_16 u2SupportVHTMCS1SS; - UINT_16 u2SupportVHTMCS2SS; - UINT_16 u2SupportVHTMCS3SS; - UINT_16 u2SupportVHTMCS4SS; - BOOL force_op_mode; - UINT_8 vhtOpModeChWidth; - UINT_8 vhtOpModeRxNss; - UINT_8 vhtOpModeRxNssType; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - - UINT_32 ClientStatusFlags; - - RA_PHY_CFG_T MaxPhyCfg; - RA_PHY_CFG_T TxPhyCfg; - - BOOL fgAuthWapiMode; /* Security hardware limitation workaround */ - -#ifdef WIFI_BUILD_RAM -#if (PRODUCT_VERSION == 7615 || PRODUCT_VERSION == 7622) - BOOL fgRaCtrlExec; - BOOL fgQuickResponse; - INT_8 ucRaTimeSlot; - INT_8 ucRaQuickTimeSlot; - INT_8 ucRaQuickTimeRatio; - UINT_32 u4TxCount; - UINT_16 u2Rate1TxCnt; - UINT_16 u2Rate1FailCnt; - UINT_16 u2Rate2OkCnt; - UINT_16 u2Rate3OkCnt; -#endif -#endif /* WIFI_BUILD_RAM */ -} RA_ENTRY_INFO_T, *P_RA_ENTRY_INFO_T; - -typedef struct _RA_INTERNAL_INFO_T { - BOOL fgLastSecAccordingRSSI; - UINT_8 ucInitialRateMode; - UINT_8 ucLowTrafficCount; - UINT_8 ucMcsGroup; - UINT_8 ucGroupCnt; - - UINT_8 ucCurrTxRateIndex; - UINT_8 ucLastRateIdx; - UINT_8 ucLastMcsGroup; - - UINT_8 ucTxRateUpPenalty; /* extra # of second penalty due to last unstable condition */ - - /* to record the each TX rate's quality. 0 is best, the bigger the worse. */ - UINT_8 aucTxQuality[MAX_TX_QUALITY_INDEX]; - /* UINT_8 aucPER[MAX_TX_QUALITY_INDEX]; */ - UINT_8 ucDynamicSGIState; - UINT_8 ucDynamicBWState; - UINT_8 ucDynamicBW; - - UINT_8 ucLastSecTxRateChangeAction; /* 0: no change, 1:rate UP, 2:rate down */ - UINT_8 ucLastTimeTxRateChangeAction; /* Keep last time value of LastSecTxRateChangeAction */ - UINT_8 ucLastTxPER; /* Tx PER in last Rate Adaptation interval */ - UINT_32 u4LastTxOkCount; /* TxSuccess count in last Rate Adaptation interval */ - - UCHAR *pucTable; /* Pointer to this entry's Tx Rate Table */ - UCHAR *pucLastTable; -} RA_INTERNAL_INFO_T, *P_RA_INTERNAL_INFO_T; - -typedef struct _RA_COMMON_INFO_T { - UINT_8 OpMode; - BOOL fgAdHocOn; - BOOL fgShortPreamble; - - UCHAR TxStream; - UCHAR RxStream; - - UINT_8 ucRateAlg; - - BOOL TestbedForceShortGI; - BOOL TestbedForceGreenField; -#ifdef DOT11_N_SUPPORT - UCHAR HtMode; - BOOL fAnyStation20Only; /* Check if any Station can't support GF. */ - BOOL bRcvBSSWidthTriggerEvents; -#ifdef DOT11_VHT_AC - UCHAR vht_nss_cap; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - - BOOL fgThermalProtectToggle; - BOOL force_one_tx_stream; - - UINT_8 ucForceTxStream; - - BOOL fgSeOff; - UINT_8 ucAntennaIndex; - - UINT_8 TrainUpRule; /* QuickDRS train up criterion: 0=>Throughput, 1=>PER, 2=> Throughput & PER */ - USHORT TrainUpHighThrd; - SHORT TrainUpRuleRSSI; - USHORT lowTrafficThrd; - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - UINT_16 u2MaxPhyRate; -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - - UINT_32 PhyCaps; /* pAd->chipCap.phy_caps 0x1:2.4G 0x2:5G 0x10:ht 0x20:vht 0x100:TXBF 0x200:ldpc */ - - UINT_32 u4RaInterval; - UINT_32 u4RaFastInterval; - -#ifdef WIFI_BUILD_RAM - UINT_8 ucStaCount; - BOOL fgRaCfgSet; - BOOL fgBtCoExEnable; - UINT_8 ucBtCoExBitMap; - BOOL fgPwrSavingEnable; - BOOL fgThroughputBurst; - RA_PHY_CFG_T rLastTxCfg; -#endif /* WIFI_BUILD_RAM */ - -} RA_COMMON_INFO_T, *P_RA_COMMON_INFO_T; - -typedef struct _BSSINFO_AUTO_RATE_CFG_T { - /* Auto Rate (Group10) */ - UINT_16 u2Tag; /* Tag = 10 */ - UINT_16 u2Length; - - UINT_8 OpMode; - BOOL fgAdHocOn; - BOOL fgShortPreamble; - - UCHAR TxStream; - UCHAR RxStream; - - UINT_8 ucRateAlg; - - BOOL TestbedForceShortGI; - BOOL TestbedForceGreenField; - UCHAR HtMode; - BOOL fAnyStation20Only; /* Check if any Station can't support GF. */ - BOOL bRcvBSSWidthTriggerEvents; - UCHAR vht_nss_cap; - UCHAR vht_bw_signal; /* not use */ - BOOL vht_force_sgi; /* not use */ - - BOOL fgSeOff; - UINT_8 ucAntennaIndex; - - UINT_8 TrainUpRule; /* QuickDRS train up criterion: 0=>Throughput, 1=>PER, 2=> Throughput & PER */ - UINT_8 Resv[3]; - USHORT TrainUpHighThrd; - SHORT TrainUpRuleRSSI; - USHORT lowTrafficThrd; - - UINT_16 u2MaxPhyRate; - - UINT_32 PhyCaps; /* pAd->chipCap.phy_caps 0x1:2.4G 0x2:5G 0x10:ht 0x20:vht 0x100:TXBF 0x200:ldpc */ - - UINT_32 u4RaInterval; - UINT_32 u4RaFastInterval; -} CMD_BSSINFO_AUTO_RATE_CFG_T, *P_CMD_BSSINFO_AUTO_RATE_CFG_T; - -typedef struct _STAREC_AUTO_RATE_T { - /* Auto Rate (Group1) */ - UINT_16 u2Tag; /* Tag = 0x01 */ - UINT_16 u2Length; - BOOL fgRaValid; - BOOL fgAutoTxRateSwitch; - - UINT_8 ucPhyMode; /* wdev->PhyMode WMODE_CAP_AC */ - UINT_8 ucChannel; - UINT_8 ucBBPCurrentBW; /* BW_10, BW_20, BW_40, BW_80 */ - - BOOL fgDisableCCK; - - BOOL fgHtCapMcs32; - BOOL fgHtCapInfoGF; - UCHAR aucHtCapMCSSet[4]; - UCHAR ucMmpsMode; - - UINT_8 ucGband256QAMSupport; - UINT_8 ucMaxAmpduFactor; - - BOOL fgAuthWapiMode; /* Security hardware limitation workaround */ - - UCHAR RateLen; - UCHAR ucSupportRateMode; - UINT_8 ucSupportCCKMCS; - UINT_8 ucSupportOFDMMCS; - UINT_32 u4SupportHTMCS; - UINT_16 u2SupportVHTMCS1SS; - UINT_16 u2SupportVHTMCS2SS; - UINT_16 u2SupportVHTMCS3SS; - UINT_16 u2SupportVHTMCS4SS; - BOOL force_op_mode; - UINT_8 vhtOpModeChWidth; - UINT_8 vhtOpModeRxNss; - UINT_8 vhtOpModeRxNssType; - - UINT_32 ClientStatusFlags; - - RA_PHY_CFG_T MaxPhyCfg; -} CMD_STAREC_AUTO_RATE_T, *P_CMD_STAREC_AUTO_RATE_T; - -typedef struct _STAREC_AUTO_RATE_CFG_T { - /* Auto Rate (Group2) */ - UINT_16 u2Tag; /* Tag = 0x02 */ - UINT_16 u2Length; - - UINT_8 OpMode; - BOOL fgAdHocOn; - BOOL fgShortPreamble; - - UCHAR TxStream; - UCHAR RxStream; - - UINT_8 ucRateAlg; - - BOOL TestbedForceShortGI; - BOOL TestbedForceGreenField; - UCHAR HtMode; - BOOL fAnyStation20Only; /* Check if any Station can't support GF. */ - BOOL bRcvBSSWidthTriggerEvents; - UCHAR vht_nss_cap; - UCHAR vht_bw_signal; /* not use */ - BOOL vht_force_sgi; /* not use */ - - BOOL fgSeOff; - UINT_8 ucAntennaIndex; - - UINT_8 TrainUpRule; /* QuickDRS train up criterion: 0=>Throughput, 1=>PER, 2=> Throughput & PER */ - UINT_8 Resv[3]; - USHORT TrainUpHighThrd; - SHORT TrainUpRuleRSSI; - USHORT lowTrafficThrd; - - UINT_16 u2MaxPhyRate; - - UINT_32 PhyCaps; /* pAd->chipCap.phy_caps 0x1:2.4G 0x2:5G 0x10:ht 0x20:vht 0x100:TXBF 0x200:ldpc */ - - UINT_32 u4RaInterval; - UINT_32 u4RaFastInterval; -} CMD_STAREC_AUTO_RATE_CFG_T, *P_CMD_STAREC_AUTO_RATE_CFG_T; - -typedef struct _STAREC_AUTO_RATE_UPDATE_T { - /* Auto Rate (Group3) */ - UINT_16 u2Tag; /* Tag = 0x03 */ - UINT_16 u2Length; - - UINT_32 u4Field; - - BOOL force_op_mode; - UINT_8 vhtOpModeChWidth; - UINT_8 vhtOpModeRxNss; - UINT_8 vhtOpModeRxNssType; - - RA_PHY_CFG_T FixedRateCfg; - UINT_8 ucSpeEn; - UINT_8 ucShortPreamble; - BOOL fgIs5G; - - UINT_8 ucMmpsMode; -} CMD_STAREC_AUTO_RATE_UPDATE_T, *P_CMD_STAREC_AUTO_RATE_UPDATE_T; - -#ifdef CONFIG_MAP_SUPPORT -typedef struct _EXT_CMD_GET_TX_RATE_T { - UINT_8 ucReqWcid; - UINT_8 aucReserved[3]; -} EXT_CMD_GET_TX_RATE_T, *P_EXT_CMD_GET_TX_RATE_T; -#endif - -typedef struct _EXT_CMD_GET_TX_STATISTIC_T { - UINT_32 u4Field; - UINT_8 ucWlanIdx; - UINT_8 ucBandIdx; - UINT_8 aucReserved[6]; -} EXT_CMD_GET_TX_STATISTIC_T, *P_EXT_CMD_GET_TX_STATISTIC_T; - -typedef struct _CMD_SET_MAX_PHY_RATA_T { - UINT_16 u2MaxPhyRate; - UINT_8 aucReserve[2]; -} CMD_SET_MAX_PHY_RATA, *P_CMD_SET_MAX_PHY_RATA; - -typedef struct _EXT_CMD_SET_VHT_IN_2G_T { - BOOL fgEnVhtForHtIn2G; - UINT_8 au1Reserved[3]; -} EXT_CMD_SET_VHT_IN_2G_T, *P_EXT_CMD_SET_VHT_IN_2G_T; - -#ifdef MIN_PHY_RATE_SUPPORT -typedef struct _CMD_SET_MIN_PHY_RATE_T { - UINT_8 ucBssidIdx; - UINT_8 ucMinPhyDataRate; - UINT_8 ucMinPhyMgmtRate; - BOOL fgDisableCCKRate; -} CMD_SET_MIN_PHY_RATE, *P_CMD_SET_MIN_PHY_RATE; -#endif /* MIN_PHY_RATE_SUPPORT */ - -#ifdef FAST_UP_RATE_SUPPORT -typedef struct _CMD_SET_FAST_UP_RATE_T { - BOOL fgFastUPRate; - UINT_8 aucReserved[3]; -} CMD_SET_FAST_UP_RATE, *P_CMD_SET_FAST_UP_RATE; -#endif /* FAST_UP_RATE_SUPPORT */ - -typedef struct _EXT_EVENT_MAX_AMSDU_LENGTH_UPDATE_T { - UINT_8 ucWlanIdx; - UINT_8 ucAmsduLen; -} EXT_EVENT_MAX_AMSDU_LENGTH_UPDATE_T, *P_EXT_EVENT_MAX_AMSDU_LENGTH_UPDATE_T; -#ifdef CONFIG_MAP_SUPPORT -typedef struct _AC_ADM_INFO_T { - UINT_32 u4ACTxTime; - UINT_32 u4ACTxBytes; -} AC_ADM_INFO_T, *P_AC_ADM_INFO_T; - -typedef struct _TX_ADM_INFO_T { - AC_ADM_INFO_T arTxAdmInfo[4]; -} TX_ADM_INFO_T, *P_TX_ADM_INFO_T; - -typedef struct _ONE_TX_RATE_RESULT_T { - UINT_8 ucWlanIdx; - RA_PHY_CFG_T rEntryTxRate; - TX_ADM_INFO_T txRxAdmInfo; -} ONE_TX_RATE_RESULT_T, *P_ONE_TX_RATE_RESULT_T; - -#define CFG_STA_REC_NUM_PER_EVENT 16 - -typedef struct _EXT_EVENT_TX_RATE_RESULT_T { - UINT_8 ucStaNum; - ONE_TX_RATE_RESULT_T rAllTxRateResult[CFG_STA_REC_NUM_PER_EVENT]; -} EXT_EVENT_TX_RATE_RESULT_T, *P_EXT_EVENT_TX_RATE_RESULT_T; -#endif - -typedef struct _EXT_EVENT_TX_STATISTIC_RESULT_T { - UINT_8 ucWlanIdx; - UINT_8 ucBandIdx; - UINT_8 aucResv1[2]; - UINT_32 u4Field; - UINT_32 u4TotalTxCount; - UINT_32 u4TotalTxFailCount; - UINT_32 u4CurrBwTxCnt; - UINT_32 u4CurrBwTxFailCnt; - UINT_32 u4OtherBwTxCnt; - UINT_32 u4OtherBwTxFailCnt; - UINT_32 u4EntryTxCount; - UINT_32 u4EntryTxFailCount; - RA_PHY_CFG_T rLastTxRate; - RA_PHY_CFG_T rEntryTxRate; - UINT_8 aucResv2[8]; -#ifdef TXSTAT_2040BW_24G_SUPPORT - UINT_32 u4Total40MTxCount; - UINT_32 u4Total20MTxCount; -#endif -} EXT_EVENT_TX_STATISTIC_RESULT_T, *P_EXT_EVENT_TX_STATISTIC_RESULT_T; - -#ifdef TXSTAT_2040BW_24G_SUPPORT -typedef struct _EXT_CMD_2040_BW_STATISTIC_T { - UINT_8 ucGetBwStat; - UINT_8 ucBWStatFeature; - UINT_8 aucResv[2]; -} EXT_CMD_2040_BW_STATISTIC_T, *P_EXT_CMD_2040_BW_STATISTIC_T; - -typedef struct _EXT_EVENT_2040_BW_STATISTIC_T { - UINT_8 ucBWStatFeature; - UINT_8 aucResv1[3]; -} EXT_EVENT_2040_BW_STATISTIC_T, *P_EXT_EVENT_2040_BW_STATISTIC_T; -#endif - -typedef struct _EXT_EVENT_G_BAND_256QAM_PROBE_RESULT_T { - UINT_8 ucWlanIdx; - UINT_8 ucResult; - UINT_8 aucReserved[2]; -} EXT_EVENT_G_BAND_256QAM_PROBE_RESULT_T, - *P_EXT_EVENT_G_BAND_256QAM_PROBE_RESULT_T; -#endif /* defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) */ - -#ifdef NEW_RATE_ADAPT_SUPPORT -typedef struct _RTMP_RA_GRP_TB { - UCHAR ItemNo; -#ifdef RT_BIG_ENDIAN - UCHAR Rsv2 : 1; - UCHAR Mode : 3; - UCHAR BW : 2; - UCHAR ShortGI : 1; - UCHAR STBC : 1; -#else - UCHAR STBC : 1; - UCHAR ShortGI : 1; - UCHAR BW : 2; - UCHAR Mode : 3; - UCHAR Rsv2 : 1; -#endif - UCHAR CurrMCS; - UCHAR TrainUp; - UCHAR TrainDown; - UCHAR downMcs; - UCHAR upMcs3; - UCHAR upMcs2; - UCHAR upMcs1; - UCHAR dataRate; -} RTMP_RA_GRP_TB; -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#ifdef RATE_ADAPT_AGBS_SUPPORT -typedef struct __RA_AGBS_TABLE_ENTRY { - UCHAR ItemNo; -#ifdef RT_BIG_ENDIAN - UCHAR Rsv2 : 1; - UCHAR Mode : 3; - UCHAR BW : 2; - UCHAR ShortGI : 1; - UCHAR STBC : 1; -#else - UCHAR STBC : 1; - UCHAR ShortGI : 1; - UCHAR BW : 2; - UCHAR Mode : 3; - UCHAR Rsv2 : 1; -#endif - UCHAR CurrMCS; - UCHAR TrainUp; - UCHAR TrainDown; - UCHAR UpIdx; - UCHAR DownIdx; - UCHAR NssUpIdx; - UCHAR NssDnIdx; - UCHAR ChangeBw; -#ifdef RT_BIG_ENDIAN - UCHAR AmsduLenBw40 : 4; - UCHAR AmsduLenBw20 : 4; - UCHAR AmsduLenBw160 : 4; - UCHAR AmsduLenBw80 : 4; -#else - UCHAR AmsduLenBw20 : 4; - UCHAR AmsduLenBw40 : 4; - UCHAR AmsduLenBw80 : 4; - UCHAR AmsduLenBw160 : 4; -#endif - UCHAR TxCnt; - UCHAR CBRN; -} * P_RA_AGBS_TABLE_ENTRY, RA_AGBS_TABLE_ENTRY; - -typedef struct __RA_AGBS_UPRATE_INFO { - UINT_8 ucUpRateIdx; - UINT_8 ucUpRateGrp; - UINT_8 ucNssUpIdx; - UINT_8 ucNssUpGrp; - UINT_8 ucNssDnIdx; - UINT_8 ucNssDnGrp; -} * P_RA_AGBS_UPRATE_INFO, RA_AGBS_UPRATE_INFO; - -union RA_RATE_CODE { - struct { - UINT_16 mcs : 6; - UINT_16 mode : 3; - UINT_16 nsts : 2; - UINT_16 stbc : 1; - UINT_16 reserved : 4; - } field; - UINT_16 word; -}; - -typedef struct __RA_INIT_RATE_ENTRY { - UCHAR *pucTable; - UCHAR ucMcsGrp; - CHAR cRateIndex; - CHAR cRssi; -} * P_RA_INIT_RATE_ENTRY, RA_INIT_RATE_ENTRY; - -typedef struct __RA_PHY_RATE_INFO { - UINT_16 u2Bw20LGI; - UINT_16 u2Bw20SGI; - UINT_16 u2Bw40LGI; - UINT_16 u2Bw40SGI; - UINT_16 u2Bw80LGI; - UINT_16 u2Bw80SGI; - UINT_16 u2Bw160LGI; - UINT_16 u2Bw160SGI; -} * P_RA_PHY_RATE_INFO, RA_PHY_RATE_INFO; - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - -enum RATE_ADAPT_ALG { - RATE_ALG_LEGACY = 1, - RATE_ALG_GRP = 2, - RATE_ALG_AGS = 3, - RATE_ALG_AGBS = 4, - RATE_ALG_MAX_NUM -}; - -typedef enum { RAL_OLD_DRS, RAL_NEW_DRS, RAL_QUICK_DRS } RA_LOG_TYPE; - -typedef enum { - RA_PARAM_VHT_OPERATING_MODE = 1, - RA_PARAM_HT_2040_COEX = 2, - RA_PARAM_FIXED_RATE = 3, - RA_PARAM_FIXED_RATE_FALLBACK = 4, - RA_PARAM_MMPS_UPDATE = 5, - RA_PARAM_HT_2040_BACK = 6, - RA_PARAM_MAX -} AUTO_RATE_UPDATE_PARAM; - -typedef enum { - RA_DYNAMIC_SGI_INITIAL_STATE = 0, - RA_DYNAMIC_SGI_TRYING_STATE, - RA_DYNAMIC_SGI_TRY_SUCCESS_STATE, - RA_DYNAMIC_SGI_TRY_FAIL_STATE -} DYNAMIC_SGI_STATE; - -typedef enum { - RA_DYNAMIC_BW_UNCHANGED_STATE = 0, - RA_DYNAMIC_BW_DOWN_STATE, - RA_DYNAMIC_BW_UP_FAIL_STATE -} DYNAMIC_BW_STATE; - -typedef enum { - RA_G_BAND_256QAM_DISABLE = 0, - RA_G_BAND_256QAM_ENABLE, - RA_G_BAND_256QAM_PROBING -} G_BAND_256QAM_CONFIG; - -typedef enum { - RA_G_BAND_256QAM_PROBE_FAIL = 0, - RA_G_BAND_256QAM_PROBE_SUCCESS, -} G_BAND_256QAM_PROBE_RESULT; - -#if defined(COMPOS_WIN) || defined(WIFI_BUILD_RAM) -enum WIFI_MODE { - WMODE_INVALID = 0, - WMODE_A = 1 << 0, - WMODE_B = 1 << 1, - WMODE_G = 1 << 2, - WMODE_GN = 1 << 3, - WMODE_AN = 1 << 4, - WMODE_AC = 1 << 5, - WMODE_COMP = - 6, /* total types of supported wireless mode, add this value once yow add new type */ -}; -#endif /* COMPOS_WIN */ - -/******************************************************************************* -* M A C R O S -******************************************************************************** -*/ -#define PTX_RA_LEGACY_ENTRY(pTable, idx) \ - ((RTMP_RA_LEGACY_TB *)&(pTable[(idx + 1) * 5])) -#define RATE_TABLE_SIZE(pTable) \ - ((pTable)[0]) /* Byte 0 is number of rate indices */ -#define RATE_TABLE_INIT_INDEX(pTable) \ - ((pTable)[1]) /* Byte 1 is initial rate index */ -#define PTX_RA_GRP_ENTRY(pTable, idx) \ - ((RTMP_RA_GRP_TB *)&(pTable[(idx + 1) * 10])) - -#define RA_AGBS_ENTRY(pTable, idx) \ - ((idx < pTable[0] ? (RA_AGBS_TABLE_ENTRY *)&(pTable[(idx + 1) * 14]) : \ - (RA_AGBS_TABLE_ENTRY *)&(pTable[(1) * 14]))) - -/* normal rate switch */ -#define RTMP_DRS_ALG_INIT(__pAd, __Alg) ((__pAd)->rateAlg = __Alg) - -#define VHT_INVALID_RATE(__MCS, __Nss, __Bw) \ - (((__Bw == BW_20) && (__Nss == 1) && (__MCS == MCS_9)) || \ - ((__Bw == BW_20) && (__Nss == 2) && (__MCS == MCS_9)) || \ - ((__Bw == BW_20) && (__Nss == 4) && (__MCS == MCS_9)) || \ - ((__Bw == BW_80) && (__Nss == 3) && (__MCS == MCS_6)) || \ - ((__Bw == BW_160) && (__Nss == 3) && (__MCS == MCS_9))) - -#ifdef NEW_RATE_ADAPT_SUPPORT -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC -/* VHT */ -#define ADAPT_RATE_TABLE(pTable) \ - ((pTable) == RateSwitchTableAdapt11B || \ - (pTable) == RateSwitchTableAdapt11G || \ - (pTable) == RateSwitchTableAdapt11BG || \ - (pTable) == RateSwitchTableAdapt11N1S || \ - (pTable) == RateSwitchTableAdapt11N2S || \ - (pTable) == RateSwitchTableAdapt11N3S || \ - (pTable) == RateTableVht1S || (pTable) == RateTableVht1S_MCS9 || \ - (pTable) == RateTableVht2S || (pTable) == RateTableVht2S_MCS7 || \ - (pTable) == RateTableVht2S_BW20 || (pTable) == RateTableVht2S_BW40) -#else -/* 11n */ -#define ADAPT_RATE_TABLE(pTable) \ - ((pTable) == RateSwitchTableAdapt11B || \ - (pTable) == RateSwitchTableAdapt11G || \ - (pTable) == RateSwitchTableAdapt11BG || \ - (pTable) == RateSwitchTableAdapt11N1S || \ - (pTable) == RateSwitchTableAdapt11N2S || \ - (pTable) == RateSwitchTableAdapt11N3S) -#endif /* DOT11_VHT_AC */ -#else -/* Legacy */ -#define ADAPT_RATE_TABLE(pTable) \ - ((pTable) == RateSwitchTableAdapt11B || \ - (pTable) == RateSwitchTableAdapt11G || \ - (pTable) == RateSwitchTableAdapt11BG) -#endif /* DOT11_N_SUPPORT */ -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#ifdef RATE_ADAPT_AGBS_SUPPORT -#ifdef DOT11_N_SUPPORT -#define AGBS_HT_TABLE(pTable) \ - ((pTable) == RateSwitchTableAGBS11N1SS || \ - (pTable) == RateSwitchTableAGBS11N2SS || \ - (pTable) == RateSwitchTableAGBS11N3SS || \ - (pTable) == RateSwitchTableAGBS11N4SS) -#ifdef DOT11_VHT_AC -/* VHT */ -#define AGBS_VHT_TABLE(pTable) \ - ((pTable) == RateSwitchTableAGBSVht1SS || \ - (pTable) == RateSwitchTableAGBSVht2SS || \ - (pTable) == RateSwitchTableAGBSVht3SS || \ - (pTable) == RateSwitchTableAGBSVht4SS) - -#define RATE_TABLE_AGBS(pTable) \ - ((pTable) == RateSwitchTableAGBS11B || \ - (pTable) == RateSwitchTableAGBS11G || \ - (pTable) == RateSwitchTableAGBS11BG || \ - (pTable) == RateSwitchTableAGBS11N1SS || \ - (pTable) == RateSwitchTableAGBS11N2SS || \ - (pTable) == RateSwitchTableAGBS11N3SS || \ - (pTable) == RateSwitchTableAGBS11N4SS || \ - (pTable) == RateSwitchTableAGBSVht1SS || \ - (pTable) == RateSwitchTableAGBSVht2SS || \ - (pTable) == RateSwitchTableAGBSVht3SS || \ - (pTable) == RateSwitchTableAGBSVht4SS) -#else -/* 11n */ -#define RATE_TABLE_AGBS(pTable) \ - ((pTable) == RateSwitchTableAGBS11B || \ - (pTable) == RateSwitchTableAGBS11G || \ - (pTable) == RateSwitchTableAGBS11BG || \ - (pTable) == RateSwitchTableAGBS11N1SS || \ - (pTable) == RateSwitchTableAGBS11N2SS || \ - (pTable) == RateSwitchTableAGBS11N3SS || \ - (pTable) == RateSwitchTableAGBS11N4SS) -#endif /* DOT11_VHT_AC */ -#else -/* legacy */ -#define RATE_TABLE_AGBS(pTable) \ - ((pTable) == RateSwitchTableAGBS11B || \ - (pTable) == RateSwitchTableAGBS11G || \ - (pTable) == RateSwitchTableAGBS11BG) -#endif /* DOT11_N_SUPPORT */ -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - -#ifdef WIFI_BUILD_RAM -#define RA_SAVE_LAST_TX_CFG(__pRaEntry) \ - { \ - extern RA_COMMON_INFO_T g_rRaCfg; \ - g_rRaCfg.rLastTxCfg.MODE = __pRaEntry->TxPhyCfg.MODE; \ - g_rRaCfg.rLastTxCfg.MCS = __pRaEntry->TxPhyCfg.MCS; \ - g_rRaCfg.rLastTxCfg.BW = __pRaEntry->TxPhyCfg.BW; \ - g_rRaCfg.rLastTxCfg.ldpc = __pRaEntry->TxPhyCfg.ldpc ? 1 : 0; \ - g_rRaCfg.rLastTxCfg.ShortGI = \ - __pRaEntry->TxPhyCfg.ShortGI ? 1 : 0; \ - g_rRaCfg.rLastTxCfg.STBC = __pRaEntry->TxPhyCfg.STBC; \ - } -#else -#define RA_SAVE_LAST_TX_CFG(__pRaEntry) \ - { \ - HTTRANSMIT_SETTING LastTxRate; \ - LastTxRate.field.MODE = __pRaEntry->TxPhyCfg.MODE; \ - LastTxRate.field.MCS = __pRaEntry->TxPhyCfg.MCS; \ - LastTxRate.field.BW = __pRaEntry->TxPhyCfg.BW; \ - LastTxRate.field.ldpc = __pRaEntry->TxPhyCfg.ldpc ? 1 : 0; \ - LastTxRate.field.ShortGI = \ - __pRaEntry->TxPhyCfg.ShortGI ? 1 : 0; \ - LastTxRate.field.STBC = __pRaEntry->TxPhyCfg.STBC; \ - \ - pAd->LastTxRate = (USHORT)(LastTxRate.word); \ - } -#endif /* WIFI_BUILD_RAM */ - -#if defined(COMPOS_WIN) || defined(WIFI_BUILD_RAM) -#define WMODE_EQUAL(_x, _mode) ((_x) == (_mode)) -#define WMODE_CAP_N(_x) (((_x) & (WMODE_GN | WMODE_AN)) != 0) -#define WMODE_CAP_AC(_x) (((_x) & (WMODE_AC)) != 0) -#endif /* COMPOS_WIN */ - -/******************************************************************************* -* E X T E R N A L R E F E R E N C E S -******************************************************************************** -*/ - -#ifdef NEW_RATE_ADAPT_SUPPORT -extern UCHAR RateSwitchTableAdapt11B[]; -extern UCHAR RateSwitchTableAdapt11G[]; -extern UCHAR RateSwitchTableAdapt11BG[]; - -#ifdef DOT11_N_SUPPORT -extern UCHAR RateSwitchTableAdapt11N1S[]; -extern UCHAR RateSwitchTableAdapt11N2S[]; -extern UCHAR RateSwitchTableAdapt11N3S[]; - -/* ADAPT_RATE_TABLE - true if pTable is one of the Adaptive Rate Switch tables */ -#ifdef DOT11_VHT_AC -extern UCHAR RateTableVht1S[]; -extern UCHAR RateTableVht1S_MCS9[]; -extern UCHAR RateTableVht2S[]; -extern UCHAR RateTableVht2S_MCS7[]; -extern UCHAR RateTableVht2S_BW20[]; -extern UCHAR RateTableVht2S_BW40[]; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT*/ -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#ifdef RATE_ADAPT_AGBS_SUPPORT -extern UCHAR RateSwitchTableAGBS11B[]; -extern UCHAR RateSwitchTableAGBS11G[]; -extern UCHAR RateSwitchTableAGBS11BG[]; - -extern UINT_16 HwFallbackTable11B[32]; -extern UINT_16 HwFallbackTable11G[64]; -/* extern UINT_16 HwFallbackTable11BG[48]; */ -extern UINT_16 HwFallbackTable11BG[56]; - -extern RA_INIT_RATE_ENTRY RaInitRateTable11B[4]; -extern RA_INIT_RATE_ENTRY RaInitRateTable11G[8]; -extern RA_INIT_RATE_ENTRY RaInitRateTable11BG[8]; - -#ifdef DOT11_N_SUPPORT -extern UCHAR RateSwitchTableAGBS11N1SS[]; -extern UCHAR RateSwitchTableAGBS11N2SS[]; -extern UCHAR RateSwitchTableAGBS11N3SS[]; -extern UCHAR RateSwitchTableAGBS11N4SS[]; - -extern UCHAR *AgbsHtMappingTable[]; - -extern UINT_16 HwFallbackTable11N1SS[80]; -extern UINT_16 HwFallbackTable11N2SS[80]; -extern UINT_16 HwFallbackTable11N3SS[80]; -extern UINT_16 HwFallbackTable11N4SS[80]; -extern UINT_16 HwFallbackTableBGN1SS[80]; -extern UINT_16 HwFallbackTableBGN2SS[80]; -extern UINT_16 HwFallbackTableBGN3SS[80]; -extern UINT_16 HwFallbackTableBGN4SS[80]; - -extern RA_INIT_RATE_ENTRY RaInitRateTable11N1SS[10]; -extern RA_INIT_RATE_ENTRY RaInitRateTable11N2SS[10]; -extern RA_INIT_RATE_ENTRY RaInitRateTable11N3SS[10]; -extern RA_INIT_RATE_ENTRY RaInitRateTable11N4SS[10]; - -#ifdef DOT11_VHT_AC -extern UCHAR RateSwitchTableAGBSVht1SS[]; -extern UCHAR RateSwitchTableAGBSVht2SS[]; -extern UCHAR RateSwitchTableAGBSVht3SS[]; -extern UCHAR RateSwitchTableAGBSVht4SS[]; - -extern UCHAR *AgbsVhtMappingTable[]; - -extern UINT_16 HwFallbackTableVht1SS[80]; -extern UINT_16 HwFallbackTableVht2SS[80]; -extern UINT_16 HwFallbackTableVht3SS[80]; -/* -extern UINT_16 HwFallbackTableVht3SSBw80[24]; -*/ -extern UINT_16 HwFallbackTableVht4SS[80]; - -extern RA_INIT_RATE_ENTRY RaInitRateTableVht1SS[11]; -extern RA_INIT_RATE_ENTRY RaInitRateTableVht2SS[11]; -extern RA_INIT_RATE_ENTRY RaInitRateTableVht3SS[11]; -extern RA_INIT_RATE_ENTRY RaInitRateTableVht4SS[11]; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - -extern RA_PHY_RATE_INFO RaPhyRate1SS[]; -extern RA_PHY_RATE_INFO RaPhyRate2SS[]; -extern RA_PHY_RATE_INFO RaPhyRate3SS[]; -extern RA_PHY_RATE_INFO RaPhyRate4SS[]; - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - -/******************************************************************************* -* F U N C T I O N D E C L A R A T I O N S (MT) -******************************************************************************** -*/ -#ifdef MT_MAC -CHAR raMaxRssi(IN struct _RA_COMMON_INFO_T *pRaCfg, IN CHAR Rssi0, - IN CHAR Rssi1, IN CHAR Rssi2); - -CHAR raMinRssi(IN struct _RA_COMMON_INFO_T *pRaCfg, IN CHAR Rssi0, - IN CHAR Rssi1, IN CHAR Rssi2); - -VOID raWrapperEntrySet(IN struct _RTMP_ADAPTER *pAd, - IN struct _MAC_TABLE_ENTRY *pEntry, - OUT struct _RA_ENTRY_INFO_T *pRaEntry); - -VOID raWrapperEntryRestore(IN struct _RTMP_ADAPTER *pAd, - IN struct _MAC_TABLE_ENTRY *pEntry, - IN struct _RA_ENTRY_INFO_T *pRaEntry); - -VOID raWrapperConfigSet(IN struct _RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - OUT struct _RA_COMMON_INFO_T *pRaCfg); - -VOID QuickResponeForRateAdaptMT(IN struct _RTMP_ADAPTER *pAd, UINT_8 idx); - -VOID DynamicTxRateSwitchingAdaptMT(IN struct _RTMP_ADAPTER *pAd, UINT_8 idx); - -VOID raSelectTxRateTable(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal, - OUT UCHAR **ppTable, OUT UCHAR *pTableSize, - OUT UCHAR *pInitTxRateIdx); - -VOID RAInit(IN struct _RTMP_ADAPTER *pAd, IN struct _MAC_TABLE_ENTRY *pEntry); - -VOID RAParamUpdate(IN struct _RTMP_ADAPTER *pAd, - IN struct _MAC_TABLE_ENTRY *pEntry, - IN struct _STAREC_AUTO_RATE_UPDATE_T *prParam); - -VOID RATriggerQuickResponeTimer(IN struct _RTMP_ADAPTER *pAd, - IN struct _RA_ENTRY_INFO_T *pRaEntry); - -#ifdef NEW_RATE_ADAPT_SUPPORT -VOID raClearTxQuality(IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID raDecTxQuality(IN struct _RA_INTERNAL_INFO_T *pRaInternal, - IN UCHAR ucRateIndex); - -VOID raSetTxQuality(IN struct _RA_INTERNAL_INFO_T *pRaInternal, - IN UINT_8 ucRateIndex, IN UINT_8 ucQuality); - -UINT_8 -raGetTxQuality(IN struct _RA_INTERNAL_INFO_T *pRaInternal, - IN UINT_8 ucRateIndex); - -VOID raRestoreLastRate(IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID raSetMcsGroup(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -UCHAR -raSelectUpRate(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal, - IN struct _RTMP_RA_GRP_TB *pCurrTxRate); - -UCHAR -raSelectDownRate(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal, - IN UCHAR CurrRateIdx); - -UCHAR *raSelectTxRateTableGRP(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID QuickResponeForRateAdaptMTCore(IN struct _RTMP_ADAPTER *pAd, - IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID DynamicTxRateSwitchingAdaptMtCore( - IN struct _RTMP_ADAPTER *pAd, IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID NewTxRateMtCore(IN struct _RTMP_ADAPTER *pAd, - IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#ifdef RATE_ADAPT_AGBS_SUPPORT -VOID raClearTxQualityAGBS(IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID raPrintRateTableNameAGBS(IN UCHAR *pTable); - -UINT_16 -raGetPhyRate(IN UINT_8 ucMode, IN UINT_8 ucMcs, IN UINT_8 ucVhtNss, - IN UINT_8 ucBw, IN UINT_8 ucSgi); - -VOID raSetMcsGroupAGBS(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID QuickResponeForRateAdaptAGBSMTCore( - IN struct _RTMP_ADAPTER *pAd, IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID DynamicTxRateSwitchingAGBSMtCore( - IN struct _RTMP_ADAPTER *pAd, IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -UCHAR *raSelectVHTTxRateTableAGBS(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -UCHAR *raSelectTxRateTableAGBS(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID SetTxRateMtCoreAGBS(IN struct _RTMP_ADAPTER *pAd, - IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); - -VOID raMaxAmsduLenNotifyAGBS(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - -#ifdef MCS_LUT_SUPPORT -UINT_8 -raStbcSettingCheck(UINT_8 ucOrigStbc, UINT_8 ucMode, UINT_8 ucMcs, - UINT_8 ucVhtNss, BOOL fgBFOn, BOOL fgForceOneTx); -#ifdef NEW_RATE_ADAPT_SUPPORT -VOID MtAsicMcsLutUpdateCore(IN struct _RTMP_ADAPTER *pAd, - IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#ifdef RATE_ADAPT_AGBS_SUPPORT -VOID MtAsicMcsLutUpdateCoreAGBS(IN struct _RTMP_ADAPTER *pAd, - IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_COMMON_INFO_T *pRaCfg, - IN struct _RA_INTERNAL_INFO_T *pRaInternal); -#endif /* RATE_ADAPT_AGBS_SUPPORT */ -#endif /* MCS_LUT_SUPPORT */ - -#ifdef DBG -INT Set_Fixed_Rate_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_Fixed_Rate_With_FallBack_Proc(IN struct _RTMP_ADAPTER *pAd, - IN RTMP_STRING *arg); - -INT Set_RA_Debug_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -#endif /* DBG */ - -#ifdef CONFIG_RA_PHY_RATE_SUPPORT -INT Set_SupRateSet_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_HtSupRateSet_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); - -INT Set_VhtSupRateSet_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg); -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -INT32 -BssInfoRACommCfgSet(IN P_RA_COMMON_INFO_T pRaCfg, - OUT P_CMD_BSSINFO_AUTO_RATE_CFG_T pCmdBssInfoAutoRateCfg); -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - -#if defined(MT7636) || defined(MT7615) || defined(MT7637) || \ - defined(MT7622) || defined(P18) || defined(MT7663) -INT32 -StaRecAutoRateParamSet(IN struct _RA_ENTRY_INFO_T *pRaEntry, - OUT struct _STAREC_AUTO_RATE_T *pCmdStaRecAutoRate); - -INT32 -StaRecAutoRateUpdate(IN struct _RA_ENTRY_INFO_T *pRaEntry, - IN struct _RA_INTERNAL_INFO_T *pRaInternal, - IN struct _STAREC_AUTO_RATE_UPDATE_T *pRaParam, - OUT struct _STAREC_AUTO_RATE_UPDATE_T *pCmdStaRecAutoRate); -#endif /* defined(MT7636) || defined(MT7615) || defined(MT7637) || defined(MT7622) || defined(P18) || defined(MT7663) */ - -#endif /* MT_MAC */ - -/******************************************************************************* -* F U N C T I O N D E C L A R A T I O N S (RT) -******************************************************************************** -*/ -#if !defined(COMPOS_WIN) && !defined(WIFI_BUILD_RAM) -VOID RTMPSetSupportMCS(IN struct _RTMP_ADAPTER *pAd, IN UCHAR OpMode, - IN struct _MAC_TABLE_ENTRY *pEntry, IN UCHAR SupRate[], - IN UCHAR SupRateLen, IN UCHAR ExtRate[], - IN UCHAR ExtRateLen, -#ifdef DOT11_VHT_AC - IN UCHAR vht_cap_len, IN struct _VHT_CAP_IE *vht_cap, -#endif /* DOT11_VHT_AC */ - IN struct _HT_CAPABILITY_IE *pHtCapability, - IN UCHAR HtCapabilityLen); - -#ifdef NEW_RATE_ADAPT_SUPPORT - -INT Set_PerThrdAdj_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_LowTrafficThrd_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TrainUpRule_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TrainUpRuleRSSI_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TrainUpLowThrd_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -INT Set_TrainUpHighThrd_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *arg); - -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -VOID APMlmeDynamicTxRateSwitching(IN struct _RTMP_ADAPTER *pAd); - -VOID APQuickResponeForRateUpExec(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); - -#endif /* CONFIG_AP_SUPPORT */ - -#endif /* COMPOS_WIN */ - -#endif /* __RA_CTRL_H__ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txbf/mt_txbf.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txbf/mt_txbf.h deleted file mode 100644 index 5ed39468c2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txbf/mt_txbf.h +++ /dev/null @@ -1,933 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_txbf.h -*/ - -#ifndef _RT_TXBF_H_ -#define _RT_TXBF_H_ - -#ifdef TXBF_SUPPORT - -#define TXBF_DYNAMIC_DISABLE -struct _RTMP_ADAPTER; -struct _MAC_TABLE_ENTRY; -struct _VHT_CAP_INFO; - -#ifdef TXBF_DYNAMIC_DISABLE -/* used in rStaRecBf.ucAutoSoundingCtrl - * if set, BF is dynamically disabled - */ -#define DYNAMIC_TXBF_DISABLE BIT(6) -#endif /* TXBF_DYNAMIC_DISABLE */ - -#define Sportan_DBG 0 - -/* Divider phase calibration closed loop definition */ -#define RX0TX0 0 -#define RX1TX1 5 - -#define ADC0_RX0_2R 8 -#define ADC1_RX1_2R 8 - -/* #define MRQ_FORCE_TX //Force MRQ regardless the capability of the station */ - -/* TxSndgPkt Sounding type definitions */ -#define SNDG_TYPE_DISABLE 0 -#define SNDG_TYPE_SOUNDING 1 -#define SNDG_TYPE_NDP 2 - -/* Explicit TxBF feedback mechanism */ -#define ETXBF_FB_DISABLE 0 -#define ETXBF_FB_CSI 1 -#define ETXBF_FB_NONCOMP 2 -#define ETXBF_FB_COMP 4 - -/* #define MRQ_FORCE_TX //Force MRQ regardless the capability of the station */ - -/* - eTxBfEnCond values: - 0:no etxbf, - 1:etxbf update periodically, - 2:etxbf updated if mcs changes in RateSwitchingAdapt() or APQuickResponeForRateUpExecAdapt(). - 3:auto-selection: if mfb changes or timer expires, then send sounding packets <------not finished yet!!! - note: - when = 1 or 3, NO_SNDG_CNT_THRD controls the frequency to update the - matrix(ETXBF_EN_COND=1) or activate the whole bf evaluation process(not defined) -*/ - -/* Defines to include optional code. */ -/* NOTE: Do not define these options. ETxBfEnCond==3 and */ -/* MCS Feedback are not fully implemented */ -/* #define ETXBF_EN_COND3_SUPPORT // Include ETxBfEnCond==3 code */ -/* #define MFB_SUPPORT // Include MCS Feedback code */ - -/* MCS FB definitions */ -#define MSI_TOGGLE_BF 6 -#define TOGGLE_BF_PKTS 5 /* the number of packets with inverted BF status */ - -/* TXBF State definitions */ -#define READY_FOR_SNDG0 \ - 0 /* jump to WAIT_SNDG_FB0 when channel change or periodically */ -#define WAIT_SNDG_FB0 1 /* jump to WAIT_SNDG_FB1 when bf report0 is received */ -#define WAIT_SNDG_FB1 2 -#define WAIT_MFB 3 -#define WAIT_USELESS_RSP 4 -#define WAIT_BEST_SNDG 5 - -#define NO_SNDG_CNT_THRD \ - 0 /* send sndg packet if there is no sounding for (NO_SNDG_CNT_THRD+1)*500msec. If this =0, bf matrix is updated at each call of APMlmeDynamicTxRateSwitchingAdapt() */ - -/* ------------ BEAMFORMING PROFILE HANDLING ------------ */ - -#define IMP_MAX_BYTES 14 /* Implicit: 14 bytes per subcarrier */ -#define IMP_MAX_BYTES_ONE_COL \ - 7 /* Implicit: 7 bytes per subcarrier, when reading first column */ -#define EXP_MAX_BYTES 18 /* Explicit: 18 bytes per subcarrier */ -#define MAX_BYTES 2 /* 2 bytes per subcarrier for implicit and explicit TxBf */ -#define IMP_COEFF_SIZE 9 /* 9 bits/coeff */ -#define IMP_COEFF_MASK 0x1FF - -#define PROFILE_MAX_CARRIERS_20 56 /* Number of subcarriers in 20 MHz mode */ -#define PROFILE_MAX_CARRIERS_40 114 /* Number of subcarriers in 40 MHz mode */ -#define PROFILE_MAX_CARRIERS_80 242 /* Number of subcarriers in 80 MHz mode */ - -#define NUM_CHAIN 3 - -#define TXBF_PFMU_ARRAY_SIZE 64 -#define MAX_PFMU_MEM_LEN_PER_ROW 6 - -#define STATUS_TRUE 0 - -#define TX_MCS_SET_DEFINED BIT(0) -#define TX_MCS_SET_DEFINED_OFFSET 0 -#define TX_RX_MCS_SET_N_EQUAL BIT(1) -#define TX_RX_MCS_SET_N_EQUAL_OFFSET 1 -#define TX_MAX_NUM_SPATIAL_STREAMS_SUPPORTED BITS(2, 3) -#define TX_MAX_NUM_SPATIAL_STREAMS_SUPPORTED_OFFSET 2 - -/* - * BF Chip Capability - */ -#define TXBF_HW_CAP BIT(0) -#define TXBF_AID_HW_LIMIT BIT(1) -#define TXBF_HW_2BF BIT(2) - -#ifdef MT_MAC -typedef enum _TXBF_DBW_T { - P_DBW20M = 0, - P_DBW40M, - P_DBW80M, - P_DBW160M, - DBW20M, - DBW40M, - DBW80M, - DBW160M -} TXBF_DBW_T; - -enum ENUM_SUBF_CAP_T { SUBF_OFF, SUBF_ALL, SUBF_BFER, SUBF_BFEE }; - -typedef struct _VENDOR_BF_SETTING { - BOOLEAN fgIsBrcm2GeTxBFIe; - UINT8 Nrow; -} VENDOR_BF_SETTING, *P_VENDOR_BF_SETTING; - -typedef struct _TXBF_PFMU_STA_INFO { - UINT_16 u2PfmuId; /* 0xFFFF means no access right for PFMU */ - BOOLEAN fgSU_MU; /* 0 : SU, 1 : MU */ - BOOLEAN fgETxBfCap; /* 0 : ITxBf, 1 : ETxBf */ - UINT_8 ucSoundingPhy; /* 0: legacy, 1: OFDM, 2: HT, 4: VHT */ - UINT_8 ucNdpaRate; - UINT_8 ucNdpRate; - UINT_8 ucReptPollRate; - UINT_8 ucTxMode; /* 0: legacy, 1: OFDM, 2: HT, 4: VHT */ - UINT_8 ucNc; - UINT_8 ucNr; - UINT_8 ucCBW; /* 0 : 20M, 1 : 40M, 2 : 80M, 3 : 80 + 80M */ - UINT_8 ucTotMemRequire; - UINT_8 ucMemRequire20M; - UINT_8 ucMemRow0; - UINT_8 ucMemCol0; - UINT_8 ucMemRow1; - UINT_8 ucMemCol1; - UINT_8 ucMemRow2; - UINT_8 ucMemCol2; - UINT_8 ucMemRow3; - UINT_8 ucMemCol3; - UINT_16 u2SmartAnt; - UINT_8 ucSEIdx; - UINT_8 ucAutoSoundingCtrl; /* Bit7: low traffic indicator, Bit6: Stop sounding for this entry, Bit5~0: postpone sounding */ - UINT_8 uciBfTimeOut; - UINT_8 uciBfDBW; - UINT_8 uciBfNcol; - UINT_8 uciBfNrow; -} TXBF_PFMU_STA_INFO, *P_TXBF_PFMU_STA_INFO; - -typedef struct _CMD_STAREC_BF { - UINT_16 u2Tag; /* Tag = 0x02 */ - UINT_16 u2Length; - TXBF_PFMU_STA_INFO rTxBfPfmuInfo; - UINT_8 ucReserved[2]; -} CMD_STAREC_BF, *P_CMD_STAREC_BF; - -#ifdef RT_BIG_ENDIAN -typedef union _PFMU_PROFILE_TAG1 { - struct { - /* DWORD0 */ - UINT_32 ucMemAddr2RowIdx : 5; /* [31 : 27] : row index : 0 ~ 63 */ - UINT_32 ucMemAddr2ColIdx : 3; /* [26 : 24] : column index : 0 ~ 5 */ - UINT_32 ucMemAddr1RowIdx : 6; /* [23 : 18] : row index : 0 ~ 63 */ - UINT_32 ucMemAddr1ColIdx : 3; /* [17 : 15] : column index : 0 ~ 5 */ - UINT_32 ucRMSD : 3; /* [14:12] : RMSD value from CE */ - UINT_32 ucInvalidProf : 1; /* [11] : 0:default, 1: This profile number is invalid by SW */ - UINT_32 ucSU_MU : 1; /* [10] : 0:SU, 1: MU */ - UINT_32 ucDBW : 2; /* [9:8] : 0/1/2/3: DW20/40/80/160NC */ - UINT_32 ucTxBf : 1; /* [7] : 0: iBF, 1: eBF */ - UINT_32 ucProfileID : 7; /* [6:0] : 0 ~ 63 */ - - /* DWORD1 */ - UINT_32 ucReserved1 : 1; /* [63] : Reserved */ - UINT_32 ucHtcExist : 1; /* [62] : HtcExist */ - UINT_32 ucCodeBook : 2; /* [61:60] : Code book */ - UINT_32 ucLM : 2; /* [59 : 58] : 0/1/2 */ - UINT_32 ucNgroup : 2; /* [57 : 56] : Ngroup */ - UINT_32 ucNcol : 2; /* [55 : 54] : Ncol */ - UINT_32 ucNrow : 2; /* [53 : 52] : Nrow */ - UINT_32 ucReserved : 1; /* [51] : Reserved */ - UINT_32 ucMemAddr4RowIdx : 6; /* [50 : 45] : row index : 0 ~ 63 */ - UINT_32 ucMemAddr4ColIdx : 3; /* [44 : 42] : column index : 0 ~ 5 */ - UINT_32 ucMemAddr3RowIdx : 6; /* [41 : 36] : row index : 0 ~ 63 */ - UINT_32 ucMemAddr3ColIdx : 3; /* [35 : 33] : column index : 0 ~ 5 */ - UINT_32 ucMemAddr2RowIdxMsb : 1; /* [32] : MSB of row index */ - - /* DWORD2 */ - UINT_32 ucSNR_STS3 : 8; /* [95:88] : SNR_STS3 */ - UINT_32 ucSNR_STS2 : 8; /* [87:80] : SNR_STS2 */ - UINT_32 ucSNR_STS1 : 8; /* [79:72] : SNR_STS1 */ - UINT_32 ucSNR_STS0 : 8; /* [71:64] : SNR_STS0 */ - - /* DWORD3 */ - UINT_32 ucReserved2 : 24; /* reserved */ - UINT_32 ucIBfLnaIdx : 8; /* [103:96] : iBF LNA index */ - } rField; - UINT_32 au4RawData[4]; -} PFMU_PROFILE_TAG1, *P_PFMU_PROFILE_TAG1; - -typedef union _PFMU_PROFILE_TAG2 { - struct { - /* DWORD0 */ - UINT_32 ucMCSThS1SS : 4; /* [31:28] : MCS TH short 1SS */ - UINT_32 ucMCSThL1SS : 4; /* [27:24] : MCS TH long 1SS */ - UINT_32 ucReserved1 : 1; /* [23] : Reserved */ - UINT_32 ucRMSDThd : 3; /* [22:20] : RMSD Threshold */ - UINT_32 ucSEIdx : 5; /* [19:15] : SE index */ - UINT_32 ucReserved0 : 3; /* [14:12] : Reserved */ - UINT_32 u2SmartAnt : 12; /* [11:0] : Smart Ant config */ - - /* DWORD1 */ - UINT_32 ucReserved2 : 8; /* [63:56] : Reserved */ - UINT_32 uciBfTimeOut : 8; /* [55:48] : iBF timeout limit */ - UINT_32 ucMCSThS3SS : 4; /* [47:44] : MCS TH short 3SS */ - UINT_32 ucMCSThL3SS : 4; /* [43:40] : MCS TH long 3SS */ - UINT_32 ucMCSThS2SS : 4; /* [39:36] : MCS TH short 2SS */ - UINT_32 ucMCSThL2SS : 4; /* [35:32] : MCS TH long 2SS */ - - /* DWORD2 */ - UINT_32 u2Reserved5 : 10; /* [95:86] : Reserved */ - UINT_32 uciBfNrow : 2; /* [85:84] : iBF desired Nrow = 1 ~ 4 */ - UINT_32 uciBfNcol : 2; /* [83:82] : iBF desired Ncol = 1 ~ 3 */ - UINT_32 uciBfDBW : 2; /* [81:80] : iBF desired DBW 0/1/2/3 : BW20/40/80/160NC */ - UINT_32 ucReserved4 : 8; /* [79:72] : Reserved */ - UINT_32 ucReserved3 : 8; /* [71:64] : Reserved */ - } rField; - UINT_32 au4RawData[3]; -} PFMU_PROFILE_TAG2, *P_PFMU_PROFILE_TAG2; - -typedef union _PFMU_PN { - struct { - /* DWORD0 */ - UINT_32 u2CMM_1STS_Tx2 : 10; - UINT_32 u2CMM_1STS_Tx1 : 11; - UINT_32 u2CMM_1STS_Tx0 : 11; - - /* DWORD1 */ - UINT_32 u2CMM_2STS_Tx1 : 9; - UINT_32 u2CMM_2STS_Tx0 : 11; - UINT_32 u2CMM_1STS_Tx3 : 11; - UINT_32 u2CMM_1STS_Tx2Msb : 1; - - /* DWORD2 */ - UINT_32 u2CMM_3STS_Tx0 : 8; - UINT_32 u2CMM_2STS_Tx3 : 11; - UINT_32 u2CMM_2STS_Tx2 : 11; - UINT_32 u2CMM_2STS_Tx1Msb : 2; - - /* DWORD3 */ - UINT_32 u2CMM_3STS_Tx3 : 7; - UINT_32 u2CMM_3STS_Tx2 : 11; - UINT_32 u2CMM_3STS_Tx1 : 11; - UINT_32 u2CMM_3STS_Tx0Msb : 3; - - /* DWORD4 */ - UINT_32 reserved : 28; - UINT_32 u2CMM_3STS_Tx3Msb : 4; - } rField; - UINT_32 au4RawData[5]; -} PFMU_PN, *P_PFMU_PN; - -typedef union _PFMU_PN_DBW20 { - struct { - /* DWORD0 */ - UINT_32 u2DBW20_1STS_Tx2 : 10; - UINT_32 u2DBW20_1STS_Tx1 : 11; - UINT_32 u2DBW20_1STS_Tx0 : 11; - - /* DWORD1 */ - UINT_32 u2DBW20_2STS_Tx1 : 9; - UINT_32 u2DBW20_2STS_Tx0 : 11; - UINT_32 u2DBW20_1STS_Tx3 : 11; - UINT_32 u2DBW20_1STS_Tx2Msb : 1; - - /* DWORD2 */ - UINT_32 u2DBW20_3STS_Tx0 : 8; - UINT_32 u2DBW20_2STS_Tx3 : 11; - UINT_32 u2DBW20_2STS_Tx2 : 11; - UINT_32 u2DBW20_2STS_Tx1Msb : 2; - - /* DWORD3 */ - UINT_32 u2DBW20_3STS_Tx3 : 7; - UINT_32 u2DBW20_3STS_Tx2 : 11; - UINT_32 u2DBW20_3STS_Tx1 : 11; - UINT_32 u2DBW20_3STS_Tx0Msb : 3; - - /* DWORD4 */ - UINT_32 reserved : 28; - UINT_32 u2DBW20_3STS_Tx3Msb : 4; - } rField; - UINT_32 au4RawData[5]; -} PFMU_PN_DBW20M, *P_PFMU_PN_DBW20M; - -typedef union _PFMU_PN_DBW40 { - struct { - /* DWORD0 */ - UINT_32 u2DBW40_1STS_Tx2 : 10; - UINT_32 u2DBW40_1STS_Tx1 : 11; - UINT_32 u2DBW40_1STS_Tx0 : 11; - - /* DWORD1 */ - UINT_32 u2DBW40_2STS_Tx1 : 9; - UINT_32 u2DBW40_2STS_Tx0 : 11; - UINT_32 u2DBW40_1STS_Tx3 : 11; - UINT_32 u2DBW40_1STS_Tx2Msb : 1; - - /* DWORD2 */ - UINT_32 u2DBW40_3STS_Tx0 : 8; - UINT_32 u2DBW40_2STS_Tx3 : 11; - UINT_32 u2DBW40_2STS_Tx2 : 11; - UINT_32 u2DBW40_2STS_Tx1Msb : 2; - - /* DWORD3 */ - UINT_32 u2DBW40_3STS_Tx3 : 7; - UINT_32 u2DBW40_3STS_Tx2 : 11; - UINT_32 u2DBW40_3STS_Tx1 : 11; - UINT_32 u2DBW40_3STS_Tx0Msb : 3; - - /* DWORD4 */ - UINT_32 reserved : 28; - UINT_32 u2DBW40_3STS_Tx3Msb : 4; - } rField; - UINT_32 au4RawData[5]; -} PFMU_PN_DBW40M, *P_PFMU_PN_DBW40M; - -typedef union _PFMU_PN_DBW80 { - struct { - /* DWORD0 */ - UINT_32 u2DBW80_1STS_Tx2 : 10; - UINT_32 u2DBW80_1STS_Tx1 : 11; - UINT_32 u2DBW80_1STS_Tx0 : 11; - - /* DWORD1 */ - UINT_32 u2DBW80_2STS_Tx1 : 9; - UINT_32 u2DBW80_2STS_Tx0 : 11; - UINT_32 u2DBW80_1STS_Tx3 : 11; - UINT_32 u2DBW80_1STS_Tx2Msb : 1; - - /* DWORD2 */ - UINT_32 u2DBW80_3STS_Tx0 : 8; - UINT_32 u2DBW80_2STS_Tx3 : 11; - UINT_32 u2DBW80_2STS_Tx2 : 11; - UINT_32 u2DBW80_2STS_Tx1Msb : 2; - - /* DWORD3 */ - UINT_32 u2DBW80_3STS_Tx3 : 7; - UINT_32 u2DBW80_3STS_Tx2 : 11; - UINT_32 u2DBW80_3STS_Tx1 : 11; - UINT_32 u2DBW80_3STS_Tx0Msb : 3; - - /* DWORD4 */ - UINT_32 reserved : 28; - UINT_32 u2DBW80_3STS_Tx3Msb : 4; - } rField; - UINT_32 au4RawData[5]; -} PFMU_PN_DBW80M, *P_PFMU_PN_DBW80M; - -typedef union _PFMU_PN_DBW80_80 { - struct { - /* DWORD0 */ - UINT_32 u2DBW160_2STS_Tx0 : 10; - UINT_32 u2DBW160_1STS_Tx1 : 11; - UINT_32 u2DBW160_1STS_Tx0 : 11; - - /* DWORD1 */ - UINT_32 reserved : 20; - UINT_32 u2DBW160_2STS_Tx1 : 11; - UINT_32 u2DBW160_2STS_Tx0Msb : 1; - } rField; - UINT_32 au4RawData[2]; -} PFMU_PN_DBW80_80M, *P_PFMU_PN_DBW80_80M; - -typedef union _PFMU_DATA { - struct { - /* DWORD0 */ - UINT_32 ucPsi31 : 7; - UINT_32 u2Phi21 : 9; - UINT_32 ucPsi21 : 7; - UINT_32 u2Phi11 : 9; - - /* DWORD1 */ - UINT_32 ucPsi32 : 7; - UINT_32 u2Phi22 : 9; - UINT_32 ucPsi41 : 7; - UINT_32 u2Phi31 : 9; - - /* DWORD2 */ - UINT_32 ucPsi43 : 7; - UINT_32 u2Phi33 : 9; - UINT_32 ucPsi42 : 7; - UINT_32 u2Phi32 : 9; - - /* DWORD3 */ - UINT_32 u2Reserved : 16; - UINT_32 u2dSNR03 : 4; - UINT_32 u2dSNR02 : 4; - UINT_32 u2dSNR01 : 4; - UINT_32 u2dSNR00 : 4; - - /* DWORD4 */ - UINT_32 u4Reserved; - } rField; - UINT_32 au4RawData[5]; -} PFMU_DATA, *P_PFMU_DATA; - -#else - -typedef union _PFMU_PROFILE_TAG1 { - struct { - /* DWORD0 */ - UINT_32 ucProfileID : 7; /* [6:0] : 0 ~ 63 */ - UINT_32 ucTxBf : 1; /* [7] : 0: iBF, 1: eBF */ - UINT_32 ucDBW : 2; /* [9:8] : 0/1/2/3: DW20/40/80/160NC */ - UINT_32 ucSU_MU : 1; /* [10] : 0:SU, 1: MU */ - UINT_32 ucInvalidProf : 1; /* [11] : 0:default, 1: This profile number is invalid by SW */ - UINT_32 ucRMSD : 3; /* [14:12] : RMSD value from CE */ - UINT_32 ucMemAddr1ColIdx : 3; /* [17 : 15] : column index : 0 ~ 5 */ - UINT_32 ucMemAddr1RowIdx : 6; /* [23 : 18] : row index : 0 ~ 63 */ - UINT_32 ucMemAddr2ColIdx : 3; /* [26 : 24] : column index : 0 ~ 5 */ - UINT_32 ucMemAddr2RowIdx : 5; /* [31 : 27] : row index : 0 ~ 63 */ - UINT_32 ucMemAddr2RowIdxMsb : 1; /* [32] : MSB of row index */ - UINT_32 ucMemAddr3ColIdx : 3; /* [35 : 33] : column index : 0 ~ 5 */ - UINT_32 ucMemAddr3RowIdx : 6; /* [41 : 36] : row index : 0 ~ 63 */ - UINT_32 ucMemAddr4ColIdx : 3; /* [44 : 42] : column index : 0 ~ 5 */ - UINT_32 ucMemAddr4RowIdx : 6; /* [50 : 45] : row index : 0 ~ 63 */ - UINT_32 ucReserved : 1; /* [51] : Reserved */ - UINT_32 ucNrow : 2; /* [53 : 52] : Nrow */ - UINT_32 ucNcol : 2; /* [55 : 54] : Ncol */ - UINT_32 ucNgroup : 2; /* [57 : 56] : Ngroup */ - UINT_32 ucLM : 2; /* [59 : 58] : 0/1/2 */ - UINT_32 ucCodeBook : 2; /* [61:60] : Code book */ - UINT_32 ucHtcExist : 1; /* [62] : HtcExist */ - UINT_32 ucReserved1 : 1; /* [63] : Reserved */ - /* DWORD2 */ - UINT_32 ucSNR_STS0 : 8; /* [71:64] : SNR_STS0 */ - UINT_32 ucSNR_STS1 : 8; /* [79:72] : SNR_STS1 */ - UINT_32 ucSNR_STS2 : 8; /* [87:80] : SNR_STS2 */ - UINT_32 ucSNR_STS3 : 8; /* [95:88] : SNR_STS3 */ - /* DWORD3 */ - UINT_32 ucIBfLnaIdx : 8; /* [103:96] : iBF LNA index */ - UINT_32 ucReserved2 : 24; /* : Reserved */ - } rField; - UINT_32 au4RawData[4]; -} PFMU_PROFILE_TAG1, *P_PFMU_PROFILE_TAG1; - -typedef union _PFMU_PROFILE_TAG2 { - struct { - /* DWORD0 */ - UINT_32 u2SmartAnt : 12; /* [11:0] : Smart Ant config */ - UINT_32 ucReserved0 : 3; /* [14:12] : Reserved */ - UINT_32 ucSEIdx : 5; /* [19:15] : SE index */ - UINT_32 ucRMSDThd : 3; /* [22:20] : RMSD Threshold */ - UINT_32 ucReserved1 : 1; /* [23] : Reserved */ - UINT_32 ucMCSThL1SS : 4; /* [27:24] : MCS TH long 1SS */ - UINT_32 ucMCSThS1SS : 4; /* [31:28] : MCS TH short 1SS */ - /* DWORD1 */ - UINT_32 ucMCSThL2SS : 4; /* [35:32] : MCS TH long 2SS */ - UINT_32 ucMCSThS2SS : 4; /* [39:36] : MCS TH short 2SS */ - UINT_32 ucMCSThL3SS : 4; /* [43:40] : MCS TH long 3SS */ - UINT_32 ucMCSThS3SS : 4; /* [47:44] : MCS TH short 3SS */ - UINT_32 uciBfTimeOut : 8; /* [55:48] : iBF timeout limit */ - UINT_32 ucReserved2 : 8; /* [63:56] : Reserved */ - /* DWORD2 */ - UINT_32 ucReserved3 : 8; /* [71:64] : Reserved */ - UINT_32 ucReserved4 : 8; /* [79:72] : Reserved */ - UINT_32 uciBfDBW : 2; /* [81:80] : iBF desired DBW 0/1/2/3 : BW20/40/80/160NC */ - UINT_32 uciBfNcol : 2; /* [83:82] : iBF desired Ncol = 1 ~ 3 */ - UINT_32 uciBfNrow : 2; /* [85:84] : iBF desired Nrow = 1 ~ 4 */ - UINT_32 u2Reserved5 : 10; /* [95:86] : Reserved */ - } rField; - UINT_32 au4RawData[3]; -} PFMU_PROFILE_TAG2, *P_PFMU_PROFILE_TAG2; - -typedef union _PFMU_PN { - struct { - /* DWORD0 */ - UINT_32 u2CMM_1STS_Tx0 : 11; - UINT_32 u2CMM_1STS_Tx1 : 11; - UINT_32 u2CMM_1STS_Tx2 : 10; - /* DWORD1 */ - UINT_32 u2CMM_1STS_Tx2Msb : 1; - UINT_32 u2CMM_1STS_Tx3 : 11; - UINT_32 u2CMM_2STS_Tx0 : 11; - UINT_32 u2CMM_2STS_Tx1 : 9; - /* DWORD2 */ - UINT_32 u2CMM_2STS_Tx1Msb : 2; - UINT_32 u2CMM_2STS_Tx2 : 11; - UINT_32 u2CMM_2STS_Tx3 : 11; - UINT_32 u2CMM_3STS_Tx0 : 8; - /* DWORD3 */ - UINT_32 u2CMM_3STS_Tx0Msb : 3; - UINT_32 u2CMM_3STS_Tx1 : 11; - UINT_32 u2CMM_3STS_Tx2 : 11; - UINT_32 u2CMM_3STS_Tx3 : 7; - /* DWORD4 */ - UINT_32 u2CMM_3STS_Tx3Msb : 4; - UINT_32 reserved : 28; - } rField; - UINT_32 au4RawData[5]; -} PFMU_PN, *P_PFMU_PN; - -typedef union _PFMU_PN_DBW20 { - struct { - /* DWORD0 */ - UINT_32 u2DBW20_1STS_Tx0 : 11; - UINT_32 u2DBW20_1STS_Tx1 : 11; - UINT_32 u2DBW20_1STS_Tx2 : 10; - /* DWORD1 */ - UINT_32 u2DBW20_1STS_Tx2Msb : 1; - UINT_32 u2DBW20_1STS_Tx3 : 11; - UINT_32 u2DBW20_2STS_Tx0 : 11; - UINT_32 u2DBW20_2STS_Tx1 : 9; - /* DWORD2 */ - UINT_32 u2DBW20_2STS_Tx1Msb : 2; - UINT_32 u2DBW20_2STS_Tx2 : 11; - UINT_32 u2DBW20_2STS_Tx3 : 11; - UINT_32 u2DBW20_3STS_Tx0 : 8; - /* DWORD3 */ - UINT_32 u2DBW20_3STS_Tx0Msb : 3; - UINT_32 u2DBW20_3STS_Tx1 : 11; - UINT_32 u2DBW20_3STS_Tx2 : 11; - UINT_32 u2DBW20_3STS_Tx3 : 7; - /* DWORD4 */ - UINT_32 u2DBW20_3STS_Tx3Msb : 4; - UINT_32 reserved : 28; - } rField; - UINT_32 au4RawData[5]; -} PFMU_PN_DBW20M, *P_PFMU_PN_DBW20M; - -typedef union _PFMU_PN_DBW40 { - struct { - /* DWORD0 */ - UINT_32 u2DBW40_1STS_Tx0 : 11; - UINT_32 u2DBW40_1STS_Tx1 : 11; - UINT_32 u2DBW40_1STS_Tx2 : 10; - /* DWORD1 */ - UINT_32 u2DBW40_1STS_Tx2Msb : 1; - UINT_32 u2DBW40_1STS_Tx3 : 11; - UINT_32 u2DBW40_2STS_Tx0 : 11; - UINT_32 u2DBW40_2STS_Tx1 : 9; - /* DWORD2 */ - UINT_32 u2DBW40_2STS_Tx1Msb : 2; - UINT_32 u2DBW40_2STS_Tx2 : 11; - UINT_32 u2DBW40_2STS_Tx3 : 11; - UINT_32 u2DBW40_3STS_Tx0 : 8; - /* DWORD3 */ - UINT_32 u2DBW40_3STS_Tx0Msb : 3; - UINT_32 u2DBW40_3STS_Tx1 : 11; - UINT_32 u2DBW40_3STS_Tx2 : 11; - UINT_32 u2DBW40_3STS_Tx3 : 7; - /* DWORD4 */ - UINT_32 u2DBW40_3STS_Tx3Msb : 4; - UINT_32 reserved : 28; - } rField; - UINT_32 au4RawData[5]; -} PFMU_PN_DBW40M, *P_PFMU_PN_DBW40M; - -typedef union _PFMU_PN_DBW80 { - struct { - /* DWORD0 */ - UINT_32 u2DBW80_1STS_Tx0 : 11; - UINT_32 u2DBW80_1STS_Tx1 : 11; - UINT_32 u2DBW80_1STS_Tx2 : 10; - /* DWORD1 */ - UINT_32 u2DBW80_1STS_Tx2Msb : 1; - UINT_32 u2DBW80_1STS_Tx3 : 11; - UINT_32 u2DBW80_2STS_Tx0 : 11; - UINT_32 u2DBW80_2STS_Tx1 : 9; - /* DWORD2 */ - UINT_32 u2DBW80_2STS_Tx1Msb : 2; - UINT_32 u2DBW80_2STS_Tx2 : 11; - UINT_32 u2DBW80_2STS_Tx3 : 11; - UINT_32 u2DBW80_3STS_Tx0 : 8; - /* DWORD3 */ - UINT_32 u2DBW80_3STS_Tx0Msb : 3; - UINT_32 u2DBW80_3STS_Tx1 : 11; - UINT_32 u2DBW80_3STS_Tx2 : 11; - UINT_32 u2DBW80_3STS_Tx3 : 7; - /* DWORD4 */ - UINT_32 u2DBW80_3STS_Tx3Msb : 4; - UINT_32 reserved : 28; - } rField; - UINT_32 au4RawData[5]; -} PFMU_PN_DBW80M, *P_PFMU_PN_DBW80M; - -typedef union _PFMU_PN_DBW80_80 { - struct { - /* DWORD0 */ - UINT_32 u2DBW160_1STS_Tx0 : 11; - UINT_32 u2DBW160_1STS_Tx1 : 11; - UINT_32 u2DBW160_2STS_Tx0 : 10; - /* DWORD1 */ - UINT_32 u2DBW160_2STS_Tx0Msb : 1; - UINT_32 u2DBW160_2STS_Tx1 : 11; - UINT_32 reserved : 20; - } rField; - UINT_32 au4RawData[2]; -} PFMU_PN_DBW80_80M, *P_PFMU_PN_DBW80_80M; - -typedef union _PFMU_DATA { - struct { - /* DWORD0 */ - UINT_32 u2Phi11 : 9; - UINT_32 ucPsi21 : 7; - UINT_32 u2Phi21 : 9; - UINT_32 ucPsi31 : 7; - /* DWORD1 */ - UINT_32 u2Phi31 : 9; - UINT_32 ucPsi41 : 7; - UINT_32 u2Phi22 : 9; - UINT_32 ucPsi32 : 7; - /* DWORD2 */ - UINT_32 u2Phi32 : 9; - UINT_32 ucPsi42 : 7; - UINT_32 u2Phi33 : 9; - UINT_32 ucPsi43 : 7; - /* DWORD3 */ - UINT_32 u2dSNR00 : 4; - UINT_32 u2dSNR01 : 4; - UINT_32 u2dSNR02 : 4; - UINT_32 u2dSNR03 : 4; - UINT_32 u2Reserved : 16; - } rField; - UINT_32 au4RawData[5]; -} PFMU_DATA, *P_PFMU_DATA; -#endif -typedef struct _PFMU_HALF_DATA { - UINT_16 u2SubCarrIdx; - INT_16 i2Phi11; - INT_16 i2Phi21; - INT_16 i2Phi31; -} PFMU_HALF_DATA, *P_PFMU_HALF_DATA; - -typedef struct _BF_QD { - UINT_32 u4qd[14]; -} BF_QD, *P_BF_QD; - -typedef enum _BF_SOUNDING_MODE { - SU_SOUNDING = 0, - MU_SOUNDING, - SU_PERIODIC_SOUNDING, - MU_PERIODIC_SOUNDING, - BF_PROCESSING, -} BF_SOUNDING_MODE; -#endif /* #ifdef MT_MAC */ - -typedef enum _BF_ACTION_CATEGORY { - BF_SOUNDING_OFF = 0, - BF_SOUNDING_ON, - BF_DATA_PACKET_APPLY, - BF_PFMU_MEM_ALLOCATE, - BF_PFMU_MEM_RELEASE, - BF_PFMU_TAG_READ, - BF_PFMU_TAG_WRITE, - BF_PROFILE_READ, - BF_PROFILE_WRITE, - BF_PN_READ, - BF_PN_WRITE, - BF_PFMU_MEM_ALLOC_MAP_READ, - BF_AID_SET, - BF_STA_REC_READ, - BF_PHASE_CALIBRATION, - BF_IBF_PHASE_COMP, - BF_LNA_GAIN_CONFIG, - BF_PROFILE_WRITE_20M_ALL, - BF_APCLIENT_CLUSTER, - BF_AWARE_CTRL, - BF_HW_ENABLE_STATUS_UPDATE, - BF_REPT_CLONED_STA_TO_NORMAL_STA, - BF_GET_QD, - BF_BFEE_HW_CTRL, - BF_PFMU_SW_TAG_WRITE, - BF_MOD_EN_CTRL -} BF_ACTION_CATEGORY; - -/* Indices of valid rows in Implicit and Explicit profiles for 20 and 40 MHz */ -typedef struct { - int lwb1, upb1; - int lwb2, upb2; -} SC_TABLE_ENTRY; - -typedef struct { - UCHAR E1gBeg; - UCHAR E1gEnd; - UCHAR E1aHighBeg; - UCHAR E1aHighEnd; - UCHAR E1aLowBeg; - UCHAR E1aLowEnd; - UCHAR E1aMidBeg; - UCHAR E1aMidMid; - UCHAR E1aMidEnd; -} ITXBF_PHASE_PARAMS; /* ITxBF BBP reg phase calibration parameters */ - -typedef struct { - UCHAR E1gBeg[3]; - UCHAR E1gEnd[3]; - UCHAR E1aHighBeg[3]; - UCHAR E1aHighEnd[3]; - UCHAR E1aLowBeg[3]; - UCHAR E1aLowEnd[3]; - UCHAR E1aMidBeg[3]; - UCHAR E1aMidMid[3]; - UCHAR E1aMidEnd[3]; -} ITXBF_LNA_PARAMS; /* ITxBF BBP reg LNA calibration parameters */ - -typedef struct { - UCHAR E1gBeg; - UCHAR E1gEnd; - UCHAR E1aHighBeg; - UCHAR E1aHighEnd; - UCHAR E1aLowBeg; - UCHAR E1aLowEnd; - UCHAR E1aMidBeg; - UCHAR E1aMidMid; - UCHAR E1aMidEnd; -} ITXBF_DIV_PARAMS; /* ITxBF Divider Calibration parameters */ - -typedef struct _TXBF_STATUS_INFO { - UCHAR ucPhyMode; - UCHAR ucBW; - USHORT u2Channel; - UCHAR ucTxPathNum; - UCHAR ucRxPathNum; - UCHAR ucETxBfTxEn; - UCHAR ucITxBfTxEn; - UCHAR ucNDPARate; - UCHAR ucNDPRate; - UCHAR ucWcid; - UINT32 u4WTBL1; - UINT32 u4WTBL2; - HT_BF_CAP *pHtTxBFCap; -#ifdef VHT_TXBF_SUPPORT - struct _VHT_CAP_INFO *pVhtTxBFCap; -#endif - ULONG cmmCfgITxBfTimeout; - ULONG cmmCfgETxBfTimeout; - ULONG cmmCfgETxBfEnCond; /* Enable sending of sounding and beamforming */ - BOOLEAN cmmCfgETxBfNoncompress; /* Force non-compressed Sounding Response */ - BOOLEAN cmmCfgETxBfIncapable; /* Report Incapable of BF in TX BF Capabilities */ - -} TXBF_STATUS_INFO; - -typedef struct { - /* ETxBF */ - UCHAR bfState; - UCHAR sndgMcs; - UCHAR sndgBW; - UCHAR sndg0Mcs; - INT sndg0Snr0, sndg0Snr1, sndg0Snr2; - - UCHAR noSndgCnt; - UCHAR eTxBfEnCond; - UCHAR noSndgCntThrd, ndpSndgStreams; - UCHAR iTxBfEn; - -} TXBF_MAC_TABLE_ENTRY; - -VOID mt_TxBFInit(IN struct _RTMP_ADAPTER *pAd, IN TXBF_STATUS_INFO *pTxBfInfo, - IN TXBF_MAC_TABLE_ENTRY *pEntryTxBf, IN HT_BF_CAP *pTxBFCap, - IN BOOLEAN supportsETxBF); - -VOID mt_TxBFFwInit(IN struct _RTMP_ADAPTER *pAd); - -VOID mt_WrapTxBFInit(IN struct _RTMP_ADAPTER *pAd, - IN struct _MAC_TABLE_ENTRY *pEntry, IN IE_LISTS *ie_list, - IN BOOLEAN supportsETxBF); - -BOOLEAN mt_clientSupportsETxBF(IN struct _RTMP_ADAPTER *pAd, - IN HT_BF_CAP *pTxBFCap, - IN BOOLEAN ETxBfNoncompress); - -BOOLEAN mt_WrapClientSupportsETxBF(IN struct _RTMP_ADAPTER *pAd, - IN HT_BF_CAP *pTxBFCap); - -void mt_WrapSetETxBFCap(IN struct _RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN HT_BF_CAP *pTxBFCap); - -#ifdef VHT_TXBF_SUPPORT -BOOLEAN mt_clientSupportsVhtETxBF(IN struct _RTMP_ADAPTER *pAd, - IN VHT_CAP_INFO *pTxBFCap); - -BOOLEAN mt_WrapClientSupportsVhtETxBF(IN struct _RTMP_ADAPTER *pAd, - IN VHT_CAP_INFO *pTxBFCap); - -void mt_WrapSetVHTETxBFCap(IN struct _RTMP_ADAPTER *pAd, - IN struct wifi_dev *wdev, - IN struct _VHT_CAP_INFO *pTxBFCap); -#endif /* VHT_TXBF_SUPPORT */ - -VOID TxBfProfileTag_PfmuIdx(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN UCHAR ucProfileID); - -VOID TxBfProfileTag_TxBfType(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN UCHAR ucTxBf); - -VOID TxBfProfileTag_DBW(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucBw); - -VOID TxBfProfileTag_SuMu(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucSuMu); - -VOID TxBfProfileTag_InValid(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN UCHAR InvalidFlg); - -VOID TxBfProfileTag_Mem(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN PUCHAR pMemAddrColIdx, IN PUCHAR pMemAddrRowIdx); - -VOID TxBfProfileTag_Matrix(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucNrow, - IN UCHAR ucNcol, IN UCHAR ucNgroup, IN UCHAR ucLM, - IN UCHAR ucCodeBook, IN UCHAR ucHtcExist); - -VOID TxBfProfileTag_SNR(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucSNR_STS0, - IN UCHAR ucSNR_STS1, IN UCHAR ucSNR_STS2, - IN UCHAR ucSNR_STS3); - -VOID TxBfProfileTag_SmtAnt(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN USHORT u2SmartAnt); - -VOID TxBfProfileTag_SeIdx(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, IN UCHAR ucSEIdx); - -VOID TxBfProfileTag_RmsdThd(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR ucRMSDThd); - -VOID TxBfProfileTag_McsThd(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN PUCHAR pMCSThLSS, IN PUCHAR pMCSThSSS); - -VOID TxBfProfileTag_TimeOut(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR uciBfTimeOut); - -VOID TxBfProfileTag_DesiredBW(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR uciBfDBW); - -VOID TxBfProfileTag_DesiredNc(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR uciBfNcol); - -VOID TxBfProfileTag_DesiredNr(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR uciBfNrow); - -INT TxBfProfileTagRead(IN struct _RTMP_ADAPTER *pAd, IN UCHAR PfmuIdx, - IN BOOLEAN fgBFer); - -INT TxBfProfileTagWrite(IN struct _RTMP_ADAPTER *pAd, - IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN P_PFMU_PROFILE_TAG2 prPfmuTag2, IN UCHAR profileIdx); - -VOID TxBfProfileTagPrint(IN struct _RTMP_ADAPTER *pAd, IN BOOLEAN fgBFer, - IN PUCHAR pBuf); - -INT TxBfProfilePnRead(IN struct _RTMP_ADAPTER *pAd, IN UCHAR profileIdx); - -INT TxBfProfilePnWrite(IN struct _RTMP_ADAPTER *pAd, IN UCHAR PfmuIdx, - IN UCHAR ucBw, IN PUCHAR pProfileData); - -VOID TxBfProfilePnPrint(IN UCHAR ucBw, IN PUCHAR pBuf); - -INT TxBfProfileDataRead(IN struct _RTMP_ADAPTER *pAd, IN UCHAR profileIdx, - IN BOOLEAN fgBFer, IN USHORT subCarrIdx); - -INT TxBfProfileDataWrite(IN struct _RTMP_ADAPTER *pAd, IN UCHAR profileIdx, - IN USHORT subCarrIdx, IN PUCHAR pProfileData); - -INT TxBfProfileDataWrite20MAll(IN struct _RTMP_ADAPTER *pAd, - IN UCHAR profileIdx, IN PUCHAR pProfileData); - -VOID TxBfProfileDataPrint(IN struct _RTMP_ADAPTER *pAd, IN USHORT subCarrIdx, - IN PUCHAR pBuf); - -INT TxBfQdRead(IN struct _RTMP_ADAPTER *pAd, IN INT8 subCarrIdx); - -INT mt_Trigger_Sounding_Packet(IN struct _RTMP_ADAPTER *pAd, IN UCHAR SndgEn, - IN UINT32 u4SNDPeriod, IN UCHAR ucSu_Mu, - IN UCHAR ucMuNum, IN PUCHAR pWlanId); - -VOID TxBfProfileMemAllocMap(IN PUCHAR pBuf); - -BOOLEAN TxBfModuleEnCtrl(IN struct _RTMP_ADAPTER *pAd); - -#ifdef TXBF_DYNAMIC_DISABLE -INT DynamicTxBfDisable(IN struct _RTMP_ADAPTER *pAd, IN BOOLEAN fgDisable); -#endif /* TXBF_DYNAMIC_DISABLE */ - -VOID StaRecBfUpdate(IN struct _MAC_TABLE_ENTRY *pEntry, - IN P_CMD_STAREC_BF pCmdStaRecBf); - -VOID StaRecBfRead(IN struct _RTMP_ADAPTER *pAd, IN PUCHAR pBuf); - -INT32 mt_AsicBfStaRecUpdate(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucPhyMode, - IN UCHAR ucBssIdx, IN UCHAR ucWlanIdx); - -INT32 mt_AsicBfStaRecRelease(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucBssIdx, - IN UCHAR ucWlanIdx); - -VOID mt_AsicClientBfCap(IN struct _RTMP_ADAPTER *pAd, - IN struct _MAC_TABLE_ENTRY *pEntry); - -UCHAR AsicTxBfEnCondProc(IN struct _RTMP_ADAPTER *pAd, - IN TXBF_STATUS_INFO *pTxBfInfo); - -/* displayTagfield - display one tagfield */ -void displayTagfield(IN struct _RTMP_ADAPTER *pAd, IN int profileNum, - IN BOOLEAN implicitProfile); - -#endif /* TXBF_SUPPORT // */ - -UINT32 starec_txbf_feature_decision(struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, - UINT32 *feature); - -#endif /* _RT_TXBF_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txbf/mt_txbf_cal.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txbf/mt_txbf_cal.h deleted file mode 100644 index dd06411a62..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txbf/mt_txbf_cal.h +++ /dev/null @@ -1,351 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_txbf_cal.h -*/ - -#ifndef _RT_TXBF_CAL_H_ -#define _RT_TXBF_CAL_H_ - -#define TX_PATH_2 2 -#define TX_PATH_3 3 -#define TX_PATH_4 4 - -#define GROUP_0 0 -#define CH_001 1 -#define CH_008 8 -#define CH_014 14 -#define GROUP_1 1 -#define CH_184 184 -#define CH_196 196 -#define GROUP_2 2 -#define CH_036 36 -#define CH_044 44 -#define GROUP_3 3 -#define CH_052 52 -#define CH_060 60 -#define CH_068 68 -#define GROUP_4 4 -#define CH_072 72 -#define CH_084 84 -#define CH_092 92 -#define GROUP_5 5 -#define CH_096 96 -#define CH_104 104 -#define CH_112 112 -#define GROUP_6 6 -#define CH_116 116 -#define CH_124 124 -#define CH_136 136 -#define GROUP_7 7 -#define CH_140 140 -#define CH_149 149 -#define CH_157 157 -#define GROUP_8 8 -#define CH_161 161 -#define CH_173 173 -#define CH_181 181 - -#define GROUP_L 0 -#define GROUP_M 1 -#define GROUP_H 2 - -#define IBF_PHASE_EEPROM_START 0x220 - -#define IBF_LNA_PHASE_G0_ADDR IBF_PHASE_EEPROM_START -#define IBF_LNA_PHASE_G1_ADDR (IBF_LNA_PHASE_G0_ADDR + 0x15) -#define IBF_LNA_PHASE_G2_ADDR (IBF_LNA_PHASE_G1_ADDR + 0x1E) -#define IBF_LNA_PHASE_G3_ADDR (IBF_LNA_PHASE_G2_ADDR + 0x1A) -#define IBF_LNA_PHASE_G4_ADDR (IBF_LNA_PHASE_G3_ADDR + 0x1E) -#define IBF_LNA_PHASE_G5_ADDR (IBF_LNA_PHASE_G4_ADDR + 0x1E) -#define IBF_LNA_PHASE_G6_ADDR (IBF_LNA_PHASE_G5_ADDR + 0x1E) -#define IBF_LNA_PHASE_G7_ADDR (IBF_LNA_PHASE_G6_ADDR + 0x1E) -#define IBF_LNA_PHASE_G8_ADDR (IBF_PHASE_EEPROM_START + 0x120) - -#define IBF_R0_H_G0 0 -#define IBF_R0_M_G0 1 -#define IBF_R0_L_G0 2 -#define IBF_R1_H_G0 3 -#define IBF_R1_M_G0 4 -#define IBF_R1_L_G0 5 -#define IBF_R2_H_G0 6 -#define IBF_R2_M_G0 7 -#define IBF_R2_L_G0 8 -#define IBF_R3_H_G0 9 -#define IBF_R3_M_G0 10 -#define IBF_R3_L_G0 11 -#define IBF_T0_M_G0 12 -#define IBF_T1_M_G0 13 -#define IBF_T2_M_G0 14 -#define IBF_T0_L_G0 15 -#define IBF_T1_L_G0 16 -#define IBF_T2_L_G0 17 -#define IBF_T0_H_G0 18 -#define IBF_T1_H_G0 19 -#define IBF_T2_H_G0 20 - -#define IBF_R0_H_Gx 0 -#define IBF_R0_M_Gx 1 -#define IBF_R0_L_Gx 2 -#define IBF_R1_H_Gx 3 -#define IBF_R1_M_Gx 4 -#define IBF_R1_L_Gx 5 -#define IBF_R2_H_Gx 6 -#define IBF_R2_M_Gx 7 -#define IBF_R2_L_Gx 8 -#define IBF_R3_H_Gx 9 -#define IBF_R3_M_Gx 10 -#define IBF_R3_L_Gx 11 -#define IBF_R2_SX2_H_Gx 12 -#define IBF_R2_SX2_M_Gx 13 -#define IBF_R2_SX2_L_Gx 14 -#define IBF_R3_SX2_H_Gx 15 -#define IBF_R3_SX2_M_Gx 16 -#define IBF_R3_SX2_L_Gx 17 -#define IBF_T0_M_Gx 18 -#define IBF_T1_M_Gx 19 -#define IBF_T2_M_Gx 20 -#define IBF_T2_SX2_M_Gx 21 -#define IBF_T0_L_Gx 22 -#define IBF_T1_L_Gx 23 -#define IBF_T2_L_Gx 24 -#define IBF_T2_SX2_L_Gx 25 -#define IBF_T0_H_Gx 26 -#define IBF_T1_H_Gx 27 -#define IBF_T2_H_Gx 28 -#define IBF_T2_SX2_H_Gx 29 - -typedef enum _IBF_PHASE_E2P_UPDATE_TYPE { - IBF_PHASE_ONE_GROUP_UPDATE, - IBF_PHASE_ALL_GROUP_UPDATE, - IBF_PHASE_ALL_GROUP_ERASE, - IBF_PHASE_ALL_GROUP_READ_FROM_E2P -} IBF_PHASE_E2P_UPDATE_TYPE; - -typedef enum _IBF_PHASE_CAL_TYPE { - IBF_PHASE_CAL_NOTHING, - IBF_PHASE_CAL_NORMAL, - IBF_PHASE_CAL_VERIFY, - IBF_PHASE_CAL_NORMAL_INSTRUMENT, - - IBF_PHASE_CAL_VERIFY_INSTRUMENT - -} IBF_PHASE_CAL_TYPE; - -typedef enum _IBF_PHASE_STATUS_INSTRUMENT { - STATUS_EBF_INVALID, - STATUS_IBF_INVALID, - STATUS_OTHER_ISSUE, - STATUS_DONE -} IBF_PHASE_STATUS_INSTRUMENT; - -#if defined(MT7615) -typedef struct _MT7615_IBF_PHASE_OUT { - UINT8 ucC0_L; - UINT8 ucC1_L; - UINT8 ucC2_L; - UINT8 ucC3_L; - UINT8 ucC0_M; - UINT8 ucC1_M; - UINT8 ucC2_M; - UINT8 ucC3_M; - UINT8 ucC0_H; - UINT8 ucC1_H; - UINT8 ucC2_H; - UINT8 ucC3_H; -} MT7615_IBF_PHASE_OUT, *P_MT7615_IBF_PHASE_OUT; - -typedef struct _MT7615_IBF_PHASE_G0_T { - UINT8 ucG0_R0_H; - UINT8 ucG0_R0_M; - UINT8 ucG0_R0_L; - UINT8 ucG0_R1_H; - UINT8 ucG0_R1_M; - UINT8 ucG0_R1_L; - UINT8 ucG0_R2_H; - UINT8 ucG0_R2_M; - UINT8 ucG0_R2_L; - UINT8 ucG0_R3_H; - UINT8 ucG0_R3_M; - UINT8 ucG0_R3_L; - UINT8 ucG0_M_T0_H; - UINT8 ucG0_M_T1_H; - UINT8 ucG0_M_T2_H; - UINT8 ucG0_L_T0_H; - UINT8 ucG0_L_T1_H; - UINT8 ucG0_L_T2_H; - UINT8 ucG0_H_T0_H; - UINT8 ucG0_H_T1_H; - UINT8 ucG0_H_T2_H; -} MT7615_IBF_PHASE_G0_T, *P_MT7615_IBF_PHASE_G0_T; - -typedef struct _MT7615_IBF_PHASE_Gx_T { - UINT8 ucGx_R0_H; - UINT8 ucGx_R0_M; - UINT8 ucGx_R0_L; - UINT8 ucGx_R1_H; - UINT8 ucGx_R1_M; - UINT8 ucGx_R1_L; - UINT8 ucGx_R2_H; - UINT8 ucGx_R2_M; - UINT8 ucGx_R2_L; - UINT8 ucGx_R3_H; - UINT8 ucGx_R3_M; - UINT8 ucGx_R3_L; - UINT8 ucGx_R2_H_SX2; - UINT8 ucGx_R2_M_SX2; - UINT8 ucGx_R2_L_SX2; - UINT8 ucGx_R3_H_SX2; - UINT8 ucGx_R3_M_SX2; - UINT8 ucGx_R3_L_SX2; - UINT8 ucGx_M_T0_H; - UINT8 ucGx_M_T1_H; - UINT8 ucGx_M_T2_H; - UINT8 ucGx_M_T2_H_SX2; - UINT8 ucGx_L_T0_H; - UINT8 ucGx_L_T1_H; - UINT8 ucGx_L_T2_H; - UINT8 ucGx_L_T2_H_SX2; - UINT8 ucGx_H_T0_H; - UINT8 ucGx_H_T1_H; - UINT8 ucGx_H_T2_H; - UINT8 ucGx_H_T2_H_SX2; -} MT7615_IBF_PHASE_Gx_T, *P_MT7615_IBF_PHASE_Gx_T; -#endif - -#if defined(MT7622) -typedef struct _MT7622_IBF_PHASE_OUT { - UINT8 ucC0_L; - UINT8 ucC1_L; - UINT8 ucC2_L; - UINT8 ucC0_M; - UINT8 ucC1_M; - UINT8 ucC2_M; - UINT8 ucC0_H; - UINT8 ucC1_H; - UINT8 ucC2_H; - UINT8 ucC0_UH; - UINT8 ucC1_UH; - UINT8 ucC2_UH; - UINT8 ucC_L; - UINT8 ucC_M; - UINT8 ucC_H; - UINT8 ucC_UH; -} MT7622_IBF_PHASE_OUT, *P_MT7622_IBF_PHASE_OUT; - -typedef struct _MT7622_IBF_PHASE_G0_T { - UINT8 ucG0_R0_UH; - UINT8 ucG0_R0_H; - UINT8 ucG0_R0_M; - UINT8 ucG0_R0_L; - UINT8 ucG0_R1_UH; - UINT8 ucG0_R1_H; - UINT8 ucG0_R1_M; - UINT8 ucG0_R1_L; - UINT8 ucG0_R2_UH; - UINT8 ucG0_R2_H; - UINT8 ucG0_R2_M; - UINT8 ucG0_R2_L; - UINT8 ucG0_R3_UH; - UINT8 ucG0_R3_H; - UINT8 ucG0_R3_M; - UINT8 ucG0_R3_L; - UINT8 ucG0_M_T0_UH; - UINT8 ucG0_M_T1_UH; - UINT8 ucG0_M_T2_UH; - UINT8 ucG0_L_T0_UH; - UINT8 ucG0_L_T1_UH; - UINT8 ucG0_L_T2_UH; - UINT8 ucG0_H_T0_UH; - UINT8 ucG0_H_T1_UH; - UINT8 ucG0_H_T2_UH; -} MT7622_IBF_PHASE_G0_T, *P_MT7622_IBF_PHASE_G0_T; - -typedef struct _MT7622_IBF_PHASE_Gx_T { - UINT8 ucGx_R0_UH; - UINT8 ucGx_R0_H; - UINT8 ucGx_R0_M; - UINT8 ucGx_R0_L; - UINT8 ucGx_R1_UH; - UINT8 ucGx_R1_H; - UINT8 ucGx_R1_M; - UINT8 ucGx_R1_L; - UINT8 ucGx_R2_UH; - UINT8 ucGx_R2_H; - UINT8 ucGx_R2_M; - UINT8 ucGx_R2_L; - UINT8 ucGx_R3_UH; - UINT8 ucGx_R3_H; - UINT8 ucGx_R3_M; - UINT8 ucGx_R3_L; - UINT8 ucGx_R2_UH_SX2; - UINT8 ucGx_R2_H_SX2; - UINT8 ucGx_R2_M_SX2; - UINT8 ucGx_R2_L_SX2; - UINT8 ucGx_R3_UH_SX2; - UINT8 ucGx_R3_H_SX2; - UINT8 ucGx_R3_M_SX2; - UINT8 ucGx_R3_L_SX2; - UINT8 ucGx_M_T0_UH; - UINT8 ucGx_M_T1_UH; - UINT8 ucGx_M_T2_UH; - UINT8 ucGx_M_T2_UH_SX2; - UINT8 ucGx_L_T0_UH; - UINT8 ucGx_L_T1_UH; - UINT8 ucGx_L_T2_UH; - UINT8 ucGx_L_T2_UH_SX2; - UINT8 ucGx_H_T0_UH; - UINT8 ucGx_H_T1_UH; - UINT8 ucGx_H_T2_UH; - UINT8 ucGx_H_T2_UH_SX2; -} MT7622_IBF_PHASE_Gx_T, *P_MT7622_IBF_PHASE_Gx_T; -#endif - -#if defined(MT7615) -VOID mt7615_iBFPhaseComp(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucGroup, - IN PCHAR pCmdBuf); - -VOID mt7615_iBFPhaseCalInit(IN struct _RTMP_ADAPTER *pAd); - -VOID mt7615_iBFPhaseFreeMem(IN struct _RTMP_ADAPTER *pAd); - -VOID mt7615_iBFPhaseCalE2PInit(IN struct _RTMP_ADAPTER *pAd); - -VOID mt7615_iBFPhaseCalE2PUpdate(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucGroup, - IN BOOLEAN fgSX2, IN UCHAR ucUpdateAllType); - -VOID mt7615_iBFPhaseCalReport(IN struct _RTMP_ADAPTER *pAd, - IN UCHAR ucGroupL_M_H, IN UCHAR ucGroup, - IN BOOLEAN fgSX2, IN UCHAR ucStatus, - IN UCHAR ucPhaseCalType, IN PUCHAR pBuf); -#endif /* MT7615 */ - -#if defined(MT7622) -VOID mt7622_iBFPhaseComp(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucGroup, - IN PCHAR pCmdBuf); - -VOID mt7622_iBFPhaseCalInit(IN struct _RTMP_ADAPTER *pAd); - -VOID mt7622_iBFPhaseFreeMem(IN struct _RTMP_ADAPTER *pAd); - -VOID mt7622_iBFPhaseCalE2PInit(IN struct _RTMP_ADAPTER *pAd); - -VOID mt7622_iBFPhaseCalE2PUpdate(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucGroup, - IN BOOLEAN fgSX2, IN UCHAR ucUpdateAllType); - -VOID mt7622_iBFPhaseCalReport(IN struct _RTMP_ADAPTER *pAd, - IN UCHAR ucGroupL_M_H, IN UCHAR ucGroup, - IN BOOLEAN fgSX2, IN UCHAR ucStatus, - IN UCHAR ucPhaseCalType, IN PUCHAR pBuf); -#endif /* MT7622 */ -#endif /* _RT_TXBF_CAL_H_ */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_1.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_1.h deleted file mode 100644 index 60b730a381..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_1.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_1[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 25 25 25 " - "Ch2 25 25 25 " - "Ch3 25 25 25 " - "Ch4 25 25 25 " - "Ch5 25 25 25 " - "Ch6 25 25 25 " - "Ch7 25 25 25 " - "Ch8 25 25 25 " - "Ch9 25 25 25 " - "Ch10 25 25 25 " - "Ch11 25 25 25 " - "Ch12 25 25 25 " - "Ch13 25 25 25 " - "Ch14 25 25 25 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 25 25 25 " - "Ch188 25 25 25 " - "Ch192 25 25 25 " - "Ch196 25 25 25 " - "Ch8 25 25 25 " - "Ch12 25 25 25 " - "Ch16 25 25 25 " - "Ch36 25 25 25 " - "Ch40 25 25 25 " - "Ch44 25 25 25 " - "Ch48 25 25 25 " - "Ch52 25 25 25 " - "Ch56 25 25 25 " - "Ch60 25 25 25 " - "Ch64 25 25 25 " - "Ch68 25 25 25 " - "Ch72 25 25 25 " - "Ch76 25 25 25 " - "Ch80 25 25 25 " - "Ch84 25 25 25 " - "Ch88 25 25 25 " - "Ch92 25 25 25 " - "Ch96 25 25 25 " - "Ch100 25 25 25 " - "Ch104 25 25 25 " - "Ch108 25 25 25 " - "Ch112 25 25 25 " - "Ch116 25 25 25 " - "Ch120 25 25 25 " - "Ch124 25 25 25 " - "Ch128 25 25 25 " - "Ch132 25 25 25 " - "Ch136 25 25 25 " - "Ch140 25 25 25 " - "Ch144 25 25 25 " - "Ch149 25 25 25 " - "Ch153 25 25 25 " - "Ch157 25 25 25 " - "Ch161 25 25 25 " - "Ch165 25 25 25 " - "Ch169 25 25 25 " - "Ch173 25 25 25 " - "Ch177 25 25 25 " - "Ch181 25 25 25 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_10.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_10.h deleted file mode 100644 index 23c642dea5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_10.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_10[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_11.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_11.h deleted file mode 100644 index f080d5b823..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_11.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_11[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_12.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_12.h deleted file mode 100644 index 5105813a8e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_12.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_12[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_13.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_13.h deleted file mode 100644 index ae87d67bda..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_13.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_13[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_14.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_14.h deleted file mode 100644 index 749c0e305d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_14.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_14[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_15.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_15.h deleted file mode 100644 index a68fec5ee6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_15.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_15[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_16.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_16.h deleted file mode 100644 index 70960e9f41..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_16.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_16[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_17.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_17.h deleted file mode 100644 index 0ca673f47c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_17.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_17[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_18.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_18.h deleted file mode 100644 index d55e28a849..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_18.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_18[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_19.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_19.h deleted file mode 100644 index 1e33e832e6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_19.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_19[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_2.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_2.h deleted file mode 100644 index c36f7fc919..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_2.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_2[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_20.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_20.h deleted file mode 100644 index 0e729e4d97..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_20.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_20[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_3.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_3.h deleted file mode 100644 index 3d2f04f6f6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_3.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_3[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_4.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_4.h deleted file mode 100644 index bf41655fc1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_4.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_4[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_5.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_5.h deleted file mode 100644 index 2b94ce28af..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_5.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_5[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_6.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_6.h deleted file mode 100644 index 04f0d02278..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_6.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_6[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_7.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_7.h deleted file mode 100644 index 01c8f55f31..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_7.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_7[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_8.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_8.h deleted file mode 100644 index 77286afb3c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_8.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_8[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_9.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_9.h deleted file mode 100644 index 201415a78d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/BFBackoffTable_9.h +++ /dev/null @@ -1,75 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR BFBackoffvalue_9[] = "!! Single SKU Max Power Table (unit is 1 dBm) " - "!! 2.4G Channel " - "Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch1 30 30 30 " - "Ch2 30 30 30 " - "Ch3 30 30 30 " - "Ch4 30 30 30 " - "Ch5 30 30 30 " - "Ch6 30 30 30 " - "Ch7 30 30 30 " - "Ch8 30 30 30 " - "Ch9 30 30 30 " - "Ch10 30 30 30 " - "Ch11 30 30 30 " - "Ch12 30 30 30 " - "Ch13 30 30 30 " - "Ch14 30 30 30 " - " " - "!! 5G Channel " - "Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T " - "Ch184 30 30 30 " - "Ch188 30 30 30 " - "Ch192 30 30 30 " - "Ch196 30 30 30 " - "Ch8 30 30 30 " - "Ch12 30 30 30 " - "Ch16 30 30 30 " - "Ch36 30 30 30 " - "Ch40 30 30 30 " - "Ch44 30 30 30 " - "Ch48 30 30 30 " - "Ch52 30 30 30 " - "Ch56 30 30 30 " - "Ch60 30 30 30 " - "Ch64 30 30 30 " - "Ch68 30 30 30 " - "Ch72 30 30 30 " - "Ch76 30 30 30 " - "Ch80 30 30 30 " - "Ch84 30 30 30 " - "Ch88 30 30 30 " - "Ch92 30 30 30 " - "Ch96 30 30 30 " - "Ch100 30 30 30 " - "Ch104 30 30 30 " - "Ch108 30 30 30 " - "Ch112 30 30 30 " - "Ch116 30 30 30 " - "Ch120 30 30 30 " - "Ch124 30 30 30 " - "Ch128 30 30 30 " - "Ch132 30 30 30 " - "Ch136 30 30 30 " - "Ch140 30 30 30 " - "Ch144 30 30 30 " - "Ch149 30 30 30 " - "Ch153 30 30 30 " - "Ch157 30 30 30 " - "Ch161 30 30 30 " - "Ch165 30 30 30 " - "Ch169 30 30 30 " - "Ch173 30 30 30 " - "Ch177 30 30 30 " - "Ch181 30 30 30 " - " " - " " - " " - " " - " " - " " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_1.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_1.h deleted file mode 100644 index d74e9aa300..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_1.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_1[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch2 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch3 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch4 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch5 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch6 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch7 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch8 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch9 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch10 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch11 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch12 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch13 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch14 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch188 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch192 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch196 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch8 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch12 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch16 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch36 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch40 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch44 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 17 17 17 17 17 17 17 25 25 25 25 25 25 25 0 0 0 " - "Ch48 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch52 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch56 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch60 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch64 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch68 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch72 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch76 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch80 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch84 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch88 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch92 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch96 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch100 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch104 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch108 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch112 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch116 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch120 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch124 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch128 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch132 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch136 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch140 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch144 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch149 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch153 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch157 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 18 18 18 18 18 18 18 25 25 25 25 25 25 25 0 0 0 " - "Ch161 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch165 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch169 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch173 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch177 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - "Ch181 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_10.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_10.h deleted file mode 100644 index a304ca68fb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_10.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_10[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_11.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_11.h deleted file mode 100644 index d4538e0ba5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_11.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_11[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_12.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_12.h deleted file mode 100644 index 8894640d33..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_12.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_12[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_13.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_13.h deleted file mode 100644 index 9850cdc846..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_13.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_13[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_14.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_14.h deleted file mode 100644 index bf36833c23..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_14.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_14[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_15.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_15.h deleted file mode 100644 index 787c841942..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_15.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_15[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_16.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_16.h deleted file mode 100644 index b81977b420..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_16.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_16[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_17.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_17.h deleted file mode 100644 index c3c3e6ac32..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_17.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_17[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_18.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_18.h deleted file mode 100644 index bccdf5904d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_18.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_18[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_19.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_19.h deleted file mode 100644 index 080196bf34..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_19.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_19[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_2.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_2.h deleted file mode 100644 index fa0a4e16f8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_2.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_2[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_20.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_20.h deleted file mode 100644 index 3e13ac307f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_20.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_20[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_3.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_3.h deleted file mode 100644 index 98be51b6a3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_3.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_3[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_4.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_4.h deleted file mode 100644 index 2eb796e00a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_4.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_4[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_5.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_5.h deleted file mode 100644 index 61eeb3e615..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_5.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_5[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_6.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_6.h deleted file mode 100644 index 93ee629c1f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_6.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_6[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_7.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_7.h deleted file mode 100644 index 5f1d0df0c6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_7.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_7[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_8.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_8.h deleted file mode 100644 index 439daae05f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_8.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_8[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_9.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_9.h deleted file mode 100644 index b87ada09a8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/SKUTable_9.h +++ /dev/null @@ -1,70 +0,0 @@ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ -/* AUTO GEN PLEASE DO NOT MODIFY IT */ - -UCHAR SKUvalue_9[] = - "!! Single SKU Max Power Table " - "!! 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta " - "Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - "!! 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta " - "Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T " - "Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - "Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 " - " " - ""; diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/single_sku.h b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/single_sku.h deleted file mode 100644 index a539f09b2b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/include/txpwr/single_sku.h +++ /dev/null @@ -1,291 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - single_sku.h -*/ - -#ifndef __CMM_SINGLE_SKU_H__ -#define __CMM_SINGLE_SKU_H__ - -/* TODO: shiang-usw, integrate these data structures to a single one! */ - -/* Debug log color */ -#define KNRM "\x1B[0m" -#define KRED "\x1B[31m" -#define KGRN "\x1B[32m" -#define KYEL "\x1B[33m" -#define KBLU "\x1B[34m" -#define KMAG "\x1B[35m" -#define KCYN "\x1B[36m" -#define KWHT "\x1B[37m" - -#define G_BAND 0 -#define A_BAND 1 - -#define SINGLE_SKU_TABLE_LENGTH \ - (SINGLE_SKU_TABLE_CCK_LENGTH + SINGLE_SKU_TABLE_OFDM_LENGTH + \ - (SINGLE_SKU_TABLE_HT_LENGTH * 2) + SINGLE_SKU_TABLE_VHT_LENGTH) -#define SINGLE_SKU_TABLE_EFFUSE_ADDRESS 0x12C /*7615*/ -#define MT7622_SINGLE_SKU_TABLE_EFFUSE_ADDRESS 0x10 - -#if defined(MT7615) || defined(MT7622) -#define SINGLE_SKU_TABLE_CCK_LENGTH 2 -#define SINGLE_SKU_TABLE_OFDM_LENGTH 5 -#define SINGLE_SKU_TABLE_HT_LENGTH 16 -#define SINGLE_SKU_TABLE_VHT_LENGTH 7 /* VHT80 MCS 0 ~ 9 */ -#else -#define SINGLE_SKU_TABLE_CCK_LENGTH 4 -#define SINGLE_SKU_TABLE_OFDM_LENGTH 8 -#define SINGLE_SKU_TABLE_HT20_LENGTH 8 -#define SINGLE_SKU_TABLE_HT40_LENGTH 8 -#define SINGLE_SKU_TABLE_VHT20_LENGTH 10 -#define SINGLE_SKU_TABLE_VHT40_LENGTH 10 -#define SINGLE_SKU_TABLE_VHT80_LENGTH 10 -#define SINGLE_SKU_TABLE_VHT160_LENGTH 10 - -#define SINGLE_SKU_TYPE_PARSE_NUM 6 /* CCK(1) + OFDM(1) + VHT20/40/80/160(4) */ -#define SINGLE_SKU_PARAM_PARSE_NUM \ - 52 /* CCK(4) + OFDM(8) + VHT20/40/80/160(10+10+10+10) */ -#define SINGLE_SKU_TYPE_NUM \ - 8 /* CCK(1) + OFDM(1) + HT20/40(2) + VHT20/40/80/160(4) */ -#define SINGLE_SKU_PARAM_NUM \ - 68 /* CCK(4) + OFDM(8) + HT20/40(8+8) + VHT20/40/80/160(10+10+10+10) */ - -#define BACKOFF_TABLE_BF_OFF_CCK_LENGTH 4 -#define BACKOFF_TABLE_BF_OFF_OFDM_LENGTH 4 -#define BACKOFF_TABLE_BF_ON_OFDM_LENGTH 3 -#define BACKOFF_TABLE_BF_OFF_HT20_LENGTH 10 -#define BACKOFF_TABLE_BF_ON_HT20_LENGTH 10 -#define BACKOFF_TABLE_BF_OFF_HT40_LENGTH 10 -#define BACKOFF_TABLE_BF_ON_HT40_LENGTH 10 -#define BACKOFF_TABLE_BF_OFF_VHT20_LENGTH 10 -#define BACKOFF_TABLE_BF_ON_VHT20_LENGTH 10 -#define BACKOFF_TABLE_BF_OFF_VHT40_LENGTH 10 -#define BACKOFF_TABLE_BF_ON_VHT40_LENGTH 10 -#define BACKOFF_TABLE_BF_OFF_VHT80_LENGTH 10 -#define BACKOFF_TABLE_BF_ON_VHT80_LENGTH 10 -#define BACKOFF_TABLE_BF_OFF_VHT160_LENGTH 10 -#define BACKOFF_TABLE_BF_ON_VHT160_LENGTH 10 - -#define BACKOFF_TYPE_PARSE_NUM \ - 11 /* CCK(0+1) + OFDM(1+1) + VHT20/40/80/160(1+1, 1+1, 1+1, 1+1) */ -#define BACKOFF_PARAM_PARSE_NUM \ - 91 /* CCK(0+4) + OFDM(3+4) VHT20/40/80/160(10+10, 10+10, 10+10, 10+10) */ -#define BACKOFF_TYPE_NUM \ - 15 /* CCK(0+1) + OFDM(1+1) + HT20/40(1+1, 1+1) + VHT20/40/80/160(1+1, 1+1, 1+1, 1+1) */ -#define BACKOFF_PARAM_NUM \ - 131 /* CCK(0+4) + OFDM(3+4) + HT20/40(10+10, 10+10) + VHT20/40/80/160(10+10, 10+10, 10+10, 10+10) */ - -#define TABLE_PARSE_TYPE_NUM 2 - -/* 0: None, 1: G_BAND, 2: A_BAND, 3: G_BAND and A_BAND */ -#define TABLE_NO_PARSE 0 -#define TABLE_PARSE_G_BAND BIT(0) -#define TABLE_PARSE_A_BAND BIT(1) -#define TABLE_PARSE_G_A_BAND BITS(0, 1) -#endif /* defined(MT7615) || defined(MT7622) */ - -#define SINGLE_SKU_TABLE_TX_OFFSET_NUM 4 -#define SINGLE_SKU_TABLE_NSS_OFFSET_NUM 4 - -#define SKUTABLE_1 1 -#define SKUTABLE_2 2 -#define SKUTABLE_3 3 -#define SKUTABLE_4 4 -#define SKUTABLE_5 5 -#define SKUTABLE_6 6 -#define SKUTABLE_7 7 -#define SKUTABLE_8 8 -#define SKUTABLE_9 9 -#define SKUTABLE_10 10 -#define SKUTABLE_11 11 -#define SKUTABLE_12 12 -#define SKUTABLE_13 13 -#define SKUTABLE_14 14 -#define SKUTABLE_15 15 -#define SKUTABLE_16 16 -#define SKUTABLE_17 17 -#define SKUTABLE_18 18 -#define SKUTABLE_19 19 -#define SKUTABLE_20 20 -#define TABLE_SIZE 20 - -#define VHT20_OFFSET 0 -#define VHT40_OFFSET 7 -#define VHT80_OFFSET 14 -#define VHT160C_OFFSET 21 - -/* PHY Mode */ -#define SKU_CCK_OFFSET 0 -#define SKU_OFDM_OFFSET 2 -#define SKU_HT_OFFSET 7 -#define SKU_VHT_OFFSET 21 - -/* MCS Rate */ -#define SKU_CCK_RATE_M01 0 -#define SKU_CCK_RATE_M23 1 - -#define SKU_OFDM_RATE_M01 0 -#define SKU_OFDM_RATE_M23 1 -#define SKU_OFDM_RATE_M45 2 -#define SKU_OFDM_RATE_M6 3 -#define SKU_OFDM_RATE_M7 4 - -#define SKU_HT_RATE_M0 0 -#define SKU_HT_RATE_M32 1 -#define SKU_HT_RATE_M12 2 -#define SKU_HT_RATE_M34 3 -#define SKU_HT_RATE_M5 4 -#define SKU_HT_RATE_M6 5 -#define SKU_HT_RATE_M7 6 - -#define SKU_VHT_RATE_M0 0 -#define SKU_VHT_RATE_M12 1 -#define SKU_VHT_RATE_M34 2 -#define SKU_VHT_RATE_M56 3 -#define SKU_VHT_RATE_M7 4 -#define SKU_VHT_RATE_M8 5 -#define SKU_VHT_RATE_M9 6 - -#if defined(MT7615) || defined(MT7622) -#else -typedef enum _POWER_LIMIT_TABLE { - POWER_LIMIT_TABLE_TYPE_SKU = 0, - POWER_LIMIT_TABLE_TYPE_BACKOFF, - POWER_LIMIT_TABLE_TYPE_NUM -} POWER_LIMIT_TABLE, - *P_POWER_LIMIT_TABLE; - -typedef enum _POWER_LIMIT_TABLE_TYPE_SKU_CATEGORY { - SINGLE_SKU_TABLE_CCK = 0, - SINGLE_SKU_TABLE_OFDM, - SINGLE_SKU_TABLE_HT20, - SINGLE_SKU_TABLE_HT40, - SINGLE_SKU_TABLE_VHT20, - SINGLE_SKU_TABLE_VHT40, - SINGLE_SKU_TABLE_VHT80, - SINGLE_SKU_TABLE_VHT160, - SINGLE_SKU_TABLE_NUM -} POWER_LIMIT_TABLE_TYPE_SKU_CATEGORY, - *P_POWER_LIMIT_TABLE_TYPE_SKU_CATEGORY; - -typedef enum _POWER_LIMIT_TABLE_TYPE_BACKOFF_CATEGORY { - BACKOFF_TABLE_BF_OFF_CCK = 0, - BACKOFF_TABLE_BF_OFF_OFDM, - BACKOFF_TABLE_BF_ON_OFDM, - BACKOFF_TABLE_BF_OFF_HT20, - BACKOFF_TABLE_BF_ON_HT20, - BACKOFF_TABLE_BF_OFF_HT40, - BACKOFF_TABLE_BF_ON_HT40, - BACKOFF_TABLE_BF_OFF_VHT20, - BACKOFF_TABLE_BF_ON_VHT20, - BACKOFF_TABLE_BF_OFF_VHT40, - BACKOFF_TABLE_BF_ON_VHT40, - BACKOFF_TABLE_BF_OFF_VHT80, - BACKOFF_TABLE_BF_ON_VHT80, - BACKOFF_TABLE_BF_OFF_VHT160, - BACKOFF_TABLE_BF_ON_VHT160, - BACKOFF_TABLE_NUM -} POWER_LIMIT_TABLE_TYPE_BACKOFF_CATEGORY, - *P_POWER_LIMIT_TABLE_TYPE_BACKOFF_CATEGORY; -#endif /* defined(MT7615) || defined(MT7622) */ - -/* TODO: shiang-usw, need to re-organize these for MT7610/MT7601/MT7620!! */ -#if defined(MT7615) || defined(MT7622) -typedef struct _CH_POWER_ { - DL_LIST List; - UCHAR StartChannel; - UCHAR num; - UCHAR *Channel; - UCHAR band; - UCHAR u1PwrLimitCCK[SINGLE_SKU_TABLE_CCK_LENGTH]; - UCHAR u1PwrLimitOFDM[SINGLE_SKU_TABLE_OFDM_LENGTH]; - UCHAR u1PwrLimitHT20[SINGLE_SKU_TABLE_HT_LENGTH]; - UCHAR u1PwrLimitHT40[SINGLE_SKU_TABLE_HT_LENGTH]; - UCHAR u1PwrLimitVHT20[SINGLE_SKU_TABLE_VHT_LENGTH]; - UCHAR u1PwrLimitVHT40[SINGLE_SKU_TABLE_VHT_LENGTH]; - UCHAR u1PwrLimitVHT80[SINGLE_SKU_TABLE_VHT_LENGTH]; - UCHAR u1PwrLimitVHT160[SINGLE_SKU_TABLE_VHT_LENGTH]; - UCHAR u1PwrLimitTxStreamDelta[SINGLE_SKU_TABLE_TX_OFFSET_NUM]; - UCHAR u1PwrLimitTxNSSDelta[SINGLE_SKU_TABLE_TX_OFFSET_NUM]; -} CH_POWER, *P_CH_POWER; - -typedef struct _BACKOFF_POWER_ { - DL_LIST List; - UCHAR StartChannel; - UCHAR num; - UCHAR *Channel; - UCHAR band; - UCHAR PwrMax[3]; -} BACKOFF_POWER, *P_BACKOFF_POWER; -#else -typedef struct _CH_POWER_ { - DL_LIST List; - UINT8 u1StartChannel; - UINT8 u1ChNum; - PUINT8 pu1ChList; - UINT8 u1ChBand; - PUINT8 pu1PwrLimit; -} CH_POWER, *P_CH_POWER; -#endif /* defined(MT7615) || defined(MT7622) */ - -#ifdef SINGLE_SKU_V2 -#if defined(MT7615) || defined(MT7622) -INT MtSingleSkuLoadParam(RTMP_ADAPTER *pAd); - -VOID MtSingleSkuUnloadParam(RTMP_ADAPTER *pAd); - -INT MtBfBackOffLoadParam(RTMP_ADAPTER *pAd); - -VOID MtBfBackOffUnloadParam(RTMP_ADAPTER *pAd); - -VOID MtFillSkuParam(RTMP_ADAPTER *pAd, UINT8 channel, UCHAR Band, - UCHAR TxStream, UINT8 *txPowerSku, - UINT8 update_ctrl_ch_pwr); - -VOID MtFillBackoffParam(RTMP_ADAPTER *pAd, UINT8 channel, UCHAR Band, - UINT8 *BFPowerBackOff); - -VOID MtShowSkuTable(RTMP_ADAPTER *pAd, UINT8 u1DebugLevel); - -#else -INT MtPwrLimitLoadParamHandle(RTMP_ADAPTER *pAd, UINT8 u1Type); - -VOID MtPwrLimitUnloadParamHandle(RTMP_ADAPTER *pAd, UINT8 u1Type); - -VOID MtParsePwrLimitTable(RTMP_ADAPTER *pAd, PCHAR pi1Buffer, UINT8 u1Type); - -BOOLEAN -MtReadPwrLimitTable(RTMP_ADAPTER *pAd, PCHAR pi1Buffer, UINT8 u1Type); - -VOID MtPwrFillLimitParam(RTMP_ADAPTER *pAd, UINT8 u1Channel, UINT8 ChBand, - PINT8 pi1PwrLimitParam, UINT8 u1Type); - -VOID MtPwrLimitParse(PUINT pi1PwrLimitNewCh, UINT8 u1ChBand, UINT8 u1Type); - -BOOLEAN -MtPwrLimitSimilarCheck(PUINT pi1PwrLimitStartCh, PUINT pi1PwrLimitNewCh, - UINT8 u1ChBand, UINT8 u1Type); - -VOID MtShowPwrLimitTable(RTMP_ADAPTER *pAd, UINT8 u1Type, UINT8 u1DebugLevel); -#endif /* defined(MT7615) || defined(MT7622) */ - -CHAR SKUTxPwrOffsetGet(RTMP_ADAPTER *pAd, UINT8 ucBandIdx, UINT8 ucBW, - UINT8 ucPhymode, UINT8 ucMCS, UINT8 ucNss, BOOLEAN fgSE); - -NDIS_STATUS -MtPowerLimitFormatTrans(struct _RTMP_ADAPTER *pAd, PUINT8 pu1Value, - PCHAR pcRawData); - -#endif /* SINGLE_SKU_V2 */ -#endif /*__CMM_SINGLE_SKU_H__*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/license/MTK_LICENSE b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/license/MTK_LICENSE deleted file mode 100644 index 4b5b2db357..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/license/MTK_LICENSE +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2017 MediaTek Inc. -* -* All rights reserved. Copying, compilation, modification, distribution -* or any other use whatsoever of this material is strictly prohibited -* except in accordance with a Software License Agreement with -* MediaTek Inc. -******************************************************************************** -*/ - -/******************************************************************************* -* LEGAL DISCLAIMER -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND -* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK -* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE -* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY -* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE -* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY -* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK -* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY -* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE -* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO -* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL -* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT -* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY -* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT -* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING -* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN -* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE -* (ICC). -******************************************************************************** -*/ - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/license/NOTICE b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/license/NOTICE deleted file mode 100644 index cb7d8c2dfb..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/license/NOTICE +++ /dev/null @@ -1,124 +0,0 @@ - LICENSE ISSUES - ============== - - The OpenSSL toolkit stays under a double license, i.e. both the conditions of - the OpenSSL License and the original SSLeay license apply to the toolkit. - See below for the actual license texts. - - OpenSSL License - --------------- - -/* ==================================================================== - * Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - - Original SSLeay License - ----------------------- - -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgment: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgment: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mac/mt_dmac.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mac/mt_dmac.c deleted file mode 100644 index 3bebdd6adf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mac/mt_dmac.c +++ /dev/null @@ -1,3641 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include "rt_config.h" -#ifdef TXRX_STAT_SUPPORT -#include "hdev/hdev_basic.h" -#endif - -const UCHAR altx_filter_list[] = { - SUBTYPE_ASSOC_REQ, SUBTYPE_ASSOC_RSP, SUBTYPE_REASSOC_REQ, - SUBTYPE_REASSOC_RSP, SUBTYPE_PROBE_REQ, SUBTYPE_PROBE_RSP, - SUBTYPE_ATIM, SUBTYPE_DISASSOC, SUBTYPE_AUTH, - SUBTYPE_DEAUTH, -}; - -BOOLEAN in_altx_filter_list(UCHAR sub_type) -{ - UCHAR i; - - for (i = 0; i < (ARRAY_SIZE(altx_filter_list)); i++) { - if (sub_type == altx_filter_list[i]) - return TRUE; - } - - return FALSE; -} - -const UCHAR wmm_aci_2_hw_ac_queue[] = { - TxQ_IDX_AC1, /* ACI:0 AC_BE */ - TxQ_IDX_AC0, /* ACI:1 AC_BK */ - TxQ_IDX_AC2, /* ACI:2 AC_VI */ - TxQ_IDX_AC3, /* ACI:3 AC_VO */ - TxQ_IDX_AC11, TxQ_IDX_AC10, TxQ_IDX_AC12, TxQ_IDX_AC13, TxQ_IDX_AC21, - TxQ_IDX_AC20, TxQ_IDX_AC22, TxQ_IDX_AC23, TxQ_IDX_AC31, TxQ_IDX_AC30, - TxQ_IDX_AC32, TxQ_IDX_AC33, TxQ_IDX_ALTX0, /*16*/ - TxQ_IDX_BMC0, TxQ_IDX_BCN0, TxQ_IDX_PSMP0, TxQ_IDX_ALTX1, /*20*/ - TxQ_IDX_BMC1, TxQ_IDX_BCN1, TxQ_IDX_PSMP1, -}; - -VOID dump_rxinfo(RTMP_ADAPTER *pAd, RXINFO_STRUC *pRxInfo) -{ - hex_dump("RxInfo Raw Data", (UCHAR *)pRxInfo, sizeof(RXINFO_STRUC)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxInfo Fields:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBA=%d\n", pRxInfo->BA)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDATA=%d\n", pRxInfo->DATA)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tNULLDATA=%d\n", pRxInfo->NULLDATA)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFRAG=%d\n", pRxInfo->FRAG)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tU2M=%d\n", pRxInfo->U2M)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMcast=%d\n", pRxInfo->Mcast)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBcast=%d\n", pRxInfo->Bcast)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMyBss=%d\n", pRxInfo->MyBss)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCrc=%d\n", pRxInfo->Crc)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCipherErr=%d\n", pRxInfo->CipherErr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAMSDU=%d\n", pRxInfo->AMSDU)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHTC=%d\n", pRxInfo->HTC)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRSSI=%d\n", pRxInfo->RSSI)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tL2PAD=%d\n", pRxInfo->L2PAD)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAMPDU=%d\n", pRxInfo->AMPDU)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDecrypted=%d\n", pRxInfo->Decrypted)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBssIdx3=%d\n", pRxInfo->BssIdx3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twapi_kidx=%d\n", pRxInfo->wapi_kidx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpn_len=%d\n", pRxInfo->pn_len)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tsw_fc_type0=%d\n", pRxInfo->sw_fc_type0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tsw_fc_type1=%d\n", pRxInfo->sw_fc_type1)); -} - -static char *hdr_fmt_str[] = { - "Non-80211-Frame", - "Command-Frame", - "Normal-80211-Frame", - "enhanced-80211-Frame", -}; - -static char *p_idx_str[] = { "LMAC", "MCU" }; -static char *q_idx_lmac_str[] = { - "WMM0_AC0", "WMM0_AC1", "WMM0_AC2", "WMM0_AC3", "WMM1_AC0", - "WMM1_AC1", "WMM1_AC2", "WMM1_AC3", "WMM2_AC0", "WMM2_AC1", - "WMM2_AC2", "WMM2_AC3", "WMM3_AC0", "WMM3_AC1", "WMM3_AC2", - "WMM3_AC3", "Band0_ALTX", "Band0_BMC", "Band0_BNC", "Band0_PSMP", - "Band1_ALTX", "Band1_BMC", "Band1_BNC", "Band1_PSMP", "Invalid" -}; -static char *q_idx_mcu_str[] = { "RQ0", "RQ1", "RQ2", "RQ3", "PDA", "Invalid" }; -static char *pkt_ft_str[] = { "cut_through", "store_forward", "cmd", - "PDA_FW_Download" }; - -VOID dump_tmac_info(RTMP_ADAPTER *pAd, UCHAR *tmac_info) -{ - TMAC_TXD_S *txd_s = (TMAC_TXD_S *)tmac_info; - TMAC_TXD_0 *txd_0 = (TMAC_TXD_0 *)tmac_info; - TMAC_TXD_1 *txd_1 = (TMAC_TXD_1 *)(tmac_info + sizeof(TMAC_TXD_0)); - UINT32 *txd_7 = &txd_s->TxD7; - UCHAR q_idx = 0; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - hex_dump("TMAC_Info Raw Data: ", (UCHAR *)tmac_info, cap->TXWISize); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TMAC_TXD Fields:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tTMAC_TXD_0:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPortID=%d(%s)\n", txd_0->p_idx, - p_idx_str[txd_0->p_idx])); - - if (txd_0->p_idx == P_IDX_LMAC) - q_idx = txd_0->q_idx % 0x18; - else - q_idx = ((txd_0->q_idx == TxQ_IDX_MCU_PDA) ? - txd_0->q_idx : - (txd_0->q_idx % 0x4)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tQueID=0x%x(%s %s)\n", txd_0->q_idx, - (txd_0->p_idx == P_IDX_LMAC ? "LMAC" : "MCU"), - txd_0->p_idx == P_IDX_LMAC ? q_idx_lmac_str[q_idx] : - q_idx_mcu_str[q_idx])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxByteCnt=%d\n", txd_0->TxByteCount)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tTMAC_TXD_1:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\twlan_idx=%d\n", txd_1->wlan_idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrFmt=%d(%s)\n", txd_1->hdr_format, - hdr_fmt_str[txd_1->hdr_format])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrInfo=0x%x\n", txd_1->hdr_info)); - - switch (txd_1->hdr_format) { - case TMI_HDR_FT_NON_80211: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\tMRD=%d, EOSP=%d, RMVL=%d, VLAN=%d, ETYP=%d\n", - txd_1->hdr_info & (1 << TMI_HDR_INFO_0_BIT_MRD), - txd_1->hdr_info & (1 << TMI_HDR_INFO_0_BIT_EOSP), - txd_1->hdr_info & (1 << TMI_HDR_INFO_0_BIT_RMVL), - txd_1->hdr_info & (1 << TMI_HDR_INFO_0_BIT_VLAN), - txd_1->hdr_info & (1 << TMI_HDR_INFO_0_BIT_ETYP))); - break; - - case TMI_HDR_FT_CMD: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\tRsvd=0x%x\n", txd_1->hdr_info)); - break; - - case TMI_HDR_FT_NOR_80211: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\tHeader Len=%d(WORD)\n", - txd_1->hdr_info & TMI_HDR_INFO_2_MASK_LEN)); - break; - - case TMI_HDR_FT_ENH_80211: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\tEOSP=%d, AMS=%d\n", - txd_1->hdr_info & (1 << TMI_HDR_INFO_3_BIT_EOSP), - txd_1->hdr_info & (1 << TMI_HDR_INFO_3_BIT_AMS))); - break; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxDFormatType=%d(%s format)\n", txd_1->ft, - txd_1->ft == TMI_FT_LONG ? "Long - 8 DWORD" : - "Short - 3 DWORD")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttxd_len=%d page(%d DW)\n", txd_1->txd_len == 0 ? 1 : 2, - (txd_1->txd_len + 1) * 16)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrPad=%d(Padding Mode: %s, padding bytes: %d)\n", - txd_1->hdr_pad, - ((txd_1->hdr_pad & (TMI_HDR_PAD_MODE_TAIL << 1)) ? "tail" : - "head"), - ((txd_1->hdr_pad & 0x1) ? 2 : 0))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tUNxV=%d\n", txd_1->UNxV)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tamsdu=%d\n", txd_1->amsdu)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTID=%d\n", txd_1->tid)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpkt_ft=%d(%s)\n", txd_1->pkt_ft, - pkt_ft_str[txd_1->pkt_ft])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\town_mac=%d\n", txd_1->OwnMacAddr)); - - if (txd_s->TxD1.ft == TMI_FT_LONG) { - TMAC_TXD_L *txd_l = (TMAC_TXD_L *)tmac_info; - TMAC_TXD_2 *txd_2 = &txd_l->TxD2; - TMAC_TXD_3 *txd_3 = &txd_l->TxD3; - TMAC_TXD_4 *txd_4 = &txd_l->TxD4; - TMAC_TXD_5 *txd_5 = &txd_l->TxD5; - TMAC_TXD_6 *txd_6 = &txd_l->TxD6; - - txd_7 = &txd_l->TxD7; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_2:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tsub_type=%d\n", txd_2->sub_type)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tfrm_type=%d\n", txd_2->frm_type)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNDP=%d\n", txd_2->ndp)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNDPA=%d\n", txd_2->ndpa)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSounding=%d\n", txd_2->sounding)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tRTS=%d\n", txd_2->rts)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tbc_mc_pkt=%d\n", txd_2->bc_mc_pkt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBIP=%d\n", txd_2->bip)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tDuration=%d\n", txd_2->duration)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHE(HTC Exist)=%d\n", txd_2->htc_vld)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tFRAG=%d\n", txd_2->frag)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tReamingLife/MaxTx time=%d\n", - txd_2->max_tx_time)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpwr_offset=%d\n", txd_2->pwr_offset)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tba_disable=%d\n", txd_2->ba_disable)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttiming_measure=%d\n", txd_2->timing_measure)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tfix_rate=%d\n", txd_2->fix_rate)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_3:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNoAck=%d\n", txd_3->no_ack)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPF=%d\n", txd_3->protect_frm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_cnt=%d\n", txd_3->tx_cnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tremain_tx_cnt=%d\n", txd_3->remain_tx_cnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tsn=%d\n", txd_3->sn)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpn_vld=%d\n", txd_3->pn_vld)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tsn_vld=%d\n", txd_3->sn_vld)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_4:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpn_low=0x%x\n", txd_4->pn_low)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_5:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_status_2_host=%d\n", - txd_5->tx_status_2_host)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_status_2_mcu=%d\n", txd_5->tx_status_2_mcu)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_status_fmt=%d\n", txd_5->tx_status_fmt)); - - if (txd_5->tx_status_2_host || txd_5->tx_status_2_mcu) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpid=%d\n", txd_5->pid)); - - if (txd_2->fix_rate) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tda_select=%d\n", txd_5->da_select)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpwr_mgmt=0x%x\n", txd_5->pwr_mgmt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpn_high=0x%x\n", txd_5->pn_high)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_6:\n")); - - if (txd_2->fix_rate) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tfix_rate_mode=%d\n", - txd_6->fix_rate_mode)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tGI=%d(%s)\n", txd_6->gi, - txd_6->gi == 0 ? "LONG" : "SHORT")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tldpc=%d(%s)\n", txd_6->ldpc, - txd_6->ldpc == 0 ? "BCC" : "LDPC")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxBF=%d\n", txd_6->TxBF)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_rate=0x%x\n", txd_6->tx_rate)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tant_id=%d\n", txd_6->ant_id)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tdyn_bw=%d\n", txd_6->dyn_bw)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tbw=%d\n", txd_6->bw)); - } - } - - /* TODO DW7 */ - - if (!IS_ASIC_CAP(pAd, fASIC_CAP_MCU_OFFLOAD)) { - UINT32 i; - MAC_TX_PKT_T *txp = - (MAC_TX_PKT_T *)(tmac_info + cap->tx_hw_hdr_len); - - for (i = 0; i < NUM_OF_MSDU_ID_IN_TXD; i++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tID:%u, token id: %u\n", i, - txp->au2MsduId[i])); - } - - for (i = 0; i < (TXD_MAX_BUF_NUM / 2); i++) { - TXD_PTR_LEN_T *txd_ptr_len = &txp->arPtrLen[i]; - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tID:%u, u4Ptr0 = 0x%x, u2Len0 = %u, u4Ptr1 = 0x%x,\ - u2Len1 = %u\n", - i, txd_ptr_len->u4Ptr0, txd_ptr_len->u2Len0, - txd_ptr_len->u4Ptr1, txd_ptr_len->u2Len1)); - } - } -} - -static char *rmac_info_type_str[] = { - "TXS", "RXV", "RxNormal", "DupRFB", "TMR", "Unknown", -}; - -static inline char *rxd_pkt_type_str(INT pkt_type) -{ - if (pkt_type <= 0x04) - return rmac_info_type_str[pkt_type]; - else - return rmac_info_type_str[5]; -} - -VOID dump_rmac_info_normal(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - RXD_BASE_STRUCT *rxd_base = (RXD_BASE_STRUCT *)rmac_info; - - hex_dump("RMAC_Info Raw Data: ", rmac_info, sizeof(RXD_BASE_STRUCT)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRxData_BASE:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPktType=%d(%s)\n", rxd_base->RxD0.PktType, - rxd_pkt_type_str(rxd_base->RxD0.PktType))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tGroupValid=%x\n", rxd_base->RxD0.RfbGroupVld)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tRxByteCnt=%d\n", rxd_base->RxD0.RxByteCnt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tIP/UT=%d/%d\n", rxd_base->RxD0.IpChkSumOffload, - rxd_base->RxD0.UdpTcpChkSumOffload)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tEtherTypeOffset=%d(WORD)\n", - rxd_base->RxD0.EthTypeOffset)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHTC/UC2ME/MC/BC=%d/%d/%d/%d\n", rxd_base->RxD1.HTC, - (rxd_base->RxD1.a1_type == 0x1 ? 1 : 0), - (rxd_base->RxD1.a1_type == 0x2 ? 1 : 0), - rxd_base->RxD1.a1_type == 0x3 ? 1 : 0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBeacon with BMCast/Ucast=%d/%d\n", - rxd_base->RxD1.BcnWithBMcst, rxd_base->RxD1.BcnWithUCast)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tKeyID=%d\n", rxd_base->RxD1.KeyId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tChFrequency=%x\n", rxd_base->RxD1.ChFreq)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdearLength(MAC)=%d\n", rxd_base->RxD1.MacHdrLen)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHeaerOffset(HO)=%d\n", rxd_base->RxD1.HdrOffset)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHeaerTrans(H)=%d\n", rxd_base->RxD1.HdrTranslation)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPayloadFormat(PF)=%d\n", rxd_base->RxD1.PayloadFmt)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBSSID=%d\n", rxd_base->RxD1.RxDBssidIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tWlanIndex=%d\n", rxd_base->RxD2.RxDWlanIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTID=%d\n", rxd_base->RxD2.RxDTid)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSEC Mode=%d\n", rxd_base->RxD2.SecMode)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSW BIT=%d\n", rxd_base->RxD2.SwBit)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tFCE Error(FC)=%d\n", rxd_base->RxD2.FcsErr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tCipher Mismatch(CM)=%d\n", rxd_base->RxD2.CipherMis)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tCipher Length Mismatch(CLM)=%d\n", - rxd_base->RxD2.CipherLenMis)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tICV Err(I)=%d\n", rxd_base->RxD2.IcvErr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTKIP MIC Err(T)=%d\n", rxd_base->RxD2.TkipMicErr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tLength Mismatch(LM)=%d\n", rxd_base->RxD2.LenMis)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tDeAMSDU Fail(DAF)=%d\n", rxd_base->RxD2.DeAmsduFail)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tExceedMax Rx Length(EL)=%d\n", - rxd_base->RxD2.ExMaxRxLen)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrTransFail(HTF)=%d\n", rxd_base->RxD2.HdrTransFail)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tInterested Frame(INTF)=%d\n", - rxd_base->RxD2.InterestedFrm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tFragment Frame(FRAG)=%d\n", rxd_base->RxD2.FragFrm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNull Frame(NULL)=%d\n", rxd_base->RxD2.NullFrm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNon Data Frame(NDATA)=%d\n", rxd_base->RxD2.NonDataFrm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNon-AMPDU Subframe(NASF)=%d\n", - rxd_base->RxD2.NonAmpduSfrm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNon AMPDU(NAMP)=%d\n", rxd_base->RxD2.NonAmpduFrm)); -} - -VOID dump_rmac_info_for_ICVERR(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - RXD_BASE_STRUCT *rxd_base = (RXD_BASE_STRUCT *)rmac_info; - union _RMAC_RXD_0_UNION *rxd_0; - UINT32 pkt_type; - int LogDbgLvl = DBG_LVL_WARN; - - if (!IS_HIF_TYPE(pAd, HIF_MT)) - return; - - rxd_0 = (union _RMAC_RXD_0_UNION *)rmac_info; - pkt_type = RMAC_RX_PKT_TYPE(rxd_0->word); - - if (pkt_type != RMAC_RX_PKT_TYPE_RX_NORMAL) - return; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - ("\tHTC/UC2ME/MC/BC=%d/%d/%d/%d", rxd_base->RxD1.HTC, - (rxd_base->RxD1.a1_type == 0x1 ? 1 : 0), - (rxd_base->RxD1.a1_type == 0x2 ? 1 : 0), - rxd_base->RxD1.a1_type == 0x3 ? 1 : 0)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - (", WlanIndex=%d", rxd_base->RxD2.RxDWlanIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - (", SEC Mode=%d\n", rxd_base->RxD2.SecMode)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - ("\tFCE Error(FC)=%d", rxd_base->RxD2.FcsErr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - (", CM=%d", rxd_base->RxD2.CipherMis)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - (", CLM=%d", rxd_base->RxD2.CipherLenMis)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - (", I=%d", rxd_base->RxD2.IcvErr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - (", T=%d", rxd_base->RxD2.TkipMicErr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - (", LM=%d\n", rxd_base->RxD2.LenMis)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, LogDbgLvl, - ("\tFragment Frame(FRAG)=%d\n", rxd_base->RxD2.FragFrm)); -} - -VOID dump_rmac_info_txs(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - /* TXS_FRM_STRUC *txs_frm = (TXS_FRM_STRUC *)rmac_info; */ -} - -VOID dump_rmac_info_rxv(RTMP_ADAPTER *pAd, UCHAR *Data) -{ - RXV_DWORD0 *DW0 = NULL; - RXV_DWORD1 *DW1 = NULL; - - RX_VECTOR1_1ST_CYCLE *RXV1_1ST_CYCLE = NULL; - RX_VECTOR1_2ND_CYCLE *RXV1_2ND_CYCLE = NULL; - RX_VECTOR1_3TH_CYCLE *RXV1_3TH_CYCLE = NULL; - RX_VECTOR1_4TH_CYCLE *RXV1_4TH_CYCLE = NULL; - RX_VECTOR1_5TH_CYCLE *RXV1_5TH_CYCLE = NULL; - RX_VECTOR1_6TH_CYCLE *RXV1_6TH_CYCLE = NULL; - - RX_VECTOR2_1ST_CYCLE *RXV2_1ST_CYCLE = NULL; - RX_VECTOR2_2ND_CYCLE *RXV2_2ND_CYCLE = NULL; - RX_VECTOR2_3TH_CYCLE *RXV2_3TH_CYCLE = NULL; - - DW0 = (RXV_DWORD0 *)Data; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", TA_0_31=%d\n", DW0->TA_0_31)); - - DW1 = (RXV_DWORD1 *)(Data + 4); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", TA_32_47=%d", DW1->TA_32_47)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RxvSn=%d", DW1->RxvSn)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", TR=%d\n", DW1->TR)); - - RXV1_1ST_CYCLE = (RX_VECTOR1_1ST_CYCLE *)(Data + 8); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", TxRate=%d", RXV1_1ST_CYCLE->TxRate)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", HtStbc=%d", RXV1_1ST_CYCLE->HtStbc)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", HtAdCode=%d", RXV1_1ST_CYCLE->HtAdCode)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", HtExtltf=%d", RXV1_1ST_CYCLE->HtExtltf)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", TxMode=%d", RXV1_1ST_CYCLE->TxMode)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", FrMode=%d\n", RXV1_1ST_CYCLE->FrMode)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", VHTA1_B22=%d", RXV1_1ST_CYCLE->VHTA1_B22)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", HtAggregation=%d", RXV1_1ST_CYCLE->HtAggregation)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", HtShortGi=%d", RXV1_1ST_CYCLE->HtShortGi)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", HtSmooth=%d", RXV1_1ST_CYCLE->HtSmooth)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", HtNoSound=%d", RXV1_1ST_CYCLE->HtNoSound)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", NumRx=%d\n", RXV1_1ST_CYCLE->NumRx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", VHTA2_B8_B3=%d", RXV1_1ST_CYCLE->VHTA2_B8_B3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", ACID_DET_LOWER=%d", RXV1_1ST_CYCLE->ACID_DET_LOWER)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", ACID_DET_UPPER=%d\n", RXV1_1ST_CYCLE->ACID_DET_UPPER)); - - RXV1_2ND_CYCLE = (RX_VECTOR1_2ND_CYCLE *)(Data + 12); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", Length=%d", RXV1_2ND_CYCLE->Length)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", GroupId=%d", RXV1_2ND_CYCLE->GroupId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", NstsField=%d", RXV1_2ND_CYCLE->NstsField)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RxValidIndicator=%d", RXV1_2ND_CYCLE->RxValidIndicator)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", SelAnt=%d\n", RXV1_2ND_CYCLE->SelAnt)); - - RXV1_3TH_CYCLE = (RX_VECTOR1_3TH_CYCLE *)(Data + 16); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", VHTA1_B21_B10=%d", RXV1_3TH_CYCLE->VHTA1_B21_B10)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", BFAgcApply=%d", RXV1_3TH_CYCLE->BFAgcApply)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", POPEverTrig=%d", RXV1_3TH_CYCLE->POPEverTrig)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", FgacCalLnaRx=%d", RXV1_3TH_CYCLE->FgacCalLnaRx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", IBRssiRx=%d", RXV1_3TH_CYCLE->IBRssiRx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", WBRssiRx=%d\n", RXV1_3TH_CYCLE->WBRssiRx)); - - RXV1_4TH_CYCLE = (RX_VECTOR1_4TH_CYCLE *)(Data + 20); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RCPI0=%d", RXV1_4TH_CYCLE->RCPI0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RCPI1=%d", RXV1_4TH_CYCLE->RCPI1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RCPI2=%d", RXV1_4TH_CYCLE->RCPI2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RCPI3=%d\n", RXV1_4TH_CYCLE->RCPI3)); - - RXV1_5TH_CYCLE = (RX_VECTOR1_5TH_CYCLE *)(Data + 24); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", FagcLnaGainx=%d", RXV1_5TH_CYCLE->FagcLnaGainx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", FagcLpfGainx=%d", RXV1_5TH_CYCLE->FagcLpfGainx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", NoiseBalanceEnable=%d", - RXV1_5TH_CYCLE->NoiseBalanceEnable)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", MISC1=%d\n", RXV1_5TH_CYCLE->MISC1)); - - RXV1_6TH_CYCLE = (RX_VECTOR1_6TH_CYCLE *)(Data + 28); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", Nf0=%d", RXV1_6TH_CYCLE->Nf0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", Nf1=%d", RXV1_6TH_CYCLE->Nf1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", Nf2=%d", RXV1_6TH_CYCLE->Nf2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", Nf3=%d\n", RXV1_6TH_CYCLE->Nf3)); - - RXV2_1ST_CYCLE = (RX_VECTOR2_1ST_CYCLE *)(Data + 32); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", PrimItfrEnv=%d", RXV2_1ST_CYCLE->PrimItfrEnv)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", SecItfrEnv=%d", RXV2_1ST_CYCLE->SecItfrEnv)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", Sec40ItfrEnv=%d", RXV2_1ST_CYCLE->Sec40ItfrEnv)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", Sec80ItfrEnv=%d", RXV2_1ST_CYCLE->Sec80ItfrEnv)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RxLQ=%d", RXV2_1ST_CYCLE->RxLQ)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", BtEnv=%d", RXV2_1ST_CYCLE->BtEnv)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", ScrambleSeed=%d\n", RXV2_1ST_CYCLE->ScrambleSeed)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", VHT_A2=%d", RXV2_1ST_CYCLE->VHT_A2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RxCERmsd=%d", RXV2_1ST_CYCLE->RxCERmsd)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", FCSErr=%d\n", RXV2_1ST_CYCLE->FCSErr)); - - RXV2_2ND_CYCLE = (RX_VECTOR2_2ND_CYCLE *)(Data + 36); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", PostTMD=%d", RXV2_2ND_CYCLE->PostTMD)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", RxBW=%d", RXV2_2ND_CYCLE->RxBW)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", PostBWDSecCh=%d", RXV2_2ND_CYCLE->PostBWDSecCh)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", PostDewSecCh=%d", RXV2_2ND_CYCLE->PostDewSecCh)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", HtSTFDet=%d", RXV2_2ND_CYCLE->HtSTFDet)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", CagcSTFDet=%d", RXV2_2ND_CYCLE->CagcSTFDet)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", IBRssi0=%d", RXV2_2ND_CYCLE->IBRssi0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", WBRssi0=%d", RXV2_2ND_CYCLE->WBRssi0)); - - RXV2_3TH_CYCLE = (RX_VECTOR2_3TH_CYCLE *)(Data + 40); -} - -VOID dump_rmac_info_rfb(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - /* RXD_BASE_STRUCT *rfb_frm = (RXD_BASE_STRUCT *)rmac_info; */ -} - -VOID dump_rmac_info_tmr(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - /* TMR_FRM_STRUC *rxd_base = (TMR_FRM_STRUC *)rmac_info; */ -} - -VOID dump_rmac_info(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - union _RMAC_RXD_0_UNION *rxd_0; - UINT32 pkt_type; - - rxd_0 = (union _RMAC_RXD_0_UNION *)rmac_info; - pkt_type = RMAC_RX_PKT_TYPE(rxd_0->word); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RMAC_RXD Header Format :%s\n", rxd_pkt_type_str(pkt_type))); - - switch (pkt_type) { - case RMAC_RX_PKT_TYPE_RX_TXS: - dump_rmac_info_txs(pAd, rmac_info); - break; - - case RMAC_RX_PKT_TYPE_RX_TXRXV: - dump_rmac_info_rxv(pAd, rmac_info); - break; - - case RMAC_RX_PKT_TYPE_RX_NORMAL: - dump_rmac_info_normal(pAd, rmac_info); - break; - - case RMAC_RX_PKT_TYPE_RX_DUP_RFB: - dump_rmac_info_rfb(pAd, rmac_info); - break; - - case RMAC_RX_PKT_TYPE_RX_TMR: - dump_rmac_info_tmr(pAd, rmac_info); - break; - - default: - break; - } -} - -VOID DumpTxSFormat(RTMP_ADAPTER *pAd, UINT8 Format, CHAR *Data) -{ - TXS_STRUC *txs_entry = (TXS_STRUC *)Data; - TXS_D_0 *TxSD0 = &txs_entry->TxSD0; - TXS_D_1 *TxSD1 = &txs_entry->TxSD1; - TXS_D_2 *TxSD2 = &txs_entry->TxSD2; - TXS_D_3 *TxSD3 = &txs_entry->TxSD3; - /* TXS_D_4 *TxSD4 = &txs_entry->TxSD4; */ - /* TXS_D_5 *TxSD5 = &txs_entry->TxSD5; */ - /* TXS_D_6 *TxSD6 = &txs_entry->TxSD6; */ - - if (Format == TXS_FORMAT0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tType=TimeStamp/FrontTime Mode\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTXSFM=%d, TXS2M/H=%d/%d, FixRate=%d, TxRate/BW=0x%x/%d\n", - TxSD0->TxSFmt, TxSD0->TxS2M, TxSD0->TxS2H, - TxSD0->TxS_FR, TxSD0->TxRate, TxSD1->TxS_TxBW)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tME/RE/LE/BE/TxOPLimitErr/BA-Fail=%d/%d/%d/%d/%d/%d, PS=%d, Pid=%d\n", - TxSD0->ME, TxSD0->RE, TxSD0->LE, TxSD0->BE, - TxSD0->TxOp, TxSD0->BAFail, TxSD0->PSBit, - TxSD0->TxS_PId)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTid=%d, AntId=%d, ETxBF/ITxBf=%d/%d\n", - TxSD1->TxS_Tid, TxSD1->TxS_AntId, TxSD1->TxS_ETxBF, - TxSD1->TxS_ITxBF)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxPwrdBm=0x%x, FinalMPDU=0x%x, AMPDU=0x%x\n", - TxSD1->TxPwrdBm, TxSD1->TxS_FianlMPDU, - TxSD1->TxS_AMPDU)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxDelay=0x%x, RxVSeqNum=0x%x, Wlan Idx=0x%x\n", - TxSD2->TxS_TxDelay, TxSD2->TxS_RxVSN, - TxSD2->TxS_WlanIdx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSN=0x%x, MPDU TxCnt=%d, LastTxRateIdx=%d\n", - TxSD3->type_0.TxS_SN, TxSD3->type_0.TxS_MpduTxCnt, - TxSD3->type_0.TxS_LastTxRateIdx)); - } else if (Format == TXS_FORMAT1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tType=Noisy/RCPI Mode\n")); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Unknown TxSFormat(%d)\n", __func__, Format)); - } -} - -INT dump_dmac_amsdu_info(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ -#define MSDU_CNT_CR_NUMBER 8 - UINT32 msdu_cnt[MSDU_CNT_CR_NUMBER] = { 0 }; - UINT idx = 0; - PMAC_TABLE_ENTRY pEntry = NULL; - STA_TR_ENTRY *tr_entry = NULL; - - RTMP_IO_READ32(pAd, AMSDU_PACK_1_MSDU_CNT, &msdu_cnt[0]); - RTMP_IO_READ32(pAd, AMSDU_PACK_2_MSDU_CNT, &msdu_cnt[1]); - RTMP_IO_READ32(pAd, AMSDU_PACK_3_MSDU_CNT, &msdu_cnt[2]); - RTMP_IO_READ32(pAd, AMSDU_PACK_4_MSDU_CNT, &msdu_cnt[3]); - RTMP_IO_READ32(pAd, AMSDU_PACK_5_MSDU_CNT, &msdu_cnt[4]); - RTMP_IO_READ32(pAd, AMSDU_PACK_6_MSDU_CNT, &msdu_cnt[5]); - RTMP_IO_READ32(pAd, AMSDU_PACK_7_MSDU_CNT, &msdu_cnt[6]); - RTMP_IO_READ32(pAd, AMSDU_PACK_8_MSDU_CNT, &msdu_cnt[7]); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("=== HW_AMSDU INFO.===\n")); - for (idx = 0; idx < MSDU_CNT_CR_NUMBER; idx++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PACK_%d_MSDU_CNT=%d\n", (idx + 1), msdu_cnt[idx])); - } - for (idx = 0; VALID_UCAST_ENTRY_WCID(pAd, idx); idx++) { - pEntry = &pAd->MacTab.Content[idx]; - tr_entry = &pAd->MacTab.tr_entry[idx]; - - if (IS_ENTRY_NONE(pEntry)) - continue; - - if ((pEntry->Sst == SST_ASSOC) && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) && - (pEntry->tx_amsdu_bitmap != 0)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Wcid%03d: %02x", idx, - pEntry->tx_amsdu_bitmap)); - } - } - return TRUE; -} - -#ifdef CUSTOMER_RSG_FEATURE -VOID Read_Mib_TxRx_Counters(RTMP_ADAPTER *pAd) -{ - UINT32 CrValue; - UINT32 BeaconCount, CtrlPktCount, MgmtRetryCnt, DataFrameRetryCount, - TotalRxCount; - - RTMP_IO_READ32(pAd, MIB_M0SDR0, &CrValue); - BeaconCount = (CrValue & 0xffff); - - RTMP_IO_READ32(pAd, MIB_M0SDR5, &CrValue); - TotalRxCount = CrValue; - - RTMP_IO_READ32(pAd, MIB_M0SDR38, &CrValue); - CtrlPktCount = (CrValue & 0xffffff); - - RTMP_IO_READ32(pAd, MIB_M0SDR39, &CrValue); - MgmtRetryCnt = (CrValue & 0xffffff); - - RTMP_IO_READ32(pAd, MIB_M0SDR40, &CrValue); - DataFrameRetryCount = (CrValue & 0xffffff); - - pAd->RadioStatsCounter.TotalBeaconSentCount += BeaconCount; - pAd->RadioStatsCounter.TotalTxCount += - BeaconCount + MgmtRetryCnt + CtrlPktCount; - pAd->RadioStatsCounter.TxDataCount -= DataFrameRetryCount; - pAd->RadioStatsCounter.TotalRxCount += TotalRxCount; - pAd->RadioStatsCounter.TxRetryCount += - DataFrameRetryCount + MgmtRetryCnt; - pAd->beacon_cnt += BeaconCount; -} - -#endif - -VOID Update_Mib_Bucket_One_Sec(RTMP_ADAPTER *pAd) -{ - UCHAR i = 0, j = 0; - UCHAR concurrent_bands = HcGetAmountOfBand(pAd); - - for (i = 0; i < concurrent_bands; i++) { - if (pAd->OneSecMibBucket.Enabled[i] == TRUE) { - pAd->OneSecMibBucket.ChannelBusyTimeCcaNavTx[i] = 0; - pAd->OneSecMibBucket.ChannelBusyTime[i] = 0; - pAd->OneSecMibBucket.OBSSAirtime[i] = 0; - pAd->OneSecMibBucket.MyTxAirtime[i] = 0; - pAd->OneSecMibBucket.MyRxAirtime[i] = 0; - pAd->OneSecMibBucket.EDCCAtime[i] = 0; - pAd->OneSecMibBucket.MdrdyCount[i] = 0; - pAd->OneSecMibBucket.PdCount[i] = 0; - for (j = 0; j < 2; j++) { - pAd->OneSecMibBucket - .ChannelBusyTimeCcaNavTx[i] += - pAd->MsMibBucket - .ChannelBusyTimeCcaNavTx[i][j]; - pAd->OneSecMibBucket.ChannelBusyTime[i] += - pAd->MsMibBucket.ChannelBusyTime[i][j]; - pAd->OneSecMibBucket.OBSSAirtime[i] += - pAd->MsMibBucket.OBSSAirtime[i][j]; - pAd->OneSecMibBucket.MyTxAirtime[i] += - pAd->MsMibBucket.MyTxAirtime[i][j]; - pAd->OneSecMibBucket.MyRxAirtime[i] += - pAd->MsMibBucket.MyRxAirtime[i][j]; - pAd->OneSecMibBucket.EDCCAtime[i] += - pAd->MsMibBucket.EDCCAtime[i][j]; - pAd->OneSecMibBucket.MdrdyCount[i] += - pAd->MsMibBucket.MdrdyCount[i][j]; - pAd->OneSecMibBucket.PdCount[i] += - pAd->MsMibBucket.PdCount[i][j]; - } - } - } -} -#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(TR181_SUPPORT) || \ - defined(TXRX_STAT_SUPPORT) -VOID Reset_MIB_Update_Counters(RTMP_ADAPTER *pAd, UCHAR Idx) -{ - pAd->ChannelStats.MibUpdateOBSSAirtime[Idx] = 0; - pAd->ChannelStats.MibUpdateMyTxAirtime[Idx] = 0; - pAd->ChannelStats.MibUpdateMyRxAirtime[Idx] = 0; -#ifdef CUSTOMER_RSG_FEATURE - pAd->ChannelStats.MibUpdateEDCCAtime[Idx] = 0; - pAd->ChannelStats.MibUpdatePdCount[Idx] = 0; - pAd->ChannelStats.MibUpdateMdrdyCount[Idx] = 0; -#endif -} -#endif - -VOID Update_Mib_Bucket_500Ms(RTMP_ADAPTER *pAd) -{ - UINT32 CrValue; - UCHAR i = 0; - UCHAR CurrIdx = 0; - UCHAR concurrent_bands = HcGetAmountOfBand(pAd); - - pAd->MsMibBucket.CurIdx++; - if (pAd->MsMibBucket.CurIdx >= 2) - pAd->MsMibBucket.CurIdx = 0; - CurrIdx = pAd->MsMibBucket.CurIdx; - for (i = 0; i < concurrent_bands; i++) { - if (pAd->MsMibBucket.Enabled == TRUE) { - /* Channel Busy Time */ - HW_IO_READ32(pAd, MIB_M0SDR9 + (i * BandOffset), - &CrValue); - pAd->MsMibBucket.ChannelBusyTimeCcaNavTx[i][CurrIdx] = - CrValue; - /* Primary Channel Busy Time */ - HW_IO_READ32(pAd, MIB_M0SDR16 + (i * BandOffset), - &CrValue); - pAd->MsMibBucket.ChannelBusyTime[i][CurrIdx] = CrValue; - -#if defined(OFFCHANNEL_SCAN_FEATURE) || defined(TR181_SUPPORT) || \ - defined(TXRX_STAT_SUPPORT) - if (!(ApScanRunning(pAd, NULL))) { - pAd->MsMibBucket.OBSSAirtime[i][CurrIdx] = - pAd->ChannelStats - .MibUpdateOBSSAirtime[i]; - pAd->MsMibBucket.MyTxAirtime[i][CurrIdx] = - pAd->ChannelStats - .MibUpdateMyTxAirtime[i]; - pAd->MsMibBucket.MyRxAirtime[i][CurrIdx] = - pAd->ChannelStats - .MibUpdateMyRxAirtime[i]; -#ifdef CUSTOMER_RSG_FEATURE - pAd->MsMibBucket.EDCCAtime[i][CurrIdx] = - pAd->ChannelStats.MibUpdateEDCCAtime[i]; - pAd->MsMibBucket.PdCount[i][CurrIdx] = - pAd->ChannelStats.MibUpdatePdCount[i]; - pAd->MsMibBucket.MdrdyCount[i][CurrIdx] = - pAd->ChannelStats.MibUpdateMdrdyCount[i]; -#endif - Reset_MIB_Update_Counters(pAd, i); - } else -#endif - { - /* OBSS Air time */ - HW_IO_READ32(pAd, RMAC_MIBTIME5 + i * 4, - &CrValue); - pAd->MsMibBucket.OBSSAirtime[i][CurrIdx] = - CrValue; - /* My Tx Air time */ - HW_IO_READ32(pAd, - MIB_M0SDR36 + (i * BandOffset), - &CrValue); - pAd->MsMibBucket.MyTxAirtime[i][CurrIdx] = - CrValue; - /* My Rx Air time */ - HW_IO_READ32(pAd, - MIB_M0SDR37 + (i * BandOffset), - &CrValue); - pAd->MsMibBucket.MyRxAirtime[i][CurrIdx] = - CrValue; - /* EDCCA time */ - HW_IO_READ32(pAd, - MIB_M0SDR18 + (i * BandOffset), - &CrValue); - pAd->MsMibBucket.EDCCAtime[i][CurrIdx] = - CrValue; - - HW_IO_READ32(pAd, - RO_BAND0_PHYCTRL_STS0 + - (i * BandOffset), - &CrValue); /* PD count */ - pAd->MsMibBucket.PdCount[i][CurrIdx] = CrValue; - HW_IO_READ32(pAd, - RO_BAND0_PHYCTRL_STS5 + - (i * BandOffset), - &CrValue); /* MDRDY count */ - pAd->MsMibBucket.MdrdyCount[i][CurrIdx] = - CrValue; - HW_IO_READ32(pAd, - PHY_BAND0_PHYMUX_5 + - (i * BandOffset), - &CrValue); - CrValue &= 0xff8fffff; - HW_IO_WRITE32(pAd, - PHY_BAND0_PHYMUX_5 + - (i * BandOffset), - CrValue); /* Reset */ - CrValue |= 0x500000; - HW_IO_WRITE32(pAd, - PHY_BAND0_PHYMUX_5 + - (i * BandOffset), - CrValue); /* Enable */ - } - } - } - /* Reset OBSS Air time */ - HW_IO_READ32(pAd, RMAC_MIBTIME0, &CrValue); - CrValue |= 1 << RX_MIBTIME_CLR_OFFSET; - CrValue |= 1 << RX_MIBTIME_EN_OFFSET; - HW_IO_WRITE32(pAd, RMAC_MIBTIME0, CrValue); -} - -static RTMP_REG_PAIR mac_cr_seg[] = { - { 0x20000, 0x20010 }, /* WF_CFG */ - { WF_TRB_BASE, 0x21040 }, /* WF_CFG */ - { WF_AGG_BASE, 0x21240 }, /* WF_CFG */ - { WF_ARB_BASE, 0x21440 }, /* WF_CFG */ - { 0, 0 }, -}; - -VOID dump_mt_mac_cr(RTMP_ADAPTER *pAd) -{ - INT index = 0; - UINT32 mac_val, mac_addr, seg_s, seg_e; - - while (mac_cr_seg[index].Register != 0) { - seg_s = mac_cr_seg[index].Register; - seg_e = mac_cr_seg[index].Value; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dump WF_CFG Segment(Start=0x%x, End=0x%x)\n", seg_s, - seg_e)); - - for (mac_addr = seg_s; mac_addr < seg_e; mac_addr += 4) { - MAC_IO_READ32(pAd, mac_addr, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MAC[0x%x] = 0x%x\n", mac_addr, mac_val)); - } - - index++; - }; -} - -INT mt_mac_fifo_stat_update(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); - return FALSE; -} - -VOID NicGetTxRawCounters(IN RTMP_ADAPTER *pAd, IN TX_STA_CNT0_STRUC *pStaTxCnt0, - IN TX_STA_CNT1_STRUC *pStaTxCnt1) -{ - /* TODO: shiang-7603 */ - return; -} - -/* - ======================================================================== - - Routine Description: - Read statistical counters from hardware registers and record them - in software variables for later on query - - Arguments: - pAd Pointer to our adapter - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - ======================================================================== -*/ -static VOID NICUpdateAmpduRawCounters(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - /* for PER debug */ - UINT32 AmpduTxCount = 0; - UINT32 AmpduTxSuccessCount = 0; - COUNTER_802_11 *wlanCounter; - UINT32 mac_val, ampdu_range_cnt[4]; - UINT32 Offset = 0x200 * BandIdx; - - wlanCounter = &pAd->WlanCounters[BandIdx]; - MAC_IO_READ32(pAd, MIB_M0SDR14 + Offset, &AmpduTxCount); - AmpduTxCount &= 0xFFFFFF; - MAC_IO_READ32(pAd, MIB_M0SDR15 + Offset, &AmpduTxSuccessCount); - AmpduTxSuccessCount &= 0xFFFFFF; - MAC_IO_READ32(pAd, MIB_M0DR2 + Offset, &mac_val); - ampdu_range_cnt[0] = mac_val & 0xffff; - ampdu_range_cnt[1] = (mac_val >> 16) & 0xffff; - MAC_IO_READ32(pAd, MIB_M0DR3 + Offset, &mac_val); - ampdu_range_cnt[2] = mac_val & 0xffff; - ampdu_range_cnt[3] = (mac_val >> 16) & 0xffff; -#ifdef STATS_COUNT_SUPPORT - wlanCounter->AmpduSuccessCount.u.LowPart += AmpduTxSuccessCount; - wlanCounter->AmpduFailCount.u.LowPart += - (AmpduTxCount - AmpduTxSuccessCount); -#endif /* STATS_COUNT_SUPPORT */ - wlanCounter->TxAggRange1Count.u.LowPart += ampdu_range_cnt[0]; - wlanCounter->TxAggRange2Count.u.LowPart += ampdu_range_cnt[1]; - wlanCounter->TxAggRange3Count.u.LowPart += ampdu_range_cnt[2]; - wlanCounter->TxAggRange4Count.u.LowPart += ampdu_range_cnt[3]; -} - -VOID NICUpdateRawCounters(RTMP_ADAPTER *pAd) -{ - UINT32 OldValue, i; - UINT32 rx_err_cnt, fcs_err_cnt, mdrdy_cnt = 0, fcs_err_cnt_band1 = 0, - mdrdy_cnt_band1 = 0; - /* UINT32 TxSuccessCount = 0, TxRetryCount = 0; */ -#ifdef TXRX_STAT_SUPPORT - struct hdev_ctrl *ctrl = (struct hdev_ctrl *)pAd->hdev_ctrl; -#endif -#ifdef COMPOS_WIN - COUNTER_MTK *pPrivCounters; -#else - COUNTER_RALINK *pPrivCounters; -#endif - COUNTER_802_11 *wlanCounter; - COUNTER_802_3 *dot3Counters; -#ifdef ERR_RECOVERY - - if (IsStopingPdma(&pAd->ErrRecoveryCtl)) - return; - -#endif /* ERR_RECOVERY */ -#ifdef COMPOS_WIN - wlanCounter = &pAd->Counter.WlanCounters; - pPrivCounters = &pAd->Counter.MTKCounters; - dot3Counters = &pAd->Counter.Counters8023; -#else - pPrivCounters = &pAd->RalinkCounters; - wlanCounter = &pAd->WlanCounters[0]; - dot3Counters = &pAd->Counters8023; -#endif /* COMPOS_WIN */ - MAC_IO_READ32(pAd, MIB_M0SDR3, &rx_err_cnt); - fcs_err_cnt = rx_err_cnt & 0xffff; - MAC_IO_READ32(pAd, MIB_M0SDR4, &rx_err_cnt); - - MAC_IO_READ32(pAd, MIB_M1SDR3, &fcs_err_cnt_band1); -#ifndef TXRX_STAT_SUPPORT - if (pAd->parse_rxv_stat_enable) { -#endif -#ifdef MT7615 - if (IS_MT7615(pAd)) - fcs_err_cnt_band1 = (fcs_err_cnt_band1 & - 0xffff); /* [15:0] FCS ERR */ -#endif -#ifndef TXRX_STAT_SUPPORT - } -#endif - -#ifdef TXRX_STAT_SUPPORT - ctrl->rdev[DBDC_BAND0].pRadioCtrl->RxCRCErrorCount.QuadPart += - fcs_err_cnt; - if (pAd->CommonCfg.dbdc_mode) - ctrl->rdev[DBDC_BAND1].pRadioCtrl->RxCRCErrorCount.QuadPart += - fcs_err_cnt_band1; -#endif - if (pAd->parse_rxv_stat_enable) { - MAC_IO_READ32(pAd, MIB_M0SDR10, &mdrdy_cnt); -#if defined(MT7615) - if (IS_MT7615(pAd)) - mdrdy_cnt = - (mdrdy_cnt & 0x3FFFFFF); /* [25:0] Mac Mdrdy*/ - -#endif - MAC_IO_READ32(pAd, MIB_M1SDR10, &mdrdy_cnt_band1); -#if defined(MT7615) - if (IS_MT7615(pAd)) - mdrdy_cnt_band1 = (mdrdy_cnt_band1 & - 0x3FFFFFF); /* [25:0] Mac Mdrdy*/ - -#endif - } - - pPrivCounters->OneSecRxFcsErrCnt += fcs_err_cnt; - - if (pAd->parse_rxv_stat_enable) { - pAd->AccuOneSecRxBand0FcsErrCnt += - fcs_err_cnt; /*Used for rx_statistic*/ - pAd->AccuOneSecRxBand0MdrdyCnt += - mdrdy_cnt; /*Used for rx_statistic*/ - pAd->AccuOneSecRxBand1FcsErrCnt += - fcs_err_cnt_band1; /*Used for rx_statistic*/ - pAd->AccuOneSecRxBand1MdrdyCnt += - mdrdy_cnt_band1; /*Used for rx_statistic*/ - } - -#ifdef STATS_COUNT_SUPPORT - /* Update FCS counters*/ - OldValue = pAd->WlanCounters[0].FCSErrorCount.u.LowPart; - pAd->WlanCounters[0].FCSErrorCount.u.LowPart += fcs_err_cnt; /* >> 7);*/ - - if (pAd->WlanCounters[0].FCSErrorCount.u.LowPart < OldValue) - pAd->WlanCounters[0].FCSErrorCount.u.HighPart++; - -#ifdef DBDC_MODE -#ifdef CONFIG_ATE - if (IS_ATE_DBDC(pAd)) { -#else - if (pAd->CommonCfg.dbdc_mode) { -#endif /* CONFIG_ATE */ - /* Update FCS counters of band1 */ - OldValue = pAd->WlanCounters[1].FCSErrorCount.u.LowPart; - pAd->WlanCounters[1].FCSErrorCount.u.LowPart += - fcs_err_cnt_band1; - - if (pAd->WlanCounters[1].FCSErrorCount.u.LowPart < OldValue) - pAd->WlanCounters[1].FCSErrorCount.u.HighPart++; - } -#endif /* DBDC_MODE */ - -#endif /* STATS_COUNT_SUPPORT */ - /* Add FCS error count to private counters*/ - pPrivCounters->OneSecRxFcsErrCnt += fcs_err_cnt; - OldValue = pPrivCounters->RealFcsErrCount.u.LowPart; - pPrivCounters->RealFcsErrCount.u.LowPart += fcs_err_cnt; - - if (pPrivCounters->RealFcsErrCount.u.LowPart < OldValue) - pPrivCounters->RealFcsErrCount.u.HighPart++; - - dot3Counters->RxNoBuffer += (rx_err_cnt & 0xffff); - - for (i = 0; i < DBDC_BAND_NUM; i++) - NICUpdateAmpduRawCounters(pAd, i); - -#ifdef CONFIG_QA - - if (pAd->ATECtrl.bQAEnabled == TRUE) { - /* Modify Rx stat structure */ - /* pAd->ATECtrl.rx_stat.RxMacFCSErrCount += fcs_err_cnt; */ - MT_ATEUpdateRxStatistic(pAd, 3, wlanCounter); - } - -#endif - return; -} - -/* - ======================================================================== - - Routine Description: - Clean all Tx/Rx statistic raw counters from hardware registers - - Arguments: - pAd Pointer to our adapter - - Return Value: - None - - ======================================================================== -*/ -VOID NicResetRawCounters(RTMP_ADAPTER *pAd) -{ - return; -} - -UCHAR tmi_rate_map_cck_lp[] = { - TMI_TX_RATE_CCK_1M_LP, - TMI_TX_RATE_CCK_2M_LP, - TMI_TX_RATE_CCK_5M_LP, - TMI_TX_RATE_CCK_11M_LP, -}; - -UCHAR tmi_rate_map_cck_sp[] = { - TMI_TX_RATE_CCK_2M_SP, - TMI_TX_RATE_CCK_5M_SP, - TMI_TX_RATE_CCK_11M_SP, -}; - -UCHAR tmi_rate_map_ofdm[] = { - TMI_TX_RATE_OFDM_6M, TMI_TX_RATE_OFDM_9M, TMI_TX_RATE_OFDM_12M, - TMI_TX_RATE_OFDM_18M, TMI_TX_RATE_OFDM_24M, TMI_TX_RATE_OFDM_36M, - TMI_TX_RATE_OFDM_48M, TMI_TX_RATE_OFDM_54M, -}; - -#define TMI_TX_RATE_CCK_VAL(_mcs) \ - ((TMI_TX_RATE_MODE_CCK << TMI_TX_RATE_BIT_MODE) | (_mcs)) - -#define TMI_TX_RATE_OFDM_VAL(_mcs) \ - ((TMI_TX_RATE_MODE_OFDM << TMI_TX_RATE_BIT_MODE) | (_mcs)) - -#define TMI_TX_RATE_HT_VAL(_mode, _mcs, _stbc) \ - (((_stbc) << TMI_TX_RATE_BIT_STBC) | \ - ((_mode) << TMI_TX_RATE_BIT_MODE) | (_mcs)) - -#define TMI_TX_RATE_VHT_VAL(_nss, _mcs, _stbc) \ - (((_stbc) << TMI_TX_RATE_BIT_STBC) | \ - (((_nss - 1) & (TMI_TX_RATE_MASK_NSS)) << TMI_TX_RATE_BIT_NSS) | \ - (TMI_TX_RATE_MODE_VHT << TMI_TX_RATE_BIT_MODE) | (_mcs)) - -UINT16 tx_rate_to_tmi_rate(UINT8 mode, UINT8 mcs, UINT8 nss, BOOLEAN stbc, - UINT8 preamble) -{ - UINT16 tmi_rate = 0, mcs_id = 0; - - stbc = (stbc == TRUE) ? 1 : 0; - - switch (mode) { - case MODE_CCK: - if (preamble) { - if (mcs < ARRAY_SIZE(tmi_rate_map_cck_lp)) - mcs_id = tmi_rate_map_cck_lp[mcs]; - } else { - if (mcs < ARRAY_SIZE(tmi_rate_map_cck_sp)) - mcs_id = tmi_rate_map_cck_sp[mcs]; - } - - tmi_rate = (TMI_TX_RATE_MODE_CCK << TMI_TX_RATE_BIT_MODE) | - (mcs_id); - break; - - case MODE_OFDM: - if (mcs < ARRAY_SIZE(tmi_rate_map_ofdm)) { - mcs_id = tmi_rate_map_ofdm[mcs]; - tmi_rate = (TMI_TX_RATE_MODE_OFDM - << TMI_TX_RATE_BIT_MODE) | - (mcs_id); - } - - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - tmi_rate = ((USHORT)(stbc << TMI_TX_RATE_BIT_STBC)) | - (((nss - 1) & TMI_TX_RATE_MASK_NSS) - << TMI_TX_RATE_BIT_NSS) | - ((USHORT)(mode << TMI_TX_RATE_BIT_MODE)) | - ((USHORT)(mcs)); - /* MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s(): mode=%d, mcs=%d, stbc=%d converted tmi_rate=0x%x\n", */ - /* __FUNCTION__, mode, mcs, stbc, tmi_rate)); */ - break; - - case MODE_VHT: - tmi_rate = TMI_TX_RATE_VHT_VAL(nss, mcs, stbc); - break; - - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid mode(mode=%d)\n", __func__, mode)); - break; - } - - return tmi_rate; -} - -UCHAR get_nsts_by_mcs(UCHAR phy_mode, UCHAR mcs, BOOLEAN stbc, UCHAR vht_nss) -{ - UINT8 nsts = 1; - - switch (phy_mode) { - case MODE_VHT: - if (stbc && (vht_nss == 1)) - nsts++; - else - nsts = vht_nss; - - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - if (mcs != 32) { - nsts += (mcs >> 3); - - if (stbc && (nsts == 1)) - nsts++; - } - - break; - - case MODE_CCK: - case MODE_OFDM: - default: - break; - } - - return nsts; -} - -UCHAR dmac_wmm_swq_2_hw_ac_que[4][4] = { { - TxQ_IDX_AC0, /* 0: QID_AC_BK */ - TxQ_IDX_AC1, /* 1: QID_AC_BE */ - TxQ_IDX_AC2, /* 2: QID_AC_VI */ - TxQ_IDX_AC3, /* 3: QID_AC_VO */ - }, - { - TxQ_IDX_AC10, - TxQ_IDX_AC11, - TxQ_IDX_AC12, - TxQ_IDX_AC13, - }, - { - TxQ_IDX_AC20, - TxQ_IDX_AC21, - TxQ_IDX_AC22, - TxQ_IDX_AC23, - }, - { - TxQ_IDX_AC30, - TxQ_IDX_AC31, - TxQ_IDX_AC32, - TxQ_IDX_AC33, - } }; - -UINT8 dmac_ac_queue_to_up[4] = { - 1 /* AC_BK */, 0 /* AC_BE */, 5 /* AC_VI */, 7 /* AC_VO */ -}; - -VOID MtWriteTMacInfo(RTMP_ADAPTER *pAd, UCHAR *buf, TMAC_INFO *TxInfo) -{ - TMAC_TXD_S *txd_s = (TMAC_TXD_S *)buf; - TMAC_TXD_L *txd_l = (TMAC_TXD_L *)buf; - TMAC_TXD_0 *txd_0 = &txd_s->TxD0; - TMAC_TXD_1 *txd_1 = &txd_s->TxD1; - TMAC_TXD_2 *txd_2 = NULL; - TMAC_TXD_3 *txd_3 = NULL; - TMAC_TXD_5 *txd_5 = NULL; - TMAC_TXD_6 *txd_6 = NULL; - UINT32 *txd_7 = NULL; - UCHAR txd_size; - UCHAR stbc = 0, bw = BW_20, mcs = 0, nss = 1, sgi = 0, phy_mode = 0, - preamble = 1, ldpc = 0, expBf = 0, impBf = 0, vht_nss = 1; - TX_RADIO_SET_T *pTxRadioSet = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - /*DWORD 0*/ - txd_0->p_idx = TxInfo->PortIdx; - txd_0->q_idx = TxInfo->QueIdx; - - if ((TxInfo->QueIdx < 4) && (TxInfo->WmmSet < 4)) - txd_0->q_idx = - dmac_wmm_swq_2_hw_ac_que[TxInfo->WmmSet][TxInfo->QueIdx]; - else { - /* TODO: shiang-usw, consider about MCC case! */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Non-WMM Q, TxInfo->WmmSet/QueIdx(%d/%d)!\n", - __func__, TxInfo->WmmSet, TxInfo->QueIdx)); - txd_0->q_idx = TxInfo->QueIdx; - } - -#ifdef CONFIG_CSO_SUPPORT - txd_0->UdpTcpChkSumOffload = 0; - txd_0->IpChkSumOffload = 0; - - if (txd_0->IpChkSumOffload || txd_0->UdpTcpChkSumOffload) - txd_0->EthTypeOffset = - 8; /* 8 is (14+2)/2, it is 7615 setting just for 802.3 frame not for 802.11 */ - -#endif /* CONFIG_CSO_SUPPORT */ - /*DWORD 1*/ - txd_1->wlan_idx = TxInfo->Wcid; - - if (txd_1->wlan_idx >= cap->WtblHwNum) { - pAd->wrong_wlan_idx_num++; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wrong wlan index = %d\n", txd_1->wlan_idx)); - dump_stack(); - } - - if (!TxInfo->NeedTrans) { - txd_1->hdr_format = TMI_HDR_FT_NOR_80211; - TMI_HDR_INFO_VAL(txd_1->hdr_format, 0, 0, 0, 0, 0, - TxInfo->WifiHdrLen, 0, txd_1->hdr_info); - - /* TODO: depends on QoS to decide if need to padding */ - if (TxInfo->HdrPad) - txd_1->hdr_pad = (TMI_HDR_PAD_MODE_TAIL - << TMI_HDR_PAD_BIT_MODE) | - TxInfo->HdrPad; - } else { - txd_1->hdr_format = TMI_HDR_FT_NON_80211; - TMI_HDR_INFO_VAL(txd_1->hdr_format, TxInfo->MoreData, - TxInfo->Eosp, 1, TxInfo->VlanFrame, - TxInfo->EtherFrame, TxInfo->WifiHdrLen, 0, - txd_1->hdr_info); - - if (TxInfo->HdrPad) - txd_1->hdr_pad = (TMI_HDR_PAD_MODE_HEAD - << TMI_HDR_PAD_BIT_MODE) | - TxInfo->HdrPad; - } - - txd_1->tid = TxInfo->UserPriority; - txd_1->OwnMacAddr = TxInfo->OwnMacIdx; - - if (TxInfo->LongFmt == FALSE) { - txd_1->ft = TMI_FT_SHORT; - txd_size = sizeof(TMAC_TXD_S); - txd_7 = &txd_s->TxD7; - } else { - txd_2 = &txd_l->TxD2; - txd_3 = &txd_l->TxD3; - txd_5 = &txd_l->TxD5; - txd_6 = &txd_l->TxD6; - txd_7 = &txd_l->TxD7; - txd_1->ft = TMI_FT_LONG; - txd_size = sizeof(TMAC_TXD_L); - pTxRadioSet = &TxInfo->TxRadioSet; - ldpc = pTxRadioSet->Ldpc; - mcs = pTxRadioSet->RateCode; - sgi = pTxRadioSet->ShortGI; - stbc = pTxRadioSet->Stbc; - phy_mode = pTxRadioSet->PhyMode; - bw = pTxRadioSet->CurrentPerPktBW; - expBf = pTxRadioSet->EtxBFEnable; - impBf = pTxRadioSet->ItxBFEnable; - vht_nss = TxInfo->VhtNss ? TxInfo->VhtNss : 1; - nss = get_nsts_by_mcs(phy_mode, mcs, stbc, vht_nss); - /*DW2*/ - txd_2->max_tx_time = TxInfo->MaxTxTime; - txd_2->bc_mc_pkt = TxInfo->BmcPkt; - txd_2->fix_rate = TxInfo->FixRate; - txd_2->frm_type = TxInfo->FrmType; - txd_2->sub_type = TxInfo->SubType; - - if (TxInfo->NeedTrans) - txd_2->htc_vld = 0; - - txd_2->frag = TxInfo->FragIdx; - txd_2->timing_measure = TxInfo->TimingMeasure; - txd_2->ba_disable = TxInfo->BaDisable; - txd_2->pwr_offset = TxInfo->PowerOffset; - /*DW3*/ - txd_3->remain_tx_cnt = TxInfo->RemainTxCnt; - txd_3->sn = TxInfo->Sn; - txd_3->no_ack = (TxInfo->bAckRequired ? 0 : 1); - txd_3->protect_frm = (TxInfo->CipherAlg != CIPHER_NONE) ? 1 : 0; - /*DW5*/ - txd_5->pid = TxInfo->Pid; - txd_5->tx_status_fmt = TxInfo->TxSFmt; - txd_5->tx_status_2_host = TxInfo->TxS2Host; - txd_5->tx_status_2_mcu = TxInfo->TxS2Mcu; - - if (TxInfo->NeedTrans) - txd_5->da_select = TMI_DAS_FROM_MPDU; - - /* txd_5->BarSsnCtrl = TxInfo->BarSsnCtrl; */ - /* For MT STA LP control, use H/W control mode for PM bit */ -#if defined(CONFIG_STA_SUPPORT) && defined(CONFIG_PM_BIT_HW_MODE) - txd_5->pwr_mgmt = TMI_PM_BIT_CFG_BY_HW; -#else - txd_5->pwr_mgmt = TMI_PM_BIT_CFG_BY_SW; -#endif /* CONFIG_STA_SUPPORT && CONFIG_PM_BIT_HW_MODE */ - - /* DW6 */ - if (txd_2->fix_rate == 1) { - txd_6->fix_rate_mode = TMI_FIX_RATE_BY_TXD; - /* TODO: MT7615 fix me! the AntPri is 8 bits, but currently hardware "ant_id" can support up to 12 bits!! */ - txd_6->ant_id = TxInfo->AntPri; - /* TODO: MT7615, fix me! how to support SpeExtEnable in MT7615?? */ - /* txd_6->spe_en = TxInfo->SpeEn; */ - txd_6->bw = ((1 << 2) | bw); - txd_6->dyn_bw = 0; - txd_6->TxBF = ((impBf | expBf) ? 1 : 0); - txd_6->ldpc = ldpc; - txd_6->gi = sgi; - - if (txd_6->fix_rate_mode == TMI_FIX_RATE_BY_TXD) { - preamble = TxInfo->TxRadioSet.Premable; - txd_6->tx_rate = tx_rate_to_tmi_rate( - phy_mode, mcs, nss, stbc, preamble); - } - } - } - - /* DWORD 7 */ - if (cap->txd_type == TXD_V1) { - *txd_7 &= ~SPE_IDX_MASK; - *txd_7 |= SPE_IDX(TxInfo->AntPri); - } else { - *txd_7 &= ~CON_SPE_IDX_MASK; - *txd_7 |= CON_SPE_IDX(TxInfo->AntPri); - } - *txd_7 |= PP_REF_SUBTYPE(TxInfo->SubType); - *txd_7 |= PP_REF_TYPE(TxInfo->FrmType); - - txd_0->TxByteCount = txd_size + TxInfo->PktLen; -} - -/* - ======================================================================== - - Routine Description: - Calculates the duration which is required to transmit out frames - with given size and specified rate. - - Arguments: - pTxWI Pointer to head of each MPDU to HW. - Ack Setting for Ack requirement bit - Fragment Setting for Fragment bit - RetryMode Setting for retry mode - Ifs Setting for IFS gap - Rate Setting for transmit rate - Service Setting for service - Length Frame length - TxPreamble Short or Long preamble when using CCK rates - QueIdx - 0-3, according to 802.11e/d4.4 June/2003 - - Return Value: - None - - See also : BASmartHardTransmit() !!! - - ======================================================================== -*/ - -VOID mtd_write_tmac_info_fixed_rate(IN RTMP_ADAPTER *pAd, IN UCHAR *tmac_info, - IN MAC_TX_INFO *info, - IN HTTRANSMIT_SETTING *pTransmit) -{ - MAC_TABLE_ENTRY *mac_entry = NULL; - UCHAR stbc, bw, mcs, nss = 1, sgi, phy_mode, ldpc = 0, - preamble = LONG_PREAMBLE; - UCHAR q_idx = info->q_idx; - TMAC_TXD_L txd; - TMAC_TXD_0 *txd_0 = &txd.TxD0; - TMAC_TXD_1 *txd_1 = &txd.TxD1; - TMAC_TXD_2 *txd_2 = &txd.TxD2; - TMAC_TXD_3 *txd_3 = &txd.TxD3; - TMAC_TXD_5 *txd_5 = &txd.TxD5; - TMAC_TXD_6 *txd_6 = &txd.TxD6; - UINT32 *txd_7 = &txd.TxD7; - INT txd_size = sizeof(TMAC_TXD_S); - STA_TR_ENTRY *tr_entry = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - -#ifdef CONFIG_AP_SUPPORT - struct wifi_dev *wdev = NULL; -#ifdef WIFI_EAP_FEATURE - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - UCHAR apidx = pObj->ioctl_if; - /* obtain Band index */ - if (apidx >= HW_BEACON_MAX_NUM) - return; - - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; -#endif /* WIFI_EAP_FEATURE */ -#endif /* CONFIG_AP_SUPPORT */ - - if (VALID_UCAST_ENTRY_WCID(pAd, info->WCID)) - mac_entry = &pAd->MacTab.Content[info->WCID]; - - NdisZeroMemory(&txd, sizeof(TMAC_TXD_L)); - ldpc = pTransmit->field.ldpc; - mcs = pTransmit->field.MCS; - sgi = pTransmit->field.ShortGI; - stbc = pTransmit->field.STBC; - phy_mode = pTransmit->field.MODE; - bw = (phy_mode <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); -#ifdef DOT11_N_SUPPORT -#ifdef CONFIG_ATE - - if (!ATE_ON(pAd)) -#endif - { - if (mac_entry && !IS_ENTRY_NONE(mac_entry)) { - UCHAR MaxMcs_1ss; -#ifdef DOT11_VHT_AC - - if (IS_VHT_STA(mac_entry)) - MaxMcs_1ss = 9; - else -#endif /* DOT11_VHT_AC */ - MaxMcs_1ss = 7; - - if ((pAd->CommonCfg.bMIMOPSEnable) && - (mac_entry->MmpsMode == MMPS_STATIC) && - (pTransmit->field.MODE >= MODE_HTMIX && - pTransmit->field.MCS > MaxMcs_1ss)) - mcs = MaxMcs_1ss; - } - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - - if (pAd->CommonCfg.VoPwrConstraintTest == TRUE) { - info->AMPDU = 0; - mcs = 0; - ldpc = 0; - bw = 0; - sgi = 0; - stbc = 0; - phy_mode = MODE_OFDM; - } - -#endif /* DOT11K_RRM_SUPPORT */ - /* DWORD 0 */ - txd_0->p_idx = P_IDX_LMAC; - - if (q_idx < WMM_QUE_NUM) - txd_0->q_idx = dmac_wmm_swq_2_hw_ac_que[info->wmm_set][q_idx]; - else - txd_0->q_idx = q_idx; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(%d): TxBlk->wmm_set= %d, QID = %d\n", __func__, __LINE__, - info->wmm_set, txd_0->q_idx)); -#ifdef CONFIG_CSO_SUPPORT -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - - if (IS_MT7615(pAd) || IS_MT7622(pAd) || IS_P18(pAd) || IS_MT7663(pAd)) { - /* Leonardo: checksumm offload is not necessary for management frame */ - txd_0->UdpTcpChkSumOffload = 0; - txd_0->IpChkSumOffload = 0; - } - -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ -#endif /* CONFIG_CSO_SUPPORT */ - /* DWORD 1 */ - txd_1->wlan_idx = info->WCID; - - if (txd_1->wlan_idx >= cap->WtblHwNum) { - pAd->wrong_wlan_idx_num++; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("wrong wlan index = %d\n", txd_1->wlan_idx)); - dump_stack(); - } - - txd_1->ft = TMI_FT_LONG; - txd_1->txd_len = 0; - txd_1->hdr_format = TMI_HDR_FT_NOR_80211; - TMI_HDR_INFO_VAL(txd_1->hdr_format, 0, 0, 0, 0, 0, info->hdr_len, 0, - txd_1->hdr_info); - - if (info->hdr_pad) /* TODO: depends on QoS to decide if need to padding */ - txd_1->hdr_pad = - (TMI_HDR_PAD_MODE_TAIL << TMI_HDR_PAD_BIT_MODE) | 0x1; - -#if defined(MT7622) || defined(P18) || defined(MT7663) - - if (IS_MT7622(pAd) || IS_P18(pAd) || IS_MT7663(pAd)) - txd_1->UNxV = 0; /* MT7622: Chagne UNxV to TXDEXTLEN */ - -#endif - txd_1->tid = info->TID; - - if (info->IsOffloadPkt == TRUE) - txd_1->pkt_ft = TMI_PKT_FT_MCU_FW; - else - txd_1->pkt_ft = TMI_PKT_FT_HIF_CT; /* cut-through */ - - txd_1->OwnMacAddr = info->OmacIdx; - - /* - repeater entry doesn't have real wdev could bind. - so reference the OmacIdx which is stored in tr_entry. - - other types entry could reference the OmacIdx of wdev which is connected to the pEntry. - */ - if (mac_entry && IS_ENTRY_REPEATER(mac_entry)) { - tr_entry = &pAd->MacTab.tr_entry[mac_entry->wcid]; - txd_1->OwnMacAddr = tr_entry->OmacIdx; - } else if (mac_entry && !IS_ENTRY_NONE(mac_entry) && - !IS_ENTRY_MCAST(mac_entry)) - txd_1->OwnMacAddr = mac_entry->wdev->OmacIdx; - - if (txd_1->ft == TMI_FT_LONG) { - txd_size = sizeof(TMAC_TXD_L); - - /* DWORD 2 */ - if (info->IsOffloadPkt == TRUE) { - txd_2->sub_type = info->SubType; - txd_2->frm_type = info->Type; - } - - txd_2->ndp = 0; - txd_2->ndpa = 0; - txd_2->sounding = 0; - txd_2->rts = 0; - txd_2->bc_mc_pkt = info->BM; - txd_2->bip = 0; - txd_2->fix_rate = 1; - txd_2->max_tx_time = 0; - txd_2->duration = 0; - txd_2->htc_vld = 0; - txd_2->frag = - info->FRAG; /* 0: no frag, 1: 1st frag, 2: mid frag, 3: last frag */ - txd_2->max_tx_time = 0; - txd_2->pwr_offset = 0; - txd_2->ba_disable = 1; - txd_2->timing_measure = 0; - - if (info->IsAutoRate) - txd_2->fix_rate = 0; - else - txd_2->fix_rate = 1; - - if ((pAd->pTmrCtrlStruct != NULL) && - (pAd->pTmrCtrlStruct->TmrEnable == TMR_INITIATOR)) { - if ((info->Ack == 1) && (txd_2->bc_mc_pkt == 0)) - txd_2->timing_measure = 1; - } - -#ifdef WIFI_EAP_FEATURE -#ifdef CONFIG_AP_SUPPORT - if (wdev->mgmt_txpwr_force_on == TRUE) { - if (info->Type == FC_TYPE_MGMT) - txd_2->pwr_offset = wdev->txd_txpwr_offset; - } -#endif -#endif - -#ifndef FTM_SUPPORT - - if ((pAd->pTmrCtrlStruct != NULL) && - (pAd->pTmrCtrlStruct->TmrEnable == TMR_INITIATOR)) -#endif /* FTM_SUPPORT */ - { - if (info->IsTmr) - txd_2->timing_measure = 1; - } - - /* DWORD 3 */ - if (txd_0->q_idx == TxQ_IDX_BCN0 || - txd_0->q_idx == TxQ_IDX_BCN1) - txd_3->remain_tx_cnt = MT_TX_RETRY_UNLIMIT; - else { -#ifdef FTM_SUPPORT - - if (info->IsTmr) - txd_3->remain_tx_cnt = 1; - else -#endif /* FTM_SUPPORT */ - txd_3->remain_tx_cnt = MT_TX_SHORT_RETRY; - } - - txd_3->no_ack = (info->Ack ? 0 : 1); - - if (0 /* bar_sn_ctrl */) - txd_3->sn_vld = 1; -#ifdef DPP_SUPPORT - if (mac_entry && info->PID == PID_MGMT_DPP_FRAME) { - txd_3->sn_vld = 1; - txd_3->sn = info->seq_no; - } -#endif /* DPP_SUPPORT */ - - /* DWORD 4 */ - /* DWORD 5 */ -#ifdef FTM_SUPPORT - - if (info->IsTmr) { - txd_5->pid = info->PID; - txd_5->tx_status_fmt = TXS_FORMAT0; - txd_5->tx_status_2_mcu = 0; - txd_5->tx_status_2_host = 1; - } - -#endif /* FTM_SUPPORT */ - -#ifdef DPP_SUPPORT - if (mac_entry && info->PID == PID_MGMT_DPP_FRAME) { - txd_5->pid = info->PID; - txd_5->tx_status_fmt = TXS_FORMAT0; - txd_5->tx_status_2_mcu = 0; - txd_5->tx_status_2_host = 1; - } -#endif /* DPP_SUPPORT */ -#ifdef HDR_TRANS_TX_SUPPORT - /* txd_5->da_select = TMI_DAS_FROM_MPDU; */ -#endif /* HDR_TRANS_TX_SUPPORT */ - /* TODO: shiang-MT7615, fix me! bar_sn_ctrl = Write SSN to SN field and set sn_vld bit to 1 */ - /* txd_5->bar_sn_ctrl = 1; */ - - if (info->PsmBySw) - txd_5->pwr_mgmt = TMI_PM_BIT_CFG_BY_SW; - else - txd_5->pwr_mgmt = TMI_PM_BIT_CFG_BY_HW; - - /* txd_5->pn_high = 0; */ - - /* DWORD 6 */ - if (txd_2->fix_rate == 1) { - txd_6->fix_rate_mode = TMI_FIX_RATE_BY_TXD; - txd_6->bw = ((1 << 2) | bw); - txd_6->dyn_bw = 0; - txd_6->ant_id = 0; /* Smart Antenna indicator */ - txd_6->TxBF = 0; - txd_6->ldpc = ldpc; - txd_6->gi = sgi; - - if (txd_6->fix_rate_mode == TMI_FIX_RATE_BY_TXD) { - if (phy_mode == MODE_CCK) - preamble = info->Preamble; - - txd_6->tx_rate = tx_rate_to_tmi_rate( - phy_mode, mcs, nss, stbc, preamble); - } - } - -#ifdef FTM_SUPPORT - - if (txd_2->timing_measure) { - txd_2->fix_rate = 1; - txd_6->fix_rate_mode = TMI_FIX_RATE_BY_TXD; - - switch (info->ftm_bw) { - case FTM_BW_VHT_BW80_80: - case FTM_BW_VHT_BW80: - case FTM_BW_VHT_BW40: - case FTM_BW_VHT_BW20: - txd_6->tx_rate = tx_rate_to_tmi_rate( - MODE_VHT, 0, nss, stbc, preamble); - break; - - case FTM_BW_HT_BW40: - case FTM_BW_HT_BW20: - txd_6->tx_rate = tx_rate_to_tmi_rate( - MODE_HTMIX, 0, nss, stbc, preamble); - break; - - case FTM_BW_NONHT_BW20: - default: - txd_6->tx_rate = tx_rate_to_tmi_rate( - MODE_OFDM, 0, nss, stbc, preamble); - break; - } - } - -#endif /* FTM_SUPPORT */ - - if (info->prot == 1) - txd_3->protect_frm = 1; - else if (info->prot == 2 || info->prot == 3) { -#ifdef CONFIG_AP_SUPPORT - - if (mac_entry) { - wdev = mac_entry->wdev; - GET_GroupKey_WCID(wdev, info->WCID); - } - -#ifdef DOT11W_PMF_SUPPORT - if (info->prot == 2) - txd_2->bip = 1; -#endif /* DOT11W_PMF_SUPPORT */ -#else - { - MAC_TABLE_ENTRY *pEntry = - &pAd->MacTab.Content[info->WCID]; - - info->WCID = pEntry->wdev->bss_info_argument - .ucBcMcWlanIdx; - } -#endif - txd_1->wlan_idx = info->WCID; - - if (txd_1->wlan_idx > 127) { - pAd->wrong_wlan_idx_num++; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("wrong wlan index = %d\n", - txd_1->wlan_idx)); - dump_stack(); - } - } else - txd_3->protect_frm = 0; - } - - /* DWORD 7 */ - if (cap->txd_type == TXD_V1) { - *txd_7 &= ~SPE_IDX_MASK; - *txd_7 |= SPE_IDX(info->AntPri); - - *txd_7 &= ~PP_REF_SUBTYPE_MASK; - *txd_7 |= PP_REF_SUBTYPE(info->SubType); - - *txd_7 &= ~PP_REF_TYPE_MASK; - *txd_7 |= PP_REF_TYPE(info->Type); - } else { - *txd_7 &= ~CON_SPE_IDX_MASK; - *txd_7 |= CON_SPE_IDX(info->AntPri); - } - - txd_0->TxByteCount = txd_size + info->Length; - - NdisMoveMemory(tmac_info, &txd, sizeof(TMAC_TXD_L)); - - if (0 /*(DebugSubCategory[9] & CATTX_TMAC) == CATTX_TMAC*/) - dump_tmac_info(pAd, tmac_info); -#ifdef RED_SUPPORT_BY_HOST - if (!pAd->red_have_cr4) - RedRecordForceRateFromDriver(pAd, info->WCID); -#endif -} - -VOID mtd_write_tmac_info(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk) -{ - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_MCU_OFFLOAD)) - mtd_write_tmac_info_by_cr4(pAd, buf, pTxBlk); - else - mtd_write_tmac_info_by_host(pAd, buf, pTxBlk); -} - -VOID mtd_write_tmac_info_by_cr4(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk) -{ - TMAC_TXD_L *txd_l = (TMAC_TXD_L *)buf; - TMAC_TXD_0 *txd_0 = &txd_l->TxD0; - TMAC_TXD_1 *txd_1 = &txd_l->TxD1; - - txd_0->p_idx = P_IDX_LMAC; - txd_0->q_idx = 0; - txd_0->TxByteCount = sizeof(TMAC_TXD_L) + pTxBlk->MpduHeaderLen + - pTxBlk->HdrPadLen + pTxBlk->SrcBufLen; - txd_1->ft = TMI_FT_LONG; - txd_1->txd_len = 0; - txd_1->pkt_ft = TMI_PKT_FT_HIF_CT; - txd_1->hdr_format = TMI_HDR_FT_NON_80211; - TMI_HDR_INFO_VAL(TMI_HDR_FT_NON_80211, 0, 0, 0, 0, 0, 0, 0, - txd_1->hdr_info); - - if (pTxBlk->HdrPadLen) - txd_1->hdr_pad = - (TMI_HDR_PAD_MODE_HEAD << TMI_HDR_PAD_BIT_MODE) | 0x1; -} - -VOID mtd_write_tmac_info_by_host(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk) -{ - MAC_TABLE_ENTRY *pMacEntry = pTxBlk->pMacEntry; - UCHAR stbc = 0, bw = BW_20, mcs = 0, nss = 1, sgi = 0, phy_mode = 0, - preamble = 1, ldpc = 0; - UCHAR wcid; - TMAC_TXD_S *txd_s = (TMAC_TXD_S *)buf; - TMAC_TXD_L *txd_l = (TMAC_TXD_L *)buf; - TMAC_TXD_0 *txd_0 = &txd_s->TxD0; - TMAC_TXD_1 *txd_1 = &txd_s->TxD1; - UINT32 *txd_7 = &txd_s->TxD7; - STA_TR_ENTRY *tr_entry = NULL; - TMAC_TXD_2 *txd_2 = &txd_l->TxD2; - TMAC_TXD_3 *txd_3 = &txd_l->TxD3; - TMAC_TXD_5 *txd_5 = &txd_l->TxD5; - TMAC_TXD_6 *txd_6 = &txd_l->TxD6; - HTTRANSMIT_SETTING *pTransmit = pTxBlk->pTransmit; - struct wifi_dev *wdev = NULL; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - UCHAR cloned_wcid; - static UCHAR ucPid; -#endif /* defined(VOW_SUPPORT) && defined(VOW_DVT) */ - - wcid = pTxBlk->Wcid; - wdev = pTxBlk->wdev; - -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - if (pAd->CommonCfg.dbdc_mode) - cloned_wcid = 2; - else - cloned_wcid = 1; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: wcid %d, pTxBlk->Wcid %d\n", __func__, wcid, - pTxBlk->Wcid)); - - if ((pTxBlk->Wcid > cloned_wcid) && - (pTxBlk->Wcid <= pAd->vow_cloned_wtbl_max)) - wcid = pTxBlk->Wcid; -#endif /* defined(VOW_SUPPORT) && defined(VOW_DVT) */ - - NdisZeroMemory(txd_l, sizeof(TMAC_TXD_L)); - - txd_0 = &txd_s->TxD0; - txd_1 = &txd_s->TxD1; - - /* DWORD 0 */ - txd_0->p_idx = P_IDX_LMAC; -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - if ((pTxBlk->Wcid > 0) && - (pTxBlk->Wcid <= (MAX_LEN_OF_MAC_TABLE - HW_BEACON_MAX_NUM)) && - (((pAd->vow_cloned_wtbl_max != 0) && - (pTxBlk->Wcid <= pAd->vow_cloned_wtbl_max)) || - (pAd->vow_cloned_wtbl_max == 0))) { - pTxBlk->wmm_set = pAd->vow_sta_wmm[wcid]; - pTxBlk->QueIdx = pAd->vow_sta_ac[wcid]; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: wmm set %d, QueIdx %d\n", __func__, - pTxBlk->wmm_set, pTxBlk->QueIdx)); - } - -#endif /* defined(VOW_SUPPORT) && defined(VOW_DVT) */ - - if (pTxBlk->QueIdx < 4) { - txd_0->q_idx = dmac_wmm_swq_2_hw_ac_que[pTxBlk->wmm_set] - [pTxBlk->QueIdx]; - } else { - /* TODO: shiang-usw, consider about MCC case! */ - txd_0->q_idx = pTxBlk->QueIdx; - } - -#ifdef RANDOM_PKT_GEN - random_write_qidx(pAd, buf, pTxBlk); -#endif - -#if (defined(VOW_SUPPORT) && defined(VOW_DVT)) - if ((pTxBlk->Wcid > 0) && - (pTxBlk->Wcid <= (MAX_LEN_OF_MAC_TABLE - HW_BEACON_MAX_NUM)) && - (((pAd->vow_cloned_wtbl_max != 0) && - (pTxBlk->Wcid <= pAd->vow_cloned_wtbl_max)) || - (pAd->vow_cloned_wtbl_max == 0))) { - txd_0->q_idx = dmac_wmm_swq_2_hw_ac_que[pTxBlk->wmm_set] - [pTxBlk->QueIdx]; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[31m%s: q_idx %d, resource_idx %d\x1b[m\n", __func__, - txd_0->q_idx, pTxBlk->resource_idx)); - - if (pTxBlk->wmm_set == 0) { /* the same band */ - if (pAd->vow_bcmc_en == 1) - txd_0->q_idx = TxQ_IDX_BMC0; - else if (pAd->vow_bcmc_en == 2) - txd_0->q_idx = TxQ_IDX_BMC1; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d): TxBlk->wmm_set= %d, QID = %d\n", __func__, __LINE__, - pTxBlk->wmm_set, txd_0->q_idx)); -#endif /* defined(VOW_SUPPORT) && defined(VOW_DVT) */ - - txd_0->TxByteCount = pTxBlk->tx_bytes_len; - - txd_1->wlan_idx = wcid; - - if (txd_1->wlan_idx >= cap->WtblHwNum) { - pAd->wrong_wlan_idx_num++; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: 2 wrong wlan index = %d (%d)\n", __func__, - txd_1->wlan_idx, HcGetMaxStaNum(pAd))); - dump_stack(); - } - - if (pTxBlk->TxFrameType & TX_AMSDU_FRAME) - txd_1->amsdu = 1; - - txd_1->pkt_ft = TMI_PKT_FT_HIF_CT; - - if (!TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) { - txd_1->hdr_format = TMI_HDR_FT_NOR_80211; - TMI_HDR_INFO_VAL(txd_1->hdr_format, 0, 0, 0, 0, 0, - pTxBlk->wifi_hdr_len, 0, txd_1->hdr_info); - - if (pTxBlk->HdrPadLen) /* TODO: depends on QoS to decide if need to padding */ - txd_1->hdr_pad = (TMI_HDR_PAD_MODE_TAIL - << TMI_HDR_PAD_BIT_MODE) | - 0x1; - - } else { - BOOLEAN is_vlan = RTMP_GET_PACKET_VLAN(pTxBlk->pPacket); - BOOLEAN is_etype = - ((RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket) <= 1500) ? - 0 : - 1); - BOOLEAN is_rmvl = 1; - -#if defined(APCLI_AS_WDS_STA_SUPPORT) || defined(MBSS_AS_WDS_AP_SUPPORT) - if (is_vlan) - is_rmvl = 0; -#endif - - txd_1->hdr_format = TMI_HDR_FT_NON_80211; - TMI_HDR_INFO_VAL(txd_1->hdr_format, - TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData), - TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP), - is_rmvl, is_vlan, is_etype, - pTxBlk->wifi_hdr_len, 0, txd_1->hdr_info); - - if (pTxBlk->HdrPadLen) - txd_1->hdr_pad = (TMI_HDR_PAD_MODE_HEAD - << TMI_HDR_PAD_BIT_MODE) | - 0x1; - } - - txd_1->tid = pTxBlk->UserPriority; - -#ifdef CONFIG_CSO_SUPPORT - if (IS_ASIC_CAP(pAd, fASIC_CAP_CSO)) { - txd_0->UdpTcpChkSumOffload = 1; - txd_0->IpChkSumOffload = 1; - - if (txd_0->IpChkSumOffload || txd_0->UdpTcpChkSumOffload) { - if (txd_1->hdr_format == TMI_HDR_FT_NOR_80211) - txd_0->EthTypeOffset = - (pTxBlk->MpduHeaderLen + 2) >> 1; - else if (txd_1->hdr_format == TMI_HDR_FT_NON_80211) - txd_0->EthTypeOffset = - (LENGTH_802_3 + 2) >> - 1; /* 8 is (14+2)/2, it is 7615 setting just for 802.3 frame not for 802.11 */ - else - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: txd_1->hdr_format is unexpected\n", - __func__)); - } - } -#endif /* CONFIG_CSO_SUPPORT */ - - /* - repeater entry doesn't have real wdev could bind. - so reference the OmacIdx which is stored in tr_entry. - other types entry could reference the OmacIdx of wdev which is connected to the pEntry. - */ - if (pMacEntry && IS_ENTRY_REPEATER(pMacEntry)) { - if (pTxBlk->tr_entry) { - tr_entry = pTxBlk->tr_entry; - txd_1->OwnMacAddr = tr_entry->OmacIdx; - } - } else if (pMacEntry) { - txd_1->OwnMacAddr = wdev->OmacIdx; - -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - if (pAd->vow_sta_mbss[pTxBlk->Wcid]) { - if (wcid <= (MAX_LEN_OF_MAC_TABLE - HW_BEACON_MAX_NUM)) - txd_1->OwnMacAddr = - pAd->vow_sta_mbss[wcid] + 16; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[31m%s: wcid %d, OM %d\x1b[m\n", - __func__, pTxBlk->Wcid, txd_1->OwnMacAddr)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[31m%s: wcid %d, OM %d\x1b[m\n", __func__, - pTxBlk->Wcid, txd_1->OwnMacAddr)); -#endif /* defined(VOW_SUPPORT) && defined(VOW_DVT) */ - } else { - wdev = pTxBlk->wdev; - txd_1->OwnMacAddr = wdev->OmacIdx; - } - - txd_7 = &txd_l->TxD7; - txd_1->ft = TMI_FT_LONG; - - if (pTransmit) { - ldpc = pTransmit->field.ldpc; - phy_mode = pTransmit->field.MODE; - mcs = phy_mode == MODE_VHT ? pTransmit->field.MCS & 0xf : - pTransmit->field.MCS; - sgi = pTransmit->field.ShortGI; - stbc = pTransmit->field.STBC; - bw = (phy_mode <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); - nss = get_nsts_by_mcs( - phy_mode, mcs, stbc, - phy_mode == MODE_VHT ? - ((pTransmit->field.MCS & (0x3 << 4)) >> 4) + 1 : - 0); - } - - txd_l->TxD2.max_tx_time = 0; - -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - if (wcid <= (MAX_LEN_OF_MAC_TABLE - HW_BEACON_MAX_NUM)) - txd_l->TxD2.max_tx_time = pAd->vow_life_time; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: wcid %d, lifetime %d\n", __func__, wcid, - txd_l->TxD2.max_tx_time)); -#endif /* defined(VOW_SUPPORT) && defined(VOW_DVT) */ - - txd_l->TxD2.bc_mc_pkt = (pTxBlk->TxFrameType == TX_MCAST_FRAME ? 1 : 0); - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_ForceRate)) { - txd_l->TxD2.fix_rate = 1; - if (pAd->CommonCfg.bSeOff != TRUE) { - if (HcGetBandByWdev(pTxBlk->wdev) == BAND0) { - if (cap->txd_type == TXD_V1) { - *txd_7 &= ~SPE_IDX_MASK; - *txd_7 |= SPE_IDX(BAND0_SPE_IDX); - } else { - *txd_7 &= ~CON_SPE_IDX_MASK; - *txd_7 |= CON_SPE_IDX(BAND0_SPE_IDX); - } - } else if (HcGetBandByWdev(pTxBlk->wdev) == BAND1) { - if (cap->txd_type == TXD_V1) { - *txd_7 &= ~SPE_IDX_MASK; - *txd_7 |= SPE_IDX(BAND1_SPE_IDX); - } else { - *txd_7 &= ~CON_SPE_IDX_MASK; - *txd_7 |= CON_SPE_IDX(BAND1_SPE_IDX); - } - } - } - } - - txd_l->TxD2.frag = pTxBlk->FragIdx; - -#ifdef WIFI_EAP_FEATURE -#ifdef CONFIG_AP_SUPPORT - if (wdev->mgmt_txpwr_force_on == TRUE) { - if (txd_2->frm_type == FC_TYPE_MGMT) - txd_2->pwr_offset = wdev->txd_txpwr_offset; - } -#endif -#endif - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired)) { - txd_3->no_ack = 0; - txd_l->TxD3.remain_tx_cnt = MT_TX_LONG_RETRY; - } else { - txd_3->no_ack = 1; - txd_l->TxD3.remain_tx_cnt = MT_TX_RETRY_UNLIMIT; - } - -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - if (wcid <= (MAX_LEN_OF_MAC_TABLE - HW_BEACON_MAX_NUM)) - txd_3->no_ack = (pAd->vow_sta_ack[wcid] ? 1 : 0); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: wcid %d, no ack %d\n", __func__, wcid, txd_3->no_ack)); -#endif /* defined(VOW_SUPPORT) && defined(VOW_DVT) */ - - if (cap->TmrEnable == 1) { - if (txd_3->no_ack == 0) - txd_l->TxD2.timing_measure = 1; - } - - if (IS_CIPHER_NONE(pTxBlk->CipherAlg)) - txd_3->protect_frm = 0; - else - txd_3->protect_frm = 1; - - txd_l->TxD5.pid = pTxBlk->Pid; - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) { - if (!TX_BLK_TEST_FLAG(pTxBlk, fTX_MCAST_CLONE)) - txd_5->da_select = TMI_DAS_FROM_MPDU; - else - txd_5->da_select = TMI_DAS_FROM_WTBL; - -#if (defined(VOW_SUPPORT) && defined(VOW_DVT)) - if (wcid <= (MAX_LEN_OF_MAC_TABLE - HW_BEACON_MAX_NUM)) - txd_5->da_select = TMI_DAS_FROM_WTBL; -#endif /* (defined(VOW_SUPPORT) && defined(VOW_DVT)) */ - } - - if (0 /* bar_sn_ctrl */) - txd_3->sn_vld = 1; - -#if defined(CONFIG_STA_SUPPORT) && defined(CONFIG_PM_BIT_HW_MODE) - txd_5->pwr_mgmt = TMI_PM_BIT_CFG_BY_HW; -#else - txd_5->pwr_mgmt = TMI_PM_BIT_CFG_BY_SW; -#endif - -#if (defined(VOW_SUPPORT) && defined(VOW_DVT)) - if (wcid <= (MAX_LEN_OF_MAC_TABLE - HW_BEACON_MAX_NUM)) { - txd_l->TxD5.tx_status_fmt = TXS_FORMAT0; - txd_l->TxD5.tx_status_2_mcu = 0; - if (pAd->vow_txs_en) - txd_l->TxD5.tx_status_2_host = 1; - txd_l->TxD5.pid = ucPid++ % 255; - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[32m%s: wcid %d, pid %d\x1b[m\n", __func__, wcid, - txd_l->TxD5.pid)); -#endif /* (defined(VOW_SUPPORT) && defined(VOW_DVT)) */ - - /* DWORD 6 */ - if (txd_2->fix_rate == 1) { - txd_6->fix_rate_mode = TMI_FIX_RATE_BY_TXD; - txd_6->bw = ((1 << 2) | bw); - txd_6->dyn_bw = 0; - txd_6->TxBF = 0; - txd_6->ldpc = ldpc; - txd_6->gi = sgi; - - if (txd_6->fix_rate_mode == TMI_FIX_RATE_BY_TXD) { - if (phy_mode == MODE_CCK) { - if (OPSTATUS_TEST_FLAG( - pAd, - fOP_STATUS_SHORT_PREAMBLE_INUSED)) - preamble = SHORT_PREAMBLE; - else - preamble = LONG_PREAMBLE; - } - - txd_6->tx_rate = tx_rate_to_tmi_rate(phy_mode, mcs, nss, - stbc, preamble); - } - } - - /* DWORD 7 */ -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - if (wcid <= (MAX_LEN_OF_MAC_TABLE - HW_BEACON_MAX_NUM)) { - if (cap->txd_type == TXD_V1) { - *txd_7 &= ~SW_TX_TIME_MASK; - *txd_7 |= SW_TX_TIME(0); - } else { - *txd_7 &= ~CON_SW_TX_TIME_MASK; - *txd_7 |= CON_SW_TX_TIME(0); - } - } -#endif /* defined(VOW_SUPPORT) && defined(VOW_DVT)*/ - - if (cap->txd_type == TXD_V2) { - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_HW_AMSDU)) { - *txd_7 &= ~CON_HW_AMSDU_CAP_MASK; - *txd_7 |= CON_HW_AMSDU_CAP(1); - } - } - - /* dump_tmac_info(pAd, buf); */ - -#ifdef RED_SUPPORT_BY_HOST - if (!pAd->red_have_cr4) { - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_ForceRate)) - RedRecordForceRateFromDriver(pAd, pTxBlk->Wcid); - } -#endif -} - -VOID write_tmac_info_Cache(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk) -{ - pAd->archOps.write_tmac_info(pAd, buf, pTxBlk); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not Finish yet for HT_MT!!!!\n", __func__, - __LINE__)); - return; -} - -#ifdef RANDOM_PKT_GEN -VOID random_write_qidx(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk) -{ - TMAC_TXD_L *txd_l = (TMAC_TXD_L *)buf; - TMAC_TXD_0 *txd_0 = &txd_l->TxD0; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (RandomTxCtrl != 0 && txd_0->q_idx < (cap->WmmHwNum * 4)) - txd_0->q_idx = pTxBlk->lmac_qidx; -} -#endif - -INT32 mtd_write_txp_info_by_host(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *tx_blk) -{ - MAC_TX_PKT_T *txp = (MAC_TX_PKT_T *)buf; - TXD_PTR_LEN_T *txp_ptr_len; - PKT_TOKEN_CB *pktTokenCb = (PKT_TOKEN_CB *)pAd->PktTokenCb; - UINT16 token; - -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - /* check queue status */ - if (vow_is_queue_full(pAd, tx_blk->Wcid, tx_blk->QueIdx)) { - pAd->vow_need_drop_cnt[tx_blk->Wcid]++; - return NDIS_STATUS_SUCCESS; - } -#endif /* #if defined(VOW_SUPPORT) && defined(VOW_DVT) */ - - if ((tx_blk->amsdu_state == TX_AMSDU_ID_NO) || - (tx_blk->amsdu_state == TX_AMSDU_ID_FIRST)) - NdisZeroMemory(txp, sizeof(MAC_TX_PKT_T)); - - txp_ptr_len = &txp->arPtrLen[tx_blk->frame_idx / 2]; - - if ((tx_blk->frame_idx & 0x1) == 0x0) { - txp_ptr_len->u4Ptr0 = cpu2le32(PCI_MAP_SINGLE( - pAd, tx_blk, 0, 1, RTMP_PCI_DMA_TODEVICE)); - - if (RTMP_GET_PACKET_MGMT_PKT(tx_blk->pPacket)) { - token = cut_through_tx_enq( - pktTokenCb, tx_blk->pPacket, TOKEN_TX_MGT, - tx_blk->Wcid, txp_ptr_len->u4Ptr0, - GET_OS_PKT_LEN(tx_blk->pPacket)); - } else { - token = cut_through_tx_enq( - pktTokenCb, tx_blk->pPacket, TOKEN_TX_DATA, - tx_blk->Wcid, txp_ptr_len->u4Ptr0, - GET_OS_PKT_LEN(tx_blk->pPacket)); - } - - txp_ptr_len->u2Len0 = (tx_blk->SrcBufLen | TXD_LEN_ML); - - if ((tx_blk->amsdu_state == TX_AMSDU_ID_NO) || - (tx_blk->amsdu_state == TX_AMSDU_ID_LAST)) - txp_ptr_len->u2Len0 |= TXD_LEN_AL; - - txp_ptr_len->u2Len0 = cpu2le16(txp_ptr_len->u2Len0); - } else { - txp_ptr_len->u4Ptr1 = cpu2le32(PCI_MAP_SINGLE( - pAd, tx_blk, 0, 1, RTMP_PCI_DMA_TODEVICE)); - - if (RTMP_GET_PACKET_MGMT_PKT(tx_blk->pPacket)) { - token = cut_through_tx_enq( - pktTokenCb, tx_blk->pPacket, TOKEN_TX_MGT, - tx_blk->Wcid, txp_ptr_len->u4Ptr1, - GET_OS_PKT_LEN(tx_blk->pPacket)); - } else { - token = cut_through_tx_enq( - pktTokenCb, tx_blk->pPacket, TOKEN_TX_DATA, - tx_blk->Wcid, txp_ptr_len->u4Ptr1, - GET_OS_PKT_LEN(tx_blk->pPacket)); - } - - txp_ptr_len->u2Len1 = (tx_blk->SrcBufLen | TXD_LEN_ML); - - if (tx_blk->amsdu_state == TX_AMSDU_ID_LAST) - txp_ptr_len->u2Len1 |= TXD_LEN_AL; - - txp_ptr_len->u2Len1 = cpu2le16(txp_ptr_len->u2Len1); - } -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - if (tx_blk->Wcid != 0) { - pAd->vow_queue_map[token][0] = tx_blk->Wcid; - pAd->vow_queue_map[token][1] = tx_blk->QueIdx; - pAd->vow_queue_len[tx_blk->Wcid][tx_blk->QueIdx]++; - /*printk("\x1b[31m%s: enqueue wcid %d, qidx %d, queue len %d....\x1b[m\n", - __FUNCTION__, tx_blk->Wcid, tx_blk->QueIdx, pAd->vow_queue_len[tx_blk->Wcid][tx_blk->QueIdx]);*/ - } -#endif /* #if defined(VOW_SUPPORT) && defined(VOW_DVT) */ - txp->au2MsduId[tx_blk->frame_idx] = cpu2le16(token | TXD_MSDU_ID_VLD); - tx_blk->txp_len = sizeof(MAC_TX_PKT_T); - return NDIS_STATUS_SUCCESS; -} - -INT32 mtd_write_txp_info_by_host_v2(RTMP_ADAPTER *pAd, UCHAR *buf, - TX_BLK *tx_blk) -{ - MAC_TX_PKT_T *txp = (MAC_TX_PKT_T *)buf; - TXD_PTR_LEN_T *txp_ptr_len; - PKT_TOKEN_CB *pktTokenCb = (PKT_TOKEN_CB *)pAd->PktTokenCb; - UINT16 token; - - if ((tx_blk->amsdu_state == TX_AMSDU_ID_NO) || - (tx_blk->amsdu_state == TX_AMSDU_ID_FIRST)) - NdisZeroMemory(txp, sizeof(MAC_TX_PKT_T)); - - txp_ptr_len = &txp->arPtrLen[tx_blk->frame_idx / 2]; - - if ((tx_blk->frame_idx & 0x1) == 0x0) { - txp_ptr_len->u4Ptr0 = PCI_MAP_SINGLE(pAd, tx_blk, 0, 1, - RTMP_PCI_DMA_TODEVICE); - txp_ptr_len->u4Ptr0 = cpu2le32(txp_ptr_len->u4Ptr0); - if (RTMP_GET_PACKET_MGMT_PKT(tx_blk->pPacket)) { - token = cut_through_tx_enq( - pktTokenCb, tx_blk->pPacket, TOKEN_TX_MGT, - tx_blk->Wcid, txp_ptr_len->u4Ptr0, - GET_OS_PKT_LEN(tx_blk->pPacket)); - } else { - token = cut_through_tx_enq( - pktTokenCb, tx_blk->pPacket, TOKEN_TX_DATA, - tx_blk->Wcid, txp_ptr_len->u4Ptr0, - GET_OS_PKT_LEN(tx_blk->pPacket)); - } - - txp_ptr_len->u2Len0 = - ((tx_blk->SrcBufLen & TXD_LEN_MASK_V2) | TXD_LEN_ML_V2); - - txp_ptr_len->u2Len0 = cpu2le16(txp_ptr_len->u2Len0); - } else { - txp_ptr_len->u4Ptr1 = PCI_MAP_SINGLE(pAd, tx_blk, 0, 1, - RTMP_PCI_DMA_TODEVICE); - txp_ptr_len->u4Ptr1 = cpu2le32(txp_ptr_len->u4Ptr1); - if (RTMP_GET_PACKET_MGMT_PKT(tx_blk->pPacket)) { - token = cut_through_tx_enq( - pktTokenCb, tx_blk->pPacket, TOKEN_TX_MGT, - tx_blk->Wcid, txp_ptr_len->u4Ptr1, - GET_OS_PKT_LEN(tx_blk->pPacket)); - } else { - token = cut_through_tx_enq( - pktTokenCb, tx_blk->pPacket, TOKEN_TX_DATA, - tx_blk->Wcid, txp_ptr_len->u4Ptr1, - GET_OS_PKT_LEN(tx_blk->pPacket)); - } - - txp_ptr_len->u2Len1 = - ((tx_blk->SrcBufLen & TXD_LEN_MASK_V2) | TXD_LEN_ML_V2); - - txp_ptr_len->u2Len1 = cpu2le16(txp_ptr_len->u2Len1); - } - - txp->au2MsduId[tx_blk->frame_idx] = cpu2le16(token | TXD_MSDU_ID_VLD); - tx_blk->txp_len = sizeof(MAC_TX_PKT_T); - return NDIS_STATUS_SUCCESS; -} - -INT32 mtd_write_txp_info_by_cr4(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk) -{ - CR4_TXP_MSDU_INFO *cr4_txp_msdu_info = (CR4_TXP_MSDU_INFO *)buf; - PKT_TOKEN_CB *pktTokenCb = (PKT_TOKEN_CB *)pAd->PktTokenCb; - UINT16 token; - struct wifi_dev *wdev = pTxBlk->wdev; - UCHAR BssInfoIdx = 0; - - NdisZeroMemory(cr4_txp_msdu_info, sizeof(CR4_TXP_MSDU_INFO)); -#ifdef CONFIG_HOTSPOT_R2 - - /* Inform CR4 to bypass ProxyARP check on this packet */ - if (RTMP_IS_PACKET_DIRECT_TX(pTxBlk->pPacket)) - cr4_txp_msdu_info->type_and_flags |= CT_INFO_HSR2_TX; - -#endif /* HOTSPOT_SUPPORT_R2 */ - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_CT_WithTxD)) - cr4_txp_msdu_info->type_and_flags |= CT_INFO_APPLY_TXD; - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bClearEAPFrame)) - cr4_txp_msdu_info->type_and_flags |= CT_INFO_NONE_CIPHER_FRAME; - - cr4_txp_msdu_info->buf_ptr[0] = - PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, RTMP_PCI_DMA_TODEVICE); - - if (RTMP_GET_PACKET_MGMT_PKT(pTxBlk->pPacket)) { - cr4_txp_msdu_info->type_and_flags |= CT_INFO_MGN_FRAME; - token = cut_through_tx_enq(pktTokenCb, pTxBlk->pPacket, - TOKEN_TX_MGT, pTxBlk->Wcid, - cr4_txp_msdu_info->buf_ptr[0], - GET_OS_PKT_LEN(pTxBlk->pPacket)); - } else { - token = cut_through_tx_enq(pktTokenCb, pTxBlk->pPacket, - TOKEN_TX_DATA, pTxBlk->Wcid, - cr4_txp_msdu_info->buf_ptr[0], - GET_OS_PKT_LEN(pTxBlk->pPacket)); - } - -#ifdef MAC_REPEATER_SUPPORT - - if (pTxBlk->pMacEntry && IS_ENTRY_REPEATER(pTxBlk->pMacEntry)) - cr4_txp_msdu_info->rept_wds_wcid = pTxBlk->pMacEntry->wcid; - else - /*TODO: WDS case.*/ -#endif -#ifdef A4_CONN - if (pTxBlk->pMacEntry && IS_ENTRY_A4(pTxBlk->pMacEntry)) - cr4_txp_msdu_info->rept_wds_wcid = pTxBlk->pMacEntry->wcid; - else -#endif /* A4_CONN */ - { - cr4_txp_msdu_info->rept_wds_wcid = 0xff; - } - -#ifdef MBSS_AS_WDS_AP_SUPPORT - if (RTMP_GET_PACKET_WCID(pTxBlk->pPacket)) { - cr4_txp_msdu_info->rept_wds_wcid = - RTMP_GET_PACKET_WCID(pTxBlk->pPacket); - } -#endif - - BssInfoIdx = wdev->bss_info_argument.ucBssIndex; - - if (token == pktTokenCb->pkt_tkid_invalid) { - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); - return NDIS_STATUS_FAILURE; - } - - cr4_txp_msdu_info->msdu_token = token; - cr4_txp_msdu_info->bss_index = BssInfoIdx; - cr4_txp_msdu_info->buf_num = 1; /* os get scatter. */ - cr4_txp_msdu_info->buf_len[0] = pTxBlk->SrcBufLen; -#ifdef VLAN_SUPPORT - if ((pAd->CommonCfg.bEnableVlan) && - RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) != 0) { - UINT8 VlanPcp; - VlanPcp = RTMP_GET_VLAN_PCP(pTxBlk->pPacket); - - if ((VlanPcp >= 0) && (VlanPcp <= 7)) - cr4_txp_msdu_info->reserved = VlanPcp; - } -#endif /*VLAN_SUPPORT*/ - -#ifdef DSCP_PRI_SUPPORT - if ((pTxBlk->DscpMappedPri >= 0) && (pTxBlk->DscpMappedPri <= 7)) - cr4_txp_msdu_info->reserved = pTxBlk->DscpMappedPri; -#endif - pTxBlk->txp_len = sizeof(CR4_TXP_MSDU_INFO); - - if (cr4_txp_msdu_info->type_and_flags == 0) { - pTxBlk->dbdc_band = pTxBlk->resource_idx; - pTxBlk->DropPkt = FALSE; - WLAN_HOOK_CALL(WLAN_HOOK_TX, pAd, pTxBlk); - - if (pTxBlk->DropPkt == TRUE) { - UINT8 Type; - - cut_through_tx_deq(pktTokenCb, token, &Type); - RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, - NDIS_STATUS_SUCCESS); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s drop keep alive pkt\n", __func__)); - return NDIS_STATUS_FAILURE; - } - } -#ifdef RT_BIG_ENDIAN - cr4_txp_msdu_info->msdu_token = cpu2le16(cr4_txp_msdu_info->msdu_token); - cr4_txp_msdu_info->buf_ptr[0] = cpu2le32(cr4_txp_msdu_info->buf_ptr[0]); - cr4_txp_msdu_info->buf_len[0] = cpu2le16(cr4_txp_msdu_info->buf_len[0]); - cr4_txp_msdu_info->type_and_flags = - cpu2le16(cr4_txp_msdu_info->type_and_flags); -#endif - - return NDIS_STATUS_SUCCESS; -} - -INT dump_txp_info(RTMP_ADAPTER *pAd, CR4_TXP_MSDU_INFO *txp_info) -{ - INT cnt; - - hex_dump("CT_TxP_Info Raw Data: ", (UCHAR *)txp_info, - sizeof(CR4_TXP_MSDU_INFO)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("TXP_Fields:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\ttype_and_flags=0x%x\n", txp_info->type_and_flags)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tmsdu_token=%d\n", txp_info->msdu_token)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tbss_index=%d\n", txp_info->bss_index)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tbuf_num=%d\n", txp_info->buf_num)); - - for (cnt = 0; cnt < txp_info->buf_num; cnt++) { - if (cnt >= MAX_BUF_NUM_PER_PKT) - break; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tbuf_ptr=0x%x\n", txp_info->buf_ptr[cnt])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tbuf_len=%d(0x%x)\n", txp_info->buf_len[cnt], - txp_info->buf_len[cnt])); - } - - return 0; -} - -VOID mt_write_tmac_info_beacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *tmac_buf, - HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen) -{ - MAC_TX_INFO mac_info; - - NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info)); - mac_info.Type = FC_TYPE_MGMT; - mac_info.SubType = SUBTYPE_BEACON; - mac_info.FRAG = FALSE; - mac_info.CFACK = FALSE; - mac_info.InsTimestamp = TRUE; - mac_info.AMPDU = FALSE; - mac_info.BM = 1; - mac_info.Ack = FALSE; - mac_info.NSeq = TRUE; - mac_info.BASize = 0; - mac_info.WCID = 0; - mac_info.Length = frmLen; - mac_info.TID = 0; - mac_info.TxRate = 0; - mac_info.Txopmode = IFS_HTTXOP; - mac_info.hdr_len = 24; - mac_info.bss_idx = wdev->func_idx; - mac_info.SpeEn = 1; - mac_info.q_idx = HcGetBcnQueueIdx(pAd, wdev); - mac_info.TxSPriv = wdev->func_idx; - mac_info.OmacIdx = wdev->OmacIdx; - - if (wdev->bcn_buf.BcnUpdateMethod == BCN_GEN_BY_FW) - mac_info.IsOffloadPkt = TRUE; - else - mac_info.IsOffloadPkt = FALSE; - - mac_info.Preamble = LONG_PREAMBLE; - -#ifdef MGMT_TXPWR_CTRL - if (wdev->bPwrCtrlEn == TRUE) { - mac_info.IsAutoRate = TRUE; - mac_info.WCID = wdev->tr_tb_idx; - } else { - mac_info.IsAutoRate = FALSE; - } -#else - mac_info.IsAutoRate = FALSE; -#endif - - if (pAd->CommonCfg.bSeOff != TRUE) { - if (HcGetBandByWdev(wdev) == BAND0) - mac_info.AntPri = BAND0_SPE_IDX; - else if (HcGetBandByWdev(wdev) == BAND1) - mac_info.AntPri = BAND1_SPE_IDX; - } - NdisZeroMemory(tmac_buf, sizeof(TMAC_TXD_L)); - mtd_write_tmac_info_fixed_rate(pAd, tmac_buf, &mac_info, - BeaconTransmit); -#ifdef RT_BIG_ENDIAN - - if (IS_HIF_TYPE(pAd, HIF_MT)) - MTMacInfoEndianChange(pAd, tmac_buf, TYPE_TXWI, - sizeof(TMAC_TXD_L)); - -#endif -} - -INT rtmp_mac_set_band(RTMP_ADAPTER *pAd, int band) -{ - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); - return FALSE; -} - -INT mt_mac_set_ctrlch(RTMP_ADAPTER *pAd, UINT8 extch) -{ - /* TODO: shiang-7603 */ - return FALSE; -} - -#ifdef GREENAP_SUPPORT -INT rtmp_mac_set_mmps(RTMP_ADAPTER *pAd, INT ReduceCorePower) -{ - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); - return FALSE; -} -#endif /* GREENAP_SUPPORT */ - -#define BCN_TBTT_OFFSET 64 /*defer 64 us*/ -VOID ReSyncBeaconTime(RTMP_ADAPTER *pAd) -{ - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); -} - -#ifdef RTMP_MAC_PCI -static INT mt_asic_cfg_hif_tx_ring(RTMP_ADAPTER *pAd, RTMP_TX_RING *ring, - UINT32 offset, UINT32 phy_addr, UINT32 cnt) -{ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT16 tx_ring_size = GET_TX_RING_SIZE(cap); - - ring->TxSwFreeIdx = 0; - ring->TxCpuIdx = 0; - ring->hw_desc_base = MT_TX_RING_BASE + offset; - ring->hw_cnt_addr = ring->hw_desc_base + 0x04; - ring->hw_cidx_addr = ring->hw_desc_base + 0x08; - ring->hw_didx_addr = ring->hw_desc_base + 0x0c; - HIF_IO_WRITE32(pAd, ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, ring->hw_cidx_addr, ring->TxCpuIdx); - HIF_IO_WRITE32(pAd, ring->hw_cnt_addr, tx_ring_size); - return TRUE; -} - -VOID mt_asic_init_txrx_ring(RTMP_ADAPTER *pAd) -{ - UINT32 phy_addr, offset; - INT i, TxHwRingNum; - RTMP_CTRL_RING *ctrl_ring; - RTMP_FWDWLO_RING *FwDwlo_ring; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT16 tx_ring_size = GET_TX_RING_SIZE(cap); - UINT16 rx0_ring_size = GET_RX0_RING_SIZE(cap); - UINT16 rx1_ring_size = GET_RX1_RING_SIZE(cap); - struct _PCI_HIF_T *hif = hc_get_hif_ctrl(pAd->hdev_ctrl); - struct tr_delay_control *tr_delay_ctl = &pAd->tr_ctl.tr_delay_ctl; - UINT32 reg_value = 0; - - /* Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits */ - AsicSetWPDMA(pAd, PDMA_TX_RX, FALSE); - AsicWaitPDMAIdle(pAd, 100, 1000); - - if (IS_ASIC_CAP(pAd, fASIC_CAP_RX_DLY)) { - reg_value = RX_DLY_INT_CFG; - tr_delay_ctl->rx_delay_en = TRUE; - } - - HIF_IO_WRITE32(pAd, MT_DELAY_INT_CFG, reg_value); - - /* Reset DMA Index */ - HIF_IO_WRITE32(pAd, WPDMA_RST_PTR, 0xFFFFFFFF); - - TxHwRingNum = GET_NUM_OF_TX_RING(cap); - - for (i = 0; i < TxHwRingNum; i++) { - offset = i * 0x10; - phy_addr = RTMP_GetPhysicalAddressLow( - hif->TxRing[i].Cell[0].AllocPa); - mt_asic_cfg_hif_tx_ring(pAd, &hif->TxRing[i], offset, phy_addr, - tx_ring_size); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->TX_RING_%d[0x%x]: Base=0x%x, Cnt=%d!\n", i, - hif->TxRing[i].hw_desc_base, phy_addr, tx_ring_size)); - } - - /* init CTRL ring index pointer */ - ctrl_ring = &hif->CtrlRing; - phy_addr = RTMP_GetPhysicalAddressLow(ctrl_ring->Cell[0].AllocPa); - - if (IS_MT7615(pAd)) - offset = MT_RINGREG_DIFF * 2; - else if (IS_MT7622(pAd)) - offset = MT_RINGREG_DIFF * 15; - else if (IS_P18(pAd)) - offset = MT_RINGREG_DIFF * 15; - else if (IS_MT7663(pAd)) - offset = MT_RINGREG_DIFF * 15; - else - offset = MT_RINGREG_DIFF * 5; - - ctrl_ring->TxSwFreeIdx = 0; - ctrl_ring->TxCpuIdx = 0; - ctrl_ring->hw_desc_base = (MT_TX_RING_BASE + offset); - ctrl_ring->hw_cnt_addr = (ctrl_ring->hw_desc_base + 0x04); - ctrl_ring->hw_cidx_addr = (ctrl_ring->hw_desc_base + 0x08); - ctrl_ring->hw_didx_addr = (ctrl_ring->hw_desc_base + 0x0c); - HIF_IO_WRITE32(pAd, ctrl_ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, ctrl_ring->hw_cidx_addr, ctrl_ring->TxCpuIdx); - HIF_IO_WRITE32(pAd, ctrl_ring->hw_cnt_addr, MGMT_RING_SIZE); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->TX_RING_CTRL: Base=0x%x, Cnt=%d!\n", phy_addr, - MGMT_RING_SIZE)); - - /* init Firmware download ring index pointer */ - FwDwlo_ring = &hif->FwDwloRing; - phy_addr = RTMP_GetPhysicalAddressLow(FwDwlo_ring->Cell[0].AllocPa); - offset = MT_RINGREG_DIFF * 3; - FwDwlo_ring->TxSwFreeIdx = 0; - FwDwlo_ring->TxCpuIdx = 0; - FwDwlo_ring->hw_desc_base = (MT_TX_RING_BASE + offset); - FwDwlo_ring->hw_cnt_addr = (FwDwlo_ring->hw_desc_base + 0x04); - FwDwlo_ring->hw_cidx_addr = (FwDwlo_ring->hw_desc_base + 0x08); - FwDwlo_ring->hw_didx_addr = (FwDwlo_ring->hw_desc_base + 0x0c); - HIF_IO_WRITE32(pAd, FwDwlo_ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, FwDwlo_ring->hw_cidx_addr, FwDwlo_ring->TxCpuIdx); - HIF_IO_WRITE32(pAd, FwDwlo_ring->hw_cnt_addr, MGMT_RING_SIZE); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->TX_RING_FwDwlo: Base=0x%x, Cnt=%d!\n", phy_addr, - MGMT_RING_SIZE)); - - /* Init RX Ring0 Base/Size/Index pointer CSR */ - for (i = 0; i < GET_NUM_OF_RX_RING(cap); i++) { - UINT16 RxRingSize = (i == 0) ? rx0_ring_size : rx1_ring_size; - RTMP_RX_RING *rx_ring; - - rx_ring = &hif->RxRing[i]; - offset = i * 0x10; - phy_addr = RTMP_GetPhysicalAddressLow(rx_ring->Cell[0].AllocPa); - rx_ring->RxSwReadIdx = 0; - rx_ring->RxCpuIdx = RxRingSize - 1; - rx_ring->hw_desc_base = MT_RX_RING_BASE + offset; - rx_ring->hw_cidx_addr = MT_RX_RING_CIDX + offset; - rx_ring->hw_didx_addr = MT_RX_RING_DIDX + offset; - rx_ring->hw_cnt_addr = MT_RX_RING_CNT + offset; - HIF_IO_WRITE32(pAd, rx_ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, rx_ring->hw_cidx_addr, rx_ring->RxCpuIdx); - HIF_IO_WRITE32(pAd, rx_ring->hw_cnt_addr, RxRingSize); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->RX_RING%d[0x%x]: Base=0x%x, Cnt=%d\n", i, - rx_ring->hw_desc_base, phy_addr, RxRingSize)); - } -} -#endif /* RTMP_MAC_PCI */ - -INT mt_mac_pse_init(RTMP_ADAPTER *pAd) -{ - /* Don't Support this now! */ - return FALSE; -} - -#define HW_TX_RATE_TO_MODE(_x) (((_x) & (0x7 << 6)) >> 6) -#define HW_TX_RATE_TO_MCS(_x, _mode) ((_x) & (0x3f)) -#define HW_TX_RATE_TO_NSS(_x) (((_x) & (0x3 << 9)) >> 9) -#define HW_TX_RATE_TO_STBC(_x) (((_x) & (0x1 << 11)) >> 11) - -#define MAX_TX_MODE 5 -static char *HW_TX_MODE_STR[] = { - "CCK", "OFDM", "HT-Mix", "HT-GF", "VHT", "N/A" -}; -static char *HW_TX_RATE_CCK_STR[] = { "1M", "2M", "5.5M", "11M", "N/A" }; -static char *HW_TX_RATE_OFDM_STR[] = { "6M", "9M", "12M", "18M", "24M", - "36M", "48M", "54M", "N/A" }; - -static char *hw_rate_ofdm_str(UINT16 ofdm_idx) -{ - switch (ofdm_idx) { - case 11: /* 6M */ - return HW_TX_RATE_OFDM_STR[0]; - - case 15: /* 9M */ - return HW_TX_RATE_OFDM_STR[1]; - - case 10: /* 12M */ - return HW_TX_RATE_OFDM_STR[2]; - - case 14: /* 18M */ - return HW_TX_RATE_OFDM_STR[3]; - - case 9: /* 24M */ - return HW_TX_RATE_OFDM_STR[4]; - - case 13: /* 36M */ - return HW_TX_RATE_OFDM_STR[5]; - - case 8: /* 48M */ - return HW_TX_RATE_OFDM_STR[6]; - - case 12: /* 54M */ - return HW_TX_RATE_OFDM_STR[7]; - - default: - return HW_TX_RATE_OFDM_STR[8]; - } -} - -static char *hw_rate_str(UINT8 mode, UINT16 rate_idx) -{ - if (mode == 0) - return rate_idx < 4 ? HW_TX_RATE_CCK_STR[rate_idx] : - HW_TX_RATE_CCK_STR[4]; - else if (mode == 1) - return hw_rate_ofdm_str(rate_idx); - else - return "MCS"; -} - -VOID dump_wtbl_basic_info(RTMP_ADAPTER *pAd, struct wtbl_struc *tb) -{ - struct wtbl_basic_info *basic_info = &tb->peer_basic_info; - struct wtbl_tx_rx_cap *trx_cap = &tb->trx_cap; - struct wtbl_rate_tb *rate_info = &tb->auto_rate_tb; - UCHAR addr[MAC_ADDR_LEN]; - UINT16 txrate[8], rate_idx, txmode, mcs, nss, stbc; - - NdisMoveMemory(&addr[0], (UCHAR *)basic_info, 4); - addr[0] = basic_info->wtbl_d1.field.addr_0 & 0xff; - addr[1] = ((basic_info->wtbl_d1.field.addr_0 & 0xff00) >> 8); - addr[2] = ((basic_info->wtbl_d1.field.addr_0 & 0xff0000) >> 16); - addr[3] = ((basic_info->wtbl_d1.field.addr_0 & 0xff000000) >> 24); - addr[4] = basic_info->wtbl_d0.field.addr_4 & 0xff; - addr[5] = basic_info->wtbl_d0.field.addr_5 & 0xff; - hex_dump("WTBL Raw Data", (UCHAR *)tb, sizeof(struct wtbl_struc)); - /* Basic Info (DW0~DW1) */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Basic Info(DW0~DW1):\n")); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAddr: %02x:%02x:%02x:%02x:%02x:%02x(D0[B0~15], D1[B0~31])\n", - PRINT_MAC(addr))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMUAR_Idx(D0[B16~21]):%d\n", - basic_info->wtbl_d0.field.muar_idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\trc_a1/rc_a2:%d/%d(D0[B22]/D0[B29])\n", - basic_info->wtbl_d0.field.rc_a1, - basic_info->wtbl_d0.field.rc_a2)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tKID:%d/RCID:%d/RKV:%d/RV:%d/IKV:%d/WPI_FLAG:%d(D0[B23~24], D0[B25], D0[B26], D0[B28], D0[B30])\n", - basic_info->wtbl_d0.field.kid, basic_info->wtbl_d0.field.rc_id, - basic_info->wtbl_d0.field.rkv, basic_info->wtbl_d0.field.rv, - basic_info->wtbl_d0.field.ikv, - basic_info->wtbl_d0.field.wpi_flg)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tGID_SU:%d(D0[B31])\n", basic_info->wtbl_d0.field.gid_su)); - /* TRX Cap(DW2~5) */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TRX Cap(DW2~5):\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tsw/DIS_RHTR:%d/%d\n", trx_cap->wtbl_d2.field.SW, - trx_cap->wtbl_d2.field.dis_rhtr)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHT/VHT/HT-LDPC/VHT-LDPC/DYN_BW/MMSS:%d/%d/%d/%d/%d/%d\n", - trx_cap->wtbl_d2.field.ht, trx_cap->wtbl_d2.field.vht, - trx_cap->wtbl_d5.field.ldpc, trx_cap->wtbl_d5.field.ldpc_vht, - trx_cap->wtbl_d5.field.dyn_bw, trx_cap->wtbl_d5.field.mm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTx Power Offset:0x%x(%d)\n", - trx_cap->wtbl_d5.field.txpwr_offset, - ((trx_cap->wtbl_d5.field.txpwr_offset == 0x0) ? - 0 : - (trx_cap->wtbl_d5.field.txpwr_offset - 0x20)))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFCAP/G2/G4/G8/G16/CBRN:%d/%d/%d/%d/%d/%d\n", - trx_cap->wtbl_d5.field.fcap, trx_cap->wtbl_d5.field.g2, - trx_cap->wtbl_d5.field.g4, trx_cap->wtbl_d5.field.g8, - trx_cap->wtbl_d5.field.g16, trx_cap->wtbl_d5.field.cbrn)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHT-TxBF(tibf/tebf):%d/%d, VHT-TxBF(tibf/tebf):%d/%d, PFMU_IDX=%d\n", - trx_cap->wtbl_d2.field.tibf, trx_cap->wtbl_d2.field.tebf, - trx_cap->wtbl_d2.field.tibf_vht, - trx_cap->wtbl_d2.field.tebf_vht, - trx_cap->wtbl_d2.field.pfmu_idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSPE_IDX=%d\n", trx_cap->wtbl_d3.field.spe_idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBA Enable:0x%x, BAFail Enable:%d\n", - trx_cap->wtbl_d4.field.ba_en, trx_cap->wtbl_d3.field.baf_en)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tQoS Enable:%d\n", trx_cap->wtbl_d5.field.qos)); - - if (trx_cap->wtbl_d4.field.ba_en) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBA WinSize: TID 0 - %d, TID 1 - %d\n", - trx_cap->wtbl_d4.field.ba_win_size_tid_0, - trx_cap->wtbl_d4.field.ba_win_size_tid_1)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBA WinSize: TID 2 - %d, TID 3 - %d\n", - trx_cap->wtbl_d4.field.ba_win_size_tid_2, - trx_cap->wtbl_d4.field.ba_win_size_tid_3)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBA WinSize: TID 4 - %d, TID 5 - %d\n", - trx_cap->wtbl_d4.field.ba_win_size_tid_4, - trx_cap->wtbl_d4.field.ba_win_size_tid_5)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBA WinSize: TID 6 - %d, TID 7 - %d\n", - trx_cap->wtbl_d4.field.ba_win_size_tid_6, - trx_cap->wtbl_d4.field.ba_win_size_tid_7)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpartial_aid:%d\n", trx_cap->wtbl_d2.field.partial_aid)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twpi_even:%d\n", trx_cap->wtbl_d2.field.wpi_even)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAAD_OM/CipherSuit:%d/%d\n", trx_cap->wtbl_d2.field.AAD_OM, - trx_cap->wtbl_d2.field.cipher_suit)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\taf:%d\n", trx_cap->wtbl_d3.field.af)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\trdg_ba:%d/rdg capability:%d\n", - trx_cap->wtbl_d3.field.rdg_ba, trx_cap->wtbl_d3.field.r)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tcipher_suit:%d\n", trx_cap->wtbl_d2.field.cipher_suit)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFromDS:%d\n", trx_cap->wtbl_d5.field.fd)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tToDS:%d\n", trx_cap->wtbl_d5.field.td)); - /* Rate Info (DW6~8) */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Rate Info (DW6~8):\n")); - txrate[0] = (rate_info->wtbl_d6.word & 0xfff); - txrate[1] = (rate_info->wtbl_d6.word & (0xfff << 12)) >> 12; - txrate[2] = ((rate_info->wtbl_d6.word & (0xff << 24)) >> 24) | - ((rate_info->wtbl_d7.word & 0xf) << 8); - txrate[3] = ((rate_info->wtbl_d7.word & (0xfff << 4)) >> 4); - txrate[4] = ((rate_info->wtbl_d7.word & (0xfff << 16)) >> 16); - txrate[5] = ((rate_info->wtbl_d7.word & (0xf << 28)) >> 28) | - ((rate_info->wtbl_d8.word & (0xff)) << 4); - txrate[6] = ((rate_info->wtbl_d8.word & (0xfff << 8)) >> 8); - txrate[7] = ((rate_info->wtbl_d8.word & (0xfff << 20)) >> 20); - - for (rate_idx = 0; rate_idx < 8; rate_idx++) { - txmode = HW_TX_RATE_TO_MODE(txrate[rate_idx]); - mcs = HW_TX_RATE_TO_MCS(txrate[rate_idx], txmode); - nss = HW_TX_RATE_TO_NSS(txrate[rate_idx]); - stbc = HW_TX_RATE_TO_STBC(txrate[rate_idx]); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRate%d(0x%x):TxMode=%d(%s), TxRate=%d(%s), Nsts=%d, STBC=%d\n", - rate_idx + 1, txrate[rate_idx], txmode, - (txmode < MAX_TX_MODE ? HW_TX_MODE_STR[txmode] : - HW_TX_MODE_STR[MAX_TX_MODE]), - mcs, hw_rate_str(txmode, mcs), nss, stbc)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpsm:%d\n", trx_cap->wtbl_d3.field.psm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tskip_tx:%d\n", trx_cap->wtbl_d3.field.skip_tx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tdu_i_psm:%d\n", trx_cap->wtbl_d3.field.du_i_psm)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\ti_psm:%d\n", trx_cap->wtbl_d3.field.i_psm)); -} - -VOID dump_wtbl_base_info(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tWTBL Basic Info:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tMemBaseAddr:0x%x\n", pAd->mac_ctrl.wtbl_base_addr[0])); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tEntrySize/Cnt:%d/%d\n", pAd->mac_ctrl.wtbl_entry_size[0], - pAd->mac_ctrl.wtbl_entry_cnt[0])); -} - -VOID dump_wtbl_info(RTMP_ADAPTER *pAd, UINT wtbl_idx) -{ - INT idx, start_idx, end_idx, wtbl_len; - UINT32 wtbl_offset, addr; - UCHAR *wtbl_raw_dw = NULL; - struct wtbl_entry wtbl_ent; - struct wtbl_struc *wtbl = &wtbl_ent.wtbl; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR wtbl_num = cap->WtblHwNum; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dump WTBL info of WLAN_IDX:%d\n", wtbl_idx)); - - if (wtbl_idx == RESERVED_WCID) { - start_idx = 0; - end_idx = (wtbl_num - 1); - } else if (wtbl_idx < wtbl_num) - start_idx = end_idx = wtbl_idx; - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid WTBL index(%d)!\n", __func__, - wtbl_idx)); - return; - } - - wtbl_len = sizeof(WTBL_STRUC); - os_alloc_mem(pAd, (UCHAR **)&wtbl_raw_dw, wtbl_len); - - if (!wtbl_raw_dw) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():AllocMem fail(%d)!\n", __func__, wtbl_idx)); - return; - } - - for (idx = start_idx; idx <= end_idx; idx++) { - wtbl_ent.wtbl_idx = idx; - wtbl_ent.wtbl_addr = pAd->mac_ctrl.wtbl_base_addr[0] + - idx * pAd->mac_ctrl.wtbl_entry_size[0]; - - /* Read WTBL Entries */ - for (wtbl_offset = 0; wtbl_offset < wtbl_len; - wtbl_offset += 4) { - addr = wtbl_ent.wtbl_addr + wtbl_offset; - HW_IO_READ32(pAd, addr, - (UINT32 *)(&wtbl_raw_dw[wtbl_offset])); - } - - NdisCopyMemory((UCHAR *)wtbl, &wtbl_raw_dw[0], - sizeof(struct wtbl_struc)); - dump_wtbl_entry(pAd, &wtbl_ent); - } - - os_free_mem(wtbl_raw_dw); -} - -VOID dump_wtbl_entry(RTMP_ADAPTER *pAd, struct wtbl_entry *ent) -{ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dump WTBL SW Entry[%d] info\n", ent->wtbl_idx)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tWTBL info:\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tAddr=0x%x\n", ent->wtbl_addr)); - dump_wtbl_basic_info(pAd, &ent->wtbl); -} - -INT mt_wtbl_get_entry234(RTMP_ADAPTER *pAd, UCHAR widx, struct wtbl_entry *ent) -{ - struct rtmp_mac_ctrl *wtbl_ctrl; - UINT8 wtbl_idx; - - wtbl_ctrl = &pAd->mac_ctrl; - - if (wtbl_ctrl->wtbl_entry_cnt[0] > 0) - wtbl_idx = (widx < wtbl_ctrl->wtbl_entry_cnt[0] ? - widx : - wtbl_ctrl->wtbl_entry_cnt[0] - 1); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():pAd->mac_ctrl not init yet!\n", __func__)); - return FALSE; - } - - ent->wtbl_idx = wtbl_idx; - ent->wtbl_addr = wtbl_ctrl->wtbl_base_addr[0] + - wtbl_idx * wtbl_ctrl->wtbl_entry_size[0]; - return TRUE; -} - -INT mt_wtbl_init_ByFw(struct _RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - pAd->mac_ctrl.wtbl_base_addr[0] = (UINT32)WTBL_BASE_ADDR; - pAd->mac_ctrl.wtbl_entry_size[0] = (UINT16)WTBL_PER_ENTRY_SIZE; - pAd->mac_ctrl.wtbl_entry_cnt[0] = (UINT8)cap->WtblHwNum; - return TRUE; -} - -INT mt_wtbl_init_ByDriver(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - pAd->mac_ctrl.wtbl_base_addr[0] = (UINT32)WTBL_BASE_ADDR; - pAd->mac_ctrl.wtbl_entry_size[0] = (UINT16)WTBL_PER_ENTRY_SIZE; - pAd->mac_ctrl.wtbl_entry_cnt[0] = (UINT8)cap->WtblHwNum; - return TRUE; -} - -INT mt_wtbl_init(RTMP_ADAPTER *pAd) -{ -#ifdef CONFIG_WTBL_TLV_MODE - /* We can use mt_wtbl_init_ByWtblTlv() to replace mt_wtbl_init_ByDriver() when there are no */ - /* function using mt_wtbl_get_entry234 and pAd->mac_ctrl */ - mt_wtbl_init_ByFw(pAd); -#else - mt_wtbl_init_ByDriver(pAd); -#endif /* CONFIG_WTBL_TLV_MODE */ - return TRUE; -} -#define MCAST_WCID_TO_REMOVE 0 -INT mt_hw_tb_init(RTMP_ADAPTER *pAd, BOOLEAN bHardReset) -{ - /* TODO: shiang-7603 */ - mt_wtbl_init(pAd); - return TRUE; -} - -/* - ASIC register initialization sets -*/ -INT mt_mac_init(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s()-->\n", __func__)); - mt_mac_pse_init(pAd); - MtAsicInitMac(pAd); - - /* re-set specific MAC registers for individual chip */ - /* TODO: Shiang-usw-win, here we need call "mt7603_init_mac_cr" for windows! */ - if (ops->AsicMacInit != NULL) - ops->AsicMacInit(pAd); - - /* auto-fall back settings */ - MtAsicAutoFallbackInit(pAd); - MtAsicSetMacMaxLen(pAd); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<--%s()\n", __func__)); - return TRUE; -} - -VOID mt_chip_info_show(RTMP_ADAPTER *pAd) -{ -#if defined(MT7615_FPGA) || defined(MT7622_FPGA) || defined(P18_FPGA) || \ - defined(MT7663_FPGA) - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - UINT32 ver, date_code, rev; - UINT32 mac_val; - - RTMP_IO_READ32(pAd, 0x2700, &ver); - RTMP_IO_READ32(pAd, 0x2704, &rev); - RTMP_IO_READ32(pAd, 0x2708, &date_code); - RTMP_IO_READ32(pAd, 0x201f8, &mac_val); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("##########################################\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): MT Series FPGA Version:\n", __func__, - __LINE__)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFGPA1: Code[0x700]:0x%08x, [0x704]:0x%08x, [0x708]:0x%08x\n", - ver, rev, date_code)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFPGA2: Version[0x201f8]:0x%08x\n", mac_val)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("##########################################\n")); - } - -#endif /* defined(MT7615_FPGA) || defined(MT7622_FPGA) || defined(P18_FPGA) || defined(MT7663_FPGA) */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MAC[Ver:Rev/ID=0x%08x : 0x%08x]\n", pAd->MACVersion, - pAd->ChipID)); -} - -INT mt_nic_asic_init(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - MT_DMASCH_CTRL_T DmaSchCtrl; - - if (AsicWaitPDMAIdle(pAd, 100, 1000) != TRUE) { - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - ret = NDIS_STATUS_FAILURE; - return ret; - } - } - -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) - DmaSchCtrl.bBeaconSpecificGroup = FALSE; -#else - - if (MTK_REV_GTE(pAd, MT7603, MT7603E1) && - MTK_REV_LT(pAd, MT7603, MT7603E2)) - DmaSchCtrl.bBeaconSpecificGroup = FALSE; - else - DmaSchCtrl.bBeaconSpecificGroup = TRUE; - -#endif - DmaSchCtrl.mode = DMA_SCH_LMAC; -#ifdef DMA_SCH_SUPPORT - MtAsicDMASchedulerInit(pAd, DmaSchCtrl); -#endif -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) { - pAd->CommonCfg.bPCIeBus = FALSE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():device act as PCI%s driver\n", __func__, - (pAd->CommonCfg.bPCIeBus ? "-E" : ""))); - } - -#endif /* RTMP_PCI_SUPPORT */ - /* TODO: shiang-7603, init MAC setting */ - /* TODO: shiang-7603, init beacon buffer */ - mt_mac_init(pAd); - mt_hw_tb_init(pAd, TRUE); -#ifdef HDR_TRANS_RX_SUPPORT -#ifdef VLAN_SUPPORT - AsicRxHeaderTransCtl(pAd, TRUE, FALSE, FALSE, FALSE, FALSE); -#else - AsicRxHeaderTransCtl(pAd, TRUE, FALSE, FALSE, TRUE, FALSE); -#endif /* VLAN_SUPPORT */ - AsicRxHeaderTaranBLCtl(pAd, 0, TRUE, ETH_TYPE_EAPOL); - AsicRxHeaderTaranBLCtl(pAd, 1, TRUE, ETH_TYPE_WAI); - AsicRxHeaderTaranBLCtl(pAd, 2, TRUE, ETH_TYPE_FASTROAMING); -#endif - - if (IS_ASIC_CAP(pAd, fASIC_CAP_MCU_OFFLOAD)) - MtAsicAutoBATrigger(pAd, TRUE, BA_TRIGGER_OFFLOAD_TIMEOUT); - - return ret; -} - -INT mtd_check_hw_resource(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR resource_idx) -{ - UINT free_num; - struct _PCI_HIF_T *hif = hc_get_hif_ctrl(pAd->hdev_ctrl); - RTMP_TX_RING *tx_ring = &hif->TxRing[resource_idx]; - PKT_TOKEN_CB *pktTokenCb; - - free_num = pci_get_tx_resource_free_num_nolock(pAd, resource_idx); - - if (free_num < tx_ring->tx_ring_low_water_mark) { - pci_inc_resource_full_cnt(pAd, resource_idx); - pci_set_resource_state(pAd, resource_idx, TX_RING_LOW); - return NDIS_STATUS_RESOURCES; - } - - pktTokenCb = (PKT_TOKEN_CB *)pAd->PktTokenCb; - free_num = pktTokenCb->tx_id_list.list->FreeTokenCnt; - - if (free_num < pktTokenCb->TxTokenLowWaterMark) { - cut_through_inc_token_full_cnt(pAd); - cut_through_set_token_state(pAd, TX_TOKEN_LOW); - return NDIS_STATUS_FAILURE; - } - - return NDIS_STATUS_SUCCESS; -} - -INT mtd_hw_tx(RTMP_ADAPTER *pAd, TX_BLK *tx_blk) -{ - RTMP_ARCH_OP *op = &pAd->archOps; - USHORT free_cnt = 1; - INT32 ret = NDIS_STATUS_SUCCESS; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (!TX_BLK_TEST_FLAG(tx_blk, fTX_MCU_OFFLOAD)) - tx_bytes_calculate(pAd, tx_blk); - - if (TX_BLK_TEST_FLAG(tx_blk, fTX_HDR_TRANS)) { - if ((tx_blk->amsdu_state == TX_AMSDU_ID_NO) || - (tx_blk->amsdu_state == TX_AMSDU_ID_LAST)) - op->write_tmac_info(pAd, &tx_blk->HeaderBuf[0], tx_blk); - - ret = op->write_txp_info( - pAd, &tx_blk->HeaderBuf[cap->tx_hw_hdr_len], tx_blk); - - if (ret != NDIS_STATUS_SUCCESS) - return ret; - -#if defined(VOW_SUPPORT) && defined(VOW_DVT) - /* if needr_to_drop_counter > 0 then skip to update PDMA descritpor */ - if (pAd->vow_need_drop_cnt[tx_blk->Wcid]) { - /*printk("\x1b[31m%s: skip write_tx_resource....\x1b[m\n", __FUNCTION__);*/ - return ret; - } -#endif /* #if defined(VOW_SUPPORT) && defined(VOW_DVT) */ - - if ((tx_blk->amsdu_state == TX_AMSDU_ID_NO) || - (tx_blk->amsdu_state == TX_AMSDU_ID_LAST)) - op->write_tx_resource(pAd, tx_blk, TRUE, &free_cnt); - } else { - INT dot11_meta_hdr_len, tx_hw_hdr_len; - PNDIS_PACKET pkt; - NDIS_STATUS status; - UCHAR *dot11_hdr; - TX_BLK new_tx_blk, *p_new_tx_blk = &new_tx_blk; - - NdisCopyMemory(p_new_tx_blk, tx_blk, sizeof(*tx_blk)); - dot11_meta_hdr_len = tx_blk->MpduHeaderLen + tx_blk->HdrPadLen; - tx_hw_hdr_len = cap->tx_hw_hdr_len; - dot11_hdr = &tx_blk->HeaderBuf[tx_hw_hdr_len]; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():DataFrm, MpduHdrL=%d,WFHdrL=%d,HdrPadL=%d,HwRsvL=%d, NeedCopyHdrLen=%d\n", - __func__, tx_blk->MpduHeaderLen, tx_blk->wifi_hdr_len, - tx_blk->HdrPadLen, tx_blk->hw_rsv_len, - dot11_meta_hdr_len)); - /* original packet only 802.3 payload, so create a new packet including 802.11 header for cut-through transfer */ - status = RTMPAllocateNdisPacket(pAd, &pkt, dot11_hdr, - dot11_meta_hdr_len, - tx_blk->pSrcBufData, - tx_blk->SrcBufLen); - - if (status != NDIS_STATUS_SUCCESS) - return NDIS_STATUS_FAILURE; - - if ((tx_blk->FragIdx == TX_FRAG_ID_NO) || - (tx_blk->FragIdx == TX_FRAG_ID_LAST)) - RELEASE_NDIS_PACKET(pAd, tx_blk->pPacket, - NDIS_STATUS_SUCCESS); - - p_new_tx_blk->HeaderBuf = - op->get_hif_buf(pAd, p_new_tx_blk, tx_blk->resource_idx, - tx_blk->TxFrameType); - p_new_tx_blk->pPacket = pkt; - p_new_tx_blk->pSrcBufData = GET_OS_PKT_DATAPTR(pkt); - p_new_tx_blk->SrcBufLen = GET_OS_PKT_LEN(pkt); - TX_BLK_SET_FLAG(p_new_tx_blk, fTX_CT_WithTxD); - - if ((tx_blk->amsdu_state == TX_AMSDU_ID_NO) || - (tx_blk->amsdu_state == TX_AMSDU_ID_LAST)) - op->write_tmac_info(pAd, &p_new_tx_blk->HeaderBuf[0], - p_new_tx_blk); - - /* because 802.11 header already in new packet, not in HeaderBuf, so set below parameters to 0 */ - p_new_tx_blk->MpduHeaderLen = 0; - p_new_tx_blk->wifi_hdr_len = 0; - p_new_tx_blk->HdrPadLen = 0; - p_new_tx_blk->hw_rsv_len = 0; - - tx_blk->resource_idx = p_new_tx_blk->resource_idx; - ret = op->write_txp_info( - pAd, &p_new_tx_blk->HeaderBuf[cap->tx_hw_hdr_len], - p_new_tx_blk); - - if (ret != NDIS_STATUS_SUCCESS) - return ret; - - if ((tx_blk->amsdu_state == TX_AMSDU_ID_NO) || - (tx_blk->amsdu_state == TX_AMSDU_ID_LAST)) - op->write_tx_resource(pAd, p_new_tx_blk, TRUE, - &free_cnt); - } - - return NDIS_STATUS_SUCCESS; -} - -INT mtd_mlme_hw_tx(RTMP_ADAPTER *pAd, UCHAR *tmac_info, MAC_TX_INFO *info, - HTTRANSMIT_SETTING *transmit, TX_BLK *tx_blk) -{ - RTMP_ARCH_OP *op = &pAd->archOps; - UINT16 free_cnt = 1; - INT32 ret = NDIS_STATUS_SUCCESS; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - op->write_tmac_info_fixed_rate(pAd, tmac_info, info, transmit); - - tx_blk->pSrcBufData = tx_blk->pSrcBufHeader; - NdisCopyMemory(&tx_blk->HeaderBuf[0], tx_blk->pSrcBufData, - cap->tx_hw_hdr_len); - tx_blk->pSrcBufData += cap->tx_hw_hdr_len; - tx_blk->SrcBufLen -= cap->tx_hw_hdr_len; - tx_blk->MpduHeaderLen = 0; - tx_blk->wifi_hdr_len = 0; - tx_blk->HdrPadLen = 0; - tx_blk->hw_rsv_len = 0; - - ret = op->write_txp_info(pAd, &tx_blk->HeaderBuf[cap->tx_hw_hdr_len], - tx_blk); - - if (ret != NDIS_STATUS_SUCCESS) - return ret; - - op->write_tx_resource(pAd, tx_blk, TRUE, &free_cnt); - return NDIS_STATUS_SUCCESS; -} - -#ifdef CONFIG_ATE -INT32 mtd_ate_hw_tx(RTMP_ADAPTER *pAd, TMAC_INFO *info, TX_BLK *tx_blk) -{ - RTMP_ARCH_OP *op = &pAd->archOps; - UINT16 free_cnt = 1; - INT32 ret = NDIS_STATUS_SUCCESS; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - MtWriteTMacInfo(pAd, tx_blk->pSrcBufHeader, info); - - tx_blk->pSrcBufData = tx_blk->pSrcBufHeader; - NdisCopyMemory(&tx_blk->HeaderBuf[0], tx_blk->pSrcBufData, - cap->tx_hw_hdr_len); - tx_blk->pSrcBufData += cap->tx_hw_hdr_len; - tx_blk->SrcBufLen -= cap->tx_hw_hdr_len; - tx_blk->MpduHeaderLen = 0; - tx_blk->wifi_hdr_len = 0; - tx_blk->HdrPadLen = 0; - tx_blk->hw_rsv_len = 0; - /* Indicate which Tx ring to be sent by band_idx */ -#ifdef MT7615 - if (IS_MT7615(pAd)) - tx_blk->resource_idx = info->band_idx; -#endif - ret = op->write_txp_info(pAd, &tx_blk->HeaderBuf[cap->tx_hw_hdr_len], - tx_blk); - - if (ret != NDIS_STATUS_SUCCESS) - return ret; - - op->write_tx_resource(pAd, tx_blk, TRUE, &free_cnt); - return NDIS_STATUS_SUCCESS; -} -#endif - -#ifdef MGMT_TXPWR_CTRL -#define WTBL_SPE_IDX_MASK ((0x1f) << 16) -#define WTBL_SPE_IDX(p) (((p)&0x1f) << 16) -INT wtbl_update_pwr_offset(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - INT wcid; - UINT32 addr, cr_value, offset_addr, PwrOffset_MASK; - - PwrOffset_MASK = 0x1f; - wcid = wdev->tr_tb_idx; - addr = pAd->mac_ctrl.wtbl_base_addr[0] + - wcid * pAd->mac_ctrl.wtbl_entry_size[0]; - - /* update tx power offset DW5*/ - offset_addr = addr + 4 * 5; - HW_IO_READ32(pAd, offset_addr, &cr_value); - cr_value &= ~PwrOffset_MASK; - cr_value |= (wdev->TxPwrDelta & PwrOffset_MASK); - HW_IO_WRITE32(pAd, offset_addr, cr_value); - - /* update RATE1~RATE8 for OFDM mode*/ - if (wdev->channel > 14) { - /* OFDM 6M rate*/ - cr_value = wdev->bPwrCtrlEn ? 0x4B04B04B : 0x00; - offset_addr = addr + 4 * 6; /* DW6 */ - HW_IO_WRITE32(pAd, offset_addr, cr_value); - cr_value = wdev->bPwrCtrlEn ? 0xB04B04B0 : 0x00; - offset_addr = addr + 4 * 7; /* DW7 */ - HW_IO_WRITE32(pAd, offset_addr, cr_value); - cr_value = wdev->bPwrCtrlEn ? 0x04B04B04 : 0x00; - offset_addr = addr + 4 * 8; /* DW8 */ - HW_IO_WRITE32(pAd, offset_addr, cr_value); - } - - /* update SPE idx */ - if (pAd->CommonCfg.bSeOff != TRUE) { - offset_addr = addr + 4 * 3; - HW_IO_READ32(pAd, offset_addr, &cr_value); - cr_value &= ~WTBL_SPE_IDX_MASK; - if (wdev->bPwrCtrlEn) { - if (HcGetBandByWdev(wdev) == BAND0) - cr_value |= WTBL_SPE_IDX(BAND0_SPE_IDX); - else if (HcGetBandByWdev(wdev) == BAND1) - cr_value |= WTBL_SPE_IDX(BAND1_SPE_IDX); - } - HW_IO_WRITE32(pAd, offset_addr, cr_value); - } - - return TRUE; -} -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mac/mt_mac.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mac/mt_mac.c deleted file mode 100644 index da8ac46fc6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mac/mt_mac.c +++ /dev/null @@ -1,2903 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Mt_mac.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#define SEC_CIPHER_NONE 1 -#define IS_CIPHER_NONE(_Cipher) (((_Cipher) & (1 << SEC_CIPHER_NONE)) > 0) -#endif - -const UCHAR wmm_aci_2_hw_ac_queue[18] = { - Q_IDX_AC1, /* ACI:0 AC_BE */ - Q_IDX_AC0, /* ACI:1 AC_BK */ - Q_IDX_AC2, /* ACI:2 AC_VI */ - Q_IDX_AC3, /* ACI:3 AC_VO */ - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -}; - -const UCHAR wmm_swq_2_hw_ac_queue[18] = { - Q_IDX_AC0, /* QID_AC_BK */ - Q_IDX_AC1, /* QID_AC_BE */ - Q_IDX_AC2, /* QID_AC_VI */ - Q_IDX_AC3, /* QID_AC_VO */ - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, -}; - -#if !defined(COMPOS_WIN) && !defined(COMPOS_TESTMODE_WIN) -VOID dump_rxinfo(RTMP_ADAPTER *pAd, RXINFO_STRUC *pRxInfo) -{ - hex_dump("RxInfo Raw Data", (UCHAR *)pRxInfo, sizeof(RXINFO_STRUC)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("RxInfo Fields:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBA=%d\n", pRxInfo->BA)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDATA=%d\n", pRxInfo->DATA)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tNULLDATA=%d\n", pRxInfo->NULLDATA)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFRAG=%d\n", pRxInfo->FRAG)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tU2M=%d\n", pRxInfo->U2M)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMcast=%d\n", pRxInfo->Mcast)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBcast=%d\n", pRxInfo->Bcast)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMyBss=%d\n", pRxInfo->MyBss)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCrc=%d\n", pRxInfo->Crc)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCipherErr=%d\n", pRxInfo->CipherErr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAMSDU=%d\n", pRxInfo->AMSDU)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tHTC=%d\n", pRxInfo->HTC)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRSSI=%d\n", pRxInfo->RSSI)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tL2PAD=%d\n", pRxInfo->L2PAD)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAMPDU=%d\n", pRxInfo->AMPDU)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDecrypted=%d\n", pRxInfo->Decrypted)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBssIdx3=%d\n", pRxInfo->BssIdx3)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twapi_kidx=%d\n", pRxInfo->wapi_kidx)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpn_len=%d\n", pRxInfo->pn_len)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tsw_fc_type0=%d\n", pRxInfo->sw_fc_type0)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tsw_fc_type1=%d\n", pRxInfo->sw_fc_type1)); -} -#endif /* COMPOS_WIN */ - -static char *hdr_fmt_str[] = { - "Non-80211-Frame", - "Command-Frame", - "Normal-80211-Frame", - "enhanced-80211-Frame", -}; - -static char *p_idx_str[] = { "LMAC", "MCU" }; -static char *q_idx_lmac_str[] = { "AC0", "AC1", "AC2", "AC3", "AC4", - "AC5", "AC6", "BCN", "BMC", "AC10", - "AC11", "AC12", "AC13", "AC14", "Invalid" }; -static char *q_idx_mcu_str[] = { "RQ0", "RQ1", "RQ2", "RQ3", "Invalid" }; -#ifndef COMPOS_WIN -VOID dump_tmac_info(RTMP_ADAPTER *pAd, UCHAR *tmac_info) -{ - TMAC_TXD_S *txd_s = (TMAC_TXD_S *)tmac_info; - TMAC_TXD_0 *txd_0 = (TMAC_TXD_0 *)tmac_info; - TMAC_TXD_1 *txd_1 = (TMAC_TXD_1 *)(tmac_info + sizeof(TMAC_TXD_0)); - UCHAR q_idx = 0, pIdx = (UCHAR)txd_0->PIdx; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - hex_dump("TMAC_Info Raw Data: ", (UCHAR *)tmac_info, cap->TXWISize); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TMAC_TXD Fields:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tTMAC_TXD_0:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPortID=%d(%s)\n", pIdx, - pIdx < 2 ? p_idx_str[pIdx] : "Invalid")); - - if (pIdx == P_IDX_LMAC) - q_idx = txd_0->QIdx % 0xf; - else - q_idx = txd_0->QIdx % 0x5; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tQueID=%d(%s %s)\n", txd_0->QIdx, - (pIdx == P_IDX_LMAC ? "LMAC" : "MCU"), - pIdx == P_IDX_LMAC ? q_idx_lmac_str[q_idx] : - q_idx_mcu_str[q_idx])); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxByteCnt=%d\n", txd_0->TxByteCount)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tTMAC_TXD_1:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tWlan_idx=%d\n", txd_1->WlanIdx)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrInfo=0x%x\n", txd_1->HdrInfo)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrFmt=%d(%s)\n", txd_1->HdrFmt, - txd_1->HdrFmt < 4 ? hdr_fmt_str[txd_1->HdrFmt] : "N/A")); - - switch (txd_1->HdrFmt) { - case TMI_HDR_FT_NON_80211: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\tMRD=%d, EOSP=%d, RMVL=%d, VLAN=%d, ETYP=%d\n", - txd_1->HdrInfo & (1 << TMI_HDR_INFO_0_BIT_MRD), - txd_1->HdrInfo & (1 << TMI_HDR_INFO_0_BIT_EOSP), - txd_1->HdrInfo & (1 << TMI_HDR_INFO_0_BIT_RMVL), - txd_1->HdrInfo & (1 << TMI_HDR_INFO_0_BIT_VLAN), - txd_1->HdrInfo & (1 << TMI_HDR_INFO_0_BIT_ETYP))); - break; - - case TMI_HDR_FT_CMD: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\tRsvd=0x%x\n", txd_1->HdrInfo)); - break; - - case TMI_HDR_FT_NOR_80211: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\tHeader Len=%d(WORD)\n", - txd_1->HdrInfo & TMI_HDR_INFO_2_MASK_LEN)); - break; - - case TMI_HDR_FT_ENH_80211: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t\tEOSP=%d, AMS=%d\n", - txd_1->HdrInfo & (1 << TMI_HDR_INFO_3_BIT_EOSP), - txd_1->HdrInfo & (1 << TMI_HDR_INFO_3_BIT_AMS))); - break; - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tFormatType=%d(%s format)\n", txd_1->TxDFmt, - txd_1->TxDFmt == TMI_FT_LONG ? "Long - 8 DWORD" : - "Short - 3 DWORD")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrPad=%d\n", txd_1->HdrPad)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNoAck=%d\n", txd_1->NoAck)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTID=%d\n", txd_1->Tid)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tProtect Frame=%d\n", txd_1->ProtectFrame)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\town_mac=%d\n", txd_1->OwnMacAddr)); - - if (txd_s->TxD1.TxDFmt == TMI_FT_LONG) { - TMAC_TXD_L *txd_l = (TMAC_TXD_L *)tmac_info; - TMAC_TXD_2 *txd_2 = &txd_l->TxD2; - TMAC_TXD_3 *txd_3 = &txd_l->TxD3; - TMAC_TXD_4 *txd_4 = &txd_l->TxD4; - TMAC_TXD_5 *txd_5 = &txd_l->TxD5; - TMAC_TXD_6 *txd_6 = &txd_l->TxD6; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_2:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tReamingLife/MaxTx time=%d\n", txd_2->MaxTxTime)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNDP=%d\n", txd_2->Ndp)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNDPA=%d\n", txd_2->Ndpa)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSounding=%d\n", txd_2->Sounding)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tbc_mc_pkt=%d\n", txd_2->BmcPkt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBIP=%d\n", txd_2->Bip)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tDuration=%d\n", txd_2->Duration)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHE(HTC Exist)=%d\n", txd_2->HtcExist)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tFRAG=%d\n", txd_2->Frag)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpwr_offset=%d\n", txd_2->PwrOffset)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tba_disable=%d\n", txd_2->BaDisable)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttiming_measure=%d\n", txd_2->TimingMeasure)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tfix_rate=%d\n", txd_2->FixRate)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttype(%d)\n", txd_2->FrmType)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tsubtype(%d)\n", txd_2->SubType)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_3:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_cnt=%d\n", txd_3->TxCnt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tremain_tx_cnt=%d\n", txd_3->RemainTxCnt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tsn=%d\n", txd_3->Sn)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpn_vld=%d\n", txd_3->PnVld)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tsn_vld=%d\n", txd_3->SnVld)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_4:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpn_low=0x%x\n", txd_4->PktNumLow)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_5:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpwr_mgmt=%d\n", txd_5->PwrMgmt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_status_2_host=%d\n", txd_5->TxS2Host)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_status_2_mcu=%d\n", txd_5->TxS2Mcu)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_status_fmt=%d\n", txd_5->TxSFmt)); - - if (txd_5->TxS2Host || txd_5->TxS2Mcu) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpid=%d\n", txd_5->PktId)); - - if (txd_2->FixRate) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tda_select=%d\n", txd_5->DataSrcSelect)); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tpn_high=0x%x\n", txd_5->PktNumHigh)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTMAC_TXD_6:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\ttx_rate=0x%x\n", txd_6->RateToBeFixed)); - - if (txd_2->FixRate) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tfix_rate_mode=%d\n", - txd_6->FixedRateMode)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tant_id=%d\n", txd_6->AntIdx)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tbw=%d\n", txd_6->FixedBwMode)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tspe_en=%d\n", txd_6->SpeExtEnable)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tant_pri=%d\n", txd_6->AntPri)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tdyn_bw=%d\n", txd_6->DynamicBw)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tETxBF=%d\n", txd_6->ExplicitBf)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tITxBF=%d\n", txd_6->ImplicitBf)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tldpc=%d(%s)\n", txd_6->LDPC, - txd_6->LDPC == 0 ? "BCC" : "LDPC")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tGI=%d(%s)\n", txd_6->GI, - txd_6->GI == 0 ? "LONG" : "SHORT")); - } - } -} -#endif /* COMPOS_WIN */ - -static char *rmac_info_type_str[] = { - "TXS", "RXV", "RxNormal", "DupRFB", "TMR", "Unknown", -}; - -static inline char *rxd_pkt_type_str(INT pkt_type) -{ - if (pkt_type <= 0x04) - return rmac_info_type_str[pkt_type]; - else - return rmac_info_type_str[5]; -} - -VOID dump_rmac_info_normal(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - RXD_BASE_STRUCT *rxd_base = (RXD_BASE_STRUCT *)rmac_info; - - hex_dump("RMAC_Info Raw Data: ", rmac_info, sizeof(RXD_BASE_STRUCT)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tRxData_BASE:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPktType=%d(%s)\n", rxd_base->RxD0.PktType, - rxd_pkt_type_str(rxd_base->RxD0.PktType))); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tGroupValid=%x\n", rxd_base->RxD0.RfbGroupVld)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tRxByteCnt=%d\n", rxd_base->RxD0.RxByteCnt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tIP/UT=%d/%d\n", rxd_base->RxD0.IpChkSumOffload, - rxd_base->RxD0.UdpTcpChkSumOffload)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tEtherTypeOffset=%d(WORD)\n", - rxd_base->RxD0.EthTypeOffset)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHTC/UC2ME/MC/BC=%d/%d/%d/%d\n", rxd_base->RxD1.HTC, - rxd_base->RxD1.UcastToMe, rxd_base->RxD1.Mcast, - rxd_base->RxD1.Bcast)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBeacon with BMCast/Ucast=%d/%d\n", - rxd_base->RxD1.BcnWithBMcst, rxd_base->RxD1.BcnWithUCast)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tKeyID=%d\n", rxd_base->RxD1.KeyId)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tChFrequency=%x\n", rxd_base->RxD1.ChFreq)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdearLength(MAC)=%d\n", rxd_base->RxD1.MacHdrLen)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrOffset(HO)=%d\n", rxd_base->RxD1.HdrOffset)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrTranslation(H)=%d\n", rxd_base->RxD1.HdrTranslation)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPayloadFormat(PF)=%d\n", rxd_base->RxD1.PayloadFmt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBSSID=%d\n", rxd_base->RxD1.RxDBssidIdx)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tWlanIndex=%d\n", rxd_base->RxD2.RxDWlanIdx)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTID=%d\n", rxd_base->RxD2.RxDTid)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSEC Mode=%d\n", rxd_base->RxD2.SecMode)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSW BIT=%d\n", rxd_base->RxD2.SwBit)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tFCE Error(FC)=%d\n", rxd_base->RxD2.FcsErr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tCipher Mismatch(CM)=%d\n", rxd_base->RxD2.CipherMis)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tCipher Length Mismatch(CLM)=%d\n", - rxd_base->RxD2.CipherLenMis)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tICV Err(I)=%d\n", rxd_base->RxD2.IcvErr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTKIP MIC Err(T)=%d\n", rxd_base->RxD2.TkipMicErr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tLength Mismatch(LM)=%d\n", rxd_base->RxD2.LenMis)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tDeAMSDU Fail(DAF)=%d\n", rxd_base->RxD2.DeAmsduFail)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tExceedMax Rx Length(EL)=%d\n", - rxd_base->RxD2.ExMaxRxLen)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tLLC-SNAP mismatch(LLC-MIS, for HdrTrans)=%d\n", - rxd_base->RxD2.LlcMis)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tUndefined VLAN tagged Type(UDF_VLT)=%d\n", - rxd_base->RxD2.UdfVlanType)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tFragment Frame(FRAG)=%d\n", rxd_base->RxD2.FragFrm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNull Frame(NULL)=%d\n", rxd_base->RxD2.NullFrm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNon Data Frame(NDATA)=%d\n", rxd_base->RxD2.NonDataFrm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNon-AMPDU Subframe(NASF)=%d\n", - rxd_base->RxD2.NonAmpduSfrm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNon AMPDU(NAMP)=%d\n", rxd_base->RxD2.NonAmpduFrm)); -} - -VOID dump_rmac_info_for_ICVERR(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - RXD_BASE_STRUCT *rxd_base = (RXD_BASE_STRUCT *)rmac_info; - union _RMAC_RXD_0_UNION *rxd_0; - UINT32 pkt_type; - - if (!IS_HIF_TYPE(pAd, HIF_MT)) - return; - - rxd_0 = (union _RMAC_RXD_0_UNION *)rmac_info; - pkt_type = RMAC_RX_PKT_TYPE(rxd_0->word); - - if (pkt_type != RMAC_RX_PKT_TYPE_RX_NORMAL) - return; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\tHTC/UC2ME/MC/BC=%d/%d/%d/%d", rxd_base->RxD1.HTC, - rxd_base->RxD1.UcastToMe, rxd_base->RxD1.Mcast, - rxd_base->RxD1.Bcast)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (", WlanIndex=%d", rxd_base->RxD2.RxDWlanIdx)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (", SEC Mode=%d\n", rxd_base->RxD2.SecMode)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\tFCE Error(FC)=%d", rxd_base->RxD2.FcsErr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (", CM=%d", rxd_base->RxD2.CipherMis)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (", CLM=%d", rxd_base->RxD2.CipherLenMis)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (", I=%d", rxd_base->RxD2.IcvErr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (", T=%d", rxd_base->RxD2.TkipMicErr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (", LM=%d\n", rxd_base->RxD2.LenMis)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\tFragment Frame(FRAG)=%d\n", rxd_base->RxD2.FragFrm)); -} - -VOID dump_rmac_info_txs(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - /* TXS_FRM_STRUC *txs_frm = (TXS_FRM_STRUC *)rmac_info; */ - RXD_BASE_STRUCT *rxd_base = (RXD_BASE_STRUCT *)rmac_info; - - hex_dump("RMAC_Info Raw Data: ", rmac_info, sizeof(RXD_BASE_STRUCT)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\tRxData_BASE:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPktType=%d(%s)\n", rxd_base->RxD0.PktType, - rxd_pkt_type_str(rxd_base->RxD0.PktType))); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tGroupValid=%x\n", rxd_base->RxD0.RfbGroupVld)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tRxByteCnt=%d\n", rxd_base->RxD0.RxByteCnt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tIP/UT=%d/%d\n", rxd_base->RxD0.IpChkSumOffload, - rxd_base->RxD0.UdpTcpChkSumOffload)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tEtherTypeOffset=%d(WORD)\n", - rxd_base->RxD0.EthTypeOffset)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHTC/UC2ME/MC/BC=%d/%d/%d/%d\n", rxd_base->RxD1.HTC, - rxd_base->RxD1.UcastToMe, rxd_base->RxD1.Mcast, - rxd_base->RxD1.Bcast)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBeacon with BMCast/Ucast=%d/%d\n", - rxd_base->RxD1.BcnWithBMcst, rxd_base->RxD1.BcnWithUCast)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tKeyID=%d\n", rxd_base->RxD1.KeyId)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tChFrequency=%x\n", rxd_base->RxD1.ChFreq)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdearLength(MAC)=%d\n", rxd_base->RxD1.MacHdrLen)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrOffset(HO)=%d\n", rxd_base->RxD1.HdrOffset)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tHdrTranslation(H)=%d\n", rxd_base->RxD1.HdrTranslation)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPayloadFormat(PF)=%d\n", rxd_base->RxD1.PayloadFmt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tBSSID=%d\n", rxd_base->RxD1.RxDBssidIdx)); -} - -VOID dump_rmac_info_rxv(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - /* RXV_FRM_STRUC *rxv_frm = (RXV_FRM_STRUC *)rmac_info; */ -} - -VOID dump_rmac_info_rfb(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - /* RXD_BASE_STRUCT *rfb_frm = (RXD_BASE_STRUCT *)rmac_info; */ -} - -VOID dump_rmac_info_tmr(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - /* TMR_FRM_STRUC *rxd_base = (TMR_FRM_STRUC *)rmac_info; */ -} - -VOID dump_rmac_info(RTMP_ADAPTER *pAd, UCHAR *rmac_info) -{ - union _RMAC_RXD_0_UNION *rxd_0 = (union _RMAC_RXD_0_UNION *)rmac_info; - INT pkt_type; - - rxd_0 = (union _RMAC_RXD_0_UNION *)rmac_info; - pkt_type = RMAC_RX_PKT_TYPE(rxd_0->word); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RMAC_RXD Header Format :%s\n", rxd_pkt_type_str(pkt_type))); - - switch (pkt_type) { - case RMAC_RX_PKT_TYPE_RX_TXS: - dump_rmac_info_txs(pAd, rmac_info); - break; - - case RMAC_RX_PKT_TYPE_RX_TXRXV: - dump_rmac_info_rxv(pAd, rmac_info); - break; - - case RMAC_RX_PKT_TYPE_RX_NORMAL: - dump_rmac_info_normal(pAd, rmac_info); - break; - - case RMAC_RX_PKT_TYPE_RX_DUP_RFB: - dump_rmac_info_rfb(pAd, rmac_info); - break; - - case RMAC_RX_PKT_TYPE_RX_TMR: - dump_rmac_info_tmr(pAd, rmac_info); - break; - - default: - break; - } -} - -VOID DumpTxSFormat(RTMP_ADAPTER *pAd, UINT8 Format, CHAR *Data) -{ - TXS_STRUC *txs_entry = (TXS_STRUC *)Data; - TXS_D_0 *txs_d0 = &txs_entry->TxSD0; - TXS_D_1 *txs_d1 = &txs_entry->TxSD1; - TXS_D_2 *txs_d2 = &txs_entry->TxSD2; - TXS_D_3 *txs_d3 = &txs_entry->TxSD3; - TXS_D_4 *txs_d4 = &txs_entry->TxSD4; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t(TXSFM=%d, TXS2M=%d, TXS2H=%d)\n", txs_d0->TxSFmt, - txs_d0->TxS2M, txs_d0->TxS2H)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tFR=%d, TxRate=0x%x\n", txs_d0->TxS_FR, txs_d0->TxRate)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tME=%d, RE=%d, LE=%d, BE=%d, TxOPLimitErr=%d\n", - txs_d0->ME, txs_d0->RE, txs_d0->LE, txs_d0->BE, - txs_d0->TxOp)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tPS=%d, BA Fail=%d, tid=%d, Ant_Id=%d\n", txs_d0->PSBit, - txs_d0->BAFail, txs_d0->Tid, txs_d0->AntId)); - - if (Format == TXS_FORMAT0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTimeStamp=0x%x, FrontTime=0x%x(unit 32us)\n", - txs_d1->TimeStamp, txs_d2->field_ft.FrontTime)); - } else if (Format == TXS_FORMAT1) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tNoise0=0x%x, Noise1=0x%x, Noise2=0x%x\n", - txs_d1->FieldNoise.Noise0, txs_d1->FieldNoise.Noise1, - txs_d1->FieldNoise.Noise2)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tRCPI0=0x%x, RCPI1=0x%x, RCPI2=0x%x\n", - txs_d2->field_rcpi.RCPI0, txs_d2->field_rcpi.RCPI1, - txs_d2->field_rcpi.RCPI2)); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxPwr(dbm)=0x%x\n", txs_d2->field_ft.TxPwrdBm)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tTxDelay=0x%x(unit 32us), RxVSeqNum=0x%x, Wlan Idx=0x%x\n", - txs_d3->TxDelay, txs_d3->RXV_SN, txs_d3->TxS_WlanIdx)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tSN=0x%x, TxBW=0x%x, AMPDU=%d, Final MPDU=%d PID=0x%x, MPDU TxCnt=%d, MCS Idx=%d\n", - txs_d4->TxS_SN_TSSI, txs_d4->TxS_TxBW, txs_d4->TxS_AMPDU, - txs_d4->TxS_FianlMPDU, txs_d4->TxS_Pid, txs_d4->TxS_MpduTxCnt, - txs_d4->TxS_LastTxMcsIdx)); -} - -static VOID DumpPseFrameInfo(RTMP_ADAPTER *pAd, UINT8 PID, UINT8 QID) -{ - UINT32 FirstFID, CurFID, NextFID, FrameNums = 0; - UINT32 Value; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PID = %d, QID = %d\n", PID, QID)); - HW_IO_READ32(pAd, C_GFF, &Value); - Value &= ~GET_QID_MASK; - Value |= SET_GET_QID(QID); - Value &= ~GET_PID_MASK; - Value |= SET_GET_PID(PID); - HW_IO_WRITE32(pAd, C_GFF, Value); - HW_IO_READ32(pAd, C_GFF, &Value); - FirstFID = GET_FIRST_FID(Value); - - if (FirstFID == 0xfff) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("FrameNums = %d\n", FrameNums)); - return; - } - - CurFID = FirstFID; - FrameNums++; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("FID = %d", CurFID)); - - while (1) { - HW_IO_READ32(pAd, C_GF, &Value); - Value &= ~CURR_FID_MASK; - Value |= SET_CURR_FID(CurFID); - HW_IO_WRITE32(pAd, C_GF, Value); - HW_IO_READ32(pAd, C_GF, &Value); - NextFID = GET_RETURN_FID(Value); - - if (NextFID == 0xfff) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nFrameNums = %d\n", FrameNums)); - return; - } else { - CurFID = NextFID; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (", FID = %d\n", CurFID)); - FrameNums++; - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nFrameNums = %d\n", FrameNums)); -} - -static RTMP_REG_PAIR mac_cr_seg[] = { - { 0x20000, 0x20010 }, /* WF_CFG */ - { WF_TRB_BASE, 0x21040 }, /* WF_CFG */ - { WF_AGG_BASE, 0x21240 }, /* WF_CFG */ - { WF_ARB_BASE, 0x21440 }, /* WF_CFG */ - { 0, 0 }, -}; - -VOID dump_mt_mac_cr(RTMP_ADAPTER *pAd) -{ - INT index = 0; - UINT32 mac_val, mac_addr, seg_s, seg_e; - - while (mac_cr_seg[index].Register != 0) { - seg_s = mac_cr_seg[index].Register; - seg_e = mac_cr_seg[index].Value; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dump WF_CFG Segment(Start=0x%x, End=0x%x)\n", seg_s, - seg_e)); - - for (mac_addr = seg_s; mac_addr < seg_e; mac_addr += 4) { - MAC_IO_READ32(pAd, mac_addr, &mac_val); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MAC[0x%x] = 0x%x\n", mac_addr, mac_val)); - } - - index++; - }; -} - -INT mt_mac_fifo_stat_update(RTMP_ADAPTER *pAd) -{ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); - return FALSE; -} - -VOID NicGetTxRawCounters(IN RTMP_ADAPTER *pAd, IN TX_STA_CNT0_STRUC *pStaTxCnt0, - IN TX_STA_CNT1_STRUC *pStaTxCnt1) -{ - /* TODO: shiang-7603 */ - return; -} - -/* - ======================================================================== - - Routine Description: - Read statistical counters from hardware registers and record them - in software variables for later on query - - Arguments: - pAd Pointer to our adapter - - Return Value: - None - - IRQL = DISPATCH_LEVEL - - ======================================================================== -*/ -VOID NICUpdateRawCounters(RTMP_ADAPTER *pAd) -{ - UINT32 OldValue, ampdu_range_cnt[4]; - UINT32 mac_val, rx_err_cnt, fcs_err_cnt; - /* UINT32 TxSuccessCount = 0, TxRetryCount = 0; */ -#ifdef DBG_DIAGNOSE - UINT32 bss_tx_cnt; - UINT32 TxFailCount = 0; -#endif /* DBG_DIAGNOSE */ -#ifdef COMPOS_WIN - COUNTER_MTK *pPrivCounters; -#else - COUNTER_RALINK *pPrivCounters; -#endif - COUNTER_802_11 *wlanCounter; - COUNTER_802_3 *dot3Counters; - /* for PER debug */ - UINT32 AmpduTxCount = 0; - UINT32 AmpduTxSuccessCount = 0; -#ifndef COMPOS_TESTMODE_WIN - - if (pAd->StaCfg[0].PwrMgmt.bDoze) { - MTWF_LOG(DBG_CAT_PS, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(%d): H/W in PM4, return\n", __func__, __LINE__)); - return; - } - -#endif /* COMPOS_TESTMODE_WIN */ -#ifdef COMPOS_WIN - wlanCounter = &pAd->Counter.WlanCounters; - pPrivCounters = &pAd->Counter.MTKCounters; - dot3Counters = &pAd->Counter.Counters8023; -#else - pPrivCounters = &pAd->RalinkCounters; - wlanCounter = pAd->WlanCounters; - dot3Counters = &pAd->Counters8023; -#endif /* COMPOS_WIN */ - MAC_IO_READ32(pAd, MIB_MSDR14, &AmpduTxCount); - AmpduTxCount &= 0xFFFFFF; - MAC_IO_READ32(pAd, MIB_MSDR15, &AmpduTxSuccessCount); - AmpduTxSuccessCount &= 0xFFFFFF; - MAC_IO_READ32(pAd, MIB_MSDR4, &rx_err_cnt); - fcs_err_cnt = (rx_err_cnt >> 16) & 0xffff; - MAC_IO_READ32(pAd, MIB_MDR2, &mac_val); - ampdu_range_cnt[0] = mac_val & 0xffff; - ampdu_range_cnt[1] = (mac_val >> 16) & 0xffff; - MAC_IO_READ32(pAd, MIB_MDR3, &mac_val); - ampdu_range_cnt[2] = mac_val & 0xffff; - ampdu_range_cnt[3] = (mac_val >> 16) & 0xffff; -#ifdef DBG_DIAGNOSE - MAC_IO_READ32(pAd, MIB_MB0SDR1, &mac_val); - TxFailCount = (mac_val >> 16) & 0xffff; - /* TODO: shiang, now only check BSS0 */ - MAC_IO_READ32(pAd, WTBL_BTCRn, &bss_tx_cnt); - bss_tx_cnt = (bss_tx_cnt >> 16) & 0xffff; -#endif /* DBG_DIAGNOSE */ -#ifdef STATS_COUNT_SUPPORT - pAd->WlanCounters[0].AmpduSuccessCount.u.LowPart += AmpduTxSuccessCount; - pAd->WlanCounters[0].AmpduFailCount.u.LowPart += - (AmpduTxCount - AmpduTxSuccessCount); -#endif /* STATS_COUNT_SUPPORT */ - pPrivCounters->OneSecRxFcsErrCnt += fcs_err_cnt; -#ifdef STATS_COUNT_SUPPORT - /* Update FCS counters*/ - OldValue = pAd->WlanCounters[0].FCSErrorCount.u.LowPart; - pAd->WlanCounters[0].FCSErrorCount.u.LowPart += fcs_err_cnt; /* >> 7);*/ - - if (pAd->WlanCounters[0].FCSErrorCount.u.LowPart < OldValue) - pAd->WlanCounters[0].FCSErrorCount.u.HighPart++; - -#endif /* STATS_COUNT_SUPPORT */ -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - pAd->ATECtrl.rx_stat.RxMacFCSErrCount += fcs_err_cnt; - -#endif - /* Add FCS error count to private counters*/ - pPrivCounters->OneSecRxFcsErrCnt += fcs_err_cnt; - OldValue = pPrivCounters->RealFcsErrCount.u.LowPart; - pPrivCounters->RealFcsErrCount.u.LowPart += fcs_err_cnt; - - if (pPrivCounters->RealFcsErrCount.u.LowPart < OldValue) - pPrivCounters->RealFcsErrCount.u.HighPart++; - - dot3Counters->RxNoBuffer += (rx_err_cnt & 0xffff); - wlanCounter->TxAggRange1Count.u.LowPart += ampdu_range_cnt[0]; - wlanCounter->TxAggRange2Count.u.LowPart += ampdu_range_cnt[1]; - wlanCounter->TxAggRange3Count.u.LowPart += ampdu_range_cnt[2]; - wlanCounter->TxAggRange4Count.u.LowPart += ampdu_range_cnt[3]; -#ifdef DBG_DIAGNOSE - { - RtmpDiagStruct *pDiag; - UINT8 ArrayCurIdx; - struct dbg_diag_info *diag_info; - - pDiag = &pAd->DiagStruct; - ArrayCurIdx = pDiag->ArrayCurIdx; - - if (pDiag->inited == 0) { - os_zero_mem(pDiag, sizeof(struct _RtmpDiagStrcut_)); - pDiag->ArrayStartIdx = pDiag->ArrayCurIdx = 0; - pDiag->wcid = 0; - pDiag->inited = 1; - pDiag->diag_cond = 0; - } else { - diag_info = &pDiag->diag_info[ArrayCurIdx]; - - if ((pDiag->wcid == 0) && (pAd->MacTab.Size > 0)) { - UCHAR idx; - MAC_TABLE_ENTRY *pEntry; - - for (idx = 1; VALID_UCAST_ENTRY_WCID(pAd, idx); - idx++) { - pEntry = &pAd->MacTab.Content[idx]; - - if (IS_ENTRY_CLIENT(pEntry) && - (pEntry->Sst == SST_ASSOC)) { - pDiag->wcid = idx; - MTWF_LOG( - DBG_CAT_HW, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s(): DBG_DIAGNOSE Start to monitor the SwQ depth of WCID[%d], ArrayCurIdx=%d\n", - __func__, pDiag->wcid, - pDiag->ArrayCurIdx)); - break; - } - } - } - - /* Tx*/ - diag_info->TxFailCnt = TxFailCount; -#ifdef DBG_TX_AGG_CNT - diag_info->TxAggCnt = AmpduTxCount; - diag_info->TxNonAggCnt = - bss_tx_cnt - - AmpduTxCount; /* only useful when only one BSS case */ - diag_info->TxAMPDUCnt[0] = ampdu_range_cnt[0]; - diag_info->TxAMPDUCnt[1] = ampdu_range_cnt[1]; - diag_info->TxAMPDUCnt[2] = ampdu_range_cnt[2]; - diag_info->TxAMPDUCnt[3] = ampdu_range_cnt[3]; -#endif /* DBG_TX_AGG_CNT */ - diag_info->RxCrcErrCnt = fcs_err_cnt; - INC_RING_INDEX(pDiag->ArrayCurIdx, DIAGNOSE_TIME); - ArrayCurIdx = pDiag->ArrayCurIdx; - os_zero_mem(&pDiag->diag_info[ArrayCurIdx], - sizeof(pDiag->diag_info[ArrayCurIdx])); - - if (pDiag->ArrayCurIdx == pDiag->ArrayStartIdx) - INC_RING_INDEX(pDiag->ArrayStartIdx, - DIAGNOSE_TIME); - } - } -#endif /* DBG_DIAGNOSE */ - return; -} - -/* - ======================================================================== - - Routine Description: - Clean all Tx/Rx statistic raw counters from hardware registers - - Arguments: - pAd Pointer to our adapter - - Return Value: - None - - ======================================================================== -*/ -VOID NicResetRawCounters(RTMP_ADAPTER *pAd) -{ - return; -} - -UCHAR tmi_rate_map_cck_lp[] = { - TMI_TX_RATE_CCK_1M_LP, - TMI_TX_RATE_CCK_2M_LP, - TMI_TX_RATE_CCK_5M_LP, - TMI_TX_RATE_CCK_11M_LP, -}; - -UCHAR tmi_rate_map_cck_sp[] = { - TMI_TX_RATE_CCK_2M_SP, - TMI_TX_RATE_CCK_2M_SP, - TMI_TX_RATE_CCK_5M_SP, - TMI_TX_RATE_CCK_11M_SP, -}; - -UCHAR tmi_rate_map_ofdm[] = { - TMI_TX_RATE_OFDM_6M, TMI_TX_RATE_OFDM_9M, TMI_TX_RATE_OFDM_12M, - TMI_TX_RATE_OFDM_18M, TMI_TX_RATE_OFDM_24M, TMI_TX_RATE_OFDM_36M, - TMI_TX_RATE_OFDM_48M, TMI_TX_RATE_OFDM_54M, -}; - -#define TMI_TX_RATE_CCK_VAL(_mcs) \ - ((TMI_TX_RATE_MODE_CCK << TMI_TX_RATE_BIT_MODE) | (_mcs)) - -#define TMI_TX_RATE_OFDM_VAL(_mcs) \ - ((TMI_TX_RATE_MODE_OFDM << TMI_TX_RATE_BIT_MODE) | (_mcs)) - -#define TMI_TX_RATE_HT_VAL(_mode, _mcs, _stbc) \ - (((_stbc) << TMI_TX_RATE_BIT_STBC) | \ - ((_mode) << TMI_TX_RATE_BIT_MODE) | (_mcs)) - -#define TMI_TX_RATE_VHT_VAL(_nss, _mcs, _stbc) \ - (((_stbc) << TMI_TX_RATE_BIT_STBC) | \ - (((_nss - 1) & (TMI_TX_RATE_MASK_NSS)) << TMI_TX_RATE_BIT_NSS) | \ - (TMI_TX_RATE_MODE_VHT << TMI_TX_RATE_BIT_MODE) | (_mcs)) - -UINT16 tx_rate_to_tmi_rate(UINT8 mode, UINT8 mcs, UINT8 nss, BOOLEAN stbc, - UINT8 preamble) -{ - UINT16 tmi_rate = 0, mcs_id = 0; - - stbc = (stbc == TRUE) ? 1 : 0; - - switch (mode) { - case MODE_CCK: - if (preamble) - mcs_id = tmi_rate_map_cck_lp[mcs]; - else - mcs_id = tmi_rate_map_cck_sp[mcs]; - - tmi_rate = (TMI_TX_RATE_MODE_CCK << TMI_TX_RATE_BIT_MODE) | - (mcs_id); - break; - - case MODE_OFDM: - mcs_id = tmi_rate_map_ofdm[mcs]; - tmi_rate = (TMI_TX_RATE_MODE_OFDM << TMI_TX_RATE_BIT_MODE) | - (mcs_id); - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - tmi_rate = ((USHORT)(stbc << TMI_TX_RATE_BIT_STBC)) | - (((nss - 1) & TMI_TX_RATE_MASK_NSS) - << TMI_TX_RATE_BIT_NSS) | - ((USHORT)(mode << TMI_TX_RATE_BIT_MODE)) | - ((USHORT)(mcs)); - /* MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s(): mode=%d, mcs=%d, stbc=%d converted tmi_rate=0x%x\n", */ - /* __FUNCTION__, mode, mcs, stbc, tmi_rate)); */ - break; - - case MODE_VHT: - tmi_rate = TMI_TX_RATE_VHT_VAL(nss, mcs, stbc); - break; - - default: - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid mode(mode=%d)\n", __func__, mode)); - break; - } - - return tmi_rate; -} - -UCHAR get_nsts_by_mcs(UCHAR phy_mode, UCHAR mcs, BOOLEAN stbc, UCHAR vht_nss) -{ - UINT8 nsts = 1; - - switch (phy_mode) { - case MODE_VHT: - if (stbc && (vht_nss == 1)) - nsts++; - else - nsts = vht_nss; - - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - if (mcs != 32) { - nsts += (mcs >> 3); - - if (stbc && (nsts == 1)) - nsts++; - } - - break; - - case MODE_CCK: - case MODE_OFDM: - default: - break; - } - - return nsts; -} - -VOID MtWriteTMacInfo(IN RTMP_ADAPTER *pAd, IN UCHAR *buf, IN TMAC_INFO *TxInfo) -{ - TMAC_TXD_S *txd_s = (TMAC_TXD_S *)buf; - TMAC_TXD_L *txd_l = (TMAC_TXD_L *)buf; - TMAC_TXD_0 *txd_0 = &txd_s->TxD0; - TMAC_TXD_1 *txd_1 = &txd_s->TxD1; - TMAC_TXD_2 *txd_2 = NULL; - TMAC_TXD_3 *txd_3 = NULL; - TMAC_TXD_5 *txd_5 = NULL; - TMAC_TXD_6 *txd_6 = NULL; - UCHAR txd_size; - UCHAR stbc = 0, bw = BW_20, mcs = 0, nss = 1, sgi = 0, phy_mode = 0, - preamble = 1, ldpc = 0, expBf = 0, impBf = 0; - UCHAR vht_nss = 1; - TX_RADIO_SET_T *pTxRadioSet = NULL; - /*DWORD 0*/ - txd_0->PIdx = TxInfo->PortIdx; - txd_0->QIdx = TxInfo->QueIdx; - - if (TxInfo->QueIdx < 4) - txd_0->QIdx = wmm_swq_2_hw_ac_queue[TxInfo->QueIdx]; - else { - /* TODO: shiang-usw, consider about MCC case! */ - txd_0->QIdx = TxInfo->QueIdx; - } - - /*DWORD 1*/ - txd_1->WlanIdx = TxInfo->Wcid; - - if (!TxInfo->NeedTrans) { - txd_1->HdrFmt = TMI_HDR_FT_NOR_80211; - TMI_HDR_INFO_VAL(txd_1->HdrFmt, 0, 0, 0, 0, 0, - TxInfo->WifiHdrLen, 0, txd_1->HdrInfo); - - /* TODO: depends on QoS to decide if need to padding */ - if (TxInfo->HdrPad) - txd_1->HdrPad = (TMI_HDR_PAD_MODE_TAIL - << TMI_HDR_PAD_BIT_MODE) | - TxInfo->HdrPad; - } else { - txd_1->HdrFmt = TMI_HDR_FT_NON_80211; - TMI_HDR_INFO_VAL(txd_1->HdrFmt, TxInfo->MoreData, TxInfo->Eosp, - 1, TxInfo->VlanFrame, TxInfo->EtherFrame, - TxInfo->WifiHdrLen, 0, txd_1->HdrInfo); - - if (TxInfo->HdrPad) - txd_1->HdrPad = (TMI_HDR_PAD_MODE_HEAD - << TMI_HDR_PAD_BIT_MODE) | - TxInfo->HdrPad; - } - - txd_1->NoAck = (TxInfo->bAckRequired ? 0 : 1); - txd_1->Tid = TxInfo->UserPriority; - - if (IS_CIPHER_NONE(TxInfo->CipherAlg)) - txd_1->ProtectFrame = 0; - else - txd_1->ProtectFrame = 1; - - txd_1->OwnMacAddr = TxInfo->OwnMacIdx; - - if (TxInfo->LongFmt == FALSE) { - txd_1->TxDFmt = TMI_FT_SHORT; - txd_size = sizeof(TMAC_TXD_S); - } else { - txd_2 = &txd_l->TxD2; - txd_3 = &txd_l->TxD3; - txd_5 = &txd_l->TxD5; - txd_6 = &txd_l->TxD6; - txd_1->TxDFmt = TMI_FT_LONG; - txd_size = sizeof(TMAC_TXD_L); - pTxRadioSet = &TxInfo->TxRadioSet; - ldpc = pTxRadioSet->Ldpc; - mcs = pTxRadioSet->RateCode; - sgi = pTxRadioSet->ShortGI; - - if ((pAd->Antenna.field.TxPath == 1) && (TxInfo->FixRate)) - stbc = 0; - else - stbc = pTxRadioSet->Stbc; - - phy_mode = pTxRadioSet->PhyMode; - bw = pTxRadioSet->CurrentPerPktBW; - expBf = pTxRadioSet->EtxBFEnable; - impBf = pTxRadioSet->ItxBFEnable; - vht_nss = TxInfo->VhtNss ? TxInfo->VhtNss : 1; - nss = get_nsts_by_mcs(phy_mode, mcs, stbc, vht_nss); - /*DW2*/ - txd_2->MaxTxTime = TxInfo->MaxTxTime; - txd_2->BmcPkt = TxInfo->BmcPkt; - txd_2->FixRate = TxInfo->FixRate; - txd_2->FrmType = TxInfo->FrmType; - txd_2->SubType = TxInfo->SubType; - - if (TxInfo->NeedTrans) - txd_2->HtcExist = 0; - - txd_2->Frag = TxInfo->FragIdx; - txd_2->TimingMeasure = TxInfo->TimingMeasure; - txd_2->BaDisable = TxInfo->BaDisable; - /*DW3*/ - txd_3->RemainTxCnt = TxInfo->RemainTxCnt; - txd_3->Sn = TxInfo->Sn; - /*DW5*/ - txd_5->PktId = TxInfo->Pid; - txd_5->TxSFmt = TxInfo->TxSFmt; - txd_5->TxS2Host = TxInfo->TxS2Host; - txd_5->TxS2Mcu = TxInfo->TxS2Mcu; - - if (TxInfo->NeedTrans) - txd_5->DataSrcSelect = TMI_DAS_FROM_MPDU; - - txd_5->BarSsnCtrl = TxInfo->BarSsnCtrl; - /* For MT STA LP control, use H/W control mode for PM bit */ -#if defined(CONFIG_STA_SUPPORT) && defined(CONFIG_PM_BIT_HW_MODE) - txd_5->PwrMgmt = TMI_PM_BIT_CFG_BY_HW; -#else - txd_5->PwrMgmt = TMI_PM_BIT_CFG_BY_SW; -#endif /* CONFIG_STA_SUPPORT && CONFIG_PM_BIT_HW_MODE */ - - /* txd_5->PktNumHigh = 0; */ - - /* DW6 */ - if (txd_2->FixRate) { - txd_6->FixedRateMode = TMI_FIX_RATE_BY_TXD; - txd_6->AntPri = TxInfo->AntPri; - txd_6->SpeExtEnable = TxInfo->SpeEn; - txd_6->FixedBwMode = ((1 << 2) | bw); - txd_6->DynamicBw = 0; - txd_6->ExplicitBf = expBf; - txd_6->ImplicitBf = impBf; - txd_6->LDPC = ldpc; - txd_6->GI = sgi; - - if (txd_6->FixedRateMode == TMI_FIX_RATE_BY_TXD) { - preamble = TxInfo->TxRadioSet.Premable; - txd_6->RateToBeFixed = tx_rate_to_tmi_rate( - phy_mode, mcs, nss, stbc, preamble); - } - } - } - - txd_0->TxByteCount = txd_size + TxInfo->PktLen; -#ifdef CONFIG_CSO_SUPPORT - txd_0->UTChkSum = 1; - txd_0->IpChkSum = 1; - - if (txd_0->IpChkSum || txd_0->UTChkSum) { - UCHAR tmp = 0; - - if (!TxInfo->NeedTrans) /*802.11*/ - tmp = (txd_size + TxInfo->WifiHdrLen + 6) >> 1; - else - tmp = (txd_size + LENGTH_802_3) >> 1; - - txd_0->EthTypeOffset = tmp; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():TxInfo->WifiHdrLen is %x tmp length is %d\n", - __func__, TxInfo->WifiHdrLen, tmp)); - } - -#endif /* CONFIG_CSO_SUPPORT */ -#ifdef CONFIG_TRACE_SUPPORT - - if (txd_1->TxDFmt == TMI_FT_SHORT) - TRACE_TX_MAC_SINFO(txd_s); - else - TRACE_TX_MAC_LINFO(txd_l); - -#endif -} - -#ifdef COMPOS_WIN -VOID XmitWriteTxD(IN PMP_ADAPTER pAd, IN UCHAR *buf, - IN HARD_TRANSMIT_INFO TxInfo) -{ - UINT8 tmpQIdx = 0; - /* ============== */ - TxInfo.TMacInfo.PortIdx = P_IDX_LMAC; - tmpQIdx = TxInfo.TMacInfo.QueIdx; - - if (TxInfo.bWfdPkt) - TxInfo.TMacInfo.QueIdx = DMA_Q9; /* WFD packet always use Q9 */ - else - TxInfo.TMacInfo.QueIdx; - - if (TxInfo.bShortFmt) - TxInfo.TMacInfo.LongFmt = FALSE; - else - TxInfo.TMacInfo.LongFmt = TRUE; - - if (TxInfo.TMacInfo.LongFmt == TRUE) { - if (TxInfo.bMgmtPacket || TxInfo.bMcast || TxInfo.bDHCPFrame || - TxInfo.bEAPOLFrame || - ((TxInfo.MimoPs == MMPS_STATIC) && - (pAd->RegistryCfg.APTGN == TRUE))) { - TxInfo.TMacInfo.BaDisable = TRUE; - TxInfo.TMacInfo.MaxTxTime = 0; - TxInfo.TMacInfo.FixRate = 1; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Force to Fixed Rate, reason:(Mgmt:%d, Mcast:%d, DHCP:%d, EAPOL:%d, MMPS_S:%d\n", - TxInfo.bMgmtPacket, TxInfo.bMcast, - TxInfo.bDHCPFrame, TxInfo.bEAPOLFrame, - TxInfo.MimoPs)); - } - - if (TxInfo.TMacInfo.QueIdx == 0x7 || - TxInfo.TMacInfo.QueIdx == 0x8) - TxInfo.TMacInfo.RemainTxCnt = 0x1f; - else - TxInfo.TMacInfo.RemainTxCnt = 0xf; - - if (TxInfo.TMacInfo.Pid == PID_NOT_RESPONSE) - TxInfo.TMacInfo.TxS2Host = - 0; /* 0 : not report status to host */ - else - TxInfo.TMacInfo.TxS2Host = - 1; /* 1 : report status to host */ - - TxInfo.TMacInfo.BarSsnCtrl = TMI_BSN_CFG_BY_HW; - } - - TxInfo.TMacInfo.NeedTrans = FALSE; - MtWriteTMacInfo(pAd, buf, &TxInfo.TMacInfo); - TxInfo.TMacInfo.QueIdx = tmpQIdx; - /* ============== */ -} - -#endif /* COMPOS_WIN */ - -#ifdef LINUX -/* - ======================================================================== - - Routine Description: - Calculates the duration which is required to transmit out frames - with given size and specified rate. - - Arguments: - pTxWI Pointer to head of each MPDU to HW. - Ack Setting for Ack requirement bit - Fragment Setting for Fragment bit - RetryMode Setting for retry mode - Ifs Setting for IFS gap - Rate Setting for transmit rate - Service Setting for service - Length Frame length - TxPreamble Short or Long preamble when using CCK rates - QueIdx - 0-3, according to 802.11e/d4.4 June/2003 - - Return Value: - None - - See also : BASmartHardTransmit() !!! - - ======================================================================== -*/ -VOID mt_write_tmac_info(IN RTMP_ADAPTER *pAd, IN UCHAR *tmac_info, - IN MAC_TX_INFO *info, IN HTTRANSMIT_SETTING *pTransmit) -{ - MAC_TABLE_ENTRY *mac_entry = NULL; - UCHAR stbc, bw, mcs, nss = 1, sgi, phy_mode, ldpc = 0, - preamble = LONG_PREAMBLE; - UCHAR to_mcu = FALSE, q_idx = info->q_idx; - TMAC_TXD_L txd; - TMAC_TXD_0 *txd_0 = &txd.TxD0; - TMAC_TXD_1 *txd_1 = &txd.TxD1; - TMAC_TXD_2 *txd_2 = &txd.TxD2; - TMAC_TXD_3 *txd_3 = &txd.TxD3; - TMAC_TXD_5 *txd_5 = &txd.TxD5; - TMAC_TXD_6 *txd_6 = &txd.TxD6; - INT txd_size = sizeof(TMAC_TXD_S); - TXS_CTL *TxSCtl = &pAd->TxSCtl; -#ifdef CONFIG_AP_SUPPORT - struct wifi_dev *wdev = NULL; -#endif - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (VALID_UCAST_ENTRY_WCID(pAd, info->WCID)) - mac_entry = &pAd->MacTab.Content[info->WCID]; - - os_zero_mem(&txd, sizeof(TMAC_TXD_L)); - ldpc = pTransmit->field.ldpc; - mcs = pTransmit->field.MCS; - sgi = pTransmit->field.ShortGI; - stbc = pTransmit->field.STBC; - phy_mode = pTransmit->field.MODE; - bw = (phy_mode <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); -#ifdef DOT11_N_SUPPORT -#ifdef CONFIG_ATE - - if (!ATE_ON(pAd)) -#endif - { - if (mac_entry && !IS_ENTRY_NONE(mac_entry)) { - UCHAR MaxMcs_1ss; -#ifdef DOT11_VHT_AC - - if (IS_VHT_STA(mac_entry)) - MaxMcs_1ss = 9; - else -#endif /* DOT11_VHT_AC */ - MaxMcs_1ss = 7; - - if ((pAd->CommonCfg.bMIMOPSEnable) && - (mac_entry->MmpsMode == MMPS_STATIC) && - (pTransmit->field.MODE >= MODE_HTMIX && - pTransmit->field.MCS > MaxMcs_1ss)) - mcs = MaxMcs_1ss; - } - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - - if (pAd->CommonCfg.VoPwrConstraintTest == TRUE) { - info->AMPDU = 0; - mcs = 0; - ldpc = 0; - bw = 0; - sgi = 0; - stbc = 0; - phy_mode = MODE_OFDM; - } - -#endif /* DOT11K_RRM_SUPPORT */ - /* DWORD 0 */ - txd_0->PIdx = (to_mcu ? P_IDX_MCU : P_IDX_LMAC); - txd_0->QIdx = q_idx; - /* DWORD 1 */ - txd_1->WlanIdx = info->WCID; - txd_1->TxDFmt = TMI_FT_LONG; - txd_1->HdrFmt = TMI_HDR_FT_NOR_80211; - TMI_HDR_INFO_VAL(txd_1->HdrFmt, 0, 0, 0, 0, 0, info->hdr_len, 0, - txd_1->HdrInfo); - - if (info->hdr_pad) /* TODO: depends on QoS to decide if need to padding */ - txd_1->HdrPad = - (TMI_HDR_PAD_MODE_TAIL << TMI_HDR_PAD_BIT_MODE) | - info->hdr_pad; - - txd_1->NoAck = (info->Ack ? 0 : 1); - txd_1->Tid = info->TID; - txd_1->OwnMacAddr = info->OmacIdx; - - if (txd_1->TxDFmt == TMI_FT_LONG) { - txd_size = sizeof(TMAC_TXD_L); - /* DWORD 2 */ - txd_2->BmcPkt = info->BM; - txd_2->FixRate = 1; - txd_2->Duration = 0; - txd_2->HtcExist = 0; - txd_2->Frag = - info->FRAG; /* 0: no frag, 1: 1st frag, 2: mid frag, 3: last frag */ - txd_2->MaxTxTime = 0; -#ifdef COEX_SUPPORT - if (pAd->BtCoexMode == MT76xx_COEX_MODE_TDD) { - /* - To prevent MaxTxTime is not 0 in the future. - TDD mode: remaining life time > 400ms. @20140827 - */ - if ((txd_2->MaxTxTime != 0) && (txd_2->MaxTxTime < 50)) - txd_2->MaxTxTime = 50; /* unit: 8TU */ - } - -#endif /* COEX_SUPPORT */ - - txd_2->BaDisable = 1; - txd_2->TimingMeasure = 0; - txd_2->FixRate = 1; - - if (cap->TmrEnable == 1) { - if ((txd_1->NoAck == 0) && (txd_2->BmcPkt == 0)) - txd_2->TimingMeasure = 1; - } - - txd_2->SubType = - (*((UINT16 *)(tmac_info + sizeof(TMAC_TXD_L))) & - (0xf << 4)) >> - 4; - txd_2->FrmType = - (*((UINT16 *)(tmac_info + sizeof(TMAC_TXD_L))) & - (0x3 << 2)) >> - 2; - - /* DWORD 3 */ - if (txd_0->QIdx == Q_IDX_BCN) - txd_3->RemainTxCnt = MT_TX_RETRY_UNLIMIT; - else - txd_3->RemainTxCnt = MT_TX_SHORT_RETRY; - - /* DWORD 4 */ - - /* DWORD 6 */ - if (txd_2->FixRate == 1) { - txd_6->FixedRateMode = TMI_FIX_RATE_BY_TXD; - txd_6->AntPri = info->AntPri; - txd_6->SpeExtEnable = info->SpeEn; - txd_6->FixedBwMode = ((1 << 2) | bw); - txd_6->DynamicBw = 0; - txd_6->ExplicitBf = 0; - txd_6->ImplicitBf = 0; - txd_6->LDPC = ldpc; - txd_6->GI = sgi; - - if (txd_6->FixedRateMode == TMI_FIX_RATE_BY_TXD) { - if (phy_mode == MODE_CCK) - preamble = info->Preamble; - - txd_6->RateToBeFixed = tx_rate_to_tmi_rate( - phy_mode, mcs, nss, stbc, preamble); - } - } - - /* DWORD 5 */ - txd_5->PktId = 0; -#ifdef BCN_OFFLOAD_SUPPORT - - if (info->Type == FC_TYPE_MGMT && - info->SubType == SUBTYPE_BEACON) { - ; /* if bcn offload support, don't fill txs field in beacon's txd. */ - } else -#endif - if (info->PID) { - if (TxSCtl->TxSFormatPerPkt & (1 << info->PID)) - txd_5->TxSFmt = TXS_FORMAT1; - else - txd_5->TxSFmt = TXS_FORMAT0; - - if (TxSCtl->TxS2McUStatusPerPkt & (1 << info->PID)) - txd_5->TxS2Mcu = 1; - else - txd_5->TxS2Mcu = 0; - - if (TxSCtl->TxS2HostStatusPerPkt & (1 << info->PID)) { - txd_5->PktId = - AddTxSStatus(pAd, TXS_TYPE0, info->PID, - 0, 0, txd_6->RateToBeFixed, - info->TxSPriv); - txd_5->TxS2Host = 1; - } else - txd_5->TxS2Host = 0; - } else { - ULONG TxSStatusPerWlanIdx; - - if (txd_1->WlanIdx < 64) - TxSStatusPerWlanIdx = - TxSCtl->TxSStatusPerWlanIdx[0]; - else - TxSStatusPerWlanIdx = - TxSCtl->TxSStatusPerWlanIdx[1]; - - if (TxSStatusPerWlanIdx & (1 << txd_1->WlanIdx)) { - if (TxSCtl->TxSFormatPerPktType[txd_2->FrmType] & - (1 << txd_2->SubType)) - txd_5->TxSFmt = TXS_FORMAT1; - else - txd_5->TxSFmt = TXS_FORMAT0; - - if (TxSCtl->TxS2McUStatusPerPktType - [txd_2->FrmType] & - (1 << txd_2->SubType)) - txd_5->TxS2Mcu = 1; - else - txd_5->TxS2Mcu = 0; - - if (TxSCtl->TxS2HostStatusPerPktType - [txd_2->FrmType] & - (1 << txd_2->SubType)) { - txd_5->PktId = - AddTxSStatus(pAd, TXS_TYPE1, 0, - txd_2->FrmType, - txd_2->SubType, 0, - info->TxSPriv); - txd_5->TxS2Host = 1; - } else - txd_5->TxS2Host = 0; - } - } - - txd_5->BarSsnCtrl = 1; - - if (info->PsmBySw) - txd_5->PwrMgmt = TMI_PM_BIT_CFG_BY_SW; - else - txd_5->PwrMgmt = TMI_PM_BIT_CFG_BY_HW; - - if (info->prot == 1) - txd_1->ProtectFrame = 1; - else if (info->prot == 2 || info->prot == 3) { -#ifdef CONFIG_AP_SUPPORT - - if (mac_entry) { - wdev = mac_entry->wdev; - GET_GroupKey_WCID(wdev, info->WCID); - } - -#ifdef DOT11W_PMF_SUPPORT - if (info->prot == 2) - txd_2->Bip = 1; -#endif /* DOT11W_PMF_SUPPORT */ -#else - { - MAC_TABLE_ENTRY *pEntry = - &pAd->MacTab.Content[info->WCID]; - - info->WCID = pEntry->wdev->bss_info_argument - .ucBcMcWlanIdx; - } -#endif - txd_1->WlanIdx = info->WCID; - } else - txd_1->ProtectFrame = 0; - } - - txd_0->TxByteCount = txd_size + info->Length; -#ifdef CONFIG_CSO_SUPPORT - txd_0->UTChkSum = 1; - txd_0->IpChkSum = 1; - - if (txd_0->IpChkSum || txd_0->UTChkSum) { - UCHAR tmp = 0; - - tmp = (txd_size + info->hdr_len + 6) >> - 1; /* 6 is shift to ethernet type */ - txd_0->EthTypeOffset = tmp; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("=======>%s():TxInfo->WifiHdrLen is %x tmp length is %d\n", - __func__, info->hdr_len, tmp)); - } - -#endif /* CONFIG_CSO_SUPPORT */ - os_move_mem(tmac_info, &txd, sizeof(TMAC_TXD_L)); -#ifdef CONFIG_TRACE_SUPPORT - - if (txd_1->TxDFmt == TMI_FT_SHORT) - TRACE_TX_MAC_SINFO((TMAC_TXD_S *)&txd); - else - TRACE_TX_MAC_LINFO(&txd); - -#endif -} - -VOID mt_write_tmac_info(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk) -{ -#ifdef CFG_TDLS_SUPPORT - MAC_TABLE_ENTRY *pMacEntry = pTxBlk->pMacEntry; -#endif - UCHAR wcid, to_mcu = FALSE; - BOOLEAN txd_long = FALSE; - STA_TR_ENTRY *tr_entry = pTxBlk->tr_entry; - TXS_CTL *TxSCtl = &pAd->TxSCtl; - TMAC_INFO TxInfo; - HTTRANSMIT_SETTING *pTransmit = NULL; - UCHAR *pTarget = NULL; - TMAC_TXD_S *txd_s = (TMAC_TXD_S *)buf; - TMAC_TXD_L *txd_l = (TMAC_TXD_L *)buf; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - wcid = pTxBlk->Wcid; - txd_long = TRUE; - - if (txd_long == FALSE) { - os_zero_mem(txd_s, sizeof(TMAC_TXD_S)); - pTxBlk->hw_rsv_len = 5 * sizeof(UINT32); - pTarget = (UCHAR *)(buf + pTxBlk->hw_rsv_len); - } else { - os_zero_mem(txd_l, sizeof(TMAC_TXD_L)); - pTarget = (UCHAR *)txd_l; - } - - os_zero_mem(&TxInfo, sizeof(TMAC_INFO)); - TxInfo.LongFmt = txd_long; - TxInfo.Wcid = wcid; - TxInfo.PortIdx = (to_mcu ? P_IDX_MCU : P_IDX_LMAC); - /* DWORD 0 */ - TxInfo.QueIdx = pTxBlk->QueIdx; - TxInfo.UsbNextValid = 0; - TxInfo.WifiHdrLen = pTxBlk->wifi_hdr_len; - TxInfo.HdrPad = pTxBlk->HdrPadLen; - TxInfo.NeedTrans = TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS); - - if (TX_BLK_TEST_FLAG(pTxBlk, fTX_HDR_TRANS)) { - TxInfo.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData); - TxInfo.Eosp = TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP); - TxInfo.VlanFrame = RTMP_GET_PACKET_VLAN(pTxBlk->pPacket); - TxInfo.EtherFrame = - (RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket) <= 1500) ? - 0 : - 1; - } - - TxInfo.bAckRequired = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired); - TxInfo.UserPriority = pTxBlk->UserPriority; - TxInfo.CipherAlg = pTxBlk->CipherAlg; - TxInfo.OwnMacIdx = tr_entry->OmacIdx; -#ifdef CFG_TDLS_SUPPORT - - if (pMacEntry && IS_ENTRY_TDLS(pMacEntry) && - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.bDoingPeriodChannelSwitch) - TxInfo.QueIdx = QID_HCCA; - -#endif /* CFG_TDLS_SUPPORT */ - - if (txd_long == TRUE) { - pTransmit = pTxBlk->pTransmit; - TxInfo.TxRadioSet.ShortGI = pTransmit->field.ShortGI; - TxInfo.TxRadioSet.Ldpc = pTransmit->field.ldpc; - TxInfo.TxRadioSet.RateCode = pTransmit->field.MCS; - TxInfo.TxRadioSet.PhyMode = pTransmit->field.MODE; - TxInfo.TxRadioSet.CurrentPerPktBW = - (TxInfo.TxRadioSet.PhyMode <= MODE_OFDM) ? - (BW_20) : - (pTransmit->field.BW); - TxInfo.TxRadioSet.Stbc = pTransmit->field.STBC; - TxInfo.TxRadioSet.EtxBFEnable = 0; - TxInfo.TxRadioSet.ItxBFEnable = 0; - TxInfo.BarSsnCtrl = TMI_PM_BIT_CFG_BY_HW; - TxInfo.MaxTxTime = 0; -#ifdef COEX_SUPPORT - - if (pAd->BtCoexMode == MT76xx_COEX_MODE_TDD) { - /* - To prevent MaxTxTime is not 0 in the future. - TDD mode: remaining life time > 400ms. @20140827 - */ - if ((TxInfo.MaxTxTime != 0) && (TxInfo.MaxTxTime < 50)) - TxInfo.MaxTxTime = 50; /* unit: 8TU */ - } - -#endif /* COEX_SUPPORT */ - TxInfo.BmcPkt = (pTxBlk->TxFrameType == TX_MCAST_FRAME ? 1 : 0); - TxInfo.FixRate = TX_BLK_TEST_FLAG(pTxBlk, fTX_ForceRate); - TxInfo.FragIdx = pTxBlk->FragIdx; - - if (cap->TmrEnable && TxInfo.bAckRequired) - TxInfo.TimingMeasure = 1; - - TxInfo.FrmType = - (*((UINT16 *)(pTxBlk->wifi_hdr)) & (0x3 << 2)) >> 2; - TxInfo.SubType = - (*((UINT16 *)(pTxBlk->wifi_hdr)) & (0xf << 4)) >> 4; - - if (pTxBlk->QueIdx == QID_BMC) - TxInfo.RemainTxCnt = MT_TX_RETRY_UNLIMIT; - else - TxInfo.RemainTxCnt = MT_TX_SHORT_RETRY; - - TxInfo.Sn = tr_entry->TxSeq[TxInfo.UserPriority]; - - if ((pTxBlk->TxFrameType == TX_LEGACY_FRAME) || - (pTxBlk->TxFrameType == TX_RALINK_FRAME)) - TxInfo.BaDisable = 1; - - TxInfo.Pid = 0; - - if (pTxBlk->Pid) { - if (TxSCtl->TxSFormatPerPkt & (1 << pTxBlk->Pid)) - TxInfo.TxSFmt = TXS_FORMAT1; - else - TxInfo.TxSFmt = TXS_FORMAT0; - - if (TxSCtl->TxS2McUStatusPerPkt & (1 << pTxBlk->Pid)) - TxInfo.TxS2Mcu = 1; - else - TxInfo.TxS2Mcu = 0; - - if (TxSCtl->TxS2HostStatusPerPkt & (1 << pTxBlk->Pid)) { - TxInfo.Pid = AddTxSStatus(pAd, TXS_TYPE0, - pTxBlk->Pid, 0, 0, 0, - pTxBlk->TxSPriv); - TxInfo.TxS2Host = 1; - } else - TxInfo.TxS2Host = 0; - } else { - ULONG TxSStatusPerWlanIdx; - - if (TxInfo.Wcid < 64) - TxSStatusPerWlanIdx = - TxSCtl->TxSStatusPerWlanIdx[0]; - else - TxSStatusPerWlanIdx = - TxSCtl->TxSStatusPerWlanIdx[1]; - - if (TxSStatusPerWlanIdx & (1 << TxInfo.Wcid)) { - if (TxSCtl->TxSFormatPerPktType[TxInfo.FrmType] & - (1 << TxInfo.SubType)) - TxInfo.TxSFmt = TXS_FORMAT1; - else - TxInfo.TxSFmt = TXS_FORMAT0; - - if (TxSCtl->TxS2McUStatusPerPktType - [TxInfo.FrmType] & - (1 << TxInfo.SubType)) - TxInfo.TxS2Mcu = 1; - else - TxInfo.TxS2Mcu = 0; - - if (TxSCtl->TxS2HostStatusPerPktType - [TxInfo.FrmType] & - (1 << TxInfo.SubType)) { - TxInfo.Pid = - AddTxSStatus(pAd, TXS_TYPE1, 0, - TxInfo.FrmType, - TxInfo.SubType, 0, - pTxBlk->TxSPriv); - TxInfo.TxS2Host = 1; - } else - TxInfo.TxS2Host = 0; - } - } - - /*DW6*/ - TxInfo.AntPri = 0; - TxInfo.SpeEn = 0; - - if (TxInfo.TxRadioSet.PhyMode == MODE_CCK) { - if (OPSTATUS_TEST_FLAG( - pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED)) - TxInfo.TxRadioSet.Premable = SHORT_PREAMBLE; - else - TxInfo.TxRadioSet.Premable = LONG_PREAMBLE; - } - } - - TxInfo.MpduHdrLen = pTxBlk->MpduHeaderLen; - /* TODO: shiang-7603, need to adjust */ - TxInfo.PktLen = - pTxBlk->SrcBufLen + pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen; - /*fill TxInfo*/ - MtWriteTMacInfo(pAd, pTarget, &TxInfo); -#ifdef DBG_DIAGNOSE - if (pTxBlk->QueIdx == 0) { - pAd->DiagStruct.diag_info[pAd->DiagStruct.ArrayCurIdx] - .TxDataCnt[0]++; - } - -#endif /* DBG_DIAGNOSE */ -} - -VOID write_tmac_info_Cache(RTMP_ADAPTER *pAd, UCHAR *buf, TX_BLK *pTxBlk) -{ - pAd->archOps.write_tmac_info(pAd, buf, pTxBlk); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not Finish yet for HT_MT!!!!\n", __func__, - __LINE__)); - return; -} - -VOID mt_write_tmac_info_beacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *tmac_buf, - HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen) -{ - MAC_TX_INFO mac_info; - - NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info)); - mac_info.Type = FC_TYPE_MGMT; - mac_info.SubType = SUBTYPE_BEACON; - mac_info.FRAG = FALSE; - mac_info.CFACK = FALSE; - mac_info.InsTimestamp = TRUE; - mac_info.AMPDU = FALSE; - mac_info.BM = 1; - mac_info.Ack = FALSE; - mac_info.NSeq = TRUE; - mac_info.BASize = 0; - mac_info.WCID = 0; - mac_info.Length = frmLen; - mac_info.TID = 0; - mac_info.TxRate = 0; - mac_info.Txopmode = IFS_HTTXOP; - mac_info.hdr_len = 24; - mac_info.bss_idx = wdev->func_idx; - mac_info.SpeEn = 1; - mac_info.q_idx = HcGetBcnQueueIdx(pAd, wdev); -#ifdef MT_MAC - mac_info.TxSPriv = wdev->func_idx; - mac_info.OmacIdx = wdev->OmacIdx; -#endif - mac_info.Preamble = LONG_PREAMBLE; - mac_info.IsAutoRate = FALSE; - NdisZeroMemory(tmac_buf, sizeof(TMAC_TXD_L)); - write_tmac_info(pAd, tmac_buf, &mac_info, BeaconTransmit); -} - -#endif /* COMPOS_WIN */ - -INT rtmp_mac_set_band(RTMP_ADAPTER *pAd, int band) -{ - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); - return FALSE; -} - -INT mt_mac_set_ctrlch(RTMP_ADAPTER *pAd, UINT8 extch) -{ - /* TODO: shiang-7603 */ - return FALSE; -} - -#ifdef GREENAP_SUPPORT -INT rtmp_mac_set_mmps(RTMP_ADAPTER *pAd, INT ReduceCorePower) -{ - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); - return FALSE; -} -#endif /* GREENAP_SUPPORT */ - -#define BCN_TBTT_OFFSET 64 /*defer 64 us*/ -VOID ReSyncBeaconTime(RTMP_ADAPTER *pAd) -{ - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); -} - -#ifdef RTMP_MAC_PCI -static INT mt_asic_cfg_hif_tx_ring(RTMP_ADAPTER *pAd, RTMP_TX_RING *ring, - UINT32 offset, UINT32 phy_addr, UINT32 cnt) -{ - ring->TxSwFreeIdx = 0; - ring->TxCpuIdx = 0; - ring->hw_desc_base = MT_TX_RING_BASE + offset; - ring->hw_cnt_addr = ring->hw_desc_base + 0x04; - ring->hw_cidx_addr = ring->hw_desc_base + 0x08; - ring->hw_didx_addr = ring->hw_desc_base + 0x0c; - HIF_IO_WRITE32(pAd, ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, ring->hw_cidx_addr, ring->TxCpuIdx); - HIF_IO_WRITE32(pAd, ring->hw_cnt_addr, TX_RING_SIZE); - return TRUE; -} - -VOID mt_asic_init_txrx_ring(RTMP_ADAPTER *pAd) -{ - UINT32 phy_addr, offset; - INT i, TxHwRingNum; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - struct _PCI_HIF_T *hif = hc_get_hif_ctrl(pAd->hdev_ctrl); - /* Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits */ - AsicSetWPDMA(pAd, PDMA_TX_RX, FALSE); - AsicWaitPDMAIdle(pAd, 100, 1000); - { - /* TODO: shiang-usw, move this to other place! */ - HIF_IO_WRITE32(pAd, MT_DELAY_INT_CFG, 0); - } - /* Reset DMA Index */ - HIF_IO_WRITE32(pAd, WPDMA_RST_PTR, 0xFFFFFFFF); - /* - Write Tx Ring base address registers - - The Tx Ring arrangement: - RingIdx SwRingIdx AsicPriority WMM QID LMAC QID MCU QID - 0 Grp1_TxSw0 L QID_AC_BK AC0 - 1 Grp1_TxSw1 L QID_AC_BE AC1 - 2 Grp1_TxSw2 L QID_AC_VI AC2 - 3 Grp1_TxSw3 L QID_AC_VO AC3 - 4 Grp1_MGMT H - AC4 - - 5 CTRL - - - 6 PSMP - - - 7 BC/MC BC/MC - 8 BCN H BCN - - 9 Grp2_MGMT - AC14 - 10 Grp2_TxSw0 L QID_AC_BK AC10 - 11 Grp2_TxSw0 L QID_AC_BE AC11 - 12 Grp2_TxSw0 L QID_AC_VI AC12 - 13 Grp2_TxSw0 L QID_AC_VO AC13 - 14 - - 15 MCU H - MCU 0 - - Ring 0~3 for TxChannel 0 - Ring 10~14 for TxChannel 1 - */ - TxHwRingNum = GET_NUM_OF_TX_RING(cap); - - for (i = 0; i < TxHwRingNum; i++) { - if (i == QID_AC_BE) - offset = 0x10; - else if (i == QID_AC_BK) - offset = 0; - else - offset = i * 0x10; - - phy_addr = RTMP_GetPhysicalAddressLow( - hif->TxRing[i].Cell[0].AllocPa); - mt_asic_cfg_hif_tx_ring(pAd, &hif->TxRing[i], offset, phy_addr, - TX_RING_SIZE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->TX_RING_%d[0x%x]: Base=0x%x, Cnt=%d!\n", i, - hif->TxRing[i].hw_desc_base, phy_addr, TX_RING_SIZE)); - } - - { - RTMP_MGMT_RING *mgmt_ring; - RTMP_TX_RING *bmc_ring; - RTMP_BCN_RING *bcn_ring; - /* init BMC ring */ - bmc_ring = &pAd->TxBmcRing; - offset = QID_BMC * MT_RINGREG_DIFF; - phy_addr = - RTMP_GetPhysicalAddressLow(bmc_ring->Cell[0].AllocPa); - mt_asic_cfg_hif_tx_ring(pAd, bmc_ring, offset, phy_addr, - TX_RING_SIZE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->TX_BMC_RING [0x%x]: Base=0x%x, Cnt=%d!\n", - bmc_ring->hw_desc_base, phy_addr, TX_RING_SIZE)); - /* init MGMT ring Base/Size/Index pointer CSR */ - mgmt_ring = &pAd->MgmtRing; - phy_addr = - RTMP_GetPhysicalAddressLow(mgmt_ring->Cell[0].AllocPa); - offset = MT_RINGREG_DIFF * 4; - mgmt_ring->TxSwFreeIdx = 0; - mgmt_ring->TxCpuIdx = 0; - mgmt_ring->hw_desc_base = (MT_TX_RING_BASE + offset); - mgmt_ring->hw_cnt_addr = (mgmt_ring->hw_desc_base + 0x04); - mgmt_ring->hw_cidx_addr = (mgmt_ring->hw_desc_base + 0x08); - mgmt_ring->hw_didx_addr = (mgmt_ring->hw_desc_base + 0x0c); - HIF_IO_WRITE32(pAd, mgmt_ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, mgmt_ring->hw_cidx_addr, - mgmt_ring->TxCpuIdx); - HIF_IO_WRITE32(pAd, mgmt_ring->hw_cnt_addr, MGMT_RING_SIZE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->TX_RING_MGMT[0x%x]: Base=0x%x, Cnt=%d!\n", - mgmt_ring->hw_desc_base, phy_addr, MGMT_RING_SIZE)); - /* init BCN ring index pointer */ - bcn_ring = &pAd->BcnRing; - phy_addr = - RTMP_GetPhysicalAddressLow(bcn_ring->Cell[0].AllocPa); - bcn_ring->TxSwFreeIdx = 0; - bcn_ring->TxCpuIdx = 0; - bcn_ring->hw_desc_base = (MT_TX_RING_BASE + - MT_RINGREG_DIFF * MT_TX_RING_BCN_IDX); - bcn_ring->hw_cnt_addr = (bcn_ring->hw_desc_base + 0x4); - bcn_ring->hw_cidx_addr = (bcn_ring->hw_desc_base + 0x8); - bcn_ring->hw_didx_addr = (bcn_ring->hw_desc_base + 0xc); - HIF_IO_WRITE32(pAd, bcn_ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, bcn_ring->hw_cidx_addr, bcn_ring->TxCpuIdx); - HIF_IO_WRITE32(pAd, bcn_ring->hw_cnt_addr, BCN_RING_SIZE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->TX_RING_BCN: Base=0x%x, Cnt=%d!\n", phy_addr, - BCN_RING_SIZE)); - } - -#ifdef CONFIG_ANDES_SUPPORT - { - RTMP_CTRL_RING *ctrl_ring; - /* init CTRL ring index pointer */ - ctrl_ring = &pAd->CtrlRing; - phy_addr = - RTMP_GetPhysicalAddressLow(ctrl_ring->Cell[0].AllocPa); - offset = MT_RINGREG_DIFF * 5; - - ctrl_ring->TxSwFreeIdx = 0; - ctrl_ring->TxCpuIdx = 0; - ctrl_ring->hw_desc_base = (MT_TX_RING_BASE + offset); - ctrl_ring->hw_cnt_addr = (ctrl_ring->hw_desc_base + 0x04); - ctrl_ring->hw_cidx_addr = (ctrl_ring->hw_desc_base + 0x08); - ctrl_ring->hw_didx_addr = (ctrl_ring->hw_desc_base + 0x0c); - HIF_IO_WRITE32(pAd, ctrl_ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, ctrl_ring->hw_cidx_addr, - ctrl_ring->TxCpuIdx); - HIF_IO_WRITE32(pAd, ctrl_ring->hw_cnt_addr, MGMT_RING_SIZE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->TX_RING_CTRL: Base=0x%x, Cnt=%d!\n", phy_addr, - MGMT_RING_SIZE)); - } - -#endif /* CONFIG_ANDES_SUPPORT */ - - /* Init RX Ring0 Base/Size/Index pointer CSR */ - for (i = 0; i < GET_NUM_OF_RX_RING(cap); i++) { - RTMP_RX_RING *rx_ring; - UINT16 RxRingSize = (i == 0) ? RX_RING_SIZE : RX1_RING_SIZE; - - rx_ring = &hif->RxRing[i]; - offset = i * 0x10; - phy_addr = RTMP_GetPhysicalAddressLow(rx_ring->Cell[0].AllocPa); - rx_ring->RxSwReadIdx = 0; - rx_ring->RxCpuIdx = RX_RING_SIZE - 1; - rx_ring->hw_desc_base = MT_RX_RING_BASE + offset; - rx_ring->hw_cidx_addr = MT_RX_RING_CIDX + offset; - rx_ring->hw_didx_addr = MT_RX_RING_DIDX + offset; - rx_ring->hw_cnt_addr = MT_RX_RING_CNT + offset; - HIF_IO_WRITE32(pAd, rx_ring->hw_desc_base, phy_addr); - HIF_IO_WRITE32(pAd, rx_ring->hw_cidx_addr, rx_ring->RxCpuIdx); - HIF_IO_WRITE32(pAd, rx_ring->hw_cnt_addr, RxRingSize); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->RX_RING%d[0x%x]: Base=0x%x, Cnt=%d\n", i, - rx_ring->hw_desc_base, phy_addr, RX_RING_SIZE)); - } -} -#endif /* RTMP_MAC_PCI */ - -#ifndef COMPOS_WIN -VOID mt_mac_bcn_buf_init(IN RTMP_ADAPTER *pAd, BOOLEAN bHardReset) -{ - int idx; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - - for (idx = 0; idx < pChipCap->BcnMaxHwNum; idx++) - pAd->BeaconOffset[idx] = pChipCap->BcnBase[idx]; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("< Beacon Information: >\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tFlgIsSupSpecBcnBuf = %s\n", - pChipCap->FlgIsSupSpecBcnBuf ? "TRUE" : "FALSE")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tBcnMaxHwNum = %d\n", pChipCap->BcnMaxHwNum)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tBcnMaxNum = %d\n", pChipCap->BcnMaxNum)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tBcnMaxHwSize = 0x%x\n", pChipCap->BcnMaxHwSize)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tWcidHwRsvNum = %d\n", pChipCap->WcidHwRsvNum)); - - for (idx = 0; idx < pChipCap->BcnMaxHwNum; idx++) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\t\tBcnBase[%d] = 0x%x, pAd->BeaconOffset[%d]=0x%x\n", - idx, pChipCap->BcnBase[idx], idx, - pAd->BeaconOffset[idx])); - } - - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): Not support for HIF_MT yet!\n", __func__, __LINE__)); - return; -} -#endif /* COMPOS_WIN */ - -INT mt_mac_pse_init(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT32 pse_addr = cap->WtblPseAddr; - /* TODO: shiang-7603 */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(%d): pse addr=%x!\n", __func__, __LINE__, pse_addr)); - return TRUE; -} - -VOID dump_wtbl_1_info(RTMP_ADAPTER *pAd, struct wtbl_1_struc *tb) -{ - union WTBL_1_DW0 *wtbl_1_d0 = (union WTBL_1_DW0 *)&tb->wtbl_1_d0.word; - union WTBL_1_DW1 *wtbl_1_d1 = (union WTBL_1_DW1 *)&tb->wtbl_1_d1.word; - union WTBL_1_DW2 *wtbl_1_d2 = (union WTBL_1_DW2 *)&tb->wtbl_1_d2.word; - union WTBL_1_DW3 *wtbl_1_d3 = (union WTBL_1_DW3 *)&tb->wtbl_1_d3.word; - union WTBL_1_DW4 *wtbl_1_d4 = (union WTBL_1_DW4 *)&tb->wtbl_1_d4.word; - UINT8 addr[6]; - - os_move_mem(&addr[0], &wtbl_1_d1->word, 4); - addr[0] = wtbl_1_d1->field.addr_0 & 0xff; - addr[1] = ((wtbl_1_d1->field.addr_0 & 0xff00) >> 8); - addr[2] = ((wtbl_1_d1->field.addr_0 & 0xff0000) >> 16); - addr[3] = ((wtbl_1_d1->field.addr_0 & 0xff000000) >> 24); - /* addr[4] = wtbl_1_d0->field.addr_32 & 0xff; */ - /* addr[5] = (wtbl_1_d0->field.addr_32 & 0xff00 >> 8); */ - addr[4] = wtbl_1_d0->field.addr_4 & 0xff; - addr[5] = wtbl_1_d0->field.addr_5 & 0xff; - hex_dump("WTBL Segment 1 Raw Data", (UCHAR *)tb, - sizeof(struct wtbl_1_struc)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WTBL Segment 1 Fields:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tAddr: %02x:%02x:%02x:%02x:%02x:%02x\n", addr[0], addr[1], - addr[2], addr[3], addr[4], addr[5])); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMUAR_Idx:%d\n", wtbl_1_d0->field.muar_idx)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\trc_a1:%d/rc_a2:%d/kid:%d/rkv:%d/rv:%d/rc_id:%d/sw:%d\n", - wtbl_1_d0->field.rc_a1, wtbl_1_d0->field.rc_a2, - wtbl_1_d0->field.kid, wtbl_1_d0->field.rkv, - wtbl_1_d0->field.rv, wtbl_1_d0->field.rc_id, - wtbl_1_d0->field.sw)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twm/mm:%d/%d\n", wtbl_1_d0->field.wm, wtbl_1_d2->field.mm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\trx_ps:%d\n", wtbl_1_d2->field.rx_ps)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\taf:%d\n", wtbl_1_d2->field.af)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tcipher_suit:%d\n", wtbl_1_d2->field.cipher_suit)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\ttd/fd:%d/%d\n", wtbl_1_d2->field.td, wtbl_1_d2->field.fd)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tdis_rhtr:%d\n", wtbl_1_d2->field.dis_rhtr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tr:%d\n", wtbl_1_d2->field.r)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\trts:%d\n", wtbl_1_d2->field.rts)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tcf_ack:%d\n", wtbl_1_d2->field.cf_ack)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\trdg_ba:%d\n", wtbl_1_d2->field.rdg_ba)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tsmps:%d\n", wtbl_1_d2->field.smps)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tbaf_en:%d\n", wtbl_1_d2->field.baf_en)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tht/vht/ldpc/dyn_bw:%d/%d/%d/%d\n", wtbl_1_d2->field.ht, - wtbl_1_d2->field.vht, wtbl_1_d2->field.ldpc, - wtbl_1_d2->field.dyn_bw)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTxBF(tibf/tebf):%d / %d\n", wtbl_1_d2->field.tibf, - wtbl_1_d2->field.tebf)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\ttxop_ps_cap:%d\n", wtbl_1_d2->field.txop_ps_cap)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tmesh:%d\n", wtbl_1_d2->field.mesh)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tqos:%d\n", wtbl_1_d2->field.qos)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tadm:%d\n", wtbl_1_d2->field.adm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tgid:%d\n", wtbl_1_d2->field.gid)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twtbl2_fid:%d/wtbl2_eid:%d\n", wtbl_1_d3->field.wtbl2_fid, - wtbl_1_d3->field.wtbl2_eid)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twtbl3_fid:%d/wtbl3_eid:%d\n", wtbl_1_d4->field.wtbl3_fid, - wtbl_1_d4->field.wtbl3_eid)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\twtbl4_fid:%d/wtbl4_eid:%d\n", wtbl_1_d3->field.wtbl4_fid, - wtbl_1_d4->field.wtbl4_eid)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tchk_per:%d\n", wtbl_1_d3->field.chk_per)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tdu_i_psm:%d\n", wtbl_1_d3->field.du_i_psm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\ti_psm:%d\n", wtbl_1_d3->field.i_psm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpsm:%d\n", wtbl_1_d3->field.psm)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tskip_tx:%d\n", wtbl_1_d3->field.skip_tx)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tpartial_aid:%d\n", wtbl_1_d4->field.partial_aid)); -} - -static UCHAR *bw_str[] = { "20", "40", "80", "160" }; -VOID dump_wtbl_2_info(RTMP_ADAPTER *pAd, struct wtbl_2_struc *tb) -{ - union WTBL_2_DW0 *dw_0 = &tb->wtbl_2_d0; - union WTBL_2_DW1 *dw_1 = &tb->wtbl_2_d1; - union WTBL_2_DW2 *dw_2 = &tb->wtbl_2_d2; - union WTBL_2_DW3 *dw_3 = &tb->wtbl_2_d3; - union WTBL_2_DW4 *dw_4 = &tb->wtbl_2_d4; - union WTBL_2_DW5 *dw_5 = &tb->wtbl_2_d5; - union WTBL_2_DW6 *dw_6 = &tb->wtbl_2_d6; - union WTBL_2_DW7 *dw_7 = &tb->wtbl_2_d7; - union WTBL_2_DW8 *dw_8 = &tb->wtbl_2_d8; - union WTBL_2_DW9 *dw_9 = &tb->wtbl_2_d9; - union WTBL_2_DW10 *dw_10 = &tb->wtbl_2_d10; - union WTBL_2_DW11 *dw_11 = &tb->wtbl_2_d11; - union WTBL_2_DW12 *dw_12 = &tb->wtbl_2_d12; - union WTBL_2_DW13 *dw_13 = &tb->wtbl_2_d13; - union WTBL_2_DW14 *dw_14 = &tb->wtbl_2_d14; - union WTBL_2_DW15 *dw_15 = &tb->wtbl_2_d15; - UINT32 idx, ba_size_idx, ba_size = 0; - BOOLEAN ba_en; - UINT32 rate_info[8]; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR *ba_range = cap->ba_range; - - hex_dump("WTBL Segment 2 Raw Data", (UCHAR *)tb, - sizeof(struct wtbl_2_struc)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WTBL Segment 2 Fields:\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPN_0-31:0x%x\n", dw_0->pn_0)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tPN_32-48:0x%x\n", dw_1->field.pn_32)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSN(NonQos/Mgmt Frame):%d\n", dw_1->field.com_sn)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tSN(TID0~7 QoS Frame):%d - %d - %d - %d - %d - %d - %d - %d\n", - dw_2->field.tid_ac_0_sn, dw_2->field.tid_ac_1_sn, - dw_2->field.tid_ac_2_sn_0 | (dw_3->field.tid_ac_2_sn_9 << 9), - dw_3->field.tid_ac_3_sn, dw_3->field.tid_4_sn, - dw_3->field.tid_5_sn_0 | (dw_4->field.tid_5_sn_5 << 5), - dw_4->field.tid_6_sn, dw_4->field.tid_7_sn)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTxRateCnt(1-5):%d(%d) - %d - %d - %d - %d\n", - dw_5->field.rate_1_tx_cnt, dw_5->field.rate_1_fail_cnt, - dw_6->field.rate_2_tx_cnt, dw_6->field.rate_3_tx_cnt, - dw_6->field.rate_4_tx_cnt, dw_6->field.rate_5_tx_cnt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTxBwCnt(Current-Other):%d(%d) - %d(%d)\n", - dw_7->field.current_bw_tx_cnt, - dw_7->field.current_bw_fail_cnt, dw_8->field.other_bw_tx_cnt, - dw_8->field.other_bw_fail_cnt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFreqCap:%d(%sMHz)\n", dw_9->field.fcap, - bw_str[dw_9->field.fcap])); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tRateIdx/CBRN/CCBW_SEL/SPE_EN: %d/%d/%d/%d\n", - dw_9->field.rate_idx, dw_9->field.cbrn, dw_9->field.ccbw_sel, - dw_9->field.spe_en)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tMpduCnt(Fail/OK):%d-%d\n", dw_9->field.mpdu_fail_cnt, - dw_9->field.mpdu_ok_cnt)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTxRate Info: G2/G4/G8/G16=%d/%d/%d/%d\n", dw_9->field.g2, - dw_9->field.g4, dw_9->field.g8, dw_9->field.g16)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTxRate Info: RateIdx/STBC/Nsts/PhyMode/TxRate (RawData)\n")); - rate_info[0] = (dw_10->word & 0xfff); - rate_info[1] = (dw_10->word & 0xfff000) >> 12; - rate_info[2] = - ((dw_10->word & 0xff000000) >> 24) | ((dw_11->word & 0xf) << 8); - rate_info[3] = ((dw_11->word & 0xfff0) >> 4); - rate_info[4] = ((dw_11->word & 0xfff0000) >> 16); - rate_info[5] = ((dw_11->word & 0xf0000000) >> 28) | - ((dw_12->word & 0xff) << 4); - rate_info[6] = ((dw_12->word & 0xfff00) >> 8); - rate_info[7] = ((dw_12->word & 0xfff00000) >> 20); - - for (idx = 0; idx <= 7; idx++) { - UCHAR stbc, nss, phy_mode, rate; - UINT32 raw_data; - - raw_data = rate_info[idx] & 0xfff; - stbc = (raw_data & 0x800) ? 1 : 0; - nss = (raw_data & 0x600) >> 9; - phy_mode = (raw_data & 0x1c0) >> 6; - rate = (raw_data & 0x3f); - /* MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\t\t%d/%d/%d/%d/MCS%d 0x%x\n", idx + 1, stbc, nss, phy_mode, rate, rate_info[idx])); */ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t%d/%d/%d/", idx + 1, stbc, nss)); - - if (phy_mode == MODE_CCK) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CCK/")); - else if (phy_mode == MODE_OFDM) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("OFDM/")); - else if (phy_mode == MODE_HTMIX) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("HT/")); - else if (phy_mode == MODE_HTGREENFIELD) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("GF/")); - else if (phy_mode == MODE_VHT) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("VHT/")); - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("unkonw/")); - - if (phy_mode == MODE_CCK) { - if (rate == TMI_TX_RATE_CCK_1M_LP) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("1M")); - else if (rate == TMI_TX_RATE_CCK_2M_LP) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("2M")); - else if (rate == TMI_TX_RATE_CCK_5M_LP) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("5M")); - else if (rate == TMI_TX_RATE_CCK_11M_LP) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("11M")); - else if (rate == TMI_TX_RATE_CCK_2M_SP) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("2M")); - else if (rate == TMI_TX_RATE_CCK_5M_SP) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("5M")); - else if (rate == TMI_TX_RATE_CCK_11M_SP) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("11M")); - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("unkonw")); - } else if (phy_mode == MODE_OFDM) { - if (rate == TMI_TX_RATE_OFDM_6M) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("6M")); - else if (rate == TMI_TX_RATE_OFDM_9M) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("9M")); - else if (rate == TMI_TX_RATE_OFDM_12M) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("12M")); - else if (rate == TMI_TX_RATE_OFDM_18M) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("18M")); - else if (rate == TMI_TX_RATE_OFDM_24M) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("24M")); - else if (rate == TMI_TX_RATE_OFDM_36M) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("36M")); - else if (rate == TMI_TX_RATE_OFDM_48M) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("48M")); - else if (rate == TMI_TX_RATE_OFDM_54M) - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("54M")); - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("unkonw")); - } else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MCS%d", rate)); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 0x%x\n", rate_info[idx])); - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tResp_RCPI0/Resp_RCPI1/Resp_RCPI2=0x%x/0x%x/0x%x\n", - dw_13->field.resp_rcpi_0, dw_13->field.resp_rcpi_1, - dw_13->field.resp_rcpi_2)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t1CC(Noise)/2CC(Noise)/3CC(Noise)/CE_RMSD/CC_Sel/Ant_Sel=0x%x/0x%x/0x%x/0x%x/%d/%d\n", - dw_14->field.sts_1_ch_cap_noise, - dw_14->field.sts_2_ch_cap_noise, - dw_14->field.sts_3_ch_cap_noise, dw_14->field.ce_rmsd, - dw_14->field.cc_noise_sel, dw_14->field.ant_sel)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tBA Info: TID/BA_En/BAWinSizeIdx(Range)\n")); - - for (idx = 0; idx <= 7; idx++) { - ba_en = (dw_15->field.ba_en & (1 << idx)) ? 1 : 0; - ba_size_idx = - (dw_15->field.ba_win_size_tid & (0x7 << (idx * 3))) >> - ((idx * 3)); - - if (ba_size_idx < 8) - ba_size = ba_range[ba_size_idx]; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\t%d/%d/%d(%d)\n", idx, ba_en, ba_size_idx, - ba_size)); - } -} - -VOID dump_wtbl_3_info(RTMP_ADAPTER *pAd, union wtbl_3_struc *tb) -{ - hex_dump("WTBL Segment 3 Raw Data", (UCHAR *)tb, - sizeof(union wtbl_3_struc)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WTBL Segment 3 Fields:\n")); -} - -VOID dump_wtbl_4_info(RTMP_ADAPTER *pAd, struct wtbl_4_struc *tb) -{ - /* hex_dump("WTBL Segment 4 Raw Data", (UCHAR *)tb, sizeof(struct wtbl_4_struc)); */ - /* MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("WTBL Segment 4 Fields:\n")); */ -} - -VOID dump_wtbl_base_info(RTMP_ADAPTER *pAd) -{ - INT idx; - - for (idx = 0; idx < 4; idx++) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tWTBL Segment %d info:\n", idx + 1)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tMemBaseAddr/FID:0x%x/%d\n", - pAd->mac_ctrl.wtbl_base_addr[idx], - pAd->mac_ctrl.wtbl_base_fid[idx])); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tEntrySize/Cnt:%d/%d\n", - pAd->mac_ctrl.wtbl_entry_size[idx], - pAd->mac_ctrl.wtbl_entry_cnt[idx])); - } -} - -#ifdef CONFIG_WTBL_TLV_MODE -VOID dump_wtbl_info_ByTlv(RTMP_ADAPTER *pAd, UINT wtbl_idx) -{ - CMD_WTBL_DUMP_T CmdWtblDump = { 0 }; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("(TLV)Dump WTBL info of WLAN_IDX:%d\n", wtbl_idx)); - CmdWtblDump.u2Tag = cpu_to_le16(WTBL_DUMP); - CmdWtblDump.u2Length = cpu_to_le16(sizeof(CMD_WTBL_DUMP_T)); - CmdExtWtblUpdate(pAd, wtbl_idx, QUERY_WTBL, &CmdWtblDump, - sizeof(CMD_WTBL_DUMP_T)); -} -#endif - -VOID dump_wtbl_info(RTMP_ADAPTER *pAd, UINT wtbl_idx) -{ - INT idx, start_idx, end_idx, tok; - UINT32 addr, val[16]; - struct wtbl_1_struc wtbl_1; - struct wtbl_2_struc wtbl_2; - union wtbl_3_struc wtbl_3; - struct wtbl_4_struc wtbl_4; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT32 wtbl_num = cap->WtblHwNum; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dump WTBL info of WLAN_IDX:%d\n", wtbl_idx)); - - if (wtbl_idx == RESERVED_WCID) { - start_idx = 0; - end_idx = (wtbl_num - 1); - } else if (wtbl_idx < wtbl_num) - start_idx = end_idx = wtbl_idx; - else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid WTBL index(%d)!\n", __func__, - wtbl_idx)); - return; - } - - for (idx = start_idx; idx <= end_idx; idx++) { - /* Read WTBL 1 */ - os_zero_mem((UCHAR *)&wtbl_1, sizeof(struct wtbl_1_struc)); - addr = pAd->mac_ctrl.wtbl_base_addr[0] + - idx * pAd->mac_ctrl.wtbl_entry_size[0]; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WTBL Segment 1 HW Addr:0x%x\n", addr)); - HW_IO_READ32(pAd, addr, &wtbl_1.wtbl_1_d0.word); - HW_IO_READ32(pAd, addr + 4, &wtbl_1.wtbl_1_d1.word); - HW_IO_READ32(pAd, addr + 8, &wtbl_1.wtbl_1_d2.word); - HW_IO_READ32(pAd, addr + 12, &wtbl_1.wtbl_1_d3.word); - HW_IO_READ32(pAd, addr + 16, &wtbl_1.wtbl_1_d4.word); - dump_wtbl_1_info(pAd, &wtbl_1); - /* Read WTBL 2 */ - os_zero_mem((UCHAR *)&wtbl_2, sizeof(struct wtbl_2_struc)); - addr = pAd->mac_ctrl.wtbl_base_addr[1] + - idx * pAd->mac_ctrl.wtbl_entry_size[1]; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WTBL Segment 2 HW Addr:0x%x\n", addr)); - - for (tok = 0; tok < sizeof(struct wtbl_2_struc) / 4; tok++) - HW_IO_READ32(pAd, addr + tok * 4, &val[tok]); - - dump_wtbl_2_info(pAd, (struct wtbl_2_struc *)&val[0]); - /* Read WTBL 3 */ - os_zero_mem((UCHAR *)&wtbl_3, sizeof(union wtbl_3_struc)); - addr = pAd->mac_ctrl.wtbl_base_addr[2] + - idx * pAd->mac_ctrl.wtbl_entry_size[2]; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WTBL Segment 3 HW Addr:0x%x\n", addr)); - - for (tok = 0; tok < sizeof(union wtbl_3_struc) / 4; tok++) - HW_IO_READ32(pAd, addr + tok * 4, &val[tok]); - - dump_wtbl_3_info(pAd, (union wtbl_3_struc *)&val[0]); - /* HW_IO_READ32(pAd, addr, wtbl_3.); */ - /* dump_wtbl_3_info(pAd, &wtbl_3); */ - /* Read WTBL 4 */ - os_zero_mem((UCHAR *)&wtbl_4, sizeof(struct wtbl_4_struc)); - addr = pAd->mac_ctrl.wtbl_base_addr[3] + - idx * pAd->mac_ctrl.wtbl_entry_size[3]; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("WTBL Segment 4 HW Addr:0x%x\n", addr)); - HW_IO_READ32(pAd, addr, &wtbl_4.ac0.word[0]); - HW_IO_READ32(pAd, addr + 4, &wtbl_4.ac0.word[1]); - HW_IO_READ32(pAd, addr + 8, &wtbl_4.ac1.word[0]); - HW_IO_READ32(pAd, addr + 12, &wtbl_4.ac1.word[1]); - HW_IO_READ32(pAd, addr + 16, &wtbl_4.ac2.word[0]); - HW_IO_READ32(pAd, addr + 20, &wtbl_4.ac2.word[1]); - HW_IO_READ32(pAd, addr + 24, &wtbl_4.ac3.word[0]); - HW_IO_READ32(pAd, addr + 28, &wtbl_4.ac3.word[1]); - dump_wtbl_4_info(pAd, &wtbl_4); - } -} - -VOID dump_wtbl_entry(RTMP_ADAPTER *pAd, struct wtbl_entry *ent) -{ - INT idx; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Dump WTBL SW Entry[%d] Cache info\n", ent->wtbl_idx)); - - for (idx = 0; idx < 4; idx++) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tWTBL %d info:\n", idx + 1)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\t\tAddr=0x%x, FID=%d, EID=%d\n", - ent->wtbl_addr[idx], ent->wtbl_fid[idx], - ent->wtbl_eid[idx])); - - switch (idx) { - case 0: - dump_wtbl_1_info(pAd, &ent->wtbl_1); - break; - - case 1: - dump_wtbl_2_info(pAd, &ent->wtbl_2); - break; - - case 2: - dump_wtbl_3_info(pAd, &ent->wtbl_3); - break; - - case 3: - dump_wtbl_4_info(pAd, &ent->wtbl_4); - break; - - default: - break; - } - } -} - -INT mt_wtbl_get_entry234(RTMP_ADAPTER *pAd, UCHAR widx, struct wtbl_entry *ent) -{ - struct rtmp_mac_ctrl *wtbl_ctrl; - UINT8 wtbl_idx, ecnt_per_page; - UINT32 page_offset, element_offset, idx; - - wtbl_ctrl = &pAd->mac_ctrl; - - if (wtbl_ctrl->wtbl_entry_cnt[0] > 0) - wtbl_idx = (widx < wtbl_ctrl->wtbl_entry_cnt[0] ? - widx : - wtbl_ctrl->wtbl_entry_cnt[0] - 1); - else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():PSE not init yet!\n", __func__)); - return FALSE; - } - - ent->wtbl_idx = wtbl_idx; - - for (idx = 0; idx < 4; idx++) { - if (idx == 0) { - /* WTBL 1 */ - ent->wtbl_addr[idx] = - wtbl_ctrl->wtbl_base_addr[0] + - wtbl_idx * wtbl_ctrl->wtbl_entry_size[0]; - ent->wtbl_fid[idx] = 0; - ent->wtbl_eid[idx] = 0; - } else { - /* WTBL 2/3/4 */ - ecnt_per_page = wtbl_ctrl->page_size / - wtbl_ctrl->wtbl_entry_size[idx]; - page_offset = wtbl_idx / ecnt_per_page; - element_offset = wtbl_idx % ecnt_per_page; - ent->wtbl_fid[idx] = - wtbl_ctrl->wtbl_base_fid[idx] + page_offset; - - if (idx == 2) - ent->wtbl_eid[idx] = - (UINT16)(element_offset * 2); - else - ent->wtbl_eid[idx] = (UINT16)element_offset; - - ent->wtbl_addr[idx] = - wtbl_ctrl->wtbl_base_addr[idx] + - page_offset * wtbl_ctrl->page_size + - element_offset * - wtbl_ctrl->wtbl_entry_size[idx]; - } - } - - return TRUE; -} - -INT mt_wtbl_init_ByFw(RTMP_ADAPTER *pAd) -{ - UINT32 page_cnt, ecnt_per_page, offset; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT32 wtbl_num = cap->WtblHwNum; - /* To keep dumping WTBL by vendor request, we need below value form FW */ - /* Currently, below values are got from mt_wtbl_init_ByDriver(), and FW need to provide the same valuse */ - /* wtbl_base_addr[0]=0x28000, wtbl_entry_size[0]=32, wtbl_entry_cnt[0]=32, wtbl_base_fid[0]=0 */ - /* wtbl_base_addr[1]=0x40000, wtbl_entry_size[1]=64, wtbl_entry_cnt[1]=32, wtbl_base_fid[1]=0 */ - /* wtbl_base_addr[2]=0x40800, wtbl_entry_size[2]=64, wtbl_entry_cnt[2]=32, wtbl_base_fid[2]=16 */ - /* wtbl_base_addr[3]=0x41000, wtbl_entry_size[3]=32, wtbl_entry_cnt[3]=32, wtbl_base_fid[3]=32 */ - pAd->mac_ctrl.page_size = - MT_PSE_PAGE_SIZE; /* size in bytes of each PSE page */ - pAd->mac_ctrl.wtbl_base_addr[0] = - WTBL_WTBL1DW0; /* Start address of WTBL2 in host view */ - pAd->mac_ctrl.wtbl_entry_size[0] = sizeof(struct wtbl_1_struc); - pAd->mac_ctrl.wtbl_entry_cnt[0] = (UINT8)wtbl_num; - pAd->mac_ctrl.wtbl_base_fid[0] = 0; - pAd->mac_ctrl.wtbl_base_addr[1] = - MT_PCI_REMAP_ADDR_1; /* Start address of WTBL2 in host view */ - pAd->mac_ctrl.wtbl_entry_size[1] = sizeof(struct wtbl_2_struc); - pAd->mac_ctrl.wtbl_entry_cnt[1] = (UINT8)wtbl_num; - pAd->mac_ctrl.wtbl_base_fid[1] = 0; - ecnt_per_page = pAd->mac_ctrl.page_size / sizeof(struct wtbl_2_struc); - page_cnt = (pAd->mac_ctrl.wtbl_entry_cnt[1] + ecnt_per_page - 1) / - ecnt_per_page; - offset = page_cnt * pAd->mac_ctrl.page_size; - pAd->mac_ctrl.wtbl_base_fid[2] = - pAd->mac_ctrl.wtbl_base_fid[1] + page_cnt; - pAd->mac_ctrl.wtbl_base_addr[2] = - pAd->mac_ctrl.wtbl_base_addr[1] + offset; - pAd->mac_ctrl.wtbl_entry_size[2] = sizeof(union wtbl_3_struc); - pAd->mac_ctrl.wtbl_entry_cnt[2] = (UINT8)wtbl_num; - ecnt_per_page = pAd->mac_ctrl.page_size / sizeof(union wtbl_3_struc); - page_cnt = (pAd->mac_ctrl.wtbl_entry_cnt[2] + ecnt_per_page - 1) / - ecnt_per_page; - offset = page_cnt * pAd->mac_ctrl.page_size; - pAd->mac_ctrl.wtbl_base_fid[3] = - pAd->mac_ctrl.wtbl_base_fid[2] + page_cnt; - pAd->mac_ctrl.wtbl_base_addr[3] = - pAd->mac_ctrl.wtbl_base_addr[2] + offset; - pAd->mac_ctrl.wtbl_entry_size[3] = sizeof(struct wtbl_4_struc); - pAd->mac_ctrl.wtbl_entry_cnt[3] = (UINT8)wtbl_num; - return TRUE; -} - -INT mt_wtbl_init_ByDriver(RTMP_ADAPTER *pAd) -{ - UINT32 page_cnt, ecnt_per_page, offset; - UINT8 cnt = 0; - struct wtbl_entry tb_entry; - union WTBL_1_DW3 *dw3 = - (union WTBL_1_DW3 *)&tb_entry.wtbl_1.wtbl_1_d3.word; - union WTBL_1_DW4 *dw4 = - (union WTBL_1_DW4 *)&tb_entry.wtbl_1.wtbl_1_d4.word; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT32 wtbl_num = cap->WtblHwNum; - - pAd->mac_ctrl.page_size = - MT_PSE_PAGE_SIZE; /* size in bytes of each PSE page */ - pAd->mac_ctrl.wtbl_base_addr[0] = - WTBL_WTBL1DW0; /* Start address of WTBL2 in host view */ - pAd->mac_ctrl.wtbl_entry_size[0] = sizeof(struct wtbl_1_struc); - pAd->mac_ctrl.wtbl_entry_cnt[0] = (UINT8)wtbl_num; - pAd->mac_ctrl.wtbl_base_fid[0] = 0; - pAd->mac_ctrl.wtbl_base_addr[1] = - MT_PCI_REMAP_ADDR_1; /* Start address of WTBL2 in host view */ - pAd->mac_ctrl.wtbl_entry_size[1] = sizeof(struct wtbl_2_struc); - pAd->mac_ctrl.wtbl_entry_cnt[1] = (UINT8)wtbl_num; - pAd->mac_ctrl.wtbl_base_fid[1] = 0; - ecnt_per_page = pAd->mac_ctrl.page_size / sizeof(struct wtbl_2_struc); - page_cnt = (pAd->mac_ctrl.wtbl_entry_cnt[1] + ecnt_per_page - 1) / - ecnt_per_page; - offset = page_cnt * pAd->mac_ctrl.page_size; - pAd->mac_ctrl.wtbl_base_fid[2] = - pAd->mac_ctrl.wtbl_base_fid[1] + page_cnt; - pAd->mac_ctrl.wtbl_base_addr[2] = - pAd->mac_ctrl.wtbl_base_addr[1] + offset; - pAd->mac_ctrl.wtbl_entry_size[2] = sizeof(union wtbl_3_struc); - pAd->mac_ctrl.wtbl_entry_cnt[2] = (UINT8)wtbl_num; - ecnt_per_page = pAd->mac_ctrl.page_size / sizeof(union wtbl_3_struc); - page_cnt = (pAd->mac_ctrl.wtbl_entry_cnt[2] + ecnt_per_page - 1) / - ecnt_per_page; - offset = page_cnt * pAd->mac_ctrl.page_size; - pAd->mac_ctrl.wtbl_base_fid[3] = - pAd->mac_ctrl.wtbl_base_fid[2] + page_cnt; - pAd->mac_ctrl.wtbl_base_addr[3] = - pAd->mac_ctrl.wtbl_base_addr[2] + offset; - pAd->mac_ctrl.wtbl_entry_size[3] = sizeof(struct wtbl_4_struc); - pAd->mac_ctrl.wtbl_entry_cnt[3] = (UINT8)wtbl_num; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): page_size(%d)\n", __func__, __LINE__, - pAd->mac_ctrl.page_size)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): wtbl_base_addr[0]=0x%x, wtbl_entry_size[0]=%d, wtbl_entry_cnt[0]=%d, wtbl_base_fid[0]=%d\n", - __func__, __LINE__, pAd->mac_ctrl.wtbl_base_addr[0], - pAd->mac_ctrl.wtbl_entry_size[0], - pAd->mac_ctrl.wtbl_entry_cnt[0], - pAd->mac_ctrl.wtbl_base_fid[0])); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): wtbl_base_addr[1]=0x%x, wtbl_entry_size[1]=%d, wtbl_entry_cnt[1]=%d, wtbl_base_fid[1]=%d\n", - __func__, __LINE__, pAd->mac_ctrl.wtbl_base_addr[1], - pAd->mac_ctrl.wtbl_entry_size[1], - pAd->mac_ctrl.wtbl_entry_cnt[1], - pAd->mac_ctrl.wtbl_base_fid[1])); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): wtbl_base_addr[2]=0x%x, wtbl_entry_size[2]=%d, wtbl_entry_cnt[2]=%d, wtbl_base_fid[2]=%d\n", - __func__, __LINE__, pAd->mac_ctrl.wtbl_base_addr[2], - pAd->mac_ctrl.wtbl_entry_size[2], - pAd->mac_ctrl.wtbl_entry_cnt[2], - pAd->mac_ctrl.wtbl_base_fid[2])); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): wtbl_base_addr[3]=0x%x, wtbl_entry_size[3]=%d, wtbl_entry_cnt[3]=%d, wtbl_base_fid[3]=%d\n", - __func__, __LINE__, pAd->mac_ctrl.wtbl_base_addr[3], - pAd->mac_ctrl.wtbl_entry_size[3], - pAd->mac_ctrl.wtbl_entry_cnt[3], - pAd->mac_ctrl.wtbl_base_fid[3])); - - for (cnt = 0; cnt < wtbl_num; cnt++) { - os_zero_mem(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, cnt, &tb_entry) == FALSE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Cannot found WTBL2/3/4 for WCID(%d)\n", - __func__, cnt)); - return FALSE; - } - - dw3->field.wtbl2_fid = tb_entry.wtbl_fid[1]; - dw3->field.wtbl2_eid = tb_entry.wtbl_eid[1]; - dw3->field.wtbl4_fid = tb_entry.wtbl_fid[3]; - dw4->field.wtbl3_fid = tb_entry.wtbl_fid[2]; - dw4->field.wtbl3_eid = tb_entry.wtbl_eid[2]; - dw4->field.wtbl4_eid = tb_entry.wtbl_eid[3]; - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 12, dw3->word); - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0] + 16, dw4->word); - tb_entry.wtbl_1.wtbl_1_d0.field.rc_a2 = 1; - tb_entry.wtbl_1.wtbl_1_d0.field.rv = 1; - HW_IO_WRITE32(pAd, tb_entry.wtbl_addr[0], - tb_entry.wtbl_1.wtbl_1_d0.word); - } - - dump_wtbl_base_info(pAd); - return TRUE; -} - -INT mt_wtbl_init(RTMP_ADAPTER *pAd) -{ -#ifdef CONFIG_WTBL_TLV_MODE - /* We can use mt_wtbl_init_ByWtblTlv() to replace mt_wtbl_init_ByDriver() when there are no */ - /* function using mt_wtbl_get_entry234 and pAd->mac_ctrl */ - mt_wtbl_init_ByFw(pAd); -#else - mt_wtbl_init_ByDriver(pAd); -#endif /* CONFIG_WTBL_TLV_MODE */ - return TRUE; -} - -INT mt_hw_tb_init(RTMP_ADAPTER *pAd, BOOLEAN bHardReset) -{ - MT_WCID_TABLE_INFO_T WtblInfo; - /* TODO: shiang-7603 */ - mt_wtbl_init(pAd); - /* Create default entry for rx packets which A2 is not in our table */ - os_zero_mem(&WtblInfo, sizeof(MT_WCID_TABLE_INFO_T)); - os_move_mem(WtblInfo.Addr, BROADCAST_ADDR, MAC_ADDR_LEN); -#ifdef COMPOS_WIN - WtblInfo.Wcid = 0; -#else - WtblInfo.Wcid = 0; -#endif - WtblInfo.WcidType = MT_WCID_TYPE_BMCAST; - MtAsicUpdateRxWCIDTable(pAd, WtblInfo); - return TRUE; -} - -/* - ASIC register initialization sets -*/ -INT mt_mac_init(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s()-->\n", __func__)); - mt_mac_pse_init(pAd); - MtAsicInitMac(pAd); - - /* re-set specific MAC registers for individual chip */ - /* TODO: Shiang-usw-win, here we need call "mt7603_init_mac_cr" for windows! */ - if (ops->AsicMacInit != NULL) - ops->AsicMacInit(pAd); - - /* auto-fall back settings */ - MtAsicAutoFallbackInit(pAd); - - if (pAd->archOps.archSetMacMaxLen) - pAd->archOps.archSetMacMaxLen( - pAd); /* for ATE build failure issue */ - else - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s() archSetMacMaxLen is not supported\n", - __func__)); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("<--%s()\n", __func__)); - return TRUE; -} - -INT mt_nic_asic_init(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - MT_DMASCH_CTRL_T DmaSchCtrl; - - if (AsicWaitPDMAIdle(pAd, 100, 1000) != TRUE) { - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - ret = NDIS_STATUS_FAILURE; - return ret; - } - } - -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) - DmaSchCtrl.bBeaconSpecificGroup = FALSE; -#else - - if (MTK_REV_GTE(pAd, MT7603, MT7603E1) && - MTK_REV_LT(pAd, MT7603, MT7603E2)) - DmaSchCtrl.bBeaconSpecificGroup = FALSE; - else - DmaSchCtrl.bBeaconSpecificGroup = TRUE; - -#endif - DmaSchCtrl.mode = DMA_SCH_LMAC; -#ifdef DMA_SCH_SUPPORT - MtAsicDMASchedulerInit(pAd, DmaSchCtrl); -#endif -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) { - pAd->CommonCfg.bPCIeBus = FALSE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():device act as PCI%s driver\n", __func__, - (pAd->CommonCfg.bPCIeBus ? "-E" : ""))); - } - -#endif /* RTMP_PCI_SUPPORT */ - /* TODO: shiang-7603, init MAC setting */ - /* TODO: shiang-7603, init beacon buffer */ - mt_mac_init(pAd); - mt_hw_tb_init(pAd, TRUE); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Current MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n", - pAd->CurrentAddress[0], pAd->CurrentAddress[1], - pAd->CurrentAddress[2], pAd->CurrentAddress[3], - pAd->CurrentAddress[4], pAd->CurrentAddress[5])); -#ifdef HDR_TRANS_RX_SUPPORT - AsicRxHeaderTransCtl(pAd, TRUE, TRUE, FALSE, TRUE, FALSE); - AsicRxHeaderTaranBLCtl(pAd, 0, TRUE, ETH_TYPE_EAPOL); - AsicRxHeaderTaranBLCtl(pAd, 1, TRUE, ETH_TYPE_WAI); - AsicRxHeaderTaranBLCtl(pAd, 2, TRUE, ETH_TYPE_FASTROAMING); -#endif - return ret; -} - -VOID mt_chip_info_show(RTMP_ADAPTER *pAd) -{ -#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA) || \ - defined(MT7615_FPGA) || defined(MT7637_FPGA) || \ - defined(MT7622_FPGA) || defined(P18_FPGA) || defined(MT7663_FPGA) - UINT32 ver, date_code, rev; - UINT32 mac_val; - - RTMP_IO_READ32(pAd, 0x2700, &ver); - RTMP_IO_READ32(pAd, 0x2704, &rev); - RTMP_IO_READ32(pAd, 0x2708, &date_code); - RTMP_IO_READ32(pAd, 0x201f8, &mac_val); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("##########################################\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(%d): MT7603 Series FPGA Version:\n", __func__, __LINE__)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFGPA1: Code[0x700]:0x%x, [0x704]:0x%x, [0x708]:0x%x\n", - ver, rev, date_code)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tFPGA2: Version[0x201f8]:0x%x\n", mac_val)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("##########################################\n")); -#endif /* defined(MT7622_FPGA) || defined(P18_FPGA) || defined(MT7663_FPGA) */ -#ifndef COMPOS_WIN - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("MAC[Ver:Rev/ID=0x%08x : 0x%08x]\n", pAd->MACVersion, - pAd->ChipID)); -#endif -} - -#if !defined(COMPOS_TESTMODE_WIN) -INT mt_hw_tx(RTMP_ADAPTER *pAd, TX_BLK *tx_blk) -{ - RTMP_ARCH_OP *op = &pAd->archOps; - USHORT free_cnt; - - op->write_tmac_info(pAd, &tx_blk->HeaderBuf[0], tx_blk); - op->archOps.write_tx_resource(pAd, tx_blk, TRUE, &free_cnt); - return NDIS_STATUS_SUCCESS; -} - -INT mt_mlme_hw_tx(RTMP_ADAPTER *pAd, UCHAR *tmac_info, MAC_TX_INFO *info, - HTTRANSMIT_SETTING *transmit, TX_BLK *tx_blk) -{ - RTMP_ARCH_OP *op = &pAd->archOps; - UINT16 free_cnt = 1; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT8 tx_hw_hdr_len = cap->tx_hw_hdr_len; - - op->write_tmac_info_fixed_rate(pAd, tmac_info, info, transmit); -#ifdef RT_BIG_ENDIAN - RTMPFrameEndianChange(pAd, (PUCHAR)pHeader_802_11, DIR_WRITE, FALSE); - MTMacInfoEndianChange(pAd, tmac_info, TYPE_TMACINFO, - sizeof(TMAC_TXD_L)); -#endif - tx_blk->pSrcBufData = tx_blk->pSrcBufHeader; - NdisCopyMemory(&tx_blk->HeaderBuf[0], tx_blk->pSrcBufData, - tx_hw_hdr_len); - tx_blk->pSrcBufData += tx_hw_hdr_len; - tx_blk->SrcBufLen -= tx_hw_hdr_len; - tx_blk->MpduHeaderLen = 0; - tx_blk->wifi_hdr_len = 0; - tx_blk->HdrPadLen = 0; - tx_blk->hw_rsv_len = 0; - op->write_tx_resource(pAd, tx_blk, TRUE, &free_cnt); - return NDIS_STATUS_SUCCESS; -} -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fw_cmd.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fw_cmd.c deleted file mode 100644 index 443a15a40a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fw_cmd.c +++ /dev/null @@ -1,3923 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - fw_cmd.c -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -#ifdef CONFIG_ATE -static VOID EventExtCmdResult(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); -#ifdef RT_BIG_ENDIAN - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); -#endif - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); -} -#endif /* CONFIG_ATE */ - -INT32 CmdInitAccessRegWrite(RTMP_ADAPTER *ad, UINT32 address, UINT32 data) -{ - struct cmd_msg *msg; - struct _INIT_CMD_ACCESS_REG access_reg = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: address = %x, data = %x\n", __func__, address, data)); - msg = AndesAllocCmdMsg(ad, sizeof(struct _INIT_CMD_ACCESS_REG)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, INIT_CMD_ACCESS_REG); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - os_zero_mem(&access_reg, sizeof(access_reg)); - access_reg.ucSetQuery = 1; - access_reg.u4Address = cpu2le32(address); - access_reg.u4Data = cpu2le32(data); - AndesAppendCmdMsg(msg, (char *)&access_reg, sizeof(access_reg)); - ret = AndesSendCmdMsg(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID CmdInitAccessRegReadCb(struct cmd_msg *msg, char *data, UINT16 len) -{ - struct _INIT_EVENT_ACCESS_REG *access_reg = - (struct _INIT_EVENT_ACCESS_REG *)data; - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, &access_reg->u4Data, - len - 4); - *((UINT32 *)(msg->attr.rsp.wb_buf_in_calbk)) = - le2cpu32(*((UINT32 *)msg->attr.rsp.wb_buf_in_calbk)); -} - -INT32 CmdInitAccessRegRead(RTMP_ADAPTER *pAd, UINT32 address, UINT32 *data) -{ - struct cmd_msg *msg; - struct _INIT_CMD_ACCESS_REG access_reg = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: address = %x\n", __func__, address)); - msg = AndesAllocCmdMsg(pAd, sizeof(struct _INIT_CMD_ACCESS_REG)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, INIT_CMD_ACCESS_REG); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, data); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdInitAccessRegReadCb); - AndesInitCmdMsg(msg, attr); - os_zero_mem(&access_reg, sizeof(access_reg)); - access_reg.ucSetQuery = 0; - access_reg.u4Address = cpu2le32(address); - AndesAppendCmdMsg(msg, (char *)&access_reg, sizeof(access_reg)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID CmdHIFLoopbackRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - UINT8 Status; - - Status = *Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("HIF Loopback status=%d\n", Status)); - - switch (Status) { - case TARGET_ADDRESS_LEN_SUCCESS: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Request target address and length success\n", - __func__)); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknow Status(%d)\n", __func__, Status)); - break; - } -} - -INT32 CmdHIFLoopbackReq(RTMP_ADAPTER *ad, UINT32 enable, UINT32 qidx) -{ - struct cmd_msg *msg; - UINT32 value; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(ad, 4); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, MT_HIF_LOOPBACK); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdHIFLoopbackRsp); - AndesInitCmdMsg(msg, attr); - /* start enable */ - enable = (qidx << 16) | (enable & 0xffff); - value = cpu2le32(enable); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("loopback value=0x%x\n", value)); - AndesAppendCmdMsg(msg, (char *)&value, 4); - ret = AndesSendCmdMsg(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdChPrivilege(RTMP_ADAPTER *ad, UINT8 Action, UINT8 control_chl, - UINT8 central_chl, UINT8 BW, UINT8 TXStream, - UINT8 RXStream) -{ - struct cmd_msg *msg; - struct _CMD_CH_PRIVILEGE_T ch_privilege = { 0 }; - INT32 ret = 0; - struct MCU_CTRL *Ctl = &ad->MCUCtrl; - struct _CMD_ATTRIBUTE attr = { 0 }; - - if (central_chl == 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: central channel = 0 is invalid\n", __func__)); - return -1; - } - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: control_chl = %d, central_chl = %d, BW = %d, TXStream = %d, RXStream = %d\n", - __func__, control_chl, central_chl, BW, TXStream, RXStream)); - msg = AndesAllocCmdMsg(ad, sizeof(struct _CMD_CH_PRIVILEGE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, CMD_CH_PRIVILEGE); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - os_zero_mem(&ch_privilege, sizeof(ch_privilege)); - ch_privilege.ucAction = Action; - ch_privilege.ucPrimaryChannel = control_chl; - - if (BW == BAND_WIDTH_20) - ch_privilege.ucRfSco = CMD_CH_PRIV_SCO_SCN; - else if (BW == BAND_WIDTH_40) { - if (control_chl < central_chl) - ch_privilege.ucRfSco = CMD_CH_PRIV_SCO_SCA; - else - ch_privilege.ucRfSco = CMD_CH_PRIV_SCO_SCB; - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("unknown bandwidth = %d\n", BW)); - } - - if (central_chl > 14) - ch_privilege.ucRfBand = CMD_CH_PRIV_BAND_A; - else - ch_privilege.ucRfBand = CMD_CH_PRIV_BAND_G; - - ch_privilege.ucRfChannelWidth = CMD_CH_PRIV_CH_WIDTH_20_40; - ch_privilege.ucReqType = CMD_CH_PRIV_REQ_JOIN; - AndesAppendCmdMsg(msg, (char *)&ch_privilege, sizeof(ch_privilege)); - - if (IS_MT7603(ad) || IS_MT7628(ad) || IS_MT76x6(ad) || IS_MT7637(ad)) { - UINT32 Value; - - RTMP_IO_READ32(ad, RMAC_RMCR, &Value); - - if (Value & RMAC_RMCR_RX_STREAM_0) - Ctl->RxStream0 = 1; - - if (Value & RMAC_RMCR_RX_STREAM_1) - Ctl->RxStream1 = 1; - - Value |= RMAC_RMCR_RX_STREAM_0; - Value |= RMAC_RMCR_RX_STREAM_1; - RTMP_IO_WRITE32(ad, RMAC_RMCR, Value); - } - - ret = AndesSendCmdMsg(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdAccessRegWrite(RTMP_ADAPTER *ad, UINT32 address, UINT32 data) -{ - struct cmd_msg *msg; - struct _CMD_ACCESS_REG_T access_reg = { 0 }; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: address = %x, data = %x\n", __func__, address, data)); - msg = AndesAllocCmdMsg(ad, sizeof(struct _CMD_ACCESS_REG_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, CMD_ACCESS_REG); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - os_zero_mem(&access_reg, sizeof(access_reg)); - access_reg.u4Address = cpu2le32(address); - access_reg.u4Data = cpu2le32(data); - AndesAppendCmdMsg(msg, (char *)&access_reg, sizeof(access_reg)); - ret = AndesSendCmdMsg(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID CmdAccessRegReadCb(struct cmd_msg *msg, char *data, UINT16 len) -{ - struct _CMD_ACCESS_REG_T *access_reg = (struct _CMD_ACCESS_REG_T *)data; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, &access_reg->u4Data, - len - 4); - *((UINT32 *)(msg->attr.rsp.wb_buf_in_calbk)) = - le2cpu32(*((UINT32 *)msg->attr.rsp.wb_buf_in_calbk)); -} - -INT32 CmdAccessRegRead(RTMP_ADAPTER *pAd, UINT32 address, UINT32 *data) -{ - struct cmd_msg *msg; - struct _CMD_ACCESS_REG_T access_reg = { 0 }; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(struct _CMD_ACCESS_REG_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, CMD_ACCESS_REG); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, data); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdAccessRegReadCb); - AndesInitCmdMsg(msg, attr); - os_zero_mem(&access_reg, sizeof(access_reg)); - access_reg.u4Address = cpu2le32(address); - AndesAppendCmdMsg(msg, (char *)&access_reg, sizeof(access_reg)); - ret = AndesSendCmdMsg(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: address = %x, value = %x\n", __func__, address, *data)); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -VOID CmdIOWrite32(RTMP_ADAPTER *pAd, UINT32 Offset, UINT32 Value) -{ - struct MCU_CTRL *Ctl = &pAd->MCUCtrl; - RTMP_REG_PAIR RegPair; - - if (Ctl->fwdl_ctrl.stage == FWDL_STAGE_FW_RUNNING) { - RegPair.Register = Offset; - RegPair.Value = Value; - MtCmdMultipleMacRegAccessWrite(pAd, &RegPair, 1); - } else - CmdInitAccessRegWrite(pAd, Offset, Value); -} - -VOID CmdIORead32(struct _RTMP_ADAPTER *pAd, UINT32 Offset, UINT32 *Value) -{ - struct MCU_CTRL *Ctl = &pAd->MCUCtrl; - RTMP_REG_PAIR RegPair; - - if (Ctl->fwdl_ctrl.stage == FWDL_STAGE_FW_RUNNING) { - RegPair.Register = Offset; - MtCmdMultipleMacRegAccessRead(pAd, &RegPair, 1); - *Value = RegPair.Value; - } else - CmdInitAccessRegRead(pAd, Offset, Value); -} - -static VOID EventExtNicCapability(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - EXT_EVENT_NIC_CAPABILITY *ExtEventNicCapability = - (EXT_EVENT_NIC_CAPABILITY *)Data; - UINT32 Loop; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("The data code of firmware:")); - - for (Loop = 0; Loop < 16; Loop++) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%c", ExtEventNicCapability->aucDateCode[Loop])); - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nThe version code of firmware:")); - - for (Loop = 0; Loop < 12; Loop++) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%c", ExtEventNicCapability->aucVersionCode[Loop])); - } -} - -INT32 CmdNicCapability(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, 0); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NIC_CAPABILITY); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 28); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtNicCapability); - AndesInitCmdMsg(msg, attr); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#ifdef CONFIG_ATE -INT32 CmdTxContinous(RTMP_ADAPTER *pAd, UINT32 PhyMode, UINT32 BW, UINT32 PriCh, - UINT32 Mcs, UINT32 WFSel, UCHAR onoff) -{ - struct cmd_msg *msg; - struct _CMD_TEST_CTRL_T ContiTXParam = { 0 }; - INT32 ret = 0; - UCHAR TXDRate = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, mode:0x%x, bw:0x%x, prich(Control CH):0x%x, mcs:0x%x, wfsel:0x%x, on/off:0x%x\n", - __func__, PhyMode, BW, PriCh, Mcs, WFSel, onoff)); - msg = AndesAllocCmdMsg(pAd, sizeof(ContiTXParam)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_RF_TEST); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - AndesInitCmdMsg(msg, attr); - os_zero_mem(&ContiTXParam, sizeof(ContiTXParam)); - ContiTXParam.ucAction = ACTION_IN_RFTEST; - - if (onoff == 0) - ContiTXParam.u.rRfATInfo.u4FuncIndex = CONTINUOUS_TX_STOP; - else - ContiTXParam.u.rRfATInfo.u4FuncIndex = CONTINUOUS_TX_START; - - /* 0: All 1:TX0 2:TX1 */ - ContiTXParam.u.rRfATInfo.Data.rConTxParam.ucCentralCh = PriCh; - - if (BW_40 == BW || BW_80 == BW) - ContiTXParam.u.rRfATInfo.Data.rConTxParam.ucCtrlCh = - (PriCh + 2); - else - ContiTXParam.u.rRfATInfo.Data.rConTxParam.ucCtrlCh = PriCh; - - ContiTXParam.u.rRfATInfo.Data.rConTxParam.ucAntIndex = WFSel; - - if (PhyMode == 0) { /* CCK */ - switch (Mcs) { - /* long preamble */ - case 0: - TXDRate = 0; - break; - - case 1: - TXDRate = 1; - break; - - case 2: - TXDRate = 2; - break; - - case 3: - TXDRate = 3; - break; - - /* short preamble */ - case 9: - TXDRate = 5; - break; - - case 10: - TXDRate = 6; - break; - - case 11: - TXDRate = 7; - break; - } - } else if (PhyMode == 1) { /* OFDM */ - switch (Mcs) { - case 0: - TXDRate = 11; - break; - - case 1: - TXDRate = 15; - break; - - case 2: - TXDRate = 10; - break; - - case 3: - TXDRate = 14; - break; - - case 4: - TXDRate = 9; - break; - - case 5: - TXDRate = 13; - break; - - case 6: - TXDRate = 8; - break; - - case 7: - TXDRate = 12; - break; - } - } else if (2 == PhyMode || 3 == PhyMode || 4 == PhyMode) { - /* 2. MODULATION_SYSTEM_HT20 ||3. MODULATION_SYSTEM_HT40 || 4. VHT */ - TXDRate = Mcs; - } - - ContiTXParam.u.rRfATInfo.Data.rConTxParam.u2RateCode = - Mcs << 6 | TXDRate; -#ifdef RT_BIG_ENDIAN - ContiTXParam.u.rRfATInfo.u4FuncIndex = - cpu2le32(ContiTXParam.u.rRfATInfo.u4FuncIndex); - ContiTXParam.u.rRfATInfo.Data.rConTxParam.u2RateCode = - cpu2le32(ContiTXParam.u.rRfATInfo.Data.rConTxParam.u2RateCode); -#endif - AndesAppendCmdMsg(msg, (char *)&ContiTXParam, sizeof(ContiTXParam)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxTonePower(RTMP_ADAPTER *pAd, INT32 type, INT32 dec) -{ - struct cmd_msg *msg; - struct _CMD_TEST_CTRL_T TestCtrl; - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(TestCtrl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, type:%d, dec:%d\n", __func__, type, dec)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_RF_TEST); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - AndesInitCmdMsg(msg, attr); - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = ACTION_IN_RFTEST; - TestCtrl.u.rRfATInfo.u4FuncIndex = cpu2le32(type); - - /* 0: All 1:TX0 2:TX1 */ - switch (ATECtrl->TxAntennaSel) { - case 0: - TestCtrl.u.rRfATInfo.Data.rTxToneGainParam.ucAntIndex = 0; - break; - - case 1: - TestCtrl.u.rRfATInfo.Data.rTxToneGainParam.ucAntIndex = 1; - break; - - case 2: - TestCtrl.u.rRfATInfo.Data.rTxToneGainParam.ucAntIndex = 2; - break; - - default: - /* for future more than 3*3 ant */ - TestCtrl.u.rRfATInfo.Data.rTxToneGainParam.ucAntIndex = - ATECtrl->TxAntennaSel - 1; - break; - } - - TestCtrl.u.rRfATInfo.Data.rTxToneGainParam.ucTonePowerGain = dec; - AndesAppendCmdMsg(msg, (char *)&TestCtrl, sizeof(TestCtrl)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* CONFIG_ATE */ - -#ifdef COEX_SUPPORT -INT AndesCoexOP(IN PRTMP_ADAPTER pAd, IN UCHAR Status) -{ - struct cmd_msg *msg; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret; - EXT_CMD_COEXISTENCE_T coext_t; - COEX_WIFI_STATUS_UPDATE_T coex_status; - UINT32 SetBtWlanStatus; - - ret = 0; - os_zero_mem(&coext_t, sizeof(EXT_CMD_COEXISTENCE_T)); - os_zero_mem(&coex_status, sizeof(COEX_WIFI_STATUS_UPDATE_T)); - msg = AndesAllocCmdMsg(pAd, sizeof(EXT_CMD_COEXISTENCE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_BT_COEX); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - coext_t.ucSubOpCode = COEX_WIFI_STATUS_UPDATE; - coex_status.u4WIFIStatus = 0x00; - SetBtWlanStatus = pAd->BtWlanStatus; - - switch (Status) { - case STATUS_RADIO_ON: - SetBtWlanStatus |= COEX_STATUS_RADIO_ON; - break; - - case STATUS_RADIO_OFF: - SetBtWlanStatus &= ~(COEX_STATUS_RADIO_ON); - break; - - case STATUS_SCAN_G_BAND: - SetBtWlanStatus |= COEX_STATUS_SCAN_G_BAND; - break; - - case STATUS_SCAN_G_BAND_END: - SetBtWlanStatus &= ~(COEX_STATUS_SCAN_G_BAND); - break; - - case STATUS_SCAN_A_BAND: - SetBtWlanStatus |= COEX_STATUS_SCAN_A_BAND; - break; - - case STATUS_SCAN_A_BAND_END: - SetBtWlanStatus &= ~(COEX_STATUS_SCAN_A_BAND); - break; - - case STATUS_LINK_UP: - SetBtWlanStatus |= COEX_STATUS_LINK_UP; - break; - - case STATUS_LINK_DOWN: - SetBtWlanStatus &= ~(COEX_STATUS_LINK_UP); - break; - - case STATUS_BT_OVER_WIFI: - SetBtWlanStatus |= COEX_STATUS_BT_OVER_WIFI; - break; - - default: /* fatal error */ - break; - } /* End of switch */ - - if (SetBtWlanStatus == pAd->BtWlanStatus) - goto error; - else - pAd->BtWlanStatus = SetBtWlanStatus; - - coex_status.u4WIFIStatus = pAd->BtWlanStatus; - /* Parameter */ -#ifdef RT_BIG_ENDIAN - coex_status.u4WIFIStatus = cpu2le32(coex_status.u4WIFIStatus); -#endif - os_move_mem(coext_t.aucData, &coex_status, - sizeof(COEX_WIFI_STATUS_UPDATE_T)); - hex_dump("AndesBtCoex: ", (UCHAR *)&coext_t, - sizeof(EXT_CMD_COEXISTENCE_T)); - AndesAppendCmdMsg(msg, (char *)&coext_t, sizeof(EXT_CMD_COEXISTENCE_T)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT AndesCoexProtectionFrameOP(IN PRTMP_ADAPTER pAd, IN UCHAR Mode, - IN UCHAR Rate) -{ - struct cmd_msg *msg; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret; - EXT_CMD_COEXISTENCE_T coext_t; - COEX_SET_PROTECTION_FRAME_T coex_proction; - - ret = 0; - os_zero_mem(&coext_t, sizeof(EXT_CMD_COEXISTENCE_T)); - os_zero_mem(&coex_proction, sizeof(COEX_SET_PROTECTION_FRAME_T)); - msg = AndesAllocCmdMsg(pAd, sizeof(EXT_CMD_COEXISTENCE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_BT_COEX); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - coext_t.ucSubOpCode = COEX_SET_PROTECTION_FRAME; - coex_proction.ucProFrameMode = Mode; - coex_proction.ucProFrameRate = Rate; - os_move_mem(coext_t.aucData, &coex_proction, - sizeof(COEX_SET_PROTECTION_FRAME_T)); - hex_dump("AndesBtCoexProtection: ", (UCHAR *)&coext_t, - sizeof(EXT_CMD_COEXISTENCE_T)); - AndesAppendCmdMsg(msg, (char *)&coext_t, sizeof(EXT_CMD_COEXISTENCE_T)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT AndesCoexBSSInfo(IN PRTMP_ADAPTER pAd, IN BOOLEAN Enable, IN UCHAR bQoS) -{ - struct cmd_msg *msg; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret; - EXT_CMD_COEXISTENCE_T coext_t; - COEX_UPDATE_BSS_INFO_T coex_bss_info; - - ret = 0; - os_zero_mem(&coext_t, sizeof(EXT_CMD_COEXISTENCE_T)); - os_zero_mem(&coex_bss_info, sizeof(COEX_UPDATE_BSS_INFO_T)); - msg = AndesAllocCmdMsg(pAd, sizeof(EXT_CMD_COEXISTENCE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_BT_COEX); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - coext_t.ucSubOpCode = COEX_UPDATE_BSS_INFO; - - if (Enable) { - coex_bss_info.u4BSSPresence[0] = 0x1; - coex_bss_info.u4IsQBSS[0] = bQoS; - } else { - coex_bss_info.u4BSSPresence[0] = 0x0; - coex_bss_info.u4IsQBSS[0] = 0; - } - - os_move_mem(coext_t.aucData, &coex_bss_info, - sizeof(COEX_UPDATE_BSS_INFO_T)); - hex_dump("AndesBtCoexProtection: ", (UCHAR *)&coext_t, - sizeof(EXT_CMD_COEXISTENCE_T)); - AndesAppendCmdMsg(msg, (char *)&coext_t, sizeof(EXT_CMD_COEXISTENCE_T)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif - -/* WTBL manipulation function*/ -PNDIS_PACKET WtblTlvBufferAlloc(RTMP_ADAPTER *pAd, UINT32 u4AllocateSize) -{ - PNDIS_PACKET net_pkt = NULL; - - net_pkt = RTMP_AllocateFragPacketBuffer(pAd, u4AllocateSize); - - if (net_pkt == NULL) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Can not allocate net_pkt\n", __func__)); - return NULL; - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::Allocate(%p)\n", __func__, net_pkt)); - return net_pkt; -} - -VOID WtblTlvBufferAppend(PNDIS_PACKET pWtblTlvBuffer, UINT16 u2Type, - UINT16 u2Length, PUCHAR pNextWtblTlvBuffer) -{ - if ((pNextWtblTlvBuffer != NULL) && (u2Length != 0)) { - P_CMD_WTBL_GENERIC_TLV_T pWtblGenericTlv = - (P_CMD_WTBL_GENERIC_TLV_T)pNextWtblTlvBuffer; - pWtblGenericTlv->u2Tag = u2Type; - pWtblGenericTlv->u2Length = u2Length; - os_move_mem(OS_PKT_TAIL_BUF_EXTEND(pWtblTlvBuffer, u2Length), - pNextWtblTlvBuffer, u2Length); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::T(%d), L(%d), V(%p)\n", __func__, - pWtblGenericTlv->u2Tag, pWtblGenericTlv->u2Length, - pNextWtblTlvBuffer)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Can not append WTBL TLV\n", __func__)); - } -} - -/* WTBL TLV buffer free*/ -VOID WtblTlvBufferFree(RTMP_ADAPTER *pAd, PNDIS_PACKET pWtblTlvBuffer) -{ - if (pWtblTlvBuffer != NULL) { - RTMPFreeNdisPacket(pAd, pWtblTlvBuffer); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::Free buffer(%p)\n", __func__, pWtblTlvBuffer)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Fail to free buffer(%p)\n", __func__, - pWtblTlvBuffer)); - } -} - -VOID *pTlvAppend(VOID *pTlvBuffer, UINT16 u2Type, UINT16 u2Length, - VOID *pNextTlvBuffer, UINT32 *pu4TotalTlvLen, - UCHAR *pucTotalTlvNumber) -{ - if ((pNextTlvBuffer != NULL) && (u2Length != 0)) { - P_CMD_WTBL_GENERIC_TLV_T pWtblGenericTlv = - (P_CMD_WTBL_GENERIC_TLV_T)pNextTlvBuffer; - pWtblGenericTlv->u2Tag = u2Type; - pWtblGenericTlv->u2Length = u2Length; - *pu4TotalTlvLen += u2Length; - *pucTotalTlvNumber += 1; - os_move_mem((PUCHAR)pTlvBuffer, (PUCHAR)pWtblGenericTlv, - u2Length); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::T(%d), L(%d), V(%p)\n", __func__, - pWtblGenericTlv->u2Tag, pWtblGenericTlv->u2Length, - pNextTlvBuffer)); - return (pTlvBuffer + u2Length); - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Can not append WTBL TLV\n", __func__)); - return NULL; -} - -static VOID CmdExtTlvUpdateRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); -} - -INT32 CmdExtTlvBufferSend(RTMP_ADAPTER *pAd, UINT8 ExtCmdType, VOID *pTlvBuffer, - UINT32 u4TlvLength) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* Allocte CMD msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(CMD_STAREC_COMMON_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, ExtCmdType); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtTlvUpdateRsp); - AndesInitCmdMsg(msg, attr); - /* Copy TLV buffer to CMD msg */ - AndesAppendCmdMsg(msg, (char *)pTlvBuffer, u4TlvLength); - /* Send out CMD msg */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -static VOID CmdExtWtblUpdateCb(struct cmd_msg *msg, char *data, UINT16 len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)data; - UINT32 u4Len = len - 20 - sizeof(CMD_WTBL_UPDATE_T); - PUCHAR pData = (PCHAR)(data + 20 + sizeof(CMD_WTBL_UPDATE_T)); - PUCHAR pRspPayload = (PUCHAR)msg->attr.rsp.wb_buf_in_calbk; - - if (pRspPayload == NULL) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = - le2cpu32(EventExtCmdResult->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Copy query result to buffer\n", __func__)); - os_move_mem(pRspPayload, pData, u4Len); - } -} - -INT32 CmdExtWtblUpdate(RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, UINT8 ucOperation, - VOID *pBuffer, UINT32 u4BufferLen) -{ - struct cmd_msg *msg = NULL; - CMD_WTBL_UPDATE_T CmdWtblUpdate = { 0 }; - INT32 Ret = 0; - UINT32 u4EnableFeature = 0; - UINT16 ucTLVNumber = 0; - UINT16 u2Len = 0; - UINT32 *pRspPayload = NULL; - P_CMD_WTBL_GENERIC_TLV_T pWtblGenericTlv = NULL; - UINT8 ucRemainingTLVNumber = 0; - UINT32 u4RemainingTLVBufLen = 0; - PUCHAR TempBuffer = (PUCHAR)pBuffer; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, MAX_BUF_SIZE_OF_WTBL_INFO + 100); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - /* Get TVL number from TLV buffer*/ - u4RemainingTLVBufLen = u4BufferLen; - - while (u4RemainingTLVBufLen > 0) { - pWtblGenericTlv = (P_CMD_WTBL_GENERIC_TLV_T)TempBuffer; - - if (pWtblGenericTlv == NULL) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, pWtblGenericTlv is NULL\n", __func__)); - Ret = NDIS_STATUS_INVALID_DATA; - break; - } else if (pWtblGenericTlv->u2Length == 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, fail to handle T(%d), L(%d)\n", __func__, - pWtblGenericTlv->u2Tag, - pWtblGenericTlv->u2Length)); - Ret = NDIS_STATUS_INVALID_DATA; - break; - } - - u4EnableFeature |= (1 << (pWtblGenericTlv->u2Tag)); - TempBuffer += pWtblGenericTlv->u2Length; - u4RemainingTLVBufLen -= pWtblGenericTlv->u2Length; - ucTLVNumber++; - } - - if (Ret != 0) - goto Error1; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s, ucTLVNumber = %d\n", __func__, ucTLVNumber)); - /* Assign vlaue to related parameters */ - TempBuffer = (PUCHAR)pBuffer; - ucRemainingTLVNumber = ucTLVNumber; - u4RemainingTLVBufLen = u4BufferLen; - - /* Set correct length and RspPayload buffer with different operation */ - if (ucOperation == RESET_WTBL_AND_SET) { - if (pBuffer != NULL) { - /* Reset a specific WCID and set WTBL TLV */ - u2Len = 8; - pRspPayload = NULL; - } else if (u4RemainingTLVBufLen == 0) { /* NULL */ - /* Reset a specific WCID only */ - u2Len = 8; - pRspPayload = NULL; - } - } else if (ucOperation == SET_WTBL) { - if (pBuffer != NULL) { - u2Len = 8; - pRspPayload = NULL; - } else - return NDIS_STATUS_FAILURE; - } else if (ucOperation == QUERY_WTBL) { - if (pBuffer != NULL) { - u2Len = u4BufferLen + 20 + sizeof(CMD_WTBL_UPDATE_T); - pRspPayload = (UINT32 *)pBuffer; - } else - return NDIS_STATUS_FAILURE; - } else if (ucOperation == RESET_ALL_WTBL) { - if (pBuffer == NULL && u4RemainingTLVBufLen == 0) { - u2Len = 8; - pRspPayload = NULL; - } else - return NDIS_STATUS_FAILURE; - } else { - /* Error */ - return NDIS_STATUS_FAILURE; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_WTBL_UPDATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, u2Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pRspPayload); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtWtblUpdateCb); - AndesInitCmdMsg(msg, attr); - CmdWtblUpdate.ucWlanIdx = ucWlanIdx; - CmdWtblUpdate.ucOperation = ucOperation; - CmdWtblUpdate.u2TotalElementNum = cpu2le16(ucTLVNumber); - AndesAppendCmdMsg(msg, (char *)&CmdWtblUpdate, - sizeof(CMD_WTBL_UPDATE_T)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s, ucWlanIdx = %d, ucOperation = %d, u4EnableFeature = 0x%x\n", - __func__, ucWlanIdx, ucOperation, u4EnableFeature)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s, ucRemainingTLVNumber = %d, u2RemainingTLVBufLen = %d\n", - __func__, ucRemainingTLVNumber, u4RemainingTLVBufLen)); - - /* Handle TVL request here */ - while ((ucRemainingTLVNumber > 0) && (u4RemainingTLVBufLen > 0)) { - /* Get current TLV */ - pWtblGenericTlv = (P_CMD_WTBL_GENERIC_TLV_T)TempBuffer; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s, TLV(%d, %d)\n", __func__, pWtblGenericTlv->u2Tag, - pWtblGenericTlv->u2Length)); - - /* Handle this TLV */ - switch (pWtblGenericTlv->u2Tag) { - /* Tag = 0 */ - case WTBL_GENERIC: { - P_CMD_WTBL_GENERIC_T pCmdWtblGeneric = - (P_CMD_WTBL_GENERIC_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_GENERIC), ucMUARIndex = %d, ucSkipTx = %d,ucCfAck = %d, ucQos = %d, ucQos = %d, ucAdm = %d, PartialAID = %d, aucPeerAddress(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, pCmdWtblGeneric->ucMUARIndex, - pCmdWtblGeneric->ucSkipTx, - pCmdWtblGeneric->ucCfAck, - pCmdWtblGeneric->ucQos, - pCmdWtblGeneric->ucMesh, - pCmdWtblGeneric->ucAdm, - pCmdWtblGeneric->u2PartialAID, - PRINT_MAC(pCmdWtblGeneric - ->aucPeerAddress))); -#ifdef RT_BIG_ENDIAN - pCmdWtblGeneric->u2PartialAID = - cpu2le16(pCmdWtblGeneric->u2PartialAID); -#endif - } else if (ucOperation == QUERY_WTBL) { - /* No need to fill real parameters when query and - * just append all zero data buffer to msg - */ - } - - break; - } - - /* Tag = 1 */ - case WTBL_RX: { - P_CMD_WTBL_RX_T pCmdWtblRx = - (P_CMD_WTBL_RX_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_RX), ucRcid = %d, ucRca1 = %d, ucRca2 = %d, ucRv = %d\n", - __func__, pCmdWtblRx->ucRcid, - pCmdWtblRx->ucRca1, pCmdWtblRx->ucRca2, - pCmdWtblRx->ucRv)); - } - - break; - } - - /* Tag = 2 */ - case WTBL_HT: { - P_CMD_WTBL_HT_T pCmdWtblHt = - (P_CMD_WTBL_HT_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_HT), ucHt = %d, ucLdpc = %d, ucAf = %d, ucMm = %d\n", - __func__, pCmdWtblHt->ucHt, - pCmdWtblHt->ucLdpc, pCmdWtblHt->ucAf, - pCmdWtblHt->ucMm)); - } - - break; - } - - /* Tag = 3 */ - case WTBL_VHT: { - P_CMD_WTBL_VHT_T pCmdWtblVht = - (P_CMD_WTBL_VHT_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_VHT), ucLdpcVht = %d, ucDynBw= %d, ucVht = %d, ucTxopPsCap = %d\n", - __func__, pCmdWtblVht->ucLdpcVht, - pCmdWtblVht->ucDynBw, - pCmdWtblVht->ucVht, - pCmdWtblVht->ucTxopPsCap)); - } - - break; - } - - /* Tag = 4 */ - case WTBL_PEER_PS: { - P_CMD_WTBL_PEER_PS_T pCmdWtblPerPs = - (P_CMD_WTBL_PEER_PS_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_PEER_PS), ucDuIPsm = %d, ucIPsm = %d\n", - __func__, pCmdWtblPerPs->ucDuIPsm, - pCmdWtblPerPs->ucIPsm)); - } - - break; - } - - /* Tag = 5 */ - case WTBL_TX_PS: { - P_CMD_WTBL_TX_PS_T pCmdWtbTxPs = - (P_CMD_WTBL_TX_PS_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_TX_PS), ucTxPs = %d\n", - __func__, pCmdWtbTxPs->ucTxPs)); - } - - break; - } - - /* Tag = 6 */ - case WTBL_HDR_TRANS: { - P_CMD_WTBL_HDR_TRANS_T pCmdWtblHdrTrans = - (P_CMD_WTBL_HDR_TRANS_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_HDR_TRANS), ucTd = %d, ucFd = %d, ucDisRhtr =%d\n", - __func__, pCmdWtblHdrTrans->ucTd, - pCmdWtblHdrTrans->ucFd, - pCmdWtblHdrTrans->ucDisRhtr)); - } - - break; - } - - /* Tag = 7 */ - case WTBL_SECURITY_KEY: { - P_CMD_WTBL_SECURITY_KEY_T pCmdWtblSecurityKey = - (P_CMD_WTBL_SECURITY_KEY_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_SECURITY_KEY), ucAddRemove = %d, ucRkv = %d, ucIkv =%d, ucAlgorithmId = %d, ucKeyId = %d, ucKeyLen = %d\n", - __func__, - pCmdWtblSecurityKey->ucAddRemove, - pCmdWtblSecurityKey->ucRkv, - pCmdWtblSecurityKey->ucIkv, - pCmdWtblSecurityKey->ucAlgorithmId, - pCmdWtblSecurityKey->ucKeyId, - pCmdWtblSecurityKey->ucKeyLen)); - } - - break; - } - - /* Tag = 8 */ - case WTBL_BA: { - P_CMD_WTBL_BA_T pCmdWtblBa = - (P_CMD_WTBL_BA_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - if (pCmdWtblBa->ucBaSessionType == - BA_SESSION_RECP) { - /* Recipient */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_BA, Recipient), ucTid(%d), ucBaSessionType(%d), ucRstBaTid(%d), ucRstBaSel(%d), ucStartRstBaSb(%d), aucPeerAddress(%02x:%02x:%02x:%02x:%02x:%02x)\n", - __func__, pCmdWtblBa->ucTid, - pCmdWtblBa->ucBaSessionType, - pCmdWtblBa->ucRstBaTid, - pCmdWtblBa->ucRstBaSel, - pCmdWtblBa->ucStartRstBaSb, - PRINT_MAC( - pCmdWtblBa - ->aucPeerAddress))); - } else { - /* Originator */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_BA, Originator), ucTid(%d), u2Sn(%d), ucBaEn(%d), ucBaSize(%d)\n", - __func__, pCmdWtblBa->ucTid, - pCmdWtblBa->u2Sn, - pCmdWtblBa->ucBaEn, - pCmdWtblBa->ucBaSize)); - } - } -#ifdef RT_BIG_ENDIAN - pCmdWtblBa->u2Sn = cpu2le16(pCmdWtblBa->u2Sn); -#endif - - break; - } - - /* Tag = 9 */ - case WTBL_RDG: { - P_CMD_WTBL_RDG_T pCmdWtblRdg = - (P_CMD_WTBL_RDG_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_RDG), ucRdgBa = %d, ucR = %d\n", - __func__, pCmdWtblRdg->ucRdgBa, - pCmdWtblRdg->ucR)); - } - - break; - } - - /* Tag = 10 */ - case WTBL_PROTECTION: { - P_CMD_WTBL_PROTECTION_T pCmdWtblProtection = - (P_CMD_WTBL_PROTECTION_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_PROTECTION), ucRts = %d\n", - __func__, pCmdWtblProtection->ucRts)); - } - - break; - } - - /* Tag = 11 */ - case WTBL_CLEAR: { - /* bit 0: Clear PSM (WF_WTBLON: 0x60322300, Bit 31 set 1 then set 0) */ - /* bit 1: Clear BA (WTBL2.DW15) */ - /* bit 2: Clear Rx Counter (6019_00002, bit 14) */ - /* bit 3: Clear Tx Counter (6019_0000, bit 15) */ - /* bit 4: Clear ADM Counter (6019_0000, bit 12) */ - /* bit 5: Clear Cipher key (WTBL3)*/ - P_CMD_WTBL_CLEAR_T pCmdWtblClear = - (P_CMD_WTBL_CLEAR_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_CLEAR), ucClear = %x\n", - __func__, pCmdWtblClear->ucClear)); - } - - break; - } - - /* Tag = 12 */ - case WTBL_BF: { - P_CMD_WTBL_BF_T pCmdWtblBf = - (P_CMD_WTBL_BF_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_BF), ucTiBf = %d, ucTeBf = %d, ucTibfVh = %d, ucTebfVht = %d, ucGid = %d, ucPfmuIdx = %d\n", - __func__, pCmdWtblBf->ucTiBf, - pCmdWtblBf->ucTeBf, - pCmdWtblBf->ucTibfVht, - pCmdWtblBf->ucTebfVht, - pCmdWtblBf->ucGid, - pCmdWtblBf->ucPFMUIdx)); - } - - break; - } - - /* Tag = 13 */ - case WTBL_SMPS: { - P_CMD_WTBL_SMPS_T pCmdWtblSmPs = - (P_CMD_WTBL_SMPS_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_SMPS), ucSmPs = %d\n", - __func__, pCmdWtblSmPs->ucSmPs)); - } - - break; - } - - /* Tag = 14 */ - case WTBL_RAW_DATA_RW: { - P_CMD_WTBL_RAW_DATA_RW_T pCmdWtblRawDataRw = - (P_CMD_WTBL_RAW_DATA_RW_T)TempBuffer; - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(WTBL_RAW_DATA_RW), ucWtblIdx = %d, ucWhichDW = %d, u4DwMask = 0x%x, u4DwValue = 0x%x\n", - __func__, pCmdWtblRawDataRw->ucWtblIdx, - pCmdWtblRawDataRw->ucWhichDW, - pCmdWtblRawDataRw->u4DwMask, - pCmdWtblRawDataRw->u4DwValue)); -#ifdef RT_BIG_ENDIAN - pCmdWtblRawDataRw->u4DwMask = - cpu2le32(pCmdWtblRawDataRw->u4DwMask); - pCmdWtblRawDataRw->u4DwValue = - cpu2le32(pCmdWtblRawDataRw->u4DwValue); -#endif - break; - } - - /* Tag = 15 */ - case WTBL_DUMP: { - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_DUMP), WTBL_BUFFER_SIZE = %d\n", - __func__, WTBL_BUFFER_SIZE)); - /* Fill value format */ - /* No need to fill this argument */ - } - - break; - } - - /* Tag = 16 */ - case WTBL_SPE: { - P_CMD_WTBL_SPE_T pCmdWtblSpe = - (P_CMD_WTBL_SPE_T)TempBuffer; - - if ((ucOperation == RESET_WTBL_AND_SET) || - (ucOperation == SET_WTBL)) { - /* Print argumrnts */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s(WTBL_BF), ucSpeIdx = %d\n", - __func__, pCmdWtblSpe->ucSpeIdx)); - } - - break; - } - - default: { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s, Unknown WTBL TLV Tag(%d)\n", __func__, - pWtblGenericTlv->u2Tag)); - break; - } - } - - /* Advance to next TLV */ - TempBuffer += pWtblGenericTlv->u2Length; - u4RemainingTLVBufLen -= pWtblGenericTlv->u2Length; - ucRemainingTLVNumber--; -#ifdef RT_BIG_ENDIAN - pWtblGenericTlv->u2Length = cpu2le16(pWtblGenericTlv->u2Length); - pWtblGenericTlv->u2Tag = cpu2le16(pWtblGenericTlv->u2Tag); -#endif - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s in while loop, ucRemainingTLVNumber = %d, u2RemainingTLVBufLen = %d\n", - __func__, ucRemainingTLVNumber, u4RemainingTLVBufLen)); - } - - AndesAppendCmdMsg(msg, (PUCHAR)pBuffer, u4BufferLen); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); - goto Success; -Error1: - - if (msg) - AndesFreeCmdMsg(msg); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -Success: -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -UINT32 WtblDwQuery(RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, UINT8 ucWtbl1234, - UINT8 ucWhichDW) -{ - CMD_WTBL_RAW_DATA_RW_T rWtblRawDataRwWtblDw = { 0 }; - - rWtblRawDataRwWtblDw.u2Tag = WTBL_RAW_DATA_RW; - rWtblRawDataRwWtblDw.u2Length = sizeof(CMD_WTBL_RAW_DATA_RW_T); - rWtblRawDataRwWtblDw.ucWtblIdx = ucWtbl1234; - rWtblRawDataRwWtblDw.ucWhichDW = ucWhichDW; - CmdExtWtblUpdate(pAd, ucWlanIdx, QUERY_WTBL, &rWtblRawDataRwWtblDw, - rWtblRawDataRwWtblDw.u2Length); - return rWtblRawDataRwWtblDw.u4DwValue; -} - -INT32 WtblDwSet(RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, UINT8 ucWtbl1234, - UINT8 ucWhichDW, UINT32 u4DwMask, UINT32 u4DwValue) -{ - INT32 ret; - CMD_WTBL_RAW_DATA_RW_T rWtblRawDataRwWtblDw = { 0 }; - - rWtblRawDataRwWtblDw.u2Tag = WTBL_RAW_DATA_RW; - rWtblRawDataRwWtblDw.u2Length = sizeof(CMD_WTBL_RAW_DATA_RW_T); - rWtblRawDataRwWtblDw.ucWtblIdx = ucWtbl1234; - rWtblRawDataRwWtblDw.ucWhichDW = ucWhichDW; - rWtblRawDataRwWtblDw.u4DwMask = u4DwMask; - rWtblRawDataRwWtblDw.u4DwValue = u4DwValue; - ret = CmdExtWtblUpdate(pAd, ucWlanIdx, SET_WTBL, &rWtblRawDataRwWtblDw, - rWtblRawDataRwWtblDw.u2Length); - return ret; -} - -INT32 WtblResetAndDWsSet(RTMP_ADAPTER *pAd, UINT8 ucWlanIdx, UINT8 ucWtbl1234, - INT dw_cnt, struct cmd_wtbl_dw_mask_set *dw_set) -{ - INT32 ret = 0; - CMD_WTBL_RAW_DATA_RW_T rWtblRawDataRwWtblDw; - INT cmd_cnt; - UINT8 cmd_op; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s\n", __func__)); - - for (cmd_cnt = 0; cmd_cnt < dw_cnt; cmd_cnt++) { - NdisZeroMemory((UCHAR *)&rWtblRawDataRwWtblDw, - sizeof(CMD_WTBL_RAW_DATA_RW_T)); - - if (cmd_cnt == 0) - cmd_op = RESET_WTBL_AND_SET; - else - cmd_op = SET_WTBL; - - rWtblRawDataRwWtblDw.u2Tag = WTBL_RAW_DATA_RW; - rWtblRawDataRwWtblDw.u2Length = sizeof(CMD_WTBL_RAW_DATA_RW_T); - rWtblRawDataRwWtblDw.ucWtblIdx = ucWtbl1234; - rWtblRawDataRwWtblDw.ucWhichDW = dw_set[cmd_cnt].ucWhichDW; - rWtblRawDataRwWtblDw.u4DwMask = dw_set[cmd_cnt].u4DwMask; - rWtblRawDataRwWtblDw.u4DwValue = dw_set[cmd_cnt].u4DwValue; - ret = CmdExtWtblUpdate(pAd, ucWlanIdx, cmd_op, - &rWtblRawDataRwWtblDw, - rWtblRawDataRwWtblDw.u2Length); - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: cmd_cnt/WlanIdx/Tag/Length/WtblIdx/WhichDW/DwMask/DwValue/ret=%d/%d/%d/%d/%d/%d/0x%x/0x%x/%d\n", - __func__, cmd_cnt, ucWlanIdx, - rWtblRawDataRwWtblDw.u2Tag, - rWtblRawDataRwWtblDw.u2Length, - rWtblRawDataRwWtblDw.ucWtblIdx, - rWtblRawDataRwWtblDw.ucWhichDW, - rWtblRawDataRwWtblDw.u4DwMask, - rWtblRawDataRwWtblDw.u4DwValue, ret)); - } - - return ret; -} - -/** - * @addtogroup bss_dev_sta_info - * @{ - * @name bss info/device info/sta record firmware command - * @{ - */ -static VOID CmdExtDevInfoUpdateRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - P_EVENT_DEVINFO_UPDATE_T EventExtCmdResult = - (P_EVENT_DEVINFO_UPDATE_T)Data; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExtenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - EventExtCmdResult->u2TotalElementNum = - le2cpu16(EventExtCmdResult->u2TotalElementNum); - - if (EventExtCmdResult->u4Status != 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::BUG::EventExtCmdResult.u4Status = 0x%x\n", - __func__, EventExtCmdResult->u4Status)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::ucOwnMacIdx(%d), u2TotalElementNum(%d)\n", - __func__, EventExtCmdResult->ucOwnMacIdx, - EventExtCmdResult->u2TotalElementNum)); - } -} - -static VOID CmdExtStaRecUpdateRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - P_EVENT_STAREC_UPDATE_T EventExtCmdResult = - (P_EVENT_STAREC_UPDATE_T)(Data); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExtenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - EventExtCmdResult->u2TotalElementNum = - le2cpu16(EventExtCmdResult->u2TotalElementNum); - /* We can consider move this to caller */ - msg->cmd_return_status = EventExtCmdResult->u4Status; - - if (EventExtCmdResult->u4Status != 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::ERROR::EventExtCmdResult.u4Status = 0x%x\n", - __func__, EventExtCmdResult->u4Status)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s::ucBssInfoIdx(%d), ucWlanIdx(%d), u2TotalElementNum(%d)\n", - __func__, EventExtCmdResult->ucBssInfoIdx, - EventExtCmdResult->ucWlanIdx, - le2cpu16(EventExtCmdResult->u2TotalElementNum))); - } -} - -static VOID CmdExtBssInfoUpdateRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - P_EVENT_BSSINFO_UPDATE_T EventExtCmdResult = - (P_EVENT_BSSINFO_UPDATE_T)Data; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExtenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - EventExtCmdResult->u2TotalElementNum = - le2cpu16(EventExtCmdResult->u2TotalElementNum); - - if (EventExtCmdResult->u4Status != 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::BUG::EventExtCmdResult.u4Status = 0x%x\n", - __func__, EventExtCmdResult->u4Status)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::ucBssInfoIdx(%d), u2TotalElementNum(%d)\n", - __func__, EventExtCmdResult->ucBssInfoIdx, - EventExtCmdResult->u2TotalElementNum)); - } -} - -/* WTBL TLV update */ -INT32 CmdExtDevInfoUpdate(RTMP_ADAPTER *pAd, UINT8 OwnMacIdx, UINT8 *OwnMacAddr, - UINT8 BandIdx, UINT8 Active, UINT32 u4EnableFeature) -{ - struct cmd_msg *msg = NULL; - CMD_DEVINFO_UPDATE_T CmdDeviceInfoUpdate = { 0 }; - INT32 Ret = 0; - UINT8 i = 0; - UINT16 ucTLVNumber = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* Allocate buffer */ - msg = AndesAllocCmdMsg(pAd, MAX_BUF_SIZE_OF_DEVICEINFO); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - /* Get number of TLV*/ - for (i = 0; i < DEVINFO_MAX_NUM; i++) { - if (u4EnableFeature & (1 << i)) - ucTLVNumber++; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_DEVINFO_UPDATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_LEN_VAR_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_DEVINFO_UPDATE_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtDevInfoUpdateRsp); - AndesInitCmdMsg(msg, attr); - /* Fill Devive info parameter here*/ - CmdDeviceInfoUpdate.ucOwnMacIdx = OwnMacIdx; - CmdDeviceInfoUpdate.u2TotalElementNum = cpu2le16(ucTLVNumber); - CmdDeviceInfoUpdate.ucAppendCmdTLV = TRUE; - AndesAppendCmdMsg(msg, (char *)&CmdDeviceInfoUpdate, - sizeof(CMD_DEVINFO_UPDATE_T)); - - if (u4EnableFeature & DEVINFO_ACTIVE_FEATURE) { - CMD_DEVINFO_ACTIVE_T DevInfoBasic = { 0 }; - /* Fill TLV format */ - DevInfoBasic.u2Tag = DEVINFO_ACTIVE; - DevInfoBasic.u2Length = sizeof(CMD_DEVINFO_ACTIVE_T); - DevInfoBasic.ucActive = Active; - DevInfoBasic.ucDbdcIdx = BandIdx; -#ifdef RT_BIG_ENDIAN - DevInfoBasic.u2Tag = cpu2le16(DevInfoBasic.u2Tag); - DevInfoBasic.u2Length = cpu2le16(DevInfoBasic.u2Length); -#endif - os_move_mem(DevInfoBasic.aucOwnMAC, OwnMacAddr, MAC_ADDR_LEN); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(CMD_DEVINFO_BASIC_T), OwnMacIdx = %d, ucActive = %d, aucOwnMAC = %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, OwnMacIdx, DevInfoBasic.ucActive, - PRINT_MAC(DevInfoBasic.aucOwnMAC))); - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&DevInfoBasic, - sizeof(CMD_DEVINFO_ACTIVE_T)); - } - - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -/*Start STARec Handler*/ - -static INT32 StaRecUpdateBasic(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - /* Fill STA Rec Common */ - CMD_STAREC_COMMON_T StaRecCommon = { 0 }; - /* Fill TLV format */ - StaRecCommon.u2Tag = STA_REC_BASIC_STA_RECORD; - StaRecCommon.u2Length = sizeof(CMD_STAREC_COMMON_T); - StaRecCommon.u4ConnectionType = cpu2le32(pStaRecCfg->ConnectionType); - StaRecCommon.ucConnectionState = pStaRecCfg->ConnectionState; - /* New info to indicate this is new way to update STAREC */ - StaRecCommon.u2ExtraInfo = STAREC_COMMON_EXTRAINFO_V2; - - if (pStaRecCfg->IsNewSTARec) - StaRecCommon.u2ExtraInfo |= STAREC_COMMON_EXTRAINFO_NEWSTAREC; - -#ifdef CONFIG_AP_SUPPORT - - if (pEntry) { - StaRecCommon.ucIsQBSS = - CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_WMM_CAPABLE) ? - TRUE : - FALSE; - StaRecCommon.u2AID = cpu2le16(pEntry->Aid); - } - -#endif /* CONFIG_AP_SUPPORT */ - - if (pEntry) { - os_move_mem(StaRecCommon.aucPeerMacAddr, pEntry->Addr, - MAC_ADDR_LEN); - } else { - os_move_mem(StaRecCommon.aucPeerMacAddr, BROADCAST_ADDR, - MAC_ADDR_LEN); - } - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(CMD_STAREC_COMMON_T), u4ConnectionType = %d, ucConnectionState = %d, ucIsQBSS = %d, u2AID = %d, aucPeerMacAddr = %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, le2cpu32(StaRecCommon.u4ConnectionType), - StaRecCommon.ucConnectionState, StaRecCommon.ucIsQBSS, - le2cpu16(StaRecCommon.u2AID), - PRINT_MAC(StaRecCommon.aucPeerMacAddr))); - /* Append this feature */ -#ifdef RT_BIG_ENDIAN - StaRecCommon.u2Tag = cpu2le16(StaRecCommon.u2Tag); - StaRecCommon.u2Length = cpu2le16(StaRecCommon.u2Length); - StaRecCommon.u2ExtraInfo = cpu2le16(StaRecCommon.u2ExtraInfo); -#endif - AndesAppendCmdMsg(msg, (char *)&StaRecCommon, - sizeof(CMD_STAREC_COMMON_T)); - return 0; -} - -static INT32 StaRecUpdateRa(RTMP_ADAPTER *pAd, struct cmd_msg *msg, VOID *args) -{ -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - CMD_STAREC_AUTO_RATE_T CmdStaRecAutoRate = { 0 }; - - if (pEntry) { - os_zero_mem(&CmdStaRecAutoRate, sizeof(CmdStaRecAutoRate)); - StaRecAutoRateParamSet(&pEntry->RaEntry, &CmdStaRecAutoRate); - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdStaRecAutoRate, - sizeof(CMD_STAREC_AUTO_RATE_T)); - return 0; - } -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - return -1; -} - -/* Only for mt7636 and mt7637 */ -static INT32 StaRecUpdateRaInfo(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ -#ifdef RACTRL_FW_OFFLOAD_SUPPORT -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - return -1; -} - -static INT32 StaRecUpdateRaUpdate(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - CMD_STAREC_AUTO_RATE_UPDATE_T CmdStaRecAutoRateUpdate = { 0 }; - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - - if (pEntry) { - os_zero_mem(&CmdStaRecAutoRateUpdate, - sizeof(CmdStaRecAutoRateUpdate)); - StaRecAutoRateUpdate(&pEntry->RaEntry, &pEntry->RaInternal, - pStaRecCfg->pRaParam, - &CmdStaRecAutoRateUpdate); - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdStaRecAutoRateUpdate, - sizeof(CMD_STAREC_AUTO_RATE_UPDATE_T)); - return 0; - } -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - return -1; -} - -#ifdef TXBF_SUPPORT -static INT32 StaRecUpdateBf(RTMP_ADAPTER *pAd, struct cmd_msg *msg, VOID *args) -{ - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - CMD_STAREC_BF CmdStaRecBf; - - if (pEntry) { - os_zero_mem(&CmdStaRecBf, sizeof(CMD_STAREC_BF)); - StaRecBfUpdate(pEntry, &CmdStaRecBf); - AndesAppendCmdMsg(msg, (char *)&CmdStaRecBf, - sizeof(CMD_STAREC_BF)); - return 0; - } - - return -1; -} -#endif /*TXBF_SUPPORT*/ - -static INT32 StaRecUpdateAmsdu(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - CMD_STAREC_AMSDU_T CmdStaRecAmsdu = { 0 }; - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - - if (pEntry) { - os_zero_mem(&CmdStaRecAmsdu, sizeof(CMD_STAREC_AMSDU_T)); - CmdStaRecAmsdu.u2Tag = STA_REC_AMSDU; /* Tag = 0x05 */ - CmdStaRecAmsdu.u2Length = sizeof(CMD_STAREC_AMSDU_T); - CmdStaRecAmsdu.ucMaxMpduSize = pEntry->AMsduSize; - CmdStaRecAmsdu.ucMaxAmsduNum = 0; -#ifdef TX_AGG_ADJUST_WKR - - if (tx_check_for_agg_adjust(pAd, pEntry) == TRUE) - CmdStaRecAmsdu.ucMaxMpduSize = 0; - -#endif /* TX_AGG_ADJUST_WKR */ -#ifdef RT_BIG_ENDIAN - CmdStaRecAmsdu.u2Tag = cpu2le16(CmdStaRecAmsdu.u2Tag); - CmdStaRecAmsdu.u2Length = cpu2le16(CmdStaRecAmsdu.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdStaRecAmsdu, - sizeof(CMD_STAREC_AMSDU_T)); - return 0; - } - - return -1; -} - -#ifdef HW_TX_AMSDU_SUPPORT -static INT32 StaRecUpdateHwAmsdu(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - CMD_STAREC_AMSDU_T CmdStaRecAmsdu = { 0 }; - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - - if (pEntry) { - os_zero_mem(&CmdStaRecAmsdu, sizeof(CMD_STAREC_AMSDU_T)); - CmdStaRecAmsdu.u2Tag = STA_REC_HW_AMSDU; /* Tag = 0xf */ - CmdStaRecAmsdu.u2Length = sizeof(CMD_STAREC_AMSDU_T); - CmdStaRecAmsdu.ucMaxMpduSize = pEntry->AMsduSize; - CmdStaRecAmsdu.ucMaxAmsduNum = 4; - CmdStaRecAmsdu.ucAmsduEnable = TRUE; - -#ifdef RT_BIG_ENDIAN - CmdStaRecAmsdu.u2Tag = cpu2le16(CmdStaRecAmsdu.u2Tag); - CmdStaRecAmsdu.u2Length = cpu2le16(CmdStaRecAmsdu.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdStaRecAmsdu, - sizeof(CMD_STAREC_AMSDU_T)); - return 0; - } - - return -1; -} -#endif /*HW_TX_AMSDU_SUPPORT*/ - -static INT32 StaRecUpdateTxProc(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - CMD_STAREC_TX_PROC_T CmdStaRecTxProc = { 0 }; -#ifdef CONFIG_CSO_SUPPORT - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); -#endif -#ifdef APCLI_SUPPORT - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; -#endif /* APCLI_SUPPORT */ - -#ifdef VLAN_SUPPORT - STA_TR_ENTRY *tr_entry = &pAd->MacTab.tr_entry[pStaRecCfg->ucWlanIdx]; - struct wifi_dev *bss_wdev = tr_entry->wdev; -#endif - os_zero_mem(&CmdStaRecTxProc, sizeof(CMD_STAREC_TX_PROC_T)); - CmdStaRecTxProc.u2Tag = STA_REC_TX_PROC; /* Tag = 0x08 */ - CmdStaRecTxProc.u2Length = sizeof(CMD_STAREC_TX_PROC_T); -#ifdef VLAN_SUPPORT - if ((pEntry && pEntry->wdev && pEntry->wdev->bVLAN_Tag) || - (bss_wdev && bss_wdev->bVLAN_Tag)) - CmdStaRecTxProc.u4TxProcFlag = 0; - else -#endif /*VLAN_SUPPORT*/ -#ifdef MAP_R2 - if (IS_MAP_R2_ENABLE(pAd)) { - AsicRxHeaderTransCtl(pAd, TRUE, FALSE, FALSE, FALSE, FALSE); - - CmdStaRecTxProc.u4TxProcFlag = 0; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(), set u4TxProcFlag = 0 to keep vlan tag\n", - __func__)); - if (pEntry && pEntry->wdev) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s\n", pEntry->wdev->if_dev->name)); - } else -#endif - CmdStaRecTxProc.u4TxProcFlag = RVLAN; -#ifdef CONFIG_CSO_SUPPORT - - if (pChipCap->asic_caps & fASIC_CAP_CSO) { - CmdStaRecTxProc.u4TxProcFlag |= IPCSO; - CmdStaRecTxProc.u4TxProcFlag |= TCPUDPCSO; - } - -#endif -#ifdef APCLI_SUPPORT - - if (pEntry && (IS_ENTRY_APCLI(pEntry) -#ifdef MAC_REPEATER_SUPPORT - || IS_ENTRY_REPEATER(pEntry) -#endif /* MAC_REPEATER_SUPPORT */ - )) { - CmdStaRecTxProc.u4TxProcFlag |= TX_PROC_ACM_CFG_EN; - - if (pEntry->bACMBit[0] == TRUE) - CmdStaRecTxProc.u4TxProcFlag |= TX_PROC_ACM_CFG_BK; - - if (pEntry->bACMBit[1] == TRUE) - CmdStaRecTxProc.u4TxProcFlag |= TX_PROC_ACM_CFG_BE; - - if (pEntry->bACMBit[2] == TRUE) - CmdStaRecTxProc.u4TxProcFlag |= TX_PROC_ACM_CFG_VI; - - if (pEntry->bACMBit[3] == TRUE) - CmdStaRecTxProc.u4TxProcFlag |= TX_PROC_ACM_CFG_VO; - } - -#endif /* APCLI_SUPPORT */ -#ifdef RT_BIG_ENDIAN - CmdStaRecTxProc.u4TxProcFlag = cpu2le32(CmdStaRecTxProc.u4TxProcFlag); - CmdStaRecTxProc.u2Tag = cpu2le16(CmdStaRecTxProc.u2Tag); - CmdStaRecTxProc.u2Length = cpu2le16(CmdStaRecTxProc.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdStaRecTxProc, - sizeof(CMD_STAREC_TX_PROC_T)); - return 0; -} - -#ifdef DOT11_N_SUPPORT -static INT32 StaRecUpdateHtInfo(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - CMD_STAREC_HT_INFO_T CmdStaRecHtInfo; - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - - if (pEntry) { - os_zero_mem(&CmdStaRecHtInfo, sizeof(CMD_STAREC_HT_INFO_T)); - CmdStaRecHtInfo.u2Tag = STA_REC_BASIC_HT_INFO; - CmdStaRecHtInfo.u2Length = sizeof(CMD_STAREC_HT_INFO_T); - /* FIXME: may need separate function to compose the payload */ - os_move_mem(&CmdStaRecHtInfo.u2HtCap, - &(pEntry->HTCapability.HtCapInfo), - sizeof(CmdStaRecHtInfo.u2HtCap)); -#ifdef RT_BIG_ENDIAN - CmdStaRecHtInfo.u2HtCap = cpu2le16(CmdStaRecHtInfo.u2HtCap); - CmdStaRecHtInfo.u2Tag = cpu2le16(CmdStaRecHtInfo.u2Tag); - CmdStaRecHtInfo.u2Length = cpu2le16(CmdStaRecHtInfo.u2Length); -#endif - AndesAppendCmdMsg(msg, (char *)&CmdStaRecHtInfo, - sizeof(CMD_STAREC_HT_INFO_T)); - return 0; - } - - return -1; -} - -#ifdef DOT11_VHT_AC -static INT32 StaRecUpdateVhtInfo(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - CMD_STAREC_VHT_INFO_T CmdStaRecVHtInfo; - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - - if (pEntry) { - os_zero_mem(&CmdStaRecVHtInfo, sizeof(CMD_STAREC_VHT_INFO_T)); - CmdStaRecVHtInfo.u2Tag = STA_REC_BASIC_VHT_INFO; - CmdStaRecVHtInfo.u2Length = sizeof(CMD_STAREC_VHT_INFO_T); - /* FIXME: may need separate function to compose the payload */ - os_move_mem(&CmdStaRecVHtInfo.u4VhtCap, - &(pEntry->vht_cap_ie.vht_cap), - sizeof(CmdStaRecVHtInfo.u4VhtCap)); - os_move_mem(&CmdStaRecVHtInfo.u2VhtRxMcsMap, - &(pEntry->vht_cap_ie.mcs_set.rx_mcs_map), - sizeof(CmdStaRecVHtInfo.u2VhtRxMcsMap)); - os_move_mem(&CmdStaRecVHtInfo.u2VhtTxMcsMap, - &(pEntry->vht_cap_ie.mcs_set.tx_mcs_map), - sizeof(CmdStaRecVHtInfo.u2VhtTxMcsMap)); -#ifdef RT_BIG_ENDIAN - CmdStaRecVHtInfo.u2Tag = cpu2le16(CmdStaRecVHtInfo.u2Tag); - CmdStaRecVHtInfo.u2Length = cpu2le16(CmdStaRecVHtInfo.u2Length); - CmdStaRecVHtInfo.u4VhtCap = cpu2le32(CmdStaRecVHtInfo.u4VhtCap); - CmdStaRecVHtInfo.u2VhtRxMcsMap = - cpu2le16(CmdStaRecVHtInfo.u2VhtRxMcsMap); - CmdStaRecVHtInfo.u2VhtTxMcsMap = - cpu2le16(CmdStaRecVHtInfo.u2VhtTxMcsMap); -#endif - AndesAppendCmdMsg(msg, (char *)&CmdStaRecVHtInfo, - sizeof(CMD_STAREC_VHT_INFO_T)); - return 0; - } - - return -1; -} -#endif /*DOT11_VHT_AC*/ -#endif /*DOT11_N_SUPPORT*/ - -static INT32 StaRecUpdateApPs(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - CMD_STAREC_PS_T CmdPsInfo = { 0 }; - UINT8 IdApsd; - UINT8 ACTriSet = 0; - UINT8 ACDelSet = 0; - - if (pEntry) { - /* Fill TLV format */ - CmdPsInfo.u2Tag = STA_REC_AP_PS; - CmdPsInfo.u2Length = sizeof(CMD_STAREC_PS_T); - /* Find Triggerable AC */ - /* Find Deliverable AC */ - ACTriSet = 0; - ACDelSet = 0; - - for (IdApsd = 0; IdApsd < 4; IdApsd++) { - if (pEntry->bAPSDCapablePerAC[IdApsd]) - ACTriSet |= 1 << IdApsd; - - if (pEntry->bAPSDDeliverEnabledPerAC[IdApsd]) - ACDelSet |= 1 << IdApsd; - } - - CmdPsInfo.ucStaBmpTriggerAC = ACTriSet; - CmdPsInfo.ucStaBmpDeliveryAC = ACDelSet; - CmdPsInfo.ucStaMaxSPLength = pStaRecCfg->pEntry->MaxSPLength; - CmdPsInfo.u2StaListenInterval = 0; /* TODO: */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(STA_REC_AP_PS), Delv=%x Trig=%x SP=%d LInt=%d", - __func__, CmdPsInfo.ucStaBmpDeliveryAC, - CmdPsInfo.ucStaBmpTriggerAC, - CmdPsInfo.ucStaMaxSPLength, - CmdPsInfo.u2StaListenInterval)); -#ifdef RT_BIG_ENDIAN - CmdPsInfo.u2Tag = cpu2le16(CmdPsInfo.u2Tag); - CmdPsInfo.u2Length = cpu2le16(CmdPsInfo.u2Length); - CmdPsInfo.u2StaListenInterval = - cpu2le16(CmdPsInfo.u2StaListenInterval); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdPsInfo, - sizeof(CMD_STAREC_PS_T)); - return 0; - } - - return -1; -} - -static INT32 StaRecUpdateSecKey(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - ASIC_SEC_INFO *asic_sec_info = &pStaRecCfg->asic_sec_info; - CMD_WTBL_SECURITY_KEY_T rWtblSecurityKey = { 0 }; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:, wcid=%d, Operation=%d, Direction=%d\n", __func__, - asic_sec_info->Wcid, asic_sec_info->Operation, - asic_sec_info->Direction)); - rWtblSecurityKey.u2Tag = cpu2le16(STA_REC_INSTALL_KEY); - rWtblSecurityKey.u2Length = cpu2le16(sizeof(CMD_WTBL_SECURITY_KEY_T)); - fill_wtbl_key_info_struc(asic_sec_info, &rWtblSecurityKey); - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&rWtblSecurityKey, - sizeof(CMD_WTBL_SECURITY_KEY_T)); - return 0; -} - -static INT32 StaRecUpdateWtbl(RTMP_ADAPTER *pAd, struct cmd_msg *msg, - VOID *args) -{ - STA_REC_CFG_T *pStaRecCfg = (STA_REC_CFG_T *)args; - MAC_TABLE_ENTRY *pEntry = pStaRecCfg->pEntry; - P_CMD_STAREC_WTBL_T pStarec_wtbl = NULL; - BOOLEAN IsBCMCWCID = FALSE; - CMD_WTBL_GENERIC_T rWtblGeneric = { 0 }; /* Tag = 0, Generic */ - CMD_WTBL_RX_T rWtblRx = { 0 }; /* Tage = 1, Rx */ -#ifdef DOT11_N_SUPPORT - CMD_WTBL_HT_T rWtblHt = { 0 }; /* Tag = 2, HT */ -#ifdef DOT11_VHT_AC - CMD_WTBL_VHT_T rWtblVht = { 0 }; /* Tag = 3, VHT */ -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - CMD_WTBL_TX_PS_T rWtblTxPs = { 0 }; /* Tag = 5, TxPs */ -#if defined(HDR_TRANS_TX_SUPPORT) || defined(HDR_TRANS_RX_SUPPORT) - CMD_WTBL_HDR_TRANS_T rWtblHdrTrans = { 0 }; /* Tag = 6, Hdr Trans */ -#endif /* HDR_TRANS_TX_SUPPORT */ - CMD_WTBL_RDG_T rWtblRdg = { 0 }; /* Tag = 9, Rdg */ -#ifdef TXBF_SUPPORT - CMD_WTBL_BF_T rWtblBf = { 0 }; /* Tag = 12, BF */ -#endif /* TXBF_SUPPORT */ - CMD_WTBL_SMPS_T rWtblSmPs = { 0 }; /* Tag = 13, SMPS */ - CMD_WTBL_SPE_T rWtblSpe = { 0 }; /* Tag = 16, SPE */ - UCHAR *pTlvBuffer = NULL; - UCHAR *pTempBuffer = NULL; - UINT32 u4TotalTlvLen = 0; - UCHAR ucTotalTlvNumber = 0; - NDIS_STATUS Status = NDIS_STATUS_SUCCESS; - P_CMD_WTBL_UPDATE_T pCmdWtblUpdate = NULL; - /* Allocate TLV msg */ - Status = os_alloc_mem(pAd, (UCHAR **)&pStarec_wtbl, - sizeof(CMD_STAREC_WTBL_T)); - os_zero_mem(pStarec_wtbl, sizeof(CMD_STAREC_WTBL_T)); - if (pStarec_wtbl == NULL) - return -1; - - pStarec_wtbl->u2Tag = cpu2le16(STA_REC_WTBL); - pStarec_wtbl->u2Length = cpu2le16(sizeof(CMD_STAREC_WTBL_T)); - - if (pStaRecCfg->ConnectionType == CONNECTION_INFRA_BC) - IsBCMCWCID = TRUE; - - /* Tag = 1 */ - rWtblRx.ucRv = 1; - rWtblRx.ucRca2 = 1; - - if (IsBCMCWCID) { - /* Tag = 0 */ - rWtblGeneric.ucMUARIndex = 0x0e; - - os_move_mem(rWtblGeneric.aucPeerAddress, BROADCAST_ADDR, - MAC_ADDR_LEN); - - //tmp solution to update STA mode AP address - IF_DEV_CONFIG_OPMODE_ON_STA(pAd) - { - WIFI_SYS_INFO_T *pWifiSysInfo = &pAd->WifiSysInfo; - WIFI_INFO_CLASS_T *pWifiClass = &pWifiSysInfo->BssInfo; - BSS_INFO_ARGUMENT_T *pBssInfo = NULL; - - OS_SEM_LOCK(&pWifiSysInfo->lock); - - DlListForEach(pBssInfo, &pWifiClass->Head, - BSS_INFO_ARGUMENT_T, list) - { - if (pBssInfo->ucBssIndex == - pStaRecCfg->ucBssIndex) { - //Update to AP MAC when in STA mode - os_move_mem(rWtblGeneric.aucPeerAddress, - pBssInfo->Bssid, - MAC_ADDR_LEN); - } - } - - OS_SEM_UNLOCK(&pWifiSysInfo->lock); - } - - /* Tag = 1 */ - rWtblRx.ucRca1 = 1; - /* Tag = 6 */ -#ifdef HDR_TRANS_TX_SUPPORT - - if (pAd->OpMode == OPMODE_AP) { - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 0; - } - -#endif - } else { - struct wifi_dev *wdev = NULL; - - if (pEntry == NULL) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n\nERROR%s: No MacEntry. widx=%d ConnTyp=0x%x feat=0x%x\n\n\n", - __func__, pStaRecCfg->ucWlanIdx, - pStaRecCfg->ConnectionType, - pStaRecCfg->u4EnableFeature)); - - os_free_mem(pStarec_wtbl); - - return -1; - } - - wdev = pEntry->wdev; - - /* Tag = 0 */ - //rWtblGeneric.ucMUARIndex = pEntry->wdev->OmacIdx; - rWtblGeneric.ucQos = - CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_WMM_CAPABLE) ? - 1 : - 0; - rWtblGeneric.u2PartialAID = cpu2le16(pEntry->Aid); - rWtblGeneric.ucMUARIndex = pStaRecCfg->MuarIdx; - - /* Tag = 0 */ - os_move_mem(rWtblGeneric.aucPeerAddress, pEntry->Addr, - MAC_ADDR_LEN); - - if (CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_RDG_CAPABLE) && - CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_RALINK_CHIPSET)) - rWtblGeneric.ucAadOm = 1; - - /* Tag = 1 */ - if ((wdev->wdev_type == WDEV_TYPE_APCLI) || - (wdev->wdev_type == WDEV_TYPE_STA)) - rWtblRx.ucRca1 = 1; - -#ifdef HDR_TRANS_TX_SUPPORT - - /* Tag = 6 */ - if (wdev->wdev_type == WDEV_TYPE_STA) { - rWtblHdrTrans.ucFd = 0; - rWtblHdrTrans.ucTd = 1; - } else if (wdev->wdev_type == WDEV_TYPE_AP) { - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 0; - } else if (wdev->wdev_type == WDEV_TYPE_APCLI) { - rWtblHdrTrans.ucFd = 0; - rWtblHdrTrans.ucTd = 1; - } else if (wdev->wdev_type == WDEV_TYPE_WDS) { - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 1; - } else - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknown wdev type(%d) do not support header translation\n", - __func__, pEntry->wdev->wdev_type)); - -#ifdef APCLI_AS_WDS_STA_SUPPORT - if ((wdev->wdev_type == WDEV_TYPE_APCLI) && - (wdev->wds_enable) && pEntry->bEnable4Addr) { - rWtblHdrTrans.ucFd = 1; - rWtblHdrTrans.ucTd = 1; - } -#endif - -#endif /* HDR_TRANS_TX_SUPPORT */ -#ifdef HDR_TRANS_RX_SUPPORT - - if (IS_CIPHER_TKIP_Entry(pEntry)) - rWtblHdrTrans.ucDisRhtr = 1; - else - rWtblHdrTrans.ucDisRhtr = 0; - -#endif /* HDR_TRANS_RX_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - if (IS_HT_STA(pEntry)) { - /* Tag = 0 */ - rWtblGeneric.ucQos = 1; - rWtblGeneric.ucBafEn = 0; - - /* Tag = 2 */ - rWtblHt.ucHt = 1; - rWtblHt.ucMm = pEntry->MpduDensity; - rWtblHt.ucAf = pEntry->MaxRAmpduFactor; - - if (CLIENT_STATUS_TEST_FLAG( - pEntry, fCLIENT_STATUS_RDG_CAPABLE)) { - /* Tga = 9 */ - rWtblRdg.ucR = 1; - - if (IS_MT7615(pAd) || IS_MT7622(pAd) || - IS_P18(pAd) || IS_MT7663(pAd)) - rWtblRdg.ucRdgBa = 0; - else - rWtblRdg.ucRdgBa = 1; - } - - /* Tag = 13*/ - if (pEntry->MmpsMode == MMPS_DYNAMIC) - rWtblSmPs.ucSmPs = 1; - else - rWtblSmPs.ucSmPs = 0; - -#ifdef DOT11_VHT_AC - - /* Tag = 3 */ - if (IS_VHT_STA(pEntry)) - rWtblVht.ucVht = 1; - -#endif /* DOT11_VHT_AC */ - } - -#endif /* DOT11_N_SUPPORT */ - } - - /* Tag = 5 */ - rWtblTxPs.ucTxPs = 0; -#ifdef TXBF_SUPPORT - - if (!IsBCMCWCID) { - /* Tag = 0xc */ - rWtblBf.ucGid = 0; - rWtblBf.ucPFMUIdx = pAd->rStaRecBf.u2PfmuId; - - if (IS_HT_STA(pEntry)) { - if (pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn) - rWtblBf.ucTiBf = - (pEntry->rStaRecBf.fgETxBfCap > 0) ? - FALSE : - TRUE; - else - rWtblBf.ucTiBf = FALSE; - - if (pAd->CommonCfg.ETxBfEnCond) - rWtblBf.ucTeBf = pEntry->rStaRecBf.fgETxBfCap; - else - rWtblBf.ucTeBf = FALSE; - } - - if (IS_VHT_STA(pEntry)) { - if (pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn) - rWtblBf.ucTibfVht = - (pEntry->rStaRecBf.fgETxBfCap > 0) ? - FALSE : - TRUE; - else - rWtblBf.ucTibfVht = FALSE; - - if (pAd->CommonCfg.ETxBfEnCond) - rWtblBf.ucTebfVht = - pEntry->rStaRecBf.fgETxBfCap; - else - rWtblBf.ucTebfVht = FALSE; - } - } - -#endif /* TXBF_SUPPORT */ - /* Tag = 0x10 */ - rWtblSpe.ucSpeIdx = 0; - /* From WTBL COMMAND in STEREC TLV */ - pCmdWtblUpdate = (P_CMD_WTBL_UPDATE_T)&pStarec_wtbl->aucBuffer[0]; - pTlvBuffer = &pCmdWtblUpdate->aucBuffer[0]; - /* Append TLV msg */ - pTempBuffer = pTlvAppend(pTlvBuffer, (WTBL_GENERIC), - (sizeof(CMD_WTBL_GENERIC_T)), &rWtblGeneric, - &u4TotalTlvLen, &ucTotalTlvNumber); - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_RX), (sizeof(CMD_WTBL_RX_T)), - &rWtblRx, &u4TotalTlvLen, &ucTotalTlvNumber); -#ifdef DOT11_N_SUPPORT - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_HT), (sizeof(CMD_WTBL_HT_T)), - &rWtblHt, &u4TotalTlvLen, &ucTotalTlvNumber); - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_RDG), (sizeof(CMD_WTBL_RDG_T)), - &rWtblRdg, &u4TotalTlvLen, &ucTotalTlvNumber); - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_SMPS), (sizeof(CMD_WTBL_SMPS_T)), - &rWtblSmPs, &u4TotalTlvLen, &ucTotalTlvNumber); -#ifdef DOT11_VHT_AC - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_VHT), (sizeof(CMD_WTBL_VHT_T)), - &rWtblVht, &u4TotalTlvLen, &ucTotalTlvNumber); -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - pTempBuffer = pTlvAppend(pTempBuffer, (WTBL_TX_PS), - (sizeof(CMD_WTBL_TX_PS_T)), &rWtblTxPs, - &u4TotalTlvLen, &ucTotalTlvNumber); -#if defined(HDR_TRANS_RX_SUPPORT) || defined(HDR_TRANS_TX_SUPPORT) - pTempBuffer = pTlvAppend(pTempBuffer, (WTBL_HDR_TRANS), - (sizeof(CMD_WTBL_HDR_TRANS_T)), &rWtblHdrTrans, - &u4TotalTlvLen, &ucTotalTlvNumber); -#endif /* HDR_TRANS_RX_SUPPORT || HDR_TRANS_TX_SUPPORT */ -#ifdef TXBF_SUPPORT - - if (pAd->rStaRecBf.u2PfmuId != 0xFFFF) { - pTempBuffer = pTlvAppend(pTempBuffer, (WTBL_BF), - (sizeof(CMD_WTBL_BF_T)), &rWtblBf, - &u4TotalTlvLen, &ucTotalTlvNumber); - } - -#endif /* TXBF_SUPPORT */ - pTempBuffer = - pTlvAppend(pTempBuffer, (WTBL_SPE), (sizeof(CMD_WTBL_SPE_T)), - &rWtblSpe, &u4TotalTlvLen, &ucTotalTlvNumber); - pCmdWtblUpdate->u2TotalElementNum = cpu2le16(ucTotalTlvNumber); - pCmdWtblUpdate->ucWlanIdx = pStaRecCfg->ucWlanIdx; - pCmdWtblUpdate->ucOperation = - RESET_WTBL_AND_SET; /* In STAREC, currently reset and set only. */ - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)pStarec_wtbl, sizeof(CMD_STAREC_WTBL_T)); - os_free_mem(pStarec_wtbl); - return 0; -} - -static STAREC_HANDLE_T StaRecHandle[] = { - { STA_REC_BASIC_STA_RECORD, (UINT32)sizeof(CMD_STAREC_COMMON_T), - StaRecUpdateBasic }, - { STA_REC_RA, (UINT32)sizeof(CMD_STAREC_AUTO_RATE_T), StaRecUpdateRa }, - { STA_REC_RA_COMMON_INFO, (UINT32)sizeof(CMD_STAREC_AUTO_RATE_CFG_T), - StaRecUpdateRaInfo }, - { STA_REC_RA_UPDATE, (UINT32)sizeof(CMD_STAREC_AUTO_RATE_UPDATE_T), - StaRecUpdateRaUpdate }, -#ifdef TXBF_SUPPORT - { STA_REC_BF, (UINT32)sizeof(CMD_STAREC_BF), StaRecUpdateBf }, -#endif - { STA_REC_AMSDU, (UINT32)sizeof(CMD_STAREC_AMSDU_T), - StaRecUpdateAmsdu }, -#ifdef CONFIG_AP_SUPPORT -#ifdef DOT11_N_SUPPORT - /* This tag is used in CmdExtStaRecBaUpdate alone, not in CmdExtStaRecUpdate like most tag used. */ - { STA_REC_BA, (UINT32)sizeof(CMD_STAREC_BA_T), NULL }, -#endif /*DOT11_N_SUPPORT*/ -#endif /*CONFIG_AP_SUPPORT*/ - { STA_REC_RED, (UINT32)sizeof(CMD_STAREC_RED_T), NULL }, - { STA_REC_TX_PROC, (UINT32)sizeof(CMD_STAREC_TX_PROC_T), - StaRecUpdateTxProc }, -#ifdef DOT11_N_SUPPORT - { STA_REC_BASIC_HT_INFO, (UINT32)sizeof(CMD_STAREC_HT_INFO_T), - StaRecUpdateHtInfo }, -#ifdef DOT11_VHT_AC - { STA_REC_BASIC_VHT_INFO, (UINT32)sizeof(CMD_STAREC_VHT_INFO_T), - StaRecUpdateVhtInfo }, -#endif /*DOT11_VHT_AC*/ -#endif /*DOT11_N_SUPPORT*/ - { STA_REC_AP_PS, (UINT32)sizeof(CMD_STAREC_PS_T), StaRecUpdateApPs }, - { STA_REC_INSTALL_KEY, sizeof(CMD_WTBL_SECURITY_KEY_T), - StaRecUpdateSecKey }, - { STA_REC_WTBL, (UINT32)sizeof(CMD_STAREC_WTBL_T), StaRecUpdateWtbl }, -#ifdef HW_TX_AMSDU_SUPPORT - { STA_REC_HW_AMSDU, (UINT32)sizeof(CMD_STAREC_AMSDU_T), - StaRecUpdateHwAmsdu }, -#endif /*HW_TX_AMSDU_SUPPORT*/ -}; - -typedef UINT32 WLAN_STATUS, *P_WLAN_STATUS; - -#define WLAN_STATUS_SUCCESS ((WLAN_STATUS)0x00000000L) -#define WLAN_STATUS_PENDING ((WLAN_STATUS)0x00000103L) -#define WLAN_STATUS_NOT_ACCEPTED ((WLAN_STATUS)0x00010003L) - -#define STAREC_RETRY 3 - -static INT32 CmdExtStaRecUpdate_ReSyncDelete(RTMP_ADAPTER *pAd, - STA_REC_CFG_T *pStaRecCfg) -{ - struct cmd_msg *msg = NULL; - CMD_STAREC_UPDATE_T CmdStaRecUpdate = { 0 }; - INT32 Ret = 0; - UINT16 u2TLVNumber = 0; - UINT32 size; - struct _CMD_ATTRIBUTE attr = { 0 }; - STA_REC_CFG_T StaRecCfgForDel = { 0 }; - - StaRecCfgForDel.ucBssIndex = pStaRecCfg->ucBssIndex; - StaRecCfgForDel.ucWlanIdx = pStaRecCfg->ucWlanIdx; - StaRecCfgForDel.ConnectionState = STATE_DISCONNECT; - StaRecCfgForDel.MuarIdx = pStaRecCfg->MuarIdx; - StaRecCfgForDel.ConnectionType = pStaRecCfg->ConnectionType; - StaRecCfgForDel.u4EnableFeature = STA_REC_BASIC_STA_RECORD; - StaRecCfgForDel.pEntry = pStaRecCfg->pEntry; - size = sizeof(CMD_STAREC_UPDATE_T); - size += StaRecHandle[STA_REC_BASIC_STA_RECORD].StaRecTagLen; - msg = AndesAllocCmdMsg(pAd, size); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_STAREC_UPDATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_LEN_VAR_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_STAREC_UPDATE_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtStaRecUpdateRsp); - AndesInitCmdMsg(msg, attr); - /* Fill WLAN related header here*/ - CmdStaRecUpdate.ucBssIndex = StaRecCfgForDel.ucBssIndex; - CmdStaRecUpdate.ucWlanIdx = StaRecCfgForDel.ucWlanIdx; - CmdStaRecUpdate.ucMuarIdx = StaRecCfgForDel.MuarIdx; - Ret = StaRecHandle[STA_REC_BASIC_STA_RECORD].StaRecTagHandler( - pAd, msg, &StaRecCfgForDel); - - if (Ret == NDIS_STATUS_SUCCESS) - u2TLVNumber++; - - /*insert to head*/ - CmdStaRecUpdate.u2TotalElementNum = cpu2le16(u2TLVNumber); - CmdStaRecUpdate.ucAppendCmdTLV = TRUE; -#ifdef RT_BIG_ENDIAN - StaRecCfgForDel.u4EnableFeature = - cpu2le32(StaRecCfgForDel.u4EnableFeature); -#endif - AndesAppendHeadCmdMsg(msg, (char *)&CmdStaRecUpdate, - sizeof(CMD_STAREC_UPDATE_T)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - return Ret; -} - -INT32 CmdExtStaRecUpdate(RTMP_ADAPTER *pAd, STA_REC_CFG_T StaRecCfg) -{ - struct cmd_msg *msg = NULL; - CMD_STAREC_UPDATE_T CmdStaRecUpdate = { 0 }; - INT32 Ret = 0; - UINT8 i = 0; - UINT16 u2TLVNumber; - UINT32 size; - UCHAR StaRecSupprotNum = sizeof(StaRecHandle) / sizeof(STAREC_HANDLE_T); - struct _CMD_ATTRIBUTE attr = { 0 }; - UINT8 retry = STAREC_RETRY; -CmdExtStaRecUpdate_restart: - u2TLVNumber = 0; - size = sizeof(CMD_STAREC_UPDATE_T); - - /* Get number of TLV*/ - for (i = 0; i < StaRecSupprotNum; i++) { - if (StaRecCfg.u4EnableFeature & - (1 << StaRecHandle[i].StaRecTag)) - size += StaRecHandle[i].StaRecTagLen; - } - - msg = AndesAllocCmdMsg(pAd, size); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_STAREC_UPDATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_LEN_VAR_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_STAREC_UPDATE_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtStaRecUpdateRsp); - AndesInitCmdMsg(msg, attr); - /* Fill WLAN related header here*/ - CmdStaRecUpdate.ucBssIndex = StaRecCfg.ucBssIndex; - CmdStaRecUpdate.ucWlanIdx = StaRecCfg.ucWlanIdx; - CmdStaRecUpdate.ucMuarIdx = StaRecCfg.MuarIdx; - - /* Fill RA related parameters */ - - for (i = 0; i < StaRecSupprotNum; i++) { - if ((StaRecCfg.u4EnableFeature & - (1 << StaRecHandle[i].StaRecTag))) { - if (StaRecHandle[i].StaRecTagHandler != NULL) { - Ret = StaRecHandle[i].StaRecTagHandler( - pAd, msg, &StaRecCfg); - - if (Ret == 0) - u2TLVNumber++; - } else { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s: StaRecTag = %d no corresponding function handler.\n", - __func__, StaRecHandle[i].StaRecTag)); - } - } - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2TLVNumber(%d)\n", __func__, u2TLVNumber)); - /*insert to head*/ - CmdStaRecUpdate.u2TotalElementNum = cpu2le16(u2TLVNumber); - CmdStaRecUpdate.ucAppendCmdTLV = TRUE; - AndesAppendHeadCmdMsg(msg, (char *)&CmdStaRecUpdate, - sizeof(CMD_STAREC_UPDATE_T)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); - - while ((Ret != WLAN_STATUS_SUCCESS) && (retry)) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s:(FW Ret = 0x%x retry=%d)\n", __func__, Ret, - retry)); - retry--; - /* something wrong with STAREC update */ - Ret = CmdExtStaRecUpdate_ReSyncDelete(pAd, &StaRecCfg); - - if (Ret != WLAN_STATUS_SUCCESS) - continue; - - goto CmdExtStaRecUpdate_restart; - } - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 CmdExtStaRecBaUpdate(struct _RTMP_ADAPTER *pAd, - STA_REC_BA_CFG_T StaRecBaCfg) -{ - struct _CMD_ATTRIBUTE attr = { 0 }; - struct cmd_msg *msg = NULL; - CMD_STAREC_UPDATE_T CmdStaRecUpdate = { 0 }; - CMD_STAREC_BA_T CmdStaRecBa; - UINT32 MsgLen; - INT32 Ret = 0; - UINT16 ucTLVNumber = 0; - - MsgLen = sizeof(CMD_STAREC_UPDATE_T) + sizeof(CMD_STAREC_BA_T); - msg = AndesAllocCmdMsg(pAd, MsgLen); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - /* Get number of TLV*/ - ucTLVNumber = 1; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ucTLVNumber(%d)\n", __func__, ucTLVNumber)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_STAREC_UPDATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_LEN_VAR_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_STAREC_UPDATE_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtStaRecUpdateRsp); - AndesInitCmdMsg(msg, attr); - /* Fill WLAN related header here*/ - CmdStaRecUpdate.ucBssIndex = StaRecBaCfg.BssIdx; - CmdStaRecUpdate.ucWlanIdx = StaRecBaCfg.WlanIdx; - CmdStaRecUpdate.ucMuarIdx = StaRecBaCfg.MuarIdx; - CmdStaRecUpdate.u2TotalElementNum = cpu2le16(ucTLVNumber); - CmdStaRecUpdate.ucAppendCmdTLV = TRUE; - AndesAppendCmdMsg(msg, (char *)&CmdStaRecUpdate, - sizeof(CMD_STAREC_UPDATE_T)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: StaRecUpdate:\n", __func__)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ucBssIndex=%d, ucWlanIdx=%d, ucMuarIdx=%d, u2TotalElementNum=%d\n", - __func__, CmdStaRecUpdate.ucBssIndex, - CmdStaRecUpdate.ucWlanIdx, CmdStaRecUpdate.ucMuarIdx, - CmdStaRecUpdate.u2TotalElementNum)); - /* Fill BA related parameters */ - NdisZeroMemory(&CmdStaRecBa, sizeof(CMD_STAREC_BA_T)); - - if (StaRecBaCfg.baDirection == ORI_BA) { - BA_ORI_ENTRY *pBAEntry = (BA_ORI_ENTRY *)StaRecBaCfg.BaEntry; - - CmdStaRecBa.ucAmsduCap = pBAEntry->amsdu_cap; - CmdStaRecBa.u2BaStartSeq = cpu2le16(pBAEntry->Sequence); - CmdStaRecBa.u2BaWinSize = cpu2le16(pBAEntry->BAWinSize); - } else if (StaRecBaCfg.baDirection == RCV_BA) { - BA_REC_ENTRY *pBAEntry = (BA_REC_ENTRY *)StaRecBaCfg.BaEntry; - - CmdStaRecBa.u2BaStartSeq = cpu2le16(pBAEntry->LastIndSeq); - CmdStaRecBa.u2BaWinSize = cpu2le16(pBAEntry->BAWinSize); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:Invalid BaDirection (baDirection = %d)\n", - __func__, StaRecBaCfg.baDirection)); - return Ret; - } - - CmdStaRecBa.ucBaEenable = StaRecBaCfg.BaEnable; - CmdStaRecBa.u2Tag = STA_REC_BA; - CmdStaRecBa.u2Length = sizeof(CMD_STAREC_BA_T); - CmdStaRecBa.ucTid = StaRecBaCfg.tid; - CmdStaRecBa.ucBaDirection = StaRecBaCfg.baDirection; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: BaInfo:\n", __func__)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2Tag=%d, u2Length=%d, ucTid=%d, u2BaDirectin=%d, BaEnable=%d, u2BaStartSeq=%d, u2BaWinSize=%d, ucAmsduCap=%d\n", - __func__, CmdStaRecBa.u2Tag, CmdStaRecBa.u2Length, - CmdStaRecBa.ucTid, CmdStaRecBa.ucBaDirection, - CmdStaRecBa.ucBaEenable, le2cpu16(CmdStaRecBa.u2BaStartSeq), - le2cpu16(CmdStaRecBa.u2BaWinSize), CmdStaRecBa.ucAmsduCap)); -#ifdef RT_BIG_ENDIAN - CmdStaRecBa.u2Tag = cpu2le16(CmdStaRecBa.u2Tag); - CmdStaRecBa.u2Length = cpu2le16(CmdStaRecBa.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdStaRecBa, sizeof(CMD_STAREC_BA_T)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -static VOID bssConnectOwnDev(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, struct cmd_msg *msg) -{ - CMD_BSSINFO_CONNECT_OWN_DEV_T CmdBssiinfoConnectOwnDev = { 0 }; - - CmdBssiinfoConnectOwnDev.u2Tag = BSS_INFO_OWN_MAC; - CmdBssiinfoConnectOwnDev.u2Length = - sizeof(CMD_BSSINFO_CONNECT_OWN_DEV_T); - CmdBssiinfoConnectOwnDev.ucHwBSSIndex = - (bss_info.OwnMacIdx > HW_BSSID_MAX) ? HW_BSSID_0 : - bss_info.OwnMacIdx; - CmdBssiinfoConnectOwnDev.ucOwnMacIdx = bss_info.OwnMacIdx; - CmdBssiinfoConnectOwnDev.u4ConnectionType = - cpu2le32(bss_info.u4ConnectionType); - /* Fill TLV format */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ucHwBSSIndex = %d, ucOwnMacIdx = %d, u4ConnectionType = %x\n", - __func__, CmdBssiinfoConnectOwnDev.ucHwBSSIndex, - CmdBssiinfoConnectOwnDev.ucOwnMacIdx, - bss_info.u4ConnectionType)); -#ifdef RT_BIG_ENDIAN - CmdBssiinfoConnectOwnDev.u2Tag = - cpu2le16(CmdBssiinfoConnectOwnDev.u2Tag); - CmdBssiinfoConnectOwnDev.u2Length = - cpu2le16(CmdBssiinfoConnectOwnDev.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssiinfoConnectOwnDev, - sizeof(CMD_BSSINFO_CONNECT_OWN_DEV_T)); -} - -static VOID bssUpdateBssInfoBasic(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, - struct cmd_msg *msg) -{ - CMD_BSSINFO_BASIC_T CmdBssInfoBasic = { 0 }; - - /* Fill TLV format */ - CmdBssInfoBasic.u2Tag = BSS_INFO_BASIC; - CmdBssInfoBasic.u2Length = sizeof(CMD_BSSINFO_BASIC_T); - CmdBssInfoBasic.u4NetworkType = cpu2le32(bss_info.NetworkType); - - if (bss_info.bss_state >= BSS_ACTIVE) - CmdBssInfoBasic.ucActive = TRUE; - else - CmdBssInfoBasic.ucActive = FALSE; - - CmdBssInfoBasic.u2BcnInterval = cpu2le16(bss_info.bcn_period); - CmdBssInfoBasic.ucDtimPeriod = bss_info.dtim_period; - - os_move_mem(CmdBssInfoBasic.aucBSSID, bss_info.Bssid, MAC_ADDR_LEN); - CmdBssInfoBasic.ucWmmIdx = bss_info.WmmIdx; - CmdBssInfoBasic.ucBcMcWlanidx = - (bss_info.u4ConnectionType == CONNECTION_INFRA_STA) ? - bss_info.ucPeerWlanIdx : - bss_info.ucBcMcWlanIdx; - CmdBssInfoBasic.ucCipherSuit = bss_info.CipherSuit; - CmdBssInfoBasic.ucPhyMode = bss_info.ucPhyMode; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, u4NetworkType = %d, ucActive = %d, u2BcnInterval = %d, ucWmmIdx = %d," - "ucDtimPeriod = %d, ucBcMcWlanidx = %d, ucCipherSuit=%d, ucPhyMode=%x," - "BSSID = %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, bss_info.NetworkType, CmdBssInfoBasic.ucActive, - le2cpu16(CmdBssInfoBasic.u2BcnInterval), - CmdBssInfoBasic.ucWmmIdx, CmdBssInfoBasic.ucDtimPeriod, - CmdBssInfoBasic.ucBcMcWlanidx, CmdBssInfoBasic.ucCipherSuit, - CmdBssInfoBasic.ucPhyMode, - PRINT_MAC(CmdBssInfoBasic.aucBSSID))); -#ifdef RT_BIG_ENDIAN - CmdBssInfoBasic.u2Tag = cpu2le16(CmdBssInfoBasic.u2Tag); - CmdBssInfoBasic.u2Length = cpu2le16(CmdBssInfoBasic.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoBasic, - sizeof(CMD_BSSINFO_BASIC_T)); -} - -static VOID bssUpdateChannel(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, struct cmd_msg *msg) -{ - CMD_BSSINFO_RF_CH_T CmdBssInfoRfCh = { 0 }; - struct freq_oper *chan_oper = &bss_info.chan_oper; - - /* Fill TLV format */ - CmdBssInfoRfCh.u2Tag = BSS_INFO_RF_CH; - CmdBssInfoRfCh.u2Length = sizeof(CMD_BSSINFO_RF_CH_T); - CmdBssInfoRfCh.ucPrimaryChannel = chan_oper->prim_ch; - CmdBssInfoRfCh.ucCenterChannelSeg0 = chan_oper->cen_ch_1; - CmdBssInfoRfCh.ucCenterChannelSeg1 = chan_oper->cen_ch_2; - CmdBssInfoRfCh.ucBandwidth = chan_oper->bw; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(BSS_INFO_RF_CH), ucPrimCh = %d, ucCentChSeg0 = %d, ucCentChSeg1 = %d, BW=%d\n", - __func__, CmdBssInfoRfCh.ucPrimaryChannel, - CmdBssInfoRfCh.ucCenterChannelSeg0, - CmdBssInfoRfCh.ucCenterChannelSeg1, - CmdBssInfoRfCh.ucBandwidth)); -#ifdef RT_BIG_ENDIAN - CmdBssInfoRfCh.u2Tag = cpu2le16(CmdBssInfoRfCh.u2Tag); - CmdBssInfoRfCh.u2Length = cpu2le16(CmdBssInfoRfCh.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoRfCh, - sizeof(CMD_BSSINFO_RF_CH_T)); -} - -static VOID pmUpdateBssInfoPM(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, struct cmd_msg *msg) -{ -} - -static VOID pmUpdateBssUapsd(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, struct cmd_msg *msg) -{ - CMD_BSSINFO_UAPSD_T CmdBssInfoUapsd = { 0 }; - - /* Fill TLV format */ - CmdBssInfoUapsd.u2Tag = BSS_INFO_UAPSD; - CmdBssInfoUapsd.u2Length = sizeof(CMD_BSSINFO_UAPSD_T); - /*initial value for uapsd*/ - CmdBssInfoUapsd.ucIsUapsdSupported = FALSE; - /*update uapsd if necessary*/ - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, ucIsUapsdSupported = %d, ucUapsdTriggerAC = 0x%x,ucUapsdTriggerAC = 0x%x, u2UapsdServicePeriodTO = 0x%x\n", - __func__, CmdBssInfoUapsd.ucIsUapsdSupported, - CmdBssInfoUapsd.ucUapsdTriggerAC, - CmdBssInfoUapsd.ucUapsdDeliveryAC, - CmdBssInfoUapsd.u2UapsdServicePeriodTO)); -#ifdef RT_BIG_ENDIAN - CmdBssInfoUapsd.u2Tag = cpu2le16(CmdBssInfoUapsd.u2Tag); - CmdBssInfoUapsd.u2Length = cpu2le16(CmdBssInfoUapsd.u2Length); - CmdBssInfoUapsd.u2UapsdServicePeriodTO = - cpu2le16(CmdBssInfoUapsd.u2UapsdServicePeriodTO); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoUapsd, - sizeof(CMD_BSSINFO_UAPSD_T)); -} - -static VOID bssUpdateRssiRmDetParams(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, - struct cmd_msg *msg) -{ - CMD_BSSINFO_RSSI_RM_DET_T CmdBssInfoRoamDetection = { 0 }; - - /* Fill TLV format */ - CmdBssInfoRoamDetection.u2Tag = BSS_INFO_ROAM_DETECTION; - CmdBssInfoRoamDetection.u2Length = sizeof(CMD_BSSINFO_RSSI_RM_DET_T); -#ifdef RT_BIG_ENDIAN - CmdBssInfoRoamDetection.u2Tag = cpu2le16(CmdBssInfoRoamDetection.u2Tag); - CmdBssInfoRoamDetection.u2Length = - cpu2le16(CmdBssInfoRoamDetection.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoRoamDetection, - sizeof(CMD_BSSINFO_RSSI_RM_DET_T)); -} - -static VOID bssUpdateExtBssInfo(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, - struct cmd_msg *msg) -{ - UCHAR ExtBssidIdx = 1; - CMD_BSSINFO_EXT_BSS_INFO_T CmdBssInfoExtBssInfo = { 0 }; -#ifdef CONFIG_AP_SUPPORT - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[bss_info.ucBssIndex].wdev; - static UCHAR GBand_FirstBssidIdx; -#endif - /* this feature is only for Omac 0x11~0x1f */ - ASSERT(bss_info.OwnMacIdx > HW_BSSID_MAX); - ExtBssidIdx = (bss_info.OwnMacIdx & 0xf); - CmdBssInfoExtBssInfo.u2Tag = BSS_INFO_EXT_BSS; - CmdBssInfoExtBssInfo.u2Length = sizeof(CMD_BSSINFO_EXT_BSS_INFO_T); -#ifdef CONFIG_AP_SUPPORT - if (pAd->CommonCfg.dbdc_mode && - (HcGetBandByWdev(wdev) == rtmp_band_index_get_by_order(pAd, 1))) { - /* Order1(default BAND0,2G) */ - if (GBand_FirstBssidIdx == 0) - GBand_FirstBssidIdx = ExtBssidIdx; - CmdBssInfoExtBssInfo.ucMbssTsfOffset = - (ExtBssidIdx - GBand_FirstBssidIdx) * - BCN_TRANSMIT_ESTIMATE_TIME; - } else -#endif - /* nonDBDC or Order0(default BAND1,5G) */ - CmdBssInfoExtBssInfo.ucMbssTsfOffset = - ExtBssidIdx * BCN_TRANSMIT_ESTIMATE_TIME; - /* Fill TLV format */ - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s (BSSINFO_EXT_BSS_INFO), ExtBssidIdx = %d, ucMbssTsfOffset = %d\n", - __func__, ExtBssidIdx, CmdBssInfoExtBssInfo.ucMbssTsfOffset)); -#ifdef RT_BIG_ENDIAN - CmdBssInfoExtBssInfo.u2Tag = cpu2le16(CmdBssInfoExtBssInfo.u2Tag); - CmdBssInfoExtBssInfo.u2Length = cpu2le16(CmdBssInfoExtBssInfo.u2Length); - CmdBssInfoExtBssInfo.ucMbssTsfOffset = - cpu2le32(CmdBssInfoExtBssInfo.ucMbssTsfOffset); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoExtBssInfo, - sizeof(CMD_BSSINFO_EXT_BSS_INFO_T)); -} - -static VOID bssUpdateBmcMngRate(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, - struct cmd_msg *msg) -{ - CMD_BSSINFO_BMC_RATE_T CmdBssInfoBmcRate = { 0 }; - - if (bss_info.bss_state >= BSS_ACTIVE) { - CmdBssInfoBmcRate.u2BcTransmit = - cpu2le16((UINT16)(bss_info.BcTransmit.word)); - CmdBssInfoBmcRate.u2McTransmit = - cpu2le16((UINT16)(bss_info.McTransmit.word)); - CmdBssInfoBmcRate.ucPreambleMode = OPSTATUS_TEST_FLAG( - pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); - } -#ifdef TXRX_STAT_SUPPORT - { - ULONG Multicast_Tx_Rate; - pAd->ApCfg.MBSSID[bss_info.ucBssIndex] - .stat_bss.LastMulticastTxRate.word = - bss_info.McTransmit.word; - getRate(bss_info.McTransmit, &Multicast_Tx_Rate); - } -#endif - CmdBssInfoBmcRate.u2Tag = BSS_INFO_BROADCAST_INFO; - CmdBssInfoBmcRate.u2Length = sizeof(CMD_BSSINFO_BMC_RATE_T); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s (BSS_INFO_BROADCAST_INFO), CmdBssInfoBmcRate.u2BcTransmit= %d, CmdBssInfoBmcRate.u2McTransmit = %d\n", - __func__, le2cpu16(CmdBssInfoBmcRate.u2BcTransmit), - le2cpu16(CmdBssInfoBmcRate.u2McTransmit))); -#ifdef RT_BIG_ENDIAN - CmdBssInfoBmcRate.u2Tag = cpu2le16(CmdBssInfoBmcRate.u2Tag); - CmdBssInfoBmcRate.u2Length = cpu2le16(CmdBssInfoBmcRate.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoBmcRate, - sizeof(CMD_BSSINFO_BMC_RATE_T)); -} - -static VOID bssUpdateSyncModeCtrl(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, - struct cmd_msg *msg) -{ - CMD_BSSINFO_SYNC_MODE_CTRL_T CmdBssInfoSyncModeCtrl = { 0 }; - - if (bss_info.bss_state >= BSS_ACTIVE) { - CmdBssInfoSyncModeCtrl.fgIsEnableSync = TRUE; - CmdBssInfoSyncModeCtrl.u2BcnInterval = - cpu2le16(bss_info.bcn_period); - CmdBssInfoSyncModeCtrl.ucDtimPeriod = bss_info.dtim_period; - } else - CmdBssInfoSyncModeCtrl.fgIsEnableSync = FALSE; - - CmdBssInfoSyncModeCtrl.u2Tag = BSS_INFO_SYNC_MODE; - CmdBssInfoSyncModeCtrl.u2Length = sizeof(CMD_BSSINFO_SYNC_MODE_CTRL_T); -#ifdef RT_BIG_ENDIAN - CmdBssInfoSyncModeCtrl.u2Tag = cpu2le16(CmdBssInfoSyncModeCtrl.u2Tag); - CmdBssInfoSyncModeCtrl.u2Length = - cpu2le16(CmdBssInfoSyncModeCtrl.u2Length); -#endif - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoSyncModeCtrl, - sizeof(CMD_BSSINFO_SYNC_MODE_CTRL_T)); -} - -static VOID bssUpdateRA(struct _RTMP_ADAPTER *pAd, BSS_INFO_ARGUMENT_T bss_info, - struct cmd_msg *msg) -{ -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - CMD_BSSINFO_AUTO_RATE_CFG_T CmdBssInfoAutoRateCfg = { 0 }; - - os_zero_mem(&CmdBssInfoAutoRateCfg, sizeof(CmdBssInfoAutoRateCfg)); - BssInfoRACommCfgSet(&bss_info.ra_cfg, &CmdBssInfoAutoRateCfg); - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoAutoRateCfg, - sizeof(CMD_BSSINFO_AUTO_RATE_CFG_T)); -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ -} - -#ifdef HW_TX_AMSDU_SUPPORT -static VOID bssUpdateHwAmsdu(struct _RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info, struct cmd_msg *msg) -{ - CMD_BSSINFO_HW_AMSDU_INFO_T CmdBssInfoHwAmsduInfo = { 0 }; - - os_zero_mem(&CmdBssInfoHwAmsduInfo, sizeof(CmdBssInfoHwAmsduInfo)); - /* Fill TLV format */ - CmdBssInfoHwAmsduInfo.u2Tag = BSS_INFO_HW_AMSDU; - CmdBssInfoHwAmsduInfo.u2Length = sizeof(CmdBssInfoHwAmsduInfo); - CmdBssInfoHwAmsduInfo.fgHwAmsduEn = 1; - CmdBssInfoHwAmsduInfo.u4TxdCmpBitmap_0 = 0xFFFF; - CmdBssInfoHwAmsduInfo.u4TxdCmpBitmap_1 = 0xFFE6FFFF; - CmdBssInfoHwAmsduInfo.u2TxdTriggerThres = 2; - -#ifdef RT_BIG_ENDIAN - CmdBssInfoHwAmsduInfo.u2Tag = cpu2le16(CmdBssInfoHwAmsduInfo.u2Tag); - CmdBssInfoHwAmsduInfo.u2Length = - cpu2le16(CmdBssInfoHwAmsduInfo.u2Length); - CmdBssInfoHwAmsduInfo.u4TxdCmpBitmap_0 = - cpu2le32(CmdBssInfoHwAmsduInfo.u4TxdCmpBitmap_0); - CmdBssInfoHwAmsduInfo.u4TxdCmpBitmap_1 = - cpu2le32(CmdBssInfoHwAmsduInfo.u4TxdCmpBitmap_1); - CmdBssInfoHwAmsduInfo.u2TxdTriggerThres = - cpu2le16(CmdBssInfoHwAmsduInfo.u2TxdTriggerThres); -#endif - - /* Append this feature */ - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoHwAmsduInfo, - sizeof(CMD_BSSINFO_HW_AMSDU_INFO_T)); -} -#endif - -/* BSSinfo tag handle */ -static BSS_INFO_HANDLE_T apfBssInfoTagHandle[] = { - { BSS_INFO_OWN_MAC_FEATURE, bssConnectOwnDev }, - { BSS_INFO_BASIC_FEATURE, bssUpdateBssInfoBasic }, - { BSS_INFO_RF_CH_FEATURE, bssUpdateChannel }, - { BSS_INFO_PM_FEATURE, pmUpdateBssInfoPM }, - { BSS_INFO_UAPSD_FEATURE, pmUpdateBssUapsd }, - { BSS_INFO_ROAM_DETECTION_FEATURE, bssUpdateRssiRmDetParams }, - { BSS_INFO_LQ_RM_FEATURE, NULL }, - { BSS_INFO_EXT_BSS_FEATURE, bssUpdateExtBssInfo }, - { BSS_INFO_BROADCAST_INFO_FEATURE, bssUpdateBmcMngRate }, - { BSS_INFO_SYNC_MODE_FEATURE, bssUpdateSyncModeCtrl }, - { BSS_INFO_RA_FEATURE, bssUpdateRA }, -#ifdef HW_TX_AMSDU_SUPPORT - { BSS_INFO_HW_AMSDU_FEATURE, bssUpdateHwAmsdu }, -#endif - { BSS_INFO_MAX_NUM_FEATURE, NULL }, -}; - -INT32 CmdSetSyncModeByBssInfoUpdate(RTMP_ADAPTER *pAd, - BSS_INFO_ARGUMENT_T bss_info) -{ - struct cmd_msg *msg = NULL; - CMD_BSSINFO_UPDATE_T CmdBssInfoUpdate = { 0 }; - INT32 Ret = 0; - UINT16 ucTLVNumber = 1; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, MAX_BUF_SIZE_OF_BSS_INFO + 100); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BSSINFO_UPDATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtBssInfoUpdateRsp); - AndesInitCmdMsg(msg, attr); - /* Tag = 0, Fill WLAN related header here */ - CmdBssInfoUpdate.ucBssIndex = bss_info.OwnMacIdx; - CmdBssInfoUpdate.u2TotalElementNum = cpu2le16(ucTLVNumber); - CmdBssInfoUpdate.ucAppendCmdTLV = TRUE; - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoUpdate, - sizeof(CMD_BSSINFO_UPDATE_T)); - bssUpdateSyncModeCtrl(pAd, bss_info, msg); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 CmdExtBssInfoUpdate(RTMP_ADAPTER *pAd, BSS_INFO_ARGUMENT_T bss_info) -{ - struct cmd_msg *msg = NULL; - CMD_BSSINFO_UPDATE_T CmdBssInfoUpdate = { 0 }; - INT32 Ret = 0; - UINT8 i = 0; - UINT16 ucTLVNumber = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, MAX_BUF_SIZE_OF_BSS_INFO); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - /* Get number of TLV*/ - for (i = 0; i < BSS_INFO_MAX_NUM; i++) { - if (bss_info.u4BssInfoFeature & (1 << i)) - ucTLVNumber++; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_BSSINFO_UPDATE_T)); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtBssInfoUpdateRsp); - - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BSSINFO_UPDATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_LEN_VAR_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - AndesInitCmdMsg(msg, attr); - /* Tag = 0, Fill WLAN related header here */ - CmdBssInfoUpdate.ucBssIndex = bss_info.ucBssIndex; - CmdBssInfoUpdate.u2TotalElementNum = cpu2le16(ucTLVNumber); - CmdBssInfoUpdate.ucAppendCmdTLV = TRUE; - AndesAppendCmdMsg(msg, (char *)&CmdBssInfoUpdate, - sizeof(CMD_BSSINFO_UPDATE_T)); - - for (i = 0; i < BSS_INFO_MAX_NUM; i++) { - if (bss_info.u4BssInfoFeature & - apfBssInfoTagHandle[i].BssInfoTag) { - if (apfBssInfoTagHandle[i].BssInfoTagHandler != NULL) { - apfBssInfoTagHandle[i].BssInfoTagHandler( - pAd, bss_info, msg); - } else { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BssInfoTag = %d no corresponding function handler.\n", - __func__, - apfBssInfoTagHandle[i].BssInfoTag)); - } - } - } - - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 CmdExtSetTmrCR(struct _RTMP_ADAPTER *pAd, UCHAR enable, UCHAR BandIdx) -{ - struct cmd_msg *msg = NULL; - CMD_TMR_CTRL_T CmdTmrCtrl = { 0 }; - TMR_CTRL_SET_TMR_EN_T TmrCtrlSetTmr = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 Ret = 0; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - msg = AndesAllocCmdMsg(pAd, sizeof(CMD_TMR_CTRL_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TMR_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - CmdTmrCtrl.ucTmrCtrlType = SET_TMR_ENABLE; - CmdTmrCtrl.ucTmrVer = cap->TmrHwVer; - AndesAppendCmdMsg(msg, (char *)&CmdTmrCtrl, sizeof(CMD_TMR_CTRL_T)); - - if (enable) { - TmrCtrlSetTmr.ucEnable = TRUE; - - if (enable == TMR_INITIATOR) - TmrCtrlSetTmr.ucRole = 0; - else if (enable == TMR_RESPONDER) { - TmrCtrlSetTmr.ucRole = 1; - TmrCtrlSetTmr.aucType_Subtype[0] = - FC_TYPE_MGMT | - (SUBTYPE_ACTION << TMR_PA_SUBTYPE_OFST); - TmrCtrlSetTmr.aucType_Subtype[1] = FC_TYPE_RSVED; - TmrCtrlSetTmr.aucType_Subtype[2] = FC_TYPE_RSVED; - TmrCtrlSetTmr.aucType_Subtype[3] = FC_TYPE_RSVED; - } - } else - TmrCtrlSetTmr.ucEnable = FALSE; - - TmrCtrlSetTmr.ucDbdcIdx = BandIdx; - AndesAppendCmdMsg(msg, (char *)&TmrCtrlSetTmr, - sizeof(TMR_CTRL_SET_TMR_EN_T)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) -INT32 CmdP2pNoaOffloadCtrl(RTMP_ADAPTER *ad, UINT8 enable) -{ - struct cmd_msg *msg; - struct _EXT_CMD_NOA_CTRL_T extCmdNoaCtrl; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(ad, sizeof(struct _EXT_CMD_NOA_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_NOA_OFFLOAD_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(struct _EXT_CMD_NOA_CTRL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - AndesInitCmdMsg(msg, attr); - os_zero_mem(&extCmdNoaCtrl, sizeof(extCmdNoaCtrl)); - extCmdNoaCtrl.ucMode1 = enable; - /* extCmdNoaCtrl.ucMode0 = cpu2le32(enable); */ - AndesAppendCmdMsg(msg, (char *)&extCmdNoaCtrl, sizeof(extCmdNoaCtrl)); - ret = AndesSendCmdMsg(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) */ - -static VOID CmdRxHdrTransUpdateRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); -#ifdef RT_BIG_ENDIAN - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); -#endif - - if (EventExtCmdResult->u4Status != 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::BUG::EventExtCmdResult.u4Status = 0x%x\n", - __func__, EventExtCmdResult->u4Status)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); - } -} - -INT32 CmdRxHdrTransUpdate(RTMP_ADAPTER *pAd, BOOLEAN En, BOOLEAN ChkBssid, - BOOLEAN InSVlan, BOOLEAN RmVlan, BOOLEAN SwPcP) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EXT_RX_HEADER_TRANSLATE_T ExtRxHdrTrans = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(EXT_RX_HEADER_TRANSLATE_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RX_HDR_TRANS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdRxHdrTransUpdateRsp); - AndesInitCmdMsg(msg, attr); - ExtRxHdrTrans.ucOperation = RXHDR_TRANS; - ExtRxHdrTrans.ucEnable = En; - ExtRxHdrTrans.ucCheckBssid = ChkBssid; - ExtRxHdrTrans.ucInsertVlan = InSVlan; - ExtRxHdrTrans.ucRemoveVlan = RmVlan; - ExtRxHdrTrans.ucUserQosTid = !SwPcP; - ExtRxHdrTrans.ucTranslationMode = 0; - AndesAppendCmdMsg(msg, (char *)&ExtRxHdrTrans, - sizeof(EXT_RX_HEADER_TRANSLATE_T)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -static VOID CmdRxHdrTransBLUpdateRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); -#ifdef RT_BIG_ENDIAN - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); -#endif - - if (EventExtCmdResult->u4Status != 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::BUG::EventExtCmdResult.u4Status = 0x%x\n", - __func__, EventExtCmdResult->u4Status)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); - } -} - -INT32 CmdAutoBATrigger(RTMP_ADAPTER *pAd, BOOLEAN Enable, UINT32 Timeout) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EXT_CMD_ID_AUTO_BA_T ExtAutoBa = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(EXT_CMD_ID_AUTO_BA_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_AUTO_BA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - ExtAutoBa.ucAutoBaEnable = Enable; - ExtAutoBa.ucTarget = 0; - ExtAutoBa.u4Timeout = cpu2le32(Timeout); - AndesAppendCmdMsg(msg, (char *)&ExtAutoBa, - sizeof(EXT_CMD_ID_AUTO_BA_T)); - Ret = AndesSendCmdMsg(pAd, msg); -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -#ifdef IGMP_SNOOP_SUPPORT -INT32 CmdMcastCloneEnable(RTMP_ADAPTER *pAd, UINT Enable, UINT8 omac_idx) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EXT_CMD_ID_MCAST_CLONE_T ExtMcastClone = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(EXT_CMD_ID_MCAST_CLONE_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MCAST_CLONE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - - ExtMcastClone.uc_omac_idx = omac_idx; - ExtMcastClone.ucMcastCloneEnable = Enable; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: omac_idx=%d, en=%d\n", __func__, omac_idx, Enable)); - - AndesAppendCmdMsg(msg, (char *)&ExtMcastClone, - sizeof(EXT_CMD_ID_MCAST_CLONE_T)); - Ret = AndesSendCmdMsg(pAd, msg); -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -BOOLEAN CmdMcastEntryInsert(RTMP_ADAPTER *pAd, PUCHAR GrpAddr, UINT8 BssIdx, - UINT8 Type, PUCHAR MemberAddr, PNET_DEV dev, - UINT8 WlanIndex) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EXT_CMD_ID_MULTICAST_ENTRY_INSERT_T ExtMcastEntryInsert; - struct _CMD_ATTRIBUTE attr = { 0 }; - - os_zero_mem(&ExtMcastEntryInsert, - sizeof(EXT_CMD_ID_MULTICAST_ENTRY_INSERT_T)); - - msg = AndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ID_MULTICAST_ENTRY_INSERT_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MULTICAST_ENTRY_INSERT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - AndesInitCmdMsg(msg, attr); - - if (GrpAddr) { - NdisMoveMemory(&ExtMcastEntryInsert.aucGroupId[0], - (UCHAR *)GrpAddr, 6); - ExtMcastEntryInsert.ucBssInfoIdx = BssIdx; - ExtMcastEntryInsert.ucMcastEntryType = Type; - } else { - Ret = NDIS_STATUS_FAILURE; - goto Error0; - } - - if (MemberAddr) { - NdisMoveMemory(&ExtMcastEntryInsert.aucMemberAddr[0], - (UCHAR *)MemberAddr, 6); - ExtMcastEntryInsert.ucMemberNum = 1; - ExtMcastEntryInsert.ucIndex = WlanIndex; - } - - AndesAppendCmdMsg(msg, (char *)&ExtMcastEntryInsert, - sizeof(EXT_CMD_ID_MULTICAST_ENTRY_INSERT_T)); - - Ret = AndesSendCmdMsg(pAd, msg); - -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -BOOLEAN CmdMcastEntryDelete(RTMP_ADAPTER *pAd, PUCHAR GrpAddr, UINT8 BssIdx, - PUCHAR MemberAddr, PNET_DEV dev, UINT8 WlanIndex) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EXT_CMD_ID_MULTICAST_ENTRY_DELETE_T ExtMcastEntryDelete; - - struct _CMD_ATTRIBUTE attr = { 0 }; - - os_zero_mem(&ExtMcastEntryDelete, - sizeof(EXT_CMD_ID_MULTICAST_ENTRY_DELETE_T)); - - msg = AndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ID_MULTICAST_ENTRY_DELETE_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MULTICAST_ENTRY_DELETE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - AndesInitCmdMsg(msg, attr); - - if (GrpAddr) { - NdisMoveMemory(&ExtMcastEntryDelete.aucGroupId[0], - (UCHAR *)GrpAddr, 6); - ExtMcastEntryDelete.ucBssInfoIdx = BssIdx; - } else { - Ret = NDIS_STATUS_FAILURE; - goto Error0; - } - - if (MemberAddr) { - ExtMcastEntryDelete.ucMemberNum = 1; - NdisMoveMemory(&ExtMcastEntryDelete.aucMemberAddr[0], - (UCHAR *)MemberAddr, 6); - ExtMcastEntryDelete.ucIndex = WlanIndex; - } - - AndesAppendCmdMsg(msg, (char *)&ExtMcastEntryDelete, - sizeof(EXT_CMD_ID_MULTICAST_ENTRY_DELETE_T)); - - Ret = AndesSendCmdMsg(pAd, msg); - -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -#ifdef IGMP_TVM_SUPPORT -BOOLEAN CmdSetMcastEntryAgeOut(RTMP_ADAPTER *pAd, UINT8 AgeOutTime, - UINT8 ucOwnMacIdx) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T ExtMcastSetAgeOut = { 0 }; - - struct _CMD_ATTRIBUTE attr = { 0 }; - - os_zero_mem(&ExtMcastSetAgeOut, - sizeof(EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T)); - - msg = AndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_IGMP_MULTICAST_SET_GET); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - AndesInitCmdMsg(msg, attr); - - ExtMcastSetAgeOut.ucCmdType = IGMP_MCAST_SET_AGEOUT_TIME; - ExtMcastSetAgeOut.ucOwnMacIdx = ucOwnMacIdx; - ExtMcastSetAgeOut.SetData.u4AgeOutTime = AgeOutTime; - AndesAppendCmdMsg(msg, (char *)&ExtMcastSetAgeOut, - sizeof(EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T)); - - Ret = AndesSendCmdMsg(pAd, msg); - -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -BOOLEAN CmdGetMcastEntryTable(RTMP_ADAPTER *pAd, UINT8 ucOwnMacIdx, - struct wifi_dev *wdev) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T ExtMcastGetEntryTable = { 0 }; - - struct _CMD_ATTRIBUTE attr = { 0 }; - - os_zero_mem(&ExtMcastGetEntryTable, - sizeof(EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T)); - - msg = AndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_IGMP_MULTICAST_SET_GET); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, wdev); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtEventIgmpMcastTableRsp); - - AndesInitCmdMsg(msg, attr); - - ExtMcastGetEntryTable.ucCmdType = IGMP_MCAST_GET_ENTRY_TABLE; - ExtMcastGetEntryTable.ucOwnMacIdx = ucOwnMacIdx; - AndesAppendCmdMsg(msg, (char *)&ExtMcastGetEntryTable, - sizeof(EXT_CMD_ID_IGMP_MULTICAST_SET_GET_T)); - - Ret = AndesSendCmdMsg(pAd, msg); - -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -VOID CmdExtEventIgmpMcastTableRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct wifi_dev *wdev = NULL; - struct _RTMP_ADAPTER *pAd = NULL; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s:\n", __func__)); - - wdev = (struct wifi_dev *)msg->attr.rsp.wb_buf_in_calbk; - - if (wdev) { - pAd = (struct _RTMP_ADAPTER *)wdev->sys_handle; - IgmpSnoopingShowMulticastTable(pAd, wdev); - } -} - -#endif /* IGMP_TVM_SUPPORT */ -#endif - -INT32 CmdRxHdrTransBLUpdate(RTMP_ADAPTER *pAd, UINT8 Index, UINT8 En, - UINT16 EthType) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EXT_RX_HEADER_TRANSLATE_BL_T ExtRxHdrTransBL = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = AndesAllocCmdMsg(pAd, sizeof(EXT_RX_HEADER_TRANSLATE_BL_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto Error0; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RX_HDR_TRANS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdRxHdrTransBLUpdateRsp); - AndesInitCmdMsg(msg, attr); - ExtRxHdrTransBL.ucOperation = RXHDR_BL; - ExtRxHdrTransBL.ucCount = 1; - ExtRxHdrTransBL.ucBlackListIndex = Index; - ExtRxHdrTransBL.ucEnable = En; - ExtRxHdrTransBL.usEtherType = cpu2le16(EthType); - AndesAppendCmdMsg(msg, (char *)&ExtRxHdrTransBL, - sizeof(EXT_RX_HEADER_TRANSLATE_BL_T)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -Error0: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -static VOID CmdExtGeneralTestRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - UINT8 Status; - - Status = *Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("General Test status=%d\n", Status)); - - switch (Status) { - case TARGET_ADDRESS_LEN_SUCCESS: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: General Test success\n", __func__)); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: General Test success Unknow Status(%d)\n", - __func__, Status)); - break; - } -} - -#ifdef ERR_RECOVERY - -INT32 CmdExtGeneralTestOn(struct _RTMP_ADAPTER *pAd, BOOLEAN enable) -{ - struct cmd_msg *msg = NULL; - EXT_CMD_GENERAL_TEST_T CmdGeneralTest = { 0 }; - UINT32 MsgLen; - INT32 Ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MsgLen = sizeof(CMD_STAREC_UPDATE_T); - msg = AndesAllocCmdMsg(pAd, MsgLen); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GENERAL_TEST); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtGeneralTestRsp); - AndesInitCmdMsg(msg, attr); - /* Fill command related header here*/ - CmdGeneralTest.ucCategory = GENERAL_TEST_CATEGORY_SIM_ERROR_DETECTION; - CmdGeneralTest.ucAction = GENERAL_TEST_ACTION_SWITCH_ON_OFF; - CmdGeneralTest.Data.rGeneralTestSimErrorSwitchOnOff.ucSwitchMode = - enable; - AndesAppendCmdMsg(msg, (char *)&CmdGeneralTest, - sizeof(EXT_CMD_GENERAL_TEST_T)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: CmdExtGeneralTest:\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucCategory=%d, ucAction=%d, ucSwitchMode=%d\n", __func__, - CmdGeneralTest.ucCategory, CmdGeneralTest.ucAction, - CmdGeneralTest.Data.rGeneralTestSimErrorSwitchOnOff - .ucSwitchMode)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 CmdExtGeneralTestMode(struct _RTMP_ADAPTER *pAd, UINT8 mode, - UINT8 submode) -{ - struct cmd_msg *msg = NULL; - EXT_CMD_GENERAL_TEST_T CmdGeneralTest = { 0 }; - UINT32 MsgLen; - INT32 Ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MsgLen = sizeof(CMD_STAREC_UPDATE_T); - msg = AndesAllocCmdMsg(pAd, MsgLen); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GENERAL_TEST); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtGeneralTestRsp); - AndesInitCmdMsg(msg, attr); - /* Fill command related header here*/ - CmdGeneralTest.ucCategory = GENERAL_TEST_CATEGORY_SIM_ERROR_DETECTION; - CmdGeneralTest.ucAction = GENERAL_TEST_ACTION_RECOVERY; - CmdGeneralTest.Data.rGeneralTestSimErrDetRecovery.ucModule = mode; - CmdGeneralTest.Data.rGeneralTestSimErrDetRecovery.ucSubModule = submode; - AndesAppendCmdMsg(msg, (char *)&CmdGeneralTest, - sizeof(EXT_CMD_GENERAL_TEST_T)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: CmdExtGeneralTest:\n", __func__)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucCategory=%d, ucAction=%d, ucModule=%d ucSubModule=%d\n", - __func__, CmdGeneralTest.ucCategory, CmdGeneralTest.ucAction, - CmdGeneralTest.Data.rGeneralTestSimErrDetRecovery.ucModule, - CmdGeneralTest.Data.rGeneralTestSimErrDetRecovery.ucSubModule)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} -#endif /* ERR_RECOVERY */ - -INT32 CmdExtGeneralTestAPPWS(struct _RTMP_ADAPTER *pAd, UINT action) -{ - struct cmd_msg *msg = NULL; - EXT_CMD_GENERAL_TEST_T CmdGeneralTest = { 0 }; - UINT32 MsgLen; - INT32 Ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MsgLen = sizeof(EXT_CMD_GENERAL_TEST_T); - msg = AndesAllocCmdMsg(pAd, MsgLen); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GENERAL_TEST); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtGeneralTestRsp); - AndesInitCmdMsg(msg, attr); - /* Fill command related header here*/ - CmdGeneralTest.ucCategory = GENERAL_TEST_CATEGORY_APPWS; - CmdGeneralTest.ucAction = action; - AndesAppendCmdMsg(msg, (char *)&CmdGeneralTest, - sizeof(EXT_CMD_GENERAL_TEST_T)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ucCategory=%d, ucAction=%d\n", __func__, - CmdGeneralTest.ucCategory, CmdGeneralTest.ucAction)); - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 CmdExtSER(struct _RTMP_ADAPTER *pAd, UINT_8 action, UINT8 ser_set) -{ - struct cmd_msg *msg = NULL; - EXT_CMD_SER_T cmdSER = { 0 }; - UINT32 MsgLen; - INT32 Ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MsgLen = sizeof(EXT_CMD_SER_T); - msg = AndesAllocCmdMsg(pAd, MsgLen); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SER); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); - /* Fill command related header here*/ - cmdSER.action = action; - cmdSER.ser_set = ser_set; - - AndesAppendCmdMsg(msg, (char *)&cmdSER, sizeof(EXT_CMD_SER_T)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: action=%d ser_set=%d\n", __func__, cmdSER.action, - cmdSER.ser_set)); - - /* Send out CMD */ - Ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl.c deleted file mode 100644 index 37fe3bbbcf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - fwdl.c -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "fwdl.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -INT NICLoadRomPatch(RTMP_ADAPTER *ad) -{ - int ret = NDIS_STATUS_SUCCESS; - - ret = mt_load_patch(ad); - - return ret; -} - -INT NICLoadFirmware(RTMP_ADAPTER *ad) -{ - int ret = NDIS_STATUS_SUCCESS; - - ret = mt_load_fw(ad); - - return ret; -} - -VOID NICRestartFirmware(RTMP_ADAPTER *ad) -{ - int ret = NDIS_STATUS_SUCCESS; - - ret = mt_restart_fw(ad); -} - -INT FwdlHookInit(RTMP_ADAPTER *pAd) -{ - int ret = NDIS_STATUS_SUCCESS; - - ret = mt_fwdl_hook_init(pAd); - - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl_mt.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl_mt.c deleted file mode 100644 index 8ed9773629..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/fwdl_mt.c +++ /dev/null @@ -1,1236 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - fwdl.c -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "fwdl_mt.tmh" -#endif - -struct MCU_CTRL; - -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -static VOID img_get_8bit(UINT8 *dest, UINT8 **src, UINT32 cnt) -{ - UINT32 i; - - for (i = 0; i < cnt; i++) { - dest[i] = *(*src + i); - } - - *src += cnt; -} - -static VOID img_get_32bit(UINT32 *dest, UINT8 **src, UINT32 cnt) -{ - UINT32 i; - - for (i = 0; i < cnt; i++) { - dest[i] = (UINT32)((*(*src + (i * 4) + 3) << 24) | - (*(*src + (i * 4) + 2) << 16) | - (*(*src + (i * 4) + 1) << 8) | - (*(*src + (i * 4)) << 0)); - } - - *src += cnt * 4; -} - -static INT32 MtCmdFwScatters(RTMP_ADAPTER *ad, UINT8 *image, UINT32 image_len) -{ - UINT32 sent_len; - UINT32 cur_len = 0, count = 0; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - int ret = 0; - - while (1) { - UINT32 sent_len_max = MT_UPLOAD_FW_UNIT - cap->cmd_header_len; - - sent_len = (image_len - cur_len) >= sent_len_max ? - sent_len_max : - (image_len - cur_len); - - if (sent_len > 0) { - ret = MtCmdFwScatter(ad, image + cur_len, sent_len, - count); - count++; - - if (ret) - goto error; - - cur_len += sent_len; - } else - break; - } - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static NDIS_STATUS load_code(struct _RTMP_ADAPTER *pAd, UINT32 method, - struct img_source *src) -{ - NDIS_STATUS ret = NDIS_STATUS_FAILURE; - - if ((ret != NDIS_STATUS_SUCCESS) && (method & BIT(BIN_METHOD))) { - if (src->bin_name) - os_load_code_from_bin(pAd, &src->img_ptr, src->bin_name, - &src->img_len); - - if (src->img_ptr) { - src->applied_method = BIN_METHOD; - ret = NDIS_STATUS_SUCCESS; - } - } - - if ((ret != NDIS_STATUS_SUCCESS) && (method & BIT(HEADER_METHOD))) { - if (src->header_ptr && src->header_len) { - src->img_ptr = src->header_ptr; - src->img_len = src->header_len; - src->applied_method = HEADER_METHOD; - ret = NDIS_STATUS_SUCCESS; - } - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("load code method: cap (bitmap) = 0x%x, applied = %d\n", - method, src->applied_method)); - - return ret; -} - -static NDIS_STATUS alloc_patch_target(struct _RTMP_ADAPTER *pAd, - struct patch_dl_target *target, - UINT32 count) -{ - if (count < 0) - return NDIS_STATUS_FAILURE; - - target->num_of_region = count; - return os_alloc_mem(pAd, (UCHAR **)&target->patch_region, - count * sizeof(struct patch_dl_buf)); -} - -static VOID free_patch_target(struct _RTMP_ADAPTER *pAd, - struct patch_dl_target *target) -{ - os_free_mem(target->patch_region); - target->patch_region = NULL; - target->num_of_region = 0; -} - -static NDIS_STATUS alloc_fw_target(struct _RTMP_ADAPTER *pAd, - struct fw_dl_target *target, UINT32 count) -{ - if (count < 0) - return NDIS_STATUS_FAILURE; - - target->num_of_region = count; - return os_alloc_mem(pAd, (UCHAR **)&target->fw_region, - count * sizeof(struct fw_dl_buf)); -} - -static VOID free_fw_target(struct _RTMP_ADAPTER *pAd, - struct fw_dl_target *target) -{ - os_free_mem(target->fw_region); - target->fw_region = NULL; - target->num_of_region = 0; -} - -static VOID show_patch_info_cpu(struct patch_info *patch_info) -{ - FWDL_PRINT_CHAR(patch_info->built_date, 16, ("\tBuilt date: ")); - FWDL_PRINT_CHAR(patch_info->platform, 4, ("\tPlatform: ")); - FWDL_PRINT_HEX(patch_info->hw_sw_version, 4, ("\tHW/SW version: ")); - FWDL_PRINT_HEX(patch_info->patch_version, 4, ("\tPatch version: ")); -} - -VOID show_patch_info(struct _RTMP_ADAPTER *pAd) -{ - RTMP_CHIP_CAP *chip_cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT32 need_load, i; - struct patch_info *patch_info; - - need_load = chip_cap->need_load_patch; - - for (i = 0; i < MAX_CPU; i++) { - if (need_load & BIT(i)) { - patch_info = &pAd->MCUCtrl.fwdl_ctrl.patch_profile[i] - .patch_info; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CPU %d patch info\n", i)); - - show_patch_info_cpu(patch_info); - } - } -} - -static VOID show_fw_info_cpu(struct fw_info *fw_info) -{ - FWDL_PRINT_HEX(&fw_info->chip_id, 1, ("\tChip ID: ")); - FWDL_PRINT_HEX(&fw_info->eco_ver, 1, ("\tEco version: ")); - FWDL_PRINT_HEX(&fw_info->num_of_region, 1, ("\tRegion number: ")); - FWDL_PRINT_HEX(&fw_info->format_ver, 1, ("\tFormat version: ")); - FWDL_PRINT_CHAR(fw_info->ram_ver, 10, ("\tRam version: ")); - FWDL_PRINT_CHAR(fw_info->ram_built_date, 15, ("\tBuilt date: ")); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tCommon crc: 0x%x\n", fw_info->crc)); -} - -VOID show_fw_info(struct _RTMP_ADAPTER *pAd) -{ - RTMP_CHIP_CAP *chip_cap = hc_get_chip_cap(pAd->hdev_ctrl); - UINT32 need_load, i; - struct fw_info *fw_info; - - need_load = chip_cap->need_load_fw; - - for (i = 0; i < MAX_CPU; i++) { - if (need_load & BIT(i)) { - fw_info = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[i].fw_info; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CPU %d fw info\n", i)); - - show_fw_info_cpu(fw_info); - } - } -} - -static NDIS_STATUS parse_patch_v1(struct _RTMP_ADAPTER *pAd, - enum target_cpu cpu, - struct patch_dl_target *target) -{ - NDIS_STATUS ret; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - struct img_source *src; - struct patch_info *patch_info; - UINT8 *img_ptr; - UINT32 num_of_region, i; - - src = &pAd->MCUCtrl.fwdl_ctrl.patch_profile[cpu].source; - patch_info = &pAd->MCUCtrl.fwdl_ctrl.patch_profile[cpu].patch_info; - - ret = load_code(pAd, cap->load_patch_method, src); - if (ret) - goto out; - - /* parse patch info */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Parsing patch header\n")); - - img_ptr = src->img_ptr; - - img_get_8bit(patch_info->built_date, &img_ptr, 16); - img_get_8bit(patch_info->platform, &img_ptr, 4); - img_get_8bit(patch_info->hw_sw_version, &img_ptr, 4); - img_get_8bit(patch_info->patch_version, &img_ptr, 4); - - show_patch_info_cpu(patch_info); - - /* fix to one region for this rom patch format */ - num_of_region = 1; - - ret = alloc_patch_target(pAd, target, num_of_region); - if (ret) - goto out; - - for (i = 0; i < num_of_region; i++) { - struct patch_dl_buf *region; - - region = &target->patch_region[i]; - - region->img_dest_addr = cap->rom_patch_offset; - region->img_size = src->img_len - PATCH_V1_INFO_SIZE; - region->img_ptr = src->img_ptr + PATCH_V1_INFO_SIZE; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTarget address: 0x%x, length: %d\n", - region->img_dest_addr, region->img_size)); - } - - return NDIS_STATUS_SUCCESS; - -out: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: parse patch fail\n", __func__)); - - return ret; -} - -static NDIS_STATUS load_patch_v1(struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct patch_dl_target *target) -{ - NDIS_STATUS ret; - UINT32 num_of_region, i; - struct fwdl_ctrl *fwdl_ctrl; - - ret = NDIS_STATUS_SUCCESS; - fwdl_ctrl = &pAd->MCUCtrl.fwdl_ctrl; - num_of_region = target->num_of_region; - - if (num_of_region < 0) { - ret = NDIS_STATUS_FAILURE; - goto out; - } - - for (i = 0; i < num_of_region; i++) { - struct patch_dl_buf *region; - - region = &target->patch_region[i]; - - fwdl_ctrl->stage = FWDL_STAGE_CMD_EVENT; - - /* 1. get semaphore */ - ret = MtCmdPatchSemGet(pAd, GET_PATCH_SEM); - if (ret) - goto out; - - switch (fwdl_ctrl->sem_status) { - case PATCH_NOT_DL_SEM_FAIL: - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("patch is not ready && get semaphore fail\n")); - ret = NDIS_STATUS_FAILURE; - goto out; - break; - case PATCH_IS_DL: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("patch is ready, continue to ILM/DLM DL\n")); - ret = NDIS_STATUS_SUCCESS; - goto out; - break; - case PATCH_NOT_DL_SEM_SUCCESS: - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("patch is not ready && get semaphore success\n")); - break; - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("get semaphore invalid status(%d)\n", - fwdl_ctrl->sem_status)); - ret = NDIS_STATUS_FAILURE; - goto out; - break; - } - - /* 2. config PDA */ - ret = MtCmdAddressLenReq(pAd, region->img_dest_addr, - region->img_size, - MODE_TARGET_ADDR_LEN_NEED_RSP); - if (ret) - goto out; - - /* 3. image scatter */ - fwdl_ctrl->stage = FWDL_STAGE_SCATTER; - - ret = MtCmdFwScatters(pAd, region->img_ptr, region->img_size); - if (ret) - goto out; - - /* 4. patch start */ - fwdl_ctrl->stage = FWDL_STAGE_CMD_EVENT; - - ret = MtCmdPatchFinishReq(pAd); - if (ret) - goto out; - - /* 5. release semaphore */ - ret = MtCmdPatchSemGet(pAd, REL_PATCH_SEM); - if (ret) - goto out; - - if (fwdl_ctrl->sem_status == SEM_RELEASE) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("release patch semaphore\n")); - } else { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("release patch semaphore invalid status(%d)\n", - fwdl_ctrl->sem_status)); - ret = NDIS_STATUS_FAILURE; - goto out; - } - } - -out: - free_patch_target(pAd, target); - - if (ret) { - fwdl_ctrl->stage = FWDL_STAGE_FW_NOT_DL; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: load patch fail\n", __func__)); - } - - return ret; -} - -static NDIS_STATUS parse_fw_v1(struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct fw_dl_target *target) -{ - NDIS_STATUS ret; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - struct img_source *src; - struct fw_info *fw_info; - UINT8 *img_ptr; - UINT32 num_of_region, i; - - src = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[cpu].source; - fw_info = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[cpu].fw_info; - - ret = load_code(pAd, cap->load_fw_method, src); - if (ret) - goto out; - - /* parse fw info */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Parsing CPU %d fw tailer\n", cpu)); - - img_ptr = src->img_ptr + src->img_len - 29; - - img_get_8bit(fw_info->ram_ver, &img_ptr, 10); - img_get_8bit(fw_info->ram_built_date, &img_ptr, 15); - - show_fw_info_cpu(fw_info); - - /* fix to 1 because they're all von-neumann architecture */ - num_of_region = 1; - - ret = alloc_fw_target(pAd, target, num_of_region); - if (ret) - goto out; - - for (i = 0; i < num_of_region; i++) { - UINT32 dl_len; - struct fw_dl_buf *region; - - img_ptr = src->img_ptr + src->img_len - 4; - - img_get_32bit(&dl_len, &img_ptr, 1); - dl_len += 4; /* including 4 byte inverse-crc */ - - region = &target->fw_region[i]; -#define FW_CODE_START_ADDRESS1 0x100000 - region->img_dest_addr = - FW_CODE_START_ADDRESS1; /* hard code because header don't have it */ - region->img_size = dl_len; - region->img_ptr = src->img_ptr; - region->feature_set = - 0; /* no feature set field for this fw format */ - region->feature_set |= - FW_FEATURE_OVERRIDE_RAM_ADDR; /* hard code this field to override ram starting address */ - } - - return NDIS_STATUS_SUCCESS; - -out: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: parse fw fail\n", __func__)); - - return ret; -} - -static NDIS_STATUS parse_fw_v2(struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct fw_dl_target *target) -{ - NDIS_STATUS ret; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - struct img_source *src; - struct fw_info *fw_info; - UINT8 *img_ptr; - UINT32 num_of_region, i, offset; - - src = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[cpu].source; - fw_info = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[cpu].fw_info; - offset = 0; - - ret = load_code(pAd, cap->load_fw_method, src); - if (ret) - goto out; - - /* parse fw info */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Parsing CPU %d fw tailer\n", cpu)); - - img_ptr = src->img_ptr + src->img_len - FW_V2_INFO_SIZE; - - img_ptr += 4; /* bypass destination address field */ - img_get_8bit(&fw_info->chip_id, &img_ptr, 1); - img_ptr += 1; /* bypass feature set field */ - img_get_8bit(&fw_info->eco_ver, &img_ptr, 1); - img_get_8bit(fw_info->ram_ver, &img_ptr, 10); - img_get_8bit(fw_info->ram_built_date, &img_ptr, 15); - - show_fw_info_cpu(fw_info); - - if (cpu == WA_CPU) - num_of_region = - 1; /* for 7615 CR4, which is von-neumann architecture */ - else - num_of_region = - 2; /* fix to 2 because they're all harvard architecture */ - - ret = alloc_fw_target(pAd, target, num_of_region); - if (ret) - goto out; - - /* first region first parsing */ - for (i = 0; i < num_of_region; i++) { - UINT32 dl_addr, dl_len; - UINT8 dl_feature_set; - struct fw_dl_buf *region; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Parsing tailer region %d\n", i)); - - img_ptr = src->img_ptr + src->img_len - - (num_of_region - i) * FW_V2_INFO_SIZE; - - img_get_32bit(&dl_addr, &img_ptr, 1); - - img_ptr += 1; /* bypass chip id field */ - - img_get_8bit(&dl_feature_set, &img_ptr, 1); - FWDL_PRINT_HEX(&dl_feature_set, 1, ("\tFeature set: ")); - - img_ptr += 26; /* jump to size field */ - - img_get_32bit(&dl_len, &img_ptr, 1); - dl_len += 4; /* including 4 byte inverse-crc */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTarget address: 0x%x, Download size: %d\n", - dl_addr, dl_len)); - - region = &target->fw_region[i]; - region->img_dest_addr = dl_addr; - region->img_size = dl_len; - region->img_ptr = src->img_ptr + offset; - offset += dl_len; - region->feature_set = dl_feature_set; - if (IS_MT7615(pAd) && (cpu == WM_CPU) && - (i == 0)) { /* for 7615 N9 ILM */ - region->feature_set |= - FW_FEATURE_OVERRIDE_RAM_ADDR; /* hard code this field to override ram starting address */ - } - } - - return NDIS_STATUS_SUCCESS; - -out: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: parse fw fail\n", __func__)); - - return ret; -} - -static NDIS_STATUS parse_fw_v3(struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct fw_dl_target *target) -{ - NDIS_STATUS ret; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - struct img_source *src; - UINT8 *img_ptr; - struct fw_info *fw_info; - UINT32 num_of_region, i, offset; - - src = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[cpu].source; - fw_info = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[cpu].fw_info; - offset = 0; - - ret = load_code(pAd, cap->load_fw_method, src); - if (ret) - goto out; - - /* parse fw info */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Parsing CPU %d fw tailer\n", cpu)); - - img_ptr = src->img_ptr + src->img_len - FW_V3_COMMON_TAILER_SIZE; - - img_get_8bit(&fw_info->chip_id, &img_ptr, 1); - img_get_8bit(&fw_info->eco_ver, &img_ptr, 1); - img_get_8bit(&fw_info->num_of_region, &img_ptr, 1); - img_get_8bit(&fw_info->format_ver, &img_ptr, 1); - img_ptr += 3; /* bypass reserved field */ - img_get_8bit(fw_info->ram_ver, &img_ptr, 10); - img_get_8bit(fw_info->ram_built_date, &img_ptr, 15); - img_get_32bit(&fw_info->crc, &img_ptr, 1); - - show_fw_info_cpu(fw_info); - - num_of_region = fw_info->num_of_region; - - ret = alloc_fw_target(pAd, target, num_of_region); - if (ret) - goto out; - - /* first region first parsing */ - for (i = 0; i < num_of_region; i++) { - struct fw_dl_buf *region; - UINT32 dl_addr, dl_len, decomp_crc, decomp_len, - decomp_block_size; - UINT8 dl_feature_set; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Parsing tailer region %d\n", i)); - - img_ptr = src->img_ptr + src->img_len - - FW_V3_COMMON_TAILER_SIZE - - (num_of_region - i) * FW_V3_REGION_TAILER_SIZE; - - img_get_32bit(&decomp_crc, &img_ptr, 1); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDecomp crc: 0x%x\n", decomp_crc)); - - img_get_32bit(&decomp_len, &img_ptr, 1); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDecomp size: 0x%x\n", decomp_len)); - - img_get_32bit(&decomp_block_size, &img_ptr, 1); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDecomp block size: 0x%x\n", decomp_block_size)); - - img_ptr += 4; /* bypass reserved field */ - - img_get_32bit(&dl_addr, &img_ptr, 1); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tTarget address: 0x%x\n", dl_addr)); - - img_get_32bit(&dl_len, &img_ptr, 1); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\tDownload size: %d\n", dl_len)); - - img_get_8bit(&dl_feature_set, &img_ptr, 1); - FWDL_PRINT_HEX(&dl_feature_set, 1, ("\tFeature set: ")); - - region = &target->fw_region[i]; - region->img_dest_addr = dl_addr; - region->img_size = dl_len; - region->feature_set = dl_feature_set; - region->decomp_crc = decomp_crc; - region->decomp_img_size = decomp_len; - region->decomp_block_size = decomp_block_size; - region->img_ptr = src->img_ptr + offset; - offset += dl_len; - } - - return NDIS_STATUS_SUCCESS; - -out: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: parse fw fail\n", __func__)); - - return ret; -} - -static NDIS_STATUS load_fw_v1(struct _RTMP_ADAPTER *pAd, enum target_cpu cpu, - struct fw_dl_target *target) -{ - NDIS_STATUS ret; - UINT32 num_of_region, i, override, override_addr; - struct fwdl_ctrl *fwdl_ctrl; - struct MCU_CTRL *mcu_ctrl; - - ret = NDIS_STATUS_SUCCESS; - override = 0; - override_addr = 0; - fwdl_ctrl = &pAd->MCUCtrl.fwdl_ctrl; - mcu_ctrl = &pAd->MCUCtrl; - num_of_region = target->num_of_region; - - if (num_of_region < 0) { - ret = NDIS_STATUS_FAILURE; - goto out; - } - - /* first parsing first download */ - for (i = 0; i < num_of_region; i++) { - struct fw_dl_buf *region; - - region = &target->fw_region[i]; - - if (region->feature_set & FW_FEATURE_OVERRIDE_RAM_ADDR) { - override |= FW_START_OVERRIDE_START_ADDRESS; - override_addr = region->img_dest_addr; - } - - fwdl_ctrl->stage = FWDL_STAGE_CMD_EVENT; - - /* 1. config PDA */ - ret = MtCmdAddressLenReq( - pAd, region->img_dest_addr, region->img_size, - ((region->feature_set & FW_FEATURE_SET_ENCRY) ? - MODE_ENABLE_ENCRY : - 0) | - (MODE_SET_KEY(GET_FW_FEATURE_SET_KEY( - region->feature_set))) | - ((region->feature_set & FW_FEATURE_SET_ENCRY) ? - MODE_RESET_SEC_IV : - 0) | - ((cpu == WA_CPU) ? MODE_WORKING_PDA_OPTION : - 0) | - MODE_TARGET_ADDR_LEN_NEED_RSP); - if (ret) - goto out; - - /* 2. image scatter */ - fwdl_ctrl->stage = FWDL_STAGE_SCATTER; - - ret = MtCmdFwScatters(pAd, region->img_ptr, region->img_size); - if (ret) - goto out; - } - - /* 3. fw start negotiation */ - fwdl_ctrl->stage = FWDL_STAGE_CMD_EVENT; - - ret = MtCmdFwStartReq( - pAd, - override | ((cpu == WA_CPU) ? FW_START_WORKING_PDA_OPTION : 0), - override_addr); - -out: - free_fw_target(pAd, target); - - if (ret) { - fwdl_ctrl->stage = FWDL_STAGE_FW_NOT_DL; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: load fw fail\n", __func__)); - } - - return ret; -} - -static NDIS_STATUS load_fw_v2_compressimg(struct _RTMP_ADAPTER *pAd, - enum target_cpu cpu, - struct fw_dl_target *target) -{ - NDIS_STATUS ret; - UINT32 num_of_region, i, override, override_addr; - UINT32 compress_region_num = 0; - UINT32 block_idx = 0; - UINT32 block_dest_addr; - UINT32 remain_chunk_size = 0; - UINT8 *img_ptr_pos = NULL; - struct fwdl_ctrl *fwdl_ctrl; - struct MCU_CTRL *mcu_ctrl; - INIT_CMD_WIFI_START_WITH_DECOMPRESSION decompress_info; - UINT8 do_compressed_dl = 0; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - ret = NDIS_STATUS_SUCCESS; - override = 0; - override_addr = 0; - fwdl_ctrl = &pAd->MCUCtrl.fwdl_ctrl; - mcu_ctrl = &pAd->MCUCtrl; - num_of_region = target->num_of_region; - - if (num_of_region < 0) { - ret = NDIS_STATUS_FAILURE; - goto out; - } - - /* first parsing first download */ - for (i = 0; i < num_of_region; i++) { - struct fw_dl_buf *region; - - region = &target->fw_region[i]; - img_ptr_pos = region->img_ptr; - remain_chunk_size = region->img_size; - if (region->feature_set & FW_FEATURE_OVERRIDE_RAM_ADDR) { - override |= FW_START_OVERRIDE_START_ADDRESS; - override_addr = region->img_dest_addr; - } - if (region->feature_set & - FW_FEATURE_COMPRESS_IMG) { /* Compressed image Process */ - do_compressed_dl = 1; - block_idx = 0; - compress_region_num += 1; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("REGION[%d] COMPRESSED IMAGE DOWNLOAD\n", i)); - while (remain_chunk_size > 0) { - UINT32 payload_size_per_chunk = 0; - - fwdl_ctrl->stage = FWDL_STAGE_CMD_EVENT; - img_get_32bit(&payload_size_per_chunk, - &img_ptr_pos, 1); - remain_chunk_size -= 4; - /* 1. config PDA */ - block_dest_addr = - region->img_dest_addr + - block_idx * region->decomp_block_size; - ret = MtCmdAddressLenReq( - pAd, block_dest_addr, - payload_size_per_chunk, - ((region->feature_set & - FW_FEATURE_SET_ENCRY) ? - MODE_ENABLE_ENCRY : - 0) | - (MODE_SET_KEY(GET_FW_FEATURE_SET_KEY( - region->feature_set))) | - ((region->feature_set & - FW_FEATURE_SET_ENCRY) ? - MODE_RESET_SEC_IV : - 0) | - ((cpu == WA_CPU) ? - MODE_WORKING_PDA_OPTION : - 0) | - MODE_TARGET_ADDR_LEN_NEED_RSP); - if (ret) - goto out; - /* 2. image scatter */ - fwdl_ctrl->stage = FWDL_STAGE_SCATTER; - ret = MtCmdFwScatters(pAd, img_ptr_pos, - payload_size_per_chunk); - if (ret) - goto out; - remain_chunk_size -= payload_size_per_chunk; - img_ptr_pos += payload_size_per_chunk; - block_idx++; - } - decompress_info.aucDecompRegion[i].u4RegionAddress = - region->img_dest_addr; - decompress_info.aucDecompRegion[i].u4Regionlength = - region->decomp_img_size; - decompress_info.aucDecompRegion[i].u4RegionCRC = - region->decomp_crc; - decompress_info.u4BlockSize = region->decomp_block_size; - } else { /* Uncompressed Image Process*/ - fwdl_ctrl->stage = FWDL_STAGE_CMD_EVENT; - /* 1. config PDA */ - ret = MtCmdAddressLenReq( - pAd, region->img_dest_addr, region->img_size, - ((region->feature_set & FW_FEATURE_SET_ENCRY) ? - MODE_ENABLE_ENCRY : - 0) | - (MODE_SET_KEY(GET_FW_FEATURE_SET_KEY( - region->feature_set))) | - ((region->feature_set & - FW_FEATURE_SET_ENCRY) ? - MODE_RESET_SEC_IV : - 0) | - ((cpu == WA_CPU) ? - MODE_WORKING_PDA_OPTION : - 0) | - MODE_TARGET_ADDR_LEN_NEED_RSP); - if (ret) - goto out; - /* 2. image scatter */ - fwdl_ctrl->stage = FWDL_STAGE_SCATTER; - - ret = MtCmdFwScatters(pAd, region->img_ptr, - region->img_size); - if (ret) - goto out; - } - } /* num_of_region */ - fwdl_ctrl->stage = FWDL_STAGE_CMD_EVENT; - if (do_compressed_dl) { - /*if the override[5] is not set, the ROM CODE will use default WIFI ILM as start address */ - decompress_info.u4Address = override_addr; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Start CMD Jump Address 0x%x\n", - decompress_info.u4Address)); - decompress_info.u4DecompressTmpAddress = - cap->decompress_tmp_addr; - override |= ((cpu == WA_CPU) ? FW_START_WORKING_PDA_OPTION : 0); - override |= FW_CHANGE_DECOMPRESSION_TMP_ADDRESS; - decompress_info.u4Override = override; - decompress_info.u4RegionNumber = compress_region_num; - /* 3. fw start negotiation */ - ret = MtCmdFwDecompressStart(pAd, &decompress_info); - } else { - /* 3. fw start negotiation */ - ret = MtCmdFwStartReq( - pAd, - override | - ((cpu == WA_CPU) ? FW_START_WORKING_PDA_OPTION : - 0), - override_addr); - } -out: - free_fw_target(pAd, target); - - if (ret) { - fwdl_ctrl->stage = FWDL_STAGE_FW_NOT_DL; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: load fw fail\n", __func__)); - } - - return ret; -} - -static VOID free_patch_buf(RTMP_ADAPTER *pAd) -{ - UINT32 i, loaded; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - loaded = cap->need_load_patch; - - for (i = 0; i < MAX_CPU; i++) { - if (loaded & BIT(i)) { - struct img_source *src; - - src = &pAd->MCUCtrl.fwdl_ctrl.patch_profile[i].source; - if ((src->applied_method == BIN_METHOD) && - (src->img_ptr)) { - os_free_mem(src->img_ptr); - src->img_ptr = NULL; - } - } - } -} - -static VOID free_fw_buf(RTMP_ADAPTER *pAd) -{ - UINT32 i, loaded; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - loaded = cap->need_load_fw; - - for (i = 0; i < MAX_CPU; i++) { - if (loaded & BIT(i)) { - struct img_source *src; - - src = &pAd->MCUCtrl.fwdl_ctrl.fw_profile[i].source; - if ((src->applied_method == BIN_METHOD) && - (src->img_ptr)) { - os_free_mem(src->img_ptr); - src->img_ptr = NULL; - } - } - } -} - -/* - * setup fw wifi task to be in the right state for a specific fwdl stage - */ -static NDIS_STATUS ctrl_fw_state_v2(struct _RTMP_ADAPTER *pAd, - enum fwdl_stage target_stage) -{ - NDIS_STATUS ret; - UINT32 fw_sync, loop; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - ret = NDIS_STATUS_SUCCESS; - fw_sync = MtAsicGetFwSyncValue(pAd); - - switch (target_stage) { - case FWDL_STAGE_FW_NOT_DL: - /* could be in both state because of wifi default on/off */ - if (fw_sync == WIFI_TASK_STATE_INITIAL || - fw_sync == WIFI_TASK_STATE_FW_DOWNLOAD) { - ret = NDIS_STATUS_SUCCESS; - break; - } - - /* fw restart cmd*/ - ret = MtCmdRestartDLReq(pAd); - if (ret) - break; - - /* polling */ - loop = 0; - ret = NDIS_STATUS_FAILURE; - do { - fw_sync = MtAsicGetFwSyncValue(pAd); - - if (fw_sync == WIFI_TASK_STATE_INITIAL || - fw_sync == WIFI_TASK_STATE_FW_DOWNLOAD) { - ret = NDIS_STATUS_SUCCESS; - break; - } - - RtmpOsMsDelay(1); - loop++; - } while (loop <= WAIT_LOOP); - - break; - case FWDL_STAGE_CMD_EVENT: - case FWDL_STAGE_SCATTER: - if (fw_sync == WIFI_TASK_STATE_FW_DOWNLOAD) { - ret = NDIS_STATUS_SUCCESS; - break; - } else if (fw_sync == WIFI_TASK_STATE_INITIAL) { - /* power on wifi sys */ - ret = MtCmdPowerOnWiFiSys(pAd); - if (ret) - break; - } else { - /* in RAM code, use restart cmd */ - ret = MtCmdRestartDLReq(pAd); - if (ret) - break; - - /* power on wifi sys */ - ret = MtCmdPowerOnWiFiSys(pAd); - if (ret) - break; - } - - /* polling */ - loop = 0; - ret = NDIS_STATUS_FAILURE; - do { - fw_sync = MtAsicGetFwSyncValue(pAd); - - if (fw_sync == WIFI_TASK_STATE_FW_DOWNLOAD) { - ret = NDIS_STATUS_SUCCESS; - break; - } - - RtmpOsMsDelay(1); - loop++; - } while (loop <= WAIT_LOOP); - - break; - case FWDL_STAGE_FW_RUNNING: { - UINT32 target_fw_sync; - - target_fw_sync = (cap->need_load_fw & BIT(WA_CPU)) ? - WIFI_TASK_STATE_WACPU_RDY : - WIFI_TASK_STATE_NORMAL_TRX; - - if (fw_sync == target_fw_sync) { - ret = NDIS_STATUS_SUCCESS; - break; - } - - /* polling */ - loop = 0; - ret = NDIS_STATUS_FAILURE; - do { - fw_sync = MtAsicGetFwSyncValue(pAd); - - if (fw_sync == target_fw_sync) { - ret = NDIS_STATUS_SUCCESS; - break; - } - - RtmpOsMsDelay(1); - loop++; - } while (loop <= WAIT_LOOP); - } - - break; - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: invalid target stage\n", __func__)); - ret = NDIS_STATUS_FAILURE; - break; - } - - if (ret) - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fail, target stage = %d, current sync CR = %d \n", - __func__, target_stage, fw_sync)); - - return ret; -} - -NDIS_STATUS mt_fwdl_hook_init(struct _RTMP_ADAPTER *pAd) -{ - NDIS_STATUS ret; - struct fwdl_op *op = &pAd->MCUCtrl.fwdl_ctrl.fwdl_op; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - - ret = NDIS_STATUS_SUCCESS; - - if (pChipCap->need_load_patch) { - if (pChipCap->load_patch_flow == PATCH_FLOW_V1) - op->load_patch = load_patch_v1; - else - ret = NDIS_STATUS_FAILURE; - - if (pChipCap->patch_format == PATCH_FORMAT_V1) - op->parse_patch = parse_patch_v1; - else - ret = NDIS_STATUS_FAILURE; - } - - if (pChipCap->need_load_fw) { - if (pChipCap->load_fw_flow == FW_FLOW_V1) - op->load_fw = load_fw_v1; - else if (pChipCap->load_fw_flow == FW_FLOW_V2_COMPRESS_IMG) - op->load_fw = - load_fw_v2_compressimg; /* compress img must use v3 format*/ - else - ret = NDIS_STATUS_FAILURE; - - if (pChipCap->fw_format == FW_FORMAT_V1) - op->parse_fw = parse_fw_v1; - else if (pChipCap->fw_format == FW_FORMAT_V2) - op->parse_fw = parse_fw_v2; - else if (pChipCap->fw_format == FW_FORMAT_V3) - op->parse_fw = parse_fw_v3; - else - ret = NDIS_STATUS_FAILURE; - } - - op->ctrl_fw_state = ctrl_fw_state_v2; -#ifdef CONFIG_RECOVERY_ON_INTERRUPT_MISS -#ifdef INTELP6_SUPPORT - if (ret == NDIS_STATUS_FAILURE) { - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - pAd->ErrRecoveryCheck++; - if (ops->heart_beat_check) - ops->heart_beat_check(pAd); - } -#endif -#endif - if (ret) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: FWDL hook fail\n", __func__)); - - return ret; -} - -NDIS_STATUS mt_load_patch(struct _RTMP_ADAPTER *pAd) -{ - RTMP_CHIP_CAP *chip_cap = hc_get_chip_cap(pAd->hdev_ctrl); - RTMP_CHIP_OP *chip_op = hc_get_chip_ops(pAd->hdev_ctrl); - struct fwdl_op *fwdl_op = &pAd->MCUCtrl.fwdl_ctrl.fwdl_op; - struct patch_dl_target target; - NDIS_STATUS ret; - UINT32 i, need_load; - - ret = NDIS_STATUS_SUCCESS; - - if (chip_op->fwdl_datapath_setup) - chip_op->fwdl_datapath_setup(pAd, TRUE); - - if (fwdl_op->ctrl_fw_state) { - ret = fwdl_op->ctrl_fw_state(pAd, FWDL_STAGE_CMD_EVENT); - if (ret) - goto done; - } - - need_load = chip_cap->need_load_patch; - if (need_load && (!fwdl_op->parse_patch || !fwdl_op->load_patch)) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: no hook function available\n", __func__)); - ret = NDIS_STATUS_FAILURE; - goto done; - } - - for (i = 0; i < MAX_CPU; i++) { - if (need_load & BIT(i)) { - ret = fwdl_op->parse_patch(pAd, i, &target); - if (ret) - goto done; - ret = fwdl_op->load_patch(pAd, i, &target); - if (ret) - goto done; - } - } - -done: - - if (chip_op->fwdl_datapath_setup) - chip_op->fwdl_datapath_setup(pAd, FALSE); - - free_patch_buf(pAd); - - if (ret) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: patch download fail\n", __func__)); - - return ret; -} - -NDIS_STATUS mt_load_fw(struct _RTMP_ADAPTER *pAd) -{ - RTMP_CHIP_CAP *chip_cap = hc_get_chip_cap(pAd->hdev_ctrl); - RTMP_CHIP_OP *chip_op = hc_get_chip_ops(pAd->hdev_ctrl); - struct fwdl_op *fwdl_op = &pAd->MCUCtrl.fwdl_ctrl.fwdl_op; - struct fw_dl_target target; - NDIS_STATUS ret; - UINT32 i, need_load; - - ret = NDIS_STATUS_SUCCESS; - - if (chip_op->fwdl_datapath_setup) - chip_op->fwdl_datapath_setup(pAd, TRUE); - - if (fwdl_op->ctrl_fw_state) { - ret = fwdl_op->ctrl_fw_state(pAd, FWDL_STAGE_CMD_EVENT); - if (ret) - goto done; - } - - need_load = chip_cap->need_load_fw; - if (need_load && (!fwdl_op->parse_fw || !fwdl_op->load_fw)) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: no hook function available\n", __func__)); - ret = NDIS_STATUS_FAILURE; - goto done; - } - - for (i = 0; i < MAX_CPU; i++) { - if (need_load & BIT(i)) { - ret = fwdl_op->parse_fw(pAd, i, &target); - if (ret) - goto done; - ret = fwdl_op->load_fw(pAd, i, &target); - if (ret) - goto done; - } - } - - if (fwdl_op->ctrl_fw_state) { - ret = fwdl_op->ctrl_fw_state(pAd, FWDL_STAGE_FW_RUNNING); - } - -done: - - if (chip_op->fwdl_datapath_setup) - chip_op->fwdl_datapath_setup(pAd, FALSE); - - free_fw_buf(pAd); - - if (ret) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fw download fail\n", __func__)); - pAd->MCUCtrl.fwdl_ctrl.stage = FWDL_STAGE_FW_NOT_DL; - } else { - pAd->MCUCtrl.fwdl_ctrl.stage = FWDL_STAGE_FW_RUNNING; - } - - return ret; -} - -NDIS_STATUS mt_restart_fw(struct _RTMP_ADAPTER *pAd) -{ - NDIS_STATUS ret; - struct fwdl_op *fwdl_op = &pAd->MCUCtrl.fwdl_ctrl.fwdl_op; - - ret = NDIS_STATUS_SUCCESS; - - if (fwdl_op->ctrl_fw_state) - ret = fwdl_op->ctrl_fw_state(pAd, FWDL_STAGE_FW_NOT_DL); - - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/mt_cmd.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/mt_cmd.c deleted file mode 100644 index 5abde139db..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/mt_cmd.c +++ /dev/null @@ -1,12996 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_cmd.c -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "mt_cmd.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) || \ - defined(PRE_CAL_MT7622_SUPPORT) -#include "phy/rlm_cal_cache.h" -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -/* #include "hdev/hdev.h" */ - -/* */ -/* Define for chip_cmd_tx retry count */ -/* */ -#define MT_CMD_RETRY_COUNT 5 -#define MT_CMD_RETRY_INTEVAL 200 /* usec */ - -#ifdef WIFI_EAP_FEATURE -static VOID eapEventDispatcher(struct cmd_msg *msg, char *rsp_payload, - UINT16 rsp_payload_len); -#endif - -UINT16 GetRealPortQueueID(struct cmd_msg *msg, UINT8 cmd_type) -{ - RTMP_ADAPTER *ad = (RTMP_ADAPTER *)(msg->priv); - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - - if (IS_HIF_TYPE(ad, HIF_MT)) { - if (cmd_type == MT_FW_SCATTER) - return (UINT16)cap->PDA_PORT; - else - return (UINT16)P1_Q0; - } - - return (UINT16)CPU_TX_PORT; -} - -VOID MtAndesFreeCmdMsg(struct cmd_msg *msg) -{ -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) -#ifdef COMPOS_WIN - os_free_mem(msg); -#endif /* COMPOS_WIN */ -#ifdef COMPOS_TESTMODE_WIN - TestModeFreeCmdMsg(msg); -#endif /* COMPOS_TESTMODE_WIN */ -#else - AndesFreeCmdMsg(msg); -#endif -} - -struct cmd_msg *MtAndesAllocCmdMsg(RTMP_ADAPTER *ad, unsigned int length) -{ -#ifdef COMPOS_WIN - RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - struct cmd_msg *msg = NULL; - VOID *net_pkt = NULL; - UINT16 AllocateSize = cap->cmd_header_len + length; - - if (AllocateSize < HW_MSG_CMD_BUFFER_LEN) { - msg = (struct cmd_msg *)MtGetMsgCmdBuffer(ad); - - if (msg == NULL) - return NULL; - - net_pkt = msg->net_pkt; - } else { - os_alloc_mem(ad, (CHAR **)&net_pkt, AllocateSize); - - if (!net_pkt) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("can not allocate net_pkt\n")); - return NULL; - } - - os_alloc_mem(ad, (CHAR **)&msg, sizeof(*msg)); - - if (!msg) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("can not allocate cmd msg\n")); - os_free_mem(net_pkt); - return NULL; - } - } - - os_zero_mem(msg, sizeof(*msg)); - msg->net_pkt = net_pkt; - msg->priv = (void *)ad; - msg->cmd_tx_len = AllocateSize; - return msg; -#elif defined(COMPOS_TESTMODE_WIN) - return TMAllocCmdMsg(ad, length); /* Test Mode WDM */ -#else - return AndesAllocCmdMsg(ad, length); -#endif -} - -VOID MtAndesInitCmdMsg(struct cmd_msg *msg, CMD_ATTRIBUTE attr) -{ -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) - FW_TXD *fw_txd = msg->net_pkt; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; - /* Msg data */ - SET_CMD_MSG_PORT_QUEUE_ID(msg, GetRealPortQueueID(msg, attr.type)); - SET_CMD_MSG_MCU_DEST(msg, attr.mcu_dest); - SET_CMD_MSG_TYPE(msg, attr.type); - SET_CMD_MSG_CTRL_FLAGS(msg, attr.ctrl.flags); - SET_CMD_MSG_EXT_TYPE(msg, attr.ext_type); - SET_CMD_MSG_CTRL_RSP_WAIT_MS_TIME(msg, attr.ctrl.wait_ms_time); - SET_CMD_MSG_RETRY_TIMES(msg, 0); - SET_CMD_MSG_CTRL_RSP_EXPECT_SIZE(msg, attr.ctrl.expect_size); - SET_CMD_MSG_RSP_WB_BUF_IN_CALBK(msg, attr.rsp.wb_buf_in_calbk); - SET_CMD_MSG_RSP_HANDLER(msg, attr.rsp.handler); - /* Fill FW CMD Header */ - fw_txd->fw_txd_0.field.length = msg->cmd_tx_len; - fw_txd->fw_txd_0.field.pq_id = GetRealPortQueueID(msg, attr.type); - fw_txd->fw_txd_1.field.cid = attr.type; - fw_txd->fw_txd_1.field.pkt_type_id = PKT_ID_CMD; - fw_txd->fw_txd_1.field.set_query = - IS_CMD_ATTR_NA_FLAG_SET(attr) ? - CMD_NA : - (IS_CMD_ATTR_SET_QUERY_FLAG_SET(attr)); -#ifdef MT7615 - - if (IS_MT7615(pAd)) - fw_txd->fw_txd_1.field1.pkt_ft = TMI_PKT_FT_HIF_CMD; - -#endif /* MT7615 */ - fw_txd->fw_txd_2.field.ext_cid = attr.ext_type; - - if ((IS_EXT_CMD_AND_SET_NEED_RSP(msg)) && - !(IS_CMD_MSG_NA_FLAG_SET(msg))) - fw_txd->fw_txd_2.field.ext_cid_option = EXT_CID_OPTION_NEED_ACK; - else - fw_txd->fw_txd_2.field.ext_cid_option = - EXT_CID_OPTION_NO_NEED_ACK; - - fw_txd->fw_txd_0.word = cpu2le32(fw_txd->fw_txd_0.word); - fw_txd->fw_txd_1.word = cpu2le32(fw_txd->fw_txd_1.word); - fw_txd->fw_txd_2.word = cpu2le32(fw_txd->fw_txd_2.word); -#else - AndesInitCmdMsg(msg, attr); -#endif -} - -VOID MtAndesAppendCmdMsg(struct cmd_msg *msg, CHAR *data, UINT32 len) -{ -#if defined(COMPOS_WIN) || defined(COMPOS_TESTMODE_WIN) - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - CHAR *payload = - (CHAR *)msg->net_pkt + cap->cmd_header_len + msg->current_pos; - msg->current_pos += len; - os_move_mem(payload, data, len); -#else - AndesAppendCmdMsg(msg, data, len); -#endif -} - -static VOID EventExtCmdResult(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); -#ifdef LINUX - /* RTMP_OS_TXRXHOOK_CALL(WLAN_CALIB_TEST_RSP,NULL,EventExtCmdResult->u4Status,pAd); */ -#endif /* LINUX */ -} - -/***************************************** - * ExT_CID = 0x01 - *****************************************/ -#ifdef RTMP_EFUSE_SUPPORT -static VOID CmdEfuseAccessReadCb(struct cmd_msg *msg, char *data, UINT16 len) -{ - CMD_ACCESS_EFUSE_T *pCmdAccessEfuse = (CMD_ACCESS_EFUSE_T *)data; - EFUSE_ACCESS_DATA_T *pEfuseValue = NULL; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Address:%x,IsValied:%x\n", - le2cpu32(pCmdAccessEfuse->u4Address), - le2cpu32(pCmdAccessEfuse->u4Valid))); - pEfuseValue = (EFUSE_ACCESS_DATA_T *)msg->attr.rsp.wb_buf_in_calbk; - *pEfuseValue->pIsValid = le2cpu32(pCmdAccessEfuse->u4Valid); - os_move_mem(&pEfuseValue->pValue[0], &pCmdAccessEfuse->aucData[0], - EFUSE_BLOCK_SIZE); -} - -INT32 MtCmdEfuseAccessRead(RTMP_ADAPTER *pAd, USHORT offset, PUCHAR pData, - PUINT pIsValid) -{ - struct cmd_msg *msg; - CMD_ACCESS_EFUSE_T CmdAccessEfuse; - EFUSE_ACCESS_DATA_T efuseAccessData; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_ACCESS_EFUSE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&efuseAccessData, sizeof(efuseAccessData)); - efuseAccessData.pValue = (PUSHORT)pData; - efuseAccessData.pIsValid = pIsValid; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EFUSE_ACCESS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(CMD_ACCESS_EFUSE_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &efuseAccessData); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdEfuseAccessReadCb); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdAccessEfuse, sizeof(CmdAccessEfuse)); - CmdAccessEfuse.u4Address = - (offset / EFUSE_BLOCK_SIZE) * EFUSE_BLOCK_SIZE; -#ifdef RT_BIG_ENDIAN - CmdAccessEfuse.u4Address = cpu2le32(CmdAccessEfuse.u4Address); -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdAccessEfuse, - sizeof(CmdAccessEfuse)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID CmdEfuseAccessWriteCb(struct cmd_msg *msg, char *data, UINT16 len) -{ - CMD_ACCESS_EFUSE_T *pCmdAccessEfuse = (CMD_ACCESS_EFUSE_T *)data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Address:%x,IsValied:%x\n", - le2cpu32(pCmdAccessEfuse->u4Address), - le2cpu32(pCmdAccessEfuse->u4Valid))); -} - -VOID MtCmdEfuseAccessWrite(RTMP_ADAPTER *pAd, USHORT offset, PUCHAR pData) -{ - struct cmd_msg *msg; - CMD_ACCESS_EFUSE_T CmdAccessEfuse; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_ACCESS_EFUSE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EFUSE_ACCESS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(CMD_ACCESS_EFUSE_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdEfuseAccessWriteCb); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdAccessEfuse, sizeof(CmdAccessEfuse)); - os_move_mem(&CmdAccessEfuse.aucData[0], &pData[0], EFUSE_BLOCK_SIZE); - CmdAccessEfuse.u4Address = - (offset / EFUSE_BLOCK_SIZE) * EFUSE_BLOCK_SIZE; -#ifdef RT_BIG_ENDIAN - CmdAccessEfuse.u4Address = cpu2le32(CmdAccessEfuse.u4Address); -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdAccessEfuse, - sizeof(CmdAccessEfuse)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); -} - -INT32 MtCmdEfuseFreeBlockCount(RTMP_ADAPTER *pAd, UINT32 GetFreeBlock, - UINT32 *Value) -{ - struct cmd_msg *msg; - struct _EXT_CMD_EFUSE_FREE_BLOCK_T CmdEfuseFreeBlock; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: GetFreeBlock = %x\n", __func__, GetFreeBlock)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(struct _EXT_CMD_EFUSE_FREE_BLOCK_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EFUSE_FREE_BLOCK); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, - sizeof(EXT_EVENT_EFUSE_FREE_BLOCK_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, Value); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdEfuseFreeBlock, sizeof(CmdEfuseFreeBlock)); - CmdEfuseFreeBlock.ucGetFreeBlock = (UINT8)GetFreeBlock; - MtAndesAppendCmdMsg(msg, (char *)&CmdEfuseFreeBlock, - sizeof(CmdEfuseFreeBlock)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdEfuseAccessCheck(RTMP_ADAPTER *pAd, UINT32 offset, PUCHAR pData) -{ - struct cmd_msg *msg; - struct _EXT_CMD_ACCESS_EFUSE_CHECK_T CmdEfuseAccessCheck; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: offset = %x\n", __func__, offset)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(struct _EXT_CMD_ACCESS_EFUSE_CHECK_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EFUSE_ACCESS_CHECK); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, - sizeof(EXT_CMD_ACCESS_EFUSE_CHECK_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdEfuseAccessCheck, sizeof(CmdEfuseAccessCheck)); - CmdEfuseAccessCheck.u4Address = - (offset / EFUSE_BLOCK_SIZE) * EFUSE_BLOCK_SIZE; - os_move_mem(&CmdEfuseAccessCheck.aucData[0], &pData[0], - EFUSE_BLOCK_SIZE); -#ifdef RT_BIG_ENDIAN - CmdEfuseAccessCheck.u4Address = cpu2le32(CmdEfuseAccessCheck.u4Address); -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdEfuseAccessCheck, - sizeof(CmdEfuseAccessCheck)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#endif /* RTMP_EFUSE_SUPPORT */ - -/***************************************** - * ExT_CID = 0x02 - *****************************************/ -static VOID CmdRFRegAccessReadCb(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _CMD_RF_REG_ACCESS_T *RFRegAccess = - (struct _CMD_RF_REG_ACCESS_T *)Data; - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, &RFRegAccess->Data, Len - 8); - *msg->attr.rsp.wb_buf_in_calbk = - le2cpu32(*msg->attr.rsp.wb_buf_in_calbk); -} - -INT32 MtCmdRFRegAccessWrite(RTMP_ADAPTER *pAd, UINT32 RFIdx, UINT32 Offset, - UINT32 Value) -{ - struct cmd_msg *msg; - struct _CMD_RF_REG_ACCESS_T RFRegAccess; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: RFIdx = %d, Offset = %x, Value = %x\n", __func__, RFIdx, - Offset, Value)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(struct _CMD_RF_REG_ACCESS_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_RF_REG_ACCESS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&RFRegAccess, sizeof(RFRegAccess)); - RFRegAccess.WiFiStream = cpu2le32(RFIdx); - RFRegAccess.Address = cpu2le32(Offset); - RFRegAccess.Data = cpu2le32(Value); - MtAndesAppendCmdMsg(msg, (char *)&RFRegAccess, sizeof(RFRegAccess)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdRFRegAccessRead(RTMP_ADAPTER *pAd, UINT32 RFIdx, UINT32 Offset, - UINT32 *Value) -{ - struct cmd_msg *msg; - struct _CMD_RF_REG_ACCESS_T RFRegAccess; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: RFIdx = %d, Offset = %x\n", __func__, RFIdx, Offset)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(struct _CMD_RF_REG_ACCESS_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_RF_REG_ACCESS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 12); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, Value); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdRFRegAccessReadCb); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&RFRegAccess, sizeof(RFRegAccess)); - RFRegAccess.WiFiStream = cpu2le32(RFIdx); - RFRegAccess.Address = cpu2le32(Offset); - MtAndesAppendCmdMsg(msg, (char *)&RFRegAccess, sizeof(RFRegAccess)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x04 - *****************************************/ -/* unify */ -/* send command */ -static VOID MtCmdATERFTestResp(struct cmd_msg *msg, char *data, UINT16 len) -{ -#ifdef CONFIG_ATE - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; -#endif - EXT_EVENT_RF_TEST_RESULT_T *result = (EXT_EVENT_RF_TEST_RESULT_T *)data; - - switch (le2cpu32(result->u4FuncIndex)) { - case RDD_TEST_MODE: - case RE_CALIBRATION: - case CALIBRATION_BYPASS: - break; -#ifdef INTERNAL_CAPTURE_SUPPORT - case GET_ICAP_CAPTURE_STATUS: - MtCmdRfTestICapStatusCb(msg, data, len); - break; -#endif /* INTERNAL_CAPTURE_SUPPORT */ - - default: - break; - } - -#ifdef CONFIG_ATE - MT_ATERFTestCB(pAd, data, len); -#endif -} - -static INT32 MtCmdRfTest(RTMP_ADAPTER *pAd, CMD_TEST_CTRL_T TestCtrl, - char *rsp_payload, UINT16 rsp_len) -{ - struct cmd_msg *msg; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Action = %d\n", __func__, TestCtrl.ucAction)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(TestCtrl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_RF_TEST); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 30000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, rsp_len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, rsp_payload); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdATERFTestResp); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&TestCtrl, sizeof(TestCtrl)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/* IcapLen only be used when OpMode is OPERATION_ICAP_OVERLAP */ -INT32 MtCmdRfTestSwitchMode(RTMP_ADAPTER *pAd, UINT32 OpMode, UINT8 IcapLen, - UINT16 rsp_len) -{ - INT32 ret = 0; - CMD_TEST_CTRL_T TestCtrl; - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = ACTION_SWITCH_TO_RFTEST; - TestCtrl.u.u4OpMode = cpu2le32(OpMode); - - if (OpMode == OPERATION_ICAP_OVERLAP) - TestCtrl.ucIcapLen = IcapLen; - - ret = MtCmdRfTest(pAd, TestCtrl, NULL, rsp_len); - return ret; -} - -#ifdef WIFI_SPECTRUM_SUPPORT -/* - ========================================================================== - Description: - Solicited event handler of wifi-spectrum. - Return: - ========================================================================== -*/ -static VOID MtCmdWifiSpectrumResp(IN struct cmd_msg *msg, IN char *pData, - IN UINT16 Len) -{ - EXT_EVENT_SPECTRUM_RESULT_T *pResult = - (EXT_EVENT_SPECTRUM_RESULT_T *)pData; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: FuncIndex = %d\n", __func__, pResult->u4FuncIndex)); - - switch (le2cpu32(pResult->u4FuncIndex)) { - case SPECTRUM_CTRL_FUNCID_GET_CAPTURE_STATUS: - MtCmdWifiSpectrumStatusCb(msg, pData, Len); - break; - - default: - break; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return; -} - -/* - ========================================================================== - Description: - FW in-band CMD of wifi-spectrum. - Return: - ========================================================================== -*/ -static INT32 MtCmdWifiSpectrum(IN PRTMP_ADAPTER pAd, - IN EXT_CMD_SPECTRUM_CTRL_T SpectrumCtrl, - IN UINT8 ctrl_flag, IN UINT16 rsp_wait_time, - IN MSG_RSP_HANDLER rsp_handler, - IN INT8 *rsp_payload, IN UINT16 rsp_len) -{ - struct cmd_msg *msg; - UINT32 FuncIndex = SpectrumCtrl.u4FuncIndex; - INT32 Status = NDIS_STATUS_FAILURE; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: FuncIndex = %d\n", __func__, FuncIndex)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(SpectrumCtrl)); - - if (!msg) { - Status = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_CTRL_FLAGS(attr, ctrl_flag); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, rsp_wait_time); - SET_CMD_ATTR_RSP_HANDLER(attr, rsp_handler); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_WIFI_SPECTRUM); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, rsp_len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, rsp_payload); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&SpectrumCtrl, sizeof(SpectrumCtrl)); - Status = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} - -/* - ========================================================================== - Description: - Start for wifi-spectrum data capture. - Return: - ========================================================================== -*/ -INT32 MtCmdWifiSpectrumStart(IN RTMP_ADAPTER *pAd, IN UINT8 *pData) -{ - INT32 Status = NDIS_STATUS_FAILURE; - EXT_CMD_SPECTRUM_CTRL_T SpectrumCtrl; - RBIST_CAP_START_T *pSpectrumInfo = NULL; - RBIST_CAP_START_T *prRBISTInfo = (RBIST_CAP_START_T *)pData; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update data structure of SpectrumCtrl */ - os_zero_mem(&SpectrumCtrl, sizeof(SpectrumCtrl)); - SpectrumCtrl.u4FuncIndex = cpu2le32(SPECTRUM_CTRL_FUNCID_SET_PARAMETER); - pSpectrumInfo = &SpectrumCtrl.rSpectrumInfo; - pSpectrumInfo->fgTrigger = cpu2le32(prRBISTInfo->fgTrigger); - pSpectrumInfo->fgRingCapEn = cpu2le32(prRBISTInfo->fgRingCapEn); - pSpectrumInfo->u4TriggerEvent = cpu2le32(prRBISTInfo->u4TriggerEvent); - pSpectrumInfo->u4CaptureNode = cpu2le32(prRBISTInfo->u4CaptureNode); - pSpectrumInfo->u4CaptureLen = cpu2le32(prRBISTInfo->u4CaptureLen); - pSpectrumInfo->u4CapStopCycle = cpu2le32(prRBISTInfo->u4CapStopCycle); - pSpectrumInfo->u4BW = cpu2le32(prRBISTInfo->u4BW); - pSpectrumInfo->u4MACTriggerEvent = - cpu2le32(prRBISTInfo->u4MACTriggerEvent); - pSpectrumInfo->u4SourceAddressLSB = - cpu2le32(prRBISTInfo->u4SourceAddressLSB); - pSpectrumInfo->u4SourceAddressMSB = - cpu2le32(prRBISTInfo->u4SourceAddressMSB); - pSpectrumInfo->u4BandIdx = cpu2le32(prRBISTInfo->u4BandIdx); - pSpectrumInfo->u4En96b128b = cpu2le32(CAP_96BIT); - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s :\n" - " pSpectrumInfo->fgTrigger = 0x%08x\n pSpectrumInfo->fgRingCapEn = 0x%08x\n" - " pSpectrumInfo->u4TriggerEvent = 0x%08x\n pSpectrumInfo->u4CaptureNode = 0x%08x\n" - " pSpectrumInfo->u4CaptureLen = 0x%08x\n pSpectrumInfo->u4CapStopCycle = 0x%08x\n" - " pSpectrumInfo->ucBW = 0x%08x\n pSpectrumInfo->u4MACTriggerEvent = 0x%08x\n" - " pSpectrumInfo->u4SourceAddressLSB = 0x%08x\n pSpectrumInfo->u4SourceAddressMSB = 0x%08x\n" - " pSpectrumInfo->u4BandIdx = 0x%08x\n", - __func__, pSpectrumInfo->fgTrigger, pSpectrumInfo->fgRingCapEn, - pSpectrumInfo->u4TriggerEvent, pSpectrumInfo->u4CaptureNode, - pSpectrumInfo->u4CaptureLen, pSpectrumInfo->u4CapStopCycle, - pSpectrumInfo->u4BW, pSpectrumInfo->u4MACTriggerEvent, - pSpectrumInfo->u4SourceAddressLSB, - pSpectrumInfo->u4SourceAddressMSB, pSpectrumInfo->u4BandIdx)); - - Status = MtCmdWifiSpectrum(pAd, SpectrumCtrl, INIT_CMD_SET, - SPECTRUM_DEFAULT_WAIT_RESP_TIME, NULL, NULL, - SPECTRUM_DEFAULT_RESP_LEN); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} - -/* - ========================================================================== - Description: - Query status of wifi-spectrum data capture. - Return: - ========================================================================== -*/ -INT32 MtCmdWifiSpectrumGen1Status(IN RTMP_ADAPTER *pAd) -{ - INT32 Status = CAP_BUSY, retval; - PRTMP_REG_PAIR pRegCapture = NULL, pRegInterface = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - retval = os_alloc_mem(pAd, (UCHAR **)&pRegCapture, - sizeof(RTMP_REG_PAIR)); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - os_zero_mem(pRegCapture, sizeof(RTMP_REG_PAIR)); - - retval = os_alloc_mem(pAd, (UCHAR **)&pRegInterface, - sizeof(RTMP_REG_PAIR)); - if (retval != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Not enough memory for dynamic allocating !!\n", - __func__)); - goto error; - } - os_zero_mem(pRegInterface, sizeof(RTMP_REG_PAIR)); - - /* Get RBIST capture-stop bit */ - pRegCapture->Register = RBISTCR0; - MtCmdMultipleMacRegAccessRead(pAd, pRegCapture, 1); - - if ((pRegCapture->Value & BIT(CR_RBIST_CAPTURE)) == - 0) { /* Stop capture */ - /* Change backdoor interface to AHB interface => RBISTCR10[28:26] = 3b'000 */ - pRegInterface->Register = RBISTCR10; - pRegInterface->Value = - ((pRegInterface->Value) & - ~BITS(SYSRAM_INTF_SEL1, SYSRAM_INTF_SEL3)); - MtCmdMultipleMacRegAccessWrite(pAd, pRegInterface, 1); - /* Update status*/ - Status = CAP_SUCCESS; - } - -error: - if (pRegCapture != NULL) - os_free_mem(pRegCapture); - - if (pRegInterface != NULL) - os_free_mem(pRegInterface); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} - -INT32 MtCmdWifiSpectrumGen2Status(IN RTMP_ADAPTER *pAd) -{ - INT32 Status = CAP_BUSY; - UINT32 CapDone; - EXT_CMD_SPECTRUM_CTRL_T SpectrumCtrl; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update data structure of TestCtrl */ - os_zero_mem(&SpectrumCtrl, sizeof(SpectrumCtrl)); - SpectrumCtrl.u4FuncIndex = - cpu2le32(SPECTRUM_CTRL_FUNCID_GET_CAPTURE_STATUS); - - /* Query current captured status by solicited event */ - MtCmdWifiSpectrum(pAd, SpectrumCtrl, INIT_CMD_SET_AND_WAIT_RETRY_RSP, - SPECTRUM_WAIT_RESP_TIME, &MtCmdWifiSpectrumResp, - (INT8 *)&CapDone, - sizeof(EXT_EVENT_RBIST_CAP_STATUS_T)); - - if (CapDone) - Status = CAP_SUCCESS; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} - -/* - ========================================================================== - Description: - Callback function of querying status of wifi-spectrum data capture. - Return: - ========================================================================== -*/ -VOID MtCmdWifiSpectrumStatusCb(IN struct cmd_msg *msg, IN INT8 *pData, - IN UINT16 Length) -{ - EXT_EVENT_RBIST_CAP_STATUS_T *pEventdata = - (EXT_EVENT_RBIST_CAP_STATUS_T *)pData; - UINT32 *pCapDone = (UINT32 *)msg->attr.rsp.wb_buf_in_calbk; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update pCapDone */ - *pCapDone = le2cpu32(pEventdata->u4CapDone); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[42m%s\x1b[m\n", - (*pCapDone == TRUE) ? "Capture done!!" : "Not yet!!")); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return; -} - -/* - ========================================================================== - Description: - Raw data process of wifi-spectrum. - Return: - ========================================================================== -*/ -INT32 MtCmdWifiSpectrumRawDataProc(IN RTMP_ADAPTER *pAd) -{ - INT32 i, Status, retval; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - EXT_CMD_SPECTRUM_CTRL_T SpectrumCtrl; - RBIST_DUMP_RAW_DATA_T *pSpectrumDump = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update data structure of SpectrumCtrl */ - os_zero_mem(&SpectrumCtrl, sizeof(SpectrumCtrl)); - SpectrumCtrl.u4FuncIndex = cpu2le32(SPECTRUM_CTRL_FUNCID_DUMP_RAW_DATA); - /* Initialization of OS wait for completion */ - RTMP_OS_INIT_COMPLETION(&pAd->SpectrumDumpDataDone); - /* Initialization of status */ - Status = pAd->SpectrumStatus = CAP_FAIL; - /* Initialization of SpectrumEventCnt */ - pAd->SpectrumEventCnt = 0; - - /* Create pSrcf_IQ file descriptor */ - pAd->pSrcf_IQ = RtmpOSFileOpen(pAd->pSrc_IQ, O_WRONLY | O_CREAT, 0); - if (IS_FILE_OPEN_ERR(pAd->pSrcf_IQ)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--> Error opening %s\n", pAd->pSrc_IQ)); - goto error; - } - - /* Create pSrcf_Gain file descriptor */ - pAd->pSrcf_Gain = RtmpOSFileOpen(pAd->pSrc_Gain, O_WRONLY | O_CREAT, 0); - if (IS_FILE_OPEN_ERR(pAd->pSrcf_Gain)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--> Error opening %s\n", pAd->pSrc_Gain)); - goto error; - } - - if (IS_MT7615(pAd)) { - /* Query whole RBIST data at a time */ - { - MtCmdWifiSpectrum(pAd, SpectrumCtrl, INIT_CMD_SET, - SPECTRUM_DEFAULT_WAIT_RESP_TIME, NULL, - NULL, SPECTRUM_DEFAULT_RESP_LEN); - - /* OS wait for completion time out */ - if (!RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT( - &pAd->SpectrumDumpDataDone, - RTMPMsecsToJiffies(CAP_DUMP_DATA_EXPIRE))) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("\x1b[41m Spectrum dump data timeout !!\x1b[m\n")); - goto error; - } - } - } else { - /* Query whole RBIST data by bank */ - for (i = 0; i < pChipCap->SpectrumBankNum; i++) { - RBIST_DESC_T *pSpectrumDesc = - &pChipCap->pSpectrumDesc[i]; - - /* Update data structure of SpectrumCtrl */ - pSpectrumDump = &SpectrumCtrl.rSpectrumDump; - pSpectrumDump->u4Address = - cpu2le32(pSpectrumDesc->u4Address); - pSpectrumDump->u4AddrOffset = - cpu2le32(pSpectrumDesc->u4AddrOffset); - pSpectrumDump->u4Bank = cpu2le32(pSpectrumDesc->u4Bank); - pSpectrumDump->u4BankSize = - cpu2le32(pSpectrumDesc->u4BankSize); - /* Update SpectrumIdx */ - pAd->SpectrumIdx = i; - - MtCmdWifiSpectrum(pAd, SpectrumCtrl, INIT_CMD_SET, - SPECTRUM_DEFAULT_WAIT_RESP_TIME, NULL, - NULL, SPECTRUM_DEFAULT_RESP_LEN); - - /* OS wait for completion time out */ - if (!RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT( - &pAd->SpectrumDumpDataDone, - RTMPMsecsToJiffies(CAP_DUMP_DATA_EXPIRE))) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("\x1b[41m Spectrum dump data timeout !!\x1b[m\n")); - goto error; - } - } - } - -error: - /* Close pSrcf_IQ file descriptor */ - if (!IS_FILE_OPEN_ERR(pAd->pSrcf_IQ)) { - retval = RtmpOSFileClose(pAd->pSrcf_IQ); - if (retval) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--> Error %d closing %s\n", -retval, - pAd->pSrc_IQ)); - } - pAd->pSrcf_IQ = NULL; - } - - /* Close pSrcf_Gain file descriptor */ - if (!IS_FILE_OPEN_ERR(pAd->pSrcf_Gain)) { - retval = RtmpOSFileClose(pAd->pSrcf_Gain); - if (retval) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--> Error %d closing %s\n", -retval, - pAd->pSrc_Gain)); - } - pAd->pSrcf_Gain = NULL; - } - - /* Update status */ - Status = pAd->SpectrumStatus; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} -#endif /* WIFI_SPECTRUM_SUPPORT */ - -#ifdef INTERNAL_CAPTURE_SUPPORT -/* - ========================================================================== - Description: - Start for ICAP data capture. - Return: - ========================================================================== -*/ -INT32 MtCmdRfTestICapStart(IN RTMP_ADAPTER *pAd, IN UINT8 *pData) -{ - INT32 Status = NDIS_STATUS_FAILURE; - CMD_TEST_CTRL_T TestCtrl; - RBIST_CAP_START_T *prICapInfo = NULL; - RBIST_CAP_START_T *prRBISTInfo = (RBIST_CAP_START_T *)pData; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update ICapCapLen of pAd */ - pAd->ICapCapLen = prRBISTInfo->u4CaptureLen; - /* Update data structure of TestCtrl */ - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = cpu2le32(ACTION_IN_RFTEST); - TestCtrl.u.rRfATInfo.u4FuncIndex = cpu2le32(SET_ICAP_CAPTURE_START); - prICapInfo = &TestCtrl.u.rRfATInfo.Data.rICapInfo; - prICapInfo->fgTrigger = cpu2le32(prRBISTInfo->fgTrigger); - prICapInfo->u4TriggerEvent = cpu2le32(prRBISTInfo->u4TriggerEvent); - prICapInfo->u4CaptureNode = cpu2le32(prRBISTInfo->u4CaptureNode); - prICapInfo->u4CaptureLen = cpu2le32(prRBISTInfo->u4CaptureLen); - prICapInfo->u4CapStopCycle = cpu2le32(prRBISTInfo->u4CapStopCycle); - prICapInfo->u4BW = cpu2le32(prRBISTInfo->u4BW); - prICapInfo->u4MACTriggerEvent = - cpu2le32(prRBISTInfo->u4MACTriggerEvent); - prICapInfo->u4SourceAddressLSB = - cpu2le32(prRBISTInfo->u4SourceAddressLSB); - prICapInfo->u4SourceAddressMSB = - cpu2le32(prRBISTInfo->u4SourceAddressMSB); - prICapInfo->u4BandIdx = cpu2le32(prRBISTInfo->u4BandIdx); - prICapInfo->u4En96b128b = cpu2le32(CAP_96BIT); - - if (prICapInfo->u4TriggerEvent == CAP_FREE_RUN) - prICapInfo->fgRingCapEn = cpu2le32(CAP_RING_MODE_DISABLE); - else - prICapInfo->fgRingCapEn = cpu2le32(CAP_RING_MODE_ENABLE); - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s :\n" - " prICapInfo->fgTrigger = 0x%08x\n prICapInfo->fgRingCapEn = 0x%08x\n" - " prICapInfo->u4TriggerEvent = 0x%08x\n prICapInfo->u4CaptureNode = 0x%08x\n" - " prICapInfo->u4CaptureLen = 0x%08x\n prICapInfo->u4CapStopCycle = 0x%08x\n" - " prICapInfo->ucBW = 0x%08x\n prICapInfo->u4MACTriggerEvent = 0x%08x\n" - " prICapInfo->u4SourceAddressLSB = 0x%08x\n prICapInfo->u4SourceAddressMSB = 0x%08x\n" - " prICapInfo->u4BandIdx = 0x%08x\n", - __func__, prICapInfo->fgTrigger, prICapInfo->fgRingCapEn, - prICapInfo->u4TriggerEvent, prICapInfo->u4CaptureNode, - prICapInfo->u4CaptureLen, prICapInfo->u4CapStopCycle, - prICapInfo->u4BW, prICapInfo->u4MACTriggerEvent, - prICapInfo->u4SourceAddressLSB, prICapInfo->u4SourceAddressMSB, - prICapInfo->u4BandIdx)); - - /* Set ICap parameter to HW */ - Status = MtCmdRfTest(pAd, TestCtrl, NULL, RF_TEST_DEFAULT_RESP_LEN); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} - -/* - ========================================================================== - Description: - Query status of ICAP data capture. - Return: - ========================================================================== -*/ -INT32 MtCmdRfTestGen1ICapStatus(IN RTMP_ADAPTER *pAd) -{ - INT32 Status = NDIS_STATUS_FAILURE; - CMD_TEST_CTRL_T TestCtrl; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update data structure of TestCtrl */ - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = cpu2le32(ACTION_IN_RFTEST); - TestCtrl.u.rRfATInfo.u4FuncIndex = cpu2le32(GET_ICAP_CAPTURE_STATUS); - - /* Query current captured status by unsolicited event */ - Status = MtCmdRfTest(pAd, TestCtrl, NULL, RF_TEST_DEFAULT_RESP_LEN); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} - -INT32 MtCmdRfTestGen2ICapStatus(IN RTMP_ADAPTER *pAd) -{ - INT32 Status = CAP_BUSY; - UINT32 CapDone; - CMD_TEST_CTRL_T TestCtrl; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update data structure of TestCtrl */ - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = cpu2le32(ACTION_IN_RFTEST); - TestCtrl.u.rRfATInfo.u4FuncIndex = cpu2le32(GET_ICAP_CAPTURE_STATUS); - - /* Query current captured status by solicited event */ - MtCmdRfTest(pAd, TestCtrl, (INT8 *)&CapDone, - sizeof(EXT_EVENT_RBIST_CAP_STATUS_T)); - - if (CapDone) { /* Stop capture */ - /* Dump captured data and store it to data buffer */ - if (ops->ICapCmdRawDataProc != NULL) - Status = ops->ICapCmdRawDataProc(pAd); - else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The function is not hooked !!\n", - __func__)); - } - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} - -/* - ========================================================================== - Description: - Callback function of querying status of ICAP data capture. - Return: - ========================================================================== -*/ -VOID MtCmdRfTestICapStatusCb(IN struct cmd_msg *msg, IN INT8 *pData, - IN UINT16 Length) -{ - EXT_EVENT_RBIST_CAP_STATUS_T *pEventdata = - (EXT_EVENT_RBIST_CAP_STATUS_T *)pData; - UINT32 *pCapDone = (UINT32 *)msg->attr.rsp.wb_buf_in_calbk; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update pCapDone */ - *pCapDone = le2cpu32(pEventdata->u4CapDone); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[42m%s\x1b[m\n", - (*pCapDone == TRUE) ? "Capture done!!" : "Not yet!!")); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); -} - -/* - ========================================================================== - Description: - Raw data process of ICAP. - Return: - ========================================================================== -*/ -INT32 MtCmdRfTestICapRawDataProc(IN RTMP_ADAPTER *pAd) -{ - INT32 i, Status; - CMD_TEST_CTRL_T TestCtrl; - RTMP_CHIP_CAP *pChipCap = hc_get_chip_cap(pAd->hdev_ctrl); - RBIST_DUMP_RAW_DATA_T *pICapDump = NULL; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - /* Update data structure of TestCtrl */ - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = cpu2le32(ACTION_IN_RFTEST); - TestCtrl.u.rRfATInfo.u4FuncIndex = cpu2le32(GET_ICAP_RAW_DATA); - /* Initialization of OS wait completion */ - RTMP_OS_INIT_COMPLETION(&pAd->ICapDumpDone); - /* Initialization of ICap status */ - Status = pAd->ICapStatus = CAP_BUSY; - /* Initialization of ICapEventCnt */ - pAd->ICapEventCnt = 0; - /* Initialization of L32/M32/H32 counter */ - pAd->ICapL32Cnt = pAd->ICapM32Cnt = pAd->ICapH32Cnt = 0; - - for (i = 0; i < pChipCap->ICapBankNum; i++) { - RBIST_DESC_T *pICapDesc = &pChipCap->pICapDesc[i]; - - /* Update data structure of TestCtrl */ - pICapDump = &TestCtrl.u.rRfATInfo.Data.rICapDump; - pICapDump->u4Address = cpu2le32(pICapDesc->u4Address); - pICapDump->u4AddrOffset = cpu2le32(pICapDesc->u4AddrOffset); - pICapDump->u4Bank = cpu2le32(pICapDesc->u4Bank); - pICapDump->u4BankSize = cpu2le32(pICapDesc->u4BankSize); - /* Update ICapIdx which is referenced by pICapDesc */ - pAd->ICapIdx = i; - - /* Dump ICap data from RBIST sysram by unsolicited event */ - MtCmdRfTest(pAd, TestCtrl, NULL, RF_TEST_DEFAULT_RESP_LEN); - - /* OS wait for completion time out */ - if (!RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT( - &pAd->ICapDumpDone, - RTMPMsecsToJiffies(CAP_DUMP_DATA_EXPIRE))) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[41m ICap dump data timeout !!\x1b[m\n")); - /* Update overall ICap status */ - pAd->ICapStatus = CAP_FAIL; - goto error; - } - } - -error: - /* Update status */ - Status = pAd->ICapStatus; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - - return Status; -} -#endif /* INTERNAL_CAPTURE_SUPPORT */ - -INT32 MtCmdRfTestSetADC(IN RTMP_ADAPTER *pAd, IN UINT32 ChannelFreq, - IN UINT8 AntIndex, IN UINT8 BW, IN UINT8 SX, - IN UINT8 DbdcIdx, IN UINT8 RunType, IN UINT8 FType) -{ - INT32 ret = 0; - CMD_TEST_CTRL_T TestCtrl; - SET_ADC_T *prSetADC; - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = ACTION_IN_RFTEST; - TestCtrl.u.rRfATInfo.u4FuncIndex = SET_ADC; -#ifdef RT_BIG_ENDIAN - TestCtrl.u.rRfATInfo.u4FuncIndex = - cpu2le32(TestCtrl.u.rRfATInfo.u4FuncIndex); -#endif - prSetADC = &TestCtrl.u.rRfATInfo.Data.rSetADC; - prSetADC->u4ChannelFreq = cpu2le32(ChannelFreq); - prSetADC->ucAntIndex = AntIndex; - prSetADC->ucBW = BW; - prSetADC->ucSX = SX; - prSetADC->ucDbdcIdx = DbdcIdx; - prSetADC->ucRunType = RunType; - prSetADC->ucFType = FType; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Structure parser Checking Log\n", __func__)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--------------------------------------------------------------\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ChannelFreq = %d, AntIndex = %d, BW = %d, SX= %d, DbdcIdx = %d, RunType = %d, FType = %d\n", - ChannelFreq, prSetADC->ucAntIndex, prSetADC->ucBW, - prSetADC->ucSX, prSetADC->ucDbdcIdx, prSetADC->ucRunType, - prSetADC->ucFType)); - ret = MtCmdRfTest(pAd, TestCtrl, NULL, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} - -INT32 MtCmdRfTestSetRxGain(IN RTMP_ADAPTER *pAd, IN UINT8 LPFG, IN UINT8 LNA, - IN UINT8 DbdcIdx, IN UINT8 AntIndex) -{ - INT32 ret = 0; - CMD_TEST_CTRL_T TestCtrl; - SET_RX_GAIN_T *prSetRxGain; - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = ACTION_IN_RFTEST; - TestCtrl.u.rRfATInfo.u4FuncIndex = SET_RX_GAIN; -#ifdef RT_BIG_ENDIAN - TestCtrl.u.rRfATInfo.u4FuncIndex = - cpu2le32(TestCtrl.u.rRfATInfo.u4FuncIndex); -#endif - prSetRxGain = &TestCtrl.u.rRfATInfo.Data.rSetRxGain; - prSetRxGain->ucLPFG = LPFG; - prSetRxGain->ucLNA = LNA; - prSetRxGain->ucDbdcIdx = DbdcIdx; - prSetRxGain->ucAntIndex = AntIndex; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Structure parser Checking Log\n", __func__)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("LPFG = %d, LNA = %d, DbdcIdx = %d, AntIndex= %d\n", - prSetRxGain->ucLPFG, prSetRxGain->ucLNA, - prSetRxGain->ucDbdcIdx, prSetRxGain->ucAntIndex)); - ret = MtCmdRfTest(pAd, TestCtrl, NULL, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} - -INT32 MtCmdRfTestSetTTG(IN RTMP_ADAPTER *pAd, IN UINT32 ChannelFreq, - IN UINT32 ToneFreq, IN UINT8 TTGPwrIdx, - IN UINT8 XtalFreq, IN UINT8 DbdcIdx) -{ - INT32 ret = 0; - CMD_TEST_CTRL_T TestCtrl; - SET_TTG_T *prSetTTG; - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = ACTION_IN_RFTEST; - TestCtrl.u.rRfATInfo.u4FuncIndex = SET_TTG; -#ifdef RT_BIG_ENDIAN - TestCtrl.u.rRfATInfo.u4FuncIndex = - cpu2le32(TestCtrl.u.rRfATInfo.u4FuncIndex); -#endif - prSetTTG = &TestCtrl.u.rRfATInfo.Data.rSetTTG; - prSetTTG->u4ChannelFreq = cpu2le32(ChannelFreq); - prSetTTG->u4ToneFreq = cpu2le32(ToneFreq); - prSetTTG->ucTTGPwrIdx = TTGPwrIdx; - prSetTTG->ucXtalFreq = XtalFreq; - prSetTTG->ucDbdcIdx = DbdcIdx; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Structure parser Checking Log\n", __func__)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--------------------------------------------------------------\n")); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ChannelFreq = %d, ToneFreq = %d, TTGPwrIdx = %d, DbdcIdx= %d\n", - ChannelFreq, ToneFreq, prSetTTG->ucTTGPwrIdx, - prSetTTG->ucDbdcIdx)); - ret = MtCmdRfTest(pAd, TestCtrl, NULL, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} - -INT32 MtCmdRfTestSetTTGOnOff(IN RTMP_ADAPTER *pAd, IN UINT8 TTGEnable, - IN UINT8 DbdcIdx, IN UINT8 AntIndex) -{ - INT32 ret = 0; - CMD_TEST_CTRL_T TestCtrl; - TTG_ON_OFF_T *prTTGOnOff; - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = ACTION_IN_RFTEST; - TestCtrl.u.rRfATInfo.u4FuncIndex = TTG_ON_OFF; -#ifdef RT_BIG_ENDIAN - TestCtrl.u.rRfATInfo.u4FuncIndex = - cpu2le32(TestCtrl.u.rRfATInfo.u4FuncIndex); -#endif - prTTGOnOff = &TestCtrl.u.rRfATInfo.Data.rTTGOnOff; - prTTGOnOff->ucTTGEnable = TTGEnable; - prTTGOnOff->ucDbdcIdx = DbdcIdx; - prTTGOnOff->ucAntIndex = AntIndex; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Structure parser Checking Log\n", - __func__)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("TTGEnable = %d, DbdcIdx = %d, AntIndex = %d\n", - prTTGOnOff->ucTTGEnable, prTTGOnOff->ucDbdcIdx, - prTTGOnOff->ucAntIndex)); - ret = MtCmdRfTest(pAd, TestCtrl, NULL, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} - -static INT32 MtCmdRfTestTrigger(RTMP_ADAPTER *pAd, - PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo, - UINT16 rsp_len) -{ - INT32 ret = 0; - CMD_TEST_CTRL_T TestCtrl; - os_zero_mem(&TestCtrl, sizeof(TestCtrl)); - TestCtrl.ucAction = ACTION_IN_RFTEST; - TestCtrl.ucIcapLen = RF_TEST_ICAP_LEN; - os_move_mem(&TestCtrl.u.rRfATInfo, &rRfATInfo, sizeof(rRfATInfo)); - ret = MtCmdRfTest(pAd, TestCtrl, NULL, rsp_len); - return ret; -} - -INT32 MtCmdDoCalibration(RTMP_ADAPTER *pAd, UINT32 func_idx, UINT32 item, - UINT32 band_idx) -{ - struct _PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo; - INT32 ret = 0; - UINT16 rsp_len = RF_TEST_DEFAULT_RESP_LEN; - os_zero_mem(&rRfATInfo, sizeof(rRfATInfo)); - rRfATInfo.u4FuncIndex = cpu2le32(func_idx); -#ifdef MT7615 - - if (IS_MT7615(pAd)) { - if (item == CAL_ALL) - rsp_len = RC_CAL_RESP_LEN; - - rRfATInfo.Data.rCalParam.u4FuncData = cpu2le32(item); - rRfATInfo.Data.rCalParam.ucDbdcIdx = band_idx; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, func_idx:%x, func_data:%x, band_idx:%x\n", - __func__, func_idx, item, band_idx)); - } else -#endif - { - rRfATInfo.Data.u4FuncData = cpu2le32(item); - } - - ret = MtCmdRfTestTrigger(pAd, rRfATInfo, rsp_len); - return ret; -} - -INT32 MtCmdTxContinous(RTMP_ADAPTER *pAd, UINT32 PhyMode, UINT32 BW, - UINT32 PriCh, UINT32 CentralCh, UINT32 Mcs, UINT32 WFSel, - UINT32 TxfdMode, UINT8 Band, UINT8 onoff) -{ - struct _PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo; - INT32 ret = 0; - UINT8 TXDRate = 0; - os_zero_mem(&rRfATInfo, sizeof(rRfATInfo)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, mode:0x%x, bw:0x%x, prich(Control CH):0x%x, mcs:0x%x\n", - __func__, PhyMode, BW, PriCh, Mcs)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("wfsel:0x%x, TxfdMode:0x%x, Band:0x%xon/off:0x%x\n", WFSel, - TxfdMode, Band, onoff)); - - if (onoff == 0) { - rRfATInfo.u4FuncIndex = CONTINUOUS_TX_STOP; - rRfATInfo.Data.u4FuncData = Band; -#ifdef RT_BIG_ENDIAN - rRfATInfo.u4FuncIndex = cpu2le32(rRfATInfo.u4FuncIndex); - rRfATInfo.Data.u4FuncData = cpu2le32(rRfATInfo.Data.u4FuncData); -#endif - } else { - rRfATInfo.u4FuncIndex = CONTINUOUS_TX_START; -#ifdef RT_BIG_ENDIAN - rRfATInfo.u4FuncIndex = cpu2le32(rRfATInfo.u4FuncIndex); -#endif - /* 0: All 1:TX0 2:TX1 */ - rRfATInfo.Data.rConTxParam.ucCentralCh = (UINT8)CentralCh; - rRfATInfo.Data.rConTxParam.ucCtrlCh = (UINT8)PriCh; - rRfATInfo.Data.rConTxParam.ucAntIndex = (UINT8)WFSel; - rRfATInfo.Data.rConTxParam.ucBW = (UINT8)BW; - - if (PhyMode == 0) { /* CCK */ - switch (Mcs) { - /* long preamble */ - case 0: - TXDRate = 0; - break; - - case 1: - TXDRate = 1; - break; - - case 2: - TXDRate = 2; - break; - - case 3: - TXDRate = 3; - break; - - /* short preamble */ - case 9: - TXDRate = 5; - break; - - case 10: - TXDRate = 6; - break; - - case 11: - TXDRate = 7; - break; - } - } else if (PhyMode == 1) { /* OFDM */ - switch (Mcs) { - case 0: - TXDRate = 11; - break; - - case 1: - TXDRate = 15; - break; - - case 2: - TXDRate = 10; - break; - - case 3: - TXDRate = 14; - break; - - case 4: - TXDRate = 9; - break; - - case 5: - TXDRate = 13; - break; - - case 6: - TXDRate = 8; - break; - - case 7: - TXDRate = 12; - break; - } - } else if (2 == PhyMode || 3 == PhyMode || 4 == PhyMode) { - /* 2. MODULATION_SYSTEM_HT20 || - * 3.MODULATION_SYSTEM_HT40 || 4. VHT - */ - TXDRate = (UINT8)Mcs; - } - - rRfATInfo.Data.rConTxParam.u2RateCode = PhyMode << 6 | TXDRate; -#ifdef RT_BIG_ENDIAN - rRfATInfo.Data.rConTxParam.u2RateCode = - cpu2le16(rRfATInfo.Data.rConTxParam.u2RateCode); -#endif - rRfATInfo.Data.rConTxParam.ucBand = Band; - rRfATInfo.Data.rConTxParam.ucTxfdMode = TxfdMode; - } - - ret = MtCmdRfTestTrigger(pAd, rRfATInfo, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} - -INT32 MtCmdTxTone(RTMP_ADAPTER *pAd, UINT8 BandIdx, UINT8 Control, - UINT8 AntIndex, UINT8 ToneType, UINT8 ToneFreq, - INT32 DcOffset_I, INT32 DcOffset_Q, UINT32 Band) -{ - INT32 ret = 0; - struct _PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo; - os_zero_mem(&rRfATInfo, sizeof(rRfATInfo)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Control:%d, AntIndex:%d, ToneType:%d, ToneFreq:%d\n", - __func__, Control, AntIndex, ToneType, ToneFreq)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("BandIdx:%d, DcOffset_I:%d, DcOffset_Q:%d, Band:%d\n", - BandIdx, DcOffset_I, DcOffset_Q, Band)); - - if (Control) { - rRfATInfo.u4FuncIndex = TX_TONE_START; -#ifdef RT_BIG_ENDIAN - rRfATInfo.u4FuncIndex = cpu2le32(rRfATInfo.u4FuncIndex); -#endif - rRfATInfo.Data.rTxToneParam.ucAntIndex = AntIndex; - rRfATInfo.Data.rTxToneParam.ucToneType = ToneType; - rRfATInfo.Data.rTxToneParam.ucToneFreq = ToneFreq; - rRfATInfo.Data.rTxToneParam.ucDbdcIdx = BandIdx; - rRfATInfo.Data.rTxToneParam.i4DcOffsetI = cpu2le32(DcOffset_I); - rRfATInfo.Data.rTxToneParam.i4DcOffsetQ = cpu2le32(DcOffset_Q); - rRfATInfo.Data.rTxToneParam.u4Band = cpu2le32(Band); - } else { - rRfATInfo.u4FuncIndex = TX_TONE_STOP; -#ifdef RT_BIG_ENDIAN - rRfATInfo.u4FuncIndex = cpu2le32(rRfATInfo.u4FuncIndex); -#endif - rRfATInfo.Data.u4FuncData = cpu2le32(Band); - } - - ret = MtCmdRfTestTrigger(pAd, rRfATInfo, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} -/*type: - * RF_AT_EXT_FUNCID_TX_TONE_RF_GAIN - * RF_AT_EXT_FUNCID_TX_TONE_DIGITAL_GAIN - */ -INT32 MtCmdTxTonePower(RTMP_ADAPTER *pAd, INT32 type, INT32 dec, - UINT8 TxAntennaSel, UINT8 Band) -{ - INT32 ret = 0; - struct _PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo; - os_zero_mem(&rRfATInfo, sizeof(rRfATInfo)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, type:%d, dec:%d, TxAntennaSel: %d\n", __func__, type, - dec, TxAntennaSel)); - rRfATInfo.u4FuncIndex = cpu2le32(type); - - /* 0: All 1:TX0 2:TX1 */ - switch (TxAntennaSel) { - case 0: - case 1: - case 2: - case 3: - case 4: - rRfATInfo.Data.rTxToneGainParam.ucAntIndex = TxAntennaSel; - break; - - default: /* for future more than 3*3 ant */ - rRfATInfo.Data.rTxToneGainParam.ucAntIndex = TxAntennaSel - 1; - break; - } - - rRfATInfo.Data.rTxToneGainParam.ucTonePowerGain = (UINT8)dec; - rRfATInfo.Data.rTxToneGainParam.ucBand = Band; - ret = MtCmdRfTestTrigger(pAd, rRfATInfo, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} - -INT32 MtCmdSetRDDTestExt(RTMP_ADAPTER *pAd, UINT32 rdd_idx, UINT32 rdd_rx_sel, - UINT32 is_start) -{ - INT32 ret = 0; - struct _PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo; - os_zero_mem(&rRfATInfo, sizeof(rRfATInfo)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, rdd_num:%u, IsStart:%d\n", __func__, rdd_idx, is_start)); - - if (IS_MT7615(pAd) || IS_MT7636(pAd) || IS_MT7637(pAd)) { - rRfATInfo.u4FuncIndex = RDD_TEST_MODE; -#ifdef RT_BIG_ENDIAN - rRfATInfo.u4FuncIndex = cpu2le32(rRfATInfo.u4FuncIndex); -#endif - rRfATInfo.Data.rRDDParam.ucDfsCtrl = is_start; - rRfATInfo.Data.rRDDParam.ucRddIdx = rdd_idx; - rRfATInfo.Data.rRDDParam.ucRddRxSel = rdd_rx_sel; - ret = MtCmdRfTestTrigger(pAd, rRfATInfo, - RF_TEST_DEFAULT_RESP_LEN); - } else - ret = MtCmdSetRDDTest(pAd, is_start); - - return ret; -} - -INT32 MtCmdSetRDDTest(RTMP_ADAPTER *pAd, UINT32 IsStart) -{ - INT32 ret = 0; - struct _PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo; - os_zero_mem(&rRfATInfo, sizeof(rRfATInfo)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, IsStart:%d\n", __func__, IsStart)); - rRfATInfo.u4FuncIndex = RDD_TEST_MODE; -#ifdef RT_BIG_ENDIAN - rRfATInfo.u4FuncIndex = cpu2le32(rRfATInfo.u4FuncIndex); -#endif - rRfATInfo.Data.u4FuncData = cpu2le32(IsStart); /* 0 Stop, 1 Start */ - ret = MtCmdRfTestTrigger(pAd, rRfATInfo, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} - -INT32 MtCmdSetCalDump(RTMP_ADAPTER *pAd, UINT32 IsEnable) -{ - INT32 ret = 0; - struct _PARAM_MTK_WIFI_TEST_STRUC_T rRfATInfo; - os_zero_mem(&rRfATInfo, sizeof(rRfATInfo)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, IsEnable = %d\n", __func__, IsEnable)); - rRfATInfo.u4FuncIndex = CAL_RESULT_DUMP_FLAG; -#ifdef RT_BIG_ENDIAN - rRfATInfo.u4FuncIndex = cpu2le32(rRfATInfo.u4FuncIndex); -#endif - rRfATInfo.Data.u4FuncData = - cpu2le32(IsEnable); /* 0 Disable, 1 Enable */ - ret = MtCmdRfTestTrigger(pAd, rRfATInfo, RF_TEST_DEFAULT_RESP_LEN); - return ret; -} - -/***************************************** - * ExT_CID = 0x05 - * 1: On - * 2: Off - *****************************************/ -INT32 MtCmdRadioOnOffCtrl(RTMP_ADAPTER *pAd, UINT8 On) -{ - struct cmd_msg *msg; - struct _EXT_CMD_RADIO_ON_OFF_CTRL_T RadioOnOffCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: On = %d\n", __func__, On)); -#ifdef MT7615 - - /* TODO: Shiang-Mt7615, fix me! */ - if (IS_MT7615(pAd)) - return 0; - -#endif /* MT7615 */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(RadioOnOffCtrl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_RADIO_ON_OFF_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&RadioOnOffCtrl, sizeof(RadioOnOffCtrl)); - - if (On == WIFI_RADIO_ON) - RadioOnOffCtrl.ucWiFiRadioCtrl = WIFI_RADIO_ON; - else if (On == WIFI_RADIO_OFF) - RadioOnOffCtrl.ucWiFiRadioCtrl = WIFI_RADIO_OFF; - else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: unknown state, On=%d\n", __func__, On)); - } - - MtAndesAppendCmdMsg(msg, (char *)&RadioOnOffCtrl, - sizeof(RadioOnOffCtrl)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x06 - *****************************************/ -INT32 MtCmdWiFiRxDisable(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - struct _EXT_CMD_WIFI_RX_DISABLE_T WiFiRxDisable; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: WiFiRxDisable = %d\n", __func__, WIFI_RX_DISABLE)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(WiFiRxDisable)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_WIFI_RX_DISABLE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&WiFiRxDisable, sizeof(WiFiRxDisable)); - WiFiRxDisable.ucWiFiRxDisableCtrl = WIFI_RX_DISABLE; - MtAndesAppendCmdMsg(msg, (char *)&WiFiRxDisable, sizeof(WiFiRxDisable)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x07 - *****************************************/ -/*TODO: Star check to Hanmin*/ - -static VOID CmdExtPmMgtBitRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); -} - -INT32 MtCmdExtPwrMgtBitWifi(RTMP_ADAPTER *pAd, - MT_PWR_MGT_BIT_WIFI_T rPwrMgtBitWifi) -{ - struct cmd_msg *msg; - EXT_CMD_PWR_MGT_BIT_T PwrMgtBitWifi = { 0 }; - INT32 Ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_PWR_MGT_BIT_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - PwrMgtBitWifi.ucWlanIdx = rPwrMgtBitWifi.ucWlanIdx; - PwrMgtBitWifi.ucPwrMgtBit = rPwrMgtBitWifi.ucPwrMgtBit; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:ucWlanIdx(%d), ucPwrMgtBit(%d)\n", __func__, - rPwrMgtBitWifi.ucWlanIdx, rPwrMgtBitWifi.ucPwrMgtBit)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PWR_MGT_BIT_WIFI); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtPmMgtBitRsp); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&PwrMgtBitWifi, sizeof(PwrMgtBitWifi)); - Ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -#ifdef HOST_RESUME_DONE_ACK_SUPPORT -static VOID cmd_host_resume_done_ack_rsp(struct cmd_msg *msg, char *data, - UINT16 len) -{ - struct _EVENT_EXT_CMD_RESULT_T *event_ext_cmd_result = - (struct _EVENT_EXT_CMD_RESULT_T *)data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - event_ext_cmd_result->ucExTenCID)); - event_ext_cmd_result->u4Status = - le2cpu32(event_ext_cmd_result->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - event_ext_cmd_result->u4Status)); -} - -INT32 mt_cmd_host_resume_done_ack(struct _RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - EXT_CMD_HOST_RESUME_DONE_ACK_T host_resume_done_ack = { 0 }; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_HOST_RESUME_DONE_ACK_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_HOST_RESUME_DONE_ACK); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, cmd_host_resume_done_ack_rsp); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&host_resume_done_ack, - sizeof(host_resume_done_ack)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* HOST_RESUME_DONE_ACK_SUPPORT */ - -static VOID CmdExtPmStateCtrlRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); -} - -INT32 MtCmdExtPmStateCtrl(RTMP_ADAPTER *pAd, MT_PMSTAT_CTRL_T PmStatCtrl) -{ - struct cmd_msg *msg = NULL; - EXT_CMD_PM_STATE_CTRL_T CmdPmStateCtrl = { 0 }; - INT32 Ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_PM_STATE_CTRL_T)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - /* Fill parameter here*/ - CmdPmStateCtrl.ucWlanIdx = PmStatCtrl.WlanIdx; - CmdPmStateCtrl.ucOwnMacIdx = PmStatCtrl.OwnMacIdx; - CmdPmStateCtrl.ucPmNumber = PmStatCtrl.PmNumber; - CmdPmStateCtrl.ucPmState = PmStatCtrl.PmState; - CmdPmStateCtrl.ucDbdcIdx = PmStatCtrl.DbdcIdx; - os_move_mem(CmdPmStateCtrl.aucBssid, PmStatCtrl.Bssid, MAC_ADDR_LEN); - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_PM_STATE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtPmStateCtrlRsp); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdPmStateCtrl, - sizeof(CmdPmStateCtrl)); - Ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d)\n", __func__, Ret)); - return Ret; -} - -/***************************************** - * ExT_CID = 0x08 - *****************************************/ -UCHAR GetCfgBw2RawBw(UCHAR CfgBw) -{ - switch (CfgBw) { - case BW_20: - return CMD_BW_20; - - case BW_40: - return CMD_BW_40; - - case BW_80: - return CMD_BW_80; - - case BW_160: - return CMD_BW_160; - - case BW_10: - return CMD_BW_10; - - case BW_5: - return CMD_BW_5; - - case BW_8080: - return CMD_BW_8080; - - default: - return CMD_BW_20; - } - - return CMD_BW_20; -} - -#ifdef NEW_SET_RX_STREAM -/* TODO: temporary to keep channel setting */ -MT_SWITCH_CHANNEL_CFG CurrentSwChCfg[2]; -#endif - -INT32 MtCmdChannelSwitch(RTMP_ADAPTER *pAd, MT_SWITCH_CHANNEL_CFG SwChCfg) -{ - struct cmd_msg *msg; - struct _EXT_CMD_CHAN_SWITCH_T CmdChanSwitch; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - UINT8 TxPowerDrop = 0; -#ifdef SINGLE_SKU_V2 - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - UCHAR fg5Gband = 0; -#endif - UINT8 SKUIdx = 0; - - if (SwChCfg.CentralChannel == 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: central channel = 0 is invalid\n", __func__)); - return -1; - } - - { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: control_chl = %d,control_ch2=%d, central_chl = %d DBDCIdx= %d, Band= %d\n", - __func__, SwChCfg.ControlChannel, - SwChCfg.ControlChannel2, SwChCfg.CentralChannel, - SwChCfg.BandIdx, SwChCfg.Channel_Band)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("BW = %d,TXStream = %d, RXStream = %d, scan(%d)\n", - SwChCfg.Bw, SwChCfg.TxStream, SwChCfg.RxStream, - SwChCfg.bScan)); - } - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdChanSwitch)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_CHANNEL_SWITCH); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 5000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdChanSwitch, sizeof(CmdChanSwitch)); - CmdChanSwitch.ucPrimCh = SwChCfg.ControlChannel; - CmdChanSwitch.ucCentralCh = SwChCfg.CentralChannel; - CmdChanSwitch.ucCentralCh2 = SwChCfg.ControlChannel2; - CmdChanSwitch.ucTxStreamNum = SwChCfg.TxStream; - CmdChanSwitch.ucRxStreamNum = SwChCfg.RxStream; - CmdChanSwitch.ucDbdcIdx = SwChCfg.BandIdx; - CmdChanSwitch.ucBW = GetCfgBw2RawBw(SwChCfg.Bw); - CmdChanSwitch.ucBand = SwChCfg.Channel_Band; - CmdChanSwitch.u4OutBandFreq = cpu2le32(SwChCfg.OutBandFreq); -#ifdef COMPOS_TESTMODE_WIN - - if (SwChCfg.isMCC) { - /* MCC */ - CmdChanSwitch.ucSwitchReason = CH_SWITCH_INTERNAL_USED_BY_FW_3; - } else -#endif - CmdChanSwitch.ucSwitchReason = CH_SWITCH_BY_NORMAL_TX_RX; - - if (SwChCfg.bScan) { -#if defined(MT7615) - - if (IS_MT7615(pAd)) - CmdChanSwitch.ucSwitchReason = - CH_SWITCH_SCAN_BYPASS_DPD; - -#endif - } -#ifdef MT_DFS_SUPPORT - else { - if (SwChCfg.bDfsCheck) - CmdChanSwitch.ucSwitchReason = CH_SWITCH_DFS; - } - -#endif - - /* check Tx Power setting from UI. */ - if ((pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] > 90) && - (pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] < 100)) - TxPowerDrop = 0; - else if ((pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] > 60) && - (pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] <= - 90)) /* reduce Pwr for 1 dB. */ - TxPowerDrop = 1; - else if ((pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] > 30) && - (pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] <= - 60)) /* reduce Pwr for 3 dB. */ - TxPowerDrop = 3; - else if ((pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] > 15) && - (pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] <= - 30)) /* reduce Pwr for 6 dB. */ - TxPowerDrop = 6; - else if ((pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] > 9) && - (pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] <= - 15)) /* reduce Pwr for 9 dB. */ - TxPowerDrop = 9; - else if ((pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] > 0) && - (pAd->CommonCfg.ucTxPowerPercentage[SwChCfg.BandIdx] <= - 9)) /* reduce Pwr for 12 dB. */ - TxPowerDrop = 12; - - CmdChanSwitch.cTxPowerDrop = TxPowerDrop; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - (" TxPowerDrop = 0x%x\n", CmdChanSwitch.cTxPowerDrop)); - - for (SKUIdx = 0; SKUIdx < SKU_SIZE; SKUIdx++) - CmdChanSwitch.acTxPowerSKU[SKUIdx] = 0x3F; - -#ifdef SINGLE_SKU_V2 - - if (SwChCfg.Channel_Band == 0) { /* Not 802.11j */ - if (SwChCfg.ControlChannel <= 14) - fg5Gband = 0; - else - fg5Gband = 1; - } else - fg5Gband = 1; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - if (SwChCfg.BandIdx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - (" fg5Gband = 0x%x\n", fg5Gband)); - -#if defined(MT7615) || defined(MT7622) - /* Check G-Band/A-Band */ - if (fg5Gband) { - /* apply control channel SKU value */ - MtFillSkuParam(pAd, SwChCfg.ControlChannel, fg5Gband, ucTxPath, - CmdChanSwitch.acTxPowerSKU, 0); - } else { - /* apply central channel SKU value */ - MtFillSkuParam(pAd, SwChCfg.CentralChannel, fg5Gband, ucTxPath, - CmdChanSwitch.acTxPowerSKU, 0); - /* Check BW if 40Mhz, fill the Control channel SKU for BW20*/ - if ((SwChCfg.Bw == 1) && (SwChCfg.ControlChannel <= 14)) { - MtFillSkuParam(pAd, SwChCfg.ControlChannel, fg5Gband, - ucTxPath, CmdChanSwitch.acTxPowerSKU, 1); - } - } -#else -#endif /* defined(MT7615) || defined(MT7622) */ - - for (SKUIdx = 0; SKUIdx < SKU_TOTAL_SIZE; SKUIdx++) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: CmdChanSwitch.aucTxPowerSKU[%d]: 0x%x\n", - __func__, SKUIdx, - CmdChanSwitch.acTxPowerSKU[SKUIdx])); - - os_move_mem(pAd->TxPowerSKU, CmdChanSwitch.acTxPowerSKU, SKU_SIZE); - - for (SKUIdx = 0; SKUIdx < SKU_SIZE; SKUIdx++) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: pAd->TxPowerSKU[%d]: 0x%x\n", __func__, SKUIdx, - pAd->TxPowerSKU[SKUIdx])); - -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdChanSwitch, sizeof(CmdChanSwitch)); -#ifdef NEW_SET_RX_STREAM - /* TODO: temporary to keep channel setting */ - os_move_mem(&CurrentSwChCfg[SwChCfg.BandIdx], &SwChCfg, - sizeof(MT_SWITCH_CHANNEL_CFG)); -#endif -#ifdef BACKGROUND_SCAN_SUPPORT - /* Backup swtich channel configuration for background scan */ - os_move_mem(&pAd->BgndScanCtrl.CurrentSwChCfg[0], &SwChCfg, - sizeof(MT_SWITCH_CHANNEL_CFG)); -#endif - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#ifdef NEW_SET_RX_STREAM -INT MtCmdSetRxPath(struct _RTMP_ADAPTER *pAd, UINT32 Path, UCHAR BandIdx) -{ - MT_SWITCH_CHANNEL_CFG *pSwChCfg = &CurrentSwChCfg[BandIdx]; - struct cmd_msg *msg; - struct _EXT_CMD_CHAN_SWITCH_T CmdChanSwitch; - INT32 ret = 0, i = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; -#ifdef SINGLE_SKU_V2 - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - UCHAR fg5Gband = 0; -#endif - - if (pSwChCfg->CentralChannel == 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: central channel = 0 is invalid\n", __func__)); - return -1; - } - - /* TODO: Pat: Update new path. It is rx path actually. */ - pSwChCfg->RxStream = Path; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: control_chl = %d,control_ch2=%d, central_chl = %d, BW = %d,TXStream = %d, RXStream = %d, BandIdx =%d, scan(%d), Channel_Band = %d\n", - __func__, pSwChCfg->ControlChannel, pSwChCfg->ControlChannel2, - pSwChCfg->CentralChannel, pSwChCfg->Bw, pSwChCfg->TxStream, - pSwChCfg->RxStream, pSwChCfg->BandIdx, pSwChCfg->bScan, - pSwChCfg->Channel_Band)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdChanSwitch)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_RX_PATH); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdChanSwitch, sizeof(CmdChanSwitch)); - CmdChanSwitch.ucPrimCh = pSwChCfg->ControlChannel; - CmdChanSwitch.ucCentralCh = pSwChCfg->CentralChannel; - CmdChanSwitch.ucCentralCh2 = pSwChCfg->ControlChannel2; - CmdChanSwitch.ucTxStreamNum = pSwChCfg->TxStream; - CmdChanSwitch.ucRxStreamNum = pSwChCfg->RxStream; - CmdChanSwitch.ucDbdcIdx = pSwChCfg->BandIdx; - CmdChanSwitch.ucBW = GetCfgBw2RawBw(pSwChCfg->Bw); - CmdChanSwitch.ucBand = pSwChCfg->Channel_Band; - - for (i = 0; i < SKU_SIZE; i++) - CmdChanSwitch.acTxPowerSKU[i] = 0x3f; - -#ifdef SINGLE_SKU_V2 - - if (pSwChCfg->Channel_Band == 0) { /* Not 802.11j */ - if (pSwChCfg->ControlChannel <= 14) - fg5Gband = 0; - else - fg5Gband = 1; - } else - fg5Gband = 1; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - if (BandIdx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdChanSwitch, sizeof(CmdChanSwitch)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif - -INT MtCmdSetTxRxPath(struct _RTMP_ADAPTER *pAd, MT_SWITCH_CHANNEL_CFG SwChCfg) -{ - struct cmd_msg *msg; - struct _EXT_CMD_CHAN_SWITCH_T CmdChanSwitch; - INT32 ret = 0, i = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; -#ifdef SINGLE_SKU_V2 -#ifdef DBDC_MODE - UINT8 ucTxPath = pAd->Antenna.field.TxPath; -#endif - UCHAR fg5Gband = 0; -#endif - MT_SWITCH_CHANNEL_CFG *pSwChCfg = &SwChCfg; - UCHAR RxPath = 0; - - if (pSwChCfg->CentralChannel == 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: central channel = 0 is invalid\n", __func__)); - return -1; - } - - /*for normal case*/ - if (pSwChCfg->Bw == BW_160 || pSwChCfg->Bw == BW_8080) { - /*if bw 160, 1 stream use WIFI (0,2), 2 stream use WIFI (0,1,2,3)*/ - RxPath = (SwChCfg.RxStream > 1) ? 0xf : 0x5; - /*bw160 & 80+80 should always apply 4 TxStream*/ - pSwChCfg->TxStream = 4; - } else { - /*for normal case*/ - for (i = 0; i < SwChCfg.RxStream; i++) - RxPath |= (1 << (i + (SwChCfg.BandIdx * 2))); - } - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: control_chl = %d,control_ch2=%d, central_chl = %d, BW = %d,TXStream = %d, RXStream = %d,RXPath = %x, BandIdx =%d, scan(%d), Channel_Band = %d\n", - __func__, pSwChCfg->ControlChannel, pSwChCfg->ControlChannel2, - pSwChCfg->CentralChannel, pSwChCfg->Bw, pSwChCfg->TxStream, - pSwChCfg->RxStream, RxPath, pSwChCfg->BandIdx, pSwChCfg->bScan, - pSwChCfg->Channel_Band)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdChanSwitch)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_RX_PATH); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdChanSwitch, sizeof(CmdChanSwitch)); - CmdChanSwitch.ucPrimCh = pSwChCfg->ControlChannel; - CmdChanSwitch.ucCentralCh = pSwChCfg->CentralChannel; - CmdChanSwitch.ucCentralCh2 = pSwChCfg->ControlChannel2; - CmdChanSwitch.ucTxStreamNum = pSwChCfg->TxStream; -#ifdef CONFIG_ATE - /* For normal mode, use rx path which means rx stream capability. - For test mode, use rx path with bit wise. - Need to modiy tx/rx path and set channel flow here. - */ - if (ATE_ON(pAd)) - CmdChanSwitch.ucRxStreamNum = pSwChCfg->RxStream; - else -#endif /* CONFIG_ATE */ - CmdChanSwitch.ucRxStreamNum = RxPath; - - CmdChanSwitch.ucDbdcIdx = pSwChCfg->BandIdx; - CmdChanSwitch.ucBW = GetCfgBw2RawBw(pSwChCfg->Bw); - CmdChanSwitch.ucBand = pSwChCfg->Channel_Band; - CmdChanSwitch.u2CacCase = 0; -#ifdef COMPOS_TESTMODE_WIN - - if (SwChCfg.isMCC) { - /* MCC */ - CmdChanSwitch.ucSwitchReason = CH_SWITCH_INTERNAL_USED_BY_FW_3; - } else -#endif - CmdChanSwitch.ucSwitchReason = CH_SWITCH_BY_NORMAL_TX_RX; - - if (SwChCfg.bScan) { -#if defined(MT7615) - - if (IS_MT7615(pAd)) - CmdChanSwitch.ucSwitchReason = - CH_SWITCH_SCAN_BYPASS_DPD; - -#endif - } -#ifdef MT_DFS_SUPPORT - else { - if (SwChCfg.bDfsCheck) - CmdChanSwitch.ucSwitchReason = CH_SWITCH_DFS; - } - -#endif - - for (i = 0; i < SKU_SIZE; i++) - CmdChanSwitch.acTxPowerSKU[i] = 0x3f; - -#ifdef SINGLE_SKU_V2 - - if (pSwChCfg->Channel_Band == 0) { /* Not 802.11j */ - if (pSwChCfg->ControlChannel <= 14) - fg5Gband = 0; - else - fg5Gband = 1; - } else - fg5Gband = 1; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - if (pSwChCfg->BandIdx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif -#endif -#ifdef RT_BIG_ENDIAN - CmdChanSwitch.u2CacCase = cpu2le16(CmdChanSwitch.u2CacCase); -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdChanSwitch, sizeof(CmdChanSwitch)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x0e - *****************************************/ -static VOID CmdMultipleMacRegAccessReadCb(struct cmd_msg *msg, char *data, - UINT16 len) -{ - UINT32 Index; - UINT32 Num = (len - 20) / sizeof(EXT_EVENT_MULTI_CR_ACCESS_RD_T); - EXT_EVENT_MULTI_CR_ACCESS_RD_T *EventMultiCRAccessRD = - (EXT_EVENT_MULTI_CR_ACCESS_RD_T *)(data + 20); - RTMP_REG_PAIR *RegPair = (RTMP_REG_PAIR *)msg->attr.rsp.wb_buf_in_calbk; -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) - RTMP_REG_PAIR *Start = RegPair; -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ - - for (Index = 0; Index < Num; Index++) { - RegPair->Register = le2cpu32(EventMultiCRAccessRD->u4Addr); - RegPair->Value = le2cpu32(EventMultiCRAccessRD->u4Data); - EventMultiCRAccessRD++; - RegPair++; - } - -#if defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) - RegPair = Start; - for (Index = 0; Index < Num; Index++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("0x%08x=0x%08x\n", RegPair->Register, - RegPair->Value)); - RegPair++; - } -#endif /* defined(INTERNAL_CAPTURE_SUPPORT) || defined(WIFI_SPECTRUM_SUPPORT) */ -} - -INT32 MtCmdMultipleMacRegAccessRead(RTMP_ADAPTER *pAd, RTMP_REG_PAIR *RegPair, - UINT32 Num) -{ - struct cmd_msg *msg; - CMD_MULTI_CR_ACCESS_T MultiCR; - INT32 Ret; - UINT32 Index; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_MULTI_CR_ACCESS_T) * Num); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_MULTIPLE_REG_ACCESS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, ((12 * Num) + 20)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, RegPair); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdMultipleMacRegAccessReadCb); - MtAndesInitCmdMsg(msg, attr); - - for (Index = 0; Index < Num; Index++) { - os_zero_mem(&MultiCR, sizeof(MultiCR)); - MultiCR.u4Type = cpu2le32(MAC_CR); - MultiCR.u4Addr = cpu2le32(RegPair[Index].Register); - MtAndesAppendCmdMsg(msg, (char *)&MultiCR, sizeof(MultiCR)); - } - - Ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -} - -static VOID CmdMultipleMacRegAccessWriteCb(struct cmd_msg *msg, char *data, - UINT16 len) -{ - EXT_EVENT_MULTI_CR_ACCESS_WR_T *EventMultiCRAccessWR = - (EXT_EVENT_MULTI_CR_ACCESS_WR_T *)(data + 20); - EventMultiCRAccessWR->u4Status = - le2cpu32(EventMultiCRAccessWR->u4Status); - - if (EventMultiCRAccessWR->u4Status) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: fail\n", __func__)); - } -} - -INT32 MtCmdMultipleMacRegAccessWrite(RTMP_ADAPTER *pAd, RTMP_REG_PAIR *RegPair, - UINT32 Num) -{ - struct cmd_msg *msg; - CMD_MULTI_CR_ACCESS_T MultiCR; - INT32 Ret; - UINT32 Index; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_MULTI_CR_ACCESS_T) * Num); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_MULTIPLE_REG_ACCESS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 32); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdMultipleMacRegAccessWriteCb); - MtAndesInitCmdMsg(msg, attr); - - for (Index = 0; Index < Num; Index++) { - os_zero_mem(&MultiCR, sizeof(MultiCR)); - MultiCR.u4Type = MAC_CR; -#ifdef RT_BIG_ENDIAN - MultiCR.u4Type = cpu2le32(MultiCR.u4Type); -#endif - MultiCR.u4Addr = cpu2le32(RegPair[Index].Register); - MultiCR.u4Data = cpu2le32(RegPair[Index].Value); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: offset: = %x\n", __func__, - RegPair[Index].Register)); - MtAndesAppendCmdMsg(msg, (char *)&MultiCR, sizeof(MultiCR)); - } - - Ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -} - -static VOID CmdMultipleRfRegAccessWriteCb(struct cmd_msg *msg, char *data, - UINT16 len) -{ - EXT_EVENT_MULTI_CR_ACCESS_WR_T *EventMultiCRAccessWR = - (EXT_EVENT_MULTI_CR_ACCESS_WR_T *)(data + 20); - EventMultiCRAccessWR->u4Status = - le2cpu32(EventMultiCRAccessWR->u4Status); - - if (EventMultiCRAccessWR->u4Status) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: fail\n", __func__)); - } -} - -INT32 MtCmdMultipleRfRegAccessWrite(RTMP_ADAPTER *pAd, MT_RF_REG_PAIR *RegPair, - UINT32 Num) -{ - struct cmd_msg *msg; - CMD_MULTI_CR_ACCESS_T MultiCR; - INT32 Ret; - UINT32 Index; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_MULTI_CR_ACCESS_T) * Num); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_MULTIPLE_REG_ACCESS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 32); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdMultipleRfRegAccessWriteCb); - MtAndesInitCmdMsg(msg, attr); - - for (Index = 0; Index < Num; Index++) { - os_zero_mem(&MultiCR, sizeof(MultiCR)); - MultiCR.u4Type = - cpu2le32((RF_CR & 0xff) | - ((RegPair->WiFiStream & 0xffffff) << 8)); - MultiCR.u4Addr = cpu2le32(RegPair[Index].Register); - MultiCR.u4Data = cpu2le32(RegPair[Index].Value); - MtAndesAppendCmdMsg(msg, (char *)&MultiCR, sizeof(MultiCR)); - } - - Ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -} - -/***************************************** - * ExT_CID = 0x10 - *****************************************/ -static VOID CmdSecKeyRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - P_EVENT_SEC_ADDREMOVE_STRUC_T EvtSecKey; - UINT32 Status; - UINT32 WlanIndex; - EvtSecKey = (struct _EVENT_SEC_ADDREMOVE_STRUC_T *)Data; - Status = le2cpu32(EvtSecKey->u4Status); - WlanIndex = le2cpu32(EvtSecKey->u4WlanIdx); - - if (Status != 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s, error set key, wlan idx(%d), status: 0x%x\n", - __func__, WlanIndex, Status)); - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, wlan idx(%d), status: 0x%x\n", __func__, - WlanIndex, Status)); - } -} - -INT32 MtCmdSecKeyReq(RTMP_ADAPTER *pAd, UINT8 AddRemove, UINT8 Keytype, - UINT8 *pAddr, UINT8 Alg, UINT8 KeyID, UINT8 KeyLen, - UINT8 WlanIdx, UINT8 *KeyMaterial) -{ - struct cmd_msg *msg; - struct _CMD_SEC_ADDREMOVE_KEY_STRUC_T CmdSecKey; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdSecKey)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_SEC_ADDREMOVE_KEY); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EVENT_SEC_ADDREMOVE_STRUC_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdSecKeyRsp); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdSecKey, sizeof(CmdSecKey)); - CmdSecKey.ucAddRemove = AddRemove; - CmdSecKey.ucKeyType = Keytype; - os_move_mem(CmdSecKey.aucPeerAddr, pAddr, 6); - CmdSecKey.ucAlgorithmId = Alg; - CmdSecKey.ucKeyId = KeyID; - CmdSecKey.ucKeyLen = KeyLen; - os_move_mem(CmdSecKey.aucKeyMaterial, KeyMaterial, KeyLen); - CmdSecKey.ucWlanIndex = WlanIdx; - MtAndesAppendCmdMsg(msg, (char *)&CmdSecKey, sizeof(CmdSecKey)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x11 - *****************************************/ -#ifndef COMPOS_WIN -#ifdef CONFIG_ATE - -#if defined(MT7615) || defined(MT7622) - -static INT32 MtCmdFillTxPowerInfo(RTMP_ADAPTER *pAd, - EXT_CMD_TX_POWER_CTRL_T *CmdTxPwrCtrl, - ATE_TXPOWER TxPower) -{ - INT32 ret = 0; - UINT32 i; - UINT8 data = 0; - UINT32 Group = MtATEGetTxPwrGroup(TxPower.Channel, TxPower.Band_idx, - TxPower.Ant_idx); - - for (i = EFUSE_CONTENT_START; i <= EFUSE_CONTENT_END; i++) { - data = pAd->EEPROMImage[i]; - - if (ATE_ON(pAd)) { - if (i == Group) - data = TxPower.Power; - } - - pAd->EEPROMImage[i] = data; - CmdTxPwrCtrl->aucBinContent[i - EFUSE_CONTENT_START] = data; - } - - /* Debug print */ - for (i = EFUSE_CONTENT_START; i <= EFUSE_CONTENT_END; i++) { - MTWF_LOG( - DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[0x%x]%x ", i, - CmdTxPwrCtrl->aucBinContent[i - EFUSE_CONTENT_START])); - } - - return ret; -} -#else -#endif /* defined(MT7615) || defined(MT7622) */ -/***************************************** - * ExT_CID = 0x1C - *****************************************/ -static VOID MtCmdGetTxPowerRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - P_EXT_EVENT_ID_GET_TX_POWER_T prEventExtCmdResult = - (P_EXT_EVENT_ID_GET_TX_POWER_T)Data; - P_EXT_EVENT_ID_GET_TX_POWER_T prTxPower = - (P_EXT_EVENT_ID_GET_TX_POWER_T)msg->attr.rsp.wb_buf_in_calbk; -#if defined(MT7615) || defined(MT7622) - prTxPower->ucTxPwrType = prEventExtCmdResult->ucTxPwrType; - prTxPower->ucEfuseAddr = prEventExtCmdResult->ucEfuseAddr; - prTxPower->ucEfuseContent = prEventExtCmdResult->ucEfuseContent; - prTxPower->ucBand = prEventExtCmdResult->ucBand; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Type:%d Addr:%x Power:%x Band: %d\n", __func__, - prTxPower->ucTxPwrType, prTxPower->ucEfuseAddr, - prTxPower->ucEfuseContent, prTxPower->ucBand)); -#else - prTxPower->i1TargetPower = prEventExtCmdResult->i1TargetPower; - prTxPower->u1BandIdx = prEventExtCmdResult->u1BandIdx; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Power:%x Band: %d\n", __func__, prTxPower->i1TargetPower, - prTxPower->u1BandIdx)); -#endif /* defined(MT7615) || defined(MT7622) */ -} - -#if defined(MT7615) || defined(MT7622) -INT32 MtCmdGetTxPower(RTMP_ADAPTER *pAd, UINT8 pwrType, UINT8 centerCh, - UINT8 dbdc_idx, UINT8 Ch_Band, - P_EXT_EVENT_ID_GET_TX_POWER_T prTxPwrResult) -{ - struct cmd_msg *msg; - struct _EXT_CMD_GET_TX_POWER_T pwr; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GET_TX_POWER_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Type:%d Channel:%x Band: %d\n", __func__, pwrType, - centerCh, dbdc_idx)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_TX_POWER); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_EVENT_ID_GET_TX_POWER_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, prTxPwrResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetTxPowerRsp); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&pwr, sizeof(pwr)); - pwr.ucTxPwrType = pwrType; - pwr.ucCenterChannel = centerCh; - pwr.ucDbdcIdx = dbdc_idx; - pwr.ucBand = Ch_Band; - MtAndesAppendCmdMsg(msg, (char *)&pwr, sizeof(pwr)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#else -INT32 MtCmdGetTxPower(RTMP_ADAPTER *pAd, UINT8 pwrType, UINT8 centerCh, - UINT8 dbdc_idx, UINT8 Ch_Band, - P_EXT_EVENT_ID_GET_TX_POWER_T prTxPwrResult) -{ - struct cmd_msg *msg; - struct _EXT_CMD_GET_TX_POWER_T pwr; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GET_TX_POWER_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Type:%d Channel:%x Band: %d\n", __func__, pwrType, - centerCh, dbdc_idx)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_EVENT_ID_GET_TX_POWER_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, prTxPwrResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetTxPowerRsp); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&pwr, sizeof(pwr)); - pwr.u1PowerCtrlFormatId = TX_POWER_CMD_GET_TARGET_POWER; - pwr.u1DbdcIdx = dbdc_idx; - MtAndesAppendCmdMsg(msg, (char *)&pwr, sizeof(pwr)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* defined(MT7615) || defined(MT7622) */ - -#if defined(MT7615) || defined(MT7622) -INT32 MtCmdSetTxPowerCtrl(RTMP_ADAPTER *pAd, ATE_TXPOWER TxPower) -{ - struct cmd_msg *msg; - P_EXT_CMD_TX_POWER_CTRL_T pCmdTxPwrCtrl = NULL; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - os_alloc_mem(pAd, (UCHAR **)&pCmdTxPwrCtrl, - sizeof(EXT_CMD_TX_POWER_CTRL_T)); - if (!pCmdTxPwrCtrl) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_TX_POWER_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(pCmdTxPwrCtrl, sizeof(EXT_CMD_TX_POWER_CTRL_T)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_SET_TX_POWER_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - pCmdTxPwrCtrl->ucCenterChannel = TxPower.Channel; - pCmdTxPwrCtrl->ucDbdcIdx = TxPower.Dbdc_idx; - pCmdTxPwrCtrl->ucBand = TxPower.Band_idx; - MtCmdFillTxPowerInfo(pAd, pCmdTxPwrCtrl, TxPower); - MtAndesAppendCmdMsg(msg, (char *)pCmdTxPwrCtrl, - sizeof(EXT_CMD_TX_POWER_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - if (pCmdTxPwrCtrl) - os_free_mem(pCmdTxPwrCtrl); - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#else -INT32 MtCmdSetTxPowerCtrl(RTMP_ADAPTER *pAd, ATE_TXPOWER TxPower) -{ - struct cmd_msg *msg; - EXT_CMD_TX_POWER_CTRL_T CmdTxPwrCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_TX_POWER_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&CmdTxPwrCtrl, sizeof(CmdTxPwrCtrl)); - CmdTxPwrCtrl.u1PowerCtrlFormatId = TX_POWER_CMD_SET_TARGET_POWER; - CmdTxPwrCtrl.u1DbdcIdx = TxPower.Dbdc_idx; - CmdTxPwrCtrl.i1TargetPower = TxPower.Power; - MtAndesAppendCmdMsg(msg, (char *)&CmdTxPwrCtrl, sizeof(CmdTxPwrCtrl)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* defined(MT7615) || defined(MT7622) */ - -INT32 MtCmdSetForceTxPowerCtrl(RTMP_ADAPTER *pAd, UINT8 ucBandIdx, - INT8 cTxPower, UINT8 ucPhyMode, UINT8 ucTxRate, - UINT8 ucBW) -{ - struct cmd_msg *msg; - CMD_POWER_RATE_TXPOWER_CTRL_T CmdTxPwrCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Band(%d), TxMode(%d), MCS(%d), BW(%d), TxPower(%d)\n", - __FUNCTION__, ucBandIdx, ucPhyMode, ucTxRate, ucBW, - cTxPower)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_RATE_TXPOWER_CTRL_T)); - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&CmdTxPwrCtrl, sizeof(CmdTxPwrCtrl)); - - CmdTxPwrCtrl.ucPowerCtrlFormatId = TX_RATE_POWER_CTRL; - CmdTxPwrCtrl.ucPhyMode = ucPhyMode; - CmdTxPwrCtrl.ucTxRate = ucTxRate; - CmdTxPwrCtrl.ucBW = ucBW; - CmdTxPwrCtrl.ucBandIdx = ucBandIdx; - CmdTxPwrCtrl.cTxPower = cTxPower; - - MtAndesAppendCmdMsg(msg, (char *)&CmdTxPwrCtrl, sizeof(CmdTxPwrCtrl)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} -#endif /* CONFIG_ATE */ -#endif /* COMPOS_WIN */ - -/***************************************** - * ExT_CID = 0x12 Thermal Cal - * - * ucEnable 0:Disable; 1:Enable - * ucSourceMode 0:EFuse; 1:Buffer mode. - * ucRFDiffTemp Indicate the temperature difference to trigger RF re-calibration. - * The default value in MT7603 is +/- 40. - * - * ucHiBBPHT Set the high temperature threshold to trigger HT BBP calibration. - * ucHiBBPNT Set the normal Temperature threshold to trigger NT BBP calibration. - * - * cLoBBPLT Set the low temperature threshold to trigger LT BBP calibration. - * It's might be a negative value. - * cLoBBPNT Set the normal temperature threshold to trigger NT BBP calibration. - * It's might be a negative value. - * For default setting please set ucRFDiffTemp/ ucHiBBPHT/ucHiBBPNT/cLoBBPLT/cLoBBPNT to 0xFF, - * Otherwise, FW will set calibration as these input parameters. - *****************************************/ -INT32 MtCmdThermoCal(RTMP_ADAPTER *pAd, UINT8 IsEnable, UINT8 SourceMode, - UINT8 RFDiffTemp, UINT8 HiBBPHT, UINT8 HiBBPNT, - INT8 LoBBPLT, INT8 LoBBPNT) -{ - INT32 ret = 0; - struct cmd_msg *msg; - struct _CMD_SET_THERMO_CAL_T Thermo; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&Thermo, sizeof(Thermo)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: IsEnable = %d, SourceMode = %d, RFDiffTemp = %d\n", - __func__, IsEnable, SourceMode, RFDiffTemp)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: sizeof(Thermo) = %lu\n", __func__, - (ULONG)sizeof(Thermo))); - msg = MtAndesAllocCmdMsg(pAd, sizeof(Thermo)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_THERMO_CAL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - Thermo.ucEnable = IsEnable; - Thermo.ucSourceMode = SourceMode; - Thermo.ucRFDiffTemp = RFDiffTemp; - Thermo.ucHiBBPHT = HiBBPHT; - Thermo.ucHiBBPNT = HiBBPNT; - Thermo.cLoBBPLT = LoBBPLT; - Thermo.cLoBBPNT = LoBBPNT; -#ifndef COMPOS_WIN /* windows ndis does not have EEPROMImage */ - Thermo.ucThermoSetting[0].u2Addr = 0x53; - Thermo.ucThermoSetting[0].ucValue = - pAd->EEPROMImage[Thermo.ucThermoSetting[0].u2Addr]; - Thermo.ucThermoSetting[1].u2Addr = 0x54; - Thermo.ucThermoSetting[1].ucValue = - pAd->EEPROMImage[Thermo.ucThermoSetting[1].u2Addr]; - Thermo.ucThermoSetting[2].u2Addr = 0x55; - Thermo.ucThermoSetting[2].ucValue = - pAd->EEPROMImage[Thermo.ucThermoSetting[2].u2Addr]; -#ifdef RT_BIG_ENDIAN - Thermo.ucThermoSetting[0].u2Addr = - cpu2le16(Thermo.ucThermoSetting[0].u2Addr); - Thermo.ucThermoSetting[1].u2Addr = - cpu2le16(Thermo.ucThermoSetting[1].u2Addr); - Thermo.ucThermoSetting[2].u2Addr = - cpu2le16(Thermo.ucThermoSetting[2].u2Addr); -#endif -#endif - MtAndesAppendCmdMsg(msg, (char *)&Thermo, sizeof(Thermo)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x13 - *****************************************/ -INT32 MtCmdFwLog2Host(RTMP_ADAPTER *pAd, UINT8 McuDest, UINT8 FWLog2HostCtrl) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - EXT_CMD_FW_LOG_2_HOST_CTRL_T CmdFwLog2HostCtrl; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (":%s: McuDest(%d):%s\n", __func__, McuDest, - McuDest == 0 ? "HOST2N9" : "HOST2CR4")); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdFwLog2HostCtrl)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - return Ret; - } - - SET_CMD_ATTR_MCU_DEST(attr, McuDest); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_FW_LOG_2_HOST); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdFwLog2HostCtrl, sizeof(CmdFwLog2HostCtrl)); - CmdFwLog2HostCtrl.ucFwLog2HostCtrl = FWLog2HostCtrl; - MtAndesAppendCmdMsg(msg, (char *)&CmdFwLog2HostCtrl, - sizeof(CmdFwLog2HostCtrl)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: %s (ret = %d)\n", __func__, McuDest == 0 ? "N9" : "CR4", - Ret)); - return Ret; -} - -/***************************************** - * ExT_CID = 0x15 - *****************************************/ -#ifdef CONFIG_MULTI_CHANNEL -INT MtCmdMccStart(struct _RTMP_ADAPTER *pAd, UINT32 Num, - MT_MCC_ENTRT_T *MccEntries, USHORT IdleTime, - USHORT NullRepeatCnt, ULONG StartTsf) -{ - struct cmd_msg *msg; - EXT_CMD_MCC_START_T mcc_start_msg; - int ret; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\x1b[31m @@@@@ %s:channel(%u,%u), bw(%u,%u), role(%u,%u)\n", - __func__, MccEntries[0].Channel, MccEntries[1].Channel, - MccEntries[0].Bw, MccEntries[1].Bw, MccEntries[0].Role, - MccEntries[1].Role)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("cycle_time(%u,%u), wait_time(%u), null_cnt(%u), start_tsf(%ld)\x1b[m\n", - MccEntries[0].StayTime, MccEntries[1].StayTime, IdleTime, - NullRepeatCnt, StartTsf)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_MCC_START_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MCC_OFFLOAD_START); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&mcc_start_msg, sizeof(EXT_CMD_MCC_START_T)); - mcc_start_msg.u2IdleInterval = cpu2le16(IdleTime); /* ms */ - mcc_start_msg.ucRepeatCnt = (UINT8)NullRepeatCnt; - mcc_start_msg.ucStartIdx = 0; - mcc_start_msg.u4StartInstant = cpu2le32(StartTsf); - mcc_start_msg.u2FreePSEPageTh = - 0x11; /* 0: Disable PSE threshold check */ -#ifdef RT_BIG_ENDIAN - mcc_start_msg.u2FreePSEPageTh = cpu2le16(mcc_start_msg.u2FreePSEPageTh); -#endif - mcc_start_msg.ucPreSwitchInterval = 0; /* for SDIO */ - mcc_start_msg.ucWlanIdx0 = MccEntries[0].WlanIdx; - mcc_start_msg.ucPrimaryChannel0 = MccEntries[0].Channel; - mcc_start_msg.ucCenterChannel0Seg0 = MccEntries[0].CentralSeg0; - mcc_start_msg.ucCenterChannel0Seg1 = MccEntries[0].CentralSeg1; - mcc_start_msg.ucBandwidth0 = MccEntries[0].Bw; - mcc_start_msg.ucTrxStream0 = 0; /* 2T2R */ - mcc_start_msg.u2StayInterval0 = cpu2le16(MccEntries[0].StayTime); - mcc_start_msg.ucRole0 = MccEntries[0].Role; - mcc_start_msg.ucOmIdx0 = MccEntries[0].OwnMACAddressIdx; - mcc_start_msg.ucBssIdx0 = MccEntries[0].BssIdx; - mcc_start_msg.ucWmmIdx0 = MccEntries[0].WmmIdx; - mcc_start_msg.ucWlanIdx1 = MccEntries[1].WlanIdx; - mcc_start_msg.ucPrimaryChannel1 = MccEntries[1].Channel; - mcc_start_msg.ucCenterChannel1Seg0 = MccEntries[1].CentralSeg0; - mcc_start_msg.ucCenterChannel1Seg1 = MccEntries[1].CentralSeg1; - mcc_start_msg.ucBandwidth1 = MccEntries[1].Bw; - mcc_start_msg.ucTrxStream1 = 0; /* 2T2R */ - mcc_start_msg.u2StayInterval1 = cpu2le16(MccEntries[1].StayTime); - mcc_start_msg.ucRole1 = MccEntries[1].Role; - mcc_start_msg.ucOmIdx1 = MccEntries[1].OwnMACAddressIdx; - mcc_start_msg.ucBssIdx1 = MccEntries[1].BssIdx; - mcc_start_msg.ucWmmIdx1 = MccEntries[1].WmmIdx; - MtAndesAppendCmdMsg(msg, (char *)&mcc_start_msg, - sizeof(EXT_CMD_MCC_START_T)); - ret = chip_cmd_tx(pAd, msg); -error: - return ret; -} -#endif /*CONFIG_MULTI_CHANNEL*/ - -/***************************************** - * ExT_CID = 0x16 - *****************************************/ -#ifdef CONFIG_MULTI_CHANNEL -INT32 MtCmdMccStop(struct _RTMP_ADAPTER *pAd, UCHAR ParkingIndex, - UCHAR AutoResumeMode, UINT16 AutoResumeInterval, - ULONG AutoResumeTsf) -{ - struct cmd_msg *msg; - EXT_CMD_MCC_STOP_T mcc_stop_msg; - int ret; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[32m @@@@@ %s:parking_channel_idx(%u)\n", __func__, - ParkingIndex)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("auto_resume_mode(%u), auto_resume_tsf(0x%08x) \x1b[m\n", - AutoResumeMode, AutoResumeTsf)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_MCC_STOP_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LED); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&mcc_stop_msg, sizeof(EXT_CMD_MCC_STOP_T)); - mcc_stop_msg.ucParkIdx = ParkingIndex; - mcc_stop_msg.ucAutoResumeMode = AutoResumeMode; - mcc_stop_msg.u2AutoResumeInterval = cpu2le16(AutoResumeInterval); - mcc_stop_msg.u4AutoResumeInstant = cpu2le32(AutoResumeTsf); - mcc_stop_msg.u2IdleInterval = 0; /* no resume */ - mcc_stop_msg.u2StayInterval0 = 0; /* no resume */ - mcc_stop_msg.u2StayInterval1 = 0; /* no resume */ -#ifdef RT_BIG_ENDIAN - mcc_stop_msg.u2IdleInterval = cpu2le16(mcc_stop_msg.u2IdleInterval); - mcc_stop_msg.u2StayInterval0 = cpu2le16(mcc_stop_msg.u2StayInterval0); - mcc_stop_msg.u2StayInterval1 = cpu2le16(mcc_stop_msg.u2StayInterval1); -#endif - MtAndesAppendCmdMsg(msg, (char *)&mcc_stop_msg, - sizeof(EXT_CMD_MCC_STOP_T)); - ret = chip_cmd_tx(pAd, msg); -error: - return ret; -} -#endif /* CONFIG_MULTI_CHANNEL */ - -/***************************************** - * ExT_CID = 0x17 - *****************************************/ -INT32 MtCmdLEDCtrl(RTMP_ADAPTER *pAd, UINT32 LEDNumber, UINT32 LEDBehavior) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_ID_LED_T ExtLedCMD; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_ID_LED_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - return ret; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LED); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&ExtLedCMD, sizeof(EXT_CMD_ID_LED_T)); - /* Filled RF Reg Access CMD setting */ - ExtLedCMD.u4LedNo = cpu2le32(LEDNumber); - ExtLedCMD.u4LedCtrl = cpu2le32(LEDBehavior); - MtAndesAppendCmdMsg(msg, (char *)&ExtLedCMD, sizeof(EXT_CMD_ID_LED_T)); - ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: --> LEDNumber: %x, LEDBehavior: %d\n", __func__, - LEDNumber, LEDBehavior)); - return ret; -} - -/***************************************** - * ExT_CID = 0x1e - *****************************************/ - -#if defined(MT_MAC) && (!defined(MT7636)) && defined(TXBF_SUPPORT) -INT32 CmdETxBfAidSetting(RTMP_ADAPTER *pAd, UINT_16 Aid) -{ - struct cmd_msg *msg; - UINT8 Input[4]; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Aid = %d\n", __func__, Aid)); - msg = MtAndesAllocCmdMsg(pAd, 4); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Input[0] = BF_AID_SET; - Input[1] = 0; -#ifdef RT_BIG_ENDIAN - Aid = cpu2le16(Aid); -#endif - os_move_mem(&Input[2], &Aid, 2); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&Input[0], 4); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxBfApClientCluster(RTMP_ADAPTER *pAd, UINT_8 ucWlanIdx, - UINT_8 ucCmmWlanId) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_TXBf_APCLIENT_CLUSTER_T rBfApClientCluster; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucWlanIdx = %d, ucPfmuIdx = %d\n", __func__, ucWlanIdx, - ucCmmWlanId)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_TXBf_APCLIENT_CLUSTER_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - rBfApClientCluster.ucPfmuProfileFormatId = BF_APCLIENT_CLUSTER; - rBfApClientCluster.ucWlanIdx = ucWlanIdx; - rBfApClientCluster.ucCmmWlanId = ucCmmWlanId; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rBfApClientCluster, - sizeof(EXT_CMD_TXBf_APCLIENT_CLUSTER_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxBfReptClonedStaToNormalSta(RTMP_ADAPTER *pAd, UINT_8 ucWlanIdx, - UINT_8 ucCliIdx) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_REPT_CLONED_STA_BF_T rBfReptClonedStaToNormalSta; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucWlanIdx = %d, ucCliIdx = %d\n", __func__, ucWlanIdx, - ucCliIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_REPT_CLONED_STA_BF_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - rBfReptClonedStaToNormalSta.ucCmdCategoryID = - BF_REPT_CLONED_STA_TO_NORMAL_STA; - rBfReptClonedStaToNormalSta.ucWlanIdx = ucWlanIdx; - rBfReptClonedStaToNormalSta.ucCliIdx = ucCliIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rBfReptClonedStaToNormalSta, - sizeof(EXT_CMD_REPT_CLONED_STA_BF_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdITxBfPhaseCal(RTMP_ADAPTER *pAd, UCHAR ucGroup, UCHAR ucGroup_L_M_H, - BOOLEAN fgSX2, UCHAR ucPhaseCalType, - UCHAR ucPhaseVerifyLnaGainLevel) -{ - struct cmd_msg *msg; - EXT_CMD_ITXBf_PHASE_CAL_CTRL_T aucIBfPhaseCal; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::: Enable iBF phase calibration : ucGroup = %d, ucGroup_L_M_H = %d, fgSX2 = %d\n", - __func__, ucGroup, ucGroup_L_M_H, fgSX2)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_ITXBf_PHASE_CAL_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&aucIBfPhaseCal, sizeof(EXT_CMD_ITXBf_PHASE_CAL_CTRL_T)); - aucIBfPhaseCal.ucCmdCategoryID = BF_PHASE_CALIBRATION; - aucIBfPhaseCal.ucGroup = ucGroup; - aucIBfPhaseCal.ucGroup_L_M_H = ucGroup_L_M_H; - aucIBfPhaseCal.fgSX2 = fgSX2; - aucIBfPhaseCal.ucPhaseCalType = ucPhaseCalType; - aucIBfPhaseCal.ucPhaseVerifyLnaGainLevel = ucPhaseVerifyLnaGainLevel; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&aucIBfPhaseCal, - sizeof(EXT_CMD_ITXBf_PHASE_CAL_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxBfLnaGain(RTMP_ADAPTER *pAd, UCHAR ucLnaGain) -{ - struct cmd_msg *msg; - INT32 ret = 0; - UCHAR aucCmdBuf[4]; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::: LNA gain setting for iBF phase calibration : %d\n", - __func__, ucLnaGain)); - msg = MtAndesAllocCmdMsg(pAd, 4); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - aucCmdBuf[0] = BF_LNA_GAIN_CONFIG; - aucCmdBuf[1] = ucLnaGain; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)aucCmdBuf, 4); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdITxBfPhaseComp(RTMP_ADAPTER *pAd, UCHAR ucBW, UCHAR ucBand, - UCHAR ucDbdcBandIdx, UCHAR ucGroup, BOOLEAN fgRdFromE2p, - BOOLEAN fgDisComp) -{ - struct cmd_msg *msg; - EXT_CMD_ITXBf_PHASE_COMP_CTRL_T aucIBfPhaseComp; - INT32 ret = 0; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s::: Enable iBF phase compensation : fgRdFromE2p = %d, ucBW = %d, ucDbdcBandIdx = %d\n", - __func__, fgRdFromE2p, ucBW, ucDbdcBandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_ITXBf_PHASE_COMP_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&aucIBfPhaseComp, sizeof(EXT_CMD_ITXBf_PHASE_COMP_CTRL_T)); - aucIBfPhaseComp.ucCmdCategoryID = BF_IBF_PHASE_COMP; - aucIBfPhaseComp.ucBW = ucBW; - aucIBfPhaseComp.ucBand = ucBand; - aucIBfPhaseComp.ucDbdcBandIdx = ucDbdcBandIdx; - aucIBfPhaseComp.fgRdFromE2p = fgRdFromE2p; - aucIBfPhaseComp.fgDisComp = fgDisComp; - - if (ops->iBFPhaseComp) - ops->iBFPhaseComp(pAd, ucGroup, aucIBfPhaseComp.aucBuf); - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 1000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&aucIBfPhaseComp, - sizeof(EXT_CMD_ITXBf_PHASE_COMP_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxBfTxApplyCtrl(RTMP_ADAPTER *pAd, UCHAR ucWlanId, BOOLEAN fgETxBf, - BOOLEAN fgITxBf, BOOLEAN fgMuTxBf, BOOLEAN fgPhaseCali) -{ - struct cmd_msg *msg; - struct _EXT_CMD_TXBf_TX_APPLY_CTRL_T aucTxBfTxApplyCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: TxBf Tx Apply ucWLanId = %d, fgETxBf = %d, fgITxBf = %d, fgMuTxBf = %d\n", - __func__, ucWlanId, fgETxBf, fgITxBf, fgMuTxBf)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_TXBf_TX_APPLY_CTRL_T)); - os_zero_mem(&aucTxBfTxApplyCtrl, sizeof(EXT_CMD_TXBf_TX_APPLY_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - aucTxBfTxApplyCtrl.ucCmdCategoryID = BF_DATA_PACKET_APPLY; - aucTxBfTxApplyCtrl.ucWlanIdx = ucWlanId; - aucTxBfTxApplyCtrl.fgETxBf = fgETxBf; - aucTxBfTxApplyCtrl.fgITxBf = fgITxBf; - aucTxBfTxApplyCtrl.fgMuTxBf = fgMuTxBf; - aucTxBfTxApplyCtrl.fgPhaseCali = fgPhaseCali; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&aucTxBfTxApplyCtrl, - sizeof(EXT_CMD_TXBf_TX_APPLY_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfSoundingPeriodicTriggerCtrl(RTMP_ADAPTER *pAd, UCHAR SndgEn, - UINT32 u4SNDPeriod, UCHAR ucSu_Mu, - UCHAR ucMuNum, PUCHAR pwlanidx) -{ - struct cmd_msg *msg; - struct _EXT_CMD_ETXBf_SND_PERIODIC_TRIGGER_CTRL_T - ETxBfSndPeriodicTriggerCtrl; - struct _EXT_CMD_ETXBf_MU_SND_PERIODIC_TRIGGER_CTRL_T - ETxBfMuSndPeriodicTriggerCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Sounding trigger enable = %d\n", __func__, SndgEn)); - - switch (ucSu_Mu) { - case MU_SOUNDING: - case MU_PERIODIC_SOUNDING: - case BF_PROCESSING: - msg = MtAndesAllocCmdMsg(pAd, - sizeof(ETxBfMuSndPeriodicTriggerCtrl)); - os_zero_mem(&ETxBfMuSndPeriodicTriggerCtrl, - sizeof(ETxBfMuSndPeriodicTriggerCtrl)); - break; - - case SU_SOUNDING: - case SU_PERIODIC_SOUNDING: - msg = MtAndesAllocCmdMsg(pAd, - sizeof(ETxBfSndPeriodicTriggerCtrl)); - os_zero_mem(&ETxBfSndPeriodicTriggerCtrl, - sizeof(ETxBfSndPeriodicTriggerCtrl)); - break; - - default: - ret = NDIS_STATUS_INVALID_DATA; - goto error; - } - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - if (SndgEn) { - switch (ucSu_Mu) { - case MU_SOUNDING: - case MU_PERIODIC_SOUNDING: - ETxBfMuSndPeriodicTriggerCtrl.ucCmdCategoryID = - BF_SOUNDING_ON; - ETxBfMuSndPeriodicTriggerCtrl.ucSuMuSndMode = ucSu_Mu; - ETxBfMuSndPeriodicTriggerCtrl.u4SoundingInterval = - cpu2le32(u4SNDPeriod); - ETxBfMuSndPeriodicTriggerCtrl.ucWlanIdx[0] = - pwlanidx[0]; - ETxBfMuSndPeriodicTriggerCtrl.ucWlanIdx[1] = - pwlanidx[1]; - ETxBfMuSndPeriodicTriggerCtrl.ucWlanIdx[2] = - pwlanidx[2]; - ETxBfMuSndPeriodicTriggerCtrl.ucWlanIdx[3] = - pwlanidx[3]; - ETxBfMuSndPeriodicTriggerCtrl.ucStaNum = ucMuNum; - break; - - case SU_SOUNDING: - case SU_PERIODIC_SOUNDING: - ETxBfSndPeriodicTriggerCtrl.ucCmdCategoryID = - BF_SOUNDING_ON; - ETxBfSndPeriodicTriggerCtrl.ucSuMuSndMode = ucSu_Mu; - ETxBfSndPeriodicTriggerCtrl.u4SoundingInterval = - cpu2le32(u4SNDPeriod); - ETxBfSndPeriodicTriggerCtrl.ucWlanIdx[0] = pwlanidx[0]; - ETxBfSndPeriodicTriggerCtrl.ucWlanIdx[1] = pwlanidx[1]; - ETxBfSndPeriodicTriggerCtrl.ucWlanIdx[2] = pwlanidx[2]; - ETxBfSndPeriodicTriggerCtrl.ucWlanIdx[3] = pwlanidx[3]; - ETxBfSndPeriodicTriggerCtrl.ucStaNum = ucMuNum; - break; - - case BF_PROCESSING: - ETxBfSndPeriodicTriggerCtrl.ucCmdCategoryID = - BF_SOUNDING_ON; - ETxBfSndPeriodicTriggerCtrl.ucSuMuSndMode = ucSu_Mu; - break; - } - } else { - ETxBfMuSndPeriodicTriggerCtrl.ucCmdCategoryID = BF_SOUNDING_OFF; - ETxBfSndPeriodicTriggerCtrl.ucCmdCategoryID = BF_SOUNDING_OFF; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - - switch (ucSu_Mu) { - case MU_SOUNDING: - case MU_PERIODIC_SOUNDING: - MtAndesAppendCmdMsg(msg, (char *)&ETxBfMuSndPeriodicTriggerCtrl, - sizeof(ETxBfMuSndPeriodicTriggerCtrl)); - break; - - case SU_SOUNDING: - case SU_PERIODIC_SOUNDING: - case BF_PROCESSING: - MtAndesAppendCmdMsg(msg, (char *)&ETxBfSndPeriodicTriggerCtrl, - sizeof(ETxBfSndPeriodicTriggerCtrl)); - break; - } - - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdPfmuMemAlloc(RTMP_ADAPTER *pAd, UCHAR ucSu_Mu, UCHAR ucWlanId) -{ - struct cmd_msg *msg; - UCHAR aucCmdBuf[4]; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ucWlanId = %d\n", __func__, ucWlanId)); - msg = MtAndesAllocCmdMsg(pAd, 4); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - aucCmdBuf[0] = BF_PFMU_MEM_ALLOCATE; - aucCmdBuf[1] = ucSu_Mu; - aucCmdBuf[2] = ucWlanId; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&aucCmdBuf[0], 4); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdPfmuMemRelease(RTMP_ADAPTER *pAd, UCHAR ucPfmuIdx) -{ - struct cmd_msg *msg; - UCHAR aucCmdBuf[4]; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU ID = %d\n", __func__, ucPfmuIdx)); - msg = MtAndesAllocCmdMsg(pAd, 2); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - aucCmdBuf[0] = BF_PFMU_MEM_RELEASE; - aucCmdBuf[1] = ucPfmuIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&aucCmdBuf[0], 4); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdPfmuMemAllocMapRead(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - UCHAR aucCmdBuf[4]; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, 1); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - aucCmdBuf[0] = BF_PFMU_MEM_ALLOC_MAP_READ; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&aucCmdBuf[0], 4); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfPfmuProfileTagRead(RTMP_ADAPTER *pAd, UCHAR PfmuIdx, - BOOLEAN fgBFer) -{ - struct cmd_msg *msg; - EXT_CMD_ETXBf_PFMU_PROFILE_TAG_R_T ETxBfPfmuProfileTag; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU ID = %d\n", __func__, PfmuIdx)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_TAG_R_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ETxBfPfmuProfileTag, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_TAG_R_T)); - ETxBfPfmuProfileTag.ucPfmuProfileFormatId = BF_PFMU_TAG_READ; - ETxBfPfmuProfileTag.ucPfmuIdx = PfmuIdx; - ETxBfPfmuProfileTag.fgBFer = fgBFer; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ETxBfPfmuProfileTag, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_TAG_R_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfPfmuProfileTagWrite(RTMP_ADAPTER *pAd, PUCHAR prPfmuTag1, - PUCHAR prPfmuTag2, UCHAR PfmuIdx) -{ - struct cmd_msg *msg; - EXT_CMD_ETXBf_PFMU_PROFILE_TAG_W_T ETxBfPfmuProfileTag; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU ID = %d\n", __func__, PfmuIdx)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_TAG_W_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ETxBfPfmuProfileTag, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_TAG_W_T)); - ETxBfPfmuProfileTag.ucPfmuProfileFormatId = BF_PFMU_TAG_WRITE; - ETxBfPfmuProfileTag.ucPfmuIdx = PfmuIdx; - os_move_mem(ETxBfPfmuProfileTag.ucBuf, prPfmuTag1, - sizeof(PFMU_PROFILE_TAG1)); - os_move_mem(ETxBfPfmuProfileTag.ucBuf + sizeof(PFMU_PROFILE_TAG1), - prPfmuTag2, sizeof(PFMU_PROFILE_TAG2)); -#ifdef RT_BIG_ENDIAN - RTMPEndianChange(ETxBfPfmuProfileTag.ucBuf, - sizeof(PFMU_PROFILE_TAG1) + sizeof(PFMU_PROFILE_TAG2)); -#endif - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ETxBfPfmuProfileTag, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_TAG_W_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfPfmuProfileDataRead(RTMP_ADAPTER *pAd, UCHAR PfmuIdx, - BOOLEAN fgBFer, USHORT subCarrIdx) -{ - struct cmd_msg *msg; - EXT_CMD_ETXBf_PFMU_PROFILE_DATA_R_T ETxBfPfmuProfileData; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU ID = %d\n", __func__, PfmuIdx)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_R_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_R_T)); - ETxBfPfmuProfileData.ucPfmuProfileFormatId = BF_PROFILE_READ; - ETxBfPfmuProfileData.ucPfmuIdx = PfmuIdx; - ETxBfPfmuProfileData.fgBFer = fgBFer; - ETxBfPfmuProfileData.u2SubCarrIdx = cpu2le16(subCarrIdx); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 500); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_R_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfPfmuProfileDataWrite(RTMP_ADAPTER *pAd, UCHAR PfmuIdx, - USHORT SubCarrIdx, PUCHAR pProfileData) -{ - struct cmd_msg *msg; - EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_T ETxBfPfmuProfileData; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU ID = %d\n", __func__, PfmuIdx)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_T)); - ETxBfPfmuProfileData.ucPfmuProfileFormatId = BF_PROFILE_WRITE; - ETxBfPfmuProfileData.ucPfmuIdx = PfmuIdx; - ETxBfPfmuProfileData.u2SubCarr = cpu2le16(SubCarrIdx); - os_move_mem(ETxBfPfmuProfileData.ucBuf, pProfileData, - sizeof(ETxBfPfmuProfileData) - 4); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Buf[0~3]= %x:%x:%x:%x\n", ETxBfPfmuProfileData.ucBuf[0], - ETxBfPfmuProfileData.ucBuf[1], ETxBfPfmuProfileData.ucBuf[2], - ETxBfPfmuProfileData.ucBuf[3])); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Buf[4~7]= %x:%x:%x:%x\n", ETxBfPfmuProfileData.ucBuf[4], - ETxBfPfmuProfileData.ucBuf[5], ETxBfPfmuProfileData.ucBuf[6], - ETxBfPfmuProfileData.ucBuf[7])); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Buf[8~11]= %x:%x:%x:%x\n", ETxBfPfmuProfileData.ucBuf[8], - ETxBfPfmuProfileData.ucBuf[9], ETxBfPfmuProfileData.ucBuf[10], - ETxBfPfmuProfileData.ucBuf[11])); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Buf[12~15]= %x:%x:%x:%x\n", ETxBfPfmuProfileData.ucBuf[12], - ETxBfPfmuProfileData.ucBuf[13], - ETxBfPfmuProfileData.ucBuf[14], - ETxBfPfmuProfileData.ucBuf[15])); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfPfmuProfileDataWrite20MAll(RTMP_ADAPTER *pAd, UCHAR PfmuIdx, - PUCHAR pProfileData) -{ - struct cmd_msg *msg; - P_EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_20M_ALL_T pETxBfPfmuProfileData = - NULL; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* UINT_16 u2Loop, u2Temp; */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU ID = %d\n", __func__, PfmuIdx)); - - os_alloc_mem(pAd, (UCHAR **)&pETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_20M_ALL_T)); - if (!pETxBfPfmuProfileData) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg( - pAd, sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_20M_ALL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(pETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_20M_ALL_T)); - pETxBfPfmuProfileData->ucPfmuProfileFormatId = BF_PROFILE_WRITE_20M_ALL; - pETxBfPfmuProfileData->ucPfmuIdx = PfmuIdx; - os_move_mem(pETxBfPfmuProfileData->ucBuf, pProfileData, 512); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg( - msg, (char *)pETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_DATA_W_20M_ALL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - if (pETxBfPfmuProfileData) - os_free_mem(pETxBfPfmuProfileData); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfPfmuProfilePnRead(RTMP_ADAPTER *pAd, UCHAR PfmuIdx) -{ - struct cmd_msg *msg; - EXT_CMD_ETXBf_PFMU_PROFILE_PN_R_T ETxBfPfmuProfilePn; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU ID = %d\n", __func__, PfmuIdx)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_PN_R_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ETxBfPfmuProfilePn, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_PN_R_T)); - ETxBfPfmuProfilePn.ucPfmuProfileFormatId = BF_PN_READ; - ETxBfPfmuProfilePn.ucPfmuIdx = PfmuIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 500); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ETxBfPfmuProfilePn, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_PN_R_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfPfmuProfilePnWrite(RTMP_ADAPTER *pAd, UCHAR PfmuIdx, UCHAR ucBw, - PUCHAR pProfileData) -{ - struct cmd_msg *msg; - EXT_CMD_ETXBf_PFMU_PROFILE_PN_W_T ETxBfPfmuProfileData; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: PFMU ID = %d\n", __func__, PfmuIdx)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_PN_W_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_PN_W_T)); - ETxBfPfmuProfileData.ucPfmuProfileFormatId = BF_PN_WRITE; - ETxBfPfmuProfileData.ucPfmuIdx = PfmuIdx; - ETxBfPfmuProfileData.ucBW = ucBw; - - switch (ucBw) { - case P_DBW20M: -#ifdef RT_BIG_ENDIAN - RTMPEndianChange(pProfileData, sizeof(PFMU_PN_DBW20M)); -#endif - os_move_mem(ETxBfPfmuProfileData.ucBuf, pProfileData, - sizeof(PFMU_PN_DBW20M)); - break; - - case P_DBW40M: -#ifdef RT_BIG_ENDIAN - RTMPEndianChange(pProfileData, sizeof(PFMU_PN_DBW40M)); -#endif - os_move_mem(ETxBfPfmuProfileData.ucBuf, pProfileData, - sizeof(PFMU_PN_DBW40M)); - break; - - case P_DBW80M: -#ifdef RT_BIG_ENDIAN - RTMPEndianChange(pProfileData, sizeof(PFMU_PN_DBW80M)); -#endif - os_move_mem(ETxBfPfmuProfileData.ucBuf, pProfileData, - sizeof(PFMU_PN_DBW80M)); - break; - - case P_DBW160M: -#ifdef RT_BIG_ENDIAN - RTMPEndianChange(pProfileData, sizeof(PFMU_PN_DBW80_80M)); -#endif - os_move_mem(ETxBfPfmuProfileData.ucBuf, pProfileData, - sizeof(PFMU_PN_DBW80_80M)); - break; - - default: - return 1; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ETxBfPfmuProfileData, - sizeof(EXT_CMD_ETXBf_PFMU_PROFILE_PN_W_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfQdRead(RTMP_ADAPTER *pAd, INT8 subCarrIdx) -{ - struct cmd_msg *msg; - EXT_CMD_TXBf_QD_R_T ETxBfQdData; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: subCarrIdx = %d\n", __func__, subCarrIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_TXBf_QD_R_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ETxBfQdData, sizeof(EXT_CMD_TXBf_QD_R_T)); - ETxBfQdData.ucCmdCategoryID = BF_GET_QD; - ETxBfQdData.cSubCarr = subCarrIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 500); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ETxBfQdData, - sizeof(EXT_CMD_TXBf_QD_R_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdETxBfStaRecRead(RTMP_ADAPTER *pAd, UCHAR ucWlanID) -{ - struct cmd_msg *msg; - INT32 ret = 0; - CHAR ucCmd[8]; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: WLAN ID = %d\n", __func__, ucWlanID)); - msg = MtAndesAllocCmdMsg(pAd, 8); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - ucCmd[0] = BF_STA_REC_READ; - ucCmd[1] = ucWlanID; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, &ucCmd[0], 8); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxBfTxPwrBackOff(RTMP_ADAPTER *pAd, UCHAR ucBandIdx, - PCHAR pacTxPwrFccBfOnCase, PCHAR pacTxPwrFccBfOffCase) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_BF_TX_PWR_BACK_OFF_T rTxPwrBackOff; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucBandIdx = %d\n", __FUNCTION__, ucBandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_BF_TX_PWR_BACK_OFF_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - rTxPwrBackOff.ucCmdCategoryID = BF_TX_POWER_BACK_OFF; - rTxPwrBackOff.ucBandIdx = ucBandIdx; - os_move_mem(rTxPwrBackOff.acTxPwrFccBfOnCase, pacTxPwrFccBfOnCase, 10); - os_move_mem(rTxPwrBackOff.acTxPwrFccBfOffCase, pacTxPwrFccBfOffCase, - 10); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rTxPwrBackOff, - sizeof(EXT_CMD_BF_TX_PWR_BACK_OFF_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -INT32 CmdTxBfAwareCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgBfAwareCtrl) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_BF_AWARE_CTRL_T rTxBfAwareCtrl; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgBfAwareCtrl = %d\n", __func__, fgBfAwareCtrl)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_BF_AWARE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - rTxBfAwareCtrl.ucCmdCategoryID = BF_AWARE_CTRL; - rTxBfAwareCtrl.fgBfAwareCtrl = fgBfAwareCtrl; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rTxBfAwareCtrl, - sizeof(EXT_CMD_BF_AWARE_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxBfHwEnableStatusUpdate(RTMP_ADAPTER *pAd, BOOLEAN fgEBf, - BOOLEAN fgIBf) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_BF_HW_ENABLE_STATUS_UPDATE_T rTxBfHwEnStatusUpdate; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgEBfHwEnable = %d, fgIBfHwEnable = %d\n", __func__, - fgEBf, fgIBf)); - msg = MtAndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_BF_HW_ENABLE_STATUS_UPDATE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - rTxBfHwEnStatusUpdate.ucCmdCategoryID = BF_HW_ENABLE_STATUS_UPDATE; - rTxBfHwEnStatusUpdate.fgEBfHwEnStatus = fgEBf; - rTxBfHwEnStatusUpdate.fgIBfHwEnStatus = fgIBf; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rTxBfHwEnStatusUpdate, - sizeof(EXT_CMD_BF_HW_ENABLE_STATUS_UPDATE_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxBfModuleEnCtrl(struct _RTMP_ADAPTER *pAd, UINT8 u1BfNum, - UINT8 u1BfBitmap, UINT8 u1BfSelBand[]) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_BF_MOD_EN_CTRL_T rTxBfModEnCtrl; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: u1BfNum = %d, u1BfBitmap = %d, u1BfSelBand[0] = %d, u1BfSelBand[1] = %d\n", - __func__, u1BfNum, u1BfBitmap, u1BfSelBand[0], - u1BfSelBand[1])); - - msg = MtAndesAllocCmdMsg(pAd, - sizeof(EXT_CMD_BF_HW_ENABLE_STATUS_UPDATE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - rTxBfModEnCtrl.u1CmdCategoryID = BF_MOD_EN_CTRL; - rTxBfModEnCtrl.u1BfNum = u1BfNum; - rTxBfModEnCtrl.u1BfBitmap = u1BfBitmap; - os_move_mem(rTxBfModEnCtrl.au1BFSel, u1BfSelBand, 8); - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rTxBfModEnCtrl, - sizeof(EXT_CMD_BF_MOD_EN_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 CmdTxBfeeHwCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgBfeeHwEn) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_BFEE_HW_CTRL_T rTxBfeeHwCtrl; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: fgTxBfeeHwEnable = %d\n", __FUNCTION__, fgBfeeHwEn)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_BFEE_HW_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - rTxBfeeHwCtrl.ucCmdCategoryID = BF_BFEE_HW_CTRL; - rTxBfeeHwCtrl.fgBfeeHwCtrl = fgBfeeHwEn; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BF_ACTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rTxBfeeHwCtrl, - sizeof(EXT_CMD_BFEE_HW_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -#endif /* MT_MAC && TXBF_SUPPORT */ - -/***************************************** - * ExT_CID = 0x21 - *****************************************/ -static VOID CmdEfuseBufferModeRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); -} - -VOID MtCmdEfusBufferModeSet(RTMP_ADAPTER *pAd, UINT8 EepromType) -{ - struct cmd_msg *msg = NULL; - EXT_CMD_EFUSE_BUFFER_MODE_T *CmdEfuseBufferMode = NULL; - UINT32 cmd_size; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - cmd_size = sizeof(EXT_CMD_EFUSE_BUFFER_MODE_T); - cmd_size += sizeof(((EXT_CMD_EFUSE_BUFFER_MODE_T *)0)->BinContent[0]) * - cap->EFUSE_BUFFER_CONTENT_SIZE; - os_alloc_mem(pAd, (UCHAR **)&CmdEfuseBufferMode, cmd_size); - - if (!CmdEfuseBufferMode) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, cmd_size); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_EFUSE_BUFFER_MODE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 60000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdEfuseBufferModeRsp); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(CmdEfuseBufferMode, cmd_size); - - switch (EepromType) { - case EEPROM_EFUSE: - CmdEfuseBufferMode->ucSourceMode = EEPROM_MODE_EFUSE; - CmdEfuseBufferMode->ucCount = 0; - break; - - case EEPROM_FLASH: - CmdEfuseBufferMode->ucSourceMode = EEPROM_MODE_BUFFER; - - if (ops->bufferModeEfuseFill) - ops->bufferModeEfuseFill(pAd, CmdEfuseBufferMode); - else { - /*force to efuse mode*/ - CmdEfuseBufferMode->ucSourceMode = EEPROM_MODE_EFUSE; - CmdEfuseBufferMode->ucCount = 0; - } - - break; - - default: - ret = NDIS_STATUS_FAILURE; - goto error; - } -#ifdef RT_BIG_ENDIAN - CmdEfuseBufferMode->ucCount = cpu2le16(CmdEfuseBufferMode->ucCount); -#endif - MtAndesAppendCmdMsg(msg, (char *)CmdEfuseBufferMode, cmd_size); - ret = chip_cmd_tx(pAd, msg); - goto done; -error: - - if (msg) - MtAndesFreeCmdMsg(msg); - -done: - - if (CmdEfuseBufferMode) - os_free_mem(CmdEfuseBufferMode); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); -} - -/***************************************** - * ExT_CID = 0x27 - *****************************************/ -INT32 MtCmdEdcaParameterSet(RTMP_ADAPTER *pAd, MT_EDCA_CTRL_T EdcaParam) -{ - struct cmd_msg *msg; -#ifdef RT_BIG_ENDIAN - P_TX_AC_PARAM_T pAcParam; - INT32 i = 0; -#endif - INT32 ret = 0, size = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - size = 4 + sizeof(TX_AC_PARAM_T) * EdcaParam.ucTotalNum; -#ifdef RT_BIG_ENDIAN - - for (i = 0; i < EdcaParam.ucTotalNum; i++) { - pAcParam = &EdcaParam.rAcParam[i]; - pAcParam->u2Txop = cpu2le16(pAcParam->u2Txop); - pAcParam->u2WinMax = cpu2le16(pAcParam->u2WinMax); - } - -#endif - msg = MtAndesAllocCmdMsg(pAd, size); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EDCA_SET); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - - if (size <= sizeof(MT_EDCA_CTRL_T)) - MtAndesAppendCmdMsg(msg, (char *)&EdcaParam, size); - - ret = chip_cmd_tx(pAd, msg); - return ret; -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x28 - *****************************************/ -INT32 MtCmdSlotTimeSet(RTMP_ADAPTER *pAd, UINT8 SlotTime, UINT8 SifsTime, - UINT8 RifsTime, UINT16 EifsTime, UCHAR BandIdx) -{ - struct cmd_msg *msg; - INT32 ret = 0; - CMD_SLOT_TIME_SET_T cmdSlotTime; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&cmdSlotTime, sizeof(CMD_SLOT_TIME_SET_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SLOT_TIME_SET_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SLOT_TIME_SET); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - cmdSlotTime.u2Eifs = cpu2le16(EifsTime); - cmdSlotTime.ucRifs = RifsTime; - cmdSlotTime.ucSifs = SifsTime; - cmdSlotTime.ucSlotTime = SlotTime; - cmdSlotTime.ucBandNum = (UINT8)BandIdx; - MtAndesAppendCmdMsg(msg, (char *)&cmdSlotTime, - sizeof(CMD_SLOT_TIME_SET_T)); - ret = chip_cmd_tx(pAd, msg); - return ret; -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x23 - *****************************************/ - -#ifdef THERMAL_PROTECT_SUPPORT -INT32 MtCmdThermalProtect(RTMP_ADAPTER *pAd, UINT8 HighEn, CHAR HighTempTh, - UINT8 LowEn, CHAR LowTempTh, UINT32 RechkTimer, - UINT8 RFOffEn, CHAR RFOffTh, UINT8 ucType) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_THERMAL_PROTECT_T ThermalProtect; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: HighEn: %d, HighTempTh: %d, LowEn: %d, LowTempTh: %d, RechkTimer: %d\n", - __FUNCTION__, HighEn, HighTempTh, LowEn, LowTempTh, - RechkTimer)); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RFOffEn: %d, RFOffTh: %d, ucType: %d\n", __FUNCTION__, - RFOffEn, RFOffTh, ucType)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_THERMAL_PROTECT_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_THERMAL_PROTECT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - - /* Init firmware command content */ - os_zero_mem(&ThermalProtect, sizeof(ThermalProtect)); - - /* config command content */ - ThermalProtect.ucHighEnable = HighEn; - ThermalProtect.cHighTempThreshold = HighTempTh; - ThermalProtect.ucLowEnable = LowEn; - ThermalProtect.cLowTempThreshold = LowTempTh; - ThermalProtect.RecheckTimer = cpu2le32(RechkTimer); - ThermalProtect.ucRFOffEnable = RFOffEn; - ThermalProtect.cRFOffThreshold = RFOffTh; - ThermalProtect.ucType = ucType; - - MtAndesAppendCmdMsg(msg, (char *)&ThermalProtect, - sizeof(ThermalProtect)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 -MtCmdThermalProtectAdmitDuty(RTMP_ADAPTER *pAd, UINT32 u4Lv0Duty, - UINT32 u4Lv1Duty, UINT32 u4Lv2Duty, - UINT32 u4Lv3Duty) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_THERMAL_PROTECT_T ThermalProtect; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_THERMAL_PROTECT_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_THERMAL_PROTECT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&ThermalProtect, sizeof(ThermalProtect)); - ThermalProtect.ucExtraTag = THERAML_PROTECTION_TAG_SET_ADMIT_DUTY; - ThermalProtect.ucLv0Duty = (UINT8)u4Lv0Duty; - ThermalProtect.ucLv1Duty = (UINT8)u4Lv1Duty; - ThermalProtect.ucLv2Duty = (UINT8)u4Lv2Duty; - ThermalProtect.ucLv3Duty = (UINT8)u4Lv3Duty; - MtAndesAppendCmdMsg(msg, (char *)&ThermalProtect, - sizeof(ThermalProtect)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif - -/***************************************** - * ExT_CID = 0x2c - *****************************************/ -static VOID MtCmdThemalSensorRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EXT_EVENT_GET_SENSOR_RESULT_T *EventExtCmdResult = - (struct _EXT_EVENT_GET_SENSOR_RESULT_T *)Data; - EventExtCmdResult->u4SensorResult = - le2cpu32(EventExtCmdResult->u4SensorResult); - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, - &EventExtCmdResult->u4SensorResult, - sizeof(EventExtCmdResult->u4SensorResult)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("ThemalSensor = 0x%x\n", EventExtCmdResult->u4SensorResult)); -} - -/* - * ActionIdx: 0: get temperature; 1: get thermo sensor ADC - */ -INT32 MtCmdGetThermalSensorResult(RTMP_ADAPTER *pAd, UINT8 ActionIdx, - UINT32 *SensorResult) -{ - struct cmd_msg *msg; - struct _EXT_CMD_GET_SENSOR_RESULT_T Cmdmsg; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&Cmdmsg, sizeof(Cmdmsg)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Action = %d\n", __func__, ActionIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(Cmdmsg)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_GET_THEMAL_SENSOR); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, SensorResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdThemalSensorRsp); - MtAndesInitCmdMsg(msg, attr); - Cmdmsg.ucActionIdx = ActionIdx; - MtAndesAppendCmdMsg(msg, (char *)&Cmdmsg, sizeof(Cmdmsg)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x2d - *****************************************/ -INT32 MtCmdTmrCal(RTMP_ADAPTER *pAd, UINT8 Enable, UINT8 Band, UINT8 Bw, - UINT8 Ant, UINT8 Role) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_TMR_CAL_T TmrCal; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_TMR_CAL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_TMR_CAL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&TmrCal, sizeof(TmrCal)); - TmrCal.ucEnable = Enable; - TmrCal.ucBand = Band; - TmrCal.ucBW = Bw; - TmrCal.ucAnt = Ant; /* only ant 0 support at present. */ - TmrCal.ucRole = Role; - MtAndesAppendCmdMsg(msg, (char *)&TmrCal, sizeof(TmrCal)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x2E - *****************************************/ -#ifdef MT_WOW_SUPPORT -static VOID EventExtCmdPacketFilterRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - P_EXT_EVENT_PF_GENERAL_T pPFRsp = (P_EXT_EVENT_PF_GENERAL_T)Data; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: u4PfCmdType = 0x%x u4Status = 0x%x\n", __func__, - le2cpu32(pPFRsp->u4PfCmdType), le2cpu32(pPFRsp->u4Status))); -} - -static VOID EventExtCmdWakeupOptionRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - P_EXT_EVENT_WAKEUP_OPTION_T pWakeOptRsp = - (P_EXT_EVENT_WAKEUP_OPTION_T)Data; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: u4PfCmdType = 0x%x u4Status = 0x%x\n", __func__, - le2cpu32(pWakeOptRsp->u4PfCmdType), - le2cpu32(pWakeOptRsp->u4Status))); -} - -VOID MT76xxAndesWOWEnable(PRTMP_ADAPTER pAd, PSTA_ADMIN_CONFIG pStaCfg) -{ - /* hw-enable cmd */ - /* 1. magic, parameter=enable */ - /* 2. eapol , param = enable */ - /* 3. bssid , param = bssid[3:0] */ - /* 4. mode, parm = white */ - /* 5. PF, param = enable */ - /* wakeup command param = choose usb. others dont' care */ - struct wifi_dev *wdev = &pStaCfg->wdev; - UINT32 BandIdx = 0; - MAC_TABLE_ENTRY *pEntry = NULL; - struct cmd_msg *msg; - INT32 ret = NDIS_STATUS_SUCCESS; - struct _CMD_ATTRIBUTE attr = { 0 }; - CMD_PACKET_FILTER_GLOBAL_T CmdPFGlobal; - CMD_PACKET_FILTER_GTK_T CmdGTK; - CMD_PACKET_FILTER_ARPNS_T CmdArpNs; - CMD_PACKET_FILTER_WAKEUP_OPTION_T CmdWakeupOption; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s:\n", __func__)); - pEntry = GetAssociatedAPByWdev(pAd, wdev); - ASSERT(pEntry); -#ifdef DBDC_MODE - BandIdx = HcGetBandByWdev(wdev); -#endif /* DBDC_MODE */ - - /* Security configuration */ - if (IS_AKM_PSK(pEntry->SecConfig.AKMMap)) { - os_zero_mem(&CmdGTK, sizeof(CmdGTK)); - msg = AndesAllocCmdMsg(pAd, sizeof(CMD_PACKET_FILTER_GTK_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PACKET_FILTER); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, - sizeof(EXT_EVENT_PF_GENERAL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdPacketFilterRsp); - AndesInitCmdMsg(msg, attr); - CmdGTK.PFType = cpu2le32(_ENUM_TYPE_GTK_REKEY); - - if (IS_AKM_WPA1PSK(wdev->SecConfig.AKMMap)) - CmdGTK.WPAVersion = cpu2le32(PF_WPA); - else - CmdGTK.WPAVersion = cpu2le32(PF_WPA2); - - MTWF_LOG( - DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Bssid(%02x:%02x:%02x:%02x:%02x:%02x), Wcid(%d, %d), McMcIdx(%d)\n", - __func__, PRINT_MAC(wdev->bssid), pEntry->wcid, - wdev->tr_tb_idx, - wdev->bss_info_argument.ucBcMcWlanIdx)); - /* TODO: Pat: how if big endian */ - NdisCopyMemory(CmdGTK.PTK, pEntry->SecConfig.PTK, 64); - CmdGTK.BssidIndex = - cpu2le32(wdev->bss_info_argument.ucBssIndex); - CmdGTK.OwnMacIndex = cpu2le32(wdev->OmacIdx); - CmdGTK.WmmIndex = cpu2le32(PF_WMM_0); - - if (IS_AKM_PSK(pEntry->SecConfig.AKMMap)) { - NdisCopyMemory( - CmdGTK.ReplayCounter, - pEntry->SecConfig.Handshake.ReplayCounter, - LEN_KEY_DESC_REPLAY); - CmdGTK.GroupKeyIndex = - cpu2le32(wdev->bss_info_argument.ucBcMcWlanIdx); - CmdGTK.PairKeyIndex = cpu2le32(pEntry->wcid); - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::GTK offload::BssidIndex %d, GroupKeyIndex %d, OwnMacIndex %d, PairKeyIndex %d, WmmIndex %d\n", - __func__, CmdGTK.BssidIndex, CmdGTK.GroupKeyIndex, - CmdGTK.OwnMacIndex, CmdGTK.PairKeyIndex, - CmdGTK.WmmIndex)); - AndesAppendCmdMsg(msg, (char *)&CmdGTK, - sizeof(CMD_PACKET_FILTER_GTK_T)); - ret = AndesSendCmdMsg(pAd, msg); - } - - /* ARP/NS offlaod */ - os_zero_mem(&CmdArpNs, sizeof(CMD_PACKET_FILTER_ARPNS_T)); - msg = AndesAllocCmdMsg(pAd, sizeof(CMD_PACKET_FILTER_ARPNS_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PACKET_FILTER); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_EVENT_PF_GENERAL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdPacketFilterRsp); - AndesInitCmdMsg(msg, attr); - CmdArpNs.PFType = cpu2le32(_ENUM_TYPE_ARPNS); - CmdArpNs.IPIndex = cpu2le32(PF_ARP_NS_SET_0); - CmdArpNs.Enable = cpu2le32(PF_ARP_NS_ENABLE); - CmdArpNs.BssidEnable = cpu2le32(PF_BSSID_0); - CmdArpNs.Offload = cpu2le32(PF_ARP_OFFLOAD); - CmdArpNs.Type = cpu2le32(PF_ARP_NS_ALL_PKT); - CmdArpNs.IPAddress[0] = pAd->WOW_Cfg.IPAddress[0]; /* 192 */ - CmdArpNs.IPAddress[1] = pAd->WOW_Cfg.IPAddress[1]; /* 168 */ - CmdArpNs.IPAddress[2] = pAd->WOW_Cfg.IPAddress[2]; /* 2 */ - CmdArpNs.IPAddress[3] = pAd->WOW_Cfg.IPAddress[3]; /* 10 */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::ARP offload::IP(%d:%d:%d:%d)\n", __func__, - CmdArpNs.IPAddress[0], CmdArpNs.IPAddress[1], - CmdArpNs.IPAddress[2], CmdArpNs.IPAddress[3])); - AndesAppendCmdMsg(msg, (char *)&CmdArpNs, - sizeof(CMD_PACKET_FILTER_ARPNS_T)); - ret = AndesSendCmdMsg(pAd, msg); - /* Wakeup option */ - os_zero_mem(&CmdWakeupOption, - sizeof(CMD_PACKET_FILTER_WAKEUP_OPTION_T)); - msg = AndesAllocCmdMsg(pAd, sizeof(CMD_PACKET_FILTER_WAKEUP_OPTION_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_WAKEUP_OPTION); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_EVENT_WAKEUP_OPTION_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdWakeupOptionRsp); - AndesInitCmdMsg(msg, attr); - CmdWakeupOption.WakeupInterface = - cpu2le32(pAd->WOW_Cfg.nWakeupInterface); - - if (pAd->WOW_Cfg.nWakeupInterface == WOW_WAKEUP_BY_GPIO) { - UINT32 GpioParameter = 0; - CmdWakeupOption.GPIONumber = - cpu2le32(pAd->WOW_Cfg.nSelectedGPIO); /* which GPIO */ - CmdWakeupOption.GPIOTimer = - cpu2le32(pAd->WOW_Cfg.nHoldTime); /* unit is us */ - - if (pAd->WOW_Cfg.bGPIOHighLow == WOW_GPIO_LOW_TO_HIGH) - GpioParameter = WOW_GPIO_LOW_TO_HIGH_PARAMETER; - else - GpioParameter = WOW_GPIO_HIGH_TO_LOW_PARAMETER; - - CmdWakeupOption.GpioParameter = cpu2le32(GpioParameter); - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Wakeup Option::nWakeupInterface(%d), GPIONumber(%d), GPIOTimer(%d), GpioParameter(0x%x)\n", - __func__, CmdWakeupOption.WakeupInterface, - CmdWakeupOption.GPIONumber, CmdWakeupOption.GPIOTimer, - CmdWakeupOption.GpioParameter)); - AndesAppendCmdMsg(msg, (char *)&CmdWakeupOption, - sizeof(CMD_PACKET_FILTER_WAKEUP_OPTION_T)); - ret = AndesSendCmdMsg(pAd, msg); - /* WOW enable */ - os_zero_mem(&CmdPFGlobal, sizeof(CMD_PACKET_FILTER_GLOBAL_T)); - msg = AndesAllocCmdMsg(pAd, sizeof(CMD_PACKET_FILTER_GLOBAL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PACKET_FILTER); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_EVENT_PF_GENERAL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdPacketFilterRsp); - AndesInitCmdMsg(msg, attr); - CmdPFGlobal.PFType = cpu2le32(_ENUM_TYPE_GLOBAL_EN); - CmdPFGlobal.FunctionSelect = cpu2le32(_ENUM_GLOBAL_WOW_EN); - CmdPFGlobal.Enable = cpu2le32(PF_BSSID_0); - CmdPFGlobal.Band = cpu2le32(BandIdx); /* cpu2le32(PF_BAND_0); */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s::Wakeup option::Band(%d)\n", __func__, BandIdx)); - AndesAppendCmdMsg(msg, (char *)&CmdPFGlobal, - sizeof(CMD_PACKET_FILTER_GLOBAL_T)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); -} - -VOID MT76xxAndesWOWDisable(PRTMP_ADAPTER pAd, PSTA_ADMIN_CONFIG pStaCfg) -{ - struct wifi_dev *wdev = &pStaCfg->wdev; - UINT32 BandIdx = 0; - CMD_PACKET_FILTER_GLOBAL_T CmdPFGlobal; - struct cmd_msg *msg; - INT32 ret = NDIS_STATUS_SUCCESS; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s:\n", __func__)); - ASSERT(wdev); -#ifdef DBDC_MODE - BandIdx = HcGetBandByWdev(wdev); -#endif /* DBDC_MODE */ - /* WOW disable */ - os_zero_mem(&CmdPFGlobal, sizeof(CMD_PACKET_FILTER_GLOBAL_T)); - msg = AndesAllocCmdMsg(pAd, sizeof(CMD_PACKET_FILTER_GLOBAL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PACKET_FILTER); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_EVENT_PF_GENERAL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdPacketFilterRsp); - AndesInitCmdMsg(msg, attr); - CmdPFGlobal.PFType = cpu2le32(_ENUM_TYPE_GLOBAL_EN); - CmdPFGlobal.FunctionSelect = cpu2le32(_ENUM_GLOBAL_WOW_EN); - CmdPFGlobal.Enable = cpu2le32(PF_BSSID_DISABLE); - CmdPFGlobal.Band = cpu2le32(BandIdx); /* cpu2le32(PF_BAND_0); */ - AndesAppendCmdMsg(msg, (char *)&CmdPFGlobal, - sizeof(CMD_PACKET_FILTER_GLOBAL_T)); - ret = AndesSendCmdMsg(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); -} - -#endif - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT -/***************************************** - * ExT_CID = 0x30 - *****************************************/ -static VOID MtCmdGetTxStatisticRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - P_EXT_EVENT_TX_STATISTIC_RESULT_T prEventExtCmdResult = - (P_EXT_EVENT_TX_STATISTIC_RESULT_T)Data; - P_EXT_EVENT_TX_STATISTIC_RESULT_T prTxStat = - (P_EXT_EVENT_TX_STATISTIC_RESULT_T)msg->attr.rsp.wb_buf_in_calbk; - prTxStat->u4Field = le2cpu32(prEventExtCmdResult->u4Field); - - if (prTxStat->u4Field & GET_TX_STAT_TOTAL_TX_CNT) { - prTxStat->u4TotalTxCount = - le2cpu32(prEventExtCmdResult->u4TotalTxCount); - prTxStat->u4TotalTxFailCount = - le2cpu32(prEventExtCmdResult->u4TotalTxFailCount); - prTxStat->u4CurrBwTxCnt = - le2cpu32(prEventExtCmdResult->u4CurrBwTxCnt); - prTxStat->u4OtherBwTxCnt = - le2cpu32(prEventExtCmdResult->u4OtherBwTxCnt); - } - - if (prTxStat->u4Field & GET_TX_STAT_LAST_TX_RATE) { - os_move_mem(&prTxStat->rLastTxRate, - &prEventExtCmdResult->rLastTxRate, - sizeof(RA_PHY_CFG_T)); - } - - if (prTxStat->u4Field & GET_TX_STAT_ENTRY_TX_RATE) { - os_move_mem(&prTxStat->rEntryTxRate, - &prEventExtCmdResult->rEntryTxRate, - sizeof(RA_PHY_CFG_T)); - -#ifdef TXSTAT_2040BW_24G_SUPPORT - if (IF_STAREC_BW_STATS_SUPPORT() == TRUE) { - os_move_mem(&prTxStat->u4Total20MTxCount, - &prEventExtCmdResult->u4Total20MTxCount, - sizeof(UINT_32)); - - os_move_mem(&prTxStat->u4Total40MTxCount, - &prEventExtCmdResult->u4Total40MTxCount, - sizeof(UINT_32)); - - os_move_mem(&prTxStat->u4TotalTxCount, - &prEventExtCmdResult->u4TotalTxCount, - sizeof(UINT_32)); - } -#endif - } - - if (prTxStat->u4Field & GET_TX_STAT_ENTRY_TX_CNT) { - prTxStat->u4EntryTxCount = - le2cpu32(prEventExtCmdResult->u4EntryTxCount); - prTxStat->u4EntryTxFailCount = - le2cpu32(prEventExtCmdResult->u4EntryTxFailCount); - } -} - -#ifdef TXSTAT_2040BW_24G_SUPPORT -BOOLEAN Is2040StatFeatureEnbl = FALSE; -INT32 MtCmdSetBWStatFeature(struct _RTMP_ADAPTER *pAd, UCHAR isEnable) -{ - struct cmd_msg *msg; - EXT_CMD_2040_BW_STATISTIC_T rBwStatCmd; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - os_zero_mem(&rBwStatCmd, sizeof(rBwStatCmd)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:isEnable=%d\n", __func__, isEnable)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(rBwStatCmd)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BW_STATS_FEATURE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - - rBwStatCmd.ucGetBwStat = 0; - rBwStatCmd.ucBWStatFeature = isEnable; - - MtAndesAppendCmdMsg(msg, (char *)&rBwStatCmd, sizeof(rBwStatCmd)); - ret = chip_cmd_tx(pAd, msg); -error: - - if (ret) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - } - - return ret; -} - -static VOID MtCmdGetBwStatFeatureRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - P_EXT_EVENT_2040_BW_STATISTIC_T prEventExtCmdResult = - (P_EXT_EVENT_2040_BW_STATISTIC_T)Data; - P_EXT_EVENT_2040_BW_STATISTIC_T prBwStat = - (P_EXT_EVENT_2040_BW_STATISTIC_T)msg->attr.rsp.wb_buf_in_calbk; - - prBwStat->ucBWStatFeature = prEventExtCmdResult->ucBWStatFeature; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s]:isEnable=%d\n", __func__, prBwStat->ucBWStatFeature)); -} - -INT32 MtCmdGetBWStatFeature(struct _RTMP_ADAPTER *pAd, UCHAR isEnable) -{ - struct cmd_msg *msg; - EXT_CMD_2040_BW_STATISTIC_T rBwStatCmd; - EXT_EVENT_2040_BW_STATISTIC_T rBwStatResult; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - os_zero_mem(&rBwStatCmd, sizeof(rBwStatCmd)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:isEnable=%d\n", __func__, isEnable)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(rBwStatCmd)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BW_STATS_FEATURE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, - sizeof(EXT_EVENT_2040_BW_STATISTIC_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &rBwStatResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetBwStatFeatureRsp); - MtAndesInitCmdMsg(msg, attr); - rBwStatCmd.ucGetBwStat = 1; - rBwStatCmd.ucBWStatFeature = 0; - - MtAndesAppendCmdMsg(msg, (char *)&rBwStatCmd, sizeof(rBwStatCmd)); - ret = chip_cmd_tx(pAd, msg); -error: - - if (ret) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - } else { - if (isEnable == rBwStatResult.ucBWStatFeature) - SET_STAREC_BW_STATS_SUPPORT( - rBwStatResult.ucBWStatFeature); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (" 20/40 Enable=%d\n", rBwStatResult.ucBWStatFeature)); - } - - return ret; -} -#endif -#ifdef CONFIG_MAP_SUPPORT -INT32 MtCmdGetAllStaTxRate(struct _RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - EXT_CMD_GET_TX_RATE_T rTxStatCmd; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&rTxStatCmd, sizeof(rTxStatCmd)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SSS %s\n", __func__)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(rTxStatCmd)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_ALL_STA_TX_RATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - if (pAd->get_all_sta_rate_wcid_idx == 0) { - pAd->get_all_sta_rate_wcid_idx = 1; - } - rTxStatCmd.ucReqWcid = pAd->get_all_sta_rate_wcid_idx; - MtAndesAppendCmdMsg(msg, (char *)&rTxStatCmd, sizeof(rTxStatCmd)); - ret = chip_cmd_tx(pAd, msg); -error: - - if (ret) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} -#ifdef MAP_R2 -static VOID MtCmdSetRxAirtimeCtrlRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ -} -INT32 MtCmdSetRxTxAirtimeEn(struct _RTMP_ADAPTER *pAd, UINT32 subcmd, - BOOLEAN flag) -{ - INT32 ret; - struct cmd_msg *msg; - EXT_CMD_RX_AT_CTRL_T result; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - EXT_CMD_RX_AT_CTRL_T tparam; - /* init structure to zero */ - NdisZeroMemory(&tparam, sizeof(tparam)); - /* assign cmd and subcmd */ - tparam.u4CtrlFieldID = ENUM_RX_AT_FEATURE_CTRL; - tparam.u4CtrlSubFieldID = subcmd; - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.fgRxAirTimeEn = flag; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Field ID: %d, Sub Field ID: %d, Enable: %d\n", __func__, - tparam.u4CtrlFieldID, tparam.u4CtrlSubFieldID, - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.fgRxAirTimeEn)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:struct size %zu\n", __func__, sizeof(tparam))); - msg = MtAndesAllocCmdMsg(pAd, sizeof(tparam)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RX_AIRTIME_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_CMD_RX_AT_CTRL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdSetRxAirtimeCtrlRsp); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, - EXT_CMD_ID_RX_AIRTIME_CTRL, TRUE, 0, TRUE, TRUE, - sizeof(result), (char *)&result, - MtCmdSetRxAirtimeCtrlRsp); -#endif /* NEW_MCU_INIT_CMD_API */ -#ifdef RT_BIG_ENDIAN - tparam.u4CtrlFieldID = cpu2le16(tparam.u4CtrlFieldID); - tparam.u4CtrlSubFieldID = cpu2le16(tparam.u4CtrlSubFieldID); -#endif - MtAndesAppendCmdMsg(msg, (char *)(&tparam), sizeof(tparam)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif -#endif - -INT32 MtCmdGetTxStatistic(struct _RTMP_ADAPTER *pAd, UINT32 u4Field, - UINT8 ucBand, UINT8 ucWcid, - P_EXT_EVENT_TX_STATISTIC_RESULT_T prTxStatResult) -{ - struct cmd_msg *msg; - EXT_CMD_GET_TX_STATISTIC_T rTxStatCmd; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&rTxStatCmd, sizeof(rTxStatCmd)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:u4Field=0x%8x, ucWcid=%d\n", __func__, u4Field, ucWcid)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(rTxStatCmd)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_TX_STATISTICS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, - sizeof(EXT_EVENT_TX_STATISTIC_RESULT_T)); - /*TXSTAT_2040BW_24G_SUPPORT is only present in MT7622 fw so reducing the expected response len for MT7615*/ -#ifdef TXSTAT_2040BW_24G_SUPPORT - if (IS_MT7615(pAd)) - SET_CMD_ATTR_RSP_EXPECT_SIZE( - attr, (sizeof(EXT_EVENT_TX_STATISTIC_RESULT_T) - 8)); -#endif - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, prTxStatResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetTxStatisticRsp); - MtAndesInitCmdMsg(msg, attr); - rTxStatCmd.u4Field = cpu2le32(u4Field); - rTxStatCmd.ucWlanIdx = ucWcid; - rTxStatCmd.ucBandIdx = ucBand; - MtAndesAppendCmdMsg(msg, (char *)&rTxStatCmd, sizeof(rTxStatCmd)); - ret = chip_cmd_tx(pAd, msg); -error: - - if (ret) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} - -/*not need to wait response for a specific STA txcount*/ -INT32 mt_cmd_get_sta_tx_statistic(struct _RTMP_ADAPTER *ad, UINT8 wcid, - UINT8 dbdcidx, UINT32 field) -{ - struct cmd_msg *msg; - struct _EXT_CMD_GET_TX_STATISTIC_T cmd; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - os_zero_mem(&cmd, sizeof(struct _EXT_CMD_GET_TX_STATISTIC_T)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: wcid=%d\n", __func__, wcid)); - msg = MtAndesAllocCmdMsg(ad, sizeof(cmd)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_TX_STATISTICS); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY); - MtAndesInitCmdMsg(msg, attr); - cmd.u4Field = cpu2le32(field); - cmd.ucWlanIdx = wcid; - cmd.ucBandIdx = dbdcidx; - MtAndesAppendCmdMsg(msg, (char *)&cmd, - sizeof(struct _EXT_CMD_GET_TX_STATISTIC_T)); - ret = chip_cmd_tx(ad, msg); -error: - - if (ret) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} - -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - -#ifdef PRETBTT_INT_EVENT_SUPPORT -/***************************************** - * ExT_CID = 0x33 - *****************************************/ -INT32 MtCmdTrgrPretbttIntEventSet( - RTMP_ADAPTER *pAd, CMD_TRGR_PRETBTT_INT_EVENT_T trgr_pretbtt_int_event) -{ - struct cmd_msg *msg; - INT32 ret = 0, size = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - size = sizeof(CMD_TRGR_PRETBTT_INT_EVENT_T); - msg = MtAndesAllocCmdMsg(pAd, size); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - MTWF_LOG(DBG_CAT_HIF, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:Error Allocate Fail\n", __func__)); - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TRGR_PRETBTT_INT_EVENT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MTWF_LOG(DBG_CAT_HIF, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:bcn_update.ucEnable = %d\n", __func__, - trgr_pretbtt_int_event.ucEnable)); -#ifdef RT_BIG_ENDIAN - trgr_pretbtt_int_event.u2BcnPeriod = - cpu2le16(trgr_pretbtt_int_event.u2BcnPeriod); -#endif - MtAndesAppendCmdMsg(msg, (char *)&trgr_pretbtt_int_event, size); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_HIF, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -VOID MtSetTriggerPretbttIntEvent(RTMP_ADAPTER *pAd, INT apidx, UCHAR HWBssidIdx, - BOOLEAN Enable, UINT16 BeaconPeriod) -{ - CMD_TRGR_PRETBTT_INT_EVENT_T trgr_pretbtt_int_event; - os_zero_mem(&trgr_pretbtt_int_event, - sizeof(CMD_TRGR_PRETBTT_INT_EVENT_T)); - trgr_pretbtt_int_event.ucHwBssidIdx = HWBssidIdx; - - if (HWBssidIdx > 0) /* HWBssid > 0 case, no extendable bssid. */ - trgr_pretbtt_int_event.ucExtBssidIdx = 0; - else - trgr_pretbtt_int_event.ucExtBssidIdx = (UINT8)apidx; - - trgr_pretbtt_int_event.ucEnable = Enable; - trgr_pretbtt_int_event.u2BcnPeriod = BeaconPeriod; - MTWF_LOG(DBG_CAT_HIF, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:trgr_pretbtt_int_event.ucHwBssidIdx = %d\n", __func__, - trgr_pretbtt_int_event.ucHwBssidIdx)); - MTWF_LOG(DBG_CAT_HIF, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:trgr_pretbtt_int_event.ucExtBssidIdx = %d\n", __func__, - trgr_pretbtt_int_event.ucExtBssidIdx)); - MTWF_LOG(DBG_CAT_HIF, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:trgr_pretbtt_int_event.u2BcnPeriod = %d\n", __func__, - trgr_pretbtt_int_event.u2BcnPeriod)); - MTWF_LOG(DBG_CAT_HIF, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:trgr_pretbtt_int_event.ucEnable = %d\n", __func__, - trgr_pretbtt_int_event.ucEnable)); - MtCmdTrgrPretbttIntEventSet(pAd, trgr_pretbtt_int_event); -} -#endif /*PRETBTT_INT_EVENT_SUPPORT*/ - -/***************************************** - * ExT_CID = 0x48 - *****************************************/ -INT32 MtCmdMuarConfigSet(RTMP_ADAPTER *pAd, UCHAR *pdata) -{ - struct cmd_msg *msg; - INT32 ret = 0, size = 0; - EXT_CMD_MUAR_T *pconfig_muar = (EXT_CMD_MUAR_T *)pdata; - struct _CMD_ATTRIBUTE attr = { 0 }; - size = sizeof(EXT_CMD_MUAR_T); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:ucMuarModeSel = %d, ucForceClear = %d, ucEntryCnt = %d, ucAccessMode = %d\n", - __func__, pconfig_muar->ucMuarModeSel, - pconfig_muar->ucForceClear, pconfig_muar->ucEntryCnt, - pconfig_muar->ucAccessMode)); - size = size + - (pconfig_muar->ucEntryCnt * sizeof(EXT_CMD_MUAR_MULTI_ENTRY_T)); - msg = MtAndesAllocCmdMsg(pAd, size); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CONFIG_MUAR); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)pconfig_muar, size); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#ifdef OCE_SUPPORT -INT32 MtCmdFdFrameOffloadSet(RTMP_ADAPTER *pAd, - P_CMD_FD_FRAME_OFFLOAD_T fdFrame_offload) -{ - struct cmd_msg *msg; - INT32 ret = 0, size = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - size = sizeof(CMD_FD_FRAME_OFFLOAD_T); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s(): Enable = %d, OwnMacIdx = %d, WlanIdx = %d, Band = %d, Len = %d\n", - __func__, fdFrame_offload->ucEnable, - fdFrame_offload->ucOwnMacIdx, fdFrame_offload->ucWlanIdx, - fdFrame_offload->ucBandIdx, fdFrame_offload->u2PktLength)); - msg = MtAndesAllocCmdMsg(pAd, size); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_FD_FRAME_OFFLOAD); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - fdFrame_offload->u2PktLength = cpu2le16(fdFrame_offload->u2PktLength); - fdFrame_offload->u2TimestampFieldPos = - cpu2le16(fdFrame_offload->u2TimestampFieldPos); -#endif - MtAndesAppendCmdMsg(msg, (char *)fdFrame_offload, size); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* OCE_SUPPORT */ - -#ifdef BCN_OFFLOAD_SUPPORT -/***************************************** - * ExT_CID = 0x49 - *****************************************/ -INT32 MtCmdBcnOffloadSet(RTMP_ADAPTER *pAd, CMD_BCN_OFFLOAD_T *bcn_offload) -{ - struct cmd_msg *msg; - INT32 ret = 0, size = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - size = sizeof(CMD_BCN_OFFLOAD_T); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Enable = %d, OwnMacIdx = %d, WlanIdx = %d, Band = %d, Len = %d\n", - __func__, bcn_offload->ucEnable, bcn_offload->ucOwnMacIdx, - bcn_offload->ucWlanIdx, bcn_offload->ucBandIdx, - bcn_offload->u2PktLength)); - - msg = MtAndesAllocCmdMsg(pAd, size); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BCN_OFFLOAD); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - bcn_offload->u2PktLength = cpu2le16(bcn_offload->u2PktLength); - bcn_offload->u2TimIePos = cpu2le16(bcn_offload->u2TimIePos); - bcn_offload->u2CsaIePos = cpu2le16(bcn_offload->u2CsaIePos); -#endif - MtAndesAppendCmdMsg(msg, (char *)bcn_offload, size); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /*BCN_OFFLOAD_SUPPORT*/ - -#ifdef VOW_SUPPORT -/********************************/ -/* EXT_EVENT_ID_DRR_CTRL = 0x36 */ -/********************************/ -static VOID MtCmdSetVoWDRRCtrlRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EXT_CMD_VOW_DRR_CTRL_T *EventExtCmdResult = - (struct _EXT_CMD_VOW_DRR_CTRL_T *)Data; -#if (NEW_MCU_INIT_CMD_API) - NdisCopyMemory(msg->attr.rsp.wb_buf_in_calbk, Data, - sizeof(struct _EXT_CMD_VOW_DRR_CTRL_T)); -#else - NdisCopyMemory(msg->rsp_payload, Data, - sizeof(struct _EXT_CMD_VOW_DRR_CTRL_T)); -#endif /* NEW_MCU_INIT_CMD_API */ -#if (NEW_MCU_INIT_CMD_API) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlFieldID = 0x%x, ExtCmd (0x%02x)\n", __func__, - EventExtCmdResult->u4CtrlFieldID, msg->attr.ext_type)); -#else - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlFieldID = 0x%x, ExtCmd (0x%02x)\n", __func__, - EventExtCmdResult->u4CtrlFieldID, msg->ext_cmd_type)); -#endif /* NEW_MCU_INIT_CMD_API */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ucCtrlStatus = 0x%x\n", __func__, - EventExtCmdResult->ucCtrlStatus)); -} - -/*************************************/ -/* EXT_EVENT_ID_BSSGROUP_CTRL = 0x37 */ -/*************************************/ -static VOID MtCmdSetVoWGroupCtrlRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EXT_CMD_BSS_CTRL_T *EventExtCmdResult = - (struct _EXT_CMD_BSS_CTRL_T *)Data; -#if (NEW_MCU_INIT_CMD_API) - NdisCopyMemory(msg->attr.rsp.wb_buf_in_calbk, Data, - sizeof(struct _EXT_CMD_BSS_CTRL_T)); -#else - NdisCopyMemory(msg->rsp_payload, Data, - sizeof(struct _EXT_CMD_BSS_CTRL_T)); -#endif /* NEW_MCU_INIT_CMD_API */ -#if (NEW_MCU_INIT_CMD_API) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlFieldID = 0x%x, ExtCmd (0x%02x)\n", __func__, - le2cpu32(EventExtCmdResult->u4CtrlFieldID), - msg->attr.ext_type)); -#else - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlFieldID = 0x%x, ExtCmd (0x%02x)\n", __func__, - le2cpu32(EventExtCmdResult->u4CtrlFieldID), - msg->ext_cmd_type)); -#endif /* NEW_MCU_INIT_CMD_API */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ucCtrlStatus = 0x%x\n", __func__, - EventExtCmdResult->ucCtrlStatus)); -} -/****************************************/ -/* EXT_EVENT_ID_VOW_FEATURE_CTRL = 0x38 */ -/***************************************/ -static VOID MtCmdSetVoWFeatureCtrlRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - /* RTMP_ADAPTER *pad = (RTMP_ADAPTER *)(msg->priv); */ - struct _EXT_CMD_VOW_FEATURE_CTRL_T *EventExtCmdResult = - (struct _EXT_CMD_VOW_FEATURE_CTRL_T *)Data; -#ifdef RT_BIG_ENDIAN - UINT16 *u16p = NULL; - EventExtCmdResult->u2IfApplyBss_0_to_16_CtrlFlag = - le2cpu16(EventExtCmdResult->u2IfApplyBss_0_to_16_CtrlFlag); - u16p = &(EventExtCmdResult->u2IfApplyBss_0_to_16_CtrlFlag) + 1; - *u16p = cpu2le16(*u16p); - EventExtCmdResult->u2IfApplyBssCheckTimeToken_0_to_16_CtrlFlag = - le2cpu16(EventExtCmdResult - ->u2IfApplyBssCheckTimeToken_0_to_16_CtrlFlag); - EventExtCmdResult->u2IfApplyBssCheckLengthToken_0_to_16_CtrlFlag = - le2cpu16( - EventExtCmdResult - ->u2IfApplyBssCheckLengthToken_0_to_16_CtrlFlag); -#endif -#if (NEW_MCU_INIT_CMD_API) - NdisCopyMemory(msg->attr.rsp.wb_buf_in_calbk, Data, - sizeof(struct _EXT_CMD_VOW_FEATURE_CTRL_T)); -#else - NdisCopyMemory(msg->rsp_payload, Data, - sizeof(struct _EXT_CMD_VOW_FEATURE_CTRL_T)); -#endif /* NEW_MCU_INIT_CMD_API */ -#if (NEW_MCU_INIT_CMD_API) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ExtCmd = 0x%x\n", __func__, msg->attr.ext_type)); -#else - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ExtCmd = 0x%x\n", __func__, msg->ext_cmd_type)); -#endif /* NEW_MCU_INIT_CMD_API */ - - /* if (EventExtCmdResult->ucCtrlStatus == FALSE) */ - if (1) { -#if (NEW_MCU_INIT_CMD_API) - - if (IS_CMD_ATTR_SET_QUERY_FLAG_SET(msg->attr)) -#else - if (msg->set_query == CMD_QUERY) -#endif /* NEW_MCU_INIT_CMD_API */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Get fail!\n", __func__)); - else - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Set fail!\n", __func__)); - - if (EventExtCmdResult->u2IfApplyBss_0_to_16_CtrlFlag) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2Bss_0_to_16_CtrlValue = 0x%0x\n", - __func__, - EventExtCmdResult->u2Bss_0_to_16_CtrlValue)); - } - - if (EventExtCmdResult->u2IfApplyRefillPerildFlag) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2RefillPerildValue = 0x%0x\n", __func__, - EventExtCmdResult->u2RefillPerildValue)); - } - - if (EventExtCmdResult->u2IfApplyDbdc1SearchRuleFlag) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2Dbdc1SearchRuleValue = 0x%0x\n", - __func__, - EventExtCmdResult->u2Dbdc1SearchRuleValue)); - } - - if (EventExtCmdResult->u2IfApplyDbdc0SearchRuleFlag) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2Dbdc0SearchRuleValue = 0x%0x\n", - __func__, - EventExtCmdResult->u2Dbdc0SearchRuleValue)); - } - - if (EventExtCmdResult->u2IfApplyEnTxopNoChangeBssFlag) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2EnTxopNoChangeBssValue = 0x%0x\n", - __func__, - EventExtCmdResult->u2EnTxopNoChangeBssValue)); - } - - if (EventExtCmdResult->u2IfApplyAirTimeFairnessFlag) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2AirTimeFairnessValue = 0x%0x\n", - __func__, - EventExtCmdResult->u2AirTimeFairnessValue)); - } - - if (EventExtCmdResult->u2IfApplyEnbwrefillFlag) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2EnbwrefillValue = 0x%0x\n", __func__, - EventExtCmdResult->u2EnbwrefillValue)); - } - - if (EventExtCmdResult->u2IfApplyEnbwCtrlFlag) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2EnbwCtrlValue = 0x%0x\n", __func__, - EventExtCmdResult->u2EnbwCtrlValue)); - } - - if (EventExtCmdResult - ->u2IfApplyBssCheckTimeToken_0_to_16_CtrlFlag) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2BssCheckTimeToken_0_to_16_CtrlValue = 0x%0x\n", - __func__, - EventExtCmdResult - ->u2BssCheckTimeToken_0_to_16_CtrlValue)); - } - - if (EventExtCmdResult - ->u2IfApplyBssCheckLengthToken_0_to_16_CtrlFlag) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u2BssCheckLengthToken_0_to_16_CtrlValue = 0x%0x\n", - __func__, - EventExtCmdResult - ->u2BssCheckLengthToken_0_to_16_CtrlValue)); - } - } - - /* need to ask FW to add ExtendCID and CtrlStatus */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: i am here~\n", __func__)); -} - -/***************************************/ -/* EXT_EVENT_ID_RX_AIRTIME_CTRL = 0x4a */ -/***************************************/ -static VOID MtCmdSetVoWRxAirtimeCtrlRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - struct _EXT_CMD_RX_AT_CTRL_T *EventExtCmdResult = - (struct _EXT_CMD_RX_AT_CTRL_T *)Data; -#ifdef RT_BIG_ENDIAN - EventExtCmdResult->u4CtrlFieldID = - le2cpu16(EventExtCmdResult->u4CtrlFieldID); - EventExtCmdResult->u4CtrlSubFieldID = - le2cpu16(EventExtCmdResult->u4CtrlSubFieldID); - EventExtCmdResult->u4CtrlSetStatus = - le2cpu32(EventExtCmdResult->u4CtrlSetStatus); - EventExtCmdResult->u4CtrlGetStatus = - le2cpu32(EventExtCmdResult->u4CtrlGetStatus); - EventExtCmdResult->u4ReserveDW[0] = - le2cpu32(EventExtCmdResult->u4ReserveDW[0]); - EventExtCmdResult->u4ReserveDW[1] = - le2cpu32(EventExtCmdResult->u4ReserveDW[1]); -#endif - NdisMoveMemory(msg->attr.rsp.wb_buf_in_calbk, Data, Len); -#if (NEW_MCU_INIT_CMD_API) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlFieldID = 0x%x, ExtCmd (0x%02x)\n", __func__, - EventExtCmdResult->u4CtrlFieldID, msg->attr.ext_type)); -#else - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlFieldID = 0x%x, ExtCmd (0x%02x)\n", __func__, - EventExtCmdResult->u4CtrlFieldID, msg->ext_cmd_type)); -#endif /* NEW_MCU_INIT_CMD_API */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlGetStatus = 0x%x\n", __func__, - EventExtCmdResult->u4CtrlGetStatus)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlSetStatus = 0x%x\n", __func__, - EventExtCmdResult->u4CtrlSetStatus)); - - /* show get RX Non Wi-Fi and OBSS counter */ - if (EventExtCmdResult->u4CtrlFieldID == EMUM_RX_AT_REPORT_CTRL) { - if (EventExtCmdResult->u4CtrlSubFieldID == - ENUM_RX_AT_REPORT_SUB_TYPE_RX_NONWIFI_TIME) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Non Wi-Fi for band%d = 0x%x\n", __func__, - EventExtCmdResult->rRxAtGeneralCtrl - .rRxAtReportSubCtrl.ucRxNonWiFiBandIdx, - EventExtCmdResult->rRxAtGeneralCtrl - .rRxAtReportSubCtrl - .u4RxNonWiFiBandTimer)); - } else if (EventExtCmdResult->u4CtrlSubFieldID == - ENUM_RX_AT_REPORT_SUB_TYPE_RX_OBSS_TIME) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: OBSS for band%d = 0x%x\n", __func__, - EventExtCmdResult->rRxAtGeneralCtrl - .rRxAtReportSubCtrl.ucRxObssBandIdx, - EventExtCmdResult->rRxAtGeneralCtrl - .rRxAtReportSubCtrl.u4RxObssBandTimer)); - } - } -} - -/**************************************/ -/* EXT_EVENT_ID_AT_PROC_MODULE = 0x4b */ -/**************************************/ -static VOID MtCmdSetVoWModuleCtrlRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - struct _EXT_CMD_RX_AT_CTRL_T *EventExtCmdResult = - (struct _EXT_CMD_RX_AT_CTRL_T *)Data; -#ifdef RT_BIG_ENDIAN - EventExtCmdResult->u4CtrlFieldID = - le2cpu16(EventExtCmdResult->u4CtrlFieldID); - EventExtCmdResult->u4CtrlSubFieldID = - le2cpu16(EventExtCmdResult->u4CtrlSubFieldID); - EventExtCmdResult->u4CtrlSetStatus = - le2cpu32(EventExtCmdResult->u4CtrlSetStatus); - EventExtCmdResult->u4CtrlGetStatus = - le2cpu32(EventExtCmdResult->u4CtrlGetStatus); - EventExtCmdResult->u4ReserveDW[0] = - le2cpu32(EventExtCmdResult->u4ReserveDW[0]); - EventExtCmdResult->u4ReserveDW[1] = - le2cpu32(EventExtCmdResult->u4ReserveDW[1]); -#endif -#if (NEW_MCU_INIT_CMD_API) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlFieldID = 0x%x, ExtCmd (0x%02x)\n", __func__, - EventExtCmdResult->u4CtrlFieldID, msg->attr.ext_type)); -#else - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlFieldID = 0x%x, ExtCmd (0x%02x)\n", __func__, - EventExtCmdResult->u4CtrlFieldID, msg->ext_cmd_type)); -#endif /* NEW_MCU_INIT_CMD_API */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlGetStatus = 0x%x\n", __func__, - EventExtCmdResult->u4CtrlGetStatus)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: u4CtrlSetStatus = 0x%x\n", __func__, - EventExtCmdResult->u4CtrlSetStatus)); -} - -/******************************/ -/* EXT_CMD_ID_DRR_CTRL = 0x36 */ -/******************************/ -/* For station DWRR configuration */ -INT32 MtCmdSetVoWDRRCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_VOW_DRR_CTRL_T *param) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_VOW_DRR_CTRL_T result; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:struct size %zu\n", __func__, sizeof(*param))); - NdisZeroMemory(&result, sizeof(result)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_DRR_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_CMD_VOW_DRR_CTRL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdSetVoWDRRCtrlRsp); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, EXT_CMD_ID_DRR_CTRL, - TRUE, /* need wait is FALSE */ - 0, TRUE, TRUE, sizeof(result), (char *)&result, - MtCmdSetVoWDRRCtrlRsp); -#endif /* NEW_MCU_INIT_CMD_API */ -#ifdef RT_BIG_ENDIAN - param->u4CtrlFieldID = cpu2le32(param->u4CtrlFieldID); - param->u4ReserveDW = cpu2le32(param->u4ReserveDW); - param->rAirTimeCtrlValue.u4ComValue = - cpu2le32(param->rAirTimeCtrlValue.u4ComValue); -#endif - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(*param)); - ret = chip_cmd_tx(pAd, msg); - - /* command TX result */ - if (ret != NDIS_STATUS_SUCCESS) - goto error; - - /* FW response event result */ - if (result.ucCtrlStatus == TRUE) - ret = NDIS_STATUS_SUCCESS; - else - ret = NDIS_STATUS_FAILURE; - -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***********************************/ -/* EXT_CMD_ID_BSSGROUP_CTRL = 0x37 */ -/***********************************/ -/* for BSS configuration */ -INT32 MtCmdSetVoWGroupCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_BSS_CTRL_T *param) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_BSS_CTRL_T result; -#ifdef RT_BIG_ENDIAN - P_BW_BSS_TOKEN_SETTING_T pSetting = NULL; - INT32 i = 0; -#endif -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:struct size %zu\n", __func__, sizeof(*param))); - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BSSGROUP_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_CMD_BSS_CTRL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdSetVoWGroupCtrlRsp); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, - EXT_CMD_ID_BSSGROUP_CTRL, TRUE, 0, TRUE, TRUE, - sizeof(result), (char *)&result, - MtCmdSetVoWGroupCtrlRsp); -#endif /* NEW_MCU_INIT_CMD_API */ -#ifdef RT_BIG_ENDIAN - param->u4CtrlFieldID = cpu2le32(param->u4CtrlFieldID); - param->u4ReserveDW = cpu2le32(param->u4ReserveDW); - param->u4SingleFieldIDValue = cpu2le32(param->u4SingleFieldIDValue); - - for (i = 0; i < (ARRAY_SIZE(param->arAllBssGroupMultiField)); i++) { - UINT32 *u32p = NULL; - pSetting = ¶m->arAllBssGroupMultiField[i]; - pSetting->u2MinRateToken = cpu2le16(pSetting->u2MinRateToken); - pSetting->u2MaxRateToken = cpu2le16(pSetting->u2MaxRateToken); - u32p = (UINT32 *)(&(pSetting->u2MinRateToken) + 2); - *u32p = cpu2le32(*u32p); - u32p++; - *u32p = cpu2le32(*u32p); - u32p++; - *u32p = cpu2le32(*u32p); - } - -#endif - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(*param)); - ret = chip_cmd_tx(pAd, msg); - - /* printk("\x1b[31m%s: ret %d\x1b[m\n", __FUNCTION__, ret); */ - /* command TX result */ - if (ret != NDIS_STATUS_SUCCESS) - goto error; - - /* printk("\x1b[31m%s: ucCtrlStatus %d\x1b[m\n", __FUNCTION__, result.ucCtrlStatus); */ - /* FW response event result */ - if (result.ucCtrlStatus == TRUE) - ret = NDIS_STATUS_SUCCESS; - else - ret = NDIS_STATUS_FAILURE; - -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/**************************************/ -/* EXT_CMD_ID_VOW_FEATURE_CTRL = 0x38 */ -/**************************************/ -/* for VOW feature control configuration */ -INT32 MtCmdSetVoWFeatureCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_VOW_FEATURE_CTRL_T *param) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_VOW_FEATURE_CTRL_T result; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ -#ifdef RT_BIG_ENDIAN - UINT16 *u16p = NULL; -#endif - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:struct size %zu\n", __func__, sizeof(*param))); - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_VOW_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_CMD_VOW_FEATURE_CTRL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdSetVoWFeatureCtrlRsp); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, - EXT_CMD_ID_VOW_FEATURE_CTRL, TRUE, 0, TRUE, TRUE, - sizeof(result), (char *)&result, - MtCmdSetVoWFeatureCtrlRsp); -#endif /* NEW_MCU_INIT_CMD_API */ -#ifdef RT_BIG_ENDIAN - param->u2IfApplyBss_0_to_16_CtrlFlag = - cpu2le16(param->u2IfApplyBss_0_to_16_CtrlFlag); - u16p = ¶m->u2IfApplyBss_0_to_16_CtrlFlag + 1; - *u16p = cpu2le16(*u16p); - param->u2IfApplyBssCheckTimeToken_0_to_16_CtrlFlag = - cpu2le16(param->u2IfApplyBssCheckTimeToken_0_to_16_CtrlFlag); - param->u2Resreve1Flag = cpu2le16(param->u2Resreve1Flag); - param->u2IfApplyBssCheckLengthToken_0_to_16_CtrlFlag = - cpu2le16(param->u2IfApplyBssCheckLengthToken_0_to_16_CtrlFlag); - param->u2Resreve2Flag = cpu2le16(param->u2Resreve2Flag); - param->u2ResreveBackupFlag[0] = cpu2le32(param->u2ResreveBackupFlag[0]); - param->u2ResreveBackupFlag[1] = cpu2le32(param->u2ResreveBackupFlag[1]); - param->u2Bss_0_to_16_CtrlValue = - cpu2le16(param->u2Bss_0_to_16_CtrlValue); - u16p = ¶m->u2Bss_0_to_16_CtrlValue + 1; - *u16p = cpu2le16(*u16p); - param->u2BssCheckTimeToken_0_to_16_CtrlValue = - cpu2le16(param->u2BssCheckTimeToken_0_to_16_CtrlValue); - param->u2Resreve1Value = cpu2le16(param->u2Resreve1Value); - param->u2BssCheckLengthToken_0_to_16_CtrlValue = - cpu2le16(param->u2BssCheckLengthToken_0_to_16_CtrlValue); - param->u2Resreve2Value = cpu2le16(param->u2Resreve2Value); - u16p = ¶m->u2Resreve2Value + 1; - *u16p = cpu2le32(*u16p); - param->u4ResreveBackupValue = cpu2le32(param->u4ResreveBackupValue); -#endif - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(*param)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/*************************************/ -/* EXT_CMD_ID_RX_AIRTIME_CTRL = 0x4a */ -/*************************************/ -/* RX airtime */ -INT32 MtCmdSetVoWRxAirtimeCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_RX_AT_CTRL_T *param) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_RX_AT_CTRL_T result; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - EXT_CMD_RX_AT_CTRL_T tparam; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:struct size %zu\n", __func__, sizeof(*param))); - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RX_AIRTIME_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_CMD_RX_AT_CTRL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdSetVoWRxAirtimeCtrlRsp); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, - EXT_CMD_ID_RX_AIRTIME_CTRL, TRUE, 0, TRUE, TRUE, - sizeof(result), (char *)&result, - MtCmdSetVoWRxAirtimeCtrlRsp); -#endif /* NEW_MCU_INIT_CMD_API */ - NdisCopyMemory(&tparam, param, sizeof(*param)); -#ifdef RT_BIG_ENDIAN - tparam.u4CtrlFieldID = cpu2le16(tparam.u4CtrlFieldID); - tparam.u4CtrlSubFieldID = cpu2le16(tparam.u4CtrlSubFieldID); - tparam.u4CtrlSetStatus = cpu2le32(tparam.u4CtrlSetStatus); - tparam.u4CtrlGetStatus = cpu2le32(tparam.u4CtrlGetStatus); - tparam.u4ReserveDW[0] = cpu2le32(tparam.u4ReserveDW[0]); - tparam.u4ReserveDW[1] = cpu2le32(tparam.u4ReserveDW[1]); - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.u4ReserveDW[0] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.u4ReserveDW[0]); - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.u4ReserveDW[1] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.u4ReserveDW[1]); - tparam.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.u4ReserveDW[0] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.u4ReserveDW[0]); - tparam.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.u4ReserveDW[1] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.u4ReserveDW[1]); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.u4ReserveDW[0] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.u4ReserveDW[0]); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.u4ReserveDW[1] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.u4ReserveDW[1]); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.rRxATBackOffCfg - .u2AC0Backoff = - cpu2le16(tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC0Backoff); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.rRxATBackOffCfg - .u2AC1Backoff = - cpu2le16(tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC1Backoff); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.rRxATBackOffCfg - .u2AC2Backoff = - cpu2le16(tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC2Backoff); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.rRxATBackOffCfg - .u2AC3Backoff = - cpu2le16(tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC3Backoff); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4RxNonWiFiBandTimer = - cpu2le32(tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl - .u4RxNonWiFiBandTimer); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4RxObssBandTimer = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4RxObssBandTimer); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4RxMibObssBandTimer = - cpu2le32(tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl - .u4RxMibObssBandTimer); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[0] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[0]); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[1] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[1]); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[2] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[2]); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[3] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[3]); -#endif - MtAndesAppendCmdMsg(msg, (char *)(&tparam), sizeof(tparam)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdGetVoWRxAirtimeCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_RX_AT_CTRL_T *param) -{ - struct cmd_msg *msg; - INT32 ret = 0; - P_EXT_CMD_RX_AT_CTRL_T p_result = param; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - EXT_CMD_RX_AT_CTRL_T tparam; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:struct size %zu\n", __func__, sizeof(*param))); - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RX_AIRTIME_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_CMD_RX_AT_CTRL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, p_result); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdSetVoWRxAirtimeCtrlRsp); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_QUERY, - EXT_CMD_ID_RX_AIRTIME_CTRL, TRUE, 0, TRUE, TRUE, - sizeof(EXT_CMD_RX_AT_CTRL_T), (char *)p_result, - MtCmdSetVoWRxAirtimeCtrlRsp); -#endif /* NEW_MCU_INIT_CMD_API */ - NdisCopyMemory(&tparam, param, sizeof(*param)); -#ifdef RT_BIG_ENDIAN - tparam.u4CtrlFieldID = cpu2le16(tparam.u4CtrlFieldID); - tparam.u4CtrlSubFieldID = cpu2le16(tparam.u4CtrlSubFieldID); - tparam.u4CtrlSetStatus = cpu2le32(tparam.u4CtrlSetStatus); - tparam.u4CtrlGetStatus = cpu2le32(tparam.u4CtrlGetStatus); - tparam.u4ReserveDW[0] = cpu2le32(tparam.u4ReserveDW[0]); - tparam.u4ReserveDW[1] = cpu2le32(tparam.u4ReserveDW[1]); - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.u4ReserveDW[0] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.u4ReserveDW[0]); - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.u4ReserveDW[1] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtFeatureSubCtrl.u4ReserveDW[1]); - tparam.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.u4ReserveDW[0] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.u4ReserveDW[0]); - tparam.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.u4ReserveDW[1] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtBitWiseSubCtrl.u4ReserveDW[1]); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.u4ReserveDW[0] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.u4ReserveDW[0]); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.u4ReserveDW[1] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.u4ReserveDW[1]); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.rRxATBackOffCfg - .u2AC0Backoff = - cpu2le16(tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC0Backoff); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.rRxATBackOffCfg - .u2AC1Backoff = - cpu2le16(tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC1Backoff); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.rRxATBackOffCfg - .u2AC2Backoff = - cpu2le16(tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC2Backoff); - tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl.rRxATBackOffCfg - .u2AC3Backoff = - cpu2le16(tparam.rRxAtGeneralCtrl.rRxAtTimeValueSubCtrl - .rRxATBackOffCfg.u2AC3Backoff); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4RxNonWiFiBandTimer = - cpu2le32(tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl - .u4RxNonWiFiBandTimer); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4RxObssBandTimer = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4RxObssBandTimer); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4RxMibObssBandTimer = - cpu2le32(tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl - .u4RxMibObssBandTimer); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[0] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[0]); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[1] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[1]); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[2] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[2]); - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[3] = cpu2le32( - tparam.rRxAtGeneralCtrl.rRxAtReportSubCtrl.u4StaAcRxTimer[3]); -#endif - MtAndesAppendCmdMsg(msg, (char *)(&tparam), sizeof(tparam)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/************************************/ -/* EXT_CMD_ID_AT_PROC_MODULE = 0x4b */ -/************************************/ -/* N9 VOW module */ -INT32 MtCmdSetVoWModuleCtrl(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_AT_PROC_MODULE_CTRL_T *param) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_AT_PROC_MODULE_CTRL_T result; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:struct size %zu\n", __func__, sizeof(*param))); - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_AT_PROC_MODULE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, - sizeof(EXT_CMD_AT_PROC_MODULE_CTRL_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &result); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdSetVoWModuleCtrlRsp); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, - EXT_CMD_ID_AT_PROC_MODULE, TRUE, 0, TRUE, TRUE, - sizeof(result), (char *)&result, - MtCmdSetVoWModuleCtrlRsp); -#endif /* NEW_MCU_INIT_CMD_API */ - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(*param)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/************************************/ -/* EXT_CMD_ID_AT_COUNTER_TEST = 0x?? */ -/************************************/ -INT32 MtCmdSetVoWCounterCtrl(struct _RTMP_ADAPTER *pAd, UCHAR cmd, UCHAR val) -{ - struct cmd_msg *msg; - INT32 ret = 0; - UCHAR param[2]; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - param[0] = cmd; - param[1] = val; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: cmd = %d, val = %d)\n", __func__, cmd, val)); - /* no wait and no reponse */ -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, 0x4c); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, 0x4c, FALSE, 0, TRUE, - FALSE, 0, NULL, NULL); -#endif /* NEW_MCU_INIT_CMD_API */ - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(param)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#endif /* VOW_SUPPORT */ -/*****************************************/ -/* ExT_CID = 0x92 */ -/*****************************************/ - -#ifdef RED_SUPPORT -/***************************************** - * ExT_CID = 0x68 - *****************************************/ -INT32 MtCmdSetRedEnable(RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 en) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - UINT32 Val; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(UINT32)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, McuDest); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RED_ENABLE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, McuDest, EXT_CID, CMD_SET, EXT_CMD_ID_RED_ENABLE, - FALSE, 0, FALSE, FALSE, 0, NULL, NULL); -#endif /* NEW_MCU_INIT_CMD_API */ - Val = cpu2le32(en); - MtAndesAppendCmdMsg(msg, (char *)&Val, sizeof(Val)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -} - -/***************************************** - * ExT_CID = 0x69 - *****************************************/ -INT32 MtCmdSetRedShowSta(RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 Num) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - UINT32 Val; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(UINT32)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, McuDest); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RED_SHOW_STA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, McuDest, EXT_CID, CMD_SET, - EXT_CMD_ID_RED_SHOW_STA, FALSE, 0, FALSE, FALSE, 0, - NULL, NULL); -#endif /* NEW_MCU_INIT_CMD_API */ - Val = cpu2le32(Num); - MtAndesAppendCmdMsg(msg, (char *)&Val, sizeof(Val)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -} - -/***************************************** - * ExT_CID = 0x6A - *****************************************/ -INT32 MtCmdSetRedTargetDelay(RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 Num) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - UINT32 Val; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(UINT32)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, McuDest); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RED_TARGET_DELAY); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, McuDest, EXT_CID, CMD_SET, - EXT_CMD_ID_RED_TARGET_DELAY, FALSE, 0, FALSE, FALSE, - 0, NULL, NULL); -#endif /* NEW_MCU_INIT_CMD_API */ - Val = cpu2le32(Num); - MtAndesAppendCmdMsg(msg, (char *)&Val, sizeof(Val)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -} -#endif /*RED_SUPPORT*/ -/***************************************** - ExT_CID = 0xA9 -*****************************************/ -#ifdef AMPDU_CONF_SUPPORT -INT32 Set_CR4_retry_counter(RTMP_ADAPTER *pAd, UINT8 api_idx, UINT8 count) -{ - struct cmd_msg *msg = NULL; - INT32 Ret = 0; - EVENT_RETRY_COUNT_UPDATE_T ExtRetryCount = { 0 }; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EVENT_RETRY_COUNT_UPDATE_T)); - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MPDU_RETRY_COUNT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - - ExtRetryCount.ucBssInfoIdx = api_idx; - ExtRetryCount.ucretrycount = count; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ucBssInfoIdx=%d, ucretrycount=%d\n", __func__, api_idx, - count)); - - MtAndesAppendCmdMsg(msg, (char *)&ExtRetryCount, - sizeof(EVENT_RETRY_COUNT_UPDATE_T)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __FUNCTION__, Ret)); - return Ret; -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, Ret)); - return Ret; -} -#endif /* AMPDU_CONF_SUPPORT*/ -#ifdef A4_CONN - -/***************************************** - ExT_CID = 0x80 -*****************************************/ -INT32 MtCmdSetA4Enable(struct _RTMP_ADAPTER *pAd, UINT8 McuDest, UINT8 Enable) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - UINT32 Val; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(UINT32)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, McuDest); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_MWDS_SUPPORT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, McuDest, EXT_CID, CMD_SET, - EXT_CMD_ID_MWDS_SUPPORT, FALSE, 0, FALSE, FALSE, 0, - NULL, NULL); -#endif /* NEW_MCU_INIT_CMD_API */ - Val = cpu2le32(Enable); - MtAndesAppendCmdMsg(msg, (char *)&Val, sizeof(Val)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __FUNCTION__, Ret)); - return Ret; -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, Ret)); - return Ret; -} - -#endif - -/***************************************** - ExT_CID = 0x98 -*****************************************/ -#ifdef PS_QUEUE_INC_SUPPORT -INT32 MtCmdSetPSQueueInc(RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 en) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - UINT32 Val; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - - msg = MtAndesAllocCmdMsg(pAd, sizeof(UINT32)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, McuDest); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PS_QUEUE_INC); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, McuDest, EXT_CID, CMD_SET, - EXT_CMD_ID_PS_QUEUE_INC, FALSE, 0, FALSE, FALSE, 0, - NULL, NULL); -#endif /* NEW_MCU_INIT_CMD_API */ - - Val = cpu2le32(en); - MtAndesAppendCmdMsg(msg, (char *)&Val, sizeof(Val)); - - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -} - -#endif -/***************************************** - * ExT_CID = 0x75 - *****************************************/ -INT32 MtCmdSetCPSEnable(RTMP_ADAPTER *pAd, UINT8 McuDest, UINT32 Mode) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - UINT32 Val; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif /* NEW_MCU_INIT_CMD_API */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(UINT32)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, McuDest); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CP_SUPPORT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, McuDest, EXT_CID, CMD_SET, EXT_CMD_ID_CP_SUPPORT, - FALSE, 0, FALSE, FALSE, 0, NULL, NULL); -#endif /* NEW_MCU_INIT_CMD_API */ - Val = cpu2le32(Mode); - MtAndesAppendCmdMsg(msg, (char *)&Val, sizeof(Val)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, Ret)); - return Ret; -} - -#ifdef CFG_TDLS_SUPPORT -/***************************************** - * ExT_CID = 0x34 - *****************************************/ -static VOID cfg_tdls_send_CH_SW_SETUP_callback(struct cmd_msg *msg, INT8 *Data, - UINT16 Len) -{ - INT32 chsw_fw_resp = 0; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; - P_EXT_EVENT_TDLS_SETUP_T prEventExtCmdResult = - (P_EXT_EVENT_TDLS_SETUP_T)Data; - chsw_fw_resp = prEventExtCmdResult->ucResultId; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("===> CHSW rsp(%d) u4StartTime(%d) u4EndTime(%d) u4TbttTime(%d) u4StayTime(%d) u4RestTime(%d)\n", - chsw_fw_resp, le2cpu32(prEventExtCmdResult->u4StartTime), - le2cpu32(prEventExtCmdResult->u4EndTime), - le2cpu32(prEventExtCmdResult->u4TbttTime), - le2cpu32(prEventExtCmdResult->u4StayTime), - le2cpu32(prEventExtCmdResult->u4RestTime))); - - if (chsw_fw_resp == 0) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("FW response!! %ld !!!\n", (jiffies * 1000) / OS_HZ)); - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.IamInOffChannel = - TRUE; - } else { - BOOLEAN TimerCancelled; - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.IamInOffChannel = - FALSE; - RTMPCancelTimer(&pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .BaseChannelSwitchTimer, - &TimerCancelled); - } -} - -INT cfg_tdls_send_CH_SW_SETUP(RTMP_ADAPTER *ad, UCHAR cmd, UCHAR offch_prim, - UCHAR offch_center, UCHAR bw_off, UCHAR role, - UINT16 stay_time, UINT32 start_time_tsf, - UINT16 switch_time, UINT16 switch_timeout) -{ - struct cmd_msg *msg; - struct _EXT_CMD_CFG_TDLS_CHSW_T CmdChanSwitch; - INT32 ret = 0, i = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(ad, sizeof(EXT_CMD_CFG_TDLS_CHSW_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_TDLS_CHSW); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 24); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, cfg_tdls_send_CH_SW_SETUP_callback); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&CmdChanSwitch, sizeof(CmdChanSwitch)); - /* CmdChanSwitch.cmd = cmd; */ - CmdChanSwitch.ucOffBandwidth = bw_off; - CmdChanSwitch.ucOffPrimaryChannel = offch_prim; - CmdChanSwitch.ucOffCenterChannelSeg0 = offch_center; - CmdChanSwitch.ucOffCenterChannelSeg1 = 0; - CmdChanSwitch.ucRole = role; - CmdChanSwitch.u4StartTimeTsf = cpu2le32(start_time_tsf); - CmdChanSwitch.u4SwitchTime = switch_time; - CmdChanSwitch.u4SwitchTimeout = switch_timeout; -#ifdef RT_BIG_ENDIAN - CmdChanSwitch.u4SwitchTime = cpu2le32(CmdChanSwitch.u4SwitchTime); - CmdChanSwitch.u4SwitchTimeout = cpu2le32(CmdChanSwitch.u4SwitchTimeout); -#endif - CmdChanSwitch.ucBssIndex = BSS0; - MtAndesAppendCmdMsg(msg, (char *)&CmdChanSwitch, sizeof(CmdChanSwitch)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("==========================send cmd=============================\n"); - ret = chip_cmd_tx(ad, msg); - error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* CFG_TDLS_SUPPORT */ - -#ifdef CONFIG_HW_HAL_OFFLOAD -/***************************************** - * ExT_CID = 0x3D - *****************************************/ -VOID MtCmdATETestResp(struct cmd_msg *msg, char *data, UINT16 len) -{ - /* RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; */ - /* struct _ATE_CTRL *ate_ctrl = &pAd->ATECtrl; */ -} - -INT32 MtCmdATETest(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_ATE_TEST_MODE_T *param) -{ - struct cmd_msg *msg; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:struct size %lu\n", __func__, (ULONG)sizeof(*param))); - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_ATE_TEST_MODE); - /* SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); */ - SET_CMD_ATTR_CTRL_FLAGS(attr, - INIT_CMD_SET); /* for iBF phase calibration */ - - /* Make sure FW command configuration completed for store TX packet in PLE first - * Use aucReserved[1] for uxATEIdx extension feasibility - */ - if (param->aucReserved[1] == INIT_CMD_SET_AND_WAIT_RETRY_RSP) { - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - param->aucReserved[1] = 0; - } - - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdATETestResp); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(*param)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdCfgOnOff(RTMP_ADAPTER *pAd, UINT8 Type, UINT8 Enable, UINT8 Band) -{ - INT32 ret = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 0; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - os_zero_mem(&ATE_param, sizeof(ATE_param)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Type:%d Enable:%d Band:%d\n", __func__, Type, Enable, - Band)); - ATE_param.ucAteTestModeEn = testmode_en; - - /* ======================================================= - * Type: - * 0: TSSI - * 1: DPD - * 2: Rate power offset - * 3: Temperature compensation - * 4: Thernal Sensor - * 5: Tx Power Ctrl - * 6: Single SKU - * 7: Power Percentage - * ======================================================== - */ - switch (Type) { - case EXT_CFG_ONOFF_TSSI: - ATE_param.ucAteIdx = EXT_ATE_SET_TSSI; - break; - - case EXT_CFG_ONOFF_DPD: - ATE_param.ucAteIdx = EXT_ATE_SET_DPD; - break; - - case EXT_CFG_ONOFF_RATE_POWER_OFFSET: - ATE_param.ucAteIdx = EXT_ATE_SET_RATE_POWER_OFFSET; - break; - - case EXT_CFG_ONOFF_TEMP_COMP: - ATE_param.ucAteIdx = EXT_ATE_SET_THERNAL_COMPENSATION; - break; - - case EXT_CFG_ONOFF_THERMAL_SENSOR: - ATE_param.ucAteIdx = EXT_ATE_CFG_THERMAL_ONOFF; - break; - - case EXT_CFG_ONOFF_TXPOWER_CTRL: - ATE_param.ucAteIdx = EXT_ATE_SET_TX_POWER_CONTROL_ALL_RF; - break; - - case EXT_CFG_ONOFF_SINGLE_SKU: - ATE_param.ucAteIdx = EXT_ATE_SET_SINGLE_SKU; - break; - - case EXT_CFG_ONOFF_POWER_PERCENTAGE: - ATE_param.ucAteIdx = EXT_ATE_SET_POWER_PERCENTAGE; - break; - - default: - break; - } - - if (Type == 5) { - ATE_param.Data.u4Data = Enable; -#ifdef RT_BIG_ENDIAN - ATE_param.Data.u4Data = cpu2le32(ATE_param.Data.u4Data); -#endif - } else { - ATE_param.Data.rCfgOnOff.ucEnable = Enable; - ATE_param.Data.rCfgOnOff.ucBand = Band; - } - - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} - -INT32 MtCmdSetAntennaPort(RTMP_ADAPTER *pAd, UINT8 RfModeMask, UINT8 RfPortMask, - UINT8 AntPortMask) -{ - INT32 ret = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 0; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - os_zero_mem(&ATE_param, sizeof(ATE_param)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, RfModeMask:%d RfPortMask:%d AntPortMask:%d\n", __func__, - RfModeMask, RfPortMask, AntPortMask)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_SET_ANTENNA_PORT; - ATE_param.Data.rCfgRfAntPortSetting.ucRfModeMask = RfModeMask; - ATE_param.Data.rCfgRfAntPortSetting.ucRfPortMask = RfPortMask; - ATE_param.Data.rCfgRfAntPortSetting.ucAntPortMask = AntPortMask; - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} - -INT32 MtCmdATESetSlotTime(RTMP_ADAPTER *pAd, UINT8 SlotTime, UINT8 SifsTime, - UINT8 RifsTime, UINT16 EifsTime, UCHAR BandIdx) -{ - INT32 ret = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 0; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - os_zero_mem(&ATE_param, sizeof(ATE_param)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_SET_SLOT_TIME; - ATE_param.Data.rSlotTimeSet.u2Eifs = cpu2le16(EifsTime); - ATE_param.Data.rSlotTimeSet.ucRifs = RifsTime; - ATE_param.Data.rSlotTimeSet.ucSifs = SifsTime; - ATE_param.Data.rSlotTimeSet.ucSlotTime = SlotTime; - ATE_param.Data.rSlotTimeSet.ucBandNum = BandIdx; - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} - -INT32 MtCmdATESetPowerDropLevel(RTMP_ADAPTER *pAd, UINT8 PowerDropLevel, - UCHAR BandIdx) -{ - INT32 ret = 0; - INT8 TxPowerDrop = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 0; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - - /* update Tx Power Drop value according to Power Drop Level */ - if ((PowerDropLevel > 90) && (PowerDropLevel < 100)) - TxPowerDrop = 0; - else if ((PowerDropLevel > 60) && - (PowerDropLevel <= 90)) /* reduce Pwr for 1 dB. */ - TxPowerDrop = 1; - else if ((PowerDropLevel > 30) && - (PowerDropLevel <= 60)) /* reduce Pwr for 3 dB. */ - TxPowerDrop = 3; - else if ((PowerDropLevel > 15) && - (PowerDropLevel <= 30)) /* reduce Pwr for 6 dB. */ - TxPowerDrop = 6; - else if ((PowerDropLevel > 9) && - (PowerDropLevel <= 15)) /* reduce Pwr for 9 dB. */ - TxPowerDrop = 9; - else if ((PowerDropLevel > 0) && - (PowerDropLevel <= 9)) /* reduce Pwr for 12 dB. */ - TxPowerDrop = 12; - - os_zero_mem(&ATE_param, sizeof(ATE_param)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_SET_POWER_PERCENTAGE_LEVEL; - ATE_param.Data.rPowerLevelSet.cPowerDropLevel = TxPowerDrop; - ATE_param.Data.rPowerLevelSet.ucBand = BandIdx; - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} - -INT32 MtCmdRxFilterPktLen(RTMP_ADAPTER *pAd, UINT8 Enable, UINT8 Band, - UINT32 RxPktLen) -{ - INT32 ret = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 0; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - os_zero_mem(&ATE_param, sizeof(ATE_param)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Enable:%d Band:%d RxPktLen:%d\n", __func__, Enable, Band, - RxPktLen)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_SET_RX_FILTER_PKT_LEN; - ATE_param.Data.rRxFilterPktLen.ucEnable = Enable; - ATE_param.Data.rRxFilterPktLen.ucBand = Band; - ATE_param.Data.rRxFilterPktLen.u4RxPktLen = cpu2le32(RxPktLen); - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} - -INT32 MtCmdSetFreqOffset(RTMP_ADAPTER *pAd, UINT32 FreqOffset) -{ - INT32 ret = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 0; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - os_zero_mem(&ATE_param, sizeof(ATE_param)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, FreqOffset:%d\n", __func__, FreqOffset)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_SET_FREQ_OFFSET; - ATE_param.Data.u4Data = cpu2le32(FreqOffset); - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} - -static VOID MtCmdGetFreqOffsetRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - EVENT_EXT_GET_FREQOFFSET_T *Result = (EVENT_EXT_GET_FREQOFFSET_T *)Data; - Result->u4FreqOffset = le2cpu32(Result->u4FreqOffset); - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, &Result->u4FreqOffset, - sizeof(Result->u4FreqOffset)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, FreqOffset:%d\n", __func__, Result->u4FreqOffset)); -} - -INT32 MtCmdGetFreqOffset(RTMP_ADAPTER *pAd, UINT32 *FreqOffsetResult) -{ - struct cmd_msg *msg; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - INT32 ret = 0; - UINT8 testmode_en = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(ATE_param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_ATE_TEST_MODE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, FreqOffsetResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetFreqOffsetRsp); - MtAndesInitCmdMsg(msg, attr); -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - NdisZeroMemory(&ATE_param, sizeof(ATE_param)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_GET_FREQ_OFFSET; -#ifdef RT_BIG_ENDIAN - ATE_param.Data.u4Data = cpu2le32(ATE_param.Data.u4Data); -#endif - MtAndesAppendCmdMsg(msg, (char *)&ATE_param, sizeof(ATE_param)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID MtCmdGetCfgStatRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - EXT_EVENT_ATE_TEST_MODE_T *Result = (EXT_EVENT_ATE_TEST_MODE_T *)Data; - GET_TSSI_STATUS_T *TSSI_Status = - (GET_TSSI_STATUS_T *)&Result->aucAteResult[0]; - GET_DPD_STATUS_T *DPD_Status = - (GET_DPD_STATUS_T *)&Result->aucAteResult[0]; - GET_THERMO_COMP_STATUS_T *THER_Status = - (GET_THERMO_COMP_STATUS_T *)&Result->aucAteResult[0]; - - switch (Result->ucAteIdx) { - case EXT_ATE_GET_TSSI: - TSSI_Status->ucEnable = le2cpu32(TSSI_Status->ucEnable); - TSSI_Status->ucBand = le2cpu32(TSSI_Status->ucBand); - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, - &TSSI_Status->ucEnable, - sizeof(TSSI_Status->ucEnable)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, TSSI Enable:%d Band:%d\n", __func__, - TSSI_Status->ucEnable, TSSI_Status->ucBand)); - break; - - case EXT_ATE_GET_DPD: - DPD_Status->ucEnable = le2cpu32(DPD_Status->ucEnable); - DPD_Status->ucBand = le2cpu32(DPD_Status->ucBand); - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, - &DPD_Status->ucEnable, - sizeof(DPD_Status->ucEnable)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, DPD Enable:%d Band:%d\n", __func__, - DPD_Status->ucEnable, DPD_Status->ucBand)); - break; - - case EXT_ATE_GET_THERNAL_COMPENSATION: - THER_Status->ucEnable = le2cpu32(THER_Status->ucEnable); - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, - &THER_Status->ucEnable, - sizeof(THER_Status->ucEnable)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, THER Enable:%d\n", __func__, - THER_Status->ucEnable)); - break; - - default: - break; - } -} - -INT32 MtCmdGetCfgOnOff(RTMP_ADAPTER *pAd, UINT32 Type, UINT8 Band, - UINT32 *Status) -{ - struct cmd_msg *msg; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - INT32 ret = 0; - UINT8 testmode_en = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(ATE_param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_ATE_TEST_MODE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, Status); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetCfgStatRsp); - MtAndesInitCmdMsg(msg, attr); -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - NdisZeroMemory(&ATE_param, sizeof(ATE_param)); - ATE_param.ucAteTestModeEn = testmode_en; - - /* Type: 0: TSSI 1: DPD 2: Rate power offset 3: Temperature compensation */ - switch (Type) { - case 0: - ATE_param.ucAteIdx = EXT_ATE_GET_TSSI; - break; - - case 1: - ATE_param.ucAteIdx = EXT_ATE_GET_DPD; - break; - - case 2: - ATE_param.ucAteIdx = EXT_ATE_GET_RATE_POWER_OFFSET; - break; - - case 3: - ATE_param.ucAteIdx = EXT_ATE_GET_THERNAL_COMPENSATION; - break; - - default: - break; - } - - ATE_param.Data.u4Data = Band; -#ifdef RT_BIG_ENDIAN - ATE_param.Data.u4Data = cpu2le32(ATE_param.Data.u4Data); -#endif - MtAndesAppendCmdMsg(msg, (char *)&ATE_param, sizeof(ATE_param)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -INT32 MtCmdSetPhyCounter(RTMP_ADAPTER *pAd, UINT32 Control, UINT8 band_idx) -{ - INT32 ret = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 1; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - os_zero_mem(&ATE_param, sizeof(ATE_param)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Control:%d\n", __func__, Control)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_SET_PHY_COUNT; - ATE_param.Data.rPhyStatusCnt.ucEnable = Control; - ATE_param.Data.rPhyStatusCnt.ucBand = band_idx; - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} - -INT32 MtCmdSetRxvIndex(RTMP_ADAPTER *pAd, UINT8 Group_1, UINT8 Group_2, - UINT8 band_idx) -{ - INT32 ret = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 0; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - os_zero_mem(&ATE_param, sizeof(ATE_param)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Group_1:%d Group_2:%d Band:%d\n", __func__, Group_1, - Group_2, band_idx)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_SET_RXV_INDEX; - ATE_param.Data.rSetRxvIdx.ucValue1 = Group_1; - ATE_param.Data.rSetRxvIdx.ucValue2 = Group_2; - ATE_param.Data.rSetRxvIdx.ucDbdcIdx = band_idx; - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} - -INT32 MtCmdSetFAGCPath(RTMP_ADAPTER *pAd, UINT8 Path, UINT8 band_idx) -{ - INT32 ret = 0; - struct _EXT_CMD_ATE_TEST_MODE_T ATE_param; - UINT8 testmode_en = 0; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - testmode_en = 1; - -#endif - os_zero_mem(&ATE_param, sizeof(ATE_param)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Path:%d Band:%d\n", __func__, Path, band_idx)); - ATE_param.ucAteTestModeEn = testmode_en; - ATE_param.ucAteIdx = EXT_ATE_SET_FAGC_PATH; - ATE_param.Data.rSetFagcRssiPath.ucValue = Path; - ATE_param.Data.rSetFagcRssiPath.ucDbdcIdx = band_idx; - ret = MtCmdATETest(pAd, &ATE_param); - return ret; -} -#endif /* CONFIG_HW_HAL_OFFLOAD */ - -INT32 MtCmdClockSwitchDisable(RTMP_ADAPTER *pAd, UINT8 isDisable) -{ - INT32 ret = 0; - struct cmd_msg *msg; - struct _CMD_MCU_CLK_SWITCH_DISABLE_T clockDisable; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_MCU_CLK_SWITCH_DISABLE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, isDisable: %d\n", __func__, isDisable)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CLOCK_SWITCH_DISABLE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&clockDisable, sizeof(clockDisable)); - clockDisable.disable = isDisable; - MtAndesAppendCmdMsg(msg, (char *)&clockDisable, sizeof(clockDisable)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x3e - *****************************************/ -INT32 MtCmdUpdateProtect(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_UPDATE_PROTECT_T *param) -{ - struct cmd_msg *msg = NULL; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PROTECT_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(*param)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -/***************************************** - * ExT_CID = 0x3f - *****************************************/ -INT32 MtCmdSetRdg(struct _RTMP_ADAPTER *pAd, struct _EXT_CMD_RDG_CTRL_T *param) -{ - struct cmd_msg *msg = NULL; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RDG_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - param->u4TxOP = cpu2le32(param->u4TxOP); -#endif - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(*param)); - ret = chip_cmd_tx(pAd, msg); -error: - - if (ret) { - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - } - - return ret; -} - -/***************************************** - * ExT_CID = 0x42 - *****************************************/ -INT32 MtCmdSetSnifferMode(struct _RTMP_ADAPTER *pAd, - struct _EXT_CMD_SNIFFER_MODE_T *param) -{ - struct cmd_msg *msg; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(*param)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SNIFFER_MODE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)param, sizeof(*param)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d) sniffer_mode:%d\n", __func__, ret, - param->ucSnifferEn)); - return ret; -} - -/***************************************** - * ExT_CID = 0x57 - *****************************************/ -static VOID CmdMemDumpRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - P_EXT_CMD_EVENT_DUMP_MEM_T PktBufEvt = (P_EXT_CMD_EVENT_DUMP_MEM_T)Data; - MEM_DUMP_DATA_T *MemDumpData = NULL; - UINT32 datasz = sizeof(PktBufEvt->ucData); - MemDumpData = (MEM_DUMP_DATA_T *)msg->attr.rsp.wb_buf_in_calbk; - os_move_mem(&MemDumpData->pValue[0], &PktBufEvt->ucData[0], datasz); -} - -VOID MtCmdMemDump(RTMP_ADAPTER *pAd, UINT32 Addr, PUINT8 pData) -{ - struct cmd_msg *msg = NULL; - EXT_CMD_EVENT_DUMP_MEM_T *CmdMemDump = NULL; - MEM_DUMP_DATA_T MemDumpData; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&MemDumpData, sizeof(MemDumpData)); - MemDumpData.pValue = pData; - os_alloc_mem(pAd, (UCHAR **)&CmdMemDump, - sizeof(EXT_CMD_EVENT_DUMP_MEM_T)); - - if (!CmdMemDump) { - ret = NDIS_STATUS_RESOURCES; - goto done; - } - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_EVENT_DUMP_MEM_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto done; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_DUMP_MEM); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(EXT_CMD_EVENT_DUMP_MEM_T)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &MemDumpData); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdMemDumpRsp); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(CmdMemDump, sizeof(EXT_CMD_EVENT_DUMP_MEM_T)); - CmdMemDump->u4MemAddr = cpu2le32(Addr); - MtAndesAppendCmdMsg(msg, (char *)CmdMemDump, - sizeof(EXT_CMD_EVENT_DUMP_MEM_T)); - ret = chip_cmd_tx(pAd, msg); - goto done; - -done: - - if (CmdMemDump) - os_free_mem(CmdMemDump); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); -} - -INT SetRaOptionFrequecyDup_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - INT32 Ret = TRUE; - struct cmd_msg *msg = NULL; - struct _CMD_ATTRIBUTE attr = { 0 }; - UINT32 u4Value; - - if (!arg) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Null Parameters\n", __func__)); - return FALSE; - } - - u4Value = os_str_tol(arg, 0, 10); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Enable=%d \n", __func__, u4Value)); - - /* Allocate memory for msg */ - msg = AndesAllocCmdMsg(pAd, sizeof(u4Value)); - if (!msg) { - Ret = 0; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RA_OPTION_FREQ_DUP); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - AndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - u4Value = cpu2le32(u4Value); -#endif - AndesAppendCmdMsg(msg, (char *)&u4Value, sizeof(u4Value)); - chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(Ret = %d\n", __func__, Ret)); - - return Ret; -} - -#if defined(TXRX_STAT_SUPPORT) || defined(EAP_STATS_SUPPORT) -INT32 MtCmdGetPerStaTxStat(RTMP_ADAPTER *pAd, UINT8 *ucEntryBitmap, - UINT8 ucEntryCount) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - EXT_CMD_GET_STA_TX_STAT_T StaTxStatCmd; - /* EXT_EVENT_STA_TX_STAT_RESULT_T CmdStaTxStatResult; */ - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(StaTxStatCmd)); - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_STA_TX_STAT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&StaTxStatCmd, sizeof(StaTxStatCmd)); - if (ucEntryBitmap) - NdisCopyMemory(StaTxStatCmd.ucEntryBitmap, ucEntryBitmap, - 16); /*16*8 = 128 client entry bitmap*/ - else - NdisFillMemory(StaTxStatCmd.ucEntryBitmap, 16, 0xff); - StaTxStatCmd.ucEntryCount = ucEntryCount; - MtAndesAppendCmdMsg(msg, (char *)&StaTxStatCmd, sizeof(StaTxStatCmd)); - Ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __FUNCTION__, Ret)); - return Ret; -} - -#endif -#if defined(CUSTOMER_RSG_FEATURE) || defined(CUSTOMER_DCC_FEATURE) -/***************************************** - ExT_CID = -*****************************************/ -INT32 MtCmdGetWtblTxStat(RTMP_ADAPTER *pAd, UINT32 u4Field, UINT8 ucWcid) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - EXT_CMD_GET_WTBL_TX_COUNT_T WtblTxCntCmd; - /* EXT_EVENT_WTBL_TX_COUNTER_RESULT_T CmdWtblTxCounterResult; */ - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(WtblTxCntCmd)); - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_WTBL_TX_COUNTER); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&WtblTxCntCmd, sizeof(WtblTxCntCmd)); - WtblTxCntCmd.u4Field = cpu2le32(u4Field); - WtblTxCntCmd.ucWlanIdx = ucWcid; - MtAndesAppendCmdMsg(msg, (char *)&WtblTxCntCmd, sizeof(WtblTxCntCmd)); - Ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __FUNCTION__, Ret)); - return Ret; -} - -#endif - -/***************************************** - * CID - *****************************************/ - -/***************************************** - * CID = 0x01 - *****************************************/ - -/***************************************** - * CID = 0x02 - *****************************************/ - -/***************************************** - * CID = 0x3 - *****************************************/ - -/***************************************** - * CID = 0x05 - *****************************************/ - -/***************************************** - * CID = 0x07 - *****************************************/ - -/***************************************** - * CID = 0x10 - *****************************************/ - -/***************************************** - * CID = 0x20 - *****************************************/ -#if !defined(COMPOS_WIN) -INT32 MtCmdHIFLoopBackTest(IN RTMP_ADAPTER *pAd, BOOLEAN IsEnable, UINT8 RxQ) -{ - struct cmd_msg *msg; - INT32 ret = 0; - CMD_HIF_LOOPBACK CmdMsg; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&CmdMsg, sizeof(CmdMsg)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdMsg)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, MT_HIF_LOOPBACK); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - CmdMsg.Loopback_Enable = IsEnable; - CmdMsg.DestinationQid = RxQ; -#ifdef RT_BIG_ENDIAN - CmdMsg.Loopback_Enable = cpu2le16(CmdMsg.Loopback_Enable); - CmdMsg.DestinationQid = cpu2le16(CmdMsg.DestinationQid); -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdMsg, sizeof(CmdMsg)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif -/***************************************** - * CID = 0xC2 - *****************************************/ - -/***************************************** - * CID = 0xED - *****************************************/ - -/***************************************** - * CID = 0xEE - *****************************************/ - -/***************************************** - * CID = 0xEF - *****************************************/ - -/****************************************** - * ROM CODE CMD - *******************************************/ - -static VOID CmdReStartDLRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - UINT8 Status; - Status = *Data; - - switch (Status) { - case WIFI_FW_DOWNLOAD_SUCCESS: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFI FW Download Success\n", __func__)); - break; - - case WIFI_FW_DOWNLOAD_INVALID_PARAM: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Invalid Parameter\n", - __func__)); - break; - - case WIFI_FW_DOWNLOAD_INVALID_CRC: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Invalid CRC\n", __func__)); - break; - - case WIFI_FW_DOWNLOAD_DECRYPTION_FAIL: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Decryption Fail\n", __func__)); - break; - - case WIFI_FW_DOWNLOAD_UNKNOWN_CMD: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Unknown CMD\n", __func__)); - break; - - case WIFI_FW_DOWNLOAD_TIMEOUT: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Timeout\n", __func__)); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Unknow Status(%d)\n", __func__, Status)); - break; - } -} - -INT32 MtCmdRestartDLReq(RTMP_ADAPTER *ad) -{ - struct cmd_msg *msg; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(ad, 0); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, MT_RESTART_DL_REQ); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 7000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdReStartDLRsp); - MtAndesInitCmdMsg(msg, attr); - ret = chip_cmd_tx(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID CmdAddrellLenRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - UINT8 Status; - Status = *Data; - - switch (Status) { - case TARGET_ADDRESS_LEN_SUCCESS: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: Request target address and length success\n", - __func__)); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Unknow Status(%d)\n", __func__, Status)); - break; - } -} - -INT32 MtCmdAddressLenReq(RTMP_ADAPTER *ad, UINT32 address, UINT32 len, - UINT32 data_mode) -{ - struct cmd_msg *msg; - int ret = 0; - UINT32 value; - struct _CMD_ATTRIBUTE attr = { 0 }; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(ad->hdev_ctrl); - - msg = MtAndesAllocCmdMsg(ad, 12); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, (address == cap->rom_patch_offset) ? - MT_PATCH_START_REQ : - MT_TARGET_ADDRESS_LEN_REQ); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdAddrellLenRsp); - MtAndesInitCmdMsg(msg, attr); - /* start address */ - value = cpu2le32(address); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - /* dl length */ - value = cpu2le32(len); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - /* data mode */ - value = cpu2le32(data_mode); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - ret = chip_cmd_tx(ad, msg); -error: - if (ret != 0) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Start address = 0x%x, DL length = %d, Data mode = 0x%x\n", - address, len, data_mode)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - } - return ret; -} - -INT32 MtCmdFwScatter(RTMP_ADAPTER *ad, UINT8 *dl_payload, UINT32 dl_len, - UINT32 count) -{ - struct cmd_msg *msg; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(ad, dl_len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, MT_FW_SCATTER); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)dl_payload, dl_len); - ret = chip_cmd_tx(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(scatter = %d, ret = %d)\n", __func__, count, ret)); - return ret; -} - -static VOID CmdPatchSemRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)msg->priv; - struct MCU_CTRL *Ctl = &pAd->MCUCtrl; - Ctl->fwdl_ctrl.sem_status = *Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Patch SEM Status = %d\n", Ctl->fwdl_ctrl.sem_status)); -} - -INT32 MtCmdPatchSemGet(RTMP_ADAPTER *ad, UINT32 Semaphore) -{ - struct cmd_msg *msg; - int ret = 0; - UINT32 value; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(ad, 4); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, MT_PATCH_SEM_CONTROL); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdPatchSemRsp); - MtAndesInitCmdMsg(msg, attr); - /* Semaphore */ - value = cpu2le32(Semaphore); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - ret = chip_cmd_tx(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID CmdPatchFinishRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - UINT8 Status; - Status = *Data; - - switch (Status) { - case WIFI_FW_DOWNLOAD_SUCCESS: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFI ROM Patch Download Success\n", __func__)); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi ROM Patch Fail (%d)\n", __func__, Status)); - break; - } -} - -INT32 MtCmdPatchFinishReq(RTMP_ADAPTER *ad) -{ - struct cmd_msg *msg; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - msg = MtAndesAllocCmdMsg(ad, 0); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, MT_PATCH_FINISH_REQ); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdPatchFinishRsp); - MtAndesInitCmdMsg(msg, attr); - ret = chip_cmd_tx(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID CmdStartDLRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - UINT8 Status; - Status = *Data; - - switch (Status) { - case WIFI_FW_DOWNLOAD_SUCCESS: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFI FW Download Success\n", __func__)); - break; - - case WIFI_FW_DOWNLOAD_INVALID_PARAM: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Invalid Parameter\n", - __func__)); - break; - - case WIFI_FW_DOWNLOAD_INVALID_CRC: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Invalid CRC\n", __func__)); - break; - - case WIFI_FW_DOWNLOAD_DECRYPTION_FAIL: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Decryption Fail\n", __func__)); - break; - - case WIFI_FW_DOWNLOAD_UNKNOWN_CMD: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Unknown CMD\n", __func__)); - break; - - case WIFI_FW_DOWNLOAD_TIMEOUT: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: WiFi FW Download Timeout\n", __func__)); - break; - - default: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Unknow Status(%d)\n", __func__, Status)); - break; - } -} - -INT32 MtCmdFwStartReq(RTMP_ADAPTER *ad, UINT32 override, UINT32 address) -{ - struct cmd_msg *msg; - int ret = 0; - UINT32 value; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: override = 0x%x, address = 0x%x\n", __func__, override, - address)); - msg = MtAndesAllocCmdMsg(ad, 8); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, MT_FW_START_REQ); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdStartDLRsp); - MtAndesInitCmdMsg(msg, attr); - /* override */ - value = cpu2le32(override); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - /* entry point address */ - value = cpu2le32(address); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - ret = chip_cmd_tx(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdFwDecompressStart( - RTMP_ADAPTER *ad, - P_INIT_CMD_WIFI_START_WITH_DECOMPRESSION decompress_info) -{ - struct cmd_msg *msg; - int ret = 0; - UINT32 value, i; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg( - ad, sizeof(INIT_CMD_WIFI_START_WITH_DECOMPRESSION)); - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, INIT_CMD_WIFI_DECOMPRESSION_START); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_NA); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_NA_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdStartDLRsp); - MtAndesInitCmdMsg(msg, attr); - /* override */ - value = cpu2le32(decompress_info->u4Override); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - /* entry point address */ - value = cpu2le32(decompress_info->u4Address); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - - value = cpu2le32(decompress_info->u4DecompressTmpAddress); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - - value = cpu2le32(decompress_info->u4BlockSize); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - - value = cpu2le32(decompress_info->u4RegionNumber); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - - for (i = 0; i < decompress_info->u4RegionNumber; i++) { - value = cpu2le32( - decompress_info->aucDecompRegion[i].u4RegionAddress); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - - value = cpu2le32( - decompress_info->aucDecompRegion[i].u4Regionlength); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - - value = cpu2le32( - decompress_info->aucDecompRegion[i].u4RegionCRC); - MtAndesAppendCmdMsg(msg, (char *)&value, 4); - } - - ret = chip_cmd_tx(ad, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#ifdef DBDC_MODE -/***************************************** - * ExT_CID = 0x45 - *****************************************/ -static VOID MtCmdGetDbdcCtrlRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - EXT_EVENT_DBDC_CTRL_T *pDbdcCmdResult = (EXT_EVENT_DBDC_CTRL_T *)Data; - BCTRL_INFO_T *pDbdcRspResult = - (BCTRL_INFO_T *)msg->attr.rsp.wb_buf_in_calbk; - INT i; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Enable=%d,TotalNum=%d\n", pDbdcCmdResult->ucDbdcEnable, - pDbdcCmdResult->ucTotalNum)); - pDbdcRspResult->TotalNum = pDbdcCmdResult->ucTotalNum; - pDbdcRspResult->DBDCEnable = pDbdcCmdResult->ucDbdcEnable; - - for (i = 0; i < pDbdcCmdResult->ucTotalNum; i++) { - pDbdcRspResult->BctrlEntries[i].Index = - pDbdcCmdResult->aBCtrlEntry[i].ucIndex; - pDbdcRspResult->BctrlEntries[i].Type = - pDbdcCmdResult->aBCtrlEntry[i].ucType; - pDbdcRspResult->BctrlEntries[i].BandIdx = - pDbdcCmdResult->aBCtrlEntry[i].ucBandIdx; - } -} - -INT32 MtCmdGetDbdcCtrl(RTMP_ADAPTER *pAd, BCTRL_INFO_T *pDbdcInfo) -{ - struct cmd_msg *msg; - EXT_CMD_DBDC_CTRL_T DbdcCtrlCmd; - INT32 ret = 0; - INT32 Len = 0, i; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&DbdcCtrlCmd, sizeof(EXT_CMD_DBDC_CTRL_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_DBDC_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = 4 + sizeof(BAND_CTRL_ENTRY_T) * pDbdcInfo->TotalNum; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_DBDC_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pDbdcInfo); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetDbdcCtrlRsp); - MtAndesInitCmdMsg(msg, attr); - DbdcCtrlCmd.ucDbdcEnable = pDbdcInfo->DBDCEnable; - DbdcCtrlCmd.ucTotalNum = pDbdcInfo->TotalNum; - - for (i = 0; i < pDbdcInfo->TotalNum; i++) { - DbdcCtrlCmd.aBCtrlEntry[i].ucType = - pDbdcInfo->BctrlEntries[i].Type; - DbdcCtrlCmd.aBCtrlEntry[i].ucIndex = - pDbdcInfo->BctrlEntries[i].Index; - } - - MtAndesAppendCmdMsg(msg, (char *)&DbdcCtrlCmd, - sizeof(EXT_CMD_DBDC_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdSetDbdcCtrl(RTMP_ADAPTER *pAd, BCTRL_INFO_T *pBandInfo) -{ - struct cmd_msg *msg; - EXT_CMD_DBDC_CTRL_T DbdcCtrlCmd; - INT32 ret = 0; - INT32 i = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&DbdcCtrlCmd, sizeof(EXT_CMD_DBDC_CTRL_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_DBDC_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_DBDC_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - DbdcCtrlCmd.ucDbdcEnable = pBandInfo->DBDCEnable; - DbdcCtrlCmd.ucTotalNum = pBandInfo->TotalNum; - - for (i = 0; i < pBandInfo->TotalNum; i++) { - DbdcCtrlCmd.aBCtrlEntry[i].ucBandIdx = - pBandInfo->BctrlEntries[i].BandIdx; - DbdcCtrlCmd.aBCtrlEntry[i].ucType = - pBandInfo->BctrlEntries[i].Type; - DbdcCtrlCmd.aBCtrlEntry[i].ucIndex = - pBandInfo->BctrlEntries[i].Index; - } - - MtAndesAppendCmdMsg(msg, (char *)&DbdcCtrlCmd, - sizeof(EXT_CMD_DBDC_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#endif /*DBDC_MODE*/ - -/***************************************** - * ExT_CID = 0x3C - *****************************************/ -static VOID MtCmdGetEdcaRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - EXT_EVENT_MAC_INFO_T *pEdcaCmdResult = (EXT_EVENT_MAC_INFO_T *)Data; - MT_EDCA_CTRL_T *pEdcaRspResult = - (MT_EDCA_CTRL_T *)msg->attr.rsp.wb_buf_in_calbk; - UINT32 i = 0; - TX_AC_PARAM_T *pAcParm; - pEdcaRspResult->ucTotalNum = - pEdcaCmdResult->aucMacInfoResult.EdcaResult.ucTotalNum; - - for (i = 0; i < pEdcaRspResult->ucTotalNum; i++) { - pAcParm = - &pEdcaCmdResult->aucMacInfoResult.EdcaResult.rAcParam[i]; - pEdcaRspResult->rAcParam[i].u2Txop = le2cpu16(pAcParm->u2Txop); - pEdcaRspResult->rAcParam[i].u2WinMax = - le2cpu16(pAcParm->u2WinMax); - pEdcaRspResult->rAcParam[i].ucAcNum = pAcParm->ucAcNum; - pEdcaRspResult->rAcParam[i].ucAifs = pAcParm->ucAifs; - pEdcaRspResult->rAcParam[i].ucWinMin = pAcParm->ucWinMin; - } -} - -INT32 MtCmdGetEdca(RTMP_ADAPTER *pAd, MT_EDCA_CTRL_T *pEdcaCtrl) -{ - struct cmd_msg *msg; - EXT_CMD_GET_MAC_INFO_T MacInfoCmd; - EXTRA_ARG_EDCA_T *pEdcaArg = &MacInfoCmd.aucExtraArgument.EdcaArg; - INT32 ret = 0; - INT32 Len = 0, i; - struct _CMD_ATTRIBUTE attr = { 0 }; - os_zero_mem(&MacInfoCmd, sizeof(EXT_CMD_GET_MAC_INFO_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GET_MAC_INFO_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = 8 + sizeof(TX_AC_PARAM_T) * pEdcaCtrl->ucTotalNum; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_MAC_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pEdcaCtrl); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetEdcaRsp); - MtAndesInitCmdMsg(msg, attr); - MacInfoCmd.u2MacInfoId = cpu2le16(MAC_INFO_TYPE_EDCA); - pEdcaArg->ucTotalAcNum = pEdcaCtrl->ucTotalNum; - - for (i = 0; i < pEdcaCtrl->ucTotalNum; i++) - pEdcaArg->au4AcIndex[i] = - cpu2le32(pEdcaCtrl->rAcParam[i].ucAcNum); - - MtAndesAppendCmdMsg(msg, (char *)&MacInfoCmd, - sizeof(EXT_CMD_GET_MAC_INFO_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID MtCmdGetChBusyCntRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - EXT_EVENT_MAC_INFO_T *pChBusyCntCmdResult = - (EXT_EVENT_MAC_INFO_T *)Data; - UINT32 *pChBusyCnt = (UINT32 *)msg->attr.rsp.wb_buf_in_calbk; - *pChBusyCnt = le2cpu32(pChBusyCntCmdResult->aucMacInfoResult - .ChBusyCntResult.u4ChBusyCnt); -} - -INT32 MtCmdGetChBusyCnt(RTMP_ADAPTER *pAd, UCHAR ChIdx, UINT32 *pChBusyCnt) -{ - struct cmd_msg *msg; - EXT_CMD_GET_MAC_INFO_T MacInfoCmd; - EXTRA_ARG_CH_BUSY_CNT_T *pChBusyCntArg = - &MacInfoCmd.aucExtraArgument.ChBusyCntArg; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - os_zero_mem(&MacInfoCmd, sizeof(EXT_CMD_GET_MAC_INFO_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GET_MAC_INFO_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = 4 + sizeof(GET_CH_BUSY_CNT_T); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_MAC_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pChBusyCnt); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetChBusyCntRsp); - MtAndesInitCmdMsg(msg, attr); - MacInfoCmd.u2MacInfoId = cpu2le16(MAC_INFO_TYPE_CHANNEL_BUSY_CNT); - pChBusyCntArg->ucBand = ChIdx; - MtAndesAppendCmdMsg(msg, (char *)&MacInfoCmd, - sizeof(EXT_CMD_GET_MAC_INFO_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID MtCmdGetWifiInterruptCntRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - INT32 i; - EXT_EVENT_MAC_INFO_T *pWifiInterruptCntCmdResult = - (EXT_EVENT_MAC_INFO_T *)Data; - UINT32 *pWifiInterruptCnt = (UINT32 *)msg->attr.rsp.wb_buf_in_calbk; - UINT32 *pResultWifiInterruptCounter = - pWifiInterruptCntCmdResult->aucMacInfoResult.WifiIntCntResult - .u4WifiInterruptCounter; - - if (pWifiInterruptCntCmdResult->u2MacInfoId == - cpu2le16(MAC_INFO_TYPE_WIFI_INT_CNT)) { - for (i = 0; i < pWifiInterruptCntCmdResult->aucMacInfoResult - .WifiIntCntResult.ucWifiInterruptNum; - i++) { - *pWifiInterruptCnt = - le2cpu32(*pResultWifiInterruptCounter); - pWifiInterruptCnt++; - pResultWifiInterruptCounter++; - } - } else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:Get Wifi Interrupt Counter Error!\n", __func__)); - } -} - -INT32 MtCmdGetWifiInterruptCnt(RTMP_ADAPTER *pAd, UCHAR ChIdx, UCHAR WifiIntNum, - UINT32 WifiIntMask, UINT32 *pWifiInterruptCnt) -{ - struct cmd_msg *msg; - EXT_CMD_GET_MAC_INFO_T MacInfoCmd; - EXTRA_ARG_WF_INTERRUPT_CNT_T *pWifiInterruptCntArg = - &MacInfoCmd.aucExtraArgument.WifiInterruptCntArg; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - os_zero_mem(&MacInfoCmd, sizeof(EXT_CMD_GET_MAC_INFO_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GET_MAC_INFO_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = (sizeof(UINT32) * WifiIntNum) + sizeof(GET_WF_INTERRUPT_CNT_T) + - 4; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_MAC_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pWifiInterruptCnt); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetWifiInterruptCntRsp); - MtAndesInitCmdMsg(msg, attr); - MacInfoCmd.u2MacInfoId = cpu2le16(MAC_INFO_TYPE_WIFI_INT_CNT); - pWifiInterruptCntArg->ucBand = ChIdx; - pWifiInterruptCntArg->ucWifiInterruptNum = WifiIntNum; - pWifiInterruptCntArg->u4WifiInterruptMask = cpu2le32(WifiIntMask); - MtAndesAppendCmdMsg(msg, (char *)&MacInfoCmd, - sizeof(EXT_CMD_GET_MAC_INFO_T)); - ret = chip_cmd_tx(pAd, msg); - return ret; -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID MtCmdGetTsfTimeRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - EXT_EVENT_MAC_INFO_T *pTsfCmdResult = (EXT_EVENT_MAC_INFO_T *)Data; - TSF_RESULT_T *pTsfResult = - (TSF_RESULT_T *)msg->attr.rsp.wb_buf_in_calbk; - pTsfResult->u4TsfBit0_31 = le2cpu32( - pTsfCmdResult->aucMacInfoResult.TsfResult.u4TsfBit0_31); - pTsfResult->u4TsfBit63_32 = le2cpu32( - pTsfCmdResult->aucMacInfoResult.TsfResult.u4TsfBit63_32); -} - -INT32 MtCmdGetTsfTime(RTMP_ADAPTER *pAd, UCHAR HwBssidIdx, - TSF_RESULT_T *pTsfResult) -{ - struct cmd_msg *msg; - EXT_CMD_GET_MAC_INFO_T MacInfoCmd; - EXTRA_ARG_TSF_T *pTsfArg = &MacInfoCmd.aucExtraArgument.TsfArg; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - os_zero_mem(&MacInfoCmd, sizeof(EXT_CMD_GET_MAC_INFO_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GET_MAC_INFO_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = 4 + sizeof(TSF_RESULT_T); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GET_MAC_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pTsfResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetTsfTimeRsp); - MtAndesInitCmdMsg(msg, attr); - MacInfoCmd.u2MacInfoId = cpu2le16(MAC_INFO_TYPE_TSF); - pTsfArg->ucHwBssidIndex = HwBssidIdx; - MtAndesAppendCmdMsg(msg, (char *)&MacInfoCmd, - sizeof(EXT_CMD_GET_MAC_INFO_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdSetMacTxRx(RTMP_ADAPTER *pAd, UCHAR BandIdx, BOOLEAN bEnable) -{ - struct cmd_msg *msg; - EXT_CMD_MAC_ENABLE_CTRL_T MacEnableCmd; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - os_zero_mem(&MacEnableCmd, sizeof(EXT_CMD_MAC_ENABLE_CTRL_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_MAC_ENABLE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_MAC_ENABLE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MacEnableCmd.ucBand = BandIdx; - - if (bEnable) - MacEnableCmd.ucMacEnable = ENUM_MAC_ENABLE; - else - MacEnableCmd.ucMacEnable = ENUM_MAC_DISABLE; - - MtAndesAppendCmdMsg(msg, (char *)&MacEnableCmd, - sizeof(EXT_CMD_MAC_ENABLE_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdSetRxvFilter(RTMP_ADAPTER *pAd, UCHAR BandIdx, BOOLEAN bEnable) -{ - struct cmd_msg *msg; - EXT_CMD_RXV_ENABLE_CTRL_T RxvEnableCmd; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - os_zero_mem(&RxvEnableCmd, sizeof(EXT_CMD_RXV_ENABLE_CTRL_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_RXV_ENABLE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_RXV_ENABLE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - RxvEnableCmd.ucBandIdx = BandIdx; - - if (bEnable) - RxvEnableCmd.ucRxvEnable = TRUE; - else - RxvEnableCmd.ucRxvEnable = FALSE; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ucRxvEnable = %d)\n", __func__, - RxvEnableCmd.ucRxvEnable)); - - MtAndesAppendCmdMsg(msg, (char *)&RxvEnableCmd, - sizeof(EXT_CMD_RXV_ENABLE_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#ifdef MT_DFS_SUPPORT -INT32 MtCmdSetDfsTxStart(RTMP_ADAPTER *pAd, UCHAR BandIdx) -{ - struct cmd_msg *msg; - EXT_CMD_MAC_ENABLE_CTRL_T MacEnableCmd; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - os_zero_mem(&MacEnableCmd, sizeof(EXT_CMD_MAC_ENABLE_CTRL_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_MAC_ENABLE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_MAC_ENABLE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MacEnableCmd.ucBand = BandIdx; - MacEnableCmd.ucMacEnable = ENUM_MAC_DFS_TXSTART; - MtAndesAppendCmdMsg(msg, (char *)&MacEnableCmd, - sizeof(EXT_CMD_MAC_ENABLE_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif -#ifdef PRE_CAL_MT7622_SUPPORT -INT32 MtCmdRfTestRecal(RTMP_ADAPTER *pAd, UINT32 u4CalId, UINT16 rsp_len) -{ - struct cmd_msg *msg; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - CMD_TEST_CTRL_T RfTestCtrl; - - os_zero_mem(&RfTestCtrl, sizeof(CMD_TEST_CTRL_T)); - RfTestCtrl.u.rRfATInfo.Data.rCalParam.u4FuncData = cpu2le32(u4CalId); - RfTestCtrl.u.rRfATInfo.Data.rCalParam.ucDbdcIdx = ENUM_BAND_0; - if (IS_MT7622(pAd)) { - os_zero_mem(&RfTestCtrl, sizeof(CMD_TEST_CTRL_T)); - RfTestCtrl.u.rRfATInfo.Data.rCalParam.u4FuncData = u4CalId; - RfTestCtrl.u.rRfATInfo.Data.rCalParam.ucDbdcIdx = ENUM_BAND_0; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(RfTestCtrl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RFTEST_RECAL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 60000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&RfTestCtrl, - sizeof(RfTestCtrl)); - ret = chip_cmd_tx(pAd, msg); - error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - } - return ret; -} -#endif /* PRE_CAL_MT7622_SUPPORT */ -#ifdef PRE_CAL_TRX_SET1_SUPPORT -static VOID MtCmdGetRXDCOCCalResultRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - EXT_CMD_GET_RXDCOC_RESULT_T *pDCOCResult = - (EXT_CMD_GET_RXDCOC_RESULT_T *)Data; - - if (pDCOCResult->DirectionToCR == TRUE) { /* Flash/BinFile to CR */ - if (pDCOCResult->RxDCOCResult.ResultSuccess) - ; - else - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d) write CR for CH %d ,BW %d FAILED!\n", - __func__, - pDCOCResult->RxDCOCResult.ResultSuccess, - le2cpu16(pDCOCResult->RxDCOCResult.u2ChFreq), - pDCOCResult->RxDCOCResult.ucBW)); - } else { /* CR to Flash/BinFile */ - if (pDCOCResult->RxDCOCResult.ResultSuccess) { - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, - &pDCOCResult->RxDCOCResult, - sizeof(RXDCOC_RESULT_T)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("========== %s GOT result ========\n", - __func__)); - } else { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d) calibration for CH %d ,BW %d FAILED!\n", - __func__, - pDCOCResult->RxDCOCResult.ResultSuccess, - le2cpu16(pDCOCResult->RxDCOCResult.u2ChFreq), - pDCOCResult->RxDCOCResult.ucBW)); - } - } -} - -INT32 MtCmdGetRXDCOCCalResult(RTMP_ADAPTER *pAd, BOOLEAN DirectionToCR, - UINT16 CentralFreq, UINT8 BW, UINT8 Band, - BOOLEAN IsSecondary80, - BOOLEAN DoRuntimeCalibration, - RXDCOC_RESULT_T *pRxDcocResult) -{ - struct cmd_msg *msg; - EXT_CMD_GET_RXDCOC_RESULT_T CmdDCOCResult; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Currently not in FLASH or BIN MODE,return.\n", - __func__)); - goto error; - } - - os_zero_mem(&CmdDCOCResult, sizeof(EXT_CMD_GET_RXDCOC_RESULT_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GET_RXDCOC_RESULT_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = sizeof(EXT_CMD_GET_RXDCOC_RESULT_T); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RXDCOC_CAL_RESULT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pRxDcocResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetRXDCOCCalResultRsp); - MtAndesInitCmdMsg(msg, attr); - CmdDCOCResult.DirectionToCR = DirectionToCR; - CmdDCOCResult.RxDCOCResult.u2ChFreq = cpu2le16(CentralFreq); - CmdDCOCResult.RxDCOCResult.ucBW = BW; - CmdDCOCResult.RxDCOCResult.ucBand = Band; - CmdDCOCResult.RxDCOCResult.DBDCEnable = pAd->CommonCfg.dbdc_mode; - CmdDCOCResult.RxDCOCResult.bSecBW80 = IsSecondary80; - CmdDCOCResult.ucDoRuntimeCalibration = DoRuntimeCalibration; - - if (DirectionToCR == TRUE) { - os_move_mem( - &CmdDCOCResult.RxDCOCResult.ucDCOCTBL_I_WF0_SX0_LNA[0], - &pRxDcocResult->ucDCOCTBL_I_WF0_SX0_LNA[0], - RXDCOC_SIZE); - } - -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)(&CmdDCOCResult.RxDCOCResult - .ucDCOCTBL_I_WF0_SX0_LNA[0]), - RXDCOC_SIZE); -#endif - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: send cmd Direction[%s] Freq [%d] Input Cent[%d] BW[%d] Band[%d] SecBW80[%d]\n", - __func__, - (CmdDCOCResult.DirectionToCR == TRUE) ? "ToCR" : "FromCR", - le2cpu16(CmdDCOCResult.RxDCOCResult.u2ChFreq), CentralFreq, - CmdDCOCResult.RxDCOCResult.ucBW, - CmdDCOCResult.RxDCOCResult.ucBand, - CmdDCOCResult.RxDCOCResult.bSecBW80)); - MtAndesAppendCmdMsg(msg, (char *)&CmdDCOCResult, - sizeof(EXT_CMD_GET_RXDCOC_RESULT_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID MtCmdGetTXDPDCalResultRsp(struct cmd_msg *msg, char *Data, - UINT16 Len) -{ - EXT_CMD_GET_TXDPD_RESULT_T *pDPDResult = - (EXT_CMD_GET_TXDPD_RESULT_T *)Data; - - if (pDPDResult->DirectionToCR == TRUE) { /* Flash/BinFile to CR */ - if (pDPDResult->TxDpdResult.ResultSuccess) - ; - else - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d) write CR for CH %d ,BW %d FAILED!\n", - __func__, - pDPDResult->TxDpdResult.ResultSuccess, - le2cpu16(pDPDResult->TxDpdResult.u2ChFreq), - pDPDResult->TxDpdResult.ucBW)); - } else { /* CR to Flash/BinFile */ - if (pDPDResult->TxDpdResult.ResultSuccess) { -#ifdef RT_BIG_ENDIAN - pDPDResult->TxDpdResult.u2ChFreq = - le2cpu16(pDPDResult->TxDpdResult.u2ChFreq); - pDPDResult->TxDpdResult.u4DPDG0_WF0_Prim = le2cpu32( - pDPDResult->TxDpdResult.u4DPDG0_WF0_Prim); - pDPDResult->TxDpdResult.u4DPDG0_WF1_Prim = le2cpu32( - pDPDResult->TxDpdResult.u4DPDG0_WF1_Prim); - pDPDResult->TxDpdResult.u4DPDG0_WF2_Prim = le2cpu32( - pDPDResult->TxDpdResult.u4DPDG0_WF2_Prim); - pDPDResult->TxDpdResult.u4DPDG0_WF2_Sec = le2cpu32( - pDPDResult->TxDpdResult.u4DPDG0_WF2_Sec); - pDPDResult->TxDpdResult.u4DPDG0_WF3_Prim = le2cpu32( - pDPDResult->TxDpdResult.u4DPDG0_WF3_Prim); - pDPDResult->TxDpdResult.u4DPDG0_WF3_Sec = le2cpu32( - pDPDResult->TxDpdResult.u4DPDG0_WF3_Sec); -#endif - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, - &pDPDResult->TxDpdResult, - sizeof(TXDPD_RESULT_T)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("========== %s GOT result ========\n", - __func__)); - } else { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d) calibration for CH %d ,BW %d FAILED!\n", - __func__, - pDPDResult->TxDpdResult.ResultSuccess, - le2cpu16(pDPDResult->TxDpdResult.u2ChFreq), - pDPDResult->TxDpdResult.ucBW)); - } - } -} - -INT32 MtCmdGetTXDPDCalResult(RTMP_ADAPTER *pAd, BOOLEAN DirectionToCR, - UINT16 CentralFreq, UINT8 BW, UINT8 Band, - BOOLEAN IsSecondary80, - BOOLEAN DoRuntimeCalibration, - TXDPD_RESULT_T *pTxDPDResult) -{ - struct cmd_msg *msg; - EXT_CMD_GET_TXDPD_RESULT_T CmdDPDResult; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - - if (pAd->E2pAccessMode != E2P_FLASH_MODE && - pAd->E2pAccessMode != E2P_BIN_MODE) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Currently not in FLASH or BIN MODE,return.\n", - __func__)); - goto error; - } - - os_zero_mem(&CmdDPDResult, sizeof(EXT_CMD_GET_TXDPD_RESULT_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GET_TXDPD_RESULT_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = sizeof(EXT_CMD_GET_TXDPD_RESULT_T); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TXDPD_CAL_RESULT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pTxDPDResult); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdGetTXDPDCalResultRsp); - MtAndesInitCmdMsg(msg, attr); - CmdDPDResult.DirectionToCR = DirectionToCR; - CmdDPDResult.TxDpdResult.u2ChFreq = cpu2le16(CentralFreq); - CmdDPDResult.TxDpdResult.ucBW = BW; - CmdDPDResult.TxDpdResult.ucBand = Band; - CmdDPDResult.TxDpdResult.DBDCEnable = pAd->CommonCfg.dbdc_mode; - CmdDPDResult.TxDpdResult.bSecBW80 = IsSecondary80; - CmdDPDResult.ucDoRuntimeCalibration = DoRuntimeCalibration; - - if (DirectionToCR == TRUE) { - os_move_mem(&CmdDPDResult.TxDpdResult.u4DPDG0_WF0_Prim, - &pTxDPDResult->u4DPDG0_WF0_Prim, TXDPD_SIZE); - } - -#ifdef RT_BIG_ENDIAN - CmdDPDResult.TxDpdResult.u4DPDG0_WF0_Prim = - cpu2le32(CmdDPDResult.TxDpdResult.u4DPDG0_WF0_Prim); - CmdDPDResult.TxDpdResult.u4DPDG0_WF1_Prim = - cpu2le32(CmdDPDResult.TxDpdResult.u4DPDG0_WF1_Prim); - CmdDPDResult.TxDpdResult.u4DPDG0_WF2_Prim = - cpu2le32(CmdDPDResult.TxDpdResult.u4DPDG0_WF2_Prim); - CmdDPDResult.TxDpdResult.u4DPDG0_WF2_Sec = - cpu2le32(CmdDPDResult.TxDpdResult.u4DPDG0_WF2_Sec); - CmdDPDResult.TxDpdResult.u4DPDG0_WF3_Prim = - cpu2le32(CmdDPDResult.TxDpdResult.u4DPDG0_WF3_Prim); - CmdDPDResult.TxDpdResult.u4DPDG0_WF3_Sec = - cpu2le32(CmdDPDResult.TxDpdResult.u4DPDG0_WF3_Sec); -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdDPDResult, - sizeof(EXT_CMD_GET_TXDPD_RESULT_T)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: send cmd Direction[%s] Freq [%d] Input Cent[%d] BW[%d] Band[%d] SecBW80[%d]\n", - __func__, - (CmdDPDResult.DirectionToCR == TRUE) ? "ToCR" : "FromCR", - le2cpu16(CmdDPDResult.TxDpdResult.u2ChFreq), CentralFreq, - CmdDPDResult.TxDpdResult.ucBW, CmdDPDResult.TxDpdResult.ucBand, - CmdDPDResult.TxDpdResult.bSecBW80)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID MtCmdRDCERsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - EXT_CMD_RDCE_VERIFY_T *pRDCEresult = (EXT_CMD_RDCE_VERIFY_T *)Data; - - if (pRDCEresult->Result) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d) RDCE VERIFY [PASS]\n", __func__, - pRDCEresult->Result)); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d) RDCE VERIFY [FAIL]\n", __func__, - pRDCEresult->Result)); - } -} - -INT32 MtCmdRDCE(RTMP_ADAPTER *pAd, UINT8 type, UINT8 BW, UINT8 Band) -{ - struct cmd_msg *msg; - EXT_CMD_RDCE_VERIFY_T CmdRDCE; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - os_zero_mem(&CmdRDCE, sizeof(EXT_CMD_RDCE_VERIFY_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_RDCE_VERIFY_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = sizeof(EXT_CMD_RDCE_VERIFY_T); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RDCE_VERIFY); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, MtCmdRDCERsp); - MtAndesInitCmdMsg(msg, attr); - CmdRDCE.Result = FALSE; - CmdRDCE.ucType = type; - CmdRDCE.ucBW = BW; - CmdRDCE.ucBand = Band; - MtAndesAppendCmdMsg(msg, (char *)&CmdRDCE, - sizeof(EXT_CMD_RDCE_VERIFY_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#endif /* PRE_CAL_TRX_SET1_SUPPORT */ - -#ifdef PRE_CAL_MT7622_SUPPORT -INT32 MtCmdSetTxLpfCal_7622(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - VOID *pCmdTxLpfInfo = NULL; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - - if (IS_MT7622(pAd)) { - Len = TxLpfCalInfoAlloc_7622(pAd, &pCmdTxLpfInfo); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TXLPF_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)pCmdTxLpfInfo, Len); - ret = chip_cmd_tx(pAd, msg); - error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - if (pCmdTxLpfInfo != NULL) - os_free_mem(pCmdTxLpfInfo); - } - return ret; -} - -INT32 MtCmdSetTxDcIqCal_7622(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - VOID *pCmdTxDcInfo = NULL; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - - Len = TxDcIqCalInfoAlloc_7622(pAd, &pCmdTxDcInfo); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[35m%s: size %d, ucDataToFromFlash %d, ucDataValid %d, u2BitMap %x\x1b[m\n", - __func__, Len, - ((P_TXDCIQ_CAL_INFO_T)pCmdTxDcInfo)->ucDataToFromFlash, - ((P_TXDCIQ_CAL_INFO_T)pCmdTxDcInfo)->ucDataValid, - ((P_TXDCIQ_CAL_INFO_T)pCmdTxDcInfo)->u2BitMap)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TXDC_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)pCmdTxDcInfo, Len); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - if (pCmdTxDcInfo != NULL) - os_free_mem(pCmdTxDcInfo); - - return ret; -} -INT32 MtCmdSetTxDpdCal_7622(RTMP_ADAPTER *pAd, UINT32 chan) -{ - struct cmd_msg *msg; - VOID *pCmdTxDpdInfo; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - - Len = TxDpdCalInfoAlloc_7622(pAd, &pCmdTxDpdInfo, chan); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[35m%s: size %d, ucDataToFromFlash %d, ucDataValid %d, u2BitMap %x, u4Chan %d\x1b[m\n", - __func__, Len, - ((P_TXDPD_CAL_INFO_T)pCmdTxDpdInfo)->ucDataToFromFlash, - ((P_TXDPD_CAL_INFO_T)pCmdTxDpdInfo)->ucDataValid, - ((P_TXDPD_CAL_INFO_T)pCmdTxDpdInfo)->u2BitMap, - ((P_TXDPD_CAL_INFO_T)pCmdTxDpdInfo)->u4Chan)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TXDPD_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)pCmdTxDpdInfo, Len); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - if (pCmdTxDpdInfo != NULL) - os_free_mem(pCmdTxDpdInfo); - - return ret; -} - -#endif /* PRE_CAL_MT7622_SUPPORT */ - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) -static INT32 MtCmdSetTxLpfCal(RTMP_ADAPTER *pAd, VOID *rlmCache) -{ - struct cmd_msg *msg; - VOID *pCmdTxLpfInfo = NULL; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; -#ifdef RT_BIG_ENDIAN - P_TXLPF_CAL_INFO_T pTxLpfCalInfo; - UINT32 i; -#endif - - Len = TxLpfCalInfoAlloc(pAd, rlmCache, &pCmdTxLpfInfo); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[35m%s: size %d, ucDataToFromFlash %d, ucDataValid %d, u2BitMap %x, cPreCalTemp %d\x1b[m\n", - __FUNCTION__, Len, - ((P_TXLPF_CAL_INFO_T)pCmdTxLpfInfo)->ucDataToFromFlash, - ((P_TXLPF_CAL_INFO_T)pCmdTxLpfInfo)->ucDataValid, - ((P_TXLPF_CAL_INFO_T)pCmdTxLpfInfo)->u2BitMap, - ((P_TXLPF_CAL_INFO_T)pCmdTxLpfInfo)->cPreCalTemp)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TXLPF_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - pTxLpfCalInfo = (P_TXLPF_CAL_INFO_T)pCmdTxLpfInfo; - pTxLpfCalInfo->u2BitMap = cpu2le16(pTxLpfCalInfo->u2BitMap); - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM; i++) - pTxLpfCalInfo->au4Data[i] = cpu2le32(pTxLpfCalInfo->au4Data[i]); -#endif - - MtAndesAppendCmdMsg(msg, (char *)pCmdTxLpfInfo, Len); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - if (pCmdTxLpfInfo != NULL) - os_free_mem(pCmdTxLpfInfo); - - return ret; -} - -static INT32 MtCmdSetTxIqCal(RTMP_ADAPTER *pAd, VOID *rlmCache) -{ - struct cmd_msg *msg; - VOID *pCmdTxIqInfo = NULL; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; -#ifdef RT_BIG_ENDIAN - P_TXIQ_CAL_INFO_T pTxIqCalInfo; - UINT32 i; -#endif - /*Len = TxIqCalInfoAlloc(pAd, pAd->rlmCalCache, &pCmdTxIqInfo);*/ - Len = TxIqCalInfoAlloc(pAd, rlmCache, &pCmdTxIqInfo); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[35m%s: size %d, ucDataToFromFlash %d, ucDataValid %d, u2BitMap %x\x1b[m\n", - __func__, Len, - ((P_TXIQ_CAL_INFO_T)pCmdTxIqInfo)->ucDataToFromFlash, - ((P_TXIQ_CAL_INFO_T)pCmdTxIqInfo)->ucDataValid, - ((P_TXIQ_CAL_INFO_T)pCmdTxIqInfo)->u2BitMap)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TXIQ_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - pTxIqCalInfo = (P_TXIQ_CAL_INFO_T)pCmdTxIqInfo; - pTxIqCalInfo->u2BitMap = cpu2le16(pTxIqCalInfo->u2BitMap); - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 6; i++) - pTxIqCalInfo->au4Data[i] = cpu2le32(pTxIqCalInfo->au4Data[i]); -#endif - MtAndesAppendCmdMsg(msg, (char *)pCmdTxIqInfo, Len); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - if (pCmdTxIqInfo != NULL) - os_free_mem(pCmdTxIqInfo); - - return ret; -} - -static INT32 MtCmdSetTxDcCal(RTMP_ADAPTER *pAd, VOID *rlmCache) -{ - struct cmd_msg *msg; - VOID *pCmdTxDcInfo = NULL; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; -#ifdef RT_BIG_ENDIAN - P_TXDC_CAL_INFO_T pTxDcCalInfo; - UINT32 i; -#endif - /*Len = TxDcCalInfoAlloc(pAd, pAd->rlmCalCache, &pCmdTxDcInfo);*/ - Len = TxDcCalInfoAlloc(pAd, rlmCache, &pCmdTxDcInfo); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[35m%s: size %d, ucDataToFromFlash %d, ucDataValid %d, u2BitMap %x\x1b[m\n", - __FUNCTION__, Len, - ((P_TXDC_CAL_INFO_T)pCmdTxDcInfo)->ucDataToFromFlash, - ((P_TXDC_CAL_INFO_T)pCmdTxDcInfo)->ucDataValid, - ((P_TXDC_CAL_INFO_T)pCmdTxDcInfo)->u2BitMap)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TXDC_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - pTxDcCalInfo = (P_TXDC_CAL_INFO_T)pCmdTxDcInfo; - pTxDcCalInfo->u2BitMap = cpu2le16(pTxDcCalInfo->u2BitMap); - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 6; i++) - pTxDcCalInfo->au4Data[i] = cpu2le32(pTxDcCalInfo->au4Data[i]); -#endif - MtAndesAppendCmdMsg(msg, (char *)pCmdTxDcInfo, Len); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - if (pCmdTxDcInfo != NULL) - os_free_mem(pCmdTxDcInfo); - - return ret; -} - -static INT32 MtCmdSetRxFiCal(RTMP_ADAPTER *pAd, VOID *rlmCache) -{ - struct cmd_msg *msg; - VOID *pCmdRxFiInfo = NULL; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; -#ifdef RT_BIG_ENDIAN - P_RXFI_CAL_INFO_T pRxFiCalInfo; - UINT32 i; -#endif - /*Len = RxFiCalInfoAlloc(pAd, pAd->rlmCalCache, &pCmdRxFiInfo);*/ - Len = RxFiCalInfoAlloc(pAd, rlmCache, &pCmdRxFiInfo); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[35m%s: size %d, ucDataToFromFlash %d, ucDataValid %d, u2BitMap %x\x1b[m\n", - __FUNCTION__, Len, - ((P_RXFI_CAL_INFO_T)pCmdRxFiInfo)->ucDataToFromFlash, - ((P_RXFI_CAL_INFO_T)pCmdRxFiInfo)->ucDataValid, - ((P_RXFI_CAL_INFO_T)pCmdRxFiInfo)->u2BitMap)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RXFI_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - pRxFiCalInfo = (P_RXFI_CAL_INFO_T)pCmdRxFiInfo; - pRxFiCalInfo->u2BitMap = cpu2le16(pRxFiCalInfo->u2BitMap); - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 4; i++) - pRxFiCalInfo->au4Data[i] = cpu2le32(pRxFiCalInfo->au4Data[i]); -#endif - MtAndesAppendCmdMsg(msg, (char *)pCmdRxFiInfo, Len); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - if (pCmdRxFiInfo != NULL) - os_free_mem(pCmdRxFiInfo); - - return ret; -} - -static INT32 MtCmdSetRxFdCal(RTMP_ADAPTER *pAd, VOID *rlmCache, UINT32 chGroup) -{ - struct cmd_msg *msg; - VOID *pCmdRxFdInfo; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; -#ifdef RT_BIG_ENDIAN - P_RXFD_CAL_INFO_T pRxFdCalInfo; - UINT32 i; -#endif - /*Len = RxFdCalInfoAlloc(pAd, pAd->rlmCalCache, &pCmdRxFdInfo, chGroup);*/ - Len = RxFdCalInfoAlloc(pAd, rlmCache, &pCmdRxFdInfo, chGroup); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[35m%s: size %d, ucDataToFromFlash %d, ucDataValid %d, u2BitMap %x, u4ChGroupId %d\x1b[m\n", - __FUNCTION__, Len, - ((P_RXFD_CAL_INFO_T)pCmdRxFdInfo)->ucDataToFromFlash, - ((P_RXFD_CAL_INFO_T)pCmdRxFdInfo)->ucDataValid, - ((P_RXFD_CAL_INFO_T)pCmdRxFdInfo)->u2BitMap, - ((P_RXFD_CAL_INFO_T)pCmdRxFdInfo)->u4ChGroupId)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RXFD_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - pRxFdCalInfo = (P_RXFD_CAL_INFO_T)pCmdRxFdInfo; - pRxFdCalInfo->u2BitMap = cpu2le16(pRxFdCalInfo->u2BitMap); - pRxFdCalInfo->u4ChGroupId = cpu2le32(pRxFdCalInfo->u4ChGroupId); - for (i = 0; i < (SCN_NUM * RX_SWAGC_LNA_NUM) + - (SCN_NUM * RX_FDIQ_LPF_GAIN_NUM * - RX_FDIQ_TABLE_SIZE * 3); - i++) - pRxFdCalInfo->au4Data[i] = cpu2le32(pRxFdCalInfo->au4Data[i]); -#endif - MtAndesAppendCmdMsg(msg, (char *)pCmdRxFdInfo, Len); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - - if (pCmdRxFdInfo != NULL) - os_free_mem(pCmdRxFdInfo); - - return ret; -} - -static INT32 MtCmdSetRlmPorCal(RTMP_ADAPTER *pAd, VOID *rlmCache) -{ - struct cmd_msg *msg; - VOID *pCmdRlmPorInfo; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - Len = RlmPorCalInfoAlloc(pAd, pAd->rlmCalCache, &pCmdRlmPorInfo); - - if (Len == 0) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, Len); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_POR_CAL_INFO); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RETRY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, Len); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)pCmdRlmPorInfo, Len); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[41m %s: (ret = %d)\x1b[m \n", __FUNCTION__, ret)); - - if (pCmdRlmPorInfo != NULL) - os_free_mem(pCmdRlmPorInfo); - - return ret; -} - -VOID rlmCalCacheApply(RTMP_ADAPTER *pAd, VOID *rlmCache) -{ - UINT32 chGroup; - - if (pAd->CommonCfg.CalCacheApply == 0) - return; - - if (!rlmCalCacheDone(rlmCache)) { - MtCmdSetRlmPorCal(pAd, rlmCache); - return; - } - - MtCmdSetTxLpfCal(pAd, rlmCache); - MtCmdSetTxIqCal(pAd, rlmCache); - MtCmdSetTxDcCal(pAd, rlmCache); - MtCmdSetRxFiCal(pAd, rlmCache); - - for (chGroup = 0; chGroup < 9; chGroup++) - MtCmdSetRxFdCal(pAd, rlmCache, chGroup); - - MtCmdSetRlmPorCal(pAd, rlmCache); -} -#endif /* defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) */ - -#ifdef PRE_CAL_TRX_SET2_SUPPORT -INT32 MtCmdGetPreCalResult(RTMP_ADAPTER *pAd, UINT8 CalId, UINT16 PreCalBitMap) -{ - struct cmd_msg *msg; - EXT_CMD_GET_PRECAL_RESULT_T PreCalCtrl; - INT32 ret = 0; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __FUNCTION__)); - PreCalCtrl.u2PreCalBitMap = cpu2le16(PreCalBitMap); - PreCalCtrl.ucCalId = CalId; - msg = MtAndesAllocCmdMsg(pAd, sizeof(PreCalCtrl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PRE_CAL_RESULT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 60000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&PreCalCtrl, sizeof(PreCalCtrl)); - ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __FUNCTION__)); - return ret; -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -INT32 MtCmdPreCalReStoreProc(RTMP_ADAPTER *pAd, INT32 *pPreCalBuffer) -{ - UINT32 IDOffset, LenOffset, Offset, Length; - UINT32 CalDataSize, HeaderSize, chGroup; - UINT16 BitMap; - RLM_CAL_CACHE *prlmFlash = NULL; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __FUNCTION__)); - /* Initialization */ - IDOffset = 0; - LenOffset = 1; /* Skip ID field */ - - /* Allocate memory for temp cahce buffer*/ - if (os_alloc_mem(pAd, (UCHAR **)&prlmFlash, sizeof(RLM_CAL_CACHE))) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[41m %s: Not enough memory for dynamic allocating !!!! \x1b[m\n", - __FUNCTION__)); - return NDIS_STATUS_FAILURE; - } - - os_zero_mem(prlmFlash, sizeof(RLM_CAL_CACHE)); - - if (*(pPreCalBuffer + IDOffset) == PRECAL_TXLPF) { - P_TXLPF_CAL_INFO_T pCalData = &prlmFlash->txLpfCalInfo; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[41m %s PRECAL_TXLPF ------------>\x1b[m\n", - __FUNCTION__)); - /* Update header size and calibration data size */ - HeaderSize = (UINT32)(uintptr_t) & - ((TXLPF_CAL_INFO_T *)NULL)->au4Data[0]; - CalDataSize = TXLPF_PER_GROUP_DATA_SIZE; - /* Query length of pre-cal item */ - Length = *(pPreCalBuffer + LenOffset); - /* Update the header */ - Offset = LenOffset + 1; - os_move_mem(&pCalData->ucDataToFromFlash, - pPreCalBuffer + Offset, HeaderSize); - /* Get bitmap */ - BitMap = pCalData->u2BitMap; - /* Update the calibration data */ - Offset += HeaderSize / sizeof(INT32); - - for (chGroup = 0; chGroup < CHANNEL_GROUP_NUM; chGroup++) { - if (BitMap & (1 << chGroup)) { - os_move_mem( - &pCalData->au4Data[chGroup * CalDataSize / - sizeof(UINT32)], - pPreCalBuffer + Offset, CalDataSize); - Offset += CalDataSize / sizeof(INT32); - } - } - - /* Update offset of parameter */ - IDOffset = LenOffset + (Length / sizeof(INT32)); - LenOffset = IDOffset + 1; /* Skip ID field */ - RLM_CAL_CACHE_TXLPF_CAL_DONE(prlmFlash); - hex_dump("PRECAL_TXLPF: ", (char *)pCalData, - sizeof(TXLPF_CAL_INFO_T)); - } - - if (*(pPreCalBuffer + IDOffset) == PRECAL_TXIQ) { - P_TXIQ_CAL_INFO_T pCalData = &prlmFlash->txIqCalInfo; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[41m %s PRECAL_TXIQ ------------>\x1b[m\n", - __FUNCTION__)); - /* Update header size and calibration data size */ - HeaderSize = (UINT32)(uintptr_t) & - ((TXIQ_CAL_INFO_T *)NULL)->au4Data[0]; - CalDataSize = TXIQ_PER_GROUP_DATA_SIZE; - /* Query length of pre-cal item */ - Length = *(pPreCalBuffer + LenOffset); - /* Update the header */ - Offset = LenOffset + 1; - os_move_mem(&pCalData->ucDataToFromFlash, - pPreCalBuffer + Offset, HeaderSize); - /* Get bitmap */ - BitMap = pCalData->u2BitMap; - /* Update the calibration data */ - Offset += HeaderSize / sizeof(INT32); - - for (chGroup = 0; chGroup < CHANNEL_GROUP_NUM; chGroup++) { - if (BitMap & (1 << chGroup)) { - os_move_mem( - &pCalData->au4Data[chGroup * CalDataSize / - sizeof(UINT32)], - pPreCalBuffer + Offset, CalDataSize); - Offset += CalDataSize / sizeof(INT32); - } - } - - /* Update offset of parameter */ - IDOffset = LenOffset + (Length / sizeof(INT32)); - LenOffset = IDOffset + 1; /* Skip ID field */ - RLM_CAL_CACHE_TXIQ_CAL_DONE(prlmFlash); - hex_dump("PRECAL_TXIQ: ", (char *)pCalData, - sizeof(TXIQ_CAL_INFO_T)); - } - - if (*(pPreCalBuffer + IDOffset) == PRECAL_TXDC) { - P_TXDC_CAL_INFO_T pCalData = &prlmFlash->txDcCalInfo; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[41m %s PRECAL_TXDC ------------>\x1b[m\n", - __FUNCTION__)); - /* Update header size and calibration data size */ - HeaderSize = (UINT32)(uintptr_t) & - ((TXDC_CAL_INFO_T *)NULL)->au4Data[0]; - CalDataSize = TXDC_PER_GROUP_DATA_SIZE; - /* Query length of pre-cal item */ - Length = *(pPreCalBuffer + LenOffset); - /* Update the header */ - Offset = LenOffset + 1; - os_move_mem(&pCalData->ucDataToFromFlash, - pPreCalBuffer + Offset, HeaderSize); - /* Get bitmap */ - BitMap = pCalData->u2BitMap; - /* Update the calibration data */ - Offset += HeaderSize / sizeof(INT32); - - for (chGroup = 0; chGroup < CHANNEL_GROUP_NUM; chGroup++) { - if (BitMap & (1 << chGroup)) { - os_move_mem( - &pCalData->au4Data[chGroup * CalDataSize / - sizeof(UINT32)], - pPreCalBuffer + Offset, CalDataSize); - Offset += CalDataSize / sizeof(INT32); - } - } - - /* Update offset of parameter */ - IDOffset = LenOffset + (Length / sizeof(INT32)); - LenOffset = IDOffset + 1; /* Skip ID field */ - RLM_CAL_CACHE_TXDC_CAL_DONE(prlmFlash); - hex_dump("PRECAL_TXDC: ", (char *)pCalData, - sizeof(TXDC_CAL_INFO_T)); - } - - for (chGroup = 0; chGroup < CHANNEL_GROUP_NUM; chGroup++) { - if (*(pPreCalBuffer + IDOffset) == PRECAL_RXFD) { - P_RXFD_CAL_CACHE_T pCalData = - &(prlmFlash->rxFdCalInfo[chGroup]); - UINT32 chGroupID; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[41m %s PRECAL_RXFD group %d------------>\x1b[m\n", - __FUNCTION__, chGroup)); - /* Update header size and calibration data size */ - HeaderSize = (UINT32)(uintptr_t) & - ((RXFD_CAL_INFO_T *)NULL)->au4Data[0]; - CalDataSize = RXFD_PER_GROUP_DATA_SIZE; - /* Query length of pre-cal item */ - Length = *(pPreCalBuffer + LenOffset); - /* Update the header */ - Offset = LenOffset + 1; - os_move_mem(&pCalData->ucDataToFromFlash, - pPreCalBuffer + Offset, HeaderSize); - /* Get bitmap */ - BitMap = pCalData->u2BitMap; - /* Get chgroup ID */ - chGroupID = pCalData->u4ChGroupId; - /* Update the calibration data */ - Offset += HeaderSize / sizeof(INT32); - - if (BitMap & (1 << chGroupID)) { - os_move_mem(&pCalData->au4Data[0], - pPreCalBuffer + Offset, - CalDataSize); - Offset += CalDataSize / sizeof(INT32); - } - - /* Update offset of parameter */ - IDOffset = LenOffset + (Length / sizeof(INT32)); - LenOffset = IDOffset + 1; /* Skip ID field */ - RLM_CAL_CACHE_RXFD_CAL_DONE(prlmFlash, chGroup); - hex_dump("PRECAL_RXFD: ", (char *)pCalData, - sizeof(RXFD_CAL_CACHE_T)); - } - } - - if (*(pPreCalBuffer + IDOffset) == PRECAL_RXFI) { - P_RXFI_CAL_INFO_T pCalData = &prlmFlash->rxFiCalInfo; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\x1b[41m %s PRECAL_RXFI ------------>\x1b[m\n", - __FUNCTION__)); - /* Update header size and calibration data size */ - HeaderSize = (UINT32)(uintptr_t) & - ((RXFI_CAL_INFO_T *)NULL)->au4Data[0]; - CalDataSize = RXFI_PER_GROUP_DATA_SIZE; - /* Query length of pre-cal item */ - Length = *(pPreCalBuffer + LenOffset); - /* Update the header */ - Offset = LenOffset + 1; - os_move_mem(&pCalData->ucDataToFromFlash, - pPreCalBuffer + Offset, HeaderSize); - /* Get bitmap */ - BitMap = pCalData->u2BitMap; - /* Update the calibration data */ - Offset += HeaderSize / sizeof(INT32); - - for (chGroup = 0; chGroup < CHANNEL_GROUP_NUM; chGroup++) { - if (BitMap & (1 << chGroup)) { - os_move_mem( - &pCalData->au4Data[chGroup * CalDataSize / - sizeof(UINT32)], - pPreCalBuffer + Offset, CalDataSize); - Offset += CalDataSize / sizeof(INT32); - } - } - - /* Update offset of parameter */ - IDOffset = LenOffset + (Length / sizeof(INT32)); - LenOffset = IDOffset + 1; /* Skip ID field */ - RLM_CAL_CACHE_RXFI_CAL_DONE(prlmFlash); - hex_dump("PRECAL_RXFI: ", (char *)pCalData, - sizeof(RXFI_CAL_INFO_T)); - } - - /* Send restored calibration data to FW*/ - MtCmdSetTxLpfCal(pAd, prlmFlash); - MtCmdSetTxIqCal(pAd, prlmFlash); - MtCmdSetTxDcCal(pAd, prlmFlash); - MtCmdSetRxFiCal(pAd, prlmFlash); - - for (chGroup = 0; chGroup < CHANNEL_GROUP_NUM; chGroup++) - MtCmdSetRxFdCal(pAd, prlmFlash, chGroup); - - os_free_mem(prlmFlash); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __FUNCTION__)); - return NDIS_STATUS_SUCCESS; -} -#endif /* PRE_CAL_TRX_SET2_SUPPORT */ - -INT32 MtCmdThermalReCalMode(RTMP_ADAPTER *pAd, UINT8 Mode) -{ - struct cmd_msg *msg; - EXT_CMD_THERMAL_RECAL_MODE_CTRL_T rThermalReCalCtrl; - INT32 ret = 0; - - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __FUNCTION__)); - - os_zero_mem(&rThermalReCalCtrl, sizeof(rThermalReCalCtrl)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(rThermalReCalCtrl)); - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - rThermalReCalCtrl.ucMode = Mode; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_THERMAL_RECAL_MODE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 60000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - - MtAndesInitCmdMsg(msg, attr); - - MtAndesAppendCmdMsg(msg, (char *)&rThermalReCalCtrl, - sizeof(rThermalReCalCtrl)); - ret = chip_cmd_tx(pAd, msg); - return ret; -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -#if defined(CAL_BIN_FILE_SUPPORT) && defined(MT7615) -INT32 MtCmdCalReStoreFromFileProc(RTMP_ADAPTER *pAd, - CAL_RESTORE_FUNC_IDX FuncIdx) -{ - INT32 Status = NDIS_STATUS_FAILURE; - - if (IS_MT7615(pAd)) { - switch (FuncIdx) { - case CAL_RESTORE_PA_TRIM: - Status = MtCmdPATrimReStoreProc(pAd); - break; - default: - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[41m%s : Not support for restoring this item !!\x1b[m\n", - __func__)); - break; - } - } - return Status; -} - -INT32 MtCmdPATrimReStoreProc(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - EXT_CMD_PA_TRIM_T PATrimCtrl; - INT32 Status = NDIS_STATUS_FAILURE, i; - UINT8 idx; - UINT16 rdAddr; - USHORT *pPATrimData = (USHORT *)&PATrimCtrl.u4Data[0]; - -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif - if (IS_MT7615(pAd)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s----------------->\n", __func__)); - - os_zero_mem(&PATrimCtrl, sizeof(EXT_CMD_PA_TRIM_T)); - PATrimCtrl.Header.ucFuncIndex = CAL_RESTORE_PA_TRIM; - PATrimCtrl.Header.u4DataLen = PA_TRIM_SIZE; - - /* Load data from EEPROM */ - rdAddr = PA_TRIM_START_ADDR1; - for (idx = 0; idx < PA_TRIM_BLOCK_SIZE; idx++) { - RT28xx_EEPROM_READ16(pAd, rdAddr, *pPATrimData); - pPATrimData++; - rdAddr += 2; - } - - rdAddr = PA_TRIM_START_ADDR2; - - for (idx = 0; idx < PA_TRIM_BLOCK_SIZE; idx++) { - RT28xx_EEPROM_READ16(pAd, rdAddr, *pPATrimData); - pPATrimData++; - rdAddr += 2; - } - - for (i = 0; i < (PA_TRIM_SIZE / sizeof(UINT32)); i++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\x1b[32m%s: WF%d = 0x%08x \x1b[m\n", - __func__, i, PATrimCtrl.u4Data[i])); - } - - msg = MtAndesAllocCmdMsg(pAd, sizeof(PATrimCtrl)); - if (!msg) { - Status = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CAL_RESTORE_FROM_FILE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 60000); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - PATrimCtrl.Header.u4DataLen = - cpu2le32(PATrimCtrl.Header.u4DataLen); - for (idx = 0; idx < 4; idx++) - PATrimCtrl.u4Data[idx] = - cpu2le32(PATrimCtrl.u4Data[idx]); -#endif - MtAndesAppendCmdMsg(msg, (char *)&PATrimCtrl, - sizeof(PATrimCtrl)); - - Status = chip_cmd_tx(pAd, msg); - - error: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(Status = %d)\n", __func__, Status)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s<-----------------\n", __func__)); - } - return Status; -} -#endif /* CAL_BIN_FILE_SUPPORT */ - -static VOID CmdWifiHifCtrlRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - struct _EVENT_EXT_CMD_RESULT_T *EventExtCmdResult = - (struct _EVENT_EXT_CMD_RESULT_T *)Data; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.ucExTenCID = 0x%x\n", __func__, - EventExtCmdResult->ucExTenCID)); - EventExtCmdResult->u4Status = le2cpu32(EventExtCmdResult->u4Status); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: EventExtCmdResult.u4Status = 0x%x\n", __func__, - EventExtCmdResult->u4Status)); - os_move_mem(msg->attr.rsp.wb_buf_in_calbk, Data, Len); -} - -INT32 MtCmdWifiHifCtrl(RTMP_ADAPTER *ad, UINT8 ucDbdcIdx, UINT8 ucHifCtrlId, - VOID *pRsult) -{ - struct cmd_msg *msg; - int ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - if (IS_MT7636(ad) || IS_MT7637(ad) || IS_MT7615(ad) || IS_MT7622(ad)) { - EXT_CMD_WIFI_HIF_CTRL_T rCmdWifiHifCtrl = { 0 }; - msg = MtAndesAllocCmdMsg(ad, sizeof(EXT_CMD_WIFI_HIF_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_WIFI_HIF_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, pRsult); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdWifiHifCtrlRsp); - MtAndesInitCmdMsg(msg, attr); - /* Need to conside eidden */ - /* Wifi Hif control ID */ - rCmdWifiHifCtrl.ucHifCtrlId = ucHifCtrlId; - rCmdWifiHifCtrl.ucDbdcIdx = ucDbdcIdx; - MtAndesAppendCmdMsg(msg, (char *)&rCmdWifiHifCtrl, - sizeof(EXT_CMD_WIFI_HIF_CTRL_T)); - ret = chip_cmd_tx(ad, msg); - error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; - } else - return ret; -} - -/***************************************** - * FW loading - ******************************************/ -NTSTATUS MtCmdPowerOnWiFiSys(RTMP_ADAPTER *pAd) -{ - NTSTATUS status = 0; -#if defined(RTMP_PCI_SUPPORT) || defined(MTK_UART_SUPPORT) -#elif defined(RTMP_USB_SUPPORT) - status = os_usb_vendor_req(pAd, USBD_TRANSFER_DIRECTION_OUT, - DEVICE_VENDOR_REQUEST_OUT, 0x04, 0, 0x01, - NULL, 0); -#endif - return status; -} - -VOID CmdExtEventRsp(struct cmd_msg *msg, char *Data, UINT16 Len) -{ - INT i; - UINT8 *pPayload = Data; - UINT16 u2PayloadLen = Len; - /* print event raw data */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("CmdEID=0x%x, EVENT[%d] = ", msg->attr.ext_type, - u2PayloadLen)); - - for (i = 0; i < u2PayloadLen; i++) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0x%x ", pPayload[i])); - } - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("\n")); -} - -INT32 MtCmdSendRaw(RTMP_ADAPTER *pAd, UCHAR ExtendID, UCHAR *Input, INT len, - UCHAR SetQuery) -{ - BOOLEAN ret = NDIS_STATUS_SUCCESS; - struct cmd_msg *msg; - struct _CMD_ATTRIBUTE attr = { 0 }; - /* send cmd to fw */ - msg = MtAndesAllocCmdMsg(pAd, len); - - if (!msg) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s AndesAllocCmdMsg error !!!\n", __func__)); - return NDIS_STATUS_RESOURCES; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, ExtendID); - SET_CMD_ATTR_CTRL_FLAGS(attr, (SetQuery) ? INIT_CMD_SET_AND_WAIT_RSP : - INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, CmdExtEventRsp); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)Input, len); - ret = chip_cmd_tx(pAd, msg); - return ret; -} - -#ifdef MT_DFS_SUPPORT -/* Remember add a RDM compiler flag - Jelly20150205 */ -INT32 MtCmdRddCtrl(IN struct _RTMP_ADAPTER *pAd, IN UCHAR ucDfsCtrl, - IN UCHAR ucRddIdex, IN UCHAR ucRddRxSel, IN UCHAR ucSetVal) -{ - struct cmd_msg *msg; - INT32 ret = 0; - UINT_16 timeOut; - struct _CMD_ATTRIBUTE attr = { 0 }; - EXT_CMD_RDD_ON_OFF_CTRL_T rRddOnOffCtrl; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[MtCmdRddCtrl] dispath CMD start\n")); - msg = MtAndesAllocCmdMsg(pAd, sizeof(rRddOnOffCtrl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - /*extend the timeout limit of CAC_END because this command will do calibration*/ - if (ucDfsCtrl == CAC_END) { - timeOut = 5000; - } else - timeOut = 0; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_RDD_ON_OFF_CTRL); -#ifdef CONFIG_RCSA_SUPPORT - if ((ucDfsCtrl == RDD_DETECT_INFO) || (ucDfsCtrl == RDD_ALTX_CTRL)) - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_RSP); - else -#endif - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, timeOut); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&rRddOnOffCtrl, sizeof(rRddOnOffCtrl)); - rRddOnOffCtrl.ucDfsCtrl = ucDfsCtrl; - rRddOnOffCtrl.ucRddIdx = ucRddIdex; - rRddOnOffCtrl.ucRddRxSel = ucRddRxSel; - rRddOnOffCtrl.ucSetVal = ucSetVal; - MtAndesAppendCmdMsg(msg, (char *)&rRddOnOffCtrl, sizeof(rRddOnOffCtrl)); - ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[MtCmdRddCtrl] dispath CMD complete\n")); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[MtCmdRddCtrl] ret = %d\n", ret)); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif - -#ifdef BACKGROUND_SCAN_SUPPORT -INT32 MtCmdBgndScan(RTMP_ADAPTER *pAd, MT_BGND_SCAN_CFG BgScCfg) -{ - struct cmd_msg *msg; - struct _EXT_CMD_CHAN_SWITCH_T CmdChanSwitch; - INT32 ret = 0, i = 0; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif - - if (BgScCfg.CentralChannel == 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: central channel = 0 is invalid\n", __func__)); - return -1; - } - - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: control_ch = %d, central_chl = %d, BW = %d,TXStream = %d, RXPath = %d, BandIdx = %d, Reason(%d)\n", - __func__, BgScCfg.ControlChannel, BgScCfg.CentralChannel, - BgScCfg.Bw, BgScCfg.TxStream, BgScCfg.RxPath, BgScCfg.BandIdx, - BgScCfg.Reason)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdChanSwitch)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_RX_PATH); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, - EXT_CMD_ID_SET_RX_PATH /*EXT_CMD_CHANNEL_SWITCH*/, - TRUE, 0, TRUE, TRUE, 8, NULL, EventExtCmdResult); -#endif - os_zero_mem(&CmdChanSwitch, sizeof(CmdChanSwitch)); - CmdChanSwitch.ucPrimCh = BgScCfg.ControlChannel; - CmdChanSwitch.ucCentralCh = BgScCfg.CentralChannel; - CmdChanSwitch.ucTxStreamNum = BgScCfg.TxStream; - CmdChanSwitch.ucRxStreamNum = BgScCfg.RxPath; /* Rx Path */ - CmdChanSwitch.ucDbdcIdx = BgScCfg.BandIdx; - CmdChanSwitch.ucBW = GetCfgBw2RawBw(BgScCfg.Bw); - CmdChanSwitch.ucSwitchReason = BgScCfg.Reason; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: control_ch = %d, central_chl = %d, BW = %d,TXStream = %d, RXStream = %d, BandIdx=%d, Reason(%d)\n", - __func__, CmdChanSwitch.ucPrimCh, CmdChanSwitch.ucCentralCh, - CmdChanSwitch.ucBW, CmdChanSwitch.ucTxStreamNum, - CmdChanSwitch.ucRxStreamNum, CmdChanSwitch.ucDbdcIdx, - CmdChanSwitch.ucSwitchReason)); - - for (i = 0; i < SKU_SIZE; i++) - CmdChanSwitch.acTxPowerSKU[i] = 0x3f; - - MtAndesAppendCmdMsg(msg, (char *)&CmdChanSwitch, sizeof(CmdChanSwitch)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdBgndScanNotify(RTMP_ADAPTER *pAd, MT_BGND_SCAN_NOTIFY BgScNotify) -{ - INT32 ret = 0; - struct cmd_msg *msg; - struct _EXT_CMD_BGND_SCAN_NOTIFY_T CmdBgndScNotify; -#if (NEW_MCU_INIT_CMD_API) - struct _CMD_ATTRIBUTE attr = { 0 }; -#endif - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: NotifyFunc = %d, BgndScanStatus = %d\n", __func__, - BgScNotify.NotifyFunc, BgScNotify.BgndScanStatus)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdBgndScNotify)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - -#if (NEW_MCU_INIT_CMD_API) - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BGND_SCAN_NOTIFY); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RETRY_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); -#else - MtAndesInitCmdMsg(msg, HOST2N9, EXT_CID, CMD_SET, - EXT_CMD_ID_BGND_SCAN_NOTIFY, TRUE, 0, TRUE, TRUE, 8, - NULL, EventExtCmdResult); -#endif - os_zero_mem(&CmdBgndScNotify, sizeof(CmdBgndScNotify)); - CmdBgndScNotify.ucNotifyFunc = BgScNotify.NotifyFunc; - CmdBgndScNotify.ucBgndScanStatus = BgScNotify.BgndScanStatus; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucNotifyFunc = %d, ucBgndScanStatus = %d\n", __func__, - CmdBgndScNotify.ucNotifyFunc, - CmdBgndScNotify.ucBgndScanStatus)); - MtAndesAppendCmdMsg(msg, (char *)&CmdBgndScNotify, - sizeof(CmdBgndScNotify)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* BACKGROUND_SCAN_SUPPORT */ - -INT32 MtCmdCr4Query(RTMP_ADAPTER *pAd, UINT32 arg0, UINT32 arg1, UINT32 arg2) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - struct _EXT_CMD_CR4_QUERY_T CmdCr4SetQuery; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - (":%s: option(%d)\n", __func__, arg0)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdCr4SetQuery)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - return Ret; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, INIT_CMD_ID_CR4); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CR4_QUERY); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdCr4SetQuery, sizeof(CmdCr4SetQuery)); - CmdCr4SetQuery.u4Cr4QueryOptionArg0 = cpu2le32(arg0); - CmdCr4SetQuery.u4Cr4QueryOptionArg1 = cpu2le32(arg1); - CmdCr4SetQuery.u4Cr4QueryOptionArg2 = cpu2le32(arg2); - MtAndesAppendCmdMsg(msg, (char *)&CmdCr4SetQuery, - sizeof(CmdCr4SetQuery)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: (ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 MtCmdCr4QueryBssAcQPktNum(struct _RTMP_ADAPTER *pAd, UINT32 u4bssbitmap) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - struct _EXT_CMD_CR4_QUERY_T CmdCr4SetQuery; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - (":%s: u4bssbitmap(0x%08X)\n", __func__, u4bssbitmap)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdCr4SetQuery)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - return Ret; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, INIT_CMD_ID_CR4); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CR4_QUERY); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdCr4SetQuery, sizeof(CmdCr4SetQuery)); - CmdCr4SetQuery.u4Cr4QueryOptionArg0 = - CR4_QUERY_OPTION_GET_BSS_ACQ_PKT_NUM; - CmdCr4SetQuery.u4Cr4QueryOptionArg1 = cpu2le32(u4bssbitmap); - CmdCr4SetQuery.u4Cr4QueryOptionArg2 = 0; -#ifdef RT_BIG_ENDIAN - CmdCr4SetQuery.u4Cr4QueryOptionArg0 = - cpu2le32(CmdCr4SetQuery.u4Cr4QueryOptionArg0); - CmdCr4SetQuery.u4Cr4QueryOptionArg2 = - cpu2le32(CmdCr4SetQuery.u4Cr4QueryOptionArg2); -#endif - MtAndesAppendCmdMsg(msg, (char *)&CmdCr4SetQuery, - sizeof(CmdCr4SetQuery)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: (ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 MtCmdCr4Set(RTMP_ADAPTER *pAd, UINT32 arg0, UINT32 arg1, UINT32 arg2) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - struct _EXT_CMD_CR4_SET_T CmdCr4SetSet; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (":%s: arg0(%d) arg1(%d) arg2(%d)\n", __func__, arg0, arg1, - arg2)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdCr4SetSet)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - return Ret; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, INIT_CMD_ID_CR4); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CR4_SET); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdCr4SetSet, sizeof(CmdCr4SetSet)); - CmdCr4SetSet.u4Cr4SetArg0 = cpu2le32(arg0); - CmdCr4SetSet.u4Cr4SetArg1 = cpu2le32(arg1); - CmdCr4SetSet.u4Cr4SetArg2 = cpu2le32(arg2); - MtAndesAppendCmdMsg(msg, (char *)&CmdCr4SetSet, sizeof(CmdCr4SetSet)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: (ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 MtCmdCr4Capability(RTMP_ADAPTER *pAd, UINT32 option) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - struct _EXT_CMD_CR4_CAPABILITY_T CmdCr4SetCapability; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (":%s: option(%d)\n", __func__, option)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdCr4SetCapability)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - return Ret; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, INIT_CMD_ID_CR4); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CR4_CAPABILITY); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdCr4SetCapability, sizeof(CmdCr4SetCapability)); - CmdCr4SetCapability.u4Cr4Capability = cpu2le32(option); - MtAndesAppendCmdMsg(msg, (char *)&CmdCr4SetCapability, - sizeof(CmdCr4SetCapability)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: (ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 MtCmdCr4Debug(RTMP_ADAPTER *pAd, UINT32 option) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - struct _EXT_CMD_CR4_DEBUG_T CmdCr4SetDebug; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (":%s: option(%d)\n", __func__, option)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdCr4SetDebug)); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - return Ret; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, INIT_CMD_ID_CR4); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_CR4_DEBUG); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdCr4SetDebug, sizeof(CmdCr4SetDebug)); - CmdCr4SetDebug.u4Cr4Debug = cpu2le32(option); - MtAndesAppendCmdMsg(msg, (char *)&CmdCr4SetDebug, - sizeof(CmdCr4SetDebug)); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: (ret = %d)\n", __func__, Ret)); - return Ret; -} - -INT32 MtCmdTxPowerSKUCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgTxPowerSKUEn, - UCHAR BandIdx) -{ - struct cmd_msg *msg; - CMD_POWER_SKU_CTRL_T PowerSKUCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgTxPowerSKUEn: %d, BandIdx: %d\n", __FUNCTION__, - fgTxPowerSKUEn, BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_SKU_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&PowerSKUCtrl, sizeof(CMD_POWER_SKU_CTRL_T)); - PowerSKUCtrl.ucPowerCtrlFormatId = SKU_FEATURE_CTRL; - PowerSKUCtrl.ucSKUEnable = fgTxPowerSKUEn; - PowerSKUCtrl.ucBandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&PowerSKUCtrl, - sizeof(CMD_POWER_SKU_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -#ifdef TXPWRMANUAL -/* Manually setting Tx power */ -INT32 MtCmdTxPowerManualCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgPwrManCtrl, - UINT8 u1TxPwrModeManual, UINT8 u1TxPwrBwManual, - UINT8 u1TxPwrRateManual, INT8 i1TxPwrValueManual, - UCHAR BandIdx) -{ - struct cmd_msg *msg; - CMD_All_POWER_MANUAL_CTRL_T PowerManualCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgPwrManCtrl: %d, u1TxPwrModeManual: %d\n", __FUNCTION__, - fgPwrManCtrl, u1TxPwrModeManual)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("u1TxPwrBwManual: %d, u1TxPwrRateManual: %d, i1TxPwrValueManual: %d, BandIdx: %d\n", - u1TxPwrBwManual, u1TxPwrRateManual, i1TxPwrValueManual, - BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_All_POWER_MANUAL_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&PowerManualCtrl, sizeof(CMD_All_POWER_MANUAL_CTRL_T)); - PowerManualCtrl.ucPowerManualCtrlFormatId = ALLTXPOWER_MANUAL_CTRL; - PowerManualCtrl.fgPwrManCtrl = fgPwrManCtrl; - PowerManualCtrl.u1TxPwrModeManual = u1TxPwrModeManual; - PowerManualCtrl.u1TxPwrBwManual = u1TxPwrBwManual; - PowerManualCtrl.u1TxPwrRateManual = u1TxPwrRateManual; - PowerManualCtrl.i1TxPwrValueManual = i1TxPwrValueManual; - PowerManualCtrl.ucBandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&PowerManualCtrl, - sizeof(CMD_All_POWER_MANUAL_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} -#endif /* TXPWRMANUAL */ - -INT32 MtCmdTxPowerPercentCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgTxPowerPercentEn, - UCHAR BandIdx) -{ - struct cmd_msg *msg; - CMD_POWER_PERCENTAGE_CTRL_T PowerPercentCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgTxPowerPercentEn: %d, BandIdx: %d\n", __FUNCTION__, - fgTxPowerPercentEn, BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_PERCENTAGE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&PowerPercentCtrl, sizeof(CMD_POWER_PERCENTAGE_CTRL_T)); - PowerPercentCtrl.ucPowerCtrlFormatId = PERCENTAGE_FEATURE_CTRL; - PowerPercentCtrl.ucPercentageEnable = fgTxPowerPercentEn; - PowerPercentCtrl.ucBandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&PowerPercentCtrl, - sizeof(CMD_POWER_PERCENTAGE_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -INT32 MtCmdTxPowerDropCtrl(RTMP_ADAPTER *pAd, UINT8 ucPowerDrop, UCHAR BandIdx) -{ - INT8 cPowerDropLevel = 0; - struct cmd_msg *msg; - CMD_POWER_PERCENTAGE_DROP_CTRL_T PowerDropCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ucPowerDrop: %d, BandIdx: %d\n", __FUNCTION__, - ucPowerDrop, BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_PERCENTAGE_DROP_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&PowerDropCtrl, sizeof(CMD_POWER_PERCENTAGE_DROP_CTRL_T)); - - /* config Tx Power Drop value */ - if ((ucPowerDrop > 90) && (ucPowerDrop < 100)) - cPowerDropLevel = 0; - else if ((ucPowerDrop > 60) && - (ucPowerDrop <= 90)) /* reduce Pwr for 1 dB. */ - cPowerDropLevel = 1; - else if ((ucPowerDrop > 30) && - (ucPowerDrop <= 60)) /* reduce Pwr for 3 dB. */ - cPowerDropLevel = 3; - else if ((ucPowerDrop > 15) && - (ucPowerDrop <= 30)) /* reduce Pwr for 6 dB. */ - cPowerDropLevel = 6; - else if ((ucPowerDrop > 9) && - (ucPowerDrop <= 15)) /* reduce Pwr for 9 dB. */ - cPowerDropLevel = 9; - else if ((ucPowerDrop > 0) && - (ucPowerDrop <= 9)) /* reduce Pwr for 12 dB. */ - cPowerDropLevel = 12; - - PowerDropCtrl.ucPowerCtrlFormatId = PERCENTAGE_DROP_CTRL; - PowerDropCtrl.cPowerDropLevel = cPowerDropLevel; - PowerDropCtrl.ucBandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&PowerDropCtrl, - sizeof(CMD_POWER_PERCENTAGE_DROP_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -INT32 MtCmdTxCCKStream(RTMP_ADAPTER *pAd, UINT8 u1CCKTxStream, UCHAR BandIdx) -{ - struct cmd_msg *msg; - CMD_TX_CCK_STREAM_CTRL_T CCKTxStreamCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: u1CCKTxStream: %d, BandIdx: %d\n", __FUNCTION__, - u1CCKTxStream, BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_TX_CCK_STREAM_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CCKTxStreamCtrl, sizeof(CMD_TX_CCK_STREAM_CTRL_T)); - - CCKTxStreamCtrl.u1CCKTxStream = u1CCKTxStream; - CCKTxStreamCtrl.ucBandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_CCK_STREAM_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CCKTxStreamCtrl, - sizeof(CMD_TX_CCK_STREAM_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -INT32 MtCmdTxBfBackoffCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgTxBFBackoffEn, - UCHAR BandIdx) -{ - struct cmd_msg *msg; - CMD_POWER_BF_BACKOFF_CTRL_T TxBFBackoffCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgTxBFBackoffEn: %d, BandIdx: %d\n", __FUNCTION__, - fgTxBFBackoffEn, BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_BF_BACKOFF_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&TxBFBackoffCtrl, sizeof(CMD_POWER_BF_BACKOFF_CTRL_T)); - TxBFBackoffCtrl.ucPowerCtrlFormatId = BF_POWER_BACKOFF_FEATURE_CTRL; - TxBFBackoffCtrl.ucBFBackoffEnable = fgTxBFBackoffEn; - TxBFBackoffCtrl.ucBandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&TxBFBackoffCtrl, - sizeof(CMD_POWER_BF_BACKOFF_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -INT32 MtCmdThermoCompCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgThermoCompEn, - UCHAR BandIdx) -{ - struct cmd_msg *msg; - CMD_POWER_THERMAL_COMP_CTRL_T ThermoCompCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgThermoCompEn: %d, BandIdx: %d\n", __FUNCTION__, - fgThermoCompEn, BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_THERMAL_COMP_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ThermoCompCtrl, sizeof(CMD_POWER_THERMAL_COMP_CTRL_T)); - ThermoCompCtrl.ucPowerCtrlFormatId = THERMAL_COMPENSATION_CTRL; - ThermoCompCtrl.fgThermalCompEn = fgThermoCompEn; - ThermoCompCtrl.ucBandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ThermoCompCtrl, - sizeof(CMD_POWER_THERMAL_COMP_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -INT32 MtCmdTxPwrRfTxAntCtrl(RTMP_ADAPTER *pAd, UINT8 ucTxAntIdx) -{ - struct cmd_msg *msg; - CMD_POWER_RF_TXANT_CTRL_T PowerRfTxAntCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ucTxAntIdx = 0x%x \n", __FUNCTION__, ucTxAntIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_RF_TXANT_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&PowerRfTxAntCtrl, sizeof(CMD_POWER_RF_TXANT_CTRL_T)); - PowerRfTxAntCtrl.ucPowerCtrlFormatId = RF_TXANT_CTRL; - PowerRfTxAntCtrl.ucTxAntIdx = ucTxAntIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&PowerRfTxAntCtrl, - sizeof(CMD_POWER_RF_TXANT_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -INT32 MtCmdTxPwrShowInfo(RTMP_ADAPTER *pAd, UCHAR ucTxPowerInfoCatg, - UINT8 ucBandIdx) -{ - struct cmd_msg *msg; - CMD_TX_POWER_SHOW_INFO_T TxPowerShowInfoCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ucTxPowerInfoCatg: %d, BandIdx: %d \n", __FUNCTION__, - ucTxPowerInfoCatg, ucBandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_TX_POWER_SHOW_INFO_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&TxPowerShowInfoCtrl, sizeof(CMD_TX_POWER_SHOW_INFO_T)); - TxPowerShowInfoCtrl.ucPowerCtrlFormatId = TX_POWER_SHOW_INFO; - TxPowerShowInfoCtrl.ucTxPowerInfoCatg = ucTxPowerInfoCatg; - TxPowerShowInfoCtrl.ucBandIdx = ucBandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&TxPowerShowInfoCtrl, - sizeof(CMD_TX_POWER_SHOW_INFO_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -#ifdef WIFI_EAP_FEATURE -RATE_TABLE_UPDATE arRateTableData[] = { - { eRateSwitchTable, eRateSwTbl11b, "RateSwitchTableAGBS11B" }, - { eRateSwitchTable, eRateSwTbl11g, "RateSwitchTableAGBS11G" }, - { eRateSwitchTable, eRateSwTbl11bg, "RateSwitchTableAGBS11BG" }, - { eRateSwitchTable, eRateSwTbl11n1ss, "RateSwitchTableAGBS11N1SS" }, - { eRateSwitchTable, eRateSwTbl11n2ss, "RateSwitchTableAGBS11N2SS" }, - { eRateSwitchTable, eRateSwTbl11n3ss, "RateSwitchTableAGBS11N3SS" }, - { eRateSwitchTable, eRateSwTbl11n4ss, "RateSwitchTableAGBS11N4SS" }, - { eRateSwitchTable, eRateSwTblvht1ss, "RateSwitchTableAGBSVht1SS" }, - { eRateSwitchTable, eRateSwTblvht2ss, "RateSwitchTableAGBSVht2SS" }, - { eRateSwitchTable, eRateSwTblvht3ss, "RateSwitchTableAGBSVht3SS" }, - { eRateSwitchTable, eRateSwTblvht4ss, "RateSwitchTableAGBSVht4SS" }, - { eRateSwitchTable, eRateSwTblvht2ssbccbw80, - "RateSwitchTableAGBSVht2SSBccBw80" }, - { eRateSwitchTable, eRateSwTblhe1ss, "RateSwitchTableAGBSHe1SS" }, - { eRateSwitchTable, eRateSwTblhe2ss, "RateSwitchTableAGBSHe2SS" }, - - { eRateHwFbTable, eRateHwFbTbl11b, "HwFallbackTable11B" }, - { eRateHwFbTable, eRateHwFbTbl11g, "HwFallbackTable11G" }, - { eRateHwFbTable, eRateHwFbTbl11bg, "HwFallbackTable11BG" }, - { eRateHwFbTable, eRateHwFbTbl11n1ss, "HwFallbackTable11N1SS" }, - { eRateHwFbTable, eRateHwFbTbl11n2ss, "HwFallbackTable11N2SS" }, - { eRateHwFbTable, eRateHwFbTbl11n3ss, "HwFallbackTable11N3SS" }, - { eRateHwFbTable, eRateHwFbTbl11n4ss, "HwFallbackTable11N4SS" }, - { eRateHwFbTable, eRateHwFbTblbgn1ss, "HwFallbackTableBGN1SS" }, - { eRateHwFbTable, eRateHwFbTblbgn2ss, "HwFallbackTableBGN2SS" }, - { eRateHwFbTable, eRateHwFbTblbgn3ss, "HwFallbackTableBGN3SS" }, - { eRateHwFbTable, eRateHwFbTblbgn4ss, "HwFallbackTableBGN4SS" }, - { eRateHwFbTable, eRateHwFbTblvht1ss, "HwFallbackTableVht1SS" }, - { eRateHwFbTable, eRateHwFbTblvht2ss, "HwFallbackTableVht2SS" }, - { eRateHwFbTable, eRateHwFbTblvht3ss, "HwFallbackTableVht3SS" }, - { eRateHwFbTable, eRateHwFbTblvht4ss, "HwFallbackTableVht4SS" }, - { eRateHwFbTable, eRateHwFbTblvht2ssbccbw80, - "HwFallbackTableVht2SSBccBw80" }, - { eRateHwFbTable, eRateHwFbTblhe1ss, "HwFallbackTableHe1SS" }, - { eRateHwFbTable, eRateHwFbTblhe2ss, "HwFallbackTableHe2SS" }, - - { eRateTableMax, 0, "\0" } -}; - -PCHAR getRaTableName(UINT8 TblType, UINT8 TblIdx) -{ - UINT8 TblArrayIdx = 0; - PCHAR TblName = "\0"; - - if (TblType >= eRateTableMax) - return TblName; - - while (arRateTableData[TblArrayIdx].u1RaTblType < eRateTableMax) { - if ((TblType == arRateTableData[TblArrayIdx].u1RaTblType) && - (TblIdx == arRateTableData[TblArrayIdx].u1RaTblIdx)) { - TblName = arRateTableData[TblArrayIdx].acTableName; - break; - } - - TblArrayIdx++; - } - - return TblName; -} - -UINT8 getRaTableIndex(UINT8 TblType, CHAR *TblName) -{ - UINT8 Index = 0; - - while (arRateTableData[Index].u1RaTblType < eRateTableMax) { - if ((arRateTableData[Index].u1RaTblType == TblType) && - (strcmp(arRateTableData[Index].acTableName, TblName) == - FALSE)) - return arRateTableData[Index].u1RaTblIdx; - - Index++; - } - - return RA_TBL_INDEX_INVALID; -} - -INT32 MtCmdSetEdccaThreshold(struct _RTMP_ADAPTER *pAd, UINT32 edcca_threshold) -{ - struct cmd_msg *msg; - CMD_SET_EDCCA_THRESHOLD rSetEdccaThreshold; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Threshold: %u\n", __func__, edcca_threshold)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(rSetEdccaThreshold)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rSetEdccaThreshold, sizeof(rSetEdccaThreshold)); - rSetEdccaThreshold.u4EapCtrlCmdId = SET_EDCCA_THRESHOLD; - rSetEdccaThreshold.u4EdccaThreshold = edcca_threshold; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EAP_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - rSetEdccaThreshold.u4EapCtrlCmdId = - cpu2le32(rSetEdccaThreshold.u4EapCtrlCmdId); - rSetEdccaThreshold.u4EdccaThreshold = - cpu2le32(rSetEdccaThreshold.u4EdccaThreshold); -#endif - MtAndesAppendCmdMsg(msg, (char *)&rSetEdccaThreshold, - sizeof(rSetEdccaThreshold)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdInitIPICtrl(RTMP_ADAPTER *pAd, UINT8 BandIdx) -{ - struct cmd_msg *msg; - CMD_INIT_IPI_CTRL_T rInitIPICtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BandIdx: %d\n", __func__, BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(rInitIPICtrl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rInitIPICtrl, sizeof(rInitIPICtrl)); - rInitIPICtrl.u4EapCtrlCmdId = INIT_IPI_CTRL; - rInitIPICtrl.u1BandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EAP_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - rInitIPICtrl.u4EapCtrlCmdId = cpu2le32(rInitIPICtrl.u4EapCtrlCmdId); -#endif - MtAndesAppendCmdMsg(msg, (char *)&rInitIPICtrl, sizeof(rInitIPICtrl)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -static VOID ShowEapRaTblInfoCallback(char *rsp_payload, UINT16 rsp_payload_len) -{ - P_EVENT_SHOW_RATE_TABLE pTblentry = - (P_EVENT_SHOW_RATE_TABLE)rsp_payload; - UINT8 NumofRow, NumofCol, RowIndex, ElemIdx; - PCHAR TblName; - CHAR *fname = NULL; - UINT32 write_size, buf_size = 512; - UCHAR buf[512]; - RTMP_OS_FD_EXT srcf; - INT retval; - - TblName = getRaTableName(pTblentry->u1RaTblTypeIdx, - pTblentry->u1RaTblIdx); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s TableType:%u TableIdx:%u RW:%u\n", __func__, - pTblentry->u1RaTblTypeIdx, pTblentry->u1RaTblIdx, - pTblentry->u1RW)); - - if (pTblentry->u1RW) { - if (pTblentry->u1RaTblTypeIdx == eRateSwitchTable) - fname = EAP_FW_RA_SWITCH_TBL_PATH; - else if (pTblentry->u1RaTblTypeIdx == eRateHwFbTable) - fname = EAP_FW_RA_HW_FB_TBL_PATH; - else - fname = NULL; - - if (!fname) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--> %s: fname is NULL\n", __func__)); - pTblentry->u1RW = 0; - } else { - memset(buf, 0, sizeof(buf)); - srcf = os_file_open(fname, - O_WRONLY | O_CREAT | O_APPEND, 0); - - if (srcf.Status) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Open file \"%s\" failed!\n", fname)); - pTblentry->u1RW = 0; - } - } - } - - if (pTblentry->u1RaTblTypeIdx == eRateSwitchTable) { - PUINT8 Buf = NULL; - - Buf = (PUINT8)pTblentry->ucBuf; - NumofCol = NUM_OF_COL_RATE_SWITCH_TABLE; - NumofRow = - (pTblentry->u2RaTblLength) / (NumofCol * sizeof(*Buf)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("NumofRow:%u\n", NumofRow)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Table:%s\nItem\tMode\tMCS\tTrnUp\tTrnDn\tUpIdx\tDnIdx" - "\tNssUp\tNssDn\tDnIdx2\tCngBw\tAM24\tAM816\tTxCnt\tCBRN\n", - TblName)); - - if (pTblentry->u1RW) { - snprintf( - buf + strlen(buf), buf_size - strlen(buf), - "Table:%s\nItem\tMode\tMCS\tTrnUp\tTrnDn\tUpIdx\tDnIdx" - "\tNssUp\tNssDn\tDnIdx2\tCngBw\tAM24\tAM816\tTxCnt\tCBRN\n", - TblName); - - write_size = strlen(buf); - retval = os_file_write(srcf, buf, write_size); - - if (retval <= 0) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Write file \"%s\" failed for header!\n", - fname)); - - memset(buf, 0, buf_size); - } - - for (RowIndex = 0; RowIndex < NumofRow; RowIndex++) { - ElemIdx = RowIndex * NumofCol; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u" - "\t%u\t%u\t%u\t%u\n", - Buf[ElemIdx], Buf[ElemIdx + 1], - Buf[ElemIdx + 2], Buf[ElemIdx + 3], - Buf[ElemIdx + 4], Buf[ElemIdx + 5], - Buf[ElemIdx + 6], Buf[ElemIdx + 7], - Buf[ElemIdx + 8], Buf[ElemIdx + 9], - Buf[ElemIdx + 10], Buf[ElemIdx + 11], - Buf[ElemIdx + 12], Buf[ElemIdx + 13], - Buf[ElemIdx + 14])); - - if (pTblentry->u1RW) { - snprintf( - buf + strlen(buf), - buf_size - strlen(buf), - "%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u" - "\t%u\t%u\t%u\n", - Buf[ElemIdx], Buf[ElemIdx + 1], - Buf[ElemIdx + 2], Buf[ElemIdx + 3], - Buf[ElemIdx + 4], Buf[ElemIdx + 5], - Buf[ElemIdx + 6], Buf[ElemIdx + 7], - Buf[ElemIdx + 8], Buf[ElemIdx + 9], - Buf[ElemIdx + 10], Buf[ElemIdx + 11], - Buf[ElemIdx + 12], Buf[ElemIdx + 13], - Buf[ElemIdx + 14]); - - write_size = strlen(buf); - retval = os_file_write(srcf, buf, write_size); - - if (retval <= 0) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Write file \"%s\" failed for row:%d!\n", - fname, RowIndex)); - - memset(buf, 0, buf_size); - } - } - } else if (pTblentry->u1RaTblTypeIdx == eRateHwFbTable) { - PUINT16 Buf = NULL; - - Buf = (PUINT16)pTblentry->ucBuf; - NumofCol = NUM_OF_COL_RATE_HWFB_TABLE; - NumofRow = - (pTblentry->u2RaTblLength) / (NumofCol * sizeof(*Buf)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("NumofRow:%u\n", NumofRow)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Table:%s\nRate1\tRate2\tRate3\tRate4" - "\tRate5\tRate6\tRate7\tRate8\n", - TblName)); - - if (pTblentry->u1RW) { - snprintf(buf + strlen(buf), buf_size - strlen(buf), - "Table:%s\nRate1\tRate2\tRate3\tRate4" - "\tRate5\tRate6\tRate7\tRate8\n", - TblName); - write_size = strlen(buf); - retval = os_file_write(srcf, buf, write_size); - - if (retval <= 0) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Write file \"%s\" failed for header!\n", - fname)); - - memset(buf, 0, buf_size); - } - - for (RowIndex = 0; RowIndex < NumofRow; RowIndex++) { - ElemIdx = RowIndex * NumofCol; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\n", - Buf[ElemIdx], Buf[ElemIdx + 1], - Buf[ElemIdx + 2], Buf[ElemIdx + 3], - Buf[ElemIdx + 4], Buf[ElemIdx + 5], - Buf[ElemIdx + 6], Buf[ElemIdx + 7])); - - if (pTblentry->u1RW) { - snprintf(buf + strlen(buf), - buf_size - strlen(buf), - "%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\n", - Buf[ElemIdx], Buf[ElemIdx + 1], - Buf[ElemIdx + 2], Buf[ElemIdx + 3], - Buf[ElemIdx + 4], Buf[ElemIdx + 5], - Buf[ElemIdx + 6], Buf[ElemIdx + 7]); - - write_size = strlen(buf); - retval = os_file_write(srcf, buf, write_size); - - if (retval <= 0) - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Write file \"%s\" failed for row:%d!\n", - fname, RowIndex)); - - memset(buf, 0, buf_size); - } - } - } - - if (pTblentry->u1RW) { - if (os_file_close(srcf) != 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Close file \"%s\" failed!\n", fname)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Successfully written in \"%s\"!\n", fname)); - } - } -} - -static VOID ShowEapIPIValueCallback(char *rsp_payload, UINT16 rsp_payload_len) -{ - P_EVENT_GET_IPI_VALUE pMentry = (P_EVENT_GET_IPI_VALUE)rsp_payload; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s\n", __func__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IPI value:[0] %x [1] %x [2] %x [3] %x", - le2cpu32(pMentry->au4IPIValue[0]), - le2cpu32(pMentry->au4IPIValue[1]), - le2cpu32(pMentry->au4IPIValue[2]), - le2cpu32(pMentry->au4IPIValue[3]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IPI value:[4] %x [5] %x [6] %x [7] %x", - le2cpu32(pMentry->au4IPIValue[4]), - le2cpu32(pMentry->au4IPIValue[5]), - le2cpu32(pMentry->au4IPIValue[6]), - le2cpu32(pMentry->au4IPIValue[7]))); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("IPI value:[8] %x [9] %x [10] %x", - le2cpu32(pMentry->au4IPIValue[8]), - le2cpu32(pMentry->au4IPIValue[9]), - le2cpu32(pMentry->au4IPIValue[10]))); -} - -static VOID eapEventDispatcher(struct cmd_msg *msg, char *rsp_payload, - UINT16 rsp_payload_len) -{ - UINT32 u4EventId = (*(UINT32 *)rsp_payload); - char *pData = (rsp_payload); - UINT16 len = (rsp_payload_len); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: u4EventId = %u, len = %u\n", __func__, u4EventId, len)); -#ifdef RT_BIG_ENDIAN - u4EventId = cpu2le32(u4EventId); -#endif - - switch (u4EventId) { - case EAP_EVENT_IPI_VALUE: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: EAP_EVENT_IPI_VALUE\n", __func__)); - ShowEapIPIValueCallback(pData, len); - break; - - case EAP_EVENT_SHOW_RATE_TABLE: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: EAP_EVENT_SHOW_RATE_TABLE\n", __func__)); - ShowEapRaTblInfoCallback(pData, len); - break; - - default: - break; - } -} - -INT32 MtCmdGetIPIValue(RTMP_ADAPTER *pAd, UINT8 BandIdx) -{ - struct cmd_msg *msg; - CMD_GET_IPI_VALUE rGetIPIVal; - EVENT_GET_IPI_VALUE rIPIValue; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BandIdx: %d\n", __func__, BandIdx)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(rGetIPIVal)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rGetIPIVal, sizeof(rGetIPIVal)); - rGetIPIVal.u4EapCtrlCmdId = GET_IPI_VALUE; - rGetIPIVal.u1BandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EAP_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(rIPIValue)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &rIPIValue); - SET_CMD_ATTR_RSP_HANDLER(attr, eapEventDispatcher); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - rGetIPIVal.u4EapCtrlCmdId = cpu2le32(rGetIPIVal.u4EapCtrlCmdId); -#endif - MtAndesAppendCmdMsg(msg, (char *)&rGetIPIVal, sizeof(rGetIPIVal)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdSetDataTxPwrOffset(IN PRTMP_ADAPTER pAd, IN UINT8 WlanIdx, - IN INT8 TxPwr_Offset, IN UINT8 BandIdx) -{ - struct cmd_msg *msg; - CMD_SET_DATA_TXPWR_OFFSET rSetDataTxPwrOffset; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(rSetDataTxPwrOffset)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rSetDataTxPwrOffset, sizeof(rSetDataTxPwrOffset)); - rSetDataTxPwrOffset.u4EapCtrlCmdId = SET_DATA_TXPWR_OFFSET; - rSetDataTxPwrOffset.u1WlanIdx = WlanIdx; - rSetDataTxPwrOffset.i1TxPwrOffset = TxPwr_Offset; - rSetDataTxPwrOffset.u1BandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EAP_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - rSetDataTxPwrOffset.u4EapCtrlCmdId = - cpu2le32(rSetDataTxPwrOffset.u4EapCtrlCmdId); -#endif - MtAndesAppendCmdMsg(msg, (char *)&rSetDataTxPwrOffset, - sizeof(rSetDataTxPwrOffset)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdSetRaTable(PRTMP_ADAPTER pAd, UINT8 BandIdx, UINT8 TblType, - UINT8 TblIndex, UINT16 TblLength, PUCHAR Buffer) -{ - struct cmd_msg *msg; - CMD_SET_RA_TABLE rSetRaTblParams; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - UINT_16 Length = 0; - - if (!Buffer) { - ret = NDIS_STATUS_INVALID_DATA; - goto error; - } - - Length = sizeof(rSetRaTblParams) + TblLength - - sizeof(rSetRaTblParams.ucBuf); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TblType:%u TblIdx:%u BandIdx: %u, Length:%u\n", __func__, - TblType, TblIndex, BandIdx, Length)); - - msg = MtAndesAllocCmdMsg(pAd, Length); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rSetRaTblParams, Length); - rSetRaTblParams.u4EapCtrlCmdId = SET_RA_TABLE_DATA; - rSetRaTblParams.u1RaTblTypeIdx = TblType; - rSetRaTblParams.u1RaTblIdx = TblIndex; - rSetRaTblParams.u1BandIdx = BandIdx; - rSetRaTblParams.u2RaTblLength = TblLength; - os_move_mem(rSetRaTblParams.ucBuf, Buffer, TblLength); - -#ifdef RT_BIG_ENDIAN - rSetRaTblParams.u4EapCtrlCmdId = - cpu2le32(rSetRaTblParams.u4EapCtrlCmdId); - rSetRaTblParams.u2RaTblLength = cpu2le32(rSetRaTblParams.u2RaTblLength); - RTMPEndianChange(rSetRaTblParams.ucBuf, rSetRaTblParams.u2RaTblLength); -#endif - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EAP_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rSetRaTblParams, Length); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdGetRaTblInfo(RTMP_ADAPTER *pAd, UINT8 BandIdx, UINT8 TblType, - UINT8 TblIndex, UINT8 ReadnWrite) -{ - struct cmd_msg *msg; - CMD_SHOW_RATE_TABLE rGetRaTbl; - EVENT_SHOW_RATE_TABLE rRaTblInfo; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(rGetRaTbl)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rGetRaTbl, sizeof(rGetRaTbl)); - rGetRaTbl.u4EapCtrlCmdId = GET_RATE_INFO; - rGetRaTbl.u1RaTblTypeIdx = TblType; - rGetRaTbl.u1RaTblIdx = TblIndex; - rGetRaTbl.u1BandIdx = BandIdx; - rGetRaTbl.u1RW = ReadnWrite; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EAP_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_QUERY_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, sizeof(rRaTblInfo)); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, &rRaTblInfo); - SET_CMD_ATTR_RSP_HANDLER(attr, eapEventDispatcher); - MtAndesInitCmdMsg(msg, attr); -#ifdef RT_BIG_ENDIAN - rGetRaTbl.u4EapCtrlCmdId = cpu2le32(rGetRaTbl.u4EapCtrlCmdId); -#endif - MtAndesAppendCmdMsg(msg, (char *)&rGetRaTbl, sizeof(rGetRaTbl)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* WIFI_EAP_FEATURE */ - -INT32 MtCmdTOAECalCtrl(RTMP_ADAPTER *pAd, UCHAR TOAECtrl) -{ - struct cmd_msg *msg; - CMD_TOAE_ON_OFF_CTRL TOAECalCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: TOAECtrl = %d\n", __func__, TOAECtrl)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_TOAE_ON_OFF_CTRL)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&TOAECalCtrl, sizeof(CMD_TOAE_ON_OFF_CTRL)); - TOAECalCtrl.fgTOAEEnable = TOAECtrl; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TOAE_ENABLE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&TOAECalCtrl, - sizeof(CMD_TOAE_ON_OFF_CTRL)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdEDCCACtrl(RTMP_ADAPTER *pAd, UCHAR BandIdx, UCHAR EDCCACtrl) -{ - struct cmd_msg *msg; - CMD_EDCCA_ON_OFF_CTRL rEDCCACtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BandIdx: %d, EDCCACtrl: %d\n", __func__, BandIdx, - EDCCACtrl)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_EDCCA_ON_OFF_CTRL)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rEDCCACtrl, sizeof(CMD_EDCCA_ON_OFF_CTRL)); - rEDCCACtrl.fgEDCCAEnable = EDCCACtrl; - rEDCCACtrl.ucDbdcBandIdx = BandIdx; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_EDCCA_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rEDCCACtrl, - sizeof(CMD_EDCCA_ON_OFF_CTRL)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdMUPowerCtrl(RTMP_ADAPTER *pAd, BOOLEAN MUPowerForce, - UCHAR MUPowerCtrl) -{ - struct cmd_msg *msg; - CMD_POWER_MU_CTRL_T rMUPowerCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: MUPowerForce: %d, MUPowerCtrl: %d\n", __func__, - MUPowerForce, MUPowerCtrl)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_MU_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rMUPowerCtrl, sizeof(CMD_POWER_MU_CTRL_T)); - rMUPowerCtrl.ucPowerCtrlFormatId = MU_TX_POWER_CTRL; - rMUPowerCtrl.fgMUPowerForceMode = MUPowerForce; - rMUPowerCtrl.cMUPower = MUPowerCtrl; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rMUPowerCtrl, - sizeof(CMD_POWER_MU_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdBFNDPATxDCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgNDPA_ManualMode, - UINT8 ucNDPA_TxMode, UINT8 ucNDPA_Rate, - UINT8 ucNDPA_BW, UINT8 ucNDPA_PowerOffset) -{ - struct cmd_msg *msg; - CMD_BF_NDPA_TXD_CTRL_T rBFNDPATxDCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgNDPA_ManualMode: %d, ucNDPA_TxMode: %d, ucNDPA_Rate: %d, ucNDPA_BW: %d, ucNDPA_PowerOffset: %d\n", - __func__, fgNDPA_ManualMode, ucNDPA_TxMode, ucNDPA_Rate, - ucNDPA_BW, ucNDPA_PowerOffset)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_BF_NDPA_TXD_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rBFNDPATxDCtrl, sizeof(CMD_BF_NDPA_TXD_CTRL_T)); - rBFNDPATxDCtrl.ucPowerCtrlFormatId = BF_NDPA_TXD_CTRL; - rBFNDPATxDCtrl.fgNDPA_ManualMode = fgNDPA_ManualMode; - rBFNDPATxDCtrl.ucNDPA_TxMode = ucNDPA_TxMode; - rBFNDPATxDCtrl.ucNDPA_Rate = ucNDPA_Rate; - rBFNDPATxDCtrl.ucNDPA_BW = ucNDPA_BW; - rBFNDPATxDCtrl.ucNDPA_PowerOffset = ucNDPA_PowerOffset; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rBFNDPATxDCtrl, - sizeof(CMD_BF_NDPA_TXD_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtEPAcheck(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - CMD_SET_TSSI_TRAINING_T PA; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SET_TSSI_TRAINING_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&PA, sizeof(PA)); - PA.ucPowerCtrlFormatId = TSSI_WORKAROUND; - PA.ucSubFuncId = EPA_STATUS; - MtAndesAppendCmdMsg(msg, (char *)&PA, sizeof(PA)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtATETSSITracking(RTMP_ADAPTER *pAd, BOOLEAN fgEnable) -{ - struct cmd_msg *msg; - CMD_SET_TSSI_TRAINING_T rTSSITracking; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgEnable: %d\n", __func__, fgEnable)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SET_TSSI_TRAINING_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&rTSSITracking, sizeof(rTSSITracking)); - rTSSITracking.ucPowerCtrlFormatId = TSSI_WORKAROUND; - rTSSITracking.ucSubFuncId = TSSI_TRACKING_ENABLE; - rTSSITracking.fgEnable = fgEnable; - MtAndesAppendCmdMsg(msg, (char *)&rTSSITracking, sizeof(rTSSITracking)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtATEFCBWCfg(RTMP_ADAPTER *pAd, BOOLEAN fgEnable) -{ - struct cmd_msg *msg; - CMD_SET_TSSI_TRAINING_T rFCBWEnable; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgEnable: %d\n", __func__, fgEnable)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SET_TSSI_TRAINING_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&rFCBWEnable, sizeof(rFCBWEnable)); - rFCBWEnable.ucPowerCtrlFormatId = TSSI_WORKAROUND; - rFCBWEnable.ucSubFuncId = FCBW_ENABLE; - rFCBWEnable.fgEnable = fgEnable; - MtAndesAppendCmdMsg(msg, (char *)&rFCBWEnable, sizeof(rFCBWEnable)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtTSSICompBackup(RTMP_ADAPTER *pAd, BOOLEAN fgEnable) -{ - struct cmd_msg *msg; - CMD_SET_TSSI_TRAINING_T rTSSICompBackup; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgEnable: %d\n", __func__, fgEnable)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SET_TSSI_TRAINING_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&rTSSICompBackup, sizeof(rTSSICompBackup)); - rTSSICompBackup.ucPowerCtrlFormatId = TSSI_WORKAROUND; - rTSSICompBackup.ucSubFuncId = TSSI_COMP_BACKUP; - rTSSICompBackup.fgEnable = fgEnable; - MtAndesAppendCmdMsg(msg, (char *)&rTSSICompBackup, - sizeof(rTSSICompBackup)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtTSSICompCfg(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - CMD_SET_TSSI_TRAINING_T rTSSICompCfg; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SET_TSSI_TRAINING_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - NdisZeroMemory(&rTSSICompCfg, sizeof(rTSSICompCfg)); - rTSSICompCfg.ucPowerCtrlFormatId = TSSI_WORKAROUND; - rTSSICompCfg.ucSubFuncId = TSSI_COMP_CONFIG; - MtAndesAppendCmdMsg(msg, (char *)&rTSSICompCfg, sizeof(rTSSICompCfg)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdTemperatureCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgManualMode, - CHAR cTemperature) -{ - struct cmd_msg *msg; - CMD_POWER_TEMPERATURE_CTRL_T TemperatureCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: fgManualMode: %d\n", __func__, fgManualMode)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: cTemperature: %d\n", __func__, cTemperature)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_TEMPERATURE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&TemperatureCtrl, sizeof(CMD_POWER_TEMPERATURE_CTRL_T)); - TemperatureCtrl.ucPowerCtrlFormatId = THERMAL_MANUAL_CTRL; - TemperatureCtrl.fgManualMode = fgManualMode; - TemperatureCtrl.cTemperature = cTemperature; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&TemperatureCtrl, - sizeof(CMD_POWER_TEMPERATURE_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#ifdef TX_POWER_CONTROL_SUPPORT -INT32 MtCmdTxPwrUpCtrl(RTMP_ADAPTER *pAd, INT8 ucBandIdx, CHAR cPwrUpCat, - CHAR cPwrUpValue[POWER_UP_CATEGORY_RATE_NUM]) -{ - struct cmd_msg *msg; - CMD_POWER_BOOST_TABLE_CTRL_T TxPwrUpTblCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucBandIdx: %d, cPwrUpCat: %d\n", __func__, ucBandIdx, - cPwrUpCat)); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: cPwrUpValue: (%d)-(%d)-(%d)-(%d)-(%d)-(%d)-(%d)\n", - __func__, cPwrUpValue[0], cPwrUpValue[1], cPwrUpValue[2], - cPwrUpValue[3], cPwrUpValue[4], cPwrUpValue[5], - cPwrUpValue[6])); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_BOOST_TABLE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - /* init buffer structure */ - os_zero_mem(&TxPwrUpTblCtrl, sizeof(CMD_POWER_BOOST_TABLE_CTRL_T)); - - TxPwrUpTblCtrl.ucPowerCtrlFormatId = TXPOWER_UP_TABLE_CTRL; - TxPwrUpTblCtrl.ucBandIdx = ucBandIdx; - TxPwrUpTblCtrl.cPwrUpCat = cPwrUpCat; - - /* update Power Up Table value to buffer structure */ - os_move_mem(TxPwrUpTblCtrl.cPwrUpValue, cPwrUpValue, - sizeof(CHAR) * POWER_UP_CATEGORY_RATE_NUM); - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&TxPwrUpTblCtrl, - sizeof(CMD_POWER_BOOST_TABLE_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} -#endif /* TX_POWER_CONTROL_SUPPORT */ - -#ifdef GREENAP_SUPPORT -INT32 MtCmdExtGreenAPOnOffCtrl(RTMP_ADAPTER *pAd, MT_GREENAP_CTRL_T GreenAPCtrl) -{ - struct cmd_msg *msg; - EXT_CMD_GREENAP_CTRL_T rGreenAPCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_GREENAP_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&rGreenAPCtrl, sizeof(EXT_CMD_GREENAP_CTRL_T)); - rGreenAPCtrl.ucDbdcIdx = GreenAPCtrl.ucDbdcIdx; - rGreenAPCtrl.ucGreenAPOn = GreenAPCtrl.ucGreenAPOn; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_GREENAP_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&rGreenAPCtrl, - sizeof(EXT_CMD_GREENAP_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* GREENAP_SUPPORT */ - -#ifdef PCIE_ASPM_DYM_CTRL_SUPPORT -INT32 mt_cmd_ext_pcie_aspm_dym_ctrl(RTMP_ADAPTER *pAd, - MT_PCIE_ASPM_DYM_CTRL_T PcieAspmDymCtrl) -{ - struct cmd_msg *msg; - EXT_CMD_PCIE_ASPM_DYM_CTRL_T pcie_aspm_dym_ctrl = { 0 }; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_PCIE_ASPM_DYM_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&pcie_aspm_dym_ctrl, sizeof(EXT_CMD_PCIE_ASPM_DYM_CTRL_T)); - pcie_aspm_dym_ctrl.ucDbdcIdx = PcieAspmDymCtrl.ucDbdcIdx; - pcie_aspm_dym_ctrl.fgL1Enable = PcieAspmDymCtrl.fgL1Enable; - pcie_aspm_dym_ctrl.fgL0sEnable = PcieAspmDymCtrl.fgL0sEnable; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PCIE_ASPM_DYM_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&pcie_aspm_dym_ctrl, - sizeof(EXT_CMD_PCIE_ASPM_DYM_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* PCIE_ASPM_DYM_CTRL_SUPPORT */ - -#ifdef TPC_SUPPORT -INT32 MtCmdTpcFeatureCtrl(RTMP_ADAPTER *pAd, INT8 TpcPowerValue, - UINT8 ucBandIdx, UINT8 CentralChannel) -{ - struct cmd_msg *msg; - CMD_POWER_TPC_CTRL_T TpcMaxPwrCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - if (CentralChannel == 0) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("(X) invalid Channel setting\n")); - ret = NDIS_STATUS_INVALID_DATA; - goto error; - } - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_POWER_TPC_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&TpcMaxPwrCtrl, sizeof(CMD_POWER_TPC_CTRL_T)); - TpcMaxPwrCtrl.ucPowerCtrlFormatId = TPC_FEATURE_CTRL; - TpcMaxPwrCtrl.cTPCPowerValue = TpcPowerValue; - TpcMaxPwrCtrl.ucBand = ucBandIdx; - TpcMaxPwrCtrl.ucCentralChannel = CentralChannel; - TpcMaxPwrCtrl.ucChannelBand = - TxPowerGetChBand(ucBandIdx, CentralChannel); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: pwr=%d=0x%02X, BandIdx=%d, CentralChannel=%d, ChBand=%d\n", - __func__, TpcPowerValue, TpcPowerValue, TpcMaxPwrCtrl.ucBand, - TpcMaxPwrCtrl.ucCentralChannel, TpcMaxPwrCtrl.ucChannelBand)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&TpcMaxPwrCtrl, - sizeof(CMD_POWER_TPC_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* TPC_SUPPORT */ - -INT32 MtCmdATEModeCtrl(RTMP_ADAPTER *pAd, UCHAR ATEMode) -{ - struct cmd_msg *msg; - CMD_ATE_MODE_CTRL_T ATEModeCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ATEMode = %d\n", __FUNCTION__, ATEMode)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_ATE_MODE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&ATEModeCtrl, sizeof(CMD_ATE_MODE_CTRL_T)); - ATEModeCtrl.ucPowerCtrlFormatId = ATEMODE_CTRL; - ATEModeCtrl.fgATEModeEn = ATEMode; - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_TX_POWER_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&ATEModeCtrl, - sizeof(CMD_ATE_MODE_CTRL_T)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - return ret; -} - -#ifdef PKT_BUDGET_CTRL_SUPPORT -INT32 MtCmdPktBudgetCtrl(struct _RTMP_ADAPTER *pAd, UINT8 bss_idx, UINT16 wcid, - UCHAR type) -{ - struct cmd_msg *msg; - INT32 Ret = 0; - struct _CMD_PKT_BUDGET_CTRL_T pbc; - struct _CMD_PKT_BUDGET_CTRL_ENTRY_T *entry; - struct _CMD_ATTRIBUTE attr = { 0 }; - UCHAR i; - UINT32 size = sizeof(pbc); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (":%s: bssid(%d),wcid(%d),type(%d)\n", __func__, bss_idx, wcid, - type)); - - if (type >= PBC_TYPE_END) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (":%s: set wrong type (%d) for PBC!\n", __func__, - type)); - return Ret; - } - - msg = MtAndesAllocCmdMsg(pAd, size); - - if (!msg) { - Ret = NDIS_STATUS_RESOURCES; - return Ret; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_PKT_BUDGET_CTRL_CFG); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET_AND_WAIT_RSP); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 8); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&pbc, size); - pbc.wlan_idx = cpu2le16(wcid); - pbc.bss_id = bss_idx; - pbc.queue_num = PBC_NUM_OF_PKT_BUDGET_CTRL_QUE; - - switch (type) { - case PBC_TYPE_NORMAL: { - for (i = 0; i < PBC_NUM_OF_PKT_BUDGET_CTRL_QUE; i++) { - entry = &pbc.aacQue[i]; - entry->lower_bound = - cpu2le16(PBC_BOUNDARY_RESET_TO_DEFAULT); - entry->upper_bound = - cpu2le16(PBC_BOUNDARY_RESET_TO_DEFAULT); - } - } break; - - case PBC_TYPE_WMM: { - for (i = 0; i < PBC_NUM_OF_PKT_BUDGET_CTRL_QUE; i++) { - entry = &pbc.aacQue[i]; - entry->lower_bound = - cpu2le16(PBC_BOUNDARY_RESET_TO_DEFAULT); - entry->upper_bound = cpu2le16(pAd->pbc_bound[i]); - } - } break; - } - - MtAndesAppendCmdMsg(msg, (char *)&pbc, size); - Ret = chip_cmd_tx(pAd, msg); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: (ret = %d)\n", __func__, Ret)); - return Ret; -} -#endif /*PKT_BUDGET_CTRL_SUPPORT*/ - -INT32 MtCmdSetBWFEnable(RTMP_ADAPTER *pAd, UINT8 Enable) -{ - struct cmd_msg *msg; - EXT_CMD_ID_BWF_LWC_ENABLE_T CmdBWFEnable; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - os_zero_mem(&CmdBWFEnable, sizeof(EXT_CMD_ID_BWF_LWC_ENABLE_T)); - /* send to N9 */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_ID_BWF_LWC_ENABLE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = sizeof(EXT_CMD_ID_BWF_LWC_ENABLE_T); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BWF_LWC_ENABLE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - CmdBWFEnable.ucBwfLwcEnable = Enable; - MtAndesAppendCmdMsg(msg, (char *)&CmdBWFEnable, - sizeof(EXT_CMD_ID_BWF_LWC_ENABLE_T)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: send cmd to N9 CmdBWFEnable.ucBwfLwcEnable [%d] Enable[%d]\n", - __func__, CmdBWFEnable.ucBwfLwcEnable, Enable)); - ret = chip_cmd_tx(pAd, msg); - /* send the same msg to CR4 */ - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_ID_BWF_LWC_ENABLE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_BWF_LWC_ENABLE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - CmdBWFEnable.ucBwfLwcEnable = Enable; - MtAndesAppendCmdMsg(msg, (char *)&CmdBWFEnable, - sizeof(EXT_CMD_ID_BWF_LWC_ENABLE_T)); - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: send cmd to CR4 CmdBWFEnable.ucBwfLwcEnable [%d] Enable[%d]\n", - __func__, CmdBWFEnable.ucBwfLwcEnable, Enable)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#if defined(CONFIG_HOTSPOT_R2) || defined(DSCP_QOS_MAP_SUPPORT) -INT32 MtCmdHotspotInfoUpdate(RTMP_ADAPTER *pAd, - EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T InfoUpdateT) -{ - struct cmd_msg *msg; - EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T CmdHotspotInfoUpdate; - struct _CMD_ATTRIBUTE attr = { 0 }; - INT32 ret = 0; - INT32 Len = 0; - if (!IS_ASIC_CAP(pAd, fASIC_CAP_MCU_OFFLOAD)) { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: skip update to cr4\n", __func__)); - return 0; - } - os_zero_mem(&CmdHotspotInfoUpdate, - sizeof(EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - Len = sizeof(EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T); - os_move_mem(&CmdHotspotInfoUpdate, &InfoUpdateT, Len); - SET_CMD_ATTR_MCU_DEST(attr, HOST2CR4); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_HOTSPOT_INFO_UPDATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdHotspotInfoUpdate, - sizeof(EXT_CMD_ID_HOTSPOT_INFO_UPDATE_T)); - /* MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("%s: send to CR4\n", __FUNCTION__)); */ - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#endif /* CONFIG_HOTSPOT_R2 */ - -#ifdef RACTRL_LIMIT_MAX_PHY_RATE -/***************************************** - * ExT_CID = 0x74 - *****************************************/ -INT32 MtCmdSetMaxPhyRate(RTMP_ADAPTER *pAd, UINT16 u2MaxPhyRate) -{ - struct cmd_msg *msg; - CMD_SET_MAX_PHY_RATA CmdSetMaxPhyRate; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: Max Phy rate = %d\n", __func__, u2MaxPhyRate)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SET_MAX_PHY_RATA)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdSetMaxPhyRate, sizeof(CMD_SET_MAX_PHY_RATA)); - CmdSetMaxPhyRate.u2MaxPhyRate = cpu2le16(u2MaxPhyRate); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_MAX_PHY_RATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdSetMaxPhyRate, - sizeof(CMD_SET_MAX_PHY_RATA)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} -#endif /* RACTRL_LIMIT_MAX_PHY_RATE */ - -/***************************************** - * ExT_CID = 0xA8 - *****************************************/ -INT32 MtCmdSetVhtRateIn2G(RTMP_ADAPTER *pAd, BOOL fgEnVhtForHtIn2G) -{ - struct cmd_msg *msg; - EXT_CMD_SET_VHT_IN_2G_T CmdSetVhtIn2G; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: VHT For HT In 2G = %d\n", __func__, fgEnVhtForHtIn2G)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdSetVhtIn2G)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdSetVhtIn2G, sizeof(CmdSetVhtIn2G)); - CmdSetVhtIn2G.fgEnVhtForHtIn2G = fgEnVhtForHtIn2G; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_VHT_RATE_IN_2G); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdSetVhtIn2G, sizeof(CmdSetVhtIn2G)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -INT32 MtCmdLinkTestTxCsdCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgTxCsdConfigEn, - UINT8 ucDbdcBandIdx, UINT8 ucBandIdx) -{ - struct cmd_msg *msg; - CMD_LINK_TEST_TX_CSD_CTRL_T CMWTxCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgTxCsdConfigEn = %d\n", __FUNCTION__, fgTxCsdConfigEn)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_LINK_TEST_TX_CSD_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWTxCtrl, sizeof(CMD_LINK_TEST_TX_CSD_CTRL_T)); - - CMWTxCtrl.ucLinkTestCtrlFormatId = LINK_TEST_TX_CSD; - CMWTxCtrl.fgTxCsdConfigEn = fgTxCsdConfigEn; - CMWTxCtrl.ucDbdcBandIdx = ucDbdcBandIdx; - CMWTxCtrl.ucBandIdx = ucBandIdx; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWTxCtrl, - sizeof(CMD_LINK_TEST_TX_CSD_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -INT32 MtCmdLinkTestRxCtrl(RTMP_ADAPTER *pAd, UINT8 ucRxAntIdx, UINT8 ucBandIdx) -{ - struct cmd_msg *msg; - CMD_LINK_TEST_RX_CTRL_T CMWRxCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucRxAntIdx: %d, ucBandIdx: %d\n", __FUNCTION__, - ucRxAntIdx, ucBandIdx)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_LINK_TEST_RX_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWRxCtrl, sizeof(CMD_LINK_TEST_RX_CTRL_T)); - - CMWRxCtrl.ucLinkTestCtrlFormatId = LINK_TEST_RX; - CMWRxCtrl.ucRxAntIdx = ucRxAntIdx; - CMWRxCtrl.ucBandIdx = ucBandIdx; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWRxCtrl, - sizeof(CMD_LINK_TEST_RX_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -INT32 MtCmdLinkTestTxCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgTxConfigEn, - UINT8 ucBandIdx) -{ - struct cmd_msg *msg; - CMD_LINK_TEST_TX_CTRL_T CMWTxCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgTxConfigEn = %d\n", __FUNCTION__, fgTxConfigEn)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_LINK_TEST_TX_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWTxCtrl, sizeof(CMD_LINK_TEST_TX_CTRL_T)); - - CMWTxCtrl.ucLinkTestCtrlFormatId = LINK_TEST_TX; - CMWTxCtrl.fgTxConfigEn = fgTxConfigEn; - CMWTxCtrl.ucBandIdx = ucBandIdx; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWTxCtrl, - sizeof(CMD_LINK_TEST_TX_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} -INT32 MtCmdLinkTestTxPwrCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgTxPwrConfigEn, - UINT8 ucDbdcBandIdx, UINT8 ucBandIdx) -{ - struct cmd_msg *msg; - CMD_LINK_TEST_TXPWR_CTRL_T CMWTxPwrCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgTxPwrConfigEn = %d\n", __FUNCTION__, fgTxPwrConfigEn)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_LINK_TEST_TXPWR_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWTxPwrCtrl, sizeof(CMD_LINK_TEST_TXPWR_CTRL_T)); - - CMWTxPwrCtrl.ucLinkTestCtrlFormatId = LINK_TEST_TXPWR; - CMWTxPwrCtrl.fgTxPwrConfigEn = fgTxPwrConfigEn; - CMWTxPwrCtrl.ucDbdcBandIdx = ucDbdcBandIdx; - CMWTxPwrCtrl.ucBandIdx = ucBandIdx; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWTxPwrCtrl, - sizeof(CMD_LINK_TEST_TXPWR_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -INT32 MtCmdLinkTestTxPwrUpTblCtrl(RTMP_ADAPTER *pAd, UINT8 ucTxPwrUpCat, - PUINT8 pucTxPwrUpValue) -{ - UINT8 ucRateIdx; - struct cmd_msg *msg; - CMD_LINK_TEST_TXPWR_UP_TABLE_CTRL_T CMWTxPwrUpTblCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucTxPwrUpCat: %d\n", __FUNCTION__, ucTxPwrUpCat)); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucTxPwrUpRate: ", __FUNCTION__)); - for (ucRateIdx = 0; ucRateIdx < CMW_POWER_UP_RATE_NUM; ucRateIdx++) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %d", *(pucTxPwrUpValue + ucRateIdx))); - - msg = MtAndesAllocCmdMsg(pAd, - sizeof(CMD_LINK_TEST_TXPWR_UP_TABLE_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWTxPwrUpTblCtrl, - sizeof(CMD_LINK_TEST_TXPWR_UP_TABLE_CTRL_T)); - - CMWTxPwrUpTblCtrl.ucLinkTestCtrlFormatId = LINK_TEST_TXPWR_UP_TABLE; - CMWTxPwrUpTblCtrl.ucTxPwrUpCat = ucTxPwrUpCat; - - /* update command content with Tx Power up Table */ - os_move_mem(&(CMWTxPwrUpTblCtrl.ucTxPwrUpValue), pucTxPwrUpValue, - CMW_POWER_UP_RATE_NUM); - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWTxPwrUpTblCtrl, - sizeof(CMD_LINK_TEST_TXPWR_UP_TABLE_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -INT32 MtCmdLinkTestACRCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgACRConfigEn, - UINT8 ucDbdcBandIdx, UINT8 ucReserved) -{ - struct cmd_msg *msg; - CMD_LINK_TEST_ACR_CTRL_T CMWACICtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgACIConfigEn = %d\n", __FUNCTION__, fgACRConfigEn)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_LINK_TEST_ACR_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWACICtrl, sizeof(CMD_LINK_TEST_ACR_CTRL_T)); - - CMWACICtrl.ucLinkTestCtrlFormatId = LINK_TEST_ACR; - CMWACICtrl.fgACRConfigEn = fgACRConfigEn; - CMWACICtrl.ucDbdcBandIdx = ucDbdcBandIdx; - CMWACICtrl.ucReserved = ucReserved; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWACICtrl, - sizeof(CMD_LINK_TEST_ACR_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -INT32 MtCmdLinkTestRcpiCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgRCPIConfigEn) -{ - struct cmd_msg *msg; - CMD_LINK_TEST_RCPI_CTRL_T CMWRCPICtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgRCPIConfigEn = %d\n", __FUNCTION__, fgRCPIConfigEn)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_LINK_TEST_RCPI_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWRCPICtrl, sizeof(CMD_LINK_TEST_RCPI_CTRL_T)); - - CMWRCPICtrl.ucLinkTestCtrlFormatId = LINK_TEST_RCPI; - CMWRCPICtrl.fgRCPIConfigEn = fgRCPIConfigEn; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWRCPICtrl, - sizeof(CMD_LINK_TEST_RCPI_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -INT32 MtCmdLinkTestSeIdxCtrl(RTMP_ADAPTER *pAd, BOOLEAN fgSeIdxConfigEn) -{ - struct cmd_msg *msg; - CMD_LINK_TEST_SEIDX_CTRL_T CMWSeIdxCtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: fgSeIdxConfigEn = %d\n", __FUNCTION__, fgSeIdxConfigEn)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_LINK_TEST_SEIDX_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWSeIdxCtrl, sizeof(CMD_LINK_TEST_SEIDX_CTRL_T)); - - CMWSeIdxCtrl.ucLinkTestCtrlFormatId = LINK_TEST_SEIDX; - CMWSeIdxCtrl.fgSeIdxConfigEn = fgSeIdxConfigEn; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWSeIdxCtrl, - sizeof(CMD_LINK_TEST_SEIDX_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -INT32 MtCmdLinkTestRcpiMACtrl(RTMP_ADAPTER *pAd, UINT8 ucMAParameter) -{ - struct cmd_msg *msg; - CMD_LINK_TEST_RCPI_MA_CTRL_T CMWRcpiMACtrl; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ucMAParameter = %d\n", __FUNCTION__, ucMAParameter)); - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_LINK_TEST_RCPI_MA_CTRL_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CMWRcpiMACtrl, sizeof(CMD_LINK_TEST_RCPI_MA_CTRL_T)); - - /* Transform the parameter to bitwise represetation */ - switch (ucMAParameter) { - case 1: - ucMAParameter = 3; - break; - - case 2: - ucMAParameter = 2; - break; - - case 4: - ucMAParameter = 1; - break; - - case 8: - ucMAParameter = 0; - break; - - default: - break; - } - - CMWRcpiMACtrl.ucLinkTestCtrlFormatId = LINK_TEST_RCPI_MA; - CMWRcpiMACtrl.ucMAParameter = ucMAParameter; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_LINK_TEST_FEATURE_CTRL); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CMWRcpiMACtrl, - sizeof(CMD_LINK_TEST_RCPI_MA_CTRL_T)); - - ret = chip_cmd_tx(pAd, msg); - return ret; - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:(ret = %d)\n", __FUNCTION__, ret)); - - return ret; -} - -/***************************************** - * ExT_CID = 0x94 - *****************************************/ -INT32 MtCmdPhyShapingFilterDisable(RTMP_ADAPTER *pAd) -{ - struct cmd_msg *msg; - struct _EXT_CMD_PHY_SHAPING_FILTER_DISABLE_T phyConfig; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: phyShapingFilterDisable = %d\n", __func__, - PHY_SHAPING_FILTER_DISABLE)); - msg = MtAndesAllocCmdMsg(pAd, sizeof(phyConfig)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SHAPING_FILTER_DISABLE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, EventExtCmdResult); - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&phyConfig, sizeof(phyConfig)); - phyConfig.ucPhyShapingFilterDisable = PHY_SHAPING_FILTER_DISABLE; - MtAndesAppendCmdMsg(msg, (char *)&phyConfig, sizeof(phyConfig)); - ret = chip_cmd_tx(pAd, msg); -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s:(ret = %d)\n", __func__, ret)); - return ret; -} - -#ifdef MIN_PHY_RATE_SUPPORT -/***************************************** - ExT_CID = 0x7A -*****************************************/ -INT32 MtCmdSetMinPhyRate(RTMP_ADAPTER *pAd, struct wifi_dev *wdev) -{ - struct cmd_msg *msg; - CMD_SET_MIN_PHY_RATE CmdSetMinPhyRate; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SET_MIN_PHY_RATE)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdSetMinPhyRate, sizeof(CMD_SET_MIN_PHY_RATE)); - CmdSetMinPhyRate.ucBssidIdx = wdev->bss_info_argument.ucBssIndex; - CmdSetMinPhyRate.ucMinPhyDataRate = wdev->rate.MinPhyDataRate; - CmdSetMinPhyRate.ucMinPhyMgmtRate = wdev->rate.MinPhyMgmtRate; - CmdSetMinPhyRate.fgDisableCCKRate = wdev->rate.DisableCCKRate; - - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s BSSID = %d, DR = %d, MR = %d, DisableCCK = %d\n", - __func__, CmdSetMinPhyRate.ucBssidIdx, - CmdSetMinPhyRate.ucMinPhyDataRate, - CmdSetMinPhyRate.ucMinPhyMgmtRate, - CmdSetMinPhyRate.fgDisableCCKRate)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_MIN_PHY_RATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdSetMinPhyRate, - sizeof(CMD_SET_MIN_PHY_RATE)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} -#endif /* MIN_PHY_RATE_SUPPORT */ - -#ifdef FAST_UP_RATE_SUPPORT -/***************************************** - ExT_CID = 0x7B -*****************************************/ -INT32 MtCmdSetFastUpRate(RTMP_ADAPTER *pAd, UCHAR isEnable) -{ - struct cmd_msg *msg; - CMD_SET_FAST_UP_RATE CmdSetFastUpRate; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_SET_FAST_UP_RATE)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdSetFastUpRate, sizeof(CMD_SET_FAST_UP_RATE)); - if (isEnable) - CmdSetFastUpRate.fgFastUPRate = TRUE; - else - CmdSetFastUpRate.fgFastUPRate = FALSE; - - MTWF_LOG(DBG_CAT_PROTO, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: FastUpRate = %d\n", __func__, - CmdSetFastUpRate.fgFastUPRate)); - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_FAST_UP_RATE); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdSetFastUpRate, - sizeof(CMD_SET_FAST_UP_RATE)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} -#endif /* FAST_UP_RATE_SUPPORT */ - -#ifdef CUSTOMISE_RDD_THRESHOLD_SUPPORT -INT32 MtCmdSetFcc5MinLPN(RTMP_ADAPTER *pAd, UINT16 u2MinLpnUpdate) -{ - struct cmd_msg *msg; - CMD_RDM_FCC5_LPN_UPDATE_T CmdSetLpnUpdate; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_RDM_FCC5_LPN_UPDATE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdSetLpnUpdate, sizeof(CMD_RDM_FCC5_LPN_UPDATE_T)); - - CmdSetLpnUpdate.u2Tag = 0x01; - CmdSetLpnUpdate.u2FCC_LPN_MIN = u2MinLpnUpdate; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_RDM_RADAR_THRES); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdSetLpnUpdate, - sizeof(CMD_RDM_FCC5_LPN_UPDATE_T)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} - -INT32 MtCmdSetRadarThresholdParam( - RTMP_ADAPTER *pAd, P_CMD_RDM_RADAR_THRESHOLD_UPDATE_T pRadarThreshold) -{ - struct cmd_msg *msg; - CMD_RDM_RADAR_THRESHOLD_UPDATE_T CmdRadarThsldUpdate; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_RDM_RADAR_THRESHOLD_UPDATE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdRadarThsldUpdate, sizeof(CMD_RDM_FCC5_LPN_UPDATE_T)); - NdisCopyMemory(&CmdRadarThsldUpdate, pRadarThreshold, - sizeof(CMD_RDM_RADAR_THRESHOLD_UPDATE_T)); - CmdRadarThsldUpdate.u2Tag = 0x02; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_RDM_RADAR_THRES); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdRadarThsldUpdate, - sizeof(CMD_RDM_RADAR_THRESHOLD_UPDATE_T)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} - -INT32 MtCmdSetPulseThresholdParam( - RTMP_ADAPTER *pAd, P_CMD_RDM_PULSE_THRESHOLD_UPDATE_T pPulseThreshold) -{ - struct cmd_msg *msg; - CMD_RDM_PULSE_THRESHOLD_UPDATE_T CmdSetPulseThresholdUpdate; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_RDM_PULSE_THRESHOLD_UPDATE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdSetPulseThresholdUpdate, - sizeof(CMD_RDM_PULSE_THRESHOLD_UPDATE_T)); - NdisCopyMemory(&CmdSetPulseThresholdUpdate, pPulseThreshold, - sizeof(CMD_RDM_PULSE_THRESHOLD_UPDATE_T)); - CmdSetPulseThresholdUpdate.u2Tag = 0x03; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_RDM_RADAR_THRES); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdSetPulseThresholdUpdate, - sizeof(CMD_RDM_PULSE_THRESHOLD_UPDATE_T)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} - -INT32 MtCmdSetRddLogConfigUpdate(RTMP_ADAPTER *pAd, UINT8 ucHwRDDLogEnable, - UINT8 ucSwRDDLogEnable, UINT8 ucSwRDDLogCond) -{ - struct cmd_msg *msg; - CMD_RDM_RDD_LOG_CONFIG_UPDATE_T CmdSetRDDLogConfigUpdate; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_RDM_RDD_LOG_CONFIG_UPDATE_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdSetRDDLogConfigUpdate, - sizeof(CMD_RDM_RDD_LOG_CONFIG_UPDATE_T)); - - CmdSetRDDLogConfigUpdate.u2Tag = 0x04; - CmdSetRDDLogConfigUpdate.ucHwRDDLogEnable = ucHwRDDLogEnable; - CmdSetRDDLogConfigUpdate.ucSwRDDLogEnable = ucSwRDDLogEnable; - CmdSetRDDLogConfigUpdate.ucSwRDDLogCond = ucSwRDDLogCond; - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_RDM_RADAR_THRES); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdSetRDDLogConfigUpdate, - sizeof(CMD_RDM_RDD_LOG_CONFIG_UPDATE_T)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} - -#endif /* CUSTOMISE_RDD_THRESHOLD_SUPPORT */ - -#ifdef RDM_FALSE_ALARM_DEBUG_SUPPORT -INT32 MtCmdSetTestRadarPattern(RTMP_ADAPTER *pAd, - P_CMD_RDM_TEST_RADAR_PATTERN_T pTestPulsePattern) -{ - struct cmd_msg *msg; - CMD_RDM_TEST_RADAR_PATTERN_T CmdSetTestPulsePattern; - INT32 ret = 0; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CMD_RDM_TEST_RADAR_PATTERN_T)); - - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - os_zero_mem(&CmdSetTestPulsePattern, - sizeof(CMD_RDM_TEST_RADAR_PATTERN_T)); - NdisCopyMemory(&CmdSetTestPulsePattern, pTestPulsePattern, - sizeof(CMD_RDM_TEST_RADAR_PATTERN_T)); - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SET_RDM_TEST_PATTERN); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, MT_IGNORE_PAYLOAD_LEN_CHECK); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - MtAndesAppendCmdMsg(msg, (char *)&CmdSetTestPulsePattern, - sizeof(CMD_RDM_TEST_RADAR_PATTERN_T)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} -#endif /* RDM_FALSE_ALARM_DEBUG_SUPPORT */ - -INT32 MtCmdSendNullFrame(RTMP_ADAPTER *pAd, UINT8 PID, UINT8 No_Of_Null_Frames, - UINT8 WlanIdx) -{ - struct cmd_msg *msg; - INT32 ret = 0; - EXT_CMD_FW_SEND_NULL_FRAME_T CmdFwSendNullFrame; - struct _CMD_ATTRIBUTE attr = { 0 }; - - msg = MtAndesAllocCmdMsg(pAd, sizeof(CmdFwSendNullFrame)); - if (!msg) { - ret = NDIS_STATUS_RESOURCES; - goto error; - } - - SET_CMD_ATTR_MCU_DEST(attr, HOST2N9); - SET_CMD_ATTR_TYPE(attr, EXT_CID); - SET_CMD_ATTR_EXT_TYPE(attr, EXT_CMD_ID_SEND_NULL_FRAME_SUPPORT); - SET_CMD_ATTR_CTRL_FLAGS(attr, INIT_CMD_SET); - SET_CMD_ATTR_RSP_WAIT_MS_TIME(attr, 0); - SET_CMD_ATTR_RSP_EXPECT_SIZE(attr, 0); - SET_CMD_ATTR_RSP_WB_BUF_IN_CALBK(attr, NULL); - SET_CMD_ATTR_RSP_HANDLER(attr, NULL); - - MtAndesInitCmdMsg(msg, attr); - os_zero_mem(&CmdFwSendNullFrame, sizeof(CmdFwSendNullFrame)); - - CmdFwSendNullFrame.PID = PID; - CmdFwSendNullFrame.WlanIdx = WlanIdx; - CmdFwSendNullFrame.No_Of_Null_Frames = No_Of_Null_Frames; - - MtAndesAppendCmdMsg(msg, (char *)&CmdFwSendNullFrame, - sizeof(CmdFwSendNullFrame)); - - ret = chip_cmd_tx(pAd, msg); - -error: - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:(ret = %d)\n", __func__, ret)); - - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/mt_fdb.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/mt_fdb.c deleted file mode 100644 index 48e3e3b1ff..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/mcu/mt_fdb.c +++ /dev/null @@ -1,800 +0,0 @@ -#ifdef MTK_LICENSE -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_fdb.c -*/ -#endif /* MTK_LICENSE */ -#ifdef MT_FDB - -#include "mcu/mt_fdb.h" - -/************************* access FW CR API ***********************/ -UINT32 HostAccessFwCr(RTMP_ADAPTER *pAd, UINT32 fw_cr_addr, UINT32 cr_op, - UINT32 wrt_val) -{ - UINT32 ori_remap_cr_val = 0; - UINT32 remapped_cr_val = 0; - - UINT32 rec_remap_cr_base_addr = 0; - UINT32 target_cr_offset = 0; - - BOOLEAN fgFound; - - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - /* keep the origonal remap cr1 value for restore */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_1, &ori_remap_cr_val); - /* do PCI-E remap for physical base address to 0x40000 */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_1, fw_cr_addr); - /* get real remap cr base addr */ - HW_IO_READ32(pAd, MCU_PCIE_REMAP_1, &rec_remap_cr_base_addr); - - if ((fw_cr_addr - rec_remap_cr_base_addr) > - REMAP_1_OFFSET_MASK) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:Exceed remap range(offset: 0x%x > mask: 0x%x)!!\n", - __FUNCTION__, - (fw_cr_addr - rec_remap_cr_base_addr), - REMAP_1_OFFSET_MASK)); - /* restore the origonal remap cr1 value */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_1, ori_remap_cr_val); - } - target_cr_offset = ((fw_cr_addr - rec_remap_cr_base_addr) & - REMAP_1_OFFSET_MASK); - - if (cr_op == CR_OP_READ) { - RTMP_IO_READ32(pAd, 0x40000 + target_cr_offset, - &remapped_cr_val); - - //MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s:0x%x = 0x%x\n", - // __FUNCTION__, (0x40000 + target_cr_offset), remapped_cr_val)); - } else if (cr_op == CR_OP_WRITE) { - RTMP_IO_WRITE32(pAd, 0x40000 + target_cr_offset, - wrt_val); - } - - /* restore the origonal remap cr1 value */ - HW_IO_WRITE32(pAd, MCU_PCIE_REMAP_1, ori_remap_cr_val); - } else if (IS_MT7663(pAd)) { - fgFound = mt_mac_cr_range_mapping(pAd, &fw_cr_addr); - if (fgFound == FALSE) { /* not found*/ - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:7663 cannot access CR [%08X]!\n", - __func__, fw_cr_addr)); - } else { - if (cr_op == CR_OP_READ) - RTMP_IO_READ32(pAd, fw_cr_addr, - &remapped_cr_val); - else if (cr_op == CR_OP_WRITE) - RTMP_IO_WRITE32(pAd, fw_cr_addr, wrt_val); - } - } else { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:Non 7615 don't support this cmd !\n", __func__)); - } - return remapped_cr_val; -} - -/************************* fdb.c *********************************/ -uint32_t arg0, arg1, ret0, ret1, status, di_cmd_num, cmd_done_cnt; -char *exe_name; -char *arg0_str; -char *arg1_str; - -char screen_buf[256]; - -struct di_cmd di_cmds[] = { - { DIC_READ1, "rb", 1, 1, false, NULL, memory_read_post, - "\t\t\t-- read address(half-byte)" }, - { DIC_READ2, "rh", 1, 1, false, NULL, memory_read_post, - "\t\t\t-- read address(half-word)" }, - { DIC_READ4, "rw", 1, 1, false, NULL, memory_read_post, - "\t\t\t-- read address(word)" }, - { DIC_WRITE1, "wb", 2, 0, false, NULL, NULL, - "\t\t\t-- write address(half-byte)" }, - { DIC_WRITE2, "wh", 2, 0, false, NULL, NULL, - "\t\t\t-- write address(half-word)" }, - { DIC_WRITE4, "ww", 2, 0, false, NULL, NULL, - "\t\t\t-- write address(word)" }, - { DIC_GET_BUF, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_ENABLE, "enable", 0, 0, true, NULL, NULL, - "\t\t\t-- enable fdb" }, - { DIC_FDB_DISABLE, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_HW_BKPT_SET, "hb", 2, 0, true, NULL, NULL, - " \t\t-- set hardware breakpoint" }, - { DIC_FDB_HW_BKPT_DELETE, "d", 1, 0, false, NULL, NULL, - "\t\t\t-- delect breakpoint" }, - { DIC_FDB_HW_BKPT_ENABLE, "en", 1, 0, false, NULL, NULL, - "\t\t-- enable breakpoint" }, - { DIC_FDB_HW_BKPT_DISABLE, "dis", 1, 0, false, NULL, NULL, - "\t\t-- disable breakpoint" }, - { DIC_FDB_CONTINUE, "c", 0, 0, false, NULL, NULL, "\t\t\t-- continue" }, - { DIC_FDB_STEP, "si", 0, 0, false, NULL, single_step_post, - "\t\t\t-- single step" }, - { DIC_FDB_STOP, "stop", 0, 0, true, NULL, NULL, - "\t\t\t-- stop request" }, - { DIC_FDB_GET_CPU_REG, "get", 1, 1, false, get_cpu_reg_pre, - get_cpu_reg_post, "\t\t-- read MCU register" }, - { DIC_FDB_SET_CPU_REG, "set", 2, 0, false, set_cpu_reg_pre, NULL, - " \t-- set MCU register" }, - { DIC_FDB_GET_TASK, "dump", 0, 0, false, NULL, NULL, - "\t\t\t-- dump call trace" }, - { DIC_FDB_GET_STACK, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_RWATCH, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_AWATCH, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH_RANGE, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH_SYMBOL, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH_EXPR_CONST, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH_EXPR_VARIABLE, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH_EXPR_DONE, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH_ENABLE, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH_DISABLE, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WATCH_DELETE, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_FUNC_CALL, "call", 2, 1, false, NULL, NULL, - " \t-- function call with a argument" }, - { DIC_SYSTEM_STACK_INFO, "", 0, 0, false, NULL, NULL, "" }, - { DIC_SYSTEM_QUEUE_INFO, "", 0, 0, false, NULL, NULL, "" }, - { DIC_FDB_WMT_TEST, "test", 0, 0, true, NULL, NULL, - "\t\t\t-- enter infinite loop" }, - { DIC_FDB_BKPT_INFO, "info", 0, 0, false, NULL, NULL, - "\t\t\t-- breakpoint info" }, -}; - -struct di_cmd intern_cmds[] = { - { IC_CALL_TRACE, "bt", 0, 0, false, dump_call_trace, NULL, - "\t\t\t-- dump call trace" }, - { IC_CALL_HELP, "help", 0, 0, false, print_help_msg, NULL, - "\t\t\t-- print this help message" }, -}; - -char *cr_mapping[] = { "PC", "PSW", "R28", "R29", "R30", "R15", - "R3", "R4", "R5", "R6", "R7", "R8", - "R9", "R10", "R0", "R1", "R2", "R31" }; - -char cmd_str[CMD_STR_LEN]; - -uint32_t mcu_cr_mapping(char *mcu_cr_str) -{ - int i; - - for (i = 0; i < CONTEXT_NUM; i++) { - if (!strcmp(mcu_cr_str, cr_mapping[i])) { - return i; - } - } - - if (!strcmp(mcu_cr_str, "ITYPE")) { - return NDS32_SR_ITYPE + CONTEXT_NUM; - } - - return 0; -} - -void get_cpu_reg_pre(RTMP_ADAPTER *pAd) -{ - arg0 = mcu_cr_mapping(arg0_str); -} - -void set_cpu_reg_pre(RTMP_ADAPTER *pAd) -{ - arg0 = mcu_cr_mapping(arg0_str); -} - -void get_cpu_reg_post(RTMP_ADAPTER *pAd) -{ - //printk("%s = 0x%x\n", arg0_str, ret0); -} - -void single_step_post(RTMP_ADAPTER *pAd) -{ - intern_debug_probe_cmd_call(pAd, DIC_FDB_GET_CPU_REG, "PC", NULL); -} - -void memory_read_post(RTMP_ADAPTER *pAd) -{ - //printk("%s = 0x%x\n", arg0_str, ret0); -} - -void dump_call_trace(RTMP_ADAPTER *pAd) -{ - uint32_t i; - uint32_t context_sp; - char addr_str[12]; - - PRINT_CONTEXT_CR_T32(pAd, R28); - PRINT_CONTEXT_CR_T32(pAd, R29); - PRINT_CONTEXT_CR_T32(pAd, R30); - PRINT_CONTEXT_CR_T32(pAd, R15); - PRINT_CONTEXT_CR_T32(pAd, R3); - PRINT_CONTEXT_CR_T32(pAd, R4); - PRINT_CONTEXT_CR_T32(pAd, R5); - PRINT_CONTEXT_CR_T32(pAd, R6); - PRINT_CONTEXT_CR_T32(pAd, R7); - PRINT_CONTEXT_CR_T32(pAd, R8); - PRINT_CONTEXT_CR_T32(pAd, R9); - PRINT_CONTEXT_CR_T32(pAd, R10); - PRINT_CONTEXT_CR_T32(pAd, R0); - PRINT_CONTEXT_CR_T32(pAd, R1); - PRINT_CONTEXT_CR_T32(pAd, R2); - PRINT_CONTEXT_CR_T32(pAd, R31); - PRINT_CONTEXT_CR_T32(pAd, PSW); - PRINT_CONTEXT_CR_T32(pAd, PC); - - intern_debug_probe_cmd_call(pAd, DIC_FDB_GET_CPU_REG, "R31", NULL); - - context_sp = ret0; - - for (i = 0; i < STACK_DEPTH; i++) { - sprintf(addr_str, "0x%x", context_sp + (i * 4)); - intern_debug_probe_cmd_call(pAd, DIC_READ4, addr_str, NULL); - PREFIX_PRINTF(T32, "D.S D:0x%x %%LE %%LONG 0x%x\n", - context_sp + (i * 4), ret0); - } -} - -void write_cr(RTMP_ADAPTER *pAd, uint32_t addr, uint32_t val) -{ - HostAccessFwCr(pAd, addr, CR_OP_WRITE, val); -} - -uint32_t read_cr(RTMP_ADAPTER *pAd, uint32_t addr) -{ - return HostAccessFwCr(pAd, addr, CR_OP_READ, 0); -} - -void intern_cmd(RTMP_ADAPTER *pAd, struct di_cmd *di_cmd) -{ - if (di_cmd->pre_handle) - di_cmd->pre_handle(pAd); - - if (di_cmd->post_handle) - di_cmd->post_handle(pAd); -} - -uint32_t get_cmd_done_cnt(RTMP_ADAPTER *pAd) -{ - return read_cr(pAd, DI_STATUS_REG) & DI_STATUS_CMD_DONE_CNT_MASK; -} - -void increase_cmd_done_cnt(void) -{ - cmd_done_cnt++; - cmd_done_cnt &= DI_STATUS_CMD_DONE_CNT_MASK; -} - -bool is_cmd_done(RTMP_ADAPTER *pAd) -{ - return ((cmd_done_cnt + 1) & DI_STATUS_CMD_DONE_CNT_MASK) == - get_cmd_done_cnt(pAd); -} - -void debug_probe_cmd(RTMP_ADAPTER *pAd, struct di_cmd *cmd) -{ - PREFIX_PRINTF(INFO, "\n"); - PREFIX_PRINTF(INFO, "====== cmd id: 0x%x, cmd name = %s ======\n", - cmd->id, cmd->name); - - if (cmd->pre_handle) - cmd->pre_handle(pAd); - - if (cmd->arg_num > 0) { - PREFIX_PRINTF(INFO, "set arg0: 0x%x\n", arg0); - write_cr(pAd, DI_ARG0_REG, arg0); - } - - if (cmd->arg_num > 1) { - PREFIX_PRINTF(INFO, "set arg1: 0x%x\n", arg1); - write_cr(pAd, DI_ARG1_REG, arg1); - } - - PREFIX_PRINTF(INFO, "set cmd: 0x%x\n", arg1); - write_cr(pAd, DI_CMD_REG, cmd->id); - - if (cmd->interrupt) - write_cr(pAd, DI_IRQ_REG, 1); - - /* read status CR */ - PREFIX_PRINTF(INFO, "wait cmd done...\n"); - while (!is_cmd_done(pAd)) { - PREFIX_PRINTF(DBG, "cmd_done_cnt = 0x%x\n", cmd_done_cnt); - RtmpusecDelay(WAIT_RET_US); - } - increase_cmd_done_cnt(); - - PREFIX_PRINTF(INFO, "status:\n"); - status = read_cr(pAd, DI_STATUS_REG); - - /* read return CR */ - if (cmd->res_num > 0) { - PREFIX_PRINTF(INFO, "get ret0:\n"); - ret0 = read_cr(pAd, DI_RET0_REG); - } - - if (cmd->res_num > 1) { - PREFIX_PRINTF(INFO, "get ret1:\n"); - ret1 = read_cr(pAd, DI_RET1_REG); - } - - if (cmd->post_handle) - cmd->post_handle(pAd); -} - -void print_help_msg(RTMP_ADAPTER *pAd) -{ - int i; - - for (i = 0; i < di_cmd_num; i++) { - if (strcmp(di_cmds[i].name, "")) - printk("./fdb %s %s\n", di_cmds[i].name, - di_cmds[i].help_msg); - } - - for (i = 0; i < IC_NUM; i++) { - printk("%s %s %s\n", exe_name, intern_cmds[i].name, - intern_cmds[i].help_msg); - } -} - -int intern_debug_probe_cmd_call(RTMP_ADAPTER *pAd, uint32_t cmd_id, - char *_arg0_str, char *_arg1_str) -{ - int i; - - arg0_str = _arg0_str; - arg1_str = _arg1_str; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 14)) - if (arg0_str) - kstrtoul(arg0_str, 16, (unsigned long *)&arg0); - - if (arg1_str) - kstrtoul(arg1_str, 16, (unsigned long *)&arg1); -#else - if (arg0_str) - strict_strtoul(arg0_str, 16, (unsigned long *)&arg0); - - if (arg1_str) - strict_strtoul(arg1_str, 16, (unsigned long *)&arg1); -#endif - - for (i = 0; i < di_cmd_num; i++) { - if (cmd_id == di_cmds[i].id) { - debug_probe_cmd(pAd, &di_cmds[i]); - break; - } - } - - return 0; -} - -void fdb_enable(RTMP_ADAPTER *pAd) -{ - printk("%s()\n", __FUNCTION__); - //pAd_tmp = pAd; - /* enable FDB */ - write_cr(pAd, DI_CMD_REG, 0x1101); - write_cr(pAd, DI_IRQ_REG, 1); - RtmpOsMsDelay(100); - read_cr(pAd, DI_STATUS_REG); - - /* enable FDB */ - write_cr(pAd, DI_CMD_REG, 0x1101); - write_cr(pAd, DI_IRQ_REG, 1); - RtmpOsMsDelay(100); - read_cr(pAd, DI_STATUS_REG); - - /* set break point at cos_assert (0x2860) */ - write_cr(pAd, DI_ARG0_REG, 0); - write_cr(pAd, DI_ARG1_REG, 0x2860); - write_cr(pAd, DI_CMD_REG, 0x1103); - write_cr(pAd, DI_IRQ_REG, 1); - RtmpOsMsDelay(100); - read_cr(pAd, DI_STATUS_REG); -} - -#define N9_SER_TRIGGER_REASON 0x80000204 - -/* backup PSE Error */ -#define N9_PSE_SPARE_DUMMY_CR1 0x820681e4 - -/* backup PLE Error */ -#define N9_PSE_SPARE_DUMMY_CR2 0x820681e8 - -/* backup LMAC WDT Error */ -#define N9_PSE_SPARE_DUMMY_CR3 0x820682e8 - -/* for 7663 SER status*/ -#define MT7663_N9_SER_TRIGGER_REASON 0x80000604 - -/* backup 7663 PSE Error */ -#define MT7663_N9_PSE_STATUS_CR 0x820681e4 - -/* backup 7663 PLE Error */ -#define MT7663_N9_PLE_STATUS_CR 0x820681e8 - -/* backup 7663 LMAC WDT Error */ -#define MT7663_N9_LMAC_STATUS_CR 0x820682ec - -/* Bora CL51004 */ -struct symbol_map { - char *addr; - char *name; -} symbol_map[] = { - { "0x020a7240", "g_u4LastPhase1LmacInterruptTriggerTime" }, - { "0x020a72c4", "g_u4Band1TxLastData" }, - { "0x020a71a4", "g_u4TxTrb3NotIdleCnt" }, - { "0x020a7210", "g_u4PseHifDataOpCnt" }, - { "0x020a7124", "g_u4RxTimeStamp" }, - { "0x020a7250", "g_u4CurrentTrbRx0Psr2State" }, - { "0x020a7260", "g_u4LmacResetTotalCnt" }, - { "0x020a70dc", "g_eSerPrevState" }, - { "0x020a72ac", "g_u4Pdma2TxRing0Cnt" }, - { "0x020a71fc", "g_u4PseHifQueueCmdCnt" }, - { "0x020a7148", "g_u4EtxBf0NotIdleCnt" }, - { "0x020a7174", "g_u4Wtbl1NotIdleCnt" }, - { "0x020a7120", "g_u4RxDMARDPtr" }, - { "0x020a72c8", "g_txhang_check_time" }, - { "0x020a7164", "g_u4Trb1NotIdleCnt" }, - { "0x020a726c", "g_u4UmacLmacResetCausebyPseCnt" }, - { "0x020a71b0", "g_u4TxTrb0NotIdleCnt" }, - { "0x020a70f8", "g_u4SerPatchPleStatus" }, - { "0x020a728c", "g_u4Tmac0ResetCnt" }, - { "0x020a7114", "g_u4RxAbortByUnDef3Cnt" }, - { "0x020a7224", "g_u4PseHifFsmCnt" }, - { "0x020a7258", "g_u4CurrentTrbRx1Psr2State" }, - { "0x020a718c", "g_u4Agg1NotIdleCnt" }, - { "0x020a7220", "g_u4PsePageLinkCnt" }, - { "0x020a712c", "g_u4R1RxDMARDPtr" }, - { "0x020a7280", "g_u4UmacLmacResetCausebyTxhangChkTxCnt" }, - { "0x020a719c", "g_u4RxTrb1NotIdleCnt" }, - { "0x020a721c", "g_u4PseFramLinkCnt" }, - { "0x020a71e4", "g_u4PleFramLinkCnt" }, - { "0x020a70e0", "g_eSerCurrState" }, - { "0x020a70f0", "g_u4SerPseStatus" }, - { "0x020a71c4", "g_u4PleHifQueueCmdCnt" }, - { "0x020a7188", "g_u4Tmac0NotIdleCnt" }, - { "0x020a714c", "g_u4Lp1NotIdleCnt" }, - { "0x020a720c", "g_u4PseLmacAlloNullCnt" }, - { "0x020a7274", "g_u4UmacLmacResetCausebyPdmaCnt" }, - { "0x020a7128", "g_u4RxbusyCnt" }, - { "0x020a7158", "g_u4Pf0NotIdleCnt" }, - { "0x020a711c", "g_u4RxAbortByPoolingCnt" }, - { "0x020a717c", "g_u4RxDma1NotIdleCnt" }, - { "0x020a71ac", "g_u4TxTrb1NotIdleCnt" }, - { "0x020a72a8", "g_u4Pdma1TxRing1Cnt" }, - { "0x020a70ec", "g_u4SerLmacStatus" }, - { "0x020a71b8", "g_u4TxDma0NotIdleCnt" }, - { "0x020a7298", "g_u4Pdma0TxRing1Cnt" }, - { "0x020a7234", "g_u4LastRxAbortTriggerTime" }, - { "0x020a71e8", "g_u4PlePageLinkCnt" }, - { "0x020a71a0", "g_u4RxTrb0NotIdleCnt" }, - { "0x020a7218", "g_u4PseLmacDataOpCnt" }, - { "0x020a71b4", "g_u4TxDma1NotIdleCnt" }, - { "0x020a72b0", "g_u4Pdma2TxRing1Cnt" }, - { "0x020a7104", "g_u4Tmac1AbortCnt" }, - { "0x020a7268", "g_u4UmacLmacResetCausebyPleCnt" }, - { "0x020a7228", "g_u4PseCpuFsmCnt" }, - { "0x020a72bc", "g_u4Band1txHangCnt" }, - { "0x020a7238", "g_u4CurrectRxAbortTriggerTime" }, - { "0x020a7194", "g_u4Arb1NotIdleCnt" }, - { "0x020a7204", "g_u4PseLmacQueueCmdCnt" }, - { "0x020a71e0", "g_u4PleLmacDataOpCnt" }, - { "0x020a7254", "g_u4LastTrbRx0Psr2State" }, - { "0x020a7270", "g_u4UmacLmacResetCausebyPcieCnt" }, - { "0x020a70e8", "g_enumSER_Host_State" }, - { "0x020a7108", "g_u4Tmac0AbortCnt" }, - { "0x020a72c0", "g_u4Band0TxLastData" }, - { "0x020a72a0", "g_u4Pdma0TxRing3Cnt" }, - { "0x020a7118", "g_u4RxAbortByUnDef7Cnt" }, - { "0x020a725c", "g_u4LastTrbRx1Psr2State" }, - { "0x020a7290", "g_u4Tmac1ResetCnt" }, - { "0x020a71bc", "g_u4TxhangStep1CheckCnt" }, - { "0x020a71ec", "g_u4PleHifFsmCnt" }, - { "0x020a7160", "g_u4Rmac0NotIdleCnt" }, - { "0x020a7140", "g_u4MuNotIdleCnt" }, - { "0x020a7214", "g_u4PseCpuDataOpCnt" }, - { "0x020a71f8", "g_u4PleBwCnt" }, - { "0x020a71f4", "g_u4PleLmacFsmCnt" }, - { "0x020a724c", "g_u4CurrentRxDmaPointer" }, - { "0x020a7278", "g_u4UmacLmacResetCausebyLmacCnt" }, - { "0x020a727c", "g_u4UmacLmacResetCausebyEbfCnt" }, - { "0x020a7288", "g_u4LmacEbfTxResetCnt" }, - { "0x020a7208", "g_u4PseHifAlloNullCnt" }, - { "0x020a7200", "g_u4PseCpuQueueCmdCnt" }, - { "0x020a7244", "g_u4CurrentPhase1LmacInterruptTriggerTime" }, - { "0x020a7184", "g_u4Tmac1NotIdleCnt" }, - { "0x020a7264", "g_u4UmacLmacResetTotalCnt" }, - { "0x020a7100", "g_u4SerPCIeStatus" }, - { "0x020a723c", "g_u4ContinuousPhase1LmacInterruptCount" }, - { "0x020a71f0", "g_u4PleCpuFsmCnt" }, - { "0x020a716c", "g_u4Sec1NotIdleCnt" }, - { "0x020a7248", "g_u4LastRxDmaPointer" }, - { "0x020a72b4", "g_u4PdmaAllRxCnt" }, - { "0x020a7150", "g_u4Lp0NotIdleCnt" }, - { "0x020a7168", "g_u4Trb0NotIdleCnt" }, - { "0x020a70e4", "g_enumSER_CR4_State" }, - { "0x020a7154", "g_u4Pf1NotIdleCnt" }, - { "0x020a7170", "g_u4Sec0NotIdleCnt" }, - { "0x020a7178", "g_u4Wtbl0NotIdleCnt" }, - { "0x020a7144", "g_u4EtxBf1NotIdleCnt" }, - { "0x020a729c", "g_u4Pdma0TxRing2Cnt" }, - { "0x020a71d4", "g_u4PleLmacAlloNullCnt" }, - { "0x020a713c", "g_u4LmacResetByPhase1Cnt" }, - { "0x020a71c0", "g_u4TxhangStep2CheckCnt" }, - { "0x020a7134", "g_u4R1RxbusyCnt" }, - { "0x020a71a8", "g_u4TxTrb2NotIdleCnt" }, - { "0x020a71cc", "g_u4PleLmacQueueCmdCnt" }, - { "0x020a7284", "g_u4UmacLmacResetCausebyTxhangChkRxCnt" }, - { "0x020a71d8", "g_u4PleHifDataOpCnt" }, - { "0x020a72a4", "g_u4Pdma1TxRing0Cnt" }, - { "0x020a70f4", "g_u4SerPleStatus" }, - { "0x020a72b8", "g_u4Band0txHangCnt" }, - { "0x020a722c", "g_u4PseLmacFsmCnt" }, - { "0x020a7190", "g_u4Agg0NotIdleCnt" }, - { "0x020a70fc", "g_u4SerPdmaStatus" }, - { "0x020a71dc", "g_u4PleCpuDataOpCnt" }, - { "0x020a7110", "g_u4RxAbortByHdr0Cnt" }, - { "0x020a7180", "g_u4RxDma0NotIdleCnt" }, - { "0x020a71c8", "g_u4PleCpuQueueCmdCnt" }, - { "0x020a7138", "g_u4LmacResetBy3AbortCnt" }, - { "0x020a7294", "g_u4Pdma0TxRing0Cnt" }, - { "0x020a7198", "g_u4Arb0NotIdleCnt" }, - { "0x020a7230", "g_u4ContinuousTriggerRxAbortCount" }, - { "0x020a715c", "g_u4Rmac1NotIdleCnt" }, - { "0x020a7130", "g_u4R1RxTimeStamp" }, - { "0x020a71d0", "g_u4PleHifAlloNullCnt" }, - { "0x020a710c", "g_u4RxAbortStatus" }, - { NULL, NULL }, -}; - -void n9_dump(RTMP_ADAPTER *pAd) -{ - uint32_t i = 0; - uint32_t value = 0; - uint32_t assert = 0; - uint32_t exception = 0; - struct symbol_map *symbol_map_p; - - cmd_done_cnt = get_cmd_done_cnt(pAd); - di_cmd_num = sizeof(di_cmds) / sizeof(struct di_cmd); - - printk("============== N9 dump =============\n"); - - value = HostAccessFwCr(pAd, DI_STATUS_REG, CR_OP_READ, 0); - assert = (value & DI_STATUS_N9_ASSERT_MASK) >> DI_STATUS_N9_ASSERT_SHFT; - exception = (value & DI_STATUS_N9_EXCEPTION_MASK) >> - DI_STATUS_N9_EXCEPTION_SHFT; - - printk("ASSERT: %d\n", assert); - printk("EXCEPTION: %d\n", exception); - - intern_debug_probe_cmd_call(pAd, DIC_FDB_STOP, NULL, NULL); - - if (assert) { - intern_debug_probe_cmd_call(pAd, DIC_READ1, "0x02090667", NULL); - printk("exp_assert_state = 0x%x\n", ret0); - } - - if (exception) { - intern_debug_probe_cmd_call(pAd, DIC_READ4, "0x0209a460", NULL); - printk("exception_entry = 0x%x\n", ret0); - } - - printk("call trace:\n"); - dump_call_trace(pAd); - - printk("get PC 10 times\n"); - for (i = 0; i < 10; i++) { - intern_debug_probe_cmd_call(pAd, DIC_FDB_GET_CPU_REG, "PC", - NULL); - printk("PC = 0x%x\n", ret0); - - if (ret0 == 0xa1c) - break; - - intern_debug_probe_cmd_call(pAd, DIC_FDB_CONTINUE, NULL, NULL); - RtmpusecDelay(10000); - RtmpusecDelay(10000); - RtmpusecDelay(10000); - RtmpusecDelay(10000); - RtmpusecDelay(10000); - intern_debug_probe_cmd_call(pAd, DIC_FDB_STOP, NULL, NULL); - RtmpusecDelay(10000); - RtmpusecDelay(10000); - } - - printk("============== N9 dump end =============\n"); - - printk("============== SER dump (symbol ver. CL#160476) =============\n"); - - if (IS_MT7663(pAd)) { - printk("MT7663_N9_SER_TRIGGER_REASON = 0x%x\n", - HostAccessFwCr(pAd, MT7663_N9_SER_TRIGGER_REASON, - CR_OP_READ, 0)); - printk("MT7663_N9_PSE_STATUS_CR = 0x%x\n", - HostAccessFwCr(pAd, MT7663_N9_PSE_STATUS_CR, CR_OP_READ, - 0)); - printk("MT7663_N9_PLE_STATUS_CR = 0x%x\n", - HostAccessFwCr(pAd, MT7663_N9_PLE_STATUS_CR, CR_OP_READ, - 0)); - printk("MT7663_N9_LMAC_STATUS_CR = 0x%x\n", - HostAccessFwCr(pAd, MT7663_N9_LMAC_STATUS_CR, CR_OP_READ, - 0)); - } else { - printk("SER_TRIGGER_REASON = 0x%x\n", - HostAccessFwCr(pAd, N9_SER_TRIGGER_REASON, CR_OP_READ, - 0)); - printk("PSE_SPARE_DUMMY_CR1 = 0x%x\n", - HostAccessFwCr(pAd, N9_PSE_SPARE_DUMMY_CR1, CR_OP_READ, - 0)); - printk("PSE_SPARE_DUMMY_CR2 = 0x%x\n", - HostAccessFwCr(pAd, N9_PSE_SPARE_DUMMY_CR2, CR_OP_READ, - 0)); - printk("PSE_SPARE_DUMMY_CR3 = 0x%x\n", - HostAccessFwCr(pAd, N9_PSE_SPARE_DUMMY_CR3, CR_OP_READ, - 0)); - } - - for (symbol_map_p = &symbol_map[0]; symbol_map_p->addr; - symbol_map_p++) { - intern_debug_probe_cmd_call(pAd, DIC_READ4, symbol_map_p->addr, - NULL); - printk("%s(%s) = 0x%x\n", symbol_map_p->name, - symbol_map_p->addr, ret0); - } - printk("============== SER dump end=============\n"); -} - -#define CR4_CMD_CR 0x82000208 -#define CR4_TRIGGER_CR 0x820400C0 -#define CR4_RET0_CR 0x8200020c - -#define CR4_PRINT_CR(_pAd, addr) \ - printk("0x%x = 0x%x\n", addr, \ - HostAccessFwCr(_pAd, addr, CR_OP_READ, 0)); - -#define CR4_CMD(_pAd, cmd) \ - printk("cmd = 0x%x, return = 0x%x\n", cmd, cr4_cmd(_pAd, cmd)); - -uint32_t cr4_cmd(RTMP_ADAPTER *pAd, uint32_t cmd) -{ - uint32_t val = 0; - - /* cmd */ - HostAccessFwCr(pAd, CR4_CMD_CR, CR_OP_WRITE, cmd); - - /* trigger */ - HostAccessFwCr(pAd, CR4_TRIGGER_CR, CR_OP_WRITE, 0x10); - - RtmpusecDelay(10000); - RtmpusecDelay(10000); - RtmpusecDelay(10000); - RtmpusecDelay(10000); - RtmpusecDelay(10000); - - /* read return */ - val = HostAccessFwCr(pAd, CR4_RET0_CR, CR_OP_READ, 0); - - HostAccessFwCr(pAd, CR4_RET0_CR, CR_OP_WRITE, 0); - - return val; -} - -void cr4_dump(RTMP_ADAPTER *pAd) -{ - int i = 0; - - /* - # CR4 HeartBeat and system info Status CR - iwpriv ra0 mac 82000200 - # CR4 debug probe self test - iwpriv ra0 mac 82000208=ffffffff;iwpriv ra0 mac 820400C0=10;sleep 1;iwpriv ra0 mac 8200020c - iwpriv ra0 mac 8200020c=0 - iwpriv ra0 mac 82000208=ffffffff;iwpriv ra0 mac 820400C0=10;sleep 1;iwpriv ra0 mac 8200020c - iwpriv ra0 mac 82000200 - */ - printk("============== cr4 dump start=============\n"); - printk("CR4 HeartBeat and system info Status CR\n"); - CR4_PRINT_CR(pAd, 0x82000200); - CR4_CMD(pAd, 0xffffffff); - CR4_CMD(pAd, 0xffffffff); - CR4_PRINT_CR(pAd, 0x82000200); - - /* Task and PC related: read three time to comfirm */ - printk("Task and PC related: read three time to comfirm\n"); - for (i = 0; i < 3; i++) { - CR4_CMD(pAd, 0x200); - CR4_CMD(pAd, 0x201); - CR4_CMD(pAd, 0x100); - CR4_CMD(pAd, 0x101); - CR4_CMD(pAd, 0x102); - CR4_CMD(pAd, 0x103); - CR4_CMD(pAd, 0x104); - CR4_CMD(pAd, 0x226); - } - - /* Packet monitor related */ - printk("Packet monitor related\n"); - CR4_CMD(pAd, 0x1); - CR4_CMD(pAd, 0x4); - CR4_CMD(pAd, 0x5); - - /* Exception related */ - printk("Exception related\n"); - CR4_CMD(pAd, 0x228); - CR4_CMD(pAd, 0x229); - CR4_CMD(pAd, 0x230); - - /* SER related */ - printk("SER related\n"); - CR4_CMD(pAd, 0x210); - CR4_CMD(pAd, 0x211); - CR4_CMD(pAd, 0x212); - CR4_CMD(pAd, 0x213); - CR4_CMD(pAd, 0x215); - - /* PDMA1 related */ - printk("PDMA1 related\n"); - CR4_PRINT_CR(pAd, 0x820b0204); - CR4_PRINT_CR(pAd, 0x820b0004); - CR4_PRINT_CR(pAd, 0x820b0008); - CR4_PRINT_CR(pAd, 0x820b000c); - - CR4_PRINT_CR(pAd, 0x820b0014); - CR4_PRINT_CR(pAd, 0x820b0018); - CR4_PRINT_CR(pAd, 0x820b001c); - - CR4_PRINT_CR(pAd, 0x820b0104); - CR4_PRINT_CR(pAd, 0x820b0108); - CR4_PRINT_CR(pAd, 0x820b010c); - - CR4_PRINT_CR(pAd, 0x820b0114); - CR4_PRINT_CR(pAd, 0x820b0118); - CR4_PRINT_CR(pAd, 0x820b011c); - - /* PDMA2 related */ - printk("PDMA2 related\n"); - CR4_PRINT_CR(pAd, 0x820c0204); - CR4_PRINT_CR(pAd, 0x820c0004); - CR4_PRINT_CR(pAd, 0x820c0008); - CR4_PRINT_CR(pAd, 0x820c000c); - - CR4_PRINT_CR(pAd, 0x820c0014); - CR4_PRINT_CR(pAd, 0x820c0018); - CR4_PRINT_CR(pAd, 0x820c001c); - - CR4_PRINT_CR(pAd, 0x820c0104); - CR4_PRINT_CR(pAd, 0x820c0108); - CR4_PRINT_CR(pAd, 0x820c010c); - - CR4_PRINT_CR(pAd, 0x820c0114); - CR4_PRINT_CR(pAd, 0x820c0118); - CR4_PRINT_CR(pAd, 0x820c011c); - printk("============== cr4 dump end=============\n"); -} - -INT show_fdb_n9_log(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - n9_dump(pAd); - return TRUE; -} - -INT show_fdb_cr4_log(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - cr4_dump(pAd); - return TRUE; -} - -#endif /* MT_FDB */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.ap.soc b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.ap.soc deleted file mode 100644 index 03505fcfda..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.ap.soc +++ /dev/null @@ -1,161 +0,0 @@ -config RT2860V2_AP - tristate "Ralink RT2860 802.11n AP support" - depends on NET_RADIO - -config RT2860V2_AP_V24_DATA_STRUCTURE - bool - depends on RT2860V2_AP - default y - -config RT2860V2_AP_LED - bool "LED Support" - depends on RT2860V2_AP - -config RT2860V2_AP_WSC - bool "WSC (WiFi Simple Config)" - depends on RT2860V2_AP - -config RT2860V2_AP_HS - bool "HS2.0 Support" - depends on RT2860V2_AP - -config RT2860V2_AP_LLTD - bool "LLTD (Link Layer Topology Discovery Protocol)" - depends on RT2860V2_AP - -config RT2860V2_AP_WDS - bool "WDS" - depends on RT2860V2_AP - -config RT2860V2_AP_NINTENDO - bool "Nintendo" - depends on RT2860V2_AP - -config RT2860V2_AP_WMM_ACM - bool "WMM ACM" - depends on RT2860V2_AP - -config RT2860V2_AP_MBSS - bool "MBSSID" - depends on RT2860V2_AP - -config NEW_MBSSID_MODE - bool "New MBSSID MODE" - depends on RT2860V2_AP - depends on RT2860V2_AP_MBSS - depends on RALINK_RT3883 || RALINK_RT3352 || RALINK_RT5350 - default n - -config RT2860V2_AP_APCLI - bool "AP-CLient Support" - depends on RT2860V2_AP - -config RT2860V2_AP_IGMP_SNOOP - bool "IGMP snooping" - depends on RT2860V2_AP - -config RT2860V2_AP_NETIF_BLOCK - bool "NETIF Block" - depends on RT2860V2_AP - help - Support Net interface block while Tx-Sw queue full - -config RT2860V2_AP_DFS - bool "DFS" - depends on RT2860V2_AP - -config RT2860V2_AP_CARRIER - bool "Carrier Detect" - depends on RT2860V2_AP - -config RT2860V2_AP_DLS - bool "DLS ((Direct-Link Setup) Support" - depends on RT2860V2_AP - -config RT2860V2_AP_IDS - bool "IDS (Intrusion Detection System) Support" - depends on RT2860V2_AP - -config RT2860V2_AP_MESH - bool "MESH Support" - depends on RT2860V2_AP - -config RT2860V2_HW_ANTENNA_DIVERSITY - bool "Antenna Diversity Support" - depends on RT2860V2_AP - depends on RALINK_RT5350 - -config RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY - bool "Antenna Diversity Support" - depends on RT2860V2_AP - -config RT2860V2_AP_WAPI - bool "WAPI Support" - depends on RT2860V2_AP - -config RT2860V2_AP_COC - bool "CoC Support" - depends on RT2860V2_AP - -config RT2860V2_AP_MEMORY_OPTIMIZATION - bool "Memory Optimization" - depends on RT2860V2_AP - -config RT2860V2_AP_VIDEO_TURBINE - bool "Video Turbine support" - depends on RT2860V2_AP - -config RA_CLASSIFIER - tristate "Ralink Flow Classifier" - depends on RT2860V2_AP_VIDEO_TURBINE - default n - -config RT2860V2_80211N_DRAFT3 - bool "802.11n Draft3" - depends on RT2860V2_AP - -config RT2860V2_AP_INTELLIGENT_RATE_ADAPTION - bool "Intelligent Rate Adaption" - depends on RT2860V2_AP - -config RT2860V2_AP_TXBF - bool "Tx Beam Forming" - depends on RT2860V2_AP - depends on RALINK_RT3883 - -config RT2860V2_AP_RTMP_INTERNAL_TX_ALC - bool "TSSI Compensation" - depends on RT2860V2_AP - depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 - -#config RT2860V2_EXT_CHANNEL_LIST -# bool "Extension Channel List" -# depends on RT2860V2_AP - -#config RT2860V2_KTHREAD -# bool "Kernel Thread" -# depends on RT2860V2_AP - -#config RT2860V2_AUTO_CH_SELECT_ENHANCE -# bool "Auto Channel Selection Enhancement" -# depends on RT2860V2_AP - -#config RT2860V2_80211R_FT -# bool "802.11r Fast BSS Transition" -# depends on RT2860V2_AP - -#config RT2860V2_80211R_RR -# bool "802.11k Radio Resource Management" -# depends on RT2860V2_AP - -#config RT2860V2_SINGLE_SKU -# bool "Single SKU" -# depends on RT2860V2_AP - -#config RT2860V2_MCAST_RATE_SPECIFIC -# bool "User specific tx rate of mcast pkt" -# depends on RT2860V2_AP - -#config RT2860V2_SNMP -# bool "Net-SNMP Support" -# depends on RT2860V2_AP diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi deleted file mode 100644 index 27394e2e41..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi +++ /dev/null @@ -1,543 +0,0 @@ -config MT_WIFI - tristate "MT WIFI Driver" - select WIFI_BASIC_FUNC if MT_WIFI - -config MT_WIFI_PATH - string - depends on MT_WIFI - default "mt_wifi" - -if MT_WIFI -menu "WiFi Generic Feature Options" -choice - prompt "EEPROM Type of 1st Card" - depends on ! FIRST_IF_NONE - - config FIRST_IF_EEPROM_FLASH - bool "FLASH" - - config FIRST_IF_EEPROM_EFUSE - bool "EFUSE" -endchoice - -config RT_FIRST_CARD_EEPROM - string - depends on ! FIRST_IF_NONE - default "flash" if FIRST_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 2nd Card" - depends on ! SECOND_IF_NONE - - config SECOND_IF_EEPROM_FLASH - bool "FLASH" - - config SECOND_IF_EEPROM_PROM - bool "EEPROM" - - config SECOND_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config RT_SECOND_CARD_EEPROM - string - depends on ! SECOND_IF_NONE - default "prom" if SECOND_IF_EEPROM_PROM - default "efuse" if SECOND_IF_EEPROM_EFUSE - default "flash" if SECOND_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 3th Card" - depends on ! THIRD_IF_NONE - - config THIRD_IF_EEPROM_FLASH - bool "FLASH" - - config THIRD_IF_EEPROM_PROM - bool "EEPROM" - - config THIRD_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config RT_THIRD_CARD_EEPROM - string - depends on ! THIRD_IF_NONE - default "prom" if THIRD_IF_EEPROM_PROM - default "efuse" if THIRD_IF_EEPROM_EFUSE - default "flash" if THIRD_IF_EEPROM_FLASH - -config MULTI_INF_SUPPORT - bool - default y if !FIRST_IF_NONE && !SECOND_IF_NONE - -config WIFI_BASIC_FUNC - bool "Basic Functions" - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config DOT11_N_SUPPORT - bool "802.11n support" - default y - -config DOT11_VHT_AC - bool "802.11AC support" - depends on WIFI_DRIVER - depends on DOT11_N_SUPPORT - default y - -config G_BAND_256QAM_SUPPORT - bool "2.4G 256QAM support" - depends on WIFI_DRIVER - depends on DOT11_VHT_AC - default y - -config TPC_SUPPORT - bool "802.11h TPC Support" - depends on WIFI_DRIVER - default y - -config ICAP_SUPPORT - bool "ICAP Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config SPECTRUM_SUPPORT - bool "Wifi Spectrum Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config BACKGROUND_SCAN_SUPPORT - bool "Background Scan Support" - depends on WIFI_DRIVER - default y - -config SMART_CARRIER_SENSE_SUPPORT - bool "Smart Carrier Sense Support" - depends on WIFI_DRIVER - default y - -config MT_DFS_SUPPORT - bool "Dynamic Frequency Selection Support" - depends on WIFI_DRIVER - default y -config MTK_OFFCHANNEL_SCAN_FEATURE - bool "Channel Quality Monitor" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - default n - -config MTK_DPP_SUPPORT - bool "DPP Support" - depends on MTK_WIFI_DRIVER - depends on MTK_MT_AP_SUPPORT - select DOT11W_PMF_SUPPORT - default n -#config WFA_VHT_R2_PF -# bool "WFA VHT R2 Plugfest" -# depends on DOT11_VHT_AC -# default n - -config HDR_TRANS_TX_SUPPORT - bool "Tx Header Translation" - depends on CHIP_MT7615E || CHIP_MT7622 || CHIP_MT7663E - default y - -config HDR_TRANS_RX_SUPPORT - bool "Rx Header Translation" - depends on CHIP_MT7615E || CHIP_MT7622 || CHIP_MT7663E - default y - -config DBDC_MODE - bool "dbdc mode support" - depends on CHIP_MT7615E - select MULTI_PROFILE_SUPPORT -# select DEFAULT_5G_PROFILE - default y - -config MULTI_PROFILE_SUPPORT - bool "Multi Profile Support" - depends on DBDC_MODE - default y - -config DEFAULT_5G_PROFILE - bool "5G default profile for DBDC" - depends on DBDC_MODE - default n - -config WSC_INCLUDED - bool "WSC (WiFi Simple Config)" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config WSC_V2_SUPPORT - bool "WSC V2(WiFi Simple Config Version 2.0)" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config DOT11W_PMF_SUPPORT - bool "PMF" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config TXBF_SUPPORT - bool "Tx Bean Forming Support" - depends on WIFI_DRIVER - default y - -config FAST_NAT_SUPPORT - bool "Fast-NAT support" - depends on RA_HW_NAT_WIFI - default n - -config WHNAT_SUPPORT - tristate "Wifi Hardware NAT support" - depends on CHIP_MT7615E - depends on WLAN_HOOK - depends on FAST_NAT_SUPPORT - default n - -#config LLTD_SUPPORT -# bool "LLTD (Link Layer Topology Discovery Protocol)" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config QOS_DLS_SUPPORT -# bool "802.11e DLS ((Direct-Link Setup) Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config WAPI_SUPPORT -# bool "WAPI Support" -# depends on WIFI_DRIVER -# default n - -config FTM_SUPPORT - bool "FTM Support" - depends on WIFI_DRIVER - select PASSPOINT_R2 - default n - -config MBO_SUPPORT - bool "MBO Support" - depends on WIFI_DRIVER - select INTERWORKING - select WNM_SUPPORT - select DOT11K_RRM_SUPPORT - select DOT11R_FT_SUPPORT - select DOT11W_PMF_SUPPORT - default n - -#config CARRIER_DETECTION_SUPPORT -# bool "Carrier Detect" -# depends on WIFI_DRIVER -# default n - -config IGMP_SNOOP_SUPPORT - bool "IGMP snooping" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -#config BLOCK_NET_IF -# bool "NETIF Block" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n -# help -# Support Net interface block while Tx-Sw queue full - -#config RATE_ADAPTION -# bool "New Rate Adaptation support" -# depends on WIFI_DRIVER -# default y - -#config NEW_RATE_ADAPT_SUPPORT -# bool "Intelligent Rate Adaption" -# depends on WIFI_DRIVER && RATE_ADAPTION -# default y - -#config AGS_SUPPORT -# bool "Adaptive Group Switching" -# depends on WIFI_DRIVER && RATE_ADAPTION -# depends on MT_AP_SUPPORT || MT_STA_SUPPORT -# default n - -#config RATE_ADAPT_AGBS_SUPPORT -# bool "Adaptive AGBS Mode" -# depends on WIFI_DRIVER && RATE_ADAPTION -# depends on MT_AP_SUPPORT || MT_STA_SUPPORT -# default y - -#config IDS_SUPPORT -# bool "IDS (Intrusion Detection System) Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config WIFI_WORK_QUEUE -# bool "Work Queue" -# depends on WIFI_DRIVER -# default n - -#config WIFI_SKB_RECYCLE -# bool "SKB Recycle(Linux)" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -config RTMP_FLASH_SUPPORT - bool "Flash Support" - depends on WIFI_DRIVER - default y - -config PRE_CAL_TRX_SET1_SUPPORT - bool "Calibration To Flash/BinFile Support" - depends on WIFI_DRIVER - default y - -config RLM_CAL_CACHE_SUPPORT - bool "RlmCalibrationCache Support" - depends on WIFI_DRIVER - default y - -config PRE_CAL_TRX_SET2_SUPPORT - bool "Pre-calibration to Flash Support" - depends on WIFI_DRIVER - default y - -config CAL_BIN_FILE_SUPPORT - bool "Calibration to BinFile Support" - depends on WIFI_DRIVER - default y - -config RF_LOCKDOWN_SUPPORT - bool "RF Lockdown Support" - depends on WIFI_DRIVER - default n - -config LINK_TEST_SUPPORT - bool "Link Test Support" - depends on WIFI_DRIVER - default y - -#config LED_CONTROL_SUPPORT -# bool "LED Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -config ATE_SUPPORT - bool "ATE/QA Support" - depends on WIFI_DRIVER - default y - -#config MEMORY_OPTIMIZATION -# bool "Memory Optimization" -# depends on WIFI_DRIVER -# default n - -config PASSPOINT_R2 - bool "Passpoint Release-2 Support" - depends on WIFI_DRIVER - select DOT11W_PMF_SUPPORT - depends on MT_AP_SUPPORT - default n - -#config TRACE_TCP_PKT -# bool "TCP DATA/ACK packets trace log" -# depends on WIFI_DRIVER -# default n - -config UAPSD - bool "UAPSD support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config TCP_RACK_SUPPORT - bool "TCP Reduced ACK support" - depends on WIFI_DRIVER - default n - -#### PA_LNA_Type choice - -config RED_SUPPORT - bool "RED(Random Early Drop) support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config FDB_SUPPORT - bool "FW Debug Port" - depends on WIFI_DRIVER - default n - -choice - prompt "PA LNA Type of 1st Card" - depends on ! FIRST_IF_NONE - - config FIRST_IF_EPAELNA - bool "ePAeLNA" - config FIRST_IF_IPAILNA - bool "iPAiLNA" - config FIRST_IF_IPAELNA - bool "iPAeLNA" -# config FIRST_IF_EPAILNA -# bool "ePAiLNA" -endchoice -choice - prompt "PA LNA Type of 2nd Card" - depends on ! SECOND_IF_NONE - - config SECOND_IF_EPAELNA - bool "ePAeLNA" - config SECOND_IF_IPAILNA - bool "iPAiLNA" - config SECOND_IF_IPAELNA - bool "iPAeLNA" -# config SECOND_IF_EPAILNA -# bool "ePAiLNA" -endchoice -choice - prompt "PA LNA Type of 3rd Card" - depends on ! THIRD_IF_NONE - - config THIRD_IF_EPAELNA - bool "ePAeLNA" - config THIRD_IF_IPAILNA - bool "iPAiLNA" - config THIRD_IF_IPAELNA - bool "iPAeLNA" -# config THIRD_IF_EPAILNA -# bool "ePAiLNA" -endchoice -#### PA_LNA_Type choice END - -# -# Section for chip architectures -# -# "RLT MAC Support" -config RLT_MAC - bool - depends on WIFI_DRIVER - default n - -config RLT_BBP - bool - -config RLT_RF - bool - -# "RTMP MAC Support" -config RTMP_MAC - bool - depends on WIFI_DRIVER - default n - -config RTMP_BBP - bool - -config RTMP_RF - bool - -# -# Section for interfaces -# -config RTMP_PCI_SUPPORT - bool - -config RTMP_USB_SUPPORT - bool - -config RTMP_RBUS_SUPPORT - bool - -endmenu - -menu "WiFi Operation Modes" - choice - prompt "Main Mode" - default WIFI_MODE_AP - - config WIFI_MODE_AP - tristate "AP" - select MT_AP_SUPPORT - - config WIFI_MODE_STA - tristate "STA" - select MT_STA_SUPPORT - - config WIFI_MODE_BOTH - tristate "APSTA" - select MT_AP_SUPPORT - select MT_STA_SUPPORT - endchoice - - if WIFI_MODE_AP || WIFI_MODE_BOTH - source "drivers/net/wireless/mtk/mt7615e/mt_wifi_ap/Kconfig" - endif - - if WIFI_MODE_STA || WIFI_MODE_BOTH - source "drivers/net/wireless/mtk/mt7615e/mt_wifi_sta/Kconfig" - endif -endmenu - -endif - -if WIFI_RLT_MAC - config RLT_MAC - bool - default y -endif - -if WIFI_RTMP_MAC - config RTMP_MAC - bool - default y -endif - -if WIFI_MT_MAC - config MT_MAC - bool - default y - - config CHIP_MT7603E - bool - default n - - config CHIP_MT7615E - bool - default n - - config CHIP_MT7622 - bool - default n - - config CHIP_MT7663E - bool - default n -endif - -if CHIP_MT7615E - config MT_MAC - bool - default y - select RATE_ADAPTION - select RATE_ADAPT_AGBS_SUPPORT - select DOT11_N_SUPPORT - select DOT11_VHT_AC - select HDR_TRANS_TX_SUPPORT - select HDR_TRANS_RX_SUPPORT -endif - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_3_18 b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_3_18 deleted file mode 100644 index 87fb53c25d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_3_18 +++ /dev/null @@ -1,685 +0,0 @@ -############# -# Wireless -############# -menuconfig MTK_WIFI_DRIVER - bool "Mediatek WiFi Driver Support" - select WIFI_DRIVER - - config WIFI_DRIVER - bool - -if WIFI_DRIVER - -choice - prompt "Choose First WiFi Interface" - config FIRST_IF_NONE - bool "None" - - config FIRST_IF_RT2860 - bool "RT2860 for rt2860v2 wifi driver" - select WIFI_RTMP_MAC - select RALINK_RT2860 - - config FIRST_IF_MT7620 - bool "MT7620 for rlt_wifi wifi driver" - select WIFI_RTMP_MAC - select RALINK_RT6352 - - config FIRST_IF_MT7628 - bool "MT7628 for rlt_wifi wifi driver" - depends on RALINK_MT7628 - select WIFI_MT_MAC - - config FIRST_IF_RT3092 - bool "RT3092" - select WIFI_RTMP_MAC - select RALINK_RT3092 - - config FIRST_IF_RT5392 - bool "RT5392" - select WIFI_RTMP_MAC - select RALINK_RT5392 - - config FIRST_IF_RT5592 - bool "RT5592" - select WIFI_RTMP_MAC - select RALINK_RT5592 - - config FIRST_IF_RT3593 - bool "RT3593" - select WIFI_RTMP_MAC - select RALINK_RT3593 - - config FIRST_IF_MT7610E - bool "MT7610E" - select WIFI_RLT_MAC - select RALINK_MT7610E - - config FIRST_IF_MT7612E - bool "MT7612E" - select WIFI_RLT_MAC - select RALINK_MT7612E - - config FIRST_IF_MT7602E - bool "MT7602E" - select WIFI_RLT_MAC - select RALINK_MT7602E - - config FIRST_IF_MT7603E - bool "MT7603E" - select WIFI_MT_MAC - select CHIP_MT7603E - - config FIRST_IF_MT7615E - bool "MT7615E" - select WIFI_MT_MAC - select MT_MAC - select CHIP_MT7615E -endchoice - -choice - prompt "Choose Second WiFi Interface" - config SECOND_IF_NONE - bool "None" - - config SECOND_IF_RT3092 - bool "RT3092" - select WIFI_RTMP_MAC - select RALINK_RT3092 - - config SECOND_IF_RT5392 - bool "RT5392" - select WIFI_RTMP_MAC - select RALINK_RT5392 - - config SECOND_IF_RT5592 - bool "RT5592" - select WIFI_RTMP_MAC - select RALINK_RT5592 - - config SECOND_IF_RT3593 - bool "RT3593" - select WIFI_RTMP_MAC - select RALINK_RT3593 - - config SECOND_IF_RT3572 - bool "RT3572" - select WIFI_RTMP_MAC - select RALINK_RT3572 - - config SECOND_IF_RT5572 - bool "RT5572" - select WIFI_RTMP_MAC - select RALINK_RT5572 - - config SECOND_IF_MT7620 - bool "MT7620" - select WIFI_RTMP_MAC - select RALINK_RT6352 - - config SECOND_IF_MT7610U - bool "MT7610U" - select WIFI_RLT_MAC - select RALINK_MT7610U - - config SECOND_IF_MT7610E - bool "MT7610E" - select WIFI_RLT_MAC - select RALINK_MT7610E - - config SECOND_IF_RT8592 - bool "RT85592" - select WIFI_RLT_MAC - select RALINK_RT8592 - - config SECOND_IF_MT7612U - bool "MT7612U" - select WIFI_RLT_MAC - select RALINK_MT7612U - - config SECOND_IF_MT7612E - bool "MT7612E" - select WIFI_RLT_MAC - select RALINK_MT7612E - - config SECOND_IF_MT7602E - bool "MT7602E" - select WIFI_RLT_MAC - select RALINK_MT7602E - - config SECOND_IF_MT7603E - bool "MT7603E" - select WIFI_MT_MAC - select CHIP_MT7603E - - config SECOND_IF_MT7615E - bool "MT7615E" - select WIFI_MT_MAC - select CHIP_MT7615E -endchoice - -config RT_FIRST_CARD - int - depends on ! FIRST_IF_NONE - default 2860 if FIRST_IF_RT2860 - default 7620 if FIRST_IF_MT7620 - default 7628 if FIRST_IF_MT7628 - default 3090 if FIRST_IF_RT3092 - default 5392 if FIRST_IF_RT5392 - default 5592 if FIRST_IF_RT5592 - default 3593 if FIRST_IF_RT3593 - default 7610 if FIRST_IF_MT7610E - default 7612 if FIRST_IF_MT7612E - default 7602 if FIRST_IF_MT7602E - default 7603 if FIRST_IF_MT7603E - default 7615 if FIRST_IF_MT7615E - -config RT_SECOND_CARD - int - depends on ! SECOND_IF_NONE - default 3090 if SECOND_IF_RT3092 - default 5392 if SECOND_IF_RT5392 - default 5592 if SECOND_IF_RT5592 - default 3593 if SECOND_IF_RT3593 - default 7610 if SECOND_IF_MT7610E - default 8592 if SECOND_IF_RT8592 - default 3572 if SECOND_IF_RT3572 - default 5572 if SECOND_IF_RT5572 - default 7612 if SECOND_IF_MT7612E || SECOND_IF_MT7612U - default 7602 if SECOND_IF_MT7602E - default 7603 if SECOND_IF_MT7603E - default 7615 if SECOND_IF_MT7615E - -config RT_FIRST_IF_RF_OFFSET - hex - depends on ! FIRST_IF_NONE - default 0x40000 - -config RT_SECOND_IF_RF_OFFSET - hex - depends on ! SECOND_IF_NONE - default 0x48000 - -config RT2860V2_2850 - bool "Dual Band" - depends on RALINK_RT2880 - -choice - prompt "RF Type" - depends on RALINK_RT5350 - default RALINK_RT5350_1T1R - - config RALINK_RT5350_1T1R - bool "1T1R" -endchoice - -choice - prompt "RF Type" - depends on RALINK_RT3052 - default RALINK_RT3052_2T2R - - config RALINK_RT3050_1T1R - bool "1T1R" - - config RALINK_RT3051_1T2R - bool "1T2R" - - config RALINK_RT3052_2T2R - bool "2T2R" -endchoice - -choice - prompt "RF Type" - depends on RALINK_RT3352 - - config RALINK_RT3352_2T2R - bool "2T2R" -endchoice - -choice - prompt "RF Type" - depends on RALINK_RT3883 - - config RALINK_RT3662_2T2R - bool "2T3R (RT3662)" - - config RALINK_RT3883_3T3R - bool "3T3R (RT3883)" -endchoice - -config RTDEV_MII - bool - default y if RT2880v2_INIC_MII || RT305x_INIC_MII || RT305x_INIC_USB || RT3680_iNIC_AP - -config RTDEV - bool - default y if WIFI_DRIVER && !SECOND_IF_NONE || RTDEV_MII - default y if RTDEV_PLC - - - - -config MT_WIFI - tristate "MT WIFI Driver" - select WIFI_BASIC_FUNC if MT_WIFI - -config MT_WIFI_PATH - string - depends on MT_WIFI - default "mt_wifi" - -if MT_WIFI -menu "WiFi Generic Feature Options" -choice - prompt "EEPROM Type of 1st Card" - depends on ! FIRST_IF_NONE - - config FIRST_IF_EEPROM_FLASH - bool "FLASH" - - config FIRST_IF_EEPROM_EFUSE - bool "EFUSE" -endchoice - -config RT_FIRST_CARD_EEPROM - string - depends on ! FIRST_IF_NONE - default "flash" if FIRST_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 2nd Card" - depends on ! SECOND_IF_NONE - - config SECOND_IF_EEPROM_FLASH - bool "FLASH" - - config SECOND_IF_EEPROM_PROM - bool "EEPROM" - - config SECOND_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config RT_SECOND_CARD_EEPROM - string - depends on ! SECOND_IF_NONE - default "prom" if SECOND_IF_EEPROM_PROM - default "efuse" if SECOND_IF_EEPROM_EFUSE - default "flash" if SECOND_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 3th Card" - depends on ! THIRD_IF_NONE - - config THIRD_IF_EEPROM_FLASH - bool "FLASH" - - config THIRD_IF_EEPROM_PROM - bool "EEPROM" - - config THIRD_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config RT_THIRD_CARD_EEPROM - string - depends on ! THIRD_IF_NONE - default "prom" if THIRD_IF_EEPROM_PROM - default "efuse" if THIRD_IF_EEPROM_EFUSE - default "flash" if THIRD_IF_EEPROM_FLASH - -config MULTI_INF_SUPPORT - bool - default y if !FIRST_IF_NONE && !SECOND_IF_NONE - -config WIFI_BASIC_FUNC - bool "Basic Functions" - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config DOT11_N_SUPPORT - bool "802.11n support" - default y - -config DOT11_VHT_AC - bool "802.11AC support" - depends on WIFI_DRIVER - depends on DOT11_N_SUPPORT - default y - -config G_BAND_256QAM_SUPPORT - bool "2.4G 256QAM support" - depends on WIFI_DRIVER - depends on DOT11_VHT_AC - default y - -config BRCM_256QAM_SUPPORT - bool "BRCM 2.4G 256QAM support" - depends on WIFI_DRIVER - depends on G_BAND_256QAM_SUPPORT - default y - -config ICAP_SUPPORT - bool "ICAP Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config SPECTRUM_SUPPORT - bool "Wifi Spectrum Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config BACKGROUND_SCAN_SUPPORT - bool "Background Scan Support" - depends on WIFI_DRIVER - default y - -config SMART_CARRIER_SENSE_SUPPORT - bool "Smart Carrier Sense Support" - depends on WIFI_DRIVER - default y - -config MT_DFS_SUPPORT - bool "Dynamic Frequency Selection Support" - depends on WIFI_DRIVER - default y - -#config WFA_VHT_R2_PF -# bool "WFA VHT R2 Plugfest" -# depends on DOT11_VHT_AC -# default n - -config HDR_TRANS_TX_SUPPORT - bool "Tx Header Translation" - depends on CHIP_MT7615E - default y - -config HDR_TRANS_RX_SUPPORT - bool "Rx Header Translation" - depends on CHIP_MT7615E - default y - -config DBDC_MODE - bool "dbdc mode support" - default y - -config SUPPORT_DYNAMIC_TXOP - bool "dynamic txop support" - default n - -config WSC_INCLUDED - bool "WSC (WiFi Simple Config)" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config WSC_V2_SUPPORT - bool "WSC V2(WiFi Simple Config Version 2.0)" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config DOT11W_PMF_SUPPORT - bool "PMF" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config TXBF_SUPPORT - bool "Tx Bean Forming Support" - depends on WIFI_DRIVER - default y - -config VHT_TXBF_2G_EPIGRAM_IE_SUPPORT - bool "BRCM 2.4G VHT Sounding support" - depends on WIFI_DRIVER - depends on TXBF_SUPPORT - default n - -#config LLTD_SUPPORT -# bool "LLTD (Link Layer Topology Discovery Protocol)" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config QOS_DLS_SUPPORT -# bool "802.11e DLS ((Direct-Link Setup) Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config WAPI_SUPPORT -# bool "WAPI Support" -# depends on WIFI_DRIVER -# default n - -#config FTM_SUPPORT -# bool "FTM Support" -# depends on WIFI_DRIVER -# select PASSPOINT_R2 -# default n - -#config CARRIER_DETECTION_SUPPORT -# bool "Carrier Detect" -# depends on WIFI_DRIVER -# default n - -config IGMP_SNOOP_SUPPORT - bool "IGMP snooping" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -#config BLOCK_NET_IF -# bool "NETIF Block" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n -# help -# Support Net interface block while Tx-Sw queue full - -#config RATE_ADAPTION -# bool "New Rate Adaptation support" -# depends on WIFI_DRIVER -# default y - -#config NEW_RATE_ADAPT_SUPPORT -# bool "Intelligent Rate Adaption" -# depends on WIFI_DRIVER && RATE_ADAPTION -# default y - -#config AGS_SUPPORT -# bool "Adaptive Group Switching" -# depends on WIFI_DRIVER && RATE_ADAPTION -# depends on MT_AP_SUPPORT || MT_STA_SUPPORT -# default n - -#config RATE_ADAPT_AGBS_SUPPORT -# bool "Adaptive AGBS Mode" -# depends on WIFI_DRIVER && RATE_ADAPTION -# depends on MT_AP_SUPPORT || MT_STA_SUPPORT -# default y - -#config IDS_SUPPORT -# bool "IDS (Intrusion Detection System) Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config WIFI_WORK_QUEUE -# bool "Work Queue" -# depends on WIFI_DRIVER -# default n - -#config WIFI_SKB_RECYCLE -# bool "SKB Recycle(Linux)" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -config RTMP_FLASH_SUPPORT - bool "Flash Support" - depends on WIFI_DRIVER - default y - -config PRE_CAL_TRX_SET1_SUPPORT - bool "CalibrationToFlash Support" - depends on WIFI_DRIVER - depends on RTMP_FLASH_SUPPORT - default n - -#config LED_CONTROL_SUPPORT -# bool "LED Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -config ATE_SUPPORT - bool "ATE/QA Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default n - -#config MEMORY_OPTIMIZATION -# bool "Memory Optimization" -# depends on WIFI_DRIVER -# default n - -#config PASSPOINT_R2 -# bool "Passpoint Release-2 Support" -# depends on WIFI_DRIVER -# select DOT11W_PMF_SUPPORT -# depends on MT_AP_SUPPORT -# default n - -#config TRACE_TCP_PKT -# bool "TCP DATA/ACK packets trace log" -# depends on WIFI_DRIVER -# default n - -config UAPSD - bool "UAPSD support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -#config TCP_RACK_SUPPORT -# bool "TCP Reduced ACK support" -# depends on WIFI_DRIVER -# default n - -# -# Section for chip architectures -# -# "RLT MAC Support" -config RLT_MAC - bool - depends on WIFI_DRIVER - default n - -config RLT_BBP - bool - -config RLT_RF - bool - -# "RTMP MAC Support" -config RTMP_MAC - bool - depends on WIFI_DRIVER - default n - -config RTMP_BBP - bool - -config RTMP_RF - bool - -# -# Section for interfaces -# -config RTMP_PCI_SUPPORT - bool - -config RTMP_USB_SUPPORT - bool - -config RTMP_RBUS_SUPPORT - bool - -endmenu - -menu "WiFi Operation Modes" - choice - prompt "Main Mode" - default WIFI_MODE_AP - - config WIFI_MODE_AP - bool "AP" - #select MT_AP_SUPPORT - - config WIFI_MODE_STA - bool "STA" - select MT_STA_SUPPORT - - config WIFI_MODE_BOTH - bool "APSTA" - select MT_AP_SUPPORT - select MT_STA_SUPPORT - endchoice - - if WIFI_MODE_AP || WIFI_MODE_BOTH - source "drivers/net/wireless/mt_wifi_ap/Kconfig" - endif - - if WIFI_MODE_STA || WIFI_MODE_BOTH -# source "drivers/net/wireless/mt_wifi_sta/Kconfig" - endif -endmenu - -endif - -if WIFI_RLT_MAC - config RLT_MAC - bool - default y -endif - -if WIFI_RTMP_MAC - config RTMP_MAC - bool - default y -endif - -if WIFI_MT_MAC - config MT_MAC - bool - default y - - config CHIP_MT7603E - bool - default n - - config CHIP_MT7615E - bool - default n -endif - -if CHIP_MT7615E - config MT_MAC - bool - default y - select RATE_ADAPTION - select RATE_ADAPT_AGBS_SUPPORT - select DOT11_N_SUPPORT - select DOT11_VHT_AC - select HDR_TRANS_TX_SUPPORT - select HDR_TRANS_RX_SUPPORT -endif - -endif #WIFI_DRIVER diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_4_4 b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_4_4 deleted file mode 100644 index d6c0d27857..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_4_4 +++ /dev/null @@ -1,529 +0,0 @@ -config MT_WIFI - tristate "MT WIFI Driver" - select WIFI_BASIC_FUNC if MT_WIFI - -config MT_WIFI_PATH - string - depends on MT_WIFI - default "mt_wifi" - -if MT_WIFI -menu "WiFi Generic Feature Options" -choice - prompt "EEPROM Type of 1st Card" - depends on ! FIRST_IF_NONE - - config FIRST_IF_EEPROM_FLASH - bool "FLASH" - - config FIRST_IF_EEPROM_EFUSE - bool "EFUSE" -endchoice - -config RT_FIRST_CARD_EEPROM - string - depends on ! FIRST_IF_NONE - default "flash" if FIRST_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 2nd Card" - depends on ! SECOND_IF_NONE - - config SECOND_IF_EEPROM_FLASH - bool "FLASH" - - config SECOND_IF_EEPROM_PROM - bool "EEPROM" - - config SECOND_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config RT_SECOND_CARD_EEPROM - string - depends on ! SECOND_IF_NONE - default "prom" if SECOND_IF_EEPROM_PROM - default "efuse" if SECOND_IF_EEPROM_EFUSE - default "flash" if SECOND_IF_EEPROM_FLASH - -choice - prompt "EEPROM Type of 3th Card" - depends on ! THIRD_IF_NONE - - config THIRD_IF_EEPROM_FLASH - bool "FLASH" - - config THIRD_IF_EEPROM_PROM - bool "EEPROM" - - config THIRD_IF_EEPROM_EFUSE - bool "EFUSE" - -endchoice - -config RT_THIRD_CARD_EEPROM - string - depends on ! THIRD_IF_NONE - default "prom" if THIRD_IF_EEPROM_PROM - default "efuse" if THIRD_IF_EEPROM_EFUSE - default "flash" if THIRD_IF_EEPROM_FLASH - -config MULTI_INF_SUPPORT - bool - default y if !FIRST_IF_NONE && !SECOND_IF_NONE - -config WIFI_BASIC_FUNC - bool "Basic Functions" - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config DOT11_N_SUPPORT - bool "802.11n support" - default y - -config DOT11_VHT_AC - bool "802.11AC support" - depends on WIFI_DRIVER - depends on DOT11_N_SUPPORT - default y - -config G_BAND_256QAM_SUPPORT - bool "2.4G 256QAM support" - depends on WIFI_DRIVER - depends on DOT11_VHT_AC - default y - -config BRCM_256QAM_SUPPORT - bool "BRCM 2.4G 256QAM support" - depends on WIFI_DRIVER - depends on G_BAND_256QAM_SUPPORT - default n - -config TPC_SUPPORT - bool "802.11h TPC Support" - depends on WIFI_DRIVER - default y - -config ICAP_SUPPORT - bool "ICAP Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config SPECTRUM_SUPPORT - bool "Wifi Spectrum Support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -config BACKGROUND_SCAN_SUPPORT - bool "Background Scan Support" - depends on WIFI_DRIVER - default y - -config SMART_CARRIER_SENSE_SUPPORT - bool "Smart Carrier Sense Support" - depends on WIFI_DRIVER - default y - -config MT_DFS_SUPPORT - bool "Dynamic Frequency Selection Support" - depends on WIFI_DRIVER - default y - -config DBDC_MODE - bool "dbdc mode support" - depends on CHIP_MT7615E - default y - -config MULTI_PROFILE_SUPPORT - bool "Multi Profile Support" - depends on DBDC_MODE - default n - -config DEFAULT_5G_PROFILE - bool "5G default profile for DBDC" - depends on DBDC_MODE - depends on MULTI_PROFILE_SUPPORT - default n - -#config WFA_VHT_R2_PF -# bool "WFA VHT R2 Plugfest" -# depends on DOT11_VHT_AC -# default n - -config HDR_TRANS_TX_SUPPORT - bool "Tx Header Translation" - depends on CHIP_MT7615E || CHIP_MT7622 - default y - -config HDR_TRANS_RX_SUPPORT - bool "Rx Header Translation" - depends on CHIP_MT7615E || CHIP_MT7622 - default y - -config WSC_INCLUDED - bool "WSC (WiFi Simple Config)" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config WSC_V2_SUPPORT - bool "WSC V2(WiFi Simple Config Version 2.0)" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config DOT11W_PMF_SUPPORT - bool "PMF" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config TXBF_SUPPORT - bool "Tx Bean Forming Support" - depends on WIFI_DRIVER - default y - -config VHT_TXBF_2G_EPIGRAM_IE_SUPPORT - bool "BRCM 2.4G VHT Sounding support" - depends on WIFI_DRIVER - depends on TXBF_SUPPORT - default n - -config FAST_NAT_SUPPORT - bool "Fast-NAT support" - depends on RA_HW_NAT_WIFI - default n - -config WHNAT_SUPPORT - tristate "Wifi Hardware NAT support" - depends on CHIP_MT7615E - depends on WLAN_HOOK - depends on FAST_NAT_SUPPORT - default n - -#config LLTD_SUPPORT -# bool "LLTD (Link Layer Topology Discovery Protocol)" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config QOS_DLS_SUPPORT -# bool "802.11e DLS ((Direct-Link Setup) Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config WAPI_SUPPORT -# bool "WAPI Support" -# depends on WIFI_DRIVER -# default n - -config FTM_SUPPORT - bool "FTM Support" - depends on WIFI_DRIVER - select PASSPOINT_R2 - default n - -config MBO_SUPPORT - bool "MBO Support" - depends on WIFI_DRIVER - select INTERWORKING - select WNM_SUPPORT - select DOT11K_RRM_SUPPORT - select DOT11R_FT_SUPPORT - select DOT11W_PMF_SUPPORT - default n - -#config CARRIER_DETECTION_SUPPORT -# bool "Carrier Detect" -# depends on WIFI_DRIVER -# default n - -config IGMP_SNOOP_SUPPORT - bool "IGMP snooping" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default y - -#config BLOCK_NET_IF -# bool "NETIF Block" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n -# help -# Support Net interface block while Tx-Sw queue full - -#config RATE_ADAPTION -# bool "New Rate Adaptation support" -# depends on WIFI_DRIVER -# default y - -#config NEW_RATE_ADAPT_SUPPORT -# bool "Intelligent Rate Adaption" -# depends on WIFI_DRIVER && RATE_ADAPTION -# default y - -#config AGS_SUPPORT -# bool "Adaptive Group Switching" -# depends on WIFI_DRIVER && RATE_ADAPTION -# depends on MT_AP_SUPPORT || MT_STA_SUPPORT -# default n - -#config RATE_ADAPT_AGBS_SUPPORT -# bool "Adaptive AGBS Mode" -# depends on WIFI_DRIVER && RATE_ADAPTION -# depends on MT_AP_SUPPORT || MT_STA_SUPPORT -# default y - -#config IDS_SUPPORT -# bool "IDS (Intrusion Detection System) Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -#config WIFI_WORK_QUEUE -# bool "Work Queue" -# depends on WIFI_DRIVER -# default n - -#config WIFI_SKB_RECYCLE -# bool "SKB Recycle(Linux)" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -config RTMP_FLASH_SUPPORT - bool "Flash Support" - depends on WIFI_DRIVER - default y - -config PRE_CAL_TRX_SET1_SUPPORT - bool "Calibration To Flash/BinFile Support" - depends on WIFI_DRIVER - default n - -config RLM_CAL_CACHE_SUPPORT - bool "RlmCalibrationCache Support" - depends on WIFI_DRIVER - default y - -config RF_LOCKDOWN_SUPPORT - bool "RF Lockdown Support" - depends on WIFI_DRIVER - default n - -#config LED_CONTROL_SUPPORT -# bool "LED Support" -# depends on WIFI_DRIVER -# depends on MT_AP_SUPPORT -# default n - -config ATE_SUPPORT - bool "ATE/QA Support" - depends on WIFI_DRIVER - default y - -#config MEMORY_OPTIMIZATION -# bool "Memory Optimization" -# depends on WIFI_DRIVER -# default n - -config PASSPOINT_R2 - bool "Passpoint Release-2 Support" - depends on WIFI_DRIVER - select DOT11W_PMF_SUPPORT - depends on MT_AP_SUPPORT - default n - -#config TRACE_TCP_PKT -# bool "TCP DATA/ACK packets trace log" -# depends on WIFI_DRIVER -# default n - -config UAPSD - bool "UAPSD support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -#config TCP_RACK_SUPPORT -# bool "TCP Reduced ACK support" -# depends on WIFI_DRIVER -# default n - -#### PA_LNA_Type choice - -config RED_SUPPORT - bool "RED(Random Early Drop) support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT || MT_STA_SUPPORT - default y - -config FQ_SCH_SUPPORT - bool "Fair Queueing support" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT && VOW_SUPPORT - depends on CHIP_MT7615E || CHIP_MT7622 - default y - -choice - prompt "PA LNA Type of 1st Card" - depends on ! FIRST_IF_NONE - - config FIRST_IF_EPAELNA - bool "ePAeLNA" - config FIRST_IF_IPAILNA - bool "iPAiLNA" - config FIRST_IF_IPAELNA - bool "iPAeLNA" -# config FIRST_IF_EPAILNA -# bool "ePAiLNA" -endchoice -choice - prompt "PA LNA Type of 2nd Card" - depends on ! SECOND_IF_NONE - - config SECOND_IF_EPAELNA - bool "ePAeLNA" - config SECOND_IF_IPAILNA - bool "iPAiLNA" - config SECOND_IF_IPAELNA - bool "iPAeLNA" -# config SECOND_IF_EPAILNA -# bool "ePAiLNA" -endchoice -choice - prompt "PA LNA Type of 3rd Card" - depends on ! THIRD_IF_NONE - - config THIRD_IF_EPAELNA - bool "ePAeLNA" - config THIRD_IF_IPAILNA - bool "iPAiLNA" - config THIRD_IF_IPAELNA - bool "iPAeLNA" -# config THIRD_IF_EPAILNA -# bool "ePAiLNA" -endchoice -#### PA_LNA_Type choice END - -# -# Section for chip architectures -# -# "RLT MAC Support" -config RLT_MAC - bool - depends on WIFI_DRIVER - default n - -config RLT_BBP - bool - -config RLT_RF - bool - -# "RTMP MAC Support" -config RTMP_MAC - bool - depends on WIFI_DRIVER - default n - -config RTMP_BBP - bool - -config RTMP_RF - bool - -# -# Section for interfaces -# -config RTMP_PCI_SUPPORT - bool - -config RTMP_USB_SUPPORT - bool - -config RTMP_RBUS_SUPPORT - bool - -endmenu - -menu "WiFi Operation Modes" - choice - prompt "Main Mode" - default WIFI_MODE_AP - - config WIFI_MODE_AP - tristate "AP" - select MT_AP_SUPPORT - - config WIFI_MODE_STA - tristate "STA" - select MT_STA_SUPPORT - - config WIFI_MODE_BOTH - tristate "APSTA" - select MT_AP_SUPPORT - select MT_STA_SUPPORT - endchoice - - if WIFI_MODE_AP || WIFI_MODE_BOTH - source "drivers/net/wireless/mediatek/mt_wifi_ap/Kconfig" - endif - - if WIFI_MODE_STA || WIFI_MODE_BOTH - source "drivers/net/wireless/mediatek/mt_wifi_sta/Kconfig" - endif -endmenu - -endif - -if WIFI_RLT_MAC - config RLT_MAC - bool - default y -endif - -if WIFI_RTMP_MAC - config RTMP_MAC - bool - default y -endif - -config WIFI_MT_MAC - bool - -if WIFI_MT_MAC - config MT_MAC - bool - default y - - config CHIP_MT7603E - bool - default n - - config CHIP_MT7615E - bool - default n - - config CHIP_MT7622 - bool - default n -endif - -if CHIP_MT7615E - config MT_MAC - bool - default y - select RATE_ADAPTION - select RATE_ADAPT_AGBS_SUPPORT - select DOT11_N_SUPPORT - select DOT11_VHT_AC - select HDR_TRANS_TX_SUPPORT - select HDR_TRANS_RX_SUPPORT -endif - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_ap b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_ap deleted file mode 100644 index d24e58e321..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_ap +++ /dev/null @@ -1,384 +0,0 @@ -config MT_AP_SUPPORT - tristate "MTK AP support" -# depends on NET_RADIO - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config WDS_SUPPORT - bool "WDS" - depends on MT_AP_SUPPORT - default y - -config WIFI_EAP_FEATURE - bool "EAP Feature" - depends on WIFI_DRIVER - default y - -config VLAN_SUPPORT - bool "VLAN Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MLME_MULTI_QUEUE_SUPPORT - bool "Mlme Multi Queue Support" - default n - -config TXRX_STAT_SUPPORT - bool "TxRx Stats Support" - depends on WIFI_DRIVER && WIFI_EAP_FEATURE - default y - -config SNIFFER_SUPPORT - bool "SNIFFER" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config ANTENNA_CONTROL_SUPPORT - bool "Antenna Control" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MGMT_TXPWR_CTRL - bool "Mgmt TxPower Control" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config CHUTIL_SUPPORT - bool "Channel Utilization Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config NF_SUPPORT - bool "Noise Floor Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config RA_PHY_RATE_SUPPORT - bool "RA PHY RATE Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config AMPDU_CONF_SUPPORT - bool "AMPDU Config retry & agglimit Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config ACK_CTS_TIMEOUT_SUPPORT - bool "ACK CTS Timeout cck & ofdm Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MBSS_SUPPORT - bool "MBSSID" - depends on MT_AP_SUPPORT - default y - -#config NEW_MBSSID_MODE -# bool "New MBSSID MODE" -# depends on MT_AP_SUPPORT && MBSS_SUPPORT -# depends on RALINK_RT3883 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352 || RALINK_MT7620 -# default y - -#config ENHANCE_NEW_MBSSID_MODE -# bool "Enhanced MBSSID mode" -# depends on NEW_MBSSID_MODE -# default y - -config APCLI_SUPPORT - bool "AP-Client Support" - depends on MT_AP_SUPPORT - default y - -config APCLI_CERT_SUPPORT - bool "AP-Client TGn Cert Support" - depends on MT_AP_SUPPORT - depends on APCLI_SUPPORT - default n - -config MAC_REPEATER_SUPPORT - bool "MAC Repeater Support" - depends on MT_AP_SUPPORT - depends on APCLI_SUPPORT - depends on RALINK_RT6352 || RALINK_MT7620 || RALINK_MT7603E || MT_AP_SUPPORT - default y - -config MWDS - bool "Mixed WDS(MWDS)" - depends on MT_AP_SUPPORT - select APCLI_SUPPORT - default n - -config MUMIMO_SUPPORT - bool "MU-MIMO Support" - depends on WIFI_DRIVER - select MU_RA_SUPPORT - default y - -config MU_RA_SUPPORT - bool "MU-RGA Support" - depends on MUMIMO_SUPPORT - -config DOT11R_FT_SUPPORT - bool "802.11r Fast BSS Transition" - depends on MT_AP_SUPPORT - default n - -config DOT11K_RRM_SUPPORT - bool "802.11k Radio Resource Management" - depends on MT_AP_SUPPORT - default n - -config INTERWORKING - bool "802.11u Interworking/Gas Support" - depends on MT_AP_SUPPORT - default n - -config MAP_SUPPORT - bool "Multi-AP Support" - depends on MT_AP_SUPPORT - select MBO_SUPPORT - default n - -config MAP_R2_VER_SUPPORT - bool "Multi-AP R2 version support" - depends on MAP_SUPPORT - default n - -config OFFCHANNEL_SCAN_FEATURE - bool "Channel Quality Monitor" - depends on MT_AP_SUPPORT - default y - -config OCE_SUPPORT - bool "Optimized Connectivity Experience Support" - depends on MT_AP_SUPPORT - depends on CHIP_MT7615E - select WAPP_SUPPORT - default y - -config DPP_FEATURE - bool "DPP Support" - depends on MT_AP_SUPPORT - depends on WIFI_DRIVER - default n - -config ENTERPRISE_AP_SUPPORT - bool "Enterprise AP Support" - depends on MT_AP_SUPPORT - default n - -config DYNAMIC_VLAN_SUPPORT - bool "Dynamic VLAN Support" - depends on MT_AP_SUPPORT - depends on ENTERPRISE_AP_SUPPORT - default n - -config CFG80211_SUPPORT - bool "CFG80211" - depends on MT_AP_SUPPORT - default n - -#CUSTOMISED HOSTAPD -config CUSTOMISED_HOSTAPD_SUPPORT - bool "Customised Hostapd Support" - depends on MT_AP_SUPPORT - depends on CFG80211_SUPPORT - default n - -#APCLI STA -config APCLI_STA_SUPPORT - bool "APCLI STA Support" - depends on APCLI_SUPPORT - depends on CFG80211_SUPPORT - default n - -#WDS STA -config WDS_STA_SUPPORT - bool "WDS STA Support" - depends on APCLI_SUPPORT - depends on CFG80211_SUPPORT - default n - -#WDS AP -config MBSS_AS_WDS_AP_SUPPORT - bool "MBSS AS WDS AP Support" - depends on MT_AP_SUPPORT - depends on MBSS_SUPPORT - default n - -config DSCP_QOS_MAP_SUPPORT - bool "Dscp Qos Mapping Support" - depends on MT_AP_SUPPORT - default n - -config DSCP_PRI_SUPPORT - bool "Dscp Priority Mapping Support" - depends on MT_AP_SUPPORT - default n - -#HOSTAPD_MAP_SUPPORT -config HOSTAPD_MAP_SUPPORT - bool "MAP with Hostapd Support" - depends on MT_AP_SUPPORT - depends on CFG80211_SUPPORT - depends on MAP_SUPPORT - default n - -config MIN_PHY_RATE_SUPPORT - bool "Minimum PHY rate support" - depends on MT_AP_SUPPORT - default n - -config FAST_UP_RATE_SUPPORT - bool "Fast UP rate support" - depends on MT_AP_SUPPORT - default n - -config RADIUS_MAC_AUTH_SUPPORT - bool "RADIUS MAC Auth Support" - depends on ENTERPRISE_AP_SUPPORT - depends on CFG80211_SUPPORT - default n - -config CON_WPS_SUPPORT - bool "Concurrent WPS Support" - depends on MT_AP_SUPPORT - depends on APCLI_SUPPORT - depends on WSC_INCLUDED - depends on WSC_V2_SUPPORT -# depends on MULTI_INF_SUPPORT - default n - -#config LLTD_SUPPORT -# bool "LLTD (Link Layer Topology Discovery Protocol)" -# depends on MT_AP_SUPPORT - -#config COC_SUPPORT -# bool "CoC Support" -# depends on MT_AP_SUPPORT -# default n - -config MCAST_RATE_SPECIFIC - bool "User specific tx rate of mcast pkt" - depends on MT_AP_SUPPORT - default y - -#config EXT_BUILD_CHANNEL_LIST -# bool "Extension Channel List" -# depends on MT_AP_SUPPORT - -#config AUTO_CH_SELECT_ENHANCE -# bool "Auto Channel Selection Enhancement" -# depends on MT_AP_SUPPORT - -config VOW_SUPPORT - bool "MediaAir(VOW) support" - depends on MT_AP_SUPPORT - default y - -#config AIRPLAY_SUPPORT -# bool "AIRPLAY Support" -# depends on MT_AP_SUPPORT -# default n - -config BAND_STEERING - bool "Band Steering" - depends on MT_AP_SUPPORT - default y - -config LED_CONTROL_SUPPORT - bool "LED Control Support" - default n - -config WLAN_HOOK - bool "WLAN hook Support" - depends on WIFI_DRIVER - default n - -config RADIUS_ACCOUNTING_SUPPORT - bool "Radius Accounting Support" - depends on MT_AP_SUPPORT - default n - -config GREENAP_SUPPORT - bool "GreenAP Support" - depends on MT_AP_SUPPORT - default y - -config PCIE_ASPM_DYM_CTRL_SUPPORT - bool "Pcie Aspm Dynamic Control Support" - depends on MT_AP_SUPPORT - default y - -config COEX_SUPPORT - bool "Coex Support" - depends on MT_AP_SUPPORT - default n - -config EASY_SETUP_SUPPORT - bool "Whole Home Coverage - Easy Setup" - depends on MT_AP_SUPPORT - default n - -config EVENT_NOTIFIER_SUPPORT - bool "Whole Home Coverage - Event Notifier" - depends on MT_AP_SUPPORT - default n - -config AIR_MONITOR - bool "Air Monitor" - depends on MT_AP_SUPPORT - default n - -config WNM_SUPPORT - bool "802.11v WNM Support" - depends on MT_AP_SUPPORT - default n - -config WIFI_MSI_SUPPORT - bool "MSI support" - depends on PCI_MSI - depends on CHIP_MT7615E - default n - - -#config ROAMING_ENHANCE_SUPPORT -# bool "Roaming Enhance Support" -# depends on MT_AP_SUPPORT -# depends on APCLI_SUPPORT -# default n - -#config WIFI_FWD_SUPPORT -# bool "WiFi Forwarding Support" -# default n - -config WPA3_SUPPORT - bool "WPA3 support" - depends on MT_AP_SUPPORT - default y - -config OWE_SUPPORT - bool "Enhance OPEN(OWE) support" - depends on MT_AP_SUPPORT - depends on WPA3_SUPPORT - default y - -config VENDOR_FEATURE10_SUPPORT - bool "Vendor10 Feature Enable" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default n - -config VENDOR_FEATURE11_SUPPORT - bool "Vendor11 Feature Enable" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default n - -config RCSA_SUPPORT - bool "Reverse-CSA" - depends on WIFI_DRIVER - depends on MT_DFS_SUPPORT - depends on APCLI_SUPPORT - default n diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_sta b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_sta deleted file mode 100644 index deec77f207..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.mt_wifi_sta +++ /dev/null @@ -1,75 +0,0 @@ -config MT_STA_SUPPORT - tristate "Ralink RT2860 802.11n/ac STA support" -# depends on NET_RADIO - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config ETH_CONVERT_SUPPORT - bool "Ethernet Convert Mode Support" - depends on MT_STA_SUPPORT - default y - -config COEX_SUPPORT - bool "Coex Support" - depends on MT_STA_SUPPORT - default n - -#config MUMIMO_SUPPORT -# bool "MU-MIMO Support" -# depends on WIFI_DRIVER -# default y - -#config DOT11R_FT_SUPPORT -# bool "802.11r Fast BSS Transition" -# depends on MT_STA_SUPPORT - -#config DOT11K_RRM_SUPPORT -# bool "802.11k Radio Resource Management" -# depends on MT_STA_SUPPORT - -#config SNIFFER_SUPPORT -# bool "SNIFFER" -# depends on MT_STA_SUPPORT -# default n - -config CFG80211_SUPPORT - bool "CFG80211" - depends on MT_STA_SUPPORT - depends on CFG80211 - default n - -#config CON_WPS_SUPPORT -# bool "Concurrent WPS Support" -# depends on MT_STA_SUPPORT -# depends on APCLI_SUPPORT -# depends on WSC_INCLUDED -# depends on WSC_V2_SUPPORT -# default n - -#config COC_SUPPORT -# bool "CoC Support" -# depends on MT_STA_SUPPORT -# default n - -#config RT2860V2_SNMP -# bool "Net-SNMP Support" -# depends on MT_STA_SUPPORT - -#config MCAST_RATE_SPECIFIC -# bool "User specific tx rate of mcast pkt" -# depends on MT_STA_SUPPORT - -#config EXT_BUILD_CHANNEL_LIST -# bool "Extension Channel List" -# depends on MT_STA_SUPPORT - -#config AUTO_CH_SELECT_ENHANCE -# bool "Auto Channel Selection Enhancement" -# depends on MT_STA_SUPPORT - -#config AIRPLAY_SUPPORT -# bool "AIRPLAY Support" -# depends on MT_STA_SUPPORT -# default n - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi deleted file mode 100644 index 7a7fbeed5c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi +++ /dev/null @@ -1,216 +0,0 @@ -config WIFI_BASIC_FUNC - bool "Basic Functions" - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config WSC_INCLUDED - bool "WSC (WiFi Simple Config)" - depends on WIFI_DRIVER - default y - -config WSC_V2_SUPPORT - bool "WSC V2(WiFi Simple Config Version 2.0)" - depends on WIFI_DRIVER - default y - -config WSC_NFC_SUPPORT - bool "WSC out-of-band(NFC)" - depends on WIFI_DRIVER - default n - -config DOT11N_DRAFT3 - bool "802.11n Draft3" - depends on WIFI_DRIVER - default n - -config DOT11_VHT_AC - bool "802.11 ac" - depends on WIFI_DRIVER - default n - -config DOT11W_PMF_SUPPORT - bool "PMF" - depends on RLT_STA_SUPPORT - default n - -#config WMM_ACM_SUPPORT -# bool "WMM ACM" -# depends on WIFI_DRIVER -# default n - -config LLTD_SUPPORT - bool "LLTD (Link Layer Topology Discovery Protocol)" - depends on WIFI_DRIVER - default n - -config QOS_DLS_SUPPORT - bool "802.11e DLS ((Direct-Link Setup) Support" - depends on WIFI_DRIVER - default n - -config WAPI_SUPPORT - bool "WAPI Support" - depends on WIFI_DRIVER - default n - -config CARRIER_DETECTION_SUPPORT - bool "Carrier Detect" - depends on WIFI_DRIVER - default n - -config IGMP_SNOOP_SUPPORT - bool "IGMP snooping" - depends on WIFI_DRIVER - default n - -config BLOCK_NET_IF - bool "NETIF Block" - depends on WIFI_DRIVER - default n - help - Support Net interface block while Tx-Sw queue full - -config TXBF_SUPPORT - bool "Tx Bean Forming Support (Only 3883)" - depends on WIFI_DRIVER - depends on RALINK_RT2883 || RALINK_RT3883 - default n - -#config VIDEO_TURBINE_SUPPORT -# bool "Video Turbine support" -# depends on WIFI_DRIVER -# default n - -#config RA_CLASSIFIER -# tristate "Ralink Flow Classifier" -# depends on WIFI_DRIVER -# default n - -config RATE_ADAPTION - bool "New Rate Adaptation support" - depends on WIFI_DRIVER - default n - -config NEW_RATE_ADAPT_SUPPORT - bool "Intelligent Rate Adaption" - depends on WIFI_DRIVER && RATE_ADAPTION - default y - -config AGS_SUPPORT - bool "Adaptive Group Switching" - depends on WIFI_DRIVER && RATE_ADAPTION - default n - -config IDS_SUPPORT - bool "IDS (Intrusion Detection System) Support" - depends on WIFI_DRIVER - default n - -config WIFI_WORK_QUEUE - bool "Work Queue" - depends on WIFI_DRIVER - default n - -config WIFI_SKB_RECYCLE - bool "SKB Recycle(Linux)" - depends on WIFI_DRIVER - default n - -config RTMP_FLASH_SUPPORT - bool "Flash Support" - depends on WIFI_DRIVER - default n - -config LED_CONTROL_SUPPORT - bool "LED Support" - depends on WIFI_DRIVER - default n - -config SINGLE_SKU - bool "Single SKU" - depends on WIFI_DRIVER - default n - -config SINGLE_SKU_V2 - bool "Single SKU V2" - depends on SINGLE_SKU && RALINK_RT6352 - default n - -config HW_ANTENNA_DIVERSITY - bool "Antenna Diversity Support" - depends on RLT_AP_SUPPORT || RLT_STA_SUPPORT - depends on RALINK_RT5350 - default n - -config ATE_SUPPORT - bool "ATE/QA Support" - depends on WIFI_DRIVER - default n - -config RT2860V2_AP_V24_DATA_STRUCTURE - bool - depends on WIFI_DRIVER - default y - -config RT2860V2_AP_32B_DESC - bool "32 Byte Descriptor Support" - depends on WIFI_DRIVER - depends on RALINK_RT6352 || RALINK_MT7620 - default n - -config MEMORY_OPTIMIZATION - bool "Memory Optimization" - depends on WIFI_DRIVER - default n - -config RTMP_INTERNAL_TX_ALC - bool "TSSI Compensation" - depends on WIFI_DRIVER - depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352 - default n - -config RTMP_TEMPERATURE_CALIBRATION - bool "Temperature Calibration" - depends on WIFI_DRIVER - depends on RALINK_RT6352 - default n - -# -# Section for chip architectures -# -# "RLT MAC Support" -config RLT_MAC - bool - depends on WIFI_DRIVER - default n - -config RLT_BBP - bool - -config RLT_RF - bool - -# "RTMP MAC Support" -config RTMP_MAC - bool - depends on WIFI_DRIVER - default n - -config RTMP_BBP - bool - -config RTMP_RF - bool - -# -# Section for interfaces -# -config RTMP_PCI_SUPPORT - bool - -config RTMP_USB_SUPPORT - bool - -config RTMP_RBUS_SUPPORT - bool diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi_ap b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi_ap deleted file mode 100644 index fe26334ccc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi_ap +++ /dev/null @@ -1,84 +0,0 @@ -config RLT_AP_SUPPORT - tristate "Ralink RT2860 802.11n AP support" -# depends on NET_RADIO - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config WDS_SUPPORT - bool "WDS" - depends on RLT_AP_SUPPORT - -config MBSS_SUPPORT - bool "MBSSID" - depends on RLT_AP_SUPPORT - -config NEW_MBSSID_MODE - bool "New MBSSID MODE" - depends on RLT_AP_SUPPORT && MBSS_SUPPORT - depends on RALINK_RT3883 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352 || RALINK_MT7620 - default n - -config ENHANCE_NEW_MBSSID_MODE - bool "Enhanced MBSSID mode" - depends on NEW_MBSSID_MODE - default n - -config APCLI_SUPPORT - bool "AP-Client Support" - depends on RLT_AP_SUPPORT - -config MAC_REPEATER_SUPPORT - bool "MAC Repeater Support" - depends on RLT_AP_SUPPORT - depends on APCLI_SUPPORT - depends on RALINK_RT6352 || RALINK_MT7620 - default n - -#config MESH_SUPPORT -# bool "MESH Support" -# depends on RLT_AP_SUPPORT - -config DFS_SUPPORT - bool "DFS" - depends on RLT_AP_SUPPORT - select RALINK_TIMER_DFS - -#config DOT11R_FT_SUPPORT -# bool "802.11r Fast BSS Transition" -# depends on RLT_AP_SUPPORT - -#config DOT11K_RRM_SUPPORT -# bool "802.11k Radio Resource Management" -# depends on RLT_AP_SUPPORT - -config LLTD_SUPPORT - bool "LLTD (Link Layer Topology Discovery Protocol)" - depends on RLT_AP_SUPPORT - -config NINTENDO_AP - bool "Nintendo AP" - depends on RLT_AP_SUPPORT - -config COC_SUPPORT - bool "CoC Support" - depends on RLT_AP_SUPPORT - default n - -#config RT2860V2_SNMP -# bool "Net-SNMP Support" -# depends on RLT_AP_SUPPORT - -#config MCAST_RATE_SPECIFIC -# bool "User specific tx rate of mcast pkt" -# depends on RLT_AP_SUPPORT - -#config EXT_BUILD_CHANNEL_LIST -# bool "Extension Channel List" -# depends on RLT_AP_SUPPORT - -#config AUTO_CH_SELECT_ENHANCE -# bool "Auto Channel Selection Enhancement" -# depends on RLT_AP_SUPPORT - - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi_sta b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi_sta deleted file mode 100644 index 9a8cf82367..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.rlt_wifi_sta +++ /dev/null @@ -1,19 +0,0 @@ -config RLT_STA_SUPPORT - tristate "Ralink RT2860 802.11n STA support" -# depends on NET_RADIO - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config DOT11Z_TDLS_SUPPORT - bool "802.11z TDLS support" - depends on RLT_STA_SUPPORT - -#config RT2860V2_EXT_CHANNEL_LIST -# bool "Extension Channel List" -# depends on RLT_STA_SUPPORT - -#config STA_AUTO_CH_SELECT_ENHANCE -# bool "Auto Channel Selection Enhancement" -# depends on RLT_STA_SUPPORT - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.sta.soc b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.sta.soc deleted file mode 100644 index b81b318aff..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.sta.soc +++ /dev/null @@ -1,91 +0,0 @@ -config RT2860V2_STA - tristate "Ralink RT2860 802.11n STA support" - depends on NET_RADIO - -config RT2860V2_STA_WPA_SUPPLICANT - bool "WPA Supplicant" - depends on RT2860V2_STA - -config RT2860V2_STA_ETH_CONVERT - bool "Ethernet Convert Support" - depends on RT2860V2_STA - -config RT2860V2_STA_DPB - bool - depends on RT2860V2_STA_ETH_CONVERT - default y - -config RT2860V2_STA_WMM_ACM - bool "WMM ACM Support" - depends on RT2860V2_STA - -config RT2860V2_STA_LED - bool "LED Support" - depends on RT2860V2_STA - -config RT2860V2_STA_IDS - bool "IDS (Intrusion Detection System) Support" - depends on RT2860V2_STA - -config RT2860V2_STA_WSC - bool "WSC (WiFi Simple Config)" - depends on RT2860V2_STA - -config RT2860V2_STA_HS - bool "HS2.0 support" - depends on RT2860V2_STA - -config RT2860V2_STA_CARRIER - bool "Carrier Sense Support" - depends on RT2860V2_STA - -config RT2860V2_STA_DLS - bool "DLS ((Direct-Link Setup) Support" - depends on RT2860V2_STA - -config RT2860V2_STA_MESH - bool "MESH Support" - depends on RT2860V2_STA - -config RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY - bool "Antenna Diversity Support" - depends on RT2860V2_STA - -config RT2860V2_HW_STA_ANTENNA_DIVERSITY - bool "Antenna Diversity Support" - depends on RT2860V2_STA - depends on RALINK_RT5350 - -#config RT2860V2_STA_WAPI -# bool "WAPI Support" -# depends on RT2860V2_STA - -config RT2860V2_STA_VIDEO_TURBINE - bool "Video Turbine support" - depends on RT2860V2_STA - -config RT2860V2_STA_INTELLIGENT_RATE_ADAPTION - bool "Intelligent Rate Adaption" - depends on RT2860V2_STA - -config RT2860V2_STA_TXBF - bool "Tx Bean Forming Support (Only 3883)" - depends on RT2860V2_STA - depends on RALINK_RT3883 - -config RT2860V2_STA_RTMP_INTERNAL_TX_ALC - bool "TSSI Compensation" - depends on RT2860V2_STA - depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 - -config RT2860V2_STA_80211N_DRAFT3 - bool "802.11n Draft3" - depends on RT2860V2_STA - -#config RT2860V2_EXT_CHANNEL_LIST -# bool "Extension Channel List" -# depends on RT2860V2_STA - -#config RT2860V2_SNMP -# bool "Net-SNMP Support" -# depends on RT2860V2_STA diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.wifi b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.wifi deleted file mode 100644 index df7ab22fd3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Kconfig.wifi +++ /dev/null @@ -1,416 +0,0 @@ -menu "Ralink Module" - -########### -# Debuging -########### -source "drivers/net/rt_rdm/Kconfig" - -############# -# Wire -############# - -source "drivers/net/raeth/Kconfig" - -############# -# Wireless -############# -menuconfig WIFI_DRIVER - bool "WiFi Driver Support" - -if WIFI_DRIVER - -choice - prompt "Choose First WiFi Interface" - config FIRST_IF_NONE - bool "None" - - config FIRST_IF_RT2860 - bool "RT2860" - select RTMP_MAC - select RALINK_RT2860 - - config FIRST_IF_MT7620 - bool "MT7620" - select RTMP_MAC - select RALINK_RT6352 - -endchoice - -choice - prompt "EEPROM Type of 1st Card" - depends on ! FIRST_IF_NONE - - config FIRST_IF_EEPROM_PROM - bool "EEPROM" - - config FIRST_IF_EEPROM_EFUSE - bool "EFUSE" - - config FIRST_IF_EEPROM_FLASH - bool "FLASH" -endchoice - -choice - prompt "Choose Second WiFi Interface" - config SECOND_IF_NONE - bool "None" - - config SECOND_IF_RT3092 - bool "RT3092" - select RTMP_MAC - select RALINK_RT3092 - - config SECOND_IF_RT5392 - bool "RT5392" - select RTMP_MAC - select RALINK_RT5392 - - config SECOND_IF_RT5592 - bool "RT5592" - select RTMP_MAC - select RALINK_RT5592 - - config SECOND_IF_RT3593 - bool "RT3593" - select RTMP_MAC - select RALINK_RT5392 - - config SECOND_IF_RT3572 - bool "RT3572" - select RTMP_MAC - select RALINK_RT3572 - - config SECOND_IF_RT5572 - bool "RT5572" - select RTMP_MAC - select RALINK_RT5572 - - config SECOND_IF_MT7620 - bool "MT7620" - select RTMP_MAC - select RALINK_RT6352 - - config SECOND_IF_MT7610U - bool "MT7610U" - select RLT_MAC - select RALINK_MT7610U - - config SECOND_IF_MT7610E - bool "MT7610E" - select RLT_MAC - select RALINK_MT7610E - - config SECOND_IF_RT8592 - bool "RT85592" - select RLT_MAC - select RALINK_RT8592 - - config SECOND_IF_MT7612U - bool "MT7612U" - select RLT_MAC - select RALINK_MT7612U - - config SECOND_IF_MT7612E - bool "MT7612E" - select RLT_MAC - select RALINK_MT7612E - -endchoice - -choice - prompt "EEPROM Type of 2nd Card" - depends on ! SECOND_IF_NONE - - config SECOND_IF_EEPROM_PROM - bool "EEPROM" - - config SECOND_IF_EEPROM_EFUSE - bool "EFUSE" - - config SECOND_IF_EEPROM_FLASH - bool "FLASH" -endchoice - - -config RT_FIRST_CARD - int - depends on ! FIRST_IF_NONE - default 2860 if FIRST_IF_RT2860 - default 7620 if FIRST_IF_MT7620 - -config RT_SECOND_CARD - int - depends on ! SECOND_IF_NONE - default 3090 if SECOND_IF_RT3092 - default 5392 if SECOND_IF_RT5392 - default 5592 if SECOND_IF_RT5592 - default 3593 if SECOND_IF_RT3593 - default 7610 if SECOND_IF_MT7610E - default 8592 if SECOND_IF_RT8592 - default 3572 if SECOND_IF_RT3572 - default 5572 if SECOND_IF_RT5572 - default 7612e if SECOND_IF_MT7612E - default 7612u if SECOND_IF_MT7612U - - -config RT_FIRST_IF_RF_OFFSET - hex - depends on ! FIRST_IF_NONE - default 0x40000 - -config RT_SECOND_IF_RF_OFFSET - hex - depends on ! SECOND_IF_NONE - default 0x48000 - -config RT_FIRST_CARD_EEPROM - string - depends on ! FIRST_IF_NONE - default "prom" if FIRST_IF_EEPROM_PROM - default "efuse" if FIRST_IF_EEPROM_EFUSE - default "flash" if FIRST_IF_EEPROM_FLASH - -config RT_SECOND_CARD_EEPROM - string - depends on ! SECOND_IF_NONE - default "prom" if SECOND_IF_EEPROM_PROM - default "efuse" if SECOND_IF_EEPROM_EFUSE - default "flash" if SECOND_IF_EERPROM_FLASH - -config MULTI_INF_SUPPORT - bool - default y if !FIRST_IF_NONE && !SECOND_IF_NONE - -config PCI_SUPPORT - bool - -config RT2860V2_2850 - bool "Dual Band" - depends on RALINK_RT2880 - -choice - prompt "RF Type" - depends on RALINK_RT5350 - default RALINK_RT5350_1T1R - - config RALINK_RT5350_1T1R - bool "1T1R" -endchoice - -choice - prompt "RF Type" - depends on RALINK_RT3052 - default RALINK_RT3052_2T2R - - config RALINK_RT3050_1T1R - bool "1T1R" - - config RALINK_RT3051_1T2R - bool "1T2R" - - config RALINK_RT3052_2T2R - bool "2T2R" -endchoice - -choice - prompt "RF Type" - depends on RALINK_RT3352 - - config RALINK_RT3352_2T2R - bool "2T2R" -endchoice - -choice - prompt "RF Type" - depends on RALINK_RT3883 - - config RALINK_RT3662_2T2R - bool "2T3R (RT3662)" - - config RALINK_RT3883_3T3R - bool "3T3R (RT3883)" -endchoice - -config RA_CLASSIFIER - tristate "Ralink Flow Classifier" - depends on RT2860V2_AP_VIDEO_TURBINE || RT2860V2_STA_VIDEO_TURBINE - default n - -config RTDEV_MII - bool - default y if RT2880v2_INIC_MII || RT305x_INIC_MII || RT305x_INIC_USB || RT3680_iNIC_AP - -#config UNIQUE_WPS -# bool "Unique WPS for Concurrent AP" -# depends on RT2860V2_AP_WSC -# depends on RT3090_AP_WSC || RT3572_AP_WSC || RT5392_AP_WSC || RT5572_AP_WSC || RT5592_AP_WSC -# default n - - -choice - prompt "Configuration Method Selection" - default CONFIG_METHOD_OLD - - config CONFIG_METHOD_OLD - bool "Legay" - - config CONFIG_METHOD_NEW - bool "New" - select WIFI_BASIC_FUNC -endchoice - -if CONFIG_METHOD_OLD - source "drivers/net/wireless/rt2860v2_ap/Kconfig" - #source "drivers/net/wireless/rt2860v2_sta/Kconfig" - #source "drivers/net/wireless/RTPCI_ap/Kconfig" - #source "drivers/net/wireless/RT3090_ap/Kconfig" - #source "drivers/net/wireless/RT5392_ap/Kconfig" - #source "drivers/net/wireless/RT5592_ap/Kconfig" - #source "drivers/net/wireless/RT3593_ap/Kconfig" - #source "drivers/net/wireless/RT3572_ap/Kconfig" - #source "drivers/net/wireless/RT5572_ap/Kconfig" - #source "drivers/net/wireless/iNIC/Kconfig" - #source "drivers/net/wireless/iNIC_RT305x/Kconfig" - #source "drivers/net/wireless/RT3680_ap/Kconfig" - #source "drivers/net/wireless/MT7610_ap/Kconfig" -endif - -if CONFIG_METHOD_NEW - menu "WiFi Generic Feature Options" - source "drivers/net/wireless/rlt_wifi/Kconfig" - endmenu - - menu "WiFi Operation Modes" - choice - prompt "Main Mode" - default WIFI_MODE_AP - - config WIFI_MODE_AP - bool "AP" - - config WIFI_MODE_STA - bool "STA" - - config WIFI_MODE_BOTH - bool "APSTA" - endchoice - - if WIFI_MODE_AP || WIFI_MODE_BOTH - source "drivers/net/wireless/rlt_wifi_ap/Kconfig" - endif - - if WIFI_MODE_STA || WIFI_MODE_BOTH - source "drivers/net/wireless/rlt_wifi_sta/Kconfig" - endif - endmenu - -# menu "WiFi Chips" - -#"RT2860 series" -config RALINK_RT28XX - bool - default n - select RTMP_PCI_SUPPORT - -#"RT3092" -config RALINK_RT3092 - bool - default n - select RTMP_PCI_SUPPORT - -#"RT3572" -config RALINK_RT3572 - bool - default n - select RTMP_USB_SUPPORT - -#"RT5392" -config RALINK_RT5392 - bool - default n - select RTMP_PCI_SUPPORT - -#"RT5572" -config RALINK_RT5572 - bool - default n - select RTMP_USB_SUPPORT - -#"RT5592" -config RALINK_RT5592 - bool - default n - select RTMP_PCI_SUPPORT - -#"MT7620/RT6352" -config RALINK_RT6352 - bool - default n - select RTMP_RBUS_SUPPORT -# select RTMP_TEMPERATURE_CALIBRATION -# select RTMP_INTERNAL_TX_ALC - -#"MT7610E" -config RALINK_MT7610E - bool - default n - select RTMP_PCI_SUPPORT - -#"MT7610U" -config RALINK_MT7610U - bool - default n - select RTMP_USB_SUPPORT - -#"RT8592" -config RALINK_RT8592 - bool - default n - select RTMP_PCI_SUPPORT - -#"MT7612E" -config RALINK_MT7612E - bool - default n - select RTMP_PCI_SUPPORT - -#"MT7612U" -config RALINK_MT7612U - bool - default n - select RTMP_USB_SUPPORT - -# endmenu -endif - -endif # WIFI_DRIVER - - -config RTDEV - bool - default y if WIFI_DRIVER && !SECOND_IF_NONE || RTDEV_MII - default y if RTDEV_PLC - -####### -# USB -####### -source "drivers/usb/dwc_otg/Kconfig" - -####### -# NAT -####### -choice -prompt "Ralink NAT Type" - -config RA_NAT_NONE -bool "None" -config RA_NAT_HW -bool "Hardware" -depends on !RALINK_RT5350 -endchoice - -source "net/nat/hw_nat/Kconfig" - - -endmenu - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile-3.10.14.mt_wifi_ap b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile-3.10.14.mt_wifi_ap deleted file mode 100644 index 785f0199d7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile-3.10.14.mt_wifi_ap +++ /dev/null @@ -1,1380 +0,0 @@ -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -WIFI_DRV_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))/.. -else -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -WIFI_DRV_PATH = drivers/net/wireless/mediatek -else -WIFI_DRV_PATH = drivers/net/wireless/mtk/mt7615e -endif -endif - -GLOBAL_DEFINES = include/uapi/linux/wapp -EXTRA_CFLAGS = -I$(WIFI_DRV_PATH)/mt_wifi/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/embedded/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/ate/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/include/mcu -I$(GLOBAL_DEFINES) - -DRV_NAME = mt_wifi -SRC_DIR = ../mt_wifi -SRC_EMBEDDED_DIR = ../mt_wifi/embedded -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS += -DCONFIG_SUPPORT_OPENWRT -ifneq ($(CONFIG_RT_FIRST_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD=$(CONFIG_RT_FIRST_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_IF_RF_OFFSET=$(CONFIG_RT_FIRST_IF_RF_OFFSET) -endif -ifneq ($(CONFIG_RT_SECOND_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD=$(CONFIG_RT_SECOND_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_IF_RF_OFFSET=$(CONFIG_RT_SECOND_IF_RF_OFFSET) -endif -ifneq ($(CONFIG_RT_THIRD_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD=$(CONFIG_RT_THIRD_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_IF_RF_OFFSET=$(CONFIG_RT_THIRD_IF_RF_OFFSET) -endif -ifeq ($(CONFIG_FIRST_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_FIRST_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_FIRST_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"flash\"" -endif -endif -endif -ifeq ($(CONFIG_SECOND_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_SECOND_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_SECOND_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"flash\"" -endif -endif -endif -ifeq ($(CONFIG_THIRD_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_THIRD_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_THIRD_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"flash\"" -endif -endif -endif -obj-m += $(DRV_NAME).o -else -obj-$(CONFIG_MT_AP_SUPPORT) += $(DRV_NAME).o -endif - -ifeq ($(CONFIG_MTK_EMI_7622),y) -EXTRA_CFLAGS += -DCONFIG_ARCH_MT7622 -endif - - -EXTRA_CFLAGS += -DWIFI_SYS_FW_V1 -EXTRA_CFLAGS += -DWIFI_SYS_FW_V2 -######################################################## -# Common files -# $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o\ -######################################################## -cmm_objs := $(SRC_EMBEDDED_DIR)/common/action.o\ - $(SRC_EMBEDDED_DIR)/common/ba_action.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/radio_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/omac_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wmm_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wtbl_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/hdev_basic.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v1.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v2.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_cmd.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_basic.o\ - $(SRC_DIR)/hw_ctrl/hw_init.o\ - $(SRC_EMBEDDED_DIR)/common/bcn.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_aes.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cfg.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cmd.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_data.o\ - $(SRC_EMBEDDED_DIR)/common/qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fq_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_fair_qm.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_profile.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_radar.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sync.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_info.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_notify.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_basic.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_phy.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_ht.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_vht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_basic.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_phy.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_vht.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sanity.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_sec.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_tkip.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wep.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wpa.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_aes.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_arc4.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_hmac.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_md5.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_sha2.o\ - $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/mlme.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_dev.o\ - $(SRC_EMBEDDED_DIR)/mgmt/bss_ops.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init_inf.o\ - $(SRC_EMBEDDED_DIR)/common/spectrum.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_timer.o\ - $(SRC_EMBEDDED_DIR)/common/rt_channel.o\ - $(SRC_EMBEDDED_DIR)/common/op_class.o\ - $(SRC_EMBEDDED_DIR)/common/rt_os_util.o\ - $(SRC_EMBEDDED_DIR)/common/scan.o\ - $(SRC_EMBEDDED_DIR)/common/sys_log.o\ - $(SRC_EMBEDDED_DIR)/common/txpower.o\ - $(SRC_EMBEDDED_DIR)/common/icap.o\ - $(SRC_EMBEDDED_DIR)/common/vendor.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info_element.o\ - $(SRC_DIR)/chips/rtmp_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_hw.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_entrytb.o\ - $(SRC_EMBEDDED_DIR)/common/wdev.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/tm.o\ - $(SRC_DIR)/txpwr/single_sku.o\ - $(SRC_EMBEDDED_DIR)/common/ra_ac_q_mgmt.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_rvr_dbg.o\ - $(SRC_DIR)/protocol/protection.o\ - $(SRC_EMBEDDED_DIR)/common/misc_app.o - -EXTRA_CFLAGS += -DMULTI_PROFILE -cmm_objs += $(SRC_EMBEDDED_DIR)/common/multi_profile.o - -ifeq ($(CONFIG_DEFAULT_5G_PROFILE),y) -EXTRA_CFLAGS += -DDEFAULT_5G_PROFILE -endif - -######################################################## -# Coex related files -######################################################## -ifeq ($(CONFIG_COEX_SUPPORT),y) - EXTRA_CFLAGS += -DCOEX_SUPPORT - - cmm_objs += $(SRC_EMBEDDED_DIR)/mcu/bt_coex.o -endif -######################################################## -# Rate adaptation related files -######################################################## -rate_objs := $(SRC_DIR)/rate_ctrl/ra_ctrl_mt.o\ - $(SRC_DIR)/rate_ctrl/ra_ctrl_mt_drv.o\ - $(SRC_DIR)/rate_ctrl/ra_wrapper_embedded.o\ - $(SRC_DIR)/rate_ctrl/ra_cfg.o - -#ifeq ($(CONFIG_NEW_RATE_ADAPT_SUPPORT),y) -# EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT -# rate_objs += $(SRC_DIR)/rate_ctrl/alg_grp_mt.o -# rate_objs += $(SRC_DIR)/rate_ctrl/ra_table.o -#endif - -ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -endif - -######################################################## -# ASIC related files -######################################################## -asic_objs := $(SRC_DIR)/phy/phy.o - -######################################################## -# Spec feature related files -######################################################## -spec_objs += $(SRC_EMBEDDED_DIR)/common/ps.o - -ifeq ($(CONFIG_UAPSD),y) - EXTRA_CFLAGS += -DUAPSD_SUPPORT -DUAPSD_DEBUG - spec_objs += $(SRC_EMBEDDED_DIR)/common/uapsd.o -endif - -ifeq ($(CONFIG_MT_MAC),y) - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_ps.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_io.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/txs.o -endif - -# WSC -ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_INCLUDED -DWSC_SINGLE_TRIGGER - - ifneq ($(CONFIG_USER_GOAHEAD_HTTPD),) - EXTRA_CFLAGS += -DSDK_GOAHEAD_HTTPD - endif - - ifneq ($(CONFIG_USER_LIGHTY),) - EXTRA_CFLAGS += -DSDK_USER_LIGHTY - endif - - ifneq ($(CONFIG_MT_AP_SUPPORT),) - EXTRA_CFLAGS += -DWSC_AP_SUPPORT - endif - - ifneq ($(CONFIG_MT_STA_SUPPORT),) - EXTRA_CFLAGS += -DWSC_STA_SUPPORT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_tlv.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_dh.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_ufd.o - - ifeq ($(CONFIG_WSC_V2_SUPPORT),y) - EXTRA_CFLAGS += -DWSC_V2_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc_v2.o - endif -endif - -# VHT -ifeq ($(CONFIG_DOT11_VHT_AC),y) - EXTRA_CFLAGS += -DDOT11_VHT_AC - spec_objs += $(SRC_EMBEDDED_DIR)/mgmt/mgmt_vht.o\ - $(SRC_EMBEDDED_DIR)/common/vht.o - # WFA VHT R2 PF - ifeq ($(CONFIG_WFA_VHT_R2_PF),y) - EXTRA_CFLAGS += -DWFA_VHT_R2_PF - endif -endif - -# WAPI -ifeq ($(CONFIG_WAPI_SUPPORT),y) - EXTRA_CFLAGS += -DWAPI_SUPPORT - ifeq ($(CONFIG_RALINK_RT3052),y) - EXTRA_CFLAGS += -DSOFT_ENCRYPT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/security/wapi.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_sms4.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_crypt.o -endif - -# WPA3 -ifeq ($(CONFIG_WPA3_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11_SAE_SUPPORT -DDOT11_SUITEB_SUPPORT -DDOT11W_PMF_SUPPORT - EXTRA_CFLAGS += -DDOT11_SAE_OPENSSL_BN - - spec_objs += $(SRC_EMBEDDED_DIR)/security/sae.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/bn_lib.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/ecc.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o - - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_SAE_SUPPORT - endif - -endif - -# OWE -ifeq ($(CONFIG_OWE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_OWE_SUPPORT -DDOT11W_PMF_SUPPORT - EXTRA_CFLAGS += -DDOT11_SAE_OPENSSL_BN - - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/bn_lib.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/ecc.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/owe.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o - - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_OWE_SUPPORT - endif - -endif - -# ACM -ifeq ($(CONFIG_WMM_ACM_SUPPORT),y) - EXTRA_CFLAGS += -DWMM_ACM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/acm_edca.o\ - $(SRC_EMBEDDED_DIR)/common/acm_comm.o\ - $(SRC_EMBEDDED_DIR)/common/acm_iocl.o -endif - -#PMF -ifeq ($(CONFIG_MT_MAC),y) -ifeq ($(CONFIG_DOT11W_PMF_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11W_PMF_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o -endif -endif - -# LLTD -ifeq ($(CONFIG_LLTD_SUPPORT),y) - EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -#RRM -ifeq ($(CONFIG_DOT11K_RRM_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11K_RRM_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DAPPLE_11K_IOT - spec_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o \ - $(SRC_EMBEDDED_DIR)/common/rrm.o \ - $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o -endif - -# TPC -ifeq ($(CONFIG_TPC_SUPPORT),y) - EXTRA_CFLAGS += -DTPC_SUPPORT -endif - -# FTM -ifeq ($(CONFIG_FTM_SUPPORT),y) - EXTRA_CFLAGS += -DFTM_SUPPORT -DFTM_INITIATOR - EXTRA_CFLAGS += -DTMR_SUPPORT - EXTRA_CFLAGS += -DDOT11K_RRM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/ftm.o - spec_objs += $(SRC_DIR)/protocol/tmr.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o \ - $(SRC_EMBEDDED_DIR)/common/rrm.o \ - $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o -endif - -ifeq ($(CONFIG_PASSPOINT_R2),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -DCONFIG_HOTSPOT_R2 -DWAPP_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o\ - $(SRC_EMBEDDED_DIR)/common/gas.o\ - $(SRC_EMBEDDED_DIR)/common/hotspot.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_DSCP_QOS_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DDSCP_QOS_MAP_SUPPORT -endif - -ifeq ($(CONFIG_DSCP_PRI_SUPPORT),y) - EXTRA_CFLAGS += -DDSCP_PRI_SUPPORT -endif - -ifeq ($(CONFIG_MIN_PHY_RATE_SUPPORT),y) - EXTRA_CFLAGS += -DMIN_PHY_RATE_SUPPORT -endif - -ifeq ($(CONFIG_FAST_UP_RATE_SUPPORT),y) - EXTRA_CFLAGS += -DFAST_UP_RATE_SUPPORT -endif - -ifeq ($(CONFIG_WNM_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_DOT11V_WNM - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o -endif -ifeq ($(CONFIG_OFFCHANNEL_SCAN_FEATURE),y) - EXTRA_CFLAGS += -DOFFCHANNEL_SCAN_FEATURE -endif - -ifeq ($(CONFIG_VENDOR_FEATURE10_SUPPORT),y) - EXTRA_CFLAGS += -DFOLLOW_HIDDEN_SSID_FEATURE - EXTRA_CFLAGS += -DCONVERTER_MODE_SWITCH_SUPPORT - EXTRA_CFLAGS += -DSPECIAL_11B_OBW_FEATURE - ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DDFS_VENDOR10_CUSTOM_FEATURE - endif - ifeq ($(CONFIG_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_BCAST_RATE_SET_SUPPORT - endif - ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_TVM_SUPPORT - endif - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DVENDOR10_CUSTOM_RSSI_FEATURE - EXTRA_CFLAGS += -DBW_VENDOR10_CUSTOM_FEATURE - endif -endif -ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DONDEMAND_DFS -endif - -ifeq ($(CONFIG_INTERWORKING),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING - spec_objs += $(SRC_EMBEDDED_DIR)/common/gas.o -endif - -# MBO -ifeq ($(CONFIG_MBO_SUPPORT),y) - EXTRA_CFLAGS += -DMBO_SUPPORT -DWAPP_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/mbo.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_TRACE_TCP_PKT),y) - EXTRA_CFLAGS += -DTRACELOG_TCP_PKT -endif - -ifeq ($(CONFIG_BACKGROUND_SCAN_SUPPORT),y) - EXTRA_CFLAGS += -DBACKGROUND_SCAN_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/bgnd_scan.o -endif - -ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DMT_DFS_SUPPORT -DCUSTOMISE_RDD_THRESHOLD_SUPPORT -DRDM_FALSE_ALARM_DEBUG_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/cmm_rdm_mt.o -endif - -# FT -ifeq ($(CONFIG_DOT11R_FT_SUPPORT),y) -EXTRA_CFLAGS += -DDOT11R_FT_SUPPORT -dot11_ft_objs += $(SRC_EMBEDDED_DIR)/common/ft.o\ - $(SRC_EMBEDDED_DIR)/common/ft_tlv.o\ - $(SRC_EMBEDDED_DIR)/common/ft_iocl.o\ - $(SRC_EMBEDDED_DIR)/common/ft_rc.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_ftkd.o -## Preserve R1KH during Radio ON/OFF -ifeq ($(CONFIG_MBO_SUPPORT),y) -EXTRA_CFLAGS += -DFT_R1KH_KEEP -endif -endif - -#SNIFFER -ifeq ($(CONFIG_SNIFFER_SUPPORT),y) - EXTRA_CFLAGS += -DSNIFFER_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/sniffer_radiotap.o\ - $(SRC_EMBEDDED_DIR)/common/sniffer_prism.o -endif - -#EAP-TXRX Statsitics -ifeq ($(CONFIG_TXRX_STAT_SUPPORT),y) -EXTRA_CFLAGS += -DTXRX_STAT_SUPPORT -endif - -#EAP-Antenna Control -ifeq ($(CONFIG_ANTENNA_CONTROL_SUPPORT),y) -EXTRA_CFLAGS += -DANTENNA_CONTROL_SUPPORT -endif - -#EAP-Mgmt TxPower Control -ifeq ($(CONFIG_MGMT_TXPWR_CTRL),y) -EXTRA_CFLAGS += -DMGMT_TXPWR_CTRL -endif - -#EAP-WMM EDCA Control -ifeq ($(CONFIG_WMM_EDCA_CTRL),y) -EXTRA_CFLAGS += -DWMM_EDCA_CTRL -endif - -#EAP-Channel Utilization Support -ifeq ($(CONFIG_CHUTIL_SUPPORT),y) -EXTRA_CFLAGS += -DCHUTIL_SUPPORT -endif - -#EAP-Noise Floor Support -ifeq ($(CONFIG_NF_SUPPORT),y) -EXTRA_CFLAGS += -DNF_SUPPORT -endif - -#EAP-Beacon Interval Control -ifeq ($(CONFIG_BEACON_INTERVAL_CTRL),y) -EXTRA_CFLAGS += -DBEACON_INTERVAL_CTRL -endif - -#VENDOR_FEATURE11 -ifeq ($(CONFIG_VENDOR_FEATURE11_SUPPORT),y) -EXTRA_CFLAGS += -DVENDOR_FEATURE11_SUPPORT -DTXRX_STAT_SUPPORT -endif - -#ENTERPRISE_AP -ifeq ($(CONFIG_ENTERPRISE_AP_SUPPORT),y) - EXTRA_CFLAGS += -DHOSTAPD_11R_SUPPORT - EXTRA_CFLAGS += -DMBSS_DTIM_SUPPORT - ifeq ($(CONFIG_STATIC_VLAN_SUPPORT),y) - EXTRA_CFLAGS += -DSTATIC_VLAN_SUPPORT - endif - ifeq ($(CONFIG_RADIUS_MAC_AUTH_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_MAC_AUTH_SUPPORT - endif - ifeq ($(CONFIG_DYNAMIC_VLAN_SUPPORT),y) - EXTRA_CFLAGS += -DDYNAMIC_VLAN_SUPPORT - endif - -endif - -#CFG -ifeq ($(CONFIG_CFG80211_SUPPORT),y) - EXTRA_CFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST - ifeq ($(CONFIG_CUSTOMISED_HOSTAPD_SUPPORT),y) - EXTRA_CFLAGS += -DDISABLE_HOSTAPD_BEACON -DDISABLE_HOSTAPD_PROBE_RESP -DHOSTAPD_AUTO_CH_SUPPORT - endif - ifeq ($(CONFIG_WDS_STA_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_AS_WDS_STA_SUPPORT - endif - ifeq ($(CONFIG_APCLI_STA_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_CFG80211_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_apcli.o - endif - spec_objs += $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_scan.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_rx.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_tx.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_inf.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_ap.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211drv.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_util.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211.o -endif - -ifeq ($(CONFIG_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DA4_CONN -DROUTING_TAB_SUPPORT -DWAPP_SUPPORT -DOFFCHANNEL_SCAN_FEATURE - #EXTRA_CFLAGS += -DMAP_R2 - spec_objs += $(SRC_EMBEDDED_DIR)/common/map.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/a4_conn.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/routing_tab.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_RALINK_TIMER_WDG),y) - EXTRA_CFLAGS += -DSDK_TIMER_WDG -endif - -ifeq ($(CONFIG_MTK_WD_KICKER),y) - ifeq ($(CONFIG_MTK_WD_KICKER_WCN),y) - EXTRA_CFLAGS += -DSDK_TIMER_WDG - endif -endif - - -# -# Common Feature related files -# -func_objs := - -ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT - - func_objs += $(SRC_EMBEDDED_DIR)/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_BLOCK_NET_IF),y) - EXTRA_CFLAGS += -DBLOCK_NET_IF - - func_objs += $(SRC_EMBEDDED_DIR)/common/netif_block.o -endif - -ifeq ($(CONFIG_SINGLE_SKU),y) - EXTRA_CFLAGS += -DSINGLE_SKU - ifeq ($(CONFIG_RALINK_RT6352),y) - EXTRA_CFLAGS += -DSINGLE_SKU_V2 - endif -endif - -ifeq ($(CONFIG_SMART_CARRIER_SENSE_SUPPORT),y) - EXTRA_CFLAGS += -DSMART_CARRIER_SENSE_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/scs.o -endif - -######################################################## -# AP feature related files -######################################################## -ap_objs := $(SRC_EMBEDDED_DIR)/ap/ap.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_assoc.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_auth.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_mlme.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sanity.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sync.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_wpa.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sec.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_data.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_autoChSel.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_qload.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_cfg.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_nps.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_vow.o\ - $(SRC_DIR)/os/linux/ap_ioctl.o - -ifeq ($(CONFIG_MBSS_SUPPORT),y) - EXTRA_CFLAGS += -DMBSS_SUPPORT - - ifeq ($(CONFIG_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DNEW_MBSSID_MODE - ifeq ($(CONFIG_ENHANCE_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DENHANCE_NEW_MBSSID_MODE - endif - endif - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mbss.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_mbss_inf.o - -ifeq ($(CONFIG_MBSS_AS_WDS_AP_SUPPORT),y) - EXTRA_CFLAGS += -DMBSS_AS_WDS_AP_SUPPORT - EXTRA_CFLAGS += -DCLIENT_WDS - ap_objs += $(SRC_EMBEDDED_DIR)/common/client_wds.o -endif -endif - - -ifeq ($(CONFIG_WDS_SUPPORT),y) - EXTRA_CFLAGS += -DWDS_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_wds.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_wds_inf.o\ - $(SRC_EMBEDDED_DIR)/common/client_wds.o -endif - -ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DMULTI_APCLI_SUPPORT -DAPCLI_AUTO_CONNECT_SUPPORT -DAPCLI_AUTO_BW_TMP - #EXTRA_CFLAGS += -DAPCLI_CERT_SUPPORT -DAPCLI_CONNECTION_TRIAL - EXTRA_CFLAGS += -DDHCP_UC_SUPPORT - EXTRA_CFLAGS += -DFAST_EAPOL_WAR - EXTRA_CFLAGS += -DBT_APCLI_SUPPORT - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_apcli.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_apcli_inf.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_assoc.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_auth.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_ctrl.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_sync.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_iparp.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_pppoe.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_ipv6.o - - ifeq ($(CONFIG_APCLI_CERT_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_CERT_SUPPORT - endif - - ifeq ($(CONFIG_MAC_REPEATER_SUPPORT),y) - EXTRA_CFLAGS += -DMAC_REPEATER_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_repeater.o - endif -endif - -ifeq ($(CONFIG_IDS_SUPPORT),y) - EXTRA_CFLAGS += -DIDS_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_ids.o -endif - -ifeq ($(CONFIG_NINTENDO_AP),y) - EXTRA_CFLAGS += -DNINTENDO_AP - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_nintendo.o -endif - -#ifeq ($(CONFIG_COC_SUPPORT),y) -# EXTRA_CFLAGS += -DGREENAP_SUPPORT -DCOC_SUPPORT -# -# ap_objs += $(SRC_DIR)/../hw_ctrl/greenap.o -#endif - -ifeq ($(CONFIG_GREENAP_SUPPORT),y) - EXTRA_CFLAGS += -DGREENAP_SUPPORT - - ap_objs += $(SRC_DIR)/hw_ctrl/greenap.o -endif - -ifeq ($(CONFIG_PCIE_ASPM_DYM_CTRL_SUPPORT),y) - EXTRA_CFLAGS += -DPCIE_ASPM_DYM_CTRL_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW -DCONFIG_HW_HAL_OFFLOAD #-DCSD_VERIFICATION -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_ICAP_SUPPORT),y) - EXTRA_CFLAGS += -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_SPECTRUM_SUPPORT),y) - EXTRA_CFLAGS += -DWIFI_SPECTRUM_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT),y) - EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -endif - -ifeq ($(CONFIG_PRE_CAL_TRX_SET1_SUPPORT),y) - EXTRA_CFLAGS += -DPRE_CAL_TRX_SET1_SUPPORT -endif - -ifeq ($(CONFIG_RLM_CAL_CACHE_SUPPORT),y) - EXTRA_CFLAGS += -DRLM_CAL_CACHE_SUPPORT -endif - -ifeq ($(CONFIG_PRE_CAL_TRX_SET2_SUPPORT),y) - EXTRA_CFLAGS += -DPRE_CAL_TRX_SET2_SUPPORT -endif - -ifeq ($(CONFIG_RF_LOCKDOWN_SUPPORT),y) - EXTRA_CFLAGS += -DRF_LOCKDOWN -endif - -ifeq ($(CONFIG_LINK_TEST_SUPPORT),y) - EXTRA_CFLAGS += -DLINK_TEST_SUPPORT -endif - -ifeq ($(CONFIG_WIFI_EAP_FEATURE),y) - EXTRA_CFLAGS += -DWIFI_EAP_FEATURE -endif - -ifeq ($(CONFIG_RTMP_TEMPERATURE_TX_ALC),y) - EXTRA_CFLAGS += -DRTMP_TEMPERATURE_TX_ALC -endif - -ifeq ($(CONFIG_TXBF_SUPPORT),y) - EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DTXBF_SUPPORT -DVHT_TXBF_SUPPORT - ap_objs += $(SRC_DIR)/txbf/cmm_txbf_mt.o\ - $(SRC_DIR)/txbf/cmm_txbf_cal_mt.o\ - $(SRC_DIR)/txbf/txbf_wrapper_embedded.o -endif - -ifeq ($(CONFIG_MUMIMO_SUPPORT),y) - EXTRA_CFLAGS += -DCFG_SUPPORT_MU_MIMO - ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mumimo.o -endif - -ifeq ($(CONFIG_MU_RA_SUPPORT),y) - EXTRA_CFLAGS += -DCFG_SUPPORT_MU_MIMO_RA - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mura.o -endif - -ifeq ($(CONFIG_CON_WPS_SUPPORT), y) - EXTRA_CFLAGS += -DCON_WPS -DCON_WPS_AP_SAME_UUID -endif - -ifeq ($(CONFIG_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(CONFIG_AIRPLAY_SUPPORT),y) - EXTRA_CFLAGS += -DAIRPLAY_SUPPORT -endif - -ifeq ($(CONFIG_BAND_STEERING),y) - EXTRA_CFLAGS += -DBAND_STEERING - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_band_steering.o -endif - -ifeq ($(CONFIG_AIR_MONITOR),y) - EXTRA_CFLAGS += -DAIR_MONITOR -endif - -ifeq ($(CONFIG_EASY_SETUP_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/easy_setup/ez_cmm.o -endif - -ifeq ($(CONFIG_MWDS),y) - ap_objs += $(SRC_EMBEDDED_DIR)/common/mwds.o - ap_objs += $(SRC_EMBEDDED_DIR)/common/a4_conn.o - ap_objs += $(SRC_EMBEDDED_DIR)/common/routing_tab.o -endif - -ifeq ($(CONFIG_EVENT_NOTIFIER_SUPPORT),y) - ap_objs += $(SRC_EMBEDDED_DIR)/common/event_notifier.o -endif - -ifeq ($(CONFIG_VOW_SUPPORT),y) - EXTRA_CFLAGS += -DVOW_SUPPORT -endif - -ifeq ($(CONFIG_RED_SUPPORT),y) - EXTRA_CFLAGS += -DRED_SUPPORT -endif - -ifeq ($(CONFIG_FQ_SCH_SUPPORT),y) - EXTRA_CFLAGS += -DFQ_SCH_SUPPORT -endif - -######################################################## -# Linux system related files -######################################################## -os_objs := $(SRC_DIR)/os/linux/rt_proc.o\ - $(SRC_DIR)/os/linux/rt_linux.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/rt_main_dev.o - -ifeq ($(CONFIG_WLAN_HOOK),y) - EXTRA_CFLAGS +=-DRTMP_WLAN_HOOK_SUPPORT - os_objs += $(SRC_DIR)/os/linux/rt_txrx_hook.o -endif - -ifeq ($(CONFIG_MULTI_INF_SUPPORT),y) - EXTRA_CFLAGS += -DMULTI_INF_SUPPORT - os_objs += $(SRC_DIR)/os/linux/multi_main_dev.o -endif - -ifeq ($(CONFIG_WIFI_WORK_QUEUE_BH),y) - EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - -ifeq ($(CONFIG_LINUX_NET_TXQ_SUPPORT),y) -EXTRA_CFLAGS += -DLINUX_NET_TXQ_SUPPORT -endif - -######################################################## -# chip related files -######################################################## -ifeq ($(CONFIG_FIRST_IF_MT7628),y) -EXTRA_CFLAGS += -DMT7628 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -DDMA_SCH_SUPPORT -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DUSE_BMC -DTHERMAL_PROTECT_SUPPORT -DCAL_FREE_IC_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7628.o\ - $(SRC_DIR)/chips/mt7628_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_DIR)/mcu/mcu.o\ - $(SRC_DIR)/mcu/andes_core.o\ - $(SRC_DIR)/mcu/andes_mt.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rbus_main_dev.o -endif - - -ifeq ($(CONFIG_SECOND_IF_MT7637E),y) -EXTRA_CFLAGS += -DMT7637 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -DDMA_SCH_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTAR_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -# -DCUT_THROUGH -#EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -#EXTRA_CFLAGS += -DNEED_ROM_PATCH -#EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7637.o\ - $(SRC_DIR)/chips/mt7637_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_DBDC_MODE),y) -EXTRA_CFLAGS += -DDBDC_MODE -endif - -ifeq ($(CONFIG_CHIP_MT7615E),y) -EXTRA_CFLAGS += -DMT7615 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -#EXTRA_CFLAGS += -DNEIGHBORING_AP_STAT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DERR_RECOVERY -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DTXPWRMANUAL -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -EXTRA_CFLAGS += -DSINGLE_SKU_V2 -EXTRA_CFLAGS += -DTX_POWER_CONTROL_SUPPORT -EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -EXTRA_CFLAGS += -DRX_SCATTER -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_TX_DELAY -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -EXTRA_CFLAGS += -DPRE_CAL_TRX_SET1_SUPPORT -EXTRA_CFLAGS += -DRLM_CAL_CACHE_SUPPORT -EXTRA_CFLAGS += -DPRE_CAL_TRX_SET2_SUPPORT -ifeq ($(CONFIG_G_BAND_256QAM_SUPPORT),y) -EXTRA_CFLAGS += -DG_BAND_256QAM -ifeq ($(CONFIG_BRCM_256QAM_SUPPORT),y) -EXTRA_CFLAGS += -DBRCM_256QAM -endif -endif -EXTRA_CFLAGS += -Wframe-larger-than=4096 -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) - EXTRA_CFLAGS += -DREDUCE_TCP_ACK_SUPPORT -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -ifeq ($(CONFIG_RADIUS_ACCOUNTING_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_ACCOUNTING_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -ifeq ($(CONFIG_FDB_SUPPORT),y) - EXTRA_CFLAGS += -DMT_FDB - chip_objs += $(SRC_DIR)/mcu/mt_fdb.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7615.o\ - $(SRC_DIR)/chips/mt7615_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_CHIP_MT7663E),y) -EXTRA_CFLAGS += -DMT7663 -DMT_BBP -DMT_RF -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DMT_DMAC -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -#EXTRA_CFLAGS += -DERR_RECOVERY -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -#EXTRA_CFLAGS += -DSINGLE_SKU_V2 -#EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -WFLAGS += -DCONFIG_FPGA_MODE -#EXTRA_CFLAGS += -DRX_SCATTER -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -EXTRA_CFLAGS += -DHW_TX_AMSDU_SUPPORT -#WFLAGS += -DCONFIG_CSO_SUPPORT -#WFLAGS += -DMSP_UTILITY -ifeq ($(CONFIG_G_BAND_256QAM_SUPPORT),y) -EXTRA_CFLAGS += -DG_BAND_256QAM -ifeq ($(CONFIG_BRCM_256QAM_SUPPORT),y) -EXTRA_CFLAGS += -DBRCM_256QAM -endif -endif - -#EXTRA_CFLAGS += -Wframe-larger-than=4096 -WFLAGS += -Werror - -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT - EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) - EXTRA_CFLAGS += -DREDUCE_TCP_ACK_SUPPORT -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -ifeq ($(CONFIG_RADIUS_ACCOUNTING_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_ACCOUNTING_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -ifeq ($(CONFIG_FDB_SUPPORT),y) - EXTRA_CFLAGS += -DMT_FDB - chip_objs += $(SRC_DIR)/mcu/mt_fdb.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7663.o\ - $(SRC_DIR)/chips/mt7663_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_FIRST_IF_MT7622),y) -EXTRA_CFLAGS += -DMT7622 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DMT_DMAC -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -EXTRA_CFLAGS += -DTXPWRMANUAL -#EXTRA_CFLAGS += -DTMR_VERIFY -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DETSI_RX_BLOCKER_SUPPORT -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -EXTRA_CFLAGS += -DRX_SCATTER -#EXTRA_CFLAGS += -DCONFIG_FPGA_MODE -#EXTRA_CFLAGS += -DCONFIG_CSO_SUPPORT -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -#EXTRA_CFLAGS += -DMSP_UTILITY -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_TX_DELAY -EXTRA_CFLAGS += -DDBG_AMSDU -EXTRA_CFLAGS += -DPRE_CAL_MT7622_SUPPORT -CONFIG_PROPRIETARY_DRIVER=n - -ifeq ($(CONFIG_PROPRIETARY_DRIVER),y) -EXTRA_CFLAGS += -DCONFIG_PROPRIETARY_DRIVER -CONFIG_PLATFORM_DRV_SUPPORT=n -else -CONFIG_PLATFORM_DRV_SUPPORT=y -endif - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPROT),y) -EXTRA_CFLAGS += -DPLATFORM_DRIVER_SUPPORT -endif - -EXTRA_CFLAGS += -Werror -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif -ifeq ($(CONFIG_VHT_TXBF_2G_EPIGRAM_IE_SUPPORT),y) - EXTRA_CFLAGS += -DVHT_TXBF_2G_EPIGRAM_IE -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7622.o\ - $(SRC_DIR)/chips/mt7622_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT)$(CONFIG_MTD),yy) -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -ifeq ($(CONFIG_MTD_SPI_NOR),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -else -ifeq ($(CONFIG_MTD_NAND),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif -endif -else -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -ifeq ($(CONFIG_MTD_SPI_NOR),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -else -ifeq ($(CONFIG_MTD_NAND),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif -endif -endif -endif -endif - -ifeq ($(CONFIG_DEFAULTS_MEDIATEK_MT7622),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPORT),y) -chip_objs += $(SRC_DIR)/os/linux/wbsys_main_dev.o -else -chip_objs += $(SRC_DIR)/os/linux/rbus_prop_dev.o -endif - -# -# Root -# - -$(DRV_NAME)-objs += $(ap_objs) $(cmm_objs) $(asic_objs) $(chip_objs) $(rate_objs)\ - $(spec_objs) $(func_objs) $(os_objs) $(dot11_ft_objs) - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_flash.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/hif_pci.o - -$(DRV_NAME)-objs += $(SRC_DIR)/os/linux/rt_pci_rbus.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_util.o\ - #$(SRC_DIR)/os/linux/rbus_main_dev.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_DIR)/ate/ate_agent.o\ - $(SRC_DIR)/ate/testmode_ioctl.o\ - $(SRC_DIR)/ate/mt_mac/mt_testmode.o\ - $(SRC_DIR)/ate/LoopBack.o -endif - - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_tcprack.o -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wstrict-prototypes -Wno-trigraphs -Wall -Wno-unused-but-set-variable - -EXTRA_CFLAGS += -DOLDSEC - -#-Werror -#-DDBG_DIAGNOSE -DDBG_RX_MCS -DDBG_TX_MCS - -EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DSCAN_SUPPORT -DAP_SCAN_SUPPORT -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -#EXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DCONFIG_RT2880_ATE_CMD_NEW - -ifeq ($(CONFIG_FAST_NAT_SUPPORT),y) -EXTRA_CFLAGS += -DCONFIG_FAST_NAT_SUPPORT -endif - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -#EXTRA_CFLAGS += -DDBG -endif -EXTRA_CFLAGS += -DDBG - -ifeq ($(CONFIG_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -ifeq ($(CONFIG_RALINK_MT7621),y) -EXTRA_CFLAGS += -DRACTRL_LIMIT_MAX_PHY_RATE=1300 -endif - -ifeq ($(CONFIG_FAST_NAT_SUPPORT),y) -ifeq ($(CONFIG_WLAN_HOOK),y) -ifeq ($(CONFIG_WHNAT_SUPPORT),y) -EXTRA_CFLAGS += -DWHNAT_SUPPORT -else -ifeq ($(CONFIG_WHNAT_SUPPORT),m) -EXTRA_CFLAGS += -DWHNAT_SUPPORT -endif -endif -endif -endif - -ifeq ($(CONFIG_EASY_SETUP_SUPPORT),y) -EXTRA_CFLAGS += -DWH_EZ_SETUP -EXTRA_CFLAGS += -DNEW_CONNECTION_ALGO -EXTRA_CFLAGS += -DEZ_NETWORK_MERGE_SUPPORT -EXTRA_CFLAGS += -DEZ_DUAL_BAND_SUPPORT -EXTRA_CFLAGS += -DEZ_ROAM_SUPPORT -EXTRA_CFLAGS += -DDUAL_CHIP -EXTRA_CFLAGS += -DEZ_API_SUPPORT -EXTRA_CFLAGS += -DEZ_PUSH_BW_SUPPORT -endif - -ifeq ($(CONFIG_MWDS),y) -EXTRA_CFLAGS += -DMWDS -DA4_CONN -DROUTING_TAB_SUPPORT -endif - -ifeq ($(CONFIG_EVENT_NOTIFIER_SUPPORT),y) -EXTRA_CFLAGS += -DWH_EVENT_NOTIFIER -endif - -#ifeq ($(CONFIG_WIFI_FWD_SUPPORT),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_PKT_FWD -#endif - -ifeq ($(CONFIG_ROAMING_ENHANCE_SUPPORT),y) -EXTRA_CFLAGS += -DROAMING_ENHANCE_SUPPORT -endif - -EXTRA_CFLAGS += -DIP_ASSEMBLY -EXTRA_CFLAGS += -DOUI_CHECK_SUPPORT -EXTRA_CFLAGS += -DHTC_DECRYPT_IOT - -EXTRA_CFLAGS += -Inet/nat -#EXTRA_CFLAGS += -DDBG_STARVATION -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS += -DMT_WIFI_MODULE -else -ifeq ($(CONFIG_MT_WIFI),m) -EXTRA_CFLAGS += -DMT_WIFI_MODULE -endif -endif - -MODULE_FLAGS=$(EXTRA_CFLAGS) -export MODULE_FLAGS -obj-m+=$(SRC_EMBEDDED_DIR)/plug_in/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4 b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4 deleted file mode 100644 index ad9dfabaae..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4 +++ /dev/null @@ -1,470 +0,0 @@ -include $(RT28xx_DIR)/os/linux/config.mk - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) -MOD_NAME = rt$(MODULE)ap -DAT_PATH = /etc/Wireless/RT$(MODULE_DAT)AP -DAT_FILE_NAME = RT$(MODULE_DAT)AP.dat -endif -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -MOD_NAME = rt$(MODULE)apsta -endif -#endif // CONFIG_APSTA_SUPPORT // - - -OBJ := $(MOD_NAME).o - -#ifdef CONFIG_AP_SUPPORT -RT28XX_AP_OBJ := \ - $(RT28xx_DIR)/security/crypt_md5.o\ - $(RT28xx_DIR)/security/crypt_sha2.o\ - $(RT28xx_DIR)/security/crypt_hmac.o\ - $(RT28xx_DIR)/security/crypt_aes.o\ - $(RT28xx_DIR)/security/crypt_arc4.o\ - $(RT28xx_DIR)/common/mlme.o\ - $(RT28xx_DIR)/security/cmm_wep.o\ - $(RT28xx_DIR)/common/action.o\ - $(RT28xx_DIR)/common/cmm_data.o\ - $(RT28xx_DIR)/common/rtmp_init.o\ - $(RT28xx_DIR)/common/rtmp_init_inf.o\ - $(RT28xx_DIR)/security/cmm_tkip.o\ - $(RT28xx_DIR)/security/cmm_aes.o\ - $(RT28xx_DIR)/common/cmm_sync.o\ - $(RT28xx_DIR)/common/eeprom.o\ - $(RT28xx_DIR)/common/cmm_sanity.o\ - $(RT28xx_DIR)/common/cmm_info.o\ - $(RT28xx_DIR)/common/icap.o\ - $(RT28xx_DIR)/common/cmm_cfg.o\ - $(RT28xx_DIR)/security/cmm_wpa.o\ - $(RT28xx_DIR)/common/dfs.o\ - $(RT28xx_DIR)/common/spectrum.o\ - $(RT28xx_DIR)/common/rtmp_timer.o\ - $(RT28xx_DIR)/common/rt_channel.o\ - $(RT28xx_DIR)/common/cmm_profile.o\ - $(RT28xx_DIR)/common/cmm_asic.o\ - $(RT28xx_DIR)/common/cmm_cmd.o\ - $(RT28xx_DIR)/rate_ctrl/ra_ctrl.o\ - $(RT28xx_DIR)/rate_ctrl/alg_legacy.o\ - $(RT28xx_DIR)/os/linux/rt_profile.o\ - $(RT28xx_DIR)/ap/ap_mbss.o\ - $(RT28xx_DIR)/chips/rtmp_chip.o\ - $(RT28xx_DIR)/ap/ap.o\ - $(RT28xx_DIR)/ap/ap_assoc.o\ - $(RT28xx_DIR)/ap/ap_auth.o\ - $(RT28xx_DIR)/ap/ap_connect.o\ - $(RT28xx_DIR)/ap/ap_mlme.o\ - $(RT28xx_DIR)/ap/ap_sanity.o\ - $(RT28xx_DIR)/ap/ap_sync.o\ - $(RT28xx_DIR)/ap/ap_wpa.o\ - $(RT28xx_DIR)/ap/ap_data.o\ - $(RT28xx_DIR)/common/uapsd.o\ - $(RT28xx_DIR)/ap/ap_autoChSel.o\ - $(RT28xx_DIR)/ap/ap_qload.o\ - $(RT28xx_DIR)/ap/ap_cfg.o - -ifeq ($(OSABL),NO) -RT28XX_AP_OBJ := \ - $(RT28xx_DIR)/ap/ap_mbss_inf.o\ - $(RT28xx_DIR)/common/rt_os_util.o\ - $(RT28xx_DIR)/os/linux/ap_ioctl.o\ - $(RT28xx_DIR)/os/linux/rt_linux.o\ - $(RT28xx_DIR)/os/linux/rt_main_dev.o -else -RT28XX_AP_OBJ := \ - $(RT28xx_DIR)/os/linux/rt_symb.o -endif - -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -RT28XX_AP_OBJS += $(RT28xx_DIR)/rate_ctrl/alg_grp.o -endif - -#ifdef DOT11_N_SUPPORT -ifeq ($(HAS_DOT11_N_SUPPORT),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/common/ba_action.o - -#ifdef TXBF_SUPPORT -ifeq ($(HAS_TXBF_SUPPORT),y) -rt$(MODULE)ap-objs += \ - $(RT28xx_DIR)/common/cmm_txbf.o -endif -#endif // TXBF_SUPPORT // -endif -#endif // DOT11_N_SUPPORT // - -#ifdef BG_FT_SUPPORT -ifeq ($(OSABL),NO) -ifeq ($(HAS_BGFP_SUPPORT),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/os/linux/br_ftph.o -endif -endif -#endif // BG_FT_SUPPORT // - -#ifdef LED_CONTROL_SUPPORT -ifeq ($(HAS_LED_CONTROL_SUPPORT),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/common/rt_led.o -endif -#endif // LED_CONTROL_SUPPORT // - - - -ifeq ($(HAS_RT2880_RT2860_COEXIST),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/os/linux/rt_pci_rbus.o\ - $(RT28xx_DIR)/os/linux/rt_rbus_pci_util.o\ - $(RT28xx_DIR)/os/linux/pci_main_dev.o\ - $(RT28xx_DIR)/common/dfs.o -endif - -ifeq ($(HAS_ATE),y) -RT28XX_AP_OBJ += $(RT28xx_DIR)/ate/common/rt_ate.o -endif - -ifeq ($(HAS_QA_SUPPORT),y) -RT28XX_AP_OBJ += $(RT28xx_DIR)/ate/common/rt_qa.o -endif - -#ifdef WSC_INCLUDED -ifeq ($(HAS_WSC),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/common/wsc.o\ - $(RT28xx_DIR)/common/wsc_tlv.o\ - $(RT28xx_DIR)/common/wsc_ufd.o\ - $(RT28xx_DIR)/security/crypt_biginteger.o\ - $(RT28xx_DIR)/security/crypt_dh.o -endif -ifeq ($(HAS_WSC_V2),y) -RT28XX_AP_OBJ += $(RT28xx_DIR)/common/wsc_v2.o -endif -ifeq ($(HAS_WSC_NFC),y) -RT28XX_AP_OBJ += $(RT28xx_DIR)/common/nfc.o -endif -#endif // WSC_INCLUDED // - - - -ifeq ($(HAS_WDS),y) -RT28XX_AP_OBJ += $(RT28xx_DIR)/ap/ap_wds.o - -ifeq ($(OSABL),NO) -RT28XX_AP_OBJ += \ - ../../ap/ap_wds_inf.o -endif -endif - -#ifdef APCLI_SUPPORT -ifeq ($(HAS_APCLI),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/ap/ap_apcli.o \ - $(RT28xx_DIR)/ap/apcli_ctrl.o \ - $(RT28xx_DIR)/ap/apcli_sync.o \ - $(RT28xx_DIR)/ap/apcli_auth.o \ - $(RT28xx_DIR)/ap/apcli_assoc.o \ - $(RT28xx_DIR)/common/cmm_mat.o \ - $(RT28xx_DIR)/common/cmm_mat_iparp.o \ - $(RT28xx_DIR)/common/cmm_mat_pppoe.o \ - $(RT28xx_DIR)/common/cmm_mat_ipv6.o - -ifeq ($(OSABL),NO) -RT28XX_AP_OBJ += \ - ../../ap/ap_apcli_inf.o -endif -endif -#endif // APCLI_SUPPORT // - -ifeq ($(HAS_BLOCK_NET_IF),y) -RT28XX_AP_OBJ += $(RT28xx_DIR)/common/netif_block.o -endif - -ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y) -RT28XX_AP_OBJ += $(RT28xx_DIR)/common/igmp_snoop.o -endif - - -ifeq ($(HAS_IDS_SUPPORT),y) -RT28XX_AP_OBJ += $(RT28xx_DIR)/ap/ap_ids.o -endif - -ifeq ($(PLATFORM),IKANOS_V160) -RT28XX_AP_OBJ += $(RT28xx_DIR)/os/linux/vr_ikans.o -endif - -ifeq ($(PLATFORM),IKANOS_V180) -RT28XX_AP_OBJ += $(RT28xx_DIR)/os/linux/vr_ikans.o -endif - - - -#ifdef DOT11R_FT_SUPPORT -ifeq ($(HAS_DOT11R_FT_SUPPORT),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/common/ft.o\ - $(RT28xx_DIR)/common/ft_tlv.o\ - $(RT28xx_DIR)/common/ft_iocl.o\ - $(RT28xx_DIR)/common/ft_rc.o\ - $(RT28xx_DIR)/ap/ap_ftkd.o -endif -#endif // DOT11R_FT_SUPPORT // - -#ifdef DOT11K_RRM_SUPPORT -ifeq ($(HAS_DOT11K_RRM_SUPPORT),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/common/rrm_tlv.o \ - $(RT28xx_DIR)/common/rrm_sanity.o \ - $(RT28xx_DIR)/common/rrm.o -endif -#endif // DOT11K_RRM_SUPPORT // - -#ifdef DOT11W_PMF_SUPPORT -ifeq ($(HAS_DOT11W_PMF_SUPPORT),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/security/pmf.o -endif -#endif // DOT11W_PMF_SUPPORT // - -ifeq ($(HAS_CLIENT_WDS_SUPPORT),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/common/client_wds.o -endif -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -RT28XX_APSTA_OBJ := \ - $(RT28xx_DIR)/security/crypt_md5.o\ - $(RT28xx_DIR)/security/crypt_sha2.o\ - $(RT28xx_DIR)/security/crypt_hmac.o\ - $(RT28xx_DIR)/security/crypt_aes.o\ - $(RT28xx_DIR)/security/crypt_arc4.o\ - $(RT28xx_DIR)/common/mlme.o\ - $(RT28xx_DIR)/security/cmm_wep.o\ - $(RT28xx_DIR)/common/action.o\ - $(RT28xx_DIR)/common/cmm_data.o\ - $(RT28xx_DIR)/common/rtmp_init.o\ - $(RT28xx_DIR)/security/cmm_tkip.o\ - $(RT28xx_DIR)/security/cmm_aes.o\ - $(RT28xx_DIR)/common/cmm_sync.o\ - $(RT28xx_DIR)/common/eeprom.o\ - $(RT28xx_DIR)/common/cmm_sanity.o\ - $(RT28xx_DIR)/common/cmm_info.o\ - $(RT28xx_DIR)/common/cmm_cfg.o\ - $(RT28xx_DIR)/security/cmm_wpa.o\ - $(RT28xx_DIR)/security/cmm_wpa_adhoc.o\ - $(RT28xx_DIR)/common/dfs.o\ - $(RT28xx_DIR)/common/spectrum.o\ - $(RT28xx_DIR)/common/rtmp_timer.o\ - $(RT28xx_DIR)/common/rt_channel.o\ - $(RT28xx_DIR)/common/cmm_profile.o\ - $(RT28xx_DIR)/common/cmm_asic.o\ - $(RT28xx_DIR)/common/cmm_cmd.o\ - $(RT28xx_DIR)/rate_ctrl/ra_ctrl.o\ - $(RT28xx_DIR)/rate_ctrl/alg_legacy.o\ - $(RT28xx_DIR)/ap/ap.o\ - $(RT28xx_DIR)/ap/ap_assoc.o\ - $(RT28xx_DIR)/ap/ap_auth.o\ - $(RT28xx_DIR)/ap/ap_connect.o\ - $(RT28xx_DIR)/ap/ap_mlme.o\ - $(RT28xx_DIR)/ap/ap_sanity.o\ - $(RT28xx_DIR)/ap/ap_sync.o\ - $(RT28xx_DIR)/ap/ap_wpa.o\ - $(RT28xx_DIR)/ap/ap_data.o\ - $(RT28xx_DIR)/common/uapsd.o\ - $(RT28xx_DIR)/sta/assoc.o\ - $(RT28xx_DIR)/sta/auth.o\ - $(RT28xx_DIR)/sta/auth_rsp.o\ - $(RT28xx_DIR)/sta/sync.o\ - $(RT28xx_DIR)/sta/sanity.o\ - $(RT28xx_DIR)/sta/rtmp_data.o\ - $(RT28xx_DIR)/sta/connect.o\ - $(RT28xx_DIR)/sta/wpa.o\ - $(RT28xx_DIR)/sta/sta_cfg.o\ - $(RT28xx_DIR)/ap/ap_autoChSel.o\ - $(RT28xx_DIR)/ap/ap_qload.o\ - $(RT28xx_DIR)/ap/ap_cfg.o - -ifeq ($(OSABL),NO) -RT28XX_APSTA_OBJ += \ - $(RT28xx_DIR)/common/rtmp_init_inf.o\ - $(RT28xx_DIR)/ap/ap_mbss.o\ - $(RT28xx_DIR)/os/linux/rt_profile.o\ - $(RT28xx_DIR)/os/linux/ap_ioctl.o\ - $(RT28xx_DIR)/os/linux/sta_ioctl.o\ - $(RT28xx_DIR)/os/linux/rt_linux.o\ - $(RT28xx_DIR)/os/linux/rt_main_dev.o -endif - -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -RT28XX_APSTA_OBJS += $(RT28xx_DIR)/rate_ctrl/alg_grp.o -endif - -#ifdef DOT11_N_SUPPORT -ifeq ($(HAS_DOT11_N_SUPPORT),y) -RT28XX_APSTA_OBJ += \ - $(RT28xx_DIR)/common/ba_action.o - -#ifdef TXBF_SUPPORT -ifeq ($(HAS_TXBF_SUPPORT),y) -rt$(MODULE)apsta-objs += \ - $(RT28xx_DIR)/common/cmm_txbf.o -endif -#endif // TXBF_SUPPORT // -endif -#endif // DOT11_N_SUPPORT // - - -#ifdef LED_CONTROL_SUPPORT -ifeq ($(HAS_LED_CONTROL_SUPPORT),y) -RT28XX_APSTA_OBJ += \ - $(RT28xx_DIR)/common/rt_led.o -endif -#endif // LED_CONTROL_SUPPORT // - - -#ifdef WSC_INCLUDED -ifeq ($(HAS_WSC),y) -RT28XX_APSTA_OBJ += \ - $(RT28xx_DIR)/common/wsc.o\ - $(RT28xx_DIR)/common/wsc_tlv.o\ - $(RT28xx_DIR)/security/crypt_biginteger.o\ - $(RT28xx_DIR)/security/crypt_dh.o -endif -#endif // WSC_INCLUDED // - - -ifeq ($(HAS_WDS),y) -RT28XX_APSTA_OBJ += $(RT28xx_DIR)/ap/ap_wds.o - -ifeq ($(OSABL),NO) -RT28XX_APSTA_OBJ += \ - ../../ap/ap_wds_inf.o -endif -endif - -ifeq ($(HAS_IDS_SUPPORT),y) -RT28XX_APSTA_OBJ += $(RT28xx_DIR)/ap/ap_ids.o -endif - -#ifdef APCLI_SUPPORT -ifeq ($(HAS_APCLI),y) -RT28XX_APSTA_OBJ += \ - $(RT28xx_DIR)/ap/ap_apcli.o \ - $(RT28xx_DIR)/ap/apcli_ctrl.o \ - $(RT28xx_DIR)/ap/apcli_sync.o \ - $(RT28xx_DIR)/ap/apcli_auth.o \ - $(RT28xx_DIR)/ap/apcli_assoc.o \ - $(RT28xx_DIR)/common/cmm_mat.o \ - $(RT28xx_DIR)/common/cmm_mat_iparp.o \ - $(RT28xx_DIR)/common/cmm_mat_pppoe.o \ - $(RT28xx_DIR)/common/cmm_mat_ipv6.o - -ifeq ($(OSABL),NO) -RT28XX_APSTA_OBJ += \ - ../../ap/ap_apcli_inf.o -endif -endif -#endif // APCLI_SUPPORT // - -#ifdef ETH_CONVERT -ifeq ($(HAS_ETH_CONVERT_SUPPORT), y) -RT28XX_APSTA_OBJ += \ - $(RT28xx_DIR)/common/cmm_mat.o \ - $(RT28xx_DIR)/common/cmm_mat_iparp.o \ - $(RT28xx_DIR)/common/cmm_mat_pppoe.o \ - $(RT28xx_DIR)/common/cmm_mat_ipv6.o -endif -#endif // ETH_CONVERT // - -ifeq ($(HAS_BLOCK_NET_IF),y) -RT28XX_APSTA_OBJ += $(RT28xx_DIR)/common/netif_block.o -endif - -ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y) -RT28XX_APSTA_OBJ += $(RT28xx_DIR)/common/igmp_snoop.o -endif - - - -#ifdef DOT11R_FT_SUPPORT -ifeq ($(HAS_DOT11R_FT_SUPPORT),y) -RT28XX_APSTA_OBJ += \ - $(RT28xx_DIR)/common/ft.o\ - $(RT28xx_DIR)/common/ft_tlv.o\ - $(RT28xx_DIR)/common/ft_iocl.o\ - $(RT28xx_DIR)/common/ft_rc.o\ - $(RT28xx_DIR)/ap/ap_ftkd.o\ - $(RT28xx_DIR)/sta/ft_auth.o\ - $(RT28xx_DIR)/sta/ft_action.o -endif -#endif // DOT11R_FT_SUPPORT // - -ifeq ($(HAS_CLIENT_WDS_SUPPORT),y) -RT28XX_APSTA_OBJ += \ - $(RT28xx_DIR)/common/client_wds.o -endif -#endif // CONFIG_APSTA_SUPPORT // - -PHONY := all release clean install uninstall - -all:$(OBJ) - -rt$(MODULE)sta.o: $(RT28XX_STA_OBJ) - $(LD) -r $^ -o $@ - -rt$(MODULE)ap.o: $(RT28XX_AP_OBJ) - $(LD) -r $^ -o $@ - -rt$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ) - $(LD) -r $^ -o $@ - -release: - echo "MAKE Linux Station Code Release" - -clean: - rm -f $(RT28xx_DIR)/common/*.o - rm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d} - rm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}} - rm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d} - rm -fr $(RT28xx_DIR)/os/linux/.tmp_versions - rm -f $(RT28xx_DIR)/chips/*.o - rm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d} -ifeq ($(RT28xx_MODE),AP) - rm -f $(RT28xx_DIR)/ap/*.o - rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),STA) - rm -f $(RT28xx_DIR)/sta/*.o - rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),APSTA) - rm -f $(RT28xx_DIR)/ap/*.o - rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d} - rm -f $(RT28xx_DIR)/sta/*.o - rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d} -endif -endif -endif - -install: - rm -rf $(DAT_PATH) - $(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless) - mkdir $(DAT_PATH) - cp $(RT28xx_DIR)/$(DAT_FILE_NAME) $(DAT_PATH)/. - install -d $(LINUX_SRC_MODULE) - install -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE) - /sbin/depmod -a ${shell uname -r} - -uninstall: -# rm -rf $(DAT_PATH) - rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME))) - /sbin/depmod -a ${shell uname -r} - -# Declare the contents of the .PHONY variable as phony. We keep that -# information in a variable so we can use it in if_changed and friends. -.PHONY: $(PHONY) - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4.netif b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4.netif deleted file mode 100644 index 1863be0652..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4.netif +++ /dev/null @@ -1,118 +0,0 @@ -include $(RT28xx_DIR)/os/linux/config.mk - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) -MOD_NAME = rtnet$(MODULE)ap -endif -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -MOD_NAME = rtnet$(MODULE)apsta -endif -#endif // CONFIG_APSTA_SUPPORT // - -OBJ := $(MOD_NAME).o - -#ifdef CONFIG_AP_SUPPORT - -RT28XX_AP_OBJ := \ - ../../ap/ap_mbss_inf.o\ - ../../os/linux/ap_ioctl.o\ - ../../os/linux/rt_main_dev.o - -ifeq ($(HAS_WDS),y) -RT28XX_AP_OBJ += \ - ../../ap/ap_wds_inf.o -endif - -ifeq ($(HAS_APCLI),y) -RT28XX_AP_OBJ += \ - ../../ap/ap_apcli_inf.o -endif - -ifeq ($(HAS_MESH_SUPPORT),y) -RT28XX_AP_OBJ += \ - ../../common/mesh_inf.o -endif - -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -RT28XX_APSTA_OBJ := \ - ../../ap/ap_mbss_inf.o\ - ../../common/p2p_inf.o\ - ../../os/linux/ap_ioctl.o\ - ../../os/linux/sta_ioctl.o\ - ../../os/linux/rt_main_dev.o - -ifeq ($(HAS_WDS),y) -RT28XX_APSTA_OBJ += \ - ../../ap/ap_wds_inf.o -endif - -ifeq ($(HAS_APCLI),y) -RT28XX_APSTA_OBJ += \ - ../../ap/ap_apcli_inf.o -endif - -ifeq ($(HAS_MESH_SUPPORT),y) -RT28XX_APSTA_OBJ += \ - ../../common/mesh_inf.o -endif - - -#endif // CONFIG_APSTA_SUPPORT // - -PHONY := all clean - -all:$(OBJ) - -rtnet$(MODULE)sta.o: $(RT28XX_STA_OBJ) - $(LD) -r $^ -o $@ - -rtnet$(MODULE)ap.o: $(RT28XX_AP_OBJ) - $(LD) -r $^ -o $@ - -rtnet$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ) - $(LD) -r $^ -o $@ - -clean: - rm -f $(RT28xx_DIR)/common/*.o - rm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d} - rm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}} - rm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d} - rm -fr $(RT28xx_DIR)/os/linux/.tmp_versions - rm -f $(RT28xx_DIR)/chips/*.o - rm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d} -ifeq ($(RT28xx_MODE),AP) - rm -f $(RT28xx_DIR)/ap/*.o - rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),STA) - rm -f $(RT28xx_DIR)/sta/*.o - rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),APSTA) - rm -f $(RT28xx_DIR)/ap/*.o - rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d} - rm -f $(RT28xx_DIR)/sta/*.o - rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d} -endif -endif -endif - -install: - install -d $(LINUX_SRC_MODULE) - install -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE) - /sbin/depmod -a ${shell uname -r} - -uninstall: - rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME))) - /sbin/depmod -a ${shell uname -r} - -# Declare the contents of the .PHONY variable as phony. We keep that -# # information in a variable so we can use it in if_changed and friends. -.PHONY: $(PHONY) diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4.util b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4.util deleted file mode 100644 index e510c24c3b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.4.util +++ /dev/null @@ -1,96 +0,0 @@ -include $(RT28xx_DIR)/os/linux/config.mk - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) -MOD_NAME = rtutil$(MODULE)ap -endif -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -MOD_NAME = rtutil$(MODULE)apsta -endif -#endif // CONFIG_APSTA_SUPPORT // - -OBJ := $(MOD_NAME).o - -#ifdef CONFIG_AP_SUPPORT - -RT28XX_AP_OBJ := \ - ../../common/rt_os_util.o\ - ../../os/linux/rt_linux_symb.o\ - ../../os/linux/rt_rbus_pci_util.o\ - ../../os/linux/rt_usb_util.o\ - ../../os/linux/rt_linux.o - -ifeq ($(HAS_BGFP_SUPPORT),y) -RT28XX_AP_OBJ += \ - $(RT28xx_DIR)/os/linux/br_ftph.o -endif - -#endif // CONFIG_AP_SUPPORT // - - - - -#ifdef CONFIG_APSTA_SUPPORT -RT28XX_APSTA_OBJ := \ - ../../common/rt_os_util.o\ - ../../os/linux/rt_linux_symb.o\ - ../../os/linux/rt_rbus_pci_util.o\ - ../../os/linux/rt_usb_util.o\ - ../../os/linux/rt_linux.o - -#endif // CONFIG_APSTA_SUPPORT // - -PHONY := all clean - -all:$(OBJ) - -rtutil$(MODULE)sta.o: $(RT28XX_STA_OBJ) - $(LD) -r $^ -o $@ - -rtutil$(MODULE)ap.o: $(RT28XX_AP_OBJ) - $(LD) -r $^ -o $@ - -rtutil$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ) - $(LD) -r $^ -o $@ - -clean: - rm -f $(RT28xx_DIR)/common/*.o - rm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d} - rm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}} - rm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d} - rm -fr $(RT28xx_DIR)/os/linux/.tmp_versions - rm -f $(RT28xx_DIR)/chips/*.o - rm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d} -ifeq ($(RT28xx_MODE),AP) - rm -f $(RT28xx_DIR)/ap/*.o - rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),STA) - rm -f $(RT28xx_DIR)/sta/*.o - rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),APSTA) - rm -f $(RT28xx_DIR)/ap/*.o - rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d} - rm -f $(RT28xx_DIR)/sta/*.o - rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d} -endif -endif -endif - -install: - install -d $(LINUX_SRC_MODULE) - install -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE) - /sbin/depmod -a ${shell uname -r} - -uninstall: - rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME))) - /sbin/depmod -a ${shell uname -r} - -# Declare the contents of the .PHONY variable as phony. We keep that -# # information in a variable so we can use it in if_changed and friends. -.PHONY: $(PHONY) diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6 b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6 deleted file mode 100644 index 84e28e6c12..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6 +++ /dev/null @@ -1,807 +0,0 @@ -include $(RT28xx_OS_DIR)/linux/config.mk - -RT28xx_RPATH = ../../ -RT28xx_EMBED_RPATH=../../embedded - -obj_ap := -obj_sta := -obj_p2p := -obj_wsc := -obj_vht := -obj_cmm := \ - $(RT28xx_EMBED_RPATH)/security/crypt_md5.o\ - $(RT28xx_EMBED_RPATH)/security/crypt_sha2.o\ - $(RT28xx_EMBED_RPATH)/security/crypt_hmac.o\ - $(RT28xx_EMBED_RPATH)/security/crypt_aes.o\ - $(RT28xx_EMBED_RPATH)/security/crypt_arc4.o\ - $(RT28xx_EMBED_RPATH)/common/mlme.o\ - $(RT28xx_EMBED_RPATH)/security/cmm_wep.o\ - $(RT28xx_EMBED_RPATH)/common/action.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_data.o\ - $(RT28xx_EMBED_RPATH)/common/qm.o\ - $(RT28xx_EMBED_RPATH)/common/fp_qm.o\ - $(RT28xx_EMBED_RPATH)/common/fq_qm.o\ - $(RT28xx_EMBED_RPATH)/common/fp_fair_qm.o\ - $(RT28xx_EMBED_RPATH)/common/rtmp_init.o\ - $(RT28xx_EMBED_RPATH)/common/rtmp_init_inf.o\ - $(RT28xx_EMBED_RPATH)/security/cmm_tkip.o\ - $(RT28xx_EMBED_RPATH)/security/cmm_aes.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_sync.o\ - $(RT28xx_EMBED_RPATH)/common/eeprom.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_sanity.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_info.o\ - $(RT28xx_EMBED_RPATH)/common/icap.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_cfg.o\ - $(RT28xx_EMBED_RPATH)/security/cmm_wpa.o\ - $(RT28xx_EMBED_RPATH)/security/cmm_sec.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_radar.o\ - $(RT28xx_EMBED_RPATH)/common/spectrum.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_mumimo.o\ - $(RT28xx_EMBED_RPATH)/common/rtmp_timer.o\ - $(RT28xx_EMBED_RPATH)/common/rt_channel.o\ - $(RT28xx_EMBED_RPATH)/common/ee_efuse.o\ - $(RT28xx_EMBED_RPATH)/common/ee_prom.o\ - $(RT28xx_EMBED_RPATH)/common/ee_flash.o\ - $(RT28xx_EMBED_RPATH)/common/op_class.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_profile.o\ - $(RT28xx_EMBED_RPATH)/common/scan.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_cmd.o\ - $(RT28xx_EMBED_RPATH)/common/ps.o\ - $(RT28xx_EMBED_RPATH)/common/sys_log.o\ - $(RT28xx_EMBED_RPATH)/common/txpower.o\ - $(RT28xx_RPATH)/chips/rtmp_chip.o\ - $(RT28xx_EMBED_RPATH)/mgmt/mgmt_hw.o\ - $(RT28xx_EMBED_RPATH)/mgmt/mgmt_dev.o\ - $(RT28xx_EMBED_RPATH)/mgmt/mgmt_entrytb.o\ - $(RT28xx_EMBED_RPATH)/common/wdev.o\ - $(RT28xx_EMBED_RPATH)/common/bcn.o\ - $(RT28xx_EMBED_RPATH)/common/wifi_sys_info.o\ - $(RT28xx_EMBED_RPATH)/common/wifi_sys_notify.o\ - $(RT28xx_EMBED_RPATH)/wlan_config/config_basic.o\ - $(RT28xx_EMBED_RPATH)/wlan_config/config_phy.o\ - $(RT28xx_EMBED_RPATH)/wlan_config/config_ht.o\ - $(RT28xx_EMBED_RPATH)/wlan_config/config_vht.o\ - $(RT28xx_EMBED_RPATH)/mgmt/be_basic.o\ - $(RT28xx_EMBED_RPATH)/mgmt/be_phy.o\ - $(RT28xx_EMBED_RPATH)/mgmt/be_ht.o\ - $(RT28xx_EMBED_RPATH)/mgmt/be_vht.o\ - $(RT28xx_EMBED_RPATH)/mgmt/bss_ops.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_rvr_dbg.o\ - $(RT28xx_EMBED_RPATH)/common/cmm_info_element.o\ - $(RT28xx_RPATH)/os/linux/rt_profile.o\ - $(RT28xx_RPATH)/os/linux/tm.o\ - $(RT28xx_EMBED_RPATH)/common/misc_app.o - -#ifdef RTMP_UDMA_SUPPORT -ifeq ($(HAS_INTEL_UDMA_SUPPORT),y) -obj_cmm += $(RT28xx_RPATH)/os/linux/rt_udma.o -endif -#endif // RTMP_UDMA_SUPPORT // - -ifeq ($(HAS_CUT_THROUGH),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/cut_through.o -endif - -ifeq ($(HAS_TCP_RACK_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/cmm_tcprack.o -endif - -ifeq ($(HAS_SINGLE_SKU_V2_SUPPORT),y) -obj_cmm += $(RT28xx_RPATH)/txpwr/single_sku.o -endif - -ifeq ($(HAS_FW_DUMP_SUPPORT),y) -obj_cmm += $(RT28xx_RPATH)/os/linux/mt_fwdump.o -endif - -ifeq ($(HAS_MULTI_PROFILE_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/multi_profile.o -endif - -obj_ra := \ - $(RT28xx_RPATH)/rate_ctrl/ra_ctrl_mt.o\ - $(RT28xx_RPATH)/rate_ctrl/ra_ctrl_mt_drv.o\ - $(RT28xx_RPATH)/rate_ctrl/ra_wrapper_embedded.o\ - $(RT28xx_RPATH)/rate_ctrl/ra_cfg.o - -ifeq ($(HAS_RACTRL_FW_OFFLOAD_SUPPORT),n) -obj_ra += $(RT28xx_RPATH)/rate_ctrl/ra_table.o -endif - -obj_txbf := \ - $(RT28xx_RPATH)/txbf/cmm_txbf_cal_mt.o\ - $(RT28xx_RPATH)/txbf/cmm_txbf_mt.o\ - $(RT28xx_RPATH)/txbf/txbf_wrapper_embedded.o - -obj_hw_ctrl := \ - $(RT28xx_RPATH)/hw_ctrl/cmm_asic.o \ - $(RT28xx_RPATH)/hw_ctrl/cmm_chip.o \ - $(RT28xx_RPATH)/hw_ctrl/hw_init.o - -ifeq ($(HAS_GREENAP_SUPPORT),y) -obj_hw_ctrl += $(RT28xx_RPATH)/hw_ctrl/greenap.o -endif -######################################### -# ASIC related source files -######################################### -obj_mac := -obj_phy := $(RT28xx_RPATH)/phy/phy.o\ - $(RT28xx_RPATH)/phy/rf.o - -ifeq ($(HAS_MT_BBP),y) -obj_phy += $(RT28xx_RPATH)/phy/mt_phy.o -endif - -ifeq ($(HAS_RLM_CAL_CACHE),y) -obj_phy += $(RT28xx_RPATH)/phy/rlm_cal_cache.o -endif - -ifeq ($(HAS_MT_RF),y) -obj_phy += $(RT28xx_RPATH)/phy/mt_rf.o -endif - -ifeq ($(HAS_MAC_PCI),y) -obj_mac += $(RT28xx_EMBED_RPATH)/common/cmm_mac_pci.o\ - $(RT28xx_EMBED_RPATH)/common/hif_pci.o\ - $(RT28xx_RPATH)/os/linux/rt_rbus_pci_drv.o - -ifeq ($(HAS_ATE),y) -#obj_mac += $(RT28xx_EMBED_RPATH)/ate/rt_mac/ate_pci.o -endif - -ifeq ($(OSABL),NO) -obj_mac += \ - $(RT28xx_RPATH)/os/linux/rt_pci_rbus.o\ - $(RT28xx_RPATH)/os/linux/rt_rbus_pci_util.o -endif -endif - - - -ifeq ($(HAS_MT_MAC),y) -obj_mac += $(RT28xx_RPATH)/hw_ctrl/cmm_chip_mt.o -obj_mac += $(RT28xx_RPATH)/hw_ctrl/mt_gpio.o -ifneq ($(findstring mt7615,$(CHIPSET)),) -obj_mac += $(RT28xx_RPATH)/mac/mt_dmac.o -obj_mac += $(RT28xx_RPATH)/hw_ctrl/cmm_asic_mt_dmac.o -else #mt7615 -ifeq ($(CHIPSET), $(filter $(CHIPSET), p18 mt7622 mt7663 soc1_0)) -obj_mac += $(RT28xx_RPATH)/mac/mt_dmac.o -obj_mac += $(RT28xx_RPATH)/hw_ctrl/cmm_asic_mt_dmac.o -else #p18 -obj_mac += $(RT28xx_RPATH)/mac/mt_mac.o -obj_mac += $(RT28xx_RPATH)/hw_ctrl/cmm_asic_mt.o -endif #p18 -endif #mt7615 -obj_mac += $(RT28xx_RPATH)/hw_ctrl/cmm_asic_mt_fw.o -obj_mac += $(RT28xx_EMBED_RPATH)/common/mt_ps.o -obj_mac += $(RT28xx_EMBED_RPATH)/common/mt_io.o -obj_mac += $(RT28xx_RPATH)/protocol/tmr.o -obj_mac += $(RT28xx_RPATH)/protocol/protection.o -obj_mac += $(RT28xx_EMBED_RPATH)/common/txs.o -endif - - -######################################### -# Itnterface related source files -######################################### -obj_inf := - -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hw_ctrl.o -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hw_ctrl_basic.o -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hw_ctrl_cmd.o -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hdev/wmm_ctrl.o -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hdev/wtbl_ctrl.o -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hdev/radio_ctrl.o -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hdev/omac_ctrl.o -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hdev/hdev_basic.o -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hdev_ctrl.o - -ifeq ($(HAS_WIFI_SYS_FW_V1),y) -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hw_ctrl_ops_v1.o -endif - -ifeq ($(HAS_WIFI_SYS_FW_V2),y) -obj_inf +=$(RT28xx_EMBED_RPATH)/hw_ctrl/hw_ctrl_ops_v2.o -endif - - - -ifeq ($(HAS_INF_PCI),y) -ifeq ($(OSABL),NO) -obj_inf += $(RT28xx_RPATH)/os/linux/pci_main_dev.o -endif -endif - -ifeq ($(HAS_INF_RBUS),y) -ifeq ($(OSABL),NO) -obj_inf += $(RT28xx_RPATH)/os/linux/rbus_main_dev.o -endif -endif - -obj_cmm += $(obj_phy) $(obj_mac) $(obj_inf) $(obj_hw_ctrl) - -######################################### -# ATE/QA related source files -######################################### -ifeq ($(HAS_ATE),y) -obj_cmm += $(RT28xx_RPATH)/ate/ate_agent.o - -ifeq ($(HAS_QA_SUPPORT),y) -#obj_cmm += $(RT28xx_RPATH)/ate/qa_agent.o -obj_cmm += $(RT28xx_RPATH)/ate/testmode_ioctl.o -obj_cmm += $(RT28xx_RPATH)/ate/LoopBack.o -endif -endif - - -######################################### -# System Feature related source files -######################################### - -ifeq ($(HAS_UAPSD_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/uapsd.o -endif - -ifeq ($(HAS_BLOCK_NET_IF),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/netif_block.o -endif - -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -obj_ra += $(RT28xx_RPATH)/rate_ctrl/alg_grp_mt.o -endif - -ifeq ($(HAS_RATE_ADAPT_AGBS_SUPPORT),y) -ifeq ($(HAS_RACTRL_FW_OFFLOAD_SUPPORT),n) -obj_ra += $(RT28xx_RPATH)/rate_ctrl/alg_agbs_mt.o -obj_ra += $(RT28xx_RPATH)/rate_ctrl/ra_fallback_mt.o -endif -endif - -ifeq ($(HAS_DFS_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/cmm_dfs.o -endif - -ifeq ($(HAS_MT_DFS_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/cmm_rdm_mt.o -endif - -ifeq ($(HAS_CS_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/cmm_cs.o -endif - -#ifdef LED_CONTROL_SUPPORT -ifeq ($(HAS_LED_CONTROL_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/rt_led.o -endif -#endif // LED_CONTROL_SUPPORT // - -#ifdef ANDES_FIRMWARE_SUPPORT -ifeq ($(HAS_ANDES_FIRMWARE_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/mcu/rtmp_and.o -endif -#endif /* ANDES_FIRMWARE_SUPPORT */ - - -#ifdef DOT11_SAE_SUPPORT -ifeq ($(HAS_WPA3_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/security/sae.o -obj_cmm += $(RT28xx_EMBED_RPATH)/security/bn_lib.o -obj_cmm += $(RT28xx_EMBED_RPATH)/security/crypt_bignum.o -obj_cmm += $(RT28xx_EMBED_RPATH)/security/crypt_biginteger.o -obj_cmm += $(RT28xx_EMBED_RPATH)/security/ecc.o -ifeq ($(HAS_OWE_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/security/owe.o -endif -endif -#endif - -#ifdef DOT11K_RRM_SUPPORT -ifeq ($(HAS_DOT11K_RRM_SUPPORT),y) -obj_cmm += \ - $(RT28xx_EMBED_RPATH)/common/rrm_tlv.o\ - $(RT28xx_EMBED_RPATH)/common/rrm_sanity.o\ - $(RT28xx_EMBED_RPATH)/common/rrm.o -endif -#endif // DOT11K_RRM_SUPPORT // - -#ifdef CONFIG_DOT11V_WNM -ifeq ($(HAS_DOT11V_WNM_SUPPORT),y) -obj_cmm += \ - $(RT28xx_EMBED_RPATH)/common/wnm.o -endif -#endif // CONFIG_DOT11V_WNM // - -#ifdef DOT11W_PMF_SUPPORT -ifeq ($(HAS_DOT11W_PMF_SUPPORT),y) -obj_cmm += $(RT28xx_EMBED_RPATH)/security/pmf.o -endif -#endif // DOT11W_PMF_SUPPORT // - - -#ifdef DOT11_N_SUPPORT -ifeq ($(HAS_DOT11_N_SUPPORT),y) -obj_cmm += \ - $(RT28xx_EMBED_RPATH)/common/ba_action.o\ - $(RT28xx_EMBED_RPATH)/mgmt/mgmt_ht.o\ - $(RT28xx_EMBED_RPATH)/common/vendor.o - -#ifdef TXBF_SUPPORT -ifeq ($(HAS_TXBF_SUPPORT),y) -#ifdef MT_MAC -ifeq ($(HAS_MT_MAC),n) -obj_cmm += \ - $(RT28xx_EMBED_RPATH)/common/cmm_txbf.o -endif -#endif // MT_MAC // -endif -#endif // TXBF_SUPPORT // -endif -#endif // DOT11_N_SUPPORT // - -#ifdef DOT11_VHT_SUPPORT -ifeq ($(HAS_DOT11_VHT_SUPPORT),y) -obj_vht += $(RT28xx_EMBED_RPATH)/mgmt/mgmt_vht.o\ - $(RT28xx_EMBED_RPATH)/common/vht.o -endif -#endif // DOT11_VHT_SUPPORT // - - -#ifdef WSC_INCLUDED -ifeq ($(HAS_WSC),y) -obj_wsc += \ - $(RT28xx_EMBED_RPATH)/common/wsc.o\ - $(RT28xx_EMBED_RPATH)/common/wsc_tlv.o\ - $(RT28xx_EMBED_RPATH)/security/crypt_biginteger.o\ - $(RT28xx_EMBED_RPATH)/security/crypt_dh.o -endif - -ifeq ($(HAS_WSC_V2),y) -obj_wsc += $(RT28xx_EMBED_RPATH)/common/wsc_v2.o -endif -ifeq ($(HAS_WSC_NFC),y) -obj_wsc += $(RT28xx_EMBED_RPATH)/common/nfc.o -endif -#endif // WSC_INCLUDED // - -#ifdef DOT11R_FT_SUPPORT -ifeq ($(HAS_DOT11R_FT_SUPPORT),y) -obj_cmm += \ - $(RT28xx_EMBED_RPATH)/common/ft.o\ - $(RT28xx_EMBED_RPATH)/common/ft_tlv.o\ - $(RT28xx_EMBED_RPATH)/common/ft_iocl.o\ - $(RT28xx_EMBED_RPATH)/common/ft_rc.o -endif -#endif // DOT11R_FT_SUPPORT // - - - -#ifdef CONFIG_HOTSPOT -ifeq ($(HAS_HOTSPOT_SUPPORT),y) -obj_cmm += \ - $(RT28xx_EMBED_RPATH)/common/wnm.o\ - $(RT28xx_EMBED_RPATH)/common/gas.o\ - $(RT28xx_EMBED_RPATH)/common/hotspot.o -endif -#endif // CONFIG_HOTSPOT // - - -#ifdef SMART_CARRIER_SENSE_SUPPORT -ifeq ($(HAS_SMART_CARRIER_SENSE_SUPPORT),y) -obj_cmm += \ - $(RT28xx_EMBED_RPATH)/common/scs.o -endif -#endif // SMART_CARRIER_SENSE_SUPPORT // - -############################################################################### -# -# config for AP mode -# -############################################################################### - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) -obj_ap += \ - $(RT28xx_EMBED_RPATH)/ap/ap_mbss.o\ - $(RT28xx_EMBED_RPATH)/ap/ap.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_assoc.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_auth.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_mlme.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_sanity.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_sync.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_wpa.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_sec.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_data.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_autoChSel.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_qload.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_cfg.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_nps.o\ - $(RT28xx_EMBED_RPATH)/ap/ap_vow.o - -ifeq ($(HAS_MU_MIMO_SUPPORT),y) -obj_ap += $(RT28xx_EMBED_RPATH)/ap/ap_mumimo.o -endif - -ifeq ($(HAS_IDS_SUPPORT),y) -obj_ap += $(RT28xx_EMBED_RPATH)/ap/ap_ids.o -endif - -#ifdef CONFIG_WAPP_SUPPORT -ifeq ($(HAS_WAPP_SUPPORT),y) -obj_ap += $(RT28xx_EMBED_RPATH)/wapp/wapp.o -endif -#endif // CONFIG_WAPP_SUPPORT // - -#ifdef CONFIG_MBO_SUPPORT -ifeq ($(HAS_MBO_SUPPORT),y) -obj_ap += $(RT28xx_EMBED_RPATH)/common/mbo.o -endif -#endif // CONFIG_MBO_SUPPORT // - -#ifdef CONFIG_MAP_SUPPORT -ifeq ($(HAS_MAP_SUPPORT),y) -obj_ap += $(RT28xx_EMBED_RPATH)/common/map.o -obj_ap += $(RT28xx_EMBED_RPATH)/common/a4_conn.o -obj_ap += $(RT28xx_EMBED_RPATH)/common/routing_tab.o -endif -#endif // CONFIG_MAP_SUPPORT // - -ifeq ($(HAS_WSC),y) -obj_ap += $(RT28xx_EMBED_RPATH)/common/wsc_ufd.o -endif - -#ifdef DOT11R_FT_SUPPORT -ifeq ($(HAS_DOT11R_FT_SUPPORT),y) -obj_ap += $(RT28xx_EMBED_RPATH)/ap/ap_ftkd.o -endif -#endif // DOT11R_FT_SUPPORT // - - -ifeq ($(HAS_WDS),y) -obj_ap += $(RT28xx_EMBED_RPATH)/ap/ap_wds.o - -ifeq ($(OSABL),NO) -obj_ap += $(RT28xx_EMBED_RPATH)/ap/ap_wds_inf.o -endif -endif - -ifeq ($(OSABL),NO) -obj_ap += \ - $(RT28xx_EMBED_RPATH)/ap/ap_mbss_inf.o\ - $(RT28xx_RPATH)/os/linux/ap_ioctl.o -endif - -ifeq ($(HAS_MWDS),y) -obj_ap += \ - $(RT28xx_EMBED_RPATH)/common/mwds.o \ - $(RT28xx_EMBED_RPATH)/common/routing_tab.o -endif - -ifeq ($(HAS_WH_EVENT_NOTIFIER),y) -obj_ap += \ - $(RT28xx_EMBED_RPATH)/common/event_notifier.o -endif - -#ifdef APCLI_SUPPORT -ifeq ($(HAS_APCLI),y) -obj_ap += \ - $(RT28xx_EMBED_RPATH)/ap/ap_apcli.o \ - $(RT28xx_EMBED_RPATH)/ap/apcli_ctrl.o \ - $(RT28xx_EMBED_RPATH)/ap/apcli_sync.o \ - $(RT28xx_EMBED_RPATH)/ap/apcli_auth.o \ - $(RT28xx_EMBED_RPATH)/ap/apcli_assoc.o \ - $(RT28xx_EMBED_RPATH)/common/cmm_mat.o \ - $(RT28xx_EMBED_RPATH)/common/cmm_mat_iparp.o \ - $(RT28xx_EMBED_RPATH)/common/cmm_mat_pppoe.o \ - $(RT28xx_EMBED_RPATH)/common/cmm_mat_ipv6.o - - -ifeq ($(HAS_MAC_REPEATER_SUPPORT),y) -obj_ap += $(RT28xx_EMBED_RPATH)/ap/ap_repeater.o -endif - -ifeq ($(OSABL),NO) -obj_ap += $(RT28xx_EMBED_RPATH)/ap/ap_apcli_inf.o -endif -endif -#endif // APCLI_SUPPORT // - - -ifeq ($(HAS_CLIENT_WDS_SUPPORT),y) -$(MOD_NAME)-objs += \ - $(RT28xx_EMBED_RPATH)/common/client_wds.o -endif - -ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y) -obj_ap += $(RT28xx_EMBED_RPATH)/common/igmp_snoop.o -endif - -ifeq ($(HAS_BGND_SCAN_SUPPORT),y) -ifneq ($(findstring mt7615,$(CHIPSET)),) -obj_cmm += $(RT28xx_EMBED_RPATH)/common/bgnd_scan.o -endif -endif - -MOD_NAME = $(MODULE)_ap -DAT_PATH = /etc/Wireless/RT$(CHIPSET_DAT)AP -DAT_FILE_NAME = conf/RT$(CHIPSET_DAT)AP.dat -endif -#endif // CONFIG_AP_SUPPORT // - - -############################################################################### -# -# config for STA mode -# -############################################################################### - - - -############################################################################### -# -# config for AP/STA mixed mode -# -############################################################################### - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -MOD_NAME = $(MODULE)_apsta -endif -#endif // CONFIG_APSTA_SUPPORT // - - -############################################################################### -# -# Module Base -# -############################################################################### - -obj-m := $(MOD_NAME).o - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) - -$(MOD_NAME)-objs := \ - $(obj_ap)\ - $(obj_vht)\ - $(obj_cmm)\ - $(obj_ra)\ - $(obj_wsc)\ - $(obj_phy)\ - $(obj_txbf) - -#ifdef MULTI_INF_SUPPORT -ifeq ($(HAS_MULTI_INF),y) -$(MOD_NAME)-objs += $(RT28xx_RPATH)/os/linux/multi_main_dev.o -endif -#endif // MULTI_INF_SUPPORT // - -#ifdef BG_FT_SUPPORT -ifeq ($(OSABL),NO) -ifeq ($(HAS_BGFP_SUPPORT),y) -$(MOD_NAME)-objs += \ - $(RT28xx_RPATH)/os/linux/br_ftph.o -endif -endif -#endif // BG_FT_SUPPORT // - -ifeq ($(OSABL),NO) -$(MOD_NAME)-objs += \ - $(RT28xx_EMBED_RPATH)/common/rt_os_util.o\ - $(RT28xx_RPATH)/os/linux/rt_linux.o\ - $(RT28xx_RPATH)/os/linux/rt_txrx_hook.o\ - $(RT28xx_RPATH)/os/linux/rt_main_dev.o - - -#ifdef CONFIG_TRACE_SUPPORT -ifeq ($(HAS_TRACE_SUPPORT),y) -$(MOD_NAME)-objs += \ - $(RT28xx_RPATH)/os/linux/trace.o\ - -CFLAGS_trace.o = -I$(RT28xx_DIR)/include/os -endif -#endif - -#ifdef CONFIG_SNIFFER_SUPPORT -ifeq ($(HAS_SNIFFER_SUPPORT),y) -$(MOD_NAME)-objs += \ - $(RT28xx_EMBED_RPATH)/common/sniffer_prism.o \ - $(RT28xx_EMBED_RPATH)/common/sniffer_radiotap.o -endif -#endif // CONFIG_SNIFFER_SUPPORT // - -else -$(MOD_NAME)-objs += \ - $(RT28xx_RPATH)/os/linux/rt_symb.o -endif - -#ifdef CRDA_SUPPORT -ifeq ($(OSABL),NO) -ifeq ($(HAS_CFG80211_SUPPORT),y) -$(MOD_NAME)-objs += \ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_util.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_scan.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_rx.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_tx.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_inf.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_p2p.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_ap.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211drv.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_tdls.o -endif -endif - -ifeq ($(OSABL),YES) -ifeq ($(HAS_CFG80211_SUPPORT),y) -$(MOD_NAME)-objs += \ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_scan.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_rx.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_tx.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_inf.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_p2p.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211_ap.o\ - $(RT28xx_RPATH)/os/linux/cfg80211/cfg80211drv.o -endif -endif -#endif // CRDA_SUPPORT // - - -ifeq ($(PLATFORM),IKANOS_V160) -$(MOD_NAME)-objs += $(RT28xx_RPATH)/os/linux/vr_ikans.o -endif - -ifeq ($(PLATFORM),IKANOS_V180) -$(MOD_NAME)-objs += $(RT28xx_RPATH)/os/linux/vr_ikans.o -endif - -ifeq ($(PLATFORM),BL2348) -ifeq ($(OSABL),NO) -$(MOD_NAME)-objs += $(RT28xx_RPATH)/os/linux/vr_bdlt.o -endif -endif -#ifdef PLATFORM_BL23570 -ifeq ($(PLATFORM),BL23570) -rt$(CHIPSET)ap-objs += \ - $(RT28xx_RPATH)/os/linux/vr_bdlt.o -endif -#endif // PLATFORM_BL23570 // - -endif -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -$(MOD_NAME)-objs := \ - $(obj_ap)\ - $(obj_sta)\ - $(obj_cmm)\ - $(obj_ra)\ - $(obj_wsc)\ - $(obj_txbf) -endif -#endif // CONFIG_APSTA_SUPPORT // - - -#chip releated - - - - -#ifdef MT7615 -ifneq ($(findstring mt7615,$(CHIPSET)),) -$(MOD_NAME)-objs += \ - $(RT28xx_RPATH)/chips/mt7615.o\ - $(RT28xx_RPATH)/chips/mt7615_dbg.o\ - $(RT28xx_EMBED_RPATH)/mcu/mcu.o\ - $(RT28xx_EMBED_RPATH)/mcu/andes_core.o\ - $(RT28xx_EMBED_RPATH)/mcu/andes_mt.o \ - $(RT28xx_RPATH)/mcu/fw_cmd.o \ - $(RT28xx_RPATH)/mcu/fwdl.o \ - $(RT28xx_RPATH)/mcu/fwdl_mt.o \ - $(RT28xx_RPATH)/mcu/mt_cmd.o - -ifeq ($(HAS_ATE),y) -#$(MOD_NAME)-objs += $(RT28xx_RPATH)/ate/mt_mac/mt_ate.o -$(MOD_NAME)-objs += $(RT28xx_RPATH)/ate/mt_mac/mt_testmode.o -$(MOD_NAME)-objs += $(RT28xx_RPATH)/ate/mt_mac/mt_testmode_dmac.o -endif - -endif -#endif // MT7615 // - -#start of mt7622 -ifneq ($(findstring mt7622,$(CHIPSET)),) - -$(MOD_NAME)-objs += \ - $(RT28xx_RPATH)/chips/mt7622.o\ - $(RT28xx_RPATH)/chips/mt7622_dbg.o\ - $(RT28xx_EMBED_RPATH)/mcu/mcu.o\ - $(RT28xx_EMBED_RPATH)/mcu/andes_core.o\ - $(RT28xx_EMBED_RPATH)/mcu/andes_mt.o \ - $(RT28xx_RPATH)/mcu/fw_cmd.o \ - $(RT28xx_RPATH)/mcu/fwdl.o \ - $(RT28xx_RPATH)/mcu/fwdl_mt.o \ - $(RT28xx_RPATH)/mcu/mt_cmd.o - -ifeq ($(HAS_ATE),y) -#$(MOD_NAME)-objs += $(RT28xx_RPATH)/ate/mt_mac/mt_ate.o -$(MOD_NAME)-objs += $(RT28xx_RPATH)/ate/mt_mac/mt_testmode.o -$(MOD_NAME)-objs += $(RT28xx_RPATH)/ate/mt_mac/mt_testmode_dmac.o -endif - -endif -#end of mt7622 - -PHONY := clean install uninstall - -clean: - rm -f $(RT28xx_EMBED_RPATH)/common/*.o - rm -f $(RT28xx_EMBED_RPATH)/common/.*.{cmd,flags,d} - rm -f $(RT28xx_RPATH)/os/linux/*.{o,ko,mod.{o,c}} - rm -f $(RT28xx_RPATH)/os/linux/.*.{cmd,flags,d} - rm -fr $(RT28xx_RPATH)/os/linux/.tmp_versions -#Must clean Module.symvers; or you will suffer symbol version not match -#when OS_ABL = YES. - rm -f $(RT28xx_RPATH)/os/linux/Module.symvers - rm -f $(RT28xx_RPATH)/os/linux/Modules.symvers - rm -f $(RT28xx_RPATH)/os/linux/Module.markers - rm -f $(RT28xx_RPATH)/os/linux/modules.order - rm -f $(RT28xx_EMBED_RPATH)/chips/*.o - rm -f $(RT28xx_EMBED_RPATH)/chips/.*.{cmd,flags,d} -ifeq ($(RT28xx_MODE),AP) - rm -f $(RT28xx_EMBED_RPATH)/ap/*.o - rm -f $(RT28xx_EMBED_RPATH)/ap/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),STA) - rm -f $(RT28xx_EMBED_RPATH)/sta/*.o - rm -f $(RT28xx_EMBED_RPATH)/sta/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),APSTA) - rm -f $(RT28xx_EMBED_RPATH)/ap/*.o - rm -f $(RT28xx_EMBED_RPATH)/ap/.*.{cmd,flags,d} - rm -f $(RT28xx_EMBED_RPATH)/sta/*.o - rm -f $(RT28xx_EMBED_RPATH)/sta/.*.{cmd,flags,d} -endif -endif -endif - -install: -ifeq ($(PLATFORM),INTELP6) - rm -rf $(BUILD_DEST)/etc/Wireless/7615AP/ - mkdir -p $(BUILD_DEST)/etc/ - mkdir -p $(BUILD_DEST)/etc/Wireless/ - mkdir -p $(BUILD_DEST)/etc/Wireless/7615AP/ - chmod 755 $(BUILD_DEST)/etc/Wireless/7615AP/ -Rf - rm -rf $(FSROOT)/etc/Wireless/7615AP/ - mkdir -p $(FSROOT)/etc/ - mkdir -p $(FSROOT)/etc/Wireless/ - mkdir -p $(FSROOT)/etc/Wireless/7615AP/ - chmod 755 $(BUILD_DEST)/etc/Wireless/7615AP -Rf -ifeq ($(RT28xx_MODE),AP) -ifeq ($(PLATFORM),INTELP6) - install -d $(BUILD_DEST)/lib/modules/wifi/ - install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(BUILD_DEST)/lib/modules/wifi/ - install -d $(FSROOT)/lib/modules/wifi/ - install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(FSROOT)/lib/modules/wifi/ -endif -endif -else - rm -rf $(DAT_PATH) - $(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless) - mkdir $(DAT_PATH) - cp $(RT28xx_EMBEDDED_DIR)/$(DAT_FILE_NAME) $(DAT_PATH)/. - install -d $(LINUX_SRC_MODULE) - install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE) - /sbin/depmod -a ${shell uname -r} -endif - -uninstall: -# rm -rf $(DAT_PATH) - rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME))) - /sbin/depmod -a ${shell uname -r} - -# Declare the contents of the .PHONY variable as phony. We keep that -# information in a variable so we can use it in if_changed and friends. -.PHONY: $(PHONY) diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6.netif b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6.netif deleted file mode 100644 index 145fa3daa2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6.netif +++ /dev/null @@ -1,114 +0,0 @@ -include $(RT28xx_DIR)/os/linux/config.mk - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) -MOD_NAME = $(MODULE)_ap_net -endif -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -MOD_NAME = $(MODULE)_apsta_net -endif -#endif // CONFIG_APSTA_SUPPORT // - -obj-m := $(MOD_NAME).o - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) -$(MOD_NAME)-objs := \ - ../../ap/ap_mbss_inf.o\ - ../../os/linux/ap_ioctl.o\ - ../../os/linux/rt_main_dev.o - -ifeq ($(HAS_CFG80211_SUPPORT),y) -$(MOD_NAME)-objs += \ - ../../os/linux/cfg80211.o -endif - -ifeq ($(HAS_WDS),y) -$(MOD_NAME)-objs += \ - ../../ap/ap_wds_inf.o -endif - -ifeq ($(HAS_APCLI),y) -$(MOD_NAME)-objs += \ - ../../ap/ap_apcli_inf.o -endif - -ifeq ($(HAS_MESH_SUPPORT),y) -$(MOD_NAME)-objs += \ - ../../common/mesh_inf.o -endif - -endif -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -$(MOD_NAME)-objs := \ - ../../ap/ap_mbss_inf.o\ - ../../common/p2p_inf.o\ - ../../os/linux/ap_ioctl.o\ - ../../os/linux/sta_ioctl.o\ - ../../os/linux/rt_main_dev.o - -ifeq ($(HAS_CFG80211_SUPPORT),y) -$(MOD_NAME)-objs += \ - ../../os/linux/cfg80211.o -endif - -ifeq ($(HAS_WDS),y) -$(MOD_NAME)-objs += \ - ../../ap/ap_wds_inf.o -endif - -ifeq ($(HAS_APCLI),y) -$(MOD_NAME)-objs += \ - ../../ap/ap_apcli_inf.o -endif - -ifeq ($(HAS_MESH_SUPPORT),y) -$(MOD_NAME)-objs += \ - ../../common/mesh_inf.o -endif - - -endif -#endif // CONFIG_APSTA_SUPPORT // - -#chip related - - -clean: - rm -f ../../common/*.o - rm -f ../../common/.*.{cmd,flags,d} - rm -f ../../os/linux/*.{o,ko,mod.{o,c}} - rm -f ../../os/linux/.*.{cmd,flags,d} - rm -fr ../../os/linux/.tmp_versions - rm -f ../../os/linux/Module.symvers - rm -f ../../os/linux/Modules.symvers - rm -f ../../os/linux/Module.markers - rm -f ../../os/linux/modules.order - rm -f ../../chips/*.o - rm -f ../../chips/.*.{cmd,flags,d} -ifeq ($(RT28xx_MODE),AP) - rm -f ../../ap/*.o - rm -f ../../ap/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),STA) - rm -f ../../sta/*.o - rm -f ../../sta/.*.{cmd,flags,d} -endif -endif - -install: - install -d $(LINUX_SRC_MODULE) - install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE) - /sbin/depmod -a ${shell uname -r} - -uninstall: - rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME))) - /sbin/depmod -a ${shell uname -r} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6.util b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6.util deleted file mode 100644 index df61db7be9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.6.util +++ /dev/null @@ -1,108 +0,0 @@ -include $(RT28xx_DIR)/os/linux/config.mk - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) -MOD_NAME = $(MODULE)_ap_util -endif -#endif // CONFIG_AP_SUPPORT // - - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -MOD_NAME = $(MODULE)_apsta_util -endif -#endif // CONFIG_APSTA_SUPPORT // - -obj-m := $(MOD_NAME).o - -#ifdef CONFIG_AP_SUPPORT -ifeq ($(RT28xx_MODE),AP) -$(MOD_NAME)-objs := \ - ../../common/rt_os_util.o\ - ../../os/linux/rt_linux_symb.o\ - ../../os/linux/rt_rbus_pci_util.o\ - ../../os/linux/rt_usb_util.o\ - ../../os/linux/rt_linux.o - -ifeq ($(PLATFORM),BL2348) -$(MOD_NAME)-objs += \ - ../../os/linux/vr_bdlt.o -endif - -ifeq ($(PLATFORM),BLUBB) -$(MOD_NAME)-objs += \ - ../../os/linux/vr_bdlt.o -endif - -ifeq ($(HAS_BGFP_SUPPORT),y) -$(MOD_NAME)-objs += \ - ../../os/linux/br_ftph.o -endif -endif -#endif // CONFIG_AP_SUPPORT // - - - - -#ifdef CONFIG_APSTA_SUPPORT -ifeq ($(RT28xx_MODE), APSTA) -$(MOD_NAME)-objs := \ - ../../common/rt_os_util.o\ - ../../os/linux/rt_linux_symb.o\ - ../../os/linux/rt_rbus_pci_util.o\ - ../../os/linux/rt_usb_util.o\ - ../../os/linux/rt_linux.o - -ifeq ($(HAS_SNIFFER_SUPPORT),y) -$(MOD_NAME)-objs += \ - ../../sniffer/sniffer_prism.o\ - ../../sniffer/sniffer_radiotap.o -endif - -ifeq ($(PLATFORM),BL2348) -$(MOD_NAME)-objs += \ - ../../os/linux/vr_bdlt.o -endif - -ifeq ($(PLATFORM),BLUBB) -$(MOD_NAME)-objs += \ - ../../os/linux/vr_bdlt.o -endif - -ifeq ($(HAS_BGFP_SUPPORT),y) -$(MOD_NAME)-objs += \ - ../../os/linux/br_ftph.o -endif -endif -#endif // CONFIG_APSTA_SUPPORT // - -clean: - rm -f ../../common/*.o - rm -f ../../common/.*.{cmd,flags,d} - rm -f ../../os/linux/*.{o,ko,mod.{o,c}} - rm -f ../../os/linux/.*.{cmd,flags,d} - rm -fr ../../os/linux/.tmp_versions - rm -f ../../os/linux/Module.symvers - rm -f ../../os/linux/Modules.symvers - rm -f ../../os/linux/Module.markers - rm -f ../../os/linux/modules.order - rm -f ../../chips/*.o - rm -f ../../chips/.*.{cmd,flags,d} -ifeq ($(RT28xx_MODE),AP) - rm -f ../../ap/*.o - rm -f ../../ap/.*.{cmd,flags,d} -else -ifeq ($(RT28xx_MODE),STA) - rm -f ../../sta/*.o - rm -f ../../sta/.*.{cmd,flags,d} -endif -endif - -install: - install -d $(LINUX_SRC_MODULE) - install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE) - /sbin/depmod -a ${shell uname -r} - -uninstall: - rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME))) - /sbin/depmod -a ${shell uname -r} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.ap.soc b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.ap.soc deleted file mode 100644 index 7314d1288d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.ap.soc +++ /dev/null @@ -1,390 +0,0 @@ -EXTRA_CFLAGS = -Idrivers/net/wireless/rt2860v2/include -Idrivers/net/wireless/rt2860v2/ate/include - -obj-$(CONFIG_RT2860V2_AP) += rt2860v2_ap.o - -rt2860v2_ap-objs += ../rt2860v2/common/crypt_md5.o -rt2860v2_ap-objs += ../rt2860v2/common/crypt_sha2.o -rt2860v2_ap-objs += ../rt2860v2/common/crypt_hmac.o -rt2860v2_ap-objs += ../rt2860v2/common/crypt_aes.o -rt2860v2_ap-objs += ../rt2860v2/common/crypt_arc4.o -rt2860v2_ap-objs += ../rt2860v2/common/mlme.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_wep.o -rt2860v2_ap-objs += ../rt2860v2/common/action.o -rt2860v2_ap-objs += ../rt2860v2/common/ba_action.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_data.o -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_init.o -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_init_inf.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_tkip.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_aes.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_sync.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_sanity.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_info.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_cfg.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_wpa.o -rt2860v2_ap-objs += ../rt2860v2/common/dfs.o -rt2860v2_ap-objs += ../rt2860v2/common/dfs_mcu.o -rt2860v2_ap-objs += ../rt2860v2/common/spectrum.o -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_timer.o -rt2860v2_ap-objs += ../rt2860v2/common/rt_channel.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_profile.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_asic.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_cmd.o -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_swmcu.o -rt2860v2_ap-objs += ../rt2860v2/common/rt_os_util.o -rt2860v2_ap-objs += ../rt2860v2/common/eeprom.o -rt2860v2_ap-objs += ../rt2860v2/common/ee_flash.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mac_pci.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_data_pci.o - -rt2860v2_ap-objs += ../rt2860v2/chips/rtmp_chip.o - -rt2860v2_ap-objs += ../rt2860v2/ap/ap.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_assoc.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_auth.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_connect.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_mlme.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_sanity.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_sync.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_wpa.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_data.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_uapsd.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_autoChSel.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_qload.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_cfg.o - -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_proc.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_linux.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_profile.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_main_dev.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/ap_ioctl.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_pci_rbus.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_rbus_pci_util.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_rbus_pci_drv.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rbus_main_dev.o -rt2860v2_ap-objs += ../rt2860v2/common/rt_ate.o - -ifeq ($(CONFIG_RT2860V2_AP_WMM_ACM),y) -rt2860v2_ap-objs += ../rt2860v2/common/acm_edca.o -rt2860v2_ap-objs += ../rt2860v2/common/acm_comm.o -rt2860v2_ap-objs += ../rt2860v2/common/acm_iocl.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_LED),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_led.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_WSC),y) -rt2860v2_ap-objs += ../rt2860v2/common/wsc.o -rt2860v2_ap-objs += ../rt2860v2/common/wsc_tlv.o -rt2860v2_ap-objs += ../rt2860v2/common/crypt_dh.o -rt2860v2_ap-objs += ../rt2860v2/common/crypt_biginteger.o -rt2860v2_ap-objs += ../rt2860v2/common/wsc_ufd.o -rt2860v2_ap-objs += ../rt2860v2/common/wsc_v2.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_NINTENDO),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_nintendo.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_WDS),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_wds.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_wds_inf.o -rt2860v2_ap-objs += ../rt2860v2/common/client_wds.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_MBSS),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_mbss.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_mbss_inf.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_APCLI),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_apcli.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_apcli_inf.o -rt2860v2_ap-objs += ../rt2860v2/ap/apcli_assoc.o -rt2860v2_ap-objs += ../rt2860v2/ap/apcli_auth.o -rt2860v2_ap-objs += ../rt2860v2/ap/apcli_ctrl.o -rt2860v2_ap-objs += ../rt2860v2/ap/apcli_sync.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_iparp.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_pppoe.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_ipv6.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_IGMP_SNOOP),y) -rt2860v2_ap-objs += ../rt2860v2/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_NETIF_BLOCK),y) -rt2860v2_ap-objs += ../rt2860v2/common/netif_block.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_DLS),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_dls.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_IDS),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_ids.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_MESH),y) -rt2860v2_ap-objs += ../rt2860v2/common/mesh_bmpkt.o -rt2860v2_ap-objs += ../rt2860v2/common/mesh_ctrl.o -rt2860v2_ap-objs += ../rt2860v2/common/mesh_link_mng.o -rt2860v2_ap-objs += ../rt2860v2/common/mesh_sanity.o -rt2860v2_ap-objs += ../rt2860v2/common/mesh_tlv.o -rt2860v2_ap-objs += ../rt2860v2/common/mesh.o -rt2860v2_ap-objs += ../rt2860v2/common/mesh_inf.o -rt2860v2_ap-objs += ../rt2860v2/common/mesh_forwarding.o -rt2860v2_ap-objs += ../rt2860v2/common/mesh_path_mng.o -endif - -ifeq ($(CONFIG_RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY),y) -rt2860v2_ap-objs += ../rt2860v2/os/linux/ap_diversity.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_WAPI),y) -rt2860v2_ap-objs += ../rt2860v2/common/wapi.o -rt2860v2_ap-objs += ../rt2860v2/common/wapi_crypt.o -rt2860v2_ap-objs += ../rt2860v2/common/wapi_sms4.o -endif - -#ifeq ($(CONFIG_RT2860V2_80211R_FT),y) -#rt2860v2_ap-objs += ../rt2860v2/common/ft.o -#rt2860v2_ap-objs += ../rt2860v2/common/ft_tlv.o -#rt2860v2_ap-objs += ../rt2860v2/common/ft_ioctl.o -#rt2860v2_ap-objs += ../rt2860v2/common/ft_rc.o -#rt2860v2_ap-objs += ../rt2860v2/ap/ap_ftkd.o -#endif - -#ifeq ($(CONFIG_RT2860V2_80211K_RR),y) -#rt2860v2_ap-objs += ../rt2860v2/common/rrm_tlv.o -#rt2860v2_ap-objs += ../rt2860v2/common/rrm_sanity.o -#rt2860v2_ap-objs += ../rt2860v2/common/rrm.o -#endif - -ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y) -rt2860v2_ap-objs += ../rt2860v2/common/cmm_video.o -endif - -ifeq ($(CONFIG_RALINK_RT2880),y) -rt2860v2_ap-objs += ../rt2860v2/chips/rt2880.o -endif - -ifeq ($(CONFIG_RALINK_RT3052),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o -endif - -ifeq ($(CONFIG_RALINK_RT3352),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt3352.o -endif - -ifeq ($(CONFIG_RT3x52),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt3352.o -endif - -ifeq ($(CONFIG_RALINK_RT5350),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt5350.o -endif - -ifeq ($(CONFIG_RALINK_RT3883),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt3883.o -ifeq ($(CONFIG_RT2860V2_AP_TXBF),y) -rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf_cal.o -endif -endif - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wall -Wstrict-prototypes -Wno-trigraphs - -EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DAP_SCAN_SUPPORT -DUAPSD_AP_SUPPORT -DRTMP_RBUS_SUPPORT -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DSTATS_COUNT_SUPPORT -DRELASE_EXCLUDE -DIAPP_SUPPORT -DDOT1X_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW -DNEW_TXCONT -DNEW_TXCARRSUPP -EXTRA_CFLAGS += -DCONFIG_RA_NAT_NONE - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_RALINK_RT2880),y) -EXTRA_CFLAGS += -DRT2880 -endif - -ifeq ($(CONFIG_RALINK_RT3052),y) -ifeq ($(CONFIG_RALINK_RT3350),y) -EXTRA_CFLAGS += -DRT3350 -DRT305x -DRTMP_RF_RW_SUPPORT -else -EXTRA_CFLAGS += -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT -endif -endif - -ifeq ($(CONFIG_RALINK_RT3352),y) -EXTRA_CFLAGS += -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RT3x52),y) -EXTRA_CFLAGS += -DRT3052 -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_RT5350),y) -EXTRA_CFLAGS += -DRT5350 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_RT3883),y) -EXTRA_CFLAGS += -DRT3883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -ifeq ($(CONFIG_RT2860V2_AP_TXBF),y) -EXTRA_CFLAGS += -DTXBF_SUPPORT -endif -EXTRA_CFLAGS += -DSTREAM_MODE_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_DLS),y) -EXTRA_CFLAGS += -DQOS_DLS_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_IDS),y) -EXTRA_CFLAGS += -DIDS_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_DFS),y) -EXTRA_CFLAGS += -DDFS_SUPPORT -EXTRA_CFLAGS += -DNEW_DFS -endif - -ifeq ($(CONFIG_RT2860V2_AP_CARRIER),y) -EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT -ifeq ($(CONFIG_RALINK_RT3052),y) -EXTRA_CFLAGS += -DTONE_RADAR_DETECT_SUPPORT -endif -endif - -ifeq ($(CONFIG_RT2860V2_AUTO_CH_SELECT_ENCANCE),y) -EXTRA_CFLAGS += -DAUTO_CH_SELECT_ENHANCE -endif - -ifeq ($(CONFIG_RT2860V2_80211N_DRAFT3),y) -EXTRA_CFLAGS += -DDOT11N_DRAFT3 -endif - -ifeq ($(CONFIG_SINGLE_SKU),y) -EXTRA_CFLAGS += -DSINGLE_SKU -endif - -ifeq ($(CONFIG_RT2860V2_SNMP),y) -EXTRA_CFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_MCAST_RATE_SPECIFIC),y) -EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(CONFIG_RT2860V2_AP_WMM_ACM),y) -EXTRA_CFLAGS += -DWMM_ACM_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_LED),y) -EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -DCONFIG_SWMCU_SUPPORT -ifeq ($(CONFIG_RT2860V2_AP_WSC),y) -EXTRA_CFLAGS += -DWSC_LED_SUPPORT -endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_NINTENDO),y) -EXTRA_CFLAGS += -DNINTENDO_AP -endif - -ifeq ($(CONFIG_RT2860V2_AP_WSC),y) -EXTRA_CFLAGS += -DWSC_AP_SUPPORT -DWSC_V2_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_LLTD),y) -EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_WDS),y) -EXTRA_CFLAGS += -DWDS_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_MBSS),y) -EXTRA_CFLAGS += -DMBSS_SUPPORT -endif - -ifeq ($(CONFIG_NEW_MBSSID_MODE),y) -EXTRA_CFLAGS += -DNEW_MBSSID_MODE -endif - -ifeq ($(CONFIG_RT2860V2_AP_APCLI),y) -EXTRA_CFLAGS += -DAPCLI_SUPPORT -EXTRA_CFLAGS += -DMAT_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_IGMP_SNOOP),y) -EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_NETIF_BLOCK),y) -EXTRA_CFLAGS += -DBLOCK_NET_IF -endif - -ifeq ($(CONFIG_RT2860V2_AP_MESH),y) -EXTRA_CFLAGS += -DMESH_SUPPORT -DINTEL_CMPC -endif - -ifeq ($(CONFIG_RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DRT3XXX_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_HW_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_WAPI),y) -EXTRA_CFLAGS += -DWAPI_SUPPORT -ifeq ($(CONFIG_RALINK_RT3052),y) -EXTRA_CFLAGS += -DSOFT_ENCRYPT -endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_COC),y) -EXTRA_CFLAGS += -DCOC_SUPPORT -DGREENAP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y) -EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(CONFIG_RT2860V2_AP_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -EXTRA_CFLAGS += -DDBG -endif - -ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y) -EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT -endif - -ifeq ($(CONFIG_RA_NETWORK_WORKQUEUE_BH),y) -EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - -ifeq ($(CONFIG_RT2860V2_AP_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -#ifeq ($(CONFIG_RT2860V2_AP_INTELLIGENT_RATE_ADAPTION),y) -#EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.ap.usb b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.ap.usb deleted file mode 100644 index 521bec2d28..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.ap.usb +++ /dev/null @@ -1,346 +0,0 @@ -# In-Tree Makefile for USB combo -EXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/MODULE/include -EXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/UTIL/include -EXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/NETIF/include -EXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/MODULE/ate/include - -# UTIL module -obj-$(CONFIG_RTUSB_AP) += RT5572_ap_util.o -RT5572_ap_util-y += UTIL/common/rt_os_util.o -RT5572_ap_util-y += UTIL/os/linux/rt_linux_symb.o -RT5572_ap_util-y += UTIL/os/linux/rt_rbus_pci_util.o -RT5572_ap_util-y += UTIL/os/linux/rt_usb_util.o -RT5572_ap_util-y += UTIL/os/linux/rt_linux.o - -# MODULE module -obj-$(CONFIG_RTUSB_AP) += RT5572_ap.o -RT5572_ap-y += MODULE/common/crypt_md5.o -RT5572_ap-y += MODULE/common/crypt_sha2.o -RT5572_ap-y += MODULE/common/crypt_hmac.o -RT5572_ap-y += MODULE/common/crypt_aes.o -RT5572_ap-y += MODULE/common/crypt_arc4.o -RT5572_ap-y += MODULE/common/mlme.o -RT5572_ap-y += MODULE/common/cmm_wep.o -RT5572_ap-y += MODULE/common/action.o -RT5572_ap-y += MODULE/common/cmm_data.o -RT5572_ap-y += MODULE/common/rtmp_init.o -RT5572_ap-y += MODULE/common/rtmp_init_inf.o -RT5572_ap-y += MODULE/common/cmm_tkip.o -RT5572_ap-y += MODULE/common/cmm_aes.o -RT5572_ap-y += MODULE/common/cmm_sync.o -RT5572_ap-y += MODULE/common/eeprom.o -RT5572_ap-y += MODULE/common/cmm_sanity.o -RT5572_ap-y += MODULE/common/cmm_info.o -RT5572_ap-y += MODULE/common/cmm_cfg.o -RT5572_ap-y += MODULE/common/cmm_wpa.o -RT5572_ap-y += MODULE/common/cmm_radar.o -RT5572_ap-y += MODULE/common/spectrum.o -RT5572_ap-y += MODULE/common/rtmp_timer.o -RT5572_ap-y += MODULE/common/rt_channel.o -RT5572_ap-y += MODULE/common/cmm_profile.o -RT5572_ap-y += MODULE/common/cmm_asic.o -RT5572_ap-y += MODULE/common/cmm_cmd.o -RT5572_ap-y += MODULE/rate_ctrl/ra_ctrl.o -RT5572_ap-y += MODULE/rate_ctrl/alg_legacy.o -RT5572_ap-y += MODULE/rate_ctrl/alg_ags.o -RT5572_ap-y += MODULE/os/linux/rt_profile.o -RT5572_ap-y += MODULE/chips/rtmp_chip.o -RT5572_ap-y += MODULE/ap/ap.o -RT5572_ap-y += MODULE/ap/ap_assoc.o -RT5572_ap-y += MODULE/ap/ap_auth.o -RT5572_ap-y += MODULE/ap/ap_connect.o -RT5572_ap-y += MODULE/ap/ap_mlme.o -RT5572_ap-y += MODULE/ap/ap_sanity.o -RT5572_ap-y += MODULE/ap/ap_sync.o -RT5572_ap-y += MODULE/ap/ap_wpa.o -RT5572_ap-y += MODULE/ap/ap_data.o -RT5572_ap-y += MODULE/common/uapsd.o -RT5572_ap-y += MODULE/ap/ap_autoChSel.o -RT5572_ap-y += MODULE/ap/ap_qload.o -RT5572_ap-y += MODULE/ap/ap_cfg.o -RT5572_ap-y += MODULE/common/ba_action.o -RT5572_ap-y += MODULE/common/cmm_mac_usb.o -RT5572_ap-y += MODULE/common/rtusb_io.o -RT5572_ap-y += MODULE/common/rtusb_data.o -RT5572_ap-y += MODULE/common/cmm_data_usb.o -RT5572_ap-y += MODULE/common/rtmp_mcu.o -RT5572_ap-y += MODULE/common/rtusb_bulk.o -RT5572_ap-y += MODULE/os/linux/rt_usb.o -RT5572_ap-y += MODULE/common/ee_prom.o -RT5572_ap-y += MODULE/common/cmm_dfs.o -RT5572_ap-y += MODULE/common/cmm_cs.o -RT5572_ap-y += MODULE/common/ee_prom.o -RT5572_ap-y += MODULE/common/ee_efuse.o -RT5572_ap-y += MODULE/common/rt_rf.o -RT5572_ap-y += MODULE/os/linux/rt_symb.o -RT5572_ap-y += MODULE/common/rt_led.o - -# NET module -obj-$(CONFIG_RTUSB_AP) += RT5572_ap_net.o -RT5572_ap_net-y += NETIF/common/rtusb_dev_id.o -RT5572_ap_net-y += NETIF/os/linux/ap_ioctl.o -RT5572_ap_net-y += NETIF/os/linux/rt_main_dev.o -RT5572_ap_net-y += NETIF/os/linux/usb_main_dev.o - -# By feature -ifeq ($(CONFIG_RTUSB_AP_WSC),y) -RT5572_ap-y += MODULE/common/wsc.o -RT5572_ap-y += MODULE/common/wsc_tlv.o -RT5572_ap-y += MODULE/common/wsc_ufd.o -RT5572_ap-y += MODULE/common/crypt_biginteger.o -RT5572_ap-y += MODULE/common/crypt_dh.o -RT5572_ap-y += MODULE/common/wsc_v2.o -endif - -ifeq ($(CONFIG_RTUSB_WDS),y) -RT5572_ap-y += MODULE/ap/ap_wds.o -RT5572_ap-y += MODULE/common/client_wds.o -RT5572_ap_net-y += NETIF/ap/ap_wds_inf.o -endif - -ifeq ($(CONFIG_RTUSB_AP_MBSS),y) -RT5572_ap-y += MODULE/ap/ap_mbss.o -RT5572_ap_net-y += NETIF/ap/ap_mbss_inf.o -endif - -ifeq ($(CONFIG_RTUSB_AP_HS),y) -RT5572_ap-y += MODULE/common/wnm.o -RT5572_ap-y += MODULE/common/gas.o -RT5572_ap-y += MODULE/common/hotspot.o -endif - -ifeq ($(CONFIG_RTUSB_APCLI),y) -RT5572_ap-y += MODULE/ap/ap_apcli.o -RT5572_ap-y += MODULE/ap/apcli_ctrl.o -RT5572_ap-y += MODULE/ap/apcli_sync.o -RT5572_ap-y += MODULE/ap/apcli_auth.o -RT5572_ap-y += MODULE/ap/apcli_assoc.o -RT5572_ap-y += MODULE/common/cmm_mat.o -RT5572_ap-y += MODULE/common/cmm_mat_iparp.o -RT5572_ap-y += MODULE/common/cmm_mat_pppoe.o -RT5572_ap-y += MODULE/common/cmm_mat_ipv6.o -RT5572_ap_net-y += NETIF/ap/ap_apcli_inf.o -endif - -ifeq ($(CONFIG_RTUSB_DFS),y) -RT5572_ap-y += MODULE/common/cmm_dfs.o -endif - -ifeq ($(CONFIG_RTUSB_CS),y) -RT5572_ap-y += MODULE/common/cmm_cs.o -endif - -ifeq ($(CONFIG_RTUSB_IGMP_SNOOP),y) -RT5572_ap-y += MODULE/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_RTUSB_NETIF_BLOCK),y) -RT5572_ap-y += MODULE/common/netif_block.o -endif - -ifeq ($(CONFIG_RTUSB_DLS),y) -RT5572_ap-y += MODULE/ap/ap_dls.o -endif - -ifeq ($(CONFIG_RTUSB_IDS),y) -RT5572_ap-y += MODULE/ap/ap_ids.o -endif - -ifeq ($(CONFIG_RTUSB_AP_FLASH_SUPPORT),y) -RT5572_ap-y += MODULE/common/ee_flash.o -endif - -# WAPI -ifeq ($(CONFIG_RTUSB_AP_WAPI),y) -RT5572_ap-y += MODULE/common/wapi.o -RT5572_ap-y += MODULE/common/wapi_sms4.o -RT5572_ap-y += MODULE/common/wapi_crypt.o -endif - -# Chip related -ifeq ($(CONFIG_RT2870_AP),y) -RT5572_ap-y += MODULE/chips/rt28xx.o -endif - -ifeq ($(CONFIG_RT3572_AP),y) -RT5572_ap-y += MODULE/chips/rt28xx.o -RT5572_ap-y += MODULE/chips/rt30xx.o -RT5572_ap-y += MODULE/chips/rt35xx.o -endif - -ifeq ($(CONFIG_RT3573_AP),y) -RT5572_ap-y += MODULE/chips/rt28xx.o -RT5572_ap-y += MODULE/chips/rt30xx.o -RT5572_ap-y += MODULE/chips/rt35xx.o -RT5572_ap-y += MODULE/chips/rt3593.o -endif - -ifeq ($(CONFIG_RT5572_AP),y) -RT5572_ap-y += MODULE/chips/rt28xx.o -RT5572_ap-y += MODULE/chips/rt30xx.o -RT5572_ap-y += MODULE/chips/rt5592.o -endif - -# ATE -ifeq ($(CONFIG_RTUSB_AP_ATE),y) -RT5572_ap-y += MODULE/ate/common/rt_ate.o -RT5572_ap-y += MODULE/ate/common/ate_usb.o -endif - -ifeq ($(CONFIG_RT2870_AP_ATE),y) -RT5572_ap-y += MODULE/ate/chips/rt28xx_ate.o -endif - -ifeq ($(CONFIG_RT3572_AP_ATE),y) -RT5572_ap-y += MODULE/ate/chips/rt28xx_ate.o -RT5572_ap-y += MODULE/ate/chips/rt35xx_ate.o -endif - -ifeq ($(CONFIG_RT5572_AP_ATE),y) -RT5572_ap-y += MODULE/ate/chips/rt28xx_ate.o -RT5572_ap-y += MODULE/ate/chips/rt5592_ate.o -endif - -# QA tool -ifeq ($(CONFIG_RTUSB_AP_QA),y) -RT5572_ap-y += MODULE/ate/common/rt_qa.o -endif -################### -# CFLAGS -################### -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX\ - -Wall -Wstrict-prototypes -Wno-trigraphs -EXTRA_CFLAGS += -DSYSTEM_LOG_SUPPORT -EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DUAPSD_SUPPORT -DIAPP_SUPPORT -DDBG\ - -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -EXTRA_CFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -EXTRA_CFLAGS += -DSTATS_COUNT_SUPPORT -DDOT11_N_SUPPORT -DRTDEV_SUPPORT - - -ifeq ($(CONFIG_RTUSB_AP),m) -EXTRA_CFLAGS += -DOS_ABL_SUPPORT -EXTRA_CFLAGS += -DOS_ABL_FUNC_SUPPORT -EXTRA_CFLAGS += -DOS_ABL_OS_PCI_SUPPORT -EXTRA_CFLAGS += -DOS_ABL_OS_USB_SUPPORT -EXTRA_CFLAGS += -DOS_ABL_OS_AP_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_AP_WSC),y) -EXTRA_CFLAGS += -DWSC_AP_SUPPORT -DWSC_INCLUDED -DWSC_V2_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_WDS),y) -EXTRA_CFLAGS += -DWDS_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_MBSS),y) -EXTRA_CFLAGS += -DMBSS_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_AP_HS),y) -EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -endif - -ifeq ($(CONFIG_RTUSB_APCLI),y) -EXTRA_CFLAGS += -DAPCLI_SUPPORT -EXTRA_CFLAGS += -DMAT_SUPPORT -EXTRA_CFLAGS += -DAP_SCAN_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_AP_DLS),y) -EXTRA_CFLAGS += -DQOS_DLS_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_IDS),y) -EXTRA_CFLAGS += -DIDS_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_AP_FLASH_SUPPORT), y) -EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_AP_80211N_DRAFT3),y) -EXTRA_CFLAGS += -DDOT11N_DRAFT3 -endif - -ifeq ($(CONFIG_RTUSB_LLTD),y) -EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_IGMP_SNOOP),y) -EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT -endif - -ifeq ($(CONFIG_RTUSB_NETIF_BLOCK),y) -EXTRA_CFLAGS += -DBLOCK_NET_IF -endif - -# Chip related -ifeq ($(CONFIG_RT2870_AP), y) -EXTRA_CFLAGS += -DRT2870 -DRT28xx -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT - -ifeq ($(CONFIG_RTUSB_DFS), y) -EXTRA_CFLAGS += -DDFS_SOFTWARE_SUPPORT -endif - -endif - -ifeq ($(CONFIG_RT3572_AP), y) -EXTRA_CFLAGS += -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRT3572 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT - -ifeq ($(CONFIG_RTUSB_DFS), y) -EXTRA_CFLAGS += -DDFS_DEBUG -endif - -ifeq ($(CONFIG_RTUSB_CS_SUPPORT), y) -EXTRA_CFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT -endif - -endif - -ifeq ($(CONFIG_RT3573_AP), y) -EXTRA_CFLAGS += -DRT30xx -DRT35xx -DRT3593 -DRT3573 -DA_BAND_SUPPORT -DDOT11N_SS3_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RT5572_AP), y) -EXTRA_CFLAGS += -DRT30xx -DRT5572 -DRT5592 -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT -DRTMP_TEMPERATURE_COMPENSATION - -ifeq ($(CONFIG_RTUSB_DFS), y) -EXTRA_CFLAGS += -DDFS_SOFTWARE_SUPPORT -DDFS_HARDWARE_SUPPORT -DDFS_DEBUG -endif - -ifeq ($(CONFIG_RTUSB_CS_SUPPORT), y) -EXTRA_CFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT -endif - -endif - -# ATE -ifeq ($(CONFIG_RTUSB_AP_ATE), y) -EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_RT2880_ATE_CMD_NEW -endif - -# QA -ifeq ($(CONFIG_RTUSB_AP_QA), y) -EXTRA_CFLAGS += -DCONFIG_QA -endif - -# WAPI -ifeq ($(CONFIG_RTUSB_AP_WAPI), y) -EXTRA_CFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT -DEXPORT_SYMTAB -endif - -# NEW MBSS -ifeq ($(CONFIG_RTUSB_AP_NEW_MBSS_MODE), y) -EXTRA_CFLAGS += -DNEW_MBSSID_MODE -endif - -clean: - @rm -f common/*.o - @rm -f ap/*.o - @rm -f sta/*.o - @rm -f os/linux/*.o - @rm -f chips/*.o - @rm -f `find ./ -name *.o.cmd` - @rm -f *.ko - @rm -f *.o diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.clean b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.clean deleted file mode 100644 index d2bec51861..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.clean +++ /dev/null @@ -1,90 +0,0 @@ -include $(RT28xx_OS_DIR)/linux/config.mk - -RT28xx_RPATH = ../.. -RT28xx_EMBED_RPATH=../../embedded - -PHONY := clean install uninstall - -clean: - rm -f $(RT28xx_EMBED_RPATH)/common/*.o - rm -f $(RT28xx_EMBED_RPATH)/common/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/os/linux/*.o *.ko *.mod.o *.mod.c - rm -f $(RT28xx_RPATH)/os/linux/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/protocol/*.o *.ko *.mod.o *.mod.c - rm -f $(RT28xx_RPATH)/protocol/.*.cmd .*.flags .*.d - rm -fr $(RT28xx_RPATH)/os/linux/.tmp_versions -#Must clean Module.symvers; or you will suffer symbol version not match -#when OS_ABL = YES. - rm -f $(RT28xx_RPATH)/os/linux/Module.symvers - rm -f $(RT28xx_RPATH)/os/linux/Modules.symvers - rm -f $(RT28xx_RPATH)/os/linux/Module.markers - rm -f $(RT28xx_RPATH)/os/linux/modules.order - rm -f $(RT28xx_RPATH)/chips/*.o - rm -f $(RT28xx_RPATH)/chips/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/rate_ctrl/*.o - rm -f $(RT28xx_RPATH)/rate_ctrl/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/ate/common/*.o - rm -f $(RT28xx_RPATH)/ate/common/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/ate/chips/*.o - rm -f $(RT28xx_RPATH)/ate/chips/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/phy/*.o - rm -f $(RT28xx_RPATH)/phy/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/mac/*.o - rm -f $(RT28xx_RPATH)/mac/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/mcu/*.o - rm -f $(RT28xx_RPATH)/mcu/.*.cmd .*.flags .*.d - rm -f $(RT28xx_EMBED_RPATH)/mcu/*.o - rm -f $(RT28xx_EMBED_RPATH)/mcu/.*.cmd .*.flags .*.d - rm -f $(RT28xx_EMBED_RPATH)/mgmt/*.o - rm -f $(RT28xx_EMBED_RPATH)/mgmt/.*.cmd .*.flags .*.d - rm -f $(RT28xx_EMBED_RPATH)/naf/*.o - rm -f $(RT28xx_EMBED_RPATH)/naf/.*.cmd .*.flags .*.d - rm -f $(RT28xx_EMBED_RPATH)/tx_rx/*.o - rm -f $(RT28xx_EMBED_RPATH)/tx_rx/.*.cmd .*.flags .*.d - rm -f $(RT28xx_EMBED_RPATH)/hif/*.o - rm -f $(RT28xx_EMBED_RPATH)/hif/.*.cmd .*.flags .*.d - rm -f $(RT28xx_EMBED_RPATH)/hw_ctrl/*.o - rm -f $(RT28xx_EMBED_RPATH)/hw_ctrl/.*.cmd .*.flags .*.d - rm -f $(RT28xx_EMBED_RPATH)/hw_ctrl/hdev/*.o - rm -f $(RT28xx_EMBED_RPATH)/hw_ctrl/hdev/.*.cmd - rm -f $(RT28xx_EMBED_RPATH)/security/*.o - rm -f $(RT28xx_EMBED_RPATH)/security/.*.cmd - rm -f $(RT28xx_EMBED_RPATH)/easy_setup/*.o - rm -f $(RT28xx_EMBED_RPATH)/easy_setup/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/hw_ctrl/*.o - rm -f $(RT28xx_RPATH)/hw_ctrl/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/mcu/*.o - rm -f $(RT28xx_RPATH)/mcu/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/os/linux/cfg80211/*.o - rm -f $(RT28xx_RPATH)/os/linux/cfg80211/.*.cmd .*.flags .*.d - rm -f $(RT28xx_RPATH)/txbf/*.o - rm -f $(RT28xx_RPATH)/txbf/.*.cmd .*.flags .*.d -ifeq ($(RT28xx_MODE),AP) - rm -f $(RT28xx_EMBED_RPATH)/ap/*.o - rm -f $(RT28xx_EMBED_RPATH)/ap/.*.cmd .*.flags .*.d -else -ifeq ($(RT28xx_MODE),STA) - rm -f $(RT28xx_EMBED_RPATH)/sta/*.o - rm -f $(RT28xx_EMBED_RPATH)/sta/.*.cmd .*.flags .*.d -ifeq ($(HAS_P2P_SUPPORT),y) - rm -f $(RT28xx_EMBED_RPATH)/ap/*.o - rm -f $(RT28xx_EMBED_RPATH)/ap/.*.cmd .*.flags .*.d -endif -ifeq ($(HAS_CFG80211_P2P_SUPPORT),y) - rm -f $(RT28xx_EMBED_RPATH)/ap/*.o - rm -f $(RT28xx_EMBED_RPATH)/ap/.*.cmd .*.flags .*.d -endif - -else -ifeq ($(RT28xx_MODE),APSTA) - rm -f $(RT28xx_EMBED_RPATH)/ap/*.o - rm -f $(RT28xx_EMBED_RPATH)/ap/.*.cmd .*.flags .*.d - rm -f $(RT28xx_EMBED_RPATH)/sta/*.o - rm -f $(RT28xx_EMBED_RPATH)/sta/.*.cmd .*.flags .*.d -endif -endif -endif - -# Declare the contents of the .PHONY variable as phony. We keep that -# information in a variable so we can use it in if_changed and friends. -.PHONY: $(PHONY) diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.libautoprovision.6 b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.libautoprovision.6 deleted file mode 100644 index e285006206..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.libautoprovision.6 +++ /dev/null @@ -1,9 +0,0 @@ -include $(RT28xx_DIR)/os/linux/config.mk - -#ifdef CONFIG_AP_SUPPORT - -ifeq ($(HAS_SAMSUNG_EASY_CONFIG_SUPPORT),y) -lib-y := ../../common/auto_provision.o -endif - -#endif // CONFIG_AP_SUPPORT // diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.mt_wifi_ap b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.mt_wifi_ap deleted file mode 100644 index fdbd4efd41..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.mt_wifi_ap +++ /dev/null @@ -1,1512 +0,0 @@ -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -WIFI_DRV_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))/.. -else -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -WIFI_DRV_PATH = drivers/net/wireless/mediatek -else -WIFI_DRV_PATH = drivers/net/wireless/mtk/mt7615e -endif -endif - -GLOBAL_DEFINES = include/uapi/linux/wapp -EXTRA_CFLAGS = -I$(WIFI_DRV_PATH)/mt_wifi/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/embedded/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/ate/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/include/mcu -I$(GLOBAL_DEFINES) - -DRV_NAME = mt_wifi -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -ifeq ($(CONFIG_CHIP_MT7622),y) -ifeq ($(CONFIG_MT76XX_COMBO_DUAL_DRIVER_SUPPORT),y) -DRV_NAME = mt7622_mt_wifi -EXTRA_CFLAGS += -Wframe-larger-than=4096 -endif -endif -endif - -SRC_DIR = ../mt_wifi -SRC_EMBEDDED_DIR = ../mt_wifi/embedded -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS += -DCONFIG_SUPPORT_OPENWRT -ifneq ($(CONFIG_RT_FIRST_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD=$(CONFIG_RT_FIRST_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_IF_RF_OFFSET=$(CONFIG_RT_FIRST_IF_RF_OFFSET) -endif -ifneq ($(CONFIG_RT_SECOND_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD=$(CONFIG_RT_SECOND_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_IF_RF_OFFSET=$(CONFIG_RT_SECOND_IF_RF_OFFSET) -endif -ifneq ($(CONFIG_RT_THIRD_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD=$(CONFIG_RT_THIRD_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_IF_RF_OFFSET=$(CONFIG_RT_THIRD_IF_RF_OFFSET) -endif -ifeq ($(CONFIG_FIRST_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_FIRST_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_FIRST_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"flash\"" -endif -endif -endif -ifeq ($(CONFIG_SECOND_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_SECOND_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_SECOND_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"flash\"" -endif -endif -endif -ifeq ($(CONFIG_THIRD_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_THIRD_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_THIRD_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD_EEPROM="\"flash\"" -endif -endif -endif -endif - -ifeq ($(CONFIG_FIRST_IF_EPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_FIRST_IF_EPAELNA -else -ifeq ($(CONFIG_FIRST_IF_IPAILNA),y) -EXTRA_CFLAGS += -DCONFIG_FIRST_IF_IPAILNA -else -ifeq ($(CONFIG_FIRST_IF_IPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_FIRST_IF_IPAELNA -endif -endif -endif -ifeq ($(CONFIG_SECOND_IF_EPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_SECOND_IF_EPAELNA -else -ifeq ($(CONFIG_SECOND_IF_IPAILNA),y) -EXTRA_CFLAGS += -DCONFIG_SECOND_IF_IPAILNA -else -ifeq ($(CONFIG_SECOND_IF_IPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_SECOND_IF_IPAELNA -endif -endif -endif -ifeq ($(CONFIG_THIRD_IF_EPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_THIRD_IF_EPAELNA -else -ifeq ($(CONFIG_THIRD_IF_IPAILNA),y) -EXTRA_CFLAGS += -DCONFIG_THIRD_IF_IPAILNA -else -ifeq ($(CONFIG_THIRD_IF_IPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_THIRD_IF_IPAELNA -endif -endif -endif - -#support built-in/ko for Openwrt/Linux SDK -obj-$(CONFIG_MT_AP_SUPPORT) += $(DRV_NAME).o - -ifeq ($(CONFIG_MTK_EMI_7622),y) -EXTRA_CFLAGS += -DCONFIG_ARCH_MT7622 -endif - -EXTRA_CFLAGS += -DWIFI_SYS_FW_V1 -EXTRA_CFLAGS += -DWIFI_SYS_FW_V2 -######################################################## -# Common files -# $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o\ -######################################################## -cmm_objs := $(SRC_EMBEDDED_DIR)/common/action.o\ - $(SRC_EMBEDDED_DIR)/common/ba_action.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/radio_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/omac_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wmm_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wtbl_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/hdev_basic.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v1.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v2.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_cmd.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_basic.o\ - $(SRC_DIR)/hw_ctrl/hw_init.o\ - $(SRC_EMBEDDED_DIR)/common/bcn.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_aes.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cfg.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cmd.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_data.o\ - $(SRC_EMBEDDED_DIR)/common/qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fq_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_fair_qm.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_profile.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_radar.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sync.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_info.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_notify.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_basic.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_phy.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_ht.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_vht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_basic.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_phy.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_vht.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sanity.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_sec.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_tkip.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wep.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wpa.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_aes.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_arc4.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_hmac.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_md5.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_sha2.o\ - $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/mlme.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_dev.o\ - $(SRC_EMBEDDED_DIR)/mgmt/bss_ops.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init_inf.o\ - $(SRC_EMBEDDED_DIR)/common/spectrum.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_timer.o\ - $(SRC_EMBEDDED_DIR)/common/rt_channel.o\ - $(SRC_EMBEDDED_DIR)/common/op_class.o\ - $(SRC_EMBEDDED_DIR)/common/rt_os_util.o\ - $(SRC_EMBEDDED_DIR)/common/scan.o\ - $(SRC_EMBEDDED_DIR)/common/sys_log.o\ - $(SRC_EMBEDDED_DIR)/common/txpower.o\ - $(SRC_EMBEDDED_DIR)/common/icap.o\ - $(SRC_EMBEDDED_DIR)/common/vendor.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info_element.o\ - $(SRC_DIR)/chips/rtmp_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_hw.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_entrytb.o\ - $(SRC_EMBEDDED_DIR)/common/wdev.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/tm.o\ - $(SRC_DIR)/txpwr/single_sku.o\ - $(SRC_EMBEDDED_DIR)/common/ra_ac_q_mgmt.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_rvr_dbg.o\ - $(SRC_DIR)/protocol/protection.o\ - $(SRC_EMBEDDED_DIR)/common/misc_app.o - -EXTRA_CFLAGS += -DMULTI_PROFILE -cmm_objs += $(SRC_EMBEDDED_DIR)/common/multi_profile.o - -ifeq ($(CONFIG_DEFAULT_5G_PROFILE),y) -EXTRA_CFLAGS += -DDEFAULT_5G_PROFILE -endif - -ifeq ($(CONFIG_MLME_MULTI_QUEUE_SUPPORT),y) -EXTRA_CFLAGS += -DMLME_MULTI_QUEUE_SUPPORT -endif - -######################################################## -# Coex related files -######################################################## -ifeq ($(CONFIG_COEX_SUPPORT),y) - EXTRA_CFLAGS += -DCOEX_SUPPORT - - cmm_objs += $(SRC_EMBEDDED_DIR)/mcu/bt_coex.o -endif -######################################################## -# Rate adaptation related files -######################################################## -rate_objs := $(SRC_DIR)/rate_ctrl/ra_ctrl_mt.o\ - $(SRC_DIR)/rate_ctrl/ra_ctrl_mt_drv.o\ - $(SRC_DIR)/rate_ctrl/ra_wrapper_embedded.o\ - $(SRC_DIR)/rate_ctrl/ra_cfg.o - -#ifeq ($(CONFIG_NEW_RATE_ADAPT_SUPPORT),y) -# EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT -# rate_objs += $(SRC_DIR)/rate_ctrl/alg_grp_mt.o -# rate_objs += $(SRC_DIR)/rate_ctrl/ra_table.o -#endif - -ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -endif - -######################################################## -# ASIC related files -######################################################## -asic_objs := $(SRC_DIR)/phy/phy.o - -######################################################## -# Spec feature related files -######################################################## -spec_objs += $(SRC_EMBEDDED_DIR)/common/ps.o - -ifeq ($(CONFIG_UAPSD),y) - EXTRA_CFLAGS += -DUAPSD_SUPPORT -DUAPSD_DEBUG - spec_objs += $(SRC_EMBEDDED_DIR)/common/uapsd.o -endif - -ifeq ($(CONFIG_MT_MAC),y) - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_ps.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_io.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/txs.o -endif - -# WSC -ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_INCLUDED -DWSC_SINGLE_TRIGGER - - ifneq ($(CONFIG_USER_GOAHEAD_HTTPD),) - EXTRA_CFLAGS += -DSDK_GOAHEAD_HTTPD - endif - - ifneq ($(CONFIG_USER_LIGHTY),) - EXTRA_CFLAGS += -DSDK_USER_LIGHTY - endif - - ifneq ($(CONFIG_MT_AP_SUPPORT),) - EXTRA_CFLAGS += -DWSC_AP_SUPPORT - endif - - ifneq ($(CONFIG_MT_STA_SUPPORT),) - EXTRA_CFLAGS += -DWSC_STA_SUPPORT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_tlv.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_dh.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_ufd.o - - ifeq ($(CONFIG_WSC_V2_SUPPORT),y) - EXTRA_CFLAGS += -DWSC_V2_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc_v2.o - endif -endif - -# VHT -ifeq ($(CONFIG_DOT11_VHT_AC),y) - EXTRA_CFLAGS += -DDOT11_VHT_AC - spec_objs += $(SRC_EMBEDDED_DIR)/mgmt/mgmt_vht.o\ - $(SRC_EMBEDDED_DIR)/common/vht.o - # WFA VHT R2 PF - ifeq ($(CONFIG_WFA_VHT_R2_PF),y) - EXTRA_CFLAGS += -DWFA_VHT_R2_PF - endif -endif - -# DPP -ifeq ($(CONFIG_DPP_SUPPORT),y) -EXTRA_CFLAGS += -DCHANNEL_SWITCH_MONITOR_CONFIG -EXTRA_CFLAGS += -DDPP_SUPPORT -endif - - -# WAPI -ifeq ($(CONFIG_WAPI_SUPPORT),y) - EXTRA_CFLAGS += -DWAPI_SUPPORT - ifeq ($(CONFIG_RALINK_RT3052),y) - EXTRA_CFLAGS += -DSOFT_ENCRYPT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/security/wapi.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_sms4.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_crypt.o -endif - -# WPA3 -ifeq ($(CONFIG_WPA3_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11_SAE_SUPPORT -DDOT11_SUITEB_SUPPORT -DDOT11W_PMF_SUPPORT - EXTRA_CFLAGS += -DDOT11_SAE_OPENSSL_BN -DDOT11_SAE_PWD_ID_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/security/sae.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/bn_lib.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/ecc.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o - - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_SAE_SUPPORT - endif - -endif - -#To use mtk_dut daemon, so we need open DCONFIG_APSTA_MIXED_SUPPORT -EXTRA_CFLAGS += -DCONFIG_APSTA_MIXED_SUPPORT - -# OWE -ifeq ($(CONFIG_OWE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_OWE_SUPPORT -DDOT11W_PMF_SUPPORT - EXTRA_CFLAGS += -DDOT11_SAE_OPENSSL_BN - - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/bn_lib.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/ecc.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/owe.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o - - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_OWE_SUPPORT - endif - -endif - -# ACM -ifeq ($(CONFIG_WMM_ACM_SUPPORT),y) - EXTRA_CFLAGS += -DWMM_ACM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/acm_edca.o\ - $(SRC_EMBEDDED_DIR)/common/acm_comm.o\ - $(SRC_EMBEDDED_DIR)/common/acm_iocl.o -endif - -#PMF -ifeq ($(CONFIG_MT_MAC),y) -ifeq ($(CONFIG_DOT11W_PMF_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11W_PMF_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o -endif -endif - -# LLTD -ifeq ($(CONFIG_LLTD_SUPPORT),y) - EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -#RRM -ifeq ($(CONFIG_DOT11K_RRM_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11K_RRM_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DAPPLE_11K_IOT - spec_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o \ - $(SRC_EMBEDDED_DIR)/common/rrm.o \ - $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o -endif -#EXTRA_CFLAGS += -DHOSTAPD_11K_SUPPORT -# TPC -ifeq ($(CONFIG_TPC_SUPPORT),y) - EXTRA_CFLAGS += -DTPC_SUPPORT -endif - -# FTM -ifeq ($(CONFIG_FTM_SUPPORT),y) - EXTRA_CFLAGS += -DFTM_SUPPORT -DFTM_INITIATOR - EXTRA_CFLAGS += -DTMR_SUPPORT - EXTRA_CFLAGS += -DDOT11K_RRM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/ftm.o - spec_objs += $(SRC_DIR)/protocol/tmr.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o \ - $(SRC_EMBEDDED_DIR)/common/rrm.o \ - $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o -endif - -ifeq ($(CONFIG_PASSPOINT_R2),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -DCONFIG_HOTSPOT_R2 -DWAPP_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o\ - $(SRC_EMBEDDED_DIR)/common/gas.o\ - $(SRC_EMBEDDED_DIR)/common/hotspot.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_DSCP_QOS_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DDSCP_QOS_MAP_SUPPORT -endif - -ifeq ($(CONFIG_DSCP_PRI_SUPPORT),y) - EXTRA_CFLAGS += -DDSCP_PRI_SUPPORT -endif - -ifeq ($(CONFIG_MIN_PHY_RATE_SUPPORT),y) - EXTRA_CFLAGS += -DMIN_PHY_RATE_SUPPORT -endif - -ifeq ($(CONFIG_FAST_UP_RATE_SUPPORT),y) - EXTRA_CFLAGS += -DFAST_UP_RATE_SUPPORT -endif - -ifeq ($(CONFIG_WNM_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_DOT11V_WNM - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o -endif - -ifeq ($(CONFIG_INTERWORKING),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING - spec_objs += $(SRC_EMBEDDED_DIR)/common/gas.o -endif - -# MBO -ifeq ($(CONFIG_MBO_SUPPORT),y) - EXTRA_CFLAGS += -DMBO_SUPPORT -DWAPP_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/mbo.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_TRACE_TCP_PKT),y) - EXTRA_CFLAGS += -DTRACELOG_TCP_PKT -endif - -ifeq ($(CONFIG_BACKGROUND_SCAN_SUPPORT),y) - EXTRA_CFLAGS += -DBACKGROUND_SCAN_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/bgnd_scan.o -endif - -ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DMT_DFS_SUPPORT -DCUSTOMISE_RDD_THRESHOLD_SUPPORT -DRDM_FALSE_ALARM_DEBUG_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/cmm_rdm_mt.o -endif - -ifeq ($(CONFIG_WIFI_EAP_FEATURE),y) - EXTRA_CFLAGS += -DWIFI_EAP_FEATURE -endif - -# FT -ifeq ($(CONFIG_DOT11R_FT_SUPPORT),y) -EXTRA_CFLAGS += -DDOT11R_FT_SUPPORT -dot11_ft_objs += $(SRC_EMBEDDED_DIR)/common/ft.o\ - $(SRC_EMBEDDED_DIR)/common/ft_tlv.o\ - $(SRC_EMBEDDED_DIR)/common/ft_iocl.o\ - $(SRC_EMBEDDED_DIR)/common/ft_rc.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_ftkd.o -## Preserve R1KH during Radio ON/OFF -ifeq ($(CONFIG_MBO_SUPPORT),y) -EXTRA_CFLAGS += -DFT_R1KH_KEEP -endif -endif - - -#VLAN -ifeq ($(CONFIG_VLAN_SUPPORT),y) - EXTRA_CFLAGS += -DVLAN_SUPPORT -endif - -#SNIFFER -ifeq ($(CONFIG_SNIFFER_SUPPORT),y) - EXTRA_CFLAGS += -DSNIFFER_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/sniffer_radiotap.o\ - $(SRC_EMBEDDED_DIR)/common/sniffer_prism.o -endif - -#EAP-Antenna Control -ifeq ($(CONFIG_ANTENNA_CONTROL_SUPPORT),y) -EXTRA_CFLAGS += -DANTENNA_CONTROL_SUPPORT -endif - -#EAP-Mgmt TxPower Control -ifeq ($(CONFIG_MGMT_TXPWR_CTRL),y) -EXTRA_CFLAGS += -DMGMT_TXPWR_CTRL -endif - -#EAP-Channel Utilization Support -ifeq ($(CONFIG_CHUTIL_SUPPORT),y) -EXTRA_CFLAGS += -DCHUTIL_SUPPORT -endif - -#EAP-Noise Floor Support -ifeq ($(CONFIG_NF_SUPPORT),y) -EXTRA_CFLAGS += -DNF_SUPPORT -endif - -#EAP-TXRX Statsitics -ifeq ($(CONFIG_TXRX_STAT_SUPPORT),y) -EXTRA_CFLAGS += -DTXRX_STAT_SUPPORT -endif - -#EAP-RA Phy rate support -ifeq ($(CONFIG_RA_PHY_RATE_SUPPORT),y) -EXTRA_CFLAGS += -DCONFIG_RA_PHY_RATE_SUPPORT -endif - -#EAP-AMPDU Config retry & agglimitSupport -ifeq ($(CONFIG_AMPDU_CONF_SUPPORT),y) -EXTRA_CFLAGS += -DAMPDU_CONF_SUPPORT -endif - -#EAP-ACK CTS Timeout cck & ofdm Support -ifeq ($(CONFIG_ACK_CTS_TIMEOUT_SUPPORT),y) -EXTRA_CFLAGS += -DACK_CTS_TIMEOUT_SUPPORT -endif - -#VENDOR_FEATURE11 -ifeq ($(CONFIG_VENDOR_FEATURE11_SUPPORT),y) -EXTRA_CFLAGS += -DVENDOR_FEATURE11_SUPPORT -DTXRX_STAT_SUPPORT -endif - -#HOSTAPD_MAP_SUPPORT -ifeq ($(CONFIG_HOSTAPD_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DHOSTAPD_MAP_SUPPORT -endif - -#ENTERPRISE_AP -ifeq ($(CONFIG_ENTERPRISE_AP_SUPPORT),y) - EXTRA_CFLAGS += -DHOSTAPD_11R_SUPPORT - EXTRA_CFLAGS += -DMBSS_DTIM_SUPPORT - EXTRA_CFLAGS += -DEAP_STATS_SUPPORT - - ifeq ($(CONFIG_RADIUS_MAC_AUTH_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_MAC_AUTH_SUPPORT - endif - ifeq ($(CONFIG_DYNAMIC_VLAN_SUPPORT),y) - EXTRA_CFLAGS += -DDYNAMIC_VLAN_SUPPORT - endif - -endif - -#CFG -ifeq ($(CONFIG_CFG80211_SUPPORT),y) - EXTRA_CFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST - #WPA3 SUPPORT - ifneq ($(CONFIG_HOSTAPD_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DHOSTAPD_SAE_SUPPORT -DHOSTAPD_OWE_SUPPORT -DHOSTAPD_SUITEB_SUPPORT - endif - ifeq ($(CONFIG_CUSTOMISED_HOSTAPD_SUPPORT),y) - EXTRA_CFLAGS += -DDISABLE_HOSTAPD_BEACON -DDISABLE_HOSTAPD_PROBE_RESP -DHOSTAPD_AUTO_CH_SUPPORT - endif - ifeq ($(CONFIG_WDS_STA_SUPPORT),y) - ifneq ($(CONFIG_HOSTAPD_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_AS_WDS_STA_SUPPORT - endif - endif - ifeq ($(CONFIG_APCLI_STA_SUPPORT),y) - ifneq ($(CONFIG_HOSTAPD_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_CFG80211_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_apcli.o - endif - endif - spec_objs += $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_scan.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_rx.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_tx.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_inf.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_ap.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211drv.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_util.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211.o - -endif - -ifeq ($(CONFIG_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DA4_CONN -DROUTING_TAB_SUPPORT -DWAPP_SUPPORT -DCONFIG_MAP_SUPPORT -DOFFCHANNEL_SCAN_FEATURE -DCONFIG_11KV_API_SUPPORT -ifeq ($(CONFIG_MAP_R2_VER_SUPPORT),y) - EXTRA_CFLAGS += -DMAP_R2 -DMAP_TS_TRAFFIC_SUPPORT -endif - spec_objs += $(SRC_EMBEDDED_DIR)/common/map.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/a4_conn.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/routing_tab.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_RALINK_TIMER_WDG),y) - EXTRA_CFLAGS += -DSDK_TIMER_WDG -endif - -ifeq ($(CONFIG_OFFCHANNEL_SCAN_FEATURE),y) - EXTRA_CFLAGS += -DOFFCHANNEL_SCAN_FEATURE -endif - -ifeq ($(CONFIG_VENDOR_FEATURE10_SUPPORT),y) - EXTRA_CFLAGS += -DFOLLOW_HIDDEN_SSID_FEATURE - EXTRA_CFLAGS += -DCONVERTER_MODE_SWITCH_SUPPORT - ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DDFS_VENDOR10_CUSTOM_FEATURE - endif - ifeq ($(CONFIG_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_BCAST_RATE_SET_SUPPORT - endif - ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_TVM_SUPPORT - endif - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DVENDOR10_CUSTOM_RSSI_FEATURE - EXTRA_CFLAGS += -DBW_VENDOR10_CUSTOM_FEATURE - endif -endif - -ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DONDEMAND_DFS -endif - -ifeq ($(CONFIG_MTK_WD_KICKER),y) - ifeq ($(CONFIG_MTK_WD_KICKER_WCN),y) - EXTRA_CFLAGS += -DSDK_TIMER_WDG - endif -endif - -#ACL_BLK_CONUT -#EXTRA_CFLAGS += -DACL_BLK_COUNT_SUPPORT - -#RATE_PRIOR_SUPPORT -#EXTRA_CFLAGS += -DRATE_PRIOR_SUPPORT - -# -# Common Feature related files -# -func_objs := - -ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT - - func_objs += $(SRC_EMBEDDED_DIR)/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_BLOCK_NET_IF),y) - EXTRA_CFLAGS += -DBLOCK_NET_IF - - func_objs += $(SRC_EMBEDDED_DIR)/common/netif_block.o -endif - -ifeq ($(CONFIG_SINGLE_SKU),y) - EXTRA_CFLAGS += -DSINGLE_SKU - ifeq ($(CONFIG_RALINK_RT6352),y) - EXTRA_CFLAGS += -DSINGLE_SKU_V2 - endif -endif - -ifeq ($(CONFIG_SMART_CARRIER_SENSE_SUPPORT),y) - EXTRA_CFLAGS += -DSMART_CARRIER_SENSE_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/scs.o -endif - -######################################################## -# AP feature related files -######################################################## -ap_objs := $(SRC_EMBEDDED_DIR)/ap/ap.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_assoc.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_auth.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_mlme.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sanity.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sync.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_wpa.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sec.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_data.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_autoChSel.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_qload.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_cfg.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_nps.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_vow.o\ - $(SRC_DIR)/os/linux/ap_ioctl.o - -ifeq ($(CONFIG_MBSS_SUPPORT),y) - EXTRA_CFLAGS += -DMBSS_SUPPORT - - ifeq ($(CONFIG_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DNEW_MBSSID_MODE - ifeq ($(CONFIG_ENHANCE_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DENHANCE_NEW_MBSSID_MODE - endif - endif - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mbss.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_mbss_inf.o - -ifeq ($(CONFIG_MBSS_AS_WDS_AP_SUPPORT),y) -EXTRA_CFLAGS += -DMBSS_AS_WDS_AP_SUPPORT -EXTRA_CFLAGS += -DCLIENT_WDS -ap_objs += $(SRC_EMBEDDED_DIR)/common/client_wds.o -endif -endif - - -ifeq ($(CONFIG_WDS_SUPPORT),y) - EXTRA_CFLAGS += -DWDS_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_wds.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_wds_inf.o\ - $(SRC_EMBEDDED_DIR)/common/client_wds.o -endif - -ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DMULTI_APCLI_SUPPORT -DAPCLI_AUTO_CONNECT_SUPPORT -DAPCLI_AUTO_BW_TMP - #EXTRA_CFLAGS += -DAPCLI_CERT_SUPPORT -DAPCLI_CONNECTION_TRIAL - EXTRA_CFLAGS += -DDHCP_UC_SUPPORT - EXTRA_CFLAGS += -DFAST_EAPOL_WAR - EXTRA_CFLAGS += -DBT_APCLI_SUPPORT - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_apcli.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_apcli_inf.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_assoc.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_auth.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_ctrl.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_sync.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_iparp.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_pppoe.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_ipv6.o - - ifeq ($(CONFIG_APCLI_CERT_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_CERT_SUPPORT - endif - - ifeq ($(CONFIG_MAC_REPEATER_SUPPORT),y) - EXTRA_CFLAGS += -DMAC_REPEATER_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_repeater.o - endif - -endif - -ifeq ($(CONFIG_IDS_SUPPORT),y) - EXTRA_CFLAGS += -DIDS_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_ids.o -endif - -ifeq ($(CONFIG_NINTENDO_AP),y) - EXTRA_CFLAGS += -DNINTENDO_AP - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_nintendo.o -endif - -#ifeq ($(CONFIG_COC_SUPPORT),y) -# EXTRA_CFLAGS += -DGREENAP_SUPPORT -DCOC_SUPPORT -# -# ap_objs += $(SRC_DIR)/../hw_ctrl/greenap.o -#endif - -ifeq ($(CONFIG_GREENAP_SUPPORT),y) - EXTRA_CFLAGS += -DGREENAP_SUPPORT - - ap_objs += $(SRC_DIR)/hw_ctrl/greenap.o -endif - -ifeq ($(CONFIG_PCIE_ASPM_DYM_CTRL_SUPPORT),y) - EXTRA_CFLAGS += -DPCIE_ASPM_DYM_CTRL_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW -DCONFIG_HW_HAL_OFFLOAD #-DCSD_VERIFICATION -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_ICAP_SUPPORT),y) - EXTRA_CFLAGS += -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_SPECTRUM_SUPPORT),y) - EXTRA_CFLAGS += -DWIFI_SPECTRUM_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT),y) - EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -endif - -ifeq ($(CONFIG_PRE_CAL_TRX_SET1_SUPPORT),y) - EXTRA_CFLAGS += -DPRE_CAL_TRX_SET1_SUPPORT -endif - -ifeq ($(CONFIG_RLM_CAL_CACHE_SUPPORT),y) - EXTRA_CFLAGS += -DRLM_CAL_CACHE_SUPPORT -endif - -ifeq ($(CONFIG_PRE_CAL_TRX_SET2_SUPPORT),y) - EXTRA_CFLAGS += -DPRE_CAL_TRX_SET2_SUPPORT -endif - -ifeq ($(CONFIG_CAL_BIN_FILE_SUPPORT),y) - EXTRA_CFLAGS += -DCAL_BIN_FILE_SUPPORT -endif - -ifeq ($(CONFIG_RF_LOCKDOWN_SUPPORT),y) - EXTRA_CFLAGS += -DRF_LOCKDOWN -endif - -ifeq ($(CONFIG_LINK_TEST_SUPPORT),y) - EXTRA_CFLAGS += -DLINK_TEST_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_TEMPERATURE_TX_ALC),y) - EXTRA_CFLAGS += -DRTMP_TEMPERATURE_TX_ALC -endif - -ifeq ($(CONFIG_TXBF_SUPPORT),y) - EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DTXBF_SUPPORT -DVHT_TXBF_SUPPORT - ap_objs += $(SRC_DIR)/txbf/cmm_txbf_mt.o\ - $(SRC_DIR)/txbf/cmm_txbf_cal_mt.o\ - $(SRC_DIR)/txbf/txbf_wrapper_embedded.o -endif - -ifeq ($(CONFIG_MUMIMO_SUPPORT),y) - EXTRA_CFLAGS += -DCFG_SUPPORT_MU_MIMO - ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mumimo.o -endif - -ifeq ($(CONFIG_MU_RA_SUPPORT),y) - EXTRA_CFLAGS += -DCFG_SUPPORT_MU_MIMO_RA - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mura.o -endif - -ifeq ($(CONFIG_CON_WPS_SUPPORT), y) - EXTRA_CFLAGS += -DCON_WPS -DCON_WPS_AP_SAME_UUID -endif - -ifeq ($(CONFIG_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(CONFIG_AIRPLAY_SUPPORT),y) - EXTRA_CFLAGS += -DAIRPLAY_SUPPORT -endif - -ifeq ($(CONFIG_BAND_STEERING),y) - EXTRA_CFLAGS += -DBAND_STEERING - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_band_steering.o -endif - -ifeq ($(CONFIG_AIR_MONITOR),y) - EXTRA_CFLAGS += -DAIR_MONITOR -endif - -ifeq ($(CONFIG_EASY_SETUP_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/easy_setup/ez_cmm.o -endif - -ifeq ($(CONFIG_MWDS),y) - ap_objs += $(SRC_EMBEDDED_DIR)/common/mwds.o - ap_objs += $(SRC_EMBEDDED_DIR)/common/a4_conn.o - ap_objs += $(SRC_EMBEDDED_DIR)/common/routing_tab.o -endif - -ifeq ($(CONFIG_EVENT_NOTIFIER_SUPPORT),y) - ap_objs += $(SRC_EMBEDDED_DIR)/common/event_notifier.o -endif - -ifeq ($(CONFIG_VOW_SUPPORT),y) - EXTRA_CFLAGS += -DVOW_SUPPORT -endif - -ifeq ($(CONFIG_RED_SUPPORT),y) - EXTRA_CFLAGS += -DRED_SUPPORT -endif - -ifeq ($(CONFIG_FQ_SCH_SUPPORT),y) - EXTRA_CFLAGS += -DFQ_SCH_SUPPORT -endif - -#EXTRA_CFLAGS += -DCHANNEL_SWITCH_MONITOR_CONFIG -#ccflags-y += -DACS_CTCC_SUPPORT -######################################################## -# Linux system related files -######################################################## -os_objs := $(SRC_DIR)/os/linux/rt_proc.o\ - $(SRC_DIR)/os/linux/rt_linux.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/rt_main_dev.o - -ifeq ($(CONFIG_WLAN_HOOK),y) - EXTRA_CFLAGS +=-DRTMP_WLAN_HOOK_SUPPORT - os_objs += $(SRC_DIR)/os/linux/rt_txrx_hook.o -endif - -ifeq ($(CONFIG_MULTI_INF_SUPPORT),y) - EXTRA_CFLAGS += -DMULTI_INF_SUPPORT - os_objs += $(SRC_DIR)/os/linux/multi_main_dev.o -endif - -ifeq ($(CONFIG_WIFI_WORK_QUEUE_BH),y) - EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - -ifeq ($(CONFIG_LINUX_NET_TXQ_SUPPORT),y) -EXTRA_CFLAGS += -DLINUX_NET_TXQ_SUPPORT -endif - -######################################################## -# chip related files -######################################################## -ifeq ($(CONFIG_FIRST_IF_MT7628),y) -EXTRA_CFLAGS += -DMT7628 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -DDMA_SCH_SUPPORT -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DUSE_BMC -DTHERMAL_PROTECT_SUPPORT -DCAL_FREE_IC_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7628.o\ - $(SRC_DIR)/chips/mt7628_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_DIR)/mcu/mcu.o\ - $(SRC_DIR)/mcu/andes_core.o\ - $(SRC_DIR)/mcu/andes_mt.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rbus_main_dev.o -endif - - -ifeq ($(CONFIG_SECOND_IF_MT7637E),y) -EXTRA_CFLAGS += -DMT7637 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -DDMA_SCH_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTAR_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -# -DCUT_THROUGH -#EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -#EXTRA_CFLAGS += -DNEED_ROM_PATCH -#EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7637.o\ - $(SRC_DIR)/chips/mt7637_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_DBDC_MODE),y) -EXTRA_CFLAGS += -DDBDC_MODE -endif - -ifeq ($(CONFIG_G_BAND_256QAM_SUPPORT),y) -EXTRA_CFLAGS += -DG_BAND_256QAM -ifeq ($(CONFIG_BRCM_256QAM_SUPPORT),y) -EXTRA_CFLAGS += -DBRCM_256QAM -endif -endif - -ifeq ($(CONFIG_CHIP_MT7615E),y) -EXTRA_CFLAGS += -DMT7615 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -#EXTRA_CFLAGS += -DNEIGHBORING_AP_STAT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DERR_RECOVERY -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DTXPWRMANUAL -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -EXTRA_CFLAGS += -DSINGLE_SKU_V2 -EXTRA_CFLAGS += -DTX_POWER_CONTROL_SUPPORT -EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -EXTRA_CFLAGS += -DRX_SCATTER -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_TX_DELAY -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -EXTRA_CFLAGS += -DPRE_CAL_TRX_SET1_SUPPORT -EXTRA_CFLAGS += -DRLM_CAL_CACHE_SUPPORT -EXTRA_CFLAGS += -DPRE_CAL_TRX_SET2_SUPPORT -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -CONFIG_PROPRIETARY_DRIVER=y -ifeq ($(CONFIG_PROPRIETARY_DRIVER),y) -EXTRA_CFLAGS += -DCONFIG_PROPRIETARY_DRIVER -CONFIG_PLATFORM_DRV_SUPPORT=n -else -CONFIG_PLATFORM_DRV_SUPPORT=y -endif -endif - -ifeq ($(CONFIG_CUSTOMER_VENDOR_IE_SUPPORT),y) - EXTRA_CFLAGS += -DCUSTOMER_VENDOR_IE_SUPPORT -endif - -CONFIG_OCE_SUPPORT=y -# OCE -ifeq ($(CONFIG_OCE_SUPPORT),y) -EXTRA_CFLAGS += -DOCE_SUPPORT -DOCE_FILS_SUPPORT -func_objs += $(SRC_EMBEDDED_DIR)/common/oce_fils.o -func_objs += $(SRC_EMBEDDED_DIR)/common/oce.o -endif - -EXTRA_CFLAGS += -Wframe-larger-than=4096 -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) - EXTRA_CFLAGS += -DREDUCE_TCP_ACK_SUPPORT -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -ifeq ($(CONFIG_RADIUS_ACCOUNTING_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_ACCOUNTING_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -ifeq ($(CONFIG_FDB_SUPPORT),y) - EXTRA_CFLAGS += -DMT_FDB - chip_objs += $(SRC_DIR)/mcu/mt_fdb.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7615.o\ - $(SRC_DIR)/chips/mt7615_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_CHIP_MT7663E),y) -EXTRA_CFLAGS += -DMT7663 -DMT_BBP -DMT_RF -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DMT_DMAC -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -#EXTRA_CFLAGS += -DERR_RECOVERY -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -#EXTRA_CFLAGS += -DSINGLE_SKU_V2 -#EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -WFLAGS += -DCONFIG_FPGA_MODE -#EXTRA_CFLAGS += -DRX_SCATTER -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -EXTRA_CFLAGS += -DHW_TX_AMSDU_SUPPORT -#WFLAGS += -DCONFIG_CSO_SUPPORT -#WFLAGS += -DMSP_UTILITY - -#EXTRA_CFLAGS += -Wframe-larger-than=4096 -WFLAGS += -Werror - -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT - EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) - EXTRA_CFLAGS += -DREDUCE_TCP_ACK_SUPPORT -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -ifeq ($(CONFIG_RADIUS_ACCOUNTING_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_ACCOUNTING_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -ifeq ($(CONFIG_FDB_SUPPORT),y) - EXTRA_CFLAGS += -DMT_FDB - chip_objs += $(SRC_DIR)/mcu/mt_fdb.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7663.o\ - $(SRC_DIR)/chips/mt7663_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_FIRST_IF_MT7622),y) -EXTRA_CFLAGS += -DMT7622 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DMT_DMAC -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DERR_RECOVERY -EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -EXTRA_CFLAGS += -DTXPWRMANUAL -#EXTRA_CFLAGS += -DTMR_VERIFY -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DETSI_RX_BLOCKER_SUPPORT -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -EXTRA_CFLAGS += -DRX_SCATTER -#EXTRA_CFLAGS += -DCONFIG_FPGA_MODE -#EXTRA_CFLAGS += -DCONFIG_CSO_SUPPORT -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -#EXTRA_CFLAGS += -DMSP_UTILITY -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_TX_DELAY -EXTRA_CFLAGS += -DDBG_AMSDU -EXTRA_CFLAGS += -DPRE_CAL_MT7622_SUPPORT -EXTRA_CFLAGS += -DTXSTAT_2040BW_24G_SUPPORT -EXTRA_CFLAGS += -DTX_POWER_CONTROL_SUPPORT -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -CONFIG_PROPRIETARY_DRIVER=y - -ifeq ($(CONFIG_SINGLE_SKU),y) -EXTRA_CFLAGS += -DSINGLE_SKU_V2 -endif - -ifeq ($(CONFIG_PROPRIETARY_DRIVER),y) -EXTRA_CFLAGS += -DCONFIG_PROPRIETARY_DRIVER -CONFIG_PLATFORM_DRV_SUPPORT=n -else -CONFIG_PLATFORM_DRV_SUPPORT=y -endif - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPROT),y) -EXTRA_CFLAGS += -DPLATFORM_DRIVER_SUPPORT -endif - -EXTRA_CFLAGS += -Werror -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif -ifeq ($(CONFIG_VHT_TXBF_2G_EPIGRAM_IE_SUPPORT),y) - EXTRA_CFLAGS += -DVHT_TXBF_2G_EPIGRAM_IE -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -ifeq ($(CONFIG_VOW_SUPPORT),y) -ifeq ($(CONFIG_RED_SUPPORT),y) -EXTRA_CFLAGS += -DFQ_SCH_SUPPORT -endif -endif - -ifeq ($(CONFIG_MT76XX_COMBO_DUAL_DRIVER_SUPPORT),y) - EXTRA_CFLAGS += -DMT76XX_COMBO_DUAL_DRIVER_SUPPORT -endif - -chip_objs += $(SRC_DIR)/chips/mt7622.o\ - $(SRC_DIR)/chips/mt7622_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT)$(CONFIG_MTD),yy) -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -ifeq ($(CONFIG_MTD_SPI_NOR),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -else -ifeq ($(CONFIG_MTD_NAND),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif -endif -else -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -ifeq ($(CONFIG_MTD_SPI_NOR),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -else -ifeq ($(CONFIG_MTD_NAND),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif -endif -endif -endif -endif - -ifeq ($(CONFIG_DEFAULTS_MEDIATEK_MT7622),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPORT),y) -chip_objs += $(SRC_DIR)/os/linux/wbsys_main_dev.o -else -chip_objs += $(SRC_DIR)/os/linux/rbus_prop_dev.o -endif - -# -# Root -# - -$(DRV_NAME)-objs += $(ap_objs) $(cmm_objs) $(asic_objs) $(chip_objs) $(rate_objs)\ - $(spec_objs) $(func_objs) $(os_objs) $(dot11_ft_objs) - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_flash.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/hif_pci.o - -$(DRV_NAME)-objs += $(SRC_DIR)/os/linux/rt_pci_rbus.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_util.o\ - #$(SRC_DIR)/os/linux/rbus_main_dev.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_DIR)/ate/ate_agent.o\ - $(SRC_DIR)/ate/testmode_ioctl.o\ - $(SRC_DIR)/ate/mt_mac/mt_testmode.o\ - $(SRC_DIR)/ate/LoopBack.o -endif - - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_tcprack.o -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wstrict-prototypes -Wno-trigraphs -Wall -Wno-unused-but-set-variable - -EXTRA_CFLAGS += -DOLDSEC - -#-Werror -#-DDBG_DIAGNOSE -DDBG_RX_MCS -DDBG_TX_MCS - -EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DSCAN_SUPPORT -DAP_SCAN_SUPPORT -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -#EXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DCONFIG_RT2880_ATE_CMD_NEW - -ifeq ($(CONFIG_FAST_NAT_SUPPORT),y) -EXTRA_CFLAGS += -DCONFIG_FAST_NAT_SUPPORT -endif - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -#EXTRA_CFLAGS += -DDBG -endif -EXTRA_CFLAGS += -DDBG - -ifeq ($(CONFIG_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -ifeq ($(CONFIG_RALINK_MT7621),y) -EXTRA_CFLAGS += -DRACTRL_LIMIT_MAX_PHY_RATE=1300 -endif - -ifeq ($(CONFIG_FAST_NAT_SUPPORT),y) -ifeq ($(CONFIG_WLAN_HOOK),y) -ifeq ($(CONFIG_WHNAT_SUPPORT),y) -EXTRA_CFLAGS += -DWHNAT_SUPPORT -else -ifeq ($(CONFIG_WHNAT_SUPPORT),m) -EXTRA_CFLAGS += -DWHNAT_SUPPORT -endif -endif -endif -endif - -ifeq ($(CONFIG_EASY_SETUP_SUPPORT),y) -EXTRA_CFLAGS += -DWH_EZ_SETUP -EXTRA_CFLAGS += -DNEW_CONNECTION_ALGO -EXTRA_CFLAGS += -DEZ_NETWORK_MERGE_SUPPORT -EXTRA_CFLAGS += -DEZ_DUAL_BAND_SUPPORT -EXTRA_CFLAGS += -DEZ_ROAM_SUPPORT -EXTRA_CFLAGS += -DDUAL_CHIP -EXTRA_CFLAGS += -DEZ_API_SUPPORT -EXTRA_CFLAGS += -DEZ_PUSH_BW_SUPPORT -endif - -ifeq ($(CONFIG_MWDS),y) -EXTRA_CFLAGS += -DMWDS -DA4_CONN -DROUTING_TAB_SUPPORT -endif - -ifeq ($(CONFIG_EVENT_NOTIFIER_SUPPORT),y) -EXTRA_CFLAGS += -DWH_EVENT_NOTIFIER -endif - -#ifeq ($(CONFIG_WIFI_FWD_SUPPORT),y) -#EXTRA_CFLAGS += -DCONFIG_WIFI_PKT_FWD -#endif - -EXTRA_CFLAGS += -DMTFWD - -ifeq ($(CONFIG_ROAMING_ENHANCE_SUPPORT),y) -EXTRA_CFLAGS += -DROAMING_ENHANCE_SUPPORT -endif - -EXTRA_CFLAGS += -DIP_ASSEMBLY -EXTRA_CFLAGS += -DOUI_CHECK_SUPPORT -EXTRA_CFLAGS += -DHTC_DECRYPT_IOT - -EXTRA_CFLAGS += -Inet/nat -#EXTRA_CFLAGS += -DDBG_STARVATION -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS += -DMT_WIFI_MODULE -else -ifeq ($(CONFIG_MT_WIFI),m) -EXTRA_CFLAGS += -DMT_WIFI_MODULE -endif -endif - -MODULE_FLAGS=$(EXTRA_CFLAGS) -export MODULE_FLAGS -obj-m+=$(SRC_EMBEDDED_DIR)/plug_in/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.mt_wifi_sta b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.mt_wifi_sta deleted file mode 100644 index 3d40a108b5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.mt_wifi_sta +++ /dev/null @@ -1,790 +0,0 @@ -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -WIFI_DRV_PATH = drivers/net/wireless/mediatek -else -WIFI_DRV_PATH = drivers/net/wireless/mtk/mt7615e -endif - -EXTRA_CFLAGS = -I$(WIFI_DRV_PATH)/mt_wifi/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/embedded/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/ate/include - -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS = -I$(src)/../src/include \ - -I$(src)/../src/embedded/include \ - -I$(src)/../src/ate/include -DRV_NAME = mt7628 -SRC_DIR = ../src/embedded -obj-m += $(DRV_NAME).o -else -EXTRA_CFLAGS = -I$(WIFI_DRV_PATH)/mt_wifi/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/embedded/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/ate/include -DRV_NAME = mt_wifi -SRC_DIR = ../mt_wifi -SRC_EMBEDDED_DIR = ../mt_wifi/embedded -obj-$(CONFIG_MT_STA_SUPPORT) += $(DRV_NAME).o -endif - -ifeq ($(CONFIG_MTK_EMI_7622),y) -EXTRA_CFLAGS += -DCONFIG_ARCH_MT7622 -endif - -EXTRA_CFLAGS += -DWIFI_SYS_FW_V1 -EXTRA_CFLAGS += -DWIFI_SYS_FW_V2 - -######################################################## -# Common files -# $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o\ -######################################################## -cmm_objs := $(SRC_EMBEDDED_DIR)/common/action.o\ - $(SRC_EMBEDDED_DIR)/common/ba_action.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/radio_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/omac_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wmm_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wtbl_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/hdev_basic.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v1.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v2.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_cmd.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_basic.o\ - $(SRC_DIR)/hw_ctrl/hw_init.o\ - $(SRC_EMBEDDED_DIR)/common/bcn.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_aes.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cfg.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cmd.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_data.o\ - $(SRC_EMBEDDED_DIR)/common/qm.o\ - $(SRC_EMBEDDED_DIR)/common/fq_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_fair_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_qm.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_profile.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_radar.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sync.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_info.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_notify.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_basic.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_phy.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_ht.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_vht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_basic.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_phy.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_vht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/bss_ops.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sanity.o\ - $(SRC_EMBEDDED_DIR)/common/vendor.o\ - $(SRC_EMBEDDED_DIR)/security/sae.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_sec.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_tkip.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wep.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wpa.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_aes.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_arc4.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_hmac.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_md5.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_sha2.o\ - $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/mlme.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_dev.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init_inf.o\ - $(SRC_EMBEDDED_DIR)/common/spectrum.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_timer.o\ - $(SRC_EMBEDDED_DIR)/common/rt_channel.o\ - $(SRC_EMBEDDED_DIR)/common/op_class.o\ - $(SRC_EMBEDDED_DIR)/common/rt_os_util.o\ - $(SRC_EMBEDDED_DIR)/common/scan.o\ - $(SRC_EMBEDDED_DIR)/common/sys_log.o\ - $(SRC_EMBEDDED_DIR)/common/txpower.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info_element.o\ - $(SRC_DIR)/chips/rtmp_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_hw.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_entrytb.o\ - $(SRC_EMBEDDED_DIR)/common/wdev.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/tm.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_rvr_dbg.o\ - $(SRC_DIR)/protocol/protection.o\ - $(SRC_EMBEDDED_DIR)/common/misc_app.o - -######################################################## -# SAE files -######################################################## -ifeq ($(CONFIG_WPA3_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11_SAE_SUPPORT -DDOT11_SUITEB_SUPPORT -DDOT11W_PMF_SUPPORT - EXTRA_CFLAGS += -DDOT11_SAE_OPENSSL_BN - - cmm_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ - $(SRC_EMBEDDED_DIR)/security/bn_lib.o\ - $(SRC_EMBEDDED_DIR)/security/ecc.o\ - $(SRC_EMBEDDED_DIR)/security/sae.o\ - $(SRC_EMBEDDED_DIR)/security/pmf.o -endif - -######################################################## -# OWE related files -######################################################## -ifeq ($(CONFIG_OWE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_OWE_SUPPORT -DDOT11W_PMF_SUPPORT -DDOT11_SAE_OPENSSL_BN - - cmm_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ - $(SRC_EMBEDDED_DIR)/security/bn_lib.o\ - $(SRC_EMBEDDED_DIR)/security/ecc.o\ - $(SRC_EMBEDDED_DIR)/security/owe.o\ - $(SRC_EMBEDDED_DIR)/security/pmf.o - -endif - - -######################################################## -# Coex related files -######################################################## -ifeq ($(CONFIG_COEX_SUPPORT),y) - EXTRA_CFLAGS += -DCOEX_SUPPORT - - cmm_objs += $(SRC_EMBEDDED_DIR)/mcu/bt_coex.o -endif - -######################################################## -# Rate adaptation related files -######################################################## -rate_objs := $(SRC_DIR)/rate_ctrl/ra_ctrl_mt.o\ - $(SRC_DIR)/rate_ctrl/ra_ctrl_mt_drv.o\ - $(SRC_DIR)/rate_ctrl/ra_wrapper_embedded.o\ - $(SRC_DIR)/rate_ctrl/ra_cfg.o - -ifeq ($(CONFIG_NEW_RATE_ADAPT_SUPPORT),y) - EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT - rate_objs += $(SRC_DIR)/rate_ctrl/alg_grp_mt.o - rate_objs += $(SRC_DIR)/rate_ctrl/ra_table.o -endif - -ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -endif - -######################################################## -# ASIC related files -######################################################## -asic_objs := $(SRC_DIR)/phy/phy.o - -######################################################## -# Spec feature related files -######################################################## -spec_objs += $(SRC_EMBEDDED_DIR)/common/ps.o - -ifeq ($(CONFIG_UAPSD),y) - EXTRA_CFLAGS += -DUAPSD_SUPPORT -DUAPSD_DEBUG - spec_objs += $(SRC_EMBEDDED_DIR)/common/uapsd.o -endif - -ifeq ($(CONFIG_MT_MAC),y) - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_ps.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_io.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/txs.o -endif - -# WSC -ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_INCLUDED -#-DWSC_SINGLE_TRIGGER - - ifneq ($(CONFIG_MT_AP_SUPPORT),) - EXTRA_CFLAGS += -DWSC_AP_SUPPORT - endif - - ifneq ($(CONFIG_MT_STA_SUPPORT),) - EXTRA_CFLAGS += -DWSC_STA_SUPPORT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_tlv.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_dh.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ -# $(SRC_EMBEDDED_DIR)/common/wsc_ufd.o - - ifeq ($(CONFIG_WSC_V2_SUPPORT),y) - EXTRA_CFLAGS += -DWSC_V2_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc_v2.o - endif -endif - -# VHT -ifeq ($(CONFIG_DOT11_VHT_AC),y) - EXTRA_CFLAGS += -DDOT11_VHT_AC - spec_objs += $(SRC_EMBEDDED_DIR)/mgmt/mgmt_vht.o\ - $(SRC_EMBEDDED_DIR)/common/vht.o - # WFA VHT R2 PF - ifeq ($(CONFIG_WFA_VHT_R2_PF),y) - EXTRA_CFLAGS += -DWFA_VHT_R2_PF - endif -endif - -# WAPI -ifeq ($(CONFIG_WAPI_SUPPORT),y) - EXTRA_CFLAGS += -DWAPI_SUPPORT - ifeq ($(CONFIG_RALINK_RT3052),y) - EXTRA_CFLAGS += -DSOFT_ENCRYPT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/security/wapi.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_sms4.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_crypt.o - -endif - -# ACM -ifeq ($(CONFIG_WMM_ACM_SUPPORT),y) - EXTRA_CFLAGS += -DWMM_ACM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/acm_edca.o\ - $(SRC_EMBEDDED_DIR)/common/acm_comm.o\ - $(SRC_EMBEDDED_DIR)/common/acm_iocl.o -endif - -#PMF -ifeq ($(CONFIG_DOT11W_PMF_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11W_PMF_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o -endif - -# LLTD -ifeq ($(CONFIG_LLTD_SUPPORT),y) - EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -ifeq ($(CONFIG_PASSPOINT_R2),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -DCONFIG_HOTSPOT_R2 - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o\ - $(SRC_EMBEDDED_DIR)/common/gas.o\ - $(SRC_EMBEDDED_DIR)/common/hotspot.o -endif - -# FT -#ifeq ($(CONFIG_RT2860V2_80211R_FT),y) -#dot11_ft_objs += $(SRC_EMBEDDED_DIR)/common/ft.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_tlv.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_ioctl.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_rc.o\ -# $(SRC_EMBEDDED_DIR)/ap/ap_ftkd.o -#endif - -# RR -#ifeq ($(CONFIG_RT2860V2_80211K_RR),y) -#dot11k_rr_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o\ -# $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o\ -# $(SRC_EMBEDDED_DIR)/common/rrm.o -#endif -#SNIFFER -ifeq ($(CONFIG_SNIFFER_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_SNIFFER_SUPPORT - - spec_objs += $(MT_WIFI_DIR)/common/sniffer_radiotap.o\ - $(MT_WIFI_DIR)/common/sniffer_prism.o -endif - -#CFG -ifeq ($(CONFIG_CFG80211_SUPPORT),y) - EXTRA_CFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST -DWPA_SUPPLICANT_SUPPORT - - spec_objs += $(SRC_DIR)/os/linux/cfg80211/cfg80211_scan.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_rx.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_tx.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_inf.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_ap.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211drv.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_util.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211.o -endif - -# -# Common Feature related files -# -func_objs := - -ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT - - func_objs += $(SRC_EMBEDDED_DIR)/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_BLOCK_NET_IF),y) - EXTRA_CFLAGS += -DBLOCK_NET_IF - - func_objs += $(SRC_EMBEDDED_DIR)/common/netif_block.o -endif - -ifeq ($(CONFIG_SINGLE_SKU),y) - EXTRA_CFLAGS += -DSINGLE_SKU - ifeq ($(CONFIG_RALINK_RT6352),y) - EXTRA_CFLAGS += -DSINGLE_SKU_V2 - endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y) - EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT - - func_objs += $(SRC_EMBEDDED_DIR)/common/cmm_video.o -endif - - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT - ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_LED_SUPPORT - endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - - -######################################################## -# STA feature related files -######################################################## -sta_objs := \ - $(SRC_EMBEDDED_DIR)/sta/assoc.o\ - $(SRC_EMBEDDED_DIR)/sta/auth.o\ - $(SRC_EMBEDDED_DIR)/sta/auth_rsp.o\ - $(SRC_EMBEDDED_DIR)/sta/sync.o\ - $(SRC_EMBEDDED_DIR)/sta/sanity.o\ - $(SRC_EMBEDDED_DIR)/sta/sta_data.o\ - $(SRC_EMBEDDED_DIR)/sta/connect.o\ - $(SRC_EMBEDDED_DIR)/sta/sta_sec.o\ - $(SRC_EMBEDDED_DIR)/sta/wpa.o\ - $(SRC_EMBEDDED_DIR)/sta/sta_cfg.o\ - $(SRC_EMBEDDED_DIR)/sta/sta.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW -DCONFIG_HW_HAL_OFFLOAD #-DCSD_VERIFICATION -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_ICAP_SUPPORT),y) - EXTRA_CFLAGS += -DINTERNAL_CAPTURE_SUPPORT -endif - - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT),y) - EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_TEMPERATURE_TX_ALC),y) - EXTRA_CFLAGS += -DRTMP_TEMPERATURE_TX_ALC -endif - -ifeq ($(CONFIG_TXBF_SUPPORT),y) - EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DTXBF_SUPPORT -DVHT_TXBF_SUPPORT - sta_objs += $(SRC_DIR)/txbf/cmm_txbf_mt.o\ - $(SRC_DIR)/txbf/cmm_txbf_cal_mt.o\ - $(SRC_DIR)/txbf/txbf_wrapper_embedded.o -endif - -ifeq ($(CONFIG_CON_WPS_SUPPORT), y) - EXTRA_CFLAGS += -DCON_WPS -DCON_WPS_AP_SAME_UUID -endif - -ifeq ($(CONFIG_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DDFS_SUPPORT - EXTRA_CFLAGS += -DDFS_ATP_SUPPORT - ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_dfs.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_CARRIER),y) - EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_cs.o -endif - -ifeq ($(CONFIG_RT2860V2_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(CONFIG_AIRPLAY_SUPPORT),y) - EXTRA_CFLAGS += -DAIRPLAY_SUPPORT -endif - -ifeq ($(CONFIG_ETH_CONVERT_SUPPORT),y) - EXTRA_CFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT - sta_objs += $(SRC_EMBEDDED_DIR)/common/cmm_mat.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_iparp.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_pppoe.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_ipv6.o -endif - -######################################################## -# Linux system related files -######################################################## -os_objs := $(SRC_DIR)/os/linux/rt_proc.o\ - $(SRC_DIR)/os/linux/rt_linux.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/rt_txrx_hook.o\ - $(SRC_DIR)/os/linux/rt_main_dev.o\ - $(SRC_DIR)/os/linux/sta_ioctl.o\ - -ifeq ($(CONFIG_MULTI_INF_SUPPORT),y) - EXTRA_CFLAGS += -DMULTI_INF_SUPPORT - - os_objs += $(SRC_DIR)/os/linux/multi_main_dev.o -endif - -ifeq ($(CONFIG_WIFI_WORK_QUEUE_BH),y) - EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - - -######################################################## -# chip related files -######################################################## -ifeq ($(CONFIG_FIRST_IF_MT7628),y) -EXTRA_CFLAGS += -DMT7628 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -DDMA_SCH_SUPPORT -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DUSE_BMC -DTHERMAL_PROTECT_SUPPORT -DCAL_FREE_IC_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7628.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_DIR)/mcu/mcu.o\ - $(SRC_DIR)/mcu/andes_core.o\ - $(SRC_DIR)/mcu/andes_mt.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rbus_main_dev.o -endif - - -ifeq ($(CONFIG_SECOND_IF_MT7637E),y) -EXTRA_CFLAGS += -DMT7637 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -DDMA_SCH_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -# -DCUT_THROUGH -#EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -#EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7637.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - - -ifeq ($(CONFIG_CHIP_MT7615E),y) -EXTRA_CFLAGS += -DMT7615 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DRX_SCATTER -ifeq ($(CONFIG_G_BAND_256QAM_SUPPORT), y) -EXTRA_CFLAGS += -DG_BAND_256QAM -ifeq ($(CONFIG_BRCM_256QAM_SUPPORT), y) -EXTRA_CFLAGS += -DBRCM_256QAM -endif -endif -EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT -EXTRA_CFLAGS += -DCONFIG_KEEP_ALIVE_OFFLOAD -DSTA_LP_PHASE_2_SUPPORT -DCONFIG_PM_BIT_HW_MODE -EXTRA_CFLAGS += -DMT_WOW_SUPPORT -DCONFIG_PM -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7615.o\ - $(SRC_DIR)/chips/mt7615_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - - -ifeq ($(CONFIG_FIRST_IF_MT7622),y) -EXTRA_CFLAGS += -DMT7622 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DMT_DMAC -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DCONFIG_KEEP_ALIVE_OFFLOAD -DSTA_LP_PHASE_2_SUPPORT -DCONFIG_PM_BIT_HW_MODE -EXTRA_CFLAGS += -DMT_WOW_SUPPORT -DCONFIG_PM -DHOST_RESUME_DONE_ACK_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -#EXTRA_CFLAGS += -DCONFIG_FPGA_MODE -#EXTRA_CFLAGS += -DMT7622_FPGA -#EXTRA_CFLAGS += -DCONFIG_CSO_SUPPORT -#EXTRA_CFLAGS += -DMSP_UTILITY -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -CONFIG_PROPRIETART_DRIVER=n - -ifeq ($(CONFIG_PLOPRIETART_DRIVER),y) -EXTRA_CFLAGS += -DCONFIG_PROPRIETARY_DRIVER -CONFIG_PLATFORM_DRV_SUPPORT=n -else -CONFIG_PLATFORM_DRV_SUPPORT=y -endif - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPROT),y) -EXTRA_CFLAGS += -DPLATFORM_DRIVER_SUPPORT -endif - -EXTRA_CFLAGS += -Werror -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7622.o\ - $(SRC_DIR)/chips/mt7622_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT)$(CONFIG_MTD),yy) -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -ifeq ($(CONFIG_MTD_SPI_NOR),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -else -ifeq ($(CONFIG_MTD_NAND),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif -endif -endif -endif - -ifeq ($(CONFIG_DEFAULTS_MEDIATEK_MT7622),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif - - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPORT),y) -chip_objs += $(SRC_DIR)/os/linux/wbsys_main_dev.o -else -chip_objs += $(SRC_DIR)/os/linux/rbus_prop_dev.o -endif - -# -# Root -# - -$(DRV_NAME)-objs += $(sta_objs) $(cmm_objs) $(asic_objs) $(chip_objs) $(rate_objs)\ - $(spec_objs) $(func_objs) $(os_objs) - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_flash.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/hif_pci.o - -$(DRV_NAME)-objs += $(SRC_DIR)/os/linux/rt_pci_rbus.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_util.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_DIR)/ate/ate_agent.o\ - $(SRC_DIR)/ate/testmode_ioctl.o\ - $(SRC_DIR)/ate/mt_mac/mt_testmode.o\ - $(SRC_DIR)/ate/LoopBack.o -endif - - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wstrict-prototypes -Wno-trigraphs -Wall -Wno-unused-but-set-variable - -#-Werror -#-DDBG_DIAGNOSE -DDBG_RX_MCS -DDBG_TX_MCS - -EXTRA_CFLAGS += -DCONFIG_STA_SUPPORT -DSCAN_SUPPORT -DDBG -#-DCONFIG_AP_SUPPORT -DSCAN_SUPPORT -DAP_SCAN_SUPPORT -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -# -DIAPP_SUPPORT -DDOT1X_SUPPORT -#EXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DCONFIG_RT2880_ATE_CMD_NEW -ifneq ($(CONFIG_RA_HW_NAT_WIFI_NEW_ARCH),y) -EXTRA_CFLAGS += -DCONFIG_RA_NAT_NONE -endif - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_RT2860V2_AUTO_CH_SELECT_ENCANCE),y) -EXTRA_CFLAGS += -DAUTO_CH_SELECT_ENHANCE -endif - -ifeq ($(CONFIG_RT2860V2_SNMP),y) -EXTRA_CFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_32B_DESC),y) -EXTRA_CFLAGS += -DDESC_32B_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_HW_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y) -EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(CONFIG_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -#EXTRA_CFLAGS += -DDBG -endif -EXTRA_CFLAGS += -DDBG - -ifeq ($(CONFIG_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -ifeq ($(CONFIG_SUPPORT_DYNAMIC_TXOP),y) -EXTRA_CFLAGS += -DTXOP_ARBITER -endif - -ifeq ($(CONFIG_RALINK_MT7621),y) -EXTRA_CFLAGS += -DRACTRL_LIMIT_MAX_PHY_RATE=1300 -endif - -EXTRA_CFLAGS += -DIP_ASSEMBLY -EXTRA_CFLAGS += -Inet/nat - -MODULE_FLAGS=$(EXTRA_CFLAGS) -export MODULE_FLAGS -obj-m+=$(SRC_EMBEDDED_DIR)/plug_in/ - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_ap b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_ap deleted file mode 100644 index ed96a99e61..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_ap +++ /dev/null @@ -1,648 +0,0 @@ -EXTRA_CFLAGS = -Idrivers/net/wireless/rlt_wifi/include \ - -Idrivers/net/wireless/rlt_wifi/ate/include - -DRV_NAME = rlt_wifi -RT_WIFI_DIR = ../rlt_wifi - -######################################################## -# Common files -######################################################## -cmm_objs := $(RT_WIFI_DIR)/security/crypt_md5.o\ - $(RT_WIFI_DIR)/security/crypt_sha2.o\ - $(RT_WIFI_DIR)/security/crypt_hmac.o\ - $(RT_WIFI_DIR)/security/crypt_aes.o\ - $(RT_WIFI_DIR)/security/crypt_arc4.o\ - $(RT_WIFI_DIR)/security/cmm_wep.o\ - $(RT_WIFI_DIR)/security/cmm_wpa.o\ - $(RT_WIFI_DIR)/security/cmm_tkip.o\ - $(RT_WIFI_DIR)/security/cmm_aes.o\ - $(RT_WIFI_DIR)/common/mlme.o\ - $(RT_WIFI_DIR)/common/action.o\ - $(RT_WIFI_DIR)/common/ba_action.o\ - $(RT_WIFI_DIR)/common/cmm_data.o\ - $(RT_WIFI_DIR)/common/cmm_sync.o\ - $(RT_WIFI_DIR)/common/wifi_sys_info.o\ - $(RT_WIFI_DIR)/common/cmm_sanity.o\ - $(RT_WIFI_DIR)/common/cmm_info.o\ - $(RT_WIFI_DIR)/common/cmm_cfg.o\ - $(RT_WIFI_DIR)/common/rtmp_init.o\ - $(RT_WIFI_DIR)/common/rtmp_init_inf.o\ - $(RT_WIFI_DIR)/common/cmm_profile.o\ - $(RT_WIFI_DIR)/common/cmm_asic.o\ - $(RT_WIFI_DIR)/common/cmm_cmd.o\ - $(RT_WIFI_DIR)/common/rtmp_timer.o\ - $(RT_WIFI_DIR)/common/rt_channel.o\ - $(RT_WIFI_DIR)/common/rt_os_util.o\ - $(RT_WIFI_DIR)/chips/rtmp_chip.o\ - $(RT_WIFI_DIR)/common/cmm_radar.o\ - $(RT_WIFI_DIR)/common/spectrum.o\ - $(RT_WIFI_DIR)/common/txpower.o\ - $(RT_WIFI_DIR)/common/scan.o\ - $(RT_WIFI_DIR)/tx_rx/wdev_tx.o\ - $(RT_WIFI_DIR)/mgmt/mgmt_entrytb.o\ - $(RT_WIFI_DIR)/mgmt/mgmt_ht.o\ - $(RT_WIFI_DIR)/mac/rtmp_mac.o\ - $(RT_WIFI_DIR)/mcu/mcu.o - -######################################################## -# Rate adaptation related files -######################################################## -rate_objs := $(RT_WIFI_DIR)/rate_ctrl/ra_ctrl.o\ - $(RT_WIFI_DIR)/rate_ctrl/ra_ctrl_mt.o\ - $(RT_WIFI_DIR)/rate_ctrl/ra_table.o\ - $(RT_WIFI_DIR)/rate_ctrl/ra_cfg.o\ - $(RT_WIFI_DIR)/rate_ctrl/alg_legacy.o - -ifeq ($(CONFIG_NEW_RATE_ADAPT_SUPPORT),y) - EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT - rate_objs += $(RT_WIFI_DIR)/rate_ctrl/alg_grp.o\ - $(RT_WIFI_DIR)/rate_ctrl/alg_grp_mt.o - - ifeq ($(CONFIG_AGS_SUPPORT),y) - EXTRA_CFLAGS += -DAGS_ADAPT_SUPPORT - rate_objs += $(RT_WIFI_DIR)/rate_ctrl/alg_ags.o - endif -endif - - -######################################################## -# ASIC related files -######################################################## -asic_objs := $(RT_WIFI_DIR)/phy/phy.o\ - $(RT_WIFI_DIR)/phy/rf.o\ - $(RT_WIFI_DIR)/phy/rt_rf.o - - -ifeq ($(CONFIG_RLT_MAC),y) - EXTRA_CFLAGS += -DRLT_MAC - - asic_objs += $(RT_WIFI_DIR)/mac/ral_nmac.o -endif - -ifeq ($(CONFIG_RTMP_MAC),y) - EXTRA_CFLAGS += -DRTMP_MAC - - asic_objs += $(RT_WIFI_DIR)/mac/ral_omac.o\ - $(RT_WIFI_DIR)/chips/rtxx_dft.o -endif - - -######################################################## -# Spec feature related files -######################################################## -spec_objs += $(RT_WIFI_DIR)/common/ps.o\ - $(RT_WIFI_DIR)/common/uapsd.o - -# WSC -ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_INCLUDED - - ifneq ($(CONFIG_RLT_AP_SUPPORT),) - EXTRA_CFLAGS += -DWSC_AP_SUPPORT - endif - - ifneq ($(CONFIG_RLT_STA_SUPPORT),) - EXTRA_CFLAGS += -DWSC_STA_SUPPORT - endif - - spec_objs += $(RT_WIFI_DIR)/common/wsc.o\ - $(RT_WIFI_DIR)/common/wsc_tlv.o\ - $(RT_WIFI_DIR)/security/crypt_dh.o\ - $(RT_WIFI_DIR)/security/crypt_biginteger.o\ - $(RT_WIFI_DIR)/common/wsc_ufd.o - - ifeq ($(CONFIG_WSC_V2_SUPPORT),y) - EXTRA_CFLAGS += -DWSC_V2_SUPPORT - spec_objs += $(RT_WIFI_DIR)/common/wsc_v2.o - endif - ifeq ($(CONFIG_WSC_NFC_SUPPORT),y) - EXTRA_CFLAGS += -DWSC_NFC_SUPPORT - spec_objs += $(RT_WIFI_DIR)/common/nfc.o - endif - -endif - -# VHT -ifeq ($(CONFIG_DOT11_VHT_AC),y) - EXTRA_CFLAGS += -DDOT11_VHT_AC - spec_objs += $(RT_WIFI_DIR)/mgmt/mgmt_vht.o\ - $(RT_WIFI_DIR)/common/vht.o -endif - -# WAPI -ifeq ($(CONFIG_WAPI_SUPPORT),y) - EXTRA_CFLAGS += -DWAPI_SUPPORT - ifeq ($(CONFIG_RALINK_RT3052),y) - EXTRA_CFLAGS += -DSOFT_ENCRYPT - endif - - spec_objs += $(RT_WIFI_DIR)/security/wapi.o\ - $(RT_WIFI_DIR)/security/wapi_sms4.o\ - $(RT_WIFI_DIR)/security/wapi_crypt.o -endif - -# ACM -ifeq ($(CONFIG_WMM_ACM_SUPPORT),y) - EXTRA_CFLAGS += -DWMM_ACM_SUPPORT - - spec_objs += $(RT_WIFI_DIR)/common/acm_edca.o\ - $(RT_WIFI_DIR)/common/acm_comm.o\ - $(RT_WIFI_DIR)/common/acm_iocl.o -endif - -#PMF -ifeq ($(CONFIG_DOT11W_PMF_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11W_PMF_SUPPORT -DSOFT_ENCRYPT - - spec_objs += $(RT_WIFI_DIR)/security/pmf.o -endif - -# 11N BSS CoEx -ifeq ($(CONFIG_DOT11N_DRAFT3),y) - EXTRA_CFLAGS += -DDOT11N_DRAFT3 -endif - -# LLTD -ifeq ($(CONFIG_LLTD_SUPPORT),y) - EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -# FT -#ifeq ($(CONFIG_RT2860V2_80211R_FT),y) -#dot11_ft_objs += $(RT_WIFI_DIR)/common/ft.o\ -# $(RT_WIFI_DIR)/common/ft_tlv.o\ -# $(RT_WIFI_DIR)/common/ft_ioctl.o\ -# $(RT_WIFI_DIR)/common/ft_rc.o\ -# $(RT_WIFI_DIR)/ap/ap_ftkd.o -#endif - -# RR -#ifeq ($(CONFIG_RT2860V2_80211K_RR),y) -#dot11k_rr_objs += $(RT_WIFI_DIR)/common/rrm_tlv.o\ -# $(RT_WIFI_DIR)/common/rrm_sanity.o\ -# $(RT_WIFI_DIR)/common/rrm.o -#endif - -#HOTSPOT -ifeq ($(CONFIG_HOTSPOT),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT - - spec_objs += $(RT_WIFI_DIR)/common/wnm.o\ - $(RT_WIFI_DIR)/common/gas.o\ - $(RT_WIFI_DIR)/common/hotspot.o -endif - -# -# Common Feature related files -# -func_objs := - -ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT - - func_objs += $(RT_WIFI_DIR)/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_BLOCK_NET_IF),y) - EXTRA_CFLAGS += -DBLOCK_NET_IF - - func_objs += $(RT_WIFI_DIR)/common/netif_block.o -endif - -ifeq ($(CONFIG_SINGLE_SKU),y) - EXTRA_CFLAGS += -DSINGLE_SKU - ifeq ($(CONFIG_RALINK_RT6352),y) - EXTRA_CFLAGS += -DSINGLE_SKU_V2 - endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y) - EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT - - func_objs += $(RT_WIFI_DIR)/common/cmm_video.o -endif - - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT - ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_LED_SUPPORT - endif - - func_objs += $(RT_WIFI_DIR)/common/rt_led.o -endif - -#ATE -ifeq ($(CONFIG_ATE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW - - func_objs += $(RT_WIFI_DIR)/ate/common/rt_ate.o\ - $(RT_WIFI_DIR)/ate/common/rt_qa.o - -ifeq ($(CONFIG_RTMP_PCI_SUPPORT),y) - func_objs += $(RT_WIFI_DIR)/ate/common/ate_pci.o -endif - -ifeq ($(CONFIG_RTMP_USB_SUPPORT),y) - func_objs += $(RT_WIFI_DIR)/ate/common/ate_usb.o -endif - -endif - -######################################################## -# AP feature related files -######################################################## -ap_objs := $(RT_WIFI_DIR)/ap/ap.o\ - $(RT_WIFI_DIR)/ap/ap_assoc.o\ - $(RT_WIFI_DIR)/ap/ap_auth.o\ - $(RT_WIFI_DIR)/ap/ap_connect.o\ - $(RT_WIFI_DIR)/ap/ap_mlme.o\ - $(RT_WIFI_DIR)/ap/ap_sanity.o\ - $(RT_WIFI_DIR)/ap/ap_sync.o\ - $(RT_WIFI_DIR)/ap/ap_wpa.o\ - $(RT_WIFI_DIR)/ap/ap_data.o\ - $(RT_WIFI_DIR)/ap/ap_autoChSel.o\ - $(RT_WIFI_DIR)/ap/ap_qload.o\ - $(RT_WIFI_DIR)/ap/ap_cfg.o\ - $(RT_WIFI_DIR)/os/linux/ap_ioctl.o - -ifeq ($(CONFIG_QOS_DLS_SUPPORT),y) - EXTRA_CFLAGS += -DQOS_DLS_SUPPORT - ap_objs += $(RT_WIFI_DIR)/ap/ap_dls.o -endif - -ifeq ($(CONFIG_MBSS_SUPPORT),y) - EXTRA_CFLAGS += -DMBSS_SUPPORT - - ifeq ($(CONFIG_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DNEW_MBSSID_MODE - ifeq ($(CONFIG_ENHANCE_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DENHANCE_NEW_MBSSID_MODE - endif - endif - - ap_objs += $(RT_WIFI_DIR)/ap/ap_mbss.o\ - $(RT_WIFI_DIR)/ap/ap_mbss_inf.o -endif - - -ifeq ($(CONFIG_WDS_SUPPORT),y) - EXTRA_CFLAGS += -DWDS_SUPPORT - - ap_objs += $(RT_WIFI_DIR)/ap/ap_wds.o\ - $(RT_WIFI_DIR)/ap/ap_wds_inf.o\ - $(RT_WIFI_DIR)/common/client_wds.o -endif - -ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT - ifeq ($(CONFIG_RALINK_MT7620),y) - EXTRA_CFLAGS += -DMAC_APCLI_SUPPORT - endif - - ap_objs += $(RT_WIFI_DIR)/ap/ap_apcli.o\ - $(RT_WIFI_DIR)/ap/ap_apcli_inf.o\ - $(RT_WIFI_DIR)/ap/apcli_assoc.o\ - $(RT_WIFI_DIR)/ap/apcli_auth.o\ - $(RT_WIFI_DIR)/ap/apcli_ctrl.o\ - $(RT_WIFI_DIR)/ap/apcli_sync.o\ - $(RT_WIFI_DIR)/common/cmm_mat.o\ - $(RT_WIFI_DIR)/common/cmm_mat_iparp.o\ - $(RT_WIFI_DIR)/common/cmm_mat_pppoe.o\ - $(RT_WIFI_DIR)/common/cmm_mat_ipv6.o - - ifeq ($(CONFIG_MAC_REPEATER_SUPPORT),y) - EXTRA_CFLAGS += -DMAC_REPEATER_SUPPORT - - ap_objs += $(RT_WIFI_DIR)/ap/ap_repeater.o - endif -endif - -ifeq ($(CONFIG_IDS_SUPPORT),y) - EXTRA_CFLAGS += -DIDS_SUPPORT - - ap_objs += $(RT_WIFI_DIR)/ap/ap_ids.o -endif - -ifeq ($(CONFIG_NINTENDO_AP),y) - EXTRA_CFLAGS += -DNINTENDO_AP - - ap_objs += $(RT_WIFI_DIR)/ap/ap_nintendo.o -endif - -ifeq ($(CONFIG_COC_SUPPORT),y) - EXTRA_CFLAGS += -DGREENAP_SUPPORT -DCOC_SUPPORT - - ap_objs += $(RT_WIFI_DIR)/hw_ctrl/greenap.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_DFS),y) - EXTRA_CFLAGS += -DDFS_SUPPORT - - ap_objs += $(RT_WIFI_DIR)/common/cmm_dfs.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_CARRIER),y) - EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT - - ap_objs += $(RT_WIFI_DIR)/common/cmm_cs.o -endif - -ifeq ($(CONFIG_RT2860V2_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -#ifeq ($(CONFIG_RT2860V2_AP_MESH),y) -#EXTRA_CFLAGS += -DMESH_SUPPORT -DINTEL_CMPC -#mesh_objs += $(RT_WIFI_DIR)/common/mesh_bmpkt.o\ -# $(RT_WIFI_DIR)/common/mesh_ctrl.o\ -# $(RT_WIFI_DIR)/common/mesh_link_mng.o\ -# $(RT_WIFI_DIR)/common/mesh_sanity.o\ -# $(RT_WIFI_DIR)/common/mesh_tlv.o\ -# $(RT_WIFI_DIR)/common/mesh.o\ -# $(RT_WIFI_DIR)/common/mesh_inf.o\ -# $(RT_WIFI_DIR)/common/mesh_forwarding.o\ -# $(RT_WIFI_DIR)/common/mesh_path_mng.o -#endif - - -######################################################## -# Linux system related files -######################################################## -os_objs := $(RT_WIFI_DIR)/os/linux/rt_proc.o\ - $(RT_WIFI_DIR)/os/linux/rt_linux.o\ - $(RT_WIFI_DIR)/os/linux/rt_profile.o\ - $(RT_WIFI_DIR)/os/linux/rt_main_dev.o - -ifeq ($(CONFIG_MULTI_INF_SUPPORT),y) - EXTRA_CFLAGS += -DMULTI_INF_SUPPORT - - os_objs += $(RT_WIFI_DIR)/os/linux/multi_main_dev.o -endif - -ifeq ($(CONFIG_WIFI_WORK_QUEUE_BH),y) - EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - - -######################################################## -# chip related files -######################################################## -ifeq ($(CONFIG_RALINK_RT2880),y) -EXTRA_CFLAGS += -DRT2880 - -chip_objs += $(RT_WIFI_DIR)/chips/rt2880.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_TXBF),y) -EXTRA_CFLAGS += -DTXBF_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_RT2883),y) -EXTRA_CFLAGS += -DRT2883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT - -chip_objs += $(RT_WIFI_DIR)/chips/rt2883.o -endif - -ifeq ($(CONFIG_RALINK_RT3883),y) -EXTRA_CFLAGS += -DRT3883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -DCONFIG_SWMCU_SUPPORT -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -EXTRA_CFLAGS += -DRANGE_EXT_SUPPORT -EXTRA_CFLAGS += -DSTREAM_MODE_SUPPORT -DFIFO_EXT_SUPPORT - -chip_objs += $(RT_WIFI_DIR)/chips/rt3883.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(RT_WIFI_DIR)/ate/chips/rt3883_ate.o -endif - -ifeq ($(CONFIG_TXBF_SUPPORT),y) -chip_objs += $(RT_WIFI_DIR)/common/cmm_txbf.o\ - $(RT_WIFI_DIR)/common/cmm_txbf_cal.o -endif -endif - -ifeq ($(CONFIG_RALINK_RT3052),y) -EXTRA_CFLAGS += -DSPECIFIC_VCORECAL_SUPPORT -ifeq ($(CONFIG_RALINK_RT3350),y) -EXTRA_CFLAGS += -DRT3350 -DRT305x -DRTMP_RF_RW_SUPPORT -else -EXTRA_CFLAGS += -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT -endif - -chip_objs += $(RT_WIFI_DIR)/chips/rt305x.o -endif - -ifeq ($(CONFIG_RALINK_RT3352),y) -EXTRA_CFLAGS += -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT - -chip_objs += $(RT_WIFI_DIR)/chips/rt305x.o\ - $(RT_WIFI_DIR)/chips/rt3352.o -endif - -ifeq ($(CONFIG_RT3x52),y) -EXTRA_CFLAGS += -DRT3052 -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT - -chip_objs += $(RT_WIFI_DIR)/chips/rt305x.o\ - $(RT_WIFI_DIR)/chips/rt3352.o -endif - -ifeq ($(CONFIG_RALINK_RT5350),y) -EXTRA_CFLAGS += -DRT5350 -DRT305x -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT - -chip_objs += $(RT_WIFI_DIR)/chips/rt305x.o\ - $(RT_WIFI_DIR)/chips/rt5350.o -endif - -ifeq ($(CONFIG_RALINK_RT6352),y) -EXTRA_CFLAGS += -DRT6352 -DRTMP_RF_RW_SUPPORT -DRTMP_FLASH_SUPPORT -DCONFIG_SWMCU_SUPPORT -EXTRA_CFLAGS += -DRTMP_RBUS_SUPPORT -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DRTMP_MAC -DRTMP_BBP -DRLT_RF -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DLOFT_IQ_CAL_SUPPORT -EXTRA_CFLAGS += -DRTMP_TEMPERATURE_CALIBRATION -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -EXTRA_CFLAGS += -DENHANCE_NEW_MBSSID_MODE -#EXTRA_CFLAGS += -DSPECIFIC_TX_POWER_SUPPORT -#EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT - -chip_objs += $(RT_WIFI_DIR)/phy/rlt_rf.o\ - $(RT_WIFI_DIR)/phy/rtmp_phy.o\ - $(RT_WIFI_DIR)/chips/rt6352.o\ - $(RT_WIFI_DIR)/common/cmm_rf_cal.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(RT_WIFI_DIR)/ate/chips/rt6352_ate.o -endif - -endif - -ifeq ($(CONFIG_RALINK_MT7610E),y) -EXTRA_CFLAGS += -DRT65xx -DMT76x0 -DMT7610 -EXTRA_CFLAGS += -DRLT_MAC -DRLT_BBP -DRLT_RF -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRX_DMA_SCATTER -DCONFIG_ANDES_SUPPORT -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DA_BAND_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -EXTRA_CFLAGS += -DVCORECAL_SUPPORT -DMT76x0_TSSI_CAL_COMPENSATION -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DRELEASE_EXCLUDE - -chip_objs += $(RT_WIFI_DIR)/phy/rlt_rf.o\ - $(RT_WIFI_DIR)/phy/rlt_phy.o\ - $(RT_WIFI_DIR)/phy/rtmp_phy.o\ - $(RT_WIFI_DIR)/chips/mt76x0.o\ - $(RT_WIFI_DIR)/chips/rt65xx.o\ - $(RT_WIFI_DIR)/common/ee_efuse.o\ - $(RT_WIFI_DIR)/common/ee_prom.o\ - $(RT_WIFI_DIR)/mcu/mcu_and.o\ - $(RT_WIFI_DIR)/common/cmm_mac_pci.o\ - $(RT_WIFI_DIR)/common/cmm_data_pci.o\ - $(RT_WIFI_DIR)/os/linux/pci_main_dev.o\ - $(RT_WIFI_DIR)/os/linux/rt_rbus_pci_drv.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(RT_WIFI_DIR)/ate/chips/rt6590_ate.o -endif - -endif - -ifeq ($(CONFIG_RALINK_MT7612E),y) -EXTRA_CFLAGS += -DRT65xx -DMT76x2 -DMT7612 -EXTRA_CFLAGS += -DRLT_MAC -DRLT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRX_DMA_SCATTER -DCONFIG_ANDES_SUPPORT -DRTMP_EFUSE_SUPPORT -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DA_BAND_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -DRTMP_EFUSE_SUPPORT -DCONFIG_FPGA_MODE -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -DNEW_RATE_ADAPT_SUPPORT -DDYNAMIC_VGA_SUPPORT -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -DFIFO_EXT_SUPPORT - -chip_objs += $(RT_WIFI_DIR)/phy/mt_rf.o\ - $(RT_WIFI_DIR)/phy/rlt_phy.o\ - $(RT_WIFI_DIR)/phy/rtmp_phy.o\ - $(RT_WIFI_DIR)/chips/mt76x2.o\ - $(RT_WIFI_DIR)/chips/rt65xx.o\ - $(RT_WIFI_DIR)/common/ee_efuse.o\ - $(RT_WIFI_DIR)/common/ee_prom.o\ - $(RT_WIFI_DIR)/mcu/mcu_and.o\ - $(RT_WIFI_DIR)/common/cmm_mac_pci.o\ - $(RT_WIFI_DIR)/common/cmm_data_pci.o\ - $(RT_WIFI_DIR)/os/linux/pci_main_dev.o\ - $(RT_WIFI_DIR)/os/linux/rt_rbus_pci_drv.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(RT_WIFI_DIR)/ate/chips/mt76x2_ate.o -endif -endif - -ifeq ($(CONFIG_RALINK_MT7612U),y) -EXTRA_CFLAGS += -DRT65xx -DMT76x2 -DMT7612 -EXTRA_CFLAGS += -DRLT_MAC -DRLT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DCONFIG_ANDES_SUPPORT -DRTMP_EFUSE_SUPPORT -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DA_BAND_SUPPORT -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -DRTMP_TIMER_TASK_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -DRTMP_EFUSE_SUPPORT -DCONFIG_FPGA_MODE -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -DNEW_RATE_ADAPT_SUPPORT -EXTRA_CFLAGS += -DRELEASE_EXCLUDE - -chip_objs += $(RT_WIFI_DIR)/phy/rt_rf.o\ - $(RT_WIFI_DIR)/phy/mt_rf.o\ - $(RT_WIFI_DIR)/phy/rlt_phy.o\ - $(RT_WIFI_DIR)/phy/rtmp_phy.o\ - $(RT_WIFI_DIR)/chips/mt76x2.o\ - $(RT_WIFI_DIR)/chips/rt65xx.o\ - $(RT_WIFI_DIR)/common/ee_efuse.o\ - $(RT_WIFI_DIR)/common/ee_prom.o\ - $(RT_WIFI_DIR)/mcu/mcu_and.o\ - $(RT_WIFI_DIR)/common/cmm_mac_usb.o\ - $(RT_WIFI_DIR)/common/cmm_data_usb.o\ - $(RT_WIFI_DIR)/common/rtusb_dev_id.o\ - $(RT_WIFI_DIR)/common/rtusb_io.o\ - $(RT_WIFI_DIR)/common/rtusb_data.o\ - $(RT_WIFI_DIR)/common/rtusb_bulk.o\ - $(RT_WIFI_DIR)/os/linux/usb_main_dev.o\ - $(RT_WIFI_DIR)/os/linux/rt_usb.o\ - $(RT_WIFI_DIR)/os/linux/rt_usb_util.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(RT_WIFI_DIR)/ate/chips/mt76x2_ate.o -endif -endif - -# -# Root -# -obj-$(CONFIG_RLT_AP_SUPPORT) += $(DRV_NAME).o - -$(DRV_NAME)-objs += $(cmm_objs) $(asic_objs) $(chip_objs) $(rate_objs)\ - $(spec_objs) $(func_objs) $(ap_objs) $(os_objs) - -$(DRV_NAME)-objs += $(RT_WIFI_DIR)/common/rtmp_swmcu.o\ - $(RT_WIFI_DIR)/common/eeprom.o\ - $(RT_WIFI_DIR)/common/ee_flash.o - -$(DRV_NAME)-objs += $(RT_WIFI_DIR)/common/cmm_mac_pci.o -$(DRV_NAME)-objs += $(RT_WIFI_DIR)/common/cmm_data_pci.o - -$(DRV_NAME)-objs += $(RT_WIFI_DIR)/os/linux/rt_pci_rbus.o\ - $(RT_WIFI_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(RT_WIFI_DIR)/os/linux/rt_rbus_pci_util.o\ - $(RT_WIFI_DIR)/os/linux/rbus_main_dev.o - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wall -Wstrict-prototypes -Wno-trigraphs -DDBG_DIAGNOSE -DDBG_RX_MC\ - -DDBG_TX_MCS - -EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DSCAN_SUPPORT -DAP_SCAN_SUPPORT -DUAPSD_SUPPORT -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DSTATS_COUNT_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -EXTRA_CFLAGS += -DCONFIG_RA_NAT_NONE - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_RT2860V2_AUTO_CH_SELECT_ENCANCE),y) -EXTRA_CFLAGS += -DAUTO_CH_SELECT_ENHANCE -endif - -ifeq ($(CONFIG_RT2860V2_SNMP),y) -EXTRA_CFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_32B_DESC),y) -EXTRA_CFLAGS += -DDESC_32B_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_HW_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y) -EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(CONFIG_RT2860V2_AP_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -EXTRA_CFLAGS += -DDBG -endif - -ifeq ($(CONFIG_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -#ifeq ($(CONFIG_RT2860V2_AP_RTMP_TEMPERATURE_CALIBRATION),y) -#ifeq ($(CONFIG_RALINK_MT7620),y) -#EXTRA_CFLAGS += -DRTMP_TEMPERATURE_CALIBRATION -#endif -#endif - - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_ap.7637e b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_ap.7637e deleted file mode 100644 index 1f0b778f08..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_ap.7637e +++ /dev/null @@ -1,667 +0,0 @@ -EXTRA_CFLAGS = -Idrivers/net/wireless/rlt_wifi/include \ - -Idrivers/net/wireless/rlt_wifi/embedded/include \ - -Idrivers/net/wireless/rlt_wifi/ate/include - -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS = -I$(src)/../src/include \ - -I$(src)/../src/embedded/include \ - -I$(src)/../src/ate/include -DRV_NAME = mt7637e -RLT_SRC_DIR = ../src/embedded -obj-m += $(DRV_NAME).o -else -EXTRA_CFLAGS = -Idrivers/net/wireless/rlt_wifi/include \ - -Idrivers/net/wireless/rlt_wifi/embedded/include \ - -Idrivers/net/wireless/rlt_wifi/ate/include -DRV_NAME = rlt_wifi -RLT_SRC_DIR = ../rlt_wifi -SRC_EMBEDDED_DIR = ../rlt_wifi/embedded -obj-$(CONFIG_RLT_AP_SUPPORT) += $(DRV_NAME).o -endif - -######################################################## -# Common files -# $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o\ -######################################################## -cmm_objs := $(SRC_EMBEDDED_DIR)/common/action.o\ - $(SRC_EMBEDDED_DIR)/common/ba_action.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/radio_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/omac_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wmm_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/hdev_basic.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wtbl_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_cmd.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_basic.o\ - $(RLT_SRC_DIR)/hw_ctrl/hw_init.o\ - $(SRC_EMBEDDED_DIR)/common/bcn.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_aes.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cfg.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cmd.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_data.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_profile.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_radar.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sync.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_info.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sanity.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_sec.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_tkip.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wep.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wpa.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_aes.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_arc4.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_hmac.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_md5.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_sha2.o\ - $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/mlme.o\ - $(RLT_SRC_DIR)/hw_ctrl/cmm_asic.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_dev.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init_inf.o\ - $(SRC_EMBEDDED_DIR)/common/spectrum.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_timer.o\ - $(SRC_EMBEDDED_DIR)/common/rt_channel.o\ - $(SRC_EMBEDDED_DIR)/common/rt_os_util.o\ - $(SRC_EMBEDDED_DIR)/common/scan.o\ - $(SRC_EMBEDDED_DIR)/common/sys_log.o\ - $(SRC_EMBEDDED_DIR)/common/txpower.o\ - $(RLT_SRC_DIR)/chips/rtmp_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_hw.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_entrytb.o\ - $(SRC_EMBEDDED_DIR)/tx_rx/wdev.o\ - $(SRC_EMBEDDED_DIR)/tx_rx/wdev_tx.o\ - $(SRC_EMBEDDED_DIR)/tx_rx/wdev_rx.o\ - $(RLT_SRC_DIR)/os/linux/rt_profile.o - -######################################################## -# Rate adaptation related files -######################################################## -rate_objs := $(RLT_SRC_DIR)/rate_ctrl/ra_ctrl.o\ - $(RLT_SRC_DIR)/rate_ctrl/ra_ctrl_mt.o\ - $(RLT_SRC_DIR)/rate_ctrl/ra_wrapper_embedded.o\ - $(RLT_SRC_DIR)/rate_ctrl/ra_table.o\ - $(RLT_SRC_DIR)/rate_ctrl/ra_fallback_mt.o\ - $(RLT_SRC_DIR)/rate_ctrl/ra_cfg.o\ - $(RLT_SRC_DIR)/rate_ctrl/alg_legacy.o - -ifeq ($(CONFIG_NEW_RATE_ADAPT_SUPPORT),y) - EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT - rate_objs += $(RLT_SRC_DIR)/rate_ctrl/alg_grp.o - rate_objs += $(RLT_SRC_DIR)/rate_ctrl/alg_grp_mt.o - - ifeq ($(CONFIG_AGS_SUPPORT),y) - EXTRA_CFLAGS += -DAGS_ADAPT_SUPPORT - rate_objs += $(RLT_SRC_DIR)/rate_ctrl/alg_ags.o - endif -endif - -ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT - EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT - rate_objs += $(RLT_SRC_DIR)/rate_ctrl/alg_agbs_mt.o -endif - -######################################################## -# ASIC related files -######################################################## -asic_objs := $(RLT_SRC_DIR)/phy/phy.o - -# -#ifeq ($(CONFIG_RLT_MAC),y) -# EXTRA_CFLAGS += -DRLT_MAC -# -# asic_objs += $(RLT_SRC_DIR)/mac/ral_nmac.o -#endif - -# -#ifeq ($(CONFIG_RTMP_MAC),y) -# EXTRA_CFLAGS += -DRTMP_MAC -# -# asic_objs += $(RLT_SRC_DIR)/mac/ral_omac.o\ -# $(RLT_SRC_DIR)/chips/rtxx_dft.o -#endif - - -######################################################## -# Spec feature related files -######################################################## -spec_objs += $(SRC_EMBEDDED_DIR)/common/ps.o - -ifeq ($(CONFIG_UAPSD),y) - EXTRA_CFLAGS += -DUAPSD_SUPPORT -DUAPSD_DEBUG - spec_objs += $(SRC_EMBEDDED_DIR)/common/uapsd.o -endif - -#ifeq ($(CONFIG_RLT_MAC),y) -# spec_objs += $(SRC_EMBEDDED_DIR)/common/ral_ps.o -#endif - -#ifeq ($(CONFIG_RTMP_MAC),y) -# spec_objs += $(SRC_EMBEDDED_DIR)/common/ral_ps.o -#endif - -ifeq ($(CONFIG_MT_MAC),y) - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_ps.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_io.o - spec_objs += $(SRC_EMBEDDED_DIR)/tx_rx/txs.o -endif - -# WSC -ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_INCLUDED -#-DWSC_SINGLE_TRIGGER - - ifneq ($(CONFIG_RLT_AP_SUPPORT),) - EXTRA_CFLAGS += -DWSC_AP_SUPPORT - endif - - ifneq ($(CONFIG_RLT_STA_SUPPORT),) - EXTRA_CFLAGS += -DWSC_STA_SUPPORT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_tlv.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_dh.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_ufd.o - - ifeq ($(CONFIG_WSC_V2_SUPPORT),y) - EXTRA_CFLAGS += -DWSC_V2_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc_v2.o - endif -endif - -# VHT -ifeq ($(CONFIG_DOT11_VHT_AC),y) - EXTRA_CFLAGS += -DDOT11_VHT_AC - spec_objs += $(SRC_EMBEDDED_DIR)/mgmt/mgmt_vht.o\ - $(SRC_EMBEDDED_DIR)/common/vht.o - # WFA VHT R2 PF - ifeq ($(CONFIG_WFA_VHT_R2_PF),y) - EXTRA_CFLAGS += -DWFA_VHT_R2_PF - endif -endif - -# WAPI -ifeq ($(CONFIG_WAPI_SUPPORT),y) - EXTRA_CFLAGS += -DWAPI_SUPPORT -# ifeq ($(CONFIG_RALINK_RT3052),y) -# EXTRA_CFLAGS += -DSOFT_ENCRYPT -# endif - - spec_objs += $(SRC_EMBEDDED_DIR)/security/wapi.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_sms4.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_crypt.o - -endif - -# ACM -ifeq ($(CONFIG_WMM_ACM_SUPPORT),y) - EXTRA_CFLAGS += -DWMM_ACM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/acm_edca.o\ - $(SRC_EMBEDDED_DIR)/common/acm_comm.o\ - $(SRC_EMBEDDED_DIR)/common/acm_iocl.o -endif - -#PMF -ifeq ($(CONFIG_DOT11W_PMF_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11W_PMF_SUPPORT #-DSOFT_ENCRYPT - - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o -endif - -# LLTD -ifeq ($(CONFIG_LLTD_SUPPORT),y) - EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -ifeq ($(CONFIG_PASSPOINT_R2),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -DCONFIG_HOTSPOT_R2 - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o\ - $(SRC_EMBEDDED_DIR)/common/gas.o\ - $(SRC_EMBEDDED_DIR)/common/hotspot.o -endif - -# FT -#ifeq ($(CONFIG_RT2860V2_80211R_FT),y) -#dot11_ft_objs += $(SRC_EMBEDDED_DIR)/common/ft.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_tlv.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_ioctl.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_rc.o\ -# $(SRC_EMBEDDED_DIR)/ap/ap_ftkd.o -#endif - -# RR -#ifeq ($(CONFIG_RT2860V2_80211K_RR),y) -#dot11k_rr_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o\ -# $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o\ -# $(SRC_EMBEDDED_DIR)/common/rrm.o -#endif -#SNIFFER -ifeq ($(CONFIG_SNIFFER_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_SNIFFER_SUPPORT - - spec_objs += $(MT_WIFI_DIR)/sniffer/sniffer_radiotap.o\ - $(MT_WIFI_DIR)/sniffer/sniffer_prism.o -endif - -#CFG -ifeq ($(CONFIG_CFG80211_SUPPORT),y) - EXTRA_CFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST - - spec_objs += $(MT_WIFI_DIR)/os/linux/cfg80211/cfg80211_scan.o\ - $(MT_WIFI_DIR)/os/linux/cfg80211/cfg80211_rx.o\ - $(MT_WIFI_DIR)/os/linux/cfg80211/cfg80211_tx.o\ - $(MT_WIFI_DIR)/os/linux/cfg80211/cfg80211_inf.o\ - $(MT_WIFI_DIR)/os/linux/cfg80211/cfg80211_ap.o\ - $(MT_WIFI_DIR)/os/linux/cfg80211/cfg80211drv.o\ - $(MT_WIFI_DIR)/os/linux/cfg80211/cfg80211_util.o\ - $(MT_WIFI_DIR)/os/linux/cfg80211/cfg80211.o -endif - -# -# Common Feature related files -# -func_objs := - -ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT - - func_objs += $(SRC_EMBEDDED_DIR)/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_BLOCK_NET_IF),y) - EXTRA_CFLAGS += -DBLOCK_NET_IF - - func_objs += $(SRC_EMBEDDED_DIR)/common/netif_block.o -endif - -ifeq ($(CONFIG_SINGLE_SKU),y) -# EXTRA_CFLAGS += -DSINGLE_SKU -# ifeq ($(CONFIG_RALINK_RT6352),y) - EXTRA_CFLAGS += -DSINGLE_SKU_V2 -# endif -endif - -#ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y) -# EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT -# -# func_objs += $(SRC_EMBEDDED_DIR)/common/cmm_video.o -#endif - - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT - ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_LED_SUPPORT - endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - - -######################################################## -# AP feature related files -######################################################## -ap_objs := $(SRC_EMBEDDED_DIR)/ap/ap.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_assoc.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_auth.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_mlme.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sanity.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sync.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_wpa.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sec.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_data.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_autoChSel.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_qload.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_cfg.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_nps.o\ - $(RLT_SRC_DIR)/os/linux/ap_ioctl.o - -ifeq ($(CONFIG_MBSS_SUPPORT),y) - EXTRA_CFLAGS += -DMBSS_SUPPORT - - ifeq ($(CONFIG_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DNEW_MBSSID_MODE - ifeq ($(CONFIG_ENHANCE_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DENHANCE_NEW_MBSSID_MODE - endif - endif - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mbss.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_mbss_inf.o -endif - - -ifeq ($(CONFIG_WDS_SUPPORT),y) - EXTRA_CFLAGS += -DWDS_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_wds.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_wds_inf.o\ - $(SRC_EMBEDDED_DIR)/common/client_wds.o -endif - -ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DAPCLI_CERT_SUPPORT -DAPCLI_AUTO_CONNECT_SUPPORT -DAPCLI_CONNECTION_TRIAL -DMULTI_APCLI_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_apcli.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_apcli_inf.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_assoc.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_auth.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_ctrl.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_sync.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_iparp.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_pppoe.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_ipv6.o - - ifeq ($(CONFIG_MAC_REPEATER_SUPPORT),y) - EXTRA_CFLAGS += -DMAC_REPEATER_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_repeater.o - endif -endif - -ifeq ($(CONFIG_IDS_SUPPORT),y) - EXTRA_CFLAGS += -DIDS_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_ids.o -endif - -ifeq ($(CONFIG_NINTENDO_AP),y) - EXTRA_CFLAGS += -DNINTENDO_AP - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_nintendo.o -endif - -#ifeq ($(CONFIG_COC_SUPPORT),y) -# EXTRA_CFLAGS += -DGREENAP_SUPPORT -DCOC_SUPPORT -# -# ap_objs += $(RLT_SRC_DIR)/../hw_ctrl/greenap.o -#endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW -DCONFIG_HW_HAL_OFFLOAD -DCSD_VERIFICATION #-DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT),y) - EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_TEMPERATURE_TX_ALC),y) - EXTRA_CFLAGS += -DRTMP_TEMPERATURE_TX_ALC -endif - -ifeq ($(CONFIG_TXBF_SUPPORT),y) - EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DTXBF_SUPPORT -DVHT_TXBF_SUPPORT - ap_objs += $(RLT_SRC_DIR)/txbf/cmm_txbf_mt.o\ - $(RLT_SRC_DIR)/txbf/cmm_txbf_cal_mt.o\ - $(RLT_SRC_DIR)/txbf/txbf_wrapper_embedded.o -endif - -#ifeq ($(CONFIG_MUMIMO_SUPPORT),y) -# EXTRA_CFLAGS += -DCFG_SUPPORT_MU_MIMO -# ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mumimo.o -#endif - -ifeq ($(CONFIG_CON_WPS_SUPPORT), y) - EXTRA_CFLAGS += -DCON_WPS -DCON_WPS_AP_SAME_UUID -endif - -ifeq ($(CONFIG_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DDFS_SUPPORT - EXTRA_CFLAGS += -DDFS_ATP_SUPPORT - ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_dfs.o -endif - -#ifeq ($(CONFIG_RT2860V2_AP_CARRIER),y) -# EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT -# -# ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_cs.o -#endif - -ifeq ($(CONFIG_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(CONFIG_AIRPLAY_SUPPORT),y) - EXTRA_CFLAGS += -DAIRPLAY_SUPPORT -endif - -######################################################## -# Linux system related files -######################################################## -os_objs := $(RLT_SRC_DIR)/os/linux/rt_proc.o\ - $(RLT_SRC_DIR)/os/linux/rt_linux.o\ - $(RLT_SRC_DIR)/os/linux/rt_profile.o\ - $(RLT_SRC_DIR)/os/linux/rt_txrx_hook.o\ - $(RLT_SRC_DIR)/os/linux/rt_main_dev.o - -ifeq ($(CONFIG_MULTI_INF_SUPPORT),y) - EXTRA_CFLAGS += -DMULTI_INF_SUPPORT - - os_objs += $(RLT_SRC_DIR)/os/linux/multi_main_dev.o -endif - -ifeq ($(CONFIG_WIFI_WORK_QUEUE_BH),y) - EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - - -######################################################## -# chip related files -######################################################## -#ifeq ($(CONFIG_FIRST_IF_MT7628),y) -#EXTRA_CFLAGS += -DMT7628 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -#EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -DDMA_SCH_SUPPORT -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -#EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -#EXTRA_CFLAGS += -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -#EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -#EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT -#EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -#EXTRA_CFLAGS += -DUSE_BMC -DTHERMAL_PROTECT_SUPPORT -DCAL_FREE_IC_SUPPORT - -#chip_objs += $(RLT_SRC_DIR)/chips/mt7628.o\ -# $(RLT_SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ -# $(RLT_SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ -# $(RLT_SRC_DIR)/mac/mt_mac.o\ -# $(RLT_SRC_DIR)/mcu/mcu.o\ -# $(RLT_SRC_DIR)/mcu/andes_core.o\ -# $(RLT_SRC_DIR)/mcu/andes_mt.o\ -# $(RLT_SRC_DIR)/phy/mt_rf.o\ -# $(RLT_SRC_DIR)/phy/rf.o\ -# $(RLT_WIFI_RLT_SRC_DIR)/phy/mt_phy.o\ -# $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ -# $(SRC_EMBEDDED_DIR)/common/cmm_data_pci.o\ -# $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ -# $(RLT_SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ -# $(RLT_SRC_DIR)/hif/hif_pci.o\ -# $(RLT_SRC_DIR)/os/linux/rbus_main_dev.o -#endif - - -ifeq ($(CONFIG_SECOND_IF_MT7637E),y) -EXTRA_CFLAGS += -DMT7637 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -DDMA_SCH_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -# -DCUT_THROUGH -#EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -#EXTRA_CFLAGS += -DNEED_ROM_PATCH -#EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT - -chip_objs += $(RLT_SRC_DIR)/chips/mt7637.o\ - $(RLT_SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(RLT_SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(RLT_SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(RLT_SRC_DIR)/mac/mt_mac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(RLT_SRC_DIR)/mcu/mt_cmd.o\ - $(RLT_SRC_DIR)/mcu/fwdl_mt.o\ - $(RLT_SRC_DIR)/mcu/fw_cmd.o\ - $(RLT_SRC_DIR)/mcu/fwdl.o\ - $(RLT_SRC_DIR)/phy/mt_rf.o\ - $(RLT_SRC_DIR)/phy/rf.o\ - $(RLT_SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_data_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(RLT_SRC_DIR)/protocol/tmr.o\ - $(RLT_SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_EMBEDDED_DIR)/hif/hif_pci.o\ - $(RLT_SRC_DIR)/os/linux/pci_main_dev.o -endif -# $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - - -ifeq ($(CONFIG_CHIP_MT7615E),y) -EXTRA_CFLAGS += -DMT7615 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -EXTRA_CFLAGS += -DTMR_VERIFY -EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -DRX_CUT_THROUGH -endif - -chip_objs += $(RLT_SRC_DIR)/chips/mt7615.o\ - $(RLT_SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(RLT_SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(RLT_SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(RLT_SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(RLT_SRC_DIR)/mcu/mt_cmd.o\ - $(RLT_SRC_DIR)/mcu/fwdl_mt.o\ - $(RLT_SRC_DIR)/mcu/fw_cmd.o\ - $(RLT_SRC_DIR)/mcu/fwdl.o\ - $(RLT_SRC_DIR)/phy/mt_rf.o\ - $(RLT_SRC_DIR)/phy/rf.o\ - $(RLT_SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_data_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(RLT_SRC_DIR)/protocol/tmr.o\ - $(RLT_SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_EMBEDDED_DIR)/hif/hif_pci.o\ - $(RLT_SRC_DIR)/os/linux/pci_main_dev.o -endif - - -# -# Root -# - -$(DRV_NAME)-objs += $(ap_objs) $(cmm_objs) $(asic_objs) $(chip_objs) $(rate_objs)\ - $(spec_objs) $(func_objs) $(os_objs) - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_flash.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_data_pci.o - -$(DRV_NAME)-objs += $(RLT_SRC_DIR)/os/linux/rt_pci_rbus.o\ - $(RLT_SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(RLT_SRC_DIR)/os/linux/rt_rbus_pci_util.o\ - #$(RLT_SRC_DIR)/os/linux/rbus_main_dev.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -$(DRV_NAME)-objs += $(RLT_SRC_DIR)/ate/ate_agent.o\ - $(RLT_SRC_DIR)/ate/testmode_ioctl.o\ - $(RLT_SRC_DIR)/ate/mt_mac/mt_testmode.o\ - $(RLT_SRC_DIR)/ate/LoopBack.o -endif - - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wstrict-prototypes -Wno-trigraphs -Wall -Wno-unused-but-set-variable - -EXTRA_CFLAGS += -DOLDSEC - -#-Werror -#-DDBG_DIAGNOSE -DDBG_RX_MCS -DDBG_TX_MCS - -EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DSCAN_SUPPORT -DAP_SCAN_SUPPORT -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -#EXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DCONFIG_RT2880_ATE_CMD_NEW -EXTRA_CFLAGS += -DCONFIG_RA_NAT_NONE - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_RT2860V2_AUTO_CH_SELECT_ENCANCE),y) -EXTRA_CFLAGS += -DAUTO_CH_SELECT_ENHANCE -endif - -ifeq ($(CONFIG_RT2860V2_SNMP),y) -EXTRA_CFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_32B_DESC),y) -EXTRA_CFLAGS += -DDESC_32B_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_HW_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y) -EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(CONFIG_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -#EXTRA_CFLAGS += -DDBG -endif -EXTRA_CFLAGS += -DDBG - -ifeq ($(CONFIG_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -EXTRA_CFLAGS += -DIP_ASSEMBLY - -MODULE_FLAGS=$(EXTRA_CFLAGS) -export MODULE_FLAGS -obj-m+=$(SRC_EMBEDDED_DIR)/tools/plug_in/ - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_sta b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_sta deleted file mode 100644 index f47700e035..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.rlt_wifi_sta +++ /dev/null @@ -1,510 +0,0 @@ -EXTRA_CFLAGS = -Idrivers/net/wireless/rlt_wifi/include \ - -Idrivers/net/wireless/rlt_wifi/ate/include - -obj-$(CONFIG_RT2860V2_AP) += rlt_wifi_sta.o - -rt2860v2_ap-objs += ../rt2860v2/security/crypt_md5.o -rt2860v2_ap-objs += ../rt2860v2/security/crypt_sha2.o -rt2860v2_ap-objs += ../rt2860v2/security/crypt_hmac.o -rt2860v2_ap-objs += ../rt2860v2/security/crypt_aes.o -rt2860v2_ap-objs += ../rt2860v2/security/crypt_arc4.o -rt2860v2_ap-objs += ../rt2860v2/common/mlme.o -rt2860v2_ap-objs += ../rt2860v2/security/cmm_wep.o -rt2860v2_ap-objs += ../rt2860v2/common/action.o -rt2860v2_ap-objs += ../rt2860v2/common/ba_action.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_data.o -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_init.o -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_init_inf.o -rt2860v2_ap-objs += ../rt2860v2/security/cmm_tkip.o -rt2860v2_ap-objs += ../rt2860v2/security/cmm_aes.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_sync.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_sanity.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_info.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_cfg.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_radar.o -rt2860v2_ap-objs += ../rt2860v2/security/cmm_wpa.o -rt2860v2_ap-objs += ../rt2860v2/common/spectrum.o -rt2860v2_ap-objs += ../rt2860v2/common/ps.o -rt2860v2_ap-objs += ../rt2860v2/common/uapsd.o - -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_timer.o -rt2860v2_ap-objs += ../rt2860v2/common/rt_channel.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_profile.o -rt2860v2_ap-objs += ../rt2860v2/security/cmm_asic.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_cmd.o -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_swmcu.o - -rt2860v2_ap-objs += ../rt2860v2/common/eeprom.o -rt2860v2_ap-objs += ../rt2860v2/common/ee_flash.o - -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mac_pci.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_data_pci.o - -rt2860v2_ap-objs += ../rt2860v2/common/cmm_rf_cal.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_loft_cal.o - -rt2860v2_ap-objs += ../rt2860v2/ap/ap.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_assoc.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_auth.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_connect.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_mlme.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_sanity.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_sync.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_wpa.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_data.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_autoChSel.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_qload.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_cfg.o - -rt2860v2_ap-objs += ../rt2860v2/rate_ctrl/ra_ctrl.o -rt2860v2_ap-objs += ../rt2860v2/rate_ctrl/alg_legacy.o -rt2860v2_ap-objs += ../rt2860v2/rate_ctrl/alg_ags.o - -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_proc.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_linux.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_profile.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_main_dev.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/ap_ioctl.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_pci_rbus.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_rbus_pci_drv.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_rbus_pci_util.o -rt2860v2_ap-objs += ../rt2860v2/os/linux/rbus_main_dev.o - -rt2860v2_ap-objs += ../rt2860v2/ate/common/rt_ate.o -rt2860v2_ap-objs += ../rt2860v2/ate/common/rt_qa.o -rt2860v2_ap-objs += ../rt2860v2/ate/common/ate_pci.o - -rt2860v2_ap-objs += ../rt2860v2/common/rt_os_util.o -rt2860v2_ap-objs += ../rt2860v2/common/rtmp_swmcu.o -rt2860v2_ap-objs += ../rt2860v2/chips/rtmp_chip.o -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o - -ifeq ($(CONFIG_MULTI_INF_SUPPORT),y) -rt2860v2_ap-objs += ../rt2860v2/os/linux/multi_main_dev.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_WMM_ACM),y) -rt2860v2_ap-objs += ../rt2860v2/common/acm_edca.o -rt2860v2_ap-objs += ../rt2860v2/common/acm_comm.o -rt2860v2_ap-objs += ../rt2860v2/common/acm_iocl.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_PMF),y) -rt2860v2_ap-objs += ../rt2860v2/security/pmf.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_LED),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_led.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_WSC),y) -rt2860v2_ap-objs += ../rt2860v2/common/wsc.o -rt2860v2_ap-objs += ../rt2860v2/common/wsc_tlv.o -rt2860v2_ap-objs += ../rt2860v2/security/crypt_dh.o -rt2860v2_ap-objs += ../rt2860v2/security/crypt_biginteger.o -rt2860v2_ap-objs += ../rt2860v2/common/wsc_ufd.o -ifeq ($(CONFIG_RT2860V2_AP_WSC_V2),y) -rt2860v2_ap-objs += ../rt2860v2/common/wsc_v2.o -endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_NINTENDO),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_nintendo.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_WDS),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_wds.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_wds_inf.o -rt2860v2_ap-objs += ../rt2860v2/common/client_wds.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_MBSS),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_mbss.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_mbss_inf.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_APCLI),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_apcli.o -rt2860v2_ap-objs += ../rt2860v2/ap/ap_apcli_inf.o -rt2860v2_ap-objs += ../rt2860v2/ap/apcli_assoc.o -rt2860v2_ap-objs += ../rt2860v2/ap/apcli_auth.o -rt2860v2_ap-objs += ../rt2860v2/ap/apcli_ctrl.o -rt2860v2_ap-objs += ../rt2860v2/ap/apcli_sync.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_iparp.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_pppoe.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_ipv6.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_MAC_REPEATER),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_repeater.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_IGMP_SNOOP),y) -rt2860v2_ap-objs += ../rt2860v2/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_NETIF_BLOCK),y) -rt2860v2_ap-objs += ../rt2860v2/common/netif_block.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_DFS),y) -rt2860v2_ap-objs += ../rt2860v2/common/cmm_dfs.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_CARRIER),y) -rt2860v2_ap-objs += ../rt2860v2/common/cmm_cs.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_DLS),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_dls.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_IDS),y) -rt2860v2_ap-objs += ../rt2860v2/ap/ap_ids.o -endif - -#ifeq ($(CONFIG_RT2860V2_AP_MESH),y) -#rt2860v2_ap-objs += ../rt2860v2/common/mesh_bmpkt.o -#rt2860v2_ap-objs += ../rt2860v2/common/mesh_ctrl.o -#rt2860v2_ap-objs += ../rt2860v2/common/mesh_link_mng.o -#rt2860v2_ap-objs += ../rt2860v2/common/mesh_sanity.o -#rt2860v2_ap-objs += ../rt2860v2/common/mesh_tlv.o -#rt2860v2_ap-objs += ../rt2860v2/common/mesh.o -#rt2860v2_ap-objs += ../rt2860v2/common/mesh_inf.o -#rt2860v2_ap-objs += ../rt2860v2/common/mesh_forwarding.o -#rt2860v2_ap-objs += ../rt2860v2/common/mesh_path_mng.o -#endif - -ifeq ($(CONFIG_RT2860V2_AP_WAPI),y) -rt2860v2_ap-objs += ../rt2860v2/security/wapi.o -rt2860v2_ap-objs += ../rt2860v2/security/wapi_sms4.o -rt2860v2_ap-objs += ../rt2860v2/security/wapi_crypt.o -endif - -#ifeq ($(CONFIG_RT2860V2_80211R_FT),y) -#rt2860v2_ap-objs += ../rt2860v2/common/ft.o -#rt2860v2_ap-objs += ../rt2860v2/common/ft_tlv.o -#rt2860v2_ap-objs += ../rt2860v2/common/ft_ioctl.o -#rt2860v2_ap-objs += ../rt2860v2/common/ft_rc.o -#rt2860v2_ap-objs += ../rt2860v2/ap/ap_ftkd.o -#endif - -#ifeq ($(CONFIG_RT2860V2_80211K_RR),y) -#rt2860v2_ap-objs += ../rt2860v2/common/rrm_tlv.o -#rt2860v2_ap-objs += ../rt2860v2/common/rrm_sanity.o -#rt2860v2_ap-objs += ../rt2860v2/common/rrm.o -#endif - -ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y) -rt2860v2_ap-objs += ../rt2860v2/common/cmm_video.o -endif - -ifeq ($(CONFIG_RALINK_RT2880),y) -rt2860v2_ap-objs += ../rt2860v2/chips/rt2880.o -endif - -ifeq ($(CONFIG_RALINK_RT2883),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt2883.o -ifeq ($(CONFIG_RT2860V2_AP_TXBF),y) -rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf.o -endif -endif - -ifeq ($(CONFIG_RALINK_RT3883),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt3883.o -ifeq ($(CONFIG_RT2860V2_AP_TXBF),y) -rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf_cal.o -endif -rt2860v2_ap-objs += ../rt2860v2/rate_ctrl/alg_grp.o -rt2860v2_ap-objs += ../rt2860v2/ate/chips/rt3883_ate.o -endif - -ifeq ($(CONFIG_RALINK_RT3052),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o -endif - -ifeq ($(CONFIG_RALINK_RT3352),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt3352.o -endif - -ifeq ($(CONFIG_RT3x52),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt3352.o -endif - -ifeq ($(CONFIG_RALINK_RT5350),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt5350.o -endif - -ifeq ($(CONFIG_RALINK_RT6352),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt6352.o -rt2860v2_ap-objs += ../rt2860v2/ate/chips/rt6352_ate.o -endif - -ifeq ($(CONFIG_RALINK_MT7620),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt6352.o -rt2860v2_ap-objs += ../rt2860v2/ate/chips/rt6352_ate.o -endif - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wall -Wstrict-prototypes -Wno-trigraphs - -EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DAP_SCAN_SUPPORT -DUAPSD_AP_SUPPORT -DUAPSD_SUPPORT -DRTMP_RBUS_SUPPORT -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DSTATS_COUNT_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW -EXTRA_CFLAGS += -DCONFIG_RA_NAT_NONE - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_RALINK_RT2880),y) -EXTRA_CFLAGS += -DRT2880 -endif - -ifeq ($(CONFIG_RALINK_RT2883),y) -EXTRA_CFLAGS += -DRT2883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -ifeq ($(CONFIG_RT2860V2_AP_TXBF),y) -EXTRA_CFLAGS += -DTXBF_SUPPORT -endif -endif - -ifeq ($(CONFIG_RALINK_RT3883),y) -EXTRA_CFLAGS += -DRT3883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -DCONFIG_SWMCU_SUPPORT -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -EXTRA_CFLAGS += -DRANGE_EXT_SUPPORT -ifeq ($(CONFIG_RT2860V2_AP_TXBF),y) -EXTRA_CFLAGS += -DTXBF_SUPPORT -endif -EXTRA_CFLAGS += -DSTREAM_MODE_SUPPORT -DFIFO_EXT_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_RT3052),y) -EXTRA_CFLAGS += -DSPECIFIC_VCORECAL_SUPPORT -ifeq ($(CONFIG_RALINK_RT3350),y) -EXTRA_CFLAGS += -DRT3350 -DRT305x -DRTMP_RF_RW_SUPPORT -else -EXTRA_CFLAGS += -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT -endif -endif - -ifeq ($(CONFIG_RALINK_RT3352),y) -EXTRA_CFLAGS += -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RT3x52),y) -EXTRA_CFLAGS += -DRT3052 -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_RT5350),y) -EXTRA_CFLAGS += -DRT5350 -DRT305x -DRTMP_RF_RW_SUPPORT -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_RT6352),y) -EXTRA_CFLAGS += -DRT6352 -DRTMP_RF_RW_SUPPORT -DRF_BANK -DRTMP_FLASH_SUPPORT -DCONFIG_SWMCU_SUPPORT -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DLOFT_IQ_CAL_SUPPORT -EXTRA_CFLAGS += -DRTMP_TEMPERATURE_CALIBRATION -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -#EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_MT7620),y) -EXTRA_CFLAGS += -DRT6352 -DRTMP_RF_RW_SUPPORT -DRF_BANK -DRTMP_FLASH_SUPPORT -DCONFIG_SWMCU_SUPPORT -EXTRA_CFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DLOFT_IQ_CAL_SUPPORT -EXTRA_CFLAGS += -DRTMP_TEMPERATURE_CALIBRATION -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -#EXTRA_CFLAGS += -DSPECIFIC_TX_POWER_SUPPORT -#EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_DLS),y) -EXTRA_CFLAGS += -DQOS_DLS_SUPPORT -EXTRA_CFLAGS += -DAP_DLS_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_IDS),y) -EXTRA_CFLAGS += -DIDS_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_DFS),y) -EXTRA_CFLAGS += -DDFS_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_CARRIER),y) -EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AUTO_CH_SELECT_ENCANCE),y) -EXTRA_CFLAGS += -DAUTO_CH_SELECT_ENHANCE -endif - -ifeq ($(CONFIG_RT2860V2_AP_80211N_DRAFT3),y) -EXTRA_CFLAGS += -DDOT11N_DRAFT3 -endif - -#ifeq ($(CONFIG_SINGLE_SKU),y) -#EXTRA_CFLAGS += -DSINGLE_SKU -#endif - -ifeq ($(CONFIG_RT2860V2_SNMP),y) -EXTRA_CFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_MCAST_RATE_SPECIFIC),y) -EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(CONFIG_RT2860V2_AP_WMM_ACM),y) -EXTRA_CFLAGS += -DWMM_ACM_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_PMF),y) -EXTRA_CFLAGS += -DDOT11W_PMF_SUPPORT -DSOFT_ENCRYPT -endif - -ifeq ($(CONFIG_RT2860V2_AP_LED),y) -EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -DCONFIG_SWMCU_SUPPORT -ifeq ($(CONFIG_RT2860V2_AP_WSC),y) -EXTRA_CFLAGS += -DWSC_LED_SUPPORT -endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_NINTENDO),y) -EXTRA_CFLAGS += -DNINTENDO_AP -endif - -ifeq ($(CONFIG_RT2860V2_AP_WSC),y) -EXTRA_CFLAGS += -DWSC_AP_SUPPORT -ifeq ($(CONFIG_RT2860V2_AP_WSC_V2),y) -EXTRA_CFLAGS += -DWSC_V2_SUPPORT -endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_LLTD),y) -EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_WDS),y) -EXTRA_CFLAGS += -DWDS_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_MBSS),y) -EXTRA_CFLAGS += -DMBSS_SUPPORT -endif - -ifeq ($(CONFIG_NEW_MBSSID_MODE),y) -EXTRA_CFLAGS += -DNEW_MBSSID_MODE -ifeq ($(CONFIG_RALINK_RT6352),y) -EXTRA_CFLAGS += -DENHANCE_NEW_MBSSID_MODE -endif -ifeq ($(CONFIG_RALINK_MT7620),y) -EXTRA_CFLAGS += -DENHANCE_NEW_MBSSID_MODE -endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_APCLI),y) -EXTRA_CFLAGS += -DAPCLI_SUPPORT -EXTRA_CFLAGS += -DMAT_SUPPORT -ifeq ($(CONFIG_RALINK_MT7620),y) -EXTRA_CFLAGS += -DMAC_APCLI_SUPPORT -endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_MAC_REPEATER),y) -EXTRA_CFLAGS += -DMAC_REPEATER_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_32B_DESC),y) -EXTRA_CFLAGS += -DDESC_32B_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_IGMP_SNOOP),y) -EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_NETIF_BLOCK),y) -EXTRA_CFLAGS += -DBLOCK_NET_IF -endif - -ifeq ($(CONFIG_RT2860V2_AP_MESH),y) -EXTRA_CFLAGS += -DMESH_SUPPORT -DINTEL_CMPC -endif - -ifeq ($(CONFIG_RT2860V2_HW_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_WAPI),y) -EXTRA_CFLAGS += -DWAPI_SUPPORT -ifeq ($(CONFIG_RALINK_RT3052),y) -EXTRA_CFLAGS += -DSOFT_ENCRYPT -endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_COC),y) -EXTRA_CFLAGS += -DGREENAP_SUPPORT -DCOC_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y) -EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(CONFIG_RT2860V2_AP_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -EXTRA_CFLAGS += -DDBG -endif - -ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y) -EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT -endif - -ifeq ($(CONFIG_RA_NETWORK_WORKQUEUE_BH),y) -EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - -ifeq ($(CONFIG_RT2860V2_AP_INTELLIGENT_RATE_ADAPTION),y) -EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -#ifeq ($(CONFIG_RT2860V2_AP_RTMP_TEMPERATURE_CALIBRATION),y) -#ifeq ($(CONFIG_RALINK_MT7620),y) -#EXTRA_CFLAGS += -DRTMP_TEMPERATURE_CALIBRATION -#endif -#endif - -ifeq ($(CONFIG_RT2860V2_SINGLE_SKU),y) -EXTRA_CFLAGS += -DSINGLE_SKU_V2 -endif - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.sta.soc b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.sta.soc deleted file mode 100644 index cb64ac2870..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/Makefile.sta.soc +++ /dev/null @@ -1,275 +0,0 @@ -EXTRA_CFLAGS = -Idrivers/net/wireless/rt2860v2/include -Idrivers/net/wireless/rt2860v2/ate/include - -obj-$(CONFIG_RT2860V2_STA) += rt2860v2_sta.o - -rt2860v2_sta-objs += ../rt2860v2/common/crypt_md5.o -rt2860v2_sta-objs += ../rt2860v2/common/crypt_sha2.o -rt2860v2_sta-objs += ../rt2860v2/common/crypt_hmac.o -rt2860v2_sta-objs += ../rt2860v2/common/mlme.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_wep.o -rt2860v2_sta-objs += ../rt2860v2/common/action.o -rt2860v2_sta-objs += ../rt2860v2/common/ba_action.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_data.o -rt2860v2_sta-objs += ../rt2860v2/common/rtmp_init.o -rt2860v2_sta-objs += ../rt2860v2/common/rtmp_init_inf.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_tkip.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_aes.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_sync.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_sanity.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_info.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_wpa.o -rt2860v2_sta-objs += ../rt2860v2/common/dfs.o -#rt2860v2_sta-objs += ../rt2860v2/common/dfs_mcu.o -rt2860v2_sta-objs += ../rt2860v2/common/spectrum.o -rt2860v2_sta-objs += ../rt2860v2/common/rt_os_util.o - -rt2860v2_sta-objs += ../rt2860v2/common/rtmp_timer.o -rt2860v2_sta-objs += ../rt2860v2/common/rt_channel.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_profile.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_asic.o -rt2860v2_sta-objs += ../rt2860v2/common/rtmp_swmcu.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_cfg.o -rt2860v2_sta-objs += ../rt2860v2/common/eeprom.o -rt2860v2_sta-objs += ../rt2860v2/common/ee_flash.o -#rt2860v2_sta-objs += ../rt2860v2/common/rtmp_mcu.o - -rt2860v2_sta-objs += ../rt2860v2/common/cmm_mac_pci.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_data_pci.o -rt2860v2_sta-objs += ../rt2860v2/common/crypt_aes.o -rt2860v2_sta-objs += ../rt2860v2/common/crypt_arc4.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_cmd.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_wpa_adhoc.o - -rt2860v2_sta-objs += ../rt2860v2/sta/assoc.o -rt2860v2_sta-objs += ../rt2860v2/sta/auth.o -rt2860v2_sta-objs += ../rt2860v2/sta/auth_rsp.o -rt2860v2_sta-objs += ../rt2860v2/sta/sync.o -rt2860v2_sta-objs += ../rt2860v2/sta/sanity.o -rt2860v2_sta-objs += ../rt2860v2/sta/sta_data.o -rt2860v2_sta-objs += ../rt2860v2/sta/connect.o -rt2860v2_sta-objs += ../rt2860v2/sta/wpa.o -rt2860v2_sta-objs += ../rt2860v2/sta/sta_cfg.o - -rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_proc.o -rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_linux.o -rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_profile.o -rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_main_dev.o -rt2860v2_sta-objs += ../rt2860v2/os/linux/sta_ioctl.o -rt2860v2_sta-objs += ../rt2860v2/common/rt_ate.o -rt2860v2_sta-objs += ../rt2860v2/chips/rtmp_chip.o - -rt2860v2_sta-objs += ../rt2860v2/os/linux/rbus_main_dev.o -rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_pci_rbus.o -rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_rbus_pci_util.o -rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_rbus_pci_drv.o - -ifeq ($(CONFIG_RALINK_RT2880),y) -rt2860v2_sta-objs += ../rt2860v2/chips/rt2880.o -endif - -ifeq ($(CONFIG_RALINK_RT3052),y) -rt2860v2_sta-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_sta-objs += ../rt2860v2/chips/rt305x.o -endif - -ifeq ($(CONFIG_RALINK_RT3352),y) -rt2860v2_sta-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_sta-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_sta-objs += ../rt2860v2/chips/rt3352.o -endif - -ifeq ($(CONFIG_RT3x52),y) -rt2860v2_sta-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_sta-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_sta-objs += ../rt2860v2/chips/rt3352.o -endif - -ifeq ($(CONFIG_RALINK_RT5350),y) -rt2860v2_sta-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_sta-objs += ../rt2860v2/chips/rt305x.o -rt2860v2_sta-objs += ../rt2860v2/chips/rt5350.o -endif - -ifeq ($(CONFIG_RALINK_RT3883),y) -rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o -rt2860v2_ap-objs += ../rt2860v2/chips/rt3883.o -ifeq ($(CONFIG_RT2860V2_STA_TXBF),y) -rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf.o -rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf_cal.o -endif -endif - -ifeq ($(CONFIG_RT2860V2_STA_LED),y) -rt2860v2_sta-objs += ../rt2860v2/common/rt_led.o -endif - -ifeq ($(CONFIG_RT2860V2_STA_WMM_ACM),y) -rt2860v2_sta-objs += ../rt2860v2/common/acm_edca.o -rt2860v2_sta-objs += ../rt2860v2/common/acm_comm.o -rt2860v2_sta-objs += ../rt2860v2/common/acm_iocl.o -endif - -#ifeq ($(CONFIG_RT2860V2_STA_WAPI),y) -#rt2860v2_sta-objs += wapi.obj -#rt2860v2_sta-objs += wapi_sms4.obj -#rt2860v2_sta-objs += wapi_crypt.obj -#endif - -#ifeq ($(CONFIG_RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY),y) -#rt2860v2_sta-objs += ../rt2860v2/os/linux/ap_diversity.o -#endif - -ifeq ($(CONFIG_RT2860V2_STA_MESH),y) -rt2860v2_sta-objs += ../rt2860v2/common/mesh_bmpkt.o -rt2860v2_sta-objs += ../rt2860v2/common/mesh_ctrl.o -rt2860v2_sta-objs += ../rt2860v2/common/mesh_link_mng.o -rt2860v2_sta-objs += ../rt2860v2/common/mesh_sanity.o -rt2860v2_sta-objs += ../rt2860v2/common/mesh_tlv.o -rt2860v2_sta-objs += ../rt2860v2/common/mesh.o -rt2860v2_sta-objs += ../rt2860v2/common/mesh_inf.o -rt2860v2_sta-objs += ../rt2860v2/common/mesh_forwarding.o -rt2860v2_sta-objs += ../rt2860v2/common/mesh_path_mng.o -endif - -ifeq ($(CONFIG_RT2860V2_STA_DLS),y) -rt2860v2_sta-objs += ../rt2860v2/sta/dls.o -endif - -ifeq ($(CONFIG_RT2860V2_STA_WSC),y) -rt2860v2_sta-objs += ../rt2860v2/common/wsc.o -rt2860v2_sta-objs += ../rt2860v2/common/wsc_tlv.o -rt2860v2_sta-objs += ../rt2860v2/common/crypt_biginteger.o -rt2860v2_sta-objs += ../rt2860v2/common/crypt_dh.o -endif - -ifeq ($(CONFIG_RT2860V2_STA_ETH_CONVERT),y) -rt2860v2_sta-objs += ../rt2860v2/common/cmm_mat.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_iparp.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_pppoe.o -rt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_ipv6.o -endif - -ifeq ($(CONFIG_RT2860V2_STA_VIDEO_TURBINE),y) -rt2860v2_sta-objs += ../rt2860v2/common/cmm_video.o -endif - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wall -Wstrict-prototypes -Wno-trigraphs - -EXTRA_CFLAGS += -DCONFIG_STA_SUPPORT -DDBG -DRTMP_RBUS_SUPPORT -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DSTATS_COUNT_SUPPORT -DRELASE_EXCLUDE -EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DNEW_TXCONT -DNEW_TXCARRSUPP -DCONFIG_RT2880_ATE_CMD_NEW - -ifeq ($(CONFIG_RALINK_RT2880),y) -EXTRA_CFLAGS += -DRT2880 -endif - -ifeq ($(CONFIG_RALINK_RT3052),y) -ifeq ($(CONFIG_RALINK_RT3350),y) -EXTRA_CFLAGS += -DRT3350 -DRT305x -DRTMP_RF_RW_SUPPORT -else -EXTRA_CFLAGS += -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT -endif -endif - -ifeq ($(CONFIG_RALINK_RT3352),y) -EXTRA_CFLAGS += -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RT3x52),y) -EXTRA_CFLAGS += -DRT3052 -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_RT5350),y) -EXTRA_CFLAGS += -DRT5350 -DRT305x -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -endif - -ifeq ($(CONFIG_RALINK_RT3883),y) -EXTRA_CFLAGS += -DRT3883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT -ifeq ($(CONFIG_RT2860V2_AP_TXBF),y) -EXTRA_CFLAGS += -DTXBF_SUPPORT -endif -EXTRA_CFLAGS += -DSTREAM_MODE_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_STA_WPA_SUPPLICANT),y) -EXTRA_CFLAGS += -DWPA_SUPPLICANT_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_STA_WMM_ACM),y) -EXTRA_CFLAGS += -DWMM_ACM_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_STA_LED),y) -EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -DCONFIG_SWMCU_SUPPORT -ifeq ($(CONFIG_RT2860V2_STA_WSC),y) -EXTRA_CFLAGS += -DWSC_LED_SUPPORT -endif -endif - -ifeq ($(CONFIG_RT2860V2_SNMP),y) -EXTRA_CFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_STA_CARRIER),y) -EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y) -EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(CONFIG_RT2860V2_STA_IDS),y) -EXTRA_CFLAGS += -DIDS_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_STA_DLS),y) -EXTRA_CFLAGS += -DQOS_DLS_SUPPORT -endif - -#ifeq ($(CONFIG_RT2860V2_STA_WAPI),y) -#EXTRA_CFLAGS += -DWAPI_SUPPORT -#ifeq ($(CONFIG_RALINK_RT3052),y) -#EXTRA_CFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT -#endif -#endif - -ifeq ($(CONFIG_RT2860V2_STA_MESH),y) -EXTRA_CFLAGS += -DMESH_SUPPORT -DINTEL_CMPC -endif - -ifeq ($(CONFIG_RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DRT3XXX_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_HW_STA_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_STA_WSC),y) -EXTRA_CFLAGS += -DWSC_STA_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_STA_ETH_CONVERT),y) -EXTRA_CFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_STA_VIDEO_TURBINE),y) -EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT -endif - -ifeq ($(CONFIG_RA_NETWORK_WORKQUEUE_BH),y) -EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - -ifeq ($(CONFIG_RT2860V2_STA_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -ifeq ($(CONFIG_RT2860V2_STA_80211N_DRAFT3),y) -EXTRA_CFLAGS += -DDOT11N_DRAFT3 -endif - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/android_priv_cmd.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/android_priv_cmd.c deleted file mode 100644 index 781bdbec80..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/android_priv_cmd.c +++ /dev/null @@ -1,119 +0,0 @@ - -#define RTMP_MODULE_OS - -#include "rt_config.h" -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" - -#ifdef RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT - -#define ANDROID_CMD_P2P_DEV_ADDR "P2P_DEV_ADDR" -#define ANDROID_CMD_SET_AP_WPS_P2P_IE "SET_AP_WPS_P2P_IE" - -typedef struct android_priv_cmd { - char *buf; - int used_len; - int total_len; -} android_priv_cmd; - -static INT priv_cmd_get_p2p_dev_addr(PNET_DEV net_dev, PCHAR command, - INT total_len) -{ - VOID *pAdSrc; - - pAdSrc = RTMP_OS_NETDEV_GET_PRIV(net_dev); - ASSERT(pAdSrc); - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - INT bytes_written = 0; - - COPY_MAC_ADDR(command, pAd->cfg80211_ctrl.P2PCurrentAddress, - MAC_ADDR_LEN); - bytes_written = MAC_ADDR_LEN; - return bytes_written; -} - -static INT priv_cmd_set_ap_wps_p2p_ie(PNET_DEV net_dev, PCHAR buf, INT len, - INT type) -{ - /* 0x1: BEACON */ - /* 0x2: PROBE_RESP */ - /* 0x4: ASSOC_RESP */ - INT ret = 0; - return ret; -} - -int rt_android_private_command_entry(VOID *pAdSrc, PNET_DEV net_dev, - struct ifreq *ifr, INT cmd) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - android_priv_cmd priv_cmd; - UCHAR *command = NULL; - INT ret = 0, bytes_written = 0; - - if (!ifr->ifr_data) - return -EINVAL; - - if (copy_from_user(&priv_cmd, ifr->ifr_data, - sizeof(android_wifi_priv_cmd))) - return -EFAULT; - - os_alloc_mem(NULL, (UCHAR **)&command, priv_cmd.total_len); - - if (!command) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: MEM ALLOC ERROR\n", __func__)); - return -ENOMEM; - } - - if (copy_from_user(command, priv_cmd.buf, priv_cmd.total_len)) { - ret = -EFAULT; - goto FREE; - } - - if (strnicmp(command, ANDROID_CMD_SET_AP_WPS_P2P_IE, - strlen(ANDROID_CMD_SET_AP_WPS_P2P_IE)) == 0) { - int skip = strlen(ANDROID_CMD_SET_AP_WPS_P2P_IE) + 3; - - bytes_written = - priv_cmd_set_ap_wps_p2p_ie(net_dev, command + skip, - priv_cmd.total_len - skip, - *(command + skip - 2) - '0'); - } else if (strnicmp(command, ANDROID_CMD_P2P_DEV_ADDR, - strlen(ANDROID_CMD_P2P_DEV_ADDR)) == 0) - bytes_written = priv_cmd_get_p2p_dev_addr(net_dev, command, - priv_cmd.total_len); - else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: unsupport priv_cmd !!!\n", command)); - snprintf(command, 3, "OK"); - bytes_written = strlen("OK"); - } - -RESPONSE: - - if (bytes_written >= 0) { - /* priv_cmd in but no response */ - if ((bytes_written == 0) && (priv_cmd.total_len > 0)) - command[0] = '\0'; - - if (bytes_written >= priv_cmd.total_len) - bytes_written = priv_cmd.total_len; - else - bytes_written++; - - priv_cmd.used_len = bytes_written; - - if (copy_to_user(priv_cmd.buf, command, bytes_written)) - ret = -EFAULT; - } else - ret = bytes_written; - -FREE: - - if (command) - os_free_mem(command); - - return ret; -} -#endif /* RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/ap_ioctl.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/ap_ioctl.c deleted file mode 100644 index 2917edbd37..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/ap_ioctl.c +++ /dev/null @@ -1,519 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - ap_ioctl.c - - Abstract: - IOCTL related subroutines - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- -*/ -#define RTMP_MODULE_OS - -/*#include "rt_config.h" */ -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" -#include -#include "rtmp_def.h" - -struct iw_priv_args ap_privtab[] = { - { RTPRIV_IOCTL_SET, - /* 1024 --> 1024 + 512 */ - /* larger size specific to allow 64 ACL MAC addresses to be set up all at once. */ - IW_PRIV_TYPE_CHAR | 1536, 0, "set" }, - { RTPRIV_IOCTL_SHOW, IW_PRIV_TYPE_CHAR | 1024, 0, "show" }, - { RTPRIV_IOCTL_GSITESURVEY, IW_PRIV_TYPE_CHAR | 1024, - IW_PRIV_TYPE_CHAR | 1024, "get_site_survey" }, - { RTPRIV_IOCTL_SET_WSCOOB, IW_PRIV_TYPE_CHAR | 1024, - IW_PRIV_TYPE_CHAR | 1024, "set_wsc_oob" }, - { RTPRIV_IOCTL_GET_MAC_TABLE, IW_PRIV_TYPE_CHAR | 1024, - IW_PRIV_TYPE_CHAR | 1024, "get_mac_table" }, - { RTPRIV_IOCTL_GET_DRIVER_INFO, IW_PRIV_TYPE_CHAR | 1024, - IW_PRIV_TYPE_CHAR | 1024, "get_driverinfo" }, - { RTPRIV_IOCTL_E2P, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, - "e2p" }, -#if defined(DBG) || (defined(BB_SOC) && defined(CONFIG_ATE)) - { RTPRIV_IOCTL_BBP, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, - "bbp" }, - { RTPRIV_IOCTL_MAC, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, - "mac" }, -#ifdef RTMP_RF_RW_SUPPORT - { RTPRIV_IOCTL_RF, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, - "rf" }, -#endif /* RTMP_RF_RW_SUPPORT */ -#endif /* defined(DBG) ||(defined(BB_SOC) && defined(CONFIG_ATE)) */ - -#ifdef WSC_AP_SUPPORT - { RTPRIV_IOCTL_WSC_PROFILE, IW_PRIV_TYPE_CHAR | 1024, - IW_PRIV_TYPE_CHAR | 1024, "get_wsc_profile" }, -#endif /* WSC_AP_SUPPORT */ - { RTPRIV_IOCTL_QUERY_BATABLE, IW_PRIV_TYPE_CHAR | 1024, - IW_PRIV_TYPE_CHAR | 1024, "get_ba_table" }, - { RTPRIV_IOCTL_STATISTICS, IW_PRIV_TYPE_CHAR | 1024, - IW_PRIV_TYPE_CHAR | 1024, "stat" }, - { MTPRIV_IOCTL_RD, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, - "rd" }, - { RTPRIV_IOCTL_RX_STATISTICS, IW_PRIV_TYPE_CHAR | 1024, - IW_PRIV_TYPE_CHAR | 1024, "rx" } -}; - -#ifdef CONFIG_APSTA_MIXED_SUPPORT -const struct iw_handler_def rt28xx_ap_iw_handler_def = { -#define N(a) (sizeof(a) / sizeof(a[0])) -#ifdef CONFIG_WEXT_PRIV - .private_args = (struct iw_priv_args *)ap_privtab, - .num_private_args = N(ap_privtab), -#endif /* CONFIG_WEXT_PRIV */ -#if IW_HANDLER_VERSION >= 7 - .get_wireless_stats = rt28xx_get_wireless_stats, -#endif -}; -#endif /* CONFIG_APSTA_MIXED_SUPPORT */ - -INT rt28xx_ap_ioctl(struct net_device *net_dev, struct ifreq *rq, int cmd) -{ - VOID *pAd = NULL; - struct iwreq *wrqin = (struct iwreq *)rq; - RTMP_IOCTL_INPUT_STRUCT rt_wrq, *wrq = &rt_wrq; - INT Status = NDIS_STATUS_SUCCESS; - USHORT subcmd; - INT apidx = 0; - UINT32 org_len; - RT_CMD_AP_IOCTL_CONFIG IoctlConfig, *pIoctlConfig = &IoctlConfig; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) { - /* if 1st open fail, pAd will be free; - * So the net_dev->priv will be NULL in 2rd open - */ - return -ENETDOWN; - } - memcpy(wrq->ifr_ifrn.ifrn_name, wrqin->ifr_ifrn.ifrn_name, IFNAMSIZ); - - wrq->u.data.pointer = wrqin->u.data.pointer; - wrq->u.data.length = wrqin->u.data.length; - org_len = wrq->u.data.length; - pIoctlConfig->Status = 0; - pIoctlConfig->net_dev = net_dev; - pIoctlConfig->wdev = RTMP_OS_NETDEV_GET_WDEV(net_dev); - pIoctlConfig->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev); - pIoctlConfig->pCmdData = wrqin->u.data.pointer; - pIoctlConfig->CmdId_RTPRIV_IOCTL_SET = RTPRIV_IOCTL_SET; - pIoctlConfig->name = net_dev->name; - pIoctlConfig->apidx = 0; - - if ((cmd != SIOCGIWPRIV) && - RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_PREPARE, 0, - pIoctlConfig, 0) != NDIS_STATUS_SUCCESS) { - /* prepare error */ - Status = pIoctlConfig->Status; - goto LabelExit; - } - - apidx = pIoctlConfig->apidx; - - /*+ patch for SnapGear Request even the interface is down */ - if (cmd == SIOCGIWNAME) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IOCTL::SIOCGIWNAME\n")); - RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_SIOCGIWNAME, 0, - wrqin->u.name, 0); - return Status; - } /*- patch for SnapGear */ - - switch (cmd) { -#ifdef WCX_SUPPORT -#else - - case RTPRIV_IOCTL_ATE: { - RTMP_COM_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_ATE, 0, - wrqin->ifr_name, 0); - } break; -#endif - -#ifdef DYNAMIC_VLAN_SUPPORT - case RTPRIV_IOCTL_STA_VLAN: { - RT_CMD_AP_STA_VLAN sta_vlan_param; - struct iw_point *erq = &wrqin->u.data; - if (erq->pointer) { - if (copy_from_user(&sta_vlan_param, erq->pointer, - erq->length)) { - Status = -EFAULT; - } else { - printk("STA Addr %02x %02x %02x %02x %02x %02x Vlan ID %d \n", - sta_vlan_param.sta_addr[0], - sta_vlan_param.sta_addr[1], - sta_vlan_param.sta_addr[2], - sta_vlan_param.sta_addr[3], - sta_vlan_param.sta_addr[4], - sta_vlan_param.sta_addr[5], - sta_vlan_param.vlan_id); - RTMP_AP_IoctlHandle( - pAd, wrq, CMD_RTPRIV_IOCTL_SET_STA_VLAN, - 0, &sta_vlan_param, - sizeof(RT_CMD_AP_STA_VLAN)); - } - } - } -#endif - -#ifdef HOSTAPD_11R_SUPPORT - case RTPRIV_IOCTL_SET_FT_PARAM: { - RT_CMD_AP_11R_PARAM ap_11r_params; - struct iw_point *erq = &wrqin->u.data; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("set ft param ioctl call: length:%d\n", erq->length)); - if (erq->length <= 12) { - Status = 0; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("set ft param ioctl call failed due to length:%d\n", - erq->length)); - } else { - if (erq->pointer) { - if (copy_from_user(&ap_11r_params, erq->pointer, - erq->length)) - Status = -EFAULT; - else { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("call CMD_RTPRIV_IOCTL_SET_FT_PARAM\n")); - RTMP_AP_IoctlHandle( - pAd, wrq, - CMD_RTPRIV_IOCTL_SET_FT_PARAM, - 0, &ap_11r_params, - sizeof(RT_CMD_AP_11R_PARAM)); - } - } - } - } break; -#endif /* HOSTAPD_11R_SUPPORT */ - - case SIOCGIFHWADDR: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("IOCTLIOCTLIOCTL::SIOCGIFHWADDR\n")); - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR, - 0, NULL, 0); - /* if (pObj->ioctl_if < MAX_MBSSID_NUM(pAd)) */ - /* strcpy((RTMP_STRING *) wrq->u.name, (RTMP_STRING *) pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid); */ - break; - - case SIOCSIWESSID: /*Set ESSID */ - break; - - case SIOCGIWESSID: { /*Get ESSID */ - RT_CMD_AP_IOCTL_SSID IoctlSSID, *pIoctlSSID = &IoctlSSID; - struct iw_point *erq = &wrqin->u.essid; - PCHAR pSsidStr = NULL; - - erq->flags = 1; - /*erq->length = pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen; */ - pIoctlSSID->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev); - pIoctlSSID->apidx = apidx; - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIWESSID, - 0, pIoctlSSID, 0); - pSsidStr = (PCHAR)pIoctlSSID->pSsidStr; - erq->length = pIoctlSSID->length; - - if ((erq->pointer) && (pSsidStr != NULL)) { - /*if(copy_to_user(erq->pointer, pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid, erq->length)) */ - if (copy_to_user(erq->pointer, pSsidStr, erq->length)) { - Status = RTMP_IO_EFAULT; - break; - } - } - - /* The below code tries to access user space buffer directly, - * hence remove it . - */ - } break; - - case SIOCGIWNWID: /* get network id */ - case SIOCSIWNWID: /* set network id (the cell) */ - Status = RTMP_IO_EOPNOTSUPP; - break; - - case SIOCGIWFREQ: { /* get channel/frequency (Hz) */ - ULONG Channel; - - RTMP_DRIVER_CHANNEL_GET(pAd, pIoctlConfig->apidx, &Channel); - wrqin->u.freq.m = Channel; /*wdev->channel; */ - wrqin->u.freq.e = 0; - wrqin->u.freq.i = 0; - } break; - - case SIOCSIWFREQ: /*set channel/frequency (Hz) */ - Status = RTMP_IO_EOPNOTSUPP; - break; - - case SIOCGIWNICKN: - case SIOCSIWNICKN: /*set node name/nickname */ - Status = RTMP_IO_EOPNOTSUPP; - break; - - case SIOCGIWRATE: { /*get default bit rate (bps) */ - RT_CMD_IOCTL_RATE IoctlRate, *pIoctlRate = &IoctlRate; - - pIoctlRate->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev); - RTMP_DRIVER_BITRATE_GET(pAd, pIoctlRate); - wrqin->u.bitrate.value = pIoctlRate->BitRate; - wrqin->u.bitrate.disabled = 0; - } break; - - case SIOCSIWRATE: /*set default bit rate (bps) */ - case SIOCGIWRTS: /* get RTS/CTS threshold (bytes) */ - case SIOCSIWRTS: /*set RTS/CTS threshold (bytes) */ - case SIOCGIWFRAG: /*get fragmentation thr (bytes) */ - case SIOCSIWFRAG: /*set fragmentation thr (bytes) */ - case SIOCGIWENCODE: /*get encoding token & mode */ - case SIOCSIWENCODE: /*set encoding token & mode */ - Status = RTMP_IO_EOPNOTSUPP; - break; - - case SIOCGIWAP: { /*get access point MAC addresses */ - /* PCHAR pBssidStr; */ - wrqin->u.ap_addr.sa_family = ARPHRD_ETHER; - /*memcpy(wrqin->u.ap_addr.sa_data, &pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid, ETH_ALEN); */ - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIWAP, 0, - wrqin->u.ap_addr.sa_data, - RT_DEV_PRIV_FLAGS_GET(net_dev)); - } break; - - case SIOCGIWMODE: /*get operation mode */ - if (RT_DEV_PRIV_FLAGS_GET(net_dev) == INT_APCLI) - wrqin->u.mode = IW_MODE_INFRA; /* ApCli Mode. */ - else - wrqin->u.mode = IW_MODE_MASTER; /* AP Mode. */ - break; - - case SIOCSIWAP: /*set access point MAC addresses */ - case SIOCSIWMODE: /*set operation mode */ - case SIOCGIWSENS: /*get sensitivity (dBm) */ - case SIOCSIWSENS: /*set sensitivity (dBm) */ - case SIOCGIWPOWER: /*get Power Management settings */ - case SIOCSIWPOWER: /*set Power Management settings */ - case SIOCGIWTXPOW: /*get transmit power (dBm) */ - case SIOCSIWTXPOW: /*set transmit power (dBm) */ - - /*case SIOCGIWRANGE: //Get range of parameters */ - case SIOCGIWRETRY: /*get retry limits and lifetime */ - case SIOCSIWRETRY: /*set retry limits and lifetime */ - Status = RTMP_IO_EOPNOTSUPP; - break; - - case SIOCGIWRANGE: { /*Get range of parameters */ - /* struct iw_range range; */ - struct iw_range *prange = NULL; - UINT32 len; - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&prange, sizeof(struct iw_range)); - - if (prange == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", __func__)); - break; - } - - memset(prange, 0, sizeof(struct iw_range)); - prange->we_version_compiled = WIRELESS_EXT; - prange->we_version_source = 14; - /* - * what is correct max? This was not - * documented exactly. At least - * 69 has been observed. - */ - prange->max_qual.qual = 100; - prange->max_qual.level = 0; /* dB */ - prange->max_qual.noise = 0; /* dB */ - len = copy_to_user(wrq->u.data.pointer, prange, - sizeof(struct iw_range)); - os_free_mem(prange); - } break; - - case RT_PRIV_IOCTL: - case RT_PRIV_IOCTL_EXT: { - subcmd = wrqin->u.data.flags; - Status = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RT_PRIV_IOCTL, - subcmd, wrqin->u.data.pointer, 0); - } break; -#ifdef HOSTAPD_SUPPORT - - case SIOCSIWGENIE: - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ioctl SIOCSIWGENIE apidx=%d\n", apidx)); - - /* The below code tries to access user space buffer directly, - * hence remove it . */ - RTMP_AP_IoctlHandle(pAd, wrqin, - CMD_RTPRIV_IOCTL_AP_SIOCSIWGENIE, 0, NULL, - 0); - break; -#endif /* HOSTAPD_SUPPORT */ - - case SIOCGIWPRIV: - if (wrqin->u.data.pointer) { - if (access_ok(wrqin->u.data.pointer, - sizeof(ap_privtab)) != TRUE) - break; - - if ((sizeof(ap_privtab) / sizeof(ap_privtab[0])) <= - wrq->u.data.length) { - wrqin->u.data.length = sizeof(ap_privtab) / - sizeof(ap_privtab[0]); - - if (copy_to_user(wrqin->u.data.pointer, - ap_privtab, - sizeof(ap_privtab))) - Status = RTMP_IO_EFAULT; - } else - Status = RTMP_IO_E2BIG; - } - - break; - - case RTPRIV_IOCTL_SET: { - if (access_ok(wrqin->u.data.pointer, wrqin->u.data.length) == - TRUE) - Status = RTMP_AP_IoctlHandle( - pAd, wrq, CMD_RTPRIV_IOCTL_SET, 0, NULL, 0); - } break; - - case RTPRIV_IOCTL_SHOW: { - if (access_ok(wrqin->u.data.pointer, wrqin->u.data.length) == - TRUE) - Status = RTMP_AP_IoctlHandle( - pAd, wrq, CMD_RTPRIV_IOCTL_SHOW, 0, NULL, 0); - } break; -#ifdef WSC_AP_SUPPORT - - case RTPRIV_IOCTL_SET_WSCOOB: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_SET_WSCOOB, 0, - NULL, 0); - break; -#endif /*WSC_AP_SUPPORT*/ - - /* modified by Red@Ralink, 2009/09/30 */ - case RTPRIV_IOCTL_GET_MAC_TABLE: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_MAC_TABLE, 0, - NULL, 0); - break; - - case RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT: - RTMP_AP_IoctlHandle(pAd, wrq, - CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT, 0, - NULL, 0); - break; - /* end of modification */ - - case RTPRIV_IOCTL_GET_DRIVER_INFO: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_DRIVER_INFO, - 0, NULL, 0); - break; - -#ifdef AP_SCAN_SUPPORT - - case RTPRIV_IOCTL_GSITESURVEY: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GSITESURVEY, 0, - NULL, 0); - break; -#endif /* AP_SCAN_SUPPORT */ - - case RTPRIV_IOCTL_STATISTICS: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_STATISTICS, 0, - NULL, 0); - break; - - case MTPRIV_IOCTL_RD: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_MTPRIV_IOCTL_RD, 0, NULL, 0); - break; - - case RTPRIV_IOCTL_RX_STATISTICS: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_RX_STATISTICS, 0, - NULL, 0); - break; -#ifdef WSC_AP_SUPPORT - - case RTPRIV_IOCTL_WSC_PROFILE: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_WSC_PROFILE, 0, - NULL, 0); - break; -#endif /* WSC_AP_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - case RTPRIV_IOCTL_QUERY_BATABLE: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_QUERY_BATABLE, 0, - NULL, 0); - break; -#endif /* DOT11_N_SUPPORT */ - - case RTPRIV_IOCTL_E2P: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_E2P, 0, NULL, 0); - break; -#if defined(DBG) || (defined(BB_SOC) && defined(CONFIG_ATE)) - case RTPRIV_IOCTL_BBP: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_BBP, 0, NULL, 0); - break; - - case RTPRIV_IOCTL_MAC: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_MAC, 0, NULL, 0); - break; -#ifdef RTMP_RF_RW_SUPPORT - - case RTPRIV_IOCTL_RF: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_RF, 0, NULL, 0); - break; -#endif /* RTMP_RF_RW_SUPPORT */ -#endif /* defined(DBG) ||(defined(BB_SOC) && defined(CONFIG_ATE)) */ - -#ifdef WIFI_DIAG - case RTPRIV_IOCTL_GET_PROCESS_INFO: - RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_PROCESS_INFO, - 0, NULL, 0); - break; -#endif - - default: - /* MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("IOCTL::unknown IOCTL's cmd = 0x%08x\n", cmd)); */ - Status = RTMP_IO_EOPNOTSUPP; - break; - } - -LabelExit: - - if (Status != 0) { - RT_CMD_STATUS_TRANSLATE(Status); - } else { - /* - * If wrq length is modified, we reset the lenght of origin wrq; - * - * Or we can not modify it because the address of wrq->u.data.length - * maybe same as other union field, ex: iw_range, etc. - * - * if the length is not changed but we change it, the value for other - * union will also be changed, this is not correct. - */ - if (wrq->u.data.length != org_len) - wrqin->u.data.length = wrq->u.data.length; - } - - return Status; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/bb_soc.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/bb_soc.c deleted file mode 100644 index d6a177e48e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/bb_soc.c +++ /dev/null @@ -1,200 +0,0 @@ -#include "rt_config.h" - -#include "os/bb_soc.h" -/* #include "rtmp_timer.h" */ -/* #include "rt_config.h" */ -#ifdef WSC_AP_SUPPORT -extern int wscTimerRunning; -extern int wscStatus; -extern int statusprobe; -extern unsigned short wsc_done; -#endif - -/* - * ======================================================================== - * Routine Description: - * Trendchip DMT Trainning status detect - * - * Arguments: - * data Point to RTMP_ADAPTER - * - * Return Value: - * NONE - * ======================================================================== - */ -static UCHAR dslStateChg; -VOID PeriodicPollingModeDetect(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3) -{ - unsigned long irqFlags; - UCHAR modem_status = 0; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; - POS_COOKIE _pObj = (POS_COOKIE)(pAd->OS_Cookie); - - os_TCIfQuery(0x0002, &modem_status, NULL); - - if ((modem_status == 0x08) || (modem_status == 0x10)) { - if (!(dslStateChg & (1 << 0))) { - RTMP_INT_LOCK(&pAd->irq_lock, irqFlags); - dslStateChg |= (1 << 0); - RTMP_INT_UNLOCK(&pAd->irq_lock, irqFlags); - /* disable enterrupt */ - tc3162_disable_irq(_pObj->pci_dev->irq); - } - - schedule_work(&pAd->Pollingmode.PollingDataBH); - /* slow down the POLLING MODE DETECT while the dmt in wait init state */ - /* pAd->PollingModeDetect.expires = jiffies + POLLING_MODE_DETECT_INTV; */ - RTMPModTimer(&pAd->Pollingmode.PollingModeDetect, 10); - pAd->Pollingmode.PollingModeDetectRunning = TRUE; - return; - } - - if (dslStateChg & (1 << 0)) { - tc3162_enable_irq(_pObj->pci_dev->irq); - RTMP_INT_LOCK(&pAd->irq_lock, irqFlags); - dslStateChg &= ~(1 << 0); - RTMP_INT_UNLOCK(&pAd->irq_lock, irqFlags); - } - - RTMPModTimer(&pAd->Pollingmode.PollingModeDetect, - POLLING_MODE_DETECT_INTV); - pAd->Pollingmode.PollingModeDetectRunning = TRUE; -#ifdef WSC_AP_SUPPORT - { - static int lastWscStatus; - PWSC_CTRL pWscControl = - &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl; - - wscTimerRunning = pWscControl->Wsc2MinsTimerRunning; - wscStatus = pWscControl->WscStatus; - - if ((wscStatus == STATUS_WSC_CONFIGURED) && - (lastWscStatus != STATUS_WSC_CONFIGURED)) { -#ifndef LED_WPSSPEC_COMPLY - wsc_done = 10; -#else - wsc_done = 600; -#endif - /* ledTurnOff(LED_WLAN_WPS_ACT_STATUS);//xyyou??? */ - /* ledTurnOn(LED_WLAN_WPS_STATUS); */ - /* ledTurnOn(LED_WLAN_WPS_NOACT_STATUS); */ - } - - lastWscStatus = wscStatus; - } -#endif -} - -VOID PollingModeIsr(struct work_struct *work) -{ - PBBUPollingMode pPollingmode = - container_of(work, BBUPollingMode, PollingDataBH); - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pPollingmode->pAd_va; - struct net_device *net_dev = pAd->net_dev; - - rt2860_interrupt(0, net_dev); -} - -VOID BBUPollingModeClose(IN RTMP_ADAPTER *pAd) -{ - BOOLEAN Cancelled; - - pAd->Pollingmode.PollingModeDetectRunning = FALSE; - RTMPCancelTimer(&pAd->Pollingmode.PollingModeDetect, &Cancelled); -} - -BUILD_TIMER_FUNCTION(PeriodicPollingModeDetect); - -VOID BBUPollingModeInit(IN RTMP_ADAPTER *pAd) -{ - NdisAllocateSpinLock( - &pAd->Pollingmode.PollingModeLock); /* for polling mode */ - RTMPInitTimer(pAd, &pAd->Pollingmode.PollingModeDetect, - GET_TIMER_FUNCTION(PeriodicPollingModeDetect), pAd, - FALSE); - pAd->Pollingmode.PollingModeDetectRunning = FALSE; -} - -VOID BBUPollingModeStart(IN RTMP_ADAPTER *pAd) -{ - if (pAd->Pollingmode.PollingModeDetectRunning == FALSE) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("jiffies=%08lx, POLLING_MODE_DETECT_INTV=%d\r\n", - jiffies, POLLING_MODE_DETECT_INTV)); - RTMPSetTimer(&pAd->Pollingmode.PollingModeDetect, - POLLING_MODE_DETECT_INTV); - } - - /* init a BH task here */ - INIT_WORK(&(pAd->Pollingmode.PollingDataBH), PollingModeIsr); -} - -VOID BBU_PCIE_Init(void) -{ - pcieReset(); - pcieRegInitConfig(); -} - -VOID BBUPrepareMAC(IN RTMP_ADAPTER *pAd, PUCHAR macaddr) -{ - UCHAR FourByteOffset = 0; - UCHAR NWlanExt = 0; - - FourByteOffset = macaddr[5] % 4; - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("\r\nFourByteOffset is %d", FourByteOffset)); - NWlanExt = pAd->ApCfg.BssidNum; - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("\r\nNWlanExt is %d", NWlanExt)); - - switch (NWlanExt) { - case 1: - break; - - case 2: - switch (FourByteOffset) { - case 1: - case 3: - macaddr[5]--; - break; - - case 0: - case 2: - break; - } - - break; - - case 3: - case 4: - switch (FourByteOffset) { - case 0: - break; - - case 1: - macaddr[5]--; - break; - - case 2: - macaddr[5] -= 2; - break; - - case 3: - macaddr[5] -= 3; - break; - } - - break; - - default: - break; - } - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("current MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", macaddr[0], - macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5])); - /*generate bssid from cpe mac address end, merge from linos, 20100208*/ -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/br_ftph.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/br_ftph.c deleted file mode 100644 index 1177efd510..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/br_ftph.c +++ /dev/null @@ -1,182 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - bg_ftph.c - - Abstract: - Provide fast path between LAN and WLAN. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - Sample Lin 01-22-2008 Created - - */ - -#include "rt_config.h" - -#ifdef BG_FT_SUPPORT -#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) -#include -#include "../net/bridge/br_private.h" - -/* extern export symbol in other drivers */ -/* - * Example in other drivers: - * UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket); - * EXPORT_SYMBOL(RALINK_FP_Handle); - * - * packet_forward() - * { - * UINT32 HandRst = 1; - * - * ...... - * - * if (RALINK_FP_Handle != NULL) - * HandRst = RALINK_FP_Handle(skb); - * - * if (HandRst != 0) - * { - * // pass the packet to upper layer - * skb->protocol = eth_type_trans(skb, skb->dev); - * netif_rx(skb); - * } - * } - */ -UINT32 BG_FTPH_PacketFromApHandle(PNDIS_PACKET pPacket); - -#ifdef BG_FT_OPEN_SUPPORT -extern UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket); -#else -UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket); -#endif /* BG_FT_OPEN_SUPPORT */ - -/* --------------------------------- Public -------------------------------- */ - -/* - * ======================================================================== - * Routine Description: - * Init bridge fast path module. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Note: - * Used in module init. - * ======================================================================== - */ -VOID BG_FTPH_Init(VOID) -{ - RALINK_FP_Handle = BG_FTPH_PacketFromApHandle; -} - -/* - * ======================================================================== - * Routine Description: - * Remove bridge fast path module. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Note: - * Used in module remove. - * ======================================================================== - */ -VOID BG_FTPH_Remove(VOID) -{ - RALINK_FP_Handle = NULL; -} /* End of BG_FTPH_Init */ - -/* - * ======================================================================== - * Routine Description: - * Forward the received packet. - * - * Arguments: - * pPacket - the received packet - * - * Return Value: - * None - * - * ======================================================================== - */ -UINT32 BG_FTPH_PacketFromApHandle(IN PNDIS_PACKET pPacket) -{ - struct net_device *pNetDev; - struct sk_buff *pRxPkt; - struct net_bridge_fdb_entry *pSrcFdbEntry, *pDstFdbEntry; - /* init */ - pRxPkt = RTPKT_TO_OSPKT(pPacket); - pNetDev = pRxPkt->dev; - /* if pNetDev is promisc mode ??? */ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("ft bg> BG_FTPH_PacketFromApHandle\n")); - - if (pNetDev != NULL) { - if (pNetDev->br_port != NULL) { -#if (KERNEL_VERSION(2, 6, 12) <= LINUX_VERSION_CODE) - pDstFdbEntry = br_fdb_get_hook(pNetDev->br_port->br, - pRxPkt->data); - pSrcFdbEntry = br_fdb_get_hook(pNetDev->br_port->br, - pRxPkt->data + 6); -#else - /* br_fdb_get is not exported symbol, need exported in net/bridge/br.c */ - pDstFdbEntry = - br_fdb_get(pNetDev->br_port->br, pRxPkt->data); - pSrcFdbEntry = br_fdb_get(pNetDev->br_port->br, - pRxPkt->data + 6); -#endif - - /* check destination address in bridge forwarding table */ - if ((pSrcFdbEntry == NULL) || (pDstFdbEntry == NULL) || - (pDstFdbEntry->is_local) || - (pDstFdbEntry->dst == NULL) || - (pDstFdbEntry->dst->dev == NULL) || - (pDstFdbEntry->dst->dev == pNetDev) || - (pNetDev->br_port->state != BR_STATE_FORWARDING) || - ((pSrcFdbEntry->dst != NULL) && - (pSrcFdbEntry->dst->dev != NULL) && - (pSrcFdbEntry->dst->dev != pNetDev))) { - goto LabelPassToUpperLayer; - } /* End of if */ - - if ((!pDstFdbEntry->is_local) && - (pDstFdbEntry->dst != NULL) && - (pDstFdbEntry->dst->dev != NULL)) { - pRxPkt->dev = pDstFdbEntry->dst->dev; - pDstFdbEntry->dst->dev->hard_start_xmit( - pRxPkt, pDstFdbEntry->dst->dev); - return 0; - } /* End of if */ - } /* End of if */ - } /* End of if */ - -LabelPassToUpperLayer: - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ft bg> Pass packet to bridge module.\n")); - return 1; -} /* End of BG_FTPH_PacketFromApHandle */ - -#endif /* CONFIG_BRIDGE || CONFIG_BRIDGE_MODULE */ -#endif /* BG_FT_SUPPORT */ - -/* End of bg_ftph.c */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211.c deleted file mode 100644 index 0fc95d27ca..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211.c +++ /dev/null @@ -1,2875 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2009, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - * Abstract: - * - * All related CFG80211 function body. - * - * History: - * 1. 2009/09/17 Sample Lin - * (1) Init version. - * 2. 2009/10/27 Sample Lin - * (1) Do not use ieee80211_register_hw() to create virtual interface. - * Use wiphy_register() to register nl80211 command handlers. - * (2) Support iw utility. - * 3. 2009/11/03 Sample Lin - * (1) Change name MAC80211 to CFG80211. - * (2) Modify CFG80211_OpsChannelSet(). - * (3) Move CFG80211_Register()/CFG80211_UnRegister() to open/close. - * 4. 2009/12/16 Sample Lin - * (1) Patch for Linux 2.6.32. - * (2) Add more supported functions in CFG80211_Ops. - * 5. 2010/12/10 Sample Lin - * (1) Modify for OS_ABL. - * 6. 2011/04/19 Sample Lin - * (1) Add more supported functions in CFG80211_Ops v33 ~ 38. - * - * Note: - * The feature is supported only in "LINUX" 2.6.28 ~ 2.6.38. - * - ***************************************************************************/ - -#define RTMP_MODULE_OS - -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" -#include "rt_config.h" - -#if (KERNEL_VERSION(2, 6, 28) <= LINUX_VERSION_CODE) -#ifdef RT_CFG80211_SUPPORT - -/* 36 ~ 64, 100 ~ 136, 140 ~ 161 */ -#define CFG80211_NUM_OF_CHAN_5GHZ \ - (sizeof(Cfg80211_Chan) - CFG80211_NUM_OF_CHAN_2GHZ) - -#ifdef OS_ABL_FUNC_SUPPORT -/* - * Array of bitrates the hardware can operate with - * in this band. Must be sorted to give a valid "supported - * rates" IE, i.e. CCK rates first, then OFDM. - * - * For HT, assign MCS in another structure, ieee80211_sta_ht_cap. - */ -const struct ieee80211_rate Cfg80211_SupRate[12] = { - { - .flags = IEEE80211_RATE_SHORT_PREAMBLE, - .bitrate = 10, /* bitrate in units of 100 Kbps */ - .hw_value = 0, - .hw_value_short = 0, - }, - { - .flags = IEEE80211_RATE_SHORT_PREAMBLE, - .bitrate = 20, - .hw_value = 1, - .hw_value_short = 1, - }, - { - .flags = IEEE80211_RATE_SHORT_PREAMBLE, - .bitrate = 55, - .hw_value = 2, - .hw_value_short = 2, - }, - { - .flags = IEEE80211_RATE_SHORT_PREAMBLE, - .bitrate = 110, - .hw_value = 3, - .hw_value_short = 3, - }, - { - .flags = 0, - .bitrate = 60, - .hw_value = 4, - .hw_value_short = 4, - }, - { - .flags = 0, - .bitrate = 90, - .hw_value = 5, - .hw_value_short = 5, - }, - { - .flags = 0, - .bitrate = 120, - .hw_value = 6, - .hw_value_short = 6, - }, - { - .flags = 0, - .bitrate = 180, - .hw_value = 7, - .hw_value_short = 7, - }, - { - .flags = 0, - .bitrate = 240, - .hw_value = 8, - .hw_value_short = 8, - }, - { - .flags = 0, - .bitrate = 360, - .hw_value = 9, - .hw_value_short = 9, - }, - { - .flags = 0, - .bitrate = 480, - .hw_value = 10, - .hw_value_short = 10, - }, - { - .flags = 0, - .bitrate = 540, - .hw_value = 11, - .hw_value_short = 11, - }, -}; -#endif /* OS_ABL_FUNC_SUPPORT */ - -/* all available channels */ -static const UCHAR Cfg80211_Chan[] = { - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - - /* 802.11 UNI / HyperLan 2 */ - 36, - 38, - 40, - 44, - 46, - 48, - 52, - 54, - 56, - 60, - 62, - 64, - - /* 802.11 HyperLan 2 */ - 100, - 104, - 108, - 112, - 116, - 118, - 120, - 124, - 126, - 128, - 132, - 134, - 136, - - /* 802.11 UNII */ - 140, - 149, - 151, - 153, - 157, - 159, - 161, - 165, - 167, - 169, - 171, - 173, - - /* Japan */ - 184, - 188, - 192, - 196, - 208, - 212, - 216, -}; - -static const UINT32 CipherSuites[] = { - WLAN_CIPHER_SUITE_WEP40, WLAN_CIPHER_SUITE_WEP104, - WLAN_CIPHER_SUITE_TKIP, WLAN_CIPHER_SUITE_CCMP, -#ifdef DOT11W_PMF_SUPPORT - WLAN_CIPHER_SUITE_AES_CMAC, -#ifdef HOSTAPD_SUITEB_SUPPORT - WLAN_CIPHER_SUITE_BIP_GMAC_256, -#endif -#endif /*DOT11W_PMF_SUPPORT*/ - WLAN_CIPHER_SUITE_GCMP, -#if (KERNEL_VERSION(4, 0, 0) <= LINUX_VERSION_CODE) - WLAN_CIPHER_SUITE_CCMP_256, -#ifdef HOSTAPD_SUITEB_SUPPORT - WLAN_CIPHER_SUITE_GCMP_256, -#endif -#endif - -}; - -/* get RALINK pAd control block in 80211 Ops */ -#define MAC80211_PAD_GET(__pAd, __pWiphy) \ - { \ - ULONG *__pPriv; \ - __pPriv = (ULONG *)(wiphy_priv(__pWiphy)); \ - __pAd = (VOID *)(*__pPriv); \ - if (__pAd == NULL) { \ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("80211> %s but pAd = NULL!", __func__)); \ - return -EINVAL; \ - } \ - } - -#define MAC80211_PAD_GET_NO_RV(__pAd, __pWiphy) \ - { \ - ULONG *__pPriv; \ - __pPriv = (ULONG *)(wiphy_priv(__pWiphy)); \ - __pAd = (VOID *)(*__pPriv); \ - if (__pAd == NULL) { \ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("80211> %s but pAd = NULL!", __func__)); \ - return; \ - } \ - } - -#define MAC80211_PAD_GET_RETURN_NULL(__pAd, __pWiphy) \ - { \ - ULONG *__pPriv; \ - __pPriv = (ULONG *)(wiphy_priv(__pWiphy)); \ - __pAd = (VOID *)(*__pPriv); \ - if (__pAd == NULL) { \ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, \ - ("80211> %s but pAd = NULL!", __func__)); \ - return NULL; \ - } \ - } - -/* - * ======================================================================== - * Routine Description: - * Set channel. - * - * Arguments: - * pWiphy - Wireless hardware description - * pChan - Channel information - * ChannelType - Channel type - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * For iw utility: set channel, set freq - * - * enum nl80211_channel_type { - * NL80211_CHAN_NO_HT, - * NL80211_CHAN_HT20, - * NL80211_CHAN_HT40MINUS, - * NL80211_CHAN_HT40PLUS - * }; - * ======================================================================== - */ -#if (KERNEL_VERSION(3, 6, 0) > LINUX_VERSION_CODE) -#if (KERNEL_VERSION(2, 6, 35) <= LINUX_VERSION_CODE) -static int CFG80211_OpsChannelSet(IN struct wiphy *pWiphy, - IN struct net_device *pDev, - IN struct ieee80211_channel *pChan, - IN enum nl80211_channel_type ChannelType) - -#else -static int CFG80211_OpsChannelSet(IN struct wiphy *pWiphy, - IN struct ieee80211_channel *pChan, - IN enum nl80211_channel_type ChannelType) -#endif /* LINUX_VERSION_CODE */ -{ - VOID *pAd; - CFG80211_CB *p80211CB; - CMD_RTPRIV_IOCTL_80211_CHAN ChanInfo; - UINT32 ChanId; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - /* get channel number */ - ChanId = ieee80211_frequency_to_channel(pChan->center_freq); - CFG80211DBG(DBG_LVL_TRACE, - ("80211> Channel = %d, Type = %d\n", ChanId, ChannelType)); - /* init */ - memset(&ChanInfo, 0, sizeof(ChanInfo)); - ChanInfo.ChanId = ChanId; - p80211CB = NULL; - RTMP_DRIVER_80211_CB_GET(pAd, &p80211CB); - - if (p80211CB == NULL) { - CFG80211DBG(DBG_LVL_ERROR, ("80211> p80211CB == NULL!\n")); - return 0; - } - - ChanInfo.IfType = pDev->ieee80211_ptr->iftype; - - if (ChannelType == NL80211_CHAN_NO_HT) - ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_NOHT; - else if (ChannelType == NL80211_CHAN_HT20) - ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT20; - else if (ChannelType == NL80211_CHAN_HT40MINUS) - ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT40MINUS; - else if (ChannelType == NL80211_CHAN_HT40PLUS) - ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT40PLUS; - - ChanInfo.MonFilterFlag = p80211CB->MonFilterFlag; - /* set channel */ - RTMP_DRIVER_80211_CHAN_SET(pAd, &ChanInfo); - return 0; -} -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0) */ - -/* - * ======================================================================== - * Routine Description: - * Change type/configuration of virtual interface. - * - * Arguments: - * pWiphy - Wireless hardware description - * IfIndex - Interface index - * Type - Interface type, managed/adhoc/ap/station, etc. - * pFlags - Monitor flags - * pParams - Mesh parameters - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * For iw utility: set type, set monitor - * ======================================================================== - */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -static int CFG80211_OpsVirtualInfChg(IN struct wiphy *pWiphy, - IN struct net_device *pNetDevIn, - IN enum nl80211_iftype Type, - struct vif_params *pParams) -#elif (KERNEL_VERSION(2, 6, 32) <= LINUX_VERSION_CODE) -static int CFG80211_OpsVirtualInfChg(IN struct wiphy *pWiphy, - IN struct net_device *pNetDevIn, - IN enum nl80211_iftype Type, - IN UINT32 *pFlags, - struct vif_params *pParams) -#else -static int CFG80211_OpsVirtualInfChg(IN struct wiphy *pWiphy, IN int IfIndex, - IN enum nl80211_iftype Type, - IN UINT32 *pFlags, - struct vif_params *pParams) -#endif /* LINUX_VERSION_CODE */ -{ - VOID *pAd; - CFG80211_CB *pCfg80211_CB; - struct net_device *pNetDev; - CMD_RTPRIV_IOCTL_80211_VIF_PARM VifInfo; - UINT oldType = pNetDevIn->ieee80211_ptr->iftype; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - CFG80211DBG(DBG_LVL_TRACE, - ("80211> IfTypeChange %d ==> %d\n", oldType, Type)); - MAC80211_PAD_GET(pAd, pWiphy); - /* sanity check */ - { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> Wrong interface type %d!\n", Type)); - return -EINVAL; - } /* End of if */ - - /* update interface type */ -#if (KERNEL_VERSION(2, 6, 32) <= LINUX_VERSION_CODE) - pNetDev = pNetDevIn; -#else - pNetDev = __dev_get_by_index(&init_net, IfIndex); -#endif /* LINUX_VERSION_CODE */ - - if (pNetDev == NULL) - return -ENODEV; - - pNetDev->ieee80211_ptr->iftype = Type; - VifInfo.net_dev = pNetDev; - VifInfo.newIfType = Type; - VifInfo.oldIfType = oldType; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - if (pParams != NULL) { - VifInfo.MonFilterFlag = 0; - - if (((pParams->flags) & NL80211_MNTR_FLAG_FCSFAIL) == - NL80211_MNTR_FLAG_FCSFAIL) - VifInfo.MonFilterFlag |= RT_CMD_80211_FILTER_FCSFAIL; - - if (((pParams->flags) & NL80211_MNTR_FLAG_FCSFAIL) == - NL80211_MNTR_FLAG_PLCPFAIL) - VifInfo.MonFilterFlag |= RT_CMD_80211_FILTER_PLCPFAIL; - - if (((pParams->flags) & NL80211_MNTR_FLAG_CONTROL) == - NL80211_MNTR_FLAG_CONTROL) - VifInfo.MonFilterFlag |= RT_CMD_80211_FILTER_CONTROL; - - if (((pParams->flags) & NL80211_MNTR_FLAG_CONTROL) == - NL80211_MNTR_FLAG_OTHER_BSS) - VifInfo.MonFilterFlag |= RT_CMD_80211_FILTER_OTHER_BSS; - } -#else - - if (pFlags != NULL) { - VifInfo.MonFilterFlag = 0; - - if (((*pFlags) & NL80211_MNTR_FLAG_FCSFAIL) == - NL80211_MNTR_FLAG_FCSFAIL) - VifInfo.MonFilterFlag |= RT_CMD_80211_FILTER_FCSFAIL; - - if (((*pFlags) & NL80211_MNTR_FLAG_FCSFAIL) == - NL80211_MNTR_FLAG_PLCPFAIL) - VifInfo.MonFilterFlag |= RT_CMD_80211_FILTER_PLCPFAIL; - - if (((*pFlags) & NL80211_MNTR_FLAG_CONTROL) == - NL80211_MNTR_FLAG_CONTROL) - VifInfo.MonFilterFlag |= RT_CMD_80211_FILTER_CONTROL; - - if (((*pFlags) & NL80211_MNTR_FLAG_CONTROL) == - NL80211_MNTR_FLAG_OTHER_BSS) - VifInfo.MonFilterFlag |= RT_CMD_80211_FILTER_OTHER_BSS; - } -#endif - /* Type transer from linux to driver defined */ - if (Type == NL80211_IFTYPE_STATION) - Type = RT_CMD_80211_IFTYPE_STATION; - else if (Type == NL80211_IFTYPE_ADHOC) - Type = RT_CMD_80211_IFTYPE_ADHOC; - else if (Type == NL80211_IFTYPE_MONITOR) - Type = RT_CMD_80211_IFTYPE_MONITOR; - -#ifdef CONFIG_AP_SUPPORT - else if (Type == NL80211_IFTYPE_P2P_CLIENT) - Type = RT_CMD_80211_IFTYPE_P2P_CLIENT; - else if (Type == NL80211_IFTYPE_P2P_GO) - Type = RT_CMD_80211_IFTYPE_P2P_GO; - -#endif /* CONFIG_AP_SUPPORT */ - RTMP_DRIVER_80211_VIF_CHG(pAd, &VifInfo); - /*CFG_TODO*/ - RTMP_DRIVER_80211_CB_GET(pAd, &pCfg80211_CB); - pCfg80211_CB->MonFilterFlag = VifInfo.MonFilterFlag; - return 0; -} - -#if (KERNEL_VERSION(2, 6, 30) <= LINUX_VERSION_CODE) -#if defined(SIOCGIWSCAN) || defined(RT_CFG80211_SUPPORT) -extern int rt_ioctl_siwscan(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wreq, char *extra); -#endif /* LINUX_VERSION_CODE: 2.6.30 */ -/* - * ======================================================================== - * Routine Description: - * Request to do a scan. If returning zero, the scan request is given - * the driver, and will be valid until passed to cfg80211_scan_done(). - * For scan results, call cfg80211_inform_bss(); you can call this outside - * the scan/scan_done bracket too. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - Network device interface - * pRequest - Scan request - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * For iw utility: scan - * - * struct cfg80211_scan_request { - * struct cfg80211_ssid *ssids; - * int n_ssids; - * struct ieee80211_channel **channels; - * UINT32 n_channels; - * const u8 *ie; - * size_t ie_len; - * - * * @ssids: SSIDs to scan for (active scan only) - * * @n_ssids: number of SSIDs - * * @channels: channels to scan on. - * * @n_channels: number of channels for each band - * * @ie: optional information element(s) to add into Probe Request or %NULL - * * @ie_len: length of ie in octets - * ======================================================================== - */ -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) -static int CFG80211_OpsScan(IN struct wiphy *pWiphy, - IN struct cfg80211_scan_request *pRequest) -#else -static int CFG80211_OpsScan(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, - IN struct cfg80211_scan_request *pRequest) -#endif /* LINUX_VERSION_CODE: 3.6.0 */ -{ - VOID *pAd; - CFG80211_CB *pCfg80211_CB; -#ifdef APCLI_CFG80211_SUPPORT - RT_CMD_STA_IOCTL_SCAN scan_cmd; - UCHAR ssid[32]; -#endif /* APCLI_CFG80211_SUPPORT */ -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - struct net_device *pNdev = NULL; -#ifdef APCLI_CFG80211_SUPPORT - struct wireless_dev *pWdev = NULL; -#endif /* APCLI_CFG80211_SUPPORT */ -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - MAC80211_PAD_GET(pAd, pWiphy); -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - RTMP_DRIVER_NET_DEV_GET(pAd, &pNdev); -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - CFG80211DBG( - DBG_LVL_TRACE, - ("========================================================================\n")); - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==> %s(%d)\n", __func__, - pNdev->name, pNdev->ieee80211_ptr->iftype)); - /* YF_TODO: record the scan_req per netdevice */ - RTMP_DRIVER_80211_CB_GET(pAd, &pCfg80211_CB); - pCfg80211_CB->pCfg80211_ScanReq = pRequest; /* used in scan end */ -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) -#ifdef APCLI_CFG80211_SUPPORT - pWdev = pRequest->wdev; - RTMP_DRIVER_APCLI_NET_DEV_GET(pAd, &pNdev); - - if (pWdev && (pWdev->netdev == pNdev)) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Scan Request for Apcli i/f proceed for scanning\n")); - } else { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Scan Request for non APCLI i/f end scan\n")); - CFG80211OS_ScanEnd(pCfg80211_CB, TRUE); - return 0; - } -#else - RTMP_DRIVER_NET_DEV_GET(pAd, &pNdev); -#endif /* APCLI_CFG80211_SUPPORT */ -#endif /* LINUX_VERSION_CODE: 3.6.0 */ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - /* sanity check */ -#ifdef APCLI_CFG80211_SUPPORT - if (pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) -#else - if ((pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) && - (pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP) && - (pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) && - (pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)) -#endif /* APCLI_CFG80211_SUPPORT */ - { - CFG80211DBG(DBG_LVL_ERROR, - ("80211> DeviceType Not Support Scan ==> %d\n", - pNdev->ieee80211_ptr->iftype)); - CFG80211OS_ScanEnd(pCfg80211_CB, TRUE); - return -EOPNOTSUPP; - } - - /* Driver Internal SCAN SM Check */ - if (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> Network is down!\n")); - CFG80211OS_ScanEnd(pCfg80211_CB, TRUE); - return -ENETDOWN; - } - - if (RTMP_DRIVER_80211_SCAN(pAd, pNdev->ieee80211_ptr->iftype) != - NDIS_STATUS_SUCCESS) { - CFG80211DBG(DBG_LVL_ERROR, - ("\n\n\n\n\n80211> BUSY - SCANING\n\n\n\n\n")); - CFG80211OS_ScanEnd(pCfg80211_CB, TRUE); - return 0; - } - -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - UCHAR Flag = 0; - - RTMP_DRIVER_ADAPTER_MCC_DHCP_PROTECT_STATUS(pAd, &Flag); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("mcc Flag %d\n", Flag)); - - if (Flag && (strcmp(pNdev->name, "p2p0") == 0)) { - CFG80211DBG(DBG_LVL_ERROR, - ("MCC Protect DHCP - Aborting Scan\n")); - return 0; - } - - RTMP_DRIVER_80211_SET_NOA(pAd, pNdev->name); -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - - if (pRequest->ie_len != 0) { - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("80211> ExtraIEs Not Null in ProbeRequest from upper layer...\n")); - /* YF@20120321: Using Cfg80211_CB carry on pAd struct to overwirte the pWpsProbeReqIe. */ - RTMP_DRIVER_80211_SCAN_EXTRA_IE_SET(pAd); - } else - MTWF_LOG( - DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("80211> ExtraIEs Null in ProbeRequest from upper layer...\n")); - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("80211> Num %d of SSID from upper layer...\n", - pRequest->n_ssids)); - - /* Set Channel List for this Scan Action */ - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("80211> [%d] Channels In ProbeRequest.\n", - pRequest->n_channels)); - - if (pRequest->n_channels > 0) { - UINT32 *pChanList; - UINT32 idx; - - os_alloc_mem(NULL, (UCHAR **)&pChanList, - sizeof(UINT32 *) * pRequest->n_channels); - - if (pChanList == NULL) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Alloc memory fail\n", __func__)); - return FALSE; - } - - for (idx = 0; idx < pRequest->n_channels; idx++) { - pChanList[idx] = ieee80211_frequency_to_channel( - pRequest->channels[idx]->center_freq); - CFG80211DBG(DBG_LVL_INFO, ("%d,", pChanList[idx])); - } - - CFG80211DBG(DBG_LVL_INFO, ("\n")); - RTMP_DRIVER_80211_SCAN_CHANNEL_LIST_SET(pAd, pChanList, - pRequest->n_channels); - - if (pChanList) - os_free_mem(pChanList); - } - - /* use 1st SSID in the requested SSID list */ -#ifdef APCLI_CFG80211_SUPPORT - memset(&scan_cmd, 0, sizeof(RT_CMD_STA_IOCTL_SCAN)); - memset(ssid, 0, sizeof(ssid)); - - if (pRequest->n_ssids && pRequest->ssids) { - scan_cmd.SsidLen = pRequest->ssids->ssid_len; - memcpy(ssid, pRequest->ssids->ssid, scan_cmd.SsidLen); - scan_cmd.pSsid = ssid; - } - scan_cmd.ScanType = SCAN_ACTIVE; - RTMP_DRIVER_80211_APCLI_SCAN(pAd, &scan_cmd); - return 0; -#endif /*APCLI_CFG80211_SUPPORT*/ -#else - CFG80211OS_ScanEnd(pCfg80211_CB, TRUE); - return 0; - /* return -EOPNOTSUPP; */ -#endif /* CONFIG_STA_SUPPORT */ -} -#endif /* LINUX_VERSION_CODE */ - -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) -#endif /* LINUX_VERSION_CODE */ - -#if (KERNEL_VERSION(2, 6, 32) <= LINUX_VERSION_CODE) -#if (KERNEL_VERSION(3, 8, 0) > LINUX_VERSION_CODE) -/* - * ======================================================================== - * Routine Description: - * Set the transmit power according to the parameters. - * - * Arguments: - * pWiphy - Wireless hardware description - * Type - - * dBm - dBm - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * Type - - * enum nl80211_tx_power_setting - TX power adjustment - * @NL80211_TX_POWER_AUTOMATIC: automatically determine transmit power - * @NL80211_TX_POWER_LIMITED: limit TX power by the mBm parameter - * @NL80211_TX_POWER_FIXED: fix TX power to the mBm parameter - * ======================================================================== - */ -static int CFG80211_OpsTxPwrSet(IN struct wiphy *pWiphy, -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) - IN struct wireless_dev *wdev, -#endif -#if (KERNEL_VERSION(2, 6, 36) <= LINUX_VERSION_CODE) - IN enum nl80211_tx_power_setting Type, -#else - IN enum tx_power_setting Type, -#endif /* LINUX_VERSION_CODE */ - IN int dBm) -{ - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - return -EOPNOTSUPP; -} - -/* - * ======================================================================== - * Routine Description: - * Store the current TX power into the dbm variable. - * - * Arguments: - * pWiphy - Wireless hardware description - * pdBm - dBm - * - * Return Value: - * 0 - success - * -x - fail - * - *Note: - * ======================================================================== - */ -static int CFG80211_OpsTxPwrGet(IN struct wiphy *pWiphy, -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) - IN struct wireless_dev *wdev, -#endif - IN int *pdBm) -{ - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - return -EOPNOTSUPP; -} /* End of CFG80211_OpsTxPwrGet */ -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) */ - -/* - * ======================================================================== - * Routine Description: - * Power management. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - - * FlgIsEnabled - - * Timeout - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * ======================================================================== - */ -static int CFG80211_OpsPwrMgmt(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, IN bool enabled, - IN INT32 timeout) -{ - VOID *pAd; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==> power save %s\n", __func__, - (enabled ? "enable" : "disable"))); - MAC80211_PAD_GET(pAd, pWiphy); - RTMP_DRIVER_80211_POWER_MGMT_SET(pAd, enabled); - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * Get information for a specific station. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - - * pMac - STA MAC - * pSinfo - STA INFO - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * ======================================================================== - */ -static int CFG80211_OpsStaGet(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) - IN const UINT8 *pMac, -#else - IN UINT8 *pMac, -#endif - IN struct station_info *pSinfo) -{ - VOID *pAd; - CMD_RTPRIV_IOCTL_80211_STA StaInfo; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __FUNCTION__)); - MAC80211_PAD_GET(pAd, pWiphy); - - /* init */ - memset(pSinfo, 0, sizeof(*pSinfo)); - memset(&StaInfo, 0, sizeof(StaInfo)); - - memcpy(StaInfo.MAC, pMac, 6); - - /* get sta information */ - if (RTMP_DRIVER_80211_STA_GET(pAd, &StaInfo) != NDIS_STATUS_SUCCESS) - return -ENOENT; - - if (StaInfo.TxRateFlags != RT_CMD_80211_TXRATE_LEGACY) { - pSinfo->txrate.flags = RATE_INFO_FLAGS_MCS; - if (StaInfo.TxRateFlags & RT_CMD_80211_TXRATE_BW_40) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - pSinfo->txrate.bw = RATE_INFO_BW_40; -#else - pSinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; -#endif - - if (StaInfo.TxRateFlags & RT_CMD_80211_TXRATE_SHORT_GI) - pSinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; - - pSinfo->txrate.mcs = StaInfo.TxRateMCS; - } else { - pSinfo->txrate.legacy = StaInfo.TxRateMCS; - } - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - pSinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE); -#else - pSinfo->filled |= STATION_INFO_TX_BITRATE; -#endif - - /* fill signal */ - pSinfo->signal = StaInfo.Signal; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - pSinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL); -#else - pSinfo->filled |= STATION_INFO_SIGNAL; -#endif - -#ifdef CONFIG_AP_SUPPORT - /* fill tx count */ - /*pSinfo->tx_packets = StaInfo.TxPacketCnt;*/ - pSinfo->rx_bytes = StaInfo.rx_bytes; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - pSinfo->filled |= BIT(NL80211_STA_INFO_RX_BYTES); -#else - pSinfo->filled |= STATION_INFO_RX_BYTES; -#endif - - pSinfo->tx_bytes = StaInfo.tx_bytes; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - pSinfo->filled |= BIT(NL80211_STA_INFO_TX_BYTES); -#else - pSinfo->filled |= STATION_INFO_TX_BYTES; -#endif - - pSinfo->rx_packets = StaInfo.rx_packets; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - pSinfo->filled |= BIT(NL80211_STA_INFO_RX_PACKETS); -#else - pSinfo->filled |= STATION_INFO_RX_PACKETS; -#endif - - pSinfo->tx_packets = StaInfo.tx_packets; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - pSinfo->filled |= BIT(NL80211_STA_INFO_TX_PACKETS); -#else - pSinfo->filled |= STATION_INFO_TX_PACKETS; -#endif - - /* fill inactive time */ - pSinfo->inactive_time = StaInfo.InactiveTime; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - pSinfo->filled |= BIT(NL80211_STA_INFO_INACTIVE_TIME); -#else - pSinfo->filled |= STATION_INFO_INACTIVE_TIME; -#endif - -#endif /* CONFIG_AP_SUPPORT */ - - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * List all stations known, e.g. the AP on managed interfaces. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - - * Idx - - * pMac - - * pSinfo - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * ======================================================================== - */ -static int CFG80211_OpsStaDump(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, IN int Idx, - IN UINT8 *pMac, IN struct station_info *pSinfo) -{ - VOID *pAd; - - if (Idx != 0) - return -ENOENT; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - return -EOPNOTSUPP; -} /* End of CFG80211_OpsStaDump */ - -/* - * ======================================================================== - * Routine Description: - * Notify that wiphy parameters have changed. - * - * Arguments: - * pWiphy - Wireless hardware description - * Changed - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * ======================================================================== - */ -static int CFG80211_OpsWiphyParamsSet(IN struct wiphy *pWiphy, - IN UINT32 Changed) -{ - VOID *pAd; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - - if (Changed & WIPHY_PARAM_RTS_THRESHOLD) { - RTMP_DRIVER_80211_RTS_THRESHOLD_ADD(pAd, pWiphy->rts_threshold); - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==> rts_threshold(%d)\n", - __func__, pWiphy->rts_threshold)); - return 0; - } else if (Changed & WIPHY_PARAM_FRAG_THRESHOLD) { - RTMP_DRIVER_80211_FRAG_THRESHOLD_ADD(pAd, - pWiphy->frag_threshold); - CFG80211DBG(DBG_LVL_TRACE, - ("80211> %s ==> frag_threshold(%d)\n", __func__, - pWiphy->frag_threshold)); - return 0; - } - - return -EOPNOTSUPP; -} /* End of CFG80211_OpsWiphyParamsSet */ - -/* - * ======================================================================== - * Routine Description: - * Add a key with the given parameters. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - - * KeyIdx - - * Pairwise - - * pMacAddr - - * pParams - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * pMacAddr will be NULL when adding a group key. - * ======================================================================== - */ -static int CFG80211_OpsKeyAdd(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, IN UINT8 KeyIdx, - IN bool Pairwise, IN const UINT8 *pMacAddr, - IN struct key_params *pParams) - -{ - VOID *pAd; - CMD_RTPRIV_IOCTL_80211_KEY KeyInfo; - CFG80211_CB *p80211CB; - - p80211CB = NULL; - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); -#ifdef RT_CFG80211_DEBUG - hex_dump("KeyBuf=", (UINT8 *)pParams->key, pParams->key_len); -#endif /* RT_CFG80211_DEBUG */ - CFG80211DBG(DBG_LVL_TRACE, ("80211> KeyIdx = %d\n", KeyIdx)); - - if (pParams->key_len >= sizeof(KeyInfo.KeyBuf)) - return -EINVAL; - - /* End of if */ - /* init */ - memset(&KeyInfo, 0, sizeof(KeyInfo)); - memcpy(KeyInfo.KeyBuf, pParams->key, pParams->key_len); - KeyInfo.KeyBuf[pParams->key_len] = 0x00; - KeyInfo.KeyId = KeyIdx; - KeyInfo.bPairwise = Pairwise; - KeyInfo.KeyLen = pParams->key_len; -#ifdef DOT11W_PMF_SUPPORT -#endif /* DOT11W_PMF_SUPPORT */ - if (pParams->cipher == WLAN_CIPHER_SUITE_WEP40) - KeyInfo.KeyType = RT_CMD_80211_KEY_WEP40; - else if (pParams->cipher == WLAN_CIPHER_SUITE_WEP104) - KeyInfo.KeyType = RT_CMD_80211_KEY_WEP104; - else if ((pParams->cipher == WLAN_CIPHER_SUITE_TKIP) || - (pParams->cipher == WLAN_CIPHER_SUITE_CCMP)) { - KeyInfo.KeyType = RT_CMD_80211_KEY_WPA; - - if (pParams->cipher == WLAN_CIPHER_SUITE_TKIP) - KeyInfo.cipher = Ndis802_11TKIPEnable; - else if (pParams->cipher == WLAN_CIPHER_SUITE_CCMP) - KeyInfo.cipher = Ndis802_11AESEnable; -#if (KERNEL_VERSION(4, 0, 0) <= LINUX_VERSION_CODE) - } else if (pParams->cipher == WLAN_CIPHER_SUITE_GCMP_256) { - KeyInfo.KeyType = RT_CMD_80211_KEY_WPA; - KeyInfo.cipher = Ndis802_11GCMP256Enable; -#endif - } else if (pParams->cipher == WLAN_CIPHER_SUITE_GCMP) { - KeyInfo.KeyType = RT_CMD_80211_KEY_WPA; - KeyInfo.cipher = Ndis802_11GCMP128Enable; -#if (KERNEL_VERSION(4, 0, 0) <= LINUX_VERSION_CODE) - } else if (pParams->cipher == WLAN_CIPHER_SUITE_CCMP_256) { - KeyInfo.KeyType = RT_CMD_80211_KEY_WPA; - KeyInfo.cipher = Ndis802_11CCMP256Enable; -#endif - } -#ifdef DOT11W_PMF_SUPPORT - else if (pParams->cipher == WLAN_CIPHER_SUITE_AES_CMAC) { - KeyInfo.KeyType = RT_CMD_80211_KEY_AES_CMAC; - KeyInfo.KeyId = KeyIdx; - KeyInfo.bPairwise = FALSE; - KeyInfo.KeyLen = pParams->key_len; - } -#ifdef HOSTAPD_SUITEB_SUPPORT - else if (pParams->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256) { - KeyInfo.KeyType = RT_CMD_80211_KEY_AES_CMAC; - KeyInfo.KeyId = KeyIdx; - KeyInfo.bPairwise = FALSE; - KeyInfo.KeyLen = pParams->key_len; - } -#endif -#endif /* DOT11W_PMF_SUPPORT */ - else - return -ENOTSUPP; - - KeyInfo.pNetDev = pNdev; -#ifdef CONFIG_AP_SUPPORT - - if ((pNdev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_AP) || - (pNdev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_GO)) { - if (pMacAddr) { - CFG80211DBG( - DBG_LVL_OFF, - ("80211> KeyAdd STA(%02X:%02X:%02X:%02X:%02X:%02X) ==>\n", - PRINT_MAC(pMacAddr))); - NdisCopyMemory(KeyInfo.MAC, pMacAddr, MAC_ADDR_LEN); - } - - CFG80211DBG(DBG_LVL_OFF, ("80211> AP Key Add\n")); - RTMP_DRIVER_80211_AP_KEY_ADD(pAd, &KeyInfo); - } else -#endif /* CONFIG_AP_SUPPORT */ - { -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - CFG80211DBG(DBG_LVL_TRACE, ("80211> STA Key Add\n")); - RTMP_DRIVER_80211_STA_KEY_ADD(pAd, &KeyInfo); -#endif /* defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) */ - } - -#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT - - if (pMacAddr) { - CFG80211DBG( - DBG_LVL_TRACE, - ("80211> P2pSendWirelessEvent(%02X:%02X:%02X:%02X:%02X:%02X) ==>\n", - PRINT_MAC(pMacAddr))); - RTMP_DRIVER_80211_SEND_WIRELESS_EVENT(pAd, pMacAddr); - } - -#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */ - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * Get information about the key with the given parameters. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - - * KeyIdx - - * Pairwise - - * pMacAddr - - * pCookie - - * pCallback - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * pMacAddr will be NULL when requesting information for a group key. - * - * All pointers given to the pCallback function need not be valid after - * it returns. - * - * This function should return an error if it is not possible to - * retrieve the key, -ENOENT if it doesn't exist. - * ======================================================================== - */ -static int -CFG80211_OpsKeyGet(IN struct wiphy *pWiphy, IN struct net_device *pNdev, - IN UINT8 KeyIdx, IN bool Pairwise, IN const UINT8 *pMacAddr, - IN void *pCookie, - IN void (*pCallback)(void *cookie, struct key_params *)) -{ - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - return -ENOTSUPP; -} - -/* - * ======================================================================== - * Routine Description: - * Remove a key given the pMacAddr (NULL for a group key) and KeyIdx. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - - * KeyIdx - - * pMacAddr - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * return -ENOENT if the key doesn't exist. - * ======================================================================== - */ -static int CFG80211_OpsKeyDel(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, IN UINT8 KeyIdx, - IN bool Pairwise, IN const UINT8 *pMacAddr) -{ - VOID *pAd; - CMD_RTPRIV_IOCTL_80211_KEY KeyInfo; - CFG80211_CB *p80211CB; - - p80211CB = NULL; - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - - if (pMacAddr) { - CFG80211DBG( - DBG_LVL_ERROR, - ("80211> KeyDel STA(%02X:%02X:%02X:%02X:%02X:%02X) ==>\n", - PRINT_MAC(pMacAddr))); - NdisCopyMemory(KeyInfo.MAC, pMacAddr, MAC_ADDR_LEN); - } - - MAC80211_PAD_GET(pAd, pWiphy); - RTMP_DRIVER_80211_CB_GET(pAd, &p80211CB); - memset(&KeyInfo, 0, sizeof(KeyInfo)); - KeyInfo.KeyId = KeyIdx; - KeyInfo.pNetDev = pNdev; - CFG80211DBG(DBG_LVL_TRACE, ("80211> KeyDel isPairwise %d\n", Pairwise)); - KeyInfo.bPairwise = Pairwise; -#ifdef CONFIG_AP_SUPPORT - - if ((pNdev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_AP) || - (pNdev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_GO)) { - CFG80211DBG(DBG_LVL_TRACE, ("80211> AP Key Del\n")); - RTMP_DRIVER_80211_AP_KEY_DEL(pAd, &KeyInfo); - } else -#endif /* CONFIG_AP_SUPPORT */ - { - CFG80211DBG(DBG_LVL_TRACE, ("80211> STA Key Del\n")); - - if (pMacAddr) { - CFG80211DBG(DBG_LVL_ERROR, - ("80211> STA Key Del -- DISCONNECT\n")); - RTMP_DRIVER_80211_STA_LEAVE(pAd, pNdev); - } - } - - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * Set the default key on an interface. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - - * KeyIdx - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * ======================================================================== - */ -#if (KERNEL_VERSION(2, 6, 38) <= LINUX_VERSION_CODE) -static int CFG80211_OpsKeyDefaultSet(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, - IN UINT8 KeyIdx, IN bool Unicast, - IN bool Multicast) -#else - -static int CFG80211_OpsKeyDefaultSet(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, - IN UINT8 KeyIdx) -#endif /* LINUX_VERSION_CODE */ -{ - VOID *pAd; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - CFG80211DBG(DBG_LVL_TRACE, ("80211> Default KeyIdx = %d\n", KeyIdx)); -#ifdef CONFIG_AP_SUPPORT - - if ((pNdev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_AP) || - (pNdev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_GO)) - RTMP_DRIVER_80211_AP_KEY_DEFAULT_SET(pAd, KeyIdx); - else -#endif /* CONFIG_AP_SUPPORT */ - RTMP_DRIVER_80211_STA_KEY_DEFAULT_SET(pAd, KeyIdx); - - return 0; -} /* End of CFG80211_OpsKeyDefaultSet */ - -#ifdef DOT11W_PMF_SUPPORT -/* -======================================================================== -Routine Description: - Set the default management key on an interface. - -Arguments: - pWiphy - Wireless hardware description - pNdev - - KeyIdx - - -Return Value: - 0 - success - -x - fail - -Note: -======================================================================== -*/ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) -static int CFG80211_OpsMgmtKeyDefaultSet(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, - IN UINT8 KeyIdx) - -{ - VOID *pAd; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __FUNCTION__)); - MAC80211_PAD_GET(pAd, pWiphy); - - CFG80211DBG(DBG_LVL_TRACE, - ("80211> Default Mgmt KeyIdx = %d\n", KeyIdx)); - -#ifdef CONFIG_AP_SUPPORT - if ((pNdev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_AP) || - (pNdev->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_GO)) - RTMP_DRIVER_80211_AP_KEY_DEFAULT_MGMT_SET(pAd, pNdev, KeyIdx); -#endif - - return 0; -} /* End of CFG80211_OpsMgmtKeyDefaultSet */ -#endif /* LINUX_VERSION_CODE */ -#endif /*DOT11W_PMF_SUPPORT*/ - -/* - * ======================================================================== - * Routine Description: - * Connect to the ESS with the specified parameters. When connected, - * call cfg80211_connect_result() with status code %WLAN_STATUS_SUCCESS. - * If the connection fails for some reason, call cfg80211_connect_result() - * with the status from the AP. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - Network device interface - * pSme - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * For iw utility: connect - * - * You must use "iw ra0 connect xxx", then "iw ra0 disconnect"; - * You can not use "iw ra0 connect xxx" twice without disconnect; - * Or you will suffer "command failed: Operation already in progress (-114)". - * - * You must support add_key and set_default_key function; - * Or kernel will crash without any error message in linux 2.6.32. - * - * - * struct cfg80211_connect_params - Connection parameters - * - * This structure provides information needed to complete IEEE 802.11 - * authentication and association. - * - * @channel: The channel to use or %NULL if not specified (auto-select based - * on scan results) - * @bssid: The AP BSSID or %NULL if not specified (auto-select based on scan - * results) - * @ssid: SSID - * @ssid_len: Length of ssid in octets - * @auth_type: Authentication type (algorithm) - * - * @ie: IEs for association request - * @ie_len: Length of assoc_ie in octets - * - * @privacy: indicates whether privacy-enabled APs should be used - * @crypto: crypto settings - * @key_len: length of WEP key for shared key authentication - * @key_idx: index of WEP key for shared key authentication - * @key: WEP key for shared key authentication - * ======================================================================== - */ -static int CFG80211_OpsConnect(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, - IN struct cfg80211_connect_params *pSme) -{ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - VOID *pAd; - CMD_RTPRIV_IOCTL_80211_CONNECT ConnInfo; - CMD_RTPRIV_IOCTL_80211_ASSOC_IE AssocIe; - struct ieee80211_channel *pChannel = pSme->channel; - INT32 Pairwise = 0; - INT32 Groupwise = 0; - INT32 Keymgmt = 0; - INT32 WpaVersion = 0; - INT32 Chan = -1, Idx; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - - if (pChannel != NULL) - Chan = ieee80211_frequency_to_channel(pChannel->center_freq); - - CFG80211DBG(DBG_LVL_TRACE, - ("Groupwise: %x\n", pSme->crypto.cipher_group)); - Groupwise = pSme->crypto.cipher_group; - /* for(Idx=0; Idxcrypto.n_ciphers_pairwise; Idx++) */ - Pairwise |= pSme->crypto.ciphers_pairwise[0]; - CFG80211DBG(DBG_LVL_TRACE, - ("Pairwise %x\n", pSme->crypto.ciphers_pairwise[0])); - - for (Idx = 0; Idx < pSme->crypto.n_akm_suites; Idx++) - Keymgmt |= pSme->crypto.akm_suites[Idx]; - - WpaVersion = pSme->crypto.wpa_versions; - CFG80211DBG(DBG_LVL_TRACE, ("Wpa_versions %x\n", WpaVersion)); - memset(&ConnInfo, 0, sizeof(ConnInfo)); - ConnInfo.WpaVer = 0; - - if (WpaVersion & NL80211_WPA_VERSION_1) - ConnInfo.WpaVer = 1; - - if (WpaVersion & NL80211_WPA_VERSION_2) - ConnInfo.WpaVer = 2; - - CFG80211DBG(DBG_LVL_TRACE, ("Keymgmt %x\n", Keymgmt)); - - if (Keymgmt == WLAN_AKM_SUITE_8021X) - ConnInfo.FlgIs8021x = TRUE; - else - ConnInfo.FlgIs8021x = FALSE; - - CFG80211DBG(DBG_LVL_TRACE, ("Auth_type %x\n", pSme->auth_type)); - - if (pSme->auth_type == NL80211_AUTHTYPE_SHARED_KEY) - ConnInfo.AuthType = Ndis802_11AuthModeShared; - else if (pSme->auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM) - ConnInfo.AuthType = Ndis802_11AuthModeOpen; - else - ConnInfo.AuthType = Ndis802_11AuthModeAutoSwitch; - - if (Pairwise == WLAN_CIPHER_SUITE_CCMP) { - CFG80211DBG(DBG_LVL_TRACE, ("WLAN_CIPHER_SUITE_CCMP...\n")); - ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP; - } else if (Pairwise == WLAN_CIPHER_SUITE_TKIP) { - CFG80211DBG(DBG_LVL_TRACE, ("WLAN_CIPHER_SUITE_TKIP...\n")); - ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP; - } else if ((Pairwise == WLAN_CIPHER_SUITE_WEP40) || - (Pairwise & WLAN_CIPHER_SUITE_WEP104)) { - CFG80211DBG(DBG_LVL_TRACE, ("WLAN_CIPHER_SUITE_WEP...\n")); - ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_WEP; - } else { - CFG80211DBG(DBG_LVL_TRACE, ("NONE...\n")); - ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE; - } - - if (Groupwise == WLAN_CIPHER_SUITE_CCMP) - ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP; - else if (Groupwise == WLAN_CIPHER_SUITE_TKIP) - ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP; - else - ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE; - - CFG80211DBG(DBG_LVL_TRACE, - ("ConnInfo.KeyLen ===> %d\n", pSme->key_len)); - CFG80211DBG(DBG_LVL_TRACE, - ("ConnInfo.KeyIdx ===> %d\n", pSme->key_idx)); - ConnInfo.pKey = (UINT8 *)(pSme->key); - ConnInfo.KeyLen = pSme->key_len; - ConnInfo.pSsid = (UINT8 *)pSme->ssid; - ConnInfo.SsidLen = pSme->ssid_len; - ConnInfo.KeyIdx = pSme->key_idx; - /* YF@20120328: Reset to default */ - ConnInfo.bWpsConnection = FALSE; - ConnInfo.pNetDev = pNdev; -#ifdef DOT11W_PMF_SUPPORT -#if (KERNEL_VERSION(3, 10, 0) <= LINUX_VERSION_CODE) - CFG80211DBG(DBG_LVL_TRACE, ("80211> PMF Connect %d\n", pSme->mfp)); - - if (pSme->mfp) - ConnInfo.mfp = TRUE; - else - ConnInfo.mfp = FALSE; - -#endif /* LINUX_VERSION_CODE */ -#endif /* DOT11W_PMF_SUPPORT */ - /* hex_dump("AssocInfo:", pSme->ie, pSme->ie_len); */ - /* YF@20120328: Use SIOCSIWGENIE to make out the WPA/WPS IEs in AssocReq. */ - memset(&AssocIe, 0, sizeof(AssocIe)); - AssocIe.pNetDev = pNdev; - AssocIe.ie = (UINT8 *)pSme->ie; - AssocIe.ie_len = pSme->ie_len; - RTMP_DRIVER_80211_STA_ASSSOC_IE_SET(pAd, &AssocIe, - pNdev->ieee80211_ptr->iftype); - - if ((pSme->ie_len > 6) /* EID(1) + LEN(1) + OUI(4) */ && - (pSme->ie[0] == WLAN_EID_VENDOR_SPECIFIC && pSme->ie[1] >= 4 && - pSme->ie[2] == 0x00 && pSme->ie[3] == 0x50 && - pSme->ie[4] == 0xf2 && pSme->ie[5] == 0x04)) - ConnInfo.bWpsConnection = TRUE; - - /* %NULL if not specified (auto-select based on scan)*/ - if (pSme->bssid != NULL) { - CFG80211DBG( - DBG_LVL_OFF, - ("80211> Connect bssid %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pSme->bssid))); - ConnInfo.pBssid = (UINT8 *)pSme->bssid; - } - - RTMP_DRIVER_80211_CONNECT(pAd, &ConnInfo, pNdev->ieee80211_ptr->iftype); -#endif /*CONFIG_STA_SUPPORT*/ - return 0; -} /* End of CFG80211_OpsConnect */ - -/* - * ======================================================================== - * Routine Description: - * Disconnect from the BSS/ESS. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - Network device interface - * ReasonCode - - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * For iw utility: connect - *======================================================================== - */ -static int CFG80211_OpsDisconnect(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, - IN UINT16 ReasonCode) -{ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - VOID *pAd; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - CFG80211DBG(DBG_LVL_TRACE, ("80211> ReasonCode = %d\n", ReasonCode)); - MAC80211_PAD_GET(pAd, pWiphy); - RTMP_DRIVER_80211_STA_LEAVE(pAd, pNdev); -#endif /*CONFIG_STA_SUPPORT*/ - return 0; -} -#endif /* LINUX_VERSION_CODE */ - -#ifdef RFKILL_HW_SUPPORT -static int CFG80211_OpsRFKill(IN struct wiphy *pWiphy) -{ - VOID *pAd; - BOOLEAN active; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - RTMP_DRIVER_80211_RFKILL(pAd, &active); - wiphy_rfkill_set_hw_state(pWiphy, !active); - return active; -} - -VOID CFG80211_RFKillStatusUpdate(IN PVOID pAd, IN BOOLEAN active) -{ - struct wiphy *pWiphy; - CFG80211_CB *pCfg80211_CB; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - RTMP_DRIVER_80211_CB_GET(pAd, &pCfg80211_CB); - pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - wiphy_rfkill_set_hw_state(pWiphy, !active); -} -#endif /* RFKILL_HW_SUPPORT */ - -#if (KERNEL_VERSION(2, 6, 33) <= LINUX_VERSION_CODE) - -/* - * ======================================================================== - * Routine Description: - * Cache a PMKID for a BSSID. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - Network device interface - * pPmksa - PMKID information - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * This is mostly useful for fullmac devices running firmwares capable of - * generating the (re) association RSN IE. - * It allows for faster roaming between WPA2 BSSIDs. - * ======================================================================== - */ -static int CFG80211_OpsPmksaSet(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, - IN struct cfg80211_pmksa *pPmksa) -{ - return 0; -} /* End of CFG80211_OpsPmksaSet */ - -/* - * ======================================================================== - * Routine Description: - * Delete a cached PMKID. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - Network device interface - * pPmksa - PMKID information - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * ======================================================================== - */ -static int CFG80211_OpsPmksaDel(IN struct wiphy *pWiphy, - IN struct net_device *pNdev, - IN struct cfg80211_pmksa *pPmksa) -{ - return 0; -} /* End of CFG80211_OpsPmksaDel */ - -/* - * ======================================================================== - * Routine Description: - * Flush a cached PMKID. - * - * Arguments: - * pWiphy - Wireless hardware description - * pNdev - Network device interface - * - * Return Value: - * 0 - success - * -x - fail - * - * Note: - * ======================================================================== - */ -static int CFG80211_OpsPmksaFlush(IN struct wiphy *pWiphy, - IN struct net_device *pNdev) -{ - return 0; -} /* End of CFG80211_OpsPmksaFlush */ -#endif /* LINUX_VERSION_CODE */ - -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) -static int CFG80211_OpsRemainOnChannel(IN struct wiphy *pWiphy, - IN struct wireless_dev *pWdev, - IN struct ieee80211_channel *pChan, - IN unsigned int duration, - OUT u64 *cookie) -#else /* LINUX_VERSION_CODE >= 3.8.0 */ -static int CFG80211_OpsRemainOnChannel(IN struct wiphy *pWiphy, -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - IN struct wireless_dev *pWdev, -#else - IN struct net_device *dev, -#endif - IN struct ieee80211_channel *pChan, - IN enum nl80211_channel_type ChannelType, - IN unsigned int duration, - OUT u64 *cookie) -#endif /* LINUX_VERSION_CODE < 3.6.0 */ -{ - VOID *pAd; - UINT32 ChanId; - CMD_RTPRIV_IOCTL_80211_CHAN ChanInfo; - u32 rndCookie; -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) - INT ChannelType = RT_CMD_80211_CHANTYPE_HT20; -#endif /* LINUX_VERSION_CODE: 3.8.0 */ -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - struct net_device *dev = NULL; - - dev = pWdev->netdev; -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - rndCookie = MtRandom32() | 1; - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - /*CFG_TODO: Shall check channel type*/ - /* get channel number */ - ChanId = ieee80211_frequency_to_channel(pChan->center_freq); - CFG80211DBG(DBG_LVL_TRACE, - ("%s: CH = %d, Type = %d, duration = %d, cookie=%d\n", - __func__, ChanId, ChannelType, duration, rndCookie)); - /* init */ - *cookie = rndCookie; - memset(&ChanInfo, 0, sizeof(ChanInfo)); - ChanInfo.ChanId = ChanId; - ChanInfo.IfType = dev->ieee80211_ptr->iftype; - ChanInfo.ChanType = ChannelType; - ChanInfo.chan = pChan; - ChanInfo.cookie = rndCookie; -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - ChanInfo.pWdev = pWdev; -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - /* set channel */ - RTMP_DRIVER_80211_REMAIN_ON_CHAN_SET(pAd, &ChanInfo, duration); - return 0; -} - -static void CFG80211_OpsMgmtFrameRegister(struct wiphy *pWiphy, -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - struct wireless_dev *wdev, -#else - struct net_device *dev, -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - UINT16 frame_type, bool reg) -{ - VOID *pAd; -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - struct net_device *dev = NULL; -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - MAC80211_PAD_GET_NO_RV(pAd, pWiphy); -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - RTMP_DRIVER_NET_DEV_GET(pAd, &dev); -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - CFG80211DBG(DBG_LVL_INFO, ("80211> %s ==>\n", __func__)); - CFG80211DBG(DBG_LVL_INFO, - ("frame_type = %x, req = %d , (%d)\n", frame_type, reg, - dev->ieee80211_ptr->iftype)); - - if (frame_type == IEEE80211_STYPE_PROBE_REQ) - RTMP_DRIVER_80211_MGMT_FRAME_REG(pAd, dev, reg); - else if (frame_type == IEEE80211_STYPE_ACTION) - RTMP_DRIVER_80211_ACTION_FRAME_REG(pAd, dev, reg); - else - CFG80211DBG(DBG_LVL_ERROR, - ("Unkown frame_type = %x, req = %d\n", frame_type, - reg)); -} - -/* Supplicant_NEW_TDLS */ -#ifdef CFG_TDLS_SUPPORT -static int CFG80211_OpsTdlsMgmt(IN struct wiphy *pWiphy, - IN struct net_device *pDev, IN u8 *peer, - IN u8 action_code, IN u8 dialog_token, - IN u16 status_code, IN const u8 *extra_ies, - IN size_t extra_ies_len) -{ - int ret = 0; - VOID *pAd; - - CFG80211DBG(DBG_LVL_ERROR, - ("80211> extra_ies_len : %d ==>\n", extra_ies_len)); - MAC80211_PAD_GET(pAd, pWiphy); - - if (action_code == WLAN_TDLS_SETUP_REQUEST || - action_code == WLAN_TDLS_SETUP_RESPONSE) - RTMP_DRIVER_80211_STA_TDLS_SET_KEY_COPY_FLAG(pAd); - - switch (action_code) { - case WLAN_TDLS_SETUP_REQUEST: - case WLAN_TDLS_DISCOVERY_REQUEST: - case WLAN_TDLS_SETUP_CONFIRM: - case WLAN_TDLS_TEARDOWN: - case WLAN_TDLS_SETUP_RESPONSE: - case WLAN_PUB_ACTION_TDLS_DISCOVER_RES: - cfg_tdls_build_frame(pAd, peer, dialog_token, action_code, - status_code, extra_ies, extra_ies_len, - FALSE, 0, 0); - break; - - case TDLS_ACTION_CODE_WFD_TUNNELED_PROBE_REQ: - cfg_tdls_TunneledProbeRequest(pAd, peer, extra_ies, - extra_ies_len); - break; - - case TDLS_ACTION_CODE_WFD_TUNNELED_PROBE_RSP: - cfg_tdls_TunneledProbeResponse(pAd, peer, extra_ies, - extra_ies_len); - break; - - default: - ret = -1; - break; - } - - return ret; -} - -static int CFG80211_OpsTdlsOper(IN struct wiphy *pWiphy, - IN struct net_device *pDev, IN u8 *peer, - IN enum nl80211_tdls_operation oper) -{ - VOID *pAd; - - MAC80211_PAD_GET(pAd, pWiphy); - - switch (oper) { - case NL80211_TDLS_ENABLE_LINK: - RTMP_DRIVER_80211_STA_TDLS_INSERT_DELETE_PENTRY( - pAd, peer, tdls_insert_entry); - break; - - case NL80211_TDLS_DISABLE_LINK: - RTMP_DRIVER_80211_STA_TDLS_INSERT_DELETE_PENTRY( - pAd, peer, tdls_delete_entry); - break; - - default: - CFG80211DBG(DBG_LVL_ERROR, ("%s Unhandled TdlsOper : %d ==>\n", - __func__, oper)); - } - - return 0; -} -#endif /*CFG_TDLS_SUPPORT*/ - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) -static int CFG80211_OpsMgmtTx(IN struct wiphy *pWiphy, - IN struct wireless_dev *wdev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) - IN struct cfg80211_mgmt_tx_params *params, -#else - IN struct ieee80211_channel *pChan, - IN bool Offchan, IN unsigned int Wait, - IN const u8 *pBuf, IN size_t Len, IN bool no_cck, - IN bool done_wait_for_ack, -#endif - IN u64 *pCookie) -#else -static int CFG80211_OpsMgmtTx(IN struct wiphy *pWiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - IN struct wireless_dev *wdev, -#else - IN struct net_device *pDev, -#endif - IN struct ieee80211_channel *pChan, - IN bool Offchan, - IN enum nl80211_channel_type ChannelType, - IN bool ChannelTypeValid, IN unsigned int Wait, - IN const u8 *pBuf, IN size_t Len, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) - IN bool no_cck, -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) - IN bool done_wait_for_ack, -#endif - IN u64 *pCookie) -#endif /* LINUX_VERSION_CODE: 3.6.0 */ -{ - VOID *pAd; - UINT32 ChanId; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - struct net_device *dev = NULL; -#endif /* LINUX_VERSION_CODE: 3.6.0 */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) - struct ieee80211_channel *pChan = params->chan; - /* bool Offchan = params->offchan; */ - /* unsigned int Wait = params->wait; */ - const u8 *pBuf = params->buf; - size_t Len = params->len; - bool no_cck = params->no_cck; - /* bool done_wait_for_ack = params->dont_wait_for_ack; */ -#endif - - CFG80211DBG(DBG_LVL_INFO, ("80211> %s ==>\n", __FUNCTION__)); - MAC80211_PAD_GET(pAd, pWiphy); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - RTMP_DRIVER_NET_DEV_GET(pAd, &dev); -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - - /* get channel number */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) - if (pChan == NULL) - ChanId = 0; - else -#endif - ChanId = ieee80211_frequency_to_channel(pChan->center_freq); - CFG80211DBG(DBG_LVL_INFO, ("80211> Mgmt Channel = %d\n", ChanId)); - - /* Send the Frame with basic rate 6 */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) - if (no_cck) - ; /*pAd->isCfgDeviceInP2p = TRUE; */ -#else - -#endif - - *pCookie = 5678; - if (ChanId != 0) - RTMP_DRIVER_80211_CHANNEL_LOCK(pAd, ChanId); - - RTMP_DRIVER_80211_MGMT_FRAME_SEND(pAd, (VOID *)pBuf, Len); - - /* Mark it for using Supplicant-Based off-channel wait - if (Offchan) - RTMP_DRIVER_80211_CHANNEL_RESTORE(pAd); - */ - - return 0; -} - -static int CFG80211_OpsTxCancelWait(IN struct wiphy *pWiphy, -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - IN struct wireless_dev *wdev, -#else - IN struct net_device *pDev, -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - u64 cookie) -{ - CFG80211DBG(DBG_LVL_ERROR, ("80211> %s ==>\n", __func__)); - return 0; -} - -static int CFG80211_OpsCancelRemainOnChannel(struct wiphy *pWiphy, -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - struct wireless_dev *wdev, -#else - struct net_device *dev, -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - u64 cookie) -{ - VOID *pAd; - - CFG80211DBG(DBG_LVL_INFO, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - /* It cause the Supplicant-based OffChannel Hang */ - RTMP_DRIVER_80211_CANCEL_REMAIN_ON_CHAN_SET(pAd, cookie); - return 0; -} - -#ifdef CONFIG_AP_SUPPORT -#if (KERNEL_VERSION(3, 4, 0) > LINUX_VERSION_CODE) -static int CFG80211_OpsSetBeacon(struct wiphy *pWiphy, - struct net_device *netdev, - struct beacon_parameters *info) -{ - VOID *pAd; - CMD_RTPRIV_IOCTL_80211_BEACON bcn; - UCHAR *beacon_head_buf, *beacon_tail_buf; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - hex_dump("Beacon head", info->head, info->head_len); - hex_dump("Beacon tail", info->tail, info->tail_len); - CFG80211DBG(DBG_LVL_TRACE, - ("80211>dtim_period = %d\n", info->dtim_period)); - CFG80211DBG(DBG_LVL_TRACE, ("80211>interval = %d\n", info->interval)); -#if (KERNEL_VERSION(3, 2, 0) <= LINUX_VERSION_CODE) - CFG80211DBG(DBG_LVL_TRACE, ("80211>ssid = %s\n", info->ssid)); - CFG80211DBG(DBG_LVL_TRACE, ("80211>ssid_len = %d\n", info->ssid_len)); - CFG80211DBG(DBG_LVL_TRACE, - ("80211>beacon_ies_len = %d\n", info->beacon_ies_len)); - CFG80211DBG(DBG_LVL_TRACE, ("80211>proberesp_ies_len = %d\n", - info->proberesp_ies_len)); - CFG80211DBG(DBG_LVL_TRACE, ("80211>assocresp_ies_len = %d\n", - info->assocresp_ies_len)); - - if (info->proberesp_ies_len > 0 && info->proberesp_ies) - RTMP_DRIVER_80211_AP_PROBE_RSP(pAd, (VOID *)info->proberesp_ies, - info->proberesp_ies_len); - - if (info->assocresp_ies_len > 0 && info->assocresp_ies) - RTMP_DRIVER_80211_AP_ASSOC_RSP(pAd, (VOID *)info->assocresp_ies, - info->assocresp_ies_len); - -#endif - os_alloc_mem(NULL, &beacon_head_buf, info->head_len); - NdisCopyMemory(beacon_head_buf, info->head, info->head_len); - os_alloc_mem(NULL, &beacon_tail_buf, info->tail_len); - NdisCopyMemory(beacon_tail_buf, info->tail, info->tail_len); - bcn.beacon_head_len = info->head_len; - bcn.beacon_tail_len = info->tail_len; - bcn.beacon_head = beacon_head_buf; - bcn.beacon_tail = beacon_tail_buf; - bcn.dtim_period = info->dtim_period; - bcn.interval = info->interval; - RTMP_DRIVER_80211_BEACON_SET(pAd, &bcn); - - if (beacon_head_buf) - os_free_mem(beacon_head_buf); - - if (beacon_tail_buf) - os_free_mem(beacon_tail_buf); - - return 0; -} - -static int CFG80211_OpsAddBeacon(struct wiphy *pWiphy, - struct net_device *netdev, - struct beacon_parameters *info) -{ - VOID *pAd; - CMD_RTPRIV_IOCTL_80211_BEACON bcn; - UCHAR *beacon_head_buf, *beacon_tail_buf; - - MAC80211_PAD_GET(pAd, pWiphy); - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - hex_dump("Beacon head", info->head, info->head_len); - hex_dump("Beacon tail", info->tail, info->tail_len); - CFG80211DBG(DBG_LVL_TRACE, - ("80211>dtim_period = %d\n", info->dtim_period)); - CFG80211DBG(DBG_LVL_TRACE, ("80211>interval = %d\n", info->interval)); -#if (KERNEL_VERSION(3, 2, 0) <= LINUX_VERSION_CODE) - CFG80211DBG(DBG_LVL_TRACE, ("80211>ssid = %s\n", info->ssid)); - CFG80211DBG(DBG_LVL_TRACE, ("80211>ssid_len = %d\n", info->ssid_len)); - CFG80211DBG(DBG_LVL_TRACE, - ("80211>beacon_ies_len = %d\n", info->beacon_ies_len)); - CFG80211DBG(DBG_LVL_TRACE, ("80211>proberesp_ies_len = %d\n", - info->proberesp_ies_len)); - CFG80211DBG(DBG_LVL_TRACE, ("80211>assocresp_ies_len = %d\n", - info->assocresp_ies_len)); - - if (info->proberesp_ies_len > 0 && info->proberesp_ies) - RTMP_DRIVER_80211_AP_PROBE_RSP(pAd, (VOID *)info->proberesp_ies, - info->proberesp_ies_len); - - if (info->assocresp_ies_len > 0 && info->assocresp_ies) - RTMP_DRIVER_80211_AP_ASSOC_RSP(pAd, (VOID *)info->assocresp_ies, - info->assocresp_ies_len); - -#endif - os_alloc_mem(NULL, &beacon_head_buf, info->head_len); - NdisCopyMemory(beacon_head_buf, info->head, info->head_len); - os_alloc_mem(NULL, &beacon_tail_buf, info->tail_len); - NdisCopyMemory(beacon_tail_buf, info->tail, info->tail_len); - bcn.beacon_head_len = info->head_len; - bcn.beacon_tail_len = info->tail_len; - bcn.beacon_head = beacon_head_buf; - bcn.beacon_tail = beacon_tail_buf; - bcn.dtim_period = info->dtim_period; - bcn.interval = info->interval; - RTMP_DRIVER_80211_BEACON_ADD(pAd, &bcn); - - if (beacon_head_buf) - os_free_mem(beacon_head_buf); - - if (beacon_tail_buf) - os_free_mem(beacon_tail_buf); - - return 0; -} - -static int CFG80211_OpsDelBeacon(struct wiphy *pWiphy, - struct net_device *netdev) -{ - VOID *pAd; - - MAC80211_PAD_GET(pAd, pWiphy); - CFG80211DBG(DBG_LVL_ERROR, ("80211> %s ==>\n", __func__)); - RTMP_DRIVER_80211_BEACON_DEL(pAd); - return 0; -} -#else /* ! LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0) */ - -static int CFG80211_OpsStartAp(struct wiphy *pWiphy, struct net_device *netdev, - struct cfg80211_ap_settings *settings) -{ - VOID *pAdOrg; - PRTMP_ADAPTER pAd; - CMD_RTPRIV_IOCTL_80211_BEACON bcn; - UCHAR *beacon_head_buf = NULL, *beacon_tail_buf = NULL; - INT apidx; - struct wifi_dev *pWdev = NULL; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __FUNCTION__)); - - MAC80211_PAD_GET(pAdOrg, pWiphy); - pAd = (PRTMP_ADAPTER)pAdOrg; - - apidx = CFG80211_FindMbssApIdxByNetDevice(pAd, netdev); - if (apidx == WDEV_NOT_FOUND) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s failed - [ERROR]can't find wdev in driver MBSS. \n", - __func__)); - return FALSE; - } - pWdev = &pAd->ApCfg.MBSSID[apidx].wdev; - NdisZeroMemory(&bcn, sizeof(CMD_RTPRIV_IOCTL_80211_BEACON)); - /* update info into bcn structure */ - bcn.apidx = apidx; - bcn.pNetDev = netdev; - - if (settings->beacon.head_len > 0) { - os_alloc_mem(NULL, &beacon_head_buf, settings->beacon.head_len); - if (beacon_head_buf == NULL) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Alloc memory fail\n", __func__)); - return 0; - } - NdisCopyMemory(beacon_head_buf, settings->beacon.head, - settings->beacon.head_len); - } - - if (settings->beacon.tail_len > 0) { - os_alloc_mem(NULL, &beacon_tail_buf, settings->beacon.tail_len); - if (beacon_tail_buf == NULL) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Alloc memory fail\n", __func__)); - if (beacon_head_buf) - os_free_mem(beacon_head_buf); - return 0; - } - NdisCopyMemory(beacon_tail_buf, settings->beacon.tail, - settings->beacon.tail_len); - } - - bcn.beacon_head_len = settings->beacon.head_len; - bcn.beacon_tail_len = settings->beacon.tail_len; - bcn.beacon_head = beacon_head_buf; - bcn.beacon_tail = beacon_tail_buf; - bcn.dtim_period = settings->dtim_period; - bcn.interval = settings->beacon_interval; - bcn.ssid_len = settings->ssid_len; - bcn.privacy = settings->privacy; - - if (settings->crypto.akm_suites[0] == WLAN_AKM_SUITE_8021X) { - CFG80211DBG(DBG_LVL_ERROR, ("80211> This is a 1X wdev\n")); - pWdev->IsCFG1xWdev = TRUE; - } else { - pWdev->IsCFG1xWdev = FALSE; - } - - NdisZeroMemory(&bcn.ssid[0], MAX_LEN_OF_SSID); - if (settings->ssid && (settings->ssid_len <= 32)) - NdisCopyMemory(&bcn.ssid[0], settings->ssid, - settings->ssid_len); - bcn.auth_type = settings->auth_type; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) - bcn.hidden_ssid = settings->hidden_ssid; -#endif /*LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)*/ - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - /* set channel callback has been replaced by using chandef of cfg80211_ap_settings */ - if (settings->chandef.chan) { - CFG80211_CB *p80211CB; - CMD_RTPRIV_IOCTL_80211_CHAN ChanInfo; - - /* init */ - memset(&ChanInfo, 0, sizeof(ChanInfo)); - - p80211CB = NULL; - RTMP_DRIVER_80211_CB_GET(pAd, &p80211CB); - - if (p80211CB == NULL) { - CFG80211DBG(DBG_LVL_ERROR, - ("80211> p80211CB == NULL!\n")); - return 0; - } - - /* get channel number */ - - ChanInfo.ChanId = ieee80211_frequency_to_channel( - settings->chandef.chan->center_freq); - ChanInfo.CenterChanId = ieee80211_frequency_to_channel( - settings->chandef.center_freq1); - CFG80211DBG(DBG_LVL_ERROR, - ("80211> Channel = %d, CenterChanId = %d\n", - ChanInfo.ChanId, ChanInfo.CenterChanId)); - - ChanInfo.IfType = RT_CMD_80211_IFTYPE_P2P_GO; - - CFG80211DBG(DBG_LVL_ERROR, ("80211> ChanInfo.IfType == %d!\n", - ChanInfo.IfType)); - - switch (settings->chandef.width) { - case NL80211_CHAN_WIDTH_20_NOHT: - ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_NOHT; - break; - - case NL80211_CHAN_WIDTH_20: - ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT20; - break; - - case NL80211_CHAN_WIDTH_40: - if (settings->chandef.center_freq1 > - settings->chandef.chan->center_freq) - ChanInfo.ChanType = - RT_CMD_80211_CHANTYPE_HT40PLUS; - else - ChanInfo.ChanType = - RT_CMD_80211_CHANTYPE_HT40MINUS; - break; - -#ifdef DOT11_VHT_AC - case NL80211_CHAN_WIDTH_80: - CFG80211DBG( - DBG_LVL_ERROR, - ("80211> NL80211_CHAN_WIDTH_80 CtrlCh: %d, CentCh: %d\n", - ChanInfo.ChanId, ChanInfo.CenterChanId)); - ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_VHT80; - break; - - /* Separated BW 80 and BW 160 is not supported yet */ - case NL80211_CHAN_WIDTH_80P80: - case NL80211_CHAN_WIDTH_160: -#endif /* DOT11_VHT_AC */ - - default: - CFG80211DBG(DBG_LVL_ERROR, - ("80211> Unsupported Chan Width: %d\n", - settings->chandef.width)); - ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_NOHT; - break; - } - - CFG80211DBG(DBG_LVL_ERROR, ("80211> ChanInfo.ChanType == %d!\n", - ChanInfo.ChanType)); - ChanInfo.MonFilterFlag = p80211CB->MonFilterFlag; - - /* set channel */ - RTMP_DRIVER_80211_CHAN_SET(pAd, &ChanInfo); - } -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) */ - - RTMP_DRIVER_80211_BEACON_ADD(pAd, &bcn); - - if (beacon_head_buf) - os_free_mem(beacon_head_buf); - if (beacon_tail_buf) - os_free_mem(beacon_tail_buf); - - return 0; -} - -VOID CFG80211_UpdateAssocRespExtraIe(VOID *pAdOrg, UINT32 apidx, - UCHAR *assocresp_ies, - UINT32 assocresp_ies_len) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - PUCHAR pAssocRespBuf = - (PUCHAR)pAd->ApCfg.MBSSID[apidx].AssocRespExtraIe; - - CFG80211DBG(DBG_LVL_TRACE, - ("%s: IE len = %d\n", __FUNCTION__, assocresp_ies_len)); - if (assocresp_ies_len > - sizeof(pAd->ApCfg.MBSSID[apidx].AssocRespExtraIe)) { - CFG80211DBG(DBG_LVL_TRACE, - ("%s: AssocResp buf size not enough\n", - __FUNCTION__)); - return; - } - NdisCopyMemory(pAssocRespBuf, assocresp_ies, assocresp_ies_len); - pAd->ApCfg.MBSSID[apidx].AssocRespExtraIeLen = assocresp_ies_len; -} - -static int CFG80211_OpsChangeBeacon(struct wiphy *pWiphy, - struct net_device *netdev, - struct cfg80211_beacon_data *info) -{ - VOID *pAd; - CMD_RTPRIV_IOCTL_80211_BEACON bcn; - UCHAR *beacon_head_buf = NULL, *beacon_tail_buf = NULL; - const UCHAR *ssid_ie = NULL; - memset(&bcn, 0, sizeof(CMD_RTPRIV_IOCTL_80211_BEACON)); - - MAC80211_PAD_GET(pAd, pWiphy); - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __FUNCTION__)); - - if (info->head_len > 0) { - os_alloc_mem(NULL, &beacon_head_buf, info->head_len); - if (beacon_head_buf == NULL) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Alloc memory fail\n", __func__)); - return 0; - } - NdisCopyMemory(beacon_head_buf, info->head, info->head_len); - } - - if (info->tail_len > 0) { - os_alloc_mem(NULL, &beacon_tail_buf, info->tail_len); - if (beacon_tail_buf == NULL) { - MTWF_LOG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Alloc memory fail\n", __func__)); - if (beacon_head_buf) - os_free_mem(beacon_head_buf); - return 0; - } - NdisCopyMemory(beacon_tail_buf, info->tail, info->tail_len); - } - - bcn.beacon_head_len = info->head_len; - bcn.beacon_tail_len = info->tail_len; - bcn.beacon_head = beacon_head_buf; - bcn.beacon_tail = beacon_tail_buf; - - bcn.apidx = get_apidx_by_addr(pAd, bcn.beacon_head + 10); - CFG80211DBG(DBG_LVL_TRACE, ("%s apidx %d \n", __FUNCTION__, bcn.apidx)); - - ssid_ie = cfg80211_find_ie(WLAN_EID_SSID, bcn.beacon_head + 36, - bcn.beacon_head_len - 36); - bcn.ssid_len = *(ssid_ie + 1); - /* Update assoc resp extra ie */ - if (info->assocresp_ies_len && info->assocresp_ies) { - CFG80211_UpdateAssocRespExtraIe(pAd, bcn.apidx, - (UCHAR *)info->assocresp_ies, - info->assocresp_ies_len); - } - - RTMP_DRIVER_80211_BEACON_SET(pAd, &bcn); - - if (beacon_head_buf) - os_free_mem(beacon_head_buf); - if (beacon_tail_buf) - os_free_mem(beacon_tail_buf); - return 0; -} - -static int CFG80211_OpsStopAp(struct wiphy *pWiphy, struct net_device *netdev) -{ - VOID *pAd; - INT apidx; - MAC80211_PAD_GET(pAd, pWiphy); - CFG80211DBG(DBG_LVL_ERROR, ("80211> %s ==>\n", __func__)); - apidx = CFG80211_FindMbssApIdxByNetDevice(pAd, netdev); - RTMP_DRIVER_80211_BEACON_DEL(pAd, apidx); - return 0; -} -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0) */ -#endif /* CONFIG_AP_SUPPORT */ - -static int CFG80211_OpsChangeBss(struct wiphy *pWiphy, - struct net_device *netdev, - struct bss_parameters *params) -{ - VOID *pAd; - CMD_RTPRIV_IOCTL_80211_BSS_PARM bssInfo; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - MAC80211_PAD_GET(pAd, pWiphy); - bssInfo.use_short_preamble = params->use_short_preamble; - bssInfo.use_short_slot_time = params->use_short_slot_time; - bssInfo.use_cts_prot = params->use_cts_prot; - RTMP_DRIVER_80211_CHANGE_BSS_PARM(pAd, &bssInfo); - return 0; -} -#ifdef HOSTAPD_MAP_SUPPORT -static int CFG80211_OpsStaDel(struct wiphy *pWiphy, struct net_device *dev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) - struct station_del_parameters *params) -#else - UINT8 *pMacAddr) -#endif -{ - VOID *pAd; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) - const UINT8 *pMacAddr = params->mac; -#endif - CMD_RTPRIV_IOCTL_AP_STA_DEL rApStaDel = { .pSta_MAC = NULL, - .pWdev = NULL }; - - MAC80211_PAD_GET(pAd, pWiphy); - - if (dev) { - rApStaDel.pWdev = RTMP_OS_NETDEV_GET_WDEV(dev); - CFG80211DBG( - DBG_LVL_OFF, - ("80211> %s ==> for bssid (%02X:%02X:%02X:%02X:%02X:%02X)\n", - __func__, PRINT_MAC(rApStaDel.pWdev->bssid))); - } else - CFG80211DBG(DBG_LVL_OFF, ("80211> %s ==>", __func__)); - - if (pMacAddr) { - CFG80211DBG( - DBG_LVL_TRACE, - ("80211> Delete STA(%02X:%02X:%02X:%02X:%02X:%02X) ==>\n", - PRINT_MAC(pMacAddr))); - rApStaDel.pSta_MAC = (UINT8 *)pMacAddr; - } -#if (KERNEL_VERSION(3, 19, 0) <= LINUX_VERSION_CODE) - RTMP_DRIVER_80211_AP_STA_DEL(pAd, (VOID *)&rApStaDel, - params->reason_code); -#else - RTMP_DRIVER_80211_AP_STA_DEL(pAd, (VOID *)&rApStaDel, 0); -#endif - CFG80211DBG(DBG_LVL_OFF, ("80211> %s <==", __func__)); - - return 0; -} -#else -static int CFG80211_OpsStaDel(struct wiphy *pWiphy, struct net_device *dev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) - struct station_del_parameters *params) -#else - UINT8 *pMacAddr) -#endif - -{ - VOID *pAd; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) - const UINT8 *pMacAddr = params->mac; -#endif - - MAC80211_PAD_GET(pAd, pWiphy); - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - - if (pMacAddr == NULL) - RTMP_DRIVER_80211_AP_STA_DEL(pAd, NULL, 0); - else { - CFG80211DBG( - DBG_LVL_TRACE, - ("80211> Delete STA(%02X:%02X:%02X:%02X:%02X:%02X) ==>\n", - PRINT_MAC(pMacAddr))); - -#if (KERNEL_VERSION(3, 19, 0) <= LINUX_VERSION_CODE) - RTMP_DRIVER_80211_AP_STA_DEL(pAd, (VOID *)pMacAddr, - params->reason_code); -#else - RTMP_DRIVER_80211_AP_STA_DEL(pAd, (VOID *)pMacAddr, 0); -#endif - } - - return 0; -} -#endif /* HOSTAPD_MAP_SUPPORT */ - -static int CFG80211_OpsStaAdd(struct wiphy *wiphy, struct net_device *dev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) - const UINT8 *mac, -#else - UINT8 *mac, -#endif - - struct station_parameters *params) -{ - CFG80211DBG(DBG_LVL_TRACE, ("80211> %s ==>\n", __func__)); - return 0; -} - -static int CFG80211_OpsStaChg(struct wiphy *pWiphy, struct net_device *dev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) - const UINT8 *pMacAddr, -#else - UINT8 *pMacAddr, -#endif - struct station_parameters *params) -{ - void *pAd; - CFG80211_CB *p80211CB; - - CFG80211DBG(DBG_LVL_TRACE, - ("80211> Change STA(%02X:%02X:%02X:%02X:%02X:%02X) ==>\n", - PRINT_MAC(pMacAddr))); - MAC80211_PAD_GET(pAd, pWiphy); - - p80211CB = NULL; - RTMP_DRIVER_80211_CB_GET(pAd, &p80211CB); - - if ((dev->ieee80211_ptr->iftype != RT_CMD_80211_IFTYPE_AP) && - (dev->ieee80211_ptr->iftype != RT_CMD_80211_IFTYPE_P2P_GO)) - return -EOPNOTSUPP; - /* vikas: used for VLAN, along with auth flag - if(!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) - { - CFG80211DBG(DBG_LVL_ERROR, ("80211> %x ==>\n", params->sta_flags_mask)); - return -EOPNOTSUPP; - } -*/ - if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) { - if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED)) { - CFG80211DBG( - DBG_LVL_TRACE, - ("80211> STA(%02X:%02X:%02X:%02X:%02X:%02X) ==> PortSecured\n", - PRINT_MAC(pMacAddr))); - RTMP_DRIVER_80211_AP_MLME_PORT_SECURED( - pAd, (VOID *)pMacAddr, 1); - } else { - CFG80211DBG( - DBG_LVL_TRACE, - ("80211> STA(%02X:%02X:%02X:%02X:%02X:%02X) ==> PortNotSecured\n", - PRINT_MAC(pMacAddr))); - RTMP_DRIVER_80211_AP_MLME_PORT_SECURED( - pAd, (VOID *)pMacAddr, 0); - } - } - return 0; -} - -static const struct ieee80211_txrx_stypes - ralink_mgmt_stypes[NUM_NL80211_IFTYPES] = { - [NL80211_IFTYPE_STATION] = { - .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_RESP >> 4), - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_P2P_CLIENT] = { - .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_RESP >> 4), - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_AP] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4), - }, - [NL80211_IFTYPE_P2P_GO] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4), - }, - -}; - -#if (KERNEL_VERSION(3, 0, 0) <= LINUX_VERSION_CODE) -static const struct ieee80211_iface_limit ra_p2p_sta_go_limits[] = { - { - .max = 8, - .types = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP), - }, -}; - -static const struct ieee80211_iface_combination ra_iface_combinations_p2p[] = { - { -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - .num_different_channels = 2, -#else - .num_different_channels = 1, -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ -#ifdef DBDC_MODE - .max_interfaces = 8, -#else - .max_interfaces = 4, -#endif - /* CFG TODO*/ - /* .beacon_int_infra_match = true, */ - .limits = ra_p2p_sta_go_limits, - .n_limits = ARRAY_SIZE(ra_p2p_sta_go_limits), - }, -}; -#endif /* LINUX_VERSION_CODE: 3.8.0 */ - -struct cfg80211_ops CFG80211_Ops = { -#ifdef CFG_TDLS_SUPPORT -#if (KERNEL_VERSION(3, 4, 0) < LINUX_VERSION_CODE) - .tdls_mgmt = CFG80211_OpsTdlsMgmt, - .tdls_oper = CFG80211_OpsTdlsOper, -#endif -#endif /* CFG_TDLS_SUPPORT */ -#ifdef CONFIG_AP_SUPPORT -#if (KERNEL_VERSION(3, 4, 0) > LINUX_VERSION_CODE) - .set_beacon = CFG80211_OpsSetBeacon, - .add_beacon = CFG80211_OpsAddBeacon, - .del_beacon = CFG80211_OpsDelBeacon, -#else - .start_ap = CFG80211_OpsStartAp, - .change_beacon = CFG80211_OpsChangeBeacon, - .stop_ap = CFG80211_OpsStopAp, -#endif /* LINUX_VERSION_CODE 3.4 */ -#endif /* CONFIG_AP_SUPPORT */ -/* set channel for a given wireless interface */ -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) -/* CFG_TODO */ -/* .set_monitor_channel = CFG80211_OpsMonitorChannelSet, */ -#else - .set_channel = CFG80211_OpsChannelSet, -#endif /* LINUX_VERSION_CODE: 3.6.0 */ - - /* change type/configuration of virtual interface */ - .change_virtual_intf = CFG80211_OpsVirtualInfChg, - -#if (KERNEL_VERSION(2, 6, 30) <= LINUX_VERSION_CODE) - /* request to do a scan */ - /* - * Note: must exist whatever AP or STA mode; Or your kernel will crash - * in v2.6.38. - */ - .scan = CFG80211_OpsScan, -#endif /* LINUX_VERSION_CODE */ - -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) -#endif /* LINUX_VERSION_CODE */ - -#if (KERNEL_VERSION(2, 6, 32) <= LINUX_VERSION_CODE) -#if (KERNEL_VERSION(3, 8, 0) > LINUX_VERSION_CODE) - /* set the transmit power according to the parameters */ - .set_tx_power = CFG80211_OpsTxPwrSet, - /* store the current TX power into the dbm variable */ - .get_tx_power = CFG80211_OpsTxPwrGet, -#endif /* LINUX_VERSION_CODE: 3.8.0 */ - /* configure WLAN power management */ - .set_power_mgmt = CFG80211_OpsPwrMgmt, - /* get station information for the station identified by @mac */ - .get_station = CFG80211_OpsStaGet, - /* dump station callback */ - .dump_station = CFG80211_OpsStaDump, - /* notify that wiphy parameters have changed */ - .set_wiphy_params = CFG80211_OpsWiphyParamsSet, - /* add a key with the given parameters */ - .add_key = CFG80211_OpsKeyAdd, - /* get information about the key with the given parameters */ - .get_key = CFG80211_OpsKeyGet, - /* remove a key given the @mac_addr */ - .del_key = CFG80211_OpsKeyDel, - /* set the default key on an interface */ - .set_default_key = CFG80211_OpsKeyDefaultSet, -#ifdef DOT11W_PMF_SUPPORT - /* set the default mgmt key on an interface */ - .set_default_mgmt_key = CFG80211_OpsMgmtKeyDefaultSet, -#endif /*DOT11W_PMF_SUPPORT*/ - /* connect to the ESS with the specified parameters */ - .connect = CFG80211_OpsConnect, - /* disconnect from the BSS/ESS */ - .disconnect = CFG80211_OpsDisconnect, -#endif /* LINUX_VERSION_CODE */ - -#ifdef RFKILL_HW_SUPPORT - /* polls the hw rfkill line */ - .rfkill_poll = CFG80211_OpsRFKill, -#endif /* RFKILL_HW_SUPPORT */ - - /* get site survey information */ - /* .dump_survey = CFG80211_OpsSurveyGet, */ - /* cache a PMKID for a BSSID */ - .set_pmksa = CFG80211_OpsPmksaSet, - /* delete a cached PMKID */ - .del_pmksa = CFG80211_OpsPmksaDel, - /* flush all cached PMKIDs */ - .flush_pmksa = CFG80211_OpsPmksaFlush, - - /* - * Request the driver to remain awake on the specified - * channel for the specified duration to complete an off-channel - * operation (e.g., public action frame exchange). - */ - .remain_on_channel = CFG80211_OpsRemainOnChannel, - /* cancel an on-going remain-on-channel operation */ - .cancel_remain_on_channel = CFG80211_OpsCancelRemainOnChannel, - .mgmt_tx = CFG80211_OpsMgmtTx, - - .mgmt_tx_cancel_wait = CFG80211_OpsTxCancelWait, - - /* configure connection quality monitor RSSI threshold */ - .set_cqm_rssi_config = NULL, - - /* notify driver that a management frame type was registered */ - .mgmt_frame_register = CFG80211_OpsMgmtFrameRegister, - - /* set antenna configuration (tx_ant, rx_ant) on the device */ - .set_antenna = NULL, - /* get current antenna configuration from device (tx_ant, rx_ant) */ - .get_antenna = NULL, - .change_bss = CFG80211_OpsChangeBss, - .del_station = CFG80211_OpsStaDel, - .add_station = CFG80211_OpsStaAdd, - .change_station = CFG80211_OpsStaChg, - /* .set_bitrate_mask = CFG80211_OpsBitrateSet, */ -}; - -/* =========================== Global Function ============================== */ - -static INT CFG80211NetdevNotifierEvent(struct notifier_block *nb, ULONG state, - VOID *ndev) -{ - VOID *pAd; - struct net_device *pNev = ndev; - struct wireless_dev *pWdev = pNev->ieee80211_ptr; - - if (!ndev || !pWdev || !pWdev->wiphy) - return NOTIFY_DONE; - - MAC80211_PAD_GET(pAd, pWdev->wiphy); - - if (!pAd) - return NOTIFY_DONE; - - switch (state) { - case NETDEV_UNREGISTER: - break; - - case NETDEV_GOING_DOWN: - RTMP_DRIVER_80211_NETDEV_EVENT(pAd, pNev, state); - break; - } - - return NOTIFY_DONE; -} - -struct notifier_block cfg80211_netdev_notifier = { - .notifier_call = CFG80211NetdevNotifierEvent, -}; - -/* - * ======================================================================== - * Routine Description: - * Allocate a wireless device. - * - * Arguments: - * pAd - WLAN control block pointer - * pDev - Generic device interface - * - * Return Value: - * wireless device - * - * Note: - * ======================================================================== - */ -static struct wireless_dev *CFG80211_WdevAlloc(IN CFG80211_CB *pCfg80211_CB, - IN CFG80211_BAND *pBandInfo, - IN VOID *pAd, - IN struct device *pDev) -{ - struct wireless_dev *pWdev; - ULONG *pPriv; - /* - * We're trying to have the following memory layout: - * - * +------------------------+ - * | struct wiphy | - * +------------------------+ - * | pAd pointer | - * +------------------------+ - */ - os_alloc_mem_suspend(NULL, (UCHAR **)&pWdev, sizeof(*pWdev)); - - if (pWdev == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> Wireless device allocation fail!\n")); - return NULL; - } /* End of if */ - os_zero_mem((PUCHAR)pWdev, sizeof(*pWdev)); - -#if defined(PLATFORM_M_STB) -#if (KERNEL_VERSION(3, 0, 0) <= LINUX_VERSION_CODE) - pWdev->use_4addr = true; -#endif /* LINUX_VERSION_CODE 3.0.0 */ -#endif - - pWdev->wiphy = wiphy_new(&CFG80211_Ops, sizeof(ULONG *)); - - if (pWdev->wiphy == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> Wiphy device allocation fail!\n")); - goto LabelErrWiphyNew; - } /* End of if */ - - /* keep pAd pointer */ - pPriv = (ULONG *)(wiphy_priv(pWdev->wiphy)); - *pPriv = (ULONG)pAd; - set_wiphy_dev(pWdev->wiphy, pDev); - /* max_scan_ssids means in each scan request, how many ssids can driver handle to send probe-req. - * In current design, we only support 1 ssid at a time. So we should set to 1. - */ - /* pWdev->wiphy->max_scan_ssids = pBandInfo->MaxBssTable; */ - pWdev->wiphy->max_scan_ssids = 1; -#if (KERNEL_VERSION(3, 4, 0) <= LINUX_VERSION_CODE) - /* @NL80211_FEATURE_INACTIVITY_TIMER: - * This driver takes care of freeingup - * the connected inactive stations in AP mode. - */ - /*what if you get compile error for below flag, please add the patch into your kernel*/ - /* http://www.permalink.gmane.org/gmane.linux.kernel.wireless.general/86454 */ - pWdev->wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER; -#endif - pWdev->wiphy->interface_modes = - BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_STATION); - /* pWdev->wiphy->reg_notifier = CFG80211_RegNotifier; */ - /* init channel information */ - CFG80211_SupBandInit(pCfg80211_CB, pBandInfo, pWdev->wiphy, NULL, NULL); - /* CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) */ - pWdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; - pWdev->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; - pWdev->wiphy->max_num_pmkids = 4; - pWdev->wiphy->max_remain_on_channel_duration = 5000; - pWdev->wiphy->mgmt_stypes = ralink_mgmt_stypes; - pWdev->wiphy->cipher_suites = CipherSuites; - pWdev->wiphy->n_cipher_suites = ARRAY_SIZE(CipherSuites); - pWdev->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; - /*what if you get compile error for below flag, please add the patch into your kernel*/ - /* 018-cfg80211-internal-ap-mlme.patch */ - pWdev->wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; - /*what if you get compile error for below flag, please add the patch into your kernel*/ - /* 008-cfg80211-offchan-flags.patch */ - pWdev->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; - /* CFG_TODO */ - /* pWdev->wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY; */ - -#if defined(PLATFORM_M_STB) - pWdev->wiphy->flags |= WIPHY_FLAG_4ADDR_STATION; -#endif - - /* Driver Report Support TDLS to supplicant */ -#ifdef CFG_TDLS_SUPPORT - pWdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; - pWdev->wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP; -#endif /* CFG_TDLS_SUPPORT */ - /* CFG_TODO */ - /* pWdev->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; */ -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) - pWdev->wiphy->iface_combinations = ra_iface_combinations_p2p; - pWdev->wiphy->n_iface_combinations = - ARRAY_SIZE(ra_iface_combinations_p2p); -#endif - - if (wiphy_register(pWdev->wiphy) < 0) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> Register wiphy device fail!\n")); - goto LabelErrReg; - } - - return pWdev; -LabelErrReg: - wiphy_free(pWdev->wiphy); -LabelErrWiphyNew: - os_free_mem(pWdev); - return NULL; -} /* End of CFG80211_WdevAlloc */ - -/* - * ======================================================================== - * Routine Description: - * Register MAC80211 Module. - * - * Arguments: - * pAdCB - WLAN control block pointer - * pDev - Generic device interface - * pNetDev - Network device - * - * Return Value: - * NONE - * - * Note: - * pDev != pNetDev - * #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev)) - * - * Can not use pNetDev to replace pDev; Or kernel panic. - * ======================================================================== - */ -BOOLEAN CFG80211_Register(IN VOID *pAd, IN struct device *pDev, - IN struct net_device *pNetDev) -{ - CFG80211_CB *pCfg80211_CB = NULL; - CFG80211_BAND BandInfo; - INT err = 0; - /* allocate Main Device Info structure */ - os_alloc_mem(NULL, (UCHAR **)&pCfg80211_CB, sizeof(CFG80211_CB)); - - if (pCfg80211_CB == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> Allocate MAC80211 CB fail!\n")); - return FALSE; - } - - /* allocate wireless device */ - RTMP_DRIVER_80211_BANDINFO_GET(pAd, &BandInfo); - pCfg80211_CB->pCfg80211_Wdev = - CFG80211_WdevAlloc(pCfg80211_CB, &BandInfo, pAd, pDev); - - if (pCfg80211_CB->pCfg80211_Wdev == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> Allocate Wdev fail!\n")); - os_free_mem(pCfg80211_CB); - return FALSE; - } - - /* bind wireless device with net device */ -#ifdef CONFIG_AP_SUPPORT - /* default we are AP mode */ - pCfg80211_CB->pCfg80211_Wdev->iftype = NL80211_IFTYPE_AP; -#endif /* CONFIG_AP_SUPPORT */ - pNetDev->ieee80211_ptr = pCfg80211_CB->pCfg80211_Wdev; - SET_NETDEV_DEV(pNetDev, wiphy_dev(pCfg80211_CB->pCfg80211_Wdev->wiphy)); - pCfg80211_CB->pCfg80211_Wdev->netdev = pNetDev; -#ifdef RFKILL_HW_SUPPORT - wiphy_rfkill_start_polling(pCfg80211_CB->pCfg80211_Wdev->wiphy); -#endif /* RFKILL_HW_SUPPORT */ - RTMP_DRIVER_80211_CB_SET(pAd, pCfg80211_CB); - RTMP_DRIVER_80211_RESET(pAd); - RTMP_DRIVER_80211_SCAN_STATUS_LOCK_INIT(pAd, TRUE); - - /* TODO */ - /* err = register_netdevice_notifier(&cfg80211_netdev_notifier); //CFG TODO */ - if (err) - CFG80211DBG(DBG_LVL_ERROR, - ("80211> Failed to register notifierl %d\n", err)); - - CFG80211DBG(DBG_LVL_ERROR, ("80211> CFG80211_Register\n")); - return TRUE; -} /* End of CFG80211_Register */ - -/* =========================== Local Function =============================== */ - -#endif /* RT_CFG80211_SUPPORT */ -#endif /* LINUX_VERSION_CODE */ - -/* End of crda.c */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_ap.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_ap.c deleted file mode 100644 index fc23e19f3d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_ap.c +++ /dev/null @@ -1,2056 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - * - * Abstract: - * - * All related CFG80211 function body. - * - * History: - * - ***************************************************************************/ -#define RTMP_MODULE_OS - -#ifdef RT_CFG80211_SUPPORT -#ifdef CONFIG_AP_SUPPORT - -#include "rt_config.h" - -#ifdef MT_MAC -VOID write_tmac_info_beacon(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - UCHAR *tmac_buf, HTTRANSMIT_SETTING *BeaconTransmit, - ULONG frmLen); - -#endif /* MT_MAC */ - -INT CFG80211_FindMbssApIdxByNetDevice(RTMP_ADAPTER *pAd, PNET_DEV pNetDev) -{ - USHORT index = 0; - BOOLEAN found = FALSE; - - for (index = 0; index < MAX_MBSSID_NUM(pAd); index++) { - if (pAd->ApCfg.MBSSID[index].wdev.if_dev == pNetDev) { - found = TRUE; - break; - } - } - - return (found) ? index : WDEV_NOT_FOUND; -} - -INT CfgAsicSetPreTbtt(RTMP_ADAPTER *pAd, BOOLEAN enable) -{ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - return MtAsicSetPreTbtt(pAd, enable, 1); - -#endif - return FALSE; -} -static INT CFG80211DRV_UpdateTimIE(PRTMP_ADAPTER pAd, UINT mbss_idx, - PUCHAR pBeaconFrame, UINT32 tim_ie_pos) -{ - UCHAR ID_1B, TimFirst, TimLast, *pTim, *ptr, New_Tim_Len; - UINT i; - struct wifi_dev *wdev = NULL; - BCN_BUF_STRUC *bcn_buf = NULL; - - ptr = pBeaconFrame + tim_ie_pos; /* TIM LOCATION */ - *ptr = IE_TIM; - *(ptr + 2) = pAd->ApCfg.DtimCount; - *(ptr + 3) = pAd->ApCfg.DtimPeriod; - TimFirst = 0; /* record first TIM byte != 0x00 */ - TimLast = 0; /* record last TIM byte != 0x00 */ - wdev = &pAd->ApCfg.MBSSID[mbss_idx].wdev; - bcn_buf = &wdev->bcn_buf; - pTim = bcn_buf->TimBitmaps; - - for (ID_1B = 0; ID_1B < WLAN_MAX_NUM_OF_TIM; ID_1B++) { - /* get the TIM indicating PS packets for 8 stations */ - UCHAR tim_1B = pTim[ID_1B]; - - if (ID_1B == 0) - tim_1B &= 0xfe; /* skip bit0 bc/mc */ - - if (tim_1B == 0) - continue; /* find next 1B */ - - if (TimFirst == 0) - TimFirst = ID_1B; - - TimLast = ID_1B; - } - - /* fill TIM content to beacon buffer */ - if (TimFirst & 0x01) - TimFirst--; /* find the even offset byte */ - - *(ptr + 1) = 3 + (TimLast - TimFirst + 1); /* TIM IE length */ - *(ptr + 4) = TimFirst; - - for (i = TimFirst; i <= TimLast; i++) - *(ptr + 5 + i - TimFirst) = pTim[i]; - - /* bit0 means backlogged mcast/bcast */ - if (pAd->ApCfg.DtimCount == 0) - *(ptr + 4) |= - (bcn_buf->TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & 0x01); - - /* adjust BEACON length according to the new TIM */ - New_Tim_Len = (2 + *(ptr + 1)); - return New_Tim_Len; -} - -static INT -CFG80211DRV_UpdateApSettingFromBeacon(PRTMP_ADAPTER pAd, UINT mbss_idx, - CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon) -{ - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[mbss_idx]; - struct wifi_dev *wdev = &pMbss->wdev; - const UCHAR *ssid_ie = NULL, *wpa_ie = NULL, *rsn_ie = NULL; - const UCHAR *supp_rates_ie = NULL; - const UCHAR *ext_supp_rates_ie = NULL, *ht_cap = NULL, *ht_info = NULL; - -#ifdef CONFIG_AP_SUPPORT - INT idx; -#endif - -#ifndef DISABLE_HOSTAPD_BEACON -#ifdef HOSTAPD_AUTO_CH_SUPPORT - const UCHAR *dsparam_ie = NULL, *ht_operation = NULL, - *vht_operation = NULL; - PADD_HT_INFO_IE phtinfo; - VHT_OP_IE *vhtinfo; - UCHAR channel = 0; - PEID_STRUCT pEid; -#endif -#endif - -#ifdef DISABLE_HOSTAPD_BEACON - const UCHAR *wsc_ie = NULL; - const UINT WFA_OUI = 0x0050F2; -#endif -#ifdef HOSTAPD_11R_SUPPORT - const UCHAR *md_ie = NULL; -#endif /* HOSTAPD_11R_SUPPORT */ - -#ifdef HOSTAPD_OWE_SUPPORT - const UCHAR *trans_ie = NULL; - - const UINT OUI_WFA = 0x506f9a; - - UINT8 OWE_OUI_TYPE = 28; -#endif - -#ifdef HOSTAPD_11K_SUPPORT - const UCHAR *rrm_caps = NULL; -#endif - -#if (KERNEL_VERSION(3, 5, 0) <= LINUX_VERSION_CODE) - const UCHAR CFG_HT_OP_EID = WLAN_EID_HT_OPERATION; -#else - const UCHAR CFG_HT_OP_EID = WLAN_EID_HT_INFORMATION; -#endif /* LINUX_VERSION_CODE: 3.5.0 */ -#ifdef HOSTAPD_11K_SUPPORT - const UCHAR CFG_RRM_OP_EID = WLAN_EID_RRM_ENABLED_CAPABILITIES; -#endif - -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) - const UCHAR CFG_WPA_EID = WLAN_EID_VENDOR_SPECIFIC; -#else - const UCHAR CFG_WPA_EID = WLAN_EID_WPA; -#endif /* LINUX_VERSION_CODE: 3.8.0 */ - -#ifndef DISABLE_HOSTAPD_BEACON -#ifdef HOSTAPD_AUTO_CH_SUPPORT - if (WMODE_CAP_2G(wdev->PhyMode)) - channel = HcGetChannelByRf(pAd, RFIC_24GHZ); - else - channel = HcGetChannelByRf(pAd, RFIC_5GHZ); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Channel from Auto selection is :%d\n", channel)); -#endif -#endif - - ssid_ie = cfg80211_find_ie(WLAN_EID_SSID, pBeacon->beacon_head + 36, - pBeacon->beacon_head_len - 36); - supp_rates_ie = - cfg80211_find_ie(WLAN_EID_SUPP_RATES, pBeacon->beacon_head + 36, - pBeacon->beacon_head_len - 36); - /* if it doesn't find WPA_IE in tail first 30 bytes. treat it as is not found */ - wpa_ie = cfg80211_find_ie(CFG_WPA_EID, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); - rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); /* wpa2 case. */ - ext_supp_rates_ie = - cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); - ht_cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); - ht_info = cfg80211_find_ie(CFG_HT_OP_EID, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); - -#ifdef HOSTAPD_11K_SUPPORT - rrm_caps = cfg80211_find_ie(CFG_RRM_OP_EID, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); -#endif -#ifdef HOSTAPD_11R_SUPPORT - md_ie = cfg80211_find_ie( - WLAN_EID_MOBILITY_DOMAIN, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); /* WLAN_EID_MOBILITY_DOMAIN=54 */ -#endif -#ifndef DISABLE_HOSTAPD_BEACON -#ifdef HOSTAPD_AUTO_CH_SUPPORT - dsparam_ie = - cfg80211_find_ie(WLAN_EID_DS_PARAMS, pBeacon->beacon_head + 36, - pBeacon->beacon_head_len - 36); - ht_operation = - cfg80211_find_ie(WLAN_EID_HT_OPERATION, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); - vht_operation = - cfg80211_find_ie(WLAN_EID_VHT_OPERATION, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); -#endif -#endif - -#ifdef HOSTAPD_11K_SUPPORT - if (rrm_caps != NULL) { - EID_STRUCT *eid; - INT loop; - UINT8 bit_nr, bit_lci; - PRRM_CONFIG pRrmCfg; - - eid = (EID_STRUCT *)rrm_caps; - - printk("RRM : len %d eid %d octet %d\n", eid->Len, eid->Eid, - eid->Octet[0]); - pRrmCfg = &pAd->ApCfg.MBSSID[loop].RrmCfg; - - pMbss->RrmCfg.bDot11kRRMEnable = 1; - pMbss->RrmCfg.bDot11kRRMEnableSet = 1; - - bit_nr = (eid->Octet[0] >> 1) & - 1; /*checking bit position 1:neighbor report */ - bit_lci = (eid->Octet[1] >> 4) & 1; /*checking LCI */ - - printk("bit_nr bit_lci: %d %d\n", bit_nr, bit_lci); - - if (bit_nr) - pRrmCfg->hstapd_nei_rep = TRUE; - - if (bit_lci) - pRrmCfg->hstapd_lci = TRUE; - - for (loop = 0; loop < MAX_MBSSID_NUM(pAd); loop++) { - init_rrm_capabilities(pRrmCfg, - &pAd->ApCfg.MBSSID[loop]); - } - - if (pRrmCfg->hstapd_nei_rep) - pRrmCfg->hstapd_nei_rep = FALSE; - - if (pRrmCfg->hstapd_lci) - pRrmCfg->hstapd_lci = FALSE; - } else - printk("No RRM capabilities enabled from hostapd\n"); -#endif - -#ifdef HOSTAPD_OWE_SUPPORT - /*owe trans oui */ - trans_ie = (UCHAR *)cfg80211_find_vendor_ie(OUI_WFA, OWE_OUI_TYPE, - pBeacon->beacon_tail, - pBeacon->beacon_tail_len); - if (trans_ie != NULL) { - EID_STRUCT *eid; - - eid = (EID_STRUCT *)trans_ie; - if (eid->Len + 2 <= MAX_LEN_OF_TRANS_IE) { - NdisCopyMemory(pMbss->TRANS_IE, trans_ie, eid->Len + 2); - pMbss->TRANSIE_Len = eid->Len + 2; - } - } -#endif - - /* SSID */ - - if (ssid_ie == NULL) { - os_move_mem(pMbss->Ssid, "CFG_Linux_GO", 12); - pMbss->SsidLen = 12; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG: SSID Not Found In Packet\n")); - } else if (pBeacon->ssid_len != 0) { - os_zero_mem(pMbss->Ssid, MAX_LEN_OF_SSID + 1); - NdisZeroMemory(pMbss->Ssid, MAX_LEN_OF_SSID + 1); - pMbss->SsidLen = pBeacon->ssid_len; - NdisCopyMemory(pMbss->Ssid, ssid_ie + 2, pMbss->SsidLen); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\nCFG : SSID: %s, %d\n", pMbss->Ssid, - pMbss->SsidLen)); - } -#ifdef DISABLE_HOSTAPD_BEACON - else if (*(ssid_ie + 1) != 0) { - os_zero_mem(pMbss->Ssid, pMbss->SsidLen); - NdisZeroMemory(pMbss->Ssid, pMbss->SsidLen); - pMbss->SsidLen = *(ssid_ie + 1); - NdisCopyMemory(pMbss->Ssid, ssid_ie + 2, pMbss->SsidLen); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\nCFG : SSID: %s, %d\n", pMbss->Ssid, - pMbss->SsidLen)); - } - wsc_ie = (UCHAR *)cfg80211_find_vendor_ie( - WFA_OUI, 4, pBeacon->beacon_tail, pBeacon->beacon_tail_len); - if (pMbss->WscIEBeacon.Value) { - pAd->ApCfg.MBSSID[mbss_idx].WscIEBeacon.ValueLen = 0; - pAd->ApCfg.MBSSID[mbss_idx].WscIEProbeResp.ValueLen = 0; - } - if (wsc_ie != NULL) { -#ifdef HOSTAPD_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd) && wdev && - (wdev->MAPCfg.DevOwnRole & BIT(MAP_ROLE_BACKHAUL_BSS)) && - (!(wdev->MAPCfg.DevOwnRole & BIT(MAP_ROLE_FRONTHAUL_BSS)))) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Strictly BH BSS: %s, donot BC WPS cap\n", - pMbss->Ssid)); - } else -#endif - { - EID_STRUCT *eid; - - eid = (EID_STRUCT *)wsc_ie; - - if (eid->Len + 2 <= 500) { - NdisCopyMemory(pMbss->WscIEBeacon.Value, wsc_ie, - eid->Len + 2); - pMbss->WscIEBeacon.ValueLen = eid->Len + 2; - } - } - } - -#ifdef HOSTAPD_11R_SUPPORT - if (md_ie != NULL) { - PFT_CFG pFtCfg = &pAd->ApCfg.MBSSID[mbss_idx].wdev.FtCfg; - NdisCopyMemory(pFtCfg->FtMdId, md_ie + 2, FT_MDID_LEN); - pFtCfg->FtCapFlag.FtOverDs = (0x01) & (*(md_ie + 4)); - pFtCfg->FtCapFlag.RsrReqCap = (0x02) & (*(md_ie + 4)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("vikas %s::MDID::%x %x FToverDS:%d RsrCap:%d\n", - __func__, pFtCfg->FtMdId[0], pFtCfg->FtMdId[1], - pFtCfg->FtCapFlag.FtOverDs, - pFtCfg->FtCapFlag.RsrReqCap)); - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:MDIE is NULL\n", __func__)); - -#endif /* HOSTAPD_11R_SUPPORT */ -#endif - -#ifndef DISABLE_HOSTAPD_BEACON -#ifdef HOSTAPD_AUTO_CH_SUPPORT - if (dsparam_ie != NULL) { - pEid = (PEID_STRUCT)dsparam_ie; - *pEid->Octet = channel; - } - - if (ht_operation != NULL) { - pEid = (PEID_STRUCT)ht_operation; - phtinfo = (PADD_HT_INFO_IE)pEid->Octet; - phtinfo->ControlChan = channel; - phtinfo->AddHtInfo.RecomWidth = - wlan_operate_get_ht_bw(&pMbss->wdev); - /* phtinfo->AddHtInfo.ExtChanOffset = 3; */ - phtinfo->AddHtInfo.ExtChanOffset = HcGetExtCha(pAd, channel); - } - if (vht_operation != NULL) { - UCHAR bw = pAd->CommonCfg.vht_bw; - UCHAR cent_ch = vht_cent_ch_freq(channel, bw); - pEid = (PEID_STRUCT)vht_operation; - vhtinfo = (VHT_OP_IE *)pEid->Octet; - - switch (bw) { - case VHT_BW_2040: - vhtinfo->vht_op_info.ch_width = 0; - vhtinfo->vht_op_info.center_freq_1 = 0; - vhtinfo->vht_op_info.center_freq_2 = 0; - break; - - case VHT_BW_80: - vhtinfo->vht_op_info.ch_width = 1; - vhtinfo->vht_op_info.center_freq_1 = cent_ch; - vhtinfo->vht_op_info.center_freq_2 = 0; - break; - - case VHT_BW_160: - vhtinfo->vht_op_info.ch_width = 2; - vhtinfo->vht_op_info.center_freq_1 = cent_ch; - vhtinfo->vht_op_info.center_freq_2 = - pAd->CommonCfg.vht_cent_ch2; - break; - - case VHT_BW_8080: - - vhtinfo->vht_op_info.ch_width = 3; - vhtinfo->vht_op_info.center_freq_1 = cent_ch; - vhtinfo->vht_op_info.center_freq_2 = - pAd->CommonCfg.vht_cent_ch2; - break; - } - } - -#endif -#endif - -#if (KERNEL_VERSION(3, 4, 0) <= LINUX_VERSION_CODE) - - if ((pBeacon->hidden_ssid > 0 && pBeacon->hidden_ssid < 3) || - (pMbss->bHideSsid)) { - pMbss->bHideSsid = TRUE; - - if ((pBeacon->ssid_len != 0) && - (pBeacon->ssid_len <= MAX_LEN_OF_SSID)) { - pMbss->SsidLen = pBeacon->ssid_len; - NdisCopyMemory(pMbss->Ssid, pBeacon->ssid, - pMbss->SsidLen); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> [Hidden] SSID: %s, %d\n", pMbss->Ssid, - pMbss->SsidLen)); - } - } else - pMbss->bHideSsid = FALSE; - -#endif /* LINUX_VERSION_CODE 3.4.0 */ - /* WMM EDCA Paramter */ - CFG80211_SyncPacketWmmIe(pAd, pBeacon->beacon_tail, - pBeacon->beacon_tail_len); - pMbss->RSNIE_Len[0] = 0; - pMbss->RSNIE_Len[1] = 0; - NdisZeroMemory(pMbss->RSN_IE[0], MAX_LEN_OF_RSNIE); - NdisZeroMemory(pMbss->RSN_IE[1], MAX_LEN_OF_RSNIE); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("80211> pBeacon->privacy = %d\n", pBeacon->privacy)); - - if (pBeacon->privacy) { - /* Security */ - if (pBeacon->auth_type == NL80211_AUTHTYPE_SHARED_KEY) { - /* Shared WEP */ - /* wdev->WepStatus = Ndis802_11WEPEnabled; */ - /* wdev->AuthMode = Ndis802_11AuthModeShared; */ - CLEAR_SEC_AKM(wdev->SecConfig.AKMMap); - CLEAR_CIPHER(wdev->SecConfig.PairwiseCipher); - CLEAR_CIPHER(wdev->SecConfig.GroupCipher); - SET_AKM_SHARED(wdev->SecConfig.AKMMap); - SET_CIPHER_WEP(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_WEP(wdev->SecConfig.GroupCipher); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nCFG80211 BEACON => AuthMode = %s ,wdev->PairwiseCipher = %s wdev->SecConfig.GroupCipher = %s\n", - GetAuthModeStr(wdev->SecConfig.AKMMap), - GetEncryModeStr(wdev->SecConfig.PairwiseCipher), - GetEncryModeStr(wdev->SecConfig.GroupCipher))); - } else - CFG80211_ParseBeaconIE(pAd, pMbss, wdev, - (UCHAR *)wpa_ie, - (UCHAR *)rsn_ie); - - if ((IS_CIPHER_NONE(wdev->SecConfig.PairwiseCipher)) && - (IS_AKM_OPEN(wdev->SecConfig.AKMMap))) { - /* WEP Auto */ - /* wdev->WepStatus = Ndis802_11WEPEnabled; */ - /* wdev->AuthMode = Ndis802_11AuthModeAutoSwitch; */ - CLEAR_SEC_AKM(wdev->SecConfig.AKMMap); - CLEAR_CIPHER(wdev->SecConfig.PairwiseCipher); - CLEAR_CIPHER(wdev->SecConfig.GroupCipher); - SET_AKM_OPEN(wdev->SecConfig.AKMMap); - SET_AKM_AUTOSWITCH(wdev->SecConfig.AKMMap); - SET_CIPHER_WEP(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_WEP(wdev->SecConfig.GroupCipher); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nCFG80211 BEACON => AuthMode = %s ,wdev->PairwiseCipher = %s wdev->SecConfig.GroupCipher = %s\n", - GetAuthModeStr(wdev->SecConfig.AKMMap), - GetEncryModeStr(wdev->SecConfig.PairwiseCipher), - GetEncryModeStr(wdev->SecConfig.GroupCipher))); - } - - } else { - /* wdev->WepStatus = Ndis802_11EncryptionDisabled; */ - /* wdev->AuthMode = Ndis802_11AuthModeOpen; */ - SET_AKM_OPEN(wdev->SecConfig.AKMMap); - SET_CIPHER_NONE(wdev->SecConfig.PairwiseCipher); - CFG80211_ParseBeaconIE(pAd, pMbss, wdev, (UCHAR *)wpa_ie, - (UCHAR *)rsn_ie); - } - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++) - RTMPSetIndividualHT(pAd, idx); - } -#endif /* CONFIG_AP_SUPPORT */ - - pMbss->CapabilityInfo = CAP_GENERATE( - 1, 0, (!IS_CIPHER_NONE(wdev->SecConfig.PairwiseCipher)), - (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1), - wdev->bUseShortSlotTime, /*SpectrumMgmt*/ FALSE); - -#ifdef DOT11K_RRM_SUPPORT - if (IS_RRM_ENABLE(wdev)) - pMbss->CapabilityInfo |= RRM_CAP_BIT; -#endif /* DOT11K_RRM_SUPPORT */ - - /* Disable Driver-Internal Rekey */ - pMbss->WPAREKEY.ReKeyInterval = 0; - pMbss->WPAREKEY.ReKeyMethod = DISABLE_REKEY; - -#ifndef DISABLE_HOSTAPD_BEACON - if (pBeacon->interval != 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CFG_TIM New BI %d\n", pBeacon->interval)); - pAd->CommonCfg.BeaconPeriod = pBeacon->interval; - } - - if (pBeacon->dtim_period != 0) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CFG_TIM New DP %d\n", pBeacon->dtim_period)); - pAd->ApCfg.DtimPeriod = pBeacon->dtim_period; - } -#endif - return TRUE; -} - -VOID CFG80211DRV_DisableApInterface(PRTMP_ADAPTER pAd) -{ - UINT apidx = MAIN_MBSSID; - /*CFG_TODO: IT Should be set fRTMP_ADAPTER_HALT_IN_PROGRESS */ - struct wifi_dev *pWdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - pAd->ApCfg.MBSSID[apidx].wdev.bcn_buf.bBcnSntReq = FALSE; - - /* For AP - STA switch */ - if (wlan_operate_get_vht_bw(pWdev) != BW_40) { - CFG80211DBG(DBG_LVL_TRACE, - ("80211> %s, switch to BW_20\n", __func__)); - wlan_operate_set_ht_bw(pWdev, HT_BW_20, EXTCHA_NONE); - } - - /* Disable pre-TBTT interrupt */ - AsicSetPreTbtt(pAd, FALSE, HW_BSSID_0); - - if (1) { /* !INFRA_ON(pAd)) */ - /* Disable piggyback */ - AsicSetPiggyBack(pAd, FALSE); - AsicUpdateProtect(pAd); - } - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) - AsicDisableSync(pAd, HW_BSSID_0); - - /* beacon exit for USB/SDIO */ - asic_bss_beacon_exit(pAd); - - OPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - RTMP_IndicateMediaState(pAd, NdisMediaStateDisconnected); -} - -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT -PCHAR rtstrstr2(PCHAR s1, const PCHAR s2, INT s1_len, INT s2_len) -{ - INT offset = 0; - - while (s1_len >= s2_len) { - s1_len--; - - if (!memcmp(s1, s2, s2_len)) - return offset; - - s1++; - offset++; - } - - return NULL; -} -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - -VOID CFG80211_UpdateBeacon(VOID *pAdOrg, UCHAR *beacon_head_buf, - UINT32 beacon_head_len, UCHAR *beacon_tail_buf, - UINT32 beacon_tail_len, BOOLEAN isAllUpdate, - UINT32 apidx) - -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; - HTTRANSMIT_SETTING - BeaconTransmit; /* MGMT frame PHY rate setting when operatin at Ht rate. */ - PUCHAR pBeaconFrame; - UCHAR *tmac_info, New_Tim_Len = 0; - UINT32 beacon_len = 0; - BSS_STRUCT *pMbss; - struct wifi_dev *wdev; - COMMON_CONFIG *pComCfg; -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - ULONG Value; - ULONG TimeTillTbtt; - ULONG temp; - INT bufferoffset = 0; - USHORT bufferoffset2 = 0; - CHAR temp_buf[512] = { 0 }; - CHAR P2POUIBYTE[4] = { 0x50, 0x6f, 0x9a, 0x9 }; - INT temp_len; - INT P2P_IE = 4; - USHORT p2p_ie_len; - UCHAR Count; - ULONG StartTime; -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - UCHAR tx_hw_hdr_len = cap->tx_hw_hdr_len; - UINT8 TXWISize = cap->TXWISize; - BCN_BUF_STRUC *pbcn_buf = NULL; - - pComCfg = &pAd->CommonCfg; - pMbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &pMbss->wdev; - pbcn_buf = &wdev->bcn_buf; - - if (!pMbss || !pMbss->wdev.bcn_buf.BeaconPkt) - return; - - RTMP_SEM_LOCK(&pbcn_buf->BcnContentLock); - tmac_info = (UCHAR *)GET_OS_PKT_DATAPTR(pMbss->wdev.bcn_buf.BeaconPkt); -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - pBeaconFrame = (UCHAR *)(tmac_info + tx_hw_hdr_len); - else -#endif /* MT_MAC */ - { - pBeaconFrame = (UCHAR *)(tmac_info + TXWISize); - } - - if (isAllUpdate) { /* Invoke From CFG80211 OPS For setting Beacon buffer */ - /* 1. Update the Buf before TIM IE */ - NdisCopyMemory(pBeaconFrame, beacon_head_buf, beacon_head_len); - /* 2. Update the Location of TIM IE */ - pAd->ApCfg.MBSSID[apidx].wdev.bcn_buf.TimIELocationInBeacon = - beacon_head_len; - - /* 3. Store the Tail Part For appending later */ - if (pCfg80211_ctrl->beacon_tail_buf != NULL) - os_free_mem(pCfg80211_ctrl->beacon_tail_buf); - - os_alloc_mem(NULL, (UCHAR **)&pCfg80211_ctrl->beacon_tail_buf, - beacon_tail_len); - - if (pCfg80211_ctrl->beacon_tail_buf != NULL) { - NdisCopyMemory(pCfg80211_ctrl->beacon_tail_buf, - beacon_tail_buf, beacon_tail_len); - pCfg80211_ctrl->beacon_tail_len = beacon_tail_len; - } else { - pCfg80211_ctrl->beacon_tail_len = 0; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211 Beacon: MEM ALLOC ERROR\n")); - } - - /* return; */ - } else { /* Invoke From Beacon Timer */ - if (pAd->ApCfg.DtimCount == 0) - pAd->ApCfg.DtimCount = pAd->ApCfg.DtimPeriod - 1; - else - pAd->ApCfg.DtimCount -= 1; - -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - /* - * 3 mode: - * 1. infra scan 7 channel ( Duration(30+3) *7 interval (+120) * count 1 ), - * 2. p2p find 3 channel (Duration (65 ) *3 interval (+130)) * count 2 > 120 sec - * 3. mcc tw channel switch (Duration ) (Infra time ) interval (+ GO time ) count 3 mcc enabel always; - */ - if (pAd->cfg80211_ctrl.GONoASchedule.Count > 0) { - if (pAd->cfg80211_ctrl.GONoASchedule.Count != 200) - pAd->cfg80211_ctrl.GONoASchedule.Count--; - - os_move_mem(temp_buf, pCfg80211_ctrl->beacon_tail_buf, - pCfg80211_ctrl->beacon_tail_len); - bufferoffset = - rtstrstr2(temp_buf, P2POUIBYTE, - pCfg80211_ctrl->beacon_tail_len, - P2P_IE); - - while (bufferoffset2 <= - (pCfg80211_ctrl->beacon_tail_len - bufferoffset - - 4 - bufferoffset2 - 3)) { - if ((pCfg80211_ctrl->beacon_tail_buf) - [bufferoffset + 4 + bufferoffset2] == - 12) - break; - - bufferoffset2 = pCfg80211_ctrl->beacon_tail_buf - [bufferoffset + 4 + 1 + - bufferoffset2] + - bufferoffset2; - bufferoffset2 = bufferoffset2 + 3; - } - - NdisCopyMemory( - &pCfg80211_ctrl - ->beacon_tail_buf[bufferoffset + 4 + - bufferoffset2 + 5], - &pAd->cfg80211_ctrl.GONoASchedule.Count, 1); - NdisCopyMemory( - &pCfg80211_ctrl - ->beacon_tail_buf[bufferoffset + 4 + - bufferoffset2 + 6], - &pAd->cfg80211_ctrl.GONoASchedule.Duration, 4); - NdisCopyMemory( - &pCfg80211_ctrl - ->beacon_tail_buf[bufferoffset + 4 + - bufferoffset2 + 10], - &pAd->cfg80211_ctrl.GONoASchedule.Interval, 4); - NdisCopyMemory( - &pCfg80211_ctrl - ->beacon_tail_buf[bufferoffset + 4 + - bufferoffset2 + 14], - &pAd->cfg80211_ctrl.GONoASchedule.StartTime, 4); - } - -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - } - -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) { -#ifdef RTMP_PCI_SUPPORT - - if (IS_PCI_INF(pAd)) { - BOOLEAN is_pretbtt_int = FALSE; - UCHAR resource_idx = 0; - USHORT FreeNum; - - if (pAd->archOps.get_resource_idx) - resource_idx = pAd->archOps.get_resource_idx( - pAd, wdev, TX_DATA, 0); - - FreeNum = GET_BCNRING_FREENO(pAd, resource_idx); - - if (FreeNum < 0) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s()=>BSS0:BcnRing FreeNum is not enough!\n", - __func__)); - return; - } - - if (pMbss->wdev.bcn_buf.bcn_state != BCN_TX_IDLE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s()=>BSS0:BcnPkt not idle(%d)!\n", - __func__, - pMbss->wdev.bcn_buf.bcn_state)); - APCheckBcnQHandler(pAd, apidx, &is_pretbtt_int); - - if (is_pretbtt_int == FALSE) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("==============> pretbtt_int not init\n")); - return; - } - } - } - -#endif /* RTMP_PCI_SUPPORT */ - } - -#endif /* MT_MAC */ - /* 4. Update the TIM IE */ - New_Tim_Len = CFG80211DRV_UpdateTimIE( - pAd, apidx, pBeaconFrame, - pAd->ApCfg.MBSSID[apidx].wdev.bcn_buf.TimIELocationInBeacon); - - /* 5. Update the Buffer AFTER TIM IE */ - if (pCfg80211_ctrl->beacon_tail_buf != NULL) { - NdisCopyMemory( - pBeaconFrame + - pAd->ApCfg.MBSSID[apidx] - .wdev.bcn_buf.TimIELocationInBeacon + - New_Tim_Len, - pCfg80211_ctrl->beacon_tail_buf, - pCfg80211_ctrl->beacon_tail_len); - beacon_len = pAd->ApCfg.MBSSID[apidx] - .wdev.bcn_buf.TimIELocationInBeacon + - pCfg80211_ctrl->beacon_tail_len + New_Tim_Len; - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("BEACON ====> CFG80211_UpdateBeacon OOPS\n")); - return; - } - - BeaconTransmit.word = 0; - /* Should be Find the P2P IE Then Set Basic Rate to 6M */ - BeaconTransmit.field.MODE = MODE_CCK; - - BeaconTransmit.field.MCS = MCS_RATE_6; - write_tmac_info_beacon(pAd, &pAd->ApCfg.MBSSID[apidx].wdev, tmac_info, - &BeaconTransmit, beacon_len); - RTMP_SEM_UNLOCK(&pbcn_buf->BcnContentLock); - /* CFG_TODO */ -#ifdef BCN_OFFLOAD_SUPPORT - - if (cap->fgBcnOffloadSupport == TRUE) { -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ -#ifndef RT_CFG80211_SUPPORT - RT28xx_UpdateBcnAndTimToMcu( - pAd, &pAd->ApCfg.MBSSID[apidx].wdev, beacon_len, - pAd->ApCfg.MBSSID[apidx] - .wdev.bcn_buf.TimIELocationInBeacon, - PKT_V2_BCN); -#else - pAd->archOps.archUpdateBeacon(pAd, - &pAd->ApCfg.MBSSID[apidx].wdev, - beacon_len, PKT_BCN); -#endif - -#else -#ifdef RT_CFG80211_SUPPORT - pAd->archOps.archUpdateBeacon(pAd, - &pAd->ApCfg.MBSSID[apidx].wdev, - beacon_len, PKT_BCN); -#else - RT28xx_UpdateBcnAndTimToMcu( - pAd, &pAd->ApCfg.MBSSID[apidx].wdev, beacon_len, - pAd->ApCfg.MBSSID[apidx] - .wdev.bcn_buf.TimIELocationInBeacon, - PKT_BCN); -#endif /* RT_CFG80211_SUPPORT */ -#endif - } else -#endif /* BCN_OFFLOAD_SUPPORT */ - { -#ifdef BCN_V2_SUPPORT /* add bcn v2 support , 1.5k beacon support */ -#ifndef RT_CFG80211_SUPPORT - RT28xx_UpdateBeaconToAsic( - pAd, &pAd->ApCfg.MBSSID[apidx].wdev, beacon_len, - pAd->ApCfg.MBSSID[apidx] - .wdev.bcn_buf.TimIELocationInBeacon, - PKT_V2_BCN); -#else - pAd->archOps.archUpdateBeacon(pAd, - &pAd->ApCfg.MBSSID[apidx].wdev, - beacon_len, PKT_BCN); -#endif - -#else -#ifdef RT_CFG80211_SUPPORT - pAd->archOps.archUpdateBeacon(pAd, - &pAd->ApCfg.MBSSID[apidx].wdev, - beacon_len, PKT_BCN); -#else - RT28xx_UpdateBeaconToAsic( - pAd, &pAd->ApCfg.MBSSID[apidx].wdev, beacon_len, - pAd->ApCfg.MBSSID[apidx] - .wdev.bcn_buf.TimIELocationInBeacon, - PKT_BCN); -#endif /* RT_CFG80211_SUPPORT */ -#endif - } -} - -BOOLEAN CFG80211DRV_OpsBeaconSet(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon; - -#ifdef DISABLE_HOSTAPD_BEACON - BSS_STRUCT *pMbss; - struct wifi_dev *wdev; - UINT16 Frame_Len = 0; -#endif - pBeacon = (CMD_RTPRIV_IOCTL_80211_BEACON *)pData; -#ifdef DISABLE_HOSTAPD_BEACON - pMbss = &pAd->ApCfg.MBSSID[pBeacon->apidx]; - wdev = &pMbss->wdev; -#endif - CFG80211DRV_UpdateApSettingFromBeacon(pAd, pBeacon->apidx, pBeacon); -#ifdef DISABLE_HOSTAPD_BEACON - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("############MakeBeacon for apidx %d OpsBeaconSet \n", - pBeacon->apidx)); - Frame_Len = MakeBeacon(pAd, wdev, FALSE); - AsicUpdateBeacon(pAd, wdev, Frame_Len, PKT_BCN); -#else - CFG80211_UpdateBeacon(pAd, pBeacon->beacon_head, - pBeacon->beacon_head_len, pBeacon->beacon_tail, - pBeacon->beacon_tail_len, TRUE, pBeacon->apidx); -#endif - return TRUE; -} - -extern struct wifi_dev_ops ap_wdev_ops; - -BOOLEAN CFG80211DRV_OpsBeaconAdd(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - /* BOOLEAN Cancelled; */ - UINT i = 0; - INT32 Ret = 0; - EDCA_PARM *pEdca, *pBssEdca = NULL; - STA_REC_CTRL_T *sta_rec; - -#ifdef DISABLE_HOSTAPD_BEACON - UINT16 FrameLen = 0; -#endif - UCHAR tr_tb_idx; - PNET_DEV pNetDev; - CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon = - (CMD_RTPRIV_IOCTL_80211_BEACON *)pData; -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - UCHAR ext_cha; - UCHAR ht_bw; -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - UINT apidx = pBeacon->apidx; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; - struct wifi_dev *wdev = &pMbss->wdev; - HT_CAPABILITY_IE *ht_cap = - (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap(wdev); - BCN_BUF_STRUC *bcn_buf = &wdev->bcn_buf; - tr_tb_idx = wdev->tr_tb_idx; - pNetDev = pBeacon->pNetDev; -#ifdef RT_CFG80211_SUPPORT - wdev->Hostapd = Hostapd_CFG; - -#endif - CFG80211DBG(DBG_LVL_OFF, ("80211> %s ==>\n", __func__)); -#ifdef UAPSD_SUPPORT - wdev->UapsdInfo.bAPSDCapable = TRUE; - pMbss->CapabilityInfo |= 0x0800; -#endif /* UAPSD_SUPPORT */ -#ifndef DISABLE_HOSTAPD_BEACON - pAd->cfg80211_ctrl.beaconIsSetFromHostapd = - TRUE; /* set here to prevent MakeBeacon do further modifications about BCN */ -#endif - CFG80211DRV_UpdateApSettingFromBeacon(pAd, apidx, pBeacon); -#define MCAST_WCID_TO_REMOVE 0 - MgmtTableSetMcastEntry(pAd, MCAST_WCID_TO_REMOVE); - APSecInit(pAd, wdev); - sta_rec = &pAd->MacTab.tr_entry[tr_tb_idx].StaRec; - APKeyTableInit(pAd, wdev, sta_rec); - AsicSetRxFilter(pAd); - /* Start from 0 & MT_MAC using HW_BSSID 1, TODO */ - pAd->MacTab.MsduLifeTime = 20; /* pEntry's UAPSD Q Idle Threshold */ - /* CFG_TODO */ - bcn_buf->BcnBufIdx = 0; - - for (i = 0; i < WLAN_MAX_NUM_OF_TIM; i++) - bcn_buf->TimBitmaps[i] = 0; - - bcn_buf->bBcnSntReq = TRUE; - /* For GO Timeout */ -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - pAd->ApCfg.StaIdleTimeout = 300; - pMbss->StationKeepAliveTime = 60; -#else - pAd->ApCfg.StaIdleTimeout = 300; - pMbss->StationKeepAliveTime = 0; -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - AsicDisableSync(pAd, HW_BSSID_0); - -#ifndef DISABLE_HOSTAPD_BEACON - if (wdev->channel > 14) - wdev->PhyMode = (WMODE_A | WMODE_AN); - else - wdev->PhyMode = (WMODE_B | WMODE_G | WMODE_GN); -#endif /* DISABLE_HOSTAPD_BEACON */ - - { -#if defined(MT7615) || defined(MT7622) - - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - ; /* don't reinit wdev, for tr_tbl was acquired in previous flow */ - } else -#endif - Ret = wdev_init(pAd, wdev, WDEV_TYPE_AP, pAd->net_dev, - apidx, - (VOID *)&pAd->ApCfg.MBSSID[apidx], - (VOID *)pAd); - - if (!Ret) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): register wdev fail\n", __func__)); - } - - wdev_attr_update(pAd, wdev); - COPY_MAC_ADDR(wdev->bssid, pNetDev->dev_addr); - COPY_MAC_ADDR(wdev->if_addr, pNetDev->dev_addr); - os_move_mem(wdev->bss_info_argument.Bssid, wdev->bssid, - MAC_ADDR_LEN); - } - if ((pAd->CommonCfg.LastBSSCoexist2040.field.BSS20WidthReq == 1) && - (pAd->MacTab.fAnyStaFortyIntolerant != TRUE) && - ((pAd->CommonCfg.BssCoexApCnt > 0))) { - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - } - - if (WMODE_CAP_N(wdev->PhyMode) && wlan_config_get_ht_bw(wdev) == BW_40) - ht_cap->MCSSet[4] = 0x1; /* MCS 32*/ - - /* cfg_todo */ - wdev->bWmmCapable = TRUE; - os_move_mem(wdev->bss_info_argument.Bssid, wdev->bssid, MAC_ADDR_LEN); - /* BC/MC Handling */ -#if defined(MT7615) || defined(MT7622) - - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - if (IS_CIPHER_WEP(wdev->SecConfig.GroupCipher)) - CFG80211DRV_ApKeyAdd( - pAdOrg, &pAd->cfg80211_ctrl.WepKeyInfoBackup); - } else -#endif - TRTableInsertMcastEntry(pAd, tr_tb_idx, wdev); - - MSDU_FORBID_CLEAR(wdev, MSDU_FORBID_CONNECTION_NOT_READY); - WDEV_BSS_STATE(wdev) = BSS_ACTIVE; - wdev->bss_info_argument.CipherSuit = - SecHWCipherSuitMapping(wdev->SecConfig.PairwiseCipher); - wdev->bss_info_argument.u4BssInfoFeature = - (BSS_INFO_OWN_MAC_FEATURE | BSS_INFO_BASIC_FEATURE | - BSS_INFO_RF_CH_FEATURE | BSS_INFO_SYNC_MODE_FEATURE); - /* AsicBssInfoUpdate(pAd, wdev->bss_info_argument); */ - os_msec_delay(200); - HW_UPDATE_BSSINFO(pAd, &wdev->bss_info_argument); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("New AP BSSID %02x:%02x:%02x:%02x:%02x:%02x (%d)\n", - PRINT_MAC(wdev->bssid), wdev->PhyMode)); -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(wdev->PhyMode) && (pAd->Antenna.field.TxPath == 2)) - bbp_set_txdac(pAd, 2); - else -#endif /* DOT11_N_SUPPORT */ - bbp_set_txdac(pAd, 0); - - /* Receiver Antenna selection */ - bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath); - - if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) { - if (WMODE_CAP_N(wdev->PhyMode) || wdev->bWmmCapable) { - pEdca = &pAd->CommonCfg.APEdcaParm[wdev->EdcaIdx]; - - /* EDCA parameters used for AP's own transmission */ - if (pEdca->bValid == FALSE) - set_default_ap_edca_param(pEdca); - - pBssEdca = wlan_config_get_ht_edca(wdev); - if (pBssEdca) { - /* EDCA parameters to be annouced in outgoing BEACON, used by WMM STA */ - if (pBssEdca->bValid == FALSE) - set_default_sta_edca_param(pBssEdca); - } - - HcAcquiredEdca(pAd, wdev, pEdca); - HcSetEdca(wdev); - } else - HcReleaseEdca(pAd, wdev); - } - -#ifdef DOT11_N_SUPPORT - if (pAd->CommonCfg.bRdg) - AsicSetRDG(pAd, WCID_ALL, 0, 0, 0); - - AsicSetRalinkBurstMode(pAd, pAd->CommonCfg.bRalinkBurstMode); -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():Reset WCID Table\n", __func__)); -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - ; /* don't reset WCID table , for 7615 has set in previous flow */ - } else -#endif - HW_SET_DEL_ASIC_WCID(pAd, WCID_ALL); - pAd->MacTab.Content[0].Addr[0] = 0x01; - - pAd->MacTab.Content[0].HTPhyMode.field.MODE = MODE_OFDM; - pAd->MacTab.Content[0].HTPhyMode.field.MCS = 3; -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT -#ifdef DOT11_N_SUPPORT - SetCommonHtVht(pAd, wdev); -#endif /* DOT11_N_SUPPORT */ - wlan_operate_set_prim_ch(wdev, wdev->channel); -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - /* MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble); */ - /* MlmeUpdateTxRates(pAd, FALSE, MIN_NET_DEVICE_FOR_CFG80211_VIF_P2P_GO + apidx); */ - MlmeUpdateTxRates(pAd, FALSE, apidx); -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(wdev->PhyMode)) - MlmeUpdateHtTxRates(pAd, MIN_NET_DEVICE_FOR_MBSSID); - -#endif /* DOT11_N_SUPPORT */ - - /* Disable Protection first. */ - if (1) /* !INFRA_ON(pAd)) */ - AsicUpdateProtect(pAd); - - ApUpdateCapabilityAndErpIe(pAd, pMbss); -#ifdef DOT11_N_SUPPORT - APUpdateOperationMode(pAd, wdev); -#endif /* DOT11_N_SUPPORT */ - -#ifdef DISABLE_HOSTAPD_BEACON - FrameLen = MakeBeacon(pAd, wdev, FALSE); - AsicUpdateBeacon(pAd, wdev, FrameLen, PKT_BCN); -#else - CFG80211_UpdateBeacon(pAd, pBeacon->beacon_head, - pBeacon->beacon_head_len, pBeacon->beacon_tail, - pBeacon->beacon_tail_len, TRUE, pBeacon->apidx); -#endif /*DISABLE_HOSTAPD_BEACON */ - -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - - if (INFRA_ON(pAd)) { - ULONG BPtoJiffies; - LONG timeDiff; - INT starttime = pAd->Mlme.channel_1st_staytime; - - NdisGetSystemUpTime(&pAd->Mlme.BeaconNow32); - timeDiff = (pAd->Mlme.BeaconNow32 - - pAd->StaCfg[0].LastBeaconRxTime) % - (pAd->CommonCfg.BeaconPeriod); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("#####pAd->Mlme.Now32 %d pAd->StaCfg[0].LastBeaconRxTime %d\n", - pAd->Mlme.BeaconNow32, - pAd->StaCfg[0].LastBeaconRxTime)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("#### timeDiff %d\n", timeDiff)); - - if (starttime > timeDiff) - OS_WAIT((starttime - timeDiff)); - else - OS_WAIT((starttime + - (pAd->CommonCfg.BeaconPeriod - timeDiff))); - } - -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - /* Enable BSS Sync*/ -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - - if (INFRA_ON(pAd)) { - ULONG BPtoJiffies; - LONG timeDiff; - INT starttime = pAd->Mlme.channel_1st_staytime; - - NdisGetSystemUpTime(&pAd->Mlme.BeaconNow32); - timeDiff = (pAd->Mlme.BeaconNow32 - - pAd->StaCfg[0].LastBeaconRxTime) % - (pAd->CommonCfg.BeaconPeriod); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("#####pAd->Mlme.Now32 %d pAd->StaCfg[0].LastBeaconRxTime %d\n", - pAd->Mlme.BeaconNow32, - pAd->StaCfg[0].LastBeaconRxTime)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("#### timeDiff %d\n", timeDiff)); - - if (starttime > timeDiff) - OS_WAIT((starttime - timeDiff)); - else - OS_WAIT((starttime + - (pAd->CommonCfg.BeaconPeriod - timeDiff))); - } - -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - /* Enable AP BSS Sync */ - /* AsicEnableApBssSync(pAd, pAd->CommonCfg.BeaconPeriod); */ - /* AsicEnableBcnSntReq(pAd); */ - AsicSetPreTbtt(pAd, TRUE, HW_BSSID_0); - OPSTATUS_SET_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - RTMP_IndicateMediaState(pAd, NdisMediaStateConnected); -#if defined(RT_CFG80211_SUPPORT) || defined(MT7622) - WDEV_BSS_STATE(wdev) = BSS_READY; -#endif - return TRUE; -} - -BOOLEAN CFG80211DRV_ApKeyDel(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo; - MAC_TABLE_ENTRY *pEntry; - ASIC_SEC_INFO Info = { 0 }; - - pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; - - if (pKeyInfo->bPairwise == FALSE) { - UINT Wcid = 0; - UINT apidx = CFG80211_FindMbssApIdxByNetDevice( - pAd, pKeyInfo->pNetDev); - BSS_STRUCT *pMbss; - struct wifi_dev *pWdev; - - if (apidx == WDEV_NOT_FOUND) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s failed - [ERROR]can't find wdev in driver MBSS. \n", - __FUNCTION__)); - return FALSE; - } - pMbss = &pAd->ApCfg.MBSSID[apidx]; - pWdev = &pMbss->wdev; - GET_GroupKey_WCID(pWdev, Wcid); - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_REMOVE_GROUP_KEY; - Info.Wcid = Wcid; - /* Set key material to Asic */ - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - } else { - pEntry = MacTableLookup(pAd, pKeyInfo->MAC); - - if (pEntry && (pEntry->Aid != 0)) { - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_REMOVE_PAIRWISE_KEY; - Info.Wcid = pEntry->wcid; - /* Set key material to Asic */ - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - } - } - - return TRUE; -} - -VOID CFG80211DRV_RtsThresholdAdd(VOID *pAdOrg, struct wifi_dev *wdev, - UINT threshold) -{ - UINT32 len_thld = MAX_RTS_THRESHOLD; - - if ((threshold > 0) && (threshold <= MAX_RTS_THRESHOLD)) - len_thld = (UINT32)threshold; - wlan_operate_set_rts_len_thld(wdev, len_thld); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s =====>threshold %d\n", __func__, len_thld)); -} - -VOID CFG80211DRV_FragThresholdAdd(VOID *pAdOrg, struct wifi_dev *wdev, - UINT threshold) -{ - if (threshold > MAX_FRAG_THRESHOLD || threshold < MIN_FRAG_THRESHOLD) - threshold = MAX_FRAG_THRESHOLD; - else if (threshold % 2 == 1) - threshold -= 1; - wlan_operate_set_frag_thld(wdev, threshold); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s =====>operate: frag_thld=%d\n", __func__, threshold)); -} - -BOOLEAN CFG80211DRV_ApKeyAdd(VOID *pAdOrg, VOID *pData) -{ -#ifdef CONFIG_AP_SUPPORT - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo; - MAC_TABLE_ENTRY *pEntry = NULL; - UINT apidx; - BSS_STRUCT *pMbss; - struct wifi_dev *pWdev; - - pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; - /* UINT Wcid = 0; */ - apidx = CFG80211_FindMbssApIdxByNetDevice(pAd, pKeyInfo->pNetDev); - pMbss = &pAd->ApCfg.MBSSID[apidx]; - pWdev = &pMbss->wdev; - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s =====>\n", __func__)); - pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; - - if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40 || - pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP104) { - SET_CIPHER_WEP(pWdev->SecConfig.PairwiseCipher); - SET_CIPHER_WEP(pWdev->SecConfig.GroupCipher); - { - CIPHER_KEY *pSharedKey; - POS_COOKIE pObj; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - pSharedKey = &pAd->SharedKey[apidx][pKeyInfo->KeyId]; - pSharedKey->KeyLen = pKeyInfo->KeyLen; - os_move_mem(pSharedKey->Key, pKeyInfo->KeyBuf, - pKeyInfo->KeyLen); - - if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40) - pAd->SharedKey[apidx][pKeyInfo->KeyId] - .CipherAlg = CIPHER_WEP64; - else - pAd->SharedKey[apidx][pKeyInfo->KeyId] - .CipherAlg = CIPHER_WEP128; - - AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, - pSharedKey); -#if defined(MT7615) || defined(MT7622) - - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - if (pKeyInfo->bPairwise == FALSE) { - ASIC_SEC_INFO Info = { 0 }; - UINT Wcid = 0; - - NdisCopyMemory( - &pAd->cfg80211_ctrl - .WepKeyInfoBackup, - pKeyInfo, - sizeof(CMD_RTPRIV_IOCTL_80211_KEY)); - pWdev->SecConfig.WepKey[pKeyInfo->KeyId] - .KeyLen = pKeyInfo->KeyLen; - os_move_mem( - pWdev->SecConfig - .WepKey[pKeyInfo->KeyId] - .Key, - pKeyInfo->KeyBuf, - pKeyInfo->KeyLen); - pWdev->SecConfig.GroupKeyId = - pKeyInfo->KeyId; - os_move_mem(pWdev->SecConfig.GTK, - pKeyInfo->KeyBuf, - pKeyInfo->KeyLen); - /* Get a specific WCID to record this MBSS key attribute */ - GET_GroupKey_WCID(pWdev, Wcid); - /* Set key material to Asic */ - os_zero_mem(&Info, - sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_GROUP_KEY; - Info.Direction = SEC_ASIC_KEY_TX; - Info.Wcid = Wcid; - Info.BssIndex = apidx; - Info.Cipher = - pWdev->SecConfig.GroupCipher; - Info.KeyIdx = pKeyInfo->KeyId; - os_move_mem(&Info.PeerAddr[0], - BROADCAST_ADDR, - MAC_ADDR_LEN); - /* Install Shared key */ - os_move_mem(Info.Key.Key, - pKeyInfo->KeyBuf, - pKeyInfo->KeyLen); - Info.Key.KeyLen = pKeyInfo->KeyLen; - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, %u B/MC KEY pKeyInfo->KeyId %d pWdev->SecConfig.WepKey[pKeyInfo->KeyId].KeyLen %d\n", - __func__, __LINE__, - pKeyInfo->KeyId, - pWdev->SecConfig - .WepKey[pKeyInfo->KeyId] - .KeyLen)); - } else { - if (pKeyInfo->MAC) - pEntry = MacTableLookup( - pAd, pKeyInfo->MAC); - - if (pEntry) { - ASIC_SEC_INFO Info = { 0 }; - - pEntry->SecConfig.PairwiseKeyId = - pKeyInfo->KeyId; - SET_CIPHER_WEP( - pEntry->SecConfig - .PairwiseCipher); - /* Set key material to Asic */ - os_zero_mem( - &Info, - sizeof(ASIC_SEC_INFO)); - Info.Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = - SEC_ASIC_KEY_BOTH; - Info.Wcid = pEntry->wcid; - Info.BssIndex = - pEntry->func_tb_idx; - Info.KeyIdx = - pEntry->SecConfig - .PairwiseKeyId; - Info.Cipher = - pEntry->SecConfig - .PairwiseCipher; - Info.KeyIdx = - pEntry->SecConfig - .PairwiseKeyId; - os_move_mem(Info.Key.Key, - pKeyInfo->KeyBuf, - pKeyInfo->KeyLen); - os_move_mem(&Info.PeerAddr[0], - pEntry->Addr, - MAC_ADDR_LEN); - Info.Key.KeyLen = - pKeyInfo->KeyLen; - HW_ADDREMOVE_KEYTABLE(pAd, - &Info); - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s, %u UNICAST Info.Key.KeyLen %d pKeyInfo->KeyId %d Info.Key.KeyLen %d\n", - __func__, __LINE__, - Info.Key.KeyLen, - pKeyInfo->KeyId, - Info.Key.KeyLen)); - } - } - } - -#endif - } - } else if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WPA) { - if (pKeyInfo->bPairwise == FALSE) { - USHORT Wcid; - - /* Get a specific WCID to record this MBSS key attribute */ - GET_GroupKey_WCID(pWdev, Wcid); - pAd->SharedKey[apidx][pKeyInfo->KeyId].KeyLen = LEN_TK; - - switch (pKeyInfo->cipher) { - case Ndis802_11GCMP256Enable: - if (!IS_CIPHER_GCMP256( - pWdev->SecConfig.GroupCipher)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG: Wrong Group Cipher %d\n", - pWdev->SecConfig.GroupCipher)); - return FALSE; - } - SET_CIPHER_GCMP256( - pWdev->SecConfig.GroupCipher); - break; - - case Ndis802_11AESEnable: - if (!IS_CIPHER_CCMP128( - pWdev->SecConfig.GroupCipher)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG: Wrong Group Cipher %d\n", - pWdev->SecConfig.GroupCipher)); - return FALSE; - } - pAd->SharedKey[apidx][pKeyInfo->KeyId] - .CipherAlg = CIPHER_AES; - SET_CIPHER_CCMP128( - pWdev->SecConfig.GroupCipher); - break; - - case Ndis802_11TKIPEnable: - if (!IS_CIPHER_TKIP( - pWdev->SecConfig.GroupCipher)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG: Wrong Group Cipher %d\n", - pWdev->SecConfig.GroupCipher)); - return FALSE; - } - pAd->SharedKey[apidx][pKeyInfo->KeyId] - .CipherAlg = CIPHER_TKIP; - SET_CIPHER_TKIP(pWdev->SecConfig.GroupCipher); - break; - - case Ndis802_11GCMP128Enable: - if (!IS_CIPHER_GCMP128( - pWdev->SecConfig.GroupCipher)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG: Wrong Group Cipher %d\n", - pWdev->SecConfig.GroupCipher)); - return FALSE; - } - SET_CIPHER_GCMP128( - pWdev->SecConfig.GroupCipher); - - break; - - case Ndis802_11CCMP256Enable: - if (!IS_CIPHER_CCMP256( - pWdev->SecConfig.GroupCipher)) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG: Wrong Group Cipher %d\n", - pWdev->SecConfig.GroupCipher)); - return FALSE; - } - SET_CIPHER_CCMP256( - pWdev->SecConfig.GroupCipher); - - break; - } -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - ASIC_SEC_INFO Info = { 0 }; - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_GROUP_KEY; - Info.Direction = SEC_ASIC_KEY_TX; - Info.Wcid = Wcid; - Info.BssIndex = apidx; - Info.Cipher = pWdev->SecConfig.GroupCipher; - Info.KeyIdx = pKeyInfo->KeyId; - pWdev->SecConfig.GroupKeyId = Info.KeyIdx; - os_move_mem(&Info.PeerAddr[0], BROADCAST_ADDR, - MAC_ADDR_LEN); - /* Install Shared key */ - os_move_mem(pWdev->SecConfig.GTK, - pKeyInfo->KeyBuf, pKeyInfo->KeyLen); - os_move_mem(Info.Key.Key, pWdev->SecConfig.GTK, - LEN_MAX_GTK); - WPAInstallKey(pAd, &Info, TRUE, TRUE); - pWdev->SecConfig.Handshake.GTKState = - REKEY_ESTABLISHED; - } -#else - os_move_mem(pAd->SharedKey[apidx][pKeyInfo->KeyId].Key, - pKeyInfo->KeyBuf, pKeyInfo->KeyLen); - AsicAddSharedKeyEntry( - pAd, apidx, pKeyInfo->KeyId, - &pAd->SharedKey[apidx][pKeyInfo->KeyId]); - GET_GroupKey_WCID(pWdev, Wcid); -#endif - } else { - if (pKeyInfo->MAC) - pEntry = MacTableLookup(pAd, pKeyInfo->MAC); - - if (pEntry) { - switch (pKeyInfo->cipher) { - case Ndis802_11GCMP256Enable: - SET_CIPHER_GCMP256( - pEntry->SecConfig - .PairwiseCipher); - break; - - case Ndis802_11AESEnable: - SET_CIPHER_CCMP128( - pEntry->SecConfig - .PairwiseCipher); - break; - - case Ndis802_11TKIPEnable: - SET_CIPHER_TKIP( - pEntry->SecConfig - .PairwiseCipher); - break; - - case Ndis802_11GCMP128Enable: - SET_CIPHER_GCMP128( - pEntry->SecConfig - .PairwiseCipher); - break; - - case Ndis802_11CCMP256Enable: - SET_CIPHER_CCMP256( - pEntry->SecConfig - .PairwiseCipher); - break; - } - NdisCopyMemory( - &pEntry->SecConfig.PTK[OFFSET_OF_PTK_TK], - pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - struct _ASIC_SEC_INFO *info = NULL; - - /* Set key material to Asic */ - os_alloc_mem(NULL, (UCHAR **)&info, - sizeof(ASIC_SEC_INFO)); - if (info) { - os_zero_mem( - info, - sizeof(ASIC_SEC_INFO)); - NdisCopyMemory( - &pEntry->SecConfig.PTK - [LEN_PTK_KCK + - LEN_PTK_KEK], - pKeyInfo->KeyBuf, - (LEN_TK + LEN_TK2)); - info->Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - info->Direction = - SEC_ASIC_KEY_BOTH; - info->Wcid = pEntry->wcid; - info->BssIndex = - pEntry->func_tb_idx; - info->Cipher = - pEntry->SecConfig - .PairwiseCipher; - info->KeyIdx = - (UINT8)(pKeyInfo->KeyId & - 0x0fff); - os_move_mem(&info->PeerAddr[0], - pEntry->Addr, - MAC_ADDR_LEN); - os_move_mem( - info->Key.Key, - &pEntry->SecConfig.PTK - [LEN_PTK_KCK + - LEN_PTK_KEK], - (LEN_TK + LEN_TK2)); - WPAInstallKey(pAd, info, TRUE, - TRUE); - os_free_mem(info); - } else { - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: struct alloc fail\n", - __func__)); - } - } -#else - pEntry->PairwiseKey.KeyLen = LEN_TK; - NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], - pKeyInfo->KeyBuf, - OFFSET_OF_PTK_TK); - os_move_mem(pEntry->PairwiseKey.Key, - &pEntry->PTK[OFFSET_OF_PTK_TK], - pKeyInfo->KeyLen); - AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, - &pEntry->PairwiseKey); - -#endif -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - if (pKeyInfo->cipher == Ndis802_11AESEnable) { - UCHAR op_ht_bw1 = - wlan_operate_get_ht_bw(pWdev); - UCHAR op_ht_bw2 = - wlan_operate_get_ht_bw( - &pAd->StaCfg[0].wdev); - - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: InfraCh=%d, pWdev->channel=%d\n", - __func__, - pAd->MlmeAux.InfraChannel, - pWdev->channel)); - - if (INFRA_ON(pAd) && - (((op_ht_bw2 == op_ht_bw1) && - (pAd->StaCfg[0].wdev.channel != - pWdev->channel)) || - !((op_ht_bw2 == op_ht_bw1) && - ((pAd->StaCfg[0].wdev.channel == - pWdev->channel))))) { - /*wait 1 s DHCP for P2P CLI */ - OS_WAIT(1000); - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OS WAIT 1000 FOR DHCP\n")); - /* pAd->MCC_GOConnect_Protect = FALSE; */ - /* pAd->MCC_GOConnect_Count = 0; */ - Start_MCC(pAd); - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("infra => GO test\n")); - } else if ((op_ht_bw2 != op_ht_bw1) && - ((pAd->StaCfg[0] - .wdev.channel == - pWdev->channel))) { - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("start bw != && SCC\n")); - pAd->Mlme.bStartScc = TRUE; - } - - /*after p2p cli connect , neet to change to default configure*/ - if (op_ht_bw1 == HT_BW_20) { - wlan_operate_set_ht_bw( - pWdev, HT_BW_40, - EXTCHA_BELOW); - pAd->CommonCfg.HT_Disable = 0; - SetCommonHtVht(pAd, pWdev); - } - } -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - - } else - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG: Security Set. (PAIRWISE) But pEntry NULL\n")); - } - } -#ifdef DOT11W_PMF_SUPPORT - else if (pKeyInfo->KeyType == RT_CMD_80211_KEY_AES_CMAC) { - if ((pKeyInfo->bPairwise == FALSE) && - (pKeyInfo->KeyId == 4 || pKeyInfo->KeyId == 5)) { - hex_dump("PMF IGTK pKeyInfo->KeyBuf=", - (UINT8 *)pKeyInfo->KeyBuf, pKeyInfo->KeyLen); - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("PMF IGTK pKeyInfo->KeyId=%d\n", - pKeyInfo->KeyId)); - -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - PPMF_CFG pPmfCfg = &pWdev->SecConfig.PmfCfg; - ASIC_SEC_INFO Info = { 0 }; - USHORT Wcid; - if (pKeyInfo->cipher == Ndis802_11AESEnable) - SET_CIPHER_CCMP128( - pWdev->SecConfig.GroupCipher); - else if (pKeyInfo->cipher == - Ndis802_11TKIPEnable) - SET_CIPHER_TKIP( - pWdev->SecConfig.GroupCipher); - /* Get a specific WCID to record this MBSS key attribute */ - GET_GroupKey_WCID(pWdev, Wcid); - - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_GROUP_KEY; - Info.Direction = SEC_ASIC_KEY_TX; - Info.Wcid = Wcid; - Info.BssIndex = apidx; - Info.Cipher = pWdev->SecConfig.GroupCipher; - Info.KeyIdx = pWdev->SecConfig.GroupKeyId; - Info.IGTKKeyLen = LEN_TK; - os_move_mem(&Info.PeerAddr[0], BROADCAST_ADDR, - MAC_ADDR_LEN); - os_zero_mem( - &pPmfCfg->IPN[pKeyInfo->KeyId - 4][0], - LEN_WPA_TSC); - os_move_mem( - &pPmfCfg->IGTK[pKeyInfo->KeyId - 4][0], - pKeyInfo->KeyBuf, pKeyInfo->KeyLen); - os_move_mem(Info.Key.Key, pWdev->SecConfig.GTK, - LEN_MAX_GTK); - os_move_mem(Info.IGTK, pKeyInfo->KeyBuf, - pKeyInfo->KeyLen); - WPAInstallKey(pAd, &Info, TRUE, TRUE); - pWdev->SecConfig.Handshake.GTKState = - REKEY_ESTABLISHED; - } - -#else - os_move_mem(pAd->SharedKey[apidx][pKeyInfo->KeyId].Key, - pKeyInfo->KeyBuf, pKeyInfo->KeyLen); - AsicAddSharedKeyEntry( - pAd, apidx, pKeyInfo->KeyId, - &pAd->SharedKey[apidx][pKeyInfo->KeyId]); - - GET_GroupKey_WCID(pWdev, Wcid); - RTMPSetWcidSecurityInfo( - pAd, apidx, (UINT8)(pKeyInfo->KeyId), - pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg, - Wcid, SHAREDKEYTABLE); - -#ifdef MT_MAC - if (pAd->chipCap.hif_type == HIF_MT) - CmdProcAddRemoveKey( - pAd, 0, apidx, pKeyInfo->KeyId, Wcid, - SHAREDKEYTABLE, - &pAd->SharedKey[apidx][pKeyInfo->KeyId], - BROADCAST_ADDR); -#endif /* MT_MAC */ -#endif /* MT7615 */ - } else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ERROR !! pKeyInfo->bPairwise = %d pKeyInfo->KeyId=%d \n", - pKeyInfo->bPairwise, pKeyInfo->KeyId)); - } - } - -#endif /* DOT11W_PMF_SUPPORT */ - -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -INT CFG80211_StaPortSecured(IN VOID *pAdCB, IN UCHAR *pMac, IN UINT flag) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - MAC_TABLE_ENTRY *pEntry; - STA_TR_ENTRY *tr_entry; - - pEntry = MacTableLookup(pAd, pMac); - - if (!pEntry) - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Can't find pEntry in CFG80211_StaPortSecured\n")); - else { - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - - if (flag) { - /* Update status and set Port as Secured */ - pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; -#if defined(MT7615) || defined(MT7622) - - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - pEntry->SecConfig.Handshake.WpaState = - AS_PTKINITDONE; - WifiSysUpdatePortSecur(pAd, pEntry, NULL); - } - -#else - pEntry->WpaState = AS_PTKINITDONE; -#endif - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AID:%d, PortSecured\n", pEntry->Aid)); - } else { - pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP; - tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AID:%d, PortNotSecured\n", pEntry->Aid)); - } - } - - return 0; -} - -#ifdef HOSTAPD_MAP_SUPPORT -INT CFG80211_ApStaDel(IN VOID *pAdCB, IN VOID *pData, IN UINT reason) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - MAC_TABLE_ENTRY *pEntry; - CMD_RTPRIV_IOCTL_AP_STA_DEL *pApStaDelInfo = NULL; - PUCHAR pMac = NULL; - - pApStaDelInfo = (CMD_RTPRIV_IOCTL_AP_STA_DEL *)pData; - - if (pApStaDelInfo->pSta_MAC != NULL) - pMac = (PUCHAR)pApStaDelInfo->pSta_MAC; - - if (pMac == NULL) { - { - if (pApStaDelInfo->pWdev != NULL) - MacTableResetWdev(pAd, pApStaDelInfo->pWdev); - else - MacTableReset(pAd); - NdisZeroMemory(pAd->radius_tbl, - MAX_LEN_OF_MAC_TABLE * - sizeof(RADIUS_ACCOUNT_ENTRY)); - } - } else { - int i; - - pEntry = MacTableLookup(pAd, pMac); - if (pEntry) { - USHORT reason_code = REASON_NO_LONGER_VALID; -#ifdef HOSTAPD_OWE_SUPPORT - if (pEntry->wdev && (pEntry->Sst == SST_AUTH) && - IS_AKM_OWE(pEntry->wdev->SecConfig.AKMMap)) - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\n OWE mode Ignore Deauth from Hostapd")); - else -#endif - { - if (reason) - reason_code = reason; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s, Deauth : 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x reason code %d\n", - __func__, pMac[0], pMac[1], pMac[2], - pMac[3], pMac[4], pMac[5], - reason_code)); - - MlmeDeAuthAction(pAd, pEntry, reason_code, - FALSE); - } - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Can't find pEntry in ApStaDel\n")); - - /* Find entry in radius tbl and delete it if found */ - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - RADIUS_ACCOUNT_ENTRY *pRadiusEntry = - &pAd->radius_tbl[i]; - - if (MAC_ADDR_EQUAL(pRadiusEntry->Addr, pMac)) - NdisZeroMemory(pRadiusEntry, - sizeof(RADIUS_ACCOUNT_ENTRY)); - } - } - return 0; -} - -#else -INT CFG80211_ApStaDel(IN VOID *pAdCB, IN UCHAR *pMac, IN UINT reason) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - MAC_TABLE_ENTRY *pEntry; - - if (pMac == NULL) { - { - MacTableReset(pAd); - NdisZeroMemory(pAd->radius_tbl, - MAX_LEN_OF_MAC_TABLE * - sizeof(RADIUS_ACCOUNT_ENTRY)); - } - - } else { - int i; - - pEntry = MacTableLookup(pAd, pMac); - if (pEntry) { - USHORT reason_code = REASON_NO_LONGER_VALID; -#ifdef HOSTAPD_OWE_SUPPORT - if (pEntry->wdev && (pEntry->Sst == SST_AUTH) && - IS_AKM_OWE(pEntry->wdev->SecConfig.AKMMap)) - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\n OWE mode Ignore Deauth from Hostapd")); - else - -#endif - { - if (reason) - reason_code = reason; - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s, Deauth : 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x reason code %d\n", - __func__, pMac[0], pMac[1], pMac[2], - pMac[3], pMac[4], pMac[5], - reason_code)); - - MlmeDeAuthAction(pAd, pEntry, reason_code, - FALSE); - } - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Can't find pEntry in ApStaDel\n")); - - /* Find entry in radius tbl and delete it if found */ - - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - RADIUS_ACCOUNT_ENTRY *pRadiusEntry = - &pAd->radius_tbl[i]; - - if (MAC_ADDR_EQUAL(pRadiusEntry->Addr, pMac)) - NdisZeroMemory(pRadiusEntry, - sizeof(RADIUS_ACCOUNT_ENTRY)); - } - } - return 0; -} -#endif - -INT CFG80211_setApDefaultKey(IN VOID *pAdCB, IN struct net_device *pNetdev, - IN UINT Data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - INT32 apidx = CFG80211_FindMbssApIdxByNetDevice(pAd, pNetdev); - - if (apidx == WDEV_NOT_FOUND) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s failed - [ERROR]can't find wdev in driver MBSS. \n", - __func__)); - return FALSE; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Set Ap Default Key: %d\n", Data)); -#if defined(MT7615) || defined(MT7622) - - pAd->ApCfg.MBSSID[apidx].wdev.SecConfig.PairwiseKeyId = Data; -#else - pAd->ApCfg.MBSSID[apidx].wdev.DefaultKeyId = Data; -#endif - - return 0; -} - -#ifdef DOT11W_PMF_SUPPORT -INT CFG80211_setApDefaultMgmtKey(IN VOID *pAdCB, IN struct net_device *pNetdev, - IN UINT Data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - INT32 apidx = CFG80211_FindMbssApIdxByNetDevice(pAd, pNetdev); - struct wifi_dev *pWdev = NULL; - - if (apidx == WDEV_NOT_FOUND) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s failed - [ERROR]can't find wdev in driver MBSS. \n", - __FUNCTION__)); - return FALSE; - } - pWdev = &pAd->ApCfg.MBSSID[apidx].wdev; - -#ifdef MT7615 - if ((Data == 4) || (Data == 5)) { - pWdev->SecConfig.PmfCfg.IGTK_KeyIdx = (UINT8)Data; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Set Ap Default Mgmt KeyId: %d\n", Data)); - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s fail - [ERROR]Invalid Mgmt KeyId: %d\n", - __FUNCTION__, Data)); - } -#endif - - return 0; -} -#endif /*DOT11W_PMF_SUPPORT*/ - -INT CFG80211_ApStaDelSendEvent(PRTMP_ADAPTER pAd, const PUCHAR mac_addr, - IN PNET_DEV pNetDevIn) -{ - { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SINGLE_DEVICE CFG : GO NOITFY THE CLIENT Disconnected\n")); - CFG80211OS_DelSta(pNetDevIn, mac_addr); - } - - return 0; -} - -#ifdef APCLI_CFG80211_SUPPORT -VOID CFG80211_ApClientConnectResultInform(VOID *pAdCB, UCHAR *pBSSID, - UCHAR *pReqIe, UINT32 ReqIeLen, - UCHAR *pRspIe, UINT32 RspIeLen, - UCHAR FlgIsSuccess) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - struct wifi_dev *wdev = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev; - - if ((wdev->open_state == TRUE) && - (pAd->cfg80211_ctrl.FlgCfg80211Connecting == TRUE)) { - CFG80211OS_P2pClientConnectResultInform(wdev->if_dev, pBSSID, - pReqIe, ReqIeLen, - pRspIe, RspIeLen, - FlgIsSuccess); - } - - pAd->ApCfg.ApCliTab[0].ReadyToConnect = FALSE; - pAd->cfg80211_ctrl.FlgCfg80211Connecting = FALSE; -} -#endif /* APCLI_CFG80211_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#endif /* RT_CFG80211_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_apcli.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_apcli.c deleted file mode 100644 index 19e623b6f5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_apcli.c +++ /dev/null @@ -1,571 +0,0 @@ -#ifdef MTK_LICENSE -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ -#endif /* MTK_LICENSE */ -/**************************************************************************** - - Abstract: - - All related CFG80211 P2P function body. - - History: - -***************************************************************************/ -#ifdef APCLI_CFG80211_SUPPORT -#include "rt_config.h" - -VOID CFG80211DRV_SetApCliAssocIe(VOID *pAdOrg, VOID *pData, UINT ie_len) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - APCLI_STRUCT *apcli_entry; - hex_dump("APCLI=", pData, ie_len); - - apcli_entry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; - - if (ie_len > 0) { - if (apcli_entry->wpa_supplicant_info.pWpaAssocIe) { - os_free_mem( - apcli_entry->wpa_supplicant_info.pWpaAssocIe); - apcli_entry->wpa_supplicant_info.pWpaAssocIe = NULL; - } - - os_alloc_mem( - NULL, - (UCHAR **)&apcli_entry->wpa_supplicant_info.pWpaAssocIe, - ie_len); - if (apcli_entry->wpa_supplicant_info.pWpaAssocIe) { - apcli_entry->wpa_supplicant_info.WpaAssocIeLen = ie_len; - os_move_mem( - apcli_entry->wpa_supplicant_info.pWpaAssocIe, - pData, - apcli_entry->wpa_supplicant_info.WpaAssocIeLen); - } else - apcli_entry->wpa_supplicant_info.WpaAssocIeLen = 0; - } else { - if (apcli_entry->wpa_supplicant_info.pWpaAssocIe) { - os_free_mem( - apcli_entry->wpa_supplicant_info.pWpaAssocIe); - apcli_entry->wpa_supplicant_info.pWpaAssocIe = NULL; - } - apcli_entry->wpa_supplicant_info.WpaAssocIeLen = 0; - } -} - -VOID CFG80211_LostApInform(VOID *pAdOrg) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - PNET_DEV pNetDev = pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev.if_dev; - ULONG *cur_state = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].CtrlCurrState; - - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() ==> state: %ld\n", __func__, *cur_state)); - pAd->cfg80211_ctrl.FlgCfg80211Connecting = FALSE; - if (pNetDev) { - struct wifi_dev *pwifi_dev = NULL; - pwifi_dev = RTMP_OS_NETDEV_GET_WDEV(pNetDev); - if (pwifi_dev && (pwifi_dev->open_state == FALSE)) - return; - - if (*cur_state >= APCLI_CTRL_CONNECTED) { -#if (LINUX_VERSION_CODE > KERNEL_VERSION(4, 1, 52)) - cfg80211_disconnected(pNetDev, 0, NULL, 0, FALSE, - GFP_KERNEL); -#else - cfg80211_disconnected(pNetDev, 0, NULL, 0, GFP_KERNEL); -#endif - } else if (*cur_state >= APCLI_CTRL_PROBE) { - cfg80211_connect_result(pNetDev, NULL, NULL, 0, NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, - GFP_KERNEL); - } - } else - MTWF_LOG( - DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> BUG CFG80211_LostAPInform, BUT NetDevice not exist.\n")); - Set_ApCli_Enable_Proc(pAd, "0"); -} - -VOID CFG80211DRV_ApClientKeyAdd(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo; - PAPCLI_STRUCT pApCliEntry; - MAC_TABLE_ENTRY *pMacEntry = (MAC_TABLE_ENTRY *)NULL; - STA_TR_ENTRY *tr_entry; - struct wifi_dev *wdev; - INT BssIdx; - - BssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + MAIN_MBSSID; - pApCliEntry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; - wdev = &pApCliEntry->wdev; - pMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID]; - tr_entry = &pAd->MacTab.tr_entry[pMacEntry->wcid]; - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CFG Debug: CFG80211DRV_ApClientKeyAdd\n")); - pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; - if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40 || - pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP104) { -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - if (pKeyInfo->bPairwise == FALSE) { - ASIC_SEC_INFO Info = { 0 }; - if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40) - SET_CIPHER_WEP40( - wdev->SecConfig.GroupCipher); - else - SET_CIPHER_WEP104( - wdev->SecConfig.GroupCipher); - - NdisCopyMemory( - &pAd->cfg80211_ctrl.WepKeyInfoBackup, - pKeyInfo, - sizeof(CMD_RTPRIV_IOCTL_80211_KEY)); - wdev->SecConfig.WepKey[pKeyInfo->KeyId].KeyLen = - pKeyInfo->KeyLen; - os_move_mem(wdev->SecConfig - .WepKey[pKeyInfo->KeyId] - .Key, - pKeyInfo->KeyBuf, pKeyInfo->KeyLen); - wdev->SecConfig.GroupKeyId = pKeyInfo->KeyId; - os_move_mem(wdev->SecConfig.GTK, - pKeyInfo->KeyBuf, pKeyInfo->KeyLen); - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_GROUP_KEY; - Info.Direction = SEC_ASIC_KEY_RX; - Info.Wcid = - wdev->bss_info_argument.ucBcMcWlanIdx; - Info.BssIndex = pMacEntry->func_tb_idx; - /* Info.BssIndex = wdev->wdev_idx; */ - Info.Cipher = wdev->SecConfig.GroupCipher; - Info.KeyIdx = pKeyInfo->KeyId; - os_move_mem(&Info.PeerAddr[0], BROADCAST_ADDR, - MAC_ADDR_LEN); - os_move_mem(Info.Key.Key, pKeyInfo->KeyBuf, - pKeyInfo->KeyLen); - Info.Key.KeyLen = pKeyInfo->KeyLen; - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - } - { - ASIC_SEC_INFO Info = { 0 }; - - pMacEntry->SecConfig.PairwiseKeyId = - pKeyInfo->KeyId; - if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40) - SET_CIPHER_WEP40( - pMacEntry->SecConfig - .PairwiseCipher); - else - SET_CIPHER_WEP104( - pMacEntry->SecConfig - .PairwiseCipher); - - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pMacEntry->wcid; - Info.BssIndex = pMacEntry->func_tb_idx; - /* Info.BssIndex = wdev->wdev_idx; */ - Info.KeyIdx = - pMacEntry->SecConfig.PairwiseKeyId; - Info.Cipher = - pMacEntry->SecConfig.PairwiseCipher; - Info.KeyIdx = - pMacEntry->SecConfig.PairwiseKeyId; - os_move_mem(Info.Key.Key, pKeyInfo->KeyBuf, - pKeyInfo->KeyLen); - os_move_mem(&Info.PeerAddr[0], pMacEntry->Addr, - MAC_ADDR_LEN); - Info.Key.KeyLen = pKeyInfo->KeyLen; - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - } - } -#endif /* MT7615 || MT7622*/ - } else if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WPA) { - if (pKeyInfo->cipher == Ndis802_11AESEnable) { - if (pKeyInfo->bPairwise == FALSE) { - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - struct _ASIC_SEC_INFO *info = NULL; - - NdisCopyMemory( - &pMacEntry->SecConfig.GTK, - pKeyInfo->KeyBuf, MAX_LEN_GTK); - SET_CIPHER_CCMP128( - pMacEntry->SecConfig - .GroupCipher); - /* Set key material to Asic */ - os_alloc_mem(NULL, (UCHAR **)&info, - sizeof(ASIC_SEC_INFO)); - if (info) { - os_zero_mem( - info, - sizeof(ASIC_SEC_INFO)); - /*NdisCopyMemory(&pMacEntry->SecConfig.PTK[LEN_PTK_KCK + LEN_PTK_KEK], pKeyInfo->KeyBuf, LEN_MAX_PTK); */ - info->Operation = - SEC_ASIC_ADD_GROUP_KEY; - info->Direction = - SEC_ASIC_KEY_RX; - info->Wcid = - wdev->bss_info_argument - .ucBcMcWlanIdx; - info->BssIndex = - pMacEntry->func_tb_idx; - info->Cipher = - pMacEntry->SecConfig - .GroupCipher; - info->KeyIdx = - (UINT8)(pKeyInfo->KeyId & - 0x0fff); - os_move_mem(&info->PeerAddr[0], - pMacEntry->Addr, - MAC_ADDR_LEN); - os_move_mem( - info->Key.Key, - &pMacEntry->SecConfig - .GTK, - (LEN_TK + LEN_TK2)); - if (IS_AKM_WPA_CAPABILITY( - pMacEntry->SecConfig - .AKMMap)) { - /* set 802.1x port control */ - tr_entry->PortSecured = - WPA_802_1X_PORT_SECURED; - pMacEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - WifiSysUpdatePortSecur( - pAd, pMacEntry, - NULL); - } - WPAInstallKey(pAd, info, TRUE, - TRUE); - os_free_mem(info); - } else { - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: struct alloc fail\n", - __func__)); - } - } - } else { - if (pMacEntry) { -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - struct _ASIC_SEC_INFO *info = - NULL; - - /* NdisCopyMemory(&pMacEntry->SecConfig.PTK, pKeyInfo->KeyBuf, LEN_TK + LEN_TK2); */ - SET_CIPHER_CCMP128( - pMacEntry->SecConfig - .PairwiseCipher); - /* Set key material to Asic */ - os_alloc_mem( - NULL, (UCHAR **)&info, - sizeof(ASIC_SEC_INFO)); - if (info) { - os_zero_mem( - info, - sizeof(ASIC_SEC_INFO)); - /*NdisCopyMemory(&pMacEntry->SecConfig.PTK[LEN_PTK_KCK + LEN_PTK_KEK], pKeyInfo->KeyBuf, LEN_MAX_PTK); */ - info->Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - info->Direction = - SEC_ASIC_KEY_BOTH; - info->Wcid = - pMacEntry->wcid; - info->BssIndex = - pMacEntry - ->func_tb_idx; - info->Cipher = - pMacEntry - ->SecConfig - .PairwiseCipher; - info->KeyIdx = - (UINT8)(pKeyInfo->KeyId & - 0x0fff); - os_move_mem( - &info->PeerAddr - [0], - pMacEntry->Addr, - MAC_ADDR_LEN); - os_move_mem( - info->Key.Key, - pKeyInfo->KeyBuf, - (LEN_TK + - LEN_TK2)); - WPAInstallKey(pAd, info, - TRUE, - TRUE); - os_free_mem(info); - } else { - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: struct alloc fail\n", - __func__)); - } - } -#else - os_zero_mem(&pMacEntry->PairwiseKey, - sizeof(CIPHER_KEY)); - pMacEntry->PairwiseKey.KeyLen = LEN_TK; - - NdisCopyMemory( - &pMacEntry->PTK[OFFSET_OF_PTK_TK], - pKeyInfo->KeyBuf, - OFFSET_OF_PTK_TK); - os_move_mem( - pMacEntry->PairwiseKey.Key, - &pMacEntry->PTK[OFFSET_OF_PTK_TK], - pKeyInfo->KeyLen); - - pMacEntry->PairwiseKey.CipherAlg = - CIPHER_AES; - - AsicAddPairwiseKeyEntry( - pAd, (UCHAR)pMacEntry->Aid, - &pMacEntry->PairwiseKey); - RTMPSetWcidSecurityInfo( - pAd, BssIdx, 0, - pMacEntry->PairwiseKey.CipherAlg, - pMacEntry->Aid, - PAIRWISEKEYTABLE); - -#ifdef MT_MAC - if (pAd->chipCap.hif_type == HIF_MT) - RTMP_ADDREMOVE_KEY( - pAd, 0, - pMacEntry->func_tb_idx, - 0, pMacEntry->wcid, - PAIRWISEKEYTABLE, - &pMacEntry->PairwiseKey, - pMacEntry->Addr); -#endif /* MT_MAC*/ -#endif /* MT_MAC*/ - } else { - printk("APCLI: Set AES Security Set. (PAIRWISE) But pMacEntry NULL\n"); - } - } - } else if (pKeyInfo->cipher == Ndis802_11TKIPEnable) { - /* TKIP */ - if (pKeyInfo->bPairwise == FALSE) { -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - struct _ASIC_SEC_INFO *info = NULL; - - NdisCopyMemory( - &pMacEntry->SecConfig.GTK, - pKeyInfo->KeyBuf, MAX_LEN_GTK); - SET_CIPHER_TKIP(pMacEntry->SecConfig - .GroupCipher); - /* Set key material to Asic */ - os_alloc_mem(NULL, (UCHAR **)&info, - sizeof(ASIC_SEC_INFO)); - if (info) { - os_zero_mem( - info, - sizeof(ASIC_SEC_INFO)); - info->Operation = - SEC_ASIC_ADD_GROUP_KEY; - info->Direction = - SEC_ASIC_KEY_RX; - info->Wcid = - wdev->bss_info_argument - .ucBcMcWlanIdx; - ; - info->BssIndex = - pMacEntry->func_tb_idx; - info->Cipher = - pMacEntry->SecConfig - .GroupCipher; - info->KeyIdx = - (UINT8)(pKeyInfo->KeyId & - 0x0fff); - os_move_mem(&info->PeerAddr[0], - pMacEntry->Addr, - MAC_ADDR_LEN); - /* Install Shared key */ - os_move_mem( - info->Key.Key, - &pMacEntry->SecConfig - .GTK, - LEN_MAX_GTK); - if (IS_AKM_WPA_CAPABILITY( - pMacEntry->SecConfig - .AKMMap)) { - /* set 802.1x port control */ - tr_entry->PortSecured = - WPA_802_1X_PORT_SECURED; - pMacEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - WifiSysUpdatePortSecur( - pAd, pMacEntry, - NULL); - } - WPAInstallKey(pAd, info, TRUE, - TRUE); - wdev->SecConfig.Handshake - .GTKState = - REKEY_ESTABLISHED; - os_free_mem(info); - } else { - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: struct alloc fail\n", - __func__)); - } - } -#else - os_move_mem( - pAd->SharedKey[apidx][pKeyInfo->KeyId] - .Key, - pKeyInfo->KeyBuf, pKeyInfo->KeyLen); - AsicAddSharedKeyEntry( - pAd, apidx, pKeyInfo->KeyId, - &pAd->SharedKey[apidx][pKeyInfo->KeyId]); - GET_GroupKey_WCID(pWdev, Wcid); - RTMPSetWcidSecurityInfo( - pAd, apidx, (UINT8)(pKeyInfo->KeyId), - pAd->SharedKey[apidx][pKeyInfo->KeyId] - .CipherAlg, - Wcid, SHAREDKEYTABLE); - -#ifdef MT_MAC - if (pAd->chipCap.hif_type == HIF_MT) - RTMP_ADDREMOVE_KEY( - pAd, 0, apidx, pKeyInfo->KeyId, - Wcid, SHAREDKEYTABLE, - &pAd->SharedKey[apidx] - [pKeyInfo->KeyId], - BROADCAST_ADDR); -#endif /* MT_MAC */ -#endif /* MT7615 */ - } else { - if (pMacEntry) { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("CFG: Set TKIP Security Set. (PAIRWISE) %d\n", - pKeyInfo->KeyLen)); - NdisCopyMemory( - &pMacEntry->SecConfig - .PTK[OFFSET_OF_PTK_TK], - pKeyInfo->KeyBuf, - OFFSET_OF_PTK_TK); -#if defined(MT7615) || defined(MT7622) - if (IS_MT7615(pAd) || IS_MT7622(pAd)) { - struct _ASIC_SEC_INFO *info = - NULL; - - /*NdisCopyMemory(&pMacEntry->SecConfig.PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK);*/ - SET_CIPHER_TKIP( - pMacEntry->SecConfig - .PairwiseCipher); - /* Set key material to Asic */ - os_alloc_mem( - NULL, (UCHAR **)&info, - sizeof(ASIC_SEC_INFO)); - if (info) { - os_zero_mem( - info, - sizeof(ASIC_SEC_INFO)); - /*NdisCopyMemory(&pMacEntry->SecConfig.PTK[LEN_PTK_KCK + LEN_PTK_KEK], pKeyInfo->KeyBuf, LEN_MAX_PTK);*/ - info->Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - info->Direction = - SEC_ASIC_KEY_BOTH; - info->Wcid = - pMacEntry->wcid; - info->BssIndex = - pMacEntry - ->func_tb_idx; - info->Cipher = - pMacEntry - ->SecConfig - .PairwiseCipher; - info->KeyIdx = - (UINT8)(pKeyInfo->KeyId & - 0x0fff); /*pEntry->SecConfig.PairwiseKeyId;*/ - os_move_mem( - &info->PeerAddr - [0], - pMacEntry->Addr, - MAC_ADDR_LEN); - /*os_move_mem(info->Key.Key,&pMacEntry->SecConfig.PTK[LEN_PTK_KCK + LEN_PTK_KEK], (LEN_TK + LEN_TK2));*/ - os_move_mem( - info->Key.Key, - pKeyInfo->KeyBuf, - (LEN_TK + - LEN_TK2)); - WPAInstallKey(pAd, info, - TRUE, - TRUE); - os_free_mem(info); - } else { - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: struct alloc fail\n", - __func__)); - } - } -#else - pEntry->PairwiseKey.KeyLen = LEN_TK; - NdisCopyMemory( - &pEntry->PTK[OFFSET_OF_PTK_TK], - pKeyInfo->KeyBuf, - OFFSET_OF_PTK_TK); - os_move_mem( - pEntry->PairwiseKey.Key, - &pEntry->PTK[OFFSET_OF_PTK_TK], - pKeyInfo->KeyLen); - - AsicAddPairwiseKeyEntry( - pAd, (UCHAR)pEntry->Aid, - &pEntry->PairwiseKey); - RTMPSetWcidSecurityInfo( - pAd, pEntry->apidx, - (UINT8)(pKeyInfo->KeyId & - 0x0fff), - pEntry->PairwiseKey.CipherAlg, - pEntry->Aid, PAIRWISEKEYTABLE); - -#ifdef MT_MAC - if (pAd->chipCap.hif_type == HIF_MT) - RTMP_ADDREMOVE_KEY( - pAd, 0, apidx, - pKeyInfo->KeyId, - pEntry->wcid, - PAIRWISEKEYTABLE, - &pEntry->PairwiseKey, - pEntry->Addr); -#endif /* MT_MAC */ -#endif /* MT7615 */ - } else { - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG: Set TKIP Security Set. (PAIRWISE) But pEntry NULL\n")); - } - } - } - } -} -#endif /* APCLI_CFG80211_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_inf.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_inf.c deleted file mode 100644 index 1480e7072d..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_inf.c +++ /dev/null @@ -1,828 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2012, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - cfg80211_inf.c - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - YF Luo 06-28-2012 Init version - 12-26-2013 Integration of NXTC -*/ -#define RTMP_MODULE_OS - -#include "rt_config.h" -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" - -#if (KERNEL_VERSION(2, 6, 28) <= LINUX_VERSION_CODE) -#ifdef RT_CFG80211_SUPPORT -extern INT apcli_tx_pkt_allowed(RTMP_ADAPTER *pAd, struct wifi_dev *wdev, - PNDIS_PACKET pkt); - -BOOLEAN CFG80211DRV_OpsChgVirtualInf(RTMP_ADAPTER *pAd, VOID *pData) -{ - PCFG80211_CTRL pCfg80211_ctrl = NULL; - UINT newType, oldType; - CMD_RTPRIV_IOCTL_80211_VIF_PARM *pVifParm; - - pVifParm = (CMD_RTPRIV_IOCTL_80211_VIF_PARM *)pData; - pCfg80211_ctrl = &pAd->cfg80211_ctrl; - newType = pVifParm->newIfType; - oldType = pVifParm->oldIfType; -#ifdef RT_CFG80211_P2P_SINGLE_DEVICE - CFG80211DBG(DBG_LVL_TRACE, ("80211> @@@ Change from %u to %u Mode\n", - oldType, newType)); - pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_DISABLE; - - if (newType == RT_CMD_80211_IFTYPE_P2P_CLIENT) - pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_CLI_UP; - else if (newType == RT_CMD_80211_IFTYPE_P2P_GO) - pCfg80211_ctrl->P2POpStatusFlags = CFG_P2P_GO_UP; - -#endif /* RT_CFG80211_P2P_SINGLE_DEVICE */ - /* Change Device Type */ - if ((newType == RT_CMD_80211_IFTYPE_STATION) || - (newType == RT_CMD_80211_IFTYPE_P2P_CLIENT)) { - CFG80211DBG(DBG_LVL_TRACE, - ("80211> Change the Interface to STA Mode\n")); -#ifdef CONFIG_AP_SUPPORT - - if (pAd->cfg80211_ctrl.isCfgInApMode == RT_CMD_80211_IFTYPE_AP) - CFG80211DRV_DisableApInterface(pAd); - -#endif /* CONFIG_AP_SUPPORT */ - pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_STATION; - } else if ((newType == RT_CMD_80211_IFTYPE_AP) || - (newType == RT_CMD_80211_IFTYPE_P2P_GO)) { - CFG80211DBG(DBG_LVL_TRACE, - ("80211> Change the Interface to AP Mode\n")); - pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; - } - - if ((newType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || - (newType == RT_CMD_80211_IFTYPE_P2P_GO)) - COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, - pVifParm->net_dev->dev_addr); - else { - } - - return TRUE; -} - -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) -BOOLEAN CFG80211DRV_OpsVifAdd(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_VIF_SET *pVifInfo; - - pVifInfo = (CMD_RTPRIV_IOCTL_80211_VIF_SET *)pData; - - /* Already one VIF in list */ - if (pAd->cfg80211_ctrl.Cfg80211VifDevSet.isGoingOn) - return FALSE; - - pAd->cfg80211_ctrl.Cfg80211VifDevSet.isGoingOn = TRUE; - RTMP_CFG80211_VirtualIF_Init(pAd, pVifInfo->vifName, pVifInfo->vifType); - return TRUE; -} - -BOOLEAN RTMP_CFG80211_VIF_ON(VOID *pAdSrc) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - - return pAd->cfg80211_ctrl.Cfg80211VifDevSet.isGoingOn; -} - -static PCFG80211_VIF_DEV RTMP_CFG80211_FindVifEntry_ByMac(VOID *pAdSrc, - PNET_DEV pNewNetDev) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - PLIST_HEADER pCacheList = - &pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList; - PCFG80211_VIF_DEV pDevEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = pCacheList->pHead; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - - while (pDevEntry != NULL) { - if (RTMPEqualMemory(pDevEntry->net_dev->dev_addr, - pNewNetDev->dev_addr, MAC_ADDR_LEN)) - return pDevEntry; - - pListEntry = pListEntry->pNext; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - } - - return NULL; -} - -PNET_DEV RTMP_CFG80211_FindVifEntry_ByType(VOID *pAdSrc, UINT32 devType) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - PLIST_HEADER pCacheList = - &pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList; - PCFG80211_VIF_DEV pDevEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = pCacheList->pHead; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - - while (pDevEntry != NULL) { - if (pDevEntry->devType == devType) - return pDevEntry->net_dev; - - pListEntry = pListEntry->pNext; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - } - - return NULL; -} - -PWIRELESS_DEV RTMP_CFG80211_FindVifEntryWdev_ByType(VOID *pAdSrc, - UINT32 devType) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - PLIST_HEADER pCacheList = - &pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList; - PCFG80211_VIF_DEV pDevEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = pCacheList->pHead; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - - while (pDevEntry != NULL) { - if (pDevEntry->devType == devType) - return pDevEntry->net_dev->ieee80211_ptr; - - pListEntry = pListEntry->pNext; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - } - - return NULL; -} - -VOID RTMP_CFG80211_AddVifEntry(VOID *pAdSrc, PNET_DEV pNewNetDev, - UINT32 DevType) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - PCFG80211_VIF_DEV pNewVifDev = NULL; - - os_alloc_mem(NULL, (UCHAR **)&pNewVifDev, sizeof(CFG80211_VIF_DEV)); - - if (pNewVifDev) { - os_zero_mem(pNewVifDev, sizeof(CFG80211_VIF_DEV)); - pNewVifDev->pNext = NULL; - pNewVifDev->net_dev = pNewNetDev; - pNewVifDev->devType = DevType; - os_zero_mem(pNewVifDev->CUR_MAC, MAC_ADDR_LEN); - NdisCopyMemory(pNewVifDev->CUR_MAC, pNewNetDev->dev_addr, - MAC_ADDR_LEN); - insertTailList(&pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList, - (RT_LIST_ENTRY *)pNewVifDev); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Add CFG80211 VIF Device, Type: %d.\n", - pNewVifDev->devType)); - } else - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error in alloc mem in New CFG80211 VIF Function.\n")); -} - -VOID RTMP_CFG80211_RemoveVifEntry(VOID *pAdSrc, PNET_DEV pNewNetDev) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = (RT_LIST_ENTRY *)RTMP_CFG80211_FindVifEntry_ByMac( - pAd, pNewNetDev); - - if (pListEntry) { - delEntryList(&pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList, - pListEntry); - os_free_mem(pListEntry); - pListEntry = NULL; - } else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error in RTMP_CFG80211_RemoveVifEntry.\n")); -} - -PNET_DEV RTMP_CFG80211_VirtualIF_Get(IN VOID *pAdSrc) -{ - /* PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; */ - /* return pAd->Cfg80211VifDevSet.Cfg80211VifDev[0].net_dev; */ - return NULL; -} - -static INT CFG80211_VirtualIF_Open(PNET_DEV dev_p) -{ - VOID *pAdSrc; - PRTMP_ADAPTER pAd; - - pAdSrc = RTMP_OS_NETDEV_GET_PRIV(dev_p); - ASSERT(pAdSrc); - pAd = (PRTMP_ADAPTER)pAdSrc; - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ===> %d,%s\n", __func__, dev_p->ifindex, - RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); - /* if (VIRTUAL_IF_UP(pAd, dev_p) != 0) */ - /* return -1; */ - /* increase MODULE use count */ - RT_MOD_INC_USE_COUNT(); - RT_MOD_HNAT_REG(dev_p); - - if ((dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_CLIENT) -#ifdef CFG80211_MULTI_STA - || (dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_STATION) -#endif /* CFG80211_MULTI_STA */ - ) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ApCli_Open\n")); - pAd->flg_apcli_init = TRUE; - ApCli_Open(pAd, dev_p); - return 0; - } - - RTMP_OS_NETDEV_START_QUEUE(dev_p); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: <=== %s\n", __func__, - RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); - return 0; -} - -static INT CFG80211_VirtualIF_Close(PNET_DEV dev_p) -{ - VOID *pAdSrc; - PRTMP_ADAPTER pAd; - - pAdSrc = RTMP_OS_NETDEV_GET_PRIV(dev_p); - ASSERT(pAdSrc); - pAd = (PRTMP_ADAPTER)pAdSrc; - - if ((dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_P2P_CLIENT) -#ifdef CFG80211_MULTI_STA - || (dev_p->ieee80211_ptr->iftype == RT_CMD_80211_IFTYPE_STATION) -#endif /* CFG80211_MULTI_STA */ - ) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ApCli_Close\n")); - CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); - RT_MOD_HNAT_DEREG(dev_p); - RT_MOD_DEC_USE_COUNT(); - return ApCli_Close(pAd, dev_p); - } - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: ===> %s\n", __func__, - RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); - RTMP_OS_NETDEV_STOP_QUEUE(dev_p); - - if (netif_carrier_ok(dev_p)) - netif_carrier_off(dev_p); - - if (INFRA_ON(pAd)) - AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod); - else if (ADHOC_ON(pAd)) - AsicEnableIbssSync(pAd, pAd->CommonCfg.BeaconPeriod, HW_BSSID_0, - OPMODE_ADHOC); - else - AsicDisableSync(pAd, HW_BSSID_0); - - /* VIRTUAL_IF_DOWN(pAd); */ - RT_MOD_HNAT_DEREG(dev_p); - RT_MOD_DEC_USE_COUNT(); - return 0; -} - -static INT CFG80211_PacketSend(PNDIS_PACKET pPktSrc, PNET_DEV pDev, - RTMP_NET_PACKET_TRANSMIT Func) -{ - PRTMP_ADAPTER pAd; - - pAd = RTMP_OS_NETDEV_GET_PRIV(pDev); - ASSERT(pAd); - - /* To Indicate from Which VIF */ - switch (pDev->ieee80211_ptr->iftype) { - case RT_CMD_80211_IFTYPE_AP: - RTMP_SET_PACKET_OPMODE(pPktSrc, OPMODE_AP); - break; - - case RT_CMD_80211_IFTYPE_P2P_GO:; - - if (!OPSTATUS_TEST_FLAG(pAd, - fOP_AP_STATUS_MEDIA_STATE_CONNECTED)) { - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Drop the Packet due P2P GO not in ready state\n")); - RELEASE_NDIS_PACKET(pAd, pPktSrc, NDIS_STATUS_FAILURE); - return 0; - } - - RTMP_SET_PACKET_OPMODE(pPktSrc, OPMODE_AP); - break; - - case RT_CMD_80211_IFTYPE_P2P_CLIENT: - case RT_CMD_80211_IFTYPE_STATION: - RTMP_SET_PACKET_OPMODE(pPktSrc, OPMODE_AP); - break; - - default: - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Unknown CFG80211 I/F Type(%d)\n", - pDev->ieee80211_ptr->iftype)); - RELEASE_NDIS_PACKET(pAd, pPktSrc, NDIS_STATUS_FAILURE); - return 0; - } - - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("CFG80211 Packet Type [%s](%d)\n", pDev->name, - pDev->ieee80211_ptr->iftype)); - return Func(RTPKT_TO_OSPKT(pPktSrc)); -} - -static INT CFG80211_VirtualIF_PacketSend(struct sk_buff *skb, PNET_DEV dev_p) -{ - struct wifi_dev *wdev; - - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s ---> %d\n", __func__, dev_p->ieee80211_ptr->iftype)); - - if (!(RTMP_OS_NETDEV_STATE_RUNNING(dev_p))) { - /* the interface is down */ - RELEASE_NDIS_PACKET(NULL, skb, NDIS_STATUS_FAILURE); - return 0; - } - - /* The device not ready to send packt. */ - wdev = RTMP_OS_NETDEV_GET_WDEV(dev_p); - ASSERT(wdev); - - if (!wdev) - return -1; - - os_zero_mem((PUCHAR)&skb->cb[CB_OFF], 26); - MEM_DBG_PKT_ALLOC_INC(skb); - return CFG80211_PacketSend(skb, dev_p, rt28xx_packet_xmit); -} - -static INT CFG80211_VirtualIF_Ioctl(IN PNET_DEV dev_p, IN OUT VOID *rq_p, - IN INT cmd) -{ - RTMP_ADAPTER *pAd; - - pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); - ASSERT(pAd); - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) - return -ENETDOWN; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s --->\n", __func__)); - return rt28xx_ioctl(dev_p, rq_p, cmd); -} - -static struct wifi_dev_ops gc_wdev_ops = { - .tx_pkt_allowed = sta_tx_pkt_allowed, - .fp_tx_pkt_allowed = sta_tx_pkt_allowed, - .send_data_pkt = sta_send_data_pkt, - .send_fp_data_pkt = sta_fp_send_data_pkt, - .send_mlme_pkt = sta_send_mlme_pkt, - .tx_pkt_handle = sta_tx_pkt_handle, - .legacy_tx = sta_legacy_tx, - .ampdu_tx = sta_ampdu_tx, - .frag_tx = sta_frag_tx, - .amsdu_tx = sta_amsdu_tx, - .mlme_mgmtq_tx = sta_mlme_mgmtq_tx, - .mlme_dataq_tx = sta_mlme_dataq_tx, - .ieee_802_11_data_tx = sta_ieee_802_11_data_tx, - .ieee_802_3_data_tx = sta_ieee_802_3_data_tx, - .fill_non_offload_tx_blk = sta_fill_non_offload_tx_blk, - .fill_offload_tx_blk = sta_fill_offload_tx_blk, - .rx_pkt_allowed = sta_rx_pkt_allow, - .rx_pkt_foward = sta_rx_fwd_hnd, - .ieee_802_3_data_rx = ap_ieee_802_3_data_rx, - .ieee_802_11_data_rx = ap_ieee_802_11_data_rx, - .find_cipher_algorithm = sta_find_cipher_algorithm, - .mac_entry_lookup = mac_entry_lookup, -}; - -VOID RTMP_CFG80211_VirtualIF_Init(IN VOID *pAdSrc, IN CHAR *pDevName, - IN UINT32 DevType) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - RTMP_OS_NETDEV_OP_HOOK netDevHook, *pNetDevOps; - PNET_DEV new_dev_p; - APCLI_STRUCT *pApCliEntry; - struct wifi_dev *wdev; - struct wifi_dev *wdev_main = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - UINT apidx = MAIN_MBSSID; - UINT32 Inf = INT_MBSSID; -#ifdef MT_MAC - INT32 Value; - UCHAR MacByte = 0; -#endif /* MT_MAC */ - UCHAR tr_tb_idx = wdev_main->tr_tb_idx; - CHAR preIfName[12]; - UINT devNameLen = strlen(pDevName); - UINT preIfIndex = pDevName[devNameLen - 1] - 48; - CFG80211_CB *p80211CB = pAd->pCfg80211_CB; - struct wireless_dev *pWdev; - UINT32 MC_RowID = 0, IoctlIF = 0, Inf = INT_P2P; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - memset(preIfName, 0, sizeof(preIfName)); - NdisCopyMemory(preIfName, pDevName, devNameLen - 1); - pNetDevOps = &netDevHook; - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s ---> (%s, %s, %d)\n", __func__, pDevName, preIfName, - preIfIndex)); - /* init operation functions and flags */ - os_zero_mem(&netDevHook, sizeof(netDevHook)); - netDevHook.open = CFG80211_VirtualIF_Open; /* device opem hook point */ - netDevHook.stop = - CFG80211_VirtualIF_Close; /* device close hook point */ - netDevHook.xmit = - CFG80211_VirtualIF_PacketSend; /* hard transmit hook point */ - netDevHook.ioctl = CFG80211_VirtualIF_Ioctl; /* ioctl hook point */ -#if WIRELESS_EXT >= 12 - /* netDevHook.iw_handler = (void *)&rt28xx_ap_iw_handler_def; */ -#endif /* WIRELESS_EXT >= 12 */ - new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, Inf, preIfIndex, - sizeof(PRTMP_ADAPTER), preIfName, TRUE); - - if (new_dev_p == NULL) { - /* allocation fail, exit */ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Allocate network device fail (CFG80211)...\n")); - return; - } - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Register CFG80211 I/F (%s)\n", - RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); - - new_dev_p->destructor = free_netdev; - RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); - pNetDevOps->needProtcted = TRUE; - os_move_mem(&pNetDevOps->devAddr[0], &pAd->CurrentAddress[0], - MAC_ADDR_LEN); -#ifdef MT_MAC - /* TODO: shall we make choosing which byte to be selectable??? */ - Value = 0x00000000L; - RTMP_IO_READ32( - pAd, LPON_BTEIR, - &Value); /* read BTEIR bit[31:29] for determine to choose which byte to extend BSSID mac address. */ - Value = Value | - (0x2 - << 29); /* Note: Carter, make default will use byte4 bit[31:28] to extend Mac Address */ - RTMP_IO_WRITE32(pAd, LPON_BTEIR, Value); - MacByte = Value >> 29; - pNetDevOps->devAddr[0] |= 0x2; - - switch (MacByte) { - case 0x1: /* choose bit[23:20]*/ - pNetDevOps->devAddr[2] = - (pNetDevOps->devAddr[2] = - pNetDevOps->devAddr[2] & 0x0f); - break; - - case 0x2: /* choose bit[31:28]*/ - pNetDevOps->devAddr[3] = - (pNetDevOps->devAddr[3] = - pNetDevOps->devAddr[3] & 0x0f); - break; - - case 0x3: /* choose bit[39:36]*/ - pNetDevOps->devAddr[4] = - (pNetDevOps->devAddr[4] = - pNetDevOps->devAddr[4] & 0x0f); - break; - - case 0x4: /* choose bit [47:44]*/ - pNetDevOps->devAddr[5] = - (pNetDevOps->devAddr[5] = - pNetDevOps->devAddr[5] & 0x0f); - break; - - default: /* choose bit[15:12]*/ - pNetDevOps->devAddr[1] = - (pNetDevOps->devAddr[1] = - pNetDevOps->devAddr[1] & 0x0f); - break; - } - -#else - - /* CFG_TODO */ - /* - * Bit1 of MAC address Byte0 is local administration bit - * and should be set to 1 in extended multiple BSSIDs' - * Bit3~ of MAC address Byte0 is extended multiple BSSID index. - */ - if (cap->MBSSIDMode == MBSSID_MODE1) - pNetDevOps->devAddr[0] += 2; /* NEW BSSID */ - else { -#ifdef P2P_ODD_MAC_ADJUST - - if (pNetDevOps->devAddr[5] & 0x01 == 0x01) - pNetDevOps->devAddr[5] -= 1; - else -#endif /* P2P_ODD_MAC_ADJUST */ - pNetDevOps->devAddr[5] += FIRST_MBSSID; - } - -#endif /* MT_MAC */ - - switch (DevType) { - case RT_CMD_80211_IFTYPE_P2P_GO: - /* Only ForceGO init from here, */ - /* Nego as GO init on AddBeacon Ops.*/ - pNetDevOps->priv_flags = INT_P2P; - /* The Behivaor in SetBeacon Ops */ - pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - wdev_init(pAd, wdev, WDEV_TYPE_GO, new_dev_p, apidx, - (VOID *)&pAd->ApCfg.MBSSID[apidx], (void *)pAd); - wdev_ops_register(wdev, WDEV_TYPE_GO, &ap_wdev_ops, - cap->wmm_detect_method); - wdev_attr_update(pAd, wdev); - wdev->bss_info_argument.OwnMacIdx = wdev->OmacIdx; - /* BC/MC Handling */ - TRTableInsertMcastEntry(pAd, tr_tb_idx, wdev); - /* for concurrent purpose */ - wdev->hw_bssid_idx = CFG_GO_BSSID_IDX; - bcn_buf_init(pAd, &pAd->ApCfg.MBSSID[apidx].wdev); - RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); - RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); - - if (wdev_idx_reg(pAd, wdev) < 0) { - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Assign wdev idx for %s failed, free net device!\n", - __func__, - RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); - RtmpOSNetDevFree(new_dev_p); - break; - } - - COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.if_addr, - pNetDevOps->devAddr); - COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.bssid, - pNetDevOps->devAddr); - WDEV_BSS_STATE(wdev) = BSS_ACTIVE; - wdev->bss_info_argument.u4BssInfoFeature = - (BSS_INFO_OWN_MAC_FEATURE | BSS_INFO_BASIC_FEATURE | - BSS_INFO_RF_CH_FEATURE | BSS_INFO_SYNC_MODE_FEATURE); - AsicBssInfoUpdate(pAd, wdev->bss_info_argument); - break; - - case RT_CMD_80211_IFTYPE_AP: - pNetDevOps->priv_flags = INT_MBSSID; - - pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; - apidx = preIfIndex; - wdev = &pAd->ApCfg.MBSSID[apidx].wdev; - - /* follow main wdev settings */ - wdev->channel = wdev_main->channel; - wdev->CentralChannel = wdev_main->CentralChannel; - wdev->PhyMode = wdev_main->PhyMode; - wdev->bw = wdev_main->bw; - wdev->extcha = wdev_main->extcha; - /* ================= */ - - wdev_init(pAd, wdev, WDEV_TYPE_AP, new_dev_p, apidx, - (VOID *)&pAd->ApCfg.MBSSID[apidx], (void *)pAd); - wdev_attr_update(pAd, wdev); - wdev->bss_info_argument.OwnMacIdx = wdev->OmacIdx; - - bcn_buf_init(pAd, &pAd->ApCfg.MBSSID[apidx].wdev); - - RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); - RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); - if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Assign wdev idx for %s failed, free net device!\n", - __func__, - RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); - RtmpOSNetDevFree(new_dev_p); - break; - } - - COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.if_addr, - pNetDevOps->devAddr); - COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.bssid, - pNetDevOps->devAddr); - - wifi_sys_linkup(wdev, NULL); - break; - - default: - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Unknown CFG80211 I/F Type (%d)\n", DevType)); - } - - /* CFG_TODO : should be move to VIF_CHG */ - if ((DevType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || - (DevType == RT_CMD_80211_IFTYPE_P2P_GO)) - COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, - pNetDevOps->devAddr); - - os_alloc_mem_suspend(NULL, (UCHAR **)&pWdev, sizeof(*pWdev)); - os_zero_mem((PUCHAR)pWdev, sizeof(*pWdev)); - new_dev_p->ieee80211_ptr = pWdev; - pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; - SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); - pWdev->netdev = new_dev_p; - pWdev->iftype = DevType; -#if (KERNEL_VERSION(3, 7, 0) <= LINUX_VERSION_CODE) - COPY_MAC_ADDR(pWdev->address, pNetDevOps->devAddr); -#endif /* LINUX_VERSION_CODE: 3.7.0 */ - RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); - /* Record the pNetDevice to Cfg80211VifDevList */ - RTMP_CFG80211_AddVifEntry(pAd, new_dev_p, DevType); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s <---\n", __func__)); -} - -VOID RTMP_CFG80211_VirtualIF_Remove(IN VOID *pAdSrc, IN PNET_DEV dev_p, - IN UINT32 DevType) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - BOOLEAN isGoOn = FALSE; - struct wifi_dev *wdev; - UINT apidx = MAIN_MBSSID; - - if (dev_p) { - pAd->cfg80211_ctrl.Cfg80211VifDevSet.isGoingOn = FALSE; - RTMP_CFG80211_RemoveVifEntry(pAd, dev_p); - RTMP_OS_NETDEV_STOP_QUEUE(dev_p); - if (pAd->flg_apcli_init) { - wdev = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev; -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - /* actually not mcc still need to check this! */ - - if (pAd->Mlme.bStartMcc == TRUE) { - struct _RTMP_CHIP_CAP *cap = - hc_get_chip_cap(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("GC remove stop mcc\n")); - cap->tssi_enable = TRUE; /* let host do tssi */ - Stop_MCC(pAd, 0); - pAd->Mlme.bStartMcc = FALSE; - } else - /* if (pAd->Mlme.bStartScc == TRUE) */ - { - struct wifi_dev *p2p_dev = &pAd->StaCfg[0].wdev; - UCHAR ht_bw = wlan_config_get_ht_bw(p2p_dev); - UCHAR cen_ch; - - wlan_operate_set_ht_bw(p2p_dev, ht_bw); - cen_ch = wlan_operate_get_cen_ch_1(p2p_dev); - - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("GC remove & switch to Infra BW = %d CentralChannel %d\n", - ht_bw, cen_ch)); - } - - wdev->channel = 0; - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - OPSTATUS_CLEAR_FLAG( - pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - cfg80211_disconnected(dev_p, 0, NULL, 0, GFP_KERNEL); - os_zero_mem( - pAd->ApCfg.ApCliTab[MAIN_MBSSID].CfgApCliBssid, - MAC_ADDR_LEN); - RtmpOSNetDevDetach(dev_p); - wdev_deinit(pAd, wdev); - pAd->flg_apcli_init = FALSE; - wdev->if_dev = NULL; - } else /* Never Opened When New Netdevice on */ - RtmpOSNetDevDetach(dev_p); - - os_free_mem(dev_p->ieee80211_ptr); - dev_p->ieee80211_ptr = NULL; - } -} - -VOID RTMP_CFG80211_AllVirtualIF_Remove(IN VOID *pAdSrc) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - PLIST_HEADER pCacheList = - &pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList; - PCFG80211_VIF_DEV pDevEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - pListEntry = pCacheList->pHead; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - - while ((pDevEntry != NULL) && (pCacheList->size != 0)) { - RtmpOSNetDevProtect(1); - RTMP_CFG80211_VirtualIF_Remove( - pAd, pDevEntry->net_dev, - pDevEntry->net_dev->ieee80211_ptr->iftype); - RtmpOSNetDevProtect(0); - pListEntry = pListEntry->pNext; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - } -} -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ - -#ifdef CFG80211_MULTI_STA -BOOLEAN RTMP_CFG80211_MULTI_STA_ON(VOID *pAdSrc, PNET_DEV pNewNetDev) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - PLIST_HEADER pCacheList = - &pAd->cfg80211_ctrl.Cfg80211VifDevSet.vifDevList; - PCFG80211_VIF_DEV pDevEntry = NULL; - RT_LIST_ENTRY *pListEntry = NULL; - - if (!pNewNetDev) - return FALSE; - - pListEntry = pCacheList->pHead; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - - while (pDevEntry != NULL) { - if (RTMPEqualMemory(pDevEntry->net_dev->dev_addr, - pNewNetDev->dev_addr, MAC_ADDR_LEN) && - (pNewNetDev->ieee80211_ptr->iftype == - RT_CMD_80211_IFTYPE_STATION)) - return TRUE; - - pListEntry = pListEntry->pNext; - pDevEntry = (PCFG80211_VIF_DEV)pListEntry; - } - - return FALSE; -} - -VOID RTMP_CFG80211_MutliStaIf_Init(VOID *pAdSrc) -{ - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s()\n", __func__)); -#define INF_CFG80211_MULTI_STA_NAME "muti-sta0" - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - CMD_RTPRIV_IOCTL_80211_VIF_SET vifInfo; - PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; - - vifInfo.vifType = RT_CMD_80211_IFTYPE_STATION; - vifInfo.vifNameLen = strlen(INF_CFG80211_MULTI_STA_NAME); - os_zero_mem(vifInfo.vifName, sizeof(vifInfo.vifName)); - NdisCopyMemory(vifInfo.vifName, INF_CFG80211_MULTI_STA_NAME, - vifInfo.vifNameLen); - - if (RTMP_DRIVER_80211_VIF_ADD(pAd, &vifInfo) != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" %s() VIF Add error.\n", __func__)); - return; - } - - cfg80211_ctrl->multi_sta_net_dev = RTMP_CFG80211_FindVifEntry_ByType( - pAd, RT_CMD_80211_IFTYPE_STATION); - cfg80211_ctrl->flg_cfg_multi_sta_init = TRUE; -} - -VOID RTMP_CFG80211_MutliStaIf_Remove(VOID *pAdSrc) -{ - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s()\n", __func__)); - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; - - if (cfg80211_ctrl->multi_sta_net_dev) { - RtmpOSNetDevProtect(1); - RTMP_DRIVER_80211_VIF_DEL(pAd, cfg80211_ctrl->multi_sta_net_dev, - RT_CMD_80211_IFTYPE_STATION); - RtmpOSNetDevProtect(0); - cfg80211_ctrl->flg_cfg_multi_sta_init = FALSE; - } -} -#endif /* CFG80211_MULTI_STA */ -#endif /* RT_CFG80211_SUPPORT */ -#endif /* LINUX_VERSION_CODE: 2.6.28 */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_p2p.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_p2p.c deleted file mode 100644 index 8e1e9bc1ca..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_p2p.c +++ /dev/null @@ -1,24 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - * - * Abstract: - * - * All related CFG80211 P2P function body. - * - * History: - * - ***************************************************************************/ -#define RTMP_MODULE_OS diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_rx.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_rx.c deleted file mode 100644 index 381efe8793..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_rx.c +++ /dev/null @@ -1,1105 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#define RTMP_MODULE_OS - -#ifdef RT_CFG80211_SUPPORT - -#include "rt_config.h" - -VOID CFG80211_Announce802_3Packet(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - UCHAR FromWhichBSSID) -{ - struct wifi_dev *wdev = wdev_search_by_idx(pAd, FromWhichBSSID); - - if (wdev == NULL) - return; - -#ifdef CONFIG_AP_SUPPORT - - if (RX_BLK_TEST_FLAG(pRxBlk, fRX_STA)) - announce_or_forward_802_3_pkt(pAd, pRxBlk->pRxPacket, wdev, - OPMODE_AP); - else -#endif /* CONFIG_AP_SUPPORT */ - { - announce_or_forward_802_3_pkt(pAd, pRxBlk->pRxPacket, wdev, - OPMODE_STA); - } -} - -BOOLEAN CFG80211_CheckActionFrameType(IN RTMP_ADAPTER *pAd, IN PUCHAR preStr, - IN PUCHAR pData, IN UINT32 length) -{ - BOOLEAN isP2pFrame = FALSE; - struct ieee80211_mgmt *mgmt; - - mgmt = (struct ieee80211_mgmt *)pData; - - if (ieee80211_is_mgmt(mgmt->frame_control)) { - if (ieee80211_is_probe_resp(mgmt->frame_control)) { - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("CFG80211_PKT: %s ProbeRsp Frame %d\n", - preStr, pAd->LatchRfRegs.Channel)); - - if (!mgmt->u.probe_resp.timestamp) { - struct timeval tv; - - do_gettimeofday(&tv); - mgmt->u.probe_resp.timestamp = - ((UINT64)tv.tv_sec * 1000000) + - tv.tv_usec; - } - } -#ifdef HOSTAPD_11R_SUPPORT - else if (ieee80211_is_auth(mgmt->frame_control)) - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211_PKT: %s AUTH Frame\n", preStr)); - else if (ieee80211_is_reassoc_req(mgmt->frame_control)) - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211_PKT: %s REASSOC Req Frame\n", - preStr)); - else if (ieee80211_is_reassoc_resp(mgmt->frame_control)) - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211_PKT: %s REASSOC Resp Frame\n", - preStr)); -#endif /* HOSTAPD_11R_SUPPORT */ -#ifdef HOSTAPD_OWE_SUPPORT - else if (ieee80211_is_assoc_resp(mgmt->frame_control)) - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211_PKT: %s ASSOC Resp Frame\n", - preStr)); -#endif - else if (ieee80211_is_disassoc(mgmt->frame_control)) - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211_PKT: %s DISASSOC Frame\n", preStr)); - else if (ieee80211_is_deauth(mgmt->frame_control)) - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211_PKT: %s Deauth Frame on %d\n", - preStr, pAd->LatchRfRegs.Channel)); - else if (ieee80211_is_action(mgmt->frame_control)) { - PP2P_PUBLIC_FRAME pFrame = (PP2P_PUBLIC_FRAME)pData; -#ifdef HOSTAPD_11K_SUPPORT - - if (mgmt->u.action.category == CATEGORY_RM) { - isP2pFrame = - TRUE; /* CFG80211_HandleP2pMgmtFrame is being used for sending all pkts to upper layer, so isP2pFrame variable is being used */ - } -#endif - if ((pFrame->p80211Header.FC.SubType == - SUBTYPE_ACTION) && - (pFrame->Category == CATEGORY_PUBLIC) && - (pFrame->Action == ACTION_WIFI_DIRECT)) { - isP2pFrame = TRUE; - - switch (pFrame->Subtype) { - case GO_NEGOCIATION_REQ: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s GO_NEGOCIACTION_REQ %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - - case GO_NEGOCIATION_RSP: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s GO_NEGOCIACTION_RSP %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - - case GO_NEGOCIATION_CONFIRM: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s GO_NEGOCIACTION_CONFIRM %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - - case P2P_PROVISION_REQ: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s P2P_PROVISION_REQ %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - - case P2P_PROVISION_RSP: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s P2P_PROVISION_RSP %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - - case P2P_INVITE_REQ: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s P2P_INVITE_REQ %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - - case P2P_INVITE_RSP: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s P2P_INVITE_RSP %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - - case P2P_DEV_DIS_REQ: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s P2P_DEV_DIS_REQ %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - - case P2P_DEV_DIS_RSP: - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG80211_PKT: %s P2P_DEV_DIS_RSP %d\n", - preStr, - pAd->LatchRfRegs.Channel)); - break; - } - } else if ((pFrame->p80211Header.FC.SubType == - SUBTYPE_ACTION) && - (pFrame->Category == CATEGORY_PUBLIC) && - ((pFrame->Action == ACTION_GAS_INITIAL_REQ) || - (pFrame->Action == ACTION_GAS_INITIAL_RSP) || - (pFrame->Action == - ACTION_GAS_COMEBACK_REQ) || - (pFrame->Action == ACTION_GAS_COMEBACK_RSP))) - isP2pFrame = TRUE; - - else - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("CFG80211_PKT: %s ACTION Frame with Channel%d\n", - preStr, pAd->LatchRfRegs.Channel)); - } else - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211_PKT: %s UNKOWN MGMT FRAME TYPE\n", - preStr)); - } else - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG80211_PKT: %s UNKOWN FRAME TYPE\n", preStr)); - - return isP2pFrame; -} - -#ifdef CFG_TDLS_SUPPORT -BOOLEAN CFG80211_HandleTdlsDiscoverRespFrame(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - UCHAR OpMode) -{ -#ifdef MT_MAC -#else - RXWI_STRUC *pRxWI = pRxBlk->pRxWI; - PNET_DEV pNetDev = NULL; -#endif /* MT_MAC */ - PHEADER_802_11 pHeader = pRxBlk->pHeader; - UINT32 freq; - /* PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; */ - PP2P_PUBLIC_FRAME pFrame = (PP2P_PUBLIC_FRAME)pHeader; - UINT32 MPDUtotalByteCnt = 0; -#ifdef MT_MAC - MPDUtotalByteCnt = pRxBlk->MPDUtotalByteCnt; -#else - MPDUtotalByteCnt = pRxWI->RXWI_N.MPDUtotalByteCnt; -#endif /* MT_MAC */ - - if ((pFrame->p80211Header.FC.SubType == SUBTYPE_ACTION) && - (pFrame->Category == CATEGORY_PUBLIC) && - (pFrame->Action == ACTION_TDLS_DISCOVERY_RSP)) { - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s : GOT ACTION_TDLS_DISCOVERY_RSP ACTION: 0x%x\n", - __func__, pFrame->Action)); - MAP_CHANNEL_ID_TO_KHZ(pAd->LatchRfRegs.Channel, freq); - freq /= 1000; - CFG80211OS_RxMgmt(pAd->net_dev, freq, (PUCHAR)pHeader, - MPDUtotalByteCnt); - return TRUE; - } - - /* report TDLS DiscoverRespFrame to supplicant , but it does nothing , events.c line 2432 */ - return FALSE; -} -#endif /* CFG_TDLS_SUPPORT */ - -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_SAE_SUPPORT) -VOID CFG80211_AuthReqHandler(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - AUTH_FRAME_INFO *auth_info) -{ - PFRAME_802_11 Fr = (PFRAME_802_11)pRxBlk->FC; - ULONG MsgLen = pRxBlk->DataSize; -#ifdef BAND_STEERING - struct wifi_dev *wdev = NULL; - HEADER_802_11 AuthReqHdr; -#endif /* BAND_STEERING */ - - if (auth_info->auth_alg == AUTH_MODE_FT) { - PEID_STRUCT eid_ptr; - UCHAR *Ptr; - UCHAR WPA2_OUI[3] = { 0x00, 0x0F, 0xAC }; - PFT_INFO pFtInfo = &auth_info->FtInfo; - - NdisZeroMemory(pFtInfo, sizeof(FT_INFO)); - - Ptr = &Fr->Octet[6]; - eid_ptr = (PEID_STRUCT)Ptr; - - /* get variable fields from payload and advance the pointer */ - while (((UCHAR *)eid_ptr + eid_ptr->Len + 1) < - ((UCHAR *)Fr + MsgLen)) { - switch (eid_ptr->Eid) { - case IE_FT_MDIE: - FT_FillMdIeInfo(eid_ptr, &pFtInfo->MdIeInfo); - break; - - case IE_FT_FTIE: - FT_FillFtIeInfo(eid_ptr, &pFtInfo->FtIeInfo); - break; - - case IE_FT_RIC_DATA: - /* record the pointer of first RDIE. */ - if (pFtInfo->RicInfo.pRicInfo == NULL) { - pFtInfo->RicInfo.pRicInfo = - &eid_ptr->Eid; - pFtInfo->RicInfo.Len = - ((UCHAR *)Fr + MsgLen) - - (UCHAR *)eid_ptr + 1; - } - - if ((pFtInfo->RicInfo.RicIEsLen + eid_ptr->Len + - 2) < MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfo->RicInfo.RicIEs - [pFtInfo->RicInfo - .RicIEsLen], - &eid_ptr->Eid, - eid_ptr->Len + 2); - pFtInfo->RicInfo.RicIEsLen += - eid_ptr->Len + 2; - } - break; - - case IE_FT_RIC_DESCRIPTOR: - if ((pFtInfo->RicInfo.RicIEsLen + eid_ptr->Len + - 2) < MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfo->RicInfo.RicIEs - [pFtInfo->RicInfo - .RicIEsLen], - &eid_ptr->Eid, - eid_ptr->Len + 2); - pFtInfo->RicInfo.RicIEsLen += - eid_ptr->Len + 2; - } - break; - - case IE_RSN: - if (NdisEqualMemory(&eid_ptr->Octet[2], - WPA2_OUI, - sizeof(WPA2_OUI))) { - NdisMoveMemory(pFtInfo->RSN_IE, eid_ptr, - eid_ptr->Len + 2); - pFtInfo->RSNIE_Len = eid_ptr->Len + 2; - } - break; - - default: - break; - } - eid_ptr = (PEID_STRUCT)((UCHAR *)eid_ptr + 2 + - eid_ptr->Len); - } - } - -#ifdef BAND_STEERING - NdisZeroMemory(&AuthReqHdr, sizeof(HEADER_802_11)); - NdisCopyMemory((UCHAR *)&(AuthReqHdr.FC), pRxBlk->FC, - sizeof(FRAME_CONTROL)); - wdev = wdev_search_by_address(pAd, AuthReqHdr.Addr1); - - if (pAd->ApCfg.BandSteering) { - BOOLEAN bBndStrgCheck = TRUE; - ULONG MsgType = APMT2_PEER_AUTH_REQ; - struct raw_rssi_info rssi_info; - - NdisMoveMemory((rssi_info.raw_rssi), pRxBlk->rx_signal.raw_rssi, - sizeof(rssi_info.raw_rssi)); - bBndStrgCheck = BndStrg_CheckConnectionReq( - pAd, wdev, auth_info->addr2, &rssi_info, MsgType, NULL); - - if (bBndStrgCheck == FALSE) { - APPeerAuthSimpleRspGenAndSend(pAd, &AuthReqHdr, - auth_info->auth_alg, - auth_info->auth_seq + 1, - MLME_UNSPECIFY_FAIL); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - check failed.\n")); - return; - } - } -#endif /* BAND_STEERING */ -} - -VOID CFG80211_AssocReqHandler(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - struct wifi_dev *wdev = NULL; - struct dev_rate_info *rate; - BSS_STRUCT *pMbss; - IE_LISTS *ie_list = NULL; - HEADER_802_11 AssocReqHdr; - USHORT StatusCode = MLME_SUCCESS; - UCHAR MaxSupportedRate = 0; - UCHAR PhyMode, FlgIs11bSta; - UCHAR i; -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) -/* UCHAR ucETxBfCap; */ -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ - MAC_TABLE_ENTRY *pEntry = NULL; - STA_TR_ENTRY *tr_entry; -#ifdef DBG - UCHAR isReassoc = 0; -#endif /* DBG */ - BOOLEAN bACLReject = FALSE; -#ifdef WSC_AP_SUPPORT - WSC_CTRL *wsc_ctrl; -#endif /* WSC_AP_SUPPORT */ -#ifdef RT_BIG_ENDIAN - UINT32 tmp_1; - UINT64 tmp_2; -#endif /*RT_BIG_ENDIAN*/ - ADD_HT_INFO_IE *addht; -#ifdef GREENAP_SUPPORT -/* struct greenap_ctrl *greenap = &pAd->ApCfg.greenap; */ -#endif /* GREENAP_SUPPORT */ -#ifdef MBO_SUPPORT - BOOLEAN bMboReject = FALSE; -#endif /* MBO_SUPPORT */ -#ifdef WAPP_SUPPORT - /* UINT8 wapp_cnnct_stage = WAPP_ASSOC; */ - UINT16 wapp_assoc_fail = NOT_FAILURE; -#endif /* WAPP_SUPPORT */ - - NdisZeroMemory(&AssocReqHdr, sizeof(HEADER_802_11)); - NdisCopyMemory((UCHAR *)&(AssocReqHdr.FC), pRxBlk->FC, - sizeof(FRAME_CONTROL)); - - /* its reassoc frame */ - if (AssocReqHdr.FC.SubType == SUBTYPE_REASSOC_REQ) - isReassoc = 1; - - /* disallow new association */ - if (pAd->ApCfg.BANClass3Data == TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Disallow new Association\n")); -#ifdef WAPP_SUPPORT - wapp_assoc_fail = DISALLOW_NEW_ASSOCI; -#endif /* WAPP_SUPPORT */ - /* goto assoc_check; */ - return; - } - - /* allocate memory */ - os_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(IE_LISTS)); - - if (ie_list == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): mem alloc failed\n", __func__)); -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_NO_RESOURCE; -#endif /* WAPP_SUPPORT */ - /* goto assoc_check; */ - return; - } - - NdisZeroMemory(ie_list, sizeof(IE_LISTS)); - - /* fill ie_list */ - if (!PeerAssocReqCmmSanity(pAd, isReassoc, (VOID *)pRxBlk->FC, - pRxBlk->DataSize, ie_list)) - goto LabelOK; - - pEntry = MacTableLookup(pAd, ie_list->Addr2); - - if (!pEntry) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("NoAuth MAC - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(ie_list->Addr2))); - goto LabelOK; - } - - /* attach ie_list to pEntry */ - pEntry->ie_list = ie_list; - - if (!VALID_MBSS(pAd, pEntry->func_tb_idx)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():pEntry bounding invalid wdev(apidx=%d)\n", - __func__, pEntry->func_tb_idx)); - goto LabelOK; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():pEntry->func_tb_idx=%d\n", __func__, - pEntry->func_tb_idx)); - wdev = wdev_search_by_address(pAd, ie_list->Addr1); - - if (wdev == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Wrong Addr1 - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(ie_list->Addr1))); - goto LabelOK; - } - - /* WPS_BandSteering Support */ -#if defined(BAND_STEERING) && defined(WSC_INCLUDED) - if (pAd->ApCfg.BandSteering) { - PWSC_CTRL pWscControl = NULL; - PBND_STRG_CLI_ENTRY cli_entry = NULL; - PBND_STRG_CLI_TABLE table = NULL; - PWPS_WHITELIST_ENTRY wps_entry = NULL; - PBS_LIST_ENTRY bs_whitelist_entry = NULL; - - pWscControl = &pAd->ApCfg.MBSSID[wdev->func_idx].WscControl; - table = Get_BndStrgTable(pAd, wdev->func_idx); - if (table && table->bEnabled) { - cli_entry = BndStrg_TableLookup(table, pEntry->Addr); - wps_entry = FindWpsWhiteListEntry(&table->WpsWhiteList, - pEntry->Addr); - - /* WPS: special WIN7 case: no wps/rsn ie in assoc */ - /* and send eapol start, consider it as wps station */ - if ((ie_list->RSNIE_Len == 0) && - (IS_AKM_WPA_CAPABILITY_Entry(wdev)) && - (pWscControl->WscConfMode != WSC_DISABLE)) - ie_list->bWscCapable = TRUE; - - /* in case probe did not have wps ie, but assoc has, create wps whitelist entry here */ - if (!wps_entry && ie_list->bWscCapable && - pWscControl->bWscTrigger) { - NdisAcquireSpinLock(&table->WpsWhiteListLock); - AddWpsWhiteList(&table->WpsWhiteList, - pEntry->Addr); - NdisReleaseSpinLock(&table->WpsWhiteListLock); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("channel %u: WPS Assoc req: STA %02x:%02x:%02x:%02x:%02x:%02x wps whitelisted\n", - table->Channel, - PRINT_MAC(pEntry->Addr))); - BND_STRG_PRINTQAMSG( - table, pEntry->Addr, - ("ASSOC STA %02x:%02x:%02x:%02x:%02x:%02x channel %u added in WPS Whitelist\n", - PRINT_MAC(pEntry->Addr), - table->Channel)); - } - - bs_whitelist_entry = FindBsListEntry(&table->WhiteList, - pEntry->Addr); - - /* handle case: where a client has wps ie in probe, not have bndstrg entry/bndstrg whitelist, */ - /* but doing normal assoc: dont allow */ - if ((pWscControl->bWscTrigger) && (!cli_entry) && - (!ie_list->bWscCapable) && (!bs_whitelist_entry)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("\n%s():reject assoc:bWscTrigger:%d, cli_entry:%p,bWscCapable:%d, bs_whitelist_entry:%p\n", - __func__, pWscControl->bWscTrigger, - cli_entry, ie_list->bWscCapable, - bs_whitelist_entry)); - BND_STRG_PRINTQAMSG( - table, pEntry->Addr, - ("STA %02x:%02x:%02x:%02x:%02x:%02x Normal Assoc Rejected for BS unauthorized client\n", - PRINT_MAC(pEntry->Addr))); - goto LabelOK; - } - } - } -#endif - pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; - -#ifdef WSC_AP_SUPPORT - wsc_ctrl = &wdev->WscControl; -#endif /* WSC_AP_SUPPORT */ - PhyMode = wdev->PhyMode; - rate = &wdev->rate; - addht = wlan_operate_get_addht(wdev); - - if (!OPSTATUS_TEST_FLAG_WDEV(wdev, - fOP_AP_STATUS_MEDIA_STATE_CONNECTED)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): AP is not ready, disallow new Association\n", - __func__)); - goto LabelOK; - } - - FlgIs11bSta = 1; - - for (i = 0; i < ie_list->SupportedRatesLen; i++) { - if (((ie_list->SupportedRates[i] & 0x7F) != 2) && - ((ie_list->SupportedRates[i] & 0x7F) != 4) && - ((ie_list->SupportedRates[i] & 0x7F) != 11) && - ((ie_list->SupportedRates[i] & 0x7F) != 22)) { - FlgIs11bSta = 0; - break; - } - } -#ifdef CONFIG_MAP_SUPPORT - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():IS_MAP_ENABLE=%d\n", __func__, IS_MAP_ENABLE(pAd))); - if (IS_MAP_ENABLE(pAd)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Elem->MsgLen=%d, ASSOC_REQ_LEN = %d\n", - __func__, pRxBlk->DataSize, (INT)ASSOC_REQ_LEN_MAX)); - NdisMoveMemory(pEntry->assoc_req_frame, (VOID *)pRxBlk->FC, - ASSOC_REQ_LEN_MAX); - } -#endif - -#ifdef MBO_SUPPORT - if (!MBO_AP_ALLOW_ASSOC(wdev)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():MBO not allowed assoc\n", __func__)); - StatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA; - bMboReject = TRUE; -#ifdef WAPP_SUPPORT - wapp_assoc_fail = MLME_UNABLE_HANDLE_STA; -#endif /* WAPP_SUPPORT */ - /* goto SendAssocResponse; */ - return; - } -#endif /* MBO_SUPPORT */ - - /* clear the previous Pairwise key table */ - if ((pEntry->Aid != 0) -#ifdef DOT11R_FT_SUPPORT - && (!IS_FT_STA(pEntry)) -#endif /* DOT11R_FT_SUPPORT */ - && ((!IS_AKM_OPEN(pEntry->SecConfig.AKMMap)) || - (!IS_AKM_SHARED(pEntry->SecConfig.AKMMap)) -#ifdef DOT1X_SUPPORT - || IS_IEEE8021X(&pEntry->SecConfig) -#endif /* DOT1X_SUPPORT */ - )) { - ASIC_SEC_INFO Info = { 0 }; - /* clear GTK state */ - pEntry->SecConfig.Handshake.GTKState = REKEY_NEGOTIATING; - NdisZeroMemory(&pEntry->SecConfig.PTK, LEN_MAX_PTK); - /* Set key material to Asic */ - os_zero_mem(&Info, sizeof(ASIC_SEC_INFO)); - Info.Operation = SEC_ASIC_REMOVE_PAIRWISE_KEY; - Info.Wcid = pEntry->wcid; - /* Set key material to Asic */ - HW_ADDREMOVE_KEYTABLE(pAd, &Info); -#if defined(DOT1X_SUPPORT) && !defined(RADIUS_ACCOUNTING_SUPPORT) - - /* Notify 802.1x daemon to clear this sta info */ - if (IS_AKM_1X(pEntry->SecConfig.AKMMap) || - IS_IEEE8021X(&pEntry->SecConfig)) - DOT1X_InternalCmdAction(pAd, pEntry, - DOT1X_DISCONNECT_ENTRY); - -#endif /* DOT1X_SUPPORT */ - } - -#ifdef WSC_AP_SUPPORT - /* since sta has been left, ap should receive EapolStart and EapRspId again. */ - pEntry->Receive_EapolStart_EapRspId = 0; - pEntry->bWscCapable = ie_list->bWscCapable; -#ifdef WSC_V2_SUPPORT - - if ((wsc_ctrl->WscV2Info.bEnableWpsV2) && - (wsc_ctrl->WscV2Info.bWpsEnable == FALSE)) - ; - else -#endif /* WSC_V2_SUPPORT */ - { - if (pEntry->func_tb_idx < pAd->ApCfg.BssidNum) { - if (MAC_ADDR_EQUAL(pEntry->Addr, wsc_ctrl->EntryAddr)) { - BOOLEAN Cancelled; - - RTMPZeroMemory(wsc_ctrl->EntryAddr, - MAC_ADDR_LEN); - RTMPCancelTimer(&wsc_ctrl->EapolTimer, - &Cancelled); - wsc_ctrl->EapolTimerRunning = FALSE; - } - } - - if ((ie_list->RSNIE_Len == 0) && - (IS_AKM_WPA_CAPABILITY_Entry(wdev)) && - (wsc_ctrl->WscConfMode != WSC_DISABLE)) - pEntry->bWscCapable = TRUE; - } - -#endif /* WSC_AP_SUPPORT */ - - /* for hidden SSID sake, SSID in AssociateRequest should be fully verified */ - if ((ie_list->SsidLen != pMbss->SsidLen) || - (NdisEqualMemory(ie_list->Ssid, pMbss->Ssid, ie_list->SsidLen) == - 0)) - goto LabelOK; -#ifdef WSC_V2_SUPPORT - /* Do not check ACL when WPS V2 is enabled and ACL policy is positive. */ - if ((pEntry->bWscCapable) && (wsc_ctrl->WscConfMode != WSC_DISABLE) && - (wsc_ctrl->WscV2Info.bEnableWpsV2) && - (wsc_ctrl->WscV2Info.bWpsEnable) && - (MAC_ADDR_EQUAL(wsc_ctrl->EntryAddr, ZERO_MAC_ADDR))) - ; - else -#endif /* WSC_V2_SUPPORT */ - /* set a flag for sending Assoc-Fail response to unwanted STA later. */ - if (!ApCheckAccessControlList(pAd, ie_list->Addr2, - pEntry->func_tb_idx)) - bACLReject = TRUE; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("assoc - MBSS(%d), receive reassoc request from %02x:%02x:%02x:%02x:%02x:%02x\n", - pEntry->func_tb_idx, PRINT_MAC(ie_list->Addr2))); - /* supported rates array may not be sorted. sort it and find the maximum rate */ - for (i = 0; i < ie_list->SupportedRatesLen; i++) { - if (MaxSupportedRate < (ie_list->SupportedRates[i] & 0x7f)) - MaxSupportedRate = ie_list->SupportedRates[i] & 0x7f; - } - /* - Assign RateLen here or we will select wrong rate table in - APBuildAssociation() when 11N compile option is disabled. - */ - pEntry->RateLen = ie_list->SupportedRatesLen; - pEntry->MaxSupportedRate = MaxSupportedRate; - RTMPSetSupportMCS(pAd, OPMODE_AP, pEntry, ie_list->SupportedRates, - ie_list->SupportedRatesLen, NULL, 0, -#ifdef DOT11_VHT_AC - ie_list->vht_cap_len, &ie_list->vht_cap, -#endif /* DOT11_VHT_AC */ - &ie_list->HTCapability, ie_list->ht_cap_len); - - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s <<<<<<\n", __func__)); - return; - -LabelOK: -#ifdef RT_CFG80211_SUPPORT - if (StatusCode != MLME_SUCCESS) { - MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s StaDel event\n", __func__)); - CFG80211_ApStaDelSendEvent(pAd, pEntry->Addr, - pEntry->wdev->if_dev); - } -#endif /* RT_CFG80211_SUPPORT */ - if (ie_list != NULL) { - os_free_mem(ie_list); - if (pEntry) - pEntry->ie_list = NULL; - } - - return; -} -#endif /* HOSTAPD_11R_SUPPORT */ - -BOOLEAN CFG80211_HandleP2pMgmtFrame(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, - UCHAR OpMode) -{ -#ifndef MT_MAC - RXWI_STRUC *pRxWI = pRxBlk->pRxWI; -#endif /* !MT_MAC */ - HEADER_802_11 Header; - PHEADER_802_11 pHeader = &Header; - PNET_DEV pNetDev; -#ifdef RT_CFG80211_SUPPORT - struct wifi_dev *pWdev = WdevSearchByBssid(pAd, pRxBlk->Addr1); -#endif - PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; - UINT32 freq; - UINT32 MPDUtotalByteCnt = 0; - - if (pWdev == NULL) { - MTWF_LOG( - DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_LOUD, - ("%s return , can't find wdev for %02x:%02x:%02x:%02x:%02x:%02x\n", - __FUNCTION__, PRINT_MAC(pHeader->Addr2))); - pNetDev = CFG80211_GetEventDevice(pAd); - } else { - pNetDev = pWdev->if_dev; - } - - NdisZeroMemory(&Header, sizeof(HEADER_802_11)); - NdisCopyMemory((UCHAR *)&(pHeader->FC), pRxBlk->FC, - sizeof(FRAME_CONTROL)); - NdisCopyMemory(pHeader->Addr1, pRxBlk->Addr1, MAC_ADDR_LEN); - NdisCopyMemory(pHeader->Addr2, pRxBlk->Addr2, MAC_ADDR_LEN); - NdisCopyMemory(pHeader->Addr3, pRxBlk->Addr3, MAC_ADDR_LEN); - pHeader->Duration = pRxBlk->Duration; -#ifdef MT_MAC - MPDUtotalByteCnt = pRxBlk->MPDUtotalByteCnt; -#else - MPDUtotalByteCnt = pRxWI->RXWI_N.MPDUtotalByteCnt; -#endif /* MT_MAC */ - - if ((pHeader->FC.SubType == SUBTYPE_PROBE_REQ) || -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_SAE_SUPPORT) || \ - defined(HOSTAPD_OWE_SUPPORT) - (pHeader->FC.SubType == SUBTYPE_AUTH) || -#endif -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_OWE_SUPPORT) - (pHeader->FC.SubType == SUBTYPE_REASSOC_REQ) || -#endif -#ifdef HOSTAPD_OWE_SUPPORT - (pHeader->FC.SubType == SUBTYPE_ASSOC_REQ) || -#endif - ((pHeader->FC.SubType == SUBTYPE_ACTION) && - CFG80211_CheckActionFrameType(pAd, "RX", (PUCHAR)pRxBlk->pData, - MPDUtotalByteCnt))) { - MAP_CHANNEL_ID_TO_KHZ(pAd->LatchRfRegs.Channel, freq); - freq /= 1000; - - if (((pHeader->FC.SubType == SUBTYPE_PROBE_REQ) && - (pCfg80211_ctrl->cfg80211MainDev - .Cfg80211RegisterProbeReqFrame == TRUE)) || - ((pHeader->FC.SubType == - SUBTYPE_ACTION) /*&& ( pAd->Cfg80211RegisterActionFrame == TRUE)*/) -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_SAE_SUPPORT) || \ - defined(HOSTAPD_OWE_SUPPORT) - || (pHeader->FC.SubType == SUBTYPE_AUTH) -#endif -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_OWE_SUPPORT) - - || (pHeader->FC.SubType == SUBTYPE_REASSOC_REQ) -#endif -#ifdef HOSTAPD_OWE_SUPPORT - - || (pHeader->FC.SubType == SUBTYPE_ASSOC_REQ) -#endif - - ) { - MTWF_LOG( - DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("MAIN STA RtmpOsCFG80211RxMgmt OK!! TYPE = %d, freq = %d, %02x:%02x:%02x:%02x:%02x:%02x\n", - pHeader->FC.SubType, freq, - PRINT_MAC(pHeader->Addr2))); - if (pHeader->FC.SubType == SUBTYPE_PROBE_REQ) { -#ifdef BAND_STEERING - PEER_PROBE_REQ_PARAM ProbeReqParam = { { 0 } }; - - if (pAd->ApCfg.BandSteering) { - if (PeerProbeReqSanity( - pAd, (VOID *)pRxBlk->pData, - pRxBlk->DataSize, - &ProbeReqParam) == FALSE) { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s():PeerProbeReqSanity failed!\n", - __func__)); - return TRUE; /*drop when SSID sanity check fails in ProbeReq */ - } - } -#endif - - if (IS_BROADCAST_MAC_ADDR(pRxBlk->Addr1)) { - int apidx; - /*deliver broadcast frame to all virtual interface */ - for (apidx = 0; - apidx < pAd->ApCfg.BssidNum; - apidx++) { - BSS_STRUCT *mbss = - &pAd->ApCfg - .MBSSID[apidx]; - struct wifi_dev *wdev = - &mbss->wdev; - if (wdev->if_dev != NULL) { -#ifdef BAND_STEERING - if (pAd->ApCfg - .BandSteering) { - BOOLEAN bBndStrgCheck = - TRUE; - ULONG MsgType = - APMT2_PEER_PROBE_REQ; - struct raw_rssi_info - rssi_info; - - NdisMoveMemory( - (rssi_info - .raw_rssi), - pRxBlk->rx_signal - .raw_rssi, - sizeof(rssi_info - .raw_rssi)); - bBndStrgCheck = BndStrg_CheckConnectionReq( - pAd, - wdev, - ProbeReqParam - .Addr2, - &rssi_info, - MsgType, - &ProbeReqParam); - - if (bBndStrgCheck == - FALSE) - return TRUE; - } - -#endif /* BAND_STEERING */ - - CFG80211OS_RxMgmt( - wdev->if_dev, - freq, - pRxBlk->pData, - MPDUtotalByteCnt); - } - } - } else { -#ifdef BAND_STEERING - if (pAd->ApCfg.BandSteering) { - BOOLEAN bBndStrgCheck = TRUE; - ULONG MsgType = - APMT2_PEER_PROBE_REQ; - struct raw_rssi_info rssi_info; - - NdisMoveMemory( - (rssi_info.raw_rssi), - pRxBlk->rx_signal - .raw_rssi, - sizeof(rssi_info - .raw_rssi)); - bBndStrgCheck = - BndStrg_CheckConnectionReq( - pAd, pWdev, - ProbeReqParam - .Addr2, - &rssi_info, - MsgType, - &ProbeReqParam); - - if (bBndStrgCheck == FALSE) - return TRUE; - } - -#endif /* BAND_STEERING */ - CFG80211OS_RxMgmt(pNetDev, freq, - pRxBlk->pData, - MPDUtotalByteCnt); - } -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_SAE_SUPPORT) || \ - defined(HOSTAPD_OWE_SUPPORT) - } else if (pHeader->FC.SubType == SUBTYPE_AUTH) { - AUTH_FRAME_INFO *auth_info = - &(pCfg80211_ctrl->auth_info); - PFRAME_802_11 Fr = - ((PFRAME_802_11)pRxBlk->pData); - - COPY_MAC_ADDR(auth_info->addr1, - pHeader->Addr1); /* BSSID */ - COPY_MAC_ADDR(auth_info->addr2, - pHeader->Addr2); /* SA */ - /* TODO: shiang-usw, how about the endian issue here?? */ - NdisMoveMemory(&auth_info->auth_alg, - &Fr->Octet[0], 2); - NdisMoveMemory(&auth_info->auth_seq, - &Fr->Octet[2], 2); - NdisMoveMemory(&auth_info->auth_status, - &Fr->Octet[4], 2); - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s:auth req frame: alg:%d, seq:%d, status:%d\n", - __func__, auth_info->auth_alg, - auth_info->auth_seq, - auth_info->auth_status)); - if ((auth_info->auth_alg == AUTH_MODE_FT) || - (auth_info->auth_alg == AUTH_MODE_SAE)) { - /* handle FT Auth or SAE Auth in hostapd */ - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: calling CFG80211OS_RxMgmt: auth req frame\n", - __func__)); - CFG80211_AuthReqHandler(pAd, pRxBlk, - auth_info); - CFG80211OS_RxMgmt(pNetDev, freq, - pRxBlk->pData, - MPDUtotalByteCnt); - } else { - /* handle normal auth in driver */ - if (pWdev && - IS_AKM_OWE(pWdev->SecConfig.AKMMap)) - CFG80211OS_RxMgmt( - pNetDev, freq, - pRxBlk->pData, - MPDUtotalByteCnt); - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: handle open auth req frame in driver\n", - __func__)); - return FALSE; - } -#endif -#ifdef HOSTAPD_OWE_SUPPORT - } else if (pHeader->FC.SubType == SUBTYPE_ASSOC_REQ) { - MAC_TABLE_ENTRY *pEntry = NULL; - - pEntry = MacTableLookup(pAd, pHeader->Addr2); - if (pEntry && pWdev && - IS_AKM_OWE(pWdev->SecConfig.AKMMap)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OWE Assoc for - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pHeader->Addr2))); - - CFG80211_AssocReqHandler(pAd, pRxBlk); - if (pEntry->ie_list && - pEntry->ie_list->ecdh_ie.length) { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ASSOC Req sending to CFG layer for OWE mode \n")); - CFG80211OS_RxMgmt( - pNetDev, freq, - pRxBlk->pData, - MPDUtotalByteCnt); - } else { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ASSOC Req OWE ie not found. Handle in Driver \n")); - if (pEntry->ie_list != NULL) { - os_free_mem( - pEntry->ie_list); - pEntry->ie_list = NULL; - } - return FALSE; - } - } else { - return FALSE; - } -#endif -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_OWE_SUPPORT) - } else if (pHeader->FC.SubType == SUBTYPE_REASSOC_REQ) { - MAC_TABLE_ENTRY *pEntry = NULL; - - pEntry = MacTableLookup(pAd, pHeader->Addr2); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Reassoc for - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pHeader->Addr2))); - if (pEntry && pWdev && - (IS_AKM_OWE(pWdev->SecConfig.AKMMap) || - IS_AKM_FT_WPA2PSK( - pWdev->SecConfig.AKMMap) || - IS_AKM_FT_WPA2(pWdev->SecConfig.AKMMap))) { - CFG80211_AssocReqHandler(pAd, pRxBlk); -#ifdef HOSTAPD_11R_SUPPORT - if (pEntry->ie_list && - pEntry->ie_list->FtInfo.MdIeInfo - .Len) { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: calling CFG80211OS_RxMgmt:FT reassoc req frame\n", - __func__)); - CFG80211OS_RxMgmt( - pNetDev, freq, - pRxBlk->pData, - MPDUtotalByteCnt); - } else -#endif -#ifdef HOSTAPD_OWE_SUPPORT - if (pEntry->ie_list && - pEntry->ie_list->ecdh_ie - .length) { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("OWE Reassoc Req Handle in CFG Layer \n")); - CFG80211OS_RxMgmt( - pNetDev, freq, - pRxBlk->pData, - MPDUtotalByteCnt); - } else -#endif - { - MTWF_LOG( - DBG_CAT_AP, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s:no FT or OWE ie\n", - __func__)); - if (pEntry->ie_list != NULL) { - os_free_mem( - pEntry->ie_list); - pEntry->ie_list = NULL; - } - return FALSE; - } - } else { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s: No OWE or FT entry\n", - __func__)); - return FALSE; - } -#endif - } else { - CFG80211OS_RxMgmt(pNetDev, freq, pRxBlk->pData, - MPDUtotalByteCnt); - } - if (OpMode == OPMODE_AP) { - return TRUE; - } - } - } - - return FALSE; -} - -#endif /* RT_CFG80211_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_scan.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_scan.c deleted file mode 100644 index 352595ab32..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_scan.c +++ /dev/null @@ -1,482 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - * - * Abstract: - * - * All related CFG80211 Scan function body. - * - * History: - * - ***************************************************************************/ -#define RTMP_MODULE_OS - -#ifdef RT_CFG80211_SUPPORT - -#include "rt_config.h" - -VOID CFG80211DRV_OpsScanInLinkDownAction(VOID *pAdOrg) -{ -} - -BOOLEAN CFG80211DRV_OpsScanRunning(VOID *pAdOrg) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - - return pAd->cfg80211_ctrl.FlgCfg80211Scanning; -} - -/* Refine on 2013/04/30 for two functin into one */ -INT CFG80211DRV_OpsScanGetNextChannel(VOID *pAdOrg) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; - - if (cfg80211_ctrl->pCfg80211ChanList != NULL) { - if (cfg80211_ctrl->Cfg80211CurChanIndex < - cfg80211_ctrl->Cfg80211ChanListLen) - return cfg80211_ctrl->pCfg80211ChanList - [cfg80211_ctrl->Cfg80211CurChanIndex++]; - - os_free_mem(cfg80211_ctrl->pCfg80211ChanList); - cfg80211_ctrl->pCfg80211ChanList = NULL; - cfg80211_ctrl->Cfg80211ChanListLen = 0; - cfg80211_ctrl->Cfg80211CurChanIndex = 0; - return 0; - } - - return 0; -} - -BOOLEAN CFG80211DRV_OpsScanSetSpecifyChannel(VOID *pAdOrg, VOID *pData, - UINT8 dataLen) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; - UINT32 *pChanList = (UINT32 *)pData; - - if (pChanList != NULL) { - if (cfg80211_ctrl->pCfg80211ChanList != NULL) - os_free_mem(cfg80211_ctrl->pCfg80211ChanList); - - os_alloc_mem(NULL, (UCHAR **)&cfg80211_ctrl->pCfg80211ChanList, - sizeof(UINT32 *) * dataLen); - - if (cfg80211_ctrl->pCfg80211ChanList != NULL) { - NdisCopyMemory(cfg80211_ctrl->pCfg80211ChanList, - pChanList, sizeof(UINT32 *) * dataLen); - cfg80211_ctrl->Cfg80211ChanListLen = dataLen; - cfg80211_ctrl->Cfg80211CurChanIndex = - 0; /* Start from index 0 */ - return NDIS_STATUS_SUCCESS; - } else - return NDIS_STATUS_FAILURE; - } - - return NDIS_STATUS_FAILURE; -} - -BOOLEAN CFG80211DRV_OpsScanCheckStatus(VOID *pAdOrg, UINT8 IfType) -{ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - /* do scan */ - pAd->cfg80211_ctrl.FlgCfg80211Scanning = TRUE; -#endif /*defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT)*/ - return TRUE; -} - -#ifdef APCLI_CFG80211_SUPPORT -void CFG80211DRV_ApcliSiteSurvey(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - RT_CMD_STA_IOCTL_SCAN *pScan = (RT_CMD_STA_IOCTL_SCAN *)pData; - NDIS_802_11_SSID Ssid; - UCHAR ScanType = SCAN_ACTIVE; - - if (pScan->ScanType != 0) - ScanType = pScan->ScanType; - else - ScanType = SCAN_ACTIVE; - - Ssid.SsidLength = pScan->SsidLen; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CFG80211DRV_ApcliSiteSurvey:: req.essid_len-%d, essid-%s\n", - pScan->SsidLen, pScan->pSsid)); - NdisZeroMemory(&Ssid.Ssid, NDIS_802_11_LENGTH_SSID); - if (pScan->SsidLen) - NdisMoveMemory(Ssid.Ssid, pScan->pSsid, Ssid.SsidLength); - ApCliSiteSurvey(pAd, &Ssid, ScanType, /*ChannelSel*/ 0, - /**wdev*/ &pAd->ApCfg.ApCliTab[0].wdev); -} -#endif /* APCLI_CFG80211_SUPPORT */ - -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT -void CFG80211DRV_Set_NOA(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - /* iversonmcc */ - UINT32 Lowpart, Highpart, NextTbtt, temp; - - if (pAd->Mlme.bStartMcc == TRUE) { - /* scan , send null fram to infra , and switch to GO */ - Stop_MCC(pAd, 1); - } - - /* - * pNdev->name = wlan0 - * [ 2434.071449] 80211> CFG80211_OpsScan ==> wlan0(2) - * 10ms start scan - * one channel 85 ms ~ 7 channel - * 600ms - * 600 + wait 120 =720 - * - * 898.328054] mt76x2_switch_channel(): Switch to Ch#9(2T2R), BBP_BW=0, bbp_ch_idx=0) - * interval = 400+120 ms - * Count =4; - * - * pNdev->name = p2p0 - * 10ms start scan - * - * 85ms & 3 - * 260ms - * count =2 - */ - if (RTMP_CFG80211_VIF_P2P_GO_ON(pAd)) { - if (rtstrcasecmp(pData, "p2p0") == TRUE) { - AsicGetTsfTime(pAd, &Highpart, &Lowpart); - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!!Current Tsf LSB = = %ld\n", Lowpart)); - RTMP_IO_READ32(pAd, LPON_T1STR, &temp); - temp = temp & 0x0000FFFF; - NextTbtt = temp % pAd->CommonCfg.BeaconPeriod; - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!!NextTbtt = %ld\n", NextTbtt)); - temp = NextTbtt * 1024 + Lowpart; - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!!Tsf LSB + TimeTillTbtt= %ld\n", temp)); - pAd->cfg80211_ctrl.GONoASchedule.StartTime = - Lowpart + NextTbtt * 1024 + 409600 + 3200; - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" pAd->GONoASchedule.StartTime = %ld\n", - pAd->cfg80211_ctrl.GONoASchedule.StartTime)); - pAd->cfg80211_ctrl.GONoASchedule.Count = 9; - pAd->cfg80211_ctrl.GONoASchedule.Duration = 260000; - pAd->cfg80211_ctrl.GONoASchedule.Interval = 384800; - } - - if (rtstrcasecmp(pData, "wlan0") == TRUE) { - AsicGetTsfTime(pAd, &Highpart, &Lowpart); - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!!Current Tsf LSB = = %ld\n", Lowpart)); - RTMP_IO_READ32(pAd, LPON_T1STR, &temp); - temp = temp & 0x0000FFFF; - NextTbtt = temp % pAd->CommonCfg.BeaconPeriod; - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!!NextTbtt = %ld\n", NextTbtt)); - temp = NextTbtt * 1024 + Lowpart; - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("!!!!Tsf LSB + TimeTillTbtt= %ld\n", temp)); - pAd->cfg80211_ctrl.GONoASchedule.StartTime = - Lowpart + NextTbtt * 1024 + 512000 + 3200; - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (" pAd->GONoASchedule.StartTime = %ld\n", - pAd->cfg80211_ctrl.GONoASchedule.StartTime)); - pAd->cfg80211_ctrl.GONoASchedule.Count = - (4 + (11 * 5) + - 2); /*wait 4 beacon + (interval * 4)*/ - pAd->cfg80211_ctrl.GONoASchedule.Duration = - 737280; /*720*1024*/ - pAd->cfg80211_ctrl.GONoASchedule.Interval = - 737280 + (400 * 1024); - } - } - - return TRUE; -} -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - -BOOLEAN CFG80211DRV_OpsScanExtraIesSet(VOID *pAdOrg) -{ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CFG80211_CB *pCfg80211_CB = pAd->pCfg80211_CB; - UINT ie_len = 0; - PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; - - if (pCfg80211_CB->pCfg80211_ScanReq) - ie_len = pCfg80211_CB->pCfg80211_ScanReq->ie_len; - - CFG80211DBG(DBG_LVL_INFO, - ("80211> CFG80211DRV_OpsExtraIesSet ==> %d\n", ie_len)); - if (ie_len == 0) - return FALSE; - - /* Reset the ExtraIe and Len */ - if (cfg80211_ctrl->pExtraIe) { - os_free_mem(cfg80211_ctrl->pExtraIe); - cfg80211_ctrl->pExtraIe = NULL; - } - - cfg80211_ctrl->ExtraIeLen = 0; - os_alloc_mem(pAd, (UCHAR **)&(cfg80211_ctrl->pExtraIe), ie_len); - - if (cfg80211_ctrl->pExtraIe) { - NdisCopyMemory(cfg80211_ctrl->pExtraIe, - pCfg80211_CB->pCfg80211_ScanReq->ie, ie_len); - cfg80211_ctrl->ExtraIeLen = ie_len; - hex_dump("CFG8021_SCAN_EXTRAIE", cfg80211_ctrl->pExtraIe, - cfg80211_ctrl->ExtraIeLen); - } else { - CFG80211DBG( - DBG_LVL_ERROR, - ("80211> CFG80211DRV_OpsExtraIesSet ==> allocate fail.\n")); - return FALSE; - } - -#endif /* defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) */ - return TRUE; -} - -#ifdef CFG80211_SCAN_SIGNAL_AVG -static void CFG80211_CalBssAvgRssi(IN BSS_ENTRY *pBssEntry) -{ - BOOLEAN bInitial = FALSE; - - if (!(pBssEntry->AvgRssiX8 | pBssEntry->AvgRssi)) - bInitial = TRUE; - - if (bInitial) { - pBssEntry->AvgRssiX8 = pBssEntry->Rssi << 3; - pBssEntry->AvgRssi = pBssEntry->Rssi; - } else { - /* For smooth purpose, oldRssi for 7/8, newRssi for 1/8 */ - pBssEntry->AvgRssiX8 = - (pBssEntry->AvgRssiX8 - pBssEntry->AvgRssi) + - pBssEntry->Rssi; - } - - pBssEntry->AvgRssi = pBssEntry->AvgRssiX8 >> 3; -} - -static void CFG80211_UpdateBssTableRssi(IN VOID *pAdCB) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pAd->pCfg80211_CB; - struct wiphy *pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - struct ieee80211_channel *chan; - struct cfg80211_bss *bss; - BSS_ENTRY *pBssEntry; - UINT index; - UINT32 CenFreq; - - for (index = 0; index < pAd->ScanTab.BssNr; index++) { - pBssEntry = &pAd->ScanTab.BssEntry[index]; -#if (KERNEL_VERSION(2, 6, 39) <= LINUX_VERSION_CODE) - - if (pAd->ScanTab.BssEntry[index].Channel > 14) - CenFreq = ieee80211_channel_to_frequency( - pAd->ScanTab.BssEntry[index].Channel, - IEEE80211_BAND_5GHZ); - else - CenFreq = ieee80211_channel_to_frequency( - pAd->ScanTab.BssEntry[index].Channel, - IEEE80211_BAND_2GHZ); - -#else - CenFreq = ieee80211_channel_to_frequency( - pAd->ScanTab.BssEntry[index].Channel); -#endif - chan = ieee80211_get_channel(pWiphy, CenFreq); - bss = cfg80211_get_bss(pWiphy, chan, pBssEntry->Bssid, - pBssEntry->Ssid, pBssEntry->SsidLen, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - IEEE80211_BSS_TYPE_ESS, - IEEE80211_PRIVACY_ANY); -#else - WLAN_CAPABILITY_ESS, - WLAN_CAPABILITY_ESS); -#endif - - if (bss == NULL) { - /* ScanTable Entry not exist in kernel buffer */ - } else { - /* HIT */ - CFG80211_CalBssAvgRssi(pBssEntry); - bss->signal = pBssEntry->AvgRssi * 100; /* UNIT: MdBm */ - CFG80211OS_PutBss(pWiphy, bss); - } - } -} -#endif /* CFG80211_SCAN_SIGNAL_AVG */ - -/* - * ======================================================================== - * Routine Description: - * Inform us that a scan is got. - * - * Arguments: - * pAdCB - WLAN control block pointer - * - * Return Value: - * NONE - * - * Note: - * Call RT_CFG80211_SCANNING_INFORM, not CFG80211_Scaning - * ======================================================================== - */ -VOID CFG80211_Scaning(IN VOID *pAdCB, IN UINT32 BssIdx, IN UINT32 ChanId, - IN UCHAR *pFrame, IN UINT32 FrameLen, IN INT32 RSSI) -{ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - VOID *pCfg80211_CB = pAd->pCfg80211_CB; - BOOLEAN FlgIsNMode; - UINT8 BW; -#ifdef APCLI_CFG80211_SUPPORT - struct wifi_dev *wdev = &pAd->ApCfg.ApCliTab[0].wdev; -#else - struct wifi_dev *wdev = get_default_wdev(pAd); -#endif - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_REGISTER_TO_OS)) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("80211> Network is down!\n")); - return; - } - - if (!pCfg80211_CB) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> pCfg80211_CB is invalid!\n")); - return; - } - - /* - * In connect function, we also need to report BSS information to cfg80211; - * Not only scan function. - */ - if ((!CFG80211DRV_OpsScanRunning(pAd)) && - (pAd->cfg80211_ctrl.FlgCfg80211Connecting == FALSE)) { - return; /* no scan is running from wpa_supplicant */ - } - - /* init */ - /* Note: Can not use local variable to do pChan */ - if (WMODE_CAP_N(wdev->PhyMode)) - FlgIsNMode = TRUE; - else - FlgIsNMode = FALSE; - - if (cfg_ht_bw == BW_20) - BW = 0; - else - BW = 1; - - CFG80211OS_Scaning(pCfg80211_CB, ChanId, pFrame, FrameLen, RSSI, - FlgIsNMode, BW); -#endif /* defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) */ -} - -/* - * ======================================================================== - * Routine Description: - * Inform us that scan ends. - * - * Arguments: - * pAdCB - WLAN control block pointer - * FlgIsAborted - 1: scan is aborted - * - * Return Value: - * NONE - * ======================================================================== - */ -VOID CFG80211_ScanEnd(IN VOID *pAdCB, IN BOOLEAN FlgIsAborted) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[CFG_GO_BSSID_IDX]; - PAPCLI_STRUCT pApCliEntry = pApCliEntry = - &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; - struct wifi_dev *wdev = &pMbss->wdev; - - if (RTMP_CFG80211_VIF_P2P_CLI_ON(pAd)) - wdev = &(pApCliEntry->wdev); - -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_REGISTER_TO_OS)) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("80211> Network is down!\n")); - return; - } - - if (!CFG80211DRV_OpsScanRunning(pAd)) { - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("80211> No scan is running!\n")); - return; /* no scan is running */ - } - - if (FlgIsAborted == TRUE) - FlgIsAborted = 1; - else { - FlgIsAborted = 0; -#ifdef CFG80211_SCAN_SIGNAL_AVG - CFG80211_UpdateBssTableRssi(pAd); -#endif /* CFG80211_SCAN_SIGNAL_AVG */ - } - - CFG80211OS_ScanEnd(CFG80211CB, FlgIsAborted); -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - { - UCHAR op_ht_bw = wlan_operate_get_ht_bw(wdev); - UCHAR op_ht_bw2 = wlan_operate_get_ht_bw(&pAd->StaCfg[0].wdev); - - if ((op_ht_bw2 == op_ht_bw) && - (pAd->StaCfg[0].wdev.channel == wdev->channel)) - MTWF_LOG(DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Scc case , not star mcc when scan end\n")); - else if (wdev->channel == 0) - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("CLI still connect , not star mcc when scan end\n")); - else if (INFRA_ON(pAd) && - (RTMP_CFG80211_VIF_P2P_GO_ON(pAd) || - (RTMP_CFG80211_VIF_P2P_CLI_ON(pAd) && - (pApCliEntry->Valid == TRUE))) && - (((op_ht_bw2 == op_ht_bw) && - (pAd->StaCfg[0].wdev.channel != wdev->channel)) || - !((op_ht_bw2 == op_ht_bw) && - ((pAd->StaCfg[0].wdev.channel == wdev->channel)))) - /*&& (pAd->MCC_GOConnect_Protect == FALSE)*/ - ) - Start_MCC(pAd); - } -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - pAd->cfg80211_ctrl.FlgCfg80211Scanning = FALSE; -} - -VOID CFG80211_ScanStatusLockInit(IN VOID *pAdCB, IN UINT init) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pAd->pCfg80211_CB; - - if (init) - NdisAllocateSpinLock(pAd, &pCfg80211_CB->scan_notify_lock); - else - NdisFreeSpinLock(&pCfg80211_CB->scan_notify_lock); -} - -#endif /* RT_CFG80211_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_tdls.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_tdls.c deleted file mode 100644 index a0803fe580..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_tdls.c +++ /dev/null @@ -1,2802 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - * - * Abstract: - * - * All related CFG80211 TDLS function body. - * - * History: - * - ***************************************************************************/ - -#define RTMP_MODULE_OS - -#ifdef RT_CFG80211_SUPPORT - -#include "rt_config.h" - -#ifdef CFG_TDLS_SUPPORT -#define TDLS_AKM_SUITE_PSK 7 -UCHAR CipherSuiteTDLSWpa2PskAes[] = { - 0x30, /* RSN IE */ - 0x14, /* Length */ - 0x01, 0x00, /* Version */ - 0x00, 0x0F, 0xAC, 0x07, /* no group cipher */ - 0x01, 0x00, /* number of pairwise */ - 0x00, 0x0f, 0xAC, 0x04, /* unicast, AES */ - 0x01, 0x00, /* number of authentication method */ - 0x00, 0x0f, 0xAC, TDLS_AKM_SUITE_PSK, /* TDLS authentication */ - 0x00, 0x02, /* RSN capability, peer key enabled */ -}; -UCHAR CipherSuiteTDLSLen = sizeof(CipherSuiteTDLSWpa2PskAes) / sizeof(UCHAR); - -typedef struct { - UCHAR regclass; /* regulatory class */ - UCHAR spacing; /* 0: 20Mhz, 1: 40Mhz */ - UCHAR channelset[16]; /* max 15 channels, use 0 as terminator */ -} CFG_REG_CLASS; - -CFG_REG_CLASS cfg_reg_class[] = { - { 1, 0, { 36, 40, 44, 48, 0 } }, - { 2, 0, { 52, 56, 60, 64, 0 } }, - { 3, 0, { 149, 153, 157, 161, 0 } }, - { 4, 0, { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 0 } }, - { 5, 0, { 165, 0 } }, - { 12, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0 } }, - { 22, 1, { 36, 44, 0 } }, - { 23, 1, { 52, 60, 0 } }, - { 24, 1, { 100, 108, 116, 124, 132, 0 } }, - { 25, 1, { 149, 157, 0 } }, - { 26, 1, { 149, 157, 0 } }, - { 27, 1, { 40, 48, 0 } }, - { 28, 1, { 56, 64, 0 } }, - { 29, 1, { 104, 112, 120, 128, 136, 0 } }, - { 30, 1, { 153, 161, 0 } }, - { 31, 1, { 153, 161, 0 } }, - { 32, 1, { 1, 2, 3, 4, 5, 6, 7, 0 } }, - { 33, 1, { 5, 6, 7, 8, 9, 10, 11, 0 } }, - { 0, 0, { 0 } } /* end */ -}; - -UCHAR cfg_tdls_GetRegulatoryClass(IN PRTMP_ADAPTER pAd, IN UCHAR ChannelWidth, - IN UCHAR TargetChannel) -{ - int i = 0; - UCHAR regclass = 0; - - do { - if (cfg_reg_class[i].spacing == ChannelWidth) { - int j = 0; - - do { - if (cfg_reg_class[i].channelset[j] == - TargetChannel) { - regclass = cfg_reg_class[i].regclass; - break; - } - - j++; - } while (cfg_reg_class[i].channelset[j] != 0); - } - - i++; - } while (cfg_reg_class[i].regclass != 0); - - /* ASSERT(regclass); */ - return regclass; -} - -VOID InitPeerEntryRateCapability(IN PRTMP_ADAPTER pAd, - IN MAC_TABLE_ENTRY *pEntry, - IN USHORT *pCapabilityInfo, - IN UCHAR SupportRateLens, - IN UCHAR *pSupportRates, - IN UCHAR HtCapabilityLen, - IN HT_CAPABILITY_IE *pHtCapability) -{ - UCHAR MaxSupportedRate = RATE_11; - UCHAR MaxSupportedRateIn500Kbps = 0; - UCHAR idx; - struct wifi_dev *wdev = &pAd->StaCfg[0].wdev; - ADD_HT_INFO_IE *addht = wlan_operate_get_addht(wdev); - UCHAR cfg_ht_bw = wlan_config_get_ht_bw(wdev); - - for (idx = 0; idx < SupportRateLens; idx++) { - if (MaxSupportedRateIn500Kbps < (pSupportRates[idx] & 0x7f)) - MaxSupportedRateIn500Kbps = pSupportRates[idx] & 0x7f; - } - - switch (MaxSupportedRateIn500Kbps) { - case 108: - MaxSupportedRate = RATE_54; - break; - - case 96: - MaxSupportedRate = RATE_48; - break; - - case 72: - MaxSupportedRate = RATE_36; - break; - - case 48: - MaxSupportedRate = RATE_24; - break; - - case 36: - MaxSupportedRate = RATE_18; - break; - - case 24: - MaxSupportedRate = RATE_12; - break; - - case 18: - MaxSupportedRate = RATE_9; - break; - - case 12: - MaxSupportedRate = RATE_6; - break; - - case 22: - MaxSupportedRate = RATE_11; - break; - - case 11: - MaxSupportedRate = RATE_5_5; - break; - - case 4: - MaxSupportedRate = RATE_2; - break; - - case 2: - MaxSupportedRate = RATE_1; - break; - - default: - MaxSupportedRate = RATE_11; - break; - } - - pEntry->MaxSupportedRate = - min(pAd->CommonCfg.MaxDesiredRate, MaxSupportedRate); - - if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) { - pEntry->MaxHTPhyMode.field.MODE = MODE_CCK; - pEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate; - pEntry->MinHTPhyMode.field.MODE = MODE_CCK; - pEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate; - pEntry->HTPhyMode.field.MODE = MODE_CCK; - pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate; - } else { - pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM; - pEntry->MaxHTPhyMode.field.MCS = - OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; - pEntry->MinHTPhyMode.field.MODE = MODE_OFDM; - pEntry->MinHTPhyMode.field.MCS = - OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; - pEntry->HTPhyMode.field.MODE = MODE_OFDM; - pEntry->HTPhyMode.field.MCS = - OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; - } - - pEntry->MaxHTPhyMode.field.BW = BW_20; - pEntry->MinHTPhyMode.field.BW = BW_20; -#ifdef DOT11_N_SUPPORT - pEntry->HTCapability.MCSSet[0] = 0; - pEntry->HTCapability.MCSSet[1] = 0; - pEntry->HTCapability.MCSSet[2] = 0; - pEntry->HTCapability.MCSSet[3] = 0; - - /* If this Entry supports 802.11n, upgrade to HT rate. */ - if ((HtCapabilityLen != 0) && (wdev->PhyMode >= PHY_11ABGN_MIXED)) { - UCHAR j, bitmask; /*k,bitmask; */ - CHAR ii; - - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_TRACE, - ("TDLS - Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pEntry->Addr))); - - if ((pHtCapability->HtCapInfo.GF) && - wlan_config_get_greenfield(wdev) && - (pAd->StaActive.SupportedHtPhy.GF)) - pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD; - else { - pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; - pAd->MacTab.fAnyStationNonGF = TRUE; - addht->AddHtInfo2.NonGfPresent = 1; - } - - if ((pHtCapability->HtCapInfo.ChannelWidth) && cfg_ht_bw) { - pEntry->MaxHTPhyMode.field.BW = BW_40; - pEntry->MaxHTPhyMode.field.ShortGI = - (wlan_config_get_ht_gi(wdev) & - (pHtCapability->HtCapInfo.ShortGIfor40)); - } else { - pEntry->MaxHTPhyMode.field.BW = BW_20; - pEntry->MaxHTPhyMode.field.ShortGI = - (wlan_config_get_ht_gi(wdev) & - (pHtCapability->HtCapInfo.ShortGIfor20)); - pAd->MacTab.fAnyStation20Only = TRUE; - } - - /* find max fixed rate */ - for (ii = 31; ii >= 0; ii--) { /* 3*3 */ - j = ii / 8; - bitmask = (1 << (ii - (j * 8))); - - if ((pAd->StaCfg[0].wdev.DesiredHtPhyInfo.MCSSet[j] & - bitmask) && - (pHtCapability->MCSSet[j] & bitmask)) { - pEntry->MaxHTPhyMode.field.MCS = ii; - break; - } - - if (ii == 0) - break; - } - - if (pAd->StaCfg[0].wdev.DesiredTransmitSetting.field.MCS != - MCS_AUTO) { - if (pAd->StaCfg[0] - .wdev.DesiredTransmitSetting.field.MCS == - 32) { - /* Fix MCS as HT Duplicated Mode */ - pEntry->MaxHTPhyMode.field.BW = 1; - pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; - pEntry->MaxHTPhyMode.field.STBC = 0; - pEntry->MaxHTPhyMode.field.ShortGI = 0; - pEntry->MaxHTPhyMode.field.MCS = 32; - } else if (pEntry->MaxHTPhyMode.field.MCS > - pAd->StaCfg[0].wdev.HTPhyMode.field.MCS) { - /* STA supports fixed MCS */ - pEntry->MaxHTPhyMode.field.MCS = - pAd->StaCfg[0].wdev.HTPhyMode.field.MCS; - } - } - - pEntry->MaxHTPhyMode.field.STBC = - (pHtCapability->HtCapInfo.RxSTBC & - wlan_config_get_ht_stbc(wdev)); - pEntry->MpduDensity = pHtCapability->HtCapParm.MpduDensity; - pEntry->MaxRAmpduFactor = - pHtCapability->HtCapParm.MaxRAmpduFactor; - pEntry->MmpsMode = (UCHAR)pHtCapability->HtCapInfo.MimoPs; - pEntry->AMsduSize = (UCHAR)pHtCapability->HtCapInfo.AMsduSize; - pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; - - if (wlan_config_get_ht_gi(wdev) == GI_400) { - if (pHtCapability->HtCapInfo.ShortGIfor20) - CLIENT_STATUS_SET_FLAG( - pEntry, fCLIENT_STATUS_SGI20_CAPABLE); - - if (pHtCapability->HtCapInfo.ShortGIfor40) - CLIENT_STATUS_SET_FLAG( - pEntry, fCLIENT_STATUS_SGI40_CAPABLE); - } - - if (pHtCapability->HtCapInfo.TxSTBC) - CLIENT_STATUS_SET_FLAG(pEntry, - fCLIENT_STATUS_TxSTBC_CAPABLE); - - if (pHtCapability->HtCapInfo.RxSTBC) - CLIENT_STATUS_SET_FLAG(pEntry, - fCLIENT_STATUS_RxSTBC_CAPABLE); - - if (pHtCapability->ExtHtCapInfo.PlusHTC) - CLIENT_STATUS_SET_FLAG(pEntry, - fCLIENT_STATUS_HTC_CAPABLE); - - if (pAd->CommonCfg.bRdg && - pHtCapability->ExtHtCapInfo.RDGSupport) - CLIENT_STATUS_SET_FLAG(pEntry, - fCLIENT_STATUS_RDG_CAPABLE); - - if (pHtCapability->ExtHtCapInfo.MCSFeedback == 0x03) - CLIENT_STATUS_SET_FLAG( - pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE); - - os_move_mem(&pEntry->HTCapability, pHtCapability, - sizeof(HT_CAPABILITY_IE)); - CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); - } else -#endif /* DOT11_N_SUPPORT */ - { - os_zero_mem(&pEntry->HTCapability, sizeof(HT_CAPABILITY_IE)); - CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("TDLS - Receive Peer Legacy STA\n")); - } - - pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; - - if ((pHtCapability->HtCapInfo.ChannelWidth) && cfg_ht_bw) - pEntry->HTPhyMode.field.BW = BW_40; - else - pEntry->HTPhyMode.field.BW = BW_20; - - pEntry->CurrTxRate = pEntry->MaxSupportedRate; - - if (pAd->StaCfg[0].wdev.bAutoTxRateSwitch == TRUE) { - PUCHAR pTable; - UCHAR TableSize = 0; - - pEntry->bAutoTxRateSwitch = TRUE; - /* TODO: MlmeSelectTxRateTable() is not supported on MT_MAC, please refer to TDLS_InitPeerEntryRateCapability() */ - MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, - &pEntry->CurrTxRateIndex); - pEntry->pTable = pTable; - } else { - pEntry->HTPhyMode.field.MODE = - pAd->StaCfg[0].wdev.HTPhyMode.field.MODE; - pEntry->HTPhyMode.field.MCS = - pAd->StaCfg[0].wdev.HTPhyMode.field.MCS; - pEntry->bAutoTxRateSwitch = FALSE; - RTMPUpdateLegacyTxSetting( - (UCHAR)pAd->StaCfg[0] - .wdev.DesiredTransmitSetting.field.FixedTxMode, - pEntry); - } - - pEntry->RateLen = SupportRateLens; -} - -BOOLEAN CFG80211DRV_StaTdlsSetKeyCopyFlag(VOID *pAdOrg) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("======> %s()\n", __func__)); - pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info.IneedKey = 1; - return TRUE; -} - -BOOLEAN CFG80211DRV_StaTdlsInsertDeletepEntry(VOID *pAdOrg, VOID *pData, - UINT Data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - UCHAR *peer; - PMAC_TABLE_ENTRY pMacEntry = NULL; - UCHAR HtLen; - HT_CAPABILITY_IE HtCapabilityTmp; - struct wifi_dev *wdev = &pAd->StaCfg[0].wdev; - UCHAR op_ht_bw = wlan_operate_get_ht_bw(wdev); - - peer = (UCHAR *)pData; - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("=====> %s() peer: %02x:%02x:%02x:%02x:%02x:%02x ,op: %d\n", - __func__, PRINT_MAC(peer), Data)); - pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info.IneedKey = 0; - - if (Data == tdls_insert_entry) { - int i = 0, tdls_entry_index = 0; - - for (i = 0; i < MAX_NUM_OF_CFG_TDLS_ENTRY; i++) { - if (MAC_ADDR_EQUAL( - peer, - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .MacAddr)) { - tdls_entry_index = i; /* found prebuild entry */ - break; - } - } - - if (i == MAX_NUM_OF_CFG_TDLS_ENTRY) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s() - EXCEED MAX_NUM_OF_CFG_TDLS_ENTRY %d. Abort this setup\n", - __func__, MAX_NUM_OF_CFG_TDLS_ENTRY)); - return FALSE; - } - - /* allocate one MAC entry */ - pMacEntry = MacTableLookup(pAd, peer); - - if (pMacEntry && IS_ENTRY_TDLS(pMacEntry)) - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s() - MacTable Entry exist !!!\n", - __func__)); - else - pMacEntry = MacTableInsertEntry( - pAd, peer, wdev, ENTRY_TDLS, OPMODE_STA, TRUE); - - if (pMacEntry) { - /* pTDLS->MacTabMatchWCID = pMacEntry->Aid; */ - STA_TR_ENTRY *tr_entry; - - tr_entry = &pAd->MacTab.tr_entry[pMacEntry->tr_tb_idx]; - /* update tdls link info */ - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_index] - .EntryValid = TRUE; - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_index] - .MacTabMatchWCID = pMacEntry->wcid; - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TdlsLinkCount++; - pMacEntry->AuthMode = pAd->StaCfg[0].wdev.AuthMode; - pMacEntry->WepStatus = pAd->StaCfg[0].wdev.WepStatus; - tr_entry->PortSecured = WPA_802_1X_PORT_SECURED; - pMacEntry->Sst = SST_ASSOC; -#ifdef UAPSD_SUPPORT - /* update UAPSD */ - UAPSD_AssocParse( - pAd, pMacEntry, - &pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_index] - .QosCapability, - wdev->UapsdInfo.bAPSDCapable); -#endif /* UAPSD_SUPPORT */ - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_TRACE, - ("MacTableInsertTDlsEntry - allocate entry #%d, Total= %d\n", - pMacEntry->Aid, pAd->MacTab.Size)); - - /* Set WMM capability */ - if ((wdev->PhyMode >= PHY_11ABGN_MIXED) || - (pAd->CommonCfg.bWmmCapable)) { - CLIENT_STATUS_SET_FLAG( - pMacEntry, fCLIENT_STATUS_WMM_CAPABLE); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_TRACE, - ("TDLS - WMM Capable\n")); - } else - CLIENT_STATUS_CLEAR_FLAG( - pMacEntry, fCLIENT_STATUS_WMM_CAPABLE); - - /* build HT_CAPABILITY_IE */ - if (WMODE_CAP_N(wdev->PhyMode)) { - HtLen = sizeof(HT_CAPABILITY_IE); -#ifndef RT_BIG_ENDIAN - os_zero_mem(&HtCapabilityTmp, - sizeof(HT_CAPABILITY_IE)); - os_move_mem(&HtCapabilityTmp, - &pAd->CommonCfg.HtCapability, - HtLen); - HtCapabilityTmp.HtCapInfo.ChannelWidth = - op_ht_bw; -#else - os_zero_mem(&HtCapabilityTmp, - sizeof(HT_CAPABILITY_IE)); - os_move_mem(&HtCapabilityTmp, - &pAd->CommonCfg.HtCapability, - HtLen); - HtCapabilityTmp.HtCapInfo.ChannelWidth = - op_ht_bw; - *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16( - *(USHORT *)(&HtCapabilityTmp.HtCapInfo)); - *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = - SWAP16(*( - USHORT *)(&HtCapabilityTmp - .ExtHtCapInfo)); -#endif - } - - InitPeerEntryRateCapability( - pAd, pMacEntry, &pAd->StaActive.CapabilityInfo, - pAd->StaActive.SupRateLen, - pAd->StaActive.SupRate, - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_index] - .HtCapabilityLen, - &pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_index] - .HtCapability); - RTMPSetSupportMCS(pAd, OPMODE_STA, pMacEntry, - pAd->StaActive.SupRate, - pAd->StaActive.SupRateLen, - pAd->StaActive.ExtRate, - pAd->StaActive.ExtRateLen, -#ifdef DOT11_VHT_AC - 0, NULL, -#endif /* DOT11_VHT_AC */ - &HtCapabilityTmp, HtLen); - - /* */ - /* Install Peer Key if RSNA Enabled */ - /* */ - if (IS_SECURITY(&wdev->SecConfig)) { - /* Write to ASIC on-chip table. */ - if (pMacEntry->Aid > 1) { - ASIC_SEC_INFO Info = { 0 }; - - CLEAR_SEC_AKM( - pMacEntry->SecConfig.AKMMap); - CLEAR_PAIRWISE_CIPHER( - &pMacEntry->SecConfig); - CLEAR_GROUP_CIPHER( - &pMacEntry->SecConfig); - SET_AKM_WPA2PSK( - pMacEntry->SecConfig.AKMMap); - SET_CIPHER_CCMP128( - pMacEntry->SecConfig - .PairwiseCipher); - os_move_mem( - pMacEntry->SecConfig.PTK, - &pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info - .TPK[LEN_TK], - LEN_TK); - /* Set key material to Asic */ - os_zero_mem(&Info, - sizeof(ASIC_SEC_INFO)); - Info.Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pMacEntry->Aid; - Info.BssIndex = BSS0; - Info.Cipher = pMacEntry->SecConfig - .PairwiseCipher; - Info.KeyIdx = 0; - os_move_mem(&Info.PeerAddr[0], - pMacEntry->Addr, - MAC_ADDR_LEN); - os_move_mem( - &Info.Key, - &pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info - .TPK[LEN_TK], - LEN_TK); - WPAInstallKey(pAd, &Info, FALSE, TRUE); - pMacEntry->wdev->PortSecured = - WPA_802_1X_PORT_SECURED; - pMacEntry->PrivacyFilter = - Ndis802_11PrivFilterAcceptAll; - } - } - - if (wdev_do_disconn_act(wdev, pMacEntry) != TRUE) - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s() dis connect fail!\n", - __func__)); - - cfg_tdls_prepare_null_frame(pAd, 0, 0, peer); - } else { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s() - MacTableInsertEntry failed\n", - __func__)); - return FALSE; - } - } else if (Data == tdls_delete_entry) { - int i = 0; - - pMacEntry = MacTableLookup(pAd, peer); - - if (pMacEntry && IS_ENTRY_TDLS(pMacEntry)) - MacTableDeleteEntry(pAd, pMacEntry->wcid, peer); - - /* clear tdls link info */ - for (i = 0; i < MAX_NUM_OF_CFG_TDLS_ENTRY; i++) { - if (pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .EntryValid == TRUE && - MAC_ADDR_EQUAL( - peer, - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .MacAddr)) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s() clear TDLS entry %d\n", - __func__, i)); - os_zero_mem( - &(pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info.TDLSEntry[i]), - sizeof(CFG_TDLS_ENTRY)); - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TdlsLinkCount--; -#ifdef UAPSD_SUPPORT - /* re-init timer for this TDLS entry */ - RTMPInitTimer( - pAd, - &(pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info.TDLSEntry[i] - .Timer), - GET_TIMER_FUNCTION( - cfg_tdls_PTITimeoutAction), - &(pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info.TDLSEntry[i]), - FALSE); -#endif /*UAPSD_SUPPORT*/ - break; - } - } - } else - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s() op: %d DO NOTHING\n", __func__, Data)); - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("<====== %s() out\n", __func__)); - return TRUE; -} -#ifdef UAPSD_SUPPORT -BOOLEAN cfg_tdls_UAPSDP_AsicCanSleep(PRTMP_ADAPTER pAd) -{ - UINT32 i; - BOOLEAN FlgAllSpClosed = TRUE; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("======> %s()\n", __func__)); - - for (i = 0; i < MAX_NUM_OF_CFG_TDLS_ENTRY; i++) { - PCFG_TDLS_ENTRY pTDLS = - &pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TDLSEntry[i]; - - if (pTDLS->EntryValid == TRUE) { - UINT32 Wcid = pTDLS->MacTabMatchWCID; - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[Wcid]; - - if (!IS_ENTRY_TDLS(pEntry)) - continue; - - /* - * Two cases we can not sleep: - * 1. One of any SP is not ended. - * 2. A traffic indication is sent and no response is received. - */ - if ((pEntry->bAPSDFlagSPStart != 0) || - (pTDLS->FlgIsWaitingUapsdTraRsp == TRUE)) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_TRACE, - ("tdls uapsd> SP not close or Ind sent (%d %d)!\n", - pEntry->bAPSDFlagSPStart, - pTDLS->FlgIsWaitingUapsdTraRsp)); - hex_dump("pEntry=", pEntry->Addr, 6); - FlgAllSpClosed = FALSE; - break; - } - } - } - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("<====== %s() out\n", __func__)); - return FlgAllSpClosed; -} - -VOID cfg_tdls_UAPSDP_PsmModeChange(IN PRTMP_ADAPTER pAd, IN USHORT PsmOld, - IN USHORT PsmNew) -{ - MAC_TABLE_ENTRY *pMacEntry; - UINT32 IdTdls; - struct wifi_dev *wdev = &pAd->StaCfg[0].wdev; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("======> %s()\n", __func__)); - - if (PsmOld == PsmNew) - return; /* no inform needs */ - - /* sanity check */ - /* WPA 802.1x secured port control */ - if (((wdev->AuthMode == Ndis802_11AuthModeWPA) || - (wdev->AuthMode == Ndis802_11AuthModeWPAPSK) || - (wdev->AuthMode == Ndis802_11AuthModeWPA2) || - (wdev->AuthMode == Ndis802_11AuthModeWPA2PSK)) && - (wdev->PortSecured == WPA_802_1X_PORT_NOT_SECURED)) { - return; /* port not yet secure */ - } - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_TRACE, - ("tdls uapsd> our PSM mode change!\n")); - - /* indicate the peer */ - - for (IdTdls = 0; IdTdls < MAX_NUM_OF_CFG_TDLS_ENTRY; IdTdls++) { - if (pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TDLSEntry[IdTdls] - .EntryValid == TRUE) { - /* get MAC Entry */ - pMacEntry = - &pAd->MacTab.Content[pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info - .TDLSEntry[IdTdls] - .MacTabMatchWCID]; - - if (pMacEntry == NULL) - continue; /* check next one */ - - /* check if the peer is in ACTIVE mode */ - if (pMacEntry->PsMode != PWR_SAVE) { - /* - * pMacEntry->RssiSample.LastRssi0 is used to check if - * we have ever received any packet from the peer. - */ - /* send a null frame to the peer directly */ - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_TRACE, - ("tdls uapsd> send a NULL frame!\n")); - RtmpEnqueueNullFrame(pAd, pMacEntry->Addr, - pAd->CommonCfg.TxRate, - pMacEntry->Aid, - pMacEntry->apidx, TRUE, - FALSE, 0); - continue; - } - - /* - * Send traffic indication frame to the peer when the peer - * is in power-save mode. - */ - cfg_tdls_send_PeerTrafficIndication(pAd, - pMacEntry->Addr); - } - } - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("<====== %s() out\n", __func__)); -} - -VOID cfg_tdls_rcv_PeerTrafficIndication(PRTMP_ADAPTER pAd, UINT8 dialog_token, - UINT8 *peer) -{ - int tdls_entry_wcid = 0; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("======> %s()\n", __func__)); - - /* Not TDLS Capable, ignore it */ - if (!IS_TDLS_SUPPORT(pAd)) - return; - - /* Not BSS mode, ignore it */ - if (!INFRA_ON(pAd)) - return; - - /* sanity check */ - if (pAd->StaCfg[0].PwrMgmt.Psm != PWR_SAVE) - return; /* we are not in power-save mode */ - - tdls_entry_wcid = cfg_tdls_search_wcid(pAd, peer); - - if (tdls_entry_wcid == -1) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s(): can't find valid link ID, tdls link to (%02X:%02X:%02X:%02X:%02X:%02X) doesn't exist.\n", - __func__, PRINT_MAC(peer))); - return; - } - - cfg_tdls_build_frame(pAd, peer, dialog_token, - TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE, 0, NULL, 0, - FALSE, tdls_entry_wcid, 0); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("<====== %s() out\n", __func__)); -} - -VOID cfg_tdls_rcv_PeerTrafficResponse(PRTMP_ADAPTER pAd, UINT8 *peer) -{ - int i = 0; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("======> %s()\n", __func__)); - - /* Not TDLS Capable, ignore it */ - if (!IS_TDLS_SUPPORT(pAd)) - return; - - /* Not BSS mode, ignore it */ - if (!INFRA_ON(pAd)) - return; - - i = cfg_tdls_search_ValidLinkIndex(pAd, peer); - - if (i == -1) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s(): can't find valid link ID, tdls link to (%02X:%02X:%02X:%02X:%02X:%02X) doesn't exist.\n", - __func__, PRINT_MAC(peer))); - return; - } - - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TDLSEntry[i] - .FlgIsWaitingUapsdTraRsp = FALSE; - /* check if we can sleep if we are sleep mode */ - RtmpAsicSleepHandle(pAd); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("<====== %s() out\n", __func__)); -} - -VOID cfg_tdls_send_PeerTrafficIndication(PRTMP_ADAPTER pAd, UINT8 *peer) -{ - int tdls_entry_link_index = 0; - UINT8 dialog_token = 0; - BOOLEAN TimerCancelled; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("======> %s()\n", __func__)); - - if (pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info.TdlsDialogToken == - 0) - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TdlsDialogToken = 1; - - dialog_token = - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TdlsDialogToken++; - - /* Not TDLS Capable, ignore it */ - if (!IS_TDLS_SUPPORT(pAd)) - return; - - /* Not BSS mode, ignore it */ - if (!INFRA_ON(pAd)) - return; - - tdls_entry_link_index = cfg_tdls_search_ValidLinkIndex(pAd, peer); - - if (tdls_entry_link_index == -1) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s(): can't find valid link ID, tdls link to (%02X:%02X:%02X:%02X:%02X:%02X) doesn't exist.\n", - __func__, PRINT_MAC(peer))); - return; - } - - if (pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .FlgIsWaitingUapsdTraRsp == TRUE) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("tdls uapsd> traffic ind of index %d was sent before!\n", - tdls_entry_link_index)); - return; /* has sent it */ - } - - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .FlgIsWaitingUapsdTraRsp = TRUE; - cfg_tdls_build_frame(pAd, peer, dialog_token, - TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION, 0, NULL, - 0, FALSE, tdls_entry_link_index, 0); - /* - * 11.2.1.14.1 Peer U-APSD Behavior at the PU buffer STA - * When no corresponding TDLS Peer Traffic Response frame has been - * received within dot11TDLSResponseTimeout after sending a TDLS Peer - * Traffic Indication frame, the STA shall tear down the direct link. - * - * The default value is 5 seconds. - */ - /* set traffic indication timer */ - RTMPCancelTimer(&pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .Timer, - &TimerCancelled); - RTMPSetTimer(&pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .Timer, - TDLS_TIMEOUT); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("<====== %s() out\n", __func__)); -} -VOID cfg_tdls_TimerInit(PRTMP_ADAPTER pAd) -{ - int i = 0; - - for (i = 0; i < MAX_NUM_OF_CFG_TDLS_ENTRY; i++) { - PCFG_TDLS_ENTRY pCfgTdls = NULL; - - pCfgTdls = - &pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TDLSEntry[i]; - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TDLSEntry[i] - .pAd = pAd; - RTMPInitTimer(pAd, &(pCfgTdls->Timer), - GET_TIMER_FUNCTION(cfg_tdls_PTITimeoutAction), - pCfgTdls, FALSE); - } -} - -VOID cfg_tdls_PTITimeoutAction(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3) -{ - PCFG_TDLS_ENTRY pTDLS = (PCFG_TDLS_ENTRY)FunctionContext; - PRTMP_ADAPTER pAd; - /* - * 11.2.1.14.1 Peer U-APSD Behavior at the PU buffer STA - * When no corresponding TDLS Peer Traffic Response frame has been - * received within dot11TDLSResponseTimeout after sending a TDLS Peer - * Traffic Indication frame, the STA shall tear down the direct link. - */ - pAd = pTDLS->pAd; - - if (pTDLS->FlgIsWaitingUapsdTraRsp == TRUE) { - MAC_TABLE_ENTRY *pMacEntry = NULL; - /* timeout for traffic response frame */ - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("tdls uapsd> traffic rsp timeout!!!\npeerMAC(%02X:%02X:%02X:%02X:%02X:%02X), send link teardown\n", - PRINT_MAC(pTDLS->MacAddr))); - pTDLS->FlgIsWaitingUapsdTraRsp = FALSE; - pMacEntry = MacTableLookup(pAd, pTDLS->MacAddr); - - if (pMacEntry == NULL) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("tdls_cmd> ERROR! No such peer in %s!\n", - __func__)); - return; - } - - RTEnqueueInternalCmd(pAd, CMDTHREAD_TDLS_AUTO_TEARDOWN, - pMacEntry, sizeof(MAC_TABLE_ENTRY)); - return; - } -} - -#endif /* UAPSD_SUPPORT */ - -INT cfg_tdls_search_wcid(PRTMP_ADAPTER pAd, UINT8 *peer) -{ - int i = 0, tdls_entry_wcid; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("======> %s()\n", __func__)); - - for (i = 0; i < MAX_NUM_OF_CFG_TDLS_ENTRY; i++) { - if (MAC_ADDR_EQUAL(pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .MacAddr, - peer) && - pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .EntryValid == TRUE) { - tdls_entry_wcid = - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .MacTabMatchWCID; - break; - } - } - - if (i == MAX_NUM_OF_CFG_TDLS_ENTRY) - tdls_entry_wcid = -1; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("<====== %s() out\n", __func__)); - return tdls_entry_wcid; -} - -INT cfg_tdls_search_ValidLinkIndex(PRTMP_ADAPTER pAd, UINT8 *peer) -{ - int i = 0, tdls_link_index; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("======> %s()\n", __func__)); - - for (i = 0; i < MAX_NUM_OF_CFG_TDLS_ENTRY; i++) { - if (MAC_ADDR_EQUAL(pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .MacAddr, - peer) && - pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .EntryValid == TRUE) { - tdls_link_index = i; - break; - } - } - - if (i == MAX_NUM_OF_CFG_TDLS_ENTRY) - tdls_link_index = -1; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("<====== %s() out\n", __func__)); - return tdls_link_index; -} - -INT cfg_tdls_build_frame(PRTMP_ADAPTER pAd, u8 *peer, u8 dialog_token, - u8 action_code, u16 status_code, const u8 *extra_ies, - size_t extra_ies_len, BOOLEAN send_by_tdls_link, - u8 tdls_entry_link_index, u8 reason_code) -{ - UCHAR TDLS_ETHERTYPE[] = { 0x89, 0x0d }; - HEADER_802_11 Hdr80211; - UCHAR Header802_3[14]; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - ULONG TempLen; - UCHAR RemoteFrameType = PROTO_NAME_TDLS; - NDIS_STATUS NStatus = NDIS_STATUS_SUCCESS; - UINT8 category = CATEGORY_TDLS; - UCHAR TDLS_IE = IE_TDLS_LINK_IDENTIFIER; - UCHAR TDLS_IE_LEN = TDLS_ELM_LEN_LINK_IDENTIFIER; - MAC_TABLE_ENTRY *pMacEntry = NULL; - UCHAR Length = sizeof(EXT_CAP_INFO_ELEMENT); - EXT_CAP_INFO_ELEMENT extCapInfo; - BSS_2040_COEXIST_IE BssCoexistence; - struct wifi_dev *wdev = &pAd->StaCfg[0].wdev; - UCHAR op_ht_bw = wlan_operate_get_ht_bw(wdev); - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("======> %s()\n", __func__)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%s() - TDLSEntry[%d] Initiator = %d\n", __func__, - tdls_entry_link_index, - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .bInitiator)); - /* Allocate buffer for transmitting message */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("ACT - TDLS_SetupRequestAction() allocate memory failed\n")); - return NStatus; - } - - if (action_code != WLAN_PUB_ACTION_TDLS_DISCOVER_RES) - MAKE_802_3_HEADER(Header802_3, peer, pAd->CurrentAddress, - TDLS_ETHERTYPE); - else { /* Discovery response is a MGMT Action frame, others are 890d data frame */ - os_zero_mem(&Hdr80211, sizeof(HEADER_802_11)); - Hdr80211.FC.Type = FC_TYPE_MGMT; - Hdr80211.FC.SubType = SUBTYPE_ACTION; - Hdr80211.FC.FrDs = 0; - Hdr80211.FC.ToDs = 0; - COPY_MAC_ADDR(Hdr80211.Addr1, peer); - COPY_MAC_ADDR(Hdr80211.Addr2, pAd->CurrentAddress); - COPY_MAC_ADDR(Hdr80211.Addr3, pAd->CommonCfg.Bssid); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, - sizeof(HEADER_802_11), &Hdr80211, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - /* enter ACTIVE mode */ - /* TDLS_CHANGE_TO_ACTIVE(pAd); */ - - /* fill action code */ - if (action_code != WLAN_PUB_ACTION_TDLS_DISCOVER_RES) { - u8 tmp_action_code = action_code; - - if (action_code == TDLS_ACTION_CODE_AUTO_TEARDOWN) - tmp_action_code = 3; - - MakeOutgoingFrame(pOutBuffer, &TempLen, 1, &RemoteFrameType, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &category, - 1, &tmp_action_code, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } else { - category = CATEGORY_PUBLIC; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &category, - 1, &action_code, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - if (action_code == WLAN_TDLS_SETUP_RESPONSE || - action_code == WLAN_TDLS_SETUP_CONFIRM) { - /* fill status code */ - status_code = cpu2le16(status_code); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("########## status code : 0x%04x\n", status_code)); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 2, - &status_code, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - if (action_code == WLAN_TDLS_TEARDOWN || - action_code == TDLS_ACTION_CODE_AUTO_TEARDOWN) { - /* fill reason code (unspecified reason 0x001a) */ - UINT16 ReasonCode; - - if (reason_code == 0) - ReasonCode = 0x001a; - else - ReasonCode = reason_code; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 2, - &ReasonCode, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - if (action_code != WLAN_TDLS_TEARDOWN && - action_code != TDLS_ACTION_CODE_AUTO_TEARDOWN) { - /* fill Dialog Token */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &dialog_token, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - if (action_code == WLAN_TDLS_SETUP_REQUEST || - action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES || - action_code == WLAN_TDLS_SETUP_RESPONSE) { - /* USHORT capa = 0x420; */ - /* fill capability */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 2, - &pAd->StaActive.CapabilityInfo, - /* 2, &capa, */ - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - /* fill support rate */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &SupRateIe, 1, &pAd->StaActive.SupRateLen, - pAd->StaActive.SupRateLen, - pAd->StaActive.SupRate, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - - /* fill country */ - /* add country IE, power constraint IE */ - if (pAd->CommonCfg.bCountryFlag) { - ULONG TmpLen, TmpLen2 = 0; - UCHAR TmpFrame[256]; - UCHAR CountryIe = IE_COUNTRY; - - os_zero_mem(TmpFrame, sizeof(TmpFrame)); - /* prepare channel information */ - { - UCHAR regclass; - UCHAR RegluatoryRxtIdent = 221; - UCHAR CoverageClass = 0; - - regclass = cfg_tdls_GetRegulatoryClass( - pAd, op_ht_bw, wdev->channel); - MakeOutgoingFrame(TmpFrame + TmpLen2, &TmpLen, - 1, &RegluatoryRxtIdent, 1, - ®class, 1, &CoverageClass, - END_OF_ARGS); - TmpLen2 += TmpLen; - } - - /* need to do the padding bit check, and concatenate it */ - if ((TmpLen2 % 2) == 0) { - UCHAR TmpLen3 = TmpLen2 + 4; - - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TempLen, 1, &CountryIe, 1, - &TmpLen3, 3, - pAd->CommonCfg.CountryCode, - TmpLen2 + 1, TmpFrame, - END_OF_ARGS); - } else { - UCHAR TmpLen3 = TmpLen2 + 3; - - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TempLen, 1, &CountryIe, 1, - &TmpLen3, 3, - pAd->CommonCfg.CountryCode, - TmpLen2, TmpFrame, - END_OF_ARGS); - } - - FrameLen = FrameLen + TempLen; - } - - /* fill ext rate */ - if (pAd->StaActive.ExtRateLen != 0) { - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &ExtRateIe, 1, - &pAd->StaActive.ExtRateLen, - pAd->StaActive.ExtRateLen, - pAd->StaActive.ExtRate, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - /* fill support channels */ - if (pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TdlsChSwitchSupp) { - UCHAR SupportChIe = IE_SUPP_CHANNELS; - UCHAR ch_set[32], list_len; - - os_zero_mem(ch_set, sizeof(ch_set)); - list_len = 0; - - if (WMODE_CAP_2G(wdev->PhyMode)) { - ch_set[list_len] = 1; /* first channel */ - ch_set[list_len + 1] = 11; /* channel number */ - list_len += 2; - } - - if (WMODE_CAP_5G(wdev->PhyMode)) { - ch_set[list_len] = 36; /* first channel */ - ch_set[list_len + 1] = 8; /* channel number */ - list_len += 2; - ch_set[list_len] = 149; /* first channel */ - ch_set[list_len + 1] = 4; /* channel number */ - list_len += 2; - } - - if (list_len > 0) { - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TempLen, 1, &SupportChIe, 1, - &list_len, list_len, - &ch_set[0], END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - } - - /* fill RSN for discovery response if security is not NONE */ - if (action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES && - pAd->StaCfg[0].wdev.WepStatus != - Ndis802_11EncryptionDisabled) { - UCHAR CipherTmp[64] = { 0 }; - UCHAR CipherTmpLen = 0; - /* RSNIE (7.3.2.25) */ - CipherTmpLen = CipherSuiteTDLSLen; - os_move_mem(CipherTmp, CipherSuiteTDLSWpa2PskAes, - CipherTmpLen); - /* Insert RSN_IE to outgoing frame */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, - CipherTmpLen, &CipherTmp, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - /* fill Extended Capabilities (7.3.2.27) */ - Length = sizeof(EXT_CAP_INFO_ELEMENT); - os_zero_mem(&extCapInfo, Length); -#ifdef DOT11N_DRAFT3 - - if ((pAd->CommonCfg.bBssCoexEnable == TRUE) && - (wdev->PhyMode >= PHY_11ABGN_MIXED) && - (wdev->Channel <= 14)) - extCapInfo.BssCoexistMgmtSupport = 1; - -#endif /* DOT11N_DRAFT3 // */ - - if (pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TdlsChSwitchSupp) - extCapInfo.TDLSChSwitchSupport = 1; - - if (wdev->UapsdInfo.bAPSDCapable) - extCapInfo.UAPSDBufSTASupport = 1; - - extCapInfo.TDLSSupport = 1; -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)&extCapInfo, 8); -#endif - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &ExtCapIe, - 1, &Length, sizeof(EXT_CAP_INFO_ELEMENT), - &extCapInfo, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - - /* fill FTIE & Timeout Interval for discovery response if security is not NONE */ - if (action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES && - pAd->StaCfg[0].wdev.WepStatus != - Ndis802_11EncryptionDisabled) { - FT_FTIE FtIe; - UCHAR Length; - UCHAR SNonce[32]; /* Generated in Message 2, random variable */ - /* FTIE (7.3.2.48) */ - os_zero_mem(&FtIe, sizeof(FtIe)); - Length = sizeof(FtIe); - /* generate SNonce */ - GenRandom(pAd, pAd->CurrentAddress, FtIe.SNonce); - os_move_mem(SNonce, FtIe.SNonce, 32); - - do { - UINT16 MICCtrBuf; - UCHAR FTIE = IE_FT_FTIE; - - MICCtrBuf = cpu2le16(FtIe.MICCtr.word); - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TempLen, 1, &FTIE, 1, - &Length, 2, - (PUCHAR)&MICCtrBuf, 16, - (PUCHAR)FtIe.MIC, 32, - (PUCHAR)FtIe.ANonce, 32, - (PUCHAR)FtIe.SNonce, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } while (0); - - /* Timeout Interval (7.3.2.49) */ - do { - UINT8 Length; - UINT8 TimeOutIntervalIE; - UINT8 TimeoutType; - UINT32 TimeoutValueBuf; - - Length = 5; - TimeOutIntervalIE = IE_FT_TIMEOUT_INTERVAL; - TimeoutType = 2; - TimeoutValueBuf = cpu2le32(3600); - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TempLen, 1, - &TimeOutIntervalIE, 1, &Length, 1, - (PUCHAR)&TimeoutType, 4, - (PUCHAR)&TimeoutValueBuf, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } while (0); - } - - /* fill Supported Regulatory Classes */ - do { - UCHAR TDLS_IE = IE_SUPP_REG_CLASS; - UCHAR Length = 16; - UCHAR SuppClassesList[] = { 1, 2, 3, 4, 12, - 22, 23, 24, 25, 27, - 28, 29, 30, 32, 33 }; - UCHAR regclass; - - regclass = cfg_tdls_GetRegulatoryClass(pAd, op_ht_bw, - wdev->channel); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &TDLS_IE, 1, &Length, 1, ®class, - 15, SuppClassesList, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } while (0); - - /* fill HT Capability */ -#ifdef DOT11_N_SUPPORT - - if (WMODE_CAP_N(wdev->PhyMode)) { - UCHAR HtLen; - HT_CAPABILITY_IE HtCapabilityTmp; - - HtLen = sizeof(HT_CAPABILITY_IE); -#ifndef RT_BIG_ENDIAN - os_zero_mem(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE)); - os_move_mem(&HtCapabilityTmp, - &pAd->CommonCfg.HtCapability, HtLen); - HtCapabilityTmp.HtCapInfo.ChannelWidth = op_ht_bw; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &HtCapIe, 1, &HtLen, HtLen, - &HtCapabilityTmp, END_OF_ARGS); -#else - os_zero_mem(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE)); - os_move_mem(&HtCapabilityTmp, - &pAd->CommonCfg.HtCapability, HtLen); - HtCapabilityTmp.HtCapInfo.ChannelWidth = op_ht_bw; - *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = - SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); - *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16( - *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &HtCapIe, 1, &HtLen, HtLen, - &HtCapabilityTmp, END_OF_ARGS); -#endif - FrameLen = FrameLen + TempLen; - } - -#ifdef DOT11N_DRAFT3 - /* fill 20/40 BSS Coexistence (7.3.2.61) */ - Length = 1; - memset(&BssCoexistence, 0, sizeof(BSS_2040_COEXIST_IE)); - BssCoexistence.field.InfoReq = 1; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &BssCoexistIe, 1, &Length, 1, - &BssCoexistence.word, END_OF_ARGS); - FrameLen = FrameLen + TempLen; -#endif /* DOT11N_DRAFT3 // */ -#endif /* DOT11_N_SUPPORT // */ - } - - /* fill link identifier */ - if (action_code == WLAN_TDLS_SETUP_REQUEST || - action_code == WLAN_TDLS_SETUP_CONFIRM || - action_code == WLAN_TDLS_DISCOVERY_REQUEST || - action_code == WLAN_TDLS_TEARDOWN || - action_code == TDLS_ACTION_CODE_AUTO_TEARDOWN || - (action_code == TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION && - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .bInitiator) || - (action_code == TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE && - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .bInitiator)) { - /* We are initiator. */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &TDLS_IE, - 1, &TDLS_IE_LEN, 6, pAd->CommonCfg.Bssid, 6, - pAd->CurrentAddress, 6, peer, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } else { - /* We are repsonder. */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &TDLS_IE, - 1, &TDLS_IE_LEN, 6, pAd->CommonCfg.Bssid, 6, - peer, 6, pAd->CurrentAddress, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - /* fill WMM */ - if (action_code == WLAN_TDLS_SETUP_REQUEST || - action_code == WLAN_TDLS_SETUP_RESPONSE) { - if (pAd->CommonCfg.bWmmCapable) { - QBSS_STA_INFO_PARM QosInfo; - UCHAR WmeParmIe[8] = { IE_VENDOR_SPECIFIC, - 7, - 0x00, - 0x50, - 0xf2, - 0x02, - 0x00, - 0x01 }; - - os_zero_mem(&QosInfo, sizeof(QBSS_STA_INFO_PARM)); - - if (wdev->UapsdInfo.bAPSDCapable) { - QosInfo.UAPSD_AC_BE = - 1; /* pAd->CommonCfg.TDLS_bAPSDAC_BE; */ - QosInfo.UAPSD_AC_BK = - 1; /* pAd->CommonCfg.TDLS_bAPSDAC_BK; */ - QosInfo.UAPSD_AC_VI = - 1; /* pAd->CommonCfg.TDLS_bAPSDAC_VI; */ - QosInfo.UAPSD_AC_VO = - 1; /* pAd->CommonCfg.TDLS_bAPSDAC_VO; */ - QosInfo.MaxSPLength = - 0; /* pAd->CommonCfg.TDLS_MaxSPLength; */ - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_ERROR, - ("tdls our uapsd> UAPSD %d %d %d %d %d!\n", - QosInfo.UAPSD_AC_BE, - QosInfo.UAPSD_AC_BK, - QosInfo.UAPSD_AC_VI, - QosInfo.UAPSD_AC_VO, - QosInfo.MaxSPLength)); - } - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 8, - WmeParmIe, 1, &QosInfo, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - } else if (action_code == WLAN_TDLS_SETUP_CONFIRM) { - /* UCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 0x18, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x0f, 0x00, 0x03, 0xa4, 0x00, 0x00, */ - /* 0x27, 0xa4, 0x00, 0x00, 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00};*/ - QBSS_STA_INFO_PARM QosInfo; - ULONG TempLen; - USHORT idx; - /* When the BSS is QoS capable, then the BSS QoS parameters shall be - * used by the TDLS peer STAs on the AP's channel, and the values - * indicated inside the TDLS Setup Confirm frame apply only for the - * off-channel. The EDCA parameters for the off-channel should be - * the same as those on the AP's channel when QoS is supported by the BSS, - * because this may optimize the channel switching process. - */ - UCHAR WmeParmIe[26] = { IE_VENDOR_SPECIFIC, - 24, - 0x00, - 0x50, - 0xf2, - 0x02, - 0x01, - 0x01, - 0, - 0 }; - - os_zero_mem(&QosInfo, sizeof(QBSS_STA_INFO_PARM)); - - if (wdev->UapsdInfo.bAPSDCapable) { - QosInfo.UAPSD_AC_BE = - 1; /* pAd->CommonCfg.TDLS_bAPSDAC_BE; */ - QosInfo.UAPSD_AC_BK = - 1; /* pAd->CommonCfg.TDLS_bAPSDAC_BK; */ - QosInfo.UAPSD_AC_VI = - 1; /* pAd->CommonCfg.TDLS_bAPSDAC_VI; */ - QosInfo.UAPSD_AC_VO = - 1; /* pAd->CommonCfg.TDLS_bAPSDAC_VO; */ - QosInfo.MaxSPLength = - 0; /* pAd->CommonCfg.TDLS_MaxSPLength; */ - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("tdls our uapsd> UAPSD %d %d %d %d %d!\n", - QosInfo.UAPSD_AC_BE, QosInfo.UAPSD_AC_BK, - QosInfo.UAPSD_AC_VI, QosInfo.UAPSD_AC_VO, - QosInfo.MaxSPLength)); - } - - WmeParmIe[8] |= *(PUCHAR)&QosInfo; - - for (idx = QID_AC_BK; idx <= QID_AC_VO; idx++) { - WmeParmIe[10 + (idx * 4)] = - (idx << 5) + /* b5-6 is ACI */ - ((UCHAR)pAd->CommonCfg.APEdcaParm[0].bACM[idx] - << 4) + /* b4 is ACM */ - (pAd->CommonCfg.APEdcaParm[0].Aifsn[idx] & - 0x0f); /* b0-3 is AIFSN */ - WmeParmIe[11 + (idx * 4)] = - (pAd->CommonCfg.APEdcaParm[0].Cwmax[idx] - << 4) + /* b5-8 is CWMAX */ - (pAd->CommonCfg.APEdcaParm[0].Cwmin[idx] & - 0x0f); /* b0-3 is CWMIN */ - WmeParmIe[12 + (idx * 4)] = - (UCHAR)(pAd->CommonCfg.APEdcaParm[0].Txop[idx] & - 0xff); /* low byte of TXOP */ - WmeParmIe[13 + (idx * 4)] = - (UCHAR)(pAd->CommonCfg.APEdcaParm[0].Txop[idx] >> - 8); /* high byte of TXOP */ - } - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 26, - WmeParmIe, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - if (action_code == TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE || - (action_code == WLAN_TDLS_TEARDOWN && reason_code != 25)) { - pMacEntry = MacTableLookup(pAd, peer); - - if (pMacEntry == NULL) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("tdls_cmd> ERROR! No such peer in %s!\n", - __func__)); - return -1; - } - } - - if (action_code == TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION) { - /* fill PU buffer status */ - MAC_TABLE_ENTRY *pEntry; - ULONG TempLen; - UINT8 Length; - UINT8 IeIdPuBufferStatus; - UINT8 PuBufferStatus; - UINT8 FlgIsAnyPktForBK, FlgIsAnyPktForBE; - UINT8 FlgIsAnyPktForVI, FlgIsAnyPktForVO; - /* get pEntry */ - pEntry = MacTableLookup(pAd, peer); - - if (pEntry == NULL) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("tdls_cmd> ERROR! No such peer in %s!\n", - __func__)); - return -1; - } - - /* init */ - Length = 1; - IeIdPuBufferStatus = IE_TDLS_PU_BUFFER_STATUS; - PuBufferStatus = 0; -#ifdef UAPSD_SUPPORT - /* get queue status */ - UAPSD_QueueStatusGet(pAd, pEntry, &FlgIsAnyPktForBK, - &FlgIsAnyPktForBE, &FlgIsAnyPktForVI, - &FlgIsAnyPktForVO); - PuBufferStatus |= (FlgIsAnyPktForBK == TRUE) ? 0x01 : 0x00; - PuBufferStatus |= (FlgIsAnyPktForBE == TRUE) ? 0x02 : 0x00; - PuBufferStatus |= (FlgIsAnyPktForVI == TRUE) ? 0x04 : 0x00; - PuBufferStatus |= (FlgIsAnyPktForVO == TRUE) ? 0x08 : 0x00; -#endif /*UAPSD_SUPPORT*/ - /* init element */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &IeIdPuBufferStatus, 1, &Length, 1, - &PuBufferStatus, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - /* add extra_ies */ - if (extra_ies_len != 0) { - /* hex_dump("!!! extra_ies ", extra_ies, extra_ies_len); */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, - extra_ies_len, extra_ies, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - /* ///////////////// debug output ///////////////////////////// */ - switch (action_code) { - case WLAN_TDLS_SETUP_REQUEST: - CFG80211DBG(DBG_LVL_ERROR, - ("80211> WLAN_TDLS_SETUP_REQUEST ==>\n")); - break; - - case WLAN_TDLS_SETUP_RESPONSE: - CFG80211DBG(DBG_LVL_ERROR, - ("80211> WLAN_TDLS_SETUP_RESPONSE ==>\n")); - break; - - case WLAN_TDLS_SETUP_CONFIRM: - CFG80211DBG(DBG_LVL_ERROR, - ("80211> WLAN_TDLS_SETUP_CONFIRM ==>\n")); - break; - - case WLAN_TDLS_TEARDOWN: - case TDLS_ACTION_CODE_AUTO_TEARDOWN: - CFG80211DBG(DBG_LVL_ERROR, ("80211> WLAN_TDLS_TEARDOWN ==>\n")); - break; - - case WLAN_TDLS_DISCOVERY_REQUEST: - CFG80211DBG(DBG_LVL_ERROR, - ("80211> WLAN_TDLS_DISCOVERY_REQUEST ==>\n")); - break; - - case WLAN_PUB_ACTION_TDLS_DISCOVER_RES: - CFG80211DBG( - DBG_LVL_ERROR, - ("80211> WLAN_PUB_ACTION_TDLS_DISCOVERY_RESPONSE ==>\n")); - break; - - case TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION: - CFG80211DBG( - DBG_LVL_ERROR, - ("80211> TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION ==>\n")); - break; - - case TDLS_ACTION_CODE_WFD_TUNNELED_PROBE_REQ: - CFG80211DBG( - DBG_LVL_ERROR, - ("80211> TDLS_ACTION_CODE_WFD_TUNNELED_PROBE_REQ ==>\n")); - break; - - case TDLS_ACTION_CODE_WFD_TUNNELED_PROBE_RSP: - CFG80211DBG( - DBG_LVL_ERROR, - ("80211> TDLS_ACTION_CODE_WFD_TUNNELED_PROBE_RSP ==>\n")); - break; - - default: - CFG80211DBG(DBG_LVL_ERROR, - ("80211> UNKNOWN TDLS PACKET ==>\n")); - break; - } - - hex_dump("TDLS send pack", pOutBuffer, FrameLen); - - if (send_by_tdls_link == TRUE || - (action_code == WLAN_TDLS_TEARDOWN && - reason_code != 25)) { /* only uapsd PTR, normal teardown */ -#ifdef UAPSD_SUPPORT - if (action_code == TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE) - RTMP_PS_VIRTUAL_WAKEUP_PEER( - pMacEntry); /* peer can not sleep for a while */ - -#endif - CFG80211DBG(DBG_LVL_ERROR, ("80211> SEND BY TDLS LINK! ==>\n")); - RTMPToWirelessSta(pAd, pMacEntry, Header802_3, LENGTH_802_3, - pOutBuffer, (UINT)FrameLen, FALSE); - } else if (action_code == TDLS_ACTION_CODE_AUTO_TEARDOWN) { - PNDIS_PACKET pPacket; - NDIS_STATUS Status; - - Status = RTMPAllocateNdisPacket(pAd, &pPacket, Header802_3, - LENGTH_802_3, pOutBuffer, - (UINT)FrameLen); - - if (Status != NDIS_STATUS_SUCCESS) - return -1; - - Status = ge_enq_req(pAd, pPacket, QID_AC_VI, - &pAd->MacTab.tr_entry[BSSID_WCID], TRUE, - NULL); - - if (Status != NDIS_STATUS_SUCCESS) - CFG80211DBG(DBG_LVL_ERROR, - ("########### enq ERR %d\n", Status)); - } else if (action_code != - WLAN_PUB_ACTION_TDLS_DISCOVER_RES) { /* discover_req,setup,teardown,uapsd PTI */ -#ifdef UAPSD_SUPPORT - if (action_code == TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION) - ASIC_PS_CAN_NOT_SLEEP(pAd); - -#endif /*UAPSD_SUPPORT*/ - RTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], - Header802_3, LENGTH_802_3, pOutBuffer, - (UINT)FrameLen, FALSE); - } else { /* dicovery_response */ - INT stat = 0; - - stat = MiniportMMRequest(pAd, QID_AC_VI, pOutBuffer, FrameLen); - - if (stat != 0) - CFG80211DBG(DBG_LVL_ERROR, - ("########### MINIPORT ERR %d\n", stat)); - } - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("<====== %s() out\n", __func__)); - return 0; -} - -INT cfg_tdls_EntryInfo_Display_Proc(IN PRTMP_ADAPTER pAd, IN PUCHAR arg) -{ - INT i; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("\n%-19s\n", "MAC\n")); - - for (i = 0; i < MAX_NUM_OF_CFG_TDLS_ENTRY; i++) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("TDLS Entry %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - i, - PRINT_MAC(pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .MacAddr))); - - if (pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info.TDLSEntry[i] - .EntryValid == TRUE) { - PMAC_TABLE_ENTRY pEntry = - &pAd->MacTab.Content[pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info - .TDLSEntry[i] - .MacTabMatchWCID]; - /* MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, ("%02x:%02x:%02x:%02x:%02x:%02x\n",PRINT_MAC(pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info.TDLSEntry[i].MacAddr))); */ - /*MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, ("%-8d\n", pAd->StaCfg[0].DLSEntry[i].TimeOut)); */ - /* MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, ("\n")); */ - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("TDLS Entry %d is valid, bInitiator = %d\n", - i, - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[i] - .bInitiator)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("\n")); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("\n%-19s%-4s%-4s%-4s%-4s%-7s%-7s%-7s", "MAC", - "AID", "BSS", "PSM", "WMM", "RSSI0", "RSSI1", - "RSSI2")); -#ifdef DOT11_N_SUPPORT - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-8s%-10s%-6s%-6s%-6s%-6s", "MIMOPS", "PhMd", - "BW", "MCS", "SGI", "STBC")); -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("\n%02X:%02X:%02X:%02X:%02X:%02X ", - pEntry->Addr[0], pEntry->Addr[1], - pEntry->Addr[2], pEntry->Addr[3], - pEntry->Addr[4], pEntry->Addr[5])); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-4d", (int)pEntry->Aid)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-4d", (int)pEntry->apidx)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-4d", (int)pEntry->PsMode)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-4d", - (int)CLIENT_STATUS_TEST_FLAG( - pEntry, fCLIENT_STATUS_WMM_CAPABLE))); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-7d", pEntry->RssiSample.AvgRssi[0])); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-7d", pEntry->RssiSample.AvgRssi[1])); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-7d", pEntry->RssiSample.AvgRssi[2])); -#ifdef DOT11_N_SUPPORT - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-8d", (int)pEntry->MmpsMode)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-10s", - get_phymode_str( - pEntry->HTPhyMode.field.MODE))); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-6s", - get_bw_str(pEntry->HTPhyMode.field.BW))); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-6d", pEntry->HTPhyMode.field.MCS)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-6d", pEntry->HTPhyMode.field.ShortGI)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-6d", pEntry->HTPhyMode.field.STBC)); -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("%-10d, %d, %d%%\n", pEntry->DebugFIFOCount, - pEntry->DebugTxCount, - (pEntry->DebugTxCount) ? - ((pEntry->DebugTxCount - - pEntry->DebugFIFOCount) * - 100 / pEntry->DebugTxCount) : - 0)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_OFF, - ("\n")); - } - } - - return TRUE; -} - -VOID cfg_tdls_rx_parsing(PRTMP_ADAPTER pAd, RX_BLK *pRxBlk) -{ - UCHAR TDLS_LLC_SNAP_WITH_CATEGORY[] = { - 0xaa, 0xaa, 0x03, - 0x00, 0x00, 0x00, - 0x89, 0x0d, PROTO_NAME_TDLS, - CATEGORY_TDLS - }; - - if ((pRxBlk->DataSize >= (LENGTH_802_1_H + LENGTH_TDLS_H)) && - os_equal_mem(TDLS_LLC_SNAP_WITH_CATEGORY, pRxBlk->pData, - LENGTH_802_1_H + 2)) { - UCHAR TDLSType, dialog_token; - UCHAR *peerMAC; - UCHAR nullAddr[MAC_ADDR_LEN]; - CHAR *Ptr = pRxBlk->pData; - ULONG Length = 0; - PEID_STRUCT pEid; - ULONG RemainLen = pRxBlk->DataSize; - PCFG_TDLS_STRUCT pCfgTdls = - &pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info; - struct wifi_dev *wdev = &pAd->StaCfg[0].wdev; - - os_zero_mem(nullAddr, MAC_ADDR_LEN); - TDLSType = *(pRxBlk->pData + LENGTH_802_1_H + 2); - - if (TDLSType == TDLS_ACTION_CODE_SETUP_REQUEST || - TDLSType == TDLS_ACTION_CODE_SETUP_RESPONSE) { - int i = 0, tdls_entry_index = 0; - - peerMAC = pRxBlk->pHeader->Addr3; - - for (i = 0; i < MAX_NUM_OF_CFG_TDLS_ENTRY; i++) { - if (pCfgTdls->TDLSEntry[i].EntryValid == - FALSE && - (MAC_ADDR_EQUAL( - pCfgTdls->TDLSEntry[i].MacAddr, - nullAddr) || - MAC_ADDR_EQUAL( - pCfgTdls->TDLSEntry[i].MacAddr, - peerMAC))) { - tdls_entry_index = - i; /* found an empty entry */ - break; - } - } - - if (i == MAX_NUM_OF_CFG_TDLS_ENTRY) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_OFF, - ("%s() - TDLS LINK NUMBER EXCEED, WE ONLY SUPPORT CONCURRENT %d LINKs, Discard this setup\n", - __func__, MAX_NUM_OF_CFG_TDLS_ENTRY)); - /* RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,NDIS_STATUS_FAILURE); */ - return; - } - - COPY_MAC_ADDR( - pCfgTdls->TDLSEntry[tdls_entry_index].MacAddr, - peerMAC); - - if (TDLSType == TDLS_ACTION_CODE_SETUP_REQUEST) { - Ptr += LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H + - 1 + 2; /* token 1 + capa 2 */ - RemainLen -= LENGTH_802_1_H + - LENGTH_TDLS_PAYLOAD_H + 1 + - 2; /* token 1 + capa 2 */ - } else { - pCfgTdls->TDLSEntry[tdls_entry_index] - .bInitiator = TRUE; - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_OFF, - ("%s() - TDLSEntry[%d] Initiator = %d\n", - __func__, tdls_entry_index, - pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info - .TDLSEntry[tdls_entry_index] - .bInitiator)); - Ptr += LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H + - 2 + 1 + - 2; /* status 2 + token 1 + capa 2 */ - RemainLen -= - LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H + - 2 + 1 + - 2; /* status 2 + token 1 + capa 2 */ - } - -#ifdef UAPSD_SUPPORT - /* Add for 2 necessary EID field check */ - pEid = (PEID_STRUCT)Ptr; - - /* get variable fields from payload and advance the pointer */ - while ((Length + 2 + pEid->Len) <= RemainLen) { - switch (pEid->Eid) { - case IE_QOS_CAPABILITY: - if (pEid->Len == 1) - pCfgTdls->TDLSEntry - [tdls_entry_index] - .QosCapability = - *(pEid->Octet); - - break; - - case IE_VENDOR_SPECIFIC: - - /* handle WME PARAMTER ELEMENT */ - if (os_equal_mem(pEid->Octet, - WME_INFO_ELEM, 6) && - (pEid->Len == 7)) - pCfgTdls->TDLSEntry - [tdls_entry_index] - .QosCapability = - pEid->Octet[6]; - - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s : RCV QosCapa 0x[%x] from peer MAC: (%02X:%02X:%02X:%02X:%02X:%02X)\n", - __func__, - pAd->StaCfg[0] - .wpa_supplicant_info - .CFG_Tdls_info - .TDLSEntry[tdls_entry_index] - .QosCapability, - PRINT_MAC(peerMAC))); - break; - - case IE_HT_CAP: - if (wdev->PhyMode >= PHY_11ABGN_MIXED) { - if (pEid->Len >= - SIZE_HT_CAP_IE) { /* Note: allow extension.!! */ - os_move_mem( - &pCfgTdls->TDLSEntry - [tdls_entry_index] - .HtCapability, - pEid->Octet, - sizeof(HT_CAPABILITY_IE)); - pCfgTdls->TDLSEntry - [tdls_entry_index] - .HtCapabilityLen = - SIZE_HT_CAP_IE; /* Nnow we only support 26 bytes. */ - } - } - - break; - - default: - break; - } - - Length = Length + 2 + pEid->Len; - pEid = (PEID_STRUCT)((UCHAR *)pEid + 2 + - pEid->Len); - } - -#endif /*UAPSD_SUPPORT*/ - } else if (TDLSType == - TDLS_ACTION_CODE_CHANNEL_SWITCH_REQUEST) { - /* DBGPRINT(RT_DEBUG_ERROR, ("\nPeerTdlsChannelSwitchReq!!\n")); */ - CFG_TDLS_CHSW_PARAM TdlsCHSWParam; - - os_zero_mem(&TdlsCHSWParam, - sizeof(CFG_TDLS_CHSW_PARAM)); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("GOT CHSW REQ! %ld !!!\n", - (jiffies * 1000) / OS_HZ)); - peerMAC = pRxBlk->pHeader->Addr2; - - if (pCfgTdls->IamInOffChannel) { - /* Got Req in off channel */ - /* Offset to Target Channel */ - Ptr += LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H; - RemainLen -= - LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H; - - /* Get the value of target channel from payload and advance the pointer */ - if (RemainLen < 1) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s() - Invaild packet length - (target channel)\n", - __func__)); - return; - } - - pCfgTdls->TargetOffChannel = *Ptr; - - if (pCfgTdls->TargetOffChannel == - pCfgTdls->BaseChannel) { /* STOPCHSW */ - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_OFF, - ("%s() - GOT SW Req in off channel with target = base %d, STOP CH SWITCH!!\n", - __func__, - pCfgTdls->BaseChannel)); - pCfgTdls->bDoingPeriodChannelSwitch = - FALSE; - } - - /* gen chsw_resp */ - cfg_tdls_chsw_resp(pAd, peerMAC, 11000, 19000, - 0); - /* CFG_TDLS_KYLE Send TDLS_BACK_TO_BASE */ - /* TdlsCHSWParam.cmd = 1; */ - /* RTEnqueueInternalCmd(pAd, CMDTHREAD_TDLS_SEND_CH_SW_SETUP, &TdlsCHSWParam, sizeof(CFG_TDLS_CHSW_PARAM)); */ - } else { - /* in base channel , parse request for CHSW time */ - /* Offset to Target Channel */ - Ptr += LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H; - RemainLen -= - LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H; - - /* Get the value of target channel from payload and advance the pointer */ - if (RemainLen < 1) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s() - Invaild packet length - (target channel)\n", - __func__)); - return; - } - - pCfgTdls->TargetOffChannel = *Ptr; - /* Offset to Regulatory Class */ - Ptr += 1; - RemainLen -= 1; - - /* Get the value of regulatory class from payload and advance the pointer */ - if (RemainLen < 1) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s() - Invaild packet length - (regulatory class)\n", - __func__)); - return; - } - - /* *pRegulatoryClass = *Ptr; */ - /* DBGPRINT_RAW(RT_DEBUG_TRACE, ("%s() - Regulatory class = %d\n", __FUNCTION__, *pRegulatoryClass)); */ - /* Offset to other elements */ - Ptr += 1; - RemainLen -= 1; - pEid = (PEID_STRUCT)Ptr; - - /* get variable fields from payload and advance the pointer */ - while ((Length + 2 + pEid->Len) <= RemainLen) { - switch (pEid->Eid) { - case IE_SECONDARY_CH_OFFSET: - if (pEid->Len == 1) - pCfgTdls->TargetOffChannelExt = - pEid->Octet[0]; - else - MTWF_LOG( - DBG_CAT_PROTO, - CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s() - wrong IE_SECONDARY_CH_OFFSET.\n", - __func__)); - - break; - - case IE_TDLS_LINK_IDENTIFIER: - if (pEid->Len != - TDLS_ELM_LEN_LINK_IDENTIFIER) - MTWF_LOG( - DBG_CAT_PROTO, - CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s() - wrong IE_TDLS_LINK_IDENTIFIER.\n", - __func__)); - - break; - - case IE_TDLS_CHANNEL_SWITCH_TIMING: - if (pEid->Len == 4) { - os_move_mem( - &pCfgTdls->ChSwitchTime, - &pEid->Octet[0], - 2); - os_move_mem( - &pCfgTdls->ChSwitchTimeout, - &pEid->Octet[2], - 2); - } else - MTWF_LOG( - DBG_CAT_PROTO, - CATPROTO_TDLS, - DBG_LVL_ERROR, - ("%s() - wrong IE_TDLS_CHANNEL_SWITCH_TIMING.\n", - __func__)); - - break; - - default: - /* Unknown IE, we have to pass it as variable IEs */ - MTWF_LOG( - DBG_CAT_PROTO, - CATPROTO_TDLS, - DBG_LVL_WARN, - ("%s() - unrecognized EID = %d\n", - __func__, pEid->Eid)); - break; - } - - Length = Length + 2 + pEid->Len; - pEid = (PEID_STRUCT)((UCHAR *)pEid + 2 + - pEid->Len); - } - } - - if (pCfgTdls->ChSwitchTime <= TDLS_CHANNEL_SWITCH_TIME) - pCfgTdls->ChSwitchTime = - TDLS_CHANNEL_SWITCH_TIME; - - if (pCfgTdls->ChSwitchTimeout <= - TDLS_CHANNEL_SWITCH_TIMEOUT) - pCfgTdls->ChSwitchTimeout = - TDLS_CHANNEL_SWITCH_TIMEOUT; - - if (pAd->StaActive.ExtCapInfo.TDLSChSwitchProhibited == - TRUE) { - /* gen CHSW Resp with status=37 return; */ - cfg_tdls_chsw_resp(pAd, peerMAC, - pCfgTdls->ChSwitchTime, - pCfgTdls->ChSwitchTimeout, - 37); - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_OFF, - ("%s() - AP prohibit TDLS CH SWITH (%d), STOP!!\n", - __func__, - pAd->StaActive.ExtCapInfo - .TDLSChSwitchProhibited)); - return; - } - - /* STARTCHSW //RX TDLS_ACTION_CODE_CHANNEL_SWITCH_REQUEST */ - /* pCfgTdls->OffChannelStayTime = pAd->StaCfg[0].DtimPeriod *100 - pCfgTdls->BaseChannelStayTime; */ - pCfgTdls->BaseChannel = wlan_operate_get_cen_ch_1(wdev); - pCfgTdls->OrigTargetOffChannel = - pCfgTdls->TargetOffChannel; - - if (pCfgTdls->TargetOffChannelExt == 0x1) - pCfgTdls->TargetOffChannel += 2; - else if (pCfgTdls->TargetOffChannelExt == 0x3) - pCfgTdls->TargetOffChannel -= 2; - - /* gen CHSW Resp */ - /* cfg_tdls_chsw_resp(pAd,peerMAC,pCfgTdls->ChSwitchTime,pCfgTdls->ChSwitchTimeout,0); */ - pCfgTdls->bDoingPeriodChannelSwitch = TRUE; - /* RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); */ - /* RTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUE); */ - /* CFG_TDLS_KYLE Send TDLS_CH_SW_START */ - COPY_MAC_ADDR(pCfgTdls->CHSWPeerMacAddr, peerMAC); - pCfgTdls->TargetOffChannelBW = - (pCfgTdls->TargetOffChannelExt) ? 1 : 0; - TdlsCHSWParam.cmd = 0; - TdlsCHSWParam.bw_off = pCfgTdls->TargetOffChannelBW; - TdlsCHSWParam.offch_center = pCfgTdls->TargetOffChannel; - TdlsCHSWParam.offch_prim = - pCfgTdls->OrigTargetOffChannel; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TdlsCHSWParam.offch_center : %d TdlsCHSWParam.offch_prim: %d pCfgTdls->TargetOffChannelExt: %d\n", - TdlsCHSWParam.offch_center, - TdlsCHSWParam.offch_prim, - pCfgTdls->TargetOffChannelExt)); - TdlsCHSWParam.role = pCfgTdls->bChannelSwitchInitiator; - /* TdlsCHSWParam.stay_time = pCfgTdls->OffChannelStayTime; */ - TdlsCHSWParam.switch_time = pCfgTdls->ChSwitchTime; - TdlsCHSWParam.switch_timeout = - pCfgTdls->ChSwitchTimeout; - TdlsCHSWParam.start_time_tsf = pRxBlk->TimeStamp; - RTEnqueueInternalCmd(pAd, - CMDTHREAD_TDLS_SEND_CH_SW_SETUP, - &TdlsCHSWParam, - sizeof(CFG_TDLS_CHSW_PARAM)); - mdelay(1); - cfg_tdls_chsw_resp(pAd, peerMAC, pCfgTdls->ChSwitchTime, - pCfgTdls->ChSwitchTimeout, 0); - } else if (TDLSType == - TDLS_ACTION_CODE_CHANNEL_SWITCH_RESPONSE) { - CFG_TDLS_CHSW_PARAM TdlsCHSWParam; - USHORT StatusCode = 0; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("GOT CHSW RESP! %ld !!!\n", - (jiffies * 1000) / OS_HZ)); - peerMAC = pRxBlk->pHeader->Addr2; - - if (pCfgTdls->IamInOffChannel) { - /* CFG_TDLS_KYLE Send TDLS_BACK_TO_BASE */ - /* TdlsCHSWParam.cmd = 1; */ - /* RTEnqueueInternalCmd(pAd, CMDTHREAD_TDLS_SEND_CH_SW_SETUP, &TdlsCHSWParam, sizeof(CFG_TDLS_CHSW_PARAM)); */ - } else if (pAd->StaCfg[0].wpa_supplicant_info - .CFG_Tdls_info.IsentCHSW == - TRUE && - pAd->StaCfg[0].wpa_supplicant_info - .CFG_Tdls_info - .bChannelSwitchInitiator == - TRUE) { - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .IsentCHSW = - FALSE; /* to prevent receiving off channel CHSW resp in base channel */ - /* Now in Base Channel, parse response for CHSW time */ - /* Offset to Status Code */ - Ptr += LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H; - RemainLen -= - LENGTH_802_1_H + LENGTH_TDLS_PAYLOAD_H; - - /* Get the value of Status Code from payload and advance the pointer */ - if (RemainLen < 2) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, - DBG_LVL_ERROR, - ("PeerTdlsChannelSwitchRspSanity --> Invaild packet length - (status code)\n")); - return; - } - - os_move_mem(&StatusCode, Ptr, 2); - /* Offset to other elements */ - Ptr += 2; - RemainLen -= 2; - pEid = (PEID_STRUCT)Ptr; - - /* get variable fields from payload and advance the pointer */ - while ((Length + 2 + pEid->Len) <= RemainLen) { - switch (pEid->Eid) { - case IE_TDLS_LINK_IDENTIFIER: - if (pEid->Len != - TDLS_ELM_LEN_LINK_IDENTIFIER) - MTWF_LOG( - DBG_CAT_PROTO, - CATPROTO_TDLS, - DBG_LVL_WARN, - ("PeerTdlsChannelSwitchRspSanity - wrong IE_TDLS_LINK_IDENTIFIER.\n")); - - break; - - case IE_TDLS_CHANNEL_SWITCH_TIMING: - if (pEid->Len == 4) { - /* TDLS_CH_SWITCH_TIMING_ELEMENT ChSwitchTiming; */ - os_move_mem( - &pCfgTdls->ChSwitchTime, - &pEid->Octet[0], - 2); - os_move_mem( - &pCfgTdls->ChSwitchTimeout, - &pEid->Octet[2], - 2); - /* *pChSwitchTime = ChSwitchTiming.ChSwitchTime; */ - /* *pChSwitchTimeOut = ChSwitchTiming.ChSwitchTimeOut; */ - } else - MTWF_LOG( - DBG_CAT_PROTO, - CATPROTO_TDLS, - DBG_LVL_ERROR, - ("PeerTdlsChannelSwitchRspSanity - wrong IE_TDLS_CHANNEL_SWITCH_TIMING.\n")); - - break; - - default: - /* Unknown IE, we have to pass it as variable IEs */ - MTWF_LOG( - DBG_CAT_PROTO, - CATPROTO_TDLS, - DBG_LVL_ERROR, - ("PeerTdlsChannelSwitchRspSanity - unrecognized EID = %d\n", - pEid->Eid)); - break; - } - - Length = Length + 2 + pEid->Len; - pEid = (PEID_STRUCT)((UCHAR *)pEid + 2 + - pEid->Len); - } - - /* STARTCHSW //RX TDLS_ACTION_CODE_CHANNEL_SWITCH_RESP */ - pCfgTdls->OffChannelStayTime = - pAd->StaCfg[0].DtimPeriod * 100 - - pCfgTdls->BaseChannelStayTime; - pCfgTdls->BaseChannel = wdev->channel; - pCfgTdls->bDoingPeriodChannelSwitch = TRUE; - /* RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); */ - /* RTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DEQUEUE); */ - /* CFG_TDLS_KYLE Send TDLS_CH_SW_START */ - COPY_MAC_ADDR(pCfgTdls->CHSWPeerMacAddr, - peerMAC); - /* pCfgTdls->TargetOffChannelBW = (pCfgTdls->TargetOffChannelExt)?1:0; */ - TdlsCHSWParam.cmd = 0; - TdlsCHSWParam.offch_center = - pCfgTdls->TargetOffChannel; - TdlsCHSWParam.offch_prim = - pCfgTdls->OrigTargetOffChannel; - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("TdlsCHSWParam.offch_center : %d TdlsCHSWParam.offch_prim: %d pCfgTdls->TargetOffChannelExt: %d\n", - TdlsCHSWParam.offch_center, - TdlsCHSWParam.offch_prim, - pCfgTdls->TargetOffChannelExt)); - TdlsCHSWParam.bw_off = - pCfgTdls->TargetOffChannelBW; - TdlsCHSWParam.role = - pCfgTdls->bChannelSwitchInitiator; - /* TdlsCHSWParam.stay_time = pCfgTdls->OffChannelStayTime; */ - TdlsCHSWParam.switch_time = - pCfgTdls->ChSwitchTime; - TdlsCHSWParam.switch_timeout = - pCfgTdls->ChSwitchTimeout; - TdlsCHSWParam.start_time_tsf = - pRxBlk->TimeStamp; - RTEnqueueInternalCmd( - pAd, CMDTHREAD_TDLS_SEND_CH_SW_SETUP, - &TdlsCHSWParam, - sizeof(CFG_TDLS_CHSW_PARAM)); - } - } - -#ifdef UAPSD_SUPPORT - else if (TDLSType == - TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION) { /* TDLS_ACTION_CODE_PEER_TRAFFIC_INDICATION */ - peerMAC = pRxBlk->pHeader->Addr3; - dialog_token = *(pRxBlk->pData + LENGTH_802_1_H + 3); - cfg_tdls_rcv_PeerTrafficIndication(pAd, dialog_token, - peerMAC); - } else if (TDLSType == TDLS_ACTION_CODE_PEER_TRAFFIC_RESPONSE) { - peerMAC = pRxBlk->pHeader->Addr2; - dialog_token = *(pRxBlk->pData + LENGTH_802_1_H + 3); - cfg_tdls_rcv_PeerTrafficResponse(pAd, peerMAC); - } - -#endif /*UAPSD_SUPPORT*/ - } -} - -VOID cfg_tdls_BaseChannelTimeoutAction(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)FunctionContext; - PCFG_TDLS_STRUCT pCfgTdls = - &pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("tdls CHSW base channel timeout!!!\n")); - - if (pCfgTdls->bChannelSwitchInitiator && - pCfgTdls->bDoingPeriodChannelSwitch) - cfg_tdls_chsw_req(pAd, pCfgTdls->CHSWPeerMacAddr, - pCfgTdls->OrigTargetOffChannel, - pCfgTdls->TargetOffChannelBW); -} - -INT cfg_tdls_chsw_req(IN PRTMP_ADAPTER pAd, IN UINT8 *peer, - IN UINT8 target_channel, IN UINT8 target_bw) -{ - UCHAR TDLS_ETHERTYPE[] = { 0x89, 0x0d }; - UCHAR Header802_3[14]; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - ULONG TempLen; - UCHAR RemoteFrameType = PROTO_NAME_TDLS; - NDIS_STATUS NStatus = NDIS_STATUS_SUCCESS; - UINT8 category = CATEGORY_TDLS; - UCHAR TDLS_IE = IE_TDLS_LINK_IDENTIFIER; - UCHAR TDLS_IE_LEN = TDLS_ELM_LEN_LINK_IDENTIFIER; - MAC_TABLE_ENTRY *pMacEntry = NULL; - UCHAR regclass; - u8 action_code = TDLS_ACTION_CODE_CHANNEL_SWITCH_REQUEST; - UCHAR target_ext_ch_offset = EXTCHA_NONE; - INT tdls_entry_link_index = 0; - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("======> %s()\n", __func__)); - /* Allocate buffer for transmitting message */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("ACT - TDLS_SetupRequestAction() allocate memory failed\n")); - return NStatus; - } - - MAKE_802_3_HEADER(Header802_3, peer, pAd->CurrentAddress, - TDLS_ETHERTYPE); - /* fill action code */ - MakeOutgoingFrame(pOutBuffer, &TempLen, 1, &RemoteFrameType, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &category, 1, - &action_code, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - /* fill target channel */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &target_channel, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - - /* fill reg class */ - - if (target_bw != 0) - target_bw = 1; - - /* regclass = cfg_tdls_GetRegulatoryClass(pAd, target_bw, target_channel); */ - regclass = 22; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, ®class, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - - if (target_bw != 0) { - UCHAR length = 1; - - target_ext_ch_offset = - pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TargetOffChannelExt; - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("@@@ send CHSW request with TargetOffChannelExt : %d, Channel:%d\n", - target_ext_ch_offset, target_channel)); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, - &NewExtChanIe, 1, &length, 1, - &target_ext_ch_offset, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } else { - ; /* target_ext_ch_offset = EXTCHA_NONE; */ - } - - tdls_entry_link_index = cfg_tdls_search_ValidLinkIndex(pAd, peer); - - if (tdls_entry_link_index == -1) - return -1; - - if (pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .bInitiator) { - /* We are initiator. */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &TDLS_IE, - 1, &TDLS_IE_LEN, 6, pAd->CommonCfg.Bssid, 6, - pAd->CurrentAddress, 6, peer, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } else { - /* We are repsonder. */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &TDLS_IE, - 1, &TDLS_IE_LEN, 6, pAd->CommonCfg.Bssid, 6, - peer, 6, pAd->CurrentAddress, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - /* TDLS_InsertChannelSwitchTimingIE(pAd, (pOutBuffer + FrameLen), &FrameLen, SwitchTime, SwitchTimeout); */ - do { - UCHAR TDLS_IE = IE_TDLS_CHANNEL_SWITCH_TIMING; - UCHAR TDLS_IE_LEN = 4; - UINT16 SwitchTimeBuf = cpu2le16(11000); - UINT16 SwitchTimeOutBuf = cpu2le16(19000); - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &TDLS_IE, - 1, &TDLS_IE_LEN, 2, &SwitchTimeBuf, 2, - &SwitchTimeOutBuf, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } while (0); - - hex_dump("TDLS send chsw req pack", pOutBuffer, FrameLen); - pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info.IsentCHSW = TRUE; - { - /* get pEntry */ - pMacEntry = MacTableLookup(pAd, peer); - - if (pMacEntry == NULL) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("tdls_cmd> ERROR! No such peer in %s!\n", - __func__)); - return -1; - } - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("Send CHSW REQ! %ld !!!\n", - (jiffies * 1000) / OS_HZ)); - RTMPToWirelessSta(pAd, pMacEntry, Header802_3, LENGTH_802_3, - pOutBuffer, (UINT)FrameLen, FALSE); - } - return 0; -} - -INT cfg_tdls_chsw_resp(IN PRTMP_ADAPTER pAd, IN UINT8 *peer, - IN UINT32 ch_sw_time, IN UINT32 ch_sw_timeout, - IN UINT16 reason_code) -{ - UCHAR TDLS_ETHERTYPE[] = { 0x89, 0x0d }; - UCHAR Header802_3[14]; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - ULONG TempLen; - UCHAR RemoteFrameType = PROTO_NAME_TDLS; - NDIS_STATUS NStatus = NDIS_STATUS_SUCCESS; - UINT8 category = CATEGORY_TDLS; - UCHAR TDLS_IE = IE_TDLS_LINK_IDENTIFIER; - UCHAR TDLS_IE_LEN = TDLS_ELM_LEN_LINK_IDENTIFIER; - u8 action_code = TDLS_ACTION_CODE_CHANNEL_SWITCH_RESPONSE; - INT tdls_entry_link_index = 0; - MAC_TABLE_ENTRY *pMacEntry = NULL; - PNDIS_PACKET pPacket; - NDIS_STATUS Status; - struct wifi_dev *wdev; - /* Allocate buffer for transmitting message */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("ACT - TDLS_SetupRequestAction() allocate memory failed\n")); - return NStatus; - } - - MAKE_802_3_HEADER(Header802_3, peer, pAd->CurrentAddress, - TDLS_ETHERTYPE); - /* fill action code */ - MakeOutgoingFrame(pOutBuffer, &TempLen, 1, &RemoteFrameType, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &category, 1, - &action_code, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - /* fill reason code */ - reason_code = cpu2le16(reason_code); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 2, &reason_code, - END_OF_ARGS); - FrameLen = FrameLen + TempLen; - /* fill link identifier */ - tdls_entry_link_index = cfg_tdls_search_ValidLinkIndex(pAd, peer); - - if (tdls_entry_link_index == -1) - return -1; - - if (pAd->StaCfg[0] - .wpa_supplicant_info.CFG_Tdls_info - .TDLSEntry[tdls_entry_link_index] - .bInitiator) { - /* We are initiator. */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &TDLS_IE, - 1, &TDLS_IE_LEN, 6, pAd->CommonCfg.Bssid, 6, - pAd->CurrentAddress, 6, peer, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } else { - /* We are repsonder. */ - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &TDLS_IE, - 1, &TDLS_IE_LEN, 6, pAd->CommonCfg.Bssid, 6, - peer, 6, pAd->CurrentAddress, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - /* Channel Switch Timing */ - /* TDLS_InsertChannelSwitchTimingIE(pAd, (pOutBuffer + FrameLen), &FrameLen, SwitchTime, SwitchTimeout); */ - do { - UCHAR TDLS_IE = IE_TDLS_CHANNEL_SWITCH_TIMING; - UCHAR TDLS_IE_LEN = 4; - UINT16 SwitchTimeBuf = cpu2le16(ch_sw_time); - UINT16 SwitchTimeOutBuf = cpu2le16(ch_sw_timeout); - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, 1, &TDLS_IE, - 1, &TDLS_IE_LEN, 2, &SwitchTimeBuf, 2, - &SwitchTimeOutBuf, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } while (0); - - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s(): CHSW Resp Status:%d , SwitchTime:%d , SwitchTimeout:%d\n", - __func__, reason_code, ch_sw_time, ch_sw_timeout)); - hex_dump("TDLS send chsw resp pack", pOutBuffer, FrameLen); - /* get pEntry */ - pMacEntry = MacTableLookup(pAd, peer); - - if (pMacEntry == NULL) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("tdls_cmd> ERROR! No such peer in %s!\n", __func__)); - return -1; - } - - /* RTMPToWirelessSta(pAd, pMacEntry, Header802_3,LENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE); */ - Status = - RTMPAllocateNdisPacket(pAd, &pPacket, Header802_3, LENGTH_802_3, - pOutBuffer, (UINT)FrameLen); - - if (Status != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s() ===> NOT ENOUGH MEMORY!\n", __func__)); - return Status; - } - - RTMP_SET_PACKET_CLEAR_EAP_FRAME(pPacket, 0); - RTMP_SET_PACKET_WCID(pPacket, (UCHAR)pMacEntry->wcid); - /* TODO: shiang-usw, fix this! */ - RTMP_SET_PACKET_WDEV(pPacket, pMacEntry->wdev->wdev_idx); - RTMP_SET_PACKET_MOREDATA(pPacket, FALSE); - - if (!pAd->StaCfg[0].wpa_supplicant_info.CFG_Tdls_info.IamInOffChannel) - RTMP_SET_PACKET_TDLS_WAIT_ACK(pPacket, - 1); /* SET TDLS WAIT ACK */ - - /* send out the packet */ - wdev = pMacEntry->wdev; - - if (wdev && wdev->tx_pkt_handle) - wdev->tx_pkt_handle(pAd, pPacket); - else { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s():Invalid wdev(%p) or tx_pkt_handle(%p)!\n", - __func__, wdev, (wdev ? wdev->tx_pkt_handle : NULL))); - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); - } - - if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) - RTMPDeQueuePacket(pAd, FALSE, WMM_NUM_OF_AC, WCID_ALL, - MAX_TX_PROCESS); - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_INFO, - ("<====== %s() out\n", __func__)); - return 0; -} -VOID cfg_tdls_prepare_null_frame(PRTMP_ADAPTER pAd, BOOLEAN powersave, - UCHAR dir, UCHAR *peerAddr) -{ -#ifdef MT_MAC - return; -#else - PMAC_TABLE_ENTRY pEntry_TDLS = MacTableLookup(pAd, peerAddr); - - RtmpPrepareHwNullFrame(pAd, &pAd->MacTab.Content[BSSID_WCID], FALSE, - FALSE, 0, OPMODE_STA, PWR_SAVE, 0, 0); - RtmpPrepareHwNullFrame(pAd, pEntry_TDLS, TRUE, FALSE, 0, OPMODE_STA, - PWR_ACTIVE, TRUE, 1); -#endif -} - -VOID cfg_tdls_auto_teardown(PRTMP_ADAPTER pAd, PMAC_TABLE_ENTRY pEntry) -{ - MTWF_LOG( - DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s(): auto teardown link with (%02X:%02X:%02X:%02X:%02X:%02X)!!\n", - __func__, PRINT_MAC(pEntry->Addr))); -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) - cfg80211_tdls_oper_request(pAd->net_dev, pEntry->Addr, - NL80211_TDLS_TEARDOWN, 25, GFP_KERNEL); - mdelay(1); - cfg80211_tdls_oper_request(pAd->net_dev, pEntry->Addr, - NL80211_TDLS_DISABLE_LINK, 0, GFP_KERNEL); -#else - cfg_tdls_build_frame(pAd, pEntry->Addr, 1, TDLS_ACTION_CODE_TEARDOWN, 0, - NULL, 0, FALSE, 0, 25); - mdelay(1); - CFG80211DRV_StaTdlsInsertDeletepEntry(pAd, pEntry->Addr, - tdls_delete_entry); -#endif /* LINUX_VERSION_CODE: 3.8 */ -} - -/* - * ========================================================================== - * Description: WFD - * - * IRQL = PASSIVE_LEVEL - * ========================================================================== - */ -VOID cfg_tdls_TunneledProbeRequest(PRTMP_ADAPTER pAd, PUCHAR pMacAddr, - const u8 *extra_ies, size_t extra_ies_len) -{ - UCHAR TDLS_ETHERTYPE[] = { 0x89, 0x0d }; - UCHAR Header802_3[14]; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - ULONG TempLen; - UCHAR RemoteFrameType = PROTO_NAME_TDLS; - NDIS_STATUS NStatus = NDIS_STATUS_SUCCESS; - UCHAR Category = 0x7F; - UCHAR OUI[3] = { 0x50, 0x6F, 0x9A }; - UCHAR FrameBodyType = 4; /* 4: Request. 5: Response. */ - - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_TRACE, - ("TDLS ===> TDLS_TunneledProbeRequest\n")); - MAKE_802_3_HEADER(Header802_3, pMacAddr, pAd->CurrentAddress, - TDLS_ETHERTYPE); - /* Allocate buffer for transmitting message */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s() ===> NOT ENOUGH MEMORY!\n", __func__)); - return; - } - - MakeOutgoingFrame(pOutBuffer, &TempLen, 1, &RemoteFrameType, 1, - &Category, 3, &OUI, 1, &FrameBodyType, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - - /* add extra_ies */ - if (extra_ies_len != 0) { - hex_dump("extra_ies from supplicant ", extra_ies, - extra_ies_len); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, - extra_ies_len, extra_ies, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - RTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3, - LENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE); - hex_dump("TDLS tunneled request send pack", pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_TRACE, - ("TDLS <=== TDLS_TunneledProbeRequest\n")); -} - -/* - * ========================================================================== - * Description: WFD - * - * IRQL = PASSIVE_LEVEL - * ========================================================================== - */ -VOID cfg_tdls_TunneledProbeResponse(PRTMP_ADAPTER pAd, PUCHAR pMacAddr, - const u8 *extra_ies, size_t extra_ies_len) -{ - UCHAR TDLS_ETHERTYPE[] = { 0x89, 0x0d }; - UCHAR Header802_3[14]; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0; - ULONG TempLen; - UCHAR RemoteFrameType = PROTO_NAME_TDLS; - NDIS_STATUS NStatus = NDIS_STATUS_SUCCESS; - UCHAR Category = 0x7F; - UCHAR OUI[3] = { 0x50, 0x6F, 0x9A }; - UCHAR FrameBodyType = 5; /* 4: Request. 5: Response. */ - MAKE_802_3_HEADER(Header802_3, pMacAddr, pAd->CurrentAddress, - TDLS_ETHERTYPE); - /* Allocate buffer for transmitting message */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_ERROR, - ("%s() ===> NOT ENOUGH MEMORY!\n", __func__)); - return; - } - - MakeOutgoingFrame(pOutBuffer, &TempLen, 1, &RemoteFrameType, 1, - &Category, 3, &OUI, 1, &FrameBodyType, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - - /* add extra_ies */ - if (extra_ies_len != 0) { - hex_dump("extra_ies from supplicant ", extra_ies, - extra_ies_len); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen, - extra_ies_len, extra_ies, END_OF_ARGS); - FrameLen = FrameLen + TempLen; - } - - RTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3, - LENGTH_802_3, pOutBuffer, (UINT)FrameLen, FALSE); - hex_dump("TDLS tunneled response send pack", pOutBuffer, FrameLen); - MlmeFreeMemory(pOutBuffer); - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_TDLS, DBG_LVL_TRACE, - ("TDLS <=== TDLS_TunneledProbeResponse\n")); -} - -#endif /*CFG_TDLS_SUPPORT*/ - -#endif /* RT_CFG80211_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_tx.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_tx.c deleted file mode 100644 index a8ccb5d3e0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_tx.c +++ /dev/null @@ -1,3305 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - * Abstract: - * - * All related CFG80211 P2P function body. - * - * History: - * - ****************************************************************************/ -#define RTMP_MODULE_OS - -#ifdef RT_CFG80211_SUPPORT - -#include "rt_config.h" - -#ifdef IAPP_SUPPORT -extern BOOLEAN IAPP_L2_Update_Frame_Send(RTMP_ADAPTER *pAd, UINT8 *mac, - INT wdev_idx); -#endif /*IAPP_SUPPORT*/ - -VOID CFG80211_SwitchTxChannel(RTMP_ADAPTER *pAd, ULONG Data) -{ - /* UCHAR lock_channel = CFG80211_getCenCh(pAd, Data); */ - UCHAR lock_channel = Data; - - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev; - - if (RTMP_CFG80211_HOSTAPD_ON(pAd)) - return; - wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev; - -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[CFG_GO_BSSID_IDX]; - struct wifi_dev *wdev = &pMbss->wdev; - - if (pAd->Mlme.bStartMcc == TRUE) - return; - - if (pAd->Mlme.bStartScc == TRUE) { - /* MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("SCC Enabled, Do not switch channel for Tx %d\n",lock_channel)); */ - return; - } - - if (RTMP_CFG80211_VIF_P2P_GO_ON(pAd) && - (wdev->channel == lock_channel) && - (wlan_operate_get_ht_bw(wdev) == HT_BW_40)) { - MTWF_LOG( - DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("40 BW Enabled || GO enable , wait for CLI connect, Do not switch channel for Tx\n")); - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("GO wdev->channel %d lock_channel %d\n", - wdev->channel, lock_channel)); - return; - } - -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - struct wifi_dev *p2p_dev = &pAd->StaCfg[0].wdev; - UCHAR cen_ch = wlan_operate_get_cen_ch_1(p2p_dev); - - if (INFRA_ON(pAd) && - (((pAd->LatchRfRegs.Channel != cen_ch) && (cen_ch != 0))) || - (pAd->LatchRfRegs.Channel != lock_channel)) -#else - if (pAd->LatchRfRegs.Channel != lock_channel) -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - { - -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - wlan_operate_set_prim_ch(p2p_dev, lock_channel); -#else - wlan_operate_set_prim_ch(wdev, lock_channel); -#endif - - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Off-Channel Send Packet: From(%d)-To(%d)\n", - pAd->LatchRfRegs.Channel, lock_channel)); - } else - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Off-Channel Channel Equal: %d\n", - pAd->LatchRfRegs.Channel)); -} - -#ifdef CONFIG_AP_SUPPORT - -#ifdef DISABLE_HOSTAPD_PROBE_RESP -/* - ========================================================================== - Description: - Process the received ProbeRequest from clients for hostapd - Parameters: - apidx - ========================================================================== - */ -VOID ProbeResponseHandler(IN PRTMP_ADAPTER pAd, - IN PEER_PROBE_REQ_PARAM *ProbeReqParam, - IN UINT8 apidx) - -{ - HEADER_802_11 ProbeRspHdr; - NDIS_STATUS NStatus; - PUCHAR pOutBuffer = NULL; - ULONG FrameLen = 0, TmpLen; - LARGE_INTEGER FakeTimestamp; - UCHAR DsLen = 1; - UCHAR ErpIeLen = 1; - UCHAR PhyMode, SupRateLen; - BSS_STRUCT *mbss; - struct wifi_dev *wdev; - struct dev_rate_info *rate; - -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - UCHAR ucETxBfCap; -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ -#ifdef AP_QLOAD_SUPPORT - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); -#endif - - CHAR rsne_idx = 0; - struct _SECURITY_CONFIG *pSecConfig = NULL; - ADD_HT_INFO_IE *addht; - UCHAR cfg_ht_bw; - UCHAR op_ht_bw; - struct _build_ie_info ie_info; - UCHAR Environment = 0x20; -#ifdef CONFIG_HOTSPOT_R2 - extern UCHAR OSEN_IE[]; - extern UCHAR OSEN_IELEN; - BSS_STRUCT *pMbss; -#endif /* CONFIG_HOTSPOT_R2 */ - struct DOT11_H *pDot11h = NULL; - -#ifdef WDS_SUPPORT - /* if in bridge mode, no need to reply probe req. */ - if (pAd->WdsTab.Mode == WDS_BRIDGE_MODE) - return; -#endif /* WDS_SUPPORT */ - - { - mbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &mbss->wdev; - rate = &wdev->rate; - addht = wlan_operate_get_addht(wdev); - pDot11h = wdev->pDot11_H; - if (pDot11h == NULL) - return; - cfg_ht_bw = wlan_config_get_ht_bw(wdev); - op_ht_bw = wlan_operate_get_ht_bw(wdev); - - if ((wdev->if_dev == NULL) || - ((wdev->if_dev != NULL) && - !(RTMP_OS_NETDEV_STATE_RUNNING(wdev->if_dev)))) { - /* the interface is down, so we can not send probe response */ - return; - } - - PhyMode = wdev->PhyMode; - ie_info.frame_subtype = SUBTYPE_PROBE_RSP; - ie_info.channel = wdev->channel; - ie_info.phy_mode = PhyMode; - ie_info.wdev = wdev; - - if (((((ProbeReqParam->SsidLen == 0) && (!mbss->bHideSsid)) || - ((ProbeReqParam->SsidLen == mbss->SsidLen) && - NdisEqualMemory(ProbeReqParam->Ssid, mbss->Ssid, - (ULONG)ProbeReqParam->SsidLen))) -#ifdef CONFIG_HOTSPOT - && ProbeReqforHSAP(pAd, apidx, ProbeReqParam) -#endif - )) { - ; - } else { - return; - } - - /* allocate and send out ProbeRsp frame */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - if (NStatus != NDIS_STATUS_SUCCESS) - return; - - MgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, - ProbeReqParam->Addr2, wdev->if_addr, - wdev->bssid); - - { - SupRateLen = rate->SupRateLen; - if (PhyMode == WMODE_B) - SupRateLen = 4; - - MakeOutgoingFrame(pOutBuffer, &FrameLen, - sizeof(HEADER_802_11), &ProbeRspHdr, - TIMESTAMP_LEN, &FakeTimestamp, 2, - &pAd->CommonCfg.BeaconPeriod, 2, - &mbss->CapabilityInfo, 1, &SsidIe, 1, - &mbss->SsidLen, mbss->SsidLen, - mbss->Ssid, 1, &SupRateIe, 1, - &SupRateLen, SupRateLen, - rate->SupRate, 1, &DsIe, 1, &DsLen, 1, - &wdev->channel, END_OF_ARGS); - } - - if ((rate->ExtRateLen) && (PhyMode != WMODE_B)) { - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &ErpIe, 1, &ErpIeLen, 1, - &mbss->ErpIeContent, 1, &ExtRateIe, 1, - &rate->ExtRateLen, rate->ExtRateLen, - rate->ExtRate, END_OF_ARGS); - FrameLen += TmpLen; - } - -#ifdef DOT11_N_SUPPORT - if (WMODE_CAP_N(PhyMode) && - (wdev->DesiredHtPhyInfo.bHtEnable)) { - ie_info.is_draft_n_type = FALSE; - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_ht_ies(pAd, &ie_info); - } -#endif /* DOT11_N_SUPPORT */ - - /* Append RSN_IE when WPA OR WPAPSK, */ - pSecConfig = &wdev->SecConfig; -#ifdef CONFIG_HOTSPOT_R2 - pMbss = &pAd->ApCfg.MBSSID[wdev->func_idx]; - if ((pMbss->HotSpotCtrl.HotSpotEnable == 0) && - (pMbss->HotSpotCtrl.bASANEnable == 1) && - (IS_AKM_WPA2_Entry(wdev))) { - /* replace RSN IE with OSEN IE if it's OSEN wdev */ - UCHAR RSNIe = IE_WPA; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &RSNIe, 1, &OSEN_IELEN, OSEN_IELEN, - OSEN_IE, END_OF_ARGS); - FrameLen += TmpLen; - } else -#endif /* CONFIG_HOTSPOT_R2 */ - { - for (rsne_idx = 0; rsne_idx < SEC_RSNIE_NUM; - rsne_idx++) { -#ifdef DISABLE_HOSTAPD_PROBE_RESP - BSS_STRUCT *mbss = - &pAd->ApCfg.MBSSID[wdev->func_idx]; - if (mbss->RSNIE_Len[rsne_idx] != 0) { - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - 1, &mbss->RSNIE_ID[rsne_idx], 1, - &mbss->RSNIE_Len[rsne_idx], - mbss->RSNIE_Len[rsne_idx], - &mbss->RSN_IE[rsne_idx][0], - END_OF_ARGS); - FrameLen += TmpLen; - } - -#else - if (pSecConfig->RSNE_Type[rsne_idx] == - SEC_RSNIE_NONE) - continue; - - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, 1, - &pSecConfig->RSNE_EID[rsne_idx][0], 1, - &pSecConfig->RSNE_Len[rsne_idx], - pSecConfig->RSNE_Len[rsne_idx], - &pSecConfig->RSNE_Content[rsne_idx][0], - END_OF_ARGS); - - FrameLen += TmpLen; -#endif /*DISABLE_HOSTAPD_PROBE_RESP */ - } - } -#ifdef HOSTAPD_OWE_SUPPORT - if (mbss->TRANSIE_Len) { - ULONG TmpLen; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - mbss->TRANSIE_Len, mbss->TRANS_IE, - END_OF_ARGS); - FrameLen += TmpLen; - } - -#endif -#if defined(CONFIG_HOTSPOT) || defined(FTM_SUPPORT) - if (pAd->ApCfg.MBSSID[apidx].GASCtrl.b11U_enable) { - ULONG TmpLen; - /* Interworking element */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx] - .GASCtrl.InterWorkingIELen, - pAd->ApCfg.MBSSID[apidx].GASCtrl.InterWorkingIE, - END_OF_ARGS); - - FrameLen += TmpLen; - - /* Advertisement Protocol element */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx] - .GASCtrl.AdvertisementProtoIELen, - pAd->ApCfg.MBSSID[apidx] - .GASCtrl.AdvertisementProtoIE, - END_OF_ARGS); - - FrameLen += TmpLen; - } -#endif /* defined(CONFIG_HOTSPOT) || defined(FTM_SUPPORT) */ - -#ifdef CONFIG_HOTSPOT - if (pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.HotSpotEnable) { - ULONG TmpLen; - /* Hotspot 2.0 Indication */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.HSIndicationIELen, - pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.HSIndicationIE, - END_OF_ARGS); - - FrameLen += TmpLen; - - /* Roaming Consortium element */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.RoamingConsortiumIELen, - pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.RoamingConsortiumIE, - END_OF_ARGS); - - FrameLen += TmpLen; - - /* P2P element */ - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.P2PIELen, - pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.P2PIE, - END_OF_ARGS); - - FrameLen += TmpLen; - } -#endif - - /* Extended Capabilities IE */ - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_extended_cap_ie(pAd, &ie_info); -#ifdef AP_QLOAD_SUPPORT - - if (pAd->CommonCfg.dbdc_mode == 0) - pQloadCtrl = HcGetQloadCtrl(pAd); - else - pQloadCtrl = - (wdev->channel > 14) ? - HcGetQloadCtrlByRf(pAd, RFIC_5GHZ) : - HcGetQloadCtrlByRf(pAd, RFIC_24GHZ); - - if (pQloadCtrl->FlgQloadEnable != 0) { -#ifdef CONFIG_HOTSPOT_R2 - if (pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.QLoadTestEnable == 1) - FrameLen += QBSS_LoadElementAppend_HSTEST( - pAd, pOutBuffer + FrameLen, apidx); - else if (pAd->ApCfg.MBSSID[apidx] - .HotSpotCtrl.QLoadTestEnable == 0) -#endif - FrameLen += QBSS_LoadElementAppend( - pAd, pOutBuffer + FrameLen, pQloadCtrl, - apidx); - } -#endif /* AP_QLOAD_SUPPORT */ - - /* add WMM IE here */ - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_wmm_cap_ie(pAd, &ie_info); -#ifdef VENDOR_FEATURE7_SUPPORT - /* add country IE, power constraint IE */ - if (pAd->CommonCfg.bCountryFlag || - (wdev->channel > 14 && pAd->CommonCfg.bIEEE80211H == TRUE) -#ifdef DOT11K_RRM_SUPPORT - || IS_RRM_ENABLE(wdev) -#endif /* DOT11K_RRM_SUPPORT */ - ) { -#ifndef EXT_BUILD_CHANNEL_LIST - ULONG TmpLen = 0; -#endif /* !EXT_BUILD_CHANNEL_LIST */ - ULONG TmpLen2 = 0; - UCHAR TmpFrame[256] = { 0 }; -#ifndef EXT_BUILD_CHANNEL_LIST - PCH_DESC pChDesc = NULL; - UINT i; - - if (WMODE_CAP_2G(wdev->PhyMode)) { - if (pAd->CommonCfg.pChDesc2G != NULL) - pChDesc = (PCH_DESC)pAd->CommonCfg - .pChDesc2G; - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: pChDesc2G is NULL !!!\n", - __func__)); - } else if (WMODE_CAP_5G(wdev->PhyMode)) { - if (pAd->CommonCfg.pChDesc5G != NULL) - pChDesc = (PCH_DESC)pAd->CommonCfg - .pChDesc5G; - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: pChDesc5G is NULL !!!\n", - __func__)); - } -#endif /* !EXT_BUILD_CHANNEL_LIST */ - - os_alloc_mem(NULL, (UCHAR **)&TmpFrame, 256); - if (TmpFrame != NULL) { - NdisZeroMemory(TmpFrame, 256); - - /* prepare channel information */ -#ifdef EXT_BUILD_CHANNEL_LIST - BuildBeaconChList(pAd, wdev, TmpFrame, - &TmpLen2); -#else - { - UCHAR MaxTxPower = GetCuntryMaxTxPwr( - pAd, wdev->PhyMode, - wdev->channel, op_ht_bw); - - for (i = 0; - pChDesc[i].FirstChannel != 0; - i++) { - MakeOutgoingFrame( - TmpFrame + TmpLen2, - &TmpLen, 1, - &pChDesc[i].FirstChannel, - 1, &pChDesc[i].NumOfCh, - 1, &MaxTxPower, - END_OF_ARGS); - TmpLen2 += TmpLen; - } - } -#endif /* EXT_BUILD_CHANNEL_LIST */ - -#ifdef A_BAND_SUPPORT - /* - * Only 802.11a APs that comply with 802.11h are required to include - * a Power Constrint Element(IE=32) in beacons and probe response frames - */ - if ((wdev->channel > 14 && - pAd->CommonCfg.bIEEE80211H == TRUE) -#ifdef DOT11K_RRM_SUPPORT - || IS_RRM_ENABLE(wdev) -#endif /* DOT11K_RRM_SUPPORT */ - ) { - - UINT8 PwrConstraintIE = - IE_POWER_CONSTRAINT; - UINT8 PwrConstraintLen = 1; - UINT8 PwrConstraint = - pAd->CommonCfg.PwrConstraint; - /* prepare power constraint IE */ - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TmpLen, 1, - &PwrConstraintIE, 1, - &PwrConstraintLen, 1, - &PwrConstraint, - END_OF_ARGS); - FrameLen += TmpLen; - - /* prepare TPC Report IE */ - InsertTpcReportIE(pAd, - pOutBuffer + FrameLen, - &FrameLen, - GetMaxTxPwr(pAd), 0); -#ifdef DOT11_VHT_AC - if (WMODE_CAP_AC(PhyMode)) { - ULONG TmpLen; - UINT8 vht_txpwr_env_ie = - IE_VHT_TXPWR_ENV; - UINT8 ie_len; - VHT_TXPWR_ENV_IE txpwr_env; - - ie_len = build_vht_txpwr_envelope( - pAd, wdev, - (UCHAR *)&txpwr_env); - MakeOutgoingFrame( - pOutBuffer + FrameLen, - &TmpLen, 1, - &vht_txpwr_env_ie, 1, - &ie_len, ie_len, - &txpwr_env, - END_OF_ARGS); - FrameLen += TmpLen; - } -#endif /* DOT11_VHT_AC */ - } -#endif /* A_BAND_SUPPORT */ -#ifdef DOT11K_RRM_SUPPORT - if (IS_RRM_ENABLE(wdev)) { - UCHAR reg_class = get_regulatory_class( - pAd, mbss->wdev.channel, - mbss->wdev.PhyMode, - &mbss->wdev); - if (reg_class != 0) { - TmpLen2 = 0; - NdisZeroMemory( - TmpFrame, - sizeof(TmpFrame)); - RguClass_BuildBcnChList( - pAd, TmpFrame, &TmpLen2, - wdev, reg_class); - } - } -#endif /* DOT11K_RRM_SUPPORT */ - - /* add COUNTRY_IE in probe resp frames */ - { - UCHAR CountryIe = IE_COUNTRY; - /* need to do the padding bit check, and concatenate it */ - /* TmpFrame holds Channel list */ - if ((TmpLen2 % 2) == 0) { - UCHAR TmpLen3 = TmpLen2 + 4; - MakeOutgoingFrame( - pOutBuffer + FrameLen, - &TmpLen, 1, &CountryIe, - 1, &TmpLen3, 3, - pAd->CommonCfg - .CountryCode, - TmpLen2 + 1, TmpFrame, - END_OF_ARGS); - } else { - UCHAR TmpLen3 = TmpLen2 + 3; - MakeOutgoingFrame( - pOutBuffer + FrameLen, - &TmpLen, 1, &CountryIe, - 1, &TmpLen3, 3, - pAd->CommonCfg - .CountryCode, - TmpLen2, TmpFrame, - END_OF_ARGS); - } - } - FrameLen += TmpLen; - os_free_mem(TmpFrame); - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: Allocate memory fail!!!\n", - __func__)); - } -#endif - -#ifdef DOT11K_RRM_SUPPORT - - if (IS_RRM_ENABLE(wdev)) { - RRM_InsertRRMEnCapIE(pAd, pOutBuffer + FrameLen, - &FrameLen, apidx); - InsertChannelRepIE( - pAd, pOutBuffer + FrameLen, &FrameLen, - (RTMP_STRING *)pAd->CommonCfg.CountryCode, - get_regulatory_class(pAd, mbss->wdev.channel, - mbss->wdev.PhyMode, - &mbss->wdev), - NULL, PhyMode, wdev->func_idx); -#ifndef APPLE_11K_IOT - /* Insert BSS AC Access Delay IE. */ - RRM_InsertBssACDelayIE(pAd, pOutBuffer + FrameLen, - &FrameLen); - /* Insert BSS Available Access Capacity IE. */ - RRM_InsertBssAvailableACIE(pAd, pOutBuffer + FrameLen, - &FrameLen); -#endif /* !APPLE_11K_IOT */ - } -#endif /* DOT11K_RRM_SUPPORT */ - -#ifndef VENDOR_FEATURE7_SUPPORT - /* add Country IE and power-related IE */ - if (pAd->CommonCfg.bCountryFlag || - (wdev->channel > 14 && pAd->CommonCfg.bIEEE80211H == TRUE) -#ifdef DOT11K_RRM_SUPPORT - || IS_RRM_ENABLE(wdev) -#endif /* DOT11K_RRM_SUPPORT */ - ) { - ULONG TmpLen2 = 0; - UCHAR TmpFrame[256] = { 0 }; - UCHAR CountryIe = IE_COUNTRY; -#ifndef EXT_BUILD_CHANNEL_LIST - PCH_DESC pChDesc = NULL; - if (WMODE_CAP_2G(wdev->PhyMode)) { - if (pAd->CommonCfg.pChDesc2G != NULL) - pChDesc = (PCH_DESC)pAd->CommonCfg - .pChDesc2G; - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: pChDesc2G is NULL !!!\n", - __func__)); - } else if (WMODE_CAP_5G(wdev->PhyMode)) { - if (pAd->CommonCfg.pChDesc5G != NULL) - pChDesc = (PCH_DESC)pAd->CommonCfg - .pChDesc5G; - else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: pChDesc5G is NULL !!!\n", - __func__)); - } -#endif - /* - Only APs that comply with 802.11h or 802.11k are required to include - the Power Constraint element (IE=32) and - the TPC Report element (IE=35) and - the VHT Transmit Power Envelope element (IE=195) - in beacon frames and probe response frames - */ - if ((wdev->channel > 14 && - pAd->CommonCfg.bIEEE80211H == TRUE) -#ifdef DOT11K_RRM_SUPPORT - || IS_RRM_ENABLE(wdev) -#endif /* DOT11K_RRM_SUPPORT */ - ) { - /* prepare power constraint IE */ - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TmpLen, 3, PowerConstraintIE, - END_OF_ARGS); - FrameLen += TmpLen; - /* prepare TPC Report IE */ - InsertTpcReportIE(pAd, pOutBuffer + FrameLen, - &FrameLen, GetMaxTxPwr(pAd), - 0); -#ifdef DOT11_VHT_AC - /* prepare VHT Transmit Power Envelope IE */ - if (WMODE_CAP_AC(PhyMode)) { - ULONG TmpLen; - UINT8 vht_txpwr_env_ie = - IE_VHT_TXPWR_ENV; - UINT8 ie_len; - VHT_TXPWR_ENV_IE txpwr_env; - - ie_len = build_vht_txpwr_envelope( - pAd, wdev, (UCHAR *)&txpwr_env); - MakeOutgoingFrame(pOutBuffer + FrameLen, - &TmpLen, 1, - &vht_txpwr_env_ie, 1, - &ie_len, ie_len, - &txpwr_env, - END_OF_ARGS); - FrameLen += TmpLen; - } -#endif /* DOT11_VHT_AC */ - } - - /* NdisZeroMemory(TmpFrame, sizeof(TmpFrame)); */ -#ifdef EXT_BUILD_CHANNEL_LIST - BuildBeaconChList(pAd, wdev, TmpFrame, &TmpLen2); -#else - { - UINT i = 0; - UCHAR MaxTxPower = GetCuntryMaxTxPwr( - pAd, wdev->PhyMode, wdev, op_ht_bw); - - if (pChDesc != NULL) { - for (i = 0; - pChDesc[i].FirstChannel != 0; - i++) { - MakeOutgoingFrame( - TmpFrame + TmpLen2, - &TmpLen, 1, - &pChDesc[i].FirstChannel, - 1, &pChDesc[i].NumOfCh, - 1, &MaxTxPower, - END_OF_ARGS); - TmpLen2 += TmpLen; - } - } - } -#endif /* EXT_BUILD_CHANNEL_LIST */ - -#ifdef DOT11K_RRM_SUPPORT - - if (IS_RRM_ENABLE(wdev)) { - UCHAR reg_class = get_regulatory_class( - pAd, mbss->wdev.channel, - mbss->wdev.PhyMode, &mbss->wdev); - if (reg_class != 0) { - TmpLen2 = 0; - NdisZeroMemory(TmpFrame, - sizeof(TmpFrame)); - RguClass_BuildBcnChList(pAd, TmpFrame, - &TmpLen2, wdev, - reg_class); - } - } - -#endif /* DOT11K_RRM_SUPPORT */ -#ifdef MBO_SUPPORT - if (IS_MBO_ENABLE(wdev)) - Environment = MBO_AP_USE_GLOBAL_OPERATING_CLASS; -#endif /* MBO_SUPPORT */ - /* need to do the padding bit check, and concatenate it */ - if ((TmpLen2 % 2) == 0) { - UCHAR TmpLen3 = TmpLen2 + 4; - - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, 1, - &CountryIe, 1, &TmpLen3, 1, - &pAd->CommonCfg.CountryCode[0], 1, - &pAd->CommonCfg.CountryCode[1], 1, - &Environment, TmpLen2 + 1, TmpFrame, - END_OF_ARGS); - } else { - UCHAR TmpLen3 = TmpLen2 + 3; - - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, 1, - &CountryIe, 1, &TmpLen3, 1, - &pAd->CommonCfg.CountryCode[0], 1, - &pAd->CommonCfg.CountryCode[1], 1, - &Environment, TmpLen2, TmpFrame, - END_OF_ARGS); - } - - FrameLen += TmpLen; - } /* Country IE - */ -#endif -#ifdef A_BAND_SUPPORT - - /* add Channel switch announcement IE */ - if ((wdev->channel > 14) && (pAd->CommonCfg.bIEEE80211H == 1) && - (pDot11h->RDMode == RD_SWITCHING_MODE)) { - UCHAR CSAIe = IE_CHANNEL_SWITCH_ANNOUNCEMENT; - UCHAR CSALen = 3; - UCHAR CSAMode = 1; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &CSAIe, 1, &CSALen, 1, &CSAMode, 1, - &wdev->channel, 1, &pDot11h->CSCount, - END_OF_ARGS); - FrameLen += TmpLen; -#ifdef DOT11_N_SUPPORT - if (pAd->CommonCfg.bExtChannelSwitchAnnouncement) { - HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE - HtExtChannelSwitchIe; - - build_ext_channel_switch_ie( - pAd, &HtExtChannelSwitchIe, - wdev->channel, wdev->PhyMode, wdev); - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, - sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE), - &HtExtChannelSwitchIe, END_OF_ARGS); - FrameLen += TmpLen; - } -#endif /* DOT11_N_SUPPORT */ - } -#endif /* A_BAND_SUPPORT */ - -#ifdef DOT11_N_SUPPORT - if (WMODE_CAP_N(PhyMode) && - (wdev->DesiredHtPhyInfo.bHtEnable)) { -#ifdef DOT11_VHT_AC - struct _build_ie_info vht_ie_info; -#endif /*DOT11_VHT_AC*/ - if (pAd->bBroadComHT == TRUE) { - struct _build_ie_info ie_info; - - ie_info.frame_subtype = SUBTYPE_PROBE_RSP; - ie_info.channel = wdev->channel; - ie_info.phy_mode = wdev->PhyMode; - ie_info.wdev = wdev; - ie_info.is_draft_n_type = TRUE; - ie_info.frame_buf = - (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_ht_ies(pAd, &ie_info); - } -#ifdef DOT11_VHT_AC - vht_ie_info.frame_buf = - (UCHAR *)(pOutBuffer + FrameLen); - vht_ie_info.frame_subtype = SUBTYPE_PROBE_RSP; - vht_ie_info.channel = wdev->channel; - vht_ie_info.phy_mode = wdev->PhyMode; - vht_ie_info.wdev = wdev; - -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - ucETxBfCap = wlan_config_get_etxbf(wdev); - if (HcIsBfCapSupport(wdev) == FALSE) - wlan_config_set_etxbf(wdev, SUBF_OFF); - -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ - - FrameLen += build_vht_ies(pAd, &vht_ie_info); - -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - wlan_config_set_etxbf(wdev, ucETxBfCap); -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ -#endif /* DOT11_VHT_AC */ - } -#endif /* DOT11_N_SUPPORT */ - -#ifdef WSC_AP_SUPPORT - /* for windows 7 logo test */ - if ((mbss->WscControl.WscConfMode != WSC_DISABLE) && -#ifdef DOT1X_SUPPORT - (!IS_IEEE8021X_Entry(wdev)) && -#endif /* DOT1X_SUPPORT */ - (IS_CIPHER_WEP(wdev->SecConfig.PairwiseCipher))) { - /* - Non-WPS Windows XP and Vista PCs are unable to determine if a WEP enalbed network is static key based - or 802.1X based. If the legacy station gets an EAP-Rquest/Identity from the AP, it assume the WEP - network is 802.1X enabled & will prompt the user for 802.1X credentials. If the legacy station doesn't - receive anything after sending an EAPOL-Start, it will assume the WEP network is static key based and - prompt user for the WEP key. <> - A WPS enabled AP should include this IE in the beacon when the AP is hosting a static WEP key network. - The IE would be 7 bytes long with the Extended Capability field set to 0 (all bits zero) - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp - */ - ULONG TempLen1 = 0; - UCHAR PROVISION_SERVICE_IE[7] = { 0xDD, 0x05, 0x00, - 0x50, 0xF2, 0x05, - 0x00 }; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen1, 7, - PROVISION_SERVICE_IE, END_OF_ARGS); - FrameLen += TempLen1; - } - - /* add Simple Config Information Element */ -#ifdef DISABLE_HOSTAPD_PROBE_RESP - if (mbss->WscIEProbeResp.ValueLen) -#else - if ((mbss->WscControl.WscConfMode > WSC_DISABLE) && - (mbss->WscIEProbeResp.ValueLen)) -#endif - { - ULONG WscTmpLen = 0; - MakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen, - mbss->WscIEProbeResp.ValueLen, - mbss->WscIEProbeResp.Value, - END_OF_ARGS); - FrameLen += WscTmpLen; - } -#endif /* WSC_AP_SUPPORT */ - -#ifdef DOT11R_FT_SUPPORT - /* The Mobility Domain information element (MDIE) is present in Probe- - ** Request frame when dot11FastBssTransitionEnable is set to true. */ - if (pAd->ApCfg.MBSSID[apidx] - .wdev.FtCfg.FtCapFlag.Dot11rFtEnable) { - PFT_CFG pFtCfg = &pAd->ApCfg.MBSSID[apidx].wdev.FtCfg; - FT_CAP_AND_POLICY FtCap; - - FtCap.field.FtOverDs = pFtCfg->FtCapFlag.FtOverDs; - FtCap.field.RsrReqCap = pFtCfg->FtCapFlag.RsrReqCap; - FT_InsertMdIE(pAd, pOutBuffer + FrameLen, &FrameLen, - pFtCfg->FtMdId, FtCap); - } -#endif /* DOT11R_FT_SUPPORT */ - - /* - add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back - Byte0.b3=1 for rssi-feedback - */ - - FrameLen += build_vendor_ie(pAd, wdev, (pOutBuffer + FrameLen), - VIE_PROBE_RESP); - - { - /* Question to Rorscha: bit4 in old chip is used? but currently is using for 2.4G 256QAM */ - -#ifdef RSSI_FEEDBACK - UCHAR RalinkSpecificIe[9] = { IE_VENDOR_SPECIFIC, - 7, - 0x00, - 0x0c, - 0x43, - 0x00, - 0x00, - 0x00, - 0x00 }; - ULONG TmpLen; - - if (ProbeReqParam->bRequestRssi == TRUE) { - MAC_TABLE_ENTRY *pEntry = NULL; - - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("SYNC - Send PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\n", - PRINT_MAC(ProbeReqParam->Addr2))); - - RalinkSpecificIe[5] |= 0x8; - pEntry = MacTableLookup(pAd, - ProbeReqParam->Addr2); - - if (pEntry != NULL) { - RalinkSpecificIe[6] = - (UCHAR)pEntry->RssiSample - .AvgRssi[0]; - RalinkSpecificIe[7] = - (UCHAR)pEntry->RssiSample - .AvgRssi[1]; - RalinkSpecificIe[8] = - (UCHAR)pEntry->RssiSample - .AvgRssi[2]; - } - } - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 9, - RalinkSpecificIe, END_OF_ARGS); - FrameLen += TmpLen; -#endif /* RSSI_FEEDBACK */ - } - - /* 802.11n 11.1.3.2.2 active scanning. sending probe response with MCS rate is */ - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - /*MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);*/ - MlmeFreeMemory(pOutBuffer); - } -} - -VOID CFG80211_SyncPacketWpsIe(RTMP_ADAPTER *pAd, VOID *pData, ULONG dataLen, - UINT8 apidx, UINT8 *da) -{ - const UCHAR *ssid_ie = NULL, *wsc_ie = NULL; - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; - EID_STRUCT *eid; - const UINT WFA_OUI = 0x0050F2; - PEER_PROBE_REQ_PARAM ProbeReqParam; - - ssid_ie = cfg80211_find_ie(WLAN_EID_SSID, pData, dataLen); - ProbeReqParam.SsidLen = 0; - if (ssid_ie != NULL) { - eid = (EID_STRUCT *)ssid_ie; - ProbeReqParam.SsidLen = eid->Len; - NdisCopyMemory(ProbeReqParam.Ssid, ssid_ie + 2, eid->Len); - NdisCopyMemory(ProbeReqParam.Addr2, da, MAC_ADDR_LEN); - } - wsc_ie = (UCHAR *)cfg80211_find_vendor_ie(WFA_OUI, 4, pData, dataLen); - if (wsc_ie != NULL) { - eid = (EID_STRUCT *)wsc_ie; - - if (eid->Len + 2 <= 500) { - NdisCopyMemory(pMbss->WscIEProbeResp.Value, wsc_ie, - eid->Len + 2); - pMbss->WscIEProbeResp.ValueLen = eid->Len + 2; - } - } - ProbeResponseHandler(pAd, &ProbeReqParam, apidx); -} - -#endif /*DISABLE_HOSTAPD_PROBE_RESP */ - -BOOLEAN CFG80211_SyncPacketWmmIe(RTMP_ADAPTER *pAd, VOID *pData, ULONG dataLen) -{ - const UINT WFA_OUI = 0x0050F2; - const UCHAR WMM_OUI_TYPE = 0x2; - UCHAR *wmm_ie = NULL; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[BSS0].wdev; - EDCA_PARM *pBssEdca = NULL; - /* hex_dump("probe_rsp_in:", pData, dataLen); */ - wmm_ie = (UCHAR *)cfg80211_find_vendor_ie(WFA_OUI, WMM_OUI_TYPE, pData, - dataLen); - - if (wmm_ie != NULL) { - UINT i = QID_AC_BE; -#ifdef UAPSD_SUPPORT -#endif /* UAPSD_SUPPORT */ - - pBssEdca = wlan_config_get_ht_edca(wdev); - if (pBssEdca) { - /* WMM: sync from driver's EDCA paramter */ - for (i = QID_AC_BK; i <= QID_AC_VO; i++) { - wmm_ie[10 + (i * 4)] = - (i << 5) + /* b5-6 is ACI */ - ((UCHAR)pBssEdca->bACM[i] - << 4) + /* b4 is ACM */ - (pBssEdca->Aifsn[i] & - 0x0f); /* b0-3 is AIFSN */ - wmm_ie[11 + (i * 4)] = - (pBssEdca->Cwmax[i] - << 4) + /* b5-8 is CWMAX */ - (pBssEdca->Cwmin[i] & - 0x0f); /* b0-3 is CWMIN */ - wmm_ie[12 + (i * 4)] = - (UCHAR)(pBssEdca->Txop[i] & - 0xff); /* low byte of TXOP */ - wmm_ie[13 + (i * 4)] = - (UCHAR)(pBssEdca->Txop[i] >> - 8); /* high byte of TXOP */ - } - } - return TRUE; - } else - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: can't find the wmm ie\n", __func__)); - - return FALSE; -} -#endif /* CONFIG_AP_SUPPORT */ - -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_SAE_SUPPORT) -VOID CFG80211_AuthRespHandler(RTMP_ADAPTER *pAd, VOID *pData, ULONG Data) -{ - AUTH_FRAME_INFO *auth_info = NULL; /* auth info from hostapd */ - MAC_TABLE_ENTRY *pEntry; - STA_TR_ENTRY *tr_entry; -#ifdef DOT11R_FT_SUPPORT - PFT_CFG pFtCfg; - PFT_INFO pFtInfo; -#endif /* DOT11R_FT_SUPPORT */ - BSS_STRUCT *pMbss; - struct wifi_dev *wdev; - - struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)pData; - - UINT8 apidx = get_apidx_by_addr(pAd, mgmt->sa); - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AUTH - %s\n", __func__)); - - os_alloc_mem_suspend(pAd, (UCHAR **)&auth_info, - sizeof(AUTH_FRAME_INFO)); - - if (!auth_info) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("auth_info: Mem Alloc fail!\n")); - return; - } - - os_zero_mem(auth_info, sizeof(AUTH_FRAME_INFO)); - - pMbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &pMbss->wdev; - ASSERT((wdev->func_idx == apidx)); - - pEntry = MacTableLookup(pAd, mgmt->da); - if (pEntry && IS_ENTRY_CLIENT(pEntry)) { - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; -#ifdef DOT11W_PMF_SUPPORT - if ((pEntry->SecConfig.PmfCfg.UsePMFConnect == TRUE) && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) - goto SendAuth; -#endif /* DOT11W_PMF_SUPPORT */ - - if (!RTMPEqualMemory( - mgmt->sa, - pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid, - MAC_ADDR_LEN)) { - MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); - pEntry = NULL; - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("AUTH - Bssid does not match\n")); - } else { -#ifdef DOT11_N_SUPPORT - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s:ENTRY ALREADY EXIST, TERADOWN BLOCKACK SESSION\n", - __func__)); - ba_session_tear_down_all(pAd, pEntry->wcid); -#endif /* DOT11_N_SUPPORT */ - } - } - -#ifdef DOT11W_PMF_SUPPORT -SendAuth: -#endif /* DOT11W_PMF_SUPPORT */ - -#ifdef DOT11R_FT_SUPPORT - pFtCfg = &wdev->FtCfg; - if ((pFtCfg->FtCapFlag.Dot11rFtEnable) && - (mgmt->u.auth.auth_alg == AUTH_MODE_FT)) { - /* USHORT result; */ - - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, mgmt->da, wdev, - ENTRY_CLIENT, OPMODE_AP, - TRUE); - - if (pEntry != NULL) { - /* fill auth info from upper layer response */ - COPY_MAC_ADDR(auth_info->addr2, mgmt->da); - COPY_MAC_ADDR(auth_info->addr1, wdev->if_addr); - auth_info->auth_alg = mgmt->u.auth.auth_alg; - auth_info->auth_seq = mgmt->u.auth.auth_transaction; - auth_info->auth_status = mgmt->u.auth.status_code; - - /* os_alloc_mem(pAd, (UCHAR **)&pFtInfoBuf, sizeof(FT_INFO)); */ - pFtInfo = &(pEntry->auth_info_resp.FtInfo); - { - PEID_STRUCT eid_ptr; - UCHAR *Ptr; - UCHAR WPA2_OUI[3] = { 0x00, 0x0F, 0xAC }; - /* PFT_INFO pFtInfo = &auth_info->FtInfo; */ - - NdisZeroMemory(pFtInfo, sizeof(FT_INFO)); - - /* Ptr = &Fr->Octet[6]; */ - Ptr = mgmt->u.auth.variable; - eid_ptr = (PEID_STRUCT)Ptr; - - /* get variable fields from payload and advance the pointer */ - while (((UCHAR *)eid_ptr + eid_ptr->Len + 1) < - ((UCHAR *)mgmt + Data)) { - switch (eid_ptr->Eid) { - case IE_FT_MDIE: - FT_FillMdIeInfo( - eid_ptr, - &pFtInfo->MdIeInfo); - break; - - case IE_FT_FTIE: - FT_FillFtIeInfo( - eid_ptr, - &pFtInfo->FtIeInfo); - break; - - case IE_FT_RIC_DATA: - /* record the pointer of first RDIE. */ - if (pFtInfo->RicInfo.pRicInfo == - NULL) { - pFtInfo->RicInfo - .pRicInfo = - &eid_ptr->Eid; - pFtInfo->RicInfo.Len = - ((UCHAR *)mgmt + - Data) - - (UCHAR *)eid_ptr + - 1; - } - - if ((pFtInfo->RicInfo.RicIEsLen + - eid_ptr->Len + 2) < - MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfo->RicInfo - .RicIEs[pFtInfo->RicInfo - .RicIEsLen], - &eid_ptr->Eid, - eid_ptr->Len + - 2); - pFtInfo->RicInfo - .RicIEsLen += - eid_ptr->Len + - 2; - } - break; - - case IE_FT_RIC_DESCRIPTOR: - if ((pFtInfo->RicInfo.RicIEsLen + - eid_ptr->Len + 2) < - MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfo->RicInfo - .RicIEs[pFtInfo->RicInfo - .RicIEsLen], - &eid_ptr->Eid, - eid_ptr->Len + - 2); - pFtInfo->RicInfo - .RicIEsLen += - eid_ptr->Len + - 2; - } - break; - - case IE_RSN: - if (NdisEqualMemory( - &eid_ptr->Octet[2], - WPA2_OUI, - sizeof(WPA2_OUI))) { - NdisMoveMemory( - pFtInfo->RSN_IE, - eid_ptr, - eid_ptr->Len + - 2); - pFtInfo->RSNIE_Len = - eid_ptr->Len + - 2; - } - break; - - default: - break; - } - eid_ptr = - (PEID_STRUCT)((UCHAR *)eid_ptr + - 2 + eid_ptr->Len); - } - } - - if (mgmt->u.auth.status_code == MLME_SUCCESS) { - NdisMoveMemory(&pEntry->MdIeInfo, - &auth_info->FtInfo.MdIeInfo, - sizeof(FT_MDIE_INFO)); - - pEntry->AuthState = AS_AUTH_OPEN; - /*According to specific, if it already in SST_ASSOC, it can not go back */ - if (pEntry->Sst != SST_ASSOC) - pEntry->Sst = SST_AUTH; -#ifdef RADIUS_MAC_AUTH_SUPPORT - if (pEntry->wdev->radius_mac_auth_enable) - pEntry->bAllowTraffic = TRUE; -#endif - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: AuthState:%d, Sst:%d\n", __func__, - pEntry->AuthState, pEntry->Sst)); - } -#ifdef RADIUS_MAC_AUTH_SUPPORT - else { - if (pEntry->wdev->radius_mac_auth_enable) { - pEntry->bAllowTraffic = FALSE; - MlmeDeAuthAction(pAd, pEntry, - REASON_NO_LONGER_VALID, - FALSE); - } - } -#endif - } - os_free_mem(auth_info); - return; - } else -#endif /* DOT11R_FT_SUPPORT */ -#ifdef HOSTAPD_SAE_SUPPORT - if (mgmt->u.auth.auth_alg == AUTH_MODE_SAE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("SAE Auth Response Sequence %d \n", - mgmt->u.auth.auth_transaction)); - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, mgmt->da, wdev, - ENTRY_CLIENT, OPMODE_AP, - TRUE); - - if (pEntry) { - if (mgmt->u.auth.status_code == MLME_SUCCESS) { - pEntry->AuthState = AS_AUTH_OPEN; - /*According to specific, if it already in SST_ASSOC, it can not go back */ - if (pEntry->Sst != SST_ASSOC) - pEntry->Sst = SST_AUTH; -#ifdef RADIUS_MAC_AUTH_SUPPORT - if (pEntry->wdev->radius_mac_auth_enable) - pEntry->bAllowTraffic = TRUE; -#endif - } else { -#ifdef RADIUS_MAC_AUTH_SUPPORT - if (pEntry->wdev->radius_mac_auth_enable) { - pEntry->bAllowTraffic = FALSE; - MlmeDeAuthAction(pAd, pEntry, - REASON_NO_LONGER_VALID, - FALSE); - } -#endif - } - } - } else -#endif - if ((auth_info->auth_alg == AUTH_MODE_OPEN) && - (!IS_AKM_SHARED(pMbss->wdev.SecConfig.AKMMap))) { - if (!pEntry) - pEntry = MacTableInsertEntry(pAd, auth_info->addr2, - wdev, ENTRY_CLIENT, - OPMODE_AP, TRUE); - - if (pEntry) { - tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; -#ifdef DOT11W_PMF_SUPPORT - if ((pEntry->SecConfig.PmfCfg.UsePMFConnect == FALSE) || - (tr_entry->PortSecured != WPA_802_1X_PORT_SECURED)) -#endif /* DOT11W_PMF_SUPPORT */ - { - pEntry->AuthState = AS_AUTH_OPEN; - /*According to specific, if it already in SST_ASSOC, it can not go back */ - if (pEntry->Sst != SST_ASSOC) - pEntry->Sst = SST_AUTH; - } - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: pEntry created: auth state:%d, Sst:%d", - __func__, pEntry->AuthState, pEntry->Sst)); - /* APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_SUCCESS); */ - - } else - ; /* MAC table full, what should we respond ????? */ - } else { - /* wrong algorithm */ - /* APPeerAuthSimpleRspGenAndSend(pAd, pRcvHdr, auth_info.auth_alg, auth_info.auth_seq + 1, MLME_ALG_NOT_SUPPORT); */ - - /* If this STA exists, delete it. */ - if (pEntry) - MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr); - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AUTH - Alg=%d, Seq=%d\n", auth_info->auth_alg, - auth_info->auth_seq)); - } - os_free_mem(auth_info); -} - -VOID CFG80211_AssocRespHandler(RTMP_ADAPTER *pAd, VOID *pData, ULONG Data) -{ - struct wifi_dev *wdev = NULL; - struct dev_rate_info *rate; - BSS_STRUCT *pMbss; - /* BOOLEAN bAssocSkip = FALSE; */ - /* CHAR rssi; */ - IE_LISTS *ie_list = NULL; - HEADER_802_11 AssocRspHdr; - /* HEADER_802_11 AssocReqHdr; */ - USHORT CapabilityInfoForAssocResp; - USHORT StatusCode = MLME_SUCCESS; - USHORT Aid; - PUCHAR pOutBuffer = NULL; - NDIS_STATUS NStatus; - ULONG FrameLen = 0; - UCHAR SupRateLen, PhyMode, FlgIs11bSta; - UCHAR i; -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - UCHAR ucETxBfCap; -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ - MAC_TABLE_ENTRY *pEntry = NULL; - STA_TR_ENTRY *tr_entry; - UCHAR isReassoc; - UCHAR SubType; - /* BOOLEAN bACLReject = FALSE; */ -#ifdef DOT1X_SUPPORT - PUINT8 pPmkid = NULL; - UINT8 pmkid_count = 0; -#endif /* DOT1X_SUPPORT */ -#ifdef DOT11R_FT_SUPPORT - PFT_CFG pFtCfg = NULL; - PFT_INFO pFtInfoBuf = NULL; /*Wframe-larger-than=1024 warning removal*/ - PEID_STRUCT pFtIe = NULL; -#endif /* DOT11R_FT_SUPPORT */ -#ifdef HOSTAPD_OWE_SUPPORT - PEID_STRUCT pEcdhIe = NULL; - PEID_STRUCT pRsnIe = NULL; -#endif -#ifdef WSC_AP_SUPPORT - WSC_CTRL *wsc_ctrl; -#endif /* WSC_AP_SUPPORT */ - ADD_HT_INFO_IE *addht; - struct _build_ie_info ie_info; -#ifdef GREENAP_SUPPORT - struct greenap_ctrl *greenap = &pAd->ApCfg.greenap; -#endif /* GREENAP_SUPPORT */ -#ifdef WAPP_SUPPORT - /* UINT8 wapp_cnnct_stage = WAPP_ASSOC; */ - UINT16 wapp_assoc_fail = NOT_FAILURE; -#endif /* WAPP_SUPPORT */ - - struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)pData; - - UINT8 apidx = get_apidx_by_addr(pAd, mgmt->sa); - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ASSOC - %s\n", __func__)); - - pMbss = &pAd->ApCfg.MBSSID[apidx]; - wdev = &pMbss->wdev; - if (wdev == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Wrong Addr1 - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(mgmt->sa))); - goto LabelOK; - } - ASSERT((wdev->func_idx == apidx)); - -#ifdef WSC_AP_SUPPORT - wsc_ctrl = &pMbss->WscControl; -#endif /* WSC_AP_SUPPORT */ - - PhyMode = wdev->PhyMode; - rate = &wdev->rate; - addht = wlan_operate_get_addht(wdev); - FlgIs11bSta = 1; - - pEntry = MacTableLookup(pAd, mgmt->da); - - if (!pEntry) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("NoAuth MAC - %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(mgmt->da))); - goto LabelOK; - } - - ie_list = pEntry->ie_list; - -#ifdef DOT11R_FT_SUPPORT - os_alloc_mem(NULL, (UCHAR **)&pFtInfoBuf, sizeof(FT_INFO)); - if (pFtInfoBuf == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): pFtInfoBuf mem alloc failed\n", __func__)); - goto LabelOK; - } - NdisZeroMemory(pFtInfoBuf, sizeof(FT_INFO)); -#endif /* DOT11R_FT_SUPPORT */ - - for (i = 0; i < ie_list->SupportedRatesLen; i++) { - if (((ie_list->SupportedRates[i] & 0x7F) != 2) && - ((ie_list->SupportedRates[i] & 0x7F) != 4) && - ((ie_list->SupportedRates[i] & 0x7F) != 11) && - ((ie_list->SupportedRates[i] & 0x7F) != 22)) { - FlgIs11bSta = 0; - break; - } - } - - if (!VALID_MBSS(pAd, pEntry->func_tb_idx)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():pEntry bounding invalid wdev(apidx=%d)\n", - __func__, pEntry->func_tb_idx)); - goto LabelOK; - } - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():pEntry->func_tb_idx=%d\n", __func__, - pEntry->func_tb_idx)); - - tr_entry = &pAd->MacTab.tr_entry[pEntry->tr_tb_idx]; - - isReassoc = ieee80211_is_reassoc_resp(mgmt->frame_control); - - /* 2. qualify this STA's auth_asoc status in the MAC table, decide StatusCode */ - StatusCode = - APBuildAssociation(pAd, pEntry, pEntry->ie_list, - pEntry->MaxSupportedRate, &Aid, isReassoc); - if (mgmt->u.reassoc_resp.status_code != MLME_SUCCESS) - StatusCode = mgmt->u.reassoc_resp.status_code; - -#ifdef WAPP_SUPPORT - if (StatusCode != MLME_SUCCESS) - wapp_assoc_fail = MLME_UNABLE_HANDLE_STA; -#endif /* WAPP_SUPPORT */ - - /*is status is success ,update STARec*/ - if (StatusCode == MLME_SUCCESS && (pEntry->Sst == SST_ASSOC)) { - if (wdev_do_conn_act(pEntry->wdev, pEntry) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():connect action fail!!\n", __func__)); - } - } - if (pEntry->func_tb_idx < pAd->ApCfg.BssidNum) { - BOOLEAN bExtractIe = FALSE; -#ifdef DOT11R_FT_SUPPORT - pFtCfg = &(wdev->FtCfg); - if ((pFtCfg->FtCapFlag.Dot11rFtEnable) && - (StatusCode == MLME_SUCCESS)) - bExtractIe = TRUE; -#endif -#ifdef HOSTAPD_OWE_SUPPORT - if (wdev && IS_AKM_OWE(wdev->SecConfig.AKMMap)) - bExtractIe = TRUE; -#endif - if (bExtractIe) { - PEID_STRUCT eid_ptr; - UCHAR *Ptr; - UCHAR WPA2_OUI[3] = { 0x00, 0x0F, 0xAC }; - /* PFT_INFO pFtInfo = &auth_info->FtInfo; */ - - NdisZeroMemory(pFtInfoBuf, sizeof(FT_INFO)); - - /* Ptr = &Fr->Octet[6]; */ - Ptr = mgmt->u.reassoc_resp.variable; - eid_ptr = (PEID_STRUCT)Ptr; - - /* get variable fields from payload and advance the pointer */ - while (((UCHAR *)eid_ptr + eid_ptr->Len + 1) < - ((UCHAR *)mgmt + Data)) { - switch (eid_ptr->Eid) { -#ifdef DOT11R_FT_SUPPORT - case IE_FT_MDIE: - FT_FillMdIeInfo(eid_ptr, - &pFtInfoBuf->MdIeInfo); - break; - - case IE_FT_FTIE: - pFtIe = eid_ptr; - FT_FillFtIeInfo(eid_ptr, - &pFtInfoBuf->FtIeInfo); - break; - - case IE_FT_RIC_DATA: - /* record the pointer of first RDIE. */ - if (pFtInfoBuf->RicInfo.pRicInfo == - NULL) { - pFtInfoBuf->RicInfo.pRicInfo = - &eid_ptr->Eid; - pFtInfoBuf->RicInfo.Len = - ((UCHAR *)mgmt + Data) - - (UCHAR *)eid_ptr + 1; - } - - if ((pFtInfoBuf->RicInfo.RicIEsLen + - eid_ptr->Len + 2) < - MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfoBuf->RicInfo.RicIEs - [pFtInfoBuf - ->RicInfo - .RicIEsLen], - &eid_ptr->Eid, - eid_ptr->Len + 2); - pFtInfoBuf->RicInfo.RicIEsLen += - eid_ptr->Len + 2; - } - break; - - case IE_FT_RIC_DESCRIPTOR: - if ((pFtInfoBuf->RicInfo.RicIEsLen + - eid_ptr->Len + 2) < - MAX_RICIES_LEN) { - NdisMoveMemory( - &pFtInfoBuf->RicInfo.RicIEs - [pFtInfoBuf - ->RicInfo - .RicIEsLen], - &eid_ptr->Eid, - eid_ptr->Len + 2); - pFtInfoBuf->RicInfo.RicIEsLen += - eid_ptr->Len + 2; - } - break; -#endif -#if defined(DOT11R_FT_SUPPORT) || defined(HOSTAPD_OWE_SUPPORT) - - case IE_RSN: - if (NdisEqualMemory(&eid_ptr->Octet[2], - WPA2_OUI, - sizeof(WPA2_OUI))) { -#ifdef DOT11R_FT_SUPPORT - NdisMoveMemory( - pFtInfoBuf->RSN_IE, - eid_ptr, - eid_ptr->Len + 2); - pFtInfoBuf->RSNIE_Len = - eid_ptr->Len + 2; -#endif -#ifdef HOSTAPD_OWE_SUPPORT - pRsnIe = eid_ptr; -#endif - } - break; -#endif -#ifdef HOSTAPD_OWE_SUPPORT - case IE_WLAN_EXTENSION: { - /*parse EXTENSION EID*/ - UCHAR *extension_id = - (UCHAR *)eid_ptr + 2; - - switch (*extension_id) { - case IE_EXTENSION_ID_ECDH: - pEcdhIe = eid_ptr; - } - } break; -#endif - - default: - break; - } - eid_ptr = (PEID_STRUCT)((UCHAR *)eid_ptr + 2 + - eid_ptr->Len); - } - } - - if (mgmt->u.reassoc_resp.status_code == MLME_SUCCESS) { - /* NdisMoveMemory(&pEntry->MdIeInfo, &auth_info.FtInfo.MdIeInfo, sizeof(FT_MDIE_INFO)); - * - * pEntry->AuthState = AS_AUTH_OPEN; - * pEntry->Sst = SST_AUTH; -*/ - } - } - /* just silencely discard this frame */ - /*if (StatusCode == 0xFFFF) - * goto LabelOK; - */ - -#ifdef DOT11K_RRM_SUPPORT - if ((pEntry->func_tb_idx < pAd->ApCfg.BssidNum) && IS_RRM_ENABLE(wdev)) - pEntry->RrmEnCap.word = ie_list->RrmEnCap.word; -#endif /* DOT11K_RRM_SUPPORT */ - -#ifdef DOT11_VHT_AC - if (ie_list->vht_cap_len) { - /* +++Add by shiang for debug */ - if (WMODE_CAP_AC(wdev->PhyMode)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s():Peer is VHT capable device!\n", - __func__)); - NdisMoveMemory(&pEntry->ext_cap, &ie_list->ExtCapInfo, - sizeof(ie_list->ExtCapInfo)); - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("\tOperatingModeNotification=%d\n", - pEntry->ext_cap.operating_mode_notification)); - /* dump_vht_cap(pAd, &ie_list->vht_cap); */ - } - - /* ---Add by shiang for debug */ - } -#endif /* DOT11_VHT_AC */ - - if (StatusCode == MLME_ASSOC_REJ_DATA_RATE) - RTMPSendWirelessEvent(pAd, IW_STA_MODE_EVENT_FLAG, pEntry->Addr, - wdev->wdev_idx, 0); - -#ifdef DOT11W_PMF_SUPPORT - /* SendAssocResponse: */ -#endif /* DOT11W_PMF_SUPPORT */ - /* 3. send Association Response */ - NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); - - if (NStatus != NDIS_STATUS_SUCCESS) - goto LabelOK; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Reassoc - Send reassoc response (Status=%d)...\n", - StatusCode)); - Aid |= 0xc000; /* 2 most significant bits should be ON */ - SubType = isReassoc ? SUBTYPE_REASSOC_RSP : SUBTYPE_ASSOC_RSP; - CapabilityInfoForAssocResp = - pMbss->CapabilityInfo; /*use AP's cability */ -#ifdef WSC_AP_SUPPORT -#ifdef WSC_V2_SUPPORT - - if ((wsc_ctrl->WscV2Info.bEnableWpsV2) && - (wsc_ctrl->WscV2Info.bWpsEnable == FALSE)) - ; - else -#endif /* WSC_V2_SUPPORT */ - { - if ((wsc_ctrl->WscConfMode != WSC_DISABLE) && - (ie_list->CapabilityInfo & 0x0010)) - CapabilityInfoForAssocResp |= 0x0010; - } - -#endif /* WSC_AP_SUPPORT */ - /* fail in ACL checking => send an Assoc-Fail resp. */ - SupRateLen = rate->SupRateLen; - - /* TODO: need to check rate in support rate element, not number */ - if (FlgIs11bSta == 1) - SupRateLen = 4; - MgtMacHeaderInit(pAd, &AssocRspHdr, SubType, 0, ie_list->Addr2, - wdev->if_addr, wdev->bssid); - MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), - &AssocRspHdr, 2, &CapabilityInfoForAssocResp, 2, - &StatusCode, 2, &Aid, 1, &SupRateIe, 1, &SupRateLen, - SupRateLen, rate->SupRate, END_OF_ARGS); - - if ((rate->ExtRateLen) && (PhyMode != WMODE_B) && (FlgIs11bSta == 0)) { - ULONG TmpLen; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &ExtRateIe, - 1, &rate->ExtRateLen, rate->ExtRateLen, - rate->ExtRate, END_OF_ARGS); - FrameLen += TmpLen; - } - -#ifdef CONFIG_MAP_SUPPORT - if (IS_MAP_ENABLE(pAd)) { - pEntry->DevPeerRole = ie_list->MAP_AttriValue; - MAP_InsertMapCapIE(pAd, wdev, pOutBuffer + FrameLen, &FrameLen); - } -#endif /* CONFIG_MAP_SUPPORT */ - -#ifdef DOT11K_RRM_SUPPORT - - if (IS_RRM_ENABLE(wdev)) - RRM_InsertRRMEnCapIE(pAd, pOutBuffer + FrameLen, &FrameLen, - pEntry->func_tb_idx); - -#endif /* DOT11K_RRM_SUPPORT */ - - ie_info.wdev = wdev; - - /* add WMM IE here */ - /* printk("%s()=>bWmmCapable=%d,CLINE=%d\n",__FUNCTION__,wdev->bWmmCapable,CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)); */ - ie_info.is_draft_n_type = FALSE; - if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)) { - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_wmm_cap_ie(pAd, &ie_info); - } - ie_info.frame_subtype = SUBTYPE_ASSOC_RSP; - ie_info.channel = wdev->channel; - ie_info.phy_mode = PhyMode; - ie_info.wdev = wdev; -#ifdef DOT11W_PMF_SUPPORT - - if (StatusCode == MLME_ASSOC_REJ_TEMPORARILY) { - ULONG TmpLen; - UCHAR IEType = IE_TIMEOUT_INTERVAL; /* IE:0x15 */ - UCHAR IELen = 5; - UCHAR TIType = 3; - UINT32 units = 1 << 10; /* 1 seconds, should be 0x3E8 */ - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &IEType, 1, - &IELen, 1, &TIType, 4, &units, END_OF_ARGS); - FrameLen += TmpLen; - } - -#endif /* DOT11W_PMF_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - /* HT capability in AssocRsp frame. */ - if ((ie_list->ht_cap_len > 0) && WMODE_CAP_N(wdev->PhyMode) && - (wdev->DesiredHtPhyInfo.bHtEnable)) { -#ifdef DOT11_VHT_AC - struct _build_ie_info vht_ie_info; -#endif /* DOT11_VHT_AC */ - - ie_info.is_draft_n_type = FALSE; - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_ht_ies(pAd, &ie_info); - - if ((ie_list->vendor_ie.ra_cap) == 0 || - (pAd->bBroadComHT == TRUE)) { - ie_info.is_draft_n_type = TRUE; - ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - FrameLen += build_ht_ies(pAd, &ie_info); - } -#ifdef DOT11_VHT_AC - vht_ie_info.frame_buf = (UCHAR *)(pOutBuffer + FrameLen); - vht_ie_info.frame_subtype = SUBTYPE_ASSOC_RSP; - vht_ie_info.channel = wdev->channel; - vht_ie_info.phy_mode = wdev->PhyMode; - vht_ie_info.wdev = wdev; -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - ucETxBfCap = wlan_config_get_etxbf(wdev); - - if (HcIsBfCapSupport(wdev) == FALSE) - wlan_config_set_etxbf(wdev, SUBF_OFF); - -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ - FrameLen += build_vht_ies(pAd, &vht_ie_info); -#if defined(TXBF_SUPPORT) && defined(VHT_TXBF_SUPPORT) - wlan_config_set_etxbf(wdev, ucETxBfCap); -#endif /* TXBF_SUPPORT && VHT_TXBF_SUPPORT */ -#endif /* DOT11_VHT_AC */ - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef CONFIG_HOTSPOT_R2 - /* qosmap IE */ - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("entry wcid %d QosMapSupport=%d\n", pEntry->wcid, - pEntry->QosMapSupport)); - - if (pEntry->QosMapSupport) { - ULONG TmpLen; - UCHAR QosMapIE, ielen = 0, explen = 0; - PHOTSPOT_CTRL pHSCtrl = - &pAd->ApCfg.MBSSID[pEntry->apidx].HotSpotCtrl; - - if (pHSCtrl->QosMapEnable) { - QosMapIE = IE_QOS_MAP_SET; - - /* Fixed field Dscp range:16, len:1 IE_ID:1*/ - if (pHSCtrl->QosMapSetIELen > 18) - explen = pHSCtrl->QosMapSetIELen - 18; - - pEntry->DscpExceptionCount = explen; - memcpy((UCHAR *)pEntry->DscpRange, - (UCHAR *)pHSCtrl->DscpRange, 16); - memcpy((UCHAR *)pEntry->DscpException, - (UCHAR *)pHSCtrl->DscpException, 42); - ielen = explen + 16; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &QosMapIE, 1, &ielen, explen, - pEntry->DscpException, 16, - pEntry->DscpRange, END_OF_ARGS); - FrameLen += TmpLen; - } - } - -#endif /* CONFIG_HOTSPOT_R2 */ - - if (IS_AKM_OWE_Entry(pEntry)) { - CHAR rsne_idx; - ULONG TmpLen; - struct _SECURITY_CONFIG *pSecConfig = &pEntry->SecConfig; - /*struct _SECURITY_CONFIG *pSecConfig = &wdev->SecConfig;*/ - - WPAMakeRSNIE(wdev->wdev_type, pSecConfig, pEntry); - - for (rsne_idx = 0; rsne_idx < SEC_RSNIE_NUM; rsne_idx++) { - if (pSecConfig->RSNE_Type[rsne_idx] == SEC_RSNIE_NONE) - continue; - - MakeOutgoingFrame( - pOutBuffer + FrameLen, &TmpLen, 1, - &pSecConfig->RSNE_EID[rsne_idx][0], 1, - &pSecConfig->RSNE_Len[rsne_idx], - pSecConfig->RSNE_Len[rsne_idx], - &pSecConfig->RSNE_Content[rsne_idx][0], - END_OF_ARGS); - FrameLen += TmpLen; - } - } - - /* 7.3.2.27 Extended Capabilities IE */ - { - ULONG TmpLen, infoPos; - PUCHAR pInfo; - UCHAR extInfoLen; - BOOLEAN bNeedAppendExtIE = FALSE; - EXT_CAP_INFO_ELEMENT extCapInfo; -#ifdef RT_BIG_ENDIAN - UCHAR *pextCapInfo; -#endif - - extInfoLen = sizeof(EXT_CAP_INFO_ELEMENT); - NdisZeroMemory(&extCapInfo, extInfoLen); -#ifdef DOT11_N_SUPPORT -#ifdef DOT11N_DRAFT3 - - /* P802.11n_D1.10, HT Information Exchange Support */ - if (WMODE_CAP_N(wdev->PhyMode) && (wdev->channel <= 14) && - (pAd->CommonCfg.bBssCoexEnable == TRUE)) - extCapInfo.BssCoexistMgmtSupport = 1; - -#endif /* DOT11N_DRAFT3 */ -#endif /* DOT11_N_SUPPORT */ -#ifdef CONFIG_DOT11V_WNM - /* #ifdef CONFIG_HOTSPOT_R2 Remove for WNM independance */ - - if (ie_list->ExtCapInfo.BssTransitionManmt == 1) { - pEntry->bBSSMantSTASupport = TRUE; - if (pMbss->WNMCtrl.WNMBTMEnable) - extCapInfo.BssTransitionManmt = 1; - } - /* #endif CONFIG_HOTSPOT_R2 */ -#endif /* CONFIG_DOT11V_WNM */ - -#ifdef CONFIG_DOT11U_INTERWORKING - if (pMbss->GASCtrl.b11U_enable) - extCapInfo.interworking = 1; -#endif /* CONFIG_DOT11U_INTERWORKING */ - -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(wdev->PhyMode) && (wdev->channel > 14)) - extCapInfo.operating_mode_notification = 1; - -#endif /* DOT11_VHT_AC */ -#ifdef FTM_SUPPORT - - /* add IE_EXT_CAPABILITY IE here */ - if (pAd->pFtmCtrl->bSetCivicRpt) - extCapInfo.civic_location = 1; - - if (pAd->pFtmCtrl->bSetLciRpt) - extCapInfo.geospatial_location = 1; - - /* 802.11mc D3.0: 10.24.6.2 (p.1717): - "A STA in which dot11FineTimingMsmtRespActivated is true shall set the Fine Timing Measurement - Responder field of the Extended Capabilities element to 1." - */ - /* 8.4.2.26 Extended Capabilities element (p.817): - Capabilities field= 70: Fine Timing Measurement Responder (p.823) - */ - extCapInfo.ftm_resp = 1; -#endif /* FTM_SUPPORT */ -#ifdef RT_BIG_ENDIAN - pextCapInfo = (UCHAR *)&extCapInfo; - *((UINT32 *)pextCapInfo) = cpu2le32(*((UINT32 *)pextCapInfo)); - pextCapInfo = (UCHAR *)&extCapInfo; - *((UINT32 *)(pextCapInfo + 4)) = - cpu2le32(*((UINT32 *)(pextCapInfo + 4))); -#endif - - pInfo = (UCHAR *)(&extCapInfo); - - for (infoPos = 0; infoPos < extInfoLen; infoPos++) { - if (pInfo[infoPos] != 0) { - bNeedAppendExtIE = TRUE; - break; - } - } - - if (bNeedAppendExtIE == TRUE) { - for (infoPos = (extInfoLen - 1); - infoPos >= EXT_CAP_MIN_SAFE_LENGTH; infoPos--) { - if (pInfo[infoPos] == 0) - extInfoLen--; - else - break; - } -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)&extCapInfo, 8); -#endif - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, - &ExtCapIe, 1, &extInfoLen, extInfoLen, - &extCapInfo, END_OF_ARGS); - FrameLen += TmpLen; - } - } - /* add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back */ - FrameLen += build_vendor_ie(pAd, wdev, (pOutBuffer + FrameLen), - VIE_ASSOC_RESP); - -#ifdef MBO_SUPPORT - if (IS_MBO_ENABLE(wdev)) - MakeMboOceIE(pAd, wdev, pOutBuffer + FrameLen, &FrameLen, - MBO_FRAME_TYPE_ASSOC_RSP); -#endif /* MBO_SUPPORT */ -#ifdef WSC_AP_SUPPORT - - if (pEntry->bWscCapable) { - UCHAR *pWscBuf = NULL, WscIeLen = 0; - ULONG WscTmpLen = 0; - - os_alloc_mem(NULL, (UCHAR **)&pWscBuf, 512); - - if (pWscBuf) { - NdisZeroMemory(pWscBuf, 512); - WscBuildAssocRespIE(pAd, pEntry->func_tb_idx, 0, - pWscBuf, &WscIeLen); - MakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen, - WscIeLen, pWscBuf, END_OF_ARGS); - FrameLen += WscTmpLen; - os_free_mem(pWscBuf); - } - } - -#endif /* WSC_AP_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT - - /* Append extra IEs provided by wpa_supplicant */ - if (pAd->ApCfg.MBSSID[pEntry->apidx].AssocRespExtraIeLen) { - ULONG TmpLen = 0; - INT32 IesLen = - pAd->ApCfg.MBSSID[pEntry->apidx].AssocRespExtraIeLen; - UCHAR *Ies = pAd->ApCfg.MBSSID[pEntry->apidx].AssocRespExtraIe; - - if (RTMPIsValidIEs(Ies, IesLen)) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AssocRespExtraIE Added (Len=%d)\n", IesLen)); - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - IesLen, Ies, END_OF_ARGS); - FrameLen += TmpLen; - } else - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("AssocRespExtraIE len incorrect!\n")); - } - -#endif /* RT_CFG80211_SUPPORT */ -#ifdef HOSTAPD_OWE_SUPPORT - if (wdev && IS_AKM_OWE(wdev->SecConfig.AKMMap)) { - if (pRsnIe) { - ULONG TmpLen = 0; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - pRsnIe->Len + 2, pRsnIe, END_OF_ARGS); - FrameLen += TmpLen; - } - if (pEcdhIe) { - ULONG TmpLen = 0; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - pEcdhIe->Len + 2, pEcdhIe, - END_OF_ARGS); - FrameLen += TmpLen; - } - } -#endif -#ifdef DOT11R_FT_SUPPORT - if ((pFtCfg != NULL) && (pFtCfg->FtCapFlag.Dot11rFtEnable)) { - PUINT8 mdie_ptr; - UINT8 mdie_len; - /*PUINT8 ftie_ptr = NULL;*/ - /*UINT8 ftie_len = 0;*/ - /*PUINT8 ricie_ptr = NULL;*/ - /*UINT8 ricie_len = 0;*/ - /* struct _SECURITY_CONFIG *pSecConfig = &pEntry->SecConfig; */ - - /* Insert RSNIE if necessary */ - if (pFtInfoBuf->RSNIE_Len != 0) { - ULONG TmpLen; - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - pFtInfoBuf->RSNIE_Len, - pFtInfoBuf->RSN_IE, END_OF_ARGS); - FrameLen += TmpLen; - } - - /* Insert MDIE. */ - mdie_ptr = pOutBuffer + FrameLen; - mdie_len = 5; - FT_InsertMdIE(pAd, pOutBuffer + FrameLen, &FrameLen, - pFtInfoBuf->MdIeInfo.MdId, - pFtInfoBuf->MdIeInfo.FtCapPlc); - - /* Insert FTIE. */ - if (pFtIe) { - ULONG TmpLen = 0; - - MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, - pFtIe->Len + 2, pFtIe, END_OF_ARGS); - FrameLen += TmpLen; - } - } -#endif /* DOT11R_FT_SUPPORT */ -#ifdef CONFIG_OWE_SUPPORT - if (IS_AKM_OWE_Entry(pEntry) && (StatusCode == MLME_SUCCESS)) { - BOOLEAN need_ecdh_ie = FALSE; - INT CacheIdx; /* Key cache */ - - pPmkid = WPA_ExtractSuiteFromRSNIE(ie_list->RSN_IE, - ie_list->RSNIE_Len, - PMKID_LIST, &pmkid_count); - if (pPmkid != NULL) { - CacheIdx = RTMPSearchPMKIDCache(&pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, - pEntry->Addr); - if ((CacheIdx == -1) || - ((RTMPEqualMemory(pPmkid, - &pAd->ApCfg.PMKIDCache - .BSSIDInfo[CacheIdx] - .PMKID, - LEN_PMKID)) == 0)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: AKM_OWE_Entry PMKID not found, do normal ECDH procedure\n", - __func__)); - need_ecdh_ie = TRUE; - } - } else - need_ecdh_ie = TRUE; - - if (need_ecdh_ie == TRUE) { - FrameLen += build_owe_dh_ie( - pAd, pEntry, (UCHAR *)pOutBuffer + FrameLen, - pEntry->SecConfig.owe.last_try_group); - } - } -#endif /*CONFIG_OWE_SUPPORT*/ - - MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); - MlmeFreeMemory((PVOID)pOutBuffer); - - /* set up BA session */ - if (StatusCode == MLME_SUCCESS) { - pEntry->PsMode = PWR_ACTIVE; - /* TODO: shiang-usw, we need to rmove upper setting and migrate to tr_entry->PsMode */ - pAd->MacTab.tr_entry[pEntry->wcid].PsMode = PWR_ACTIVE; - MSDU_FORBID_CLEAR(wdev, MSDU_FORBID_CONNECTION_NOT_READY); -#ifdef IAPP_SUPPORT - /*PFRAME_802_11 Fr = (PFRAME_802_11)Elem->Msg; */ - /* POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; */ - { - /* send association ok message to IAPPD */ - IAPP_L2_Update_Frame_Send(pAd, pEntry->Addr, - pEntry->wdev->wdev_idx); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("####### Send L2 Frame Mac=%02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(pEntry->Addr))); - } - - /* SendSingalToDaemon(SIGUSR2, pObj->IappPid); */ -#endif /* IAPP_SUPPORT */ - /* ap_assoc_info_debugshow(pAd, isReassoc, pEntry, ie_list); */ - /* send wireless event - for association */ -#ifdef VENDOR_FEATURE7_SUPPORT - /* Passed in the pEntry->apindx argument */ - RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pEntry->Addr, - pEntry->func_tb_idx, 0); -#else - RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pEntry->Addr, 0, - 0); -#endif - /* This is a reassociation procedure */ - pEntry->IsReassocSta = isReassoc; - /* clear txBA bitmap */ - pEntry->TXBAbitmap = 0; - - if (pEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX) { - CLIENT_STATUS_SET_FLAG(pEntry, - fCLIENT_STATUS_WMM_CAPABLE); - - if ((wdev->channel <= 14) && - addht->AddHtInfo.ExtChanOffset && - (ie_list->HTCapability.HtCapInfo.ChannelWidth == - BW_40)) - SendBeaconRequest(pAd, pEntry->wcid); - - ba_ori_session_setup(pAd, pEntry, 5, 0, 10, FALSE); - } - -#ifdef RT_CFG80211_SUPPORT - if (TRUE) { /*CFG_TODO*/ - /* need to update pEntry to inform later flow to keep ConnectionState in connected */ - pEntry->bWscCapable = ie_list->bWscCapable; - { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("SINGLE CFG: NOITFY ASSOCIATED, pEntry->bWscCapable:%d\n", - pEntry->bWscCapable)); -#ifdef RT_CFG80211_SUPPORT - /* CFG80211OS_NewSta(pEntry->wdev->if_dev, ie_list->Addr2, - (PUCHAR)Elem->Msg, Elem->MsgLen, isReassoc); */ -#endif - - if (IS_CIPHER_WEP( - pEntry->SecConfig.PairwiseCipher)) { - ASIC_SEC_INFO Info = { 0 }; - /* Set key material to Asic */ - os_zero_mem(&Info, - sizeof(ASIC_SEC_INFO)); - Info.Operation = - SEC_ASIC_ADD_PAIRWISE_KEY; - Info.Direction = SEC_ASIC_KEY_BOTH; - Info.Wcid = pEntry->wcid; - Info.BssIndex = pEntry->func_tb_idx; - Info.KeyIdx = - pEntry->SecConfig.PairwiseKeyId; - Info.Cipher = - pEntry->SecConfig.PairwiseCipher; - Info.KeyIdx = - pEntry->SecConfig.PairwiseKeyId; - os_move_mem( - &Info.Key, - &pEntry->SecConfig.WepKey - [pEntry->SecConfig - .PairwiseKeyId], - sizeof(SEC_KEY_INFO)); - os_move_mem(&Info.PeerAddr[0], - pEntry->Addr, MAC_ADDR_LEN); - HW_ADDREMOVE_KEYTABLE(pAd, &Info); - } - } - - /* hex_dump("ASSOC_REQ", Elem->Msg, Elem->MsgLen); */ - } else -#endif - /* enqueue a EAPOL_START message to trigger EAP state machine doing the authentication */ - if (IS_AKM_PSK_Entry(pEntry)) { - pPmkid = WPA_ExtractSuiteFromRSNIE( - ie_list->RSN_IE, ie_list->RSNIE_Len, - PMKID_LIST, &pmkid_count); - - if (pPmkid != NULL) { - INT CacheIdx; - - CacheIdx = RTMPValidatePMKIDCache( - &pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, - pEntry->Addr, pPmkid); - - store_pmkid_cache_in_sec_config( - pAd, pEntry, CacheIdx); - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ASSOC - CacheIdx = %d\n", - CacheIdx)); - - if (IS_AKM_WPA3PSK( - pEntry->SecConfig.AKMMap) && - !is_pmkid_cache_in_sec_config( - &pEntry->SecConfig)) { - MTWF_LOG( - DBG_CAT_SEC, CATSEC_SAE, - DBG_LVL_ERROR, - ("ASSOC - SAE - verify pmkid fail\n")); - MlmeDeAuthAction( - pAd, pEntry, - REASON_NO_LONGER_VALID, - FALSE); - goto LabelOK; - } - } -#ifdef WSC_AP_SUPPORT - /* - * In WPA-PSK mode, - * If Association Request of station has RSN/SSN, - * WPS AP Must Not send EAP-Request/Identity to station - * no matter WPS AP does receive EAPoL-Start from STA or not. - * Marvell WPS test bed(v2.1.1.5) will send AssocReq with WPS IE and RSN/SSN IE. - */ - if (pEntry->bWscCapable || - (ie_list->RSNIE_Len == 0)) { - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("ASSOC - IF(ra%d) This is a WPS Client.\n\n", - pEntry->func_tb_idx)); - goto LabelOK; - } else { - pEntry->bWscCapable = FALSE; - pEntry->Receive_EapolStart_EapRspId = - (WSC_ENTRY_GET_EAPOL_START | - WSC_ENTRY_GET_EAP_RSP_ID); - /* This STA is not a WPS STA */ - NdisZeroMemory(wsc_ctrl->EntryAddr, 6); - } - -#endif /* WSC_AP_SUPPORT */ - /* Enqueue a EAPOL-start message with the pEntry for WPAPSK State Machine */ - if (1 -#ifdef HOSTAPD_SUPPORT - && wdev->Hostapd == Hostapd_Disable -#endif /*HOSTAPD_SUPPORT*/ -#ifdef WSC_AP_SUPPORT - && !pEntry->bWscCapable -#endif /* WSC_AP_SUPPORT */ - ) { - /* Enqueue a EAPOL-start message with the pEntry */ - os_move_mem(&pEntry->SecConfig.Handshake - .AAddr, - wdev->bssid, MAC_ADDR_LEN); - os_move_mem(&pEntry->SecConfig.Handshake - .SAddr, - pEntry->Addr, MAC_ADDR_LEN); - - if (!IS_AKM_WPA3PSK( - pEntry->SecConfig.AKMMap) && - !(IS_AKM_OWE( - pEntry->SecConfig.AKMMap))) - os_move_mem( - &pEntry->SecConfig.PMK, - &wdev->SecConfig.PMK, - LEN_PMK); - - RTMPSetTimer( - &pEntry->SecConfig - .StartFor4WayTimer, - ENQUEUE_EAPOL_START_TIMER); - } - } -#ifdef DOT1X_SUPPORT - else if (IS_AKM_WPA2_Entry(pEntry) || - IS_AKM_WPA3_192BIT_Entry(pEntry)) { - pPmkid = WPA_ExtractSuiteFromRSNIE( - ie_list->RSN_IE, ie_list->RSNIE_Len, - PMKID_LIST, &pmkid_count); - - if (pPmkid != NULL) { - /* Key cache */ - INT CacheIdx; - - CacheIdx = RTMPValidatePMKIDCache( - &pAd->ApCfg.PMKIDCache, - pEntry->func_tb_idx, - pEntry->Addr, pPmkid); - - process_pmkid(pAd, wdev, pEntry, - CacheIdx); - } - } else if (IS_AKM_1X_Entry(pEntry) || - (IS_IEEE8021X(&pEntry->SecConfig) -#ifdef WSC_AP_SUPPORT - && (!pEntry->bWscCapable) -#endif /* WSC_AP_SUPPORT */ - )) { - /* Enqueue a EAPOL-start message to trigger EAP SM */ - if (pEntry->EnqueueEapolStartTimerRunning == - EAPOL_START_DISABLE -#ifdef HOSTAPD_SUPPORT - && wdev->Hostapd == Hostapd_Disable -#endif /*HOSTAPD_SUPPORT*/ - ) { - pEntry->EnqueueEapolStartTimerRunning = - EAPOL_START_1X; - RTMPSetTimer( - &pEntry->SecConfig - .StartFor4WayTimer, - ENQUEUE_EAPOL_START_TIMER); - } - } - -#endif /* DOT1X_SUPPORT */ - -#if defined(MWDS) || defined(CONFIG_MAP_SUPPORT) || defined(WAPP_SUPPORT) - if (tr_entry && - (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED)) { -#if defined(CONFIG_MAP_SUPPORT) && defined(A4_CONN) - map_a4_peer_enable(pAd, pEntry, TRUE); -#endif /* CONFIG_MAP_SUPPORT */ -#ifdef WAPP_SUPPORT - wapp_send_cli_join_event(pAd, pEntry); -#endif - } -#endif -#ifdef SMART_ANTENNA - { - unsigned long irqflags; - /* Check if need to reset the sa training procedures to init stage! */ - RTMP_IRQ_LOCK(&pAd->smartAntLock, irqflags); - - if (RTMP_SA_WORK_ON(pAd)) { - /* sa_add_train_entry(pAd, &pEntry->Addr[0], FALSE); */ - pAd->pSAParam->bStaChange = TRUE; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s():sta(%02x:%02x:%02x:%02x:%02x:%02x) add!\n", - __func__, PRINT_MAC(pEntry->Addr))); - } - - RTMP_IRQ_UNLOCK(&pAd->smartAntLock, irqflags); - } -#endif /* SMART_ANTENNA // */ -#ifdef GREENAP_SUPPORT - - if (greenap_get_capability(greenap) && - greenap_get_allow_status(greenap)) { - if (StatusCode == MLME_SUCCESS && - (pEntry->Sst == SST_ASSOC)) - greenap_check_peer_connection_at_link_up_down( - pAd, wdev, greenap); - } - -#endif /* GREENAP_SUPPORT */ -#ifdef CONFIG_HOTSPOT_R2 - - /* add to cr4 pool */ - if (pEntry->QosMapSupport) { - PHOTSPOT_CTRL pHSCtrl = - &pAd->ApCfg.MBSSID[pEntry->apidx].HotSpotCtrl; - - if (pHSCtrl->QosMapEnable) { - if (!pHSCtrl->QosMapAddToPool) { - pHSCtrl->QosMapAddToPool = TRUE; - pHSCtrl->QosMapPoolID = - hotspot_qosmap_add_pool(pAd, - pEntry); - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("add current MBSS qosmap to CR4\n")); - } - - hotspot_qosmap_update_sta_mapping_to_cr4( - pAd, pEntry, pHSCtrl->QosMapPoolID); - } - } - -#endif /* CONFIG_HOTSPOT_R2 */ -#ifdef DSCP_QOS_MAP_SUPPORT - if (CLIENT_STATUS_TEST_FLAG(pEntry, - fCLIENT_STATUS_WMM_CAPABLE)) { - if (pMbss->DscpQosMapEnable) { - pEntry->PoolId = pMbss->DscpQosPoolId; - MTWF_LOG( - DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[DSCP-QOS-MAP] update sta mapping to CR4 for Pool %d wcid %d", - pEntry->PoolId, pEntry->wcid)); - dscp_qosmap_update_sta_mapping_to_cr4( - pAd, pEntry, pEntry->PoolId); - } - } -#endif - } - -#ifdef FAST_EAPOL_WAR - /* - * Moved from WifiSysApPeerLinkUp() in open security mode. - * to make sure the STATE_PORT_SECURE flag can be polled by MU N9 module. - * then MU Action Frame sent out after Asso Resp. - */ - if (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED) { - if (!(IS_AKM_WPA_CAPABILITY_Entry(pEntry) -#ifdef DOT1X_SUPPORT - || IS_IEEE8021X(&pEntry->SecConfig) -#endif /* DOT1X_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT - || wdev->IsCFG1xWdev -#endif /* RT_CFG80211_SUPPORT */ - || pEntry->bWscCapable)) { - WifiSysUpdatePortSecur(pAd, pEntry, NULL); - } - } -#endif /* FAST_EAPOL_WAR */ -#ifdef BAND_STEERING - if ((pAd->ApCfg.BandSteering)) { - BndStrg_UpdateEntry(pAd, pEntry, ie_list, TRUE); - } -#endif - -#ifdef VENDOR_FEATURE7_SUPPORT - if (arris_event_send_hook && pEntry && (StatusCode == MLME_SUCCESS)) { - UCHAR assoc_event_msg[32] = { 0 }; - UINT32 count = 0; - UCHAR *assoc_sta_info = NULL; - HT_CAP_INFO *pHTCap = &(ie_list->HTCapability).HtCapInfo; - HT_CAP_PARM *pHTCapParm = &(ie_list->HTCapability).HtCapParm; - /* Send a WLAN_EVENT to ATOM which in turns sends an RPC - * to update our client table on the ARM. - */ - NdisZeroMemory(assoc_event_msg, sizeof(assoc_event_msg)); - if (WMODE_CAP_5G(PhyMode)) - count = snprintf( - assoc_event_msg, sizeof(assoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pEntry->Addr), - (pEntry->func_tb_idx) + WIFI_50_RADIO); - else - count = snprintf( - assoc_event_msg, sizeof(assoc_event_msg), - "%02x:%02x:%02x:%02x:%02x:%02x BSS(%d)", - PRINT_MAC(pEntry->Addr), - (pEntry->func_tb_idx) + WIFI_24_RADIO); - - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, WLAN_EVENT, - STA_ASSOC, assoc_event_msg, count); - - /* Log this cleint's capabilities in our nvram */ - /* assoc_sta_info = kmalloc(1300, GFP_ATOMIC); */ - os_alloc_mem(NULL, (UCHAR **)&assoc_sta_info, 1300); - if (assoc_sta_info) { - NdisZeroMemory(assoc_sta_info, 1300); - count = 0; - count += snprintf( - (assoc_sta_info + count), (1300 - count), - "Association: (%02x:%02x:%02x:%02x:%02x:%02x) --> %s%d (%s)\n", - PRINT_MAC(pEntry->Addr), INF_MAIN_DEV_NAME, - pEntry->func_tb_idx, pEntry->pMbss->Ssid); - if (pHTCap && pHTCapParm && ie_list->ht_cap_len && - WMODE_CAP_N(wdev->PhyMode)) { - count += snprintf((assoc_sta_info + count), - (1300 - count), - " Station Info:\n"); - count += snprintf( - (assoc_sta_info + count), - (1300 - count), - "\tRSSI0(%d), RSSI1(%d), Mode(%s), BW(%s), MCS(%d), SGI(%d)\n", - ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_0), - ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_1), - get_phymode_str( - pEntry->HTPhyMode.field.MODE), - get_bw_str(pEntry->HTPhyMode.field.BW), - pEntry->HTPhyMode.field.MCS, - pEntry->HTPhyMode.field.ShortGI); - } else { - count += snprintf( - (assoc_sta_info + count), - (1300 - count), - " Station Info (Legacy):\n"); - count += snprintf( - (assoc_sta_info + count), - (1300 - count), - "\tRSSI0(%d), RSSI1(%d), Mode(%s), MCS(%d)\n", - ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_0), - ConvertToRssi(pAd, &Elem->rssi_info, - RSSI_IDX_1), - get_phymode_str( - pEntry->HTPhyMode.field.MODE), - pEntry->HTPhyMode.field.MCS); - } - ARRISMOD_CALL(arris_event_send_hook, ATOM_HOST, - WLAN_LOG_SAVE, 0, assoc_sta_info, count); - os_free_mem(assoc_sta_info); - } - } -#endif - -LabelOK: - if (ie_list != NULL) { - os_free_mem(ie_list); - if (pEntry) - pEntry->ie_list = NULL; - } -#ifdef RT_CFG80211_SUPPORT - - if (StatusCode != MLME_SUCCESS) - CFG80211_ApStaDelSendEvent(pAd, pEntry->Addr, - pEntry->wdev->if_dev); - -#endif /* RT_CFG80211_SUPPORT */ - -#ifdef DOT11R_FT_SUPPORT - if (pFtInfoBuf != NULL) - os_free_mem(pFtInfoBuf); -#endif /* DOT11R_FT_SUPPORT */ - - return; -} -#endif /* HOSTAPD_11R_SUPPORT */ - -INT CFG80211_SendMgmtFrame(RTMP_ADAPTER *pAd, VOID *pData, ULONG Data) -{ - UCHAR *pBuf = NULL; -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ - - if (pData != NULL) { -#ifdef CONFIG_AP_SUPPORT - struct ieee80211_mgmt *mgmt; -#endif /* CONFIG_AP_SUPPORT */ -#ifdef HOSTAPD_11R_SUPPORT - UINT8 apidx; -#endif /* HOSTAPD_11R_SUPPORT */ - { - os_alloc_mem(NULL, (UCHAR **)&pBuf, Data); - if (pBuf != NULL) - NdisCopyMemory(pBuf, pData, Data); - else { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("CFG_TX_STATUS: MEM ALLOC ERROR\n")); - return NDIS_STATUS_FAILURE; - } - CFG80211_CheckActionFrameType(pAd, "TX", pData, Data); -#ifdef CONFIG_AP_SUPPORT - mgmt = (struct ieee80211_mgmt *)pData; -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_SAE_SUPPORT) - apidx = get_apidx_by_addr(pAd, mgmt->sa); -#endif - if (ieee80211_is_probe_resp(mgmt->frame_control)) { - INT offset = sizeof(HEADER_802_11) + 12; -#ifdef DISABLE_HOSTAPD_PROBE_RESP -#ifndef HOSTAPD_11R_SUPPORT - UINT8 apidx = get_apidx_by_addr(pAd, mgmt->sa); -#endif - CFG80211_SyncPacketWpsIe(pAd, pData + offset, - Data - offset, apidx, - mgmt->da); - goto LabelOK; -#endif - - CFG80211_SyncPacketWmmIe(pAd, pData + offset, - Data - offset); - } - if ((ieee80211_is_auth(mgmt->frame_control)) && - (mgmt->u.auth.auth_alg != AUTH_MODE_FT) && - (mgmt->u.auth.auth_alg != AUTH_MODE_SAE)) { -#ifdef RADIUS_MAC_AUTH_SUPPORT - MAC_TABLE_ENTRY *pEntry = - MacTableLookup(pAd, mgmt->da); - if (pEntry != NULL && - pEntry->wdev->radius_mac_auth_enable) { - if (mgmt->u.auth.status_code == - MLME_SUCCESS) { - pEntry->bAllowTraffic = TRUE; - } else { - pEntry->bAllowTraffic = FALSE; - MlmeDeAuthAction( - pAd, pEntry, - REASON_NO_LONGER_VALID, - FALSE); - } - } -#endif - goto LabelOK; - } - -#if defined(HOSTAPD_11R_SUPPORT) || defined(HOSTAPD_SAE_SUPPORT) - if (ieee80211_is_auth(mgmt->frame_control) && - ((mgmt->u.auth.auth_alg == AUTH_MODE_FT) || - (mgmt->u.auth.auth_alg == AUTH_MODE_SAE))) { - CFG80211_AuthRespHandler(pAd, pData, Data); - - MiniportMMRequest(pAd, 0, pData, Data); - - if (pBuf) { - CFG80211OS_TxStatus( - pAd->ApCfg.MBSSID[apidx] - .wdev.if_dev, - 5678, pBuf, Data, 1); - } - goto LabelOK; - } - if (ieee80211_is_reassoc_resp(mgmt->frame_control) || - ieee80211_is_assoc_resp(mgmt->frame_control)) { - CFG80211_AssocRespHandler(pAd, pData, Data); - - if (pBuf) { - CFG80211OS_TxStatus( - pAd->ApCfg.MBSSID[apidx] - .wdev.if_dev, - 5678, pBuf, Data, 1); - } - goto LabelOK; - } -#endif - -#endif /* CONFIG_AP_SUPPORT */ - MiniportMMRequest(pAd, 0, pData, Data); - } - } -LabelOK: - if (pBuf != NULL) - os_free_mem(pBuf); - - return 0; -} - -VOID CFG80211_SendMgmtFrameDone(RTMP_ADAPTER *pAd, USHORT Sequence, BOOLEAN ack) -{ - /* RTMP_USB_SUPPORT/RTMP_PCI_SUPPORT */ - PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; - - if (pCfg80211_ctrl->TxStatusInUsed && pCfg80211_ctrl->pTxStatusBuf - /*&& (pAd->TxStatusSeq == pHeader->Sequence)*/) { - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("CFG_TX_STATUS: REAL send %d\n", Sequence)); - CFG80211OS_TxStatus(CFG80211_GetEventDevice(pAd), 5678, - pCfg80211_ctrl->pTxStatusBuf, - pCfg80211_ctrl->TxStatusBufLen, ack); - pCfg80211_ctrl->TxStatusSeq = 0; - pCfg80211_ctrl->TxStatusInUsed = FALSE; - } -} -#ifdef CONFIG_AP_SUPPORT -VOID CFG80211_ParseBeaconIE(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, - struct wifi_dev *wdev, UCHAR *wpa_ie, UCHAR *rsn_ie) -{ - PEID_STRUCT pEid; - PUCHAR pTmp; - NDIS_802_11_ENCRYPTION_STATUS TmpCipher; - NDIS_802_11_ENCRYPTION_STATUS - PairCipher; /* Unicast cipher 1, this one has more secured cipher suite */ - NDIS_802_11_ENCRYPTION_STATUS - PairCipherAux; /* Unicast cipher 2 if AP announce two unicast cipher suite */ - PAKM_SUITE_STRUCT pAKM; - USHORT Count; - BOOLEAN bWPA = FALSE; - BOOLEAN bWPA2 = FALSE; - BOOLEAN bMix = FALSE; - -#ifdef DISABLE_HOSTAPD_BEACON -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) - const UCHAR CFG_WPA_EID = WLAN_EID_VENDOR_SPECIFIC; -#else - const UCHAR CFG_WPA_EID = WLAN_EID_WPA; -#endif /* LINUX_VERSION_CODE: 3.8.0 */ -#endif - - /* Security */ - PairCipher = Ndis802_11WEPDisabled; - PairCipherAux = Ndis802_11WEPDisabled; - CLEAR_SEC_AKM(wdev->SecConfig.AKMMap); - CLEAR_PAIRWISE_CIPHER(&wdev->SecConfig); - CLEAR_GROUP_CIPHER(&wdev->SecConfig); -#ifdef DOT11W_PMF_SUPPORT - wdev->SecConfig.PmfCfg.MFPC = 0; - wdev->SecConfig.PmfCfg.MFPR = 0; - wdev->SecConfig.PmfCfg.igtk_cipher = 0; -#endif - - if ((wpa_ie == NULL) && (rsn_ie == NULL)) { /* open case */ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: Open/None case\n", __func__)); - /* wdev->AuthMode = Ndis802_11AuthModeOpen; */ - /* wdev->WepStatus = Ndis802_11WEPDisabled; */ - /* wdev->WpaMixPairCipher = MIX_CIPHER_NOTUSE; */ - SET_AKM_OPEN(wdev->SecConfig.AKMMap); - SET_CIPHER_NONE(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_NONE(wdev->SecConfig.GroupCipher); - } - - if (wpa_ie != NULL) { /* wpapsk/tkipaes case */ - pEid = (PEID_STRUCT)wpa_ie; - pTmp = (PUCHAR)pEid; - - if (os_equal_mem(pEid->Octet, WPA_OUI, 4)) { - /* wdev->AuthMode = Ndis802_11AuthModeOpen; */ - /* SET_AKM_OPEN(wdev->SecConfig.AKMMap); */ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: WPA case\n", __func__)); - bWPA = TRUE; - pTmp += 11; - - switch (*pTmp) { - case 1: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group Ndis802_11GroupWEP40Enabled\n")); - /* wdev->GroupKeyWepStatus = Ndis802_11GroupWEP40Enabled; */ - SET_CIPHER_WEP40(wdev->SecConfig.GroupCipher); - break; - - case 5: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group Ndis802_11GroupWEP104Enabled\n")); - /* wdev->GroupKeyWepStatus = Ndis802_11GroupWEP104Enabled; */ - SET_CIPHER_WEP104(wdev->SecConfig.GroupCipher); - break; - - case 2: - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group Ndis802_11TKIPEnable\n")); - /* wdev->GroupKeyWepStatus = Ndis802_11TKIPEnable; */ - SET_CIPHER_TKIP(wdev->SecConfig.GroupCipher); - break; - - case 4: - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" Group Ndis802_11AESEnable\n")); - /* wdev->GroupKeyWepStatus = Ndis802_11AESEnable; */ - SET_CIPHER_CCMP128(wdev->SecConfig.GroupCipher); - break; - - default: - break; - } - - /* number of unicast suite*/ - pTmp += 1; - /* skip all unicast cipher suites*/ - /*Count = *(PUSHORT) pTmp; */ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - - /* Parsing all unicast cipher suite*/ - while (Count > 0) { - /* Skip OUI*/ - pTmp += 3; - TmpCipher = Ndis802_11WEPDisabled; - - switch (*pTmp) { - case 1: - case 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway*/ - TmpCipher = Ndis802_11WEPEnabled; - break; - - case 2: - TmpCipher = Ndis802_11TKIPEnable; - break; - - case 4: - TmpCipher = Ndis802_11AESEnable; - break; - - default: - break; - } - - if (TmpCipher > PairCipher) { - /* Move the lower cipher suite to PairCipherAux*/ - PairCipherAux = PairCipher; - PairCipher = TmpCipher; - } else - PairCipherAux = TmpCipher; - - pTmp++; - Count--; - } - - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Auth Count in WPA = %d ,we only parse the first for AKM\n", - Count)); - pTmp += 3; /* parse first AuthOUI for AKM */ - - switch (*pTmp) { - case 1: - /* Set AP support WPA-enterprise mode*/ - /* wdev->AuthMode = Ndis802_11AuthModeWPA; */ - SET_AKM_WPA1(wdev->SecConfig.AKMMap); - break; - - case 2: - /* Set AP support WPA-PSK mode*/ - /* wdev->AuthMode = Ndis802_11AuthModeWPAPSK; */ - SET_AKM_WPA1PSK(wdev->SecConfig.AKMMap); - break; - - default: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("UNKNOWN AKM 0x%x IN WPA,please check!\n", - *pTmp)); - break; - } - - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("AuthMode = 0x%x\n", wdev->SecConfig.AKMMap)); - - /* if (wdev->GroupKeyWepStatus == PairCipher) */ - if ((PairCipher == Ndis802_11WEPDisabled && - IS_CIPHER_NONE(wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11WEPEnabled && - IS_CIPHER_WEP(wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11TKIPEnable && - IS_CIPHER_TKIP(wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11AESEnable && - IS_CIPHER_CCMP128(wdev->SecConfig.GroupCipher))) { - /* wdev->WpaMixPairCipher = MIX_CIPHER_NOTUSE; */ - /* pMbss->wdev.WepStatus=wdev->GroupKeyWepStatus; */ - wdev->SecConfig.PairwiseCipher = - wdev->SecConfig.GroupCipher; - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("WPA Mix TKIPAES\n")); - bMix = TRUE; - } - - pMbss->RSNIE_Len[0] = wpa_ie[1]; - os_move_mem(pMbss->RSN_IE[0], wpa_ie + 2, - wpa_ie[1]); /* copy rsn ie */ -#ifdef DISABLE_HOSTAPD_BEACON - pMbss->RSNIE_ID[0] = CFG_WPA_EID; -#endif - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:: wpa open/none case\n", __func__)); - /* wdev->AuthMode = Ndis802_11AuthModeOpen; */ - /* wait until wpa/wpa2 all not exist , then set open/none */ - } - } - - if (rsn_ie != NULL) { - PRSN_IE_HEADER_STRUCT pRsnHeader; - PCIPHER_SUITE_STRUCT pCipher; - UCHAR Len; - - pEid = (PEID_STRUCT)rsn_ie; - Len = pEid->Len + 2; - pTmp = (PUCHAR)pEid; - pRsnHeader = (PRSN_IE_HEADER_STRUCT)pTmp; - - /* 0. Version must be 1*/ - if (le2cpu16(pRsnHeader->Version) == 1) { - pTmp += sizeof(RSN_IE_HEADER_STRUCT); - Len -= sizeof(RSN_IE_HEADER_STRUCT); - - /* 1. Check group cipher*/ - pCipher = (PCIPHER_SUITE_STRUCT)pTmp; - - if (os_equal_mem(pTmp, RSN_OUI, 3)) { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s:: WPA2 case\n", __func__)); - bWPA2 = TRUE; - - /* wdev->AuthMode = Ndis802_11AuthModeOpen; */ - /* SET_AKM_OPEN(wdev->SecConfig.AKMMap); */ - switch (pCipher->Type) { - case 1: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group Ndis802_11GroupWEP40Enabled\n")); - /* wdev->GroupKeyWepStatus = Ndis802_11GroupWEP40Enabled; */ - SET_CIPHER_WEP40( - wdev->SecConfig.GroupCipher); - break; - - case 5: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group Ndis802_11GroupWEP104Enabled\n")); - /* wdev->GroupKeyWepStatus = Ndis802_11GroupWEP104Enabled; */ - SET_CIPHER_WEP104( - wdev->SecConfig.GroupCipher); - break; - - case 2: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group Ndis802_11TKIPEnable\n")); - /* wdev->GroupKeyWepStatus = Ndis802_11TKIPEnable; */ - SET_CIPHER_TKIP( - wdev->SecConfig.GroupCipher); - break; - - case 4: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" Group Ndis802_11AESEnable\n")); - /* wdev->GroupKeyWepStatus = Ndis802_11AESEnable; */ - SET_CIPHER_CCMP128( - wdev->SecConfig.GroupCipher); - break; - case 8: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" Group Ndis802_11GCMP128Enable\n")); - SET_CIPHER_GCMP128( - wdev->SecConfig.GroupCipher); - break; - case 9: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" Group Ndis802_11GCMP256Enable\n")); - SET_CIPHER_GCMP256( - wdev->SecConfig.GroupCipher); - break; - case 10: - MTWF_LOG( - DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - (" Group Ndis802_11CCMP256Enable\n")); - SET_CIPHER_CCMP256( - wdev->SecConfig.GroupCipher); - break; - default: - break; - } - - /* set to correct offset for next parsing*/ - pTmp += sizeof(CIPHER_SUITE_STRUCT); - Len -= sizeof(CIPHER_SUITE_STRUCT); - - /* 2. Get pairwise cipher counts*/ - /*Count = *(PUSHORT) pTmp;*/ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - Len -= sizeof(USHORT); - - /* 3. Get pairwise cipher*/ - /* Parsing all unicast cipher suite*/ - while (Count > 0) { - /* Skip OUI*/ - pCipher = (PCIPHER_SUITE_STRUCT)pTmp; - TmpCipher = Ndis802_11WEPDisabled; - - switch (pCipher->Type) { - case 1: - case 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway*/ - TmpCipher = - Ndis802_11WEPEnabled; - break; - - case 2: - TmpCipher = - Ndis802_11TKIPEnable; - break; - - case 4: - TmpCipher = Ndis802_11AESEnable; - break; - - case 8: - TmpCipher = - Ndis802_11GCMP128Enable; - break; - case 9: - TmpCipher = - Ndis802_11GCMP256Enable; - break; - case 10: - TmpCipher = - Ndis802_11CCMP256Enable; - break; - default: - break; - } - - /* pMbss->wdev.WepStatus = TmpCipher; */ - if (TmpCipher > PairCipher) { - /* Move the lower cipher suite to PairCipherAux*/ - PairCipherAux = PairCipher; - PairCipher = TmpCipher; - } else - PairCipherAux = TmpCipher; - - pTmp += sizeof(CIPHER_SUITE_STRUCT); - Len -= sizeof(CIPHER_SUITE_STRUCT); - Count--; - } - - /* 4. get AKM suite counts*/ - /*Count = *(PUSHORT) pTmp;*/ - Count = (pTmp[1] << 8) + pTmp[0]; - pTmp += sizeof(USHORT); - Len -= sizeof(USHORT); - - /* 5. Get AKM ciphers*/ - /* Parsing all AKM ciphers*/ - while (Count > 0) { - pAKM = (PAKM_SUITE_STRUCT)pTmp; - - if (!RTMPEqualMemory(pTmp, RSN_OUI, 3)) - break; - - switch (pAKM->Type) { - case 0: - /* wdev->AuthMode = Ndis802_11AuthModeWPANone; */ - SET_AKM_OPEN( - wdev->SecConfig.AKMMap); - break; - - case 1: - /* Set AP support WPA-enterprise mode*/ - /* wdev->AuthMode = Ndis802_11AuthModeWPA2; */ - SET_AKM_WPA2( - wdev->SecConfig.AKMMap); - break; - - case 2: - /* Set AP support WPA-PSK mode*/ - /* wdev->AuthMode = Ndis802_11AuthModeWPA2PSK; */ - SET_AKM_WPA2PSK( - wdev->SecConfig.AKMMap); - break; -#ifdef HOSTAPD_11R_SUPPORT - case 3: - /* Set AP support FT WPA-enterprise mode*/ - /* wdev->AuthMode = Ndis802_11AuthModeWPA2; */ - SET_AKM_FT_WPA2( - wdev->SecConfig.AKMMap); - break; - case 4: - /* Set AP support WPA-PSK mode*/ - /* wdev->AuthMode = Ndis802_11AuthModeWPA2PSK; */ - SET_AKM_FT_WPA2PSK( - wdev->SecConfig.AKMMap); - break; -#endif /* HOSTAPD_11R_SUPPORT */ - case 5: - /* Set AP support WPA-PSK-EAP256 mode*/ -#ifdef DOT11W_PMF_SUPPORT - SET_AKM_WPA2( - wdev->SecConfig.AKMMap); - wdev->SecConfig.PmfCfg - .Desired_PMFSHA256 = 1; -#else - SET_AKM_WPA2_SHA256( - wdev->SecConfig.AKMMap); -#endif /*DOT11W_PMF_SUPPORT*/ - break; - case 6: - /* Set AP support WPA-PSK-SHA256 mode*/ -#ifdef DOT11W_PMF_SUPPORT - SET_AKM_WPA2PSK( - wdev->SecConfig.AKMMap); - wdev->SecConfig.PmfCfg - .Desired_PMFSHA256 = 1; -#else - SET_AKM_WPA2PSK_SHA256( - wdev->SecConfig.AKMMap); -#endif /*DOT11W_PMF_SUPPORT*/ - break; - -#ifdef HOSTAPD_SAE_SUPPORT - case 8: - /*Set AP Support SAE SHA256 */ - SET_AKM_SAE_SHA256( - wdev->SecConfig.AKMMap); - break; -#endif -#ifdef HOSTAPD_SUITEB_SUPPORT - case 11: - SET_AKM_SUITEB_SHA256( - wdev->SecConfig.AKMMap); - break; - - case 12: - SET_AKM_SUITEB_SHA384( - wdev->SecConfig.AKMMap); - break; -#endif -#ifdef HOSTAPD_OWE_SUPPORT - case 18: - SET_AKM_OWE( - wdev->SecConfig.AKMMap); - break; - -#endif - default: - /* wdev->AuthMode = Ndis802_11AuthModeMax; */ - SET_AKM_OPEN( - wdev->SecConfig.AKMMap); - break; - } - - pTmp += sizeof(AKM_SUITE_STRUCT); - Len -= sizeof(AKM_SUITE_STRUCT); - Count--; - } - -#ifdef DISABLE_HOSTAPD_BEACON - /*check for no pairwise, pmf, ptksa, gtksa counters */ - if (Len >= 2) { - memcpy(wdev->SecConfig.RsnCap, pTmp, 2); -#ifdef DOT11W_PMF_SUPPORT - { - RSN_CAPABILITIES RsnCap; - - NdisMoveMemory( - &RsnCap, pTmp, - sizeof(RSN_CAPABILITIES)); - RsnCap.word = - cpu2le16(RsnCap.word); - if (RsnCap.field.MFPC == 1) { - wdev->SecConfig.PmfCfg - .MFPC = 1; - wdev->SecConfig.PmfCfg - .Desired_MFPC = - 1; - } - if (RsnCap.field.MFPR == 1) { - wdev->SecConfig.PmfCfg - .MFPR = 1; - wdev->SecConfig.PmfCfg - .Desired_MFPR = - 1; - wdev->SecConfig.PmfCfg - .Desired_PMFSHA256 = - 1; - } - } -#endif /*DOT11W_PMF_SUPPORT*/ - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Copied Rsn cap %02x %02x \n", - wdev->SecConfig.RsnCap[0], - wdev->SecConfig.RsnCap[1])); - } - pTmp += sizeof(RSN_CAPABILITIES); - Len -= sizeof(RSN_CAPABILITIES); - /*Extract PMKID list */ - if (Len >= sizeof(UINT16)) { - INT offset = sizeof(UINT16); - - Count = (pTmp[1] << 8) + pTmp[0]; - if (Count > 0) { - offset += Count * LEN_PMKID; - } - pTmp += offset; - Len -= offset; - } -#ifdef DOT11W_PMF_SUPPORT - if (Len >= LEN_OUI_SUITE) { - UCHAR OUI_PMF_BIP_CMAC_128_CIPHER[4] = { - 0x00, 0x0F, 0xAC, 0x06 - }; - UCHAR OUI_PMF_BIP_CMAC_256_CIPHER[4] = { - 0x00, 0x0F, 0xAC, 0x0d - }; - UCHAR OUI_PMF_BIP_GMAC_128_CIPHER[4] = { - 0x00, 0x0F, 0xAC, 0x0b - }; - UCHAR OUI_PMF_BIP_GMAC_256_CIPHER[4] = { - 0x00, 0x0F, 0xAC, 0x0c - }; - - if (RTMPEqualMemory( - pTmp, - OUI_PMF_BIP_CMAC_128_CIPHER, - LEN_OUI_SUITE)) - SET_CIPHER_BIP_CMAC128( - wdev->SecConfig.PmfCfg - .igtk_cipher); - else if (RTMPEqualMemory( - pTmp, - OUI_PMF_BIP_CMAC_256_CIPHER, - LEN_OUI_SUITE)) - SET_CIPHER_BIP_CMAC256( - wdev->SecConfig.PmfCfg - .igtk_cipher); - else if (RTMPEqualMemory( - pTmp, - OUI_PMF_BIP_GMAC_128_CIPHER, - LEN_OUI_SUITE)) - SET_CIPHER_BIP_GMAC128( - wdev->SecConfig.PmfCfg - .igtk_cipher); - else if (RTMPEqualMemory( - pTmp, - OUI_PMF_BIP_GMAC_256_CIPHER, - LEN_OUI_SUITE)) - SET_CIPHER_BIP_GMAC256( - wdev->SecConfig.PmfCfg - .igtk_cipher); - else - MTWF_LOG( - DBG_CAT_SEC, - DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("Group Mgmt Cipher Not Supported \n")); - } -#endif - -#endif - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("AuthMode = 0x%x\n", - wdev->SecConfig.AKMMap)); - - if ((PairCipher == Ndis802_11WEPDisabled && - IS_CIPHER_NONE( - wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11WEPEnabled && - IS_CIPHER_WEP( - wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11TKIPEnable && - IS_CIPHER_TKIP( - wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11AESEnable && - IS_CIPHER_CCMP128( - wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11GCMP128Enable && - IS_CIPHER_GCMP128( - wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11GCMP256Enable && - IS_CIPHER_GCMP256( - wdev->SecConfig.GroupCipher)) || - (PairCipher == Ndis802_11CCMP256Enable && - IS_CIPHER_CCMP256( - wdev->SecConfig.GroupCipher))) { - wdev->SecConfig.PairwiseCipher = - wdev->SecConfig.GroupCipher; - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("WPA2 Mix TKIPAES\n")); - bMix = TRUE; - } - - if (bWPA2 && bWPA) { - pMbss->RSNIE_Len[1] = rsn_ie[1]; - NdisMoveMemory( - pMbss->RSN_IE[1], rsn_ie + 2, - rsn_ie[1]); /* copy rsn ie */ -#ifdef DISABLE_HOSTAPD_BEACON - pMbss->RSNIE_ID[1] = WLAN_EID_RSN; -#endif - } else { - pMbss->RSNIE_Len[0] = rsn_ie[1]; - os_move_mem( - pMbss->RSN_IE[0], rsn_ie + 2, - rsn_ie[1]); /* copy rsn ie */ -#ifdef DISABLE_HOSTAPD_BEACON - pMbss->RSNIE_ID[0] = WLAN_EID_RSN; -#endif - } - } else { - MTWF_LOG(DBG_CAT_SEC, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("%s:: wpa2 Open/None case\n", - __func__)); - /* wdev->AuthMode = Ndis802_11AuthModeOpen; */ - /* wait until wpa/wpa2 all not exist , then set open/none */ - } - } - } - - if (bWPA2 && bWPA) { - /* wdev->AuthMode = Ndis802_11AuthModeWPA1PSKWPA2PSK; */ - SET_AKM_WPA1PSK(wdev->SecConfig.AKMMap); - SET_AKM_WPA2PSK(wdev->SecConfig.AKMMap); - - if (bMix) { - /* wdev->WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES; */ - /* wdev->WepStatus = Ndis802_11TKIPAESMix; */ - SET_CIPHER_TKIP(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_CCMP128(wdev->SecConfig.PairwiseCipher); - } - } else if (bWPA2) { - if (bMix) { - /* wdev->WpaMixPairCipher = WPA_NONE_WPA2_TKIPAES; */ - /* wdev->WepStatus = Ndis802_11TKIPAESMix; */ - SET_AKM_WPA2PSK(wdev->SecConfig.AKMMap); - SET_CIPHER_TKIP(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_CCMP128(wdev->SecConfig.PairwiseCipher); - } - } else if (bWPA) { - if (bMix) { - /* wdev->WpaMixPairCipher = WPA_TKIPAES_WPA2_NONE; */ - /* wdev->WepStatus = Ndis802_11TKIPAESMix; */ - SET_AKM_WPA1PSK(wdev->SecConfig.AKMMap); - SET_CIPHER_TKIP(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_CCMP128(wdev->SecConfig.PairwiseCipher); - } - } else { - SET_AKM_OPEN(wdev->SecConfig.AKMMap); - SET_CIPHER_NONE(wdev->SecConfig.PairwiseCipher); - SET_CIPHER_NONE(wdev->SecConfig.GroupCipher); - } - - if (IS_AKM_WPA1(wdev->SecConfig.AKMMap) || - IS_AKM_WPA2(wdev->SecConfig.AKMMap)) - wdev->SecConfig.IEEE8021X = TRUE; - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("\nCFG80211 BEACON => bwpa2 %d, bwpa %d, bmix %d,AuthMode = %s ,wdev->PairwiseCipher = %s wdev->SecConfig.GroupCipher = %s\n", - bWPA2, bWPA, bMix, GetAuthModeStr(wdev->SecConfig.AKMMap), - GetEncryModeStr(wdev->SecConfig.PairwiseCipher), - GetEncryModeStr(wdev->SecConfig.GroupCipher))); -} -#endif /* CONFIG_AP_SUPPORT */ -#endif /* RT_CFG80211_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_util.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_util.c deleted file mode 100644 index 925aca7bd1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211_util.c +++ /dev/null @@ -1,1414 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2013, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - * Abstract: - * - * All related CFG80211 function body. - * - * History: - * - ***************************************************************************/ -#ifdef RT_CFG80211_SUPPORT -#define RTMP_MODULE_OS -#define RTMP_MODULE_OS_UTIL - -#include "rtmp_comm.h" -#include "rtmp_osabl.h" -#include "rt_os_util.h" - -#include "rt_config.h" -#include "chlist.h" - -/* all available channels */ - -static const UCHAR Cfg80211_Chan[] = { - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - - /* 802.11 UNI / HyperLan 2 */ - 36, - 40, - 44, - 48, - 52, - 56, - 60, - 64, - - /* 802.11 HyperLan 2 */ - 100, - 104, - 108, - 112, - 116, - 120, - 124, - 128, - 132, - 136, - - /* 802.11 UNII */ - 140, - 144, - 149, - 153, - 157, - 161, - 165, - 169, - 173, - - /* Japan */ - 184, - 188, - 192, - 196, - 208, - 212, - 216, -}; - -UCHAR Cfg80211_RadarChan[] = { - 52, 54, 56, 60, 62, 64, 100, 104, 144, -}; - -/* - * Array of bitrates the hardware can operate with - * in this band. Must be sorted to give a valid "supported - * rates" IE, i.e. CCK rates first, then OFDM. - * - * For HT, assign MCS in another structure, ieee80211_sta_ht_cap. - */ -const struct ieee80211_rate Cfg80211_SupRate[12] = { - { - .flags = IEEE80211_RATE_SHORT_PREAMBLE, - .bitrate = 10, - .hw_value = 0, - .hw_value_short = 0, - }, - { - .flags = IEEE80211_RATE_SHORT_PREAMBLE, - .bitrate = 20, - .hw_value = 1, - .hw_value_short = 1, - }, - { - .flags = IEEE80211_RATE_SHORT_PREAMBLE, - .bitrate = 55, - .hw_value = 2, - .hw_value_short = 2, - }, - { - .flags = IEEE80211_RATE_SHORT_PREAMBLE, - .bitrate = 110, - .hw_value = 3, - .hw_value_short = 3, - }, - { - .flags = 0, - .bitrate = 60, - .hw_value = 4, - .hw_value_short = 4, - }, - { - .flags = 0, - .bitrate = 90, - .hw_value = 5, - .hw_value_short = 5, - }, - { - .flags = 0, - .bitrate = 120, - .hw_value = 6, - .hw_value_short = 6, - }, - { - .flags = 0, - .bitrate = 180, - .hw_value = 7, - .hw_value_short = 7, - }, - { - .flags = 0, - .bitrate = 240, - .hw_value = 8, - .hw_value_short = 8, - }, - { - .flags = 0, - .bitrate = 360, - .hw_value = 9, - .hw_value_short = 9, - }, - { - .flags = 0, - .bitrate = 480, - .hw_value = 10, - .hw_value_short = 10, - }, - { - .flags = 0, - .bitrate = 540, - .hw_value = 11, - .hw_value_short = 11, - }, -}; - -static const UINT32 CipherSuites[] = { - WLAN_CIPHER_SUITE_WEP40, WLAN_CIPHER_SUITE_WEP104, - WLAN_CIPHER_SUITE_TKIP, WLAN_CIPHER_SUITE_CCMP, -#ifdef DOT11W_PMF_SUPPORT - WLAN_CIPHER_SUITE_AES_CMAC, -#ifdef HOSTAPD_SUITEB_SUPPORT - WLAN_CIPHER_SUITE_BIP_GMAC_256, -#endif -#endif /*DOT11W_PMF_SUPPORT*/ - WLAN_CIPHER_SUITE_GCMP, -#if (KERNEL_VERSION(4, 0, 0) <= LINUX_VERSION_CODE) - WLAN_CIPHER_SUITE_CCMP_256, -#ifdef HOSTAPD_SUITEB_SUPPORT - WLAN_CIPHER_SUITE_GCMP_256, -#endif -#endif -}; -/*Changes to support 4_19 kernel version*/ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) -static struct ieee80211_sband_iftype_data iwl_he_capa = { - .types_mask = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP), - .he_cap = { - .has_he = true, - .he_cap_elem = { - .mac_cap_info[0] = - IEEE80211_HE_MAC_CAP0_HTC_HE, - .mac_cap_info[1] = - IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US | - IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_QOS_8, - .mac_cap_info[2] = - IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP | - IEEE80211_HE_MAC_CAP2_ACK_EN, - .mac_cap_info[3] = - IEEE80211_HE_MAC_CAP3_GRP_ADDR_MULTI_STA_BA_DL_MU | - IEEE80211_HE_MAC_CAP3_MAX_A_AMPDU_LEN_EXP_VHT_2, - .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, - .phy_cap_info[0] = - IEEE80211_HE_PHY_CAP0_DUAL_BAND | - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G | - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G, - .phy_cap_info[1] = - IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A | - IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD | - IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_MAX_NSTS, - .phy_cap_info[2] = - IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US | - IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ | - IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ, - .phy_cap_info[3] = - IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_BPSK | - IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1 | - IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_BPSK | - IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1, - .phy_cap_info[4] = - IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE | - IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8 | - IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8, - .phy_cap_info[5] = - IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 | - IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2, - .phy_cap_info[6] = - IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT, - .phy_cap_info[7] = - IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR | - IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI | - IEEE80211_HE_PHY_CAP7_MAX_NC_7, - .phy_cap_info[8] = - IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI | - IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | - IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU | - IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU, - }, - /* - * Set default Tx/Rx HE MCS NSS Support field. Indicate support - * for up to 2 spatial streams and all MCS, without any special - * cases - */ - .he_mcs_nss_supp = { - .rx_mcs_80 = cpu_to_le16(0xfffa), - .tx_mcs_80 = cpu_to_le16(0xfffa), - .rx_mcs_160 = cpu_to_le16(0xfffa), - .tx_mcs_160 = cpu_to_le16(0xfffa), - .rx_mcs_80p80 = cpu_to_le16(0xffff), - .tx_mcs_80p80 = cpu_to_le16(0xffff), - }, - /* - * Set default PPE thresholds, with PPET16 set to 0, PPET8 set - * to 7 - */ - .ppe_thres = {0x61, 0x1c, 0xc7, 0x71}, - }, -}; -#endif -static BOOLEAN IsRadarChannel(UCHAR ch) -{ - UINT idx = 0; - - for (idx = 0; idx < sizeof(Cfg80211_RadarChan); idx++) { - if (Cfg80211_RadarChan[idx] == ch) - return TRUE; - } - - return FALSE; -} - -VOID CFG80211OS_PutBss(IN VOID *pWiphyOrg, IN VOID *pCfg80211Bss) -{ - struct cfg80211_bss *bss = (struct cfg80211_bss *)pCfg80211Bss; -#if (KERNEL_VERSION(3, 9, 0) <= LINUX_VERSION_CODE) - struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg; - - cfg80211_put_bss(pWiphy, bss); -#else - cfg80211_put_bss(bss); -#endif /* LINUX_VERSION_CODE: 3.9.0 */ -} - -/* - * ======================================================================== - * Routine Description: - * UnRegister MAC80211 Module. - * - * Arguments: - * pCB - CFG80211 control block pointer - * pNetDev - Network device - * - * Return Value: - * NONE - * - * ======================================================================== - */ -VOID CFG80211OS_UnRegister(VOID *pCB, VOID *pNetDevOrg) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct net_device *pNetDev = (struct net_device *)pNetDevOrg; - - /* unregister */ - if (pCfg80211_CB->pCfg80211_Wdev != NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> unregister/free wireless device\n")); - /* - * Must unregister, or you will suffer problem when you change - * regulatory domain by using iw. - */ -#ifdef RFKILL_HW_SUPPORT - wiphy_rfkill_stop_polling(pCfg80211_CB->pCfg80211_Wdev->wiphy); -#endif /* RFKILL_HW_SUPPORT */ - wiphy_unregister(pCfg80211_CB->pCfg80211_Wdev->wiphy); - wiphy_free(pCfg80211_CB->pCfg80211_Wdev->wiphy); - os_free_mem(pCfg80211_CB->pCfg80211_Wdev); - - if (pCfg80211_CB->pCfg80211_Channels != NULL) - kfree(pCfg80211_CB->pCfg80211_Channels); - - if (pCfg80211_CB->pCfg80211_Rates != NULL) - kfree(pCfg80211_CB->pCfg80211_Rates); - - pCfg80211_CB->pCfg80211_Wdev = NULL; - pCfg80211_CB->pCfg80211_Channels = NULL; - pCfg80211_CB->pCfg80211_Rates = NULL; - /* must reset to NULL; or kernel will panic in unregister_netdev */ - pNetDev->ieee80211_ptr = NULL; - SET_NETDEV_DEV(pNetDev, NULL); - } - - os_free_mem(pCfg80211_CB); -} - -/* - * ======================================================================== - * Routine Description: - * Initialize wireless channel in 2.4GHZ and 5GHZ. - * - * Arguments: - * pAd - WLAN control block pointer - * pWiphy - WLAN PHY interface - * pChannels - Current channel info - * pRates - Current rate info - * - * Return Value: - * TRUE - init successfully - * FALSE - init fail - * - * Note: - * TX Power related: - * - * 1. Suppose we can send power to 15dBm in the board. - * 2. A value 0x0 ~ 0x1F for a channel. We will adjust it based on 15dBm/ - * 54Mbps. So if value == 0x07, the TX power of 54Mbps is 15dBm and - * the value is 0x07 in the EEPROM. - * 3. Based on TX power value of 54Mbps/channel, adjust another value - * 0x0 ~ 0xF for other data rate. (-6dBm ~ +6dBm) - * - * Other related factors: - * 1. TX power percentage from UI/users; - * 2. Maximum TX power limitation in the regulatory domain. - * ======================================================================== - */ -BOOLEAN CFG80211_SupBandInit(IN VOID *pCB, IN CFG80211_BAND *pDriverBandInfo, - IN VOID *pWiphyOrg, IN VOID *pChannelsOrg, - IN VOID *pRatesOrg) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg; - struct ieee80211_channel *pChannels = - (struct ieee80211_channel *)pChannelsOrg; - struct ieee80211_rate *pRates = (struct ieee80211_rate *)pRatesOrg; - struct ieee80211_supported_band *pBand; - UINT32 NumOfChan, NumOfRate; - UINT32 IdLoop; - UINT32 CurTxPower; - - /* sanity check */ - if (pDriverBandInfo->RFICType == 0) - pDriverBandInfo->RFICType = RFIC_24GHZ | RFIC_5GHZ; - - /* 1. Calcute the Channel Number */ - if (pDriverBandInfo->RFICType & RFIC_5GHZ) - NumOfChan = - CFG80211_NUM_OF_CHAN_2GHZ + CFG80211_NUM_OF_CHAN_5GHZ; - else - NumOfChan = CFG80211_NUM_OF_CHAN_2GHZ; - - /* 2. Calcute the Rate Number */ - NumOfRate = 4 + 8; -#ifdef DBDC_MODE - NumOfRate = 4 + 8; -#endif - - CFG80211DBG(DBG_LVL_ERROR, ("80211> RFICType= %d, NumOfChan= %d\n", - pDriverBandInfo->RFICType, NumOfChan)); - CFG80211DBG(DBG_LVL_ERROR, ("80211> Number of rate = %d\n", NumOfRate)); - - /* 3. Allocate the Channel instance */ - if (pChannels == NULL && NumOfChan) { - pChannels = kcalloc(NumOfChan, sizeof(*pChannels), GFP_KERNEL); - - if (!pChannels) { - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> ieee80211_channel allocation fail!\n")); - return FALSE; - } - } - - /* 4. Allocate the Rate instance */ - if (pRates == NULL && NumOfRate) { - pRates = kcalloc(NumOfRate, sizeof(*pRates), GFP_KERNEL); - - if (!pRates) { - os_free_mem(pChannels); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> ieee80211_rate allocation fail!\n")); - return FALSE; - } - } - - /* get TX power */ - CurTxPower = 0; /* unknown */ - CFG80211DBG(DBG_LVL_ERROR, - ("80211> CurTxPower = %d dBm\n", CurTxPower)); - - /* 5. init channel */ - for (IdLoop = 0; IdLoop < NumOfChan; IdLoop++) { -#if (KERNEL_VERSION(2, 6, 39) <= LINUX_VERSION_CODE) - - if (IdLoop >= 14) { - pChannels[IdLoop].band = IEEE80211_BAND_5GHZ; - pChannels[IdLoop].center_freq = - ieee80211_channel_to_frequency( - Cfg80211_Chan[IdLoop], - IEEE80211_BAND_5GHZ); - } else { - pChannels[IdLoop].band = IEEE80211_BAND_2GHZ; - pChannels[IdLoop].center_freq = - ieee80211_channel_to_frequency( - Cfg80211_Chan[IdLoop], - IEEE80211_BAND_2GHZ); - } - -#else - pChannels[IdLoop].center_freq = - ieee80211_channel_to_frequency(Cfg80211_Chan[IdLoop]); -#endif - pChannels[IdLoop].hw_value = IdLoop; - - if (IdLoop < CFG80211_NUM_OF_CHAN_2GHZ) - pChannels[IdLoop].max_power = CurTxPower; - else - pChannels[IdLoop].max_power = CurTxPower; - - pChannels[IdLoop].max_antenna_gain = 0xff; - pChannels[IdLoop].flags = 0; - - /* if (RadarChannelCheck(pAd, Cfg80211_Chan[IdLoop])) */ - if (IsRadarChannel(Cfg80211_Chan[IdLoop])) { - CFG80211DBG(DBG_LVL_TRACE, ("====> Radar Channel %d\n", - Cfg80211_Chan[IdLoop])); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) - pChannels[IdLoop].flags |= - (IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR); -#else - pChannels[IdLoop].flags |= - (IEEE80211_CHAN_RADAR | - IEEE80211_CHAN_PASSIVE_SCAN); -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) - pChannels[IdLoop].dfs_state = NL80211_DFS_AVAILABLE; -#endif - } - - /* CFG_TODO: - * pChannels[IdLoop].flags - * enum ieee80211_channel_flags { - * IEEE80211_CHAN_DISABLED = 1<<0, - * IEEE80211_CHAN_PASSIVE_SCAN = 1<<1, - * IEEE80211_CHAN_NO_IBSS = 1<<2, - * IEEE80211_CHAN_RADAR = 1<<3, - * IEEE80211_CHAN_NO_HT40PLUS = 1<<4, - * IEEE80211_CHAN_NO_HT40MINUS = 1<<5, - * }; - */ - } - - /* 6. init rate */ - for (IdLoop = 0; IdLoop < NumOfRate; IdLoop++) - memcpy(&pRates[IdLoop], &Cfg80211_SupRate[IdLoop], - sizeof(*pRates)); - - /* CFG_TODO: - * enum ieee80211_rate_flags { - * IEEE80211_RATE_SHORT_PREAMBLE = 1<<0, - * IEEE80211_RATE_MANDATORY_A = 1<<1, - * IEEE80211_RATE_MANDATORY_B = 1<<2, - * IEEE80211_RATE_MANDATORY_G = 1<<3, - * IEEE80211_RATE_ERP_G = 1<<4, - * }; - */ - /* 7. Fill the Band 2.4GHz */ - pBand = &pCfg80211_CB->Cfg80211_bands[IEEE80211_BAND_2GHZ]; - - if (pDriverBandInfo->RFICType & RFIC_24GHZ) { - pBand->n_channels = CFG80211_NUM_OF_CHAN_2GHZ; -#ifdef DBDC_MODE -#endif - pBand->n_bitrates = NumOfRate; - pBand->channels = pChannels; - pBand->bitrates = pRates; -#ifdef DOT11_N_SUPPORT - /* for HT, assign pBand->ht_cap */ - pBand->ht_cap.ht_supported = true; - pBand->ht_cap.cap = - IEEE80211_HT_CAP_SUP_WIDTH_20_40 | - IEEE80211_HT_CAP_SM_PS | IEEE80211_HT_CAP_SGI_40 | - IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_TX_STBC | - IEEE80211_HT_CAP_RX_STBC | IEEE80211_HT_CAP_DSSSCCK40; - pBand->ht_cap.ampdu_factor = - IEEE80211_HT_MAX_AMPDU_64K; /* 2 ^ 16 */ - pBand->ht_cap.ampdu_density = - pDriverBandInfo->MpduDensity; /* YF_TODO */ - memset(&pBand->ht_cap.mcs, 0, sizeof(pBand->ht_cap.mcs)); - CFG80211DBG(DBG_LVL_ERROR, ("80211> TxStream = %d\n", - pDriverBandInfo->TxStream)); - - switch (pDriverBandInfo->TxStream) { - case 1: - default: - pBand->ht_cap.mcs.rx_mask[0] = 0xff; - pBand->ht_cap.mcs.rx_highest = cpu_to_le16(150); - break; - - case 2: - pBand->ht_cap.mcs.rx_mask[0] = 0xff; - pBand->ht_cap.mcs.rx_mask[1] = 0xff; - pBand->ht_cap.mcs.rx_highest = cpu_to_le16(300); - break; - - case 3: - pBand->ht_cap.mcs.rx_mask[0] = 0xff; - pBand->ht_cap.mcs.rx_mask[1] = 0xff; - pBand->ht_cap.mcs.rx_mask[2] = 0xff; - pBand->ht_cap.mcs.rx_highest = cpu_to_le16(450); - break; - - case 4: - pBand->ht_cap.mcs.rx_mask[0] = 0xff; - pBand->ht_cap.mcs.rx_mask[1] = 0xff; - pBand->ht_cap.mcs.rx_mask[2] = 0xff; - pBand->ht_cap.mcs.rx_mask[3] = 0xff; - pBand->ht_cap.mcs.rx_highest = cpu_to_le16(600); - break; - } - - pBand->ht_cap.mcs.rx_mask[4] = 0x01; /* 40MHz*/ - pBand->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; -#endif /* DOT11_N_SUPPORT */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - pBand->n_iftype_data = 1; - pBand->iftype_data = &iwl_he_capa; -#endif - pWiphy->bands[IEEE80211_BAND_2GHZ] = pBand; - } else { - pWiphy->bands[IEEE80211_BAND_2GHZ] = NULL; - pBand->channels = NULL; - pBand->bitrates = NULL; - } - - /* 8. Fill the Band 5GHz */ - pBand = &pCfg80211_CB->Cfg80211_bands[IEEE80211_BAND_5GHZ]; - - if (pDriverBandInfo->RFICType & RFIC_5GHZ) { - pBand->n_channels = CFG80211_NUM_OF_CHAN_5GHZ; - pBand->n_bitrates = NumOfRate - 4; /*Disable 11B rate*/ - pBand->channels = &pChannels[CFG80211_NUM_OF_CHAN_2GHZ]; - pBand->bitrates = &pRates[4]; -#ifdef DOT11_N_SUPPORT - /* for HT, assign pBand->ht_cap */ - pBand->ht_cap.ht_supported = true; - pBand->ht_cap.cap = - IEEE80211_HT_CAP_SUP_WIDTH_20_40 | - IEEE80211_HT_CAP_SM_PS | IEEE80211_HT_CAP_SGI_40 | - IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_TX_STBC | - IEEE80211_HT_CAP_RX_STBC | IEEE80211_HT_CAP_DSSSCCK40; - pBand->ht_cap.ampdu_factor = - IEEE80211_HT_MAX_AMPDU_64K; /* 2 ^ 16 */ - pBand->ht_cap.ampdu_density = - pDriverBandInfo->MpduDensity; /* YF_TODO */ - memset(&pBand->ht_cap.mcs, 0, sizeof(pBand->ht_cap.mcs)); - - switch (pDriverBandInfo->RxStream) { - case 1: - default: - pBand->ht_cap.mcs.rx_mask[0] = 0xff; - pBand->ht_cap.mcs.rx_highest = cpu_to_le16(150); - break; - - case 2: - pBand->ht_cap.mcs.rx_mask[0] = 0xff; - pBand->ht_cap.mcs.rx_mask[1] = 0xff; - pBand->ht_cap.mcs.rx_highest = cpu_to_le16(300); - break; - - case 3: - pBand->ht_cap.mcs.rx_mask[0] = 0xff; - pBand->ht_cap.mcs.rx_mask[1] = 0xff; - pBand->ht_cap.mcs.rx_mask[2] = 0xff; - pBand->ht_cap.mcs.rx_highest = cpu_to_le16(450); - break; - - case 4: - pBand->ht_cap.mcs.rx_mask[0] = 0xff; - pBand->ht_cap.mcs.rx_mask[1] = 0xff; - pBand->ht_cap.mcs.rx_mask[2] = 0xff; - pBand->ht_cap.mcs.rx_mask[3] = 0xff; - pBand->ht_cap.mcs.rx_highest = cpu_to_le16(600); - break; - } - - pBand->ht_cap.mcs.rx_mask[4] = 0x01; /* 40MHz*/ - pBand->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11_VHT_AC - pBand->vht_cap.vht_supported = true; - pBand->vht_cap.cap = - IEEE80211_VHT_CAP_RXLDPC | - IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK | - IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 | - IEEE80211_VHT_CAP_SHORT_GI_80 | - IEEE80211_VHT_CAP_TXSTBC | IEEE80211_STA_RX_BW_80 | - IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK | - IEEE80211_VHT_CAP_RXSTBC_MASK; -#endif /* DOT11_VHT_AC */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - pBand->n_iftype_data = 1; - pBand->iftype_data = &iwl_he_capa; -#endif - pWiphy->bands[IEEE80211_BAND_5GHZ] = pBand; - } else { - pWiphy->bands[IEEE80211_BAND_5GHZ] = NULL; - pBand->channels = NULL; - pBand->bitrates = NULL; - } - - /* 9. re-assign to mainDevice info */ - pCfg80211_CB->pCfg80211_Channels = pChannels; - pCfg80211_CB->pCfg80211_Rates = pRates; - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Re-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ. - * - * Arguments: - * pCB - CFG80211 control block pointer - * pBandInfo - Band information - * - * Return Value: - * TRUE - re-init successfully - * FALSE - re-init fail - * - * Note: - * CFG80211_SupBandInit() is called in xx_probe(). - * But we do not have complete chip information in xx_probe() so we - * need to re-init bands in xx_open(). - * ======================================================================== - */ -BOOLEAN CFG80211OS_SupBandReInit(IN VOID *pCB, IN CFG80211_BAND *pBandInfo) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct wiphy *pWiphy; - - if ((pCfg80211_CB == NULL) || (pCfg80211_CB->pCfg80211_Wdev == NULL)) - return FALSE; - - pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - - if (pWiphy != NULL) { - CFG80211DBG(DBG_LVL_ERROR, ("80211> re-init bands...\n")); - /* re-init bands */ - CFG80211_SupBandInit(pCfg80211_CB, pBandInfo, pWiphy, - pCfg80211_CB->pCfg80211_Channels, - pCfg80211_CB->pCfg80211_Rates); -#if (KERNEL_VERSION(2, 6, 32) <= LINUX_VERSION_CODE) - /* re-init PHY */ - pWiphy->rts_threshold = pBandInfo->RtsThreshold; - pWiphy->frag_threshold = pBandInfo->FragmentThreshold; - pWiphy->retry_short = pBandInfo->RetryMaxCnt & 0xff; - pWiphy->retry_long = (pBandInfo->RetryMaxCnt & 0xff00) >> 8; -#endif /* LINUX_VERSION_CODE */ - return TRUE; - } - - return FALSE; -} - -/* - * ======================================================================== - * Routine Description: - * Hint to the wireless core a regulatory domain from driver. - * - * Arguments: - * pAd - WLAN control block pointer - * pCountryIe - pointer to the country IE - * CountryIeLen - length of the country IE - * - * Return Value: - * NONE - * - * Note: - * Must call the function in kernel thread. - * ======================================================================== - */ -VOID CFG80211OS_RegHint(IN VOID *pCB, IN UCHAR *pCountryIe, - IN ULONG CountryIeLen) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - - CFG80211DBG(DBG_LVL_ERROR, ("crda> regulatory domain hint: %c%c\n", - pCountryIe[0], pCountryIe[1])); - - if ((pCfg80211_CB->pCfg80211_Wdev == NULL) || (pCountryIe == NULL)) { - CFG80211DBG(DBG_LVL_ERROR, - ("crda> regulatory domain hint not support!\n")); - return; - } - - /* hints a country IE as a regulatory domain "without" channel/power info. */ - regulatory_hint(pCfg80211_CB->pCfg80211_Wdev->wiphy, - (const char *)pCountryIe); -} - -/* - * ======================================================================== - * Routine Description: - * Hint to the wireless core a regulatory domain from country element. - * - * Arguments: - * pAdCB - WLAN control block pointer - * pCountryIe - pointer to the country IE - * CountryIeLen - length of the country IE - * - * Return Value: - * NONE - * - * Note: - * Must call the function in kernel thread. - * ======================================================================== - */ -VOID CFG80211OS_RegHint11D(IN VOID *pCB, IN UCHAR *pCountryIe, - IN ULONG CountryIeLen) -{ - /* no regulatory_hint_11d() in 2.6.32 */ -#if (KERNEL_VERSION(2, 6, 32) > LINUX_VERSION_CODE) - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - - if ((pCfg80211_CB->pCfg80211_Wdev == NULL) || (pCountryIe == NULL)) { - CFG80211DBG(DBG_LVL_ERROR, - ("crda> regulatory domain hint not support!\n")); - return; - } - - CFG80211DBG(DBG_LVL_ERROR, ("crda> regulatory domain hint: %c%c\n", - pCountryIe[0], pCountryIe[1])); - /* - * hints a country IE as a regulatory domain "with" channel/power info. - * but if you use regulatory_hint(), it only hint "regulatory domain". - */ - regulatory_hint_11d(pCfg80211_CB->pCfg80211_Wdev->wiphy, pCountryIe, - CountryIeLen); -#endif /* LINUX_VERSION_CODE */ -} - -BOOLEAN CFG80211OS_BandInfoGet(IN VOID *pCB, IN VOID *pWiphyOrg, - OUT VOID **ppBand24, OUT VOID **ppBand5) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg; - - if (pWiphy == NULL) { - if ((pCfg80211_CB != NULL) && - (pCfg80211_CB->pCfg80211_Wdev != NULL)) - pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - } - - if (pWiphy == NULL) - return FALSE; - - *ppBand24 = pWiphy->bands[IEEE80211_BAND_2GHZ]; - *ppBand5 = pWiphy->bands[IEEE80211_BAND_5GHZ]; - return TRUE; -} - -UINT32 CFG80211OS_ChanNumGet(IN VOID *pCB, IN VOID *pWiphyOrg, IN UINT32 IdBand) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg; - - if (pWiphy == NULL) { - if ((pCfg80211_CB != NULL) && - (pCfg80211_CB->pCfg80211_Wdev != NULL)) - pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - } - - if (pWiphy == NULL) - return 0; - - if (pWiphy->bands[IdBand] != NULL) - return pWiphy->bands[IdBand]->n_channels; - - return 0; -} - -BOOLEAN CFG80211OS_ChanInfoGet(IN VOID *pCB, IN VOID *pWiphyOrg, - IN UINT32 IdBand, IN UINT32 IdChan, - OUT UINT32 *pChanId, OUT UINT32 *pPower, - OUT BOOLEAN *pFlgIsRadar) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg; - struct ieee80211_supported_band *pSband; - struct ieee80211_channel *pChan; - - if (pWiphy == NULL) { - if ((pCfg80211_CB != NULL) && - (pCfg80211_CB->pCfg80211_Wdev != NULL)) - pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - } - - if (pWiphy == NULL) - return FALSE; - - pSband = pWiphy->bands[IdBand]; - pChan = &pSband->channels[IdChan]; - *pChanId = ieee80211_frequency_to_channel(pChan->center_freq); - - if (pChan->flags & IEEE80211_CHAN_DISABLED) { - CFG80211DBG(DBG_LVL_ERROR, - ("Chan %03d (frq %d):\tnot allowed!\n", (*pChanId), - pChan->center_freq)); - return FALSE; - } - - *pPower = pChan->max_power; - - if (pChan->flags & IEEE80211_CHAN_RADAR) - *pFlgIsRadar = TRUE; - else - *pFlgIsRadar = FALSE; - - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Initialize a channel information used in scan inform. - * - * Arguments: - * - * Return Value: - * TRUE - Successful - * FALSE - Fail - * - * ======================================================================== - */ -BOOLEAN CFG80211OS_ChanInfoInit(IN VOID *pCB, IN UINT32 InfoIndex, - IN UCHAR ChanId, IN UCHAR MaxTxPwr, - IN BOOLEAN FlgIsNMode, IN BOOLEAN FlgIsBW20M) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct ieee80211_channel *pChan; - - if (InfoIndex >= MAX_NUM_OF_CHANNELS) - return FALSE; - - pChan = (struct ieee80211_channel *)&( - pCfg80211_CB->ChanInfo[InfoIndex]); - memset(pChan, 0, sizeof(*pChan)); - - if (ChanId > 14) - pChan->band = IEEE80211_BAND_5GHZ; - else - pChan->band = IEEE80211_BAND_2GHZ; - -#if (KERNEL_VERSION(2, 6, 39) <= LINUX_VERSION_CODE) - pChan->center_freq = - ieee80211_channel_to_frequency(ChanId, pChan->band); -#else - pChan->center_freq = ieee80211_channel_to_frequency(ChanId); -#endif -#if (KERNEL_VERSION(2, 6, 32) > LINUX_VERSION_CODE) - - if (FlgIsNMode == TRUE) { - if (FlgIsBW20M == TRUE) - pChan->max_bandwidth = 20; /* 20MHz */ - else - pChan->max_bandwidth = 40; /* 40MHz */ - } else - pChan->max_bandwidth = 5; /* 5MHz for non-HT device */ - -#endif /* LINUX_VERSION_CODE */ - /* no use currently in 2.6.30 */ - /* if (ieee80211_is_beacon(((struct ieee80211_mgmt *)pFrame)->frame_control)) */ - /* pChan->beacon_found = 1; */ - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Inform us that a scan is got. - * - * Arguments: - * pAdCB - WLAN control block pointer - * - * Return Value: - * NONE - * - * Note: - * Call RT_CFG80211_SCANNING_INFORM, not CFG80211_Scaning - * ======================================================================== - */ -VOID CFG80211OS_Scaning(IN VOID *pCB, IN UINT32 ChanId, IN UCHAR *pFrame, - IN UINT32 FrameLen, IN INT32 RSSI, - IN BOOLEAN FlgIsNMode, IN UINT8 BW) -{ -#if (KERNEL_VERSION(2, 6, 30) <= LINUX_VERSION_CODE) -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct ieee80211_supported_band *pBand; - UINT32 IdChan; - UINT32 CenFreq; - UINT CurBand; - struct wiphy *pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - struct cfg80211_bss *bss = NULL; - struct ieee80211_mgmt *mgmt; - - mgmt = (struct ieee80211_mgmt *)pFrame; - - if (ChanId == 0) - ChanId = 1; - - /* get channel information */ -#if (KERNEL_VERSION(2, 6, 39) <= LINUX_VERSION_CODE) - - if (ChanId > 14) - CenFreq = ieee80211_channel_to_frequency(ChanId, - IEEE80211_BAND_5GHZ); - else - CenFreq = ieee80211_channel_to_frequency(ChanId, - IEEE80211_BAND_2GHZ); - -#else - CenFreq = ieee80211_channel_to_frequency(ChanId); -#endif - - if (ChanId > 14) - CurBand = IEEE80211_BAND_5GHZ; - else - CurBand = IEEE80211_BAND_2GHZ; - - pBand = &pCfg80211_CB->Cfg80211_bands[CurBand]; - - for (IdChan = 0; IdChan < pBand->n_channels; IdChan++) { - if (pBand->channels[IdChan].center_freq == CenFreq) - break; - } - - if (IdChan >= pBand->n_channels) { - MTWF_LOG( - DBG_CAT_CLIENT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("80211> Can not find any chan info! ==> %d[%d],[%d]\n", - ChanId, CenFreq, pBand->n_channels)); - return; - } - - if (pWiphy->signal_type == CFG80211_SIGNAL_TYPE_MBM) { - /* CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) */ - RSSI = RSSI * 100; - } - - if (!mgmt->u.probe_resp.timestamp) { - struct timeval tv; - - do_gettimeofday(&tv); - mgmt->u.probe_resp.timestamp = - ((UINT64)tv.tv_sec * 1000000) + tv.tv_usec; - } - - /* inform 80211 a scan is got */ - /* we can use cfg80211_inform_bss in 2.6.31, it is easy more than the one */ - /* in cfg80211_inform_bss_frame(), it will memcpy pFrame but pChan */ - bss = cfg80211_inform_bss_frame(pWiphy, &pBand->channels[IdChan], mgmt, - FrameLen, RSSI, GFP_ATOMIC); - - if (unlikely(!bss)) { - CFG80211DBG(DBG_LVL_ERROR, - ("80211> bss inform fail ==> %d\n", IdChan)); - return; - } - - CFG80211OS_PutBss(pWiphy, bss); -#endif /* defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) */ -#endif /* LINUX_VERSION_CODE */ -} - -/* - * ======================================================================== - * Routine Description: - * Inform us that scan ends. - * - * Arguments: - * pAdCB - WLAN control block pointer - * FlgIsAborted - 1: scan is aborted - * - * Return Value: - * NONE - * ======================================================================== - */ -VOID CFG80211OS_ScanEnd(IN VOID *pCB, IN BOOLEAN FlgIsAborted) -{ -#if (KERNEL_VERSION(2, 6, 30) <= LINUX_VERSION_CODE) - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - - NdisAcquireSpinLock(&pCfg80211_CB->scan_notify_lock); - - if (pCfg80211_CB->pCfg80211_ScanReq) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - struct cfg80211_scan_info info = { - .aborted = FlgIsAborted, - }; -#endif - CFG80211DBG(DBG_LVL_ERROR, ("80211> cfg80211_scan_done\n")); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - cfg80211_scan_done(pCfg80211_CB->pCfg80211_ScanReq, &info); -#else - cfg80211_scan_done(pCfg80211_CB->pCfg80211_ScanReq, - FlgIsAborted); -#endif - pCfg80211_CB->pCfg80211_ScanReq = NULL; - } else - CFG80211DBG(DBG_LVL_ERROR, - ("80211> cfg80211_scan_done ==> NULL\n")); - - NdisReleaseSpinLock(&pCfg80211_CB->scan_notify_lock); -#endif /* LINUX_VERSION_CODE */ -} - -/* - * ======================================================================== - * Routine Description: - * Inform CFG80211 about association status. - * - * Arguments: - * pAdCB - WLAN control block pointer - * pBSSID - the BSSID of the AP - * pReqIe - the element list in the association request frame - * ReqIeLen - the request element length - * pRspIe - the element list in the association response frame - * RspIeLen - the response element length - * FlgIsSuccess - 1: success; otherwise: fail - * - * Return Value: - * None - * ======================================================================== - */ -void CFG80211OS_ConnectResultInform(IN VOID *pCB, IN UCHAR *pBSSID, - IN UCHAR *pReqIe, IN UINT32 ReqIeLen, - IN UCHAR *pRspIe, IN UINT32 RspIeLen, - IN UCHAR FlgIsSuccess) -{ -#if (KERNEL_VERSION(2, 6, 32) <= LINUX_VERSION_CODE) - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - - if ((pCfg80211_CB->pCfg80211_Wdev->netdev == NULL) || (pBSSID == NULL)) - return; - - if (FlgIsSuccess) { - cfg80211_connect_result(pCfg80211_CB->pCfg80211_Wdev->netdev, - pBSSID, pReqIe, ReqIeLen, pRspIe, - RspIeLen, WLAN_STATUS_SUCCESS, - GFP_KERNEL); - } else { - cfg80211_connect_result(pCfg80211_CB->pCfg80211_Wdev->netdev, - pBSSID, NULL, 0, NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, - GFP_KERNEL); - } - -#endif /* LINUX_VERSION_CODE */ -} - -/* CFG_TODO: should be merge totoger */ -void CFG80211OS_P2pClientConnectResultInform(IN PNET_DEV pNetDev, - IN UCHAR *pBSSID, IN UCHAR *pReqIe, - IN UINT32 ReqIeLen, - IN UCHAR *pRspIe, - IN UINT32 RspIeLen, - IN UCHAR FlgIsSuccess) -{ - if ((pNetDev == NULL) || (pBSSID == NULL)) - return; - - if (FlgIsSuccess) { - CFG80211DBG( - DBG_LVL_ERROR, - ("CFG80211 Connection Success APCLI: ReqIeLen %d, RspIeLen, %d Bssid %02x %02x %02x %02x %02x %02x\n", - ReqIeLen, RspIeLen, pBSSID[0], pBSSID[1], pBSSID[2], - pBSSID[3], pBSSID[4], pBSSID[5])); - hex_dump("APCLI Req:", pReqIe, ReqIeLen); - hex_dump("APCLI Rsp:", pRspIe, RspIeLen); - cfg80211_connect_result(pNetDev, pBSSID, pReqIe, ReqIeLen, - pRspIe, RspIeLen, WLAN_STATUS_SUCCESS, - GFP_KERNEL); - } else { - CFG80211DBG( - DBG_LVL_ERROR, - ("CFG80211 Connection Failure Bssid %02x %02x %02x %02x %02x %02x\n", - pBSSID[0], pBSSID[1], pBSSID[2], pBSSID[3], pBSSID[4], - pBSSID[5])); - cfg80211_connect_result(pNetDev, pBSSID, NULL, 0, NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, - GFP_KERNEL); - } -} - -BOOLEAN CFG80211OS_RxMgmt(IN PNET_DEV pNetDev, IN INT32 freq, IN PUCHAR frame, - IN UINT32 len) -{ - /* Sanity Check */ - if (pNetDev == NULL) { - CFG80211DBG(DBG_LVL_ERROR, ("%s: pNetDev == NULL\n", __func__)); - return FALSE; - } - -#if (KERNEL_VERSION(3, 6, 0) <= LINUX_VERSION_CODE) - return cfg80211_rx_mgmt(pNetDev->ieee80211_ptr, freq, - 0, /* CFG_TODO return 0 in dbm */ - frame, len, GFP_ATOMIC); -#else -#if (KERNEL_VERSION(3, 4, 0) <= LINUX_VERSION_CODE) - return cfg80211_rx_mgmt(pNetDev, freq, 0, /* CFG_TODO return 0 in dbm */ - frame, len, GFP_ATOMIC); -#else - return cfg80211_rx_mgmt(pNetDev, freq, frame, len, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE: 3.4.0*/ -#endif /* LINUX_VERSION_CODE: 3.6.0 */ -} - -VOID CFG80211OS_TxStatus(IN PNET_DEV pNetDev, IN INT32 cookie, IN PUCHAR frame, - IN UINT32 len, IN BOOLEAN ack) -{ - return cfg80211_mgmt_tx_status(pNetDev->ieee80211_ptr, cookie, frame, - len, ack, GFP_ATOMIC); -} - -VOID CFG80211OS_NewSta(IN PNET_DEV pNetDev, IN const PUCHAR mac_addr, - IN const PUCHAR assoc_frame, IN UINT32 assoc_len, - IN BOOLEAN isReassoc) -{ - struct station_info *sinfo = NULL; - struct ieee80211_mgmt *mgmt; - - os_alloc_mem(NULL, (UCHAR **)&sinfo, sizeof(struct station_info)); - - if (!sinfo) - return; - - os_zero_mem(sinfo, sizeof(struct station_info)); - - /* If get error here, be sure patch the cfg80211_new_sta.patch into kernel. */ - if (pNetDev->ieee80211_ptr->iftype != RT_CMD_80211_IFTYPE_ADHOC) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) - /*no option available in latest implementation, to fill this var*/ -#else - sinfo->filled = STATION_INFO_ASSOC_REQ_IES; -#endif - mgmt = (struct ieee80211_mgmt *)assoc_frame; - if (isReassoc) { - sinfo->assoc_req_ies_len = assoc_len - 24 - 10; - sinfo->assoc_req_ies = mgmt->u.reassoc_req.variable; - } else { - sinfo->assoc_req_ies_len = assoc_len - 24 - 4; - sinfo->assoc_req_ies = mgmt->u.assoc_req.variable; - } - } - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34)) - cfg80211_new_sta(pNetDev, mac_addr, sinfo, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE: 2.6.34 */ - os_free_mem(sinfo); -} - -VOID CFG80211OS_DelSta(IN PNET_DEV pNetDev, IN const PUCHAR mac_addr) -{ -#if (KERNEL_VERSION(3, 0, 0) <= LINUX_VERSION_CODE) - return cfg80211_del_sta(pNetDev, mac_addr, GFP_ATOMIC); -#endif /* LINUX_VERSION_CODE: 3.0.0 */ -} - -VOID CFG80211OS_MICFailReport(PNET_DEV pNetDev, const PUCHAR src_addr, - BOOLEAN unicast, INT key_id, const PUCHAR tsc) -{ - cfg80211_michael_mic_failure(pNetDev, src_addr, - (unicast ? NL80211_KEYTYPE_PAIRWISE : - NL80211_KEYTYPE_GROUP), - key_id, tsc, GFP_ATOMIC); -} - -VOID CFG80211OS_Roamed(PNET_DEV pNetDev, IN UCHAR *pBSSID, IN UCHAR *pReqIe, - IN UINT32 ReqIeLen, IN UCHAR *pRspIe, IN UINT32 RspIeLen) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - struct cfg80211_roam_info roam_info = { - .channel = NULL, - .bssid = pBSSID, - .req_ie = pReqIe, - .req_ie_len = ReqIeLen, - .resp_ie = pRspIe, - .resp_ie_len = RspIeLen, - }; -#endif - cfg80211_roamed(pNetDev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - &roam_info, GFP_KERNEL -#else -#if (KERNEL_VERSION(2, 6, 39) < LINUX_VERSION_CODE) - NULL, -#endif /* LINUX_VERSION_CODE: 2.6.39 */ - pBSSID, pReqIe, ReqIeLen, pRspIe, RspIeLen, GFP_KERNEL -#endif - ); -} - -VOID CFG80211OS_EnableChanFlagsByBand(IN struct ieee80211_channel *pChannels, - IN UINT32 n_channels, - IN UINT32 freq_start_mhz, - IN UINT32 freq_end_mhz, IN UINT32 flags) -{ - INT32 idx = 0; - - if (!pChannels) - return; - - for (idx = 0; idx < n_channels; idx++) { - if ((pChannels[idx].center_freq >= (UINT16)freq_start_mhz) && - (pChannels[idx].center_freq <= (UINT16)freq_end_mhz)) { - /* If this is not disabled channel, we clear the flag of IEEE80211_CHAN_DISABLED */ - pChannels[idx].flags &= ~IEEE80211_CHAN_DISABLED; - } - } -} - -VOID CFG80211OS_ForceUpdateChanFlagsByBand( - IN struct ieee80211_supported_band *pBand, - IN struct ieee80211_channel *pChannelUpdate) -{ - struct ieee80211_channel *pChannels; - INT32 idx = 0; - - if (!pBand || !pChannelUpdate) - return; - - pChannels = pBand->channels; - - for (idx = 0; idx < pBand->n_channels; idx++) - pChannels[idx].flags = pChannelUpdate[idx].flags; -} - -INT32 CFG80211OS_UpdateRegRuleByRegionIdx(IN VOID *pCB, IN VOID *pChDesc2G, - IN VOID *pChDesc5G) -{ - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB; - struct wiphy *pWiphy = NULL; - UINT32 freq_start_mhz = 0, freq_end_mhz = 0; -#ifdef EXT_BUILD_CHANNEL_LIST - PCH_DESP pChDesc = NULL; -#else - PCH_DESC pChDesc = NULL; -#endif - INT32 n_channels = 0; - INT32 ii = 0; - struct ieee80211_supported_band *pSband; - if (!pCB || (!pChDesc2G && !pChDesc5G)) - return -EINVAL; - pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - if (!pWiphy) - CFG80211DBG(DBG_LVL_ERROR, - ("80211> %s: invalid pWiphy!!\n", __FUNCTION__)); - /* 2GHz rules */ -#ifdef EXT_BUILD_CHANNEL_LIST - pChDesc = (PCH_DESP)pChDesc2G; -#else - pChDesc = (PCH_DESC)pChDesc2G; -#endif - n_channels = - pCfg80211_CB->Cfg80211_bands[IEEE80211_BAND_2GHZ].n_channels; - if (pChDesc && n_channels > 0) { - struct ieee80211_channel pTmpCh[n_channels]; - memset(pTmpCh, 0, sizeof(pTmpCh)); - /* init all channels to be disabled */ - for (ii = 0; ii < n_channels; ii++) { - pTmpCh[ii].flags |= IEEE80211_CHAN_DISABLED; - pTmpCh[ii].center_freq = - pCfg80211_CB - ->Cfg80211_bands[IEEE80211_BAND_2GHZ] - .channels[ii] - .center_freq; - } - while (pChDesc && pChDesc->FirstChannel) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) - freq_start_mhz = ieee80211_channel_to_frequency( - pChDesc->FirstChannel, IEEE80211_BAND_2GHZ); - freq_end_mhz = ieee80211_channel_to_frequency( - pChDesc->FirstChannel + (pChDesc->NumOfCh - 1), - IEEE80211_BAND_2GHZ); -#else - freq_start_mhz = ieee80211_channel_to_frequency( - pChDesc->FirstChannel); - freq_end_mhz = ieee80211_channel_to_frequency( - pChDesc->FirstChannel + (pChDesc->NumOfCh - 1)); -#endif /* LINUX_VERSION_CODE */ -#ifdef EXT_BUILD_CHANNEL_LIST - CFG80211OS_EnableChanFlagsByBand(pTmpCh, n_channels, - freq_start_mhz, - freq_end_mhz, 0); -#else - CFG80211OS_EnableChanFlagsByBand( - pTmpCh, n_channels, freq_start_mhz, - freq_end_mhz, (UINT32)pChDesc->ChannelProp); -#endif - - pChDesc++; - } - pSband = pWiphy->bands[IEEE80211_BAND_2GHZ]; - CFG80211OS_ForceUpdateChanFlagsByBand(pSband, pTmpCh); - } - /* 5GHz rules */ -#ifdef EXT_BUILD_CHANNEL_LIST - pChDesc = (PCH_DESP)pChDesc5G; -#else - pChDesc = (PCH_DESC)pChDesc5G; -#endif - n_channels = - pCfg80211_CB->Cfg80211_bands[IEEE80211_BAND_5GHZ].n_channels; - if (pChDesc && n_channels > 0) { - struct ieee80211_channel pTmpCh2[n_channels]; - memset(pTmpCh2, 0, sizeof(pTmpCh2)); - /* init all channels to be disabled */ - for (ii = 0; ii < n_channels; ii++) { - pTmpCh2[ii].flags |= IEEE80211_CHAN_DISABLED; - pTmpCh2[ii].center_freq = - pCfg80211_CB - ->Cfg80211_bands[IEEE80211_BAND_5GHZ] - .channels[ii] - .center_freq; - } - while (pChDesc && pChDesc->FirstChannel) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) - freq_start_mhz = ieee80211_channel_to_frequency( - pChDesc->FirstChannel, IEEE80211_BAND_5GHZ); - freq_end_mhz = ieee80211_channel_to_frequency( - pChDesc->FirstChannel + - ((pChDesc->NumOfCh - 1) * 4), - IEEE80211_BAND_5GHZ); -#else - freq_start_mhz = ieee80211_channel_to_frequency( - pChDesc->FirstChannel); - freq_end_mhz = ieee80211_channel_to_frequency( - pChDesc->FirstChannel + - ((pChDesc->NumOfCh - 1) * 4)); -#endif -#ifdef EXT_BUILD_CHANNEL_LIST - CFG80211OS_EnableChanFlagsByBand(pTmpCh2, n_channels, - freq_start_mhz, - freq_end_mhz, 0); -#else - CFG80211OS_EnableChanFlagsByBand( - pTmpCh2, n_channels, freq_start_mhz, - freq_end_mhz, (UINT32)pChDesc->ChannelProp); -#endif - - pChDesc++; - } - pSband = pWiphy->bands[IEEE80211_BAND_5GHZ]; - CFG80211OS_ForceUpdateChanFlagsByBand(pSband, pTmpCh2); - } - return 0; -} - -#endif /* RT_CFG80211_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211drv.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211drv.c deleted file mode 100644 index 1c8ce33ad2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/cfg80211/cfg80211drv.c +++ /dev/null @@ -1,1585 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - ***************************************************************************/ - -/**************************************************************************** - * Abstract: - * - * All related CFG80211 function body. - * - * History: - * - ***************************************************************************/ -#define RTMP_MODULE_OS - -#ifdef RT_CFG80211_SUPPORT - -#include "rt_config.h" -#define BSSID_WCID_TO_REMOVE 1 /* Pat:TODO */ - -extern struct notifier_block cfg80211_netdev_notifier; - -extern INT RtmpIoctl_rt_ioctl_siwauth(IN RTMP_ADAPTER *pAd, IN VOID *pData, - IN ULONG Data); - -extern INT RtmpIoctl_rt_ioctl_siwauth(IN RTMP_ADAPTER *pAd, IN VOID *pData, - IN ULONG Data); - -INT CFG80211DRV_IoctlHandle(IN VOID *pAdSrc, IN RTMP_IOCTL_INPUT_STRUCT *wrq, - IN INT cmd, IN USHORT subcmd, IN VOID *pData, - IN ULONG Data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); -#ifdef CONFIG_MULTI_CHANNEL - PAPCLI_STRUCT pApCliEntry = NULL; -#endif /* CONFIG_MULTI_CHANNEL */ - - switch (cmd) { - case CMD_RTPRIV_IOCTL_80211_START: - case CMD_RTPRIV_IOCTL_80211_END: - /* nothing to do */ - break; - - case CMD_RTPRIV_IOCTL_80211_CB_GET: - *(VOID **)pData = (VOID *)(pAd->pCfg80211_CB); - break; - - case CMD_RTPRIV_IOCTL_80211_CB_SET: - pAd->pCfg80211_CB = pData; - break; - - case CMD_RTPRIV_IOCTL_80211_CHAN_SET: - if (CFG80211DRV_OpsSetChannel(pAd, pData) != TRUE) - return NDIS_STATUS_FAILURE; - - break; - - case CMD_RTPRIV_IOCTL_80211_VIF_CHG: - if (CFG80211DRV_OpsChgVirtualInf(pAd, pData) != TRUE) - return NDIS_STATUS_FAILURE; - - break; - - case CMD_RTPRIV_IOCTL_80211_SCAN: - if (CFG80211DRV_OpsScanCheckStatus(pAd, Data) != TRUE) - return NDIS_STATUS_FAILURE; - - break; - - case CMD_RTPRIV_IOCTL_80211_SCAN_STATUS_LOCK_INIT: - CFG80211_ScanStatusLockInit(pAd, Data); - break; - - case CMD_RTPRIV_IOCTL_80211_IBSS_JOIN: - CFG80211DRV_OpsJoinIbss(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_80211_STA_LEAVE: - CFG80211DRV_OpsLeave(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_80211_STA_GET: - if (CFG80211DRV_StaGet(pAd, pData) != TRUE) - return NDIS_STATUS_FAILURE; - - break; -#ifdef CFG_TDLS_SUPPORT - - case CMD_RTPRIV_IOCTL_80211_STA_TDLS_INSERT_PENTRY: - CFG80211DRV_StaTdlsInsertDeletepEntry(pAd, pData, Data); - break; - - case CMD_RTPRIV_IOCTL_80211_STA_TDLS_SET_KEY_COPY_FLAG: - CFG80211DRV_StaTdlsSetKeyCopyFlag(pAd); - break; -#endif /* CFG_TDLS_SUPPORT */ - - case CMD_RTPRIV_IOCTL_80211_STA_KEY_ADD: { -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) - CMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo; - - pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; - - if ( -#ifdef CFG80211_MULTI_STA - RTMP_CFG80211_MULTI_STA_ON(pAd, pKeyInfo->pNetDev) || -#endif /* CFG80211_MULTI_STA */ - (pKeyInfo->pNetDev->ieee80211_ptr->iftype == - RT_CMD_80211_IFTYPE_P2P_CLIENT)) - CFG80211DRV_P2pClientKeyAdd(pAd, pData); - else -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA*/ -#ifdef APCLI_CFG80211_SUPPORT - CFG80211DRV_ApClientKeyAdd(pAd, pData); -#else - CFG80211DRV_StaKeyAdd(pAd, pData); -#endif /* APCLI_CFG80211_SUPPORT */ - } break; - - case CMD_RTPRIV_IOCTL_80211_CONNECT_TO: { -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) - CMD_RTPRIV_IOCTL_80211_CONNECT *pConnInfo; - - pConnInfo = (CMD_RTPRIV_IOCTL_80211_CONNECT *)pData; - - if ( -#ifdef CFG80211_MULTI_STA - (RTMP_CFG80211_MULTI_STA_ON(pAd, pConnInfo->pNetDev)) || -#endif /* CFG80211_MULTI_STA */ - (Data == RT_CMD_80211_IFTYPE_P2P_CLIENT)) - CFG80211DRV_P2pClientConnect(pAd, pData); - else -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ - CFG80211DRV_Connect(pAd, pData); - } break; - - case CMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO: - CFG80211DRV_RegNotify(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_80211_UNREGISTER: - - /* Only main net_dev needs to do CFG80211_UnRegister. */ - if (pAd->net_dev == pData) - CFG80211_UnRegister(pAd, pData); - - break; - - case CMD_RTPRIV_IOCTL_80211_BANDINFO_GET: { - CFG80211_BAND *pBandInfo = (CFG80211_BAND *)pData; - - CFG80211_BANDINFO_FILL(pAd, wdev, pBandInfo); -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) - pBandInfo->RFICType = RFIC_DUAL_BAND; -#endif - } break; - - case CMD_RTPRIV_IOCTL_80211_SURVEY_GET: - CFG80211DRV_SurveyGet(pAd, pData); - break; - -#ifdef APCLI_CFG80211_SUPPORT - case CMD_RTPRIV_IOCTL_APCLI_SITE_SURVEY: - CFG80211DRV_ApcliSiteSurvey(pAd, pData); - break; -#endif /* APCLI_CFG80211_SUPPORT */ - case CMD_RTPRIV_IOCTL_80211_EXTRA_IES_SET: - CFG80211DRV_OpsScanExtraIesSet(pAd); - break; - - /* CFG_TODO */ - case CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_REG: - CFG80211DRV_OpsMgmtFrameProbeRegister(pAd, pData, Data); - break; - - /* CFG_TODO */ - case CMD_RTPRIV_IOCTL_80211_ACTION_FRAME_REG: - CFG80211DRV_OpsMgmtFrameActionRegister(pAd, pData, Data); - break; - - case CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK: - CFG80211_SwitchTxChannel(pAd, Data); - break; - - case CMD_RTPRIV_IOCTL_80211_CHANNEL_RESTORE: - break; - - case CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_SEND: - CFG80211_SendMgmtFrame(pAd, pData, Data); - break; - - case CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET: - return CFG80211DRV_OpsScanSetSpecifyChannel(pAd, pData, Data); -#ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT - - case CMD_RTPRIV_IOCTL_MCC_DHCP_PROTECT_STATUS: - pApCliEntry = &pAd->ApCfg.ApCliTab[0]; - *(UCHAR *)pData = pApCliEntry->Valid; - break; - - case CMD_RTPRIV_IOCTL_80211_SET_NOA: - CFG80211DRV_Set_NOA(pAd, Data); - break; -#endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ -#ifdef CONFIG_AP_SUPPORT - - case CMD_RTPRIV_IOCTL_80211_BEACON_SET: - CFG80211DRV_OpsBeaconSet(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_80211_BEACON_ADD: - CFG80211DRV_OpsBeaconAdd(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_80211_BEACON_DEL: { - INT i, apidx = Data; - - for (i = 0; i < WLAN_MAX_NUM_OF_TIM; i++) - pAd->ApCfg.MBSSID[apidx].wdev.bcn_buf.TimBitmaps[i] = 0; - if (pAd->cfg80211_ctrl.beacon_tail_buf != NULL) { - os_free_mem(pAd->cfg80211_ctrl.beacon_tail_buf); - pAd->cfg80211_ctrl.beacon_tail_buf = NULL; - } - pAd->cfg80211_ctrl.beacon_tail_len = 0; - } break; - - case CMD_RTPRIV_IOCTL_80211_AP_KEY_ADD: - CFG80211DRV_ApKeyAdd(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_80211_RTS_THRESHOLD_ADD: - CFG80211DRV_RtsThresholdAdd(pAd, wdev, Data); - break; - - case CMD_RTPRIV_IOCTL_80211_FRAG_THRESHOLD_ADD: - CFG80211DRV_FragThresholdAdd(pAd, wdev, Data); - break; - - case CMD_RTPRIV_IOCTL_80211_AP_KEY_DEL: - CFG80211DRV_ApKeyDel(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_80211_AP_KEY_DEFAULT_SET: - CFG80211_setApDefaultKey(pAd, pData, Data); - break; - -#ifdef DOT11W_PMF_SUPPORT - case CMD_RTPRIV_IOCTL_80211_AP_KEY_DEFAULT_MGMT_SET: - CFG80211_setApDefaultMgmtKey(pAd, pData, Data); - break; -#endif /*DOT11W_PMF_SUPPORT*/ - - case CMD_RTPRIV_IOCTL_80211_PORT_SECURED: - CFG80211_StaPortSecured(pAd, pData, Data); - break; - - case CMD_RTPRIV_IOCTL_80211_AP_STA_DEL: - CFG80211_ApStaDel(pAd, pData, Data); - break; -#endif /* CONFIG_AP_SUPPORT */ - - case CMD_RTPRIV_IOCTL_80211_CHANGE_BSS_PARM: - CFG80211DRV_OpsChangeBssParm(pAd, pData); - break; - - case CMD_RTPRIV_IOCTL_80211_AP_PROBE_RSP_EXTRA_IE: - break; - - case CMD_RTPRIV_IOCTL_80211_BITRATE_SET: - break; - - case CMD_RTPRIV_IOCTL_80211_RESET: - CFG80211_reSetToDefault(pAd); - break; - - case CMD_RTPRIV_IOCTL_80211_NETDEV_EVENT: { - /* - * CFG_TODO: For Scan_req per netdevice - * PNET_DEV pNetDev = (PNET_DEV) pData; - * struct wireless_dev *pWdev = pAd->pCfg80211_CB->pCfg80211_Wdev; - * if (RTMPEqualMemory(pNetDev->dev_addr, pNewNetDev->dev_addr, MAC_ADDR_LEN)) - */ - if (pAd->cfg80211_ctrl.FlgCfg80211Scanning == TRUE) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("CFG_SCAN: close the scan cmd in device close phase\n")); - CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); - pAd->cfg80211_ctrl.FlgCfg80211Scanning = FALSE; - } - } break; -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - - case CMD_RTPRIV_IOCTL_80211_P2PCLI_ASSSOC_IE_SET: { - CMD_RTPRIV_IOCTL_80211_ASSOC_IE *pAssocIe; - - pAssocIe = (CMD_RTPRIV_IOCTL_80211_ASSOC_IE *)pData; -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) - - if ( -#ifdef CFG80211_MULTI_STA - RTMP_CFG80211_MULTI_STA_ON(pAd, pAssocIe->pNetDev) || -#endif /* CFG80211_MULTI_STA */ - (Data == RT_CMD_80211_IFTYPE_P2P_CLIENT)) - CFG80211DRV_SetP2pCliAssocIe(pAd, pAssocIe->ie, - pAssocIe->ie_len); - else -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ -#ifdef APCLI_CFG80211_SUPPORT - CFG80211DRV_SetApCliAssocIe(pAd, pAssocIe->ie, - pAssocIe->ie_len); -#endif - } break; -#endif /*CONFIG_STA_SUPPORT*/ -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) - - case CMD_RTPRIV_IOCTL_80211_VIF_ADD: - if (CFG80211DRV_OpsVifAdd(pAd, pData) != TRUE) - return NDIS_STATUS_FAILURE; - - break; - - case CMD_RTPRIV_IOCTL_80211_VIF_DEL: - RTMP_CFG80211_VirtualIF_Remove(pAd, pData, Data); - break; -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ -#ifdef RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT - - case CMD_RTPRIV_IOCTL_80211_ANDROID_PRIV_CMD: - /* rt_android_private_command_entry(pAd, ); */ - break; -#endif /* RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT */ -#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT - - case CMD_RTPRIV_IOCTL_80211_SEND_WIRELESS_EVENT: - CFG80211_SendWirelessEvent(pAd, pData); - break; -#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */ -#ifdef RFKILL_HW_SUPPORT - - case CMD_RTPRIV_IOCTL_80211_RFKILL: { - UINT32 data = 0; - BOOLEAN active; - /* Read GPIO pin2 as Hardware controlled radio state */ - RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data); - active = !!(data & 0x04); - - if (!active) { - RTMPSetLED(pAd, LED_RADIO_OFF); - *(UINT8 *)pData = 0; - } else - *(UINT8 *)pData = 1; - } break; -#endif /* RFKILL_HW_SUPPORT */ - - case CMD_RTPRIV_IOCTL_80211_REGISTER: - - /* Only main net_dev needs to do CFG80211_Register. */ - if (pAd->net_dev == pData) - CFG80211_Register(pAd, pObj->pDev, pAd->net_dev); - - break; - - default: - return NDIS_STATUS_FAILURE; - } - - return NDIS_STATUS_SUCCESS; -} - -VOID CFG80211DRV_OpsMgmtFrameProbeRegister(VOID *pAdOrg, VOID *pData, - BOOLEAN isReg) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; - - /* IF Not Exist on VIF List, the device must be MAIN_DEV */ - if (isReg) { - if (pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount < 255) - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount++; - } else { - if (pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount > 0) - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount--; - } - - if (pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount > 0) - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterProbeReqFrame = - TRUE; - else { - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterProbeReqFrame = - FALSE; - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount = 0; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d] pAd->Cfg80211RegisterProbeReqFrame=%d[%d]\n", isReg, - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterProbeReqFrame, - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount)); -} - -VOID CFG80211DRV_OpsMgmtFrameActionRegister(VOID *pAdOrg, VOID *pData, - BOOLEAN isReg) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; - - /* IF Not Exist on VIF List, the device must be MAIN_DEV */ - if (isReg) { - if (pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount < 255) - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount++; - } else { - if (pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount > 0) - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount--; - } - - if (pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount > 0) - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterActionFrame = - TRUE; - else { - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterActionFrame = - FALSE; - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount = 0; - } - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("[%d] TYPE pAd->Cfg80211RegisterActionFrame=%d[%d]\n", isReg, - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterActionFrame, - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount)); -} - -VOID CFG80211DRV_OpsChangeBssParm(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_BSS_PARM *pBssInfo; - BOOLEAN TxPreamble; - - CFG80211DBG(DBG_LVL_TRACE, ("%s\n", __func__)); - pBssInfo = (CMD_RTPRIV_IOCTL_80211_BSS_PARM *)pData; - - /* Short Preamble */ - if (pBssInfo->use_short_preamble != -1) { - CFG80211DBG(DBG_LVL_TRACE, ("%s: ShortPreamble %d\n", __func__, - pBssInfo->use_short_preamble)); - pAd->CommonCfg.TxPreamble = (pBssInfo->use_short_preamble == 0 ? - Rt802_11PreambleLong : - Rt802_11PreambleShort); - TxPreamble = - (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : - 1); - MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble); - } - - /* CTS Protection */ - if (pBssInfo->use_cts_prot != -1) - CFG80211DBG(DBG_LVL_TRACE, ("%s: CTS Protection %d\n", __func__, - pBssInfo->use_cts_prot)); - - /* Short Slot */ - if (pBssInfo->use_short_slot_time != -1) - CFG80211DBG(DBG_LVL_TRACE, ("%s: Short Slot %d\n", __func__, - pBssInfo->use_short_slot_time)); -} - -BOOLEAN CFG80211DRV_OpsSetChannel(RTMP_ADAPTER *pAd, VOID *pData) -{ - CMD_RTPRIV_IOCTL_80211_CHAN *pChan; - UINT8 ChanId, IfType, ChannelType; -#ifdef DOT11_N_SUPPORT - BOOLEAN FlgIsChanged; -#endif /* DOT11_N_SUPPORT */ - BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; - struct wifi_dev *wdev = &pMbss->wdev; - UCHAR RfIC = 0; - UCHAR newBW = BW_20; - UCHAR ext_cha; - CHANNEL_CTRL *pChCtrl; - UCHAR BandIdx; - /* - * enum nl80211_channel_type { - * NL80211_CHAN_NO_HT, - * NL80211_CHAN_HT20, - * NL80211_CHAN_HT40MINUS, - * NL80211_CHAN_HT40PLUS - * }; - */ - /* init */ - pChan = (CMD_RTPRIV_IOCTL_80211_CHAN *)pData; - ChanId = pChan->ChanId; - IfType = pChan->IfType; - ChannelType = pChan->ChanType; - -#ifdef HOSTAPD_AUTO_CH_SUPPORT - printk("HOSTAPD AUTO_CH_SUPPORT Ignore Channel %d from HostAPD \n", - pChan->ChanId); - return TRUE; -#endif - - /* set phymode by channel number */ - if (ChanId > 14) { - wdev->PhyMode = (WMODE_A | WMODE_AN | WMODE_AC); /*5G phymode*/ - /* Change channel state to NONE */ - BandIdx = HcGetBandByWdev(wdev); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - hc_set_ChCtrlChListStat(pChCtrl, CH_LIST_STATE_NONE); -#ifdef EXT_BUILD_CHANNEL_LIST - BuildChannelListEx(pAd, wdev); -#else - BuildChannelList(pAd, wdev); -#endif - RTMPSetPhyMode(pAd, wdev, wdev->PhyMode); - RfIC = RFIC_5GHZ; - } else { - wdev->PhyMode = (WMODE_B | WMODE_G | WMODE_GN); /*2G phymode*/ - /* Change channel state to NONE */ - BandIdx = HcGetBandByWdev(wdev); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - hc_set_ChCtrlChListStat(pChCtrl, CH_LIST_STATE_NONE); -#ifdef EXT_BUILD_CHANNEL_LIST - BuildChannelListEx(pAd, wdev); -#else - BuildChannelList(pAd, wdev); -#endif - RTMPSetPhyMode(pAd, wdev, wdev->PhyMode); - RfIC = RFIC_24GHZ; - } - - if (IfType != RT_CMD_80211_IFTYPE_MONITOR) { - /* get channel BW */ - FlgIsChanged = TRUE; - - /* set to new channel BW */ - if (ChannelType == RT_CMD_80211_CHANTYPE_HT20) { - newBW = BW_20; - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - pAd->CommonCfg.HT_Disable = 0; - - if (IfType == RT_CMD_80211_IFTYPE_AP || - IfType == RT_CMD_80211_IFTYPE_P2P_GO) - wdev->channel = ChanId; - wlan_operate_set_prim_ch(wdev, wdev->channel); - } else if (ChannelType == RT_CMD_80211_CHANTYPE_HT40MINUS) { - newBW = BW_40; - wlan_operate_set_ht_bw(wdev, HT_BW_40, EXTCHA_BELOW); - ext_cha = wlan_operate_get_ext_cha(wdev); - pAd->CommonCfg.HT_Disable = 0; - - if (IfType == RT_CMD_80211_IFTYPE_AP || - IfType == RT_CMD_80211_IFTYPE_P2P_GO) - wdev->channel = ChanId; - - wlan_operate_set_prim_ch(wdev, wdev->channel); - } else if (ChannelType == RT_CMD_80211_CHANTYPE_HT40PLUS) { - /* not support NL80211_CHAN_HT40MINUS or NL80211_CHAN_HT40PLUS */ - /* i.e. primary channel = 36, secondary channel must be 40 */ - newBW = BW_40; - wlan_operate_set_ht_bw(wdev, HT_BW_40, EXTCHA_ABOVE); - pAd->CommonCfg.HT_Disable = 0; - - if (IfType == RT_CMD_80211_IFTYPE_AP || - IfType == RT_CMD_80211_IFTYPE_P2P_GO) - wdev->channel = ChanId; - - wlan_operate_set_prim_ch(wdev, wdev->channel); - } else if (ChannelType == RT_CMD_80211_CHANTYPE_NOHT) { - newBW = BW_20; - wlan_operate_set_ht_bw(wdev, HT_BW_20, EXTCHA_NONE); - ext_cha = wlan_operate_get_ext_cha(wdev); - pAd->CommonCfg.HT_Disable = 1; - - if (IfType == RT_CMD_80211_IFTYPE_AP || - IfType == RT_CMD_80211_IFTYPE_P2P_GO) - wdev->channel = ChanId; - - wlan_operate_set_prim_ch(wdev, wdev->channel); - } else if (ChannelType == RT_CMD_80211_CHANTYPE_VHT80) { - newBW = BW_80; - - if (pChan->CenterChanId > pChan->ChanId) - ext_cha = EXTCHA_ABOVE; - else - ext_cha = EXTCHA_BELOW; - - if (IfType == RT_CMD_80211_IFTYPE_AP || - IfType == RT_CMD_80211_IFTYPE_P2P_GO) - wdev->channel = ChanId; - - wlan_operate_set_ht_bw(wdev, HT_BW_40, ext_cha); - wlan_operate_set_vht_bw(wdev, VHT_BW_80); - wlan_operate_set_prim_ch(wdev, wdev->channel); - } - - CFG80211DBG(DBG_LVL_TRACE, ("80211> HT Disable = %d\n", - pAd->CommonCfg.HT_Disable)); - } else { - /* for monitor mode */ - FlgIsChanged = TRUE; - pAd->CommonCfg.HT_Disable = 0; - wlan_operate_set_ht_bw(wdev, HT_BW_40, - wlan_operate_get_ext_cha(wdev)); - } - - ext_cha = wlan_operate_get_ext_cha(wdev); - /* switch to the channel with Common Channel */ - wdev->channel = ChanId; - CFG80211DBG(DBG_LVL_ERROR, - ("80211> CentralChannel = %d, New BW = %d with Ext[%d]\n", - wlan_operate_get_cen_ch_1(wdev), newBW, ext_cha)); -#ifdef CONFIG_AP_SUPPORT - os_msec_delay(1000); -#ifndef RT_CFG80211_SUPPORT - APStopByRf(pAd, RfIC); -#else - APStop(pAd, pMbss, AP_BSS_OPER_BY_RF); -#endif - os_msec_delay(1000); -#ifndef RT_CFG80211_SUPPORT - APStartUpByRf(pAd, RfIC); -#else - APStartUp(pAd, pMbss, AP_BSS_OPER_BY_RF); -#endif -#endif /* CONFIG_AP_SUPPORT */ - - if (IfType == RT_CMD_80211_IFTYPE_AP || - IfType == RT_CMD_80211_IFTYPE_P2P_GO) { - CFG80211DBG(DBG_LVL_ERROR, - ("80211> Set the channel in AP Mode\n")); - return TRUE; - } - - return TRUE; -} - -BOOLEAN CFG80211DRV_OpsJoinIbss(VOID *pAdOrg, VOID *pData) -{ - return TRUE; -} - -BOOLEAN CFG80211DRV_OpsLeave(VOID *pAdOrg, PNET_DEV pNetDev) -{ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - MLME_DEAUTH_REQ_STRUCT DeAuthReq; - MLME_QUEUE_ELEM *pMsgElem = NULL; -#ifdef APCLI_CFG80211_SUPPORT - /*check if net dev corresponding to Apcli entry */ - if (pAd->ApCfg.ApCliTab[0].wdev.if_dev == pNetDev) { - pAd->cfg80211_ctrl.FlgCfg80211Connecting = FALSE; - os_alloc_mem(pAd, (UCHAR **)&pMsgElem, sizeof(MLME_QUEUE_ELEM)); - COPY_MAC_ADDR(DeAuthReq.Addr, - pAd->ApCfg.ApCliTab[MAIN_MBSSID].MlmeAux.Bssid); - DeAuthReq.Reason = REASON_DEAUTH_STA_LEAVING; - pMsgElem->MsgLen = sizeof(MLME_DEAUTH_REQ_STRUCT); - pMsgElem->Priv = 0; - os_move_mem(pMsgElem->Msg, &DeAuthReq, - sizeof(MLME_DEAUTH_REQ_STRUCT)); - ApCliMlmeDeauthReqAction(pAd, pMsgElem); - os_free_mem(pMsgElem); - pMsgElem = NULL; - ApCliLinkDown(pAd, 0); - } -#endif /* APCLI_CFG80211_SUPPORT */ -#endif /* defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) */ - return TRUE; -} - -BOOLEAN CFG80211DRV_StaGet(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_STA *pIbssInfo; - - HTTRANSMIT_SETTING *HtPhyMode = NULL; - struct wifi_dev *wdev = NULL; - RSSI_SAMPLE *RssiSample = NULL; - RADIUS_ACCOUNT_ENTRY *pFoundEntry = NULL; - - pIbssInfo = (CMD_RTPRIV_IOCTL_80211_STA *)pData; -#ifdef CONFIG_AP_SUPPORT - { - MAC_TABLE_ENTRY *pEntry; - ULONG DataRate = 0; - UINT32 RSSI; - - pEntry = MacTableLookup(pAd, pIbssInfo->MAC); - - if (pEntry == NULL) { - UCHAR i; - BOOLEAN found = FALSE; - /*search MAC Address in Radius Table */ - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - RADIUS_ACCOUNT_ENTRY *pRadiusEntry = - &pAd->radius_tbl[i]; - - if (MAC_ADDR_EQUAL(pRadiusEntry->Addr, - pIbssInfo->MAC)) { - /*Found Radius Entry */ - found = TRUE; - pFoundEntry = pRadiusEntry; - HtPhyMode = &pRadiusEntry->HTPhyMode; - wdev = pRadiusEntry->wdev; - RssiSample = &pRadiusEntry->RssiSample; - - getRate(pRadiusEntry->HTPhyMode, - &DataRate); - pIbssInfo->rx_bytes = - pRadiusEntry->RxBytes; - - /* fill tx_bytes count */ - pIbssInfo->tx_bytes = - pRadiusEntry->TxBytes; - - /* fill rx_packets count */ - pIbssInfo->rx_packets = - pRadiusEntry->RxPackets.u - .LowPart; - - /* fill tx_packets count */ - pIbssInfo->tx_packets = - pRadiusEntry->TxPackets.u - .LowPart; - - /* fill inactive time */ - pIbssInfo->InactiveTime = - pRadiusEntry->NoDataIdleCount * - 1000; /* unit: ms */ - break; - } - } - if (!found) - return FALSE; - } else { - HtPhyMode = &pEntry->HTPhyMode; - wdev = pEntry->wdev; - RssiSample = &pEntry->RssiSample; - getRate(pEntry->HTPhyMode, &DataRate); - - pIbssInfo->rx_bytes = pEntry->RxBytes; - - /* fill tx_bytes count */ - pIbssInfo->tx_bytes = pEntry->TxBytes; - - /* fill rx_packets count */ - pIbssInfo->rx_packets = pEntry->RxPackets.u.LowPart; - - /* fill tx_packets count */ - pIbssInfo->tx_packets = pEntry->TxPackets.u.LowPart; - - /* fill inactive time */ - pIbssInfo->InactiveTime = - pEntry->NoDataIdleCount * 1000; /* unit: ms */ - } - - /* fill tx rate */ - if ((HtPhyMode->field.MODE == MODE_HTMIX) || - (HtPhyMode->field.MODE == MODE_HTGREENFIELD)) { - if (HtPhyMode->field.BW) - pIbssInfo->TxRateFlags |= - RT_CMD_80211_TXRATE_BW_40; - - if (HtPhyMode->field.ShortGI) - pIbssInfo->TxRateFlags |= - RT_CMD_80211_TXRATE_SHORT_GI; - - pIbssInfo->TxRateMCS = HtPhyMode->field.MCS; - } else { - pIbssInfo->TxRateFlags = RT_CMD_80211_TXRATE_LEGACY; - pIbssInfo->TxRateMCS = - DataRate * 1000; /* unit: 100kbps */ - } - - /* fill signal */ - RSSI = RTMPAvgRssi(pAd, RssiSample); - pIbssInfo->Signal = RSSI; - - pIbssInfo->InactiveTime *= MLME_TASK_EXEC_MULTIPLE; - pIbssInfo->InactiveTime /= 20; - - if (pFoundEntry) - NdisZeroMemory(pFoundEntry, - sizeof(RADIUS_ACCOUNT_ENTRY)); - } -#endif /* CONFIG_AP_SUPPORT */ - return TRUE; -} - -BOOLEAN CFG80211DRV_StaKeyAdd(VOID *pAdOrg, VOID *pData) -{ - return TRUE; -} - -BOOLEAN CFG80211DRV_Connect(VOID *pAdOrg, VOID *pData) -{ -#if defined(CONFIG_STA_SUPPORT) || defined(APCLI_CFG80211_SUPPORT) - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_CONNECT *pConnInfo; - UCHAR SSID[NDIS_802_11_LENGTH_SSID + 1]; /* Add One for SSID_Len == 32 */ - UINT32 SSIDLen; -#ifdef APCLI_CFG80211_SUPPORT - APCLI_STRUCT *apcli_entry = &pAd->ApCfg.ApCliTab[0]; -#endif /* APCLI_CFG80211_SUPPORT */ - pConnInfo = (CMD_RTPRIV_IOCTL_80211_CONNECT *)pData; - SSIDLen = pConnInfo->SsidLen; - if (SSIDLen > NDIS_802_11_LENGTH_SSID) - SSIDLen = NDIS_802_11_LENGTH_SSID; - memset(&SSID, 0, sizeof(SSID)); - memcpy(SSID, pConnInfo->pSsid, SSIDLen); -#ifdef APCLI_CFG80211_SUPPORT - apcli_entry->wpa_supplicant_info.WpaSupplicantUP = - WPA_SUPPLICANT_ENABLE; -#endif - -#ifdef APCLI_CFG80211_SUPPORT - /* Check the connection is WPS or not */ - if (pConnInfo->bWpsConnection) { - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("AP_CLI WPS Connection onGoing.....\n")); - apcli_entry->wpa_supplicant_info.WpaSupplicantUP |= - WPA_SUPPLICANT_ENABLE_WPS; - } - - /* Set authentication mode */ - if (pConnInfo->WpaVer == 2) { - if (!pConnInfo->FlgIs8021x) { - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("APCLI WPA2PSK\n")); - Set_ApCli_AuthMode_Proc(pAd, "WPA2PSK"); - } - } else if (pConnInfo->WpaVer == 1) { - if (!pConnInfo->FlgIs8021x) { - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("APCLI WPAPSK\n")); - Set_ApCli_AuthMode_Proc(pAd, "WPAPSK"); - } - } else if (pConnInfo->AuthType == Ndis802_11AuthModeShared) - Set_ApCli_AuthMode_Proc(pAd, "SHARED"); - else if (pConnInfo->AuthType == Ndis802_11AuthModeOpen) - Set_ApCli_AuthMode_Proc(pAd, "OPEN"); - else - Set_ApCli_AuthMode_Proc(pAd, "WEPAUTO"); - /* Set PTK Encryption Mode */ - if (pConnInfo->PairwiseEncrypType & RT_CMD_80211_CONN_ENCRYPT_CCMP) { - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("AES\n")); - Set_ApCli_EncrypType_Proc(pAd, "AES"); - } else if (pConnInfo->PairwiseEncrypType & - RT_CMD_80211_CONN_ENCRYPT_TKIP) { - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("TKIP\n")); - Set_ApCli_EncrypType_Proc(pAd, "TKIP"); - } else if (pConnInfo->PairwiseEncrypType & - RT_CMD_80211_CONN_ENCRYPT_WEP) { - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("WEP\n")); - Set_ApCli_EncrypType_Proc(pAd, "WEP"); - } else { - MTWF_LOG(DBG_CAT_P2P, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("NONE\n")); - Set_ApCli_EncrypType_Proc(pAd, "NONE"); - } - /* #endif */ - - if (pConnInfo->pBssid != NULL) { - os_zero_mem(apcli_entry->CfgApCliBssid, MAC_ADDR_LEN); - NdisCopyMemory(apcli_entry->CfgApCliBssid, pConnInfo->pBssid, - MAC_ADDR_LEN); - } - - OPSTATUS_SET_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); - - pAd->cfg80211_ctrl.FlgCfg80211Connecting = TRUE; - Set_ApCli_Ssid_Proc(pAd, (RTMP_STRING *)SSID); - Set_ApCli_Enable_Proc(pAd, "1"); - CFG80211DBG(DBG_LVL_OFF, ("80211> APCLI CONNECTING SSID = %s\n", SSID)); -#endif /* APCLI_CFG80211_SUPPORT */ -#endif /* CONFIG_STA_SUPPORT */ - return TRUE; -} - -VOID CFG80211DRV_RegNotify(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_REG_NOTIFY *pRegInfo; - - pRegInfo = (CMD_RTPRIV_IOCTL_80211_REG_NOTIFY *)pData; - /* keep Alpha2 and we can re-call the function when interface is up */ - pAd->cfg80211_ctrl.Cfg80211_Alpha2[0] = pRegInfo->Alpha2[0]; - pAd->cfg80211_ctrl.Cfg80211_Alpha2[1] = pRegInfo->Alpha2[1]; - - /* apply the new regulatory rule */ - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) { - /* interface is up */ - CFG80211_RegRuleApply(pAd, pRegInfo->pWiphy, - (UCHAR *)pRegInfo->Alpha2); - } else - CFG80211DBG(DBG_LVL_ERROR, ("crda> interface is down!\n")); -} - -VOID CFG80211DRV_SurveyGet(VOID *pAdOrg, VOID *pData) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - CMD_RTPRIV_IOCTL_80211_SURVEY *pSurveyInfo; -#ifdef AP_QLOAD_SUPPORT - QLOAD_CTRL *pQloadCtrl = HcGetQloadCtrl(pAd); -#endif - pSurveyInfo = (CMD_RTPRIV_IOCTL_80211_SURVEY *)pData; - pSurveyInfo->pCfg80211 = pAd->pCfg80211_CB; -#ifdef AP_QLOAD_SUPPORT - pSurveyInfo->ChannelTimeBusy = - pQloadCtrl->QloadLatestChannelBusyTimePri; - pSurveyInfo->ChannelTimeExtBusy = - pQloadCtrl->QloadLatestChannelBusyTimeSec; -#endif /* AP_QLOAD_SUPPORT */ -} - -VOID CFG80211_UnRegister(IN VOID *pAdOrg, IN VOID *pNetDev) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; - PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; - - /* sanity check */ - if (pAd->pCfg80211_CB == NULL) - return; - - CFG80211OS_UnRegister(pAd->pCfg80211_CB, pNetDev); - RTMP_DRIVER_80211_SCAN_STATUS_LOCK_INIT(pAd, FALSE); - unregister_netdevice_notifier(&cfg80211_netdev_notifier); - /* Reset CFG80211 Global Setting Here */ - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==========> TYPE Reset CFG80211 Global Setting Here <==========\n")); - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterActionFrame = FALSE, - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount = 0; - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterProbeReqFrame = FALSE; - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount = 0; - pAd->pCfg80211_CB = NULL; - pAd->CommonCfg.HT_Disable = 0; - - /* It should be free when ScanEnd, */ - /* But Hit close the device in Scanning */ - if (pCfg80211_ctrl->pCfg80211ChanList != NULL) { - os_free_mem(pCfg80211_ctrl->pCfg80211ChanList); - pCfg80211_ctrl->pCfg80211ChanList = NULL; - } - - pCfg80211_ctrl->Cfg80211ChanListLen = 0; - pCfg80211_ctrl->Cfg80211CurChanIndex = 0; - - if (pCfg80211_ctrl->pExtraIe) { - os_free_mem(pCfg80211_ctrl->pExtraIe); - pCfg80211_ctrl->pExtraIe = NULL; - } - - pCfg80211_ctrl->ExtraIeLen = 0; - /* - * CFG_TODO - * if (pAd->pTxStatusBuf != NULL) - * { - * os_free_mem(pAd->pTxStatusBuf); - * pAd->pTxStatusBuf = NULL; - * } - * pAd->TxStatusBufLen = 0; - */ -#ifdef CONFIG_AP_SUPPORT - - if (pAd->cfg80211_ctrl.beacon_tail_buf != NULL) { - os_free_mem(pAd->cfg80211_ctrl.beacon_tail_buf); - pAd->cfg80211_ctrl.beacon_tail_buf = NULL; - } - - pAd->cfg80211_ctrl.beacon_tail_len = 0; -#endif /* CONFIG_AP_SUPPORT */ - - if (pAd->cfg80211_ctrl.BeaconExtraIe != NULL) { - os_free_mem(pAd->cfg80211_ctrl.BeaconExtraIe); - pAd->cfg80211_ctrl.BeaconExtraIe = NULL; - } - - pAd->cfg80211_ctrl.BeaconExtraIeLen = 0; -} - -/* - * ======================================================================== - * Routine Description: - * Parse and handle country region in beacon from associated AP. - * - * Arguments: - * pAdCB - WLAN control block pointer - * pVIE - Beacon elements - * LenVIE - Total length of Beacon elements - * - * Return Value: - * NONE - * ======================================================================== - */ -VOID CFG80211_BeaconCountryRegionParse(IN VOID *pAdCB, - IN NDIS_802_11_VARIABLE_IEs *pVIE, - IN UINT16 LenVIE) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - UCHAR *pElement = (UCHAR *)pVIE; - UINT32 LenEmt; - - while (LenVIE > 0) { - pVIE = (NDIS_802_11_VARIABLE_IEs *)pElement; - - if (pVIE->ElementID == IE_COUNTRY) { - /* send command to do regulation hint only when associated */ - /* RT_CFG80211_CRDA_REG_HINT11D(pAd, pVIE->data, pVIE->Length); */ - RTEnqueueInternalCmd(pAd, CMDTHREAD_REG_HINT_11D, - pVIE->data, pVIE->Length); - break; - } - - LenEmt = pVIE->Length + 2; - - if (LenVIE <= LenEmt) - break; /* length is not enough */ - - pElement += LenEmt; - LenVIE -= LenEmt; - } -} /* End of CFG80211_BeaconCountryRegionParse */ - -/* - * ======================================================================== - * Routine Description: - * Re-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ. - * - * Arguments: - * pAdCB - WLAN control block pointer - * - * Return Value: - * NONE - * - * Note: - * CFG80211_SupBandInit() is called in xx_probe(). - * ======================================================================== - */ - -/* - * ======================================================================== - * Routine Description: - * Hint to the wireless core a regulatory domain from driver. - * - * Arguments: - * pAd - WLAN control block pointer - * pCountryIe - pointer to the country IE - * CountryIeLen - length of the country IE - * - * Return Value: - * NONE - * - * Note: - * Must call the function in kernel thread. - * ======================================================================== - */ -VOID CFG80211_RegHint(IN VOID *pAdCB, IN UCHAR *pCountryIe, - IN ULONG CountryIeLen) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - - CFG80211OS_RegHint(CFG80211CB, pCountryIe, CountryIeLen); -} - -/* - * ======================================================================== - * Routine Description: - * Hint to the wireless core a regulatory domain from country element. - * - * Arguments: - * pAdCB - WLAN control block pointer - * pCountryIe - pointer to the country IE - * CountryIeLen - length of the country IE - * - * Return Value: - * NONE - * - * Note: - * Must call the function in kernel thread. - * ======================================================================== - */ -VOID CFG80211_RegHint11D(IN VOID *pAdCB, IN UCHAR *pCountryIe, - IN ULONG CountryIeLen) -{ - /* no regulatory_hint_11d() in 2.6.32 */ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - - CFG80211OS_RegHint11D(CFG80211CB, pCountryIe, CountryIeLen); -} - -/* - * ======================================================================== - * Routine Description: - * Apply new regulatory rule. - * - * Arguments: - * pAdCB - WLAN control block pointer - * pWiphy - Wireless hardware description - * pAlpha2 - Regulation domain (2B) - * - * Return Value: - * NONE - * - * Note: - * Can only be called when interface is up. - * - * For general mac80211 device, it will be set to new power by Ops->config() - * In rt2x00/, the settings is done in rt2x00lib_config(). - * ======================================================================== - */ -VOID CFG80211_RegRuleApply(IN VOID *pAdCB, IN VOID *pWiphy, IN UCHAR *pAlpha2) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - VOID *pBand24G, *pBand5G; - UINT32 IdBand, IdChan, IdPwr; - UINT32 ChanNum, ChanId, Power, RecId, DfsType; - BOOLEAN FlgIsRadar; - ULONG IrqFlags; - UCHAR BandIdx; - CHANNEL_CTRL *pChCtrl; - CFG80211DBG(DBG_LVL_TRACE, ("crda> CFG80211_RegRuleApply ==>\n")); - /* init */ - pBand24G = NULL; - pBand5G = NULL; - - if (pAd == NULL) - return; - - RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); - /* zero first */ - /* 2.4GHZ & 5GHz */ - RecId = 0; - /* find the DfsType */ - DfsType = CE; - pBand24G = NULL; - pBand5G = NULL; - - if (CFG80211OS_BandInfoGet(CFG80211CB, pWiphy, &pBand24G, &pBand5G) == - FALSE) - return; - -#ifdef AUTO_CH_SELECT_ENHANCE -#ifdef EXT_BUILD_CHANNEL_LIST - - if ((pAlpha2[0] != '0') && (pAlpha2[1] != '0')) { - UINT32 IdReg; - - if (pBand5G != NULL) { - for (IdReg = 0;; IdReg++) { - if (ChRegion[IdReg].CountReg[0] == 0x00) - break; - - if ((pAlpha2[0] == - ChRegion[IdReg].CountReg[0]) && - (pAlpha2[1] == - ChRegion[IdReg].CountReg[1])) { - if (pAd->CommonCfg.DfsType != - MAX_RD_REGION) - DfsType = - pAd->CommonCfg.DfsType; - else - DfsType = - ChRegion[IdReg] - .op_class_region; - - CFG80211DBG( - DBG_LVL_TRACE, - ("crda> find region %c%c, DFS Type %d\n", - pAlpha2[0], pAlpha2[1], - DfsType)); - break; - } - } - } - } - -#endif /* EXT_BUILD_CHANNEL_LIST */ -#endif /* AUTO_CH_SELECT_ENHANCE */ - - for (IdBand = 0; IdBand < IEEE80211_NUM_BANDS; IdBand++) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - if (((IdBand == NL80211_BAND_2GHZ) && (pBand24G == NULL)) || - ((IdBand == NL80211_BAND_5GHZ) && (pBand5G == NULL))) -#else - if (((IdBand == IEEE80211_BAND_2GHZ) && (pBand24G == NULL)) || - ((IdBand == IEEE80211_BAND_5GHZ) && (pBand5G == NULL))) -#endif - continue; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - if (IdBand == NL80211_BAND_2GHZ) -#else - if (IdBand == IEEE80211_BAND_2GHZ) -#endif - CFG80211DBG(DBG_LVL_TRACE, - ("crda> reset chan/power for 2.4GHz\n")); - else - CFG80211DBG(DBG_LVL_TRACE, - ("crda> reset chan/power for 5GHz\n")); - - ChanNum = CFG80211OS_ChanNumGet(CFG80211CB, pWiphy, IdBand); - - for (IdChan = 0; IdChan < ChanNum; IdChan++) { - if (CFG80211OS_ChanInfoGet(CFG80211CB, pWiphy, IdBand, - IdChan, &ChanId, &Power, - &FlgIsRadar) == FALSE) { - /* the channel is not allowed in the regulatory domain */ - /* get next channel information */ - continue; - } - - if (!WMODE_CAP_2G(pAd->CommonCfg.cfg_wmode)) { - /* 5G-only mode */ - if (ChanId <= CFG80211_NUM_OF_CHAN_2GHZ) - continue; - } - - if (!WMODE_CAP_5G(pAd->CommonCfg.cfg_wmode)) { - /* 2.4G-only mode */ - if (ChanId > CFG80211_NUM_OF_CHAN_2GHZ) - continue; - } - BandIdx = HcGetBandByChannel(pAd, ChanId); - pChCtrl = hc_get_channel_ctrl(pAd->hdev_ctrl, BandIdx); - - /* zero first */ - os_zero_mem(pChCtrl->ChList, - MAX_NUM_OF_CHANNELS * - sizeof(CHANNEL_TX_POWER)); - for (IdPwr = 0; IdPwr < MAX_NUM_OF_CHANNELS; IdPwr++) { - /* sachin - TODO */ - /* if (ChanId == pAd->TxPower[IdPwr].Channel) */ - { - /* sachin - TODO */ - /* init the channel info. */ - /* os_move_mem(&pAd->ChannelList[RecId],&pAd->TxPower[IdPwr],sizeof(CHANNEL_TX_POWER)); */ - /* keep channel number */ - pChCtrl->ChList[RecId].Channel = ChanId; - /* keep maximum tranmission power */ - pChCtrl->ChList[RecId].MaxTxPwr = Power; - - /* keep DFS flag */ - if (FlgIsRadar == TRUE) - pChCtrl->ChList[RecId].DfsReq = - TRUE; - else - pChCtrl->ChList[RecId].DfsReq = - FALSE; - - /* keep DFS type */ - pChCtrl->ChList[RecId].RegulatoryDomain = - DfsType; - /* re-set DFS info. */ - pAd->CommonCfg.RDDurRegion = DfsType; - CFG80211DBG( - DBG_LVL_TRACE, - ("Chan %03d:\tpower %d dBm, DFS %d, DFS Type %d\n", - ChanId, Power, - ((FlgIsRadar == TRUE) ? 1 : 0), - DfsType)); - /* change to record next channel info. */ - RecId++; - break; - } - } - } - } - - pChCtrl->ChListNum = RecId; - CFG80211DBG(DBG_LVL_TRACE, - ("[CFG80211_RegRuleApply] - pChCtrl->ChListNum = %d\n", - pChCtrl->ChListNum)); - RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); - CFG80211DBG(DBG_LVL_TRACE, ("crda> Number of channels = %d\n", RecId)); -} /* End of CFG80211_RegRuleApply */ - -/* - * ======================================================================== - * Routine Description: - * Inform CFG80211 about association status. - * - * Arguments: - * pAdCB - WLAN control block pointer - * pBSSID - the BSSID of the AP - * pReqIe - the element list in the association request frame - * ReqIeLen - the request element length - * pRspIe - the element list in the association response frame - * RspIeLen - the response element length - * FlgIsSuccess - 1: success; otherwise: fail - * - * Return Value: - * None - * ======================================================================== - */ -VOID CFG80211_ConnectResultInform(IN VOID *pAdCB, IN UCHAR *pBSSID, - IN UCHAR *pReqIe, IN UINT32 ReqIeLen, - IN UCHAR *pRspIe, IN UINT32 RspIeLen, - IN UCHAR FlgIsSuccess) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - - CFG80211DBG(DBG_LVL_TRACE, - ("80211> CFG80211_ConnectResultInform ==>\n")); - - if (pAd->cfg80211_ctrl.FlgCfg80211Scanning == TRUE || - RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) { - CFG80211DBG(DBG_LVL_ERROR, ("Abort running scan\n")); - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); - pAd->cfg80211_ctrl.FlgCfg80211Scanning = FALSE; - CFG80211OS_ScanEnd(CFG80211CB, TRUE); - } - - CFG80211OS_ConnectResultInform(CFG80211CB, pBSSID, pReqIe, ReqIeLen, - pRspIe, RspIeLen, FlgIsSuccess); - pAd->cfg80211_ctrl.FlgCfg80211Connecting = FALSE; -} /* End of CFG80211_ConnectResultInform */ - -/* - * ======================================================================== - * Routine Description: - * Re-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ. - * - * Arguments: - * pAdCB - WLAN control block pointer - * - * Return Value: - * TRUE - re-init successfully - * FALSE - re-init fail - * - * Note: - * CFG80211_SupBandInit() is called in xx_probe(). - * But we do not have complete chip information in xx_probe() so we - * need to re-init bands in xx_open(). - * ======================================================================== - */ -BOOLEAN CFG80211_SupBandReInit(VOID *pAdCB, VOID *wdev) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - struct wifi_dev *curr_wdev = (struct wifi_dev *)wdev; - CFG80211_BAND BandInfo; - - CFG80211DBG(DBG_LVL_TRACE, ("80211> re-init bands...\n")); - /* re-init bands */ - os_zero_mem(&BandInfo, sizeof(BandInfo)); - CFG80211_BANDINFO_FILL(pAd, curr_wdev, &BandInfo); - - return CFG80211OS_SupBandReInit(CFG80211CB, &BandInfo); -} /* End of CFG80211_SupBandReInit */ - -INT CFG80211_reSetToDefault(IN VOID *pAdCB) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (" %s\n", __func__)); - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterProbeReqFrame = FALSE; - pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterActionFrame = FALSE; - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ProbeReqCount = 0; - pCfg80211_ctrl->cfg80211MainDev.Cfg80211ActionCount = 0; - pCfg80211_ctrl->Cfg80211RocTimerInit = FALSE; - pCfg80211_ctrl->Cfg80211RocTimerRunning = FALSE; - pCfg80211_ctrl->FlgCfg80211Scanning = FALSE; - /* pCfg80211_ctrl->isMccOn = FALSE; */ - return TRUE; -} - -/* initList(&pAd->Cfg80211VifDevSet.vifDevList); */ -/* initList(&pAd->cfg80211_ctrl.cfg80211TxPacketList); */ -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || \ - defined(CFG80211_MULTI_STA) || defined(APCLI_CFG80211_SUPPORT) -BOOLEAN CFG80211_checkScanResInKernelCache(IN VOID *pAdCB, IN UCHAR *pBSSID, - IN UCHAR *pSsid, IN INT ssidLen) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pAd->pCfg80211_CB; - struct wiphy *pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - struct cfg80211_bss *bss; - - bss = cfg80211_get_bss(pWiphy, NULL, pBSSID, pSsid, ssidLen, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - IEEE80211_BSS_TYPE_ESS, IEEE80211_PRIVACY_ANY); -#else - WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); -#endif - - if (bss) { - CFG80211OS_PutBss(pWiphy, bss); - return TRUE; - } - - return FALSE; -} - -BOOLEAN CFG80211_checkScanTable(IN VOID *pAdCB) -{ -#ifndef APCLI_CFG80211_SUPPORT - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; - CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pAd->pCfg80211_CB; - struct wiphy *pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy; - ULONG bss_idx = BSS_NOT_FOUND; - struct cfg80211_bss *bss; - struct ieee80211_channel *chan; - UINT32 CenFreq; - UINT64 timestamp; - struct timeval tv; - UCHAR *ie, ieLen = 0; - BOOLEAN isOk = FALSE; - BSS_ENTRY *pBssEntry; - USHORT ifIndex = 0; - PAPCLI_STRUCT pApCliEntry = NULL; - - pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; - - if (MAC_ADDR_EQUAL(pApCliEntry->MlmeAux.Bssid, ZERO_MAC_ADDR)) { - CFG80211DBG(DBG_LVL_ERROR, - ("pAd->ApCliMlmeAux.Bssid ==> ZERO_MAC_ADDR\n")); - /* ToDo: pAd->ApCfg.ApCliTab[0].CfgApCliBssid */ - return FALSE; - } - - /* Fake TSF */ - do_gettimeofday(&tv); - timestamp = ((UINT64)tv.tv_sec * 1000000) + tv.tv_usec; - bss = cfg80211_get_bss(pWiphy, NULL, pApCliEntry->MlmeAux.Bssid, - pApCliEntry->MlmeAux.Ssid, - pApCliEntry->MlmeAux.SsidLen, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) - IEEE80211_BSS_TYPE_ESS, IEEE80211_PRIVACY_ANY); -#else - WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); -#endif - - if (bss) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Found %s in Kernel_ScanTable with CH[%d]\n", - pApCliEntry->MlmeAux.Ssid, - bss->channel->center_freq)); -#if (KERNEL_VERSION(3, 8, 0) > LINUX_VERSION_CODE) - bss->tsf = timestamp; -#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) */ - CFG80211OS_PutBss(pWiphy, bss); - return TRUE; - } - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Can't Found %s in Kernel_ScanTable & Try Fake it\n", - pApCliEntry->MlmeAux.Ssid)); - - bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, - pApCliEntry->MlmeAux.Ssid, - pApCliEntry->MlmeAux.SsidLen); - - if (bss_idx != BSS_NOT_FOUND) { - /* Since the cfg80211 kernel scanTable not exist this Entry, - * Build an Entry for this connect inform event. - */ - pBssEntry = &pAd->ScanTab.BssEntry[bss_idx]; -#if (KERNEL_VERSION(2, 6, 39) <= LINUX_VERSION_CODE) - - if (pAd->ScanTab.BssEntry[bss_idx].Channel > 14) - CenFreq = ieee80211_channel_to_frequency( - pBssEntry->Channel, IEEE80211_BAND_5GHZ); - else - CenFreq = ieee80211_channel_to_frequency( - pBssEntry->Channel, IEEE80211_BAND_2GHZ); - -#else - CenFreq = ieee80211_channel_to_frequency(pBssEntry->Channel); -#endif - chan = ieee80211_get_channel(pWiphy, CenFreq); - ieLen = 2 + pApCliEntry->MlmeAux.SsidLen + - pBssEntry->VarIeFromProbeRspLen; - os_alloc_mem(NULL, (UCHAR **)&ie, ieLen); - - if (!ie) { - CFG80211DBG( - DBG_LVL_ERROR, - ("Memory Allocate Fail in CFG80211_checkScanTable\n")); - return FALSE; - } - - ie[0] = WLAN_EID_SSID; - ie[1] = pApCliEntry->MlmeAux.SsidLen; - NdisCopyMemory(ie + 2, pApCliEntry->MlmeAux.Ssid, - pApCliEntry->MlmeAux.SsidLen); - NdisCopyMemory(ie + 2 + pApCliEntry->MlmeAux.SsidLen, - pBssEntry->pVarIeFromProbRsp, - pBssEntry->VarIeFromProbeRspLen); - bss = cfg80211_inform_bss(pWiphy, chan, - pApCliEntry->MlmeAux.Bssid, timestamp, - WLAN_CAPABILITY_ESS, - pApCliEntry->MlmeAux.BeaconPeriod, ie, - ieLen, -#ifdef CFG80211_SCAN_SIGNAL_AVG - (pBssEntry->AvgRssi * 100), -#else - (pBssEntry->Rssi * 100), -#endif - GFP_KERNEL); - - if (bss) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Fake New %s(%02x:%02x:%02x:%02x:%02x:%02x) in Kernel_ScanTable with CH[%d][%d] BI:%d len:%d\n", - pApCliEntry->MlmeAux.Ssid, - PRINT_MAC(pApCliEntry->MlmeAux.Bssid), - bss->channel->center_freq, pBssEntry->Channel, - pApCliEntry->MlmeAux.BeaconPeriod, - pBssEntry->VarIeFromProbeRspLen)); - CFG80211OS_PutBss(pWiphy, bss); - isOk = TRUE; - } - - if (ie != NULL) - os_free_mem(ie); - - if (isOk) - return TRUE; - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s Not In Driver Scan Table\n", - pApCliEntry->MlmeAux.Ssid)); - - return FALSE; -#else - return TRUE; -#endif /* APCLI_CFG80211_SUPPORT */ -} -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ - -/* CFG_TODO */ -UCHAR CFG80211_getCenCh(RTMP_ADAPTER *pAd, UCHAR prim_ch) -{ - UCHAR ret_channel; - struct wifi_dev *wdev = get_default_wdev(pAd); - UCHAR ht_bw = wlan_operate_get_ht_bw(wdev); - UCHAR ext_cha = wlan_operate_get_ext_cha(wdev); - - if (ht_bw == BW_40) { - if (ext_cha == EXTCHA_ABOVE) - ret_channel = prim_ch + 2; - else { - if (prim_ch == 14) - ret_channel = prim_ch - 1; - else - ret_channel = prim_ch - 2; - } - } else - ret_channel = prim_ch; - - return ret_channel; -} - -VOID CFG80211_JoinIBSS(IN VOID *pAdCB, IN UCHAR *pBSSID) -{ -} - -#ifdef MT_MAC -VOID CFG80211_InitTxSCallBack(RTMP_ADAPTER *pAd) -{ - if (!IS_HIF_TYPE(pAd, HIF_MT)) { - CFG80211DBG(DBG_LVL_ERROR, - ("80211> %s:: Only MT_MAC support this feature.\n", - __func__)); - return; - } - -#ifdef CFG_TDLS_SUPPORT - AddTxSTypePerPkt(pAd, PID_TDLS, TXS_FORMAT0, TdlsTxSHandler); - TxSTypeCtlPerPkt(pAd, PID_TDLS, TXS_FORMAT0, TRUE, TRUE, FALSE, 0); -#endif /* CFG_TDLS_SUPPORT */ - MTWF_LOG(DBG_CAT_TX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s()\n", __func__)); -} -#endif /* MT_MAC */ - -#endif /* RT_CFG80211_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/config.mk b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/config.mk deleted file mode 100644 index 8fcfede45b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/config.mk +++ /dev/null @@ -1,1520 +0,0 @@ -# Support Multiple Interface within single driver -HAS_MULTI_INF=y - -# Support ATE function -HAS_ATE=y - -# Support WPA3 -HAS_WPA3_SUPPORT=y - -# Support OWE -HAS_OWE_SUPPORT=y - -# Support QA ATE function -HAS_QA_SUPPORT=y - -#Support Internal-Capture function -HAS_ICAP_SUPPORT=y - -#Support Wifi-Spectrum function -HAS_WIFI_SPECTRUM_SUPPORT=y - -# Support MTK 2.4G 256QAM -HAS_G_BAND_256QAM=y - - - -HAS_RSSI_FEEDBACK=n - -# Support XLINK mode -HAS_XLINK=n - -# Support WSC function -HAS_WSC=y -HAS_WSC_V2=y -HAS_WSC_LED=n -HAS_WSC_NFC=n - - -HAS_MEM_ALLOC_INFO_SUPPORT=n - -# Support LLTD function -HAS_LLTD=y - -# Support WDS function -HAS_WDS=y - - -# Support AP-Client function -HAS_BEACON_MISS_ON_PRIMARY_CHANNEL=n - -# Support AP-Client function -HAS_APCLI=y - -# Roaming Enhance Support -HAS_ROAMING_ENHANCE_SUPPORT=n - - - -# Support Air Monitor -HAS_AIR_MONITOR=n - - - - -#Support Net interface block while Tx-Sw queue full -HAS_BLOCK_NET_IF=y - -#Support IGMP-Snooping function. -HAS_IGMP_SNOOP_SUPPORT=y - -#Support DFS function -HAS_MT_DFS_SUPPORT=y - -#Support Background Scan function -HAS_BGND_SCAN_SUPPORT=y - -#Support Smart Carrier Sense function -HAS_SMART_CARRIER_SENSE_SUPPORT=y - -#Support Carrier-Sense function -HAS_CS_SUPPORT=n - -#Support TCP_RACK function -HAS_TCP_RACK_SUPPORT=n - -#ifeq ($(PLATFORM),MT85XX) -#Support HE_SUPPORT -HAS_HE_SUPPORT=n -HAS_HE_BD_SUPPORT=n - -ifeq ($(PLATFORM),INTELP6) -HAS_INTEL_UDMA_SUPPORT=y -endif - -#Support WEPAUTO mode try Open first then shared -HAS_WEPAUTO_OPEN_FIRST_SUPPORT=y - - -# Support user specific transmit rate of Multicast packet. -HAS_MCAST_RATE_SPECIFIC_SUPPORT=y - -# Support for Multiple Cards -HAS_MC_SUPPORT=n - -#Support for PCI-MSI -HAS_MSI_SUPPORT=n - - -#Support for EXT_CHANNEL -HAS_EXT_BUILD_CHANNEL_LIST=n - -#Support for IDS -HAS_IDS_SUPPORT=y - - -#Support for Net-SNMP -HAS_SNMP_SUPPORT=n - -#Support features of Single SKU. -HAS_SINGLE_SKU_V2_SUPPORT=n - - - -#Support features of 802.11n -HAS_DOT11_N_SUPPORT=y -HAS_DOT11N_DRAFT3_SUPPORT=y - -#Support for 802.11ac VHT -HAS_DOT11_VHT_SUPPORT=y - - -#Support for dot11r FT -HAS_DOT11R_FT_SUPPORT=n - - -#Support for dot11k RRM -HAS_DOT11K_RRM_SUPPORT=n - -HAS_HOTSPOT_SUPPORT=n - -#Support for dot 11v WNM -HAS_DOT11V_WNM_SUPPORT=n - -HAS_WAPP_SUPPORT=n - -HAS_MBO_SUPPORT=n -ifeq ($(HAS_MBO_SUPPORT),y) -HAS_WAPP_SUPPORT=y -HAS_DOT11K_RRM_SUPPORT=y -HAS_HOTSPOT_SUPPORT=y -endif - -HAS_MAP_SUPPORT=n -ifeq ($(HAS_MAP_SUPPORT),y) -HAS_MBO_SUPPORT=y -HAS_WAPP_SUPPORT=y -HAS_DOT11K_RRM_SUPPORT=y -HAS_HOTSPOT_SUPPORT=y -endif - - - - - -#Support for Auto channel select enhance -HAS_AUTO_CH_SELECT_ENHANCE=n - -#Support statistics count -HAS_STATS_COUNT=y - -#Support TSSI Antenna Variation -HAS_TSSI_ANTENNA_VARIATION=n - - -#Support ANDROID_SUPPORT (2.X with WEXT-based) -HAS_ANDROID_SUPPORT=n - -#HAS_IFUP_IN_PROBE_SUPPORT -HAS_IFUP_IN_PROBE_SUPPORT=n - -#Support for dot11w Protected Management Frame -HAS_DOT11W_PMF_SUPPORT=y - - - -#Client support WDS function -HAS_CLIENT_WDS_SUPPORT=n - -#Support for Bridge Fast Path & Bridge Fast Path function open to other module -HAS_BGFP_SUPPORT=n -HAS_BGFP_OPEN_SUPPORT=n - -# Support HOSTAPD function -HAS_HOSTAPD_SUPPORT=n - -#Support GreenAP function -HAS_GREENAP_SUPPORT=y - -#Support cfg80211 function with Linux Only. -#Please make sure insmod the cfg80211.ko before our driver, -#our driver references to its symbol. -HAS_CFG80211_SUPPORT=n -#smooth the scan signal for cfg80211 based driver -HAS_CFG80211_SCAN_SIGNAL_AVG_SUPPORT=n -#control two STA using wpa_supplicant -HAS_CFG80211_MULTI_STA_SUPPORT=n -#Cfg80211-based P2P Support -HAS_CFG80211_P2P_SUPPORT=n -#Cfg80211-based P2P Mode Selection (must one be chosen) -HAS_CFG80211_P2P_CONCURRENT_DEVICE=n -HAS_CFG80211_P2P_SINGLE_DEVICE=n -HAS_CFG80211_P2P_STATIC_CONCURRENT_DEVICE=n - -HAS_CFG80211_P2P_MULTI_CHAN_SUPPORT=n - -#Cfg80211-based TDLS support -HAS_CFG80211_TDLS_SUPPORT=n -#For android wifi priv-lib (cfg80211_based wpa_supplicant cmd expansion) -HAS_CFG80211_ANDROID_PRIV_LIB_SUPPORT=n - -#Support RFKILL hardware block/unblock LINUX-only function -HAS_RFKILL_HW_SUPPORT=n - - - -HAS_MT_MAC_BT_COEXISTENCE_SUPPORT=n - -HAS_APCLI_WPA_SUPPLICANT=n - -HAS_LED_CONTROL_SUPPORT=n - - -HAS_TXBF_SUPPORT=y -HAS_VHT_TXBF_SUPPORT=y -HAS_STA_ITXBF_SUPPORT=y - -HAS_STREAM_MODE_SUPPORT=n - -HAS_NEW_RATE_ADAPT_SUPPORT=n - -HAS_RATE_ADAPT_AGS_SUPPORT=n - -HAS_RACTRL_FW_OFFLOAD_SUPPORT=n - -HAS_CSO_SUPPORT=n - - -HAS_FW_DUMP_SUPPORT=n - -HAS_THERMAL_PROTECT_SUPPORT=y - -HAS_ANDES_FIRMWARE_SUPPORT=n - -HAS_MULTI_CHANNEL=n - -HAS_MICROWAVE_OVEN_SUPPORT=n - -HAS_MAC_REPEATER_SUPPORT=y - -HAS_SWITCH_CHANNEL_OFFLOAD=n - -HAS_RESOURCE_PRE_ALLOC=y -HAS_RESOURCE_BOOT_ALLOC=n - - -HAS_DVT_MODE=n - -HAS_KEEP_ALIVE_OFFLOAD=y - -HAS_WTBL_TLV_MODE=n - -HAS_HW_HAL_OFFLOAD=y - -HAS_SNIFFER_SUPPORT=n - -HAS_CALIBRATION_COLLECTION_SUPPORT=y - -HAS_CAL_FREE_IC_SUPPORT=y - -HAS_FW_DEBUG_SUPPORT=y - -HAS_FWOWN_SUPPORT=n - -HAS_TRACE_SUPPORT=n - -HAS_WIFI_REGION32_HIDDEN_SSID_SUPPORT=n - -HAS_UAPSD_SUPPORT=y - - -HAS_MLME_BY_CMDTHREAD=n - -# Assign specified profile path when insmod -HAS_PROFILE_DYN_SUPPORT=n - -# MU-MIMO AP -HAS_MU_MIMO_SUPPORT=n - - - -HAS_DELAY_INT=n - -#DSCP QOS Support -HAS_DSCP_QOS_SUPPORT=n - -#DSCP PRI SUPPORT -HAS_DSCP_PRI_SUPPORT=n - -#Wifi System FW cmd support version -HAS_WIFI_SYS_FW_V1=y -HAS_WIFI_SYS_FW_V2=y - -#Wifi MTD related access -HAS_WIFI_MTD=n -#Multi Profile Support -HAS_MULTI_PROFILE_SUPPORT=y - -#Sonos custom Features -HAS_NF_SUPPORT=n -HAS_LTF_SNR_SUPPORT=n -HAS_CCK_LQ_SUPPORT=n - - -HAS_WIFI_EAP_FEATURE=y - -HAS_CONFIG_RA_PHY_RATE_SUPPORT=y - -################################################# - -CC := $(CROSS_COMPILE)gcc -LD := $(CROSS_COMPILE)ld - -WFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs -Werror -Wno-date-time -WFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -DENHANCED_STAT_DISPLAY -WFLAGS += -DSYSTEM_LOG_SUPPORT -DRT28xx_MODE=$(RT28xx_MODE) -DCHIPSET=$(MODULE) -#WFLAGS += -DDBG_DIAGNOSE -DDBG_RX_MCS -DDBG_TX_MCS -WFLAGS += -DOLDSEC -#APsoc Specific -WFLAGS += -DCONFIG_RA_NAT_NONE -#end of /* APsoc Specific */ - -#For linux kernel > 3.5 to select SLAB or PAGE memory alloc method -#WFLAGS += -DCONFIG_WIFI_PAGE_ALLOC_SKB -#WFLAGS += -DCONFIG_WIFI_SLAB_ALLOC_SKB - - -WFLAGS += -I$(RT28xx_DIR)/include -I$(RT28xx_EMBEDDED_DIR)/include - -ifeq ($(HAS_RESOURCE_PRE_ALLOC),y) -WFLAGS += -DRESOURCE_PRE_ALLOC -endif - -ifeq ($(HAS_MULTI_PROFILE_SUPPORT),y) -WFLAGS += -DMULTI_PROFILE -endif - -ifeq ($(HAS_WPA3_SUPPORT),y) -WFLAGS += -DDOT11_SAE_SUPPORT -DDOT11_SUITEB_SUPPORT -DDOT11W_PMF_SUPPORT -DOT11_SAE_PWD_ID_SUPPORT -WFLAGS += -DDOT11_SAE_OPENSSL_BN -ifeq ($(HAS_APCLI),y) -WFLAGS += -DAPCLI_SAE_SUPPORT -endif -ifeq ($(HAS_BEACON_MISS_ON_PRIMARY_CHANNEL),y) -WFLAGS += -DBEACON_MISS_ON_PRIMARY_CHANNEL -endif -ifeq ($(HAS_OWE_SUPPORT),y) -WFLAGS += -DCONFIG_OWE_SUPPORT -endif -endif - - -ifeq ($(HAS_HE_SUPPORT),y) -WFLAGS += -DHE_SUPPORT -WFLAGS += -DIP_ASSEMBLY -endif - -ifeq ($(HAS_INTEL_UDMA_SUPPORT),y) -WFLAGS += -DRTMP_UDMA_SUPPORT -endif - -ifeq ($(HAS_G_BAND_256QAM),y) -WFLAGS += -DG_BAND_256QAM -endif - - -ifeq ($(HAS_MULTI_INF),y) -WFLAGS += -DMULTI_INF_SUPPORT -endif - -ifeq ($(HAS_STREAM_MODE_SUPPORT),y) -WFLAGS += -DSTREAM_MODE_SUPPORT -endif - -ifeq ($(HAS_SINGLE_SKU_V2_SUPPORT),y) -WFLAGS += -DSINGLE_SKU_V2 -endif - - - -ifeq ($(HAS_DOT11_VHT_SUPPORT),y) -WFLAGS += -DDOT11_VHT_AC -endif - -ifeq ($(HAS_ANDES_FIRMWARE_SUPPORT),y) -WFLAGS += -DANDES_FIRMWARE_SUPPORT -endif - -ifeq ($(HAS_THERMAL_PROTECT_SUPPORT),y) -WFLAGS += -DTHERMAL_PROTECT_SUPPORT -endif - -ifeq ($(HAS_ATE),y) -WFLAGS += -DCONFIG_ATE -WFLAGS += -I$(RT28xx_DIR)/ate/include - -ifeq ($(HAS_QA_SUPPORT),y) -WFLAGS += -DCONFIG_QA -endif - -endif - -ifeq ($(HAS_CAL_FREE_IC_SUPPORT),y) -WFLAGS += -DCAL_FREE_IC_SUPPORT -endif - -ifeq ($(HAS_UAPSD_SUPPORT),y) -WFLAGS += -DUAPSD_SUPPORT -endif - - -ifeq ($(HAS_FW_DUMP_SUPPORT),y) -WFLAGS += -DFW_DUMP_SUPPORT -endif - -ifeq ($(HAS_USB_IOT_WORKAROUND2),y) -WFLAGS += -DUSB_IOT_WORKAROUND2 -endif - -ifeq ($(HAS_MLME_BY_CMDTHREAD),y) -WFLAGS += -DMLME_BY_CMDTHREAD -endif - -ifeq ($(HAS_DELAY_INT),y) -WFLAGS += -DCONFIG_DELAY_INT -endif - -ifeq ($(HAS_DOT11W_PMF_SUPPORT),y) -WFLAGS += -DDOT11W_PMF_SUPPORT -endif - -ifeq ($(HAS_WIFI_SYS_FW_V1),y) -WFLAGS += -DWIFI_SYS_FW_V1 -endif - -ifeq ($(HAS_WIFI_SYS_FW_V2),y) -WFLAGS += -DWIFI_SYS_FW_V2 -endif - -ifeq ($(HAS_WIFI_MTD),y) -WFLAGS += -DCONFIG_WIFI_MTD -endif - -#-Wframe-larger-than=4096 - -############################################################################### -# -# config for AP mode -# -############################################################################### - - -ifeq ($(RT28xx_MODE),AP) -WFLAGS += -DCONFIG_AP_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -WFLAGS += -DDBG -#WFLAGS += -DACCOUNTING_SUPPORT -ifeq ($(HAS_APCLI_WPA_SUPPLICANT),y) -WFLAGS += -DApCli_WPA_SUPPLICANT_SUPPORT -endif - -ifeq ($(HAS_WAPP_SUPPORT),y) -WFLAGS += -DWAPP_SUPPORT -endif - -ifeq ($(HAS_MBO_SUPPORT),y) -WFLAGS += -DMBO_SUPPORT -endif - -ifeq ($(HAS_MAP_SUPPORT),y) -WFLAGS += -DCONFIG_MAP_SUPPORT -DA4_CONN -DROUTING_TAB_SUPPORT -endif - -ifeq ($(HAS_HOSTAPD_SUPPORT),y) -WFLAGS += -DHOSTAPD_SUPPORT -endif - -ifeq ($(HAS_RSSI_FEEDBACK),y) -WFLAGS += -DRSSI_FEEDBACK -endif - - - -ifeq ($(HAS_ICAP_SUPPORT),y) -WFLAGS += -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(HAS_WIFI_SPECTRUM_SUPPORT),y) -WFLAGS += -DWIFI_SPECTRUM_SUPPORT -endif - -ifeq ($(HAS_WSC),y) -WFLAGS += -DWSC_AP_SUPPORT - -ifeq ($(HAS_WSC_V2),y) -WFLAGS += -DWSC_V2_SUPPORT -endif -ifeq ($(HAS_WSC_LED),y) -WFLAGS += -DWSC_LED_SUPPORT -endif -ifeq ($(HAS_WSC_NFC),y) -WFLAGS += -DWSC_NFC_SUPPORT -endif -endif - - -ifeq ($(HAS_WDS),y) -WFLAGS += -DWDS_SUPPORT -endif - - - -ifeq ($(HAS_AIR_MONITOR),y) -WFLAGS += -DAIR_MONITOR -endif - -ifeq ($(HAS_ROAMING_ENHANCE_SUPPORT),y) -HAS_APCLI=y -WFLAGS += -DROAMING_ENHANCE_SUPPORT -endif - -ifeq ($(HAS_APCLI),y) -WFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT #-DAPCLI_AUTO_CONNECT_SUPPORT -#ifeq ($(HAS_ETH_CONVERT_SUPPORT), y) -#WFLAGS += -DETH_CONVERT_SUPPORT -endif - -ifeq ($(HAS_MAC_REPEATER_SUPPORT),y) -WFLAGS += -DMAC_REPEATER_SUPPORT -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -endif - - -ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y) -WFLAGS += -DIGMP_SNOOP_SUPPORT -endif - -ifeq ($(HAS_CS_SUPPORT),y) -WFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y) -WFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifneq ($(findstring 2860,$(CHIPSET)),) -ifeq ($(HAS_MSI_SUPPORT),y) -WFLAGS += -DPCI_MSI_SUPPORT -endif -endif - - -ifeq ($(HAS_SNMP_SUPPORT),y) -WFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(HAS_DOT11_N_SUPPORT),y) -WFLAGS += -DDOT11_N_SUPPORT - -ifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y) -WFLAGS += -DDOT11N_DRAFT3 -endif - -ifeq ($(HAS_TXBF_SUPPORT),y) -WFLAGS += -DTXBF_SUPPORT -endif - -ifeq ($(HAS_VHT_TXBF_SUPPORT),y) -WFLAGS += -DVHT_TXBF_SUPPORT -endif - -ifeq ($(HAS_STA_ITXBF_SUPPORT), y) -WFLAGS += -DSTA_ITXBF_SUPPORT -endif - -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -ifeq ($(HAS_RATE_ADAPT_AGS_SUPPORT),y) -WFLAGS += -DAGS_SUPPORT -endif - -ifeq ($(HAS_GREENAP_SUPPORT),y) -WFLAGS += -DGREENAP_SUPPORT -endif - -endif - -ifeq ($(HAS_AUTO_CH_SELECT_ENHANCE),y) -WFLAGS += -DAUTO_CH_SELECT_ENHANCE -endif - -ifeq ($(HAS_STATS_COUNT),y) -WFLAGS += -DSTATS_COUNT_SUPPORT -endif - -ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y) -WFLAGS += -DTSSI_ANTENNA_VARIATION -endif - -ifeq ($(HAS_USB_BULK_BUF_ALIGMENT),y) -WFLAGS += -DUSB_BULK_BUF_ALIGMENT -endif - -ifeq ($(HAS_CFG80211_SUPPORT),y) -WFLAGS += -DRT_CFG80211_SUPPORT -DWPA_SUPPLICANT_SUPPORT -#WFLAGS += -DEXT_BUILD_CHANNEL_LIST -ifeq ($(HAS_RFKILL_HW_SUPPORT),y) -WFLAGS += -DRFKILL_HW_SUPPORT -endif -ifeq ($(HAS_CFG80211_SCAN_SIGNAL_AVG_SUPPORT),y) -WFLAGS += -DCFG80211_SCAN_SIGNAL_AVG -endif -ifeq ($(HAS_CFG80211_P2P_SUPPORT),y) -WFLAGS += -DRT_CFG80211_P2P_SUPPORT -WFLAGS += -DCONFIG_AP_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DAP_SCAN_SUPPORT -WFLAGS += -DAPCLI_SUPPORT -ifeq ($(HAS_CFG80211_P2P_SINGLE_DEVICE),y) -WFLAGS += -DRT_CFG80211_P2P_SINGLE_DEVICE -else -ifeq ($(HAS_CFG80211_P2P_STATIC_CONCURRENT_DEVICE),y) -WFLAGS += -DRT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE -else -WFLAGS += -DRT_CFG80211_P2P_CONCURRENT_DEVICE -ifeq ($(HAS_CFG80211_P2P_MULTI_CHAN_SUPPORT),y) -WFLAGS += -DMULTI_WMM_SUPPORT -DCONFIG_MULTI_CHANNEL -DRT_CFG80211_P2P_MULTI_CHAN_SUPPORT -endif -endif -endif -endif -ifeq ($(HAS_CFG80211_ANDROID_PRIV_LIB_SUPPORT),y) -WFLAGS += -DRT_RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT -endif -ifeq ($(HAS_CFG80211_TDLS_SUPPORT),y) -WFLAGS += -DCFG_TDLS_SUPPORT -DUAPSD_SUPPORT -endif -endif - - - -ifeq ($(HAS_BGND_SCAN_SUPPORT),y) -ifneq ($(findstring mt7615,$(CHIPSET)),) -WFLAGS += -DBACKGROUND_SCAN_SUPPORT -endif -endif - -ifeq ($(HAS_SMART_CARRIER_SENSE_SUPPORT),y) -WFLAGS += -DSMART_CARRIER_SENSE_SUPPORT -endif - -ifeq ($(HAS_MT_DFS_SUPPORT),y) -WFLAGS += -DMT_DFS_SUPPORT -endif - -ifeq ($(HAS_NF_SUPPORT),y) -ifneq ($(findstring mt7615,$(CHIPSET)),) -WFLAGS += -DNF_SUPPORT -endif -endif - -ifeq ($(HAS_LTF_SNR_SUPPORT),y) -ifneq ($(findstring mt7615,$(CHIPSET)),) -WFLAGS += -DLTF_SNR_SUPPORT -endif -endif - -ifeq ($(HAS_CCK_LQ_SUPPORT),y) -ifneq ($(findstring mt7615,$(CHIPSET)),) -WFLAGS += -DCCK_LQ_SUPPORT -endif -endif - -ifeq ($(HAS_WIFI_EAP_FEATURE),y) -WFLAGS += -DWIFI_EAP_FEATURE -endif - -ifeq ($(HAS_CONFIG_RA_PHY_RATE_SUPPORT),y) -WFLAGS += -DCONFIG_RA_PHY_RATE_SUPPORT -endif - -endif #// endif of RT2860_MODE == AP // - -######################################################## -# -# config for STA mode -# -######################################################## - - -########################################################### -# -# config for APSTA -# -########################################################### - - -ifeq ($(RT28xx_MODE),APSTA) -WFLAGS += -DCONFIG_AP_SUPPORT -DCONFIG_STA_SUPPORT -DCONFIG_APSTA_MIXED_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DDBG - - -ifeq ($(HAS_WSC),y) -WFLAGS += -DWSC_AP_SUPPORT -DWSC_STA_SUPPORT -endif - -ifeq ($(HAS_WDS),y) -WFLAGS += -DWDS_SUPPORT -endif - -ifeq ($(HAS_APCLI),y) -WFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -endif - -ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y) -WFLAGS += -DIGMP_SNOOP_SUPPORT -endif - -ifeq ($(HAS_CS_SUPPORT),y) -WFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y) -WFLAGS += -DMCAST_RATE_SPECIFIC -endif - - - -ifeq ($(HAS_DOT11_N_SUPPORT),y) -WFLAGS += -DDOT11_N_SUPPORT -endif - -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - - -ifeq ($(HAS_CS_SUPPORT),y) -WFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(HAS_STATS_COUNT),y) -WFLAGS += -DSTATS_COUNT_SUPPORT -endif - -ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y) -WFLAGS += -DTSSI_ANTENNA_VARIATION -endif - -ifeq ($(HAS_CFG80211_SUPPORT),y) -WFLAGS += -DRT_CFG80211_SUPPORT -DWPA_SUPPLICANT_SUPPORT -ifeq ($(HAS_RFKILL_HW_SUPPORT),y) -WFLAGS += -DRFKILL_HW_SUPPORT -endif -ifeq ($(HAS_CFG80211_SCAN_SIGNAL_AVG_SUPPORT),y) -WFLAGS += -DCFG80211_SCAN_SIGNAL_AVG -endif -endif - -ifeq ($(HAS_P2P_SUPPORT),y) -WFLAGS += -DP2P_SUPPORT -WFLAGS += -DAPCLI_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DP2P_APCLI_SUPPORT -endif - -endif -# endif of ifeq ($(RT28xx_MODE),APSTA) - - -########################################################## -# -# Common compiler flag -# -########################################################## - - - -ifeq ($(HAS_DOT11R_FT_SUPPORT),y) -WFLAGS += -DDOT11R_FT_SUPPORT -endif - -ifeq ($(HAS_DOT11K_RRM_SUPPORT),y) -WFLAGS += -DDOT11K_RRM_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DAPPLE_11K_IOT -endif - -ifeq ($(HAS_DOT11V_WNM_SUPPORT),y) -WFLAGS += -DCONFIG_DOT11V_WNM -endif - -ifeq ($(HAS_EXT_BUILD_CHANNEL_LIST),y) -WFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(HAS_IDS_SUPPORT),y) -WFLAGS += -DIDS_SUPPORT -endif - - -ifeq ($(HAS_CLIENT_WDS_SUPPORT),y) -WFLAGS += -DCLIENT_WDS -endif - -ifeq ($(HAS_BGFP_SUPPORT),y) -WFLAGS += -DBG_FT_SUPPORT -endif - -ifeq ($(HAS_BGFP_OPEN_SUPPORT),y) -WFLAGS += -DBG_FT_OPEN_SUPPORT -endif - -ifeq ($(HAS_LED_CONTROL_SUPPORT),y) -WFLAGS += -DLED_CONTROL_SUPPORT -endif - -ifeq ($(HAS_HOTSPOT_SUPPORT),y) -WFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -DCONFIG_HOTSPOT_R2 -endif - -ifeq ($(HAS_DSCP_QOS_SUPPORT),y) -WFLAGS += -DDSCP_QOS_MAP_SUPPORT -endif - -ifeq ($(HAS_DSCP_PRI_SUPPORT),y) -WFLAGS += -DDSCP_PRI_SUPPORT -endif - -ifeq ($(HAS_MULTI_CHANNEL),y) -WFLAGS += -DCONFIG_MULTI_CHANNEL -endif - -ifeq ($(HAS_MICROWAVE_OVEN_SUPPORT),y) -WFLAGS += -DMICROWAVE_OVEN_SUPPORT -endif - - -ifeq ($(HAS_DVT_MODE),y) -WFLAGS += -DCONFIG_DVT_MODE -endif - -ifeq ($(HAS_KEEP_ALIVE_OFFLOAD),y) -WFLAGS += -DCONFIG_KEEP_ALIVE_OFFLOAD -endif - -ifeq ($(HAS_WTBL_TLV_MODE),y) -ifeq ($(CHIPSET),$(filter $(CHIPSET),mt7636u mt7636s mt7615 mt7637u mt7637e mt7637s)) -WFLAGS += -DCONFIG_WTBL_TLV_MODE -endif -endif - -ifeq ($(HAS_HW_HAL_OFFLOAD),y) -WFLAGS += -DCONFIG_HW_HAL_OFFLOAD -endif - -ifeq ($(HAS_SNIFFER_SUPPORT),y) -WFLAGS += -DCONFIG_SNIFFER_SUPPORT -DMONITOR_FLAG_11N_SNIFFER_SUPPORT -ifeq ($(CHIPSET),$(filter $(CHIPSET),mt7615)) -# Include -DWIRESHARK_1_12_2_1 for Wireshark-1.12.2.1 -WFLAGS += -DSNIFFER_MT7615 -#WFLAGS += -DSNIFFER_MT7615 -DSNIFFER_MT7615_RMAC_INC -endif -endif - -ifeq ($(HAS_CALIBRATION_COLLECTION_SUPPORT),y) -WFLAGS += -DCONFIG_CALIBRATION_COLLECTION -endif - -ifeq ($(HAS_TRACE_SUPPORT),y) -WFLAGS += -DCONFIG_TRACE_SUPPORT -endif - -ifeq ($(HAS_FW_DEBUG_SUPPORT),y) -WFLAGS += -DCONFIG_FW_DEBUG -endif - -ifeq ($(HAS_WIFI_REGION32_HIDDEN_SSID_SUPPORT),y) -WFLAGS += -DWIFI_REGION32_HIDDEN_SSID_SUPPORT -endif - -ifeq ($(HAS_VOW_SUPPORT),y) -WFLAGS += -DVOW_SUPPORT -endif - -# Per-clent tail drop(RED) -ifeq ($(HAS_RED_SUPPORT),y) -WFLAGS += -DRED_SUPPORT -endif - -################################################# -# ChipSet specific definitions - MT Series -# -################################################# - - - -# MT7615 -ifneq ($(findstring mt7615,$(CHIPSET)),) -WFLAGS += -DMT7615 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -WFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -WFLAGS += -DRTMP_EFUSE_SUPPORT -DRTMP_FLASH_SUPPORT -WFLAGS += -DCAL_FREE_IC_SUPPORT -WFLAGS += -DBCN_OFFLOAD_SUPPORT -WFLAGS += -DERR_RECOVERY -#WFLAGS += -DNEW_SET_RX_STREAM -WFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -WFLAGS += -DUNIFY_FW_CMD -#WFLAGS += -DTMR_VERIFY -WFLAGS += -DDBDC_MODE -WFLAGS += -DNEED_ROM_PATCH -WFLAGS += -DTXPWRMANUAL -WFLAGS += -DMAC_INIT_OFFLOAD -WFLAGS += -DENHANCED_STAT_DISPLAY -WFLAGS += -DTX_POWER_CONTROL_SUPPORT -WFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -WFLAGS += -DCONFIG_TX_DELAY -WFLAGS += -DIP_ASSEMBLY -WFLAGS += -DOUI_CHECK_SUPPORT -WFLAGS += -DHTC_DECRYPT_IOT -ifeq ($(PLATFORM),INTELP6) -WFLAGS += -DINTELP6_SUPPORT -WFLAGS += -DMULTI_INF_SUPPORT -DCONFIG_RT_SECOND_CARD=7615 -DCONFIG_RT_FIRST_CARD=7615 -WFLAGS += -DCON_WPS_AP_SAME_UUID -DCON_WPS -WFLAGS += -DVENDOR_FEATURE7_SUPPORT -WFLAGS += -DCREATE_ALL_INTERFACE_AT_INIT -WFLAGS += -DCONFIG_WIFI_MSI_SUPPORT -WFLAGS += -DCONFIG_INIT_RADIO_ONOFF -WFLAGS += -DMBSS_AS_WDS_AP_SUPPORT -WFLAGS += -DALLOW_INTER_STA_TRAFFIC_BTN_BSSID -WFLAGS += -DCONFIG_STEERING_API_SUPPORT -DCONFIG_11KV_API_SUPPORT -DCONFIG_DOT11V_WNM -DDOT11K_RRM_SUPPORT -WFLAGS += -DCONFIG_LED_ACTIVITY_ON_MAIN_MBSS -WFLAGS += -DCONFIG_RECOVERY_ON_INTERRUPT_MISS -WFLAGS += -DDOT11U_INTERWORKING_IE_SUPPORT -WFLAGS += -DDISABLE_MULTICLIENT_DYNAMIC_TXOP -WFLAGS += -DASUS_AC68_FIX -WFLAGS += -DINTELP6_UDMA_CPU_LOAD_OPTIMIZATION -DONDEMAND_DFS -WFLAGS += -DCUSTOMER_RSG_FEATURE -WFLAGS += -DCUSTOMER_DCC_FEATURE -WFLAGS += -DOFFCHANNEL_SCAN_FEATURE -endif -ifeq ($(HAS_WEPAUTO_OPEN_FIRST_SUPPORT),y) -WFLAGS += -DWEPAUTO_OPEN_FIRST -endif - -ifeq ($(HAS_TXBF_SUPPORT),y) -WFLAGS += -DTXBF_SUPPORT -ifeq ($(HAS_VHT_TXBF_SUPPORT),y) -WFLAGS += -DVHT_TXBF_SUPPORT -endif -ifeq ($(HAS_STA_ITXBF_SUPPORT), y) -WFLAGS += -DSTA_ITXBF_SUPPORT -endif -endif - -#WFLAGS += -DDBG_DIAGNOSE -DDBG_TX_AGG_CNT -DDBG_TXQ_DEPTH -DDBG_TX_RING_DEPTH -DDBG_TX_MCS -DDBG_RX_MCS -DDBG_PSE_DEPTH -HAS_RATE_ADAPT_AGBS_SUPPORT=y -HAS_NEW_RATE_ADAPT_SUPPORT=n -HAS_RACTRL_FW_OFFLOAD_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -ifeq ($(HAS_RATE_ADAPT_AGBS_SUPPORT),y) -WFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -WFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -endif - -WFLAGS += -DSTA_LP_PHASE_2_SUPPORT -DCONFIG_PM_BIT_HW_MODE -DCONFIG_PM - -ifeq ($(HAS_CSO_SUPPORT), y) -WFLAGS += -DCONFIG_CSO_SUPPORT -endif - -HAS_NEED_ROM_PATCH=y - -ifeq ($(HAS_FWOWN_SUPPORT),y) -WFLAGS += -DCONFIG_FWOWN_SUPPORT -endif - -WFLAGS += -DRTMP_WLAN_HOOK_SUPPORT -HAS_MT_BBP=y -HAS_MT_MAC=y -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_MT_MAC=y -HAS_MT_RF=y -HAS_HDR_TRANS_TX_SUPPORT=y -HAS_HDR_TRANS_RX_SUPPORT=y -HAS_CUT_THROUGH=y -HAS_RX_CUT_THROUGH=n -HAS_CUT_THROUGH_DBG=n -HAS_PALLADIUM=n -HAS_FW_OFFLOAD=n -HAS_FW_OFFLOAD_DEV_BSS_STAREC=n -HAS_ERR_RECOVERY=y -HAS_RX_SCATTER=y -HAS_NEW_TLV=n -HAS_DOT11_VHT_SUPPORT=y -HAS_TCP_RACK_SUPPORT=n -HAS_RLM_CAL_CACHE=n -HAS_RF_LOCKDOWN=y -HAS_SINGLE_SKU_V2_SUPPORT=y - -ifeq ($(HAS_RF_LOCKDOWN),y) -WFLAGS += -DRF_LOCKDOWN -endif - -ifeq ($(HAS_RLM_CAL_CACHE),y) -WFLAGS += -DRLM_CAL_CACHE_SUPPORT -endif -ifeq ($(HAS_DOT11_VHT_SUPPORT),y) -WFLAGS += -DDOT11_VHT_AC -endif -WFLAGS += -DCONFIG_FWOWN_SUPPORT - -ifeq ($(HAS_TCP_RACK_SUPPORT),y) -WFLAGS += -DREDUCE_TCP_ACK_SUPPORT -endif - -ifeq ($(HAS_NEED_ROM_PATCH), y) -WFLAGS += -DNEED_ROM_PATCH -endif - -CHIPSET_DAT = 2860 -endif -# MT7615 end - - -ifneq ($(findstring mt7622,$(CHIPSET)),) -WFLAGS += -DMT7622 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -WFLAGS += -DMT_DMAC -WFLAGS += -DMCS_LUT_SUPPORT -WFLAGS += -DRTMP_EFUSE_SUPPORT -DRTMP_FLASH_SUPPORT -WFLAGS += -DBCN_OFFLOAD_SUPPORT -WFLAGS += -DETSI_RX_BLOCKER_SUPPORT -#WFLAGS += -DNEW_SET_RX_STREAM -WFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -WFLAGS += -DUNIFY_FW_CMD -#WFLAGS += -DTMR_VERIFY -WFLAGS += -DTxPwrManual -WFLAGS += -DNEED_ROM_PATCH -WFLAGS += -DMAC_INIT_OFFLOAD -WFLAGS += -DENHANCED_STAT_DISPLAY -WFLAGS += -DCONFIG_FWOWN_SUPPORT -WFLAGS += -DNEWSEC -WFLAGS += -DRESOURCE_PRE_ALLOC -WFLAGS += -DCONFIG_HW_HAL_OFFLOAD -WFLAGS += -DRX_SCATTER -#WFLAGS += -DCONFIG_FPGA_MODE -#WFLAGS += -DCONFIG_CSO_SUPPORT -WFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -#WFLAGS += -DMSP_UTILITY -WFLAGS += -DIP_ASSEMBLY - -CONFIG_PLATFORM_DRV_SUPPORT=y -ifeq ($(CONFIG_PLATFORM_DRV_SUPPROT),y) -WFLAGS += -DPLATFORM_DRIVER_SUPPORT -endif - -WFLAGS += -Werror -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - WFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif - -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - WFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - WFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -endif - -ifeq ($(HAS_TXBF_SUPPORT),y) -WFLAGS += -DTXBF_SUPPORT -ifeq ($(HAS_VHT_TXBF_SUPPORT),y) -WFLAGS += -DVHT_TXBF_SUPPORT -endif -ifeq ($(HAS_STA_ITXBF_SUPPORT), y) -WFLAGS += -DSTA_ITXBF_SUPPORT -endif -endif - -HAS_RATE_ADAPT_AGBS_SUPPORT=y -HAS_NEW_RATE_ADAPT_SUPPORT=n -HAS_RACTRL_FW_OFFLOAD_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -ifeq ($(HAS_RATE_ADAPT_AGBS_SUPPORT),y) -WFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -WFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -endif - -WFLAGS += -DSTA_LP_PHASE_2_SUPPORT -DCONFIG_PM_BIT_HW_MODE -DCONFIG_PM - -ifeq ($(HAS_CSO_SUPPORT), y) -WFLAGS += -DCONFIG_CSO_SUPPORT -endif - -HAS_NEED_ROM_PATCH=y - -ifeq ($(HAS_FWOWN_SUPPORT),y) -WFLAGS += -DCONFIG_FWOWN_SUPPORT -endif - -WFLAGS += -DRTMP_WLAN_HOOK_SUPPORT - -HAS_MT_BBP=y -HAS_MT_MAC=y -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_MT_MAC=y -HAS_MT_RF=y -HAS_HDR_TRANS_TX_SUPPORT=y -HAS_HDR_TRANS_RX_SUPPORT=y -HAS_CUT_THROUGH=y -HAS_RX_CUT_THROUGH=n -HAS_CUT_THROUGH_DBG=n -HAS_PALLADIUM=n -HAS_FW_OFFLOAD=n -HAS_FW_OFFLOAD_DEV_BSS_STAREC=n -HAS_ERR_RECOVERY=y -HAS_RX_SCATTER=n -HAS_NEW_TLV=n -HAS_DOT11_VHT_SUPPORT=y -HAS_TCP_RACK_SUPPORT=n -HAS_RLM_CAL_CACHE=n -HAS_RF_LOCKDOWN=n - -ifeq ($(HAS_RF_LOCKDOWN),y) -WFLAGS += -DRF_LOCKDOWN -endif - -ifeq ($(HAS_RLM_CAL_CACHE),y) -WFLAGS += -DRLM_CAL_CACHE_SUPPORT -endif - -ifeq ($(HAS_DOT11_VHT_SUPPORT),y) -WFLAGS += -DDOT11_VHT_AC -endif - -WFLAGS += -DCONFIG_FWOWN_SUPPORT - -ifeq ($(HAS_TCP_RACK_SUPPORT),y) -WFLAGS += -DREDUCE_TCP_ACK_SUPPORT -endif - -ifeq ($(HAS_NEED_ROM_PATCH), y) -WFLAGS += -DNEED_ROM_PATCH -endif - -CHIPSET_DAT = 2860 -endif -# MT7622 end - - -################################################# -# Platform Related definitions -# -################################################# - -ifeq ($(PLATFORM),5VT) -#WFLAGS += -DCONFIG_5VT_ENHANCE -endif - -ifeq ($(HAS_MU_MIMO_SUPPORT),y) -WFLAGS += -DCFG_SUPPORT_MU_MIMO -endif - - -ifeq ($(HAS_BLOCK_NET_IF),y) -WFLAGS += -DBLOCK_NET_IF -endif - -ifeq ($(HAS_ERR_RECOVERY),y) -WFLAGS += -DERR_RECOVERY -endif - -ifeq ($(HAS_RX_SCATTER),y) -WFLAGS += -DRX_SCATTER -endif - -ifeq ($(HAS_CUT_THROUGH),y) -WFLAGS += -DCUT_THROUGH -DCUT_THROGH_DBG -#-DFW_OFFLOAD -endif - -ifeq ($(HAS_RX_CUT_THROUGH),y) -WFLAGS += -DRX_CUT_THROUGH -endif - -ifeq ($(HAS_CUT_THROUGH_DBG),y) -WFLAGS += -DCUT_THROUGH_DBG -endif - -ifeq ($(HAS_HDR_TRANS_TX_SUPPORT),y) -WFLAGS += -DHDR_TRANS_TX_SUPPORT -endif - -ifeq ($(HAS_HDR_TRANS_RX_SUPPORT),y) -WFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -ifeq ($(HAS_MC_SUPPORT),y) -WFLAGS += -DMULTIPLE_CARD_SUPPORT -endif - -ifeq ($(HAS_MEM_ALLOC_INFO_SUPPORT),y) -WFLAGS += -DMEM_ALLOC_INFO_SUPPORT -endif - -ifeq ($(HAS_LLTD),y) -WFLAGS += -DLLTD_SUPPORT -endif - -ifeq ($(PLATFORM),RMI) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),UBICOM_IPX8) -WFLAGS += -DRT_BIG_ENDIAN -DUNALIGNMENT_SUPPORT -DPLATFORM_UBM_IPX8 -DNO_CONSISTENT_MEM_SUPPORT -DCACHE_LINE_32B -endif - -ifeq ($(PLATFORM),BL2348) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),BL23570) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),BLUBB) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),BLPMP) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),RMI_64) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),IXP) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),IKANOS_V160) -WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0 -endif - -ifeq ($(PLATFORM),IKANOS_V180) -WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0 -endif - -ifeq ($(PLATFORM),INF_TWINPASS) -WFLAGS += -DRT_BIG_ENDIAN -DINF_TWINPASS -endif - -ifeq ($(PLATFORM),INF_DANUBE) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) -# Linux 2.4 -WFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN -else -# Linux 2.6 -WFLAGS += -DRT_BIG_ENDIAN -endif -endif - -ifeq ($(PLATFORM),INF_AR9) -WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9 -# support MAPI function for AR9. -#WFLAGS += -DAR9_MAPI_SUPPORT -endif - -ifeq ($(PLATFORM),INF_VR9) -WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9 -DINF_VR9 -endif - -ifeq ($(PLATFORM),CAVM_OCTEON) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),BRCM_6358) -WFLAGS += -DRT_BIG_ENDIAN -DBRCM_6358 -endif - -ifeq ($(PLATFORM),FREESCALE8377) -#EXTRA_CFLAGS := -v -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include $(WFLAGS)-O2 -Wall -Wstrict-prototypes -Wno-trigraphs -#export EXTRA_CFLAGS -WFLAGS += -DRT_BIG_ENDIAN -EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include -endif - -ifeq ($(PLATFORM),ST) -WFLAGS += -DST -endif - -#kernel build options for 2.4 -# move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star - -ifeq ($(PLATFORM),STAR) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mshort-load-bytes -msoft-float -Uarm -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) - -export CFLAGS -endif - -ifeq ($(PLATFORM),UBICOM_IPX8) -EXTRA_CFLAGS += $(WFLAGS) -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),SIGMA) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM - -export CFLAGS -endif - -ifeq ($(PLATFORM),SIGMA_8622) -CFLAGS := -D__KERNEL__ -I$(CROSS_COMPILE_INCLUDE)/include -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),5VT) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS) - -export CFLAGS -endif - -ifeq ($(PLATFORM),IKANOS_V160) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -march=lx4189 -Wa, -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),IKANOS_V180) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mips32r2 -Wa, -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),INF_TWINPASS) -CFLAGS := -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -G 0 -mno-abicalls -fno-pic -march=4kc -mips32 -Wa,--trap -pipe -mlong-calls $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),INF_DANUBE) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) - CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic - else - CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic - endif -export CFLAGS -endif - -ifeq ($(PLATFORM),INF_AR9) -CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -mtune=34kc -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic -export CFLAGS -endif - -ifeq ($(PLATFORM),INF_VR9) -CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic -export CFLAGS -endif - -ifeq ($(PLATFORM),BRCM_6358) -CFLAGS := $(WFLAGS) -nostdinc -iwithprefix include -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -I $(LINUX_SRC)/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-bcm963xx -I$(LINUX_SRC)/include/asm-mips/mach-generic -Os -fomit-frame-pointer -Wdeclaration-after-statement -DMODULE -mlong-calls -export CFLAGS -endif - -ifeq ($(PLATFORM),ST) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -O2 -Wundef -Wstrict-prototypes -Wno-trigraphs -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-aliasing -fno-common -fomit-frame-pointer -ffreestanding -m4-nofpu -o $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),PC) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) - # Linux 2.4 - CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) - export CFLAGS - else - # Linux 2.6 - EXTRA_CFLAGS := $(WFLAGS) - endif -endif - -ifeq ($(PLATFORM),INTELP6) - EXTRA_CFLAGS := $(WFLAGS) -endif - -#If the kernel version of RMI is newer than 2.6.27, please change "CFLAGS" to "EXTRA_FLAGS" -ifeq ($(PLATFORM),RMI) -EXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS) -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),RMI_64) -EXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=64 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS) -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),IXP) - CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -mbig-endian -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS) - EXTRA_CFLAGS := -v $(WFLAGS) -mbig-endian - export CFLAGS -endif - -ifeq ($(PLATFORM),SMDK) - EXTRA_CFLAGS := $(WFLAGS) -endif - -ifeq ($(PLATFORM),CAVM_OCTEON) - EXTRA_CFLAGS := $(WFLAGS) -mabi=64 $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),BB_SOC) -WFLAGS += -DRT_BIG_ENDIAN -DBB_SOC -DWIFI_MODULE -DCONFIG_RA_NAT_NONE -ifeq ($(CONFIG_MIPS_TC3262),y) -WFLAGS += -DMULTI_CORE_SUPPORT -endif -ifeq ($(RALINK_PCIE_ADDR_SWAP),1) -WFLAGS += -DBB_PCIE_ADDR_SWAP -endif -ifeq ($(TCSUPPORT_HWNAT_WIFI),1) -WFLAGS += -DBB_RA_HWNAT_WIFI -endif -EXTRA_CFLAGS += -I$(RT28xx_DIR)/include $(WFLAGS) -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),DM6446) - CFLAGS := -nostdinc -iwithprefix include -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Os -fno-omit-frame-pointer -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittle-endian -mabi=apcs-gnu -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wdeclaration-after-statement -c -o $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),BL2348) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348 -export CFLAGS -endif - -ifeq ($(PLATFORM),BL23570) -EXTRA_CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=74kc -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL23570 -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),BLUBB) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348 -export CFLAGS -endif - -ifeq ($(PLATFORM),BLPMP) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -export CFLAGS -endif - -ifeq ($(PLATFORM),MT85XX) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) - # Linux 2.4 - CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) - export CFLAGS - else - # Linux 2.6 - EXTRA_CFLAGS += $(WFLAGS) - EXTRA_CFLAGS += -D _NO_TYPEDEF_BOOL_ \ - -D _NO_TYPEDEF_UCHAR_ \ - -D _NO_TYPEDEF_UINT8_ \ - -D _NO_TYPEDEF_UINT16_ \ - -D _NO_TYPEDEF_UINT32_ \ - -D _NO_TYPEDEF_UINT64_ \ - -D _NO_TYPEDEF_CHAR_ \ - -D _NO_TYPEDEF_INT32_ \ - -D _NO_TYPEDEF_INT64_ \ - - endif -endif - -ifeq ($(PLATFORM),NXP_TV550) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) - # Linux 2.4 - CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=mips -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) - export CFLAGS - else - # Linux 2.6 - EXTRA_CFLAGS := $(WFLAGS) - endif -endif - -ifeq ($(PLATFORM),MVL5) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),MT7620) - EXTRA_CFLAGS := $(WFLAGS) -endif - -ifeq ($(PLATFORM),MT7621) - EXTRA_CFLAGS := $(WFLAGS) -endif - -ifeq ($(PLATFORM),MT7628) - EXTRA_CFLAGS := $(WFLAGS) -endif - -ifeq ($(PLATFORM),MT7622) - EXTRA_CFLAGS := $(WFLAGS) -endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/config.mk.cfg80211 b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/config.mk.cfg80211 deleted file mode 100644 index afb4fd9359..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/config.mk.cfg80211 +++ /dev/null @@ -1,2492 +0,0 @@ -# Support Multiple Interface within single driver -HAS_MULTI_INF=n - -# Support ATE function -HAS_ATE=n - -# Support QA ATE function -HAS_QA_SUPPORT=n - -#ifdef RSSI_FEEDBACK -HAS_RSSI_FEEDBACK=n -#endif // RSSI_FEEDBACK // - -#ifdef XLINK_SUPPORT -# Support XLINK mode -HAS_XLINK=n -#endif // XLINK_SUPPORT // - -#ifdef WSC_INCLUDED -# Support WSC function -HAS_WSC=n -#ifdef WSC_V2_SUPPORT -HAS_WSC_V2=n -#endif // WSC_V2_SUPPORT // -HAS_WSC_LED=n -HAS_WSC_NFC=n -#ifdef IWSC_SUPPORT -HAS_IWSC_SUPPORT=n -#endif // IWSC_SUPPORT // -#endif // WSC_INCLUDED // - -#ifdef NINTENDO_AP -HAS_NINTENDO=n -#endif // NINTENDO_AP // - -# Support LLTD function -HAS_LLTD=n - -#ifdef WDS_SUPPORT -# Support WDS function -HAS_WDS=n -#endif // WDS_SUPPORT // - -#ifdef APCLI_SUPPORT -# Support AP-Client function -HAS_APCLI=n -#endif // APCLI_SUPPORT // -#ifdef WPA_SUPPLICANT_SUPPORT -# Support Wpa_Supplicant -# i.e. wpa_supplicant -Dralink -HAS_WPA_SUPPLICANT=y -#endif // WPA_SUPPLICANT_SUPPORT // - - -#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT -# Support Native WpaSupplicant for Network Maganger -# i.e. wpa_supplicant -Dwext -HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n -#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // - -#Support Net interface block while Tx-Sw queue full -HAS_BLOCK_NET_IF=n - -#Support IGMP-Snooping function. -HAS_IGMP_SNOOP_SUPPORT=n - -#Support DFS function -HAS_DFS_SUPPORT=n - -#Support Carrier-Sense function -HAS_CS_SUPPORT=n - -#ifeq ($(PLATFORM),MT85XX) -#Support HE_SUPPORT -HAS_HE_SUPPORT=n -HAS_HE_BD_SUPPORT=n -#endif - -ifeq ($(PLATFORM),MT53XX) -#Support HE_SUPPORT -HAS_HE_SUPPORT=y -HAS_HE_TV_SUPPORT=y -endif - -#ifdef WEPAUTO_OPEN_FIRST -#Support WEPAUTO mode try Open first then shared -HAS_WEPAUTO_OPEN_FIRST_SUPPORT=n -#endif - -#ifdef ETH_CONVERT_SUPPORT -# Support for STA Ethernet Converter -HAS_ETH_CONVERT_SUPPORT=n -#endif // ETH_CONVERT_SUPPORT // - -# Support user specific transmit rate of Multicast packet. -HAS_MCAST_RATE_SPECIFIC_SUPPORT=n - -#ifdef MULTI_CARD -# Support for Multiple Cards -HAS_MC_SUPPORT=n -#endif // MULTI_CARD // - -#Support for PCI-MSI -HAS_MSI_SUPPORT=n - -#ifdef WMM_ACM_SUPPORT -# Support for WMM ACM v1.1 -HAS_WMM_ACM_SUPPORT=n -#endif // WMM_ACM_SUPPORT // - -#Support for IEEE802.11e DLS -HAS_QOS_DLS_SUPPORT=n - -#Support for EXT_CHANNEL -HAS_EXT_BUILD_CHANNEL_LIST=n - -#Support for IDS -HAS_IDS_SUPPORT=n - -#ifdef MESH_SUPPORT -#Support for MESH -HAS_MESH_SUPPORT=n -#endif // MESH_SUPPORT // - -#Support for Net-SNMP -HAS_SNMP_SUPPORT=n - -#ifdef DOT11N_DRAFT3 -#Support features of 802.11n Draft3 -HAS_DOT11N_DRAFT3_SUPPORT=y -#endif // DOT11N_DRAFT3 // - -#Support features of Single SKU. -HAS_SINGLE_SKU_SUPPORT=n - -#Support features of Single SKU. -HAS_SINGLE_SKU_V2_SUPPORT=n - -#ifdef DOT11_N_SUPPORT -#Support features of 802.11n -HAS_DOT11_N_SUPPORT=y -#endif // DOT11_N_SUPPORT // - -#ifdef DOT11_VHT_SUPPORT -#Support for 802.11ac VHT -HAS_DOT11_VHT_SUPPORT=n -#endif // DOT11_VHT_SUPPORT // - -#ifdef WAPI_SUPPORT -#Support for WAPI -HAS_WAPI_SUPPORT=n -#endif // WAPI_SUPPORT // - -#ifdef DOT11R_FT_SUPPORT -#Support for dot11r FT -HAS_DOT11R_FT_SUPPORT=n -#endif // DOT11R_FT_SUPPORT // - -#ifdef DOT11K_RRM_SUPPORT -#Support for dot11k RRM -HAS_DOT11K_RRM_SUPPORT=n -#endif // DOT11K_RRM_SUPPORT // - -#ifdef DOT11V_WNM_SUPPORT -#Support for dot 11v WNM -HAS_DOT11V_WNM_SUPPORT=n -#endif // DOT11V_WNM_SUPPORT // - -#ifdef DOT11Z_TDLS_SUPPORT -#Support for dot11z TDLS -HAS_DOT11Z_TDLS_SUPPORT=n -#endif // DOT11Z_TDLS_SUPPORT // - -#ifdef P2P_SUPPORT -#Support for WiFi-Driect(Peer to Peer) -HAS_P2P_SUPPORT=n -HAS_P2P_ODD_MAC_ADJUST=n -HAS_P2P_SPECIFIC_WIRELESS_EVENT=n -#endif // P2P_SUPPORT // - -#Support for WiFi Display -HAS_WFD_SUPPORT=n - -#Support for Auto channel select enhance -HAS_AUTO_CH_SELECT_ENHANCE=n - -#Support statistics count -HAS_STATS_COUNT=y - -#Support TSSI Antenna Variation -HAS_TSSI_ANTENNA_VARIATION=n - -#Support USB_BULK_BUF_ALIGMENT -HAS_USB_BULK_BUF_ALIGMENT=n - -#Support for USB_SUPPORT_SELECTIVE_SUSPEND -HAS_USB_SUPPORT_SELECTIVE_SUSPEND=n - -#Support USB load firmware by multibyte -HAS_USB_FIRMWARE_MULTIBYTE_WRITE=n - - -#Support ANDROID_SUPPORT (2.X with WEXT-based) -HAS_ANDROID_SUPPORT=n - -#HAS_IFUP_IN_PROBE_SUPPORT -HAS_IFUP_IN_PROBE_SUPPORT=n - - -#ifdef DOT11W_PMF_SUPPORT -#Support for dot11w Protected Management Frame -HAS_DOT11W_PMF_SUPPORT=n -#endif // DOT11W_PMF_SUPPORT // - -#ifdef ANT_DIVERSITY_SUPPORT -#Support Antenna Diversity -HAS_ANTENNA_DIVERSITY_SUPPORT=n -#endif // ANT_DIVERSITY_SUPPORT // - -#ifdef TXRX_SW_ANTDIV_SUPPORT -#Support TXRX SW Antenna Diversity -HAS_TXRX_SW_ANTDIV_SUPPORT=n -#endif // TXRX_SW_ANTDIV_SUPPORT // - -#Client support WDS function -HAS_CLIENT_WDS_SUPPORT=n - -#Support for Bridge Fast Path & Bridge Fast Path function open to other module -HAS_BGFP_SUPPORT=n -HAS_BGFP_OPEN_SUPPORT=n - -# Support HOSTAPD function -HAS_HOSTAPD_SUPPORT=n - -#Support GreenAP function -HAS_GREENAP_SUPPORT=n - -#Support cfg80211 function with Linux Only. -#Please make sure insmod the cfg80211.ko before our driver, -#our driver references to its symbol. -HAS_CFG80211_SUPPORT=y -#smooth the scan signal for cfg80211 based driver -HAS_CFG80211_SCAN_SIGNAL_AVG_SUPPORT=n -#control two STA using wpa_supplicant -HAS_CFG80211_MULTI_STA_SUPPORT=n -#Cfg80211-based P2P Support -HAS_CFG80211_P2P_SUPPORT=y -#Cfg80211-based P2P Mode Selection (must one be chosen) -HAS_CFG80211_P2P_CONCURRENT_DEVICE=y -HAS_CFG80211_P2P_SINGLE_DEVICE=n -HAS_CFG80211_P2P_STATIC_CONCURRENT_DEVICE=n - -HAS_CFG80211_P2P_MULTI_CHAN_SUPPORT=n - -#Cfg80211-based TDLS support -HAS_CFG80211_TDLS_SUPPORT=n -#For android wifi priv-lib (cfg80211_based wpa_supplicant cmd expansion) -HAS_CFG80211_ANDROID_PRIV_LIB_SUPPORT=n - -#Support RFKILL hardware block/unblock LINUX-only function -HAS_RFKILL_HW_SUPPORT=n - -#ifdef EASY_CONFIG_SETUP -HAS_EASY_CONFIG_SETUP_SUPPORT=n -#endif // EASY_CONFIG_SETUP // - -#ifdef MT76XX_BT_COEXISTENCE_SUPPORT -HAS_MT76XX_BT_COEXISTENCE_SUPPORT=n -#endif // MT76XX_BT_COEXISTENCE_SUPPORT // - -#ifdef MT7636_BT_COEXISTENCE_SUPPORT -HAS_MT7636_BT_COEXISTENCE_SUPPORT=n -#endif // MT76XX_BT_COEXISTENCE_SUPPORT // - -HAS_APCLI_WPA_SUPPLICANT=n - -HAS_RTMP_FLASH_SUPPORT=n - -#ifdef OS_ABL_FUNC_SUPPORT -ifeq ($(OSABL),YES) -HAS_OSABL_FUNC_SUPPORT=y -HAS_OSABL_OS_PCI_SUPPORT=y -HAS_OSABL_OS_USB_SUPPORT=y -HAS_OSABL_OS_RBUS_SUPPORT=n -HAS_OSABL_OS_AP_SUPPORT=y -HAS_OSABL_OS_STA_SUPPORT=y -endif -#endif // OS_ABL_FUNC_SUPPORT // - -#ifdef LED_CONTROL_SUPPORT -HAS_LED_CONTROL_SUPPORT=n -#endif // LED_CONTROL_SUPPORT // - -#Support WIDI feature -#Must enable HAS_WSC at the same time. -#ifdef WIDI_SUPPORT -HAS_WIDI_SUPPORT=n -HAS_INTEL_L2SD_TOGGLE_SCAN_SUPPORT=n -HAS_INTEL_WFD_SUPPORT=n -HAS_WFA_WFD_SUPPORT=n -#endif // HAS_WIDI_SUPPORT // - -#ifdef TXBF_SUPPORT -HAS_TXBF_SUPPORT=n -HAS_VHT_TXBF_SUPPORT=n -HAS_STA_ITXBF_SUPPORT=n -#endif // TXBF_SUPPORT // - -#ifdef STREAM_MODE_SUPPORT -HAS_STREAM_MODE_SUPPORT=n -#endif // STREAM_MODE_SUPPORT // - -#ifdef NEW_RATE_ADAPT_SUPPORT -HAS_NEW_RATE_ADAPT_SUPPORT=y -#endif // NEW_RATE_ADAPT_SUPPORT // - -#ifdef AGS_SUPPORT -HAS_RATE_ADAPT_AGS_SUPPORT=n -#endif // AGS_SUPPORT // - -#ifdef DPA_S -HAS_DPA_S_SUPPORT=n -#endif - -#ifdef DPA_T -HAS_DPA_T_SUPPORT=n -#endif - -#ifdef CONFIG_CSO_SUPPORT -#RT5572 RT5592 -HAS_CSO_SUPPORT=n -#endif - -#ifdef CONFIG_RX_CSO_SUPPORT -#MT7601 -HAS_RX_CSO_SUPPORT=n -#endif - -#ifdef CONFIG_TSO_SUPPORT -#RT6590 RT6570 -HAS_TSO_SUPPORT=n -#endif - -#ifdef WOW_SUPPORT -#HAS_WOW_SUPPORT: WOW function for old ralink chips -#HAS_NEW_WOW_SUPPORT: WOW function for 7601/7610/7662 -#HAS_MT_WOW_SUPPORT: WOW function for 7603/7636 -#HAS_WOW_IFDOWN_SUPPORT: Enter WOW mode while ifconfig interface down -HAS_7603_7636_WOW_SUPPORT=n -ifeq ($(HAS_7603_7636_WOW_SUPPORT),y) -HAS_WOW_SUPPORT=n -HAS_WOW_IFDOWN_SUPPORT=y -HAS_NEW_WOW_SUPPORT=n -HAS_MT_WOW_SUPPORT=y -endif -#endif - -#ifdef FW_DUMP_SUPPORT -HAS_FW_DUMP_SUPPORT=n -#endif - -#ifdef THERMAL_PROTECT_SUPPORT -HAS_THERMAL_PROTECT_SUPPORT=y -#endif - -#ifdef ANDES_FIRMWARE_SUPPORT -HAS_ANDES_FIRMWARE_SUPPORT=n -#endif - -#ifdef HDR_TRANS_SUPPORT -HAS_HDR_TRANS_SUPPORT=n -#endif - -#ifdef CONFIG_MULTI_CHANNEL -HAS_MULTI_CHANNEL=n -#endif /* CONFIG_MULTI_CHANNEL */ - -#ifdef MICROWAVE_OVEN_SUPPORT -HAS_MICROWAVE_OVEN_SUPPORT=n -#endif - -#ifdef MAC_REPEATER_SUPPORT -HAS_MAC_REPEATER_SUPPORT=n -#endif - -#ifdef CONFIG_SWITCH_CHANNEL_OFFLOAD -HAS_SWITCH_CHANNEL_OFFLOAD=n -#endif - -HAS_RESOURCE_PRE_ALLOC=n -HAS_RESOURCE_BOOT_ALLOC=n - -#ifdef CONFIG_FPGA_MODE -HAS_FPGA_MODE=n -#endif - -#ifdef CONFIG_DVT_MODE -HAS_DVT_MODE=n -#endif - -#ifdef CONFIG_SNIFFER_SUPPORT -HAS_SNIFFER_SUPPORT=n -#endif - -#ifdef CONFIG_HOTSPOT -HAS_HOTSPOT_SUPPORT=n -#endif - -#ifdef CONFIG_CALIBRATION_COLLECTION -HAS_CALIBRATION_COLLECTION_SUPPORT=y -#endif - -#ifdef CONFIG_CAL_FREE_IC_SUPPORT -HAS_CAL_FREE_IC_SUPPORT=y -#endif - -#ifdef CONFIG_FW_DEBUG -HAS_FW_DEBUG_SUPPORT=y -#endif - -#ifdef CONFIG_TRACE_SUPPORT -HAS_TRACE_SUPPORT=n -#endif - -#ifdef WIFI_REGION32_HIDDEN_SSID_SUPPORT -HAS_WIFI_REGION32_HIDDEN_SSID_SUPPORT=n -#endif // WIFI_REGION32_HIDDEN_SSID_SUPPORT // - -#ifdef UAPSD_SUPPORT -HAS_UAPSD_SUPPORT=y -#endif - -#ifdef MT_PS -HAS_MT_PS_SUPPORT=n -#endif - -# Assign specified profile path when insmod -HAS_PROFILE_DYN_SUPPORT=n - -#ifdef USB_IOT_WORKAROUND -# This workaround can fix IOT issue with some specific USB host controllers. -# On those host controllers, a USB packet is unexpectedly divided into 2 smaller -# packets. -HAS_USB_IOT_WORKAROUND2=n -#endif - -################################################# - -CC := $(CROSS_COMPILE)gcc -LD := $(CROSS_COMPILE)ld - -WFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs -WFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -DENHANCED_STAT_DISPLAY -WFLAGS += -DSYSTEM_LOG_SUPPORT -DRT28xx_MODE=$(RT28xx_MODE) -DCHIPSET=$(MODULE) -DRESOURCE_PRE_ALLOC -#WFLAGS += -DDBG_DIAGNOSE -DDBG_RX_MCS -DDBG_TX_MCS -#APsoc Specific -WFLAGS += -DCONFIG_RA_NAT_NONE -#end of /* APsoc Specific */ - -WFLAGS += -I$(RT28xx_DIR)/include -I$(RT28xx_EMBEDDED_DIR)/include - -#ifdef DPA_S -ifeq ($(HAS_DPA_S_SUPPORT),y) -WFLAGS += -DDPA_S -endif -#endif - -#ifdef DPA_T -ifeq ($(HAS_DPA_T_SUPPORT),y) -WFLAGS += -DDPA_T -endif -#endif - -#ifdef RELEASE_EXCLUDE -ifeq ($(HAS_GPL_ALGORITHM_SUPPORT),y) -WFLAGS += -DCRYPT_GPL_ALGORITHM -endif -#endif // RELEASE_EXCLUDE // - -ifeq ($(HAS_HE_SUPPORT),y) -WFLAGS += -DHE_SUPPORT -WFLAGS += -DIP_ASSEMBLY -endif - -ifeq ($(HAS_MULTI_INF),y) -WFLAGS += -DMULTI_INF_SUPPORT -endif - -ifeq ($(HAS_RTMP_FLASH_SUPPORT),y) -WFLAGS += -DRTMP_FLASH_SUPPORT -endif - -ifeq ($(HAS_STREAM_MODE_SUPPORT),y) -WFLAGS += -DSTREAM_MODE_SUPPORT -endif - -ifeq ($(HAS_SINGLE_SKU_SUPPORT),y) -WFLAGS += -DSINGLE_SKU -endif - -ifeq ($(HAS_SINGLE_SKU_V2_SUPPORT),y) -WFLAGS += -DSINGLE_SKU_V2 -endif - -ifeq ($(HAS_DOT11_VHT_SUPPORT),y) -WFLAGS += -DDOT11_VHT_AC -endif - -#ifdef ANDES_FIRMWARE_SUPPORT -ifeq ($(HAS_ANDES_FIRMWARE_SUPPORT),y) -WFLAGS += -DANDES_FIRMWARE_SUPPORT -endif -#endif /* ANDES_FIRMWARE_SUPPORT */ - -#ifdef HDR_TRANS_SUPPORT -ifeq ($(HAS_HDR_TRANS_SUPPORT),y) -WFLAGS += -DHDR_TRANS_SUPPORT -endif -#endif /* HDR_TRANS_SUPPORT */ - -#ifdef MAC_REPEATER_SUPPORT -ifeq ($(HAS_MAC_REPEATER_SUPPORT),y) -WFLAGS += -DMAC_REPEATER_SUPPORT -endif -#endif /* MAC_REPEATER_SUPPORT */ - -ifeq ($(HAS_THERMAL_PROTECT_SUPPORT),y) -WFLAGS += -DTHERMAL_PROTECT_SUPPORT -endif - -ifeq ($(HAS_ATE),y) -WFLAGS += -DCONFIG_ATE -WFLAGS += -DCONFIG_RT2880_ATE_CMD_NEW -WFLAGS += -I$(RT28xx_DIR)/ate/include - -ifeq ($(HAS_QA_SUPPORT),y) -WFLAGS += -DCONFIG_QA -endif - -endif - -ifeq ($(HAS_CAL_FREE_IC_SUPPORT),y) -WFLAGS += -DCAL_FREE_IC_SUPPORT -endif - -#ifdef UAPSD_SUPPORT -ifeq ($(HAS_UAPSD_SUPPORT),y) -WFLAGS += -DUAPSD_SUPPORT -endif -#endif - -ifeq ($(HAS_MT_PS_SUPPORT),y) -WFLAGS += -DMT_PS -endif - -ifeq ($(HAS_FW_DUMP_SUPPORT),y) -WFLAGS += -DFW_DUMP_SUPPORT -endif - -ifeq ($(HAS_USB_IOT_WORKAROUND2),y) -WFLAGS += -DUSB_IOT_WORKAROUND2 -endif - -############################################################################### -# -# config for AP mode -# -############################################################################### - -#ifdef CONFIG_AP_SUPPORT - -ifeq ($(RT28xx_MODE),AP) -WFLAGS += -DCONFIG_AP_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -WFLAGS += -DDBG -ifeq ($(HAS_APCLI_WPA_SUPPLICANT),y) -WFLAGS += -DApCli_WPA_SUPPLICANT_SUPPORT -endif - -ifeq ($(HAS_HOSTAPD_SUPPORT),y) -WFLAGS += -DHOSTAPD_SUPPORT -endif - -#ifdef RSSI_FEEDBACK -ifeq ($(HAS_RSSI_FEEDBACK),y) -WFLAGS += -DRSSI_FEEDBACK -endif -#endif // RSSI_FEEDBACK // - -#ifdef GEMTEK_ATE -ifeq ($(RELEASE), DPB) -WFLAGS += -DGEMTEK_ATE -endif -#endif // GEMTEK_ATE // - -#ifdef NINTENDO_AP -ifeq ($(HAS_NINTENDO),y) -WFLAGS += -DNINTENDO_AP -endif -#endif // NINTENDO_AP // - -#ifdef WSC_INCLUDED -ifeq ($(HAS_WSC),y) -WFLAGS += -DWSC_AP_SUPPORT - -ifeq ($(HAS_WSC_V2),y) -WFLAGS += -DWSC_V2_SUPPORT -endif -ifeq ($(HAS_WSC_LED),y) -WFLAGS += -DWSC_LED_SUPPORT -endif -ifeq ($(HAS_WSC_NFC),y) -WFLAGS += -DWSC_NFC_SUPPORT -endif -endif -#endif // WSC_INCLUDED // - -#ifdef EASY_CONFIG_SETUP -ifeq ($(HAS_EASY_CONFIG_SETUP_SUPPORT),y) -WFLAGS += -DEASY_CONFIG_SETUP -DWAC_SUPPORT -endif -#endif // EASY_CONFIG_SETUP // - -#ifdef WDS_SUPPORT -ifeq ($(HAS_WDS),y) -WFLAGS += -DWDS_SUPPORT -endif -#endif // WDS_SUPPORT // - -#ifdef APCLI_SUPPORT -ifeq ($(HAS_APCLI),y) -WFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT #-DAPCLI_AUTO_CONNECT_SUPPORT -#ifeq ($(HAS_ETH_CONVERT_SUPPORT), y) -#WFLAGS += -DETH_CONVERT_SUPPORT -#endif -endif -#endif // APCLI_SUPPORT // - -ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y) -WFLAGS += -DIGMP_SNOOP_SUPPORT -endif - -ifeq ($(HAS_CS_SUPPORT),y) -WFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y) -WFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifneq ($(findstring 2860,$(CHIPSET)),) -ifeq ($(HAS_MSI_SUPPORT),y) -WFLAGS += -DPCI_MSI_SUPPORT -endif -endif - -#ifdef WMM_ACM_SUPPORT -ifeq ($(HAS_WMM_ACM_SUPPORT),y) -WFLAGS += -DWMM_ACM_SUPPORT -endif -#endif // WMM_ACM_SUPPORT // - -ifeq ($(HAS_QOS_DLS_SUPPORT),y) -WFLAGS += -DQOS_DLS_SUPPORT -endif - -ifeq ($(HAS_SNMP_SUPPORT),y) -WFLAGS += -DSNMP_SUPPORT -endif - -#ifdef DOT11_N_SUPPORT -ifeq ($(HAS_DOT11_N_SUPPORT),y) -WFLAGS += -DDOT11_N_SUPPORT - -#ifdef DOT11N_DRAFT3 -ifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y) -WFLAGS += -DDOT11N_DRAFT3 -endif -#endif // DOT11N_DRAFT3 // - -#ifdef TXBF_SUPPORT -ifeq ($(HAS_TXBF_SUPPORT),y) -WFLAGS += -DTXBF_SUPPORT -endif - -ifeq ($(HAS_VHT_TXBF_SUPPORT),y) -WFLAGS += -DVHT_TXBF_SUPPORT -endif - -ifeq ($(HAS_STA_ITXBF_SUPPORT), y) -WFLAGS += -DSTA_ITXBF_SUPPORT -endif -#endif // TXBF_SUPPORT // - -#ifdef NEW_RATE_ADAPT_SUPPORT -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif -#endif // NEW_RATE_ADAPT_SUPPORT // - -#ifdef AGS_SUPPORT -ifeq ($(HAS_RATE_ADAPT_AGS_SUPPORT),y) -WFLAGS += -DAGS_SUPPORT -endif -#endif // AGS_SUPPORT // - -ifeq ($(HAS_GREENAP_SUPPORT),y) -WFLAGS += -DGREENAP_SUPPORT -endif - -endif -#endif // DOT11_N_SUPPORT // - -ifeq ($(HAS_AUTO_CH_SELECT_ENHANCE),y) -WFLAGS += -DAUTO_CH_SELECT_ENHANCE -endif - -ifeq ($(HAS_STATS_COUNT),y) -WFLAGS += -DSTATS_COUNT_SUPPORT -endif - -ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y) -WFLAGS += -DTSSI_ANTENNA_VARIATION -endif - -ifeq ($(HAS_USB_BULK_BUF_ALIGMENT),y) -WFLAGS += -DUSB_BULK_BUF_ALIGMENT -endif - -ifeq ($(HAS_CFG80211_SUPPORT),y) -WFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST -DWPA_SUPPLICANT_SUPPORT -ifeq ($(HAS_RFKILL_HW_SUPPORT),y) -WFLAGS += -DRFKILL_HW_SUPPORT -endif -ifeq ($(HAS_CFG80211_SCAN_SIGNAL_AVG_SUPPORT),y) -WFLAGS += -DCFG80211_SCAN_SIGNAL_AVG -endif -ifeq ($(HAS_CFG80211_P2P_SUPPORT),y) -WFLAGS += -DRT_CFG80211_P2P_SUPPORT -WFLAGS += -DCONFIG_AP_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DAP_SCAN_SUPPORT -WFLAGS += -DAPCLI_SUPPORT -ifeq ($(HAS_CFG80211_P2P_SINGLE_DEVICE),y) -WFLAGS += -DRT_CFG80211_P2P_SINGLE_DEVICE -else -ifeq ($(HAS_CFG80211_P2P_STATIC_CONCURRENT_DEVICE),y) -WFLAGS += -DRT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE -else -WFLAGS += -DRT_CFG80211_P2P_CONCURRENT_DEVICE -ifeq ($(HAS_CFG80211_P2P_MULTI_CHAN_SUPPORT),y) -WFLAGS += -DMULTI_WMM_SUPPORT -DCONFIG_MULTI_CHANNEL -DRT_CFG80211_P2P_MULTI_CHAN_SUPPORT -endif -endif -endif -endif -ifeq ($(HAS_CFG80211_ANDROID_PRIV_LIB_SUPPORT),y) -WFLAGS += -DRT_RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT -endif -ifeq ($(HAS_CFG80211_TDLS_SUPPORT),y) -WFLAGS += -DCFG_TDLS_SUPPORT -DUAPSD_SUPPORT -endif -endif - -ifeq ($(OSABL),YES) -WFLAGS += -DOS_ABL_SUPPORT -ifeq ($(HAS_OSABL_FUNC_SUPPORT),y) -WFLAGS += -DOS_ABL_FUNC_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_PCI_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_USB_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_USB_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_RBUS_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_AP_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_AP_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_STA_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_STA_SUPPORT -endif -endif - -#ifdef ANT_DIVERSITY_SUPPORT -ifeq ($(HAS_ANTENNA_DIVERSITY_SUPPORT),y) -WFLAGS += -DANT_DIVERSITY_SUPPORT -endif -#endif // ANT_DIVERSITY_SUPPORT // - -#ifdef TXRX_SW_ANTDIV_SUPPORT -ifeq ($(HAS_TXRX_SW_ANTDIV_SUPPORT),y) -WFLAGS += -DTXRX_SW_ANTDIV_SUPPORT -endif -#endif // TXRX_SW_ANTDIV_SUPPORT // - -endif #// endif of RT2860_MODE == AP // -#endif // CONFIG_AP_SUPPORT // - -######################################################## -# -# config for STA mode -# -######################################################## - -#ifdef CONFIG_STA_SUPPORT - -ifeq ($(RT28xx_MODE),STA) -WFLAGS += -DCONFIG_STA_SUPPORT -DSCAN_SUPPORT -DDBG -ifeq ($(HAS_MT76XX_BT_COEXISTENCE_SUPPORT),y) -WFLAGS += -DMT76XX_BTCOEX_SUPPORT -endif - -ifeq ($(HAS_MT7636_BT_COEXISTENCE_SUPPORT),y) -WFLAGS += -DMT7636_BTCOEX -endif - -#ifdef XLINK_SUPPORT -ifeq ($(HAS_XLINK),y) -WFLAGS += -DXLINK_SUPPORT -endif -#endif // XLINK_SUPPORT // - -#ifdef ADHOC_WPA2PSK_SUPPORT -WFLAGS += -DADHOC_WPA2PSK_SUPPORT -#endif // ADHOC_WPA2PSK_SUPPORT // - -#ifdef WPA_SUPPLICANT_SUPPORT -ifeq ($(HAS_WPA_SUPPLICANT),y) -WFLAGS += -DWPA_SUPPLICANT_SUPPORT -#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT -ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y) -WFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT -endif -#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // -endif -#endif // WPA_SUPPLICANT_SUPPORT // - -#ifdef WSC_INCLUDED -ifeq ($(HAS_WSC),y) -WFLAGS += -DWSC_STA_SUPPORT -ifeq ($(HAS_WSC_V2),y) -WFLAGS += -DWSC_V2_SUPPORT -endif -ifeq ($(HAS_WSC_LED),y) -WFLAGS += -DWSC_LED_SUPPORT -endif -ifeq ($(HAS_IWSC_SUPPORT),y) -WFLAGS += -DIWSC_SUPPORT -endif -endif -#endif // WSC_INCLUDED // - -#ifdef STA_EASY_CONFIG_SETUP -ifeq ($(HAS_WSC),y) -ifeq ($(HAS_EASY_CONFIG_SETUP_SUPPORT),y) -WFLAGS += -DEASY_CONFIG_SETUP -DSTA_EASY_CONFIG_SETUP -DWAC_SUPPORT -endif -endif -#endif // STA_EASY_CONFIG_SETUP // - -#ifdef ETH_CONVERT_SUPPORT -ifeq ($(HAS_ETH_CONVERT_SUPPORT), y) -WFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT -endif -#endif // ETH_CONVERT_SUPPORT // - -#ifdef WMM_ACM_SUPPORT -ifeq ($(HAS_WMM_ACM_SUPPORT),y) -WFLAGS += -DWMM_ACM_SUPPORT -endif -#endif // WMM_ACM_SUPPORT // - -ifeq ($(HAS_SNMP_SUPPORT),y) -WFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(HAS_QOS_DLS_SUPPORT),y) -WFLAGS += -DQOS_DLS_SUPPORT -endif - -#ifdef DOT11_N_SUPPORT -ifeq ($(HAS_DOT11_N_SUPPORT),y) -WFLAGS += -DDOT11_N_SUPPORT - -#ifdef DOT11N_DRAFT3 -ifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y) -WFLAGS += -DDOT11N_DRAFT3 -endif -#endif // DOT11N_DRAFT3 // - -#ifdef TXBF_SUPPORT -ifeq ($(HAS_TXBF_SUPPORT),y) -WFLAGS += -DTXBF_SUPPORT -endif - -ifeq ($(HAS_VHT_TXBF_SUPPORT),y) -WFLAGS += -DVHT_TXBF_SUPPORT -endif - -ifeq ($(HAS_STA_ITXBF_SUPPORT), y) -WFLAGS += -DSTA_ITXBF_SUPPORT -endif -#endif // TXBF_SUPPORT // - -#ifdef NEW_RATE_ADAPT_SUPPORT -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif -#endif // NEW_RATE_ADAPT_SUPPORT // - -endif -#endif // DOT11_N_SUPPORT // - -#ifdef DOT11Z_TDLS_SUPPORT -ifeq ($(HAS_DOT11Z_TDLS_SUPPORT),y) -WFLAGS += -DDOT11Z_TDLS_SUPPORT -DUAPSD_SUPPORT -endif -#endif // DOT11Z_TDLS_SUPPORT // - -ifeq ($(HAS_WFD_SUPPORT),y) -HAS_P2P_SUPPORT=y -HAS_P2P_ODD_MAC_ADJUST=y -HAS_P2P_SPECIFIC_WIRELESS_EVENT=y -WFLAGS += -DWFD_SUPPORT -endif - -ifeq ($(HAS_PROFILE_DYN_SUPPORT),y) -WFLAGS += -DPROFILE_PATH_DYNAMIC -endif - -#ifdef P2P_SUPPORT -ifeq ($(HAS_P2P_SUPPORT),y) -WFLAGS += -DP2P_SUPPORT -DAPCLI_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DP2P_APCLI_SUPPORT -DCONFIG_AP_SUPPORT -DCONFIG_APSTA_MIXED_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DWSC_AP_SUPPORT -DWSC_STA_SUPPORT -endif - -ifeq ($(HAS_P2P_ODD_MAC_ADJUST),y) -WFLAGS += -DP2P_ODD_MAC_ADJUST -endif - -ifeq ($(HAS_P2P_SPECIFIC_WIRELESS_EVENT),y) -WFLAGS += -DRT_P2P_SPECIFIC_WIRELESS_EVENT -endif -#endif // P2P_SUPPORT // - -ifeq ($(HAS_CS_SUPPORT),y) -WFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(HAS_STATS_COUNT),y) -WFLAGS += -DSTATS_COUNT_SUPPORT -endif - -ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y) -WFLAGS += -DTSSI_ANTENNA_VARIATION -endif - -ifeq ($(HAS_ANDROID_SUPPORT),y) -WFLAGS += -DANDROID_SUPPORT -endif - -ifeq ($(HAS_IFUP_IN_PROBE_SUPPORT),y) -WFLAGS += -DIFUP_IN_PROBE -endif - -ifeq ($(HAS_USB_SUPPORT_SELECTIVE_SUSPEND),y) -WFLAGS += -DUSB_SUPPORT_SELECTIVE_SUSPEND -endif - -ifeq ($(HAS_USB_FIRMWARE_MULTIBYTE_WRITE),y) -WFLAGS += -DUSB_FIRMWARE_MULTIBYTE_WRITE -DMULTIWRITE_BYTES=4 -endif - -ifeq ($(HAS_CFG80211_SUPPORT),y) -WFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST -DWPA_SUPPLICANT_SUPPORT -ifeq ($(HAS_RFKILL_HW_SUPPORT),y) -WFLAGS += -DRFKILL_HW_SUPPORT -endif -ifeq ($(HAS_CFG80211_SCAN_SIGNAL_AVG_SUPPORT),y) -WFLAGS += -DCFG80211_SCAN_SIGNAL_AVG -endif -ifeq ($(HAS_CFG80211_MULTI_STA_SUPPORT),y) -WFLAGS += -DCFG80211_MULTI_STA -DCONFIG_AP_SUPPORT -DAPCLI_SUPPORT -WFLAGS += -DMBSS_SUPPORT -DAP_SCAN_SUPPORT -DMULTI_WMM_SUPPORT -endif - -ifeq ($(HAS_CFG80211_MULTI_STA_SUPPORT),y) -WFLAGS += -DCFG80211_MULTI_STA -DCONFIG_AP_SUPPORT -DAPCLI_SUPPORT -WFLAGS += -DMBSS_SUPPORT -DAP_SCAN_SUPPORT -DMULTI_WMM_SUPPORT -endif - -ifeq ($(HAS_CFG80211_P2P_SUPPORT),y) -WFLAGS += -DRT_CFG80211_P2P_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DAP_SCAN_SUPPORT -WFLAGS += -DCONFIG_AP_SUPPORT -DAPCLI_SUPPORT -ifeq ($(HAS_CFG80211_P2P_SINGLE_DEVICE),y) -WFLAGS += -DRT_CFG80211_P2P_SINGLE_DEVICE -else -ifeq ($(HAS_CFG80211_P2P_STATIC_CONCURRENT_DEVICE),y) -WFLAGS += -DRT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE -else -WFLAGS += -DRT_CFG80211_P2P_CONCURRENT_DEVICE -ifeq ($(HAS_CFG80211_P2P_MULTI_CHAN_SUPPORT),y) -WFLAGS += -DMULTI_WMM_SUPPORT -DCONFIG_MULTI_CHANNEL -DRT_CFG80211_P2P_MULTI_CHAN_SUPPORT -endif #HAS_CFG80211_P2P_MULTI_CHAN_SUPPORT -endif #HAS_CFG80211_P2P_STATIC_CONCURRENT_DEVICE -endif #HAS_CFG80211_P2P_SINGLE_DEVICE -endif #HAS_CFG80211_P2P_SUPPORT -ifeq ($(HAS_CFG80211_ANDROID_PRIV_LIB_SUPPORT),y) -WFLAGS += -DRT_RT_CFG80211_ANDROID_PRIV_LIB_SUPPORT -endif #HAS_CFG80211_ANDROID_PRIV_LIB_SUPPORT -ifeq ($(HAS_CFG80211_TDLS_SUPPORT),y) -WFLAGS += -DCFG_TDLS_SUPPORT -DUAPSD_SUPPORT -endif -endif - -ifeq ($(OSABL),YES) -WFLAGS += -DOS_ABL_SUPPORT -ifeq ($(HAS_OSABL_FUNC_SUPPORT),y) -WFLAGS += -DOS_ABL_FUNC_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_PCI_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_USB_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_USB_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_RBUS_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_AP_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_AP_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_STA_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_STA_SUPPORT -endif -endif - -#ifdef ANT_DIVERSITY_SUPPORT -ifeq ($(HAS_ANTENNA_DIVERSITY_SUPPORT),y) -WFLAGS += -DANT_DIVERSITY_SUPPORT -endif -#endif // ANT_DIVERSITY_SUPPORT // - -#ifdef TXRX_SW_ANTDIV_SUPPORT -ifeq ($(HAS_TXRX_SW_ANTDIV_SUPPORT),y) -WFLAGS += -DTXRX_SW_ANTDIV_SUPPORT -endif -#endif // TXRX_SW_ANTDIV_SUPPORT // - -ifeq ($(HAS_WIDI_SUPPORT),y) -WFLAGS += -DWIDI_SUPPORT - -ifeq ($(HAS_INTEL_L2SD_TOGGLE_SCAN_SUPPORT),y) -WFLAGS += -DINTEL_L2SD_TOGGLE_SCAN_SUPPORT -endif - -ifeq ($(HAS_P2P_SUPPORT),y) -ifeq ($(HAS_INTEL_WFD_SUPPORT),y) -WFLAGS += -DINTEL_WFD_SUPPORT -endif - -ifeq ($(HAS_WFA_WFD_SUPPORT),y) -WFLAGS += -DWFA_WFD_SUPPORT -endif -endif - -endif - -#ifdef WOW_SUPPORT -ifeq ($(HAS_WOW_SUPPORT),y) -WFLAGS += -DWOW_SUPPORT -endif -#endif // WOW_SUPPORT // - -#ifdef WOW_IFDOWN_SUPPORT -ifeq ($(HAS_WOW_IFDOWN_SUPPORT),y) -WFLAGS += -DWOW_IFDOWN_SUPPORT -endif -#endif // WOW_IFDOWN_SUPPORT // - -ifeq ($(HAS_NEW_WOW_SUPPORT),y) -WFLAGS += -DNEW_WOW_SUPPORT -endif - -ifeq ($(HAS_MT_WOW_SUPPORT),y) -WFLAGS += -DMT_WOW_SUPPORT -endif - -endif -# endif of ifeq ($(RT28xx_MODE),STA) -#endif // CONFIG_STA_SUPPORT // - -########################################################### -# -# config for APSTA -# -########################################################### - -#ifdef CONFIG_APSTA_SUPPORT - -ifeq ($(RT28xx_MODE),APSTA) -WFLAGS += -DCONFIG_AP_SUPPORT -DCONFIG_STA_SUPPORT -DCONFIG_APSTA_MIXED_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DDBG - -#ifdef NINTENDO_AP -ifeq ($(HAS_NINTENDO),y) -WFLAGS += -DNINTENDO_AP -endif -#endif // NINTENDO_AP // - -#ifdef WSC_INCLUDED -ifeq ($(HAS_WSC),y) -WFLAGS += -DWSC_AP_SUPPORT -DWSC_STA_SUPPORT -endif -#endif // WSC_INCLUDED // - -#ifdef WDS_SUPPORT -ifeq ($(HAS_WDS),y) -WFLAGS += -DWDS_SUPPORT -endif -#endif // WDS_SUPPORT // - -#ifdef APCLI_SUPPORT -ifeq ($(HAS_APCLI),y) -WFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -endif -#endif // APCLI_SUPPORT // - -ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y) -WFLAGS += -DIGMP_SNOOP_SUPPORT -endif - -ifeq ($(HAS_CS_SUPPORT),y) -WFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y) -WFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(HAS_QOS_DLS_SUPPORT),y) -WFLAGS += -DQOS_DLS_SUPPORT -endif - -#ifdef WPA_SUPPLICANT_SUPPORT -ifeq ($(HAS_WPA_SUPPLICANT),y) -WFLAGS += -DWPA_SUPPLICANT_SUPPORT -#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT -ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y) -WFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT -endif -#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // -endif -#endif // WPA_SUPPLICANT_SUPPORT // - -#ifdef ETH_CONVERT_SUPPORT -ifeq ($(HAS_ETH_CONVERT_SUPPORT), y) -WFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT -endif -#endif // ETH_CONVERT_SUPPORT // - -#ifdef DOT11_N_SUPPORT -ifeq ($(HAS_DOT11_N_SUPPORT),y) -WFLAGS += -DDOT11_N_SUPPORT -endif - -#ifdef TXBF_SUPPORT -ifeq ($(HAS_TXBF_SUPPORT),y) -WFLAGS += -DTXBF_SUPPORT -endif - -ifeq ($(HAS_VHT_TXBF_SUPPORT),y) -WFLAGS += -DVHT_TXBF_SUPPORT -endif - -ifeq ($(HAS_STA_ITXBF_SUPPORT), y) -WFLAGS += -DSTA_ITXBF_SUPPORT -endif -#endif // TXBF_SUPPORT // - -#ifdef NEW_RATE_ADAPT_SUPPORT -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif -#endif // NEW_RATE_ADAPT_SUPPORT // - -#endif // DOT11_N_SUPPORT // - -ifeq ($(HAS_CS_SUPPORT),y) -WFLAGS += -DCARRIER_DETECTION_SUPPORT -endif - -ifeq ($(HAS_STATS_COUNT),y) -WFLAGS += -DSTATS_COUNT_SUPPORT -endif - -ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y) -WFLAGS += -DTSSI_ANTENNA_VARIATION -endif - -ifeq ($(HAS_CFG80211_SUPPORT),y) -WFLAGS += -DRT_CFG80211_SUPPORT -DWPA_SUPPLICANT_SUPPORT -ifeq ($(HAS_RFKILL_HW_SUPPORT),y) -WFLAGS += -DRFKILL_HW_SUPPORT -endif -ifeq ($(HAS_CFG80211_SCAN_SIGNAL_AVG_SUPPORT),y) -WFLAGS += -DCFG80211_SCAN_SIGNAL_AVG -endif -endif - -ifeq ($(OSABL),YES) -WFLAGS += -DOS_ABL_SUPPORT -ifeq ($(HAS_OSABL_FUNC_SUPPORT),y) -WFLAGS += -DOS_ABL_FUNC_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_PCI_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_USB_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_USB_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_RBUS_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_AP_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_AP_SUPPORT -endif -ifeq ($(HAS_OSABL_OS_STA_SUPPORT),y) -WFLAGS += -DOS_ABL_OS_STA_SUPPORT -endif -endif - -ifeq ($(HAS_P2P_SUPPORT),y) -WFLAGS += -DP2P_SUPPORT -WFLAGS += -DAPCLI_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DP2P_APCLI_SUPPORT -endif - -endif -# endif of ifeq ($(RT28xx_MODE),APSTA) -#endif // CONFIG_APSTA_SUPPORT // - - -########################################################## -# -# Common compiler flag -# -########################################################## - -#ifdef RELEASE_EXCLUDE -#Remove internal debug code when offical release -WFLAGS += -DRELEASE_EXCLUDE -#endif // RELEASE_EXCLUDE // - -#ifdef MESH_SUPPORT -ifeq ($(HAS_MESH_SUPPORT),y) -WFLAGS += -DMESH_SUPPORT -DINTEL_CMPC -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -endif -#endif // MESH_SUPPORT // - -#ifdef DOT11R_FT_SUPPORT -ifeq ($(HAS_DOT11R_FT_SUPPORT),y) -WFLAGS += -DDOT11R_FT_SUPPORT -endif -#endif // DOT11R_FT_SUPPORT // - -#ifdef DOT11K_RRM_SUPPORT -ifeq ($(HAS_DOT11K_RRM_SUPPORT),y) -WFLAGS += -DDOT11K_RRM_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -endif -#endif // DOT11K_RRM_SUPPORT // - -#ifdef DOT11V_WNM_SUPPORT -ifeq ($(HAS_DOT11V_WNM_SUPPORT),y) -WFLAGS += -DDOT11V_WNM_SUPPORT -endif -#endif // DOT11V_WNM_SUPPORT // - -ifeq ($(HAS_EXT_BUILD_CHANNEL_LIST),y) -WFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(HAS_IDS_SUPPORT),y) -WFLAGS += -DIDS_SUPPORT -endif - -#ifdef WAPI_SUPPORT -ifeq ($(HAS_WAPI_SUPPORT),y) -WFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT -DEXPORT_SYMTAB -endif -#endif // WAPI_SUPPORT // - -ifeq ($(OSABL),YES) -WFLAGS += -DEXPORT_SYMTAB -endif - -ifeq ($(HAS_CLIENT_WDS_SUPPORT),y) -WFLAGS += -DCLIENT_WDS -endif - -ifeq ($(HAS_BGFP_SUPPORT),y) -WFLAGS += -DBG_FT_SUPPORT -endif - -ifeq ($(HAS_BGFP_OPEN_SUPPORT),y) -WFLAGS += -DBG_FT_OPEN_SUPPORT -endif - -#ifdef DOT11W_PMF_SUPPORT -ifeq ($(HAS_DOT11W_PMF_SUPPORT),y) -WFLAGS += -DDOT11W_PMF_SUPPORT -DSOFT_ENCRYPT -endif -#endif // DOT11W_PMF_SUPPORT // - -#ifdef LED_CONTROL_SUPPORT -ifeq ($(HAS_LED_CONTROL_SUPPORT),y) -WFLAGS += -DLED_CONTROL_SUPPORT -endif -#endif // LED_CONTROL_SUPPORT // - -#ifdef CONFIG_HOTSPOT -ifeq ($(HAS_HOTSPOT_SUPPORT),y) -WFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -endif -#endif - -#ifdef CONFIG_MULTI_CHANNEL -ifeq ($(HAS_MULTI_CHANNEL),y) -WFLAGS += -DCONFIG_MULTI_CHANNEL -endif -#endif /* CONFIG_MULTI_CHANNEL */ - -#ifdef MICROWAVE_OVEN_SUPPORT -ifeq ($(HAS_MICROWAVE_OVEN_SUPPORT),y) -WFLAGS += -DMICROWAVE_OVEN_SUPPORT -endif -#endif - -#ifdef CONFIG_FPGA_MODE -ifeq ($(HAS_FPGA_MODE),y) -WFLAGS += -DCONFIG_FPGA_MODE -endif -#endif - -#ifdef CONFIG_DVT_MODE -ifeq ($(HAS_DVT_MODE),y) -WFLAGS += -DCONFIG_DVT_MODE -endif -#endif - -#ifdef CONFIG_SNIFFER_SUPPORT -ifeq ($(HAS_SNIFFER_SUPPORT),y) -WFLAGS += -DCONFIG_SNIFFER_SUPPORT -endif -#endif - -#ifdef CONFIG_CALIBRATION_COLLECTION -ifeq ($(HAS_CALIBRATION_COLLECTION_SUPPORT),y) -WFLAGS += -DCONFIG_CALIBRATION_COLLECTION -endif -#endif - -#ifdef CONFIG_TRACE_SUPPORT -ifeq ($(HAS_TRACE_SUPPORT),y) -WFLAGS += -DCONFIG_TRACE_SUPPORT -endif -#endif - -#ifdef HAS_FW_DEBUG_SUPPORT -ifeq ($(HAS_FW_DEBUG_SUPPORT),y) -WFLAGS += -DCONFIG_FW_DEBUG -endif -#endif - -#ifdef WIFI_REGION32_HIDDEN_SSID_SUPPORT -ifeq ($(HAS_WIFI_REGION32_HIDDEN_SSID_SUPPORT),y) -WFLAGS += -DWIFI_REGION32_HIDDEN_SSID_SUPPORT -endif -#endif // WIFI_REGION32_HIDDEN_SSID_SUPPORT // - -################################################# -# ChipSet specific definitions - OLD PCI Series -# -################################################# - -# 2860 -ifneq ($(findstring rt2860,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT2860 -DRT28xx -DA_BAND_SUPPORT -DCONFIG_M8051_SUPPORT -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 - -endif -## End of 2860 ## - -# 3090 -ifneq ($(findstring rt3090,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT3090 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_M8051_SUPPORT -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 -endif -## End of 3090 ## - -# 3062 -ifneq ($(findstring rt3062,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRT3062 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_M8051_SUPPORT -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 -endif -## End of 3062 ## - -# 3562 -ifneq ($(findstring rt3562,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRT3562 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_M8051_SUPPORT -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 -endif -## End of 3562 ## - -# 3593 -ifneq ($(findstring rt3593,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_PCI -DDOT11N_SS3_SUPPORT -DRT3593 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DNEW_MBSSID_MODE -DVCORECAL_SUPPORT -DCONFIG_M8051_SUPPORT -# WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 - -ifneq ($(findstring $(RT28xx_MODE),STA APSTA),) -WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif -endif -## End of 3593 ## - -# 3390 -ifneq ($(findstring rt3390,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT33xx -DRT3090 -DRT3390 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT -DCONFIG_M8051_SUPPORT -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 -endif -## End of 3390 ## - - -# 5390 -ifneq ($(findstring rt5390,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT33xx -DRT3090 -DRT3390 -DRT5390 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_FREQ_CALIBRATION_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION -DCONFIG_M8051_SUPPORT -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 - -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif -endif -## End of 5390 ## - - -# 5592 -ifneq ($(findstring rt5592,$(CHIPSET)),) -WFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT30xx -DRT5592\ - -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\ - -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT\ - -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION -DCONFIG_M8051_SUPPORT -DRT_RF - -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 -ifeq ($(HAS_CSO_SUPPORT), y) -WFLAGS += -DCONFIG_CSO_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),STA APSTA),) -WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif - -endif -## End of 5592 ## - - -# 3290 -ifneq ($(findstring rt3290,$(CHIPSET)),) -WFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_FREQ_CALIBRATION_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRT30xx -DRT3290 -DVCORECAL_SUPPORT -DCONFIG_M8051_SUPPORT -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 - -ifneq ($(findstring $(RT28xx_MODE),STA APSTA),) -WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -DPCIE_PS_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif -endif -## End of 3290 ## - - -################################################# -# ChipSet specific definitions - OLD USB Series -# -################################################# - -# 2870 -ifneq ($(findstring rt2870,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DCONFIG_M8051_SUPPORT -CHIPSET_DAT = 2870 -HAS_INF_USB=y -HAS_RTMP_MAC=y - -endif -## End of 2870 ## - -# 2070 -ifneq ($(findstring rt2070,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT3070 -DRT2070 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DCONFIG_M8051_SUPPORT -CHIPSET_DAT = 2870 -HAS_INF_USB=y -HAS_RTMP_MAC=y - -endif -## End of 2070 ## - -# 3070 -ifneq ($(findstring rt3070,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT3070 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_M8051_SUPPORT -CHIPSET_DAT = 2870 -HAS_INF_USB=y -HAS_RTMP_MAC=y - -ifneq ($(findstring $(RT28xx_MODE),AP),) -ifeq ($(HAS_CS_SUPPORT), y) -WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT -endif -endif - -endif -## End of 3070 ## - -# 3572 -ifneq ($(findstring rt3572,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRT3572 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT -CHIPSET_DAT = 2870 -HAS_INF_USB=y -HAS_RTMP_MAC=y - -ifneq ($(findstring $(RT28xx_MODE),AP),) -ifeq ($(HAS_CS_SUPPORT), y) -WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT -endif -endif - -endif -## End of 3572 ## - - -# 3370 -ifneq ($(findstring 3370,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT33xx -DRT3070 -DRT3370 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT -DCONFIG_M8051_SUPPORT -HAS_INF_USB=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2870 - -ifneq ($(findstring $(RT28xx_MODE),AP),) -ifeq ($(HAS_CS_SUPPORT), y) -WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT -endif -endif - -endif -## End of 3370 ## - - -# 3573 -ifneq ($(findstring rt3573,$(CHIPSET)),) -WFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT30xx -DRT35xx -DRT3593 -DRT3573\ - -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\ - -DA_BAND_SUPPORT -DDOT11N_SS3_SUPPORT \ - -DVCORECAL_SUPPORT -DNEW_MBSSID_MODE -DCONFIG_M8051_SUPPORT -#WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -HAS_INF_USB=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2870 - -ifneq ($(findstring $(RT28xx_MODE),STA APSTA),) -WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -ifeq ($(HAS_CS_SUPPORT), y) -WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT -endif -endif - -endif -## End of 3573 ## - - -# 5370 -ifneq ($(findstring rt5370,$(CHIPSET)),) -WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT33xx -DRT3070 -DRT3370 -DRT5370 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRTMP_FREQ_CALIBRATION_SUPPORT -DVCORECAL_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION -DCONFIG_M8051_SUPPORT -HAS_INF_USB=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2870 - -ifneq ($(findstring $(RT28xx_MODE),AP),) -ifeq ($(HAS_CS_SUPPORT), y) -WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT -endif -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif -endif -## End of 5370 ## - - -# 5572 -ifneq ($(findstring rt5572,$(CHIPSET)),) -WFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT30xx -DRT5572 -DRT5592\ - -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE\ - -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT\ - -DRTMP_TEMPERATURE_COMPENSATION -DCONFIG_M8051_SUPPORT -HAS_INF_USB=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2870 -ifeq ($(HAS_CSO_SUPPORT), y) -WFLAGS += -DCONFIG_CSO_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -ifeq ($(HAS_CS_SUPPORT), y) -WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT -endif -endif - -ifneq ($(findstring $(RT28xx_MODE),STA APSTA),) -WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif - -endif -## End of 5572 ## - - -################################################# -# ChipSet specific definitions - OLD RBUS Series -# -################################################# -# 2880 -ifneq ($(findstring rt2880,$(CHIPSET)),) -WFLAGS += -DRT2880 -DRT28xx -DRTMP_MAC_PCI -DCONFIG_RALINK_RT2880_MP -DRTMP_RBUS_SUPPORT -DMERGE_ARCH_TEAM -DA_BAND_SUPPORT -DCONFIG_SWMCU_SUPPORT -HAS_INF_RBUS=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -endif -## End of 2880 ## - - -# 3052 -ifneq ($(findstring rt3052,$(CHIPSET)),) -WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT -DCONFIG_SWMCU_SUPPORT -DVCORECAL_SUPPORT -HAS_INF_RBUS=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2870 -endif -## End of 3052 ## - -# 3352 -ifneq ($(findstring rt3352,$(CHIPSET)),) -WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_SWMCU_SUPPORT -DRTMP_INTERNAL_TX_ALC -DNEW_MBSSID_MODE -HAS_INF_RBUS=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif -endif -## End of 3352 ## - -# 5350 -ifneq ($(findstring rt5350,$(CHIPSET)),) -WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT5350 -DRT305x -DRT3050 -DRT3350 -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_SWMCU_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRTMP_FREQ_CALIBRATION_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -HAS_INF_RBUS=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -CHIPSET_DAT = 2860 -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif -endif -## End of 5350 ## - - -################################################# -# ChipSet specific definitions - OLD Multiple Card Series -# -################################################# -ifeq ($(CHIPSET),USB) -#3572 -WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DSPECIFIC_VCORECAL_SUPPORT -#3370 -WFLAGS += -DRT33xx -DRT3070 -DRT3370 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_INTERNAL_TX_ALC -HAS_INF_USB=y - -CHIPSET_DAT = 2870 -endif - - -ifeq ($(CHIPSET),PCI) -#3562 -WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DSPECIFIC_VCORECAL_SUPPORT -#3390 -WFLAGS +=-DRT33xx -DRT3090 -DRT3390 -DRTMP_INTERNAL_TX_ALC - -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -endif - - -ifeq ($(CHIPSET),RBUS) -WFLAGS += -DMERGE_ARCH_TEAM -DCONFIG_SWMCU_SUPPORT -DCONFIG_RA_NAT_NONE -DRTMP_RBUS_SUPPORT -#5350, 3050, 3350, 3883 -WFLAGS +=-DRTMP_MAC_PCI -DRT305x -DRT5350 -DRT3050 -DRT3350 -DRT3883 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT - -ifneq ($(findstring $(RT28xx_MODE),AP),) -WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif -#WFLAGS += -DDBG_CTRL_SUPPORT -DINCLUDE_DEBUG_QUEUE -#WFLAGS += -DRANGE_EXTEND -DCFO_TRACK -DPRE_ANT_SWITCH - -HAS_INF_PCI=y -HAS_INF_RBUS=y -HAS_MAC_PCI=y -HAS_RTMP_MAC=y - -endif - - -################################################# -# ChipSet specific definitions - RLT Series -# -################################################# - -# 7601E -ifneq ($(findstring mt7601e,$(CHIPSET)),) -WFLAGS += -DMT7601E -DMT7601 -DRLT_MAC -DRLT_RF -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT -DVCORECAL_SUPPORT -DRTMP_EFUSE_SUPPORT -DhNEW_MBSSID_MODE -DRTMP_INTERNAL_TX_ALC -DCONFIG_ANDES_SUPPORT -DCONFIG_ANDES_BBP_RANDOM_WRITE_SUPPORT -#-DRTMP_FREQ_CALIBRATION_SUPPORT -ifneq ($(findstring $(RT28xx_MODE),AP),) -#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),STA APSTA),) -WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -endif -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RLT_MAC=y - -CHIPSET_DAT = 2860 -endif -## End of 7601E ## - -# 7601U -ifneq ($(findstring mt7601u,$(CHIPSET)),) -HAS_RTMP_BBP=y -HAS_RLT_MAC=y -HAS_RLT_RF=y -HAS_INF_USB=y -HAS_RLT_MAC=y - -WFLAGS += -DMT7601U -DMT7601 -WFLAGS += -DRLT_MAC -DRTMP_MAC_USB -DRTMP_BBP -DRLT_RF -DRTMP_RF_RW_SUPPORT -WFLAGS += -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DVCORECAL_SUPPORT -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE -DRTMP_INTERNAL_TX_ALC -DCONFIG_ANDES_SUPPORT -DCONFIG_ANDES_BBP_RANDOM_WRITE_SUPPORT -ifneq ($(findstring $(RT28xx_MODE),AP),) -#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif - -ifeq ($(HAS_RX_CSO_SUPPORT), y) -WFLAGS += -DCONFIG_RX_CSO_SUPPORT -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -else -WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -endif - -CHIPSET_DAT = 2870 -endif -## End of 7601U ## - - -# RT85582 -ifneq ($(findstring rt8592,$(CHIPSET)),) -WFLAGS += -DRT8592 -DRT65xx -DRLT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER -WFLAGS += -DRTMP_RF_RW_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT -WFLAGS += -DFIFO_EXT_SUPPORT -WFLAGS += -DRTMP_TEMPERATURE_COMPENSATION -ifneq ($(findstring $(RT28xx_MODE),AP),) -# TODO: shiang-6590, need to ask hardware about the memory base setting first!! -#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RLT_MAC=y - -CHIPSET_DAT = 2860 -endif -## End of RT85592 ## - - -# MT7650E -ifneq ($(or $(findstring mt7650e,$(CHIPSET))$(findstring mt7630e,$(CHIPSET)),$(findstring mt7610e,$(CHIPSET))),) -HAS_RLT_BBP=y -HAS_RLT_MAC=y -HAS_RLT_RF=y -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RLT_MAC=y - -WFLAGS += -DMT76x0 -DRT65xx -DRLT_MAC -DRLT_BBP -DRLT_RF -DRTMP_RF_RW_SUPPORT -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -WFLAGS += -DRX_DMA_SCATTER -DNEW_MBSSID_MODE -DRTMP_EFUSE_SUPPORT -DCONFIG_ANDES_SUPPORT -DENHANCE_NEW_MBSSID_MODE -#-DRTMP_FREQ_CALIBRATION_SUPPORT -DVCORECAL_SUPPORT -ifneq ($(findstring $(RT28xx_MODE),AP),) -#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif - -ifneq ($(findstring mt7650e,$(CHIPSET)),) -WFLAGS += -DMT7650 -endif - -ifneq ($(findstring mt7630e,$(CHIPSET)),) -WFLAGS += -DMT7630 -endif - -ifneq ($(findstring mt7610e,$(CHIPSET)),) -WFLAGS += -DMT7610 -endif - -CHIPSET_DAT = 2860 -endif -## End of MT7650E ## - - -# MT7650U -ifneq ($(or $(findstring mt7650u,$(CHIPSET)),$(findstring mt7630u,$(CHIPSET)),$(findstring mt7610u,$(CHIPSET))),) -HAS_RLT_BBP=y -HAS_RLT_MAC=y -HAS_RLT_RF=y -HAS_INF_USB=y -HAS_RLT_MAC=y -HAS_NEW_RATE_ADAPT_SUPPORT=y - -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -WFLAGS += -DMT76x0 -DRT65xx -DRLT_MAC -DRLT_BBP -DRLT_RF -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -WFLAGS += -DA_BAND_SUPPORT -DRX_DMA_SCATTER -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE -DCONFIG_ANDES_SUPPORT -WFLAGS += -DRTMP_RF_RW_SUPPORT - -ifneq ($(findstring mt7650u,$(CHIPSET)),) -WFLAGS += -DMT7650 -endif - -ifneq ($(findstring mt7630u,$(CHIPSET)),) -WFLAGS += -DMT7630 -endif - -ifneq ($(findstring mt7610u,$(CHIPSET)),) -WFLAGS += -DMT7610 -endif - -ifneq ($(findstring $(RT28xx_MODE),AP),) -#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT -endif - -ifeq ($(HAS_CSO_SUPPORT), y) -WFLAGS += -DCONFIG_CSO_SUPPORT -ifeq ($(HAS_TSO_SUPPORT), y) -WFLAGS += -DCONFIG_TSO_SUPPORT -DTX_PKT_SG -endif -endif - -endif -## End of MT7650U ## - - -# MT7662E -ifneq ($(or $(findstring mt7662e,$(CHIPSET)),$(findstring mt7612e,$(CHIPSET))),) -WFLAGS += -DMT76x2 -DRT65xx -DRLT_MAC -DRLT_BBP -DMT_RF -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER -DNEW_MBSSID_MODE -DRTMP_EFUSE_SUPPORT -DCONFIG_ANDES_SUPPORT -DENHANCE_NEW_MBSSID_MODE -DRTMP_RF_RW_SUPPORT -DDYNAMIC_VGA_SUPPORT -WFLAGS += -DRTMP_RF_RW_SUPPORT -HAS_NEW_RATE_ADAPT_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif -WFLAGS += -DFIFO_EXT_SUPPORT -HAS_RLT_BBP=y -HAS_RLT_MAC=y -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_RLT_MAC=y -HAS_MT_RF=y - -CHIPSET_DAT = 2860 - -ifneq ($(findstring mt7662e,$(CHIPSET)),) -WFLAGS += -DMT7662 -endif - -ifneq ($(findstring mt7662e,$(CHIPSET)),) -WFLAGS += -DMT7632 -endif - -ifneq ($(findstring mt7612e,$(CHIPSET)),) -WFLAGS += -DMT7612 -endif -endif -## End of MT7662E ## - - -# MT7662U -ifneq ($(or $(findstring mt7662u,$(CHIPSET)),$(findstring mt7612u,$(CHIPSET))),) -WFLAGS += -DMT76x2 -DRT65xx -DRLT_MAC -DRLT_BBP -DMT_RF -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE -DCONFIG_ANDES_SUPPORT -WFLAGS += -DRTMP_RF_RW_SUPPORT -DDYNAMIC_VGA_SUPPORT -HAS_NEW_RATE_ADAPT_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif -WFLAGS += -DFIFO_EXT_SUPPORT -HAS_RLT_BBP=y -HAS_RLT_MAC=y -HAS_INF_USB=y -HAS_RLT_MAC=y -HAS_MT_RF=y - -ifneq ($(findstring mt7662u,$(CHIPSET)),) -WFLAGS += -DMT7662 -endif - -ifneq ($(findstring mt7612u,$(CHIPSET)),) -WFLAGS += -DMT7612 -endif - -ifeq ($(HAS_CSO_SUPPORT), y) -WFLAGS += -DCONFIG_CSO_SUPPORT -DCONFIG_TSO_SUPPORT -endif - -CHIPSET_DAT = 2870 -endif -## End of 7662U ## - -################################################# -# ChipSet specific definitions - MT Series -# -################################################# - -# MT7636 -ifneq ($(findstring mt7636s,$(CHIPSET)),) -WFLAGS += -DMT7636 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_SDIO -DRTMP_SDIO_SUPPORT -DMCS_LUT_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DMULTI_CORE_SUPPORT -WFLAGS += -DRTMP_EFUSE_SUPPORT -#-DNEW_MBSSID_MODE -WFLAGS += -DCONFIG_ANDES_SUPPORT -WFLAGS += -DIP_ASSEMBLY -HAS_NEW_RATE_ADAPT_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -ifeq ($(HAS_CSO_SUPPORT), y) -WFLAGS += -DCONFIG_CSO_SUPPORT -endif - -WFLAGS += -DRTMP_WLAN_HOOK_SUPPORT -#WFLAGS += -DMT7636_FPGA -DCONFIG_FPGA_MODE -#WFLAGS += -DCONFIG_FPGA_MODE -#WFLAGS += -DRELEASE_EXCLUDE - -HAS_MT_BBP=y -HAS_MT_MAC=y -HAS_INF_SDIO=y -HAS_MAC_SDIO=y -HAS_MT_MAC=y -HAS_MT_RF=y - -CHIPSET_DAT = 2850 -endif - -ifneq ($(findstring mt7636u,$(CHIPSET)),) -WFLAGS += -DMT7636 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DMCS_LUT_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -WFLAGS += -DRTMP_EFUSE_SUPPORT -DDMA_SCH_SUPPORT -#-DNEW_MBSSID_MODE -WFLAGS += -DCONFIG_ANDES_SUPPORT -WFLAGS += -DIP_ASSEMBLY -HAS_NEW_RATE_ADAPT_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -WFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -endif - -WFLAGS += -DRTMP_WLAN_HOOK_SUPPORT -#WFLAGS += -DMT7603_FPGA -DCONFIG_FPGA_MODE -ifeq ($(HAS_FPGA_MODE),y) -WFLAGS += -DMT7636_FPGA -WFLAGS += -DCONFIG_FPGA_MODE -endif -WFLAGS += -DRELEASE_EXCLUDE - -# Add for DVT code -ifeq ($(HAS_DVT_MODE),y) -WFLAGS += -DCONFIG_DVT_MODE -WFLAGS += -DMULTI_WMM_SUPPORT -endif - -HAS_MT_BBP=y -HAS_MT_MAC=y -HAS_INF_USB=y -HAS_MAC_USB=y -HAS_MT_MAC=y -HAS_MT_RF=y - -CHIPSET_DAT = 2870 -endif - -# MT7603 -ifneq ($(findstring mt7603e,$(CHIPSET)),) -WFLAGS += -DMT7603 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DMCS_LUT_SUPPORT -DUSE_BMC -WFLAGS += -DRTMP_EFUSE_SUPPORT -DDMA_SCH_SUPPORT -#-DNEW_MBSSID_MODE -WFLAGS += -DCONFIG_ANDES_SUPPORT -#WFLAGS += -DDBG_DIAGNOSE -DDBG_TX_AGG_CNT -DDBG_TXQ_DEPTH -DDBG_TX_RING_DEPTH -DDBG_TX_MCS -DDBG_RX_MCS -DDBG_PSE_DEPTH -HAS_NEW_RATE_ADAPT_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -#WFLAGS += -DMT7603_FPGA -DCONFIG_FPGA_MODE -WFLAGS += -DCONFIG_FPGA_MODE -WFLAGS += -DRELEASE_EXCLUDE -WFLAGS += -DIP_ASSEMBLY -WFLAGS += -DRTMP_WLAN_HOOK_SUPPORT -HAS_MT_BBP=y -HAS_MT_MAC=y -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_MT_MAC=y -HAS_MT_RF=y - -CHIPSET_DAT = 2860 -endif - -ifneq ($(findstring mt7603u,$(CHIPSET)),) -WFLAGS += -DMT7603 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DMCS_LUT_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -WFLAGS += -DRTMP_EFUSE_SUPPORT -DDMA_SCH_SUPPORT -#-DNEW_MBSSID_MODE -WFLAGS += -DCONFIG_ANDES_SUPPORT -HAS_NEW_RATE_ADAPT_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -WFLAGS += -DRTMP_WLAN_HOOK_SUPPORT -#WFLAGS += -DMT7603_FPGA -DCONFIG_FPGA_MODE -WFLAGS += -DIP_ASSEMBLY -WFLAGS += -DCONFIG_FPGA_MODE -WFLAGS += -DRELEASE_EXCLUDE - -HAS_MT_BBP=y -HAS_MT_MAC=y -HAS_INF_USB=y -HAS_MAC_USB=y -HAS_MT_MAC=y -HAS_MT_RF=y - -CHIPSET_DAT = 2870 -endif -## End of MT7603 ## - -# MT7628 -ifneq ($(findstring mt7628,$(CHIPSET)),) -WFLAGS += -DMT7628 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -#-DNEW_MBSSID_MODE -WFLAGS += -DRTMP_FLASH_SUPPORT -WFLAGS += -DCAL_FREE_IC_SUPPORT -DRTMP_EFUSE_SUPPORT -WFLAGS += -DCONFIG_ANDES_SUPPORT -DDMA_SCH_SUPPORT -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -#WFLAGS += -DMT7628_FPGA -DCONFIG_FPGA_MODE -WFLAGS += -DIP_ASSEMBLY -WFLAGS += -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -WFLAGS += -DENHANCED_STAT_DISPLAY -WFLAGS += -DFIFO_EXT_SUPPORT -WFLAGS += -DMCS_LUT_SUPPORT -WFLAGS += -DUSE_BMC - -HAS_MT_BBP=y -HAS_MT_MAC=y -HAS_INF_RBUS=y -HAS_MAC_PCI=y -HAS_MT_MAC=y -HAS_MT_RF=y -CHIPSET_DAT = 2860 -endif -## End of MT7628 ## - - -#ifdef MT7615 -# MT7615 -ifneq ($(findstring mt7615,$(CHIPSET)),) -WFLAGS += -DMT7615 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DMCS_LUT_SUPPORT -DUSE_BMC -WFLAGS += -DRTMP_EFUSE_SUPPORT -#-DNEW_MBSSID_MODE -WFLAGS += -DCONFIG_ANDES_SUPPORT -#WFLAGS += -DDBG_DIAGNOSE -DDBG_TX_AGG_CNT -DDBG_TXQ_DEPTH -DDBG_TX_RING_DEPTH -DDBG_TX_MCS -DDBG_RX_MCS -DDBG_PSE_DEPTH -HAS_NEW_RATE_ADAPT_SUPPORT=y -ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y) -WFLAGS += -DNEW_RATE_ADAPT_SUPPORT -endif - -ifeq ($(HAS_FPGA_MODE),y) -WFLAGS += -DMT7615_FPGA -endif -WFLAGS += -DRELEASE_EXCLUDE - -WFLAGS += -DRTMP_WLAN_HOOK_SUPPORT -HAS_MT_BBP=y -HAS_MT_MAC=y -HAS_INF_PCI=y -HAS_MAC_PCI=y -HAS_MT_MAC=y -HAS_MT_RF=y - -CHIPSET_DAT = 2860 -endif -#endif - -################################################# -# Platform Related definitions -# -################################################# - -ifeq ($(PLATFORM),5VT) -#WFLAGS += -DCONFIG_5VT_ENHANCE -endif - -ifeq ($(HAS_BLOCK_NET_IF),y) -WFLAGS += -DBLOCK_NET_IF -endif - -ifeq ($(HAS_DFS_SUPPORT),y) -WFLAGS += -DDFS_SUPPORT -endif - -#ifdef MULTI_CARD -ifeq ($(HAS_MC_SUPPORT),y) -WFLAGS += -DMULTIPLE_CARD_SUPPORT -endif -#endif // MULTI_CARD // - -ifeq ($(HAS_LLTD),y) -WFLAGS += -DLLTD_SUPPORT -endif - -ifeq ($(PLATFORM),RMI) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),UBICOM_IPX8) -WFLAGS += -DRT_BIG_ENDIAN -DUNALIGNMENT_SUPPORT -DPLATFORM_UBM_IPX8 -DNO_CONSISTENT_MEM_SUPPORT -DCACHE_LINE_32B -endif - -ifeq ($(PLATFORM),BL2348) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),BL23570) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),BLUBB) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),BLPMP) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),RMI_64) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),IXP) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),IKANOS_V160) -WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0 -endif - -ifeq ($(PLATFORM),IKANOS_V180) -WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0 -endif - -ifeq ($(PLATFORM),INF_TWINPASS) -WFLAGS += -DRT_BIG_ENDIAN -DINF_TWINPASS -endif - -ifeq ($(PLATFORM),INF_DANUBE) -ifneq (,$(findstring 2.4,$(LINUX_SRC))) -# Linux 2.4 -WFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN -else -# Linux 2.6 -WFLAGS += -DRT_BIG_ENDIAN -endif -endif - -ifeq ($(PLATFORM),INF_AR9) -WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9 -# support MAPI function for AR9. -#WFLAGS += -DAR9_MAPI_SUPPORT -endif - -ifeq ($(PLATFORM),INF_VR9) -WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9 -DINF_VR9 -endif - -ifeq ($(PLATFORM),CAVM_OCTEON) -WFLAGS += -DRT_BIG_ENDIAN -endif - -ifeq ($(PLATFORM),BRCM_6358) -WFLAGS += -DRT_BIG_ENDIAN -DBRCM_6358 -endif - -ifeq ($(PLATFORM),FREESCALE8377) -#EXTRA_CFLAGS := -v -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include $(WFLAGS)-O2 -Wall -Wstrict-prototypes -Wno-trigraphs -#export EXTRA_CFLAGS -WFLAGS += -DRT_BIG_ENDIAN -EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include -endif - -ifeq ($(PLATFORM),ST) -WFLAGS += -DST -endif - -#kernel build options for 2.4 -# move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star - -ifeq ($(PLATFORM),STAR) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mshort-load-bytes -msoft-float -Uarm -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) - -export CFLAGS -endif - -ifeq ($(PLATFORM),UBICOM_IPX8) -EXTRA_CFLAGS += $(WFLAGS) -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),SIGMA) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM - -export CFLAGS -endif - -ifeq ($(PLATFORM),SIGMA_8622) -CFLAGS := -D__KERNEL__ -I$(CROSS_COMPILE_INCLUDE)/include -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),5VT) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),IKANOS_V160) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -march=lx4189 -Wa, -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),IKANOS_V180) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mips32r2 -Wa, -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),INF_TWINPASS) -CFLAGS := -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -G 0 -mno-abicalls -fno-pic -march=4kc -mips32 -Wa,--trap -pipe -mlong-calls $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),INF_DANUBE) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) - CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic - else - CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic - endif -export CFLAGS -endif - -ifeq ($(PLATFORM),INF_AR9) -CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -mtune=34kc -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic -export CFLAGS -endif - -ifeq ($(PLATFORM),INF_VR9) -CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic -export CFLAGS -endif - -ifeq ($(PLATFORM),BRCM_6358) -CFLAGS := $(WFLAGS) -nostdinc -iwithprefix include -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -I $(LINUX_SRC)/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-bcm963xx -I$(LINUX_SRC)/include/asm-mips/mach-generic -Os -fomit-frame-pointer -Wdeclaration-after-statement -DMODULE -mlong-calls -export CFLAGS -endif - -ifeq ($(PLATFORM),ST) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -O2 -Wundef -Wstrict-prototypes -Wno-trigraphs -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-aliasing -fno-common -fomit-frame-pointer -ffreestanding -m4-nofpu -o $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),PC) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) - # Linux 2.4 - CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) - export CFLAGS - else - # Linux 2.6 - EXTRA_CFLAGS := $(WFLAGS) - endif -endif - -ifeq ($(PLATFORM),INTELP6) - EXTRA_CFLAGS := $(WFLAGS) -endif - -#If the kernel version of RMI is newer than 2.6.27, please change "CFLAGS" to "EXTRA_FLAGS" -ifeq ($(PLATFORM),RMI) -EXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS) -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),RMI_64) -EXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=64 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS) -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),IXP) - CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -mbig-endian -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS) - EXTRA_CFLAGS := -v $(WFLAGS) -mbig-endian - export CFLAGS -endif - -ifeq ($(PLATFORM),SMDK) - EXTRA_CFLAGS := $(WFLAGS) -endif - -ifeq ($(PLATFORM),CAVM_OCTEON) - EXTRA_CFLAGS := $(WFLAGS) -mabi=64 $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),BB_SOC) -WFLAGS += -DRT_BIG_ENDIAN -DBB_SOC -DWIFI_MODULE -DCONFIG_RA_NAT_NONE -ifeq ($(CONFIG_MIPS_TC3262),y) -WFLAGS += -DMULTI_CORE_SUPPORT -endif -ifeq ($(RALINK_PCIE_ADDR_SWAP),1) -WFLAGS += -DBB_PCIE_ADDR_SWAP -endif -ifeq ($(TCSUPPORT_HWNAT_WIFI),1) -WFLAGS += -DBB_RA_HWNAT_WIFI -endif -EXTRA_CFLAGS += -I$(RT28xx_DIR)/include $(WFLAGS) -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),DM6446) - CFLAGS := -nostdinc -iwithprefix include -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Os -fno-omit-frame-pointer -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittle-endian -mabi=apcs-gnu -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wdeclaration-after-statement -c -o $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),BL2348) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348 -export CFLAGS -endif - -ifeq ($(PLATFORM),BL23570) -EXTRA_CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=74kc -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL23570 -export EXTRA_CFLAGS -endif - -ifeq ($(PLATFORM),BLUBB) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348 -export CFLAGS -endif - -ifeq ($(PLATFORM),BLPMP) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -export CFLAGS -endif - -ifeq ($(PLATFORM),MT85XX) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) - # Linux 2.4 - CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) - export CFLAGS - else - # Linux 2.6 - EXTRA_CFLAGS += $(WFLAGS) - EXTRA_CFLAGS += -D _NO_TYPEDEF_BOOL_ \ - -D _NO_TYPEDEF_UCHAR_ \ - -D _NO_TYPEDEF_UINT8_ \ - -D _NO_TYPEDEF_UINT16_ \ - -D _NO_TYPEDEF_UINT32_ \ - -D _NO_TYPEDEF_UINT64_ \ - -D _NO_TYPEDEF_CHAR_ \ - -D _NO_TYPEDEF_INT32_ \ - -D _NO_TYPEDEF_INT64_ \ - endif -endif - -ifeq ($(PLATFORM),NXP_TV550) - ifneq (,$(findstring 2.4,$(LINUX_SRC))) - # Linux 2.4 - CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=mips -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) - export CFLAGS - else - # Linux 2.6 - EXTRA_CFLAGS := $(WFLAGS) - endif -endif - -ifeq ($(PLATFORM),MVL5) -CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS) -export CFLAGS -endif - -ifeq ($(PLATFORM),MT7620) - EXTRA_CFLAGS := $(WFLAGS) -endif - -ifeq ($(PLATFORM),MT7621) - EXTRA_CFLAGS := $(WFLAGS) -endif - -ifeq ($(PLATFORM),MT7628) - EXTRA_CFLAGS := $(WFLAGS) -endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/diag.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/diag.c deleted file mode 100644 index 92a510f0e4..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/diag.c +++ /dev/null @@ -1,1580 +0,0 @@ -/* - * Copyright (c) 2016 MediaTek Inc. All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifdef WIFI_DIAG -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "rt_config.h" -#include "rtmp.h" -#include "rtmp_comm.h" -#include "dot11_base.h" - -#define DIAG_PRINT(Level, Fmt) \ - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, Level, Fmt) - -#if KERNEL_VERSION(3, 10, 0) <= LINUX_VERSION_CODE -#define GET_PRIV_DATA_FROM_INODE(inode) PDE_DATA(inode) -#define GET_PRIV_DATA_FROM_FILE(file) PDE_DATA(file_inode(file)) -#else -#define GET_PRIV_DATA_FROM_INODE(inode) (PDE(inode)->data) -#define GET_PRIV_DATA_FROM_FILE(file) (PDE(file->f_path.dentry->d_inode)->data) -#endif - -#define DIAG_IN_TIME(now, pCtrl) \ - (RTMP_TIME_BEFORE(now, pCtrl->diag_enable_time + \ - ((pCtrl->diag_duration) * OS_HZ))) - -#define DIAG_PROC_PATH "ctcwifi" -#define DIAG_VAR_PATH "/var/ctcwifi" -#define DIAG_STATUS_FILE "/var/ctcwifi/mt_wifi_diag" -#define DIAG_PROC_FILE_NUM 5 -#define DIAG_VAR_FILE_NUM 2 -#define DIAG_LOG_FILE_SIZE_MAX (1024 * 1024) /* 1M bytes */ -#define DIAG_PROCESS_NUM_MAX (8) -#define DIAG_FRAME_SIZE_MAX (2048) -#define DIAG_LOG_BUFF_SIZE (1000) -#define DIAG_ASSOC_ERROR_BUFF_SIZE (100) - -typedef enum _ENUM_DIAG_BAND { - DIAG_BAND_2G = 0, - DIAG_BAND_5G, - DIAG_BAND_MAX -} ENUM_DIAG_BAND; - -typedef struct _DIAG_WIFI_PROCESS_ENTRY { - UCHAR name[RTMP_OS_TASK_NAME_LEN]; - INT32 pid; - UCHAR is_process; -} DIAG_WIFI_PROCESS_ENTRY; - -typedef struct _DIAG_WIFI_PROCESS_INFO { - UCHAR num; - DIAG_WIFI_PROCESS_ENTRY entry[DIAG_PROCESS_NUM_MAX]; -} DIAG_WIFI_PROCESS_INFO; - -typedef struct _DIAG_LOG_ENTRY { - struct rtc_time tm; - BOOLEAN isTX; - UCHAR ssid[MAX_LEN_OF_SSID + 1]; - UCHAR ssid_len; - UCHAR band; - UCHAR frame_type[32]; - UCHAR sta_addr[6]; - UCHAR data[DIAG_FRAME_SIZE_MAX]; - UINT32 data_len; -} DIAG_LOG_ENTRY; - -typedef struct _DIAG_FRAME_INFO { - UCHAR isTX; - UCHAR *ssid; - UCHAR ssid_len; - UCHAR band; /* 0:2G, 1:5G, get from pAd->LatchRfRegs.Channel */ - UCHAR *pData; /* include 80211 header, refer to pRxBlk (RX)/ pData (TX) */ - UINT32 dataLen; /* packet length */ -} DIAG_FRAME_INFO; - -typedef struct DIAG_ASSOC_ERROR_ENTRY { - struct rtc_time tm; - UCHAR StaAddr[6]; - UCHAR Ssid[32]; - ENUM_DIAG_CONN_ERROR_CODE errCode; - UINT32 reason; -} DIAG_ASSOC_ERROR_ENTRY; - -typedef struct _DIAG_CTRL { - UINT8 init_flag; - ENUM_DIAG_BAND diag_band; - UINT32 diag_duration; - UINT32 diag_enable; - ULONG diag_enable_time; - UINT32 busy_time; - - UINT32 diag_log_file_offset; - DIAG_LOG_ENTRY diag_log_entry[DIAG_LOG_BUFF_SIZE]; - UINT32 diag_log_read_idx; - UINT32 diag_log_write_idx; - NDIS_SPIN_LOCK diag_log_lock; - UCHAR diag_log_tmp_buf[2 * DIAG_FRAME_SIZE_MAX + 128]; - - UINT32 assoc_error_file_offset; - DIAG_ASSOC_ERROR_ENTRY assoc_error_entry[DIAG_ASSOC_ERROR_BUFF_SIZE]; - UINT32 assoc_error_read_idx; - UINT32 assoc_error_write_idx; - NDIS_SPIN_LOCK assoc_error_lock; - - DIAG_WIFI_PROCESS_INFO process_info; -} DIAG_CTRL; - -const PCHAR DIAG_CONN_ERR_INFO[DIAG_CONN_ERROR_MAX] = { - "WiFi frames losing. reason code ", - "Capability checking failed.\n", - "Authentication failed. reason code ", - "Rejected by blacklist.\n", - "Rejected by STA limiation.\n", - "De-authed. reason code ", - "Association ignored by band steering.\n" -}; - -const PCHAR DIAG_PROC_FILE_LIST[DIAG_BAND_MAX][DIAG_PROC_FILE_NUM] = { - { DIAG_PROC_PATH "/Stat2G", DIAG_PROC_PATH "/diag_duration_2G", - DIAG_PROC_PATH "/diag_enable_2G", - DIAG_PROC_PATH "/channel_occupancy_2G", DIAG_PROC_PATH "/stats_2G" }, - { DIAG_PROC_PATH "/Stat5G", DIAG_PROC_PATH "/diag_duration_5G", - DIAG_PROC_PATH "/diag_enable_5G", - DIAG_PROC_PATH "/channel_occupancy_5G", DIAG_PROC_PATH "/stats_5G" } -}; - -const PCHAR DIAG_VAR_FILE_LIST[DIAG_BAND_MAX][DIAG_VAR_FILE_NUM] = { - { - DIAG_VAR_PATH "/association_errors_2G", - DIAG_VAR_PATH "/diag_log_2G", - }, - { DIAG_VAR_PATH "/association_errors_5G", DIAG_VAR_PATH "/diag_log_5G" } -}; - -const UCHAR MAC_ADDR_ZERO[MAC_ADDR_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -void diag_common_deauth_code_trans(USHORT reason, - ENUM_DIAG_CONN_ERROR_CODE *Code) -{ - switch (reason) { - case REASON_4_WAY_TIMEOUT: - case REASON_GROUP_KEY_HS_TIMEOUT: - case REASON_MIC_FAILURE: - case REASON_STA_REQ_ASSOC_NOT_AUTH: - case REASON_8021X_AUTH_FAIL: - case REASON_IE_DIFFERENT: - case REASON_MCIPHER_NOT_VALID: - case REASON_UCIPHER_NOT_VALID: - case REASON_AKMP_NOT_VALID: - case REASON_UNSUPPORT_RSNE_VER: - case REASON_CIPHER_SUITE_REJECTED: - *Code = DIAG_CONN_AUTH_FAIL; - break; - case REASON_NO_LONGER_VALID: - *Code = DIAG_CONN_FRAME_LOST; - break; - case REASON_INVALID_IE: - case REASON_INVALID_RSNE_CAP: - *Code = DIAG_CONN_CAP_ERROR; - break; - case REASON_DECLINED: - *Code = DIAG_CONN_ACL_BLK; - break; - default: - *Code = DIAG_CONN_DEAUTH; - break; - } -} - -void diag_get_frame_info(PHEADER_802_11 pHeader, UCHAR isTx, - UCHAR **pp_frame_type, UCHAR **pp_sta_addr) -{ - if (!pHeader || !pp_frame_type || !pp_sta_addr) - return; - - *pp_frame_type = NULL; - *pp_sta_addr = NULL; - - if (pHeader->FC.Type == FC_TYPE_MGMT) { - if (isTx) - *pp_sta_addr = pHeader->Addr1; - else - *pp_sta_addr = pHeader->Addr2; - - switch (pHeader->FC.SubType) { - case SUBTYPE_BEACON: - /* just record our beacon */ - if (isTx) - *pp_frame_type = "Beacon"; - break; - - case SUBTYPE_PROBE_REQ: - /* just record peer's probe request */ - if (!isTx) - *pp_frame_type = "Probe Request"; - break; - - case SUBTYPE_PROBE_RSP: - /* just record our probe response */ - if (isTx) - *pp_frame_type = "Probe Response"; - break; - - case SUBTYPE_ATIM: - *pp_frame_type = "ATIM"; - break; - - case SUBTYPE_DISASSOC: - *pp_frame_type = "Disassociation"; - break; - - case SUBTYPE_DEAUTH: - *pp_frame_type = "Deauthentication"; - break; - - case SUBTYPE_ASSOC_REQ: - /* just record peer's Association request */ - if (!isTx) - *pp_frame_type = "Association Request"; - break; - - case SUBTYPE_ASSOC_RSP: - /* just record our Association response */ - if (isTx) - *pp_frame_type = "Association Response"; - break; - - case SUBTYPE_REASSOC_REQ: - /* just record peer's Reassociation request */ - if (!isTx) - *pp_frame_type = "Reassociation Request"; - break; - - case SUBTYPE_REASSOC_RSP: - /* just record our Reassociation response */ - if (isTx) - *pp_frame_type = "Reassociation Response"; - break; - - case SUBTYPE_AUTH: - *pp_frame_type = "Authentication"; - break; - - default: - DIAG_PRINT(DBG_LVL_TRACE, - ("%s, not handled MGMT frme, subtype=%d\n", - __func__, pHeader->FC.SubType)); - break; - } - } else if (pHeader->FC.Type == FC_TYPE_CNTL) { - switch (pHeader->FC.SubType) { - case SUBTYPE_RTS: - *pp_frame_type = "RTS"; - if (isTx) - *pp_sta_addr = pHeader->Addr1; - else - *pp_sta_addr = pHeader->Addr2; - break; - - case SUBTYPE_CTS: - *pp_frame_type = "CTS"; - if (isTx) - *pp_sta_addr = pHeader->Addr1; - break; - - case SUBTYPE_ACK: - *pp_frame_type = "ACK"; - if (isTx) - *pp_sta_addr = pHeader->Addr1; - break; - - default: - DIAG_PRINT(DBG_LVL_TRACE, - ("%s, not handled CNTL frme, subtype=%d\n", - __func__, pHeader->FC.SubType)); - break; - } - } -} - -void diag_frame_cache(DIAG_FRAME_INFO *info, DIAG_CTRL *pCtrl) -{ - DIAG_LOG_ENTRY *entry; - UCHAR *p_frame_type = NULL; - UCHAR *p_sta_addr = NULL; - struct timex txc; - ULONG flags; - ULONG now; - - NdisGetSystemUpTime(&now); - - if ((info == NULL) || (pCtrl == NULL)) - return; - - if (!DIAG_IN_TIME(now, pCtrl)) - return; - - diag_get_frame_info((PHEADER_802_11)info->pData, info->isTX, - &p_frame_type, &p_sta_addr); - if (!p_frame_type) - return; - - RTMP_INT_LOCK(&pCtrl->diag_log_lock, flags); - - if (((pCtrl->diag_log_write_idx + 1) % DIAG_LOG_BUFF_SIZE) != - pCtrl->diag_log_read_idx) { - entry = &pCtrl->diag_log_entry[pCtrl->diag_log_write_idx]; - memset(entry, 0, sizeof(*entry)); - - do_gettimeofday(&(txc.time)); - txc.time.tv_sec -= sys_tz.tz_minuteswest * 60; - rtc_time_to_tm(txc.time.tv_sec, &entry->tm); - - entry->isTX = info->isTX; - - if (info->ssid_len <= 32) - entry->ssid_len = info->ssid_len; - else - entry->ssid_len = 32; - memcpy(entry->ssid, info->ssid, entry->ssid_len); - - entry->band = info->band; - - if (strlen(p_frame_type) < 32) - memcpy(entry->frame_type, p_frame_type, - strlen(p_frame_type)); - else - memcpy(entry->frame_type, p_frame_type, 32 - 1); - - if (p_sta_addr) - memcpy(entry->sta_addr, p_sta_addr, 6); - - entry->data_len = (info->dataLen > DIAG_FRAME_SIZE_MAX) ? - DIAG_FRAME_SIZE_MAX : - info->dataLen; - memcpy(entry->data, info->pData, entry->data_len); - - /* update write_idx */ - pCtrl->diag_log_write_idx = - (pCtrl->diag_log_write_idx + 1) % DIAG_LOG_BUFF_SIZE; - } else { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, diag_log_entry array full\n", __func__)); - } - - RTMP_INT_UNLOCK(&pCtrl->diag_log_lock, flags); -} - -static int diag_statistic_proc_show(struct seq_file *m, void *v) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)m->private; - ULONG txCount = 0; - ULONG rxCount = 0; - ULONG txFails = 0; - UINT8 ucBand = BAND0; - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - { - EXT_EVENT_TX_STATISTIC_RESULT_T rTxStatResult; - memset(&rTxStatResult, 0, sizeof(rTxStatResult)); - MtCmdGetTxStatistic(pAd, GET_TX_STAT_TOTAL_TX_CNT, ucBand, 0, - &rTxStatResult); - pAd->WlanCounters[ucBand].TransmittedFragmentCount.u.LowPart += - (rTxStatResult.u4TotalTxCount - - rTxStatResult.u4TotalTxFailCount); - pAd->WlanCounters[ucBand].FailedCount.u.LowPart += - rTxStatResult.u4TotalTxFailCount; - pAd->WlanCounters[ucBand].CurrentBwTxCount.u.LowPart += - rTxStatResult.u4CurrBwTxCnt; - pAd->WlanCounters[ucBand].OtherBwTxCount.u.LowPart += - rTxStatResult.u4OtherBwTxCnt; - } -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - - txCount = pAd->WlanCounters[ucBand].TransmittedFragmentCount.u.LowPart; - rxCount = pAd->WlanCounters[ucBand].ReceivedFragmentCount.QuadPart; - txFails = pAd->WlanCounters[ucBand].FailedCount.u.LowPart; - - seq_printf(m, "tx_packets:%ld\n", txCount); - seq_printf(m, "rx_packets:%ld\n", rxCount); - seq_printf(m, "tx_fails:%ld\n", txFails); - - return 0; -} - -static int diag_statistic_proc_open(struct inode *inode, struct file *file) -{ - return single_open(file, diag_statistic_proc_show, - GET_PRIV_DATA_FROM_INODE(inode)); -} - -static int diag_duration_proc_show(struct seq_file *m, void *v) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)m->private; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - seq_printf(m, "%d\n", pCtrl->diag_duration); - return 0; -} - -static int diag_duration_proc_open(struct inode *inode, struct file *file) -{ - return single_open(file, diag_duration_proc_show, - GET_PRIV_DATA_FROM_INODE(inode)); -} - -static ssize_t diag_duration_proc_write(struct file *file, - const char __user *buffer, size_t count, - loff_t *pos) -{ - PRTMP_ADAPTER pAd = NULL; - DIAG_CTRL *pCtrl = NULL; - unsigned int val = 0; - UCHAR buf[10]; - - if ((file == NULL) || (buffer == NULL)) - return -EFAULT; - - pAd = GET_PRIV_DATA_FROM_FILE(file); - pCtrl = pAd->pDiagCtrl; - if (pCtrl == NULL) - return -EFAULT; - - memset(buf, 0, sizeof(buf)); - if (copy_from_user(buf, buffer, min(sizeof(buf), count))) - return -EFAULT; - - val = simple_strtol(buf, NULL, 10); - if ((val <= 300) && (val >= 60)) { - pCtrl->diag_duration = val; - DIAG_PRINT(DBG_LVL_TRACE, - ("%s set duraion %d.\n", __func__, val)); - } else { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s rang error, valid rang is [60,300].\n", - __func__)); - return -EFAULT; - } - return count; -} - -static int diag_enable_proc_show(struct seq_file *m, void *v) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)m->private; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - seq_printf(m, "%d\n", pCtrl->diag_enable); - return 0; -} - -static int diag_enable_proc_open(struct inode *inode, struct file *file) -{ - return single_open(file, diag_enable_proc_show, - GET_PRIV_DATA_FROM_INODE(inode)); -} - -static ssize_t diag_enable_proc_write(struct file *file, - const char __user *buffer, size_t count, - loff_t *pos) -{ - PRTMP_ADAPTER pAd = NULL; - DIAG_CTRL *pCtrl = NULL; - RTMP_OS_FD fd = NULL; - RTMP_OS_FS_INFO osFSInfo; - UCHAR buf[10]; - UINT val = 0; - - if ((file == NULL) || (buffer == NULL)) - return -EFAULT; - - pAd = GET_PRIV_DATA_FROM_FILE(file); - pCtrl = pAd->pDiagCtrl; - if (pCtrl == NULL) - return -EFAULT; - - memset(buf, 0, sizeof(buf)); - if (copy_from_user(buf, buffer, min(sizeof(buf), count))) - return -EFAULT; - - val = simple_strtol(buf, NULL, 10); - if (val > 1) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s rang error, valid rang is [0,1].\n", __func__)); - return -EFAULT; - } - - /* stop diag_log handling */ - pCtrl->diag_enable = 0; - OS_WAIT(500); - - if (val != 0) { - DIAG_PRINT(DBG_LVL_OFF, ("Flush diag_log file\n")); - memset(pCtrl->diag_log_entry, 0, - DIAG_LOG_BUFF_SIZE * sizeof(DIAG_LOG_ENTRY)); - pCtrl->diag_log_read_idx = 0; - pCtrl->diag_log_write_idx = 0; - - RtmpOSFSInfoChange(&osFSInfo, TRUE); - fd = RtmpOSFileOpen(DIAG_VAR_FILE_LIST[pCtrl->diag_band][1], - O_CREAT | O_TRUNC, - S_IRWXU | S_IRWXG | S_IRWXO); - if (!IS_FILE_OPEN_ERR(fd)) - RtmpOSFileClose(fd); - RtmpOSFSInfoChange(&osFSInfo, FALSE); - pCtrl->diag_log_file_offset = 0; - NdisGetSystemUpTime(&pCtrl->diag_enable_time); - pCtrl->diag_enable = val; - } - - return count; -} - -static int diag_ch_occ_proc_show(struct seq_file *m, void *v) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)m->private; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - UINT32 ch_occ = 0; - CHAR *band = NULL; - UCHAR ch = 0; - - ch = pAd->ApCfg.MBSSID[0].wdev.channel; - ch_occ = (100 * pCtrl->busy_time) / 1000; - seq_puts(m, "Channel\tBand\tOccupancy\n"); - if (ch < 14) - band = "2G"; - else - band = "5G"; - - seq_printf(m, "%-7d\t%-4s\t%-9d\n", ch, band, ch_occ); - return 0; -} - -static int diag_ch_occ_proc_open(struct inode *inode, struct file *file) -{ - return single_open(file, diag_ch_occ_proc_show, - GET_PRIV_DATA_FROM_INODE(inode)); -} - -static int diag_sta_proc_show(struct seq_file *m, void *v) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)m->private; - PMAC_TABLE_ENTRY pEntry = NULL; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - EXT_EVENT_TX_STATISTIC_RESULT_T rTxStatResult; -#endif - INT i = 0; - UINT8 ucBand = BAND0; - UINT32 pecent; - UINT32 deci; - UINT32 tx_suc; - - seq_puts(m, "STA: \tSNR \tRSSI \tTXSUCC\n"); - for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (pEntry->EntryType != ENTRY_CLIENT) - continue; - seq_printf(m, "%02X:%02X:%02X:%02X:%02X:%02X", - PRINT_MAC(pEntry->Addr)); - seq_printf(m, "\t%d", pEntry->RssiSample.AvgSnr[0]); - seq_printf(m, "\t%d", RTMPAvgRssi(pAd, &pEntry->RssiSample)); - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - memset(&rTxStatResult, 0, - sizeof(EXT_EVENT_TX_STATISTIC_RESULT_T)); - MtCmdGetTxStatistic(pAd, GET_TX_STAT_ENTRY_TX_CNT, - 0 /*Don't Care*/, pEntry->wcid, - &rTxStatResult); - tx_suc = rTxStatResult.u4EntryTxCount - - rTxStatResult.u4EntryTxFailCount; - if ((rTxStatResult.u4EntryTxCount > 0) && - (tx_suc <= rTxStatResult.u4EntryTxCount)) { - pecent = (UINT32)((100 * tx_suc) / - rTxStatResult.u4EntryTxCount); - deci = (UINT32)((100 * tx_suc) % - rTxStatResult.u4EntryTxCount); - deci = (UINT32)((100 * deci) / - rTxStatResult.u4EntryTxCount); - } else { - pecent = 100; - deci = 0; - } -#endif - seq_printf(m, "\t%d.%02d\n", pecent, deci); - } - seq_printf(m, "RXCRCERR: %d\n", - pAd->WlanCounters[ucBand].FCSErrorCount.u.LowPart); - return 0; -} - -static int diag_sta_proc_open(struct inode *inode, struct file *file) -{ - return single_open(file, diag_sta_proc_show, - GET_PRIV_DATA_FROM_INODE(inode)); -} - -static const struct file_operations diag_statistic_proc_fops = { - .owner = THIS_MODULE, - .open = diag_statistic_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations diag_duration_proc_fops = { - .owner = THIS_MODULE, - .open = diag_duration_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .write = diag_duration_proc_write, -}; - -static const struct file_operations diag_enable_proc_fops = { - .owner = THIS_MODULE, - .open = diag_enable_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .write = diag_enable_proc_write, -}; - -static const struct file_operations diag_ch_occ_proc_fops = { - .owner = THIS_MODULE, - .open = diag_ch_occ_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations diag_sta_proc_fops = { - .owner = THIS_MODULE, - .open = diag_sta_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -void DiagVarDirMk(ENUM_DIAG_BAND diag_band) -{ - RTMP_OS_FS_INFO osFSInfo; - int ret = 0; - RTMP_OS_FD fd = NULL; - int i; - /* create var sub directory */ - RtmpOSFSInfoChange(&osFSInfo, TRUE); - ret = sys_access(DIAG_VAR_PATH, 0); - if (ret != 0) { - ret = sys_mkdir(DIAG_VAR_PATH, 0777); - if (ret < 0) - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, Error create directory %s\n", __func__, - DIAG_VAR_PATH)); - } - for (i = 0; i < DIAG_VAR_FILE_NUM; i++) { - fd = RtmpOSFileOpen(DIAG_VAR_FILE_LIST[diag_band][i], - O_CREAT | O_TRUNC, - S_IRWXU | S_IRWXG | S_IRWXO); - if (IS_FILE_OPEN_ERR(fd)) - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, Error create %s\n", __func__, - DIAG_VAR_FILE_LIST[diag_band][i])); - else - RtmpOSFileClose(fd); - } - - RtmpOSFSInfoChange(&osFSInfo, FALSE); -} - -void DiagProcDirMk(ENUM_DIAG_BAND diag_band) -{ - RTMP_OS_FS_INFO osFSInfo; - RTMP_OS_FD fd = NULL; - UCHAR buf[64]; - UCHAR buf_size = 64; - UCHAR tmpbuf[64]; - UCHAR diag_2G = 0, diag_5G = 0; - - DIAG_PRINT(DBG_LVL_OFF, ("%s diag_band:%d\n", __func__, diag_band)); - - memset(buf, 0, 64); - memset(tmpbuf, 0, 64); - - /*test the DIAG_PROC_PATH dir exist*/ - RtmpOSFSInfoChange(&osFSInfo, TRUE); - fd = RtmpOSFileOpen(DIAG_STATUS_FILE, O_CREAT | O_RDONLY, - S_IRWXU | S_IRWXG | S_IRWXO); - if (IS_FILE_OPEN_ERR(fd)) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, open DIAG_STATUS_FILE for read failed\n", - __func__)); - } else { - if (RtmpOSFileRead(fd, buf, buf_size - 1) > 0) { - if (RTMPGetKeyParameter("2G_WIFI_DIAG", tmpbuf, 64, buf, - TRUE)) { - diag_2G = (UCHAR)simple_strtol(tmpbuf, 0, 10); - DIAG_PRINT(DBG_LVL_ERROR, ("%s, diag_2G=%d\n", - __func__, diag_2G)); - } - if (RTMPGetKeyParameter("5G_WIFI_DIAG", tmpbuf, 64, buf, - TRUE)) { - diag_5G = (UCHAR)simple_strtol(tmpbuf, 0, 10); - DIAG_PRINT(DBG_LVL_ERROR, ("%s, diag_5G=%d\n", - __func__, diag_5G)); - } - } - RtmpOSFileClose(fd); - } - - if ((diag_2G == 0) && (diag_5G == 0)) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s dir %s may not exist, create it\n", __func__, - DIAG_PROC_PATH)); - proc_mkdir(DIAG_PROC_PATH, NULL); - } - - fd = RtmpOSFileOpen(DIAG_STATUS_FILE, O_CREAT | O_WRONLY | O_TRUNC, - S_IRWXU | S_IRWXG | S_IRWXO); - if (IS_FILE_OPEN_ERR(fd)) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, open DIAG_STATUS_FILE for write failed\n", - __func__)); - } else { - char *diag_stat_str = NULL; - - if (diag_band == DIAG_BAND_2G) { - if (diag_5G == 0) - diag_stat_str = - "Default\n2G_WIFI_DIAG=1\n5G_WIFI_DIAG=0\n"; - else - diag_stat_str = - "Default\n2G_WIFI_DIAG=1\n5G_WIFI_DIAG=1\n"; - - } else if (diag_band == DIAG_BAND_5G) { - if (diag_2G == 0) - diag_stat_str = - "Default\n2G_WIFI_DIAG=0\n5G_WIFI_DIAG=1\n"; - else - diag_stat_str = - "Default\n2G_WIFI_DIAG=1\n5G_WIFI_DIAG=1\n"; - } - RtmpOSFileWrite(fd, diag_stat_str, strlen(diag_stat_str)); - RtmpOSFileClose(fd); - } - - RtmpOSFSInfoChange(&osFSInfo, FALSE); -} - -void DiagProcDirRm(ENUM_DIAG_BAND diag_band) -{ - RTMP_OS_FS_INFO osFSInfo; - RTMP_OS_FD fd = NULL; - UCHAR buf[64]; - UCHAR buf_size = 64; - UCHAR tmpbuf[64]; - UCHAR diag_2G = 0, diag_5G = 0; - - DIAG_PRINT(DBG_LVL_OFF, ("%s diag_band:%d\n", __func__, diag_band)); - - memset(buf, 0, 64); - memset(tmpbuf, 0, 64); - - /*test the DIAG_PROC_PATH dir exist*/ - RtmpOSFSInfoChange(&osFSInfo, TRUE); - fd = RtmpOSFileOpen(DIAG_STATUS_FILE, O_CREAT | O_RDONLY, - S_IRWXU | S_IRWXG | S_IRWXO); - if (IS_FILE_OPEN_ERR(fd)) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, open DIAG_STATUS_FILE failed\n", __func__)); - } else { - if (RtmpOSFileRead(fd, buf, buf_size - 1) > 0) { - if (RTMPGetKeyParameter("2G_WIFI_DIAG", tmpbuf, 64, buf, - TRUE)) { - diag_2G = (UCHAR)simple_strtol(tmpbuf, 0, 10); - DIAG_PRINT(DBG_LVL_TRACE, ("%s, diag_2G=%d\n", - __func__, diag_2G)); - } - if (RTMPGetKeyParameter("5G_WIFI_DIAG", tmpbuf, 64, buf, - TRUE)) { - diag_5G = (UCHAR)simple_strtol(tmpbuf, 0, 10); - DIAG_PRINT(DBG_LVL_TRACE, ("%s, diag_5G=%d\n", - __func__, diag_5G)); - } - } - RtmpOSFileClose(fd); - } - - if (((diag_band == DIAG_BAND_2G) && (diag_5G == 0)) || - ((diag_band == DIAG_BAND_5G) && (diag_2G == 0))) { - DIAG_PRINT(DBG_LVL_OFF, - ("%s, remove proc/ctcwifi\n", __func__)); - remove_proc_entry(DIAG_PROC_PATH, NULL); - } - - fd = RtmpOSFileOpen(DIAG_STATUS_FILE, O_CREAT | O_WRONLY | O_TRUNC, - S_IRWXU | S_IRWXG | S_IRWXO); - if (IS_FILE_OPEN_ERR(fd)) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, open DIAG_STATUS_FILE for write failed\n", - __func__)); - } else { - char *diag_stat_str = NULL; - - if (diag_band == DIAG_BAND_2G) { - if (diag_5G == 0) - diag_stat_str = - "Default\n2G_WIFI_DIAG=0\n5G_WIFI_DIAG=0\n"; - else - diag_stat_str = - "Default\n2G_WIFI_DIAG=0\n5G_WIFI_DIAG=1\n"; - - } else if (diag_band == DIAG_BAND_5G) { - if (diag_2G == 0) - diag_stat_str = - "Default\n2G_WIFI_DIAG=0\n5G_WIFI_DIAG=0\n"; - else - diag_stat_str = - "Default\n2G_WIFI_DIAG=1\n5G_WIFI_DIAG=0\n"; - } - RtmpOSFileWrite(fd, diag_stat_str, strlen(diag_stat_str)); - RtmpOSFileClose(fd); - } - - RtmpOSFSInfoChange(&osFSInfo, FALSE); -} - -void DiagProcEntryInit(ENUM_DIAG_BAND diag_band, PRTMP_ADAPTER pAd) -{ - const struct file_operations *DIAG_PROC_FOPS[5] = { - &diag_statistic_proc_fops, &diag_duration_proc_fops, - &diag_enable_proc_fops, &diag_ch_occ_proc_fops, - &diag_sta_proc_fops - }; - int i; - - DIAG_PRINT(DBG_LVL_TRACE, - ("%s pAd:%p diag_band:%d\n", __func__, pAd, diag_band)); - - for (i = 0; i < DIAG_PROC_FILE_NUM; i++) - proc_create_data(DIAG_PROC_FILE_LIST[diag_band][i], - S_IRWXU | S_IRWXG | S_IRWXO, NULL, - DIAG_PROC_FOPS[i], pAd); -} - -void DiagProcEntryDeinit(ENUM_DIAG_BAND diag_band) -{ - int i; - - for (i = 0; i < DIAG_PROC_FILE_NUM; i++) - remove_proc_entry(DIAG_PROC_FILE_LIST[diag_band][i], 0); -} - -void DiagCtrlAlloc(PRTMP_ADAPTER pAd) -{ - DIAG_CTRL *pCtrl = NULL; - UCHAR index = 0; - - DIAG_PRINT(DBG_LVL_OFF, ("%s pAd:%p\n", __func__, pAd)); - - os_alloc_mem(NULL, (UCHAR **)&pCtrl, sizeof(DIAG_CTRL)); - if (pCtrl == NULL) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s fail to allocate pDiagCtrl memory\n", - __func__)); - return; - } - memset(pCtrl, 0, sizeof(DIAG_CTRL)); - - for (index = 0; index < DIAG_PROCESS_NUM_MAX; index++) - pCtrl->process_info.entry[index].pid = -1; - - pCtrl->diag_enable = 0; - pCtrl->diag_duration = 60; - - pAd->pDiagCtrl = pCtrl; -} - -void DiagCtrlFree(PRTMP_ADAPTER pAd) -{ - DIAG_PRINT(DBG_LVL_OFF, ("%s pAd:%p\n", __func__, pAd)); - - if (pAd->pDiagCtrl) - os_free_mem(pAd->pDiagCtrl); - pAd->pDiagCtrl = NULL; -} - -void DiagAddPid(OS_TASK *pTask) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask); - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - UCHAR index = 0; - - if (!pCtrl) - return; - - for (index = 0; index < DIAG_PROCESS_NUM_MAX; index++) { - if (pCtrl->process_info.entry[index].pid == -1) { - pCtrl->process_info.entry[index].is_process = 0; - pCtrl->process_info.entry[index].pid = - pTask->kthread_task->pid; - memcpy(pCtrl->process_info.entry[index].name, - pTask->taskName, - (strlen(pTask->taskName) > - (RTMP_OS_TASK_NAME_LEN - 1)) ? - (RTMP_OS_TASK_NAME_LEN - 1) : - strlen(pTask->taskName)); - pCtrl->process_info.num++; - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, add PID=%d, name=%s, total_num=%d\n", - __func__, - pCtrl->process_info.entry[index].pid, - pCtrl->process_info.entry[index].name, - pCtrl->process_info.num)); - break; - } - } -} - -void DiagDelPid(OS_TASK *pTask) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask); - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - UCHAR index = 0; - - if (!pCtrl) - return; - - for (index = 0; index < DIAG_PROCESS_NUM_MAX; index++) { - if (pCtrl->process_info.entry[index].pid == - pTask->kthread_task->pid) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, delete PID=%d, total_num=%d\n", - __func__, - pCtrl->process_info.entry[index].pid, - pCtrl->process_info.num)); - pCtrl->process_info.entry[index].is_process = 0; - pCtrl->process_info.entry[index].pid = -1; - memset(pCtrl->process_info.entry[index].name, 0, - RTMP_OS_TASK_NAME_LEN); - pCtrl->process_info.num--; - break; - } - } -} - -VOID DiagGetProcessInfo(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) -{ - DIAG_WIFI_PROCESS_INFO process_info; - UCHAR index = 0; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if (!wrq) - return; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - memset(&process_info, 0, sizeof(process_info)); - for (index = 0; index < DIAG_PROCESS_NUM_MAX; index++) { - if (pCtrl->process_info.entry[index].pid != -1) { - memcpy(&process_info.entry[process_info.num], - &pCtrl->process_info.entry[index], - sizeof(DIAG_WIFI_PROCESS_ENTRY)); - process_info.num++; - } - } - - wrq->u.data.length = sizeof(process_info); - if (copy_to_user(wrq->u.data.pointer, &process_info, - wrq->u.data.length)) - DIAG_PRINT(DBG_LVL_ERROR, - ("%s: copy_to_user() fail\n", __func__)); -} - -void DiagConnError(PRTMP_ADAPTER pAd, UCHAR apidx, UCHAR *addr, - ENUM_DIAG_CONN_ERROR_CODE Code, UINT32 Reason) -{ - struct timex txc; - DIAG_ASSOC_ERROR_ENTRY *entry; - ULONG flags; - ENUM_DIAG_CONN_ERROR_CODE DiagCode = 0; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if (!addr) - return; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - if (!(VALID_MBSS(pAd, apidx) && (apidx < pAd->ApCfg.BssidNum))) - return; - - if (Code == DIAG_CONN_DEAUTH_COM) - diag_common_deauth_code_trans(Reason, &DiagCode); - else if (Code < DIAG_CONN_ERROR_MAX) - DiagCode = Code; - - RTMP_INT_LOCK(&pCtrl->assoc_error_lock, flags); - if (((pCtrl->assoc_error_write_idx + 1) % DIAG_ASSOC_ERROR_BUFF_SIZE) != - pCtrl->assoc_error_read_idx) { - entry = &pCtrl->assoc_error_entry[pCtrl->assoc_error_write_idx]; - memset(entry, 0, sizeof(*entry)); - - do_gettimeofday(&(txc.time)); - txc.time.tv_sec -= sys_tz.tz_minuteswest * 60; - rtc_time_to_tm(txc.time.tv_sec, &entry->tm); - - memcpy(entry->StaAddr, addr, 6); - if (pAd->ApCfg.MBSSID[apidx].SsidLen > 0 && - pAd->ApCfg.MBSSID[apidx].SsidLen <= 32) - memcpy(entry->Ssid, pAd->ApCfg.MBSSID[apidx].Ssid, - pAd->ApCfg.MBSSID[apidx].SsidLen); - entry->errCode = DiagCode; - entry->reason = Reason; - - /* update write_idx */ - pCtrl->assoc_error_write_idx = - (pCtrl->assoc_error_write_idx + 1) % - DIAG_ASSOC_ERROR_BUFF_SIZE; - } else { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, assoc_error_entry array full\n", __func__)); - } - - RTMP_INT_UNLOCK(&pCtrl->assoc_error_lock, flags); -} - -void DiagConnErrorWrite(PRTMP_ADAPTER pAd) -{ - RTMP_OS_FD fd = NULL; - RTMP_OS_FS_INFO osFSInfo; - UCHAR buf[256]; - UINT32 buf_size = 256; - DIAG_ASSOC_ERROR_ENTRY *log_entry; - UINT32 write_size; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - memset(buf, 0, sizeof(buf)); - RtmpOSFSInfoChange(&osFSInfo, TRUE); - fd = RtmpOSFileOpen(DIAG_VAR_FILE_LIST[pCtrl->diag_band][0], O_WRONLY, - 0); - if (IS_FILE_OPEN_ERR(fd)) { - fd = RtmpOSFileOpen(DIAG_VAR_FILE_LIST[pCtrl->diag_band][0], - O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); - if (IS_FILE_OPEN_ERR(fd)) { - RtmpOSFSInfoChange(&osFSInfo, FALSE); - return; - } - pCtrl->assoc_error_file_offset = 0; - } - - RtmpOSFileSeek(fd, pCtrl->assoc_error_file_offset); - - while (pCtrl->assoc_error_write_idx != pCtrl->assoc_error_read_idx) { - log_entry = - &pCtrl->assoc_error_entry[pCtrl->assoc_error_read_idx]; - snprintf(buf + strlen(buf), buf_size - strlen(buf), - "%04d-%02d-%02d %02d:%02d:%02d", - log_entry->tm.tm_year + 1900, log_entry->tm.tm_mon + 1, - log_entry->tm.tm_mday, log_entry->tm.tm_hour, - log_entry->tm.tm_min, log_entry->tm.tm_sec); - - snprintf(buf + strlen(buf), buf_size - strlen(buf), - " %02x:%02x:%02x:%02x:%02x:%02x %s: %s", - PRINT_MAC(log_entry->StaAddr), log_entry->Ssid, - DIAG_CONN_ERR_INFO[log_entry->errCode]); - - if (log_entry->errCode == DIAG_CONN_DEAUTH || - log_entry->errCode == DIAG_CONN_FRAME_LOST || - log_entry->errCode == DIAG_CONN_AUTH_FAIL) - snprintf(buf + strlen(buf), buf_size - strlen(buf), - "%d\n", log_entry->reason); - - write_size = strlen(buf); - if ((pCtrl->assoc_error_file_offset + write_size) > - DIAG_LOG_FILE_SIZE_MAX) { - pCtrl->assoc_error_file_offset = - 0; /* overwrite from file start */ - RtmpOSFileSeek(fd, 0); - } - RtmpOSFileWrite(fd, buf, write_size); - pCtrl->assoc_error_file_offset += write_size; - - memset(buf, 0, buf_size); - memset(log_entry, 0, sizeof(DIAG_ASSOC_ERROR_ENTRY)); - - pCtrl->assoc_error_read_idx = - (pCtrl->assoc_error_read_idx + 1) % - DIAG_ASSOC_ERROR_BUFF_SIZE; - } - - RtmpOSFileClose(fd); - RtmpOSFSInfoChange(&osFSInfo, FALSE); -} - -void DiagLogFileWrite(PRTMP_ADAPTER pAd) -{ - RTMP_OS_FD fd = NULL; - RTMP_OS_FS_INFO osFSInfo; - UCHAR *buf = NULL; - UINT32 buf_size = 0; - DIAG_LOG_ENTRY *log_entry; - UINT32 write_size; - UCHAR *pData = NULL; - UINT32 dataLen = 0, index = 0; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - if (pCtrl->diag_enable == 0) - return; - - buf = pCtrl->diag_log_tmp_buf; - buf_size = 2 * DIAG_FRAME_SIZE_MAX + 128; - memset(buf, 0, buf_size); - - RtmpOSFSInfoChange(&osFSInfo, TRUE); - fd = RtmpOSFileOpen(DIAG_VAR_FILE_LIST[pCtrl->diag_band][1], O_WRONLY, - 0); - if (IS_FILE_OPEN_ERR(fd)) { - fd = RtmpOSFileOpen(DIAG_VAR_FILE_LIST[pCtrl->diag_band][1], - O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); - if (IS_FILE_OPEN_ERR(fd)) { - RtmpOSFSInfoChange(&osFSInfo, FALSE); - return; - } - pCtrl->diag_log_file_offset = 0; - } - - RtmpOSFileSeek(fd, pCtrl->diag_log_file_offset); - - while (pCtrl->diag_log_write_idx != pCtrl->diag_log_read_idx) { - if (pCtrl->diag_enable == 0) - break; - - log_entry = &pCtrl->diag_log_entry[pCtrl->diag_log_read_idx]; - - /* pData include 80211 header, because CNTL frame just include FCS except the 80211 header */ - pData = log_entry->data; - dataLen = log_entry->data_len; - - /* time */ - if (strlen(buf) < (buf_size - 1)) - snprintf(buf + strlen(buf), buf_size - strlen(buf), - "%04d-%02d-%02d %02d:%02d:%02d ", - log_entry->tm.tm_year + 1900, - log_entry->tm.tm_mon + 1, - log_entry->tm.tm_mday, log_entry->tm.tm_hour, - log_entry->tm.tm_min, log_entry->tm.tm_sec); - - /* SSID */ - if (strlen(buf) < (buf_size - 1)) - snprintf(buf + strlen(buf), buf_size - strlen(buf), - log_entry->ssid); - - /* sends/receives */ - if (strlen(buf) < (buf_size - 1)) - snprintf(buf + strlen(buf), buf_size - strlen(buf), - (log_entry->isTX) ? " sends " : " receives "); - - /* frame type */ - if (strlen(buf) < (buf_size - 1)) - snprintf(buf + strlen(buf), buf_size - strlen(buf), - log_entry->frame_type); - - if (strlen(buf) < (buf_size - 1)) - snprintf(buf + strlen(buf), buf_size - strlen(buf), - (log_entry->isTX) ? " to " : " from "); - - /* STA MAC address */ - if (strlen(buf) < (buf_size - 1)) { - if (!MAC_ADDR_EQUAL(log_entry->sta_addr, MAC_ADDR_ZERO)) - snprintf(buf + strlen(buf), - buf_size - strlen(buf), - "%02X%02X%02X%02X%02X%02X", - log_entry->sta_addr[0], - log_entry->sta_addr[1], - log_entry->sta_addr[2], - log_entry->sta_addr[3], - log_entry->sta_addr[4], - log_entry->sta_addr[5]); - else - snprintf(buf + strlen(buf), - buf_size - strlen(buf), "%s", - "No-STA-Addr"); - } - - /* frame body */ - if (strlen(buf) < (buf_size - 1)) - snprintf(buf + strlen(buf), buf_size - strlen(buf), - "["); - - for (index = 0; index < dataLen; index++) { - if (strlen(buf) < (buf_size - 1)) - snprintf(buf + strlen(buf), - buf_size - strlen(buf), "%02X", - pData[index]); - } - - if (strlen(buf) < (buf_size - 1)) - snprintf(buf + strlen(buf), buf_size - strlen(buf), - "]\n"); - - write_size = strlen(buf); - if ((pCtrl->diag_log_file_offset + write_size) > - DIAG_LOG_FILE_SIZE_MAX) { - pCtrl->diag_log_file_offset = - 0; /* overwrite from file start */ - RtmpOSFileSeek(fd, 0); - } - RtmpOSFileWrite(fd, buf, write_size); - pCtrl->diag_log_file_offset += write_size; - - memset(buf, 0, buf_size); - memset(log_entry, 0, sizeof(DIAG_LOG_ENTRY)); - - /* update read_idx */ - pCtrl->diag_log_read_idx = - (pCtrl->diag_log_read_idx + 1) % DIAG_LOG_BUFF_SIZE; - } - - RtmpOSFileClose(fd); - RtmpOSFSInfoChange(&osFSInfo, FALSE); -} - -void DiagMiniportMMRequest(PRTMP_ADAPTER pAd, UCHAR *pData, UINT Length) -{ - PHEADER_802_11 pHdr = NULL; - BSS_STRUCT *pMbssEntry = NULL; - MAC_TABLE_ENTRY *pMacTblEntry = NULL; - DIAG_FRAME_INFO diag_info; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if (!pData || (Length == 0)) - return; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - if (pCtrl->diag_enable == 0) - return; - - memset(&diag_info, 0, sizeof(diag_info)); - pHdr = (PHEADER_802_11)pData; - pMacTblEntry = MacTableLookup(pAd, pHdr->Addr1); - - if (IS_VALID_ENTRY(pMacTblEntry) && IS_ENTRY_CLIENT(pMacTblEntry) && - VALID_MBSS(pAd, pMacTblEntry->func_tb_idx) && - (pMacTblEntry->func_tb_idx < pAd->ApCfg.BssidNum)) - pMbssEntry = &pAd->ApCfg.MBSSID[pMacTblEntry->func_tb_idx]; - else { - UCHAR apidx, first_up_idx = 0xFF; - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - if ((pAd->ApCfg.MBSSID[apidx].wdev.if_dev != NULL) && - (RTMP_OS_NETDEV_STATE_RUNNING( - pAd->ApCfg.MBSSID[apidx].wdev.if_dev))) { - if (RTMPEqualMemory( - pAd->ApCfg.MBSSID[apidx].wdev.bssid, - pHdr->Addr2, MAC_ADDR_LEN)) { - pMbssEntry = &pAd->ApCfg.MBSSID[apidx]; - break; - } - if (first_up_idx == 0xFF) - first_up_idx = apidx; - } - } - if ((pMbssEntry == NULL) && (first_up_idx != 0xFF)) - pMbssEntry = &pAd->ApCfg.MBSSID[first_up_idx]; - } - if (pMbssEntry) { - diag_info.ssid = pMbssEntry->Ssid; - diag_info.ssid_len = pMbssEntry->SsidLen; - diag_info.isTX = 1; - diag_info.band = (pAd->LatchRfRegs.Channel > 14) ? 1 : 0; - diag_info.pData = pData; - diag_info.dataLen = Length; - diag_frame_cache(&diag_info, pCtrl); - } else - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, Error, no UP ap interface!!!\n", __func__)); -} - -void DiagDevRxMgmtFrm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - DIAG_FRAME_INFO diag_info; - MAC_TABLE_ENTRY *pEntry = NULL; - BSS_STRUCT *pMbss = NULL; - FRAME_CONTROL *FC = NULL; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if (!pRxBlk) - return; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - if (pCtrl->diag_enable == 0) - return; - - /* frame type & SubType check */ - FC = (FRAME_CONTROL *)pRxBlk->FC; - if ((FC->Type != FC_TYPE_MGMT) || - ((FC->SubType != SUBTYPE_BEACON) && - (FC->SubType != SUBTYPE_PROBE_REQ) && - (FC->SubType != SUBTYPE_PROBE_RSP) && - (FC->SubType != SUBTYPE_ATIM) && - (FC->SubType != SUBTYPE_DISASSOC) && - (FC->SubType != SUBTYPE_DEAUTH) && - (FC->SubType != SUBTYPE_ASSOC_REQ) && - (FC->SubType != SUBTYPE_ASSOC_RSP) && - (FC->SubType != SUBTYPE_REASSOC_REQ) && - (FC->SubType != SUBTYPE_REASSOC_RSP) && - (FC->SubType != SUBTYPE_AUTH))) { - return; - } - - memset(&diag_info, 0, sizeof(diag_info)); - diag_info.isTX = 0; - diag_info.band = (pAd->LatchRfRegs.Channel > 14) ? 1 : 0; - diag_info.pData = pRxBlk->pData; - diag_info.dataLen = pRxBlk->DataSize; - - if (VALID_WCID(pRxBlk->wcid)) - pEntry = &pAd->MacTab.Content[pRxBlk->wcid]; - else - pEntry = MacTableLookup(pAd, pRxBlk->Addr2); - - if ((IS_VALID_ENTRY(pEntry)) && (IS_ENTRY_CLIENT(pEntry)) && - VALID_MBSS(pAd, pEntry->func_tb_idx) && - (pEntry->func_tb_idx < pAd->ApCfg.BssidNum)) - pMbss = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; - else { - UCHAR apidx, first_up_idx = 0xFF; - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - if ((pAd->ApCfg.MBSSID[apidx].wdev.if_dev != NULL) && - (RTMP_OS_NETDEV_STATE_RUNNING( - pAd->ApCfg.MBSSID[apidx].wdev.if_dev))) { - if (RTMPEqualMemory( - pAd->ApCfg.MBSSID[apidx].wdev.bssid, - pRxBlk->Addr1, MAC_ADDR_LEN)) { - pMbss = &pAd->ApCfg.MBSSID[apidx]; - break; - } - if (first_up_idx == 0xFF) - first_up_idx = apidx; - } - } - if ((pMbss == NULL) && (first_up_idx != 0xFF)) - pMbss = &pAd->ApCfg.MBSSID[first_up_idx]; - } - if (pMbss) { - diag_info.ssid = pMbss->Ssid; - diag_info.ssid_len = pMbss->SsidLen; - diag_frame_cache(&diag_info, pCtrl); - } else - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, Error, no UP ap interface!!!\n", __func__)); -} - -#ifdef SNIFFER_SUPPORT -void DiagDevRxCntlFrm(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk) -{ - DIAG_FRAME_INFO diag_info; - MAC_TABLE_ENTRY *pEntry = NULL; - BSS_STRUCT *pMbss = NULL; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - FRAME_CONTROL *FC = NULL; - - if (!pRxBlk) - return; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - if (pCtrl->diag_enable == 0) - return; - - FC = (FRAME_CONTROL *)pRxBlk->FC; - - DIAG_PRINT(DBG_LVL_ERROR, ("%s, type:%d, subtype:%d\n", __func__, - FC->Type, FC->SubType)); - - /* frame type & subtype check */ - if ((FC->Type != FC_TYPE_CNTL) || - ((FC->SubType != SUBTYPE_RTS) && (FC->SubType != SUBTYPE_CTS) && - (FC->SubType != SUBTYPE_ACK))) { - return; - } - - memset(&diag_info, 0, sizeof(diag_info)); - diag_info.isTX = 0; - diag_info.band = (pAd->LatchRfRegs.Channel > 14) ? 1 : 0; - diag_info.pData = pRxBlk->pData; - diag_info.dataLen = pRxBlk->DataSize; - - if (VALID_WCID(pRxBlk->wcid)) - pEntry = &pAd->MacTab.Content[pRxBlk->wcid]; - else - pEntry = MacTableLookup(pAd, pHeader->Addr2); - - if ((IS_VALID_ENTRY(pEntry)) && (IS_ENTRY_CLIENT(pEntry)) && - VALID_MBSS(pAd, pEntry->func_tb_idx) && - (pEntry->func_tb_idx < pAd->ApCfg.BssidNum)) - pMbss = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; - else { - UCHAR apidx, first_up_idx = 0xFF; - - for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) { - if ((pAd->ApCfg.MBSSID[apidx].wdev.if_dev != NULL) && - (RTMP_OS_NETDEV_STATE_RUNNING( - pAd->ApCfg.MBSSID[apidx].wdev.if_dev))) { - if (RTMPEqualMemory( - pAd->ApCfg.MBSSID[apidx].wdev.bssid, - pHeader->Addr1, MAC_ADDR_LEN)) { - pMbss = &pAd->ApCfg.MBSSID[apidx]; - break; - } - if (first_up_idx == 0xFF) - first_up_idx = apidx; - } - } - if ((pMbss == NULL) && (first_up_idx != 0xFF)) - pMbss = &pAd->ApCfg.MBSSID[first_up_idx]; - } - if (pMbss) { - diag_info.ssid = pMbss->Ssid; - diag_info.ssid_len = pMbss->SsidLen; - diag_frame_cache(&diag_info, pCtrl); - } else - DIAG_PRINT(DBG_LVL_ERROR, - ("%s, Error, no UP ap interface!!!\n", __func__)); -} -#endif - -void DiagBcnTx(RTMP_ADAPTER *pAd, BSS_STRUCT *pMbss, UCHAR *pBeaconFrame, - ULONG FrameLen) -{ - DIAG_FRAME_INFO diag_info; - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if (!pMbss || !pBeaconFrame || (FrameLen == 0)) - return; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - if (pCtrl->diag_enable == 0) - return; - - memset(&diag_info, 0, sizeof(diag_info)); - diag_info.isTX = 1; - diag_info.band = (pAd->LatchRfRegs.Channel > 14) ? 1 : 0; - diag_info.ssid = pMbss->Ssid; - diag_info.ssid_len = pMbss->SsidLen; - diag_info.pData = pBeaconFrame; - diag_info.dataLen = FrameLen; - diag_frame_cache(&diag_info, pCtrl); - - DIAG_PRINT(DBG_LVL_WARN, ("%s !\n", __func__)); -} - -void DiagApMlmeOneSecProc(PRTMP_ADAPTER pAd) -{ - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if ((!pCtrl) || (!pCtrl->init_flag)) - return; - - if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) { - pCtrl->busy_time = 0; - DIAG_PRINT(DBG_LVL_WARN, - ("%s SCAN conflict with Diag channel Occupancy\n", - __func__)); - } else - pCtrl->busy_time = - (pAd->OneSecMibBucket.ChannelBusyTime[BAND0]) >> - 10; /* translate us to ms */ - - DIAG_PRINT(DBG_LVL_TRACE, - ("%s update band:%d busy_time:%d ms by OneSecMibBucket\n", - __func__, pCtrl->diag_band, pCtrl->busy_time)); - - /* For diag_log/association_error file write in MLME task */ - MlmeEnqueue(pAd, WIFI_DAIG_STATE_MACHINE, 0, 0, NULL, 0); -} - -BOOLEAN DiagProcInit(PRTMP_ADAPTER pAd) -{ - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; - - if (!pCtrl) { - DIAG_PRINT(DBG_LVL_ERROR, - ("%s pDiagCtrl not allocate\n", __func__)); - return FALSE; - } - - if (wdev && (wdev->channel > 14)) - pCtrl->diag_band = DIAG_BAND_5G; - else - pCtrl->diag_band = DIAG_BAND_2G; - - DIAG_PRINT(DBG_LVL_OFF, ("%s diag for diag_band %d channel:%d\n", - __func__, pCtrl->diag_band, wdev->channel)); - NdisAllocateSpinLock(pAd, &(pCtrl->diag_log_lock)); - NdisAllocateSpinLock(pAd, &(pCtrl->assoc_error_lock)); - DiagVarDirMk(pCtrl->diag_band); - DiagProcDirMk(pCtrl->diag_band); - DiagProcEntryInit(pCtrl->diag_band, pAd); - - pCtrl->init_flag = TRUE; - - return TRUE; -} - -BOOLEAN DiagProcExit(PRTMP_ADAPTER pAd) -{ - DIAG_CTRL *pCtrl = pAd->pDiagCtrl; - - if (!pCtrl) - return FALSE; - - DIAG_PRINT(DBG_LVL_OFF, ("%s pAd:%p\n", __func__, pAd)); - pCtrl->init_flag = FALSE; - /* stop diag_log handling */ - pCtrl->diag_enable = 0; - OS_WAIT(500); - - DiagProcEntryDeinit(pCtrl->diag_band); - NdisFreeSpinLock(&pCtrl->diag_log_lock); - NdisFreeSpinLock(&pCtrl->assoc_error_lock); - - DiagProcDirRm(pCtrl->diag_band); - - return TRUE; -} - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/inf_ppa.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/inf_ppa.c deleted file mode 100644 index 956642d2a0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/inf_ppa.c +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - inf_ppa.c - - Abstract: - Only for Infineon PPA Direct path feature. - - - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- - carella 06-01-2010 Created - - */ - -#ifdef INF_PPA_SUPPORT - -#include "rt_config.h" -#include -#include - -extern INT rt28xx_send_packets(struct sk_buff *skb_p, - struct net_device *net_dev); - -int ifx_ra_start_xmit(struct net_device *rx_dev, struct net_device *tx_dev, - struct sk_buff *skb, int len) -{ - if (tx_dev != NULL) { - SET_OS_PKT_NETDEV(skb, tx_dev); - rt28xx_send_packets(skb, tx_dev); - } else if (rx_dev != NULL) { - skb->protocol = eth_type_trans(skb, skb->dev); - netif_rx(skb); - } else - dev_kfree_skb_any(skb); - - return 0; -} -#endif /* INF_PPA_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/mt_fwdump.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/mt_fwdump.c deleted file mode 100644 index 8eb442b3fe..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/mt_fwdump.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_fwdump.c -*/ - -#include "rt_config.h" - -#ifdef FW_DUMP_SUPPORT - -#define FW_DUMP_NAME "fwdump_" -#define FW_DUMP_DIR "MTxxxx" - -static int fwdumpopen(struct inode *inode, struct file *fp) -{ - struct _RTMP_ADAPTER *pAd = 0; -#if (KERNEL_VERSION(3, 10, 0) > LINUX_VERSION_CODE) - pAd = (struct _RTMP_ADAPTER *)PDE(fp->f_dentry->d_inode)->data; -#else - pAd = (struct _RTMP_ADAPTER *)PDE_DATA(file_inode(fp)); -#endif - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s fw_dump_size=%d\n", __func__, pAd->fw_dump_size)); - pAd->fw_dump_read = 0; - return 0; -} - -static ssize_t fwdumpread(struct file *fp, char __user *buf, size_t cnt, - loff_t *pos) -{ - UINT32 len = cnt; - struct _RTMP_ADAPTER *pAd = 0; -#if (KERNEL_VERSION(3, 10, 0) > LINUX_VERSION_CODE) - pAd = (struct _RTMP_ADAPTER *)PDE(fp->f_dentry->d_inode)->data; -#else - pAd = (struct _RTMP_ADAPTER *)PDE_DATA(file_inode(fp)); -#endif - - if ((pAd->fw_dump_read + cnt) > pAd->fw_dump_size) - len = (pAd->fw_dump_size - pAd->fw_dump_read); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("cnt=%zu len=%d fw_dump_read=%d\n", (unsigned long)cnt, len, - pAd->fw_dump_read)); - os_move_mem(buf, pAd->fw_dump_buffer + pAd->fw_dump_read, len); - pAd->fw_dump_read += len; - return len; -} - -static ssize_t fwdumpwrite(struct file *fp, const char __user *buf, size_t cnt, - loff_t *pos) -{ - return 0; -} - -static const struct file_operations fops_dump = { - .owner = THIS_MODULE, - .open = fwdumpopen, - .read = fwdumpread, - .write = fwdumpwrite, -}; - -BOOLEAN FWDumpProcInit(VOID *ptr) -{ - struct _RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ptr; - POS_COOKIE pCookie; - - pCookie = (POS_COOKIE)pAd->OS_Cookie; - os_move_mem(pCookie->fwdump_dir_name, FW_DUMP_DIR, sizeof(FW_DUMP_DIR)); - return TRUE; -} - -BOOLEAN FWDumpProcCreate(VOID *ptr, PCHAR suffix) -{ - struct _RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ptr; - POS_COOKIE pCookie; - CHAR fwdump_file_name[20]; - - pCookie = (POS_COOKIE)pAd->OS_Cookie; - - if (!pCookie->proc_fwdump_dir) { - pCookie->proc_fwdump_dir = - proc_mkdir(pCookie->fwdump_dir_name, NULL); - - if (pCookie->proc_fwdump_dir) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Create dir /proc/%s successfully\n", - __func__, FW_DUMP_DIR)); - else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Create %s fail\n", __func__, - FW_DUMP_DIR)); - return FALSE; - } - } - - if (!pCookie->proc_fwdump_file) { - strcpy(fwdump_file_name, FW_DUMP_NAME); - strcat(fwdump_file_name, pAd->net_dev->name); - strcat(fwdump_file_name, suffix); - pCookie->proc_fwdump_file = - proc_create_data(fwdump_file_name, 0644, - pCookie->proc_fwdump_dir, &fops_dump, - (VOID *)pAd); - - if (pCookie->proc_fwdump_file) - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Create file /proc/%s/%s successfully\n", - __func__, pCookie->fwdump_dir_name, - fwdump_file_name)); - else { - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Create %s fail\n", __func__, - fwdump_file_name)); - return FALSE; - } - } - - return TRUE; -} - -VOID FWDumpProcRemove(VOID *ptr) -{ - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)ptr; - CHAR fwdump_file_name[20]; - POS_COOKIE pCookie; - - pCookie = (POS_COOKIE)pAd->OS_Cookie; - strcpy(fwdump_file_name, FW_DUMP_NAME); - strcat(fwdump_file_name, pAd->net_dev->name); - - if (pCookie->proc_fwdump_file) - remove_proc_entry(fwdump_file_name, pCookie->proc_fwdump_dir); - - if (pCookie->proc_fwdump_dir) - remove_proc_entry(pCookie->fwdump_dir_name, NULL); -} - -INT os_set_fwdump_path(VOID *ptr1, VOID *ptr2) -{ - struct _RTMP_ADAPTER *pAd = (struct _RTMP_ADAPTER *)ptr1; - RTMP_STRING *arg = (RTMP_STRING *)ptr2; - POS_COOKIE pCookie; - - pCookie = (POS_COOKIE)pAd->OS_Cookie; - os_move_mem(pCookie->fwdump_dir_name, arg, 10); - return TRUE; -} - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/mt_wifi_mtd.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/mt_wifi_mtd.c deleted file mode 100644 index e79613b7c0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/mt_wifi_mtd.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - Module Name: - mt_wifi_mtd.c - -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(CONFIG_MIPS) -#include -#endif - -int mt_mtd_write_nm_wifi(char *name, loff_t to, size_t len, const u_char *buf) -{ - int ret = -1; - size_t rdlen, wrlen; - struct mtd_info *mtd; - struct erase_info ei; - u_char *bak = NULL; - - mtd = get_mtd_device_nm(name); - if (IS_ERR(mtd)) - return -1; - - if (len > mtd->erasesize) { - put_mtd_device(mtd); - return -E2BIG; - } - - bak = kmalloc(mtd->erasesize, GFP_KERNEL); - if (bak == NULL) { - put_mtd_device(mtd); - return -ENOMEM; - } - - ret = mtd_read(mtd, 0, mtd->erasesize, &rdlen, bak); - - if (ret != 0) { - put_mtd_device(mtd); - kfree(bak); - return ret; - } - - if (rdlen != mtd->erasesize) - printk("warning: ra_mtd_write: rdlen is not equal to erasesize\n"); - - memcpy(bak + to, buf, len); - - ei.addr = 0; - ei.len = mtd->erasesize; - - ret = mtd_erase(mtd, &ei); - - if (ret != 0) { - put_mtd_device(mtd); - kfree(bak); - return ret; - } - - ret = mtd_write(mtd, 0, mtd->erasesize, &wrlen, bak); - - put_mtd_device(mtd); - kfree(bak); - return ret; -} -EXPORT_SYMBOL(mt_mtd_write_nm_wifi); - -int mt_mtd_read_nm_wifi(char *name, loff_t from, size_t len, u_char *buf) -{ - int ret; - size_t rdlen; - struct mtd_info *mtd; - - mtd = get_mtd_device_nm(name); - if (IS_ERR(mtd)) - return -1; - - ret = mtd_read(mtd, from, len, &rdlen, buf); - - if (rdlen != len) - printk("warning: ra_mtd_read_nm: rdlen is not equal to len\n"); - - put_mtd_device(mtd); - - return ret; -} -EXPORT_SYMBOL(mt_mtd_read_nm_wifi); diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/multi_main_dev.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/multi_main_dev.c deleted file mode 100644 index 5ab4cd801c..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/multi_main_dev.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#ifdef MULTI_INF_SUPPORT - -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" -#include -#ifdef INTELP6_SUPPORT -#include "rt_config.h" -#endif -/* Index 0 for Card_1, Index 1 for Card_2 */ -VOID *adapt_list[MAX_NUM_OF_INF] = { NULL }; - -int multi_inf_adapt_reg(VOID *pAd) -{ - int status = 0; -#ifdef INTELP6_SUPPORT - UINT32 Value; - PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER)pAd; - RTMP_IO_READ32(pAdapter, STRAP_STA, &Value); - - if (GET_11N_ONLY(Value) && (adapt_list[0] == NULL)) - adapt_list[0] = pAd; - else if (!GET_11N_ONLY(Value) && (adapt_list[1] == NULL)) - adapt_list[1] = pAd; - else if (GET_11N_ONLY(Value) && (adapt_list[0] != NULL)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Both chips are 11N only !\n", __func__)); - status = NDIS_STATUS_FAILURE; - return status; - } else -#endif - if (adapt_list[0] == NULL) - adapt_list[0] = pAd; - else if (adapt_list[1] == NULL) - adapt_list[1] = pAd; - else if (adapt_list[2] == NULL) - adapt_list[2] = pAd; - else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): adapt_list assign error !\n", __func__)); - status = NDIS_STATUS_FAILURE; - } - - return status; -} - -int multi_inf_adapt_unreg(VOID *pAd) -{ - int status = 0; - - if (adapt_list[0] == pAd) - adapt_list[0] = NULL; - else if (adapt_list[1] == pAd) - adapt_list[1] = NULL; - else if (adapt_list[2] == pAd) - adapt_list[2] = NULL; - else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): adapt_list assign error !\n", __func__)); - status = NDIS_STATUS_FAILURE; - } - - return status; -} - -int multi_inf_get_count(void) -{ - int count = 0; /* use number 0 as default */ - int idx; - - for (idx = 0; idx < MAX_NUM_OF_INF; idx++) { - if (adapt_list[idx] != NULL) - count++; - } - - if (count == 0) - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): failed to find nonempty adapt_list!\n", - __func__)); - return count; -} - -int multi_inf_get_idx(VOID *pAd) -{ - int idx = 0; /* use index 0 as default */ - - for (idx = 0; idx < MAX_NUM_OF_INF; idx++) { - if (pAd == adapt_list[idx]) - return idx; - } - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): failed to find the index in adapt_list!\n", __func__)); - return idx; -} -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(multi_inf_get_idx); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ - -/* Driver module load/unload function */ -static int __init wifi_drv_init_module(void) -{ - int status = 0; - -#ifdef RTMP_RBUS_SUPPORT - status = wbsys_module_init(); - - if (status) - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Register RBUS device driver failed(%d)!\n", status)); - -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef RTMP_PCI_SUPPORT - status = rt_pci_init_module(); - - if (status) - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Register PCI device driver failed(%d)!\n", status)); - -#endif /* RTMP_PCI_SUPPORT */ - - /* Add out-of-memory notifier */ - - return status; -} - -static void __exit wifi_drv_cleanup_module(void) -{ - /* Del out-of-memory notifier */ - -#ifdef RTMP_PCI_SUPPORT - rt_pci_cleanup_module(); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Unregister PCI device driver\n")); -#endif /* RTMP_PCI_SUPPORT */ -#ifdef RTMP_RBUS_SUPPORT - wbsys_module_exit(); -#endif /* RTMP_RBUS_SUPPORT */ -} - -module_init(wifi_drv_init_module); -module_exit(wifi_drv_cleanup_module); - -#endif /* MULTI_INF_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/pci_main_dev.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/pci_main_dev.c deleted file mode 100644 index 40ab0abb11..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/pci_main_dev.c +++ /dev/null @@ -1,596 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - pci_main_dev.c - - Abstract: - Create and register network interface for PCI based chipsets in Linux platform. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#define RTMP_MODULE_OS - -#include "rtmp_comm.h" -#include "rtmp_chip.h" -#include "rt_os_util.h" -#include "rt_os_net.h" -#include -#include "rt_config.h" - -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) -#define DEVEXIT -#define DEVEXIT_P -#define DEVINIT -#define DEVINITDATA -#else -#define DEVEXIT __devexit -#define DEVEXIT_P __devexit_p -#define DEVINIT __devinit -#define DEVINITDATA __devinitdata -#endif - -#ifdef MEM_ALLOC_INFO_SUPPORT -extern MEM_INFO_LIST MemInfoList; -extern MEM_INFO_LIST PktInfoList; -#endif /*MEM_ALLOC_INFO_SUPPORT*/ -/** - * @addtogroup hif - * @{ - * @code PCI Device ID - */ - -static struct pci_device_id rt_pci_tbl[] DEVINITDATA = { - -#ifdef MT7615 - { PCI_DEVICE(MTK_PCI_VENDOR_ID, NIC7615_PCIe_DEVICE_ID) }, - { PCI_DEVICE(MTK_PCI_VENDOR_ID, NIC7616_PCIe_DEVICE_ID) }, - { PCI_DEVICE(MTK_PCI_VENDOR_ID, NIC761A_PCIe_DEVICE_ID) }, - { PCI_DEVICE(MTK_PCI_VENDOR_ID, NIC7611_PCIe_DEVICE_ID) }, -#endif /* MT7615 */ - {} /* terminate list */ -}; - -MODULE_DEVICE_TABLE(pci, rt_pci_tbl); - -/** @endcode */ -/** @} */ - -/** - * @addtogroup hif HIF operation - * @{ - * @name PCIe initialzation - * @{ - */ - -/*************************************************************************** - * - * PCI device initialization related procedures. - * - ***************************************************************************/ -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) -#ifdef CONFIG_PM - -#if (KERNEL_VERSION(2, 6, 10) >= LINUX_VERSION_CODE) -#define pm_message_t u32 -#endif - -static int rt_pci_suspend(struct pci_dev *pci_dev, pm_message_t state) -{ - struct net_device *net_dev = pci_get_drvdata(pci_dev); - VOID *pAd = NULL; - INT32 retval = 0; - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("===>%s()\n", __func__)); - - if (net_dev == NULL) - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("net_dev == NULL!\n")); - else { - ULONG IfNum; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - /* we can not use IFF_UP because ra0 down but ra1 up */ - /* and 1 suspend/resume function for 1 module, not for each interface */ - /* so Linux will call suspend/resume function once */ - RTMP_DRIVER_VIRTUAL_INF_NUM_GET(pAd, &IfNum); - - if (IfNum > 0) { - /* avoid users do suspend after interface is down */ - /* stop interface */ - netif_carrier_off(net_dev); - netif_stop_queue(net_dev); - /* mark device as removed from system and therefore no longer available */ - netif_device_detach(net_dev); - RTMP_DRIVER_PCI_SUSPEND(pAd); - RT_MOD_HNAT_DEREG(net_dev); - RT_MOD_DEC_USE_COUNT(); - } - } - -#if (KERNEL_VERSION(2, 6, 10) < LINUX_VERSION_CODE) - /* - * reference to http://vovo2000.com/type-lab/linux/kernel-api/linux-kernel-api.html - * enable device to generate PME# when suspended - * pci_choose_state(): Choose the power state of a PCI device to be suspended - */ - retval = pci_enable_wake(pci_dev, pci_choose_state(pci_dev, state), 1); - /* save the PCI configuration space of a device before suspending */ - pci_save_state(pci_dev); - /* disable PCI device after use */ - pci_disable_device(pci_dev); - retval = pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state)); -#endif - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("<===%s()\n", __func__)); - return retval; -} - -static int rt_pci_resume(struct pci_dev *pci_dev) -{ - struct net_device *net_dev = pci_get_drvdata(pci_dev); - VOID *pAd = NULL; -#if (KERNEL_VERSION(2, 6, 10) < LINUX_VERSION_CODE) - INT32 retval; - /* Set the power state of a PCI device - * - * PCI has 4 power states, DO (normal) ~ D3(less power) - * you can find that in include/linux/pci.h - * #define PCI_D0 ((pci_power_t __force) 0) - * #define PCI_D1 ((pci_power_t __force) 1) - * #define PCI_D2 ((pci_power_t __force) 2) - * #define PCI_D3hot ((pci_power_t __force) 3) - * #define PCI_D3cold ((pci_power_t __force) 4) - * #define PCI_UNKNOWN ((pci_power_t __force) 5) - * #define PCI_POWER_ERROR ((pci_power_t __force) -1) - */ - retval = pci_set_power_state(pci_dev, PCI_D0); - /* restore the saved state of a PCI device */ - pci_restore_state(pci_dev); - - /* initialize device before it's used by a driver */ - if (pci_enable_device(pci_dev)) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("pci enable fail!\n")); - return 0; - } - -#endif - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("===>%s()\n", __func__)); - - if (net_dev == NULL) - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("net_dev == NULL!\n")); - else - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd != NULL) { - ULONG IfNum; - /* - * we can not use IFF_UP because ra0 down but ra1 up - * and 1 suspend/resume function for 1 module, not for each interface - * so Linux will call suspend/resume function once - */ - RTMP_DRIVER_VIRTUAL_INF_NUM_GET(pAd, &IfNum); - - if (IfNum > 0) - /* if (VIRTUAL_IF_NUM(pAd) > 0) */ - { - /* mark device as attached from system and restart if needed */ - netif_device_attach(net_dev); - /* increase MODULE use count */ - RT_MOD_INC_USE_COUNT(); - RT_MOD_HNAT_REG(net_dev); - /* RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); */ - /* RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); */ - RTMP_DRIVER_PCI_RESUME(pAd); - netif_start_queue(net_dev); - netif_carrier_on(net_dev); - netif_wake_queue(net_dev); - } - } - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("<=== %s()\n", __func__)); - return 0; -} -#endif /* CONFIG_PM */ -#endif - -/* - * PCI device probe & initialization function - */ -#ifdef INTELP6_SUPPORT -#ifdef MULTI_INF_SUPPORT -int g_AdapCount; -#endif -#endif -static int DEVINIT rt_pci_probe(struct pci_dev *pdev, - const struct pci_device_id *pci_id) -{ - void *pAd = NULL, *handle; - struct net_device *net_dev; - char *print_name; - unsigned long csr_addr; - int rv = 0; - RTMP_OS_NETDEV_OP_HOOK netDevHook; - unsigned long OpMode; - RT_CMD_PCIE_INIT pci_config; - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("===> %s()\n", __func__)); - /*PCIDevInit============================================== */ - /* wake up and enable device */ - rv = pci_enable_device(pdev); - - if (rv != 0) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("Enable PCI device failed, errno=%d!\n", rv)); - return rv; - } - -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) - print_name = (char *)pci_name(pdev); -#else - print_name = pdev->slot_name; -#endif /* LINUX_VERSION_CODE */ - -#if defined(PLATFORM_M_STB) - if (IS_ENABLED(CONFIG_ARM64) && (!IS_ENABLED(CONFIG_ZONE_DMA))) { - if ((rv = pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) != 0) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("set DMA mask failed!errno=%d\n", rv)); - return rv; - } - - if ((rv = pci_set_consistent_dma_mask(pdev, - DMA_BIT_MASK(64))) != 0) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("set DMA consistent mask failed!errno=%d\n", - rv)); - return rv; - } - } else -#endif - if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) { - /* - * pci_set_consistent_dma_mask() will always be able to set the same - * or a smaller mask as pci_set_dma_mask() - */ - pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); - } else { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("set DMA mask failed!errno=%d\n", rv)); - goto err_out; - } - - /*msi request*/ -#ifdef CONFIG_WIFI_MSI_SUPPORT - if (RtmpOsPciMsiEnable(pdev) != 0) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("Request MSI resource failed, use INTx!\n")); - } -#endif /*CONFIG_WIFI_MSI_SUPPORT*/ - rv = pci_request_regions(pdev, print_name); - - if (rv != 0) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("Request PCI resource failed, errno=%d!\n", rv)); - goto err_out; - } - - /* map physical address to virtual address for accessing register */ - csr_addr = (unsigned long)ioremap(pci_resource_start(pdev, 0), - pci_resource_len(pdev, 0)); - - if (!csr_addr) { - MTWF_LOG( - DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("ioremap failed for device %s, region 0x%lX @ 0x%lX\n", - print_name, (ULONG)pci_resource_len(pdev, 0), - (ULONG)pci_resource_start(pdev, 0))); - goto err_out_free_res; - } else { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("%s: at 0x%lx, VA 0x%lx, IRQ %d.\n", print_name, - (ULONG)pci_resource_start(pdev, 0), (ULONG)csr_addr, - pdev->irq)); - } - - /* Set DMA master */ - pci_set_master(pdev); - - /* Allocate RTMP_ADAPTER adapter structure */ - os_alloc_mem(NULL, (UCHAR **)&handle, sizeof(struct os_cookie)); - - if (handle == NULL) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s(): Allocate memory for os handle failed!\n", - __func__)); - goto err_out_iounmap; - } - - memset(handle, 0, sizeof(struct os_cookie)); - ((POS_COOKIE)handle)->pci_dev = pdev; - ((POS_COOKIE)handle)->pDev = &(pdev->dev); -#ifdef OS_ABL_FUNC_SUPPORT - { - RTMP_PCI_CONFIG PciConfig; - - PciConfig.ConfigVendorID = PCI_VENDOR_ID; - /* get DRIVER operations */ - RTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, NULL, &PciConfig, NULL); - } -#endif /* OS_ABL_FUNC_SUPPORT */ - /* we may need the pdev for allocate structure of "RTMP_ADAPTER" */ - rv = RTMPAllocAdapterBlock(handle, &pAd); - - if (rv != NDIS_STATUS_SUCCESS) - goto err_out_iounmap; - - RTMP_DRIVER_PCI_CSR_SET(pAd, csr_addr); - RTMP_DRIVER_PCIE_INIT(pAd, &pci_config, pdev); - - if (pci_config.pci_init_succeed != TRUE) - goto err_out_free_radev; - - /*NetDevInit============================================== */ - net_dev = RtmpPhyNetDevInit(pAd, &netDevHook); - - if (net_dev == NULL) - goto err_out_free_radev; - - /* Here are the net_device structure with pci-bus specific parameters. */ - net_dev->irq = pdev->irq; - net_dev->base_addr = csr_addr; - pci_set_drvdata(pdev, net_dev); - /* +++Add by shiang for jeffrey debug */ -#ifdef LINUX - net_dev->features &= (~NETIF_F_HIGHDMA); -#endif /* LINUX */ - /* ---Add by shiang for jeffrey debug */ - RTMP_DRIVER_CHIP_PREPARE(pAd); - /*All done, it's time to register the net device to linux kernel. */ - /* Register this device */ - RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode); - rv = RtmpOSNetDevAttach(OpMode, net_dev, &netDevHook); - - if (rv) - goto err_out_free_netdev; - -#ifdef PRE_ASSIGN_MAC_ADDR - { - UCHAR mac_addr[MAC_ADDR_LEN]; - - RTMP_DRIVER_MAC_ADDR_GET(pAd, &mac_addr[0]); - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("@%s MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n", - __func__, mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5])); - /* Set up the Mac address */ - RtmpOSNetDevAddrSet(OpMode, net_dev, &mac_addr[0], NULL); - } -#endif /* PRE_ASSIGN_MAC_ADDR */ -#ifdef INTELP6_SUPPORT -#ifdef MULTI_INF_SUPPORT - g_AdapCount++; - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("pci probe count=%d\n", g_AdapCount)); -#endif -#endif -#ifdef WIFI_DIAG - DiagCtrlAlloc(pAd); -#endif - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("<=%s()\n", __func__)); -#ifdef CREATE_ALL_INTERFACE_AT_INIT -#ifdef MBSS_SUPPORT - RT28xx_MBSS_Init(pAd, (PNET_DEV)net_dev); - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("[ARRIS MOD] MT7615E MBSS Initialized\n")); -#endif /* MBSS_SUPPORT */ -#endif - return 0; /* probe ok */ - /* --------------------------- ERROR HANDLE --------------------------- */ -err_out_free_netdev: - RtmpOSNetDevFree(net_dev); -#ifdef MEM_ALLOC_INFO_SUPPORT - { - UINT32 memalctotal, pktalctotal; - - memalctotal = ShowMemAllocInfo(); - pktalctotal = ShowPktAllocInfo(); - - if ((memalctotal != 0) || (pktalctotal != 0)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error: Memory leak!!\n")); - ASSERT(0); - } - - MIListExit(&MemInfoList); - MIListExit(&PktInfoList); - } -#endif /* MEM_ALLOC_INFO_SUPPORT */ -err_out_free_radev: - /* free RTMP_ADAPTER strcuture and os_cookie*/ - RTMPFreeAdapter(pAd); -err_out_iounmap: - iounmap((void *)(csr_addr)); - pci_release_regions(pdev); -err_out_free_res: - pci_release_regions(pdev); -err_out: - pci_disable_device(pdev); - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("<=== %s() failed with rv = %d!\n", __func__, rv)); - return -ENODEV; /* probe fail */ -} - -static VOID DEVEXIT rt_pci_remove(struct pci_dev *pci_dev) -{ -#ifdef INTELP6_SUPPORT -#ifdef MULTI_INF_SUPPORT - static UINT16 pci_dev_count = MAX_NUM_OF_INF; - - while (pci_dev_count) { -#endif -#endif - PNET_DEV net_dev; - VOID *pAd = NULL; - ULONG csr_addr; -#ifdef INTELP6_SUPPORT -#ifdef MULTI_INF_SUPPORT - pci_dev_count--; - pAd = adapt_list[pci_dev_count]; - if (pAd == NULL) - continue; - else - pci_dev = rtmp_get_pci_dev(pAd); -#endif -#endif - net_dev = pci_get_drvdata(pci_dev); - csr_addr = net_dev->base_addr; -#ifndef INTELP6_SUPPORT - GET_PAD_FROM_NET_DEV(pAd, net_dev); -#endif - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("===> %s()\n", __func__)); - - if (pAd != NULL) { -#ifdef WIFI_DIAG - DiagCtrlFree(pAd); -#endif - /* Unregister/Free all allocated net_device. */ - RtmpPhyNetDevExit(pAd, net_dev); - /* Free RTMP_ADAPTER related structures. */ - RtmpRaDevCtrlExit(pAd); - /* Unmap CSR base address */ - iounmap((char *)(csr_addr)); - /* release memory region */ - pci_release_regions(pci_dev); - } else { - /* Unregister network device */ - RtmpOSNetDevDetach(net_dev); - /* Unmap CSR base address */ - iounmap((char *)(net_dev->base_addr)); - /* release memory region */ - pci_release_regions(pci_dev); - } -#ifdef CONFIG_WIFI_MSI_SUPPORT - if (pci_dev->msi_enabled) - RtmpOsPciMsiDisable(pci_dev); -#endif /*CONFIG_WIFI_MSI_SUPPORT*/ - - /* Free the root net_device */ - RtmpOSNetDevFree(net_dev); -#ifdef INTELP6_SUPPORT -#ifdef MULTI_INF_SUPPORT - g_AdapCount--; - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("In remove, pci probe count=%d\n", g_AdapCount)); - } -#endif -#endif -#ifdef MEM_ALLOC_INFO_SUPPORT -#ifdef INTELP6_SUPPORT -#ifdef MULTI_INF_SUPPORT - if (g_AdapCount == 0) -#endif -#endif - { - UINT32 memalctotal, pktalctotal; - - memalctotal = ShowMemAllocInfo(); - pktalctotal = ShowPktAllocInfo(); - - if ((memalctotal != 0) || (pktalctotal != 0)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error: Memory leak!!\n")); - ASSERT(0); - } - - MIListExit(&MemInfoList); - MIListExit(&PktInfoList); - } -#endif /* MEM_ALLOC_INFO_SUPPORT */ -} - -/* - * Our PCI driver structure - */ -static struct pci_driver rt_pci_driver = { - name: RTMP_DRV_NAME, - id_table: rt_pci_tbl, - probe: rt_pci_probe, -#if LINUX_VERSION_CODE >= 0x20412 - remove: DEVEXIT_P(rt_pci_remove), -#else - remove: __devexit(rt_pci_remove), -#endif - -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) -#ifdef CONFIG_PM - suspend: rt_pci_suspend, - resume: rt_pci_resume, -#endif -#endif -}; - -/* - * Driver module load/unload function - */ -int __init rt_pci_init_module(void) -{ - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("register %s\n", RTMP_DRV_NAME)); -#ifdef MEM_ALLOC_INFO_SUPPORT - MemInfoListInital(); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - /* - * MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, ("DriverVersion: 2.7.0.2-Beta-121007\n" - * "\tBBP:120824\n" - * "\tRF :120813\n")); - */ -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) - return pci_register_driver(&rt_pci_driver); -#else - return pci_module_init(&rt_pci_driver); -#endif -} - -void __exit rt_pci_cleanup_module(void) -{ - pci_unregister_driver(&rt_pci_driver); -} - -#ifdef MT7622_FPGA -late_initcall(rt_pci_init_module); -#endif /*MT7622_FPGA*/ - -/** @} */ -/** @} */ -#ifndef MULTI_INF_SUPPORT -module_init(rt_pci_init_module); -module_exit(rt_pci_cleanup_module); - -#endif /* MULTI_INF_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rbus_main_dev.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rbus_main_dev.c deleted file mode 100644 index 2c7f151a69..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rbus_main_dev.c +++ /dev/null @@ -1,218 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rbus_main_dev.c - - Abstract: - Create and register network interface for RBUS based chipsets in linux platform. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifdef RTMP_RBUS_SUPPORT - -#define RTMP_MODULE_OS - -#include "rt_config.h" - -static struct net_device *rt2880_dev; -static struct platform_device *wbsys_pdev; - -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) -extern int (*ra_classifier_init_func)(void); -extern void (*ra_classifier_release_func)(void); -extern struct proc_dir_entry *proc_ptr, *proc_ralink_wl_video; -#endif - -#ifdef MEM_ALLOC_INFO_SUPPORT -extern MEM_INFO_LIST MemInfoList; -extern MEM_INFO_LIST PktInfoList; -#endif /*MEM_ALLOC_INFO_SUPPORT*/ - -int __init wbsys_module_init(void) -{ - struct net_device *net_dev; - ULONG csr_addr; - INT rv; - void *handle = NULL; - RTMP_ADAPTER *pAd; - unsigned int dev_irq; - RTMP_OS_NETDEV_OP_HOOK netDevHook; - UINT32 Value; - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("===> rt2880_probe\n")); -#ifdef MEM_ALLOC_INFO_SUPPORT - MemInfoListInital(); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - /*RtmpRaBusInit============================================ */ - /* map physical address to virtual address for accessing register */ - csr_addr = (unsigned long)ioremap(RTMP_MAC_CSR_ADDR, RTMP_MAC_CSR_LEN); - dev_irq = RTMP_IRQ_NUM; - /*RtmpDevInit============================================== */ - /* Allocate RTMP_ADAPTER adapter structure */ - os_alloc_mem(NULL, (UCHAR **)&handle, sizeof(struct os_cookie)); - - if (!handle) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("Allocate memory for os_cookie failed!\n")); - goto err_out; - } - - os_zero_mem(handle, sizeof(struct os_cookie)); -#ifdef OS_ABL_FUNC_SUPPORT - /* get DRIVER operations */ - RTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, NULL, NULL, NULL); -#endif /* OS_ABL_FUNC_SUPPORT */ - rv = RTMPAllocAdapterBlock(handle, (VOID **)&pAd); - - if (rv != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - (" RTMPAllocAdapterBlock != NDIS_STATUS_SUCCESS\n")); - os_free_mem(handle); - goto err_out; - } - - /* Here are the RTMP_ADAPTER structure with rbus-bus specific parameters. */ - pAd->PciHif.CSRBaseAddress = (PUCHAR)csr_addr; - RTMP_IO_READ32(pAd, TOP_HCR, &Value); - pAd->ChipID = Value; - /*assign pdev to handle before RtmpRaDevCtrlInit*/ - RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_RBUS); - /*NetDevInit============================================== */ - net_dev = RtmpPhyNetDevInit(pAd, &netDevHook); - - if (net_dev == NULL) - goto err_out_free_radev; - - /* Here are the net_device structure with pci-bus specific parameters. */ - net_dev->irq = dev_irq; /* Interrupt IRQ number */ - net_dev->base_addr = - csr_addr; /* Save CSR virtual address and irq to device structure */ - /*is not a regular method*/ - ((POS_COOKIE)handle)->pci_dev = (VOID *)wbsys_pdev; - ((POS_COOKIE)handle)->pDev = &net_dev->dev; - RTMP_DRIVER_CHIP_PREPARE(pAd); - /*All done, it's time to register the net device to kernel. */ - /* Register this device */ - rv = RtmpOSNetDevAttach(pAd->OpMode, net_dev, &netDevHook); - - if (rv) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("failed to call RtmpOSNetDevAttach(), rv=%d!\n", rv)); - goto err_out_free_netdev; - } - - /* due to we didn't have any hook point when do module remove, we use this static as our hook point. */ - rt2880_dev = net_dev; - wl_proc_init(); - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("%s: at CSR addr 0x%lx, IRQ %ld.\n", net_dev->name, - (ULONG)csr_addr, (long int)net_dev->irq)); - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("<=== rt2880_probe\n")); -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) - proc_ptr = proc_ralink_wl_video; - - if (ra_classifier_init_func != NULL) - ra_classifier_init_func(); - -#endif - return 0; -err_out_free_netdev: - RtmpOSNetDevFree(net_dev); -#ifdef MEM_ALLOC_INFO_SUPPORT - { - UINT32 memalctotal, pktalctotal; - - memalctotal = ShowMemAllocInfo(); - pktalctotal = ShowPktAllocInfo(); - - if ((memalctotal != 0) || (pktalctotal != 0)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error: Memory leak!!\n")); - ASSERT(0); - } - - MIListExit(&MemInfoList); - MIListExit(&PktInfoList); - } -#endif /* MEM_ALLOC_INFO_SUPPORT */ -err_out_free_radev: - /* free RTMP_ADAPTER strcuture and os_cookie*/ - RTMPFreeAdapter(pAd); -err_out: - return -ENODEV; -} - -VOID __exit wbsys_module_exit(void) -{ - struct net_device *net_dev = rt2880_dev; - RTMP_ADAPTER *pAd; - - if (net_dev == NULL) - return; - - /* pAd = net_dev->priv; */ - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd != NULL) { - RtmpPhyNetDevExit(pAd, net_dev); - RtmpRaDevCtrlExit(pAd); - } else - RtmpOSNetDevDetach(net_dev); - - /* Free the root net_device. */ - RtmpOSNetDevFree(net_dev); -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) - proc_ptr = proc_ralink_wl_video; - - if (ra_classifier_release_func != NULL) - ra_classifier_release_func(); - -#endif - wl_proc_exit(); -#ifdef MEM_ALLOC_INFO_SUPPORT - { - UINT32 memalctotal, pktalctotal; - - memalctotal = ShowMemAllocInfo(); - pktalctotal = ShowPktAllocInfo(); - - if ((memalctotal != 0) || (pktalctotal != 0)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error: Memory leak!!\n")); - ASSERT(0); - } - - MIListExit(&MemInfoList); - MIListExit(&PktInfoList); - } -#endif /* MEM_ALLOC_INFO_SUPPORT */ -} - -/** @} */ -/** @} */ - -#ifndef MULTI_INF_SUPPORT -module_init(wbsys_module_init); -module_exit(wbsys_module_exit); -#endif /* MULTI_INF_SUPPORT */ - -#endif /* RTMP_RBUS_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rbus_prop_dev.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rbus_prop_dev.c deleted file mode 100644 index 61a346ea2a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rbus_prop_dev.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rbus_prop_dev.c - - Abstract: - Create and register network interface for RBUS based chipsets in linux platform. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ -#ifdef RTMP_RBUS_SUPPORT -#define RTMP_MODULE_OS - -#include "rt_config.h" - -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) -extern int (*ra_classifier_init_func)(void); -extern void (*ra_classifier_release_func)(void); -extern struct proc_dir_entry *proc_ptr, *proc_ralink_wl_video; -#endif - -#ifdef MEM_ALLOC_INFO_SUPPORT -extern MEM_INFO_LIST MemInfoList; -extern MEM_INFO_LIST PktInfoList; -#endif /*MEM_ALLOC_INFO_SUPPORT*/ - -static struct pci_device_id mt_rbus_tbl[] DEVINITDATA = { - -#ifdef MT7622 - { PCI_DEVICE(0x14c3, 0x7622) }, -#endif /* MT7622 */ - {} /* terminate list */ -}; - -MODULE_DEVICE_TABLE(pci, mt_rbus_tbl); - -#define RBUS_TSSI_CTRL_OFFSET 0x34 -#define RBUS_PA_LNA_CTRL_OFFSET 0x38 - -int rbus_tssi_set(struct _RTMP_ADAPTER *ad, UCHAR mode) -{ - struct pci_dev *dev = ((POS_COOKIE)ad->OS_Cookie)->pci_dev; - - pci_write_config_byte(dev, RBUS_TSSI_CTRL_OFFSET, mode); - return 0; -} - -int rbus_pa_lna_set(struct _RTMP_ADAPTER *ad, UINT32 mode) -{ - struct pci_dev *dev = ((POS_COOKIE)ad->OS_Cookie)->pci_dev; - - pci_write_config_dword(dev, RBUS_PA_LNA_CTRL_OFFSET, mode); - return 0; -} - -static int DEVINIT mt_rbus_probe(struct pci_dev *pdev, - const struct pci_device_id *pci_id) -{ - struct net_device *net_dev; - ULONG csr_addr; - INT rv; - void *handle = NULL; - RTMP_ADAPTER *pAd; - RTMP_OS_NETDEV_OP_HOOK netDevHook; - UINT32 Value; - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("===> rt2880_probe\n")); - - if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) { - /* - * pci_set_consistent_dma_mask() will always be able to set the same - * or a smaller mask as pci_set_dma_mask() - */ - pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); - } else { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("set DMA mask failed\n")); - goto err_out; - } - -#ifdef MEM_ALLOC_INFO_SUPPORT - MemInfoListInital(); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - /* map physical address to virtual address for accessing register */ - csr_addr = (unsigned long)ioremap(pci_resource_start(pdev, 0), - pci_resource_len(pdev, 0)); - /* Allocate RTMP_ADAPTER adapter structure */ - os_alloc_mem(NULL, (UCHAR **)&handle, sizeof(struct os_cookie)); - - if (!handle) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("Allocate memory for os_cookie failed!\n")); - goto err_out; - } - - os_zero_mem(handle, sizeof(struct os_cookie)); -#ifdef OS_ABL_FUNC_SUPPORT - /* get DRIVER operations */ - RTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, NULL, NULL, NULL); -#endif /* OS_ABL_FUNC_SUPPORT */ - rv = RTMPAllocAdapterBlock(handle, (VOID **)&pAd); - - if (rv != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - (" RTMPAllocAdapterBlock != NDIS_STATUS_SUCCESS\n")); - os_free_mem(handle); - goto err_out; - } - - /* Here are the RTMP_ADAPTER structure with rbus-bus specific parameters. */ - pAd->PciHif.CSRBaseAddress = (PUCHAR)csr_addr; - RTMP_IO_READ32(pAd, TOP_HCR, &Value); - pAd->ChipID = Value; - /*is not a regular method*/ - ((POS_COOKIE)handle)->pci_dev = (VOID *)pdev; - ((POS_COOKIE)handle)->pDev = &pdev->dev; - RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_RBUS); - net_dev = RtmpPhyNetDevInit(pAd, &netDevHook); - - if (net_dev == NULL) - goto err_out_free_radev; - - /*assign net_dev as pdev's privdate*/ - pci_set_drvdata(pdev, net_dev); - /* Here are the net_device structure with pci-bus specific parameters. */ - net_dev->irq = pdev->irq; /* Interrupt IRQ number */ - net_dev->base_addr = - csr_addr; /* Save CSR virtual address and irq to device structure */ - - RTMP_DRIVER_CHIP_PREPARE(pAd); - /*All done, it's time to register the net device to kernel. */ - /* Register this device */ - rv = RtmpOSNetDevAttach(pAd->OpMode, net_dev, &netDevHook); - - if (rv) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("failed to call RtmpOSNetDevAttach(), rv=%d!\n", rv)); - goto err_out_free_netdev; - } - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("%s: at CSR addr 0x%lx, IRQ %ld.\n", net_dev->name, - (ULONG)csr_addr, (long int)net_dev->irq)); - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("<=== %s()\n", __func__)); -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) - proc_ptr = proc_ralink_wl_video; - - if (ra_classifier_init_func != NULL) - ra_classifier_init_func(); - -#endif - return 0; -err_out_free_netdev: - RtmpOSNetDevFree(net_dev); -#ifdef MEM_ALLOC_INFO_SUPPORT - { - UINT32 memalctotal, pktalctotal; - - memalctotal = ShowMemAllocInfo(); - pktalctotal = ShowPktAllocInfo(); - - if ((memalctotal != 0) || (pktalctotal != 0)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error: Memory leak!!\n")); - ASSERT(0); - } - - MIListExit(&MemInfoList); - MIListExit(&PktInfoList); - } -#endif /* MEM_ALLOC_INFO_SUPPORT */ -err_out_free_radev: - /* free RTMP_ADAPTER strcuture and os_cookie*/ - RTMPFreeAdapter(pAd); -err_out: - return -ENODEV; -} - -static VOID DEVEXIT mt_rbus_remove(struct pci_dev *pci_dev) -{ - struct net_device *net_dev = pci_get_drvdata(pci_dev); - RTMP_ADAPTER *pAd; - PUINT8 csr_addr = NULL; - - if (net_dev == NULL) - return; - - /* pAd = net_dev->priv; */ - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd != NULL) { - csr_addr = pAd->PciHif.CSRBaseAddress; - RtmpPhyNetDevExit(pAd, net_dev); - RtmpRaDevCtrlExit(pAd); - iounmap(csr_addr); - } else - RtmpOSNetDevDetach(net_dev); - - /* Free the root net_device. */ - RtmpOSNetDevFree(net_dev); -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) - proc_ptr = proc_ralink_wl_video; - - if (ra_classifier_release_func != NULL) - ra_classifier_release_func(); - -#endif -#ifdef MEM_ALLOC_INFO_SUPPORT - { - UINT32 memalctotal, pktalctotal; - - memalctotal = ShowMemAllocInfo(); - pktalctotal = ShowPktAllocInfo(); - - if ((memalctotal != 0) || (pktalctotal != 0)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error: Memory leak!!\n")); - ASSERT(0); - } - - MIListExit(&MemInfoList); - MIListExit(&PktInfoList); - } -#endif /* MEM_ALLOC_INFO_SUPPORT */ -} - -/* - * Our PCI driver structure - */ -static struct pci_driver mt_rbus_driver = { - name: "mt_rbus", - id_table: mt_rbus_tbl, - probe: mt_rbus_probe, - remove: DEVEXIT_P(mt_rbus_remove), -}; - -/* - * Driver module load/unload function - */ -int __init wbsys_module_init(void) -{ - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("register %s\n", RTMP_DRV_NAME)); -#ifdef MEM_ALLOC_INFO_SUPPORT - MemInfoListInital(); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - return pci_register_driver(&mt_rbus_driver); -} - -void __exit wbsys_module_exit(void) -{ - pci_unregister_driver(&mt_rbus_driver); -} - -/** @} */ -/** @} */ - -#ifndef MULTI_INF_SUPPORT -module_init(wbsys_module_init); -module_exit(wbsys_module_exit); -#endif /* MULTI_INF_SUPPORT */ - -#endif /* RTMP_RBUS_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_linux.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_linux.c deleted file mode 100644 index d45eedea36..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_linux.c +++ /dev/null @@ -1,4777 +0,0 @@ -/**************************************************************************** - * - * Module Name: - * UTIL/rt_linux.c - * - * Abstract: - * All functions provided from OS module are put here. - * - * Note: - * 1. Can not use sizeof() for a structure with any parameter included - * by any compile option, such as RTMP_ADAPTER. - * - * Because the RTMP_ADAPTER size in the UTIL module is different with - * DRIVER/NETIF. - * - * 2. Do not use any structure with any parameter included by PCI/USB/RBUS/ - * AP/STA. - * - * Because the structure size in the UTIL module is different with - * DRIVER/NETIF. - * - * 3. Do not use any structure defined in DRIVER module, EX: pAd. - * So we can do module partition. - * - * Revision History: - * Who When What - * --------- ---------- ------------------------------------------- - * - ***************************************************************************/ - -#define RTMP_MODULE_OS -#define RTMP_MODULE_OS_UTIL - -#include "rtmp_comm.h" -#include "rtmp_osabl.h" -#include "rt_os_util.h" -#include "security/dot11i_wpa.h" -#include -#include -#include -#include -#include -#include -#include -#include "rt_os_net.h" -#include "rt_config.h" -#ifdef MEM_ALLOC_INFO_SUPPORT -#include "meminfo_list.h" -#endif /* MEM_ALLOC_INFO_SUPPORT */ - -#ifdef CONFIG_FAST_NAT_SUPPORT -#include "hwnat/ra_nat.h" -#endif /*CONFIG_FAST_NAT_SUPPORT*/ - -#ifdef VLAN_SUPPORT -#include -#endif /*VLAN_SUPPORT*/ - -/* TODO */ -#undef RT_CONFIG_IF_OPMODE_ON_AP -#undef RT_CONFIG_IF_OPMODE_ON_STA - -#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT) -#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode) if (__OpMode == OPMODE_AP) -#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode) if (__OpMode == OPMODE_STA) -#else -#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode) -#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode) -#endif - -#if (KERNEL_VERSION(2, 6, 0) <= LINUX_VERSION_CODE) -#if (KERNEL_VERSION(2, 6, 3) > LINUX_VERSION_CODE) -static inline void *netdev_priv(struct net_device *dev) -{ - return dev->priv; -} -#endif -#elif (KERNEL_VERSION(2, 4, 27) > LINUX_VERSION_CODE) -static inline void *netdev_priv(struct net_device *dev) -{ - return dev->priv; -} -#endif - -/* - * Used for backward compatible with previous linux version which - * used "net_device->priv" as device driver structure hooking point - */ -static inline void netdev_priv_set(struct net_device *dev, void *priv) -{ -#if (KERNEL_VERSION(2, 6, 0) <= LINUX_VERSION_CODE) -#if (KERNEL_VERSION(2, 6, 3) > LINUX_VERSION_CODE) - dev->priv = priv; -#endif -#elif (KERNEL_VERSION(2, 4, 27) > LINUX_VERSION_CODE) - dev->priv = priv; -#endif -} - -int DebugLevel = DBG_LVL_ERROR; - -UINT32 DebugCategory = - DBG_CAT_EN_ALL_MASK & ~(0x1 << DBG_CAT_TX) & ~(0x1 << DBG_CAT_PS); - -UINT32 DebugSubCategory[DBG_LVL_MAX + 1][32] = { - { - DBG_SUBCAT_EN_ALL_MASK, /* bit_0, for DBG_CAT_INIT */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_1, for DBG_CAT_HW */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_2, for DBG_CAT_FW */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_3, for DBG_CAT_HIF */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_4, for DBG_CAT_FPGA */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_5, for DBG_CAT_TEST */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_6, for DBG_CAT_RA */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_7, for DBG_CAT_AP */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_8, for DBG_CAT_CLIENT */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_9, for DBG_CAT_TX */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_10, for DBG_CAT_RX */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_11, for DBG_CAT_CFG */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_12, for DBG_CAT_MLME */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_13, for DBG_CAT_PROTO */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_14, for DBG_CAT_SEC */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_15, for DBG_CAT_PS */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_16, for DBG_CAT_POWER */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_17, for DBG_CAT_COEX */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_18, for DBG_CAT_P2P */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_19 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_20 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_21 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_22 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_23 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_24 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_25 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_26 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_27 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_28 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_29 */ - DBG_SUBCAT_EN_ALL_MASK, /* bit_30, for DBG_CAT_RSV1 */ - DBG_SUBCAT_EN_ALL_MASK /* bir_31, for DBG_CAT_RSV2 */ - }, - { [0 ... 31] = DBG_SUBCAT_EN_ALL_MASK }, - { 0 }, - { 0 }, - { 0 }, - { 0 }, - { 0 } -}; - -#ifdef OS_ABL_FUNC_SUPPORT -ULONG RTPktOffsetData = 0, RTPktOffsetLen = 0, RTPktOffsetCB = 0; -#endif /* OS_ABL_FUNC_SUPPORT */ - -#ifdef RTMP_RBUS_SUPPORT -#if defined(CONFIG_RA_CLASSIFIER) || defined(CONFIG_RA_CLASSIFIER_MODULE) -extern int (*ra_classifier_hook_rx)(struct sk_buff *skb, unsigned long cycle); -extern volatile unsigned long classifier_cur_cycle; -#endif /* CONFIG_RA_CLASSIFIER */ -#endif /* RTMP_RBUS_SUPPORT */ - -#ifdef MEM_ALLOC_INFO_SUPPORT -MEM_INFO_LIST MemInfoList; -MEM_INFO_LIST PktInfoList; -#endif /* MEM_ALLOC_INFO_SUPPORT */ - -#ifdef VENDOR_FEATURE4_SUPPORT -ULONG OS_NumOfMemAlloc = 0, OS_NumOfMemFree = 0; -#endif /* VENDOR_FEATURE4_SUPPORT */ -#ifdef VENDOR_FEATURE2_SUPPORT -ULONG OS_NumOfPktAlloc = 0, OS_NumOfPktFree = 0; -#endif /* VENDOR_FEATURE2_SUPPORT */ - -/* - * the lock will not be used in TX/RX - * path so throughput should not be impacted - */ -BOOLEAN FlgIsUtilInit = FALSE; -OS_NDIS_SPIN_LOCK UtilSemLock; - -BOOLEAN RTMP_OS_Alloc_RscOnly(VOID *pRscSrc, UINT32 RscLen); -BOOLEAN RTMP_OS_Remove_Rsc(LIST_HEADER *pRscList, VOID *pRscSrc); - -/* - * ======================================================================== - * Routine Description: - * Initialize something in UTIL module. - * - * Arguments: - * None - * - * Return Value: - * None - * ======================================================================== - */ -VOID RtmpUtilInit(VOID) -{ - if (FlgIsUtilInit == FALSE) { - OS_NdisAllocateSpinLock(&UtilSemLock); - FlgIsUtilInit = TRUE; - } -} - -/* timeout -- ms */ -static inline VOID __RTMP_SetPeriodicTimer(IN OS_NDIS_MINIPORT_TIMER *pTimer, - IN unsigned long timeout) -{ - if (timer_pending(pTimer)) - return; - - timeout = ((timeout * OS_HZ) / 1000); - pTimer->expires = jiffies + timeout; - add_timer(pTimer); -} - -/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */ -static inline VOID __RTMP_OS_Init_Timer(IN VOID *pReserved, - IN OS_NDIS_MINIPORT_TIMER *pTimer, - IN TIMER_FUNCTION function, - IN PVOID data) -{ - if (!timer_pending(pTimer)) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - timer_setup(pTimer, function, 0); -#else - init_timer(pTimer); - pTimer->data = (unsigned long)data; - pTimer->function = function; -#endif - } -} - -static inline VOID __RTMP_OS_Add_Timer(IN OS_NDIS_MINIPORT_TIMER *pTimer, - IN unsigned long timeout) -{ - if (timer_pending(pTimer)) - return; - - timeout = ((timeout * OS_HZ) / 1000); - pTimer->expires = jiffies + timeout; - add_timer(pTimer); -} - -static inline VOID __RTMP_OS_Mod_Timer(IN OS_NDIS_MINIPORT_TIMER *pTimer, - IN unsigned long timeout) -{ - timeout = ((timeout * OS_HZ) / 1000); - mod_timer(pTimer, jiffies + timeout); -} - -static inline VOID __RTMP_OS_Del_Timer(IN OS_NDIS_MINIPORT_TIMER *pTimer, - OUT BOOLEAN *pCancelled) -{ - if (timer_pending(pTimer)) - *pCancelled = del_timer_sync(pTimer); - else - *pCancelled = TRUE; -} - -static inline VOID __RTMP_OS_Release_Timer(IN OS_NDIS_MINIPORT_TIMER *pTimer) -{ - /* nothing to do */ -} - -/* Unify all delay routine by using udelay */ -VOID RtmpusecDelay(ULONG usec) -{ - ULONG i; - - for (i = 0; i < (usec / 50); i++) - udelay(50); - - if (usec % 50) - udelay(usec % 50); -} - -VOID RtmpOsMsDelay(ULONG msec) -{ - mdelay(msec); -} - -void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time) -{ - time->u.LowPart = jiffies; -} - -void RTMP_GetCurrentSystemTick(ULONG *pNow) -{ - *pNow = jiffies; -} - -ULONG RTMPMsecsToJiffies(UINT32 m) -{ - return msecs_to_jiffies(m); -} - -NDIS_STATUS os_alloc_mem_suspend(IN VOID *pReserved, OUT UCHAR **mem, - IN ULONG size) -{ - *mem = (PUCHAR)kmalloc(size, GFP_KERNEL); - - if (*mem) { -#ifdef VENDOR_FEATURE4_SUPPORT - OS_NumOfMemAlloc++; -#endif /* VENDOR_FEATURE4_SUPPORT */ -#ifdef MEM_ALLOC_INFO_SUPPORT - MIListAddHead(&MemInfoList, size, *mem, - __builtin_return_address(0)); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - return NDIS_STATUS_SUCCESS; - } else - return NDIS_STATUS_FAILURE; -} - -PNDIS_PACKET RtmpOSNetPktAlloc(VOID *dummy, int size) -{ - struct sk_buff *skb; - /* Add 2 more bytes for ip header alignment */ - DEV_ALLOC_SKB(skb, (size + 2)); - return (PNDIS_PACKET)skb; -} - -PNDIS_PACKET RTMP_AllocateFragPacketBuffer(VOID *dummy, ULONG len) -{ - struct sk_buff *pkt; - - DEV_ALLOC_SKB(pkt, len); - - if (pkt == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("can't allocate frag rx %ld size packet\n", len)); - } - - return (PNDIS_PACKET)pkt; -} - -/* - * The allocated NDIS PACKET must be freed via RTMPFreeNdisPacket() - */ -NDIS_STATUS RTMPAllocateNdisPacket(IN VOID *pReserved, - OUT PNDIS_PACKET *ppPacket, - IN UCHAR *pHeader, IN UINT HeaderLen, - IN UCHAR *pData, IN UINT DataLen) -{ - struct sk_buff *pPacket; - /* Add LEN_CCMP_HDR + LEN_CCMP_MIC for PMF */ -#ifdef BB_SOC - pPacket = skbmgr_dev_alloc_skb4k(); -#else - DEV_ALLOC_SKB(pPacket, (HeaderLen + DataLen + RTMP_PKT_TAIL_PADDING + - LEN_CCMP_HDR + LEN_CCMP_MIC)); -#endif - if (pPacket == NULL) { - *ppPacket = NULL; -#ifdef DEBUG - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KERN_ERR "RTMPAllocateNdisPacket Fail\n\n")); -#endif - return NDIS_STATUS_FAILURE; - } - - /* Clone the frame content and update the length of packet */ - if ((HeaderLen > 0) && (pHeader != NULL)) - os_move_mem(pPacket->data, pHeader, HeaderLen); - - if ((DataLen > 0) && (pData != NULL)) - os_move_mem(pPacket->data + HeaderLen, pData, DataLen); - - skb_put(pPacket, HeaderLen + DataLen); - *ppPacket = (PNDIS_PACKET)pPacket; - return NDIS_STATUS_SUCCESS; -} - -/* - * ======================================================================== - * Description: - * This routine frees a miniport internally allocated NDIS_PACKET and its - * corresponding NDIS_BUFFER and allocated memory. - * ======================================================================== - */ -VOID RTMPFreeNdisPacket(VOID *pReserved, PNDIS_PACKET pPacket) -{ - if (pPacket) { - dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket)); - MEM_DBG_PKT_FREE_INC(pPacket); - pPacket = NULL; - } -} - -VOID RTMPFreeNdisPacketIRQ(VOID *pReserved, PNDIS_PACKET pPacket) -{ - if (pPacket) { - dev_kfree_skb_irq(RTPKT_TO_OSPKT(pPacket)); - MEM_DBG_PKT_FREE_INC(pPacket); - pPacket = NULL; - } -} - -void RTMP_QueryPacketInfo(IN PNDIS_PACKET pPacket, OUT PACKET_INFO *info, - OUT UCHAR **pSrcBufVA, OUT UINT *pSrcBufLen) -{ - info->BufferCount = 1; - info->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket); - info->PhysicalBufferCount = 1; - info->TotalPacketLength = GET_OS_PKT_LEN(pPacket); - *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket); - *pSrcBufLen = GET_OS_PKT_LEN(pPacket); -} - -PNDIS_PACKET ClonePacket(BOOLEAN moniflag, PNET_DEV ndev, PNDIS_PACKET pkt, - UCHAR *buf, ULONG sz) -{ - struct sk_buff *pRxPkt, *pClonedPkt; - - ASSERT(pkt); -#ifdef SNIFFER_SUPPORT - if (moniflag == FALSE) -#endif - ASSERT(sz < 1530); - pRxPkt = RTPKT_TO_OSPKT(pkt); - /* clone the packet */ - pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG); - - if (pClonedPkt) { - /* set the correct dataptr and data len */ - MEM_DBG_PKT_ALLOC_INC(pClonedPkt); - pClonedPkt->dev = pRxPkt->dev; - pClonedPkt->data = buf; - pClonedPkt->len = sz; - SET_OS_PKT_DATATAIL(pClonedPkt, pClonedPkt->len); - } - - return pClonedPkt; -} - -#ifdef MAP_TS_TRAFFIC_SUPPORT -PNDIS_PACKET CopyPacket(IN PNET_DEV if_dev, IN PNDIS_PACKET pkt) -{ - struct sk_buff *skb = NULL; - PNDIS_PACKET pkt_copy = NULL; - - skb = skb_copy(RTPKT_TO_OSPKT(pkt), GFP_ATOMIC); - - if (skb) { - skb->dev = if_dev; - pkt_copy = OSPKT_TO_RTPKT(skb); - } - - return pkt_copy; -} -#endif - -PNDIS_PACKET DuplicatePacket(PNET_DEV pNetDev, PNDIS_PACKET pPacket) -{ - struct sk_buff *skb; - PNDIS_PACKET pRetPacket = NULL; - USHORT DataSize; - UCHAR *pData; - - DataSize = (USHORT)GET_OS_PKT_LEN(pPacket); - pData = (PUCHAR)GET_OS_PKT_DATAPTR(pPacket); - skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG); - - if (skb) { - MEM_DBG_PKT_ALLOC_INC(skb); - skb->dev = pNetDev; - pRetPacket = OSPKT_TO_RTPKT(skb); - } - - return pRetPacket; -} - -PNDIS_PACKET duplicate_pkt_vlan(IN PNET_DEV pNetDev, IN USHORT VLAN_VID, - IN USHORT VLAN_Priority, IN PUCHAR pHeader802_3, - IN UINT HdrLen, IN PUCHAR pData, - IN ULONG DataSize, IN UCHAR *TPID) -{ - struct sk_buff *skb; - PNDIS_PACKET pPacket = NULL; - UINT16 VLAN_Size = 0; - INT skb_len = HdrLen + DataSize + 2; -#ifdef WIFI_VLAN_SUPPORT - - if (VLAN_VID != 0) - skb_len += LENGTH_802_1Q; - -#endif /* WIFI_VLAN_SUPPORT */ - skb = __dev_alloc_skb(skb_len, MEM_ALLOC_FLAG); - - if (skb != NULL) { - MEM_DBG_PKT_ALLOC_INC(skb); - skb_reserve(skb, 2); - - /* copy header (maybe with VLAN tag) */ - VLAN_Size = - VLAN_8023_Header_Copy(VLAN_VID, VLAN_Priority, - pHeader802_3, HdrLen, - GET_OS_PKT_DATATAIL(skb), TPID); - skb_put(skb, HdrLen + VLAN_Size); - /* copy data body */ - os_move_mem(GET_OS_PKT_DATATAIL(skb), pData, DataSize); - - skb_put(skb, DataSize); - skb->dev = pNetDev; - pPacket = OSPKT_TO_RTPKT(skb); - } - - return pPacket; -} - -#define TKIP_TX_MIC_SIZE 8 -PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(VOID *pReserved, PNDIS_PACKET pPacket) -{ - struct sk_buff *skb, *newskb; - - skb = RTPKT_TO_OSPKT(pPacket); - - if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) { - /* alloc a new skb and copy the packet */ - newskb = skb_copy_expand(skb, skb_headroom(skb), - TKIP_TX_MIC_SIZE, GFP_ATOMIC); - dev_kfree_skb_any(skb); - MEM_DBG_PKT_FREE_INC(skb); - - if (newskb == NULL) { - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Extend Tx.MIC for packet failed!, dropping packet!\n")); - return NULL; - } - - skb = newskb; - MEM_DBG_PKT_ALLOC_INC(skb); - } - - return OSPKT_TO_RTPKT(skb); -} - -/* - * ======================================================================== - * - * Routine Description: - * Send a L2 frame to upper daemon to trigger state machine - * - * Arguments: - * pAd - pointer to our pAdapter context - * - * Return Value: - * - * Note: - * - * ======================================================================== - */ -BOOLEAN -RTMPL2FrameTxAction(IN VOID *pCtrlBkPtr, IN PNET_DEV pNetDev, - IN RTMP_CB_8023_PACKET_ANNOUNCE _announce_802_3_packet, - IN UCHAR apidx, IN UCHAR *pData, IN UINT32 data_len, - IN UCHAR OpMode) -{ - struct sk_buff *skb = NULL; - - DEV_ALLOC_SKB(skb, (data_len + 2)); - - if (!skb) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Error! Can't allocate a skb.\n", __func__)); - return FALSE; - } - - SET_OS_PKT_NETDEV(skb, pNetDev); - /* 16 byte align the IP header */ - skb_reserve(skb, 2); - /* Insert the frame content */ - os_move_mem(GET_OS_PKT_DATAPTR(skb), pData, data_len); - /* End this frame */ - skb_put(GET_OS_PKT_TYPE(skb), data_len); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s doen\n", __func__)); - _announce_802_3_packet(pCtrlBkPtr, skb, OpMode); - return TRUE; -} - -PNDIS_PACKET ExpandPacket(IN VOID *pReserved, IN PNDIS_PACKET pPacket, - IN UINT32 ext_head_len, IN UINT32 ext_tail_len) -{ - struct sk_buff *skb, *newskb; - - skb = RTPKT_TO_OSPKT(pPacket); - - if (skb_cloned(skb) || (skb_headroom(skb) < ext_head_len) || - (skb_tailroom(skb) < ext_tail_len)) { - UINT32 head_len = (skb_headroom(skb) < ext_head_len) ? - ext_head_len : - skb_headroom(skb); - UINT32 tail_len = (skb_tailroom(skb) < ext_tail_len) ? - ext_tail_len : - skb_tailroom(skb); - /* alloc a new skb and copy the packet */ - newskb = skb_copy_expand(skb, head_len, tail_len, GFP_ATOMIC); - dev_kfree_skb_any(skb); - MEM_DBG_PKT_FREE_INC(skb); - - if (newskb == NULL) { - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Extend Tx buffer for WPI failed!, dropping packet!\n")); - return NULL; - } - - skb = newskb; - MEM_DBG_PKT_ALLOC_INC(skb); - } - - return OSPKT_TO_RTPKT(skb); -} - -VOID RtmpOsPktInit(IN PNDIS_PACKET pNetPkt, IN PNET_DEV pNetDev, - IN UCHAR *pData, IN USHORT DataSize) -{ - PNDIS_PACKET pRxPkt; - - pRxPkt = RTPKT_TO_OSPKT(pNetPkt); - SET_OS_PKT_NETDEV(pRxPkt, pNetDev); - SET_OS_PKT_DATAPTR(pRxPkt, pData); - SET_OS_PKT_LEN(pRxPkt, DataSize); - SET_OS_PKT_DATATAIL(pRxPkt, DataSize); -} - -void wlan_802_11_to_802_3_packet(IN PNET_DEV pNetDev, IN UCHAR OpMode, - IN USHORT VLAN_VID, IN USHORT VLAN_Priority, - IN PNDIS_PACKET pRxPacket, IN UCHAR *pData, - IN ULONG DataSize, IN PUCHAR pHeader802_3, - IN UCHAR *TPID) -{ - struct sk_buff *pOSPkt; - - ASSERT(pHeader802_3); - pOSPkt = RTPKT_TO_OSPKT(pRxPacket); - pOSPkt->dev = pNetDev; - pOSPkt->data = pData; - pOSPkt->len = DataSize; - SET_OS_PKT_DATATAIL(pOSPkt, pOSPkt->len); - - /* copy 802.3 header */ -#ifdef CONFIG_AP_SUPPORT - RT_CONFIG_IF_OPMODE_ON_AP(OpMode) - { - /* maybe insert VLAN tag to the received packet */ - UCHAR VLAN_Size = 0; - UCHAR *data_p; - - if (VLAN_VID != 0) - VLAN_Size = LENGTH_802_1Q; - - data_p = skb_push(pOSPkt, LENGTH_802_3 + VLAN_Size); - VLAN_8023_Header_Copy(VLAN_VID, VLAN_Priority, pHeader802_3, - LENGTH_802_3, data_p, TPID); - } -#endif /* CONFIG_AP_SUPPORT */ -} - -void hex_dump(char *str, UCHAR *pSrcBufVA, UINT SrcBufLen) -{ -#ifdef DBG - hex_dump_with_lvl(str, pSrcBufVA, SrcBufLen, DBG_LVL_TRACE); -#endif /* DBG */ -} - -void hex_dump_with_lvl(char *str, UCHAR *pSrcBufVA, UINT SrcBufLen, INT dbglvl) -{ -#ifdef DBG - unsigned char *pt; - int x; - - if (DebugLevel < dbglvl) - return; - - pt = pSrcBufVA; - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, dbglvl, - ("%s: %p, len = %d\n", str, pSrcBufVA, SrcBufLen)); - - for (x = 0; x < SrcBufLen; x++) { - if (x % 16 == 0) - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, dbglvl, - ("0x%04x : ", x)); - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, dbglvl, - ("%02x ", ((unsigned char)pt[x]))); - - if (x % 16 == 15) - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, dbglvl, ("\n")); - } - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, dbglvl, ("\n")); -#endif /* DBG */ -} - -#ifdef SYSTEM_LOG_SUPPORT -/* - * ======================================================================== - * - * Routine Description: - * Send log message through wireless event - * - * Support standard iw_event with IWEVCUSTOM. It is used below. - * - * iwreq_data.data.flags is used to store event_flag that is - * defined by user. iwreq_data.data.length is the length of the - * event log. - * - * The format of the event log is composed of the entry's MAC - * address and the desired log message (refer to - * pWirelessEventText). - * - * ex: 11:22:33:44:55:66 has associated successfully - * - * p.s. The requirement of Wireless Extension is v15 or newer. - * - * ======================================================================== - */ -VOID RtmpOsSendWirelessEvent(IN VOID *pAd, IN USHORT Event_flag, - IN PUCHAR pAddr, IN UCHAR wdev_idx, IN CHAR Rssi, - IN RTMP_OS_SEND_WLAN_EVENT pFunc) -{ -#if WIRELESS_EXT >= 15 - pFunc(pAd, Event_flag, pAddr, wdev_idx, Rssi); -#else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : The Wireless Extension MUST be v15 or newer.\n", - __func__)); -#endif /* WIRELESS_EXT >= 15 */ -} -#endif /* SYSTEM_LOG_SUPPORT */ - -#ifdef CONFIG_AP_SUPPORT -VOID SendSignalToDaemon(IN INT sig, RTMP_OS_PID pid, unsigned long pid_no) -{ -} -#endif /* CONFIG_AP_SUPPORT */ - -/******************************************************************************* - * File open/close related functions. - *******************************************************************************/ -RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode) -{ - struct file *filePtr; - - if (flag == RTMP_FILE_RDONLY) - flag = O_RDONLY; - else if (flag == RTMP_FILE_WRONLY) - flag = O_WRONLY; - else if (flag == RTMP_FILE_CREAT) - flag = O_CREAT; - else if (flag == RTMP_FILE_TRUNC) - flag = O_TRUNC; - - filePtr = filp_open(pPath, flag, 0); - - if (IS_ERR(filePtr)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): Error %ld opening %s\n", __func__, - -PTR_ERR(filePtr), pPath)); - } - - return (RTMP_OS_FD)filePtr; -} - -int RtmpOSFileClose(RTMP_OS_FD osfd) -{ - filp_close(osfd, NULL); - return 0; -} - -void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset) -{ - osfd->f_pos = offset; -} - -int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen) -{ - /* The object must have a read method */ -#if (KERNEL_VERSION(3, 19, 0) > LINUX_VERSION_CODE) - if (osfd->f_op && osfd->f_op->read) { - return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos); -#else - - if (osfd->f_mode & FMODE_CAN_READ) { - return kernel_read(osfd, pDataPtr, readLen, &osfd->f_pos); -#endif - } else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("no file read method\n")); - return -1; - } -} - -int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen) -{ -#if (KERNEL_VERSION(4, 1, 0) > LINUX_VERSION_CODE) - return osfd->f_op->write(osfd, pDataPtr, (size_t)writeLen, - &osfd->f_pos); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - return __kernel_write(osfd, pDataPtr, (size_t)writeLen, &osfd->f_pos); -#else - return __vfs_write(osfd, pDataPtr, (size_t)writeLen, &osfd->f_pos); -#endif -} - -static inline void __RtmpOSFSInfoChange(OS_FS_INFO *pOSFSInfo, BOOLEAN bSet) -{ - if (bSet) { - /* Save uid and gid used for filesystem access. */ - /* Set user and group to 0 (root) */ -#if (KERNEL_VERSION(2, 6, 29) > LINUX_VERSION_CODE) - pOSFSInfo->fsuid = current->fsuid; - pOSFSInfo->fsgid = current->fsgid; - current->fsuid = current->fsgid = 0; -#else -#ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS - kuid_t uid; - kgid_t gid; - - uid = current_fsuid(); - gid = current_fsgid(); - pOSFSInfo->fsuid = (int)uid.val; - pOSFSInfo->fsgid = (int)gid.val; -#else - /* pOSFSInfo->fsuid = (int)(current_fsuid()); */ - /* pOSFSInfo->fsgid = (int)(current_fsgid()); */ -#endif -#endif - pOSFSInfo->fs = get_fs(); - set_fs(KERNEL_DS); - } else { - set_fs(pOSFSInfo->fs); -#if (KERNEL_VERSION(2, 6, 29) > LINUX_VERSION_CODE) - current->fsuid = pOSFSInfo->fsuid; - current->fsgid = pOSFSInfo->fsgid; -#endif - } -} - -/******************************************************************************* - * Task create/management/kill related functions. - *******************************************************************************/ -static inline NDIS_STATUS __RtmpOSTaskKill(OS_TASK *pTask) -{ - int ret = NDIS_STATUS_FAILURE; - if (pTask->kthread_task) { - if (kthread_stop(pTask->kthread_task) == 0) { - pTask->kthread_task = NULL; - ret = NDIS_STATUS_SUCCESS; - } else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s kthread_task %s stop failed\n", __func__, - pTask->taskName)); - } - } else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s null kthread_task %s\n", __func__, - pTask->taskName)); - - return ret; -} - -static inline INT __RtmpOSTaskNotifyToExit(OS_TASK *pTask) -{ -#ifdef WIFI_DIAG - DiagDelPid(pTask); -#endif - return 0; -} - -static inline void __RtmpOSTaskCustomize(OS_TASK *pTask) -{ -#ifdef WIFI_DIAG - DiagAddPid(pTask); -#endif -} - -static inline NDIS_STATUS -__RtmpOSTaskAttach(IN OS_TASK *pTask, IN RTMP_OS_TASK_CALLBACK fn, IN ULONG arg) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - pTask->task_killed = 0; - - if (pTask->kthread_task) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s non-null kthread_task %s\n", __func__, - pTask->taskName)); - status = NDIS_STATUS_FAILURE; - goto done; - } - - pTask->kthread_task = - kthread_run((cast_fn)fn, (void *)arg, pTask->taskName); - - if (IS_ERR(pTask->kthread_task)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s kthread_run %s err %ld\n", __func__, - pTask->taskName, PTR_ERR(pTask->kthread_task))); - pTask->kthread_task = NULL; - status = NDIS_STATUS_FAILURE; - goto done; - } -done: - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s %s end %d\n", __func__, pTask->taskName, status)); - return status; -} - -static inline NDIS_STATUS __RtmpOSTaskInit(IN OS_TASK *pTask, - IN RTMP_STRING *pTaskName, - IN VOID *pPriv, - IN LIST_HEADER *pSemList) -{ - int len; - - ASSERT(pTask); - len = strlen(pTaskName); - len = len > (RTMP_OS_TASK_NAME_LEN - 1) ? (RTMP_OS_TASK_NAME_LEN - 1) : - len; - os_move_mem(&pTask->taskName[0], pTaskName, len); - pTask->priv = pPriv; - init_waitqueue_head(&(pTask->kthread_q)); - return NDIS_STATUS_SUCCESS; -} - -BOOLEAN __RtmpOSTaskWait(IN VOID *pReserved, IN OS_TASK *pTask, - IN INT32 *pStatus) -{ - RTMP_WAIT_EVENT_INTERRUPTIBLE((*pStatus), pTask); - - if ((pTask->task_killed == 1) || ((*pStatus) != 0)) - return FALSE; - - return TRUE; -} - -static UINT32 RtmpOSWirelessEventTranslate(IN UINT32 eventType) -{ - switch (eventType) { - case RT_WLAN_EVENT_CUSTOM: - eventType = IWEVCUSTOM; - break; - - case RT_WLAN_EVENT_CGIWAP: - eventType = SIOCGIWAP; - break; -#if WIRELESS_EXT > 17 - - case RT_WLAN_EVENT_ASSOC_REQ_IE: - eventType = IWEVASSOCREQIE; - break; -#endif /* WIRELESS_EXT */ -#if WIRELESS_EXT >= 14 - - case RT_WLAN_EVENT_SCAN: - eventType = SIOCGIWSCAN; - break; -#endif /* WIRELESS_EXT */ - - case RT_WLAN_EVENT_EXPIRED: - eventType = IWEVEXPIRED; - break; - - default: - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Unknown event: 0x%x\n", eventType)); - break; - } - - return eventType; -} - -int RtmpOSWrielessEventSend(IN PNET_DEV pNetDev, IN UINT32 eventType, - IN INT flags, IN PUCHAR pSrcMac, IN PUCHAR pData, - IN UINT32 dataLen) -{ - union iwreq_data wrqu; - /* translate event type */ - eventType = RtmpOSWirelessEventTranslate(eventType); - memset(&wrqu, 0, sizeof(wrqu)); - - if (flags > -1) - wrqu.data.flags = flags; - - if (pSrcMac) - memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN); - - if ((pData != NULL) && (dataLen > 0)) - wrqu.data.length = dataLen; - else - wrqu.data.length = 0; - - wireless_send_event(pNetDev, eventType, &wrqu, (char *)pData); - return 0; -} - -int RtmpOSWrielessEventSendExt(IN PNET_DEV pNetDev, IN UINT32 eventType, - IN INT flags, IN PUCHAR pSrcMac, IN PUCHAR pData, - IN UINT32 dataLen, IN UINT32 family) -{ - union iwreq_data wrqu; - /* translate event type */ - eventType = RtmpOSWirelessEventTranslate(eventType); - /* translate event type */ - memset(&wrqu, 0, sizeof(wrqu)); - - if (flags > -1) - wrqu.data.flags = flags; - - if (pSrcMac) - memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN); - - if ((pData != NULL) && (dataLen > 0)) - wrqu.data.length = dataLen; - - wrqu.addr.sa_family = family; - wireless_send_event(pNetDev, eventType, &wrqu, (char *)pData); - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * Check if the network interface is up. - * - * Arguments: - * *pDev - Network Interface - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOSNetDevIsUp(VOID *pDev) -{ - struct net_device *pNetDev = (struct net_device *)pDev; - - if ((pNetDev == NULL) || !(pNetDev->flags & IFF_UP)) - return FALSE; - - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Assign sys_handle data pointer (pAd) to the priv info structured linked to - * the OS network interface. - * - * Arguments: - * pDev - the os net device data structure - * pPriv - the sys_handle want to assigned - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsSetNetDevPriv(VOID *pDev, VOID *pPriv) -{ - struct mt_dev_priv *priv_info = NULL; - - priv_info = - (struct mt_dev_priv *)netdev_priv((struct net_device *)pDev); - priv_info->sys_handle = (VOID *)pPriv; - priv_info->priv_flags = 0; -} - -/* - * ======================================================================== - * Routine Description: - * Get wifi_dev from the priv info linked to OS network interface data structure. - * - * Arguments: - * pDev - the device - * - * Return Value: - * sys_handle - * - * Note: - * ======================================================================== - */ -VOID *RtmpOsGetNetDevPriv(VOID *pDev) -{ - return ((struct mt_dev_priv *)netdev_priv((struct net_device *)pDev)) - ->sys_handle; -} - -VOID RtmpOsSetNetDevWdev(VOID *net_dev, VOID *wdev) -{ - struct mt_dev_priv *priv_info; - - priv_info = - (struct mt_dev_priv *)netdev_priv((struct net_device *)net_dev); - priv_info->wifi_dev = wdev; -} - -VOID *RtmpOsGetNetDevWdev(VOID *pDev) -{ - return ((struct mt_dev_priv *)netdev_priv((struct net_device *)pDev)) - ->wifi_dev; -} - -/* - * ======================================================================== - * Routine Description: - * Get private flags from the network interface. - * - * Arguments: - * pDev - the device - * - * Return Value: - * pPriv - the pointer - * - * Note: - * ======================================================================== - */ -USHORT RtmpDevPrivFlagsGet(VOID *pDev) -{ - return ((struct mt_dev_priv *)netdev_priv((struct net_device *)pDev)) - ->priv_flags; -} - -/* - * ======================================================================== - * Routine Description: - * Get private flags from the network interface. - * - * Arguments: - * pDev - the device - * - * Return Value: - * pPriv - the pointer - * - * Note: - * ======================================================================== - */ -VOID RtmpDevPrivFlagsSet(VOID *pDev, USHORT PrivFlags) -{ - struct mt_dev_priv *priv_info; - - priv_info = - (struct mt_dev_priv *)netdev_priv((struct net_device *)pDev); - priv_info->priv_flags = PrivFlags; -} - -UCHAR get_sniffer_mode(VOID *pDev) -{ - struct mt_dev_priv *priv_info; - - priv_info = - (struct mt_dev_priv *)netdev_priv((struct net_device *)pDev); - return priv_info->sniffer_mode; -} - -VOID set_sniffer_mode(VOID *net_dev, UCHAR sniffer_mode) -{ - struct mt_dev_priv *priv_info; - - priv_info = - (struct mt_dev_priv *)netdev_priv((struct net_device *)net_dev); - priv_info->sniffer_mode = sniffer_mode; -} - -/* - * ======================================================================== - * Routine Description: - * Get network interface name. - * - * Arguments: - * pDev - the device - * - * Return Value: - * the name - * ======================================================================== - */ -unsigned long RtmpOSGetNetDevState(VOID *pDev) -{ - return ((PNET_DEV)pDev)->state; -} - -unsigned int RtmpOSGetNetDevFlag(VOID *pDev) -{ - return ((PNET_DEV)pDev)->flags; -} - -unsigned int RtmpOSGetNetDevQNum(VOID *pDev) -{ -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) - return ((PNET_DEV)pDev)->num_tx_queues; -#else - return 0; -#endif -} - -unsigned long RtmpOSGetNetDevQState(VOID *pDev, unsigned int q_idx) -{ -#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) - struct netdev_queue *que = netdev_get_tx_queue((PNET_DEV)pDev, q_idx); - - if (que) - return que->state; - else - return ~0x0; - -#else - return ~0x0; -#endif -} - -char *RtmpOsGetNetDevName(VOID *pDev) -{ - return ((PNET_DEV)pDev)->name; -} - -UINT32 RtmpOsGetNetIfIndex(IN VOID *pDev) -{ - return ((PNET_DEV)pDev)->ifindex; -} - -int RtmpOSNetDevAddrSet(IN UCHAR OpMode, IN PNET_DEV pNetDev, - IN PUCHAR pMacAddr, IN PUCHAR dev_name) -{ - struct net_device *net_dev = (struct net_device *)pNetDev; - os_move_mem(net_dev->dev_addr, pMacAddr, 6); - return 0; -} - -/* Assign the network dev name for created Ralink WiFi interface.*/ -static int RtmpOSNetDevRequestName(IN INT32 MC_RowID, IN UINT32 *pIoctlIF, - IN PNET_DEV dev, IN RTMP_STRING *pPrefixStr, - IN INT devIdx, IN BOOLEAN autoSuffix) -{ - PNET_DEV existNetDev; - RTMP_STRING suffixName[IFNAMSIZ]; - RTMP_STRING desiredName[IFNAMSIZ]; - int ifNameIdx, prefixLen, slotNameLen; - int Status; - - prefixLen = strlen(pPrefixStr); - ASSERT((prefixLen < IFNAMSIZ)); - - for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) { - memset(suffixName, 0, IFNAMSIZ); - memset(desiredName, 0, IFNAMSIZ); - strncpy(&desiredName[0], pPrefixStr, prefixLen); -#ifdef MULTIPLE_CARD_SUPPORT -#ifdef RT_SOC_SUPPORT - - if (MC_RowID > 0) - sprintf(suffixName, "i%d", ifNameIdx); - else -#else - if (MC_RowID >= 0) - sprintf(suffixName, "%02d_%d", MC_RowID, ifNameIdx); - else -#endif /* RT_SOC_SUPPORT */ -#endif /* MULTIPLE_CARD_SUPPORT */ - sprintf(suffixName, "%d", ifNameIdx); - - slotNameLen = strlen(suffixName); - ASSERT(((slotNameLen + prefixLen) < IFNAMSIZ)); - - if (autoSuffix) - strncat(desiredName, suffixName, slotNameLen); - - existNetDev = RtmpOSNetDevGetByName(dev, &desiredName[0]); - - if (existNetDev == NULL) - break; - else if (autoSuffix == FALSE && existNetDev) { - ifNameIdx = - 32; /* Tend to leave loop then return failure */ - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Cannot request DevName with string(%s) from OS!\n", - pPrefixStr)); - } - - RtmpOSNetDeviceRefPut(existNetDev); - } - - if (ifNameIdx < 32) { -#ifdef HOSTAPD_SUPPORT - *pIoctlIF = ifNameIdx; -#endif /*HOSTAPD_SUPPORT */ - strncpy(&dev->name[0], &desiredName[0], sizeof(dev->name)); - Status = NDIS_STATUS_SUCCESS; - } else { - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n", - pPrefixStr)); - Status = NDIS_STATUS_FAILURE; - } - - return Status; -} - -void RtmpOSNetDevClose(PNET_DEV pNetDev) -{ - dev_close(pNetDev); -} - -void RtmpOSNetDevFree(PNET_DEV pNetDev) -{ - ASSERT(pNetDev); -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) - free_netdev(pNetDev); -#else - kfree(pNetDev); -#endif -#ifdef VENDOR_FEATURE4_SUPPORT - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("OS_NumOfMemAlloc = %ld, OS_NumOfMemFree = %ld\n", - OS_NumOfMemAlloc, OS_NumOfMemFree)); -#endif /* VENDOR_FEATURE4_SUPPORT */ -#ifdef VENDOR_FEATURE2_SUPPORT - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("OS_NumOfPktAlloc = %ld, OS_NumOfPktFree = %ld\n", - OS_NumOfPktAlloc, OS_NumOfPktFree)); -#endif /* VENDOR_FEATURE2_SUPPORT */ -} - -INT RtmpOSNetDevAlloc(IN PNET_DEV *new_dev_p, IN UINT32 privDataSize) -{ - *new_dev_p = NULL; - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Allocate a net device with private data size=%d!\n", - privDataSize)); -#if LINUX_VERSION_CODE <= 0x20402 /* Red Hat 7.1 */ - *new_dev_p = alloc_netdev(privDataSize, "eth%d", ether_setup); -#else - *new_dev_p = alloc_etherdev(privDataSize); -#endif /* LINUX_VERSION_CODE */ - - if (*new_dev_p) - return NDIS_STATUS_SUCCESS; - else - return NDIS_STATUS_FAILURE; -} - -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) -INT RtmpOSNetDevOpsAlloc(PVOID *pNetDevOps) -{ - *pNetDevOps = (PVOID)vmalloc(sizeof(struct net_device_ops)); - - if (*pNetDevOps) { - os_zero_mem(*pNetDevOps, sizeof(struct net_device_ops)); - return NDIS_STATUS_SUCCESS; - } else - return NDIS_STATUS_FAILURE; -} -#endif - -PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, RTMP_STRING *pDevName) -{ - PNET_DEV pTargetNetDev = NULL; -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) -#if (KERNEL_VERSION(2, 6, 24) <= LINUX_VERSION_CODE) -#if (KERNEL_VERSION(2, 6, 26) <= LINUX_VERSION_CODE) - pTargetNetDev = dev_get_by_name(dev_net(pNetDev), pDevName); -#else - ASSERT(pNetDev); - pTargetNetDev = dev_get_by_name(pNetDev->nd_net, pDevName); -#endif -#else - pTargetNetDev = dev_get_by_name(pDevName); -#endif /* KERNEL_VERSION(2,6,24) */ -#else - int devNameLen; - - devNameLen = strlen(pDevName); - ASSERT((devNameLen <= IFNAMSIZ)); - - for (pTargetNetDev = dev_base; pTargetNetDev != NULL; - pTargetNetDev = pTargetNetDev->next) { - if (strncmp(pTargetNetDev->name, pDevName, devNameLen) == 0) - break; - } - -#endif /* KERNEL_VERSION(2,5,0) */ - return pTargetNetDev; -} - -void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev) -{ -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) - - /* - * every time dev_get_by_name is called, and it has returned a valid struct - * net_device*, dev_put should be called afterwards, because otherwise the - * machine hangs when the device is unregistered (since dev->refcnt > 1). - */ - if (pNetDev) - dev_put(pNetDev); - -#endif /* LINUX_VERSION_CODE */ -} - -INT RtmpOSNetDevDestory(VOID *pReserved, PNET_DEV pNetDev) -{ - /* TODO: Need to fix this */ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("WARNING: This function(%s) not implement yet!!!\n", - __func__)); - return 0; -} - -void RtmpOSNetDevDetach(PNET_DEV pNetDev) -{ -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) - struct net_device_ops *pNetDevOps = - (struct net_device_ops *)pNetDev->netdev_ops; -#endif - unregister_netdevice(pNetDev); -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) - vfree(pNetDevOps); - pNetDev->netdev_ops = NULL; -#endif -} - -void RtmpOSNetDevProtect(BOOLEAN lock_it) -{ - if (lock_it) - rtnl_lock(); - else - rtnl_unlock(); -} - -#if (KERNEL_VERSION(2, 6, 18) <= LINUX_VERSION_CODE) -static void RALINK_ET_DrvInfoGet(struct net_device *pDev, - struct ethtool_drvinfo *pInfo) -{ - strncpy(pInfo->driver, "RALINK WLAN", sizeof("RALINK WLAN")); - sprintf(pInfo->bus_info, "CSR 0x%lx", pDev->base_addr); -} - -static struct ethtool_ops RALINK_Ethtool_Ops = { - .get_drvinfo = RALINK_ET_DrvInfoGet, -}; -#endif - -int RtmpOSNetDevAttach(IN UCHAR OpMode, IN PNET_DEV pNetDev, - IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook) -{ - int ret, rtnl_locked = FALSE; -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) - struct net_device_ops *pNetDevOps = - (struct net_device_ops *)pNetDev->netdev_ops; -#endif - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RtmpOSNetDevAttach()--->\n")); - - /* If we need hook some callback function to the net device structrue, now do it. */ - if (pDevOpHook) { -#ifdef RT_CFG80211_SUPPORT - RTMP_DRIVER_CFG80211_REGISTER(pNetDev); -#endif /* RT_CFG80211_SUPPORT */ -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) - pNetDevOps->ndo_open = pDevOpHook->open; - pNetDevOps->ndo_stop = pDevOpHook->stop; - pNetDevOps->ndo_start_xmit = - (HARD_START_XMIT_FUNC)(pDevOpHook->xmit); - pNetDevOps->ndo_do_ioctl = pDevOpHook->ioctl; -#else - pNetDev->open = pDevOpHook->open; - pNetDev->stop = pDevOpHook->stop; - pNetDev->hard_start_xmit = - (HARD_START_XMIT_FUNC)(pDevOpHook->xmit); - pNetDev->do_ioctl = pDevOpHook->ioctl; -#endif -#if (KERNEL_VERSION(2, 6, 18) <= LINUX_VERSION_CODE) - pNetDev->ethtool_ops = &RALINK_Ethtool_Ops; -#endif - - /* if you don't implement get_stats, just leave the callback function as NULL, a dummy - * function will make kernel panic. - */ - if (pDevOpHook->get_stats) -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) - pNetDevOps->ndo_get_stats = pDevOpHook->get_stats; - -#else - pNetDev->get_stats = pDevOpHook->get_stats; -#endif - /* OS specific flags, here we used to indicate if we are virtual interface */ - /* pNetDev->priv_flags = pDevOpHook->priv_flags; */ - RT_DEV_PRIV_FLAGS_SET(pNetDev, pDevOpHook->priv_flags); -#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12) - /* pNetDev->get_wireless_stats = rt28xx_get_wireless_stats; */ - pNetDev->get_wireless_stats = pDevOpHook->get_wstats; -#endif -#ifdef CONFIG_APSTA_MIXED_SUPPORT -#if WIRELESS_EXT >= 12 - - if (OpMode == OPMODE_AP) - pDevOpHook->iw_handler = - (void *)&rt28xx_ap_iw_handler_def; - -#endif /*WIRELESS_EXT >= 12 */ -#endif /* CONFIG_APSTA_MIXED_SUPPORT */ -#ifdef CONFIG_WIRELESS_EXT - - if (pDevOpHook->iw_handler) - pNetDev->wireless_handlers = - (void *)pDevOpHook->iw_handler; - -#endif /* CONFIG_WIRELESS_EXT */ - /* copy the net device mac address to the net_device structure. */ - os_move_mem(pNetDev->dev_addr, &pDevOpHook->devAddr[0], - MAC_ADDR_LEN); - rtnl_locked = pDevOpHook->needProtcted; - } - -#if (KERNEL_VERSION(2, 6, 24) <= LINUX_VERSION_CODE) -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) - pNetDevOps->ndo_validate_addr = NULL; - /*pNetDev->netdev_ops = ops; */ -#else - pNetDev->validate_addr = NULL; -#endif -#endif - - if (rtnl_locked) - ret = register_netdevice(pNetDev); - else - ret = register_netdev(pNetDev); - - netif_stop_queue(pNetDev); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<---RtmpOSNetDevAttach(), ret=%d\n", ret)); - - if (ret == 0) - return NDIS_STATUS_SUCCESS; - else - return NDIS_STATUS_FAILURE; -} - -PNET_DEV RtmpOSNetDevCreate(IN INT32 MC_RowID, IN UINT32 *pIoctlIF, - IN INT devType, IN INT devNum, IN INT privMemSize, - IN char *pNamePrefix, IN BOOLEAN autoSuffix) -{ - struct net_device *pNetDev = NULL; -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) - struct net_device_ops *pNetDevOps = NULL; -#endif - int status; - /* allocate a new network device */ - status = RtmpOSNetDevAlloc(&pNetDev, privMemSize); - - if (status != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Allocate network device fail (%s)...\n", - pNamePrefix)); - return NULL; - } - -#if (KERNEL_VERSION(2, 6, 31) <= LINUX_VERSION_CODE) - status = RtmpOSNetDevOpsAlloc((PVOID)&pNetDevOps); - - if (status != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Allocate net device ops fail!\n")); - RtmpOSNetDevFree(pNetDev); - return NULL; - } - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Allocate net device ops success!\n")); - pNetDev->netdev_ops = pNetDevOps; - -#endif - /* find a available interface name, max 32 interfaces */ - status = RtmpOSNetDevRequestName(MC_RowID, pIoctlIF, pNetDev, - pNamePrefix, devNum, autoSuffix); - - if (status != NDIS_STATUS_SUCCESS) { - /* error! no any available ra name can be used! */ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Assign inf name (%s with suffix 0~32) failed\n", - pNamePrefix)); - RtmpOSNetDevFree(pNetDev); - return NULL; - } - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("The name of the new %s interface is %s\n", pNamePrefix, - pNetDev->name)); - - return pNetDev; -} - -UCHAR VLAN_8023_Header_Copy(IN USHORT VLAN_VID, IN USHORT VLAN_Priority, - IN PUCHAR pHeader802_3, IN UINT HdrLen, - OUT PUCHAR pData, IN UCHAR *TPID) -{ - UINT16 TCI; - UCHAR VLAN_Size = 0; - - if (VLAN_VID != 0) { - /* need to insert VLAN tag */ - VLAN_Size = LENGTH_802_1Q; - /* make up TCI field */ - TCI = (VLAN_VID & 0x0fff) | ((VLAN_Priority & 0x7) << 13); -#ifndef RT_BIG_ENDIAN - TCI = SWAP16(TCI); -#endif /* RT_BIG_ENDIAN */ - /* copy dst + src MAC (12B) */ - memcpy(pData, pHeader802_3, LENGTH_802_3_NO_TYPE); - /* copy VLAN tag (4B) */ - /* do NOT use memcpy to speed up */ - *(UINT16 *)(pData + LENGTH_802_3_NO_TYPE) = *(UINT16 *)TPID; - *(UINT16 *)(pData + LENGTH_802_3_NO_TYPE + 2) = TCI; - /* copy type/len (2B) */ - *(UINT16 *)(pData + LENGTH_802_3_NO_TYPE + LENGTH_802_1Q) = *( - UINT16 *)&pHeader802_3[LENGTH_802_3 - LENGTH_802_3_TYPE]; - - /* copy tail if exist */ - if (HdrLen > LENGTH_802_3) - memcpy(pData + LENGTH_802_3 + LENGTH_802_1Q, - pHeader802_3 + LENGTH_802_3, - HdrLen - LENGTH_802_3); - } else { - /* no VLAN tag is needed to insert */ - memcpy(pData, pHeader802_3, HdrLen); - } - - return VLAN_Size; -} - -/* - * ======================================================================== - * Routine Description: - * Allocate memory for adapter control block. - * - * Arguments: - * pAd Pointer to our adapter - * - * Return Value: - * NDIS_STATUS_SUCCESS - * NDIS_STATUS_FAILURE - * NDIS_STATUS_RESOURCES - * ======================================================================== - */ -NDIS_STATUS AdapterBlockAllocateMemory(VOID *handle, VOID **ppAd, - UINT32 SizeOfpAd) -{ -#ifdef OS_ABL_FUNC_SUPPORT - /* get offset for sk_buff */ - { - struct sk_buff *pPkt = NULL; - - pPkt = kmalloc(sizeof(struct sk_buff), GFP_ATOMIC); - - if (pPkt == NULL) { - *ppAd = NULL; - return NDIS_STATUS_FAILURE; - } - - RTPktOffsetData = (ULONG)(&(pPkt->data)) - (ULONG)pPkt; - RTPktOffsetLen = (ULONG)(&(pPkt->len)) - (ULONG)pPkt; - RTPktOffsetCB = (ULONG)(pPkt->cb) - (ULONG)pPkt; - kfree(pPkt); - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("packet> data offset = %lu\n", RTPktOffsetData)); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("packet> len offset = %lu\n", RTPktOffsetLen)); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("packet> cb offset = %lu\n", RTPktOffsetCB)); - } -#endif /* OS_ABL_FUNC_SUPPORT */ - *ppAd = (PVOID)vmalloc(SizeOfpAd); - - if (*ppAd) { - os_zero_mem(*ppAd, SizeOfpAd); - return NDIS_STATUS_SUCCESS; - } else - return NDIS_STATUS_FAILURE; -} - -/* ========================================================================== */ -#ifdef VLAN_SUPPORT -VOID *RtmpOsVLANInsertTag(PNDIS_PACKET pPacket, UINT16 tci) -{ - return (VOID *)vlan_insert_tag(RTPKT_TO_OSPKT(pPacket), - cpu2be16(ETH_TYPE_VLAN), tci); -} -#endif /*VLAN_SUPPORT*/ - -UINT RtmpOsWirelessExtVerGet(VOID) -{ - return WIRELESS_EXT; -} - -VOID RtmpDrvAllMacPrint(IN VOID *pReserved, IN UINT32 *pBufMac, - IN UINT32 AddrStart, IN UINT32 AddrEnd, - IN UINT32 AddrStep) -{ - struct file *file_w; - RTMP_STRING *fileName = "MacDump.txt"; - mm_segment_t orig_fs; - RTMP_STRING *msg; - UINT32 macAddr = 0, macValue = 0; - - os_alloc_mem(NULL, (UCHAR **)&msg, 1024); - - if (!msg) - return; - - orig_fs = get_fs(); - set_fs(KERNEL_DS); - /* open file */ - file_w = filp_open(fileName, O_WRONLY | O_CREAT, 0); - - if (IS_ERR(file_w)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->2) %s: Error %ld opening %s\n", __func__, - -PTR_ERR(file_w), fileName)); - } else { - if (file_w->f_op) { - file_w->f_pos = 0; - macAddr = AddrStart; - - while (macAddr <= AddrEnd) { - /* RTMP_IO_READ32(pAd, macAddr, &macValue); // sample */ - macValue = *pBufMac++; - sprintf(msg, "%04x = %08x\n", macAddr, - macValue); - /* write data to file */ -#if (KERNEL_VERSION(4, 1, 0) > LINUX_VERSION_CODE) - if (file_w->f_op->write) { - file_w->f_op->write(file_w, msg, - strlen(msg), - &file_w->f_pos); - } else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("no file write method\n")); - } -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - __kernel_write(file_w, msg, strlen(msg), - &file_w->f_pos); - -#else - __vfs_write(file_w, msg, strlen(msg), - &file_w->f_pos); -#endif - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("%s", msg)); - macAddr += AddrStep; - } - - snprintf(msg, 1024, "\nDump all MAC values to %s\n", - fileName); - } - - filp_close(file_w, NULL); - } - - set_fs(orig_fs); - os_free_mem(msg); -} - -VOID RtmpDrvAllE2PPrint(IN VOID *pReserved, IN USHORT *pMacContent, - IN UINT32 AddrEnd, IN UINT32 AddrStep) -{ - struct file *file_w; - RTMP_STRING *fileName = "EEPROMDump.txt"; - mm_segment_t orig_fs; - RTMP_STRING *msg; - USHORT eepAddr = 0; - USHORT eepValue; - - os_alloc_mem(NULL, (UCHAR **)&msg, 1024); - - if (!msg) - return; - - orig_fs = get_fs(); - set_fs(KERNEL_DS); - /* open file */ - file_w = filp_open(fileName, O_WRONLY | O_CREAT, 0); - - if (IS_ERR(file_w)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->2) %s: Error %ld opening %s\n", __func__, - -PTR_ERR(file_w), fileName)); - } else { - if (file_w->f_op) { - file_w->f_pos = 0; - eepAddr = 0x00; - - while (eepAddr <= AddrEnd) { - eepValue = *pMacContent; - sprintf(msg, "%08x = %04x\n", eepAddr, - eepValue); - /* write data to file */ -#if (KERNEL_VERSION(4, 1, 0) > LINUX_VERSION_CODE) - if (file_w->f_op->write) { - file_w->f_op->write(file_w, msg, - strlen(msg), - &file_w->f_pos); - } else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("no file write method\n")); - } -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) - __kernel_write(file_w, msg, strlen(msg), - &file_w->f_pos); - -#else - __vfs_write(file_w, msg, strlen(msg), - &file_w->f_pos); -#endif - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("%s", msg)); - eepAddr += AddrStep; - pMacContent += (AddrStep >> 1); - } - - snprintf(msg, 1024, "\nDump all EEPROM values to %s\n", - fileName); - } - - filp_close(file_w, NULL); - } - - set_fs(orig_fs); - os_free_mem(msg); -} - -VOID RtmpDrvAllRFPrint(IN VOID *pReserved, IN UCHAR *pBuf, IN UINT32 BufLen) -{ - struct file *file_w; - RTMP_STRING *fileName = "RFDump.txt"; - mm_segment_t orig_fs; - - orig_fs = get_fs(); - set_fs(KERNEL_DS); - /* open file */ - file_w = filp_open(fileName, O_WRONLY | O_CREAT, 0); - - if (IS_ERR(file_w)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("-->2) %s: Error %ld opening %s\n", __func__, - -PTR_ERR(file_w), fileName)); - } else { - if (file_w->f_op) { - file_w->f_pos = 0; - /* write data to file */ -#if (KERNEL_VERSION(4, 1, 0) > LINUX_VERSION_CODE) - if (file_w->f_op->write) { - file_w->f_op->write(file_w, pBuf, BufLen, - &file_w->f_pos); - } else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("no file write method\n")); - } -#elif (KERNEL_VERSION(4, 19, 0) <= LINUX_VERSION_CODE) - __kernel_write(file_w, pBuf, BufLen, &file_w->f_pos); - -#else - __vfs_write(file_w, pBuf, BufLen, &file_w->f_pos); -#endif - } - - filp_close(file_w, NULL); - } - - set_fs(orig_fs); -} - -/* - * ======================================================================== - * Routine Description: - * Wake up the command thread. - * - * Arguments: - * pAd - WLAN control block pointer - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsCmdUp(RTMP_OS_TASK *pCmdQTask) -{ - OS_TASK *pTask = RTMP_OS_TASK_GET(pCmdQTask); - pTask->kthread_running = TRUE; - wake_up(&pTask->kthread_q); -} - -BOOLEAN RtmpOsIsCmdThreadRunning(RTMP_OS_TASK *pCmdQTask) -{ - OS_TASK *pTask = RTMP_OS_TASK_GET(pCmdQTask); - return pTask->kthread_running; -} - -/* - * ======================================================================== - * Routine Description: - * Wake up USB Mlme thread. - * - * Arguments: - * pAd - WLAN control block pointer - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsMlmeUp(IN RTMP_OS_TASK *pMlmeQTask) -{ - OS_TASK *pTask = RTMP_OS_TASK_GET(pMlmeQTask); - - if ((pTask != NULL) && (pTask->kthread_task)) { - pTask->kthread_running = TRUE; - wake_up(&pTask->kthread_q); - } else { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s invalid pTask 0x%p or kthread_task 0x%p\n", - __func__, pTask, - (pTask) ? pTask->kthread_task : NULL)); - } -} - -/* - * ======================================================================== - * Routine Description: - * Check if the file is error. - * - * Arguments: - * pFile - the file - * - * Return Value: - * OK or any error - * - * Note: - * rt_linux.h, not rt_drv.h - * ======================================================================== - */ -INT32 RtmpOsFileIsErr(IN VOID *pFile) -{ - return IS_FILE_OPEN_ERR(pFile); -} - -int RtmpOSIRQRelease(IN PNET_DEV pNetDev, IN UINT32 infType, - IN PPCI_DEV pci_dev, IN BOOLEAN *pHaveMsi) -{ -#ifdef RTMP_PCI_SUPPORT - - if (infType == RTMP_DEV_INF_PCI || infType == RTMP_DEV_INF_PCIE) { -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) - synchronize_irq(pci_dev->irq); -#endif - free_irq(pci_dev->irq, ((struct net_device *)pNetDev)); - } - -#endif /* RTMP_PCI_SUPPORT */ -#ifdef RTMP_RBUS_SUPPORT - - if (infType == RTMP_DEV_INF_RBUS) { - struct net_device *net_dev = (struct net_device *)pNetDev; -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) - synchronize_irq(net_dev->irq); -#endif - free_irq(net_dev->irq, (net_dev)); - } - -#endif /* RTMP_RBUS_SUPPORT */ - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * Enable or disable wireless event sent. - * - * Arguments: - * pReserved - Reserved - * FlgIsWEntSup - TRUE or FALSE - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsWlanEventSet(IN VOID *pReserved, IN BOOLEAN *pCfgWEnt, - IN BOOLEAN FlgIsWEntSup) -{ -#if WIRELESS_EXT >= 15 - /* pAd->CommonCfg.bWirelessEvent = FlgIsWEntSup; */ - *pCfgWEnt = FlgIsWEntSup; -#else - *pCfgWEnt = 0; /* disable */ -#endif -} - -/* - * ======================================================================== - * Routine Description: - * vmalloc - * - * Arguments: - * Size - memory size - * - * Return Value: - * the memory - * - * Note: - * ======================================================================== - */ -VOID *RtmpOsVmalloc(ULONG Size) -{ - return vmalloc(Size); -} - -/* - * ======================================================================== - * Routine Description: - * vfree - * - * Arguments: - * pMem - the memory - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsVfree(VOID *pMem) -{ - if (pMem != NULL) - vfree(pMem); -} - -/* - * ======================================================================== - * Routine Description: - * Assign protocol to the packet. - * - * Arguments: - * pPkt - the packet - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsPktProtocolAssign(PNDIS_PACKET pNetPkt) -{ - struct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt); - - pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); -} - -BOOLEAN RtmpOsStatsAlloc(IN VOID **ppStats, IN VOID **ppIwStats) -{ - os_alloc_mem(NULL, (UCHAR **)ppStats, sizeof(struct net_device_stats)); - - if ((*ppStats) == NULL) - return FALSE; - - os_zero_mem((UCHAR *)*ppStats, sizeof(struct net_device_stats)); -#if WIRELESS_EXT >= 12 - os_alloc_mem(NULL, (UCHAR **)ppIwStats, sizeof(struct iw_statistics)); - - if ((*ppIwStats) == NULL) { - os_free_mem(*ppStats); - return FALSE; - } - - os_zero_mem((UCHAR *)*ppIwStats, sizeof(struct iw_statistics)); -#endif - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Pass the received packet to OS. - * - * Arguments: - * pPkt - the packet - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsPktRcvHandle(PNDIS_PACKET pNetPkt) -{ - struct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt); -#ifdef CONFIG_CSO_SUPPORT - struct net_device *pNetDev = GET_OS_PKT_NETDEV(pNetPkt); -#endif /* CONFIG_CSO_SUPPORT */ -#ifdef CONFIG_CSO_SUPPORT - - if (pNetDev->features & NETIF_F_HW_CSUM) { - if (RTMP_GET_TCP_CHKSUM_FAIL(pNetPkt)) - pRxPkt->ip_summed = CHECKSUM_NONE; - else - pRxPkt->ip_summed = CHECKSUM_UNNECESSARY; - } - -#endif /* CONFIG_CSO_SUPPORT */ - netif_rx(pRxPkt); -} - -VOID RtmpOsTaskPidInit(RTMP_OS_PID *pPid) -{ - *pPid = THREAD_PID_INIT_VALUE; -} - -UINT32 RtmpOsCsumAdd(UINT32 csum, UINT32 addend) -{ - UINT32 res = csum; - res += addend; - return res + (res < addend); -} - -VOID RtmpOsSkbPullRcsum(struct sk_buff *skb, unsigned int len) -{ - if (len > skb->len) - return; - - skb_pull(skb, len); - if (skb->ip_summed == CHECKSUM_COMPLETE) - skb->csum = RtmpOsCsumAdd(skb->csum, - ~csum_partial(skb->data, len, 0)); - else if (skb->ip_summed == CHECKSUM_PARTIAL && - (skb->csum_start - (skb->data - skb->head)) < 0) - skb->ip_summed = CHECKSUM_NONE; -} - -VOID RtmpOsSkbResetMacHeader(struct sk_buff *skb) -{ - skb_reset_mac_header(skb); -} - -VOID RtmpOsSkbResetNetworkHeader(struct sk_buff *skb) -{ - skb_reset_network_header(skb); -} - -VOID RtmpOsSkbResetTransportHeader(struct sk_buff *skb) -{ - skb_reset_transport_header(skb); -} - -VOID RtmpOsSkbResetMacLen(struct sk_buff *skb) -{ - skb_reset_mac_len(skb); -} - -/* - * ======================================================================== - * Routine Description: - * Get the network interface for the packet. - * - * Arguments: - * pPkt - the packet - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -PNET_DEV RtmpOsPktNetDevGet(VOID *pPkt) -{ - return GET_OS_PKT_NETDEV(pPkt); -} - -#ifdef IAPP_SUPPORT -/* Layer 2 Update frame to switch/bridge */ -/* For any Layer2 devices, e.g., bridges, switches and other APs, the frame - * can update their forwarding tables with the correct port to reach the new - * location of the STA - */ -typedef struct GNU_PACKED _RT_IAPP_L2_UPDATE_FRAME { - UCHAR DA[ETH_ALEN]; /* broadcast MAC address */ - UCHAR SA[ETH_ALEN]; /* the MAC address of the STA that has just associated or reassociated */ - USHORT Len; /* 8 octets */ - UCHAR DSAP; /* null */ - UCHAR SSAP; /* null */ - UCHAR Control; /* reference to IEEE Std 802.2 */ - UCHAR XIDInfo[3]; /* reference to IEEE Std 802.2 */ -} RT_IAPP_L2_UPDATE_FRAME, *PRT_IAPP_L2_UPDATE_FRAME; - -PNDIS_PACKET RtmpOsPktIappMakeUp(IN PNET_DEV pNetDev, IN UINT8 *pMac) -{ - RT_IAPP_L2_UPDATE_FRAME frame_body; - INT size = sizeof(RT_IAPP_L2_UPDATE_FRAME); - PNDIS_PACKET pNetBuf; - - if (pNetDev == NULL) - return NULL; - - pNetBuf = RtmpOSNetPktAlloc(NULL, size); - - if (!pNetBuf) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error! Can't allocate a skb.\n")); - return NULL; - } - - /* init the update frame body */ - os_zero_mem(&frame_body, size); - memset(frame_body.DA, 0xFF, ETH_ALEN); - memcpy(frame_body.SA, pMac, ETH_ALEN); - frame_body.Len = OS_HTONS(ETH_ALEN); - frame_body.DSAP = 0; - frame_body.SSAP = 0x01; - frame_body.Control = 0xAF; - frame_body.XIDInfo[0] = 0x81; - frame_body.XIDInfo[1] = 1; - frame_body.XIDInfo[2] = 1 << 1; - SET_OS_PKT_NETDEV(pNetBuf, pNetDev); - skb_reserve(pNetBuf, 2); - memcpy(skb_put(pNetBuf, size), &frame_body, size); - return pNetBuf; -} -#endif /* IAPP_SUPPORT */ - -#ifdef CONFIG_FAST_NAT_SUPPORT -VOID RtmpOsPktNatMagicTag(IN PNDIS_PACKET pNetPkt) -{ - struct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt); - - FOE_MAGIC_TAG(pRxPkt) = FOE_MAGIC_WLAN; -} -#endif /*CONFIG_FAST_NAT_SUPPORT*/ - -/* - * ======================================================================== - * Routine Description: - * Flush a data cache line. - * - * Arguments: - * AddrStart - the start address - * Size - memory size - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsDCacheFlush(IN ULONG AddrStart, IN ULONG Size) -{ - RTMP_UTIL_DCACHE_FLUSH(AddrStart, Size); -} - -void OS_SPIN_LOCK_IRQSAVE(NDIS_SPIN_LOCK *lock, unsigned long *flags) -{ - spin_lock_irqsave((spinlock_t *)(lock), *flags); -} - -void OS_SPIN_UNLOCK_IRQRESTORE(NDIS_SPIN_LOCK *lock, unsigned long *flags) -{ - spin_unlock_irqrestore((spinlock_t *)(lock), *flags); -} - -void OS_SPIN_LOCK(NDIS_SPIN_LOCK *lock) -{ - spin_lock((spinlock_t *)(lock)); -} - -void OS_SPIN_UNLOCK(NDIS_SPIN_LOCK *lock) -{ - spin_unlock((spinlock_t *)(lock)); -} - -void OS_SPIN_LOCK_IRQ(NDIS_SPIN_LOCK *lock) -{ - spin_lock_irq((spinlock_t *)(lock)); -} - -void OS_SPIN_UNLOCK_IRQ(NDIS_SPIN_LOCK *lock) -{ - spin_unlock_irq((spinlock_t *)(lock)); -} - -int OS_TEST_BIT(int bit, ULONG *flags) -{ - return test_bit(bit, flags); -} - -void OS_SET_BIT(int bit, ULONG *flags) -{ - set_bit(bit, flags); -} - -void OS_CLEAR_BIT(int bit, ULONG *flags) -{ - clear_bit(bit, flags); -} - -void OS_LOAD_CODE_FROM_BIN(unsigned char **image, char *bin_name, void *inf_dev, - UINT32 *code_len) -{ - struct device *dev = NULL; - const struct firmware *fw_entry; -#ifdef RTMP_PCI_SUPPORT - dev = (struct device *)(&(((struct pci_dev *)(inf_dev))->dev)); -#endif -#ifdef RTMP_RBUS_SUPPORT - dev = (struct device *)(&(((PPCI_DEV)(inf_dev))->dev)); -#endif /*RTMP_RBUS_SUPPORT*/ - - if (request_firmware(&fw_entry, bin_name, dev) != 0) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:fw not available(/lib/firmware/%s)\n", __func__, - bin_name)); - *image = NULL; - return; - } - - os_alloc_mem_suspend(NULL, image, fw_entry->size); - memcpy(*image, fw_entry->data, fw_entry->size); - *code_len = fw_entry->size; - release_firmware(fw_entry); -} - -void os_load_code_from_bin(void *pAd, unsigned char **image, char *bin_name, - UINT32 *code_len) -{ - struct device *dev; - const struct firmware *fw_entry; - - dev = rtmp_get_dev(pAd); - - if (request_firmware(&fw_entry, bin_name, dev) != 0) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s:fw not available(/lib/firmware/%s)\n", __func__, - bin_name)); - *image = NULL; - return; - } - - os_alloc_mem(pAd, image, fw_entry->size); - memcpy(*image, fw_entry->data, fw_entry->size); - *code_len = fw_entry->size; - release_firmware(fw_entry); -} - -#ifdef OS_ABL_FUNC_SUPPORT -/* - * ======================================================================== - * Routine Description: - * Change/Recover file UID/GID. - * - * Arguments: - * pOSFSInfoOrg - the file - * bSet - Change (TRUE) or Recover (FALSE) - * - * Return Value: - * None - * - * Note: - * rt_linux.h, not rt_drv.h - * ======================================================================== - */ -void RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfoOrg, BOOLEAN bSet) -{ - OS_FS_INFO *pOSFSInfo; - - if (bSet == TRUE) { - os_alloc_mem(NULL, (UCHAR **)&(pOSFSInfoOrg->pContent), - sizeof(OS_FS_INFO)); - - if (pOSFSInfoOrg->pContent == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: alloc file info fail!\n", __func__)); - return; - } - - memset(pOSFSInfoOrg->pContent, 0, sizeof(OS_FS_INFO)); - } - - pOSFSInfo = (OS_FS_INFO *)(pOSFSInfoOrg->pContent); - - if (pOSFSInfo == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: pOSFSInfo == NULL!\n", __func__)); - return; - } - - __RtmpOSFSInfoChange(pOSFSInfo, bSet); - - if (bSet == FALSE) { - if (pOSFSInfoOrg->pContent != NULL) { - os_free_mem(pOSFSInfoOrg->pContent); - pOSFSInfoOrg->pContent = NULL; - } - } -} - -VOID RtmpOsInitCompletion(RTMP_OS_COMPLETION *pCompletion) -{ - RTMP_OS_Alloc_RscOnly(pCompletion, sizeof(struct completion)); - init_completion((struct completion *)(pCompletion->pContent)); -} - -VOID RtmpOsExitCompletion(RTMP_OS_COMPLETION *pCompletion) -{ - if (pCompletion->pContent == NULL) - return FALSE; - - os_free_mem(pCompletion->pContent); - pCompletion->pContent = NULL; -} - -VOID RtmpOsComplete(RTMP_OS_COMPLETION *pCompletion) -{ - if (pCompletion->pContent == NULL) - return FALSE; - - complete((struct completion *)(pCompletion->pContent)); - return TRUE; -} - -ULONG RtmpOsWaitForCompletionTimeout(RTMP_OS_COMPLETION *pCompletion, - ULONG Timeout) -{ - return wait_for_completion_timeout( - (struct completion *)(pCompletion->pContent), Timeout); -} - -/* - * ======================================================================== - * Routine Description: - * Activate a tasklet. - * - * Arguments: - * pTasklet - the tasklet - * - * Return Value: - * TRUE or FALSE - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsTaskletSche(RTMP_NET_TASK_STRUCT *pTasklet) -{ - if (pTasklet->pContent == NULL) - return FALSE; - -#ifdef WORKQUEUE_BH - schedule_work((struct work_struct *)(pTasklet->pContent)); -#else - tasklet_hi_schedule((OS_NET_TASK_STRUCT *)(pTasklet->pContent)); -#endif /* WORKQUEUE_BH */ - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Initialize a tasklet. - * - * Arguments: - * pTasklet - the tasklet - * - * Return Value: - * TRUE or FALSE - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsTaskletInit(RTMP_NET_TASK_STRUCT *pTasklet, - VOID (*pFunc)(unsigned long data), ULONG Data, - LIST_HEADER *pTaskletList) -{ -#ifdef WORKQUEUE_BH - - if (RTMP_OS_Alloc_RscOnly(pTasklet, sizeof(struct work_struct)) == - FALSE) - return FALSE; - - INIT_WORK((struct work_struct *)(pTasklet->pContent), pFunc); -#else - - if (RTMP_OS_Alloc_RscOnly(pTasklet, sizeof(OS_NET_TASK_STRUCT)) == - FALSE) - return FALSE; - - tasklet_init((OS_NET_TASK_STRUCT *)(pTasklet->pContent), pFunc, Data); -#endif /* WORKQUEUE_BH */ - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Delete a tasklet. - * - * Arguments: - * pTasklet - the tasklet - * - * Return Value: - * TRUE or FALSE - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsTaskletKill(RTMP_NET_TASK_STRUCT *pTasklet) -{ - if (pTasklet->pContent != NULL) { -#ifdef WORKQUEUE_BH - cancel_work_sync((OS_NET_TASK_STRUCT *)(pTasklet->pContent)); -#else - tasklet_kill((OS_NET_TASK_STRUCT *)(pTasklet->pContent)); -#endif /* WORKQUEUE_BH */ - os_free_mem(pTasklet->pContent); - pTasklet->pContent = NULL; - } - - return TRUE; -} - -VOID RtmpOsTaskletDataAssign(RTMP_NET_TASK_STRUCT *pTasklet, ULONG Data) -{ -#ifndef WORKQUEUE_BH - - if (pTasklet->pContent != NULL) - ((OS_NET_TASK_STRUCT *)(pTasklet->pContent))->data = Data; - -#endif /* WORKQUEUE_BH */ -} - -INT32 RtmpOsTaskIsKilled(RTMP_OS_TASK *pTaskOrg) -{ - OS_TASK *pTask; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask == NULL) - return 1; - - return pTask->task_killed; -} - -VOID RtmpOsTaskWakeUp(RTMP_OS_TASK *pTaskOrg) -{ - OS_TASK *pTask; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask == NULL) - return; - - WAKE_UP(pTask); -} - -/* - * ======================================================================== - * Routine Description: - * Check if the task is legal. - * - * Arguments: - * pPkt - the packet - * pDev - the device - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsCheckTaskLegality(RTMP_OS_TASK *pTaskOrg) -{ - OS_TASK *pTask; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (!pTask) - return FALSE; - - if (pTask->kthread_task == NULL) - return FALSE; - - return TRUE; -} - -/* timeout -- ms */ -VOID RTMP_SetPeriodicTimer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout) -{ - OS_NDIS_MINIPORT_TIMER *pTimer; - - pTimer = (OS_NDIS_MINIPORT_TIMER *)(pTimerOrg->pContent); - - if (pTimer) { - if (timer_pending(pTimer)) - return; - - __RTMP_SetPeriodicTimer(pTimer, timeout); - } -} - -/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */ -VOID RTMP_OS_Init_Timer(VOID *pReserved, NDIS_MINIPORT_TIMER *pTimerOrg, - TIMER_FUNCTION function, PVOID data, - LIST_HEADER *pTimerList) -{ - OS_NDIS_MINIPORT_TIMER *pTimer; - - if (RTMP_OS_Alloc_RscOnly(pTimerOrg, sizeof(OS_NDIS_MINIPORT_TIMER)) == - FALSE) - return; - - pTimer = (OS_NDIS_MINIPORT_TIMER *)(pTimerOrg->pContent); - - if (pTimer) - __RTMP_OS_Init_Timer(pReserved, pTimer, function, data); -} - -VOID RTMP_OS_Add_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout) -{ - OS_NDIS_MINIPORT_TIMER *pTimer; - - pTimer = (OS_NDIS_MINIPORT_TIMER *)(pTimerOrg->pContent); - - if (pTimer) { - if (timer_pending(pTimer)) - return; - - __RTMP_OS_Add_Timer(pTimer, timeout); - } -} - -VOID RTMP_OS_Mod_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout) -{ - OS_NDIS_MINIPORT_TIMER *pTimer; - - pTimer = (OS_NDIS_MINIPORT_TIMER *)(pTimerOrg->pContent); - - if (pTimer) - __RTMP_OS_Mod_Timer(pTimer, timeout); -} - -VOID RTMP_OS_Del_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, BOOLEAN *pCancelled) -{ - OS_NDIS_MINIPORT_TIMER *pTimer; - - pTimer = (OS_NDIS_MINIPORT_TIMER *)(pTimerOrg->pContent); - - if (pTimer) - __RTMP_OS_Del_Timer(pTimer, pCancelled); -} - -VOID RTMP_OS_Release_Timer(NDIS_MINIPORT_TIMER *pTimerOrg) -{ - OS_NDIS_MINIPORT_TIMER *pTimer; - - pTimer = (OS_NDIS_MINIPORT_TIMER *)(pTimerOrg->pContent); - - if (pTimer) { - __RTMP_OS_Release_Timer(pTimer); - os_free_mem(pTimer); - pTimerOrg->pContent = NULL; - } -} - -/* - * ======================================================================== - * Routine Description: - * Allocate a OS resource. - * - * Arguments: - * pAd - WLAN control block pointer - * pRsc - the resource - * RscLen - resource length - * - * Return Value: - * TRUE or FALSE - * - * Note: - * ======================================================================== - */ -BOOLEAN RTMP_OS_Alloc_Rsc(LIST_HEADER *pRscList, VOID *pRscSrc, UINT32 RscLen) -{ - OS_RSTRUC *pRsc = (OS_RSTRUC *)pRscSrc; - - if (pRsc->pContent == NULL) { - /* new entry */ - os_alloc_mem(NULL, (UCHAR **)&(pRsc->pContent), RscLen); - - if (pRsc->pContent == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: alloc timer fail!\n", __func__)); - return FALSE; - } - - { - LIST_RESOURCE_OBJ_ENTRY *pObj; - /* allocate resource record entry */ - os_alloc_mem(NULL, (UCHAR **)&(pObj), - sizeof(LIST_RESOURCE_OBJ_ENTRY)); - - if (pObj == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: alloc timer obj fail!\n", - __func__)); - os_free_mem(pRsc->pContent); - pRsc->pContent = NULL; - return FALSE; - } - - memset(pRsc->pContent, 0, RscLen); - pObj->pRscObj = (VOID *)pRsc; - OS_SEM_LOCK(&UtilSemLock); - insertTailList(pRscList, (RT_LIST_ENTRY *)pObj); - OS_SEM_UNLOCK(&UtilSemLock); - } - } - - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Allocate a OS resource. - * - * Arguments: - * pAd - WLAN control block pointer - * pRsc - the resource - * RscLen - resource length - * - * Return Value: - * TRUE or FALSE - * - * Note: - * ======================================================================== - */ -BOOLEAN RTMP_OS_Alloc_RscOnly(VOID *pRscSrc, UINT32 RscLen) -{ - OS_RSTRUC *pRsc = (OS_RSTRUC *)pRscSrc; - - if (pRsc->pContent == NULL) { - /* new entry */ - os_alloc_mem(NULL, (UCHAR **)&(pRsc->pContent), RscLen); - - if (pRsc->pContent == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: alloc timer fail!\n", __func__)); - return FALSE; - } - - memset(pRsc->pContent, 0, RscLen); - } - - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Remove a OS resource. - * - * Arguments: - * pAd - WLAN control block pointer - * pRsc - the resource - * - * Return Value: - * TRUE or FALSE - * - * Note: - * ======================================================================== - */ -BOOLEAN RTMP_OS_Remove_Rsc(LIST_HEADER *pRscList, VOID *pRscSrc) -{ - LIST_RESOURCE_OBJ_ENTRY *pObj; - OS_RSTRUC *pRscHead, *pRsc, *pRscRev = (OS_RSTRUC *)pRscSrc; - - pRscHead = NULL; - OS_SEM_LOCK(&UtilSemLock); - - while (TRUE) { - pObj = (LIST_RESOURCE_OBJ_ENTRY *)removeHeadList(pRscList); - - if (pRscHead == NULL) - pRscHead = pObj->pRscObj; /* backup first entry */ - else if (((ULONG)pRscHead) == ((ULONG)(pObj->pRscObj))) - break; /* has searched all entries */ - - pRsc = (OS_RSTRUC *)(pObj->pRscObj); - - if ((ULONG)pRsc == (ULONG)pRscRev) - break; /* find it */ - - /* re-insert it */ - insertTailList(pRscList, (RT_LIST_ENTRY *)pObj); - } - - OS_SEM_UNLOCK(&UtilSemLock); - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Free all timers. - * - * Arguments: - * pAd - WLAN control block pointer - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RTMP_OS_Free_Rscs(LIST_HEADER *pRscList) -{ - LIST_RESOURCE_OBJ_ENTRY *pObj; - OS_RSTRUC *pRsc; - - OS_SEM_LOCK(&UtilSemLock); - - while (TRUE) { - pObj = (LIST_RESOURCE_OBJ_ENTRY *)removeHeadList(pRscList); - - if (pObj == NULL) - break; - - pRsc = (OS_RSTRUC *)(pObj->pRscObj); - - if (pRsc->pContent != NULL) { - /* free the timer memory */ - os_free_mem(pRsc->pContent); - pRsc->pContent = NULL; - } else { - /* - * The case is possible because some timers are released during - * the driver life time, EX: we will release some timers in - * MacTableDeleteEntry(). - * But we do not recommend the behavior, i.e. not to release - * timers in the driver life time; Or we can not cancel the - * timer for timer preemption problem. - */ - } - - os_free_mem(pObj); /* free the timer record entry */ - } - - OS_SEM_UNLOCK(&UtilSemLock); -} - -/* - * ======================================================================== - * Routine Description: - * Allocate a kernel task. - * - * Arguments: - * pTask - the task - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOSTaskAlloc(RTMP_OS_TASK *pTask, LIST_HEADER *pTaskList) -{ - if (RTMP_OS_Alloc_RscOnly(pTask, sizeof(OS_TASK)) == FALSE) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: alloc task fail!\n", __func__)); - return FALSE; /* allocate fail */ - } - - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Free a kernel task. - * - * Arguments: - * pTask - the task - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOSTaskFree(RTMP_OS_TASK *pTaskOrg) -{ - OS_TASK *pTask; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask != NULL) { - os_free_mem(pTask); - pTaskOrg->pContent = NULL; - } -} - -/* - * ======================================================================== - * Routine Description: - * Kill a kernel task. - * - * Arguments: - * pTaskOrg - the task - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -NDIS_STATUS RtmpOSTaskKill(RTMP_OS_TASK *pTaskOrg) -{ - OS_TASK *pTask; - NDIS_STATUS Status; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask != NULL) { - Status = __RtmpOSTaskKill(pTask); - RtmpOSTaskFree(pTaskOrg); - return Status; - } - - return NDIS_STATUS_FAILURE; -} - -/* - * ======================================================================== - * Routine Description: - * Notify kernel the task exit. - * - * Arguments: - * pTaskOrg - the task - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -INT RtmpOSTaskNotifyToExit(RTMP_OS_TASK *pTaskOrg) -{ - OS_TASK *pTask; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask == NULL) - return 0; - - return __RtmpOSTaskNotifyToExit(pTask); -} - -/* - * ======================================================================== - * Routine Description: - * Customize the task. - * - * Arguments: - * pTaskOrg - the task - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOSTaskCustomize(RTMP_OS_TASK *pTaskOrg) -{ - OS_TASK *pTask; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask) - __RtmpOSTaskCustomize(pTask); -} - -/* - * ======================================================================== - * Routine Description: - * Activate a kernel task. - * - * Arguments: - * pTaskOrg - the task - * fn - task handler - * arg - task input argument - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -NDIS_STATUS RtmpOSTaskAttach(RTMP_OS_TASK *pTaskOrg, RTMP_OS_TASK_CALLBACK fn, - ULONG arg) -{ - OS_TASK *pTask; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask == NULL) - return NDIS_STATUS_FAILURE; - - return __RtmpOSTaskAttach(pTask, fn, arg); -} - -/* - * ======================================================================== - * Routine Description: - * Initialize a kernel task. - * - * Arguments: - * pTaskOrg - the task - * pTaskName - task name - * pPriv - task input argument - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -NDIS_STATUS RtmpOSTaskInit(RTMP_OS_TASK *pTaskOrg, RTMP_STRING *pTaskName, - VOID *pPriv, LIST_HEADER *pTaskList, - LIST_HEADER *pSemList) -{ - OS_TASK *pTask; - - if (RtmpOSTaskAlloc(pTaskOrg, pTaskList) == FALSE) - return NDIS_STATUS_FAILURE; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask == NULL) - return NDIS_STATUS_FAILURE; - - return __RtmpOSTaskInit(pTask, pTaskName, pPriv, pSemList); -} - -/* - * ======================================================================== - * Routine Description: - * Wait for a event in the task. - * - * Arguments: - * pAd - WLAN control block pointer - * pTaskOrg - the task - * - * Return Value: - * TRUE - * FALSE - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOSTaskWait(VOID *pReserved, RTMP_OS_TASK *pTaskOrg, INT32 *pStatus) -{ - OS_TASK *pTask; - - pTask = (OS_TASK *)(pTaskOrg->pContent); - - if (pTask == NULL) - return FALSE; - - return __RtmpOSTaskWait(pReserved, pTask, pStatus); -} - -/* - * ======================================================================== - * Routine Description: - * Get private data for the task. - * - * Arguments: - * pTaskOrg - the task - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID *RtmpOsTaskDataGet(RTMP_OS_TASK *pTaskOrg) -{ - if (pTaskOrg->pContent == NULL) - return NULL; - - return ((OS_TASK *)(pTaskOrg->pContent))->priv; -} - -/* - * ======================================================================== - * Routine Description: - * Allocate a lock. - * - * Arguments: - * pLock - the lock - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsAllocateLock(NDIS_SPIN_LOCK *pLock, LIST_HEADER *pLockList) -{ - if (RTMP_OS_Alloc_RscOnly(pLock, sizeof(OS_NDIS_SPIN_LOCK)) == FALSE) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: alloc lock fail!\n", __func__)); - return FALSE; /* allocate fail */ - } - - OS_NdisAllocateSpinLock(pLock->pContent); - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Free a lock. - * - * Arguments: - * pLockOrg - the lock - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsFreeSpinLock(NDIS_SPIN_LOCK *pLockOrg) -{ - /* we will free all locks memory in RTMP_OS_FREE_LOCK() */ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_MINIPORT_TIMER *)(pLockOrg->pContent); - - if (pLock != NULL) { - OS_NdisFreeSpinLock(pLock); - os_free_mem(pLock); - pLockOrg->pContent = NULL; - } -} - -/* - * ======================================================================== - * Routine Description: - * Spin lock bh. - * - * Arguments: - * pLockOrg - the lock - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsSpinLockBh(NDIS_SPIN_LOCK *pLockOrg) -{ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_SPIN_LOCK *)(pLockOrg->pContent); - - if (pLock != NULL) - OS_SEM_LOCK(pLock); - else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lock> warning! the lock was freed!\n")); -} - -/* - * ======================================================================== - * Routine Description: - * Spin unlock bh. - * - * Arguments: - * pLockOrg - the lock - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsSpinUnLockBh(NDIS_SPIN_LOCK *pLockOrg) -{ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_SPIN_LOCK *)(pLockOrg->pContent); - - if (pLock != NULL) - OS_SEM_UNLOCK(pLock); - else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lock> warning! the lock was freed!\n")); -} - -/* - * ======================================================================== - * Routine Description: - * Interrupt lock. - * - * Arguments: - * pLockOrg - the lock - * pIrqFlags - the lock flags - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsIntLock(NDIS_SPIN_LOCK *pLockOrg, ULONG *pIrqFlags) -{ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_SPIN_LOCK *)(pLockOrg->pContent); - - if (pLock != NULL) - OS_INT_LOCK(pLock, *pIrqFlags); - else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lock> warning! the lock was freed!\n")); -} - -/* - * ======================================================================== - * Routine Description: - * Interrupt unlock. - * - * Arguments: - * pLockOrg - the lock - * IrqFlags - the lock flags - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsIntUnLock(NDIS_SPIN_LOCK *pLockOrg, ULONG IrqFlags) -{ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_SPIN_LOCK *)(pLockOrg->pContent); - - if (pLock != NULL) - OS_INT_UNLOCK(pLock, IrqFlags); - else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lock> warning! the lock was freed!\n")); -} - -void RtmpOsSpinLockIrqSave(NDIS_SPIN_LOCK *lock, unsigned long *flags) -{ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_SPIN_LOCK *)(lock->pContent); - - if (pLock != NULL) - spin_lock_irqsave((spinlock_t *)(pLock), *flags); - else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lock> warning! the lock was freed!\n")); -} - -void RtmpOsSpinUnlockIrqRestore(NDIS_SPIN_LOCK *lock, unsigned long *flags) -{ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_SPIN_LOCK *)(lock->pContent); - - if (pLock != NULL) - spin_unlock_irqrestore((spinlock_t *)(pLock), *flags); - else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lock> warning! the lock was freed!\n")); -} - -void RtmpOsSpinLockIrq(NDIS_SPIN_LOCK *lock) -{ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_SPIN_LOCK *)(lock->pContent); - - if (pLock != NULL) - spin_lock_irq((spinlock_t *)(pLock)); - else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lock> warning! the lock was freed!\n")); -} - -void RtmpOsSpinUnlockIrq(NDIS_SPIN_LOCK *lock) -{ - OS_NDIS_SPIN_LOCK *pLock; - - pLock = (OS_NDIS_SPIN_LOCK *)(lock->pContent); - - if (pLock != NULL) - spin_unlock_irq((spinlock_t *)(pLock)); - else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("lock> warning! the lock was freed!\n")); -} - -/* - * ======================================================================== - * Routine Description: - * Get MAC address for the network interface. - * - * Arguments: - * pDev - the device - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -unsigned char *RtmpOsNetDevGetPhyAddr(VOID *pDev) -{ - return RTMP_OS_NETDEV_GET_PHYADDR((PNET_DEV)pDev); -} - -/* - * ======================================================================== - * Routine Description: - * Start network interface TX queue. - * - * Arguments: - * pDev - the device - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsNetQueueStart(PNET_DEV pDev) -{ - RTMP_OS_NETDEV_START_QUEUE(pDev); -} - -/* - * ======================================================================== - * Routine Description: - * Stop network interface TX queue. - * - * Arguments: - * pDev - the device - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsNetQueueStop(PNET_DEV pDev) -{ - RTMP_OS_NETDEV_STOP_QUEUE(pDev); -} - -/* - * ======================================================================== - * Routine Description: - * Wake up network interface TX queue. - * - * Arguments: - * pDev - the device - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsNetQueueWake(PNET_DEV pDev) -{ - RTMP_OS_NETDEV_WAKE_QUEUE(pDev); -} - -/* - * ======================================================================== - * Routine Description: - * Assign network interface to the packet. - * - * Arguments: - * pPkt - the packet - * pDev - the device - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsSetPktNetDev(VOID *pPkt, VOID *pDev) -{ - SET_OS_PKT_NETDEV(pPkt, (PNET_DEV)pDev); -} - -/* - * ======================================================================== - * Routine Description: - * Assign network interface type. - * - * Arguments: - * pDev - the device - * Type - the type - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsSetNetDevType(VOID *pDev, USHORT Type) -{ - RTMP_OS_NETDEV_SET_TYPE((PNET_DEV)pDev, Type); -} - -/* - * ======================================================================== - * Routine Description: - * Assign network interface type for monitor mode. - * - * Arguments: - * pDev - the device - * Type - the type - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsSetNetDevTypeMonitor(VOID *pDev) -{ - RTMP_OS_NETDEV_SET_TYPE((PNET_DEV)pDev, ARPHRD_IEEE80211_PRISM); -} - -/* - * ======================================================================== - * Routine Description: - * Get PID. - * - * Arguments: - * pPkt - the packet - * pDev - the device - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsGetPid(IN ULONG *pDst, IN ULONG PID) -{ - RT_GET_OS_PID(*pDst, PID); -} - -/* - * ======================================================================== - * Routine Description: - * Wait for a moment. - * - * Arguments: - * Time - micro second - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsWait(UINT32 Time) -{ - OS_WAIT(Time); -} - -/* - * ======================================================================== - * Routine Description: - * Check if b is smaller than a. - * - * Arguments: - * Time - micro second - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -UINT32 RtmpOsTimerAfter(ULONG a, ULONG b) -{ - return RTMP_TIME_AFTER(a, b); -} - -/* - * ======================================================================== - * Routine Description: - * Check if b is not smaller than a. - * - * Arguments: - * Time - micro second - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -UINT32 RtmpOsTimerBefore(ULONG a, ULONG b) -{ - return RTMP_TIME_BEFORE(a, b); -} - -/* - * ======================================================================== - * Routine Description: - * Get current system time. - * - * Arguments: - * pTime - system time (tick) - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsGetSystemUpTime(ULONG *pTime) -{ - NdisGetSystemUpTime(pTime); -} - -/* - * ======================================================================== - * Routine Description: - * Get OS tick unit. - * - * Arguments: - * pOps - Utility table - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -UINT32 RtmpOsTickUnitGet(VOID) -{ - return HZ; -} - -/* - * ======================================================================== - * Routine Description: - * ntohs - * - * Arguments: - * Value - the value - * - * Return Value: - * the value - * - * Note: - * ======================================================================== - */ -UINT16 RtmpOsNtohs(UINT16 Value) -{ - return OS_NTOHS(Value); -} - -/* - * ======================================================================== - * Routine Description: - * htons - * - * Arguments: - * Value - the value - * - * Return Value: - * the value - * - * Note: - * ======================================================================== - */ -UINT16 RtmpOsHtons(UINT16 Value) -{ - return OS_HTONS(Value); -} - -/* - * ======================================================================== - * Routine Description: - * ntohl - * - * Arguments: - * Value - the value - * - * Return Value: - * the value - * - * Note: - * ======================================================================== - */ -UINT32 RtmpOsNtohl(UINT32 Value) -{ - return OS_NTOHL(Value); -} - -/* - * ======================================================================== - * Routine Description: - * htonl - * - * Arguments: - * Value - the value - * - * Return Value: - * the value - * - * Note: - * ======================================================================== - */ -UINT32 RtmpOsHtonl(UINT32 Value) -{ - return OS_HTONL(Value); -} - -/* - * ======================================================================== - * Routine Description: - * get_unaligned for 16-bit value. - * - * Arguments: - * pWord - the value - * - * Return Value: - * the value - * - * Note: - * ======================================================================== - */ -UINT16 RtmpOsGetUnaligned(UINT16 *pWord) -{ - return get_unaligned(pWord); -} - -/* - * ======================================================================== - * Routine Description: - * get_unaligned for 32-bit value. - * - * Arguments: - * pWord - the value - * - * Return Value: - * the value - * - * Note: - * ======================================================================== - */ -UINT32 RtmpOsGetUnaligned32(UINT32 *pWord) -{ - return get_unaligned(pWord); -} - -/* - * ======================================================================== - * Routine Description: - * get_unaligned for long-bit value. - * - * Arguments: - * pWord - the value - * - * Return Value: - * the value - * - * Note: - * ======================================================================== - */ -ULONG RtmpOsGetUnalignedlong(ULONG *pWord) -{ - return get_unaligned(pWord); -} - -/* - * ======================================================================== - * Routine Description: - * Get maximum scan data length. - * - * Arguments: - * None - * - * Return Value: - * length - * - * Note: - * Used in site servey. - * ======================================================================== - */ -ULONG RtmpOsMaxScanDataGet(VOID) -{ - return IW_SCAN_MAX_DATA; -} - -/* - * ======================================================================== - * Routine Description: - * copy_from_user - * - * Arguments: - * to - - * from - - * n - size - * - * Return Value: - * copy size - * - * Note: - * ======================================================================== - */ -ULONG RtmpOsCopyFromUser(VOID *to, const void *from, ULONG n) -{ - return copy_from_user(to, from, n); -} - -/* - * ======================================================================== - * Routine Description: - * copy_to_user - * - * Arguments: - * to - - * from - - * n - size - * - * Return Value: - * copy size - * - * Note: - * ======================================================================== - */ -ULONG RtmpOsCopyToUser(VOID *to, const void *from, ULONG n) -{ - return copy_to_user(to, from, n); -} - -/* - * ======================================================================== - * Routine Description: - * Initialize a semaphore. - * - * Arguments: - * pSem - the semaphore - * - * Return Value: - * TRUE - Successfully - * FALSE - Fail - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsSemaInitLocked(RTMP_OS_SEM *pSem, LIST_HEADER *pSemList) -{ - if (RTMP_OS_Alloc_RscOnly(pSem, sizeof(OS_SEM)) == FALSE) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: alloc semaphore fail!\n", __func__)); - return FALSE; - } - - OS_SEM_EVENT_INIT_LOCKED((OS_SEM *)(pSem->pContent)); - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Initialize a semaphore. - * - * Arguments: - * pSemOrg - the semaphore - * - * Return Value: - * TRUE - Successfully - * FALSE - Fail - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsSemaInit(RTMP_OS_SEM *pSem, LIST_HEADER *pSemList) -{ - if (RTMP_OS_Alloc_RscOnly(pSem, sizeof(OS_SEM)) == FALSE) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: alloc semaphore fail!\n", __func__)); - return FALSE; - } - - OS_SEM_EVENT_INIT((OS_SEM *)(pSem->pContent)); - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Destroy a semaphore. - * - * Arguments: - * pSemOrg - the semaphore - * - * Return Value: - * TRUE - Successfully - * FALSE - Fail - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsSemaDestory(RTMP_OS_SEM *pSemOrg) -{ - OS_SEM *pSem; - - pSem = (OS_SEM *)(pSemOrg->pContent); - - if (pSem != NULL) { - OS_SEM_EVENT_DESTORY(pSem); - os_free_mem(pSem); - pSemOrg->pContent = NULL; - } else - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("sem> warning! double-free sem!\n")); - - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Wait a semaphore. - * - * Arguments: - * pSemOrg - the semaphore - * - * Return Value: - * 0 - Successfully - * Otherwise - Fail - * - * Note: - * ======================================================================== - */ -INT32 RtmpOsSemaWaitInterruptible(RTMP_OS_SEM *pSemOrg) -{ - OS_SEM *pSem; - INT Status = -1; - - pSem = (OS_SEM *)(pSemOrg->pContent); - - if (pSem != NULL) - OS_SEM_EVENT_WAIT(pSem, Status); - - return Status; -} - -/* - * ======================================================================== - * Routine Description: - * Wake up a semaphore. - * - * Arguments: - * pSemOrg - the semaphore - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsSemaWakeUp(RTMP_OS_SEM *pSemOrg) -{ - OS_SEM *pSem; - - pSem = (OS_SEM *)(pSemOrg->pContent); - - if (pSem != NULL) - OS_SEM_EVENT_UP(pSem); -} - -/* - * ======================================================================== - * Routine Description: - * Check if we are in a interrupt. - * - * Arguments: - * None - * - * Return Value: - * 0 - No - * Otherwise - Yes - * - * Note: - * ======================================================================== - */ -INT32 RtmpOsIsInInterrupt(VOID) -{ - return in_interrupt(); -} - -/* - * ======================================================================== - * Routine Description: - * Copy the data buffer to the packet frame body. - * - * Arguments: - * pAd - WLAN control block pointer - * pNetPkt - the packet - * ThisFrameLen - copy length - * pData - the data buffer - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsPktBodyCopy(PNET_DEV pNetDev, PNDIS_PACKET pNetPkt, - ULONG ThisFrameLen, PUCHAR pData) -{ - memcpy(skb_put(pNetPkt, ThisFrameLen), pData, ThisFrameLen); - SET_OS_PKT_NETDEV(pNetPkt, pNetDev); -} - -/* - * ======================================================================== - * Routine Description: - * Check if the packet is cloned. - * - * Arguments: - * pNetPkt - the packet - * - * Return Value: - * TRUE - Yes - * Otherwise - No - * - * Note: - * ======================================================================== - */ -INT RtmpOsIsPktCloned(PNDIS_PACKET pNetPkt) -{ - return OS_PKT_CLONED(pNetPkt); -} - -/* - * ======================================================================== - * Routine Description: - * Duplicate a packet. - * - * Arguments: - * pNetPkt - the packet - * - * Return Value: - * the new packet - * - * Note: - * ======================================================================== - */ -PNDIS_PACKET RtmpOsPktCopy(PNDIS_PACKET pNetPkt) -{ - return skb_copy(RTPKT_TO_OSPKT(pNetPkt), GFP_ATOMIC); -} - -/* - * ======================================================================== - * Routine Description: - * Clone a packet. - * - * Arguments: - * pNetPkt - the packet - * - * Return Value: - * the cloned packet - * - * Note: - * ======================================================================== - */ -PNDIS_PACKET RtmpOsPktClone(PNDIS_PACKET pNetPkt) -{ - return skb_clone(RTPKT_TO_OSPKT(pNetPkt), MEM_ALLOC_FLAG); -} - -/* - * ======================================================================== - * Routine Description: - * Assign the data pointer for the packet. - * - * Arguments: - * pNetPkt - the packet - * *pData - the data buffer - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsPktDataPtrAssign(PNDIS_PACKET pNetPkt, UCHAR *pData) -{ - SET_OS_PKT_DATAPTR(pNetPkt, pData); -} - -/* - * ======================================================================== - * Routine Description: - * Assign the data length for the packet. - * - * Arguments: - * pNetPkt - the packet - * Len - the data length - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsPktLenAssign(PNDIS_PACKET pNetPkt, LONG Len) -{ - SET_OS_PKT_LEN(pNetPkt, Len); -} - -/* - * ======================================================================== - * Routine Description: - * Adjust the tail pointer for the packet. - * - * Arguments: - * pNetPkt - the packet - * removedTagLen - the size for adjustment - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsPktTailAdjust(PNDIS_PACKET pNetPkt, UINT removedTagLen) -{ - OS_PKT_TAIL_ADJUST(pNetPkt, removedTagLen); -} - -/* - * ======================================================================== - * Routine Description: - * Adjust the data pointer for the packet. - * - * Arguments: - * pNetPkt - the packet - * Len - the size for adjustment - * - * Return Value: - * the new data pointer for the packet - * - * Note: - * ======================================================================== - */ -PUCHAR RtmpOsPktTailBufExtend(PNDIS_PACKET pNetPkt, UINT Len) -{ - return OS_PKT_TAIL_BUF_EXTEND(pNetPkt, Len); -} - -/* - * ======================================================================== - * Routine Description: - * adjust headroom for the packet. - * - * Arguments: - * pNetPkt - the packet - * Len - the size for adjustment - * - * Return Value: - * the new data pointer for the packet - * - * Note: - * ======================================================================== - */ -VOID RtmpOsPktReserve(PNDIS_PACKET pNetPkt, UINT Len) -{ - OS_PKT_RESERVE(pNetPkt, Len); -} - -/* - * ======================================================================== - * Routine Description: - * Adjust the data pointer for the packet. - * - * Arguments: - * pNetPkt - the packet - * Len - the size for adjustment - * - * Return Value: - * the new data pointer for the packet - * - * Note: - * ======================================================================== - */ -PUCHAR RtmpOsPktHeadBufExtend(PNDIS_PACKET pNetPkt, UINT Len) -{ - return OS_PKT_HEAD_BUF_EXTEND(pNetPkt, Len); -} - -INT32 RtmpThreadPidKill(RTMP_OS_PID PID) -{ - return KILL_THREAD_PID(PID, SIGTERM, 1); -} - -long RtmpOsSimpleStrtol(const char *cp, char **endp, unsigned int base) -{ - return simple_strtol(cp, endp, base); -} - -BOOLEAN RtmpOsPktOffsetInit(VOID) -{ - struct sk_buff *pPkt = NULL; - - if ((RTPktOffsetData == 0) && (RTPktOffsetLen == 0) && - (RTPktOffsetCB == 0)) { - os_alloc_mem(NULL, (UCHAR **)&pPkt, sizeof(struct sk_buff)); - - if (pPkt == NULL) - return FALSE; - - RTPktOffsetData = (ULONG)(&(pPkt->data)) - (ULONG)pPkt; - RTPktOffsetLen = (ULONG)(&(pPkt->len)) - (ULONG)pPkt; - RTPktOffsetCB = (ULONG)(pPkt->cb) - (ULONG)pPkt; - os_free_mem(pPkt); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("packet> data offset = %lu\n", RTPktOffsetData)); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("packet> len offset = %lu\n", RTPktOffsetLen)); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("packet> cb offset = %lu\n", RTPktOffsetCB)); - } - - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Initialize the OS atomic_t. - * - * Arguments: - * pAtomic - the atomic - * - * Return Value: - * TRUE - allocation successfully - * FALSE - allocation fail - * - * Note: - * ======================================================================== - */ -BOOLEAN RtmpOsAtomicInit(RTMP_OS_ATOMIC *pAtomic, LIST_HEADER *pAtomicList) -{ - if (RTMP_OS_Alloc_RscOnly(pAtomic, sizeof(atomic_t)) == FALSE) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: alloc atomic fail!\n", __func__)); - return FALSE; /* allocate fail */ - } - - return TRUE; -} - -/* - * ======================================================================== - * Routine Description: - * Initialize the OS atomic_t. - * - * Arguments: - * pAtomic - the atomic - * - * Return Value: - * TRUE - allocation successfully - * FALSE - allocation fail - * - * Note: - * ======================================================================== - */ -VOID RtmpOsAtomicDestroy(RTMP_OS_ATOMIC *pAtomic) -{ - if (pAtomic->pContent) { - os_free_mem(pAtomic->pContent); - pAtomic->pContent = NULL; - } -} - -/* - * ======================================================================== - * Routine Description: - * Atomic read a variable. - * - * Arguments: - * pAtomic - the atomic - * - * Return Value: - * content - * - * Note: - * ======================================================================== - */ -LONG RtmpOsAtomicRead(RTMP_OS_ATOMIC *pAtomicSrc) -{ - if (pAtomicSrc->pContent) - return atomic_read((atomic_t *)(pAtomicSrc->pContent)); - else - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * Atomic dec a variable. - * - * Arguments: - * pAtomic - the atomic - * - * Return Value: - * content - * - * Note: - * ======================================================================== - */ -VOID RtmpOsAtomicDec(RTMP_OS_ATOMIC *pAtomicSrc) -{ - if (pAtomicSrc->pContent) - atomic_dec((atomic_t *)(pAtomicSrc->pContent)); -} - -/* - * ======================================================================== - * Routine Description: - * Sets a 32-bit variable to the specified value as an atomic operation. - * - * Arguments: - * pAtomic - the atomic - * Value - the value to be exchanged - * - * Return Value: - * the initial value of the pAtomicSrc parameter - * - * Note: - * ======================================================================== - */ -VOID RtmpOsAtomicInterlockedExchange(RTMP_OS_ATOMIC *pAtomicSrc, LONG Value) -{ - if (pAtomicSrc->pContent) - InterlockedExchange((atomic_t *)(pAtomicSrc->pContent), Value); -} - -/* - * ======================================================================== - * Routine Description: - * Initialize the OS utilities. - * - * Arguments: - * pOps - Utility table - * - * Return Value: - * None - * - * Note: - * ======================================================================== - */ -VOID RtmpOsOpsInit(RTMP_OS_ABL_OPS *pOps) -{ - pOps->ra_printk = (RTMP_PRINTK)printk; - pOps->ra_snprintf = (RTMP_SNPRINTF)snprintf; -} - -#else /* OS_ABL_FUNC_SUPPORT */ - -void RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfoOrg, BOOLEAN bSet) -{ - __RtmpOSFSInfoChange(pOSFSInfoOrg, bSet); -} - -/* timeout -- ms */ -VOID RTMP_SetPeriodicTimer(NDIS_MINIPORT_TIMER *pTimerOrg, - unsigned long timeout) -{ - __RTMP_SetPeriodicTimer(pTimerOrg, timeout); -} - -/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */ -VOID RTMP_OS_Init_Timer(VOID *pReserved, NDIS_MINIPORT_TIMER *pTimerOrg, - TIMER_FUNCTION function, PVOID data, - LIST_HEADER *pTimerList) -{ - __RTMP_OS_Init_Timer(pReserved, pTimerOrg, function, data); -} - -VOID RTMP_OS_Add_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout) -{ - __RTMP_OS_Add_Timer(pTimerOrg, timeout); -} - -VOID RTMP_OS_Mod_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout) -{ - __RTMP_OS_Mod_Timer(pTimerOrg, timeout); -} - -VOID RTMP_OS_Del_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, BOOLEAN *pCancelled) -{ - __RTMP_OS_Del_Timer(pTimerOrg, pCancelled); -} - -VOID RTMP_OS_Release_Timer(NDIS_MINIPORT_TIMER *pTimerOrg) -{ - __RTMP_OS_Release_Timer(pTimerOrg); -} - -NDIS_STATUS RtmpOSTaskKill(RTMP_OS_TASK *pTask) -{ - NDIS_STATUS Status; - if (pTask != NULL) { - Status = __RtmpOSTaskKill(pTask); - return Status; - } - return NDIS_STATUS_FAILURE; -} - -INT RtmpOSTaskNotifyToExit(RTMP_OS_TASK *pTask) -{ - return __RtmpOSTaskNotifyToExit(pTask); -} - -void RtmpOSTaskCustomize(RTMP_OS_TASK *pTask) -{ - __RtmpOSTaskCustomize(pTask); -} - -NDIS_STATUS RtmpOSTaskAttach(RTMP_OS_TASK *pTask, RTMP_OS_TASK_CALLBACK fn, - ULONG arg) -{ - return __RtmpOSTaskAttach(pTask, fn, arg); -} - -NDIS_STATUS RtmpOSTaskInit(RTMP_OS_TASK *pTask, RTMP_STRING *pTaskName, - VOID *pPriv, LIST_HEADER *pTaskList, - LIST_HEADER *pSemList) -{ - return __RtmpOSTaskInit(pTask, pTaskName, pPriv, pSemList); -} - -BOOLEAN RtmpOSTaskWait(VOID *pReserved, RTMP_OS_TASK *pTask, INT32 *pStatus) -{ - return __RtmpOSTaskWait(pReserved, pTask, pStatus); -} - -VOID RtmpOsTaskWakeUp(RTMP_OS_TASK *pTask) -{ - WAKE_UP(pTask); -} - -#endif /* OS_ABL_FUNC_SUPPORT */ - -/* pAd MUST allow to be NULL */ - -#ifdef MEM_ALLOC_INFO_SUPPORT -VOID MemInfoListInital(VOID) -{ - MIListInit(&MemInfoList); - MIListInit(&PktInfoList); -} - -UINT32 ShowMemAllocInfo(VOID) -{ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Show General Allocated Memory Info:\n")); - ShowMIList(&MemInfoList); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Maximum Allocated Memory Size: %u\n", - MemInfoList.MaxAlcSize)); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Current Allocated Memory Size: %u\n", - MemInfoList.CurAlcSize)); - return MemInfoList.EntryNumber; -} - -UINT32 ShowPktAllocInfo(VOID) -{ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Show Packet Allocated Memory Info:\n")); - ShowMIList(&PktInfoList); - return PktInfoList.EntryNumber; -} -#endif /* MEM_ALLOC_INFO_SUPPORT */ - -/*Unify Utility APIs*/ -INT os_alloc_mem(VOID *pAd, UCHAR **mem, ULONG size) -{ - *mem = (PUCHAR)kmalloc(size, GFP_ATOMIC); - - if (*mem) { -#ifdef VENDOR_FEATURE4_SUPPORT - OS_NumOfMemAlloc++; -#endif /* VENDOR_FEATURE4_SUPPORT */ -#ifdef MEM_ALLOC_INFO_SUPPORT - MIListAddHead(&MemInfoList, size, *mem, - __builtin_return_address(0)); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - return NDIS_STATUS_SUCCESS; - } else - return NDIS_STATUS_FAILURE; -} - -VOID os_free_mem(PVOID mem) -{ -#ifdef MEM_ALLOC_INFO_SUPPORT - MEM_INFO_LIST_ENTRY *delEntry; - - delEntry = MIListRemove(&MemInfoList, mem); - - if (delEntry == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("the memory has not been allocated\n")); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("mem addr = %p, caller is %pS\n", mem, - __builtin_return_address(0))); - dump_stack(); - } else -#endif /* MEM_ALLOC_INFO_SUPPORT */ - { - ASSERT(mem); - kfree(mem); - } - -#ifdef VENDOR_FEATURE4_SUPPORT - OS_NumOfMemFree++; -#endif /* VENDOR_FEATURE4_SUPPORT */ -} - -VOID os_zero_mem(PVOID ptr, ULONG length) -{ - memset(ptr, 0, length); -} - -VOID os_move_mem(PVOID pDest, PVOID pSrc, ULONG length) -{ - memmove(pDest, pSrc, length); -} - -VOID os_fill_mem(PVOID pBuf, ULONG Length, UCHAR Fill) -{ - memset(pBuf, Fill, Length); -} - -INT os_cmp_mem(PVOID Destination, PVOID Source, ULONG Length) -{ - return memcmp(Destination, Source, Length); -} - -INT os_equal_mem(PVOID pBuf1, PVOID pBuf2, ULONG length) -{ - return !memcmp(pBuf1, pBuf2, length); -} - -CHAR *os_str_chr(CHAR *str, INT character) -{ - return strchr(str, character); -} - -CHAR *os_str_pbrk(CHAR *str1, CHAR *str2) -{ - return strpbrk(str1, str2); -} - -UINT32 os_str_spn(CHAR *str1, CHAR *str2) -{ - return strspn(str1, str2); -} - -LONG os_str_tol(const CHAR *str, CHAR **endptr, INT32 base) -{ - return simple_strtol(str, (char **)endptr, base); -} - -LONG os_str_toul(const CHAR *str, CHAR **endptr, INT32 base) -{ - return simple_strtoul(str, (char **)endptr, base); -} - -CHAR *os_str_str(const CHAR *str1, const CHAR *str2) -{ - return strstr(str1, str2); -} - -void os_kref_init(os_kref *ref) -{ - kref_init(ref); -} - -void os_kref_get(os_kref *ref) -{ - kref_get(ref); -} - -int os_kref_put(os_kref *ref, void (*release)(os_kref *ref)) -{ - return kref_put(ref, release); -} - -/*test only*/ -#ifdef DBG_STARVATION -static inline void block_entry_free(struct starv_log_entry *entry) -{ - struct starv_dbg_block *block = entry->block; - struct starv_log *ctrl = block->ctrl; - - DlListDel(&entry->list); - if (entry->log) - os_free_mem(entry->log); - os_zero_mem(entry, sizeof(struct starv_log_entry)); - DlListAdd(&ctrl->free, &entry->list); -} - -static inline void block_init(struct starv_dbg_block *block) -{ - struct starv_log_entry *entry, *tmp; - - DlListForEachSafe(entry, tmp, &block->log_head, struct starv_log_entry, - list) - { - block_entry_free(entry); - } - - block->avg_dur = 0; - block->max_dur = 0; - block->min_dur = 1; - block->count = 0; - block->timeout_cnt = 0; -} - -static struct starv_log_entry *starv_log_insert(struct starv_dbg *starv) -{ - struct starv_dbg_block *block = starv->block; - struct starv_log *ctrl = block->ctrl; - struct starv_log_entry *entry = NULL; - - NdisAcquireSpinLock(&ctrl->lock); - entry = DlListFirst(&ctrl->free, struct starv_log_entry, list); - if (!entry) - goto end; - - DlListDel(&entry->list); - entry->duration = starv->msec; - entry->block = starv->block; - DlListAddTail(&block->log_head, &entry->list); -end: - NdisReleaseSpinLock(&ctrl->lock); - return entry; -} - -static void strav_timeout_handle(struct starv_dbg *starv) -{ - struct starv_log_entry *entry; - struct starv_dbg_block *block = starv->block; - - entry = starv_log_insert(starv); - - if (block->timeout_fn && entry) - block->timeout_fn(starv, entry); - - block->timeout_cnt++; -} - -VOID starv_dbg_init(struct starv_dbg_block *block, struct starv_dbg *starv) -{ - /*initial value*/ - starv->msec = 0; - starv->start_jiffies = 0; - starv->end_jiffies = 0; - starv->block = block; - return; -} - -VOID starv_dbg_get(struct starv_dbg *starv) -{ - struct starv_dbg_block *block = starv->block; - - starv->start_jiffies = jiffies; - - if (block->entry_fn) - block->entry_fn(starv); -} - -VOID starv_dbg_put(struct starv_dbg *starv) -{ - struct starv_dbg_block *block = starv->block; - - starv->end_jiffies = jiffies; - starv->msec = jiffies_to_msecs( - abs(starv->end_jiffies - starv->start_jiffies)); - /*update block*/ - block->max_dur = - (starv->msec > block->max_dur) ? starv->msec : block->max_dur; - block->min_dur = - (starv->msec < block->min_dur) ? starv->msec : block->min_dur; - block->avg_dur = (starv->msec + block->avg_dur * block->count) / - (block->count + 1); - block->count++; - /*check timeout*/ - if (starv->msec > block->timeout) - strav_timeout_handle(starv); - - if (block->leave_fn) - block->leave_fn(starv); -} - -VOID starv_log_dump(struct starv_log *ctrl) -{ - struct starv_log_entry *entry, *tmp; - struct starv_dbg_block *block, *btmp; - - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===========================================================================\n")); - - NdisAcquireSpinLock(&ctrl->lock); - DlListForEachSafe(block, btmp, &ctrl->block_head, - struct starv_dbg_block, list) - { - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[block %s]\t min: %d, max: %d, avg: %d, timeout cnt: %d, total cnt: %d\n", - block->name, block->min_dur, block->max_dur, - block->avg_dur, block->timeout_cnt, block->count)); - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===========================================================================\n")); - - DlListForEachSafe(entry, tmp, &block->log_head, - struct starv_log_entry, list) - { - if (block->log_fn) - block->log_fn(entry); - } - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===========================================================================\n")); - block_init(block); - } - - NdisReleaseSpinLock(&ctrl->lock); -} - -void starv_timeout_log_basic(struct starv_log_entry *entry) -{ - struct starv_log_basic *log = entry->log; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("[%s] id: %d, qsize: %d, duration: %d ms\n", - entry->block->name, log->id, log->qsize, entry->duration)); -} - -INT register_starv_block(struct starv_dbg_block *block) -{ - struct starv_log *ctrl = block->ctrl; - - NdisAcquireSpinLock(&ctrl->lock); - DlListInit(&block->log_head); - block_init(block); - DlListAddTail(&ctrl->block_head, &block->list); - NdisReleaseSpinLock(&ctrl->lock); - return 0; -} - -VOID unregister_starv_block(struct starv_dbg_block *block) -{ - struct starv_log *ctrl = block->ctrl; - - NdisAcquireSpinLock(&ctrl->lock); - DlListDel(&block->list); - block_init(block); - NdisReleaseSpinLock(&ctrl->lock); -} - -INT starv_log_init(struct starv_log *ctrl) -{ - INT i; - struct starv_log_entry *entry = NULL; - - os_zero_mem(ctrl, sizeof(struct starv_log)); - NdisAllocateSpinLock(NULL, &ctrl->lock); - DlListInit(&ctrl->free); - DlListInit(&ctrl->block_head); - /*add to free pool*/ - for (i = 0; i < STARV_ENTRY_SIZE; i++) { - entry = &ctrl->pool[i]; - DlListAddTail(&ctrl->free, &entry->list); - } - return 0; -} - -VOID starv_log_exit(struct starv_log *ctrl) -{ - starv_log_dump(ctrl); - DlListInit(&ctrl->free); - DlListInit(&ctrl->block_head); - NdisFreeSpinLock(&ctrl->lock); - os_zero_mem(&ctrl, sizeof(struct starv_log)); -} - -#endif /*DBG_STARVATION*/ - -#ifdef CONFIG_DBG_QDISC -/* -* -*/ -void os_system_tx_queue_dump(PNET_DEV dev) -{ - struct netdev_queue *txq; - struct Qdisc *q; - struct sk_buff *skb; - int i = 0, j = 0, k = 0; - struct page *p; - size_t page_size; - int len; - - for (i = 0; i < dev->num_tx_queues; i++) { - txq = netdev_get_tx_queue(dev, i); - q = rcu_dereference(txq->qdisc); - len = qdisc_qlen(q); - printk("%s(): devname:%s, q=%p, qlen=%d, page size:%lu\n", - __func__, dev->name, q, len, PAGE_SIZE); - skb = q->ops->peek(q); - /* If we run with a TX queue, check if the queue is too long*/ - for (j = 0; j < len; j++) { - printk("%s(): skb=%p,len:%d, skb->head: %p,%p , dev:%s, \n", - __func__, skb, skb->len, skb->data, skb->data, - skb->dev->name); - if (skb->head) { - p = virt_to_head_page(skb->head); - page_size = PAGE_SIZE << compound_order(p); - printk("%s(): index:%d, page:%p ,rfcnt:%d, page size:%zu, order:%u, dtor:%d\n", - __func__, k++, p, - atomic_read(&p->_count), page_size, - compound_order(p), p->compound_dtor); - } - skb = skb->next; - } - printk("%s(): qdisc stats!\n", __func__); - printk("%s(): qlen: %d, backlog: %d\n", __func__, - q->qstats.qlen, q->qstats.backlog); - printk("%s(): drops: %d, requeues: %d, overlimits:% d\n", - __func__, q->qstats.drops, q->qstats.requeues, - q->qstats.overlimits); - } -} -#endif /*CONFIG_DBG_QDISC*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_linux_symb.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_linux_symb.c deleted file mode 100644 index 0a5f133e64..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_linux_symb.c +++ /dev/null @@ -1,299 +0,0 @@ -/**************************************************************************** - - Module Name: - UTIL/rt_linux_symb.c - - Abstract: - All symbols provided from UTIL module are put here. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - -***************************************************************************/ - -#define RTMP_MODULE_OS -#define RTMP_MODULE_OS_UTIL - -/*#include "rt_config.h" */ -#include "rtmp_comm.h" -#include "rtmp_osabl.h" -#include "rt_os_util.h" - -#ifdef OS_ABL_FUNC_SUPPORT - -EXPORT_SYMBOL(DebugLevel); -EXPORT_SYMBOL(DebugCategory); - -/* utility */ -EXPORT_SYMBOL(RtmpUtilInit); -EXPORT_SYMBOL(RTMPFreeNdisPacket); -EXPORT_SYMBOL(AdapterBlockAllocateMemory); - -EXPORT_SYMBOL(RTMP_SetPeriodicTimer); -EXPORT_SYMBOL(RTMP_OS_Add_Timer); -EXPORT_SYMBOL(RTMP_OS_Mod_Timer); -EXPORT_SYMBOL(RTMP_OS_Del_Timer); -EXPORT_SYMBOL(RTMP_OS_Init_Timer); -EXPORT_SYMBOL(RTMP_OS_Release_Timer); - -EXPORT_SYMBOL(RTMP_OS_Alloc_Rsc); -EXPORT_SYMBOL(RTMP_OS_Free_Rscs); - -EXPORT_SYMBOL(os_alloc_mem); -EXPORT_SYMBOL(os_alloc_mem_suspend); -EXPORT_SYMBOL(os_free_mem); - -EXPORT_SYMBOL(ExpandPacket); -EXPORT_SYMBOL(ClonePacket); -EXPORT_SYMBOL(DuplicatePacket); -EXPORT_SYMBOL(RTMP_AllocateFragPacketBuffer); -EXPORT_SYMBOL(RtmpOSNetPktAlloc); -EXPORT_SYMBOL(duplicate_pkt_with_TKIP_MIC); -EXPORT_SYMBOL(RTMPAllocateNdisPacket); -EXPORT_SYMBOL(RTMP_QueryPacketInfo); -EXPORT_SYMBOL(RTMPL2FrameTxAction); -EXPORT_SYMBOL(RtmpOsPktBodyCopy); -EXPORT_SYMBOL(RtmpOsIsPktCloned); -EXPORT_SYMBOL(RtmpOsPktCopy); -EXPORT_SYMBOL(RtmpOsPktClone); -EXPORT_SYMBOL(RtmpOsPktDataPtrAssign); -EXPORT_SYMBOL(RtmpOsPktLenAssign); -EXPORT_SYMBOL(RtmpOsPktTailAdjust); -EXPORT_SYMBOL(RtmpOsPktTailBufExtend); -EXPORT_SYMBOL(RtmpOsPktHeadBufExtend); -EXPORT_SYMBOL(RtmpOsPktReserve); -EXPORT_SYMBOL(RtmpOsPktProtocolAssign); -EXPORT_SYMBOL(RtmpThreadPidKill); -EXPORT_SYMBOL(RtmpOsPktRcvHandle); -#ifdef IAPP_SUPPORT -EXPORT_SYMBOL(RtmpOsPktIappMakeUp); -#endif /* IAPP_SUPPORT */ -EXPORT_SYMBOL(RtmpOsPktInit); -#ifdef CONFIG_AP_SUPPORT -EXPORT_SYMBOL(VLAN_8023_Header_Copy); -#endif /* CONFIG_AP_SUPPORT */ -EXPORT_SYMBOL(wlan_802_11_to_802_3_packet); -EXPORT_SYMBOL(RtmpOsPktOffsetInit); -EXPORT_SYMBOL(RtmpOSNetDevCreate); -EXPORT_SYMBOL(RtmpOSNetDevClose); -EXPORT_SYMBOL(RtmpOSNetDevAttach); -EXPORT_SYMBOL(RtmpOSNetDevDetach); -EXPORT_SYMBOL(RtmpOSNetDevFree); -EXPORT_SYMBOL(RtmpOSNetDevIsUp); -EXPORT_SYMBOL(RtmpOsNetDevGetPhyAddr); -EXPORT_SYMBOL(RtmpOsNetQueueStart); -EXPORT_SYMBOL(RtmpOsNetQueueStop); -EXPORT_SYMBOL(RtmpOsNetQueueWake); -EXPORT_SYMBOL(RtmpOsSetPktNetDev); -EXPORT_SYMBOL(RtmpOsPktNetDevGet); -EXPORT_SYMBOL(RtmpOsGetNetDevName); -EXPORT_SYMBOL(RtmpOsGetNetIfIndex); -EXPORT_SYMBOL(RtmpOsSetNetDevPriv); -EXPORT_SYMBOL(RtmpOsGetNetDevPriv); -EXPORT_SYMBOL(RtmpDevPrivFlagsGet); -EXPORT_SYMBOL(RtmpOsSetNetDevType); -EXPORT_SYMBOL(RtmpOsSetNetDevTypeMonitor); -EXPORT_SYMBOL(get_sniffer_mode); -EXPORT_SYMBOL(set_sniffer_mode); -EXPORT_SYMBOL(RtmpOSNetDevAddrSet); - -EXPORT_SYMBOL(RtmpOSFileOpen); -EXPORT_SYMBOL(RtmpOSFSInfoChange); -EXPORT_SYMBOL(RtmpOSFileWrite); -EXPORT_SYMBOL(RtmpOSFileRead); -EXPORT_SYMBOL(RtmpOSFileClose); -EXPORT_SYMBOL(RtmpOSFileSeek); -EXPORT_SYMBOL(RtmpOsFileIsErr); - -EXPORT_SYMBOL(RtmpOSTaskNotifyToExit); -EXPORT_SYMBOL(RtmpOSTaskInit); -EXPORT_SYMBOL(RtmpOSTaskAttach); -EXPORT_SYMBOL(RtmpOSTaskCustomize); -EXPORT_SYMBOL(RtmpOSTaskKill); -EXPORT_SYMBOL(RtmpOSTaskAlloc); -EXPORT_SYMBOL(RtmpOSTaskFree); -EXPORT_SYMBOL(RtmpOSTaskWait); -EXPORT_SYMBOL(RtmpOsCheckTaskLegality); -EXPORT_SYMBOL(RtmpOsTaskDataGet); -EXPORT_SYMBOL(RtmpOsTaskIsKilled); -EXPORT_SYMBOL(RtmpOsTaskWakeUp); -EXPORT_SYMBOL(RtmpOsInitCompletion); -EXPORT_SYMBOL(RtmpOsExitCompletion); -EXPORT_SYMBOL(RtmpOsComplete); -EXPORT_SYMBOL(RtmpOsWaitForCompletionTimeout); - -EXPORT_SYMBOL(RtmpOsTaskletSche); -EXPORT_SYMBOL(RtmpOsTaskletInit); -EXPORT_SYMBOL(RtmpOsTaskletKill); -EXPORT_SYMBOL(RtmpOsTaskletDataAssign); -EXPORT_SYMBOL(RtmpOsTaskPidInit); - -EXPORT_SYMBOL(RtmpOsAllocateLock); -EXPORT_SYMBOL(RtmpOsFreeSpinLock); -EXPORT_SYMBOL(RtmpOsSpinLockBh); -EXPORT_SYMBOL(RtmpOsSpinUnLockBh); -EXPORT_SYMBOL(RtmpOsIntLock); -EXPORT_SYMBOL(RtmpOsIntUnLock); - -EXPORT_SYMBOL(RtmpOsSemaInitLocked); -EXPORT_SYMBOL(RtmpOsSemaInit); -EXPORT_SYMBOL(RtmpOsSemaDestory); -EXPORT_SYMBOL(RtmpOsSemaWaitInterruptible); -EXPORT_SYMBOL(RtmpOsSemaWakeUp); -EXPORT_SYMBOL(RtmpOsMlmeUp); - -EXPORT_SYMBOL(RtmpOsGetPid); - -EXPORT_SYMBOL(RtmpOsWait); -EXPORT_SYMBOL(RtmpOsTimerAfter); -EXPORT_SYMBOL(RtmpOsTimerBefore); -EXPORT_SYMBOL(RtmpOsGetSystemUpTime); - -EXPORT_SYMBOL(RtmpOsDCacheFlush); - -#ifdef RTMP_PCI_SUPPORT -EXPORT_SYMBOL(RTMP_PCI_Readl); -EXPORT_SYMBOL(RTMP_PCI_Readw); -EXPORT_SYMBOL(RTMP_PCI_Readb); -EXPORT_SYMBOL(RTMP_PCI_Writel); -EXPORT_SYMBOL(RTMP_PCI_Writew); -EXPORT_SYMBOL(RTMP_PCI_Writeb); -EXPORT_SYMBOL(RtmpOsPciConfigReadWord); -EXPORT_SYMBOL(RtmpOsPciConfigWriteWord); -EXPORT_SYMBOL(RtmpOsPciConfigReadDWord); -EXPORT_SYMBOL(RtmpOsPciConfigWriteDWord); -EXPORT_SYMBOL(RtmpOsPciFindCapability); -EXPORT_SYMBOL(RtmpOsPciMsiEnable); -EXPORT_SYMBOL(RTMPFindHostPCIDev); -#endif /* RTMP_PCI_SUPPORT */ - -EXPORT_SYMBOL(RtmpOsNtohs); -EXPORT_SYMBOL(RtmpOsHtons); -EXPORT_SYMBOL(RtmpOsNtohl); -EXPORT_SYMBOL(RtmpOsHtonl); - -EXPORT_SYMBOL(RtmpOsVmalloc); -EXPORT_SYMBOL(RtmpOsVfree); -EXPORT_SYMBOL(RtmpOsCopyFromUser); -EXPORT_SYMBOL(RtmpOsCopyToUser); - -EXPORT_SYMBOL(RtmpOsCmdUp); -EXPORT_SYMBOL(RtmpOsCmdDisplayLenCheck); - -EXPORT_SYMBOL(hex_dump); -EXPORT_SYMBOL(RtmpOsSendWirelessEvent); -EXPORT_SYMBOL(RTMP_GetCurrentSystemTime); -EXPORT_SYMBOL(RTMP_GetCurrentSystemTick); -EXPORT_SYMBOL(RTMPMsecsToJiffies); -EXPORT_SYMBOL(RtmpusecDelay); -EXPORT_SYMBOL(RtmpOsMsDelay); -EXPORT_SYMBOL(RtmpOSWrielessEventSend); -EXPORT_SYMBOL(RtmpOSWrielessEventSendExt); -EXPORT_SYMBOL(RtmpOsTickUnitGet); -EXPORT_SYMBOL(RtmpOsOpsInit); -EXPORT_SYMBOL(RtmpOsGetUnaligned); -EXPORT_SYMBOL(RtmpOsGetUnaligned32); -EXPORT_SYMBOL(RtmpOsGetUnalignedlong); -EXPORT_SYMBOL(RtmpOsMaxScanDataGet); -EXPORT_SYMBOL(RtmpDrvMaxRateGet); -EXPORT_SYMBOL(RtmpOsWirelessExtVerGet); -EXPORT_SYMBOL(rtstrchr); -EXPORT_SYMBOL(RtmpOsIsInInterrupt); -EXPORT_SYMBOL(RtmpOsSimpleStrtol); -EXPORT_SYMBOL(RtmpOsStatsAlloc); - -EXPORT_SYMBOL(RtmpOsAtomicInit); -EXPORT_SYMBOL(RtmpOsAtomicDestroy); -EXPORT_SYMBOL(RtmpOsAtomicRead); -EXPORT_SYMBOL(RtmpOsAtomicDec); -EXPORT_SYMBOL(RtmpOsAtomicInterlockedExchange); - -EXPORT_SYMBOL(RtmpDrvAllMacPrint); -EXPORT_SYMBOL(RtmpDrvAllE2PPrint); -EXPORT_SYMBOL(RtmpDrvAllRFPrint); -EXPORT_SYMBOL(RtmpOsGetNetDevWdev); -EXPORT_SYMBOL(RtmpOsSetNetDevWdev); -EXPORT_SYMBOL(RtmpMeshDown); -EXPORT_SYMBOL(RtmpOSIRQRelease); -EXPORT_SYMBOL(RtmpOsWlanEventSet); - -/* cfg80211 */ -#ifdef RT_CFG80211_SUPPORT -extern UCHAR Cfg80211_Chan[]; -EXPORT_SYMBOL(CFG80211OS_UnRegister); -EXPORT_SYMBOL(CFG80211_SupBandInit); -EXPORT_SYMBOL(Cfg80211_Chan); -EXPORT_SYMBOL(CFG80211OS_RegHint); -EXPORT_SYMBOL(CFG80211OS_RegHint11D); -EXPORT_SYMBOL(CFG80211OS_BandInfoGet); -EXPORT_SYMBOL(CFG80211OS_ChanNumGet); -EXPORT_SYMBOL(CFG80211OS_ChanInfoGet); -EXPORT_SYMBOL(CFG80211OS_ChanInfoInit); -EXPORT_SYMBOL(CFG80211OS_Scaning); -EXPORT_SYMBOL(CFG80211OS_ScanEnd); -EXPORT_SYMBOL(CFG80211OS_ConnectResultInform); -EXPORT_SYMBOL(CFG80211OS_P2pClientConnectResultInform); -EXPORT_SYMBOL(CFG80211OS_SupBandReInit); -EXPORT_SYMBOL(CFG80211OS_RxMgmt); -EXPORT_SYMBOL(CFG80211OS_TxStatus); -EXPORT_SYMBOL(CFG80211OS_NewSta); -EXPORT_SYMBOL(CFG80211OS_DelSta); -EXPORT_SYMBOL(CFG80211OS_MICFailReport); -EXPORT_SYMBOL(CFG80211OS_JoinIBSS); -#endif /* RT_CFG80211_SUPPORT */ - -/* global variables */ -EXPORT_SYMBOL(RTPktOffsetData); -EXPORT_SYMBOL(RTPktOffsetLen); -EXPORT_SYMBOL(RTPktOffsetCB); - -#ifdef VENDOR_FEATURE4_SUPPORT -EXPORT_SYMBOL(OS_NumOfMemAlloc); -EXPORT_SYMBOL(OS_NumOfMemFree); -#endif /* VENDOR_FEATURE4_SUPPORT */ - -#ifdef VENDOR_FEATURE2_SUPPORT -EXPORT_SYMBOL(OS_NumOfPktAlloc); -EXPORT_SYMBOL(OS_NumOfPktFree); -#endif /* VENDOR_FEATURE2_SUPPORT */ - -EXPORT_SYMBOL(duplicate_pkt_vlan); - -/* only for AP */ -#ifdef CONFIG_AP_SUPPORT -#ifdef BG_FT_SUPPORT -EXPORT_SYMBOL(BG_FTPH_Init); -EXPORT_SYMBOL(BG_FTPH_Remove); -#endif /* BG_FT_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - -/* only for PCI */ -#ifdef RTMP_MAC_PCI -EXPORT_SYMBOL(RTMP_AllocateRxPacketBuffer); -EXPORT_SYMBOL(RtmpFreeDescBuf); -EXPORT_SYMBOL(RtmpAllocDescBuf); -EXPORT_SYMBOL(linux_pci_unmap_single); -EXPORT_SYMBOL(linux_pci_map_single); -EXPORT_SYMBOL(RTMP_AllocateFirstTxBuffer); -EXPORT_SYMBOL(RTMP_FreeFirstTxBuffer); -#endif /* RTMP_MAC_PCI */ - -/* only for USB */ - -/* only for RBUS or flash-capable concurrent devices */ -#if defined(RTMP_RBUS_SUPPORT) || defined(RTMP_FLASH_SUPPORT) -EXPORT_SYMBOL(RtmpFlashRead); -EXPORT_SYMBOL(RtmpFlashWrite); -#endif /* defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT) */ - -EXPORT_SYMBOL(RtPrivIoctlSetVal); -EXPORT_SYMBOL(RtmpOsSpinLockIrqSave); -EXPORT_SYMBOL(RtmpOsSpinUnlockIrqRestore); -EXPORT_SYMBOL(RtmpOsSpinLockIrq); -EXPORT_SYMBOL(RtmpOsSpinUnlockIrq); -EXPORT_SYMBOL(OS_TEST_BIT); -EXPORT_SYMBOL(OS_SET_BIT); -EXPORT_SYMBOL(OS_CLEAR_BIT); -EXPORT_SYMBOL(OS_LOAD_CODE_FROM_BIN); -#endif /* OS_ABL_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_main_dev.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_main_dev.c deleted file mode 100644 index 4f08ad9628..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_main_dev.c +++ /dev/null @@ -1,1002 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rt_main_dev.c - - Abstract: - Create and register network interface. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#define RTMP_MODULE_OS - -#include "rt_config.h" -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" -#ifdef RTMP_UDMA_SUPPORT -#include "rt_udma.h" -#endif /*RTMP_UDMA_SUPPORT*/ - -#if (KERNEL_VERSION(2, 6, 24) <= LINUX_VERSION_CODE) -#ifndef SA_SHIRQ -#define SA_SHIRQ IRQF_SHARED -#endif -#endif - -/*---------------------------------------------------------------------*/ -/* Private Variables Used */ -/*---------------------------------------------------------------------*/ - -RTMP_STRING *mac = ""; /* default 00:00:00:00:00:00 */ -RTMP_STRING *mode = - ""; /* supported mode: normal/ate/monitor; default: normal */ -RTMP_STRING *hostname = ""; /* default CMPC */ - -#if (KERNEL_VERSION(2, 6, 12) >= LINUX_VERSION_CODE) -MODULE_PARM(mac, "s"); -MODULE_PARM(mode, "s"); -#else -module_param(mac, charp, 0); -module_param(mode, charp, 0); -#endif -MODULE_PARM_DESC(mac, "rt_wifi: wireless mac addr"); -MODULE_PARM_DESC(mode, "rt_wifi: wireless operation mode"); - -MODULE_LICENSE("GPL"); - -#ifdef OS_ABL_SUPPORT -RTMP_DRV_ABL_OPS RtmpDrvOps, *pRtmpDrvOps = &RtmpDrvOps; -RTMP_NET_ABL_OPS RtmpDrvNetOps, *pRtmpDrvNetOps = &RtmpDrvNetOps; -#endif /* OS_ABL_SUPPORT */ - -/*---------------------------------------------------------------------*/ -/* Prototypes of Functions Used */ -/*---------------------------------------------------------------------*/ - -/* public function prototype */ -int mt_wifi_close(VOID *net_dev); -int mt_wifi_open(VOID *net_dev); -int virtual_if_up_handler(VOID *dev); -int virtual_if_down_handler(VOID *dev); - -/* private function prototype */ -INT rt28xx_send_packets(IN struct sk_buff *skb_p, - IN struct net_device *net_dev); - -struct net_device_stats *RT28xx_get_ether_stats(struct net_device *net_dev); - -/* - * ======================================================================== - * Routine Description: - * Close raxx interface. - * - * Arguments: - * *net_dev the raxx interface pointer - * - * Return Value: - * 0 Open OK - * otherwise Open Fail - * - * Note: - * 1. if open fail, kernel will not call the close function. - * 2. Free memory for - * (1) Mlme Memory Handler: MlmeHalt() - * (2) TX & RX: RTMPFreeTxRxRingMemory() - * (3) BA Reordering: ba_reordering_resource_release() - * ======================================================================== - */ -int main_virtual_if_close(IN struct net_device *net_dev) -{ - VOID *pAd = NULL; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ===> %s\n", RTMP_OS_NETDEV_GET_DEVNAME(net_dev), - __func__)); - - pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev); - - if (pAd == NULL) - return 0; -#ifdef CONFIG_LED_ACTIVITY_ON_MAIN_MBSS - RTMPSetLED(pAd, LED_RADIO_OFF); -#endif - RTMP_OS_NETDEV_CARRIER_OFF(net_dev); - RTMP_OS_NETDEV_STOP_QUEUE(net_dev); - -#ifdef IFUP_IN_PROBE -#else - VIRTUAL_IF_DOWN(pAd, net_dev); -#endif /* IFUP_IN_PROBE */ - - VIRTUAL_IF_DEINIT(pAd, net_dev); - - RT_MOD_HNAT_DEREG(net_dev); - RT_MOD_DEC_USE_COUNT(); - return 0; /* close ok */ -} - -/* - * ======================================================================== - * Routine Description: - * Open raxx interface. - * - * Arguments: - * *net_dev the raxx interface pointer - * - * Return Value: - * 0 Open OK - * otherwise Open Fail - * - * Note: - * 1. if open fail, kernel will not call the close function. - * 2. Free memory for - * (1) Mlme Memory Handler: MlmeHalt() - * (2) TX & RX: RTMPFreeTxRxRingMemory() - * (3) BA Reordering: ba_reordering_resource_release() - * ======================================================================== - */ -int main_virtual_if_open(struct net_device *net_dev) -{ - VOID *pAd = NULL; - - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: ===> %s\n", RTMP_OS_NETDEV_GET_DEVNAME(net_dev), - __func__)); - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) - return 0; - -#ifdef IFUP_IN_PROBE - - while (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != - NDIS_STATUS_SUCCESS) { - OS_WAIT(10); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Card not ready, NDIS_STATUS_SUCCESS!\n")); - } - -#else -#ifdef CONFIG_AP_SUPPORT -#ifdef RT_CFG80211_SUPPORT - RTMP_DRIVER_AP_MAIN_OPEN(pAd); -#endif -#endif /*CONFIG_AP_SUPPORT*/ - - if (VIRTUAL_IF_INIT(pAd, net_dev) != 0) - return -1; - - if (VIRTUAL_IF_UP(pAd, net_dev) != 0) - return -1; - -#endif /* IFUP_IN_PROBE */ -#ifdef CONFIG_AP_SUPPORT -#ifdef CONFIG_LED_ACTIVITY_ON_MAIN_MBSS - RTMPSetLED(pAd, LED_LINK_DOWN); /* Set solid led on */ -#endif /* CONFIG_LED_ACTIVITY_ON_MAIN_MBSS */ -#endif /* CONFIG_AP_SUPPORT */ - RT_MOD_INC_USE_COUNT(); - RT_MOD_HNAT_REG(net_dev); - netif_start_queue(net_dev); - netif_carrier_on(net_dev); - netif_wake_queue(net_dev); - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * Close raxx interface. - * - * Arguments: - * *net_dev the raxx interface pointer - * - * Return Value: - * 0 Open OK - * otherwise Open Fail - * - * Note: - * 1. if open fail, kernel will not call the close function. - * 2. Free memory for - * (1) Mlme Memory Handler: MlmeHalt() - * (2) TX & RX: RTMPFreeTxRxRingMemory() - * (3) BA Reordering: ba_reordering_resource_release() - * ======================================================================== - */ -int mt_wifi_close(VOID *dev) -{ - struct net_device *net_dev = (struct net_device *)dev; - VOID *pAd = NULL; - - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===> mt_wifi_close\n")); - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) - return 0; -#ifdef CONFIG_INIT_RADIO_ONOFF - if (!((PRTMP_ADAPTER)pAd)->ApCfg.bRadioOn) - RTMP_CLEAR_FLAG(((PRTMP_ADAPTER)pAd), - fRTMP_ADAPTER_DISABLE_DEQUEUEPACKET); -#endif - - RTMPDrvClose(pAd, net_dev); -#ifdef RTMP_UDMA_SUPPORT - mt_udma_unregister(pAd); -#endif /*RTMP_UDMA_SUPPORT*/ - /*system down hook point*/ - WLAN_HOOK_CALL(WLAN_HOOK_SYS_DOWN, pAd, NULL); -#ifdef WIFI_DIAG - DiagProcExit(pAd); -#endif - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<=== mt_wifi_close\n")); - return 0; -} - -/* - * ======================================================================== - * Routine Description: - * Open raxx interface. - * - * Arguments: - * *net_dev the raxx interface pointer - * - * Return Value: - * 0 Open OK - * otherwise Open Fail - * ======================================================================== - */ -int mt_wifi_open(VOID *dev) -{ - struct net_device *net_dev = (struct net_device *)dev; - VOID *pAd = NULL; - int retval = 0; - ULONG OpMode; - - if (sizeof(ra_dma_addr_t) < sizeof(dma_addr_t)) - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Fatal error for DMA address size!!!\n")); - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) { - /* if 1st open fail, pAd will be free; */ - /* So the net_dev->priv will be NULL in 2rd open */ - return -1; - } - - RTMP_DRIVER_MCU_SLEEP_CLEAR(pAd); - RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode); -#if WIRELESS_EXT >= 12 - - /* if (RT_DEV_PRIV_FLAGS_GET(net_dev) == INT_MAIN) */ - if (RTMP_DRIVER_MAIN_INF_CHECK(pAd, RT_DEV_PRIV_FLAGS_GET(net_dev)) == - NDIS_STATUS_SUCCESS) { -#ifdef CONFIG_APSTA_MIXED_SUPPORT - - if (OpMode == OPMODE_AP) - net_dev->wireless_handlers = - (struct iw_handler_def - *)&rt28xx_ap_iw_handler_def; - -#endif /* CONFIG_APSTA_MIXED_SUPPORT */ - } - -#endif /* WIRELESS_EXT >= 12 */ - /* load_dev_l1profile should prior to RTMPPreReadProfile, for get_l2_profile() access data updated */ - if (load_dev_l1profile(pAd) == NDIS_STATUS_SUCCESS) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("load l1profile succeed!\n")); - else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("load l1profile failed!\n")); - /*system up hook point should before interrupt register*/ -#ifdef WHNAT_SUPPORT - RTMPPreReadProfile(pAd); -#endif /*WHNAT_SUPPORT*/ - WLAN_HOOK_CALL(WLAN_HOOK_SYS_UP, pAd, NULL); - /* - * Request interrupt service routine for PCI device - * register the interrupt routine with the os - * - * AP Channel auto-selection will be run in mt_wifi_init(), - * so we must reqister IRQ hander here. - */ - RtmpOSIRQRequest(net_dev); - /* Init IRQ parameters stored in pAd */ - /* rtmp_irq_init(pAd); */ - RTMP_DRIVER_IRQ_INIT(pAd); - - /* Chip & other init */ - if (mt_wifi_init(pAd, mac, hostname) == FALSE) - goto err; - -#ifdef MBSS_SUPPORT - /* - * the function can not be moved to RT2860_probe() even register_netdev() - * is changed as register_netdevice(). - * Or in some PC, kernel will panic (Fedora 4) - */ -#if defined(P2P_APCLI_SUPPORT) || defined(RT_CFG80211_P2P_SUPPORT) || \ - defined(CFG80211_MULTI_STA) -#else -#ifndef CREATE_ALL_INTERFACE_AT_INIT - RT28xx_MBSS_Init(pAd, net_dev); -#endif -#endif /* P2P_APCLI_SUPPORT || RT_CFG80211_P2P_SUPPORT || CFG80211_MULTI_STA */ -#endif /* MBSS_SUPPORT */ -#ifdef WDS_SUPPORT - RT28xx_WDS_Init(pAd, net_dev); -#endif /* WDS_SUPPORT */ -#ifdef APCLI_SUPPORT -#if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || \ - defined(P2P_APCLI_SUPPORT) || defined(CFG80211_MULTI_STA) -#else - RT28xx_ApCli_Init(pAd, net_dev); -#endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || P2P_APCLI_SUPPORT || CFG80211_MULTI_STA */ -#endif /* APCLI_SUPPORT */ -#ifdef SNIFFER_SUPPORT - RT28xx_Monitor_Init(pAd, net_dev); -#endif /* SNIFFER_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT -#ifdef CFG80211_MULTI_STA - RTMP_CFG80211_MutliStaIf_Init(pAd); -#endif /* CFG80211_MULTI_STA */ -#else -#endif /* RT_CFG80211_SUPPORT */ -#ifdef LINUX -#ifdef RT_CFG80211_SUPPORT - RTMP_DRIVER_CFG80211_START(pAd); -#endif /* RT_CFG80211_SUPPORT */ -#endif /* LINUX */ - RTMPDrvOpen(pAd); -#ifdef VENDOR_FEATURE2_SUPPORT - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Number of Packet Allocated in open = %lu\n", - OS_NumOfPktAlloc)); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Number of Packet Freed in open = %lu\n", OS_NumOfPktFree)); -#endif /* VENDOR_FEATURE2_SUPPORT */ -#ifdef RTMP_UDMA_SUPPORT - retval = mt_udma_register(pAd, net_dev); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Udma Registration %s\n", - (retval == 0) ? "Success" : "Failed")); -#endif /*RTMP_UDMA_SUPPORT*/ - -#ifdef WIFI_DIAG - DiagProcInit(pAd); -#endif - - return retval; -err: - RTMP_DRIVER_IRQ_RELEASE(pAd); - return -1; -} - -int virtual_if_up_handler(VOID *dev) -{ - struct net_device *net_dev = (struct net_device *)dev; - struct _RTMP_ADAPTER *pAd = NULL; - int retval = 0; - struct wifi_dev *wdev = NULL; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) { - retval = -1; - return retval; - } - - wdev = wdev_search_by_netdev(pAd, net_dev); - if (wdev == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() wdev fail!!!\n", __func__)); - retval = -1; - return retval; - } - - wdev_if_up_down(pAd, wdev, TRUE); - - if (VIRTUAL_IF_NUM(pAd) != 0) { - if (wdev_do_open(wdev) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() inf_up (idx %d) fail!!!\n", __func__, - wdev->wdev_idx)); - } - } - wdev->open_state = TRUE; - - return retval; -} - -int virtual_if_down_handler(VOID *dev) -{ - struct net_device *net_dev = (struct net_device *)dev; - struct _RTMP_ADAPTER *pAd = NULL; - int retval = 0; - struct wifi_dev *wdev = NULL; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) { - retval = -1; - return retval; - } - - wdev = wdev_search_by_netdev(pAd, net_dev); - if (wdev == NULL) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() wdev fail!!!\n", __func__)); - retval = -1; - return retval; - } - wdev->open_state = FALSE; - if (wdev->start_stop_running) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s() wdev idx %d wait to complete start stop op\n", - __func__, wdev->wdev_idx)); - RTMP_OS_INIT_COMPLETION(&wdev->start_stop_complete); - RTMP_OS_WAIT_FOR_COMPLETION_TIMEOUT(&wdev->start_stop_complete, - 500); - } - - wdev_if_up_down(pAd, wdev, FALSE); - - if (wdev_do_close(wdev) != TRUE) { - MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s() inf_down (idx %d) fail!!!\n", __func__, - wdev->wdev_idx)); - } - -#ifdef RT_CFG80211_SUPPORT - pAd->cfg80211_ctrl.beaconIsSetFromHostapd = FALSE; -#endif - - return retval; -} - -INT virtual_if_init_handler(VOID *dev) -{ - struct net_device *net_dev = (struct net_device *)dev; - struct _RTMP_ADAPTER *pAd = NULL; - int retval = 0; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) { - retval = -1; - return retval; - } - - if (VIRTUAL_IF_NUM(pAd) == 0) { - VIRTUAL_IF_INC(pAd); - -#ifdef MT_DFS_SUPPORT - /* Update bInitMbssZeroWait */ - UPDATE_MT_INIT_ZEROWAIT_MBSS(pAd, TRUE); -#endif /* MT_DFS_SUPPORT */ - - /* must use main net_dev */ - if (mt_wifi_open(pAd->net_dev) != 0) { - VIRTUAL_IF_DEC(pAd); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("mt_wifi_open return fail!\n")); - return NDIS_STATUS_FAILURE; - } - } else - VIRTUAL_IF_INC(pAd); - - return retval; -} - -INT virtual_if_deinit_handler(VOID *dev) -{ - struct net_device *net_dev = (struct net_device *)dev; - struct _RTMP_ADAPTER *pAd = NULL; - int retval = 0; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) { - retval = -1; - return retval; - } - - if (VIRTUAL_IF_NUM(pAd) == 0) - mt_wifi_close(pAd->net_dev); - - return retval; -} - -PNET_DEV RtmpPhyNetDevInit(VOID *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevHook) -{ - struct net_device *net_dev = NULL; - ULONG InfId, OpMode; -#if defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_TSO_SUPPORT) - UCHAR flg; -#endif /* defined(CONFIG_CSO_SUPPORT) || defined(CONFIG_TSO_SUPPORT) */ - RTMP_DRIVER_MAIN_INF_GET(pAd, &InfId); - /* net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(struct mt_dev_priv), INF_MAIN_DEV_NAME); */ - RTMP_DRIVER_MAIN_INF_CREATE(pAd, &net_dev); - - if (net_dev == NULL) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): main physical net device creation failed!\n", - __func__)); - return NULL; - } - - os_zero_mem((unsigned char *)pNetDevHook, - sizeof(RTMP_OS_NETDEV_OP_HOOK)); - pNetDevHook->open = main_virtual_if_open; - pNetDevHook->stop = main_virtual_if_close; - pNetDevHook->xmit = rt28xx_send_packets; -#ifdef IKANOS_VX_1X0 - pNetDevHook->xmit = IKANOS_DataFramesTx; -#endif /* IKANOS_VX_1X0 */ - pNetDevHook->ioctl = rt28xx_ioctl; - pNetDevHook->priv_flags = InfId; /*INT_MAIN; */ - pNetDevHook->get_stats = RT28xx_get_ether_stats; - pNetDevHook->needProtcted = FALSE; -#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12) - pNetDevHook->get_wstats = rt28xx_get_wireless_stats; -#endif - RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode); - /* put private data structure */ - RTMP_OS_NETDEV_SET_PRIV(net_dev, pAd); - -#ifdef CONFIG_APSTA_MIXED_SUPPORT -#if WIRELESS_EXT >= 12 - if (OpMode == OPMODE_AP) { - pNetDevHook->iw_handler = (void *)&rt28xx_ap_iw_handler_def; - } -#endif /*WIRELESS_EXT >= 12 */ -#endif /* CONFIG_STA_SUPPORT */ - - /* double-check if pAd is associated with the net_dev */ - if (RTMP_OS_NETDEV_GET_PRIV(net_dev) == NULL) { - RtmpOSNetDevFree(net_dev); - return NULL; - } - - RTMP_DRIVER_NET_DEV_SET(pAd, net_dev); -#if (KERNEL_VERSION(2, 6, 24) > LINUX_VERSION_CODE) - SET_MODULE_OWNER(net_dev); -#endif -#ifdef CONFIG_CSO_SUPPORT - RTMP_DRIVER_ADAPTER_CSO_SUPPORT_TEST(pAd, &flg); - - if (flg) - net_dev->features |= NETIF_F_HW_CSUM; - -#endif /* CONFIG_CSO_SUPPORT */ - return net_dev; -} - -VOID *RtmpNetEthConvertDevSearch(VOID *net_dev_, UCHAR *pData) -{ - struct net_device *pNetDev; -#if (KERNEL_VERSION(2, 6, 24) <= LINUX_VERSION_CODE) -#if (KERNEL_VERSION(2, 6, 26) <= LINUX_VERSION_CODE) - struct net_device *net_dev = (struct net_device *)net_dev_; - struct net *net; - - net = dev_net(net_dev); - BUG_ON(!net); - for_each_netdev (net, pNetDev) -#else - struct net *net; - struct net_device *net_dev = (struct net_device *)net_dev_; - - BUG_ON(!net_dev->nd_net); - net = net_dev->nd_net; - for_each_netdev (net, pNetDev) -#endif -#else -#if (KERNEL_VERSION(2, 6, 22) <= LINUX_VERSION_CODE) - for_each_netdev (pNetDev) -#else - - for (pNetDev = dev_base; pNetDev; pNetDev = pNetDev->next) -#endif -#endif - { - if ((pNetDev->type == ARPHRD_ETHER) && - os_equal_mem(pNetDev->dev_addr, &pData[6], - pNetDev->addr_len)) - break; - } - - return (VOID *)pNetDev; -} - -/* - * ======================================================================== - * Routine Description: - * The entry point for Linux kernel sent packet to our driver. - * - * Arguments: - * sk_buff *skb the pointer refer to a sk_buffer. - * - * Return Value: - * 0 - * - * Note: - * This function is the entry point of Tx Path for OS delivery packet to - * our driver. You only can put OS-depened & STA/AP common handle procedures - * in here. - * ======================================================================== - */ -int rt28xx_packet_xmit(void *pkt) -{ - struct sk_buff *skb = (struct sk_buff *)pkt; - struct net_device *net_dev = skb->dev; - struct wifi_dev *wdev; - PNDIS_PACKET pPacket = (PNDIS_PACKET)skb; - - wdev = RTMP_OS_NETDEV_GET_WDEV(net_dev); - ASSERT(wdev); - return RTMPSendPackets((NDIS_HANDLE)wdev, (PPNDIS_PACKET)&pPacket, 1, - skb->len, RtmpNetEthConvertDevSearch); -} - -/* - * ======================================================================== - * Routine Description: - * Send a packet to WLAN. - * - * Arguments: - * skb_p points to our adapter - * dev_p which WLAN network interface - * - * Return Value: - * 0: transmit successfully - * otherwise: transmit fail - * - * ======================================================================== - */ -int rt28xx_send_packets(struct sk_buff *skb, struct net_device *ndev) -{ - if (!(RTMP_OS_NETDEV_STATE_RUNNING(ndev))) { - RELEASE_NDIS_PACKET(NULL, (PNDIS_PACKET)skb, - NDIS_STATUS_FAILURE); - return 0; - } - - os_zero_mem((PUCHAR)&skb->cb[CB_OFF], CB_LEN); - MEM_DBG_PKT_ALLOC_INC(skb); - return rt28xx_packet_xmit(skb); -} - -#if WIRELESS_EXT >= 12 -/* This function will be called when query /proc */ -struct iw_statistics *rt28xx_get_wireless_stats(struct net_device *net_dev) -{ - VOID *pAd = NULL; - struct iw_statistics *pStats; - RT_CMD_IW_STATS DrvIwStats, *pDrvIwStats = &DrvIwStats; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("rt28xx_get_wireless_stats --->\n")); - pDrvIwStats->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev); - pDrvIwStats->dev_addr = (PUCHAR)net_dev->dev_addr; - - if (RTMP_DRIVER_IW_STATS_GET(pAd, pDrvIwStats) != NDIS_STATUS_SUCCESS) - return NULL; - - pStats = (struct iw_statistics *)(pDrvIwStats->pStats); - pStats->status = 0; /* Status - device dependent for now */ - pStats->qual.updated = 1; /* Flags to know if updated */ -#ifdef IW_QUAL_DBM - pStats->qual.updated |= IW_QUAL_DBM; /* Level + Noise are dBm */ -#endif /* IW_QUAL_DBM */ - pStats->qual.qual = pDrvIwStats->qual; - pStats->qual.level = pDrvIwStats->level; - pStats->qual.noise = pDrvIwStats->noise; - pStats->discard.nwid = 0; /* Rx : Wrong nwid/essid */ - pStats->miss.beacon = 0; /* Missed beacons/superframe */ - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("<--- rt28xx_get_wireless_stats\n")); - return pStats; -} -#endif /* WIRELESS_EXT */ - -INT rt28xx_ioctl(PNET_DEV net_dev, struct ifreq *rq, INT cmd) -{ - VOID *pAd = NULL; - INT ret = 0; - ULONG OpMode; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd == NULL) { - /* if 1st open fail, pAd will be free; */ - /* So the net_dev->priv will be NULL in 2rd open */ - return -ENETDOWN; - } - - RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode); -#ifdef CONFIG_AP_SUPPORT - /* IF_DEV_CONFIG_OPMODE_ON_AP(pAd) */ - RT_CONFIG_IF_OPMODE_ON_AP(OpMode) - { - ret = rt28xx_ap_ioctl(net_dev, rq, cmd); - } -#endif /* CONFIG_AP_SUPPORT */ - return ret; -} - -/* - * ======================================================================== - * - * Routine Description: - * return ethernet statistics counter - * - * Arguments: - * net_dev Pointer to net_device - * - * Return Value: - * net_device_stats* - * ======================================================================== - */ -struct net_device_stats *RT28xx_get_ether_stats(struct net_device *net_dev) -{ - VOID *pAd = NULL; - struct net_device_stats *pStats; - - if (net_dev) - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd) { - RT_CMD_STATS DrvStats, *pDrvStats = &DrvStats; - /* assign net device for RTMP_DRIVER_INF_STATS_GET() */ - pDrvStats->pNetDev = net_dev; - RTMP_DRIVER_INF_STATS_GET(pAd, pDrvStats); - pStats = (struct net_device_stats *)(pDrvStats->pStats); - pStats->rx_packets = pDrvStats->rx_packets; - pStats->tx_packets = pDrvStats->tx_packets; - pStats->rx_bytes = pDrvStats->rx_bytes; - pStats->tx_bytes = pDrvStats->tx_bytes; - pStats->rx_errors = pDrvStats->rx_errors; - pStats->tx_errors = pDrvStats->tx_errors; - pStats->rx_dropped = 0; - pStats->tx_dropped = 0; - pStats->multicast = pDrvStats->multicast; - pStats->collisions = pDrvStats->collisions; - pStats->rx_length_errors = 0; - pStats->rx_over_errors = pDrvStats->rx_over_errors; - pStats->rx_crc_errors = - 0; /*pAd->WlanCounters[0].FCSErrorCount; // recved pkt with crc error */ - pStats->rx_frame_errors = pDrvStats->rx_frame_errors; - pStats->rx_fifo_errors = pDrvStats->rx_fifo_errors; - pStats->rx_missed_errors = 0; /* receiver missed packet */ - /* detailed tx_errors */ - pStats->tx_aborted_errors = 0; - pStats->tx_carrier_errors = 0; - pStats->tx_fifo_errors = 0; - pStats->tx_heartbeat_errors = 0; - pStats->tx_window_errors = 0; - /* for cslip etc */ - pStats->rx_compressed = 0; - pStats->tx_compressed = 0; - return pStats; - } else - return NULL; -} - -BOOLEAN RtmpPhyNetDevExit(VOID *pAd, PNET_DEV net_dev) -{ - /*remove cfg */ - wpf_exit(pAd); -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#if defined(P2P_APCLI_SUPPORT) || \ - defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || \ - defined(CFG80211_MULTI_STA) -#else - /* remove all AP-client virtual interfaces. */ - RT28xx_ApCli_Remove(pAd); -#endif /* P2P_APCLI_SUPPORT */ -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - /* remove all WDS virtual interfaces. */ - RT28xx_WDS_Remove(pAd); -#endif /* WDS_SUPPORT */ -#ifdef SNIFFER_SUPPORT - RT28xx_Monitor_Remove(pAd); -#endif /* SNIFFER_SUPPORT */ -#ifdef MBSS_SUPPORT -#if defined(P2P_APCLI_SUPPORT) || defined(RT_CFG80211_P2P_SUPPORT) || \ - defined(CFG80211_MULTI_STA) -#else - RT28xx_MBSS_Remove(pAd); -#endif /* P2P_APCLI_SUPPORT */ -#endif /* MBSS_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef RT_CFG80211_SUPPORT -#ifdef CFG80211_MULTI_STA - RTMP_CFG80211_MutliStaIf_Remove(pAd); -#endif /* CFG80211_MULTI_STA */ -#else -#endif /* RT_CFG80211_SUPPORT */ -#ifdef INF_PPA_SUPPORT - RTMP_DRIVER_INF_PPA_EXIT(pAd); -#endif /* INF_PPA_SUPPORT */ - - /* Unregister network device */ - if (net_dev != NULL) { - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RtmpOSNetDevDetach(): RtmpOSNetDeviceDetach(), dev->name=%s!\n", - net_dev->name)); - RtmpOSNetDevProtect(1); - RtmpOSNetDevDetach(net_dev); - RtmpOSNetDevProtect(0); -#ifdef RT_CFG80211_SUPPORT - RTMP_DRIVER_80211_UNREGISTER(pAd, net_dev); -#endif /* RT_CFG80211_SUPPORT */ - } - - return TRUE; -} - -/* Device IRQ related functions. */ -int RtmpOSIRQRequest(IN PNET_DEV pNetDev) -{ -#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_RBUS_SUPPORT) - struct net_device *net_dev = pNetDev; -#endif - ULONG infType; - VOID *pAd = NULL; - int retval = 0; - - GET_PAD_FROM_NET_DEV(pAd, pNetDev); - ASSERT(pAd); - RTMP_DRIVER_INF_TYPE_GET(pAd, &infType); -#ifdef RTMP_PCI_SUPPORT - if (infType == RTMP_DEV_INF_PCI || infType == RTMP_DEV_INF_PCIE) { -#if defined(CONFIG_ARCH_MT7623) || defined(CONFIG_ARCH_MT7622) - retval = request_irq(net_dev->irq, rt2860_interrupt, - SA_SHIRQ | IRQF_TRIGGER_LOW, - (net_dev)->name, (net_dev)); -#else - retval = request_irq(net_dev->irq, rt2860_interrupt, SA_SHIRQ, - (net_dev)->name, (net_dev)); -#endif - - if (retval != 0) - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT2860: request_irq ERROR(%d)\n", retval)); - } - -#endif /* RTMP_PCI_SUPPORT */ -#ifdef RTMP_RBUS_SUPPORT - - if (infType == RTMP_DEV_INF_RBUS) { -#if (KERNEL_VERSION(2, 6, 22) <= LINUX_VERSION_CODE) -#if defined(MT7622) || defined(P18) || defined(MT7663) - retval = request_irq(net_dev->irq, rt2860_interrupt, - IRQF_SHARED | IRQF_TRIGGER_LOW, - net_dev->name, net_dev); -#else - retval = request_irq(net_dev->irq, rt2860_interrupt, - IRQF_SHARED, net_dev->name, net_dev); -#endif /* defined(MT7622) || defined(P18) || defined(MT7663) */ -#else - retval = request_irq(net_dev->irq, rt2860_interrupt, - SA_INTERRUPT, net_dev->name, net_dev); -#endif - - if (retval) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("RT2860: request_irq ERROR(%d)\n", retval)); - } - } - -#endif /* RTMP_RBUS_SUPPORT */ - return retval; -} - -#ifdef WDS_SUPPORT -/* ======================================================================== - * Routine Description: - * return ethernet statistics counter - * - * Arguments: - * net_dev Pointer to net_device - * - * Return Value: - * net_device_stats* - * ======================================================================== - */ -struct net_device_stats *RT28xx_get_wds_ether_stats(IN PNET_DEV net_dev) -{ - VOID *pAd = NULL; - /* INT WDS_apidx = 0,index; */ - struct net_device_stats *pStats; - RT_CMD_STATS WdsStats, *pWdsStats = &WdsStats; - - if (net_dev) - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - /* if (RT_DEV_PRIV_FLAGS_GET(net_dev) == INT_WDS) */ - { - if (pAd) { - pWdsStats->pNetDev = net_dev; - - if (RTMP_COM_IoctlHandle( - pAd, NULL, CMD_RTPRIV_IOCTL_WDS_STATS_GET, - 0, pWdsStats, - RT_DEV_PRIV_FLAGS_GET(net_dev)) != - NDIS_STATUS_SUCCESS) - return NULL; - - pStats = (struct net_device_stats *) - pWdsStats->pStats; /*pAd->stats; */ - pStats->rx_packets = - pWdsStats->rx_packets; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.ReceivedFragmentCount.QuadPart; */ - pStats->tx_packets = - pWdsStats->tx_packets; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.TransmittedFragmentCount.QuadPart; */ - pStats->rx_bytes = - pWdsStats->rx_bytes; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.ReceivedByteCount; */ - pStats->tx_bytes = - pWdsStats->tx_bytes; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.TransmittedByteCount; */ - pStats->rx_errors = - pWdsStats->rx_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.RxErrorCount; */ - pStats->tx_errors = - pWdsStats->tx_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.TxErrors; */ - pStats->rx_dropped = 0; - pStats->tx_dropped = 0; - pStats->multicast = - pWdsStats->multicast; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.MulticastReceivedFrameCount.QuadPart; // multicast packets received */ - pStats->collisions = - pWdsStats->collisions; /* Collision packets */ - pStats->rx_length_errors = 0; - pStats->rx_over_errors = - pWdsStats->rx_over_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.RxNoBuffer; // receiver ring buff overflow */ - pStats->rx_crc_errors = - 0; /*pAd->WlanCounters[0].FCSErrorCount; // recved pkt with crc error */ - pStats->rx_frame_errors = - 0; /* recv'd frame alignment error */ - pStats->rx_fifo_errors = - pWdsStats->rx_fifo_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.RxNoBuffer; // recv'r fifo overrun */ - pStats->rx_missed_errors = - 0; /* receiver missed packet */ - /* detailed tx_errors */ - pStats->tx_aborted_errors = 0; - pStats->tx_carrier_errors = 0; - pStats->tx_fifo_errors = 0; - pStats->tx_heartbeat_errors = 0; - pStats->tx_window_errors = 0; - /* for cslip etc */ - pStats->rx_compressed = 0; - pStats->tx_compressed = 0; - return pStats; - } else - return NULL; - } -} -#endif /* WDS_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_pci_rbus.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_pci_rbus.c deleted file mode 100644 index 7069661a24..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_pci_rbus.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rt_pci_rbus.c - - Abstract: - Create and register network interface. - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#define RTMP_MODULE_OS - -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" -#include - -IRQ_HANDLE_TYPE -#if (KERNEL_VERSION(2, 6, 19) <= LINUX_VERSION_CODE) -rt2860_interrupt(int irq, void *dev_instance); -#else -rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs); -#endif - -IRQ_HANDLE_TYPE -#if (KERNEL_VERSION(2, 6, 19) <= LINUX_VERSION_CODE) -rt2860_interrupt(int irq, void *dev_instance) -#else -rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs) -#endif -{ - struct net_device *net_dev = (struct net_device *)dev_instance; - VOID *pAd = NULL; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - isr_handle(pAd); -#if (KERNEL_VERSION(2, 5, 0) <= LINUX_VERSION_CODE) - return IRQ_HANDLED; -#endif -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_proc.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_proc.c deleted file mode 100644 index c488c8feea..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_proc.c +++ /dev/null @@ -1,606 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - rt_proc.c - - Abstract: - Create and register proc file system for ralink device - - Revision History: - Who When What - -------- ---------- ---------------------------------------------- -*/ - -#include -#include -#include -#include -#include - -#include "rt_config.h" - -int wl_proc_init(void); -int wl_proc_exit(void); - -#ifdef CONFIG_RALINK_RT2880 -#define PROCREG_DIR "rt2880" -#endif /* CONFIG_RALINK_RT2880 */ - -#ifdef CONFIG_RALINK_RT3052 -#define PROCREG_DIR "rt3052" -#endif /* CONFIG_RALINK_RT3052 */ - -#ifdef CONFIG_RALINK_RT2883 -#define PROCREG_DIR "rt2883" -#endif /* CONFIG_RALINK_RT2883 */ - -#ifdef CONFIG_RALINK_RT3883 -#define PROCREG_DIR "rt3883" -#endif /* CONFIG_RALINK_RT3883 */ - -#ifdef CONFIG_RALINK_RT5350 -#define PROCREG_DIR "rt5350" -#endif /* CONFIG_RALINK_RT5350 */ - -#ifndef PROCREG_DIR -#define PROCREG_DIR "rt2880" -#endif /* PROCREG_DIR */ - -#if defined(CONFIG_PROC_FS) && defined(VIDEO_TURBINE_SUPPORT) -extern struct proc_dir_entry *procRegDir; -extern BOOLEAN UpdateFromGlobal; -AP_VIDEO_STRUCT GLOBAL_AP_VIDEO_CONFIG; -/*struct proc_dir_entry *proc_ralink_platform, *proc_ralink_wl, *proc_ralink_wl_video; */ -struct proc_dir_entry *proc_ralink_wl, *proc_ralink_wl_video; -static struct proc_dir_entry *entry_wl_video_Update, *entry_wl_video_Enable, - *entry_wl_video_ClassifierEnable, *entry_wl_video_HighTxMode, - *entry_wl_video_TxPwr, *entry_wl_video_VideoMCSEnable; -static struct proc_dir_entry *entry_wl_video_VideoMCS, *entry_wl_video_TxBASize, - *entry_wl_video_TxLifeTimeMode, *entry_wl_video_TxLifeTime, - *entry_wl_video_TxRetryLimit; - -ssize_t video_Update_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", UpdateFromGlobal); - *eof = 1; - return strlen(page); -} - -ssize_t video_Update_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - UpdateFromGlobal = val; - } - - return count; -} - -ssize_t video_Enable_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.Enable); - *eof = 1; - return strlen(page); -} - -ssize_t video_Enable_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.Enable = val; - } - - return count; -} - -ssize_t video_ClassifierEnable_get(char *page, char **start, off_t off, - int count, int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable); - *eof = 1; - return strlen(page); -} - -ssize_t video_ClassifierEnable_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable = val; - } - - return count; -} - -ssize_t video_HighTxMode_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.HighTxMode); - *eof = 1; - return strlen(page); -} - -ssize_t video_HighTxMode_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.HighTxMode = val; - } - - return count; -} - -ssize_t video_TxPwr_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.TxPwr); - *eof = 1; - return strlen(page); -} - -ssize_t video_TxPwr_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.TxPwr = val; - } - - return count; -} - -ssize_t video_VideoMCSEnable_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable); - *eof = 1; - return strlen(page); -} - -ssize_t video_VideoMCSEnable_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable = val; - } - - return count; -} - -ssize_t video_VideoMCS_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.VideoMCS); - *eof = 1; - return strlen(page); -} - -ssize_t video_VideoMCS_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.VideoMCS = val; - } - - return count; -} - -ssize_t video_TxBASize_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.TxBASize); - *eof = 1; - return strlen(page); -} - -ssize_t video_TxBASize_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.TxBASize = val; - } - - return count; -} - -ssize_t video_TxLifeTimeMode_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode); - *eof = 1; - return strlen(page); -} - -ssize_t video_TxLifeTimeMode_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode = val; - } - - return count; -} - -ssize_t video_TxLifeTime_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.TxLifeTime); - *eof = 1; - return strlen(page); -} - -ssize_t video_TxLifeTime_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 10); - - GLOBAL_AP_VIDEO_CONFIG.TxLifeTime = val; - } - - return count; -} - -ssize_t video_TxRetryLimit_get(char *page, char **start, off_t off, int count, - int *eof, void *data_unused) -{ - sprintf(page, "0x%x\n", GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit); - *eof = 1; - return strlen(page); -} - -ssize_t video_TxRetryLimit_set(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - char *buf; - os_alloc_mem_suspend(NULL, (UCHAR **)&buf, count); - - if (buf) { - unsigned long val; - - if (copy_from_user(buf, buffer, count)) - return -EFAULT; - - if (buf) - val = os_str_toul(buf, NULL, 16); - - GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit = val; - } - - return count; -} - -int wl_video_proc_init(void) -{ - GLOBAL_AP_VIDEO_CONFIG.Enable = FALSE; - GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable = FALSE; - GLOBAL_AP_VIDEO_CONFIG.HighTxMode = FALSE; - GLOBAL_AP_VIDEO_CONFIG.TxPwr = 0; - GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable = FALSE; - GLOBAL_AP_VIDEO_CONFIG.VideoMCS = 0; - GLOBAL_AP_VIDEO_CONFIG.TxBASize = 0; - GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode = FALSE; - GLOBAL_AP_VIDEO_CONFIG.TxLifeTime = 0; - GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit = 0; - proc_ralink_wl = proc_mkdir("wl", procRegDir); - - if (proc_ralink_wl) - proc_ralink_wl_video = - proc_mkdir("VideoTurbine", proc_ralink_wl); - - if (proc_ralink_wl_video) { - entry_wl_video_Update = create_proc_entry("UpdateFromGlobal", 0, - proc_ralink_wl_video); - - if (entry_wl_video_Update) { - entry_wl_video_Update->read_proc = - (read_proc_t *)&video_Update_get; - entry_wl_video_Update->write_proc = - (write_proc_t *)&video_Update_set; - } - - entry_wl_video_Enable = - create_proc_entry("Enable", 0, proc_ralink_wl_video); - - if (entry_wl_video_Enable) { - entry_wl_video_Enable->read_proc = - (read_proc_t *)&video_Enable_get; - entry_wl_video_Enable->write_proc = - (write_proc_t *)&video_Enable_set; - } - - entry_wl_video_ClassifierEnable = create_proc_entry( - "ClassifierEnable", 0, proc_ralink_wl_video); - - if (entry_wl_video_ClassifierEnable) { - entry_wl_video_ClassifierEnable->read_proc = - (read_proc_t *)&video_ClassifierEnable_get; - entry_wl_video_ClassifierEnable->write_proc = - (write_proc_t *)&video_ClassifierEnable_set; - } - - entry_wl_video_HighTxMode = create_proc_entry( - "HighTxMode", 0, proc_ralink_wl_video); - - if (entry_wl_video_HighTxMode) { - entry_wl_video_HighTxMode->read_proc = - (read_proc_t *)&video_HighTxMode_get; - entry_wl_video_HighTxMode->write_proc = - (write_proc_t *)&video_HighTxMode_set; - } - - entry_wl_video_TxPwr = - create_proc_entry("TxPwr", 0, proc_ralink_wl_video); - - if (entry_wl_video_TxPwr) { - entry_wl_video_TxPwr->read_proc = - (read_proc_t *)&video_TxPwr_get; - entry_wl_video_TxPwr->write_proc = - (write_proc_t *)&video_TxPwr_set; - } - - entry_wl_video_VideoMCSEnable = create_proc_entry( - "VideoMCSEnable", 0, proc_ralink_wl_video); - - if (entry_wl_video_VideoMCSEnable) { - entry_wl_video_VideoMCSEnable->read_proc = - (read_proc_t *)&video_VideoMCSEnable_get; - entry_wl_video_VideoMCSEnable->write_proc = - (write_proc_t *)&video_VideoMCSEnable_set; - } - - entry_wl_video_VideoMCS = - create_proc_entry("VideoMCS", 0, proc_ralink_wl_video); - - if (entry_wl_video_VideoMCS) { - entry_wl_video_VideoMCS->read_proc = - (read_proc_t *)&video_VideoMCS_get; - entry_wl_video_VideoMCS->write_proc = - (write_proc_t *)&video_VideoMCS_set; - } - - entry_wl_video_TxBASize = - create_proc_entry("TxBASize", 0, proc_ralink_wl_video); - - if (entry_wl_video_TxBASize) { - entry_wl_video_TxBASize->read_proc = - (read_proc_t *)&video_TxBASize_get; - entry_wl_video_TxBASize->write_proc = - (write_proc_t *)&video_TxBASize_set; - } - - entry_wl_video_TxLifeTimeMode = create_proc_entry( - "TxLifeTimeMode", 0, proc_ralink_wl_video); - - if (entry_wl_video_TxLifeTimeMode) { - entry_wl_video_TxLifeTimeMode->read_proc = - (read_proc_t *)&video_TxLifeTimeMode_get; - entry_wl_video_TxLifeTimeMode->write_proc = - (write_proc_t *)&video_TxLifeTimeMode_set; - } - - entry_wl_video_TxLifeTime = create_proc_entry( - "TxLifeTime", 0, proc_ralink_wl_video); - - if (entry_wl_video_TxLifeTime) { - entry_wl_video_TxLifeTime->read_proc = - (read_proc_t *)&video_TxLifeTime_get; - entry_wl_video_TxLifeTime->write_proc = - (write_proc_t *)&video_TxLifeTime_set; - } - - entry_wl_video_TxRetryLimit = create_proc_entry( - "TxRetryLimit", 0, proc_ralink_wl_video); - - if (entry_wl_video_TxRetryLimit) { - entry_wl_video_TxRetryLimit->read_proc = - (read_proc_t *)&video_TxRetryLimit_get; - entry_wl_video_TxRetryLimit->write_proc = - (write_proc_t *)&video_TxRetryLimit_set; - } - } - - return 0; -} - -int wl_video_proc_exit(void) -{ - if (entry_wl_video_Enable) - remove_proc_entry("Enable", proc_ralink_wl_video); - - if (entry_wl_video_ClassifierEnable) - remove_proc_entry("ClassifierEnabl", proc_ralink_wl_video); - - if (entry_wl_video_HighTxMode) - remove_proc_entry("HighTxMode", proc_ralink_wl_video); - - if (entry_wl_video_TxPwr) - remove_proc_entry("TxPwr", proc_ralink_wl_video); - - if (entry_wl_video_VideoMCSEnable) - remove_proc_entry("VideoMCSEnable", proc_ralink_wl_video); - - if (entry_wl_video_VideoMCS) - remove_proc_entry("VideoMCS", proc_ralink_wl_video); - - if (entry_wl_video_TxBASize) - remove_proc_entry("TxBASize", proc_ralink_wl_video); - - if (entry_wl_video_TxLifeTimeMode) - remove_proc_entry("TxLifeTimeMode", proc_ralink_wl_video); - - if (entry_wl_video_TxLifeTime) - remove_proc_entry("TxLifeTime", proc_ralink_wl_video); - - if (entry_wl_video_TxRetryLimit) - remove_proc_entry("TxRetryLimit", proc_ralink_wl_video); - - if (proc_ralink_wl_video) - remove_proc_entry("Video", proc_ralink_wl); - - return 0; -} - -int wl_proc_init(void) -{ - if (procRegDir == NULL) - procRegDir = proc_mkdir(PROCREG_DIR, NULL); - - if (procRegDir) { -#ifdef VIDEO_TURBINE_SUPPORT - wl_video_proc_init(); -#endif /* VIDEO_TURBINE_SUPPORT */ - } - - return 0; -} - -int wl_proc_exit(void) -{ -#ifdef VIDEO_TURBINE_SUPPORT - - if (proc_ralink_wl_video) { - wl_video_proc_exit(); - remove_proc_entry("Video", proc_ralink_wl); - } - - if (proc_ralink_wl) - remove_proc_entry("wl", procRegDir); - -#endif /* VIDEO_TURBINE_SUPPORT */ - return 0; -} -#else -int wl_proc_init(void) -{ - return 0; -} - -int wl_proc_exit(void) -{ - return 0; -} -#endif /* VIDEO_TURBINE_SUPPORT && CONFIG_PROC_FS */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_profile.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_profile.c deleted file mode 100644 index 36198df23a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_profile.c +++ /dev/null @@ -1,2159 +0,0 @@ -/**************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * (c) Copyright 2002, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - **************************************************************************** - - Module Name: - rt_profile.c - - Abstract: - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - */ - -#include "rt_config.h" -#include "l1profile.h" - -#ifdef RTMP_UDMA_SUPPORT -#include "rt_udma.h" -#endif /*RTMP_UDMA_SUPPORT*/ - -#if defined(BB_SOC) && defined(BB_RA_HWNAT_WIFI) -#include -#endif - -#if defined(RLM_CAL_CACHE_SUPPORT) || defined(PRE_CAL_TRX_SET2_SUPPORT) -#include "phy/rlm_cal_cache.h" -#endif /* RLM_CAL_CACHE_SUPPORT */ - -#define BSSID_WCID_TO_REMOVE 1 - -struct l1profile_info_t { - RTMP_STRING profile_index[L1PROFILE_INDEX_LEN]; - RTMP_STRING profile_path[L2PROFILE_PATH_LEN]; - eeprom_flash_info ee_info; - struct dev_type_name_map_t dev_name_map[MAX_INT_TYPES + 1]; - RTMP_STRING single_sku_path[L2PROFILE_PATH_LEN]; - RTMP_STRING bf_sku_path[L2PROFILE_PATH_LEN]; -}; - -struct l1profile_attribute_t { - RTMP_STRING name[L1PROFILE_ATTRNAME_LEN]; - UINT_32 extra; - INT (*handler)(RTMP_ADAPTER *pAd, UINT_32 extra, RTMP_STRING *value); -}; -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -UCHAR wf_apcli_active_links; -#if defined(CONFIG_FAST_NAT_SUPPORT) -int (*wf_ra_sw_nat_hook_tx_bkup)(struct sk_buff *skb, int gmac_no); -int (*wf_ra_sw_nat_hook_rx_bkup)(struct sk_buff *skb); -#endif /*CONFIG_FAST_NAT_SUPPORT*/ -#endif -#ifdef INTELP6_SUPPORT -#define SECOND_INF_MAIN_DEV_NAME "ra8" -#define SECOND_INF_MBSSID_DEV_NAME "ra" -#else -#if defined(RT_CFG80211_SUPPORT) -#define SECOND_INF_MAIN_DEV_NAME "wlani" -#define SECOND_INF_MBSSID_DEV_NAME "wlani" -#else -#define SECOND_INF_MAIN_DEV_NAME "rai0" -#define SECOND_INF_MBSSID_DEV_NAME "rai" -#endif -#endif -#define SECOND_INF_WDS_DEV_NAME "wdsi" -#define SECOND_INF_APCLI_DEV_NAME "apclii" -#define SECOND_INF_MESH_DEV_NAME "meshi" -#define SECOND_INF_P2P_DEV_NAME "p2pi" -#define SECOND_INF_MONITOR_DEV_NAME "moni" -#define SECOND_INF_MSTA_DEV_NAME "rai" - -#if defined(RT_CFG80211_SUPPORT) -#define THIRD_INF_MAIN_DEV_NAME "wlane" -#define THIRD_INF_MBSSID_DEV_NAME "wlane" -#else -#define THIRD_INF_MAIN_DEV_NAME "rae0" -#define THIRD_INF_MBSSID_DEV_NAME "rae" -#endif -#define THIRD_INF_WDS_DEV_NAME "wdse" -#define THIRD_INF_APCLI_DEV_NAME "apclie" -#define THIRD_INF_MESH_DEV_NAME "meshe" -#define THIRD_INF_P2P_DEV_NAME "p2pe" -#define THIRD_INF_MONITOR_DEV_NAME "mone" -#define THIRD_INF_MSTA_DEV_NAME "rae" - -#define xdef_to_str(s) def_to_str(s) -#define def_to_str(s) #s - -#define FIRST_EEPROM_FILE_PATH "/etc_ro/Wireless/RT2860/" -#ifdef INTELP6_SUPPORT -#define FIRST_AP_PROFILE_PATH "/tmp/mt76xx_24.dat" -#else -#define FIRST_AP_PROFILE_PATH "/etc/Wireless/RT2860/RT2860.dat" -#endif -#define FIRST_STA_PROFILE_PATH "/etc/Wireless/RT2860/RT2860.dat" -#define FIRST_CHIP_ID xdef_to_str(CONFIG_RT_FIRST_CARD) - -#define SECOND_EEPROM_FILE_PATH "/etc_ro/Wireless/iNIC/" -#ifdef INTELP6_SUPPORT -#define SECOND_AP_PROFILE_PATH "/tmp/mt76xx_5.dat" -#else -#define SECOND_AP_PROFILE_PATH "/etc/Wireless/iNIC/iNIC_ap.dat" -#endif -#define SECOND_STA_PROFILE_PATH "/etc/Wireless/iNIC/iNIC_sta.dat" - -#define SECOND_CHIP_ID xdef_to_str(CONFIG_RT_SECOND_CARD) - -#define THIRD_EEPROM_FILE_PATH "/etc_ro/Wireless/WIFI3/" -#define THIRD_AP_PROFILE_PATH "/etc/Wireless/WIFI3/RT2870AP.dat" -#define THIRD_STA_PROFILE_PATH "/etc/Wireless/WIFI3/RT2870AP.dat" - -#define THIRD_CHIP_ID xdef_to_str(CONFIG_RT_THIRD_CARD) - -#ifndef CONFIG_RT_FIRST_IF_RF_OFFSET -#define CONFIG_RT_FIRST_IF_RF_OFFSET DEFAULT_RF_OFFSET -#endif - -#ifndef CONFIG_RT_SECOND_IF_RF_OFFSET -#define CONFIG_RT_SECOND_IF_RF_OFFSET DEFAULT_RF_OFFSET -#endif - -#ifndef CONFIG_RT_THIRD_IF_RF_OFFSET -#define CONFIG_RT_THIRD_IF_RF_OFFSET DEFAULT_RF_OFFSET -#endif - -#define MAX_L1PROFILE_INDEX 10 - -static struct l1profile_info_t l1profile[MAX_NUM_OF_INF] = { - { { 0 }, - FIRST_AP_PROFILE_PATH, - { CONFIG_RT_FIRST_IF_RF_OFFSET, EEPROM_SIZE }, - { { INT_MAIN, INF_MAIN_DEV_NAME }, - { INT_MBSSID, INF_MBSSID_DEV_NAME }, - { INT_WDS, INF_WDS_DEV_NAME }, - { INT_APCLI, INF_APCLI_DEV_NAME }, - { INT_MESH, INF_MESH_DEV_NAME }, - { INT_P2P, INF_P2P_DEV_NAME }, - { INT_MONITOR, INF_MONITOR_DEV_NAME }, - { INT_MSTA, INF_MSTA_DEV_NAME }, - { 0 } } -#ifdef SINGLE_SKU_V2 - , - { SINGLE_SKU_TABLE_FILE_NAME }, - { BF_SKU_TABLE_FILE_NAME } -#endif /* SINGLE_SKU_V2 */ - }, -#if defined(CONFIG_RT_SECOND_CARD) - { { 0 }, - SECOND_AP_PROFILE_PATH, - { CONFIG_RT_SECOND_IF_RF_OFFSET, EEPROM_SIZE }, - { { INT_MAIN, SECOND_INF_MAIN_DEV_NAME }, - { INT_MBSSID, SECOND_INF_MBSSID_DEV_NAME }, - { INT_WDS, SECOND_INF_WDS_DEV_NAME }, - { INT_APCLI, SECOND_INF_APCLI_DEV_NAME }, - { INT_MESH, SECOND_INF_MESH_DEV_NAME }, - { INT_P2P, SECOND_INF_P2P_DEV_NAME }, - { INT_MONITOR, SECOND_INF_MONITOR_DEV_NAME }, - { INT_MSTA, SECOND_INF_MSTA_DEV_NAME }, - { 0 } } -#ifdef SINGLE_SKU_V2 - , - { SINGLE_SKU_TABLE_FILE_NAME }, - { BF_SKU_TABLE_FILE_NAME } -#endif /* SINGLE_SKU_V2 */ - }, -#endif /* CONFIG_RT_SECOND_CARD */ -#if defined(CONFIG_RT_THIRD_CARD) - { { 0 }, - THIRD_AP_PROFILE_PATH, - { CONFIG_RT_THIRD_IF_RF_OFFSET, EEPROM_SIZE }, - { { INT_MAIN, THIRD_INF_MAIN_DEV_NAME }, - { INT_MBSSID, THIRD_INF_MBSSID_DEV_NAME }, - { INT_WDS, THIRD_INF_WDS_DEV_NAME }, - { INT_APCLI, THIRD_INF_APCLI_DEV_NAME }, - { INT_MESH, THIRD_INF_MESH_DEV_NAME }, - { INT_P2P, THIRD_INF_P2P_DEV_NAME }, - { INT_MONITOR, THIRD_INF_MONITOR_DEV_NAME }, - { INT_MSTA, THIRD_INF_MSTA_DEV_NAME }, - { 0 } } -#ifdef SINGLE_SKU_V2 - , - { SINGLE_SKU_TABLE_FILE_NAME }, - { BF_SKU_TABLE_FILE_NAME } -#endif /* SINGLE_SKU_V2 */ - }, -#endif /* CONFIG_RT_THIRD_CARD */ -}; - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - -struct wifi_fwd_func_table wf_drv_tbl; - -#endif - -static NDIS_STATUS l1set_profile_path(RTMP_ADAPTER *pAd, UINT_32 extra, - RTMP_STRING *value) -{ - INT retVal = NDIS_STATUS_SUCCESS; - RTMP_STRING *target = l1profile[get_dev_config_idx(pAd)].profile_path; - RTMP_STRING *pSemicolon = strchr(value, ';'); - - if (pSemicolon) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DBDC format of profile path!\n")); - *pSemicolon = '\0'; -#ifdef MULTI_PROFILE -#ifdef DEFAULT_5G_PROFILE - update_mtb_value(pAd, MTB_5G_PROFILE, extra, value); - update_mtb_value(pAd, MTB_2G_PROFILE, extra, pSemicolon + 1); -#else - update_mtb_value(pAd, MTB_2G_PROFILE, extra, value); - update_mtb_value(pAd, MTB_5G_PROFILE, extra, pSemicolon + 1); -#endif - } else { - update_mtb_value( - pAd, MTB_2G_PROFILE, extra, - value); /* force update mtb[] to prevent unsynced value */ -#endif /* MULTI_PROFILE */ - } - - if (strcmp(target, value)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("profile update from %s to %s\n", target, value)); - strncpy(target, value, L2PROFILE_PATH_LEN - 1); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("profile remain %s\n", target)); - - return retVal; -} - -static NDIS_STATUS l1set_eeprom_bin(RTMP_ADAPTER *pAd, UINT_32 extra, - RTMP_STRING *value) -{ - INT retVal = NDIS_STATUS_SUCCESS; - RTMP_STRING *target = - l1profile[get_dev_config_idx(pAd)].ee_info.bin_name; - - if (strcmp(target, value)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("eeprom binary update from %s to %s\n", target, - value)); - strncpy(target, value, L1PROFILE_ATTRNAME_LEN - 1); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("eeprom binary remain %s\n", target)); - - return retVal; -} - -static NDIS_STATUS l1set_eeprom_offset(RTMP_ADAPTER *pAd, UINT_32 extra, - RTMP_STRING *value) -{ - INT retVal = NDIS_STATUS_SUCCESS; - eeprom_flash_info *target = (eeprom_flash_info *)(&( - l1profile[get_dev_config_idx(pAd)].ee_info)); - UINT int_value = 0; - - int_value = os_str_tol(value, 0, 0); - - if (target->offset != int_value) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("eeprom offset update from 0x%x to 0x%x\n", - target->offset, int_value)); - target->offset = int_value; - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("eeprom offset remain 0x%x\n", target->offset)); - - return retVal; -} - -static NDIS_STATUS l1set_eeprom_size(RTMP_ADAPTER *pAd, UINT_32 extra, - RTMP_STRING *value) -{ - UINT int_value; - INT retVal = NDIS_STATUS_SUCCESS; - eeprom_flash_info *target = (eeprom_flash_info *)(&( - l1profile[get_dev_config_idx(pAd)].ee_info)); - - int_value = os_str_tol(value, 0, 0); - - if (target->size != int_value) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("eeprom size update from 0x%x to 0x%x\n", - target->size, int_value)); - target->size = int_value; - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("eeprom size remain 0x%x\n", target->size)); - - return retVal; -} - -static NDIS_STATUS l1set_ifname(RTMP_ADAPTER *pAd, UINT_32 extra, - RTMP_STRING *value) -{ - INT retVal = NDIS_STATUS_SUCCESS; - RTMP_STRING *target = NULL; - RTMP_STRING *pSemicolon = NULL; - - target = get_dev_name_prefix(pAd, extra); - if (target == NULL) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): get_dev_name_prefix is NULL\n", __func__)); - return NDIS_STATUS_FAILURE; - } - - pSemicolon = strchr(value, ';'); - - if (pSemicolon) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DBDC format of ifname!\n")); - *pSemicolon = '\0'; -#ifdef MULTI_PROFILE - update_mtb_value(pAd, MTB_DEV_PREFIX, extra, pSemicolon + 1); -#endif /* MULTI_PROFILE */ - } - - if (strcmp(target, value)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ifname update from %s to %s\n", target, value)); - - strncpy(target, value, IFNAMSIZ); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ifname remain %s\n", target)); - - return retVal; -} - -#ifdef SINGLE_SKU_V2 -static NDIS_STATUS l1set_single_sku_path(RTMP_ADAPTER *pAd, UINT_32 extra, - RTMP_STRING *value) -{ - INT retVal = NDIS_STATUS_SUCCESS; - RTMP_STRING *target = - l1profile[get_dev_config_idx(pAd)].single_sku_path; - - if (strcmp(target, value)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("sku path update from %s to %s\n", target, value)); - strncpy(target, value, L2PROFILE_PATH_LEN - 1); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("profile remain %s\n", target)); - - return retVal; -} - -static NDIS_STATUS l1set_bf_sku_path(RTMP_ADAPTER *pAd, UINT_32 extra, - RTMP_STRING *value) -{ - INT retVal = NDIS_STATUS_SUCCESS; - RTMP_STRING *target = l1profile[get_dev_config_idx(pAd)].bf_sku_path; - - if (strcmp(target, value)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("BF sku path update from %s to %s\n", target, value)); - strncpy(target, value, L2PROFILE_PATH_LEN - 1); - } else - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("profile remain %s\n", target)); - - return retVal; -} -#endif /*SINGLE_SKU_V2*/ - -static NDIS_STATUS is_dup_key(RTMP_STRING *key) -{ - INT retVal = NDIS_STATUS_SUCCESS; - INT dev_idx = 0; - RTMP_STRING *profile_index = NULL; - - for (dev_idx = 0; dev_idx < MAX_NUM_OF_INF; dev_idx++) { - profile_index = l1profile[dev_idx].profile_index; - - if ((strlen(profile_index) > 0) && - (strcmp(profile_index, key) == 0)) { - retVal = NDIS_STATUS_FAILURE; - dev_idx = MAX_NUM_OF_INF; /* tend to leave loop */ - } - } - - return retVal; -} - -static NDIS_STATUS match_index_by_chipname(IN RTMP_STRING *l1profile_data, - IN RTMP_ADAPTER *pAd, - IN RTMP_STRING *chipName) -{ - INT retVal = NDIS_STATUS_FAILURE; - INT if_idx = 0; - RTMP_STRING key[10] = { 0 }; - RTMP_STRING *tmpbuf = NULL; - - os_alloc_mem(NULL, (UCHAR **)&tmpbuf, MAX_PARAM_BUFFER_SIZE); - - while (if_idx < MAX_L1PROFILE_INDEX) { - sprintf(key, "INDEX%d", if_idx); - if (RTMPGetKeyParameter(key, tmpbuf, MAX_PARAM_BUFFER_SIZE, - l1profile_data, TRUE)) { - if (strncmp(tmpbuf, chipName, strlen(chipName)) == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s found as %s\n", chipName, key)); - - if (is_dup_key( - key)) { /* There might be not only single entry for one chip */ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s for %s occupied, next\n", - key, chipName)); - } else { - strncpy(l1profile[get_dev_config_idx( - pAd)] - .profile_index, - key, L1PROFILE_INDEX_LEN - 1); - retVal = NDIS_STATUS_SUCCESS; - if_idx = - MAX_L1PROFILE_INDEX; /* found, intend to leave */ - } - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s mismatch with %s as %s\n", - chipName, tmpbuf, key)); - } - - if_idx++; - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s not found, dismissed.\n", key)); - if_idx = - MAX_L1PROFILE_INDEX; /* hit maximum avalable index, intend to leave */ - } - } - - os_free_mem(tmpbuf); - - return retVal; -} - -static NDIS_STATUS l1get_profile_index(IN RTMP_STRING *l1profile_data, - IN RTMP_ADAPTER *pAd) -{ - INT retVal = NDIS_STATUS_SUCCESS; - INT dev_idx = get_dev_config_idx(pAd); - RTMP_STRING chipName[10] = { 0 }; - RTMP_STRING *tmpbuf = NULL; - - sprintf(chipName, "MT%x", pAd->ChipID); - os_alloc_mem(NULL, (UCHAR **)&tmpbuf, MAX_PARAM_BUFFER_SIZE); - - if (IS_MT7615(pAd) && (pAd->RfIcType == RFIC_7615A)) - strncat(chipName, "A", 9); - - if (match_index_by_chipname(l1profile_data, pAd, chipName) == - NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%d]%s found by chip\n", dev_idx, chipName)); - } else { - retVal = NDIS_STATUS_FAILURE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("[%d]%s not found, keep default\n", dev_idx, - chipName)); - } - - os_free_mem(tmpbuf); - - return retVal; -} - -static struct l1profile_attribute_t l1profile_attributes[] = { - { { "profile_path" }, 0, l1set_profile_path }, - { { "EEPROM_name" }, 0, l1set_eeprom_bin }, - { { "EEPROM_offset" }, 0, l1set_eeprom_offset }, - { { "EEPROM_size" }, 0, l1set_eeprom_size }, - { { "main_ifname" }, INT_MAIN, l1set_ifname }, -#ifdef CONFIG_AP_SUPPORT -#ifdef MBSS_SUPPORT - { { "ext_ifname" }, INT_MBSSID, l1set_ifname }, -#endif /* MBSS_SUPPORT */ -#ifdef WDS_SUPPORT - { { "wds_ifname" }, INT_WDS, l1set_ifname }, -#endif /* WDS_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ - { { "apcli_ifname" }, INT_APCLI, l1set_ifname }, -#ifdef SNIFFER_SUPPORT - { { "monitor_ifname" }, INT_MONITOR, l1set_ifname }, -#endif /* monitor_ifname */ -#ifdef SINGLE_SKU_V2 - { { "single_sku_path" }, 0, l1set_single_sku_path }, - { { "bf_sku_path" }, 0, l1set_bf_sku_path }, -#endif /* SINGLE_SKU_V2 */ -}; - -#ifdef MULTI_PROFILE -INT multi_profile_check(struct _RTMP_ADAPTER *ad, CHAR *final); -#endif /*MULTI_PROFILE*/ - -struct dev_id_name_map { - INT chip_id; - RTMP_STRING *chip_name; -}; - -static const struct dev_id_name_map id_name_list[] = { - { 7610, "7610, 7610e 7610u" }, - -}; -#ifdef SINGLE_SKU_V2 -UCHAR *get_single_sku_path(RTMP_ADAPTER *pAd) -{ - UCHAR *src = NULL; - - src = l1profile[get_dev_config_idx(pAd)].single_sku_path; - return src; -} - -UCHAR *get_bf_sku_path(RTMP_ADAPTER *pAd) -{ - UCHAR *src = NULL; - - src = l1profile[get_dev_config_idx(pAd)].bf_sku_path; - return src; -} -#endif /*SINGLE_SKU_V2*/ - -INT get_dev_config_idx(RTMP_ADAPTER *pAd) -{ - INT idx = 0; -#if defined(CONFIG_RT_FIRST_CARD) && defined(CONFIG_RT_SECOND_CARD) - INT first_card = 0, second_card = 0; - - A2Hex(first_card, FIRST_CHIP_ID); - A2Hex(second_card, SECOND_CHIP_ID); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("chip_id1=0x%x, chip_id2=0x%x, pAd->MACVersion=0x%x\n", - first_card, second_card, pAd->MACVersion)); -#endif /* defined(CONFIG_RT_FIRST_CARD) && defined(CONFIG_RT_SECOND_CARD) */ - -#ifdef MULTI_INF_SUPPORT - idx = multi_inf_get_idx((VOID *)pAd); -#endif /* MULTI_INF_SUPPORT */ - -#if defined(CONFIG_RT_SECOND_CARD) -#if defined(CONFIG_FIRST_IF_MT7603E) - /* MT7603(ra0) + MT7615(rai0) combination */ - if (IS_MT7615(pAd)) - idx = 1; -#endif /* defined(CONFIG_FIRST_IF_MT7603E) */ -#endif /* defined(RT_SECOND_CARD) */ - - pAd->dev_idx = idx; - return idx; -} - -RTMP_STRING *get_dev_eeprom_binary(VOID *pvAd) -{ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pvAd; - - return l1profile[get_dev_config_idx(pAd)].ee_info.bin_name; -} - -UINT get_dev_eeprom_offset(VOID *pvAd) -{ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pvAd; - - return l1profile[get_dev_config_idx(pAd)].ee_info.offset; -} - -UINT get_dev_eeprom_size(VOID *pvAd) -{ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pvAd; - - return l1profile[get_dev_config_idx(pAd)].ee_info.size; -} - -UCHAR *get_dev_name_prefix(RTMP_ADAPTER *pAd, INT dev_type) -{ - struct dev_type_name_map_t *map; - INT type_idx = 0, dev_idx = get_dev_config_idx(pAd); - - if (dev_idx < 0 || dev_idx >= MAX_NUM_OF_INF) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): invalid dev_idx(%d)!\n", __func__, dev_idx)); - return NULL; - } - - do { - map = &(l1profile[dev_idx].dev_name_map[type_idx]); - - if (map->type == dev_type) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): dev_idx = %d, dev_name_prefix=%s\n", - __func__, dev_idx, map->prefix)); - return map->prefix; - } - - type_idx++; - } while (l1profile[dev_idx].dev_name_map[type_idx].type != 0); - - return NULL; -} - -UCHAR *get_dev_l2profile(RTMP_ADAPTER *pAd) -{ - UCHAR *src = NULL; - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#if defined(CONFIG_RT_FIRST_CARD) || defined(CONFIG_RT_SECOND_CARD) || \ - defined(CONFIG_RT_THIRD_CARD) - if (get_dev_config_idx(pAd) < 3) - src = l1profile[get_dev_config_idx(pAd)].profile_path; - else -#endif /* CONFIG_RT_FIRST_CARD || CONFIG_RT_SECOND_CARD || CONFIG_RT_THIRD_CARD */ - { - src = AP_PROFILE_PATH; - } - } -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef MULTIPLE_CARD_SUPPORT - src = (RTMP_STRING *)pAd->MC_FileName; -#endif /* MULTIPLE_CARD_SUPPORT */ - return src; -} - -int ShowL1profile(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("===== L1 profile settings =====\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s = %s\n", l1profile_attributes[0].name, - get_dev_l2profile(pAd))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s = %x\n", l1profile_attributes[2].name, - get_dev_eeprom_offset(pAd))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s = %x\n", l1profile_attributes[3].name, - get_dev_eeprom_size(pAd))); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s = %s\n", l1profile_attributes[4].name, - get_dev_name_prefix(pAd, INT_MAIN))); - - return TRUE; -} - -NDIS_STATUS load_dev_l1profile(IN RTMP_ADAPTER *pAd) -{ - RTMP_STRING *buffer = NULL; - RTMP_OS_FD_EXT srcf; - INT retval = NDIS_STATUS_SUCCESS; - ULONG buf_size = MAX_INI_BUFFER_SIZE; -#ifdef HOSTAPD_SUPPORT - int i; -#endif /*HOSTAPD_SUPPORT */ - - os_alloc_mem(pAd, (UCHAR **)&buffer, buf_size); - if (!buffer) - goto err_out2; - - os_zero_mem(buffer, buf_size); - - srcf = os_file_open(L1_PROFILE_PATH, O_RDONLY, 0); - - if (srcf.Status) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("Open file \"%s\" failed, try embedded default!\n", - L1_PROFILE_PATH)); - - retval = strlen(l1profile_default); - strncpy(buffer, l1profile_default, buf_size - 1); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Open file \"%s\" Succeed!\n", L1_PROFILE_PATH)); - -#ifndef OS_ABL_SUPPORT - /* TODO: need to roll back when convert into OSABL code */ - if (srcf.fsize != 0 && buf_size < (srcf.fsize + 1)) - buf_size = srcf.fsize + 1; -#endif /* OS_ABL_SUPPORT */ - retval = os_file_read(srcf, buffer, buf_size - 1); - - if (retval) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Read file \"%s\"(%d) succeed!\n", - L1_PROFILE_PATH, retval)); - } - - if (retval) { - RTMP_STRING *tmpbuf = NULL; - RTMP_STRING key[30] = { '\0' }; - UINT32 attr_index = 0; - INT dev_idx = get_dev_config_idx(pAd); - RTMP_STRING *profile_index = l1profile[dev_idx].profile_index; - struct l1profile_attribute_t *l1attr = NULL; - - /* Do not fetch INDEX%d each time loading l1profile */ - if ((strlen(profile_index) == 0) && - (l1get_profile_index(buffer, pAd) != NDIS_STATUS_SUCCESS)) - goto err_out1; - - os_alloc_mem(NULL, (UCHAR **)&tmpbuf, MAX_PARAM_BUFFER_SIZE); - - if (tmpbuf == NULL) - goto err_out1; - - if (RTMPGetKeyParameter(profile_index, tmpbuf, - MAX_PARAM_BUFFER_SIZE, buffer, TRUE)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Chip=%s\n", tmpbuf)); - - for (attr_index = 0; - attr_index < ARRAY_SIZE(l1profile_attributes); - attr_index++) { - l1attr = &l1profile_attributes[attr_index]; - snprintf(key, sizeof(key), "%s_%s", - profile_index, l1attr->name); - - if (RTMPGetKeyParameter(key, tmpbuf, - MAX_PARAM_BUFFER_SIZE, - buffer, TRUE)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("%s=%s\n", l1attr->name, - tmpbuf)); - - if (l1attr->handler) - l1attr->handler(pAd, - l1attr->extra, - tmpbuf); - else - MTWF_LOG( - DBG_CAT_CFG, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("unknown handler for %s, ignored!\n", - l1attr->name)); - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_WARN, - ("%s not found\n", - l1attr->name)); - } - } - - retval = NDIS_STATUS_SUCCESS; - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("%s not found!!\n", profile_index)); - retval = NDIS_STATUS_FAILURE; - } - os_free_mem(tmpbuf); - } else { - retval = NDIS_STATUS_FAILURE; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Read file \"%s\" failed(errCode=%d)!\n", - L1_PROFILE_PATH, retval)); - } - -err_out1: - if ((srcf.Status == 0) && (os_file_close(srcf) != 0)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Close file \"%s\" failed(errCode=%d)!\n", - L1_PROFILE_PATH, retval)); - retval = NDIS_STATUS_FAILURE; - } else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Close file \"%s\" succeed!\n", L1_PROFILE_PATH)); - } - -err_out2: - if (buffer) - os_free_mem(buffer); - - return retval; -} - -NDIS_STATUS RTMPReadParametersHook(RTMP_ADAPTER *pAd) -{ - RTMP_STRING *src = NULL; - RTMP_OS_FD_EXT srcf; - INT retval = NDIS_STATUS_FAILURE; - ULONG buf_size = MAX_INI_BUFFER_SIZE; - RTMP_STRING *buffer = NULL; -#ifdef HOSTAPD_SUPPORT - int i; -#endif /*HOSTAPD_SUPPORT */ - os_alloc_mem(pAd, (UCHAR **)&buffer, buf_size); - if (!buffer) { - return NDIS_STATUS_FAILURE; - } - os_zero_mem(buffer, buf_size); - /*if support multi-profile merge it*/ -#ifdef MULTI_PROFILE - if (multi_profile_check(pAd, buffer) == NDIS_STATUS_SUCCESS) { - RTMPSetProfileParameters(pAd, buffer); - retval = NDIS_STATUS_SUCCESS; - } else -#endif /*MULTI_PROFILE*/ - { - src = get_dev_l2profile(pAd); - if (src && *src) { - srcf = os_file_open(src, O_RDONLY, 0); - - if (srcf.Status) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Open file \"%s\" failed!\n", src)); - } else { -#ifndef OS_ABL_SUPPORT - // TODO: need to roll back when convert into OSABL code - if (srcf.fsize != 0 && - buf_size < (srcf.fsize + 1)) { - buf_size = srcf.fsize + 1; - } -#endif /* OS_ABL_SUPPORT */ - retval = os_file_read(srcf, buffer, - buf_size - 1); - if (retval > 0) { - RTMPSetProfileParameters(pAd, buffer); - retval = NDIS_STATUS_SUCCESS; - } else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Read file \"%s\" failed(errCode=%d)!\n", - src, retval)); - - if (os_file_close(srcf) != 0) { - retval = NDIS_STATUS_FAILURE; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Close file \"%s\" failed(errCode=%d)!\n", - src, retval)); - } - } - } - } - -#ifdef HOSTAPD_SUPPORT - - for (i = 0; i < pAd->ApCfg.BssidNum; i++) { - pAd->ApCfg.MBSSID[i].Hostapd = Hostapd_Disable; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Reset ra%d hostapd support=FLASE", i)); - } - -#endif /*HOSTAPD_SUPPORT */ - - if (buffer) - os_free_mem(buffer); - return retval; -} - -/*Used for pre-read user configuration before system ready*/ -NDIS_STATUS RTMPPreReadProfile(RTMP_ADAPTER *pAd) -{ - RTMP_STRING *src = NULL; - RTMP_OS_FD_EXT srcf; - INT retval = NDIS_STATUS_FAILURE; - ULONG buf_size = MAX_INI_BUFFER_SIZE; - RTMP_STRING *buffer = NULL; - - src = get_dev_l2profile(pAd); - - if (src && *src) { - srcf = os_file_open(src, O_RDONLY, 0); - - if (srcf.Status) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Open file \"%s\" failed!\n", src)); - else { - os_alloc_mem(pAd, (UCHAR **)&buffer, buf_size); - - if (buffer) { - os_zero_mem(buffer, buf_size); - retval = os_file_read(srcf, buffer, - buf_size - 1); - - if (retval > 0) { - RTMPSetPreProfileParameters(pAd, - buffer); - retval = NDIS_STATUS_SUCCESS; - } else - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Read file \"%s\" failed(errCode=%d)!\n", - src, retval)); - - os_free_mem(buffer); - } else - retval = NDIS_STATUS_FAILURE; - - if (os_file_close(srcf) != 0) { - retval = NDIS_STATUS_FAILURE; - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Close file \"%s\" failed(errCode=%d)!\n", - src, retval)); - } - } - } - - return retval; -} - -void RTMP_IndicateMediaState(IN PRTMP_ADAPTER pAd, - IN NDIS_MEDIA_STATE media_state) -{ - pAd->IndicateMediaState = media_state; -#ifdef SYSTEM_LOG_SUPPORT - - if (pAd->IndicateMediaState == NdisMediaStateConnected) { - UINT wcid = BSSID_WCID_TO_REMOVE; /* Pat: TODO */ - - RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, - pAd->MacTab.Content[wcid].Addr, BSS0, 0); - } else { - UINT wcid = BSSID_WCID_TO_REMOVE; /* Pat: TODO */ - - RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, - pAd->MacTab.Content[wcid].Addr, BSS0, 0); - } - -#endif /* SYSTEM_LOG_SUPPORT */ -} - -#ifdef INF_PPA_SUPPORT -static INT process_nbns_packet(IN PRTMP_ADAPTER pAd, IN struct sk_buff *skb) -{ - UCHAR *data; - USHORT *eth_type; - - data = (UCHAR *)eth_hdr(skb); - - if (data == 0) { - data = (UCHAR *)skb->data; - - if (data == 0) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s::Error\n", __func__)); - return 1; - } - } - - eth_type = (USHORT *)&data[12]; - - if (*eth_type == cpu_to_be16(ETH_P_IP)) { - INT ip_h_len; - UCHAR *ip_h; - UCHAR *udp_h; - USHORT dport, host_dport; - - ip_h = data + 14; - ip_h_len = (ip_h[0] & 0x0f) * 4; - - if (ip_h[9] == 0x11) { /* UDP */ - udp_h = ip_h + ip_h_len; - memcpy(&dport, udp_h + 2, 2); - host_dport = ntohs(dport); - if ((host_dport == 67) || (host_dport == 68)) /* DHCP */ - return 0; - } - } else if ((data[12] == 0x88) && (data[13] == 0x8e)) /* EAPOL */ - return 0; - - return 1; -} -#endif /* INF_PPA_SUPPORT */ - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -struct net_device *rlt_dev_get_by_name(const char *name) -{ -#if (KERNEL_VERSION(2, 6, 24) < LINUX_VERSION_CODE) - return dev_get_by_name(&init_net, name); -#else - return dev_get_by_name(name); -#endif -} - -VOID ApCliLinkCoverRxPolicy(IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket, - OUT BOOLEAN *DropPacket) -{ -#ifdef MAC_REPEATER_SUPPORT - void *opp_band_tbl = NULL; - void *band_tbl = NULL; - void *other_band_tbl = NULL; - INVAILD_TRIGGER_MAC_ENTRY *pInvalidEntry = NULL; - REPEATER_CLIENT_ENTRY *pOtherBandReptEntry = NULL; - REPEATER_CLIENT_ENTRY *pAnotherBandReptEntry = NULL; - PNDIS_PACKET pRxPkt = pPacket; - UCHAR *pPktHdr = NULL; - - pPktHdr = GET_OS_PKT_DATAPTR(pRxPkt); - - if (wf_drv_tbl.wf_fwd_feedback_map_table) - wf_drv_tbl.wf_fwd_feedback_map_table( - pAd, &band_tbl, &opp_band_tbl, &other_band_tbl); - - if ((opp_band_tbl == NULL) && (other_band_tbl == NULL)) - return; - - if (IS_GROUP_MAC(pPktHdr)) { - pInvalidEntry = RepeaterInvaildMacLookup(pAd, pPktHdr + 6); - - if (opp_band_tbl != NULL) - pOtherBandReptEntry = RTMPLookupRepeaterCliEntry( - opp_band_tbl, FALSE, pPktHdr + 6, FALSE); - - if (other_band_tbl != NULL) - pAnotherBandReptEntry = RTMPLookupRepeaterCliEntry( - other_band_tbl, FALSE, pPktHdr + 6, FALSE); - - if ((pInvalidEntry != NULL) || (pOtherBandReptEntry != NULL) || - (pAnotherBandReptEntry != NULL)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s, recv broadcast from InvalidRept Entry, drop this packet\n", - __func__)); - *DropPacket = TRUE; - } - } -#endif /* MAC_REPEATER_SUPPORT */ -} -#endif /* CONFIG_WIFI_PKT_FWD */ - -void announce_802_3_packet(IN VOID *pAdSrc, IN PNDIS_PACKET pPacket, - IN UCHAR OpMode) -{ - RTMP_ADAPTER *pAd = NULL; - PNDIS_PACKET pRxPkt = pPacket; -#if defined(WH_EZ_SETUP) && \ - (defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE)) - BOOLEAN bypass_rx_fwd = FALSE; -#endif - - pAd = (RTMP_ADAPTER *)pAdSrc; - ASSERT(pAd); - ASSERT(pPacket); - /* MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("=>%s(): OpMode=%d\n", __FUNCTION__, OpMode)); */ - - MEM_DBG_PKT_FREE_INC(pPacket); -#ifdef APCLI_AS_WDS_STA_SUPPORT - if (pAd->ApCfg.ApCliTab[0].wdev.wds_enable == 0) { -#endif /*APCLI_AS_WDS_STA_SUPPORT*/ -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef MAT_SUPPORT - - if (RTMP_MATPktRxNeedConvert( - pAd, RtmpOsPktNetDevGet(pRxPkt))) { -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if ((wf_drv_tbl.wf_fwd_needed_hook != NULL) && - (wf_drv_tbl.wf_fwd_needed_hook() == TRUE)) { - BOOLEAN need_drop = FALSE; - - ApCliLinkCoverRxPolicy(pAd, pPacket, - &need_drop); - - if (need_drop == TRUE) { - MEM_DBG_PKT_ALLOC_INC(pPacket); - RELEASE_NDIS_PACKET( - pAd, pRxPkt, - NDIS_STATUS_FAILURE); - return; - } - } - -#endif /* CONFIG_WIFI_PKT_FWD */ - RTMP_MATEngineRxHandle(pAd, pRxPkt, 0); - } - -#endif /* MAT_SUPPORT */ - } - -#endif /* APCLI_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef APCLI_AS_WDS_STA_SUPPORT - } -#endif /*APCLI_AS_WDS_STA_SUPPORT*/ - /* Push up the protocol stack */ -#ifdef CONFIG_AP_SUPPORT -#if defined(PLATFORM_BL2348) || defined(PLATFORM_BL23570) - { - extern int (*pToUpperLayerPktSent)(PNDIS_PACKET * pSkb); - - RtmpOsPktProtocolAssign(pRxPkt); - pToUpperLayerPktSent(pRxPkt); - return; - } -#endif /* defined(PLATFORM_BL2348) || defined(PLATFORM_BL23570) */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef IKANOS_VX_1X0 - { - IKANOS_DataFrameRx(pAd, pRxPkt); - return; - } -#endif /* IKANOS_VX_1X0 */ -#ifdef INF_PPA_SUPPORT - { - if (ppa_hook_directpath_send_fn && (pAd->PPAEnable == TRUE)) { - INT retVal, ret = 0; - UINT ppa_flags = 0; - - retVal = process_nbns_packet(pAd, pRxPkt); - - if (retVal > 0) { - ret = ppa_hook_directpath_send_fn(pAd->g_if_id, - pRxPkt, - pRxPkt->len, - ppa_flags); - - if (ret == 0) { - pRxPkt = NULL; - return; - } - - RtmpOsPktRcvHandle(pRxPkt); - } else if (retVal == 0) { - RtmpOsPktProtocolAssign(pRxPkt); - RtmpOsPktRcvHandle(pRxPkt); - } else { - dev_kfree_skb_any(pRxPkt); - } - } else { - RtmpOsPktProtocolAssign(pRxPkt); - RtmpOsPktRcvHandle(pRxPkt); - } - - return; - } -#endif /* INF_PPA_SUPPORT */ - { -#ifdef CONFIG_RT2880_BRIDGING_ONLY - PACKET_CB_ASSIGN(pRxPkt, 22) = 0xa8; -#endif -#if defined(CONFIG_RA_CLASSIFIER) || defined(CONFIG_RA_CLASSIFIER_MODULE) - - if (ra_classifier_hook_rx != NULL) { - ra_classifier_hook_rx(pRxPkt, classifier_cur_cycle); - } - -#endif /* CONFIG_RA_CLASSIFIER */ - -#ifdef DYNAMIC_VLAN_SUPPORT - { - USHORT Wcid = RTMP_GET_PACKET_WCID(pPacket); - if (VALID_UCAST_ENTRY_WCID(pAd, Wcid)) { - MAC_TABLE_ENTRY *pMacEntry = - &pAd->MacTab.Content[Wcid]; - if (pMacEntry->vlan_id) { - UCHAR VLAN_Size = LENGTH_802_1Q; - UCHAR *data_p; - UINT16 TCI; - UCHAR TPID[] = { - 0x81, 0x00 - }; /* VLAN related */ - UINT16 TypeLen; - data_p = GET_OS_PKT_DATAPTR(pRxPkt); - TypeLen = - (data_p[12] << 8) | data_p[13]; - if (TypeLen != ETH_TYPE_EAPOL) { - memmove((GET_OS_PKT_DATAPTR( - pRxPkt)) - - 4, - (GET_OS_PKT_DATAPTR( - pRxPkt)), - 12); - data_p = skb_push(pRxPkt, - VLAN_Size); - /* make up TCI field keeping vlan priority to 0 currently*/ - - TCI = (pMacEntry->vlan_id & - 0x0fff) | - ((0 & 0x7) << 13); - -#ifndef RT_BIG_ENDIAN - TCI = SWAP16(TCI); -#endif /* RT_BIG_ENDIAN */ - *(UINT16 *)(data_p + - LENGTH_802_3_NO_TYPE) = - *(UINT16 *)TPID; - *(UINT16 *)(data_p + - LENGTH_802_3_NO_TYPE + - 2) = TCI; - } - } - } - } -#endif - -#ifdef CONFIG_FAST_NAT_SUPPORT - /* bruce+ - * ra_sw_nat_hook_rx return 1 --> continue - * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx - */ - if (ra_sw_nat_hook_rx != NULL) { - RtmpOsPktProtocolAssign(pRxPkt); - RtmpOsPktNatMagicTag(pRxPkt); - - if (ra_sw_nat_hook_rx(pRxPkt)) - RtmpOsPktRcvHandle(pRxPkt); - - return; - } -#endif /* CONFIG_FAST_NAT_SUPPORT */ - } -#ifdef CONFIG_AP_SUPPORT -#ifdef BG_FT_SUPPORT - - if (BG_FTPH_PacketFromApHandle(pRxPkt) == 0) - return; - -#endif /* BG_FT_SUPPORT */ -#endif /* CONFIG_AP_SUPPORT */ -#ifdef TRACELOG_TCP_PKT - - if (RTMPIsTcpAckPkt(pRxPkt)) - pAd->u4TcpRxAckCnt++; - -#endif -#ifdef REDUCE_TCP_ACK_SUPPORT - ReduceAckUpdateDataCnx(pAd, pRxPkt); -#endif -#ifdef RTMP_UDMA_SUPPORT - if (mt_udma_pkt_send(pAd, pRxPkt) == 0) - return; -#endif /*RTMP_UDMA_SUPPORT*/ - RtmpOsPktProtocolAssign(pRxPkt); - -#if defined(BB_SOC) && defined(BB_RA_HWNAT_WIFI) - - if (ra_sw_nat_hook_set_magic) - ra_sw_nat_hook_set_magic(pRxPkt, FOE_MAGIC_WLAN); - - if (ra_sw_nat_hook_rx != NULL) { - if (ra_sw_nat_hook_rx(pRxPkt) == 0) - return; - } - -#endif -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if ((wf_drv_tbl.wf_fwd_needed_hook != NULL) && - (wf_drv_tbl.wf_fwd_needed_hook() == TRUE)) { - struct sk_buff *pOsRxPkt = RTPKT_TO_OSPKT(pRxPkt); - - if (RTMP_IS_PACKET_AP_APCLI(pOsRxPkt)) { - if (wf_drv_tbl.wf_fwd_rx_hook != NULL) { - struct ethhdr *mh = eth_hdr(pRxPkt); - int ret = 0; - - if ((mh->h_dest[0] & 0x1) == 0x1) { - if (RTMP_IS_PACKET_APCLI(pOsRxPkt)) { -#ifdef MAC_REPEATER_SUPPORT - - if ((pAd->ApCfg.bMACRepeaterEn == - TRUE) && - (RTMPQueryLookupRepeaterCliEntryMT( - pAd, mh->h_source, - TRUE) == TRUE)) { - /*MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("announce_802_3_packet: drop rx pkt by RTMPQueryLookupRepeaterCliEntryMT check\n"));*/ - MEM_DBG_PKT_ALLOC_INC( - pRxPkt); - RELEASE_NDIS_PACKET( - pAd, pRxPkt, - NDIS_STATUS_FAILURE); - return; - } -#endif /* MAC_REPEATER_SUPPORT */ - { - VOID *opp_band_tbl = - NULL; - VOID *band_tbl = NULL; - VOID *other_band_tbl = - NULL; - - if (wf_drv_tbl - .wf_fwd_feedback_map_table) - wf_drv_tbl.wf_fwd_feedback_map_table( - pAd, - &band_tbl, - &opp_band_tbl, - &other_band_tbl); - - if (band_tbl != NULL) { - if (MAC_ADDR_EQUAL( - ((UCHAR *)((REPEATER_ADAPTER_DATA_TABLE - *) - band_tbl) - ->Wdev_ifAddr), - mh->h_source) || - ((((REPEATER_ADAPTER_DATA_TABLE - *) - band_tbl) - ->Wdev_ifAddr_DBDC != - NULL) && - MAC_ADDR_EQUAL( - ((UCHAR *)((REPEATER_ADAPTER_DATA_TABLE - *) - band_tbl) - ->Wdev_ifAddr_DBDC), - mh->h_source))) { - /*MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("announce_802_3_packet: drop rx pkt by wf_fwd_feedback_map_table band_tbl check of source addr against Wdev_ifAddr\n"));*/ - MEM_DBG_PKT_ALLOC_INC( - pRxPkt); - RELEASE_NDIS_PACKET( - pAd, - pRxPkt, - NDIS_STATUS_FAILURE); - return; - } - } - - if (opp_band_tbl != - NULL) { - if ((MAC_ADDR_EQUAL( - ((UCHAR *)((REPEATER_ADAPTER_DATA_TABLE - *) - opp_band_tbl) - ->Wdev_ifAddr), - mh->h_source)) || - ((((REPEATER_ADAPTER_DATA_TABLE - *) - opp_band_tbl) - ->Wdev_ifAddr_DBDC != - NULL) && - (MAC_ADDR_EQUAL( - ((UCHAR *)((REPEATER_ADAPTER_DATA_TABLE - *) - opp_band_tbl) - ->Wdev_ifAddr_DBDC), - mh->h_source)))) { - /*MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - * ("announce_802_3_packet: drop rx pkt by wf_fwd_feedback_map_table opp_band_tbl check of source addr against Wdev_ifAddr\n")); */ - MEM_DBG_PKT_ALLOC_INC( - pRxPkt); - RELEASE_NDIS_PACKET( - pAd, - pRxPkt, - NDIS_STATUS_FAILURE); - return; - } - } - - if (other_band_tbl != - NULL) { - if ((MAC_ADDR_EQUAL( - ((UCHAR *)((REPEATER_ADAPTER_DATA_TABLE - *) - other_band_tbl) - ->Wdev_ifAddr), - mh->h_source)) || - ((((REPEATER_ADAPTER_DATA_TABLE - *) - other_band_tbl) - ->Wdev_ifAddr_DBDC != - NULL) && - (MAC_ADDR_EQUAL( - ((UCHAR *)((REPEATER_ADAPTER_DATA_TABLE - *) - other_band_tbl) - ->Wdev_ifAddr_DBDC), - mh->h_source)))) { - /*MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("announce_802_3_packet: drop rx pkt by wf_fwd_feedback_map_table other_band_tbl check of source addr against Wdev_ifAddr\n"));*/ - MEM_DBG_PKT_ALLOC_INC( - pRxPkt); - RELEASE_NDIS_PACKET( - pAd, - pRxPkt, - NDIS_STATUS_FAILURE); - return; - } - } - } - } - } - - ret = wf_drv_tbl.wf_fwd_rx_hook(pRxPkt); - - if (ret == 0) { - /*MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("announce_802_3_packet: wf_fwd_rx_hook returned 0\n"));*/ - return; - } else if (ret == 2) { - /*MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - ("announce_802_3_packet: wf_fwd_rx_hook returned 2\n"));*/ - MEM_DBG_PKT_ALLOC_INC(pRxPkt); - RELEASE_NDIS_PACKET( - pAd, pRxPkt, - NDIS_STATUS_FAILURE); - return; - } - } - } else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("No CB Packet RTMP_IS_PACKET_AP_APCLI(%d)\n", - RTMP_IS_PACKET_AP_APCLI(pOsRxPkt))); - } - -#endif /* CONFIG_WIFI_PKT_FWD */ - RtmpOsPktRcvHandle(pRxPkt); -} - -#ifdef SNIFFER_SUPPORT -INT Monitor_VirtualIF_Open(PNET_DEV dev_p) -{ - VOID *pAd; - - pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); - ASSERT(pAd); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: ===> %s\n", __func__, - RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); - - if (VIRTUAL_IF_INIT(pAd, dev_p) != 0) - return -1; - - if (VIRTUAL_IF_UP(pAd, dev_p) != 0) - return -1; - - /* increase MODULE use count */ - RT_MOD_INC_USE_COUNT(); - RT_MOD_HNAT_REG(dev_p); - RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_SNIFF_OPEN, 0, dev_p, - 0); - /* Monitor_Open(pAd,dev_p); */ - return 0; -} - -INT Monitor_VirtualIF_Close(PNET_DEV dev_p) -{ - VOID *pAd; - - pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p); - ASSERT(pAd); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: ===> %s\n", __func__, - RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); - - RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_SNIFF_CLOSE, 0, dev_p, - 0); - /* Monitor_Close(pAd,dev_p); */ - VIRTUAL_IF_DOWN(pAd, dev_p); - - VIRTUAL_IF_DEINIT(pAd, dev_p); - - RT_MOD_HNAT_DEREG(dev_p); - RT_MOD_DEC_USE_COUNT(); - return 0; -} - -VOID RT28xx_Monitor_Init(VOID *pAd, PNET_DEV main_dev_p) -{ - RTMP_OS_NETDEV_OP_HOOK netDevOpHook; - /* init operation functions */ - NdisZeroMemory(&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); - netDevOpHook.open = Monitor_VirtualIF_Open; - netDevOpHook.stop = Monitor_VirtualIF_Close; - netDevOpHook.xmit = rt28xx_send_packets; - netDevOpHook.ioctl = rt28xx_ioctl; - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: %d !!!!####!!!!!!\n", __func__, __LINE__)); - RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_SNIFF_INIT, 0, - &netDevOpHook, 0); -} -VOID RT28xx_Monitor_Remove(VOID *pAd) -{ - RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_SNIFF_REMOVE, 0, NULL, - 0); -} - -void STA_MonPktSend(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR DevIdx) -{ - PNET_DEV pNetDev; - PNDIS_PACKET pRxPacket; - UCHAR *dot11_fc_field; - USHORT DataSize; - CHAR MaxRssi, RSSI1; - UINT32 timestamp = 0; - CHAR RssiForRadiotap = 0; - UCHAR L2PAD, PHYMODE, BW, ShortGI, MCS, LDPC, LDPC_EX_SYM, AMPDU, STBC; - UCHAR BssMonitorFlag11n, Channel, CentralChannel = 0; - UCHAR *pData, *pDevName; - UCHAR sniffer_type = pAd->sniffer_ctl.sniffer_type; - UCHAR sideband_index = 0; - struct wifi_dev *wdev = pAd->wdev_list[DevIdx]; - UINT32 UP_value = 0; -#ifdef SNIFFER_MT7615 - UINT32 value = 0; - UCHAR gid = 0; -#endif - ASSERT(pRxBlk->pRxPacket); - - if (pRxBlk->DataSize < 10) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Size is too small! (%d)\n", __func__, - pRxBlk->DataSize)); - goto err_free_sk_buff; - } - - if (sniffer_type == RADIOTAP_TYPE) { - if (pRxBlk->DataSize + sizeof(struct mtk_radiotap_header) > - pAd->monitor_ctrl[DevIdx].FilterSize) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Size is too large! (%ld)\n", __func__, - pRxBlk->DataSize + - sizeof(struct mtk_radiotap_header))); - goto err_free_sk_buff; - } - } - - if (sniffer_type == PRISM_TYPE) { - if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > - RX_BUFFER_AGGRESIZE) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s : Size is too large! (%ld)\n", __func__, - pRxBlk->DataSize + - sizeof(wlan_ng_prism2_header))); - goto err_free_sk_buff; - } - } - - MaxRssi = RTMPMaxRssi( - pAd, - ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&pRxBlk->rx_signal.raw_rssi[0]), - RSSI_IDX_0), - ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&pRxBlk->rx_signal.raw_rssi[0]), - RSSI_IDX_1), - ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&pRxBlk->rx_signal.raw_rssi[0]), - RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&pRxBlk->rx_signal.raw_rssi[0]), - RSSI_IDX_3) -#endif - - ); - - if (sniffer_type == RADIOTAP_TYPE) { - RssiForRadiotap = RTMPMaxRssi( - pAd, - ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&pRxBlk->rx_signal - .raw_rssi[0]), - RSSI_IDX_0), - ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&pRxBlk->rx_signal - .raw_rssi[0]), - RSSI_IDX_1), - ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&pRxBlk->rx_signal - .raw_rssi[0]), - RSSI_IDX_2) -#if defined(CUSTOMER_DCC_FEATURE) || defined(CONFIG_MAP_SUPPORT) - , - ConvertToRssi( - pAd, - (struct raw_rssi_info *)(&pRxBlk->rx_signal - .raw_rssi[0]), - RSSI_IDX_3) -#endif - ); - } - -#ifdef SNIFFER_MT7615 - pNetDev = get_netdev_from_bssid(pAd, BSS0); -#else - pNetDev = - pAd->monitor_ctrl[DevIdx].wdev.if_dev; /* send packet to mon0 */ -#endif - pRxPacket = pRxBlk->pRxPacket; - dot11_fc_field = pRxBlk->FC; - pData = pRxBlk->pData; - DataSize = pRxBlk->DataSize; - L2PAD = pRxBlk->pRxInfo->L2PAD; - PHYMODE = pRxBlk->rx_rate.field.MODE; - BW = pRxBlk->rx_rate.field.BW; - ShortGI = pRxBlk->rx_rate.field.ShortGI; - MCS = pRxBlk->rx_rate.field.MCS; - LDPC = pRxBlk->rx_rate.field.ldpc; - - if (IS_HIF_TYPE(pAd, HIF_RLT)) - LDPC_EX_SYM = pRxBlk->ldpc_ex_sym; - else - LDPC_EX_SYM = 0; - - AMPDU = pRxBlk->pRxInfo->AMPDU; - STBC = pRxBlk->rx_rate.field.STBC; - RSSI1 = pRxBlk->rx_signal.raw_rssi[1]; - /* if(pRxBlk->pRxWI->RXWI_N.bbp_rxinfo[12] != 0) */ -#ifdef MT_MAC - - if (IS_HIF_TYPE(pAd, HIF_MT)) - timestamp = pRxBlk->TimeStamp; - -#endif - BssMonitorFlag11n = 0; -#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT - BssMonitorFlag11n = - (pAd->StaCfg[0].BssMonitorFlag & MONITOR_FLAG_11N_SNIFFER); -#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */ - pDevName = (UCHAR *)RtmpOsGetNetDevName(pAd->net_dev); - Channel = pAd->ApCfg.MBSSID[wdev->wdev_idx].wdev.channel; - - if (BW == BW_20) - CentralChannel = Channel; - else if (BW == BW_40) - CentralChannel = wlan_operate_get_cen_ch_1(wdev); - -#ifdef DOT11_VHT_AC -#ifdef SNIFFER_MT7615 - else if (BW == BW_80 || BW == BW_160) -#else - else if (BW == BW_80) -#endif /* SNIFFER_MT7615 */ - CentralChannel = wlan_operate_get_cen_ch_1(wdev); - -#endif /* DOT11_VHT_AC */ -#ifdef DOT11_VHT_AC - - if (BW == BW_80) - sideband_index = - vht_prim_ch_idx(CentralChannel, Channel, RF_BW_80); - -#ifdef SNIFFER_MT7615 - else if (BW == BW_160) - sideband_index = - vht_prim_ch_idx(CentralChannel, Channel, RF_BW_160); - -#endif /* SNIFFER_MT7615 */ -#endif /* DOT11_VHT_AC */ - - if (sniffer_type == RADIOTAP_TYPE) { -#ifdef SNIFFER_MT7615 - - if (IS_MT7615(pAd)) { - gid = ((pRxBlk->rmac_info[46] >> 5) & 0x7) | - ((pRxBlk->rmac_info[47] & 0x7) << 3); - - if (gid < 16) - PHY_IO_READ32(pAd, 0x1025c, &value); - else if (gid < 32) - PHY_IO_READ32(pAd, 0x10260, &value); - else if (gid < 48) - PHY_IO_READ32(pAd, 0x10264, &value); - else - PHY_IO_READ32(pAd, 0x10268, &value); - - UP_value = (value >> (2 * (gid % 16))) & 0x00000003; - send_radiotap_mt7615_monitor_packets( - pNetDev, pRxBlk->rmac_info, pRxBlk->rxv2_cyc1, - pRxPacket, pData, DataSize, pDevName, - RssiForRadiotap, UP_value); - } else -#endif - send_radiotap_monitor_packets( - pNetDev, pRxBlk->AmsduState, pRxBlk->rmac_info, - pRxPacket, (void *)dot11_fc_field, pData, - DataSize, L2PAD, PHYMODE, BW, ShortGI, MCS, - LDPC, LDPC_EX_SYM, AMPDU, STBC, RSSI1, pDevName, - Channel, CentralChannel, sideband_index, - RssiForRadiotap, timestamp, UP_value); - } - - if (sniffer_type == PRISM_TYPE) { - send_prism_monitor_packets(pNetDev, pRxPacket, - (void *)dot11_fc_field, pData, - DataSize, L2PAD, PHYMODE, BW, - ShortGI, MCS, AMPDU, STBC, RSSI1, - BssMonitorFlag11n, pDevName, Channel, - CentralChannel, MaxRssi); - } - - return; -err_free_sk_buff: - RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); -} -#endif /* SNIFFER_SUPPORT */ - -VOID RTMPFreeGlobalUtility(VOID) -{ - /*do nothing for now*/ -} - -VOID RTMPFreeAdapter(VOID *pAdSrc) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - POS_COOKIE os_cookie; - struct _PCI_HIF_T *hif; - -#ifdef MULTI_INF_SUPPORT - multi_inf_adapt_unreg((VOID *)pAd); -#endif /* MULTI_INF_SUPPORT */ - - hif = hc_get_hif_ctrl(pAd->hdev_ctrl); - os_cookie = (POS_COOKIE)pAd->OS_Cookie; -#ifdef RLM_CAL_CACHE_SUPPORT - rlmCalCacheDeinit(&pAd->rlmCalCache); -#endif /* RLM_CAL_CACHE_SUPPORT */ -#ifdef MULTIPLE_CARD_SUPPORT -#ifdef RTMP_FLASH_SUPPORT - - /* only if in MULTIPLE_CARD the eebuf be allocated not static */ - if (pAd->eebuf /*&& (pAd->eebuf != pAd->chipCap.EEPROM_DEFAULT_BIN)*/) { - os_free_mem(pAd->eebuf); - pAd->eebuf = NULL; - } - -#endif /* RTMP_FLASH_SUPPORT */ -#endif /* MULTIPLE_CARD_SUPPORT */ - NdisFreeSpinLock(&hif->MgmtRingLock); -#ifdef RTMP_MAC_PCI - NdisFreeSpinLock(&hif->TxBmcRingLock); - NdisFreeSpinLock(&pAd->McuCmdLock); -#endif /* RTMP_MAC_PCI */ -#ifdef CONFIG_AP_SUPPORT -#ifdef APCLI_SUPPORT -#ifdef MAC_REPEATER_SUPPORT - - if (pAd->ApCfg.bMACRepeaterEn == TRUE) - AsicSetReptFuncEnable(pAd, FALSE); - - NdisFreeSpinLock(&pAd->ApCfg.CliLinkMapLock); - NdisFreeSpinLock(&pAd->ApCfg.ReptCliEntryLock); -#endif -#endif -#endif -#ifdef CONFIG_FWOWN_SUPPORT - NdisFreeSpinLock(&pAd->DriverOwnLock); -#endif /* CONFIG_FWOWN_SUPPORT */ - NdisFreeSpinLock(&pAd->BssInfoIdxBitMapLock); - NdisFreeSpinLock(&pAd->WdevListLock); - NdisFreeSpinLock(&pAd->irq_lock); -#ifdef MT_MAC - NdisFreeSpinLock(&hif->BcnRingLock); -#endif /* MT_MAC */ -#ifdef RTMP_MAC_PCI - NdisFreeSpinLock(&pAd->LockInterrupt); -#ifdef CONFIG_ANDES_SUPPORT - NdisFreeSpinLock(&hif->CtrlRingLock); -#ifdef MT7615 - NdisFreeSpinLock(&hif->FwDwloRing.RingLock); -#endif /* MT7615 */ -#endif - NdisFreeSpinLock(&pAd->tssi_lock); -#endif /* RTMP_MAC_PCI */ -#ifdef UAPSD_SUPPORT - NdisFreeSpinLock(&pAd->UAPSDEOSPLock); /* OS_ABL_SUPPORT */ -#endif /* UAPSD_SUPPORT */ -#ifdef DOT11_N_SUPPORT - NdisFreeSpinLock(&pAd->mpdu_blk_pool.lock); -#endif /* DOT11_N_SUPPORT */ -#ifdef GREENAP_SUPPORT - NdisFreeSpinLock(&pAd->ApCfg.greenap.lock); -#endif /* GREENAP_SUPPORT */ - - if (pAd->iw_stats) { - os_free_mem(pAd->iw_stats); - pAd->iw_stats = NULL; - } - - if (pAd->stats) { - os_free_mem(pAd->stats); - pAd->stats = NULL; - } - -#ifdef MT_MAC -#ifdef CONFIG_AP_SUPPORT - - if ((IS_HIF_TYPE(pAd, HIF_MT)) && (pAd->OpMode == OPMODE_AP)) { - BSS_STRUCT *pMbss; - - pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; - ASSERT(pMbss); - - if (pMbss) - bcn_buf_deinit(pAd, &pMbss->wdev.bcn_buf); - else { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():func_dev is NULL!\n", __func__)); - return; - } - } - -#endif -#endif -#ifdef CONFIG_ATE -#endif /* CONFIG_ATE */ - RTMP_OS_FREE_TIMER(pAd); - RTMP_OS_FREE_LOCK(pAd); - RTMP_OS_FREE_TASKLET(pAd); - RTMP_OS_FREE_TASK(pAd); - RTMP_OS_FREE_SEM(pAd); - RTMP_OS_FREE_ATOMIC(pAd); - RTMPFreeHifAdapterBlock(pAd); - /*remove chipcap*/ - hdev_ctrl_exit(pAd); - RtmpOsVfree( - pAd); /* pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); */ - - if (os_cookie) - os_free_mem(os_cookie); - - RTMPFreeGlobalUtility(); -} - -int RTMPSendPackets(IN NDIS_HANDLE dev_hnd, IN PPNDIS_PACKET pkt_list, - IN UINT pkt_cnt, IN UINT32 pkt_total_len, - IN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func) -{ - struct wifi_dev *wdev = (struct wifi_dev *)dev_hnd; - RTMP_ADAPTER *pAd; - PNDIS_PACKET pPacket = pkt_list[0]; - - if (!wdev->sys_handle) { - ASSERT(wdev->sys_handle); - return 0; - } - - pAd = (RTMP_ADAPTER *)wdev->sys_handle; - INC_COUNTER64(pAd->WlanCounters[0].TransmitCountFrmOs); - - if (!pPacket) - return 0; - - if (pkt_total_len < 14) { - hex_dump("bad packet", GET_OS_PKT_DATAPTR(pPacket), - pkt_total_len); - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); - return 0; - } - -#ifdef CONFIG_ATE - - /* TODO: shiang-usw, can remove this? */ - if (ATE_ON(pAd)) { - RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); - return 0; - } - -#endif /* CONFIG_ATE */ -#ifdef CONFIG_5VT_ENHANCE - RTMP_SET_PACKET_5VT(pPacket, 0); - - if (*(int *)(GET_OS_PKT_CB(pPacket)) == BRIDGE_TAG) - RTMP_SET_PACKET_5VT(pPacket, 1); - -#endif /* CONFIG_5VT_ENHANCE */ - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - - if ((wf_drv_tbl.wf_fwd_needed_hook != NULL) && - (wf_drv_tbl.wf_fwd_needed_hook() == TRUE)) { - if (wf_drv_tbl.wf_fwd_tx_hook != NULL) { - if (wf_drv_tbl.wf_fwd_tx_hook(pPacket) == 1) { - //MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, - // ("RTMPSendPackets: wdev_idx=0x%x, wdev_type=0x%x, func_idx=0x%x : wf_fwd_tx_hook indicated Packet DROP\n", - // wdev->wdev_idx,wdev->wdev_type,wdev->func_idx)); - RELEASE_NDIS_PACKET(pAd, pPacket, - NDIS_STATUS_FAILURE); - return 0; - } - } - } - -#endif /* CONFIG_WIFI_PKT_FWD */ - skb_orphan(pPacket); - return wdev_tx_pkts((NDIS_HANDLE)pAd, (PPNDIS_PACKET)&pPacket, 1, wdev); -} - -#ifdef CONFIG_AP_SUPPORT -/* - * ======================================================================== - * Routine Description: - * Driver pre-Ioctl for AP. - * - * Arguments: - * pAdSrc - WLAN control block pointer - * pCB - the IOCTL parameters - * - * Return Value: - * NDIS_STATUS_SUCCESS - IOCTL OK - * Otherwise - IOCTL fail - * ======================================================================== - */ -INT RTMP_AP_IoctlPrepare(RTMP_ADAPTER *pAd, VOID *pCB) -{ - RT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pCB; - POS_COOKIE pObj; - USHORT index; - INT Status = NDIS_STATUS_SUCCESS; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - - if ((pConfig->priv_flags == INT_MAIN) && - !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_REGISTER_TO_OS)) { - if (pConfig->pCmdData == NULL) - return Status; - - if (RtPrivIoctlSetVal() == pConfig->CmdId_RTPRIV_IOCTL_SET) { - if (TRUE -#ifdef CONFIG_APSTA_MIXED_SUPPORT - && (strstr(pConfig->pCmdData, "OpMode") == NULL) -#endif /* CONFIG_APSTA_MIXED_SUPPORT */ - ) - return -ENETDOWN; - } else - return -ENETDOWN; - } - - pObj->pSecConfig = NULL; - - /* determine this ioctl command is comming from which interface. */ - if (pConfig->priv_flags == INT_MAIN) { - pObj->ioctl_if_type = INT_MAIN; - pObj->ioctl_if = MAIN_MBSSID; - pObj->pSecConfig = - &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.SecConfig; - } else if (pConfig->priv_flags == INT_MBSSID) { - pObj->ioctl_if_type = INT_MBSSID; - - /* if (!RTMPEqualMemory(net_dev->name, pAd->net_dev->name, 3)) // for multi-physical card, no MBSSID */ - if (strcmp(pConfig->name, RtmpOsGetNetDevName(pAd->net_dev)) != - 0) { /* sample */ - for (index = 1; index < pAd->ApCfg.BssidNum; index++) { - if (pAd->ApCfg.MBSSID[index].wdev.if_dev == - pConfig->net_dev) { - pObj->ioctl_if = index; - pObj->pSecConfig = - &pAd->ApCfg - .MBSSID[pObj->ioctl_if] - .wdev.SecConfig; - break; - } - } - - /* Interface not found! */ - if (index == pAd->ApCfg.BssidNum) - return -ENETDOWN; - } else /* ioctl command from I/F(ra0) */ - pObj->ioctl_if = MAIN_MBSSID; - - MBSS_MR_APIDX_SANITY_CHECK(pAd, pObj->ioctl_if); - } -#ifdef WDS_SUPPORT - else if (pConfig->priv_flags == INT_WDS) { - pObj->ioctl_if_type = INT_WDS; - - for (index = 0; index < MAX_WDS_ENTRY; index++) { - if (pAd->WdsTab.WdsEntry[index].wdev.if_dev == - pConfig->net_dev) { - pObj->ioctl_if = index; - pObj->pSecConfig = &pAd->WdsTab.WdsEntry[index] - .wdev.SecConfig; - break; - } - - if (index == MAX_WDS_ENTRY) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): can not find wds I/F\n", - __func__)); - return -ENETDOWN; - } - } - } -#endif /* WDS_SUPPORT */ -#ifdef APCLI_SUPPORT - else if (pConfig->priv_flags == INT_APCLI) { - pObj->ioctl_if_type = INT_APCLI; - - for (index = 0; index < MAX_APCLI_NUM; index++) { - if (pAd->ApCfg.ApCliTab[index].wdev.if_dev == - pConfig->net_dev) { - pObj->ioctl_if = index; - pObj->pSecConfig = &pAd->ApCfg.ApCliTab[index] - .wdev.SecConfig; - break; - } - - if (index == MAX_APCLI_NUM) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s(): can not find Apcli I/F\n", - __func__)); - return -ENETDOWN; - } - } - - APCLI_MR_APIDX_SANITY_CHECK(pObj->ioctl_if); - } -#endif /* APCLI_SUPPORT */ - else { - /* MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("IOCTL is not supported in WDS interface\n")); */ - return -EOPNOTSUPP; - } - - pConfig->apidx = pObj->ioctl_if; - return Status; -} - -VOID AP_E2PROM_IOCTL_PostCtrl(IN RTMP_IOCTL_INPUT_STRUCT *wrq, - IN RTMP_STRING *msg) -{ - wrq->u.data.length = strlen(msg); - - if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length)) - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s: copy_to_user() fail\n", __func__)); -} - -VOID IAPP_L2_UpdatePostCtrl(RTMP_ADAPTER *pAd, UINT8 *mac_p, INT wdev_idx) -{ -} -#endif /* CONFIG_AP_SUPPORT */ - -#ifdef WDS_SUPPORT -VOID AP_WDS_KeyNameMakeUp(IN RTMP_STRING *pKey, IN UINT32 KeyMaxSize, - IN INT KeyId) -{ - snprintf(pKey, KeyMaxSize, "Wds%dKey", KeyId); -} -#endif /* WDS_SUPPORT */ -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) - -/* - *Invoked from WIFI forward module to register function pointers. - */ -VOID wifi_fwd_register(struct wifi_fwd_func_table *table) -{ - wf_drv_tbl.wf_fwd_tx_hook = table->wf_fwd_tx_hook; - wf_drv_tbl.wf_fwd_rx_hook = table->wf_fwd_rx_hook; - wf_drv_tbl.wf_fwd_entry_insert_hook = table->wf_fwd_entry_insert_hook; - wf_drv_tbl.wf_fwd_entry_delete_hook = table->wf_fwd_entry_delete_hook; - wf_drv_tbl.wf_fwd_set_cb_num = table->wf_fwd_set_cb_num; - wf_drv_tbl.wf_fwd_set_debug_level_hook = - table->wf_fwd_set_debug_level_hook; - wf_drv_tbl.wf_fwd_check_active_hook = table->wf_fwd_check_active_hook; - wf_drv_tbl.wf_fwd_get_rep_hook = table->wf_fwd_get_rep_hook; - wf_drv_tbl.wf_fwd_pro_active_hook = table->wf_fwd_pro_active_hook; - wf_drv_tbl.wf_fwd_pro_halt_hook = table->wf_fwd_pro_halt_hook; - wf_drv_tbl.wf_fwd_pro_enabled_hook = table->wf_fwd_pro_enabled_hook; - wf_drv_tbl.wf_fwd_pro_disabled_hook = table->wf_fwd_pro_disabled_hook; - wf_drv_tbl.wf_fwd_access_schedule_active_hook = - table->wf_fwd_access_schedule_active_hook; - wf_drv_tbl.wf_fwd_access_schedule_halt_hook = - table->wf_fwd_access_schedule_halt_hook; - wf_drv_tbl.wf_fwd_hijack_active_hook = table->wf_fwd_hijack_active_hook; - wf_drv_tbl.wf_fwd_hijack_halt_hook = table->wf_fwd_hijack_halt_hook; - wf_drv_tbl.wf_fwd_bpdu_active_hook = table->wf_fwd_bpdu_active_hook; - wf_drv_tbl.wf_fwd_bpdu_halt_hook = table->wf_fwd_bpdu_halt_hook; - wf_drv_tbl.wf_fwd_show_entry_hook = table->wf_fwd_show_entry_hook; - wf_drv_tbl.wf_fwd_needed_hook = table->wf_fwd_needed_hook; - wf_drv_tbl.wf_fwd_delete_entry_hook = table->wf_fwd_delete_entry_hook; - wf_drv_tbl.packet_source_show_entry_hook = - table->packet_source_show_entry_hook; - wf_drv_tbl.packet_source_delete_entry_hook = - table->packet_source_delete_entry_hook; - wf_drv_tbl.wf_fwd_feedback_map_table = table->wf_fwd_feedback_map_table; - wf_drv_tbl.wf_fwd_probe_adapter = table->wf_fwd_probe_adapter; - wf_drv_tbl.wf_fwd_insert_bridge_mapping_hook = - table->wf_fwd_insert_bridge_mapping_hook; - wf_drv_tbl.wf_fwd_insert_repeater_mapping_hook = - table->wf_fwd_insert_repeater_mapping_hook; - wf_drv_tbl.wf_fwd_search_mapping_table_hook = - table->wf_fwd_search_mapping_table_hook; - wf_drv_tbl.wf_fwd_delete_entry_inform_hook = - table->wf_fwd_delete_entry_inform_hook; - wf_drv_tbl.wf_fwd_check_device_hook = table->wf_fwd_check_device_hook; - wf_drv_tbl.wf_fwd_add_entry_inform_hook = - table->wf_fwd_add_entry_inform_hook; - wf_drv_tbl.wf_fwd_set_easy_setup_mode = - table->wf_fwd_set_easy_setup_mode; - wf_drv_tbl.wf_fwd_set_bridge_hook = table->wf_fwd_set_bridge_hook; -} -/* - *Invoked from WIFI forward module to unregister function pointers. - */ -VOID wifi_fwd_unregister(VOID) -{ - wf_drv_tbl.wf_fwd_tx_hook = NULL; - wf_drv_tbl.wf_fwd_rx_hook = NULL; - wf_drv_tbl.wf_fwd_entry_insert_hook = NULL; - wf_drv_tbl.wf_fwd_entry_delete_hook = NULL; - wf_drv_tbl.wf_fwd_set_cb_num = NULL; - wf_drv_tbl.wf_fwd_set_debug_level_hook = NULL; - wf_drv_tbl.wf_fwd_check_active_hook = NULL; - wf_drv_tbl.wf_fwd_get_rep_hook = NULL; - wf_drv_tbl.wf_fwd_pro_active_hook = NULL; - wf_drv_tbl.wf_fwd_pro_halt_hook = NULL; - wf_drv_tbl.wf_fwd_pro_enabled_hook = NULL; - wf_drv_tbl.wf_fwd_pro_disabled_hook = NULL; - wf_drv_tbl.wf_fwd_access_schedule_active_hook = NULL; - wf_drv_tbl.wf_fwd_access_schedule_halt_hook = NULL; - wf_drv_tbl.wf_fwd_hijack_active_hook = NULL; - wf_drv_tbl.wf_fwd_hijack_halt_hook = NULL; - wf_drv_tbl.wf_fwd_bpdu_active_hook = NULL; - wf_drv_tbl.wf_fwd_bpdu_halt_hook = NULL; - wf_drv_tbl.wf_fwd_show_entry_hook = NULL; - wf_drv_tbl.wf_fwd_needed_hook = NULL; - wf_drv_tbl.wf_fwd_delete_entry_hook = NULL; - wf_drv_tbl.packet_source_show_entry_hook = NULL; - wf_drv_tbl.packet_source_delete_entry_hook = NULL; - wf_drv_tbl.wf_fwd_feedback_map_table = NULL; - wf_drv_tbl.wf_fwd_probe_adapter = NULL; - wf_drv_tbl.wf_fwd_insert_bridge_mapping_hook = NULL; - wf_drv_tbl.wf_fwd_insert_repeater_mapping_hook = NULL; - wf_drv_tbl.wf_fwd_search_mapping_table_hook = NULL; - wf_drv_tbl.wf_fwd_delete_entry_inform_hook = NULL; - wf_drv_tbl.wf_fwd_check_device_hook = NULL; - wf_drv_tbl.wf_fwd_add_entry_inform_hook = NULL; - wf_drv_tbl.wf_fwd_set_easy_setup_mode = NULL; - wf_drv_tbl.wf_fwd_set_bridge_hook = NULL; -} - -#if defined(CONFIG_WIFI_PKT_FWD) || defined(CONFIG_WIFI_PKT_FWD_MODULE) -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(wifi_fwd_register); -EXPORT_SYMBOL(wifi_fwd_unregister); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ -#endif - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_rbus_pci_drv.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_rbus_pci_drv.c deleted file mode 100644 index 28d8958172..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_rbus_pci_drv.c +++ /dev/null @@ -1,304 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#include "rt_config.h" - -NDIS_STATUS RtmpMgmtTaskInit(RTMP_ADAPTER *pAd) -{ - RTMP_OS_TASK *pTask; - NDIS_STATUS status; - /* Creat Command Thread */ - pTask = &pAd->cmdQTask; - RtmpCmdQInit(pAd); - RTMP_OS_TASK_INIT(pTask, "RtmpCmdQTask", pAd); - status = RtmpOSTaskAttach(pTask, RTPCICmdThread, (ULONG)pTask); - - if (status == NDIS_STATUS_FAILURE) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("Unable to start RTPCICmdThread!\n")); - return NDIS_STATUS_FAILURE; - } - -#ifdef WSC_INCLUDED - /* start the crediential write task first. */ - WscThreadInit(pAd); -#endif /* WSC_INCLUDED */ - return NDIS_STATUS_SUCCESS; -} - -VOID RtmpMgmtTaskExit(RTMP_ADAPTER *pAd) -{ - INT ret; - /* Terminate cmdQ thread */ - if (RTMP_OS_TASK_LEGALITY(&pAd->cmdQTask)) { - RtmpCmdQExit(pAd); - NdisAcquireSpinLock(&pAd->CmdQLock); - pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED; - NdisReleaseSpinLock(&pAd->CmdQLock); - /*RTUSBCMDUp(&pAd->cmdQTask); */ - ret = RtmpOSTaskKill(&pAd->cmdQTask); - - if (ret == NDIS_STATUS_FAILURE) - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("Kill command task fail!\n")); - - pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN; - } -#ifdef WSC_INCLUDED - WscThreadExit(pAd); -#endif /* WSC_INCLUDED */ -} - -/* - * ======================================================================== - * Routine Description: - * PCI command kernel thread. - * - * Arguments: - * *Context the pAd, driver control block pointer - * - * Return Value: - * 0 close the thread - * ======================================================================== - */ -INT RTPCICmdThread(IN ULONG Context) -{ - RTMP_ADAPTER *pAd; - RTMP_OS_TASK *pTask; - int status; - - status = 0; - pTask = (RTMP_OS_TASK *)Context; - pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask); - RtmpOSTaskCustomize(pTask); - NdisAcquireSpinLock(&pAd->CmdQLock); - pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING; - NdisReleaseSpinLock(&pAd->CmdQLock); - - while (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING) { - if (RtmpOSTaskWait(pAd, pTask, &status) == FALSE) { - RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); - break; - } - - if (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_STOPED) - break; - - if (!pAd->PM_FlgSuspend) - CMDHandler(pAd); - } - - if (!pAd->PM_FlgSuspend) { - /* Clear the CmdQElements. */ - CmdQElmt *pCmdQElmt = NULL; - - NdisAcquireSpinLock(&pAd->CmdQLock); - pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED; - - while (pAd->CmdQ.size) { - RTThreadDequeueCmd(&pAd->CmdQ, &pCmdQElmt); - - if (pCmdQElmt) { - if (pCmdQElmt->CmdFromNdis == TRUE) { - if (pCmdQElmt->buffer != NULL) - os_free_mem(pCmdQElmt->buffer); - - os_free_mem((PUCHAR)pCmdQElmt); - } else { - if ((pCmdQElmt->buffer != NULL) && - (pCmdQElmt->bufferlength != 0)) - os_free_mem(pCmdQElmt->buffer); - - os_free_mem((PUCHAR)pCmdQElmt); - } - } - } - - NdisReleaseSpinLock(&pAd->CmdQLock); - } - - /* notify the exit routine that we're actually exiting now - * - * complete()/wait_for_completion() is similar to up()/down(), - * except that complete() is safe in the case where the structure - * is getting deleted in a parallel mode of execution (i.e. just - * after the down() -- that's necessary for the thread-shutdown - * case. - * - * complete_and_exit() goes even further than this -- it is safe in - * the case that the thread of the caller is going away (not just - * the structure) -- this is necessary for the module-remove case. - * This is important in preemption kernels, which transfer the flow - * of execution immediately upon a complete(). - */ - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("<---RTPCICmdThread\n")); - RtmpOSTaskNotifyToExit(pTask); - return 0; -} - -#ifdef MT_MAC -NDIS_STATUS mt_pci_chip_cfg(RTMP_ADAPTER *pAd, USHORT id) -{ - NDIS_STATUS ret = NDIS_STATUS_SUCCESS; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (id == 0 || id == 0xffff) - ret = NDIS_STATUS_FAILURE; - -#ifdef CONFIG_FWOWN_SUPPORT - - if ((id == NIC7615_PCIe_DEVICE_ID) || (id == NIC7616_PCIe_DEVICE_ID) || - (id == NIC761A_PCIe_DEVICE_ID) || (id == NIC7611_PCIe_DEVICE_ID) || - (id == NIC7637_PCIe_DEVICE_ID)) - DriverOwn(pAd); - -#endif - if ((id == NIC7603_PCIe_DEVICE_ID) || (id == NIC7615_PCIe_DEVICE_ID) || - (id == NIC7616_PCIe_DEVICE_ID) || (id == NIC761A_PCIe_DEVICE_ID) || - (id == NIC7611_PCIe_DEVICE_ID) || (id == NIC7637_PCIe_DEVICE_ID) || - (id == NICP18_PCIe_DEVICE_ID) || (id == NIC7663_PCIe_DEVICE_ID)) { - UINT32 Value; - - RTMP_IO_READ32(pAd, TOP_HVR, &Value); - pAd->HWVersion = Value; - - if (Value == 0) - ret = NDIS_STATUS_FAILURE; - - RTMP_IO_READ32(pAd, TOP_FVR, &Value); - pAd->FWVersion = Value; - - if (Value == 0) - ret = NDIS_STATUS_FAILURE; - - RTMP_IO_READ32(pAd, TOP_HCR, &Value); - pAd->ChipID = Value; - - if (id == NIC7616_PCIe_DEVICE_ID) - pAd->RfIcType = RFIC_7616; - else if (id == NIC761A_PCIe_DEVICE_ID) - pAd->RfIcType = RFIC_7615A; - - if (Value == 0) - ret = NDIS_STATUS_FAILURE; - - if (IS_MT7603(pAd)) { - RTMP_IO_READ32(pAd, STRAP_STA, &Value); - pAd->AntMode = (Value >> 24) & 0x1; - } - - cap->hif_type = HIF_MT; - pAd->infType = RTMP_DEV_INF_PCIE; - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("%s(): HWVer=0x%x, FWVer=0x%x, pAd->ChipID=0x%x\n", - __func__, pAd->HWVersion, pAd->FWVersion, - pAd->ChipID)); -#ifdef MT7615 - - if (IS_MT7615(pAd)) { - RTMP_IO_READ32(pAd, HIF_SYS_REV, &Value); - - if (Value == 0) - ret = NDIS_STATUS_FAILURE; - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("%s(): HIF_SYS_REV=0x%x\n", __func__, Value)); - } - -#endif /* MT7615 */ - } - - return ret; -} -#endif /* MT_MAC */ - -/*************************************************************************** - * - * PCIe device initialization related procedures. - * - ***************************************************************************/ -VOID RTMPInitPCIeDevice(RT_CMD_PCIE_INIT *pConfig, VOID *pAdSrc) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; - VOID *pci_dev = pConfig->pPciDev; - USHORT device_id = 0; - POS_COOKIE pObj; - NDIS_STATUS ret; - - pObj = (POS_COOKIE)pAd->OS_Cookie; - pci_read_config_word(pci_dev, pConfig->ConfigDeviceID, &device_id); -#ifndef RT_BIG_ENDIAN - device_id = le2cpu16(device_id); -#endif /* RT_BIG_ENDIAN */ - pObj->DeviceID = device_id; - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("%s():device_id=0x%x\n", __func__, device_id)); - OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE); -#ifdef MT_MAC - ret = mt_pci_chip_cfg(pAd, device_id); - - /* check pci configuration CR can be read successfully */ - if (ret != NDIS_STATUS_SUCCESS) { - pConfig->pci_init_succeed = FALSE; - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_OFF, - ("%s():pci configuration space can't be read\n", - __func__)); - return; - } - - pConfig->pci_init_succeed = TRUE; - -#endif /* */ -#ifdef CONFIG_WIFI_MSI_SUPPORT - pAd->PciHif.is_msi = ((struct pci_dev *)pci_dev)->msi_enabled; -#endif /*CONFIG_WIFI_MSI_SUPPORT*/ -#ifdef INTELP6_SUPPORT -#ifdef MULTI_INF_SUPPORT - multi_inf_adapt_reg((VOID *)pAd); -#endif /* MULTI_INF_SUPPORT */ -#endif - if (pAd->infType != RTMP_DEV_INF_UNKNOWN) - RtmpRaDevCtrlInit(pAd, pAd->infType); -} - -#ifdef INTELP6_SUPPORT -#ifdef MULTI_INF_SUPPORT -struct pci_dev *rtmp_get_pci_dev(void *ad) -{ - struct pci_dev *pdev = NULL; -#ifdef RTMP_PCI_SUPPORT - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ad; - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - - pdev = obj->pci_dev; -#endif - return pdev; -} -#endif -#endif - -struct device *rtmp_get_dev(void *ad) -{ - struct device *dev = NULL; - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)ad; - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - - dev = (struct device *)obj->pDev; - return dev; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_rbus_pci_util.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_rbus_pci_util.c deleted file mode 100644 index c314768b92..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_rbus_pci_util.c +++ /dev/null @@ -1,471 +0,0 @@ -/**************************************************************************** - * - * Module Name: - * rt_rbus_pci_util.c - * - * Abstract: - * Any utility is used in UTIL module for PCI/RBUS function. - * - * Revision History: - * Who When What - * --------- ---------- ---------------------------------------------- - * - ***************************************************************************/ -#define RTMP_MODULE_OS -#define RTMP_MODULE_OS_UTIL - -/*#include "rt_config.h" */ -#include "rtmp_comm.h" -#include "rtmp_osabl.h" -#include "rt_os_util.h" - -#ifdef RTMP_MAC_PCI -VOID *alloc_rx_buf_1k(void *hif_resource); - -/* Function for Tx/Rx/Mgmt Desc Memory allocation. */ -void RtmpAllocDescBuf(IN VOID *pDev, IN UINT Index, IN ULONG Length, - IN BOOLEAN Cached, OUT VOID **VirtualAddress, - OUT PNDIS_PHYSICAL_ADDRESS phy_addr) -{ - dma_addr_t DmaAddr = (dma_addr_t)(*phy_addr); - struct device *pdev = (struct device *)pDev; - *VirtualAddress = (PVOID)dma_alloc_coherent(pdev, sizeof(char) * Length, - &DmaAddr, GFP_KERNEL); - *phy_addr = (NDIS_PHYSICAL_ADDRESS)DmaAddr; -} - -/* Function for free allocated Desc Memory. */ -void RtmpFreeDescBuf(IN VOID *pDev, IN ULONG Length, IN VOID *VirtualAddress, - IN NDIS_PHYSICAL_ADDRESS phy_addr) -{ - dma_addr_t DmaAddr = (dma_addr_t)(phy_addr); - struct device *pdev = (struct device *)pDev; - - dma_free_coherent(pdev, Length, VirtualAddress, DmaAddr); -} - -void RTMP_AllocateFirstTxBuffer(VOID *pDev, UINT Index, ULONG Length, - BOOLEAN Cached, PVOID *va, - PNDIS_PHYSICAL_ADDRESS phy_addr) -{ - *va = kmalloc(Length, GFP_KERNEL); - phy_addr = NULL; -} - -void RTMP_FreeFirstTxBuffer(IN VOID *pDev, IN ULONG Length, IN BOOLEAN Cached, - IN VOID *va, IN NDIS_PHYSICAL_ADDRESS phy_addr) -{ - kfree(va); -} - -#ifdef BB_SOC -__IMEM -#endif -PNDIS_PACKET RTMP_AllocateRxPacketBuffer(VOID *reserved, VOID *dev, - enum MEM_ALLOC_TYPE type, ULONG size, - VOID **va, PNDIS_PHYSICAL_ADDRESS pa) -{ - struct sk_buff *pkt = NULL; - struct device *pdev = (struct device *)dev; - - switch (type) { -#ifdef CONFIG_WIFI_BUILD_SKB - case DYNAMIC_PAGE_ALLOC: - /* pkt is dynamic-alloc dma va address */ - DEV_ALLOC_FRAG(pkt, - SKB_DATA_ALIGN(SKB_BUF_HEADROOM_RSV + size) + - SKB_DATA_ALIGN(SKB_BUF_TAILROOM_RSV)); - - if (pkt) - *va = ((PVOID)pkt + SKB_BUF_HEADROOM_RSV); - - break; -#else - case DYNAMIC_PAGE_ALLOC: - /* not support. alloc as DYNAMIC_SLAB_ALLOC*/ -#endif - - case DYNAMIC_SLAB_ALLOC: - /* pkt is dynamic-alloc skb */ -#ifdef BB_SOC - pkt = skbmgr_dev_alloc_skb4k(); -#else - DEV_ALLOC_SKB(pkt, size); -#endif - - if (pkt) - *va = (PVOID)pkt->data; - - break; - - case PRE_SLAB_ALLOC: - /* pkt is pre-alloc dma va adrress */ - pkt = alloc_rx_buf_1k(reserved); - - if (pkt) - *va = ((PVOID)pkt); - - break; - - default: - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s: unknown allocate type %d\n", __func__, type)); - break; - } - - if (pkt) { - *pa = dma_map_single(pdev, *va, size, PCI_DMA_FROMDEVICE); - } else { - *va = (PVOID)NULL; - *pa = (NDIS_PHYSICAL_ADDRESS)0; - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("can't allocate rx %ld size packet\n", size)); - } - - return (PNDIS_PACKET)pkt; -} - -/* - * invaild or writeback cache - * and convert virtual address to physical address - */ -ra_dma_addr_t linux_pci_map_single(void *pDev, void *ptr, size_t size, - int sd_idx, int direction) -{ - struct device *pdev = (struct device *)pDev; - - if (direction == RTMP_PCI_DMA_TODEVICE) - direction = PCI_DMA_TODEVICE; - - if (direction == RTMP_PCI_DMA_FROMDEVICE) - direction = PCI_DMA_FROMDEVICE; - - /* - * ------ Porting Information ------ - * > For Tx Alloc: - * mgmt packets => sd_idx = 0 - * SwIdx: pAd->MgmtRing.TxCpuIdx - * pTxD : pAd->MgmtRing.Cell[SwIdx].AllocVa; - * - * data packets => sd_idx = 1 - * TxIdx : pAd->PciHif.TxRing[pTxBlk->QueIdx].TxCpuIdx - * QueIdx: pTxBlk->QueIdx - * pTxD : pAd->PciHif.TxRing[pTxBlk->QueIdx].Cell[TxIdx].AllocVa; - * - * > For Rx Alloc: - * sd_idx = -1 - */ - /* pAd = (PRTMP_ADAPTER)handle; */ - /* pObj = (POS_COOKIE)pAd->OS_Cookie; */ - { - return (ra_dma_addr_t)dma_map_single(pdev, ptr, size, - direction); - } -} - -void linux_pci_unmap_single(void *pDev, ra_dma_addr_t radma_addr, size_t size, - int direction) -{ - dma_addr_t DmaAddr = (dma_addr_t)radma_addr; - struct device *pdev = (struct device *)pDev; - - if (direction == RTMP_PCI_DMA_TODEVICE) - direction = PCI_DMA_TODEVICE; - - if (direction == RTMP_PCI_DMA_FROMDEVICE) - direction = PCI_DMA_FROMDEVICE; - - if (size > 0) - dma_unmap_single(pdev, DmaAddr, size, direction); -} - -#ifdef RTMP_PCI_SUPPORT -VOID *RTMPFindHostPCIDev(VOID *pPciDevSrc) -{ - struct pci_dev *pci_dev = (struct pci_dev *)pPciDevSrc; - struct pci_dev *parent_pci_dev; - USHORT reg16; - UCHAR reg8; - UINT DevFn; - PPCI_DEV pPci_dev; - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("%s.===>\n", __func__)); - parent_pci_dev = NULL; - - if (pci_dev->bus->parent) { - for (DevFn = 0; DevFn < 255; DevFn++) { -#if (KERNEL_VERSION(2, 6, 0) <= LINUX_VERSION_CODE) - pPci_dev = pci_get_slot(pci_dev->bus->parent, DevFn); -#else - pPci_dev = pci_find_slot(pci_dev->bus->parent->number, - DevFn); -#endif - - if (pPci_dev) { - pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, - ®16); - reg16 = le2cpu16(reg16); - pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS, - ®8); - - if ((reg16 == PCI_CLASS_BRIDGE_PCI) && - (reg8 == pci_dev->bus->number)) - return pPci_dev; - } - } - } - - return NULL; -} -#endif /* RTMP_PCI_SUPPORT */ - -/* - * ======================================================================== - * Routine Description: - * Write 32-bit to a register. - * - * Arguments: - * pAd - WLAN control block pointer - * Offset - Register offset - * Value - 32-bit value - * - * Return Value: - * None - * ======================================================================== - */ -VOID RTMP_PCI_Writel(ULONG Value, VOID *pAddr) -{ - writel(Value, pAddr); -} - -/* - * ======================================================================== - * Routine Description: - * Write 16-bit to a register. - * - * Arguments: - * pAd - WLAN control block pointer - * Offset - Register offset - * Value - 32-bit value - * - * Return Value: - * None - * - * ======================================================================== - */ -VOID RTMP_PCI_Writew(ULONG Value, VOID *pAddr) -{ - writew(Value, pAddr); -} - -/* - * ======================================================================== - * Routine Description: - * Write 8-bit to a register. - * - * Arguments: - * pAd - WLAN control block pointer - * Offset - Register offset - * Value - 32-bit value - * - * Return Value: - * None - * - * ======================================================================== - */ -VOID RTMP_PCI_Writeb(ULONG Value, VOID *pAddr) -{ - writeb(Value, pAddr); -} - -/* - * ======================================================================== - * Routine Description: - * Read 32-bit from a register. - * - * Arguments: - * pAd - WLAN control block pointer - * Offset - Register offset - * Value - 32-bit value - * - * Return Value: - * None - * ======================================================================== - */ -ULONG RTMP_PCI_Readl(VOID *pAddr) -{ - return readl(pAddr); -} - -/* - * ======================================================================== - * Routine Description: - * Read 16-bit from a register. - * - * Arguments: - * pAd - WLAN control block pointer - * Offset - Register offset - * Value - 16-bit value - * - * Return Value: - * None - * - * ======================================================================== - */ -ULONG RTMP_PCI_Readw(VOID *pAddr) -{ - return readw(pAddr); -} - -/* - * ======================================================================== - * Routine Description: - * Read 8-bit from a register. - * - * Arguments: - * pAd - WLAN control block pointer - * Offset - Register offset - * Value - 16-bit value - * - * Return Value: - * None - * ======================================================================== - */ -ULONG RTMP_PCI_Readb(VOID *pAddr) -{ - return readb(pAddr); -} - -/* - * ======================================================================== - * Routine Description: - * Read 16-bit from the PCI config space. - * - * Arguments: - * pDev - PCI device - * Offset - Register offset - * Value - 16-bit value - * - * Return Value: - * None - * ======================================================================== - */ -int RtmpOsPciConfigReadWord(VOID *pDev, UINT32 Offset, UINT16 *pValue) -{ - return pci_read_config_word((struct pci_dev *)pDev, Offset, pValue); -} - -/* - * ======================================================================== - * Routine Description: - * Write 16-bit to the PCI config space. - * - * Arguments: - * pDev - PCI device - * Offset - Register offset - * Value - 16-bit value - * - * Return Value: - * None - * ======================================================================== - */ -int RtmpOsPciConfigWriteWord(VOID *pDev, UINT32 Offset, UINT16 Value) -{ - return pci_write_config_word((struct pci_dev *)pDev, Offset, Value); -} - -/* - * ======================================================================== - * Routine Description: - * Read 32-bit from the PCI config space. - * - * Arguments: - * pDev - PCI device - * Offset - Register offset - * Value - 32-bit value - * - * Return Value: - * None - * ======================================================================== - */ -int RtmpOsPciConfigReadDWord(VOID *pDev, UINT32 Offset, UINT32 *pValue) -{ - return pci_read_config_dword((struct pci_dev *)pDev, Offset, pValue); -} - -/* - * ======================================================================== - * Routine Description: - * Write 32-bit to the PCI config space. - * - * Arguments: - * pDev - PCI device - * Offset - Register offset - * Value - 32-bit value - * - * Return Value: - * None - * - * ======================================================================== - */ -int RtmpOsPciConfigWriteDWord(VOID *pDev, UINT32 Offset, UINT32 Value) -{ - return pci_write_config_dword((struct pci_dev *)pDev, Offset, Value); -} - -/* - * ======================================================================== - * Routine Description: - * Query for devices' capabilities. - * - * Arguments: - * pDev - PCI device - * Cap - Capability code - * - * Return Value: - * None - * - * ======================================================================== - */ -int RtmpOsPciFindCapability(VOID *pDev, INT Cap) -{ - return pci_find_capability(pDev, Cap); -} - -/* - * ======================================================================== - * Routine Description: - * Enable MSI function for PCI. - * - * Arguments: - * pDev - PCI device - * - * Return Value: - * None - * ======================================================================== - */ -int RtmpOsPciMsiEnable(VOID *pDev) -{ - return pci_enable_msi(pDev); -} - -/* - * ======================================================================== - * Routine Description: - * Disable MSI function for PCI. - * - * Arguments: - * pDev - PCI device - * - * Return Value: - * None - * ======================================================================== - */ -VOID RtmpOsPciMsiDisable(VOID *pDev) -{ - pci_disable_msi(pDev); -} - -#endif /* RTMP_MAC_PCI */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_symb.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_symb.c deleted file mode 100644 index a1627f576e..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_symb.c +++ /dev/null @@ -1,10 +0,0 @@ -#ifdef OS_ABL_SUPPORT - -#include -#include "rt_config.h" - -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(RTMP_DRV_OPS_FUNCTION); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ - -#endif /* OS_ABL_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_txrx_hook.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_txrx_hook.c deleted file mode 100644 index 48a6191b3f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_txrx_hook.c +++ /dev/null @@ -1,89 +0,0 @@ -#include - -struct mt_wlan_hook_ctrl wlan_hook; - -/* -* -*/ -void mt_wlan_hook_init(void) -{ - os_zero_mem(&wlan_hook, sizeof(struct mt_wlan_hook_ctrl)); - DlListInit(&wlan_hook.hook_head); -} - -/* -* -*/ -int mt_wlan_hook_call(unsigned short hook, void *ad, void *priv) -{ - struct mt_wlan_hook_ops *cur; - - cur = DlListEntry((&wlan_hook.hook_head)->Next, struct mt_wlan_hook_ops, - list); - if (cur) { - DlListForEach(cur, &wlan_hook.hook_head, - struct mt_wlan_hook_ops, list) - - if (cur->hooks & 1 << hook) cur->fun(hook, ad, priv); - } - - return 0; -} - -/* -* -*/ -int mt_wlan_hook_register(struct mt_wlan_hook_ops *ops) -{ - struct mt_wlan_hook_ops *next = NULL; - struct mt_wlan_hook_ops *cur = NULL; - - if (!ops) - return -1; - - cur = DlListEntry((&wlan_hook.hook_head)->Next, struct mt_wlan_hook_ops, - list); - if (cur) { - DlListForEachSafe(cur, next, &wlan_hook.hook_head, - struct mt_wlan_hook_ops, list) - - if (cur && ops->priority > cur->priority) - { - (ops->list).Next = &next->list; - cur->list.Next = &ops->list; - return 0; - } - - /*add first entry*/ - DlListAdd(&wlan_hook.hook_head, &ops->list); - } - return 0; -} -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(mt_wlan_hook_register); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ - -/* -* -*/ -int mt_wlan_hook_unregister(struct mt_wlan_hook_ops *ops) -{ - struct mt_wlan_hook_ops *next, *cur; - - if (!ops) - return -1; - - DlListForEachSafe(cur, next, &wlan_hook.hook_head, - struct mt_wlan_hook_ops, list) - - if (ops == cur) - { - DlListDel(&ops->list); - return 0; - } - - return -1; -} -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(mt_wlan_hook_unregister); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_udma.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_udma.c deleted file mode 100644 index 9867e18c4b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/rt_udma.c +++ /dev/null @@ -1,225 +0,0 @@ -/**************************************************************************** - - Module Name: - rt_udma.c - - Abstract: - For PUMA6 UDMA data path implementation. - - Revision History: - Who When What - --------- ---------- ---------------------------------------------- - Anjan Chanda 05-05-2015 Initial rev. - -***************************************************************************/ - -#define RTMP_MODULE_OS - -#ifdef RTMP_UDMA_SUPPORT - -#include "rt_config.h" -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rt_os_net.h" -#include "rt_udma.h" - -#include - -/******************************************************************************************* -Routine Description: - Handle received frames from UDMA layer. - -Arguments: - *skb received skb - *net_dev the raxx interface pointer - -Return Value: - None - -Note: - Frame received from the UDMA layer is check for VLAN tag and handled - accordingly -******************************************************************************************/ -static void udma_net_rx_callback(struct sk_buff *skb, struct net_device *netdev) -{ - UINT16 skb_vlanid = 0, bss_vlanid = 0; - UINT16 ethtype = 0; - INT ap_idx = 0; - PRTMP_ADAPTER pAd = NULL; - BOOLEAN bDrop = true; - UCHAR mac_addr[MAC_ADDR_LEN]; - MAC_TABLE_ENTRY *pEntry = NULL; - struct sk_buff *clone_skb; - struct net_device *netdev1; - - /* MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("Udma Net Rx Callback--->\n")); */ - NdisCopyMemory(&mac_addr[0], &skb->data[0], 6); - - GET_PAD_FROM_NET_DEV(pAd, netdev); - - /* pEntry = MacTableLookup(pAd, mac_addr); */ - - ethtype = (skb->data[12] << 8) | (skb->data[13]); - skb_vlanid = ((skb->data[14] << 8) | skb->data[15]) & 0xFFF; - - if (!IS_BM_MAC_ADDR(mac_addr)) { - pEntry = MacTableLookup(pAd, mac_addr); -#ifdef MBSS_AS_WDS_AP_SUPPORT - if (!pEntry) { - PUCHAR pEntryAddr = CliWds_ProxyLookup(pAd, mac_addr); - if (pEntryAddr != NULL) { - pEntry = MacTableLookup(pAd, pEntryAddr); - } - } -#endif - if (pEntry && (ethtype == ETH_TYPE_VLAN)) { - /* destination in MacTable and VLAN tagged packet -- need to send */ - bss_vlanid = pEntry->wdev->VLAN_VID; - if (bss_vlanid == 0 || skb_vlanid == bss_vlanid) { - if (bss_vlanid == 0) { - /* vlan not configured in wifi. Strip 4 bytes vlan-tag before send */ - memmove(skb->data + 4, skb->data, 12); - skb_pull(skb, 4); - } - skb->dev = pEntry->wdev->if_dev; - rt28xx_send_packets(skb, pEntry->wdev->if_dev); - return; - } /* else - printk("%s(): %d: Drop VLAN mismatch Ucast packet: skb_vlanid = %d bss_vlanid = %d\n", - __func__, __LINE__, skb_vlanid, bss_vlanid); */ - } else { - if (pEntry) { - /* destination in MacTable and untagged packet -- need to send */ - /* printk("%s(): %d: Send untagged Ucast packet to associated client --->\n", __func__, __LINE__); */ - skb->dev = pEntry->wdev->if_dev; - rt28xx_send_packets(skb, netdev); - return; - } /* else { */ - /* printk("%s(): %d: Drop VAN tagged (id = %d) but non-matching destined Ucast packets for\n", - __func__, __LINE__, skb_vlanid); */ - /* printk("%02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); */ - /* } */ - } - } else { - if (ethtype == ETH_TYPE_VLAN) { - memmove(skb->data + 4, skb->data, 12); - skb_pull(skb, 4); - for (ap_idx = 0; ap_idx < pAd->ApCfg.BssidNum; - ap_idx++) { - bss_vlanid = - pAd->ApCfg.MBSSID[ap_idx].wdev.VLAN_VID; - netdev1 = pAd->ApCfg.MBSSID[ap_idx].wdev.if_dev; - - if (RTMP_OS_NETDEV_STATE_RUNNING(netdev1) && - (bss_vlanid == 0 || - skb_vlanid == bss_vlanid)) { - clone_skb = - skb_clone(skb, MEM_ALLOC_FLAG); - clone_skb->dev = netdev1; - - if (bss_vlanid == 0) { - /* vlan not configured. Strip 4 bytes vlan-tag before send */ - } - - rt28xx_send_packets(clone_skb, netdev1); - /* bDrop = false; */ - } - } - } else { - for (ap_idx = 0; ap_idx < pAd->ApCfg.BssidNum; - ap_idx++) { - bss_vlanid = - pAd->ApCfg.MBSSID[ap_idx].wdev.VLAN_VID; - netdev1 = pAd->ApCfg.MBSSID[ap_idx].wdev.if_dev; - - if (RTMP_OS_NETDEV_STATE_RUNNING(netdev1) && - bss_vlanid == 0) { - clone_skb = - skb_clone(skb, MEM_ALLOC_FLAG); - clone_skb->dev = netdev1; - /* printk("%s(): %d\n", __func__, __LINE__); */ - rt28xx_send_packets(clone_skb, netdev1); - /* bDrop = false; */ - } - } - } - } - - if (bDrop) { - /* RELEASE_NDIS_PACKET(NULL,(PNDIS_PACKET)skb,NDIS_STATUS_FAILURE); - // don't use this funcion to free skbs not allocated by us -- u have been warned! */ - dev_kfree_skb_any(skb); - skb = NULL; - } - /* MTWF_LOG(DBG_CAT_RX, DBG_SUBCAT_ALL, DBG_LVL_TRACE,("Udma Net Rx Callback\n")); */ -} - -int mt_udma_pkt_send(VOID *ctx, PNDIS_PACKET pRxPkt) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)ctx; - BOOLEAN bUdmaSend = TRUE; - UCHAR port; - - /* if udma not enabled, pass pkts for normal processing through os stack */ - if (unlikely(!pAd->CommonCfg.bUdmaFlag)) - return -1; - - /* udma enabled; check if we can use udma fast path */ - port = pAd->CommonCfg.UdmaPortNum; - -#ifdef CONFIG_AP_SUPPORT - /* check VLAN tagged packet */ - if (((GET_OS_PKT_DATAPTR(pRxPkt))[12] == 0x81) && - ((GET_OS_PKT_DATAPTR(pRxPkt))[13] == 0x00)) { - if (((GET_OS_PKT_DATAPTR(pRxPkt))[16] == 0x88) && - ((GET_OS_PKT_DATAPTR(pRxPkt))[17] == 0x8e)) { - /* bypass UDMA path for EAPOL type frames */ - memmove((GET_OS_PKT_DATAPTR(pRxPkt)) + 4, - (GET_OS_PKT_DATAPTR(pRxPkt)), 12); - skb_pull(pRxPkt, 4); - /* hex_dump("VLAN EAPOL_DATA" ,GET_OS_PKT_DATAPTR(pRxPkt),GET_OS_PKT_LEN(pRxPkt)); // debug */ - bUdmaSend = FALSE; - } - } else { - bUdmaSend = FALSE; - } -#endif /* CONFIG_AP_SUPPORT */ - - if (bUdmaSend == TRUE) { - udma_xmit_skb(port, RTPKT_TO_OSPKT(pRxPkt)); - return 0; - } - - /* pkts reaching here will NOT take udma path */ - return -1; -} - -int mt_udma_register(VOID *ctx, PNET_DEV netdev) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)ctx; - int ret = 0; - - if (pAd->CommonCfg.bUdmaFlag) { - UCHAR port = pAd->CommonCfg.UdmaPortNum; - - ret = udma_register_handler(port, netdev, udma_net_rx_callback); - } - - return ret; -} - -int mt_udma_unregister(VOID *ctx) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)ctx; - - if (pAd->CommonCfg.bUdmaFlag) { - UCHAR port = pAd->CommonCfg.UdmaPortNum; - - udma_flush(port); - } - - return 0; -} - -#endif /*RTMP_UDMA_SUPPORT*/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/tm.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/tm.c deleted file mode 100644 index 63e20dbc2a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/tm.c +++ /dev/null @@ -1,670 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2017, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ -#include "rt_config.h" - -#ifndef CONFIG_PROPRIETARY_DRIVER - -static VOID ge_tx_pkt_deq_work(struct work_struct *work) -{ - RTMP_ADAPTER *pAd = - container_of(work, struct _RTMP_ADAPTER, tx_deq_work); - - ge_tx_pkt_deq_func(pAd); -} - -static VOID fp_tx_pkt_deq_work(struct work_struct *work) -{ - RTMP_ADAPTER *pAd = - container_of(work, struct _RTMP_ADAPTER, tx_deq_work); - - fp_tx_pkt_deq_func(pAd); -} - -static VOID fp_fair_tx_pkt_deq_work(struct work_struct *work) -{ - RTMP_ADAPTER *pAd = - container_of(work, struct _RTMP_ADAPTER, tx_deq_work); - - fp_fair_tx_pkt_deq_func(pAd); -} - -static INT tm_wq_qm_init(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - pAd->tx_dequeue_scheduable = TRUE; - - pAd->qm_wq = alloc_workqueue("qm_wq", WQ_MEM_RECLAIM | WQ_UNBOUND, 0); - - if (cap->qm == FAST_PATH_QM) { - INIT_WORK(&pAd->tx_deq_work, fp_tx_pkt_deq_work); - } else if (cap->qm == FAST_PATH_FAIR_QM) { - INIT_WORK(&pAd->tx_deq_work, fp_fair_tx_pkt_deq_work); - } else if ((cap->qm == GENERIC_QM) || (cap->qm == GENERIC_FAIR_QM)) { - INIT_WORK(&pAd->tx_deq_work, ge_tx_pkt_deq_work); - } - return ret; -} - -static VOID tx_dma_done_work(struct work_struct *work) -{ - POS_COOKIE obj = container_of(work, struct os_cookie, tx_dma_done_work); - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)((ULONG)(obj->pAd_va)); - - tx_dma_done_func(pAd); -} - -static VOID rx_done_work(struct work_struct *work) -{ - POS_COOKIE obj = - container_of(work, struct os_cookie, rx_done_work[HIF_RX_IDX0]); - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)((ULONG)(obj->pAd_va)); - - rx_done_func(pAd); -} - -static VOID rx1_done_work(struct work_struct *work) -{ - POS_COOKIE obj = - container_of(work, struct os_cookie, rx_done_work[HIF_RX_IDX1]); - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)((ULONG)(obj->pAd_va)); - - rx1_done_func(pAd); -} - -#ifdef ERR_RECOVERY -static VOID mt_mac_recovery_work(struct work_struct *work) -{ - POS_COOKIE obj = - container_of(work, struct os_cookie, mac_recovery_work); - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)((ULONG)(obj->pAd_va)); - - mt_mac_recovery_func(pAd); -} -#endif - -#ifdef CONFIG_FWOWN_SUPPORT -static VOID mt_mac_fw_own_work(struct work_struct *work) -{ - POS_COOKIE obj = container_of(work, struct os_cookie, mac_fw_own_work); - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)((ULONG)(obj->pAd_va)); - - mt_mac_fw_own_func(pAd); -} -#endif - -#ifdef MULTI_LAYER_INTERRUPT -static VOID mt_subsys_int_work(struct work_struct *work) -{ - POS_COOKIE obj = container_of(work, struct os_cookie, subsys_int_work); - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)((ULONG)(obj->pAd_va)); - - mt_subsys_int_func(pAd); -} -#endif - -static INT tm_wq_hif_pci_init(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - obj->hif_wq = alloc_workqueue("hif_wq", WQ_MEM_RECLAIM | WQ_UNBOUND, 0); - - INIT_WORK(&obj->tx_dma_done_work, tx_dma_done_work); - INIT_WORK(&obj->rx_done_work[HIF_RX_IDX0], rx_done_work); - INIT_WORK(&obj->rx_done_work[HIF_RX_IDX1], rx1_done_work); - -#ifdef ERR_RECOVERY - INIT_WORK(&obj->mac_recovery_work, mt_mac_recovery_work); -#endif - -#ifdef CONFIG_FWOWN_SUPPORT - INIT_WORK(&obj->mac_fw_own_work, mt_mac_fw_own_work); -#endif - -#ifdef MULTI_LAYER_INTERRUPT - INIT_WORK(&obj->subsys_int_work, mt_subsys_int_work); -#endif - - return ret; -} - -static INT tm_wq_hif_init(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - ret = tm_wq_hif_pci_init(pAd); - } - - return ret; -} - -static INT tm_wq_hif_pci_exit(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - - destroy_workqueue(obj->hif_wq); - - return ret; -} - -static INT tm_wq_hif_exit(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - ret = tm_wq_hif_pci_exit(pAd); - } - - return ret; -} - -static INT tm_wq_qm_exit(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - - pAd->tx_dequeue_scheduable = FALSE; - destroy_workqueue(pAd->qm_wq); - - return ret; -} - -static INT tm_wq_qm_schedule_task(RTMP_ADAPTER *pAd, enum task_type type) -{ - INT ret = NDIS_STATUS_SUCCESS; - - switch (type) { - case TX_DEQ_TASK: - if (pAd->tx_dequeue_scheduable -#ifdef INTELP6_UDMA_CPU_LOAD_OPTIMIZATION - && !pAd->is_blocked -#endif - ) { - queue_work(pAd->qm_wq, &pAd->tx_deq_work); - } - break; - - default: - break; - } - - return ret; -} - -static INT tm_wq_hif_schedule_task(RTMP_ADAPTER *pAd, enum task_type type) -{ - INT ret = NDIS_STATUS_SUCCESS; - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - - switch (type) { - case CMD_MSG_TASK: - - break; - - case TX_DONE_TASK: - queue_work(obj->hif_wq, &obj->tx_dma_done_work); - break; - - case RX_DONE_TASK: - queue_work(obj->hif_wq, &obj->rx_done_work[HIF_RX_IDX0]); - break; - - case RX1_DONE_TASK: - queue_work(obj->hif_wq, &obj->rx_done_work[HIF_RX_IDX1]); - break; - -#ifdef ERR_RECOVERY - case ERROR_RECOVERY_TASK: - queue_work(obj->hif_wq, &obj->mac_recovery_work); - break; -#endif - -#ifdef CONFIG_FWOWN_SUPPORT - case FW_OWN_TASK: - queue_work(obj->hif_wq, &obj->mac_fw_own_work); - break; -#endif - -#ifdef MULTI_LAYER_INTERRUPT - case SUBSYS_INT_TASK: - queue_work(obj->hif_wq, &obj->subsys_int_work); - break; -#endif - - default: - - break; - } - - return ret; -} - -static INT tm_wq_qm_schedule_task_on(RTMP_ADAPTER *pAd, INT cpu, - enum task_type type) -{ - INT ret = NDIS_STATUS_SUCCESS; - - switch (type) { - case TX_DEQ_TASK: - if (pAd->tx_dequeue_scheduable -#ifdef INTELP6_UDMA_CPU_LOAD_OPTIMIZATION - && !pAd->is_blocked -#endif - ) { - queue_work_on(cpu, pAd->qm_wq, &pAd->tx_deq_work); - } - break; - default: - - break; - } - - return ret; -} - -static INT tm_wq_hif_schedule_task_on(RTMP_ADAPTER *pAd, INT cpu, - enum task_type type) -{ - INT ret = NDIS_STATUS_SUCCESS; - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - - switch (type) { - case CMD_MSG_TASK: - - break; - - case TX_DONE_TASK: - queue_work_on(cpu, obj->hif_wq, &obj->tx_dma_done_work); - break; - - case RX_DONE_TASK: - queue_work_on(cpu, obj->hif_wq, - &obj->rx_done_work[HIF_RX_IDX0]); - break; - - case RX1_DONE_TASK: - queue_work_on(cpu, obj->hif_wq, - &obj->rx_done_work[HIF_RX_IDX1]); - break; - -#ifdef ERR_RECOVERY - case ERROR_RECOVERY_TASK: - queue_work_on(cpu, obj->hif_wq, &obj->mac_recovery_work); - break; -#endif - -#ifdef CONFIG_FWOWN_SUPPORT - case FW_OWN_TASK: - queue_work_on(cpu, obj->hif_wq, &obj->mac_fw_own_work); - break; -#endif - -#ifdef MULTI_LAYER_INTERRUPT - case SUBSYS_INT_TASK: - queue_work_on(cpu, obj->hif_wq, &obj->subsys_int_work); - break; -#endif - - default: - - break; - } - - return ret; -} - -struct tm_ops tm_wq_qm_ops = { - .init = tm_wq_qm_init, - .exit = tm_wq_qm_exit, - .schedule_task = tm_wq_qm_schedule_task, - .schedule_task_on = tm_wq_qm_schedule_task_on, -}; - -struct tm_ops tm_wq_hif_ops = { - .init = tm_wq_hif_init, - .exit = tm_wq_hif_exit, - .schedule_task = tm_wq_hif_schedule_task, - .schedule_task_on = tm_wq_hif_schedule_task_on, -}; -#endif /*CONFIG_PROPRIETARY_DRIVER*/ - -static VOID ge_tx_pkt_deq_tasklet(ULONG param) -{ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)param; - - ge_tx_pkt_deq_func(pAd); -} - -static VOID fp_tx_pkt_deq_tasklet(ULONG param) -{ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)param; - - fp_tx_pkt_deq_func(pAd); -} - -static VOID fp_fair_tx_pkt_deq_tasklet(ULONG param) -{ - RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)param; - - fp_fair_tx_pkt_deq_func(pAd); -} - -static INT tm_tasklet_qm_init(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (cap->qm == FAST_PATH_QM) { - RTMP_OS_TASKLET_INIT(pAd, &pAd->tx_deque_tasklet, - fp_tx_pkt_deq_tasklet, (unsigned long)pAd); - } else if (cap->qm == FAST_PATH_FAIR_QM) { - RTMP_OS_TASKLET_INIT(pAd, &pAd->tx_deque_tasklet, - fp_fair_tx_pkt_deq_tasklet, - (unsigned long)pAd); - } else if ((cap->qm == GENERIC_QM) || (cap->qm == GENERIC_FAIR_QM)) { - RTMP_OS_TASKLET_INIT(pAd, &pAd->tx_deque_tasklet, - ge_tx_pkt_deq_tasklet, (unsigned long)pAd); - } - pAd->tx_dequeue_scheduable = TRUE; - - return ret; -} - -static VOID tx_dma_done_tasklet(unsigned long data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)data; - - tx_dma_done_func(pAd); -} - -static VOID tr_done_tasklet(unsigned long data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)data; - - tr_done_func(pAd); -} - -static VOID rx_done_tasklet(unsigned long data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)data; - - rx_done_func(pAd); -} - -static VOID rx1_done_tasklet(unsigned long data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)data; - - rx1_done_func(pAd); -} - -#ifdef ERR_RECOVERY -static VOID mt_mac_recovery_tasklet(unsigned long data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)data; - - mt_mac_recovery_func(pAd); -} -#endif - -#ifdef CONFIG_FWOWN_SUPPORT -static VOID mt_mac_fw_own_tasklet(unsigned long data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)data; - - mt_mac_fw_own_func(pAd); -} -#endif - -#ifdef MULTI_LAYER_INTERRUPT -static VOID subsys_int_tasklet(unsigned long data) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)data; - - mt_subsys_int_func(pAd); -} -#endif - -static INT tm_tasklet_hif_pci_init(RTMP_ADAPTER *pAd) -{ - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - - RTMP_OS_TASKLET_INIT(pAd, &obj->rx_done_task[HIF_RX_IDX0], - rx_done_tasklet, (unsigned long)pAd); - RTMP_OS_TASKLET_INIT(pAd, &obj->rx_done_task[HIF_RX_IDX1], - rx1_done_tasklet, (unsigned long)pAd); - -#ifdef ERR_RECOVERY - RTMP_OS_TASKLET_INIT(pAd, &obj->mac_error_recovey_task, - mt_mac_recovery_tasklet, (unsigned long)pAd); -#endif /* ERR_RECOVERY */ - -#ifdef CONFIG_FWOWN_SUPPORT - RTMP_OS_TASKLET_INIT(pAd, &obj->mt_mac_fw_own_task, - mt_mac_fw_own_tasklet, (unsigned long)pAd); -#endif /* CONFIG_FWOWN_SUPPORT */ - -#ifdef MULTI_LAYER_INTERRUPT - RTMP_OS_TASKLET_INIT(pAd, &obj->subsys_int_task, subsys_int_tasklet, - (unsigned long)pAd); -#endif - - RTMP_OS_TASKLET_INIT(pAd, &obj->tx_dma_done_task, tx_dma_done_tasklet, - (unsigned long)pAd); - - RTMP_OS_TASKLET_INIT(pAd, &obj->tr_done_task, tr_done_tasklet, - (unsigned long)pAd); - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - } -#endif /* CONFIG_AP_SUPPORT */ - - return NDIS_STATUS_SUCCESS; -} - -static INT tm_tasklet_hif_init(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - ret = tm_tasklet_hif_pci_init(pAd); - } - - return ret; -} - -static INT tm_tasklet_qm_exit(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - - pAd->tx_dequeue_scheduable = FALSE; - - RTMP_OS_TASKLET_KILL(&pAd->tx_deque_tasklet); - - return ret; -} - -static INT tm_tasklet_hif_pci_exit(RTMP_ADAPTER *pAd) -{ - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - INT ret = NDIS_STATUS_SUCCESS; - - RTMP_OS_TASKLET_KILL(&obj->rx_done_task[HIF_RX_IDX0]); - RTMP_OS_TASKLET_KILL(&obj->rx_done_task[HIF_RX_IDX1]); - -#ifdef ERR_RECOVERY - RTMP_OS_TASKLET_KILL(&obj->mac_error_recovey_task); -#endif /* ERR_RECOVERY */ - -#ifdef CONFIG_FWOWN_SUPPORT - RTMP_OS_TASKLET_KILL(&obj->mt_mac_fw_own_task); -#endif /* CONFIG_FWOWN_SUPPORT */ - - RTMP_OS_TASKLET_KILL(&obj->tx_dma_done_task); - RTMP_OS_TASKLET_KILL(&obj->tr_done_task); - -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - } -#endif /* CONFIG_AP_SUPPORT */ - - return ret; -} - -static INT tm_tasklet_hif_exit(RTMP_ADAPTER *pAd) -{ - INT ret = NDIS_STATUS_SUCCESS; - - if (IS_PCI_INF(pAd) || IS_RBUS_INF(pAd)) { - ret = tm_tasklet_hif_pci_exit(pAd); - } - - return ret; -} - -static INT tm_tasklet_qm_schedule_task(RTMP_ADAPTER *pAd, enum task_type type) -{ - INT ret = NDIS_STATUS_SUCCESS; - - switch (type) { - case TX_DEQ_TASK: - if (pAd->tx_dequeue_scheduable -#ifdef INTELP6_UDMA_CPU_LOAD_OPTIMIZATION - && !pAd->is_blocked -#endif - ) { - RTMP_OS_TASKLET_SCHE(&pAd->tx_deque_tasklet); - } - - break; - - default: - - break; - } - - return ret; -} - -static INT tm_tasklet_hif_schedule_task(RTMP_ADAPTER *pAd, enum task_type type) -{ - INT ret = NDIS_STATUS_SUCCESS; - POS_COOKIE obj = (POS_COOKIE)pAd->OS_Cookie; - - switch (type) { - case CMD_MSG_TASK: - - break; - - case TX_DONE_TASK: - RTMP_OS_TASKLET_SCHE(&obj->tx_dma_done_task); - break; - - case RX_DONE_TASK: - RTMP_OS_TASKLET_SCHE(&obj->rx_done_task[HIF_RX_IDX0]); - break; - - case RX1_DONE_TASK: - RTMP_OS_TASKLET_SCHE(&obj->rx_done_task[HIF_RX_IDX1]); - break; - -#ifdef ERR_RECOVERY - case ERROR_RECOVERY_TASK: - RTMP_OS_TASKLET_SCHE(&obj->mac_error_recovey_task); - break; -#endif - -#ifdef CONFIG_FWOWN_SUPPORT - case FW_OWN_TASK: - RTMP_OS_TASKLET_SCHE(&obj->mt_mac_fw_own_task); - break; -#endif - -#ifdef MULTI_LAYER_INTERRUPT - case SUBSYS_INT_TASK: - RTMP_OS_TASKLET_SCHE(&obj->subsys_int_task); - break; -#endif - - case TR_DONE_TASK: - RTMP_OS_TASKLET_SCHE(&obj->tr_done_task); - break; - - default: - - break; - } - - return ret; -} - -struct tm_ops tm_tasklet_qm_ops = { - .init = tm_tasklet_qm_init, - .exit = tm_tasklet_qm_exit, - .schedule_task = tm_tasklet_qm_schedule_task, -}; - -struct tm_ops tm_tasklet_hif_ops = { - .init = tm_tasklet_hif_init, - .exit = tm_tasklet_hif_exit, - .schedule_task = tm_tasklet_hif_schedule_task, -}; - -INT tm_init(RTMP_ADAPTER *pAd) -{ - RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - struct tm_ops **tm_qm_ops = &pAd->tm_qm_ops; - struct tm_ops **tm_hif_ops = &pAd->tm_hif_ops; - INT ret = NDIS_STATUS_SUCCESS; - - if (cap->qm_tm == TASKLET_METHOD) - *tm_qm_ops = &tm_tasklet_qm_ops; -#ifndef CONFIG_PROPRIETARY_DRIVER - else if (cap->qm_tm == CMWQ_METHOD) - *tm_qm_ops = &tm_wq_qm_ops; -#endif /*CONFIG_PROPRIETARY_DRIVER*/ - if (cap->hif_tm == TASKLET_METHOD) - *tm_hif_ops = &tm_tasklet_hif_ops; -#ifndef CONFIG_PROPRIETARY_DRIVER - else if (cap->hif_tm == CMWQ_METHOD) - *tm_hif_ops = &tm_wq_hif_ops; -#endif /*CONFIG_PROPRIETARY_DRIVER*/ - ret = (*tm_qm_ops)->init(pAd); - ret = (*tm_hif_ops)->init(pAd); - - return ret; -} - -INT tm_exit(RTMP_ADAPTER *pAd) -{ - struct tm_ops *tm_qm_ops = pAd->tm_qm_ops; - struct tm_ops *tm_hif_ops = pAd->tm_hif_ops; - INT ret = NDIS_STATUS_SUCCESS; - - ret = tm_qm_ops->exit(pAd); - ret = tm_hif_ops->exit(pAd); - - return ret; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/trace.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/trace.c deleted file mode 100644 index 3a294acee0..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/trace.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - trace.c -*/ - -#include "rt_config.h" - -#ifdef CONFIG_TRACE_SUPPORT -#define CREATE_TRACE_POINTS -#include "os/trace.h" -#endif - -static VOID TraceCrPseFrameInfo(RTMP_ADAPTER *pAd, UINT8 PID, UINT8 QID) -{ - UINT32 FirstFID, CurFID, NextFID, FrameNums = 0; - UINT32 Value; - UCHAR PseData[32]; - UINT32 DwIndex; - - RTMP_IO_READ32(pAd, C_GFF, &Value); - Value &= ~GET_QID_MASK; - Value |= SET_GET_QID(QID); - Value &= ~GET_PID_MASK; - Value |= SET_GET_PID(PID); - RTMP_IO_WRITE32(pAd, C_GFF, Value); - RTMP_IO_READ32(pAd, C_GFF, &Value); - FirstFID = GET_FIRST_FID(Value); - - if (FirstFID == 0xfff) - return; - - CurFID = FirstFID; - FrameNums++; - - for (DwIndex = 0; DwIndex < 8; DwIndex++) { - RTMP_IO_READ32(pAd, - (MT_PCI_REMAP_ADDR_1 + (((CurFID)*128)) + - (DwIndex * 4)), - &PseData[DwIndex * 4]); - } - - TRACE_CR_PSE_FRAME_INFO(PID, QID, CurFID); - TRACE_TX_MAC_LINFO((TMAC_TXD_L *)PseData); - - while (1) { - RTMP_IO_READ32(pAd, C_GF, &Value); - Value &= ~CURR_FID_MASK; - Value |= SET_CURR_FID(CurFID); - RTMP_IO_WRITE32(pAd, C_GF, Value); - RTMP_IO_READ32(pAd, C_GF, &Value); - NextFID = GET_RETURN_FID(Value); - - if (NextFID == 0xfff) - return; - - CurFID = NextFID; - - for (DwIndex = 0; DwIndex < 8; DwIndex++) { - RTMP_IO_READ32(pAd, - (MT_PCI_REMAP_ADDR_1 + (((CurFID)*128)) + - (DwIndex * 4)), - &PseData[DwIndex * 4]); - } - - TRACE_CR_PSE_FRAME_INFO(PID, QID, CurFID); - TRACE_TX_MAC_LINFO((TMAC_TXD_L *)PseData); - FrameNums++; - } -} - -VOID TraceCrPseInfo(RTMP_ADAPTER *pAd) -{ - TRACE_CR_PSE_INFO(pAd); - /* HIF port frame information */ - TraceCrPseFrameInfo(pAd, 0, 0); - TraceCrPseFrameInfo(pAd, 0, 1); - TraceCrPseFrameInfo(pAd, 0, 2); - /* MCU port frame information */ - TraceCrPseFrameInfo(pAd, 1, 0); - TraceCrPseFrameInfo(pAd, 1, 1); - TraceCrPseFrameInfo(pAd, 1, 2); - TraceCrPseFrameInfo(pAd, 1, 3); - /* WLAN port frame information */ - TraceCrPseFrameInfo(pAd, 2, 0); - TraceCrPseFrameInfo(pAd, 2, 1); - TraceCrPseFrameInfo(pAd, 2, 2); - TraceCrPseFrameInfo(pAd, 2, 3); - TraceCrPseFrameInfo(pAd, 2, 4); - TraceCrPseFrameInfo(pAd, 2, 5); - TraceCrPseFrameInfo(pAd, 2, 6); - TraceCrPseFrameInfo(pAd, 2, 7); - TraceCrPseFrameInfo(pAd, 2, 8); - TraceCrPseFrameInfo(pAd, 2, 9); - TraceCrPseFrameInfo(pAd, 2, 10); - TraceCrPseFrameInfo(pAd, 2, 11); - TraceCrPseFrameInfo(pAd, 2, 12); - TraceCrPseFrameInfo(pAd, 2, 13); -} - -#define MT_WTBL_SIZE 20 -VOID TraceWtblInfo(RTMP_ADAPTER *pAd, UINT32 wtbl_idx) -{ - INT idx, start_idx, end_idx, tok; - UINT32 addr, val[16]; - struct wtbl_1_struc wtbl_1; - struct wtbl_2_struc wtbl_2; - union wtbl_3_struc wtbl_3; - struct wtbl_4_struc wtbl_4; - - if (wtbl_idx == RESERVED_WCID) { - start_idx = 0; - end_idx = (MT_WTBL_SIZE - 1); - } else if (wtbl_idx < MT_WTBL_SIZE) - start_idx = end_idx = wtbl_idx; - else - return; - - for (idx = start_idx; idx <= end_idx; idx++) { - /* Read WTBL 1 */ - os_zero_mem((UCHAR *)&wtbl_1, sizeof(struct wtbl_1_struc)); - addr = pAd->mac_ctrl.wtbl_base_addr[0] + - idx * pAd->mac_ctrl.wtbl_entry_size[0]; - RTMP_IO_READ32(pAd, addr, &wtbl_1.wtbl_1_d0.word); - RTMP_IO_READ32(pAd, addr + 4, &wtbl_1.wtbl_1_d1.word); - RTMP_IO_READ32(pAd, addr + 8, &wtbl_1.wtbl_1_d2.word); - RTMP_IO_READ32(pAd, addr + 12, &wtbl_1.wtbl_1_d3.word); - RTMP_IO_READ32(pAd, addr + 16, &wtbl_1.wtbl_1_d4.word); - TRACE_CR_WTBL1_INFO(pAd, &wtbl_1); - /* Read WTBL 2 */ - os_zero_mem((UCHAR *)&wtbl_2, sizeof(struct wtbl_2_struc)); - addr = pAd->mac_ctrl.wtbl_base_addr[1] + - idx * pAd->mac_ctrl.wtbl_entry_size[1]; - - for (tok = 0; tok < sizeof(struct wtbl_2_struc) / 4; tok++) - RTMP_IO_READ32(pAd, addr + tok * 4, &val[tok]); - - TRACE_CR_WTBL2_INFO(pAd, (struct wtbl_2_struc *)&val[0]); - /* Read WTBL 3 */ - os_zero_mem((UCHAR *)&wtbl_3, sizeof(union wtbl_3_struc)); - addr = pAd->mac_ctrl.wtbl_base_addr[2] + - idx * pAd->mac_ctrl.wtbl_entry_size[2]; - - for (tok = 0; tok < sizeof(union wtbl_3_struc) / 4; tok++) - RTMP_IO_READ32(pAd, addr + tok * 4, &val[tok]); - - /* dump_wtbl_3_info(pAd, (union wtbl_3_struc *)&val[0]); */ - /* Read WTBL 4 */ - os_zero_mem((UCHAR *)&wtbl_4, sizeof(struct wtbl_4_struc)); - addr = pAd->mac_ctrl.wtbl_base_addr[3] + - idx * pAd->mac_ctrl.wtbl_entry_size[3]; - RTMP_IO_READ32(pAd, addr, &wtbl_4.ac0.word[0]); - RTMP_IO_READ32(pAd, addr + 4, &wtbl_4.ac0.word[1]); - RTMP_IO_READ32(pAd, addr + 8, &wtbl_4.ac1.word[0]); - RTMP_IO_READ32(pAd, addr + 12, &wtbl_4.ac1.word[1]); - RTMP_IO_READ32(pAd, addr + 16, &wtbl_4.ac2.word[0]); - RTMP_IO_READ32(pAd, addr + 20, &wtbl_4.ac2.word[1]); - RTMP_IO_READ32(pAd, addr + 24, &wtbl_4.ac3.word[0]); - RTMP_IO_READ32(pAd, addr + 28, &wtbl_4.ac3.word[1]); - /* dump_wtbl_4_info(pAd, &wtbl_4); */ - } -} - -INT32 TracePSTable(RTMP_ADAPTER *pAd, UINT32 ent_type, BOOLEAN bReptCli) -{ - INT i, j; - UINT32 RegValue; - ULONG DataRate = 0; - struct wtbl_entry tb_entry; - union WTBL_1_DW3 *dw3 = - (union WTBL_1_DW3 *)&tb_entry.wtbl_1.wtbl_1_d3.word; - UINT32 rPseRdTabAccessReg; - BOOLEAN pfgForce; - UCHAR pucPort, pucQueue; - INT Total_Packet_Number = 0; - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - STA_TR_ENTRY *tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid]; - - Total_Packet_Number = 0; - - if (ent_type == ENTRY_NONE) { - /* dump all MacTable entries */ - if (pEntry->EntryType == ENTRY_NONE) - continue; - } else { - /* dump MacTable entries which match the EntryType */ - if (pEntry->EntryType != ent_type) - continue; - - if ((IS_ENTRY_CLIENT(pEntry) || - IS_ENTRY_APCLI(pEntry)) && - (pEntry->Sst != SST_ASSOC)) - continue; - } - - os_zero_mem(&tb_entry, sizeof(tb_entry)); - - if (mt_wtbl_get_entry234(pAd, pEntry->wcid, &tb_entry) == FALSE) - return FALSE; - - RTMP_IO_READ32(pAd, tb_entry.wtbl_addr[0] + 12, &dw3->word); - /* get PSE register */ - /* rPseRdTabAccessReg.field.rd_kick_busy=1; */ - /* rPseRdTabAccessReg.field.rd_tag=pEntry->wcid; */ - rPseRdTabAccessReg = - PSE_RTA_RD_KICK_BUSY | PSE_RTA_TAG(pEntry->wcid); - RTMP_IO_WRITE32(pAd, PSE_RTA, rPseRdTabAccessReg); - - do { - RTMP_IO_READ32(pAd, PSE_RTA, &rPseRdTabAccessReg); - pfgForce = (BOOLEAN)GET_PSE_RTA_RD_RULE_F( - rPseRdTabAccessReg); - pucPort = (UCHAR)GET_PSE_RTA_RD_RULE_PID( - rPseRdTabAccessReg); - pucQueue = (UCHAR)GET_PSE_RTA_RD_RULE_QID( - rPseRdTabAccessReg); - } while (GET_PSE_RTA_RD_KICK_BUSY(rPseRdTabAccessReg) == 1); - - Total_Packet_Number = - Total_Packet_Number + tr_entry->ps_queue.Number; - - for (j = 0; j < WMM_QUE_NUM; j++) - Total_Packet_Number = Total_Packet_Number + - tr_entry->tx_queue[j].Number; - - TRACE_PS_INFO(pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], - pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5], - pEntry->EntryType, pEntry->Aid, - pEntry->func_tb_idx, pEntry->PsMode, - tr_entry->ps_state, dw3->field.i_psm, - dw3->field.du_i_psm, dw3->field.skip_tx, pfgForce, - pucPort, pucQueue, Total_Packet_Number, - tr_entry->ps_queue.Number); - } - - return TRUE; -} - -INT32 TraceTRInfo(RTMP_ADAPTER *pAd) -{ - return TRUE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/unload b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/unload deleted file mode 100644 index cf698b0cd6..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/unload +++ /dev/null @@ -1,2 +0,0 @@ -ifconfig ra0 down -rmmod rt2860ap diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/vr_bdlt.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/vr_bdlt.c deleted file mode 100644 index 66a5abd1c3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/vr_bdlt.c +++ /dev/null @@ -1,62 +0,0 @@ -/**************************************************************************** - * - * Module Name: - * vr_brlt.c - * - * Abstract: - * Only for BroadLight 2348 platform. - * - * Revision History: - * Who When What - * --------- ---------- ---------------------------------------------- - * Sample Lin 01-12-2010 Created - * -***************************************************************************/ - -#define RTMP_MODULE_OS -#define RTMP_MODULE_OS_UTIL - -#define MODULE_BDLT - -/*#include "rt_config.h" */ -#include "rtmp_comm.h" -#include "rt_os_util.h" -#include "rtmp_osabl.h" - -#if defined(PLATFORM_BL2348) || defined(PLATFORM_BL23570) - -/* global variables */ -int (*pToUpperLayerPktSent)(struct sk_buff *pSkb) = netif_rx; -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(pToUpperLayerPktSent); -#endif /* MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ - -/* - * ======================================================================== - * Routine Description: - * Assign the briding function. - * - * Arguments: - * xi_destination_ptr - bridging function - * - * Return Value: - * None - * - * Note: - * The function name must be replace_upper_layer_packet_destination. - * ======================================================================== - */ -VOID replace_upper_layer_packet_destination(VOID *pXiDestination) -{ - MTWF_LOG( - DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ralink broad light> replace_upper_layer_packet_destination\n")); - pToUpperLayerPktSent = pXiDestination; -} /* End of replace_upper_layer_packet_destination */ -#ifndef MT76XX_COMBO_DUAL_DRIVER_SUPPORT -EXPORT_SYMBOL(replace_upper_layer_packet_destination); -#endif /*MT76XX_COMBO_DUAL_DRIVER_SUPPORT */ - -#endif /* PLATFORM_BL2348 */ - -/* End of vr_bdlt.c */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/vr_ikans.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/vr_ikans.c deleted file mode 100644 index 4b3f74bed8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/vr_ikans.c +++ /dev/null @@ -1,275 +0,0 @@ -/**************************************************************************** - * - * Module Name: - * vr_ikans.c - * - * Abstract: - * Only for IKANOS Vx160 or Vx180 platform. - * - * Revision History: - * Who When What - * --------- ---------- ---------------------------------------------- - * Sample Lin 01-28-2008 Created - * -***************************************************************************/ - -#define RTMP_MODULE_OS -#define RTMP_MODULE_OS_UTIL - -#define MODULE_IKANOS - -#include "rt_config.h" -#include -#include -#include -#include -#include -#include - -#ifdef IKANOS_VX_1X0 - -#define IKANOS_PERAP_ID 7 /* IKANOS Fix Peripheral ID */ -#define K0_TO_K1(x) ((unsigned)(x) | 0xA0000000) /* kseg0 to kseg1 */ -/*#define IKANOS_DEBUG */ - -extern INT rt28xx_send_packets(struct sk_buff *skb_p, - struct net_device *net_dev); -static INT32 IKANOS_WlanDataFramesTx(void *_pAdBuf, struct net_device *pNetDev); -static void IKANOS_WlanPktFromAp(apPreHeader_t *pFrame); - -/* --------------------------------- Public -------------------------------- */ - -/* - * ======================================================================== - * Routine Description: - * Init IKANOS fast path function. - * - * Arguments: - * pApMac - the MAC of AP - * - * Return Value: - * None - * - * Note: - * If you want to enable RX fast path, you must call the function. - * ======================================================================== - */ -void VR_IKANOS_FP_Init(UINT8 BssNum, UINT8 *pApMac) -{ - UINT32 i; - UINT8 mac[6]; - - memcpy(mac, pApMac, 6); - - /* add all MAC of multiple BSS */ - for (i = 0; i < BssNum; i++) { - apMacAddrConfig(7, mac, 0xAD); - mac[5]++; - } -} - -/* - * ======================================================================== - * Routine Description: - * Ikanos LAN --> WLAN transmit fast path function. - * - * Arguments: - * skb - the transmitted packet (SKB packet format) - * netdev - our WLAN network device - * - * Return Value: - * ======================================================================== - */ -INT32 IKANOS_DataFramesTx(struct sk_buff *pSkb, struct net_device *pNetDev) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pNetDev->priv; - IkanosWlanTxCbFuncP *fp = &IKANOS_WlanDataFramesTx; - - pSkb->apFlowData.txDev = pNetDev; - pSkb->apFlowData.txApId = IKANOS_PERAP_ID; - pAd->IkanosTxInfo.netdev = pNetDev; - pAd->IkanosTxInfo.fp = fp; - pSkb->apFlowData.txHandle = &(pAd->IkanosTxInfo); - ap2apFlowProcess(pSkb, pNetDev); -#ifdef IKANOS_DEBUG - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ikanos> tx no fp\n")); /* debug use */ -#endif /* IKANOS_DEBUG */ - return rt28xx_send_packets(pSkb, pNetDev); -} - -/* - * ======================================================================== - * Routine Description: - * Ikanos WLAN --> LAN transmit fast path function. - * - * Arguments: - * pAd - WLAN control block - * pRxParam - - * pSkb - the transmitted packet (SKB packet format) - * Length - packet length - * - * Return Value: - * None - * - * Note: - * Because no unsigned long private parameters in apPreHeader_t can be used, - * we use a global variable to record pAd. - * So we can not use multiple card function in Ikanos platform. - * ======================================================================== - */ -PRTMP_ADAPTER pIkanosAd; -void IKANOS_DataFrameRx(RTMP_ADAPTER *pAd, struct sk_buff *pSkb) -{ - apPreHeader_t *apBuf; - void *pRxParam = pSkb->dev; - UINT32 Length = pSkb->len; - UCHAR wdev_idx, mbss_idx; - - apBuf = (apPreHeader_t *)(translateMbuf2Apbuf(pSkb, 0)); - apBuf->flags1 = 1 << AP_FLAG1_IS_ETH_BIT; - wdev_idx = RTMP_GET_PACKET_WDEV(pSkb); - mbss_idx = pAd->wdev_list[wdev_idx]->func_idx; - apBuf->specInfoElement = mbss_idx; /* MBSS */ - pIkanosAd = pAd; - apBuf->flags2 = 0; - apClassify(IKANOS_PERAP_ID, apBuf, (void *)IKANOS_WlanPktFromAp); - dev_kfree_skb(pSkb); -} - -/* --------------------------------- Private -------------------------------- */ - -/* - * ======================================================================== - * Routine Description: - * Ikanos LAN --> WLAN transmit fast path function. - * - * Arguments: - * _pAdBuf - the transmitted packet (Ikanos packet format) - * netdev - our WLAN network device - * - * Return Value: - * ======================================================================== - */ -static INT32 IKANOS_WlanDataFramesTx(void *_pAdBuf, struct net_device *pNetDev) -{ - apPreHeader_t *pApBuf = (apPreHeader_t *)_pAdBuf; - struct sk_buff *sk = NULL; - - sk = (struct sk_buff *)translateApbuf2Mbuf(pApBuf); - - if (sk == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ikanos> translateApbuf2Mbuf returned NULL!\n")); - return 1; - } - - sk->apFlowData.flags2 = 0; - sk->apFlowData.wlanFlags = 0; - sk->protocol = ETH_P_IP; - sk->dev = pNetDev; - sk->priority = 0; - return rt28xx_send_packets(sk, pNetDev); -} - -/* - * ======================================================================== - * Routine Description: - * Get real interface index, used in get_netdev_from_bssid() - * - * Arguments: - * pAd - - * FromWhichBSSID - - * - * Return Value: - * None - * ======================================================================== - */ -static INT32 GetSpecInfoIdxFromBssid(PRTMP_ADAPTER pAd, INT32 FromWhichBSSID) -{ - INT32 IfIdx = MAIN_MBSSID; -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { -#ifdef APCLI_SUPPORT - - if (FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI) - IfIdx = MAX_MBSSID_NUM(pAd) + MAX_WDS_ENTRY; - else -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - if (FromWhichBSSID >= MIN_NET_DEVICE_FOR_WDS) { - INT WdsIndex = FromWhichBSSID - MIN_NET_DEVICE_FOR_WDS; - - IfIdx = MAX_MBSSID_NUM(pAd) + WdsIndex; - } else -#endif /* WDS_SUPPORT */ - { - IfIdx = FromWhichBSSID; - } - } - -#endif /* CONFIG_AP_SUPPORT */ - return IfIdx; /* return one of MBSS */ -} - -/* - * ======================================================================== - * Routine Description: - * Ikanos WLAN --> LAN transmit fast path function. - * - * Arguments: - * pFrame - the received packet (Ikanos packet format) - * - * Return Value: - * None - * - * Note: - * Ikanos platform supports only 8 VAPs - * ======================================================================== - */ -static void IKANOS_WlanPktFromAp(apPreHeader_t *pFrame) -{ - RTMP_ADAPTER *pAd; - struct net_device *dev = NULL; - struct sk_buff *skb; - INT32 index; - apPreHeader_t *apBuf = K0_TO_K1(pFrame); - - pAd = pIkanosAd; - /*index = apBuf->specInfoElement; */ - /*dev = pAd->ApCfg.MBSSID[index].MSSIDDev; */ - index = GetSpecInfoIdxFromBssid(pAd, apBuf->specInfoElement); - dev = get_netdev_from_bssid(pAd, apBuf->specInfoElement); - - if (dev == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ikanos> %s: ERROR null device ***************\n", - __func__)); - return; - } - - skb = (struct sk_buff *)translateApbuf2Mbuf(apBuf); - - if (skb == NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ikanos> %s: skb is null *********************\n", - __func__)) - return; - } - - pAd->IkanosRxInfo[index].netdev = dev; - pAd->IkanosRxInfo[index].fp = &IKANOS_WlanDataFramesTx; - skb->dev = dev; - skb->apFlowData.rxApId = IKANOS_PERAP_ID; - /*skb->apFlowData.txHandle = &(txinforx[index]); */ - skb->apFlowData.rxHandle = &(pAd->IkanosRxInfo[index]); - skb->protocol = eth_type_trans(skb, skb->dev); -#ifdef IKANOS_DEBUG - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("ikanos> rx no fp!\n")); /* debug use */ -#endif /* IKANOS_DEBUG */ - netif_rx(skb); -} - -#endif /* IKANOS_VX_1X0 */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/wbsys_main_dev.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/wbsys_main_dev.c deleted file mode 100644 index fd632bef63..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/os/linux/wbsys_main_dev.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#ifdef RTMP_RBUS_SUPPORT - -#define RTMP_MODULE_OS - -#include "rt_config.h" -#include "os/wbsys_res.h" -#include - -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) -extern int (*ra_classifier_init_func)(void); -extern void (*ra_classifier_release_func)(void); -extern struct proc_dir_entry *proc_ptr, *proc_ralink_wl_video; -#endif - -/* -* -*/ -#ifdef MEM_ALLOC_INFO_SUPPORT - -extern MEM_INFO_LIST MemInfoList; -extern MEM_INFO_LIST PktInfoList; - -static void free_meminfo(void) -{ - UINT32 memalctotal, pktalctotal; - - memalctotal = ShowMemAllocInfo(); - pktalctotal = ShowPktAllocInfo(); - - if ((memalctotal != 0) || (pktalctotal != 0)) { - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Error: Memory leak!!\n")); - ASSERT(0); - } - - MIListExit(&MemInfoList); - MIListExit(&PktInfoList); -} -#endif /* MEM_ALLOC_INFO_SUPPORT */ - -/* -* -*/ -static int wbsys_probe(struct platform_device *pdev) -{ - struct resource *res; - unsigned long base_addr; - unsigned int dev_irq; - struct net_device *net_dev; - int rv; - void *handle = NULL; - RTMP_ADAPTER *pAd; - RTMP_OS_NETDEV_OP_HOOK netDevHook; - unsigned int Value; - - /*resource allocate*/ - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - dev_irq = platform_get_irq(pdev, 0); - base_addr = (unsigned long)devm_ioremap(&pdev->dev, res->start, - resource_size(res)); - MTWF_LOG(DBG_CAT_INIT, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s(): irq=%d,base_addr=%lx\n", __func__, dev_irq, - base_addr)); - - if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("set DMA mask failed!errno=%d\n", rv)); - goto err_out; - } - - /*other global resource allocation*/ -#ifdef MEM_ALLOC_INFO_SUPPORT - MemInfoListInital(); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - /* RtmpDevInit */ - /* Allocate RTMP_ADAPTER adapter structure */ - os_alloc_mem(NULL, (UCHAR **)&handle, sizeof(struct os_cookie)); - - if (!handle) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("Allocate memory for os_cookie failed!\n")); - goto err_out; - } - - os_zero_mem(handle, sizeof(struct os_cookie)); -#ifdef OS_ABL_FUNC_SUPPORT - /* get DRIVER operations */ - RTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, NULL, NULL, NULL); -#endif /* OS_ABL_FUNC_SUPPORT */ - rv = RTMPAllocAdapterBlock(handle, (VOID **)&pAd); - - if (rv != NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - (" RTMPAllocAdapterBlock != NDIS_STATUS_SUCCESS\n")); - os_free_mem(handle); - goto err_out; - } - - /* Here are the RTMP_ADAPTER structure with rbus-bus specific parameters. */ - pAd->PciHif.CSRBaseAddress = (PUCHAR)base_addr; - RTMP_IO_READ32(pAd, TOP_HCR, &Value); - pAd->ChipID = Value; - /*link platform dev to pAd*/ - ((POS_COOKIE)handle)->pci_dev = (void *)pdev; - /*link platform dev to pAd*/ - ((POS_COOKIE)handle)->pDev = &pdev->dev; - RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_RBUS); - /*Prepare netdev for wifi dev, NetDevInit */ - net_dev = RtmpPhyNetDevInit(pAd, &netDevHook); - - if (net_dev == NULL) - goto err_out_free_radev; - - /* Interrupt IRQ number */ - net_dev->irq = dev_irq; - /* Save CSR virtual address and irq to device structure */ - net_dev->base_addr = base_addr; - /*link net_dev to platform_dev*/ - platform_set_drvdata(pdev, net_dev); - /*link platform_dev to net_dev*/ - SET_NETDEV_DEV(net_dev, &pdev->dev); - /*All done, it's time to register the net device to kernel. */ - rv = RtmpOSNetDevAttach(pAd->OpMode, net_dev, &netDevHook); - - if (rv) { - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("failed to call RtmpOSNetDevAttach(), rv=%d!\n", rv)); - goto err_out_free_netdev; - } - - wl_proc_init(); - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, - ("%s: at CSR addr 0x%lx, IRQ %ld.\n", net_dev->name, - (ULONG)base_addr, (long int)net_dev->irq)); - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_TRACE, ("<=== wifi probe\n")); -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) - proc_ptr = proc_ralink_wl_video; - - if (ra_classifier_init_func != NULL) - ra_classifier_init_func(); - -#endif - return 0; -err_out_free_netdev: - RtmpOSNetDevFree(net_dev); -#ifdef MEM_ALLOC_INFO_SUPPORT - free_meminfo(); -#endif /* MEM_ALLOC_INFO_SUPPORT */ -err_out_free_radev: - /* free RTMP_ADAPTER strcuture and os_cookie*/ - RTMPFreeAdapter(pAd); -err_out: - return -ENODEV; -} - -/* -* -*/ -static int wbsys_remove(struct platform_device *pdev) -{ - struct net_device *net_dev = platform_get_drvdata(pdev); - RTMP_ADAPTER *pAd; - - if (net_dev == NULL) - return -ENODEV; - - /* pAd = net_dev->priv*/ - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd != NULL) { - RtmpPhyNetDevExit(pAd, net_dev); - RtmpRaDevCtrlExit(pAd); - } else - RtmpOSNetDevDetach(net_dev); - - /* Free the root net_device. */ - RtmpOSNetDevFree(net_dev); -#if defined(CONFIG_RA_CLASSIFIER) && (!defined(CONFIG_RA_CLASSIFIER_MODULE)) - proc_ptr = proc_ralink_wl_video; - - if (ra_classifier_release_func != NULL) - ra_classifier_release_func(); - -#endif - wl_proc_exit(); -#ifdef MEM_ALLOC_INFO_SUPPORT - free_meminfo(); -#endif /* MEM_ALLOC_INFO_SUPPORT */ - return 0; -} - -static int wbsys_suspend(struct platform_device *pdev, pm_message_t state) -{ - INT32 retval = 0; - struct net_device *net_dev = platform_get_drvdata(pdev); - VOID *pAd = NULL; - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("===>%s()\n", __func__)); - - if (net_dev == NULL) - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("net_dev == NULL!\n")); - else { - UINT32 IfNum; - - GET_PAD_FROM_NET_DEV(pAd, net_dev); - /* we can not use IFF_UP because ra0 down but ra1 up */ - /* and 1 suspend/resume function for 1 module, not for each interface */ - /* so Linux will call suspend/resume function once */ - RTMP_DRIVER_VIRTUAL_INF_NUM_GET(pAd, &IfNum); - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("%s::IfNum=%d\n", __func__, IfNum)); - - if (IfNum > 0) { - /* avoid users do suspend after interface is down */ - /* stop interface */ - netif_carrier_off(net_dev); - netif_stop_queue(net_dev); - /* mark device as removed from system and therefore no longer available */ - netif_device_detach(net_dev); - RTMP_DRIVER_RBUS_SUSPEND(pAd); - RT_MOD_HNAT_DEREG(net_dev); - RT_MOD_DEC_USE_COUNT(); - } - } - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("<===%s()\n", __func__)); - return retval; -} - -static int wbsys_resume(struct platform_device *pdev) -{ - struct net_device *net_dev = platform_get_drvdata(pdev); - VOID *pAd = NULL; - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("===>%s()\n", __func__)); - - if (net_dev == NULL) - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("net_dev == NULL!\n")); - else - GET_PAD_FROM_NET_DEV(pAd, net_dev); - - if (pAd != NULL) { - UINT32 IfNum; - /* - * we can not use IFF_UP because ra0 down but ra1 up - * and 1 suspend/resume function for 1 module, not for each interface - * so Linux will call suspend/resume function once - */ - RTMP_DRIVER_VIRTUAL_INF_NUM_GET(pAd, &IfNum); - - if (IfNum > 0) { - /* mark device as attached from system and restart if needed */ - netif_device_attach(net_dev); - /* increase MODULE use count */ - RT_MOD_INC_USE_COUNT(); - RT_MOD_HNAT_REG(net_dev); - RTMP_DRIVER_RBUS_RESUME(pAd); - netif_start_queue(net_dev); - netif_carrier_on(net_dev); - netif_wake_queue(net_dev); - } - } - - MTWF_LOG(DBG_CAT_HIF, CATHIF_PCI, DBG_LVL_ERROR, - ("<=== %s()\n", __func__)); - return 0; -} - -/* -* global resource preparing -*/ -static struct platform_driver wbsys_driver = { - .probe = wbsys_probe, - .remove = wbsys_remove, -#ifdef CONFIG_PM - .suspend = wbsys_suspend, - .resume = wbsys_resume, -#endif /* CONFIG_PM */ - .driver = { - .name = wbsys_string, - .owner = THIS_MODULE, -#ifdef CONFIG_OF - .of_match_table = wbsys_of_ids, -#endif /*CONFIG_OF*/ - }, -}; - -/* -* - */ -int __init wbsys_module_init(void) -{ - int ret; - - wbsys_dev_alloc(&wbsys_dev); - ret = platform_driver_register(&wbsys_driver); - return ret; -} - -VOID __exit wbsys_module_exit(void) -{ - wbsys_dev_release(&wbsys_dev); - platform_driver_unregister(&wbsys_driver); -} - -#ifndef MULTI_INF_SUPPORT -module_init(wbsys_module_init); -module_exit(wbsys_module_exit); - -MODULE_DESCRIPTION("Register for MTK WIFI driver HIF is internal bus"); -MODULE_SUPPORTED_DEVICE("mtk wbsys platform driver"); -#endif - -#endif /* RTMP_RBUS_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/mt_phy.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/mt_phy.c deleted file mode 100644 index bc34524a79..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/mt_phy.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_phy.c -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "mt_phy.tmh" -#endif -#else -#include "rt_config.h" -#endif - -/*define local variable*/ -static struct phy_ops MtPhyOp; - -static INT32 MTBbpInit(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Init BBP Registers\n", __func__)); - - if (ops->AsicBbpInit != NULL) - ops->AsicBbpInit(pAd); - - return NDIS_STATUS_SUCCESS; -} - -INT32 MTShowPartialBBP(RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End) -{ - UINT32 Offset, Value; - - for (Offset = Start; Offset <= End; Offset += 4) { - PHY_IO_READ32(pAd, Offset, &Value); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():0x%04x 0x%08x\n", __func__, Offset, Value)); - } - - return TRUE; -} - -INT32 MTShowAllBBP(RTMP_ADAPTER *pAd) -{ - UINT32 Offset, Value; - - for (Offset = 0x10000; Offset <= 0x20000; Offset += 4) { - PHY_IO_READ32(pAd, Offset, &Value); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():0x%04x 0x%08x\n", __func__, Offset, Value)); - } - - return TRUE; -} - -#ifdef SMART_CARRIER_SENSE_SUPPORT -INT MTSmartCarrierSense(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - if (ops->SmartCarrierSense != NULL) - ops->SmartCarrierSense(pAd); - - return NDIS_STATUS_SUCCESS; -} -#endif /* SMART_CARRIER_SENSE_SUPPORT */ - -static VOID mt_phy_ops(VOID) -{ - os_zero_mem(&MtPhyOp, sizeof(struct phy_ops)); - MtPhyOp.bbp_init = MTBbpInit; - MtPhyOp.bbp_set_bw = NULL; - MtPhyOp.ShowPartialBBP = MTShowPartialBBP; - MtPhyOp.ShowAllBBP = MTShowAllBBP; - MtPhyOp.ShowPartialRF = MTShowPartialRF; - MtPhyOp.ShowAllRF = MTShowAllRF; -#ifdef CONFIG_AP_SUPPORT - MtPhyOp.AutoCh = MTAPAutoSelectChannel; -#endif /*CONFIG_AP_SUPPORT*/ -#ifdef SMART_CARRIER_SENSE_SUPPORT - MtPhyOp.Smart_Carrier_Sense = MTSmartCarrierSense; -#endif /* SMART_CARRIER_SENSE_SUPPORT */ -} - -INT mt_phy_probe(RTMP_ADAPTER *pAd) -{ - mt_phy_ops(); - pAd->phy_op = &MtPhyOp; - - return TRUE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/mt_rf.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/mt_rf.c deleted file mode 100644 index 594eaaa43f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/mt_rf.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - mt_rf.c -*/ -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "mt_rf.tmh" -#endif -#else -#include "rt_config.h" -#endif - -INT32 MTShowPartialRF(RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End) -{ -#ifdef COMPOS_WIN -#else - UINT32 RFIdx, Offset, Value; - -#ifdef MT_MAC - for (RFIdx = 0; RFIdx < pAd->Antenna.field.TxPath; RFIdx++) { - for (Offset = Start; Offset <= End; Offset = Offset + 4) { - MtCmdRFRegAccessRead(pAd, RFIdx, Offset, &Value); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():%d 0x%04x 0x%08x\n", __func__, RFIdx, - Offset, Value)); - } - } -#endif /* MT_MAC */ -#endif - return TRUE; -} - -INT32 MTShowAllRF(RTMP_ADAPTER *pAd) -{ -#ifdef COMPOS_WIN -#else - UINT32 RFIdx, Offset, Value; - -#ifdef MT_MAC - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - for (RFIdx = 0; RFIdx < pAd->Antenna.field.TxPath; RFIdx++) { - for (Offset = 0; Offset <= (cap->MaxNumOfRfId * 4); - Offset = Offset + 4) { - MtCmdRFRegAccessRead(pAd, RFIdx, Offset, &Value); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s():%d 0x%04x 0x%08x\n", __func__, RFIdx, - Offset, Value)); - } - } -#endif /* MT_MAC */ -#endif - return TRUE; -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/phy.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/phy.c deleted file mode 100644 index b4032279bc..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/phy.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2004, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - - Abstract: - - Revision History: - who When What - -------- ---------- ---------------------------------------------- -*/ -#ifdef COMPOS_WIN -#include "MTConfig.h" -#if defined(EVENT_TRACING) -#include "phy.tmh" -#endif -#else -#include "rt_config.h" -#endif - -INT phy_probe(RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -NDIS_STATUS NICInitBBP(RTMP_ADAPTER *pAd) -{ - /* Before program BBP, we need to wait BBP/RF get wake up.*/ -#ifdef MT_MAC - if (IS_HIF_TYPE(pAd, HIF_MT)) { - if (MtAsicWaitMacTxRxIdle(pAd) == FALSE) - return NDIS_STATUS_FAILURE; - } -#endif - - if (pAd->phy_op && pAd->phy_op->bbp_init) - return pAd->phy_op->bbp_init(pAd); - else - return NDIS_STATUS_FAILURE; -} - -VOID AsicBBPAdjust(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - /* TODO: shiang-6590, now this function only used for AP mode, why we need this differentation? */ - if (ops->ChipBBPAdjust != NULL) - ops->ChipBBPAdjust(pAd, Channel); -} - -INT bbp_get_temp(struct _RTMP_ADAPTER *pAd, CHAR *temp_val) -{ - if (pAd->phy_op && pAd->phy_op->bbp_get_temp) - return pAd->phy_op->bbp_get_temp(pAd, temp_val); - else - return FALSE; -} - -INT bbp_tx_comp_init(RTMP_ADAPTER *pAd, INT adc_insel, INT tssi_mode) -{ - if (pAd->phy_op && pAd->phy_op->bbp_tx_comp_init) - return pAd->phy_op->bbp_tx_comp_init(pAd, adc_insel, tssi_mode); - else - return FALSE; -} - -INT bbp_set_txdac(struct _RTMP_ADAPTER *pAd, INT tx_dac) -{ - if (pAd->phy_op && pAd->phy_op->bbp_set_txdac) - return pAd->phy_op->bbp_set_txdac(pAd, tx_dac); - else - return FALSE; -} - -INT bbp_set_rxpath(struct _RTMP_ADAPTER *pAd, INT rxpath) -{ - if (pAd->phy_op && pAd->phy_op->bbp_set_rxpath) - return pAd->phy_op->bbp_set_rxpath(pAd, rxpath); - else - return FALSE; -} - -INT bbp_set_ctrlch(struct _RTMP_ADAPTER *pAd, UINT8 ext_ch) -{ - if (pAd->phy_op && pAd->phy_op->bbp_set_ctrlch) - return pAd->phy_op->bbp_set_ctrlch(pAd, ext_ch); - else - return FALSE; -} - -INT bbp_set_bw(struct _RTMP_ADAPTER *pAd, UINT8 bw, UCHAR BandIdx) -{ - INT result = FALSE; - - if (pAd->phy_op && pAd->phy_op->bbp_set_bw) - result = pAd->phy_op->bbp_set_bw(pAd, bw); - - if (result == TRUE) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Set PhyBW as %sHz.l\n", __func__, - get_bw_str(bw))); - } - - return result; -} - -INT bbp_set_mmps(struct _RTMP_ADAPTER *pAd, BOOLEAN ReduceCorePower) -{ - if (pAd->phy_op && pAd->phy_op->bbp_set_mmps) - return pAd->phy_op->bbp_set_mmps(pAd, ReduceCorePower); - else - return FALSE; -} - -INT bbp_get_agc(struct _RTMP_ADAPTER *pAd, CHAR *agc, RX_CHAIN_IDX chain) -{ - if (pAd->phy_op && pAd->phy_op->bbp_get_agc) - return pAd->phy_op->bbp_get_agc(pAd, agc, chain); - else - return FALSE; -} - -INT bbp_set_agc(struct _RTMP_ADAPTER *pAd, UCHAR agc, RX_CHAIN_IDX chain) -{ - if (pAd->phy_op && pAd->phy_op->bbp_set_agc) - return pAd->phy_op->bbp_set_agc(pAd, agc, chain); - else - return FALSE; -} - -INT filter_coefficient_ctrl(RTMP_ADAPTER *pAd, UCHAR Channel) -{ - if (pAd->phy_op && pAd->phy_op->filter_coefficient_ctrl) - return pAd->phy_op->filter_coefficient_ctrl(pAd, Channel); - else - return FALSE; -} - -UCHAR get_random_seed_by_phy(RTMP_ADAPTER *pAd) -{ - if (pAd->phy_op && pAd->phy_op->get_random_seed_by_phy) - return pAd->phy_op->get_random_seed_by_phy(pAd); - else - return 0; -} - -INT bbp_is_ready(struct _RTMP_ADAPTER *pAd) -{ - if (pAd->phy_op && pAd->phy_op->bbp_is_ready) - return pAd->phy_op->bbp_is_ready(pAd); - else - return FALSE; -} - -INT phy_rrm_adjust(struct _RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT phy_rrm_request(struct _RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -INT phy_rrm_init(struct _RTMP_ADAPTER *pAd) -{ - return TRUE; -} - -#ifdef DYNAMIC_VGA_SUPPORT -INT dynamic_vga_enable(RTMP_ADAPTER *pAd) -{ - if (pAd->phy_op && pAd->phy_op->dynamic_vga_enable) - return pAd->phy_op->dynamic_vga_enable(pAd); - else - return FALSE; -} - -INT dynamic_vga_disable(RTMP_ADAPTER *pAd) -{ - if (pAd->phy_op && pAd->phy_op->dynamic_vga_disable) - return pAd->phy_op->dynamic_vga_disable(pAd); - else - return FALSE; -} - -INT dynamic_vga_adjust(RTMP_ADAPTER *pAd) -{ - if (pAd->phy_op && pAd->phy_op->dynamic_vga_adjust) - return pAd->phy_op->dynamic_vga_adjust(pAd); - else - return FALSE; -} -#endif /* DYNAMIC_VGA_SUPPORT */ - -INT32 ShowPartailBBP(RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End) -{ - if (pAd->phy_op && pAd->phy_op->ShowPartialBBP) - return pAd->phy_op->ShowPartialBBP(pAd, Start, End); - else - return FALSE; -} - -INT32 ShowAllBBP(RTMP_ADAPTER *pAd) -{ - if (pAd->phy_op && pAd->phy_op->ShowAllBBP) - return pAd->phy_op->ShowAllBBP(pAd); - else - return FALSE; -} - -INT32 ShowAllRF(RTMP_ADAPTER *pAd) -{ - if (pAd->phy_op && pAd->phy_op->ShowAllRF) - return pAd->phy_op->ShowAllRF(pAd); - else - return FALSE; -} - -INT32 ShowPartialRF(RTMP_ADAPTER *pAd, UINT32 Start, UINT32 End) -{ - if (pAd->phy_op && pAd->phy_op->ShowPartialRF) - return pAd->phy_op->ShowPartialRF(pAd, Start, End); - else - return FALSE; -} - -#ifdef SMART_CARRIER_SENSE_SUPPORT -INT Smart_Carrier_Sense(RTMP_ADAPTER *pAd) -{ - if (pAd->phy_op && pAd->phy_op->Smart_Carrier_Sense) - return pAd->phy_op->Smart_Carrier_Sense(pAd); - else - return FALSE; -} -#endif /* SMART_CARRIER_SENSE_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/rf.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/rf.c deleted file mode 100644 index 78f202c09f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/rf.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - rf.c -*/ - -#include "rt_config.h" - -VOID InitRFRegisters(RTMP_ADAPTER *pAd) -{ - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): Init RF Registers\n", __func__)); - if (ops->AsicRfInit) - ops->AsicRfInit(pAd); -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/rlm_cal_cache.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/rlm_cal_cache.c deleted file mode 100644 index 399b254913..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/phy/rlm_cal_cache.c +++ /dev/null @@ -1,465 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - rlm_cal_cache.c -*/ - -/*#include "rtmp_type.h" */ -/*#include "os/rt_linux.h" */ -/*#include "common/mt_os_util.h" */ - -#include "rt_config.h" -#include "phy/rlm_cal_cache.h" - -INT rlmCalCacheDone(VOID *rlmCalCache) -{ - return RLM_CAL_CACHE_IS_DONE(rlmCalCache); -} - -INT rlmCalCacheInit(VOID *pAd, VOID **ppRlmCalCache) -{ - if (os_alloc_mem(pAd, (UCHAR **)ppRlmCalCache, sizeof(RLM_CAL_CACHE)) != - NDIS_STATUS_SUCCESS) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fail to alloca rlmCalCache size=%zu\n", - sizeof(RLM_CAL_CACHE))); - return FALSE; - } - os_zero_mem(*ppRlmCalCache, sizeof(RLM_CAL_CACHE)); - - return TRUE; -} - -INT rlmCalCacheDeinit(VOID **ppRlmCalCache) -{ - if (*ppRlmCalCache == NULL) - return FALSE; - - os_free_mem(*ppRlmCalCache); - *ppRlmCalCache = NULL; - return TRUE; -} - -INT RlmCalCacheTxLpfInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length) -{ - P_TXLPF_CAL_INFO_T ptxLpfCalInfo; - UINT32 i; - if (Length != sizeof(TXLPF_CAL_INFO_T)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("P_TXLPF_CAL_INFO_T: length mismatch=%d\n", Length)); - - return FALSE; - } - //hex_dump("P_TXLPF_CAL_INFO", Data, Length); - - if (rlmCalCtrl == NULL) - return FALSE; - ptxLpfCalInfo = (P_TXLPF_CAL_INFO_T)Data; - ptxLpfCalInfo->u2BitMap = le2cpu16(ptxLpfCalInfo->u2BitMap); - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM; i++) - ptxLpfCalInfo->au4Data[i] = le2cpu32(ptxLpfCalInfo->au4Data[i]); - - os_move_mem((PVOID)&RLM_CAL_CACHE_TXLPF_CAL_INFO(rlmCalCtrl), Data, - Length); - RLM_CAL_CACHE_TXLPF_CAL_DONE(rlmCalCtrl); - - return TRUE; -} - -INT RlmCalCacheTxIqInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length) -{ - P_TXIQ_CAL_INFO_T ptxIqCalInfo; - UINT32 i; - if (Length != sizeof(TXIQ_CAL_INFO_T)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("P_TXIQ_CAL_INFO_T: length mismatch=%d\n", Length)); - - return FALSE; - } - //hex_dump("P_TXIQ_CAL_INFO", Data, Length); - - if (rlmCalCtrl == NULL) - return FALSE; - ptxIqCalInfo = (P_TXIQ_CAL_INFO_T)Data; - ptxIqCalInfo->u2BitMap = le2cpu16(ptxIqCalInfo->u2BitMap); - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 6; i++) - ptxIqCalInfo->au4Data[i] = le2cpu32(ptxIqCalInfo->au4Data[i]); - - os_move_mem((PVOID)&RLM_CAL_CACHE_TXIQ_CAL_INFO(rlmCalCtrl), Data, - Length); - RLM_CAL_CACHE_TXIQ_CAL_DONE(rlmCalCtrl); - - return TRUE; -} - -INT RlmCalCacheTxDcInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length) -{ - P_TXDC_CAL_INFO_T ptxDcCalInfo; - UINT32 i; - if (Length != sizeof(TXDC_CAL_INFO_T)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("P_TXDC_CAL_INFO_T: length mismatch=%d\n", Length)); - - return FALSE; - } - //hex_dump("P_TXDC_CAL_INFO", Data, Length); - - if (rlmCalCtrl == NULL) - return TRUE; - ptxDcCalInfo = (P_TXDC_CAL_INFO_T)Data; - ptxDcCalInfo->u2BitMap = le2cpu16(ptxDcCalInfo->u2BitMap); - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 6; i++) - ptxDcCalInfo->au4Data[i] = le2cpu32(ptxDcCalInfo->au4Data[i]); - - os_move_mem((PVOID)&RLM_CAL_CACHE_TXDC_CAL_INFO(rlmCalCtrl), Data, - Length); - RLM_CAL_CACHE_TXDC_CAL_DONE(rlmCalCtrl); - - return TRUE; -} - -INT RlmCalCacheRxFiInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length) -{ - P_RXFI_CAL_INFO_T rxfi_event; - UINT32 i; - - if (Data == NULL) - return FALSE; - - if (Length != sizeof(RXFI_CAL_INFO_T)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("P_RXFI_CAL_INFO_T: length mismatch=%d\n", Length)); - - return FALSE; - } - - rxfi_event = (P_RXFI_CAL_INFO_T)Data; - - //hex_dump("P_RXFI_CAL_INFO", Data, Length); - - if (rlmCalCtrl == NULL) - return FALSE; - /*os_move_mem((PVOID)RLM_CAL_CACHE_RXFI_CAL_INFO(rlmCalCtrl).au4Data, - rxfi_event->au4Data, sizeof(rxfi_event->au4Data));*/ - rxfi_event->u2BitMap = le2cpu16(rxfi_event->u2BitMap); - for (i = 0; i < CHANNEL_GROUP_NUM * SCN_NUM * 4; i++) - rxfi_event->au4Data[i] = le2cpu32(rxfi_event->au4Data[i]); - - os_move_mem((PVOID)&RLM_CAL_CACHE_RXFI_CAL_INFO(rlmCalCtrl), Data, - Length); - - RLM_CAL_CACHE_RXFI_CAL_DONE(rlmCalCtrl); - - return TRUE; -} - -INT RlmCalCacheRxFdInfo(VOID *rlmCalCtrl, UINT8 *Data, UINT32 Length) -{ - P_RXFD_CAL_INFO_T rxfd_event; - UINT32 ch_group_id, i; - - if (Data == NULL) - return FALSE; - - if (Length != sizeof(RXFD_CAL_INFO_T)) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("P_RXFD_CAL_INFO_T: length mismatch=%d\n", Length)); - - return FALSE; - } - - rxfd_event = (P_RXFD_CAL_INFO_T)Data; - rxfd_event->u4ChGroupId = le2cpu32(rxfd_event->u4ChGroupId); - ch_group_id = rxfd_event->u4ChGroupId; - rxfd_event->u2BitMap = le2cpu16(rxfd_event->u2BitMap); - for (i = 0; i < (SCN_NUM * RX_SWAGC_LNA_NUM) + - (SCN_NUM * RX_FDIQ_LPF_GAIN_NUM * - RX_FDIQ_TABLE_SIZE * 3); - i++) - rxfd_event->au4Data[i] = le2cpu32(rxfd_event->au4Data[i]); - - //hex_dump("P_RXFD_CAL_INFO", Data, Length); - - if (rlmCalCtrl == NULL) - return FALSE; - - if (rxfd_event->u4ChGroupId >= CHANNEL_GROUP_NUM) - return FALSE; - - /*os_move_mem((PVOID)(RLM_CAL_CACHE_RXFD_CAL_INFO(rlmCalCtrl, rxfd_event->u4ChGroupId).au4Data), - rxfd_event->au4Data, sizeof(rxfd_event->au4Data));*/ - os_move_mem((PVOID)(&RLM_CAL_CACHE_RXFD_CAL_INFO( - rlmCalCtrl, rxfd_event->u4ChGroupId)), - Data, Length); - - RLM_CAL_CACHE_RXFD_CAL_DONE(rlmCalCtrl, rxfd_event->u4ChGroupId); - - return TRUE; -} - -VOID rlmCalCacheStatus(VOID *rlmCalCache) -{ - UINT idx; - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxLPF Cal Done::(%c)\n", - RLM_CAL_CACHE_IS_TXLPF_CAL_DONE(rlmCalCache) ? 'T' : 'F')); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxIQ Cal Done::(%c)\n", - RLM_CAL_CACHE_IS_TXIQ_CAL_DONE(rlmCalCache) ? 'T' : 'F')); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxDC Cal Done::(%c)\n", - RLM_CAL_CACHE_IS_TXDC_CAL_DONE(rlmCalCache) ? 'T' : 'F')); - - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxFI Cal Done::(%c)\n", - RLM_CAL_CACHE_IS_RXFI_CAL_DONE(rlmCalCache) ? 'T' : 'F')); - - for (idx = 0; idx < 9; idx++) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxFD(%d) Cal Done::(%c)\n", idx, - RLM_CAL_CACHE_IS_RXFD_CAL_DONE(rlmCalCache, idx) ? - 'T' : - 'F')); - } - - /* return; */ -} - -VOID rlmCalCacheDump(VOID *rlmCalCache) -{ - UINT idx; - - if (RLM_CAL_CACHE_IS_TXLPF_CAL_DONE(rlmCalCache)) - hex_dump("TxLpf", - (UCHAR *)(RLM_CAL_CACHE_TXLPF_CAL_INFO(rlmCalCache) - .au4Data), - sizeof(RLM_CAL_CACHE_TXLPF_CAL_INFO(rlmCalCache) - .au4Data)); - - if (RLM_CAL_CACHE_IS_TXIQ_CAL_DONE(rlmCalCache)) - hex_dump("TxIq", - (UCHAR *)(RLM_CAL_CACHE_TXIQ_CAL_INFO(rlmCalCache) - .au4Data), - sizeof(RLM_CAL_CACHE_TXIQ_CAL_INFO(rlmCalCache) - .au4Data)); - - if (RLM_CAL_CACHE_IS_TXDC_CAL_DONE(rlmCalCache)) - hex_dump("TxDc", - (UCHAR *)(RLM_CAL_CACHE_TXDC_CAL_INFO(rlmCalCache) - .au4Data), - sizeof(RLM_CAL_CACHE_TXDC_CAL_INFO(rlmCalCache) - .au4Data)); - - if (RLM_CAL_CACHE_IS_RXFI_CAL_DONE(rlmCalCache)) - hex_dump("RxFi", - (UCHAR *)(RLM_CAL_CACHE_RXFI_CAL_INFO(rlmCalCache) - .au4Data), - sizeof(RLM_CAL_CACHE_RXFI_CAL_INFO(rlmCalCache) - .au4Data)); - - for (idx = 0; idx < 9; idx++) { - if (RLM_CAL_CACHE_IS_RXFD_CAL_DONE(rlmCalCache, idx)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("RxFD(%d)\n", idx)); - hex_dump("RxFd", - (UCHAR *)(RLM_CAL_CACHE_RXFD_CAL_INFO( - rlmCalCache, idx) - .au4Data), - sizeof(RLM_CAL_CACHE_RXFD_CAL_INFO(rlmCalCache, - idx) - .au4Data)); - } - } - - /*return;*/ -} -#ifdef PRE_CAL_MT7622_SUPPORT -INT TxLpfCalInfoAlloc_7622(RTMP_ADAPTER *pAd, VOID **pptr) -{ - P_TXLPF_CAL_INFO_MT7622_T pTxLpfCalInfo; - if (IS_MT7622(pAd)) { - if (os_alloc_mem(pAd, (UCHAR **)&pTxLpfCalInfo, - sizeof(TXLPF_CAL_INFO_MT7622_T)) != - NDIS_STATUS_SUCCESS) - return 0; - - *pptr = pTxLpfCalInfo; - os_zero_mem(pTxLpfCalInfo, sizeof(TXLPF_CAL_INFO_MT7622_T)); - os_move_mem(pTxLpfCalInfo->au4Data, pAd->CalTXLPFGImage, - CAL_TXLPFG_SIZE); - } - return sizeof(TXLPF_CAL_INFO_MT7622_T); -} - -INT TxDcIqCalInfoAlloc_7622(RTMP_ADAPTER *pAd, VOID **pptr) -{ - P_TXDCIQ_CAL_INFO_T pTxDcIqCalInfo; - - if (IS_MT7622(pAd)) { - if (os_alloc_mem(pAd, (UCHAR **)&pTxDcIqCalInfo, - sizeof(TXDCIQ_CAL_INFO_T)) != - NDIS_STATUS_SUCCESS) - return 0; - - *pptr = pTxDcIqCalInfo; - os_zero_mem(pTxDcIqCalInfo, sizeof(TXDCIQ_CAL_INFO_T)); - os_move_mem(pTxDcIqCalInfo->au4Data, pAd->CalTXDCIQImage, - CAL_TXDCIQ_SIZE); - } - return sizeof(TXDCIQ_CAL_INFO_T); -} - -INT TxDpdCalInfoAlloc_7622(RTMP_ADAPTER *pAd, VOID **pptr, UINT32 chan) -{ - P_TXDPD_CAL_INFO_T pTxDpdCalInfo; - - if (os_alloc_mem(pAd, (UCHAR **)&pTxDpdCalInfo, - sizeof(TXDPD_CAL_INFO_T)) != NDIS_STATUS_SUCCESS) - return 0; - - if (IS_MT7622(pAd)) { - *pptr = pTxDpdCalInfo; - os_zero_mem(pTxDpdCalInfo, sizeof(TXDPD_CAL_INFO_T)); - pTxDpdCalInfo->u4Chan = chan; - os_move_mem(pTxDpdCalInfo->au4Data, - pAd->CalTXDPDImage + - CAL_TXDPD_PERCHAN_SIZE * (chan - 1), - CAL_TXDPD_PERCHAN_SIZE); - } - return sizeof(TXDPD_CAL_INFO_T); -} -#endif /* PRE_CAL_MT7622_SUPPORT */ - -INT TxLpfCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr) -{ - P_TXLPF_CAL_INFO_T pTxLpfCalInfo; - - if (!RLM_CAL_CACHE_IS_TXLPF_CAL_DONE(rlmCalCache)) - return 0; - - if (os_alloc_mem(pAd, (UCHAR **)&pTxLpfCalInfo, - sizeof(TXLPF_CAL_INFO_T)) != NDIS_STATUS_SUCCESS) - return 0; - - *pptr = pTxLpfCalInfo; - os_zero_mem(pTxLpfCalInfo, sizeof(TXLPF_CAL_INFO_T)); - /*os_move_mem(pTxLpfCalInfo->au4Data, RLM_CAL_CACHE_TXLPF_CAL_INFO(rlmCalCache).au4Data, - sizeof(RLM_CAL_CACHE_TXLPF_CAL_INFO(rlmCalCache).au4Data));*/ - os_move_mem(pTxLpfCalInfo, &RLM_CAL_CACHE_TXLPF_CAL_INFO(rlmCalCache), - sizeof(TXLPF_CAL_INFO_T)); - return sizeof(TXLPF_CAL_INFO_T); -} - -INT TxIqCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr) -{ - P_TXIQ_CAL_INFO_T pTxIqCalInfo; - - if (!RLM_CAL_CACHE_IS_TXIQ_CAL_DONE(rlmCalCache)) - return 0; - - if (os_alloc_mem(pAd, (UCHAR **)&pTxIqCalInfo, - sizeof(TXIQ_CAL_INFO_T)) != NDIS_STATUS_SUCCESS) - return 0; - - *pptr = pTxIqCalInfo; - os_zero_mem(pTxIqCalInfo, sizeof(TXIQ_CAL_INFO_T)); - /*os_move_mem(pTxIqCalInfo->au4Data, &(RLM_CAL_CACHE_TXIQ_CAL_INFO(rlmCalCache).au4Data), - sizeof(RLM_CAL_CACHE_TXIQ_CAL_INFO(rlmCalCache).au4Data));*/ - os_move_mem(pTxIqCalInfo, &RLM_CAL_CACHE_TXIQ_CAL_INFO(rlmCalCache), - sizeof(TXIQ_CAL_INFO_T)); - - return sizeof(TXIQ_CAL_INFO_T); -} - -INT TxDcCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr) -{ - P_TXDC_CAL_INFO_T pTxDcCalInfo; - - if (!RLM_CAL_CACHE_IS_TXDC_CAL_DONE(rlmCalCache)) - return 0; - - if (os_alloc_mem(pAd, (UCHAR **)&pTxDcCalInfo, - sizeof(TXDC_CAL_INFO_T)) != NDIS_STATUS_SUCCESS) - return 0; - - *pptr = pTxDcCalInfo; - os_zero_mem(pTxDcCalInfo, sizeof(TXDC_CAL_INFO_T)); - /*os_move_mem(pTxDcCalInfo->au4Data, RLM_CAL_CACHE_TXDC_CAL_INFO(rlmCalCache).au4Data, - sizeof(RLM_CAL_CACHE_TXDC_CAL_INFO(rlmCalCache).au4Data));*/ - os_move_mem(pTxDcCalInfo, &RLM_CAL_CACHE_TXDC_CAL_INFO(rlmCalCache), - sizeof(TXDC_CAL_INFO_T)); - - return sizeof(TXDC_CAL_INFO_T); -} - -INT RxFiCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr) -{ - P_RXFI_CAL_INFO_T pRxFiCalInfo = NULL; - - if (!RLM_CAL_CACHE_IS_RXFI_CAL_DONE(rlmCalCache)) - return 0; - - if (os_alloc_mem(pAd, (UCHAR **)&pRxFiCalInfo, - sizeof(RXFI_CAL_INFO_T)) != NDIS_STATUS_SUCCESS) - return 0; - - *pptr = pRxFiCalInfo; - os_zero_mem(pRxFiCalInfo, sizeof(RXFI_CAL_INFO_T)); - /*os_move_mem(pRxFiCalInfo->au4Data, RLM_CAL_CACHE_RXFI_CAL_INFO(rlmCalCache).au4Data, - sizeof(RLM_CAL_CACHE_RXFI_CAL_INFO(rlmCalCache).au4Data));*/ - os_move_mem(pRxFiCalInfo, &RLM_CAL_CACHE_RXFI_CAL_INFO(rlmCalCache), - sizeof(RXFI_CAL_INFO_T)); - - return sizeof(RXFI_CAL_INFO_T); -} - -INT RxFdCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr, UINT32 chGroup) -{ - P_RXFD_CAL_INFO_T pRxFdCalInfo; - - if (!RLM_CAL_CACHE_IS_RXFD_CAL_DONE(rlmCalCache, chGroup)) - return 0; - - if (os_alloc_mem(pAd, (UCHAR **)&pRxFdCalInfo, - sizeof(RXFD_CAL_INFO_T)) != NDIS_STATUS_SUCCESS) - return 0; - - *pptr = pRxFdCalInfo; - os_zero_mem(pRxFdCalInfo, sizeof(RXFD_CAL_INFO_T)); - pRxFdCalInfo->u4ChGroupId = chGroup; - /*os_move_mem(pRxFdCalInfo->au4Data, RLM_CAL_CACHE_RXFD_CAL_INFO(rlmCalCache, chGroup).au4Data, - sizeof(RLM_CAL_CACHE_RXFD_CAL_INFO(rlmCalCache, chGroup).au4Data));*/ - os_move_mem(pRxFdCalInfo, - &RLM_CAL_CACHE_RXFD_CAL_INFO(rlmCalCache, chGroup), - sizeof(RXFD_CAL_INFO_T)); - - return sizeof(RXFD_CAL_INFO_T); -} - -INT RlmPorCalInfoAlloc(VOID *pAd, VOID *rlmCalCache, VOID **pptr) -{ - P_RLM_POR_CAL_INFO_T pRlmPorCalInfo = NULL; - - if (os_alloc_mem(pAd, (UCHAR **)&pRlmPorCalInfo, - sizeof(RLM_POR_CAL_INFO_T)) != NDIS_STATUS_SUCCESS) - return 0; - - *pptr = pRlmPorCalInfo; - os_zero_mem(pRlmPorCalInfo, sizeof(RLM_POR_CAL_INFO_T)); - pRlmPorCalInfo->ucRlmPorCal = 1; - - return sizeof(RLM_POR_CAL_INFO_T); -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/protocol/protection.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/protocol/protection.c deleted file mode 100644 index a31667f897..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/protocol/protection.c +++ /dev/null @@ -1,59 +0,0 @@ -/*************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2016, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - protection.c - - Abstract: - For general 802.11 Legacy/HT/nonHT protection mechanism - - Who When What - -------------- ---------- ---------------------------------------------- - Hugo 2016-0505 created -*/ - -#include "rt_config.h" - -#ifdef CONFIG_AP_SUPPORT - -UINT16 nonerp_sta_num(struct _MAC_TABLE_ENTRY *peer, UCHAR peer_state) -{ - if ((peer->MaxHTPhyMode.field.MODE == MODE_CCK) && - (peer->Sst == SST_ASSOC)) { - if (peer_state == PEER_JOIN) { - peer->pMbss->conn_sta.nonerp_sta_cnt++; - } - if ((peer_state == PEER_LEAVE) && - (peer->pMbss->conn_sta.nonerp_sta_cnt > 0)) { - peer->pMbss->conn_sta.nonerp_sta_cnt--; - } - } - - return peer->pMbss->conn_sta.nonerp_sta_cnt; -} - -UCHAR nonerp_protection(struct _BSS_STRUCT *bss_struct) -{ - UCHAR use_prot = 0; - - if (bss_struct && (bss_struct->conn_sta.nonerp_sta_cnt > 0)) { - use_prot = 1; - } - - return use_prot; -} - -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/protocol/tmr.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/protocol/tmr.c deleted file mode 100644 index 70e4ef40f8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/protocol/tmr.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - *************************************************************************** - * Ralink Tech Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 2002-2006, Ralink Technology, Inc. - * - * All rights reserved. Ralink's source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of Ralink Tech. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of Ralink Technology, Inc. is obtained. - *************************************************************************** - - Module Name: - tmr.c - - Abstract: - Support Timing Measurment function. - - Who When What - -------------- ---------- ---------------------------------------------- - Carter 2014-1120 created -*/ - -#ifdef MT_MAC - -#include "rt_config.h" - -/* - * the format is for QA tool, TMR as prefix, - * QA will latch the prefix string then output to file. - */ -void tmr_raw_dump(char *str, UCHAR *pSrcBufVA, UINT SrcBufLen) -{ - unsigned char *pt; - int x; - - pt = pSrcBufVA; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: %p, len = %d\n", str, pSrcBufVA, SrcBufLen)); - - for (x = 0; x < SrcBufLen; x++) { - if (x % 16 == 0) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("TMR 0x%04x : ", x)); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%02x ", ((unsigned char)pt[x]))); - - if (x % 16 == 15) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("\n")); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("\n")); -} - -#ifdef FTM_SUPPORT -inline VOID FillTodToa(IN UINT32 tod_high, IN UINT32 tod_low, - IN UINT32 toa_high, IN UINT32 toa_low, OUT UINT64 *p_tod, - OUT UINT64 *p_toa) -{ - *p_tod = (((UINT64)(tod_high)) << 32) | tod_low; - *p_toa = (((UINT64)(toa_high)) << 32) | toa_low; -} -#endif /* FTM_SUPPORT */ - -VOID TmrReportParser(RTMP_ADAPTER *pAd, TMR_FRM_STRUC *tmr, - BOOLEAN fgFinalResult, UINT32 TOAECalibrationResult) -{ - struct _RMAC_RXD_0_TMR *ptmr_d0 = &tmr->TmrD0; - UINT32 *ptod_0 = &tmr->ToD0; - UINT32 *ptoa_0 = &tmr->ToA0; - TMR_D_6 *tmr_d6 = &tmr->TmrD6; - TMR_D_2 *ptmr_d2 = &tmr->TmrD2; - TMR_D_1 *tmr_d1 = &tmr->TmrD1; - UCHAR *pta_16 = (UCHAR *)&tmr->Ta16; -#ifdef TMR_GEN2 - TMR_D_7 *tmr_d7 = &tmr->TmrD7; - TMR_D_8 *tmr_d8 = &tmr->TmrD8; - INT32 LtfSyncAddr = 0; - UINT32 DacOutput = 0; -#endif /* TMR_GEN2 */ - UCHAR PeerAddr[MAC_ADDR_LEN] = { 0 }; - static UINT32 lastest_TOA; - static UINT32 lastest_sn; - UINT32 tod_fine = tmr_d1->field_init.TodFine; - UINT32 tod_low = 0; - UINT32 toa_low = 0; - UINT32 delta_low = 0; - UINT32 tod_high = 0; - UINT32 toa_high = 0; - UINT32 delta_high = 0; - UCHAR dbg_lvl = DBG_LVL_OFF; - UCHAR dbg_lvl_error = DBG_LVL_OFF; -#ifdef FTM_SUPPORT - UINT64 tod = 0; - UINT64 toa = 0; - UINT64 delta = 0; -#endif /* FTM_SUPPORT */ - - if (pAd->pTmrCtrlStruct == NULL) - return; - - if (pAd->pTmrCtrlStruct->TmrEnable == TMR_DISABLE) - return; - - pAd->pTmrCtrlStruct->TmrCalResult = TOAECalibrationResult; - -#ifdef FTM_SUPPORT - if (ptmr_d0->IR == TMR_IR0_TX) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("TMR(%d%d)PID:0x%02X\n", ptmr_d0->ToaVld, - ptmr_d0->TodVld, tmr_d1->field_init.Pid)); - else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("TMR: TYPE=%x, SUB_TYPE=%x, SN=0x%04X\n", - ptmr_d0->Type, ptmr_d0->SubType, - ptmr_d2->field.SnField)); - - dbg_lvl = DBG_LVL_INFO; - dbg_lvl_error = DBG_LVL_WARN; - - if (DebugLevel >= dbg_lvl) -#endif /* FTM_SUPPORT */ - tmr_raw_dump("TMR RAW data: ", (UCHAR *)tmr, - sizeof(TMR_FRM_STRUC)); - - tod_low = tmr->ToD0; - toa_low = tmr->ToA0; - tod_high = tmr->TmrD6.field.ToD32; - toa_high = tmr->TmrD6.field.ToA32; -#ifdef TMR_GEN2 - LtfSyncAddr = tmr_d8->field_ofdm.LtfSyncStartAddr; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("LtfSyncAddr = %x, in unit(12.5ns)\n", LtfSyncAddr)); - DacOutput = tmr_d7->field.DacOutput; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("DacOutput = %x\n", DacOutput)); - - if (fgFinalResult == FALSE) { - toa_low = toa_low + - LtfSyncAddr * 50; /* for now, always use CBW 80. */ - tod_low = tod_low - (tod_fine * 33 / 4) + (DacOutput * 33 / 8); - } - -#endif /* TMR_GEN2 */ - - /* calculate delta time */ - if (ptmr_d0->IR == TMR_IR1_RX) { - delta_low = tod_low - toa_low; - delta_high = tod_high - toa_high; - } else { - delta_low = toa_low - tod_low; - delta_high = toa_high - tod_high; - } - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("DWORD_0: ByteCnt=%d, NC=%d, TMF=%d, ToaVld=%d, TodVld=%d, tod_fine=%x\n", - ptmr_d0->RxByteCnt, ptmr_d0->Nc, ptmr_d0->Tmf, ptmr_d0->ToaVld, - ptmr_d0->TodVld, tod_fine)); - -#ifdef FTM_SUPPORT - FillTodToa(tod_high, tod_low, toa_high, toa_low, &tod, &toa); - FtmConvertTodToa(pAd, &tod, &toa); - - if (ptmr_d0->IR == TMR_IR1_RX) - delta = tod - toa; - else - delta = toa - tod; - -#endif /* FTM_SUPPORT */ - - if (ptmr_d0->IR == TMR_IR1_RX) { - /* TMR Responder, Rx case */ - if (lastest_sn == ptmr_d2->field.SnField) - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl_error, - ("##### latest sn is same as last time\n")); - - lastest_sn = ptmr_d2->field.SnField; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("TYPE=%x, SUB_TYPE=%x, SN=%x\n", ptmr_d0->Type, - ptmr_d0->SubType, ptmr_d2->field.SnField)); - - PeerAddr[0] = ptmr_d2->field.Ta0; - PeerAddr[1] = ptmr_d2->field.Ta0 >> 8; - NdisCopyMemory(PeerAddr + 2, (UCHAR *)pta_16, 4); - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("Readable TA = %02x:%02x:%02x:%02x:%02x:%02x\n", - PRINT_MAC(PeerAddr))); - - } else { - /* TMR Initiator, Tx case */ - if (*ptoa_0 == lastest_TOA) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("##### latest TOA is same as last time\n")); - /* 2015.06.22 location plugfest: do not return */ -#ifndef FTM_SUPPORT - return; -#endif - } - - lastest_TOA = *ptoa_0; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("TOAECalibrationResult=0x%X\n", TOAECalibrationResult)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("DWORD_4: TOD[0:31]=0x%x\n", *ptod_0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("DWORD_6: TOD[32:47]=0x%x\n", tmr_d6->field.ToD32)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("DWORD_5: TOA[0:31]=0x%x\n", *ptoa_0)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("DWORD_6: TOA[32:47]=0x%x\n", tmr_d6->field.ToA32)); -#ifndef FTM_SUPPORT - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("TMR Report: ir = %d, delta_high = %d, delta_low = %d\n\n", - ptmr_d0->IR, delta_high, delta_low)); -#else - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, dbg_lvl, - ("TMR Report: ir = %d, delta = 0x%016llX (unit converted)\n\n", - ptmr_d0->IR, delta)); -#endif /* FTM_SUPPORT */ -#ifdef FTM_SUPPORT - { - PFTM_PEER_ENTRY pFtmEntry = NULL; - - /* Get Peer FTM Entry */ - if (ptmr_d0->IR == TMR_IR1_RX) - pFtmEntry = FtmEntrySearch(pAd, PeerAddr); - else - pFtmEntry = FtmGetPidPendingNode( - pAd, tmr_d1->field_init.Pid); - - if (!pFtmEntry) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_FTM, DBG_LVL_INFO, - ("%s()#%d: invalid FTM entry !!\n", __func__, - __LINE__)); - return; - } - - /* Record TMR */ - if (ptmr_d0->IR == TMR_IR0_TX) { - /* Tx case: for FTM responder */ - if (pFtmEntry->bGotTmr) - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_FTM, - DBG_LVL_WARN, - ("%s()#%d: bGotTmr again\n", __func__, - __LINE__)); - else - pFtmEntry->bGotTmr = TRUE; - - NdisCopyMemory(&pFtmEntry->Tmr.HwReport, tmr, - sizeof(TMR_FRM_STRUC)); - pFtmEntry->Tmr.toa = toa; - pFtmEntry->Tmr.tod = tod; - } -#ifdef FTM_INITIATOR - else { - /* Rx case: for FTM initiator */ - ULONG IrqFlags = 0; - PFTM_MAPPING pNode = NULL; - - if (os_alloc_mem(NULL, (UCHAR **)&pNode, - sizeof(FTM_MAPPING)) == - NDIS_STATUS_FAILURE) - return; - - NdisZeroMemory(pNode, sizeof(FTM_MAPPING)); - RTMP_IRQ_LOCK(&pFtmEntry->RxTmrQLock, IrqFlags); - NdisCopyMemory(&pNode->tmr.HwReport, tmr, - sizeof(TMR_FRM_STRUC)); - pNode->tmr.toa = toa; - pNode->tmr.tod = tod; - pNode->sn = ptmr_d2->field.SnField; - DlListAddTail(&pFtmEntry->RxTmrQ, &pNode->list); - RTMP_IRQ_UNLOCK(&pFtmEntry->RxTmrQLock, IrqFlags); - } - -#endif /* FTM_INITIATOR */ - } -#endif /* FTM_SUPPORT */ - return; -} - -INT TmrCtrlInit(RTMP_ADAPTER *pAd, UCHAR TmrType, UCHAR Ver) -{ - INT Ret = NDIS_STATUS_SUCCESS; - TMR_CTRL_STRUCT *TmrCtrlStructMem = NULL; - - if (pAd->pTmrCtrlStruct != NULL) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_FTM, DBG_LVL_ERROR, - ("%s(): pTmrCtrlStruct is allocated.\n", __func__)); - } else { - Ret = os_alloc_mem(pAd, (PUCHAR *)&TmrCtrlStructMem, - sizeof(TMR_CTRL_STRUCT)); - - if (!TmrCtrlStructMem) { - MTWF_LOG(DBG_CAT_PROTO, CATPROTO_FTM, DBG_LVL_ERROR, - ("%s(): alloc TmrCtrl fail!\n", __func__)); - return Ret; - } - - pAd->pTmrCtrlStruct = TmrCtrlStructMem; - } - - if (!pAd->pTmrCtrlStruct) - return NDIS_STATUS_FAILURE; - - if (TmrType == TMR_INITIATOR) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: enable TMR report, as Initialiter\n", __func__)); - } else { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: enable TMR report, as Responder\n", __func__)); - } - - pAd->pTmrCtrlStruct->TmrEnable = TmrType; - MtSetTmrCR(pAd, TmrType); - return Ret; -} - -VOID TmrCtrlExit(RTMP_ADAPTER *pAd) -{ - if (pAd->pTmrCtrlStruct != NULL) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: disable TMR report\n", __func__)); - pAd->pTmrCtrlStruct->TmrEnable = TMR_DISABLE; - os_free_mem(pAd->pTmrCtrlStruct); - pAd->pTmrCtrlStruct = NULL; - } -} - -/* - * Carter, for now, MT7615 TMR mode is global control. - * we shall refine DBDC case in someday. -*/ -/* VOID MtSetTmrEnable(RTMP_ADAPTER *pAd, UCHAR TmrType) */ -VOID TmrCtrl(RTMP_ADAPTER *pAd, UCHAR TmrType, UCHAR Ver) -{ - if (TmrType != TMR_DISABLE) - TmrCtrlInit(pAd, TmrType, Ver); - else - TmrCtrlExit(pAd); - - switch (TmrType) { - case TMR_INITIATOR: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: enable TMR report, as Initialiter\n", __func__)); - AsicSetTmrCR(pAd, TmrType, 0); - AsicSetTmrCR(pAd, TmrType, 1); - break; - - case TMR_RESPONDER: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: enable TMR report, as Responser\n", __func__)); - AsicSetTmrCR(pAd, TmrType, 0); - AsicSetTmrCR(pAd, TmrType, 1); - break; - - case TMR_DISABLE: - default: - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: disable TMR report\n", __func__)); - AsicSetTmrCR(pAd, TmrType, 0); - AsicSetTmrCR(pAd, TmrType, 1); - break; - } - - return; -} - -#endif /* MT_MAC */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_cfg.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_cfg.c deleted file mode 100644 index d65c53e919..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_cfg.c +++ /dev/null @@ -1,1049 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2014 MediaTek Inc. -* -* All rights reserved. Copying, compilation, modification, distribution -* or any other use whatsoever of this material is strictly prohibited -* except in accordance with a Software License Agreement with -* MediaTek Inc. -******************************************************************************** -*/ - -/******************************************************************************* -* LEGAL DISCLAIMER -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND -* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK -* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE -* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY -* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE -* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY -* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK -* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY -* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE -* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO -* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL -* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT -* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY -* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT -* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING -* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN -* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE -* (ICC). -******************************************************************************** -*/ - -#ifndef COMPOS_WIN - -#include "rt_config.h" - -#ifdef NEW_RATE_ADAPT_SUPPORT - -INT Set_PerThrdAdj_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - UCHAR i; - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) - pAd->MacTab.Content[i].perThrdAdj = - (BOOLEAN)simple_strtol(arg, 0, 10); - - return TRUE; -} - -/* Set_LowTrafficThrd_Proc - set threshold for reverting to default MCS based on RSSI */ -INT Set_LowTrafficThrd_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - pAd->CommonCfg.lowTrafficThrd = (USHORT)simple_strtol(arg, 0, 10); - return TRUE; -} - -/* Set_TrainUpRule_Proc - set rule for Quick DRS train up */ -INT Set_TrainUpRule_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - pAd->CommonCfg.TrainUpRule = (BOOLEAN)simple_strtol(arg, 0, 10); - return TRUE; -} - -/* Set_TrainUpRuleRSSI_Proc - set RSSI threshold for Quick DRS Hybrid train up */ -INT Set_TrainUpRuleRSSI_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - pAd->CommonCfg.TrainUpRuleRSSI = (SHORT)simple_strtol(arg, 0, 10); - return TRUE; -} - -/* Set_TrainUpLowThrd_Proc - set low threshold for Quick DRS Hybrid train up */ -INT Set_TrainUpLowThrd_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - pAd->CommonCfg.TrainUpLowThrd = (USHORT)simple_strtol(arg, 0, 10); - return TRUE; -} - -/* Set_TrainUpHighThrd_Proc - set high threshold for Quick DRS Hybrid train up */ -INT Set_TrainUpHighThrd_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - pAd->CommonCfg.TrainUpHighThrd = (USHORT)simple_strtol(arg, 0, 10); - return TRUE; -} -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -INT Set_RateAlg_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg) -{ - UINT32 ra_alg; - - ra_alg = simple_strtol(arg, 0, 10); - - if ((ra_alg < RATE_ALG_MAX_NUM) && (ra_alg != pAd->rateAlg)) { - UINT32 IdEntry; - - pAd->rateAlg = ra_alg; - - for (IdEntry = 0; VALID_UCAST_ENTRY_WCID(pAd, IdEntry); - IdEntry++) - pAd->MacTab.Content[IdEntry].rateAlg = ra_alg; - } - - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Set Alg = %d\n", __func__, ra_alg)); - return TRUE; -} - -#ifdef DBG -#ifdef MT_MAC -INT Set_Fixed_Rate_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - BOOLEAN fgStatus = TRUE; - RA_PHY_CFG_T TxPhyCfg; - UINT_32 rate[8]; - UINT32 ret; - INT32 i4Recv = 0; - UINT32 u4WCID = 0; - UINT32 u4Mode = 0, u4Bw = 0, u4Mcs = 0, u4VhtNss = 0; - UINT32 u4SGI = 0, u4Preamble = 0, u4STBC = 0, u4LDPC = 0, u4SpeEn = 0; - UCHAR ucNsts; - MAC_TABLE_ENTRY *pEntry = NULL; - struct _RTMP_CHIP_CAP *cap; - - cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (arg) { - do { - i4Recv = sscanf(arg, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", - &(u4WCID), &(u4Mode), &(u4Bw), &(u4Mcs), - &(u4VhtNss), &(u4SGI), &(u4Preamble), - &(u4STBC), &(u4LDPC), &(u4SpeEn)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():WCID = %d, Mode = %d, BW = %d, MCS = %d, VhtNss = %d\n" - "\t\t\t\tSGI = %d, Preamble = %d, STBC = %d, LDPC = %d, SpeEn = %d\n", - __func__, u4WCID, u4Mode, u4Bw, u4Mcs, - u4VhtNss, u4SGI, u4Preamble, u4STBC, u4LDPC, - u4SpeEn)); - - if (i4Recv != 10) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Format Error!\n")); - fgStatus = FALSE; - break; - } - - if (!VALID_UCAST_ENTRY_WCID(pAd, u4WCID)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("WCID exceed pAd->MaxUcastEntryNum!\n")); - fgStatus = FALSE; - break; - } - - if (u4Mode > MODE_VHT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Unknow Mode!\n")); - fgStatus = FALSE; - break; - } - - if (u4Bw > 4) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Unknow BW!\n")); - fgStatus = FALSE; - break; - } - - if (((u4Mode == MODE_CCK) && (u4Mcs > 3)) || - ((u4Mode == MODE_OFDM) && (u4Mcs > 7)) || - ((u4Mode == MODE_HTMIX) && (u4Mcs > 32)) || - ((u4Mode == MODE_VHT) && (u4Mcs > 9))) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Unknow MCS!\n")); - fgStatus = FALSE; - break; - } - - if ((u4Mode == MODE_VHT) && (u4VhtNss > 4)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Unknow VhtNss!\n")); - fgStatus = FALSE; - break; - } - - RTMP_SEM_EVENT_WAIT(&pAd->AutoRateLock, ret); - pEntry = &pAd->MacTab.Content[u4WCID]; - - if (IS_ENTRY_NONE(pEntry)) { - RTMP_SEM_EVENT_UP(&pAd->AutoRateLock); - break; - } - - os_zero_mem(&TxPhyCfg, sizeof(TxPhyCfg)); - TxPhyCfg.BW = u4Bw; - TxPhyCfg.ShortGI = u4SGI; - - if (u4LDPC) - TxPhyCfg.ldpc = HT_LDPC | VHT_LDPC; - else - TxPhyCfg.ldpc = 0; - - if (u4Preamble == 0) - u4Preamble = LONG_PREAMBLE; - else - u4Preamble = SHORT_PREAMBLE; - - u4STBC = raStbcSettingCheck(u4STBC, u4Mode, u4Mcs, - u4VhtNss, 0, 0); - pEntry->HTPhyMode.field.MODE = u4Mode; - pEntry->HTPhyMode.field.iTxBF = 0; - pEntry->HTPhyMode.field.eTxBF = 0; - pEntry->HTPhyMode.field.STBC = u4STBC ? 1 : 0; - pEntry->HTPhyMode.field.ShortGI = u4SGI ? 1 : 0; - pEntry->HTPhyMode.field.BW = u4Bw; - pEntry->HTPhyMode.field.ldpc = u4LDPC ? 1 : 0; -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC - - if (u4Mode == MODE_VHT) - pEntry->HTPhyMode.field.MCS = - (((u4VhtNss - 1) & 0x3) << 4) + u4Mcs; - else -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - { - pEntry->HTPhyMode.field.MCS = u4Mcs; - } - - pEntry->LastTxRate = pEntry->HTPhyMode.word; - pAd->LastTxRate = pEntry->HTPhyMode.word; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - - if (cap->fgRateAdaptFWOffload == TRUE) { - CMD_STAREC_AUTO_RATE_UPDATE_T rRaParam; - - pEntry->bAutoTxRateSwitch = FALSE; - NdisZeroMemory( - &rRaParam, - sizeof(CMD_STAREC_AUTO_RATE_UPDATE_T)); - rRaParam.FixedRateCfg.MODE = u4Mode; - rRaParam.FixedRateCfg.STBC = u4STBC; - rRaParam.FixedRateCfg.ShortGI = u4SGI; - rRaParam.FixedRateCfg.BW = u4Bw; - rRaParam.FixedRateCfg.ldpc = TxPhyCfg.ldpc; - rRaParam.FixedRateCfg.MCS = u4Mcs; - rRaParam.FixedRateCfg.VhtNss = u4VhtNss; - rRaParam.ucShortPreamble = u4Preamble; - rRaParam.ucSpeEn = u4SpeEn; - rRaParam.u4Field = RA_PARAM_FIXED_RATE; - RAParamUpdate(pAd, pEntry, &rRaParam); - } else -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - INT apidx = 0; - - for (apidx = 0; - apidx < pAd->ApCfg.BssidNum; - apidx++) - pAd->ApCfg.MBSSID[apidx] - .wdev.bAutoTxRateSwitch = - FALSE; - } -#endif /* CONFIG_AP_SUPPORT */ - ucNsts = get_nsts_by_mcs(u4Mode, u4Mcs, u4STBC, - u4VhtNss); - rate[0] = tx_rate_to_tmi_rate(u4Mode, u4Mcs, - ucNsts, u4STBC, - u4Preamble); - rate[0] &= 0xfff; - rate[1] = rate[2] = rate[3] = rate[4] = - rate[5] = rate[6] = rate[7] = rate[0]; - MtAsicTxCapAndRateTableUpdate( - pAd, u4WCID, &TxPhyCfg, rate, u4SpeEn); - } - - RTMP_SEM_EVENT_UP(&pAd->AutoRateLock); - } while (0); - } - - if (fgStatus == FALSE) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("iwpriv ra0 set FixedRate=[WCID]-[Mode]-[BW]-[MCS]-[VhtNss]-[SGI]-[Preamble]-[STBC]-[LDPC]-[SPE_EN]\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[WCID]Wireless Client ID\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[Mode]CCK=0, OFDM=1, HT=2, GF=3, VHT=4\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[BW]BW20=0, BW40=1, BW80=2,BW160=3\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[MCS]CCK=0~4, OFDM=0~7, HT=0~32, VHT=0~9\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[VhtNss]VHT=1~4, Other=ignore\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[Preamble]Long=0, Other=Short\n")); - } else - dump_wtbl_info(pAd, u4WCID); - - return fgStatus; -} - -INT Set_Fixed_Rate_With_FallBack_Proc(IN PRTMP_ADAPTER pAd, IN RTMP_STRING *arg) -{ - BOOLEAN fgStatus = TRUE; - RA_PHY_CFG_T TxPhyCfg; - UINT_32 rate[8]; - UINT32 ret; - INT32 i4Recv = 0; - UINT32 u4WCID = 0; - UINT32 u4Mode = 0, u4Bw = 0, u4Mcs = 0, u4VhtNss = 0; - UINT32 u4SGI = 0, u4Preamble = 0, u4STBC = 0, u4LDPC = 0, u4SpeEn = 0, - u4Is5G = 0; - UCHAR ucNsts; - MAC_TABLE_ENTRY *pEntry = NULL; -#if defined(RATE_ADAPT_AGBS_SUPPORT) && !defined(RACTRL_FW_OFFLOAD_SUPPORT) - UINT_32 u4TableSize; - UINT_16 *pu2FallbackTable = NULL; - UINT_8 ucIndex; - BOOL fgFound = FALSE; - extern UINT_16 HwFallbackTable11B[32]; - extern UINT_16 HwFallbackTable11G[64]; - extern UINT_16 HwFallbackTable11BG[56]; - extern UINT_16 HwFallbackTable11N1SS[80]; - extern UINT_16 HwFallbackTable11N2SS[80]; - extern UINT_16 HwFallbackTable11N3SS[80]; - extern UINT_16 HwFallbackTable11N4SS[80]; - extern UINT_16 HwFallbackTableBGN1SS[80]; - extern UINT_16 HwFallbackTableBGN2SS[80]; - extern UINT_16 HwFallbackTableBGN3SS[80]; - extern UINT_16 HwFallbackTableBGN4SS[80]; - extern UINT_16 HwFallbackTableVht1SS[80]; - extern UINT_16 HwFallbackTableVht2SS[80]; - extern UINT_16 HwFallbackTableVht3SS[80]; - extern UINT_16 HwFallbackTableVht4SS[80]; -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - cap = hc_get_chip_cap(pAd->hdev_ctrl); - - if (arg) { - do { - i4Recv = sscanf(arg, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", - &(u4WCID), &(u4Mode), &(u4Bw), &(u4Mcs), - &(u4VhtNss), &(u4SGI), &(u4Preamble), - &(u4STBC), &(u4LDPC), &(u4SpeEn), - &(u4Is5G)); - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():WCID = %d, Mode = %d, BW = %d, MCS = %d, VhtNss = %d\n" - "\t\t\t\tSGI = %d, Preamble = %d, STBC = %d, LDPC = %d, SpeEn = %d, Is5G = %d\n", - __func__, u4WCID, u4Mode, u4Bw, u4Mcs, - u4VhtNss, u4SGI, u4Preamble, u4STBC, u4LDPC, - u4SpeEn, u4Is5G)); - - if (i4Recv != 11) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Format Error!\n")); - fgStatus = FALSE; - break; - } - - if (!VALID_UCAST_ENTRY_WCID(pAd, u4WCID)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("WCID exceed pAd->MaxUcastEntryNum!\n")); - fgStatus = FALSE; - break; - } - - if (u4Mode > MODE_VHT) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Unknow Mode!\n")); - fgStatus = FALSE; - break; - } - - if (u4Bw > 4) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Unknow BW!\n")); - fgStatus = FALSE; - break; - } - - if (((u4Mode == MODE_CCK) && (u4Mcs > 3)) || - ((u4Mode == MODE_OFDM) && (u4Mcs > 7)) || - ((u4Mode == MODE_HTMIX) && (u4Mcs > 32)) || - ((u4Mode == MODE_VHT) && (u4Mcs > 9))) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Unknow MCS!\n")); - fgStatus = FALSE; - break; - } - - if ((u4Mode == MODE_VHT) && (u4VhtNss > 4)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, ("Unknow VhtNss!\n")); - fgStatus = FALSE; - break; - } - - RTMP_SEM_EVENT_WAIT(&pAd->AutoRateLock, ret); - pEntry = &pAd->MacTab.Content[u4WCID]; - - if (IS_ENTRY_NONE(pEntry)) { - RTMP_SEM_EVENT_UP(&pAd->AutoRateLock); - break; - } - - os_zero_mem(&TxPhyCfg, sizeof(TxPhyCfg)); - TxPhyCfg.BW = u4Bw; - TxPhyCfg.ShortGI = u4SGI; - - if (u4LDPC) - TxPhyCfg.ldpc = HT_LDPC | VHT_LDPC; - else - TxPhyCfg.ldpc = 0; - - if (u4Preamble == 0) - u4Preamble = LONG_PREAMBLE; - else - u4Preamble = SHORT_PREAMBLE; - - u4STBC = raStbcSettingCheck(u4STBC, u4Mode, u4Mcs, - u4VhtNss, 0, 0); - pEntry->HTPhyMode.field.MODE = u4Mode; - pEntry->HTPhyMode.field.iTxBF = 0; - pEntry->HTPhyMode.field.eTxBF = 0; - pEntry->HTPhyMode.field.STBC = u4STBC ? 1 : 0; - pEntry->HTPhyMode.field.ShortGI = u4SGI ? 1 : 0; - pEntry->HTPhyMode.field.BW = u4Bw; - pEntry->HTPhyMode.field.ldpc = u4LDPC ? 1 : 0; -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC - - if (u4Mode == MODE_VHT) - pEntry->HTPhyMode.field.MCS = - (((u4VhtNss - 1) & 0x3) << 4) + u4Mcs; - else -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - { - pEntry->HTPhyMode.field.MCS = u4Mcs; - } - - pEntry->LastTxRate = pEntry->HTPhyMode.word; - pAd->LastTxRate = pEntry->HTPhyMode.word; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - - if (cap->fgRateAdaptFWOffload == TRUE) { - CMD_STAREC_AUTO_RATE_UPDATE_T rRaParam; - - pEntry->bAutoTxRateSwitch = FALSE; - NdisZeroMemory( - &rRaParam, - sizeof(CMD_STAREC_AUTO_RATE_UPDATE_T)); - rRaParam.FixedRateCfg.MODE = u4Mode; - rRaParam.FixedRateCfg.STBC = u4STBC; - rRaParam.FixedRateCfg.ShortGI = u4SGI; - rRaParam.FixedRateCfg.BW = u4Bw; - rRaParam.FixedRateCfg.ldpc = TxPhyCfg.ldpc; - rRaParam.FixedRateCfg.MCS = u4Mcs; - rRaParam.FixedRateCfg.VhtNss = u4VhtNss; - rRaParam.ucShortPreamble = u4Preamble; - rRaParam.ucSpeEn = u4SpeEn; - rRaParam.fgIs5G = u4Is5G ? TRUE : FALSE; - rRaParam.u4Field = RA_PARAM_FIXED_RATE_FALLBACK; - RAParamUpdate(pAd, pEntry, &rRaParam); - } else -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - { -#ifdef CONFIG_AP_SUPPORT - IF_DEV_CONFIG_OPMODE_ON_AP(pAd) - { - INT apidx = 0; - - for (apidx = 0; - apidx < pAd->ApCfg.BssidNum; - apidx++) - pAd->ApCfg.MBSSID[apidx] - .wdev.bAutoTxRateSwitch = - FALSE; - } -#endif /* CONFIG_AP_SUPPORT */ - ucNsts = get_nsts_by_mcs(u4Mode, u4Mcs, u4STBC, - u4VhtNss); - rate[0] = tx_rate_to_tmi_rate(u4Mode, u4Mcs, - ucNsts, u4STBC, - u4Preamble); - rate[0] &= 0xfff; -#if defined(RATE_ADAPT_AGBS_SUPPORT) && !defined(RACTRL_FW_OFFLOAD_SUPPORT) - - if (u4Mode == MODE_CCK) { - pu2FallbackTable = HwFallbackTable11B; - u4TableSize = - sizeof(HwFallbackTable11B) / 2; - } else if (u4Mode == MODE_OFDM) { - if (u4Is5G == TRUE) { - pu2FallbackTable = - HwFallbackTable11G; - u4TableSize = - sizeof(HwFallbackTable11G) / - 2; - } else { - pu2FallbackTable = - HwFallbackTable11BG; - u4TableSize = - sizeof(HwFallbackTable11BG) / - 2; - } - } else if ((u4Mode == MODE_HTMIX) || - (u4Mode == MODE_HTGREENFIELD)) { - UINT_8 ucHtNss = 1; - - ucHtNss += (u4Mcs >> 3); - - if (u4Is5G == TRUE) { - switch (ucHtNss) { - case 1: - pu2FallbackTable = - HwFallbackTable11N1SS; - u4TableSize = - sizeof(HwFallbackTable11N1SS) / - 2; - break; - - case 2: - pu2FallbackTable = - HwFallbackTable11N2SS; - u4TableSize = - sizeof(HwFallbackTable11N2SS) / - 2; - break; - - case 3: - pu2FallbackTable = - HwFallbackTable11N3SS; - u4TableSize = - sizeof(HwFallbackTable11N3SS) / - 2; - break; - - case 4: - pu2FallbackTable = - HwFallbackTable11N4SS; - u4TableSize = - sizeof(HwFallbackTable11N4SS) / - 2; - break; - - default: - MTWF_LOG( - DBG_CAT_RA, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Unknow Nss%d!\n", - ucHtNss)); - break; - } - } else { - switch (ucHtNss) { - case 1: - pu2FallbackTable = - HwFallbackTableBGN1SS; - u4TableSize = - sizeof(HwFallbackTableBGN1SS) / - 2; - break; - - case 2: - pu2FallbackTable = - HwFallbackTableBGN2SS; - u4TableSize = - sizeof(HwFallbackTableBGN2SS) / - 2; - break; - - case 3: - pu2FallbackTable = - HwFallbackTableBGN3SS; - u4TableSize = - sizeof(HwFallbackTableBGN3SS) / - 2; - break; - - case 4: - pu2FallbackTable = - HwFallbackTableBGN4SS; - u4TableSize = - sizeof(HwFallbackTableBGN4SS) / - 2; - break; - - default: - MTWF_LOG( - DBG_CAT_RA, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Unknow Nss%d!\n", - ucHtNss)); - break; - } - } - } else if (u4Mode == MODE_VHT) { - switch (u4VhtNss) { - case 1: - pu2FallbackTable = - HwFallbackTableVht1SS; - u4TableSize = - sizeof(HwFallbackTableVht1SS) / - 2; - break; - - case 2: - pu2FallbackTable = - HwFallbackTableVht2SS; - u4TableSize = - sizeof(HwFallbackTableVht2SS) / - 2; - break; - - case 3: { - pu2FallbackTable = - HwFallbackTableVht3SS; - u4TableSize = - sizeof(HwFallbackTableVht3SS) / - 2; - } - - break; - - case 4: - pu2FallbackTable = - HwFallbackTableVht4SS; - u4TableSize = - sizeof(HwFallbackTableVht4SS) / - 2; - break; - - default: - MTWF_LOG(DBG_CAT_RA, - DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Unknow Nss%d!\n", - u4VhtNss)); - break; - } - } - - if (pu2FallbackTable != NULL) { - for (ucIndex = 0; ucIndex < u4TableSize; - ucIndex += 8) { - union RA_RATE_CODE rInitialRate; - - rInitialRate.word = - *(pu2FallbackTable + - ucIndex); - - if (rInitialRate.field.mcs == - u4Mcs) { - fgFound = TRUE; - break; - } - } - - if (fgFound) { - UINT_8 ucIdx; - union RA_RATE_CODE rRateCode; - - for (ucIdx = 1; ucIdx < 8; - ucIdx++) { - rRateCode.word = *( - pu2FallbackTable + - ucIndex + - ucIdx); - - if (((u4Mode == - MODE_HTMIX) || - (u4Mode == - MODE_VHT)) && - u4STBC && - (rRateCode.field - .nsts == - 0)) { - rRateCode.field - .nsts = - 1; - rRateCode.field - .stbc = - 1; - } - - rate[ucIdx] = - rRateCode.word; - } - } - } - - if (!fgFound) { - rate[1] = rate[2] = rate[3] = rate[4] = - rate[5] = rate[6] = rate[7] = - rate[0]; - MTWF_LOG( - DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Cannot find fallback table!\n")); - } - -#else - rate[1] = rate[2] = rate[3] = rate[4] = - rate[5] = rate[6] = rate[7] = rate[0]; -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - MtAsicTxCapAndRateTableUpdate( - pAd, u4WCID, &TxPhyCfg, rate, u4SpeEn); - } - - RTMP_SEM_EVENT_UP(&pAd->AutoRateLock); - } while (0); - } - - if (fgStatus == FALSE) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("iwpriv ra0 set FixedRateFallback=[WCID]-[Mode]-[BW]-[MCS]-[VhtNss]-[SGI]-[Preamble]-[STBC]-[LDPC]-[SPE_EN]-[is5G]\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[WCID]Wireless Client ID\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[Mode]CCK=0, OFDM=1, HT=2, GF=3, VHT=4\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[BW]BW20=0, BW40=1, BW80=2,BW160=3\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[MCS]CCK=0~4, OFDM=0~7, HT=0~32, VHT=0~9\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[VhtNss]VHT=1~4, Other=ignore\n")); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("[Preamble]Long=0, Other=Short\n")); - } else - dump_wtbl_info(pAd, u4WCID); - - return fgStatus; -} - -INT Set_RA_Debug_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - UINT32 u4WlanIndex = 0, u4DebugType = 0; - RTMP_STRING *pWlanIndex = NULL; - MAC_TABLE_ENTRY *pEntry = NULL; - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: arg = %s\n", __func__, arg)); - pWlanIndex = strsep(&arg, ":"); - - if (pWlanIndex == NULL || arg == NULL) { - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: Invalid parameters\n", __func__)); - return FALSE; - } - - u4WlanIndex = os_str_toul(pWlanIndex, 0, 10); - u4DebugType = os_str_toul(arg, 0, 10); - - if (!VALID_UCAST_ENTRY_WCID(pAd, u4WlanIndex)) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("u4WlanIndex exceed pAd->MaxUcastEntryNum!\n")); - return FALSE; - } - pEntry = &pAd->MacTab.Content[u4WlanIndex]; - -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - if (cap->fgRateAdaptFWOffload == TRUE) { - CMD_STAREC_AUTO_RATE_UPDATE_T rRaParam; - - if (u4DebugType < RA_PARAM_MAX) - return FALSE; - - NdisZeroMemory(&rRaParam, - sizeof(CMD_STAREC_AUTO_RATE_UPDATE_T)); - - rRaParam.u4Field = u4DebugType; - RAParamUpdate(pAd, pEntry, &rRaParam); - } else -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ - { - return FALSE; - } - - return TRUE; -} - -#endif /* MT_MAC */ -#endif /* DBG */ - -#ifdef CONFIG_RA_PHY_RATE_SUPPORT -INT Set_SupRateSet_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - UCHAR rate[] = { 0x82, 0x84, 0x8b, 0x96, 0x8C, 0x12, - 0x98, 0x24, 0xb0, 0x48, 0x60, 0x6c }; - - INT SupRateSetBitmap = 0, i = 0; - MAC_TABLE_ENTRY *pMacEntry; - P_RA_ENTRY_INFO_T pRaEntry; - - SupRateSetBitmap = (ULONG)simple_strtol(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("SupRateSetBitmap %x\n", SupRateSetBitmap)); - -#ifdef MIN_PHY_RATE_SUPPORT - /* Configurable data rate set and MIN_PHY_RATE are mutual exclusive */ - if ((wdev->rate.LimitClientSupportRate == TRUE) && - (wdev->rate.MinPhyDataRate != 0)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:MIN_PHY_RATE_SUPPORT is and enable. Unable to set Support Rate\n", - __func__)); - return FALSE; - } -#endif - - if (SupRateSetBitmap > 4095) { - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:error ForceRateSetBitmap(%04X) > 4096\n", - __func__, SupRateSetBitmap)); - return FALSE; - } - - if (!wdev) - return FALSE; - - wdev->rate.Eap_SupRate_En = TRUE; - wdev->rate.EapSupRateLen = 0; - wdev->rate.EapExtSupRateLen = 0; - - for (i = 0; i < MAX_LEN_OF_SUPPORTED_RATES; i++) { - if (SupRateSetBitmap & (1 << i)) { - if (WMODE_EQUAL(wdev->PhyMode, WMODE_B) && - (wdev->channel <= 14)) { - wdev->rate.EapSupRate[wdev->rate.EapSupRateLen] = - rate[i]; - wdev->rate.EapSupRateLen++; - wdev->rate.EapSupportCCKMCS |= (1 << i); - wdev->rate.EapSupportRateMode |= - SUPPORT_CCK_MODE; - } else if (wdev->channel > 14 && (i > 3)) { - wdev->rate.EapSupRate[wdev->rate.EapSupRateLen] = - rate[i]; - wdev->rate.EapSupRateLen++; - wdev->rate.EapSupportOFDMMCS |= (1 << (i - 4)); - wdev->rate.EapSupportRateMode |= - SUPPORT_OFDM_MODE; - } else { - if ((i < 4) || (i == 5) || (i == 7) || - (i == 9) || (i == 11)) { - wdev->rate.EapSupRate - [wdev->rate.EapSupRateLen] = - rate[i]; - wdev->rate.EapSupRateLen++; - if (i < 4) { - wdev->rate.EapSupportCCKMCS |= - (1 << i); - wdev->rate.EapSupportRateMode |= - SUPPORT_CCK_MODE; - } else { - wdev->rate.EapSupportOFDMMCS |= - (1 << (i - 4)); - wdev->rate.EapSupportRateMode |= - SUPPORT_OFDM_MODE; - } - } else { - wdev->rate.EapExtSupRate - [wdev->rate.EapExtSupRateLen] = - rate[i] & 0x7f; - wdev->rate.EapExtSupRateLen++; - wdev->rate.EapSupportOFDMMCS |= - (1 << (i - 4)); - wdev->rate.EapSupportRateMode |= - SUPPORT_OFDM_MODE; - } - } - } - } - RTMPUpdateRateInfo(wdev->PhyMode, &wdev->rate); - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pMacEntry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_CLIENT(pMacEntry) && - (pMacEntry->Sst == SST_ASSOC)) { - if (pMacEntry->wdev != wdev) - continue; - pRaEntry = &pMacEntry->RaEntry; - raWrapperEntrySet(pAd, pMacEntry, pRaEntry); - WifiSysRaInit(pAd, pMacEntry); - } - } - return TRUE; -} - -INT Set_HtSupRateSet_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - UINT32 HtSupRateSetBitmap = 0, i = 0; - MAC_TABLE_ENTRY *pMacEntry; - P_RA_ENTRY_INFO_T pRaEntry; - - HtSupRateSetBitmap = (UINT32)simple_strtol(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("HtSupRateSetBitmap %x\n", HtSupRateSetBitmap)); - -#ifdef MIN_PHY_RATE_SUPPORT - /* Configurable data rate set and MIN_PHY_RATE are mutual exclusive */ - if ((wdev->rate.LimitClientSupportRate == TRUE) && - (wdev->rate.MinPhyDataRate != 0)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:MIN_PHY_RATE_SUPPORT is and enable. Unable to set Support Rate\n", - __func__)); - return FALSE; - } -#endif - - if (!wdev) - return FALSE; - - wdev->rate.Eap_HtSupRate_En = TRUE; - wdev->rate.EapSupportHTMCS = HtSupRateSetBitmap; - wdev->rate.EapMCSSet[0] = HtSupRateSetBitmap & 0x000000ff; - wdev->rate.EapMCSSet[1] = (HtSupRateSetBitmap & 0x0000ff00) >> 8; - wdev->rate.EapMCSSet[2] = (HtSupRateSetBitmap & 0x00ff0000) >> 16; - wdev->rate.EapMCSSet[3] = (HtSupRateSetBitmap & 0xff000000) >> 24; - -#ifdef DOT11_N_SUPPORT - SetCommonHtVht(pAd, wdev); -#endif /* DOT11_N_SUPPORT */ - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pMacEntry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_CLIENT(pMacEntry) && - (pMacEntry->Sst == SST_ASSOC)) { - if (pMacEntry->wdev != wdev) - continue; - pRaEntry = &pMacEntry->RaEntry; - - raWrapperEntrySet(pAd, pMacEntry, pRaEntry); - WifiSysRaInit(pAd, pMacEntry); - } - } - return TRUE; -} - -INT Set_VhtSupRateSet_Proc(IN struct _RTMP_ADAPTER *pAd, IN RTMP_STRING *arg) -{ - POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; - struct wifi_dev *wdev = get_wdev_by_ioctl_idx_and_iftype( - pAd, pObj->ioctl_if, pObj->ioctl_if_type); - UINT32 VhtSupRateSetBitmap = 0; - UINT32 i = 0; - MAC_TABLE_ENTRY *pMacEntry; - P_RA_ENTRY_INFO_T pRaEntry; - - VhtSupRateSetBitmap = (UINT32)simple_strtol(arg, 0, 10); - MTWF_LOG(DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("VhtSupRateSetBitmap %x\n", VhtSupRateSetBitmap)); - -#ifdef MIN_PHY_RATE_SUPPORT - /* Configurable data rate set and MIN_PHY_RATE are mutual exclusive */ - if ((wdev->rate.LimitClientSupportRate == TRUE) && - (wdev->rate.MinPhyDataRate != 0)) { - MTWF_LOG( - DBG_CAT_CFG, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:MIN_PHY_RATE_SUPPORT is enable. Unable to set Support Rate\n", - __func__)); - return FALSE; - } -#endif - - if (!wdev) - return FALSE; - - wdev->rate.Eap_VhtSupRate_En = TRUE; - wdev->rate.rx_mcs_map.mcs_ss1 = VhtSupRateSetBitmap & 0x0000003; - wdev->rate.rx_mcs_map.mcs_ss2 = (VhtSupRateSetBitmap & 0x0000000c) >> 2; - wdev->rate.rx_mcs_map.mcs_ss3 = (VhtSupRateSetBitmap & 0x00000030) >> 4; - wdev->rate.rx_mcs_map.mcs_ss4 = (VhtSupRateSetBitmap & 0x000000c0) >> 6; - wdev->rate.rx_mcs_map.mcs_ss5 = (VhtSupRateSetBitmap & 0x00000300) >> 8; - wdev->rate.rx_mcs_map.mcs_ss6 = - (VhtSupRateSetBitmap & 0x00000c00) >> 10; - wdev->rate.rx_mcs_map.mcs_ss7 = - (VhtSupRateSetBitmap & 0x00003000) >> 12; - wdev->rate.rx_mcs_map.mcs_ss8 = - (VhtSupRateSetBitmap & 0x0000c000) >> 14; - wdev->rate.tx_mcs_map.mcs_ss1 = - (VhtSupRateSetBitmap & 0x00030000) >> 16; - wdev->rate.tx_mcs_map.mcs_ss2 = - (VhtSupRateSetBitmap & 0x000c0000) >> 18; - wdev->rate.tx_mcs_map.mcs_ss3 = - (VhtSupRateSetBitmap & 0x00300000) >> 20; - wdev->rate.tx_mcs_map.mcs_ss4 = - (VhtSupRateSetBitmap & 0x00c00000) >> 22; - wdev->rate.tx_mcs_map.mcs_ss5 = - (VhtSupRateSetBitmap & 0x03000000) >> 24; - wdev->rate.tx_mcs_map.mcs_ss6 = - (VhtSupRateSetBitmap & 0x0c000000) >> 26; - wdev->rate.tx_mcs_map.mcs_ss7 = - (VhtSupRateSetBitmap & 0x30000000) >> 28; - wdev->rate.tx_mcs_map.mcs_ss8 = - (VhtSupRateSetBitmap & 0xc0000000) >> 30; - -#ifdef DOT11_N_SUPPORT - SetCommonHtVht(pAd, wdev); -#endif /* DOT11_N_SUPPORT */ - UpdateBeaconHandler(pAd, wdev, BCN_UPDATE_IE_CHG); - - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pMacEntry = &pAd->MacTab.Content[i]; - if (IS_ENTRY_CLIENT(pMacEntry) && - (pMacEntry->Sst == SST_ASSOC)) { - if (pMacEntry->wdev != wdev) - continue; - pRaEntry = &pMacEntry->RaEntry; - raWrapperEntrySet(pAd, pMacEntry, pRaEntry); - WifiSysRaInit(pAd, pMacEntry); - } - } - return TRUE; -} -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - -#endif /* COMPOS_WIN */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_ctrl_mt.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_ctrl_mt.c deleted file mode 100644 index da308912a9..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_ctrl_mt.c +++ /dev/null @@ -1,1565 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2014 MediaTek Inc. -* -* All rights reserved. Copying, compilation, modification, distribution -* or any other use whatsoever of this material is strictly prohibited -* except in accordance with a Software License Agreement with -* MediaTek Inc. -******************************************************************************** -*/ - -/******************************************************************************* -* LEGAL DISCLAIMER -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND -* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK -* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE -* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY -* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE -* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY -* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK -* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY -* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE -* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO -* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL -* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT -* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY -* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT -* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING -* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN -* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE -* (ICC). -******************************************************************************** -*/ - -/******************************************************************************* -* E X T E R N A L R E F E R E N C E S -******************************************************************************** -*/ -#if defined(COMPOS_WIN) -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Ra_ctrl_mt.tmh" -#endif -#elif defined(WIFI_BUILD_RAM) -#include "precomp.h" -#else -#include "rt_config.h" -#endif - -#if !defined(WIFI_BUILD_RAM) || (CFG_WIFI_DRIVER_OFFLOAD_RATE_CTRL == 1) -/******************************************************************************* -* C O N S T A N T S -******************************************************************************** -*/ - -/******************************************************************************* -* D A T A T Y P E S -******************************************************************************** -*/ - -/******************************************************************************* -* P U B L I C D A T A -******************************************************************************** -*/ - -/******************************************************************************* -* P R I V A T E D A T A -******************************************************************************** -*/ -#ifdef WIFI_BUILD_RAM -UCHAR tmi_rate_map_cck_lp[] = { - TMI_TX_RATE_CCK_1M_LP, - TMI_TX_RATE_CCK_2M_LP, - TMI_TX_RATE_CCK_5M_LP, - TMI_TX_RATE_CCK_11M_LP, -}; - -UCHAR tmi_rate_map_cck_sp[] = { - TMI_TX_RATE_CCK_2M_SP, - TMI_TX_RATE_CCK_2M_SP, - TMI_TX_RATE_CCK_5M_SP, - TMI_TX_RATE_CCK_11M_SP, -}; - -UCHAR tmi_rate_map_ofdm[] = { - TMI_TX_RATE_OFDM_6M, TMI_TX_RATE_OFDM_9M, TMI_TX_RATE_OFDM_12M, - TMI_TX_RATE_OFDM_18M, TMI_TX_RATE_OFDM_24M, TMI_TX_RATE_OFDM_36M, - TMI_TX_RATE_OFDM_48M, TMI_TX_RATE_OFDM_54M, -}; -#endif /* WIFI_BUILD_RAM */ -/******************************************************************************* -* M A C R O S -******************************************************************************** -*/ - -/******************************************************************************* -* F U N C T I O N D E C L A R A T I O N S -******************************************************************************** -*/ - -/******************************************************************************* -* F U N C T I O N S -******************************************************************************** -*/ -#ifdef MT_MAC -/*----------------------------------------------------------------------------*/ -/*! - * \brief Get max Rssi by RxStream - * - * \param[in] prRaCfg - * \param[in] cRssi0 - * \param[in] cRssi1 - * \param[in] cRssi2 - * - * \return MaxRssi - */ -/*----------------------------------------------------------------------------*/ -CHAR raMaxRssi(IN P_RA_COMMON_INFO_T prRaCfg, IN CHAR cRssi0, IN CHAR cRssi1, - IN CHAR cRssi2) -{ - CHAR cLarger = -100; - - if (prRaCfg->RxStream == 1) - cLarger = cRssi0; - - if (prRaCfg->RxStream >= 2) - cLarger = max(cRssi0, cRssi1); - - if (prRaCfg->RxStream >= 3) - cLarger = max(cLarger, cRssi2); - - /* - * if (prRaCfg->RxStream == 4) - * { - * cLarger = max(cLarger, cRssi3); - * } - */ - return cLarger; -} - -/*----------------------------------------------------------------------------*/ -/*! - * \brief Get min Rssi by RxStream - * - * \param[in] prRaCfg - * \param[in] cRssi0 - * \param[in] cRssi1 - * \param[in] cRssi2 - * - * \return MinRssi - */ -/*----------------------------------------------------------------------------*/ - -CHAR raMinRssi(IN P_RA_COMMON_INFO_T prRaCfg, IN CHAR cRssi0, IN CHAR cRssi1, - IN CHAR cRssi2) -{ - CHAR cMin = -100; - - if (prRaCfg->RxStream == 1) - cMin = cRssi0; - - if (prRaCfg->RxStream >= 2) - cMin = min(cRssi0, cRssi1); - - if (prRaCfg->RxStream >= 3) - cMin = min(cMin, cRssi2); - - return cMin; -} - -#ifdef NEW_RATE_ADAPT_SUPPORT - -/*----------------------------------------------------------------------------*/ -/*! - * \brief Set TxPhy according to MaxPhy, rate table and config - * - * \param[in] pAd - * \param[in] pRaEntry - * \param[in] pRaCfg - * \param[in] pRaInternal - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID SetTxRateMtCore(IN PRTMP_ADAPTER pAd, IN P_RA_ENTRY_INFO_T pRaEntry, - IN P_RA_COMMON_INFO_T pRaCfg, - IN P_RA_INTERNAL_INFO_T pRaInternal, - IN RTMP_RA_GRP_TB *pTxRate) -{ - UCHAR tx_mode = pTxRate->Mode; - UCHAR *pTable; -#ifdef DOT11_VHT_AC - UCHAR tx_bw = pTxRate->BW; -#endif /* DOT11_VHT_AC */ - pTable = pRaInternal->pucTable; -#ifdef DOT11_VHT_AC - - if ((pRaCfg->PhyCaps & fPHY_CAP_VHT) && - ((pTable == RateTableVht2S) || (pTable == RateTableVht1S) || - (pTable == RateTableVht1S_MCS9) || - (pTable == RateTableVht2S_BW20) || - (pTable == RateTableVht2S_BW40) || - (pTable == RateTableVht2S_MCS7))) { - RTMP_RA_GRP_TB *pAdaptTbEntry = (RTMP_RA_GRP_TB *)pTxRate; - UCHAR bw_cap = BW_20; - - if (pAdaptTbEntry->BW != pRaEntry->MaxPhyCfg.BW) { - switch (pRaEntry->MaxPhyCfg.BW) { - case BW_80: - bw_cap = pAdaptTbEntry->BW; - break; - - case BW_40: - if (pAdaptTbEntry->BW == BW_80) - bw_cap = BW_40; - else - bw_cap = pAdaptTbEntry->BW; - - break; - - case BW_10: - bw_cap = BW_10; - break; - - case BW_20: - default: - if (pAdaptTbEntry->BW == BW_80 || - pAdaptTbEntry->BW == BW_40) - bw_cap = BW_20; - else - bw_cap = pAdaptTbEntry->BW; - - break; - } - - tx_bw = bw_cap; - } else - tx_bw = pAdaptTbEntry->BW; - - if (pRaEntry->force_op_mode == TRUE) { - switch (pRaEntry->vhtOpModeChWidth) { - case 1: - bw_cap = BW_40; - break; - - case 2: - bw_cap = BW_80; - break; - - case 0: - default: - bw_cap = BW_20; - break; - } - - if ((tx_bw != BW_10) && (tx_bw >= bw_cap)) - tx_bw = bw_cap; - } - - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s(): txbw=%d, txmode=%d\n", __func__, tx_bw, - tx_mode)); - } - -#endif /* DOT11_VHT_AC */ -#ifdef DOT11_N_SUPPORT - - if (tx_mode == MODE_HTMIX || tx_mode == MODE_HTGREENFIELD) { - if ((pTxRate->STBC) && (pRaEntry->MaxPhyCfg.STBC)) - pRaEntry->TxPhyCfg.STBC = STBC_USE; - else - pRaEntry->TxPhyCfg.STBC = STBC_NONE; - - if ((pTxRate->ShortGI || pRaCfg->TestbedForceShortGI) && - (pRaEntry->MaxPhyCfg.ShortGI)) - pRaEntry->TxPhyCfg.ShortGI = GI_400; - else - pRaEntry->TxPhyCfg.ShortGI = GI_800; - } else - pRaEntry->TxPhyCfg.STBC = STBC_NONE; - -#ifndef COMPOS_WIN - /* TODO: Lens, fix it! */ - pRaEntry->TxPhyCfg.ldpc = 0; - - if (CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_VHT_RX_LDPC_CAPABLE)) - pRaEntry->TxPhyCfg.ldpc |= VHT_LDPC; - - if (CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_HT_RX_LDPC_CAPABLE)) - pRaEntry->TxPhyCfg.ldpc |= HT_LDPC; - -#endif -#ifdef DOT11_VHT_AC - - if (tx_mode == MODE_VHT) { - if ((CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_SGI80_CAPABLE)) && - (pTxRate->ShortGI)) - pRaEntry->TxPhyCfg.ShortGI = GI_400; - else - pRaEntry->TxPhyCfg.ShortGI = GI_800; - - if (pTxRate->STBC && - (CLIENT_STATUS_TEST_FLAG( - pRaEntry, fCLIENT_STATUS_VHT_RXSTBC_CAPABLE))) - pRaEntry->TxPhyCfg.STBC = STBC_USE; - else - pRaEntry->TxPhyCfg.STBC = STBC_NONE; - } - -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - - if (pTxRate->CurrMCS < MCS_AUTO) - pRaEntry->TxPhyCfg.MCS = pTxRate->CurrMCS; - -#ifdef DOT11_N_SUPPORT - - if ((pRaCfg->HtMode == HTMODE_GF) && - (pRaEntry->fgHtCapInfoGF == HTMODE_GF)) - pRaEntry->TxPhyCfg.MODE = MODE_HTGREENFIELD; - else - pRaEntry->TxPhyCfg.MODE = tx_mode; - - if ((pRaCfg->TestbedForceGreenField & pRaEntry->fgHtCapInfoGF) && - (pRaEntry->TxPhyCfg.MODE == MODE_HTMIX)) { - /* force Tx GreenField */ - pRaEntry->TxPhyCfg.MODE = MODE_HTGREENFIELD; - } - - /* BW depends on BSSWidthTrigger and Negotiated BW */ - if (pRaCfg->bRcvBSSWidthTriggerEvents || - (pRaEntry->MaxPhyCfg.BW == BW_20) || - (pRaEntry->ucBBPCurrentBW == BW_20)) - pRaEntry->TxPhyCfg.BW = BW_20; - else - pRaEntry->TxPhyCfg.BW = BW_40; - -#ifdef DOT11_VHT_AC - - if ((pRaEntry->ucBBPCurrentBW == BW_80) && - (pRaEntry->MaxPhyCfg.BW == BW_80) && - pRaEntry->MaxPhyCfg.MODE == MODE_VHT) - pRaEntry->TxPhyCfg.BW = BW_80; - -#ifdef NEW_RATE_ADAPT_SUPPORT - - if ((pTable == RateTableVht2S) || (pTable == RateTableVht2S_BW20) || - (pTable == RateTableVht2S_BW40) || (pTable == RateTableVht1S) || - (pTable == RateTableVht1S_MCS9) || - (pTable == RateTableVht2S_MCS7)) { - RTMP_RA_GRP_TB *pAdaptTbEntry = (RTMP_RA_GRP_TB *)pTxRate; - - pRaEntry->TxPhyCfg.MCS = pAdaptTbEntry->CurrMCS; - pRaEntry->TxPhyCfg.VhtNss = pAdaptTbEntry->dataRate; - pRaEntry->TxPhyCfg.BW = tx_bw; - } else if (pRaEntry->MaxPhyCfg.MODE == MODE_VHT) { - UCHAR bw_max = pRaEntry->MaxPhyCfg.BW; - - if (pRaEntry->force_op_mode == TRUE) { - switch (pRaEntry->vhtOpModeChWidth) { - case 1: - bw_max = BW_40; - break; - - case 2: /* not support for BW_80 for other rate table */ - case 0: - default: - bw_max = BW_20; - break; - } - } - - if ((bw_max != BW_10) && (bw_max > pRaEntry->ucBBPCurrentBW)) - bw_max = pRaEntry->ucBBPCurrentBW; - - pRaEntry->TxPhyCfg.BW = bw_max; - } - -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#endif /* DOT11_VHT_AC */ - - /* Reexam each bandwidth's SGI support. */ - if (((pRaEntry->TxPhyCfg.BW == BW_20) && - !CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_SGI20_CAPABLE)) || - ((pRaEntry->TxPhyCfg.BW == BW_40) && - !CLIENT_STATUS_TEST_FLAG(pRaEntry, fCLIENT_STATUS_SGI40_CAPABLE))) - pRaEntry->TxPhyCfg.ShortGI = GI_800; - -#endif /* DOT11_N_SUPPORT */ -#ifdef DOT11_N_SUPPORT - - /* Disable invalid HT Duplicate modes to prevent PHY error */ - if (pRaEntry->TxPhyCfg.MCS == MCS_32) { - if ((pRaEntry->TxPhyCfg.BW != BW_40) && - (pRaEntry->TxPhyCfg.BW != BW_80)) - pRaEntry->TxPhyCfg.MCS = 0; - } - -#endif /* DOT11_N_SUPPORT */ -#ifdef MCS_LUT_SUPPORT - MtAsicMcsLutUpdateCore(pAd, pRaEntry, pRaCfg, pRaInternal); -#endif /* MCS_LUT_SUPPORT */ -} - -/*----------------------------------------------------------------------------*/ -/*! - * \brief The entrypoint of set new tx rate - * - * \param[in] pAd - * \param[in] pRaEntry - * \param[in] pRaCfg - * \param[in] pRaInternal - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID NewTxRateMtCore(IN PRTMP_ADAPTER pAd, IN P_RA_ENTRY_INFO_T pRaEntry, - IN P_RA_COMMON_INFO_T pRaCfg, - IN P_RA_INTERNAL_INFO_T pRaInternal) -{ - RTMP_RA_GRP_TB *pNextTxRate; - UCHAR *pTable; - - if ((pRaEntry == NULL) || (pRaInternal->pucTable == NULL)) - return; - pTable = pRaInternal->pucTable; - - /* Get pointer to CurrTxRate entry */ -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (ADAPT_RATE_TABLE(pTable)) - pNextTxRate = PTX_RA_GRP_ENTRY(pTable, - pRaInternal->ucCurrTxRateIndex); - else -#endif /* NEW_RATE_ADAPT_SUPPORT */ - { - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:Not GRP table!\n", __func__)); - return; - } - -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (pRaEntry->fgAuthWapiMode) { - if (pTable == RateSwitchTableAdapt11N2S) { - if ((pRaInternal->ucCurrTxRateIndex >= 14) && - (pRaInternal->ucCurrTxRateIndex <= 16)) - pNextTxRate = PTX_RA_GRP_ENTRY(pTable, 13); - } - } - -#endif /* NEW_RATE_ADAPT_SUPPORT */ - /* Set new rate */ - SetTxRateMtCore(pAd, pRaEntry, pRaCfg, pRaInternal, pNextTxRate); -#ifdef DOT11_N_SUPPORT - - /* Disable invalid HT Duplicate modes to prevent PHY error */ - if (pRaEntry->TxPhyCfg.MCS == MCS_32) { - if ((pRaEntry->TxPhyCfg.BW != BW_40) && - (pRaEntry->TxPhyCfg.BW != BW_80)) - pRaEntry->TxPhyCfg.MCS = 0; - else - pRaEntry->TxPhyCfg.STBC = 0; - } - -#endif /* DOT11_N_SUPPORT */ -#ifndef COMPOS_WIN - RA_SAVE_LAST_TX_CFG(pRaEntry); -#endif /* !COMPOS_WIN */ -} -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#if defined(RATE_ADAPT_AGBS_SUPPORT) && \ - (!defined(RACTRL_FW_OFFLOAD_SUPPORT) || defined(WIFI_BUILD_RAM)) -/*----------------------------------------------------------------------------*/ -/*! - * \brief Set TxPhy according to MaxPhy, rate table and config - * - * \param[in] pAd - * \param[in] pRaEntry - * \param[in] pRaCfg - * \param[in] pRaInternal - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID SetTxRateMtCoreAGBS(IN PRTMP_ADAPTER pAd, IN P_RA_ENTRY_INFO_T pRaEntry, - IN P_RA_COMMON_INFO_T pRaCfg, - IN P_RA_INTERNAL_INFO_T pRaInternal) -{ - UINT_8 ucTxMode; - RA_AGBS_TABLE_ENTRY *pTxRate; - UCHAR *pTable; - UINT_8 nsts = 1; - UINT_16 u2PhyRate; - - if ((pRaEntry == NULL) || (pRaInternal->pucTable == NULL)) - return; - pTable = pRaInternal->pucTable; - - /* Get pointer to CurrTxRate entry */ - if (RATE_TABLE_AGBS(pTable)) - pTxRate = RA_AGBS_ENTRY(pTable, pRaInternal->ucCurrTxRateIndex); - else { - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:Not AGBS table!\n", __func__)); - return; - } - - /* TODO: check 7615 need it? */ - ucTxMode = pTxRate->Mode; - /* STBC and GI */ - pRaEntry->TxPhyCfg.STBC = STBC_NONE; - pRaEntry->TxPhyCfg.ShortGI = GI_800; - - if (ucTxMode == MODE_HTMIX || ucTxMode == MODE_HTGREENFIELD) { - if ((pTxRate->STBC) && (pRaEntry->MaxPhyCfg.STBC)) - pRaEntry->TxPhyCfg.STBC = STBC_USE; - - /* if (pTxRate->ShortGI || pRaCfg->TestbedForceShortGI) */ - if (((pRaEntry->ucCERMSD > RA_RMDS_THRD) || - (pTxRate->ShortGI) || - (pRaInternal->ucDynamicSGIState == - RA_DYNAMIC_SGI_TRY_SUCCESS_STATE)) || - pRaCfg->TestbedForceShortGI) { - if (CLIENT_STATUS_TEST_FLAG( - pRaEntry, fCLIENT_STATUS_SGI20_CAPABLE)) - pRaEntry->TxPhyCfg.ShortGI |= SGI_20; - - if (CLIENT_STATUS_TEST_FLAG( - pRaEntry, fCLIENT_STATUS_SGI40_CAPABLE)) - pRaEntry->TxPhyCfg.ShortGI |= SGI_40; - } - } - -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC - - if (ucTxMode == MODE_VHT) { - if (pTxRate->STBC && - (CLIENT_STATUS_TEST_FLAG( - pRaEntry, fCLIENT_STATUS_VHT_RXSTBC_CAPABLE))) - pRaEntry->TxPhyCfg.STBC = STBC_USE; - - /* if (pTxRate->ShortGI */ - if (((pRaEntry->ucCERMSD > RA_RMDS_THRD) || - (pTxRate->ShortGI) || - (pRaInternal->ucDynamicSGIState == - RA_DYNAMIC_SGI_TRY_SUCCESS_STATE))) { - if (CLIENT_STATUS_TEST_FLAG( - pRaEntry, fCLIENT_STATUS_SGI20_CAPABLE)) - pRaEntry->TxPhyCfg.ShortGI |= SGI_20; - - if (CLIENT_STATUS_TEST_FLAG( - pRaEntry, fCLIENT_STATUS_SGI40_CAPABLE)) - pRaEntry->TxPhyCfg.ShortGI |= SGI_40; - - if (CLIENT_STATUS_TEST_FLAG( - pRaEntry, fCLIENT_STATUS_SGI80_CAPABLE)) - pRaEntry->TxPhyCfg.ShortGI |= SGI_80; - - if (CLIENT_STATUS_TEST_FLAG( - pRaEntry, fCLIENT_STATUS_SGI160_CAPABLE)) - pRaEntry->TxPhyCfg.ShortGI |= SGI_160; - } - } - -#endif /* DOT11_VHT_AC */ - /* LDPC */ -#ifndef COMPOS_WIN - /* TODO: Lens, fix it! */ - pRaEntry->TxPhyCfg.ldpc = 0; - - if (CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_HT_RX_LDPC_CAPABLE)) - pRaEntry->TxPhyCfg.ldpc |= HT_LDPC; - -#ifdef DOT11_VHT_AC - - if (CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_VHT_RX_LDPC_CAPABLE)) - pRaEntry->TxPhyCfg.ldpc |= VHT_LDPC; - -#endif /* DOT11_VHT_AC */ -#endif -#endif /* DOT11_N_SUPPORT */ - - /* MCS */ - if (pTxRate->CurrMCS < MCS_AUTO) - pRaEntry->TxPhyCfg.MCS = pTxRate->CurrMCS; - - /* PHY Mode */ - pRaEntry->TxPhyCfg.MODE = ucTxMode; - - if ((pRaCfg->HtMode == HTMODE_GF) && - (pRaEntry->fgHtCapInfoGF == HTMODE_GF)) - pRaEntry->TxPhyCfg.MODE = MODE_HTGREENFIELD; - - if ((pRaCfg->TestbedForceGreenField & pRaEntry->fgHtCapInfoGF) && - (pRaEntry->TxPhyCfg.MODE == MODE_HTMIX)) { - /* force Tx GreenField */ - pRaEntry->TxPhyCfg.MODE = MODE_HTGREENFIELD; - } - - /* BW */ - /* TODO: fix it at auto BW */ - /* BW depends on BSSWidthTrigger and Negotiated BW */ - if (pRaCfg->bRcvBSSWidthTriggerEvents || - (pRaEntry->MaxPhyCfg.BW == BW_20) || - (pRaEntry->ucBBPCurrentBW == BW_20)) - pRaEntry->TxPhyCfg.BW = BW_20; - else - pRaEntry->TxPhyCfg.BW = BW_40; - - if (((pRaEntry->ucBBPCurrentBW == BW_80) || - (pRaEntry->ucBBPCurrentBW == BW_160) || - (pRaEntry->ucBBPCurrentBW == BW_8080)) && - (pRaEntry->MaxPhyCfg.BW == BW_80) && - (pRaEntry->MaxPhyCfg.MODE == MODE_VHT)) - pRaEntry->TxPhyCfg.BW = BW_80; - - if (((pRaEntry->ucBBPCurrentBW == BW_160) || - (pRaEntry->ucBBPCurrentBW == BW_8080)) && - (pRaEntry->MaxPhyCfg.BW == BW_160) && - (pRaEntry->MaxPhyCfg.MODE == MODE_VHT)) - pRaEntry->TxPhyCfg.BW = BW_160; - - if (pRaInternal->ucDynamicBWState != RA_DYNAMIC_BW_UNCHANGED_STATE) - pRaEntry->TxPhyCfg.BW = pRaInternal->ucDynamicBW; - -#ifdef DOT11_VHT_AC - - if (WMODE_CAP_AC(pRaEntry->ucPhyMode) && - (pRaEntry->ucSupportRateMode & SUPPORT_VHT_MODE) && - AGBS_VHT_TABLE(pRaInternal->pucTable)) { - UINT_8 ucBwCap = BW_20; - - pRaEntry->TxPhyCfg.VhtNss = pRaInternal->ucMcsGroup; - - if (pRaEntry->force_op_mode == TRUE) { - switch (pRaEntry->vhtOpModeChWidth) { - case 1: - ucBwCap = BW_40; - break; - - case 2: - ucBwCap = BW_80; - break; - - case 3: - ucBwCap = BW_160; - break; - - case 0: - default: - ucBwCap = BW_20; - break; - } - - if (ucBwCap <= pRaEntry->MaxPhyCfg.BW) - pRaEntry->TxPhyCfg.BW = ucBwCap; - - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s(): TxPhyCfg.BW=%d, ucBwCap=%d\n", - __func__, pRaEntry->TxPhyCfg.BW, ucBwCap)); - } - } - -#endif /* DOT11_VHT_AC */ - - if ((pRaEntry->ucGband256QAMSupport) && (ucTxMode == MODE_VHT)) - pRaEntry->TxPhyCfg.VhtNss = pRaInternal->ucMcsGroup; - -#ifdef DOT11_N_SUPPORT - - /* Disable invalid HT Duplicate modes to prevent PHY error */ - if (pRaEntry->TxPhyCfg.MCS == MCS_32) { - if ((pRaEntry->TxPhyCfg.BW != BW_40) && - (pRaEntry->TxPhyCfg.BW != BW_80) && - (pRaEntry->TxPhyCfg.BW != BW_160) && - (pRaEntry->TxPhyCfg.BW != BW_8080)) - pRaEntry->TxPhyCfg.MCS = 0; - } - - if (pRaCfg->u2MaxPhyRate != 0) { - u2PhyRate = raGetPhyRate(pRaEntry->TxPhyCfg.MODE, - pRaEntry->TxPhyCfg.MCS, - pRaEntry->TxPhyCfg.VhtNss, - pRaEntry->TxPhyCfg.BW, - pRaEntry->TxPhyCfg.ShortGI); - - if ((pRaCfg->u2MaxPhyRate != 0) && - (u2PhyRate > pRaCfg->u2MaxPhyRate) && - (pRaCfg->TestbedForceShortGI == FALSE)) - pRaEntry->TxPhyCfg.ShortGI = GI_800; - } - -#endif /* DOT11_N_SUPPORT */ - - if (pRaCfg->ucForceTxStream != 0) { - if ((pRaEntry->TxPhyCfg.MODE == MODE_HTMIX) || - (pRaEntry->TxPhyCfg.MODE == MODE_HTMIX)) { - if (pRaEntry->TxPhyCfg.MCS != MCS_32) { - nsts += (pRaEntry->TxPhyCfg.MCS >> 3); - - if ((pRaEntry->TxPhyCfg.STBC == STBC_USE) && - (nsts == 1)) - nsts++; - } - - if (nsts > pRaCfg->ucForceTxStream) { - if ((pRaEntry->TxPhyCfg.STBC == STBC_USE) && - (pRaCfg->ucForceTxStream == 1)) - pRaEntry->TxPhyCfg.STBC = STBC_NONE; - else - pRaEntry->TxPhyCfg.MCS = - (pRaEntry->TxPhyCfg.MCS & 0x7) + - ((pRaCfg->ucForceTxStream - 1) - << 3); - } - } else if (pRaEntry->TxPhyCfg.MODE == MODE_VHT) { - if ((pRaEntry->TxPhyCfg.STBC == STBC_USE) && - (pRaEntry->TxPhyCfg.VhtNss == 1)) - nsts++; - else - nsts = pRaEntry->TxPhyCfg.VhtNss; - - if (nsts > pRaCfg->ucForceTxStream) { - if ((pRaEntry->TxPhyCfg.STBC == STBC_USE) && - (pRaCfg->ucForceTxStream == 1)) - pRaEntry->TxPhyCfg.STBC = STBC_NONE; - else - pRaEntry->TxPhyCfg.VhtNss = - pRaCfg->ucForceTxStream; - } - } - } - -#ifdef MCS_LUT_SUPPORT - MtAsicMcsLutUpdateCoreAGBS(pAd, pRaEntry, pRaCfg, pRaInternal); -#endif /* MCS_LUT_SUPPORT */ -} - -/*----------------------------------------------------------------------------*/ -/*! - * \brief Notify max AMSDU length to CR4 - * - * \param[in] pRaEntry - * \param[in] pRaInternal - * \param[OUT] - * - * \return none - */ -/*----------------------------------------------------------------------------*/ -VOID raMaxAmsduLenNotifyAGBS(IN P_RA_ENTRY_INFO_T pRaEntry, - IN P_RA_INTERNAL_INFO_T pRaInternal) -{ -#ifdef WIFI_BUILD_RAM -#if (PRODUCT_VERSION == 7615) - UINT_8 ucTxMode; - RA_AGBS_TABLE_ENTRY *pTxRate; - UCHAR *pTable; - UINT_8 ucMaxAmsduLength = 0; - - if ((pRaEntry == NULL) || (pRaInternal->pucTable == NULL)) - return; - pTable = pRaInternal->pucTable; - - /* Get pointer to CurrTxRate entry */ - if (RATE_TABLE_AGBS(pTable)) - pTxRate = RA_AGBS_ENTRY(pTable, pRaInternal->ucCurrTxRateIndex); - else { - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:Not AGBS table!\n", __func__)); - return; - } - - switch (pRaEntry->TxPhyCfg.BW) { - case BW_20: - ucMaxAmsduLength = pTxRate->AmsduLenBw20; - break; - - case BW_40: - ucMaxAmsduLength = pTxRate->AmsduLenBw40; - break; - - case BW_80: - ucMaxAmsduLength = pTxRate->AmsduLenBw80; - break; - - case BW_160: - ucMaxAmsduLength = pTxRate->AmsduLenBw160; - break; - - default: - ucMaxAmsduLength = 0; - break; - } - - hemExtEventMaxAMSDULengthUpdate(pRaEntry->ucWcid, ucMaxAmsduLength); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMaxAmsduLength=%d\n", ucMaxAmsduLength)); -#endif -#endif /* WIFI_BUILD_RAM */ -} -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - -/*----------------------------------------------------------------------------*/ -/*! - * \brief The entrypoint of select tx rate table. - * - * \param[in] pRaEntry - * \param[in] pRaCfg - * \param[in] pRaInternal - * \param[OUT] ppTable - * \param[OUT] pTableSize - * \param[OUT] pInitTxRateIdx - * - * \return none - */ -/*----------------------------------------------------------------------------*/ -VOID raSelectTxRateTable(IN P_RA_ENTRY_INFO_T pRaEntry, - IN P_RA_COMMON_INFO_T pRaCfg, - IN P_RA_INTERNAL_INFO_T pRaInternal, - OUT UCHAR **ppTable, OUT UCHAR *pTableSize, - OUT UCHAR *pInitTxRateIdx) -{ - *ppTable = NULL; - - do { -#ifdef DOT11_VHT_AC -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (pRaCfg->ucRateAlg == RATE_ALG_GRP) - *ppTable = raSelectVHTTxRateTableGRP(pRaEntry, pRaCfg, - pRaInternal); - -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#if defined(RATE_ADAPT_AGBS_SUPPORT) && \ - (!defined(RACTRL_FW_OFFLOAD_SUPPORT) || defined(WIFI_BUILD_RAM)) - - if (pRaCfg->ucRateAlg == RATE_ALG_AGBS) - *ppTable = raSelectVHTTxRateTableAGBS(pRaEntry, pRaCfg, - pRaInternal); - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - - if (*ppTable) - break; - -#endif /* DOT11_VHT_AC */ -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (pRaCfg->ucRateAlg == RATE_ALG_GRP) - *ppTable = raSelectTxRateTableGRP(pRaEntry, pRaCfg, - pRaInternal); - -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#if defined(RATE_ADAPT_AGBS_SUPPORT) && \ - (!defined(RACTRL_FW_OFFLOAD_SUPPORT) || defined(WIFI_BUILD_RAM)) - - if (pRaCfg->ucRateAlg == RATE_ALG_AGBS) - *ppTable = raSelectTxRateTableAGBS(pRaEntry, pRaCfg, - pRaInternal); - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - } while (FALSE); - -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (pRaCfg->ucRateAlg == RATE_ALG_GRP) { - if (ADAPT_RATE_TABLE(*ppTable) == FALSE) { - *ppTable = RateSwitchTableAdapt11B; - MTWF_LOG( - DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid Rate Table, Set to RateSwitchTableAdapt11B.\n", - __func__)); - } - } - -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#if defined(RATE_ADAPT_AGBS_SUPPORT) && \ - (!defined(RACTRL_FW_OFFLOAD_SUPPORT) || defined(WIFI_BUILD_RAM)) - - if (pRaCfg->ucRateAlg == RATE_ALG_AGBS) { - if (RATE_TABLE_AGBS(*ppTable) == FALSE) { - *ppTable = RateSwitchTableAGBS11B; - MTWF_LOG( - DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s: Invalid Rate Table, Set to RateSwitchTableAGBS11B\n", - __func__)); - } - } - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - - if (*ppTable) { - *pTableSize = RATE_TABLE_SIZE(*ppTable); - *pInitTxRateIdx = RATE_TABLE_INIT_INDEX(*ppTable); - } else - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:TX rate table is Null!\n", __func__)); -} - -#ifdef MCS_LUT_SUPPORT -#ifdef WIFI_BUILD_RAM -/*----------------------------------------------------------------------------*/ -/*! - * \brief convert TX rate format to TMI format (copy from mt_mac.c) - * - * \param[in] mode - * \param[in] mcs - * \param[in] nss - * \param[in] stbc - * \param[in] preamble - * - * \return TMI rate - */ -/*----------------------------------------------------------------------------*/ -UINT_16 -tx_rate_to_tmi_rate(IN UINT_8 mode, IN UINT_8 mcs, IN UINT_8 nss, IN BOOL stbc, - IN UINT_8 preamble) -{ - UINT_16 tmi_rate = 0, mcs_id = 0; - - stbc = (stbc == TRUE) ? 1 : 0; - - switch (mode) { - case MODE_CCK: - if (preamble) - mcs_id = tmi_rate_map_cck_lp[mcs]; - else - mcs_id = tmi_rate_map_cck_sp[mcs]; - - tmi_rate = (TMI_TX_RATE_MODE_CCK << TMI_TX_RATE_BIT_MODE) | - (mcs_id); - break; - - case MODE_OFDM: - mcs_id = tmi_rate_map_ofdm[mcs]; - tmi_rate = (TMI_TX_RATE_MODE_OFDM << TMI_TX_RATE_BIT_MODE) | - (mcs_id); - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - tmi_rate = ((USHORT)(stbc << TMI_TX_RATE_BIT_STBC)) | - (((nss - 1) & TMI_TX_RATE_MASK_NSS) - << TMI_TX_RATE_BIT_NSS) | - ((USHORT)(mode << TMI_TX_RATE_BIT_MODE)) | - ((USHORT)(mcs)); - /* MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s(): mode=%d, mcs=%d, stbc=%d converted tmi_rate=0x%x\n", */ - /* __FUNCTION__, mode, mcs, stbc, tmi_rate)); */ - break; - - case MODE_VHT: - tmi_rate = TMI_TX_RATE_VHT_VAL(nss, mcs, stbc); - break; - - default: - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s():Invalid mode(mode=%d)\n", __func__, mode)); - break; - } - - return tmi_rate; -} - -/*----------------------------------------------------------------------------*/ -/*! - * \brief get nss by mcs setting (copy from mt_mac.c) - * - * \param[in] phy_mode - * \param[in] mcs - * \param[in] stbc - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -UINT_8 -get_nsts_by_mcs(UINT_8 phy_mode, UINT_8 mcs, BOOL stbc, UINT_8 vht_nss) -{ - UINT_8 nsts = 1; - - switch (phy_mode) { - case MODE_VHT: - if (stbc && (vht_nss == 1)) - nsts++; - else - nsts = vht_nss; - - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - if (mcs != 32) { - nsts += (mcs >> 3); - - if (stbc && (nsts == 1)) - nsts++; - } - - break; - - case MODE_CCK: - case MODE_OFDM: - default: - break; - } - - return nsts; -} -#endif /* WIFI_BUILD_RAM */ - -/*----------------------------------------------------------------------------*/ -/*! - * \brief check if STBC setting violate 802.11 spec and HW limit - * - * \param[in] ucOrigStbc - * \param[in] ucMode - * \param[in] ucMcs - * \param[in] ucVhtNss - * \param[in] fgForceOneTx - * - * \return STBC - */ -/*----------------------------------------------------------------------------*/ -UINT_8 -raStbcSettingCheck(UINT_8 ucOrigStbc, UINT_8 ucMode, UINT_8 ucMcs, - UINT_8 ucVhtNss, BOOL fgBFOn, BOOL fgForceOneTx) -{ - UINT_8 ucStbc = 0; - - if (fgForceOneTx == TRUE) - return ucStbc; - - if (fgBFOn == TRUE) - return ucStbc; - - switch (ucMode) { - case MODE_VHT: - if (ucVhtNss == 1) - ucStbc = ucOrigStbc; - else - ucStbc = 0; - - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - if (ucMcs < MCS_8) - ucStbc = ucOrigStbc; - else - ucStbc = 0; - - break; - - case MODE_CCK: - case MODE_OFDM: - default: - ucStbc = 0; - break; - } - - return ucStbc; -} - -#ifdef NEW_RATE_ADAPT_SUPPORT -/*----------------------------------------------------------------------------*/ -/*! - * \brief set tx rate table in wtbl2 by TxPhyCfg - * - * \param[in] phy_mode - * \param[in] mcs - * \param[in] stbc - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID MtAsicMcsLutUpdateCore(IN PRTMP_ADAPTER pAd, IN P_RA_ENTRY_INFO_T pRaEntry, - IN P_RA_COMMON_INFO_T pRaCfg, - IN P_RA_INTERNAL_INFO_T pRaInternal) -{ - UINT_32 rate[8]; - UINT_8 stbc, nsts, preamble, ucVhtNss; - BOOL fgSpeEn = FALSE; - UINT_8 ucIndex; - BOOL fgBFOn = FALSE; - /* CHAR rssi; */ - - if (pRaCfg->fgShortPreamble == TRUE) - preamble = SHORT_PREAMBLE; - else - preamble = LONG_PREAMBLE; - - stbc = raStbcSettingCheck(pRaEntry->TxPhyCfg.STBC, - pRaEntry->TxPhyCfg.MODE, - pRaEntry->TxPhyCfg.MCS, - pRaEntry->TxPhyCfg.VhtNss, fgBFOn, - pRaCfg->force_one_tx_stream); - nsts = get_nsts_by_mcs(pRaEntry->TxPhyCfg.MODE, pRaEntry->TxPhyCfg.MCS, - stbc, pRaEntry->TxPhyCfg.VhtNss); - - if (((pRaEntry->ucMmpsMode != MMPS_STATIC) || - (pRaEntry->TxPhyCfg.MODE < MODE_HTMIX)) && - (pRaCfg->force_one_tx_stream == FALSE)) { - /* rssi = raMaxRssi(pRaCfg, pRaEntry->AvgRssiSample[0], pRaEntry->AvgRssiSample[1], pRaEntry->AvgRssiSample[2]); */ - /* if (rssi < -50 ) */ - { - fgSpeEn = TRUE; - } - } - - rate[0] = tx_rate_to_tmi_rate(pRaEntry->TxPhyCfg.MODE, - pRaEntry->TxPhyCfg.MCS, nsts, stbc, - preamble); - rate[0] &= 0xfff; - - if (pRaEntry->fgAutoTxRateSwitch == TRUE) { - BOOL fgLowestRate = FALSE; - UCHAR DownRateIdx, CurrRateIdx; - UCHAR mode, mcs; - - CurrRateIdx = pRaInternal->ucCurrTxRateIndex; - DownRateIdx = CurrRateIdx; - - for (ucIndex = 1; ucIndex < 8; ucIndex++) { - if (ADAPT_RATE_TABLE(pRaInternal->pucTable)) { - RTMP_RA_GRP_TB *pCurrTxRate; - - if (ucIndex == 7) { - if (fgLowestRate == FALSE) { - do { - CurrRateIdx = - DownRateIdx; - DownRateIdx = raSelectDownRate( - pRaEntry, - pRaCfg, - pRaInternal, - CurrRateIdx); - } while (CurrRateIdx != - DownRateIdx); - } - } else { - if (fgLowestRate == FALSE) - DownRateIdx = raSelectDownRate( - pRaEntry, pRaCfg, - pRaInternal, - CurrRateIdx); - } - - if (pRaEntry->TxPhyCfg.ShortGI) { - pCurrTxRate = PTX_RA_GRP_ENTRY( - pRaInternal->pucTable, - DownRateIdx); - - if (pCurrTxRate->CurrMCS == - pRaEntry->TxPhyCfg.MCS) { - CurrRateIdx = DownRateIdx; - DownRateIdx = raSelectDownRate( - pRaEntry, pRaCfg, - pRaInternal, - CurrRateIdx); - } - } - - pCurrTxRate = PTX_RA_GRP_ENTRY( - pRaInternal->pucTable, DownRateIdx); - mode = pCurrTxRate->Mode; - mcs = pCurrTxRate->CurrMCS; - ucVhtNss = - (pRaEntry->TxPhyCfg.MODE == MODE_VHT) ? - pCurrTxRate->dataRate : - 0; - } else { - mode = MODE_CCK; - mcs = 0; - DownRateIdx = 0; - ucVhtNss = 0; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("%s: Not support legacy table.\n", - __func__)); - } - - stbc = raStbcSettingCheck(pRaEntry->TxPhyCfg.STBC, mode, - mcs, ucVhtNss, fgBFOn, - pRaCfg->force_one_tx_stream); - nsts = get_nsts_by_mcs(mode, mcs, stbc, ucVhtNss); - rate[ucIndex] = tx_rate_to_tmi_rate(mode, mcs, nsts, - stbc, preamble); - rate[ucIndex] &= 0xfff; - - if (CurrRateIdx == DownRateIdx) - fgLowestRate = TRUE; - else - CurrRateIdx = DownRateIdx; - } - } else - rate[1] = rate[2] = rate[3] = rate[4] = rate[5] = rate[6] = - rate[7] = rate[0]; - - MtAsicTxCapAndRateTableUpdate(pAd, pRaEntry->ucWcid, - &pRaEntry->TxPhyCfg, rate, fgSpeEn); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():WCID=%d\n", __func__, pRaEntry->ucWcid)); - MTWF_LOG( - DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("\tCurTxRateIdx=%d, Mode/BW/MCS/STBC/LDPC/SGI=%d/%d/%d/%d/%d/%d\n\n", - pRaInternal->ucCurrTxRateIndex, pRaEntry->TxPhyCfg.MODE, - pRaEntry->TxPhyCfg.BW, pRaEntry->TxPhyCfg.MCS, - pRaEntry->TxPhyCfg.STBC, pRaEntry->TxPhyCfg.ldpc, - pRaEntry->TxPhyCfg.ShortGI)); -} -#endif /* NEW_RATE_ADAPT_SUPPORT */ - -#if defined(RATE_ADAPT_AGBS_SUPPORT) && \ - (!defined(RACTRL_FW_OFFLOAD_SUPPORT) || defined(WIFI_BUILD_RAM)) -/*----------------------------------------------------------------------------*/ -/*! - * \brief set tx rate table in wtbl2 by TxPhyCfg - * - * \param[in] phy_mode - * \param[in] mcs - * \param[in] stbc - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID MtAsicMcsLutUpdateCoreAGBS(IN PRTMP_ADAPTER pAd, - IN P_RA_ENTRY_INFO_T pRaEntry, - IN P_RA_COMMON_INFO_T pRaCfg, - IN P_RA_INTERNAL_INFO_T pRaInternal) -{ - RA_AGBS_TABLE_ENTRY *pTxRate; - UINT_32 rate[8]; - UINT_8 stbc, nsts, preamble; - UINT_8 uc_cbrn = 7; - BOOL fgSpeEn = FALSE; - BOOL fgBFOn = FALSE; - - if (pRaCfg->fgShortPreamble == TRUE) - preamble = SHORT_PREAMBLE; - else - preamble = LONG_PREAMBLE; - - stbc = raStbcSettingCheck(pRaEntry->TxPhyCfg.STBC, - pRaEntry->TxPhyCfg.MODE, - pRaEntry->TxPhyCfg.MCS, - pRaEntry->TxPhyCfg.VhtNss, fgBFOn, - pRaCfg->force_one_tx_stream); - nsts = get_nsts_by_mcs(pRaEntry->TxPhyCfg.MODE, pRaEntry->TxPhyCfg.MCS, - stbc, pRaEntry->TxPhyCfg.VhtNss); - - if (((pRaEntry->ucMmpsMode != MMPS_STATIC) || - (pRaEntry->TxPhyCfg.MODE < MODE_HTMIX)) && - (pRaCfg->force_one_tx_stream == FALSE) && - (pRaCfg->ucForceTxStream == 0)) { - if (fgBFOn) { - } else { - UINT_8 ucMcs = MCS_7; - - if (pRaEntry->TxPhyCfg.MODE < MODE_HTMIX) - fgSpeEn = TRUE; - else { - if ((pRaEntry->TxPhyCfg.MODE == MODE_HTMIX) || - (pRaEntry->TxPhyCfg.MODE == - MODE_HTGREENFIELD)) - ucMcs = pRaEntry->TxPhyCfg.MCS & 0x7; - else if (pRaEntry->TxPhyCfg.MODE == MODE_VHT) - ucMcs = pRaEntry->TxPhyCfg.MCS; - - if ((pRaEntry->TxPhyCfg.BW == BW_160) && - (pRaEntry->TxPhyCfg.MODE == MODE_VHT)) { - if ((nsts == 1) && (ucMcs <= MCS_6)) - fgSpeEn = TRUE; - } else { - if ((nsts == 1) || (nsts == 2)) { - if (ucMcs <= MCS_6) - fgSpeEn = TRUE; - } else if (nsts == 3) { - if (ucMcs <= MCS_3) - fgSpeEn = TRUE; - } - } - } - } - } - - rate[0] = tx_rate_to_tmi_rate(pRaEntry->TxPhyCfg.MODE, - pRaEntry->TxPhyCfg.MCS, nsts, stbc, - preamble); - rate[0] &= 0xfff; - - if (pRaEntry->fgAutoTxRateSwitch == TRUE) { - UINT_32 u4TableSize; - UINT_16 *pu2FallbackTable = NULL; - UINT_8 ucIndex; - BOOL fgFound = FALSE; - - if (pRaEntry->TxPhyCfg.MODE == MODE_CCK) { - pu2FallbackTable = HwFallbackTable11B; - u4TableSize = sizeof(HwFallbackTable11B) / 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("HwFallbackTable11B\n")); - } else if (pRaInternal->pucTable == RateSwitchTableAGBS11BG) { - pu2FallbackTable = HwFallbackTable11BG; - u4TableSize = sizeof(HwFallbackTable11BG) / 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("HwFallbackTable11BG\n")); - } else if (pRaEntry->TxPhyCfg.MODE == MODE_OFDM) { - pu2FallbackTable = HwFallbackTable11G; - u4TableSize = sizeof(HwFallbackTable11G) / 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("HwFallbackTable11G\n")); - } -#ifdef DOT11_N_SUPPORT - else if (AGBS_HT_TABLE(pRaInternal->pucTable)) { - UINT_8 ucHtNss = 1; - - if (pRaEntry->TxPhyCfg.MODE == MODE_VHT) - ucHtNss = pRaEntry->TxPhyCfg.VhtNss; - else - ucHtNss += (pRaEntry->TxPhyCfg.MCS >> 3); - - if ((pRaEntry->ucChannel <= 14) && - (pRaEntry->ucSupportRateMode & - (SUPPORT_CCK_MODE))) { - switch (ucHtNss) { - case 1: - pu2FallbackTable = - HwFallbackTableBGN1SS; - u4TableSize = - sizeof(HwFallbackTableBGN1SS) / - 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTableBGN1SS\n")); - break; - - case 2: - pu2FallbackTable = - HwFallbackTableBGN2SS; - u4TableSize = - sizeof(HwFallbackTableBGN2SS) / - 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTableBGN2SS\n")); - break; - - case 3: - pu2FallbackTable = - HwFallbackTableBGN3SS; - u4TableSize = - sizeof(HwFallbackTableBGN3SS) / - 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTableBGN3SS\n")); - break; - - case 4: - pu2FallbackTable = - HwFallbackTableBGN4SS; - u4TableSize = - sizeof(HwFallbackTableBGN4SS) / - 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTableBGN4SS\n")); - break; - - default: - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Unknow Nss%d!\n", ucHtNss)); - break; - } - } else { - switch (ucHtNss) { - case 1: - pu2FallbackTable = - HwFallbackTable11N1SS; - u4TableSize = - sizeof(HwFallbackTable11N1SS) / - 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTable11N1SS\n")); - break; - - case 2: - pu2FallbackTable = - HwFallbackTable11N2SS; - u4TableSize = - sizeof(HwFallbackTable11N2SS) / - 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTable11N2SS\n")); - break; - - case 3: - pu2FallbackTable = - HwFallbackTable11N3SS; - u4TableSize = - sizeof(HwFallbackTable11N3SS) / - 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTable11N3SS\n")); - break; - - case 4: - pu2FallbackTable = - HwFallbackTable11N4SS; - u4TableSize = - sizeof(HwFallbackTable11N4SS) / - 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTable11N4SS\n")); - break; - - default: - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Unknow Nss%d!\n", ucHtNss)); - break; - } - } - } -#ifdef DOT11_VHT_AC - else if (AGBS_VHT_TABLE(pRaInternal->pucTable)) { - switch (pRaEntry->TxPhyCfg.VhtNss) { - case 1: - pu2FallbackTable = HwFallbackTableVht1SS; - u4TableSize = sizeof(HwFallbackTableVht1SS) / 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTableVht1SS\n")); - break; - - case 2: - pu2FallbackTable = HwFallbackTableVht2SS; - u4TableSize = sizeof(HwFallbackTableVht2SS) / 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTableVht2SS\n")); - break; - - case 3: { - pu2FallbackTable = HwFallbackTableVht3SS; - u4TableSize = sizeof(HwFallbackTableVht3SS) / 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTableVht3SS\n")); - } - - break; - - case 4: - pu2FallbackTable = HwFallbackTableVht4SS; - u4TableSize = sizeof(HwFallbackTableVht4SS) / 2; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("HwFallbackTableVht4SS\n")); - break; - - default: - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, - DBG_LVL_ERROR, - ("Unknow Nss%d!\n", - pRaEntry->TxPhyCfg.VhtNss)); - break; - } - } - -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - - if (pu2FallbackTable != NULL) { - for (ucIndex = 0; ucIndex < u4TableSize; ucIndex += 8) { - union RA_RATE_CODE rInitialRate; - - rInitialRate.word = - *(pu2FallbackTable + ucIndex); - - if ((rInitialRate.field.mcs == - (rate[0] & TMI_TX_RATE_MASK_MCS)) && - (rInitialRate.field.mode == - ((rate[0] >> TMI_TX_RATE_BIT_MODE) & - TMI_TX_RATE_MASK_MODE))) { - fgFound = TRUE; - break; - } - } - - if (fgFound) { - UINT_8 ucIdx; - union RA_RATE_CODE rRateCode; - - for (ucIdx = 1; ucIdx < 8; ucIdx++) { - rRateCode.word = *(pu2FallbackTable + - ucIndex + ucIdx); - - if (((pRaEntry->TxPhyCfg.MODE == - MODE_HTMIX) || - (pRaEntry->TxPhyCfg.MODE == - MODE_VHT)) && - stbc && - (rRateCode.field.nsts == 0)) { - rRateCode.field.nsts = 1; - rRateCode.field.stbc = 1; - } - - rate[ucIdx] = rRateCode.word; - } - } - } - - if (!fgFound) { - rate[1] = rate[2] = rate[3] = rate[4] = rate[5] = - rate[6] = rate[7] = rate[0]; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Cannot find fallback table!\n")); - } - - /* Set CBRN */ - pTxRate = RA_AGBS_ENTRY(pRaInternal->pucTable, - pRaInternal->ucCurrTxRateIndex); - uc_cbrn = pTxRate->CBRN; - } else - rate[1] = rate[2] = rate[3] = rate[4] = rate[5] = rate[6] = - rate[7] = rate[0]; - - MtAsicTxCapAndRateTableUpdate(pAd, pRaEntry->ucWcid, - &pRaEntry->TxPhyCfg, rate, fgSpeEn); - MTWF_LOG( - DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("DRS: WCID=%d, %s - CurTxRateIdx=%d, Mode/BW/MCS/VHT_NSS/STBC/LDPC/SGI=%d/%d/%d/%d/%d/%d/%d\n", - pRaEntry->ucWcid, __func__, pRaInternal->ucCurrTxRateIndex, - pRaEntry->TxPhyCfg.MODE, pRaEntry->TxPhyCfg.BW, - pRaEntry->TxPhyCfg.MCS, pRaEntry->TxPhyCfg.VhtNss, - pRaEntry->TxPhyCfg.STBC, pRaEntry->TxPhyCfg.ldpc, - pRaEntry->TxPhyCfg.ShortGI)); -} -#endif /* RATE_ADAPT_AGBS_SUPPORT */ -#endif /* MCS_LUT_SUPPORT */ - -#endif /* MT_MAC */ -#endif diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_ctrl_mt_drv.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_ctrl_mt_drv.c deleted file mode 100644 index ef81766bb3..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_ctrl_mt_drv.c +++ /dev/null @@ -1,676 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2014 MediaTek Inc. -* -* All rights reserved. Copying, compilation, modification, distribution -* or any other use whatsoever of this material is strictly prohibited -* except in accordance with a Software License Agreement with -* MediaTek Inc. -******************************************************************************** -*/ - -/******************************************************************************* -* LEGAL DISCLAIMER -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND -* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK -* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE -* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY -* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE -* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY -* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK -* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY -* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE -* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO -* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL -* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT -* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY -* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT -* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING -* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN -* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE -* (ICC). -******************************************************************************** -*/ - -/******************************************************************************* -* E X T E R N A L R E F E R E N C E S -******************************************************************************** -*/ -#if defined(COMPOS_WIN) -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Ra_ctrl_mt.tmh" -#endif -#else -#include "rt_config.h" -#endif - -/******************************************************************************* -* C O N S T A N T S -******************************************************************************** -*/ - -/******************************************************************************* -* D A T A T Y P E S -******************************************************************************** -*/ - -/******************************************************************************* -* P U B L I C D A T A -******************************************************************************** -*/ - -/******************************************************************************* -* P R I V A T E D A T A -******************************************************************************** -*/ -/******************************************************************************* -* M A C R O S -******************************************************************************** -*/ - -/******************************************************************************* -* F U N C T I O N D E C L A R A T I O N S -******************************************************************************** -*/ - -/******************************************************************************* -* F U N C T I O N S -******************************************************************************** -*/ -#ifdef MT_MAC -/*----------------------------------------------------------------------------*/ -/*! -* \brief Initialize Rate Adaptation for this entry -* -* \param[in] pAd -* \param[in] pEntry -* -* \return None -*/ -/*----------------------------------------------------------------------------*/ -VOID RAInit(PRTMP_ADAPTER pAd, PMAC_TABLE_ENTRY pEntry) -{ - P_RA_ENTRY_INFO_T pRaEntry; - RA_COMMON_INFO_T RaCfg; - P_RA_INTERNAL_INFO_T pRaInternal; - P_RA_COMMON_INFO_T pRaCfg; - struct _RTMP_CHIP_CAP *cap; - - cap = hc_get_chip_cap(pAd->hdev_ctrl); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s\n", __func__)); - pRaEntry = &pEntry->RaEntry; - pRaInternal = &pEntry->RaInternal; - pRaCfg = &RaCfg; - os_zero_mem(pRaEntry, sizeof(RA_ENTRY_INFO_T)); - os_zero_mem(pRaInternal, sizeof(RA_INTERNAL_INFO_T)); - os_zero_mem(&RaCfg, sizeof(RaCfg)); - raWrapperEntrySet(pAd, pEntry, pRaEntry); - raWrapperConfigSet(pAd, pEntry->wdev, pRaCfg); - pRaInternal->ucLastRateIdx = 0xFF; - pRaInternal->ucLowTrafficCount = 0; - pRaInternal->fgLastSecAccordingRSSI = FALSE; - pRaInternal->ucInitialRateMode = RA_INIT_RATE_BY_RSSI; - pRaInternal->ucLastSecTxRateChangeAction = RATE_NO_CHANGE; - pRaInternal->ucCurrTxRateIndex = 0; - pRaInternal->ucTxRateUpPenalty = 0; -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - - if (cap->fgRateAdaptFWOffload == TRUE) { - pRaEntry->fgRaValid = TRUE; - WifiSysRaInit(pAd, pEntry); - } - -#else - - if (pRaEntry->fgAutoTxRateSwitch == TRUE) { - UCHAR TableSize = 0; -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (RaCfg.ucRateAlg == RATE_ALG_GRP) { - raSetMcsGroup(pRaEntry, pRaCfg, pRaInternal); - raClearTxQuality(pRaInternal); - raSelectTxRateTable(pRaEntry, pRaCfg, pRaInternal, - &pRaInternal->pucTable, &TableSize, - &pRaInternal->ucCurrTxRateIndex); - NewTxRateMtCore(pAd, pRaEntry, pRaCfg, pRaInternal); - } - -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#ifdef RATE_ADAPT_AGBS_SUPPORT - - if (RaCfg.ucRateAlg == RATE_ALG_AGBS) { - raSetMcsGroupAGBS(pRaEntry, pRaCfg, pRaInternal); - raClearTxQualityAGBS(pRaInternal); - raSelectTxRateTable(pRaEntry, pRaCfg, pRaInternal, - &pRaInternal->pucTable, &TableSize, - &pRaInternal->ucCurrTxRateIndex); - SetTxRateMtCoreAGBS(pAd, pRaEntry, pRaCfg, pRaInternal); - } - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - } else { -#ifdef MCS_LUT_SUPPORT -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (RaCfg.ucRateAlg == RATE_ALG_GRP) - MtAsicMcsLutUpdateCore(pAd, pRaEntry, pRaCfg, - pRaInternal); - -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#ifdef RATE_ADAPT_AGBS_SUPPORT - - if (RaCfg.ucRateAlg == RATE_ALG_AGBS) - MtAsicMcsLutUpdateCoreAGBS(pAd, pRaEntry, pRaCfg, - pRaInternal); - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ -#endif /* MCS_LUT_SUPPORT */ - } - -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ -#ifndef COMPOS_WIN - RA_SAVE_LAST_TX_CFG(pRaEntry); -#endif /* !COMPOS_WIN */ - raWrapperEntryRestore(pAd, pEntry, pRaEntry); -} - -/*----------------------------------------------------------------------------*/ -/*! -* \brief Update RA paramater -* -* \param[in] pAd -* \param[in] pEntry -* -* \return None -*/ -/*----------------------------------------------------------------------------*/ -VOID RAParamUpdate(PRTMP_ADAPTER pAd, PMAC_TABLE_ENTRY pEntry, - P_CMD_STAREC_AUTO_RATE_UPDATE_T prParam) -{ - P_RA_ENTRY_INFO_T pRaEntry; - struct _RTMP_CHIP_CAP *cap; - /* pRaEntry is used in AsicStaRecUpdate() */ - pRaEntry = &pEntry->RaEntry; - - if (pRaEntry->fgRaValid != TRUE) - return; - - cap = hc_get_chip_cap(pAd->hdev_ctrl); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s, Field=%d\n", __func__, prParam->u4Field)); - raWrapperEntrySet(pAd, pEntry, pRaEntry); -#ifdef RACTRL_FW_OFFLOAD_SUPPORT - - if (cap->fgRateAdaptFWOffload == TRUE) - WifiSysUpdateRa(pAd, pEntry, prParam); - -#else - { - RA_COMMON_INFO_T RaCfg; - P_RA_INTERNAL_INFO_T pRaInternal; - P_RA_COMMON_INFO_T pRaCfg; - - pRaInternal = &pEntry->RaInternal; - pRaCfg = &RaCfg; - os_zero_mem(pRaInternal, sizeof(RA_INTERNAL_INFO_T)); - os_zero_mem(&RaCfg, sizeof(RaCfg)); - raWrapperConfigSet(pAd, pEntry->wdev, pRaCfg); -#ifdef MT_MAC -#ifdef RATE_ADAPT_AGBS_SUPPORT - - if (RaCfg.ucRateAlg == RATE_ALG_AGBS) { - if (prParam->u4Field == RA_PARAM_VHT_OPERATING_MODE) { - UCHAR TableSize; - - raSetMcsGroupAGBS(pRaEntry, pRaCfg, - pRaInternal); - raSelectTxRateTable( - pRaEntry, pRaCfg, pRaInternal, - &pRaInternal->pucTable, &TableSize, - &pRaInternal->ucCurrTxRateIndex); - SetTxRateMtCoreAGBS(pAd, pRaEntry, pRaCfg, - pRaInternal); - } - } - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ -#endif /* MT_MAC */ - } -#endif /* RACTRL_FW_OFFLOAD_SUPPORT */ -} - -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -/*----------------------------------------------------------------------------*/ -/*! -* \brief set RA Common config to FW ( Driver API) -* -* \param[in] pRaCfg -* \param[out] pCmdStaRecAutoRateCfg -* -* \return NDIS_STATUS_SUCCESS -* -*/ -/*----------------------------------------------------------------------------*/ -INT32 -BssInfoRACommCfgSet(IN P_RA_COMMON_INFO_T pRaCfg, - OUT P_CMD_BSSINFO_AUTO_RATE_CFG_T pCmdBssInfoAutoRateCfg) -{ - /* Fill TLV format */ - pCmdBssInfoAutoRateCfg->u2Tag = BSS_INFO_RA; - pCmdBssInfoAutoRateCfg->u2Length = sizeof(CMD_BSSINFO_AUTO_RATE_CFG_T); -#ifdef RT_BIG_ENDIAN - pCmdBssInfoAutoRateCfg->u2Tag = cpu2le16(pCmdBssInfoAutoRateCfg->u2Tag); - pCmdBssInfoAutoRateCfg->u2Length = - cpu2le16(pCmdBssInfoAutoRateCfg->u2Length); -#endif - pCmdBssInfoAutoRateCfg->OpMode = pRaCfg->OpMode; - pCmdBssInfoAutoRateCfg->fgAdHocOn = pRaCfg->fgAdHocOn; - pCmdBssInfoAutoRateCfg->fgShortPreamble = pRaCfg->fgShortPreamble; - pCmdBssInfoAutoRateCfg->TxStream = pRaCfg->TxStream; - pCmdBssInfoAutoRateCfg->RxStream = pRaCfg->RxStream; - pCmdBssInfoAutoRateCfg->ucRateAlg = pRaCfg->ucRateAlg; - pCmdBssInfoAutoRateCfg->TestbedForceShortGI = - pRaCfg->TestbedForceShortGI; - pCmdBssInfoAutoRateCfg->TestbedForceGreenField = - pRaCfg->TestbedForceGreenField; -#ifdef DOT11_N_SUPPORT - pCmdBssInfoAutoRateCfg->HtMode = pRaCfg->HtMode; - pCmdBssInfoAutoRateCfg->fAnyStation20Only = pRaCfg->fAnyStation20Only; - pCmdBssInfoAutoRateCfg->bRcvBSSWidthTriggerEvents = - pRaCfg->bRcvBSSWidthTriggerEvents; -#ifdef DOT11_VHT_AC - pCmdBssInfoAutoRateCfg->vht_nss_cap = pRaCfg->vht_nss_cap; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - pCmdBssInfoAutoRateCfg->fgSeOff = pRaCfg->fgSeOff; - pCmdBssInfoAutoRateCfg->ucAntennaIndex = pRaCfg->ucAntennaIndex; - pCmdBssInfoAutoRateCfg->TrainUpRule = pRaCfg->TrainUpRule; - pCmdBssInfoAutoRateCfg->TrainUpHighThrd = - cpu2le16(pRaCfg->TrainUpHighThrd); - pCmdBssInfoAutoRateCfg->TrainUpRuleRSSI = - cpu2le16(pRaCfg->TrainUpRuleRSSI); - pCmdBssInfoAutoRateCfg->lowTrafficThrd = - cpu2le16(pRaCfg->lowTrafficThrd); -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) - pCmdBssInfoAutoRateCfg->u2MaxPhyRate = cpu2le16(pRaCfg->u2MaxPhyRate); -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - pCmdBssInfoAutoRateCfg->PhyCaps = cpu2le32(pRaCfg->PhyCaps); - pCmdBssInfoAutoRateCfg->u4RaInterval = cpu2le32(pRaCfg->u4RaInterval); - pCmdBssInfoAutoRateCfg->u4RaFastInterval = - cpu2le32(pRaCfg->u4RaFastInterval); - -#ifdef CFG_RATE_ADJUST_PARAM_DEBUG - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: sizeof CMD_BSSINFO_AUTO_RATE_CFG_T = %zu\n", __func__, - sizeof(CMD_BSSINFO_AUTO_RATE_CFG_T))); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("OpMode=%d\n", pCmdBssInfoAutoRateCfg->OpMode)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgAdHocOn=%d\n", pCmdBssInfoAutoRateCfg->fgAdHocOn)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgShortPreamble=%d\n", - pCmdBssInfoAutoRateCfg->fgShortPreamble)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TxStream=%d\n", pCmdBssInfoAutoRateCfg->TxStream)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RxStream=%d\n", pCmdBssInfoAutoRateCfg->RxStream)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucRateAlg=%d\n", pCmdBssInfoAutoRateCfg->ucRateAlg)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TestbedForceShortGI=%d\n", - pCmdBssInfoAutoRateCfg->TestbedForceShortGI)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TestbedForceGreenField=%d\n", - pCmdBssInfoAutoRateCfg->TestbedForceGreenField)); -#ifdef DOT11_N_SUPPORT - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("HtMode=%d\n", pCmdBssInfoAutoRateCfg->HtMode)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fAnyStation20Only=%d\n", - pCmdBssInfoAutoRateCfg->fAnyStation20Only)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("bRcvBSSWidthTriggerEvents=%d\n", - pCmdBssInfoAutoRateCfg->bRcvBSSWidthTriggerEvents)); -#ifdef DOT11_VHT_AC - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("vht_nss_cap=%d\n", pCmdBssInfoAutoRateCfg->vht_nss_cap)); -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgSeOff=%d\n", pCmdBssInfoAutoRateCfg->fgSeOff)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucAntennaIndex=%d\n", - pCmdBssInfoAutoRateCfg->ucAntennaIndex)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TrainUpRule=%d\n", pCmdBssInfoAutoRateCfg->TrainUpRule)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TrainUpHighThrd=%d\n", - pCmdBssInfoAutoRateCfg->TrainUpHighThrd)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("TrainUpRuleRSSI=%d\n", - pCmdBssInfoAutoRateCfg->TrainUpRuleRSSI)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("lowTrafficThrd=%d\n", - pCmdBssInfoAutoRateCfg->lowTrafficThrd)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("u2MaxPhyRate=%d\n", pCmdBssInfoAutoRateCfg->u2MaxPhyRate)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("PhyCaps=%d\n", pCmdBssInfoAutoRateCfg->PhyCaps)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("u4RaInterval=%d\n", pCmdBssInfoAutoRateCfg->u4RaInterval)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("u4RaFastInterval=%d\n", - pCmdBssInfoAutoRateCfg->u4RaFastInterval)); -#endif - - return NDIS_STATUS_SUCCESS; -} -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - -#if defined(MT7636) || defined(MT7615) || defined(MT7637) || \ - defined(MT7622) || defined(P18) || defined(MT7663) -/*----------------------------------------------------------------------------*/ -/*! -* \brief Set rate entry info to FW ( Driver API) -* -* \param[in] pRaEntry -* \param[out] pCmdStaRecAutoRate -* -* \return NDIS_STATUS_SUCCESS -*/ -/*----------------------------------------------------------------------------*/ -INT32 -StaRecAutoRateParamSet(IN P_RA_ENTRY_INFO_T pRaEntry, - OUT P_CMD_STAREC_AUTO_RATE_T pCmdStaRecAutoRate) -{ -#ifdef CFG_RATE_ADJUST_PARAM_DEBUG - UINT_8 ucIdx; -#endif - - /* Fill TLV format */ - pCmdStaRecAutoRate->u2Tag = STA_REC_RA; - pCmdStaRecAutoRate->u2Length = sizeof(CMD_STAREC_AUTO_RATE_T); -#ifdef RT_BIG_ENDIAN - pCmdStaRecAutoRate->u2Tag = cpu2le16(pCmdStaRecAutoRate->u2Tag); - pCmdStaRecAutoRate->u2Length = cpu2le16(pCmdStaRecAutoRate->u2Length); -#endif - pCmdStaRecAutoRate->fgRaValid = pRaEntry->fgRaValid; - pCmdStaRecAutoRate->fgAutoTxRateSwitch = pRaEntry->fgAutoTxRateSwitch; - - if (pCmdStaRecAutoRate->fgRaValid == FALSE) - return NDIS_STATUS_SUCCESS; - - pCmdStaRecAutoRate->ucPhyMode = pRaEntry->ucPhyMode; - pCmdStaRecAutoRate->ucChannel = pRaEntry->ucChannel; - pCmdStaRecAutoRate->ucBBPCurrentBW = pRaEntry->ucBBPCurrentBW; - pCmdStaRecAutoRate->fgDisableCCK = pRaEntry->fgDisableCCK; - pCmdStaRecAutoRate->fgHtCapMcs32 = pRaEntry->fgHtCapMcs32; - pCmdStaRecAutoRate->fgHtCapInfoGF = pRaEntry->fgHtCapInfoGF; - os_move_mem(pCmdStaRecAutoRate->aucHtCapMCSSet, - pRaEntry->aucHtCapMCSSet, - sizeof(pCmdStaRecAutoRate->aucHtCapMCSSet)); - pCmdStaRecAutoRate->ucMmpsMode = pRaEntry->ucMmpsMode; - pCmdStaRecAutoRate->ucGband256QAMSupport = - pRaEntry->ucGband256QAMSupport; - pCmdStaRecAutoRate->ucMaxAmpduFactor = pRaEntry->ucMaxAmpduFactor; - pCmdStaRecAutoRate->fgAuthWapiMode = pRaEntry->fgAuthWapiMode; - pCmdStaRecAutoRate->RateLen = pRaEntry->RateLen; - pCmdStaRecAutoRate->ucSupportRateMode = pRaEntry->ucSupportRateMode; - pCmdStaRecAutoRate->ucSupportCCKMCS = pRaEntry->ucSupportCCKMCS; - pCmdStaRecAutoRate->ucSupportOFDMMCS = pRaEntry->ucSupportOFDMMCS; -#ifdef DOT11_N_SUPPORT - pCmdStaRecAutoRate->u4SupportHTMCS = cpu2le32(pRaEntry->u4SupportHTMCS); -#ifdef DOT11_VHT_AC - pCmdStaRecAutoRate->u2SupportVHTMCS1SS = - cpu2le16(pRaEntry->u2SupportVHTMCS1SS); - pCmdStaRecAutoRate->u2SupportVHTMCS2SS = - cpu2le16(pRaEntry->u2SupportVHTMCS2SS); - pCmdStaRecAutoRate->u2SupportVHTMCS3SS = - cpu2le16(pRaEntry->u2SupportVHTMCS3SS); - pCmdStaRecAutoRate->u2SupportVHTMCS4SS = - cpu2le16(pRaEntry->u2SupportVHTMCS4SS); - pCmdStaRecAutoRate->force_op_mode = pRaEntry->force_op_mode; - pCmdStaRecAutoRate->vhtOpModeChWidth = pRaEntry->vhtOpModeChWidth; - pCmdStaRecAutoRate->vhtOpModeRxNss = pRaEntry->vhtOpModeRxNss; - pCmdStaRecAutoRate->vhtOpModeRxNssType = pRaEntry->vhtOpModeRxNssType; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - pCmdStaRecAutoRate->ClientStatusFlags = - cpu2le32(pRaEntry->ClientStatusFlags); - os_move_mem(&pCmdStaRecAutoRate->MaxPhyCfg, &pRaEntry->MaxPhyCfg, - sizeof(RA_PHY_CFG_T)); - - if (pCmdStaRecAutoRate->fgAutoTxRateSwitch == FALSE) { - if (pRaEntry->MaxPhyCfg.ShortGI) - pCmdStaRecAutoRate->MaxPhyCfg.ShortGI = - SGI_20 + SGI_40 + SGI_80 + SGI_160; - - if (CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_VHT_RX_LDPC_CAPABLE)) - pCmdStaRecAutoRate->MaxPhyCfg.ldpc |= VHT_LDPC; - if (CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_HT_RX_LDPC_CAPABLE)) - pCmdStaRecAutoRate->MaxPhyCfg.ldpc |= HT_LDPC; - - if ((pRaEntry->MaxPhyCfg.MODE == MODE_VHT) && - CLIENT_STATUS_TEST_FLAG(pRaEntry, - fCLIENT_STATUS_VHT_RXSTBC_CAPABLE)) - pCmdStaRecAutoRate->MaxPhyCfg.STBC = STBC_USE; - } - -#ifdef CFG_RATE_ADJUST_PARAM_DEBUG - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: sizeof CMD_STAREC_AUTO_RATE_T = %zu\n", __func__, - sizeof(CMD_STAREC_AUTO_RATE_T))); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgRaValid=%d\n", pCmdStaRecAutoRate->fgRaValid)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgAutoTxRateSwitch=%d\n", - pCmdStaRecAutoRate->fgAutoTxRateSwitch)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucPhyMode=%d\n", pCmdStaRecAutoRate->ucPhyMode)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucChannel=%d\n", pCmdStaRecAutoRate->ucChannel)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucBBPCurrentBW=%d\n", pCmdStaRecAutoRate->ucBBPCurrentBW)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgDisableCCK=%d\n", pCmdStaRecAutoRate->fgDisableCCK)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgHtCapMcs32=%d\n", pCmdStaRecAutoRate->fgHtCapMcs32)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgHtCapInfoGF=%d\n", pCmdStaRecAutoRate->fgHtCapInfoGF)); - - for (ucIdx = 0; ucIdx < 4; ucIdx++) - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("aucHtCapMCSSet[%d]=%d\n", ucIdx, - pCmdStaRecAutoRate->aucHtCapMCSSet[ucIdx])); - - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucMmpsMode=%d\n", pCmdStaRecAutoRate->ucMmpsMode)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucGband256QAMSupport=%d\n", - pCmdStaRecAutoRate->ucGband256QAMSupport)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucMaxAmpduFactor=%d\n", - pCmdStaRecAutoRate->ucMaxAmpduFactor)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("fgAuthWapiMode=%d\n", pCmdStaRecAutoRate->fgAuthWapiMode)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("RateLen=%d\n", pCmdStaRecAutoRate->RateLen)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucSupportRateMode=%x\n", - pCmdStaRecAutoRate->ucSupportRateMode)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucSupportCCKMCS=%x\n", pCmdStaRecAutoRate->ucSupportCCKMCS)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ucSupportOFDMMCS=%x\n", - pCmdStaRecAutoRate->ucSupportOFDMMCS)); -#ifdef DOT11_N_SUPPORT - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("u4SupportHTMCS=%x\n", pCmdStaRecAutoRate->u4SupportHTMCS)); -#ifdef DOT11_VHT_AC - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("u2SupportVHTMCS1SS=%x\n", - pCmdStaRecAutoRate->u2SupportVHTMCS1SS)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("u2SupportVHTMCS2SS=%x\n", - pCmdStaRecAutoRate->u2SupportVHTMCS2SS)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("u2SupportVHTMCS3SS=%x\n", - pCmdStaRecAutoRate->u2SupportVHTMCS3SS)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("u2SupportVHTMCS4SS=%x\n", - pCmdStaRecAutoRate->u2SupportVHTMCS4SS)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("force_op_mode=%d\n", pCmdStaRecAutoRate->force_op_mode)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("vhtOpModeChWidth=%d\n", - pCmdStaRecAutoRate->vhtOpModeChWidth)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("vhtOpModeRxNss=%d\n", pCmdStaRecAutoRate->vhtOpModeRxNss)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("vhtOpModeRxNssType=%x\n", - pCmdStaRecAutoRate->vhtOpModeRxNssType)); -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("ClientStatusFlags=%x\n", - pCmdStaRecAutoRate->ClientStatusFlags)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MaxPhyCfg.MODE=%d\n", pCmdStaRecAutoRate->MaxPhyCfg.MODE)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MaxPhyCfg.Flags=%d\n", pCmdStaRecAutoRate->MaxPhyCfg.Flags)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MaxPhyCfg.STBC=%d\n", pCmdStaRecAutoRate->MaxPhyCfg.STBC)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MaxPhyCfg.ShortGI=%d\n", - pCmdStaRecAutoRate->MaxPhyCfg.ShortGI)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MaxPhyCfg.BW=%d\n", pCmdStaRecAutoRate->MaxPhyCfg.BW)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MaxPhyCfg.ldpc=%d\n", pCmdStaRecAutoRate->MaxPhyCfg.ldpc)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MaxPhyCfg.MCS=%d\n", pCmdStaRecAutoRate->MaxPhyCfg.MCS)); - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("MaxPhyCfg.VhtNss=%d\n", - pCmdStaRecAutoRate->MaxPhyCfg.VhtNss)); -#endif - return NDIS_STATUS_SUCCESS; -} - -/*----------------------------------------------------------------------------*/ -/*! -* \brief set RA data partial update to FW ( Driver API) -* -* \param[in] pRaEntry -* \param[in] pRaInternal -* \param[in] u4Field -* \param[out] pCmdStaRecAutoRateUpdate -* -* \return NDIS_STATUS_SUCCESS -* -*/ -/*----------------------------------------------------------------------------*/ -INT32 -StaRecAutoRateUpdate( - IN P_RA_ENTRY_INFO_T pRaEntry, IN P_RA_INTERNAL_INFO_T pRaInternal, - IN P_CMD_STAREC_AUTO_RATE_UPDATE_T pRaParam, - OUT P_CMD_STAREC_AUTO_RATE_UPDATE_T pCmdStaRecAutoRateUpdate) -{ - /* Fill TLV format */ - pCmdStaRecAutoRateUpdate->u2Tag = STA_REC_RA_UPDATE; - pCmdStaRecAutoRateUpdate->u2Length = - sizeof(CMD_STAREC_AUTO_RATE_UPDATE_T); -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC - - if (pRaParam->u4Field == RA_PARAM_VHT_OPERATING_MODE) { - pCmdStaRecAutoRateUpdate->force_op_mode = - pRaEntry->force_op_mode; - pCmdStaRecAutoRateUpdate->vhtOpModeChWidth = - pRaEntry->vhtOpModeChWidth; - pCmdStaRecAutoRateUpdate->vhtOpModeRxNss = - pRaEntry->vhtOpModeRxNss; - pCmdStaRecAutoRateUpdate->vhtOpModeRxNssType = - pRaEntry->vhtOpModeRxNssType; - pCmdStaRecAutoRateUpdate->u4Field = RA_PARAM_VHT_OPERATING_MODE; - } else -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - if (pRaParam->u4Field == RA_PARAM_HT_2040_COEX) - pCmdStaRecAutoRateUpdate->u4Field = - RA_PARAM_HT_2040_COEX; - else if (pRaParam->u4Field == RA_PARAM_HT_2040_BACK) - pCmdStaRecAutoRateUpdate->u4Field = - RA_PARAM_HT_2040_BACK; - else if (pRaParam->u4Field == RA_PARAM_MMPS_UPDATE) { - pCmdStaRecAutoRateUpdate->ucMmpsMode = - pRaEntry->ucMmpsMode; - pCmdStaRecAutoRateUpdate->u4Field = - RA_PARAM_MMPS_UPDATE; - } else if (pRaParam->u4Field == RA_PARAM_FIXED_RATE) { - pCmdStaRecAutoRateUpdate->u4Field = RA_PARAM_FIXED_RATE; - pCmdStaRecAutoRateUpdate->FixedRateCfg.MODE = - pRaParam->FixedRateCfg.MODE; - pCmdStaRecAutoRateUpdate->FixedRateCfg.STBC = - pRaParam->FixedRateCfg.STBC; - pCmdStaRecAutoRateUpdate->FixedRateCfg.ShortGI = - pRaParam->FixedRateCfg.ShortGI; - pCmdStaRecAutoRateUpdate->FixedRateCfg.BW = - pRaParam->FixedRateCfg.BW; - pCmdStaRecAutoRateUpdate->FixedRateCfg.ldpc = - pRaParam->FixedRateCfg.ldpc; - pCmdStaRecAutoRateUpdate->FixedRateCfg.MCS = - pRaParam->FixedRateCfg.MCS; - pCmdStaRecAutoRateUpdate->FixedRateCfg.VhtNss = - pRaParam->FixedRateCfg.VhtNss; - pCmdStaRecAutoRateUpdate->ucShortPreamble = - pRaParam->ucShortPreamble; - pCmdStaRecAutoRateUpdate->ucSpeEn = pRaParam->ucSpeEn; - } else if (pRaParam->u4Field == RA_PARAM_FIXED_RATE_FALLBACK) { - pCmdStaRecAutoRateUpdate->u4Field = - RA_PARAM_FIXED_RATE_FALLBACK; - pCmdStaRecAutoRateUpdate->FixedRateCfg.MODE = - pRaParam->FixedRateCfg.MODE; - pCmdStaRecAutoRateUpdate->FixedRateCfg.STBC = - pRaParam->FixedRateCfg.STBC; - pCmdStaRecAutoRateUpdate->FixedRateCfg.ShortGI = - pRaParam->FixedRateCfg.ShortGI; - pCmdStaRecAutoRateUpdate->FixedRateCfg.BW = - pRaParam->FixedRateCfg.BW; - pCmdStaRecAutoRateUpdate->FixedRateCfg.ldpc = - pRaParam->FixedRateCfg.ldpc; - pCmdStaRecAutoRateUpdate->FixedRateCfg.MCS = - pRaParam->FixedRateCfg.MCS; - pCmdStaRecAutoRateUpdate->FixedRateCfg.VhtNss = - pRaParam->FixedRateCfg.VhtNss; - pCmdStaRecAutoRateUpdate->ucShortPreamble = - pRaParam->ucShortPreamble; - pCmdStaRecAutoRateUpdate->ucSpeEn = pRaParam->ucSpeEn; - pCmdStaRecAutoRateUpdate->fgIs5G = pRaParam->fgIs5G; - } else if (pRaParam->u4Field > RA_PARAM_MAX) { - pCmdStaRecAutoRateUpdate->u4Field = pRaParam->u4Field; - } - -#ifdef RT_BIG_ENDIAN - pCmdStaRecAutoRateUpdate->u2Tag = - cpu2le16(pCmdStaRecAutoRateUpdate->u2Tag); - pCmdStaRecAutoRateUpdate->u2Length = - cpu2le16(pCmdStaRecAutoRateUpdate->u2Length); - pCmdStaRecAutoRateUpdate->u4Field = - cpu2le32(pCmdStaRecAutoRateUpdate->u4Field); -#endif - return NDIS_STATUS_SUCCESS; -} -#endif /* defined(MT7636) || defined(MT7615) || defined(MT7637) || defined(MT7622) || defined(P18) || defined(MT7663) */ - -#endif /* MT_MAC */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_wrapper_embedded.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_wrapper_embedded.c deleted file mode 100644 index a70243792f..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/rate_ctrl/ra_wrapper_embedded.c +++ /dev/null @@ -1,1010 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2014 MediaTek Inc. -* -* All rights reserved. Copying, compilation, modification, distribution -* or any other use whatsoever of this material is strictly prohibited -* except in accordance with a Software License Agreement with -* MediaTek Inc. -******************************************************************************** -*/ - -/******************************************************************************* -* LEGAL DISCLAIMER -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND -* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK -* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE -* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY -* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE -* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY -* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK -* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY -* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE -* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO -* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL -* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT -* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY -* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT -* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING -* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN -* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE -* (ICC). -******************************************************************************** -*/ - -/******************************************************************************* -* E X T E R N A L R E F E R E N C E S -******************************************************************************** -*/ -#include "rt_config.h" - -/******************************************************************************* -* C O N S T A N T S -******************************************************************************** -*/ - -/******************************************************************************* -* D A T A T Y P E S -******************************************************************************** -*/ - -/******************************************************************************* -* P U B L I C D A T A -******************************************************************************** -*/ - -/******************************************************************************* -* P R I V A T E D A T A -******************************************************************************** -*/ - -/******************************************************************************* -* M A C R O S -******************************************************************************** -*/ - -/******************************************************************************* -* F U N C T I O N D E C L A R A T I O N S -******************************************************************************** -*/ - -/******************************************************************************* -* F U N C T I O N S -******************************************************************************** -*/ -#ifdef MT_MAC -/*----------------------------------------------------------------------------*/ -/*! - * \brief Set RaEntry by pEntry - * - * \param[in] pAd - * \param[in] pEntry - * \param[out] pRaEntry - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID raWrapperEntrySet(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - OUT P_RA_ENTRY_INFO_T pRaEntry) -{ - pRaEntry->ucWcid = pEntry->wcid; - pRaEntry->fgAutoTxRateSwitch = pEntry->bAutoTxRateSwitch; - - pRaEntry->ucPhyMode = pEntry->wdev->PhyMode; - pRaEntry->ucChannel = pEntry->wdev->channel; - /* use the maximum bw capability */ - pRaEntry->ucBBPCurrentBW = HcGetBw(pAd, pEntry->wdev); - { - pRaEntry->fgDisableCCK = FALSE; - } - - pRaEntry->fgHtCapMcs32 = - (pEntry->HTCapability.MCSSet[4] & 0x1) ? TRUE : FALSE; - pRaEntry->fgHtCapInfoGF = pEntry->HTCapability.HtCapInfo.GF; - pRaEntry->aucHtCapMCSSet[0] = pEntry->HTCapability.MCSSet[0]; - pRaEntry->aucHtCapMCSSet[1] = pEntry->HTCapability.MCSSet[1]; - pRaEntry->aucHtCapMCSSet[2] = pEntry->HTCapability.MCSSet[2]; - pRaEntry->aucHtCapMCSSet[3] = pEntry->HTCapability.MCSSet[3]; -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - if (pEntry->wdev->rate.Eap_HtSupRate_En == TRUE) { - pRaEntry->aucHtCapMCSSet[0] = pEntry->HTCapability.MCSSet[0] & - pEntry->wdev->rate.EapMCSSet[0]; - pRaEntry->aucHtCapMCSSet[1] = pEntry->HTCapability.MCSSet[1] & - pEntry->wdev->rate.EapMCSSet[1]; - pRaEntry->aucHtCapMCSSet[2] = pEntry->HTCapability.MCSSet[2] & - pEntry->wdev->rate.EapMCSSet[2]; - pRaEntry->aucHtCapMCSSet[3] = pEntry->HTCapability.MCSSet[3] & - pEntry->wdev->rate.EapMCSSet[3]; - } -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - - pRaEntry->ucMmpsMode = pEntry->MmpsMode; - - if (pEntry->fgGband256QAMSupport == TRUE) - pRaEntry->ucGband256QAMSupport = RA_G_BAND_256QAM_ENABLE; - -#ifdef DOT11_VHT_AC - else if (pAd->CommonCfg.g_band_256_qam == TRUE) - pRaEntry->ucGband256QAMSupport = RA_G_BAND_256QAM_PROBING; - -#endif /*DOT11_VHT_AC*/ - else - pRaEntry->ucGband256QAMSupport = RA_G_BAND_256QAM_DISABLE; - - pRaEntry->ucMaxAmpduFactor = pEntry->MaxRAmpduFactor; - pRaEntry->RateLen = pEntry->RateLen; - pRaEntry->ucSupportRateMode = pEntry->SupportRateMode; - pRaEntry->ucSupportCCKMCS = pEntry->SupportCCKMCS; - pRaEntry->ucSupportOFDMMCS = pEntry->SupportOFDMMCS; - -#ifdef DOT11_N_SUPPORT - pRaEntry->u4SupportHTMCS = pEntry->SupportHTMCS; -#ifdef DOT11_VHT_AC - pRaEntry->u2SupportVHTMCS1SS = pEntry->SupportVHTMCS1SS; - pRaEntry->u2SupportVHTMCS2SS = pEntry->SupportVHTMCS2SS; - if (pEntry->MaxHTPhyMode.field.BW < BW_160) { - pRaEntry->u2SupportVHTMCS3SS = pEntry->SupportVHTMCS3SS; - pRaEntry->u2SupportVHTMCS4SS = pEntry->SupportVHTMCS4SS; - } - pRaEntry->force_op_mode = pEntry->force_op_mode; - pRaEntry->vhtOpModeChWidth = pEntry->operating_mode.ch_width; - pRaEntry->vhtOpModeRxNss = pEntry->operating_mode.rx_nss; - pRaEntry->vhtOpModeRxNssType = pEntry->operating_mode.rx_nss_type; -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - -#ifdef CONFIG_RA_PHY_RATE_SUPPORT - if (pEntry->wdev->rate.Eap_SupRate_En == TRUE) { - pRaEntry->ucSupportCCKMCS = pEntry->SupportCCKMCS & - pEntry->wdev->rate.EapSupportCCKMCS; - pRaEntry->ucSupportOFDMMCS = - pEntry->SupportOFDMMCS & - pEntry->wdev->rate.EapSupportOFDMMCS; - } -#ifdef DOT11_N_SUPPORT - if (pEntry->wdev->rate.Eap_HtSupRate_En == TRUE) - pRaEntry->u4SupportHTMCS = pEntry->SupportHTMCS & - pEntry->wdev->rate.EapSupportHTMCS; -#ifdef DOT11_VHT_AC - if (pEntry->wdev->rate.Eap_VhtSupRate_En == TRUE) { - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss1 == 0) - pRaEntry->u2SupportVHTMCS1SS = - pEntry->SupportVHTMCS1SS & 255; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss1 == 1) - pRaEntry->u2SupportVHTMCS1SS = - pEntry->SupportVHTMCS1SS & 511; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss1 == 2) - pRaEntry->u2SupportVHTMCS1SS = - pEntry->SupportVHTMCS1SS & 1023; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss2 == 0) - pRaEntry->u2SupportVHTMCS2SS = - pEntry->SupportVHTMCS2SS & 255; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss2 == 1) - pRaEntry->u2SupportVHTMCS2SS = - pEntry->SupportVHTMCS2SS & 511; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss2 == 2) - pRaEntry->u2SupportVHTMCS2SS = - pEntry->SupportVHTMCS2SS & 1023; - - if (pEntry->MaxHTPhyMode.field.BW < BW_160) { - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss3 == 0) - pRaEntry->u2SupportVHTMCS3SS = - pEntry->SupportVHTMCS3SS & 255; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss3 == 1) - pRaEntry->u2SupportVHTMCS3SS = - pEntry->SupportVHTMCS3SS & 511; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss3 == 2) - pRaEntry->u2SupportVHTMCS3SS = - pEntry->SupportVHTMCS3SS & 1023; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss4 == 0) - pRaEntry->u2SupportVHTMCS4SS = - pEntry->SupportVHTMCS4SS & 255; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss4 == 1) - pRaEntry->u2SupportVHTMCS4SS = - pEntry->SupportVHTMCS4SS & 511; - - if (pEntry->wdev->rate.rx_mcs_map.mcs_ss4 == 2) - pRaEntry->u2SupportVHTMCS4SS = - pEntry->SupportVHTMCS4SS & 1023; - } - } -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ -#endif /* CONFIG_RA_PHY_RATE_SUPPORT */ - pRaEntry->AvgRssiSample[0] = pEntry->RssiSample.AvgRssi[0]; - pRaEntry->AvgRssiSample[1] = pEntry->RssiSample.AvgRssi[1]; - pRaEntry->AvgRssiSample[2] = pEntry->RssiSample.AvgRssi[2]; - { - pRaEntry->fgAuthWapiMode = FALSE; - } - - pRaEntry->ClientStatusFlags = pEntry->ClientStatusFlags; - pRaEntry->MaxPhyCfg.MODE = pEntry->MaxHTPhyMode.field.MODE; - pRaEntry->MaxPhyCfg.STBC = pEntry->MaxHTPhyMode.field.STBC; - pRaEntry->MaxPhyCfg.ShortGI = pEntry->MaxHTPhyMode.field.ShortGI; - pRaEntry->MaxPhyCfg.BW = pEntry->MaxHTPhyMode.field.BW; - pRaEntry->MaxPhyCfg.ldpc = pEntry->MaxHTPhyMode.field.ldpc; -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC - - if (pRaEntry->MaxPhyCfg.MODE == MODE_VHT) { - pRaEntry->MaxPhyCfg.MCS = pEntry->MaxHTPhyMode.field.MCS & 0xf; - pRaEntry->MaxPhyCfg.VhtNss = - ((pEntry->MaxHTPhyMode.field.MCS & (0x3 << 4)) >> 4) + - 1; - } else -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - { - pRaEntry->MaxPhyCfg.MCS = pEntry->MaxHTPhyMode.field.MCS; - pRaEntry->MaxPhyCfg.VhtNss = 0; - } - - pRaEntry->TxPhyCfg.MODE = pEntry->HTPhyMode.field.MODE; - pRaEntry->TxPhyCfg.STBC = pEntry->HTPhyMode.field.STBC; - pRaEntry->TxPhyCfg.ShortGI = pEntry->HTPhyMode.field.ShortGI; - pRaEntry->TxPhyCfg.BW = pEntry->HTPhyMode.field.BW; - pRaEntry->TxPhyCfg.ldpc = pEntry->HTPhyMode.field.ldpc; -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC - - if (pRaEntry->TxPhyCfg.MODE == MODE_VHT) { - pRaEntry->TxPhyCfg.MCS = pEntry->HTPhyMode.field.MCS & 0xf; - pRaEntry->TxPhyCfg.VhtNss = - ((pEntry->HTPhyMode.field.MCS & (0x3 << 4)) >> 4) + 1; - } else -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - { - pRaEntry->TxPhyCfg.MCS = pEntry->HTPhyMode.field.MCS; - pRaEntry->TxPhyCfg.VhtNss = 0; - } -} - -/*----------------------------------------------------------------------------*/ -/*! - * \brief Restore RaEntry to pEntry - * - * \param[in] pAd - * \param[in] pEntry - * \param[in] pRaEntry - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID raWrapperEntryRestore(IN PRTMP_ADAPTER pAd, IN PMAC_TABLE_ENTRY pEntry, - IN P_RA_ENTRY_INFO_T pRaEntry) -{ - pEntry->MaxHTPhyMode.field.MODE = pRaEntry->MaxPhyCfg.MODE; - pEntry->MaxHTPhyMode.field.STBC = pRaEntry->MaxPhyCfg.STBC; - pEntry->MaxHTPhyMode.field.ShortGI = - pRaEntry->MaxPhyCfg.ShortGI ? 1 : 0; - pEntry->MaxHTPhyMode.field.BW = pRaEntry->MaxPhyCfg.BW; - pEntry->MaxHTPhyMode.field.ldpc = pRaEntry->MaxPhyCfg.ldpc ? 1 : 0; -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC - - if (pEntry->MaxHTPhyMode.field.MODE == MODE_VHT) - pEntry->MaxHTPhyMode.field.MCS = - (((pRaEntry->MaxPhyCfg.VhtNss - 1) & 0x3) << 4) + - pRaEntry->MaxPhyCfg.MCS; - else -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - { - pEntry->MaxHTPhyMode.field.MCS = pRaEntry->MaxPhyCfg.MCS; - } - - pEntry->HTPhyMode.field.MODE = pRaEntry->TxPhyCfg.MODE; - pEntry->HTPhyMode.field.STBC = pRaEntry->TxPhyCfg.STBC; - pEntry->HTPhyMode.field.ShortGI = pRaEntry->TxPhyCfg.ShortGI ? 1 : 0; - pEntry->HTPhyMode.field.BW = pRaEntry->TxPhyCfg.BW; - pEntry->HTPhyMode.field.ldpc = pRaEntry->TxPhyCfg.ldpc ? 1 : 0; - pEntry->HTPhyMode.field.MCS = pRaEntry->TxPhyCfg.MCS; -#ifdef DOT11_N_SUPPORT -#ifdef DOT11_VHT_AC - - if (pRaEntry->TxPhyCfg.MODE == MODE_VHT) - pEntry->HTPhyMode.field.MCS = - (((pRaEntry->TxPhyCfg.VhtNss - 1) & 0x3) << 4) + - pRaEntry->TxPhyCfg.MCS; - else -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - { - pEntry->HTPhyMode.field.MCS = pRaEntry->TxPhyCfg.MCS; - } - - pEntry->LastTxRate = pEntry->HTPhyMode.word; -} - -/*----------------------------------------------------------------------------*/ -/*! - * \brief Set RaCfg according pAd and pAd->CommonCfg. - * - * \param[in] pAd - * \param[out] pRaCfg - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID raWrapperConfigSet(IN PRTMP_ADAPTER pAd, IN struct wifi_dev *wdev, - OUT P_RA_COMMON_INFO_T pRaCfg) -{ - struct _RTMP_CHIP_CAP *cap = hc_get_chip_cap(pAd->hdev_ctrl); - - pRaCfg->OpMode = pAd->OpMode; - pRaCfg->fgAdHocOn = ADHOC_ON(pAd); - pRaCfg->fgShortPreamble = - OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED) ? - TRUE : - FALSE; - pRaCfg->TxStream = wlan_operate_get_tx_stream(wdev); - pRaCfg->RxStream = wlan_operate_get_rx_stream(wdev); - pRaCfg->ucRateAlg = pAd->rateAlg; - pRaCfg->TestbedForceShortGI = pAd->WIFItestbed.bShortGI; - pRaCfg->TestbedForceGreenField = pAd->WIFItestbed.bGreenField; -#ifdef DOT11_N_SUPPORT - pRaCfg->HtMode = pAd->CommonCfg.RegTransmitSetting.field.HTMODE; - pRaCfg->fAnyStation20Only = pAd->MacTab.fAnyStation20Only; - pRaCfg->bRcvBSSWidthTriggerEvents = - pAd->CommonCfg.bRcvBSSWidthTriggerEvents; -#ifdef DOT11_VHT_AC - pRaCfg->vht_nss_cap = pAd->CommonCfg.vht_nss_cap; -#ifdef WFA_VHT_PF - pRaCfg->vht_bw_signal = pAd->CommonCfg.vht_bw_signal; - pRaCfg->vht_force_sgi = pAd->vht_force_sgi; -#endif /* WFA_VHT_PF */ -#endif /* DOT11_VHT_AC */ -#endif /* DOT11_N_SUPPORT */ - pRaCfg->fgSeOff = pAd->CommonCfg.bSeOff; - if ((pAd->CommonCfg.dbdc_mode == FALSE) && - (pAd->Antenna.field.TxPath == 4)) - pRaCfg->ucAntennaIndex = pAd->CommonCfg.ucAntennaIndex; -#ifdef THERMAL_PROTECT_SUPPORT - pRaCfg->fgThermalProtectToggle = pAd->fgThermalProtectToggle; - pRaCfg->force_one_tx_stream = pAd->force_one_tx_stream; -#else - pRaCfg->fgThermalProtectToggle = FALSE; - pRaCfg->force_one_tx_stream = FALSE; -#endif /* THERMAL_PROTECT_SUPPORT */ - pRaCfg->TrainUpRule = pAd->CommonCfg.TrainUpRule; - pRaCfg->TrainUpHighThrd = pAd->CommonCfg.TrainUpHighThrd; - pRaCfg->TrainUpRuleRSSI = pAd->CommonCfg.TrainUpRuleRSSI; - pRaCfg->lowTrafficThrd = pAd->CommonCfg.lowTrafficThrd; -#if defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) -#ifdef RACTRL_LIMIT_MAX_PHY_RATE - - if (pAd->fgRaLimitPhyRate == TRUE) - pRaCfg->u2MaxPhyRate = RACTRL_LIMIT_MAX_PHY_RATE; - else -#endif /* RACTRL_LIMIT_MAX_PHY_RATE */ - { - pRaCfg->u2MaxPhyRate = 0; - } - -#endif /* defined(MT7615) || defined(MT7622) || defined(P18) || defined(MT7663) */ - pRaCfg->PhyCaps = cap->phy_caps; - pRaCfg->u4RaInterval = pAd->ra_interval; - pRaCfg->u4RaFastInterval = pAd->ra_fast_interval; -} - -#if defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) -/*----------------------------------------------------------------------------*/ -/*! - * \brief The wrapper function of QuickResponeForRateAdaptMTCore() - * - * \param[in] pAd - * \param[in] idx - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID QuickResponeForRateAdaptMT(/* actually for both up and down */ - IN PRTMP_ADAPTER pAd, IN UINT_8 idx) -{ - P_RA_ENTRY_INFO_T pRaEntry; - P_RA_INTERNAL_INFO_T pRaInternal; - RA_COMMON_INFO_T RaCfg; - MAC_TABLE_ENTRY *pEntry; - UCHAR TableSize = 0; - UCHAR InitTxRateIdx; - - pEntry = - &pAd->MacTab.Content - [idx]; /* point to information of the individual station */ - pRaEntry = &pEntry->RaEntry; - pRaInternal = &pEntry->RaInternal; - - if (pRaInternal->ucLastSecTxRateChangeAction == RATE_NO_CHANGE) - return; - - /* os_zero_mem(pRaEntry, sizeof(RA_ENTRY_INFO_T)); */ - os_zero_mem(&RaCfg, sizeof(RaCfg)); - raWrapperEntrySet(pAd, pEntry, pRaEntry); - raWrapperConfigSet(pAd, pEntry->wdev, &RaCfg); - - raSelectTxRateTable(pRaEntry, &RaCfg, pRaInternal, - &pRaInternal->pucTable, &TableSize, &InitTxRateIdx); -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (RaCfg.ucRateAlg == RATE_ALG_GRP) - QuickResponeForRateAdaptMTCore(pAd, pRaEntry, &RaCfg, - pRaInternal); - -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#if defined(RATE_ADAPT_AGBS_SUPPORT) && \ - (!defined(RACTRL_FW_OFFLOAD_SUPPORT) || defined(WIFI_BUILD_RAM)) - - if (RaCfg.ucRateAlg == RATE_ALG_AGBS) - QuickResponeForRateAdaptAGBSMTCore(pAd, pRaEntry, &RaCfg, - pRaInternal); - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - raWrapperEntryRestore(pAd, pEntry, pRaEntry); -} - -/*----------------------------------------------------------------------------*/ -/*! - * \brief The wrapper function of DynamicTxRateSwitchingAdaptMtCore() - * - * \param[in] pAd - * \param[in] idx - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID DynamicTxRateSwitchingAdaptMT(PRTMP_ADAPTER pAd, UINT_8 idx) -{ - P_RA_ENTRY_INFO_T pRaEntry; - P_RA_INTERNAL_INFO_T pRaInternal; - RA_COMMON_INFO_T RaCfg; - MAC_TABLE_ENTRY *pEntry; - UCHAR TableSize = 0; - UCHAR InitTxRateIdx; - - pEntry = - &pAd->MacTab.Content - [idx]; /* point to information of the individual station */ - pRaEntry = &pEntry->RaEntry; - pRaInternal = &pEntry->RaInternal; - /* os_zero_mem(pRaEntry, sizeof(RA_ENTRY_INFO_T)); */ - os_zero_mem(&RaCfg, sizeof(RaCfg)); - raWrapperEntrySet(pAd, pEntry, pRaEntry); - raWrapperConfigSet(pAd, pEntry->wdev, &RaCfg); - - raSelectTxRateTable(pRaEntry, &RaCfg, pRaInternal, - &pRaInternal->pucTable, &TableSize, &InitTxRateIdx); -#ifdef NEW_RATE_ADAPT_SUPPORT - - if (RaCfg.ucRateAlg == RATE_ALG_GRP) - DynamicTxRateSwitchingAdaptMtCore(pAd, pRaEntry, &RaCfg, - pRaInternal); - -#endif /* NEW_RATE_ADAPT_SUPPORT */ -#if defined(RATE_ADAPT_AGBS_SUPPORT) && \ - (!defined(RACTRL_FW_OFFLOAD_SUPPORT) || defined(WIFI_BUILD_RAM)) - - if (RaCfg.ucRateAlg == RATE_ALG_AGBS) - DynamicTxRateSwitchingAGBSMtCore(pAd, pRaEntry, &RaCfg, - pRaInternal); - -#endif /* RATE_ADAPT_AGBS_SUPPORT */ - raWrapperEntryRestore(pAd, pEntry, pRaEntry); -} -#endif /* defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) */ -#endif /* MT_MAC */ - -#ifdef CONFIG_AP_SUPPORT -/*----------------------------------------------------------------------------*/ -/*! - * \brief This routine walks through the MAC table, see if TX rate change is - * required for each associated client. - * - * \param[in] pAd - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID APMlmeDynamicTxRateSwitching(PRTMP_ADAPTER pAd) -{ - UINT i; - MAC_TABLE_ENTRY *pEntry; - UINT32 ret; -#ifdef CONFIG_ATE - - if (ATE_ON(pAd)) - return; - -#endif /* CONFIG_ATE */ - RTMP_SEM_EVENT_WAIT(&pAd->AutoRateLock, ret); - - /* walk through MAC table, see if need to change AP's TX rate toward each entry */ - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - /* point to information of the individual station */ - pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_NONE(pEntry)) - continue; - - if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst != SST_ASSOC)) - continue; - -#ifdef APCLI_SUPPORT - - if (IS_ENTRY_APCLI(pEntry) && (pEntry->Sst != SST_ASSOC)) - continue; - -#ifdef MAC_REPEATER_SUPPORT - - if (IS_ENTRY_REPEATER(pEntry) && (pEntry->Sst != SST_ASSOC)) - continue; - -#endif -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - - if (IS_ENTRY_WDS(pEntry) && - !WDS_IF_UP_CHECK(pAd, pEntry->func_tb_idx)) - continue; - -#endif /* WDS_SUPPORT */ - - /* check if this entry need to switch rate automatically */ - if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE) - continue; - -#ifdef MT_MAC -#if defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - DynamicTxRateSwitchingAdaptMT(pAd, (UINT_8)i); -#ifdef NEW_RATE_ADAPT_SUPPORT - if (pAd->rateAlg == RATE_ALG_GRP) { - UCHAR pkt_num = wlan_operate_get_rts_pkt_thld( - pEntry->wdev); - UINT32 length = wlan_operate_get_rts_len_thld( - pEntry->wdev); - - if (pAd->MacTab.Size == 1) { - if (((pEntry->RaInternal.pucTable == - RateSwitchTableAdapt11N2S) && - pEntry->HTPhyMode.field.MCS >= - 14) || - ((pEntry->RaInternal.pucTable == - RateSwitchTableAdapt11N1S) && - pEntry->HTPhyMode.field.MCS >= - 6)) { - if (pAd->bDisableRtsProtect != - TRUE) { - pkt_num = - MAX_RTS_PKT_THRESHOLD; - length = - MAX_RTS_THRESHOLD; - pAd->bDisableRtsProtect = - TRUE; - } - } else { - if (pAd->bDisableRtsProtect != - FALSE) { - pAd->bDisableRtsProtect = - FALSE; - } - } - } else { - if (pAd->bDisableRtsProtect != FALSE) { - pAd->bDisableRtsProtect = FALSE; - } - } - HW_SET_RTS_THLD(pAd, pEntry->wdev, pkt_num, - length); - } -#endif /* NEW_RATE_ADAPT_SUPPORT */ - continue; - } - -#endif /* defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) */ -#endif /* MT_MAC */ - } - -#ifdef THERMAL_PROTECT_SUPPORT - pAd->fgThermalProtectToggle = FALSE; -#endif /* THERMAL_PROTECT_SUPPORT */ - RTMP_SEM_EVENT_UP(&pAd->AutoRateLock); -} - -/*----------------------------------------------------------------------------*/ -/*! - * \brief AP side, Auto TxRate faster train up timer call back function. - * - * \param[in] SystemSpecific1 - * \param[in] FunctionContext Pointer to our Adapter context. - * \param[in] SystemSpecific2 - * \param[in] SystemSpecific3 - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID APQuickResponeForRateUpExec(IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3) -{ - PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)FunctionContext; - UINT i; - MAC_TABLE_ENTRY *pEntry; - - pAd->ApCfg.ApQuickResponeForRateUpTimerRunning = FALSE; - - /* walk through MAC table, see if need to change AP's TX rate toward each entry */ - for (i = 1; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { - pEntry = &pAd->MacTab.Content[i]; - - if (IS_ENTRY_NONE(pEntry)) - continue; - - if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst != SST_ASSOC)) - continue; - -#ifdef APCLI_SUPPORT - - if (IS_ENTRY_APCLI(pEntry) && (pEntry->Sst != SST_ASSOC)) - continue; - -#ifdef MAC_REPEATER_SUPPORT - - if (IS_ENTRY_REPEATER(pEntry) && (pEntry->Sst != SST_ASSOC)) - continue; - -#endif -#endif /* APCLI_SUPPORT */ -#ifdef WDS_SUPPORT - - if (IS_ENTRY_WDS(pEntry) && - !WDS_IF_UP_CHECK(pAd, pEntry->func_tb_idx)) - continue; - -#endif /* WDS_SUPPORT */ -#ifdef MT_MAC -#if defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) - - if (IS_HIF_TYPE(pAd, HIF_MT)) { - QuickResponeForRateAdaptMT(pAd, (UINT_8)i); - continue; - } - -#endif /* defined(NEW_RATE_ADAPT_SUPPORT) || defined(RATE_ADAPT_AGBS_SUPPORT) */ -#endif /* MT_MAC */ - - /* Do nothing if this entry didn't change */ - if (pEntry->LastSecTxRateChangeAction == RATE_NO_CHANGE) - continue; - } -} -#endif /* CONFIG_AP_SUPPORT */ - -/*----------------------------------------------------------------------------*/ -/*! - * \brief This routine parse rate IEs and ouput the supported MCS table. - * - * \param[in] pAd - * - * \return None - */ -/*----------------------------------------------------------------------------*/ -VOID RTMPSetSupportMCS(IN PRTMP_ADAPTER pAd, IN UCHAR OpMode, - IN PMAC_TABLE_ENTRY pEntry, IN UCHAR SupRate[], - IN UCHAR SupRateLen, IN UCHAR ExtRate[], - IN UCHAR ExtRateLen, -#ifdef DOT11_VHT_AC - IN UCHAR vht_cap_len, IN VHT_CAP_IE *vht_cap, -#endif /* DOT11_VHT_AC */ - IN HT_CAPABILITY_IE *pHtCapability, - IN UCHAR HtCapabilityLen) -{ - UCHAR idx, SupportedRatesLen = 0; - UCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES]; - - if (SupRateLen > 0) { - if (SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES) { - os_move_mem(SupportedRates, SupRate, SupRateLen); - SupportedRatesLen = SupRateLen; - } else { - UCHAR RateDefault[8] = { 0x82, 0x84, 0x8b, 0x96, - 0x12, 0x24, 0x48, 0x6c }; - - os_move_mem(SupportedRates, RateDefault, 8); - SupportedRatesLen = 8; - MTWF_LOG(DBG_CAT_RA, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%s():wrong SUPP RATES., Len=%d\n", __func__, - SupRateLen)); - } - } - - if (ExtRateLen > 0) { - if ((SupRateLen + ExtRateLen) <= MAX_LEN_OF_SUPPORTED_RATES) { - os_move_mem(&SupportedRates[SupRateLen], ExtRate, - ExtRateLen); - SupportedRatesLen += ExtRateLen; - } else { - os_move_mem(&SupportedRates[SupRateLen], ExtRate, - MAX_LEN_OF_SUPPORTED_RATES - ExtRateLen); - SupportedRatesLen = MAX_LEN_OF_SUPPORTED_RATES; - } - } - - /* Clear Supported MCS Table */ - pEntry->SupportCCKMCS = 0; - pEntry->SupportOFDMMCS = 0; - pEntry->SupportHTMCS = 0; -#ifdef DOT11_VHT_AC - pEntry->SupportVHTMCS1SS = 0; - pEntry->SupportVHTMCS2SS = 0; - pEntry->SupportVHTMCS3SS = 0; - pEntry->SupportVHTMCS4SS = 0; -#endif /* DOT11_VHT_AC */ - pEntry->SupportRateMode = 0; - - for (idx = 0; idx < SupportedRatesLen; idx++) { - switch ((SupportedRates[idx] & 0x7F) * 5) { - case 10: - pEntry->SupportCCKMCS |= (1 << MCS_0); - pEntry->SupportRateMode |= SUPPORT_CCK_MODE; - break; - - case 20: - pEntry->SupportCCKMCS |= (1 << MCS_1); - pEntry->SupportRateMode |= SUPPORT_CCK_MODE; - break; - - case 55: - pEntry->SupportCCKMCS |= (1 << MCS_2); - pEntry->SupportRateMode |= SUPPORT_CCK_MODE; - break; - - case 110: - pEntry->SupportCCKMCS |= (1 << MCS_3); - pEntry->SupportRateMode |= SUPPORT_CCK_MODE; - break; - - case 60: - pEntry->SupportOFDMMCS |= (1 << MCS_0); - pEntry->SupportRateMode |= SUPPORT_OFDM_MODE; - break; - - case 90: - pEntry->SupportOFDMMCS |= (1 << MCS_1); - pEntry->SupportRateMode |= SUPPORT_OFDM_MODE; - break; - - case 120: - pEntry->SupportOFDMMCS |= (1 << MCS_2); - pEntry->SupportRateMode |= SUPPORT_OFDM_MODE; - break; - - case 180: - pEntry->SupportOFDMMCS |= (1 << MCS_3); - pEntry->SupportRateMode |= SUPPORT_OFDM_MODE; - break; - - case 240: - pEntry->SupportOFDMMCS |= (1 << MCS_4); - pEntry->SupportRateMode |= SUPPORT_OFDM_MODE; - break; - - case 360: - pEntry->SupportOFDMMCS |= (1 << MCS_5); - pEntry->SupportRateMode |= SUPPORT_OFDM_MODE; - break; - - case 480: - pEntry->SupportOFDMMCS |= (1 << MCS_6); - pEntry->SupportRateMode |= SUPPORT_OFDM_MODE; - break; - - case 540: - pEntry->SupportOFDMMCS |= (1 << MCS_7); - pEntry->SupportRateMode |= SUPPORT_OFDM_MODE; - break; - } - } - - if (HtCapabilityLen) { - RT_PHY_INFO *pDesired_ht_phy = NULL; - UCHAR j, bitmask; - CHAR i; -#ifdef CONFIG_AP_SUPPORT - - if (OpMode == OPMODE_AP) { -#ifdef WDS_SUPPORT - - if (IS_ENTRY_WDS(pEntry)) - pDesired_ht_phy = - &pAd->WdsTab - .WdsEntry[pEntry->func_tb_idx] - .wdev.DesiredHtPhyInfo; - else -#endif /* WDS_SUPPORT */ -#ifdef APCLI_SUPPORT - if (IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry)) - pDesired_ht_phy = - &pAd->ApCfg - .ApCliTab[pEntry->func_tb_idx] - .wdev.DesiredHtPhyInfo; - else -#endif /* APCLI_SUPPORT */ - { - pDesired_ht_phy = - &pAd->ApCfg.MBSSID[pEntry->func_tb_idx] - .wdev.DesiredHtPhyInfo; - } - } - -#endif /* CONFIG_AP_SUPPORT */ - - if (pDesired_ht_phy == NULL) - return; - - for (i = 31; i >= 0; i--) { - j = i / 8; - bitmask = (1 << (i - (j * 8))); - - if ((pDesired_ht_phy->MCSSet[j] & bitmask) && - (pHtCapability->MCSSet[j] & bitmask)) { - pEntry->SupportHTMCS |= 1 << i; - pEntry->SupportRateMode |= SUPPORT_HT_MODE; - } - } - -#ifdef DOT11_VHT_AC - - if ((vht_cap_len > 0) && (vht_cap != NULL) && - pDesired_ht_phy->bVhtEnable) { - /* Currently we only support for MCS0~MCS7, so don't check mcs_map */ - pEntry->SupportVHTMCS1SS = 0; - pEntry->SupportVHTMCS2SS = 0; - pEntry->SupportVHTMCS3SS = 0; - pEntry->SupportVHTMCS4SS = 0; - - for (j = wlan_operate_get_tx_stream(pEntry->wdev); - j > 0; j--) { - switch (j) { - case 1: - if (vht_cap->mcs_set.rx_mcs_map.mcs_ss1 < - VHT_MCS_CAP_NA) { - for (i = 0; i <= 7; i++) - pEntry->SupportVHTMCS1SS |= - 1 << i; - - if (vht_cap->mcs_set.rx_mcs_map - .mcs_ss1 == - VHT_MCS_CAP_8) - pEntry->SupportVHTMCS1SS |= - 1 << 8; - else if (vht_cap->mcs_set - .rx_mcs_map - .mcs_ss1 == - VHT_MCS_CAP_9) { - pEntry->SupportVHTMCS1SS |= - 1 << 8; - pEntry->SupportVHTMCS1SS |= - 1 << 9; - } - - pEntry->SupportRateMode |= - SUPPORT_VHT_MODE; - } - - break; - - case 2: - if (vht_cap->mcs_set.rx_mcs_map.mcs_ss2 < - VHT_MCS_CAP_NA) { - for (i = 0; i <= 7; i++) - pEntry->SupportVHTMCS2SS |= - 1 << i; - - if (vht_cap->mcs_set.rx_mcs_map - .mcs_ss2 == - VHT_MCS_CAP_8) - pEntry->SupportVHTMCS2SS |= - 1 << 8; - else if (vht_cap->mcs_set - .rx_mcs_map - .mcs_ss2 == - VHT_MCS_CAP_9) { - pEntry->SupportVHTMCS2SS |= - 1 << 8; - pEntry->SupportVHTMCS2SS |= - 1 << 9; - } - - pEntry->SupportRateMode |= - SUPPORT_VHT_MODE; - } - - break; - - case 3: - if (vht_cap->mcs_set.rx_mcs_map.mcs_ss3 < - VHT_MCS_CAP_NA) { - for (i = 0; i <= 7; i++) - pEntry->SupportVHTMCS3SS |= - 1 << i; - - if (vht_cap->mcs_set.rx_mcs_map - .mcs_ss3 == - VHT_MCS_CAP_8) - pEntry->SupportVHTMCS3SS |= - 1 << 8; - else if (vht_cap->mcs_set - .rx_mcs_map - .mcs_ss3 == - VHT_MCS_CAP_9) { - pEntry->SupportVHTMCS3SS |= - 1 << 8; - pEntry->SupportVHTMCS3SS |= - 1 << 9; - } - - pEntry->SupportRateMode |= - SUPPORT_VHT_MODE; - } - - break; - - case 4: - if (vht_cap->mcs_set.rx_mcs_map.mcs_ss4 < - VHT_MCS_CAP_NA) { - for (i = 0; i <= 7; i++) - pEntry->SupportVHTMCS4SS |= - 1 << i; - - if (vht_cap->mcs_set.rx_mcs_map - .mcs_ss4 == - VHT_MCS_CAP_8) - pEntry->SupportVHTMCS4SS |= - 1 << 8; - else if (vht_cap->mcs_set - .rx_mcs_map - .mcs_ss4 == - VHT_MCS_CAP_9) { - pEntry->SupportVHTMCS4SS |= - 1 << 8; - pEntry->SupportVHTMCS4SS |= - 1 << 9; - } - - pEntry->SupportRateMode |= - SUPPORT_VHT_MODE; - } - - break; - - default: - break; - } - } - } - -#endif /* DOT11_VHT_AC */ - } -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/cmm_txbf_cal_mt.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/cmm_txbf_cal_mt.c deleted file mode 100644 index 02cc78a2f1..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/cmm_txbf_cal_mt.c +++ /dev/null @@ -1,1249 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_txbf_cal_mt.c -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Cmm_txbf_cal_mt.h" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -#ifdef TXBF_SUPPORT - -UINT_16 au2IBfCalEEPROMOffset[9] = { - IBF_LNA_PHASE_G0_ADDR, IBF_LNA_PHASE_G1_ADDR, IBF_LNA_PHASE_G2_ADDR, - IBF_LNA_PHASE_G3_ADDR, IBF_LNA_PHASE_G4_ADDR, IBF_LNA_PHASE_G5_ADDR, - IBF_LNA_PHASE_G6_ADDR, IBF_LNA_PHASE_G7_ADDR, IBF_LNA_PHASE_G8_ADDR -}; - -VOID E2pMemWrite(IN PRTMP_ADAPTER pAd, IN UINT16 u2MemAddr, IN UCHAR ucInput_L, - IN UCHAR ucInput_H) -{ - UINT16 u2Value; - - if ((u2MemAddr & 0x1) != 0) - u2Value = (ucInput_L << 8) | ucInput_H; - else - u2Value = (ucInput_H << 8) | ucInput_L; - - RT28xx_EEPROM_WRITE16(pAd, u2MemAddr, u2Value); -} - -#if defined(MT7615) -VOID mt7615_iBFPhaseComp(IN PRTMP_ADAPTER pAd, IN UCHAR ucGroup, - IN PCHAR pCmdBuf) -{ - if (ucGroup == 0) - os_move_mem(pCmdBuf, pAd->piBfPhaseG0, - sizeof(MT7615_IBF_PHASE_G0_T)); - else - os_move_mem(pCmdBuf, - &pAd->piBfPhaseGx[(ucGroup - 1) * - sizeof(MT7615_IBF_PHASE_Gx_T)], - sizeof(MT7615_IBF_PHASE_Gx_T)); -} -#endif /* MT7615 */ - -#if defined(MT7622) -VOID mt7622_iBFPhaseComp(IN PRTMP_ADAPTER pAd, IN UCHAR ucGroup, - IN PCHAR pCmdBuf) -{ - os_move_mem(pCmdBuf, pAd->piBfPhaseG0, sizeof(MT7622_IBF_PHASE_G0_T)); -} -#endif /* MT7622 */ - -#if defined(MT7615) -VOID mt7615_iBFPhaseFreeMem(IN PRTMP_ADAPTER pAd) -{ - /* Group 0 */ - if (pAd->piBfPhaseG0 != NULL) { - os_free_mem(pAd->piBfPhaseG0); - } - - /* Group 1 ~ 8 */ - if (pAd->piBfPhaseGx != NULL) { - os_free_mem(pAd->piBfPhaseGx); - } -} -#endif /* MT7615 */ - -#if defined(MT7622) -VOID mt7622_iBFPhaseFreeMem(IN PRTMP_ADAPTER pAd) -{ - /* Group 0 */ - if (pAd->piBfPhaseG0 != NULL) { - os_free_mem(pAd->piBfPhaseG0); - } -} -#endif /* MT7622 */ - -#if defined(MT7615) -VOID mt7615_iBFPhaseCalInit(IN PRTMP_ADAPTER pAd) -{ - /* Free memory allocated by iBF phase calibration */ - mt7615_iBFPhaseFreeMem(pAd); - - os_alloc_mem(pAd, (PUCHAR *)&pAd->piBfPhaseG0, - sizeof(MT7615_IBF_PHASE_G0_T)); - os_alloc_mem(pAd, (PUCHAR *)&pAd->piBfPhaseGx, - sizeof(MT7615_IBF_PHASE_Gx_T) * 8); - - NdisZeroMemory(pAd->piBfPhaseG0, sizeof(MT7615_IBF_PHASE_G0_T)); - NdisZeroMemory(pAd->piBfPhaseGx, sizeof(MT7615_IBF_PHASE_Gx_T) * 8); - - pAd->fgCalibrationFail = FALSE; - NdisZeroMemory(&pAd->fgGroupIdPassFailStatus[0], 9); -} -#endif /* MT7615 */ - -#if defined(MT7622) -VOID mt7622_iBFPhaseCalInit(IN PRTMP_ADAPTER pAd) -{ - mt7622_iBFPhaseFreeMem(pAd); - - os_alloc_mem(pAd, (PUCHAR *)&pAd->piBfPhaseG0, - sizeof(MT7622_IBF_PHASE_G0_T)); - - NdisZeroMemory(pAd->piBfPhaseG0, sizeof(MT7622_IBF_PHASE_G0_T)); - - pAd->fgCalibrationFail = FALSE; - pAd->fgGroupIdPassFailStatus[0] = FALSE; -} -#endif /* MT7622 */ - -#if defined(MT7615) -VOID mt7615_iBFPhaseCalE2PInit(IN PRTMP_ADAPTER pAd) -{ - UINT_16 u2BfE2pOccupiedSize; - - /* Group 0 */ - u2BfE2pOccupiedSize = sizeof(MT7615_IBF_PHASE_G0_T); - RT28xx_EEPROM_READ_WITH_RANGE(pAd, au2IBfCalEEPROMOffset[GROUP_0], - u2BfE2pOccupiedSize, pAd->piBfPhaseG0); - - /* Group 1 ~ 7 */ - u2BfE2pOccupiedSize = (sizeof(MT7615_IBF_PHASE_Gx_T) * 7) - 4; - RT28xx_EEPROM_READ_WITH_RANGE(pAd, au2IBfCalEEPROMOffset[GROUP_1], - u2BfE2pOccupiedSize, pAd->piBfPhaseGx); - - /* Group 8 */ - u2BfE2pOccupiedSize = sizeof(MT7615_IBF_PHASE_Gx_T); - RT28xx_EEPROM_READ_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[GROUP_8], u2BfE2pOccupiedSize, - (PUCHAR)&pAd->piBfPhaseGx[7 * sizeof(MT7615_IBF_PHASE_G0_T)]); - - pAd->fgCalibrationFail = FALSE; - NdisZeroMemory(&pAd->fgGroupIdPassFailStatus[0], 9); -} -#endif /* MT7615 */ - -#if defined(MT7622) -VOID mt7622_iBFPhaseCalE2PInit(IN PRTMP_ADAPTER pAd) -{ - UINT_16 u2BfE2pOccupiedSize; - - /* Group 0 */ - u2BfE2pOccupiedSize = sizeof(MT7622_IBF_PHASE_G0_T); - RT28xx_EEPROM_READ_WITH_RANGE(pAd, au2IBfCalEEPROMOffset[GROUP_0], - u2BfE2pOccupiedSize, pAd->piBfPhaseG0); - - pAd->fgCalibrationFail = FALSE; - pAd->fgGroupIdPassFailStatus[0] = FALSE; -} -#endif /* MT7622 */ - -#if defined(MT7615) -VOID mt7615_iBFPhaseCalE2PUpdate(IN PRTMP_ADAPTER pAd, IN UCHAR ucGroup, - IN BOOLEAN fgSX2, IN UCHAR ucUpdateAllTye) -{ - MT7615_IBF_PHASE_Gx_T iBfPhaseGx; - MT7615_IBF_PHASE_G0_T iBfPhaseG0; - MT7615_IBF_PHASE_Gx_T iBfPhaseGx8[8]; - UCHAR ucGroupIdx, ucEndLoop; - UCHAR ucIBfGroupSize, ucCounter; - UCHAR ucBuf[64]; - - /* UINT16 u2Value; */ - /* IF phase calibration is for BW20/40/80/160 */ - ucGroupIdx = 0; - NdisZeroMemory(&iBfPhaseG0, sizeof(MT7615_IBF_PHASE_G0_T)); - NdisZeroMemory(&iBfPhaseGx, sizeof(MT7615_IBF_PHASE_Gx_T)); - - switch (ucUpdateAllTye) { - case IBF_PHASE_ONE_GROUP_UPDATE: - ucGroupIdx = ucGroup - 1; - ucEndLoop = 0; - - if (ucGroup == GROUP_0) { - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[ucGroup], - sizeof(MT7615_IBF_PHASE_G0_T), - pAd->piBfPhaseG0); - NdisCopyMemory((PUCHAR)&iBfPhaseG0, pAd->piBfPhaseG0, - sizeof(MT7615_IBF_PHASE_G0_T)); - } else if (ucGroup == GROUP_2) { - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[ucGroup], - (sizeof(MT7615_IBF_PHASE_Gx_T) - 4), - &pAd->piBfPhaseGx[sizeof( - MT7615_IBF_PHASE_Gx_T)]); - NdisCopyMemory( - (PUCHAR)&iBfPhaseGx, - &pAd->piBfPhaseGx[ucGroupIdx * - sizeof(MT7615_IBF_PHASE_Gx_T)], - (sizeof(MT7615_IBF_PHASE_Gx_T) - 4)); - } else { - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[ucGroup], - sizeof(MT7615_IBF_PHASE_Gx_T), - &pAd->piBfPhaseGx[ucGroupIdx * - sizeof(MT7615_IBF_PHASE_Gx_T)]); - NdisCopyMemory( - (PUCHAR)&iBfPhaseGx, - &pAd->piBfPhaseGx[ucGroupIdx * - sizeof(MT7615_IBF_PHASE_Gx_T)], - sizeof(MT7615_IBF_PHASE_Gx_T)); - } - - if (ucGroup == GROUP_0) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_L\n G%d_L_T0_H = %d\n G%d_L_T1_H = %d\n G%d_L_T2_H = %d\n", - ucGroup, ucGroup, iBfPhaseG0.ucG0_L_T0_H, - ucGroup, iBfPhaseG0.ucG0_L_T1_H, ucGroup, - iBfPhaseG0.ucG0_L_T2_H)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_M\n G%d_M_T0_H = %d\n G%d_M_T1_H = %d\n G%d_M_T2_H = %d\n", - ucGroup, ucGroup, iBfPhaseG0.ucG0_M_T0_H, - ucGroup, iBfPhaseG0.ucG0_M_T1_H, ucGroup, - iBfPhaseG0.ucG0_M_T2_H)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R0_H = %d\n G%d_R0_M = %d\n G%d_R0_L = %d\n G%d_R1_H = %d\n G%d_R1_M = %d\n G%d_R1_L = %d\n", - ucGroup, iBfPhaseG0.ucG0_R0_H, ucGroup, - iBfPhaseG0.ucG0_R0_M, ucGroup, - iBfPhaseG0.ucG0_R0_L, ucGroup, - iBfPhaseG0.ucG0_R1_H, ucGroup, - iBfPhaseG0.ucG0_R1_M, ucGroup, - iBfPhaseG0.ucG0_R1_L)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R2_H = %d\n G%d_R2_M = %d\n G%d_R2_L = %d\n G%d_R3_H = %d\n G%d_R3_M = %d\n G%d_R3_L = %d\n", - ucGroup, iBfPhaseG0.ucG0_R2_H, ucGroup, - iBfPhaseG0.ucG0_R2_M, ucGroup, - iBfPhaseG0.ucG0_R2_L, ucGroup, - iBfPhaseG0.ucG0_R3_H, ucGroup, - iBfPhaseG0.ucG0_R3_M, ucGroup, - iBfPhaseG0.ucG0_R3_L)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_H\n G%d_H_T0_H = %d\n G%d_H_T1_H = %d\n G%d_H_T2_H = %d\n", - ucGroup, ucGroup, iBfPhaseG0.ucG0_H_T0_H, - ucGroup, iBfPhaseG0.ucG0_H_T1_H, ucGroup, - iBfPhaseG0.ucG0_H_T2_H)); - } else { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_L\n G%d_L_T0_H = %d\n G%d_L_T1_H = %d\n G%d_L_T2_H = %d\n", - ucGroup, ucGroup, iBfPhaseGx.ucGx_L_T0_H, - ucGroup, iBfPhaseGx.ucGx_L_T1_H, ucGroup, - iBfPhaseGx.ucGx_L_T2_H)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_M\n G%d_M_T0_H = %d\n G%d_M_T1_H = %d\n G%d_M_T2_H = %d\n", - ucGroup, ucGroup, iBfPhaseGx.ucGx_M_T0_H, - ucGroup, iBfPhaseGx.ucGx_M_T1_H, ucGroup, - iBfPhaseGx.ucGx_M_T2_H)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R0_H = %d\n G%d_R0_M = %d\n G%d_R0_L = %d\n G%d_R1_H = %d\n G%d_R1_M = %d\n G%d_R1_L = %d\n", - ucGroup, iBfPhaseGx.ucGx_R0_H, ucGroup, - iBfPhaseGx.ucGx_R0_M, ucGroup, - iBfPhaseGx.ucGx_R0_L, ucGroup, - iBfPhaseGx.ucGx_R1_H, ucGroup, - iBfPhaseGx.ucGx_R1_M, ucGroup, - iBfPhaseGx.ucGx_R1_L)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R2_H = %d\n G%d_R2_M = %d\n G%d_R2_L = %d\n G%d_R3_H = %d\n G%d_R3_M = %d\n G%d_R3_L = %d\n", - ucGroup, iBfPhaseGx.ucGx_R2_H, ucGroup, - iBfPhaseGx.ucGx_R2_M, ucGroup, - iBfPhaseGx.ucGx_R2_L, ucGroup, - iBfPhaseGx.ucGx_R3_H, ucGroup, - iBfPhaseGx.ucGx_R3_M, ucGroup, - iBfPhaseGx.ucGx_R3_L)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_H\n G%d_H_T0_H = %d\n G%d_H_T1_H = %d\n G%d_H_T2_H = %d\n", - ucGroup, ucGroup, iBfPhaseGx.ucGx_H_T0_H, - ucGroup, iBfPhaseGx.ucGx_H_T1_H, ucGroup, - iBfPhaseGx.ucGx_H_T2_H)); - } - - break; - - case IBF_PHASE_ALL_GROUP_UPDATE: - if (pAd->fgCalibrationFail == FALSE) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("All of groups can pass criterion and calibrated phases can be written into EEPROM\n")); - - NdisCopyMemory(ucBuf, pAd->piBfPhaseG0, - sizeof(MT7615_IBF_PHASE_G0_T)); - NdisCopyMemory(&ucBuf[sizeof(MT7615_IBF_PHASE_G0_T)], - pAd->piBfPhaseGx, - sizeof(MT7615_IBF_PHASE_Gx_T)); - - /* Write Group 0 and 1 into EEPROM */ - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[GROUP_0], - (sizeof(MT7615_IBF_PHASE_G0_T) + - sizeof(MT7615_IBF_PHASE_Gx_T)), - ucBuf); - /* Write Group 2 into EEPROM */ - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[GROUP_2], - (sizeof(MT7615_IBF_PHASE_Gx_T) - 4), - &pAd->piBfPhaseGx[(GROUP_2 - 1) * - sizeof(MT7615_IBF_PHASE_Gx_T)]); - /* Write Group 3 ~ 7 into EEPROM */ - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[GROUP_3], - (sizeof(MT7615_IBF_PHASE_Gx_T) * - (GROUP_7 - GROUP_2)), - &pAd->piBfPhaseGx[(GROUP_3 - 1) * - sizeof(MT7615_IBF_PHASE_Gx_T)]); - /* Write Group 8 into EEPROM */ - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[GROUP_8], - sizeof(MT7615_IBF_PHASE_Gx_T), - &pAd->piBfPhaseGx[(GROUP_8 - 1) * - sizeof(MT7615_IBF_PHASE_Gx_T)]); - } else { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated phases can't be written into EEPROM because some groups can't pass criterion!!!\n")); - - for (ucCounter = GROUP_0; ucCounter <= GROUP_8; - ucCounter++) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group%d = %s\n", ucCounter, - (pAd->fgGroupIdPassFailStatus - [ucCounter] == TRUE) ? - "FAIL" : - "PASS")); - } - } - - break; - - case IBF_PHASE_ALL_GROUP_ERASE: - if (pAd->piBfPhaseG0 != NULL) { - NdisZeroMemory(pAd->piBfPhaseG0, - sizeof(MT7615_IBF_PHASE_G0_T)); - } - - if (pAd->piBfPhaseGx != NULL) { - NdisZeroMemory(pAd->piBfPhaseGx, - sizeof(MT7615_IBF_PHASE_Gx_T) * 8); - } - - NdisZeroMemory((PUCHAR)&iBfPhaseG0, - sizeof(MT7615_IBF_PHASE_G0_T)); - NdisZeroMemory((PUCHAR)&iBfPhaseGx8[0], - (sizeof(MT7615_IBF_PHASE_Gx_T) * 8)); - - RT28xx_EEPROM_WRITE_WITH_RANGE(pAd, - au2IBfCalEEPROMOffset[GROUP_0], - sizeof(MT7615_IBF_PHASE_G0_T), - (PUCHAR)&iBfPhaseG0); - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[GROUP_1], - (sizeof(MT7615_IBF_PHASE_Gx_T) * 7 - 4), - (PUCHAR)&iBfPhaseGx8[0]); - RT28xx_EEPROM_WRITE_WITH_RANGE(pAd, - au2IBfCalEEPROMOffset[GROUP_8], - sizeof(MT7615_IBF_PHASE_Gx_T), - (PUCHAR)&iBfPhaseGx8[7]); - break; - - case IBF_PHASE_ALL_GROUP_READ_FROM_E2P: - mt7615_iBFPhaseCalE2PInit(pAd); - break; - - default: - ucGroupIdx = ucGroup - 1; - ucEndLoop = 0; - ucIBfGroupSize = sizeof(MT7615_IBF_PHASE_Gx_T); - ucIBfGroupSize = (ucGroup == GROUP_2) ? (ucIBfGroupSize - 4) : - ucIBfGroupSize; - - NdisCopyMemory((PUCHAR)&iBfPhaseGx, - &pAd->piBfPhaseGx[ucGroupIdx * - sizeof(MT7615_IBF_PHASE_Gx_T)], - ucIBfGroupSize); - NdisCopyMemory((PUCHAR)&iBfPhaseG0, pAd->piBfPhaseG0, - sizeof(MT7615_IBF_PHASE_G0_T)); - break; - } -} -#endif /* MT7615 */ - -#if defined(MT7622) -VOID mt7622_iBFPhaseCalE2PUpdate(IN PRTMP_ADAPTER pAd, IN UCHAR ucGroup, - IN BOOLEAN fgSX2, IN UCHAR ucUpdateAllTye) -{ - MT7622_IBF_PHASE_Gx_T iBfPhaseGx; - MT7622_IBF_PHASE_G0_T iBfPhaseG0; - UCHAR ucGroupIdx, ucEndLoop; - /* UINT16 u2Value; */ - - /* IF phase calibration is for BW20/40/80/160 */ - ucGroupIdx = 0; - NdisZeroMemory(&iBfPhaseG0, sizeof(MT7622_IBF_PHASE_G0_T)); - NdisZeroMemory(&iBfPhaseGx, sizeof(MT7622_IBF_PHASE_Gx_T)); - - switch (ucUpdateAllTye) { - case IBF_PHASE_ONE_GROUP_UPDATE: - ucGroupIdx = ucGroup - 1; - ucEndLoop = 0; - - if (ucGroup == GROUP_0) { - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[ucGroup], - sizeof(MT7622_IBF_PHASE_G0_T), - pAd->piBfPhaseG0); - NdisCopyMemory(&iBfPhaseG0, pAd->piBfPhaseG0, - sizeof(MT7622_IBF_PHASE_G0_T)); - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_H\n G%d_H_T0_UH = %d\n G%d_H_T1_UH = %d\n G%d_H_T2_UH = %d\n", - ucGroup, ucGroup, iBfPhaseG0.ucG0_H_T0_UH, - ucGroup, iBfPhaseG0.ucG0_H_T1_UH, ucGroup, - iBfPhaseG0.ucG0_H_T2_UH)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_L\n G%d_L_T0_UH = %d\n G%d_L_T1_UH = %d\n G%d_L_T2_UH = %d\n", - ucGroup, ucGroup, iBfPhaseG0.ucG0_L_T0_UH, - ucGroup, iBfPhaseG0.ucG0_L_T1_UH, ucGroup, - iBfPhaseG0.ucG0_L_T2_UH)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_M\n G%d_M_T0_UH = %d\n G%d_M_T1_UH = %d\n G%d_M_T2_UH = %d\n", - ucGroup, ucGroup, iBfPhaseG0.ucG0_M_T0_UH, - ucGroup, iBfPhaseG0.ucG0_M_T1_UH, ucGroup, - iBfPhaseG0.ucG0_M_T2_UH)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R0_UH = %d\n G%d_R0_H = %d\n G%d_R0_M = %d\n G%d_R0_L = %d\n G%d_R1_UH = %d\n G%d_R1_H = %d\n G%d_R1_M = %d\n G%d_R1_L = %d\n", - ucGroup, iBfPhaseG0.ucG0_R0_UH, ucGroup, - iBfPhaseG0.ucG0_R0_H, ucGroup, - iBfPhaseG0.ucG0_R0_M, ucGroup, - iBfPhaseG0.ucG0_R0_L, ucGroup, - iBfPhaseG0.ucG0_R1_UH, ucGroup, - iBfPhaseG0.ucG0_R1_H, ucGroup, - iBfPhaseG0.ucG0_R1_M, ucGroup, - iBfPhaseG0.ucG0_R1_L)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R2_UH = %d\n G%d_R2_H = %d\n G%d_R2_M = %d\n G%d_R2_L = %d\n G%d_R3_UH = %d\n G%d_R3_H = %d\n G%d_R3_M = %d\n G%d_R3_L = %d\n", - ucGroup, iBfPhaseG0.ucG0_R2_H, ucGroup, - iBfPhaseG0.ucG0_R2_UH, ucGroup, - iBfPhaseG0.ucG0_R2_M, ucGroup, - iBfPhaseG0.ucG0_R2_L, ucGroup, - iBfPhaseG0.ucG0_R3_UH, ucGroup, - iBfPhaseG0.ucG0_R3_H, ucGroup, - iBfPhaseG0.ucG0_R3_M, ucGroup, - iBfPhaseG0.ucG0_R3_L)); - } - - break; - - case IBF_PHASE_ALL_GROUP_UPDATE: - if (pAd->fgCalibrationFail == FALSE) { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("All of groups can pass criterion and calibrated phases can be written into EEPROM\n")); - - /* Write Group 0 into EEPROM */ - RT28xx_EEPROM_WRITE_WITH_RANGE( - pAd, au2IBfCalEEPROMOffset[GROUP_0], - sizeof(MT7622_IBF_PHASE_G0_T), - pAd->piBfPhaseG0); - } else { - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated phases can't be written into EEPROM because some groups can't pass criterion!!!\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Group%d = %s\n", 0, - (pAd->fgGroupIdPassFailStatus[0] == TRUE) ? - "FAIL" : - "PASS")); - } - - break; - - case IBF_PHASE_ALL_GROUP_ERASE: - NdisZeroMemory(pAd->piBfPhaseG0, sizeof(MT7622_IBF_PHASE_G0_T)); - - RT28xx_EEPROM_WRITE_WITH_RANGE(pAd, - au2IBfCalEEPROMOffset[GROUP_0], - sizeof(MT7622_IBF_PHASE_G0_T), - pAd->piBfPhaseG0); - break; - - case IBF_PHASE_ALL_GROUP_READ_FROM_E2P: - mt7622_iBFPhaseCalE2PInit(pAd); - break; - - default: - ucGroupIdx = ucGroup - 1; - ucEndLoop = 0; - - NdisCopyMemory(&iBfPhaseG0, pAd->piBfPhaseG0, - sizeof(MT7622_IBF_PHASE_G0_T)); - break; - } -} -#endif - -#if defined(MT7615) -VOID mt7615_iBFPhaseCalReport(IN PRTMP_ADAPTER pAd, IN UCHAR ucGroupL_M_H, - IN UCHAR ucGroup, IN BOOLEAN fgSX2, - IN UCHAR ucStatus, IN UCHAR ucPhaseCalType, - IN PUCHAR pBuf) -{ - MT7615_IBF_PHASE_G0_T iBfPhaseG0; - MT7615_IBF_PHASE_Gx_T iBfPhaseGx; - P_MT7615_IBF_PHASE_G0_T piBfPhaseG0; - P_MT7615_IBF_PHASE_Gx_T piBfPhaseGx; - MT7615_IBF_PHASE_OUT iBfPhaseOut; - UCHAR ucGroupIdx; - PUCHAR pucIBfPhaseG; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s :: Calibrated iBF phases\n", __func__)); - pucIBfPhaseG = pBuf + sizeof(MT7615_IBF_PHASE_OUT); - NdisCopyMemory(&iBfPhaseOut, pBuf, sizeof(MT7615_IBF_PHASE_OUT)); - - switch (ucPhaseCalType) { - case IBF_PHASE_CAL_NOTHING: /* Do nothing */ - break; - - case IBF_PHASE_CAL_NORMAL_INSTRUMENT: - case IBF_PHASE_CAL_NORMAL: /* Store calibrated phases with buffer mode */ - /* IF phase calibration is for DBDC or 80+80 */ - if ((fgSX2 == TRUE) && (ucGroup > 0)) { - ucGroupIdx = ucGroup - 1; - NdisCopyMemory(&iBfPhaseGx, pucIBfPhaseG, - sizeof(MT7615_IBF_PHASE_Gx_T)); - - piBfPhaseGx = (P_MT7615_IBF_PHASE_Gx_T)&pAd->piBfPhaseGx - [ucGroupIdx * - sizeof(MT7615_IBF_PHASE_Gx_T)]; - - switch (ucGroupL_M_H) { - case GROUP_L: - piBfPhaseGx->ucGx_L_T2_H_SX2 = - iBfPhaseGx.ucGx_L_T2_H_SX2; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("160 iBF phase calibration\n Group_L\n G%d_L_T2_H_SX2 = %d\n ", - ucGroup, iBfPhaseGx.ucGx_L_T2_H_SX2)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group : %d\n", ucGroup)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - - case GROUP_M: - piBfPhaseGx->ucGx_M_T2_H_SX2 = - iBfPhaseGx.ucGx_M_T2_H_SX2; - piBfPhaseGx->ucGx_R2_H_SX2 = - iBfPhaseGx.ucGx_R2_H_SX2; - piBfPhaseGx->ucGx_R2_M_SX2 = - iBfPhaseGx.ucGx_R2_M_SX2; - piBfPhaseGx->ucGx_R2_L_SX2 = - iBfPhaseGx.ucGx_R2_L_SX2; - piBfPhaseGx->ucGx_R3_H_SX2 = - iBfPhaseGx.ucGx_R3_H_SX2; - piBfPhaseGx->ucGx_R3_M_SX2 = - iBfPhaseGx.ucGx_R3_M_SX2; - piBfPhaseGx->ucGx_R3_L_SX2 = - iBfPhaseGx.ucGx_R3_L_SX2; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Group_M\n G%d_M_T2_H_SX2 = %d\n G%d_R2_H_SX2 = %d\n G%d_R2_M_SX2 = %d\n", - ucGroup, iBfPhaseGx.ucGx_H_T2_H_SX2, - ucGroup, iBfPhaseGx.ucGx_R2_H_SX2, - ucGroup, iBfPhaseGx.ucGx_R2_M_SX2)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R2_L_SX2 = %d\n G%d_R3_H_SX2 = %d\n G%d_R3_M_SX2 = %d\n G%d_R3_L_SX2 = %d\n", - ucGroup, iBfPhaseGx.ucGx_R2_L_SX2, - ucGroup, iBfPhaseGx.ucGx_R3_H_SX2, - ucGroup, iBfPhaseGx.ucGx_R3_M_SX2, - ucGroup, iBfPhaseGx.ucGx_R3_L_SX2)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group : %d\n", ucGroup)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - - case GROUP_H: - piBfPhaseGx->ucGx_H_T2_H_SX2 = - iBfPhaseGx.ucGx_H_T2_H_SX2; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group_H\n G%d_H_T2_H_SX2 = %d\n", - ucGroup, iBfPhaseGx.ucGx_H_T2_H_SX2)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group : %d\n", ucGroup)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - } - - return; - } - - /* IF phase calibration is for BW20/40/80 */ - if (ucGroup == GROUP_0) { - NdisCopyMemory(&iBfPhaseG0, pucIBfPhaseG, - sizeof(MT7615_IBF_PHASE_G0_T)); - NdisCopyMemory(&iBfPhaseGx, pucIBfPhaseG, - sizeof(MT7615_IBF_PHASE_Gx_T)); - - piBfPhaseG0 = (P_MT7615_IBF_PHASE_G0_T)pAd->piBfPhaseG0; - - switch (ucGroupL_M_H) { - case GROUP_L: - piBfPhaseG0->ucG0_L_T0_H = - iBfPhaseGx.ucGx_L_T0_H; - piBfPhaseG0->ucG0_L_T1_H = - iBfPhaseGx.ucGx_L_T1_H; - piBfPhaseG0->ucG0_L_T2_H = - iBfPhaseGx.ucGx_L_T2_H; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G0 and Group_L\n G0_L_T0_H = %d\n G0_L_T1_H = %d\n G0_L_T2_H = %d\n", - iBfPhaseGx.ucGx_L_T0_H, - iBfPhaseGx.ucGx_L_T1_H, - iBfPhaseGx.ucGx_L_T2_H)); - break; - - case GROUP_M: - piBfPhaseG0->ucG0_M_T0_H = - iBfPhaseGx.ucGx_M_T0_H; - piBfPhaseG0->ucG0_M_T1_H = - iBfPhaseGx.ucGx_M_T1_H; - piBfPhaseG0->ucG0_M_T2_H = - iBfPhaseGx.ucGx_M_T2_H; - piBfPhaseG0->ucG0_R0_H = iBfPhaseG0.ucG0_R0_H; - piBfPhaseG0->ucG0_R0_M = iBfPhaseG0.ucG0_R0_M; - piBfPhaseG0->ucG0_R0_L = iBfPhaseG0.ucG0_R0_L; - piBfPhaseG0->ucG0_R1_H = iBfPhaseG0.ucG0_R1_H; - piBfPhaseG0->ucG0_R1_M = iBfPhaseG0.ucG0_R1_M; - piBfPhaseG0->ucG0_R1_L = iBfPhaseG0.ucG0_R1_L; - piBfPhaseG0->ucG0_R2_H = iBfPhaseG0.ucG0_R2_H; - piBfPhaseG0->ucG0_R2_M = iBfPhaseG0.ucG0_R2_M; - piBfPhaseG0->ucG0_R2_L = iBfPhaseG0.ucG0_R2_L; - piBfPhaseG0->ucG0_R3_H = iBfPhaseG0.ucG0_R3_H; - piBfPhaseG0->ucG0_R3_M = iBfPhaseG0.ucG0_R3_M; - piBfPhaseG0->ucG0_R3_L = iBfPhaseG0.ucG0_R3_L; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G0 and Group_M\n G0_M_T0_H = %d\n G0_M_T1_H = %d\n G0_M_T2_H = %d\n", - iBfPhaseGx.ucGx_M_T0_H, - iBfPhaseGx.ucGx_M_T1_H, - iBfPhaseGx.ucGx_M_T2_H)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G0_R0_H = %d\n G0_R0_M = %d\n G0_R0_L = %d\n G0_R1_H = %d\n G0_R1_M = %d\n G0_R1_L = %d\n", - iBfPhaseG0.ucG0_R0_H, - iBfPhaseG0.ucG0_R0_M, - iBfPhaseG0.ucG0_R0_L, - iBfPhaseG0.ucG0_R1_H, - iBfPhaseG0.ucG0_R1_M, - iBfPhaseG0.ucG0_R1_L)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G0_R2_H = %d\n G0_R2_M = %d\n G0_R2_L = %d\n G0_R3_H = %d\n G0_R3_M = %d\n G0_R3_L = %d\n", - iBfPhaseG0.ucG0_R2_H, - iBfPhaseG0.ucG0_R2_M, - iBfPhaseG0.ucG0_R2_L, - iBfPhaseG0.ucG0_R3_H, - iBfPhaseG0.ucG0_R3_M, - iBfPhaseG0.ucG0_R3_L)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("Group : %d\n", 0)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - - case GROUP_H: - piBfPhaseG0->ucG0_H_T0_H = - iBfPhaseGx.ucGx_H_T0_H; - piBfPhaseG0->ucG0_H_T1_H = - iBfPhaseGx.ucGx_H_T1_H; - piBfPhaseG0->ucG0_H_T2_H = - iBfPhaseGx.ucGx_H_T2_H; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G1 and Group_H\n G0_H_T0_H = %d\n G0_H_T1_H = %d\n G0_H_T2_H = %d\n", - iBfPhaseGx.ucGx_H_T0_H, - iBfPhaseGx.ucGx_H_T1_H, - iBfPhaseGx.ucGx_H_T2_H)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("Group : %d\n", 0)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - } - } else { - ucGroupIdx = ucGroup - 1; - NdisCopyMemory(&iBfPhaseGx, pucIBfPhaseG, - sizeof(MT7615_IBF_PHASE_Gx_T)); - - piBfPhaseGx = (P_MT7615_IBF_PHASE_Gx_T)&pAd->piBfPhaseGx - [ucGroupIdx * - sizeof(MT7615_IBF_PHASE_Gx_T)]; - - switch (ucGroupL_M_H) { - case GROUP_L: - piBfPhaseGx->ucGx_L_T0_H = - iBfPhaseGx.ucGx_L_T0_H; - piBfPhaseGx->ucGx_L_T1_H = - iBfPhaseGx.ucGx_L_T1_H; - piBfPhaseGx->ucGx_L_T2_H = - iBfPhaseGx.ucGx_L_T2_H; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_L\n G%d_L_T0_H = %d\n G%d_L_T1_H = %d\n G%d_L_T2_H = %d\n", - ucGroup, ucGroup, - iBfPhaseGx.ucGx_L_T0_H, ucGroup, - iBfPhaseGx.ucGx_L_T1_H, ucGroup, - iBfPhaseGx.ucGx_L_T2_H)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group : %d\n", ucGroup)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - - case GROUP_M: - piBfPhaseGx->ucGx_M_T0_H = - iBfPhaseGx.ucGx_M_T0_H; - piBfPhaseGx->ucGx_M_T1_H = - iBfPhaseGx.ucGx_M_T1_H; - piBfPhaseGx->ucGx_M_T2_H = - iBfPhaseGx.ucGx_M_T2_H; - piBfPhaseGx->ucGx_R0_H = iBfPhaseGx.ucGx_R0_H; - piBfPhaseGx->ucGx_R0_M = iBfPhaseGx.ucGx_R0_M; - piBfPhaseGx->ucGx_R0_L = iBfPhaseGx.ucGx_R0_L; - piBfPhaseGx->ucGx_R1_H = iBfPhaseGx.ucGx_R1_H; - piBfPhaseGx->ucGx_R1_M = iBfPhaseGx.ucGx_R1_M; - piBfPhaseGx->ucGx_R1_L = iBfPhaseGx.ucGx_R1_L; - piBfPhaseGx->ucGx_R2_H = iBfPhaseGx.ucGx_R2_H; - piBfPhaseGx->ucGx_R2_M = iBfPhaseGx.ucGx_R2_M; - piBfPhaseGx->ucGx_R2_L = iBfPhaseGx.ucGx_R2_L; - piBfPhaseGx->ucGx_R3_H = iBfPhaseGx.ucGx_R3_H; - piBfPhaseGx->ucGx_R3_M = iBfPhaseGx.ucGx_R3_M; - piBfPhaseGx->ucGx_R3_L = iBfPhaseGx.ucGx_R3_L; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_M\n G%d_M_T0_H = %d\n G%d_M_T1_H = %d\n G%d_M_T2_H = %d\n", - ucGroup, ucGroup, - iBfPhaseGx.ucGx_M_T0_H, ucGroup, - iBfPhaseGx.ucGx_M_T1_H, ucGroup, - iBfPhaseGx.ucGx_M_T2_H)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R0_H = %d\n G%d_R0_M = %d\n G%d_R0_L = %d\n G%d_R1_H = %d\n G%d_R1_M = %d\n G%d_R1_L = %d\n", - ucGroup, iBfPhaseGx.ucGx_R0_H, ucGroup, - iBfPhaseGx.ucGx_R0_M, ucGroup, - iBfPhaseGx.ucGx_R0_L, ucGroup, - iBfPhaseGx.ucGx_R1_H, ucGroup, - iBfPhaseGx.ucGx_R1_M, ucGroup, - iBfPhaseGx.ucGx_R1_L)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d_R2_H = %d\n G%d_R2_M = %d\n G%d_R2_L = %d\n G%d_R3_H = %d\n G%d_R3_M = %d\n G%d_R3_L = %d\n", - ucGroup, iBfPhaseGx.ucGx_R2_H, ucGroup, - iBfPhaseGx.ucGx_R2_M, ucGroup, - iBfPhaseGx.ucGx_R2_L, ucGroup, - iBfPhaseGx.ucGx_R3_H, ucGroup, - iBfPhaseGx.ucGx_R3_M, ucGroup, - iBfPhaseGx.ucGx_R3_L)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group : %d\n", ucGroup)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - - case GROUP_H: - piBfPhaseGx->ucGx_H_T0_H = - iBfPhaseGx.ucGx_H_T0_H; - piBfPhaseGx->ucGx_H_T1_H = - iBfPhaseGx.ucGx_H_T1_H; - piBfPhaseGx->ucGx_H_T2_H = - iBfPhaseGx.ucGx_H_T2_H; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G%d and Group_H\n G%d_H_T0_H = %d\n G%d_H_T1_H = %d\n G%d_H_T2_H = %d\n", - ucGroup, ucGroup, - iBfPhaseGx.ucGx_H_T0_H, ucGroup, - iBfPhaseGx.ucGx_H_T1_H, ucGroup, - iBfPhaseGx.ucGx_H_T2_H)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, - ("Group : %d\n", ucGroup)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - } - } - break; - - case IBF_PHASE_CAL_VERIFY: /* Show calibrated result only */ - case IBF_PHASE_CAL_VERIFY_INSTRUMENT: - NdisCopyMemory(&iBfPhaseOut, pBuf, - sizeof(MT7615_IBF_PHASE_OUT)); - /* Update calibrated status */ - pAd->fgCalibrationFail |= ((ucStatus == 1) ? FALSE : TRUE); - pAd->fgGroupIdPassFailStatus[ucGroup] = - ((ucStatus == 1) ? FALSE : TRUE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Group : %d\n", ucGroup)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C3_M : %d, C3_L : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC3_M, - iBfPhaseOut.ucC3_L)); - break; - - default: - break; - } -} -#endif /* MT7615 */ - -#if defined(MT7622) -VOID mt7622_iBFPhaseCalReport(IN PRTMP_ADAPTER pAd, IN UCHAR ucGroupL_M_H, - IN UCHAR ucGroup, IN BOOLEAN fgSX2, - IN UCHAR ucStatus, IN UCHAR ucPhaseCalType, - IN PUCHAR pBuf) -{ - MT7622_IBF_PHASE_G0_T iBfPhaseG0; - MT7622_IBF_PHASE_Gx_T iBfPhaseGx; - P_MT7622_IBF_PHASE_G0_T piBfPhaseG0; - MT7622_IBF_PHASE_OUT iBfPhaseOut; - PUCHAR pucIBfPhaseG; - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s :: Calibrated iBF phases\n", __func__)); - pucIBfPhaseG = pBuf + sizeof(MT7622_IBF_PHASE_OUT); - NdisCopyMemory(&iBfPhaseOut, pBuf, sizeof(MT7622_IBF_PHASE_OUT)); - - piBfPhaseG0 = (P_MT7622_IBF_PHASE_G0_T)pAd->piBfPhaseG0; - - switch (ucPhaseCalType) { - case IBF_PHASE_CAL_NOTHING: /* Do nothing */ - break; - - case IBF_PHASE_CAL_NORMAL_INSTRUMENT: - case IBF_PHASE_CAL_NORMAL: /* Store calibrated phases with buffer mode */ - /* IF phase calibration is for BW20/40/80 */ - if (ucGroup == GROUP_0) { - NdisCopyMemory(&iBfPhaseGx, pucIBfPhaseG, - sizeof(MT7622_IBF_PHASE_Gx_T)); - NdisCopyMemory(&iBfPhaseG0, pucIBfPhaseG, - sizeof(MT7622_IBF_PHASE_G0_T)); - - switch (ucGroupL_M_H) { - case GROUP_L: - piBfPhaseG0->ucG0_L_T0_UH = - iBfPhaseGx.ucGx_L_T0_UH; - piBfPhaseG0->ucG0_L_T1_UH = - iBfPhaseGx.ucGx_L_T1_UH; - piBfPhaseG0->ucG0_L_T2_UH = - iBfPhaseGx.ucGx_L_T2_UH; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G0 and Group_L\n G0_L_T0_UH = %d\n G0_L_T1_UH = %d\n G0_L_T2_UH = %d\n", - iBfPhaseGx.ucGx_L_T0_UH, - iBfPhaseGx.ucGx_L_T1_UH, - iBfPhaseGx.ucGx_L_T2_UH)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("Group : %d\n", 0)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C0_UH : %d, C1_UH : %d, C2_UH : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, - iBfPhaseOut.ucC0_UH, - iBfPhaseOut.ucC1_UH, - iBfPhaseOut.ucC2_UH)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C_L : %d, C_M : %d, C_H : %d, C_UH : %d\n", - iBfPhaseOut.ucC_L, iBfPhaseOut.ucC_M, - iBfPhaseOut.ucC_H, - iBfPhaseOut.ucC_UH)); - break; - case GROUP_M: - piBfPhaseG0->ucG0_M_T0_UH = - iBfPhaseGx.ucGx_M_T0_UH; - piBfPhaseG0->ucG0_M_T1_UH = - iBfPhaseGx.ucGx_M_T1_UH; - piBfPhaseG0->ucG0_M_T2_UH = - iBfPhaseGx.ucGx_M_T2_UH; - piBfPhaseG0->ucG0_R0_UH = iBfPhaseG0.ucG0_R0_UH; - piBfPhaseG0->ucG0_R0_H = iBfPhaseG0.ucG0_R0_H; - piBfPhaseG0->ucG0_R0_M = iBfPhaseG0.ucG0_R0_M; - piBfPhaseG0->ucG0_R0_L = iBfPhaseG0.ucG0_R0_L; - piBfPhaseG0->ucG0_R1_UH = iBfPhaseG0.ucG0_R1_UH; - piBfPhaseG0->ucG0_R1_H = iBfPhaseG0.ucG0_R1_H; - piBfPhaseG0->ucG0_R1_M = iBfPhaseG0.ucG0_R1_M; - piBfPhaseG0->ucG0_R1_L = iBfPhaseG0.ucG0_R1_L; - piBfPhaseG0->ucG0_R2_UH = iBfPhaseG0.ucG0_R2_UH; - piBfPhaseG0->ucG0_R2_H = iBfPhaseG0.ucG0_R2_H; - piBfPhaseG0->ucG0_R2_M = iBfPhaseG0.ucG0_R2_M; - piBfPhaseG0->ucG0_R2_L = iBfPhaseG0.ucG0_R2_L; - piBfPhaseG0->ucG0_R3_UH = iBfPhaseG0.ucG0_R3_UH; - piBfPhaseG0->ucG0_R3_H = iBfPhaseG0.ucG0_R3_H; - piBfPhaseG0->ucG0_R3_M = iBfPhaseG0.ucG0_R3_M; - piBfPhaseG0->ucG0_R3_L = iBfPhaseG0.ucG0_R3_L; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G0 and Group_M\n G0_M_T0_UH = %d\n G0_M_T1_UH = %d\n G0_M_T2_UH = %d\n", - iBfPhaseGx.ucGx_M_T0_UH, - iBfPhaseGx.ucGx_M_T1_UH, - iBfPhaseGx.ucGx_M_T2_UH)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G0_R0_UH = %d\n G0_R0_H = %d\n G0_R0_M = %d\n G0_R0_L = %d\n G0_R1_UH = %d\n G0_R1_H = %d\n G0_R1_M = %d\n G0_R1_L = %d\n", - iBfPhaseG0.ucG0_R0_UH, - iBfPhaseG0.ucG0_R0_H, - iBfPhaseG0.ucG0_R0_M, - iBfPhaseG0.ucG0_R0_L, - iBfPhaseG0.ucG0_R1_UH, - iBfPhaseG0.ucG0_R1_H, - iBfPhaseG0.ucG0_R1_M, - iBfPhaseG0.ucG0_R1_L)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G0_R2_UH = %d\n G0_R2_H = %d\n G0_R2_M = %d\n G0_R2_L = %d\n G0_R3_UH = %d\n G0_R3_H = %d\n G0_R3_M = %d\n G0_R3_L = %d\n", - iBfPhaseG0.ucG0_R2_UH, - iBfPhaseG0.ucG0_R2_H, - iBfPhaseG0.ucG0_R2_M, - iBfPhaseG0.ucG0_R2_L, - iBfPhaseG0.ucG0_R3_UH, - iBfPhaseG0.ucG0_R3_H, - iBfPhaseG0.ucG0_R3_M, - iBfPhaseG0.ucG0_R3_L)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("Group : %d\n", 0)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C0_UH : %d, C1_UH : %d, C2_UH : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, - iBfPhaseOut.ucC0_UH, - iBfPhaseOut.ucC1_UH, - iBfPhaseOut.ucC2_UH)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C_L : %d, C_M : %d, C_H : %d, C_UH : %d\n", - iBfPhaseOut.ucC_L, iBfPhaseOut.ucC_M, - iBfPhaseOut.ucC_H, - iBfPhaseOut.ucC_UH)); - - break; - case GROUP_H: - piBfPhaseG0->ucG0_H_T0_UH = - iBfPhaseGx.ucGx_H_T0_UH; - piBfPhaseG0->ucG0_H_T1_UH = - iBfPhaseGx.ucGx_H_T1_UH; - piBfPhaseG0->ucG0_H_T2_UH = - iBfPhaseGx.ucGx_H_T2_UH; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("G1 and Group_H\n G0_H_T0_UH = %d\n G0_H_T1_UH = %d\n G0_H_T2_UH = %d\n", - iBfPhaseGx.ucGx_H_T0_UH, - iBfPhaseGx.ucGx_H_T1_UH, - iBfPhaseGx.ucGx_H_T2_UH)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_OFF, ("Group : %d\n", 0)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C0_UH : %d, C1_UH : %d, C2_UH : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, - iBfPhaseOut.ucC0_UH, - iBfPhaseOut.ucC1_UH, - iBfPhaseOut.ucC2_UH)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C_L : %d, C_M : %d, C_H : %d, C_UH : %d\n", - iBfPhaseOut.ucC_L, iBfPhaseOut.ucC_M, - iBfPhaseOut.ucC_H, - iBfPhaseOut.ucC_UH)); - - break; - } - } - break; - - case IBF_PHASE_CAL_VERIFY: /* Show calibrated result only */ - case IBF_PHASE_CAL_VERIFY_INSTRUMENT: - NdisCopyMemory(&iBfPhaseOut, pBuf, - sizeof(MT7622_IBF_PHASE_OUT)); - /* Update calibrated status */ - pAd->fgCalibrationFail |= ((ucStatus == 1) ? FALSE : TRUE); - pAd->fgGroupIdPassFailStatus[ucGroup] = - ((ucStatus == 1) ? FALSE : TRUE); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Group : %d\n", ucGroup)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibration == 1? or Verification == 2? : %d\n", - ucPhaseCalType)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("Calibrated result = %d\n", ucStatus)); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("0 : Means failed\n 1: means pass\n 2: means on-going\n")); - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C0_H : %d, C1_H : %d, C2_H : %d\n C0_M : %d, C1_M : %d, C2_M : %d\n C0_L : %d, C1_L : %d, C2_L : %d\n C0_UH : %d, C1_UH : %d, C2_UH : %d\n", - iBfPhaseOut.ucC0_H, iBfPhaseOut.ucC1_H, - iBfPhaseOut.ucC2_H, iBfPhaseOut.ucC0_M, - iBfPhaseOut.ucC1_M, iBfPhaseOut.ucC2_M, - iBfPhaseOut.ucC0_L, iBfPhaseOut.ucC1_L, - iBfPhaseOut.ucC2_L, iBfPhaseOut.ucC0_UH, - iBfPhaseOut.ucC1_UH, iBfPhaseOut.ucC2_UH)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("C_L : %d, C_M : %d, C_H : %d, C_UH : %d\n", - iBfPhaseOut.ucC_L, iBfPhaseOut.ucC_M, - iBfPhaseOut.ucC_H, iBfPhaseOut.ucC_UH)); - - break; - - default: - break; - } -} -#endif - -#endif /* TXBF_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/cmm_txbf_mt.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/cmm_txbf_mt.c deleted file mode 100644 index 976e0125ef..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/cmm_txbf_mt.c +++ /dev/null @@ -1,1633 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_txbf_mt.c -*/ - -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Cmm_txbf_mt.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif -#include "hdev/hdev.h" - -#ifdef TXBF_SUPPORT - -#define ETXBF_PROBE_TIME \ - (RA_INTERVAL - \ - 100) /* Wait for Sounding Response will time out 100msec before end of RA interval */ - -#ifdef MFB_SUPPORT - -UCHAR mcsToLowerMcs[] = { - /* originalMfb, newMfb1s, newMfb2s, newMfb3s*/ - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, - 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 0, 8, 8, - 9, 1, 9, 9, 10, 2, 10, 10, 11, 3, 11, 11, 12, 4, 12, 12, 13, 5, - 13, 13, 14, 6, 14, 14, 15, 7, 15, 15, 16, 0, 8, 16, 17, 1, 9, 17, - 18, 2, 10, 18, 19, 3, 11, 19, 20, 4, 12, 20, 21, 5, 13, 21, 22, 6, - 14, 22, 23, 7, 15, 23, 24, 0, 8, 16, 25, 1, 9, 17, 26, 2, 10, 18, - 27, 3, 11, 19, 28, 4, 12, 20, 29, 5, 13, 21, 30, 6, 14, 22, 31, 7, - 15, 23, 32, 0, 0, 0, 33, 3, 3, 3, 34, 3, 3, 3, 35, 3, 11, 11, - 36, 4, 4, 4, 37, 6, 6, 6, 38, 6, 12, 12, 39, 3, 3, 17, 40, 3, - 11, 11, 41, 3, 3, 17, 42, 3, 11, 11, 43, 3, 11, 19, 44, 3, 11, 11, - 45, 3, 11, 19, 46, 4, 4, 18, 47, 4, 12, 12, 48, 6, 6, 6, 49, 6, - 12, 12, 50, 6, 12, 20, 51, 6, 14, 14, 52, 6, 14, 14, 53, 3, 3, 17, - 54, 3, 11, 11, 55, 3, 11, 19, 56, 3, 3, 17, 57, 3, 11, 11, 58, 3, - 11, 19, 59, 3, 11, 19, 60, 3, 11, 11, 61, 3, 11, 19, 62, 3, 11, 19, - 63, 3, 11, 19, 64, 3, 11, 19, 65, 4, 4, 18, 66, 4, 12, 12, 67, 4, - 12, 20, 68, 6, 6, 6, 69, 6, 12, 12, 70, 6, 12, 20, 71, 6, 12, 20, - 72, 6, 14, 14, 73, 6, 14, 14, 74, 6, 14, 14, 75, 6, 14, 22, 76, 6, - 14, 22 -}; -#endif /* MFB_SUPPORT */ - -#ifdef ETXBF_EN_COND3_SUPPORT -UCHAR groupShift[] = { 4, 4, 4 }; -UCHAR groupMethod[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1 }; -SHORT groupThrd[] = { -8, 4, 20, 32, 52, 68, 80, 88, -16, 8, 12, 64, - 40, 60, 80, 88, -24, 12, 12, 96, 40, 60, 80, 88 }; -UINT dataRate[] = { 65, 130, 195, 260, 390, 520, 585, 650, - 130, 260, 390, 520, 780, 1040, 1170, 1300, - 190, 390, 585, 780, 1170, 1560, 1755, 1950 }; -#endif /* ETXBF_EN_COND3_SUPPORT */ - -#if defined(MT_MAC) && (!defined(MT7636)) -/* - * ========================================================================== - * Description: - * Enable sounding trigger - * - * Return: - * TRUE if all parameters are OK, FALSE otherwise - * ========================================================================== - */ -INT mt_Trigger_Sounding_Packet(IN PRTMP_ADAPTER pAd, IN UCHAR SndgEn, - IN UINT32 u4SNDPeriod, IN UCHAR ucSu_Mu, - IN UCHAR ucMuNum, IN PUCHAR pWlanId) -{ - /* Enable sounding trigger in FW */ - return CmdETxBfSoundingPeriodicTriggerCtrl(pAd, SndgEn, u4SNDPeriod, - ucSu_Mu, ucMuNum, pWlanId); -} - -#endif /* MT_MAC && !MT7636 */ - -#ifdef MT_MAC -/* - * Set_StaETxBfEnCond_Proc - enable/disable ETxBF - * usage: iwpriv ra0 set StaETxBfEnCond=dd - * 0=>disable, 1=>enable - * Note: After use this command, need to re-run StaStartup()/LinkUp() operations to sync all status. - * If ETxBfIncapable!=0 then we don't need to reassociate. - */ -UCHAR AsicTxBfEnCondProc(IN RTMP_ADAPTER *pAd, IN TXBF_STATUS_INFO *pTxBfInfo) -{ - MAC_TABLE_ENTRY *pEntry; - UCHAR ucETxBfEn; - UCHAR ucWlanIdx; - - for (ucWlanIdx = 0; VALID_UCAST_ENTRY_WCID(pAd, ucWlanIdx); - ucWlanIdx++) { - pEntry = &pAd->MacTab.Content[ucWlanIdx]; - - if (!IS_ENTRY_NONE(pEntry)) { -#ifdef VHT_TXBF_SUPPORT - - if (WMODE_CAP_AC(pTxBfInfo->ucPhyMode) && - (pTxBfInfo->u2Channel > 14)) { - ucETxBfEn = - mt_WrapClientSupportsVhtETxBF( - pAd, pTxBfInfo->pVhtTxBFCap) ? - TRUE : - FALSE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("VHT mode!\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, - ("STA : Bfee Cap =%d, Bfer Cap =%d!\n", - pTxBfInfo->pVhtTxBFCap->bfee_cap_su, - pTxBfInfo->pVhtTxBFCap->bfer_cap_su)); - } else -#endif - { - ucETxBfEn = - mt_WrapClientSupportsETxBF( - pAd, pTxBfInfo->pHtTxBFCap) ? - TRUE : - FALSE; - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("HT mode!\n")); - } - - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("Final ETxBF status =%d!\n", ucETxBfEn)); - - if (ucETxBfEn) { - CmdTxBfTxApplyCtrl(pAd, ucWlanIdx, TRUE, FALSE, - TRUE, FALSE); - } - } - } - - return TRUE; -} -#endif /* MT_MAC */ - -/* - * TxBFInit - Intialize TxBF fields in pEntry - * supportsETxBF - TRUE if client supports ETxBF - */ -VOID mt_TxBFInit(IN PRTMP_ADAPTER pAd, IN TXBF_STATUS_INFO *pTxBfInfo, - IN TXBF_MAC_TABLE_ENTRY *pEntryTxBf, IN HT_BF_CAP *pTxBFCap, - IN BOOLEAN supportsETxBF) -{ - pEntryTxBf->bfState = READY_FOR_SNDG0; - pEntryTxBf->sndgMcs = 0; - pEntryTxBf->sndg0Snr0 = 0; - pEntryTxBf->sndg0Snr1 = 0; - pEntryTxBf->sndg0Snr2 = 0; - pEntryTxBf->sndg0Mcs = 0; - pEntryTxBf->noSndgCnt = 0; - pEntryTxBf->eTxBfEnCond = supportsETxBF ? pTxBfInfo->ucETxBfTxEn : 0; - pEntryTxBf->noSndgCntThrd = NO_SNDG_CNT_THRD; - pEntryTxBf->ndpSndgStreams = pTxBfInfo->ucTxPathNum; - /* If client supports ETxBf and ITxBF then give ETxBF priority over ITxBF */ - pEntryTxBf->iTxBfEn = - pEntryTxBf->eTxBfEnCond > 0 ? 0 : pTxBfInfo->ucITxBfTxEn; - - if (supportsETxBF) { - UCHAR ndpSndgStreams = pTxBfInfo->ucTxPathNum; - - if ((pTxBFCap->ExpComBF > 0) && - (!pTxBfInfo->cmmCfgETxBfNoncompress)) { - if ((pTxBFCap->ComSteerBFAntSup + 1) < - pTxBfInfo->ucTxPathNum) - ndpSndgStreams = pTxBFCap->ComSteerBFAntSup + 1; - } - - if ((pTxBFCap->ExpNoComBF > 0) && - (pTxBfInfo->cmmCfgETxBfNoncompress)) { - if ((pTxBFCap->NoComSteerBFAntSup + 1) < - pTxBfInfo->ucTxPathNum) - ndpSndgStreams = - pTxBFCap->NoComSteerBFAntSup + 1; - } - - pEntryTxBf->ndpSndgStreams = ndpSndgStreams; - } -} - -/* TxBF Fw Init */ -VOID mt_TxBFFwInit(IN PRTMP_ADAPTER pAd) -{ - if (pAd->CommonCfg.ETxBfEnCond) { -#if defined(MT_MAC) && (!defined(MT7636)) - /* Enable periodic sounding */ - mt_Trigger_Sounding_Packet(pAd, TRUE, 0, 4, 0, NULL); -#endif - } else { -#if defined(MT_MAC) && (!defined(MT7636)) - /* Disable periodic sounding */ - mt_Trigger_Sounding_Packet(pAd, FALSE, 0, 0, 0, NULL); -#endif - } -} - -/* clientSupportsETxBF - returns true if client supports compatible Sounding */ -BOOLEAN mt_clientSupportsETxBF(IN PRTMP_ADAPTER pAd, IN HT_BF_CAP *pTxBFCap, - IN BOOLEAN ETxBfNoncompress) -{ - BOOLEAN compCompat, noncompCompat; - - compCompat = - (pTxBFCap->ExpComBF > 0) && - /*(pTxBFCap->ComSteerBFAntSup+1 >= pAd->Antenna.field.TxPath) && */ - (ETxBfNoncompress == 0); - noncompCompat = (pTxBFCap->ExpNoComBF > 0) - /* && (pTxBFCap->NoComSteerBFAntSup+1 >= pAd->Antenna.field.TxPath)*/; - return pTxBFCap->RxNDPCapable == 1 && (compCompat || noncompCompat); -} - -#ifdef VHT_TXBF_SUPPORT -/* clientSupportsETxBF - returns true if client supports compatible Sounding */ -BOOLEAN mt_clientSupportsVhtETxBF(IN PRTMP_ADAPTER pAd, - IN VHT_CAP_INFO *pTxBFCap) -{ - BOOLEAN fgBfeeCap = FALSE; - -#ifdef CFG_SUPPORT_MU_MIMO - fgBfeeCap = pTxBFCap->bfee_cap_su || pTxBFCap->bfee_cap_mu; -#else - fgBfeeCap = pTxBFCap->bfee_cap_su; -#endif - - return fgBfeeCap; -} -#endif /* VHT_TXBF_SUPPORT */ - -/* Nr,Nc */ -UINT_8 g_ru2PfmuMemReq[4][4] = { { 0, 0, 0, 0 }, /* None,None,None,None */ - { 1, 1, 0, 0 }, /* 2//x1,2x2,2x3,2x4 */ - { 2, 4, 4, 0 }, /* 3//x1,3x2,3x3,3x4 */ - { 3, 5, 6, 0 } }; /* 4x1,4x2,4x3,4x4 */ - -UINT_8 g_aPfmuTimeOfMem20M[4] = { 0, 1, 2, 2 }; - -INT32 mt_AsicBfStaRecUpdate(RTMP_ADAPTER *pAd, UCHAR ucPhyMode, UCHAR ucBssIdx, - UCHAR ucWlanIdx) -{ - PMAC_TABLE_ENTRY pEntry; - UCHAR ucBFerMaxNr, ucBFeeMaxNr, ucBFerCurrNr; - UCHAR ucStatus = TRUE; - UCHAR ucPeerRxNumSupport; - UCHAR ucTxMCSSetdefined, ucTxRxMCSSetNotEqual, ucTxMaxNumSpatilStream; - BOOLEAN fgETxBfCap = FALSE; - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - HT_CAPABILITY_IE *ht_cap; - VHT_CAP_INFO vht_cap; - - pEntry = &pAd->MacTab.Content[ucWlanIdx]; - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - UINT8 band_idx = HcGetBandByWdev(pEntry->wdev); - - if (band_idx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif - - switch (pEntry->MaxHTPhyMode.field.MODE) { -#ifdef DOT11_VHT_AC - - case MODE_VHT: - fgETxBfCap = mt_WrapClientSupportsVhtETxBF( - pAd, &pEntry->vht_cap_ie.vht_cap); - fgETxBfCap &= wlan_config_get_etxbf(pEntry->wdev); - pEntry->rStaRecBf.fgETxBfCap = fgETxBfCap; - pEntry->rStaRecBf.fgSU_MU = FALSE; - pEntry->rStaRecBf.ucTxMode = 4; /* VHT mode */ - pEntry->rStaRecBf.ucCBW = pEntry->MaxHTPhyMode.field.BW; - - if (fgETxBfCap) { - mt_WrapSetVHTETxBFCap(pAd, pEntry->wdev, &vht_cap); -#ifdef CFG_SUPPORT_MU_MIMO - - if (vht_cap.bfer_cap_mu == TRUE) - pEntry->rStaRecBf.fgSU_MU = - pEntry->vht_cap_ie.vht_cap.bfee_cap_mu; - -#endif - pEntry->rStaRecBf.ucSoundingPhy = 1; /* OFDM */ - pEntry->rStaRecBf.ucNdpaRate = 9; /* 9 : OFDM 24M */ - pEntry->rStaRecBf.ucNdpRate = 0; /* 0 : MCS0 */ - - if (pEntry->rStaRecBf.fgSU_MU == TRUE) - pEntry->rStaRecBf.ucNdpRate = - 7; /* 7 : VHT MCS7 */ - - pEntry->rStaRecBf.ucReptPollRate = 9; /* 9 : OFDM 24M */ - ucBFerMaxNr = vht_cap.num_snd_dimension; - ucBFeeMaxNr = pEntry->vht_cap_ie.vht_cap.bfee_sts_cap; - ucBFerCurrNr = ucTxPath - 1; - pEntry->rStaRecBf.ucNr = (ucBFerMaxNr < ucBFeeMaxNr) ? - ucBFerMaxNr : - ucBFeeMaxNr; - pEntry->rStaRecBf.ucNr = - (pEntry->rStaRecBf.ucNr < ucBFerCurrNr) ? - pEntry->rStaRecBf.ucNr : - ucBFerCurrNr; - ucPeerRxNumSupport = - (pEntry->vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss2 != - 3) ? - 1 : - 0; - ucPeerRxNumSupport = - (pEntry->vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss3 != - 3) ? - 2 : - ucPeerRxNumSupport; - ucPeerRxNumSupport = - (pEntry->vht_cap_ie.mcs_set.rx_mcs_map.mcs_ss4 != - 3) ? - 3 : - ucPeerRxNumSupport; - pEntry->rStaRecBf.ucNc = ucPeerRxNumSupport; - pEntry->rStaRecBf.ucNc = - (pEntry->rStaRecBf.ucNc > - pEntry->rStaRecBf.ucNr) ? - pEntry->rStaRecBf.ucNr : - ucPeerRxNumSupport; - pEntry->rStaRecBf.uciBfDBW = - pEntry->MaxHTPhyMode.field.BW; - pEntry->rStaRecBf.uciBfNcol = pEntry->rStaRecBf.ucNc; - pEntry->rStaRecBf.uciBfNrow = ucTxPath - 1; - pEntry->rStaRecBf.uciBfTimeOut = 0x18; - } else { - pEntry->rStaRecBf.ucNr = ucTxPath - 1; - pEntry->rStaRecBf.uciBfDBW = - pEntry->MaxHTPhyMode.field.BW; - pEntry->rStaRecBf.uciBfNrow = ucTxPath - 1; - ucPeerRxNumSupport = - (pEntry->vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss2 != - 3) ? - 1 : - 0; - ucPeerRxNumSupport = - (pEntry->vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss3 != - 3) ? - 2 : - ucPeerRxNumSupport; - ucPeerRxNumSupport = - (pEntry->vht_cap_ie.mcs_set.tx_mcs_map.mcs_ss4 != - 3) ? - 3 : - ucPeerRxNumSupport; - pEntry->rStaRecBf.ucNc = ucPeerRxNumSupport; - pEntry->rStaRecBf.ucNc = - (pEntry->rStaRecBf.ucNc > - pEntry->rStaRecBf.ucNr) ? - pEntry->rStaRecBf.ucNr : - ucPeerRxNumSupport; - pEntry->rStaRecBf.uciBfNcol = ucPeerRxNumSupport; - - if ((pEntry->MaxHTPhyMode.field.BW <= BW_40) && - (pEntry->rStaRecBf.ucNc == 0)) - pEntry->rStaRecBf.uciBfTimeOut = 0x48; - else - pEntry->rStaRecBf.uciBfTimeOut = 0x18; - } - - break; -#endif /* DOT11_VHT_AC */ - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - fgETxBfCap = mt_WrapClientSupportsETxBF( - pAd, &pEntry->HTCapability.TxBFCap); - fgETxBfCap &= wlan_config_get_etxbf(pEntry->wdev); - pEntry->rStaRecBf.fgETxBfCap = fgETxBfCap; - pEntry->rStaRecBf.ucTxMode = 2; /* HT mode */ - pEntry->rStaRecBf.ucCBW = pEntry->MaxHTPhyMode.field.BW; - - if (fgETxBfCap) { - pEntry->rStaRecBf.fgSU_MU = 0; - ht_cap = (HT_CAPABILITY_IE *)wlan_operate_get_ht_cap( - pEntry->wdev); - ucBFerMaxNr = ht_cap->TxBFCap.ChanEstimation; - ucBFeeMaxNr = - pEntry->HTCapability.TxBFCap.ComSteerBFAntSup; - ucBFerCurrNr = ucTxPath - 1; - pEntry->rStaRecBf.ucNr = (ucBFerMaxNr < ucBFeeMaxNr) ? - ucBFerMaxNr : - ucBFeeMaxNr; - pEntry->rStaRecBf.ucNr = - (pEntry->rStaRecBf.ucNr < ucBFerCurrNr) ? - pEntry->rStaRecBf.ucNr : - ucBFerCurrNr; - pEntry->rStaRecBf.ucNdpRate = - pEntry->rStaRecBf.ucNr * 8; - ucPeerRxNumSupport = - (pEntry->HTCapability.MCSSet[1] > 0) ? 1 : 0; - ucPeerRxNumSupport = - (pEntry->HTCapability.MCSSet[2] > 0) ? - 2 : - ucPeerRxNumSupport; - ucPeerRxNumSupport = - (pEntry->HTCapability.MCSSet[3] > 0) ? - 3 : - ucPeerRxNumSupport; - pEntry->rStaRecBf.ucNc = ucPeerRxNumSupport; - pEntry->rStaRecBf.ucNc = - (pEntry->rStaRecBf.ucNc > - pEntry->rStaRecBf.ucNr) ? - pEntry->rStaRecBf.ucNr : - ucPeerRxNumSupport; - pEntry->rStaRecBf.uciBfDBW = - pEntry->MaxHTPhyMode.field.BW; - pEntry->rStaRecBf.uciBfNcol = pEntry->rStaRecBf.ucNc; - pEntry->rStaRecBf.uciBfNrow = ucTxPath - 1; - pEntry->rStaRecBf.uciBfTimeOut = 0x18; - } else { - pEntry->rStaRecBf.ucNr = ucTxPath - 1; - pEntry->rStaRecBf.uciBfDBW = - pEntry->MaxHTPhyMode.field.BW; - pEntry->rStaRecBf.uciBfNrow = ucTxPath - 1; - /* __________________________________________________________ */ - /* | |Tx MCS Set |Tx Rx MCS|Tx Max Num Spatial| */ - /* | Condition |Defined |Set N EQL|Streams Supported | */ - /* |________________|___________|_________|__________________| */ - /* |No Tx MCS set is| | | | */ - /* |defined | 0 | 0 | 0 | */ - /* |________________|___________|_________|__________________| */ - /* |The Tx MCS set | | | | */ - /* |defined to be | | | | */ - /* |equal to the Rx | 1 | 0 | 0 | */ - /* |MCS set | | | | */ - /* |________________|___________|_________|__________________| */ - /* |The Tx MCS set | | |Set to N for N+1 | */ - /* |may differ from | | |spatial stream | */ - /* |The Rx MCS set | 1 | 1 | | */ - /* |________________|___________|_________|__________________| */ - ucTxMCSSetdefined = ((pEntry->HTCapability.MCSSet[12] & - TX_MCS_SET_DEFINED) >> - TX_MCS_SET_DEFINED_OFFSET); - ucTxRxMCSSetNotEqual = - ((pEntry->HTCapability.MCSSet[12] & - TX_RX_MCS_SET_N_EQUAL) >> - TX_RX_MCS_SET_N_EQUAL_OFFSET); - ucTxMaxNumSpatilStream = - ((pEntry->HTCapability.MCSSet[12] & - TX_MAX_NUM_SPATIAL_STREAMS_SUPPORTED) >> - TX_MAX_NUM_SPATIAL_STREAMS_SUPPORTED_OFFSET); - ucPeerRxNumSupport = - (pEntry->HTCapability.MCSSet[1] > 0) ? 1 : 0; - ucPeerRxNumSupport = - (pEntry->HTCapability.MCSSet[2] > 0) ? - 2 : - ucPeerRxNumSupport; - ucPeerRxNumSupport = - (pEntry->HTCapability.MCSSet[3] > 0) ? - 3 : - ucPeerRxNumSupport; - - if ((ucTxMCSSetdefined == 1) && - (ucTxRxMCSSetNotEqual == 1)) - ucPeerRxNumSupport = ucTxMaxNumSpatilStream; - - pEntry->rStaRecBf.ucNc = ucPeerRxNumSupport; - pEntry->rStaRecBf.ucNc = - (pEntry->rStaRecBf.ucNc > - pEntry->rStaRecBf.ucNr) ? - pEntry->rStaRecBf.ucNr : - ucPeerRxNumSupport; - pEntry->rStaRecBf.uciBfNcol = ucPeerRxNumSupport; - - if ((pEntry->MaxHTPhyMode.field.BW <= BW_40) && - (pEntry->rStaRecBf.ucNc == 0)) - pEntry->rStaRecBf.uciBfTimeOut = 0x48; - else - pEntry->rStaRecBf.uciBfTimeOut = 0x18; - } - - break; - - case MODE_OFDM: - case MODE_CCK: - pEntry->rStaRecBf.fgETxBfCap = FALSE; - pEntry->rStaRecBf.ucTxMode = 1; /* legacy mode */ - pEntry->rStaRecBf.ucNc = 0; - pEntry->rStaRecBf.ucNr = ucTxPath - 1; - pEntry->rStaRecBf.ucCBW = pEntry->MaxHTPhyMode.field.BW; - pEntry->rStaRecBf.uciBfTimeOut = 0x18; - pEntry->rStaRecBf.uciBfDBW = pEntry->MaxHTPhyMode.field.BW; - pEntry->rStaRecBf.uciBfNcol = 0; - pEntry->rStaRecBf.uciBfNrow = ucTxPath - 1; - break; - - default: - ucStatus = FALSE; - break; - } - - /* Once find the phy mode is incorrect, return FALSE alarm */ - if (ucStatus == FALSE) - return ucStatus; - - if (pEntry->rStaRecBf.fgETxBfCap == TRUE) { - if (pEntry->rStaRecBf.ucNr == (ucTxPath - 1)) - pEntry->rStaRecBf.ucMemRequire20M = - g_ru2PfmuMemReq[pEntry->rStaRecBf.ucNr] - [pEntry->rStaRecBf.ucNc]; - else - pEntry->rStaRecBf.ucMemRequire20M = - g_ru2PfmuMemReq[ucTxPath - 1] - [pEntry->rStaRecBf.ucNc]; - } else - pEntry->rStaRecBf.ucMemRequire20M = - g_ru2PfmuMemReq[pEntry->rStaRecBf.ucNr] - [pEntry->rStaRecBf.ucNc]; - - pEntry->rStaRecBf.ucTotMemRequire = - pEntry->rStaRecBf.ucMemRequire20M * - g_aPfmuTimeOfMem20M[pEntry->rStaRecBf.ucCBW]; - pEntry->rStaRecBf.ucMemRow0 = 0; - pEntry->rStaRecBf.ucMemCol0 = 0; - pEntry->rStaRecBf.ucMemRow1 = 0; - pEntry->rStaRecBf.ucMemCol1 = 0; - pEntry->rStaRecBf.ucMemRow2 = 0; - pEntry->rStaRecBf.ucMemCol2 = 0; - pEntry->rStaRecBf.ucMemRow3 = 0; - pEntry->rStaRecBf.ucMemCol3 = 0; - pEntry->rStaRecBf.u2SmartAnt = 0; - /* pEntry->rStaRecBf.ucSEIdx = 24; */ -#ifdef TXBF_DYNAMIC_DISABLE - pEntry->rStaRecBf.ucAutoSoundingCtrl = - pAd->CommonCfg.ucAutoSoundingCtrl; -#endif /* TXBF_DYNAMIC_DISABLE */ - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("====================== BF StaRec Info =====================\n")); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("fgSU_MU =%d\n", pEntry->rStaRecBf.fgSU_MU)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("fgETxBfCap =%d\n", pEntry->rStaRecBf.fgETxBfCap)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucNdpaRate =%d\n", pEntry->rStaRecBf.ucNdpaRate)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucNdpRate =%d\n", pEntry->rStaRecBf.ucNdpRate)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucReptPollRate =%d\n", pEntry->rStaRecBf.ucReptPollRate)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucTxMode =%d\n", pEntry->rStaRecBf.ucTxMode)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucNc =%d\n", pEntry->rStaRecBf.ucNc)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucNr =%d\n", pEntry->rStaRecBf.ucNr)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucCBW =%d\n", pEntry->rStaRecBf.ucCBW)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucTotMemRequire=%d\n", pEntry->rStaRecBf.ucTotMemRequire)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemRequire20M=%d\n", pEntry->rStaRecBf.ucMemRequire20M)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemRow0 =%d\n", pEntry->rStaRecBf.ucMemRow0)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemCol0 =%d\n", pEntry->rStaRecBf.ucMemCol0)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemRow1 =%d\n", pEntry->rStaRecBf.ucMemRow1)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemCol1 =%d\n", pEntry->rStaRecBf.ucMemCol1)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemRow2 =%d\n", pEntry->rStaRecBf.ucMemRow2)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemCol2 =%d\n", pEntry->rStaRecBf.ucMemCol2)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemRow3 =%d\n", pEntry->rStaRecBf.ucMemRow3)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucMemCol3 =%d\n", pEntry->rStaRecBf.ucMemCol3)); -#ifdef TXBF_DYNAMIC_DISABLE - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("ucAutoSoundingCtrl=%d\n", - pEntry->rStaRecBf.ucAutoSoundingCtrl)); -#endif /* TXBF_DYNAMIC_DISABLE */ - - if (fgETxBfCap == 0) { - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("uciBfTimeOut =0x%x\n", - pEntry->rStaRecBf.uciBfTimeOut)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("uciBfDBW =%d\n", pEntry->rStaRecBf.uciBfDBW)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("uciBfNcol =%d\n", pEntry->rStaRecBf.uciBfNcol)); - MTWF_LOG(DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("uciBfNrow =%d\n", pEntry->rStaRecBf.uciBfNrow)); - } - - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("===========================================================\n")); - return ucStatus; -} - -INT32 mt_AsicBfStaRecRelease(RTMP_ADAPTER *pAd, UCHAR ucBssIdx, UINT8 ucWlanIdx) -{ - PMAC_TABLE_ENTRY pEntry; - UCHAR ucStatus = TRUE; - - pEntry = &pAd->MacTab.Content[ucWlanIdx]; - /* Clear BF StaRec */ - os_zero_mem(&pEntry->rStaRecBf, sizeof(TXBF_PFMU_STA_INFO)); - pEntry->rStaRecBf.u2PfmuId = 0xFFFF; - { - STA_REC_CFG_T StaCfg; - - os_zero_mem(&StaCfg, sizeof(STA_REC_CFG_T)); - - if (!pEntry->wdev) { - ASSERT(pEntry->wdev); - return -1; - } - - StaCfg.MuarIdx = pEntry->wdev->OmacIdx; - StaCfg.ConnectionState = TRUE; - StaCfg.ConnectionType = 0; - StaCfg.u4EnableFeature = (1 << STA_REC_BF); - StaCfg.ucBssIndex = ucBssIdx; - StaCfg.ucWlanIdx = ucWlanIdx; - StaCfg.pEntry = pEntry; - - if (CmdExtStaRecUpdate(pAd, StaCfg) != STATUS_TRUE) { - ucStatus = FALSE; - MTWF_LOG( - DBG_CAT_HW, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("Something wrong in the BF STA Rec update!!\n")); - } - } - return ucStatus; -} - -VOID mt_AsicClientBfCap(RTMP_ADAPTER *pAd, PMAC_TABLE_ENTRY pEntry) -{ -#ifdef APCLI_SUPPORT - - if (pAd->fgApClientMode == TRUE) { - /* Force the Pfmu ID of the other repeater cli to be the same with ApCli */ - AsicTxBfApClientCluster(pAd, pEntry->wcid, - pAd->ApCli_CmmWlanId); - } - -#endif /* APCLI_SUPPORT */ -} - -/* MlmeTxBfAllowed - returns true if ETxBF or ITxBF is supported and pTxRate is a valid BF mode */ -BOOLEAN MlmeTxBfAllowed(IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, - IN RTMP_RA_LEGACY_TB *pTxRate) -{ - /* ETxBF */ - if ((pEntry->eTxBfEnCond > 0) && - (pTxRate->Mode == MODE_HTMIX || pTxRate->Mode == MODE_HTGREENFIELD)) - return TRUE; - - /* ITxBF */ - if (pEntry->iTxBfEn && pTxRate->CurrMCS < 16 && - pTxRate->Mode != MODE_CCK) - return TRUE; - - return FALSE; -} - -#if defined(MT_MAC) && (!defined(MT7636)) -VOID TxBfProfileTag_PfmuIdx(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN UCHAR ucProfileID) -{ - prPfmuTag1->rField.ucProfileID = ucProfileID; -} - -VOID TxBfProfileTag_TxBfType(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucTxBf) -{ - prPfmuTag1->rField.ucTxBf = ucTxBf; -} - -VOID TxBfProfileTag_DBW(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucBw) -{ - prPfmuTag1->rField.ucDBW = ucBw; -} - -VOID TxBfProfileTag_SuMu(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucSuMu) -{ - prPfmuTag1->rField.ucSU_MU = ucSuMu; -} - -VOID TxBfProfileTag_InValid(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN UCHAR InvalidFlg) -{ - prPfmuTag1->rField.ucInvalidProf = InvalidFlg; -} - -VOID TxBfProfileTag_Mem(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN PUCHAR pMemAddrColIdx, IN PUCHAR pMemAddrRowIdx) -{ - prPfmuTag1->rField.ucMemAddr1ColIdx = pMemAddrColIdx[0]; - prPfmuTag1->rField.ucMemAddr1RowIdx = pMemAddrRowIdx[0]; - prPfmuTag1->rField.ucMemAddr2ColIdx = pMemAddrColIdx[1]; - prPfmuTag1->rField.ucMemAddr2RowIdx = pMemAddrRowIdx[1] & 0x1F; - prPfmuTag1->rField.ucMemAddr2RowIdxMsb = pMemAddrRowIdx[1] >> 5; - prPfmuTag1->rField.ucMemAddr3ColIdx = pMemAddrColIdx[2]; - prPfmuTag1->rField.ucMemAddr3RowIdx = pMemAddrRowIdx[2]; - prPfmuTag1->rField.ucMemAddr4ColIdx = pMemAddrColIdx[3]; - prPfmuTag1->rField.ucMemAddr4RowIdx = pMemAddrRowIdx[3]; -} - -VOID TxBfProfileTag_Matrix(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucNrow, - IN UCHAR ucNcol, IN UCHAR ucNgroup, IN UCHAR ucLM, - IN UCHAR ucCodeBook, IN UCHAR ucHtcExist) -{ - prPfmuTag1->rField.ucNrow = ucNrow; - prPfmuTag1->rField.ucNcol = ucNcol; - prPfmuTag1->rField.ucNgroup = ucNgroup; - prPfmuTag1->rField.ucLM = ucLM; - prPfmuTag1->rField.ucCodeBook = ucCodeBook; - prPfmuTag1->rField.ucHtcExist = ucHtcExist; -} - -VOID TxBfProfileTag_SNR(IN P_PFMU_PROFILE_TAG1 prPfmuTag1, IN UCHAR ucSNR_STS0, - IN UCHAR ucSNR_STS1, IN UCHAR ucSNR_STS2, - IN UCHAR ucSNR_STS3) -{ - prPfmuTag1->rField.ucSNR_STS0 = ucSNR_STS0; - prPfmuTag1->rField.ucSNR_STS1 = ucSNR_STS1; - prPfmuTag1->rField.ucSNR_STS2 = ucSNR_STS2; - prPfmuTag1->rField.ucSNR_STS3 = ucSNR_STS3; -} - -VOID TxBfProfileTag_SmtAnt(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN USHORT u2SmartAnt) -{ - prPfmuTag2->rField.u2SmartAnt = u2SmartAnt; -} - -VOID TxBfProfileTag_SeIdx(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, IN UCHAR ucSEIdx) -{ - prPfmuTag2->rField.ucSEIdx = ucSEIdx; -} - -VOID TxBfProfileTag_RmsdThd(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR ucRMSDThd) -{ - prPfmuTag2->rField.ucRMSDThd = ucRMSDThd; -} - -VOID TxBfProfileTag_McsThd(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN PUCHAR pMCSThLSS, IN PUCHAR pMCSThSSS) -{ - prPfmuTag2->rField.ucMCSThL1SS = pMCSThLSS[0]; - prPfmuTag2->rField.ucMCSThS1SS = pMCSThSSS[0]; - prPfmuTag2->rField.ucMCSThL2SS = pMCSThLSS[1]; - prPfmuTag2->rField.ucMCSThS2SS = pMCSThSSS[1]; - prPfmuTag2->rField.ucMCSThL3SS = pMCSThLSS[2]; - prPfmuTag2->rField.ucMCSThS3SS = pMCSThSSS[2]; -} - -VOID TxBfProfileTag_TimeOut(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR uciBfTimeOut) -{ - prPfmuTag2->rField.uciBfTimeOut = uciBfTimeOut; -} - -VOID TxBfProfileTag_DesiredBW(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR uciBfDBW) -{ - prPfmuTag2->rField.uciBfDBW = uciBfDBW; -} - -VOID TxBfProfileTag_DesiredNc(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR uciBfNcol) -{ - prPfmuTag2->rField.uciBfNcol = uciBfNcol; -} - -VOID TxBfProfileTag_DesiredNr(IN P_PFMU_PROFILE_TAG2 prPfmuTag2, - IN UCHAR uciBfNrow) -{ - prPfmuTag2->rField.uciBfNrow = uciBfNrow; -} - -INT TxBfProfileTagRead(IN PRTMP_ADAPTER pAd, IN UCHAR PfmuIdx, - IN BOOLEAN fgBFer) -{ - BOOLEAN fgStatus = FALSE; - - if (CmdETxBfPfmuProfileTagRead(pAd, PfmuIdx, fgBFer) == STATUS_TRUE) - fgStatus = TRUE; - - return fgStatus; -} - -INT TxBfProfileTagWrite(IN PRTMP_ADAPTER pAd, IN P_PFMU_PROFILE_TAG1 prPfmuTag1, - IN P_PFMU_PROFILE_TAG2 prPfmuTag2, IN UCHAR profileIdx) -{ - BOOLEAN fgStatus = FALSE; - - if (CmdETxBfPfmuProfileTagWrite(pAd, (PUCHAR)(prPfmuTag1), - (PUCHAR)(prPfmuTag2), - profileIdx) == STATUS_TRUE) - fgStatus = TRUE; - - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile Tage1 Info ========================================\n" - "Row data0 = 0x%x, Row data1 = 0x%x, Row data2 = 0x%x, Row data3 = 0x%x\n\n" - "PFMU ID = %d Invalid status = %d\n" - "iBf/eBf = %d\n\n" - "DBW = %d\n" - "SU/MU = %d\n" - "RMSD = %d\n" - "nrow=%d, ncol=%d, ng=%d, LM=%d, CodeBook=%d, HtcExist=%d\n\n" - "Mem Col1 = %d, Mem Row1 = %d, Mem Col2 = %d, Mem Row2 = %d\n" - "Mem Col3 = %d, Mem Row3 = %d, Mem Col4 = %d, Mem Row4 = %d\n\n" - "STS0_SNR =0x%x, STS1_SNR=0x%x, STS2_SNR=0x%x, STS3_SNR=0x%x\n\n" - "iBf LNA Idx=0x%x\n" - "==============================================================================================\n", - prPfmuTag1->au4RawData[0], prPfmuTag1->au4RawData[1], - prPfmuTag1->au4RawData[2], prPfmuTag1->au4RawData[3], - prPfmuTag1->rField.ucProfileID, - prPfmuTag1->rField.ucInvalidProf, prPfmuTag1->rField.ucTxBf, - prPfmuTag1->rField.ucDBW, prPfmuTag1->rField.ucSU_MU, - prPfmuTag1->rField.ucRMSD, prPfmuTag1->rField.ucNrow, - prPfmuTag1->rField.ucNcol, prPfmuTag1->rField.ucNgroup, - prPfmuTag1->rField.ucLM, prPfmuTag1->rField.ucCodeBook, - prPfmuTag1->rField.ucHtcExist, - prPfmuTag1->rField.ucMemAddr1ColIdx, - prPfmuTag1->rField.ucMemAddr1RowIdx, - prPfmuTag1->rField.ucMemAddr2ColIdx, - (prPfmuTag1->rField.ucMemAddr2RowIdx | - (prPfmuTag1->rField.ucMemAddr2RowIdxMsb << 5)), - prPfmuTag1->rField.ucMemAddr3ColIdx, - prPfmuTag1->rField.ucMemAddr3RowIdx, - prPfmuTag1->rField.ucMemAddr4ColIdx, - prPfmuTag1->rField.ucMemAddr4RowIdx, - prPfmuTag1->rField.ucSNR_STS0, prPfmuTag1->rField.ucSNR_STS1, - prPfmuTag1->rField.ucSNR_STS2, prPfmuTag1->rField.ucSNR_STS3, - prPfmuTag1->rField.ucIBfLnaIdx)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile Tage2 Info ========================================\n" - "Row data0 = 0x%x, Row data1 = 0x%x, Row data2 = 0x%x\n\n" - "Smart antenna ID = 0x%x, SE index = %d\n" - "RMSD threshold = %d\n" - "MCS L1SS thd = %d, S1SS thd = %d, L2SS thd = %d, S2SS thd = %d, L3SS thd = %d, S3SS thd = %d\n" - "Time out = 0x%x\n" - "Desired BW = %d, Desired Ncol = %d, Desired Nrow = %d\n" - "==============================================================================================\n", - prPfmuTag2->au4RawData[0], prPfmuTag2->au4RawData[1], - prPfmuTag2->au4RawData[2], prPfmuTag2->rField.u2SmartAnt, - prPfmuTag2->rField.ucSEIdx, prPfmuTag2->rField.ucRMSDThd, - prPfmuTag2->rField.ucMCSThL1SS, prPfmuTag2->rField.ucMCSThS1SS, - prPfmuTag2->rField.ucMCSThL2SS, prPfmuTag2->rField.ucMCSThS2SS, - prPfmuTag2->rField.ucMCSThL3SS, prPfmuTag2->rField.ucMCSThS3SS, - prPfmuTag2->rField.uciBfTimeOut, prPfmuTag2->rField.uciBfDBW, - prPfmuTag2->rField.uciBfNcol, prPfmuTag2->rField.uciBfNrow)); - return fgStatus; -} - -VOID TxBfProfileTagPrint(IN PRTMP_ADAPTER pAd, IN BOOLEAN fgBFer, - IN PUCHAR pBuf) -{ - P_PFMU_PROFILE_TAG1 prPfmuTag1; - P_PFMU_PROFILE_TAG2 prPfmuTag2; - - prPfmuTag1 = (P_PFMU_PROFILE_TAG1)pBuf; - prPfmuTag2 = (P_PFMU_PROFILE_TAG2)(pBuf + sizeof(PFMU_PROFILE_TAG1)); -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((char *)prPfmuTag1, sizeof(PFMU_PROFILE_TAG1)); - RTMPEndianChange((char *)prPfmuTag2, sizeof(PFMU_PROFILE_TAG2)); -#endif - NdisCopyMemory(&pAd->rPfmuTag1, prPfmuTag1, sizeof(PFMU_PROFILE_TAG1)); - NdisCopyMemory(&pAd->rPfmuTag2, prPfmuTag2, sizeof(PFMU_PROFILE_TAG2)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile Tage1 Info ========================================\n" - "Row data0 = 0x%x, Row data1 = 0x%x, Row data2 = 0x%x, Row data3 = 0x%x\n\n" - "PFMU ID = %d Invalid status = %d\n" - "iBf/eBf = %d\n\n" - "DBW = %d\n" - "SU/MU = %d\n" - "RMSD = %d\n" - "nrow=%d, ncol=%d, ng=%d, LM=%d, CodeBook=%d, HtcExist=%d\n\n" - "Mem Col1 = %d, Mem Row1 = %d, Mem Col2 = %d, Mem Row2 = %d\n" - "Mem Col3 = %d, Mem Row3 = %d, Mem Col4 = %d, Mem Row4 = %d\n\n" - "STS0_SNR =0x%x, STS1_SNR=0x%x, STS2_SNR=0x%x, STS3_SNR=0x%x\n\n" - "iBf LNA Idx=0x%x\n" - "==============================================================================================\n", - prPfmuTag1->au4RawData[0], prPfmuTag1->au4RawData[1], - prPfmuTag1->au4RawData[2], prPfmuTag1->au4RawData[3], - prPfmuTag1->rField.ucProfileID, - prPfmuTag1->rField.ucInvalidProf, prPfmuTag1->rField.ucTxBf, - prPfmuTag1->rField.ucDBW, prPfmuTag1->rField.ucSU_MU, - prPfmuTag1->rField.ucRMSD, prPfmuTag1->rField.ucNrow, - prPfmuTag1->rField.ucNcol, prPfmuTag1->rField.ucNgroup, - prPfmuTag1->rField.ucLM, prPfmuTag1->rField.ucCodeBook, - prPfmuTag1->rField.ucHtcExist, - prPfmuTag1->rField.ucMemAddr1ColIdx, - prPfmuTag1->rField.ucMemAddr1RowIdx, - prPfmuTag1->rField.ucMemAddr2ColIdx, - (prPfmuTag1->rField.ucMemAddr2RowIdx | - (prPfmuTag1->rField.ucMemAddr2RowIdxMsb << 5)), - prPfmuTag1->rField.ucMemAddr3ColIdx, - prPfmuTag1->rField.ucMemAddr3RowIdx, - prPfmuTag1->rField.ucMemAddr4ColIdx, - prPfmuTag1->rField.ucMemAddr4RowIdx, - prPfmuTag1->rField.ucSNR_STS0, prPfmuTag1->rField.ucSNR_STS1, - prPfmuTag1->rField.ucSNR_STS2, prPfmuTag1->rField.ucSNR_STS3, - prPfmuTag1->rField.ucIBfLnaIdx)); - - if (fgBFer == TRUE) { - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile Tage2 Info ========================================\n" - "Row data0 = 0x%x, Row data1 = 0x%x, Row data2 = 0x%x\n\n" - "Smart antenna ID = 0x%x, SE index = %d\n" - "RMSD threshold = %d\n" - "MCS L1SS thd = %d, S1SS thd = %d, L2SS thd = %d, S2SS thd = %d, L3SS thd = %d, S3SS thd = %d\n" - "Time out = 0x%x\n" - "Desired BW = %d, Desired Ncol = %d, Desired Nrow = %d\n" - "==============================================================================================\n", - prPfmuTag2->au4RawData[0], prPfmuTag2->au4RawData[1], - prPfmuTag2->au4RawData[2], - prPfmuTag2->rField.u2SmartAnt, - prPfmuTag2->rField.ucSEIdx, - prPfmuTag2->rField.ucRMSDThd, - prPfmuTag2->rField.ucMCSThL1SS, - prPfmuTag2->rField.ucMCSThS1SS, - prPfmuTag2->rField.ucMCSThL2SS, - prPfmuTag2->rField.ucMCSThS2SS, - prPfmuTag2->rField.ucMCSThL3SS, - prPfmuTag2->rField.ucMCSThS3SS, - prPfmuTag2->rField.uciBfTimeOut, - prPfmuTag2->rField.uciBfDBW, - prPfmuTag2->rField.uciBfNcol, - prPfmuTag2->rField.uciBfNrow)); - } -} - -INT TxBfProfilePnRead(IN PRTMP_ADAPTER pAd, IN UCHAR profileIdx) -{ - BOOLEAN fgStatus = FALSE; - - if (CmdETxBfPfmuProfilePnRead(pAd, profileIdx) == STATUS_TRUE) - fgStatus = TRUE; - - return fgStatus; -} - -INT TxBfProfilePnWrite(IN PRTMP_ADAPTER pAd, IN UCHAR PfmuIdx, IN UCHAR ucBw, - IN PUCHAR pProfileData) -{ - BOOLEAN fgStatus = FALSE; - - if (CmdETxBfPfmuProfilePnWrite(pAd, PfmuIdx, ucBw, pProfileData) == - STATUS_TRUE) - fgStatus = TRUE; - - return fgStatus; -} - -VOID TxBfProfilePnPrint(IN UCHAR ucBw, IN PUCHAR pBuf) -{ - P_PFMU_PN_DBW20M prPfmuPn20M; - P_PFMU_PN_DBW40M prPfmuPn40M; - P_PFMU_PN_DBW80M prPfmuPn80M; - P_PFMU_PN_DBW80_80M prPfmuPn160M; - - switch (ucBw) { - case P_DBW20M: - prPfmuPn20M = (P_PFMU_PN_DBW20M)pBuf; -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)prPfmuPn20M, sizeof(PFMU_PN_DBW20M)); -#endif - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile PN Info 20M ========================================\n" - "1STS_TX0 = 0x%x, 1STS_TX1 = 0x%x, 1STS_TX2 = 0x%x, 1STS_TX3 = 0x%x\n" - "2STS_TX0 = 0x%x, 2STS_TX1 = 0x%x, 2STS_TX2 = 0x%x, 2STS_TX3 = 0x%x\n" - "3STS_TX0 = 0x%x, 3STS_TX1 = 0x%x, 3STS_TX2 = 0x%x, 3STS_TX3 = 0x%x\n" - "===============================================================================================\n", - prPfmuPn20M->rField.u2DBW20_1STS_Tx0, - prPfmuPn20M->rField.u2DBW20_1STS_Tx1, - prPfmuPn20M->rField.u2DBW20_1STS_Tx2 | - (prPfmuPn20M->rField.u2DBW20_1STS_Tx2Msb - << 11), - prPfmuPn20M->rField.u2DBW20_1STS_Tx3, - prPfmuPn20M->rField.u2DBW20_2STS_Tx0, - prPfmuPn20M->rField.u2DBW20_2STS_Tx1 | - (prPfmuPn20M->rField.u2DBW20_2STS_Tx1Msb - << 11), - prPfmuPn20M->rField.u2DBW20_2STS_Tx2, - prPfmuPn20M->rField.u2DBW20_2STS_Tx3, - prPfmuPn20M->rField.u2DBW20_3STS_Tx0, - prPfmuPn20M->rField.u2DBW20_3STS_Tx1, - prPfmuPn20M->rField.u2DBW20_3STS_Tx2, - prPfmuPn20M->rField.u2DBW20_3STS_Tx3 | - (prPfmuPn20M->rField.u2DBW20_3STS_Tx3Msb - << 11))); - break; - - case P_DBW40M: - prPfmuPn40M = (P_PFMU_PN_DBW40M)pBuf; -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)prPfmuPn40M, sizeof(PFMU_PN_DBW40M)); -#endif - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile PN Info 40M ========================================\n" - "1STS_TX0 = 0x%x, 1STS_TX1 = 0x%x, 1STS_TX2 = 0x%x, 1STS_TX3 = 0x%x\n" - "2STS_TX0 = 0x%x, 2STS_TX1 = 0x%x, 2STS_TX2 = 0x%x, 2STS_TX3 = 0x%x\n" - "3STS_TX0 = 0x%x, 3STS_TX1 = 0x%x, 3STS_TX2 = 0x%x, 3STS_TX3 = 0x%x\n" - "===============================================================================================\n", - prPfmuPn40M->rField.u2DBW40_1STS_Tx0, - prPfmuPn40M->rField.u2DBW40_1STS_Tx1, - prPfmuPn40M->rField.u2DBW40_1STS_Tx2 | - (prPfmuPn40M->rField.u2DBW40_1STS_Tx2Msb - << 11), - prPfmuPn40M->rField.u2DBW40_1STS_Tx3, - prPfmuPn40M->rField.u2DBW40_2STS_Tx0, - prPfmuPn40M->rField.u2DBW40_2STS_Tx1 | - (prPfmuPn40M->rField.u2DBW40_2STS_Tx1Msb - << 11), - prPfmuPn40M->rField.u2DBW40_2STS_Tx2, - prPfmuPn40M->rField.u2DBW40_2STS_Tx3, - prPfmuPn40M->rField.u2DBW40_3STS_Tx0, - prPfmuPn40M->rField.u2DBW40_3STS_Tx1, - prPfmuPn40M->rField.u2DBW40_3STS_Tx2, - prPfmuPn40M->rField.u2DBW40_3STS_Tx3 | - (prPfmuPn40M->rField.u2DBW40_3STS_Tx3Msb - << 11))); - break; - - case P_DBW80M: - prPfmuPn80M = (P_PFMU_PN_DBW80M)pBuf; -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)prPfmuPn80M, sizeof(PFMU_PN_DBW80M)); -#endif - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile PN Info 80M ========================================\n" - "1STS_TX0 = 0x%x, 1STS_TX1 = 0x%x, 1STS_TX2 = 0x%x, 1STS_TX3 = 0x%x\n" - "2STS_TX0 = 0x%x, 2STS_TX1 = 0x%x, 2STS_TX2 = 0x%x, 2STS_TX3 = 0x%x\n" - "3STS_TX0 = 0x%x, 3STS_TX1 = 0x%x, 3STS_TX2 = 0x%x, 3STS_TX3 = 0x%x\n" - "===============================================================================================\n", - prPfmuPn80M->rField.u2DBW80_1STS_Tx0, - prPfmuPn80M->rField.u2DBW80_1STS_Tx1, - prPfmuPn80M->rField.u2DBW80_1STS_Tx2 | - (prPfmuPn80M->rField.u2DBW80_1STS_Tx2Msb - << 11), - prPfmuPn80M->rField.u2DBW80_1STS_Tx3, - prPfmuPn80M->rField.u2DBW80_2STS_Tx0, - prPfmuPn80M->rField.u2DBW80_2STS_Tx1 | - (prPfmuPn80M->rField.u2DBW80_2STS_Tx1Msb - << 11), - prPfmuPn80M->rField.u2DBW80_2STS_Tx2, - prPfmuPn80M->rField.u2DBW80_2STS_Tx3, - prPfmuPn80M->rField.u2DBW80_3STS_Tx0, - prPfmuPn80M->rField.u2DBW80_3STS_Tx1, - prPfmuPn80M->rField.u2DBW80_3STS_Tx2, - prPfmuPn80M->rField.u2DBW80_3STS_Tx3 | - (prPfmuPn80M->rField.u2DBW80_3STS_Tx3Msb - << 11))); - break; - - case P_DBW160M: - prPfmuPn160M = (P_PFMU_PN_DBW80_80M)pBuf; -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)prPfmuPn160M, - sizeof(PFMU_PN_DBW80_80M)); -#endif - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile PN Info 80M ========================================\n" - "1STS_TX0 = 0x%x, 1STS_TX1 = 0x%x\n" - "2STS_TX0 = 0x%x, 2STS_TX1 = 0x%x\n" - "===============================================================================================\n", - prPfmuPn160M->rField.u2DBW160_1STS_Tx0, - prPfmuPn160M->rField.u2DBW160_1STS_Tx1, - prPfmuPn160M->rField.u2DBW160_2STS_Tx0 | - (prPfmuPn160M->rField.u2DBW160_2STS_Tx0Msb - << 11), - prPfmuPn160M->rField.u2DBW160_2STS_Tx1)); - break; - - default: - break; - } -} - -/* SC_TABLE_ENTRY g_arSubCarIdxBwTbl[4]={{228, 255, 1, 28}, {198, 254, 2, 58}, {134, 254, 2, 122}, {134, 254, 2, 122}}; */ - -INT TxBfProfileDataRead(IN PRTMP_ADAPTER pAd, IN UCHAR profileIdx, - IN BOOLEAN fgBFer, IN USHORT subCarrIdx) -{ - BOOLEAN fgStatus = FALSE; - - if (CmdETxBfPfmuProfileDataRead(pAd, profileIdx, fgBFer, subCarrIdx) == - STATUS_TRUE) - fgStatus = TRUE; - - return fgStatus; -} - -INT TxBfProfileDataWrite(IN PRTMP_ADAPTER pAd, IN UCHAR profileIdx, - IN USHORT subCarrIdx, IN PUCHAR pProfileData) -{ - BOOLEAN fgStatus = FALSE; - - if (CmdETxBfPfmuProfileDataWrite(pAd, profileIdx, subCarrIdx, - pProfileData) == STATUS_TRUE) - fgStatus = TRUE; - - return fgStatus; -} - -INT TxBfQdRead(IN PRTMP_ADAPTER pAd, IN INT8 subCarrIdx) -{ - BOOLEAN fgStatus = FALSE; - - if (CmdETxBfQdRead(pAd, subCarrIdx) == STATUS_TRUE) { - fgStatus = TRUE; - } - - return fgStatus; -} - -#ifdef CONFIG_ATE -BOOLEAN TxBfProfileDataFormatTranslate(PRTMP_ADAPTER pAd, PUCHAR pucDataIn, - P_PFMU_HALF_DATA pPfmuHalfData) -{ - struct _ATE_CTRL *ATECtrl = &pAd->ATECtrl; - UCHAR control_band_idx = ATECtrl->control_band_idx; - UINT32 u4SubCarrId, u4AnglePh11, u4AnglePh21, u4AnglePh31, u4AnglePh41; - INT16 i2Phi11, i2Phi21, i2Phi31; - UINT16 u2InIdx; - UCHAR ucLoop; - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - - MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s :: Band index = %d\n", __func__, control_band_idx)); - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - if (control_band_idx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif - - for (ucLoop = 0; ucLoop < 64; ucLoop++) { - u2InIdx = ucLoop * 20; - /* Subcarrier */ - NdisMoveMemory(&u4SubCarrId, &pucDataIn[u2InIdx], 4); - u4SubCarrId = PKTL_TRAN_TO_HOST(u4SubCarrId); - - if (u4SubCarrId < 32) - u4SubCarrId += 224; - else - u4SubCarrId -= 32; - - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, */ - /* ("%s:: val: %u\n",__FUNCTION__, u4SubCarrId)); */ - /* Angle Ph11 */ - NdisMoveMemory(&u4AnglePh11, &pucDataIn[u2InIdx + 4], 4); - u4AnglePh11 = PKTL_TRAN_TO_HOST(u4AnglePh11); - /* Angle Ph21 */ - NdisMoveMemory(&u4AnglePh21, &pucDataIn[u2InIdx + 8], 4); - u4AnglePh21 = PKTL_TRAN_TO_HOST(u4AnglePh21); - /* Angle Ph31 */ - NdisMoveMemory(&u4AnglePh31, &pucDataIn[u2InIdx + 12], 4); - u4AnglePh31 = PKTL_TRAN_TO_HOST(u4AnglePh31); - /* Angle Ph41 */ - NdisMoveMemory(&u4AnglePh41, &pucDataIn[u2InIdx + 16], 4); - u4AnglePh41 = PKTL_TRAN_TO_HOST(u4AnglePh41); - - /* MTWF_LOG(DBG_CAT_TEST, DBG_SUBCAT_ALL, DBG_LVL_OFF, */ - /* ("u4AnglePh11 : 0x%x, u4AnglePh21 : 0x%x, u4AnglePh31 : 0x%x, u4AnglePh41 : 0x%x\n", */ - /* u4AnglePh11, u4AnglePh21, u4AnglePh31, u4AnglePh41)); */ - - switch (ucTxPath) { - case 2: - i2Phi11 = (INT16)(u4AnglePh21 - u4AnglePh11); - i2Phi21 = 0; - i2Phi31 = 0; - break; - case 3: - i2Phi11 = (INT16)(u4AnglePh31 - u4AnglePh11); - i2Phi21 = (INT16)(u4AnglePh31 - u4AnglePh21); - i2Phi31 = 0; - break; - - case 4: - default: -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - i2Phi11 = (INT16)(u4AnglePh21 - u4AnglePh11); - i2Phi21 = 0; - i2Phi31 = 0; - } else -#endif - { - i2Phi11 = (INT16)(u4AnglePh41 - u4AnglePh11); - i2Phi21 = (INT16)(u4AnglePh41 - u4AnglePh21); - i2Phi31 = (INT16)(u4AnglePh41 - u4AnglePh31); - } - - break; - } - - pPfmuHalfData[ucLoop].u2SubCarrIdx = (UINT16)u4SubCarrId; -#ifdef RT_BIG_ENDIAN - pPfmuHalfData[ucLoop].u2SubCarrIdx = - cpu2le16(pPfmuHalfData[ucLoop].u2SubCarrIdx); -#endif - pPfmuHalfData[ucLoop].i2Phi11 = cpu2le16(i2Phi11); - pPfmuHalfData[ucLoop].i2Phi21 = cpu2le16(i2Phi21); - pPfmuHalfData[ucLoop].i2Phi31 = cpu2le16(i2Phi31); - } - - return TRUE; -} -#endif /* CONFIG_ATE */ - -INT TxBfProfileDataWrite20MAll(IN PRTMP_ADAPTER pAd, IN UCHAR profileIdx, - IN PUCHAR pData) -{ - PFMU_HALF_DATA arProfileData[64]; - BOOLEAN fgStatus = FALSE; -#ifdef CONFIG_ATE - - if (TxBfProfileDataFormatTranslate(pAd, pData, arProfileData) == FALSE) - return fgStatus; - -#endif /* CONFIG_ATE */ - - if (CmdETxBfPfmuProfileDataWrite20MAll( - pAd, profileIdx, (PUCHAR)&arProfileData[0]) == STATUS_TRUE) - fgStatus = TRUE; - - return fgStatus; -} - -VOID TxBfProfileDataPrint(IN PRTMP_ADAPTER pAd, IN USHORT subCarrIdx, - IN PUCHAR pBuf) -{ - P_PFMU_DATA prPfmuDataStart; - PFMU_DATA rPfmuData; - - prPfmuDataStart = (P_PFMU_DATA)pBuf; -#ifdef RT_BIG_ENDIAN - RTMPEndianChange((UCHAR *)prPfmuDataStart, sizeof(PFMU_DATA)); -#endif - NdisCopyMemory(&rPfmuData, prPfmuDataStart, sizeof(PFMU_DATA)); - NdisCopyMemory(&pAd->prof, prPfmuDataStart, sizeof(PFMU_DATA)); - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("============================= TxBf profile Data - Subcarrier Idx = %d ========================================\n" - "Psi41 = 0x%x, Phi31 = 0x%x, Psi31 = 0x%x, Phi21 = 0x%x, Psi21 = 0x%x, Phi11 = 0x%x\n" - "Psi43 = 0x%x, Phi33 = 0x%x, Psi42 = 0x%x, Phi32 = 0x%x, Psi32 = 0x%x, Phi22 = 0x%x\n" - "SNR00 = 0x%x, SNR01 = 0x%x, SNR02 = 0x%x, SNR03 = 0x%x\n" - "==============================================================================================================\n", - subCarrIdx, rPfmuData.rField.ucPsi41, rPfmuData.rField.u2Phi31, - rPfmuData.rField.ucPsi31, rPfmuData.rField.u2Phi21, - rPfmuData.rField.ucPsi21, rPfmuData.rField.u2Phi11, - rPfmuData.rField.ucPsi43, rPfmuData.rField.u2Phi33, - rPfmuData.rField.ucPsi42, rPfmuData.rField.u2Phi32, - rPfmuData.rField.ucPsi32, rPfmuData.rField.u2Phi22, - rPfmuData.rField.u2dSNR00, rPfmuData.rField.u2dSNR01, - rPfmuData.rField.u2dSNR02, rPfmuData.rField.u2dSNR03)); -} - -VOID StaRecBfUpdate(IN MAC_TABLE_ENTRY *pEntry, IN P_CMD_STAREC_BF pCmdStaRecBf) -{ - pCmdStaRecBf->u2Tag = STA_REC_BF; - pCmdStaRecBf->u2Length = sizeof(CMD_STAREC_BF); -#ifdef RT_BIG_ENDIAN - pCmdStaRecBf->u2Tag = cpu2le16(pCmdStaRecBf->u2Tag); - pCmdStaRecBf->u2Length = cpu2le16(pCmdStaRecBf->u2Length); -#endif - pCmdStaRecBf->rTxBfPfmuInfo.u2PfmuId = - cpu2le16(pEntry->rStaRecBf.u2PfmuId); - pCmdStaRecBf->rTxBfPfmuInfo.fgSU_MU = pEntry->rStaRecBf.fgSU_MU; - pCmdStaRecBf->rTxBfPfmuInfo.fgETxBfCap = pEntry->rStaRecBf.fgETxBfCap; - pCmdStaRecBf->rTxBfPfmuInfo.ucSoundingPhy = - pEntry->rStaRecBf.ucSoundingPhy; - pCmdStaRecBf->rTxBfPfmuInfo.ucNdpaRate = pEntry->rStaRecBf.ucNdpaRate; - pCmdStaRecBf->rTxBfPfmuInfo.ucNdpRate = pEntry->rStaRecBf.ucNdpRate; - pCmdStaRecBf->rTxBfPfmuInfo.ucReptPollRate = - pEntry->rStaRecBf.ucReptPollRate; - pCmdStaRecBf->rTxBfPfmuInfo.ucTxMode = pEntry->rStaRecBf.ucTxMode; - pCmdStaRecBf->rTxBfPfmuInfo.ucNc = pEntry->rStaRecBf.ucNc; - pCmdStaRecBf->rTxBfPfmuInfo.ucNr = pEntry->rStaRecBf.ucNr; - pCmdStaRecBf->rTxBfPfmuInfo.ucCBW = pEntry->rStaRecBf.ucCBW; - pCmdStaRecBf->rTxBfPfmuInfo.ucTotMemRequire = - pEntry->rStaRecBf.ucTotMemRequire; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemRequire20M = - pEntry->rStaRecBf.ucMemRequire20M; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemRow0 = pEntry->rStaRecBf.ucMemRow0; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemCol0 = pEntry->rStaRecBf.ucMemCol0; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemRow1 = pEntry->rStaRecBf.ucMemRow1; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemCol1 = pEntry->rStaRecBf.ucMemCol1; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemRow2 = pEntry->rStaRecBf.ucMemRow2; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemCol2 = pEntry->rStaRecBf.ucMemCol2; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemRow3 = pEntry->rStaRecBf.ucMemRow3; - pCmdStaRecBf->rTxBfPfmuInfo.ucMemCol3 = pEntry->rStaRecBf.ucMemCol3; - pCmdStaRecBf->rTxBfPfmuInfo.u2SmartAnt = - cpu2le16(pEntry->rStaRecBf.u2SmartAnt); - pCmdStaRecBf->rTxBfPfmuInfo.ucSEIdx = pEntry->rStaRecBf.ucSEIdx; -#ifdef TXBF_DYNAMIC_DISABLE - pCmdStaRecBf->rTxBfPfmuInfo.ucAutoSoundingCtrl = - pEntry->rStaRecBf.ucAutoSoundingCtrl; -#endif /* TXBF_DYNAMIC_DISABLE */ - pCmdStaRecBf->rTxBfPfmuInfo.uciBfTimeOut = - pEntry->rStaRecBf.uciBfTimeOut; - pCmdStaRecBf->rTxBfPfmuInfo.uciBfDBW = pEntry->rStaRecBf.uciBfDBW; - pCmdStaRecBf->rTxBfPfmuInfo.uciBfNcol = pEntry->rStaRecBf.uciBfNcol; - pCmdStaRecBf->rTxBfPfmuInfo.uciBfNrow = pEntry->rStaRecBf.uciBfNrow; -} - -VOID StaRecBfRead(IN PRTMP_ADAPTER pAd, IN PUCHAR pBuf) -{ - NdisCopyMemory(&pAd->rStaRecBf, pBuf, sizeof(TXBF_PFMU_STA_INFO)); -#ifdef RT_BIG_ENDIAN - pAd->rStaRecBf.u2PfmuId = le2cpu16(pAd->rStaRecBf.u2PfmuId); - pAd->rStaRecBf.u2SmartAnt = le2cpu16(pAd->rStaRecBf.u2SmartAnt); -#endif - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("====================================== BF StaRec ========================================\n" - "rStaRecBf.u2PfmuId = %d\n" - "rStaRecBf.fgSU_MU = %d\n" - "rStaRecBf.fgETxBfCap = %d\n" - "rStaRecBf.ucSoundingPhy = %d\n" - "rStaRecBf.ucNdpaRate = %d\n" - "rStaRecBf.ucNdpRate = %d\n" - "rStaRecBf.ucReptPollRate= %d\n" - "rStaRecBf.ucTxMode = %d\n" - "rStaRecBf.ucNc = %d\n" - "rStaRecBf.ucNr = %d\n" - "rStaRecBf.ucCBW = %d\n" - "rStaRecBf.ucTotMemRequire = %d\n" - "rStaRecBf.ucMemRequire20M = %d\n" - "rStaRecBf.ucMemRow0 = %d\n" - "rStaRecBf.ucMemCol0 = %d\n" - "rStaRecBf.ucMemRow1 = %d\n" - "rStaRecBf.ucMemCol1 = %d\n" - "rStaRecBf.ucMemRow2 = %d\n" - "rStaRecBf.ucMemCol2 = %d\n" - "rStaRecBf.ucMemRow3 = %d\n" - "rStaRecBf.ucMemCol3 = %d\n" - "rStaRecBf.u2SmartAnt = 0x%x\n" - "rStaRecBf.ucSEIdx = %d\n" -#ifdef TXBF_DYNAMIC_DISABLE - "rStaRecBf.ucAutoSoundingCtrl = %d\n" -#endif /* TXBF_DYNAMIC_DISABLE */ - "rStaRecBf.uciBfTimeOut = 0x%x\n" - "rStaRecBf.uciBfDBW = %d\n" - "rStaRecBf.uciBfNcol = %d\n" - "rStaRecBf.uciBfNrow = %d\n" - "=======================================================================================\n", - pAd->rStaRecBf.u2PfmuId, pAd->rStaRecBf.fgSU_MU, - pAd->rStaRecBf.fgETxBfCap, pAd->rStaRecBf.ucSoundingPhy, - pAd->rStaRecBf.ucNdpaRate, pAd->rStaRecBf.ucNdpRate, - pAd->rStaRecBf.ucReptPollRate, pAd->rStaRecBf.ucTxMode, - pAd->rStaRecBf.ucNc, pAd->rStaRecBf.ucNr, pAd->rStaRecBf.ucCBW, - pAd->rStaRecBf.ucTotMemRequire, pAd->rStaRecBf.ucMemRequire20M, - pAd->rStaRecBf.ucMemRow0, pAd->rStaRecBf.ucMemCol0, - pAd->rStaRecBf.ucMemRow1, pAd->rStaRecBf.ucMemCol1, - pAd->rStaRecBf.ucMemRow2, pAd->rStaRecBf.ucMemCol2, - pAd->rStaRecBf.ucMemRow3, pAd->rStaRecBf.ucMemCol3, - pAd->rStaRecBf.u2SmartAnt, pAd->rStaRecBf.ucSEIdx, -#ifdef TXBF_DYNAMIC_DISABLE - pAd->rStaRecBf.ucAutoSoundingCtrl, -#endif /* TXBF_DYNAMIC_DISABLE */ - pAd->rStaRecBf.uciBfTimeOut, pAd->rStaRecBf.uciBfDBW, - pAd->rStaRecBf.uciBfNcol, pAd->rStaRecBf.uciBfNrow)); -} - -VOID TxBfProfileMemAllocMap(IN PUCHAR pBuf) -{ - UINT_16 *au2PfmuMemAllocMap; - UINT_8 ucLoop, ucBit; - UINT_16 len = sizeof(UINT_16) * TXBF_PFMU_ARRAY_SIZE * - MAX_PFMU_MEM_LEN_PER_ROW; - - os_alloc_mem(NULL, (UCHAR **)&au2PfmuMemAllocMap, len); - if (!au2PfmuMemAllocMap) - return; - NdisCopyMemory(au2PfmuMemAllocMap, pBuf, len); - - for (ucLoop = 0; ucLoop < TXBF_PFMU_ARRAY_SIZE; ucLoop++) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("========= PFMU memory allocation map =========\n")); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%3d :", ucLoop)); - - for (ucBit = 0; ucBit < MAX_PFMU_MEM_LEN_PER_ROW; ucBit++) { - UINT_16 idx = ucLoop * MAX_PFMU_MEM_LEN_PER_ROW + ucBit; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("%4d |", le2cpu16(au2PfmuMemAllocMap[idx]))); - - if (ucBit == 5) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, - DBG_LVL_TRACE, ("\n")); - } - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("==============================================\n")); - } - os_free_mem(au2PfmuMemAllocMap); -} - -BOOLEAN TxBfModuleEnCtrl(IN PRTMP_ADAPTER pAd) -{ - struct hdev_ctrl *ctrl = pAd->hdev_ctrl; - struct _RTMP_CHIP_CAP *cap; - RADIO_CTRL *pRadioCtrl = NULL; - RTMP_PHY_CTRL *pPhyCtrl = NULL; - HD_RESOURCE_CFG *pHwResource = &ctrl->HwResourceCfg; - UINT8 i; - UINT8 u1BfNum = 0; - UINT8 u1isBfBfBandNum = 0; - UINT8 u1BfBitmap = 0; - UINT8 u1BfSelBand[8]; - - if (pHwResource->concurrent_bands < 2) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:It's not DBDC mode\n", __func__)); - - return FALSE; - } - os_zero_mem(&u1BfSelBand[0], sizeof(u1BfSelBand)); - cap = hc_get_chip_cap(ctrl); - - u1BfNum = (cap->FlgHwTxBfCap & TXBF_HW_2BF) ? 2 : 1; - if (u1BfNum > 1) { - /* For 2 BF DBDC mode */ - for (i = 0; i < pHwResource->concurrent_bands; i++) { - pPhyCtrl = &pHwResource->PhyCtrl[i]; - pRadioCtrl = &pPhyCtrl->RadioCtrl; - - if (pRadioCtrl->IsBfBand) { - u1isBfBfBandNum++; - u1BfBitmap |= 1 << i; - u1BfSelBand[i] = 0; - } - } - } else { - /* For 1 BF DBDC mode */ - for (i = 0; i < pHwResource->concurrent_bands; i++) { - pPhyCtrl = &pHwResource->PhyCtrl[i]; - pRadioCtrl = &pPhyCtrl->RadioCtrl; - - if (pRadioCtrl->IsBfBand) { - u1isBfBfBandNum++; - u1BfBitmap |= 1; - u1BfSelBand[0] = i; - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:i = %d, pRadioCtrl->IsBfBand = %d\n", - __func__, i, pRadioCtrl->IsBfBand)); - } - } - - if (u1isBfBfBandNum > u1BfNum) { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("%s:Error - isBfBfBandNum > hardware capability\n", - __func__)); - - return FALSE; - } - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s:u1BfNum = %d, u1BfBitmap = %d, u1BfSelBand[0] = %d\n", - __func__, u1BfNum, u1BfBitmap, u1BfSelBand[0])); - - AsicTxBfModuleEnCtrl(pAd, u1BfNum, u1BfBitmap, &u1BfSelBand[0]); - - return TRUE; -} - -#ifdef TXBF_DYNAMIC_DISABLE - -/* - ========================================================================== - Description: - (1) Dynamically disable BF for current assoc STAs by setting pEntry->rStaRecBf.ucAutoSoundingCtrl[DYNAMIC_BF_DISABLE] - (2) Set pAd->CommonCfg.ucAutoSoundingCtrl[DYNAMIC_BF_DISABLE] so that STA in the future is also with BF disabled - (3) Also updates WTBL BF flags - - ========================================================================== - */ -INT DynamicTxBfDisable(IN PRTMP_ADAPTER pAd, IN BOOLEAN fgDisable) -{ - BOOLEAN fgStatus = FALSE, fgETxBf, fgITxBf; - INT i; - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s]\n", __FUNCTION__)); - - if (fgDisable) { - fgETxBf = FALSE; - fgITxBf = FALSE; - /* Update ucAutoSoundingCtrol with DYNAMIC_BF_DISABLE - * to bypass WTBL BF flag setting and sounding packet Tx - */ - pAd->CommonCfg.ucAutoSoundingCtrl |= DYNAMIC_TXBF_DISABLE; - /* Disable BFee by setting HW */ - AsicTxBfeeHwCtrl(pAd, FALSE); - } else { - fgETxBf = pAd->CommonCfg.ETxBfEnCond; - fgITxBf = pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn; - pAd->CommonCfg.ucAutoSoundingCtrl = 0; - /* Enable BFee by setting HW */ - AsicTxBfeeHwCtrl(pAd, TRUE); - } - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] fgETxBf=%d, fgITxBf=%d, ucAutoSoundingCtrl=%d\n", - __FUNCTION__, fgETxBf, fgITxBf, - pAd->CommonCfg.ucAutoSoundingCtrl)); - - for (i = 0; VALID_UCAST_ENTRY_WCID(pAd, i); i++) { /* For every STA */ - PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; - - if ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || - IS_ENTRY_REPEATER(pEntry)) && - (pEntry->Sst == SST_ASSOC)) { - STA_REC_CFG_T StaCfg; - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("[%s] Enable/Disable BF for wlanid %d \n", - __FUNCTION__, i)); - - os_zero_mem(&StaCfg, sizeof(STA_REC_CFG_T)); - pEntry->rStaRecBf.ucAutoSoundingCtrl = - pAd->CommonCfg.ucAutoSoundingCtrl; - - StaCfg.MuarIdx = 0; - StaCfg.ConnectionState = TRUE; - StaCfg.ConnectionType = 0; - StaCfg.u4EnableFeature = (1 << STA_REC_BF); - StaCfg.ucBssIndex = - pEntry->wdev->bss_info_argument.ucBssIndex; - StaCfg.ucWlanIdx = i; - StaCfg.pEntry = pEntry; - /* update ucAutoSoundingCtrol and WTBL BF flag */ - if (CmdExtStaRecUpdate(pAd, StaCfg) == STATUS_TRUE) { - fgStatus = TRUE; - } - - CmdTxBfTxApplyCtrl(pAd, i, fgETxBf, fgITxBf, FALSE, - FALSE); /* Set WTBL IBF EBF */ - } - } - - return fgStatus; -} -#endif /* TXBF_DYNAMIC_DISABLE */ - -#endif /* MT_MAC */ - -/*sta rec txbf feature decision*/ -UINT32 starec_txbf_feature_decision(struct wifi_dev *wdev, - struct _MAC_TABLE_ENTRY *entry, - UINT32 *feature) -{ - struct _RTMP_ADAPTER *ad = (struct _RTMP_ADAPTER *)wdev->sys_handle; - UINT32 features = 0; - - if ((ad->CommonCfg.ETxBfEnCond == TRUE) || - (ad->CommonCfg.RegTransmitSetting.field.ITxBfEn == TRUE)) { - if (entry && (!IS_ENTRY_NONE(entry))) { - if (HcIsBfCapSupport(wdev)) { - switch (wdev->wdev_type) { - case WDEV_TYPE_AP: - if (IS_ENTRY_CLIENT(entry)) { - ad->fgApClientMode = FALSE; - features |= STA_REC_BF_FEATURE; - } - break; - case WDEV_TYPE_STA: - /* we don't check IS_ENTRY_AP(entry) because there are some problems in the setting */ - ad->fgApClientMode = FALSE; - features |= STA_REC_BF_FEATURE; - break; -#ifdef APCLI_SUPPORT - case WDEV_TYPE_APCLI: - if ((IS_ENTRY_APCLI(entry) || - IS_ENTRY_REPEATER(entry))) { - ad->fgApClientMode = TRUE; - - if (ad->fgApCliBfStaRecRegister == - FALSE) { - ad->fgApCliBfStaRecRegister = - TRUE; - ad->ApCli_CmmWlanId = - entry->wcid; - features |= - STA_REC_BF_FEATURE; - } - } - break; -#endif /* APCLI_SUPPORT */ - - default: - break; - } - } - } - } - - /*return value, must use or operation*/ - *feature |= features; - return TRUE; -} - -#endif /* TXBF_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/txbf_wrapper_embedded.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/txbf_wrapper_embedded.c deleted file mode 100644 index 971cc8ce5a..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txbf/txbf_wrapper_embedded.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - txbf_wrapper_embedded.c -*/ - -/******************************************************************************* -* E X T E R N A L R E F E R E N C E S -******************************************************************************** -*/ -#include "rt_config.h" - -/******************************************************************************* -* C O N S T A N T S -******************************************************************************** -*/ - -/******************************************************************************* -* D A T A T Y P E S -******************************************************************************** -*/ - -/******************************************************************************* -* P U B L I C D A T A -******************************************************************************** -*/ - -/******************************************************************************* -* P R I V A T E D A T A -******************************************************************************** -*/ - -/******************************************************************************* -* M A C R O S -******************************************************************************** -*/ - -/******************************************************************************* -* F U N C T I O N D E C L A R A T I O N S -******************************************************************************** -*/ - -/******************************************************************************* -* F U N C T I O N S -******************************************************************************** -*/ -#ifdef TXBF_SUPPORT -#ifdef MT_MAC -/*----------------------------------------------------------------------------*/ - -/* Wrap function for TxBFInit */ -VOID mt_WrapTxBFInit(IN PRTMP_ADAPTER pAd, IN MAC_TABLE_ENTRY *pEntry, - IN IE_LISTS *ie_list, IN BOOLEAN supportsETxBF) -{ - TXBF_MAC_TABLE_ENTRY TxBfMacEntry; - TXBF_STATUS_INFO TxBfInfo; - HT_BF_CAP *pTxBFCap = &ie_list->HTCapability.TxBFCap; - - TxBfInfo.ucTxPathNum = pAd->Antenna.field.TxPath; - TxBfInfo.ucETxBfTxEn = (UCHAR)pAd->CommonCfg.ETxBfEnCond; - TxBfInfo.cmmCfgETxBfNoncompress = pAd->CommonCfg.ETxBfNoncompress; - TxBfInfo.ucITxBfTxEn = pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn; - mt_TxBFInit(pAd, &TxBfInfo, &TxBfMacEntry, pTxBFCap, supportsETxBF); - pEntry->bfState = TxBfMacEntry.bfState; - pEntry->sndgMcs = TxBfMacEntry.sndgMcs; - pEntry->sndg0Snr0 = TxBfMacEntry.sndg0Snr0; - pEntry->sndg0Snr1 = TxBfMacEntry.sndg0Snr1; - pEntry->sndg0Snr2 = TxBfMacEntry.sndg0Snr2; - pEntry->sndg0Mcs = TxBfMacEntry.sndg0Mcs; - pEntry->noSndgCnt = TxBfMacEntry.noSndgCnt; - pEntry->eTxBfEnCond = TxBfMacEntry.eTxBfEnCond; - pEntry->noSndgCntThrd = TxBfMacEntry.noSndgCntThrd; - pEntry->ndpSndgStreams = TxBfMacEntry.ndpSndgStreams; - pEntry->iTxBfEn = TxBfMacEntry.iTxBfEn; -} - -/* Wrap function for clientSupportsETxBF */ -BOOLEAN mt_WrapClientSupportsETxBF(IN PRTMP_ADAPTER pAd, IN HT_BF_CAP *pTxBFCap) -{ - TXBF_STATUS_INFO TxBfInfo; - - TxBfInfo.cmmCfgETxBfNoncompress = pAd->CommonCfg.ETxBfNoncompress; - return mt_clientSupportsETxBF(pAd, pTxBFCap, - TxBfInfo.cmmCfgETxBfNoncompress); -} - -#ifdef VHT_TXBF_SUPPORT -/* Wrap function for clientSupportsVHTETxBF */ -BOOLEAN mt_WrapClientSupportsVhtETxBF(IN PRTMP_ADAPTER pAd, - IN VHT_CAP_INFO *pTxBFCap) -{ - return mt_clientSupportsVhtETxBF(pAd, pTxBFCap); -} -#endif /* VHT_TXBF_SUPPORT */ - -/* wrapper for mt_chk_itxbf_calibration */ -BOOLEAN mt_Wrap_chk_itxbf_calibration(IN RTMP_ADAPTER *pAd, - struct wifi_dev *wdev) -{ - TXBF_STATUS_INFO TxBfInfo; - - TxBfInfo.u2Channel = wdev->channel; - /* return mt_chk_itxbf_calibration(pAd,&TxBfInfo); */ - return TRUE; -} - -/* wrapper for setETxBFCap */ -void mt_WrapSetETxBFCap(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN HT_BF_CAP *pTxBFCap) -{ - TXBF_STATUS_INFO TxBfInfo; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - - TxBfInfo.pHtTxBFCap = pTxBFCap; - TxBfInfo.cmmCfgETxBfEnCond = wlan_config_get_etxbf(wdev); - TxBfInfo.cmmCfgETxBfNoncompress = pAd->CommonCfg.ETxBfNoncompress; - TxBfInfo.ucRxPathNum = pAd->Antenna.field.RxPath; - if (ops->setETxBFCap) - ops->setETxBFCap(pAd, &TxBfInfo); -} - -#ifdef VHT_TXBF_SUPPORT -/* Wrapper for mt_setVHTETxBFCap */ -void mt_WrapSetVHTETxBFCap(IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, - IN VHT_CAP_INFO *pTxBFCap) -{ - TXBF_STATUS_INFO TxBfInfo; - UINT8 ucTxPath = pAd->Antenna.field.TxPath; - struct _RTMP_CHIP_OP *ops = hc_get_chip_ops(pAd->hdev_ctrl); - -#ifdef DBDC_MODE - if (pAd->CommonCfg.dbdc_mode) { - UINT8 band_idx = HcGetBandByWdev(wdev); - - if (band_idx == DBDC_BAND0) - ucTxPath = pAd->dbdc_band0_tx_path; - else - ucTxPath = pAd->dbdc_band1_tx_path; - } -#endif - - TxBfInfo.pVhtTxBFCap = pTxBFCap; - TxBfInfo.ucTxPathNum = ucTxPath; - TxBfInfo.cmmCfgETxBfEnCond = wlan_config_get_etxbf(wdev); - if (ops->setVHTETxBFCap) - ops->setVHTETxBFCap(pAd, &TxBfInfo); -} -#endif /* VHT_TXBF_SUPPORT */ - -#endif /* MT_MAC */ -#endif /* TXBF_SUPPORT */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/Makefile b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/Makefile deleted file mode 100644 index baa9976e24..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -all: - gcc data2h.c -o data2h -clean: - rm -f *.o data2h - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/data2h.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/data2h.c deleted file mode 100644 index ea402c24a8..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/data2h.c +++ /dev/null @@ -1,220 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * 4F, No. 2 Technology 5th Rd. - * Science-based Industrial Park - * Hsin-chu, Taiwan, R.O.C. - * - * (c) Copyright 1997-2012, MediaTek, Inc. - * - * All rights reserved. MediaTek source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek Technology, Inc. is obtained. - *************************************************************************** - -*/ - -#include -#include -#include - -#define PATH_OF_SKU_TABLE_IN "/txpwr/sku_tables/" -#define PATH_OF_SKU_TABEL_OUT "/include/txpwr/" - -#define MAX_SKUTABLE_NUM 20 - -int data2h(char *infname, char *outfname, char *varname, char *deffname, - const char *mode) -{ - FILE *infile, *outfile, *definfile; - unsigned char c; - unsigned int fgDefTable = 0; - /* Open input file */ - infile = fopen(infname, "r"); - - /* Check open file status for input file */ - if (infile == (FILE *)NULL) { - printf("Can't read file %s\n", infname); - printf("System would automatically apply default table !!\n"); - /* Flag for use Default SKU table */ - fgDefTable = 1; - /* Open default input file */ - definfile = fopen(deffname, "r"); - - /* Check open file status for default file */ - if (definfile == (FILE *)NULL) { - printf("Can't read def file %s\n", deffname); - return -1; - } - } - - outfile = fopen(outfname, mode); - - /* Check open file status for output file */ - if (outfile == (FILE *)NULL) { - printf("Can't open write file %s\n", outfname); - - /* Close input file or default input file */ - if (fgDefTable == 0) - fclose(infile); - else - fclose(definfile); - - return -1; - } - - /* Comment in header files */ - fputs("/* AUTO GEN PLEASE DO NOT MODIFY IT */\n", outfile); - fputs("/* AUTO GEN PLEASE DO NOT MODIFY IT */\n", outfile); - fputs("\n", outfile); - fputs("\n", outfile); - /* Contents in header file */ - fprintf(outfile, "UCHAR %s[] = \"", varname); - - while (1) { - char cc[2]; - - if (fgDefTable == 0) - c = getc(infile); - else - c = getc(definfile); - - /* backward compatibility for old Excel SKU table */ - if (c == '#') { - c = '!'; - snprintf(cc, sizeof(cc), "%c", c); - fputs(cc, outfile); - } - - if (fgDefTable == 0) { - if (feof(infile)) - break; - } else { - if (feof(definfile)) - break; - } - - if (c == '\r') - continue; - else if (c == '\n') { - c = '\t'; - snprintf(cc, sizeof(cc), "%c", c); - fputs(cc, outfile); - c = '\"'; - snprintf(cc, sizeof(cc), "%c", c); - fputs(cc, outfile); - c = '\n'; - snprintf(cc, sizeof(cc), "%c", c); - fputs(cc, outfile); - c = '\"'; - snprintf(cc, sizeof(cc), "%c", c); - fputs(cc, outfile); - } else { - snprintf(cc, sizeof(cc), "%c", c); - fputs(cc, outfile); - } - } - - fputs("\";\n", outfile); - - /* close input file or default input file */ - if (fgDefTable == 0) - fclose(infile); - else - fclose(definfile); - - /* close output file */ - fclose(outfile); - - return 1; -} - -int main(int argc, char *argv[]) -{ - char infname[512]; - char outfname[512]; - char deffname[512]; - char varname[128]; - char *rt28xxdir; - int SKUTableIdx; - char cc[20]; - - rt28xxdir = (char *)getenv("RT28xx_DIR"); - if (!rt28xxdir) { - printf("Environment value \"RT28xx_DIR\" not export\n"); - return -1; - } - - /* Trasform SKU table data file to header file */ - for (SKUTableIdx = 1; SKUTableIdx <= MAX_SKUTABLE_NUM; SKUTableIdx++) { - /* configure input file address and file name */ - memset(infname, 0, 512); - strcat(infname, rt28xxdir); - strcat(infname, PATH_OF_SKU_TABLE_IN); - strcat(infname, "7615_SingleSKU_"); - sprintf(cc, "%d", SKUTableIdx); - strcat(infname, cc); - strcat(infname, ".dat"); - printf("Input: [%d] %s\n", SKUTableIdx, infname); - /* configure output file address and file name */ - memset(outfname, 0, 512); - strcat(outfname, rt28xxdir); - strcat(outfname, PATH_OF_SKU_TABEL_OUT); - strcat(outfname, "SKUTable_"); - sprintf(cc, "%d", SKUTableIdx); - strcat(outfname, cc); - strcat(outfname, ".h"); - printf("Output: [%d] %s\n", SKUTableIdx, outfname); - /* configure default input file address and file name */ - memset(deffname, 0, 512); - strcat(deffname, rt28xxdir); - strcat(deffname, PATH_OF_SKU_TABLE_IN); - strcat(deffname, "7615_SingleSKU_default.dat"); - printf("Def Input: [%d] %s\n", SKUTableIdx, deffname); - /* Configure variable name for SKU contents in header file */ - memset(varname, 0, 128); - strcat(varname, "SKUvalue_"); - sprintf(cc, "%d", SKUTableIdx); - strcat(varname, cc); - /* Transform data file to header file */ - data2h(infname, outfname, varname, deffname, "w"); - } - - /* Trasform BF Backoff table data file to header file */ - for (SKUTableIdx = 1; SKUTableIdx <= MAX_SKUTABLE_NUM; SKUTableIdx++) { - /* configure input file address and file name */ - memset(infname, 0, 512); - strcat(infname, rt28xxdir); - strcat(infname, PATH_OF_SKU_TABLE_IN); - strcat(infname, "7615_SingleSKU_BF_"); - sprintf(cc, "%d", SKUTableIdx); - strcat(infname, cc); - strcat(infname, ".dat"); - printf("Input: [%d] %s\n", SKUTableIdx, infname); - /* configure output file address and file name */ - memset(outfname, 0, 512); - strcat(outfname, rt28xxdir); - strcat(outfname, PATH_OF_SKU_TABEL_OUT); - strcat(outfname, "BFBackoffTable_"); - sprintf(cc, "%d", SKUTableIdx); - strcat(outfname, cc); - strcat(outfname, ".h"); - printf("Output: [%d] %s\n", SKUTableIdx, outfname); - /* configure default input file address and file name */ - memset(deffname, 0, 512); - strcat(deffname, rt28xxdir); - strcat(deffname, PATH_OF_SKU_TABLE_IN); - strcat(deffname, "7615_SingleSKU_BF_default.dat"); - printf("Def Input: [%d] %s\n", SKUTableIdx, deffname); - /* Configure variable name for SKU contents in header file */ - memset(varname, 0, 128); - strcat(varname, "BFBackoffvalue_"); - sprintf(cc, "%d", SKUTableIdx); - strcat(varname, cc); - /* Transform data file to header file */ - data2h(infname, outfname, varname, deffname, "w"); - } -} diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/single_sku.c b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/single_sku.c deleted file mode 100644 index e57a2d36cf..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/single_sku.c +++ /dev/null @@ -1,2588 +0,0 @@ -/* - *************************************************************************** - * MediaTek Inc. - * - * All rights reserved. source code is an unpublished work and the - * use of a copyright notice does not imply otherwise. This source code - * contains confidential trade secret material of MediaTek. Any attemp - * or participation in deciphering, decoding, reverse engineering or in any - * way altering the source code is stricitly prohibited, unless the prior - * written consent of MediaTek, Inc. is obtained. - *************************************************************************** - - Module Name: - cmm_single_sku.c -*/ -#ifdef COMPOS_WIN -#include "MtConfig.h" -#if defined(EVENT_TRACING) -#include "Single_sku.tmh" -#endif -#elif defined(COMPOS_TESTMODE_WIN) -#include "config.h" -#else -#include "rt_config.h" -#endif - -#include "txpwr/single_sku.h" - -#ifdef RF_LOCKDOWN -#include "txpwr/SKUTable_1.h" -#include "txpwr/SKUTable_2.h" -#include "txpwr/SKUTable_3.h" -#include "txpwr/SKUTable_4.h" -#include "txpwr/SKUTable_5.h" -#include "txpwr/SKUTable_6.h" -#include "txpwr/SKUTable_7.h" -#include "txpwr/SKUTable_8.h" -#include "txpwr/SKUTable_9.h" -#include "txpwr/SKUTable_10.h" -#include "txpwr/SKUTable_11.h" -#include "txpwr/SKUTable_12.h" -#include "txpwr/SKUTable_13.h" -#include "txpwr/SKUTable_14.h" -#include "txpwr/SKUTable_15.h" -#include "txpwr/SKUTable_16.h" -#include "txpwr/SKUTable_17.h" -#include "txpwr/SKUTable_18.h" -#include "txpwr/SKUTable_19.h" -#include "txpwr/SKUTable_20.h" -#include "txpwr/BFBackoffTable_1.h" -#include "txpwr/BFBackoffTable_2.h" -#include "txpwr/BFBackoffTable_3.h" -#include "txpwr/BFBackoffTable_4.h" -#include "txpwr/BFBackoffTable_5.h" -#include "txpwr/BFBackoffTable_6.h" -#include "txpwr/BFBackoffTable_7.h" -#include "txpwr/BFBackoffTable_8.h" -#include "txpwr/BFBackoffTable_9.h" -#include "txpwr/BFBackoffTable_10.h" -#include "txpwr/BFBackoffTable_11.h" -#include "txpwr/BFBackoffTable_12.h" -#include "txpwr/BFBackoffTable_13.h" -#include "txpwr/BFBackoffTable_14.h" -#include "txpwr/BFBackoffTable_15.h" -#include "txpwr/BFBackoffTable_16.h" -#include "txpwr/BFBackoffTable_17.h" -#include "txpwr/BFBackoffTable_18.h" -#include "txpwr/BFBackoffTable_19.h" -#include "txpwr/BFBackoffTable_20.h" -#endif /* RF_LOCKDOWN */ - -extern RTMP_STRING *__rstrtok; - -/* TODO: shiang-usw, for MT76x0 series, currently cannot use this function! */ -#ifdef COMPOS_WIN - -CHAR *os_str_pbrk(CHAR *str1, CHAR *str2) -{ - const CHAR *x; - - for (; *str1; str1++) - for (x = str2; *x; x++) - if (*str1 == *x) - return (CHAR *)str1; - - return NULL; -} - -UINT32 os_str_spn(CHAR *str1, CHAR *str2) -{ - return strspn(str1, str2); -} - -ULONG -simple_strtol(const RTMP_STRING *szProgID, INT EndPtr, INT Base) -{ - ULONG val = 0; - ANSI_STRING AS; - UNICODE_STRING US; - RtlInitAnsiString(&AS, szProgID); - RtlAnsiStringToUnicodeString(&US, &AS, TRUE); - RtlUnicodeStringToInteger(&US, 0, &val); - RtlFreeUnicodeString(&US); - return val; -} - -LONG os_str_tol(const CHAR *str, CHAR **endptr, INT base) -{ - return simple_strtol(str, (INT)endptr, base); -} - -CHAR *os_str_chr(CHAR *str, INT character) -{ - return strchr(str, character); -} - -/** - * rstrtok - Split a string into tokens - * @s: The string to be searched - * @ct: The characters to search for - * * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture. - */ -static RTMP_STRING *__rstrtok; -RTMP_STRING *rstrtok(RTMP_STRING *s, const RTMP_STRING *ct) -{ - RTMP_STRING *sbegin, *send; - sbegin = s ? s : __rstrtok; - - if (!sbegin) - return NULL; - - sbegin += os_str_spn((CHAR *)sbegin, (CHAR *)ct); - - if (*sbegin == '\0') { - __rstrtok = NULL; - return NULL; - } - - send = os_str_pbrk((CHAR *)sbegin, (CHAR *)ct); - - if (send && *send != '\0') - *send++ = '\0'; - - __rstrtok = send; - return sbegin; -} -#endif - -#ifdef SINGLE_SKU_V2 -#if defined(MT7615) || defined(MT7622) -INT MtSingleSkuLoadParam(RTMP_ADAPTER *pAd) -{ - CHAR *buffer; - CHAR *readline, *token; - RTMP_OS_FD_EXT srcf; - INT retval = 0; - CHAR *ptr; - INT index, i; - CH_POWER *StartCh = NULL; - UCHAR band = 0; - UCHAR channel, *temp; - CH_POWER *pwr = NULL; - UCHAR *sku_path = NULL; -#ifdef RF_LOCKDOWN - BOOLEAN RF_Lock = FALSE; -#endif - - /* Link list Init */ - DlListInit(&pAd->PwrLimitSkuList); - /* allocate memory for buffer SKU value */ - os_alloc_mem(pAd, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE); - - if (!buffer) - return FALSE; - -#ifdef RF_LOCKDOWN - RF_Lock = chip_check_rf_lock_down(pAd); - if (RF_Lock) { - if (IS_MT7615(pAd)) - pAd->CommonCfg.SKUTableIdx = - pAd->EEPROMImage[SINGLE_SKU_TABLE_EFFUSE_ADDRESS] & - BITS(0, 6); - else if (IS_MT7622(pAd)) - pAd->CommonCfg.SKUTableIdx = - pAd->EEPROMImage - [MT7622_SINGLE_SKU_TABLE_EFFUSE_ADDRESS] & - BITS(0, 6); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (KBLU "%s: RF_LOCKDOWN Feature ON !!!\n" KNRM, - __FUNCTION__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (KBLU "%s: SKU Table index = %d \n" KNRM, __FUNCTION__, - pAd->CommonCfg.SKUTableIdx)); - /* card information file exists so reading the card information */ - os_zero_mem(buffer, MAX_INI_BUFFER_SIZE); - - switch (pAd->CommonCfg.SKUTableIdx) { - case SKUTABLE_1: - os_move_mem(buffer, SKUvalue_1, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_2: - os_move_mem(buffer, SKUvalue_2, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_3: - os_move_mem(buffer, SKUvalue_3, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_4: - os_move_mem(buffer, SKUvalue_4, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_5: - os_move_mem(buffer, SKUvalue_5, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_6: - os_move_mem(buffer, SKUvalue_6, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_7: - os_move_mem(buffer, SKUvalue_7, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_8: - os_move_mem(buffer, SKUvalue_8, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_9: - os_move_mem(buffer, SKUvalue_9, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_10: - os_move_mem(buffer, SKUvalue_10, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_11: - os_move_mem(buffer, SKUvalue_11, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_12: - os_move_mem(buffer, SKUvalue_12, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_13: - os_move_mem(buffer, SKUvalue_13, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_14: - os_move_mem(buffer, SKUvalue_14, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_15: - os_move_mem(buffer, SKUvalue_15, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_16: - os_move_mem(buffer, SKUvalue_16, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_17: - os_move_mem(buffer, SKUvalue_17, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_18: - os_move_mem(buffer, SKUvalue_18, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_19: - os_move_mem(buffer, SKUvalue_19, MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_20: - os_move_mem(buffer, SKUvalue_20, MAX_INI_BUFFER_SIZE); - ; - break; - - default: - os_move_mem(buffer, SKUvalue_20, MAX_INI_BUFFER_SIZE); - break; - } - } else -#endif - { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RF_LOCKDOWN Feature OFF !!!\n", __FUNCTION__)); - /* open card information file*/ - sku_path = get_single_sku_path(pAd); - if (sku_path && *sku_path) - srcf = os_file_open(sku_path, O_RDONLY, 0); - else - srcf.Status = 1; - - if (srcf.Status) { - /* card information file does not exist */ - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--> Error opening %s\n", sku_path)); - goto free_resource; - } - - /* card information file exists so reading the card information */ - os_zero_mem(buffer, MAX_INI_BUFFER_SIZE); - retval = os_file_read(srcf, buffer, MAX_INI_BUFFER_SIZE); - } - if (retval < 0) { - /* read fail */ - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KRED "--> Read %s error %d\n" KNRM, sku_path, - -retval)); - } else { -#ifdef RF_LOCKDOWN - for (readline = ptr = buffer, index = 0; - (((ptr = os_str_chr(readline, '\t')) != NULL) && - RF_Lock) || - (((ptr = os_str_chr(readline, '\n')) != NULL) && !RF_Lock); - readline = ptr + 1, index++) -#else - for (readline = ptr = buffer, index = 0; - (ptr = os_str_chr(readline, '\n')) != NULL; - readline = ptr + 1, index++) -#endif /* RF_LOCKDOWN */ - { - *ptr = '\0'; -#ifdef RF_LOCKDOWN - if (RF_Lock) { - if (readline[0] == '!') - continue; - } else -#endif - { - if (readline[0] == '#') - continue; - } - /* Band Info Parsing */ - if (!strncmp(readline, "Band: ", 6)) { - token = rstrtok(readline + 6, " "); - - /* sanity check for non-Null pointer */ - if (!token) - continue; - - band = (UCHAR)os_str_tol(token, 0, 10); - - if (band == 2) - band = 0; - else if (band == 5) - band = 1; - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, - DBG_LVL_INFO, ("band = %d\n", band)); - } - - /* Rate Info Parsing for each channel */ - if (!strncmp(readline, "Ch", 2)) { - /* Dynamic allocate memory for parsing structure */ - os_alloc_mem(pAd, (UCHAR **)&pwr, sizeof(*pwr)); - /* set default value to 0 for parsing structure */ - os_zero_mem(pwr, sizeof(*pwr)); - token = rstrtok(readline + 2, " "); - - /* sanity check for non-Null pointer */ - if (!token) { - /* free memory buffer before escape this loop */ - os_free_mem(pwr); - /* escape this loop for Null pointer */ - continue; - } - - channel = (UCHAR)os_str_tol(token, 0, 10); - pwr->StartChannel = channel; - pwr->band = band; - - /* Rate Info Parsing (CCK) */ - if (band == 0) { - for (i = 0; - i < SINGLE_SKU_TABLE_CCK_LENGTH; - i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* config CCK Power Limit */ - MtPowerLimitFormatTrans( - pAd, - pwr->u1PwrLimitCCK + i, - token); - } - } - - /* Rate Info Parsing (OFDM) */ - for (i = 0; i < SINGLE_SKU_TABLE_OFDM_LENGTH; - i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* config ofdm Power Limit */ - MtPowerLimitFormatTrans( - pAd, pwr->u1PwrLimitOFDM + i, - token); - } - -#ifdef DOT11_VHT_AC - - /* Rate Info Parsing (VHT20) */ - for (i = 0; i < SINGLE_SKU_TABLE_VHT_LENGTH; - i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* config vht20 Power Limit */ - MtPowerLimitFormatTrans( - pAd, pwr->u1PwrLimitVHT20 + i, - token); - } - - /* Rate Info Parsing (VHT40) */ - for (i = 0; i < SINGLE_SKU_TABLE_VHT_LENGTH; - i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* config vht40 Power Limit */ - MtPowerLimitFormatTrans( - pAd, pwr->u1PwrLimitVHT40 + i, - token); - } - - /* if (pwr->StartChannel > 14) */ - if (band == 1) { - /* Rate Info Parsing (VHT80) */ - for (i = 0; - i < SINGLE_SKU_TABLE_VHT_LENGTH; - i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* config vht80 Power Limit */ - MtPowerLimitFormatTrans( - pAd, - pwr->u1PwrLimitVHT80 + - i, - token); - } - - /* Rate Info Parsing (VHT160) */ - for (i = 0; - i < SINGLE_SKU_TABLE_VHT_LENGTH; - i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* config vht160 Power Limit */ - MtPowerLimitFormatTrans( - pAd, - pwr->u1PwrLimitVHT160 + - i, - token); - } - } - -#endif /* DOT11_VHT_AC */ - - /* Tx Stream offset Info Parsing */ - for (i = 0; i < SINGLE_SKU_TABLE_TX_OFFSET_NUM; - i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* parsing order is 3T, 2T, 1T */ - pwr->u1PwrLimitTxStreamDelta[i] = - os_str_tol(token, 0, 10) * 2; - } - - /* Tx Spatial Stream offset Info Parsing */ - for (i = 0; i < SINGLE_SKU_TABLE_NSS_OFFSET_NUM; - i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* parsing order is 1SS, 2SS, 3SS, 4SS */ - pwr->u1PwrLimitTxNSSDelta[i] = - os_str_tol(token, 0, 10) * 2; - } - - /* Create New Data Structure to simpilify the SKU table (Represent together for channels with same rate Info, band Info, Tx Stream offset Info, Tx Spatial stream offset Info) */ - if (!StartCh) { - /* (Begining) assign new pointer head to SKU table contents for this channel */ - StartCh = pwr; - /* add tail for Link list */ - DlListAddTail(&pAd->PwrLimitSkuList, - &pwr->List); - } else { - BOOLEAN fgSameCont = TRUE; - - /* if (pwr->StartChannel <= 14) */ - if (band == 0) { - for (i = 0; - i < - SINGLE_SKU_TABLE_CCK_LENGTH; - i++) { - if (StartCh->u1PwrLimitCCK - [i] != - pwr->u1PwrLimitCCK - [i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - for (i = 0; - i < - SINGLE_SKU_TABLE_OFDM_LENGTH; - i++) { - if (StartCh->u1PwrLimitOFDM - [i] != - pwr->u1PwrLimitOFDM - [i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - for (i = 0; - i < - SINGLE_SKU_TABLE_VHT_LENGTH; - i++) { - if (StartCh->u1PwrLimitVHT20 - [i] != - pwr->u1PwrLimitVHT20 - [i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - for (i = 0; - i < - SINGLE_SKU_TABLE_VHT_LENGTH; - i++) { - if (StartCh->u1PwrLimitVHT40 - [i] != - pwr->u1PwrLimitVHT40 - [i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - for (i = 0; - i < - SINGLE_SKU_TABLE_VHT_LENGTH; - i++) { - if (StartCh->u1PwrLimitVHT80 - [i] != - pwr->u1PwrLimitVHT80 - [i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - for (i = 0; - i < - SINGLE_SKU_TABLE_VHT_LENGTH; - i++) { - if (StartCh->u1PwrLimitVHT160 - [i] != - pwr->u1PwrLimitVHT160 - [i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - for (i = 0; - i < - SINGLE_SKU_TABLE_TX_OFFSET_NUM; - i++) { - if (StartCh->u1PwrLimitTxStreamDelta - [i] != - pwr->u1PwrLimitTxStreamDelta - [i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - for (i = 0; - i < - SINGLE_SKU_TABLE_NSS_OFFSET_NUM; - i++) { - if (StartCh->u1PwrLimitTxNSSDelta - [i] != - pwr->u1PwrLimitTxNSSDelta - [i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - if (StartCh->band != pwr->band) - fgSameCont = FALSE; - } - - /* check similarity of SKU table content for different channel */ - if (fgSameCont) - os_free_mem(pwr); - else { - /* Assign new pointer head to SKU table contents for this channel */ - StartCh = pwr; - /* add tail for Link list */ - DlListAddTail( - &pAd->PwrLimitSkuList, - &StartCh->List); - } - } - - /* Increment total channel counts for channels with same SKU table contents */ - StartCh->num++; - /* allocate memory for channel list with same SKU table contents */ - os_alloc_mem(pAd, (PUCHAR *)&temp, - StartCh->num); - - /* backup non-empty channel list to temp buffer */ - if (NULL != StartCh->Channel) { - /* copy channel list to temp buffer */ - os_move_mem(temp, StartCh->Channel, - StartCh->num - 1); - /* free memory for channel list used before assign pointer of temp memory buffer */ - os_free_mem(StartCh->Channel); - } - - /* assign pointer of temp memory buffer */ - StartCh->Channel = temp; - /* update latest channel number to channel list */ - StartCh->Channel[StartCh->num - 1] = channel; - } - } - } - /* print out Sku table info */ - MtShowSkuTable(pAd, DBG_LVL_INFO); - -#ifdef RF_LOCKDOWN - if (!RF_Lock) -#endif - { - /* close file*/ - retval = os_file_close(srcf); - } -free_resource: - os_free_mem(buffer); - return TRUE; -} - -VOID MtSingleSkuUnloadParam(RTMP_ADAPTER *pAd) -{ - CH_POWER *ch, *ch_temp; - DlListForEachSafe(ch, ch_temp, &pAd->PwrLimitSkuList, CH_POWER, List) - { - DlListDel(&ch->List); - - /* free memory for channel list with same table contents */ - os_free_mem(ch->Channel); - - /* free memory for table contents*/ - os_free_mem(ch); - } -} - -INT MtBfBackOffLoadParam(RTMP_ADAPTER *pAd) -{ - CHAR *buffer; - CHAR *readline, *token; - RTMP_OS_FD_EXT srcf; - INT retval = 0; - CHAR *ptr; - INT index, i; - BACKOFF_POWER *StartCh = NULL; - UCHAR band = 0; - UCHAR channel, *temp; - BACKOFF_POWER *pwr = NULL; - BACKOFF_POWER *ch, *ch_temp; - UCHAR *sku_path = NULL; -#ifdef RF_LOCKDOWN - BOOLEAN RF_Lock = FALSE; -#endif - - DlListInit(&pAd->PwrLimitBackoffList); - /* init*/ - os_alloc_mem(pAd, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE); - - if (buffer == NULL) - return FALSE; - -#ifdef RF_LOCKDOWN - RF_Lock = chip_check_rf_lock_down(pAd); - if (RF_Lock) { - if (IS_MT7615(pAd)) - pAd->CommonCfg.SKUTableIdx = - pAd->EEPROMImage[SINGLE_SKU_TABLE_EFFUSE_ADDRESS] & - BITS(0, 6); - else if (IS_MT7622(pAd)) - pAd->CommonCfg.SKUTableIdx = - pAd->EEPROMImage - [MT7622_SINGLE_SKU_TABLE_EFFUSE_ADDRESS] & - BITS(0, 6); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RF_LOCKDOWN Feature ON !!!\n", __FUNCTION__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: BFBackoff Table index = %d \n", __FUNCTION__, - pAd->CommonCfg.SKUTableIdx)); - /* card information file exists so reading the card information */ - os_zero_mem(buffer, MAX_INI_BUFFER_SIZE); - - switch (pAd->CommonCfg.SKUTableIdx) { - case SKUTABLE_1: - os_move_mem(buffer, BFBackoffvalue_1, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_2: - os_move_mem(buffer, BFBackoffvalue_2, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_3: - os_move_mem(buffer, BFBackoffvalue_3, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_4: - os_move_mem(buffer, BFBackoffvalue_4, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_5: - os_move_mem(buffer, BFBackoffvalue_5, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_6: - os_move_mem(buffer, BFBackoffvalue_6, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_7: - os_move_mem(buffer, BFBackoffvalue_7, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_8: - os_move_mem(buffer, BFBackoffvalue_8, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_9: - os_move_mem(buffer, BFBackoffvalue_9, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_10: - os_move_mem(buffer, BFBackoffvalue_10, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_11: - os_move_mem(buffer, BFBackoffvalue_11, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_12: - os_move_mem(buffer, BFBackoffvalue_12, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_13: - os_move_mem(buffer, BFBackoffvalue_13, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_14: - os_move_mem(buffer, BFBackoffvalue_14, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_15: - os_move_mem(buffer, BFBackoffvalue_15, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_16: - os_move_mem(buffer, BFBackoffvalue_16, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_17: - os_move_mem(buffer, BFBackoffvalue_17, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_18: - os_move_mem(buffer, BFBackoffvalue_18, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_19: - os_move_mem(buffer, BFBackoffvalue_19, - MAX_INI_BUFFER_SIZE); - break; - - case SKUTABLE_20: - os_move_mem(buffer, BFBackoffvalue_20, - MAX_INI_BUFFER_SIZE); - break; - - default: - os_move_mem(buffer, SKUvalue_20, MAX_INI_BUFFER_SIZE); - break; - } - } else -#endif - { - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RF_LOCKDOWN Feature OFF !!!\n", __FUNCTION__)); - /* open card information file*/ - sku_path = get_bf_sku_path(pAd); - if (sku_path && *sku_path) - srcf = os_file_open(sku_path, O_RDONLY, 0); - else - srcf.Status = 1; - - if (srcf.Status) { - /* card information file does not exist */ - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - ("--> Error opening %s\n", sku_path)); - goto free_resource; - } - - /* card information file exists so reading the card information */ - os_zero_mem(buffer, MAX_INI_BUFFER_SIZE); - retval = os_file_read(srcf, buffer, MAX_INI_BUFFER_SIZE); - } - if (retval < 0) { - /* read fail */ - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--> Read %s error %d\n", sku_path, -retval)); - } else { -#ifdef RF_LOCKDOWN - for (readline = ptr = buffer, index = 0; - (((ptr = os_str_chr(readline, '\t')) != NULL) && - RF_Lock) || - (((ptr = os_str_chr(readline, '\n')) != NULL) && !RF_Lock); - readline = ptr + 1, index++) -#else - for (readline = ptr = buffer, index = 0; - (ptr = os_str_chr(readline, '\n')) != NULL; - readline = ptr + 1, index++) -#endif /* RF_LOCKDOWN */ - { - *ptr = '\0'; -#ifdef RF_LOCKDOWN - if (RF_Lock) { - if (readline[0] == '!') - continue; - } else -#endif - { - if (readline[0] == '#') - continue; - } - /* Band Info Parsing */ - if (!strncmp(readline, "Band: ", 6)) { - token = rstrtok(readline + 6, " "); - - /* sanity check for non-Null pointer */ - if (!token) - continue; - - band = (UCHAR)os_str_tol(token, 0, 10); - - if (band == 2) - band = 0; - else if (band == 5) - band = 1; - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, - DBG_LVL_INFO, ("band = %d\n", band)); - } - - /* BF Backoff Info Parsing for each channel */ - if (!strncmp(readline, "Ch", 2)) { - /* Dynamic allocate memory for parsing structure */ - os_alloc_mem(pAd, (UCHAR **)&pwr, sizeof(*pwr)); - /* set default value to 0 for parsing structure */ - os_zero_mem(pwr, sizeof(*pwr)); - token = rstrtok(readline + 2, " "); - - /* sanity check for non-Null pointer */ - if (!token) { - /* free memory buffer before escape this loop */ - os_free_mem(pwr); - /* escape this loop for Null pointer */ - continue; - } - - channel = (UCHAR)os_str_tol(token, 0, 10); - pwr->StartChannel = channel; - pwr->band = band; - - /* BF Backoff Info Parsing */ - for (i = 0; i < 3; i++) { - token = rstrtok(NULL, " "); - - /* sanity check for non-Null pointer */ - if (!token) - break; - - /* config bf power Limit */ - MtPowerLimitFormatTrans( - pAd, pwr->PwrMax + i, token); - } - - /* Create New Data Structure to simpilify the SKU table (Represent together for channels with same BF Backoff Info) */ - if (!StartCh) { - /* (Begining) assign new pointer head to SKU table contents for this channel */ - StartCh = pwr; - /* add tail for Link list */ - DlListAddTail(&pAd->PwrLimitBackoffList, - &pwr->List); - } else { - BOOLEAN fgSameCont = TRUE; - - if (fgSameCont) { - for (i = 0; i < 3; i++) { - if (StartCh->PwrMax[i] != - pwr->PwrMax[i]) { - fgSameCont = - FALSE; - break; - } - } - } - - if (fgSameCont) { - if (StartCh->band != pwr->band) - fgSameCont = FALSE; - } - - /* check similarity of SKU table content for different channel */ - if (fgSameCont) - os_free_mem(pwr); - else { - /* Assign new pointer head to SKU table contents for this channel */ - StartCh = pwr; - /* add tail for Link list */ - DlListAddTail( - &pAd->PwrLimitBackoffList, - &StartCh->List); - } - } - - /* Increment total channel counts for channels with same SKU table contents */ - StartCh->num++; - /* allocate memory for channel list with same SKU table contents */ - os_alloc_mem(pAd, (PUCHAR *)&temp, - StartCh->num); - - /* backup non-empty channel list to temp buffer */ - if (StartCh->Channel != NULL) { - /* copy channel list to temp buffer */ - os_move_mem(temp, StartCh->Channel, - StartCh->num - 1); - /* free memory for channel list used before assign pointer of temp memory buffer */ - os_free_mem(StartCh->Channel); - } - - /* assign pointer of temp memory buffer */ - StartCh->Channel = temp; - /* update latest channel number to channel list */ - StartCh->Channel[StartCh->num - 1] = channel; - } - } - } - DlListForEachSafe(ch, ch_temp, &pAd->PwrLimitBackoffList, BACKOFF_POWER, - List) - { - int i; - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("start ch = %d, ch->num = %d\n", ch->StartChannel, - ch->num)); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Band: %d \n", ch->band)); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Channel: ")); - - for (i = 0; i < ch->num; i++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%d ", ch->Channel[i])); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("\n")); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("Max Power: ")); - - for (i = 0; i < 3; i++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%d ", ch->PwrMax[i])); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, ("\n")); - MTWF_LOG( - DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("-----------------------------------------------------------------\n")); - } -#ifdef RF_LOCKDOWN - if (!RF_Lock) -#endif - { - /* close file*/ - retval = os_file_close(srcf); - } -free_resource: - os_free_mem(buffer); - return TRUE; -} - -VOID MtBfBackOffUnloadParam(RTMP_ADAPTER *pAd) -{ - BACKOFF_POWER *ch, *ch_temp; - DlListForEachSafe(ch, ch_temp, &pAd->PwrLimitBackoffList, BACKOFF_POWER, - List) - { - DlListDel(&ch->List); - - /* free memory for channel list with same table contents */ - os_free_mem(ch->Channel); - - /* free memory for table contents*/ - os_free_mem(ch); - } -} - -VOID MtFillSkuParam(RTMP_ADAPTER *pAd, UINT8 channel, UCHAR Band, - UCHAR TxStream, UINT8 *txPowerSku, UINT8 update_ctrl_ch_pwr) -{ - CH_POWER *ch, *ch_temp; - UCHAR start_ch; - UINT8 i, j; - UINT8 TxOffset = 0; - UCHAR band_local = 0; - - /* -----------------------------------------------------------------------------------------------------------------------*/ - /* This part is due to MtCmdChannelSwitch is not ready for 802.11j and variable channel_band is always 0 */ - /* -----------------------------------------------------------------------------------------------------------------------*/ - - if (channel >= 16) /* must be 5G */ - band_local = 1; - else if ((channel <= 14) && - (channel >= - 8)) /* depends on "channel_band" in MtCmdChannelSwitch */ - band_local = Band; - else if (channel <= 8) /* must be 2.4G */ - band_local = 0; - - DlListForEachSafe(ch, ch_temp, &pAd->PwrLimitSkuList, CH_POWER, List) - { - start_ch = ch->StartChannel; - /* if (channel >= start_ch) */ - /* { */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: channel = %d, start_ch = %d , Band = %d\n", - __func__, channel, start_ch, Band)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ch->num = %d\n", __func__, ch->num)); - - for (j = 0; j < ch->num; j++) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: In for loop, channel = %d, ch->Channel[%d] = %d\n", - __func__, channel, j, ch->Channel[j])); - - if (Band == ch->band) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s: Band check, ch->Channel[%d] = %d\n", - __func__, j, ch->Channel[j])); - - if (channel == ch->Channel[j]) { - for (i = 0; - i < SINGLE_SKU_TABLE_CCK_LENGTH; - i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("CCK[%d]: 0x%x\n", i, - ch->u1PwrLimitCCK[i])); - - for (i = 0; - i < SINGLE_SKU_TABLE_OFDM_LENGTH; - i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("OFDM[%d]: 0x%x\n", i, - ch->u1PwrLimitOFDM[i])); - - for (i = 0; - i < SINGLE_SKU_TABLE_VHT_LENGTH; - i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("VHT20[%d]: 0x%x\n", i, - ch->u1PwrLimitVHT20[i])); - - for (i = 0; - i < SINGLE_SKU_TABLE_VHT_LENGTH; - i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("VHT40[%d]: 0x%x\n", i, - ch->u1PwrLimitVHT40[i])); - - for (i = 0; - i < SINGLE_SKU_TABLE_VHT_LENGTH; - i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("VHT80[%d]: 0x%x\n", i, - ch->u1PwrLimitVHT80[i])); - - for (i = 0; - i < SINGLE_SKU_TABLE_VHT_LENGTH; - i++) - MTWF_LOG(DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("VHT160[%d]: 0x%x\n", - i, - ch->u1PwrLimitVHT160 - [i])); - - for (i = 0; - i < SINGLE_SKU_TABLE_TX_OFFSET_NUM; - i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("TxStreamDelta(%dT): 0x%x (ref to 4T)\n", - (3 - i), - ch->u1PwrLimitTxStreamDelta - [i])); - - for (i = 0; - i < SINGLE_SKU_TABLE_TX_OFFSET_NUM; - i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("TxNSSDelta(%dSS): 0x%x (ref to 4SS)\n", - i, - ch->u1PwrLimitTxNSSDelta - [i])); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("TxStream = %d\n", TxStream)); - - /* check the TxStream 1T/2T/3T/4T*/ - if (TxStream == 1) { - TxOffset = - ch->u1PwrLimitTxStreamDelta - [2]; - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("ch->u1PwrLimitTxStreamDelta[2] = %d\n", - ch->u1PwrLimitTxStreamDelta - [2])); - } else if (TxStream == 2) { - TxOffset = - ch->u1PwrLimitTxStreamDelta - [1]; - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("ch->u1PwrLimitTxStreamDelta[1] = %d\n", - ch->u1PwrLimitTxStreamDelta - [1])); - } else if (TxStream == 3) { - TxOffset = - ch->u1PwrLimitTxStreamDelta - [0]; - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("ch->u1PwrLimitTxStreamDelta[0] = %d\n", - ch->u1PwrLimitTxStreamDelta - [0])); - } else if (TxStream == 4) - TxOffset = 0; - else - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("The TxStream value is invalid.\n")); - - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("TxOffset = %d\n", TxOffset)); - /* Fill in the SKU table for destination channel*/ - txPowerSku[SKU_CCK_1_2] = - ch->u1PwrLimitCCK[0] ? - (ch->u1PwrLimitCCK[0] + - TxOffset) : - 0x3F; - txPowerSku[SKU_CCK_55_11] = - ch->u1PwrLimitCCK[1] ? - (ch->u1PwrLimitCCK[1] + - TxOffset) : - 0x3F; - txPowerSku[SKU_OFDM_6_9] = - ch->u1PwrLimitOFDM[0] ? - (ch->u1PwrLimitOFDM[0] + - TxOffset) : - 0x3F; - txPowerSku[SKU_OFDM_12_18] = - ch->u1PwrLimitOFDM[1] ? - (ch->u1PwrLimitOFDM[1] + - TxOffset) : - 0x3F; - txPowerSku[SKU_OFDM_24_36] = - ch->u1PwrLimitOFDM[2] ? - (ch->u1PwrLimitOFDM[2] + - TxOffset) : - 0x3F; - txPowerSku[SKU_OFDM_48] = - ch->u1PwrLimitOFDM[3] ? - (ch->u1PwrLimitOFDM[3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_OFDM_54] = - ch->u1PwrLimitOFDM[4] ? - (ch->u1PwrLimitOFDM[4] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT20_0_8] = - ch->u1PwrLimitVHT20[0] ? - (ch->u1PwrLimitVHT20[0] + - TxOffset) : - 0x3F; - /*MCS32 is a special rate will chose the max power, normally will be OFDM 6M */ - txPowerSku[SKU_HT20_32] = - ch->u1PwrLimitOFDM[0] ? - (ch->u1PwrLimitOFDM[0] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT20_1_2_9_10] = - ch->u1PwrLimitVHT20[1] ? - (ch->u1PwrLimitVHT20[1] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT20_3_4_11_12] = - ch->u1PwrLimitVHT20[2] ? - (ch->u1PwrLimitVHT20[2] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT20_5_13] = - ch->u1PwrLimitVHT20[3] ? - (ch->u1PwrLimitVHT20[3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT20_6_14] = - ch->u1PwrLimitVHT20[3] ? - (ch->u1PwrLimitVHT20[3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT20_7_15] = - ch->u1PwrLimitVHT20[4] ? - (ch->u1PwrLimitVHT20[4] + - TxOffset) : - 0x3F; - - /*MCS32 is a special rate will chose the max power, normally will be OFDM 6M */ - txPowerSku[SKU_HT40_32] = - ch->u1PwrLimitOFDM[0] ? - (ch->u1PwrLimitOFDM[0] + - TxOffset) : - 0x3F; - - txPowerSku[SKU_VHT20_0] = - ch->u1PwrLimitVHT20[0] ? - (ch->u1PwrLimitVHT20[0] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT20_1_2] = - ch->u1PwrLimitVHT20[1] ? - (ch->u1PwrLimitVHT20[1] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT20_3_4] = - ch->u1PwrLimitVHT20[2] ? - (ch->u1PwrLimitVHT20[2] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT20_5_6] = - ch->u1PwrLimitVHT20[3] ? - (ch->u1PwrLimitVHT20[3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT20_7] = - ch->u1PwrLimitVHT20[4] ? - (ch->u1PwrLimitVHT20[4] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT20_8] = - ch->u1PwrLimitVHT20[5] ? - (ch->u1PwrLimitVHT20[5] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT20_9] = - ch->u1PwrLimitVHT20[6] ? - (ch->u1PwrLimitVHT20[6] + - TxOffset) : - 0x3F; - - if (!update_ctrl_ch_pwr) { - txPowerSku[SKU_HT40_0_8] = - ch->u1PwrLimitVHT40[0] ? - (ch->u1PwrLimitVHT40 - [0] + - TxOffset) : - 0x3F; - - txPowerSku[SKU_HT40_1_2_9_10] = - ch->u1PwrLimitVHT40[1] ? - (ch->u1PwrLimitVHT40 - [1] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT40_3_4_11_12] = - ch->u1PwrLimitVHT40[2] ? - (ch->u1PwrLimitVHT40 - [2] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT40_5_13] = - ch->u1PwrLimitVHT40[3] ? - (ch->u1PwrLimitVHT40 - [3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT40_6_14] = - ch->u1PwrLimitVHT40[3] ? - (ch->u1PwrLimitVHT40 - [3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_HT40_7_15] = - ch->u1PwrLimitVHT40[4] ? - (ch->u1PwrLimitVHT40 - [4] + - TxOffset) : - 0x3F; - - txPowerSku[SKU_VHT40_0] = - ch->u1PwrLimitVHT40[0] ? - (ch->u1PwrLimitVHT40 - [0] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT40_1_2] = - ch->u1PwrLimitVHT40[1] ? - (ch->u1PwrLimitVHT40 - [1] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT40_3_4] = - ch->u1PwrLimitVHT40[2] ? - (ch->u1PwrLimitVHT40 - [2] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT40_5_6] = - ch->u1PwrLimitVHT40[3] ? - (ch->u1PwrLimitVHT40 - [3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT40_7] = - ch->u1PwrLimitVHT40[4] ? - (ch->u1PwrLimitVHT40 - [4] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT40_8] = - ch->u1PwrLimitVHT40[5] ? - (ch->u1PwrLimitVHT40 - [5] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT40_9] = - ch->u1PwrLimitVHT40[6] ? - (ch->u1PwrLimitVHT40 - [6] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT80_0] = - ch->u1PwrLimitVHT80[0] ? - (ch->u1PwrLimitVHT80 - [0] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT80_1_2] = - ch->u1PwrLimitVHT80[1] ? - (ch->u1PwrLimitVHT80 - [1] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT80_3_4] = - ch->u1PwrLimitVHT80[2] ? - (ch->u1PwrLimitVHT80 - [2] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT80_5_6] = - ch->u1PwrLimitVHT80[3] ? - (ch->u1PwrLimitVHT80 - [3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT80_7] = - ch->u1PwrLimitVHT80[4] ? - (ch->u1PwrLimitVHT80 - [4] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT80_8] = - ch->u1PwrLimitVHT80[5] ? - (ch->u1PwrLimitVHT80 - [5] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT80_9] = - ch->u1PwrLimitVHT80[6] ? - (ch->u1PwrLimitVHT80 - [6] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT160_0] = - ch->u1PwrLimitVHT160[0] ? - (ch->u1PwrLimitVHT160 - [0] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT160_1_2] = - ch->u1PwrLimitVHT160[1] ? - (ch->u1PwrLimitVHT160 - [1] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT160_3_4] = - ch->u1PwrLimitVHT160[2] ? - (ch->u1PwrLimitVHT160 - [2] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT160_5_6] = - ch->u1PwrLimitVHT160[3] ? - (ch->u1PwrLimitVHT160 - [3] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT160_7] = - ch->u1PwrLimitVHT160[4] ? - (ch->u1PwrLimitVHT160 - [4] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT160_8] = - ch->u1PwrLimitVHT160[5] ? - (ch->u1PwrLimitVHT160 - [5] + - TxOffset) : - 0x3F; - txPowerSku[SKU_VHT160_9] = - ch->u1PwrLimitVHT160[6] ? - (ch->u1PwrLimitVHT160 - [6] + - TxOffset) : - 0x3F; - txPowerSku[SKU_1SS_Delta] = - ch->u1PwrLimitTxNSSDelta - [0] ? - ch->u1PwrLimitTxNSSDelta - [0] : - 0x0; - txPowerSku[SKU_2SS_Delta] = - ch->u1PwrLimitTxNSSDelta - [1] ? - ch->u1PwrLimitTxNSSDelta - [1] : - 0x0; - txPowerSku[SKU_3SS_Delta] = - ch->u1PwrLimitTxNSSDelta - [2] ? - ch->u1PwrLimitTxNSSDelta - [2] : - 0x0; - txPowerSku[SKU_4SS_Delta] = - ch->u1PwrLimitTxNSSDelta - [3] ? - ch->u1PwrLimitTxNSSDelta - [3] : - 0x0; - } - for (i = 0; i < SKU_TOTAL_SIZE; i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("txPowerSku[%d]: 0x%x\n", - i, txPowerSku[i])); - - break; - } - } - } - - /* } */ - } -} - -VOID MtFillBackoffParam(RTMP_ADAPTER *pAd, UINT8 channel, UCHAR Band, - UINT8 *BFPowerBackOff) -{ - BACKOFF_POWER *ch, *ch_temp; - UCHAR start_ch; - UINT8 i, j; - UCHAR band_local = 0; - - /* -----------------------------------------------------------------------------------------------------------------------*/ - /* This part is due to MtCmdChannelSwitch is not ready for 802.11j and variable channel_band is always 0 */ - /* -----------------------------------------------------------------------------------------------------------------------*/ - - if (channel >= 16) /* must be 5G */ - band_local = 1; - else if ((channel <= 14) && - (channel >= - 8)) /* depends on "channel_band" in MtCmdChannelSwitch */ - band_local = Band; - else if (channel <= 8) /* must be 2.4G */ - band_local = 0; - - DlListForEachSafe(ch, ch_temp, &pAd->PwrLimitBackoffList, BACKOFF_POWER, - List) - { - start_ch = ch->StartChannel; - /* if (channel >= start_ch) */ - /* { */ - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: channel = %d, start_ch = %d , Band = %d\n", - __func__, channel, start_ch, Band)); - MTWF_LOG(DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: ch->num = %d\n", __func__, ch->num)); - - for (j = 0; j < ch->num; j++) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("%s: In for loop, channel = %d, ch->Channel[%d] = %d\n", - __func__, channel, j, ch->Channel[j])); - - if (Band == ch->band) { - MTWF_LOG( - DBG_CAT_FW, DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("%s: Band check, ch->Channel[%d] = %d\n", - __func__, j, ch->Channel[j])); - - if (channel == ch->Channel[j]) { - for (i = 0; i < 3; i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("Max Power[%d]: 0x%x\n", - i, ch->PwrMax[i])); - - /* Fill in the SKU table for destination channel*/ - BFPowerBackOff[0] = - ch->PwrMax[0] ? - (ch->PwrMax[0]) : - 0x3F; - BFPowerBackOff[1] = - ch->PwrMax[1] ? - (ch->PwrMax[1]) : - 0x3F; - BFPowerBackOff[2] = - ch->PwrMax[2] ? - (ch->PwrMax[2]) : - 0x3F; - - for (i = 0; i < 3; i++) - MTWF_LOG( - DBG_CAT_FW, - DBG_SUBCAT_ALL, - DBG_LVL_INFO, - ("BFPowerBackOff[%d]: 0x%x\n", - i, BFPowerBackOff[i])); - - break; - } - } - } - - /* } */ - } -} - -VOID MtShowSkuTable(RTMP_ADAPTER *pAd, UINT8 u1DebugLevel) -{ - UINT8 u1ColIdx; - P_CH_POWER prPwrLimitTbl, prTempPwrLimitTbl; - - MTWF_LOG( - DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("-----------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("SKU table index: %d \n", pAd->CommonCfg.SKUTableIdx)); - - DlListForEachSafe(prPwrLimitTbl, prTempPwrLimitTbl, - &pAd->PwrLimitSkuList, CH_POWER, List) - { - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("start channel: %d, ChListNum: %d\n", - prPwrLimitTbl->StartChannel, prPwrLimitTbl->num)); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("Band: %d \n", prPwrLimitTbl->band)); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("Channel: ")); - for (u1ColIdx = 0; u1ColIdx < prPwrLimitTbl->num; u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", prPwrLimitTbl->Channel[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("CCK: ")); - for (u1ColIdx = 0; u1ColIdx < SINGLE_SKU_TABLE_CCK_LENGTH; - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", - prPwrLimitTbl->u1PwrLimitCCK[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("OFDM: ")); - for (u1ColIdx = 0; u1ColIdx < SINGLE_SKU_TABLE_OFDM_LENGTH; - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", - prPwrLimitTbl->u1PwrLimitOFDM[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("VHT20: ")); - for (u1ColIdx = 0; u1ColIdx < SINGLE_SKU_TABLE_VHT_LENGTH; - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", - prPwrLimitTbl->u1PwrLimitVHT20[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("VHT40: ")); - for (u1ColIdx = 0; u1ColIdx < SINGLE_SKU_TABLE_VHT_LENGTH; - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", - prPwrLimitTbl->u1PwrLimitVHT40[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("VHT80: ")); - for (u1ColIdx = 0; u1ColIdx < SINGLE_SKU_TABLE_VHT_LENGTH; - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", - prPwrLimitTbl->u1PwrLimitVHT80[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("VHT160: ")); - for (u1ColIdx = 0; u1ColIdx < SINGLE_SKU_TABLE_VHT_LENGTH; - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", - prPwrLimitTbl->u1PwrLimitVHT160[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("TxStreamDelta: ")); - for (u1ColIdx = 0; u1ColIdx < SINGLE_SKU_TABLE_TX_OFFSET_NUM; - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", - prPwrLimitTbl - ->u1PwrLimitTxStreamDelta[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("TxNSSDelta: ")); - for (u1ColIdx = 0; u1ColIdx < SINGLE_SKU_TABLE_NSS_OFFSET_NUM; - u1ColIdx++) - MTWF_LOG( - DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", - prPwrLimitTbl->u1PwrLimitTxNSSDelta[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - } - - MTWF_LOG( - DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("-----------------------------------------------------------------\n")); -} - -#else -INT MtPwrLimitLoadParamHandle(RTMP_ADAPTER *pAd, UINT8 u1Type) -{ - PCHAR pi1Buffer; - BOOLEAN fgReadTbl; - PDL_LIST pList; - - /* get pointer of link list address */ - if (POWER_LIMIT_TABLE_TYPE_SKU == u1Type) - pList = &pAd->PwrLimitSkuList; - else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == u1Type) - pList = &pAd->PwrLimitBackoffList; - - /* Link list Init */ - DlListInit(&pAd->pList); - - /* allocate memory for buffer SKU value */ - os_alloc_mem(pAd, (UCHAR **)&pi1Buffer, MAX_INI_BUFFER_SIZE); - - if (!pi1Buffer) - return FALSE; - - /* update buffer with sku table content */ - fgReadTbl = MtReadPwrLimitTable(pAd, pi1Buffer, u1Type); - - if (!fgReadTbl) - goto error; - - /* parsing sku table contents from buffer */ - MtParsePwrLimitTable(pAd, pi1Buffer, u1Type); - - /* print out Sku table info */ - MtShowPwrLimitTable(pAd, u1Type, DBG_LVL_TRACE); - - /* free allocated memory */ - os_free_mem(pi1Buffer); - return TRUE; - -error: - /* free allocated memory */ - os_free_mem(pi1Buffer); - return FALSE; -} - -VOID MtPwrLimitUnloadParamHandle(RTMP_ADAPTER *pAd, UINT8 u1Type) -{ - P_CH_POWER prPwrLimitTbl, prTempPwrLimitTbl; - PDL_LIST pList; - - /* get pointer of link list address */ - if (POWER_LIMIT_TABLE_TYPE_SKU == u1Type) - pList = &pAd->PwrLimitSkuList; - else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == u1Type) - pList = &pAd->PwrLimitBackoffList; - - /* free allocated memory for power limit table */ - if (pAd->fgPwrLimitRead[u1Type]) { - DlListForEachSafe(prPwrLimitTbl, prTempPwrLimitTbl, pList, - CH_POWER, List) - { - /* delete this element link to next element */ - DlListDel(&prPwrLimitTbl->List); - - /* free memory for channel list with same table contents */ - os_free_mem(prPwrLimitTbl->pu1ChList); - - /* free memory for power limit parameters */ - os_free_mem(prPwrLimitTbl->pu1PwrLimit); - - /* free memory for table contents*/ - os_free_mem(prPwrLimitTbl); - } - } - - /* disable flag for Read Power limit table pass */ - pAd->fgPwrLimitRead[u1Type] = FALSE; -} - -VOID MtParsePwrLimitTable(RTMP_ADAPTER *pAd, PCHAR pi1Buffer, UINT8 u1Type) -{ - UINT8 u1ChBand; - PCHAR pcReadline, pcToken, pcptr; - UINT8 u1ColIdx, u1ParamType, u1ParamIdx; - UINT8 u1Channel; - PUINT8 prTempChList; - UINT8 u1PwrLimitParamNum[TABLE_PARSE_TYPE_NUM] = { SINGLE_SKU_PARAM_NUM, - BACKOFF_PARAM_NUM }; - - P_CH_POWER prTbl = NULL, prStartCh = NULL; - - for (pcReadline = pcptr = pi1Buffer; - (pcptr = os_str_chr(pcReadline, '\t')) != NULL; - pcReadline = pcptr + 1) { - *pcptr = '\0'; - - /* Skip Phy mode notation cloumn line */ - if (pcReadline[0] == '#') - continue; - - /* Channel Band Info Parsing */ - if (!strncmp(pcReadline, "Band: ", 6)) { - pcToken = rstrtok(pcReadline + 6, " "); - - /* sanity check for non-Null pointer */ - if (!pcToken) - continue; - - u1ChBand = (UCHAR)os_str_tol(pcToken, 0, 10); - - switch (u1ChBand) { - case 2: - u1ChBand = G_BAND; - break; - case 5: - u1ChBand = A_BAND; - break; - default: - break; - } - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_INFO, - ("ChBand: %s\n", - (G_BAND == u1ChBand) ? "G_BAND" : "A_BAND")); - } - - /* Rate Info Parsing for each u1Channel */ - if (!strncmp(pcReadline, "Ch", 2)) { - /* Dynamic allocate memory for parsing structure */ - os_alloc_mem(pAd, (UCHAR **)&prTbl, sizeof(CH_POWER)); - /* set default value to 0 for parsing structure */ - os_zero_mem(prTbl, sizeof(CH_POWER)); - - /* Dynamic allocate memory for parsing structure power limit paramters */ - os_alloc_mem(pAd, (UCHAR **)&prTbl->pu1PwrLimit, - u1PwrLimitParamNum[u1Type]); - /* set default value to 0 for parsing structure */ - os_zero_mem(prTbl->pu1PwrLimit, - u1PwrLimitParamNum[u1Type]); - - /* */ - pcToken = rstrtok(pcReadline + 2, " "); - - /* sanity check for non-Null pointer */ - if (!pcToken) { - /* free memory buffer of power limit parameters before escape this loop */ - os_free_mem(prTbl->pu1PwrLimit); - /* free total memory buffer before escape this loop */ - os_free_mem(prTbl); - /* escape this loop for Null pointer */ - continue; - } - - u1Channel = (UCHAR)os_str_tol(pcToken, 0, 10); - prTbl->u1StartChannel = u1Channel; - prTbl->u1ChBand = u1ChBand; - - /* Rate Info Parsing (CCK, OFDM, VHT20/40/80/160) */ - MtPwrLimitParse(prTbl->pu1PwrLimit, u1ChBand, u1Type); - - /* Create New Data Structure to simpilify the SKU table (Represent together for channels with same Rate Power Limit Info, Band Info) */ - if (!prStartCh) { - /* (Begining) assign new pointer head to SKU table contents for this u1Channel */ - prStartCh = prTbl; - /* add tail for Link list */ - DlListAddTail(&pAd->PwrLimitSkuList, - &prTbl->List); - } else { - BOOLEAN fgSameCont = TRUE; - - /* check if different info contents for different channel (CCK, OFDM, VHT20/40/80/160) */ - fgSameCont = MtPwrLimitSimilarCheck( - prStartCh->pu1PwrLimit, - prTbl->pu1PwrLimit, u1ChBand, u1Type); - - /* check if different info contents for different channel (channel band) */ - if (fgSameCont) { - if (prStartCh->u1ChBand != - prTbl->u1ChBand) - fgSameCont = FALSE; - } - - /* check similarity of SKU table content for different u1Channel */ - if (fgSameCont) { - os_free_mem(prTbl->pu1PwrLimit); - os_free_mem(prTbl); - } else { - /* Assign new pointer head to SKU table contents for this u1Channel */ - prStartCh = prTbl; - /* add tail for Link list */ - DlListAddTail(&pAd->PwrLimitSkuList, - &prStartCh->List); - } - } - - /* Increment total u1Channel counts for channels with same SKU table contents */ - prStartCh->u1ChNum++; - /* allocate memory for u1Channel list with same SKU table contents */ - os_alloc_mem(pAd, (PUCHAR *)&prTempChList, - prStartCh->u1ChNum); - - /* backup non-empty u1Channel list to prTempChList buffer */ - if (prStartCh->pu1ChList) { - /* copy u1Channel list to prTempChList buffer */ - os_move_mem(prTempChList, prStartCh->pu1ChList, - prStartCh->u1ChNum - 1); - /* free memory for u1Channel list used before assign pointer of prTempChList memory buffer */ - os_free_mem(prStartCh->pu1ChList); - } - - /* assign pointer of prTempChList memory buffer */ - prStartCh->pu1ChList = prTempChList; - /* update latest u1Channel number to u1Channel list */ - prStartCh->pu1ChList[prStartCh->u1ChNum - 1] = - u1Channel; - } - } -} - -BOOLEAN MtReadPwrLimitTable(RTMP_ADAPTER *pAd, PCHAR pi1Buffer, UINT8 u1Type) -{ - RTMP_OS_FD_EXT srcfile; - PUCHAR pcptrSkuTbl[TABLE_SIZE] = { - SKUvalue_1, SKUvalue_2, SKUvalue_3, SKUvalue_4, SKUvalue_5, - SKUvalue_6, SKUvalue_7, SKUvalue_8, SKUvalue_9, SKUvalue_10, - SKUvalue_11, SKUvalue_12, SKUvalue_13, SKUvalue_14, SKUvalue_15, - SKUvalue_16, SKUvalue_17, SKUvalue_18, SKUvalue_19, SKUvalue_20 - }; - - PUCHAR pcptrBackoffTbl[TABLE_SIZE] = { - BFBackoffvalue_1, BFBackoffvalue_2, BFBackoffvalue_3, - BFBackoffvalue_4, BFBackoffvalue_5, BFBackoffvalue_6, - BFBackoffvalue_7, BFBackoffvalue_8, BFBackoffvalue_9, - BFBackoffvalue_10, BFBackoffvalue_11, BFBackoffvalue_12, - BFBackoffvalue_13, BFBackoffvalue_14, BFBackoffvalue_15, - BFBackoffvalue_16, BFBackoffvalue_17, BFBackoffvalue_18, - BFBackoffvalue_19, BFBackoffvalue_20 - }; - - UCHAR *sku_path = NULL; - -#ifdef RF_LOCKDOWN - pAd->CommonCfg.SKUTableIdx = - pAd->EEPROMImage[SINGLE_SKU_TABLE_EFFUSE_ADDRESS] & BITS(0, 6); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (KBLU "%s: RF_LOCKDOWN Feature ON !!!\n" KNRM, __FUNCTION__)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - (KBLU "%s: SKU Table index: %d\n" KNRM, __FUNCTION__, - pAd->CommonCfg.SKUTableIdx)); - - /* init bufer for Sku table */ - os_zero_mem(pi1Buffer, MAX_INI_BUFFER_SIZE); - - /* update buffer with sku table content */ - if (POWER_LIMIT_TABLE_TYPE_SKU == u1Type) - os_move_mem(pi1Buffer, pcptrSkuTbl[pAd->CommonCfg.SKUTableIdx], - MAX_INI_BUFFER_SIZE); - else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == u1Type) - os_move_mem(pi1Buffer, - pcptrBackoffTbl[pAd->CommonCfg.SKUTableIdx], - MAX_INI_BUFFER_SIZE); -#else - - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: RF_LOCKDOWN Feature OFF !!!\n", __FUNCTION__)); - - /* open Sku table file */ - if (u1Type == POWER_LIMIT_TABLE_TYPE_SKU) - sku_path = get_single_sku_path(pAd); - else if (u1Type == POWER_LIMIT_TABLE_TYPE_BACKOFF) - sku_path = get_bf_sku_path(pAd); - - if (sku_path && *sku_path) - srcfile = os_file_open(sku_path, O_RDONLY, 0); - else - srcfile.Status = 1; - - if (srcfile.Status) { - /* card information file does not exist */ - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - ("--> Error opening file <%s>\n", sku_path)); - return FALSE; - } - - /* Read Sku table file */ - os_zero_mem(pi1Buffer, MAX_INI_BUFFER_SIZE); - - if (os_file_read(srcfile, pi1Buffer, MAX_INI_BUFFER_SIZE) < 0) { - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KRED "--> Error read <%s>\n" KNRM, sku_path)); - return FALSE; - } - - /* close Sku table file */ - if (os_file_close(srcfile) < 0) { - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_ERROR, - (KRED "--> Error close <%s>\n" KNRM, sku_path)); - return FALSE; - } -#endif - - return TRUE; -} - -VOID MtPwrFillLimitParam(RTMP_ADAPTER *pAd, UINT8 u1Channel, UINT8 ChBand, - PINT8 pi1PwrLimitParam, UINT8 u1Type) -{ - UINT8 u1RateIdx, u1FillParamType, u1ParamIdx, u1ParamIdx2, u1ChListIdx; - PUINT8 pu1FillParamTypeLen = NULL; - P_CH_POWER prPwrLimitTbl, prTempPwrLimitTbl; - UINT8 u1TypeFillNum[TABLE_PARSE_TYPE_NUM] = { SINGLE_SKU_TYPE_NUM, - BACKOFF_TYPE_NUM }; - - /* get pointer of parameter type length array and Need Parse check */ - if (POWER_LIMIT_TABLE_TYPE_SKU == u1Type) - pu1FillParamTypeLen = pAd->u1SkuFillParamLen; - else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == u1Type) - pu1FillParamTypeLen = pAd->u1BackoffFillParamLen; - else - return; - - DlListForEachSafe(prPwrLimitTbl, prTempPwrLimitTbl, - &pAd->PwrLimitSkuList, CH_POWER, List) - { - /* search for specific channel */ - for (u1ChListIdx = 0; u1ChListIdx < prPwrLimitTbl->u1ChNum; - u1ChListIdx++) { - /* check Channel Band and Channel */ - if ((ChBand == prPwrLimitTbl->u1ChBand) && - (u1Channel == - prPwrLimitTbl->pu1ChList[u1ChListIdx])) { - /* Fill in Sku parameter for CCK, OFDM, HT20/40, VHT20/40/80/160 */ - for (u1FillParamType = 0, u1ParamIdx = 0, - u1ParamIdx2 = 0; - u1FillParamType < u1TypeFillNum[u1Type]; - u1FillParamType++, - u1ParamIdx += - *(pu1FillParamTypeLen + u1FillParamType)) { - for (u1RateIdx = 0; - u1RateIdx < *(pu1FillParamTypeLen + - u1FillParamType); - u1RateIdx++) { - *(pi1PwrLimitParam + u1RateIdx + - u1ParamIdx) = - (prPwrLimitTbl->pu1PwrLimit + u1RateIdx + u1ParamIdx2) ?: - (prPwrLimitTbl - ->pu1PwrLimit + - u1RateIdx + - u1ParamIdx2) - : (0x3F); - } - - /* Not increment index for Power limit paramter for HT20/40 */ - if (POWER_LIMIT_TABLE_TYPE_SKU == - u1Type) { - if ((u1FillParamType != - SINGLE_SKU_TABLE_HT20) && - (u1FillParamType != - SINGLE_SKU_TABLE_HT40)) - u1ParamIdx2 += *( - pu1FillParamTypeLen + - u1FillParamType); - } else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == - u1Type) { - if ((u1FillParamType != - BACKOFF_TABLE_BF_OFF_HT20) && - (u1FillParamType != - BACKOFF_TABLE_BF_ON_HT20) && - (u1FillParamType != - BACKOFF_TABLE_BF_OFF_HT40) && - (u1FillParamType != - BACKOFF_TABLE_BF_ON_HT40)) - u1ParamIdx2 += *( - pu1FillParamTypeLen + - u1FillParamType); - } - } - - /* stop channel list search loop */ - break; - } - } - } -} - -VOID MtPwrLimitParse(PUINT pi1PwrLimitNewCh, UINT8 u1ChBand, UINT8 u1Type) -{ - UINT8 u1ColIdx, u1ParamType, u1ParamIdx; - PINT8 pu1ParamTypeLen, pu1ChBandNeedParse; - PCHAR pcToken; - UINT8 u1TypeParseNum[TABLE_PARSE_TYPE_NUM] = { - SINGLE_SKU_TYPE_PARSE_NUM, BACKOFF_TYPE_PARSE_NUM - }; - - /* get pointer of parameter type length array and Need Parse check */ - if (POWER_LIMIT_TABLE_TYPE_SKU == u1Type) { - pu1ParamTypeLen = pAd->u1SkuParameLen; - pu1ChBandNeedParse = pAd->u1SkuChBandNeedParse; - } else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == u1Type) { - pu1ParamTypeLen = pAd->u1BackoffParamLen; - pu1ChBandNeedParse = pAd->u1BackoffChBandNeedParse; - } - - /* check if different info contents for different channel (CCK, OFDM, VHT20/40/80/160) */ - for (u1ParamType = 0, u1ParamIdx = 0; - u1ParamType < u1TypeParseNum[u1Type]; - u1ParamType++, u1ParamIdx += *(pu1ParamTypeLen + u1ParamType)) { - /* check if need to parse for specific channel band */ - if (*(pu1ChBandNeedParse + u1ParamType) & (u1ChBand + 1)) { - for (u1ColIdx = 0; - u1ColIdx < *(pu1ParamTypeLen + u1ParamType); - u1ColIdx++) { - /* toker update for next character parsing */ - pcToken = rstrtok(NULL, " "); - - if (pcToken) - *(pi1PwrLimitNewCh + u1ColIdx + - u1ParamIdx) = - os_str_tol(pcToken, 0, 10); - else - break; - } - } - } -} - -BOOLEAN MtPwrLimitSimilarCheck(PUINT pi1PwrLimitStartCh, PUINT pi1PwrLimitNewCh, - UINT8 u1ChBand, UINT8 u1Type) -{ - UINT8 u1ColIdx, u1ParamType, u1ParamIdx; - PINT8 pu1ParamTypeLen, pu1ChBandNeedParse; - BOOLEAN fgSameContent = TRUE; - UINT8 u1TypeParseNum[TABLE_PARSE_TYPE_NUM] = { - SINGLE_SKU_TYPE_PARSE_NUM, BACKOFF_TYPE_PARSE_NUM - }; - - /* get pointer of parameter type length array and Need Parse check */ - if (POWER_LIMIT_TABLE_TYPE_SKU == u1Type) { - pu1ParamTypeLen = pAd->u1SkuParameLen; - pu1ChBandNeedParse = pAd->u1SkuChBandNeedParse; - } else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == u1Type) { - pu1ParamTypeLen = pAd->u1BackoffParamLen; - pu1ChBandNeedParse = pAd->u1BackoffChBandNeedParse; - } - - /* check if different info contents for different channel (CCK, OFDM, VHT20/40/80/160) */ - for (u1ParamType = 0, u1ParamIdx = 0; - u1ParamType < u1TypeParseNum[u1Type]; - u1ParamType++, u1ParamIdx += *(pu1ParamTypeLen + u1ParamType)) { - /* check if need to parse for specific channel band */ - if (*(pu1ChBandNeedParse + u1ParamType) & (u1ChBand + 1)) { - for (u1ColIdx = 0; - u1ColIdx < *(pu1ParamTypeLen + u1ParamType); - u1ColIdx++) { - if (*(pi1PwrLimitStartCh + u1ColIdx + - u1ParamIdx) != *(pi1PwrLimitNewCh + - u1ColIdx + u1ParamIdx)) { - fgSameContent = FALSE; - return fgSameContent; - } - } - } - } - - return fgSameContent; -} - -VOID MtShowPwrLimitTable(RTMP_ADAPTER *pAd, UINT8 u1Type, UINT8 u1DebugLevel) -{ - PDL_LIST pList; - UINT8 u1ColIdx, u1ParamType, u1ParamIdx; - PINT8 pu1ParamTypeLen; - P_CH_POWER prPwrLimitTbl, prTempPwrLimitTbl; - UINT8 u1TypeParseNum[TABLE_PARSE_TYPE_NUM] = { - SINGLE_SKU_TYPE_PARSE_NUM, BACKOFF_TYPE_PARSE_NUM - }; - CHAR cSkuParseTypeName[SINGLE_SKU_TYPE_PARSE_NUM][7] = { - "CCK", "OFDM", "VHT20", "VHT40", "VHT80", "VHT160" - }; - CHAR cBackoffParseTypeName[BACKOFF_TYPE_PARSE_NUM][14] = { - "BFOFF_CCK", "BF_OFF_OFDM", "BF_ON_OFDM", "BF_OFF_VHT20", - "BF_ON_VHT20", "BF_OFF_VHT40", "BF_ON_VHT40", "BF_OFF_VHT80", - "BF_ON_VHT80", "BF_OFF_VHT160", "BF_ON_VHT160" - }; - - /* get pointer of parameter type length array */ - if (POWER_LIMIT_TABLE_TYPE_SKU == u1Type) { - pu1ParamTypeLen = pAd->u1SkuParameLen; - pList = &pAd->PwrLimitSkuList; - } else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == u1Type) { - pu1ParamTypeLen = pAd->u1BackoffParamLen; - pList = &pAd->PwrLimitBackoffList; - } - - MTWF_LOG( - DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("-----------------------------------------------------------------\n")); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("SKU table index: %d \n", pAd->CommonCfg.SKUTableIdx)); - - DlListForEachSafe(prPwrLimitTbl, prTempPwrLimitTbl, pList, CH_POWER, - List) - { - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("start channel: %d, ChListNum: %d\n", - prPwrLimitTbl->u1StartChannel, - prPwrLimitTbl->u1ChNum)); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("Band: %d \n", prPwrLimitTbl->u1ChBand)); - - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("Channel: ")); - for (u1ColIdx = 0; u1ColIdx < prPwrLimitTbl->u1ChNum; - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("%d ", prPwrLimitTbl->pu1ChList[u1ColIdx])); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, ("\n")); - - /* check if different info contents for different channel (CCK, OFDM, VHT20/40/80/160) */ - for (u1ParamType = 0, u1ParamIdx = 0; - u1ParamType < u1TypeParseNum[u1Type]; u1ParamType++, - u1ParamIdx += *(pu1ParamTypeLen + u1ParamType)) { - if (POWER_LIMIT_TABLE_TYPE_SKU == u1Type) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, - u1DebugLevel, - ("%s: ", - cSkuParseTypeName[u1ParamType])); - else if (POWER_LIMIT_TABLE_TYPE_BACKOFF == u1Type) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, - u1DebugLevel, - ("%s: ", - cBackoffParseTypeName[u1ParamType])); - - for (u1ColIdx = 0; - u1ColIdx < *(pu1ParamTypeLen + u1ParamType); - u1ColIdx++) - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, - u1DebugLevel, - ("%d ", *(prPwrLimitTbl->pu1PwrLimit + - u1ColIdx + u1ParamIdx))); - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("\n")); - } - } - - MTWF_LOG( - DBG_CAT_POWER, DBG_SUBCAT_ALL, u1DebugLevel, - ("-----------------------------------------------------------------\n")); -} -#endif /* defined(MT7615) || defined(MT7622) */ - -NDIS_STATUS MtPowerLimitFormatTrans(RTMP_ADAPTER *pAd, PUINT8 pu1Value, - PCHAR pcRawData) -{ - CHAR *cBuffer = NULL; - CHAR *cToken = NULL; - UINT8 u1NonInteValue = 0; - - /* sanity check for null pointer */ - if (!pu1Value) - goto error1; - - /* sanity check for null poitner */ - if (!pcRawData) - goto error2; - - /* neglect multiple spaces for content parsing */ - pcRawData += strspn(pcRawData, " "); - - /* decimal point existence check */ - if (!strchr(pcRawData, '.')) - *pu1Value = (UINT8)os_str_tol(pcRawData, 0, 10) * 2; - else { - /* backup pointer to string of parser function */ - cBuffer = __rstrtok; - - /* parse integer part */ - cToken = rstrtok(pcRawData, "."); - - /* sanity check for null pointer */ - if (!cToken) - goto error3; - - /* transform integer part unit to (0.5) */ - *pu1Value = (UINT8)os_str_tol(cToken, 0, 10) * 2; - - /* parse non-integer part */ - cToken = rstrtok(NULL, "."); - - /* sanity check for null pointer */ - if (!cToken) - goto error4; - - /* get non-integer part */ - u1NonInteValue = (UINT8)os_str_tol(cToken, 0, 10); - - /* increment for non-zero non-integer part */ - if (u1NonInteValue >= 5) - (*pu1Value) += 1; - - /* backup pointer to string of parser function */ - __rstrtok = cBuffer; - } - - return NDIS_STATUS_SUCCESS; - -error1: - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: null pointer for buffer to update transform result !!\n", - __func__)); - return NDIS_STATUS_FAILURE; - -error2: - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: null pointer for raw data buffer !!\n", __func__)); - return NDIS_STATUS_FAILURE; - -error3: - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: null pointer for integer value parsing !!\n", __func__)); - return NDIS_STATUS_FAILURE; - -error4: - MTWF_LOG(DBG_CAT_POWER, DBG_SUBCAT_ALL, DBG_LVL_OFF, - ("%s: null pointer for decimal value parsing !!\n", __func__)); - return NDIS_STATUS_FAILURE; -} - -CHAR SKUTxPwrOffsetGet(RTMP_ADAPTER *pAd, UINT8 ucBandIdx, UINT8 ucBW, - UINT8 ucPhymode, UINT8 ucMCS, UINT8 ucNss, BOOLEAN fgSE) -{ - CHAR cPowerOffset = 0; - UINT8 ucRateOffset = 0; - UINT8 ucNSS = 0; - UINT8 BW_OFFSET[4] = { VHT20_OFFSET, VHT40_OFFSET, VHT80_OFFSET, - VHT160C_OFFSET }; -#ifdef CONFIG_ATE - struct _ATE_CTRL *ATECtrl = &(pAd->ATECtrl); -#endif - - /* Compute MCS rate and Nss for HT mode */ - if ((ucPhymode == MODE_HTMIX) || (ucPhymode == MODE_HTGREENFIELD)) { - ucNss = (ucMCS >> 3) + 1; - ucMCS &= 0x7; - } - - switch (ucPhymode) { - case MODE_CCK: - ucRateOffset = SKU_CCK_OFFSET; - - switch (ucMCS) { - case MCS_0: - case MCS_1: - ucRateOffset = SKU_CCK_RATE_M01; - break; - - case MCS_2: - case MCS_3: - ucRateOffset = SKU_CCK_RATE_M23; - break; - - default: - break; - } - - break; - - case MODE_OFDM: - ucRateOffset = SKU_OFDM_OFFSET; - - switch (ucMCS) { - case MCS_0: - case MCS_1: - ucRateOffset = SKU_OFDM_RATE_M01; - break; - - case MCS_2: - case MCS_3: - ucRateOffset = SKU_OFDM_RATE_M23; - break; - - case MCS_4: - case MCS_5: - ucRateOffset = SKU_OFDM_RATE_M45; - break; - - case MCS_6: - ucRateOffset = SKU_OFDM_RATE_M6; - break; - - case MCS_7: - ucRateOffset = SKU_OFDM_RATE_M7; - break; - - default: - break; - } - - break; - - case MODE_HTMIX: - case MODE_HTGREENFIELD: - ucRateOffset = SKU_HT_OFFSET + BW_OFFSET[ucBW]; - - switch (ucMCS) { - case MCS_0: - ucRateOffset += SKU_HT_RATE_M0; - break; - - case MCS_1: - case MCS_2: - ucRateOffset += SKU_HT_RATE_M12; - break; - - case MCS_3: - case MCS_4: - ucRateOffset += SKU_HT_RATE_M34; - break; - - case MCS_5: - ucRateOffset += SKU_HT_RATE_M5; - break; - - case MCS_6: - ucRateOffset += SKU_HT_RATE_M6; - break; - - case MCS_7: - ucRateOffset += SKU_HT_RATE_M7; - break; - } - - break; - - case MODE_VHT: - ucRateOffset = SKU_VHT_OFFSET + BW_OFFSET[ucBW]; - - switch (ucMCS) { - case MCS_0: - ucRateOffset += SKU_VHT_RATE_M0; - break; - - case MCS_1: - case MCS_2: - ucRateOffset += SKU_VHT_RATE_M12; - break; - - case MCS_3: - case MCS_4: - ucRateOffset += SKU_VHT_RATE_M34; - break; - - case MCS_5: - case MCS_6: - ucRateOffset += SKU_VHT_RATE_M56; - break; - - case MCS_7: - ucRateOffset += SKU_VHT_RATE_M7; - break; - - case MCS_8: - ucRateOffset += SKU_VHT_RATE_M8; - break; - - case MCS_9: - ucRateOffset += SKU_VHT_RATE_M9; - break; - - default: - break; - } - - break; - } - - /* Update Power offset by look up Tx Power Compensation Table */ - cPowerOffset = - (fgSE) ? (pAd->CommonCfg - .cTxPowerCompBackup[ucBandIdx][ucRateOffset] - [ucNSS - 1]) : - (pAd->CommonCfg.cTxPowerCompBackup[ucBandIdx] - [ucRateOffset][3]); - - /* Debug log for SKU Power offset to compensate */ - MTWF_LOG( - DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (KBLU - "%s: ucBW: %d, ucPhymode: %d, ucMCS: %d, ucNss: %d, fgSPE: %d !!!\n" KNRM, - __func__, ucBW, ucPhymode, ucMCS, ucNss, fgSE)); - MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, - (KBLU "%s: cPowerOffset: 0x%x (%d) !!!\n" KNRM, __func__, - cPowerOffset, cPowerOffset)); - -#ifdef CONFIG_ATE - /* Check if Single SKU is disabled */ - if (!ATECtrl->fgTxPowerSKUEn) - cPowerOffset = 0; -#endif - return cPowerOffset; -} - -#endif /* SINGLE_SKU_V2 */ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_1.dat b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_1.dat deleted file mode 100644 index 9603fa11e7..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_1.dat +++ /dev/null @@ -1,65 +0,0 @@ -# Single SKU Max Power Table -# 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta -Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T -Ch1 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch2 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch3 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch4 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch5 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch6 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch7 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch8 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch9 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch10 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch11 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch12 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch13 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch14 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 - -# 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta -Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T -Ch184 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch188 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch192 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch196 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch8 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch12 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch16 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch36 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch40 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch44 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 17 17 17 17 17 17 17 25 25 25 25 25 25 25 0 0 0 -Ch48 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch52 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch56 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch60 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch64 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch68 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch72 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch76 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch80 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch84 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch88 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch92 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch96 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch100 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch104 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch108 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch112 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch116 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch120 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch124 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch128 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch132 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch136 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch140 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch144 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch149 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch153 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch157 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 18 18 18 18 18 18 18 25 25 25 25 25 25 25 0 0 0 -Ch161 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch165 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch169 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch173 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch177 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 -Ch181 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 0 0 0 - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_BF_1.dat b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_BF_1.dat deleted file mode 100644 index 689fef5390..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_BF_1.dat +++ /dev/null @@ -1,71 +0,0 @@ -# Single SKU Max Power Table (unit is 1 dBm) -# 2.4G Channel -Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T -Ch1 25 25 25 -Ch2 25 25 25 -Ch3 25 25 25 -Ch4 25 25 25 -Ch5 25 25 25 -Ch6 25 25 25 -Ch7 25 25 25 -Ch8 25 25 25 -Ch9 25 25 25 -Ch10 25 25 25 -Ch11 25 25 25 -Ch12 25 25 25 -Ch13 25 25 25 -Ch14 25 25 25 - -# 5G Channel -Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T -Ch184 25 25 25 -Ch188 25 25 25 -Ch192 25 25 25 -Ch196 25 25 25 -Ch8 25 25 25 -Ch12 25 25 25 -Ch16 25 25 25 -Ch36 25 25 25 -Ch40 25 25 25 -Ch44 25 25 25 -Ch48 25 25 25 -Ch52 25 25 25 -Ch56 25 25 25 -Ch60 25 25 25 -Ch64 25 25 25 -Ch68 25 25 25 -Ch72 25 25 25 -Ch76 25 25 25 -Ch80 25 25 25 -Ch84 25 25 25 -Ch88 25 25 25 -Ch92 25 25 25 -Ch96 25 25 25 -Ch100 25 25 25 -Ch104 25 25 25 -Ch108 25 25 25 -Ch112 25 25 25 -Ch116 25 25 25 -Ch120 25 25 25 -Ch124 25 25 25 -Ch128 25 25 25 -Ch132 25 25 25 -Ch136 25 25 25 -Ch140 25 25 25 -Ch144 25 25 25 -Ch149 25 25 25 -Ch153 25 25 25 -Ch157 25 25 25 -Ch161 25 25 25 -Ch165 25 25 25 -Ch169 25 25 25 -Ch173 25 25 25 -Ch177 25 25 25 -Ch181 25 25 25 - - - - - - - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_BF_default.dat b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_BF_default.dat deleted file mode 100644 index cf75d3d39b..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_BF_default.dat +++ /dev/null @@ -1,71 +0,0 @@ -# Single SKU Max Power Table (unit is 1 dBm) -# 2.4G Channel -Band: 2.4G MaxPower_4T MaxPower_3T MaxPower_2T -Ch1 30 30 30 -Ch2 30 30 30 -Ch3 30 30 30 -Ch4 30 30 30 -Ch5 30 30 30 -Ch6 30 30 30 -Ch7 30 30 30 -Ch8 30 30 30 -Ch9 30 30 30 -Ch10 30 30 30 -Ch11 30 30 30 -Ch12 30 30 30 -Ch13 30 30 30 -Ch14 30 30 30 - -# 5G Channel -Band: 5G MaxPower_4T MaxPower_3T MaxPower_2T -Ch184 30 30 30 -Ch188 30 30 30 -Ch192 30 30 30 -Ch196 30 30 30 -Ch8 30 30 30 -Ch12 30 30 30 -Ch16 30 30 30 -Ch36 30 30 30 -Ch40 30 30 30 -Ch44 30 30 30 -Ch48 30 30 30 -Ch52 30 30 30 -Ch56 30 30 30 -Ch60 30 30 30 -Ch64 30 30 30 -Ch68 30 30 30 -Ch72 30 30 30 -Ch76 30 30 30 -Ch80 30 30 30 -Ch84 30 30 30 -Ch88 30 30 30 -Ch92 30 30 30 -Ch96 30 30 30 -Ch100 30 30 30 -Ch104 30 30 30 -Ch108 30 30 30 -Ch112 30 30 30 -Ch116 30 30 30 -Ch120 30 30 30 -Ch124 30 30 30 -Ch128 30 30 30 -Ch132 30 30 30 -Ch136 30 30 30 -Ch140 30 30 30 -Ch144 30 30 30 -Ch149 30 30 30 -Ch153 30 30 30 -Ch157 30 30 30 -Ch161 30 30 30 -Ch165 30 30 30 -Ch169 30 30 30 -Ch173 30 30 30 -Ch177 30 30 30 -Ch181 30 30 30 - - - - - - - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_default.dat b/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_default.dat deleted file mode 100644 index b26ca79e51..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi/txpwr/sku_tables/7615_SingleSKU_default.dat +++ /dev/null @@ -1,65 +0,0 @@ -# Single SKU Max Power Table -# 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta -Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T -Ch1 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch2 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch3 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch4 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch5 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch6 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch7 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch9 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch10 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch11 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch13 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch14 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 - -# 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta -Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T -Ch184 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch188 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch192 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch196 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch12 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch16 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch40 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch44 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch48 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch56 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch60 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch64 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch68 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch76 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch80 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch84 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch88 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch92 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch96 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch100 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch104 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch108 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch112 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch116 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch120 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch124 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch128 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch132 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch136 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch140 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch144 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch149 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch153 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch157 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch161 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch165 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch169 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch173 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch177 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 -Ch181 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0 0 0 - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi_ap/Kconfig b/package/kernel/mt-drivers/mt7615d/src/mt_wifi_ap/Kconfig deleted file mode 100644 index d24e58e321..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi_ap/Kconfig +++ /dev/null @@ -1,384 +0,0 @@ -config MT_AP_SUPPORT - tristate "MTK AP support" -# depends on NET_RADIO - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config WDS_SUPPORT - bool "WDS" - depends on MT_AP_SUPPORT - default y - -config WIFI_EAP_FEATURE - bool "EAP Feature" - depends on WIFI_DRIVER - default y - -config VLAN_SUPPORT - bool "VLAN Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MLME_MULTI_QUEUE_SUPPORT - bool "Mlme Multi Queue Support" - default n - -config TXRX_STAT_SUPPORT - bool "TxRx Stats Support" - depends on WIFI_DRIVER && WIFI_EAP_FEATURE - default y - -config SNIFFER_SUPPORT - bool "SNIFFER" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config ANTENNA_CONTROL_SUPPORT - bool "Antenna Control" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MGMT_TXPWR_CTRL - bool "Mgmt TxPower Control" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config CHUTIL_SUPPORT - bool "Channel Utilization Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config NF_SUPPORT - bool "Noise Floor Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config RA_PHY_RATE_SUPPORT - bool "RA PHY RATE Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config AMPDU_CONF_SUPPORT - bool "AMPDU Config retry & agglimit Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config ACK_CTS_TIMEOUT_SUPPORT - bool "ACK CTS Timeout cck & ofdm Support" - depends on MT_AP_SUPPORT && WIFI_EAP_FEATURE - default y - -config MBSS_SUPPORT - bool "MBSSID" - depends on MT_AP_SUPPORT - default y - -#config NEW_MBSSID_MODE -# bool "New MBSSID MODE" -# depends on MT_AP_SUPPORT && MBSS_SUPPORT -# depends on RALINK_RT3883 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352 || RALINK_MT7620 -# default y - -#config ENHANCE_NEW_MBSSID_MODE -# bool "Enhanced MBSSID mode" -# depends on NEW_MBSSID_MODE -# default y - -config APCLI_SUPPORT - bool "AP-Client Support" - depends on MT_AP_SUPPORT - default y - -config APCLI_CERT_SUPPORT - bool "AP-Client TGn Cert Support" - depends on MT_AP_SUPPORT - depends on APCLI_SUPPORT - default n - -config MAC_REPEATER_SUPPORT - bool "MAC Repeater Support" - depends on MT_AP_SUPPORT - depends on APCLI_SUPPORT - depends on RALINK_RT6352 || RALINK_MT7620 || RALINK_MT7603E || MT_AP_SUPPORT - default y - -config MWDS - bool "Mixed WDS(MWDS)" - depends on MT_AP_SUPPORT - select APCLI_SUPPORT - default n - -config MUMIMO_SUPPORT - bool "MU-MIMO Support" - depends on WIFI_DRIVER - select MU_RA_SUPPORT - default y - -config MU_RA_SUPPORT - bool "MU-RGA Support" - depends on MUMIMO_SUPPORT - -config DOT11R_FT_SUPPORT - bool "802.11r Fast BSS Transition" - depends on MT_AP_SUPPORT - default n - -config DOT11K_RRM_SUPPORT - bool "802.11k Radio Resource Management" - depends on MT_AP_SUPPORT - default n - -config INTERWORKING - bool "802.11u Interworking/Gas Support" - depends on MT_AP_SUPPORT - default n - -config MAP_SUPPORT - bool "Multi-AP Support" - depends on MT_AP_SUPPORT - select MBO_SUPPORT - default n - -config MAP_R2_VER_SUPPORT - bool "Multi-AP R2 version support" - depends on MAP_SUPPORT - default n - -config OFFCHANNEL_SCAN_FEATURE - bool "Channel Quality Monitor" - depends on MT_AP_SUPPORT - default y - -config OCE_SUPPORT - bool "Optimized Connectivity Experience Support" - depends on MT_AP_SUPPORT - depends on CHIP_MT7615E - select WAPP_SUPPORT - default y - -config DPP_FEATURE - bool "DPP Support" - depends on MT_AP_SUPPORT - depends on WIFI_DRIVER - default n - -config ENTERPRISE_AP_SUPPORT - bool "Enterprise AP Support" - depends on MT_AP_SUPPORT - default n - -config DYNAMIC_VLAN_SUPPORT - bool "Dynamic VLAN Support" - depends on MT_AP_SUPPORT - depends on ENTERPRISE_AP_SUPPORT - default n - -config CFG80211_SUPPORT - bool "CFG80211" - depends on MT_AP_SUPPORT - default n - -#CUSTOMISED HOSTAPD -config CUSTOMISED_HOSTAPD_SUPPORT - bool "Customised Hostapd Support" - depends on MT_AP_SUPPORT - depends on CFG80211_SUPPORT - default n - -#APCLI STA -config APCLI_STA_SUPPORT - bool "APCLI STA Support" - depends on APCLI_SUPPORT - depends on CFG80211_SUPPORT - default n - -#WDS STA -config WDS_STA_SUPPORT - bool "WDS STA Support" - depends on APCLI_SUPPORT - depends on CFG80211_SUPPORT - default n - -#WDS AP -config MBSS_AS_WDS_AP_SUPPORT - bool "MBSS AS WDS AP Support" - depends on MT_AP_SUPPORT - depends on MBSS_SUPPORT - default n - -config DSCP_QOS_MAP_SUPPORT - bool "Dscp Qos Mapping Support" - depends on MT_AP_SUPPORT - default n - -config DSCP_PRI_SUPPORT - bool "Dscp Priority Mapping Support" - depends on MT_AP_SUPPORT - default n - -#HOSTAPD_MAP_SUPPORT -config HOSTAPD_MAP_SUPPORT - bool "MAP with Hostapd Support" - depends on MT_AP_SUPPORT - depends on CFG80211_SUPPORT - depends on MAP_SUPPORT - default n - -config MIN_PHY_RATE_SUPPORT - bool "Minimum PHY rate support" - depends on MT_AP_SUPPORT - default n - -config FAST_UP_RATE_SUPPORT - bool "Fast UP rate support" - depends on MT_AP_SUPPORT - default n - -config RADIUS_MAC_AUTH_SUPPORT - bool "RADIUS MAC Auth Support" - depends on ENTERPRISE_AP_SUPPORT - depends on CFG80211_SUPPORT - default n - -config CON_WPS_SUPPORT - bool "Concurrent WPS Support" - depends on MT_AP_SUPPORT - depends on APCLI_SUPPORT - depends on WSC_INCLUDED - depends on WSC_V2_SUPPORT -# depends on MULTI_INF_SUPPORT - default n - -#config LLTD_SUPPORT -# bool "LLTD (Link Layer Topology Discovery Protocol)" -# depends on MT_AP_SUPPORT - -#config COC_SUPPORT -# bool "CoC Support" -# depends on MT_AP_SUPPORT -# default n - -config MCAST_RATE_SPECIFIC - bool "User specific tx rate of mcast pkt" - depends on MT_AP_SUPPORT - default y - -#config EXT_BUILD_CHANNEL_LIST -# bool "Extension Channel List" -# depends on MT_AP_SUPPORT - -#config AUTO_CH_SELECT_ENHANCE -# bool "Auto Channel Selection Enhancement" -# depends on MT_AP_SUPPORT - -config VOW_SUPPORT - bool "MediaAir(VOW) support" - depends on MT_AP_SUPPORT - default y - -#config AIRPLAY_SUPPORT -# bool "AIRPLAY Support" -# depends on MT_AP_SUPPORT -# default n - -config BAND_STEERING - bool "Band Steering" - depends on MT_AP_SUPPORT - default y - -config LED_CONTROL_SUPPORT - bool "LED Control Support" - default n - -config WLAN_HOOK - bool "WLAN hook Support" - depends on WIFI_DRIVER - default n - -config RADIUS_ACCOUNTING_SUPPORT - bool "Radius Accounting Support" - depends on MT_AP_SUPPORT - default n - -config GREENAP_SUPPORT - bool "GreenAP Support" - depends on MT_AP_SUPPORT - default y - -config PCIE_ASPM_DYM_CTRL_SUPPORT - bool "Pcie Aspm Dynamic Control Support" - depends on MT_AP_SUPPORT - default y - -config COEX_SUPPORT - bool "Coex Support" - depends on MT_AP_SUPPORT - default n - -config EASY_SETUP_SUPPORT - bool "Whole Home Coverage - Easy Setup" - depends on MT_AP_SUPPORT - default n - -config EVENT_NOTIFIER_SUPPORT - bool "Whole Home Coverage - Event Notifier" - depends on MT_AP_SUPPORT - default n - -config AIR_MONITOR - bool "Air Monitor" - depends on MT_AP_SUPPORT - default n - -config WNM_SUPPORT - bool "802.11v WNM Support" - depends on MT_AP_SUPPORT - default n - -config WIFI_MSI_SUPPORT - bool "MSI support" - depends on PCI_MSI - depends on CHIP_MT7615E - default n - - -#config ROAMING_ENHANCE_SUPPORT -# bool "Roaming Enhance Support" -# depends on MT_AP_SUPPORT -# depends on APCLI_SUPPORT -# default n - -#config WIFI_FWD_SUPPORT -# bool "WiFi Forwarding Support" -# default n - -config WPA3_SUPPORT - bool "WPA3 support" - depends on MT_AP_SUPPORT - default y - -config OWE_SUPPORT - bool "Enhance OPEN(OWE) support" - depends on MT_AP_SUPPORT - depends on WPA3_SUPPORT - default y - -config VENDOR_FEATURE10_SUPPORT - bool "Vendor10 Feature Enable" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default n - -config VENDOR_FEATURE11_SUPPORT - bool "Vendor11 Feature Enable" - depends on WIFI_DRIVER - depends on MT_AP_SUPPORT - default n - -config RCSA_SUPPORT - bool "Reverse-CSA" - depends on WIFI_DRIVER - depends on MT_DFS_SUPPORT - depends on APCLI_SUPPORT - default n diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi_ap/Makefile b/package/kernel/mt-drivers/mt7615d/src/mt_wifi_ap/Makefile deleted file mode 100644 index 7cfea03de2..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi_ap/Makefile +++ /dev/null @@ -1,1518 +0,0 @@ -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -WIFI_DRV_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))/.. -else -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -WIFI_DRV_PATH = drivers/net/wireless/mediatek -else -WIFI_DRV_PATH = drivers/net/wireless/mtk/mt7615e -endif -endif - -EXTRA_CFLAGS = -I$(WIFI_DRV_PATH)/mt_wifi/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/embedded/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/ate/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/include/mcu - -DRV_NAME = mt_wifi -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -ifeq ($(CONFIG_CHIP_MT7622),y) -ifeq ($(CONFIG_MT76XX_COMBO_DUAL_DRIVER_SUPPORT),y) -DRV_NAME = mt7622_mt_wifi -EXTRA_CFLAGS += -Wframe-larger-than=4096 -endif -endif -endif - -SRC_DIR = ../mt_wifi -SRC_EMBEDDED_DIR = ../mt_wifi/embedded -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS += -DCONFIG_SUPPORT_OPENWRT -ifneq ($(CONFIG_RT_FIRST_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD=$(CONFIG_RT_FIRST_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_IF_RF_OFFSET=$(CONFIG_RT_FIRST_IF_RF_OFFSET) -endif -ifneq ($(CONFIG_RT_SECOND_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD=$(CONFIG_RT_SECOND_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_IF_RF_OFFSET=$(CONFIG_RT_SECOND_IF_RF_OFFSET) -endif -ifneq ($(CONFIG_RT_THIRD_CARD),) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD=$(CONFIG_RT_THIRD_CARD) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_IF_RF_OFFSET=$(CONFIG_RT_THIRD_IF_RF_OFFSET) -endif -ifeq ($(CONFIG_FIRST_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_FIRST_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_FIRST_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_FIRST_CARD_EEPROM="\"flash\"" -endif -endif -endif -ifeq ($(CONFIG_SECOND_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_SECOND_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_SECOND_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_SECOND_CARD_EEPROM="\"flash\"" -endif -endif -endif -ifeq ($(CONFIG_THIRD_IF_EEPROM_PROM),y) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD_EEPROM="\"prom\"" -else -ifeq ($(CONFIG_THIRD_IF_EEPROM_EFUSE),y) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD_EEPROM="\"efuse\"" -else -ifeq ($(CONFIG_THIRD_IF_EEPROM_FLASH),y) -EXTRA_CFLAGS += -DCONFIG_RT_THIRD_CARD_EEPROM="\"flash\"" -endif -endif -endif -endif - -ifeq ($(CONFIG_FIRST_IF_EPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_FIRST_IF_EPAELNA -else -ifeq ($(CONFIG_FIRST_IF_IPAILNA),y) -EXTRA_CFLAGS += -DCONFIG_FIRST_IF_IPAILNA -else -ifeq ($(CONFIG_FIRST_IF_IPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_FIRST_IF_IPAELNA -endif -endif -endif -ifeq ($(CONFIG_SECOND_IF_EPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_SECOND_IF_EPAELNA -else -ifeq ($(CONFIG_SECOND_IF_IPAILNA),y) -EXTRA_CFLAGS += -DCONFIG_SECOND_IF_IPAILNA -else -ifeq ($(CONFIG_SECOND_IF_IPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_SECOND_IF_IPAELNA -endif -endif -endif -ifeq ($(CONFIG_THIRD_IF_EPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_THIRD_IF_EPAELNA -else -ifeq ($(CONFIG_THIRD_IF_IPAILNA),y) -EXTRA_CFLAGS += -DCONFIG_THIRD_IF_IPAILNA -else -ifeq ($(CONFIG_THIRD_IF_IPAELNA),y) -EXTRA_CFLAGS += -DCONFIG_THIRD_IF_IPAELNA -endif -endif -endif - -#support built-in/ko for Openwrt/Linux SDK -obj-m += $(DRV_NAME).o - -ifeq ($(CONFIG_MTK_EMI_7622),y) -EXTRA_CFLAGS += -DCONFIG_ARCH_MT7622 -endif - -EXTRA_CFLAGS += -DWIFI_SYS_FW_V1 -EXTRA_CFLAGS += -DWIFI_SYS_FW_V2 -######################################################## -# Common files -# $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o\ -######################################################## -cmm_objs := $(SRC_EMBEDDED_DIR)/common/action.o\ - $(SRC_EMBEDDED_DIR)/common/ba_action.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/radio_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/omac_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wmm_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wtbl_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/hdev_basic.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v1.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v2.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_cmd.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_basic.o\ - $(SRC_DIR)/hw_ctrl/hw_init.o\ - $(SRC_EMBEDDED_DIR)/common/bcn.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_aes.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cfg.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cmd.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_data.o\ - $(SRC_EMBEDDED_DIR)/common/qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fq_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_fair_qm.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_profile.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_radar.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sync.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_info.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_notify.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_basic.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_phy.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_ht.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_vht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_basic.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_phy.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_vht.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sanity.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_sec.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_tkip.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wep.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wpa.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_aes.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_arc4.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_hmac.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_md5.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_sha2.o\ - $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/mlme.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_dev.o\ - $(SRC_EMBEDDED_DIR)/mgmt/bss_ops.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init_inf.o\ - $(SRC_EMBEDDED_DIR)/common/spectrum.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_timer.o\ - $(SRC_EMBEDDED_DIR)/common/rt_channel.o\ - $(SRC_EMBEDDED_DIR)/common/op_class.o\ - $(SRC_EMBEDDED_DIR)/common/rt_os_util.o\ - $(SRC_EMBEDDED_DIR)/common/scan.o\ - $(SRC_EMBEDDED_DIR)/common/sys_log.o\ - $(SRC_EMBEDDED_DIR)/common/txpower.o\ - $(SRC_EMBEDDED_DIR)/common/icap.o\ - $(SRC_EMBEDDED_DIR)/common/vendor.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info_element.o\ - $(SRC_DIR)/chips/rtmp_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_hw.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_entrytb.o\ - $(SRC_EMBEDDED_DIR)/common/wdev.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/tm.o\ - $(SRC_DIR)/txpwr/single_sku.o\ - $(SRC_EMBEDDED_DIR)/common/ra_ac_q_mgmt.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_rvr_dbg.o\ - $(SRC_DIR)/protocol/protection.o\ - $(SRC_EMBEDDED_DIR)/common/misc_app.o - -ifeq ($(CONFIG_MULTI_PROFILE_SUPPORT),y) -EXTRA_CFLAGS += -DMULTI_PROFILE -cmm_objs += $(SRC_EMBEDDED_DIR)/common/multi_profile.o -endif - -ifeq ($(CONFIG_DEFAULT_5G_PROFILE),y) -EXTRA_CFLAGS += -DDEFAULT_5G_PROFILE -endif - -ifeq ($(CONFIG_MLME_MULTI_QUEUE_SUPPORT),y) -EXTRA_CFLAGS += -DMLME_MULTI_QUEUE_SUPPORT -endif - -######################################################## -# Coex related files -######################################################## -ifeq ($(CONFIG_COEX_SUPPORT),y) - EXTRA_CFLAGS += -DCOEX_SUPPORT - - cmm_objs += $(SRC_EMBEDDED_DIR)/mcu/bt_coex.o -endif -######################################################## -# Rate adaptation related files -######################################################## -rate_objs := $(SRC_DIR)/rate_ctrl/ra_ctrl_mt.o\ - $(SRC_DIR)/rate_ctrl/ra_ctrl_mt_drv.o\ - $(SRC_DIR)/rate_ctrl/ra_wrapper_embedded.o\ - $(SRC_DIR)/rate_ctrl/ra_cfg.o - -#ifeq ($(CONFIG_NEW_RATE_ADAPT_SUPPORT),y) -# EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT -# rate_objs += $(SRC_DIR)/rate_ctrl/alg_grp_mt.o -# rate_objs += $(SRC_DIR)/rate_ctrl/ra_table.o -#endif - -ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -endif - -######################################################## -# ASIC related files -######################################################## -asic_objs := $(SRC_DIR)/phy/phy.o - -######################################################## -# Spec feature related files -######################################################## -spec_objs += $(SRC_EMBEDDED_DIR)/common/ps.o - -ifeq ($(CONFIG_UAPSD),y) - EXTRA_CFLAGS += -DUAPSD_SUPPORT -DUAPSD_DEBUG - spec_objs += $(SRC_EMBEDDED_DIR)/common/uapsd.o -endif - -ifeq ($(CONFIG_MT_MAC),y) - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_ps.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_io.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/txs.o -endif - -# WSC -ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_INCLUDED -DWSC_SINGLE_TRIGGER - - ifneq ($(CONFIG_USER_GOAHEAD_HTTPD),) - EXTRA_CFLAGS += -DSDK_GOAHEAD_HTTPD - endif - - ifneq ($(CONFIG_USER_LIGHTY),) - EXTRA_CFLAGS += -DSDK_USER_LIGHTY - endif - - ifneq ($(CONFIG_MT_AP_SUPPORT),) - EXTRA_CFLAGS += -DWSC_AP_SUPPORT - endif - - ifneq ($(CONFIG_MT_STA_SUPPORT),) - EXTRA_CFLAGS += -DWSC_STA_SUPPORT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_tlv.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_dh.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_ufd.o - - ifeq ($(CONFIG_WSC_V2_SUPPORT),y) - EXTRA_CFLAGS += -DWSC_V2_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc_v2.o - endif -endif - -# VHT -ifeq ($(CONFIG_DOT11_VHT_AC),y) - EXTRA_CFLAGS += -DDOT11_VHT_AC - spec_objs += $(SRC_EMBEDDED_DIR)/mgmt/mgmt_vht.o\ - $(SRC_EMBEDDED_DIR)/common/vht.o - # WFA VHT R2 PF - ifeq ($(CONFIG_WFA_VHT_R2_PF),y) - EXTRA_CFLAGS += -DWFA_VHT_R2_PF - endif -endif - -# DPP -ifeq ($(CONFIG_DPP_SUPPORT),y) -EXTRA_CFLAGS += -DCHANNEL_SWITCH_MONITOR_CONFIG -EXTRA_CFLAGS += -DDPP_SUPPORT -endif - - -# WAPI -ifeq ($(CONFIG_WAPI_SUPPORT),y) - EXTRA_CFLAGS += -DWAPI_SUPPORT - ifeq ($(CONFIG_RALINK_RT3052),y) - EXTRA_CFLAGS += -DSOFT_ENCRYPT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/security/wapi.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_sms4.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_crypt.o -endif - -# WPA3 -ifeq ($(CONFIG_WPA3_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11_SAE_SUPPORT -DDOT11_SUITEB_SUPPORT -DDOT11W_PMF_SUPPORT - EXTRA_CFLAGS += -DDOT11_SAE_OPENSSL_BN -DDOT11_SAE_PWD_ID_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/security/sae.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/bn_lib.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/ecc.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o - - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_SAE_SUPPORT - endif - -endif - -#To use mtk_dut daemon, so we need open DCONFIG_APSTA_MIXED_SUPPORT -EXTRA_CFLAGS += -DCONFIG_APSTA_MIXED_SUPPORT - -# OWE -ifeq ($(CONFIG_OWE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_OWE_SUPPORT -DDOT11W_PMF_SUPPORT - EXTRA_CFLAGS += -DDOT11_SAE_OPENSSL_BN - - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/bn_lib.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/ecc.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/owe.o - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o - - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_OWE_SUPPORT - endif - -endif - -# ACM -ifeq ($(CONFIG_WMM_ACM_SUPPORT),y) - EXTRA_CFLAGS += -DWMM_ACM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/acm_edca.o\ - $(SRC_EMBEDDED_DIR)/common/acm_comm.o\ - $(SRC_EMBEDDED_DIR)/common/acm_iocl.o -endif - -#PMF -ifeq ($(CONFIG_MT_MAC),y) -ifeq ($(CONFIG_DOT11W_PMF_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11W_PMF_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o -endif -endif - -# LLTD -ifeq ($(CONFIG_LLTD_SUPPORT),y) - EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -#RRM -ifeq ($(CONFIG_DOT11K_RRM_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11K_RRM_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DAPPLE_11K_IOT - spec_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o \ - $(SRC_EMBEDDED_DIR)/common/rrm.o \ - $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o -endif -#EXTRA_CFLAGS += -DHOSTAPD_11K_SUPPORT -# TPC -ifeq ($(CONFIG_TPC_SUPPORT),y) - EXTRA_CFLAGS += -DTPC_SUPPORT -endif - -# FTM -ifeq ($(CONFIG_FTM_SUPPORT),y) - EXTRA_CFLAGS += -DFTM_SUPPORT -DFTM_INITIATOR - EXTRA_CFLAGS += -DTMR_SUPPORT - EXTRA_CFLAGS += -DDOT11K_RRM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/ftm.o - spec_objs += $(SRC_DIR)/protocol/tmr.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o \ - $(SRC_EMBEDDED_DIR)/common/rrm.o \ - $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o -endif - -ifeq ($(CONFIG_PASSPOINT_R2),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -DCONFIG_HOTSPOT_R2 -DWAPP_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o\ - $(SRC_EMBEDDED_DIR)/common/gas.o\ - $(SRC_EMBEDDED_DIR)/common/hotspot.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_DSCP_QOS_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DDSCP_QOS_MAP_SUPPORT -endif - -ifeq ($(CONFIG_DSCP_PRI_SUPPORT),y) - EXTRA_CFLAGS += -DDSCP_PRI_SUPPORT -endif - -ifeq ($(CONFIG_MIN_PHY_RATE_SUPPORT),y) - EXTRA_CFLAGS += -DMIN_PHY_RATE_SUPPORT -endif - -ifeq ($(CONFIG_FAST_UP_RATE_SUPPORT),y) - EXTRA_CFLAGS += -DFAST_UP_RATE_SUPPORT -endif - -ifeq ($(CONFIG_WNM_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_DOT11V_WNM - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o -endif - -ifeq ($(CONFIG_INTERWORKING),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING - spec_objs += $(SRC_EMBEDDED_DIR)/common/gas.o -endif - -# MBO -ifeq ($(CONFIG_MBO_SUPPORT),y) - EXTRA_CFLAGS += -DMBO_SUPPORT -DWAPP_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/mbo.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_TRACE_TCP_PKT),y) - EXTRA_CFLAGS += -DTRACELOG_TCP_PKT -endif - -ifeq ($(CONFIG_BACKGROUND_SCAN_SUPPORT),y) - EXTRA_CFLAGS += -DBACKGROUND_SCAN_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/bgnd_scan.o -endif - -ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DMT_DFS_SUPPORT -DCUSTOMISE_RDD_THRESHOLD_SUPPORT -DRDM_FALSE_ALARM_DEBUG_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/cmm_rdm_mt.o -endif - -ifeq ($(CONFIG_WIFI_EAP_FEATURE),y) - EXTRA_CFLAGS += -DWIFI_EAP_FEATURE -endif - -# FT -ifeq ($(CONFIG_DOT11R_FT_SUPPORT),y) -EXTRA_CFLAGS += -DDOT11R_FT_SUPPORT -dot11_ft_objs += $(SRC_EMBEDDED_DIR)/common/ft.o\ - $(SRC_EMBEDDED_DIR)/common/ft_tlv.o\ - $(SRC_EMBEDDED_DIR)/common/ft_iocl.o\ - $(SRC_EMBEDDED_DIR)/common/ft_rc.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_ftkd.o -## Preserve R1KH during Radio ON/OFF -ifeq ($(CONFIG_MBO_SUPPORT),y) -EXTRA_CFLAGS += -DFT_R1KH_KEEP -endif -endif - - -#VLAN -ifeq ($(CONFIG_VLAN_SUPPORT),y) - EXTRA_CFLAGS += -DVLAN_SUPPORT -endif - -#SNIFFER -ifeq ($(CONFIG_SNIFFER_SUPPORT),y) - EXTRA_CFLAGS += -DSNIFFER_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/sniffer_radiotap.o\ - $(SRC_EMBEDDED_DIR)/common/sniffer_prism.o -endif - -#EAP-Antenna Control -ifeq ($(CONFIG_ANTENNA_CONTROL_SUPPORT),y) -EXTRA_CFLAGS += -DANTENNA_CONTROL_SUPPORT -endif - -#EAP-Mgmt TxPower Control -ifeq ($(CONFIG_MGMT_TXPWR_CTRL),y) -EXTRA_CFLAGS += -DMGMT_TXPWR_CTRL -endif - -#EAP-Channel Utilization Support -ifeq ($(CONFIG_CHUTIL_SUPPORT),y) -EXTRA_CFLAGS += -DCHUTIL_SUPPORT -endif - -#EAP-Noise Floor Support -ifeq ($(CONFIG_NF_SUPPORT),y) -EXTRA_CFLAGS += -DNF_SUPPORT -endif - -#EAP-TXRX Statsitics -ifeq ($(CONFIG_TXRX_STAT_SUPPORT),y) -EXTRA_CFLAGS += -DTXRX_STAT_SUPPORT -endif - -#EAP-RA Phy rate support -ifeq ($(CONFIG_RA_PHY_RATE_SUPPORT),y) -EXTRA_CFLAGS += -DCONFIG_RA_PHY_RATE_SUPPORT -endif - -#EAP-AMPDU Config retry & agglimitSupport -ifeq ($(CONFIG_AMPDU_CONF_SUPPORT),y) -EXTRA_CFLAGS += -DAMPDU_CONF_SUPPORT -endif - -#EAP-ACK CTS Timeout cck & ofdm Support -ifeq ($(CONFIG_ACK_CTS_TIMEOUT_SUPPORT),y) -EXTRA_CFLAGS += -DACK_CTS_TIMEOUT_SUPPORT -endif - -#VENDOR_FEATURE11 -ifeq ($(CONFIG_VENDOR_FEATURE11_SUPPORT),y) -EXTRA_CFLAGS += -DVENDOR_FEATURE11_SUPPORT -DTXRX_STAT_SUPPORT -endif - -#HOSTAPD_MAP_SUPPORT -ifeq ($(CONFIG_HOSTAPD_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DHOSTAPD_MAP_SUPPORT -endif - -#ENTERPRISE_AP -ifeq ($(CONFIG_ENTERPRISE_AP_SUPPORT),y) - EXTRA_CFLAGS += -DHOSTAPD_11R_SUPPORT - EXTRA_CFLAGS += -DMBSS_DTIM_SUPPORT - EXTRA_CFLAGS += -DEAP_STATS_SUPPORT - - ifeq ($(CONFIG_RADIUS_MAC_AUTH_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_MAC_AUTH_SUPPORT - endif - ifeq ($(CONFIG_DYNAMIC_VLAN_SUPPORT),y) - EXTRA_CFLAGS += -DDYNAMIC_VLAN_SUPPORT - endif - -endif - -#CFG -ifeq ($(CONFIG_CFG80211_SUPPORT),y) - EXTRA_CFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST - #WPA3 SUPPORT - ifneq ($(CONFIG_HOSTAPD_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DHOSTAPD_SAE_SUPPORT -DHOSTAPD_OWE_SUPPORT -DHOSTAPD_SUITEB_SUPPORT - endif - ifeq ($(CONFIG_CUSTOMISED_HOSTAPD_SUPPORT),y) - EXTRA_CFLAGS += -DDISABLE_HOSTAPD_BEACON -DDISABLE_HOSTAPD_PROBE_RESP -DHOSTAPD_AUTO_CH_SUPPORT - endif - ifeq ($(CONFIG_WDS_STA_SUPPORT),y) - ifneq ($(CONFIG_HOSTAPD_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_AS_WDS_STA_SUPPORT - endif - endif - ifeq ($(CONFIG_APCLI_STA_SUPPORT),y) - ifneq ($(CONFIG_HOSTAPD_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_CFG80211_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_apcli.o - endif - endif - spec_objs += $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_scan.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_rx.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_tx.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_inf.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_ap.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211drv.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211_util.o\ - $(SRC_EMBEDDED_DIR)/../os/linux/cfg80211/cfg80211.o - -endif - -ifeq ($(CONFIG_MAP_SUPPORT),y) - EXTRA_CFLAGS += -DA4_CONN -DROUTING_TAB_SUPPORT -DWAPP_SUPPORT -DCONFIG_MAP_SUPPORT -DOFFCHANNEL_SCAN_FEATURE -DCONFIG_11KV_API_SUPPORT -ifeq ($(CONFIG_MAP_R2_VER_SUPPORT),y) - EXTRA_CFLAGS += -DMAP_R2 -DMAP_TS_TRAFFIC_SUPPORT -endif - spec_objs += $(SRC_EMBEDDED_DIR)/common/map.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/a4_conn.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/routing_tab.o - spec_objs += $(SRC_EMBEDDED_DIR)/wapp/wapp.o -endif - -ifeq ($(CONFIG_RALINK_TIMER_WDG),y) - EXTRA_CFLAGS += -DSDK_TIMER_WDG -endif - -ifeq ($(CONFIG_OFFCHANNEL_SCAN_FEATURE),y) - EXTRA_CFLAGS += -DOFFCHANNEL_SCAN_FEATURE -endif - -ifeq ($(CONFIG_VENDOR_FEATURE10_SUPPORT),y) - EXTRA_CFLAGS += -DFOLLOW_HIDDEN_SSID_FEATURE - EXTRA_CFLAGS += -DCONVERTER_MODE_SWITCH_SUPPORT - ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DDFS_VENDOR10_CUSTOM_FEATURE - endif - ifeq ($(CONFIG_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_BCAST_RATE_SET_SUPPORT - endif - ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_TVM_SUPPORT - endif - ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DVENDOR10_CUSTOM_RSSI_FEATURE - EXTRA_CFLAGS += -DBW_VENDOR10_CUSTOM_FEATURE - endif -endif - -ifeq ($(CONFIG_MT_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DONDEMAND_DFS -endif - -ifeq ($(CONFIG_MTK_WD_KICKER),y) - ifeq ($(CONFIG_MTK_WD_KICKER_WCN),y) - EXTRA_CFLAGS += -DSDK_TIMER_WDG - endif -endif - -#ACL_BLK_CONUT -#EXTRA_CFLAGS += -DACL_BLK_COUNT_SUPPORT - -#RATE_PRIOR_SUPPORT -#EXTRA_CFLAGS += -DRATE_PRIOR_SUPPORT - -# -# Common Feature related files -# -func_objs := - -ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT - - func_objs += $(SRC_EMBEDDED_DIR)/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_BLOCK_NET_IF),y) - EXTRA_CFLAGS += -DBLOCK_NET_IF - - func_objs += $(SRC_EMBEDDED_DIR)/common/netif_block.o -endif - -ifeq ($(CONFIG_SINGLE_SKU),y) - EXTRA_CFLAGS += -DSINGLE_SKU - ifeq ($(CONFIG_RALINK_RT6352),y) - EXTRA_CFLAGS += -DSINGLE_SKU_V2 - endif -endif - -ifeq ($(CONFIG_SMART_CARRIER_SENSE_SUPPORT),y) - EXTRA_CFLAGS += -DSMART_CARRIER_SENSE_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/scs.o -endif - -######################################################## -# AP feature related files -######################################################## -ap_objs := $(SRC_EMBEDDED_DIR)/ap/ap.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_assoc.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_auth.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_mlme.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sanity.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sync.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_wpa.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_sec.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_data.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_autoChSel.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_qload.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_cfg.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_nps.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_vow.o\ - $(SRC_DIR)/os/linux/ap_ioctl.o - -ifeq ($(CONFIG_MBSS_SUPPORT),y) - EXTRA_CFLAGS += -DMBSS_SUPPORT - - ifeq ($(CONFIG_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DNEW_MBSSID_MODE - ifeq ($(CONFIG_ENHANCE_NEW_MBSSID_MODE),y) - EXTRA_CFLAGS += -DENHANCE_NEW_MBSSID_MODE - endif - endif - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mbss.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_mbss_inf.o - -ifeq ($(CONFIG_MBSS_AS_WDS_AP_SUPPORT),y) -EXTRA_CFLAGS += -DMBSS_AS_WDS_AP_SUPPORT -EXTRA_CFLAGS += -DCLIENT_WDS -ap_objs += $(SRC_EMBEDDED_DIR)/common/client_wds.o -endif -endif - - -ifeq ($(CONFIG_WDS_SUPPORT),y) - EXTRA_CFLAGS += -DWDS_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_wds.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_wds_inf.o\ - $(SRC_EMBEDDED_DIR)/common/client_wds.o -endif - -ifeq ($(CONFIG_APCLI_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DMULTI_APCLI_SUPPORT -DAPCLI_AUTO_CONNECT_SUPPORT -DAPCLI_AUTO_BW_TMP - #EXTRA_CFLAGS += -DAPCLI_CERT_SUPPORT -DAPCLI_CONNECTION_TRIAL - EXTRA_CFLAGS += -DDHCP_UC_SUPPORT - EXTRA_CFLAGS += -DFAST_EAPOL_WAR - EXTRA_CFLAGS += -DBT_APCLI_SUPPORT - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_apcli.o\ - $(SRC_EMBEDDED_DIR)/ap/ap_apcli_inf.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_assoc.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_auth.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_ctrl.o\ - $(SRC_EMBEDDED_DIR)/ap/apcli_sync.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_iparp.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_pppoe.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_ipv6.o - - ifeq ($(CONFIG_APCLI_CERT_SUPPORT),y) - EXTRA_CFLAGS += -DAPCLI_CERT_SUPPORT - endif - - ifeq ($(CONFIG_MAC_REPEATER_SUPPORT),y) - EXTRA_CFLAGS += -DMAC_REPEATER_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_repeater.o - endif - -endif - -ifeq ($(CONFIG_IDS_SUPPORT),y) - EXTRA_CFLAGS += -DIDS_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_ids.o -endif - -ifeq ($(CONFIG_NINTENDO_AP),y) - EXTRA_CFLAGS += -DNINTENDO_AP - - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_nintendo.o -endif - -#ifeq ($(CONFIG_COC_SUPPORT),y) -# EXTRA_CFLAGS += -DGREENAP_SUPPORT -DCOC_SUPPORT -# -# ap_objs += $(SRC_DIR)/../hw_ctrl/greenap.o -#endif - -ifeq ($(CONFIG_GREENAP_SUPPORT),y) - EXTRA_CFLAGS += -DGREENAP_SUPPORT - - ap_objs += $(SRC_DIR)/hw_ctrl/greenap.o -endif - -ifeq ($(CONFIG_PCIE_ASPM_DYM_CTRL_SUPPORT),y) - EXTRA_CFLAGS += -DPCIE_ASPM_DYM_CTRL_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW -DCONFIG_HW_HAL_OFFLOAD #-DCSD_VERIFICATION -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_ICAP_SUPPORT),y) - EXTRA_CFLAGS += -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_SPECTRUM_SUPPORT),y) - EXTRA_CFLAGS += -DWIFI_SPECTRUM_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT),y) - EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -endif - -ifeq ($(CONFIG_PRE_CAL_TRX_SET1_SUPPORT),y) - EXTRA_CFLAGS += -DPRE_CAL_TRX_SET1_SUPPORT -endif - -ifeq ($(CONFIG_RLM_CAL_CACHE_SUPPORT),y) - EXTRA_CFLAGS += -DRLM_CAL_CACHE_SUPPORT -endif - -ifeq ($(CONFIG_PRE_CAL_TRX_SET2_SUPPORT),y) - EXTRA_CFLAGS += -DPRE_CAL_TRX_SET2_SUPPORT -endif - -ifeq ($(CONFIG_CAL_BIN_FILE_SUPPORT),y) - EXTRA_CFLAGS += -DCAL_BIN_FILE_SUPPORT -endif - -ifeq ($(CONFIG_RF_LOCKDOWN_SUPPORT),y) - EXTRA_CFLAGS += -DRF_LOCKDOWN -endif - -ifeq ($(CONFIG_LINK_TEST_SUPPORT),y) - EXTRA_CFLAGS += -DLINK_TEST_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_TEMPERATURE_TX_ALC),y) - EXTRA_CFLAGS += -DRTMP_TEMPERATURE_TX_ALC -endif - -ifeq ($(CONFIG_TXBF_SUPPORT),y) - EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DTXBF_SUPPORT -DVHT_TXBF_SUPPORT - ap_objs += $(SRC_DIR)/txbf/cmm_txbf_mt.o\ - $(SRC_DIR)/txbf/cmm_txbf_cal_mt.o\ - $(SRC_DIR)/txbf/txbf_wrapper_embedded.o -endif - -ifeq ($(CONFIG_MUMIMO_SUPPORT),y) - EXTRA_CFLAGS += -DCFG_SUPPORT_MU_MIMO - ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mumimo.o -endif - -ifeq ($(CONFIG_MU_RA_SUPPORT),y) - EXTRA_CFLAGS += -DCFG_SUPPORT_MU_MIMO_RA - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_mura.o -endif - -ifeq ($(CONFIG_CON_WPS_SUPPORT), y) - EXTRA_CFLAGS += -DCON_WPS -DCON_WPS_AP_SAME_UUID -endif - -ifeq ($(CONFIG_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(CONFIG_AIRPLAY_SUPPORT),y) - EXTRA_CFLAGS += -DAIRPLAY_SUPPORT -endif - -ifeq ($(CONFIG_BAND_STEERING),y) - EXTRA_CFLAGS += -DBAND_STEERING - ap_objs += $(SRC_EMBEDDED_DIR)/ap/ap_band_steering.o -endif - -ifeq ($(CONFIG_AIR_MONITOR),y) - EXTRA_CFLAGS += -DAIR_MONITOR -endif - -ifeq ($(CONFIG_EASY_SETUP_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/easy_setup/ez_cmm.o -endif - -ifeq ($(CONFIG_MWDS),y) - ap_objs += $(SRC_EMBEDDED_DIR)/common/mwds.o - ap_objs += $(SRC_EMBEDDED_DIR)/common/a4_conn.o - ap_objs += $(SRC_EMBEDDED_DIR)/common/routing_tab.o -endif - -ifeq ($(CONFIG_EVENT_NOTIFIER_SUPPORT),y) - ap_objs += $(SRC_EMBEDDED_DIR)/common/event_notifier.o -endif - -ifeq ($(CONFIG_VOW_SUPPORT),y) - EXTRA_CFLAGS += -DVOW_SUPPORT -endif - -ifeq ($(CONFIG_RED_SUPPORT),y) - EXTRA_CFLAGS += -DRED_SUPPORT -endif - -ifeq ($(CONFIG_FQ_SCH_SUPPORT),y) - EXTRA_CFLAGS += -DFQ_SCH_SUPPORT -endif - -#EXTRA_CFLAGS += -DCHANNEL_SWITCH_MONITOR_CONFIG -#ccflags-y += -DACS_CTCC_SUPPORT -######################################################## -# Linux system related files -######################################################## -os_objs := $(SRC_DIR)/os/linux/rt_proc.o\ - $(SRC_DIR)/os/linux/rt_linux.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/rt_main_dev.o\ - $(SRC_DIR)/os/linux/mt_wifi_mtd.o - -ifeq ($(CONFIG_WLAN_HOOK),y) - EXTRA_CFLAGS +=-DRTMP_WLAN_HOOK_SUPPORT - os_objs += $(SRC_DIR)/os/linux/rt_txrx_hook.o -endif - -ifeq ($(CONFIG_MULTI_INF_SUPPORT),y) - EXTRA_CFLAGS += -DMULTI_INF_SUPPORT - os_objs += $(SRC_DIR)/os/linux/multi_main_dev.o -endif - -ifeq ($(CONFIG_WIFI_WORK_QUEUE_BH),y) - EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - -ifeq ($(CONFIG_KTHREAD),y) - EXTRA_CFLAGS += -DKTHREAD_SUPPORT -endif - -ifeq ($(CONFIG_LINUX_NET_TXQ_SUPPORT),y) -EXTRA_CFLAGS += -DLINUX_NET_TXQ_SUPPORT -endif - -######################################################## -# chip related files -######################################################## -ifeq ($(CONFIG_FIRST_IF_MT7628),y) -EXTRA_CFLAGS += -DMT7628 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -DDMA_SCH_SUPPORT -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DUSE_BMC -DTHERMAL_PROTECT_SUPPORT -DCAL_FREE_IC_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7628.o\ - $(SRC_DIR)/chips/mt7628_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_DIR)/mcu/mcu.o\ - $(SRC_DIR)/mcu/andes_core.o\ - $(SRC_DIR)/mcu/andes_mt.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rbus_main_dev.o -endif - - -ifeq ($(CONFIG_SECOND_IF_MT7637E),y) -EXTRA_CFLAGS += -DMT7637 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -DDMA_SCH_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTAR_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -# -DCUT_THROUGH -#EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -#EXTRA_CFLAGS += -DNEED_ROM_PATCH -#EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7637.o\ - $(SRC_DIR)/chips/mt7637_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_DBDC_MODE),y) -EXTRA_CFLAGS += -DDBDC_MODE -endif - -ifeq ($(CONFIG_G_BAND_256QAM_SUPPORT),y) -EXTRA_CFLAGS += -DG_BAND_256QAM -ifeq ($(CONFIG_BRCM_256QAM_SUPPORT),y) -EXTRA_CFLAGS += -DBRCM_256QAM -endif -endif - -ifeq ($(CONFIG_CHIP_MT7615E),y) -EXTRA_CFLAGS += -DMT7615 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -#EXTRA_CFLAGS += -DNEIGHBORING_AP_STAT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DERR_RECOVERY -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DTXPWRMANUAL -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -EXTRA_CFLAGS += -DSINGLE_SKU_V2 -EXTRA_CFLAGS += -DTX_POWER_CONTROL_SUPPORT -EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -EXTRA_CFLAGS += -DRX_SCATTER -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_TX_DELAY -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -EXTRA_CFLAGS += -DPRE_CAL_TRX_SET1_SUPPORT -EXTRA_CFLAGS += -DRLM_CAL_CACHE_SUPPORT -EXTRA_CFLAGS += -DPRE_CAL_TRX_SET2_SUPPORT -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -CONFIG_PROPRIETARY_DRIVER=y -ifeq ($(CONFIG_PROPRIETARY_DRIVER),y) -EXTRA_CFLAGS += -DCONFIG_PROPRIETARY_DRIVER -CONFIG_PLATFORM_DRV_SUPPORT=n -else -CONFIG_PLATFORM_DRV_SUPPORT=y -endif -endif - -ifeq ($(CONFIG_CUSTOMER_VENDOR_IE_SUPPORT),y) - EXTRA_CFLAGS += -DCUSTOMER_VENDOR_IE_SUPPORT -endif - -CONFIG_OCE_SUPPORT=y -# OCE -ifeq ($(CONFIG_OCE_SUPPORT),y) -EXTRA_CFLAGS += -DOCE_SUPPORT -DOCE_FILS_SUPPORT -func_objs += $(SRC_EMBEDDED_DIR)/common/oce_fils.o -func_objs += $(SRC_EMBEDDED_DIR)/common/oce.o -endif - -EXTRA_CFLAGS += -Wframe-larger-than=4096 -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) - EXTRA_CFLAGS += -DREDUCE_TCP_ACK_SUPPORT -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -ifeq ($(CONFIG_RADIUS_ACCOUNTING_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_ACCOUNTING_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -ifeq ($(CONFIG_FDB_SUPPORT),y) - EXTRA_CFLAGS += -DMT_FDB - chip_objs += $(SRC_DIR)/mcu/mt_fdb.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7615.o\ - $(SRC_DIR)/chips/mt7615_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_CHIP_MT7663E),y) -EXTRA_CFLAGS += -DMT7663 -DMT_BBP -DMT_RF -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DMT_DMAC -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -#EXTRA_CFLAGS += -DERR_RECOVERY -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -#EXTRA_CFLAGS += -DSINGLE_SKU_V2 -#EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -WFLAGS += -DCONFIG_FPGA_MODE -#EXTRA_CFLAGS += -DRX_SCATTER -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -EXTRA_CFLAGS += -DHW_TX_AMSDU_SUPPORT -#WFLAGS += -DCONFIG_CSO_SUPPORT -#WFLAGS += -DMSP_UTILITY - -#EXTRA_CFLAGS += -Wframe-larger-than=4096 -WFLAGS += -Werror - -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT - EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) - EXTRA_CFLAGS += -DREDUCE_TCP_ACK_SUPPORT -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -ifeq ($(CONFIG_RADIUS_ACCOUNTING_SUPPORT),y) - EXTRA_CFLAGS += -DRADIUS_ACCOUNTING_SUPPORT -endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -ifeq ($(CONFIG_FDB_SUPPORT),y) - EXTRA_CFLAGS += -DMT_FDB - chip_objs += $(SRC_DIR)/mcu/mt_fdb.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7663.o\ - $(SRC_DIR)/chips/mt7663_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - -ifeq ($(CONFIG_FIRST_IF_MT7622),y) -EXTRA_CFLAGS += -DMT7622 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DMT_DMAC -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DERR_RECOVERY -EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -EXTRA_CFLAGS += -DTXPWRMANUAL -#EXTRA_CFLAGS += -DTMR_VERIFY -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DETSI_RX_BLOCKER_SUPPORT -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DNEWSEC -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -EXTRA_CFLAGS += -DRX_SCATTER -#EXTRA_CFLAGS += -DCONFIG_FPGA_MODE -#EXTRA_CFLAGS += -DCONFIG_CSO_SUPPORT -EXTRA_CFLAGS += -DPKT_BUDGET_CTRL_SUPPORT -#EXTRA_CFLAGS += -DMSP_UTILITY -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_TX_DELAY -EXTRA_CFLAGS += -DDBG_AMSDU -EXTRA_CFLAGS += -DPRE_CAL_MT7622_SUPPORT -EXTRA_CFLAGS += -DTXSTAT_2040BW_24G_SUPPORT -EXTRA_CFLAGS += -DTX_POWER_CONTROL_SUPPORT -EXTRA_CFLAGS += -DRELEASE_EXCLUDE -CONFIG_PROPRIETARY_DRIVER=y - -ifeq ($(CONFIG_SINGLE_SKU),y) -EXTRA_CFLAGS += -DSINGLE_SKU_V2 -endif - -ifeq ($(CONFIG_PROPRIETARY_DRIVER),y) -EXTRA_CFLAGS += -DCONFIG_PROPRIETARY_DRIVER -CONFIG_PLATFORM_DRV_SUPPORT=n -else -CONFIG_PLATFORM_DRV_SUPPORT=y -endif - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPROT),y) -EXTRA_CFLAGS += -DPLATFORM_DRIVER_SUPPORT -endif - -EXTRA_CFLAGS += -Werror -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif -ifeq ($(CONFIG_VHT_TXBF_2G_EPIGRAM_IE_SUPPORT),y) - EXTRA_CFLAGS += -DVHT_TXBF_2G_EPIGRAM_IE -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -ifeq ($(CONFIG_VOW_SUPPORT),y) -ifeq ($(CONFIG_RED_SUPPORT),y) -EXTRA_CFLAGS += -DFQ_SCH_SUPPORT -endif -endif - -ifeq ($(CONFIG_MT76XX_COMBO_DUAL_DRIVER_SUPPORT),y) - EXTRA_CFLAGS += -DMT76XX_COMBO_DUAL_DRIVER_SUPPORT -endif - -chip_objs += $(SRC_DIR)/chips/mt7622.o\ - $(SRC_DIR)/chips/mt7622_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_DIR)/phy/rlm_cal_cache.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT)$(CONFIG_MTD),yy) -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -ifeq ($(CONFIG_MTD_SPI_NOR),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -else -ifeq ($(CONFIG_MTD_NAND),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif -endif -else -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -ifeq ($(CONFIG_MTD_SPI_NOR),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -else -ifeq ($(CONFIG_MTD_NAND),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif -endif -endif -endif -endif - -ifeq ($(CONFIG_DEFAULTS_MEDIATEK_MT7622),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPORT),y) -chip_objs += $(SRC_DIR)/os/linux/wbsys_main_dev.o -else -chip_objs += $(SRC_DIR)/os/linux/rbus_prop_dev.o -endif - -# -# Root -# - -$(DRV_NAME)-objs += $(ap_objs) $(cmm_objs) $(asic_objs) $(chip_objs) $(rate_objs)\ - $(spec_objs) $(func_objs) $(os_objs) $(dot11_ft_objs) - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_flash.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/hif_pci.o - -$(DRV_NAME)-objs += $(SRC_DIR)/os/linux/rt_pci_rbus.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_util.o\ - #$(SRC_DIR)/os/linux/rbus_main_dev.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_DIR)/ate/ate_agent.o\ - $(SRC_DIR)/ate/testmode_ioctl.o\ - $(SRC_DIR)/ate/mt_mac/mt_testmode.o\ - $(SRC_DIR)/ate/LoopBack.o -endif - - -ifeq ($(CONFIG_TCP_RACK_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_tcprack.o -endif - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -# ifeq ($(CONFIG_WSC_INCLUDED),y) -# EXTRA_CFLAGS += -DWSC_LED_SUPPORT -# endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wstrict-prototypes -Wno-trigraphs -Wall -Wno-unused-but-set-variable - -EXTRA_CFLAGS += -DOLDSEC - -#-Werror -#-DDBG_DIAGNOSE -DDBG_RX_MCS -DDBG_TX_MCS - -EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DSCAN_SUPPORT -DAP_SCAN_SUPPORT -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -#EXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DCONFIG_RT2880_ATE_CMD_NEW - -ifeq ($(CONFIG_FAST_NAT_SUPPORT),y) -EXTRA_CFLAGS += -DCONFIG_FAST_NAT_SUPPORT -endif - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -#EXTRA_CFLAGS += -DDBG -endif -EXTRA_CFLAGS += -DDBG - -ifeq ($(CONFIG_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -ifeq ($(CONFIG_RALINK_MT7621),y) -EXTRA_CFLAGS += -DRACTRL_LIMIT_MAX_PHY_RATE=1300 -endif - -ifeq ($(CONFIG_FAST_NAT_SUPPORT),y) -ifeq ($(CONFIG_WLAN_HOOK),y) -ifeq ($(CONFIG_WHNAT_SUPPORT),y) -EXTRA_CFLAGS += -DWHNAT_SUPPORT -DCONFIG_ARCH_MT7622_WIFI_HW_NAT -else -ifeq ($(CONFIG_WHNAT_SUPPORT),m) -EXTRA_CFLAGS += -DWHNAT_SUPPORT -DCONFIG_ARCH_MT7622_WIFI_HW_NAT -endif -endif -endif -endif - -ifeq ($(CONFIG_EASY_SETUP_SUPPORT),y) -EXTRA_CFLAGS += -DWH_EZ_SETUP -EXTRA_CFLAGS += -DNEW_CONNECTION_ALGO -EXTRA_CFLAGS += -DEZ_NETWORK_MERGE_SUPPORT -EXTRA_CFLAGS += -DEZ_DUAL_BAND_SUPPORT -EXTRA_CFLAGS += -DEZ_ROAM_SUPPORT -EXTRA_CFLAGS += -DDUAL_CHIP -EXTRA_CFLAGS += -DEZ_API_SUPPORT -EXTRA_CFLAGS += -DEZ_PUSH_BW_SUPPORT -endif - -ifeq ($(CONFIG_MWDS),y) -EXTRA_CFLAGS += -DMWDS -DA4_CONN -DROUTING_TAB_SUPPORT -endif - -ifeq ($(CONFIG_EVENT_NOTIFIER_SUPPORT),y) -EXTRA_CFLAGS += -DWH_EVENT_NOTIFIER -endif - -#ifeq ($(CONFIG_WIFI_FWD_SUPPORT),y) -#EXTRA_CFLAGS += -DCONFIG_WIFI_PKT_FWD -#endif - -EXTRA_CFLAGS += -DMTFWD - -ifeq ($(CONFIG_ROAMING_ENHANCE_SUPPORT),y) -EXTRA_CFLAGS += -DROAMING_ENHANCE_SUPPORT -endif - -EXTRA_CFLAGS += -DIP_ASSEMBLY -EXTRA_CFLAGS += -DOUI_CHECK_SUPPORT -EXTRA_CFLAGS += -DHTC_DECRYPT_IOT - -EXTRA_CFLAGS += -Inet/nat -#EXTRA_CFLAGS += -DDBG_STARVATION -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS += -DMT_WIFI_MODULE -else -ifeq ($(CONFIG_MT_WIFI),m) -EXTRA_CFLAGS += -DMT_WIFI_MODULE -endif -endif - -MODULE_FLAGS=$(EXTRA_CFLAGS) -export MODULE_FLAGS -obj-m+=$(SRC_EMBEDDED_DIR)/plug_in/ diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi_sta/Kconfig b/package/kernel/mt-drivers/mt7615d/src/mt_wifi_sta/Kconfig deleted file mode 100644 index deec77f207..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi_sta/Kconfig +++ /dev/null @@ -1,75 +0,0 @@ -config MT_STA_SUPPORT - tristate "Ralink RT2860 802.11n/ac STA support" -# depends on NET_RADIO - select WIRELESS_EXT - select WEXT_SPY - select WEXT_PRIV - -config ETH_CONVERT_SUPPORT - bool "Ethernet Convert Mode Support" - depends on MT_STA_SUPPORT - default y - -config COEX_SUPPORT - bool "Coex Support" - depends on MT_STA_SUPPORT - default n - -#config MUMIMO_SUPPORT -# bool "MU-MIMO Support" -# depends on WIFI_DRIVER -# default y - -#config DOT11R_FT_SUPPORT -# bool "802.11r Fast BSS Transition" -# depends on MT_STA_SUPPORT - -#config DOT11K_RRM_SUPPORT -# bool "802.11k Radio Resource Management" -# depends on MT_STA_SUPPORT - -#config SNIFFER_SUPPORT -# bool "SNIFFER" -# depends on MT_STA_SUPPORT -# default n - -config CFG80211_SUPPORT - bool "CFG80211" - depends on MT_STA_SUPPORT - depends on CFG80211 - default n - -#config CON_WPS_SUPPORT -# bool "Concurrent WPS Support" -# depends on MT_STA_SUPPORT -# depends on APCLI_SUPPORT -# depends on WSC_INCLUDED -# depends on WSC_V2_SUPPORT -# default n - -#config COC_SUPPORT -# bool "CoC Support" -# depends on MT_STA_SUPPORT -# default n - -#config RT2860V2_SNMP -# bool "Net-SNMP Support" -# depends on MT_STA_SUPPORT - -#config MCAST_RATE_SPECIFIC -# bool "User specific tx rate of mcast pkt" -# depends on MT_STA_SUPPORT - -#config EXT_BUILD_CHANNEL_LIST -# bool "Extension Channel List" -# depends on MT_STA_SUPPORT - -#config AUTO_CH_SELECT_ENHANCE -# bool "Auto Channel Selection Enhancement" -# depends on MT_STA_SUPPORT - -#config AIRPLAY_SUPPORT -# bool "AIRPLAY Support" -# depends on MT_STA_SUPPORT -# default n - diff --git a/package/kernel/mt-drivers/mt7615d/src/mt_wifi_sta/Makefile b/package/kernel/mt-drivers/mt7615d/src/mt_wifi_sta/Makefile deleted file mode 100644 index 3d40a108b5..0000000000 --- a/package/kernel/mt-drivers/mt7615d/src/mt_wifi_sta/Makefile +++ /dev/null @@ -1,790 +0,0 @@ -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -WIFI_DRV_PATH = drivers/net/wireless/mediatek -else -WIFI_DRV_PATH = drivers/net/wireless/mtk/mt7615e -endif - -EXTRA_CFLAGS = -I$(WIFI_DRV_PATH)/mt_wifi/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/embedded/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/ate/include - -ifeq ($(CONFIG_SUPPORT_OPENWRT),y) -EXTRA_CFLAGS = -I$(src)/../src/include \ - -I$(src)/../src/embedded/include \ - -I$(src)/../src/ate/include -DRV_NAME = mt7628 -SRC_DIR = ../src/embedded -obj-m += $(DRV_NAME).o -else -EXTRA_CFLAGS = -I$(WIFI_DRV_PATH)/mt_wifi/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/embedded/include \ - -I$(WIFI_DRV_PATH)/mt_wifi/ate/include -DRV_NAME = mt_wifi -SRC_DIR = ../mt_wifi -SRC_EMBEDDED_DIR = ../mt_wifi/embedded -obj-$(CONFIG_MT_STA_SUPPORT) += $(DRV_NAME).o -endif - -ifeq ($(CONFIG_MTK_EMI_7622),y) -EXTRA_CFLAGS += -DCONFIG_ARCH_MT7622 -endif - -EXTRA_CFLAGS += -DWIFI_SYS_FW_V1 -EXTRA_CFLAGS += -DWIFI_SYS_FW_V2 - -######################################################## -# Common files -# $(SRC_EMBEDDED_DIR)/common/cmm_mumimo.o\ -######################################################## -cmm_objs := $(SRC_EMBEDDED_DIR)/common/action.o\ - $(SRC_EMBEDDED_DIR)/common/ba_action.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/radio_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/omac_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wmm_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/wtbl_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hdev/hdev_basic.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v1.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_ops_v2.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_cmd.o\ - $(SRC_EMBEDDED_DIR)/hw_ctrl/hw_ctrl_basic.o\ - $(SRC_DIR)/hw_ctrl/hw_init.o\ - $(SRC_EMBEDDED_DIR)/common/bcn.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_aes.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cfg.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_cmd.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_data.o\ - $(SRC_EMBEDDED_DIR)/common/qm.o\ - $(SRC_EMBEDDED_DIR)/common/fq_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_fair_qm.o\ - $(SRC_EMBEDDED_DIR)/common/fp_qm.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_profile.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_radar.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sync.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_info.o\ - $(SRC_EMBEDDED_DIR)/common/wifi_sys_notify.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_basic.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_phy.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_ht.o\ - $(SRC_EMBEDDED_DIR)/wlan_config/config_vht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_basic.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_phy.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/be_vht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/bss_ops.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_sanity.o\ - $(SRC_EMBEDDED_DIR)/common/vendor.o\ - $(SRC_EMBEDDED_DIR)/security/sae.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_sec.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_tkip.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wep.o\ - $(SRC_EMBEDDED_DIR)/security/cmm_wpa.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_aes.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_arc4.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_hmac.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_md5.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_sha2.o\ - $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/mlme.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_ht.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_dev.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_init_inf.o\ - $(SRC_EMBEDDED_DIR)/common/spectrum.o\ - $(SRC_EMBEDDED_DIR)/common/rtmp_timer.o\ - $(SRC_EMBEDDED_DIR)/common/rt_channel.o\ - $(SRC_EMBEDDED_DIR)/common/op_class.o\ - $(SRC_EMBEDDED_DIR)/common/rt_os_util.o\ - $(SRC_EMBEDDED_DIR)/common/scan.o\ - $(SRC_EMBEDDED_DIR)/common/sys_log.o\ - $(SRC_EMBEDDED_DIR)/common/txpower.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_info_element.o\ - $(SRC_DIR)/chips/rtmp_chip.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_hw.o\ - $(SRC_EMBEDDED_DIR)/mgmt/mgmt_entrytb.o\ - $(SRC_EMBEDDED_DIR)/common/wdev.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/tm.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_rvr_dbg.o\ - $(SRC_DIR)/protocol/protection.o\ - $(SRC_EMBEDDED_DIR)/common/misc_app.o - -######################################################## -# SAE files -######################################################## -ifeq ($(CONFIG_WPA3_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11_SAE_SUPPORT -DDOT11_SUITEB_SUPPORT -DDOT11W_PMF_SUPPORT - EXTRA_CFLAGS += -DDOT11_SAE_OPENSSL_BN - - cmm_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ - $(SRC_EMBEDDED_DIR)/security/bn_lib.o\ - $(SRC_EMBEDDED_DIR)/security/ecc.o\ - $(SRC_EMBEDDED_DIR)/security/sae.o\ - $(SRC_EMBEDDED_DIR)/security/pmf.o -endif - -######################################################## -# OWE related files -######################################################## -ifeq ($(CONFIG_OWE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_OWE_SUPPORT -DDOT11W_PMF_SUPPORT -DDOT11_SAE_OPENSSL_BN - - cmm_objs += $(SRC_EMBEDDED_DIR)/security/crypt_bignum.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ - $(SRC_EMBEDDED_DIR)/security/bn_lib.o\ - $(SRC_EMBEDDED_DIR)/security/ecc.o\ - $(SRC_EMBEDDED_DIR)/security/owe.o\ - $(SRC_EMBEDDED_DIR)/security/pmf.o - -endif - - -######################################################## -# Coex related files -######################################################## -ifeq ($(CONFIG_COEX_SUPPORT),y) - EXTRA_CFLAGS += -DCOEX_SUPPORT - - cmm_objs += $(SRC_EMBEDDED_DIR)/mcu/bt_coex.o -endif - -######################################################## -# Rate adaptation related files -######################################################## -rate_objs := $(SRC_DIR)/rate_ctrl/ra_ctrl_mt.o\ - $(SRC_DIR)/rate_ctrl/ra_ctrl_mt_drv.o\ - $(SRC_DIR)/rate_ctrl/ra_wrapper_embedded.o\ - $(SRC_DIR)/rate_ctrl/ra_cfg.o - -ifeq ($(CONFIG_NEW_RATE_ADAPT_SUPPORT),y) - EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT - rate_objs += $(SRC_DIR)/rate_ctrl/alg_grp_mt.o - rate_objs += $(SRC_DIR)/rate_ctrl/ra_table.o -endif - -ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) - EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -endif - -######################################################## -# ASIC related files -######################################################## -asic_objs := $(SRC_DIR)/phy/phy.o - -######################################################## -# Spec feature related files -######################################################## -spec_objs += $(SRC_EMBEDDED_DIR)/common/ps.o - -ifeq ($(CONFIG_UAPSD),y) - EXTRA_CFLAGS += -DUAPSD_SUPPORT -DUAPSD_DEBUG - spec_objs += $(SRC_EMBEDDED_DIR)/common/uapsd.o -endif - -ifeq ($(CONFIG_MT_MAC),y) - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_ps.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/mt_io.o - spec_objs += $(SRC_EMBEDDED_DIR)/common/txs.o -endif - -# WSC -ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_INCLUDED -#-DWSC_SINGLE_TRIGGER - - ifneq ($(CONFIG_MT_AP_SUPPORT),) - EXTRA_CFLAGS += -DWSC_AP_SUPPORT - endif - - ifneq ($(CONFIG_MT_STA_SUPPORT),) - EXTRA_CFLAGS += -DWSC_STA_SUPPORT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc.o\ - $(SRC_EMBEDDED_DIR)/common/wsc_tlv.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_dh.o\ - $(SRC_EMBEDDED_DIR)/security/crypt_biginteger.o\ -# $(SRC_EMBEDDED_DIR)/common/wsc_ufd.o - - ifeq ($(CONFIG_WSC_V2_SUPPORT),y) - EXTRA_CFLAGS += -DWSC_V2_SUPPORT - spec_objs += $(SRC_EMBEDDED_DIR)/common/wsc_v2.o - endif -endif - -# VHT -ifeq ($(CONFIG_DOT11_VHT_AC),y) - EXTRA_CFLAGS += -DDOT11_VHT_AC - spec_objs += $(SRC_EMBEDDED_DIR)/mgmt/mgmt_vht.o\ - $(SRC_EMBEDDED_DIR)/common/vht.o - # WFA VHT R2 PF - ifeq ($(CONFIG_WFA_VHT_R2_PF),y) - EXTRA_CFLAGS += -DWFA_VHT_R2_PF - endif -endif - -# WAPI -ifeq ($(CONFIG_WAPI_SUPPORT),y) - EXTRA_CFLAGS += -DWAPI_SUPPORT - ifeq ($(CONFIG_RALINK_RT3052),y) - EXTRA_CFLAGS += -DSOFT_ENCRYPT - endif - - spec_objs += $(SRC_EMBEDDED_DIR)/security/wapi.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_sms4.o\ - $(SRC_EMBEDDED_DIR)/security/wapi_crypt.o - -endif - -# ACM -ifeq ($(CONFIG_WMM_ACM_SUPPORT),y) - EXTRA_CFLAGS += -DWMM_ACM_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/common/acm_edca.o\ - $(SRC_EMBEDDED_DIR)/common/acm_comm.o\ - $(SRC_EMBEDDED_DIR)/common/acm_iocl.o -endif - -#PMF -ifeq ($(CONFIG_DOT11W_PMF_SUPPORT),y) - EXTRA_CFLAGS += -DDOT11W_PMF_SUPPORT - - spec_objs += $(SRC_EMBEDDED_DIR)/security/pmf.o -endif - -# LLTD -ifeq ($(CONFIG_LLTD_SUPPORT),y) - EXTRA_CFLAGS += -DLLTD_SUPPORT -endif - -ifeq ($(CONFIG_PASSPOINT_R2),y) - EXTRA_CFLAGS += -DCONFIG_DOT11U_INTERWORKING -DCONFIG_DOT11V_WNM -DCONFIG_HOTSPOT -DCONFIG_HOTSPOT_R2 - - spec_objs += $(SRC_EMBEDDED_DIR)/common/wnm.o\ - $(SRC_EMBEDDED_DIR)/common/gas.o\ - $(SRC_EMBEDDED_DIR)/common/hotspot.o -endif - -# FT -#ifeq ($(CONFIG_RT2860V2_80211R_FT),y) -#dot11_ft_objs += $(SRC_EMBEDDED_DIR)/common/ft.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_tlv.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_ioctl.o\ -# $(SRC_EMBEDDED_DIR)/common/ft_rc.o\ -# $(SRC_EMBEDDED_DIR)/ap/ap_ftkd.o -#endif - -# RR -#ifeq ($(CONFIG_RT2860V2_80211K_RR),y) -#dot11k_rr_objs += $(SRC_EMBEDDED_DIR)/common/rrm_tlv.o\ -# $(SRC_EMBEDDED_DIR)/common/rrm_sanity.o\ -# $(SRC_EMBEDDED_DIR)/common/rrm.o -#endif -#SNIFFER -ifeq ($(CONFIG_SNIFFER_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_SNIFFER_SUPPORT - - spec_objs += $(MT_WIFI_DIR)/common/sniffer_radiotap.o\ - $(MT_WIFI_DIR)/common/sniffer_prism.o -endif - -#CFG -ifeq ($(CONFIG_CFG80211_SUPPORT),y) - EXTRA_CFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST -DWPA_SUPPLICANT_SUPPORT - - spec_objs += $(SRC_DIR)/os/linux/cfg80211/cfg80211_scan.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_rx.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_tx.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_inf.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_ap.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211drv.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211_util.o\ - $(SRC_DIR)/os/linux/cfg80211/cfg80211.o -endif - -# -# Common Feature related files -# -func_objs := - -ifeq ($(CONFIG_IGMP_SNOOP_SUPPORT),y) - EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT - - func_objs += $(SRC_EMBEDDED_DIR)/common/igmp_snoop.o -endif - -ifeq ($(CONFIG_BLOCK_NET_IF),y) - EXTRA_CFLAGS += -DBLOCK_NET_IF - - func_objs += $(SRC_EMBEDDED_DIR)/common/netif_block.o -endif - -ifeq ($(CONFIG_SINGLE_SKU),y) - EXTRA_CFLAGS += -DSINGLE_SKU - ifeq ($(CONFIG_RALINK_RT6352),y) - EXTRA_CFLAGS += -DSINGLE_SKU_V2 - endif -endif - -ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y) - EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT - - func_objs += $(SRC_EMBEDDED_DIR)/common/cmm_video.o -endif - - -ifeq ($(CONFIG_LED_CONTROL_SUPPORT),y) - EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT - ifeq ($(CONFIG_WSC_INCLUDED),y) - EXTRA_CFLAGS += -DWSC_LED_SUPPORT - endif - - func_objs += $(SRC_EMBEDDED_DIR)/common/rt_led.o -endif - - -######################################################## -# STA feature related files -######################################################## -sta_objs := \ - $(SRC_EMBEDDED_DIR)/sta/assoc.o\ - $(SRC_EMBEDDED_DIR)/sta/auth.o\ - $(SRC_EMBEDDED_DIR)/sta/auth_rsp.o\ - $(SRC_EMBEDDED_DIR)/sta/sync.o\ - $(SRC_EMBEDDED_DIR)/sta/sanity.o\ - $(SRC_EMBEDDED_DIR)/sta/sta_data.o\ - $(SRC_EMBEDDED_DIR)/sta/connect.o\ - $(SRC_EMBEDDED_DIR)/sta/sta_sec.o\ - $(SRC_EMBEDDED_DIR)/sta/wpa.o\ - $(SRC_EMBEDDED_DIR)/sta/sta_cfg.o\ - $(SRC_EMBEDDED_DIR)/sta/sta.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) - EXTRA_CFLAGS += -DCONFIG_ATE -DCONFIG_QA -DCONFIG_RT2880_ATE_CMD_NEW -DCONFIG_HW_HAL_OFFLOAD #-DCSD_VERIFICATION -DINTERNAL_CAPTURE_SUPPORT -endif - -ifeq ($(CONFIG_ICAP_SUPPORT),y) - EXTRA_CFLAGS += -DINTERNAL_CAPTURE_SUPPORT -endif - - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT),y) - EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -endif - -ifeq ($(CONFIG_RTMP_TEMPERATURE_TX_ALC),y) - EXTRA_CFLAGS += -DRTMP_TEMPERATURE_TX_ALC -endif - -ifeq ($(CONFIG_TXBF_SUPPORT),y) - EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DTXBF_SUPPORT -DVHT_TXBF_SUPPORT - sta_objs += $(SRC_DIR)/txbf/cmm_txbf_mt.o\ - $(SRC_DIR)/txbf/cmm_txbf_cal_mt.o\ - $(SRC_DIR)/txbf/txbf_wrapper_embedded.o -endif - -ifeq ($(CONFIG_CON_WPS_SUPPORT), y) - EXTRA_CFLAGS += -DCON_WPS -DCON_WPS_AP_SAME_UUID -endif - -ifeq ($(CONFIG_DFS_SUPPORT),y) - EXTRA_CFLAGS += -DDFS_SUPPORT - EXTRA_CFLAGS += -DDFS_ATP_SUPPORT - ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_dfs.o -endif - -ifeq ($(CONFIG_RT2860V2_AP_CARRIER),y) - EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT - - ap_objs += $(SRC_EMBEDDED_DIR)/common/cmm_cs.o -endif - -ifeq ($(CONFIG_RT2860V2_MCAST_RATE_SPECIFIC),y) - EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC -endif - -ifeq ($(CONFIG_AIRPLAY_SUPPORT),y) - EXTRA_CFLAGS += -DAIRPLAY_SUPPORT -endif - -ifeq ($(CONFIG_ETH_CONVERT_SUPPORT),y) - EXTRA_CFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT - sta_objs += $(SRC_EMBEDDED_DIR)/common/cmm_mat.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_iparp.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_pppoe.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mat_ipv6.o -endif - -######################################################## -# Linux system related files -######################################################## -os_objs := $(SRC_DIR)/os/linux/rt_proc.o\ - $(SRC_DIR)/os/linux/rt_linux.o\ - $(SRC_DIR)/os/linux/rt_profile.o\ - $(SRC_DIR)/os/linux/rt_txrx_hook.o\ - $(SRC_DIR)/os/linux/rt_main_dev.o\ - $(SRC_DIR)/os/linux/sta_ioctl.o\ - -ifeq ($(CONFIG_MULTI_INF_SUPPORT),y) - EXTRA_CFLAGS += -DMULTI_INF_SUPPORT - - os_objs += $(SRC_DIR)/os/linux/multi_main_dev.o -endif - -ifeq ($(CONFIG_WIFI_WORK_QUEUE_BH),y) - EXTRA_CFLAGS += -DWORKQUEUE_BH -endif - - -######################################################## -# chip related files -######################################################## -ifeq ($(CONFIG_FIRST_IF_MT7628),y) -EXTRA_CFLAGS += -DMT7628 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT -DDMA_SCH_SUPPORT -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DNEW_MBSSID_MODE -DENHANCE_NEW_MBSSID_MODE -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DFIFO_EXT_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DUSE_BMC -DTHERMAL_PROTECT_SUPPORT -DCAL_FREE_IC_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7628.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_DIR)/mcu/mcu.o\ - $(SRC_DIR)/mcu/andes_core.o\ - $(SRC_DIR)/mcu/andes_mt.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rbus_main_dev.o -endif - - -ifeq ($(CONFIG_SECOND_IF_MT7637E),y) -EXTRA_CFLAGS += -DMT7637 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -DDMA_SCH_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -#EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -# -DCUT_THROUGH -#EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -#EXTRA_CFLAGS += -DDBDC_MODE -#EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_smac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7637.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_mac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - - -ifeq ($(CONFIG_CHIP_MT7615E),y) -EXTRA_CFLAGS += -DMT7615 -DMT_BBP -DMT_RF -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -DA_BAND_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -EXTRA_CFLAGS += -DRX_SCATTER -ifeq ($(CONFIG_G_BAND_256QAM_SUPPORT), y) -EXTRA_CFLAGS += -DG_BAND_256QAM -ifeq ($(CONFIG_BRCM_256QAM_SUPPORT), y) -EXTRA_CFLAGS += -DBRCM_256QAM -endif -endif -EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -EXTRA_CFLAGS += -DDBDC_MODE -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DTHERMAL_PROTECT_SUPPORT -EXTRA_CFLAGS += -DCONFIG_KEEP_ALIVE_OFFLOAD -DSTA_LP_PHASE_2_SUPPORT -DCONFIG_PM_BIT_HW_MODE -EXTRA_CFLAGS += -DMT_WOW_SUPPORT -DCONFIG_PM -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7615.o\ - $(SRC_DIR)/chips/mt7615_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/pci_main_dev.o -endif - - -ifeq ($(CONFIG_FIRST_IF_MT7622),y) -EXTRA_CFLAGS += -DMT7622 -DMT_BBP -DMT_RF -DRTMP_RBUS_SUPPORT -DRTMP_RF_RW_SUPPORT -DMT_MAC -DRTMP_MAC_PCI -EXTRA_CFLAGS += -DMT_DMAC -EXTRA_CFLAGS += -DMCS_LUT_SUPPORT -EXTRA_CFLAGS += -DRTMP_EFUSE_SUPPORT -EXTRA_CFLAGS += -DCAL_FREE_IC_SUPPORT -EXTRA_CFLAGS += -DBCN_OFFLOAD_SUPPORT -#EXTRA_CFLAGS += -DNEW_SET_RX_STREAM -EXTRA_CFLAGS += -DCONFIG_ANDES_SUPPORT -DCUT_THROUGH -EXTRA_CFLAGS += -DUNIFY_FW_CMD -#EXTRA_CFLAGS += -DTMR_VERIFY -EXTRA_CFLAGS += -DNEED_ROM_PATCH -EXTRA_CFLAGS += -DMAC_INIT_OFFLOAD -EXTRA_CFLAGS += -DENHANCED_STAT_DISPLAY -EXTRA_CFLAGS += -DCONFIG_FWOWN_SUPPORT -EXTRA_CFLAGS += -DCONFIG_KEEP_ALIVE_OFFLOAD -DSTA_LP_PHASE_2_SUPPORT -DCONFIG_PM_BIT_HW_MODE -EXTRA_CFLAGS += -DMT_WOW_SUPPORT -DCONFIG_PM -DHOST_RESUME_DONE_ACK_SUPPORT -EXTRA_CFLAGS += -DRESOURCE_PRE_ALLOC -EXTRA_CFLAGS += -DCONFIG_HW_HAL_OFFLOAD -#EXTRA_CFLAGS += -DCONFIG_FPGA_MODE -#EXTRA_CFLAGS += -DMT7622_FPGA -#EXTRA_CFLAGS += -DCONFIG_CSO_SUPPORT -#EXTRA_CFLAGS += -DMSP_UTILITY -EXTRA_CFLAGS += -DRATE_ADAPTION -EXTRA_CFLAGS += -DRATE_ADAPT_AGBS_SUPPORT -EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -CONFIG_PROPRIETART_DRIVER=n - -ifeq ($(CONFIG_PLOPRIETART_DRIVER),y) -EXTRA_CFLAGS += -DCONFIG_PROPRIETARY_DRIVER -CONFIG_PLATFORM_DRV_SUPPORT=n -else -CONFIG_PLATFORM_DRV_SUPPORT=y -endif - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPROT),y) -EXTRA_CFLAGS += -DPLATFORM_DRIVER_SUPPORT -endif - -EXTRA_CFLAGS += -Werror -ifeq ($(CONFIG_HDR_TRANS_TX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_TX_SUPPORT -DCUT_THROUGH_FULL_OFFLOAD -endif -ifeq ($(CONFIG_HDR_TRANS_RX_SUPPORT),y) - EXTRA_CFLAGS += -DHDR_TRANS_RX_SUPPORT -endif - -#ifeq ($(CONFIG_RATE_ADAPT_AGBS_SUPPORT),y) -# EXTRA_CFLAGS += -DRACTRL_FW_OFFLOAD_SUPPORT -#endif - -ifeq ($(CONFIG_ATE_SUPPORT),y) -chip_objs += $(SRC_DIR)/ate/mt_mac/mt_testmode_dmac.o -endif - -chip_objs += $(SRC_DIR)/chips/mt7622.o\ - $(SRC_DIR)/chips/mt7622_dbg.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_dmac.o\ - $(SRC_DIR)/hw_ctrl/cmm_asic_mt_fw.o\ - $(SRC_DIR)/hw_ctrl/cmm_chip_mt.o\ - $(SRC_DIR)/mac/mt_dmac.o\ - $(SRC_EMBEDDED_DIR)/mcu/mcu.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_core.o\ - $(SRC_EMBEDDED_DIR)/mcu/andes_mt.o \ - $(SRC_DIR)/mcu/mt_cmd.o\ - $(SRC_DIR)/mcu/fwdl_mt.o\ - $(SRC_DIR)/mcu/fw_cmd.o\ - $(SRC_DIR)/mcu/fwdl.o\ - $(SRC_DIR)/phy/mt_rf.o\ - $(SRC_DIR)/phy/rf.o\ - $(SRC_DIR)/phy/mt_phy.o\ - $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o\ - $(SRC_EMBEDDED_DIR)/common/hif_pci.o\ - $(SRC_EMBEDDED_DIR)/common/ee_prom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o\ - $(SRC_EMBEDDED_DIR)/common/cut_through.o\ - $(SRC_DIR)/protocol/tmr.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o -endif - -ifeq ($(CONFIG_RTMP_FLASH_SUPPORT)$(CONFIG_MTD),yy) -ifeq ($(CONFIG_DEFAULTS_KERNEL_4_4),y) -ifeq ($(CONFIG_MTD_SPI_NOR),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -else -ifeq ($(CONFIG_MTD_NAND),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif -endif -endif -endif - -ifeq ($(CONFIG_DEFAULTS_MEDIATEK_MT7622),y) -EXTRA_CFLAGS += -DCONFIG_WIFI_MTD -endif - - -ifeq ($(CONFIG_PLATFORM_DRV_SUPPORT),y) -chip_objs += $(SRC_DIR)/os/linux/wbsys_main_dev.o -else -chip_objs += $(SRC_DIR)/os/linux/rbus_prop_dev.o -endif - -# -# Root -# - -$(DRV_NAME)-objs += $(sta_objs) $(cmm_objs) $(asic_objs) $(chip_objs) $(rate_objs)\ - $(spec_objs) $(func_objs) $(os_objs) - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/eeprom.o\ - $(SRC_EMBEDDED_DIR)/common/ee_flash.o\ - $(SRC_EMBEDDED_DIR)/common/ee_efuse.o - -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/cmm_mac_pci.o -$(DRV_NAME)-objs += $(SRC_EMBEDDED_DIR)/common/hif_pci.o - -$(DRV_NAME)-objs += $(SRC_DIR)/os/linux/rt_pci_rbus.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_drv.o\ - $(SRC_DIR)/os/linux/rt_rbus_pci_util.o - -ifeq ($(CONFIG_ATE_SUPPORT),y) -$(DRV_NAME)-objs += $(SRC_DIR)/ate/ate_agent.o\ - $(SRC_DIR)/ate/testmode_ioctl.o\ - $(SRC_DIR)/ate/mt_mac/mt_testmode.o\ - $(SRC_DIR)/ate/LoopBack.o -endif - - -################### -# CFLAGS -################## -EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \ - -Wstrict-prototypes -Wno-trigraphs -Wall -Wno-unused-but-set-variable - -#-Werror -#-DDBG_DIAGNOSE -DDBG_RX_MCS -DDBG_TX_MCS - -EXTRA_CFLAGS += -DCONFIG_STA_SUPPORT -DSCAN_SUPPORT -DDBG -#-DCONFIG_AP_SUPPORT -DSCAN_SUPPORT -DAP_SCAN_SUPPORT -EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -# -DIAPP_SUPPORT -DDOT1X_SUPPORT -#EXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DCONFIG_RT2880_ATE_CMD_NEW -ifneq ($(CONFIG_RA_HW_NAT_WIFI_NEW_ARCH),y) -EXTRA_CFLAGS += -DCONFIG_RA_NAT_NONE -endif - -#provide busy time statistics for every TBTT */ -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS - -# provide busy time alarm mechanism -# use the function to avoid to locate in some noise environments -#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM - -ifeq ($(CONFIG_RT2860V2_AUTO_CH_SELECT_ENCANCE),y) -EXTRA_CFLAGS += -DAUTO_CH_SELECT_ENHANCE -endif - -ifeq ($(CONFIG_RT2860V2_SNMP),y) -EXTRA_CFLAGS += -DSNMP_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_AP_32B_DESC),y) -EXTRA_CFLAGS += -DDESC_32B_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_HW_ANTENNA_DIVERSITY),y) -EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT -endif - -ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y) -EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST -endif - -ifeq ($(CONFIG_MEMORY_OPTIMIZATION),y) -EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION -else -#EXTRA_CFLAGS += -DDBG -endif -EXTRA_CFLAGS += -DDBG - -ifeq ($(CONFIG_RTMP_INTERNAL_TX_ALC),y) -EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC -endif - -ifeq ($(CONFIG_SUPPORT_DYNAMIC_TXOP),y) -EXTRA_CFLAGS += -DTXOP_ARBITER -endif - -ifeq ($(CONFIG_RALINK_MT7621),y) -EXTRA_CFLAGS += -DRACTRL_LIMIT_MAX_PHY_RATE=1300 -endif - -EXTRA_CFLAGS += -DIP_ASSEMBLY -EXTRA_CFLAGS += -Inet/nat - -MODULE_FLAGS=$(EXTRA_CFLAGS) -export MODULE_FLAGS -obj-m+=$(SRC_EMBEDDED_DIR)/plug_in/ - diff --git a/package/kernel/mt-drivers/mt_wifi/Makefile b/package/kernel/mt-drivers/mt_wifi/Makefile deleted file mode 100644 index 4d97befd69..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/Makefile +++ /dev/null @@ -1,69 +0,0 @@ -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=mt_wifi -PKG_VERSION:=2 -PKG_RELEASE:=2 - -PKG_CONFIG_DEPENDS := \ - CONFIG_MTK_CHIP_MT7603E_MT7612E \ - CONFIG_MTK_CHIP_MT7603E_MT7615E \ - CONFIG_MTK_CHIP_MT7615E \ - CONFIG_MTK_CHIP_MT7615E_DBDC - -include $(INCLUDE_DIR)/package.mk - -define Package/mt_wifi - SECTION:=net - CATEGORY:=Network - TITLE:=MTK wifi AP config - DEPENDS:=@TARGET_ramips +wireless-tools - SUBMENU:=Wireless -endef - -define Package/mt_wifi/config - source "$(SOURCE)/config.in" -endef - -define Package/mt_wifi/description - MT_WiFi auto config for mt7603/mt7612/mt7615 chips -endef - -define Build/Compile -endef - -define Package/mt_wifi/install - $(INSTALL_DIR) $(1)/etc/init.d/ - $(INSTALL_DIR) $(1)/lib/wifi/ - $(INSTALL_DIR) $(1)/etc/wireless/mt7615/ - $(INSTALL_DIR) $(1)/etc_ro/Wireless/RT2860AP/ - $(INSTALL_DIR) $(1)/lib/preinit/ -ifeq ($(CONFIG_MTK_CHIP_MT7603E_MT7612E),y) - $(INSTALL_DATA) ./files/7603_7612-l1profile.dat $(1)/etc/wireless/l1profile.dat - $(INSTALL_DATA) ./files/mt7603.dat $(1)/etc/wireless/mt7615/mt7615.1.dat - $(INSTALL_DATA) ./files/mt7612.dat $(1)/etc/wireless/mt7615/mt7615.2.dat -else ifeq ($(CONFIG_MTK_CHIP_MT7603E_MT7615E),y) - $(INSTALL_DATA) ./files/7603_7615-l1profile.dat $(1)/etc/wireless/l1profile.dat - $(INSTALL_DATA) ./files/mt7603.dat $(1)/etc/wireless/mt7615/mt7615.1.dat - $(INSTALL_DATA) ./files/mt7615.dat $(1)/etc/wireless/mt7615/mt7615.2.dat -else ifeq ($(CONFIG_MTK_CHIP_MT7615E_DBDC),y) - $(INSTALL_DATA) ./files/dbdc.l1profile.dat $(1)/etc/wireless/l1profile.dat - $(INSTALL_DATA) ./files/mt7615.1.2G.dat $(1)/etc/wireless/mt7615/ - $(INSTALL_DATA) ./files/mt7615.1.5G.dat $(1)/etc/wireless/mt7615/ -else - $(INSTALL_DATA) ./files/7615.l1profile.dat $(1)/etc/wireless/l1profile.dat - $(INSTALL_DATA) ./files/mt7615.2G.dat $(1)/etc/wireless/mt7615/mt7615.1.dat - $(INSTALL_DATA) ./files/mt7615.5G.dat $(1)/etc/wireless/mt7615/mt7615.2.dat -endif - $(INSTALL_DATA) ./files/mt7615e-sku.dat $(1)/etc_ro/Wireless/RT2860AP/SingleSKU.dat - $(INSTALL_DATA) ./files/mt7615e-sku-bf.dat $(1)/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat - $(INSTALL_BIN) ./files/mt7615.lua $(1)/lib/wifi/ - $(INSTALL_BIN) ./files/firmware.sh $(1)/etc/init.d/firmware - $(INSTALL_BIN) ./files/82_load_wifi.sh $(1)/lib/preinit/ -endef - -$(eval $(call BuildPackage,mt_wifi)) diff --git a/package/kernel/mt-drivers/mt_wifi/config.in b/package/kernel/mt-drivers/mt_wifi/config.in deleted file mode 100644 index c78b793acd..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/config.in +++ /dev/null @@ -1,25 +0,0 @@ -menu "MT_WIFI Configuration" - depends on PACKAGE_mt_wifi - -config MTK_CHIP_MT7603E_MT7612E - bool "MTK_CHIP_MT7603E_MT7612E" - default y if PACKAGE_kmod-mt7603e && PACKAGE_kmod-mt76x2e - default n - -config MTK_CHIP_MT7603E_MT7615E - bool "MTK_CHIP_MT7603E_MT7615E" - default y if PACKAGE_kmod-mt7603e && PACKAGE_kmod-mt7615d - default n - -config MTK_CHIP_MT7615E - bool "MTK_CHIP_MT7615E" - default y if PACKAGE_kmod-mt7615d && !PACKAGE_kmod-mt7603e - default n - -config MTK_CHIP_MT7615E_DBDC - bool "MTK_CHIP_MT7615E_DBDC" - depends on MTK_CHIP_MT7615E - default y if TARGET_ramips_mt7621_DEVICE_phicomm_k2p - default n - -endmenu diff --git a/package/kernel/mt-drivers/mt_wifi/files/7603_7612-l1profile.dat b/package/kernel/mt-drivers/mt_wifi/files/7603_7612-l1profile.dat deleted file mode 100644 index 01f255bbf7..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/7603_7612-l1profile.dat +++ /dev/null @@ -1,10 +0,0 @@ -Default -INDEX0=MT7603 -INDEX0_profile_path=/etc/wireless/mt7615/mt7615.1.dat -INDEX0_EEPROM_offset=0x0 -INDEX0_EEPROM_size=0x400 -INDEX0_EEPROM_name=e2p -INDEX0_main_ifname=ra0 -INDEX0_ext_ifname=ra -INDEX0_wds_ifname=wds -INDEX0_apcli_ifname=apcli diff --git a/package/kernel/mt-drivers/mt_wifi/files/7603_7615-l1profile.dat b/package/kernel/mt-drivers/mt_wifi/files/7603_7615-l1profile.dat deleted file mode 100644 index ca37a4ed66..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/7603_7615-l1profile.dat +++ /dev/null @@ -1,21 +0,0 @@ -Default -INDEX0=MT7603 -INDEX0_profile_path=/etc/wireless/mt7615/mt7615.1.dat -INDEX0_EEPROM_offset=0x0 -INDEX0_EEPROM_size=0x400 -INDEX0_EEPROM_name=e2p -INDEX0_main_ifname=ra0 -INDEX0_ext_ifname=ra -INDEX0_wds_ifname=wds -INDEX0_apcli_ifname=apcli -INDEX1=MT7615 -INDEX1_profile_path=/etc/wireless/mt7615/mt7615.2.dat -INDEX1_EEPROM_offset=0x8000 -INDEX1_EEPROM_size=0x4000 -INDEX1_EEPROM_name=e2p -INDEX1_main_ifname=rai0 -INDEX1_ext_ifname=rai -INDEX1_wds_ifname=wdsi -INDEX1_apcli_ifname=apclii -INDEX1_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat -INDEX1_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat diff --git a/package/kernel/mt-drivers/mt_wifi/files/7615.l1profile.dat b/package/kernel/mt-drivers/mt_wifi/files/7615.l1profile.dat deleted file mode 100644 index e91b58e06a..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/7615.l1profile.dat +++ /dev/null @@ -1,23 +0,0 @@ -Default -INDEX0=MT7615 -INDEX0_profile_path=/etc/wireless/mt7615/mt7615.1.dat -INDEX0_EEPROM_offset=0x0 -INDEX0_EEPROM_size=0x4000 -INDEX0_EEPROM_name=e2p -INDEX0_main_ifname=ra0 -INDEX0_ext_ifname=ra -INDEX0_wds_ifname=wds -INDEX0_apcli_ifname=apcli -INDEX0_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat -INDEX0_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat -INDEX1=MT7615 -INDEX1_profile_path=/etc/wireless/mt7615/mt7615.2.dat -INDEX1_EEPROM_offset=0x8000 -INDEX1_EEPROM_size=0x4000 -INDEX1_EEPROM_name=e2p -INDEX1_main_ifname=rai0 -INDEX1_ext_ifname=rai -INDEX1_wds_ifname=wdsi -INDEX1_apcli_ifname=apclii -INDEX1_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat -INDEX1_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat diff --git a/package/kernel/mt-drivers/mt_wifi/files/82_load_wifi.sh b/package/kernel/mt-drivers/mt_wifi/files/82_load_wifi.sh deleted file mode 100644 index ddbc7e7832..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/82_load_wifi.sh +++ /dev/null @@ -1,10 +0,0 @@ -. /lib/functions.sh - -load_wifi() { - local kernel_version=$(uname -r) - [ -e "/lib/modules/$kernel_version/mt7603e.ko" ] && modprobe mt7603e - [ -e "/lib/modules/$kernel_version/mt76x2_ap.ko" ] && modprobe mt76x2_ap - [ -e "/lib/modules/$kernel_version/mt_wifi.ko" ] && modprobe mt_wifi -} - -boot_hook_add preinit_main load_wifi diff --git a/package/kernel/mt-drivers/mt_wifi/files/dbdc.l1profile.dat b/package/kernel/mt-drivers/mt_wifi/files/dbdc.l1profile.dat deleted file mode 100644 index 79a619e863..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/dbdc.l1profile.dat +++ /dev/null @@ -1,12 +0,0 @@ -Default -INDEX0=MT7615 -INDEX0_profile_path=/etc/wireless/mt7615/mt7615.1.5G.dat;/etc/wireless/mt7615/mt7615.1.2G.dat -INDEX0_EEPROM_offset=0x0 -INDEX0_EEPROM_size=0x4000 -INDEX0_EEPROM_name=e2p -INDEX0_main_ifname=ra0;rax0 -INDEX0_ext_ifname=ra;rax -INDEX0_wds_ifname=wds;wdsx -INDEX0_apcli_ifname=apcli;apclix -INDEX0_single_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU.dat -INDEX0_bf_sku_path=/etc_ro/Wireless/RT2860AP/SingleSKU_BF.dat diff --git a/package/kernel/mt-drivers/mt_wifi/files/firmware.sh b/package/kernel/mt-drivers/mt_wifi/files/firmware.sh deleted file mode 100644 index 2285aa22bf..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/firmware.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh /etc/rc.common - -chmod 0755 /sbin/mtkwifi - -START=15 -STOP=15 - -USE_PROCD=1 - -start_service() { - [ -f /etc/hotplug.d/firmware/11-mtk-wifi-e2p ] && sh /etc/hotplug.d/firmware/11-mtk-wifi-e2p -} - -stop_service() { - : -} diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7603.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7603.dat deleted file mode 100644 index 2e7e1fbfe7..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7603.dat +++ /dev/null @@ -1,327 +0,0 @@ -Default -AccessControlList0= -AccessControlList1= -AccessControlList10= -AccessControlList11= -AccessControlList12= -AccessControlList13= -AccessControlList14= -AccessControlList15= -AccessControlList2= -AccessControlList3= -AccessControlList4= -AccessControlList5= -AccessControlList6= -AccessControlList7= -AccessControlList8= -AccessControlList9= -AccessPolicy0=0 -AccessPolicy1=0 -AccessPolicy10=0 -AccessPolicy11=0 -AccessPolicy12=0 -AccessPolicy13=0 -AccessPolicy14=0 -AccessPolicy15=0 -AccessPolicy2=0 -AccessPolicy3=0 -AccessPolicy4=0 -AccessPolicy5=0 -AccessPolicy6=0 -AccessPolicy7=0 -AccessPolicy8=0 -AccessPolicy9=0 -AckPolicy=0;0;0;0 -APACM=0;0;0;0 -APAifsn=3;7;1;1 -ApCliAuthMode= -ApCliBssid= -ApCliDefaultKeyID= -ApCliEnable= -ApCliEncrypType= -ApCliKey1Str= -ApCliKey1Str1= -ApCliKey1Type= -ApCliKey2Str= -ApCliKey2Str1= -ApCliKey2Type= -ApCliKey3Str= -ApCliKey3Str1= -ApCliKey3Type= -ApCliKey4Str= -ApCliKey4Str1= -ApCliKey4Type= -ApCliSsid= -ApCliWirelessMode= -ApCliWPAPSK= -ApCliWPAPSK1= -APCwmax=6;10;4;3 -APCwmin=4;4;3;2 -APSDCapable=1 -APTxop=0;0;94;47 -AuthMode=OPEN -AutoChannelSelect=0 -AutoChannelSkipList= -AutoProvisionEn=0 -BandSteering=0 -BasicRate=15 -BeaconPeriod=100 -BFBACKOFFenable=0 -BgndScanSkipCh= -BGProtection=0 -BndStrgBssIdx= -BSSACM=0;0;0;0 -BSSAifsn=3;7;2;2 -BSSCwmax=10;10;4;3 -BSSCwmin=4;4;3;2 -BssidNum=1 -BSSTxop=0;0;94;47 -BW_Enable=0 -BW_Guarantee_Rate= -BW_Maximum_Rate= -BW_Priority= -BW_Root=0 -CalCacheApply=0 -CarrierDetect=0 -Channel=6 -ChannelGrp= -CountryCode=US -CountryRegion=5 -CountryRegionABand=7 -CP_SUPPORT=2 -CSPeriod=6 -DebugFlags=0 -DefaultKeyID=1 -DtimPeriod=1 -E2pAccessMode=2 -EAPifname=br-lan -EDCCAEnable=1 -EncrypType=NONE -EthConvertMode=dongle -EtherTrafficBand=0 -Ethifname= -ETxBfEnCond=1 -FineAGC=0 -FixedTxMode= -ForceRoamSupport= -FragThreshold=2346 -FreqDelta=0 -FtSupport=0 -GreenAP=0 -HideSSID=0 -HT_AMSDU=1 -HT_AutoBA=1 -HT_BADecline=0 -HT_BAWinSize=64 -HT_BSSCoexistence=1 -HT_BW=1 -HT_DisallowTKIP=1 -HT_EXTCHA=1 -HT_GI=1 -HT_HTC=1 -HT_LDPC=1 -HT_LinkAdapt=0 -HT_MCS=33 -HT_MpduDensity=5 -HT_OpMode=0 -HT_PROTECT=1 -HT_RxStream=2 -HT_STBC=1 -HT_TxStream=2 -IcapMode=0 -idle_timeout_interval=0 -IEEE80211H=1 -IEEE8021X=0 -IgmpSnEnable=0 -ITxBfEn=1 -Key1Str= -Key1Str1= -Key1Str10= -Key1Str11= -Key1Str12= -Key1Str13= -Key1Str14= -Key1Str15= -Key1Str16= -Key1Str2= -Key1Str3= -Key1Str4= -Key1Str5= -Key1Str6= -Key1Str7= -Key1Str8= -Key1Str9= -Key1Type=0 -Key2Str= -Key2Str1= -Key2Str10= -Key2Str11= -Key2Str12= -Key2Str13= -Key2Str14= -Key2Str15= -Key2Str16= -Key2Str2= -Key2Str3= -Key2Str4= -Key2Str5= -Key2Str6= -Key2Str7= -Key2Str8= -Key2Str9= -Key2Type=0 -Key3Str= -Key3Str1= -Key3Str10= -Key3Str11= -Key3Str12= -Key3Str13= -Key3Str14= -Key3Str15= -Key3Str16= -Key3Str2= -Key3Str3= -Key3Str4= -Key3Str5= -Key3Str6= -Key3Str7= -Key3Str8= -Key3Str9= -Key3Type=0 -Key4Str= -Key4Str1= -Key4Str10= -Key4Str11= -Key4Str12= -Key4Str13= -Key4Str14= -Key4Str15= -Key4Str16= -Key4Str2= -Key4Str3= -Key4Str4= -Key4Str5= -Key4Str6= -Key4Str7= -Key4Str8= -Key4Str9= -Key4Type=0 -LinkTestSupport=0 -MACRepeaterEn= -MACRepeaterOuiMode=2 -MUTxRxEnable=0 -NoForwarding=0 -NoForwardingBTNBSSID=0 -own_ip_addr=192.168.1.1 -PcieAspm=0 -PERCENTAGEenable=0 -PhyRateLimit=0 -PMFMFPC=1 -PMFMFPR=0 -PMFSHA256=0 -PMKCachePeriod=10 -PowerUpCckOfdm=0:0:0:0:0:0:0 -PowerUpHT20=0:0:0:0:0:0:0 -PowerUpHT40=0:0:0:0:0:0:0 -PowerUpVHT160=0:0:0:0:0:0:0 -PowerUpVHT20=0:0:0:0:0:0:0 -PowerUpVHT40=0:0:0:0:0:0:0 -PowerUpVHT80=0:0:0:0:0:0:0 -PreAntSwitch= -PreAuth=0 -PreAuthifname=br-lan -RadioLinkSelection=0 -RadioOn=1 -RADIUS_Acct_Key= -RADIUS_Acct_Port=1813 -RADIUS_Acct_Server= -RADIUS_Key1= -RADIUS_Key10= -RADIUS_Key11= -RADIUS_Key12= -RADIUS_Key13= -RADIUS_Key14= -RADIUS_Key15= -RADIUS_Key16= -RADIUS_Key2= -RADIUS_Key3= -RADIUS_Key4= -RADIUS_Key5= -RADIUS_Key6= -RADIUS_Key7= -RADIUS_Key8= -RADIUS_Key9= -RADIUS_Port=1812 -RADIUS_Server=0 -RDRegion= -RED_Enable=1 -RekeyInterval=3600 -RekeyMethod=DISABLE -RRMEnable=0 -RTSThreshold=2347 -session_timeout_interval=0 -ShortSlot=1 -SKUenable=0 -SSID= -SSID1=OpenWrt_2G -SSID10= -SSID11= -SSID12= -SSID13= -SSID14= -SSID15= -SSID16= -SSID2= -SSID3= -SSID4= -SSID5= -SSID6= -SSID7= -SSID8= -SSID9= -StationKeepAlive=0 -StreamMode=0 -StreamModeMac0= -StreamModeMac1= -StreamModeMac2= -StreamModeMac3= -TGnWifiTest=0 -ThermalRecal=0 -TxBurst=1 -TxPower=100 -TxPreamble=1 -VLANID=0 -VLANPriority=0 -VLANTag=0 -WCNTest=0 -Wds0Key= -Wds1Key= -Wds2Key= -Wds3Key= -WdsEnable=0 -WdsEncrypType=NONE -WdsList= -WdsPhyMode=0 -WHNAT=0 -WiFiTest=0 -WirelessMode=9 -WmmCapable=1 -WPAPSK= -WPAPSK1=12345678 -WPAPSK10= -WPAPSK11= -WPAPSK12= -WPAPSK13= -WPAPSK14= -WPAPSK15= -WPAPSK16= -WPAPSK2= -WPAPSK3= -WPAPSK4= -WPAPSK5= -WPAPSK6= -WPAPSK7= -WPAPSK8= -WPAPSK9= -WscConfMode=0 -WscConfStatus=2 diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7612.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7612.dat deleted file mode 100644 index 38a76f20a8..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7612.dat +++ /dev/null @@ -1,249 +0,0 @@ -#The word of "Default" must not be removed -Default -CountryRegion=1 -CountryRegionABand=0 -CountryCode=US -ChannelGeography=2 -BssidNum=1 -SSID1=OpenWrt_5G -SSID2= -SSID3= -SSID4= -SSID5= -SSID6= -SSID7= -SSID8= -WirelessMode=14 -E2pAccessMode=2 -Channel=36 -AutoChannelSelect=2 -AutoChannelSkipList=52;56;60;64 -BasicRate=336 -BeaconPeriod=100 -DtimPeriod=1 -TxPower=100 -DisableOLBC=0 -BGProtection=2 -TxPreamble=1 -RTSThreshold=2347 -FragThreshold=2346 -TxBurst=1 -PktAggregate=1 -FreqDelta=0 -WmmCapable=0;0 -APAifsn=3;7;1;1 -APCwmin=4;4;3;2 -APCwmax=6;10;4;3 -APTxop=0;0;94;47 -APACM=0;0;0;0 -BSSAifsn=3;7;2;2 -BSSCwmin=4;4;3;2 -BSSCwmax=10;10;4;3 -BSSTxop=0;0;94;47 -BSSACM=0;0;0;0 -AckPolicy=0;0;0;0 -APSDCapable=0 -DLSCapable=0;0 -NoForwarding=0;1 -NoForwardingMBCast=0;1 -NoForwardingBTNBSSID=1 -HideSSID=0;0 -ShortSlot=1 -IEEE80211H=0 -CarrierDetect=0 -PreAntSwitch= -PhyRateLimit=0 -DebugFlags=0 -FineAGC=0 -StreamMode=3 -StreamModeMac0= -StreamModeMac1= -StreamModeMac2= -StreamModeMac3= -CSPeriod=10 -RDRegion=FCC -StationKeepAlive=0;0 -DfsLowerLimit=0 -DfsUpperLimit=0 -DfsIndoor=0 -DFSParamFromConfig=0 -DfsOutdoor=0 -DfsEnable=0 -FCCParamCh0= -FCCParamCh1= -FCCParamCh2= -FCCParamCh3= -CEParamCh0= -CEParamCh1= -CEParamCh2= -CEParamCh3= -JAPParamCh0= -JAPParamCh1= -JAPParamCh2= -JAPParamCh3= -JAPW53ParamCh0= -JAPW53ParamCh1= -JAPW53ParamCh2= -JAPW53ParamCh3= -FixDfsLimit=0 -LongPulseRadarTh=0 -AvgRssiReq=0 -DFS_R66=0 -BlockCh= -GreenAP=0 -AuthMode=OPEN -EncrypType=NONE -WapiPsk1= -WapiPsk2= -WapiPsk3= -WapiPsk4= -WapiPsk5= -WapiPsk6= -WapiPsk7= -WapiPsk8= -WapiPskType= -Wapiifname= -WapiAsCertPath= -WapiUserCertPath= -WapiAsIpAddr= -WapiAsPort= -MeshAutoLink=0 -MeshAuthMode= -MeshEncrypType= -MeshDefaultkey=0 -MeshWEPKEY= -MeshWPAKEY= -MeshId= -RekeyMethod=TIME -RekeyInterval=3600 -PMKCachePeriod=10 -WPAPSK1=1234567890 -WPAPSK2= -WPAPSK3= -WPAPSK4= -WPAPSK5= -WPAPSK6= -WPAPSK7= -WPAPSK8= -DefaultKeyID=1 -Key1Type=0 -Key1Str1= -Key1Str2= -Key1Str3= -Key1Str4= -Key1Str5= -Key1Str6= -Key1Str7= -Key1Str8= -Key2Type=0 -Key2Str1= -Key2Str2= -Key2Str3= -Key2Str4= -Key2Str5= -Key2Str6= -Key2Str7= -Key2Str8= -Key3Type=0 -Key3Str1= -Key3Str2= -Key3Str3= -Key3Str4= -Key3Str5= -Key3Str6= -Key3Str7= -Key3Str8= -Key4Type=0 -Key4Str1= -Key4Str2= -Key4Str3= -Key4Str4= -Key4Str5= -Key4Str6= -Key4Str7= -Key4Str8= -HSCounter=0 -HT_HTC=0 -HT_RDG=0 -HT_LinkAdapt=0 -HT_OpMode=0 -HT_MpduDensity=5 -HT_EXTCHA=1 -HT_BW=1 -HT_BSSCoexistence=0 -HT_BSSCoexAPCntThr=10 -HT_AutoBA=1 -HT_BADecline=0 -HT_AMSDU=0 -HT_BAWinSize=64 -HT_GI=1 -HT_STBC=1 -FixedTxMode=0;0 -HT_MCS=33;33 -HT_TxStream=2 -HT_RxStream=2 -HT_PROTECT=1 -HT_DisallowTKIP=0 -HT_LDPC=0 -VHT_BW=1 -VHT_SGI=1 -VHT_BW_SIGNAL=0 -VHT_DisallowNonVHT=0 -VHT_LDPC=1 -VHT_STBC=0 -WscConfMode=0 -WscConfStatus=2 -WscVendorPinCode=12345670 -WscManufacturer=Youhua Technology -WscModelName=WPS Router -WscDeviceName=WPS Router -WscModelNumber=WR1200JS -WscSerialNumber=00000000 -WscV2Support=1 -ITxBfEn=1 -ETxBfEnCond=1 -ITxBfEnCond=1 -AccessPolicy0=0 -AccessControlList0= -AccessPolicy1=0 -AccessControlList1= -AccessPolicy2=0 -AccessControlList2= -AccessPolicy3=0 -AccessControlList3= -AccessPolicy4=0 -AccessControlList4= -AccessPolicy5=0 -AccessControlList5= -AccessPolicy6=0 -AccessControlList6= -AccessPolicy7=0 -AccessControlList7= -AccessPolicy8=0 -AccessControlList8= -WdsEnable=0 -WdsEncrypType=NONE -WdsList= -WdsKey= -session_timeout_interval=0 -own_ip_addr= -EAPifname= -PreAuthifname= -PreAuth=0;0 -IEEE8021X=0;0 -RADIUS_Server=; -RADIUS_Port=1812;1812 -RADIUS_Key1= -RADIUS_Key2= -RADIUS_Key3= -RADIUS_Key4= -RADIUS_Key5= -RADIUS_Key6= -RADIUS_Key7= -RADIUS_Key8= -WiFiTest=0 -TGnWifiTest=0 -RadioOn=1 -IgmpSnEnable=1 -McastPhyMode=2 -McastMcs=0 diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615.1.2G.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7615.1.2G.dat deleted file mode 100644 index 3ba192c5bd..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7615.1.2G.dat +++ /dev/null @@ -1,384 +0,0 @@ -Default -AccessControlList0= -AccessControlList1= -AccessControlList10= -AccessControlList11= -AccessControlList12= -AccessControlList13= -AccessControlList14= -AccessControlList15= -AccessControlList2= -AccessControlList3= -AccessControlList4= -AccessControlList5= -AccessControlList6= -AccessControlList7= -AccessControlList8= -AccessControlList9= -AccessPolicy0=0 -AccessPolicy1=0 -AccessPolicy10=0 -AccessPolicy11=0 -AccessPolicy12=0 -AccessPolicy13=0 -AccessPolicy14=0 -AccessPolicy15=0 -AccessPolicy2=0 -AccessPolicy3=0 -AccessPolicy4=0 -AccessPolicy5=0 -AccessPolicy6=0 -AccessPolicy7=0 -AccessPolicy8=0 -AccessPolicy9=0 -AckPolicy=0;0;0;0 -AntCtrl= -APACM=0;0;0;0 -APAifsn=3;7;1;1 -ApCliAuthMode= -ApCliBssid= -ApCliDefaultKeyID= -ApCliEnable= -ApCliEncrypType= -ApCliKey1Str= -ApCliKey1Str1= -ApCliKey1Type= -ApCliKey2Str= -ApCliKey2Str1= -ApCliKey2Type= -ApCliKey3Str= -ApCliKey3Str1= -ApCliKey3Type= -ApCliKey4Str= -ApCliKey4Str1= -ApCliKey4Type= -ApCliPMFMFPC= -ApCliPMFMFPR= -ApCliPMFSHA256= -ApCliSsid= -ApCliTxMcs= -ApCliTxMode= -ApCliUAPSDCapable= -ApCliWirelessMode= -ApCliWPAPSK= -ApCliWPAPSK1= -ApCli_Wsc4digitPinCode= -ApCliWscScanMode= -APCwmax=6;10;4;3 -APCwmin=4;4;3;2 -APTxop=0;0;94;47 -AuthMode=OPEN -AutoChannelSelect=0 -AutoChannelSkipList= -BandSteering=0 -BasicRate=15 -BeaconPeriod=100 -BFBACKOFFenable=0 -BgndScanSkipCh= -BGProtection=0 -BndStrgBssIdx= -BSSACM=0;0;0;0 -BSSAifsn=3;7;2;2 -BSSCwmax=10;10;4;3 -BSSCwmin=4;4;3;2 -BssidNum=1 -BSSTxop=0;0;94;47 -CalCacheApply=0 -CarrierDetect=0 -Channel=6 -ChannelGrp= -CountryCode=US -CountryRegion=5 -CountryRegionABand=7 -CP_SUPPORT=2 -DBDC_MODE=1 -DebugFlags=0 -DefaultKeyID=1 -DfsCalibration=0 -DfsEnable=0 -DfsZeroWait=0 -DfsZeroWaitCacTime=255 -DisableOLBC=0 -DscpPriMapBss= -DscpQosMap= -DscpQosMapEnable= -DtimPeriod=1 -E2pAccessMode=2 -EAPifname=br-lan -EDCCAEnable=1 -EfuseBufferMode= -EncrypType=NONE -EtherTrafficBand=0 -ETxBfEnCond=1 -FixedTxMode= -FQ_Enable=1 -FragThreshold=2346 -FreqDelta=0 -FtMdId= -FtOtd=0 -FtRic=0 -FtSupport=0 -G_BAND_256QAM=1 -GreenAP=1 -HideSSID=0 -HT_AMSDU=1 -HT_AutoBA=1 -HT_BADecline=0 -HT_BAWinSize=64 -HT_BSSCoexistence=1 -HT_BW=1 -HT_DisallowTKIP=1 -HT_EXTCHA=1 -HT_GI=1 -HT_LDPC=1 -HT_MCS=33 -HT_MpduDensity=5 -HT_OpMode=0 -HT_PROTECT=1 -HT_RDG=0 -HT_RxStream=2 -HT_STBC=1 -HT_TxStream=2 -IcapMode=0 -IEEE80211H=0 -IEEE8021X=0 -IgmpSnEnable=0 -ITxBfEn=1 -Key1Str= -Key1Str1= -Key1Str10= -Key1Str11= -Key1Str12= -Key1Str13= -Key1Str14= -Key1Str15= -Key1Str16= -Key1Str2= -Key1Str3= -Key1Str4= -Key1Str5= -Key1Str6= -Key1Str7= -Key1Str8= -Key1Str9= -Key1Type=0 -Key2Str= -Key2Str1= -Key2Str10= -Key2Str11= -Key2Str12= -Key2Str13= -Key2Str14= -Key2Str15= -Key2Str16= -Key2Str2= -Key2Str3= -Key2Str4= -Key2Str5= -Key2Str6= -Key2Str7= -Key2Str8= -Key2Str9= -Key2Type=0 -Key3Str= -Key3Str1= -Key3Str10= -Key3Str11= -Key3Str12= -Key3Str13= -Key3Str14= -Key3Str15= -Key3Str16= -Key3Str2= -Key3Str3= -Key3Str4= -Key3Str5= -Key3Str6= -Key3Str7= -Key3Str8= -Key3Str9= -Key3Type=0 -Key4Str= -Key4Str1= -Key4Str10= -Key4Str11= -Key4Str12= -Key4Str13= -Key4Str14= -Key4Str15= -Key4Str16= -Key4Str2= -Key4Str3= -Key4Str4= -Key4Str5= -Key4Str6= -Key4Str7= -Key4Str8= -Key4Str9= -Key4Type=0 -MacAddress= -MACRepeaterEn= -MACRepeaterOuiMode=2 -MboSupport=0 -MbssMaxStaNum= -MgmtTxPwr= -MUTxRxEnable=1 -NoForwarding=0 -NoForwardingBTNBSSID=0 -own_ip_addr=192.168.1.1 -PcieAspm=1 -PERCENTAGEenable=0 -PktAggregate= -PMFMFPC=1 -PMFMFPR=0 -PMFSHA256=0 -PMKCachePeriod=10 -PowerUpCckOfdm=0:0:0:0:0:0:0 -PowerUpHT20=0:0:0:0:0:0:0 -PowerUpHT40=0:0:0:0:0:0:0 -PowerUpVHT160=0:0:0:0:0:0:0 -PowerUpVHT20=0:0:0:0:0:0:0 -PowerUpVHT40=0:0:0:0:0:0:0 -PowerUpVHT80=0:0:0:0:0:0:0 -PreAuth=0 -PreAuthifname=br-lan -PWDID= -PWDIDR= -PweMethod=0 -QuickChannelSwitch= -RadioOn=1 -RADIUS_Acct_Key= -RADIUS_Acct_Port=1813 -RADIUS_Acct_Server= -RADIUS_Key1= -RADIUS_Key10= -RADIUS_Key11= -RADIUS_Key12= -RADIUS_Key13= -RADIUS_Key14= -RADIUS_Key15= -RADIUS_Key16= -RADIUS_Key2= -RADIUS_Key3= -RADIUS_Key4= -RADIUS_Key5= -RADIUS_Key6= -RADIUS_Key7= -RADIUS_Key8= -RADIUS_Key9= -RADIUS_Port=1812 -RADIUS_Server= -RDRegion= -RED_Enable=1 -RekeyInterval=3600 -RekeyMethod=DISABLE -RRMEnable=0 -RTSPktThreshold= -RTSThreshold=2347 -session_timeout_interval=0 -ShortSlot=1 -SKUenable=0 -SSID= -SSID10= -SSID11= -SSID12= -SSID13= -SSID14= -SSID15= -SSID16= -SSID1=OpenWrt -SSID2= -SSID3= -SSID4= -SSID5= -SSID6= -SSID7= -SSID8= -SSID9= -StationKeepAlive=0 -StreamMode=0 -StreamModeMac0= -StreamModeMac1= -StreamModeMac2= -StreamModeMac3= -TxBurst=1 -TxPower=100 -TxPreamble=1 -UAPSDCapable=1 -VHT_BW=1 -VHT_BW_SIGNAL=0 -VHT_LDPC=1 -VHT_Sec80_Channel=0 -VHT_SGI=1 -VHT_STBC=1 -VLANID=0 -VLANTag=0 -VOW_Airtime_Ctrl_En= -VOW_Airtime_Fairness_En=1 -VOW_BW_Ctrl=0 -VOW_Group_Backlog= -VOW_Group_DWRR_Max_Wait_Time= -VOW_Group_DWRR_Quantum= -VOW_Group_Max_Airtime_Bucket_Size= -VOW_Group_Max_Rate= -VOW_Group_Max_Rate_Bucket_Size= -VOW_Group_Max_Ratio= -VOW_Group_Max_Wait_Time= -VOW_Group_Min_Airtime_Bucket_Size= -VOW_Group_Min_Rate= -VOW_Group_Min_Rate_Bucket_Size= -VOW_Group_Min_Ratio= -VOW_Rate_Ctrl_En= -VOW_Refill_Period= -VOW_RX_En=1 -VOW_Sta_BE_DWRR_Quantum= -VOW_Sta_BK_DWRR_Quantum= -VOW_Sta_DWRR_Max_Wait_Time= -VOW_Sta_VI_DWRR_Quantum= -VOW_Sta_VO_DWRR_Quantum= -VOW_WATF_Enable= -VOW_WATF_MAC_LV0= -VOW_WATF_MAC_LV1= -VOW_WATF_MAC_LV2= -VOW_WATF_MAC_LV3= -VOW_WATF_Q_LV0= -VOW_WATF_Q_LV1= -VOW_WATF_Q_LV2= -VOW_WATF_Q_LV3= -VOW_WMM_Search_Rule_Band0= -VOW_WMM_Search_Rule_Band1= -WCNTest=0 -Wds0Key= -Wds1Key= -Wds2Key= -Wds3Key= -WdsEnable=0 -WdsEncrypType=NONE -WdsList= -WdsPhyMode=0 -WHNAT=0 -WirelessMode=9 -WmmCapable=1 -WNMEnable=0 -WPAPSK= -WPAPSK10= -WPAPSK11= -WPAPSK12= -WPAPSK13= -WPAPSK14= -WPAPSK15= -WPAPSK16= -WPAPSK1=12345678 -WPAPSK2= -WPAPSK3= -WPAPSK4= -WPAPSK5= -WPAPSK6= -WPAPSK7= -WPAPSK8= -WPAPSK9= -WscConfMethods= -WscConfMode=0 -WscConfStatus=2 -WscV2Support= - diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615.1.5G.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7615.1.5G.dat deleted file mode 100644 index 24273e0e63..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7615.1.5G.dat +++ /dev/null @@ -1,384 +0,0 @@ -Default -AccessControlList0= -AccessControlList1= -AccessControlList10= -AccessControlList11= -AccessControlList12= -AccessControlList13= -AccessControlList14= -AccessControlList15= -AccessControlList2= -AccessControlList3= -AccessControlList4= -AccessControlList5= -AccessControlList6= -AccessControlList7= -AccessControlList8= -AccessControlList9= -AccessPolicy0=0 -AccessPolicy1=0 -AccessPolicy10=0 -AccessPolicy11=0 -AccessPolicy12=0 -AccessPolicy13=0 -AccessPolicy14=0 -AccessPolicy15=0 -AccessPolicy2=0 -AccessPolicy3=0 -AccessPolicy4=0 -AccessPolicy5=0 -AccessPolicy6=0 -AccessPolicy7=0 -AccessPolicy8=0 -AccessPolicy9=0 -AckPolicy=0;0;0;0 -AntCtrl= -APACM=0;0;0;0 -APAifsn=3;7;1;1 -ApCliAuthMode= -ApCliBssid= -ApCliDefaultKeyID= -ApCliEnable= -ApCliEncrypType= -ApCliKey1Str= -ApCliKey1Str1= -ApCliKey1Type= -ApCliKey2Str= -ApCliKey2Str1= -ApCliKey2Type= -ApCliKey3Str= -ApCliKey3Str1= -ApCliKey3Type= -ApCliKey4Str= -ApCliKey4Str1= -ApCliKey4Type= -ApCliPMFMFPC= -ApCliPMFMFPR= -ApCliPMFSHA256= -ApCliSsid= -ApCliTxMcs= -ApCliTxMode= -ApCliUAPSDCapable= -ApCliWirelessMode= -ApCliWPAPSK= -ApCliWPAPSK1= -ApCli_Wsc4digitPinCode= -ApCliWscScanMode= -APCwmax=6;10;4;3 -APCwmin=4;4;3;2 -APTxop=0;0;94;47 -AuthMode=OPEN -AutoChannelSelect=0 -AutoChannelSkipList= -BandSteering=0 -BasicRate=15 -BeaconPeriod=100 -BFBACKOFFenable=0 -BgndScanSkipCh= -BGProtection=0 -BndStrgBssIdx= -BSSACM=0;0;0;0 -BSSAifsn=3;7;2;2 -BSSCwmax=10;10;4;3 -BSSCwmin=4;4;3;2 -BssidNum=1 -BSSTxop=0;0;94;47 -CalCacheApply=0 -CarrierDetect=0 -Channel=36 -ChannelGrp= -CountryCode=US -CountryRegion=5 -CountryRegionABand=7 -CP_SUPPORT=2 -DBDC_MODE=1 -DebugFlags=0 -DefaultKeyID=1 -DfsCalibration=0 -DfsEnable=0 -DfsZeroWait=0 -DfsZeroWaitCacTime=255 -DisableOLBC=0 -DscpPriMapBss= -DscpQosMap= -DscpQosMapEnable= -DtimPeriod=1 -E2pAccessMode=2 -EAPifname=br-lan -EDCCAEnable=1 -EfuseBufferMode= -EncrypType=NONE -EtherTrafficBand=0 -ETxBfEnCond=1 -FixedTxMode= -FQ_Enable=1 -FragThreshold=2346 -FreqDelta=0 -FtMdId= -FtOtd=0 -FtRic=0 -FtSupport=0 -G_BAND_256QAM=1 -GreenAP=1 -HideSSID=0 -HT_AMSDU=1 -HT_AutoBA=1 -HT_BADecline=0 -HT_BAWinSize=64 -HT_BSSCoexistence=1 -HT_BW=1 -HT_DisallowTKIP=1 -HT_EXTCHA=1 -HT_GI=1 -HT_LDPC=1 -HT_MCS=33 -HT_MpduDensity=5 -HT_OpMode=0 -HT_PROTECT=1 -HT_RDG=0 -HT_RxStream=2 -HT_STBC=1 -HT_TxStream=2 -IcapMode=0 -IEEE80211H=0 -IEEE8021X=0 -IgmpSnEnable=0 -ITxBfEn=1 -Key1Str= -Key1Str1= -Key1Str10= -Key1Str11= -Key1Str12= -Key1Str13= -Key1Str14= -Key1Str15= -Key1Str16= -Key1Str2= -Key1Str3= -Key1Str4= -Key1Str5= -Key1Str6= -Key1Str7= -Key1Str8= -Key1Str9= -Key1Type=0 -Key2Str= -Key2Str1= -Key2Str10= -Key2Str11= -Key2Str12= -Key2Str13= -Key2Str14= -Key2Str15= -Key2Str16= -Key2Str2= -Key2Str3= -Key2Str4= -Key2Str5= -Key2Str6= -Key2Str7= -Key2Str8= -Key2Str9= -Key2Type=0 -Key3Str= -Key3Str1= -Key3Str10= -Key3Str11= -Key3Str12= -Key3Str13= -Key3Str14= -Key3Str15= -Key3Str16= -Key3Str2= -Key3Str3= -Key3Str4= -Key3Str5= -Key3Str6= -Key3Str7= -Key3Str8= -Key3Str9= -Key3Type=0 -Key4Str= -Key4Str1= -Key4Str10= -Key4Str11= -Key4Str12= -Key4Str13= -Key4Str14= -Key4Str15= -Key4Str16= -Key4Str2= -Key4Str3= -Key4Str4= -Key4Str5= -Key4Str6= -Key4Str7= -Key4Str8= -Key4Str9= -Key4Type=0 -MacAddress= -MACRepeaterEn= -MACRepeaterOuiMode=2 -MboSupport=0 -MbssMaxStaNum= -MgmtTxPwr= -MUTxRxEnable=1 -NoForwarding=0 -NoForwardingBTNBSSID=0 -own_ip_addr=192.168.1.1 -PcieAspm=1 -PERCENTAGEenable=0 -PktAggregate= -PMFMFPC=1 -PMFMFPR=0 -PMFSHA256=0 -PMKCachePeriod=10 -PowerUpCckOfdm=0:0:0:0:0:0:0 -PowerUpHT20=0:0:0:0:0:0:0 -PowerUpHT40=0:0:0:0:0:0:0 -PowerUpVHT160=0:0:0:0:0:0:0 -PowerUpVHT20=0:0:0:0:0:0:0 -PowerUpVHT40=0:0:0:0:0:0:0 -PowerUpVHT80=0:0:0:0:0:0:0 -PreAuth=0 -PreAuthifname=br-lan -PWDID= -PWDIDR= -PweMethod=0 -QuickChannelSwitch= -RadioOn=1 -RADIUS_Acct_Key= -RADIUS_Acct_Port=1813 -RADIUS_Acct_Server= -RADIUS_Key1= -RADIUS_Key10= -RADIUS_Key11= -RADIUS_Key12= -RADIUS_Key13= -RADIUS_Key14= -RADIUS_Key15= -RADIUS_Key16= -RADIUS_Key2= -RADIUS_Key3= -RADIUS_Key4= -RADIUS_Key5= -RADIUS_Key6= -RADIUS_Key7= -RADIUS_Key8= -RADIUS_Key9= -RADIUS_Port=1812 -RADIUS_Server= -RDRegion= -RED_Enable=1 -RekeyInterval=3600 -RekeyMethod=DISABLE -RRMEnable=0 -RTSPktThreshold= -RTSThreshold=2347 -session_timeout_interval=0 -ShortSlot=1 -SKUenable=0 -SSID= -SSID10= -SSID11= -SSID12= -SSID13= -SSID14= -SSID15= -SSID16= -SSID1=OpenWrt_5G -SSID2= -SSID3= -SSID4= -SSID5= -SSID6= -SSID7= -SSID8= -SSID9= -StationKeepAlive=0 -StreamMode=0 -StreamModeMac0= -StreamModeMac1= -StreamModeMac2= -StreamModeMac3= -TxBurst=1 -TxPower=100 -TxPreamble=1 -UAPSDCapable=1 -VHT_BW=1 -VHT_BW_SIGNAL=0 -VHT_LDPC=1 -VHT_Sec80_Channel=0 -VHT_SGI=1 -VHT_STBC=1 -VLANID=0 -VLANTag=0 -VOW_Airtime_Ctrl_En= -VOW_Airtime_Fairness_En=1 -VOW_BW_Ctrl=0 -VOW_Group_Backlog= -VOW_Group_DWRR_Max_Wait_Time= -VOW_Group_DWRR_Quantum= -VOW_Group_Max_Airtime_Bucket_Size= -VOW_Group_Max_Rate= -VOW_Group_Max_Rate_Bucket_Size= -VOW_Group_Max_Ratio= -VOW_Group_Max_Wait_Time= -VOW_Group_Min_Airtime_Bucket_Size= -VOW_Group_Min_Rate= -VOW_Group_Min_Rate_Bucket_Size= -VOW_Group_Min_Ratio= -VOW_Rate_Ctrl_En= -VOW_Refill_Period= -VOW_RX_En=1 -VOW_Sta_BE_DWRR_Quantum= -VOW_Sta_BK_DWRR_Quantum= -VOW_Sta_DWRR_Max_Wait_Time= -VOW_Sta_VI_DWRR_Quantum= -VOW_Sta_VO_DWRR_Quantum= -VOW_WATF_Enable= -VOW_WATF_MAC_LV0= -VOW_WATF_MAC_LV1= -VOW_WATF_MAC_LV2= -VOW_WATF_MAC_LV3= -VOW_WATF_Q_LV0= -VOW_WATF_Q_LV1= -VOW_WATF_Q_LV2= -VOW_WATF_Q_LV3= -VOW_WMM_Search_Rule_Band0= -VOW_WMM_Search_Rule_Band1= -WCNTest=0 -Wds0Key= -Wds1Key= -Wds2Key= -Wds3Key= -WdsEnable=0 -WdsEncrypType=NONE -WdsList= -WdsPhyMode=0 -WHNAT=0 -WirelessMode=14 -WmmCapable=1 -WNMEnable=0 -WPAPSK= -WPAPSK10= -WPAPSK11= -WPAPSK12= -WPAPSK13= -WPAPSK14= -WPAPSK15= -WPAPSK16= -WPAPSK1=12345678 -WPAPSK2= -WPAPSK3= -WPAPSK4= -WPAPSK5= -WPAPSK6= -WPAPSK7= -WPAPSK8= -WPAPSK9= -WscConfMethods= -WscConfMode=0 -WscConfStatus=2 -WscV2Support= - diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615.2G.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7615.2G.dat deleted file mode 100644 index c9293ac3f5..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7615.2G.dat +++ /dev/null @@ -1,384 +0,0 @@ -Default -AccessControlList0= -AccessControlList1= -AccessControlList10= -AccessControlList11= -AccessControlList12= -AccessControlList13= -AccessControlList14= -AccessControlList15= -AccessControlList2= -AccessControlList3= -AccessControlList4= -AccessControlList5= -AccessControlList6= -AccessControlList7= -AccessControlList8= -AccessControlList9= -AccessPolicy0=0 -AccessPolicy1=0 -AccessPolicy10=0 -AccessPolicy11=0 -AccessPolicy12=0 -AccessPolicy13=0 -AccessPolicy14=0 -AccessPolicy15=0 -AccessPolicy2=0 -AccessPolicy3=0 -AccessPolicy4=0 -AccessPolicy5=0 -AccessPolicy6=0 -AccessPolicy7=0 -AccessPolicy8=0 -AccessPolicy9=0 -AckPolicy=0;0;0;0 -AntCtrl= -APACM=0;0;0;0 -APAifsn=3;7;1;1 -ApCliAuthMode= -ApCliBssid= -ApCliDefaultKeyID= -ApCliEnable= -ApCliEncrypType= -ApCliKey1Str= -ApCliKey1Str1= -ApCliKey1Type= -ApCliKey2Str= -ApCliKey2Str1= -ApCliKey2Type= -ApCliKey3Str= -ApCliKey3Str1= -ApCliKey3Type= -ApCliKey4Str= -ApCliKey4Str1= -ApCliKey4Type= -ApCliPMFMFPC= -ApCliPMFMFPR= -ApCliPMFSHA256= -ApCliSsid= -ApCliTxMcs= -ApCliTxMode= -ApCliUAPSDCapable= -ApCliWirelessMode= -ApCliWPAPSK= -ApCliWPAPSK1= -ApCli_Wsc4digitPinCode= -ApCliWscScanMode= -APCwmax=6;10;4;3 -APCwmin=4;4;3;2 -APTxop=0;0;94;47 -AuthMode=OPEN -AutoChannelSelect=0 -AutoChannelSkipList= -BandSteering=0 -BasicRate=15 -BeaconPeriod=100 -BFBACKOFFenable=0 -BgndScanSkipCh= -BGProtection=0 -BndStrgBssIdx= -BSSACM=0;0;0;0 -BSSAifsn=3;7;2;2 -BSSCwmax=10;10;4;3 -BSSCwmin=4;4;3;2 -BssidNum=1 -BSSTxop=0;0;94;47 -CalCacheApply=0 -CarrierDetect=0 -Channel=6 -ChannelGrp= -CountryCode=US -CountryRegion=5 -CountryRegionABand=7 -CP_SUPPORT=2 -DBDC_MODE=0 -DebugFlags=0 -DefaultKeyID=1 -DfsCalibration=0 -DfsEnable=0 -DfsZeroWait=0 -DfsZeroWaitCacTime=255 -DisableOLBC=0 -DscpPriMapBss= -DscpQosMap= -DscpQosMapEnable= -DtimPeriod=1 -E2pAccessMode=2 -EAPifname=br-lan -EDCCAEnable=1 -EfuseBufferMode= -EncrypType=NONE -EtherTrafficBand=0 -ETxBfEnCond=1 -FixedTxMode= -FQ_Enable=1 -FragThreshold=2346 -FreqDelta=0 -FtMdId= -FtOtd=0 -FtRic=0 -FtSupport=0 -G_BAND_256QAM=1 -GreenAP=1 -HideSSID=0 -HT_AMSDU=1 -HT_AutoBA=1 -HT_BADecline=0 -HT_BAWinSize=64 -HT_BSSCoexistence=1 -HT_BW=1 -HT_DisallowTKIP=1 -HT_EXTCHA=1 -HT_GI=1 -HT_LDPC=1 -HT_MCS=33 -HT_MpduDensity=5 -HT_OpMode=0 -HT_PROTECT=1 -HT_RDG=0 -HT_RxStream=4 -HT_STBC=1 -HT_TxStream=4 -IcapMode=0 -IEEE80211H=0 -IEEE8021X=0 -IgmpSnEnable=0 -ITxBfEn=1 -Key1Str= -Key1Str1= -Key1Str10= -Key1Str11= -Key1Str12= -Key1Str13= -Key1Str14= -Key1Str15= -Key1Str16= -Key1Str2= -Key1Str3= -Key1Str4= -Key1Str5= -Key1Str6= -Key1Str7= -Key1Str8= -Key1Str9= -Key1Type=0 -Key2Str= -Key2Str1= -Key2Str10= -Key2Str11= -Key2Str12= -Key2Str13= -Key2Str14= -Key2Str15= -Key2Str16= -Key2Str2= -Key2Str3= -Key2Str4= -Key2Str5= -Key2Str6= -Key2Str7= -Key2Str8= -Key2Str9= -Key2Type=0 -Key3Str= -Key3Str1= -Key3Str10= -Key3Str11= -Key3Str12= -Key3Str13= -Key3Str14= -Key3Str15= -Key3Str16= -Key3Str2= -Key3Str3= -Key3Str4= -Key3Str5= -Key3Str6= -Key3Str7= -Key3Str8= -Key3Str9= -Key3Type=0 -Key4Str= -Key4Str1= -Key4Str10= -Key4Str11= -Key4Str12= -Key4Str13= -Key4Str14= -Key4Str15= -Key4Str16= -Key4Str2= -Key4Str3= -Key4Str4= -Key4Str5= -Key4Str6= -Key4Str7= -Key4Str8= -Key4Str9= -Key4Type=0 -MacAddress= -MACRepeaterEn= -MACRepeaterOuiMode=2 -MboSupport=0 -MbssMaxStaNum= -MgmtTxPwr= -MUTxRxEnable=1 -NoForwarding=0 -NoForwardingBTNBSSID=0 -own_ip_addr=192.168.1.1 -PcieAspm=1 -PERCENTAGEenable=0 -PktAggregate= -PMFMFPC=1 -PMFMFPR=0 -PMFSHA256=0 -PMKCachePeriod=10 -PowerUpCckOfdm=0:0:0:0:0:0:0 -PowerUpHT20=0:0:0:0:0:0:0 -PowerUpHT40=0:0:0:0:0:0:0 -PowerUpVHT160=0:0:0:0:0:0:0 -PowerUpVHT20=0:0:0:0:0:0:0 -PowerUpVHT40=0:0:0:0:0:0:0 -PowerUpVHT80=0:0:0:0:0:0:0 -PreAuth=0 -PreAuthifname=br-lan -PWDID= -PWDIDR= -PweMethod=0 -QuickChannelSwitch= -RadioOn=1 -RADIUS_Acct_Key= -RADIUS_Acct_Port=1813 -RADIUS_Acct_Server= -RADIUS_Key1= -RADIUS_Key10= -RADIUS_Key11= -RADIUS_Key12= -RADIUS_Key13= -RADIUS_Key14= -RADIUS_Key15= -RADIUS_Key16= -RADIUS_Key2= -RADIUS_Key3= -RADIUS_Key4= -RADIUS_Key5= -RADIUS_Key6= -RADIUS_Key7= -RADIUS_Key8= -RADIUS_Key9= -RADIUS_Port=1812 -RADIUS_Server= -RDRegion= -RED_Enable=1 -RekeyInterval=3600 -RekeyMethod=DISABLE -RRMEnable=0 -RTSPktThreshold= -RTSThreshold=2347 -session_timeout_interval=0 -ShortSlot=1 -SKUenable=0 -SSID= -SSID10= -SSID11= -SSID12= -SSID13= -SSID14= -SSID15= -SSID16= -SSID1=OpenWrt -SSID2= -SSID3= -SSID4= -SSID5= -SSID6= -SSID7= -SSID8= -SSID9= -StationKeepAlive=0 -StreamMode=0 -StreamModeMac0= -StreamModeMac1= -StreamModeMac2= -StreamModeMac3= -TxBurst=1 -TxPower=100 -TxPreamble=1 -UAPSDCapable=1 -VHT_BW=1 -VHT_BW_SIGNAL=0 -VHT_LDPC=1 -VHT_Sec80_Channel=0 -VHT_SGI=1 -VHT_STBC=1 -VLANID=0 -VLANTag=0 -VOW_Airtime_Ctrl_En= -VOW_Airtime_Fairness_En=1 -VOW_BW_Ctrl=0 -VOW_Group_Backlog= -VOW_Group_DWRR_Max_Wait_Time= -VOW_Group_DWRR_Quantum= -VOW_Group_Max_Airtime_Bucket_Size= -VOW_Group_Max_Rate= -VOW_Group_Max_Rate_Bucket_Size= -VOW_Group_Max_Ratio= -VOW_Group_Max_Wait_Time= -VOW_Group_Min_Airtime_Bucket_Size= -VOW_Group_Min_Rate= -VOW_Group_Min_Rate_Bucket_Size= -VOW_Group_Min_Ratio= -VOW_Rate_Ctrl_En= -VOW_Refill_Period= -VOW_RX_En=1 -VOW_Sta_BE_DWRR_Quantum= -VOW_Sta_BK_DWRR_Quantum= -VOW_Sta_DWRR_Max_Wait_Time= -VOW_Sta_VI_DWRR_Quantum= -VOW_Sta_VO_DWRR_Quantum= -VOW_WATF_Enable= -VOW_WATF_MAC_LV0= -VOW_WATF_MAC_LV1= -VOW_WATF_MAC_LV2= -VOW_WATF_MAC_LV3= -VOW_WATF_Q_LV0= -VOW_WATF_Q_LV1= -VOW_WATF_Q_LV2= -VOW_WATF_Q_LV3= -VOW_WMM_Search_Rule_Band0= -VOW_WMM_Search_Rule_Band1= -WCNTest=0 -Wds0Key= -Wds1Key= -Wds2Key= -Wds3Key= -WdsEnable=0 -WdsEncrypType=NONE -WdsList= -WdsPhyMode=0 -WHNAT=0 -WirelessMode=9 -WmmCapable=1 -WNMEnable=0 -WPAPSK= -WPAPSK10= -WPAPSK11= -WPAPSK12= -WPAPSK13= -WPAPSK14= -WPAPSK15= -WPAPSK16= -WPAPSK1=12345678 -WPAPSK2= -WPAPSK3= -WPAPSK4= -WPAPSK5= -WPAPSK6= -WPAPSK7= -WPAPSK8= -WPAPSK9= -WscConfMethods= -WscConfMode=0 -WscConfStatus=2 -WscV2Support= - diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615.5G.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7615.5G.dat deleted file mode 100644 index 4bd083be4f..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7615.5G.dat +++ /dev/null @@ -1,384 +0,0 @@ -Default -AccessControlList0= -AccessControlList1= -AccessControlList10= -AccessControlList11= -AccessControlList12= -AccessControlList13= -AccessControlList14= -AccessControlList15= -AccessControlList2= -AccessControlList3= -AccessControlList4= -AccessControlList5= -AccessControlList6= -AccessControlList7= -AccessControlList8= -AccessControlList9= -AccessPolicy0=0 -AccessPolicy1=0 -AccessPolicy10=0 -AccessPolicy11=0 -AccessPolicy12=0 -AccessPolicy13=0 -AccessPolicy14=0 -AccessPolicy15=0 -AccessPolicy2=0 -AccessPolicy3=0 -AccessPolicy4=0 -AccessPolicy5=0 -AccessPolicy6=0 -AccessPolicy7=0 -AccessPolicy8=0 -AccessPolicy9=0 -AckPolicy=0;0;0;0 -AntCtrl= -APACM=0;0;0;0 -APAifsn=3;7;1;1 -ApCliAuthMode= -ApCliBssid= -ApCliDefaultKeyID= -ApCliEnable= -ApCliEncrypType= -ApCliKey1Str= -ApCliKey1Str1= -ApCliKey1Type= -ApCliKey2Str= -ApCliKey2Str1= -ApCliKey2Type= -ApCliKey3Str= -ApCliKey3Str1= -ApCliKey3Type= -ApCliKey4Str= -ApCliKey4Str1= -ApCliKey4Type= -ApCliPMFMFPC= -ApCliPMFMFPR= -ApCliPMFSHA256= -ApCliSsid= -ApCliTxMcs= -ApCliTxMode= -ApCliUAPSDCapable= -ApCliWirelessMode= -ApCliWPAPSK= -ApCliWPAPSK1= -ApCli_Wsc4digitPinCode= -ApCliWscScanMode= -APCwmax=6;10;4;3 -APCwmin=4;4;3;2 -APTxop=0;0;94;47 -AuthMode=OPEN -AutoChannelSelect=0 -AutoChannelSkipList= -BandSteering=0 -BasicRate=15 -BeaconPeriod=100 -BFBACKOFFenable=0 -BgndScanSkipCh= -BGProtection=0 -BndStrgBssIdx= -BSSACM=0;0;0;0 -BSSAifsn=3;7;2;2 -BSSCwmax=10;10;4;3 -BSSCwmin=4;4;3;2 -BssidNum=1 -BSSTxop=0;0;94;47 -CalCacheApply=0 -CarrierDetect=0 -Channel=36 -ChannelGrp= -CountryCode=US -CountryRegion=5 -CountryRegionABand=7 -CP_SUPPORT=2 -DBDC_MODE=0 -DebugFlags=0 -DefaultKeyID=1 -DfsCalibration=0 -DfsEnable=0 -DfsZeroWait=0 -DfsZeroWaitCacTime=255 -DisableOLBC=0 -DscpPriMapBss= -DscpQosMap= -DscpQosMapEnable= -DtimPeriod=1 -E2pAccessMode=2 -EAPifname=br-lan -EDCCAEnable=1 -EfuseBufferMode= -EncrypType=NONE -EtherTrafficBand=0 -ETxBfEnCond=1 -FixedTxMode= -FQ_Enable=1 -FragThreshold=2346 -FreqDelta=0 -FtMdId= -FtOtd=0 -FtRic=0 -FtSupport=0 -G_BAND_256QAM=1 -GreenAP=1 -HideSSID=0 -HT_AMSDU=1 -HT_AutoBA=1 -HT_BADecline=0 -HT_BAWinSize=64 -HT_BSSCoexistence=1 -HT_BW=1 -HT_DisallowTKIP=1 -HT_EXTCHA=1 -HT_GI=1 -HT_LDPC=1 -HT_MCS=33 -HT_MpduDensity=5 -HT_OpMode=0 -HT_PROTECT=1 -HT_RDG=0 -HT_RxStream=4 -HT_STBC=1 -HT_TxStream=4 -IcapMode=0 -IEEE80211H=0 -IEEE8021X=0 -IgmpSnEnable=0 -ITxBfEn=1 -Key1Str= -Key1Str1= -Key1Str10= -Key1Str11= -Key1Str12= -Key1Str13= -Key1Str14= -Key1Str15= -Key1Str16= -Key1Str2= -Key1Str3= -Key1Str4= -Key1Str5= -Key1Str6= -Key1Str7= -Key1Str8= -Key1Str9= -Key1Type=0 -Key2Str= -Key2Str1= -Key2Str10= -Key2Str11= -Key2Str12= -Key2Str13= -Key2Str14= -Key2Str15= -Key2Str16= -Key2Str2= -Key2Str3= -Key2Str4= -Key2Str5= -Key2Str6= -Key2Str7= -Key2Str8= -Key2Str9= -Key2Type=0 -Key3Str= -Key3Str1= -Key3Str10= -Key3Str11= -Key3Str12= -Key3Str13= -Key3Str14= -Key3Str15= -Key3Str16= -Key3Str2= -Key3Str3= -Key3Str4= -Key3Str5= -Key3Str6= -Key3Str7= -Key3Str8= -Key3Str9= -Key3Type=0 -Key4Str= -Key4Str1= -Key4Str10= -Key4Str11= -Key4Str12= -Key4Str13= -Key4Str14= -Key4Str15= -Key4Str16= -Key4Str2= -Key4Str3= -Key4Str4= -Key4Str5= -Key4Str6= -Key4Str7= -Key4Str8= -Key4Str9= -Key4Type=0 -MacAddress= -MACRepeaterEn= -MACRepeaterOuiMode=2 -MboSupport=0 -MbssMaxStaNum= -MgmtTxPwr= -MUTxRxEnable=1 -NoForwarding=0 -NoForwardingBTNBSSID=0 -own_ip_addr=192.168.1.1 -PcieAspm=1 -PERCENTAGEenable=0 -PktAggregate= -PMFMFPC=1 -PMFMFPR=0 -PMFSHA256=0 -PMKCachePeriod=10 -PowerUpCckOfdm=0:0:0:0:0:0:0 -PowerUpHT20=0:0:0:0:0:0:0 -PowerUpHT40=0:0:0:0:0:0:0 -PowerUpVHT160=0:0:0:0:0:0:0 -PowerUpVHT20=0:0:0:0:0:0:0 -PowerUpVHT40=0:0:0:0:0:0:0 -PowerUpVHT80=0:0:0:0:0:0:0 -PreAuth=0 -PreAuthifname=br-lan -PWDID= -PWDIDR= -PweMethod=0 -QuickChannelSwitch= -RadioOn=1 -RADIUS_Acct_Key= -RADIUS_Acct_Port=1813 -RADIUS_Acct_Server= -RADIUS_Key1= -RADIUS_Key10= -RADIUS_Key11= -RADIUS_Key12= -RADIUS_Key13= -RADIUS_Key14= -RADIUS_Key15= -RADIUS_Key16= -RADIUS_Key2= -RADIUS_Key3= -RADIUS_Key4= -RADIUS_Key5= -RADIUS_Key6= -RADIUS_Key7= -RADIUS_Key8= -RADIUS_Key9= -RADIUS_Port=1812 -RADIUS_Server= -RDRegion= -RED_Enable=1 -RekeyInterval=3600 -RekeyMethod=DISABLE -RRMEnable=0 -RTSPktThreshold= -RTSThreshold=2347 -session_timeout_interval=0 -ShortSlot=1 -SKUenable=0 -SSID= -SSID10= -SSID11= -SSID12= -SSID13= -SSID14= -SSID15= -SSID16= -SSID1=OpenWrt_5G -SSID2= -SSID3= -SSID4= -SSID5= -SSID6= -SSID7= -SSID8= -SSID9= -StationKeepAlive=0 -StreamMode=0 -StreamModeMac0= -StreamModeMac1= -StreamModeMac2= -StreamModeMac3= -TxBurst=1 -TxPower=100 -TxPreamble=1 -UAPSDCapable=1 -VHT_BW=1 -VHT_BW_SIGNAL=0 -VHT_LDPC=1 -VHT_Sec80_Channel=0 -VHT_SGI=1 -VHT_STBC=1 -VLANID=0 -VLANTag=0 -VOW_Airtime_Ctrl_En= -VOW_Airtime_Fairness_En=1 -VOW_BW_Ctrl=0 -VOW_Group_Backlog= -VOW_Group_DWRR_Max_Wait_Time= -VOW_Group_DWRR_Quantum= -VOW_Group_Max_Airtime_Bucket_Size= -VOW_Group_Max_Rate= -VOW_Group_Max_Rate_Bucket_Size= -VOW_Group_Max_Ratio= -VOW_Group_Max_Wait_Time= -VOW_Group_Min_Airtime_Bucket_Size= -VOW_Group_Min_Rate= -VOW_Group_Min_Rate_Bucket_Size= -VOW_Group_Min_Ratio= -VOW_Rate_Ctrl_En= -VOW_Refill_Period= -VOW_RX_En=1 -VOW_Sta_BE_DWRR_Quantum= -VOW_Sta_BK_DWRR_Quantum= -VOW_Sta_DWRR_Max_Wait_Time= -VOW_Sta_VI_DWRR_Quantum= -VOW_Sta_VO_DWRR_Quantum= -VOW_WATF_Enable= -VOW_WATF_MAC_LV0= -VOW_WATF_MAC_LV1= -VOW_WATF_MAC_LV2= -VOW_WATF_MAC_LV3= -VOW_WATF_Q_LV0= -VOW_WATF_Q_LV1= -VOW_WATF_Q_LV2= -VOW_WATF_Q_LV3= -VOW_WMM_Search_Rule_Band0= -VOW_WMM_Search_Rule_Band1= -WCNTest=0 -Wds0Key= -Wds1Key= -Wds2Key= -Wds3Key= -WdsEnable=0 -WdsEncrypType=NONE -WdsList= -WdsPhyMode=0 -WHNAT=0 -WirelessMode=14 -WmmCapable=1 -WNMEnable=0 -WPAPSK= -WPAPSK10= -WPAPSK11= -WPAPSK12= -WPAPSK13= -WPAPSK14= -WPAPSK15= -WPAPSK16= -WPAPSK1=12345678 -WPAPSK2= -WPAPSK3= -WPAPSK4= -WPAPSK5= -WPAPSK6= -WPAPSK7= -WPAPSK8= -WPAPSK9= -WscConfMethods= -WscConfMode=0 -WscConfStatus=2 -WscV2Support= - diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7615.dat deleted file mode 100644 index 4bd083be4f..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7615.dat +++ /dev/null @@ -1,384 +0,0 @@ -Default -AccessControlList0= -AccessControlList1= -AccessControlList10= -AccessControlList11= -AccessControlList12= -AccessControlList13= -AccessControlList14= -AccessControlList15= -AccessControlList2= -AccessControlList3= -AccessControlList4= -AccessControlList5= -AccessControlList6= -AccessControlList7= -AccessControlList8= -AccessControlList9= -AccessPolicy0=0 -AccessPolicy1=0 -AccessPolicy10=0 -AccessPolicy11=0 -AccessPolicy12=0 -AccessPolicy13=0 -AccessPolicy14=0 -AccessPolicy15=0 -AccessPolicy2=0 -AccessPolicy3=0 -AccessPolicy4=0 -AccessPolicy5=0 -AccessPolicy6=0 -AccessPolicy7=0 -AccessPolicy8=0 -AccessPolicy9=0 -AckPolicy=0;0;0;0 -AntCtrl= -APACM=0;0;0;0 -APAifsn=3;7;1;1 -ApCliAuthMode= -ApCliBssid= -ApCliDefaultKeyID= -ApCliEnable= -ApCliEncrypType= -ApCliKey1Str= -ApCliKey1Str1= -ApCliKey1Type= -ApCliKey2Str= -ApCliKey2Str1= -ApCliKey2Type= -ApCliKey3Str= -ApCliKey3Str1= -ApCliKey3Type= -ApCliKey4Str= -ApCliKey4Str1= -ApCliKey4Type= -ApCliPMFMFPC= -ApCliPMFMFPR= -ApCliPMFSHA256= -ApCliSsid= -ApCliTxMcs= -ApCliTxMode= -ApCliUAPSDCapable= -ApCliWirelessMode= -ApCliWPAPSK= -ApCliWPAPSK1= -ApCli_Wsc4digitPinCode= -ApCliWscScanMode= -APCwmax=6;10;4;3 -APCwmin=4;4;3;2 -APTxop=0;0;94;47 -AuthMode=OPEN -AutoChannelSelect=0 -AutoChannelSkipList= -BandSteering=0 -BasicRate=15 -BeaconPeriod=100 -BFBACKOFFenable=0 -BgndScanSkipCh= -BGProtection=0 -BndStrgBssIdx= -BSSACM=0;0;0;0 -BSSAifsn=3;7;2;2 -BSSCwmax=10;10;4;3 -BSSCwmin=4;4;3;2 -BssidNum=1 -BSSTxop=0;0;94;47 -CalCacheApply=0 -CarrierDetect=0 -Channel=36 -ChannelGrp= -CountryCode=US -CountryRegion=5 -CountryRegionABand=7 -CP_SUPPORT=2 -DBDC_MODE=0 -DebugFlags=0 -DefaultKeyID=1 -DfsCalibration=0 -DfsEnable=0 -DfsZeroWait=0 -DfsZeroWaitCacTime=255 -DisableOLBC=0 -DscpPriMapBss= -DscpQosMap= -DscpQosMapEnable= -DtimPeriod=1 -E2pAccessMode=2 -EAPifname=br-lan -EDCCAEnable=1 -EfuseBufferMode= -EncrypType=NONE -EtherTrafficBand=0 -ETxBfEnCond=1 -FixedTxMode= -FQ_Enable=1 -FragThreshold=2346 -FreqDelta=0 -FtMdId= -FtOtd=0 -FtRic=0 -FtSupport=0 -G_BAND_256QAM=1 -GreenAP=1 -HideSSID=0 -HT_AMSDU=1 -HT_AutoBA=1 -HT_BADecline=0 -HT_BAWinSize=64 -HT_BSSCoexistence=1 -HT_BW=1 -HT_DisallowTKIP=1 -HT_EXTCHA=1 -HT_GI=1 -HT_LDPC=1 -HT_MCS=33 -HT_MpduDensity=5 -HT_OpMode=0 -HT_PROTECT=1 -HT_RDG=0 -HT_RxStream=4 -HT_STBC=1 -HT_TxStream=4 -IcapMode=0 -IEEE80211H=0 -IEEE8021X=0 -IgmpSnEnable=0 -ITxBfEn=1 -Key1Str= -Key1Str1= -Key1Str10= -Key1Str11= -Key1Str12= -Key1Str13= -Key1Str14= -Key1Str15= -Key1Str16= -Key1Str2= -Key1Str3= -Key1Str4= -Key1Str5= -Key1Str6= -Key1Str7= -Key1Str8= -Key1Str9= -Key1Type=0 -Key2Str= -Key2Str1= -Key2Str10= -Key2Str11= -Key2Str12= -Key2Str13= -Key2Str14= -Key2Str15= -Key2Str16= -Key2Str2= -Key2Str3= -Key2Str4= -Key2Str5= -Key2Str6= -Key2Str7= -Key2Str8= -Key2Str9= -Key2Type=0 -Key3Str= -Key3Str1= -Key3Str10= -Key3Str11= -Key3Str12= -Key3Str13= -Key3Str14= -Key3Str15= -Key3Str16= -Key3Str2= -Key3Str3= -Key3Str4= -Key3Str5= -Key3Str6= -Key3Str7= -Key3Str8= -Key3Str9= -Key3Type=0 -Key4Str= -Key4Str1= -Key4Str10= -Key4Str11= -Key4Str12= -Key4Str13= -Key4Str14= -Key4Str15= -Key4Str16= -Key4Str2= -Key4Str3= -Key4Str4= -Key4Str5= -Key4Str6= -Key4Str7= -Key4Str8= -Key4Str9= -Key4Type=0 -MacAddress= -MACRepeaterEn= -MACRepeaterOuiMode=2 -MboSupport=0 -MbssMaxStaNum= -MgmtTxPwr= -MUTxRxEnable=1 -NoForwarding=0 -NoForwardingBTNBSSID=0 -own_ip_addr=192.168.1.1 -PcieAspm=1 -PERCENTAGEenable=0 -PktAggregate= -PMFMFPC=1 -PMFMFPR=0 -PMFSHA256=0 -PMKCachePeriod=10 -PowerUpCckOfdm=0:0:0:0:0:0:0 -PowerUpHT20=0:0:0:0:0:0:0 -PowerUpHT40=0:0:0:0:0:0:0 -PowerUpVHT160=0:0:0:0:0:0:0 -PowerUpVHT20=0:0:0:0:0:0:0 -PowerUpVHT40=0:0:0:0:0:0:0 -PowerUpVHT80=0:0:0:0:0:0:0 -PreAuth=0 -PreAuthifname=br-lan -PWDID= -PWDIDR= -PweMethod=0 -QuickChannelSwitch= -RadioOn=1 -RADIUS_Acct_Key= -RADIUS_Acct_Port=1813 -RADIUS_Acct_Server= -RADIUS_Key1= -RADIUS_Key10= -RADIUS_Key11= -RADIUS_Key12= -RADIUS_Key13= -RADIUS_Key14= -RADIUS_Key15= -RADIUS_Key16= -RADIUS_Key2= -RADIUS_Key3= -RADIUS_Key4= -RADIUS_Key5= -RADIUS_Key6= -RADIUS_Key7= -RADIUS_Key8= -RADIUS_Key9= -RADIUS_Port=1812 -RADIUS_Server= -RDRegion= -RED_Enable=1 -RekeyInterval=3600 -RekeyMethod=DISABLE -RRMEnable=0 -RTSPktThreshold= -RTSThreshold=2347 -session_timeout_interval=0 -ShortSlot=1 -SKUenable=0 -SSID= -SSID10= -SSID11= -SSID12= -SSID13= -SSID14= -SSID15= -SSID16= -SSID1=OpenWrt_5G -SSID2= -SSID3= -SSID4= -SSID5= -SSID6= -SSID7= -SSID8= -SSID9= -StationKeepAlive=0 -StreamMode=0 -StreamModeMac0= -StreamModeMac1= -StreamModeMac2= -StreamModeMac3= -TxBurst=1 -TxPower=100 -TxPreamble=1 -UAPSDCapable=1 -VHT_BW=1 -VHT_BW_SIGNAL=0 -VHT_LDPC=1 -VHT_Sec80_Channel=0 -VHT_SGI=1 -VHT_STBC=1 -VLANID=0 -VLANTag=0 -VOW_Airtime_Ctrl_En= -VOW_Airtime_Fairness_En=1 -VOW_BW_Ctrl=0 -VOW_Group_Backlog= -VOW_Group_DWRR_Max_Wait_Time= -VOW_Group_DWRR_Quantum= -VOW_Group_Max_Airtime_Bucket_Size= -VOW_Group_Max_Rate= -VOW_Group_Max_Rate_Bucket_Size= -VOW_Group_Max_Ratio= -VOW_Group_Max_Wait_Time= -VOW_Group_Min_Airtime_Bucket_Size= -VOW_Group_Min_Rate= -VOW_Group_Min_Rate_Bucket_Size= -VOW_Group_Min_Ratio= -VOW_Rate_Ctrl_En= -VOW_Refill_Period= -VOW_RX_En=1 -VOW_Sta_BE_DWRR_Quantum= -VOW_Sta_BK_DWRR_Quantum= -VOW_Sta_DWRR_Max_Wait_Time= -VOW_Sta_VI_DWRR_Quantum= -VOW_Sta_VO_DWRR_Quantum= -VOW_WATF_Enable= -VOW_WATF_MAC_LV0= -VOW_WATF_MAC_LV1= -VOW_WATF_MAC_LV2= -VOW_WATF_MAC_LV3= -VOW_WATF_Q_LV0= -VOW_WATF_Q_LV1= -VOW_WATF_Q_LV2= -VOW_WATF_Q_LV3= -VOW_WMM_Search_Rule_Band0= -VOW_WMM_Search_Rule_Band1= -WCNTest=0 -Wds0Key= -Wds1Key= -Wds2Key= -Wds3Key= -WdsEnable=0 -WdsEncrypType=NONE -WdsList= -WdsPhyMode=0 -WHNAT=0 -WirelessMode=14 -WmmCapable=1 -WNMEnable=0 -WPAPSK= -WPAPSK10= -WPAPSK11= -WPAPSK12= -WPAPSK13= -WPAPSK14= -WPAPSK15= -WPAPSK16= -WPAPSK1=12345678 -WPAPSK2= -WPAPSK3= -WPAPSK4= -WPAPSK5= -WPAPSK6= -WPAPSK7= -WPAPSK8= -WPAPSK9= -WscConfMethods= -WscConfMode=0 -WscConfStatus=2 -WscV2Support= - diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615.lua b/package/kernel/mt-drivers/mt_wifi/files/mt7615.lua deleted file mode 100644 index 69aab05ae9..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7615.lua +++ /dev/null @@ -1,219 +0,0 @@ -#!/usr/bin/lua --- Alternative for OpenWrt's /sbin/wifi. --- Copyright Not Reserved. --- Hua Shao - -package.path = '/lib/wifi/?.lua;'..package.path - -local vif_prefix = {"ra", "rai", "rae", "rax", "ray", "raz", - "apcli", "apclix", "apclii", "apcliy", "apclie", "apcliz", } - -local function esc(x) - return (x:gsub('%%', '%%%%') - :gsub('^%^', '%%^') - :gsub('%$$', '%%$') - :gsub('%(', '%%(') - :gsub('%)', '%%)') - :gsub('%.', '%%.') - :gsub('%[', '%%[') - :gsub('%]', '%%]') - :gsub('%*', '%%*') - :gsub('%+', '%%+') - :gsub('%-', '%%-') - :gsub('%?', '%%?')) -end - -function add_vif_into_lan(vif) - local mtkwifi = require("mtkwifi") - local brvifs = mtkwifi.__trim( - mtkwifi.read_pipe("uci get network.lan.ifname")) - if not string.match(brvifs, esc(vif)) then - nixio.syslog("debug", "mt7615_up: add "..vif.." into lan") - brvifs = brvifs.." "..vif - os.execute("uci set network.lan.ifname=\""..brvifs.."\"") - os.execute("uci commit") - -- os.execute("brctl addif br-lan "..vif) - os.execute("ubus call network.interface.lan add_device \"{\\\"name\\\":\\\""..vif.."\\\"}\"") - end -end - -function mt7615_up(devname) - local nixio = require("nixio") - local mtkwifi = require("mtkwifi") - - nixio.syslog("debug", "mt7615_up called!") - - local devs, l1parser = mtkwifi.__get_l1dat() - -- l1 profile present, good! - if l1parser and devs then - dev = devs.devname_ridx[devname] - if not dev then - nixio.syslog("err", "mt7615_up: dev "..devname.." not found!") - return - end - -- we have to bring up main_ifname first, main_ifname will create all other vifs. - if mtkwifi.exists("/sys/class/net/"..dev.main_ifname) then - nixio.syslog("debug", "mt7615_up: ifconfig "..dev.main_ifname.." up") - os.execute("ifconfig "..dev.main_ifname.." up") - add_vif_into_lan(dev.main_ifname) - else - nixio.syslog("err", "mt7615_up: main_ifname "..dev.main_ifname.." missing, quit!") - return - end - for _,vif in ipairs(string.split(mtkwifi.read_pipe("ls /sys/class/net"), "\n")) - do - if vif ~= dev.main_ifname and - ( string.match(vif, esc(dev.ext_ifname).."[0-9]+") - or string.match(vif, esc(dev.apcli_ifname).."[0-9]+") - or string.match(vif, esc(dev.wds_ifname).."[0-9]+") - or string.match(vif, esc(dev.mesh_ifname).."[0-9]+")) - then - nixio.syslog("debug", "mt7615_up: ifconfig "..vif.."0 up") - os.execute("ifconfig "..vif.." up") - add_vif_into_lan(vif) - -- else nixio.syslog("debug", "mt7615_up: skip "..vif..", prefix not match "..pre) - end - end - elseif mtkwifi.exists("/etc/wireless/mt7615/"..devname..".dat") then - for _, pre in ipairs(vif_prefix) do - -- we have to bring up root vif first, root vif will create all other vifs. - if mtkwifi.exists("/sys/class/net/"..pre.."0") then - nixio.syslog("debug", "mt7615_up: ifconfig "..pre.."0 up") - os.execute("ifconfig "..pre.."0 up") - add_vif_into_lan(pre.."0") - end - - for _,vif in ipairs(string.split(mtkwifi.read_pipe("ls /sys/class/net"), "\n")) - do - -- nixio.syslog("debug", "mt7615_up: navigate "..pre) - if string.match(vif, pre.."[1-9]+") then - nixio.syslog("debug", "mt7615_up: ifconfig "..vif.." up") - os.execute("ifconfig "..vif.." up") - add_vif_into_lan(vif) - -- else nixio.syslog("debug", "mt7615_up: skip "..vif..", prefix not match "..pre) - end - end - end - else nixio.syslog("debug", "mt7615_up: skip "..devname..", config not exist") - end - - os.execute(" rm -rf /tmp/mtk/wifi/mt7615*.need_reload") -end - -function mt7615_down(devname) - local nixio = require("nixio") - local mtkwifi = require("mtkwifi") - nixio.syslog("debug", "mt7615_down called!") - - local devs, l1parser = mtkwifi.__get_l1dat() - -- l1 profile present, good! - if l1parser and devs then - dev = devs.devname_ridx[devname] - if not dev then - nixio.syslog("err", "mt7615_down: dev "..devname.." not found!") - return - end - - for _,vif in ipairs(string.split(mtkwifi.read_pipe("ls /sys/class/net"), "\n")) - do - if vif == dev.main_ifname - or string.match(vif, esc(dev.ext_ifname).."[0-9]+") - or string.match(vif, esc(dev.apcli_ifname).."[0-9]+") - or string.match(vif, esc(dev.wds_ifname).."[0-9]+") - or string.match(vif, esc(dev.mesh_ifname).."[0-9]+") - then - nixio.syslog("debug", "mt7615_down: ifconfig "..vif.." down") - os.execute("ifconfig "..vif.." down") - local brvifs = mtkwifi.__trim(mtkwifi.read_pipe("uci get network.lan.ifname")) - if string.match(brvifs, esc(vif)) then - brvifs = mtkwifi.__trim(string.gsub(brvifs, esc(vif), "")) - nixio.syslog("debug", "mt7615_down: remove "..vif.." from lan") - os.execute("uci set network.lan.ifname=\""..brvifs.."\"") - os.execute("uci commit") - os.execute("ubus call network.interface.lan remove_device \"{\\\"name\\\":\\\""..vif.."\\\"}\"") - end - -- else nixio.syslog("debug", "mt7615_down: skip "..vif..", prefix not match "..pre) - end - end - elseif mtkwifi.exists("/etc/wireless/mt7615/"..devname..".dat") then - for _, pre in ipairs(vif_prefix) do - for _,vif in ipairs(string.split(mtkwifi.read_pipe("ls /sys/class/net"), "\n")) - do - if string.match(vif, pre.."[0-9]+") then - nixio.syslog("debug", "mt7615_down: ifconfig "..vif.."down") - os.execute("ifconfig "..vif.." down") - local brvifs = mtkwifi.read_pipe("uci get network.lan.ifname") - if string.match(brvifs, vif) then - brvifs = mtkwifi.__trim(string.gsub(brvifs, vif, "")) - nixio.syslog("debug", "mt7615_down: remove "..vif.." from lan") - os.execute("uci set network.lan.ifname=\""..brvifs.."\"") - os.execute("uci commit") - os.execute("ubus call network.interface.lan remove_device \"{\\\"name\\\":\\\""..vif.."\\\"}\"") - end - -- else nixio.syslog("debug", "mt7615_down: skip "..vif..", prefix not match "..pre) - end - end - end - else nixio.syslog("debug", "mt7615_down: skip "..devname..", config not exist") - end - - os.execute(" rm -rf /tmp/mtk/wifi/mt7615*.need_reload") -end - -function mt7615_reload(devname) - local nixio = require("nixio") - nixio.syslog("debug", "mt7615_reload called!") - mt7615_down(devname) - mt7615_up(devname) -end - -function mt7615_restart(devname) - local nixio = require("nixio") - nixio.syslog("debug", "mt7615_restart called!") - mt7615_down(devname) - os.execute("rmmod mt_wifi") - os.execute("modprobe mt_wifi") - mt7615_up(devname) -end - -function mt7615_reset(devname) - local nixio = require("nixio") - local mtkwifi = require("mtkwifi") - nixio.syslog("debug", "mt7615_reset called!") - if mtkwifi.exists("/rom/etc/wireless/mt7615/") then - os.execute("rm -rf /etc/wireless/mt7615/") - os.execute("cp -rf /rom/etc/wireless/mt7615/ /etc/wireless/") - mt7615_reload(devname) - else - nixio.syslog("debug", "mt7615_reset: /rom"..profile.." missing, unable to reset!") - end -end - -function mt7615_status(devname) - return wifi_common_status() -end - -function mt7615_detect(devname) - local nixio = require("nixio") - local mtkwifi = require("mtkwifi") - nixio.syslog("debug", "mt7615_detect called!") - - for _,dev in ipairs(mtkwifi.get_all_devs()) do - local relname = string.format("%s%d%d",dev.maindev,dev.mainidx,dev.subidx) - print([[ -config wifi-device ]]..relname.."\n"..[[ - option type mt7615 - option vendor ralink -]]) - for _,vif in ipairs(dev.vifs) do - print([[ -config wifi-iface - option device ]]..relname.."\n"..[[ - option ifname ]]..vif.vifname.."\n"..[[ - option network lan - option mode ap - option ssid ]]..vif.__ssid.."\n") - end - end -end - diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615e-sku-bf.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7615e-sku-bf.dat deleted file mode 100644 index 397a001dd6..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7615e-sku-bf.dat +++ /dev/null @@ -1,65 +0,0 @@ -# Single SKU Max Power Table -# 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta -Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T -Ch1 8 8 8 8 8 8 8 10 8 8 8 20 12 18 16 8 8 8 9 11 12 2 1 3 -Ch2 8 8 8 8 8 8 8 15 8 8 8 19 19 10 12 8 8 8 9 16 12 5 4 0 -Ch3 8 8 8 8 8 8 8 18 8 8 8 17 18 16 20 8 8 8 12 8 20 0 2 0 -Ch4 8 8 8 8 8 8 8 9 8 8 8 14 10 14 18 8 8 8 14 12 10 3 4 5 -Ch5 8 8 8 8 8 8 8 10 8 8 8 10 13 11 8 8 8 8 12 8 9 4 5 3 -Ch6 8 8 8 8 8 8 8 13 8 8 8 11 9 12 16 8 8 8 9 17 11 5 2 1 -Ch7 8 8 8 8 8 8 8 10 8 8 8 14 11 13 18 8 8 8 16 13 10 2 5 4 -Ch8 8 8 8 8 8 8 8 15 8 8 8 14 9 11 10 8 8 8 11 14 8 5 5 3 -Ch9 8 8 8 8 8 8 8 11 8 8 8 12 9 15 19 8 8 8 14 20 12 2 5 3 -Ch10 8 8 8 8 8 8 8 14 8 8 8 17 14 17 15 8 8 8 9 17 8 2 4 2 -Ch11 8 8 8 8 8 8 8 14 8 8 8 20 10 20 18 8 8 8 12 8 20 3 1 4 -Ch12 8 8 8 8 8 8 8 18 8 8 8 20 16 17 9 8 8 8 11 20 9 0 0 1 -Ch13 8 8 8 8 8 8 8 8 8 8 8 11 16 19 16 8 8 8 15 12 12 2 0 2 -Ch14 8 8 8 8 8 8 8 10 8 8 8 15 17 16 14 8 8 8 12 14 20 4 1 5 - -# 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta -Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T -Ch184 18 18 18 18 18 15 18 12 13 11 14 16 16 12 12 13 20 17 16 17 18 9 16 17 20 18 16 19 15 9 17 8 17 0 4 4 -Ch188 18 18 18 18 18 16 20 9 9 11 8 12 18 15 11 11 14 8 17 16 16 16 12 8 13 19 18 11 9 12 14 8 13 5 2 0 -Ch192 18 18 18 18 18 15 9 11 9 15 14 11 19 15 8 18 20 20 8 9 9 9 11 18 13 14 20 18 10 14 12 13 16 0 2 0 -Ch196 18 18 18 18 18 10 11 19 13 12 11 10 13 11 19 10 16 20 15 15 8 14 8 18 20 15 17 17 14 12 12 8 16 4 3 2 -Ch8 18 18 18 18 18 18 13 19 20 18 10 9 8 8 17 15 17 9 18 19 11 12 15 20 12 12 13 9 9 15 10 11 17 4 3 3 -Ch12 18 18 18 18 18 17 20 14 10 10 16 15 13 11 15 16 17 11 15 9 18 8 20 19 11 9 20 8 18 8 8 18 18 1 3 4 -Ch16 18 18 18 18 18 10 18 18 8 19 8 12 19 16 19 18 16 19 12 18 18 9 10 18 20 20 20 9 11 20 17 14 16 2 2 2 -Ch36 18 18 18 18 18 18 19 8 11 16 10 9 19 11 19 9 8 19 8 11 17 20 14 9 19 19 20 13 12 19 13 17 9 5 1 2 -Ch40 18 18 18 18 18 13 20 13 19 16 11 14 17 17 14 8 13 8 10 20 10 9 14 11 14 17 9 20 15 19 9 8 11 3 1 1 -Ch44 18 18 18 18 18 10 14 19 20 17 16 12 18 8 17 18 15 19 14 11 13 14 12 16 16 19 13 14 19 14 20 20 11 5 1 0 -Ch48 18 18 18 18 18 8 12 12 19 11 8 11 20 12 12 11 15 16 10 12 16 11 15 18 19 17 16 17 11 8 10 16 16 5 5 0 -Ch52 18 18 18 18 18 15 12 15 20 9 10 10 14 8 20 10 16 17 18 11 16 17 10 17 12 13 17 17 13 18 18 20 13 4 3 4 -Ch56 18 18 18 18 18 13 16 15 13 15 20 13 14 11 10 20 10 8 16 12 10 16 11 9 11 14 17 12 17 13 18 10 19 0 3 3 -Ch60 18 18 18 18 18 14 11 8 20 13 16 13 11 20 9 17 16 11 8 12 17 15 8 16 10 20 19 15 13 9 17 18 11 4 1 2 -Ch64 18 18 18 18 18 13 14 8 12 17 8 12 18 17 17 14 18 8 8 20 17 16 20 9 15 11 10 11 18 10 10 15 19 2 1 4 -Ch68 18 18 18 18 18 14 19 17 9 18 19 20 12 14 8 14 20 20 18 9 18 11 19 19 10 11 8 18 9 8 16 11 8 3 3 1 -Ch72 18 18 18 18 18 19 13 20 11 16 9 19 20 19 14 8 9 17 13 19 15 8 9 19 14 19 15 18 16 12 13 15 10 4 3 1 -Ch76 18 18 18 18 18 17 13 16 20 16 8 9 20 11 17 11 8 18 9 20 9 17 16 11 11 11 18 10 13 W 20 17 8 1 3 3 -Ch80 18 18 18 18 18 14 20 13 13 17 8 10 16 8 9 19 16 17 17 19 15 9 13 16 13 14 12 9 20 20 14 18 18 0 4 2 -Ch84 18 18 18 18 18 11 18 20 9 13 14 11 16 15 12 11 9 19 13 11 11 9 15 16 18 13 12 8 8 8 10 12 15 3 2 5 -Ch88 18 18 18 18 18 18 19 9 17 15 8 19 11 11 14 9 14 20 20 11 11 15 12 14 11 8 18 15 19 18 12 20 16 5 5 1 -Ch92 18 18 18 18 18 11 8 15 13 13 13 13 16 14 14 9 9 15 20 11 17 10 14 13 17 11 8 18 20 8 10 19 18 1 4 4 -Ch96 18 18 18 18 18 8 12 16 9 13 12 9 8 11 8 8 19 11 15 16 8 11 16 18 16 9 19 9 10 15 19 19 15 4 2 4 -Ch100 18 18 18 18 18 18 13 20 20 12 9 19 10 9 14 8 19 10 17 9 10 10 8 13 12 11 20 11 16 18 14 16 19 1 1 2 -Ch104 18 18 18 18 18 19 12 20 14 16 15 9 19 11 15 11 12 18 15 11 15 19 10 14 15 19 9 13 19 13 11 11 17 2 2 0 -Ch108 18 18 18 18 18 18 15 13 16 11 19 19 18 19 12 17 8 9 10 8 8 18 8 10 11 17 15 10 19 13 16 10 15 0 2 3 -Ch112 18 18 18 18 18 8 13 9 17 9 15 17 10 19 9 19 11 16 14 16 8 18 13 16 13 17 19 11 8 8 18 14 17 5 2 5 -Ch116 18 18 18 18 18 8 20 11 15 8 11 8 18 15 13 17 14 13 9 8 14 14 11 9 19 17 11 11 8 20 8 10 20 5 2 1 -Ch120 18 18 18 18 18 14 20 8 20 14 10 10 17 12 16 20 10 20 17 18 9 15 14 17 13 14 16 8 18 10 15 12 12 1 5 3 -Ch124 18 18 18 18 18 20 9 17 12 12 8 14 8 8 20 17 16 20 13 14 16 10 14 20 15 17 8 10 13 13 11 13 9 5 0 5 -Ch128 18 18 18 18 18 9 19 9 14 8 14 11 9 14 16 15 14 10 15 14 14 20 10 16 15 11 12 13 13 13 12 15 20 1 4 3 -Ch132 18 18 18 18 18 20 16 13 8 18 11 20 12 11 11 14 12 13 8 12 13 10 20 19 12 13 14 12 11 19 19 20 8 3 1 4 -Ch136 18 18 18 18 18 12 12 19 10 20 10 8 17 8 12 10 10 13 13 12 8 11 18 14 12 17 8 14 14 9 11 18 14 1 2 2 -Ch140 18 18 18 18 18 12 10 13 9 16 8 20 10 17 8 15 13 20 15 10 18 13 12 12 16 18 12 17 10 16 11 15 14 3 2 5 -Ch144 18 18 18 18 18 19 9 15 8 13 18 17 9 19 16 11 20 12 15 19 10 17 15 17 14 9 9 13 17 16 10 9 10 1 5 2 -Ch149 18 18 18 18 18 15 20 12 19 19 19 10 10 13 15 19 12 19 10 14 15 10 15 9 8 11 15 13 10 16 15 18 12 5 5 2 -Ch153 18 18 18 18 18 20 17 8 19 16 20 13 16 18 14 11 10 16 16 19 15 13 17 19 18 19 20 8 18 9 17 11 11 1 2 1 -Ch157 18 18 18 18 18 13 17 12 19 16 8 17 11 12 15 14 18 11 12 9 18 20 13 16 13 20 17 19 10 12 20 18 16 5 2 3 -Ch161 18 18 18 18 18 12 12 16 12 15 11 18 11 13 17 19 11 13 13 9 15 10 10 19 13 20 13 9 8 8 20 14 12 0 4 1 -Ch165 18 18 18 18 18 13 16 15 13 15 8 19 15 10 17 13 13 19 20 8 18 15 20 16 9 14 11 20 11 19 15 16 8 1 2 0 -Ch169 18 18 18 18 18 8 17 17 13 16 8 14 18 11 8 18 20 14 8 17 8 13 18 19 20 19 20 17 13 20 9 15 18 0 3 4 -Ch173 18 18 18 18 18 14 9 13 12 15 14 15 10 10 18 16 16 8 13 16 11 11 13 13 15 12 20 15 14 13 16 11 14 3 3 4 -Ch177 18 18 18 18 18 19 18 16 10 20 13 11 16 12 16 18 18 11 18 8 13 14 11 18 14 16 16 19 16 13 15 8 13 5 0 0 -Ch181 18 18 18 18 18 20 11 10 9 8 9 15 15 8 8 12 11 9 18 20 11 17 11 8 15 8 18 12 18 16 19 9 14 4 1 4 - diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615e-sku.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7615e-sku.dat deleted file mode 100644 index 397a001dd6..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7615e-sku.dat +++ /dev/null @@ -1,65 +0,0 @@ -# Single SKU Max Power Table -# 2.4G Channel CCK OFDM VHT20 VHT40 Txstream_Delta -Band: 2.4G CCK_1M CCK_2M CCK_5.5M CCK_11M OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 Txstream_3T Txstream_2T Txstream_1T -Ch1 8 8 8 8 8 8 8 10 8 8 8 20 12 18 16 8 8 8 9 11 12 2 1 3 -Ch2 8 8 8 8 8 8 8 15 8 8 8 19 19 10 12 8 8 8 9 16 12 5 4 0 -Ch3 8 8 8 8 8 8 8 18 8 8 8 17 18 16 20 8 8 8 12 8 20 0 2 0 -Ch4 8 8 8 8 8 8 8 9 8 8 8 14 10 14 18 8 8 8 14 12 10 3 4 5 -Ch5 8 8 8 8 8 8 8 10 8 8 8 10 13 11 8 8 8 8 12 8 9 4 5 3 -Ch6 8 8 8 8 8 8 8 13 8 8 8 11 9 12 16 8 8 8 9 17 11 5 2 1 -Ch7 8 8 8 8 8 8 8 10 8 8 8 14 11 13 18 8 8 8 16 13 10 2 5 4 -Ch8 8 8 8 8 8 8 8 15 8 8 8 14 9 11 10 8 8 8 11 14 8 5 5 3 -Ch9 8 8 8 8 8 8 8 11 8 8 8 12 9 15 19 8 8 8 14 20 12 2 5 3 -Ch10 8 8 8 8 8 8 8 14 8 8 8 17 14 17 15 8 8 8 9 17 8 2 4 2 -Ch11 8 8 8 8 8 8 8 14 8 8 8 20 10 20 18 8 8 8 12 8 20 3 1 4 -Ch12 8 8 8 8 8 8 8 18 8 8 8 20 16 17 9 8 8 8 11 20 9 0 0 1 -Ch13 8 8 8 8 8 8 8 8 8 8 8 11 16 19 16 8 8 8 15 12 12 2 0 2 -Ch14 8 8 8 8 8 8 8 10 8 8 8 15 17 16 14 8 8 8 12 14 20 4 1 5 - -# 5G Channel OFDM VHT20 VHT40 VHT80 VHT160 Txstream_Delta -Band: 5G OFDM_6M OFDM_9M OFDM_12M OFDM_18M OFDM_24M OFDM_36M OFDM_48M OFDM_54M VHT20_MCS0 VHT20_MCS1 VHT20_MCS2 VHT20_MCS3 VHT20_MCS4 VHT20_MCS5 VHT20_MCS6 VHT20_MCS7 VHT20_MCS8 VHT20_MCS9 VHT40_MCS0 VHT40_MCS1 VHT40_MCS2 VHT40_MCS3 VHT40_MCS4 VHT40_MCS5 VHT40_MCS6 VHT40_MCS7 VHT40_MCS8 VHT40_MCS9 VHT80_MCS0 VHT80_MCS1 VHT80_MCS2 VHT80_MCS3 VHT80_MCS4 VHT80_MCS5 VHT80_MCS6 VHT80_MCS7 VHT80_MCS8 VHT80_MCS9 VHT160_MCS0 VHT160_MCS1 VHT160_MCS2 VHT160_MCS3 VHT160_MCS4 VHT160_MCS5 VHT160_MCS6 VHT160_MCS7 VHT160_MCS8 VHT160_MCS9 Txstream_3T Txstream_2T Txstream_1T -Ch184 18 18 18 18 18 15 18 12 13 11 14 16 16 12 12 13 20 17 16 17 18 9 16 17 20 18 16 19 15 9 17 8 17 0 4 4 -Ch188 18 18 18 18 18 16 20 9 9 11 8 12 18 15 11 11 14 8 17 16 16 16 12 8 13 19 18 11 9 12 14 8 13 5 2 0 -Ch192 18 18 18 18 18 15 9 11 9 15 14 11 19 15 8 18 20 20 8 9 9 9 11 18 13 14 20 18 10 14 12 13 16 0 2 0 -Ch196 18 18 18 18 18 10 11 19 13 12 11 10 13 11 19 10 16 20 15 15 8 14 8 18 20 15 17 17 14 12 12 8 16 4 3 2 -Ch8 18 18 18 18 18 18 13 19 20 18 10 9 8 8 17 15 17 9 18 19 11 12 15 20 12 12 13 9 9 15 10 11 17 4 3 3 -Ch12 18 18 18 18 18 17 20 14 10 10 16 15 13 11 15 16 17 11 15 9 18 8 20 19 11 9 20 8 18 8 8 18 18 1 3 4 -Ch16 18 18 18 18 18 10 18 18 8 19 8 12 19 16 19 18 16 19 12 18 18 9 10 18 20 20 20 9 11 20 17 14 16 2 2 2 -Ch36 18 18 18 18 18 18 19 8 11 16 10 9 19 11 19 9 8 19 8 11 17 20 14 9 19 19 20 13 12 19 13 17 9 5 1 2 -Ch40 18 18 18 18 18 13 20 13 19 16 11 14 17 17 14 8 13 8 10 20 10 9 14 11 14 17 9 20 15 19 9 8 11 3 1 1 -Ch44 18 18 18 18 18 10 14 19 20 17 16 12 18 8 17 18 15 19 14 11 13 14 12 16 16 19 13 14 19 14 20 20 11 5 1 0 -Ch48 18 18 18 18 18 8 12 12 19 11 8 11 20 12 12 11 15 16 10 12 16 11 15 18 19 17 16 17 11 8 10 16 16 5 5 0 -Ch52 18 18 18 18 18 15 12 15 20 9 10 10 14 8 20 10 16 17 18 11 16 17 10 17 12 13 17 17 13 18 18 20 13 4 3 4 -Ch56 18 18 18 18 18 13 16 15 13 15 20 13 14 11 10 20 10 8 16 12 10 16 11 9 11 14 17 12 17 13 18 10 19 0 3 3 -Ch60 18 18 18 18 18 14 11 8 20 13 16 13 11 20 9 17 16 11 8 12 17 15 8 16 10 20 19 15 13 9 17 18 11 4 1 2 -Ch64 18 18 18 18 18 13 14 8 12 17 8 12 18 17 17 14 18 8 8 20 17 16 20 9 15 11 10 11 18 10 10 15 19 2 1 4 -Ch68 18 18 18 18 18 14 19 17 9 18 19 20 12 14 8 14 20 20 18 9 18 11 19 19 10 11 8 18 9 8 16 11 8 3 3 1 -Ch72 18 18 18 18 18 19 13 20 11 16 9 19 20 19 14 8 9 17 13 19 15 8 9 19 14 19 15 18 16 12 13 15 10 4 3 1 -Ch76 18 18 18 18 18 17 13 16 20 16 8 9 20 11 17 11 8 18 9 20 9 17 16 11 11 11 18 10 13 W 20 17 8 1 3 3 -Ch80 18 18 18 18 18 14 20 13 13 17 8 10 16 8 9 19 16 17 17 19 15 9 13 16 13 14 12 9 20 20 14 18 18 0 4 2 -Ch84 18 18 18 18 18 11 18 20 9 13 14 11 16 15 12 11 9 19 13 11 11 9 15 16 18 13 12 8 8 8 10 12 15 3 2 5 -Ch88 18 18 18 18 18 18 19 9 17 15 8 19 11 11 14 9 14 20 20 11 11 15 12 14 11 8 18 15 19 18 12 20 16 5 5 1 -Ch92 18 18 18 18 18 11 8 15 13 13 13 13 16 14 14 9 9 15 20 11 17 10 14 13 17 11 8 18 20 8 10 19 18 1 4 4 -Ch96 18 18 18 18 18 8 12 16 9 13 12 9 8 11 8 8 19 11 15 16 8 11 16 18 16 9 19 9 10 15 19 19 15 4 2 4 -Ch100 18 18 18 18 18 18 13 20 20 12 9 19 10 9 14 8 19 10 17 9 10 10 8 13 12 11 20 11 16 18 14 16 19 1 1 2 -Ch104 18 18 18 18 18 19 12 20 14 16 15 9 19 11 15 11 12 18 15 11 15 19 10 14 15 19 9 13 19 13 11 11 17 2 2 0 -Ch108 18 18 18 18 18 18 15 13 16 11 19 19 18 19 12 17 8 9 10 8 8 18 8 10 11 17 15 10 19 13 16 10 15 0 2 3 -Ch112 18 18 18 18 18 8 13 9 17 9 15 17 10 19 9 19 11 16 14 16 8 18 13 16 13 17 19 11 8 8 18 14 17 5 2 5 -Ch116 18 18 18 18 18 8 20 11 15 8 11 8 18 15 13 17 14 13 9 8 14 14 11 9 19 17 11 11 8 20 8 10 20 5 2 1 -Ch120 18 18 18 18 18 14 20 8 20 14 10 10 17 12 16 20 10 20 17 18 9 15 14 17 13 14 16 8 18 10 15 12 12 1 5 3 -Ch124 18 18 18 18 18 20 9 17 12 12 8 14 8 8 20 17 16 20 13 14 16 10 14 20 15 17 8 10 13 13 11 13 9 5 0 5 -Ch128 18 18 18 18 18 9 19 9 14 8 14 11 9 14 16 15 14 10 15 14 14 20 10 16 15 11 12 13 13 13 12 15 20 1 4 3 -Ch132 18 18 18 18 18 20 16 13 8 18 11 20 12 11 11 14 12 13 8 12 13 10 20 19 12 13 14 12 11 19 19 20 8 3 1 4 -Ch136 18 18 18 18 18 12 12 19 10 20 10 8 17 8 12 10 10 13 13 12 8 11 18 14 12 17 8 14 14 9 11 18 14 1 2 2 -Ch140 18 18 18 18 18 12 10 13 9 16 8 20 10 17 8 15 13 20 15 10 18 13 12 12 16 18 12 17 10 16 11 15 14 3 2 5 -Ch144 18 18 18 18 18 19 9 15 8 13 18 17 9 19 16 11 20 12 15 19 10 17 15 17 14 9 9 13 17 16 10 9 10 1 5 2 -Ch149 18 18 18 18 18 15 20 12 19 19 19 10 10 13 15 19 12 19 10 14 15 10 15 9 8 11 15 13 10 16 15 18 12 5 5 2 -Ch153 18 18 18 18 18 20 17 8 19 16 20 13 16 18 14 11 10 16 16 19 15 13 17 19 18 19 20 8 18 9 17 11 11 1 2 1 -Ch157 18 18 18 18 18 13 17 12 19 16 8 17 11 12 15 14 18 11 12 9 18 20 13 16 13 20 17 19 10 12 20 18 16 5 2 3 -Ch161 18 18 18 18 18 12 12 16 12 15 11 18 11 13 17 19 11 13 13 9 15 10 10 19 13 20 13 9 8 8 20 14 12 0 4 1 -Ch165 18 18 18 18 18 13 16 15 13 15 8 19 15 10 17 13 13 19 20 8 18 15 20 16 9 14 11 20 11 19 15 16 8 1 2 0 -Ch169 18 18 18 18 18 8 17 17 13 16 8 14 18 11 8 18 20 14 8 17 8 13 18 19 20 19 20 17 13 20 9 15 18 0 3 4 -Ch173 18 18 18 18 18 14 9 13 12 15 14 15 10 10 18 16 16 8 13 16 11 11 13 13 15 12 20 15 14 13 16 11 14 3 3 4 -Ch177 18 18 18 18 18 19 18 16 10 20 13 11 16 12 16 18 18 11 18 8 13 14 11 18 14 16 16 19 16 13 15 8 13 5 0 0 -Ch181 18 18 18 18 18 20 11 10 9 8 9 15 15 8 8 12 11 9 18 20 11 17 11 8 15 8 18 12 18 16 19 9 14 4 1 4 - diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7615e.eeprom.bin b/package/kernel/mt-drivers/mt_wifi/files/mt7615e.eeprom.bin deleted file mode 100644 index 32556855cee12e791cf339891a40717dc6516617..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmeHDI}Ut&ba9Nq+HXTwJmOFOoBJMX>8 z2Pmd&jNmnAsKzxrP>P`I+O`EWbR(s#wMJD{64qM4z!+kuv*90P zQJR`^-+>F2?hU_ZGyG}HdR*zVjH#GT`8cEpw>huRmzdV)-6r@NztH6Zf4#sPcn4O( diff --git a/package/kernel/mt-drivers/mt_wifi/files/mt7622.1.dat b/package/kernel/mt-drivers/mt_wifi/files/mt7622.1.dat deleted file mode 100644 index d690814c94..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/mt7622.1.dat +++ /dev/null @@ -1,406 +0,0 @@ -Default -AccessControlList0= -AccessControlList1= -AccessControlList10= -AccessControlList11= -AccessControlList12= -AccessControlList13= -AccessControlList14= -AccessControlList15= -AccessControlList2= -AccessControlList3= -AccessControlList4= -AccessControlList5= -AccessControlList6= -AccessControlList7= -AccessControlList8= -AccessControlList9= -AccessPolicy0=0 -AccessPolicy1=0 -AccessPolicy10=0 -AccessPolicy11=0 -AccessPolicy12=0 -AccessPolicy13=0 -AccessPolicy14=0 -AccessPolicy15=0 -AccessPolicy2=0 -AccessPolicy3=0 -AccessPolicy4=0 -AccessPolicy5=0 -AccessPolicy6=0 -AccessPolicy7=0 -AccessPolicy8=0 -AccessPolicy9=0 -AckPolicy=0;0;0;0 -APACM=0;0;0;0 -APAifsn=3;7;1;1 -ApCliAuthMode= -ApCliBssid= -ApCliDefaultKeyID= -ApCliEnable= -ApCliEncrypType= -ApCliKey1Str= -ApCliKey1Str1= -ApCliKey1Type= -ApCliKey2Str= -ApCliKey2Str1= -ApCliKey2Type= -ApCliKey3Str= -ApCliKey3Str1= -ApCliKey3Type= -ApCliKey4Str= -ApCliKey4Str1= -ApCliKey4Type= -ApCliSsid= -ApCliWirelessMode= -ApCliWPAPSK= -ApCliWPAPSK1= -APCwmax=6;10;4;3 -APCwmin=4;4;3;2 -APSDCapable=1 -APTxop=0;0;94;47 -AuthMode=OPEN -AutoChannelSelect=3 -AutoChannelSkipList= -AutoProvisionEn=0 -BandSteering=0 -BasicRate=15 -BeaconPeriod=100 -BFBACKOFFenable=0 -BgndScanSkipCh= -BGProtection=0 -BndStrgBssIdx= -BSSACM=0;0;0;0 -BSSAifsn=3;7;2;2 -BSSCwmax=10;10;4;3 -BSSCwmin=4;4;3;2 -BssidNum=1 -BSSTxop=0;0;94;47 -BW_Enable=0 -BW_Guarantee_Rate= -BW_Maximum_Rate= -BW_Priority= -BW_Root=0 -CalCacheApply=0 -CarrierDetect=0 -Channel=0 -ChannelGrp= -CountryCode=US -CountryRegion=5 -CountryRegionABand=7 -CP_SUPPORT=2 -CSPeriod=6 -DBDC_MODE=0 -DebugFlags=0 -DefaultKeyID=1 -DfsCalibration=0 -DfsEnable=0 -DfsFalseAlarmPrevent=1 -DfsZeroWait=0 -DfsZeroWaitCacTime=255 -DisableOLBC=0 -DtimPeriod=1 -E2pAccessMode=2 -EAPifname=br-lan -EDCCAEnable=1 -EncrypType=NONE -EthConvertMode=dongle -EtherTrafficBand=0 -Ethifname= -ETxBfEnCond=1 -FineAGC=0 -FixedTxMode= -ForceRoamSupport= -FragThreshold=2346 -FreqDelta=0 -FtSupport=0 -GreenAP=1 -G_BAND_256QAM=1 -HideSSID=0 -HT_AMSDU=1 -HT_AutoBA=1 -HT_BADecline=0 -HT_BAWinSize=64 -HT_BSSCoexistence=1 -HT_BW=1 -HT_DisallowTKIP=1 -HT_EXTCHA=1 -HT_GI=1 -HT_HTC=1 -HT_LDPC=1 -HT_LinkAdapt=0 -HT_MCS=33 -HT_MpduDensity=5 -HT_OpMode=0 -HT_PROTECT=1 -HT_RDG=0 -HT_RxStream=4 -HT_STBC=1 -HT_TxStream=4 -IcapMode=0 -idle_timeout_interval=0 -IEEE80211H=1 -IEEE8021X=0 -IgmpSnEnable=0 -ITxBfEn=1 -Key1Str= -Key1Str1= -Key1Str10= -Key1Str11= -Key1Str12= -Key1Str13= -Key1Str14= -Key1Str15= -Key1Str16= -Key1Str2= -Key1Str3= -Key1Str4= -Key1Str5= -Key1Str6= -Key1Str7= -Key1Str8= -Key1Str9= -Key1Type=0 -Key2Str= -Key2Str1= -Key2Str10= -Key2Str11= -Key2Str12= -Key2Str13= -Key2Str14= -Key2Str15= -Key2Str16= -Key2Str2= -Key2Str3= -Key2Str4= -Key2Str5= -Key2Str6= -Key2Str7= -Key2Str8= -Key2Str9= -Key2Type=0 -Key3Str= -Key3Str1= -Key3Str10= -Key3Str11= -Key3Str12= -Key3Str13= -Key3Str14= -Key3Str15= -Key3Str16= -Key3Str2= -Key3Str3= -Key3Str4= -Key3Str5= -Key3Str6= -Key3Str7= -Key3Str8= -Key3Str9= -Key3Type=0 -Key4Str= -Key4Str1= -Key4Str10= -Key4Str11= -Key4Str12= -Key4Str13= -Key4Str14= -Key4Str15= -Key4Str16= -Key4Str2= -Key4Str3= -Key4Str4= -Key4Str5= -Key4Str6= -Key4Str7= -Key4Str8= -Key4Str9= -Key4Type=0 -LinkTestSupport=0 -MACRepeaterEn= -MACRepeaterOuiMode=2 -MeshAuthMode= -MeshAutoLink=0 -MeshDefaultkey=0 -MeshEncrypType= -MeshId= -MeshWEPKEY= -MeshWPAKEY= -MUTxRxEnable=0 -NoForwarding=0 -NoForwardingBTNBSSID=0 -own_ip_addr=192.168.1.1 -PcieAspm=0 -PERCENTAGEenable=0 -PhyRateLimit=0 -PMFMFPC=1 -PMFMFPR=0 -PMFSHA256=0 -PMKCachePeriod=10 -PowerUpCckOfdm=0:0:0:0:0:0:0 -PowerUpHT20=0:0:0:0:0:0:0 -PowerUpHT40=0:0:0:0:0:0:0 -PowerUpVHT160=0:0:0:0:0:0:0 -PowerUpVHT20=0:0:0:0:0:0:0 -PowerUpVHT40=0:0:0:0:0:0:0 -PowerUpVHT80=0:0:0:0:0:0:0 -PreAntSwitch= -PreAuth=0 -PreAuthifname=br-lan -RadioLinkSelection=0 -RadioOn=1 -RADIUS_Acct_Key= -RADIUS_Acct_Port=1813 -RADIUS_Acct_Server= -RADIUS_Key1= -RADIUS_Key10= -RADIUS_Key11= -RADIUS_Key12= -RADIUS_Key13= -RADIUS_Key14= -RADIUS_Key15= -RADIUS_Key16= -RADIUS_Key2= -RADIUS_Key3= -RADIUS_Key4= -RADIUS_Key5= -RADIUS_Key6= -RADIUS_Key7= -RADIUS_Key8= -RADIUS_Key9= -RADIUS_Port=1812 -RADIUS_Server=0 -RDRegion= -RED_Enable=1 -RekeyInterval=3600 -RekeyMethod=DISABLE -RRMEnable=0 -RTSThreshold=2347 -session_timeout_interval=0 -ShortSlot=1 -SKUenable=0 -SSID= -SSID1=WITHUSP-2.4 -SSID10= -SSID11= -SSID12= -SSID13= -SSID14= -SSID15= -SSID16= -SSID2= -SSID3= -SSID4= -SSID5= -SSID6= -SSID7= -SSID8= -SSID9= -StationKeepAlive=0 -StreamMode=0 -StreamModeMac0= -StreamModeMac1= -StreamModeMac2= -StreamModeMac3= -TGnWifiTest=0 -ThermalRecal=0 -CCKTxStream=4 -TxBurst=1 -TxPower=100 -TxPreamble=1 -VHT_BW=0 -VHT_BW_SIGNAL=0 -VHT_LDPC=1 -VHT_Sec80_Channel=0 -VHT_SGI=1 -VHT_STBC=1 -VLANID=0 -VLANPriority=0 -VLANTag=0 -VOW_Airtime_Ctrl_En=0 -VOW_Airtime_Fairness_En=1 -VOW_BW_Ctrl=0 -VOW_Group_Backlog= -VOW_Group_DWRR_Max_Wait_Time= -VOW_Group_DWRR_Quantum= -VOW_Group_Max_Airtime_Bucket_Size= -VOW_Group_Max_Rate= -VOW_Group_Max_Rate_Bucket_Size= -VOW_Group_Max_Ratio= -VOW_Group_Max_Wait_Time= -VOW_Group_Min_Airtime_Bucket_Size= -VOW_Group_Min_Rate= -VOW_Group_Min_Rate_Bucket_Size= -VOW_Group_Min_Ratio= -VOW_Rate_Ctrl_En=0 -VOW_Refill_Period= -VOW_RX_En=1 -VOW_Sta_BE_DWRR_Quantum= -VOW_Sta_BK_DWRR_Quantum= -VOW_Sta_DWRR_Max_Wait_Time= -VOW_Sta_VI_DWRR_Quantum= -VOW_Sta_VO_DWRR_Quantum= -VOW_WATF_Enable= -VOW_WATF_MAC_LV0= -VOW_WATF_MAC_LV1= -VOW_WATF_MAC_LV2= -VOW_WATF_MAC_LV3= -VOW_WATF_Q_LV0= -VOW_WATF_Q_LV1= -VOW_WATF_Q_LV2= -VOW_WATF_Q_LV3= -VOW_WMM_Search_Rule_Band0= -VOW_WMM_Search_Rule_Band1= -WapiAsCertPath= -WapiAsIpAddr= -WapiAsPort= -Wapiifname= -WapiPsk1= -WapiPsk10= -WapiPsk11= -WapiPsk12= -WapiPsk13= -WapiPsk14= -WapiPsk15= -WapiPsk16= -WapiPsk2= -WapiPsk3= -WapiPsk4= -WapiPsk5= -WapiPsk6= -WapiPsk7= -WapiPsk8= -WapiPsk9= -WapiPskType= -WapiUserCertPath= -WCNTest=0 -Wds0Key= -Wds1Key= -Wds2Key= -Wds3Key= -WdsEnable=0 -WdsEncrypType=NONE -WdsList= -WdsPhyMode=0 -WHNAT=0 -WiFiTest=0 -WirelessMode=9 -WmmCapable=1 -WPAPSK= -WPAPSK1=12345678 -WPAPSK10= -WPAPSK11= -WPAPSK12= -WPAPSK13= -WPAPSK14= -WPAPSK15= -WPAPSK16= -WPAPSK2= -WPAPSK3= -WPAPSK4= -WPAPSK5= -WPAPSK6= -WPAPSK7= -WPAPSK8= -WPAPSK9= -WscConfMode=0 -WscConfStatus=2 diff --git a/package/kernel/mt-drivers/mt_wifi/files/wifi_services.lua b/package/kernel/mt-drivers/mt_wifi/files/wifi_services.lua deleted file mode 100644 index 77579d39ef..0000000000 --- a/package/kernel/mt-drivers/mt_wifi/files/wifi_services.lua +++ /dev/null @@ -1,98 +0,0 @@ ---This file is created for check some deamons like miniupnpd,8021xd... - - local mtkwifi = require("mtkwifi") - local devs = mtkwifi.get_all_devs() - local nixio = require("nixio") - -function miniupnpd_chk(devname,vif,enable) - local WAN_IF=mtkwifi.__trim(mtkwifi.read_pipe("uci -q get network.wan.ifname")) - - os.execute("rm -rf /etc/miniupnpd.conf") - os.execute("iptables -t nat -F MINIUPNPD 1>/dev/null 2>&1") - --rmeoving the rule to MINIUPNPD - os.execute("iptables-t nat -D PREROUTING -i "..WAN_IF.." -j MINIUPNPD 1>/dev/null 2>&1") - os.execute("iptables-t nat -X MINIUPNPD 1>/dev/null 2>&1") - - --removing the MINIUPNPD chain for filter - os.execute("iptables -t filter -F MINIUPNPD 1>/dev/null 2>&1") - --adding the rule to MINIUPNPD - - os.execute("iptables -t filter -D FORWARD -i "..WAN_IF.." ! -o "..WAN_IF.." -j MINIUPNPD 1>/dev/null 2>&1") - os.execute("iptables -t filter -X MINIUPNPD 1>/dev/null 2>&1") - - os.execute("iptables -t nat -N MINIUPNPD") - os.execute("iptables -t nat -A PREROUTING -i "..WAN_IF.." -j MINIUPNPD") - os.execute("iptables -t filter -N MINIUPNPD") - os.execute("iptables -t filter -A FORWARD -i "..WAN_IF.." ! -o "..WAN_IF.." -j MINIUPNPD") - - if mtkwifi.exists("/tmp/run/miniupnpd."..vif) then - os.execute("cat /tmp/run/miniupnpd."..vif.." | xargs kill -9") - end - - if enable then - local profile = mtkwifi.search_dev_and_profile()[devname] - local cfgs = mtkwifi.load_profile(profile) - local ssid_index = devs[devname]["vifs"][vif].vifidx - local wsc_conf_mode = "" - local PORT_NUM = 7777+(string.byte(vif, -1)+string.byte(vif, -2)) - local LAN_IPADDR = mtkwifi.__trim(mtkwifi.read_pipe("uci -q get network.lan.ipaddr")) - local LAN_MASK = mtkwifi.__trim(mtkwifi.read_pipe("uci -q get network.lan.netmask")) - local port = 6352 + (string.byte(vif, -1)+string.byte(vif, -2)) - LAN_IPADDR = LAN_IPADDR.."/"..LAN_MASK - wsc_conf_mode = mtkwifi.token_get(cfgs["WscConfMode"], ssid_index, "") - - local file = io.open("/etc/miniupnpd.conf", "w") - if nil == file then - nixio.syslog("debug","open file /etc/miniupnpd.conf fail") - end - - file:write("ext_ifname=",WAN_IF,'\n','\n', - "listening_ip=",LAN_IPADDR,'\n','\n', - "port=",port,'\n','\n', - "bitrate_up=800000000",'\n', - "bitrate_down=800000000",'\n','\n', - "secure_mode=no",'\n','\n', - "system_uptime=yes",'\n','\n', - "notify_interval=30",'\n','\n', - "uuid=68555350-3352-3883-2883-335030522880",'\n','\n', - "serial=12345678",'\n','\n', - "model_number=1",'\n','\n', - "enable_upnp=no",'\n','\n') - file:close() - - if wsc_conf_mode ~= "" and wsc_conf_mode ~= "0" then - os.execute("miniupnpd -m 1 -I "..vif.." -P /var/run/miniupnpd."..vif.." -G -i "..WAN_IF.." -a "..LAN_IPADDR.." -n "..PORT_NUM) - end - end -end - -function d8021xd_chk(devname,prefix,main_ifname,enable) - local profile = mtkwifi.search_dev_and_profile()[devname] - local cfgs = mtkwifi.load_profile(profile) - local auth_mode = cfgs.AuthMode - local ieee8021x = cfgs.IEEE8021X - local pat_auth_mode = {"WPA$", "WPA;", "WPA2$", "WPA2;", "WPA1WPA2$", "WPA1WPA2;"} - local pat_ieee8021x = {"1$", "1;"} - local apd_en = false - if mtkwifi.exists("/tmp/run/8021xd_"..main_ifname..".pid") then - os.execute("cat /tmp/run/8021xd_"..main_ifname..".pid | xargs kill -9") - os.execute("rm /tmp/run/8021xd_"..main_ifname..".pid") - end - if enable then - for _, pat in ipairs(pat_auth_mode) do - if string.find(auth_mode, pat) then - apd_en = true - end - end - - for _, pat in ipairs(pat_ieee8021x) do - if string.find(ieee8021x, pat) then - apd_en = true - end - end - - if apd_en then - os.execute("8021xd -p "..prefix.. " -i "..main_ifname) - end - end -end

k^+==2o#5;{-L=#1^4^HlQC zH-9)9G=s7J_zk9ZL*S>0cyeqOwUqs?X;33uL+lG>v+k4=x}VX2=_@+1#ad+CP9?6VaFMgmtq8y296B9U z^`2xLK&8;ps1_|xlCb8)zC4r6}<7Si2T&932|uL zGx`ItoOBpo#@kUCWovt^FeC+vwT@IR%7TEsl=<6;jg*dcz5>6t;8xmATuxSJp7!T5 zp>h`hMC}t{{G5_N>K0$@!}Qj(GD3=r;@S(Gq&l`5uyP($wmsBbaYoImBCUnuEK6_r zf}-fWo}9SIFeU5uXzpD3a@Dgb(o#hXEdo}Y*!R?3Yn<9R_^gYj4*1B}p2*3f&Wu-eYrv2QI zf!=jsJ1%0uaIe~yQlGt*8K?^5bSxivS{ncOWCbKVdnoUX9h98RDcYd`GCETWBa0}# z0+P$HI+osz1u*W5J@MngJM_y&8=G5Fv8FpE?PF*@9dyVY;u>8VA&D^lvhkHIf6xP~ z&BL(g{+`o(QG}U;nMeS$BqdLxLO*c8rl(N247AQj1SSO?)ndnl+rCEkp!R#aWwL<2 z8>0pUWkW*bqa$tKna)?^6taAGxzY zIj4gBGcU9c160cxyAjZMyCdlcsCXNfc`lnAlRY*+%(&JVI~55bp5eD?%#o(h=0^m^R);1)Au_QVzuWO$v)klj6S=H-+x2j zQAB+CJ~X3pDkd;p0_*79d!soU%VdP5o*vOj;5+g#)kEM9y$RRvF1|tggpaxHW-grT z)BG4Ag|N2{xWiKzMd2BOEb!3*KJBrdrVka~tjCi#yKHefNYp`a87S&Uw|&o;`!cS- z^nQ`y!BJ>|lgCdF1&f&2Rr+O7o@-Gz@K+*BrwhB0*f6T%2DR(7sXDvYI50vu7mXlm zB}`EwmCLQjy{bd^b~of(Bb8@sYOGdvIw!?FLqlJUMOf!h(rq*n zrxEHie-TPud)_>gR$sv;#Jn$`7-N1!8*-?4vOv2K649ICYSatuo)J;U2nCdR49+JF zO6}S}d>TWa7s7yoWr`fq-nuRRpcjU|Ue0ME=t;LgEX_C(BkCTG(H0N7=W?jv1m6;- z&`5-4OKkZW+5&5Q5!?S0)49bqh6Vym(@>L^zGC;q5FAH~{Tg%%HOYW}f2HawkSLD9 zMJ_QnZs%;k`g~7fP@USK&Q<|$6qNq@_L`$7Flf;dt-I|lG^!d~SX=~k#$~IfJqE-i zSZ8iXatK`h16~)PP&|>RgR1$J?m>o@HKDTDQ&MtvQQemzpq*G}-gJgBuEdWV>K4KLISh4AN$82ROnXmh2cx!?l! zYk|naHYPfTU5mWaxZ{AL#@G&AF7dAwZ4kC1tYqus0!0vhJ+!6dHHC5LKZluBE8 zXe<=Byn2y}i$*5LGRl-!-9__!$vCPKVIqy%zoD77(~u6m?ndOe(UNyRXh?bk&K^J| z-W<0hz1%uI$)AjH>tsz88psb0H)^2~3%8Edjp9OIR^HPldgDR+{5;C-PEXj(W;F1n zrIenzCk(CQJ&VVRBmKk>uj_(zC_R2t8D|_{RG9b8br@QBeK^Y}{I0Tt2*z0?cq#x= zwF5)5d=L9mo)n;WBZ@=G0Ey9*Cge(@`%4t>sz{z>2cz$|c1dP}R)i!r+)^gxXDU#U zJtqAzE(kymBxGZ*7}qr9%%KTL@knJH#>TFw)+?ex7``Z&al=fEiO-RE41LKj@jet2 z>9?sT**}r7qX<#S%*rjku??SR>7IP%Y9S;SrKhG*G(uno$hn?^o_PAmclPZ%(@nkr z8f;y$o%O6WjvUpS&Ojc^s!?ldp|_$aK=Xt|mOwV7y?o}RSX1IyUG>oDWSiq`X~ma4 zF!5tbqSd*EFCfSM+Z%Ajv(IY3K_1({hi81#KM*0m6TFbhxO~{OwNvyXBh*MzjDGJi zDDNZNjG8QGgV+9KsiF#Qxd?PCN~dldw^Qg&9Bb!~pBacUj~Ugm{>cQdR!t0MMHH9! znOfg04;d@5_jevgQS{Vxo(j9Vwih-NRY5C{^+pFWBTE^1+TqLsk0CB05=G0Q2F0Ox zIYi5tt|>6J9ynnj26Pyx*<2JjU!!J%5Dmb{G;^?kiUf&HY{JTe0TIM6CnaQ>u6Le^ z+CSZYVm`Tc!4%WwT2KV&Yhs#2^>H2f2J9FZojab%$Z=lt%#xe4Uz2BYQkD~zk3<8V zdP5qA*5&}XAW^5iCICLBAH0g0-E_sfd%bVLw!hb>H%Pie(Vr;Ma($a|)l+gE<`Rqb zl!{ZTtC7No7TJ8D?=Aqc5ZqGNE)-6+vpz8{+fK%MJJ}2~o|$uU=zfI9nPlcoKCPw2 zx#h4v$esb(5 zjUX1upf}}8jTk;{`+C5aPY+OTmZcO64z{l63dQK!DturP~0B5Rqsp%7|(8;O0Z(uaNH%)Li=T5@U zv&Yq$X^N*DGQIJWMW@z9(hX+J8e`*i8ZVV?X&jn!aV>dE#A#FMTgJK)4ilTi`O-J& zazFEf)t8lgqzpUnY!fN_jK+<|^MvDDEBs)8=_OgqV%53ykr7SjIu=pQTZY=NLbXu? z)Mx;iKtmMtJBr|mDIGRRAU|qIr$#kk7D0?jjj}5$1e&v^hQU0bN)8D3B6a-{@Azdd z3?UA6SRi$~25GADG_sM1AfIuyt^-XTNS*KTCTp0E48&bHl{0QPDcw0f{QYh{0Ez%= ztYLy=#Abuxip=EfH{fa3CWnvCZMnh1L75|RNun#q1vgu7pDv;^cd*3I4*I#bo!J8T zoK`;LuaVu!V53No2{Wz|yJQnRPs0dyjny|b%{NN4^-AUE`YuWj zH?(5D&>@60fOK!0##MoUBZh7PL74kN5WU=^p*2BVj9}>(KFXj{;3#?wRArw;NV8Cx zXkQBzE~6&=TCiSu0Jo_t$)l2k13LlsIxx{P96muv*-bl=vs1BihZ-B=OHi6Hl>C?+ zAgIsZq1f?Y8a6QbSv{%Bc0#!AR>+8FxZ zX2B-$(Lca)#=Fh6n{wVg#GLXPQN0MA$?CAXu)u!mf@|(*Y}Vm$F~lJWakx?ds&wH5 zp)!#CcXI!WP_UQ0oS$P{o2H&e8L0G0sTO9|=}m{D-VK6rYSKHX|zotG(m z6#0fW)diiz=fg0LjVFo|h==u<;Bf=Blr}P0VfZn!Td|#yl*pEA=VIKdN_LPL9%TV- z=`}M$Tj5Ra8Lhbe;1^-fktG)%&<%>3`-KI1*ow}m*&$S4wkwCkHVj4~{;r}rk!cPm za$Y~=^A8OZu#k3LJV(=|(*8tjy17z}H`}huaK>^G1X9Qh^l|RcBB4Ay6w^8eXMHLT>W3=gTSKLhTN#hVxf%7Ou_n*x9o0=UMTmw}0y5OFUp z*`P609FWMM%uL+aa1(SJZOGMr30M^8dkPjQNLdOZ2KRv*sHK(CxOT?fM1#B1{cI7G zhWboRGOdyKwUe@X|ELH8BwQA7irEV({EZTgGP`aAzt!{(R6L#o5=iYf{Hf1zxvooU@RAqozXkFCBuk3b7VjbBF8ioll_e!X z%ym&bsoVu89a%8#5nnG0=LsNQ>7+-k{=K(wfS4GQ6K3^bNciqyS{(b6*+7py2D{4E z^Rre{<8tRDXYkMGq%LD->qHXQ$$9aVyZVDe2gzKHTVX-j`_IeIE3@p#>T#^40fk<^ z3^4!&44yS$yLDDvbI%?1a&ZyBdXV&n!JOQ_-AiEz(OTn>5}%@)uW7!_wA5~|Jm zBgb5s?nOKTc+ z1z_BCQ+M-u=soWC?-dF+B_>$tpkB{3q(XCntn|aJbzavzxu?`(M$TQ-NU)uU<`CKKo5>1M%Vy7#3yWsU`7M0@-&LcSHR z28Nn|?EO$AaOxxv9gWT~ShHV+xK-uh7@u5L5~CkeL9t6V>)fhJHaJ0LcRl>&Wyy|u zHf0E-TPquxU0g_*3d7^X^S+R8SzlM2*SWI*d&~6U7{6anomZ&X)KD*#nW~mVhPoEX zw;Q@R0D+Khx{?oGT%hctv<;5m=+)N_s~5Og)o1Hxr^wOHgx0-xzT%zwJ%^w(fpZ>a z-6=EMnGV6siWqwc=|}JAT;9Gn`>!}RI`P4&>)gRjTTR0{50nwgR-DO{D+eDG)NW7i|$QR1?>LY^cVF;uU2`KVtaveNZtvw+B zGv9J~1hXPJk1)LHXCsDwG1ox$+GbHX$ooj(WkqXtf1nhO1gt%rLcp$C4rO;)Juk5@ z#*q8o45+93V~!eWdPc!RY0f9sVOssiH@Y0i)=^Ii=|D&kp&hGH1VN@va~-x$+^nOXZ#aJp@VsxaigsKQ*Na_ zH{V<|uHA|$Y;b#PZG4p$Do?H@vvGcq88Y4BM3x1(YdF9{^XEyYJI>SnlUiPz^|2sY z^NE$YQhYa2#gKR)gU`a)x=+n*ib6PRkEWjD)mCqx#)B`sB(;w58)Upk%t8rc(2yZD zwz+Dno%(Tb0!V<%tqJ)g6>VRo?G;|lqbpBn0rLTG4e#oZW+SoCAe5N%gQ4!IVz{op zE3JmW(E*g@W~QgT`_G)#(ds)kL-!d1;MeUOyP*LydxKE1q z4mU$O?kfTN28xtn5bxu3xTS%IiW*~h@7l9JyV>-vCWekES#$M$uG{}k@8n<9`uzsy z^SUb(6Qhjd3O-wJ@_iK9jC*&8U7lpYo{5yKGPeWB7oC9`k5>pt4qPYbh6Rb$Tjc)a z$R>X|k>`GU?>wKCjw>LUE>RxFiBoAZtkRY5#69LiE0)cv2(QlCJ@?pi3T4H}TbIjc zwtS1Afgtkx88i_jaCCT*y?ldI4#+D3VeuhQG&&&;T?VR+KpE5Au9GP_(e zjlPH*F2xFWBwUq%6J?amwi!hP)xge9T^ckfFl`^tYp!GWb9APjMH)g{V+_V68KHp~ z>eE8!uMMFLfXx`pf|5cgd(b?bOXj z%~&>%4W|93FBb1i%J#yAJqZ2$r*Egd&OGTM$J+_F)f{+}-B}px9U!!Ck>MA|*gC+@ z5o%9-SDbsgzN*UM?|uoyilNlJ3A&+0Tx8Uh@V&nCu~kfCK!5URPzUk@aXKG`gqKA10U-EuM9H2Qzy{{LCG!nsacu0Js%HMh^egEHZm*NCE37cIi{j^P;(c12+jL5|(t86`Zn-vgvC z)ZOBPS0EZ=!sHJhlaDMB!-m5wN00llfw##GIV-CeVw=}~_fr6*#>1ojK(l3KUts4Q z<1euiP{x=9sbn9z3V9TklIE)&+Zrvnp}EbKc_{p>-AhJrWJTFlwO~|M7c-lUq8w!a zv|>ss;Tw9g#)wFbO+6=-3qoMg&9DZB)BM9#_?+6dEYYw5&uYk$9_Lfq(W zin>U^7<@aZN@X6hUik zwJTJ8ituemkxLd!ji_kyTA34Duf**bzy`gUy^@&rv!@@Ep$2N%r69|Xh=abb3P90Q zKAhMEFnla|M3vFd>72XqcaTLp%@OP(x7%f6yKbJ$)#jKOe2HR$yo|5t|Ru$<4^SqsZ>8r_d+?>vHl1 zYwuiup?D)|5nCoyJg_oa!XBdyfwF^CpIF>KVLZ3k0dJLhE#-e7sB|z+1W#wC-l0ZF z0q8{=%o(y{QyYO`4H3ynv`5M~yL#EJCkWsoM0G!qi#<_~W!Pq;8ZCo>!bBz_`{KPL zX}s=oQ81V!!b5=KbrdJ!j7fkXeeIpCHeD7bSHhS?l>d>TFn^Q&rEvX3QD)V zloRn23bfQA2A5z<=Lbls0tPl>)*lfiY6fWWH&#i=A=0VJXxT52SC2mMAz3z`ZO~FxmI+IAG6giKY21}FCVdef z9J#};3^Sa#Q+!TKNuc_&LL<(?_~@uRs5lcAMr{KynLa2;+h&s^JjWXXyu68`T2B0o zI!mdQi6rfi#Qchc^g;2m2TfZ|&~S|@v3aSgcz7zgnK~%%Bu&iTU0E&40mp6BEOFY0 zX(EUnq4`8;&G~>7BuWDl<%^4HWfMboKNp2?u+myaufq1nm18RBDCi|+1&zFj%rY_% ztnd6~NT6b5SI6a|Xq-F&SD)1lv~SMMkop=?YS=^BCO}m4YA+dV0$h`PUOyl%AbKE4 zKstlYWf943?1RV<<=QOk35+ZkN!+qA@{C0u`bl8;%s!E^&)HQgBV=mJ_)6nm{-o9% zxG3yxw-?9VqDXtWScI`|E3^7}mOH7?NC&Mbd21Hj{*Y2j`8o#aU%4*8oqe$d%sX=F&lx*5 z7-z`fPV~}(P;kU;N1jrmaX1I3#(ICtBJUF4HBCuX5qboeem|1X_7IMnDWyK;U)IpO zAPj|MNUPOC;FQLX%uITO08m%>mL=F$ztjs!eibX+--JTl0I^Oe<(|KF9B4UcIAMoU zxUrYy@wI$B)J<_>Du@w{{=i!WGuly86eE_Slhp?GNtg$vgTqG*v*?^FR_&swUdBAT zUN~*!<1Hih7xD(z&pVJAb31`d!Bfu0&&`0gD{yEFv?>E%#- zB;9ovu#P7l;_TU6*oZ_p-ym@1uXtY^P<_GEjY`Ca&cc3Z0yya-&+2GSmtm-CN$fEI zS=djb)j$M?t3!0lhZL3}=ZT7aS453Q4gZLOLk}Rm6CBC>C8>QiCm!B@Dn?W8=(%7!10~QOm+w~HK(!i-gsxgct z$@lwe2z%IjX`m>80}lQuoJMMmAwG_QhzcP9S39?1{|Yc^mOU+ZV$K67%t_lP$z)8J zGe5^^4X40oh^a;PrAp;6x_MCtlNyFhGL|K&M9^$t8+lX90q4;vC|>Gb;-Lr7yTs)o zo9OWQV&_BtF12`|2efHGWTyu5BrZGEZ$Ecxkd3|8jFhed$Gw1EmawBqsq5mQbiaQ8 z+6Y1OWqOGyyVilCmM+McSw4&>Nlx-IATt<0JQ3XGso9>dcbVw#K5MZ8iiHI3?Yd#9vYI1oJx)dzjmx^8L^t=T% zV19GO7$T%994I5Q2>l_F`S@Hs)D#+6e%Qx|Sp0Y|wEynXUm9Ahf>C~Dm{Ti`skH9Oh3q#H%FdcgSW7Z)iAj~GOmlEZB?B2GpUgNXnxv& zi`mLdR;nOM(V}viIs+wpfKY`C4n-<8Vq**TqV+;n?F|;^UCb78)mZwDgfvBo2NirQ zmh43{w59*B+WLXLL$5TuJ+l@c=fyHr1}U~SWHGE@19nW&!2Wn4+j>ie0OxKL9HFx= zo_{h+SNyhM0^&*wmL_xYqR#bXiL0!{5naqi4o{Jk9{f{NUEk#U|(IfVgwV7G1V^&9ljwAg>bCUG_~KtjBmk zZ-+EVwla`H`ZCH%GQer8`JO1G1PzZW18(oJf;{BtzK@O7^Fib>YlwWkgNgD|nW2h* z?W3Te9t5K@gCHX&i-9!XQZ)IGfHRhGzrSeG-LqF++`&1y^^rdCSb2brBF$9z%;}?T4E4 z`^;NYLV)n`5b!iq?Ol}l8S32B#UJs92#R%co1alPS&{WMimqQy4+zxmosf1^11Da@ z!p8BzcVJ6W`=o{%hX0W0$PEC%f*Qy1)HaqKvj@{lwpaIx&n;jBH}{2bt@mzV_>yy5 zB3U3F-{QhM*WL@bJOTJ2`+FAxnWc?^8~x>1S6O(|G>)_aPB(Ns{d5r~uxM{POmo)I z$JO)`gN1$zXav0Uw(}MZw?Ru`m<&U^suu}UZBd&#?{g4mmiX_ULhy9pPc)~5hqr7Z zs$B>J42Kn`tSXrqZZX`AZLk2%PmGpNRkC5<;vaZ52V>#S`EJu&Z>Nwmb`dmCSCe!G z2B(|L5~zrtV;Ce~SY?U5Et<^k&cyjB;-AmVw~MAbY?3;a?LF7sS%!Ee3% zY7^Kbkg!N`Ve!)m^g>Eg6Y)17XTk3VaObgkJzj?bFml9o;_FneG0aO|lMg}B!e^xfSvmu3}cB3rseeB;?U&m=CK*k&&C6DjBR z?nW{YNXB+ylBJeW3zQ30pAVMtt#Y9kPg*px-6@nJIzOsHO0s&~W5sE$_<%~D?ig4Y zw+NsM@hn*1c_|vivkk?mvhe^NZ|7MqK*+z)>;o+Lfu7_({=G{>*!O#;Cu*CK2$qTZZ-spKYl+qiabhGNH6 zDVfzcE?9j?h2Y24`#IN)=8-l01|=NfXuu}BLbw(HZs(LLP);oG1M|-_9^8`wQXceJ z4KJYo4>3T_zYNuEV8y_|dU(B9s>neZQ?L z;bxO+E{PSO2p12TJQtF$GLbLb|o-)>gl z!*^g;Ph&U;yv=SWD(p-ZTrOcz5idW0gk$KtRR)UzT~ve^<(I6!T{@lGdDOv z=d&^1K3U-mt(&;^+LJ$~l+DWaf&Zt5#9oTb-e~L1B{W-uwFhSs?CJU&~(@4Ma>ziWeOKcl4ngD$I868!@GbSCasttHqzzFlZm zwx8F%$_@CF3@AG@8Kg!uaL$Nz-{f(mQne+6-XXyHN^Bj7%!@MR$|``TZLS~jV|fl& ziMl^ng{sWMFcXSGDoGJ|sL3cyqkA8giEt+C^1VY?>1Q*XD1xT>;i&}NpMLYc;?IgH z>oz*O>xyfQ)YufY4ligplfO;=wuR zb_66&<`+Q~(+cF6mNK?Hv8b|3x6776YOVuH{>iqhbgOgF8s9X4Z&R)52~g3)P#nPegMex|na+<`2>xMdWSI z1NF;OBRt~ezUy+f*-@&QE!M_y0k8{|NKf3Gj@Y1am%Uax1LB_&P#h>K;u0L?n10%v zsL&e4u}9jRhgMaQMB}TCw1DijmZ6zB8)pN&tVU_mKc%7cn7cnrKQoTnZU!|jT(@Rm zUN1s!qWSQVF9sxBSHsR~lJ_%qCFKIMzzhhr-aTA(J+sAg7Ur>iVSX&lB2y|$3sMDV-GXIPltBRDq>1oK|#bP~`E zls$F)9HUy>z)9@fXKW{74LivGM)uj`-${Z;C3A_YE5RmFVJUP_%l$fLmEB<@q6~TY zcz#y2+<<+}0)1Cm{3Iv{$>+((JrVt| zKVL7`qD(O3(W31z&iyK!NOp)g+t*h(dLiTux^QN&i22;sC~bb_gVd@#U#wp)c1N|LFCYia0wytG)SszNfKJBD zYPnD$9Xi#9x?CWB;vlm^fCpha#BCw8{~SaC9YpS8sCs~jIspd$u}bf(C}GFJPnO%{ z=m4yG-B%N{fdVL8Renq0D?P^eN;=^lnxACXwS@7I6PiJ zkse?Z5+)bQ7_Y8qL-Qm2D|zFJF5(cCq+XJB<8HJ)%zAO%3b4wZRSgEIijD3>SrPcK zpRF)z?)IQB)dzQjAw%uUCI-N$mj0Ri24?KD{;DMb`Eq&yGRt*0gX+~QbWgCUo;#-T z?|N@n?$>6vRv|7m>{m{DSe8wel{m$%ZZ##uY^2QZj^k%g8Ad3b7~7}b1vRpDySC)c z3>dkmW`7ZLKAys|P!T8Gp|dPJT^pr-k^oiN3=R|Uwo)>2>oT15|3eh1;yLKs^=d{R zZ=!e=Fq=uAs=r97xl8TkMih^!yZtNb4rJ#U2@06-R$2;7NeU7__b)9Y(3IBR(LTHX z7*jVpoKb33VkW08WQx% zPBsS^^geR#oa8ZjivoP@m~0zlgQ6P4{u=iCNR3tcJIOV$3MG|t>OLgu905~ zlfU8oD;Hli+G|Z-LOq9qYqj7gUW2?>lYZjZJhh>N@Kq1iBRAi?qPO zj@psAGKTU9%swt>>`;^;eu!0yRj60v5P_YKihM3El!8XV% zx@8+uI8A$%er&>w6I-Id-XV>YuLrusu$zVVW6Z*_;5@Ma>dKW?>}(e*V;SVD?D5fj_He7|tY*<^MvuH!4Q|Q-|ebt^x^4g!GJn#VcqL?^Q`$Y$sz|&N0o(LAgvW5((RJV4=E4 ze=vxjt_CNepZw;Dfau}KXG7BX&vM{>E4e05LSOH1h*TK&0Pux3@DQuN2QiJCG<~eI zmpAJ2=)5XagEOxjD>|Y=nu?ri+ju|>J?hDEHsj&HaCaRVnuah*&a(@x&IRw(O$D`C zR|RF)a^TL-sdqW!39%e|-dz$dX-#yvLG-WCrNhAg_UZOt1(v9QbE`hvKkZW3?=(Zm zc?n%Z0`uU}WN%qDZMpF$b@0N#aV~YEddl;Vxn}8HPWh~kHQ7u(Z&RiP`fm}sq^sK5 z7Gc^BOM|5rayn+>nxW-w5~_-LgGU@)k1q~f(f_!GOWi>#&tD0=&1{M}dQdc$6Ck7c zw&z{!GaXfn3|Dfv)R6a!=L0tGo zj)wG$FG)qn*Qv_EH&tVjf~Lm*X2vTafUgmQyQj#hLfV3Z-T&T^seu7Jqe_*(8US)d zn=J85Jh{D3+^*D4?6Q9V8@&vdJH+QZQl==hJw*wNC(d+uV8zu9_zK~!q}o0*R=R0m z&+CTV_uMLHw=e+X?W@O;WUv*&Jm?4<&CVk)FL@gpx0a;7PYXC7PXC%0j~ArJA^G6< z_#qe4NFU<2u-RT^GhyLT$@XLphehhq{k;a}86cgft_fm+8PM7ZLf}bF$2&--k*Qn9 zsxcG&penUmBmiJXeM$YNGonTSv8B9Bv@zx%G}GlWo7BQn{%UmIegXx=?iq!Zg-OZr zXyzJnuzF&UX!VJl(Y|#M(nMvQvAu91;W>}9EL>>2{Efhi#@Pp{z^r{L66newZ`m;P_s?PR=t zt$)CqtWjF+OUS$uKwN6EnhtFj_aeK}WW5PJMYPu~5QGMdd7{?JIy8XiCowma;(_D~ zncy70O^xJGM~rjgKRK+|enhI`B#chR|Be$%OX)FHI+_)2%@AN^B0|t}k9gU04$ukE z>^9m_@HpCP^+6NR8#zjKqV~<0YQr$DC;@>bUlY~>2Gt3S$0>}>yxSR-(P=K~Q6>!k z-FD7wA1U6LFlrpJ7Ko>{XD3H1rawwoyyl?IHe7*~yev_Er)=4S85z(TIv-<-@NGn` zwE9m_xw0%!*u6sE6y!%oKiUEB9W0@F$$dg}?WVrtKw^f6h#3`$VRliYBooOOI}uKz zZKt~3(dWYPBdpYkrMzHjpqD*n(OaudpjG87<&Tav|F8gyig{cR;Mt~t1!jh@RL8`Mf51!Dh!c{Yyp9+OGz1*#%6>=k71X}~grzuIaz4U~+5 z?$2M$rPNt$MT5S+e2|VDQA+y~duF4jR7mCH;hH+b{+lHPs4erOY9qHhDrex=Uzk|= zntiA+?g(rM9DNkt&};dqE!G`}w`hyKB2z2N49#S863yC@E@QU5pVTFc+|h)L7*!A& zhvK74qqkW#OVV(15>Dph?--b&UOw*!5&sPV?nh_p&$I*rw3GJc| zn52_;a`M{2eh`d?{~X_2`8$xH@dJZhdfI$|Q?@a4UPj-V5_!0GW0vHx6Skt$dtqKv zvoF_uAQ%Vws*d0|CbEO@i7Oadu`mapE_0PuC+rd8JSX~nzC7hZku7T);rstogI}#Z z;%Gu%PKmH|^pRMf^j%wHzrdOf{OvVcX*rpaItkFmb}_+J7(Ax1>?SgBV+#?49S-FKCmPl+6L zTi&mx?<6oRYV)JpH5}KI%t1#9an8FDnX2wb9WY!MLN5P2Al{j!9CrT?<+v*=Vb9L3 zqmj6Ngd?8}v@OC;2xsXXEO+gs@To-=sjJ*TP@ zqvmM5q`s_hrN8ca@#%A1Wzv$f<-(g~m`ck#E?6C6)&b$4*klicGBZp`xV1V7kJg&=P2~gdyRR>z{Z#m0H zpwm6Ge8a@dM>|j%!(d4<{dy-*@FNxbd8vkKw;#4yNjN?HZVOO+@E1KK{U4T+%1E>_ zXvTRnMHjb7Z4pJI-(M;Pr9fvGcVB2oDXCjQg19*h>&Z0BAiT0H5a@}lM;6tckE8K> z&y2FnnSg2lG!D7?n3@J{+|)0QYztR7ubI<(@y8AH1VfDkIoQ`ink>=12#RyIu+ZcF z`U|4034wjr=w00QVCfO&fb3AEQ!2z>HJ6Xj-dFbR?Wi{roFm%We+CAD&EpSr*#b^E zt@i!*9JHoAs1aH8)nek$b0(`X3L7izU--2N-Cr$u1d|tgOuD`2wV}3Lq|*3D`5A|=<#FGK;8 zgCIH$v;dIuG(|63`H=4|=o%*P;gJGq)VHedI1@fE)MZ|Z$w}xXCK|Yq7tShLi!WxM zk!A3sFjtROgCF&%2kB<`Vq7NHNJ_Ae?$x~6RjU~d%=Bh89t>-Xbw^?B7WIF5@%-5> zGIYpC`+1It50-qken}2jTeXW2_jLg00WYku#RFT4;zi5@E8Z(26@(dx3^Q?zKK3D& zV4q_p*pO{(`!gR%#+2A^r_ylTauaQakVIfUPIO#m&oL22oTslvm2P!!{%7&Yd&Sk& z+bh=VAh1oZT(%=)g4OdH;|okodSQGmxRYI>7o4+!8+X`+?vhpK1tQa(2cEap4JRx| zqlCvp&@^X(JoyVRcWG0kZqHM*13aYRm{-EXKiZFqv6Ln_hUa{93VKud>&e!hB+y;q2TA@YM#u`HNGkWZbp)L*e1MW)xMk zzz`_~ejjgm2Qgv(f_YCU1e_({xb)tVf5+9GS-EspZK6~4Rsla>_b`rMM(5~n4y9g; zh>1nYw*cI!OAt|HSKdBl5#Go|FQTw?XzReCCqi@KcN1Se))z@@s&zxF5(y8*ix!N> z9cC5v9`|^I`{N3`z+U>mY@JoI9R@PF7cS&-1HnQWx<$U#tK0^$;^8Yl?jZ*R4igq3 z?^-et-rp+y?&Rbhy8N!UaW-F=c`$W11E4DiD3EnL>+s%V|BR($5f0G^NrfLS`+P`r z*kx|)>n%u8wZq~N;mqx)L1z8CESe@$w0e*@QUf(?;d;yC!qIzvXEW|39SZ<$RL4^_ zGOu(H17X8pI$zM)n9_8CHS{Xj35mia+ei0#l!eqj%BL(djKI#F<=X!!WiKV#`@$ckz zT_MB0tfp1Id1QsZ1u##EU;(1op4&jgu4*)?A##AVNm;jAlGhzN0u4$Qf*ed@3Qe0~ zY->SBNTio-ELo{yZ2u&7vh0NI=z~a90umpb*7u-?(wu`Gk9`ARbGe!$>QeR_5u&d~ zy8^$=MFzozsMJyBpZ)ZPY9%C(;IW-tX)|-}FO`{Srwqy#COF6DPC{2=ecWEhM~V(h zfebRmtMLn zRfR{;8hPRv+N*o}tb$DeFi@|3eH#)HeiBwQ4@8`E?w_@at&TPpEZn*`X%Q4z{hu*@zx2p;av2V^#qhQ{Lx=d02~K%d&;Ke5Y$^T znlJ0ib!dsp>{@m9Km(|ugL-|SEL0%#@(+%4LuXym`JfwL1Ixc)L~5Hb#gN?Ef>HX7 z1%5RLWU(jC?cpcqO}d|0W{2o>-)sDI!6OE*;#(Tl*(l+~n>4*89t`{jq7lZ*sv=kE zF3nl?2r-}(9*D!?-Cy^ml}fVb!toiMg~$rp-GwMAGSNau#ch1+yynqB2n5>CDQI4V9!nL^$@gf0$YkU6T0ji{6E@q$?>TQELGDmTmd{QTlu}g$-9o? zy+!D68(>DtkM2R!cEez_&)c%%CMBCV-KoZ@%sSIdNm?e8oD*U{KSPcz5>k&hjjNgr z4ucoeotN`R@2E5kA0yjN8$u~0_XD7~04Z`K8@2(D5 zR8~CY?m*{`;`srY&$`F6kg1q*b zlXX-;+426$dQ2V$^L0)_A<>2-wMqofmhZmT3m+2^lxfZ1kcLu{jNz3Cv7>68X`Ra)OZni05<1`TypveB*^lG-2-D?=SYQPT4_ZdW>&-AP&G7_nOfq+jT z)KAbQx+eS%OG2i_(~{XV_)Z|8GY`)4gw7-BB8e${*OCqg2Qdc*UdZg*V>NTU;rTyn zew4}TK!8)JsgEqFou;$Zu@{^qRC>@_cP;sSc8+E`fKrtN3>xvPX#5ogFzgASVmw*j z_yGQsL6a>+n&Wdc!yE%jpO>SQOom$3&-o5=O(Rh6pE@9Yt9qxW!O&4QS2#SlS$R>8 zQQdyqL1VFf5&NH!n3<&=J!32~E^8ROE|1{r*H>)+aKK%*dW(J~b`Pt+;0te_))j%V z4$;X)FIj&%1~f>~1bs4f&-j96W{W9wFg&V&rqbnaxj`TT@wU@QQ&UHbpfywOH#dGV zY%^%5s)&@^DM?ad1GOK=bH5pn4!}eDBtrg0Tshq~M?amhds%)Kix``i{%#lxyjP=kB91Cs*iqu^;uoxOAKz@>yy&aJ>t zszA%x^1*)Cxp6>~Dlr!F5&^t)P|Ruc7r`95Y3=i7t6F!BxLbTK_Igo*oVVBbLDuTM zy#_eKg|Mvhob#DAtQ)mB&o(Nc5WMQMa?WgtU5H!_c6y|>zMC$CTdTSv0lL&~X1_dI zT=$94lCw9hZMNyAfY3OgWj#w`#G~o%7Q56it)ZwR+r%%V<{jvJ!{U;b&ul52V-Qoc zVwQSoWYeSsN{27O#>s<)Px?%ot_W7_NWvxf4k&&aO<%r^ zB6+HV2<`cj03~I$jCd~+LW`7E3Zw~S0B?|%jJzB*P)TvM&4X1`ljvWU z=^m5_T%9gxj8rJ5Ui#CGfJ&`%NyeNsFZ9kNpToNEuq-46>I3qXdoGF{Y4p1fXYyz{ zVep}Z1KB4FT-`%bmQT6-;ZZ_MILNzKAE0;jyf5{zmamoBQ3rF`qWxQ34w&Ws* zT$LzQuODv0*Yim^)CJziaaAM|u~2H<<6VI3SA(ru%b1oMY2y#Up8!f!V=?h9m#nal z;Wwctm(6v)C#n>iuaLVPgnB~z1?%v<{6+o@@hg#Jcg3-z)nS0O(LKAx!;UAb9sU2y z`l{50fi8o5ndG;V7Ef#b{J$Sw1Y+{r!cwQHVOjJ3x@1no7#T4(^k6Otu;MBFvGdze zQYBB-)&!i%>z>Btf_mT=-m)c?Hf}whhhy$O;*-}AT(cG_4jj?Fz~>gtG9zGE-JY(Y zhEbSz^G30_XgSqoRH6B!&2%9S1p5W>1#_5Jg*MW5?HCsnAl$d3fP5&Njqi!&1Bslm zKa3cD~TjF3q8Eyo-pl|azI-G;H~2gwrGi`2@WVTrS+I-E5z#_$_l!2 z56`&GBk#4XDcxgGR(M)+T1ro+cTQ9F|FB%xwK47QO4@7PqK3F;JJk31>iYf!;jfJP z5$Kh^-02=caNc5TpudXHp*7^|4K^MJLHH*|?BqYLpMCCYiF}vrg0wPEAQz*qZ7%hU zPmjk9Dwu)A>0Ss^!e5XVdY~ym_8nZb&XNK1?C54`Fbj%C^ff*w-v4Qa%DC}n^tSXa z->nbY#gQ!eD6gJ7Lavd(gv9u?eMpi6Mjz=8#$gh4Bh-8w45D26e*5hNJj6R#b**uE z?Sh1rTJkvMzJ#NA07S&)6Hf$xbU9Rq0U!?m(LUZ)g;$JbiBy>c?#OYVqFpdiucJkk znoXN+l~qVV3xOE-u*04$+|>V)DxGJQR_Cjp0F!5rAj|k{;Gw8EBr>n?$^h8W8;l?7 z$|&y#AMh-|fHg*O8BL`_*4dSeX@sO{G=S4k7OyI(x>mcm!+_bIx|CjM0#&bwzHTnj zTYqlRe?+s+t$FpgmZfDXd!wA2wiscZqY&{du(wT9Rfw)I3fKQsVL(tB&c?xWJa8kg zl!p+_sX-~Rov;7Z_S#ib+LPJY{sDN(@IJHyfM?)4A6%Pgv{gfEGZRM<_6=KK;Z)EAO1 z9H{n+2RZMaVQjM}I3{%`Ur>*3)_U|X8Up}~(>7vcL*~Grqk$od+|jbaL@xRGPgKIm zsr?r6fHRazoIl=dHQswOfOw({919DVZo=>`3amQKflf(@=fJyX+u)mTXBP2e+s$Y3 zUXzD#$CMHQhT)}Iyq`NI+w~c%v2UYY*0y>bo*X-$%FbsB%KoPEk|j%jC7q=5NdFN{HRJ{ zB$}KXCACG_fbr{g;5`?0(c1fIgHG%lEyYk`hHAxhgCUEyk?{AFCBaPoX6g&^sQ{!sbcZS>#A|gRFC$ff8|f!g6`uA4d%jy(g?_ zAdp{=Y(0zCEGe#-<`-axw@MrHN%>!Mt)_8tJ2sEYXuoc_wfykmcjUnpM`?CywItL)C{(=%}IJ zMc8ay`Ql*JtlZbnqowZnU7Ew^_);Hf;+Ub>FLjID)8i^SzSNjxG=ynXoi`gT73fr= ztbJYOEVIH@Wz)ZXu<}}WAL!>yIicqi+CQwvD(@}HfXtQXrss&!pXNLHy(ePbzv-)i zjf79c@lfk_SfD_px^bB3b`ve|-|G6-KIA>$G_1a$s2iy4QSi)@E0f57W{9Jhw7T0?=QsC zXCY&V>aiSAP>VSOYm4cJBY>Sm%wvVht?o2k&*{t4j{d{U8ECgn@F(F}{2&K_t>-VE zy+HyrYHrR&5@_1u(bfH4jhvVRiL725BoME3vG~dJPYJN?^I9heHX9B=e`^K)W{-$I zF8iXD#=WtFgTvNW+#5zH1xx`uzNULy;JhFWCo zN@ay*7}=wRd2I|G@S5S5qKt1+4beTdPj=)c?>>3w<3G>8%s=%?u2*#?YND34P-DX; zOG1Wd2d)zg9u|AsKLNBKUdYIGn6HEh}0| z5Id3c^*U$xP5f*peFSl^iU~KKqiT$Y19)sTnq#?+pgYXB< z4NBE|4dztvDbiE*9A}842<0*8fEr}LBT0Pa2mW@1-R#OW_1Mz657EYegvx)y;iY|b zbY&r?ZPfT*8*2bt8!4f{HyjUVovgzB$nKSWu@y#@L(3VO`fJ?hhV%nStz@~laH4YD zjIkHehnt4asU(S}Qdu^-g7aI1s;<*oF3?{i#G?ZaJgm-W_uYN^VJtL~sKyhUU{f$y zjwuzx^WtNJ^aSTIBQ;pfz{0=gBoy-MGkxnKw$Vk_*Dn9?&*C64Wd#(x5Zxd1MnovP zj|zcBpo9VV({16#8Dgs)1HCyDfb?WwGwbOa{W4%VY)RWU_WNg_6I4& zbT%XmBbEqS5k6}RxyHg}%#b5?s$nCM6+>E7D~lYHX4K;fsKRAQ^$|b{9iDVf`B?4( z^^As?J%Ub?w-O(8|46UnoW;l=qS-d*uqGq~PJND-MMIc=jcO{vRQWEpqqd5gWEKEM zG8IYTN)BHGEHxe*7xz`>^rbNzw0*#d2+GXU1saP`6TL(ZEvyO zPcwPy1P7TQeN;2B6KfHCG|2WuSpvJ1a`XP<_Ahh!+V&&kVzMErAzSOBcJ8#`R6us7 zL(Onjllhk+2D`K?Tz3UvP3bk-!5zrQcQns^fk{g?dUx>fQ+XeFCl4w8*9*p5*a{;> zE}GJ8JI0cO%SZW?c`?YS+p55;~f>+Ixu^8EhaWa*+H2;lC${o8#^(-UOF2 zaAGn4N>Hi1yJFS`*dsL8c5wJjSR6SNxpnsdJqO}u`|yCOBZHHK_R#)xFQ9F(z-Fg3 zMO^@;S)?1gET`a4o=M!Idq8DJiQ0`TsGJRo4`^&A55Ec(xF!xH0MQzLxQ1zaJ9^_=G+0abV6(0^;Gs*Q^wV5QK7*JHb1f?KQm++ZQ>O()|}-!MF2%7{l<(as%x2=xWEpjAkhF ze9?85OCambp<(E^?X(S>tJ#%rW8Q88o&fJv8o-eH+|XWaZH{bYbV|&UR^1?^Cq-n% z0dPByJk-g9d{17Wbc^FW0Ce!pkbnie$zqWMxzlL7_KSrDbcc?GE>q<|){Oz6cyaEu zX7PsqJ4k_-gUD%8z!3?@i_83y4|h&2ch4q&rM??OXdDW%$$JgSr#@8dBz7{}dd3eV z3iYu`fV0+T3t@KdG+K;8M^2JFE!2`xYp@DZ=&1HBKeocXOZBAxm-VdpESF4Q78Dmh zW6-{tL{)9FFI1p7dRvrXg+`n5xB!{Mb{ZSYdm7vGd}KE*wO66$#q6Qv|9A^R4jn7v z_$J(~RW_O&$(-3Bw4?Um*fmP1vMW1Vk@^(1B-_))J~%J_KlSRbeEZ&c(#FIqpo{=_ zI`Ov2EMaaW{LfGPd>Y|Uxh%8z=^wwk-xKUQTuX4;f)vVq0D*js5qtBtoijM4b^pzr zBnir%v1V?}hN>+FM{w5kfSxAQ8j9-fia#^Jhv+UkeEBV8umgjdg>q6GVMlN!t4hJe z1o1jZLeDIsq?ksd8MqZaR7__S zT(HkL8GSO$HeNjn1^lyFB?G<+_=$g3KilvRl3@%NAM>tV2UMe41rCgP=3v^_tEK)M zNU1RS7@SDElbR_hgNmUHh_oc{59icisqJx1ZbKgi!g2`%jX=y>!z>hXMdH*cYIk!77q9E>iP!HsfSg;gKrg~5To$W5Xha+5gDwHS06OBkWI7YBLmYW5 zS^6-s3ikN$BrP1A_U8{^hn=HngOkiJ%g?SuP>NcS4E)@m8lDltZY!`35W<_6kAd-6 zay|IK`Fn{a+bKFF>$(rOY*xH@e|$p=8;y3e44xIPu0P8=8zo4$70M!0B-!l_A0c)t zS>9gu58o{`gfMVX^{@jG&DtQ`rZlS#r!gKO^hN-f39Y#M+uC$+5=^VguTIz`M;#X`h(E%p;Cy zNRzFrF`)c>VLoMU_#0YOdymI5Unkt+IT!e3X1pUD;b&nJ%!Fc7a_l97Z~(}(55R-v zwaOTZ1J1}sO8UyUy9ipV-axz8VK0|S%-7I!+lIs91Ql*107MIZ&mx7(?2pqzdpT(m zag*q%?%bAyQD>dC{2ADp-5`PE5>=&}avi1Y?=0|ZAFAst|BWZY6eO3%1Km@_I6?2c zuII1=b4dbm>s0-ajrkDvu6iBSyod<%!8p{1$xCNlPRZR0j|1_Rv5DbhUa6)T!w`@r zvWY#QAS#YsqQdS@1bvTn%+9k-S6rG(3yQ0!Hi7#}I<@UF@X*(JTGmLs5PzpZ3AyDS<^ z9KzbT>@*F^kGlRZbjUh=mayNN&coi#yn8fv^;5aX1r81ixM6_-2FV9VDOCrdc^p+~ z@)8i9{hB=lNhP0`+K-J|}r7^+W6oeQQeCCIEHkU#O`{%i*x6(Lu^IHZ;KrVYm~PbJh1g-KYs zgg>e0*`Uxf(fZv!zIqQG6CfPJw4M*cj`{$$<1DGrACSIefH4PU1qxGp|s&5&kV=MGWfkU`$^h2-3s#}(O zk`>MH6a{=`5EEqJ?M^{mtK$py9MJhFWE}aC2O7b*p{&CN4dQjrXC_vd z`Q6F8J@ZcXWJl`t;OW&5^?;8nxE?heFMne|HlmsXBd-0v^RXlX5I{^2@*lgw%Ey?h z@^Imr~0!be$t2^ z`B>bvghsLS@^bV)qWf5IVnX<_rp|uyH3m_}b1x;0S(d>6>vdnaD`Sqi1}GncUf-jC*rFd7BXcZ_xFp11gY2~*q*e^<#wnsyjGzzJO@@jhK2VlQYQ5qlH8&A5J|j&d;o&xfCHyFClM&z@H{yV!O!hFC zL@}u{m`Nrta$|cTh$}oBVV%)SBfN~~#|+x^!X?btuEiv3-;^jlXw{WV_t`u5URAvJ z`S7L6xZ+MXrN*H~&UC1&ghMHXj773=zWD0vA@KOLA^}lGAT+Yy!KMslyLUIvhxV>> zlnVJ13l)~i?dN)I>XDRT>`vBK321gS%7>5ZA=sw(<_6j-L`c9D7sYqf_}?%OWF4oBMkP$k3T$~=kU`53ip<)^6G zPl!tXX6I_jB<3;^rmQk`H%@7r!it$umw6Hu<9$7`iDPYPc>~W~T5GYx+@qL6taTBz z{l)5zlCZ~f$ZhrR+L`Skyd(@On)ryEj9J$ycIrfO%UUN-76X84YxVsZ7kTLGnDF$@ zE%^McXFl>!Z31+uaFRh1BfsnX6;2vdoF(rw*L>N5-|~^s@3TDZv-dYl%^w}x`&Kue zVPbjWlHs^_Ah?&+v#>oaZIMepH6};xkaX_MF6ov7H?LOEd@hqpkIGvzytnn?k3ZTI z#H6Ds2KW@U@>X#E7MIm^E}~WK#GnuB3gxtcTT2xEDsqGWBoF}RkUGYYvfrE9O7F!u z`E4*8qwVZ?3*a?^DVGFzDK+h4z||;KPwMp;#uG8`cYkCtW2sQ|khkjQx+@AHf%n%5 zN(E?y)1WwF*ebElHtWQW&6s^b04x50S(t2!ep^X!rvC|;yZh7fcaA0hmdE&S_ zI*+50nfOuBsZBaXzm?tE&loMb_-M=kD8y9b0iZ`@ZawfywkHg|mAXL0Ns_PI1ZNss zfKUnT@cKofr=h@@fY5mb!+0bT;EV`-nQO1#1RpOX4@`83LS`GQkEV-^k|#$bAe)LS zm=-9S1VC`239^ZX>&qVreG3es=FZiPx_Y^?Fu9zGl>>$_4y*EILM(^XV-N7KK?> zx(_P*_3FkUV6t%61`^g1&+y^q-*%j~Ior(_TSt~YM97Cv0MVnTb@TBGIPUcJqr3V? z6Ce_LTM>Bg@!;)8E=vXHsZA}p{RH3Q&n5K%AO=o47KxVZtg-bX_<>u&k}cb~N-1vB zE@Ut;fgsaud;xiupx16rxB!q!tUuD0m!aL$9HP*cH;|c4?cQY*4SW85G06t(lhnD7 zl~-)1oUE})&y43%hiIHFL2#S$+h3k3*bl|0Ek+s%W7xq#ry&Q1o2?VWAE|EUKKy>G z#BosdXqlL<_nOup>Ko;qyC=kw>=UUo5t+YAMOkM*Yo#>I?|$=h#9vU${CzpNx&(0i zm#nNd>~s8AtGzWUA1b>!UM&3Of#bfgpP~i>lMK7PiL!OEnI7-jA1w2kgD>a7Nty0s z9dafsCu4)exTq0=^8I`k9P|<-+z22<4}+I%#=Ruuy<`wgqH#Qyk^*^;19u+vhkAW< zFIBRm<+-a)rI>q6!NT2SeQ@;@6qy-JnTn(a{uj;n<^U{Y#$ytd786hRQYP3C5W@P@ z74|m4AOvrpr|6uq#s<{L8M>CiOhzINtMXcw(fbfkj?ZnI$vt|9BGmCFRCj7B>t1LRz7lH;pFbdiIkA<2cW}YFhOuSB$mP>^i>6F=QB-^*6 zz~9na#0(s-m>P(~wBB-}08YRS!Puf4E1veSB6j3KIWE}!qke}NV5Twi6M7Ou(VZk( zbNB$PS(e6#d%K)vs=s&uZb;`SajjZ+4F~IeTp>`^i4s0@vJ_x6+yDs>KB2wCNF=o? z3*H#-(29@tKFc0YCjz@vOa z-bd)_{J0D`QU60e&xXqsst1D2%2V3*AD%|JsPq5=H*4H*gv%xt^R-O5!4u>Tsq6)) z9NE-KgM`O*MfLaC0(F=Q6$UmPEBxIrqvv0D=yxIo-aweQHDL@e@eQp`*8&!2Wg8X& zQNeC-vttQpxLOGJ?S15;b}^I{Ddpnu_srBevwO*AoS8q;!| z^aFmJAlDMI^q<7K3M{&W5>tp(Sp@Sr&bY z!lsl3SYJF$2%4dN-J%o~0M(KMemgo?wgHFGBJV}op++7xX{BODli#VoR$`MOVxswT zo-revR1C%uH2i~bNYRZk_RzhpSQN4CzYFNfN|RVFRiAT;E)9R)prFhImW9r{NjZh{ zb`pU^|6bW|l1aG)%tw#eb1k@hT_5*Hc&7<~9?GYiIEco>kHbaNeZi$aP5Ane-C=|x z1f4iv>Lhi_VUs-cD2&8jvIN-VA8jf8Ik5koaM z1|pit+E;eqjEOrE(=b^;Z_6O+hvY|VFB=0x&t<8BtGV2{RuTAxuR zY0fxznL2z8s5$6Gm*{wm^ATew2qnA@8jG_>V*V2+K=CZW1>xvOikQ%-VLi;=0^R@E zxFRxzW7NYMB1jk(?evRvrfF%}Z}kU#cGkWMZHA53*OUc`Mo~_ivq$IXiVc-KxF@d2 zJ%8T;w=MMc%#!>_-k8vQV+#nzW)r|_|FH>-Zukck=VMc0<}?-j7VFZgNoKJk!J70Y$1c@P$9~O$ z71vv+;1R@io0A^l03PinldqNx=StH|fYmw*ke79)2w@(psATAU$o7`}6Wck;4oZ<~ zxc8uZx(Vt|Kt=UTk`VDKB|QvpaFGazSBQIm<@JXu4%aI#zuAN=h@0{88l9ryY)5ZX zm>!V!Eb=|&E>SXCogHQsXvV>`e3|ZKPPV-QNW#8Iy{=?PCAbyr2Pf?1sVuCVW(d6r z5k`Su=!7NN3LG+lEmrq{m|n+V@q3ciN&uMm`b7Dxb&L*7I6M+HV2I#e)D`dJob`>ADd{qS#E#?oHSL zh8^%zOOb=Q?^)Q0>O|K3?T7B7YR0mJXC_19ofg;AKU`$yC_r2Ku}(tOj%{k*NAh66swQfC&_Yc)=G5lXwU#F(eeZF9)^43hO=?ko8hLi ztuvKIBV9_ZJqRd$P;gl1?p}9kCkUkMjM1&%S`?AQZj_sEvhuVG&As|s4zPvD$2yE= zu=|{4dJq=M=l?A7SBhW8EM7Bg*KGp!!UBgtct7$diANLl-kLv`4d&n-H1FwG+oZ-K z(Nyb-sv^fMAALT$F+gn4F2(0l?4^dk&YD>J?-NK+VqZ<`)fyE`KSFMz(r2um2Kn+H zD_{lgJ@o_3DY~6SBk5`AnA6iVDJRTp-J$|`IEPlf<&d+`DjXADnk(a84=}-Yntte; zBj}tEV%jK-;xd^LN4VzW0x+7Kv+~&N;%%V&r6;NLN!vdlYk6zr zBLX!acz;mSTDB(j#nxv8$xeG)_*Z zEKNwpTE&3R%3B&@CdniPpaYn{iEfb*#tX^FgTjUOUO+;>YgD5YZ;mkgB)Y@dBJV~R zt|Lk2A)Ya`DviPo6rI(Z&$h9#giuCE!a$pt@(N3)pS#60Zw7CidnrfCW{wLr^FA4KS}y7;=sDqn;h-HDofW6e01b;Nm{z%c$cBBwrvzr)IG(&dV4 zMhJwWgW9xUID*%O)>pp@XYQ2{>_ zqFLExaIJcw9)mm1&kf*`8Mne~Sn*JN3Zuqm=Mh!8!iBth1JtavxmB)QPM|-iSCD|U;OD^4>Dx?z0mOi zG{$*tRp<$BOucU0{17tta8H)f{Ql%HuC{Vr9-8m~M4m6jZFllB`HH^lJF#+NVLfX$$ z8n1oXQO8b=m-e9R_78`A=?6~03IEx4`iUz5n<H z(yN9)DRDp(+sdc}zp!Ms6v~^wfjP4hBKcu9??%oU-JK&-d{_N<_q-#GstUM46&uK2 zOm|ID#n3O5773u`aKoKdzgllrQVo2cd)@QwiSrVz`I;*KXpIEc)gejv{)dv@_`+)K zi`Wc{{I;R1p$`s*iLcD~_0HG>W{fy)g(Sk)Vpz-Wp{4PqpTDTGJy2NvOk9a-y+nR{ zA!G=;>3;^4cd=Vk6i1qx7x}-9!ZOf^VHW|R9&#+vtaQs8P;w&d6g`w{o#hNSweP^( z{uvIn9YUGis)}~P0tjON`h)Pm)ug|mBi~-Ao9*ANppd-By7a`cm6>8_mmb6pht)R* zRQA9>yE-Xr0XJ-C6hqLh*RgzzrcSLp6{w3s!28mHoq+L6g99T4`{RdnL(Z7U`@&)cjfbO`L#kSTW>`(Z?LlVU+M41apWvc9bY)8vI`tEHb9jcTU16Ydqo zr7t^zK9ziGDAYx`CsTy+=p3p7#=A~CHOPlsVftH94|h7?oJu&Q{pWMy2|&y|N=UCo zq5!EiD%Qc@fV`Eed!ZUYUQMA`zWe~Q*xrS%|&$>Nx?=J`A;sre#tZv?&?|fN3_H>KSxk2EZ zud)8aI8DP9u=osl0R0GMiy5HRtAtM(e6UbRkt*K5E>r^|9|>exSOOL>N64;@mU%VF zku`pWjfGQjX#awX!q(%Aw-3|HT0yDa+ueU^B7YAmer$3iaBfi@XeJGs@ zi*8n8xLEGhek3)6I1KiDHJFg978CmnQcp@bjn&!>pbIP7QPHMMOi41vU*ik=XhI9> z9FwG&rlx zqH!D%{~t>1-sKq7Mxr->rn^crH~q2p6M?wN`L;Rhf}gF(qcV%0u9P0x;d5!})YTQv zDnJUy+Vi_;hHo24EPg?=NXUg(D=-w%yv$+OxiVc-@5$-EO0QlPdN~L|2_OB%6LmZV z_4o&5w`dsNuLLps45e9YsROcELO%vRl^P!337}N^I58Eo<3qUmJFPd*k0m$6&PAjXKVKM%*c}7%fm0$ zb^@`%`QW{@BBvQZmk@3Wa9z2%$I!e?`2uy&;|(y*+JCCo6aq?UP$98<{3kY*M(GKr zRp4KhI^jJOkEZC5wK`Ej;F&g2)t;QPZhGQdbwu-?O!n+1{QO+KNm3-@dM99vF{wg@?RhK&MN z=}j)L*IlgHfI%UG(86#^$YSBSA7n#Kk5y?x*TJt4c*F_eoFoqNBHCRYh*%yts+lqslzAQTQ#C|RW!e5Fg$Zny;a~23g>LwBm3L4~g%vCY+uF3( z>Br%BXj>{IIVcF&XE)z+12-Fo(2;>h-}YaXYdQu~HTndafouG;M9MSHWzBHG%{f5< ziCW`MJ^ZjmLxBM(;)n{2cu=SE$e=OOqw>L85Dh8UI)x~#|Gb}dlJiRDG`59RGAw=W z_-f;<);44jL2&wip@NCEF1fDIDlV`Yf)8bKW~c84VQr(BQoQ!~jK(QYbv8a)>v8lF z2i+=jj-Y=gY;FkS#@j6SSP9Kq?}O+Fhajxape+;!2B^Qsq^J`!`71K*tC|^2`LhTm z68}&G%iEJWVr7$f6pBet2Y)pmV-YdPj#8~w57-pE3nx%9s1=lx91u{Q++Ke(%p225 zm%iVF(kV)~Eyd9rp>AU8(c1S^u#T8Zrf7jh@}Ie_F~Ookhv{a~IG{0cemIQsO(sq3 zK9nU3p9S{7R}+5&$ioqfxJhg|*@pl72d(LNL0dSK30AK~NO@!G*31?>i?Nvp?D#ai zeaO{}&Z=-GEp+Uq*qM<()mq%qF8Vfm7n?x1<2U3hhFWKK&T6ValYMn+jn?eH>Juat zBD&#R@*{YX@zUX!p`U_FQHph}BWTx@@N$-kz1HsiwAq|xv^1}Ism3hCOgl8j757z% z!aa>@aSwPR-ALQib#CBxL(%GPH9u}uh{arw83=YC=%FAlml!NNei8ev+XYThnDK;_s&XT^&tceuV?gcI*X;5G{mLTT~-|qfhv&KJ>C45z~>W)K$i^X zkd-3QLJ!4i#;}}pyD9M5-hKqm5WuImX`0KHN%xk2=!V$pwf8_O4ZEbMxQQy82-y=e ze=a>g1b9Xll?$i+8lzcX6pwBzy50snf7kMk9Gy!&g4K`xgwYLNME|l^RcZS@J1l~? zK51AWznpwsyt`&9v80*om0cl$3VwN)^HyZ*qO+J^CD4h45OSIRKiWcmA-bcG$60LH z+LY!k80c^yo$E;!tZjj($9=nQBjCrpg>T5X`{Ty5^^)WS7&b(!P5&$VPbwku=)aC1 zAMG*03+Q!g)~n@J;Ss8AeoJcZbS&|0229#0f03`NWikMb)*aIW>_xaQT^-d_JlUMD znn3U(yBv}T_B41_i_D0*JpQWos0&C*?UC$d50D5uGK^wp#e5WRNKhu_QV|F$jUr(e zDp8S-SOSf05|CyXXY#-jueHYA+Cbo(x$Z~h2C8hbUYr7)Caq~TQ4`?!@) zv2&pM@V%)A^c9HEE?U0mD{Q5RS3Xe5^wE`(TPl(8U3t^=)aq8cJbtGKcZ7?T@0EHtB{yc z@0T}dKJG{W(vM2lv>$@Rf-bkKsUX3}X7xPV4QEk=)4StLT2QiBx;pV5k^r4MGH=cO zY+B1``Xw`GdPgvANIfyqRNvez(D#rj$vBYSrqWk&<&9%|L0VB9n9AaRqaKJ%{yLN} z|0Y4j4~GsEsK7W@OP398CEUHPY}i%jV3wN{z?gt%he8e8j8_*<3}vmW8=uBqEo9yx*+kB_m^}ODLsTu@eS3 z>h@4;4iEVLNom2%alb`4=A3oMW>}k^X!*pKbx@;jpYm=$=EK0|2koJ5qox1a%qG`- z(MYbGhy{@-_uO21%2ql5tYzt@;e%i1QJOh!vwXR&B-#Uu)|z8Y5_9e^%pb zxX%0L4nS>%0fILuLs!~f+AUWn?*CE}eO z!#+R(1X&JMWINi5!$kCgOP7yD_NM0^S(|^T4kgqUKad5$;0ef@{{QE%b zSb(;YiuzeIeQ;J<91A=rR0EB;=BLVsmd6u`HJL0h zTLwgM4Nig+oNW?Cmek*Q z5%Yx^4-Z=PVGm+>x8vf+z2dRj1Uo#x41K{b;Q6i%E|0lVd>h(&m<6h=>Z1R_U)vIV zH@{PTFY7sSpTpG)Ukyy?ms9*WQ6isBP!nQk#7pT?Ha*8QT&>}J0yDXolYcT>d0v&; zr}>5Rz=O%90giLPfeGLBSR);TbCHIxX$4!kAB|@Yoc8<8TKq!mXj_*~R9E0?MvMkm zRLR8*5H#0(WbYw(z-Ck`!IT+&v7TKGdSx}63$_0LFrxj{{Rq=j#95w1?1oSV0b%dM z`;}5ulLB`Ac34M|u=nAZCJXGl2P?Nw3(!HgZ<65g8w9(+yKny~XFh&Kp2_(P@6w1u z^+@;Fi}p!WbXX#G?RCOjSrOra;(?2fGFrp5l&vPTk? z%)5)-k|%h=mK5a~+9=m;A)qO;ujTKL#X$cd+YXJOp2lMsDHWDy^zl}M;|;#8hi8!Y z4>97(*)ACGWn~nKcLR{$;YbBP^V6elsPHCaVSzwz%beNh$r{NzS6~t(d;}W1sx4Di z(yG}>kX^%C>u7{7^ge*#ZS58jp}}?u5$sV30*|)v1S}7`sB_@C-7g(!uX( z2q@%a)lx_YIE+^@ywbSJ-nG~lIAz3}VnOt#qN-7E_AS|@)oz@iJG#SKj%v&x2{a@J zh^(HyW2!+k;(=A8DW5WFHz%fpuZ*~Y2cHoGNg#H@wQTra7M7KP3|;3SALEqh8iQjC z9g}a@iR&9;0?%!`=0$#~V zCVu+jE~WY$!qODqN61$ZbT&v0boarH$J^l|DFaQi)8u?T7aE-ATl{_6rLw^;{gL__N^wv-0P^qeuZ83IQ4SrH)nbVDU8o#? zcS=pPZ{1OOqJ2<-QvPU>%r`!DwxsyC9BmqR8)*$cJGK!(&+{G|6Kt!D0|KBHi$LI{ z0XLN044F0ML#*+>VvBIZXTo^Tq_>l_PkmsA)#}r+gQgDjz~_paXC?bXgw>m_KYi~) zLHOYGeA8ZYtlTDPC{Q2&RTq&JG5D>AY|BeQGYVpxaqZf3B0i*$6? zVgIVZ5<Dcm6^5ZFeJ-%){BE?&QcRx%bsbqpOc899{1tHKbI0Ka=9VpPzI){GP9wLz zPO#kaGjxU8jLQU8MhLV@rt@k{wB1dsn)KW9tk(Vk z8IFyu#~c-%+8^9ZCKQ;grw$2U#3gu|oL41h1Z+r6P6&~nZ}A*#XY=EIANNn;min3F zsRmQuGl#^m@G)dej9T;Ax9Fa*MVuS#Slhl-0MZ$DjEaHNDle;a{h8a6b5Wf>QKTH` z$Pg%%y*|Nnxxdz7aOZYtBQB7`XFxDc%rQ~-Nz@GeGd6$P+V#c?-L6Kdvc@D4RnQSd zf#!M9XfV8bqPyX|pF=HHqQW++9V=5hQW{@?Zx!G@LSTKr(GqK%vk3R9Ac(;GQhJ=5S_hR8IZMjD`^~ zA~y}@45~}O8$Cz_obOkVRiZO|Nu?1pP>SD}dSCl#H!&vdMxj)@=c(@qO>k58CVlM% ztLWnU%4(dTcIuaQqEo%?Af_QaWb!~5vDu?>1YMSn3o`Fj4rXc1_uK$D+O=;n@o z0#@LYLWNy$T@id@Q|Ia{TA`;+&#G0UMx@Tv0m)kxB@^7UOQ(myEwC)g27Vt%$?trS zhHP7(V5NznA*a&eKeTutON2K2(*g6X@)30MrCb*x#Ic(C@@w?OU`%^s9>X8& zsA8c91bu)^Fi4o8E@QwSzQ77Ct`pnJG`xnqkhh3?UnKO5*2SGeGNR+IB=brb^XW7} z;EUB9m4CZyzbPt!>Qs+qQ}t>)8C@_?s!qaW8xf4M+D10s`qx))v^mBq9_odGwmuj5 zeF894AkHjKPmAO!-M*eqHY1gS^O9ICY^zN=FJM0o!2dJ3AOdb(r`b}<#%hQa*HG^L zjPM+DKBdn1cznS5T51n+sMe>9Y2EwD8tMOv)STagitPTcy$RQAsL19%i3byV9Dbq; z^2UxJFMW?>Wv$DoF;i)=w)gWGeG6!YoA@yKCvh9GHW_!;5RXN&Y{1N4d+Fn%!7w-XI=z-fe~s4caK~GNA7y6d|~&BN1v-f4+GCNs?@E|!28HQPTIDl zz{oCmWjRl+HGjrZB4}(#0Y`7c9vRFjGZX!vXa$rU`pDS$ZW93TWM>C3Oc!!;Sv8|m zNEspvhd@fEtXw?ZRtH@(W;|M&4|rL~u@`;}$~}c_qD$|2U> z@zkM>7ZX3Rz52Wj_et_NLv@TK;;W%X0>>?*Re*w55I9Za@cgI`3ZCoBfypZv=u2tu zjhfs)Q@1XwH?*at(k?o87G1N(M@QNE-BTS=Ds9cbVzY>T0a__5%^LGj57eS~qX{5?HiMvx ze^7O50GuSgGocTMt?m{Xos_-&sJ$N3RXL%%1A$<_wApb0MHH$%kS8-}d=yx}_wgCk z13s^sIF{lnGk7-q%HpG%(;zrbJIA)yZ;P%H zt`Q`u;+nb`-6jbSa$5La1fU_Fal`Z%6_Q8dF}Y#Hm(4ok61nrnySujLpIfx2hH3wC zCEbcfeOYal{*yyUo~vU$#@RZ&}x z$9D%Xcu!W2+=Pro8kzXH9q*z8X!x|AEiZr7ol7&VwA5^ur^%ZKB6ly9Pdu%+dmqrQ z4SThD3I-fW47Q4Wz}(8ES@c-MD>wzZ(p@d2Nz$#eF(P*bjO9VOAG7Eyf_ z@WwYJyZnK9vYH?rQza#=0cihjgzmcrCM&ei1n5IU38~J#hn7!w57?>kyD@2WKtmcM z%CA3+q>l@KrG)8?Bh?Uzy6OgG$ph>9(uZmrJ$Q}{ZZP_;wr}NWt%7ZPg!RLsmviA3 z^Fh_|#Wd}P%rPR`@Oyj0sN3*toC;&s|B{J-{^CrhEzc8 zcvUtGg(nCy*WFBU04m*7K-x7YDxAHj*p9$2!b2I3x>``iEn1YQR-dA$xq(O`41 zV7$uY9BLp+b-9B^W5zxBJ2#+J`(L(ka8j}8l;x2_z6hjYhc5!}$p)y~DIClWT_8lK z#7V3{<=xD7_1gis5>a&yN8m5^;~Abm500vKli1o6n_jG{KeLR)vZl8q2aILLpl^}3 z6fXKb=|2v>SVDcH0y4@6DBKHqRg0AtvvZ z5`C@h^vN76e)T!Tq{=YI$2*9j8CxE5MI4ErbnN&zEg~8&|4b#vIrueF(QlE0Rh3nFAV7h4$=Bf_n$6M8~@%nPPx4 zpk;e*QN64*m~u!ehhl&S$f9GXbmOPp{@FjALo!f#tuPpH_Bkr#U&1y~`(L(ka8j}8 zl;x2_zIdczhc5!}$p)y~DIClWT_8lKQ%Qy@wi74ez$c>RL2fuiN8lm$;~Abm500vK zli1o6Rgn$DzozIhXBzE)w~NRu{jd*(RdLSPzuVL%G!k!Z_7V>-kXyL2hZQICS&yln z2#^{T`0bS#_akeTRY;vGEm*7hpxGYgr|KX5siQcu)T(pVjke`}9#mmTmRZ1K!p)eYWrgU2UFi zmy~N|dOw=(-nezx!I`Rg_c9n4Z_5$WGOSTCn1!n*>u{?ki#-8Y+LX}gl8l|j?B>}_ zuXWG8tID!|&R0x{2#?{f`!2N)4v_D~2mdg*fx~P7(-xtDz&7OtDK0l<=$r4Nwv}0x zVJ1^5w7!fU+gI8l32m>v74|Y7j(+9}!aA+F@jn{&!OHEm25oZge_zY_Wf7Nl`;l%PmU~!FH2>46Gb^@DC0a9_8ix=k|Ft6~q(tIMnmig*2lO)eO{LH!jOlQN{l_ zgPscbR?lU(qFkw-iur4<@!*R z(RgqlKcHJ^sJcBH}8@ooq(c8G=U>Qi}=P*Z=*r+LyPO(Hspo`!jM z!E~PqV{$t%FT5AmICo%nNKaK`sb% zL?us1&)^c&bh6++MU)45-frlRA^Q$ls)&35?xixBRu=at@2u%8hvkh&Gt+;7nqod+ zV319vsv0sil1s7NP4PR{V9Jnp5f%06vg6CCLC^*Q$zCE_+s0&Z_*RYxvg5!Kj7dYj zPNm}LtcS9%GV-gjiNyNtMouWkO^b56r_sB z;)@fZ9ddWq->|R-P1W{ztz49Zpo>gPsTqM|BpNHBA$9d8!QBWIV%__ahMfD;?0SlD zECe*a6!`F33yGy2b)&_=sWI`Dx@ za&+*I8Ckcx@q#h)<(8hnqC)3??Cl(Gt>w|aj@Gh|I<8jn>U6K^xStziXw-&ZQgR61 z3Bso_PU6vqH|W-ST9rBpoC$%n{w=jHfceCAFu>c@DZp0AZ$t(NCo-@g+LmVIsk^W| zSZACLGynkoJgTnUT+UT}C$favOWab@OBLy}OqTX?D!QhE2Jp28>>Bl zTgcCH%HKJ_G>Jy|E|usMRp|p`@)#dt!DG2HvNQQ!yjD>Fer}8Dp-)_D-IcF)607`h zWU@4Sx(QIx{DUF?qCh=txecNMXFifWN~LXI667O&1H3-6f0!liEsI;i>Xx8c; z``8s`^c$(b6}Hg#Bt0iTEA4R3wU4f+(Ql8c3HNo_eprm?+*k{0aV04RL{_xk#dFbT z{nkMGu27zAk$i71voINj8KxWdoVh8`NbD-%_wOReh52%tl!sE zD5o_KO|w96Ra*}1v&oD_!~3O$V2AmW-5m+Qo!o?IjWroHdjgy=Qat@0RCzuzcED7L z9lYi=_Y1o^8jLHbm(I$BYsKbsb#9(Dh+>`Ht9-Z*d0BjB%TFL=n5DBWL}TfkXv1Q` zdoG(e&b-x#a?g6gtl@?{pzm?c9s_i*UE|xomA;lyBVw7$qqT9n^;N=0kMibHy&p87 z(M}ZV@CAxg^||OLoE47zs+(g4U(#9*Hz)8_{TWLLo4w5OCx^BDopB-Bw>tkAe1z|` z8WnZ6>s0X=S>tc&wvCXaLGVuTm^o0vj8yobd8@_-^gp`lF z2IqDc$sY7QLBF}@apJ{Ktg5`nCguWst{A3vE$xvc*Td)$kFv}FYJBM$6PKWtF?zT9 zzWHnbb+awsRyKsIN}8ZGtq`wq?WwnIr$H@69-Ya!y{&?Ao;4(m`S>|0sni5MnQhV{HxW)JyOAiXF(wr0`?4E}_Eo}z-_(PN z!-Z%r8q(I=qdPAE9woaV7&n zEl3mZ=6LwmQ!nzEhoGS;IL0$PrTFSdxF`DymRhS6ppbT$hx`JGV6?^Dk!}~GvI_Yr z(}c$A=eYqmZiU>0Y`RckC-c&oI8s~+8qf%mg=)1uSAJCrf%VRE9yR#*z&uSZZN>B^ z?~6k>*`srGcHAu&V6@_Q;ExU0p%+r=b*-8RuXASpyVT#7xr={7c1nW!*O< zd9eN1Mt$_3t*m(h{R2-ZSF@1NwDzg++6RYa{fgc$_<>KfA$?`k30U#JjFTS9Fw}x> zV}2!mK#gx#nHDPQAPNElboijAwC9iO+M^!l)sxBh#y#0?aAu2qEKM#u1RjS6IcWaN5=g;Pgg4Nwn|UFB*X!trIJ-y-Ta`r80tJP7?t20`vb;OJi3>{-o(uKt^E*(t?PWMh|JhQ1J>P`G_7<=Lm){vLh zqar>(g3xr(z6D)-(f)gHk=>&VMvsul3<7qCyN%c*?i8+_`~$08=^=ekEgl^d0i<)^UfRiw8H{)Nls!X6DuNvq`17 z3k|M))JU<`q_7}N*EjPsQc1jtRe!p@24&7OLxIRluEY2lAaWMvCo7$o!?B5e^LXTMsLib{-cE2(&f{vm4ljrlqPb4 zLkft?PtAa^@+4;rfDRCy8pN5+U{}76$BKt*0JI96v*$`OLyyp+SR-40C_J&3xt%u< z1Yys{2wumRIw|{qPmFp#YQ4gsJu>0i_vP1#OrV@;@3U$^(tHzyK?NYbX+e#1Od^dj zA;HKANXa>Q>bb-S0_28ZwiN^y2*h!>Err<*Ng4DBf2v4#@)GPXKr4E`jIeUCB2U6i zQ;(zLog{tp>Xa$%?2qm2$gmB-6g{%|R-&yZZA!Rd3zUab2ajlyWsw$ z?XK2>dbCb-biZjM-^}3OccBPA$=UUaIc%nr0n{ebSo9R31vvm#2_ve~<246E2H*5^ z*rEtTYhhcIT;Xo`y(@w-q{x26uTBI~8^s$mhePjCcJ^l$c|i96JcU(!9#twQtKSOw z3yDMzF^2mA3O@_5qJU5+gcE9nSW9{7SITT!M@uq0 zM+LP2jag8E?QCbP(-dfV4Xh#aP@WUSdS>!q3c z>&KxOH`>F^bkW%EK1RNye}JVxG@=pmSv)S^2!lrsv7a5%!h_S(-0X#ej~rTCi>p_( z(1p6KDldHOrus%DMkiH#`_%_+OuVBxV_~97Z%;19xslK6AFWFpoHF|+ueq@8o98t3 zeka3xfNrLArCDwSH$N$)p3|}dT56Q%fw#?}6spY7IR>V-cGac{{gYIY6Dib#B9kLl zBt7m|xQ;mdpk09%hM!k0;zR-XDKI+>+Orehn9&lrEa^}<36 zj5({VMr17=M`_5eJk`D(c|k93?LYz}PQX~|>1UhXd;t{*DtsIj;9;$~=PP|Rp{&1> zI?vPU?lKcdQw1DLPazcm<6Ia{qbpBK9rN_UW4D0QWdjV&xX4XLh#`sy!DHVxw!zb$ zlB37`hPseW!(&#Gto z^6or@2D*6hjiTgI8&diVHytY`EtN&LYx~^YudznF7Gg}PL zon%fGdb~;?=j51Hgyo+%>lGdVfvPm z%!J0-3S@LNB&4{VhURsN0NfH8Fh1SDOK<-v2U-8FVszq}S*eHlbJ-tc;EQ72eYRC; zGB`nF=cW!V*0`BXXVA)&9A5r-BY=r?{^I6CWvAEhL4JEq7@3ncJ$3VkkS^PMf0D*5 z#5gCI;xwTh<|FFvT0wtNx8 z_bj8W;8{svuNB{*+wX7q*P~vI6<;7{pXJa73!|h>D+8rhKQC;P&M=`WB1n}|z_#9J zH)-Xnk@*5Ht5mc2nvD!98ji5YZ@ny^^ow-d+iIq5hS)-flTZ>hgt}#wcq`X^G2C=K zlC$#Be-;&;wmq6c8R98hb*pKLnQb961>56zp%)&nSB-_yqD#rCSqZxUKrf$QXg-uo4={oPrrLZ5bbj;QiIAlnLGS6d%(g=dUleTACf^o z7xbH7p^8kRRqUUXZY!Tv;REzkN?}((S%sZ~{TM$K+dqvBT~;cjzVF=Wn9q`{2niPK zgXuoi{&q_OND(sfLqABG*2z=&J=nPAU(mXxePyD4o5Z5BQjL*Z>$qjC)3tkGtC^zW zNLl4}42jcxM@&Y|b}}6XpJUje*Z2u|W#>jixmqQPeG!!mb0x}9vv8L#mRHHz8iNt4 zpNuIM#EiJLr|z>Hh%PR6dhH(*_1Icc@V%6kBvard=uFxX! zA(MKr)GvYL=hhe^o`IBdPM5v6scbPX+$2UqP65$qnpy+F6)gy0spM#9wH$}1<5Lpj z#CiSE^((TN_FSfKq}iTy-4Pt>l|cMT(}D(aGq}f@tsB1BM#4o)RzjATnv^ zO`tgZ41h!AP`qG0Y&z?h^4|Ijc|yIIeQ)0e9*Sr?hLs{N`$&0>Is(e~^gd&@e3gK( z!h0N|De;H0S0p~HQVcTxW`i@en{{_gsc?+;2Pr(q?Q~-qMr%tuo=I>M7LS78OzlOu zWuC%>FeiRIciYqA7t}aYG=tqm3-v5+I(r%?PNIFe06-lw)rV!k>$><-H-b)d%PCQ% z&o#9sfGl@oF*J8@xgKYVJro8W_-6X>-_QHlqlAXz-!{Foi@r~2+;E=As8N4X3)-L0 z9W}Zn>sT-ul|exQc%(fWKq^y;lo(gZF(4V;uPPra+vL0sf)B!KOD~^X_Xa1SNYH#Z?r6gB;o%;a9{q+xj0J>Cf%BgwuU#ckvOByTwUk1j~jtEK5ooh?w);n`^SrNo^ z-i;)HNmAeYJJ%BV7onhQA{%R^n5V4Q4{&f!*GdI%`BIg_vo9iF2cT3a{F(d2c0#vn zFcKB6hHJ$(vR&X`JwxqbjGDqReV=gXpVI6Rxcl5XMzXLc|NW8`YJxqD{h^FWg41wP zhQ4AuIfyO=i5ckjO1UMCkC6&qR!!Tx7r)=e@vqa((|BY_iJe6|K7*c9j((x_aezFZ z+ovIS2F?BR&fh)*y!A+zmQ$xVQ>$3(s4ay;-V_j1G@0&HUI`ppKO?-?KUnqOy3c-MY( zSfr-dt{;Vc#9}86AXi3>gxOEX@>l>mux!>8?3fg@QJuw9sA0^rnNmVrrLob>Zs_Pl znGu=T8gOThA#SD(XIuzazUfBw(hus-+`J0=ZZ3FX(Dgxd1o7yHP}jzO_iiDLXMF;?J}Rp@pKSea&h`au&jdXiI|9+# zC;+Uj#lLfYH*wrks{r47a%=J3NpX2m-UL`GMo&U=^kKZ5{Rc;EGT**f$fbjnnV8e~ zr0Nw*7NlSS$`4tiIh}H@}JS4PH$z<0pV)u>kiGdm-VFSlHgf=ug^3oLV!?fcY>({b08pNmgzatd z;P1xp2GeumPwH09VlcRzA~W^SYK=p$#{*5Hp@KqE_f4+Zv2AFG2}f{nq66em`!n(Y z728Zcj{iA1J_tH_QMRiy}4;Q2+N6 z;H}Vxy!Mr-6tmj12iyZetm1x7W1h2%Ju*eJBXj0M^IeKG8|-+{Xovrg@36rg#P68W z+vg}6n0C++`zkvppL@j~m>atWHaa5ZT$5sBgie%uw4^Y_t;)H907QW1W~9HP^U9@ zP*E`^!c#a*N07Gv#ea;U(=`dL9)P7ftuS<%gdV$Jn@O+U4MFqF`uk(62Cexe1R^F< zyW53WtKM$zp33-1qVT8`9=Jh{xIxX}Lqn3V5g*{#SnUnM&%(q~1Z1wJT#c}n5O=*p z3ESYWg%p*sNyi*z=9s?mHMt!rNJ-8p{J(ISE6$0_Dsc8H5L#PwGU*ds(pJvJHL7OTTYl$weLKpt)O{5gJ^cB_Q0HdV zUx&~i`W>%6JwGxE*rfv@ywjZHIs7DCX!CURp20yB+c~BDsjBUu!=Vh) z9eVgOu8hD?lpSQZ`(qCS`s`O|vqJhSfex&Bn|h1fqAXBIPdBQ997)FYVbH%N6(nU4 zj)zScX5R%b2h09+X`c&+roy2RG9?v=re{JZ(sE&AJ^_1ro7`m%@@f-!W%c+R=L^Yz zy^ltDI9tGI9!sohwwpfyuP{syo{w$Y&#`UWwr$(C zZQHhO+qUh~w@p7ZP1-*&n@RRgW@qoYCjNz4;X`hdynQWZolY0XXm?l}&dd{}*9tq- z==G}iZNQE7>oYu&ivQu;aD*tju1Djfk06N<*RP((cpqV zz8{c{d~%?3#aSavJz1cht|m&i+iSCZfH5Z01`F|JSc*`fk>C`7d#VFvp;6SYv?&2Z;$18=kjlelA(rQZy|;! zKU^%(pAsQW3RIxtDmO_i)*H8`Ln#?&H3R}v_2QT@=8~?K?TMng7+5-#i|L$RP^A86 zvQG%dV0zR?ra*LBr-hq(9*Vj}Qv{7vdrjWg7tix&WOe=j`6DBp30E5)GUu+-9QzN92>8q(C1Vp4HtpP^ecapNv^IUxG@Hxod zixAe!d9xsSvwzQYo2;RK>DfuK;>{dDPgKy1p|h}3oqqG99XWtI{ioMmQKCvXIm)SM zj}-p%Wf>kw7?J}{vpg@%Ncv)RJT->No8XbGMa%k`%mB|9HdO%|R+e|cxTy+lbp?-S z%C$@+>fhsX(`>OAVyO+qhEEw{kF+}Rh zI~%k1tAs1FQ#SMOanxv8yr0l5C{dOgBScz0vI$6V9Y$c<1Hk(V?R`#SWI!Wf6fS8W9QHT;B=+d`r=}Ek*N6?FPH3?7Orckhh@lH#T(HLha(n{)O9NE zgx+~XP_ClZq82}*-p|W<2G(j$o&Y$ze7DIL|aFW@$?HrQu3Z1%S5j4-ZBkH(Xy-)T$8r+12J4>MCBEccPOM zq^T*pwN(SK29Q4(RasX`Ew1?x^ATHD{P*yd-|!5m>neu1nc=Kc4fHtLVTYe@QLAYVb(%)y1q^Us;WjWV5>Fd!mH9 z?1(p@_L8n96;nkd?I4Jk42k7J5VBa2$DlBDsFY}JI8Ht4rJ}6J@xK904y;SPzU-(i zGr^Uh^+RSrPG&qC)2mMP9T`Uv`t%XU%2nEsAWhba6?}M*WRc}#1qq`eQK3V;WX~^i zpPi~LLPpt^O&xakE2n_f9+hV??%1Co0jCn@n^O{eQ{gdi3-4T)+Kh;WXgeVok1|FI zCErY|wZ4tNWpXa$yTjM2-4ZvZ{(o*#@ha z>INVH27jslKyct)?U+odPWDv(8)#TAu;3CAcKnc2!LtJ!A+4K# zW23RCr_Y3Fg%`j#Eno1_=BkO2UfYX{!~|)Om}x$I4H{BIGY6>&6Q0sXN-1Du-*w}6 zVT#}9=c-Gc9T`{nvPNncx< z&?*%eCI5jM7Y=m@_2|ZPd3M;8HS2FtKOVG1YJRj&igQJ14ZX}e&uWmP$0EuhymMqk z?f^J5zo9GBcjBq7C}I1@7l2PFm+-&oyETd~bjCwwR}r;(Dhagl55y))^eWe##?QIJ zgq$hGdTl)2qn_K?ZG^L^Z~^s0&|$eC#-g$+K!in>Uap~tqFi`>i;@Luz`$1!W2&le zuL#zwX$`cB>nKQ0rn>Ilv6P?Me)~XaYIQ>Dx*8=D6g3OZa}A^aBLl+NPENLDc!DKn zT9C5Pyn9Ut&2rH&6d7Xb_-hfNkY;r^ig@I)N^2^Q$j1_INV*YnAM<;$Sfo7*@nFjh z{({VX5_Gu%Yns+|^)wvW!G`GL@`yVS@9xO5t)E>fSR*`*Omu=(JSBGuKu8R7geiW>TY(x;*m0AJd38FTnb zRg#+GBr2zwInM0p<~a} zZ%d?-|5)%p1+WXr^a!ESJDLtmy3|dd# zm?~xQdU=R-6j+)MtmwpKsqRDJR0B;np%M=hVv`STMy(@nFr8folo}t^LY-zA<(W zW3Aky1r-QEtk34 z=$7c79K_I^_MuC8zTIUG*Ly3`ZR%e1PJ(G(s?_u&+Xh>uW&cg|H2m)9s?m-*+0Rg(P2&U;?$ zQ3vVyZ>FSLc4$F-mPdSCo^??$&(B;4k)>2C}XM}}(yaJhVGuaZgoNhVu<>>YD6o9diP0?@n z^k*dmNyE=Ftb4fY;s`ikpx9LLCV_WS=7L#eu0T?-ZAC3TyViqp=f9M*SldGS5AWcS z_(cmJdq&qz1mBYG1bESaFv~dkPU{I_43CsXT-UD{a`Q_spuYXONEh{I!VjWe=w6cc zjv)X8s3`Vt*Ha`k+r3$*f;;d!p8UOsvAQ^#;kd+4*e6xx?*B%Uxe{jSJ?@vMZqLbu z7v9R??8rTf9pe&0f`pUU{~}54z&O#cYrt7%Z-eW-xngY-*ue8i)7iz-ZD5^-gv9U> zlpj!Mu77JFw-LV5kw9LzaMaodzh^-AAl!cE8jK?`i^eKzw(FXrr8#PUYKA+D0%$a| z9F+HhH}4z_^|mjH7-Es0D8$MESHN!4NJ!z45}E=Zk(M!V05KCexS(%N+R1Xxr%Lb% zsg1lZCCa;Dj!XZ$7pxWa)HgVx{{qM00Y}D00Ul5N&Zx$X!}_b(fr!dvWCCSE`th?K zn0e(UErzvV{mPN-CyFs|WDE4``-*}>`bFDlUbOSDJl0`pt(o9oq&vBJ^wo8j^HZz_ zDMUW92woiHi+9?=G#ebV=OFxhS{yfEZeMQ#vb5{7I^^-p>o;SYd3j;z^5|R#4q;B` zFi_F($JD?ovLoWv0e$f3yY+E$Yxl8dvI`w{a~=Qd``3Lc5?0v}`HQNlZL+-p+NF1_ zS~VcojVGH-mBy6IfcGT+SUhz?aM)6ExCL)_Tyg=TEUXa~u&A=;*Fj$8~!9P6$Cj+xt_I=QL$3I13ar-6- zzIpim5T+oXvi?itcJenEQ?U4Ia4L>nuK9%OF4OVM)O? zdPE?Rox(4F+hR3LV84t3$KDn7vjr7Qdg*=X41;K8(MJEJ7MIf*p4(lHv{8qY?$2w5 zFl+-r{IcLta0A*aj?gol0^1Hnu_Zelcnw_GGx~-!;Z3i!*#Tlse4R&#t6Z(6BwhKA zCgb#$iS=#jwNaEIbN7K>Yzlz%DsBWd&MOa*sAp{Y3YD) z{Ws`*`O}>QqWbte`0=x4G)l5ia_M7H+>l68gqYt9HY@8P9`t*bSEuM@@UW_y>k6#| zfux-t!HgWY$T6n}eszk6eN#pe24Zu`F&celz~atDVy|)0=YqSlUZZRqqs^~y5a(%@rT=9O;RhcVs&^b88Ptr_7k9=rv`igG zB?DcniLC;_lGf@FM~^)V5ZK47dPCio9t@?C43?+KF7g$7ZwM3Okp*`^n*X2qLO`T) zF1!Qbct;0@!+B|@D;aonih>?t+pTxQ=J=@QF(o^jy6=44vUU-i2;H5Z4#6A>~4`x zmY*4ylvt7nA9@W{fXjh>r4Df|6xl0L5r*x>!BRP53|l&4N_w$wV6YGTh}|F-2wFmk z0cYpay%-g=#w)a6Vjov)9-Qjog0ZA4_3jjwcF6VO$4fp)QGT7^)DrwQ#;Xd$U|{NG z%9(1Cn=$2SmI{^lH5#W|C79Q408dNXbV=Z;VO8%?-4WAHS+u{-e70Ymdi7v^KN8hri$p&uc|wo8G6Y%hE9a%7b}s z*A1X4M+B5X_~VNs_~^h7^Po)W-mKm9YW?(aZC81%qH|0Y;vYP^I;5Wjd$nK+^c4FHCH@s}>x9qS4}lFs)@W-YN8uN#ePo z6=T%bB;**D%hjT}vM6l?nk_y?7sRT!eKOFOKB_kgWOar0#zwm5)21`IUC{^Pcj$@7 zFbs8m92#*>k9}3U_viQ&=#^=RC!AcHK;9@}9DbaPcr#ItGk6#&h|PVpH94*{{=@2% z8S>8{eY@S$S}T4qU20-EQTHGM{^H#p0d4DgZOc5pf4{x&(@ZTxa7yOgo3x~=%EDU< zn$F^ZBdpi=xD|rRt506K7rjEpcXp9YKIR zEJLr%#M(_7t-Qa2fTb$jRxaVudoCPLlAz)x%Q>+%5*DM23kRU6hprB7wM61hkoZ=) zyt59!r@N5@VzT4)pUJ_O#~cU|SjBo~M$wJ=8!e1RA`NrY0qBnd@|VRi3&kd848oYJ z!#oOopqvoGm&!4*#YY}EhUB!%vM43fyno)$-(W>d)_X~V%>=q0-$7$J;w}6h zPV1%ve#T$lRl!s|e8wb#=lb=>FOHQ;S3rOvMNz2Z!h>8}F*}i9{q~!r4pca$l1PE? zjNI^UR8qK4_)MOAA!E7+D5}LWWz9%0XB2P+V+*Nkk^Hur3YOUQX;v%A?k>ECAZ@-r zPi=EZv8l=4^L0pApdBEUvP`d zOZ7=c{5wkuXkco-N*a8-)j)2O3sac-?$R(hwfHCOle`dz{u*NlJSs@v`t3m*X(RBR z7KL$^b*-})`qSu@Rxv78%dZ~!ZvFkD7&RtGj71c4hT102U*EXrC z(l*w5qKA1ys`F`|{1$QL>2HmNMG7uiQMpLMtE=-3#jh-ia#9~}?w5WLt2}BfMu`38 z)20@G@RCN)>qWp$k-BTkhI<>h$hzxxjr5^=tAfwF^Ga)h8e+W)Ln6< zBpq2)+`d}CzaFZxvV;4b&3+;9=K%AQ#DAYEoTN=58c}=ZxLIr*ma0BeY~maD1Ib?J z>D-jE;^BITr*)UV!n;+B(^z4DsBi*g-`+_|A`q`M^X%cB^9NGTG0(~irXy+;`tn*? z;CO<5)7l z++nI0<%(T^bU)kz6N}DpG(|`4^@p;{0Bb0qe3sH&8WRk97ga456bSaJbqHbUI_N=O zwq;Lhmpq=k2GxZB6ZE@^A@OdV)ll&sPXchzsR5R!2<@gdat>t(L&CruH4EP@czo;q z*?k*&8-q-7jCw>*nDMeH)svF0j7ETI-K=;q_<6PM`k3w6r<-<+Zn_aM+VRRPQmn!4 zkIZk6ctCeIw(K=qn^e5^zQjtfkE{A(D$BdYc=LO)>;vvF2d7~uK1`h}ZN@fpTR|F| z%4gtudaE_$wz=Tk_6%c=|4QPpsO-Dw_Vi{4FZ#Z#%gRs)JhS zl61jl|7Izsj}_@NQ{TX-%(tr9s8CT{P5p~F5%oFDG29kqav<7fhke>b*ior5-XCHm zrF^TX9n%9Jl|DV=Ndu9O!fP0YA{UWzYUX^JSwE=lDXrm4UfWd#c`~T zz6Ys^qX~chRmjuOn)U3%nUdxoqAij2FC)~NuvsoWKfa~pX*}KWa$Oif=D!^dAYWf> zlvz(iXhx+qFIBr6B^;VoV#eR4BM7SDSe{_GunJIV(-^6;@-$_am(yJH-cq%2%gI~R z4$I7UTH4KeKERrW%0kM!j2stb{*8xUl;$TiTWAS^n!yzfi|&(-Fgv@atHckZXA=Tm z%z_vu%rec_8892azTWT7)R%VQWb4>XyqbmCN$mgt$>Vm+9xX?~l+Qq(tkpos;J~W2 zA!NN{du7R_8GEf`DqU1k``$Z(Fx{;MAq1Q+I6ZM;-g{SBW&t#m-D+c8u{3t9(yI&O zyn5>sv}5n?`}Ci6`@Fc>zMSD2Z?8~D{hYkz2*7+h<%=%D)VEeVoAK~Q?96WBJYrg8 zTSWUI>Jg7peOJljvBSw(wKz!-VhOWVBnl{xv|;{6n>X63_C-29@Gb=>JPP=C0mJC* z2T)B0=ithKECk@Q-O^M$~5%0q}8!pHfK?ZsI5tVp%wH; zQ8>>sAo)M~>u2yjr=!(z3I%j{w3=opGv8e=gU`Z6$O5`3Nf;P?kM*>s3)rEigxu3e z;4C$9ASc$u-~0Vk*ds|ySm7p%kqX#^TO4e8N)dK&7x+I2$mHR;Id%h>PhG6 zF%T!|qOEz?yjG{SeiQ>L@{uD>JZ`~_%jM7KkoC-O@%d#>@gj3lhv1@>x*@u>h;r#b z0Hq|LoYex)5wN%mK&I!sxb~3c0(>@r$y?@b3NxV9kEA^8nPOYjh06ou>D~0gykaoy z-Fk4iWC}#;{)-@s0LV}X1XiN@0(fvr$NwI=W}+AafH#1f$^2j8CPRk^>QfQZVLye$ zKFu$p;T24DAVOy%HJhm;`Bsi(a zMlIpBD09L2g0HCErd=Bm@Vh_HY0E}`2%wJssAZ&M&@e{jf0&4P_pt}c(Q7YI|J8Pi z42=9d(aEo)o-3K^yzo32M{>eA4tpyy34i6bZS+mW)&19pO;)V@ea3IQ>NSoCr(ZNc z7r-e<@oxzm#OQ1U+@tk_$E5=AJ(IrdB62EMlx|Term8FHq$deE4<~g z-2ZXG8rJQ={C(TS^kaiX3e~<3+HNj$+Yb!kr{udCquRSBk(6^18ll7Ij2( z1{8D8{BiGTBW0d1@I1+d*)N&t-}LO+Q}q#`EWYAg{M;VWeT}@uAR4!0$5s~rh9@;Y zClC^*jPkXuc*kV#9XH5QNVVneVb|XYMhVXgOn}zY7U^Wcvrq!W#|><`hfLZ>Gy075 zLgyC`Hdegg7kjJ?!Jo4ZoyaW`T?K9mM!rMqtJpy;c0SKQBx`Ntybj6AhY$oJ1LUEh zkqULhw7O0JTR6`>#AfiJX)l!0FhtW8b}hivfofW1n&7ZFj)W^83FhMbBIGkRC*?2% zwZAKXhvq!m60M1K$bTXjw&Fydt9yfar64-BHhGFGSl1vq?#7vEU%QevFmi6>sa^f3^G$*+asWi5bor@854Pr7T|l zSC(z2XCb%kvz^p@=UxRrfN&~P&N%k@flb$#ZvLzu8uQrPWyCtb=FP1M-5R{CUkxnw zXxWX|6zncD86l%oohpZ}wN$jGV?Sr=ODHrBV(rPXa127xJ9#E`VD;GrR+^1})1@|enz#sY#RGv$(AO#(4ROTUgl(cbMCYf3tj9?kK1X~4^ zWt4~pw*dpp8&LAXD&LXcj%mNYY>agc2A(Fb4HCZtKr!%wiBGq%^l&Jey;c59o zNGqfwkmGlsc@kpob1bRcgs96nhvJfGVBh7}Dj|!wntJ1as;jR&9Xx{7XM_NHWI6NP zMo%=E9}{GQD}dLWQjPZFXdd2aMLcS*G(z69Xg96AGU>Qy1%((5s5<&23fsN$SWa0- zokygyY4-ese1Y{K2q1uK5d&Qj9bwYVzg1;wVEy&G z+87-YLk)1~i*K2Y=n#q{EH7KvO4OErU14U-$rT}woK3cJr+$KVG*|Z~Aslq+lbMmA zMflKb6MSZ(TBS^(P6MK?{JVFHXu7E4Y98d0#S~goS3~0Ww1(Oh7pJEv2$+9@(&siZ zH&KBR`OvJh#E?xRe;g+bxME97Qbl=Tzu-5!s+O$V_oLo`7h`eUKitZLPSNY=2 zD|qoD87kcd5$*-8n=-0CE3zSUhVk4F&O%;Uiw-D(54*{|&~8G5V^+hZPckf0xlyI% zf{a;%8y_qT`N^iiksV6<2!m#sUzYOzV6>8&gCV*pyqlJq`I<^+5_~clyZgz%iKTi) zeofZR{WD8jsd8d&y+HqNt9Qao^aj+ewSL;duGrCk6t~0^Xy;CfajJbH zvk@$qvc#+|&jl?zpuyPEaKnFsqUP;8BzV0(ny*Zr!9R47U zh;`(CADm_e5?n`Uov4(0G|SPKnZ0O!fBX&_NYRRWU_w5{qzJUpLz}E_IX6rMr=H06 z*HX8v^5)OpTXuZ#VrKL7*1Y078_zw&r|tRa2dF{eLnR}i4zB=Nvt@}u9_~e&p|o=a z+*K4RxgG!;u0~r_7+Zq7w{_)IQ1lY$tslxETL^rL8DsMJ`I;ybC>qdF{Lc_b_vfja zd|Qq8BS_agq)TZyf7$3aQ{74)TCC5)`ExoP9^9iGAUi~#%_`eg-70+I0AfQW%*#8- zAp~iI5OsuT+p-_=9gkeSu08G&hvF4x+lW>0n>%X5hRXFtF<~uUa#1tyE&dR8X28GU zxY;{Uf1n7iwnsam47O-RHL0?}ysaZ-W@H^wwBoo^N68q@q52#CGUtzBs%CJE$C{_> z=W_O6Z5E)R&MKW{0@ZA7eAho_3^c#F!XM?pmUMxYZ%FLsH6~;L>vy=>^zf^POyX&y z(7Aurjno=&jdxJA{gs3kBbVivCH+gD4$nmAM=IMfN=7`ccQ=t?ajEt6evpBpyKI!? zhqfz=-TV60%%1Rm&VJ!UwM4k)3b}qu?v$RyUEH_^(eex*<=8gI%{n}(fnYuSO%}B> zzo)@cAeMZ0GZ!yB&b(EE7+#~g;x7()td1v%5THM2GZ+_AS_R$=&i}}9WYVeH=zrWo zUm}tBec)gbIysn9bD<>TQlRMa$A__qdT%dN-LZEZL&!J+qc>7OZz!= zJ;tdHWgX&`LQ9yhL$2IcUJ(ln-+-7nbrPihK(q8v9YM>|x}2&j(ZD(Ydp*BEQu2{Jd30K z<1!J9?r)@@dlcNeW+w6`V zy)~5r2!tx1ih~sLtAwelrFK-7bshVnx!bF@R9F4wfpT(b>LtG+)&BL|RrtDORp?Ac z$=nWQZ~YzaeX&fNqR%2HdaT*t>$<`bj?KYAoT^tD{F^9to9vav2Bh>T@@JSl99gWH zM4Q4=L@sJiy+?H6^$2>6Htbw-+vpva&S3kSf8S zcOT7!5U%EHqq;i6WTEkZg|F4-mozcIdyVw&uR=2x+ygJQx=u_Y@qUzSo%Ovl|?J{qHonLtVixLbM+7G zVzGuH9zoRy+P0qmK|!o3$(V7yRygy8HNUUv?ckQ=^^wqJ)k(;;pg#OS1nZa zBRG%I(5tgb%vFn6A}NrYfv78gd?Z~#2#Z@}Fe_0k|L>n9DrMi^nR_^6oIeeq*$U$% zK8@SLklqSk@)k#TazXT^Bbj?CA|zwf0QstXysw>6dnVRzvV9|AnGd&lI|7*z>1%W2 z)n4SLox;5O@d_*KMe2Quvf4IK zQlt7X#7Y}A*-dK?N;y|4` ztK9Fr9hewGfj-}L#%XJP8)gfK)BE>!>r}OK`NL^40N)L(z+c*TP2S`X9Pb<~Y{vtf zJNoAa&d3^RFuBxS#fj2XT$J>N1X7u;0L|>6z<_+b2&~9mnAwRn37lMOn2XKJ*w_aNmcspD@t?`V{+2LI#~Sp`zjBdz$aH7f*0-m5*sh^18P58Bb-$s8cG1(s-o{*!B=M4g<8}<;K6&{{_`Hyzl9C@2_{kGoR@IG%*!@VcHkfh zY;jpGa$gfM0yB6q)E^pA7(hk%mn_$GCtMcEsX6z@#+7C7^-0eA4R8%Hz+F>@YE{W$ z$1nu$vgV=zi@<%sV9heM2Bs*Nf3nyv-d=-0#Cie&T~*38SE)?q0?eDDUqN{Bm-BF+ zI3&d?)2dx0!=+*(en>q2J4u=d<%AeRt!$f4uU0s4w^MOWV+nFIm6b6pT6uL`WiDa| zLT=QTs_3<5vfZ-<*INT$s>w&8E?q3Xeo`0XlI6;PBDJml&DF@VUwY2hRQ8dQV?$V3 zm#*;h_-~#%#}jrrhabo!t8$jWW_wm=3VF0aJgLHpDA~^821614M!goczp8=XHc-zn zAEN7}9OOR-D*Y^pr3;7&!4Pe2Wo^B0>a+m%he8}eVd}2RWsyeZ;g_PdC~Rc+mb>HA zw2-B=sD4Y@h|utgJzHE?iPgiO)y<%ppfNokP&kkqiotAaHS7;26q zHpT@SU4iZCH%jr>4G@uXX~Epk29cZ2JTq*f5>zr6j#W@VN6HN}e&;!(=9cSyl@Tz8 z?x_Ey7FKT7q~lNEH$KtoPUY;0X=cPaW>Iz}ff}kQ$1=!{<4Ox#lUB2D#C{&x3?IemBIS^8mv)?Xly9+)W3tzJaa~nd%AHK z69R@)kVK@4gExOsti+cyU8;a*RDh?}e{Q!X;!!7#=qPM@7(c0_2^y(mjgetjzvbwB zvob^59(=UtPIS7m3ww6xIRGL6~ye3boWJG8Jx@g-HIb^ENcm0FCsY10*J}VUv*yG zeO2?%?5J!UBZG1(P7fsET1qkA;eFS3y`Na8{LRK>lci*UAEFt)@Sr6`$5)(fG$|1V zlDTEEQ%ByejrqH-`l`4#D0$u~ORS^v1PdRU z^=hxk;``Jc1M23dTfe9a(pzp6Du1;sF!Gw6 ztr$b&KBAx8Q>~c8pudG;nuthO{NTiTG$~1ovrky{eh7sbSDAiUX5X~f8Sa%ybsd75 z(i!T6Z1XIs9FO;l!S`U|l}#b+!|?UM8fM~vfi&^~lGFyTqq^ub3$Q=8#}n&s)Nh&U zw$GCjA=`CTjrc(!F3N5j0p=50=r|Ef)c+3R;^$-19}&Yi?dhfDHn9+7Uymf@u55<- zCPVXf4f<))UI_Yby%$+PA*swO4Wd=dmpxCJ^kY}(o24P6u@1UrDEoI={-6Mtr0w|V zeMYn1o@m_Thpj$w9%9Er%}zD@ZTQR=y${b+kHC{gUAa8w50QmfrzRhU%mB_-(?F{u z?iYFIvGwNnp&Vg;v_^HIMT*6w+uaysJc(+h)yt0!eJk*v!?|<%c+QieowX&*Njnn7 zr$$mFd!b<~s)yuezB*42{M<*yxGXN6b9g8*T}uIvhc-Zn3CzG>dsoa?VImzO^M1s6 z3rB!oQw!JOUGCLXpe6O+y?hJPSo4LlnP97ZN>%n`EqUBZOyaHaGds*vT|j|`b(kE% zi!?=uLT~>q1(0JyDB^Pso5(Lol0v4lKtJER>D4iFHSM=6i7KZjG$zFR8Tal_5w3&g zaUz;vVbXMkoLSn!7?3_>U&kEd#KGcivCoZW)Hpw>EK_sXdjS zQu=_bxy-DK;F$^2!i=KoWR!VoAwPWrRTwG){;sF^B+HmmTr}WgBU|-R&bQ-s!d0FHZRs?9l)Fyj?h2dbc$<hA~Mi0xMtT z2+C1r&&TZgXOVUJL|hY(4Hl6Yq@*blP9(Dl992=XFRIy?YYR?%`Dy~fDo}v5gsf0s zhn}ckH5;8VS!95De_a40YSQO|mCePFu?W3ap_cJlorAybH#wr;5Fj7vQKpXJ1`P%_ zZ5^GN*?5uEcsR@d0I(_vUouD2jhnbxk=DQwGvHJ}T_Vf-*!;JIZ`ZTB5BKvjeucu+Pnrgj{wIcO3|D%@%WPXz(-n z@3eO$xgNC!bQp;4t)#918$aH9OZx>gaa5cTUb4(ti!bBXd#M`a86^hyFlGLx`>n(T zLMQ_0%LL>6=?wH(FNHd$OBZ{xbP>xrWCt7OQ0iZyqtO1Ku+Wr$wee^Nja%3@HR-uc z%g)c=jt$gd;VJWM_cItoTqRkJ0IPLCHCVUU$F${3#VeK&c-;AaVKc5m0`Ssn>&;YG zPEBS(vwl5vgq94%)uYL8;7E$Uqv*%qlp~?HRoazaL6mk~ySGs6^ADZc{0XDNO>_PR zA_6TrrQi@-E@>Z;{XNKQgu;35lF=OBNbMh9;(lej$d?EggWKFE5Cx-DR81xW(Xaqb z1$vBt8u|`ns5XdcjtjJ+`j5spe2PcAukHo(@r6LOlax>{y#4iddC77)6KlH_m1KWK z&F|E?2|vTHM?vh~@3-ipkouBmbHW?hq_g-Hud|sh=By>mG2h~qHG*y)H2E~#Y(d1` zs$uNArRrDDyD__ z^j^naocncme<|<2idSe5Lk? zxV{)YiAJ90Bb%UN{v{pYkDl-@S~=iONZPbe`?z2{E7!xti^>~Z5L$o+V-dF&sjd|TNPwp{4o)aIPQ?1@X(b*-KD1fQU#gPn zh@Rv7py--KY0mrh6_S*6qd^pKW{e?lIzZ}_&iikdkT?4fK|cs@tEXd1G3X%K7%W3booXjGibD33Ff>Zic zqz{9(Pc}mdkmp*YgRpUcIWEp^R}!{!-ImM|C?hE%-3$(%u(B2-FWD3)pGdB3iNaJb zXnehc26(Vz%(d`V^{E5;v-ev9%JKzc279%FKe1|Pr!m-uo{_CRf2D^sOJcP~cZ1#o zIkNUFm)dAPUL0VG!;e*LI7zwJG%Btfk?l`DhZ(o-JnN&s@b77; z@LEg6*G`viWyNz)0?c!>3~z`&YPHmErX_ViyZLssO?T^+eedmhcjnc=F?&;aA|Fq4 ztNF~?lufi0`linTZfuk-;2f6xP|>tiE&X$o6}9t~1TAs|d>###-?d0ONl7kbafSE= z&?PpMJJrF8QiuN!aH7cqv>38FSH^R~ma|d>cT{nFly>yA%|-ERl~vbxe9qCfcG9#J zsWNpNf;$yw`BmX#g-;%fUX#@vQ=pj_Li%`*D^F3hV96gL`I?LkSt z64drXa!WT>BD&7K;d+E-JTj)~S2c0k+HSrBHAw!LI6@=Y>u86McwtxbHr#2Il-yHj zq%4n@Ecn-pr*z4Sm<$XzZ}OBK+VdTOvt#wsBN9Ln*}j?E{H_VB3bKy_<$k!6v`jI03nscD{a$5=z6^kdvPKw#*6z+m9>F>^URT0kB zmG*AV?i1sWbsI_yQvpgdbC*e1B80EovnZTxIme~7!Rz0FEZnh%s1`mppH72s*MvPL z%K&i*L?@nYU5d&~HLVY>;-m1i+clXi-5GtZEu5ri`1LTndmsH{FE5KI0prB(gs#NL zfMNSmQ+k;5**2QtEN%=lH~=vTU=0Ij+VpbX)LG_i_FpahU4W%xh>^9)s?kmX9W=JI zRD9*0?l^*d_s?|FdGY6s{QFP33nt}vMqR?cot$nM#aLr}Le&YzXsxN4QPHe_!yLS7 zSpOv6ACUhCXWtMd3bbQewr$(CZQHhOTeoc6wr$&0w``mL_U}QzL63TzljMxDva)xw zD`wlUw*rwK`s+_^yO9e~Tw?4h=@4M1wQDI)*@A#ahb`0n`ni^}a=32Fvz!RA5KMRe z*g3S+tqr{3VA{p@TDg0)%+Whu7RU|qnTvj68^S`NPpFbM+sOW?$H(hMl~*+#3`-NZ z#2!1~qV*0ZNxlH8D>}2uno&enJJDhy6r~F23b>2ccn7Qj2VLpIePbjAd+3`*M4NR& zROdOpIoNL^+r_x3mG{_}(w$Q@fKmOn1>BIj<);-Mk?GiXXWrld2Dsm+-wAOX3P&VH zfvzdW3mi`T#6AYYh3k0_r3>^OamSrR+4TFcMfyY>Szi|_LnCoPB>0-NM!P#C_Ds4d zw%}*-wK6@lDwa5J*zhmuJxLPp9%+1LY(-dpVrkS9r4dfu3vVkZPEkh?L87!GbC3hs z{Vv`un6mIcE9|LqY{S2$p6R{>6FcNf?Z%E1W_sI@AGL#@wTRE7$nh&0O><9>asF*K zwp#S2L`zz8q&d7s7KqChxr5nf=xe!0SR9Cf^yhJ6JmJahI8bbTR*OV7T&7L0Ed7R% zrENk62si(N^T0^m`qL$j)<;MHOH)3JBFVmiSCzgOZ0l?hIFi zuyjyCSnbV`j+o{1v0c%rPmCut=~wQi33cZNjQB`= z#wq(Xp|EubN2~5N;C^O9+Dg^kuQJ^Ge&>DAXFVu<^hxvIpuGyCk2Mh~s*no(Q^2*d zgqnOrcCt|b5d4LvCl~$jM`pP66`a-Cu<>upKbBUkt#prXXJ=Fc1|`S8{O$i+{*T#^ zliO)?i;?JIS6Wx^hK(;n+o>vV&sjPB?MYuRtSPXX<1Uovvy-=~iFzQWk!Oxq=4kOZdYTHj`;T{QW4yBi z1aIZKjg)=nnw*^uf-@(Th*%3T^0JMYwCA%75qOTuy=;!1+7uTt^We}A22YwQuI=97UBtie!1nL?;4ySMF zi0Z2`1+22*jlrTEnkH6w#2;odRxzZuDSPC;N9kog+5e`e~T zByKJdPFH~L5FzC|Jc#|*X1nH`!{nrwo=_Vyh*zXgVHuvd2n4w-bCAoWW=ab!PJ?ij z*>rWIqO84b1SgU22f^q9M1Vfj*WT5dl9}j@C??=@)50RXF0lv*4cAqaqJ3a^^dVtamnt;#vN_m1nom(SA6YvsrD=&nIzNbxGM-g)if-&}FwM8Y(-+eq z@FphdYoz)(R{aU*O9bDT0bfOz#J%FZ{~bp0D2$P@UNFD9xf@hFgnrtgPgf^)%ZyL+-WQI3utFX8UXmDb=t>Lih zfU5GXwK)>nn+9UJA)4Tc;>mm517)ck{Q|pWJ`Ubd1Jc1YW1zd8 zFUy%Alc$;P17CR?dfR~4sdxPWzqDUDn^udXa<=7^{?n9>p`10*w7f>s?hy?L9t6?^ z{ZtqW8Hg9QScKh3|6sIhumnDZ^e z<$ZD5ny+S4n~nf1cbdcwrKq*J&Nl!+Oc=1U6b+70UM_C^N)3B-5?T%l0b5QXycqIb zrVzU)+w4SCgqsRwu=1Fh$V~hX5{46ROl$V%H>c@0xgv5})m50cG*4cQn`5tj$w*;S zlW1N6Qe1XvZ(_A$Ve?lq5oRa9fmlJExiM8<*aCla?1@M1*PUZY|D+UpRlgqDIwo1* z!emqnT_-_-OnE%y-HS$2PVd{G?I#SXC7nj7hP8K20NN5_77u?P3V1^5?zw>Bj(V76 z={!~`Ff;~iePosKss+1Y&0MpdMyxi>kdyDfF|qZ8EF*Nt%maecaH0GW=@XHOSf9cj zwL0oOzc4i1!qCMWAJ`pwRH#J2@~ZgQ1dC z=U3^7vDOJ^b@L%lRSsTZ?0Y7lRU8#o0&~wZ%nLeddZL#BjTbg_fCDleG$^)Fw}kf9 z6c%6M_?3kQb?jAP#Za!rhXA#I0z7#8n1l7n=X9A9l`?N<}S-(wByY$%Y*QlSm0l^plTHxyt3YZ@)iXD63} z1dN_@T$#e?U6I6qpX`85a|epIABAc_K*T7UqOO^O7T zzG~8L>|CVv0+nf0R>1R?J}ira6p@jwZPKqNFy<~?tr9l6x;DX3kuqd}kQ^hDWl+F< zoJEjoCfze$s5{`n8?8DPu=bEU!b;oUin%!>TA$(6p2gI{u(!9cy=%{>J2eiNY{(~6 zD+%kwd5#{>MecwOa7fWU152E1mP#A3PaOA&aL%8P5jV_1l19f*!eqL$_y!SxxTX z=hxweuf+2GCvwc;)}-3(NU3?YP|Ok=eed!DyR(&x|6K!I#;dSW`Xyk9wczkTUqyW5A5km2lRanU zfVhNM&-u$S&6$igOBS;~p-|Z402lL25I%!_{sYSr9)KRG?yjlEfFVgc`BYDY*=DRr zw{>3ES3(&kz0ff&AZj*1yT`urU5u{1%txbaoQHL_?lKm9Kbh=bm+#?iis(0*=!i(d zW@$~x8hNd#k7jCgF*X*EatVrq#c9a&PeUZ6Hjgn{C*sso9>+qdolQ-BToqx5huBbD4I~yjU#haJdLpd{JJj5N_-~swTY`f(RDM#;^Mp0;eDYW8RZC6IS6`G{@ho$hAnL+LrG-U4{MmI)hs_ zMK@x~O9SA=+4i}o&oSlZP(bT2ldMZhuY|>Y*uSVLpE!J&9Zinu%kDu59finf1ic{1 z%cAp49WXFQ=@M%e9s>EnMeAv_9a6^-7kZ9+NC?-eb6r4QgbDjJc!6Mb*@HFNv{6G! z)W7RKG0>x5Wb`?X5Zlt|!n%VqYN#e2s(e);#(0m~2t^leOJe$Fmh?PBG0=9K!Q$5~ zgET6O90|FA?JawI=XU*l!CIR7pCR$AUtps*!}*$3uW< zR!F%xiAaBVt^>RAGeCFvI4JyXMv#Y)W54Epjij(d6V(c1iTZvyRmDri)`k^xq++1( zE7Ip}1=zFQ<;-CIPP0VDp8^|5Rm%IVY&iHQS-jAQio(N}ws-OT&RlU70g^YWXF5j1 zwKIRDMJjCm-LHzBe?*01M;-ken_?g8aw4udb!VZyDXI|I*EbjE1^@Uu_YrItUa1s0RbLg7zCpUs~2md3NvVdM& zIwoTvv_%JRE0}y(#Y(ERjb0L3hfE@r>4LuZinW^fG5lO~O-t1aq+lKz=tM0w`7B9$ zvnlr90lB60=YM!QES+}JQHBnd+jeyTqu`zVHDbM*E zE}<@=4=zH*K$=;q#?L`9vD(zvcPJ(=`&!{F#wIKDT>2cg93lqvbUdAh)hANA+4693 z|IBw1{7(Ziij6r~D`fMeb}*ktN#z4LCtk4f|V)o}7ed7urX^_LGs!1KIB2G_EGeeYl6=30b=-EJtZzvH!7B@bQ49z!Zc9L2^Uj+ZHvj`mQRL3oek#GNPa-X@vd z83OkMhkit{8qg}Cvsv}on9t2`3&b!7KAk_1qd9 zD;ObP_#~#aweLsVq7J#?tDi4*c%%olQ0dBIuQlj!o0ulVs3^4ZT+M##B6Yl# z*TMtq_u`F-4Rfd>I)6@S<#imLismC^V1ET&2jHXK{&}bXba02xBP_?CW3j#u!}D$d zF)Tum(8jQ(#6M?9h?i%aXL`cam{rmH*iG{lfQ71aO>g`dl=kFI=$o}f2~^th7wqg% z&!C4)5%(=#DOc_597CXD4KR~DhnE#a7Y6s(SH;v z2)raa0M0F~Lt6)p^|y_^6t6=BQl-Y^l#;N7`f+kxGcKMVr4Wj(Ab7mY)ffo!)@(yJ zSaP*$`+^B$LE)NnBAoq&XZ2T~jfn=rrrRz)uP(a*2$MWr26(IiKWZAEB#T40DB2=c5}6&gB`RHOGGX77UkPAh@KCI$H+w+{y{HR zX@j!66no`?FZ!T<7qhMBJ>Od@Zd}qM1A{n=EXzXF&g{~}{@nY+i@g-7#4Mhr$E3|Z z;WTyo!Hy2`ph@5so&9hT803$H!FnE&c*8|gy`Y*GeJVsp3KV*OnO5&zmi&l?s+YLU z3LlJ>c4HaD&ZjWX6DTm<*Akzul)i7mKK^za61_-Q{oCPMh3Ui3PHJt~K+JtfDiPuk zNv|TW#WNP^qjd@Rn!NOG5q_0Ep_@NoHHoXvo)H9;w4s*P&l?9u>At>x<+ISdnrT%t zIblIZSQ)uyu)$Xc&ukI+UQ# z)vTEIpjG$64yKc!f?^SFW|J@g@eyoNYDM5d>jcd?X0iq=%a>8w?@KO4SaA^NmOmh% zm&Fs>vMCa_k=Oyy^RQfI?&zez$w@ew5!2#(@l@$V3H^gi%?8Y^2JCAW=m^zTRO#-E z?JAr^t4QFM;Jd@@3{7Q{fqS4W!GYP)Eb(+3JK&u?C%$cf9(5`%@7y~h6f2;%xyoFm zGZItfrV+$gP*XM2BMCsK%{{6MQp9(oi4b+HYge_u|Cbx9%9yxntkkQ{;;0q`k1B3f z@<|H;!3x^7Jn#>&RoFi35T+HXw<@Bc92s6O6)OzeUi5A{x?iPm!fRia2_O+!*tyxb z#)4ELHuHwrytMfDrTc7}f*0wevbWxQEmY#@x6}yl<%HgKM`oVqeyI zBQfxyyFdd%{`1#hd~H|Yc(Vg`0Ufeuiyr6|Q;lWmdz(L=_Y*aRUrvH42+-$42`~jy zy(i{<1x4obOnLu|BrmUG_MqQS98wNKB4fwn-W*!2lz;w&0i~?BkR1%V|7Y;WpQTLm z9h7w(>1p@|Y*t_VJy+CPM{np_+&Rj636QSPuKvR^&1k~>%5KX75 zdJb}oZc$`xqvPu{ZFED+pP-uKYB4~Axd+Lj%6dZt8xAM8kM0KaBrGAVV|}@Hu|;w? zsKL+-edFX4$p(SVc<`ZD%88^09or_&JS~`=RgAHFzwoubt1ZINDhYKM&ty+;SA)2R z(%KR&30AB)kKvU8#ZtHC{-v^Wfm5@wE(?PFk3Y=Tgc6ylbvtQ*F*^d@KdjE4^~2(e zP}PISlHf`{LSa*V9+k{&7AF^P>phd}w8zGoDYRKgDQwVAss8EZkWXdHbz>yuXHg!} z)`UP_GBP^q5U0?;1?V1ee!b(T^A$=m-(=viv4MK(*soNXyYIe6d9xgWP^ePkAdq`$ zNJ`qhHqtSGJWtT}SlD=lwQOI#YU>Q|VI=GRv|7i;_VuE%HOqNS7b65$Us8i94ascH zm((73k$WE$>qGH!NysC5yiL&gT2OA}oEC)OQHx?0r|4Ns?l#x=cAw&iB>6v5g#EUP18Ik*hbXSgeEg*1K^7(tZpsq!i+7n` zL+V-I%8ixPnD1p=8!uLCPNa@i-9K0#A30%Fd~d-($&cu+j7-`_r?2RHQT*H`S8T66 zF%kvuO)EETZvTK~UN!|=yCbP_Z>OcW8k?d9ZGDq$_jB3K%!C^W@6ADc+BIO(cJ!1r z10EUHSuN6+!W~^U+|>l>l|zlyeK}Em6;s_@JaD{KM6SQ7Urw!3^*XjBQjv)E6MWud z07g{`*6bSBr=irF(YS6;Qq84-q+&%ZvtK*}nGcMZ@5V{l=_me-(F8MM(y~wdInNzL zo)!5s*lbIT88HtO@5mf^xWyG|gXJ*xu{p$b{Kd1HhZ1HU}z9&4*2d^u0-xW`97x~Z`S?lB1prh4AnPeA zPR0@eNwCCIvG_LFv7LfwkpJ{3PBZKvJiYjE1mv)$uXUnmZJkgY=eR&g^lnZ*I8 zXZv$&VweL4v|tm304bgbbkE>&^R!$zPI)Q$cFd1qJ&P*R_#pfQOFMkFD=x{_b}mjq z>wMrd=P$7>nXR&co-U`(?Bb!%gW;NN`xG@Z0zah|OuqEs{3aGlv!H^$9Df3I-#oM0S7{f-`;n$Z>rJkRNiB$WmhHV|DVEjK^J=z@BtYEOXV#<__LDyLrn(TE>! zEAkAEc5vKxg1`olldOXU98neEq)D*=-mlISO$}>7Z|3y0a;Kf97ZJ3Ra0TE2O+;S% zZ>5}v?v%^5S4gf(Na`~HXB`wWQ--L-PGmwOM@0@^Co~Tp+>Svq7S2`UtAvi2QamJR zxGf?l_3T8nGpv)E4E*Z4gE}<}a^?zEgKKT|K|Zj`u+uS z`bq|c&X=!qId8bA2o5pP6_!-2gc%WyKLDkre8&lv_5v$Vpo(gyASg1Y zi}6ewsJx}xTWvku)6qJG@#2rd5FLPK^%|?$FEnNUG-=FNGC$0+-cD6hQ4tn-WRGN3 zLu$Uy7?W23QcW@XI)05lmmoZR86J$Q)zB`JGa-1nZoRcTo84REve)HdxJ>mVmSQQu z;jd;9FgT2qI<9GfEaE1j7 z%-34{*_$+zz8FTj$@>@*PW}rLgR7@F;7b#99FO+qFLSM)wPYWsa1&}^k-V7K2YzF8 zyp5zt9EsE7|28WNp|dTFripH#%#SpkBIYdm4y@B35 z#MjG#`53I#b4uam>wswR1OGhi6G8I5X(h6E9VFK47uNdVJq-}V5U%Zz);HPJ{12zk z^4TjgLoU7CN@jhm90^64A7_?9jv`?jGFjgfp@E%yTKNjz0AfWXBEwc>0$nd`Vm z(csz)D*$RLR7)4CYMK05gt~>WAfM0q=`85!g%QY_|1~b0{2f&ajxmS|RG>-H+ov8Ia@Scm=0=>$(s(4f40z0uIPk1zM03 z9$-Y)WW>uN_Hu2SNr+Oru71BYgC`F6Ge-qhpCflj@W!M9&-FryT9;#m7pT>$PhaQ< z=$&s>c|*b>CZ-|#`!Y*b&;zXi4ygpS?@@1mvs6wC#25tSkZ{BEa5ON=p3nm_0p;*X z=+9&RJ>L5K0KrqSa$N$W=usVzNfz97lpEprUw}^rw-cHF@)u~9_~$PUK|Q2%b(8tl zjaG7jT@OXQSj!!{=604zopz*_y$Y7v=R>RlOTQAT83jJ{cdV$rm4$0((?UQMlI8>C z!6x)}IdH}%9$`hO$h9P6rP`H%j<^8VFXW7TY6)C{21kpN8bT<;2=0O#+=~fM`ut{e zE&iLf$dL;?W05ye;w&1`N1I)FVY|7)xejOCVyei1Pi}oLjJJz)%7K$gn#eoY%bq*? z%_zC8m#=ymx$IlbzLwT_ivAr%pJO{tj0)lUnynHVMAu$20#W%uvTXY8tMmXcd-BK? z1?FYWtGP}Lm7?7;B+){gdN7hP&x#3vqN|S5H{J!4V59qSgCE&R?x)rU%bU&yh2QSE40Y1?x&^sGgm8^@>x zy4)>8ZA`oS9*T4ln|3o@fPWVVV6y3XPYL--%>ol_UyzmeA$LptGz<8^t2*aHgjbH8 z>$K&Qspm^(hOQja48(=+B1UaSN-=a5^=AYG%!sxmYdSE24Hb&C=5-Y$U`kNHn1VM~ z;B1!v@Do6Nyd5q{83md#{7eA9i9?9(6{oL&yuNgeuE@jmy1uq1ZEscmK0D?|!k8FP zXmm&*pD(XAO&<_`wtEE9Qa-$kZ2j1@u832+o6Z4*uZ!qF)g8k?Hv1{xq$t|ujpLO; zxU`1DWI_Wx;3^PtqPoj-Dcq^(W|LUjQ>d!X9t*}~7(Upa9X~Ni)?6qYXMuql!y}%> z`WFuq1%Hf#w=)Xu4?uWF_bx>T>xk--`?#!B_66<-R53@wwrZ?@8IQ=y@_fbitZxz? z(ZJo0S|ylI%O7DxF5t2ia#NeBzjQ!g>juhOBSGagw?Kp4GDS1MT%4XrZTNlap-hmXJv9{E|7w zCZIESu~P)giU9_4Y6&bgozmuC!ll|4Ha9$LTf=CRB3c1>03S_#D(Lsi-y@3WDqX7nQ_9Pwdb9Kkazr!;01CL5%#@0A&SO_CrSl3Wqe? zWtSm-B%ToA8jB-&*|0Nl9SjPvyG8K*^(~Y=sNXVsyWo_3KGn0`ED69rSAt9ly3>}V zS&c)KiSK3>>8E#L@Ht2qw^`-a$$=QRVmFkyBS6K$?1}2eGT@f6P(omDTit!MfCq%s zA7B>)F`%X#Z7sOnwv88-n&4to_dWn4>y-e1(tL~xu2unmKwzq{m5S_Dn81H3Gk(pl ztsuZ3uNj27_rL8}JPNY2#|+sizvFLfWOpRcl=65Z<+RVnlJOrDGEKZy8}wGcLS`|$ z_rHPjXQu0A!{+)iU?b}e)?zD{oC7{CP;tC-&^n^N@PsrGA-OXlglXOlhwq-Iq^xof>d&X8p z++Z`S3c&?VRpiP&ujRP~Um#yZ+XXZC9i7_C6G;I~Du?EuOQ7AkKk-4ydyFxANupgW zdDH&*F$(IEE^&bY-cfiLd?Hd`EM7fu)-hOa={*~$*9dvj9Ogs2Up;z>Uj?+;p01zE?XbxnWWhs>Umnf3Cc$_Kp?FOCKd6kv1} zzgdFqu!X@<(DUM;B;t5wZ>QpFndM{U0AfvINl_To8z~3&@DY;cRq`Ws_z2-`_2)4u zm=>xg{52Tf`}uDRIf5T(iLPga6J>k@yV1tG0uv~|P_1|L8xL;2erF%aC49j*>OT`< z>~a?QFZQ6CO9o6HYi*2Dzwzjljsd-9sRchY9Gd%&;9&IF2#`A5fJs4mzHZ2^Xn-e;{7uszz>EqsdIhXC;e#k z7pg?u%tKIxVGIB7QF)3DmHkI@YL^nNWAVbiYx;ngJ$c~nBWhEW3;=gKC3W=}st?t7 z(uMEwOeX%m-yny1@fq=vQB^;kXa(_;g9$+7m& zu+N=6GxBKXjiZ?zJnQdgAy#_PFsCME1lt79rFnEUfeaRl?fCbVxdg#R+6Qo{8I;w# z4G|};_zpj4mGv-YSu^3+oK|m9*;~IB9M3Z3)5@N)#*__prCN5QDjo^(xwZk8JaWN7 z9o7J@7wTw2InISC)$zXCq70j;tOF@s*8n7w8au;b zvaNI5i{EchUUp9JJJClbvVpf`_x*leJL{n&1ENB%B>mZ1*Pg}GvQXT+M|-AS3-tB+(`@8%aoK!RGzp>ggfZWxlhvSVOg%X>JU3xX7dyDa@QlT} zF~Cz4u1FT=N&5Ql>8lly<-umx>G1KV+vpOot>lgFxad>KF(#ewBphMk!!(-DC_CR- zkW1m5!W$(#PGle#tI;Jv7+pe2U-YE$tr|0C_H zK+ATlLS|9S9hS}wT$__PH_meRLw4#DtW$`{r4<&~+oCrAfjO>VjOh?m`ou#Zv#N7~ zO5!7}p_LTyZnQz0LkHF$Ln9)@3NtVvFR{EKk?*drqd(XwF6Xt7!%`feV-aFH0g5$n zBr!NB0^)Q(K~@CY!Q+Jfg#XgeFkf5$a`DzmuQZ!GX*{Pe+}R~Ra1b=9yuLU8+4r5@ zDF}mn(Cla_e8*T-BG@h3lw_#tkj8MgNYwZq&45X98i6C?LjC*9? zItvA1P^d|g0%c3J8Q{mrA{pP2G6%l^E0_9l-Bfo&WO*YS zB0u0`s191;kEbTAavzLhOxZ`1wK72fSm7bw*7Ild*1^YnpQ;lv{m@h=Da8PWXWZw3 zhfQJlZP3(B38ajHXheN#$UYvA_ORQfy;=xWfKrx#3bfDGCr$Gqy2hZ^C8`pPFUNS0 zfAq;i*m)qZ5EBl6S53uXY*$GK>9dZ{{HdBwMRFI8Bh(we#U_*l##NRy=?*U#GV;-J zU`1_oh{M7Zhwe9jOsT_>=Z~bxQSJVxQkb=OO68d&x6v2#Y0Q69+*joz?x?@S8VL_` z@ehr{Nhzu_j=o5eyo(Z^^u0`2rloOsT%FBlarb<#UBzmX^^QzFCXHix2H`@I9pkcV zTMDSLsi?M*3ya=Dx%@;mv+Xyb;#-w#YQR0hlg_4qOVXz<-MVm)zvTj!pG@!Q95D>$ zadwKLtJp}qr2`E-75HQEgdgp+DI)(^j8@$<#Yd?dU!1>C%KJQqO~=dlMesaHDJ;N% zSztmzyC!yax-ZGwH#?vXf(B3HBFUST>i31mar^cl|H!&21YLgvEIRLoYv=9sHW!hq z%CmuFdS-+q(kM0YQ8%`E+SG}9N0~eK;z&JZF7ScY|L@iM!aJWb9Z960{+IOELU=lbJe|R?WdmKS?4V7@569sk_U-%qQq=QwpRLyOl*Q2 zm%>orTlKbo9K;r_rS56HepMlAlT7e!7?_QP^9_r$;4V7jZ zOh+&2w^dLb&}yR+@M=m8FX=)tIy+gVC_09BjnE&s{_CTGOyP(5jrSAA_$qhWt{-EY zLsCAz8+zB_dbdpN``j|2eH_p&m?pR^J*|w`QIv6G7>kvxic`Tgga`@vq$RFp4yr>; z>=`_(HXPghDZq?fKM-a&+fRw}%7KK8j^3AsGF!UMRq>%<&>lk$aae5rS|%!(d=}`Y z)&R}bx0Kb9amuN`;b=>0+M8s$a|}-qbJ&6xTS0^DBWC!f?U5SenWYXh{UWfILXi|u z-+j4=TbJYqb**mKG<`gWwgRIh^I86M|6Ol<{(rq;_&?N}`-bU+1OYSoEDyeSHcaF8 zsjF{!E8QIgi)_UM;)F(=T@62?qlwy^hFqqXg6PiOq^v1=vbfJZ?AE!-o;Ic#M9@{1 zxKxv}3XcRy&te}^^geC0lQH$sdyAOK#?h#q62r1eb{_g&3jbl{V>-||9@P+s8j%ck zJ}7{BqgbXoqXbh>KVY%P`kMCh4YB##r1FzaMfcc8j=x0FCv6N{l;){n>2OW@!3POS z@)|K7uS8xXV-VuyPa#T5s`vB=%(o(M&g5>x#UfWw`?|KQ3-D*qjW9UXok{kQ)ujk2 z87=cvAxq3*4bZutV5~5HGE|KGye0C9YOTuFf5_{5q4b0MM<$!3C!^Bg{W^2Hga{kB4&r7+;r|UFdJsX{&Q%g{@HFbA87AA7R4w1<7URrTH2xc+_h9lK zcpP>fBO`=qgD=WaJq@i58pz3QO2x&Tzia#tus=E+y{QIp2tXawf%vU0RrWw2F>Thh z%cGC3C64~MfOGOzhc98;twV^_qR^)3I=X%P!Cn~c`MFaZxSX+(_E!+62f~*?a3K&| zPJxLZR?KHIaHE$hn4=>&HSjQ^T@I&bd{>LIiLeAAH_&=dO50n{m3|}}9pe4BiEXs# z**O$S1x!>ht4z18jU&%fo^)d0r~Cr)(_F-#S|&!y?p8CALr$%-p-=b6^^$aQ2~?JA zmMqA%f$FabuRxbe(&jPFzr)6uXZI_hepQBLny6={Gt<;nFD?2qatbA&C97%Lpu>&O zp^Z$0YAJZM(^kK|qJ|J_2xd5YuP#6<37dyGRGA_X^(hr0bm7(q=pfyp3fJ+z$onoW zOqDqGT)ql=w)|>0vvdOfc4O!3CKzUAcuR=2+E`p`k`xcKdv~XOl}1ixoSlMbsrW}# z_lglC344>Ggk5qZx?PI$`VRuCNqjb{jHDAlCT|p7s@=ukj&~pHOa|dQ=fdjB;1fom zV<69iKhq%auI2?F%|LHahb#PX%l!iT&}yPg@%KH!5WIEXVR6wp+afvWEyP`4v|?My zzY#u-ZMaO*S$_RsJWa3$f6&>Ci1?DHaC~)xis&pj4j`*zBnp>48-YNSFGlN`kPEY7NG+ z+b7DQR6^WCW%HxcFK%{!aok2M;L{*f_?r74ge!8gLZhSm!A1}~+^1%&;MFD~V|V=7 zGNt1HbT6Cr=fYo6h64W;iq`y62;nChV&f#PIm}XIFRPq#_5mV>My5RP#aZmEGLiO! zCZ*+dO(UaF$54hQ#p~vO3o-Ne zN!^*g?Fmf%9cCZA@TDaW+`jX)P#EPw&q~Ghq)YcvUf!Uqsd9-|9M)Av6Df=EBQ(v9VNP@z8WPqDhaqPUlYrBnWoQSr{Qgmy|rj=9beMkKL_VS;! zW}3nGI)f=adb3=0jd?AZbaIv*AN|X7)qx;#0h_hw9-MFpSF)=KEMP_!rB!MAwX^s% zV^63-CXkzar07zoJddj}>Vnj*>$=Is!gn?46 zc8tbxZUZXD<_b_C;7-IJ*+SOlpS&Kvv|ar=W{A|bcA!rS-2ZR2N8*~%P9+XM=k7n^ z9fT`U9ngTil=4N^Q0HuT%8g=B4J7Sa2D|BPu~OaK&596R)?8b}8OIL3`z#`1URRY; z^eBVukBxgEA<=N2ynGF@2~}Vk?U!5*wYC9SN{J6_FQ3b9u*vSM#Drm~ z(2)ob`fa}v_>zAW;ut5sVXz_=+>Tolzv4^?z5UGVk^6CuD-aGj{a{O&ZJS$5tFK*0`zlsjuJ^SrKKLiOf|+CLG$ zoGc7Mer#xGQZyt#KK(%GzZykHD~tt0sOS{(GBZI8Ylg0V4o=|UpIW(m@*1REU^OF9 zYYlzMl?IP7FMw*Ur7ej_^30?AS_9v5%9At(o!pV!2Z zkt%Ui@PPcC1|HB~>Fl!f>f}>%5Q?xCZ@K+CtVq+s0zzRcd*mUQ${#?9AEX_5rb(Zz znrK_Fe$lySG4AWmH8ZIcxqBm+RU8pb!&9HUlDa*}9vuCH198*3#YRDo05nI#9flbG zqU%6C>@QpZZP^hT58SNqyq8IMQ7M}-{r2!bwG2nQF8f#}UUB6~wS?nF6qarT>YKK1 z?Xz(#LVrk|+*hyfql9M~YD2|&!jZ)7>eJLn3(Jl!%C3u3n}3ZrDn<7A%FCn!&|)Wn zyRt6O@5cy^rTD!|iZ@Iy8Q+ljcCWQsDuex&-QRXMMjumr9aIC zWM-MTffQQm1S&(T6w-cah#6QHHq|!b+N+1IGv`DKl5lchz6>_;Py#vhi=WJGKB9CP z6KpUYo@ggWD{?MxqR8I>9R@_2e`7Af<0>vfLI&g9Q<+vLObQKWP#ODWCR#ddGr%4C zH0@c<=-3+U^W`jYQzf#?-lg6faFX)}5Qr3E26Ynarpv&>=jk+NdCs8C#U`Hh8lu4a zQ!oH{7l)~|ko$o1na`=9t}MOx#f4jAFbJNk3vJZTCXI9dp_dEztIt`nONj@%J>>UW zo`})L1yDM%`Z=$C+E7ZvFbx1evwP?i^)=S3!GQ_ZH#_TA%%`OC#1*e=g-8VO)6zt{ zftrp%J;$Q?4tS)*GwCRznlKm)h3Zlq=C5#R~?ADLCmFYZm^B-Y#ut5sn31jV);K%mzrA!Ps78t zh>G^BWo7G|F?uHuOPxS++_PKBZ7t0=i3yeD1tq)3iu$#uOqnGBh-PhERVQlESJ4|h zyvtmZqOvy!EtS&@E%EAK8Vi!_L=1N?uasQcF@fy9bXxNyYj6^zvfF0uP(4`{b0fW9 zhpiYK9e?EBqRk}|?j#~z9tI~1C7&iSL%30k^n4m9mbdPjoepc2Yx<1wc^Wx1KDNxM zNF-4Xt|P}PVdAr4rBRq3)3}|PKnIs!mBhT(qXU2#VjkBkI-xQ+lKq@q1ubEvf#u;! z&mBG3nhRANE<*_=qz|glFVSiGP!R-`1QCzN^*sujHxgZSI`Q>Z#Pn8MNLbZBe`^9`(huZ3q z`wmsI>cV^Tw{`ml=&vwgO=qitiyY{xVSqN&Rge1y3mgS_^iMqJyY~qIIETD-qIf1I zgr8tL3k!))cyYk{29LbFh0=>w5LxVE>R}^AV9u*!xp7sb&f;E%zXhAoR(fQIn~oP+ z&fDye>t`F&7QPo=%8fVF50h3A5qw}hTlrT7>sH`;a;Yw%!fiKI?F1QX;K9B%i@8MS zhr>GXQ&_pQls_mqpzV)*`=8xv!)gd&&L>3DDnU?c+lbj}gs&7%2b)Bo5Ou?7dngzrH$sXu zgULY0%sTntT15~3Yg163c??h5^g#?}w2z6=qU2|4zxupB7w1~<7BX3DiAFYmS`6V_ zyizs@5@oOXF8)}tVC@BRuL!z#B8YiU$f#_$oGluSBi85RbeEaBLAGy?1;H>BKcV8= zd&!1Gk9Z4_gA7_mNqxsV3kkSjohEbuj9Ssa2YCnH|ZpY3N$|iPdXGUnrs8T#x z7)%*DRCc8&PJf8wmUl!yt6Q4(_Ep&-P7?LG3@>1rLfjw$Gf0#e(uT^L4`~@44f=x7 zAJrAjd%=e+G+yFdlRM}aeeTD??@*am7fQzdRcnFFuS{WFTn3!Eec&Yy+wY^Fa+?!@^ab5DS+x^ zIfgb{R(VJiN`;&2Dm_Iz&K%aOG^nB-P8OJTV?w299(n`82MtrXk2C9NFrKi<|(o)U@@ z&+s!~ZH&w0ZH)!lOQyn|rm5lChXg1OB1n{MD{9tok}UAR@gFm4X|4W-4f5TQgQ ziQij@ONo^tHAqsE?_qeu?e9@RMWKc#0wXtY&F{DhQBXL_*G{hV!0~j-rNTtRN7^Ri z>-jZ~d$o5jPo1Z;Stv>x__YdtS>#>(Tme#`61AN=$nX9pbemsLu8M24VM18s=_#tL zYO_|FOctavjgozo&d8P~1y~ex|ADeIz>d$m!N@n!5bK`|2QDM>VPdX7%~53DA+fLaoYmcSFMj3=4XPCs02y+?zM`~dRcxqP2OwxCGu|kQW`nw0c8(KfxcqaJnt&|U z=FjR4wsIyz7uHm$l>wFD_4&nV8Q|`|wh?(FvRQAvQ*k0|A9hfOs)5k3nU}xuDJaB; z*swe8Kj>RtT;BzjH-+56LysrDX=c}fsHqMoR{(cmo9K>^?II$i?f5O`VadNW%=_}d zC2~tJdIcGkm|JQcT>i5G`(`k@f z2l5XDxnjM|QqcS0e0EGZTI@(=%SotCFIE~)8=EsVw=&iJ?@@<1J*p6u+@o822fRH# zc2KDQPoOo``p!})W4HSmK973awMI%2U9@9J&f{9SrFh`nQ;`ga_?z zTzQyK`2lpTct4xR2Kzq%ZT&mKc6jSiec0Zf{&~`+Dgu^mDO@fpfg2HGQn7F;}1Jk`tR< zB$cxd>kQ88V*Ba{BRYRsbEKd{5jy z*XI|OsEbG^Ou?HJIljTbgvc(rW_Ihh4AnhTjo9*opFuJWqpN@Q4BebD74B7RK?-t{i;!Cp-Ut~y8cmqT%d~n{Fp$I@)`4^4mKJ36IMvg3_a?;dtBsTtvekBvM@PA>n@Xr|vhcO$>-e2# zC}_e^!O5-C_wbb&B#Q*H=yn8y?{PUDBWs2w>of}0P;vIqIK#rNZDcUulvb;9#)nmQ zutiU*%aI2eSh+Vy`Gtd8R1x<;J6fRpEUkvw-TRsU^+vM%v%9vAXhJerhZ>VE2$<$c zHR4gr`?l{M0n=T6_#Z6-C|ue_l|Skup5=oN>UjJD>wl*O^b1CC9K*L;NDFEJZ=$iH zwHtzDpOhvTP$X!+_E2izTNj?0JCC`&Q8|@HoEO_&6#( z!rM|rE+mpftL3@U-E*Ld6HcZs{qA+ueu_CNi?W^O7`Wi zC9q9CTy(ZVFd z^#@}}y^PR^oN}TvE=Zy+w3C(YR$Ls-P6+eO;NqQMcimCqZ{jMd zLnCC$vx{{7!NQxCJnw=)Y5_3b4AUQR>~w^T(FAG|q?&oa0b_EocA8F0-qXBe<5|YI zQr5Nr<}80|7_?&SFMftUt)hyO=U8n{)R5Khj~5JvK>S3ilNocQPhQ95@InH(sbk-W zocr08hp_IfnQpk!QAz0J!yww)qQ1rMzox4x4h`(vE;Bl=*p5vx=HS_m|K-O$+ipmo zMs1)-&L0e5++SEUue*B0E4hqf@f59Ej^tSOxp`PaEGzL1qDjVu!o|*v;FwGwH++=p zSM1{k21Rqvvxsyb6*&fGab9pi#^_Q7rNGw*@I=~m*^ygh?w#w1AA!EEfV!VQxu`0J zdZsvIODQm)H#1xJdWLNDlJ3++tg$a2I>fkWCoF_@-VU5nGl~wAq167JXr5r9YuBu& zL?ITPv#u(l-r%$d&s4sr*SIYX1oqa_GW@ItbKCK9OnMS~6B(h1_;2)|UY?26P7JT*GE6*VR3yN7zTB_kvUa!hjJ}EUJbU*#AJ|&3qutFuvmMG_{7=1{#DRY) zvgX)?6fY+w%{AsZLozcFb5?*Ij*-tUuyyfl?9=YoX_tU)=&IJrJBfVBH=Rud-#;=Rbq2wmt{B9Y}Mf6boY^zDl&w0@xry*n3`&*A&5C|V7<^OLbq4w)$SDl)1tGW%i4ZNRk7QcblnEq4#g&rK;&G9)UGB#dvk zkydCONQrAoLPmPx_j7~>T(&}~c#i*pB<)Be##*@`K3~G-(80EPI@`tUdjTeT;S=z* z{l2{bL8~GzPoYJ>G`(6^Bzy%lVfpfy7Cf+O@y-1aG z6Mdh3prtReh3N>MN8r7n)4uMFg)ZyVSTr#Qm9`v#ASUnGuXQBUJNB_hl4yF0=^9JP zHp$Ec;2LY>32`0!Ddnq%>o&V6oh+#Sn3e?YAZ=&DqgXGyob7^E#s=GGP+87Rsd;H8 zsL)AM4`EuM)om0Weh5mixnAt@juM=b=pfoXJBbA0M>$5@klG{3rmgA4b*XTTlKAfb z3`Pzy#XbwW`Gt|p%RR&2c8kLLisP68mqu!cR8`_1aIMvdoYiW&Y&tH?Lsha#Ht09@ z8z_EjRMP9@5ZkyJ?`z6Gvr8V^>=4tREw$U7rte{9+H##a?4)+g#R zQpt&U$F%C_2rbgj?}j*-9KeP{xZwpTGQ%&CL8@B2VtOAiz{$?3dIbbEl*AD=7Fgjl;Rl8#_z!z54$T=%G0rGA*sQkS@JvN;AxqwZ zfymNl1!n?LALvn;O$A;N8Dkz$aW!=8A%>0b>-B-6nFYCS2*uCr_jkff8*HyJl{CZL z9M7GpV=b4j<=^+&cY}fMjis1Nu=8okw21tbZAZ;L*Rm^6mo78xtLo)>-P4EGK|OWE zR+jm#Ud@*6HvRo+4oB{IO;rNjP@HWhf>>(bQUU1$^)*Sri>^VFu%8E9p6v@=v7nRv13ca(v@35a*poZ;Jt7h4=l zaabxGEonP+-mVH?ZlXW=Xw-WmsX0LZ0_0r({03ZD2(`-LwN#J3c=#7<&GQX{Z6eHe2x-3V*<9LZBig8ga_fK z4q)vM(O}^)a{DB-&sav&PYHZA5Y~)QR3A41H1}!(n>l+)HJfrZG|)?fe+`*9&LBL? z2XuLESm0@O?kRtb5hut#PqeHS1xrWMeVn9oMWcxBN|V;epOY^y&DOLuxH}>HR1a5v zRqrJjni9LLn=!Dwa2)M1^B7LHI-lPfXT8@U2(d2uWzvh2G>+lulyEU;=l+ zcL@$4nTa_-Ou!G0{}2gYo`ig8SoM>kM@lv`!5YYul8Z^D-~xlrSX~zBA2x6I$P5j6 z2G*OlZ#g7we6=9l0<#_F8$;ogG!>v6`GDQ+D4Z&+?hgchPwXeTLc~}1Du7{u9g3`u z$-~dupi-aTVuWeeR`CL@?c1k%V^GR+C0!+b0H6Gb6%1)UDl$9?{1p?S-5jnlK#-}R2?U_F#EOPM1z_d=Pl!M&b%d|04jM=z^ljl6=h>&XFDvYczwkbWSv zA~(V{o^yS&Sdwf|L6fWzcR6n<_0pc|j@AIA2i2`Q@+Eg-c2N-LMiM7MOC~U2E1fmB zE@HzPCn7AxnRYJVTk~Sw-_%8KRM>s7dNn@^^`&!QKbKdVrp*P>R5VXs#o}A&osiIT zkT7~V=m(V7XR%s1N&eGzd`t}e5y&J}*3A)1V`QThpyh+JSIBpC$(?(kYk+BT%CqTbL*o$aGZi)1vxW_}gA}xA&=$6+aj~ zVXyb&jcmKZ=`!*MjJ%?Rh$m{nKhDs@U3MQt6{8jMqHXy=9xtc2Luy6T&Jz8MrR+RS zshfDlXeWXSxQY%RIHZQt8fh4zTNljbIFzGL0OND&?R|c9NCp?f1V1WwilVzg#*%!> zjCP5ecPgRt()mUiSxyKYn147<K^=UUn4!OdmW(&@T(QB-(8D+kXB0dvMIHPoxipWIS7?Pd@MMO_L1UjldOPl$jjf6r$btyqSc78sMVD}vCk*)GRWP$mq1CycxehqUjn|q@a5+J!l*3PRxdnE_dStBO6Bm!GA|*9B;ugQ(^<;1_^nqB@Hg7wk5jPzde~FyhyJ2zJZ%-OW5njA z=egi)2>flcaAhO*WM>vEP42QS+*#};P}P!$O4#bRTzr`zR$!r(+)ABI!10pP6xDQfXX%8`?$k`+q@Z@YNm=)| zCT^he1daYs9e9%Ld0TCP2&R?yMZnqLzVr~XHsImjYx2KM#8{AWM(D20x|ozGCzx!X zpe^I~?^Ju)e~`^op^0X(fqE<66S^TUnP?@FXz_P|&d9&uR^^KNa?@fk%jyzay1wca zL!;+6!hFge$#JH8t_u}_G1tza$P(!y4%KlhIFt3Td(Uxaj;e-n^3-!VGIq6rZ^vl4 znKSr%KIsqYzx|BLT!lN~#aO8M0iQ#Y z@JLM~;t-R_jQP0&wpmU2m<+g%$u!MHY4-1h3&7x~d1oWAXVau*@s6|sd5{GRvI7OO zlj1FOEHV(Qgu(f7K#!WH@F|3qoa(~Ku^63?&X2-pO_}yn!{IMg92o9d(0k=7Gdr92 z?`fFc7)$Btsg=yUFiowV40kk(ac4O zo+CO&*M;{H?L>Lj``6xa2D>W-DY1`K2zq3VoR!96%@P0XuwAxPu%?fJS-CoFS14Jb zT6P>KHl`%KsrsxHL#y%S;T@FW6JQk}f;~rbaJje(2;DD1Xat40KU)slt=*77AnKA+G@~M;NXK5&dV@%@1Y)AoIE$QhHVBy4y8SSGb6^qtEn%wJUaYhfO*-ug?~==M z_xI?Z_=yf-$m~%bbXazi1d&p3eJAxeL=qUW;GjSNzD4ENOw_CiT#NtJOq?Rq5%23I zAgArL!*vO47v7t;jg;p@7-ZheMzwQ|8Kbg%SRt%@9Lkul%bo+%Shk7?~s(*e*F@J2XPEuf@v zNHk~K#i|`qRhf5^`*g_qJJOU;+)R@EVXP6DbC=MHu_U}?vuzuQ z2rTg#Z8yPGap?S22l8c%$jUfbY9j<8kN1@KeTiCRe33NPg6aMfa7919Q9+1Pq}?A# zx zaiI|D)mmf0(L}U#`|C42fg^-DfA!W>46pmF8R2)-H&{>2!?$J?4Vc~m-rXoYP!X8Tt|9seA}kq!2E=0bklA z)iaH1@)!YuM=21+CQJqD9mG*KPa1684$sh+6kqxOIsZ;BHSAYA`*^!9VYsJW7Q$_X zq6fTm{v}c#b-hU6^8E&vx!$~g6?D2GjFP>We~iToLfHJH$$DK|l-VwQw_o&qW-P4VxMFQ0z*8IbSn!26&;PN79zoKgR5{`T_$y}L2yrXRmRO^gQkBwifaozMQx zj{r<>ewx}*Gb_I?^mRlj2%!A{U!Ep|?WN}ZCVXuT^o#cEs#nE;ofI&anN&;s)?Ie% zF%txF{0jlkb8*J|3U??7kWER@JL$y<%PQRetKCm)43FzuBeyMywkL9*!4fZ3tbiZ{HP%m*yd)|cCm_BH(`Yf(&dbp(()6_TK^j- zzoorB`*ljsIEBnL*<6>|rVw`b+X`c}wKd|}TqjUS?dI$D*!82-rgMJdrRb;wZR8#! zCqZ1<|Eb%b0*nrQ2Dx{X1ix79h^b7|`^^UfRh z;%DAB9@@@LokTt0HLA<$GeLT=x1s?GFaZq36Q8FTSmF&%(c^>|RT!X2J!4~q%F&UU zafy-anSRfVkzt1;;~hl%%Xx*1FLXUcI0bh61aO_wn`UO4G12R+Q%(hg-j@9?y~HBH zJ+aWmt=oU6p=nbA^+`*y;Ir_-y})`C!EmX4%{Zr)^W?N0O}D7W49lQ#X!{vksgNk9 z-l~Rk+`Ic1@=y6aBQkaNqIJ-Y4{p>j?q~20DZt+Vo!@KqFaT?EOXhCNliWVpp{6x2!Byajx zkUP~|0f(x1a+Ddt{;XWx)2R}MY^k$5jdt9A;R=0~ud(Y@R}ce(EU0dn*#xB6w!wql zHe!k_bM{!60$FlZ4WhHl0UNu$jWR6NheAz6Lh~I6NAk3UR% zp-Z%n0alaMCC~~uo$YY06X<+~c;ikZLUNnubHw*pD0U#>Jy<>H>j&(|H+ezVLLthC z_TQ!-XdF1aJEP;}Lj6h7%4C?*f_$@X8ret0pZRPoK%cC0_?;=S2tAl!7 z;we*>e##kZGp5jyH3)`=BwxwyV|A)t#+q!Cr3sj>iaN-x!mVPbGAG0Aa7Pk<_9!dV zDZXxt!_Q0L(CGeY9sacN=1S*F{gd*_VuC-t`G)~dXGi($7g^rxS-}m!7u#5d{FJ&6 z6A^DGF}QhwaFu>5fNTx~Bk1!x1P=EM?nxvC}Tp zE9|3fLS#V*n8PrV@f#mkP&9)k>SI5pSd)(WzLFQ=EBW%{`aagO9Mac^?46r zibMOkLaF_jkK!mDUi8Ha-Xhz$o<5jc2sjba+}Z@0-~;{vj)gUufDy({NRGiXKX4(m zj_dj((zb#!kf;<9R>ad8^J&Tdd+Z!F9x@vfVYB1qc%l-asQM#*aTa zoD-#i`UjoU-6Zs`o(If8X|JSt6GNDl5gs?5wZ_wydWImeCQ#wVh!FWzlIf?R$Ugn~ zN88Kz5jCMF4XhV5O;q&hyd<(=R~_&6d*956DQ5xS=si}Lq?i<$*}rQagJi&f)!9bD z==x z#O~)-T+OS|{16dKI4nz<;{}myp5OSu4C*b{@GKUkxKv@_&^lX_)ykBGrDQ0Tu?0GL z<-8r=+G=o=De6DYQ$X93}HEf4dkYM+;^}x{c^h&Z?n9wTT{)ev`aCP5r09z=`z<0Tf#}wSso}iJAQSN*yGk zyj3A`6h1(t-Uw@9lT%>-WmSa7Ew~8Y-&Ly!XVrO~FO?>rwcdZ8i+jGQu>ZgfIsHE8 zDy65MM&psGa@N5rZ>b}~DgZw2wS{G_3^mlbH1_k1A1WCVwP`A>bAb#9;CR)h zDg(o5_41>oeRCLp_nG-D6PT>2T`gjxj7Zpt>+P&JmO{1&MI^a4WRbR7B7IGpW!A8I zN0vJ+f=n38(&8w)I>Vg&yZNr~u6t-ZhsF!NLvGh?=~)yTuaYd<6sdTrZ;kDY<|6en z5M+p2x$)!C!w{N0>1X`iF8wqW717$vOX|q7!hr(vgw~;e0PAjM8>)qyu|A=2FG(c2 zL02)*o!WnWP{G*T{=MqM`@jr+y9}e(tebm10hoRs`0+v{hyJ*AleCrolbmdr2Fk*( z4iDR*rX?V9DOUnrZV2;g_n|T%*zoj365*qAW64Y-Ex)VCgyuy=Wx~{6~?Ru-%~Y^LDNkdj#{{8=d(}y+74>GEvP$&T>DStbicr zF9+Q~M#FQM`@#2=XWD1%tvcA8G6zpB6(9$?iIoyJ^RxDmG@*3{pGq??!Owbupd!hoUJIyK;sYLD4;HJ%5YM=LvcRz_`4e9{viFAP7kYn#Befvnfm+>o%`s=Y`#{JBr)H>eFVQP&D+z+KpXZ9e|fgbUwU~=QpYf3TGbZ%L#>$SMIMA&BX?Z$9uR+BUf4<<;7Iu9k5CXH0GxY3kaw(^0CXgeG&TB%0;PzI^;ebr| z9_V0a#h4Wq&Fd|Pb*A&(`MZk_zFsN8A9v#C=TNn>62ir10ca=zL#5)B&;{j*;LVBg zS&C+&8S@{v&1gwV`ZG!Uq*2VwvUO%I~ zhdk+>@<`2uIhnY9sN845+)~t|mK3-DhuwBkiPrSN`Jw*MxGM1U_N3#8h^ZX?nGot{?u}G3}elE9cJgSSE^0%li02UY(ex2P(1Fw#4c$cH)&2fQGPi&RI2nzO(xPJz{J4 z*@NY6x&8O^CD=(dh6Gc8Ku~rXMciMun4SQnwHA~Aqacdc<6`=Q#qx8`?zaGwca@mD zJ2z%|Y__6fKv*H3p5p>bfO=ZCC9pnMW8dibx5Kr&E&+;i?C%+fRg7XV$l=@B9puiG zZ0VU$ll^rE2^O2^EE|0sneodGbX(}z!8u4Z`=2cPTiaQYaIwB&DZ^h!FbjKrhv&YW zi+CUb6@*h!0O`7cHY52V>B{Qo`uilG94SS>Ts@6VK8M##KJKdBlJUpE&RhRJdWIhI z#j_bOD{t&&D8nNmCPL8YLdHf5W!|jib z8-lI;4JXyz8nK)V7?b2OyPMD6+Al_K>}OpzE~2X^g(3$xnM5THkR=emo5CaJyEFb> z20g;bgt7|ddaS&m8S8M%wKX40#WQ`M@Q3+V<2%-!nzt*pQ7)l33Fqp#~aemCvvFlor04Qb)S{I?0#U)LK z`$CR0YBIh5jdZ@Z*i4x>KknE<>zw<#h0``opS1F+j1341(iYq6EY62Mz}`r?TF+Z- z^P>ARUVXZNKzR$Rt~>TtPFmn&mF#z6PBT?L+#%H+UwmmVY9{bV*ylrwWM}b%doUk`ztcat{Gpe6}vIH*Wq~M%4uy${8E2p!jhu!C?Sr_J#efE zEPEe(`}JbUO50GA@6z{dKQ>lHjhHEn=w$2!hMDx>m{MY{6=yRwc`)M@hw$bNo!v5N;kRy|akRGs|X>*;|G3 z;fjc3#RJSi)wC4`3>4w@>}TKLg*o6qhqN&CIe;&ZQQ6V1yAE&y zSQ!VM*fGb=_3$eBuTzU~0W02o2=f8=tcXF+E8R*AR>4W{D~G+6;AKrhoLLF`hhC&X zDlISAktzgyk^yJkgKLly%I#@VN_7Zt+|sgBSYHRQ%0 zOi{Xx;_5JOS%j@s3rqGDY!l8e|4YY&j9NLu+nF}#9Ekb=EmFbh2Zq)lmX!OaaQKa} znO}Kuv(1^(R4-Cr2>}9RWaY5$cf^-T=~ypNBaeGon0Pmc8V&R${||cIU8pXY)`{(q zque{>60}j(DqFV8DO(uZvL!f!-^+|NJE)VoLZj=Rl7cHOP)zdCivIL+hY5d~eQ^u& z7`YZshz7z!OU`g6$Rl-L8|K6oL+R7GuFUJZ#!H1Rf(-qf8(B~pdSrdfnb~)-xDtzc zPKB}VaL-?*yK>`&X9)yxt9BSd=1`E`Tba0$u`5@0K zWdcobOA;A~WCCFZNZ4R{YxwTE7ADA`Pu*oLT^t!TXt!N@^MG!3Bfj<(KPM5s z=r8;XGWTHBQHCO*^z|8+MJ<2^JvDS2G@*-mTkmzZm5oL^GijlZeF5{XmYymj=1}`l ztP2|uIQ*&csb?30S`5*5Fe1R5u+bPp%v}HN%yO{xReMvd72VO3UJqOf7xkyj6UpMofJZTEC!~(J{tdBJ+a9s-{&mD?s%rzYlyrTv5LrrTx3FRX)58EhnaovKx&1pzoz27jksif0`R6s&Q5Om0KFX+SowhA=1RcTJ&t2!Z0c*~7qZd252H*uWMIN-K{eQpxX-P?El zdaSjEf8~1VZ=&q+1GOr=4S09~?2-;U6VW#~pN}Wzd$3LiUx4DEvk4?IJcC|E$|TSd z$tqDGJ_Zo+LDF%&$4%ycM7QSF1$m$BObj?3De7FD&>$@z&(VAtBACPL67Q{$&!8q``t5TFUiFw;)KLUI-n<>*jOdRq7oT4CsZG54p~L~ zK68gfL{8{<=o^tQiYs{gHm6*DUJXRFYIUljYKwgkSzs8`qN`f<&8!E;^nt9({dXV{ zQ(+$+!*}YfsEA*|>EzxKOX+rO+WK3)g)u;dYM!TGiLgVNBNMy&o5UX$x1j6&6a}*u z=#_*0-|cU#SceDNsyq86Z~H@+pX^={i}9h5jbvdvz9PZ^gb3ido_fKv*taU^=rzpx z0eaLg-mbX3_!_D=SvehpO1NKws7;vrrimsUm-ztM%0rg`NBiv~pDzQgJ&U?8)LuS?*XinvaAizBW)K zh^CLljk=psWRuk8y_{KH0IQHA&9{HCTuKCA{z0NfoC|7PWu4lo92-9>!E&mXtn`_Y zTN?5cc2Dr(=HvlawMXJX;-}9=K~W|nL~^`s_D_z}qQ1A0(?2^T=wu32MvXvsVtn07 z6=96&IJcE5DSGL}v{q~cH{Dk{8Edcr6rGyW+M~JDkND*63b96%Hcg2^c)i5@c+wMq zk2ICVygX^R(PPk+wC3#Rb$qHdHrFT-Es)`Q(HB zx0?|4dBK`ci+&6J1(2Ok?d zPNHesdhqS=^BGZ}s~_r&`naL$0=+auF)tfL`c^&~&4*Bf@3`epBM~7p|Hiat&CKlJ zKOU`?03T8{wHT~~VM&{E75Ew-=kR8bvcsTywdn$}nTIRZg)tv44F}a>Kl5-f4PKQh z<}(|e|C7Hb$RoXS(~9`x!MKP;|NC8Vg@JXuiNJMD`X?+##I!fGqjyGTz>z)lT;3-- zCL_fzfhvCr`KUq>)N3PNaS-NX{sGT;D@)m=hX)>$QFOA?l?FvtFHkA1^I$Y1^a;ia zy~M7eL|fGqU%Q9vU|aR4yYXlTaZ9{{XIsVA63$?-Nst5Y1KT%;&7ca?Ec0Jc%{aC4 z;6mv96%qs~%>$F0#(z2}R^=_(U#$59#@5ZXvEuUA*{|oR+ouF5o#-`5Z2!`U!JB=; z6Gym7j87=YgLi`>{(5A4A=-R96xu+xEZi^YfOBD2lqseVx;XZPTogOnDJ8lld>On; zg(X2zKu2iOE@jH3h6q62_)g?3so`P^ttU1~qSU~q;a##dJ5YB@yWXd=wbN(E{M=23 zfP*&2Fy#-f`o)FFm+rAbYbWNSdG{+l2XG6Y5xWNXB9xlfZxXcb_A^qf`UtY|4)&}7)ZmtV+>>6vSB8V1^xhH}|%D{TCk|Gr|8md`@{l&iP~ z;Q-M!;&L(R+$?$c=?C`my9a%}1V_;G?dz115SC{W5Kiux@-pM@X_OnAjYu&(PnM&Y z^--=J7fX1aSg%B_ZiAedF4V66E>-!iN#+Lxo4#;vF&qFE_>{T|Fqc)y%NwnvR0sF)>~N{AmAJDyE|v$&`1eZfS~d|{>kV%-!bZ-s&LER%6qFbp>lEAi;<2zB_Y%zh`YrUabFsT z)j5#eG>yR?awZZAjsKV4O1cs%v&W!QBM8gesWXwcOjC?!SB1%|x2He)sr9U|SKwu{ zeg4}(2DY+AV$(!?&G?`BXpn8K&DDIqXBG$eS}IoPnDpNHZuN@|W%z4ls_dk+tedy( z?L7@6y`p7@o%H)&>n;Z2efKM}b_XZM9mB*Y*G0JR;!DEQhGIHFcMVYQK+#@SduW)4 zJ7%qY`s1U2$+IJZQ$zvi_@g1q3QE55k$@IHXLUL}8dXd-dZ+zfsnw9TPd6dX71z{J zSLaF2qu{Pek|yV%s}9UM$$j_~hJ5{4!{q<)ijm7tdJ;+<*qPEG?w zu1YMJ>GhXXg^`zZaNo$|d);ol)_@@kr9{wqeX)s@%BhyB@1BTRhI zyXG*pf$Ttc>^=?((R2_ZYA6&?L{d#WIgwOHkF1?jkEmgkrOUQ$oU(1(wr$(CZQFL8 zvTfV8t4}7=nM`IbI_dra-__c0zGSVn_Y=Td&{VZSazKkiYedTRfUOfz+gf??)nyCE zwChPJCBD39LQKhG=6#c|#~}VB;Dhf|W~V|i_fAPB`^Dl<80+UR>O7{0?t-k~3p;6u*wwqI8+rVGfodnmp{egp^DHR|kbfhfPLn$bzqwD9y9Y|Us0 zJJ50BK0riepUXlScT;pq+UbDbDG8Gy%wj8IiRP1(&VUu-&aCyNkw1FOIE57#M3zM| zDWMx96_F(_^0diD&72dfk}o9^ppTC0nsR|m;l*w}ch!z_f1Y{=bX_H_G#LOEPF`K* z-%JIJ55c3?bAc3%ZzT2tK7mc@n~u0^ggP|uj-`yB*R=D+0frEa?oJ-8NQn&0zEWSK zo8wIy`4SL4KK=4Rhg>Q_&GkL0ND3^I&~D;FVG{Fy-h<(Di9QQu(J$O|~!cguNv03fUjf_FyjWTxUQk=C37evDF@($bE zjP!;|6|0Z(huufNAlFQ#No?bRwA_N2GT+v>vRN+B@NfuKK48=R1?y`1Ys}b}ID|yO zg&*)tuVs_Gq;(jfMqO`Ffr}!SARg<(NTKAjk$ zJM$~O)ysw{_dIsuccte)GP~z;9|$OUliImf=U6bM^l$Ci6$9oPRp3Q>=b_!ikAqih zYdexWRA~qiq<6L%p~@N;m81Tyo(47Pj0bwo=~EJAcC~=2wjhIT$X!Ejsjk=5)_LBv zhrj2I+AoSKKw!WZ`zA{Sn#)q2fp6*=pia)vYfeO*viThAK1!h>YX;*C=`Y!M^A*LZ zh%Z{dx7{;kMk^rLyZzvHdl!_`5kXEMj=qeK585+QT%#W=TNLKkqvUUj;n|fXh>3ph zy-3E5FFymY#m0CLvC8?J8}ER>nJQ$kQ@jamFz=#H=&~0K<;>vx#7-whaGd(QYX*;n zzgpL89iq)=t<&S5R)LG>C`g9KAnJWTFisb-=cVOyrqbisyF-#ckYGu0Gbz{IGQOCE zb66&Qv$EC)O@OL$`0s6fXo|&j13iCt-v(F0rYSr*WRD(H#0HMIiHz;CtP5s$&qC2M zv)AQNb4fnC-}@1=9e#9uTXnv8=6>t0P(@Jz0TJF=uYEw3D_o|C>XU!QLwy&8yWKL>KFlBktpn&89pbb_8fOKes8CXJn+RUa}p% z%Pt_dJeT<~c3`T1gW>ZXDZ?IWnbah*h&z3Px1U{x}uQ%d0BxkE%%AM=@Yr_H||{ny&vqx=o2i0kQq zY4saaqv}^xfCu7esH3%fY8%+Pe}ClbbwIRNZl=0$bYBwtpr3rKc0U!uPOhx=x}|D5 z?23W2kC{dy%&ruC7O4{?S}8Y!Mxj=hd}d`1p68%Z2?6ihgwk>lo}sy#`-&}tUXR5u zmGSd+DgTD)BL1`{zkzNLa8+Y8+Ipq`T8DmNoAdob*n+ABUs;(h3!oPVdwj zrNvBci-g^z?(jxm+^o=AM(};L`&a306lV3~>5tD@KmTcOHxW=?+1pw`0qPl7SVE5r zosn?cb=`$L5DMW0>p}}F#XysD%!Mq*Iy#b}!3Ti=IkI6Vfo}xb1HrGgFbLsWdDQ@WA0v@<-Cy;AY0R*LLf?3p zMXB45BJ_0I^pC2OI_GTfoQ#xmqybzMC<}Spi_=qEnfOH+#)&9I5;IB{jAjr2nu)yu z*|5uFPJR`Ia<*_UyC0FK0}6+BFaX@`pX48nsx^!-<0&uf-7QSxWErk<^rOBE@+Tp_-@wk&NIt1q~b-ssY7J!#k6XPC7QXVWuo>>- zrETsfN9)P22XP5%OjCYCyNR-i0|}ImB|x=KBUO&AAed)lnWM?p{;QG_ew>bs+ARgq zIQe|~H5B=@bFsj@2VrTBP3J$NXwqH&r%$vHcs7+14&4_c6X<(IgyZ`X6n1@C>Ev)T z$OZFIM6@_dRu}hhNCx(by|wSVtZu%(zClC6)9<4+qT@kConv%pmEUl`8!80Wfg)ct zOaL6HoLV2Z>jE0*Vs-W^H$6<$n4F1VWn#$(Jj#oKWT{Ph%h>^8(zA?&lIuWj|Ie3l zRMUX3nyMFcL`*@^+i}w;94S&rK$r)N{J>CJg+@0lC~+0-e-7jt>BeB*Qftm@ldeUak=Vyu%3p zXYyia?xMuPr=DRNJ=q}10u106o>OUkOUEqCm|zF;a)2%r1!qVq;l#WQCUT#I^Z+IR z!RDJeS7Ai6*4Cw5!>+z6%e~w`u&w%y#u;)8LjOXeUq-H=7!eA^!SUv!U!02WR{b`q zBE>f0i5A>plLc)@kGWY#Ejaky%R<_89TMgygo@8o4RD|4_26Xono-Nm+DBk8exB{y?{P=Iwc~qvX*Gh7-z#z_yvhnib}i09!2-*p1mT|#AQx{6G$o162ZPe32D)~y z-nqCQf;u>QP!ngN@+oW~Rk|i7hCvt6;(y*-k1v6t}pJ+YRTvw(GJrw+> z4fAdY_^@G#PPz-?4=oxfNh6(3wzyMfP7{Xj?m(&&g?mJi^prxBwVs{W$5-UKhCv!Pq)dl(;4Y8P*T|nOi!*cRW(N zc8SZ6u4xVQ$=d48Qi2dZ9p{PSCTk4Dv#xZSvs2Z_Cj`>xR%099L5=K`3dl>=ne$@q z06b}k!f1A$Ku~18sw`HasYSd+FCs?949$XF(ftytxCtysko8I2!ew`&a_M@p%lTPxFIb5P z%nj2o%?}x}+(kyy?1%zdHKI_QeY;~8(T0@{wJ+N_?h4tFjR**Cu^?=Dn1<8kjqL;1 zSIetP3_dm``aiYi&z^grKpb@Hx)kOX+;oPuIVQIhHK{9AqObT$%Zj?j7K5+SvOqM`6CF(YX-A$ z+4ekdfVbI@vsM3HuhP9B28`^>BKu4ccZQHT1sYx@BaDWBs0X^~M&8^<{N3G!gAdlD zQ@n1b_d8_$p3mxqJ@^+@o#SZ=sj{wHM8J;E++bo^dM7C~B1{PE?Dui_vifB`Y+EHD z3YTv$3YZ!U+Svr0xPgX0;?{I3Qs)7*VI;P)77GR}>EdQ)T>O!Rf zNw3>;#7&dSn@)c|A$JD2WIWmbfKw+kB7Hby)#sw9=FcXiO&E8w93t3c9mpd@6Q$U>aChRrsk68 zkPFbOM#>_-C?4qe<9EPbsm9}=;HLh@(mDzkFY)xxZKM&5xUV8=cQW;)w3I)M0K+Xu zk@DJOlW-J38u()k3(c;nxu@?z*{ewD0`IHO49!obyv;s$7*$Nj?xS-;sM(}4d;fhM znC%;)aE?Z*(2>V9RCXE1Pl#HD*`_^q;}lZfPNzOol z!k_<%iA>2>H8{}Npee^^uv}QT7S4b1zAIJY>w8N&ls1yCpJWM|wmq>0bSeVWr$*!1 zS&L$sL68A+s)%gLXWF*lYmv8#tuK|_uTHG(WkR&R#pfzI!Hjz+n)f-6T-n(`NI6t9 z1RrCvd8enFIdfwWm&Mj9>Nb`(KJgwFRm6%8<^6}j2z8wKjwrbs0XL~%R7e-QImA6X zndfg1qX&;Sc%+fhYSXmGs{LWUu-AA`0-bFy_pe=Hs6;+u?0!S5hCMThQd}nO?%9f2 zTSk=!-GFx|L>6*Vs14^wR;)e%LA?(AN}7ZLQeFukW|k>- zBTA@m>tIUoEWm(^Y9;mGrb7yhY38ixUJJ>r#vT4^4J2o7K5tu98<;xX?`4bXuO*C! z;yFY_XRS*!WR}89T$(kOysTdL8K)zLl$tnc!(mbHdW)Aa@?}|yxQVo=Z_S+fzW1c9 zlAkyNixxuI9=ry;(0p`)(IMy;bpKj6QYV_=)SBz*jgeTk8rKi@N~UxZ&V1gEeY+Ds zYYJqPS()z(VC!H^HTtSrFyWMzme>$tk)D1(X{UG_-qqc)6j$!o1C5L9d;v|eYOScX zE4r@D&sWGqW>Xmx#3Ip^PEqaXyxd}~5Gi-$Ln-y)DNfc?Nb5MeOhdO%pzDYt_jzKz zo!4`iDlV@SG2HhdOli8l(uK%7qtzmL%#Fnuv!Y1%LG+8lswQ*+l@#Hoc;(F-M41N3 zQ90yJ7sZtA3uyf$>){WV_w$a7iy6r(=w);P-G`W~kN=JitK#UzF^^n3nIo!;uU}zjeJuYT!Rw50tTH9}MTMD%x&7 zR_yY6ah%4c+H1IYl=WIyQ&g zJn?V_2mHJ|nB8q`Hmq^>rL-)ei;xr`_|6j!@Y(}+emD<2gPk?`5aPfr!5{VC+ep7Gs)vah=Ps$xl3X9hSO4A?Z$-WW`dhXzhkUc_ z2w6l`jE$;rel_>1)#ejI$& zhGsp2H?Ikq2FPfb{t&dT7FQe&f44sib+NfsSGZ zJ`ijsg%&}pquBSKJQ=36D2UVFEgy&fLtTI7N4Y)AGEq-L8{Ysfs!k4 zs_A45ontR(X`T5VZ5q$j*p8Yb2Ljs0y>E)ok_LV{{-$r%znquvMA zP47tcNN5J(_|f?rOBJC?(!yx|7EK_jFIzhFtOSF(DB6%$szj7tGXCy+w=4!5CuDW2 z@HQuzkHaLbN?5*$&mz5?P4Yv1if00~eL`YbjCSauBJJT$GbDF3bSs~V8WSum&OOSDVo!pJO!3^X!+b^EIg#X>*gZguP=V+uoZk| zK40V&ie7Kh3cc-;QKg720em0DwbQr(m+p{3_l%8%(Vt57uh9t5Skz7B{g>$2xkT9N z;xt1?k|v0zY`nB|t-zzcWOKFgJdzx!EkTS@OZ0L0asoid=Oybpl!=;9`IxIZRXAJh z_vQYnLEdL+M=Ow|x#cu`#RAkcvy@s^GvN~dKG!vqK2iNd7r8Km7^fB5U1FBu%6vJk zpl5DH?&@o=sLX2$RG3TA6DNIwv1<_W&*V^o$2y1v>hzdq=xQZV0rx^NfZ;cro@qny z9}zg7P-KIs^CxLtYpK6gD~eH;o4#}vR zp+-5|8ED&f+Q<98apqOufLW7FBRcW2$xsV8my_241xXE|k@i(&sd_ezB1*5xlW%K8 zLSzDP&IkO!ht2Kh%fb9aIbzHvz6qA?S#9HfhMTah4Bv-{?J;D!*4o|c*)M1G)~%G` zHekgGZ&??!V5o_iExafQduI1;Hg=?&Lu>Z!_ivHd&^aqIpIP0&=Xh&TOM=VP7=u>F zB`+K(>^X6zjQjwQV#g$zTU3)w)#qrTF0u&~6w5Wv;zcexsX7S*JVs4h@hVQlx6k2I zuGXH2jY_kr!DWhoC0owGX+IVjD1B)PlP#9e;!B%ui;BYDX??K-+zZs&+Vc#T1EO1x zDT?~ZO&|0g)_mg9GTQ8GC>q9Dh_X$$pl%36wND>?j-3b;;?AZ?#Tb0yE8KR(h0p^c zn)nEPdaVU=Rh+6WKB{asyc(geU7Sru!;K{nn?vQU*Uz%vq;>gfV*3O+vUrmxmGvO9 z20Wdvnj_7b7vB>|B? zCyXBY2W8N6P}C^;c#WnMzWd_=0SWolr-zjP&_8V|m&2goijyTu0;je^=GjS9!4RCp zEAKPFph)(U-65988xodLMr^7%`1Rt!P2_b=pVb%WR$rPgNcTcKE#r#P><~C>{vA|^ zk$6no;us>#n{GtLWrD0AL~kG&DfVo&q`%=G2BnLue z&XfhQL6VZ0fBj1LzA$6*d$;UT#@8%t?~6;UyqdB78{nQ+-jmDfue)=WkvYoUAK9?u z3)rk^!YEox5CoL6E0LaBNj;afye>8Jemlwd(4)WZYicgDKVa_pOa%tuc3$m&vNy;X z?vUp5na2yuhJNPHOEV>tV7m!lVc#XUo##spE&V(23+EA?h?{Hh>)fSZrQCkR zap+$<{c^#fa#j9Fb+5Ke55Kg;^gHNNA8air-8AqiZlFU8Nq``1W#V=lD>{ikDh`tP zKt-pIsA@Pu<}uvqs~(2`T&pN`S!F~DJ7*Rl9-2mC%#Fp+{VyfcM{S^!>hXpm=gQN{ z()wv#a#nV9EalMcieG}#c*iJO966^GR9LQ@T^qnjIPAHt7AUR<@6q1g$!Z z1d!Go4HsBN7%&zAT!nAmh_HPl>`}}k`&Ou+K@0u@M4)1tfig$e=b5Mso~E$C*FW6p zu34NefEM!ns(EoP#crfepfi@X6uo-_TS7F5s}?)BUEzZA&}kTLXvt<|pDAVEK_YAm zSK)x}Y$kia^^@*jae>FS;zd_Qx~wH_R+z~S9W(lo;u_Yz{MNL&uj#&Y)1}HwA%Lvh*}rFQ`R@!*HKOKrgLIe& zRxmb9;ZMci##MhPgBJ78m-W3|4VY3;AL;W zHN{N%_CWd&_+jZr6qO3a97hZ@0eW_VZU;`>+#Mc4k*Sx^v#S6nnp$BkL}9n_xcHYw z?MlGAc_WJSK31PBeX+yW$=oxVZE&H{yau}c4S8%i(isPuBQ0CVM##qn7o`vnWWAr3 z#V_u&p*__6x7a7vveUZI$6VgezTw_OGBN1Y9Ms>VIyD|=0jB)dJ7rFf0QN72cLXi` zt6%tu^96b}YKjH}3;rx+P3(teD8b{;WiLaCFyJaisedX{pW;%#K;vZHrOaClGMh0 zym82lcw*HeRoj?u^kuN>B~`%b49W6vRmz$&NR7R5!{}m8e11`}Z!URjB5*91J>Ll8 z!xMea&9&#pvRt=I!vaz+`~Ielz3Z_N>mY)N{;K}(`-u_aiI1??$3v(66pV51r8k;+ zQ7gM-8q(>5Fo$!9KVr}V>B8L-expYZnqH7?Z`ERX`DuLLUi$8Ku!^Bc!j?Bs=L%P$T21YJQd@{QVr zD={L3Sta*#)C_C_^>Tva#~O-$=Zm?%=M&A=qV025%cW!BrizR@5+hU8*b;l3$D|mR z$=IF)^?|CXg}epHe{QksGuKVKiKH<0UM&MdVi_WgY=8+yy4^l%X0Zn0=&&%QyR5iv zft7Y9Q)i}Xy*xIsos3RRf0ENpZ2KA2=lv1Fwja51%2rgI_C{)$HJw+;z(K)~#n8pW zm1L~cYu~faGRHCZO8|@5dino8mi|zNj zFFSc4_LKAR0Fqp9Qm*+UJt5{=%<&BAgd0ok@Hnn&Wb6F^rB5yi}2wfG8n6{2Gl1y9#X}k z?q$Qdm7O#3PT6B8K)u$yt??qzL?FmTfR;I?43&C_^7(tQ&uTMO+|F64kpC{9Ju^Q4 zk%S4q7--r2&ben{Ee-VXe*-QA$n|EO{pf>w?PtdxYZq;n=Kr_)?)g!YP`{=b5YsSy zht2tfL5F&v5zn6TUtYPn@LOjlYuAF}vZJ`nR*=q&@=p(roJ>9CXuAt-6YHjcWs zxe)$fSimndE$R%DZ3G>KQI7DI$MKQ_>h65jA?aZh5YfRzu39ykzf&$y;TJQV!J!Qc0vtw0XJl79x z`G`1wPqm+t=F&vO~x75%=2AG3;RhKK%F+4AG3q+!j7lel9ii zk0=Tkzx|f^y#P$gxwd!v0ATE2P;d7f2j0Qi_9m!HmTmnj z@vzlyNVM*tD4%3*|NiW^{BvoW!6LSBZqdS3WSva3#pJR^mJ&%Iu#RO zn2SUORXRpj|LqX`l#1^m|B03RTqDucGBL!T#{h=Oe)Bw}C1t^p>U8yy#11zxc z4i$0hX9KlTZZ9l{*t7TU9=lr@`TM9+zbwJ4^w}mCnh{~zJfVkTBxxV=P)qvVctcyj zT@I6%2n)p4R)9@2fj)BPNl2|y(9BhQg28Z!!TU|Gf}Z00?S^sfe&@VB2vUUMo;zpX zb=g%*F!=S7of40?Th&^GWoaIm208);WP|fAjqwX=Qq$d3(n#-R13{D1;R=Mg=a~UhlM-hru!PdZ<#oGf&IeK)GufBc3 zbKxbHe9kx-VM1tQQH`yt_tXCm0m3k797Dy!3=~sXr?}B4V(hxHu{E z7%+B02v+>HjuhKptXf$51b-A;`XRd|<#~G+ldajt)U!5G8X04>G8%6vvIO>q`~14< zDzcLB2YJ-cYQ$%;0;{U)KAJNZ5*j@Hq0cjBau1h zN(G>=C$9^qCWJCCs{22cxR(%^_UWu=Ktxx6SS4d3p(yAPd$Pi)fcKfR@HfP@!NQA+ z5XAD4J``b z;~wWTG~hlaT;G*?A|9XbHm1EK8txu#@nZJtRz~f(g!E16eSG}HlcC@yX?j;;x)*{l z=-^d3LheWw4L@Pla8CufeFwO&5b$Naj=B-rMrcrd>72fg^Gmyo*XF!KB_Zcm@R=%R~h-DJr-Y>(Kbf7nh6jc=!+|_<^2)fx2LHlQOy-ne!AC`=#PZ~dDa8+whHGt;JrOsB zc2qkr`Kn`G)wslj#so<_JU&@rXh6B%o*sIGVQ99{9-m}JrRC$7bdpIG5}l>z+70 z?4t2-gmz^ZT$*o1p=B3fUvP;w`6a5%)fBf#!uRjGI}S3hYhTBx^AV>9R4ea>$p5N? zVKmE?86YoLN?{)Rp@i3&VUSfxT)rjdsm;j!dn{${ARsg%SwBtb(|vj(7Y*r%PRJ=_ zUico_Vz~=4RUx%V<&@Yzs8tMff3w8N6fr9@>yU7`LA7`-FeS^-KxZgVQ^#^18u}XHYB|a6l-L*lc|cu3efv~m$Uky zlUb8w(KEN~!nWiP3JN`J)hiO>j@6F|)(8uJRI(N^Tb_m}!&(Ja?x14^(A37KohRYn zyl_yAiF69ll>H;EFCk~x#{-rrl(CF%o!YB=sO^w#tVf`X8my+ps8sI2pi7%VSkS_r zFh;nr=j3y{sI7NiF&d_(2i$8%zAtO%6v81XuaWH0PRRk=`rm1%Gp4j-4+(IGpPpA5 z^}Gg*)O!U-!hJzWY-LA=;Hx>`2wW;IW%7Ao&h(3n55f8P+Si<@3ITt3Y#Uu`gqAgV zeAab^q2jSM(X)+WN_ho>BoCDIF-?$18O0Df-*p4g_Mww)zR4LCqE;H#X)2maV?7F{ zn3t8-?13i72Dux=#wz@R*Si)Uke>!XnrcDC%!Prw+|Skz|j7%rUw4yVJw6{#ZuDzqAks)k1Kmz0N6BoZP7gsQ{ogQ4_as zvz?$WrX)nEzj5X`Vi0r04Ks=Gc#AG9iy~N-{lmi|AXJG^c~2G8N#vBurr4YjvF*|9 zO7liG^BTzm#})j~fl9%uNGjI6ys)+&uVWz71kU3lF2{ye-bdG6tF|0acxp{Er-UUY<~ zl?cC)Y({hX^~O)7{-&|Jh483rvJ8Q7WPR^=#K^R8N|pEJOy_b0pjxlBv(Zaxbg!R8 z2JKk|5xu%1P|Z~xle3%DX(9!@^m99l&W%L*R1LJpnk;4`1f4i>-*SS;g%y*kGMK4* z3Y1d#(t!=+|L-RDu58P#w@2`et9zPN+H2@zX}gkU-bv@g+Jsqc$(9gwlbP5QlG7qD zktNoxp%KQ+pqVPAz5E{WE%*dU!_B#|=6Ihm|5^N#CXI#cIM&u(MNwlc^a1g5Vn8S$ znqKsMD(#)<#u-`sp$li&2qKivj9En+RfOhdrKGtvMN9Hl4Dd84d8Ss`u`f%(&7lcf9CB800 zcn~aFj6n7Qu|VHfyBPYWZ%e-PXBD@cXk_Z~9t2?!GHXSlTTJ})R%vnKABw9>wb`2D z9DNMAOsyddXN6F`#?^zg34+P?Do$!hmrs6HA1r{~(B|Y9V0P-7jt)ag!pcNP#|IZw zCEN!t+^6VY>u2^?j*~VxY@ncM=vA7)5{+|nZBBzQNmdFIGiS(_e18XM;=zV}41h9sv@kZZ$0;1DbhfIMvR z?R-6F^pD*E>yjPLY8IeJ{`zqku6?^4PtztmslL?Tdnwica6eHHcEj`)&%i^ll{naf zH8I@063Bui_0*;4UVFS^uCieI>tBsRH<2iUDhmxkvupaqC4f!6B5*_)Ruy4b!|YuF zchYIbJ!AegW#{|Zro;juX|0-rAx0<&TtJ-DGpTXCd<7m92eByY|NPzvhzlowA;mV^ z*~37Qt+`TX8SF6@xxE(3=Aea`Ill}_mE2&Oh6hLJa;UO@llu}ZDMY>V-U4K%a-9!# zZ)-plX5%3*zSsU(T0lb9`Z|%woe!yHB=Z~r>i%^@lr6W0iD#Z$e3e%gT&eA#0DQs> zgBjN8sYURaij-oASu~-kW4_Rw`N$aUM1&`mi4yvDrlcH}00rL;t!+cAAB%tbEP!t% zOyivf#Y=JInPAS2?)0fqs#*+1%7N5LV-cABuj7rCEPM(jsQfmSzzQQwK9NEq!AMBMd? zUN~Ay%Ld>A&8iWASG&;)o&m!o!+G)$di&GB*D~|f-Q&8;m19rgcNX9AkJ>dPp^SG`!HG@=lo@ zVp8Rze2+;WKSO@&)G)JY>i>(N=Eu?mY^m>WNc9yZS{-x}_ zhTC1*g1ck_mF;fS%hn^egeK^B8doK3i(w;8;a;x}izZRU>*qlklL+YGGq(Qq@z_~x zDF^1G&~Tw280y#*XXm$L_Aoe4saJbVmN8t_Di-WJMU66@B-{x3F2aidlJqO zgzcXejvnmrfAmlJ|LR{6yd{6ix7?7wA(>ysZ6&AF-ZMgNzOB$dIPwlDZS=(ho=?z( zN-^;F69$~hG6C`b*5B;^(f>SkDUIoMnZ|-v?1M^E0_i{XxBB1uKW8EiQFg#&AZ4nV z&Cc9rY$dcIj;vPNH#|NJ=A*1F5CFqg;on~-tfUbXnj1E8( z3HFzwe=lD1M;;$yjUzR>#;azWvt0-Hi?S#~fdKJ< z`&TZ}?i{v3D>p|xw5$U%VPxC$P1t&RTTi%#nM!&m4gAa`gYxS`Wqz3E$08zu9tf9VEwepu1-Ro0PIvcbph$QG+sUC|J# z?ajR|3%Oq@Z;CWokMI>;68~O(m1SPu+WAvhR4F*={x0dos2{1HfRy!()@^Gxfjt5^ z=~pR8!O&{TM4jp@luXUr`gi?#h3*$qGmz~1lpVL`LL)5p>Sks4r3SBQQ>R;~9HE6U zjDn-y`joNffwj=6r>uO7$qMm{ShM*7eOf^Id=)s3gR8i59J|u1trV_-@R{AQkN;5y zGI1in*Akv7h&DyJQ&}*ik*@*1-U?MSOy&g!WOJjQG1&_2q07Z43~RG^w_-`@%}fp1 zuwD8nxH(s}8(tmx9_!IG#emi=`L$&(=_~;ih5wXR?!D0?r28~PC)^}(nzutC;+W~V zp?Y_aIjT(FNGZW}$`*|z6ldC0BQBI@io#Yt)wfePRzN%gSL(rf7gaiVwntT;e!1O@ zTU|uKWGT}#gU{Q#c-PcrM9TQoPoh$Tf&S}YwL=>dA_~4Y^ssnv4YssOM8&#*x1u2w zxEm#3RHl9tt%`Jx>qvSW69*CLN1ET%hr)@>I}kb=nF6PEtWXFI z48k>la}3nc6&Cc&j({ktrAvA6vk4gYip&i|G6`i7z%Ax;W~qa}Y_&QD$uL5xRGh^h z)mhbLnOHG^o}HEC{pJBHCv|V+a5`e@00fnM|nh%91q2`soTXJes(dayo1@^ffzP1q7 z^V+h_sv)s=^62Vb#5tF~5eqV$Zlj7AX3Y)D(D3g+J-L_|F~btzWEOc3tP1%dqTP?fRdXM?tB|aKl+wT}x8f zyfAH{OHY^e8lGf~KS7X!Yg2*5&05iZE1BMB{WV1%n1r zj*rPP%&@VBNDuN0Lc61<7cn1cHty4FTP(P|hIj!z=R$pa*`K04&HkHT=fsr!4~>ETLs`^k|N ztgRcq zaH3*c$Zn<{bS)(hJcA`8r|nIwB>j;uP{nA>m^qWIYq9e$=Y9_?3t$8!70;8saRgEQA-fB6o3oHgy~?j8#u z4cpX$xf!S3mN8z94nGZQJsn7zVx>%kD|Y#(I)nr-Cak&Ty$xtpZwU=T1DXD`N&8c~ z?HI>#QX?X=5#vXqg#UxvfXnxnDBGFI1DVx1q8hqnay07i0X}t-xW+?$i}KJayR3W+ zBz&xU;Z=apy^R|0Br&3@AW4jkao(h)Z#Qa~(nCl76xU@VZ8qp^{v$Qb06lkV9Jvv5 zrY)lpTT}>uL-Rd2#TTGh4txg_R(M^aG7xO}Sf&>_eeOzjes=E+ITI#Ar%4S}9!odXIL} z6hT#DQX=y9DmPv1aLN{PGensxuwB!nW5h4F#zGakNmol$&HT{ohT>l)4=dQbD_G&)?=oQr zW<};v&jdecP+iZ}h;aJ++LyzcW9eY(;+t$~`$fIpJ>lc%Hyfo5`6JPO0PO)hlNRV} z?EhGCAY648;<@TBH4cLMet~q2Wy-k~177F%966Iowtl(0g0ASRPZ5D%Wv|ugsML5% zQ}d7Coe4lz6ri`S=?H^50!P86l9<2ck`P(pcZ?J*9C>y+4V-IX>*;1Fd11&&?7hK) zu3y&)5xCrr6B|FpHJ!fgGhCN6tJGd~7bF4Iyx+-A&+&OL6THjEeJJzHEPsG`cULc2 zG;`itIs5G48epy)3WH<5BUav|`JQb@y;H@PFt_gog(xr{{xL=C@<`!vUj$wG}R?w#Hg{uz=7ZGGhRjjh}d;yvz)kw?J~>YiLK z$9lSH`=NE?Jb}Q9_h+1GT}`2lpw9CQuaw77FkaJV*|@D4F|~7(>t*N3G=RJSzlegH|{fkO_H zml4zy1GxJ)+^0)VF@`LVdtwvqOhN^EqZUK)PiB<`LW`_;3XP@KKnpozq7rYB&e|u3 zK-u8S-NlTbFiN%tO*#zC3E$V%-jLI&9en3EJ_X-y8u+Ma@L8e zm=zbWsIkGp7y!2cY%hcT0{}v@|2*&MDa}nUzoj}BD1Ko&n%SmsjslY-)g!3-mp69 zhbRQS3PtyI-tmX`VVDWj*5kKg=6vMN4#2943Iqd_WW3&QF1%)VrDPRJ)}#v;?uc?& z1LjD~5{8PdoYyw@zR9wjNJx%FflE2Haq+N^7(1ak@mg zrFy;h>44$k53dE2A?UG3sf>g>YHYo?Oxb?`SwN=08w4p4Y1ctyE|@rwiE1F3)>k%B zzZ^rNevP1c$#EkVjEr%qdh9nJWjLT(vamH~KVN!R8b8_95q%%U*#68f17@z?EL|OgBka!JQU{EePseS17+vlwv^L!lv ztlvRv>1&hdSj}L~RjZ);z(u_Yi0KG_$#CXxD!&Fyn0ix+W?&yQV}La1p$}|0j20sE z+f~u^R9x#fohadl!if+RU#J}=M6*EEuOVyXp78I(P zywj0IVFcs87-esWAFq3)7>SEFSMOGAp4&73$XMx4@mV@X_yMXJSL7Fg9;=BS@mHai zu92FCs8Vb=I^eX0Qtfy1G)9X67|h6-{1)ELujX%)!j-7g>v4zECmH2@Q6l5T`OGpu5cO<{dg7WkS8cbXpME*9fzONJhOa~<>%{Q7;? zEuqF*XRePp>NfrG_rDL{Z2CO-b)>m}nA|n1tq<3{SIb9C`{i3y^5~l3C!1jf2QN=Y zbJK2)PXN|&IrtOkL1xd)7Fo(m;%LPpDbHe@ zrT*eg)1eATAlul?e339kPm{pk8=0Jd&fj(?bKb}u-)=CDdLYd_X44n~qF{T@cUqRc z#9a`*%V;`dir^t19pnd?xJ`i;9%=!YqtfmBG|kTs1|A`6@z4-~P}Bug9vBeS`sDlMt(QUdZ1Y-d+0taxhSMH6=_B&$W>8y8d>GIZEv7tWwq z&4~>0+~slDHSuw3n>DZ2ldM+zz z8w~O&wMSS>4m+h=G<008JoEat#sO*?2f!fnhp9lMdxk+P<`V10Z_9@L(V->HWQ(zD zD=-d9@`j!3;QO6Koe3XPmy2FR`V`rNN{3A&G!aJ5Qau$(;634lZl3xxd^~-?11G1D zctuXxR$ex0nxDSploKHhU^It<^P{1WF$2;J-2QYk1}b-;k6tN(>J{Nyp_B+$8Sl8x>*3WelkT&AW+jL0@#PP*_Q0dixvqzUP6|$3V)%^xI5SZ z!Zt6Y;yNM!<>X}hviIp%1iyT3z4;Uq`9I4iens$7sO?t$^xiR=~0lepGWltM-_8`vb=bMDaPdwn4&`PuAt;@q>IWceA~t zwJ|1?=*qY69Pv}rx<{}V4hl!#`J*F$0t~8!nNIfTM8rS%DO4AKJkqvC1tm#>r-svu zDsl}wXR$sX2>=DhEm`*AZOUQbOd8pIZPRQl8zVL1qSJaNQUlo!5~$}ziINf|JhsZV zX{ZN`P$B}8QWcrTt&zv*_H~imI*?Vvu3nD-+5@QFr7LLRTSwKo%Nw%Vo9X&@R2qv99D;-}|a$Y2$%7K!KsAD5{dparXOL zn>s*z?;WkJmWj_qeTSB^JOrA2+!lN!B{kBanGjjc5?pkzGtPbUQP@o#djyPzbu zkHPITBvd+=_~uj*%V5iZl_$Fi`X}&9KasZVos_9QgX(k@+14Qvqw5>QY3f@M50Y=}<5-bE=C*330%emQbTVLjg;N;4mw0O40Y^mqS>YI@znz+Kz4J>QmXfi>fh(Sz4-{%LIRI@1KCX8CmLI+7c!v8P*t z!O4y(cO*+`a09#$;xYojr(@>qySK5>Y?;!3nhHD)9hEEO2Mz=DUtF_E*PDclN*Snc z;9+u?DnxKZAr0~-FN-pMJc#^_cmLAz&TAUD{JwmdJ(F{nL`}5z%EAdTT`~15ZWk1= zKLOnpexu*OjTN2|-L(+DB*B@H_q!IGQ8eSV0p?ZVSlS~{D;TYy-q`{ZyDl7IFV zRZo*2{ny+dFw5j;m0kY4ueN@dU?%kyq{o~`9NBg|VMYK7!fVU()|V|P{C~Qcomc$I z$|MZs*T{udXd8(SJ=7u2e9ugsu1UpC|BSnN(y0(=)11h&Jt+{8!pk-A1Zz)zYi$UV zSLoljiu|?C-~|*6R`SO$J6Dw_DZNt*8j3u+EB$-*mZHQa-GVMu&*xVYi+vSf{$yjb z-0Ka0@1M$@vAsxo8T-jamPMk8;Zfej?Kr@OA>)e8pSQ&%Tb_Yj*cwk)oAh2N5xsfxL#{*44muHAJnKU4|1KM_@oIFgA?m)8 zfqcYxZX9P@N8p-bXAcT6Yb@d`b8{eV3x_G>u{`HVLUNAEbcpmfrmXqG`lWtk)$w;=oXD$N><`f}Z{8Qp#%Z$sq!p<#?$!-kXRePp>NfrG_rDL{ zZ2CO-b)>m}yp2yT9|nWl|E6VXzdU%BHL86eQK072`SA!2dAX~kn%)Q9lyfhEhXZ;{j6>;`rH7`$VWoADIAC>q%D2mBHm97>jgrXY6I6gjD}BRt zoWr?P#a}Pfuarh*9Kmjr#!>Br+aplvQ38WMkjP}e7ck9!?l~trvk`t6aHIDE3*q1J zxa?9}Cs7ROO8_5gf~eT*P8qL&k^b=>WnjoTXIkrq!AS zj8QZIftHLE>+=Mrc+GfWy-8& z*XewW>NSWS{F|?+Rg;U?dNx?@RiO2)1f-^+O^KzOC#=3HMey2(s0X1mzoW&!@>qqK zueuUb3D;MCxB7gh!BL=?#>r2WE23{p(S)RRy@w-qrGR7l$pj6Q8&raGGZ`=+YBv@P zZWZ=<*c1cRE%A$(5Gb?p?B^a`W5uiip`Wn?)8j}ym`{*U;V<C0--CJl-wBLv3Ui&!*N4Qq5;H za(_|WRK{VF!3TC|^Y{)TLRrTD;VZ&u?iNl7MF}+C?%8kL2sILuKFmm+CxOVPCk0y$ zNKz}*-EfO^@M2y+j7jW%Vq9WdZs|_N)`&tN-o?U*D@F9~x#4y5%>rwvdjHZftHzSB zbnqRv9qlb!$SD)8IzP(R4R8|@{|Iq<9jd)JWgE+8lKPWhL|x57XS_<^)r01g$thJ5 zJ>&VOGfKYEX+_1nQw@pMQujFm4mNF*WKXybvEu;;%)Q7%_N#`b4aUalKXlsm{RIAIL#u-)PUR5{G}?IlaLT zRe8ecN#nfrFY@0htr;FNzEr+Wu`5y=JeB2uU?{e$O7OMhGAy`5!Yc;0-=4y4UogmT z@4?3-Nd;52YGO2+71dRcft+#fAmq5oY+AQ z|C*g1ci6`L-=uK*%V-N~<9sI|(j~4eMrEa~KX)oQ*F;6fS}VRy*v)A~-^b;(c>|